ZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzQ4MWVlZQotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlCkBAIC0wLDAgKzEsNTEgQEAKK21rZmlsZV9wYXRoIDo9ICQoYWJzcGF0aCAkKGxhc3R3b3JkICQoTUFLRUZJTEVfTElTVCkpKQorTUVESUFfTU9EVUxFX1BBVEggOj0gJChkaXIgJChta2ZpbGVfcGF0aCkpCitWRVJTSU9OX0NPTlRST0xfQ0ZMQUdTIDo9ICQoc2hlbGwgJHtNRURJQV9NT0RVTEVfUEFUSH0vdmVyc2lvbl9jb250cm9sLnNoKQorCitDT05GSUdTIDo9IENPTkZJR19BTUxPR0lDX01FRElBX1ZERUNfTVBFRzEyPW0gXAorCUNPTkZJR19BTUxPR0lDX01FRElBX1ZERUNfTVBFRzJfTVVMVEk9bSBcCisJQ09ORklHX0FNTE9HSUNfTUVESUFfVkRFQ19NUEVHND1tIFwKKwlDT05GSUdfQU1MT0dJQ19NRURJQV9WREVDX01QRUc0X01VTFRJPW0gXAorCUNPTkZJR19BTUxPR0lDX01FRElBX1ZERUNfVkMxPW0gXAorCUNPTkZJR19BTUxPR0lDX01FRElBX1ZERUNfSDI2ND1tIFwKKwlDT05GSUdfQU1MT0dJQ19NRURJQV9WREVDX0gyNjRfTVVMVEk9bSBcCisJQ09ORklHX0FNTE9HSUNfTUVESUFfVkRFQ19IMjY0X01WQz1tIFwKKwlDT05GSUdfQU1MT0dJQ19NRURJQV9WREVDX0gyNjU9bSBcCisJQ09ORklHX0FNTE9HSUNfTUVESUFfVkRFQ19WUDk9bSBcCisJQ09ORklHX0FNTE9HSUNfTUVESUFfVkRFQ19NSlBFRz1tIFwKKwlDT05GSUdfQU1MT0dJQ19NRURJQV9WREVDX01KUEVHX01VTFRJPW0gXAorCUNPTkZJR19BTUxPR0lDX01FRElBX1ZERUNfUkVBTD1tIFwKKwlDT05GSUdfQU1MT0dJQ19NRURJQV9WREVDX0FWUz1tIFwKKwlDT05GSUdfQU1MT0dJQ19NRURJQV9WREVDX0FWU19NVUxUST1tIFwKKwlDT05GSUdfQU1MT0dJQ19NRURJQV9WREVDX0FWUzI9bSBcCisJQ09ORklHX0FNTE9HSUNfTUVESUFfVkVOQ19IMjY0PW0gXAorCUNPTkZJR19BTUxPR0lDX01FRElBX1ZFTkNfSDI2NT1tIFwKKwlDT05GSUdfQU1MT0dJQ19NRURJQV9WREVDX0FWMT1tIFwKKwlDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTj15IFwKKwlDT05GSUdfQU1MT0dJQ19NRURJQV9HRTJEPXkgXAorCUNPTkZJR19BTUxPR0lDX01FRElBX1ZFTkNfTVVMVEk9bSBcCisJQ09ORklHX0FNTE9HSUNfTUVESUFfVkVOQ19KUEVHPW0KKworRVhUUkFfSU5DTFVERSA6PSAtSSQoS0VSTkVMX1NSQykvJChNKS9kcml2ZXJzL2luY2x1ZGUKKworQ09ORklHU19CVUlMRCA6PSAtV25vLXBhcmVudGhlc2VzLWVxdWFsaXR5IC1Xbm8tcG9pbnRlci1ib29sLWNvbnZlcnNpb24gXAorCQkJCS1Xbm8tdW51c2VkLWNvbnN0LXZhcmlhYmxlIC1Xbm8tdHlwZWRlZi1yZWRlZmluaXRpb24gXAorCQkJCS1Xbm8tbG9naWNhbC1ub3QtcGFyZW50aGVzZXMgLVduby1zb21ldGltZXMtdW5pbml0aWFsaXplZCBcCisJCQkJLVduby1mcmFtZS1sYXJnZXItdGhhbj0KKworS0JVSUxEX0NGTEFHU19NT0RVTEUgKz0gJChHS0lfRVhUX01PRFVMRV9QUkVERUZJTkUpCisKK21vZHVsZXM6CisJJChNQUtFKSAtQyAgJChLRVJORUxfU1JDKSBNPSQoTSkvZHJpdmVycyBtb2R1bGVzICJFWFRSQV9DRkxBR1MrPS1JJChJTkNMVURFKSAtV25vLWVycm9yICQoQ09ORklHU19CVUlMRCkgJChFWFRSQV9JTkNMVURFKSAkKEtCVUlMRF9DRkxBR1NfTU9EVUxFKSAke1ZFUlNJT05fQ09OVFJPTF9DRkxBR1N9IiAkKENPTkZJR1MpCisKK2FsbDogbW9kdWxlcworCittb2R1bGVzX2luc3RhbGw6CisJJChNQUtFKSBJTlNUQUxMX01PRF9TVFJJUD0xIE09JChNKS9kcml2ZXJzIC1DICQoS0VSTkVMX1NSQykgbW9kdWxlc19pbnN0YWxsCisJbWtkaXIgLXAgJHtPVVRfRElSfS8uLi92ZW5kb3JfbGliL21vZHVsZXMKKwljZCAke09VVF9ESVJ9LyQoTSkvOyBmaW5kIC1uYW1lICIqLmtvIiAtZXhlYyBjcCB7fSAke09VVF9ESVJ9Ly4uL3ZlbmRvcl9saWIvbW9kdWxlcy8gXDsKKwlta2RpciAtcCAke09VVF9ESVJ9Ly4uL3ZlbmRvcl9saWIvZmlybXdhcmUvdmlkZW8KKwljcCAkKEtFUk5FTF9TUkMpLyQoTSkvZmlybXdhcmUvKiAke09VVF9ESVJ9Ly4uL3ZlbmRvcl9saWIvZmlybXdhcmUvdmlkZW8vCisKK2NsZWFuOgorCSQoTUFLRSkgLUMgJChLRVJORUxfU1JDKSBNPSQoTSkgY2xlYW4KZGlmZiAtLWdpdCBhL01lZGlhLm1rIGIvTWVkaWEubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThkYjYzYgotLS0gL2Rldi9udWxsCisrKyBiL01lZGlhLm1rCkBAIC0wLDAgKzEsMTEwIEBACitpZmVxICgkKEtFUk5FTF9BMzJfU1VQUE9SVCksIHRydWUpCitLRVJORUxfQVJDSCA6PSBhcm0KK2Vsc2UKK0tFUk5FTF9BUkNIIDo9IGFybTY0CitlbmRpZgorCitDT05GSUdTIDo9IENPTkZJR19BTUxPR0lDX01FRElBX1ZERUNfTVBFRzEyPW0gXAorCUNPTkZJR19BTUxPR0lDX01FRElBX1ZERUNfTVBFRzJfTVVMVEk9bSBcCisJQ09ORklHX0FNTE9HSUNfTUVESUFfVkRFQ19NUEVHND1tIFwKKwlDT05GSUdfQU1MT0dJQ19NRURJQV9WREVDX01QRUc0X01VTFRJPW0gXAorCUNPTkZJR19BTUxPR0lDX01FRElBX1ZERUNfVkMxPW0gXAorCUNPTkZJR19BTUxPR0lDX01FRElBX1ZERUNfSDI2ND1tIFwKKwlDT05GSUdfQU1MT0dJQ19NRURJQV9WREVDX0gyNjRfTVVMVEk9bSBcCisJQ09ORklHX0FNTE9HSUNfTUVESUFfVkRFQ19IMjY0X01WQz1tIFwKKwlDT05GSUdfQU1MT0dJQ19NRURJQV9WREVDX0gyNjU9bSBcCisJQ09ORklHX0FNTE9HSUNfTUVESUFfVkRFQ19WUDk9bSBcCisJQ09ORklHX0FNTE9HSUNfTUVESUFfVkRFQ19NSlBFRz1tIFwKKwlDT05GSUdfQU1MT0dJQ19NRURJQV9WREVDX01KUEVHX01VTFRJPW0gXAorCUNPTkZJR19BTUxPR0lDX01FRElBX1ZERUNfUkVBTD1tIFwKKwlDT05GSUdfQU1MT0dJQ19NRURJQV9WREVDX0FWUz1tIFwKKwlDT05GSUdfQU1MT0dJQ19NRURJQV9WREVDX0FWUzI9bSBcCisJQ09ORklHX0FNTE9HSUNfTUVESUFfVkVOQ19IMjY0PW0gXAorCUNPTkZJR19BTUxPR0lDX01FRElBX1ZFTkNfSDI2NT1tIFwKKwlDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTj15IFwKKwlDT05GSUdfQU1MT0dJQ19NRURJQV9HRTJEPXkgXAorCUNPTkZJR19BTUxPR0lDX01FRElBX1ZFTkNfTVVMVEk9bSBcCisJQ09ORklHX0FNTE9HSUNfTUVESUFfVkVOQ19KUEVHPW0KKworZGVmaW5lIGNvcHktbWVkaWEtbW9kdWxlcworJChmb3JlYWNoIG0sICQoc2hlbGwgZmluZCAkKHN0cmlwICQoMSkpIC1uYW1lICIqLmtvIiksXAorCSQoc2hlbGwgY3AgJChtKSAkKHN0cmlwICQoMikpIC1yZmEpKQorZW5kZWYKKworaWZuZXEgKCwkKFRPUCkpCitLRElSIDo9ICQoc2hlbGwgcHdkKS8kKFBST0RVQ1RfT1VUKS9vYmovS0VSTkVMX09CSi8KKworTUVESUFfRFJJVkVSUyA6PSAkKFRPUCkvaGFyZHdhcmUvYW1sb2dpYy9tZWRpYV9tb2R1bGVzL2RyaXZlcnMKK2lmZXEgKCwkKHdpbGRjYXJkICQoTUVESUFfRFJJVkVSUykpKQorJChlcnJvciBObyBmaW5kIHRoZSBkaXIgb2YgZHJpdmVycy4pCitlbmRpZgorCitJTkNMVURFIDo9ICQoTUVESUFfRFJJVkVSUykvaW5jbHVkZQoraWZlcSAoLCQod2lsZGNhcmQgJChJTkNMVURFKSkpCiskKGVycm9yIE5vIGZpbmQgdGhlIGRpciBvZiBpbmNsdWRlLikKK2VuZGlmCisKK01FRElBX01PRFVMRVMgOj0gJChzaGVsbCBwd2QpLyQoUFJPRFVDVF9PVVQpL29iai9tZWRpYV9tb2R1bGVzCitpZmVxICgsJCh3aWxkY2FyZCAkKE1FRElBX01PRFVMRVMpKSkKKyQoc2hlbGwgbWtkaXIgJChNRURJQV9NT0RVTEVTKSAtcCkKK2VuZGlmCisKK01PRFNfT1VUIDo9ICQoc2hlbGwgcHdkKS8kKFBST0RVQ1RfT1VUKS9vYmovbGliX3ZlbmRvcgoraWZlcSAoLCQod2lsZGNhcmQgJChNT0RTX09VVCkpKQorJChzaGVsbCBta2RpciAkKE1PRFNfT1VUKSAtcCkKK2VuZGlmCisKK1VDT0RFX09VVCA6PSAkKHNoZWxsIHB3ZCkvJChQUk9EVUNUX09VVCkvJChUQVJHRVRfQ09QWV9PVVRfVkVORE9SKS9saWIvZmlybXdhcmUvdmlkZW8KK2lmZXEgKCwkKHdpbGRjYXJkICQoVUNPREVfT1VUKSkpCiskKHNoZWxsIG1rZGlyICQoVUNPREVfT1VUKSAtcCkKK2VuZGlmCisKKyQoc2hlbGwgY3AgJChNRURJQV9EUklWRVJTKS8uLi9maXJtd2FyZS8qICQoVUNPREVfT1VUKSAtcmZhKQorJChzaGVsbCBjcCAkKE1FRElBX0RSSVZFUlMpLyogJChNRURJQV9NT0RVTEVTKSAtcmZhKQorCitkZWZpbmUgbWVkaWEtbW9kdWxlcworCVBBVEg9JChLRVJORUxfVE9PTFBBVEhTKTokJFBBVEggXAorCSQoTUFLRSkgLUMgJChLRElSKSBNPSQoTUVESUFfTU9EVUxFUykgJChLRVJORUxfQVJHUykgJChDT05GSUdTKSBcCisJIkVYVFJBX0NGTEFHUys9LUkkKElOQ0xVREUpIC1Xbm8tZXJyb3IiIG1vZHVsZXM7IFwKKwlmaW5kICQoTUVESUFfTU9EVUxFUykgLW5hbWUgIioua28iIHwgUEFUSD0kJChjZCAuLyQoVEFSR0VUX0hPU1RfVE9PTF9QQVRIKTsgcHdkKTokJFBBVEggeGFyZ3MgLWkgY3Age30gJChNT0RTX09VVCkKK2VuZGVmCisKK2Vsc2UKK0tESVIgOj0gJChQV0QpL2tlcm5lbAoraWZlcSAoLCQod2lsZGNhcmQgJChLRElSKSkpCiskKGVycm9yIE5vIGZpbmQgdGhlIGRpciBvZiBrZXJuZWwuKQorZW5kaWYKKworTUVESUFfRFJJVkVSUyA6PSAkKFBXRCkvbWVkaWFfbW9kdWxlcy9kcml2ZXJzCitpZmVxICgsJCh3aWxkY2FyZCAkKE1FRElBX0RSSVZFUlMpKSkKKyQoZXJyb3IgTm8gZmluZCB0aGUgZGlyIG9mIGRyaXZlcnMuKQorZW5kaWYKKworSU5DTFVERSA6PSAkKE1FRElBX0RSSVZFUlMpL2luY2x1ZGUKK2lmZXEgKCwkKHdpbGRjYXJkICQoSU5DTFVERSkpKQorJChlcnJvciBObyBmaW5kIHRoZSBkaXIgb2YgaW5jbHVkZS4pCitlbmRpZgorCitNT0RTX09VVCA/PSAkKE1FRElBX0RSSVZFUlMpLy4uL21vZHVsZXMKK2lmZXEgKCwkKHdpbGRjYXJkICQoTU9EU19PVVQpKSkKKyQoc2hlbGwgbWtkaXIgJChNT0RTX09VVCkgLXApCitlbmRpZgorCittb2R1bGVzOgorCUNDQUNIRV9OT0RJUkVDVD0idHJ1ZSIgUEFUSD0kKEtFUk5FTF9UT09MUEFUSFMpOiQkUEFUSCBcCisJJChNQUtFKSAtQyAkKEtESVIpIE09JChNRURJQV9EUklWRVJTKSBBUkNIPSQoS0VSTkVMX0FSQ0gpICQoS0VSTkVMX0FSR1MpICQoQ09ORklHUykgXAorCUVYVFJBX0NGTEFHUys9LUkkKElOQ0xVREUpIC1qNjQKKworY29weS1tb2R1bGVzOgorCUBlY2hvICJzdGFydCBjb3B5aW5nIG1lZGlhIG1vZHVsZXMuIgorCW1rZGlyIC1wICQoTU9EU19PVVQpCisJJChjYWxsIGNvcHktbWVkaWEtbW9kdWxlcywgJChNRURJQV9EUklWRVJTKSwgJChNT0RTX09VVCkpCisKK2FsbDogbW9kdWxlcyBjb3B5LW1vZHVsZXMKKworCitjbGVhbjoKKwlQQVRIPSQoS0VSTkVMX1RPT0xQQVRIUyk6JCRQQVRIIFwKKwkkKE1BS0UpIC1DICQoS0RJUikgTT0kKE1FRElBX0RSSVZFUlMpICQoS0VSTkVMX0FSR1MpIGNsZWFuCisKK2VuZGlmCmRpZmYgLS1naXQgYS9WRVJTSU9OIGIvVkVSU0lPTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjE1MDRkCi0tLSAvZGV2L251bGwKKysrIGIvVkVSU0lPTgpAQCAtMCwwICsxLDc2IEBACitNYWpvcl9WPTUKK01pbm9yX1Y9MworQmFzZUNoYW5nZUlkPUlmYzE3ZTkyZWY5YzllMjExYjhmMDFlYmFlMWU5N2M1ODU1ZmVhMDg0CisKKworI2hpc3RvcnkgdmVyc2lvbgorI1Y1LjIuMTA0LWc3OTVhZWUwMC4wMDMwMjUgUmVsZWFzZSBOb3RlcworI1JlbGVhc2VfQ2hhbmdlSWRfVjVfMj1JMzQ4MDFjYmE2MGQ1NGJmZDlmNDU5Zjc0NDVkMDM2Mjk4OWMyMzQ5NgorI1Y1LjEuNzctZzBjZGViZjI3LjAwMzAwOSBSZWxlYXNlIE5vdGVzCisjUmVsZWFzZV9DaGFuZ2VJZF9WNV8xPUlkN2UzMTViYmYzNzlkMTY2Y2E0YjMzNWNlZjEzYzk4M2E4Y2E1MDc4CisjRmVhdHVyZSBkZXZlbG9wIHRvdGFsIGNvdW50OiA2CisjICAgIGNyaXRpY2FsIGZlYXR1cmUgZGV2ZWxvcCBjb3VudDogMAorIyAgICBpbXBvcnRhbnQgZmVhdHVyZSBkZXZlbG9wIGNvdW50OiA0CisjICAgIG5vcm1hbCBmZWF0dXJlIGRldmVsb3AgY291bnQ6IDIKKyNGZWF0dXJlIGRldmVsb3AgZGV0YWlsIGluZm9ybWF0aW9uOgorIyAgICBpbXByb3ZlIHBpcCBjaGFubmVsIHBsYXkKKyMgICAgc3VwcG9ydCBkZWNvZGVyIGZlbmNlCisjICAgIGZpeGVkIGNhbid0IGdldCBoZHIgaW5mb3JtYXRpb24gY29ycmVjdGx5LgorIyAgICBhZGQgbXVsdGktdmRlYyBpbmZvIGZvciBuZXcgZm9ybWF0IGF2MSBhZnRlciByZXZlcnQKKyMgICAgY2hhbmdlIHB0c2FkanVzdCBhbmQgdGhyZXNob2xkIGZyb20gczY0IHRvIHMzMi4KKyMgICAgc3VwcG9ydCBkdyAweDEwMAorI0ZpeGVkIEJVRyB0b3RhbCBjb3VudDogMzAKKyMgICAgZml4ZWQgY3JpdGljYWwgQlVHIGNvdW50OiAzCisjICAgIGZpeGVkIGltcG9ydGFudCBmZWF0dXJlIGRldmVsb3AgY291bnQ6IDE1CisjICAgIGZpeGVkIG5vcm1hbCBmZWF0dXJlIGRldmVsb3AgY291bnQ6IDEyCisjRml4ZWQgQlVHIGRldGFpbCBpbmZvcm1hdGlvbjoKKyMgICAgYWRkIFZJRFRZUEVfQ09NUFJFU1MgaW4gdmYgZm9yIGR3IG1vZGUgd2l0aCBhZmJjIGJ1ZmZlcgorIyAgICBmaXggc29tZSB0aGUgY3Jhc2ggY2F1c2VkIGJ5IG51bGwgcG9pbnRlcgorIyAgICBmaXhlZCB2cHAgd3JhcHBlciBtZW1vcnkgbGVhay4KKyMgICAgbWV0YWRhdGEgbG9zZSB0aGUgbGFzdCBieXRlIGV2ZXJ5IGZyYW1lIGluIGZyYW1lIG1vZGUKKyMgICAgZml4IGF2cyBjb2xvciBhYm5vcm1hbC4KKyMgICAgZml4IGdzdCBzZWN1cmUgdjRsMiBkZWNvZGVyIG5vdCB3b3JrCisjICAgIGZpeCB0aGUgcGxheWJhY2sgc3R1Y2sgd2hlbiByZXNvbHV0aW9uIGNoYW5nZWQKKyMgICAgaDI2NSB1Y29kZSBzZW5kIDIgaW50ZXJydXB0cyBjYXVzZSBwbGF5YmFjayBzdHVjaworIyAgICBmaXggYXYxIGZyZWV6ZSB3aGVuIGJ1cm4taW4gdGVzdC4KKyMgICAgZml4ZWQgcGxheWJhY2sgc3R1Y2sgYWZ0ZXIgc2Vlay4KKyMgICAgZml4IDhrIGRpc3BsYXkgYWJub3JtYWwuCisjICAgIGZpeGVkIGlycS12ZGVjLTAgdGFrZXMgbW9yZSBjcHUgc2xpY2UuCisjICAgIGZpeGVkIEFWMSBzZWVrIGZyZWV6aW5nLgorIyAgICBmaXhlZCBmYWlsZWQgdG8gYWxsb2NhdGUgdHZwIG1lbW9yeQorIyAgICBmaXhlZCBpc3N1ZSBvZiByZXBvcnRzIHJlc29sdXRpb24gY2hhbmdlLgorI1Y1LjAgUmVsZWFzZSBOb3RlcworI1JlbGVhc2VfQ2hhbmdlSWRfVjVfMD1JNjA1M2UwMjkwMDIxNWQ5MDA2NDY5YzM4Y2EzNzVhY2U0OThiODQ5ZgorI3VwZ3JhZGUgS2VybmVsIHZlcnNpb24gdG8gNS40CisjQW5kcm9pZCBSICsgdjRsMmRlYyAobm8gdnBwKSAgIHh0cyBjbGVhbgorI3Y0bGRlYyBkcml2ZXIgc2VwZXJhdGUgZnJvbSBhbXBvcnRzIGRyaXZlcnMKKyMKKyNWNC4wLjAgUmVsZWFzZSBOb3RlcworI3VwZ3JhZGUgS2VybmVsIHZlcnNpb24gdG8gNC4xOQorI3Y0bDIgc3VwcG9ydCAgZm9yIGgyNjQvaDI2NS92cDkgCisjYWRkIGZyYSBzdXBwb3J0IGluIGRlY29kZXIgZHJpdmVyCisjCisjVjMuMC4wIFJlbGVhc2UgTm90ZXMKKyN1cGdyYWRlIEtlcm5lbCB2ZXJzaW9uIHRvIDQuOQorI21lZGlhX21vZHVsZSByZW1vdmUgZnJvbSBrZXJuZWwgCisjbmV3IGZpcm13YXJlIG1hbmFnZW1lbnQKKyNtanBlZy9tcGVnMTIvbXBlZzIgbXVsdGktaW5zdGFuY2UgZGVjb2RlciBzdXBwb3J0CisjaDI2NCA0ayBhZmJjIHN1cHBvcnQKKyNBVlMyIGRlY29kZXIgc3VwcG9ydAorI3ZkZWMgZG91YmxlIHdyaXRlIHN1cHBvcnQKKyNhZGQgYXYxIGRlY29kZXIgc3VwcG9ydAorI2FkZCBkZWNvZGVyIFFPUyBpbmZvIHJlcG9ydAorI3VwZ3JhZGUgVEEgdWNvZGUgdG8gMC4yIHZlcnNpb24KKyMKKyNWMi4wLjAgUmVsZWFzZSBOb3RlcworI3VwZ3JhZGUgIEtlcm5lbCB2ZXJzaW9uIHRvIDMuMTQgCisjSW50cm9kdWNlIGNvZGVjX21tIG1lbW9yeSBtYW5hZ21lbnQKKyNhZGQgYWZiYyBzY2F0dGVyIG1lbW9yeSBzdXBwb3J0CisjYWRkIHZwOSBkZWNvZGVyIHN1cHBvcnQKKyNhZGQgMjY0LzI2NS92cDkgbXVsdGktaW5zdGFuY2UgZGVjb2RlciBzdXBwb3J0CisjCisjVjEuMC4wIFJlbGVhc2UgTm90ZXMKKyNiYXNlZCBrZXJuZWwgdG8gMy4xMAorI2FkZCBIMjY0IDRLIGRlY29kZXIgc3VwcG9ydAorI2FkZCBIMjY1IHZpZGVvIGRlY29kZXIgc3VwcG9ydAorI0gyNjUgZGVjb2RlciBzdXBwb3J0IGFmYmMgb3V0cHV0CmRpZmYgLS1naXQgYS9kcml2ZXJzL01ha2VmaWxlIGIvZHJpdmVycy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTZiYTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKK29iai15CSs9CWNvbW1vbi8KK29iai15CSs9CWZyYW1lX3Byb3ZpZGVyLworb2JqLXkJKz0JZnJhbWVfc2luay8KK29iai15CSs9CXN0cmVhbV9pbnB1dC8KK29iai15CSs9CWFtdmRlY19wb3J0cy8KK29iai15CSs9CWZyYW1lcmF0ZV9hZGFwdGVyLworb2JqLXkJKz0JbWVkaWFfc3luYy8KK29iai0kKENPTkZJR19BTUxPR0lDX01FRElBX1Y0TF9ERUMpCSs9CWFtdmRlY19wb3J0cy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYW12ZGVjX3BvcnRzL01ha2VmaWxlIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU3Y2ZmNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL01ha2VmaWxlCkBAIC0wLDAgKzEsMjYgQEAKK29iai1tICs9IGFtdmRlY19wb3J0cy5vCithbXZkZWNfcG9ydHMtb2JqcyArPSBhbWxfdmNvZGVjX2RlY19kcnYubworYW12ZGVjX3BvcnRzLW9ianMgKz0gYW1sX3Zjb2RlY19kZWMubworYW12ZGVjX3BvcnRzLW9ianMgKz0gYW1sX3Zjb2RlY191dGlsLm8KK2FtdmRlY19wb3J0cy1vYmpzICs9IGFtbF92Y29kZWNfYWRhcHQubworYW12ZGVjX3BvcnRzLW9ianMgKz0gYW1sX3Zjb2RlY192cHAubworYW12ZGVjX3BvcnRzLW9ianMgKz0gYW1sX3Zjb2RlY19nZTJkLm8KK2FtdmRlY19wb3J0cy1vYmpzICs9IHZkZWNfZHJ2X2lmLm8KK2FtdmRlY19wb3J0cy1vYmpzICs9IGFtbF90YXNrX2NoYWluLm8KK2FtdmRlY19wb3J0cy1vYmpzICs9IGRlY29kZXIvdmRlY19oMjY0X2lmLm8KK2FtdmRlY19wb3J0cy1vYmpzICs9IGRlY29kZXIvdmRlY19oZXZjX2lmLm8KK2FtdmRlY19wb3J0cy1vYmpzICs9IGRlY29kZXIvdmRlY192cDlfaWYubworYW12ZGVjX3BvcnRzLW9ianMgKz0gZGVjb2Rlci92ZGVjX21wZWcxMl9pZi5vCithbXZkZWNfcG9ydHMtb2JqcyArPSBkZWNvZGVyL3ZkZWNfbXBlZzRfaWYubworYW12ZGVjX3BvcnRzLW9ianMgKz0gZGVjb2Rlci92ZGVjX21qcGVnX2lmLm8KK2FtdmRlY19wb3J0cy1vYmpzICs9IGRlY29kZXIvdmRlY19hdjFfaWYubworaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfVjRMX1NPRlRXQVJFX1BBUlNFUgorYW12ZGVjX3BvcnRzLW9ianMgKz0gZGVjb2Rlci9hbWxfaDI2NF9wYXJzZXIubworYW12ZGVjX3BvcnRzLW9ianMgKz0gZGVjb2Rlci9hbWxfaGV2Y19wYXJzZXIubworYW12ZGVjX3BvcnRzLW9ianMgKz0gZGVjb2Rlci9hbWxfdnA5X3BhcnNlci5vCithbXZkZWNfcG9ydHMtb2JqcyArPSBkZWNvZGVyL2FtbF9tcGVnMTJfcGFyc2VyLm8KK2FtdmRlY19wb3J0cy1vYmpzICs9IGRlY29kZXIvYW1sX21wZWc0X3BhcnNlci5vCithbXZkZWNfcG9ydHMtb2JqcyArPSBkZWNvZGVyL2FtbF9tanBlZ19wYXJzZXIubworYW12ZGVjX3BvcnRzLW9ianMgKz0gdXRpbHMvZ29sb21iLm8KK2VuZGlmCithbXZkZWNfcG9ydHMtb2JqcyArPSB1dGlscy9jb21tb24ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbXZkZWNfcG9ydHMvYW1sX3Rhc2tfY2hhaW4uYyBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2FtbF90YXNrX2NoYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRmZTAxNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2FtbF90YXNrX2NoYWluLmMKQEAgLTAsMCArMSwzNjUgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNyBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisqIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyoKKyogRGVzY3JpcHRpb246CisqLworCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlICJhbWxfdmNvZGVjX2Rydi5oIgorI2luY2x1ZGUgImFtbF90YXNrX2NoYWluLmgiCisKKyNkZWZpbmUgS0VSTkVMX0FUUkFDRV9UQUcgS0VSTkVMX0FUUkFDRV9UQUdfVjRMMgorI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9tZXNvbl9hdHJhY2UuaD4KKworc3RydWN0IHRhc2tfaXRlbV9uYW1lX3MgeworCWVudW0gdGFza190eXBlX2UJdHlwZTsKKwljb25zdCB1OAkJKm5hbWU7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRhc2tfaXRlbV9uYW1lX3MgaW5hbWVbXSA9IHsKKwl7VEFTS19UWVBFX0RFQywJCSJkZWMifSwKKwl7VEFTS19UWVBFX1ZQUCwJCSJ2cHAifSwKKwl7VEFTS19UWVBFX1Y0TF9TSU5LLAkidjRsLXNpbmsifSwKKwl7VEFTS19UWVBFX0dFMkQsCSJnZTJkIn0sCisJe1RBU0tfVFlQRV9NQVgsCQkidW5rbm93biJ9LAorfTsKKworc3RhdGljIGNvbnN0IHU4ICp0eXBlX3RvX25hbWUoZW51bSB0YXNrX3R5cGVfZSB0eXBlKQoreworCWNvbnN0IHU4ICpuYW1lID0gInVua25vd24iOworCWludCBpLCBzaXplID0gQVJSQVlfU0laRShpbmFtZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCWlmICh0eXBlID09IGluYW1lW2ldLnR5cGUpCisJCQluYW1lID0gaW5hbWVbaV0ubmFtZTsKKwl9CisKKwlyZXR1cm4gbmFtZTsKK30KKworc3RhdGljIHN0cnVjdCB0YXNrX2l0ZW1fcyAqZmluZF90YXNrX2l0ZW0oc3RydWN0IHRhc2tfY2hhaW5fcyAqdGFzaywKKwkJCQkJICBlbnVtIHRhc2tfdHlwZV9lIHR5cGUpCit7CisJc3RydWN0IHRhc2tfaXRlbV9zICppdGVtID0gTlVMTDsKKwl1bG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXNrLT5zbG9jaywgZmxhZ3MpOworCisJaWYgKCFsaXN0X2VtcHR5KCZ0YXNrLT5saXN0X2l0ZW0pKSB7CisJCXN0cnVjdCB0YXNrX2l0ZW1fcyAqcDsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZ0YXNrLT5saXN0X2l0ZW0sIG5vZGUpIHsKKwkJCWlmIChwLT5vcHMtPnR5cGUgPT0gdHlwZSkgeworCQkJCWl0ZW0gPSBwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKGl0ZW0pCisJCWtyZWZfZ2V0KCZpdGVtLT5yZWYpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+c2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBpdGVtOworfQorCitzdGF0aWMgdm9pZCB0YXNrX2l0ZW1fcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZik7CisKK3N0YXRpYyB2b2lkIHRhc2tfaXRlbV92ZnJhbWVfcHVzaChzdHJ1Y3QgdGFza19pdGVtX3MgKml0ZW0sIHN0cnVjdCB2ZnJhbWVfcyAqdmZyYW1lKQoreworCWludCBpID0gMDsKKworCWZvciAoaSA9IDAgOyBpIDwgMzsgaSsrKSB7CisJCWlmIChpdGVtLT52ZnJhbWVbaV0gPT0gTlVMTCkgeworCQkJaXRlbS0+dmZyYW1lW2ldID0gdmZyYW1lOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnRhc2tfaXRlbV92ZnJhbWVfcG9wKHN0cnVjdCB0YXNrX2l0ZW1fcyAqaXRlbSkKK3sKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmcmFtZSA9IE5VTEw7CisJaW50IGkgPSAwOworCisJZm9yIChpID0gMCA7IGkgPCAzOyBpKyspIHsKKwkJaWYgKGl0ZW0tPnZmcmFtZVtpXSAhPSBOVUxMKSB7CisJCQl2ZnJhbWUgPSBpdGVtLT52ZnJhbWVbaV07CisJCQlpdGVtLT52ZnJhbWVbaV0gPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gdmZyYW1lOworfQorCitzdGF0aWMgc3RydWN0IHRhc2tfaXRlbV9zICp0YXNrX2l0ZW1fZ2V0KHN0cnVjdCB0YXNrX2NoYWluX3MgKnRhc2ssCisJCQkJICBlbnVtIHRhc2tfdHlwZV9lIHR5cGUpCit7CisJc3RydWN0IHRhc2tfaXRlbV9zICppdGVtID0gTlVMTDsKKworCWl0ZW0gPSBmaW5kX3Rhc2tfaXRlbSh0YXNrLCB0eXBlKTsKKwlpZiAoIWl0ZW0pIHsKKwkJdjRsX2RiZyh0YXNrLT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJUU0soJXB4KTolZCBnZXQgaXRlbTolZCBmYWlsLlxuIiwgdGFzaywgdGFzay0+aWQsIHR5cGUpOworCX0KKworCXJldHVybiBpdGVtOworfQorCitzdGF0aWMgaW50IHRhc2tfaXRlbV9wdXQoc3RydWN0IHRhc2tfaXRlbV9zICppdGVtKQoreworCXJldHVybiBrcmVmX3B1dCgmaXRlbS0+cmVmLCB0YXNrX2l0ZW1fcmVsZWFzZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRhc2tfYnVmZmVyX3N1Ym1pdChzdHJ1Y3QgdGFza19jaGFpbl9zICp0YXNrLAorCQkJICAgICAgIGVudW0gdGFza190eXBlX2UgdHlwZSkKK3sKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPQorCQkoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKil0YXNrLT5vYmo7CisJc3RydWN0IHRhc2tfaXRlbV9zICppdGVtID0gTlVMTDsKKwlzdHJ1Y3QgdGFza19pdGVtX3MgKml0ZW0yID0gTlVMTDsKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmID0gTlVMTDsKKworCWl0ZW0gPSB0YXNrX2l0ZW1fZ2V0KHRhc2ssIHR5cGUpOworCWlmIChpdGVtKSB7CisJCWl0ZW0tPm9wcy0+Z2V0X3ZmcmFtZShpdGVtLT5jYWxsZXIsICZ2Zik7CisJCWZiLT52ZnJhbWUgPSAodm9pZCAqKXZmOworCQl0YXNrX2l0ZW1fdmZyYW1lX3B1c2goaXRlbSwgdmYpOworCQlpdGVtLT5pc19hY3RpdmUgPSBmYWxzZTsKKworCQlpdGVtMiA9IHRhc2tfaXRlbV9nZXQodGFzaywgdGFzay0+bWFwWzBdW3R5cGVdKTsKKwkJaWYgKGl0ZW0yKSB7CisJCQlpdGVtMi0+aXNfYWN0aXZlID0gdHJ1ZTsKKwkJCWl0ZW0yLT5vcHMtPmZpbGxfYnVmZmVyKHRhc2stPmN0eCwgZmIpOworCisJCQl2NGxfZGJnKHRhc2stPmN0eCwgVjRMX0RFQlVHX1RBU0tfQ0hBSU4sCisJCQkJIlRTSyglcHgpOiVkLCB2ZjolcHgsIHBoeTolbHgsIHN1Ym1pdCAlZCA9PiAlZC5cbiIsCisJCQkJdGFzaywgdGFzay0+aWQsIHZmLCBmYi0+bS5tZW1bMF0uYWRkciwKKwkJCQl0eXBlLCB0YXNrLT5tYXBbMF1bdHlwZV0pOworCisJCQl0YXNrLT5kaXJlY3Rpb24gPSBUQVNLX0RJUl9TVUJNSVQ7CisJCQl0YXNrX2l0ZW1fcHV0KGl0ZW0yKTsKKwkJfQorCQl0YXNrX2l0ZW1fcHV0KGl0ZW0pOworCX0KK30KKworc3RhdGljIHZvaWQgdGFza19idWZmZXJfcmVjeWNsZShzdHJ1Y3QgdGFza19jaGFpbl9zICp0YXNrLAorCQkJICAgICAgIGVudW0gdGFza190eXBlX2UgdHlwZSkKK3sKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPQorCQkoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKil0YXNrLT5vYmo7CisJc3RydWN0IHRhc2tfaXRlbV9zICppdGVtID0gTlVMTDsKKwlzdHJ1Y3QgdGFza19pdGVtX3MgKml0ZW0yID0gTlVMTDsKKworCWl0ZW0gPSB0YXNrX2l0ZW1fZ2V0KHRhc2ssIHR5cGUpOworCWlmIChpdGVtKSB7CisJCWl0ZW0tPmlzX2FjdGl2ZSA9IGZhbHNlOworCisJCWl0ZW0yID0gdGFza19pdGVtX2dldCh0YXNrLCB0YXNrLT5tYXBbMV1bdHlwZV0pOworCQlpZiAoaXRlbTIpIHsKKwkJCXN0cnVjdCB2ZnJhbWVfcyAqdmYgPSBOVUxMOworCisJCQlpdGVtMi0+aXNfYWN0aXZlID0gdHJ1ZTsKKworCQkJdmYgPSB0YXNrX2l0ZW1fdmZyYW1lX3BvcChpdGVtMik7CisJCQlpdGVtMi0+b3BzLT5wdXRfdmZyYW1lKGl0ZW0yLT5jYWxsZXIsIHZmKTsKKworCQkJdjRsX2RiZyh0YXNrLT5jdHgsIFY0TF9ERUJVR19UQVNLX0NIQUlOLAorCQkJCSJUU0soJXB4KTolZCwgdmY6JXB4LCBwaHk6JWx4LCByZWN5Y2xlICVkID0+ICVkLlxuIiwKKwkJCQl0YXNrLCB0YXNrLT5pZCwgdmYsIGZiLT5tLm1lbVswXS5hZGRyLAorCQkJCXR5cGUsIHRhc2stPm1hcFsxXVt0eXBlXSk7CisKKwkJCXRhc2stPmRpcmVjdGlvbiA9IFRBU0tfRElSX1JFQ1lDTEU7CisJCQl0YXNrX2l0ZW1fcHV0KGl0ZW0yKTsKKwkJfQorCQl0YXNrX2l0ZW1fcHV0KGl0ZW0pOworCX0KK30KKwordm9pZCB0YXNrX2NoYWluX3Nob3coc3RydWN0IHRhc2tfY2hhaW5fcyAqdGFzaykKK3sKKwlzdHJ1Y3QgdGFza19pdGVtX3MgKml0ZW0gPSBOVUxMOworCWNoYXIgYnVmWzEyOF0gPSB7MH07CisJY2hhciAqcGJ1ZiA9IGJ1ZjsKKwl1bG9uZyBmbGFnczsKKworCWlmICghdGFzayB8fCAhdGFzay0+Y3R4KQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGFzay0+c2xvY2ssIGZsYWdzKTsKKworCWlmICghbGlzdF9lbXB0eSgmdGFzay0+bGlzdF9pdGVtKSkgeworCQlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPQorCQkJKHN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICopdGFzay0+b2JqOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoaXRlbSwgJnRhc2stPmxpc3RfaXRlbSwgbm9kZSkgeworCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlcyglZCkiLAorCQkJCWl0ZW0tPm5hbWUsIGl0ZW0tPmlzX2FjdGl2ZSk7CisJCQlpZiAoaXRlbS0+bm9kZS5uZXh0ICE9ICZ0YXNrLT5saXN0X2l0ZW0pIHsKKwkJCQlpZiAodGFzay0+ZGlyZWN0aW9uID09IFRBU0tfRElSX1NVQk1JVCkKKwkJCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIgPT0+ICIpOworCQkJCWVsc2UKKwkJCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIgPD09ICIpOworCQkJfQorCQl9CisJCXY0bF9kYmcodGFzay0+Y3R4LCBWNExfREVCVUdfQ09ERUNfUFJJTkZPLAorCQkJInZiOiUyZCwgcGh5OiVseCAgJXNcbiIsCisJCQl0YXNrLT5pZCwgZmItPm0ubWVtWzBdLmFkZHIsIGJ1Zik7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+c2xvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0wodGFza19jaGFpbl9zaG93KTsKKworc3RhdGljIHZvaWQgdGFza19jaGFpbl9kZXN0cm95KHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCB0YXNrX2NoYWluX3MgKnRhc2s7CisKKwl0YXNrID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCB0YXNrX2NoYWluX3MsIHJlZik7CisKKwl0YXNrLT5jdXJfdHlwZSA9IFRBU0tfVFlQRV9NQVg7CisJbWVtc2V0KHRhc2stPm1hcCwgMCwgc2l6ZW9mKHRhc2stPm1hcCkpOworCisJdjRsX2RiZyh0YXNrLT5jdHgsIFY0TF9ERUJVR19UQVNLX0NIQUlOLAorCQkiVFNLKCVweCk6JWQgdGFzayBjaGFpbiBkZXN0cm95ZWQuXG4iLCB0YXNrLCB0YXNrLT5pZCk7CisKKwlrZnJlZSh0YXNrKTsKK30KKworc3RhdGljIHZvaWQgdGFza19pdGVtX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IHRhc2tfaXRlbV9zICppdGVtOworCisJaXRlbSA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgdGFza19pdGVtX3MsIHJlZik7CisJbGlzdF9kZWwoJml0ZW0tPm5vZGUpOworCisJdjRsX2RiZyhpdGVtLT50YXNrLT5jdHgsIFY0TF9ERUJVR19UQVNLX0NIQUlOLAorCQkiVFNLKCVweCk6JWQgdGFzayBpdGVtOiglcHgsJWQpIHJlbGVhc2VkLlxuIiwKKwkJaXRlbS0+dGFzaywgaXRlbS0+dGFzay0+aWQsIGl0ZW0sIGl0ZW0tPm9wcy0+dHlwZSk7CisKKwlrcmVmX3B1dCgmaXRlbS0+dGFzay0+cmVmLCB0YXNrX2NoYWluX2Rlc3Ryb3kpOworCisJa2ZyZWUoaXRlbSk7Cit9CisKK3ZvaWQgdGFza19jaGFpbl9jbGVhbihzdHJ1Y3QgdGFza19jaGFpbl9zICp0YXNrKQoreworCXN0cnVjdCB0YXNrX2l0ZW1fcyAqaXRlbSwgKnRtcDsKKworCXY0bF9kYmcodGFzay0+Y3R4LCBWNExfREVCVUdfVEFTS19DSEFJTiwKKwkJIlRTSyglcHgpOiVkIHRhc2sgY2hhaW4gY2xlYW4uXG4iLCB0YXNrLCB0YXNrLT5pZCk7CisKKwlpZiAoIWxpc3RfZW1wdHkoJnRhc2stPmxpc3RfaXRlbSkpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGl0ZW0sIHRtcCwgJnRhc2stPmxpc3RfaXRlbSwgbm9kZSkKKwkJCWtyZWZfcHV0KCZpdGVtLT5yZWYsIHRhc2tfaXRlbV9yZWxlYXNlKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHRhc2tfY2hhaW5fY2xlYW4pOworCit2b2lkIHRhc2tfY2hhaW5fcmVsZWFzZShzdHJ1Y3QgdGFza19jaGFpbl9zICp0YXNrKQoreworCXY0bF9kYmcodGFzay0+Y3R4LCBWNExfREVCVUdfVEFTS19DSEFJTiwKKwkJIlRTSyglcHgpOiVkIHRhc2sgY2hhaW4gcmVsZWFzZS5cbiIsIHRhc2ssIHRhc2stPmlkKTsKKworCWtyZWZfcHV0KCZ0YXNrLT5yZWYsIHRhc2tfY2hhaW5fZGVzdHJveSk7Cit9CitFWFBPUlRfU1lNQk9MKHRhc2tfY2hhaW5fcmVsZWFzZSk7CisKK3ZvaWQgdGFza19vcmRlcl9hdHRhY2goc3RydWN0IHRhc2tfY2hhaW5fcyAqdGFzaywKKwkJCSBzdHJ1Y3QgdGFza19vcHNfcyAqb3BzLAorCQkJIHZvaWQgKmNhbGxlcikKK3sKKwlzdHJ1Y3QgdGFza19pdGVtX3MgKml0ZW07CisKKwlpdGVtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRhc2tfaXRlbV9zKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFpdGVtKSB7CisJCXY0bF9kYmcodGFzay0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkiVFNLKCVweCk6JWQgYWxsb2MgaXRlbSBmYWlsLlxuIiwgdGFzaywgdGFzay0+aWQpOworCQlyZXR1cm47CisJfQorCisJaXRlbS0+dGFzawk9IHRhc2s7CisJaXRlbS0+b3BzCT0gb3BzOworCWl0ZW0tPmNhbGxlcgk9IGNhbGxlcjsKKwlpdGVtLT5uYW1lCT0gdHlwZV90b19uYW1lKG9wcy0+dHlwZSk7CisJa3JlZl9pbml0KCZpdGVtLT5yZWYpOworCisJdGFzay0+bWFwWzBdW29wcy0+dHlwZV0gPSB0YXNrLT5jdXJfdHlwZTsKKwl0YXNrLT5tYXBbMV1bdGFzay0+Y3VyX3R5cGVdID0gb3BzLT50eXBlOworCXRhc2stPmN1cl90eXBlID0gb3BzLT50eXBlOworCWtyZWZfZ2V0KCZ0YXNrLT5yZWYpOworCisJbGlzdF9hZGQoJml0ZW0tPm5vZGUsICZ0YXNrLT5saXN0X2l0ZW0pOworCisJdjRsX2RiZyh0YXNrLT5jdHgsIFY0TF9ERUJVR19UQVNLX0NIQUlOLAorCQkiVFNLKCVweCk6JWQgYXR0YWNoIGl0ZW06KCVweCwlZCkuXG4iLAorCQl0YXNrLCB0YXNrLT5pZCwgaXRlbSwgb3BzLT50eXBlKTsKK30KK0VYUE9SVF9TWU1CT0wodGFza19vcmRlcl9hdHRhY2gpOworCit2b2lkIHRhc2tfY2hhaW5fdXBkYXRlX29iamVjdChzdHJ1Y3QgdGFza19jaGFpbl9zICp0YXNrLCB2b2lkICpvYmopCit7CisJLyoKKwkgKiBOb3RlOiBoYXZlIHRvIGludm9rZSB0aGlzIGZ1bnRpb24KKwkgKiBpZiB0aGUgdGFzayBvYmplY3QgaGFzIGJlZW4gY2hhbmdlZC4KKwkgKi8KKwl0YXNrLT5vYmogPSBvYmo7CisKKwl2NGxfZGJnKHRhc2stPmN0eCwgVjRMX0RFQlVHX1RBU0tfQ0hBSU4sCisJCSJUU0soJXB4KTolZCB1cGRhdGUgdGFzayBvYmo6JXB4LlxuIiwKKwkJdGFzaywgdGFzay0+aWQsIG9iaik7Cit9CitFWFBPUlRfU1lNQk9MKHRhc2tfY2hhaW5fdXBkYXRlX29iamVjdCk7CisKK2ludCB0YXNrX2NoYWluX2luaXQoc3RydWN0IHRhc2tfY2hhaW5fcyAqKnRhc2tfb3V0LAorCQkJICAgIHZvaWQgKnY0bF9jdHgsCisJCQkgICAgdm9pZCAqb2JqLAorCQkJICAgIGludCB2Yl9pZHgpCit7CisJc3RydWN0IHRhc2tfY2hhaW5fcyAqdGFzazsKKworCXRhc2sgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGFza19jaGFpbl9zKSwgR0ZQX0FUT01JQyk7CisJaWYgKCF0YXNrKSB7CisJCXY0bF9kYmcodGFzay0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkiVFNLKCVweCk6JWQgYWxsb2MgdGFzayBmYWlsLlxuIiwgdGFzaywgdGFzay0+aWQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl0YXNrLT5pZAk9IHZiX2lkeDsKKwl0YXNrLT5vYmoJPSBvYmo7CisJdGFzay0+Y3R4CT0gdjRsX2N0eDsKKwlrcmVmX2luaXQoJnRhc2stPnJlZik7CisJc3Bpbl9sb2NrX2luaXQoJnRhc2stPnNsb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmdGFzay0+bGlzdF9pdGVtKTsKKworCXRhc2stPmF0dGFjaAk9IHRhc2tfb3JkZXJfYXR0YWNoOworCXRhc2stPnN1Ym1pdAk9IHRhc2tfYnVmZmVyX3N1Ym1pdDsKKwl0YXNrLT5yZWN5Y2xlCT0gdGFza19idWZmZXJfcmVjeWNsZTsKKworCSp0YXNrX291dCA9IHRhc2s7CisKKwl2NGxfZGJnKHRhc2stPmN0eCwgVjRMX0RFQlVHX1RBU0tfQ0hBSU4sCisJCSJUU0soJXB4KTolZCB0YXNrIGNoYWluIGNyZWF0IHN1Y2Nlc3MuXG4iLCB0YXNrLCB0YXNrLT5pZCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHRhc2tfY2hhaW5faW5pdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2FtbF90YXNrX2NoYWluLmggYi9kcml2ZXJzL2FtdmRlY19wb3J0cy9hbWxfdGFza19jaGFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYmUyZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FtdmRlY19wb3J0cy9hbWxfdGFza19jaGFpbi5oCkBAIC0wLDAgKzEsMTI1IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorKiBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqCisqIERlc2NyaXB0aW9uOgorKi8KKworI2lmbmRlZiBBTUxfVEFTS19DSEFJTl9ICisjZGVmaW5lIEFNTF9UQVNLX0NIQUlOX0gKKworI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdmZtL3ZmcmFtZS5oPgorCitlbnVtIHRhc2tfdHlwZV9lIHsKKwlUQVNLX1RZUEVfREVDLAorCVRBU0tfVFlQRV9WUFAsCisJVEFTS19UWVBFX1Y0TF9TSU5LLAorCVRBU0tfVFlQRV9HRTJELAorCVRBU0tfVFlQRV9NQVgKK307CisKK2VudW0gdGFza19kaXJfZSB7CisJVEFTS19ESVJfU1VCTUlULAorCVRBU0tfRElSX1JFQ1lDTEUsCisJVEFTS19ESVJfTUFYCit9OworCitzdHJ1Y3QgdGFza19jaGFpbl9zOworCisvKgorICogc3RydWN0IHRhc2tfb3BzX3MgLSBpbnRlcmZhY2Ugb2YgdGhlIHRhc2sgaXRlbS4KKyAqIEB0eXBlCTogdHlwZSBvZiB0YXNrIG9wcyBpbnZvbHZlcyBkZWMsIHZwcCwgdjRsIHNpbmsgZXRjLgorICogQGdldF92ZnJhbWUJOiBnZXQgdGhlIHZpZGVvIGZyYW1lIGZyb20gY2FsbGVyJ3MgZmlmby4KKyAqIEBwdXRfdmZyYW1lCTogcHV0IHRoZSB2aWRlbyBmcmFtZSB0byBjYWxsZXIncyBmaWZvLgorICogQGZpbGxfYnVmZmVyCTogc3VibWl0IHRoZSBidWZmZXIgaW50byBuZXh0IHByb2Nlc3MgbW9kdWxlLgorICovCitzdHJ1Y3QgdGFza19vcHNfcyB7CisJZW51bSB0YXNrX3R5cGVfZSB0eXBlOworCXZvaWQJKCpnZXRfdmZyYW1lKSAodm9pZCAqY2FsbGVyLCBzdHJ1Y3QgdmZyYW1lX3MgKip2Zik7CisJdm9pZAkoKnB1dF92ZnJhbWUpICh2b2lkICpjYWxsZXIsIHN0cnVjdCB2ZnJhbWVfcyAqdmYpOworCXZvaWQJKCpmaWxsX2J1ZmZlcikgKHZvaWQgKnY0bF9jdHgsIHZvaWQgKmZiX2N0eCk7Cit9OworCisvKgorICogc3RydWN0IHRhc2tfaXRlbV9zIC0gaXRlbXMgb2YgdGhlIHRhc2sgY2hhaW4uCisgKiBAbm9kZQk6IGxpc3Qgbm9kZSBvZiB0aGUgc3BlY2lmaWMgdGFzayBpdGVtLgorICogQHJlZgkJOiByZWZlcmVuY2UgY291bnQgb2YgaXRlbSBiZSB1c2VkIGJ5IG90aGVycy4KKyAqIEBuYW1lCTogbmFtZSBvZiB0YXNrIGl0ZW0sIG1hcCB3aXRoIHRhc2sgdHlwZS4KKyAqIEBpc19hY3RpdmUJOiBpbmRpY2F0ZSB0aGlzIGl0ZW0gd2hldGhlciBpcyBhY3RpdmUuCisgKiBAdmZyYW1lWzNdCTogc3RvcmUgdGhlIHZmcmFtZXMgdGhhdCBnZXQgZnJvbSBjYWxsZXIuCisgKiBAdGFzawk6IHRoZSBjb250ZXh0IG9mIHRoZSB0YXNrIGNoYWluLgorICogQGNhbGxlcgk6IGl0J3MgdGhlIGhhbmRsZSwgbWVnaHQgaXQncyBkZWMsIHZwcCBvciB2NGwtc2luayBldGMuCisgKiBAb3BzCQk6IHNldHMgb2YgaW50ZXJmYWNlIHdoaWNoIGF0dGFjaCBmcm9tIHRhc2sgaXRlbS4KKyAqLworc3RydWN0IHRhc2tfaXRlbV9zIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7CisJc3RydWN0IGtyZWYJCXJlZjsKKwljb25zdCB1OAkJKm5hbWU7CisJYm9vbAkJCWlzX2FjdGl2ZTsKKwl2b2lkCQkJKnZmcmFtZVszXTsKKwlzdHJ1Y3QgdGFza19jaGFpbl9zCSp0YXNrOworCXZvaWQJCQkqY2FsbGVyOworCXN0cnVjdCB0YXNrX29wc19zCSpvcHM7Cit9OworCisvKgorICogc3RydWN0IHRhc2tfY2hhaW5fcyAtIHRoZSBtYW5hZ2VyIHN0cnVjdCBvZiB0aGUgdGFzayBjaGFpbi4KKyAqIEBsaXN0X2l0ZW0JOiBhbGwgdGFzayBpdGVtcyBiZSBhdHRhY2hlZCBhcmUgc3RvcmUgaW4gdGhlIGxpc3QuCisgKiBAbm9kZQk6IHdpbGwgcmVnaXN0ZXIgdG8gdGhlIHRhc2sgY2hhaW4gcG9vbC4KKyAqIEByZWYJCTogcmVmZXJlbmNlIGNvdW50IG9mIHRhc2sgY2hhaW4gYmUgdXNlZCBieSBvdGhlcnMuCisgKiBAc2xvY2sJOiB1c2VkIGZvciBsaXN0IGl0ZW0gd3JpdGUgYW5kIHJlYWQgc2FmZWx5LgorICogQGlkCQk6IGl0J3MgdmIgaW5kZXggdG8gYmUgYSBtYXJrIHVzZWQgZm9yIHRhc2sgY2hhaW4uCisgKiBAY3R4CQk6IHRoZSBjb250ZXh0IG9mIHRoZSB2NGwgZHJpdmVyLgorICogQG9iagkJOiB0aGUgb2JqZWN0IG1hbmFnZWQgYnkgdGFzayBjaGFpbi4KKyAqIEBkaXJlY3Rpb24JOiBkaXJlY3Rpb24gaW5jbHVzZSAyIGZsb3dzIHN1Ym1pdCAmIHJlY3ljbGUuCisgKiBAY3VyX3R5cGUJOiB0aGUgbGF0ZXN0IGl0ZW0gdHlwZSBiZWZvcmUgYSBuZXcgaXRlbSBiZSBhdHRhY2hlZC4KKyAqIEBtYXAJCTogdGhlIG1hcCBzdG9yZSB0aGUgcGlwZWxpbmUgaW5mb3JtYXRpb24uCisgKiBAYXR0YWNoCTogYXR0YWNoIGEgbmV3IGl0ZW0gdG8gdGFzayBjaGFpbi4KKyAqIEBzdWJtaXQJOiBzdWJtaXQgdGhlIGZpbmlzaCBpdGVtIHRvIG5leHQgaXRlbSBtb2R1bGUuCisgKiBAcmVjeWNsZQk6IGlmIGl0ZW0ncyBkYXRlIHdhcyBjb25zdW1lZCB3aWxsIGJlIHJlY3ljbGVkIHRvIGl0ZW0uCisgKi8KK3N0cnVjdCB0YXNrX2NoYWluX3MgeworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdF9pdGVtOworCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKKwlzdHJ1Y3Qga3JlZgkJcmVmOworCXNwaW5sb2NrX3QJCXNsb2NrOworCWludAkJCWlkOworCXZvaWQJCQkqY3R4OworCXZvaWQJCQkqb2JqOworCWVudW0gdGFza19kaXJfZQkJZGlyZWN0aW9uOworCWVudW0gdGFza190eXBlX2UJY3VyX3R5cGU7CisJdTgJCQltYXBbMl1bOF07CisKKwl2b2lkCSgqYXR0YWNoKSAoc3RydWN0IHRhc2tfY2hhaW5fcyAqLCBzdHJ1Y3QgdGFza19vcHNfcyAqLCB2b2lkICopOworCXZvaWQJKCpzdWJtaXQpIChzdHJ1Y3QgdGFza19jaGFpbl9zICosIGVudW0gdGFza190eXBlX2UpOworCXZvaWQJKCpyZWN5Y2xlKSAoc3RydWN0IHRhc2tfY2hhaW5fcyAqLCBlbnVtIHRhc2tfdHlwZV9lKTsKK307CisKKworaW50IHRhc2tfY2hhaW5faW5pdChzdHJ1Y3QgdGFza19jaGFpbl9zICoqdGFza19vdXQsCisJCSAgICAgdm9pZCAqdjRsX2N0eCwKKwkJICAgICB2b2lkICpvYmosCisJCSAgICAgaW50IHZiX2lkeCk7Cit2b2lkIHRhc2tfb3JkZXJfYXR0YWNoKHN0cnVjdCB0YXNrX2NoYWluX3MgKnRhc2ssCisJCSAgICAgICBzdHJ1Y3QgdGFza19vcHNfcyAqb3BzLAorCQkgICAgICAgdm9pZCAqY2FsbGVyKTsKK3ZvaWQgdGFza19jaGFpbl9jbGVhbihzdHJ1Y3QgdGFza19jaGFpbl9zICp0YXNrKTsKK3ZvaWQgdGFza19jaGFpbl9yZWxlYXNlKHN0cnVjdCB0YXNrX2NoYWluX3MgKnRhc2spOwordm9pZCB0YXNrX2NoYWluX3Nob3coc3RydWN0IHRhc2tfY2hhaW5fcyAqdGFzayk7Cit2b2lkIHRhc2tfY2hhaW5fdXBkYXRlX29iamVjdChzdHJ1Y3QgdGFza19jaGFpbl9zICp0YXNrLCB2b2lkICpvYmopOworCisjZW5kaWYgLy9BTUxfVEFTS19DSEFJTl9ICisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2FtbF92Y29kZWNfYWRhcHQuYyBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2FtbF92Y29kZWNfYWRhcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTA4MzcxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvYW1sX3Zjb2RlY19hZGFwdC5jCkBAIC0wLDAgKzEsNTkxIEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorKiBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqCisqIERlc2NyaXB0aW9uOgorKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvYW1zdHJlYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL3Zmb3JtYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL2Fmb3JtYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2ZyYW1lX3N5bmMvdHN5bmMuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2ZyYW1lX3N5bmMvcHRzc2Vydi5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZnJhbWVfc3luYy90aW1lc3RhbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL2FtcG9ydHNfY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9mcmFtZV9zeW5jL3RzeW5jX3Bjci5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29kZWNfbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvbmZpZ3MuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL3Zmb3JtYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL2Fmb3JtYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3JlZ2lzdGVycy9yZWdpc3Rlci5oPgorI2luY2x1ZGUgIi4uL3N0cmVhbV9pbnB1dC9hbXBvcnRzL2FkZWMuaCIKKyNpbmNsdWRlICIuLi9zdHJlYW1faW5wdXQvYW1wb3J0cy9zdHJlYW1idWYuaCIKKyNpbmNsdWRlICIuLi9zdHJlYW1faW5wdXQvYW1wb3J0cy9zdHJlYW1idWZfcmVnLmgiCisjaW5jbHVkZSAiLi4vc3RyZWFtX2lucHV0L3BhcnNlci90c2RlbXV4LmgiCisjaW5jbHVkZSAiLi4vc3RyZWFtX2lucHV0L3BhcnNlci9wc3BhcnNlci5oIgorI2luY2x1ZGUgIi4uL3N0cmVhbV9pbnB1dC9wYXJzZXIvZXNwYXJzZXIuaCIKKyNpbmNsdWRlICIuLi9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWMuaCIKKyNpbmNsdWRlICIuLi9jb21tb24vbWVkaWFfY2xvY2svc3dpdGNoL2FtcG9ydHNfZ2F0ZS5oIgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSAiYW1sX3Zjb2RlY19hZGFwdC5oIgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisKKyNkZWZpbmUgREVGQVVMVF9WSURFT19CVUZGRVJfU0laRQkJKDEwMjQgKiAxMDI0ICogMykKKyNkZWZpbmUgREVGQVVMVF9WSURFT19CVUZGRVJfU0laRV80SwkJKDEwMjQgKiAxMDI0ICogNikKKyNkZWZpbmUgREVGQVVMVF9WSURFT19CVUZGRVJfU0laRV9UVlAJCSgxMDI0ICogMTAyNCAqIDEwKQorI2RlZmluZSBERUZBVUxUX1ZJREVPX0JVRkZFUl9TSVpFXzRLX1RWUAkoMTAyNCAqIDEwMjQgKiAxNSkKKyNkZWZpbmUgREVGQVVMVF9BVURJT19CVUZGRVJfU0laRQkJKDEwMjQqNzY4KjIpCisjZGVmaW5lIERFRkFVTFRfU1VCVElUTEVfQlVGRkVSX1NJWkUJCSgxMDI0KjI1NikKKworI2RlZmluZSBQVFNfT1VUU0lERQkoMSkKKyNkZWZpbmUgU1lOQ19PVVRTSURFCSgyKQorCisvLyNkZWZpbmUgREFUQV9ERUJVRworCitleHRlcm4gaW50IGR1bXBfb3V0cHV0X2ZyYW1lOworZXh0ZXJuIHUzMiBkdW1wX291dHB1dF9zdGFydF9wb3NpdGlvbjsKK2V4dGVybiB2b2lkIGFtbF9yZWN5Y2xlX2RtYV9idWZmZXJzKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4LCB1MzIgaGFuZGxlKTsKKworc3RhdGljIGludCBzbG93X2lucHV0ID0gMDsKKworc3RhdGljIHN0cnVjdCBzdHJlYW1fYnVmX3MgYnVmc1tCVUZfTUFYX05VTV0gPSB7CisJeworCQkucmVnX2Jhc2UgPSBWTERfTUVNX1ZJRklGT19SRUdfQkFTRSwKKwkJLnR5cGUgPSBCVUZfVFlQRV9WSURFTywKKwkJLmJ1Zl9zdGFydCA9IDAsCisJCS5idWZfc2l6ZSA9IERFRkFVTFRfVklERU9fQlVGRkVSX1NJWkUsCisJCS5kZWZhdWx0X2J1Zl9zaXplID0gREVGQVVMVF9WSURFT19CVUZGRVJfU0laRSwKKwkJLmZpcnN0X3RzdGFtcCA9IElOVkFMSURfUFRTCisJfSwKKwl7CisJCS5yZWdfYmFzZSA9IEFJVV9NRU1fQUlGSUZPX1JFR19CQVNFLAorCQkudHlwZSA9IEJVRl9UWVBFX0FVRElPLAorCQkuYnVmX3N0YXJ0ID0gMCwKKwkJLmJ1Zl9zaXplID0gREVGQVVMVF9BVURJT19CVUZGRVJfU0laRSwKKwkJLmRlZmF1bHRfYnVmX3NpemUgPSBERUZBVUxUX0FVRElPX0JVRkZFUl9TSVpFLAorCQkuZmlyc3RfdHN0YW1wID0gSU5WQUxJRF9QVFMKKwl9LAorCXsKKwkJLnJlZ19iYXNlID0gMCwKKwkJLnR5cGUgPSBCVUZfVFlQRV9TVUJUSVRMRSwKKwkJLmJ1Zl9zdGFydCA9IDAsCisJCS5idWZfc2l6ZSA9IERFRkFVTFRfU1VCVElUTEVfQlVGRkVSX1NJWkUsCisJCS5kZWZhdWx0X2J1Zl9zaXplID0gREVGQVVMVF9TVUJUSVRMRV9CVUZGRVJfU0laRSwKKwkJLmZpcnN0X3RzdGFtcCA9IElOVkFMSURfUFRTCisJfSwKKwl7CisJCS5yZWdfYmFzZSA9IDAsCisJCS50eXBlID0gQlVGX1RZUEVfVVNFUkRBVEEsCisJCS5idWZfc3RhcnQgPSAwLAorCQkuYnVmX3NpemUgPSAwLAorCQkuZmlyc3RfdHN0YW1wID0gSU5WQUxJRF9QVFMKKwl9LAorCXsKKwkJLnJlZ19iYXNlID0gSEVWQ19TVFJFQU1fUkVHX0JBU0UsCisJCS50eXBlID0gQlVGX1RZUEVfSEVWQywKKwkJLmJ1Zl9zdGFydCA9IDAsCisJCS5idWZfc2l6ZSA9IERFRkFVTFRfVklERU9fQlVGRkVSX1NJWkVfNEssCisJCS5kZWZhdWx0X2J1Zl9zaXplID0gREVGQVVMVF9WSURFT19CVUZGRVJfU0laRV80SywKKwkJLmZpcnN0X3RzdGFtcCA9IElOVkFMSURfUFRTCisJfSwKK307CisKK2V4dGVybiBpbnQgYW1sX3NldF92Zm1fcGF0aCwgYW1sX3NldF92ZGVjX3R5cGU7CitleHRlcm4gYm9vbCBhbWxfc2V0X3ZmbV9lbmFibGUsIGFtbF9zZXRfdmRlY190eXBlX2VuYWJsZTsKKworc3RhdGljIHZvaWQgc2V0X2RlZmF1bHRfcGFyYW1zKHN0cnVjdCBhbWxfdmRlY19hZGFwdCAqdmRlYykKK3sKKwl1bG9uZyBzeW5jX21vZGUgPSAoUFRTX09VVFNJREUgfCBTWU5DX09VVFNJREUpOworCisJdmRlYy0+ZGVjX3Byb3AucGFyYW0gPSAodm9pZCAqKXN5bmNfbW9kZTsKKwl2ZGVjLT5kZWNfcHJvcC5mb3JtYXQgPSB2ZGVjLT5mb3JtYXQ7CisJdmRlYy0+ZGVjX3Byb3Aud2lkdGggPSAxOTIwOworCXZkZWMtPmRlY19wcm9wLmhlaWdodCA9IDEwODg7CisJdmRlYy0+ZGVjX3Byb3AucmF0ZSA9IDMyMDA7Cit9CisKK3N0YXRpYyBpbnQgZW5hYmxlX2hhcmR3YXJlKHN0cnVjdCBzdHJlYW1fcG9ydF9zICpwb3J0KQoreworCWlmIChnZXRfY3B1X3R5cGUoKSA8IE1FU09OX0NQVV9NQUpPUl9JRF9NNikKKwkJcmV0dXJuIC0xOworCisJYW1wb3J0c19zd2l0Y2hfZ2F0ZSgiZGVtdXgiLCAxKTsKKwlpZiAoZ2V0X2NwdV90eXBlKCkgPj0gTUVTT05fQ1BVX01BSk9SX0lEX004KQorCQlhbXBvcnRzX3N3aXRjaF9nYXRlKCJwYXJzZXJfdG9wIiwgMSk7CisKKwlpZiAocG9ydC0+dHlwZSAmIFBPUlRfVFlQRV9WSURFTykgeworCQlhbXBvcnRzX3N3aXRjaF9nYXRlKCJ2ZGVjIiwgMSk7CisKKwkJaWYgKGhhc19oZXZjX3ZkZWMoKSkgeworCQkJaWYgKHBvcnQtPnR5cGUgJiBQT1JUX1RZUEVfSEVWQykKKwkJCQl2ZGVjX3Bvd2Vyb24oVkRFQ19IRVZDKTsKKwkJCWVsc2UKKwkJCQl2ZGVjX3Bvd2Vyb24oVkRFQ18xKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChnZXRfY3B1X3R5cGUoKSA+PSBNRVNPTl9DUFVfTUFKT1JfSURfTTgpCisJCQkJdmRlY19wb3dlcm9uKFZERUNfMSk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaXNhYmxlX2hhcmR3YXJlKHN0cnVjdCBzdHJlYW1fcG9ydF9zICpwb3J0KQoreworCWlmIChnZXRfY3B1X3R5cGUoKSA8IE1FU09OX0NQVV9NQUpPUl9JRF9NNikKKwkJcmV0dXJuIC0xOworCisJaWYgKHBvcnQtPnR5cGUgJiBQT1JUX1RZUEVfVklERU8pIHsKKwkJaWYgKGhhc19oZXZjX3ZkZWMoKSkgeworCQkJaWYgKHBvcnQtPnR5cGUgJiBQT1JUX1RZUEVfSEVWQykKKwkJCQl2ZGVjX3Bvd2Vyb2ZmKFZERUNfSEVWQyk7CisJCQllbHNlCisJCQkJdmRlY19wb3dlcm9mZihWREVDXzEpOworCQl9CisKKwkJYW1wb3J0c19zd2l0Y2hfZ2F0ZSgidmRlYyIsIDApOworCX0KKworCWlmIChnZXRfY3B1X3R5cGUoKSA+PSBNRVNPTl9DUFVfTUFKT1JfSURfTTgpCisJCWFtcG9ydHNfc3dpdGNoX2dhdGUoInBhcnNlcl90b3AiLCAwKTsKKworCWFtcG9ydHNfc3dpdGNoX2dhdGUoImRlbXV4IiwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdXNlcl9idWZmZXJfaW5pdCh2b2lkKQoreworCXN0cnVjdCBzdHJlYW1fYnVmX3MgKnB1YnVmID0gJmJ1ZnNbQlVGX1RZUEVfVVNFUkRBVEFdOworCisJcHVidWYtPmJ1Zl9zaXplID0gMDsKKwlwdWJ1Zi0+YnVmX3N0YXJ0ID0gMDsKKwlwdWJ1Zi0+YnVmX3dwID0gMDsKKwlwdWJ1Zi0+YnVmX3JwID0gMDsKK30KKworc3RhdGljIHZvaWQgdmlkZW9fY29tcG9uZW50X3JlbGVhc2Uoc3RydWN0IHN0cmVhbV9wb3J0X3MgKnBvcnQpCit7CisJc3RydWN0IGFtbF92ZGVjX2FkYXB0ICphZGFfY3R4CisJCT0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBhbWxfdmRlY19hZGFwdCwgcG9ydCk7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGFkYV9jdHgtPnZkZWM7CisKKwl2ZGVjX3JlbGVhc2UodmRlYyk7CisKK30KKworc3RhdGljIGludCB2aWRlb19jb21wb25lbnRfaW5pdChzdHJ1Y3Qgc3RyZWFtX3BvcnRfcyAqcG9ydCwKKwkJCSAgc3RydWN0IHN0cmVhbV9idWZfcyAqcGJ1ZikKK3sKKwlpbnQgcmV0ID0gLTE7CisJc3RydWN0IGFtbF92ZGVjX2FkYXB0ICphZGFfY3R4CisJCT0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBhbWxfdmRlY19hZGFwdCwgcG9ydCk7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGFkYV9jdHgtPnZkZWM7CisKKwlpZiAoKHZkZWMtPnBvcnRfZmxhZyAmIFBPUlRfRkxBR19WRk9STUFUKSA9PSAwKSB7CisJCXY0bF9kYmcoYWRhX2N0eC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJ2Zm9ybWF0IG5vdCBzZXRcbiIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCWlmICgodmRlYy0+c3lzX2luZm8tPmhlaWdodCAqIHZkZWMtPnN5c19pbmZvLT53aWR0aCkgPiAxOTIwICogMTA4OAorCQl8fCBwb3J0LT52Zm9ybWF0ID09IFZGT1JNQVRfSDI2NF80SzJLKSB7CisJCXBvcnQtPmlzXzRrID0gdHJ1ZTsKKwkJaWYgKGdldF9jcHVfdHlwZSgpID49IE1FU09OX0NQVV9NQUpPUl9JRF9UWExYCisJCQkJJiYgKHBvcnQtPnZmb3JtYXQgPT0gVkZPUk1BVF9IMjY0KSkKKwkJCXZkZWNfcG93ZXJvbihWREVDX0hFVkMpOworCX0gZWxzZQorCQlwb3J0LT5pc180ayA9IGZhbHNlOworCisJaWYgKHBvcnQtPnR5cGUgJiBQT1JUX1RZUEVfRlJBTUUgfHwKKwkJKHBvcnQtPnR5cGUgJiBQT1JUX1RZUEVfRVMpKSB7CisJCXJldCA9IHZkZWNfaW5pdCh2ZGVjLCBwb3J0LT5pc180aywgdHJ1ZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQl2NGxfZGJnKGFkYV9jdHgtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAiZmFpbGVkXG4iKTsKKwkJCXZpZGVvX2NvbXBvbmVudF9yZWxlYXNlKHBvcnQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZkZWNfcG9ydHNfcmVsZWFzZShzdHJ1Y3Qgc3RyZWFtX3BvcnRfcyAqcG9ydCkKK3sKKwlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpwdmJ1ZiA9ICZidWZzW0JVRl9UWVBFX1ZJREVPXTsKKworCWlmIChoYXNfaGV2Y192ZGVjKCkpIHsKKwkJaWYgKHBvcnQtPnZmb3JtYXQgPT0gVkZPUk1BVF9IRVZDIHx8CisJCQlwb3J0LT52Zm9ybWF0ID09IFZGT1JNQVRfVlA5KQorCQkJcHZidWYgPSAmYnVmc1tCVUZfVFlQRV9IRVZDXTsKKwl9CisKKwlpZiAocG9ydC0+dHlwZSAmIFBPUlRfVFlQRV9NUFRTKSB7CisJCXRzeW5jX3Bjcl9zdG9wKCk7CisJCXRzZGVtdXhfcmVsZWFzZSgpOworCX0KKworCWlmIChwb3J0LT50eXBlICYgUE9SVF9UWVBFX01QUFMpCisJCXBzcGFyc2VyX3JlbGVhc2UoKTsKKworCWlmIChwb3J0LT50eXBlICYgUE9SVF9UWVBFX1ZJREVPKQorCQl2aWRlb19jb21wb25lbnRfcmVsZWFzZShwb3J0KTsKKworCXBvcnQtPnBjcl9pbml0ZWQgPSAwOworCXBvcnQtPmZsYWcgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF92ZGVjX3Byb3Blcml0eShzdHJ1Y3QgdmRlY19zICp2ZGVjLAorCXN0cnVjdCBhbWxfdmRlY19hZGFwdCAqYWRhX2N0eCkKK3sKKwl2ZGVjLT5zeXNfaW5mbwk9ICZhZGFfY3R4LT5kZWNfcHJvcDsKKwl2ZGVjLT5wb3J0CT0gJmFkYV9jdHgtPnBvcnQ7CisJdmRlYy0+Zm9ybWF0CT0gYWRhX2N0eC0+dmlkZW9fdHlwZTsKKwl2ZGVjLT5zeXNfaW5mb19zdG9yZSA9IGFkYV9jdHgtPmRlY19wcm9wOworCisJLyogYmluZGluZyB2NGwyIGN0eCB0byB2ZGVjLiAqLworCXZkZWMtPnByaXZhdGUgPSBhZGFfY3R4LT5jdHg7CisKKwkvKiBzZXQgdmlkZW8gZm9ybWF0LCBzeXMgaW5mbyBhbmQgdmZtIG1hcC4qLworCXZkZWMtPnBvcnQtPnZmb3JtYXQgPSB2ZGVjLT5mb3JtYXQ7CisJdmRlYy0+cG9ydC0+dHlwZSB8PSBQT1JUX1RZUEVfVklERU87CisJdmRlYy0+cG9ydF9mbGFnIHw9ICh2ZGVjLT5wb3J0LT5mbGFnIHwgUE9SVF9GTEFHX1ZGT1JNQVQpOworCWlmICh2ZGVjLT5zbGF2ZSkgeworCQl2ZGVjLT5zbGF2ZS0+Zm9ybWF0ID0gYWRhX2N0eC0+ZGVjX3Byb3AuZm9ybWF0OworCQl2ZGVjLT5zbGF2ZS0+cG9ydF9mbGFnIHw9IFBPUlRfRkxBR19WRk9STUFUOworCX0KKworCXZkZWMtPnR5cGUgPSBWREVDX1RZUEVfRlJBTUVfQkxPQ0s7CisJdmRlYy0+cG9ydC0+dHlwZSB8PSBQT1JUX1RZUEVfRlJBTUU7CisJdmRlYy0+ZnJhbWVfYmFzZV92aWRlb19wYXRoID0gRlJBTUVfQkFTRV9QQVRIX1Y0TF9PU0Q7CisKKwlpZiAoYW1sX3NldF92ZGVjX3R5cGVfZW5hYmxlKSB7CisJCWlmIChhbWxfc2V0X3ZkZWNfdHlwZSA9PSBWREVDX1RZUEVfU1RSRUFNX1BBUlNFUikgeworCQkJdmRlYy0+dHlwZSA9IFZERUNfVFlQRV9TVFJFQU1fUEFSU0VSOworCQkJdmRlYy0+cG9ydC0+dHlwZSAmPSB+UE9SVF9UWVBFX0ZSQU1FOworCQkJdmRlYy0+cG9ydC0+dHlwZSB8PSBQT1JUX1RZUEVfRVM7CisJCX0gZWxzZSBpZiAoYW1sX3NldF92ZGVjX3R5cGUgPT0gVkRFQ19UWVBFX0ZSQU1FX0JMT0NLKSB7CisJCQl2ZGVjLT50eXBlID0gVkRFQ19UWVBFX0ZSQU1FX0JMT0NLOworCQkJdmRlYy0+cG9ydC0+dHlwZSAmPSB+UE9SVF9UWVBFX0VTOworCQkJdmRlYy0+cG9ydC0+dHlwZSB8PSBQT1JUX1RZUEVfRlJBTUU7CisJCX0KKwl9CisKKwlpZiAoYW1sX3NldF92Zm1fZW5hYmxlKQorCQl2ZGVjLT5mcmFtZV9iYXNlX3ZpZGVvX3BhdGggPSBhbWxfc2V0X3ZmbV9wYXRoOworCisJdmRlYy0+cG9ydC0+ZmxhZyA9IHZkZWMtPnBvcnRfZmxhZzsKKworCXZkZWMtPmNvbmZpZ19sZW4gPSBhZGFfY3R4LT5jb25maWcubGVuZ3RoID4KKwkJUEFHRV9TSVpFID8gUEFHRV9TSVpFIDogYWRhX2N0eC0+Y29uZmlnLmxlbmd0aDsKKwltZW1jcHkodmRlYy0+Y29uZmlnLCBhZGFfY3R4LT5jb25maWcuYnVmLCB2ZGVjLT5jb25maWdfbGVuKTsKKworCWFkYV9jdHgtPnZkZWMgPSB2ZGVjOworfQorCitzdGF0aWMgaW50IHZkZWNfcG9ydHNfaW5pdChzdHJ1Y3QgYW1sX3ZkZWNfYWRhcHQgKmFkYV9jdHgpCit7CisJaW50IHJldCA9IC0xOworCXN0cnVjdCBzdHJlYW1fYnVmX3MgKnB2YnVmID0gJmJ1ZnNbQlVGX1RZUEVfVklERU9dOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBOVUxMOworCisJLyogY3JlYXRlIHRoZSB2ZGVjIGluc3RhbmNlLiovCisJdmRlYyA9IHZkZWNfY3JlYXRlKCZhZGFfY3R4LT5wb3J0LCBOVUxMKTsKKwlpZiAoSVNfRVJSX09SX05VTEwodmRlYykpCisJCXJldHVybiAtMTsKKworCXZkZWMtPmRpc2FibGVfdmZtID0gdHJ1ZTsKKwlzZXRfdmRlY19wcm9wZXJpdHkodmRlYywgYWRhX2N0eCk7CisKKwkvKiBpbml0IGh3IGFuZCBnYXRlKi8KKwlyZXQgPSBlbmFibGVfaGFyZHdhcmUodmRlYy0+cG9ydCk7CisJaWYgKHJldCA8IDApIHsKKwkJdjRsX2RiZyhhZGFfY3R4LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgImVuYWJsZSBodyBmYWlsLlxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJc3RidWZfZmV0Y2hfaW5pdCgpOworCXVzZXJfYnVmZmVyX2luaXQoKTsKKworCWlmICgodmRlYy0+cG9ydC0+dHlwZSAmIFBPUlRfVFlQRV9WSURFTykKKwkJJiYgKHZkZWMtPnBvcnRfZmxhZyAmIFBPUlRfRkxBR19WRk9STUFUKSkgeworCQl2ZGVjLT5wb3J0LT5pc180ayA9IGZhbHNlOworCQlpZiAoaGFzX2hldmNfdmRlYygpKSB7CisJCQlpZiAodmRlYy0+cG9ydC0+dmZvcm1hdCA9PSBWRk9STUFUX0hFVkMgfHwKKwkJCQl2ZGVjLT5wb3J0LT52Zm9ybWF0ID09IFZGT1JNQVRfVlA5KQorCQkJCXB2YnVmID0gJmJ1ZnNbQlVGX1RZUEVfSEVWQ107CisJCX0KKworCQlyZXQgPSB2aWRlb19jb21wb25lbnRfaW5pdCh2ZGVjLT5wb3J0LCBwdmJ1Zik7CisJCWlmIChyZXQgPCAwKSB7CisJCQl2NGxfZGJnKGFkYV9jdHgtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAidmlkZW9fY29tcG9uZW50X2luaXQgIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJLyogY29ubmVjdCB2ZGVjIGF0IHRoZSBlbmQgYWZ0ZXIgYWxsIEhXIGluaXRpYWxpemF0aW9uICovCisJCXZkZWNfY29ubmVjdCh2ZGVjKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHZpZGVvX2RlY29kZXJfaW5pdChzdHJ1Y3QgYW1sX3ZkZWNfYWRhcHQgKnZkZWMpCit7CisJaW50IHJldCA9IC0xOworCisJLyogc2V0cyBjb25maWd1cmUgZGF0YSAqLworCXNldF9kZWZhdWx0X3BhcmFtcyh2ZGVjKTsKKworCS8qIGluaXQgdGhlIGJ1ZmZlciB3b3JrIHNwYWNlIGFuZCBjb25uZWN0IHZkZWMuKi8KKwlyZXQgPSB2ZGVjX3BvcnRzX2luaXQodmRlYyk7CisJaWYgKHJldCA8IDApIHsKKwkJdjRsX2RiZyh2ZGVjLT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgInZkZWMgcG9ydHMgaW5pdCBmYWlsLlxuIik7CisJCWdvdG8gb3V0OworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgdmlkZW9fZGVjb2Rlcl9yZWxlYXNlKHN0cnVjdCBhbWxfdmRlY19hZGFwdCAqdmRlYykKK3sKKwlpbnQgcmV0ID0gLTE7CisJc3RydWN0IHN0cmVhbV9wb3J0X3MgKnBvcnQgPSAmdmRlYy0+cG9ydDsKKworCXJldCA9IHZkZWNfcG9ydHNfcmVsZWFzZShwb3J0KTsKKwlpZiAocmV0IDwgMCkgeworCQl2NGxfZGJnKHZkZWMtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAidmRlYyBwb3J0cyByZWxlYXNlIGZhaWwuXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogZGlzYWJsZSBnYXRlcyAqLworCXJldCA9IGRpc2FibGVfaGFyZHdhcmUocG9ydCk7CisJaWYgKHJldCA8IDApIHsKKwkJdjRsX2RiZyh2ZGVjLT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgImRpc2FibGUgaHcgZmFpbC5cbiIpOworCQlnb3RvIG91dDsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBkdW1wKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBzaXplKQoreworCXN0cnVjdCBmaWxlICpmcDsKKworCWZwID0gZmlscF9vcGVuKHBhdGgsCisJCQlPX0NSRUFUIHwgT19SRFdSIHwgT19MQVJHRUZJTEUgfCBPX0FQUEVORCwgMDYwMCk7CisJaWYgKCFJU19FUlIoZnApKSB7CisJCWtlcm5lbF93cml0ZShmcCwgZGF0YSwgc2l6ZSwgMCk7CisJCWZpbHBfY2xvc2UoZnAsIE5VTEwpOworCX0gZWxzZSB7CisJCXByX2luZm8oIkR1bXAgRVMgZmFpbCwgc2hvdWxkIGNoZWNrIFJXIHBlcm1pc3Npb24sIHNpemU6JXhcbiIsIHNpemUpOworCX0KK30KKworaW50IHZkZWNfdmJ1Zl93cml0ZShzdHJ1Y3QgYW1sX3ZkZWNfYWRhcHQgKmFkYV9jdHgsCisJY29uc3QgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJaW50IHJldCA9IC0xOworCWludCB0cnlfY250ID0gMTAwOworCXN0cnVjdCBzdHJlYW1fcG9ydF9zICpwb3J0ID0gJmFkYV9jdHgtPnBvcnQ7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGFkYV9jdHgtPnZkZWM7CisJc3RydWN0IHN0cmVhbV9idWZfcyAqcGJ1ZiA9IE5VTEw7CisKKwlpZiAoaGFzX2hldmNfdmRlYygpKSB7CisJCXBidWYgPSAocG9ydC0+dHlwZSAmIFBPUlRfVFlQRV9IRVZDKSA/ICZidWZzW0JVRl9UWVBFX0hFVkNdIDoKKwkJCSZidWZzW0JVRl9UWVBFX1ZJREVPXTsKKwl9IGVsc2UKKwkJcGJ1ZiA9ICZidWZzW0JVRl9UWVBFX1ZJREVPXTsKKworCS8qaWYgKCEocG9ydF9nZXRfaW5pdGVkKHByaXYpKSkgeworCQlyID0gdmlkZW9fZGVjb2Rlcl9pbml0KHByaXYpOworCQlpZiAociA8IDApCisJCQlyZXR1cm4gcjsKKwl9Ki8KKworCWRvIHsKKwkJaWYgKHZkZWMtPnBvcnRfZmxhZyAmIFBPUlRfRkxBR19EUk0pCisJCQlyZXQgPSBkcm1fd3JpdGUoYWRhX2N0eC0+ZmlscCwgcGJ1ZiwgYnVmLCBjb3VudCk7CisJCWVsc2UKKwkJCXJldCA9IGVzcGFyc2VyX3dyaXRlKGFkYV9jdHgtPmZpbHAsIHBidWYsIGJ1ZiwgY291bnQpOworCisJCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJCW1zbGVlcCgzMCk7CisJfSB3aGlsZSAocmV0ID09IC1FQUdBSU4gJiYgdHJ5X2NudC0tKTsKKworCWlmIChzbG93X2lucHV0KSB7CisJCXY0bF9kYmcoYWRhX2N0eC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfUFJJTkZPLAorCQkJInNsb3dfaW5wdXQ6IGVzIGNvZGVjIHdyaXRlIHNpemUgJXhcbiIsIHJldCk7CisJCW1zbGVlcCgxMCk7CisJfQorCisjaWZkZWYgREFUQV9ERUJVRworCS8qIGR1bXAgdG8gZmlsZSAqLworCS8vZHVtcF93cml0ZSh2YnVmLCBzaXplKTsKKwkvL3Y0bF9kYmcoYWRhX2N0eC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfUFJJTkZPLCAidmJ1ZjogJXAsIHNpemU6ICV1LCByZXQ6ICVkXG4iLCB2YnVmLCBzaXplLCByZXQpOworI2VuZGlmCisKKwlyZXR1cm4gcmV0OworfQorCitib29sIHZkZWNfaW5wdXRfZnVsbChzdHJ1Y3QgYW1sX3ZkZWNfYWRhcHQgKmFkYV9jdHgpCit7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGFkYV9jdHgtPnZkZWM7CisKKwlyZXR1cm4gKHZkZWMtPmlucHV0LmhhdmVfZnJhbWVfbnVtID4gNjApID8gdHJ1ZSA6IGZhbHNlOworfQorCitpbnQgdmRlY192ZnJhbWVfd3JpdGUoc3RydWN0IGFtbF92ZGVjX2FkYXB0ICphZGFfY3R4LAorCWNvbnN0IGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGNvdW50LCB1NjQgdGltZXN0YW1wLCB1bG9uZyBtZXRhX3B0cikKK3sKKwlpbnQgcmV0ID0gLTE7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGFkYV9jdHgtPnZkZWM7CisKKwkvKiBzZXQgdGltZXN0YW1wICovCisJdmRlY19zZXRfdGltZXN0YW1wKHZkZWMsIHRpbWVzdGFtcCk7CisKKwkvKiBzZXQgbWV0YWRhdGEgKi8KKwl2ZGVjX3NldF9tZXRhZGF0YSh2ZGVjLCBtZXRhX3B0cik7CisKKwlyZXQgPSB2ZGVjX3dyaXRlX3ZmcmFtZSh2ZGVjLCBidWYsIGNvdW50KTsKKworCWlmIChzbG93X2lucHV0KSB7CisJCXY0bF9kYmcoYWRhX2N0eC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfUFJJTkZPLAorCQkJInNsb3dfaW5wdXQ6IGZyYW1lIGNvZGVjIHdyaXRlIHNpemUgJWRcbiIsIHJldCk7CisJCW1zbGVlcCgzMCk7CisJfQorCisJaWYgKGR1bXBfb3V0cHV0X2ZyYW1lID4gMCAmJgorCQkoIWR1bXBfb3V0cHV0X3N0YXJ0X3Bvc2l0aW9uIHx8CisJCShkdW1wX291dHB1dF9zdGFydF9wb3NpdGlvbiA9PSBjcmMzMl9sZSgwLCBidWYsIGNvdW50KSkpKSB7CisJCWR1bXAoIi9kYXRhL2VzLmRhdGEiLCBidWYsIGNvdW50KTsKKwkJZHVtcF9vdXRwdXRfZnJhbWUtLTsKKwkJZHVtcF9vdXRwdXRfc3RhcnRfcG9zaXRpb24gPSAwOworCX0KKworCXY0bF9kYmcoYWRhX2N0eC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfSU5QVVQsCisJCSJ3cml0ZSBmcmFtZXMsIHZidWY6ICVwLCBzaXplOiAldSwgcmV0OiAlZCwgY3JjOiAleCwgdHM6ICVsbHVcbiIsCisJCWJ1ZiwgY291bnQsIHJldCwgY3JjMzJfbGUoMCwgYnVmLCBjb3VudCksIHRpbWVzdGFtcCk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIHZkZWNfdmZyYW1lX2lucHV0X2ZyZWUodm9pZCAqcHJpdiwgdTMyIGhhbmRsZSkKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IHByaXY7CisKKwlhbWxfcmVjeWNsZV9kbWFfYnVmZmVycyhjdHgsIGhhbmRsZSk7Cit9CisKK2ludCB2ZGVjX3ZmcmFtZV93cml0ZV93aXRoX2RtYShzdHJ1Y3QgYW1sX3ZkZWNfYWRhcHQgKmFkYV9jdHgsCisJdWxvbmcgYWRkciwgdTMyIGNvdW50LCB1NjQgdGltZXN0YW1wLCB1MzIgaGFuZGxlLAorCWNodW5rX2ZyZWUgZnJlZSwgdm9pZCogcHJpdikKK3sKKwlpbnQgcmV0ID0gLTE7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGFkYV9jdHgtPnZkZWM7CisKKwkvKiBzZXQgdGltZXN0YW1wICovCisJdmRlY19zZXRfdGltZXN0YW1wKHZkZWMsIHRpbWVzdGFtcCk7CisKKwlyZXQgPSB2ZGVjX3dyaXRlX3ZmcmFtZV93aXRoX2RtYSh2ZGVjLCBhZGRyLCBjb3VudCwKKwkJaGFuZGxlLCBmcmVlLCBwcml2KTsKKworCWlmIChzbG93X2lucHV0KSB7CisJCXY0bF9kYmcoYWRhX2N0eC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfUFJJTkZPLAorCQkJInNsb3dfaW5wdXQ6IGZyYW1lIGNvZGVjIHdyaXRlIHNpemUgJWRcbiIsIHJldCk7CisJCW1zbGVlcCgzMCk7CisJfQorCisJdjRsX2RiZyhhZGFfY3R4LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19JTlBVVCwKKwkJIndyaXRlIGZyYW1lcywgdmJ1ZjogJWx4LCBzaXplOiAldSwgcmV0OiAlZCwgdHM6ICVsbHVcbiIsCisJCWFkZHIsIGNvdW50LCByZXQsIHRpbWVzdGFtcCk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGFtbF9kZWNvZGVyX2ZsdXNoKHN0cnVjdCBhbWxfdmRlY19hZGFwdCAqYWRhX2N0eCkKK3sKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gYWRhX2N0eC0+dmRlYzsKKworCWlmICh2ZGVjKQorCQl2ZGVjX3NldF9lb3ModmRlYywgdHJ1ZSk7Cit9CisKK2ludCBhbWxfY29kZWNfcmVzZXQoc3RydWN0IGFtbF92ZGVjX2FkYXB0ICphZGFfY3R4LCBpbnQgKm1vZGUpCit7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGFkYV9jdHgtPnZkZWM7CisJaW50IHJldCA9IDA7CisKKwlpZiAodmRlYykgeworCQlpZiAoYWRhX2N0eC0+Y3R4LT52NGxfcmVzb2x1dGlvbl9jaGFuZ2UpCisJCQkqbW9kZSA9IFY0TF9SRVNFVF9NT0RFX0xJR0hUOworCQllbHNlCisJCQl2ZGVjX3NldF9lb3ModmRlYywgZmFsc2UpOworCisJCXY0bF9kYmcoYWRhX2N0eC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfUFJJTkZPLAorCQkJInJlc2V0IG1vZGU6ICVkLCBlcyBmcmFtZXMgYnVmZmVyaW5nOiAlZFxuIiwKKwkJCSptb2RlLCB2ZGVjX2ZyYW1lX251bWJlcihhZGFfY3R4KSk7CisKKwkJcmV0ID0gdmRlY192NGwyX3Jlc2V0KHZkZWMsICptb2RlKTsKKwkJKm1vZGUgPSBWNExfUkVTRVRfTU9ERV9OT1JNQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworYm9vbCBpc19pbnB1dF9yZWFkeShzdHJ1Y3QgYW1sX3ZkZWNfYWRhcHQgKmFkYV9jdHgpCit7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGFkYV9jdHgtPnZkZWM7CisJaW50IHN0YXRlID0gVkRFQ19TVEFUVVNfVU5JTklUSUFMSVpFRDsKKworCWlmICh2ZGVjKSB7CisJCXN0YXRlID0gdmRlY19nZXRfc3RhdHVzKHZkZWMpOworCisJCWlmIChzdGF0ZSA9PSBWREVDX1NUQVRVU19DT05ORUNURUQKKwkJCXx8IHN0YXRlID09IFZERUNfU1RBVFVTX0FDVElWRSkKKwkJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworaW50IHZkZWNfZnJhbWVfbnVtYmVyKHN0cnVjdCBhbWxfdmRlY19hZGFwdCAqYWRhX2N0eCkKK3sKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gYWRhX2N0eC0+dmRlYzsKKworCWlmICh2ZGVjKQorCQlyZXR1cm4gdmRlY19nZXRfZnJhbWVfbnVtKHZkZWMpOworCWVsc2UKKwkJcmV0dXJuIC0xOworfQorCitpbnQgdmRlY19nZXRfaW5zdGFuY2VfbnVtKHZvaWQpCit7CisJcmV0dXJuIHZkZWNfZ2V0X2NvcmVfbnIoKTsKK30KKwordm9pZCB2NGwyX2NvbmZpZ192ZGVjX3Bhcm0oc3RydWN0IGFtbF92ZGVjX2FkYXB0ICphZGFfY3R4LCB1OCAqZGF0YSwgdTMyIGxlbikKK3sKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gYWRhX2N0eC0+dmRlYzsKKworCXZkZWMtPmNvbmZpZ19sZW4gPSBsZW4gPiBQQUdFX1NJWkUgPyBQQUdFX1NJWkUgOiBsZW47CisJbWVtY3B5KHZkZWMtPmNvbmZpZywgZGF0YSwgdmRlYy0+Y29uZmlnX2xlbik7Cit9CisKK3ZvaWQgdmRlY19zZXRfZHVyYXRpb24oczMyIGR1cmF0aW9uKQoreworCXZkZWNfZnJhbWVfcmF0ZV91ZXZlbnQoZHVyYXRpb24pOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbXZkZWNfcG9ydHMvYW1sX3Zjb2RlY19hZGFwdC5oIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvYW1sX3Zjb2RlY19hZGFwdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NjQxY2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FtdmRlY19wb3J0cy9hbWxfdmNvZGVjX2FkYXB0LmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE3IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyogbW9yZSBkZXRhaWxzLgorKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKgorKiBEZXNjcmlwdGlvbjoKKyovCisjaWZuZGVmIFZERUNfQURBUFRfSAorI2RlZmluZSBWREVDX0FEQVBUX0gKKworI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmZvcm1hdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvYW1zdHJlYW0uaD4KKyNpbmNsdWRlICIuLi9zdHJlYW1faW5wdXQvYW1wb3J0cy9zdHJlYW1idWYuaCIKKyNpbmNsdWRlICIuLi9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWNfaW5wdXQuaCIKKyNpbmNsdWRlICJhbWxfdmNvZGVjX2Rydi5oIgorCitzdHJ1Y3QgYW1sX3ZkZWNfYWRhcHQgeworCWludCBmb3JtYXQ7CisJdm9pZCAqdnNpOworCWludDMyX3QgZmFpbHVyZTsKKwl1aW50MzJfdCBpbnN0X2FkZHI7CisJdW5zaWduZWQgaW50IHNpZ25hbGVkOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4OworCXdhaXRfcXVldWVfaGVhZF90IHdxOworCXN0cnVjdCBmaWxlICpmaWxwOworCXN0cnVjdCB2ZGVjX3MgKnZkZWM7CisJc3RydWN0IHN0cmVhbV9wb3J0X3MgcG9ydDsKKwlzdHJ1Y3QgZGVjX3N5c2luZm8gZGVjX3Byb3A7CisJc3RydWN0IHY0bDJfY29uZmlnX3Bhcm0gY29uZmlnOworCWludCB2aWRlb190eXBlOworCWNoYXIgKmZybV9uYW1lOworfTsKKworaW50IHZpZGVvX2RlY29kZXJfaW5pdChzdHJ1Y3QgYW1sX3ZkZWNfYWRhcHQgKmFkYV9jdHgpOworCitpbnQgdmlkZW9fZGVjb2Rlcl9yZWxlYXNlKHN0cnVjdCBhbWxfdmRlY19hZGFwdCAqYWRhX2N0eCk7CisKK2ludCB2ZGVjX3ZidWZfd3JpdGUoc3RydWN0IGFtbF92ZGVjX2FkYXB0ICphZGFfY3R4LAorCWNvbnN0IGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGNvdW50KTsKKworaW50IHZkZWNfdmZyYW1lX3dyaXRlKHN0cnVjdCBhbWxfdmRlY19hZGFwdCAqYWRhX2N0eCwKKwljb25zdCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBjb3VudCwgdTY0IHRpbWVzdGFtcCwgdWxvbmcgbWV0YV9wdHIpOworCit2b2lkIHZkZWNfdmZyYW1lX2lucHV0X2ZyZWUodm9pZCAqcHJpdiwgdTMyIGhhbmRsZSk7CisKK2ludCB2ZGVjX3ZmcmFtZV93cml0ZV93aXRoX2RtYShzdHJ1Y3QgYW1sX3ZkZWNfYWRhcHQgKmFkYV9jdHgsCisJdWxvbmcgYWRkciwgdTMyIGNvdW50LCB1NjQgdGltZXN0YW1wLCB1MzIgaGFuZGxlLAorCWNodW5rX2ZyZWUgZnJlZSwgdm9pZCAqcHJpdik7CisKK2Jvb2wgdmRlY19pbnB1dF9mdWxsKHN0cnVjdCBhbWxfdmRlY19hZGFwdCAqYWRhX2N0eCk7CisKK3ZvaWQgYW1sX2RlY29kZXJfZmx1c2goc3RydWN0IGFtbF92ZGVjX2FkYXB0ICphZGFfY3R4KTsKKworaW50IGFtbF9jb2RlY19yZXNldChzdHJ1Y3QgYW1sX3ZkZWNfYWRhcHQgKmFkYV9jdHgsIGludCAqZmxhZyk7CisKK2V4dGVybiB2b2lkIGR1bXBfd3JpdGUoY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKKworYm9vbCBpc19pbnB1dF9yZWFkeShzdHJ1Y3QgYW1sX3ZkZWNfYWRhcHQgKmFkYV9jdHgpOworCitpbnQgdmRlY19mcmFtZV9udW1iZXIoc3RydWN0IGFtbF92ZGVjX2FkYXB0ICphZGFfY3R4KTsKKworaW50IHZkZWNfZ2V0X2luc3RhbmNlX251bSh2b2lkKTsKKwordm9pZCB2ZGVjX3NldF9kdXJhdGlvbihzMzIgZHVyYXRpb24pOworCisjZW5kaWYgLyogVkRFQ19BREFQVF9IICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2FtbF92Y29kZWNfZGVjLmMgYi9kcml2ZXJzL2FtdmRlY19wb3J0cy9hbWxfdmNvZGVjX2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYmZiNmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FtdmRlY19wb3J0cy9hbWxfdmNvZGVjX2RlYy5jCkBAIC0wLDAgKzEsNDU5MyBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE3IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyogbW9yZSBkZXRhaWxzLgorKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKgorKiBEZXNjcmlwdGlvbjoKKyovCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1ldmVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItbWVtMm1lbS5oPgorI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1kbWEtY29udGlnLmg+CisjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLWRtYS1zZy5oPgorCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lc29uX3V2bV9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC9jbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L3NjaGVkL3R5cGVzLmg+CisKKyNpbmNsdWRlICJhbWxfdmNvZGVjX2Rydi5oIgorI2luY2x1ZGUgImFtbF92Y29kZWNfZGVjLmgiCisjaW5jbHVkZSAiYW1sX3Zjb2RlY191dGlsLmgiCisjaW5jbHVkZSAidmRlY19kcnZfaWYuaCIKKyNpbmNsdWRlICJhbWxfdmNvZGVjX2FkYXB0LmgiCisjaW5jbHVkZSAiYW1sX3Zjb2RlY192cHAuaCIKKyNpbmNsdWRlICJhbWxfdmNvZGVjX2dlMmQuaCIKKworI2luY2x1ZGUgIi4uL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvZGVjb2Rlcl9ibW11X2JveC5oIgorI2luY2x1ZGUgIi4uL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvZGVjb2Rlcl9tbXVfYm94LmgiCisjaW5jbHVkZSAiLi4vY29tbW9uL2NoaXBzL2RlY29kZXJfY3B1X3Zlcl9pbmZvLmgiCisjaW5jbHVkZSAidXRpbHMvY29tbW9uLmgiCisjaW5jbHVkZSAiLi4vZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjX3N5bmMuaCIKKworCisjZGVmaW5lIEtFUk5FTF9BVFJBQ0VfVEFHIEtFUk5FTF9BVFJBQ0VfVEFHX1Y0TDIKKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvbWVzb25fYXRyYWNlLmg+CisKKworI2RlZmluZSBPVVRfRk1UX0lEWAkJKDApIC8vZGVmYXVsdCBoMjY0CisjZGVmaW5lIENBUF9GTVRfSURYCQkoOSkgLy9jYXB0dXJlIG52MjEKKyNkZWZpbmUgQ0FQX0ZNVF9JNDIwX0lEWAkoMTIpIC8vdXNlIGZvciBtanBlZworCisjZGVmaW5lIEFNTF9WREVDX01JTl9XCTY0VQorI2RlZmluZSBBTUxfVkRFQ19NSU5fSAk2NFUKKyNkZWZpbmUgREZUX0NGR19XSURUSAlBTUxfVkRFQ19NSU5fVworI2RlZmluZSBERlRfQ0ZHX0hFSUdIVAlBTUxfVkRFQ19NSU5fSAorCisjZGVmaW5lIFY0TDJfQ0lEX1VTRVJfQU1MT0dJQ19CQVNFIChWNEwyX0NJRF9VU0VSX0JBU0UgKyAweDExMDApCisjZGVmaW5lIEFNTF9WNEwyX1NFVF9EUk1NT0RFIChWNEwyX0NJRF9VU0VSX0FNTE9HSUNfQkFTRSArIDApCisjZGVmaW5lIEFNTF9WNEwyX0dFVF9JTlBVVF9CVUZGRVJfTlVNIChWNEwyX0NJRF9VU0VSX0FNTE9HSUNfQkFTRSArIDEpCisjZGVmaW5lIEFNTF9WNEwyX1NFVF9EVVJBVElPTiAoVjRMMl9DSURfVVNFUl9BTUxPR0lDX0JBU0UgKyAyKQorI2RlZmluZSBBTUxfVjRMMl9HRVRfRklMTUdSQUlOX0lORk8gKFY0TDJfQ0lEX1VTRVJfQU1MT0dJQ19CQVNFICsgMykKKworI2RlZmluZSBXT1JLX0lURU1TX01BWCAoMzIpCisjZGVmaW5lIE1BWF9ESV9JTlNUQU5DRSAoMikKKworLy8jZGVmaW5lIFVTRUNfUEVSX1NFQyAxMDAwMDAwCisKKyNkZWZpbmUgY2FsbF92b2lkX21lbW9wKHZiLCBvcCwgYXJncy4uLikJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKCh2YiktPnZiMl9xdWV1ZS0+bWVtX29wcy0+b3ApCQkJXAorCQkJKHZiKS0+dmIyX3F1ZXVlLT5tZW1fb3BzLT5vcChhcmdzKTsJCVwKKwl9IHdoaWxlICgwKQorCitzdGF0aWMgc3RydWN0IGFtbF92aWRlb19mbXQgYW1sX3ZpZGVvX2Zvcm1hdHNbXSA9IHsKKwl7CisJCS5uYW1lID0gIkguMjY0IiwKKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9IMjY0LAorCQkudHlwZSA9IEFNTF9GTVRfREVDLAorCQkubnVtX3BsYW5lcyA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gIkguMjY1IiwKKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9IRVZDLAorCQkudHlwZSA9IEFNTF9GTVRfREVDLAorCQkubnVtX3BsYW5lcyA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gIlZQOSIsCisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfVlA5LAorCQkudHlwZSA9IEFNTF9GTVRfREVDLAorCQkubnVtX3BsYW5lcyA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gIk1QRUcxIiwKKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9NUEVHMSwKKwkJLnR5cGUgPSBBTUxfRk1UX0RFQywKKwkJLm51bV9wbGFuZXMgPSAxLAorCX0sCisJeworCQkubmFtZSA9ICJNUEVHMiIsCisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfTVBFRzIsCisJCS50eXBlID0gQU1MX0ZNVF9ERUMsCisJCS5udW1fcGxhbmVzID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTVBFRzQiLAorCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX01QRUc0LAorCQkudHlwZSA9IEFNTF9GTVRfREVDLAorCQkubnVtX3BsYW5lcyA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gIk1KUEVHIiwKKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9NSlBFRywKKwkJLnR5cGUgPSBBTUxfRk1UX0RFQywKKwkJLm51bV9wbGFuZXMgPSAxLAorCX0sCisJeworCQkubmFtZSA9ICJBVjEiLAorCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX0FWMSwKKwkJLnR5cGUgPSBBTUxfRk1UX0RFQywKKwkJLm51bV9wbGFuZXMgPSAxLAorCX0sCisJeworCQkubmFtZSA9ICJOVjIxIiwKKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9OVjIxLAorCQkudHlwZSA9IEFNTF9GTVRfRlJBTUUsCisJCS5udW1fcGxhbmVzID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTlYyMU0iLAorCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX05WMjFNLAorCQkudHlwZSA9IEFNTF9GTVRfRlJBTUUsCisJCS5udW1fcGxhbmVzID0gMiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTlYxMiIsCisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfTlYxMiwKKwkJLnR5cGUgPSBBTUxfRk1UX0ZSQU1FLAorCQkubnVtX3BsYW5lcyA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gIk5WMTJNIiwKKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9OVjEyTSwKKwkJLnR5cGUgPSBBTUxfRk1UX0ZSQU1FLAorCQkubnVtX3BsYW5lcyA9IDIsCisJfSwKKwl7CisJCS5uYW1lID0gIllVVjQyMCIsCisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfWVVWNDIwLAorCQkudHlwZSA9IEFNTF9GTVRfRlJBTUUsCisJCS5udW1fcGxhbmVzID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiWVVWNDIwTSIsCisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfWVVWNDIwTSwKKwkJLnR5cGUgPSBBTUxfRk1UX0ZSQU1FLAorCQkubnVtX3BsYW5lcyA9IDIsCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYW1sX2NvZGVjX2ZyYW1lc2l6ZXMgYW1sX3ZkZWNfZnJhbWVzaXplc1tdID0geworCXsKKwkJLmZvdXJjYwk9IFY0TDJfUElYX0ZNVF9IMjY0LAorCQkuc3RlcHdpc2UgPSB7ICBBTUxfVkRFQ19NSU5fVywgQU1MX1ZERUNfTUFYX1csIDIsCisJCQkJQU1MX1ZERUNfTUlOX0gsIEFNTF9WREVDX01BWF9ILCAyfSwKKwl9LAorCXsKKwkJLmZvdXJjYwk9IFY0TDJfUElYX0ZNVF9IRVZDLAorCQkuc3RlcHdpc2UgPSB7ICBBTUxfVkRFQ19NSU5fVywgQU1MX1ZERUNfTUFYX1csIDIsCisJCQkJQU1MX1ZERUNfTUlOX0gsIEFNTF9WREVDX01BWF9ILCAyfSwKKwl9LAorCXsKKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9WUDksCisJCS5zdGVwd2lzZSA9IHsgIEFNTF9WREVDX01JTl9XLCBBTUxfVkRFQ19NQVhfVywgMiwKKwkJCQlBTUxfVkRFQ19NSU5fSCwgQU1MX1ZERUNfTUFYX0gsIDJ9LAorCX0sCisJeworCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX01QRUcxLAorCQkuc3RlcHdpc2UgPSB7ICBBTUxfVkRFQ19NSU5fVywgQU1MX1ZERUNfTUFYX1csIDIsCisJCQkJQU1MX1ZERUNfTUlOX0gsIEFNTF9WREVDX01BWF9ILCAyfSwKKwl9LAorCXsKKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9NUEVHMiwKKwkJLnN0ZXB3aXNlID0geyAgQU1MX1ZERUNfTUlOX1csIEFNTF9WREVDX01BWF9XLCAyLAorCQkJCUFNTF9WREVDX01JTl9ILCBBTUxfVkRFQ19NQVhfSCwgMn0sCisJfSwKKwl7CisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfTVBFRzQsCisJCS5zdGVwd2lzZSA9IHsgIEFNTF9WREVDX01JTl9XLCBBTUxfVkRFQ19NQVhfVywgMiwKKwkJCQlBTUxfVkRFQ19NSU5fSCwgQU1MX1ZERUNfTUFYX0gsIDJ9LAorCX0sCisJeworCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX01KUEVHLAorCQkuc3RlcHdpc2UgPSB7ICBBTUxfVkRFQ19NSU5fVywgQU1MX1ZERUNfTUFYX1csIDIsCisJCQkJQU1MX1ZERUNfTUlOX0gsIEFNTF9WREVDX01BWF9ILCAyfSwKKwl9LAorCXsKKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9BVjEsCisJCS5zdGVwd2lzZSA9IHsgIEFNTF9WREVDX01JTl9XLCBBTUxfVkRFQ19NQVhfVywgMiwKKwkJCQlBTUxfVkRFQ19NSU5fSCwgQU1MX1ZERUNfTUFYX0gsIDJ9LAorCX0sCisJeworCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX05WMjEsCisJCS5zdGVwd2lzZSA9IHsgIEFNTF9WREVDX01JTl9XLCBBTUxfVkRFQ19NQVhfVywgMiwKKwkJCQlBTUxfVkRFQ19NSU5fSCwgQU1MX1ZERUNfTUFYX0gsIDJ9LAorCX0sCisJeworCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX05WMjFNLAorCQkuc3RlcHdpc2UgPSB7ICBBTUxfVkRFQ19NSU5fVywgQU1MX1ZERUNfTUFYX1csIDIsCisJCQkJQU1MX1ZERUNfTUlOX0gsIEFNTF9WREVDX01BWF9ILCAyfSwKKwl9LAorCXsKKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9OVjEyLAorCQkuc3RlcHdpc2UgPSB7ICBBTUxfVkRFQ19NSU5fVywgQU1MX1ZERUNfTUFYX1csIDIsCisJCQkJQU1MX1ZERUNfTUlOX0gsIEFNTF9WREVDX01BWF9ILCAyfSwKKwl9LAorCXsKKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9OVjEyTSwKKwkJLnN0ZXB3aXNlID0geyAgQU1MX1ZERUNfTUlOX1csIEFNTF9WREVDX01BWF9XLCAyLAorCQkJCUFNTF9WREVDX01JTl9ILCBBTUxfVkRFQ19NQVhfSCwgMn0sCisJfSwKKwl7CisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfWVVWNDIwLAorCQkuc3RlcHdpc2UgPSB7ICBBTUxfVkRFQ19NSU5fVywgQU1MX1ZERUNfTUFYX1csIDIsCisJCQkJQU1MX1ZERUNfTUlOX0gsIEFNTF9WREVDX01BWF9ILCAyfSwKKwl9LAorCXsKKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9ZVVY0MjBNLAorCQkuc3RlcHdpc2UgPSB7ICBBTUxfVkRFQ19NSU5fVywgQU1MX1ZERUNfTUFYX1csIDIsCisJCQkJQU1MX1ZERUNfTUlOX0gsIEFNTF9WREVDX01BWF9ILCAyfSwKKwl9LAorfTsKKworI2RlZmluZSBOVU1fU1VQUE9SVEVEX0ZSQU1FU0laRSBBUlJBWV9TSVpFKGFtbF92ZGVjX2ZyYW1lc2l6ZXMpCisjZGVmaW5lIE5VTV9GT1JNQVRTIEFSUkFZX1NJWkUoYW1sX3ZpZGVvX2Zvcm1hdHMpCisKK2V4dGVybiBib29sIG11bHRpcGxhbmFyOworZXh0ZXJuIGludCBkdW1wX2NhcHR1cmVfZnJhbWU7CitleHRlcm4gaW50IGJ5cGFzc192cHA7CitleHRlcm4gaW50IGJ5cGFzc19nZTJkOworZXh0ZXJuIGJvb2wgc3VwcG9ydF9mb3JtYXRfSTQyMDsKK2V4dGVybiBib29sIHN1cHBvcnRfbWpwZWc7CitleHRlcm4gaW50IGJ5cGFzc19wcm9ncmVzc2l2ZTsKK2V4dGVybiBpbnQgZm9yY2VfZW5hYmxlX25yOworZXh0ZXJuIGludCBmb3JjZV9lbmFibGVfZGlfbG9jYWxfYnVmZmVyOworZXh0ZXJuIGludCBtYXhfZGlfaW5zdGFuY2U7CitleHRlcm4gaW50IGJ5cGFzc19ucl9mbGFnOworCitleHRlcm4gaW50IGRtYWJ1Zl9mZF9pbnN0YWxsX2RhdGEoaW50IGZkLCB2b2lkKiBkYXRhLCB1MzIgc2l6ZSk7CitleHRlcm4gYm9vbCBpc192NGwyX2J1Zl9maWxlKHN0cnVjdCBmaWxlICpmaWxlKTsKK2V4dGVybiBpbnQgZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhpbnQgZHdfbW9kZSk7CitzdGF0aWMgdm9pZCBib3hfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZik7CitzdGF0aWMgc3RydWN0IGludGVybmFsX2NvbXBfYnVmKiB2Yl90b19jb21wKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4LAorCQkJCQkgICAgc3RydWN0IHZiMl9idWZmZXIgKnZiKTsKK3N0YXRpYyB2b2lkIHVwZGF0ZV9jdHhfZGltZW5zaW9uKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4LCB1MzIgdHlwZSk7CitzdGF0aWMgdm9pZCBjb3B5X3Y0bDJfZm9ybWF0X2RpbWVudGlvbihzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0X21wbGFuZSAqcGl4X21wLAorCQkJCSAgICAgICBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXgsCisJCQkJICAgICAgIHN0cnVjdCBhbWxfcV9kYXRhICpxX2RhdGEsCisJCQkJICAgICAgIHUzMiB0eXBlKTsKKworc3RhdGljIHVsb25nIGFtbF92Y29kZWNfY3R4X2xvY2soc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgpCit7CisJdWxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3R4LT5zbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGZsYWdzOworfQorCitzdGF0aWMgdm9pZCBhbWxfdmNvZGVjX2N0eF91bmxvY2soc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsIHVsb25nIGZsYWdzKQoreworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0eC0+c2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHVsb25nIGRtYWJ1Zl9jb250aWd1b3VzX3NpemUoc3RydWN0IHNnX3RhYmxlICpzZ3QpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzOworCWRtYV9hZGRyX3QgZXhwZWN0ZWQgPSBzZ19kbWFfYWRkcmVzcyhzZ3QtPnNnbCk7CisJdWxvbmcgc2l6ZSA9IDA7CisJdTMyIGk7CisKKwlmb3JfZWFjaF9zZyhzZ3QtPnNnbCwgcywgc2d0LT5uZW50cywgaSkgeworCQlpZiAoc2dfZG1hX2FkZHJlc3MocykgIT0gZXhwZWN0ZWQpCisJCQlicmVhazsKKwkJZXhwZWN0ZWQgPSBzZ19kbWFfYWRkcmVzcyhzKSArIHNnX2RtYV9sZW4ocyk7CisJCXNpemUgKz0gc2dfZG1hX2xlbihzKTsKKwl9CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHN0cnVjdCBhbWxfdmlkZW9fZm10ICphbWxfdmRlY19maW5kX2Zvcm1hdChzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IGFtbF92aWRlb19mbXQgKmZtdDsKKwl1bnNpZ25lZCBpbnQgazsKKworCWZvciAoayA9IDA7IGsgPCBOVU1fRk9STUFUUzsgaysrKSB7CisJCWZtdCA9ICZhbWxfdmlkZW9fZm9ybWF0c1trXTsKKwkJaWYgKGZtdC0+Zm91cmNjID09IGYtPmZtdC5waXhfbXAucGl4ZWxmb3JtYXQpCisJCQlyZXR1cm4gZm10OworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGFtbF9xX2RhdGEgKmFtbF92ZGVjX2dldF9xX2RhdGEoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsCisJCQkJCSAgICAgIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQoreworCWlmIChWNEwyX1RZUEVfSVNfT1VUUFVUKHR5cGUpKQorCQlyZXR1cm4gJmN0eC0+cV9kYXRhW0FNTF9RX0RBVEFfU1JDXTsKKworCXJldHVybiAmY3R4LT5xX2RhdGFbQU1MX1FfREFUQV9EU1RdOworfQorCit2b2lkIGFtbF92ZGVjX2Rpc3BhdGNoX2V2ZW50KHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4LCB1MzIgY2hhbmdlcykKK3sKKwlzdHJ1Y3QgdjRsMl9ldmVudCBldmVudCA9IHswfTsKKworCXN3aXRjaCAoY2hhbmdlcykgeworCWNhc2UgVjRMMl9FVkVOVF9TUkNfQ0hfUkVTT0xVVElPTjoKKwljYXNlIFY0TDJfRVZFTlRfU1JDX0NIX0hEUklORk86CisJY2FzZSBWNEwyX0VWRU5UX1JFUVVFU1RfUkVTRVQ6CisJY2FzZSBWNEwyX0VWRU5UX1JFUVVFU1RfRVhJVDoKKwkJZXZlbnQudHlwZSA9IFY0TDJfRVZFTlRfU09VUkNFX0NIQU5HRTsKKwkJZXZlbnQudS5zcmNfY2hhbmdlLmNoYW5nZXMgPSBjaGFuZ2VzOworCQlicmVhazsKKwljYXNlIFY0TDJfRVZFTlRfU0VORF9FT1M6CisJCWV2ZW50LnR5cGUgPSBWNEwyX0VWRU5UX0VPUzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJ1bnN1cHBvcnQgZGlzcGF0Y2ggZXZlbnQgJXhcbiIsIGNoYW5nZXMpOworCQlyZXR1cm47CisJfQorCisJdjRsMl9ldmVudF9xdWV1ZV9maCgmY3R4LT5maCwgJmV2ZW50KTsKKwlpZiAoY2hhbmdlcyAhPSBWNEwyX0VWRU5UX1NSQ19DSF9IRFJJTkZPKQorCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1BSSU5GTywgImNoYW5nZXM6ICV4XG4iLCBjaGFuZ2VzKTsKKwllbHNlCisJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVhJTkZPLCAiY2hhbmdlczogJXhcbiIsIGNoYW5nZXMpOworfQorCitzdGF0aWMgdm9pZCBhbWxfdmRlY19mbHVzaF9kZWNvZGVyKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4KQoreworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVhJTkZPLCAiJXNcbiIsIF9fZnVuY19fKTsKKworCWFtbF9kZWNvZGVyX2ZsdXNoKGN0eC0+YWRhX2N0eCk7Cit9CisKKy8qIENvbmRpdGlvbnM6CisgKiBBbHdheXMgY29ubmVjdCBWUFAgZm9yIG1wZWcyIGFuZCBoMjY0IHdoZW4gdGhlIHN0cmVhbSBzaXplIGlzIHVuZGVyIDJLLgorICogQWx3YXlzIGNvbm5lY3QgVlBQIGZvciBoZXZjL2F2MS92cDkgd2hlbiBjb2xvciBzcGFjZSBpcyBub3QgU0RSIGFuZAorICogICAgIHN0cmVhbSBzaXplIGlzIHVuZGVyIDJLLgorICogRm9yIERWLCBuZWVkIGFwcGxpY2F0aW9uIHRvIG5vdGlmeSBWNEwyIGRyaXZlciB0byBlbmZvcmNlIHRoZSBjb2xvciBzcGFjZQorICogICAgIGNvbnZlcnNpb24uIFBsYW4gdG8gZG8gaXQgdGhyb3VnaCBhIHN5c3RlbSBub2RlLgorICogRG8gbm90IGNvbm5lY3QgVlBQIGluIG90aGVyIGNhc2VzLgorICovCitzdGF0aWMgYm9vbCB2cHBfbmVlZGVkKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4LCB1MzIqIG1vZGUpCit7CisJaW50IHdpZHRoID0gY3R4LT5waWNpbmZvLmNvZGVkX3dpZHRoOworCWludCBoZWlnaHQgPSBjdHgtPnBpY2luZm8uY29kZWRfaGVpZ2h0OworCWludCBzaXplID0gMTkyMCAqIDEwODg7CisKKwlpZiAoYnlwYXNzX3ZwcCkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKCFjdHgtPnZwcF9jZmcuZW5hYmxlX25yICYmCisJCShjdHgtPnBpY2luZm8uZmllbGQgPT0gVjRMMl9GSUVMRF9OT05FKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKCFjdHgtPnZwcF9jZmcuZW5hYmxlX25yICYmCisJCShjdHgtPm91dHB1dF9waXhfZm10ID09IFY0TDJfUElYX0ZNVF9IRVZDKSkgeworCQlpZiAoaXNfb3Zlcl9zaXplKHdpZHRoLCBoZWlnaHQsIHNpemUpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwlpZiAoKGN0eC0+b3V0cHV0X3BpeF9mbXQgPT0gVjRMMl9QSVhfRk1UX0gyNjQpICYmCisJCShjdHgtPnBpY2luZm8uZmllbGQgIT0gVjRMMl9GSUVMRF9OT05FKSkgeworCQlpZiAoaXNfb3Zlcl9zaXplKHdpZHRoLCBoZWlnaHQsIHNpemUpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwlpZiAoY3R4LT52cHBfY2ZnLmVuYWJsZV9ucikgeworCQlpZiAoY3R4LT52cHBfY2ZnLmVuYWJsZV9sb2NhbF9idWYpCisJCQkqbW9kZSA9IFZQUF9NT0RFX05PSVNFX1JFRFVDX0xPQ0FMOworCQllbHNlCisJCQkqbW9kZSA9IFZQUF9NT0RFX05PSVNFX1JFRFVDOworCX0gZWxzZSB7CisJCWlmIChjdHgtPnZwcF9jZmcuZW5hYmxlX2xvY2FsX2J1ZikKKwkJCSptb2RlID0gVlBQX01PREVfRElfTE9DQUw7CisJCWVsc2UKKwkJCSptb2RlID0gVlBQX01PREVfREk7CisJfQorCisjaWYgMC8vZW5hYmxlIGxhdGVyCisJaWYgKGN0eC0+Y29sb3JzcGFjZSAhPSBWNEwyX0NPTE9SU1BBQ0VfREVGQVVMVCAmJgorCQkhaXNfb3Zlcl9zaXplKHdpZHRoLCBoZWlnaHQsIHNpemUpKSB7CisJCWlmIChjdHgtPnZwcF9jZmcuZW5hYmxlX2xvY2FsX2J1ZikKKwkJCSptb2RlID0gVlBQX01PREVfQ09MT1JfQ09OVl9MT0NBTDsKKwkJZWxzZQorCQkJKm1vZGUgPSBWUFBfTU9ERV9DT0xPUl9DT05WOworCX0KKyNlbmRpZgorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGdlMmRfbmVlZGVkKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4LCB1MzIqIG1vZGUpCit7CisJYm9vbCBlbmFibGVfZmVuY2UgPSAoY3R4LT5jb25maWcucGFybS5kZWMuY2ZnLmxvd19sYXRlbmN5X21vZGUgJiAyKSA/IDEgOiAwOworCisJaWYgKChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3KSAmJiBlbmFibGVfZmVuY2UpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChieXBhc3NfZ2UyZCkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDcpIHsKKwkJaWYgKChjdHgtPm91dHB1dF9waXhfZm10ICE9IFY0TDJfUElYX0ZNVF9IMjY0KSAmJgorCQkJKGN0eC0+b3V0cHV0X3BpeF9mbXQgIT0gVjRMMl9QSVhfRk1UX01QRUcxKSAmJgorCQkJKGN0eC0+b3V0cHV0X3BpeF9mbXQgIT0gVjRMMl9QSVhfRk1UX01QRUcyKSAmJgorCQkJKGN0eC0+b3V0cHV0X3BpeF9mbXQgIT0gVjRMMl9QSVhfRk1UX01QRUc0KSAmJgorCQkJKGN0eC0+b3V0cHV0X3BpeF9mbXQgIT0gVjRMMl9QSVhfRk1UX01KUEVHKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfSBlbHNlIGlmIChjdHgtPm91dHB1dF9waXhfZm10ICE9IFY0TDJfUElYX0ZNVF9NSlBFRykgeworCQkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChjdHgtPnBpY2luZm8uZmllbGQgIT0gVjRMMl9GSUVMRF9OT05FKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAoKGN0eC0+Y2FwX3BpeF9mbXQgPT0gVjRMMl9QSVhfRk1UX05WMTIpIHx8CisJCShjdHgtPmNhcF9waXhfZm10ID09IFY0TDJfUElYX0ZNVF9OVjEyTSkpCisJCSptb2RlID0gR0UyRF9NT0RFX0NPTlZFUlRfTlYxMjsKKwllbHNlIGlmICgoY3R4LT5jYXBfcGl4X2ZtdCA9PSBWNEwyX1BJWF9GTVRfTlYyMSkgfHwKKwkJKGN0eC0+Y2FwX3BpeF9mbXQgPT0gVjRMMl9QSVhfRk1UX05WMjFNKSkKKwkJKm1vZGUgPSBHRTJEX01PREVfQ09OVkVSVF9OVjIxOworCWVsc2UKKwkJKm1vZGUgPSBHRTJEX01PREVfQ09OVkVSVF9OVjIxOworCisJKm1vZGUgfD0gR0UyRF9NT0RFX0NPTlZFUlRfTEU7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHUzMiB2NGxfYnVmX3NpemVfZGVjaXNpb24oc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgpCit7CisJdTMyIG1vZGUsIHRvdGFsX3NpemU7CisJc3RydWN0IHZkZWNfcGljX2luZm8gKnBpY2luZm8gPSAmY3R4LT5waWNpbmZvOworCXN0cnVjdCBhbWxfdnBwX2NmZ19pbmZvcyAqdnBwID0gJmN0eC0+dnBwX2NmZzsKKwlzdHJ1Y3QgYW1sX2dlMmRfY2ZnX2luZm9zICpnZTJkID0gJmN0eC0+Z2UyZF9jZmc7CisKKwlpZiAodnBwX25lZWRlZChjdHgsICZtb2RlKSkgeworCQl2cHAtPm1vZGUgICAgICAgID0gbW9kZTsKKwkJdnBwLT5mbXQgICAgICAgICA9IGN0eC0+Y2FwX3BpeF9mbXQ7CisJCXZwcC0+aXNfZHJtICAgICAgPSBjdHgtPmlzX2RybV9tb2RlOworCQl2cHAtPmJ1Zl9zaXplID0gYW1sX3Y0bDJfdnBwX2dldF9idWZfbnVtKHZwcC0+bW9kZSkKKwkJCSsgcGljaW5mby0+dnBwX21hcmdpbjsKKworCQlpZiAocGljaW5mby0+ZmllbGQgPT0gVjRMMl9GSUVMRF9OT05FKSB7CisJCQl2cHAtPmlzX3Byb2cgPSB0cnVlOworCQkJdnBwLT5idWZfc2l6ZSA9IDA7CisJCX0gZWxzZSB7CisJCQl2cHAtPmlzX3Byb2cgPSBmYWxzZTsKKwkJCS8qIGZvciBiZXR3ZWVuIHdpdGggZGVjICYgdnBwLiAqLworCQkJcGljaW5mby0+ZHBiX21hcmdpbiA9IDI7CisJCX0KKworCQlpZiAodnBwLT5pc19wcm9nICYmCisJCQkhdnBwLT5lbmFibGVfbG9jYWxfYnVmICYmCisJCQlieXBhc3NfcHJvZ3Jlc3NpdmUpIHsKKwkJCXZwcC0+aXNfYnlwYXNzX3AgPSB0cnVlOworCQl9CisJCWN0eC0+dnBwX2lzX25lZWQgPSB0cnVlOworCX0gZWxzZSB7CisJCXZwcC0+YnVmX3NpemUgPSAwOworCQljdHgtPnZwcF9pc19uZWVkID0gZmFsc2U7CisJfQorCisJaWYgKGdlMmRfbmVlZGVkKGN0eCwgJm1vZGUpKSB7CisJCWdlMmQtPm1vZGUgPSBtb2RlOworCQlnZTJkLT5idWZfc2l6ZSA9IDQgKyBwaWNpbmZvLT5kcGJfbWFyZ2luOworCQljdHgtPmdlMmRfaXNfbmVlZCA9IHRydWU7CisJCXBpY2luZm8tPmRwYl9tYXJnaW4gPSAyOworCX0gZWxzZSB7CisJCWdlMmQtPmJ1Zl9zaXplID0gMDsKKwkJY3R4LT5nZTJkX2lzX25lZWQgPSBmYWxzZTsKKwl9CisKKwljdHgtPmRwYl9zaXplID0gcGljaW5mby0+ZHBiX2ZyYW1lcyArIHBpY2luZm8tPmRwYl9tYXJnaW47CisJY3R4LT52cHBfc2l6ZSA9IHZwcC0+YnVmX3NpemU7CisJY3R4LT5nZTJkX3NpemUgPSBnZTJkLT5idWZfc2l6ZTsKKworCXRvdGFsX3NpemUgPSBjdHgtPmRwYl9zaXplICsgY3R4LT52cHBfc2l6ZSArIGN0eC0+Z2UyZF9zaXplOworCisJaWYgKHRvdGFsX3NpemUgPiBWNExfQ0FQX0JVRkZfTUFYKSB7CisJCWlmIChjdHgtPmdlMmRfc2l6ZSkgeworCQkJY3R4LT5kcGJfc2l6ZSA9IFY0TF9DQVBfQlVGRl9NQVggLSBjdHgtPmdlMmRfc2l6ZSAtIGN0eC0+dnBwX3NpemU7CisJCX0gZWxzZSBpZiAoY3R4LT52cHBfc2l6ZSkgeworCQkJY3R4LT5kcGJfc2l6ZSA9IFY0TF9DQVBfQlVGRl9NQVggLSBjdHgtPnZwcF9zaXplOworCQl9IGVsc2UgeworCQkJY3R4LT5kcGJfc2l6ZSA9IFY0TF9DQVBfQlVGRl9NQVg7CisJCX0KKwkJcGljaW5mby0+ZHBiX21hcmdpbiA9IGN0eC0+ZHBiX3NpemUgLSBwaWNpbmZvLT5kcGJfZnJhbWVzOworCQl0b3RhbF9zaXplID0gVjRMX0NBUF9CVUZGX01BWDsKKwl9CisJdmRlY19pZl9zZXRfcGFyYW0oY3R4LCBTRVRfUEFSQU1fUElDX0lORk8sIHBpY2luZm8pOworCisJcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK3ZvaWQgYW1sX3ZkZWNfcGljX2luZm9fdXBkYXRlKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4KQoreworCWlmICh2ZGVjX2lmX2dldF9wYXJhbShjdHgsIEdFVF9QQVJBTV9QSUNfSU5GTywgJmN0eC0+bGFzdF9kZWNvZGVkX3BpY2luZm8pKSB7CisJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkiQ2Fubm90IGdldCBwYXJhbSA6IEdFVF9QQVJBTV9QSUNUVVJFX0lORk8gRVJSXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjdHgtPmxhc3RfZGVjb2RlZF9waWNpbmZvLnZpc2libGVfd2lkdGggPT0gMCB8fAorCQljdHgtPmxhc3RfZGVjb2RlZF9waWNpbmZvLnZpc2libGVfaGVpZ2h0ID09IDAgfHwKKwkJY3R4LT5sYXN0X2RlY29kZWRfcGljaW5mby5jb2RlZF93aWR0aCA9PSAwIHx8CisJCWN0eC0+bGFzdF9kZWNvZGVkX3BpY2luZm8uY29kZWRfaGVpZ2h0ID09IDApIHsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJDYW5ub3QgZ2V0IGNvcnJlY3QgcGljIGluZm9cbiIpOworCQlyZXR1cm47CisJfQorCisJLyppZiAoKGN0eC0+bGFzdF9kZWNvZGVkX3BpY2luZm8udmlzaWJsZV93aWR0aCA9PSBjdHgtPnBpY2luZm8udmlzaWJsZV93aWR0aCkgfHwKKwkgICAgKGN0eC0+bGFzdF9kZWNvZGVkX3BpY2luZm8udmlzaWJsZV9oZWlnaHQgPT0gY3R4LT5waWNpbmZvLnZpc2libGVfaGVpZ2h0KSkKKwkJcmV0dXJuOyovCisKKwl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywKKwkJIm5ldyglZCwlZCksIG9sZCglZCwlZCksIHJlYWwoJWQsJWQpXG4iLAorCQkJY3R4LT5sYXN0X2RlY29kZWRfcGljaW5mby52aXNpYmxlX3dpZHRoLAorCQkJY3R4LT5sYXN0X2RlY29kZWRfcGljaW5mby52aXNpYmxlX2hlaWdodCwKKwkJCWN0eC0+cGljaW5mby52aXNpYmxlX3dpZHRoLCBjdHgtPnBpY2luZm8udmlzaWJsZV9oZWlnaHQsCisJCQljdHgtPmxhc3RfZGVjb2RlZF9waWNpbmZvLmNvZGVkX3dpZHRoLAorCQkJY3R4LT5sYXN0X2RlY29kZWRfcGljaW5mby5jb2RlZF93aWR0aCk7CisKKwljdHgtPnBpY2luZm8gPSBjdHgtPmxhc3RfZGVjb2RlZF9waWNpbmZvOworCisJaWYgKGN0eC0+dnBwX2lzX25lZWQpCisJCWN0eC0+dnBwX2NmZy5pc192cHBfcmVzZXQgPSB0cnVlOworCisJdjRsX2J1Zl9zaXplX2RlY2lzaW9uKGN0eCk7CisKKwl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1BSSU5GTywKKwkJIlVwZGF0ZSBwaWN0dXJlIGJ1ZmZlciBjb3VudDogZGVjOiV1LCB2cHA6JXUsIGdlMmQ6JXUsIG1hcmdpbjoldSwgdG90YWw6JXVcbiIsCisJCWN0eC0+cGljaW5mby5kcGJfZnJhbWVzLCBjdHgtPnZwcF9zaXplLCBjdHgtPmdlMmRfc2l6ZSwKKwkJY3R4LT5waWNpbmZvLmRwYl9tYXJnaW4sCisJCUNUWF9CVUZfVE9UQUwoY3R4KSk7Cit9CisKK3ZvaWQgdmRlY19mcmFtZV9idWZmZXJfcmVsZWFzZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBmaWxlX3ByaXZhdGVfZGF0YSAqcHJpdl9kYXRhID0KKwkJKHN0cnVjdCBmaWxlX3ByaXZhdGVfZGF0YSAqKSBkYXRhOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKQorCQlwcml2X2RhdGEtPnY0bF9kZWNfY3R4OworCXN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1ZiAqdmIgPSAoc3RydWN0IGFtbF92aWRlb19kZWNfYnVmICopCisJCXByaXZfZGF0YS0+dmJfaGFuZGxlOworCXN0cnVjdCB1dm1faG9va19tb2RfaW5mbyAqdXZtID0gTlVMTDsKKworCWlmIChjdHggJiYgY3R4LT51dm1fcHJveHkpIHsKKwkJdXZtID0gJmN0eC0+dXZtX3Byb3h5W3ZiLT5pbnRlcm5hbF9pbmRleF07CisJCXV2bS0+ZnJlZSh1dm0tPmFyZyk7CisJfQorCisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgZmlsZV9wcml2YXRlX2RhdGEpKTsKKwlrZnJlZShkYXRhKTsKK30KKworc3RhdGljIHZvaWQgdjRsMl9idWZmX2RvbmUoc3RydWN0IHZiMl92NGwyX2J1ZmZlciAqYnVmLCBlbnVtIHZiMl9idWZmZXJfc3RhdGUgc3RhdGUpCit7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPSB2YjJfZ2V0X2Rydl9wcml2KGJ1Zi0+dmIyX2J1Zi52YjJfcXVldWUpOworCisJbXV0ZXhfbG9jaygmY3R4LT5idWZmX2RvbmVfbG9jayk7CisJaWYgKGJ1Zi0+dmIyX2J1Zi5zdGF0ZSAhPSBWQjJfQlVGX1NUQVRFX0FDVElWRSkgeworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1BST1QsICJ2YiBpcyBub3QgYWN0aXZlIHN0YXRlID0gJWQhXG4iLAorCQkJYnVmLT52YjJfYnVmLnN0YXRlKTsKKwkJbXV0ZXhfdW5sb2NrKCZjdHgtPmJ1ZmZfZG9uZV9sb2NrKTsKKwkJcmV0dXJuOworCX0KKwl2NGwyX20ybV9idWZfZG9uZShidWYsIHN0YXRlKTsKKwltdXRleF91bmxvY2soJmN0eC0+YnVmZl9kb25lX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBjb21wX2J1Zl9zZXRfdmZyYW1lKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4LAorCQkJIHN0cnVjdCB2YjJfYnVmZmVyICp2YiwKKwkJCSBzdHJ1Y3QgdmZyYW1lX3MgKnZmKQoreworCWRtYWJ1Zl9zZXRfdmZyYW1lKHZiLT5wbGFuZXNbMF0uZGJ1ZiwgdmYsIFZGX1NSQ19ERUNPREVSKTsKK30KKworc3RhdGljIHZvaWQgZmJfbWFwX3RhYmxlX2NsZWFuKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4KQoreworCWludCBpOworCXVsb25nIGZsYWdzOworCisJZmxhZ3MgPSBhbWxfdmNvZGVjX2N0eF9sb2NrKGN0eCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjdHgtPmZiX21hcCk7IGkrKykgeworCQljdHgtPmZiX21hcFtpXS5hZGRyCT0gMDsKKwkJY3R4LT5mYl9tYXBbaV0udmZyYW1lCT0gTlVMTDsKKwkJY3R4LT5mYl9tYXBbaV0udGFzawk9IE5VTEw7CisJCWN0eC0+ZmJfbWFwW2ldLmljb21wCT0gMDsKKwl9CisKKwlhbWxfdmNvZGVjX2N0eF91bmxvY2soY3R4LCBmbGFncyk7CisKKwl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1BSSU5GTywgIiVzIGRvbmVcbiIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIHZvaWQgZmJfbWFwX3RhYmxlX2hvbGQoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsCisJCQkJc3RydWN0IHZiMl9idWZmZXIgKnZiLAorCQkJCXN0cnVjdCB2ZnJhbWVfcyAqdmYsCisJCQkJc3RydWN0IHRhc2tfY2hhaW5fcyAqdGFzaywKKwkJCQl1MzIgaWNvbXApCit7CisJaW50IGk7CisJdWxvbmcgYWRkciwgZmxhZ3M7CisKKwlmbGFncyA9IGFtbF92Y29kZWNfY3R4X2xvY2soY3R4KTsKKworCWFkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcih2YiwgMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjdHgtPmZiX21hcCk7IGkrKykgeworCQlpZiAoIWN0eC0+ZmJfbWFwW2ldLmFkZHIgfHwKKwkJCShhZGRyID09IGN0eC0+ZmJfbWFwW2ldLmFkZHIpKSB7CisJCQljdHgtPmZiX21hcFtpXS50YXNrCT0gdGFzazsKKwkJCWN0eC0+ZmJfbWFwW2ldLmFkZHIJPSBhZGRyOworCQkJY3R4LT5mYl9tYXBbaV0udmZyYW1lCT0gdmY7CisJCQljdHgtPmZiX21hcFtpXS5pY29tcAk9IGljb21wOworCisJCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywKKwkJCQkiJXMsIHRhc2s6JXB4LCB2ZjolcHgsIGFkZHI6JWx4LCBpY29tcDoldVxuIiwKKwkJCQlfX2Z1bmNfXywgdGFzaywgdmYsIGFkZHIsIGljb21wKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJYW1sX3Zjb2RlY19jdHhfdW5sb2NrKGN0eCwgZmxhZ3MpOworCisJaWYgKGkgPj0gQVJSQVlfU0laRShjdHgtPmZiX21hcCkpIHsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSIlcywgdGFibGUgaXMgZnVsbC4gYWRkcjolbHgsIHZmOiVweFxuIiwKKwkJCV9fZnVuY19fLCBhZGRyLCB2Zik7CisJfQorfQorCitzdGF0aWMgdm9pZCBmYl9tYXBfdGFibGVfZmV0Y2goc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsCisJCQkJc3RydWN0IHZiMl9idWZmZXIgKnZiLAorCQkJCXN0cnVjdCB2ZnJhbWVfcyAqKnZmLAorCQkJCXN0cnVjdCB0YXNrX2NoYWluX3MgKip0YXNrLAorCQkJCXUzMiAqaWNvbXApCit7CisJaW50IGk7CisJdWxvbmcgYWRkciwgZmxhZ3M7CisKKwlmbGFncyA9IGFtbF92Y29kZWNfY3R4X2xvY2soY3R4KTsKKworCWFkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcih2YiwgMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjdHgtPmZiX21hcCk7IGkrKykgeworCQlpZiAoYWRkciA9PSBjdHgtPmZiX21hcFtpXS5hZGRyKSB7CisJCQkqdGFzayA9IGN0eC0+ZmJfbWFwW2ldLnRhc2s7CisJCQkqdmYgPSBjdHgtPmZiX21hcFtpXS52ZnJhbWU7CisJCQkqaWNvbXAgPSBjdHgtPmZiX21hcFtpXS5pY29tcDsKKworCQkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FWElORk8sCisJCQkJIiVzLCB0YXNrOiVweCwgdmY6JXB4LCBhZGRyOiVseCwgaWNvbXA6JXVcbiIsCisJCQkJX19mdW5jX18sIHRhc2ssIHZmLCBhZGRyLCAqaWNvbXApOworCisJCQljdHgtPmZiX21hcFtpXS50YXNrCT0gTlVMTDsKKwkJCWN0eC0+ZmJfbWFwW2ldLnZmcmFtZQk9IE5VTEw7CisJCQljdHgtPmZiX21hcFtpXS5hZGRyCT0gMDsKKwkJCWN0eC0+ZmJfbWFwW2ldLmljb21wCT0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJYW1sX3Zjb2RlY19jdHhfdW5sb2NrKGN0eCwgZmxhZ3MpOworCisJaWYgKGkgPj0gQVJSQVlfU0laRShjdHgtPmZiX21hcCkpIHsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19CVUZNR1IsCisJCQkiJXMsIHRoZXJlIGlzIG5ldyBhZGRyOiVseC5cbiIsCisJCQlfX2Z1bmNfXywgYWRkcik7CisJfQorfQorCitzdGF0aWMgYm9vbCBpc19mYl9tYXBwZWQoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsIHVsb25nIGFkZHIpCit7CisJaW50IGk7CisJdWxvbmcgZmxhZ3M7CisKKwlmbGFncyA9IGFtbF92Y29kZWNfY3R4X2xvY2soY3R4KTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGN0eC0+ZmJfbWFwKTsgaSsrKSB7CisJCWlmIChhZGRyID09IGN0eC0+ZmJfbWFwW2ldLmFkZHIpCisJCQlicmVhazsKKwl9CisKKwlhbWxfdmNvZGVjX2N0eF91bmxvY2soY3R4LCBmbGFncyk7CisKKwlpZiAoaSA+PSBBUlJBWV9TSVpFKGN0eC0+ZmJfbWFwKSkgeworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywKKwkJCSIlcywgYWRkcjolbHggaXNuJ3Qgb3V0cHV0LlxuIiwKKwkJCV9fZnVuY19fLCBhZGRyKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCisgc3RhdGljIHZvaWQgcG9zdF9mcmFtZV90b191cHBlcihzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCwKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIpCit7CisJc3RydWN0IGFtbF92aWRlb19kZWNfYnVmICpkc3RidWYgPQorCQljb250YWluZXJfb2YoZmIsIHN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1ZiwgZnJhbWVfYnVmZmVyKTsKKwlzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIyX2J1ZiA9ICZkc3RidWYtPnZiLnZiMl9idWY7CisJc3RydWN0IHZmcmFtZV9zICp2ZiA9IGZiLT52ZnJhbWU7CisJc3RydWN0IHZiMl92NGwyX2J1ZmZlciAqdmIyX3Y0bDIgPSBOVUxMOworCisJdmYtPmluZGV4X2Rpc3AgPSBjdHgtPmluZGV4X2Rpc3A7CisJY3R4LT5pbmRleF9kaXNwKys7CisJY3R4LT5wb3N0X3RvX3VwcGVyX2RvbmUgPSBmYWxzZTsKKworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfT1VUUFVULAorCQkiT1VUX0JVRkYgKCVzLCBzdDolZCwgc2VxOiVkKSB2YjooJWQsICVweCksIHZmOiglZCwgJXB4KSwgdHM6JWxsZCwgIgorCQkiWTooJWx4LCAldSkgQy9VOiglbHgsICV1KSBWOiglbHgsICV1KVxuIiwKKwkJY3R4LT5hZGFfY3R4LT5mcm1fbmFtZSwgZmItPnN0YXR1cywgdmYtPmluZGV4X2Rpc3AsCisJCXZiMl9idWYtPmluZGV4LCB2YjJfYnVmLAorCQl2Zi0+aW5kZXggJiAweGZmLCB2ZiwKKwkJdmYtPnRpbWVzdGFtcCwKKwkJZmItPm0ubWVtWzBdLmFkZHIsIGZiLT5tLm1lbVswXS5zaXplLAorCQlmYi0+bS5tZW1bMV0uYWRkciwgZmItPm0ubWVtWzFdLnNpemUsCisJCWZiLT5tLm1lbVsyXS5hZGRyLCBmYi0+bS5tZW1bMl0uc2l6ZSk7CisKKwl2YjJfdjRsMiA9IGNvbnRhaW5lcl9vZih2YjJfYnVmLCBzdHJ1Y3QgdmIyX3Y0bDJfYnVmZmVyLCB2YjJfYnVmKTsKKworCWlmIChkc3RidWYtPmZyYW1lX2J1ZmZlci5udW1fcGxhbmVzID09IDEpIHsKKwkJdmIyX3NldF9wbGFuZV9wYXlsb2FkKHZiMl9idWYsIDAsIGZiLT5tLm1lbVswXS5ieXRlc191c2VkKTsKKwl9IGVsc2UgaWYgKGRzdGJ1Zi0+ZnJhbWVfYnVmZmVyLm51bV9wbGFuZXMgPT0gMikgeworCQl2YjJfc2V0X3BsYW5lX3BheWxvYWQodmIyX2J1ZiwgMCwgZmItPm0ubWVtWzBdLmJ5dGVzX3VzZWQpOworCQl2YjJfc2V0X3BsYW5lX3BheWxvYWQodmIyX2J1ZiwgMSwgZmItPm0ubWVtWzFdLmJ5dGVzX3VzZWQpOworCX0KKwl2YjJfYnVmLT50aW1lc3RhbXAgPSB2Zi0+dGltZXN0YW1wOworCWRzdGJ1Zi0+dmIuZmxhZ3MgfD0gdmYtPmZyYW1lX3R5cGU7CisKKwlpZiAoKGN0eC0+cGljaW5mby5maWVsZCA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQpICYmICghY3R4LT52cHBfaXNfbmVlZCkpIHsKKwkJdmIyX3Y0bDItPmZpZWxkID0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOworCX0KKworCWRvIHsKKwkJdW5zaWduZWQgaW50IGR3X21vZGUgPSBWREVDX0RXX05PX0FGQkM7CisJCXN0cnVjdCBmaWxlICpmcDsKKwkJY2hhciBmaWxlX25hbWVbMzJdID0gezB9OworCisJCWlmICghZHVtcF9jYXB0dXJlX2ZyYW1lIHx8IGN0eC0+aXNfZHJtX21vZGUpCisJCQlicmVhazsKKwkJaWYgKHZkZWNfaWZfZ2V0X3BhcmFtKGN0eCwgR0VUX1BBUkFNX0RXX01PREUsICZkd19tb2RlKSkKKwkJCWJyZWFrOworCQlpZiAoZHdfbW9kZSA9PSBWREVDX0RXX0FGQkNfT05MWSkKKwkJCWJyZWFrOworCisJCXNucHJpbnRmKGZpbGVfbmFtZSwgMzIsICIvZGF0YS9kZWNfZHVtcF8ldXgldS5yYXciLCB2Zi0+d2lkdGgsIHZmLT5oZWlnaHQpOworCisJCWZwID0gZmlscF9vcGVuKGZpbGVfbmFtZSwKKwkJCQlPX0NSRUFUIHwgT19SRFdSIHwgT19MQVJHRUZJTEUgfCBPX0FQUEVORCwgMDYwMCk7CisKKwkJaWYgKCFJU19FUlIoZnApKSB7CisJCQlzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIgPSB2YjJfYnVmOworCisJCQlrZXJuZWxfd3JpdGUoZnAsdmIyX3BsYW5lX3ZhZGRyKHZiLCAwKSx2Yi0+cGxhbmVzWzBdLmxlbmd0aCwgMCk7CisJCQlpZiAoZHN0YnVmLT5mcmFtZV9idWZmZXIubnVtX3BsYW5lcyA9PSAyKQorCQkJCWtlcm5lbF93cml0ZShmcCx2YjJfcGxhbmVfdmFkZHIodmIsIDEpLAorCQkJCQkJdmItPnBsYW5lc1sxXS5sZW5ndGgsIDApOworCQkJcHJfaW5mbygiZHVtcCBpZHg6ICVkICVkeCVkXG4iLCBkdW1wX2NhcHR1cmVfZnJhbWUsIHZmLT53aWR0aCwgdmYtPmhlaWdodCk7CisJCQlkdW1wX2NhcHR1cmVfZnJhbWUtLTsKKwkJCWZpbHBfY2xvc2UoZnAsIE5VTEwpOworCQl9CisJfSB3aGlsZSgwKTsKKworCUFUUkFDRV9DT1VOVEVSKCJWQ19PVVRfVlNJTkstMS5zdWJtaXQiLCB2YjJfYnVmLT5pbmRleCk7CisJQVRSQUNFX0NPVU5URVIoIlZfU1RfVlNJTkstaW5wdXRfYnVmZmVyaW5nIiwgdmRlY19mcmFtZV9udW1iZXIoY3R4LT5hZGFfY3R4KSk7CisKKwlpZiAodmYtPmZsYWcgJiBWRlJBTUVfRkxBR19FTVBUWV9GUkFNRV9WNEwpIHsKKwkJZHN0YnVmLT52Yi5mbGFncyA9IFY0TDJfQlVGX0ZMQUdfTEFTVDsKKwkJaWYgKGRzdGJ1Zi0+ZnJhbWVfYnVmZmVyLm51bV9wbGFuZXMgPT0gMSkgeworCQkJdmIyX3NldF9wbGFuZV9wYXlsb2FkKHZiMl9idWYsIDAsIDApOworCQl9IGVsc2UgaWYgKGRzdGJ1Zi0+ZnJhbWVfYnVmZmVyLm51bV9wbGFuZXMgPT0gMikgeworCQkJdmIyX3NldF9wbGFuZV9wYXlsb2FkKHZiMl9idWYsIDAsIDApOworCQkJdmIyX3NldF9wbGFuZV9wYXlsb2FkKHZiMl9idWYsIDEsIDApOworCQl9CisJCWN0eC0+aGFzX3JlY2VpdmVfZW9zID0gdHJ1ZTsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19CVUZNR1IsCisJCQkicmVjZXZpZSBhIGVtcHR5IGZyYW1lLiBpZHg6ICVkLCBzdGF0ZTogJWRcbiIsCisJCQl2YjJfYnVmLT5pbmRleCwgdmIyX2J1Zi0+c3RhdGUpOworCX0KKworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVhJTkZPLAorCQkicmVjZWl2ZSB2YnVmIGlkeDogJWQsIHN0YXRlOiAlZFxuIiwKKwkJdmIyX2J1Zi0+aW5kZXgsIHZiMl9idWYtPnN0YXRlKTsKKworCWlmICh2Zi0+ZmxhZyAmIFZGUkFNRV9GTEFHX0VNUFRZX0ZSQU1FX1Y0TCkgeworCQlpZiAoY3R4LT52NGxfcmVzb2x1dGlvbl9jaGFuZ2UpIHsKKwkJCS8qIG1ha2UgdGhlIHJ1biB0byBzdGFuYnkgdW50aWwgbmV3IGJ1ZmZzIHRvIGVucXVlLiAqLworCQkJY3R4LT52NGxfY29kZWNfZHBiX3JlYWR5ID0gZmFsc2U7CisJCQljdHgtPnJlc2V0X2ZsYWcgPSBWNExfUkVTRVRfTU9ERV9MSUdIVDsKKwkJCWN0eC0+dnBwX2NmZy5yZXNfY2hnID0gdHJ1ZTsKKworCQkJLyoKKwkJCSAqIEFmdGVyIGFsbCBidWZmZXJzIGNvbnRhaW5pbmcgZGVjb2RlZCBmcmFtZXMgZnJvbQorCQkJICogYmVmb3JlIHRoZSByZXNvbHV0aW9uIGNoYW5nZSBwb2ludCByZWFkeSB0byBiZQorCQkJICogZGVxdWV1ZWQgb24gdGhlIENBUFRVUkUgcXVldWUsIHRoZSBkcml2ZXIgc2VuZHMgYQorCQkJICogVjRMMl9FVkVOVF9TT1VSQ0VfQ0hBTkdFIGV2ZW50IGZvciBzb3VyY2UgY2hhbmdlCisJCQkgKiB0eXBlIFY0TDJfRVZFTlRfU1JDX0NIX1JFU09MVVRJT04sIGFsc28gdGhlIHVwcGVyCisJCQkgKiBsYXllciB3aWxsIGdldCBuZXcgaW5mb3JtYXRpb24gZnJvbSBjdHMtPnBpY2luZm8uCisJCQkgKi8KKwkJCWFtbF92ZGVjX2Rpc3BhdGNoX2V2ZW50KGN0eCwgVjRMMl9FVkVOVF9TUkNfQ0hfUkVTT0xVVElPTik7CisJCX0gZWxzZQorCQkJYW1sX3ZkZWNfZGlzcGF0Y2hfZXZlbnQoY3R4LCBWNEwyX0VWRU5UX1NFTkRfRU9TKTsKKwl9CisKKwlpZiAoZHN0YnVmLT52Yi52YjJfYnVmLnN0YXRlID09IFZCMl9CVUZfU1RBVEVfQUNUSVZFKSB7CisJCS8qIGJpbmRpbmcgdmZyYW1lIGhhbmRsZS4gKi8KKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDcpIHsKKwkJCWlmICh2Zi0+Y2FudmFzMF9jb25maWdbMF0uYmxvY2tfbW9kZSA9PSBDQU5WQVNfQkxLTU9ERV9MSU5FQVIpIHsKKwkJCQlpZiAoKGN0eC0+b3V0cHV0X3BpeF9mbXQgIT0gVjRMMl9QSVhfRk1UX0gyNjQpICYmCisJCQkJCShjdHgtPm91dHB1dF9waXhfZm10ICE9IFY0TDJfUElYX0ZNVF9NUEVHMSkgJiYKKwkJCQkJKGN0eC0+b3V0cHV0X3BpeF9mbXQgIT0gVjRMMl9QSVhfRk1UX01QRUcyKSAmJgorCQkJCQkoY3R4LT5vdXRwdXRfcGl4X2ZtdCAhPSBWNEwyX1BJWF9GTVRfTVBFRzQpICYmCisJCQkJCShjdHgtPm91dHB1dF9waXhfZm10ICE9IFY0TDJfUElYX0ZNVF9NSlBFRykpIHsKKwkJCQkJdmYtPmZsYWcgfD0gVkZSQU1FX0ZMQUdfVklERU9fTElORUFSOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJaWYgKGZiLT5zdGF0dXMgPT0gRkJfU1RfR0UyRCkKKwkJCQkJCXZmLT5mbGFnIHw9IFZGUkFNRV9GTEFHX1ZJREVPX0xJTkVBUjsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAodmYtPmNhbnZhczBfY29uZmlnWzBdLmJsb2NrX21vZGUgPT0gQ0FOVkFTX0JMS01PREVfTElORUFSKQorCQkJCXZmLT5mbGFnIHw9IFZGUkFNRV9GTEFHX1ZJREVPX0xJTkVBUjsKKwkJfQorCisJCXZmLT5vbXhfaW5kZXggPSB2Zi0+aW5kZXhfZGlzcDsKKwkJZHN0YnVmLT5wcml2ZGF0YS52ZiA9ICp2ZjsKKworCQlpZiAodmIyX2J1Zi0+bWVtb3J5ID09IFZCMl9NRU1PUllfRE1BQlVGKSB7CisJCQlzdHJ1Y3QgZG1hX2J1ZiAqIGRtYTsKKworCQkJZG1hID0gZHN0YnVmLT52Yi52YjJfYnVmLnBsYW5lc1swXS5kYnVmOworCQkJaWYgKGRtYWJ1Zl9pc191dm0oZG1hKSkgeworCQkJCS8qIG9ubHkgWSB3aWxsIGNvbnRhaW4gdmZyYW1lICovCisJCQkJY29tcF9idWZfc2V0X3ZmcmFtZShjdHgsIHZiMl9idWYsIHZmKTsKKwkJCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywKKwkJCQkJInNldCB2ZiglcHgpIGludG8gJWR0aCBidWZcbiIsCisJCQkJCXZmLCB2YjJfYnVmLT5pbmRleCk7CisJCQl9CisJCX0KKworCQlmYl9tYXBfdGFibGVfaG9sZChjdHgsIHZiMl9idWYsIHZmLCBmYi0+dGFzaywgZHN0YnVmLT5pbnRlcm5hbF9pbmRleCk7CisKKwkJdjRsMl9idWZmX2RvbmUoJmRzdGJ1Zi0+dmIsIFZCMl9CVUZfU1RBVEVfRE9ORSk7CisKKwkJZmItPnN0YXR1cyA9IEZCX1NUX0RJU1BMQVk7CisJfQorCisJbXV0ZXhfbG9jaygmY3R4LT5zdGF0ZV9sb2NrKTsKKwlpZiAoY3R4LT5zdGF0ZSA9PSBBTUxfU1RBVEVfRkxVU0hJTkcgJiYKKwkJY3R4LT5oYXNfcmVjZWl2ZV9lb3MpIHsKKwkJY3R4LT5zdGF0ZSA9IEFNTF9TVEFURV9GTFVTSEVEOworCQlBVFJBQ0VfQ09VTlRFUigiVl9TVF9WU0lOSy1zdGF0ZSIsIGN0eC0+c3RhdGUpOworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1NUQVRFLAorCQkJInZjb2RlYyBzdGF0ZSAoQU1MX1NUQVRFX0ZMVVNIRUQpXG4iKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZjdHgtPnN0YXRlX2xvY2spOworCisJaWYgKGN0eC0+cG9zdF90b191cHBlcl9kb25lID09IGZhbHNlKSB7CisJCWN0eC0+cG9zdF90b191cHBlcl9kb25lID0gdHJ1ZTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjdHgtPnBvc3RfZG9uZV93cSk7CisJfQorCisJY3R4LT5kZWNvZGVkX2ZyYW1lX2NudCsrOworfQorCitzdGF0aWMgdm9pZCBmaWxsX2NhcHR1cmVfZG9uZV9jYih2b2lkICp2NGxfY3R4LCB2b2lkICpmYl9jdHgpCit7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopdjRsX2N0eDsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPQorCQkoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKilmYl9jdHg7CisJc3RydWN0IGFtbF92aWRlb19kZWNfYnVmICphbWxfYnVmZiA9CisJCWNvbnRhaW5lcl9vZihmYiwgc3RydWN0IGFtbF92aWRlb19kZWNfYnVmLCBmcmFtZV9idWZmZXIpOworCXN0cnVjdCB2YjJfdjRsMl9idWZmZXIgKnZiID0gJmFtbF9idWZmLT52YjsKKworCWlmIChjdHgtPmlzX3N0cmVhbV9vZmYpIHsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19JTlBVVCwKKwkJCSJpZ25vcmUgYnVmZiBpZHg6ICVkIHN0cmVhbW9mZlxuIiwgZmItPmJ1Zl9pZHgpOworCQlyZXR1cm47CisJfQorCisJQVRSQUNFX0NPVU5URVIoIlZDX09VVF9WU0lOSy0wLnJlY2VpdmUiLCB2Yi0+dmIyX2J1Zi5pbmRleCk7CisKKwltdXRleF9sb2NrKCZjdHgtPmNhcHR1cmVfYnVmZmVyX2xvY2spOworCWtmaWZvX3B1dCgmY3R4LT5jYXB0dXJlX2J1ZmZlciwgdmIpOworCW11dGV4X3VubG9jaygmY3R4LT5jYXB0dXJlX2J1ZmZlcl9sb2NrKTsKKworCWFtbF90aHJlYWRfcG9zdF90YXNrKGN0eCwgQU1MX1RIUkVBRF9DQVBUVVJFKTsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX3ZkZWNfYnVmX3BsYW5lKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4LAorCQkJCSAgc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKmZiLAorCQkJCSAgc3RydWN0IHZiMl9idWZmZXIgKnZiKQoreworCWludCBpOworCWNoYXIgcGxhbmVfblszXSA9IHsnWScsJ1UnLCdWJ307CisKKwlmYi0+bnVtX3BsYW5lcyA9IHZiLT5udW1fcGxhbmVzOworCWZiLT5idWZfaWR4ID0gdmItPmluZGV4OworCisJZm9yIChpID0gMCA7IGkgPCB2Yi0+bnVtX3BsYW5lcyA7IGkrKykgeworCQlmYi0+bS5tZW1baV0uYWRkcgk9IHZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKHZiLCBpKTsKKwkJZmItPm0ubWVtW2ldLmRidWYJPSB2Yi0+cGxhbmVzW2ldLmRidWY7CisJCWlmIChpID09IDApIHsKKwkJCS8vWQorCQkJaWYgKHZiLT5udW1fcGxhbmVzID09IDEpIHsKKwkJCQlmYi0+bS5tZW1bMF0uc2l6ZQk9IGN0eC0+cGljaW5mby55X2xlbl9zeiArCisJCQkJCWN0eC0+cGljaW5mby5jX2xlbl9zejsKKwkJCQlmYi0+bS5tZW1bMF0ub2Zmc2V0ID0gY3R4LT5waWNpbmZvLnlfbGVuX3N6OworCQkJfSBlbHNlIHsKKwkJCQlmYi0+bS5tZW1bMF0uc2l6ZQk9IGN0eC0+cGljaW5mby55X2xlbl9zejsKKwkJCQlmYi0+bS5tZW1bMF0ub2Zmc2V0ID0gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICh2Yi0+bnVtX3BsYW5lcyA9PSAyKSB7CisJCQkJLy9VVgorCQkJCWZiLT5tLm1lbVsxXS5zaXplCT0gY3R4LT5waWNpbmZvLmNfbGVuX3N6OworCQkJCWZiLT5tLm1lbVsxXS5vZmZzZXQgPSBjdHgtPnBpY2luZm8uY19sZW5fc3ogPj4gMTsKKwkJCX0gZWxzZSB7CisJCQkJZmItPm0ubWVtW2ldLnNpemUgID0gY3R4LT5waWNpbmZvLmNfbGVuX3N6ID4+IDE7CisJCQkJZmItPm0ubWVtW2ldLm9mZnNldCA9IDA7CisJCQl9CisJCX0KKworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0JVRk1HUiwKKwkJCQkiaWR4OiAldSwgJWM6KDB4JWx4LCAlZClcbiIsIHZiLT5pbmRleCwKKwkJCQlwbGFuZV9uW2ldLCBmYi0+bS5tZW1baV0uYWRkciwgZmItPm0ubWVtW2ldLnNpemUpOworCX0KK30KKworc3RhdGljIGJvb2wgZmJfdG9rZW5faW5zZXJ0KHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4LAorCQkJICAgIHVsb25nICp0b2tlbikKK3sKKwl1bG9uZyB2Yl9oYW5kbGU7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjdHgtPnRva2VuX3RhYmxlKTsgaSsrKSB7CisJCWlmIChjdHgtPnRva2VuX3RhYmxlW2ldICYmCisJCQkoY3R4LT50b2tlbl90YWJsZVtpXSA9PSAqdG9rZW4pKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKworCWlmICghdjRsMl9tMm1fbnVtX2RzdF9idWZzX3JlYWR5KGN0eC0+bTJtX2N0eCkpCisJCXJldHVybiBmYWxzZTsKKworCXZiX2hhbmRsZSA9ICh1bG9uZyl2NGwyX20ybV9kc3RfYnVmX3JlbW92ZShjdHgtPm0ybV9jdHgpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3R4LT50b2tlbl90YWJsZSk7IGkrKykgeworCQlpZiAoIWN0eC0+dG9rZW5fdGFibGVbaV0pIHsKKwkJCWN0eC0+dG9rZW5fdGFibGVbaV0gPSB2Yl9oYW5kbGU7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpID49IEFSUkFZX1NJWkUoY3R4LT50b2tlbl90YWJsZSkpIHsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSIlcywgdGFibGUgaXMgZnVsbC4gdG9rZW46JWx4XG4iLAorCQkJX19mdW5jX18sIHZiX2hhbmRsZSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkqdG9rZW4gPSB2Yl9oYW5kbGU7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgZmJfdG9rZW5fcmVtb3ZlKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4LAorCQkJICAgIHVsb25nIHRva2VuKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3R4LT50b2tlbl90YWJsZSk7IGkrKykgeworCQlpZiAodG9rZW4gPT0gY3R4LT50b2tlbl90YWJsZVtpXSkgeworCQkJY3R4LT50b2tlbl90YWJsZVtpXSA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpID49IEFSUkFZX1NJWkUoY3R4LT50b2tlbl90YWJsZSkpIHsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSIlcywgcmVtb3ZlIHRva2VuIGVyciwgdG9rZW46JWx4LlxuIiwKKwkJCV9fZnVuY19fLCB0b2tlbik7CisJfQorfQorCitzdGF0aWMgdm9pZCBmYl90b2tlbl9jbGVhbihzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGN0eC0+dG9rZW5fdGFibGUpOyBpKyspIHsKKwkJY3R4LT50b2tlbl90YWJsZVtpXSA9IDA7CisJfQorCisJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19QUklORk8sICIlcyBkb25lXG4iLCBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyBib29sIGZiX2J1ZmZfcXVlcnkoc3RydWN0IGFtbF9mYl9vcHMgKmZiLCB1bG9uZyAqdG9rZW4pCit7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQljb250YWluZXJfb2YoZmIsIHN0cnVjdCBhbWxfdmNvZGVjX2N0eCwgZmJfb3BzKTsKKwlzdHJ1Y3QgdmIyX3F1ZXVlICogcXVlID0gdjRsMl9tMm1fZ2V0X2RzdF92cShjdHgtPm0ybV9jdHgpOworCWJvb2wgcmV0ID0gZmFsc2U7CisJdWxvbmcgZmxhZ3M7CisKKwlpZiAoIXF1ZS0+c3RyZWFtaW5nKQorCQlyZXR1cm4gZmFsc2U7CisKKwlmbGFncyA9IGFtbF92Y29kZWNfY3R4X2xvY2soY3R4KTsKKworCXJldCA9IGZiX3Rva2VuX2luc2VydChjdHgsIHRva2VuKTsKKworCWFtbF92Y29kZWNfY3R4X3VubG9jayhjdHgsIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGFtbF90YXNrX2NoYWluX3JlbW92ZShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgdGFza19jaGFpbl9zICp0YXNrLCAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRhc2ssIHRtcCwgJmN0eC0+dGFza19jaGFpbl9wb29sLCBub2RlKSB7CisJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfUFJJTkZPLAorCQkJInJlbW92ZSB0YXNrIGNoYWluOiVkLCAlcHhcbiIsIHRhc2stPmlkLCB0YXNrKTsKKwkJbGlzdF9kZWwoJnRhc2stPm5vZGUpOworCQl0YXNrX2NoYWluX2NsZWFuKHRhc2spOworCQl0YXNrX2NoYWluX3JlbGVhc2UodGFzayk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHRhc2tfb3BzX3MgKmdldF92NGxfc2lua19vcHModm9pZCk7CisKK3N0YXRpYyB2b2lkIGFtbF9jcmVhdF9waXBlbGluZShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCwKKwkJCSAgICAgICBzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIsCisJCQkgICAgICAgdTMyIHJlcXVlc3RlcikKK3sKKwlzdHJ1Y3QgdGFza19jaGFpbl9zICp0YXNrID0gZmItPnRhc2s7CisJLyoKKwkgKiBsaW5lIDE6IGRlYyA8PT0+IHZwcCA8PT0+IHY0bC1zaW5rLCBmb3IgUCAvIFAgKyBESS5OUi4KKwkgKiBsaW5lIDI6IGRlYyA8PT0+IHZwcCwgdnBwIDw9PT4gdjRsLXNpbmssIGZvciBJIC8gSSArIERJLk5SLgorCSAqIGxpbmUgMzogZGVjIDw9PT4gdjRsLXNpbmssIG9ubHkgZm9yIFAuCisJICogbGluZSA0OiBkZWMgPD09PiBnZTJkLCBnZTJkIDw9PT4gdjRsLXNpbmssIHVzZWQgZm9yIGZtdCBjb252ZXJ0LgorCSAqIGxpbmUgNTogZGVjIDw9PT4gZ2UyZCwgZ2UyZCA8PT0+dnBwLCB2cHAgPD09PiB2NGwtc2luay4KKwkgKiBsaW5lIDY6IGRlYyA8PT0+IGdlMmQsIGdlMmQgPD09PiB2cHAgPD09PiB2NGwtc2luay4KKwkgKi8KKworCXN3aXRjaCAocmVxdWVzdGVyKSB7CisJY2FzZSBBTUxfRkJfUkVRX0RFQzoKKwkJaWYgKGN0eC0+Z2UyZCkgeworCQkJLyogZGVjIDw9PT4gZ2UyZC4gKi8KKwkJCXRhc2stPmF0dGFjaCh0YXNrLCBnZXRfZ2UyZF9vcHMoKSwgY3R4LT5nZTJkKTsKKwkJfSBlbHNlIGlmIChjdHgtPnZwcCkgeworCQkJaWYgKGN0eC0+dnBwLT5pc19wcm9nKSB7CisJCQkJLyogZGVjIDw9PT4gdnBwIDw9PT4gdjRsLXNpbmsuICovCisJCQkJdGFzay0+YXR0YWNoKHRhc2ssIGdldF92NGxfc2lua19vcHMoKSwgY3R4KTsKKwkJCQl0YXNrLT5hdHRhY2godGFzaywgZ2V0X3ZwcF9vcHMoKSwgY3R4LT52cHApOworCQkJfSBlbHNlIHsKKwkJCQkvKiBkZWMgPD09PiB2cHAuICovCisJCQkJdGFzay0+YXR0YWNoKHRhc2ssIGdldF92cHBfb3BzKCksIGN0eC0+dnBwKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIGRlYyA8PT0+IHY0bC1zaW5rLiAqLworCQkJdGFzay0+YXR0YWNoKHRhc2ssIGdldF92NGxfc2lua19vcHMoKSwgY3R4KTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQU1MX0ZCX1JFUV9HRTJEOgorCQlpZiAoY3R4LT52cHApIHsKKwkJCWlmIChjdHgtPnZwcC0+aXNfcHJvZykgeworCQkJCS8qIGdlMmQgPD09PiB2cHAgPD09PiB2NGwtc2luay4gKi8KKwkJCQl0YXNrLT5hdHRhY2godGFzaywgZ2V0X3Y0bF9zaW5rX29wcygpLCBjdHgpOworCQkJCXRhc2stPmF0dGFjaCh0YXNrLCBnZXRfdnBwX29wcygpLCBjdHgtPnZwcCk7CisJCQkJdGFzay0+YXR0YWNoKHRhc2ssIGdldF9nZTJkX29wcygpLCBjdHgtPmdlMmQpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBnZTJkIDw9PT4gdnBwLiAqLworCQkJCXRhc2stPmF0dGFjaCh0YXNrLCBnZXRfdnBwX29wcygpLCBjdHgtPnZwcCk7CisJCQkJdGFzay0+YXR0YWNoKHRhc2ssIGdldF9nZTJkX29wcygpLCBjdHgtPmdlMmQpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogZ2UyZCA8PT0+IHY0bC1zaW5rLiAqLworCQkJdGFzay0+YXR0YWNoKHRhc2ssIGdldF92NGxfc2lua19vcHMoKSwgY3R4KTsKKwkJCXRhc2stPmF0dGFjaCh0YXNrLCBnZXRfZ2UyZF9vcHMoKSwgY3R4LT5nZTJkKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQU1MX0ZCX1JFUV9WUFA6CisJCS8qIHZwcCA8PT0+IHY0bC1zaW5rLiAqLworCQl0YXNrLT5hdHRhY2godGFzaywgZ2V0X3Y0bF9zaW5rX29wcygpLCBjdHgpOworCQl0YXNrLT5hdHRhY2godGFzaywgZ2V0X3ZwcF9vcHMoKSwgY3R4LT52cHApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkidW5zdXBwb3J0IHJlcXVlc3RlciAleFxuIiwgcmVxdWVzdGVyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZmJfYnVmZl9mcm9tX3F1ZXVlKHN0cnVjdCBhbWxfZmJfb3BzICpmYl9vcHMsCisJCXVsb25nIHRva2VuLCBzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqKm91dF9mYiwKKwkJdTMyIHJlcXVlc3RlcikKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCWNvbnRhaW5lcl9vZihmYl9vcHMsIHN0cnVjdCBhbWxfdmNvZGVjX2N0eCwgZmJfb3BzKTsKKwlzdHJ1Y3QgYW1sX3ZpZGVvX2RlY19idWYgKmFtbF9idWYgPSBOVUxMOworCXN0cnVjdCB2YjJfdjRsMl9idWZmZXIgKnY0bF9idWYgPSBOVUxMOworCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9IE5VTEw7CisJdTMyIGJ1Zl9zdGF0dXMgPSAwOworCXVsb25nIGZsYWdzOworCisJZmxhZ3MgPSBhbWxfdmNvZGVjX2N0eF9sb2NrKGN0eCk7CisKKwlpZiAoY3R4LT5pc19zdHJlYW1fb2ZmKSB7CisJCWFtbF92Y29kZWNfY3R4X3VubG9jayhjdHgsIGZsYWdzKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXY0bF9idWYgPSAoc3RydWN0IHZiMl92NGwyX2J1ZmZlciAqKSB0b2tlbjsKKwlpZiAoIXY0bF9idWYpIHsKKwkJYW1sX3Zjb2RlY19jdHhfdW5sb2NrKGN0eCwgZmxhZ3MpOworCQlyZXR1cm4gLTE7CisJfQorCisJYW1sX2J1ZiA9IGNvbnRhaW5lcl9vZih2NGxfYnVmLCBzdHJ1Y3QgYW1sX3ZpZGVvX2RlY19idWYsIHZiKTsKKworCWZiCQk9ICZhbWxfYnVmLT5mcmFtZV9idWZmZXI7CisJZmItPmJ1Zl9pZHgJPSB2NGxfYnVmLT52YjJfYnVmLmluZGV4OworCWFtbF9idWYtPnVzZWQJPSB0cnVlOworCWN0eC0+YnVmX3VzZWRfY291bnQrKzsKKworCWlmIChyZXF1ZXN0ZXIgPT0gQU1MX0ZCX1JFUV9WUFApIHsKKwkJYnVmX3N0YXR1cyA9IFY0TF9DQVBfQlVGRl9JTl9WUFA7CisJCWN0eC0+Y2FwX3Bvb2wudnBwKys7CisJfSBlbHNlIGlmIChyZXF1ZXN0ZXIgPT0gQU1MX0ZCX1JFUV9ERUMpIHsKKwkJYnVmX3N0YXR1cyA9IFY0TF9DQVBfQlVGRl9JTl9ERUM7CisJCWN0eC0+Y2FwX3Bvb2wuZGVjKys7CisJfSBlbHNlIGlmIChyZXF1ZXN0ZXIgPT0gQU1MX0ZCX1JFUV9HRTJEKSB7CisJCWJ1Zl9zdGF0dXMgPSBWNExfQ0FQX0JVRkZfSU5fR0UyRDsKKwkJY3R4LT5jYXBfcG9vbC5nZTJkKys7CisJfQorCisJY3R4LT5jYXBfcG9vbC5zZXFbY3R4LT5jYXBfcG9vbC5vdXQrK10gPQorCQkoYnVmX3N0YXR1cyA8PCAxNiB8IGZiLT5idWZfaWR4KTsKKworCXVwZGF0ZV92ZGVjX2J1Zl9wbGFuZShjdHgsIGZiLCAmdjRsX2J1Zi0+dmIyX2J1Zik7CisKKwlhbWxfY3JlYXRfcGlwZWxpbmUoY3R4LCBmYiwgcmVxdWVzdGVyKTsKKworCWZiX3Rva2VuX3JlbW92ZShjdHgsIHRva2VuKTsKKworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfQlVGTUdSLAorCQkidmlkOiVkLCB0YXNrOiVweCwgcGh5OiVseCwgc3RhdGU6JWQsIHJlYWR5OiVkLCByZXF1ZXN0ZXI6JWRcbiIsCisJCWZiLT5idWZfaWR4LCBmYi0+dGFzaywgZmItPm0ubWVtWzBdLmFkZHIsIHY0bF9idWYtPnZiMl9idWYuc3RhdGUsCisJCXY0bDJfbTJtX251bV9kc3RfYnVmc19yZWFkeShjdHgtPm0ybV9jdHgpLCByZXF1ZXN0ZXIpOworCisJQVRSQUNFX0NPVU5URVIoIlZDX0lOX1ZTSU5LLTMucmVxdWlyZSIsIHY0bF9idWYtPnZiMl9idWYuaW5kZXgpOworCisJKm91dF9mYiA9IGZiOworCisJYW1sX3Zjb2RlY19jdHhfdW5sb2NrKGN0eCwgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGFza19vcHNfcyB2NGxfc2lua19vcHMgPSB7CisJLnR5cGUJCT0gVEFTS19UWVBFX1Y0TF9TSU5LLAorCS5maWxsX2J1ZmZlcgk9IGZpbGxfY2FwdHVyZV9kb25lX2NiLAorfTsKKworc3RhdGljIHN0cnVjdCB0YXNrX29wc19zICpnZXRfdjRsX3Npbmtfb3BzKHZvaWQpCit7CisJcmV0dXJuICZ2NGxfc2lua19vcHM7Cit9CisKK3ZvaWQgYW1sX3ZkZWNfYmFzaWNfaW5mb3JtYXRpb24oc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgpCit7CisJc3RydWN0IGFtbF9xX2RhdGEgKm91dHEgPSBOVUxMOworCXN0cnVjdCBhbWxfcV9kYXRhICpjYXBxID0gTlVMTDsKKwlzdHJ1Y3QgdmRlY19waWNfaW5mbyBwaWM7CisKKwlpZiAodmRlY19pZl9nZXRfcGFyYW0oY3R4LCBHRVRfUEFSQU1fUElDX0lORk8sICZwaWMpKSB7CisJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkiZ2V0IHBpYyBpbmZvIGVyclxuIik7CisJCXJldHVybjsKKwl9CisKKwlvdXRxID0gYW1sX3ZkZWNfZ2V0X3FfZGF0YShjdHgsIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUKTsKKwljYXBxID0gYW1sX3ZkZWNfZ2V0X3FfZGF0YShjdHgsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSk7CisKKwlwcl9pbmZvKCJcbj09PT0gU2hvdyBCYXNpYyBJbmZvcm1hdGlvbiA9PT09IFxuIik7CisKKwl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1BSSU5GTywKKwkJIkZvcm1hdCAgICAgOiAlc1xuIiwKKwkJb3V0cS0+Zm10LT5uYW1lKTsKKwl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1BSSU5GTywKKwkJIkNvbG9yIHNwYWNlOiAlc1xuIiwKKwkJY2FwcS0+Zm10LT5uYW1lKTsKKwl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1BSSU5GTywKKwkJIlNjYW4gdHlwZSAgOiAlc1xuIiwKKwkJKHBpYy5maWVsZCA9PSBWNEwyX0ZJRUxEX05PTkUpID8KKwkJIlByb2dyZXNzaXZlIiA6ICJJbnRlcmxhY2VkIik7CisJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19QUklORk8sCisJCSJSZXNvbHV0aW9uIDogdmlzaWJsZSglZHglZCksIGNvZGVkKCVkeCVkKVxuIiwKKwkJcGljLnZpc2libGVfd2lkdGgsIHBpYy52aXNpYmxlX2hlaWdodCwKKwkJcGljLmNvZGVkX3dpZHRoLCBwaWMuY29kZWRfaGVpZ2h0KTsKKwl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1BSSU5GTywKKwkJIkJ1ZmZlciBudW0gOiBkZWM6JWQsIHZwcDolZCwgZ2UyZDolZCwgbWFyZ2luOiVkLCB0b3RhbDolZFxuIiwKKwkJY3R4LT5waWNpbmZvLmRwYl9mcmFtZXMsIGN0eC0+dnBwX3NpemUsIGN0eC0+Z2UyZF9zaXplLAorCQljdHgtPnBpY2luZm8uZHBiX21hcmdpbiwgQ1RYX0JVRl9UT1RBTChjdHgpKTsKKwl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1BSSU5GTywKKwkJIkNvbmZpZyAgICAgOiBkdzolZCwgZHJtOiVkLCBieXA6JWQsIGxjOiVkLCBucjolZCwgZ2UyZDoleFxuIiwKKwkJY3R4LT5jb25maWcucGFybS5kZWMuY2ZnLmRvdWJsZV93cml0ZV9tb2RlLAorCQljdHgtPmlzX2RybV9tb2RlLAorCQljdHgtPnZwcF9jZmcuaXNfYnlwYXNzX3AsCisJCWN0eC0+dnBwX2NmZy5lbmFibGVfbG9jYWxfYnVmLAorCQljdHgtPnZwcF9jZmcuZW5hYmxlX25yLAorCQljdHgtPmdlMmRfY2ZnLm1vZGUpOworfQorCit2b2lkIGFtbF9idWZmZXJfc3RhdHVzKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4KQoreworCXN0cnVjdCB2YjJfdjRsMl9idWZmZXIgKnZiID0gTlVMTDsKKwlzdHJ1Y3QgYW1sX3ZpZGVvX2RlY19idWYgKmFtbF9idWZmID0gTlVMTDsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPSBOVUxMOworCXN0cnVjdCB2YjJfcXVldWUgKnEgPSBOVUxMOworCXVsb25nIGZsYWdzOworCWludCBpOworCisJZmxhZ3MgPSBhbWxfdmNvZGVjX2N0eF9sb2NrKGN0eCk7CisKKwlxID0gdjRsMl9tMm1fZ2V0X3ZxKGN0eC0+bTJtX2N0eCwgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKTsKKwlpZiAoIXEtPnN0cmVhbWluZykgeworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJImNhbid0IGFjaGlldmUgYnVmZmVycyBzdGF0dXMgYmVmb3JlIHN0YXJ0IHN0cmVhbWluZy5cbiIpOworCX0KKworCXByX2luZm8oIlxuPT09PSBTaG93IEJ1ZmZlciBTdGF0dXMgPT09PT09PT0gXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgcS0+bnVtX2J1ZmZlcnM7ICsraSkgeworCQl2YiA9IHRvX3ZiMl92NGwyX2J1ZmZlcihxLT5idWZzW2ldKTsKKwkJYW1sX2J1ZmYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1ZiwgdmIpOworCQlmYiA9ICZhbWxfYnVmZi0+ZnJhbWVfYnVmZmVyOworCisJCS8qIHByaW50IG91dCB0YXNrIGNoYWluIHN0YXR1cy4gKi8KKwkJdGFza19jaGFpbl9zaG93KGZiLT50YXNrKTsKKwl9CisKKwlhbWxfdmNvZGVjX2N0eF91bmxvY2soY3R4LCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFtbF9jaGVja19kcGJfcmVhZHkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgpCit7CisJaWYgKCFjdHgtPnY0bF9jb2RlY19kcGJfcmVhZHkpIHsKKwkJLyoKKwkJICogbWFrZSBzdXJlIGVub3VnaCBkc3QgYnVmcyBmb3IgZGVjb2RpbmcuCisJCSAqLworCQlpZiAoKGN0eC0+ZHBiX3NpemUpICYmIChjdHgtPmNhcF9wb29sLmluID49IGN0eC0+ZHBiX3NpemUpKQorCQkJY3R4LT52NGxfY29kZWNfZHBiX3JlYWR5ID0gdHJ1ZTsKKworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0JVRk1HUiwKKwkJCSJkcGI6ICVkLCB2cHA6ICVkLCByZWFkeTogJWQsIHVzZWQ6ICVkLCBkcGIgaXMgcmVhZHk6ICVzXG4iLAorCQkJY3R4LT5kcGJfc2l6ZSwgY3R4LT52cHBfc2l6ZSwKKwkJCXY0bDJfbTJtX251bV9kc3RfYnVmc19yZWFkeShjdHgtPm0ybV9jdHgpLAorCQkJY3R4LT5jYXBfcG9vbC5vdXQsIGN0eC0+djRsX2NvZGVjX2RwYl9yZWFkeSA/ICJ5ZXMiIDogIm5vIik7CisJfQorfQorCitzdGF0aWMgdm9pZCByZWNvbmZpZ192cHBfc3RhdHVzKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4KQoreworCWlmIChieXBhc3NfbnJfZmxhZyAmJgorCQkhY3R4LT52cHBfY2ZnLmlzX3Byb2cgJiYKKwkJKChjdHgtPnZwcF9jZmcubW9kZSA9PSBWUFBfTU9ERV9OT0lTRV9SRURVQ19MT0NBTCkgfHwKKwkJKGN0eC0+dnBwX2NmZy5tb2RlID09IFZQUF9NT0RFX05PSVNFX1JFRFVDKSkpIHsKKwkJY3R4LT52cHBfY2ZnLmVuYWJsZV9uciA9IDA7CisJCWN0eC0+dnBwX2NmZy5lbmFibGVfbG9jYWxfYnVmID0gMDsKKworCQljdHgtPnZwcF9jZmcubW9kZSA9IFZQUF9NT0RFX0RJOworCX0KK30KKworc3RhdGljIGludCBpc192ZGVjX3JlYWR5KHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4KQoreworCXN0cnVjdCBhbWxfdmNvZGVjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisKKwlpZiAoIWlzX2lucHV0X3JlYWR5KGN0eC0+YWRhX2N0eCkpIHsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJ0aGUgZGVjb2RlciBpbnB1dCBoYXMgbm90IHJlYWR5LlxuIik7CisJCXY0bDJfbTJtX2pvYl9maW5pc2goZGV2LT5tMm1fZGV2X2RlYywgY3R4LT5tMm1fY3R4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGN0eC0+c3RhdGUgPT0gQU1MX1NUQVRFX1BST0JFKSB7CisJCW11dGV4X2xvY2soJmN0eC0+c3RhdGVfbG9jayk7CisJCWlmIChjdHgtPnN0YXRlID09IEFNTF9TVEFURV9QUk9CRSkgeworCQkJY3R4LT5zdGF0ZSA9IEFNTF9TVEFURV9SRUFEWTsKKwkJCUFUUkFDRV9DT1VOVEVSKCJWX1NUX1ZTSU5LLXN0YXRlIiwgY3R4LT5zdGF0ZSk7CisJCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1NUQVRFLAorCQkJCSJ2Y29kZWMgc3RhdGUgKEFNTF9TVEFURV9SRUFEWSlcbiIpOworCQl9CisJCW11dGV4X3VubG9jaygmY3R4LT5zdGF0ZV9sb2NrKTsKKwl9CisKKwltdXRleF9sb2NrKCZjdHgtPnN0YXRlX2xvY2spOworCWlmIChjdHgtPnN0YXRlID09IEFNTF9TVEFURV9SRUFEWSkgeworCQlpZiAoY3R4LT5tMm1fY3R4LT5vdXRfcV9jdHgucS5zdHJlYW1pbmcgJiYKKwkJCWN0eC0+bTJtX2N0eC0+Y2FwX3FfY3R4LnEuc3RyZWFtaW5nKSB7CisJCQljdHgtPnN0YXRlID0gQU1MX1NUQVRFX0FDVElWRTsKKwkJCUFUUkFDRV9DT1VOVEVSKCJWX1NUX1ZTSU5LLXN0YXRlIiwgY3R4LT5zdGF0ZSk7CisJCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1NUQVRFLAorCQkJCSJ2Y29kZWMgc3RhdGUgKEFNTF9TVEFURV9BQ1RJVkUpXG4iKTsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmN0eC0+c3RhdGVfbG9jayk7CisKKwkvKiBjaGVjayBkcGIgcmVhZHkgKi8KKwkvL2FtbF9jaGVja19kcGJfcmVhZHkoY3R4KTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgYm9vbCBpc19lbm91Z2hfd29ya19pdGVtcyhzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCisJaWYgKHZkZWNfZnJhbWVfbnVtYmVyKGN0eC0+YWRhX2N0eCkgPj0gV09SS19JVEVNU19NQVgpIHsKKwkJdjRsMl9tMm1fam9iX2ZpbmlzaChkZXYtPm0ybV9kZXZfZGVjLCBjdHgtPm0ybV9jdHgpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIGFtbF93YWl0X2J1Zl9yZWFkeShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCkKK3sKKwl1bG9uZyBleHBpcmVzOworCisJZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCXdoaWxlICghY3R4LT52NGxfY29kZWNfZHBiX3JlYWR5KSB7CisJCXUzMiByZWFkeV9udW0gPSAwOworCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGV4cGlyZXMpKSB7CisJCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJCSJ0aGUgRFBCIHN0YXRlIGhhcyBub3QgcmVhZHkuXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmVhZHlfbnVtID0gdjRsMl9tMm1fbnVtX2RzdF9idWZzX3JlYWR5KGN0eC0+bTJtX2N0eCk7CisJCWlmICgocmVhZHlfbnVtICsgY3R4LT5idWZfdXNlZF9jb3VudCkgPj0gQ1RYX0JVRl9UT1RBTChjdHgpKQorCQkJY3R4LT52NGxfY29kZWNfZHBiX3JlYWR5ID0gdHJ1ZTsKKwl9Cit9CisKK3ZvaWQgZG1hYnVmZl9yZWN5Y2xlX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGFtbF92Y29kZWNfY3R4LCBkbWFidWZmX3JlY3ljbGVfd29yayk7CisJc3RydWN0IHZiMl92NGwyX2J1ZmZlciAqdmIgPSBOVUxMOworCXN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1ZiAqYnVmID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZm9yICg7OykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3R4LT5kbWFidWZmX3JlY3ljbGVfbG9jaywgZmxhZ3MpOworCQlpZiAoIWtmaWZvX2dldCgmY3R4LT5kbWFidWZmX3JlY3ljbGUsICZ2YikpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0eC0+ZG1hYnVmZl9yZWN5Y2xlX2xvY2ssIGZsYWdzKTsKKwkJCWJyZWFrOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0eC0+ZG1hYnVmZl9yZWN5Y2xlX2xvY2ssIGZsYWdzKTsKKworCQlidWYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1ZiwgdmIpOworCisJCWlmIChjdHgtPmlzX291dF9zdHJlYW1fb2ZmKQorCQkJY29udGludWU7CisKKwkJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0CisJCQkoY3R4LT53cSwgYnVmLT51c2VkID09IGZhbHNlLAorCQkJIG1zZWNzX3RvX2ppZmZpZXMoMjAwKSkgPT0gMCkgeworCQkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCQkid2FpdCByZWN5Y2xlIGRtYSBidWZmIHRpbWVvdXQuXG4iKTsKKwkJfQorCisJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfSU5QVVQsCisJCQkicmVjeWNsZSBidWZmIGlkeDogJWQsIHZidWY6ICVseFxuIiwgdmItPnZiMl9idWYuaW5kZXgsCisJCQkodWxvbmcpc2dfZG1hX2FkZHJlc3MoYnVmLT5vdXRfc2d0LT5zZ2wpKTsKKworCQlBVFJBQ0VfQ09VTlRFUigiVk9fT1VUX1ZTSU5LLTIud3JpdGVfc2VjdXJlX2VuZCIsIHZiLT52YjJfYnVmLmluZGV4KTsKKworCQlpZiAodmItPnZiMl9idWYuc3RhdGUgIT0gVkIyX0JVRl9TVEFURV9FUlJPUikKKwkJCXY0bDJfYnVmZl9kb25lKHZiLCBidWYtPmVycm9yID8gVkIyX0JVRl9TVEFURV9FUlJPUiA6CisJCQkJVkIyX0JVRl9TVEFURV9ET05FKTsKKwl9Cit9CisKK3ZvaWQgYW1sX3JlY3ljbGVfZG1hX2J1ZmZlcnMoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsIHUzMiBoYW5kbGUpCit7CisJc3RydWN0IGFtbF92Y29kZWNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwlzdHJ1Y3QgdmIyX3Y0bDJfYnVmZmVyICp2YiA9IE5VTEw7CisJc3RydWN0IHZiMl9xdWV1ZSAqcSA9IE5VTEw7CisJaW50IGluZGV4ID0gaGFuZGxlICYgMHhmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoY3R4LT5pc19vdXRfc3RyZWFtX29mZikgeworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0lOUFVULAorCQkJImlnbm9yZSBidWZmIGlkeDogJWQgc3RyZWFtb2ZmXG4iLCBpbmRleCk7CisJCXJldHVybjsKKwl9CisKKwlxID0gdjRsMl9tMm1fZ2V0X3ZxKGN0eC0+bTJtX2N0eCwKKwkJVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQpOworCisJdmIgPSB0b192YjJfdjRsMl9idWZmZXIocS0+YnVmc1tpbmRleF0pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmN0eC0+ZG1hYnVmZl9yZWN5Y2xlX2xvY2ssIGZsYWdzKTsKKwlrZmlmb19wdXQoJmN0eC0+ZG1hYnVmZl9yZWN5Y2xlLCB2Yik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3R4LT5kbWFidWZmX3JlY3ljbGVfbG9jaywgZmxhZ3MpOworCisJcXVldWVfd29yayhkZXYtPmRlY29kZV93b3JrcXVldWUsICZjdHgtPmRtYWJ1ZmZfcmVjeWNsZV93b3JrKTsKK30KKworc3RhdGljIHZvaWQgYW1sX3ZkZWNfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYW1sX3Zjb2RlY19jdHgsIGRlY29kZV93b3JrKTsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCXN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1ZiAqYW1sX2J1ZjsKKwlzdHJ1Y3QgdmIyX3Y0bDJfYnVmZmVyICp2YjJfdjRsMjsKKwlzdHJ1Y3QgdmIyX2J1ZmZlciAqdmI7CisJc3RydWN0IGFtbF92Y29kZWNfbWVtIGJ1ZjsKKwlib29sIHJlc19jaGcgPSBmYWxzZTsKKwlpbnQgcmV0OworCisJaWYgKGN0eC0+c3RhdGUgPCBBTUxfU1RBVEVfSU5JVCB8fAorCQljdHgtPnN0YXRlID4gQU1MX1NUQVRFX0ZMVVNIRUQpIHsKKwkJdjRsMl9tMm1fam9iX2ZpbmlzaChkZXYtPm0ybV9kZXZfZGVjLCBjdHgtPm0ybV9jdHgpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIWlzX3ZkZWNfcmVhZHkoY3R4KSkgeworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJInRoZSBkZWNvZGVyIGhhcyBub3QgcmVhZHkuXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJdmIyX3Y0bDIgPSB2NGwyX20ybV9uZXh0X3NyY19idWYoY3R4LT5tMm1fY3R4KTsKKwlpZiAodmIyX3Y0bDIgPT0gTlVMTCkgeworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJInNyY19idWYgZW1wdHkuXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJdmIgPSAoc3RydWN0IHZiMl9idWZmZXIgKil2YjJfdjRsMjsKKworCS8qdGhpcyBjYXNlIGZvciBnb29nbGUsIGJ1dCBzb21lIGZyYW1lcyBhcmUgZHJvcGVkIG9uIGZmbXBlZywgc28gZGlzYWJsZWQgdGVtcC4qLworCWlmICgwICYmICFpc19lbm91Z2hfd29ya19pdGVtcyhjdHgpKQorCQlnb3RvIG91dDsKKworCWFtbF9idWYgPSBjb250YWluZXJfb2YodmIyX3Y0bDIsIHN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1ZiwgdmIpOworCWlmIChhbWxfYnVmLT5sYXN0ZnJhbWUpIHsKKwkJdWxvbmcgZXhwaXJlczsKKworCQkvKnRoZSBlbXB0eSBkYXRhIHVzZSB0byBmbHVzaGVkIHRoZSBkZWNvZGVyLiovCisJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfQlVGTUdSLAorCQkJIkdvdCBlbXB0eSBmbHVzaCBpbnB1dCBidWZmZXIuXG4iKTsKKworCQkvKgorCQkgKiB3aGVuIGlucHV0cyBhIHNtYWxsIGFtb3VudCBvZiBzcmMgYnVmZiwgdGhlbiBzb29uIHRvCisJCSAqIHN3aXRjaCBzdGF0ZSBGTFVTSElORywgbXVzdCB0byB3YWl0IHRoZSBEQlAgdG8gYmUgcmVhZHkuCisJCSAqICghY3R4LT52NGxfY29kZWNfZHBiX3JlYWR5KSBjaGFuZ2UgdG8gIG9ubHkgbmVlZCBvbmUgYnVmCisJCSAqIGZvciBydW4gcmVhZHkgaW4gbmV3IHZlcnNpb24uCisJCSAqLworCQlleHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoNTAwMCk7CisJCXdoaWxlICgodmRlY19mcmFtZV9udW1iZXIoY3R4LT5hZGFfY3R4KSA+IDApICYmCisJCQkoY3R4LT5jYXBfcG9vbC5pbiA8IDEpKSB7CisJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBleHBpcmVzKSkgeworCQkJCWFtbF92ZGVjX2ZsdXNoX2RlY29kZXIoY3R4KTsKKwkJCQl2NGwyX20ybV9zcmNfYnVmX3JlbW92ZShjdHgtPm0ybV9jdHgpOworCQkJCXY0bDJfbTJtX2pvYl9maW5pc2goZGV2LT5tMm1fZGV2X2RlYywgY3R4LT5tMm1fY3R4KTsKKwkJCQlhbWxfdmRlY19kaXNwYXRjaF9ldmVudChjdHgsIFY0TDJfRVZFTlRfUkVRVUVTVF9FWElUKTsKKwkJCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJCQkiY2FwdHVyZSBidWZmZXIgd2FpdGluZyB0aW1lb3V0LlxuIik7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQl1c2xlZXBfcmFuZ2UoNTAwMCwgNTUwMCk7CisJCX0KKworCQltdXRleF9sb2NrKCZjdHgtPnN0YXRlX2xvY2spOworCQlpZiAoY3R4LT5zdGF0ZSA9PSBBTUxfU1RBVEVfQUNUSVZFKSB7CisJCQljdHgtPnN0YXRlID0gQU1MX1NUQVRFX0ZMVVNISU5HOy8vIHByZXBhcmUgZmx1c2hpbmcKKwkJCUFUUkFDRV9DT1VOVEVSKCJWX1NUX1ZTSU5LLXN0YXRlIiwgY3R4LT5zdGF0ZSk7CisJCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1NUQVRFLAorCQkJCSJ2Y29kZWMgc3RhdGUgKEFNTF9TVEFURV9GTFVTSElORy1MQVNURlJNKVxuIik7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZjdHgtPnN0YXRlX2xvY2spOworCisJCXY0bDJfbTJtX3NyY19idWZfcmVtb3ZlKGN0eC0+bTJtX2N0eCk7CisJCXY0bDJfbTJtX2pvYl9maW5pc2goZGV2LT5tMm1fZGV2X2RlYywgY3R4LT5tMm1fY3R4KTsKKworCQkvKiBzZXRzIGVvcyBkYXRhIGZvciB2ZGVjIGlucHV0LiAqLworCQlhbWxfdmRlY19mbHVzaF9kZWNvZGVyKGN0eCk7CisKKwkJZ290byBvdXQ7CisJfQorCisJYnVmLmluZGV4CT0gdmItPmluZGV4OworCWJ1Zi52YWRkcgk9IHZiMl9wbGFuZV92YWRkcih2YiwgMCk7CisJYnVmLmFkZHIJPSBzZ19kbWFfYWRkcmVzcyhhbWxfYnVmLT5vdXRfc2d0LT5zZ2wpOworCWJ1Zi5zaXplCT0gdmItPnBsYW5lc1swXS5ieXRlc3VzZWQ7CisJYnVmLm1vZGVsCT0gdmItPm1lbW9yeTsKKwlidWYudGltZXN0YW1wCT0gdmItPnRpbWVzdGFtcDsKKwlidWYubWV0YV9wdHIJPSAodWxvbmcpYW1sX2J1Zi0+bWV0YV9kYXRhOworCisJaWYgKCFidWYudmFkZHIgJiYgIWJ1Zi5hZGRyKSB7CisJCXY0bDJfbTJtX2pvYl9maW5pc2goZGV2LT5tMm1fZGV2X2RlYywgY3R4LT5tMm1fY3R4KTsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJpZD0lZCBzcmNfYWRkciBpcyBOVUxMLlxuIiwgdmItPmluZGV4KTsKKwkJZ290byBvdXQ7CisJfQorCisJYW1sX2J1Zi0+dXNlZCA9IHRydWU7CisKKwkvKiB2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywKKwkJInNpemU6IDB4JXp4LCBjcmM6IDB4JXhcbiIsCisJCWJ1Zi5zaXplLCBjcmMzMigwLCBidWYudmEsIGJ1Zi5zaXplKSk7Ki8KKworCS8qIHB0cyA9ICh0aW1lIC8gMTBlNikgKiAoOTBrIC8gZnBzKSAqLworCS8qdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FWElORk8sCisJCSJ0aW1lc3RhbXA6IDB4JWxseFxuIiwgc3JjX2J1Zi0+dGltZXN0YW1wKTsqLworCisJaWYgKGN0eC0+aXNfZHJtX21vZGUgJiYKKwkJKGJ1Zi5tb2RlbCA9PSBWQjJfTUVNT1JZX0RNQUJVRikpIHsKKwkJQVRSQUNFX0NPVU5URVIoIlZPX0lOX1ZTSU5LLTIud3JpdGVfc2VjdXJlIiwgYnVmLnNpemUpOworCX0gZWxzZSB7CisJCUFUUkFDRV9DT1VOVEVSKCJWT19JTl9WU0lOSy0yLndyaXRlIiwgYnVmLnNpemUpOworCX0KKworCUFUUkFDRV9DT1VOVEVSKCJWX1NUX1ZTSU5LLWlucHV0X2J1ZmZlcmluZyIsIHZkZWNfZnJhbWVfbnVtYmVyKGN0eC0+YWRhX2N0eCkpOworCisJcmV0ID0gdmRlY19pZl9kZWNvZGUoY3R4LCAmYnVmLCAmcmVzX2NoZyk7CisJaWYgKHJldCA+IDApIHsKKwkJLyoKKwkJICogd2Ugb25seSByZXR1cm4gc3JjIGJ1ZmZlciB3aXRoIFZCMl9CVUZfU1RBVEVfRE9ORQorCQkgKiB3aGVuIGRlY29kZSBzdWNjZXNzIHdpdGhvdXQgcmVzb2x1dGlvbiBjaGFuZ2UuCisJCSAqLworCQlhbWxfYnVmLT51c2VkID0gZmFsc2U7CisJCXY0bDJfbTJtX3NyY19idWZfcmVtb3ZlKGN0eC0+bTJtX2N0eCk7CisKKwkJaWYgKGN0eC0+aXNfZHJtX21vZGUgJiYKKwkJCShidWYubW9kZWwgPT0gVkIyX01FTU9SWV9ETUFCVUYpKSB7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmN0eC0+d3EpOworCQl9IGVsc2UgeworCQkJQVRSQUNFX0NPVU5URVIoIlZPX09VVF9WU0lOSy0wLndydGllX2VuZCIsIGJ1Zi5zaXplKTsKKwkJCXY0bDJfYnVmZl9kb25lKCZhbWxfYnVmLT52YiwKKwkJCQlWQjJfQlVGX1NUQVRFX0RPTkUpOworCQl9CisJfSBlbHNlIGlmIChyZXQgJiYgcmV0ICE9IC1FQUdBSU4pIHsKKwkJYW1sX2J1Zi0+dXNlZCA9IGZhbHNlOworCQl2NGwyX20ybV9zcmNfYnVmX3JlbW92ZShjdHgtPm0ybV9jdHgpOworCisJCWlmIChjdHgtPmlzX2RybV9tb2RlICYmCisJCQkoYnVmLm1vZGVsID09IFZCMl9NRU1PUllfRE1BQlVGKSkgeworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjdHgtPndxKTsKKwkJfSBlbHNlIHsKKwkJCUFUUkFDRV9DT1VOVEVSKCJWT19PVVRfVlNJTkstMy53cml0ZV9lcnJvciIsIGJ1Zi5zaXplKTsKKwkJCXY0bDJfYnVmZl9kb25lKCZhbWxfYnVmLT52YiwKKwkJCQlWQjJfQlVGX1NUQVRFX0VSUk9SKTsKKwkJfQorCisJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkiZXJyb3IgcHJvY2Vzc2luZyBzcmMgZGF0YS4gJWQuXG4iLCByZXQpOworCX0gZWxzZSBpZiAocmVzX2NoZykgeworCQkvKiB3YWl0IHRoZSBEUEIgc3RhdGUgdG8gYmUgcmVhZHkuICovCisJCWFtbF93YWl0X2J1Zl9yZWFkeShjdHgpOworCisJCWFtbF9idWYtPnVzZWQgPSBmYWxzZTsKKwkJYW1sX3ZkZWNfcGljX2luZm9fdXBkYXRlKGN0eCk7CisJCS8qCisJCSAqIE9uIGVuY291bnRlcmluZyBhIHJlc29sdXRpb24gY2hhbmdlIGluIHRoZSBzdHJlYW0uCisJCSAqIFRoZSBkcml2ZXIgbXVzdCBmaXJzdCBwcm9jZXNzIGFuZCBkZWNvZGUgYWxsCisJCSAqIHJlbWFpbmluZyBidWZmZXJzIGZyb20gYmVmb3JlIHRoZSByZXNvbHV0aW9uIGNoYW5nZQorCQkgKiBwb2ludCwgc28gY2FsbCBmbHVzaCBkZWNvZGUgaGVyZQorCQkgKi8KKwkJbXV0ZXhfbG9jaygmY3R4LT5zdGF0ZV9sb2NrKTsKKwkJaWYgKGN0eC0+c3RhdGUgPT0gQU1MX1NUQVRFX0FDVElWRSkgeworCQkJY3R4LT5zdGF0ZSA9IEFNTF9TVEFURV9GTFVTSElORzsvLyBwcmVwYXJlIGZsdXNoaW5nCisJCQlBVFJBQ0VfQ09VTlRFUigiVl9TVF9WU0lOSy1zdGF0ZSIsIGN0eC0+c3RhdGUpOworCQkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19TVEFURSwKKwkJCQkidmNvZGVjIHN0YXRlIChBTUxfU1RBVEVfRkxVU0hJTkctUkVTQ0hHKVxuIik7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZjdHgtPnN0YXRlX2xvY2spOworCisJCWN0eC0+djRsX3Jlc29sdXRpb25fY2hhbmdlID0gdHJ1ZTsKKwkJd2hpbGUgKGN0eC0+bTJtX2N0eC0+am9iX2ZsYWdzICYgVFJBTlNfUlVOTklORykgeworCQkJdjRsMl9tMm1fam9iX3BhdXNlKGRldi0+bTJtX2Rldl9kZWMsIGN0eC0+bTJtX2N0eCk7CisJCX0KKworCQlhbWxfdmRlY19mbHVzaF9kZWNvZGVyKGN0eCk7CisKKwkJZ290byBvdXQ7CisJfSBlbHNlIHsKKwkJQVRSQUNFX0NPVU5URVIoIlZPX09VVF9WU0lOSy0xLndyaXRlX2FnYWluIiwgYnVmLnNpemUpOworCQkvKiBkZWNvZGVyIGlzIGxhY2sgb2YgcmVzb3VyY2UsIHJldHJ5IGFmdGVyIHNob3J0IGRlbGF5ICovCisJCWlmICh2ZGVjX2dldF9pbnN0YW5jZV9udW0oKSA8IDIpCisJCQl1c2xlZXBfcmFuZ2UoMjAwMCwgNDAwMCk7CisJfQorCisJdjRsMl9tMm1fam9iX2ZpbmlzaChkZXYtPm0ybV9kZXZfZGVjLCBjdHgtPm0ybV9jdHgpOworb3V0OgorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgYW1sX3ZkZWNfcmVzZXQoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgpCit7CisJaWYgKGN0eC0+c3RhdGUgPT0gQU1MX1NUQVRFX0FCT1JUKSB7CisJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkidGhlIGRlY29kZXIgd2lsbCBiZSBleGl0ZWQuXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGFtbF9jb2RlY19yZXNldChjdHgtPmFkYV9jdHgsICZjdHgtPnJlc2V0X2ZsYWcpKSB7CisJCWN0eC0+c3RhdGUgPSBBTUxfU1RBVEVfQUJPUlQ7CisJCUFUUkFDRV9DT1VOVEVSKCJWX1NUX1ZTSU5LLXN0YXRlIiwgY3R4LT5zdGF0ZSk7CisJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfU1RBVEUsCisJCQkidmNvZGVjIHN0YXRlIChBTUxfU1RBVEVfQUJPUlQpLlxuIik7CisJfQorb3V0OgorCWNvbXBsZXRlKCZjdHgtPmNvbXApOworCXJldHVybjsKK30KKwordm9pZCB3YWl0X3Zjb2RlY19lbmRpbmcoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgpCit7CisJLyogZGlzYWJsZSBxdWV1ZSBvdXRwdXQgaXRlbSB0byB3b3JrZXIuICovCisJY3R4LT5vdXRwdXRfdGhyZWFkX3JlYWR5ID0gZmFsc2U7CisJY3R4LT5pc19zdHJlYW1fb2ZmID0gdHJ1ZTsKKworCS8qIGZsdXNoIG91dHB1dCBidWZmZXIgd29ya2VyLiAqLworCWNhbmNlbF93b3JrX3N5bmMoJmN0eC0+ZGVjb2RlX3dvcmspOworCWNhbmNlbF93b3JrX3N5bmMoJmN0eC0+ZG1hYnVmZl9yZWN5Y2xlX3dvcmspOworCisJLyogY2xlYW4gb3V0cHV0IGNhY2hlIGFuZCBkZWNvZGVyIHN0YXR1cyAuICovCisJaWYgKGN0eC0+c3RhdGUgPiBBTUxfU1RBVEVfSU5JVCkKKwkJYW1sX3ZkZWNfcmVzZXQoY3R4KTsKKworCS8qIHBhdXNlIHRoZSBqb2IgYW5kIGNsZWFuIHRyYW5zIHN0YXR1cy4gKi8KKwl3aGlsZSAoY3R4LT5tMm1fY3R4LT5qb2JfZmxhZ3MgJiBUUkFOU19SVU5OSU5HKSB7CisJCXY0bDJfbTJtX2pvYl9wYXVzZShjdHgtPmRldi0+bTJtX2Rldl9kZWMsIGN0eC0+bTJtX2N0eCk7CisJfQorCisJY3R4LT52NGxfY29kZWNfZHBiX3JlYWR5ID0gZmFsc2U7Cit9CisKK3ZvaWQgYW1sX3RocmVhZF9jYXB0dXJlX3dvcmtlcihzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgdmIyX3Y0bDJfYnVmZmVyICp2YiA9IE5VTEw7CisJc3RydWN0IGFtbF92aWRlb19kZWNfYnVmICphbWxfYnVmZiA9IE5VTEw7CisJc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKmZiID0gTlVMTDsKKworCWZvciAoOzspIHsKKwkJbXV0ZXhfbG9jaygmY3R4LT5jYXB0dXJlX2J1ZmZlcl9sb2NrKTsKKwkJaWYgKCFrZmlmb19nZXQoJmN0eC0+Y2FwdHVyZV9idWZmZXIsICZ2YikpIHsKKwkJCW11dGV4X3VubG9jaygmY3R4LT5jYXB0dXJlX2J1ZmZlcl9sb2NrKTsKKwkJCWJyZWFrOworCQl9CisJCW11dGV4X3VubG9jaygmY3R4LT5jYXB0dXJlX2J1ZmZlcl9sb2NrKTsKKworCQlhbWxfYnVmZiA9IGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IGFtbF92aWRlb19kZWNfYnVmLCB2Yik7CisJCWZiID0gJmFtbF9idWZmLT5mcmFtZV9idWZmZXI7CisKKwkJaWYgKGN0eC0+aXNfc3RyZWFtX29mZikKKwkJCWNvbnRpbnVlOworCisJCXBvc3RfZnJhbWVfdG9fdXBwZXIoY3R4LCBmYik7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoYW1sX3RocmVhZF9jYXB0dXJlX3dvcmtlcik7CisKK3N0YXRpYyBpbnQgdmRlY19jYXB0dXJlX3RocmVhZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBhbWxfdmRlY190aHJlYWQgKnRocmVhZCA9CisJCShzdHJ1Y3QgYW1sX3ZkZWNfdGhyZWFkICopIGRhdGE7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopIHRocmVhZC0+cHJpdjsKKworCWZvciAoOzspIHsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FWElORk8sCisJCQkiJXMsIHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIGN0eC0+c3RhdGUpOworCisJCWlmIChkb3duX2ludGVycnVwdGlibGUoJnRocmVhZC0+c2VtKSkKKwkJCWJyZWFrOworCisJCWlmICh0aHJlYWQtPnN0b3ApCisJCQlicmVhazsKKworCQkvKiBoYW5kbGUgZXZlbnQuICovCisJCXRocmVhZC0+ZnVuYyhjdHgpOworCX0KKworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBhbWxfdGhyZWFkX3Bvc3RfdGFzayhzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCwKKwllbnVtIGFtbF90aHJlYWRfdHlwZSB0eXBlKQoreworCXN0cnVjdCBhbWxfdmRlY190aHJlYWQgKnRocmVhZCA9IE5VTEw7CisJdWxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3R4LT50c3Bsb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0aHJlYWQsICZjdHgtPnZkZWNfdGhyZWFkX2xpc3QsIG5vZGUpIHsKKwkJaWYgKHRocmVhZC0+dGFzayA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJaWYgKHRocmVhZC0+dHlwZSA9PSB0eXBlKQorCQkJdXAoJnRocmVhZC0+c2VtKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3R4LT50c3Bsb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhbWxfdGhyZWFkX3Bvc3RfdGFzayk7CisKK2ludCBhbWxfdGhyZWFkX3N0YXJ0KHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4LCBhbWxfdGhyZWFkX2Z1bmMgZnVuYywKKwllbnVtIGFtbF90aHJlYWRfdHlwZSB0eXBlLCBjb25zdCBjaGFyICp0aHJlYWRfbmFtZSkKK3sKKwlzdHJ1Y3QgYW1sX3ZkZWNfdGhyZWFkICp0aHJlYWQ7CisJc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtID0geyAuc2NoZWRfcHJpb3JpdHkgPSBNQVhfUlRfUFJJTyAtIDEgfTsKKwlpbnQgcmV0ID0gMDsKKworCXRocmVhZCA9IGt6YWxsb2Moc2l6ZW9mKCp0aHJlYWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAodGhyZWFkID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJdGhyZWFkLT50eXBlID0gdHlwZTsKKwl0aHJlYWQtPmZ1bmMgPSBmdW5jOworCXRocmVhZC0+cHJpdiA9IGN0eDsKKwlzZW1hX2luaXQoJnRocmVhZC0+c2VtLCAwKTsKKworCXRocmVhZC0+dGFzayA9IGt0aHJlYWRfcnVuKHZkZWNfY2FwdHVyZV90aHJlYWQsIHRocmVhZCwgImFtbC0lcy0lZCIsIHRocmVhZF9uYW1lLCBjdHgtPmlkKTsKKwlpZiAoSVNfRVJSKHRocmVhZC0+dGFzaykpIHsKKwkJcmV0ID0gUFRSX0VSUih0aHJlYWQtPnRhc2spOworCQl0aHJlYWQtPnRhc2sgPSBOVUxMOworCQlnb3RvIGVycjsKKwl9CisJc2NoZWRfc2V0c2NoZWR1bGVyX25vY2hlY2sodGhyZWFkLT50YXNrLCBTQ0hFRF9GSUZPLCAmcGFyYW0pOworCisJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FWElORk8sCisJCQkiJXMsIHBvbGljeSBpczolZCBwcmlvcml0eSBpczolZFxuIiwKKwkJCV9fZnVuY19fLCB0aHJlYWQtPnRhc2stPnBvbGljeSwgdGhyZWFkLT50YXNrLT5ydF9wcmlvcml0eSk7CisKKwlsaXN0X2FkZCgmdGhyZWFkLT5ub2RlLCAmY3R4LT52ZGVjX3RocmVhZF9saXN0KTsKKworCXJldHVybiAwOworCitlcnI6CisJa2ZyZWUodGhyZWFkKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhbWxfdGhyZWFkX3N0YXJ0KTsKKwordm9pZCBhbWxfdGhyZWFkX3N0b3Aoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgpCit7CisJc3RydWN0IGFtbF92ZGVjX3RocmVhZCAqdGhyZWFkID0gTlVMTDsKKwl1bG9uZyBmbGFnczsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmY3R4LT52ZGVjX3RocmVhZF9saXN0KSkgeworCQl0aHJlYWQgPSBsaXN0X2VudHJ5KGN0eC0+dmRlY190aHJlYWRfbGlzdC5uZXh0LAorCQkJc3RydWN0IGFtbF92ZGVjX3RocmVhZCwgbm9kZSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjdHgtPnRzcGxvY2ssIGZsYWdzKTsKKwkJbGlzdF9kZWwoJnRocmVhZC0+bm9kZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0eC0+dHNwbG9jaywgZmxhZ3MpOworCisJCXRocmVhZC0+c3RvcCA9IHRydWU7CisJCXVwKCZ0aHJlYWQtPnNlbSk7CisJCWt0aHJlYWRfc3RvcCh0aHJlYWQtPnRhc2spOworCQl0aHJlYWQtPnRhc2sgPSBOVUxMOworCQlrZnJlZSh0aHJlYWQpOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFtbF90aHJlYWRfc3RvcCk7CisKK3N0YXRpYyBpbnQgdmlkaW9jX3RyeV9kZWNvZGVyX2NtZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9kZWNvZGVyX2NtZCAqY21kKQoreworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOworCisJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19QUk9ULAorCQkiJXMsIGNtZDogJXVcbiIsIF9fZnVuY19fLCBjbWQtPmNtZCk7CisKKwlzd2l0Y2ggKGNtZC0+Y21kKSB7CisJY2FzZSBWNEwyX0RFQ19DTURfU1RPUDoKKwljYXNlIFY0TDJfREVDX0NNRF9TVEFSVDoKKwkJaWYgKGNtZC0+Y21kID09IFY0TDJfREVDX0NNRF9TVEFSVCkgeworCQkJaWYgKGNtZC0+c3RhcnQuc3BlZWQgPT0gfjApCisJCQkJY21kLT5zdGFydC5zcGVlZCA9IDA7CisJCQlpZiAoY21kLT5zdGFydC5mb3JtYXQgPT0gfjApCisJCQkJY21kLT5zdGFydC5mb3JtYXQgPSAwOworCQl9CisKKwkJaWYgKGNtZC0+ZmxhZ3MgPT0gfjApCisJCQljbWQtPmZsYWdzID0gMDsKKworCQlpZiAoKGNtZC0+ZmxhZ3MgIT0gMCkgJiYgKGNtZC0+ZmxhZ3MgIT0gfjApKSB7CisJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCQkiY21kLT5mbGFncz0ldVxuIiwgY21kLT5mbGFncyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZGVjb2Rlcl9jbWQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfZGVjb2Rlcl9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IGZoX3RvX2N0eChwcml2KTsKKwlzdHJ1Y3QgdmIyX3F1ZXVlICpzcmNfdnEsICpkc3RfdnE7CisJaW50IHJldDsKKworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfUFJPVCwKKwkJIiVzLCBjbWQ6ICV1XG4iLCBfX2Z1bmNfXywgY21kLT5jbWQpOworCisJcmV0ID0gdmlkaW9jX3RyeV9kZWNvZGVyX2NtZChmaWxlLCBwcml2LCBjbWQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzd2l0Y2ggKGNtZC0+Y21kKSB7CisJY2FzZSBWNEwyX0RFQ19DTURfU1RPUDoKKwkJc3JjX3ZxID0gdjRsMl9tMm1fZ2V0X3ZxKGN0eC0+bTJtX2N0eCwKKwkJCQlWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpOworCQlpZiAoIXZiMl9pc19zdHJlYW1pbmcoc3JjX3ZxKSkgeworCQkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCQkiT3V0cHV0IHN0cmVhbSBpcyBvZmYuIE5vIG5lZWQgdG8gZmx1c2guXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJZHN0X3ZxID0gdjRsMl9tMm1fZ2V0X3ZxKGN0eC0+bTJtX2N0eCwKKwkJCW11bHRpcGxhbmFyID8gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSA6CisJCQlWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpOworCQlpZiAoIXZiMl9pc19zdHJlYW1pbmcoZHN0X3ZxKSkgeworCQkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCQkiQ2FwdHVyZSBzdHJlYW0gaXMgb2ZmLiBObyBuZWVkIHRvIGZsdXNoLlxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIGZsdXNoIHBpcGVsaW5lICovCisJCXY0bDJfbTJtX2J1Zl9xdWV1ZShjdHgtPm0ybV9jdHgsICZjdHgtPmVtcHR5X2ZsdXNoX2J1Zi0+dmIpOworCQl2NGwyX20ybV90cnlfc2NoZWR1bGUoY3R4LT5tMm1fY3R4KTsvL3BheSBhdHRlbnRpb24KKwkJY3R4LT5yZWNlaXZlX2NtZF9zdG9wID0gdHJ1ZTsKKworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1BSSU5GTywKKwkJCSIlcywgcmVjZWl2ZSBjbWQgc3RvcCBhbmQgcHJlcGFyZSBmbHVzaCBwaXBlbGluZS5cbiIsIF9fZnVuY19fKTsKKwkJYnJlYWs7CisKKwljYXNlIFY0TDJfREVDX0NNRF9TVEFSVDoKKwkJZHN0X3ZxID0gdjRsMl9tMm1fZ2V0X3ZxKGN0eC0+bTJtX2N0eCwKKwkJCW11bHRpcGxhbmFyID8gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSA6CisJCQlWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpOworCQl2YjJfY2xlYXJfbGFzdF9idWZmZXJfZGVxdWV1ZWQoZHN0X3ZxKTsvL3BheSBhdHRlbnRpb24KKworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1BSSU5GTywKKwkJCSIlcywgcmVjZWl2ZSBjbWQgc3RhcnQuXG4iLCBfX2Z1bmNfXyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFtbF93YWl0X3Jlc291cmNlKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4KQoreworCXVsb25nIGV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDAwKTsKKworCXdoaWxlIChhdG9taWNfcmVhZCgmY3R4LT5kZXYtPnZwcF9jb3VudCkgPj0gbWF4X2RpX2luc3RhbmNlKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGV4cGlyZXMpKSB7CisJCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1BSSU5GTywKKwkJCQkid2FpdCByZXNvdXJjZSB0aW1lb3V0LlxuIik7CisJCQlicmVhazsKKwkJfQorCQl1c2xlZXBfcmFuZ2UoMjAwMCwgNDAwMCk7CisJfQorfQorCitzdGF0aWMgaW50IHZpZGlvY19kZWNvZGVyX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCWVudW0gdjRsMl9idWZfdHlwZSBpKQoreworCXN0cnVjdCB2NGwyX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IGZoX3RvX2N0eChmaCk7CisJc3RydWN0IHZiMl9xdWV1ZSAqcTsKKworCXEgPSB2NGwyX20ybV9nZXRfdnEoZmgtPm0ybV9jdHgsIGkpOworCWlmICghVjRMMl9UWVBFX0lTX09VVFBVVChxLT50eXBlKSAmJgorCQljdHgtPmlzX3N0cmVhbV9vZmYpIHsKKwkJaWYgKGN0eC0+dnBwX2lzX25lZWQpIHsKKwkJCWludCByZXQ7CisKKwkJCWlmIChjdHgtPnZwcF9jZmcuZm10ID09IDApCisJCQkJY3R4LT52cHBfY2ZnLmZtdCA9IGN0eC0+Y2FwX3BpeF9mbXQ7CisKKwkJCWlmIChjdHgtPnZwcCA9PSBOVUxMKQorCQkJCWFtbF93YWl0X3Jlc291cmNlKGN0eCk7CisKKwkJCWlmICgoYXRvbWljX3JlYWQoJmN0eC0+ZGV2LT52cHBfY291bnQpIDwgbWF4X2RpX2luc3RhbmNlKSB8fAorCQkJCShjdHgtPnZwcCAhPSBOVUxMKSkgeworCQkJCWlmIChjdHgtPnZwcCAmJiBjdHgtPnZwcF9jZmcuaXNfdnBwX3Jlc2V0ICYmCisJCQkJCShjdHgtPnZwcC0+aXNfcHJvZyA9PSBjdHgtPnZwcF9jZmcuaXNfcHJvZykgJiYKKwkJCQkJKGN0eC0+dnBwLT5pc19ieXBhc3NfcCA9PSBjdHgtPnZwcF9jZmcuaXNfYnlwYXNzX3ApICYmCisJCQkJCShjdHgtPnZwcC0+d29ya19tb2RlID09IGN0eC0+dnBwX2NmZy5tb2RlKSkgeworCQkJCQlhbWxfdjRsMl92cHBfcmVzZXQoY3R4LT52cHApOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChjdHgtPnZwcCkgeworCQkJCQkJYXRvbWljX2RlYygmY3R4LT5kZXYtPnZwcF9jb3VudCk7CisJCQkJCQlhbWxfdjRsMl92cHBfZGVzdHJveShjdHgtPnZwcCk7CisJCQkJCQljdHgtPnZwcCA9IE5VTEw7CisJCQkJCX0KKworCQkJCQlyZXQgPSBhbWxfdjRsMl92cHBfaW5pdChjdHgsICZjdHgtPnZwcF9jZmcsICZjdHgtPnZwcCk7CisJCQkJCWlmIChyZXQpIHsKKwkJCQkJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkJCQkJInZwcF93cmFwcGVyIGluaXQgZXJyOiVkIHZwcF9jZmcuZm10OiAlZFxuIiwKKwkJCQkJCQlyZXQsIGN0eC0+dnBwX2NmZy5mbXQpOworCQkJCQkJcmV0dXJuIHJldDsKKwkJCQkJfQorCisJCQkJCWF0b21pY19pbmMoJmN0eC0+ZGV2LT52cHBfY291bnQpOworCisJCQkJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfUFJJTkZPLAorCQkJCQkJInZwcF93cmFwcGVyIGluc3RhbmNlIGNvdW50OiAlZFxuIiwKKwkJCQkJCWF0b21pY19yZWFkKCZjdHgtPmRldi0+dnBwX2NvdW50KSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQljdHgtPnZwcF9jZmcuZW5hYmxlX2xvY2FsX2J1ZiA9IDA7CisJCQkJY3R4LT52cHBfY2ZnLmVuYWJsZV9uciA9IDA7CisJCQkJY3R4LT5waWNpbmZvLmRwYl9tYXJnaW4gKz0gY3R4LT52cHBfc2l6ZTsKKwkJCQljdHgtPmRwYl9zaXplID0gY3R4LT5waWNpbmZvLmRwYl9tYXJnaW4gKyBjdHgtPnBpY2luZm8uZHBiX2ZyYW1lczsKKwkJCQljdHgtPnZwcF9zaXplID0gMDsKKwkJCQl2ZGVjX2lmX3NldF9wYXJhbShjdHgsIFNFVF9QQVJBTV9QSUNfSU5GTywgJmN0eC0+cGljaW5mbyk7CisJCQkJY3R4LT52cHBfaXNfbmVlZCA9IGZhbHNlOworCQkJfQorCQkJY3R4LT52cHBfY2ZnLmlzX3ZwcF9yZXNldCA9IGZhbHNlOworCQl9IGVsc2UgeworCQkJaWYgKGN0eC0+dnBwKSB7CisJCQkJYXRvbWljX2RlYygmY3R4LT5kZXYtPnZwcF9jb3VudCk7CisJCQkJYW1sX3Y0bDJfdnBwX2Rlc3Ryb3koY3R4LT52cHApOworCQkJCWN0eC0+dnBwID0gTlVMTDsKKwkJCX0KKwkJfQorCisJCWlmIChjdHgtPmdlMmRfaXNfbmVlZCkgeworCQkJaW50IHJldDsKKworCQkJaWYgKGN0eC0+Z2UyZCkgeworCQkJCWFtbF92NGwyX2dlMmRfZGVzdHJveShjdHgtPmdlMmQpOworCQkJCWN0eC0+Z2UyZCA9IE5VTEw7CisJCQl9CisKKwkJCXJldCA9IGFtbF92NGwyX2dlMmRfaW5pdChjdHgsICZjdHgtPmdlMmRfY2ZnLCAmY3R4LT5nZTJkKTsKKwkJCWlmIChyZXQpIHsKKwkJCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJCQkiZ2UyZF93cmFwcGVyIGluaXQgZXJyOiVkXG4iLCByZXQpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKworCQljdHgtPmlzX3N0cmVhbV9vZmYgPSBmYWxzZTsKKwl9IGVsc2UKKwkJY3R4LT5pc19vdXRfc3RyZWFtX29mZiA9IGZhbHNlOworCisJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19QUk9ULAorCQkiJXMsIHR5cGU6ICVkXG4iLCBfX2Z1bmNfXywgcS0+dHlwZSk7CisKKwlyZXR1cm4gdjRsMl9tMm1faW9jdGxfc3RyZWFtb24oZmlsZSwgcHJpdiwgaSk7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2RlY29kZXJfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCWVudW0gdjRsMl9idWZfdHlwZSBpKQoreworCXN0cnVjdCB2NGwyX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IGZoX3RvX2N0eChmaCk7CisJc3RydWN0IHZiMl9xdWV1ZSAqcTsKKwl1bG9uZyBmbGFnczsKKworCXEgPSB2NGwyX20ybV9nZXRfdnEoZmgtPm0ybV9jdHgsIGkpOworCisJZmxhZ3MgPSBhbWxfdmNvZGVjX2N0eF9sb2NrKGN0eCk7CisKKwlpZiAoVjRMMl9UWVBFX0lTX09VVFBVVChxLT50eXBlKSkKKwkJY3R4LT5pc19vdXRfc3RyZWFtX29mZiA9IHRydWU7CisJZWxzZQorCQljdHgtPmlzX3N0cmVhbV9vZmYgPSB0cnVlOworCisJYW1sX3Zjb2RlY19jdHhfdW5sb2NrKGN0eCwgZmxhZ3MpOworCisJaWYgKCFWNEwyX1RZUEVfSVNfT1VUUFVUKHEtPnR5cGUpKSB7CisJCWlmIChjdHgtPnZwcCkgeworCQkJcmVjb25maWdfdnBwX3N0YXR1cyhjdHgpOworCQl9CisJfSBlbHNlIHsKKwkJY3R4LT5pbmRleF9kaXNwID0gMDsKKwl9CisKKwl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1BST1QsCisJCSIlcywgdHlwZTogJWRcbiIsIF9fZnVuY19fLCBxLT50eXBlKTsKKworCXJldHVybiB2NGwyX20ybV9pb2N0bF9zdHJlYW1vZmYoZmlsZSwgcHJpdiwgaSk7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2RlY29kZXJfcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwlzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcmIpCit7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPSBmaF90b19jdHgocHJpdik7CisJc3RydWN0IHY0bDJfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB2YjJfcXVldWUgKnE7CisKKwlxID0gdjRsMl9tMm1fZ2V0X3ZxKGZoLT5tMm1fY3R4LCByYi0+dHlwZSk7CisKKwlpZiAoIXJiLT5jb3VudCkgeworCQlpZiAoIVY0TDJfVFlQRV9JU19PVVRQVVQocmItPnR5cGUpKSB7CisJCQlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQKKwkJCQkoY3R4LT5wb3N0X2RvbmVfd3EsIGN0eC0+cG9zdF90b191cHBlcl9kb25lID09IHRydWUsCisJCQkJIG1zZWNzX3RvX2ppZmZpZXMoMjAwKSkgPT0gMCkgeworCQkJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkJCSJ3YWl0IHBvc3QgZnJhbWUgdG8gdXBwZXIgZmluaXNoIHRpbWVvdXQuXG4iKTsKKwkJCX0KKwkJfQorCQl2YjJfcXVldWVfcmVsZWFzZShxKTsKKwl9CisKKwl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1BST1QsCisJCSIlcywgdHlwZTogJWQsIGNvdW50OiAlZFxuIiwKKwkJX19mdW5jX18sIHEtPnR5cGUsIHJiLT5jb3VudCk7CisKKwlpZiAoIVY0TDJfVFlQRV9JU19PVVRQVVQocmItPnR5cGUpKSB7CisJCS8qIGRyaXZlciBuZWVkcyBtYXRjaCB2NGwgYnVmZmVyIG51bWJlciB3aXRoIHRvdGFsIHNpemUqLworCQlpZiAocmItPmNvdW50ID4gQ1RYX0JVRl9UT1RBTChjdHgpKSB7CisJCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1BST1QsCisJCQkJCSJyZXFidWZzIChzdDolZCkgJWQgLT4gJWRcbiIsCisJCQkJCWN0eC0+c3RhdGUsIHJiLT5jb3VudCwgQ1RYX0JVRl9UT1RBTChjdHgpKTsKKwkJCWN0eC0+cGljaW5mby5kcGJfbWFyZ2luICs9IChyYi0+Y291bnQgLSBDVFhfQlVGX1RPVEFMKGN0eCkpOworCQkJY3R4LT5kcGJfc2l6ZSA9IGN0eC0+cGljaW5mby5kcGJfZnJhbWVzICsgY3R4LT5waWNpbmZvLmRwYl9tYXJnaW47CisJCQl2ZGVjX2lmX3NldF9wYXJhbShjdHgsIFNFVF9QQVJBTV9QSUNfSU5GTywgJmN0eC0+cGljaW5mbyk7CisJCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1BST1QsCisJCQkJCSIlcyBidWYgdXBkYXRlZCwgZGVjOiAlZCAoJWQgKyAlZCksIHZwcCAlZFxuIiwKKwkJCQkJX19mdW5jX18sCisJCQkJCWN0eC0+ZHBiX3NpemUsCisJCQkJCWN0eC0+cGljaW5mby5kcGJfZnJhbWVzLAorCQkJCQljdHgtPnBpY2luZm8uZHBiX21hcmdpbiwKKwkJCQkJY3R4LT52cHBfc2l6ZSk7CisJCQkvL3JiLT5jb3VudCA9IGN0eC0+ZHBiX3NpemU7CisJCX0KKwl9IGVsc2UgeworCQljdHgtPm91dHB1dF9kbWFfbW9kZSA9CisJCQkocmItPm1lbW9yeSA9PSBWQjJfTUVNT1JZX0RNQUJVRikgPyAxIDogMDsKKworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0lOUFVULAorCQkJIm91dHB1dCBidWZmZXIgbWVtb3J5IG1vZGUgaXMgJWRcbiIsIHJiLT5tZW1vcnkpOworCX0KKworCXJldHVybiB2NGwyX20ybV9pb2N0bF9yZXFidWZzKGZpbGUsIHByaXYsIHJiKTsKK30KKworc3RhdGljIGludCB2aWRpb2NfdmRlY19xdWVyeWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwlzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IGZoX3RvX2N0eChwcml2KTsKKworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfUFJPVCwKKwkJIiVzLCB0eXBlOiAlZFxuIiwgX19mdW5jX18sIGJ1Zi0+dHlwZSk7CisKKwlyZXR1cm4gdjRsMl9tMm1faW9jdGxfcXVlcnlidWYoZmlsZSwgcHJpdiwgYnVmKTsKK30KKworc3RhdGljIGludCB2aWRpb2NfdmRlY19leHBidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJc3RydWN0IHY0bDJfZXhwb3J0YnVmZmVyICplYikKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IGZoX3RvX2N0eChwcml2KTsKKworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfUFJPVCwKKwkJIiVzLCB0eXBlOiAlZFxuIiwgX19mdW5jX18sIGViLT50eXBlKTsKKworCXJldHVybiB2NGwyX20ybV9pb2N0bF9leHBidWYoZmlsZSwgcHJpdiwgZWIpOworfQorCit2b2lkIGFtbF92Y29kZWNfZGVjX3JlbGVhc2Uoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgpCit7CisJdWxvbmcgZmxhZ3M7CisKKwlpZiAoa3JlZl9yZWFkKCZjdHgtPmJveF9yZWYpKQorCQlrcmVmX3B1dCgmY3R4LT5ib3hfcmVmLCBib3hfcmVsZWFzZSk7CisKKwlmbGFncyA9IGFtbF92Y29kZWNfY3R4X2xvY2soY3R4KTsKKwljdHgtPnN0YXRlID0gQU1MX1NUQVRFX0FCT1JUOworCUFUUkFDRV9DT1VOVEVSKCJWX1NUX1ZTSU5LLXN0YXRlIiwgY3R4LT5zdGF0ZSk7CisJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19TVEFURSwKKwkJInZjb2RlYyBzdGF0ZSAoQU1MX1NUQVRFX0FCT1JUKVxuIik7CisJYW1sX3Zjb2RlY19jdHhfdW5sb2NrKGN0eCwgZmxhZ3MpOworCisJdmRlY19pZl9kZWluaXQoY3R4KTsKK30KKwordm9pZCBhbWxfdmNvZGVjX2RlY19zZXRfZGVmYXVsdF9wYXJhbXMoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgpCit7CisJc3RydWN0IGFtbF9xX2RhdGEgKnFfZGF0YTsKKworCWN0eC0+bTJtX2N0eC0+cV9sb2NrID0gJmN0eC0+ZGV2LT5kZXZfbXV0ZXg7CisJY3R4LT5maC5tMm1fY3R4ID0gY3R4LT5tMm1fY3R4OworCWN0eC0+ZmguY3RybF9oYW5kbGVyID0gJmN0eC0+Y3RybF9oZGw7CisJSU5JVF9XT1JLKCZjdHgtPmRlY29kZV93b3JrLCBhbWxfdmRlY193b3JrZXIpOworCWN0eC0+Y29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9SRUM3MDk7CisJY3R4LT55Y2Jjcl9lbmMgPSBWNEwyX1lDQkNSX0VOQ19ERUZBVUxUOworCWN0eC0+cXVhbnRpemF0aW9uID0gVjRMMl9RVUFOVElaQVRJT05fREVGQVVMVDsKKwljdHgtPnhmZXJfZnVuYyA9IFY0TDJfWEZFUl9GVU5DX0RFRkFVTFQ7CisJY3R4LT5kZXYtPmRlY19jYXBhYmlsaXR5ID0gMDsvL1ZDT0RFQ19DQVBBQklMSVRZXzRLX0RJU0FCTEVEOy8vZGlzYWJsZSA0aworCisJcV9kYXRhID0gJmN0eC0+cV9kYXRhW0FNTF9RX0RBVEFfU1JDXTsKKwltZW1zZXQocV9kYXRhLCAwLCBzaXplb2Yoc3RydWN0IGFtbF9xX2RhdGEpKTsKKwlxX2RhdGEtPnZpc2libGVfd2lkdGggPSBERlRfQ0ZHX1dJRFRIOworCXFfZGF0YS0+dmlzaWJsZV9oZWlnaHQgPSBERlRfQ0ZHX0hFSUdIVDsKKwlxX2RhdGEtPmNvZGVkX3dpZHRoID0gREZUX0NGR19XSURUSDsKKwlxX2RhdGEtPmNvZGVkX2hlaWdodCA9IERGVF9DRkdfSEVJR0hUOworCXFfZGF0YS0+Zm10ID0gJmFtbF92aWRlb19mb3JtYXRzW09VVF9GTVRfSURYXTsKKwlxX2RhdGEtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCisJcV9kYXRhLT5zaXplaW1hZ2VbMF0gPSAoMTAyNCAqIDEwMjQpOy8vREZUX0NGR19XSURUSCAqIERGVF9DRkdfSEVJR0hUOyAvLzFtCisJcV9kYXRhLT5ieXRlc3BlcmxpbmVbMF0gPSAwOworCisJcV9kYXRhID0gJmN0eC0+cV9kYXRhW0FNTF9RX0RBVEFfRFNUXTsKKwltZW1zZXQocV9kYXRhLCAwLCBzaXplb2Yoc3RydWN0IGFtbF9xX2RhdGEpKTsKKwlxX2RhdGEtPnZpc2libGVfd2lkdGggPSBERlRfQ0ZHX1dJRFRIOworCXFfZGF0YS0+dmlzaWJsZV9oZWlnaHQgPSBERlRfQ0ZHX0hFSUdIVDsKKwlxX2RhdGEtPmNvZGVkX3dpZHRoID0gREZUX0NGR19XSURUSDsKKwlxX2RhdGEtPmNvZGVkX2hlaWdodCA9IERGVF9DRkdfSEVJR0hUOworCXFfZGF0YS0+Zm10ID0gJmFtbF92aWRlb19mb3JtYXRzW0NBUF9GTVRfSURYXTsKKwlpZiAoc3VwcG9ydF9mb3JtYXRfSTQyMCkKKwkJcV9kYXRhLT5mbXQgPSAmYW1sX3ZpZGVvX2Zvcm1hdHNbQ0FQX0ZNVF9JNDIwX0lEWF07CisKKwlxX2RhdGEtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCisJdjRsX2JvdW5kX2FsaWduX2ltYWdlKCZxX2RhdGEtPmNvZGVkX3dpZHRoLAorCQkJCUFNTF9WREVDX01JTl9XLAorCQkJCUFNTF9WREVDX01BWF9XLCA0LAorCQkJCSZxX2RhdGEtPmNvZGVkX2hlaWdodCwKKwkJCQlBTUxfVkRFQ19NSU5fSCwKKwkJCQlBTUxfVkRFQ19NQVhfSCwgNSwgNik7CisKKwlxX2RhdGEtPnNpemVpbWFnZVswXSA9IHFfZGF0YS0+Y29kZWRfd2lkdGggKiBxX2RhdGEtPmNvZGVkX2hlaWdodDsKKwlxX2RhdGEtPmJ5dGVzcGVybGluZVswXSA9IHFfZGF0YS0+Y29kZWRfd2lkdGg7CisJcV9kYXRhLT5zaXplaW1hZ2VbMV0gPSBxX2RhdGEtPnNpemVpbWFnZVswXSAvIDI7CisJcV9kYXRhLT5ieXRlc3BlcmxpbmVbMV0gPSBxX2RhdGEtPmNvZGVkX3dpZHRoOworCWN0eC0+cmVzZXRfZmxhZyA9IFY0TF9SRVNFVF9NT0RFX05PUk1BTDsKKworCWN0eC0+ZmJfb3BzLnF1ZXJ5CT0gZmJfYnVmZl9xdWVyeTsKKwljdHgtPmZiX29wcy5hbGxvYwk9IGZiX2J1ZmZfZnJvbV9xdWV1ZTsKKworCWN0eC0+c3RhdGUgPSBBTUxfU1RBVEVfSURMRTsKKwlBVFJBQ0VfQ09VTlRFUigiVl9TVF9WU0lOSy1zdGF0ZSIsIGN0eC0+c3RhdGUpOworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfU1RBVEUsCisJCSJ2Y29kZWMgc3RhdGUgKEFNTF9TVEFURV9JRExFKVxuIik7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3ZkZWNfcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwlzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IGZoX3RvX2N0eChwcml2KTsKKwlpbnQgcmV0OworCisJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19QUk9ULAorCQkiJXMsIHR5cGU6ICVkXG4iLCBfX2Z1bmNfXywgYnVmLT50eXBlKTsKKworCWlmIChjdHgtPnN0YXRlID09IEFNTF9TVEFURV9BQk9SVCkgeworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJIkNhbGwgb24gUUJVRiBhZnRlciB1bnJlY292ZXJhYmxlIGVycm9yLCB0eXBlID0gJXNcbiIsCisJCQlWNEwyX1RZUEVfSVNfT1VUUFVUKGJ1Zi0+dHlwZSkgPyAiT1VUIiA6ICJJTiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXQgPSB2NGwyX20ybV9xYnVmKGZpbGUsIGN0eC0+bTJtX2N0eCwgYnVmKTsKKworCWlmIChWNEwyX1RZUEVfSVNfT1VUUFVUKGJ1Zi0+dHlwZSkpIHsKKwkJaWYgKFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUihidWYtPnR5cGUpKSB7CisJCQlpZiAocmV0ID09IC1FQUdBSU4pCisJCQkJQVRSQUNFX0NPVU5URVIoIlZPX0lOX1ZTSU5LLTEucXVlX2FnYWluIiwgYnVmLT5tLnBsYW5lc1swXS5ieXRlc3VzZWQpOworCQkJZWxzZQorCQkJCUFUUkFDRV9DT1VOVEVSKCJWT19JTl9WU0lOSy0wLnF1ZSIsIGJ1Zi0+bS5wbGFuZXNbMF0uYnl0ZXN1c2VkKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJCQlBVFJBQ0VfQ09VTlRFUigiVk9fSU5fVlNJTkstMS5xdWVfYWdhaW4iLCBidWYtPmxlbmd0aCk7CisJCQllbHNlCisJCQkJQVRSQUNFX0NPVU5URVIoIlZPX0lOX1ZTSU5LLTAucXVlIiwgYnVmLT5sZW5ndGgpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHJldCA9PSAtRUFHQUlOKQorCQkJQVRSQUNFX0NPVU5URVIoIlZDX0lOX1ZTSU5LLTEucXVlX2FnYWluIiwgYnVmLT5pbmRleCk7CisJCWVsc2UKKwkJCUFUUkFDRV9DT1VOVEVSKCJWQ19JTl9WU0lOSy0wLnF1ZSIsIGJ1Zi0+aW5kZXgpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3ZkZWNfZHFidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCit7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPSBmaF90b19jdHgocHJpdik7CisJaW50IHJldDsKKworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfUFJPVCwKKwkJIiVzLCB0eXBlOiAlZFxuIiwgX19mdW5jX18sIGJ1Zi0+dHlwZSk7CisKKwlpZiAoY3R4LT5zdGF0ZSA9PSBBTUxfU1RBVEVfQUJPUlQpIHsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJDYWxsIG9uIERRQlVGIGFmdGVyIHVucmVjb3ZlcmFibGUgZXJyb3IsIHR5cGUgPSAlc1xuIiwKKwkJCVY0TDJfVFlQRV9JU19PVVRQVVQoYnVmLT50eXBlKSA/ICJPVVQiIDogIklOIik7CisJCWlmICghVjRMMl9UWVBFX0lTX09VVFBVVChidWYtPnR5cGUpKQorCQkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0ID0gdjRsMl9tMm1fZHFidWYoZmlsZSwgY3R4LT5tMm1fY3R4LCBidWYpOworCWlmICghcmV0ICYmICFWNEwyX1RZUEVfSVNfT1VUUFVUKGJ1Zi0+dHlwZSkpIHsKKwkJc3RydWN0IHZiMl9xdWV1ZSAqdnE7CisJCXN0cnVjdCB2YjJfdjRsMl9idWZmZXIgKnZiMl92NGwyID0gTlVMTDsKKwkJc3RydWN0IGFtbF92aWRlb19kZWNfYnVmICphbWxfYnVmID0gTlVMTDsKKwkJc3RydWN0IGZpbGUgKmZpbGUgPSBOVUxMOworCisJCXZxID0gdjRsMl9tMm1fZ2V0X3ZxKGN0eC0+bTJtX2N0eCwgYnVmLT50eXBlKTsKKwkJdmIyX3Y0bDIgPSB0b192YjJfdjRsMl9idWZmZXIodnEtPmJ1ZnNbYnVmLT5pbmRleF0pOworCQlhbWxfYnVmID0gY29udGFpbmVyX29mKHZiMl92NGwyLCBzdHJ1Y3QgYW1sX3ZpZGVvX2RlY19idWYsIHZiKTsKKwkJYW1sX2J1Zi0+cHJpdmRhdGEudmJfaGFuZGxlCT0gKHVsb25nKSBhbWxfYnVmOworCQlhbWxfYnVmLT5wcml2ZGF0YS52NGxfZGVjX2N0eAk9ICh1bG9uZykgY3R4OworCisJCWZpbGUgPSBmZ2V0KHZiMl92NGwyLT5wcml2YXRlKTsKKwkJaWYgKGZpbGUgJiYgaXNfdjRsMl9idWZfZmlsZShmaWxlKSkgeworCQkJZG1hYnVmX2ZkX2luc3RhbGxfZGF0YSh2YjJfdjRsMi0+cHJpdmF0ZSwKKwkJCQkodm9pZCopJmFtbF9idWYtPnByaXZkYXRhLAorCQkJCXNpemVvZihzdHJ1Y3QgZmlsZV9wcml2YXRlX2RhdGEpKTsKKwkJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVhJTkZPLCAiZGlzcDogJWQsIHZmOiAlbHhcbiIsCisJCQkJYW1sX2J1Zi0+cHJpdmRhdGEudmYuaW5kZXhfZGlzcCwKKwkJCQkodWxvbmcpIHY0bF9nZXRfdmZfaGFuZGxlKHZiMl92NGwyLT5wcml2YXRlKSk7CisJCQlmcHV0KGZpbGUpOworCQl9CisJfQorCisJaWYgKFY0TDJfVFlQRV9JU19PVVRQVVQoYnVmLT50eXBlKSkgeworCQlpZiAoVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSKGJ1Zi0+dHlwZSkpIHsKKwkJCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJCQlBVFJBQ0VfQ09VTlRFUigiVk9fT1VUX1ZTSU5LLTUuZGVxdWVfYWdhaW4iLCBidWYtPm0ucGxhbmVzWzBdLmJ5dGVzdXNlZCk7CisJCQllbHNlCisJCQkJQVRSQUNFX0NPVU5URVIoIlZPX09VVF9WU0lOSy00LmRlcXVlIiwgYnVmLT5tLnBsYW5lc1swXS5ieXRlc3VzZWQpOworCQl9IGVsc2UgeworCQkJaWYgKHJldCA9PSAtRUFHQUlOKQorCQkJCUFUUkFDRV9DT1VOVEVSKCJWT19PVVRfVlNJTkstNS5kZXF1ZV9hZ2FpbiIsIGJ1Zi0+bGVuZ3RoKTsKKwkJCWVsc2UKKwkJCQlBVFJBQ0VfQ09VTlRFUigiVk9fT1VUX1ZTSU5LLTQuZGVxdWUiLCBidWYtPmxlbmd0aCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAocmV0ID09IC1FQUdBSU4pCisJCQlBVFJBQ0VfQ09VTlRFUigiVkNfT1VUX1ZTSU5LLTMuZGVxdWVfYWdhaW4iLCBidWYtPmluZGV4KTsKKwkJZWxzZQorCQkJQVRSQUNFX0NPVU5URVIoIlZDX09VVF9WU0lOSy0yLmRlcXVlIiwgYnVmLT5pbmRleCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2aWRpb2NfdmRlY19xdWVyeWNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCit7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPSBmaF90b19jdHgocHJpdik7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmZkX2RlYyA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisKKwlzdHJsY3B5KGNhcC0+ZHJpdmVyLCBBTUxfVkNPREVDX0RFQ19OQU1FLCBzaXplb2YoY2FwLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGNhcC0+YnVzX2luZm8sIEFNTF9QTEFURk9STV9TVFIsIHNpemVvZihjYXAtPmJ1c19pbmZvKSk7CisJc3RybGNweShjYXAtPmNhcmQsIEFNTF9QTEFURk9STV9TVFIsIHNpemVvZihjYXAtPmNhcmQpKTsKKwljYXAtPmRldmljZV9jYXBzID0gdmZkX2RlYy0+ZGV2aWNlX2NhcHM7CisKKwl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1BST1QsICIlcywgJXNcbiIsIF9fZnVuY19fLCBjYXAtPmNhcmQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3ZkZWNfc3Vic2NyaWJlX2V2dChzdHJ1Y3QgdjRsMl9maCAqZmgsCisJY29uc3Qgc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uICpzdWIpCit7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPSBmaF90b19jdHgoZmgpOworCisJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19QUk9ULAorCQkiJXMsIHR5cGU6ICVkXG4iLCBfX2Z1bmNfXywgc3ViLT50eXBlKTsKKworCXN3aXRjaCAoc3ViLT50eXBlKSB7CisJY2FzZSBWNEwyX0VWRU5UX0VPUzoKKwkJcmV0dXJuIHY0bDJfZXZlbnRfc3Vic2NyaWJlKGZoLCBzdWIsIDIsIE5VTEwpOworCWNhc2UgVjRMMl9FVkVOVF9TT1VSQ0VfQ0hBTkdFOgorCQlyZXR1cm4gdjRsMl9zcmNfY2hhbmdlX2V2ZW50X3N1YnNjcmliZShmaCwgc3ViKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gdjRsMl9jdHJsX3N1YnNjcmliZV9ldmVudChmaCwgc3ViKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3ZkZWNfZXZlbnRfdW5zdWJzY3JpYmUoc3RydWN0IHY0bDJfZmggKmZoLAorCWNvbnN0IHN0cnVjdCB2NGwyX2V2ZW50X3N1YnNjcmlwdGlvbiAqc3ViKQoreworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KGZoKTsKKworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfUFJPVCwgIiVzLCB0eXBlOiAlZFxuIiwKKwkJX19mdW5jX18sIHN1Yi0+dHlwZSk7CisKKwlyZXR1cm4gdjRsMl9ldmVudF91bnN1YnNjcmliZShmaCwgc3ViKTsKK30KKworc3RhdGljIGludCB2aWRpb2NfdHJ5X2ZtdChzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYsIHN0cnVjdCBhbWxfdmlkZW9fZm10ICpmbXQpCit7CisJaW50IGk7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUgKnBpeF9tcCA9ICZmLT5mbXQucGl4X21wOworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCA9ICZmLT5mbXQucGl4OworCisJaWYgKFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUihmLT50eXBlKSkgeworCQlpZiAoVjRMMl9UWVBFX0lTX09VVFBVVChmLT50eXBlKSkgeworCQkJcGl4X21wLT5udW1fcGxhbmVzID0gMTsKKwkJCXBpeF9tcC0+cGxhbmVfZm10WzBdLmJ5dGVzcGVybGluZSA9IDA7CisKKwkJCWlmICgocGl4X21wLT5waXhlbGZvcm1hdCAhPSBWNEwyX1BJWF9GTVRfTVBFRzIpICYmCisJCQkgICAgKHBpeF9tcC0+cGl4ZWxmb3JtYXQgIT0gVjRMMl9QSVhfRk1UX0gyNjQpICYmCisJCQkgICAgKHBpeF9tcC0+cGl4ZWxmb3JtYXQgIT0gVjRMMl9QSVhfRk1UX01QRUcxKSkgeworCQkJCXBpeF9tcC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJCQl9IGVsc2UgaWYgKHBpeF9tcC0+ZmllbGQgIT0gVjRMMl9GSUVMRF9OT05FKSB7CisJCQkJaWYgKHBpeF9tcC0+ZmllbGQgPT0gVjRMMl9GSUVMRF9BTlkpCisJCQkJCXBpeF9tcC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisKKwkJCQlwcl9pbmZvKCIlcywgZmllbGQ6ICV1LCBmbXQ6ICV4XG4iLAorCQkJCQlfX2Z1bmNfXywgcGl4X21wLT5maWVsZCwKKwkJCQkJcGl4X21wLT5waXhlbGZvcm1hdCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAocGl4X21wLT5maWVsZCAhPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQpCisJCQkJcGl4X21wLT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwkJCXBpeF9tcC0+aGVpZ2h0ID0gY2xhbXAocGl4X21wLT5oZWlnaHQsCisJCQkJCQlBTUxfVkRFQ19NSU5fSCwKKwkJCQkJCUFNTF9WREVDX01BWF9IKTsKKwkJCXBpeF9tcC0+d2lkdGggPSBjbGFtcChwaXhfbXAtPndpZHRoLAorCQkJCQkJQU1MX1ZERUNfTUlOX1csCisJCQkJCQlBTUxfVkRFQ19NQVhfVyk7CisKKwkJCXBpeF9tcC0+bnVtX3BsYW5lcyA9IGZtdC0+bnVtX3BsYW5lczsKKworCQkJcGl4X21wLT5wbGFuZV9mbXRbMF0uYnl0ZXNwZXJsaW5lID0gcGl4X21wLT53aWR0aDsKKwkJCXBpeF9tcC0+cGxhbmVfZm10WzBdLnNpemVpbWFnZSA9CisJCQkJcGl4X21wLT53aWR0aCAqIHBpeF9tcC0+aGVpZ2h0OworCisJCQlwaXhfbXAtPnBsYW5lX2ZtdFsxXS5ieXRlc3BlcmxpbmUgPSBwaXhfbXAtPndpZHRoOworCQkJcGl4X21wLT5wbGFuZV9mbXRbMV0uc2l6ZWltYWdlID0KKwkJCQlwaXhfbXAtPndpZHRoICogcGl4X21wLT5oZWlnaHQgLyAyOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IHBpeF9tcC0+bnVtX3BsYW5lczsgaSsrKSB7CisJCQltZW1zZXQoJihwaXhfbXAtPnBsYW5lX2ZtdFtpXS5yZXNlcnZlZFswXSksIDB4MCwKKwkJCQkgICBzaXplb2YocGl4X21wLT5wbGFuZV9mbXRbMF0ucmVzZXJ2ZWQpKTsKKwkJfQorCQltZW1zZXQoJnBpeF9tcC0+cmVzZXJ2ZWQsIDB4MCwgc2l6ZW9mKHBpeF9tcC0+cmVzZXJ2ZWQpKTsKKworCQlwaXhfbXAtPmZsYWdzID0gMDsKKwl9IGVsc2UgeworCQlpZiAoVjRMMl9UWVBFX0lTX09VVFBVVChmLT50eXBlKSkgeworCQkJcGl4LT5ieXRlc3BlcmxpbmUgPSAwOworCQkJaWYgKChwaXgtPnBpeGVsZm9ybWF0ICE9IFY0TDJfUElYX0ZNVF9NUEVHMikgJiYKKwkJCSAgICAocGl4LT5waXhlbGZvcm1hdCAhPSBWNEwyX1BJWF9GTVRfSDI2NCkgJiYKKwkJCSAgICAocGl4LT5waXhlbGZvcm1hdCAhPSBWNEwyX1BJWF9GTVRfTVBFRzEpKSB7CisJCQkJcGl4LT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwkJCX0gZWxzZSBpZiAocGl4LT5maWVsZCAhPSBWNEwyX0ZJRUxEX05PTkUpIHsKKwkJCQlpZiAocGl4LT5maWVsZCA9PSBWNEwyX0ZJRUxEX0FOWSkKKwkJCQkJcGl4LT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKworCQkJCXByX2luZm8oIiVzLCBmaWVsZDogJXUsIGZtdDogJXhcbiIsCisJCQkJCV9fZnVuY19fLCBwaXgtPmZpZWxkLAorCQkJCQlwaXgtPnBpeGVsZm9ybWF0KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChwaXgtPmZpZWxkICE9IFY0TDJfRklFTERfSU5URVJMQUNFRCkKKwkJCQlwaXgtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCisJCQlwaXgtPmhlaWdodCA9IGNsYW1wKHBpeC0+aGVpZ2h0LAorCQkJCQkJQU1MX1ZERUNfTUlOX0gsCisJCQkJCQlBTUxfVkRFQ19NQVhfSCk7CisJCQlwaXgtPndpZHRoID0gY2xhbXAocGl4LT53aWR0aCwKKwkJCQkJCUFNTF9WREVDX01JTl9XLAorCQkJCQkJQU1MX1ZERUNfTUFYX1cpOworCisJCQlwaXgtPmJ5dGVzcGVybGluZSA9IHBpeC0+d2lkdGg7CisJCQlwaXgtPnNpemVpbWFnZSA9IHBpeC0+d2lkdGggKiBwaXgtPmhlaWdodDsKKwkJfQorCQlwaXgtPmZsYWdzID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfdHJ5X2ZtdF92aWRfY2FwX291dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUgKnBpeF9tcCA9ICZmLT5mbXQucGl4X21wOworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCA9ICZmLT5mbXQucGl4OworCXN0cnVjdCBhbWxfcV9kYXRhICpxX2RhdGEgPSBOVUxMOworCXN0cnVjdCBhbWxfdmlkZW9fZm10ICpmbXQgPSBOVUxMOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOworCXN0cnVjdCB2YjJfcXVldWUgKmRzdF92cTsKKworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfUFJPVCwKKwkJIiVzLCB0eXBlOiAldSwgcGxhbmVzOiAldSwgZm10OiAleFxuIiwKKwkJX19mdW5jX18sIGYtPnR5cGUsCisJCVY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUihmLT50eXBlKSA/CisJCWYtPmZtdC5waXhfbXAubnVtX3BsYW5lcyA6IDEsCisJCWYtPmZtdC5waXhfbXAucGl4ZWxmb3JtYXQpOworCisJZHN0X3ZxID0gdjRsMl9tMm1fZ2V0X3ZxKGN0eC0+bTJtX2N0eCwgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKTsKKwlpZiAoIWRzdF92cSkgeworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJIm5vIHZiMiBxdWV1ZSBmb3IgdHlwZT0lZFxuIiwgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFWNEwyX1RZUEVfSVNfTVVMVElQTEFOQVIoZi0+dHlwZSkgJiYgZHN0X3ZxLT5pc19tdWx0aXBsYW5hcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmbXQgPSBhbWxfdmRlY19maW5kX2Zvcm1hdChmKTsKKwlpZiAoIWZtdCkgeworCQlpZiAoVjRMMl9UWVBFX0lTX09VVFBVVChmLT50eXBlKSkKKwkJCWYtPmZtdC5waXgucGl4ZWxmb3JtYXQgPSBhbWxfdmlkZW9fZm9ybWF0c1tPVVRfRk1UX0lEWF0uZm91cmNjOworCQllbHNlCisJCQlmLT5mbXQucGl4LnBpeGVsZm9ybWF0ID0gYW1sX3ZpZGVvX2Zvcm1hdHNbQ0FQX0ZNVF9JRFhdLmZvdXJjYzsKKwkJZm10ID0gYW1sX3ZkZWNfZmluZF9mb3JtYXQoZik7CisJfQorCisJdmlkaW9jX3RyeV9mbXQoZiwgZm10KTsKKworCXFfZGF0YSA9IGFtbF92ZGVjX2dldF9xX2RhdGEoY3R4LCBmLT50eXBlKTsKKwlpZiAoIXFfZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY3R4LT5zdGF0ZSA+PSBBTUxfU1RBVEVfUFJPQkUpCisJCXVwZGF0ZV9jdHhfZGltZW5zaW9uKGN0eCwgZi0+dHlwZSk7CisJY29weV92NGwyX2Zvcm1hdF9kaW1lbnRpb24ocGl4X21wLCBwaXgsIHFfZGF0YSwgZi0+dHlwZSk7CisKKwlpZiAoIVY0TDJfVFlQRV9JU19PVVRQVVQoZi0+dHlwZSkpCisJCXJldHVybiAwOworCisJaWYgKFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUihmLT50eXBlKSkgeworCQlpZiAocGl4X21wLT5wbGFuZV9mbXRbMF0uc2l6ZWltYWdlID09IDApIHsKKwkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJCSJzaXplaW1hZ2Ugb2Ygb3V0cHV0IGZvcm1hdCBtdXN0IGJlIGdpdmVuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHBpeC0+c2l6ZWltYWdlID09IDApIHsKKwkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJCSJzaXplaW1hZ2Ugb2Ygb3V0cHV0IGZvcm1hdCBtdXN0IGJlIGdpdmVuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3ZkZWNfZ19zZWxlY3Rpb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJc3RydWN0IHY0bDJfc2VsZWN0aW9uICpzKQoreworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOworCXN0cnVjdCBhbWxfcV9kYXRhICpxX2RhdGE7CisJaW50IHJhdGlvID0gMTsKKworCWlmICgocy0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpICYmCisJCShzLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjdHgtPmludGVybmFsX2R3X3NjYWxlKSB7CisJCWlmIChjdHgtPnN0YXRlID49IEFNTF9TVEFURV9QUk9CRSkgeworCQkJdW5zaWduZWQgaW50IGR3X21vZGUgPSBWREVDX0RXX05PX0FGQkM7CisJCQlpZiAodmRlY19pZl9nZXRfcGFyYW0oY3R4LCBHRVRfUEFSQU1fRFdfTU9ERSwgJmR3X21vZGUpKQorCQkJCXJldHVybiAtRUJVU1k7CisJCQlyYXRpbyA9IGdldF9kb3VibGVfd3JpdGVfcmF0aW8oZHdfbW9kZSk7CisJCX0KKwl9CisKKwlxX2RhdGEgPSAmY3R4LT5xX2RhdGFbQU1MX1FfREFUQV9EU1RdOworCisJc3dpdGNoIChzLT50YXJnZXQpIHsKKwljYXNlIFY0TDJfU0VMX1RHVF9DT01QT1NFX0RFRkFVTFQ6CisJY2FzZSBWNEwyX1NFTF9UR1RfQ09NUE9TRToKKwkJcy0+ci5sZWZ0ID0gMDsKKwkJcy0+ci50b3AgPSAwOworCQlzLT5yLndpZHRoID0gY3R4LT5waWNpbmZvLnZpc2libGVfd2lkdGggLyByYXRpbzsKKwkJcy0+ci5oZWlnaHQgPSBjdHgtPnBpY2luZm8udmlzaWJsZV9oZWlnaHQgLyByYXRpbzsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX1NFTF9UR1RfQ09NUE9TRV9CT1VORFM6CisJCXMtPnIubGVmdCA9IDA7CisJCXMtPnIudG9wID0gMDsKKwkJcy0+ci53aWR0aCA9IGN0eC0+cGljaW5mby5jb2RlZF93aWR0aCAvIHJhdGlvOworCQlzLT5yLmhlaWdodCA9IGN0eC0+cGljaW5mby5jb2RlZF9oZWlnaHQgLyByYXRpbzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGN0eC0+c3RhdGUgPCBBTUxfU1RBVEVfUFJPQkUpIHsKKwkJLyogc2V0IHRvIGRlZmF1bHQgdmFsdWUgaWYgaGVhZGVyIGluZm8gbm90IHJlYWR5IHlldCovCisJCXMtPnIubGVmdCA9IDA7CisJCXMtPnIudG9wID0gMDsKKwkJcy0+ci53aWR0aCA9IHFfZGF0YS0+dmlzaWJsZV93aWR0aDsKKwkJcy0+ci5oZWlnaHQgPSBxX2RhdGEtPnZpc2libGVfaGVpZ2h0OworCX0KKworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfUFJPVCwgIiVzLCB0eXBlOiAlZFxuIiwKKwkJX19mdW5jX18sIHMtPnR5cGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3ZkZWNfc19zZWxlY3Rpb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJc3RydWN0IHY0bDJfc2VsZWN0aW9uICpzKQoreworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOworCWludCByYXRpbyA9IDE7CisKKwl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1BST1QsICIlcywgdHlwZTogJWRcbiIsCisJCV9fZnVuY19fLCBzLT50eXBlKTsKKworCWlmIChzLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY3R4LT5pbnRlcm5hbF9kd19zY2FsZSkgeworCQlpZiAoY3R4LT5zdGF0ZSA+PSBBTUxfU1RBVEVfUFJPQkUpIHsKKwkJCXVuc2lnbmVkIGludCBkd19tb2RlID0gVkRFQ19EV19OT19BRkJDOworCQkJaWYgKHZkZWNfaWZfZ2V0X3BhcmFtKGN0eCwgR0VUX1BBUkFNX0RXX01PREUsICZkd19tb2RlKSkKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJcmF0aW8gPSBnZXRfZG91YmxlX3dyaXRlX3JhdGlvKGR3X21vZGUpOworCQl9CisJfQorCisJc3dpdGNoIChzLT50YXJnZXQpIHsKKwljYXNlIFY0TDJfU0VMX1RHVF9DT01QT1NFOgorCQlzLT5yLmxlZnQgPSAwOworCQlzLT5yLnRvcCA9IDA7CisJCXMtPnIud2lkdGggPSBjdHgtPnBpY2luZm8udmlzaWJsZV93aWR0aCAvIHJhdGlvOworCQlzLT5yLmhlaWdodCA9IGN0eC0+cGljaW5mby52aXNpYmxlX2hlaWdodCAvIHJhdGlvOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogY2FsbGVkIHdoZW4gaXQgaXMgYmV5b25nIEFNTF9TVEFURV9QUk9CRSAqLworc3RhdGljIHZvaWQgdXBkYXRlX2N0eF9kaW1lbnNpb24oc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsIHUzMiB0eXBlKQoreworCXN0cnVjdCBhbWxfcV9kYXRhICpxX2RhdGE7CisJdW5zaWduZWQgaW50IGR3X21vZGUgPSBWREVDX0RXX05PX0FGQkM7CisJaW50IHJhdGlvID0gMTsKKworCXFfZGF0YSA9IGFtbF92ZGVjX2dldF9xX2RhdGEoY3R4LCB0eXBlKTsKKworCWlmIChjdHgtPmludGVybmFsX2R3X3NjYWxlKSB7CisJCWlmICh2ZGVjX2lmX2dldF9wYXJhbShjdHgsIEdFVF9QQVJBTV9EV19NT0RFLCAmZHdfbW9kZSkpCisJCQlyZXR1cm47CisJCXJhdGlvID0gZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhkd19tb2RlKTsKKwl9CisKKwlpZiAoVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSKHR5cGUpKSB7CisJCXFfZGF0YS0+c2l6ZWltYWdlWzBdID0gY3R4LT5waWNpbmZvLnlfbGVuX3N6OworCQlxX2RhdGEtPnNpemVpbWFnZVsxXSA9IGN0eC0+cGljaW5mby5jX2xlbl9zejsKKworCQlxX2RhdGEtPmNvZGVkX3dpZHRoID0gQUxJR04oY3R4LT5waWNpbmZvLmNvZGVkX3dpZHRoIC8gcmF0aW8sIDY0KTsKKwkJcV9kYXRhLT5jb2RlZF9oZWlnaHQgPSBBTElHTihjdHgtPnBpY2luZm8uY29kZWRfaGVpZ2h0IC8gcmF0aW8sIDY0KTsKKworCQlxX2RhdGEtPmJ5dGVzcGVybGluZVswXSA9IEFMSUdOKGN0eC0+cGljaW5mby5jb2RlZF93aWR0aCAvIHJhdGlvLCA2NCk7CisJCXFfZGF0YS0+Ynl0ZXNwZXJsaW5lWzFdID0gQUxJR04oY3R4LT5waWNpbmZvLmNvZGVkX3dpZHRoIC8gcmF0aW8sIDY0KTsKKwl9IGVsc2UgeworCQlxX2RhdGEtPmNvZGVkX3dpZHRoID0gQUxJR04oY3R4LT5waWNpbmZvLmNvZGVkX3dpZHRoIC8gcmF0aW8sIDY0KTsKKwkJcV9kYXRhLT5jb2RlZF9oZWlnaHQgPSBBTElHTihjdHgtPnBpY2luZm8uY29kZWRfaGVpZ2h0IC8gcmF0aW8sIDY0KTsKKwkJcV9kYXRhLT5zaXplaW1hZ2VbMF0gPSBjdHgtPnBpY2luZm8ueV9sZW5fc3o7CisJCXFfZGF0YS0+c2l6ZWltYWdlWzBdICs9IGN0eC0+cGljaW5mby5jX2xlbl9zejsKKwkJcV9kYXRhLT5ieXRlc3BlcmxpbmVbMF0gPSBBTElHTihjdHgtPnBpY2luZm8uY29kZWRfd2lkdGggLyByYXRpbywgNjQpOworCX0KK30KKworc3RhdGljIHZvaWQgY29weV92NGwyX2Zvcm1hdF9kaW1lbnRpb24oc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUgKnBpeF9tcCwKKwkJCQkgICAgICAgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4LAorCQkJCSAgICAgICBzdHJ1Y3QgYW1sX3FfZGF0YSAqcV9kYXRhLAorCQkJCSAgICAgICB1MzIgdHlwZSkKK3sKKwlpbnQgaTsKKworCWlmICghcGl4IHx8ICFwaXhfbXAgfHwgIXFfZGF0YSkKKwkJcmV0dXJuOworCisJaWYgKFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUih0eXBlKSkgeworCQlwaXhfbXAtPndpZHRoCQk9IHFfZGF0YS0+Y29kZWRfd2lkdGg7CisJCXBpeF9tcC0+aGVpZ2h0CQk9IHFfZGF0YS0+Y29kZWRfaGVpZ2h0OworCQlwaXhfbXAtPm51bV9wbGFuZXMJPSBxX2RhdGEtPmZtdC0+bnVtX3BsYW5lczsKKwkJcGl4X21wLT5waXhlbGZvcm1hdAk9IHFfZGF0YS0+Zm10LT5mb3VyY2M7CisKKwkJZm9yIChpID0gMDsgaSA8IHFfZGF0YS0+Zm10LT5udW1fcGxhbmVzOyBpKyspIHsKKwkJCXBpeF9tcC0+cGxhbmVfZm10W2ldLmJ5dGVzcGVybGluZSA9IHFfZGF0YS0+Ynl0ZXNwZXJsaW5lW2ldOworCQkJcGl4X21wLT5wbGFuZV9mbXRbaV0uc2l6ZWltYWdlID0gcV9kYXRhLT5zaXplaW1hZ2VbaV07CisJCX0KKwl9IGVsc2UgeworCQlwaXgtPndpZHRoCQk9IHFfZGF0YS0+Y29kZWRfd2lkdGg7CisJCXBpeC0+aGVpZ2h0CQk9IHFfZGF0YS0+Y29kZWRfaGVpZ2h0OworCQlwaXgtPnBpeGVsZm9ybWF0CT0gcV9kYXRhLT5mbXQtPmZvdXJjYzsKKwkJcGl4LT5ieXRlc3BlcmxpbmUJPSBxX2RhdGEtPmJ5dGVzcGVybGluZVswXTsKKwkJcGl4LT5zaXplaW1hZ2UJCT0gcV9kYXRhLT5zaXplaW1hZ2VbMF07CisJfQorfQorCitzdGF0aWMgaW50IHZpZGlvY192ZGVjX3NfZm10KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IGZoX3RvX2N0eChwcml2KTsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0X21wbGFuZSAqcGl4X21wID0gJmYtPmZtdC5waXhfbXA7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4ID0gJmYtPmZtdC5waXg7CisJc3RydWN0IGFtbF9xX2RhdGEgKnFfZGF0YSA9IE5VTEw7CisJc3RydWN0IGFtbF92aWRlb19mbXQgKmZtdDsKKwlzdHJ1Y3QgdmIyX3F1ZXVlICpkc3RfdnE7CisKKwl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1BST1QsCisJCSIlcywgdHlwZTogJXUsIHBsYW5lczogJXUsIGZtdDogJXhcbiIsCisJCV9fZnVuY19fLCBmLT50eXBlLAorCQlWNEwyX1RZUEVfSVNfTVVMVElQTEFOQVIoZi0+dHlwZSkgPworCQlmLT5mbXQucGl4X21wLm51bV9wbGFuZXMgOiAxLAorCQlmLT5mbXQucGl4X21wLnBpeGVsZm9ybWF0KTsKKworCWRzdF92cSA9IHY0bDJfbTJtX2dldF92cShjdHgtPm0ybV9jdHgsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSk7CisJaWYgKCFkc3RfdnEpIHsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJubyB2YjIgcXVldWUgZm9yIHR5cGU9JWRcbiIsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSKGYtPnR5cGUpICYmIGRzdF92cS0+aXNfbXVsdGlwbGFuYXIpCisJCXJldHVybiAtRUlOVkFMOworCisJcV9kYXRhID0gYW1sX3ZkZWNfZ2V0X3FfZGF0YShjdHgsIGYtPnR5cGUpOworCWlmICghcV9kYXRhKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgoZi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpICYmCisJICAgIHZiMl9pc19idXN5KCZjdHgtPm0ybV9jdHgtPm91dF9xX2N0eC5xKSkgeworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJIm91dF9xX2N0eCBidWZmZXJzIGFscmVhZHkgcmVxdWVzdGVkXG4iKTsKKwkJcmV0ID0gLUVCVVNZOworCX0KKworCWlmICgoIVY0TDJfVFlQRV9JU19PVVRQVVQoZi0+dHlwZSkpICYmCisJICAgIHZiMl9pc19idXN5KCZjdHgtPm0ybV9jdHgtPmNhcF9xX2N0eC5xKSkgeworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJImNhcF9xX2N0eCBidWZmZXJzIGFscmVhZHkgcmVxdWVzdGVkXG4iKTsKKwkJcmV0ID0gLUVCVVNZOworCX0KKworCWZtdCA9IGFtbF92ZGVjX2ZpbmRfZm9ybWF0KGYpOworCWlmIChmbXQgPT0gTlVMTCkgeworCQlpZiAoVjRMMl9UWVBFX0lTX09VVFBVVChmLT50eXBlKSkKKwkJCWZtdCA9ICZhbWxfdmlkZW9fZm9ybWF0c1tPVVRfRk1UX0lEWF07CisJCWVsc2UKKwkJCWZtdCA9ICZhbWxfdmlkZW9fZm9ybWF0c1tDQVBfRk1UX0lEWF07CisJCWYtPmZtdC5waXgucGl4ZWxmb3JtYXQgPSBmbXQtPmZvdXJjYzsKKwl9CisKKwlxX2RhdGEtPmZtdCA9IGZtdDsKKwl2aWRpb2NfdHJ5X2ZtdChmLCBxX2RhdGEtPmZtdCk7CisKKwlpZiAoZi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpIHsKKwkJcV9kYXRhLT5zaXplaW1hZ2VbMF0gPSBwaXhfbXAtPnBsYW5lX2ZtdFswXS5zaXplaW1hZ2U7CisJCXFfZGF0YS0+Y29kZWRfd2lkdGggPSBwaXhfbXAtPndpZHRoOworCQlxX2RhdGEtPmNvZGVkX2hlaWdodCA9IHBpeF9tcC0+aGVpZ2h0OworCisJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVhJTkZPLAorCQkJInc6ICVkLCBoOiAlZCwgc2l6ZTogJWRcbiIsCisJCQlwaXhfbXAtPndpZHRoLCBwaXhfbXAtPmhlaWdodCwKKwkJCXBpeF9tcC0+cGxhbmVfZm10WzBdLnNpemVpbWFnZSk7CisKKwkJY3R4LT5vdXRwdXRfcGl4X2ZtdCA9IHBpeF9tcC0+cGl4ZWxmb3JtYXQ7CisJCWN0eC0+Y29sb3JzcGFjZSA9IGYtPmZtdC5waXhfbXAuY29sb3JzcGFjZTsKKwkJY3R4LT55Y2Jjcl9lbmMgPSBmLT5mbXQucGl4X21wLnljYmNyX2VuYzsKKwkJY3R4LT5xdWFudGl6YXRpb24gPSBmLT5mbXQucGl4X21wLnF1YW50aXphdGlvbjsKKwkJY3R4LT54ZmVyX2Z1bmMgPSBmLT5mbXQucGl4X21wLnhmZXJfZnVuYzsKKworCQltdXRleF9sb2NrKCZjdHgtPnN0YXRlX2xvY2spOworCQlpZiAoY3R4LT5zdGF0ZSA9PSBBTUxfU1RBVEVfSURMRSkgeworCQkJcmV0ID0gdmRlY19pZl9pbml0KGN0eCwgcV9kYXRhLT5mbXQtPmZvdXJjYyk7CisJCQlpZiAocmV0KSB7CisJCQkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCQkJInZkZWNfaWZfaW5pdCgpIGZhaWwgcmV0PSVkXG4iLCByZXQpOworCQkJCW11dGV4X3VubG9jaygmY3R4LT5zdGF0ZV9sb2NrKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWN0eC0+c3RhdGUgPSBBTUxfU1RBVEVfSU5JVDsKKwkJCUFUUkFDRV9DT1VOVEVSKCJWX1NUX1ZTSU5LLXN0YXRlIiwgY3R4LT5zdGF0ZSk7CisJCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1NUQVRFLAorCQkJCSJ2Y29kZWMgc3RhdGUgKEFNTF9TVEFURV9JTklUKVxuIik7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZjdHgtPnN0YXRlX2xvY2spOworCX0gZWxzZSBpZiAoZi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCkgeworCQlxX2RhdGEtPnNpemVpbWFnZVswXSA9IHBpeC0+c2l6ZWltYWdlOworCQlxX2RhdGEtPmNvZGVkX3dpZHRoID0gcGl4LT53aWR0aDsKKwkJcV9kYXRhLT5jb2RlZF9oZWlnaHQgPSBwaXgtPmhlaWdodDsKKworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywKKwkJCSJ3OiAlZCwgaDogJWQsIHNpemU6ICVkXG4iLAorCQkJcGl4LT53aWR0aCwgcGl4LT5oZWlnaHQsCisJCQlwaXgtPnNpemVpbWFnZSk7CisKKwkJY3R4LT5vdXRwdXRfcGl4X2ZtdCA9IHBpeC0+cGl4ZWxmb3JtYXQ7CisJCWN0eC0+Y29sb3JzcGFjZSA9IGYtPmZtdC5waXguY29sb3JzcGFjZTsKKwkJY3R4LT55Y2Jjcl9lbmMgPSBmLT5mbXQucGl4LnljYmNyX2VuYzsKKwkJY3R4LT5xdWFudGl6YXRpb24gPSBmLT5mbXQucGl4LnF1YW50aXphdGlvbjsKKwkJY3R4LT54ZmVyX2Z1bmMgPSBmLT5mbXQucGl4LnhmZXJfZnVuYzsKKworCQltdXRleF9sb2NrKCZjdHgtPnN0YXRlX2xvY2spOworCQlpZiAoY3R4LT5zdGF0ZSA9PSBBTUxfU1RBVEVfSURMRSkgeworCQkJcmV0ID0gdmRlY19pZl9pbml0KGN0eCwgcV9kYXRhLT5mbXQtPmZvdXJjYyk7CisJCQlpZiAocmV0KSB7CisJCQkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCQkJInZkZWNfaWZfaW5pdCgpIGZhaWwgcmV0PSVkXG4iLCByZXQpOworCQkJCW11dGV4X3VubG9jaygmY3R4LT5zdGF0ZV9sb2NrKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWN0eC0+c3RhdGUgPSBBTUxfU1RBVEVfSU5JVDsKKwkJCUFUUkFDRV9DT1VOVEVSKCJWX1NUX1ZTSU5LLXN0YXRlIiwgY3R4LT5zdGF0ZSk7CisJCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1NUQVRFLAorCQkJCSJ2Y29kZWMgc3RhdGUgKEFNTF9TVEFURV9JTklUKVxuIik7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZjdHgtPnN0YXRlX2xvY2spOworCX0KKworCWlmICghVjRMMl9UWVBFX0lTX09VVFBVVChmLT50eXBlKSkgeworCQljdHgtPmNhcF9waXhfZm10ID0gVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSKGYtPnR5cGUpID8KKwkJCXBpeF9tcC0+cGl4ZWxmb3JtYXQgOiBwaXgtPnBpeGVsZm9ybWF0OworCQlpZiAoY3R4LT5zdGF0ZSA+PSBBTUxfU1RBVEVfUFJPQkUpIHsKKwkJCXVwZGF0ZV9jdHhfZGltZW5zaW9uKGN0eCwgZi0+dHlwZSk7CisJCQljb3B5X3Y0bDJfZm9ybWF0X2RpbWVudGlvbihwaXhfbXAsIHBpeCwgcV9kYXRhLCBmLT50eXBlKTsKKwkJCXY0bF9idWZfc2l6ZV9kZWNpc2lvbihjdHgpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2VudW1fZnJhbWVzaXplcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9mcm1zaXplZW51bSAqZnNpemUpCit7CisJaW50IGkgPSAwOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOworCisJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19QUk9ULCAiJXMsIGlkeDogJWQsIHBpeCBmbXQ6ICV4XG4iLAorCQlfX2Z1bmNfXywgZnNpemUtPmluZGV4LCBmc2l6ZS0+cGl4ZWxfZm9ybWF0KTsKKworCWlmIChmc2l6ZS0+aW5kZXggIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1NVUFBPUlRFRF9GUkFNRVNJWkU7ICsraSkgeworCQlpZiAoZnNpemUtPnBpeGVsX2Zvcm1hdCAhPSBhbWxfdmRlY19mcmFtZXNpemVzW2ldLmZvdXJjYykKKwkJCWNvbnRpbnVlOworCisJCWZzaXplLT50eXBlID0gVjRMMl9GUk1TSVpFX1RZUEVfU1RFUFdJU0U7CisJCWZzaXplLT5zdGVwd2lzZSA9IGFtbF92ZGVjX2ZyYW1lc2l6ZXNbaV0uc3RlcHdpc2U7CisJCWlmICghKGN0eC0+ZGV2LT5kZWNfY2FwYWJpbGl0eSAmCisJCQkJVkNPREVDX0NBUEFCSUxJVFlfNEtfRElTQUJMRUQpKSB7CisJCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywgIjRLIGlzIGVuYWJsZWRcbiIpOworCQkJZnNpemUtPnN0ZXB3aXNlLm1heF93aWR0aCA9CisJCQkJCVZDT0RFQ19ERUNfNEtfQ09ERURfV0lEVEg7CisJCQlmc2l6ZS0+c3RlcHdpc2UubWF4X2hlaWdodCA9CisJCQkJCVZDT0RFQ19ERUNfNEtfQ09ERURfSEVJR0hUOworCQl9CisJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVhJTkZPLAorCQkJIiV4LCAlZCAlZCAlZCAlZCAlZCAlZFxuIiwKKwkJCWN0eC0+ZGV2LT5kZWNfY2FwYWJpbGl0eSwKKwkJCWZzaXplLT5zdGVwd2lzZS5taW5fd2lkdGgsCisJCQlmc2l6ZS0+c3RlcHdpc2UubWF4X3dpZHRoLAorCQkJZnNpemUtPnN0ZXB3aXNlLnN0ZXBfd2lkdGgsCisJCQlmc2l6ZS0+c3RlcHdpc2UubWluX2hlaWdodCwKKwkJCWZzaXplLT5zdGVwd2lzZS5tYXhfaGVpZ2h0LAorCQkJZnNpemUtPnN0ZXB3aXNlLnN0ZXBfaGVpZ2h0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2VudW1fZm10KHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYsIGJvb2wgb3V0cHV0X3F1ZXVlKQoreworCXN0cnVjdCBhbWxfdmlkZW9fZm10ICpmbXQ7CisJaW50IGkgPSAwLCBqID0gMDsKKworCS8qIEk0MjAgb25seSB1c2VkIGZvciBtanBlZy4gKi8KKwlpZiAoIW91dHB1dF9xdWV1ZSAmJiBzdXBwb3J0X21qcGVnICYmIHN1cHBvcnRfZm9ybWF0X0k0MjApIHsKKwkJZm9yIChpID0gMDsgaSA8IE5VTV9GT1JNQVRTOyBpKyspIHsKKwkJCWZtdCA9ICZhbWxfdmlkZW9fZm9ybWF0c1tpXTsKKwkJCWlmICgoZm10LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX1lVVjQyMCkgfHwKKwkJCQkoZm10LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX1lVVjQyME0pKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlmb3IgKDsgaSA8IE5VTV9GT1JNQVRTOyBpKyspIHsKKwkJZm10ID0gJmFtbF92aWRlb19mb3JtYXRzW2ldOworCQlpZiAob3V0cHV0X3F1ZXVlICYmIChmbXQtPnR5cGUgIT0gQU1MX0ZNVF9ERUMpKQorCQkJY29udGludWU7CisJCWlmICghb3V0cHV0X3F1ZXVlICYmIChmbXQtPnR5cGUgIT0gQU1MX0ZNVF9GUkFNRSkpCisJCQljb250aW51ZTsKKwkJaWYgKHN1cHBvcnRfbWpwZWcgJiYgIXN1cHBvcnRfZm9ybWF0X0k0MjAgJiYKKwkJCSgoZm10LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX1lVVjQyMCkgfHwKKwkJCShmbXQtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfWVVWNDIwTSkpKQorCQkJY29udGludWU7CisKKwkJaWYgKGogPT0gZi0+aW5kZXgpIHsKKwkJCWYtPnBpeGVsZm9ybWF0ID0gZm10LT5mb3VyY2M7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkrK2o7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3ZkZWNfZW51bV9mbXRfdmlkX2NhcF9tcGxhbmUoc3RydWN0IGZpbGUgKmZpbGUsCisJdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfZm10ZGVzYyAqZikKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IGZoX3RvX2N0eChwcml2KTsKKworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfUFJPVCwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gdmlkaW9jX2VudW1fZm10KGYsIGZhbHNlKTsKK30KKworc3RhdGljIGludCB2aWRpb2NfdmRlY19lbnVtX2ZtdF92aWRfb3V0X21wbGFuZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwl2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKQoreworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOworCisJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19QUk9ULCAiJXNcbiIsIF9fZnVuY19fKTsKKworCXJldHVybiB2aWRpb2NfZW51bV9mbXQoZiwgdHJ1ZSk7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3ZkZWNfZ19mbXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXRfbXBsYW5lICpwaXhfbXAgPSAmZi0+Zm10LnBpeF9tcDsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXggPSAmZi0+Zm10LnBpeDsKKwlzdHJ1Y3QgdmIyX3F1ZXVlICp2cTsKKwlzdHJ1Y3QgdmIyX3F1ZXVlICpkc3RfdnE7CisJc3RydWN0IGFtbF9xX2RhdGEgKnFfZGF0YTsKKwlpbnQgcmV0ID0gMDsKKworCXZxID0gdjRsMl9tMm1fZ2V0X3ZxKGN0eC0+bTJtX2N0eCwgZi0+dHlwZSk7CisJaWYgKCF2cSkgeworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJIm5vIHZiMiBxdWV1ZSBmb3IgdHlwZT0lZFxuIiwgZi0+dHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRzdF92cSA9IHY0bDJfbTJtX2dldF92cShjdHgtPm0ybV9jdHgsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSk7CisJaWYgKCFkc3RfdnEpIHsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJubyB2YjIgcXVldWUgZm9yIHR5cGU9JWRcbiIsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSKGYtPnR5cGUpICYmIGRzdF92cS0+aXNfbXVsdGlwbGFuYXIpCisJCXJldHVybiAtRUlOVkFMOworCisJcV9kYXRhID0gYW1sX3ZkZWNfZ2V0X3FfZGF0YShjdHgsIGYtPnR5cGUpOworCisJcmV0ID0gdmRlY19pZl9nZXRfcGFyYW0oY3R4LCBHRVRfUEFSQU1fUElDX0lORk8sICZjdHgtPnBpY2luZm8pOworCWlmIChyZXQpIHsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJHRVRfUEFSQU1fUElDVFVSRV9JTkZPIGVyclxuIik7CisJfSBlbHNlIHsKKwkJaWYgKChjdHgtPnBpY2luZm8udmlzaWJsZV9oZWlnaHQgPCAxNiAmJiBjdHgtPnBpY2luZm8udmlzaWJsZV9oZWlnaHQgPiAwKSB8fAorCQkJKGN0eC0+cGljaW5mby52aXNpYmxlX3dpZHRoIDwgMTYgJiYgY3R4LT5waWNpbmZvLnZpc2libGVfd2lkdGggPiAwKSkgeworCQkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCQkiVGhlIHdpZHRoIG9yIGhlaWdodCBvZiB0aGUgc3RyZWFtIGlzIGxlc3MgdGhhbiAxNlxuIik7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9CisJfQorCisJaWYgKFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUihmLT50eXBlKSkgeworCQlwaXhfbXAtPmZpZWxkID0gcmV0ID8gVjRMMl9GSUVMRF9OT05FIDogY3R4LT5waWNpbmZvLmZpZWxkOworCQlwaXhfbXAtPmNvbG9yc3BhY2UgPSBjdHgtPmNvbG9yc3BhY2U7CisJCXBpeF9tcC0+eWNiY3JfZW5jID0gY3R4LT55Y2Jjcl9lbmM7CisJCXBpeF9tcC0+cXVhbnRpemF0aW9uID0gY3R4LT5xdWFudGl6YXRpb247CisJCXBpeF9tcC0+eGZlcl9mdW5jID0gY3R4LT54ZmVyX2Z1bmM7CisJfSBlbHNlIHsKKwkJcGl4LT5maWVsZCA9IHJldCA/IFY0TDJfRklFTERfTk9ORSA6IGN0eC0+cGljaW5mby5maWVsZDsKKwkJcGl4LT5jb2xvcnNwYWNlID0gY3R4LT5jb2xvcnNwYWNlOworCQlwaXgtPnljYmNyX2VuYyA9IGN0eC0+eWNiY3JfZW5jOworCQlwaXgtPnF1YW50aXphdGlvbiA9IGN0eC0+cXVhbnRpemF0aW9uOworCQlwaXgtPnhmZXJfZnVuYyA9IGN0eC0+eGZlcl9mdW5jOworCX0KKworCWlmICgoIVY0TDJfVFlQRV9JU19PVVRQVVQoZi0+dHlwZSkpICYmCisJICAgIChjdHgtPnN0YXRlID49IEFNTF9TVEFURV9QUk9CRSkpIHsKKwkJdXBkYXRlX2N0eF9kaW1lbnNpb24oY3R4LCBmLT50eXBlKTsKKwkJY29weV92NGwyX2Zvcm1hdF9kaW1lbnRpb24ocGl4X21wLCBwaXgsIHFfZGF0YSwgZi0+dHlwZSk7CisJfSBlbHNlIGlmIChmLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSkgeworCQkvKgorCQkgKiBUaGlzIGlzIHJ1biBvbiBPVVRQVVQKKwkJICogVGhlIGJ1ZmZlciBjb250YWlucyBjb21wcmVzc2VkIGltYWdlCisJCSAqIHNvIHdpZHRoIGFuZCBoZWlnaHQgaGF2ZSBubyBtZWFuaW5nLgorCQkgKiBBc3NpZ24gdmFsdWUgaGVyZSB0byBwYXNzIHY0bDItY29tcGxpYW5jZSB0ZXN0CisJCSAqLworCQljb3B5X3Y0bDJfZm9ybWF0X2RpbWVudGlvbihwaXhfbXAsIHBpeCwgcV9kYXRhLCBmLT50eXBlKTsKKwl9IGVsc2UgeworCQljb3B5X3Y0bDJfZm9ybWF0X2RpbWVudGlvbihwaXhfbXAsIHBpeCwgcV9kYXRhLCBmLT50eXBlKTsKKworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywKKwkJCSJ0eXBlPSVkIHN0YXRlPSVkIEZvcm1hdCBpbmZvcm1hdGlvbiBjb3VsZCBub3QgYmUgcmVhZCwgbm90IHJlYWR5IHlldCFcbiIsCisJCQlmLT50eXBlLCBjdHgtPnN0YXRlKTsKKwl9CisKKwl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1BST1QsCisJCSIlcywgdHlwZTogJXUsIHBsYW5lczogJXUsIGZtdDogJXhcbiIsCisJCV9fZnVuY19fLCBmLT50eXBlLAorCQlWNEwyX1RZUEVfSVNfTVVMVElQTEFOQVIoZi0+dHlwZSkgPworCQlxX2RhdGEtPmZtdC0+bnVtX3BsYW5lcyA6IDEsCisJCXFfZGF0YS0+Zm10LT5mb3VyY2MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3ZkZWNfY3JlYXRlX2J1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJc3RydWN0IHY0bDJfY3JlYXRlX2J1ZmZlcnMgKmNyZWF0ZSkKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IGZoX3RvX2N0eChwcml2KTsKKworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfUFJPVCwKKwkJIiVzLCB0eXBlOiAldSwgY291bnQ6ICV1XG4iLAorCQlfX2Z1bmNfXywgY3JlYXRlLT5mb3JtYXQudHlwZSwgY3JlYXRlLT5jb3VudCk7CisKKwlyZXR1cm4gdjRsMl9tMm1faW9jdGxfY3JlYXRlX2J1ZnMoZmlsZSwgcHJpdiwgY3JlYXRlKTsKK30KKworLyppbnQgdmlkaW9jX3ZkZWNfZ19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwlzdHJ1Y3QgdjRsMl9jb250cm9sICphKQoreworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KGZoKTsKKworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfUFJPVCwKKwkJIiVzLCBpZDogJWRcbiIsIF9fZnVuY19fLCBhLT5pZCk7CisKKwlpZiAoYS0+aWQgPT0gVjRMMl9DSURfTUlOX0JVRkZFUlNfRk9SX0NBUFRVUkUpCisJCWEtPnZhbHVlID0gNDsKKwllbHNlIGlmIChhLT5pZCA9PSBWNEwyX0NJRF9NSU5fQlVGRkVSU19GT1JfT1VUUFVUKQorCQlhLT52YWx1ZSA9IDg7CisKKwlyZXR1cm4gMDsKK30qLworCitzdGF0aWMgaW50IHZiMm9wc192ZGVjX3F1ZXVlX3NldHVwKHN0cnVjdCB2YjJfcXVldWUgKnZxLAorCQkJCXVuc2lnbmVkIGludCAqbmJ1ZmZlcnMsCisJCQkJdW5zaWduZWQgaW50ICpucGxhbmVzLAorCQkJCXVuc2lnbmVkIGludCBzaXplc1tdLCBzdHJ1Y3QgZGV2aWNlICphbGxvY19kZXZzW10pCit7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPSB2YjJfZ2V0X2Rydl9wcml2KHZxKTsKKwlzdHJ1Y3QgYW1sX3FfZGF0YSAqcV9kYXRhOworCXVuc2lnbmVkIGludCBpOworCisJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19QUk9ULCAiJXMsIHR5cGU6ICVkXG4iLAorCQlfX2Z1bmNfXywgdnEtPnR5cGUpOworCisJcV9kYXRhID0gYW1sX3ZkZWNfZ2V0X3FfZGF0YShjdHgsIHZxLT50eXBlKTsKKwlpZiAocV9kYXRhID09IE5VTEwpIHsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJ2cS0+dHlwZT0lZCBlcnJcbiIsIHZxLT50eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCpucGxhbmVzKSB7CisJCWZvciAoaSA9IDA7IGkgPCAqbnBsYW5lczsgaSsrKSB7CisJCQlpZiAoc2l6ZXNbaV0gPCBxX2RhdGEtPnNpemVpbWFnZVtpXSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWFsbG9jX2RldnNbaV0gPSAmY3R4LT5kZXYtPnBsYXRfZGV2LT5kZXY7CisKKwkJCWlmICghVjRMMl9UWVBFX0lTX09VVFBVVCh2cS0+dHlwZSkpCisJCQkJYWxsb2NfZGV2c1tpXSA9IHY0bF9nZXRfZGV2X2Zyb21fY29kZWNfbW0oKTsKKwkJfQorCX0gZWxzZSB7CisJCWludCBkd19tb2RlID0gVkRFQ19EV19OT19BRkJDOworCisJCWlmICh2cS0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKQorCQkJKm5wbGFuZXMgPSAyOworCQllbHNlCisJCQkqbnBsYW5lcyA9IDE7CisKKwkJaWYgKCF2ZGVjX2lmX2dldF9wYXJhbShjdHgsIEdFVF9QQVJBTV9EV19NT0RFLCAmZHdfbW9kZSkpIHsKKwkJCWlmIChkd19tb2RlID09IFZERUNfRFdfQUZCQ19PTkxZKQorCQkJCSpucGxhbmVzID0gMTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCAqbnBsYW5lczsgaSsrKSB7CisJCQlzaXplc1tpXSA9IHFfZGF0YS0+c2l6ZWltYWdlW2ldOworCQkJaWYgKFY0TDJfVFlQRV9JU19PVVRQVVQodnEtPnR5cGUpICYmIGN0eC0+b3V0cHV0X2RtYV9tb2RlKQorCQkJCXNpemVzW2ldID0gMTsKKwkJCWFsbG9jX2RldnNbaV0gPSAmY3R4LT5kZXYtPnBsYXRfZGV2LT5kZXY7CisKKwkJCWlmICghVjRMMl9UWVBFX0lTX09VVFBVVCh2cS0+dHlwZSkpCisJCQkJYWxsb2NfZGV2c1tpXSA9IHY0bF9nZXRfZGV2X2Zyb21fY29kZWNfbW0oKTsKKwkJfQorCX0KKworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfQlVGTUdSLAorCQkidHlwZTogJWQsIHBsYW5lOiAlZCwgYnVmIGNudDogJWQsIHNpemU6IFtZOiAldSwgQzogJXVdXG4iLAorCQl2cS0+dHlwZSwgKm5wbGFuZXMsICpuYnVmZmVycywgc2l6ZXNbMF0sIHNpemVzWzFdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZiMm9wc192ZGVjX2J1Zl9wcmVwYXJlKHN0cnVjdCB2YjJfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IHZiMl9nZXRfZHJ2X3ByaXYodmItPnZiMl9xdWV1ZSk7CisJc3RydWN0IGFtbF9xX2RhdGEgKnFfZGF0YTsKKwlzdHJ1Y3QgdmIyX3Y0bDJfYnVmZmVyICp2YjJfdjRsMiA9IE5VTEw7CisJc3RydWN0IGFtbF92aWRlb19kZWNfYnVmICpidWYgPSBOVUxMOworCWludCBpOworCisJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19QUk9ULAorCQkiJXMsIHR5cGU6ICVkLCBpZHg6ICVkXG4iLAorCQlfX2Z1bmNfXywgdmItPnZiMl9xdWV1ZS0+dHlwZSwgdmItPmluZGV4KTsKKworCWlmICh2Yi0+bWVtb3J5ID09IFZCMl9NRU1PUllfRE1BQlVGCisJCSYmIFY0TDJfVFlQRV9JU19PVVRQVVQodmItPnZiMl9xdWV1ZS0+dHlwZSkpCisJCXJldHVybiAwOworCisJcV9kYXRhID0gYW1sX3ZkZWNfZ2V0X3FfZGF0YShjdHgsIHZiLT52YjJfcXVldWUtPnR5cGUpOworCisJZm9yIChpID0gMDsgaSA8IHFfZGF0YS0+Zm10LT5udW1fcGxhbmVzOyBpKyspIHsKKwkJaWYgKHZiMl9wbGFuZV9zaXplKHZiLCBpKSA8IHFfZGF0YS0+c2l6ZWltYWdlW2ldKSB7CisJCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJCSJkYXRhIHdpbGwgbm90IGZpdCBpbnRvIHBsYW5lICVkICglbHUgPCAlZClcbiIsCisJCQkJaSwgdmIyX3BsYW5lX3NpemUodmIsIGkpLAorCQkJCXFfZGF0YS0+c2l6ZWltYWdlW2ldKTsKKwkJfQorCX0KKworCXZiMl92NGwyID0gdG9fdmIyX3Y0bDJfYnVmZmVyKHZiKTsKKwlidWYgPSBjb250YWluZXJfb2YodmIyX3Y0bDIsIHN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1ZiwgdmIpOworCisJaWYgKHZiMl92NGwyLT5tZXRhX3B0ciAmJiAoY29weV9mcm9tX3VzZXIoYnVmLT5tZXRhX2RhdGEsCisJCSh2b2lkICopdmIyX3Y0bDItPm1ldGFfcHRyLCBNRVRBX0RBVEFfU0laRSArIDQpKSkgeworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJIiVzOmNvcHkgbWV0YSBkYXRhIGVycm9yLiBwdHI6ICVseFxuIiwgX19mdW5jX18sIHZiMl92NGwyLT5tZXRhX3B0cik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9tbXVfYm1tdV9ib3goc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgpCit7CisJaW50IGk7CisJaW50IG1tdV9mbGFnID0gY3R4LT5pc19kcm1fbW9kZT8gQ09ERUNfTU1fRkxBR1NfVFZQOjA7CisJaW50IGJtbXVfZmxhZyA9IG1tdV9mbGFnOworCXUzMiBkd19tb2RlID0gVkRFQ19EV19OT19BRkJDOworCisJY3R4LT5jb21wX2J1ZnMgPSB2emFsbG9jKHNpemVvZigqY3R4LT5jb21wX2J1ZnMpICogVjRMX0NBUF9CVUZGX01BWCk7CisJaWYgKCFjdHgtPmNvbXBfYnVmcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAodmRlY19pZl9nZXRfcGFyYW0oY3R4LCBHRVRfUEFSQU1fRFdfTU9ERSwgJmR3X21vZGUpKSB7CisJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJpbnZhbGlkIGR3X21vZGVcbiIpOworCQlnb3RvIGZyZWVfY29tcF9idWZzOworCX0KKworCS8qIGluaXQgbW11IGJveCAqLworCWN0eC0+bW11X2JveCA9IGRlY29kZXJfbW11X2JveF9hbGxvY19ib3goInY0bDJfZGVjIiwKKwkJCWN0eC0+aWQsIFY0TF9DQVBfQlVGRl9NQVgsCisJCQljdHgtPmNvbXBfaW5mby5tYXhfc2l6ZSAqIFNaXzFNLCBtbXVfZmxhZyk7CisJaWYgKCFjdHgtPm1tdV9ib3gpIHsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgImZhaWwgdG8gY3JlYXRlIG1tdSBib3hcbiIpOworCQlnb3RvIGZyZWVfY29tcF9idWZzOworCX0KKworCS8qIGluaXQgYm1tdSBib3ggKi8KKwlibW11X2ZsYWcgfD0gQ09ERUNfTU1fRkxBR1NfQ01BX0NMRUFSIHwgQ09ERUNfTU1fRkxBR1NfRk9SX1ZERUNPREVSOworCWN0eC0+Ym1tdV9ib3ggID0gZGVjb2Rlcl9ibW11X2JveF9hbGxvY19ib3goInY0bDJfZGVjIiwKKwkJCWN0eC0+aWQsIFY0TF9DQVBfQlVGRl9NQVgsCisJCQk0ICsgUEFHRV9TSElGVCwgYm1tdV9mbGFnKTsKKwlpZiAoIWN0eC0+Ym1tdV9ib3gpIHsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgImZhaWwgdG8gY3JlYXRlIGJtbXUgYm94XG4iKTsKKwkJZ290byBmcmVlX21tdWJveDsKKwl9CisKKwlpZiAoZHdfbW9kZSAmIDB4MjApIHsKKwkJLyogaW5pdCBtbXUgYm94IGR3Ki8KKwkJY3R4LT5tbXVfYm94X2R3ID0gZGVjb2Rlcl9tbXVfYm94X2FsbG9jX2JveCgidjRsMl9kZWMiLAorCQkJCWN0eC0+aWQsIFY0TF9DQVBfQlVGRl9NQVgsCisJCQkJY3R4LT5jb21wX2luZm8ubWF4X3NpemUgKiBTWl8xTSwgbW11X2ZsYWcpOworCQlpZiAoIWN0eC0+bW11X2JveF9kdykgeworCQkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgImZhaWwgdG8gY3JlYXRlIG1tdSBib3ggZHdcbiIpOworCQkJZ290byBmcmVlX2JtbXVib3g7CisJCX0KKworCQkvKiBpbml0IGJtbXUgYm94IGR3Ki8KKwkJYm1tdV9mbGFnIHw9IENPREVDX01NX0ZMQUdTX0NNQV9DTEVBUiB8IENPREVDX01NX0ZMQUdTX0ZPUl9WREVDT0RFUjsKKwkJY3R4LT5ibW11X2JveF9kdyAgPSBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2JveCgidjRsMl9kZWMiLAorCQkJCWN0eC0+aWQsIFY0TF9DQVBfQlVGRl9NQVgsCisJCQkJNCArIFBBR0VfU0hJRlQsIGJtbXVfZmxhZyk7CisJCWlmICghY3R4LT5ibW11X2JveF9kdykgeworCQkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgImZhaWwgdG8gY3JlYXRlIGJtbXUgYm94IGR3XG4iKTsKKwkJCWdvdG8gZnJlZV9tbXVib3hfZHc7CisJCX0KKwl9CisKKwlrcmVmX2luaXQoJmN0eC0+Ym94X3JlZik7CisJZm9yIChpID0gMDsgaSA8IFY0TF9DQVBfQlVGRl9NQVg7IGkrKykgeworCQlzdHJ1Y3QgaW50ZXJuYWxfY29tcF9idWYgKmJ1ZjsKKwkJYnVmID0gJmN0eC0+Y29tcF9idWZzW2ldOworCQlidWYtPmluZGV4ID0gaTsKKwkJYnVmLT5yZWYgPSAwOworCQlidWYtPmJveF9yZWYgPSAmY3R4LT5ib3hfcmVmOworCQlidWYtPm1tdV9ib3ggPSBjdHgtPm1tdV9ib3g7CisJCWJ1Zi0+Ym1tdV9ib3ggPSBjdHgtPmJtbXVfYm94OworCQlidWYtPm1tdV9ib3hfZHcgPSBjdHgtPm1tdV9ib3hfZHc7CisJCWJ1Zi0+Ym1tdV9ib3hfZHcgPSBjdHgtPmJtbXVfYm94X2R3OworCX0KKwlrcmVmX2dldCgmY3R4LT5jdHhfcmVmKTsKKworCWN0eC0+dXZtX3Byb3h5ID0gdnphbGxvYyhzaXplb2YoKmN0eC0+dXZtX3Byb3h5KSAqIFY0TF9DQVBfQlVGRl9NQVgpOworCWlmICghY3R4LT51dm1fcHJveHkpCisJCWdvdG8gZnJlZV9tbXVib3g7CisKKwl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1BSSU5GTywKKwkJImJveCBpbml0LCBibW11OiAlcHgsIG1tdTogJXB4LCBtbXVfZHc6ICVweCBibW11X2R3OiAlcHhcbiIsCisJCWN0eC0+Ym1tdV9ib3gsIGN0eC0+bW11X2JveCwgY3R4LT5tbXVfYm94X2R3LCBjdHgtPmJtbXVfYm94X2R3KTsKKworCXJldHVybiAwOworZnJlZV9tbXVib3hfZHc6CisJZGVjb2Rlcl9tbXVfYm94X2ZyZWUoY3R4LT5tbXVfYm94X2R3KTsKKwljdHgtPm1tdV9ib3hfZHcgPSBOVUxMOworCitmcmVlX2JtbXVib3g6CisJZGVjb2Rlcl9ibW11X2JveF9mcmVlKGN0eC0+Ym1tdV9ib3gpOworCWN0eC0+Ym1tdV9ib3ggPSBOVUxMOworCitmcmVlX21tdWJveDoKKwlkZWNvZGVyX21tdV9ib3hfZnJlZShjdHgtPm1tdV9ib3gpOworCWN0eC0+bW11X2JveCA9IE5VTEw7CisKK2ZyZWVfY29tcF9idWZzOgorCXZmcmVlKGN0eC0+Y29tcF9idWZzKTsKKwljdHgtPmNvbXBfYnVmcyA9IE5VTEw7CisKKwlyZXR1cm4gLTE7Cit9CisKK3ZvaWQgYW1sX2FsbG9jX2J1ZmZlcihzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCwgaW50IGZsYWcpCit7CisJaW50IGkgPSAwOworCisJaWYgKGZsYWcgJiBEVl9UWVBFKSB7CisJCWZvciAoaSA9IDA7IGkgPCBWNExfQ0FQX0JVRkZfTUFYOyBpKyspIHsKKwkJCWN0eC0+YXV4X2luZm9zLmJ1ZnNbaV0ubWRfYnVmID0gdnphbGxvYyhNRF9CVUZfU0laRSk7CisJCQlpZiAoY3R4LT5hdXhfaW5mb3MuYnVmc1tpXS5tZF9idWYgPT0gTlVMTCkgeworCQkJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkJCSJ2NGwyIGFsbG9jICVkdGggZHYgbWQgYnVmZmVyIGZhaWxcbiIsIGkpOworCQkJfQorCisJCQljdHgtPmF1eF9pbmZvcy5idWZzW2ldLmNvbXBfYnVmID0gdnphbGxvYyhDT01QX0JVRl9TSVpFKTsKKwkJCWlmIChjdHgtPmF1eF9pbmZvcy5idWZzW2ldLmNvbXBfYnVmID09IE5VTEwpIHsKKwkJCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJCQkidjRsMiBhbGxvYyAlZHRoIGR2IGNvbXAgYnVmZmVyIGZhaWxcbiIsIGkpOworCQkJfQorCQl9CisJfQorCisJaWYgKGZsYWcgJiBTRUlfVFlQRSkgeworCQlmb3IgKGkgPSAwOyBpIDwgVjRMX0NBUF9CVUZGX01BWDsgaSsrKSB7CisJCQljdHgtPmF1eF9pbmZvcy5idWZzW2ldLnNlaV9idWYgPSB2emFsbG9jKFNFSV9CVUZfU0laRSk7CisJCQlpZiAoY3R4LT5hdXhfaW5mb3MuYnVmc1tpXS5zZWlfYnVmKSB7CisJCQkJY3R4LT5hdXhfaW5mb3MuYnVmc1tpXS5zZWlfc2l6ZSAgPSAwOworCQkJCWN0eC0+YXV4X2luZm9zLmJ1ZnNbaV0uc2VpX3N0YXRlID0gMTsKKwkJCQljdHgtPmF1eF9pbmZvcy5zZWlfbmVlZF9mcmVlID0gZmFsc2U7CisJCQkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FWElORk8sCisJCQkJCSJ2NGwyIGFsbG9jICVkdGggYXV4IGJ1ZmZlcjolcHhcbiIsCisJCQkJCWksIGN0eC0+YXV4X2luZm9zLmJ1ZnNbaV0uc2VpX2J1Zik7CisJCQl9IGVsc2UgeworCQkJCWN0eC0+YXV4X2luZm9zLmJ1ZnNbaV0uc2VpX2J1ZiA9IE5VTEw7CisJCQkJY3R4LT5hdXhfaW5mb3MuYnVmc1tpXS5zZWlfc3RhdGUgPSAwOworCQkJCWN0eC0+YXV4X2luZm9zLmJ1ZnNbaV0uc2VpX3NpemUgID0gMDsKKwkJCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJCQkidjRsMiBhbGxvYyAlZHRoIGF1eCBidWZmZXIgZmFpbFxuIiwgaSk7CisJCQl9CisJCX0KKwl9Cit9CisKK3ZvaWQgYW1sX2ZyZWVfYnVmZmVyKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4LCBpbnQgZmxhZykKK3sKKwlpbnQgaSA9IDA7CisKKwlpZiAoZmxhZyAmIERWX1RZUEUpIHsKKwkJZm9yIChpID0gMDsgaSA8IFY0TF9DQVBfQlVGRl9NQVg7IGkrKykgeworCQkJaWYgKGN0eC0+YXV4X2luZm9zLmJ1ZnNbaV0ubWRfYnVmICE9IE5VTEwpIHsKKwkJCQl2ZnJlZShjdHgtPmF1eF9pbmZvcy5idWZzW2ldLm1kX2J1Zik7CisJCQkJY3R4LT5hdXhfaW5mb3MuYnVmc1tpXS5tZF9idWYgPSBOVUxMOworCQkJfQorCisJCQlpZiAoY3R4LT5hdXhfaW5mb3MuYnVmc1tpXS5jb21wX2J1ZiAhPSBOVUxMKSB7CisJCQkJdmZyZWUoY3R4LT5hdXhfaW5mb3MuYnVmc1tpXS5jb21wX2J1Zik7CisJCQkJY3R4LT5hdXhfaW5mb3MuYnVmc1tpXS5jb21wX2J1ZiA9IE5VTEw7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoZmxhZyAmIFNFSV9UWVBFKSB7CisJCWZvciAoaSA9IDA7IGkgPCBWNExfQ0FQX0JVRkZfTUFYOyBpKyspIHsKKwkJCWlmIChjdHgtPmF1eF9pbmZvcy5idWZzW2ldLnNlaV9idWYgIT0gTlVMTCkgeworCQkJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVhJTkZPLAorCQkJCQkidjRsMiBmcmVlICVkdGggYXV4IGJ1ZmZlcjolcHhcbiIsCisJCQkJCWksIGN0eC0+YXV4X2luZm9zLmJ1ZnNbaV0uc2VpX2J1Zik7CisJCQkJdmZyZWUoY3R4LT5hdXhfaW5mb3MuYnVmc1tpXS5zZWlfYnVmKTsKKwkJCQljdHgtPmF1eF9pbmZvcy5idWZzW2ldLnNlaV9zdGF0ZSA9IDA7CisJCQkJY3R4LT5hdXhfaW5mb3MuYnVmc1tpXS5zZWlfc2l6ZSA9IDA7CisJCQkJY3R4LT5hdXhfaW5mb3MuYnVmc1tpXS5zZWlfYnVmID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KK30KKwordm9pZCBhbWxfZnJlZV9vbmVfc2VpX2J1ZmZlcihzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCwgY2hhciAqKmFkZHIsIGludCAqc2l6ZSwgaW50IGlkeCkKK3sKKwlpZiAoY3R4LT5hdXhfaW5mb3MuYnVmc1tpZHhdLnNlaV9idWYgIT0gTlVMTCkgeworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywKKwkJCSJ2NGwyIGZyZWUgJWR0aCBhdXggYnVmZmVyOiVweFxuIiwKKwkJCWlkeCwgY3R4LT5hdXhfaW5mb3MuYnVmc1tpZHhdLnNlaV9idWYpOworCisJCXZmcmVlKGN0eC0+YXV4X2luZm9zLmJ1ZnNbaWR4XS5zZWlfYnVmKTsKKwkJY3R4LT5hdXhfaW5mb3MuYnVmc1tpZHhdLnNlaV9zdGF0ZSA9IDA7CisJCWN0eC0+YXV4X2luZm9zLmJ1ZnNbaWR4XS5zZWlfc2l6ZSA9IDA7CisJCWN0eC0+YXV4X2luZm9zLmJ1ZnNbaWR4XS5zZWlfYnVmID0gTlVMTDsKKwkJKmFkZHIgPSBOVUxMOworCQkqc2l6ZSA9IDA7CisJCWN0eC0+YXV4X2luZm9zLnNlaV9uZWVkX2ZyZWUgPSB0cnVlOworCX0KK30KKwordm9pZCBhbWxfYmluZF9zZWlfYnVmZmVyKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4LCBjaGFyICoqYWRkciwgaW50ICpzaXplLCBpbnQgKmlkeCkKK3sKKwlpbnQgaW5kZXggPSBjdHgtPmF1eF9pbmZvcy5zZWlfaW5kZXg7CisJaW50IGNvdW50ID0gMDsKKworCWlmIChjdHgtPmF1eF9pbmZvcy5zZWlfbmVlZF9mcmVlKSB7CisJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IFY0TF9DQVBfQlVGRl9NQVg7IGNvdW50KyspIHsKKwkJCWlmICgoY3R4LT5hdXhfaW5mb3MuYnVmc1tpbmRleF0uc2VpX2J1ZiAhPSBOVUxMKSAmJgorCQkJCShjdHgtPmF1eF9pbmZvcy5idWZzW2luZGV4XS5zZWlfc3RhdGUgPT0gMSkpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWluZGV4ID0gKGluZGV4ICsgMSkgJSBWNExfQ0FQX0JVRkZfTUFYOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgVjRMX0NBUF9CVUZGX01BWDsgY291bnQrKykgeworCQkJaWYgKChjdHgtPmF1eF9pbmZvcy5idWZzW2luZGV4XS5zZWlfYnVmICE9IE5VTEwpICYmCisJCQkJKChjdHgtPmF1eF9pbmZvcy5idWZzW2luZGV4XS5zZWlfc3RhdGUgPT0gMSkgfHwKKwkJCQkoY3R4LT5hdXhfaW5mb3MuYnVmc1tpbmRleF0uc2VpX3N0YXRlID09IDIpKSkgeworCQkJCW1lbXNldChjdHgtPmF1eF9pbmZvcy5idWZzW2luZGV4XS5zZWlfYnVmLCAwLCBTRUlfQlVGX1NJWkUpOworCQkJCWN0eC0+YXV4X2luZm9zLmJ1ZnNbaW5kZXhdLnNlaV9zaXplID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWluZGV4ID0gKGluZGV4ICsgMSkgJSBWNExfQ0FQX0JVRkZfTUFYOworCQl9CisJfQorCisJaWYgKGNvdW50ID09IFY0TF9DQVBfQlVGRl9NQVgpIHsKKwkJKmFkZHIgPSBOVUxMOworCQkqc2l6ZSA9IDA7CisJfSBlbHNlIHsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FWElORk8sCisJCQkidjRsMiBiaW5kICVkdGggYXV4IGJ1ZmZlcjolcHgsIGNvdW50ID0gJWRcbiIsCisJCQlpbmRleCwgY3R4LT5hdXhfaW5mb3MuYnVmc1tpbmRleF0uc2VpX2J1ZiwgY291bnQpOworCQkqYWRkciA9IGN0eC0+YXV4X2luZm9zLmJ1ZnNbaW5kZXhdLnNlaV9idWY7CisJCSpzaXplID0gY3R4LT5hdXhfaW5mb3MuYnVmc1tpbmRleF0uc2VpX3NpemU7CisJCSppZHggID0gaW5kZXg7CisJCWN0eC0+YXV4X2luZm9zLmJ1ZnNbaW5kZXhdLnNlaV9zdGF0ZSA9IDI7CisJCWN0eC0+YXV4X2luZm9zLnNlaV9pbmRleCA9IChpbmRleCArIDEpICUgVjRMX0NBUF9CVUZGX01BWDsKKwl9Cit9CisKK3ZvaWQgYW1sX2JpbmRfZHZfYnVmZmVyKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4LCBjaGFyICoqY29tcF9idWYsIGNoYXIgKiptZF9idWYpCit7CisJaW50IGluZGV4ID0gY3R4LT5hdXhfaW5mb3MuZHZfaW5kZXg7CisKKwlpZiAoKGN0eC0+YXV4X2luZm9zLmJ1ZnNbaW5kZXhdLmNvbXBfYnVmICE9IE5VTEwpICYmCisJCShjdHgtPmF1eF9pbmZvcy5idWZzW2luZGV4XS5tZF9idWYgIT0gTlVMTCkpIHsKKwkJKmNvbXBfYnVmID0gY3R4LT5hdXhfaW5mb3MuYnVmc1tpbmRleF0uY29tcF9idWY7CisJCSptZF9idWYgPSBjdHgtPmF1eF9pbmZvcy5idWZzW2luZGV4XS5tZF9idWY7CisJCWN0eC0+YXV4X2luZm9zLmR2X2luZGV4ID0gKGluZGV4ICsgMSkgJSBWNExfQ0FQX0JVRkZfTUFYOworCX0KK30KKwordm9pZCBhbWxfdjRsX2N0eF9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqIGN0eDsKKworCWN0eCA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgYW1sX3Zjb2RlY19jdHgsIGN0eF9yZWYpOworCisJaWYgKGN0eC0+dnBwKSB7CisJCWF0b21pY19kZWMoJmN0eC0+ZGV2LT52cHBfY291bnQpOworCQlhbWxfdjRsMl92cHBfZGVzdHJveShjdHgtPnZwcCk7CisKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19QUklORk8sCisJCQkidnBwIGRlc3RvcnkgaW5zdCBjb3VudDolZC5cbiIsCisJCQlhdG9taWNfcmVhZCgmY3R4LT5kZXYtPnZwcF9jb3VudCkpOworCX0KKworCWlmIChjdHgtPmdlMmQpIHsKKwkJYW1sX3Y0bDJfZ2UyZF9kZXN0cm95KGN0eC0+Z2UyZCk7CisKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19QUklORk8sCisJCQkiZ2UyZCBkZXN0b3J5LlxuIik7CisJfQorCisJdjRsMl9tMm1fY3R4X3JlbGVhc2UoY3R4LT5tMm1fY3R4KTsKKwlhbWxfdGFza19jaGFpbl9yZW1vdmUoY3R4KTsKKworCXZmcmVlKGN0eC0+bWV0YV9pbmZvcy5tZXRhX2J1ZnMpOworCWN0eC0+YXV4X2luZm9zLmZyZWVfYnVmZmVyKGN0eCwgU0VJX1RZUEUgfCBEVl9UWVBFKTsKKwljdHgtPmF1eF9pbmZvcy5mcmVlX2J1ZmZlcihjdHgsIDEpOworCisJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19QUklORk8sCisJCSJ2NGxkZWMgaGFzIGJlZW4gZGVzdHJveWVkLlxuIik7CisKKwlpZiAoY3R4LT5zeW5jKSB7CisJCXZkZWNfY2xlYW5fYWxsX2ZlbmNlKGN0eC0+c3luYyk7CisJfQorCisJa2ZyZWUoY3R4KTsKK30KKworc3RhdGljIHZvaWQgYm94X3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICogY3R4CisJCT0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBhbWxfdmNvZGVjX2N0eCwgYm94X3JlZik7CisKKwl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0JVRk1HUiwKKwkJIiVzLCBibW11OiAlcHgsIG1tdTogJXB4IG1tdV9kdzogJXB1XG4iLAorCQlfX2Z1bmNfXywgY3R4LT5ibW11X2JveCwgY3R4LT5tbXVfYm94LGN0eC0+bW11X2JveF9kdyk7CisKKwlkZWNvZGVyX2JtbXVfYm94X2ZyZWUoY3R4LT5ibW11X2JveCk7CisJZGVjb2Rlcl9tbXVfYm94X2ZyZWUoY3R4LT5tbXVfYm94KTsKKworCWlmIChjdHgtPmNvbmZpZy5wYXJtLmRlYy5jZmcuZG91YmxlX3dyaXRlX21vZGUgJiAweDIwKSB7CisJCWRlY29kZXJfbW11X2JveF9mcmVlKGN0eC0+bW11X2JveF9kdyk7CisJCWRlY29kZXJfYm1tdV9ib3hfZnJlZShjdHgtPmJtbXVfYm94X2R3KTsKKwl9CisJdmZyZWUoY3R4LT5jb21wX2J1ZnMpOworCXZmcmVlKGN0eC0+dXZtX3Byb3h5KTsKKwlrcmVmX3B1dCgmY3R4LT5jdHhfcmVmLCBhbWxfdjRsX2N0eF9yZWxlYXNlKTsKK30KKworc3RhdGljIHZvaWQgaW50ZXJuYWxfYnVmX2ZyZWUodm9pZCAqYXJnKQoreworCXN0cnVjdCBpbnRlcm5hbF9jb21wX2J1ZiogaWJ1ZiA9CisJCShzdHJ1Y3QgaW50ZXJuYWxfY29tcF9idWYqKWFyZzsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKiBjdHgKKwkJPSBjb250YWluZXJfb2YoaWJ1Zi0+Ym94X3JlZixzdHJ1Y3QgYW1sX3Zjb2RlY19jdHgsIGJveF9yZWYpOworCisJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19CVUZNR1IsCisJCSIlcywgaWR4OiVkXG4iLCBfX2Z1bmNfXywgaWJ1Zi0+aW5kZXgpOworCisJbXV0ZXhfbG9jaygmY3R4LT5jb21wX2xvY2spOworCisJaWYgKCEoaWJ1Zi0+cmVmICYgMHhmZjAwKSkgeworCQlkZWNvZGVyX21tdV9ib3hfZnJlZV9pZHgoaWJ1Zi0+bW11X2JveCwgaWJ1Zi0+aW5kZXgpOworCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWVfaWR4KGlidWYtPmJtbXVfYm94LCBpYnVmLT5pbmRleCk7CisKKwkJaWYgKGN0eC0+Y29uZmlnLnBhcm0uZGVjLmNmZy5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MjApIHsKKwkJCWRlY29kZXJfbW11X2JveF9mcmVlX2lkeChpYnVmLT5tbXVfYm94X2R3LCBpYnVmLT5pbmRleCk7CisJCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWVfaWR4KGlidWYtPmJtbXVfYm94X2R3LCBpYnVmLT5pbmRleCk7CisJCX0KKwl9CisJaWJ1Zi0+cmVmID0gMDsKKworCW11dGV4X3VubG9jaygmY3R4LT5jb21wX2xvY2spOworCisJa3JlZl9wdXQoaWJ1Zi0+Ym94X3JlZiwgYm94X3JlbGVhc2UpOworfQorCitzdGF0aWMgdm9pZCBpbnRlcm5hbF9idWZfZnJlZTIodm9pZCAqYXJnKQoreworCXN0cnVjdCBpbnRlcm5hbF9jb21wX2J1ZiAqaWJ1ZiA9CisJCWNvbnRhaW5lcl9vZihhcmcsIHN0cnVjdCBpbnRlcm5hbF9jb21wX2J1ZiwgcHJpdl9kYXRhKTsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKiBjdHgKKwkJPSBjb250YWluZXJfb2YoaWJ1Zi0+Ym94X3JlZiwgc3RydWN0IGFtbF92Y29kZWNfY3R4LCBib3hfcmVmKTsKKworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfQlVGTUdSLAorCQkiJXMsIGlkeDogJWRcbiIsIF9fZnVuY19fLCBpYnVmLT5pbmRleCk7CisKKwltdXRleF9sb2NrKCZjdHgtPmNvbXBfbG9jayk7CisKKwlpZiAoIShpYnVmLT5yZWYgJiAweGZmMDApKSB7CisJCWRlY29kZXJfbW11X2JveF9mcmVlX2lkeChpYnVmLT5tbXVfYm94LCBpYnVmLT5pbmRleCk7CisJCWRlY29kZXJfYm1tdV9ib3hfZnJlZV9pZHgoaWJ1Zi0+Ym1tdV9ib3gsIGlidWYtPmluZGV4KTsKKworCQlpZiAoY3R4LT5jb25maWcucGFybS5kZWMuY2ZnLmRvdWJsZV93cml0ZV9tb2RlICYgMHgyMCkgeworCQkJZGVjb2Rlcl9tbXVfYm94X2ZyZWVfaWR4KGlidWYtPm1tdV9ib3hfZHcsIGlidWYtPmluZGV4KTsKKwkJCWRlY29kZXJfYm1tdV9ib3hfZnJlZV9pZHgoaWJ1Zi0+Ym1tdV9ib3hfZHcsIGlidWYtPmluZGV4KTsKKwkJfQorCX0KKwlpYnVmLT5yZWYgPSAwOworCisJbXV0ZXhfdW5sb2NrKCZjdHgtPmNvbXBfbG9jayk7CisKKwlrcmVmX3B1dChpYnVmLT5ib3hfcmVmLCBib3hfcmVsZWFzZSk7Cit9CisKK3N0YXRpYyB2b2lkIGFtbF91dm1fYnVmX2ZyZWUodm9pZCAqYXJnKQoreworCXN0cnVjdCBhbWxfdXZtX2J1ZmZfcmVmICogdWJ1ZiA9CisJCShzdHJ1Y3QgYW1sX3V2bV9idWZmX3JlZiopYXJnOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqIGN0eAorCQk9IGNvbnRhaW5lcl9vZih1YnVmLT5yZWYsIHN0cnVjdCBhbWxfdmNvZGVjX2N0eCwgY3R4X3JlZik7CisKKwl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0JVRk1HUiwKKwkJIiVzLCB2YjolZCwgZGJ1ZjolcHgsIGlubzolbHVcbiIsCisJCV9fZnVuY19fLCB1YnVmLT5pbmRleCwgdWJ1Zi0+ZGJ1ZiwKKwkJZmlsZV9pbm9kZSh1YnVmLT5kYnVmLT5maWxlKS0+aV9pbm8pOworCisJa3JlZl9wdXQodWJ1Zi0+cmVmLCBhbWxfdjRsX2N0eF9yZWxlYXNlKTsKKwl2ZnJlZSh1YnVmKTsKK30KKworc3RhdGljIGludCB1dm1fYXR0YWNoX2hvb2tfbW9kX2xvY2FsKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4LAorCQkJCSAgICAgc3RydWN0IHV2bV9ob29rX21vZF9pbmZvICp1dm0pCit7CisJc3RydWN0IGludGVybmFsX2NvbXBfYnVmKiBpYnVmID0gdXZtLT5hcmc7CisKKwljdHgtPnV2bV9wcm94eVtpYnVmLT5pbmRleF0gPSAqdXZtOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX2NvbXBfYnVmZmVyX3RvX3JldXNlKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4LAorCQkJCSAgICAgICBzdHJ1Y3QgYW1sX3ZpZGVvX2RlY19idWYgKmJ1ZikKK3sKKwlzdHJ1Y3QgaW50ZXJuYWxfY29tcF9idWYqIGlidWYgPSBOVUxMOworCisJbXV0ZXhfbG9jaygmY3R4LT5jb21wX2xvY2spOworCisJaWJ1ZiA9IHZiX3RvX2NvbXAoY3R4LCAmYnVmLT52Yi52YjJfYnVmKTsKKwlpZiAoIWlidWYpIHsKKwkJbXV0ZXhfdW5sb2NrKCZjdHgtPmNvbXBfbG9jayk7CisJCXJldHVybiAwOworCX0KKworCWlmIChpYnVmLT5yZWYgJiAweGZmKSB7CisJCWJ1Zi0+aW50ZXJuYWxfaW5kZXggPSBpYnVmLT5pbmRleDsKKwkJaWJ1Zi0+ZnJhbWVfYnVmZmVyX3NpemUgPSBjdHgtPmNvbXBfaW5mby5mcmFtZV9idWZmZXJfc2l6ZTsKKworCQlpZiAoY3R4LT5jb21wX2luZm8uaGVhZGVyX3NpemUgIT0gaWJ1Zi0+aGVhZGVyX3NpemUpIHsKKwkJCWRlY29kZXJfYm1tdV9ib3hfZnJlZV9pZHgoY3R4LT5ibW11X2JveCwgaWJ1Zi0+aW5kZXgpOworCQkJaWYgKGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeShjdHgtPmJtbXVfYm94LAorCQkJCWlidWYtPmluZGV4LCBjdHgtPmNvbXBfaW5mby5oZWFkZXJfc2l6ZSwKKwkJCQkidjRsMl9kZWMiLCAmaWJ1Zi0+aGVhZGVyX2FkZHIpIDwgMCkgeworCQkJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkJCSJmYWlsIHRvIGFsbG9jICVkdGggYm1tdVxuIiwKKwkJCQkJaWJ1Zi0+aW5kZXgpOworCQkJCW11dGV4X3VubG9jaygmY3R4LT5jb21wX2xvY2spOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJaWJ1Zi0+aGVhZGVyX3NpemUgPSBjdHgtPmNvbXBfaW5mby5oZWFkZXJfc2l6ZTsKKwkJfQorCisJCWlidWYtPnJlZiB8PSAoMSA8PCA4KTsKKworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0JVRk1HUiwKKwkJCSIlcywgcmV1c2UgY29tcCBidWZmZXIgdmIyOiVkIDwtLT4gaW50ZXJuYWw6ICVkLCBoZWFkZXJfYWRkciAweCVseCwgc2l6ZTogJXVcbiIsCisJCQlfX2Z1bmNfXywgYnVmLT52Yi52YjJfYnVmLmluZGV4LAorCQkJYnVmLT5pbnRlcm5hbF9pbmRleCwKKwkJCWlidWYtPmhlYWRlcl9hZGRyLAorCQkJaWJ1Zi0+aGVhZGVyX3NpemUpOworCX0KKworCW11dGV4X3VubG9jaygmY3R4LT5jb21wX2xvY2spOworCisJcmV0dXJuIChpYnVmLT5yZWYgJiAweGZmMDApID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgYmluZF9jb21wX2J1ZmZlcl90b191dm0oc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsCisJCXN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1ZiAqYnVmKQoreworCWludCByZXQsIGk7CisJc3RydWN0IGRtYV9idWYgKiBkbWEgPSBidWYtPnZiLnZiMl9idWYucGxhbmVzWzBdLmRidWY7CisJc3RydWN0IGFtbF9kZWNfcGFyYW1zICpwYXJtcyA9ICZjdHgtPmNvbmZpZy5wYXJtLmRlYzsKKwlzdHJ1Y3QgdXZtX2hvb2tfbW9kX2luZm8gdV9pbmZvOworCXN0cnVjdCBpbnRlcm5hbF9jb21wX2J1ZiogaWJ1ZjsKKwl1MzIgZHdfbW9kZSA9IFZERUNfRFdfTk9fQUZCQzsKKworCS8qIGdldCBoZWFkZXIgYW5kIHBhZ2Ugc2l6ZSAqLworCWlmICh2ZGVjX2lmX2dldF9wYXJhbShjdHgsIEdFVF9QQVJBTV9DT01QX0JVRl9JTkZPLCAmY3R4LT5jb21wX2luZm8pKSB7CisJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJmYWlsIHRvIGdldCBjb21wIGluZm9cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWN0eC0+Ym1tdV9ib3ggfHwgIWN0eC0+bW11X2JveCkKKwkJaWYgKGluaXRfbW11X2JtbXVfYm94KGN0eCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IHVwZGF0ZV9jb21wX2J1ZmZlcl90b19yZXVzZShjdHgsIGJ1Zik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAocmV0ID09IDEgLypyZXVzZWQqLykKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgVjRMX0NBUF9CVUZGX01BWDsgaSsrKSB7CisJCWlmICghY3R4LT5jb21wX2J1ZnNbaV0ucmVmKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gVjRMX0NBUF9CVUZGX01BWCkgeworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAib3V0IG9mIGludGVybmFsIGJ1ZlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh2ZGVjX2lmX2dldF9wYXJhbShjdHgsIEdFVF9QQVJBTV9EV19NT0RFLCAmZHdfbW9kZSkpIHsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgImludmFsaWQgZHdfbW9kZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJ1Zi0+aW50ZXJuYWxfaW5kZXgJPSBpOworCWlidWYJCQk9ICZjdHgtPmNvbXBfYnVmc1tpXTsKKwlpYnVmLT5mcmFtZV9idWZmZXJfc2l6ZQk9IGN0eC0+Y29tcF9pbmZvLmZyYW1lX2J1ZmZlcl9zaXplOworCWlidWYtPmhlYWRlcl9zaXplCT0gY3R4LT5jb21wX2luZm8uaGVhZGVyX3NpemU7CisKKwkvKiBhbGxvY2F0ZSBoZWFkZXIgKi8KKwlyZXQgPSBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkoY3R4LT5ibW11X2JveCwKKwkJCWlidWYtPmluZGV4LCBjdHgtPmNvbXBfaW5mby5oZWFkZXJfc2l6ZSwKKwkJCSJ2NGwyX2RlYyIsICZpYnVmLT5oZWFkZXJfYWRkcik7CisJaWYgKHJldCA8IDApIHsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgImZhaWwgdG8gYWxsb2MgJWR0aCBibW11XG4iLCBpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKGR3X21vZGUgJiAweDIwKSB7CisJCXJldCA9IGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeShjdHgtPmJtbXVfYm94X2R3LAorCQkJaWJ1Zi0+aW5kZXgsIGN0eC0+Y29tcF9pbmZvLmhlYWRlcl9zaXplLAorCQkJInY0bDJfZGVjIiwgJmlidWYtPmhlYWRlcl9kd19hZGRyKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJmYWlsIHRvIGFsbG9jICVkdGggYm1tdSBkd1xuIiwgaSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCWtyZWZfZ2V0KCZjdHgtPmJveF9yZWYpOworCWlidWYtPnJlZiA9IDE7CisKKwkvKiBmcmFtZSBTRyBidWZmZXIgbmVlZCB0byBiZSByZWFsbG9jIGluc2lkZSBkZWNvZGVyLAorCSAqIGp1c3QgYmVmb3JlIHNsaWNlIGRlY29kaW5nIHRvIHNhdmUgbWVtb3J5CisJICovCisJdV9pbmZvLnR5cGUgPSBWRl9TUkNfREVDT0RFUjsKKwl1X2luZm8uYXJnID0gaWJ1ZjsKKwl1X2luZm8uZnJlZSA9IGludGVybmFsX2J1Zl9mcmVlOworCisJaWYgKHBhcm1zLT5jZmcudXZtX2hvb2tfdHlwZSA9PSBWRl9QUk9DRVNTX1Y0TFZJREVPKSB7CisJCS8qIGFkYXB0ZWQgdmlkZW8gY29tcG9zZXIgdG8gdXNlIGZvciBod2MuICovCisJCWlidWYtPnByaXZfZGF0YS52NGxfaW5zdF9pZCA9IGN0eC0+aWQ7CisJCXVfaW5mby50eXBlID0gVkZfUFJPQ0VTU19WNExWSURFTzsKKwkJdV9pbmZvLmFyZyA9ICZpYnVmLT5wcml2X2RhdGE7CisJCXVfaW5mby5mcmVlID0gaW50ZXJuYWxfYnVmX2ZyZWUyOworCX0KKworCXJldCA9IGRtYWJ1Zl9pc191dm0oZG1hKSA/CisJCXV2bV9hdHRhY2hfaG9va19tb2QoZG1hLCAmdV9pbmZvKSA6CisJCXV2bV9hdHRhY2hfaG9va19tb2RfbG9jYWwoY3R4LCAmdV9pbmZvKTsKKwlpZiAocmV0IDwgMCkgeworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAiZmFpbCB0byBzZXQgZG1hYnVmIHByaXYgYnVmXG4iKTsKKwkJZ290byBibW11X2JveF9mcmVlOworCX0KKworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfQlVGTUdSLAorCQkiJXMsIGJpbmQgdmIyOiglZCwgJXB4KSA8LS0+IGludGVybmFsOiAoJWQsICVweCkgaGVhZGVyX2FkZHIgMHglbHgsIHNpemU6ICV1XG4iLAorCQlfX2Z1bmNfXywgYnVmLT52Yi52YjJfYnVmLmluZGV4LAorCQlkbWEsIGksIGlidWYsIGlidWYtPmhlYWRlcl9hZGRyLAorCQljdHgtPmNvbXBfaW5mby5oZWFkZXJfc2l6ZSk7CisKKwlyZXR1cm4gMDsKKworYm1tdV9ib3hfZnJlZToKKwlpZiAoZHdfbW9kZSAmIDB4MjApIHsKKwkJZGVjb2Rlcl9ibW11X2JveF9mcmVlX2lkeChpYnVmLT5ibW11X2JveF9kdywgaWJ1Zi0+aW5kZXgpOworCX0KKwlkZWNvZGVyX2JtbXVfYm94X2ZyZWVfaWR4KGlidWYtPmJtbXVfYm94LCBpYnVmLT5pbmRleCk7CisJa3JlZl9wdXQoJmN0eC0+Ym94X3JlZiwgYm94X3JlbGVhc2UpOworCWlidWYtPnJlZiA9IDA7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgYW1sX3V2bV9idWZmX2F0dGFjaChzdHJ1Y3QgdmIyX2J1ZmZlciAqIHZiKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBkbWFfYnVmICpkYnVmID0gdmItPnBsYW5lc1swXS5kYnVmOworCXN0cnVjdCB1dm1faG9va19tb2RfaW5mbyB1X2luZm87CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQl2YjJfZ2V0X2Rydl9wcml2KHZiLT52YjJfcXVldWUpOworCXN0cnVjdCBhbWxfdXZtX2J1ZmZfcmVmICp1YnVmID0gTlVMTDsKKworCWlmICh2Yi0+bWVtb3J5ICE9IFZCMl9NRU1PUllfRE1BQlVGIHx8ICFkbWFidWZfaXNfdXZtKGRidWYpKQorCQlyZXR1cm4gMDsKKworCXVidWYgPSB2emFsbG9jKHNpemVvZihzdHJ1Y3QgYW1sX3V2bV9idWZmX3JlZikpOworCWlmICh1YnVmID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJdWJ1Zi0+aW5kZXgJPSB2Yi0+aW5kZXg7CisJdWJ1Zi0+YWRkcgk9IHZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKHZiLCAwKTsKKwl1YnVmLT5kYnVmCT0gZGJ1ZjsKKwl1YnVmLT5yZWYJPSAmY3R4LT5jdHhfcmVmOworCisJdV9pbmZvLnR5cGUJPSBWRl9QUk9DRVNTX0RFQ09ERVI7CisJdV9pbmZvLmFyZwk9ICh2b2lkICopdWJ1ZjsKKwl1X2luZm8uZnJlZQk9IGFtbF91dm1fYnVmX2ZyZWU7CisJcmV0ID0gdXZtX2F0dGFjaF9ob29rX21vZChkYnVmLCAmdV9pbmZvKTsKKwlpZiAocmV0IDwgMCkgeworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJImFtbCB1dm0gYnVmZmVyICVkIGF0dGFjaCBmYWlsLlxuIiwKKwkJCXVidWYtPmluZGV4KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlrcmVmX2dldCh1YnVmLT5yZWYpOworCisJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19CVUZNR1IsCisJCSIlcywgdmI6JWQsIGRidWY6JXB4LCBpbm86JWx1XG4iLAorCQlfX2Z1bmNfXywgdWJ1Zi0+aW5kZXgsIHVidWYtPmRidWYsCisJCWZpbGVfaW5vZGUodWJ1Zi0+ZGJ1Zi0+ZmlsZSktPmlfaW5vKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZXJuYWxfY29tcF9idWYqIHZiX3RvX2NvbXAoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsCisJCQkJCSAgICBzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IGFtbF9kZWNfcGFyYW1zICpwYXJtcyA9ICZjdHgtPmNvbmZpZy5wYXJtLmRlYzsKKwlib29sIGlzX3Y0bHZpZGVvID0gKHBhcm1zLT5jZmcudXZtX2hvb2tfdHlwZSA9PSBWRl9QUk9DRVNTX1Y0TFZJREVPKTsKKwllbnVtIHV2bV9ob29rX21vZF90eXBlIHVfdHlwZSA9CisJCWlzX3Y0bHZpZGVvID8gVkZfUFJPQ0VTU19WNExWSURFTyA6IFZGX1NSQ19ERUNPREVSOworCXN0cnVjdCBkbWFfYnVmICpkYnVmID0gdmItPnBsYW5lc1swXS5kYnVmOworCXN0cnVjdCBpbnRlcm5hbF9jb21wX2J1ZiAqaWJ1ZiA9IE5VTEw7CisJc3RydWN0IHV2bV9ob29rX21vZCAqdWhtb2QgPSBOVUxMOworCisJdWhtb2QgPSB1dm1fZ2V0X2hvb2tfbW9kKGRidWYsIHVfdHlwZSk7CisJaWYgKElTX0VSUl9PUl9OVUxMKHVobW9kKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpYnVmID0gIWlzX3Y0bHZpZGVvID8gKHN0cnVjdCBpbnRlcm5hbF9jb21wX2J1ZiAqKSB1aG1vZC0+YXJnIDoKKwkJY29udGFpbmVyX29mKHVobW9kLT5hcmcsIHN0cnVjdCBpbnRlcm5hbF9jb21wX2J1ZiwgcHJpdl9kYXRhKTsKKworCXV2bV9wdXRfaG9va19tb2QoZGJ1ZiwgdV90eXBlKTsKKworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVhJTkZPLAorCQkiJXMsIHZiMjogKCVkLCAlcHgpIC0tPiBjb21wOiAoJWQsICVweClcbiIsCisJCV9fZnVuY19fLCB2Yi0+aW5kZXgsIGRidWYsIGlidWYtPmluZGV4LCBpYnVmKTsKKworCXJldHVybiBpYnVmOworfQorCitzdGF0aWMgdm9pZCB2YjJvcHNfdmRlY19idWZfcXVldWUoc3RydWN0IHZiMl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gdmIyX2dldF9kcnZfcHJpdih2Yi0+dmIyX3F1ZXVlKTsKKwlzdHJ1Y3QgdmIyX3Y0bDJfYnVmZmVyICp2YjJfdjRsMiA9IHRvX3ZiMl92NGwyX2J1ZmZlcih2Yik7CisJc3RydWN0IGFtbF92aWRlb19kZWNfYnVmICpidWYgPQorCQljb250YWluZXJfb2YodmIyX3Y0bDIsIHN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1ZiwgdmIpOworCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9ICZidWYtPmZyYW1lX2J1ZmZlcjsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19tZW0gc3JjX21lbTsKKworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfUFJPVCwKKwkJIiVzLCB2YjogJWx4LCB0eXBlOiAlZCwgaWR4OiAlZCwgc3RhdGU6ICVkLCB1c2VkOiAlZCwgdHM6ICVsbHVcbiIsCisJCV9fZnVuY19fLCAodWxvbmcpIHZiLCB2Yi0+dmIyX3F1ZXVlLT50eXBlLAorCQl2Yi0+aW5kZXgsIHZiLT5zdGF0ZSwgYnVmLT51c2VkLCB2Yi0+dGltZXN0YW1wKTsKKworCS8qCisJICogY2hlY2sgaWYgdGhpcyBidWZmZXIgaXMgcmVhZHkgdG8gYmUgdXNlZCBhZnRlciBkZWNvZGUKKwkgKi8KKwlpZiAoIVY0TDJfVFlQRV9JU19PVVRQVVQodmItPnZiMl9xdWV1ZS0+dHlwZSkpIHsKKwkJdTMyIGR3X21vZGUgPSBWREVDX0RXX05PX0FGQkM7CisKKwkJaWYgKHZkZWNfaWZfZ2V0X3BhcmFtKGN0eCwgR0VUX1BBUkFNX0RXX01PREUsICZkd19tb2RlKSkgeworCQkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgImludmFsaWQgZHdfbW9kZVxuIik7CisJCQlyZXR1cm47CisKKwkJfQorCisJCWlmICghYnVmLT5xdWVfaW5fbTJtKSB7CisJCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0JVRk1HUiwKKwkJCQkiZW5xdWUgY2FwdHVyZSBidWYgaWR4ICVkLCB2ZjogJWx4XG4iLAorCQkJCXZiLT5pbmRleCwgKHVsb25nKSB2NGxfZ2V0X3ZmX2hhbmRsZSh2YjJfdjRsMi0+cHJpdmF0ZSkpOworCisJCQkvKiBiaW5kIGNvbXByZXNzZWQgYnVmZmVyIHRvIHV2bSAqLworCQkJaWYgKChkd19tb2RlICE9IFZERUNfRFdfTk9fQUZCQykgJiYKKwkJCQl2Yi0+bWVtb3J5ID09IFZCMl9NRU1PUllfRE1BQlVGICYmCisJCQkJYmluZF9jb21wX2J1ZmZlcl90b191dm0oY3R4LCBidWYpKSB7CisJCQkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgImZhaWwgdG8gYmluZCBjb21wIGJ1ZmZlclxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQkvKiBESSBob29rIG11c3QgYmUgZGV0YWNoZWQgaWYgdGhlIGRtYWJ1ZmYgYmUgcmV1c2VkLiAqLworCQkJaWYgKGN0eC0+dnBwX2NmZy5lbmFibGVfbG9jYWxfYnVmKSB7CisJCQkJc3RydWN0IGRtYV9idWYgKmRtYSA9IHZiLT5wbGFuZXNbMF0uZGJ1ZjsKKworCQkJCWlmIChkbWFidWZfaXNfdXZtKGRtYSkgJiYKKwkJCQkJdXZtX2RldGFjaF9ob29rX21vZChkbWEsIFZGX1BST0NFU1NfREkpIDwgMCkgeworCQkJCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywKKwkJCQkJCSJkbWFidWYgd2l0aG91dCBhdHRhY2ggREkgaG9vay5cbiIpOworCQkJCX0KKwkJCX0KKworCQkJdGFza19jaGFpbl9jbGVhbihmYi0+dGFzayk7CisKKwkJCWN0eC0+Y2FwX3Bvb2wuc2VxW2N0eC0+Y2FwX3Bvb2wuaW4rK10gPQorCQkJCShWNExfQ0FQX0JVRkZfSU5fTTJNIDw8IDE2IHwgdmItPmluZGV4KTsKKwkJCXY0bDJfbTJtX2J1Zl9xdWV1ZShjdHgtPm0ybV9jdHgsIHZiMl92NGwyKTsKKwkJCWJ1Zi0+cXVlX2luX20ybSA9IHRydWU7CisKKwkJCWZiLT5zdGF0dXMgPSBGQl9TVF9JTklUOworCQkJQVRSQUNFX0NPVU5URVIoIlZDX0lOX1ZTSU5LLTIuc3RvcmFnZSIsIHZiLT5pbmRleCk7CisKKwkJCS8qIGNoZWNrIGRwYiByZWFkeSAqLworCQkJYW1sX2NoZWNrX2RwYl9yZWFkeShjdHgpOworCQl9IGVsc2UgeworCQkJc3RydWN0IHZmcmFtZV9zICp2ZiA9IGZiLT52ZnJhbWU7CisJCQlzdHJ1Y3QgdGFza19jaGFpbl9zICp0YXNrID0gZmItPnRhc2s7CisKKwkJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfT1VUUFVULAorCQkJCSJJTl9fQlVGRiAoJXMsIHN0OiVkLCBzZXE6JWQpIHZiOiglZCwgJXB4KSwgdmY6KCVkLCAlcHgpLCB0czolbGxkLCAiCisJCQkJIlk6KCVseCwgJXUpIEMvVTooJWx4LCAldSkgVjooJWx4LCAldSlcbiIsCisJCQkJY3R4LT5hZGFfY3R4LT5mcm1fbmFtZSwgZmItPnN0YXR1cywgdmYgPyB2Zi0+aW5kZXhfZGlzcCA6IC0xLAorCQkJCXZiLT5pbmRleCwgdmIsCisJCQkJdmYgPyB2Zi0+aW5kZXggJiAweGZmIDogLTEsIHZmLAorCQkJCXZmID8gdmYtPnRpbWVzdGFtcCA6IDAsCisJCQkJZmItPm0ubWVtWzBdLmFkZHIsIGZiLT5tLm1lbVswXS5zaXplLAorCQkJCWZiLT5tLm1lbVsxXS5hZGRyLCBmYi0+bS5tZW1bMV0uc2l6ZSwKKwkJCQlmYi0+bS5tZW1bMl0uYWRkciwgZmItPm0ubWVtWzJdLnNpemUpOworCisJCQlBVFJBQ0VfQ09VTlRFUigiVkNfSU5fVlNJTkstNC5yZWN5Y2xlIiwgdmItPmluZGV4KTsKKworCQkJdGFzay0+cmVjeWNsZSh0YXNrLCBUQVNLX1RZUEVfVjRMX1NJTkspOworCQl9CisKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjdHgtPmNhcF93cSk7CisJCXJldHVybjsKKwl9CisKKwl2NGwyX20ybV9idWZfcXVldWUoY3R4LT5tMm1fY3R4LCB0b192YjJfdjRsMl9idWZmZXIodmIpKTsKKworCWlmIChjdHgtPnN0YXRlICE9IEFNTF9TVEFURV9JTklUKSB7CisJCXJldHVybjsKKwl9CisKKwlidWYtPnVzZWQgPSB0cnVlOworCXZiMl92NGwyID0gdG9fdmIyX3Y0bDJfYnVmZmVyKHZiKTsKKwlidWYgPSBjb250YWluZXJfb2YodmIyX3Y0bDIsIHN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1ZiwgdmIpOworCWlmIChidWYtPmxhc3RmcmFtZSkgeworCQkvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4uIEp1c3QgaW4gY2FzZS4gKi8KKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJJbnZhbGlkIGZsdXNoIGJ1ZmZlci5cbiIpOworCQlidWYtPnVzZWQgPSBmYWxzZTsKKwkJdjRsMl9tMm1fc3JjX2J1Zl9yZW1vdmUoY3R4LT5tMm1fY3R4KTsKKwkJaWYgKGN0eC0+aXNfZHJtX21vZGUgJiYgKHZiLT5tZW1vcnkgPT0gVkIyX01FTU9SWV9ETUFCVUYpKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjdHgtPndxKTsKKworCQlyZXR1cm47CisJfQorCisJc3JjX21lbS5pbmRleAk9IHZiLT5pbmRleDsKKwlzcmNfbWVtLnZhZGRyCT0gdmIyX3BsYW5lX3ZhZGRyKHZiLCAwKTsKKwlzcmNfbWVtLmFkZHIJPSBzZ19kbWFfYWRkcmVzcyhidWYtPm91dF9zZ3QtPnNnbCk7CisJc3JjX21lbS5zaXplCT0gdmItPnBsYW5lc1swXS5ieXRlc3VzZWQ7CisJc3JjX21lbS5tb2RlbAk9IHZiLT5tZW1vcnk7CisJc3JjX21lbS50aW1lc3RhbXAgPSB2Yi0+dGltZXN0YW1wOworCXNyY19tZW0ubWV0YV9wdHIgPSAodWxvbmcpYnVmLT5tZXRhX2RhdGE7CisKKwlpZiAodmRlY19pZl9wcm9iZShjdHgsICZzcmNfbWVtLCBOVUxMKSkgeworCQlidWYtPnVzZWQgPSBmYWxzZTsKKwkJdjRsMl9tMm1fc3JjX2J1Zl9yZW1vdmUoY3R4LT5tMm1fY3R4KTsKKworCQlpZiAoY3R4LT5pc19kcm1fbW9kZSAmJgorCQkJKHNyY19tZW0ubW9kZWwgPT0gVkIyX01FTU9SWV9ETUFCVUYpKSB7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmN0eC0+d3EpOworCQl9IGVsc2UgeworCQkJdjRsMl9idWZmX2RvbmUodG9fdmIyX3Y0bDJfYnVmZmVyKHZiKSwKKwkJCQlWQjJfQlVGX1NUQVRFX0RPTkUpOworCQl9CisKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogSWYgb24gbW9kZWwgZG1hYnVmIG11c3QgcmVtb3ZlIHRoZSBidWZmZXIKKwkgKiBiZWNhdXNlIHRoaXMgZGF0YSBoYXMgYmVlbiBjb25zdW1lZCBieSBody4KKwkgKi8KKwlidWYtPnVzZWQgPSBmYWxzZTsKKwl2NGwyX20ybV9zcmNfYnVmX3JlbW92ZShjdHgtPm0ybV9jdHgpOworCisJaWYgKGN0eC0+aXNfZHJtX21vZGUgJiYKKwkJKHNyY19tZW0ubW9kZWwgPT0gVkIyX01FTU9SWV9ETUFCVUYpKSB7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY3R4LT53cSk7CisJfSBlbHNlIGlmIChjdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSkgeworCQl2NGwyX2J1ZmZfZG9uZSh0b192YjJfdjRsMl9idWZmZXIodmIpLAorCQkJVkIyX0JVRl9TVEFURV9ET05FKTsKKwl9CisKKwlpZiAodmRlY19pZl9nZXRfcGFyYW0oY3R4LCBHRVRfUEFSQU1fUElDX0lORk8sICZjdHgtPnBpY2luZm8pKSB7CisJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkiR0VUX1BBUkFNX1BJQ1RVUkVfSU5GTyBlcnJcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFjdHgtPnBpY2luZm8uZHBiX2ZyYW1lcykKKwkJcmV0dXJuOworCisJdjRsX2J1Zl9zaXplX2RlY2lzaW9uKGN0eCk7CisJY3R4LT5sYXN0X2RlY29kZWRfcGljaW5mbyA9IGN0eC0+cGljaW5mbzsKKworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfUFJJTkZPLAorCQkiUGljdHVyZSBidWZmZXIgY291bnQ6IGRlYzoldSwgdnBwOiV1LCBnZTJkOiV1LCBtYXJnaW46JXUsIHRvdGFsOiV1XG4iLAorCQljdHgtPnBpY2luZm8uZHBiX2ZyYW1lcywgY3R4LT52cHBfc2l6ZSwgY3R4LT5nZTJkX3NpemUsCisJCWN0eC0+cGljaW5mby5kcGJfbWFyZ2luLAorCQlDVFhfQlVGX1RPVEFMKGN0eCkpOworCisJYW1sX3ZkZWNfZGlzcGF0Y2hfZXZlbnQoY3R4LCBWNEwyX0VWRU5UX1NSQ19DSF9SRVNPTFVUSU9OKTsKKworCW11dGV4X2xvY2soJmN0eC0+c3RhdGVfbG9jayk7CisJaWYgKGN0eC0+c3RhdGUgPT0gQU1MX1NUQVRFX0lOSVQpIHsKKwkJY3R4LT5zdGF0ZSA9IEFNTF9TVEFURV9QUk9CRTsKKwkJQVRSQUNFX0NPVU5URVIoIlZfU1RfVlNJTkstc3RhdGUiLCBjdHgtPnN0YXRlKTsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19TVEFURSwKKwkJCSJ2Y29kZWMgc3RhdGUgKEFNTF9TVEFURV9QUk9CRSlcbiIpOworCX0KKwltdXRleF91bmxvY2soJmN0eC0+c3RhdGVfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHZiMm9wc192ZGVjX2J1Zl9maW5pc2goc3RydWN0IHZiMl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gdmIyX2dldF9kcnZfcHJpdih2Yi0+dmIyX3F1ZXVlKTsKKwlzdHJ1Y3QgdmIyX3Y0bDJfYnVmZmVyICp2YjJfdjRsMiA9IE5VTEw7CisJc3RydWN0IGFtbF92aWRlb19kZWNfYnVmICpidWYgPSBOVUxMOworCisJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19QUk9ULAorCQkiJXMsIHR5cGU6ICVkLCBpZHg6ICVkXG4iLAorCQlfX2Z1bmNfXywgdmItPnZiMl9xdWV1ZS0+dHlwZSwgdmItPmluZGV4KTsKKworCXZiMl92NGwyID0gdG9fdmIyX3Y0bDJfYnVmZmVyKHZiKTsKKwlidWYgPSBjb250YWluZXJfb2YodmIyX3Y0bDIsIHN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1ZiwgdmIpOworCisJaWYgKGJ1Zi0+ZXJyb3IpIHsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJVbnJlY292ZXJhYmxlIGVycm9yIG9uIGJ1ZmZlci5cbiIpOworCQljdHgtPnN0YXRlID0gQU1MX1NUQVRFX0FCT1JUOworCQlBVFJBQ0VfQ09VTlRFUigiVl9TVF9WU0lOSy1zdGF0ZSIsIGN0eC0+c3RhdGUpOworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1NUQVRFLAorCQkJInZjb2RlYyBzdGF0ZSAoQU1MX1NUQVRFX0FCT1JUKVxuIik7CisJfQorfQorCitzdGF0aWMgaW50IHZiMm9wc192ZGVjX2J1Zl9pbml0KHN0cnVjdCB2YjJfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IHZiMl9nZXRfZHJ2X3ByaXYodmItPnZiMl9xdWV1ZSk7CisJc3RydWN0IHZiMl92NGwyX2J1ZmZlciAqdmIyX3Y0bDIgPSBjb250YWluZXJfb2YodmIsCisJCQkJCXN0cnVjdCB2YjJfdjRsMl9idWZmZXIsIHZiMl9idWYpOworCXN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1ZiAqYnVmID0gY29udGFpbmVyX29mKHZiMl92NGwyLAorCQkJCQlzdHJ1Y3QgYW1sX3ZpZGVvX2RlY19idWYsIHZiKTsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPSAmYnVmLT5mcmFtZV9idWZmZXI7CisJdTMyIHNpemUsIHBoeV9hZGRyID0gMDsKKwlpbnQgaTsKKworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfUFJPVCwgIiVzLCB0eXBlOiAlZCwgaWR4OiAlZFxuIiwKKwkJX19mdW5jX18sIHZiLT52YjJfcXVldWUtPnR5cGUsIHZiLT5pbmRleCk7CisKKwlpZiAoVjRMMl9UWVBFX0lTX09VVFBVVCh2Yi0+dmIyX3F1ZXVlLT50eXBlKSkgeworCQlidWYtPmxhc3RmcmFtZSA9IGZhbHNlOworCX0KKworCS8qIGNvZGVjX21tIGJ1ZmZlcnMgY291bnQgKi8KKwlpZiAoIVY0TDJfVFlQRV9JU19PVVRQVVQodmItPnR5cGUpKSB7CisJCWlmICh2Yi0+bWVtb3J5ID09IFZCMl9NRU1PUllfTU1BUCkgeworCQkJY2hhciAqb3duZXIgPSBfX2dldG5hbWUoKTsKKworCQkJc25wcmludGYob3duZXIsIFBBVEhfTUFYLCAiJXMtJWQiLCAidjRsLW91dHB1dCIsIGN0eC0+aWQpOworCQkJc3RybmNweShidWYtPm1lbV9vbndlciwgb3duZXIsIHNpemVvZihidWYtPm1lbV9vbndlcikpOworCQkJYnVmLT5tZW1fb253ZXJbc2l6ZW9mKGJ1Zi0+bWVtX29ud2VyKSAtIDFdID0gJ1wwJzsKKwkJCV9fcHV0bmFtZShvd25lcik7CisKKwkJCWZvciAoaSA9IDA7IGkgPCB2Yi0+bnVtX3BsYW5lczsgaSsrKSB7CisJCQkJc2l6ZSA9IHZiLT5wbGFuZXNbaV0ubGVuZ3RoOworCQkJCXBoeV9hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIodmIsIGkpOworCQkJCWJ1Zi0+bWVtW2ldID0gdjRsX3JlcWJ1ZnNfZnJvbV9jb2RlY19tbShidWYtPm1lbV9vbndlciwKKwkJCQkJCXBoeV9hZGRyLCBzaXplLCB2Yi0+aW5kZXgpOworCQkJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfQlVGTUdSLAorCQkJCQkJIk9VVCAlYyBhbGxvYywgYWRkcjogJXgsIHNpemU6ICV1LCBpZHg6ICV1XG4iLAorCQkJCQkJKGkgPT0gMD8gJ1knOidDJyksIHBoeV9hZGRyLCBzaXplLCB2Yi0+aW5kZXgpOworCQkJfQorCQl9IGVsc2UgaWYgKHZiLT5tZW1vcnkgPT0gVkIyX01FTU9SWV9ETUFCVUYpIHsKKwkJCXVuc2lnbmVkIGludCBkd19tb2RlID0gVkRFQ19EV19OT19BRkJDOworCisJCQlmb3IgKGkgPSAwOyBpIDwgdmItPm51bV9wbGFuZXM7IGkrKykgeworCQkJCXN0cnVjdCBkbWFfYnVmICogZG1hOworCisJCQkJaWYgKHZkZWNfaWZfZ2V0X3BhcmFtKGN0eCwgR0VUX1BBUkFNX0RXX01PREUsICZkd19tb2RlKSkgeworCQkJCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAiaW52YWxpZCBkd19tb2RlXG4iKTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJCS8qIE5vbmUtRFcgbW9kZSBtZWFucyBzaW5nbGUgbGF5ZXIgKi8KKwkJCQlpZiAoZHdfbW9kZSA9PSBWREVDX0RXX0FGQkNfT05MWSAmJiBpID4gMCkgeworCQkJCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJCQkJCSJvbmx5IHN1cHBvcnQgc2luZ2xlIHBsYW5lIGluIGR3IG1vZGUgMFxuIik7CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCQlzaXplID0gdmItPnBsYW5lc1tpXS5sZW5ndGg7CisJCQkJZG1hID0gdmItPnBsYW5lc1tpXS5kYnVmOworCisJCQkJaWYgKCFkbWFidWZfaXNfdXZtKGRtYSkpCisJCQkJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfUFJJTkZPLCAibm9uLXV2bSBkbWFidWZcbiIpOworCQkJfQorCQl9CisJfQorCisJaWYgKCFWNEwyX1RZUEVfSVNfT1VUUFVUKHZiLT50eXBlKSkgeworCQlzdHJ1Y3QgdmZyYW1lX3MgKnZmID0gTlVMTDsKKwkJc3RydWN0IHRhc2tfY2hhaW5fcyAqdGFzayA9IE5VTEw7CisJCXN0cnVjdCB0YXNrX2NoYWluX3MgKnRhc2tfcHJlID0gZmItPnRhc2s7CisJCXUzMiBpY29tcCA9IC0xOworCisJCWZiX21hcF90YWJsZV9mZXRjaChjdHgsIHZiLCAmdmYsICZ0YXNrLCAmaWNvbXApOworCQlpZiAodmYpIHsKKwkJCWZiLT50YXNrCQk9IHRhc2s7CisJCQlmYi0+dmZyYW1lCQk9IHZmOworCQkJdmYtPnY0bF9tZW1faGFuZGxlCT0gKHVsb25nKWZiOworCQkJYnVmLT5pbnRlcm5hbF9pbmRleAk9IGljb21wOworCQkJdGFza19jaGFpbl91cGRhdGVfb2JqZWN0KHRhc2ssIGZiKTsKKwkJfSBlbHNlIHsKKwkJCWJ1Zi0+cXVlX2luX20ybSA9IGZhbHNlOworCisJCQlpZiAoYW1sX3V2bV9idWZmX2F0dGFjaCh2YikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmICh0YXNrX2NoYWluX2luaXQoJmZiLT50YXNrLCBjdHgsIGZiLCB2Yi0+aW5kZXgpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlsaXN0X2FkZCgmZmItPnRhc2stPm5vZGUsICZjdHgtPnRhc2tfY2hhaW5fcG9vbCk7CisgCQl9CisKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19CVUZNR1IsCisJCQkiaW5pdCBidWZmZXIoJXMpLCB2YiBpZHg6JWQsIHRhc2s6KCVweCAtPiAlcHgpLCBhZGRyOiglbHggLT4gJWx4KSwgaWNvbXA6JWRcbiIsCisJCQl2ZiA/ICJ1cGRhdGUiIDogImlkZWwiLAorCQkJdmItPmluZGV4LCB0YXNrX3ByZSwgZmItPnRhc2ssCisJCQlmYi0+bS5tZW1bMF0uYWRkciwKKwkJCSh1bG9uZykgdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIodmIsIDApLAorCQkJKGludClpY29tcCk7CisKKwkJdXBkYXRlX3ZkZWNfYnVmX3BsYW5lKGN0eCwgZmIsIHZiKTsKKwl9CisKKwlpZiAoVjRMMl9UWVBFX0lTX09VVFBVVCh2Yi0+dHlwZSkpIHsKKwkJdWxvbmcgY29udGlnX3NpemU7CisKKwkJYnVmLT5vdXRfc2d0ID0gdmIyX2RtYV9zZ19wbGFuZV9kZXNjKHZiLCAwKTsKKworCQljb250aWdfc2l6ZSA9IGRtYWJ1Zl9jb250aWd1b3VzX3NpemUoYnVmLT5vdXRfc2d0KTsKKwkJaWYgKGNvbnRpZ19zaXplIDwgdmItPnBsYW5lc1swXS5ieXRlc3VzZWQpIHsKKwkJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkJImNvbnRpZ3VvdXMgbWFwcGluZyBpcyB0b28gc21hbGwgJWx1LyV1XG4iLAorCQkJCWNvbnRpZ19zaXplLCBzaXplKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZiMm9wc192ZGVjX2J1Zl9jbGVhbnVwKHN0cnVjdCB2YjJfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IHZiMl9nZXRfZHJ2X3ByaXYodmItPnZiMl9xdWV1ZSk7CisJc3RydWN0IHZiMl92NGwyX2J1ZmZlciAqdmIyX3Y0bDIgPSBjb250YWluZXJfb2YodmIsCisJCQkJCXN0cnVjdCB2YjJfdjRsMl9idWZmZXIsIHZiMl9idWYpOworCXN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1ZiAqYnVmID0gY29udGFpbmVyX29mKHZiMl92NGwyLAorCQkJCQlzdHJ1Y3QgYW1sX3ZpZGVvX2RlY19idWYsIHZiKTsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPSAmYnVmLT5mcmFtZV9idWZmZXI7OworCisJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19QUk9ULCAiJXMsIHR5cGU6ICVkLCBpZHg6ICVkXG4iLAorCQlfX2Z1bmNfXywgdmItPnZiMl9xdWV1ZS0+dHlwZSwgdmItPmluZGV4KTsKKworCWlmICghVjRMMl9UWVBFX0lTX09VVFBVVCh2Yi0+dHlwZSkpIHsKKwkJaWYgKHZiLT5tZW1vcnkgPT0gVkIyX01FTU9SWV9NTUFQKSB7CisJCQlpbnQgaTsKKworCQkJZm9yIChpID0gMDsgaSA8IHZiLT5udW1fcGxhbmVzIDsgaSsrKSB7CisJCQkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19CVUZNR1IsCisJCQkJCSJPVVQgJWMgY2xlYW4sIGFkZHI6ICVseCwgc2l6ZTogJXUsIGlkeDogJXVcbiIsCisJCQkJCShpID09IDApPyAnWSc6J0MnLAorCQkJCQlidWYtPm1lbVtpXS0+cGh5X2FkZHIsIGJ1Zi0+bWVtW2ldLT5idWZmZXJfc2l6ZSwgdmItPmluZGV4KTsKKwkJCQl2NGxfZnJlZWJ1ZnNfYmFja190b19jb2RlY19tbShidWYtPm1lbV9vbndlciwgYnVmLT5tZW1baV0pOworCQkJCWJ1Zi0+bWVtW2ldID0gTlVMTDsKKwkJCX0KKwkJfQorCQlpZiAoY3R4LT5vdXRwdXRfdGhyZWFkX3JlYWR5KSB7CisJCQlpZiAoIWlzX2ZiX21hcHBlZChjdHgsIGZiLT5tLm1lbVswXS5hZGRyKSkgeworCQkJCWxpc3RfZGVsKCZmYi0+dGFzay0+bm9kZSk7CisJCQkJdGFza19jaGFpbl9jbGVhbihmYi0+dGFzayk7CisJCQkJdGFza19jaGFpbl9yZWxlYXNlKGZiLT50YXNrKTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGludCB2YjJvcHNfdmRlY19zdGFydF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqcSwgdW5zaWduZWQgaW50IGNvdW50KQoreworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gdmIyX2dldF9kcnZfcHJpdihxKTsKKworCWN0eC0+aGFzX3JlY2VpdmVfZW9zID0gZmFsc2U7CisJY3R4LT52NGxfcmVzb2x1dGlvbl9jaGFuZ2UgPSBmYWxzZTsKKworCS8qIHZkZWMgaGFzIHJlYWR5IHRvIGRlY29kZSBzdWJzZXF1ZW5jZSBkYXRhIG9mIG5ldyByZXNvbHV0aW9uLiAqLworCXY0bDJfbTJtX2pvYl9yZXN1bWUoY3R4LT5kZXYtPm0ybV9kZXZfZGVjLCBjdHgtPm0ybV9jdHgpOworCisJdjRsMl9tMm1fc2V0X2RzdF9idWZmZXJlZChjdHgtPmZoLm0ybV9jdHgsIHRydWUpOworCisJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19QUk9ULAorCQkiJXMsIHR5cGU6ICVkXG4iLCBfX2Z1bmNfXywgcS0+dHlwZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdmIyb3BzX3ZkZWNfc3RvcF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqcSkKK3sKKwlzdHJ1Y3QgYW1sX3ZpZGVvX2RlY19idWYgKmJ1ZiA9IE5VTEw7CisJc3RydWN0IHZiMl92NGwyX2J1ZmZlciAqdmIyX3Y0bDIgPSBOVUxMOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gdmIyX2dldF9kcnZfcHJpdihxKTsKKwlpbnQgaTsKKworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfUFJPVCwKKwkJIiVzLCB0eXBlOiAlZCwgc3RhdGU6ICV4LCBmcmFtZV9jbnQ6ICVkXG4iLAorCQlfX2Z1bmNfXywgcS0+dHlwZSwgY3R4LT5zdGF0ZSwgY3R4LT5kZWNvZGVkX2ZyYW1lX2NudCk7CisKKwlpZiAoVjRMMl9UWVBFX0lTX09VVFBVVChxLT50eXBlKSkKKwkJY3R4LT5pc19vdXRfc3RyZWFtX29mZiA9IHRydWU7CisJZWxzZQorCQljdHgtPmlzX3N0cmVhbV9vZmYgPSB0cnVlOworCisJaWYgKFY0TDJfVFlQRV9JU19PVVRQVVQocS0+dHlwZSkpIHsKKwkJc3RydWN0IHZiMl9xdWV1ZSAqIHF1ZSA9IHY0bDJfbTJtX2dldF9kc3RfdnEoY3R4LT5tMm1fY3R4KTsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQljYW5jZWxfd29ya19zeW5jKCZjdHgtPmRtYWJ1ZmZfcmVjeWNsZV93b3JrKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmN0eC0+ZG1hYnVmZl9yZWN5Y2xlX2xvY2ssIGZsYWdzKTsKKwkJSU5JVF9LRklGTyhjdHgtPmRtYWJ1ZmZfcmVjeWNsZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0eC0+ZG1hYnVmZl9yZWN5Y2xlX2xvY2ssIGZsYWdzKTsKKworCQl3aGlsZSAoKHZiMl92NGwyID0gdjRsMl9tMm1fc3JjX2J1Zl9yZW1vdmUoY3R4LT5tMm1fY3R4KSkpCisJCQl2NGwyX2J1ZmZfZG9uZSh2YjJfdjRsMiwgVkIyX0JVRl9TVEFURV9FUlJPUik7CisKKwkJZm9yIChpID0gMDsgaSA8IHEtPm51bV9idWZmZXJzOyArK2kpIHsKKwkJCXZiMl92NGwyID0gdG9fdmIyX3Y0bDJfYnVmZmVyKHEtPmJ1ZnNbaV0pOworCQkJaWYgKHZiMl92NGwyLT52YjJfYnVmLnN0YXRlID09IFZCMl9CVUZfU1RBVEVfQUNUSVZFKQorCQkJCXY0bDJfYnVmZl9kb25lKHZiMl92NGwyLCBWQjJfQlVGX1NUQVRFX0VSUk9SKTsKKwkJfQorCisJCS8qCisJCSAqIGRyb3AgZXMgZnJhbWUgd2FzIHN0b3JlZCBpbiB0aGUgdmRlY19pbnB1dAorCQkgKiBpZiB0aGUgY2FwdHVyZSBxdWV1ZSBoYXZlIG5vdCBzdGFydCBzdHJlYW1pbmcuCisJCSAqLworCQlpZiAoIXF1ZS0+c3RyZWFtaW5nICYmCisJCQkodmRlY19mcmFtZV9udW1iZXIoY3R4LT5hZGFfY3R4KSA+IDApICYmCisJCQkoY3R4LT5zdGF0ZSA8IEFNTF9TVEFURV9BQ1RJVkUpKSB7CisJCQljdHgtPnN0YXRlID0gQU1MX1NUQVRFX0lOSVQ7CisJCQlBVFJBQ0VfQ09VTlRFUigiVl9TVF9WU0lOSy1zdGF0ZSIsIGN0eC0+c3RhdGUpOworCQkJY3R4LT52NGxfcmVzb2x1dGlvbl9jaGFuZ2UgPSBmYWxzZTsKKwkJCWN0eC0+cmVzZXRfZmxhZyA9IFY0TF9SRVNFVF9NT0RFX05PUk1BTDsKKwkJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfUFJJTkZPLAorCQkJCSJmb3JjZSByZXNldCB0byBkcm9wIGVzIGZyYW1lcy5cbiIpOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjdHgtPmNhcF93cSk7CisJCQlhbWxfdmRlY19yZXNldChjdHgpOworCQl9CisJfSBlbHNlIHsKKwkJLyogY2xlYW4gb3V0cHV0IGNhY2hlIGFuZCBkZWNvZGVyIHN0YXR1cyAuICovCisJCWlmIChjdHgtPnN0YXRlID4gQU1MX1NUQVRFX0lOSVQpIHsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY3R4LT5jYXBfd3EpOworCQkJYW1sX3ZkZWNfcmVzZXQoY3R4KTsKKwkJfQorCisJCWNhbmNlbF93b3JrX3N5bmMoJmN0eC0+ZGVjb2RlX3dvcmspOworCQltdXRleF9sb2NrKCZjdHgtPmNhcHR1cmVfYnVmZmVyX2xvY2spOworCQlJTklUX0tGSUZPKGN0eC0+Y2FwdHVyZV9idWZmZXIpOworCQltdXRleF91bmxvY2soJmN0eC0+Y2FwdHVyZV9idWZmZXJfbG9jayk7CisKKwkJd2hpbGUgKCh2YjJfdjRsMiA9IHY0bDJfbTJtX2RzdF9idWZfcmVtb3ZlKGN0eC0+bTJtX2N0eCkpKQorCQkJdjRsMl9idWZmX2RvbmUodmIyX3Y0bDIsIFZCMl9CVUZfU1RBVEVfRVJST1IpOworCisJCWZvciAoaSA9IDA7IGkgPCBxLT5udW1fYnVmZmVyczsgKytpKSB7CisJCQl2YjJfdjRsMiA9IHRvX3ZiMl92NGwyX2J1ZmZlcihxLT5idWZzW2ldKTsKKwkJCWJ1ZiA9IGNvbnRhaW5lcl9vZih2YjJfdjRsMiwgc3RydWN0IGFtbF92aWRlb19kZWNfYnVmLCB2Yik7CisJCQlidWYtPmZyYW1lX2J1ZmZlci5zdGF0dXMJPSBGQl9TVF9GUkVFOworCQkJYnVmLT5mcmFtZV9idWZmZXIudmZyYW1lCT0gTlVMTDsKKwkJCWJ1Zi0+cXVlX2luX20ybQkJCT0gZmFsc2U7CisJCQlidWYtPnVzZWQJCQk9IGZhbHNlOworCQkJYnVmLT52Yi5mbGFncwkJCT0gMDsKKwkJCWN0eC0+Y2FwX3Bvb2wuc2VxW2ldCQk9IDA7CisKKwkJCWlmICh2YjJfdjRsMi0+dmIyX2J1Zi5zdGF0ZSA9PSBWQjJfQlVGX1NUQVRFX0FDVElWRSkKKwkJCQl2NGwyX2J1ZmZfZG9uZSh2YjJfdjRsMiwgVkIyX0JVRl9TVEFURV9FUlJPUik7CisKKwkJCS8qdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FWElORk8sICJpZHg6ICVkLCBzdGF0ZTogJWRcbiIsCisJCQkJcS0+YnVmc1tpXS0+aW5kZXgsIHEtPmJ1ZnNbaV0tPnN0YXRlKTsqLworCQl9CisKKwkJZmJfbWFwX3RhYmxlX2NsZWFuKGN0eCk7CisKKwkJZmJfdG9rZW5fY2xlYW4oY3R4KTsKKworCQljdHgtPmJ1Zl91c2VkX2NvdW50ID0gMDsKKwkJY3R4LT5jYXBfcG9vbC5pbiA9IDA7CisJCWN0eC0+Y2FwX3Bvb2wub3V0ID0gMDsKKwkJY3R4LT5jYXBfcG9vbC5kZWMgPSAwOworCQljdHgtPmNhcF9wb29sLnZwcCA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBtMm1vcHNfdmRlY19kZXZpY2VfcnVuKHZvaWQgKnByaXYpCit7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPSBwcml2OworCXN0cnVjdCBhbWxfdmNvZGVjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisKKwlpZiAoY3R4LT5vdXRwdXRfdGhyZWFkX3JlYWR5KQorCQlxdWV1ZV93b3JrKGRldi0+ZGVjb2RlX3dvcmtxdWV1ZSwgJmN0eC0+ZGVjb2RlX3dvcmspOworfQorCitzdGF0aWMgaW50IG0ybW9wc192ZGVjX2pvYl9yZWFkeSh2b2lkICptMm1fcHJpdikKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IG0ybV9wcml2OworCisJaWYgKGN0eC0+c3RhdGUgPCBBTUxfU1RBVEVfUFJPQkUgfHwKKwkJY3R4LT5zdGF0ZSA+IEFNTF9TVEFURV9GTFVTSEVEKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBtMm1vcHNfdmRlY19qb2JfYWJvcnQodm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IHByaXY7CisKKwl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywgIiVzXG4iLCBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyBpbnQgYW1sX3ZkZWNfZ192X2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IGN0cmxfdG9fY3R4KGN0cmwpOworCWludCByZXQgPSAwOworCisJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19QUk9ULAorCQkiJXMsIGlkOiAlZFxuIiwgX19mdW5jX18sIGN0cmwtPmlkKTsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX01JTl9CVUZGRVJTX0ZPUl9DQVBUVVJFOgorCQlpZiAoY3R4LT5zdGF0ZSA+PSBBTUxfU1RBVEVfUFJPQkUpIHsKKwkJCWN0cmwtPnZhbCA9IENUWF9CVUZfVE9UQUwoY3R4KTsKKwkJfSBlbHNlIHsKKwkJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkJIlNlcWluZm8gbm90IHJlYWR5LlxuIik7CisJCQljdHJsLT52YWwgPSAwOworCQl9CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTUlOX0JVRkZFUlNfRk9SX09VVFBVVDoKKwkJY3RybC0+dmFsID0gNDsKKwkJYnJlYWs7CisJY2FzZSBBTUxfVjRMMl9HRVRfSU5QVVRfQlVGRkVSX05VTToKKwkJaWYgKGN0eC0+YWRhX2N0eCAhPSBOVUxMKQorCQkJY3RybC0+dmFsID0gdmRlY19mcmFtZV9udW1iZXIoY3R4LT5hZGFfY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBBTUxfVjRMMl9HRVRfRklMTUdSQUlOX0lORk86CisJCWN0cmwtPnZhbCA9IGN0eC0+ZmlsbV9ncmFpbl9wcmVzZW50OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFtbF92ZGVjX3RyeV9zX3ZfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQoreworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gY3RybF90b19jdHgoY3RybCk7CisKKwl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1BST1QsICIlc1xuIiwgX19mdW5jX18pOworCisJaWYgKGN0cmwtPmlkID09IEFNTF9WNEwyX1NFVF9EUk1NT0RFKSB7CisJCWN0eC0+aXNfZHJtX21vZGUgPSBjdHJsLT52YWw7CisJCWN0eC0+cGFyYW1fc2V0c19mcm9tX3Vjb2RlID0gdHJ1ZTsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19QUklORk8sCisJCQkic2V0IHN0cmVhbSBtb2RlOiAleFxuIiwgY3RybC0+dmFsKTsKKwl9IGVsc2UgaWYgKGN0cmwtPmlkID09IEFNTF9WNEwyX1NFVF9EVVJBVElPTikgeworCQl2ZGVjX3NldF9kdXJhdGlvbihjdHJsLT52YWwpOworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1BSSU5GTywKKwkJCSJzZXQgZHVyYXRpb246ICV4XG4iLCBjdHJsLT52YWwpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9vcHMgYW1sX3Zjb2RlY19kZWNfY3RybF9vcHMgPSB7CisJLmdfdm9sYXRpbGVfY3RybCA9IGFtbF92ZGVjX2dfdl9jdHJsLAorCS50cnlfY3RybCA9IGFtbF92ZGVjX3RyeV9zX3ZfY3RybCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX2NvbmZpZyBjdHJsX3N0X21vZGUgPSB7CisJLm5hbWUJPSAiZHJtIG1vZGUiLAorCS5pZAk9IEFNTF9WNEwyX1NFVF9EUk1NT0RFLAorCS5vcHMJPSAmYW1sX3Zjb2RlY19kZWNfY3RybF9vcHMsCisJLnR5cGUJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCS5mbGFncwk9IFY0TDJfQ1RSTF9GTEFHX1dSSVRFX09OTFksCisJLm1pbgk9IDAsCisJLm1heAk9IDEsCisJLnN0ZXAJPSAxLAorCS5kZWYJPSAwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfY29uZmlnIGN0cmxfZ3RfaW5wdXRfYnVmZmVyX251bWJlciA9IHsKKwkubmFtZQk9ICJpbnB1dCBidWZmZXIgbnVtYmVyIiwKKwkuaWQJPSBBTUxfVjRMMl9HRVRfSU5QVVRfQlVGRkVSX05VTSwKKwkub3BzCT0gJmFtbF92Y29kZWNfZGVjX2N0cmxfb3BzLAorCS50eXBlCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkuZmxhZ3MJPSBWNEwyX0NUUkxfRkxBR19WT0xBVElMRSwKKwkubWluCT0gMCwKKwkubWF4CT0gMTI4LAorCS5zdGVwCT0gMSwKKwkuZGVmCT0gMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX2NvbmZpZyBjdHJsX3N0X2R1cmF0aW9uID0geworCS5uYW1lCT0gImR1cmF0aW9uIiwKKwkuaWQJPSBBTUxfVjRMMl9TRVRfRFVSQVRJT04sCisJLm9wcwk9ICZhbWxfdmNvZGVjX2RlY19jdHJsX29wcywKKwkudHlwZQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJLmZsYWdzCT0gVjRMMl9DVFJMX0ZMQUdfV1JJVEVfT05MWSwKKwkubWluCT0gMCwKKwkubWF4CT0gOTYwMDAsCisJLnN0ZXAJPSAxLAorCS5kZWYJPSAwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfY29uZmlnIGN0cmxfZ3RfZmlsbWdyYWluX2luZm8gPSB7CisJLm5hbWUJPSAiZmlsbWdyYWluIGluZm8iLAorCS5pZAk9IEFNTF9WNEwyX0dFVF9GSUxNR1JBSU5fSU5GTywKKwkub3BzCT0gJmFtbF92Y29kZWNfZGVjX2N0cmxfb3BzLAorCS50eXBlCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkuZmxhZ3MJPSBWNEwyX0NUUkxfRkxBR19WT0xBVElMRSwKKwkubWluCT0gMCwKKwkubWF4CT0gMSwKKwkuc3RlcAk9IDEsCisJLmRlZgk9IDAsCit9OworCitpbnQgYW1sX3Zjb2RlY19kZWNfY3RybHNfc2V0dXAoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsOworCisJdjRsMl9jdHJsX2hhbmRsZXJfaW5pdCgmY3R4LT5jdHJsX2hkbCwgMyk7CisJY3RybCA9IHY0bDJfY3RybF9uZXdfc3RkKCZjdHgtPmN0cmxfaGRsLAorCQkJCSZhbWxfdmNvZGVjX2RlY19jdHJsX29wcywKKwkJCQlWNEwyX0NJRF9NSU5fQlVGRkVSU19GT1JfQ0FQVFVSRSwKKwkJCQkwLCAzMiwgMSwgMik7CisJaWYgKChjdHJsID09IE5VTEwpIHx8IChjdHgtPmN0cmxfaGRsLmVycm9yKSkgeworCQlyZXQgPSBjdHgtPmN0cmxfaGRsLmVycm9yOworCQlnb3RvIGVycjsKKwl9CisJY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfVk9MQVRJTEU7CisKKwljdHJsID0gdjRsMl9jdHJsX25ld19zdGQoJmN0eC0+Y3RybF9oZGwsCisJCQkJJmFtbF92Y29kZWNfZGVjX2N0cmxfb3BzLAorCQkJCVY0TDJfQ0lEX01JTl9CVUZGRVJTX0ZPUl9PVVRQVVQsCisJCQkJMCwgMzIsIDEsIDgpOworCWlmICgoY3RybCA9PSBOVUxMKSB8fCAoY3R4LT5jdHJsX2hkbC5lcnJvcikpIHsKKwkJcmV0ID0gY3R4LT5jdHJsX2hkbC5lcnJvcjsKKwkJZ290byBlcnI7CisJfQorCWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX1ZPTEFUSUxFOworCisJY3RybCA9IHY0bDJfY3RybF9uZXdfY3VzdG9tKCZjdHgtPmN0cmxfaGRsLCAmY3RybF9zdF9tb2RlLCBOVUxMKTsKKwlpZiAoKGN0cmwgPT0gTlVMTCkgfHwgKGN0eC0+Y3RybF9oZGwuZXJyb3IpKSB7CisJCXJldCA9IGN0eC0+Y3RybF9oZGwuZXJyb3I7CisJCWdvdG8gZXJyOworCX0KKworCWN0cmwgPSB2NGwyX2N0cmxfbmV3X2N1c3RvbSgmY3R4LT5jdHJsX2hkbCwgJmN0cmxfZ3RfaW5wdXRfYnVmZmVyX251bWJlciwgTlVMTCk7CisJaWYgKChjdHJsID09IE5VTEwpIHx8IChjdHgtPmN0cmxfaGRsLmVycm9yKSkgeworCQlyZXQgPSBjdHgtPmN0cmxfaGRsLmVycm9yOworCQlnb3RvIGVycjsKKwl9CisKKwljdHJsID0gdjRsMl9jdHJsX25ld19jdXN0b20oJmN0eC0+Y3RybF9oZGwsICZjdHJsX3N0X2R1cmF0aW9uLCBOVUxMKTsKKwlpZiAoKGN0cmwgPT0gTlVMTCkgfHwgKGN0eC0+Y3RybF9oZGwuZXJyb3IpKSB7CisJCXJldCA9IGN0eC0+Y3RybF9oZGwuZXJyb3I7CisJCWdvdG8gZXJyOworCX0KKworCWN0cmwgPSB2NGwyX2N0cmxfbmV3X2N1c3RvbSgmY3R4LT5jdHJsX2hkbCwgJmN0cmxfZ3RfZmlsbWdyYWluX2luZm8sIE5VTEwpOworCWlmICgoY3RybCA9PSBOVUxMKSB8fCAoY3R4LT5jdHJsX2hkbC5lcnJvcikpIHsKKwkJcmV0ID0gY3R4LT5jdHJsX2hkbC5lcnJvcjsKKwkJZ290byBlcnI7CisJfQorCisJdjRsMl9jdHJsX2hhbmRsZXJfc2V0dXAoJmN0eC0+Y3RybF9oZGwpOworCisJcmV0dXJuIDA7CitlcnI6CisJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJIkFkZGluZyBjb250cm9sIGZhaWxlZCAlZFxuIiwKKwkJY3R4LT5jdHJsX2hkbC5lcnJvcik7CisJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmY3R4LT5jdHJsX2hkbCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2aWRpb2NfdmRlY19nX3Bhcm0oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKmEpCit7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPSBmaF90b19jdHgoZmgpOworCXN0cnVjdCB2YjJfcXVldWUgKmRzdF92cTsKKworCWRzdF92cSA9IHY0bDJfbTJtX2dldF92cShjdHgtPm0ybV9jdHgsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSk7CisJaWYgKCFkc3RfdnEpIHsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJubyB2YjIgcXVldWUgZm9yIHR5cGU9JWRcbiIsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSKGEtPnR5cGUpICYmIGRzdF92cS0+aXNfbXVsdGlwbGFuYXIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChhLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUKSB8fCAoYS0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpKSB7CisJCWlmICh2ZGVjX2lmX2dldF9wYXJhbShjdHgsIEdFVF9QQVJBTV9DT05GSUdfSU5GTywgJmN0eC0+Y29uZmlnLnBhcm0uZGVjKSkKKwkJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkJIkdFVF9QQVJBTV9DT05GSUdfSU5GTyBlcnJcbiIpOworCQllbHNlCisJCQltZW1jcHkoYS0+cGFybS5yYXdfZGF0YSwgY3R4LT5jb25maWcucGFybS5kYXRhLAorCQkJCXNpemVvZihhLT5wYXJtLnJhd19kYXRhKSk7CisJfQorCisJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19QUk9ULCAiJXNcbiIsIF9fZnVuY19fKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX2RlY19jZmdpbmZvKHN0cnVjdCBhbWxfdmRlY19jZmdfaW5mb3MgKmNmZykKK3sKKwlpZiAoY2ZnLT5kb3VibGVfd3JpdGVfbW9kZSAhPSAwICYmCisJCWNmZy0+ZG91YmxlX3dyaXRlX21vZGUgIT0gMSAmJgorCQljZmctPmRvdWJsZV93cml0ZV9tb2RlICE9IDIgJiYKKwkJY2ZnLT5kb3VibGVfd3JpdGVfbW9kZSAhPSAzICYmCisJCWNmZy0+ZG91YmxlX3dyaXRlX21vZGUgIT0gNCAmJgorCQljZmctPmRvdWJsZV93cml0ZV9tb2RlICE9IDE2ICYmCisJCWNmZy0+ZG91YmxlX3dyaXRlX21vZGUgIT0gMHgyMSAmJgorCQljZmctPmRvdWJsZV93cml0ZV9tb2RlICE9IDB4MTAwICYmCisJCWNmZy0+ZG91YmxlX3dyaXRlX21vZGUgIT0gMHgyMDApIHsKKwkJcHJfZXJyKCJpbnZhbGlkIGRvdWJsZSB3cml0ZSBtb2RlICVkXG4iLCBjZmctPmRvdWJsZV93cml0ZV9tb2RlKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoY2ZnLT5yZWZfYnVmX21hcmdpbiA+IDIwKSB7CisJCXByX2VycigiaW52YWxpZCBtYXJnaW4gJWRcbiIsIGNmZy0+cmVmX2J1Zl9tYXJnaW4pOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKG1hbmRhdG9yeV9kd19tbXUpIHsKKwkJY2ZnLT5kb3VibGVfd3JpdGVfbW9kZSA9IDB4MjE7CisJfQorCisJcHJfaW5mbygiZG91YmxlIHdyaXRlIG1vZGUgJWQgbWFyZ2luICVkXG4iLAorCQljZmctPmRvdWJsZV93cml0ZV9tb2RlLCBjZmctPnJlZl9idWZfbWFyZ2luKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfdmRlY19zX3Bhcm0oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKmEpCit7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPSBmaF90b19jdHgoZmgpOworCXN0cnVjdCB2YjJfcXVldWUgKmRzdF92cTsKKworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfUFJPVCwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlkc3RfdnEgPSB2NGwyX20ybV9nZXRfdnEoY3R4LT5tMm1fY3R4LCBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpOworCWlmICghZHN0X3ZxKSB7CisJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkibm8gdmIyIHF1ZXVlIGZvciB0eXBlPSVkXG4iLCBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIVY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUihhLT50eXBlKSAmJiBkc3RfdnEtPmlzX211bHRpcGxhbmFyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChhLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUIHx8CisJCWEtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKSB7CisJCXN0cnVjdCBhbWxfZGVjX3BhcmFtcyAqaW4gPQorCQkJKHN0cnVjdCBhbWxfZGVjX3BhcmFtcyAqKSBhLT5wYXJtLnJhd19kYXRhOworCQlzdHJ1Y3QgYW1sX2RlY19wYXJhbXMgKmRlYyA9ICZjdHgtPmNvbmZpZy5wYXJtLmRlYzsKKworCQljdHgtPmNvbmZpZy50eXBlID0gVjRMMl9DT05GSUdfUEFSTV9ERUNPREU7CisKKwkJaWYgKGluLT5wYXJtc19zdGF0dXMgJiBWNEwyX0NPTkZJR19QQVJNX0RFQ09ERV9DRkdJTkZPKSB7CisJCQlpZiAoY2hlY2tfZGVjX2NmZ2luZm8oJmluLT5jZmcpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJZGVjLT5jZmcgPSBpbi0+Y2ZnOworCQl9CisJCWlmIChpbi0+cGFybXNfc3RhdHVzICYgVjRMMl9DT05GSUdfUEFSTV9ERUNPREVfUFNJTkZPKQorCQkJZGVjLT5wcyA9IGluLT5wczsKKwkJaWYgKGluLT5wYXJtc19zdGF0dXMgJiBWNEwyX0NPTkZJR19QQVJNX0RFQ09ERV9IRFJJTkZPKQorCQkJZGVjLT5oZHIgPSBpbi0+aGRyOworCQlpZiAoaW4tPnBhcm1zX3N0YXR1cyAmIFY0TDJfQ09ORklHX1BBUk1fREVDT0RFX0NOVElORk8pCisJCQlkZWMtPmNudCA9IGluLT5jbnQ7CisKKwkJZGVjLT5wYXJtc19zdGF0dXMgfD0gaW4tPnBhcm1zX3N0YXR1czsKKworCQkvKiBhbWwgdjRsIGRyaXZlciBwYXJtcyBjb25maWcuICovCisJCWN0eC0+dnBwX2NmZy5lbmFibGVfbnIgPQorCQkJKGRlYy0+Y2ZnLm1ldGFkYXRhX2NvbmZpZ19mbGFnICYgKDEgPDwgMTUpKTsKKwkJaWYgKGZvcmNlX2VuYWJsZV9ucikKKwkJCWN0eC0+dnBwX2NmZy5lbmFibGVfbnIgPSB0cnVlOworCisJCWN0eC0+dnBwX2NmZy5lbmFibGVfbG9jYWxfYnVmID0KKwkJCShkZWMtPmNmZy5tZXRhZGF0YV9jb25maWdfZmxhZyAmICgxIDw8IDE0KSk7CisJCWlmIChmb3JjZV9lbmFibGVfZGlfbG9jYWxfYnVmZmVyKQorCQkJY3R4LT52cHBfY2ZnLmVuYWJsZV9sb2NhbF9idWYgPSB0cnVlOworCisJCWN0eC0+aW50ZXJuYWxfZHdfc2NhbGUgPSBkZWMtPmNmZy5tZXRhZGF0YV9jb25maWdfZmxhZyAmICgxIDw8IDEzKTsKKwkJY3R4LT5zZWNvbmRfZmllbGRfcHRzX21vZGUgPSBkZWMtPmNmZy5tZXRhZGF0YV9jb25maWdfZmxhZyAmICgxIDw8IDEyKTsKKworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1BST1QsICIlcyBwYXJtczoleCBtZXRhZGF0YV9jb25maWdfZmxhZzogMHgleFxuIiwKKwkJCQlfX2Z1bmNfXywgaW4tPnBhcm1zX3N0YXR1cywgZGVjLT5jZmcubWV0YWRhdGFfY29uZmlnX2ZsYWcpOworCisJCW1lbXNldChhLT5wYXJtLm91dHB1dC5yZXNlcnZlZCwgMCwgc2l6ZW9mKGEtPnBhcm0ub3V0cHV0LnJlc2VydmVkKSk7CisJfSBlbHNlIHsKKwkJbWVtc2V0KGEtPnBhcm0uY2FwdHVyZS5yZXNlcnZlZCwgMCwgc2l6ZW9mKGEtPnBhcm0uY2FwdHVyZS5yZXNlcnZlZCkpOworCX0KKworCXJldHVybiAwOworfQorCisKK2NvbnN0IHN0cnVjdCB2NGwyX20ybV9vcHMgYW1sX3ZkZWNfbTJtX29wcyA9IHsKKwkuZGV2aWNlX3J1bgk9IG0ybW9wc192ZGVjX2RldmljZV9ydW4sCisJLmpvYl9yZWFkeQk9IG0ybW9wc192ZGVjX2pvYl9yZWFkeSwKKwkuam9iX2Fib3J0CT0gbTJtb3BzX3ZkZWNfam9iX2Fib3J0LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YjJfb3BzIGFtbF92ZGVjX3ZiMl9vcHMgPSB7CisJLnF1ZXVlX3NldHVwCT0gdmIyb3BzX3ZkZWNfcXVldWVfc2V0dXAsCisJLmJ1Zl9wcmVwYXJlCT0gdmIyb3BzX3ZkZWNfYnVmX3ByZXBhcmUsCisJLmJ1Zl9xdWV1ZQk9IHZiMm9wc192ZGVjX2J1Zl9xdWV1ZSwKKwkud2FpdF9wcmVwYXJlCT0gdmIyX29wc193YWl0X3ByZXBhcmUsCisJLndhaXRfZmluaXNoCT0gdmIyX29wc193YWl0X2ZpbmlzaCwKKwkuYnVmX2luaXQJPSB2YjJvcHNfdmRlY19idWZfaW5pdCwKKwkuYnVmX2NsZWFudXAJPSB2YjJvcHNfdmRlY19idWZfY2xlYW51cCwKKwkuYnVmX2ZpbmlzaAk9IHZiMm9wc192ZGVjX2J1Zl9maW5pc2gsCisJLnN0YXJ0X3N0cmVhbWluZyA9IHZiMm9wc192ZGVjX3N0YXJ0X3N0cmVhbWluZywKKwkuc3RvcF9zdHJlYW1pbmcJPSB2YjJvcHNfdmRlY19zdG9wX3N0cmVhbWluZywKK307CisKK2NvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyBhbWxfdmRlY19pb2N0bF9vcHMgPSB7CisJLnZpZGlvY19zdHJlYW1vbgkJPSB2aWRpb2NfZGVjb2Rlcl9zdHJlYW1vbiwKKwkudmlkaW9jX3N0cmVhbW9mZgkJPSB2aWRpb2NfZGVjb2Rlcl9zdHJlYW1vZmYsCisJLnZpZGlvY19yZXFidWZzCQkJPSB2aWRpb2NfZGVjb2Rlcl9yZXFidWZzLAorCS52aWRpb2NfcXVlcnlidWYJCT0gdmlkaW9jX3ZkZWNfcXVlcnlidWYsCisJLnZpZGlvY19leHBidWYJCQk9IHZpZGlvY192ZGVjX2V4cGJ1ZiwKKwkvLy52aWRpb2NfZ19jdHJsCQk9IHZpZGlvY192ZGVjX2dfY3RybCwKKworCS52aWRpb2NfcWJ1ZgkJCT0gdmlkaW9jX3ZkZWNfcWJ1ZiwKKwkudmlkaW9jX2RxYnVmCQkJPSB2aWRpb2NfdmRlY19kcWJ1ZiwKKworCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwX21wbGFuZQk9IHZpZGlvY190cnlfZm10X3ZpZF9jYXBfb3V0LAorCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwCQk9IHZpZGlvY190cnlfZm10X3ZpZF9jYXBfb3V0LAorCS52aWRpb2NfdHJ5X2ZtdF92aWRfb3V0X21wbGFuZQk9IHZpZGlvY190cnlfZm10X3ZpZF9jYXBfb3V0LAorCS52aWRpb2NfdHJ5X2ZtdF92aWRfb3V0CQk9IHZpZGlvY190cnlfZm10X3ZpZF9jYXBfb3V0LAorCisJLnZpZGlvY19zX2ZtdF92aWRfY2FwX21wbGFuZQk9IHZpZGlvY192ZGVjX3NfZm10LAorCS52aWRpb2Nfc19mbXRfdmlkX2NhcAkJPSB2aWRpb2NfdmRlY19zX2ZtdCwKKwkudmlkaW9jX3NfZm10X3ZpZF9vdXRfbXBsYW5lCT0gdmlkaW9jX3ZkZWNfc19mbXQsCisJLnZpZGlvY19zX2ZtdF92aWRfb3V0CQk9IHZpZGlvY192ZGVjX3NfZm10LAorCS52aWRpb2NfZ19mbXRfdmlkX2NhcF9tcGxhbmUJPSB2aWRpb2NfdmRlY19nX2ZtdCwKKwkudmlkaW9jX2dfZm10X3ZpZF9jYXAJCT0gdmlkaW9jX3ZkZWNfZ19mbXQsCisJLnZpZGlvY19nX2ZtdF92aWRfb3V0X21wbGFuZQk9IHZpZGlvY192ZGVjX2dfZm10LAorCS52aWRpb2NfZ19mbXRfdmlkX291dAkJPSB2aWRpb2NfdmRlY19nX2ZtdCwKKworCS52aWRpb2NfY3JlYXRlX2J1ZnMJCT0gdmlkaW9jX3ZkZWNfY3JlYXRlX2J1ZnMsCisKKwkvL2ZpeG1lCisJLy8udmlkaW9jX2VudW1fZm10X3ZpZF9jYXBfbXBsYW5lCT0gdmlkaW9jX3ZkZWNfZW51bV9mbXRfdmlkX2NhcF9tcGxhbmUsCisJLy8udmlkaW9jX2VudW1fZm10X3ZpZF9vdXRfbXBsYW5lID0gdmlkaW9jX3ZkZWNfZW51bV9mbXRfdmlkX291dF9tcGxhbmUsCisJLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwCT0gdmlkaW9jX3ZkZWNfZW51bV9mbXRfdmlkX2NhcF9tcGxhbmUsCisJLnZpZGlvY19lbnVtX2ZtdF92aWRfb3V0CT0gdmlkaW9jX3ZkZWNfZW51bV9mbXRfdmlkX291dF9tcGxhbmUsCisJLnZpZGlvY19lbnVtX2ZyYW1lc2l6ZXMJCT0gdmlkaW9jX2VudW1fZnJhbWVzaXplcywKKworCS52aWRpb2NfcXVlcnljYXAJCT0gdmlkaW9jX3ZkZWNfcXVlcnljYXAsCisJLnZpZGlvY19zdWJzY3JpYmVfZXZlbnQJCT0gdmlkaW9jX3ZkZWNfc3Vic2NyaWJlX2V2dCwKKwkudmlkaW9jX3Vuc3Vic2NyaWJlX2V2ZW50CT0gdmlkaW9jX3ZkZWNfZXZlbnRfdW5zdWJzY3JpYmUsCisJLnZpZGlvY19nX3NlbGVjdGlvbgkJPSB2aWRpb2NfdmRlY19nX3NlbGVjdGlvbiwKKwkudmlkaW9jX3Nfc2VsZWN0aW9uCQk9IHZpZGlvY192ZGVjX3Nfc2VsZWN0aW9uLAorCisJLnZpZGlvY19kZWNvZGVyX2NtZAkJPSB2aWRpb2NfZGVjb2Rlcl9jbWQsCisJLnZpZGlvY190cnlfZGVjb2Rlcl9jbWQJCT0gdmlkaW9jX3RyeV9kZWNvZGVyX2NtZCwKKworCS52aWRpb2NfZ19wYXJtCQkJPSB2aWRpb2NfdmRlY19nX3Bhcm0sCisJLnZpZGlvY19zX3Bhcm0JCQk9IHZpZGlvY192ZGVjX3NfcGFybSwKK307CisKK2ludCBhbWxfdmNvZGVjX2RlY19xdWV1ZV9pbml0KHZvaWQgKnByaXYsIHN0cnVjdCB2YjJfcXVldWUgKnNyY192cSwKKwkJCSAgIHN0cnVjdCB2YjJfcXVldWUgKmRzdF92cSkKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IHByaXY7CisJaW50IHJldCA9IDA7CisKKwl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlzcmNfdnEtPnR5cGUJCT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOworCXNyY192cS0+aW9fbW9kZXMJPSBWQjJfRE1BQlVGIHwgVkIyX01NQVAgfCBWQjJfVVNFUlBUUjsKKwlzcmNfdnEtPmRydl9wcml2CT0gY3R4OworCXNyY192cS0+YnVmX3N0cnVjdF9zaXplID0gc2l6ZW9mKHN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1Zik7CisJc3JjX3ZxLT5vcHMJCT0gJmFtbF92ZGVjX3ZiMl9vcHM7CisJc3JjX3ZxLT5tZW1fb3BzCQk9ICZ2YjJfZG1hX3NnX21lbW9wczsKKwlzcmNfdnEtPnRpbWVzdGFtcF9mbGFncyA9IFY0TDJfQlVGX0ZMQUdfVElNRVNUQU1QX0NPUFk7CisJc3JjX3ZxLT5sb2NrCQk9ICZjdHgtPmRldi0+ZGV2X211dGV4OworCXJldCA9IHZiMl9xdWV1ZV9pbml0KHNyY192cSk7CisJaWYgKHJldCkgeworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJIkZhaWxlZCB0byBpbml0aWFsaXplIHZpZGVvYnVmMiBxdWV1ZShvdXRwdXQpXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkc3RfdnEtPnR5cGUJCT0gbXVsdGlwbGFuYXIgPyBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FIDoKKwkJCQkJVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCWRzdF92cS0+aW9fbW9kZXMJPSBWQjJfRE1BQlVGIHwgVkIyX01NQVAgfCBWQjJfVVNFUlBUUjsKKwlkc3RfdnEtPmRydl9wcml2CT0gY3R4OworCWRzdF92cS0+YnVmX3N0cnVjdF9zaXplID0gc2l6ZW9mKHN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1Zik7CisJZHN0X3ZxLT5vcHMJCT0gJmFtbF92ZGVjX3ZiMl9vcHM7CisJZHN0X3ZxLT5tZW1fb3BzCQk9ICZ2YjJfZG1hX2NvbnRpZ19tZW1vcHM7CisJZHN0X3ZxLT50aW1lc3RhbXBfZmxhZ3MgPSBWNEwyX0JVRl9GTEFHX1RJTUVTVEFNUF9DT1BZOworCWRzdF92cS0+bG9jawkJPSAmY3R4LT5kZXYtPmRldl9tdXRleDsKKwlkc3RfdnEtPm1pbl9idWZmZXJzX25lZWRlZCA9IDE7CisJcmV0ID0gdmIyX3F1ZXVlX2luaXQoZHN0X3ZxKTsKKwlpZiAocmV0KSB7CisJCXZiMl9xdWV1ZV9yZWxlYXNlKHNyY192cSk7CisJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkiRmFpbGVkIHRvIGluaXRpYWxpemUgdmlkZW9idWYyIHF1ZXVlKGNhcHR1cmUpXG4iKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FtdmRlY19wb3J0cy9hbWxfdmNvZGVjX2RlYy5oIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvYW1sX3Zjb2RlY19kZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjM1MjJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvYW1sX3Zjb2RlY19kZWMuaApAQCAtMCwwICsxLDE0OCBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE3IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyogbW9yZSBkZXRhaWxzLgorKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKgorKiBEZXNjcmlwdGlvbjoKKyovCisjaWZuZGVmIF9BTUxfVkNPREVDX0RFQ19IXworI2RlZmluZSBfQU1MX1ZDT0RFQ19ERUNfSF8KKworI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1jb3JlLmg+CisjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLXY0bDIuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvZGVjX21tLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92aWRlb19zaW5rL3Y0bHZpZGVvX2V4dC5oPgorI2luY2x1ZGUgImFtbF92Y29kZWNfdXRpbC5oIgorI2luY2x1ZGUgImFtbF90YXNrX2NoYWluLmgiCisKKyNkZWZpbmUgVkNPREVDX0NBUEFCSUxJVFlfNEtfRElTQUJMRUQJMHgxMAorI2RlZmluZSBWQ09ERUNfREVDXzRLX0NPREVEX1dJRFRICTQwOTZVCisjZGVmaW5lIFZDT0RFQ19ERUNfNEtfQ09ERURfSEVJR0hUCTIzMDRVCisjZGVmaW5lIEFNTF9WREVDX01BWF9XCQkJMjA0OFUKKyNkZWZpbmUgQU1MX1ZERUNfTUFYX0gJCQkxMDg4VQorCisjZGVmaW5lIEFNTF9WREVDX0lSUV9TVEFUVVNfREVDX1NVQ0NFU1MJMHgxMDAwMAorI2RlZmluZSBWNEwyX0JVRl9GTEFHX0xBU1QJCTB4MDAxMDAwMDAKKworI2RlZmluZSBWREVDX0dBVEhFUl9NRU1PUllfVFlQRQkJMAorI2RlZmluZSBWREVDX1NDQVRURVJfTUVNT1JZX1RZUEUJMQorCisjZGVmaW5lIE1FVEFfREFUQV9TSVpFCQkJKDI1NikKKyNkZWZpbmUgTURfQlVGX1NJWkUJCQkoMTAyNCkKKyNkZWZpbmUgQ09NUF9CVUZfU0laRQkJCSg4MTk2KQorI2RlZmluZSBTRUlfQlVGX1NJWkUJCQkoMiAqIDEyICogMTAyNCkKKyNkZWZpbmUgU0VJX1RZUEUJKDEpCisjZGVmaW5lIERWX1RZUEUJCSgyKQorCisKKy8qCisgKiBzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAtIGRlY29kZXIgZnJhbWUgYnVmZmVyCisgKiBAbWVtX3R5cGUJOiBnYXRoZXIgb3Igc2NhdHRlciBtZW1vcnkuCisgKiBAbnVtX3BsYW5lcwk6IHVzZWQgbnVtYmVyIG9mIHRoZSBwbGFuZQorICogQG1lbVs0XQk6IGFycmF5IG1lbSBmb3IgdXNlZCBwbGFuZXMsCisgKgkJICBtZW1bMF06IFksIG1lbVsxXTogQy9VLCBtZW1bMl06IFYKKyAqIEB2Zl9mZAk6IHRoZSBmaWxlIGhhbmRsZSBvZiB2aWRlbyBmcmFtZQorICogQHN0YXR1cyAgICAgIDogZnJhbWUgYnVmZmVyIHN0YXR1cyAodmRlY19mYl9zdGF0dXMpCisgKiBAYnVmX2lkeAk6IHRoZSBpbmRleCBmcm9tIHZiMiBpbmRleC4KKyAqIEB2ZnJhbWUJOiBzdG9yZSB0aGUgdmZyYW1lIHRoYXQgZ2V0IGZyb20gY2FsbGVyLgorICogQHRhc2sJOiB0aGUgY29udGV4dCBvZiB0YXNrIGNoYWluIG1hbmFnZXIuCisgKi8KKworc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgeworCWludAltZW1fdHlwZTsKKwlpbnQJbnVtX3BsYW5lczsKKwl1bmlvbiB7CisJCXN0cnVjdAlhbWxfdmNvZGVjX21lbSBtZW1bNF07CisJCXUzMgl2Zl9mZDsKKwl9IG07CisJdTMyCXN0YXR1czsKKwl1MzIJYnVmX2lkeDsKKwl2b2lkCSp2ZnJhbWU7CisKKwlzdHJ1Y3QgdGFza19jaGFpbl9zICp0YXNrOworfTsKKworLyoqCisgKiBzdHJ1Y3QgYW1sX3ZpZGVvX2RlY19idWYgLSBQcml2YXRlIGRhdGEgcmVsYXRlZCB0byBlYWNoIFZCMiBidWZmZXIuCisgKiBAYjoJCVZCMiBidWZmZXIKKyAqIEBsaXN0OglsaW5rIGxpc3QKKyAqIEB1c2VkOglDYXB0dXJlIGJ1ZmZlciBjb250YWluIGRlY29kZWQgZnJhbWUgZGF0YSBhbmQga2VlcCBpbgorICoJCQljb2RlYyBkYXRhIHN0cnVjdHVyZQorICogQGxhc3RmcmFtZToJCUludHB1dCBidWZmZXIgaXMgbGFzdCBidWZmZXIgLSBFT1MKKyAqIEBlcnJvcjoJCUFuIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJzIG9uIHRoaXMgYnVmZmVyLgorICogQGZyYW1lX2J1ZmZlcjoJRGVjb2RlIHN0YXR1cywgYW5kIGJ1ZmZlciBpbmZvcm1hdGlvbiBvZiBDYXB0dXJlIGJ1ZmZlcgorICoKKyAqIE5vdGUgOiBUaGVzZSBzdGF0dXMgaW5mb3JtYXRpb24gaGVscCB1cyB0cmFjayBhbmQgZGVidWcgYnVmZmVyIHN0YXRlCisgKi8KK3N0cnVjdCBhbWxfdmlkZW9fZGVjX2J1ZiB7CisJc3RydWN0IHZiMl92NGwyX2J1ZmZlciB2YjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciBmcmFtZV9idWZmZXI7CisJc3RydWN0IGZpbGVfcHJpdmF0ZV9kYXRhIHByaXZkYXRhOworCXN0cnVjdCBjb2RlY19tbV9zICptZW1bMl07CisJY2hhciBtZW1fb253ZXJbMzJdOworCWJvb2wgdXNlZDsKKwlib29sIHF1ZV9pbl9tMm07CisJYm9vbCBsYXN0ZnJhbWU7CisJYm9vbCBlcnJvcjsKKworCS8qIGludGVybmFsIGNvbXByZXNzZWQgYnVmZmVyICovCisJdW5zaWduZWQgaW50IGludGVybmFsX2luZGV4OworCisJdWxvbmcgdnBwX2J1Zl9oYW5kbGU7CisJdWxvbmcgZ2UyZF9idWZfaGFuZGxlOworCisJLyo0IGJ5dGVzIGRhdGEgZm9yIGRhdGEgbGVuKi8KKwljaGFyIG1ldGFfZGF0YVtNRVRBX0RBVEFfU0laRSArIDRdOworCisJc3RydWN0IHNnX3RhYmxlICpvdXRfc2d0OworCXN0cnVjdCBzZ190YWJsZSAqY2FwX3NndDsKK307CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgYW1sX3ZkZWNfaW9jdGxfb3BzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCB2NGwyX20ybV9vcHMgYW1sX3ZkZWNfbTJtX29wczsKKworLyoKKyAqIGFtbF92ZGVjX2xvY2svYW1sX3ZkZWNfdW5sb2NrIGFyZSBmb3IgY3R4IGluc3RhbmNlIHRvCisgKiBnZXQvcmVsZWFzZSBsb2NrIGJlZm9yZS9hZnRlciBhY2Nlc3MgZGVjb2RlciBody4KKyAqIGFtbF92ZGVjX2xvY2sgZ2V0IGRlY29kZXIgaHcgbG9jayBhbmQgc2V0IGN1cnJfY3R4CisgKiB0byBjdHggaW5zdGFuY2UgdGhhdCBnZXQgbG9jaworICovCit2b2lkIGFtbF92ZGVjX3VubG9jayhzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCk7Cit2b2lkIGFtbF92ZGVjX2xvY2soc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgpOworaW50IGFtbF92Y29kZWNfZGVjX3F1ZXVlX2luaXQodm9pZCAqcHJpdiwgc3RydWN0IHZiMl9xdWV1ZSAqc3JjX3ZxLAorCQkJICAgc3RydWN0IHZiMl9xdWV1ZSAqZHN0X3ZxKTsKK3ZvaWQgYW1sX3Zjb2RlY19kZWNfc2V0X2RlZmF1bHRfcGFyYW1zKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4KTsKK3ZvaWQgYW1sX3Zjb2RlY19kZWNfcmVsZWFzZShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCk7CitpbnQgYW1sX3Zjb2RlY19kZWNfY3RybHNfc2V0dXAoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgpOwordm9pZCB3YWl0X3Zjb2RlY19lbmRpbmcoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgpOwordm9pZCB2ZGVjX2ZyYW1lX2J1ZmZlcl9yZWxlYXNlKHZvaWQgKmRhdGEpOwordm9pZCBhbWxfdmRlY19kaXNwYXRjaF9ldmVudChzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCwgdTMyIGNoYW5nZXMpOwordm9pZCogdjRsX2dldF92Zl9oYW5kbGUoaW50IGZkKTsKK3ZvaWQgYW1sX3Y0bF9jdHhfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZik7Cit2b2lkIGRtYWJ1ZmZfcmVjeWNsZV93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3ZvaWQgYW1sX2J1ZmZlcl9zdGF0dXMoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgpOwordm9pZCBhbWxfdmRlY19iYXNpY19pbmZvcm1hdGlvbihzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCk7CisKK3ZvaWQgYW1sX2FsbG9jX2J1ZmZlcihzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCwgaW50IGZsYWcpOwordm9pZCBhbWxfZnJlZV9idWZmZXIoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsIGludCBmbGFnKTsKK3ZvaWQgYW1sX2ZyZWVfb25lX3NlaV9idWZmZXIoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsIGNoYXIgKiphZGRyLCBpbnQgKnNpemUsIGludCBpZHgpOwordm9pZCBhbWxfYmluZF9zZWlfYnVmZmVyKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqdjRsLCBjaGFyICoqYWRkciwgaW50ICpzaXplLCBpbnQgKmlkeCk7Cit2b2lkIGFtbF9iaW5kX2R2X2J1ZmZlcihzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKnY0bCwgY2hhciAqKmNvbXBfYnVmLCBjaGFyICoqbWRfYnVmKTsKKworI2VuZGlmIC8qIF9BTUxfVkNPREVDX0RFQ19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbXZkZWNfcG9ydHMvYW1sX3Zjb2RlY19kZWNfZHJ2LmMgYi9kcml2ZXJzL2FtdmRlY19wb3J0cy9hbWxfdmNvZGVjX2RlY19kcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGYwMjU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvYW1sX3Zjb2RlY19kZWNfZHJ2LmMKQEAgLTAsMCArMSw3NTQgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNyBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisqIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyoKKyogRGVzY3JpcHRpb246CisqLworCisjZGVmaW5lIERFQlVHCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1ldmVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItbWVtMm1lbS5oPgorI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1kbWEtY29udGlnLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgImFtbF92Y29kZWNfZHJ2LmgiCisjaW5jbHVkZSAiYW1sX3Zjb2RlY19kZWMuaCIKKyNpbmNsdWRlICJhbWxfdmNvZGVjX3V0aWwuaCIKKyNpbmNsdWRlICJhbWxfdmNvZGVjX3ZwcC5oIgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9hbm9uX2lub2Rlcy5oPgorCisjZGVmaW5lIFZERUNfSFdfQUNUSVZFCQkweDEwCisjZGVmaW5lIFZERUNfSVJRX0NGRwkJMHgxMQorI2RlZmluZSBWREVDX0lSUV9DTFIJCTB4MTAKKyNkZWZpbmUgVkRFQ19JUlFfQ0ZHX1JFRwkweGE0CisKKyNkZWZpbmUgVjRMVklERU9fSU9DX01BR0lDICAnSScKKyNkZWZpbmUgVjRMVklERU9fSU9DVExfQUxMT0NfRkQJCQkJX0lPVyhWNExWSURFT19JT0NfTUFHSUMsIDB4MDIsIGludCkKKyNkZWZpbmUgVjRMVklERU9fSU9DVExfQ0hFQ0tfRkQJCQkJX0lPVyhWNExWSURFT19JT0NfTUFHSUMsIDB4MDMsIGludCkKKyNkZWZpbmUgVjRMVklERU9fSU9DVExfU0VUX0NPTkZJR19QQVJBTVMJX0lPV1IoVjRMVklERU9fSU9DX01BR0lDLCAweDA0LCBzdHJ1Y3QgdjRsMl9jb25maWdfcGFybSkKKyNkZWZpbmUgVjRMVklERU9fSU9DVExfR0VUX0NPTkZJR19QQVJBTVMJX0lPV1IoVjRMVklERU9fSU9DX01BR0lDLCAweDA1LCBzdHJ1Y3QgdjRsMl9jb25maWdfcGFybSkKKworYm9vbCBwYXJhbV9zZXRzX2Zyb21fdWNvZGUgPSAxOworYm9vbCBlbmFibGVfZHJtX21vZGU7CitleHRlcm4gdm9pZCBhbWxfdmRlY19waWNfaW5mb191cGRhdGUoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgpOworCitzdGF0aWMgaW50IGZvcHNfdmNvZGVjX29wZW4oc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGFtbF92Y29kZWNfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gTlVMTDsKKwlzdHJ1Y3QgYW1sX3ZpZGVvX2RlY19idWYgKmFtbF9idWYgPSBOVUxMOworCWludCByZXQgPSAwOworCXN0cnVjdCB2YjJfcXVldWUgKnNyY192cTsKKworCWN0eCA9IGt6YWxsb2Moc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWN0eCkKKwkJcmV0dXJuIC1FTk9NRU07CisJa3JlZl9pbml0KCZjdHgtPmN0eF9yZWYpOworCisJYW1sX2J1ZiA9IGt6YWxsb2Moc2l6ZW9mKCphbWxfYnVmKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhbWxfYnVmKSB7CisJCWtmcmVlKGN0eCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWN0eC0+bWV0YV9pbmZvcy5tZXRhX2J1ZnMgPSB2emFsbG9jKHNpemVvZihzdHJ1Y3QgbWV0YV9kYXRhKSAqIFY0TF9DQVBfQlVGRl9NQVgpOworCWlmIChjdHgtPm1ldGFfaW5mb3MubWV0YV9idWZzID09IE5VTEwpIHsKKwkJa2ZyZWUoYW1sX2J1Zik7CisJCWtmcmVlKGN0eCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW11dGV4X2xvY2soJmRldi0+ZGV2X211dGV4KTsKKwljdHgtPmVtcHR5X2ZsdXNoX2J1ZiA9IGFtbF9idWY7CisJY3R4LT5pZCA9IGRldi0+aWRfY291bnRlcisrOworCXY0bDJfZmhfaW5pdCgmY3R4LT5maCwgdmlkZW9fZGV2ZGF0YShmaWxlKSk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gJmN0eC0+Zmg7CisJdjRsMl9maF9hZGQoJmN0eC0+ZmgpOworCUlOSVRfTElTVF9IRUFEKCZjdHgtPmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZjdHgtPnZkZWNfdGhyZWFkX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZjdHgtPnRhc2tfY2hhaW5fcG9vbCk7CisJZGV2LT5maWxwID0gZmlsZTsKKwljdHgtPmRldiA9IGRldjsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjdHgtPnF1ZXVlKTsKKwltdXRleF9pbml0KCZjdHgtPmNhcHR1cmVfYnVmZmVyX2xvY2spOworCW11dGV4X2luaXQoJmN0eC0+YnVmZl9kb25lX2xvY2spOworCW11dGV4X2luaXQoJmN0eC0+c3RhdGVfbG9jayk7CisJbXV0ZXhfaW5pdCgmY3R4LT5jb21wX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZjdHgtPnNsb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmY3R4LT50c3Bsb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmY3R4LT5kbWFidWZmX3JlY3ljbGVfbG9jayk7CisJaW5pdF9jb21wbGV0aW9uKCZjdHgtPmNvbXApOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmN0eC0+d3EpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmN0eC0+Y2FwX3dxKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjdHgtPnBvc3RfZG9uZV93cSk7CisJSU5JVF9XT1JLKCZjdHgtPmRtYWJ1ZmZfcmVjeWNsZV93b3JrLCBkbWFidWZmX3JlY3ljbGVfd29ya2VyKTsKKwlJTklUX0tGSUZPKGN0eC0+ZG1hYnVmZl9yZWN5Y2xlKTsKKwlJTklUX0tGSUZPKGN0eC0+Y2FwdHVyZV9idWZmZXIpOworCisJY3R4LT5wb3N0X3RvX3VwcGVyX2RvbmUgPSB0cnVlOworCWN0eC0+cGFyYW1fc2V0c19mcm9tX3Vjb2RlID0gcGFyYW1fc2V0c19mcm9tX3Vjb2RlID8gMSA6IDA7CisKKwlpZiAoZW5hYmxlX2RybV9tb2RlKSB7CisJCWN0eC0+aXNfZHJtX21vZGUgPSB0cnVlOworCQljdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSA9IHRydWU7CisJfQorCisJY3R4LT50eXBlID0gQU1MX0lOU1RfREVDT0RFUjsKKwlyZXQgPSBhbWxfdmNvZGVjX2RlY19jdHJsc19zZXR1cChjdHgpOworCWlmIChyZXQpIHsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJGYWlsZWQgdG8gc2V0dXAgdmNvZGVjIGNvbnRyb2xzXG4iKTsKKwkJZ290byBlcnJfY3RybHNfc2V0dXA7CisJfQorCWN0eC0+bTJtX2N0eCA9IHY0bDJfbTJtX2N0eF9pbml0KGRldi0+bTJtX2Rldl9kZWMsIGN0eCwKKwkJJmFtbF92Y29kZWNfZGVjX3F1ZXVlX2luaXQpOworCWlmIChJU19FUlIoKF9fZm9yY2Ugdm9pZCAqKWN0eC0+bTJtX2N0eCkpIHsKKwkJcmV0ID0gUFRSX0VSUigoX19mb3JjZSB2b2lkICopY3R4LT5tMm1fY3R4KTsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJGYWlsZWQgdG8gdjRsMl9tMm1fY3R4X2luaXQoKSAoJWQpXG4iLCByZXQpOworCQlnb3RvIGVycl9tMm1fY3R4X2luaXQ7CisJfQorCXNyY192cSA9IHY0bDJfbTJtX2dldF92cShjdHgtPm0ybV9jdHgsCisJCQkJVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKTsKKwljdHgtPm91dHB1dF90aHJlYWRfcmVhZHkgPSB0cnVlOworCWN0eC0+ZW1wdHlfZmx1c2hfYnVmLT52Yi52YjJfYnVmLnZiMl9xdWV1ZSA9IHNyY192cTsKKwljdHgtPmVtcHR5X2ZsdXNoX2J1Zi0+bGFzdGZyYW1lID0gdHJ1ZTsKKwljdHgtPnZkZWNfcGljX2luZm9fdXBkYXRlID0gYW1sX3ZkZWNfcGljX2luZm9fdXBkYXRlOworCWFtbF92Y29kZWNfZGVjX3NldF9kZWZhdWx0X3BhcmFtcyhjdHgpOworCWN0eC0+aXNfc3RyZWFtX29mZiA9IHRydWU7CisKKwljdHgtPmF1eF9pbmZvcy5kdl9pbmRleCA9IDA7CisJY3R4LT5hdXhfaW5mb3Muc2VpX2luZGV4ID0gMDsKKwljdHgtPmF1eF9pbmZvcy5hbGxvY19idWZmZXIgPSBhbWxfYWxsb2NfYnVmZmVyOworCWN0eC0+YXV4X2luZm9zLmZyZWVfYnVmZmVyID0gYW1sX2ZyZWVfYnVmZmVyOworCWN0eC0+YXV4X2luZm9zLmJpbmRfc2VpX2J1ZmZlciA9IGFtbF9iaW5kX3NlaV9idWZmZXI7CisJY3R4LT5hdXhfaW5mb3MuYmluZF9kdl9idWZmZXIgPSBhbWxfYmluZF9kdl9idWZmZXI7CisJY3R4LT5hdXhfaW5mb3MuZnJlZV9vbmVfc2VpX2J1ZmZlciA9IGFtbF9mcmVlX29uZV9zZWlfYnVmZmVyOworCisJcmV0ID0gYW1sX3RocmVhZF9zdGFydChjdHgsIGFtbF90aHJlYWRfY2FwdHVyZV93b3JrZXIsIEFNTF9USFJFQURfQ0FQVFVSRSwgImNhcCIpOworCWlmIChyZXQpIHsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJGYWlsZWQgdG8gY3JlYXQgY2FwdHVyZSB0aHJlYWQuXG4iKTsKKwkJZ290byBlcnJfY3JlYXRfdGhyZWFkOworCX0KKworCWxpc3RfYWRkKCZjdHgtPmxpc3QsICZkZXYtPmN0eF9saXN0KTsKKworCW11dGV4X3VubG9jaygmZGV2LT5kZXZfbXV0ZXgpOworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfUFJJTkZPLCAiJXMgZGVjb2RlciAlbHhcbiIsCisJCWRldl9uYW1lKCZkZXYtPnBsYXRfZGV2LT5kZXYpLCAodWxvbmcpY3R4KTsKKworCXJldHVybiAwOworCisJLyogRGVpbml0IHdoZW4gZmFpbHVyZSBvY2N1cnJlZCAqLworZXJyX2NyZWF0X3RocmVhZDoKKwl2NGwyX20ybV9jdHhfcmVsZWFzZShjdHgtPm0ybV9jdHgpOworZXJyX20ybV9jdHhfaW5pdDoKKwl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZjdHgtPmN0cmxfaGRsKTsKK2Vycl9jdHJsc19zZXR1cDoKKwl2NGwyX2ZoX2RlbCgmY3R4LT5maCk7CisJdjRsMl9maF9leGl0KCZjdHgtPmZoKTsKKwl2ZnJlZShjdHgtPm1ldGFfaW5mb3MubWV0YV9idWZzKTsKKwlrZnJlZShjdHgtPmVtcHR5X2ZsdXNoX2J1Zik7CisJa2ZyZWUoY3R4KTsKKwltdXRleF91bmxvY2soJmRldi0+ZGV2X211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZm9wc192Y29kZWNfcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPSBmaF90b19jdHgoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfUFJJTkZPLCAicmVsZWFzZSBkZWNvZGVyICVseFxuIiwgKHVsb25nKSBjdHgpOworCW11dGV4X2xvY2soJmRldi0+ZGV2X211dGV4KTsKKworCWFtbF90aHJlYWRfc3RvcChjdHgpOworCXdhaXRfdmNvZGVjX2VuZGluZyhjdHgpOworCXZiMl9xdWV1ZV9yZWxlYXNlKCZjdHgtPm0ybV9jdHgtPmNhcF9xX2N0eC5xKTsKKwl2YjJfcXVldWVfcmVsZWFzZSgmY3R4LT5tMm1fY3R4LT5vdXRfcV9jdHgucSk7CisKKwlhbWxfdmNvZGVjX2RlY19yZWxlYXNlKGN0eCk7CisJdjRsMl9maF9kZWwoJmN0eC0+ZmgpOworCXY0bDJfZmhfZXhpdCgmY3R4LT5maCk7CisJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmY3R4LT5jdHJsX2hkbCk7CisKKwlsaXN0X2RlbF9pbml0KCZjdHgtPmxpc3QpOworCisJa2ZyZWUoY3R4LT5lbXB0eV9mbHVzaF9idWYpOworCWtyZWZfcHV0KCZjdHgtPmN0eF9yZWYsIGFtbF92NGxfY3R4X3JlbGVhc2UpOworCW11dGV4X3VubG9jaygmZGV2LT5kZXZfbXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHY0bDJ2aWRlb19maWxlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfQlVGTUdSLCAiZmlsZTogJWx4LCBkYXRhOiAlbHhcbiIsCisJCSh1bG9uZykgZmlsZSwgKHVsb25nKSBmaWxlLT5wcml2YXRlX2RhdGEpOworCisJaWYgKGZpbGUtPnByaXZhdGVfZGF0YSkKKwkJdmRlY19mcmFtZV9idWZmZXJfcmVsZWFzZShmaWxlLT5wcml2YXRlX2RhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK2NvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdjRsMl9maWxlX2ZvcHMgPSB7CisJLnJlbGVhc2UgPSB2NGwydmlkZW9fZmlsZV9yZWxlYXNlLAorfTsKKworaW50IHY0bDJfYWxsb2NfZmQoaW50ICpmZCkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IE5VTEw7CisJaW50IGZpbGVfZmQgPSBnZXRfdW51c2VkX2ZkX2ZsYWdzKE9fQ0xPRVhFQyk7CisKKwlpZiAoZmlsZV9mZCA8IDApIHsKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkiZ2V0IHVudXNlZCBmZCBmYWlsXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZmlsZSA9IGFub25faW5vZGVfZ2V0ZmlsZSgidjRsMl9tZXRhX2ZpbGUiLCAmdjRsMl9maWxlX2ZvcHMsIE5VTEwsIDApOworCWlmIChJU19FUlIoZmlsZSkpIHsKKwkJcHV0X3VudXNlZF9mZChmaWxlX2ZkKTsKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkiYW5vbl9pbm9kZV9nZXRmaWxlIGZhaWxcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPQorCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgZmlsZV9wcml2YXRlX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZpbGUtPnByaXZhdGVfZGF0YSkgeworCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJhbGxvYyBwcml2IGRhdGEgZmFpbGQuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfQlVGTUdSLCAiZmQgJWQsIGZpbGUgJWx4LCBkYXRhOiAlbHhcbiIsCisJCWZpbGVfZmQsICh1bG9uZykgZmlsZSwgKHVsb25nKSBmaWxlLT5wcml2YXRlX2RhdGEpOworCisJZmRfaW5zdGFsbChmaWxlX2ZkLCBmaWxlKTsKKwkqZmQgPSBmaWxlX2ZkOworCisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHY0bDJfZmlsZV9mb3BzOworYm9vbCBpc192NGwyX2J1Zl9maWxlKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBmaWxlLT5mX29wID09ICZ2NGwyX2ZpbGVfZm9wczsKK30KKworaW50IHY0bDJfY2hlY2tfZmQoaW50IGZkKQoreworCXN0cnVjdCBmaWxlICpmaWxlOworCisJZmlsZSA9IGZnZXQoZmQpOworCisJaWYgKCFmaWxlKSB7CisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJImZnZXQgZmQgJWQgZmFpbCFcbiIsIGZkKTsKKwkJcmV0dXJuIC1FQkFERjsKKwl9CisKKwlpZiAoIWlzX3Y0bDJfYnVmX2ZpbGUoZmlsZSkpIHsKKwkJZnB1dChmaWxlKTsKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkiaXNfdjRsMl9idWZfZmlsZSBmYWlsIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlmcHV0KGZpbGUpOworCisJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVhJTkZPLAorCQkiaW9jdGwgb2ssIGNvbW0gJXMsIHBpZCAlZFxuIiwKKwkJIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRtYWJ1Zl9mZF9pbnN0YWxsX2RhdGEoaW50IGZkLCB2b2lkKiBkYXRhLCB1MzIgc2l6ZSkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKworCWZpbGUgPSBmZ2V0KGZkKTsKKworCWlmICghZmlsZSkgeworCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJmZ2V0IGZkICVkIGZhaWwhLCBjb21tICVzLCBwaWQgJWRcbiIsCisJCQlmZCwgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkKTsKKwkJcmV0dXJuIC1FQkFERjsKKwl9CisKKwlpZiAoIWlzX3Y0bDJfYnVmX2ZpbGUoZmlsZSkpIHsKKwkJZnB1dChmaWxlKTsKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkidGhlIGJ1ZiBmaWxlIGNoZWNrZWQgZmFpbCFcbiIpOworCQlyZXR1cm4gLUVCQURGOworCX0KKworCW1lbWNweShmaWxlLT5wcml2YXRlX2RhdGEsIGRhdGEsIHNpemUpOworCisJZnB1dChmaWxlKTsKKworCXJldHVybiAwOworfQorCit2b2lkKiB2NGxfZ2V0X3ZmX2hhbmRsZShpbnQgZmQpCit7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJc3RydWN0IGZpbGVfcHJpdmF0ZV9kYXRhICpkYXRhID0gTlVMTDsKKwl2b2lkICp2Zl9oYW5kbGUgPSAwOworCisJZmlsZSA9IGZnZXQoZmQpOworCisJaWYgKCFmaWxlKSB7CisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJImZnZXQgZmQgJWQgZmFpbCEsIGNvbW0gJXMsIHBpZCAlZFxuIiwKKwkJCWZkLCBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIWlzX3Y0bDJfYnVmX2ZpbGUoZmlsZSkpIHsKKwkJZnB1dChmaWxlKTsKKyNpZiAwCisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJInRoZSBidWYgZmlsZSBjaGVja2VkIGZhaWwhXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkYXRhID0gKHN0cnVjdCBmaWxlX3ByaXZhdGVfZGF0YSopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoZGF0YSkgeworCQl2Zl9oYW5kbGUgPSAmZGF0YS0+dmY7CisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0JVRk1HUiwgImZpbGU6ICVseCwgZGF0YTogJWx4XG4iLAorCQkJKHVsb25nKSBmaWxlLCAodWxvbmcpIGRhdGEpOworCX0KKworCWZwdXQoZmlsZSk7CisKKwlyZXR1cm4gdmZfaGFuZGxlOworfQorCisKK3N0YXRpYyBsb25nIHY0bDJfdmNvZGVjX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJdW5zaWduZWQgaW50IGNtZCwKKwkJCXVsb25nIGFyZykKK3sKKwlsb25nIHJldCA9IDA7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVjRMVklERU9fSU9DVExfQUxMT0NfRkQ6CisJeworCQl1MzIgdjRsdmlkZW9fZmQgPSAwOworCisJCXJldCA9IHY0bDJfYWxsb2NfZmQoJnY0bHZpZGVvX2ZkKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJYnJlYWs7CisJCXB1dF91c2VyKHY0bHZpZGVvX2ZkLCAodTMyIF9fdXNlciAqKWFyZ3ApOworCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FWElORk8sCisJCQkiVjRMVklERU9fSU9DVExfQUxMT0NfRkQgZmQgJWRcbiIsCisJCQl2NGx2aWRlb19mZCk7CisJCWJyZWFrOworCX0KKwljYXNlIFY0TFZJREVPX0lPQ1RMX0NIRUNLX0ZEOgorCXsKKwkJdTMyIHY0bHZpZGVvX2ZkID0gMDsKKworCQlnZXRfdXNlcih2NGx2aWRlb19mZCwgKHUzMiBfX3VzZXIgKilhcmdwKTsKKwkJcmV0ID0gdjRsMl9jaGVja19mZCh2NGx2aWRlb19mZCk7CisJCWlmIChyZXQgIT0gMCkKKwkJCWJyZWFrOworCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FWElORk8sCisJCQkiVjRMVklERU9fSU9DVExfQ0hFQ0tfRkQgZmQgJWRcbiIsCisJCQl2NGx2aWRlb19mZCk7CisJCWJyZWFrOworCX0KKwljYXNlIFY0TFZJREVPX0lPQ1RMX1NFVF9DT05GSUdfUEFSQU1TOgorCXsKKwkJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPSBOVUxMOworCisJCWlmIChpc192NGwyX2J1Zl9maWxlKGZpbGUpKQorCQkJYnJlYWs7CisKKwkJY3R4ID0gZmhfdG9fY3R4KGZpbGUtPnByaXZhdGVfZGF0YSk7CisJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZjdHgtPmNvbmZpZywKKwkJCSh2b2lkICopYXJncCwgc2l6ZW9mKGN0eC0+Y29uZmlnKSkpIHsKKwkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJCSJzZXQgY29uZmlnIHBhcm0gZXJyXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIFY0TFZJREVPX0lPQ1RMX0dFVF9DT05GSUdfUEFSQU1TOgorCXsKKwkJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPSBOVUxMOworCisJCWlmIChpc192NGwyX2J1Zl9maWxlKGZpbGUpKQorCQkJYnJlYWs7CisKKwkJY3R4ID0gZmhfdG9fY3R4KGZpbGUtPnByaXZhdGVfZGF0YSk7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAorCQkJKHZvaWQgKikmY3R4LT5jb25maWcsIHNpemVvZihjdHgtPmNvbmZpZykpKSB7CisJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCQkiZ2V0IGNvbmZpZyBwYXJtIGVyclxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIHZpZGVvX2lvY3RsMihmaWxlLCBjbWQsIGFyZyk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdGF0aWMgbG9uZyB2NGwyX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwl1bnNpZ25lZCBpbnQgY21kLCB1bG9uZyBhcmcpCit7CisJbG9uZyByZXQgPSAwOworCisJcmV0ID0gdjRsMl92Y29kZWNfaW9jdGwoZmlsZSwgY21kLCAodWxvbmcpY29tcGF0X3B0cihhcmcpKTsKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgYW1sX3Zjb2RlY19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBmb3BzX3Zjb2RlY19vcGVuLAorCS5yZWxlYXNlCT0gZm9wc192Y29kZWNfcmVsZWFzZSwKKwkucG9sbAkJPSB2NGwyX20ybV9mb3BfcG9sbCwKKwkudW5sb2NrZWRfaW9jdGwgPSB2NGwyX3Zjb2RlY19pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bDMyID0gdjRsMl9jb21wYXRfaW9jdGwsCisjZW5kaWYKKwkubW1hcAkJPSB2NGwyX20ybV9mb3BfbW1hcCwKK307CisKK3N0YXRpYyBzc2l6ZV90IHN0YXR1c19zaG93KHN0cnVjdCBjbGFzcyAqY2xzLAorCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19kZXYgKmRldiA9IGNvbnRhaW5lcl9vZihjbHMsCisJCXN0cnVjdCBhbWxfdmNvZGVjX2RldiwgdjRsZGVjX2NsYXNzKTsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IE5VTEw7CisJY2hhciAqcGJ1ZiA9IGJ1ZjsKKworCW11dGV4X2xvY2soJmRldi0+ZGV2X211dGV4KTsKKworCWlmIChsaXN0X2VtcHR5KCZkZXYtPmN0eF9saXN0KSkgeworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIk5vIHY0bGRlYyBjb250ZXh0LlxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3R4LCAmZGV2LT5jdHhfbGlzdCwgbGlzdCkgeworCQkvKiBiYXNpYyBpbmZvcm1hdGlvbi4gKi8KKwkJYW1sX3ZkZWNfYmFzaWNfaW5mb3JtYXRpb24oY3R4KTsKKworCQkvKiBidWZmZXJzIHN0YXR1cy4gKi8KKwkJYW1sX2J1ZmZlcl9zdGF0dXMoY3R4KTsKKwl9CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmRldl9tdXRleCk7CisKKwlyZXR1cm4gcGJ1ZiAtIGJ1ZjsKK30KKworc3RhdGljIENMQVNTX0FUVFJfUk8oc3RhdHVzKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnY0bGRlY19jbGFzc19hdHRyc1tdID0geworCSZjbGFzc19hdHRyX3N0YXR1cy5hdHRyLAorCU5VTEwKK307CisKK0FUVFJJQlVURV9HUk9VUFModjRsZGVjX2NsYXNzKTsKKworc3RhdGljIGludCBhbWxfdmNvZGVjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFtbF92Y29kZWNfZGV2ICpkZXY7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmZkX2RlYzsKKwlpbnQgcmV0ID0gMDsKKworCWRldiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCUlOSVRfTElTVF9IRUFEKCZkZXYtPmN0eF9saXN0KTsKKwlkZXYtPnBsYXRfZGV2ID0gcGRldjsKKwlhdG9taWNfc2V0KCZkZXYtPnZwcF9jb3VudCwgMCk7CisKKwltdXRleF9pbml0KCZkZXYtPmRlY19tdXRleCk7CisJbXV0ZXhfaW5pdCgmZGV2LT5kZXZfbXV0ZXgpOworCXNwaW5fbG9ja19pbml0KCZkZXYtPmlycWxvY2spOworCisJc25wcmludGYoZGV2LT52NGwyX2Rldi5uYW1lLCBzaXplb2YoZGV2LT52NGwyX2Rldi5uYW1lKSwgIiVzIiwKKwkJIlsvQU1MX1Y0TDJfVkRFQ10iKTsKKworCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZkZXYtPnY0bDJfZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInY0bDJfZGV2aWNlX3JlZ2lzdGVyIGVycj0lZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfcmVzOworCX0KKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+cXVldWUpOworCisJdmZkX2RlYyA9IHZpZGVvX2RldmljZV9hbGxvYygpOworCWlmICghdmZkX2RlYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgdmlkZW8gZGV2aWNlXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfZGVjX2FsbG9jOworCX0KKworCXZmZF9kZWMtPmZvcHMJCT0gJmFtbF92Y29kZWNfZm9wczsKKwl2ZmRfZGVjLT5pb2N0bF9vcHMJPSAmYW1sX3ZkZWNfaW9jdGxfb3BzOworCXZmZF9kZWMtPnJlbGVhc2UJPSB2aWRlb19kZXZpY2VfcmVsZWFzZTsKKwl2ZmRfZGVjLT5sb2NrCQk9ICZkZXYtPmRldl9tdXRleDsKKwl2ZmRfZGVjLT52NGwyX2Rldgk9ICZkZXYtPnY0bDJfZGV2OworCXZmZF9kZWMtPnZmbF9kaXIJPSBWRkxfRElSX00yTTsKKwl2ZmRfZGVjLT5kZXZpY2VfY2Fwcwk9IFY0TDJfQ0FQX1ZJREVPX00yTV9NUExBTkUgfAorCQkJCQlWNEwyX0NBUF9TVFJFQU1JTkc7CisKKwlzbnByaW50Zih2ZmRfZGVjLT5uYW1lLCBzaXplb2YodmZkX2RlYy0+bmFtZSksICIlcyIsCisJCUFNTF9WQ09ERUNfREVDX05BTUUpOworCXZpZGVvX3NldF9kcnZkYXRhKHZmZF9kZWMsIGRldik7CisJZGV2LT52ZmRfZGVjID0gdmZkX2RlYzsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJZGV2LT5tMm1fZGV2X2RlYyA9IHY0bDJfbTJtX2luaXQoJmFtbF92ZGVjX20ybV9vcHMpOworCWlmIChJU19FUlIoKF9fZm9yY2Ugdm9pZCAqKWRldi0+bTJtX2Rldl9kZWMpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBpbml0IG1lbTJtZW0gZGVjIGRldmljZVxuIik7CisJCXJldCA9IFBUUl9FUlIoKF9fZm9yY2Ugdm9pZCAqKWRldi0+bTJtX2Rldl9kZWMpOworCQlnb3RvIGVycl9kZWNfbWVtX2luaXQ7CisJfQorCisJZGV2LT5kZWNvZGVfd29ya3F1ZXVlID0KKwkJYWxsb2Nfb3JkZXJlZF93b3JrcXVldWUoIm91dHB1dC13b3JrZXIiLAorCQkJX19XUV9MRUdBQ1kgfCBXUV9NRU1fUkVDTEFJTSB8IFdRX0hJR0hQUkkpOworCWlmICghZGV2LT5kZWNvZGVfd29ya3F1ZXVlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBjcmVhdGUgZGVjb2RlIHdvcmtxdWV1ZVxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2V2ZW50X3dvcmtxOworCX0KKworCS8vZGV2X3NldF9uYW1lKCZ2ZGV2LT5kZXYsICIlcyVkIiwgbmFtZV9iYXNlLCB2ZGV2LT5udW0pOworCisJcmV0ID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHZmZF9kZWMsIFZGTF9UWVBFX0dSQUJCRVIsIDI2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciB2aWRlbyBkZXZpY2VcbiIpOworCQlnb3RvIGVycl9kZWNfcmVnOworCX0KKworCS8qaW5pdCBjbGFzcyovCisJZGV2LT52NGxkZWNfY2xhc3MubmFtZSA9ICJ2NGxkZWMiOworCWRldi0+djRsZGVjX2NsYXNzLm93bmVyID0gVEhJU19NT0RVTEU7CisJZGV2LT52NGxkZWNfY2xhc3MuY2xhc3NfZ3JvdXBzID0gdjRsZGVjX2NsYXNzX2dyb3VwczsKKwlyZXQgPSBjbGFzc19yZWdpc3RlcigmZGV2LT52NGxkZWNfY2xhc3MpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidjRsIGRlYyBjbGFzcyBjcmVhdGUgZmFpbC5cbiIpOworCQlnb3RvIGVycl9yZWdfY2xhc3M7CisJfQorCisJZGV2X2luZm8oJnBkZXYtPmRldiwgInY0bGRlYyByZWdpc3RlcmVkIGFzIC9kZXYvdmlkZW8lZFxuIiwgdmZkX2RlYy0+bnVtKTsKKworCXJldHVybiAwOworCitlcnJfcmVnX2NsYXNzOgorCWNsYXNzX3VucmVnaXN0ZXIoJmRldi0+djRsZGVjX2NsYXNzKTsKK2Vycl9kZWNfcmVnOgorCWRlc3Ryb3lfd29ya3F1ZXVlKGRldi0+ZGVjb2RlX3dvcmtxdWV1ZSk7CitlcnJfZXZlbnRfd29ya3E6CisJdjRsMl9tMm1fcmVsZWFzZShkZXYtPm0ybV9kZXZfZGVjKTsKK2Vycl9kZWNfbWVtX2luaXQ6CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UodmZkX2RlYyk7CitlcnJfZGVjX2FsbG9jOgorCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJmRldi0+djRsMl9kZXYpOworZXJyX3JlczoKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYW1sX3Zjb2RlY19kZWNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFtbF92Y29kZWNfZGV2ICpkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWZsdXNoX3dvcmtxdWV1ZShkZXYtPmRlY29kZV93b3JrcXVldWUpOworCWRlc3Ryb3lfd29ya3F1ZXVlKGRldi0+ZGVjb2RlX3dvcmtxdWV1ZSk7CisKKwljbGFzc191bnJlZ2lzdGVyKCZkZXYtPnY0bGRlY19jbGFzcyk7CisKKwlpZiAoZGV2LT5tMm1fZGV2X2RlYykKKwkJdjRsMl9tMm1fcmVsZWFzZShkZXYtPm0ybV9kZXZfZGVjKTsKKworCWlmIChkZXYtPnZmZF9kZWMpCisJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+dmZkX2RlYyk7CisKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZkZXYtPnY0bDJfZGV2KTsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJ2NGxkZWMgcmVtb3ZlZC5cbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFtbF92Y29kZWNfbWF0Y2hbXSA9IHsKKwl7LmNvbXBhdGlibGUgPSAiYW1sb2dpYywgdmNvZGVjLWRlYyIsfSwKKwl7fSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGFtbF92Y29kZWNfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhbWxfdmNvZGVjX2RlY19kcml2ZXIgPSB7CisJLnByb2JlCT0gYW1sX3Zjb2RlY19wcm9iZSwKKwkucmVtb3ZlCT0gYW1sX3Zjb2RlY19kZWNfcmVtb3ZlLAorCS5kcml2ZXIJPSB7CisJCS5uYW1lCT0gQU1MX1ZDT0RFQ19ERUNfTkFNRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gYW1sX3Zjb2RlY19tYXRjaCwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgYW12ZGVjX3BvcnRzX2luaXQodm9pZCkKK3sKKwlwcl9pbmZvKCJ2NGwgZGVjIG1vZHVsZSBpbml0XG4iKTsKKworCWlmIChwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFtbF92Y29kZWNfZGVjX2RyaXZlcikpIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gcmVnaXN0ZXIgdjRsIGRlYyBkcml2ZXJcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFtdmRlY19wb3J0c19leGl0KHZvaWQpCit7CisJcHJfaW5mbygidjRsIGRlYyBtb2R1bGUgZXhpdFxuIik7CisKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYW1sX3Zjb2RlY19kZWNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYW12ZGVjX3BvcnRzX2luaXQpOworbW9kdWxlX2V4aXQoYW12ZGVjX3BvcnRzX2V4aXQpOworCit1MzIgZGVidWdfbW9kZTsKK0VYUE9SVF9TWU1CT0woZGVidWdfbW9kZSk7Cittb2R1bGVfcGFyYW0oZGVidWdfbW9kZSwgdWludCwgMDY0NCk7CisKK3UzMiBtYW5kYXRvcnlfZHdfbW11OworRVhQT1JUX1NZTUJPTChtYW5kYXRvcnlfZHdfbW11KTsKK21vZHVsZV9wYXJhbShtYW5kYXRvcnlfZHdfbW11LCB1aW50LCAwNjQ0KTsKKworYm9vbCBhbWxfc2V0X3ZmbV9lbmFibGU7CitFWFBPUlRfU1lNQk9MKGFtbF9zZXRfdmZtX2VuYWJsZSk7Cittb2R1bGVfcGFyYW0oYW1sX3NldF92Zm1fZW5hYmxlLCBib29sLCAwNjQ0KTsKKworaW50IGFtbF9zZXRfdmZtX3BhdGg7CitFWFBPUlRfU1lNQk9MKGFtbF9zZXRfdmZtX3BhdGgpOworbW9kdWxlX3BhcmFtKGFtbF9zZXRfdmZtX3BhdGgsIGludCwgMDY0NCk7CisKK2Jvb2wgYW1sX3NldF92ZGVjX3R5cGVfZW5hYmxlOworRVhQT1JUX1NZTUJPTChhbWxfc2V0X3ZkZWNfdHlwZV9lbmFibGUpOworbW9kdWxlX3BhcmFtKGFtbF9zZXRfdmRlY190eXBlX2VuYWJsZSwgYm9vbCwgMDY0NCk7CisKK2ludCBhbWxfc2V0X3ZkZWNfdHlwZTsKK0VYUE9SVF9TWU1CT0woYW1sX3NldF92ZGVjX3R5cGUpOworbW9kdWxlX3BhcmFtKGFtbF9zZXRfdmRlY190eXBlLCBpbnQsIDA2NDQpOworCitpbnQgdnA5X25lZWRfcHJlZml4OworRVhQT1JUX1NZTUJPTCh2cDlfbmVlZF9wcmVmaXgpOworbW9kdWxlX3BhcmFtKHZwOV9uZWVkX3ByZWZpeCwgaW50LCAwNjQ0KTsKKworaW50IGF2MV9uZWVkX3ByZWZpeDsKK0VYUE9SVF9TWU1CT0woYXYxX25lZWRfcHJlZml4KTsKK21vZHVsZV9wYXJhbShhdjFfbmVlZF9wcmVmaXgsIGludCwgMDY0NCk7CisKK2Jvb2wgbXVsdGlwbGFuYXI7CitFWFBPUlRfU1lNQk9MKG11bHRpcGxhbmFyKTsKK21vZHVsZV9wYXJhbShtdWx0aXBsYW5hciwgYm9vbCwgMDY0NCk7CisKK2ludCBkdW1wX2NhcHR1cmVfZnJhbWU7CitFWFBPUlRfU1lNQk9MKGR1bXBfY2FwdHVyZV9mcmFtZSk7Cittb2R1bGVfcGFyYW0oZHVtcF9jYXB0dXJlX2ZyYW1lLCBpbnQsIDA2NDQpOworCitpbnQgZHVtcF92cHBfaW5wdXQ7CitFWFBPUlRfU1lNQk9MKGR1bXBfdnBwX2lucHV0KTsKK21vZHVsZV9wYXJhbShkdW1wX3ZwcF9pbnB1dCwgaW50LCAwNjQ0KTsKKworaW50IGR1bXBfZ2UyZF9pbnB1dDsKK0VYUE9SVF9TWU1CT0woZHVtcF9nZTJkX2lucHV0KTsKK21vZHVsZV9wYXJhbShkdW1wX2dlMmRfaW5wdXQsIGludCwgMDY0NCk7CisKK2ludCBkdW1wX291dHB1dF9mcmFtZTsKK0VYUE9SVF9TWU1CT0woZHVtcF9vdXRwdXRfZnJhbWUpOworbW9kdWxlX3BhcmFtKGR1bXBfb3V0cHV0X2ZyYW1lLCBpbnQsIDA2NDQpOworCit1MzIgZHVtcF9vdXRwdXRfc3RhcnRfcG9zaXRpb247CitFWFBPUlRfU1lNQk9MKGR1bXBfb3V0cHV0X3N0YXJ0X3Bvc2l0aW9uKTsKK21vZHVsZV9wYXJhbShkdW1wX291dHB1dF9zdGFydF9wb3NpdGlvbiwgdWludCwgMDY0NCk7CisKK0VYUE9SVF9TWU1CT0wocGFyYW1fc2V0c19mcm9tX3Vjb2RlKTsKK21vZHVsZV9wYXJhbShwYXJhbV9zZXRzX2Zyb21fdWNvZGUsIGJvb2wsIDA2NDQpOworCitFWFBPUlRfU1lNQk9MKGVuYWJsZV9kcm1fbW9kZSk7Cittb2R1bGVfcGFyYW0oZW5hYmxlX2RybV9tb2RlLCBib29sLCAwNjQ0KTsKKworaW50IGJ5cGFzc192cHA7CitFWFBPUlRfU1lNQk9MKGJ5cGFzc192cHApOworbW9kdWxlX3BhcmFtKGJ5cGFzc192cHAsIGludCwgMDY0NCk7CisKK2ludCBieXBhc3NfZ2UyZDsKK0VYUE9SVF9TWU1CT0woYnlwYXNzX2dlMmQpOworbW9kdWxlX3BhcmFtKGJ5cGFzc19nZTJkLCBpbnQsIDA2NDQpOworCitpbnQgbWF4X2RpX2luc3RhbmNlID0gMjsKK0VYUE9SVF9TWU1CT0wobWF4X2RpX2luc3RhbmNlKTsKK21vZHVsZV9wYXJhbShtYXhfZGlfaW5zdGFuY2UsIGludCwgMDY0NCk7CisKK2ludCBieXBhc3NfcHJvZ3Jlc3NpdmUgPSAxOworRVhQT1JUX1NZTUJPTChieXBhc3NfcHJvZ3Jlc3NpdmUpOworbW9kdWxlX3BhcmFtKGJ5cGFzc19wcm9ncmVzc2l2ZSwgaW50LCAwNjQ0KTsKKworYm9vbCBzdXBwb3J0X21qcGVnOworRVhQT1JUX1NZTUJPTChzdXBwb3J0X21qcGVnKTsKK21vZHVsZV9wYXJhbShzdXBwb3J0X21qcGVnLCBib29sLCAwNjQ0KTsKKworYm9vbCBzdXBwb3J0X2Zvcm1hdF9JNDIwOworRVhQT1JUX1NZTUJPTChzdXBwb3J0X2Zvcm1hdF9JNDIwKTsKK21vZHVsZV9wYXJhbShzdXBwb3J0X2Zvcm1hdF9JNDIwLCBib29sLCAwNjQ0KTsKKworaW50IGZvcmNlX2VuYWJsZV9ucjsKK0VYUE9SVF9TWU1CT0woZm9yY2VfZW5hYmxlX25yKTsKK21vZHVsZV9wYXJhbShmb3JjZV9lbmFibGVfbnIsIGludCwgMDY0NCk7CisKK2ludCBmb3JjZV9lbmFibGVfZGlfbG9jYWxfYnVmZmVyOworRVhQT1JUX1NZTUJPTChmb3JjZV9lbmFibGVfZGlfbG9jYWxfYnVmZmVyKTsKK21vZHVsZV9wYXJhbShmb3JjZV9lbmFibGVfZGlfbG9jYWxfYnVmZmVyLCBpbnQsIDA2NDQpOworCitpbnQgdnBwX2J5cGFzc19mcmFtZXM7CitFWFBPUlRfU1lNQk9MKHZwcF9ieXBhc3NfZnJhbWVzKTsKK21vZHVsZV9wYXJhbSh2cHBfYnlwYXNzX2ZyYW1lcywgaW50LCAwNjQ0KTsKKworaW50IGJ5cGFzc19ucl9mbGFnOworRVhQT1JUX1NZTUJPTChieXBhc3NfbnJfZmxhZyk7Cittb2R1bGVfcGFyYW0oYnlwYXNzX25yX2ZsYWcsIGludCwgMDY0NCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQU1MIHZpZGVvIGNvZGVjIFY0TDIgZGVjb2RlciBkcml2ZXIiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbXZkZWNfcG9ydHMvYW1sX3Zjb2RlY19kcnYuaCBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2FtbF92Y29kZWNfZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIyZmU2NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2FtbF92Y29kZWNfZHJ2LmgKQEAgLTAsMCArMSw3ODggQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNyBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisqIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyoKKyogRGVzY3JpcHRpb246CisqLworI2lmbmRlZiBfQU1MX1ZDT0RFQ19EUlZfSF8KKyNkZWZpbmUgX0FNTF9WQ09ERUNfRFJWX0hfCisKKyNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWN0cmxzLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CisjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLWNvcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS92aWRlb2J1ZjItdjRsMi5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdmZtL3ZmcmFtZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdmlkZW9fc2luay92NGx2aWRlb19leHQuaD4KKyNpbmNsdWRlICJhbWxfdmNvZGVjX3V0aWwuaCIKKyNpbmNsdWRlICJhbWxfdmNvZGVjX2RlYy5oIgorCisjZGVmaW5lIEFNTF9WQ09ERUNfRFJWX05BTUUJImFtbF92Y29kZWNfZHJ2IgorI2RlZmluZSBBTUxfVkNPREVDX0RFQ19OQU1FCSJhbWwtdmNvZGVjLWRlYyIKKyNkZWZpbmUgQU1MX1ZDT0RFQ19FTkNfTkFNRQkiYW1sLXZjb2RlYy1lbmMiCisjZGVmaW5lIEFNTF9QTEFURk9STV9TVFIJInBsYXRmb3JtOmFtbG9naWMiCisKKyNkZWZpbmUgQU1MX1ZDT0RFQ19NQVhfUExBTkVTCTMKKyNkZWZpbmUgQU1MX1Y0TDJfQkVOQ0hNQVJLCTAKKyNkZWZpbmUgV0FJVF9JTlRSX1RJTUVPVVRfTVMJMTAwMAorCisvKiBjb2RlYyB0eXBlcyBvZiBnZXQvc2V0IHBhcm1zLiAqLworI2RlZmluZSBWNEwyX0NPTkZJR19QQVJNX0VOQ09ERQkJKDApCisjZGVmaW5lIFY0TDJfQ09ORklHX1BBUk1fREVDT0RFCQkoMSkKKworLyogdHlwZXMgb2YgZGVjb2RlIHBhcm1zLiAqLworI2RlZmluZSBWNEwyX0NPTkZJR19QQVJNX0RFQ09ERV9DRkdJTkZPCSgxIDw8IDApCisjZGVmaW5lIFY0TDJfQ09ORklHX1BBUk1fREVDT0RFX1BTSU5GTwkoMSA8PCAxKQorI2RlZmluZSBWNEwyX0NPTkZJR19QQVJNX0RFQ09ERV9IRFJJTkZPCSgxIDw8IDIpCisjZGVmaW5lIFY0TDJfQ09ORklHX1BBUk1fREVDT0RFX0NOVElORk8JKDEgPDwgMykKKworLyogYW1sb2dpYyBldmVudCBkZWZpbmUuICovCisvKiAjZGVmaW5lIFY0TDJfRVZFTlRfU1JDX0NIX1JFU09MVVRJT04JKDEgPDwgMCkgKi8KKyNkZWZpbmUgVjRMMl9FVkVOVF9TUkNfQ0hfSERSSU5GTwkoMSA8PCAxKQorI2RlZmluZSBWNEwyX0VWRU5UX1NSQ19DSF9QU0lORk8JKDEgPDwgMikKKyNkZWZpbmUgVjRMMl9FVkVOVF9TUkNfQ0hfQ05USU5GTwkoMSA8PCAzKQorCisvKiBleGNlcHRpb24gaGFuZGluZyAqLworI2RlZmluZSBWNEwyX0VWRU5UX1JFUVVFU1RfUkVTRVQJKDEgPDwgOCkKKyNkZWZpbmUgVjRMMl9FVkVOVF9SRVFVRVNUX0VYSVQJCSgxIDw8IDkpCisKKy8qIGVvcyBldmVudCAqLworI2RlZmluZSBWNEwyX0VWRU5UX1NFTkRfRU9TCQkoMSA8PCAxNikKKworLyogdjRsIGJ1ZmZlciBwb29sICovCisjZGVmaW5lIFY0TF9DQVBfQlVGRl9NQVgJCSgzMikKKyNkZWZpbmUgVjRMX0NBUF9CVUZGX0lOVkFMSUQJCSgwKQorI2RlZmluZSBWNExfQ0FQX0JVRkZfSU5fTTJNCQkoMSkKKyNkZWZpbmUgVjRMX0NBUF9CVUZGX0lOX0RFQwkJKDIpCisjZGVmaW5lIFY0TF9DQVBfQlVGRl9JTl9WUFAJCSgzKQorI2RlZmluZSBWNExfQ0FQX0JVRkZfSU5fR0UyRAkJKDQpCisKKy8qIHY0bCByZXNldCBtb2RlICovCisjZGVmaW5lIFY0TF9SRVNFVF9NT0RFX05PUk1BTAkJKDEgPDwgMCkgLyogcmVzZXQgdmRlY19pbnB1dCBhbmQgZGVjb2Rlci4gKi8KKyNkZWZpbmUgVjRMX1JFU0VUX01PREVfTElHSFQJCSgxIDw8IDEpIC8qIGp1c3Qgb25seSByZXNldCBkZWNvZGVyLiAqLworCisvKiBtMm0gam9iIHF1ZXVlJ3Mgc3RhdHVzICovCisvKiBJbnN0YW5jZSBpcyBhbHJlYWR5IHF1ZXVlZCBvbiB0aGUgam9iX3F1ZXVlICovCisjZGVmaW5lIFRSQU5TX1FVRVVFRAkJKDEgPDwgMCkKKy8qIEluc3RhbmNlIGlzIGN1cnJlbnRseSBydW5uaW5nIGluIGhhcmR3YXJlICovCisjZGVmaW5lIFRSQU5TX1JVTk5JTkcJCSgxIDw8IDEpCisvKiBJbnN0YW5jZSBpcyBjdXJyZW50bHkgYWJvcnRpbmcgKi8KKyNkZWZpbmUgVFJBTlNfQUJPUlQJCSgxIDw8IDIpCisKKyNkZWZpbmUgQ1RYX0JVRl9UT1RBTChjdHgpIChjdHgtPmRwYl9zaXplICsgY3R4LT52cHBfc2l6ZSArIGN0eC0+Z2UyZF9zaXplKQorLyoqCisgKiBlbnVtIGFtbF9od19yZWdfaWR4IC0gQU1MIGh3IHJlZ2lzdGVyIGJhc2UgaW5kZXgKKyAqLworZW51bSBhbWxfaHdfcmVnX2lkeCB7CisJVkRFQ19TWVMsCisJVkRFQ19NSVNDLAorCVZERUNfTEQsCisJVkRFQ19UT1AsCisJVkRFQ19DTSwKKwlWREVDX0FELAorCVZERUNfQVYsCisJVkRFQ19QUCwKKwlWREVDX0hXRCwKKwlWREVDX0hXUSwKKwlWREVDX0hXQiwKKwlWREVDX0hXRywKKwlOVU1fTUFYX1ZERUNfUkVHX0JBU0UsCisJLyogaDI2NCBlbmNvZGVyICovCisJVkVOQ19TWVMgPSBOVU1fTUFYX1ZERUNfUkVHX0JBU0UsCisJLyogdnA4IGVuY29kZXIgKi8KKwlWRU5DX0xUX1NZUywKKwlOVU1fTUFYX1ZDT0RFQ19SRUdfQkFTRQorfTsKKworLyoqCisgKiBlbnVtIGFtbF9pbnN0YW5jZV90eXBlIC0gVGhlIHR5cGUgb2YgYW4gQU1MIFZjb2RlYyBpbnN0YW5jZS4KKyAqLworZW51bSBhbWxfaW5zdGFuY2VfdHlwZSB7CisJQU1MX0lOU1RfREVDT0RFUgkJPSAwLAorCUFNTF9JTlNUX0VOQ09ERVIJCT0gMSwKK307CisKKy8qKgorICogZW51bSBhbWxfaW5zdGFuY2Vfc3RhdGUgLSBUaGUgc3RhdGUgb2YgYW4gQU1MIFZjb2RlYyBpbnN0YW5jZS4KKyAqIEBBTUxfU1RBVEVfSURMRQktIGRlZmF1bHQgc3RhdGUgd2hlbiBpbnN0YW5jZSBpcyBjcmVhdGVkCisgKiBAQU1MX1NUQVRFX0lOSVQJLSB2Y29kZWMgaW5zdGFuY2UgaXMgaW5pdGlhbGl6ZWQKKyAqIEBBTUxfU1RBVEVfUFJPQkUJLSB2ZGVjL3ZlbmMgaGFkIHNwcy9wcHMgaGVhZGVyIHBhcnNlZC9lbmNvZGVkCisgKiBAQU1MX1NUQVRFX0FDVElWRQktIHZkZWMgaXMgcmVhZHkgZm9yIHdvcmsuCisgKiBAQU1MX1NUQVRFX0ZMVVNISU5HCS0gdmRlYyBpcyBmbHVzaGluZy4gT25seSB1c2VkIGJ5IGRlY29kZXIKKyAqIEBBTUxfU1RBVEVfRkxVU0hFRAktIGRlY29kZXIgaGFzIHRyYW5zYWN0ZWQgdGhlIGxhc3QgZnJhbWUuCisgKiBAQU1MX1NUQVRFX0FCT1JUCS0gdmNvZGVjIHNob3VsZCBiZSBhYm9ydGVkCisgKi8KK2VudW0gYW1sX2luc3RhbmNlX3N0YXRlIHsKKwlBTUxfU1RBVEVfSURMRSwKKwlBTUxfU1RBVEVfSU5JVCwKKwlBTUxfU1RBVEVfUFJPQkUsCisJQU1MX1NUQVRFX1JFQURZLAorCUFNTF9TVEFURV9BQ1RJVkUsCisJQU1MX1NUQVRFX0ZMVVNISU5HLAorCUFNTF9TVEFURV9GTFVTSEVELAorCUFNTF9TVEFURV9BQk9SVCwKK307CisKKy8qKgorICogc3RydWN0IGFtbF9lbmNvZGVfcGFyYW0gLSBHZW5lcmFsIGVuY29kaW5nIHBhcmFtZXRlcnMgdHlwZQorICovCitlbnVtIGFtbF9lbmNvZGVfcGFyYW0geworCUFNTF9FTkNPREVfUEFSQU1fTk9ORSA9IDAsCisJQU1MX0VOQ09ERV9QQVJBTV9CSVRSQVRFID0gKDEgPDwgMCksCisJQU1MX0VOQ09ERV9QQVJBTV9GUkFNRVJBVEUgPSAoMSA8PCAxKSwKKwlBTUxfRU5DT0RFX1BBUkFNX0lOVFJBX1BFUklPRCA9ICgxIDw8IDIpLAorCUFNTF9FTkNPREVfUEFSQU1fRk9SQ0VfSU5UUkEgPSAoMSA8PCAzKSwKKwlBTUxfRU5DT0RFX1BBUkFNX0dPUF9TSVpFID0gKDEgPDwgNCksCit9OworCitlbnVtIGFtbF9mbXRfdHlwZSB7CisJQU1MX0ZNVF9ERUMgPSAwLAorCUFNTF9GTVRfRU5DID0gMSwKKwlBTUxfRk1UX0ZSQU1FID0gMiwKK307CisKKy8qKgorICogc3RydWN0IGFtbF92aWRlb19mbXQgLSBTdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCBwaXhlbGZvcm1hdHMKKyAqLworc3RydWN0IGFtbF92aWRlb19mbXQgeworCXUzMgkJCWZvdXJjYzsKKwllbnVtIGFtbF9mbXRfdHlwZQl0eXBlOworCXUzMgkJCW51bV9wbGFuZXM7CisJY29uc3QgdTgJCSpuYW1lOworfTsKKworLyoqCisgKiBzdHJ1Y3QgYW1sX2NvZGVjX2ZyYW1lc2l6ZXMgLSBTdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dAorICoJCQkJCQkJZnJhbWVzaXplcworICovCitzdHJ1Y3QgYW1sX2NvZGVjX2ZyYW1lc2l6ZXMgeworCXUzMglmb3VyY2M7CisJc3RydWN0CXY0bDJfZnJtc2l6ZV9zdGVwd2lzZQlzdGVwd2lzZTsKK307CisKKy8qKgorICogc3RydWN0IGFtbF9xX3R5cGUgLSBUeXBlIG9mIHF1ZXVlCisgKi8KK2VudW0gYW1sX3FfdHlwZSB7CisJQU1MX1FfREFUQV9TUkMgPSAwLAorCUFNTF9RX0RBVEFfRFNUID0gMSwKK307CisKKworLyoqCisgKiBzdHJ1Y3QgYW1sX3FfZGF0YSAtIFN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IHF1ZXVlCisgKi8KK3N0cnVjdCBhbWxfcV9kYXRhIHsKKwl1MzIJdmlzaWJsZV93aWR0aDsKKwl1MzIJdmlzaWJsZV9oZWlnaHQ7CisJdTMyCWNvZGVkX3dpZHRoOworCXUzMgljb2RlZF9oZWlnaHQ7CisJZW51bSB2NGwyX2ZpZWxkCWZpZWxkOworCXUzMglieXRlc3BlcmxpbmVbQU1MX1ZDT0RFQ19NQVhfUExBTkVTXTsKKwl1MzIJc2l6ZWltYWdlW0FNTF9WQ09ERUNfTUFYX1BMQU5FU107CisJc3RydWN0IGFtbF92aWRlb19mbXQJKmZtdDsKKwlib29sIHJlc29sdXRpb25fY2hhbmdlZDsKK307CisKKy8qKgorICogc3RydWN0IGFtbF9lbmNfcGFyYW1zIC0gR2VuZXJhbCBlbmNvZGluZyBwYXJhbWV0ZXJzCisgKiBAYml0cmF0ZTogdGFyZ2V0IGJpdHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kCisgKiBAbnVtX2JfZnJhbWU6IG51bWJlciBvZiBiIGZyYW1lcyBiZXR3ZWVuIHAtZnJhbWUKKyAqIEByY19mcmFtZTogZnJhbWUgYmFzZWQgcmF0ZSBjb250cm9sCisgKiBAcmNfbWI6IG1hY3JvYmxvY2sgYmFzZWQgcmF0ZSBjb250cm9sCisgKiBAc2VxX2hkcl9tb2RlOiBILjI2NCBzZXF1ZW5jZSBoZWFkZXIgaXMgZW5jb2RlZCBzZXBhcmF0ZWx5IG9yIGpvaW5lZAorICoJCSAgd2l0aCB0aGUgZmlyc3QgZnJhbWUKKyAqIEBpbnRyYV9wZXJpb2Q6IEkgZnJhbWUgcGVyaW9kCisgKiBAZ29wX3NpemU6IGdyb3VwIG9mIHBpY3R1cmUgc2l6ZSwgaXQncyB1c2VkIGFzIHRoZSBpbnRyYSBmcmFtZSBwZXJpb2QKKyAqIEBmcmFtZXJhdGVfbnVtOiBmcmFtZSByYXRlIG51bWVyYXRvci4gZXg6IGZyYW1lcmF0ZV9udW09MzAgYW5kCisgKgkJICAgZnJhbWVyYXRlX2Rlbm9tPTEgbWVuYXMgRlBTIGlzIDMwCisgKiBAZnJhbWVyYXRlX2Rlbm9tOiBmcmFtZSByYXRlIGRlbm9taW5hdG9yLiBleDogZnJhbWVyYXRlX251bT0zMCBhbmQKKyAqCQkgICAgIGZyYW1lcmF0ZV9kZW5vbT0xIG1lbmFzIEZQUyBpcyAzMAorICogQGgyNjRfbWF4X3FwOiBNYXggdmFsdWUgZm9yIEguMjY0IHF1YW50aXphdGlvbiBwYXJhbWV0ZXIKKyAqIEBoMjY0X3Byb2ZpbGU6IFY0TDIgZGVmaW5lZCBILjI2NCBwcm9maWxlCisgKiBAaDI2NF9sZXZlbDogVjRMMiBkZWZpbmVkIEguMjY0IGxldmVsCisgKiBAZm9yY2VfaW50cmE6IGZvcmNlL2luc2VydCBpbnRyYSBmcmFtZQorICovCitzdHJ1Y3QgYW1sX2VuY19wYXJhbXMgeworCXUzMgliaXRyYXRlOworCXUzMgludW1fYl9mcmFtZTsKKwl1MzIJcmNfZnJhbWU7CisJdTMyCXJjX21iOworCXUzMglzZXFfaGRyX21vZGU7CisJdTMyCWludHJhX3BlcmlvZDsKKwl1MzIJZ29wX3NpemU7CisJdTMyCWZyYW1lcmF0ZV9udW07CisJdTMyCWZyYW1lcmF0ZV9kZW5vbTsKKwl1MzIJaDI2NF9tYXhfcXA7CisJdTMyCWgyNjRfcHJvZmlsZTsKKwl1MzIJaDI2NF9sZXZlbDsKKwl1MzIJZm9yY2VfaW50cmE7Cit9OworCisvKioKKyAqIHN0cnVjdCB2ZGVjX3BpY19pbmZvICAtIHBpY3R1cmUgc2l6ZSBpbmZvcm1hdGlvbgorICogQHZpc2libGVfd2lkdGg6IHBpY3R1cmUgd2lkdGgKKyAqIEB2aXNpYmxlX2hlaWdodDogcGljdHVyZSBoZWlnaHQKKyAqIEBjb2RlZF93aWR0aDogcGljdHVyZSBidWZmZXIgd2lkdGggKDY0IGFsaWduZWQgdXAgZnJvbSBwaWNfdykKKyAqIEBjb2RlZF9oZWlnaHQ6IHBpY3R1cmUgYnVmZmVyIGhlaWh0ICg2NCBhbGlnbmVkIHVwIGZyb20gcGljX2gpCisgKiBAeV9ic19zejogWSBiaXRzdHJlYW0gc2l6ZQorICogQGNfYnNfc3o6IENiQ3IgYml0c3RyZWFtIHNpemUKKyAqIEB5X2xlbl9zejogYWRkaXRpb25hbCBzaXplIHJlcXVpcmVkIHRvIHN0b3JlIGRlY29tcHJlc3MgaW5mb3JtYXRpb24gZm9yIHkKKyAqCQlwbGFuZQorICogQGNfbGVuX3N6OiBhZGRpdGlvbmFsIHNpemUgcmVxdWlyZWQgdG8gc3RvcmUgZGVjb21wcmVzcyBpbmZvcm1hdGlvbiBmb3IgY2JjcgorICoJCXBsYW5lCisgKiBFLmcuIHN1cHBvc2UgcGljdHVyZSBzaXplIGlzIDE3NngxNDQsCisgKiAgICAgIGJ1ZmZlciBzaXplIHdpbGwgYmUgYWxpZ25lZCB0byAxNzZ4MTYwLgorICogQHByb2ZpbGVfaWRjOiBzb3VyY2UgcHJvZmlsZSBsZXZlbAorICogQGZpZWxkOiBmcmFtZS9maWVsZCBpbmZvcm1hdGlvbi4KKyAqIEBkcGJfZnJhbWVzOiB1c2VkIGZvciBEUEIgc2l6ZSBvZiBjYWxjdWxhdGlvbi4KKyAqIEBkcGJfbWFyZ2luOiBleHRyYSBidWZmZXJzIGZvciBkZWNvZGVyLgorICogQHZwcF9tYXJnaW46IGV4dHJhIGJ1ZmZlcnMgZm9yIHZwcC4KKyAqLworc3RydWN0IHZkZWNfcGljX2luZm8geworCXUzMiB2aXNpYmxlX3dpZHRoOworCXUzMiB2aXNpYmxlX2hlaWdodDsKKwl1MzIgY29kZWRfd2lkdGg7CisJdTMyIGNvZGVkX2hlaWdodDsKKwl1MzIgeV9ic19zejsKKwl1MzIgY19ic19zejsKKwl1MzIgeV9sZW5fc3o7CisJdTMyIGNfbGVuX3N6OworCWludCBwcm9maWxlX2lkYzsKKwllbnVtIHY0bDJfZmllbGQgZmllbGQ7CisJdTMyIGRwYl9mcmFtZXM7CisJdTMyIGRwYl9tYXJnaW47CisJdTMyIHZwcF9tYXJnaW47Cit9OworCisvKioKKyAqIHN0cnVjdCB2ZGVjX2NvbXBfYnVmX2luZm8gLSBjb21wcmVzc2VkIGJ1ZmZlciBpbmZvCisgKiBAbWF4X3NpemU6IG1heCBzaXplIG5lZWRlZCBmb3IgTU1VIEJveCBpbiBNQgorICogQGhlYWRlcl9zaXplOiBjb250aW5lb3VzIHNpemUgZm9yIHRoZSBjb21wcmVzc2VkIGhlYWRlcgorICogQGZyYW1lX2J1ZmZlcl9zaXplOiBTRyBwYWdlIG51bWJlciB0byBzdG9yZSB0aGUgZnJhbWUKKyAqLworc3RydWN0IHZkZWNfY29tcF9idWZfaW5mbyB7CisJdTMyIG1heF9zaXplOworCXUzMiBoZWFkZXJfc2l6ZTsKKwl1MzIgZnJhbWVfYnVmZmVyX3NpemU7Cit9OworCitzdHJ1Y3QgYW1sX3ZkZWNfY2ZnX2luZm9zIHsKKwl1MzIgZG91YmxlX3dyaXRlX21vZGU7CisJdTMyIGluaXRfd2lkdGg7CisJdTMyIGluaXRfaGVpZ2h0OworCXUzMiByZWZfYnVmX21hcmdpbjsKKwl1MzIgY2FudmFzX21lbV9tb2RlOworCXUzMiBjYW52YXNfbWVtX2VuZGlhbjsKKwl1MzIgbG93X2xhdGVuY3lfbW9kZTsKKwl1MzIgdXZtX2hvb2tfdHlwZTsKKwkvKgorCSAqIGJpdCAxNgk6IGZvcmNlIHByb2dyZXNzaXZlIG91dHB1dCBmbGFnLgorCSAqIGJpdCAxNQk6IGVuYWJsZSBuci4KKwkgKiBiaXQgMTQJOiBlbmFibGUgZGkgbG9jYWwgYnVmZi4KKwkgKiBiaXQgMTMJOiByZXBvcnQgZG93bnNjYWxlIHl1diBidWZmZXIgc2l6ZSBmbGFnLgorCSAqIGJpdCAxMgk6IGZvciBzZWNvbmQgZmllbGQgcHRzIG1vZGUuCisJICogYml0IDExCTogZGlzYWJsZSBlcnJvciBwb2xpY3kKKwkgKiBiaXQgMQk6IE5vbi1zdGFuZGFyZCBkdiBmbGFnLgorCSAqIGJpdCAwCTogZHYgdHdvIGxheWVyIGZsYWcuCisJICovCisJdTMyIG1ldGFkYXRhX2NvbmZpZ19mbGFnOyAvLyBmb3IgbWV0YWRhdGEgY29uZmlnIGZsYWcKKwl1MzIgZHVyYXRpb247CisJdTMyIGRhdGFbNF07Cit9OworCitzdHJ1Y3QgYW1sX3ZkZWNfaGRyX2luZm9zIHsKKwkvKgorCSAqIGJpdCAyOSAgIDogcHJlc2VudF9mbGFnCisJICogYml0IDI4LTI2OiB2aWRlb19mb3JtYXQgImNvbXBvbmVudCIsICJQQUwiLCAiTlRTQyIsICJTRUNBTSIsICJNQUMiLCAidW5zcGVjaWZpZWQiCisJICogYml0IDI1ICAgOiByYW5nZSAibGltaXRlZCIsICJmdWxsX3JhbmdlIgorCSAqIGJpdCAyNCAgIDogY29sb3JfZGVzY3JpcHRpb25fcHJlc2VudF9mbGFnCisJICogYml0IDIzLTE2OiBjb2xvcl9wcmltYXJpZXMgInVua25vd24iLCAiYnQ3MDkiLCAidW5kZWYiLCAiYnQ2MDEiLAorCSAqICAgICAgICAgICAgImJ0NDcwbSIsICJidDQ3MGJnIiwgInNtcHRlMTcwbSIsICJzbXB0ZTI0MG0iLCAiZmlsbSIsICJidDIwMjAiCisJICogYml0IDE1LTggOiB0cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpYyB1bmtub3duIiwgImJ0NzA5IiwgInVuZGVmIiwgImJ0NjAxIiwKKwkgKiAgICAgICAgICAgICJidDQ3MG0iLCAiYnQ0NzBiZyIsICJzbXB0ZTE3MG0iLCAic21wdGUyNDBtIiwKKwkgKiAgICAgICAgICAgICJsaW5lYXIiLCAibG9nMTAwIiwgImxvZzMxNiIsICJpZWM2MTk2Ni0yLTQiLAorCSAqICAgICAgICAgICAgImJ0MTM2MWUiLCAiaWVjNjE5NjYtMi0xIiwgImJ0MjAyMC0xMCIsICJidDIwMjAtMTIiLAorCSAqICAgICAgICAgICAgInNtcHRlLXN0LTIwODQiLCAic21wdGUtc3QtNDI4IgorCSAqIGJpdCA3LTAgIDogbWF0cml4X2NvZWZmaWNpZW50ICJHQlIiLCAiYnQ3MDkiLCAidW5kZWYiLCAiYnQ2MDEiLAorCSAqICAgICAgICAgICAgImZjYyIsICJidDQ3MGJnIiwgInNtcHRlMTcwbSIsICJzbXB0ZTI0MG0iLAorCSAqICAgICAgICAgICAgIllDZ0NvIiwgImJ0MjAyMG5jIiwgImJ0MjAyMGMiCisJICovCisJdTMyIHNpZ25hbF90eXBlOworCXN0cnVjdCB2ZnJhbWVfbWFzdGVyX2Rpc3BsYXlfY29sb3VyX3MgY29sb3JfcGFybXM7Cit9OworCitzdHJ1Y3QgYW1sX3ZkZWNfcHNfaW5mb3MgeworCXUzMiB2aXNpYmxlX3dpZHRoOworCXUzMiB2aXNpYmxlX2hlaWdodDsKKwl1MzIgY29kZWRfd2lkdGg7CisJdTMyIGNvZGVkX2hlaWdodDsKKwl1MzIgcHJvZmlsZTsKKwl1MzIgbWJfd2lkdGg7CisJdTMyIG1iX2hlaWdodDsKKwl1MzIgZHBiX3NpemU7CisJdTMyIHJlZl9mcmFtZXM7CisJdTMyIGRwYl9mcmFtZXM7CisJdTMyIGRwYl9tYXJnaW47CisJdTMyIGZpZWxkOworCXUzMiBkYXRhWzNdOworfTsKKworc3RydWN0IGFtbF92ZGVjX2NudF9pbmZvcyB7CisJdTMyIGJpdF9yYXRlOworCXUzMiBmcmFtZV9jb3VudDsKKwl1MzIgZXJyb3JfZnJhbWVfY291bnQ7CisJdTMyIGRyb3BfZnJhbWVfY291bnQ7CisJdTMyIHRvdGFsX2RhdGE7Cit9OworCitzdHJ1Y3QgYW1sX2RlY19wYXJhbXMgeworCXUzMiBwYXJtc19zdGF0dXM7CisJc3RydWN0IGFtbF92ZGVjX2NmZ19pbmZvcwljZmc7CisJc3RydWN0IGFtbF92ZGVjX3BzX2luZm9zCXBzOworCXN0cnVjdCBhbWxfdmRlY19oZHJfaW5mb3MJaGRyOworCXN0cnVjdCBhbWxfdmRlY19jbnRfaW5mb3MJY250OworfTsKKworc3RydWN0IHY0bDJfY29uZmlnX3Bhcm0geworCXUzMiB0eXBlOworCXUzMiBsZW5ndGg7CisJdW5pb24geworCQlzdHJ1Y3QgYW1sX2RlY19wYXJhbXMgZGVjOworCQlzdHJ1Y3QgYW1sX2VuY19wYXJhbXMgZW5jOworCQl1OCBkYXRhWzIwMF07CisJfSBwYXJtOworCXU4IGJ1Zls0MDk2XTsKK307CisKK3N0cnVjdCB2NGxfYnVmZl9wb29sIHsKKwkvKgorCSAqIGJpdCAzMS0xNjogYnVmZmVyIHN0YXRlCisJICogYml0IDE1LSAwOiBidWZmZXIgaW5kZXgKKwkgKi8KKwl1MzIgc2VxW1Y0TF9DQVBfQlVGRl9NQVhdOworCXUzMiBpbiwgb3V0OworCXUzMiBkZWMsIHZwcCwgZ2UyZDsKK307CisKK2VudW0gYW1sX3RocmVhZF90eXBlIHsKKwlBTUxfVEhSRUFEX09VVFBVVCwKKwlBTUxfVEhSRUFEX0NBUFRVUkUsCit9OworCit0eXBlZGVmIHZvaWQgKCphbWxfdGhyZWFkX2Z1bmMpKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4KTsKKworc3RydWN0IGFtbF92ZGVjX3RocmVhZCB7CisJc3RydWN0IGxpc3RfaGVhZAlub2RlOworCXNwaW5sb2NrX3QJCWxvY2s7CisJc3RydWN0IHNlbWFwaG9yZQlzZW07CisJc3RydWN0IHRhc2tfc3RydWN0CSp0YXNrOworCWVudW0gYW1sX3RocmVhZF90eXBlCXR5cGU7CisJdm9pZAkJCSpwcml2OworCWludAkJCXN0b3A7CisKKwlhbWxfdGhyZWFkX2Z1bmMJCWZ1bmM7Cit9OworCisvKiBzdHJ1Y3QgaW50ZXJuYWxfY29tcF9idWYgLSBjb21wcmVzc2VkIGJ1ZmZlcgorICogQGluZGV4OiBpbmRleCBvZiB0aGlzIGJ1ZiB3aXRoaW4gKEIpTU1VIEJPWAorICogQHJlZjogWzAtN106cmVmZXJlbmNlIG51bWJlciBvZiB0aGlzIGJ1ZgorICogICAgICAgWzgtMTVdOiB1c2UgZm9yIHJldXNlLgorICogQG1tdV9ib3g6IG1tdV9ib3ggb2YgY29udGV4dAorICogQGJtbXVfYm94OiBibW11X2JveCBvZiBjb250ZXh0CisgKiBAYm94X3JlZjogYm94X3JlZiBvZiBjb250ZXh0CisgKiBAaGVhZGVyX2FkZHI6IGhlYWRlciBmb3IgY29tcHJlc3NlZCBidWZmZXIKKyAqIEBmcmFtZV9idWZmZXJfc2l6ZTogU0cgYnVmZmVyIHBhZ2UgbnVtYmVyIGZyb20KKyAqIEBwcml2X2RhdGEgdXNlIGZvciB2aWRlbyBjb21wb3NlcgorICogIHN0cnVjdCB2ZGVjX2NvbXBfYnVmX2luZm8KKyAqLworc3RydWN0IGludGVybmFsX2NvbXBfYnVmIHsKKwl1MzIJCWluZGV4OworCXUzMgkJcmVmOworCXZvaWQJCSptbXVfYm94OworCXZvaWQJCSpibW11X2JveDsKKwlzdHJ1Y3Qga3JlZgkqYm94X3JlZjsKKworCXVsb25nCQloZWFkZXJfYWRkcjsKKwl1MzIJCWhlYWRlcl9zaXplOworCXUzMgkJZnJhbWVfYnVmZmVyX3NpemU7CisJc3RydWN0IGZpbGVfcHJpdmF0ZV9kYXRhIHByaXZfZGF0YTsKKwl1bG9uZwloZWFkZXJfZHdfYWRkcjsKKwl2b2lkCSptbXVfYm94X2R3OworCXZvaWQJKmJtbXVfYm94X2R3OworfTsKKworLyoKKyAqIHN0cnVjdCBhbWxfdXZtX2J1ZmZfcmVmIC0gdXZtIGJ1ZmYgaXMgdXNlZCByZXNldmUgY3R4IHJlZiBjb3VudC4KKyAqIEBpbmRleAk6IGluZGV4IG9mIHZpZGVvIGJ1ZmZlci4KKyAqIEBhZGRyCTogcGh5c2ljIGFkZHJlc3Mgb2YgdmlkZW8gYnVmZmVyLgorICogQHJlZgkJOiByZWZlcmVuY2Ugb2YgdjRsZGVjIGNvbnRleHQuCisgKiBAZG1hCQk6IGRtYSBidWYgb2YgYXNzb2NpYXRlZCB3aXRoIHZiLgorICovCitzdHJ1Y3QgYW1sX3V2bV9idWZmX3JlZiB7CisJaW50CQlpbmRleDsKKwl1bG9uZwkJYWRkcjsKKwlzdHJ1Y3Qga3JlZgkqcmVmOworCXN0cnVjdCBkbWFfYnVmCSpkYnVmOworfTsKKworLyoKKyAqIGVudW0gYW1sX2ZiX3JlcXVlc3RlciAtIGluZGljYXRlIHdoaWNoIG1vZHVsZSByZXF1ZXN0IGZiIGJ1ZmZlcnMuCisgKi8KK2VudW0gYW1sX2ZiX3JlcXVlc3RlciB7CisJQU1MX0ZCX1JFUV9ERUMsCisJQU1MX0ZCX1JFUV9WUFAsCisJQU1MX0ZCX1JFUV9HRTJELAorCUFNTF9GQl9SRVFfTUFYCit9OworCisvKgorICogQHF1ZXJ5OiB0cnkgdG8gYWNoaWV2ZWQgZmIgdG9rZW4uCisgKiBAYWxsb2M6IHVzZWQgZm9yIGFsbG9jdGUgZmIgYnVmZmVyLgorICovCitzdHJ1Y3QgYW1sX2ZiX29wcyB7CisJYm9vbAkJKCpxdWVyeSkoc3RydWN0IGFtbF9mYl9vcHMgKiwgdWxvbmcgKik7CisJaW50CQkoKmFsbG9jKShzdHJ1Y3QgYW1sX2ZiX29wcyAqLCB1bG9uZywgc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKiosIHUzMik7Cit9OworCisvKgorICogc3RydWN0IGFtbF9mYl9tYXBfdGFibGUgLSByZWNvcmQgc29tZSBidWZmZXIgbWFwIGluZm9zCisgKiBAYWRkcgk6IHl1diBsaW5lYXIgYnVmZmVyIGFkZHJlc3MuCisgKiBAaGVhZGVyX2FkZHIJOiB1c2VkIGZvciBjb21wcmVzcyBidWZmZXIuCisgKiBAdmZyYW1lCTogd2hpY2ggaXMgZnJvbSBkZWNvZGVyIG9yIHZwcCB2ZiBwb29sLgorICogQHRhc2sJOiBjb250ZXh0IG9mIHRhc2sgY2hhaW4uCisgKiBAaWNvbXAJOiBjb21wcmVzcyBidWZmZXIgaW5kZXguCisgKi8KK3N0cnVjdCBhbWxfZmJfbWFwX3RhYmxlIHsKKwl1bG9uZwkJYWRkcjsKKwl1bG9uZwkJaGVhZGVyX2FkZHI7CisJc3RydWN0IHZmcmFtZV9zCSp2ZnJhbWU7CisJc3RydWN0IHRhc2tfY2hhaW5fcyAqdGFzazsKKwl1MzIJCWljb21wOworfTsKKworLyoKKyAqIHN0cnVjdCBhdXhfZGF0YSAtIHJlY29yZCBzZWkgZGF0YSBhbmQgZHYgZGF0YQorICogQHNlaV9zaXplOglzZWkgZGF0YSBzaXplLgorICogQHNlaV9idWY6CXNlaSBkYXRhIGFkZHIuCisgKiBAc2VpX3N0YXRlOglzZWkgYnVmZmVyIHN0YXRlLiAoMCBmcmVlLCAxIG5vdCB1c2VkLCAyIHVzZWQpCisgKiBAY29tcF9idWY6CXN0b3JlcyBjb21wIGRhdGEgcGFyc2VkIGZyb20gc2VpIGRhdGEuCisgKiBAbWRfYnVmOglzdG9yZXMgbWQgZGF0YSBwYXJzZWQgZnJvbSBzZWkgZGF0YS4KKyAqLworc3RydWN0IGF1eF9kYXRhIHsKKwlpbnQJCXNlaV9zaXplOworCWNoYXIqCQlzZWlfYnVmOworCWludAkJc2VpX3N0YXRlOworCWNoYXIqCQljb21wX2J1ZjsKKwljaGFyKgkJbWRfYnVmOworfTsKKworLyoKKyAqIHN0cnVjdCBhdXhfaW5mbyAtIHJlY29yZCBhdXggZGF0YSBpbmZvcworICogQHNlaV9pbmRleDoJCXNlaSBkYXRhIGluZGV4LgorICogQGR2X2luZGV4OgkJZHYgZGF0YSBpbmRleC4KKyAqIEBzZWlfbmVlZF9mcmVlOglzZWkgYnVmZmVyIG5lZWQgdG8gZnJlZS4KKyAqIEBidWZzOgkJc3RvcmVzIGF1eCBkYXRhLgorICogQGFsbG9jX2J1ZmZlcjoJYWxsb2MgYXV4IGJ1ZmZlciBmdW5jdGlvbnMuCisgKiBAZnJlZV9idWZmZXI6CWZyZWUgYXV4IGJ1ZmZlciBmdW5jdGlvbnMuCisgKiBAZnJlZV9vbmVfc2VpX2J1ZmZlcjpmcmVlIHNlaSBidWZmZXIgd2l0aCBpbmRleCBmdW5jdGlvbnMuCisgKiBAYmluZF9zZWlfYnVmZmVyOgliaW5kIHNlaSBidWZmZXIgZnVuY3Rpb25zLgorICogQGJpbmRfZHZfYnVmZmVyOgliaW5kIGR2IGJ1ZmZlciBmdW5jdGlvbnMuCisgKi8KK3N0cnVjdCBhdXhfaW5mbyB7CisJaW50CXNlaV9pbmRleDsKKwlpbnQgCWR2X2luZGV4OworCWJvb2wgICAgc2VpX25lZWRfZnJlZTsKKwlzdHJ1Y3QgYXV4X2RhdGEgYnVmc1tWNExfQ0FQX0JVRkZfTUFYXTsKKwl2b2lkIAkoKmFsbG9jX2J1ZmZlcikoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsIGludCBmbGFnKTsKKwl2b2lkIAkoKmZyZWVfYnVmZmVyKShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCwgaW50IGZsYWcpOworCXZvaWQgCSgqZnJlZV9vbmVfc2VpX2J1ZmZlcikoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsIGNoYXIgKiphZGRyLCBpbnQgKnNpemUsIGludCBpZHgpOworCXZvaWQgCSgqYmluZF9zZWlfYnVmZmVyKShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCwgY2hhciAqKmFkZHIsIGludCAqc2l6ZSwgaW50ICppZHgpOworCXZvaWQJKCpiaW5kX2R2X2J1ZmZlcikoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsIGNoYXIgKipjb21wX2J1ZiwgY2hhciAqKm1kX2J1Zik7Cit9OworCisvKgorICogc3RydWN0IG1ldGFfZGF0YSAtIHJlY29yZCBtZXRhIGRhdGEuCisgKiBAYnVmW01FVEFfREFUQV9TSVpFXTogbWV0YSBkYXRhIGluZm9ybWF0aW9uLgorICovCitzdHJ1Y3QgbWV0YV9kYXRhIHsKKwljaGFyIGJ1ZltNRVRBX0RBVEFfU0laRV07Cit9OworCisvKgorICogc3RydWN0IG1ldGFfaW5mbyAtIHJlY29yZCBzb21lIG1ldGEgZGF0YSBpbmZvcworICogQGluZGV4OiBtZXRhIGRhdGEgaW5kZXguCisgKiBAbWV0YV9idWZzOiByZWNvcmQgbWV0YSBkYXRhLgorICovCitzdHJ1Y3QgbWV0YV9pbmZvIHsKKwlpbnQJCWluZGV4OworCXN0cnVjdCBtZXRhX2RhdGEgKm1ldGFfYnVmczsKK307CisKKy8qCisgKiBzdHJ1Y3QgYW1sX3ZwcF9jZmdfaW5mb3MgLSBjb25maWcgdnBwIGluaXQgcGFyYW0KKyAqIEBtb2RlCTogdnBwIHdvcmsgbW9kZQorICogQGZtdAkJOiBwaWN0dXJlIGZvcm1hdCB1c2VkIHRvIHN3aXRjaCBudjIxIG9yIG52MTIuCisgKiBAYnVmX3NpemU6IGNvbmZpZyBidWZmZXIgc2l6ZSBmb3IgdnBwCisgKiBAaXNfZHJtCTogaXMgZHJtIG1vZGUKKyAqIEBpc19wcm9nCTogaXMgYSBwcm9ncmVzc2l2ZSBzb3VyY2UuCisgKiBAaXNfYnlwYXNzX3AJOiB0byBzZXQgcHJvZ3Jlc3NpdmUgYnlwYXNzIGluIHZwcAorICogQGVuYWJsZV9ucgk6IGVuYWJsZSBub3NpZSByZWR1Y2UuCisgKiBAZW5hYmxlX2xvY2FsX2J1ZjogREkgdXNlZCBidWZmIGFsbG9jIGJ5IGl0c2VsZi4KKyAqIEByZXNfY2hnCTogaW5kaWNhdGUgcmVzb2x1dGlvbiBjaGFuZ2VkLgorICogQGlzX3ZwcF9yZXNldDogdnBwIHJlc2V0IGp1c3QgdXNlZCB0byByZXMgY2hnLgorICovCitzdHJ1Y3QgYW1sX3ZwcF9jZmdfaW5mb3MgeworCXUzMgltb2RlOworCXUzMglmbXQ7CisJdTMyCWJ1Zl9zaXplOworCWJvb2wJaXNfZHJtOworCWJvb2wJaXNfcHJvZzsKKwlib29sCWlzX2J5cGFzc19wOworCWJvb2wJZW5hYmxlX25yOworCWJvb2wJZW5hYmxlX2xvY2FsX2J1ZjsKKwlib29sCXJlc19jaGc7CisJYm9vbAlpc192cHBfcmVzZXQ7Cit9OworCitzdHJ1Y3QgYW1sX2dlMmRfY2ZnX2luZm9zIHsKKwl1MzIJbW9kZTsKKwl1MzIJYnVmX3NpemU7CisJYm9vbAlpc19kcm07Cit9OworCisvKgorICogc3RydWN0IGFtbF92Y29kZWNfY3R4IC0gQ29udGV4dCAoaW5zdGFuY2UpIHByaXZhdGUgZGF0YS4KKyAqIEBpZDogaW5kZXggb2YgdGhlIGNvbnRleHQgdGhhdCB0aGlzIHN0cnVjdHVyZSBkZXNjcmliZXMuCisgKiBAY3R4X3JlZjogZm9yIGRlZmVycmVkIGZyZWUgb2YgdGhpcyBjb250ZXh0LgorICogQHR5cGU6IHR5cGUgb2YgdGhlIGluc3RhbmNlIC0gZGVjb2RlciBvciBlbmNvZGVyLgorICogQGRldjogcG9pbnRlciB0byB0aGUgYW1sX3Zjb2RlY19kZXYgb2YgdGhlIGRldmljZS4KKyAqIEBtMm1fY3R4OiBwb2ludGVyIHRvIHRoZSB2NGwyX20ybV9jdHggb2YgdGhlIGNvbnRleHQuCisgKiBAYWRhX2N0eDogcG9pbnRlciB0byB0aGUgYW1sX3ZkZWNfYWRhcHQgb2YgdGhlIGNvbnRleHQuCisgKiBAdnBwOiBwb2ludGVyIHRvIHZpZGVvIHBvc3QgcHJvY2Vzc29yCisgKiBAZGVjX2lmOiBob29rZWQgZGVjb2RlciBkcml2ZXIgaW50ZXJmYWNlLgorICogQGRydl9oYW5kbGU6IGRyaXZlciBoYW5kbGUgZm9yIHNwZWNpZmljIGRlY29kZSBpbnN0YW5jZQorICogQGZoOiBzdHJ1Y3QgdjRsMl9maC4KKyAqIEBjdHJsX2hkbDogaGFuZGxlciBmb3IgdjRsMiBmcmFtZXdvcmsuCisgKiBAc2xvY2s6IHByb3RlY3QgdjRsMiBjb2RlYyBjb250ZXh0LgorICogQHRzcGxvY2s6IHByb3RlY3QgdGhlIHZkZWMgdGhyZWFkIGNvbnRleHQuCisgKiBAZW1wdHlfZmx1c2hfYnVmOiBhIGZha2Ugc2l6ZS0wIGNhcHR1cmUgYnVmZmVyIHRoYXQgaW5kaWNhdGVzIGZsdXNoLgorICogQGxpc3Q6IGxpbmsgdG8gY3R4X2xpc3Qgb2YgYW1sX3Zjb2RlY19kZXYuCisgKiBAcV9kYXRhOiBzdG9yZSBpbmZvcm1hdGlvbiBvZiBpbnB1dCBhbmQgb3V0cHV0IHF1ZXVlIG9mIHRoZSBjb250ZXh0LgorICogQHF1ZXVlOiB3YWl0cXVldWUgdGhhdCBjYW4gYmUgdXNlZCB0byB3YWl0IGZvciB0aGlzIGNvbnRleHQgdG8gZmluaXNoLgorICogQHN0YXRlX2xvY2s6IHByb3RlY3QgdGhlIGNvZGVjIHN0YXR1cy4KKyAqIEBzdGF0ZTogc3RhdGUgb2YgdGhlIGNvbnRleHQuCisgKiBAZGVjb2RlX3dvcms6IGRlY29kZXIgd29yayBiZSB1c2VkIHRvIG91dHB1dCBidWZmZXIuCisgKiBAb3V0cHV0X3RocmVhZF9yZWFkeTogaW5kaWNhdGUgdGhlIG91dHB1dCB0aHJlYWQgcmVhZHkuCisgKiBAY2FwX3Bvb2w6IGNhcHR1cmUgYnVmZmVycyBhcmUgcmVtYXJrIGluIHRoZSBwb29sLgorICogQHZkZWNfdGhyZWFkX2xpc3Q6IHZkZWMgdGhyZWFkIGJlIHVzZWQgdG8gY2FwdHVyZS4KKyAqIEBkcGJfc2l6ZTogc3RvcmUgZHBiIGNvdW50IGFmdGVyIGhlYWRlciBwYXJzaW5nCisgKiBAdnBwX3NpemU6IHN0b3JlIHZwcCBidWZmZXIgY291bnQgYWZ0ZXIgaGVhZGVyIHBhcnNpbmcKKyAqIEBwYXJhbV9jaGFuZ2U6IGluZGljYXRlIGVuY29kZSBwYXJhbWV0ZXIgdHlwZQorICogQHBhcmFtX3NldHNfZnJvbV91Y29kZTogaWYgdHJ1ZSBpbmRpY2F0ZSBwcyBmcm9tIHVjb2RlLgorICogQHY0bF9jb2RlY19kcGJfcmVhZHk6IHF1ZXVlIGJ1ZmZlciBudW1iZXIgZ3JlYXRlciB0aGFuIGRwYi4KKyAjIEB2NGxfcmVzb2x1dGlvbl9jaGFuZ2U6IGluZGljYXRlIHJlc29sdXRpb24gY2hhbmdlIGhhcHBlbmQuCisgKiBAY29tcDogY29tcCBiZSB1c2VkIGZvciBzeW5jIHBpY3R1cmUgaW5mb3JtYXRpb24gd2l0aCBkZWNvZGVyLgorICogQGNvbmZpZzogdXNlZCB0byBzZXQgb3IgZ2V0IHBhcm1zIGZvciBhcHBsaWNhdGlvbi4KKyAqIEBwaWNpbmZvOiBzdG9yZSBwaWN0dXJlIGluZm8gYWZ0ZXIgaGVhZGVyIHBhcnNpbmcuCisgKiBAbGFzdF9kZWNvZGVkX3BpY2luZm86IHBpYyBpbmZvcm1hdGlvbiBnZXQgZnJvbSBsYXRlc3QgZGVjb2RlLgorICogQGNvbG9yc3BhY2U6IGVudW0gdjRsMl9jb2xvcnNwYWNlOyBzdXBwbGVtZW50YWwgdG8gcGl4ZWxmb3JtYXQuCisgKiBAeWNiY3JfZW5jOiBlbnVtIHY0bDJfeWNiY3JfZW5jb2RpbmcsIFknQ2JDciBlbmNvZGluZy4KKyAqIEBxdWFudGl6YXRpb246IGVudW0gdjRsMl9xdWFudGl6YXRpb24sIGNvbG9yc3BhY2UgcXVhbnRpemF0aW9uLgorICogQHhmZXJfZnVuYzogZW51bSB2NGwyX3hmZXJfZnVuYywgY29sb3JzcGFjZSB0cmFuc2ZlciBmdW5jdGlvbi4KKyAqIEBjYXBfcGl4X2ZtdDogdGhlIHBpY3R1cmUgZm9ybWF0IHVzZWQgdG8gc3dpdGNoIG52MjEgb3IgbnYxMi4KKyAqIEBoYXNfcmVjZWl2ZV9lb3M6IGlmIHJlY2VpdmUgbGFzdCBmcmFtZSBvZiBjYXB0dXJlIHRoYXQgYmUgc2V0LgorICogQGlzX2RybV9tb2RlOiBkZWNvZGluZyB3b3JrIG9uIGRybSBtb2RlIGlmIHRoYXQgc2V0LgorICogQGlzX3N0cmVhbV9tb2RlOiB2ZGVjIGlucHV0IHVzZWQgdG8gc3RyZWFtIG1vZGUsIGRlZmF1bHQgZnJhbWUgbW9kZS4KKyAqIEBpc19zdHJlYW1fb2ZmOiB0aGUgdmFsdWUgdXNlZCB0byBoYW5kbGUgcmVzZXQgYWN0aXZlLgorICogQGlzX291dF9zdHJlYW1fb2ZmOiBzdHJlYW1vZmYgY2FsbGVkIGZvciBvdXRwdXQgcG9ydC4KKyAqIEByZWNlaXZlX2NtZF9zdG9wOiBpZiByZWNlaXZlIHRoZSBjbWQgZmx1c2ggZGVjb2Rlci4KKyAqIEByZXNldF9mbGFnOiByZXNldCBtb2RlIGluY2x1ZGVzIGxpZ2h0bHkgYW5kIG5vcm1hbCBtb2RlLgorICogQGRlY29kZWRfZnJhbWVfY250OiB0aGUgY2FwdHVyZSBidWZmZXIgZGVxdWUgbnVtYmVyIHRvIGJlIGNvdW50LgorICogQGJ1Zl91c2VkX2NvdW50OiBtZWFucyB0aGF0IGRlY29kZSBhbGxvY2F0ZSBob3cgbWFueSBidWZmcyBmcm9tIHY0bC4KKyAqIEB3cTogd2FpdCByZWN5Y2xlIGRtYSBidWZmZXIgZmluaXNoLgorICogQGNhcF93cTogdGhlIHdxIHVzZWQgZm9yIHdhaXQgY2FwdHVyZSBidWZmZXIuCisgKiBAZG1hYnVmZl9yZWN5Y2xlX2xvY2s6IHByb3RlY3QgdGhlIGxvY2sgZG1hYnVmZiBmcmVlLgorICogQGRtYWJ1ZmZfcmVjeWNsZV93b3JrOiB1c2VkIGZvciByZWN5Y2xlIGRtYWJ1ZmYuCisgKiBAZG1hYnVmZl9yZWN5Y2xlOiBrZmlmbyB1c2VkIGZvciBzdG9yZSB2YiBidWZmLgorICogQGNhcHR1cmVfYnVmZmVyOiBrZmlmbyB1c2VkIGZvciBzdG9yZSBjYXB0dXJlIHZiIGJ1ZmYuCisgKiBAbW11X2JveDogbW11X2JveCBvZiBjb250ZXh0LgorICogQGJtbXVfYm94OiBibW11X2JveCBvZiBjb250ZXh0LgorICogQGJveF9yZWY6IGJveF9yZWYgb2YgY29udGV4dC4KKyAqIEBjb21wX2luZm86IGNvbXByZXNzIGJ1ZmZlciBpbmZvcm1hdGlvbi4KKyAqIEBjb21wX2J1ZnM6IGNvbXByZXNzIGJ1ZmZlciBkZXNjcmliZS4KKyAqIEBjb21wX2xvY2s6IHVzZWQgZm9yIGxvY2sgaWJ1ZiBmcmVlIGNiLgorICogQGZiX29wczogZnJhbWUgYnVmZmVyIG9wcyBpbnRlcmZhY2UuCisgKiBAZHZfaW5mb3M6IGR2IGRhdGEgaW5mb3JtYXRpb24uCisgKiBAdnBwX2NmZzogdnBwIGluaXQgcGFybXMgb2YgY29uZmlndXJhdGlvbi4KKyAqIEB2ZGVjX3BpY19pbmZvX3VwZGF0ZTogdXBkYXRlIHBpYyBpbmZvIGNiLgorICogQHZwcF9pc19uZWVkOiB0aGUgaW5zdGFuY2UgaXMgbmVlZCB2cHAuCisgKiBAdGFza19jaGFpbl9wb29sOiB1c2VkIHRvIHN0b3JlIHRhc2sgY2hhaW4gaW5zdC4KKyAqIEBpbmRleF9kaXNwOiB0aGUgbnVtYmVyIG9mIGZyYW1lcyBvdXRwdXQuCisgKi8KK3N0cnVjdCBhbWxfdmNvZGVjX2N0eCB7CisJaW50CQkJCWlkOworCXN0cnVjdCBrcmVmCQkJY3R4X3JlZjsKKwllbnVtIGFtbF9pbnN0YW5jZV90eXBlCQl0eXBlOworCXN0cnVjdCBhbWxfdmNvZGVjX2RldgkJKmRldjsKKwlzdHJ1Y3QgdjRsMl9tMm1fY3R4CQkqbTJtX2N0eDsKKwlzdHJ1Y3QgYW1sX3ZkZWNfYWRhcHQJCSphZGFfY3R4OworCXN0cnVjdCBhbWxfdjRsMl92cHAJCSp2cHA7CisJY29uc3Qgc3RydWN0IHZkZWNfY29tbW9uX2lmCSpkZWNfaWY7CisJdWxvbmcJCQkJZHJ2X2hhbmRsZTsKKwlzdHJ1Y3QgdjRsMl9maAkJCWZoOworCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlcgljdHJsX2hkbDsKKwlzcGlubG9ja190CQkJc2xvY2s7CisJc3BpbmxvY2tfdAkJCXRzcGxvY2s7CisJc3RydWN0IGFtbF92aWRlb19kZWNfYnVmCSplbXB0eV9mbHVzaF9idWY7CisJc3RydWN0IGxpc3RfaGVhZAkJbGlzdDsKKworCXN0cnVjdCBhbWxfcV9kYXRhCQlxX2RhdGFbMl07CisJd2FpdF9xdWV1ZV9oZWFkX3QJCXF1ZXVlOworCXN0cnVjdCBtdXRleAkJCXN0YXRlX2xvY2s7CisJZW51bSBhbWxfaW5zdGFuY2Vfc3RhdGUJCXN0YXRlOworCXN0cnVjdCB3b3JrX3N0cnVjdAkJZGVjb2RlX3dvcms7CisJYm9vbAkJCQlvdXRwdXRfdGhyZWFkX3JlYWR5OworCXN0cnVjdCB2NGxfYnVmZl9wb29sCQljYXBfcG9vbDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQl2ZGVjX3RocmVhZF9saXN0OworCisJaW50CQkJCWRwYl9zaXplOworCWludAkJCQl2cHBfc2l6ZTsKKwlpbnQJCQkJZ2UyZF9zaXplOworCWJvb2wJCQkJcGFyYW1fc2V0c19mcm9tX3Vjb2RlOworCWJvb2wJCQkJdjRsX2NvZGVjX2RwYl9yZWFkeTsKKwlib29sCQkJCXY0bF9yZXNvbHV0aW9uX2NoYW5nZTsKKwlzdHJ1Y3QgY29tcGxldGlvbgkJY29tcDsKKwlzdHJ1Y3QgdjRsMl9jb25maWdfcGFybQkJY29uZmlnOworCXN0cnVjdCB2ZGVjX3BpY19pbmZvCQlwaWNpbmZvOworCXN0cnVjdCB2ZGVjX3BpY19pbmZvCQlsYXN0X2RlY29kZWRfcGljaW5mbzsKKwllbnVtIHY0bDJfY29sb3JzcGFjZQkJY29sb3JzcGFjZTsKKwllbnVtIHY0bDJfeWNiY3JfZW5jb2RpbmcJeWNiY3JfZW5jOworCWVudW0gdjRsMl9xdWFudGl6YXRpb24JCXF1YW50aXphdGlvbjsKKwllbnVtIHY0bDJfeGZlcl9mdW5jCQl4ZmVyX2Z1bmM7CisJdTMyCQkJCWNhcF9waXhfZm10OworCXUzMgkJCQlvdXRwdXRfcGl4X2ZtdDsKKworCWJvb2wJCQkJaGFzX3JlY2VpdmVfZW9zOworCWJvb2wJCQkJaXNfZHJtX21vZGU7CisJYm9vbAkJCQlvdXRwdXRfZG1hX21vZGU7CisJYm9vbAkJCQlpc19zdHJlYW1fb2ZmOworCWJvb2wJCQkJaXNfb3V0X3N0cmVhbV9vZmY7CisJYm9vbAkJCQlyZWNlaXZlX2NtZF9zdG9wOworCWludAkJCQlyZXNldF9mbGFnOworCWludAkJCQlkZWNvZGVkX2ZyYW1lX2NudDsKKwlpbnQJCQkJYnVmX3VzZWRfY291bnQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QJCXdxLCBjYXBfd3EsIHBvc3RfZG9uZV93cTsKKwlzdHJ1Y3QgbXV0ZXgJCQljYXB0dXJlX2J1ZmZlcl9sb2NrOworCXNwaW5sb2NrX3QJCQlkbWFidWZmX3JlY3ljbGVfbG9jazsKKwlzdHJ1Y3QgbXV0ZXgJCQlidWZmX2RvbmVfbG9jazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCWRtYWJ1ZmZfcmVjeWNsZV93b3JrOworCURFQ0xBUkVfS0ZJRk8oZG1hYnVmZl9yZWN5Y2xlLCBzdHJ1Y3QgdmIyX3Y0bDJfYnVmZmVyICosIDMyKTsKKwlERUNMQVJFX0tGSUZPKGNhcHR1cmVfYnVmZmVyLCBzdHJ1Y3QgdmIyX3Y0bDJfYnVmZmVyICosIDMyKTsKKworCS8qIGNvbXByZXNzZWQgYnVmZmVyIHN1cHBvcnQgKi8KKwl2b2lkCQkJCSpibW11X2JveDsKKwl2b2lkCQkJCSptbXVfYm94OworCXN0cnVjdCBrcmVmCQkJYm94X3JlZjsKKwlzdHJ1Y3QgdmRlY19jb21wX2J1Zl9pbmZvCWNvbXBfaW5mbzsKKwlzdHJ1Y3QgaW50ZXJuYWxfY29tcF9idWYJKmNvbXBfYnVmczsKKwlzdHJ1Y3QgdXZtX2hvb2tfbW9kX2luZm8JKnV2bV9wcm94eTsKKwlzdHJ1Y3QgbXV0ZXgJCQljb21wX2xvY2s7CisKKwlzdHJ1Y3QgYW1sX2ZiX29wcwkJZmJfb3BzOworCXVsb25nCQkJCXRva2VuX3RhYmxlWzMyXTsKKworCXN0cnVjdCBhbWxfZmJfbWFwX3RhYmxlCQlmYl9tYXBbMzJdOworCXN0cnVjdCBhbWxfdnBwX2NmZ19pbmZvcyAJdnBwX2NmZzsKKwl2b2lkICgqdmRlY19waWNfaW5mb191cGRhdGUpKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4KTsKKwlib29sCQkJCXZwcF9pc19uZWVkOworCXN0cnVjdCBsaXN0X2hlYWQJCXRhc2tfY2hhaW5fcG9vbDsKKwlzdHJ1Y3QgbWV0YV9pbmZvCQltZXRhX2luZm9zOworCXN0cnVjdCB2ZGVjX3N5bmMJCSpzeW5jOworCXUzMiAgICAgICAgICAgICAJCWludGVybmFsX2R3X3NjYWxlOworCisJLyogZ2UyZCBmaWVsZC4gKi8KKwlzdHJ1Y3QgYW1sX3Y0bDJfZ2UyZAkJKmdlMmQ7CisJc3RydWN0IGFtbF9nZTJkX2NmZ19pbmZvcyAJZ2UyZF9jZmc7CisJYm9vbAkJCQlnZTJkX2lzX25lZWQ7CisKKwlib29sIAkJCQlzZWNvbmRfZmllbGRfcHRzX21vZGU7CisJc3RydWN0IGF1eF9pbmZvCQkJYXV4X2luZm9zOworCXUzMgkJCQlpbmRleF9kaXNwOworCWJvb2wJCQkJcG9zdF90b191cHBlcl9kb25lOworCWJvb2wJCQlmaWxtX2dyYWluX3ByZXNlbnQ7CisJdm9pZAkJCSpibW11X2JveF9kdzsKKwl2b2lkCQkJKm1tdV9ib3hfZHc7Cit9OworCisvKioKKyAqIHN0cnVjdCBhbWxfdmNvZGVjX2RldiAtIGRyaXZlciBkYXRhLgorICogQHY0bDJfZGV2CQk6IFY0TDIgZGV2aWNlIHRvIHJlZ2lzdGVyIHZpZGVvIGRldmljZXMgZm9yLgorICogQHZmZF9kZWMJCTogVmlkZW8gZGV2aWNlIGZvciBkZWNvZGVyLgorICogQHBsYXRfZGV2CQk6IHBsYXRmb3JtIGRldmljZS4KKyAqIEBtMm1fZGV2X2RlYwkJOiBtMm0gZGV2aWNlIGZvciBkZWNvZGVyLgorICogQGN1cnJfY3R4CQk6IFRoZSBjb250ZXh0IHRoYXQgaXMgd2FpdGluZyBmb3IgY29kZWMgaGFyZHdhcmUuCisgKiBAaWRfY291bnRlcgkJOiB1c2VkIHRvIGlkZW50aWZ5IGN1cnJlbnQgb3BlbmVkIGluc3RhbmNlLgorICogQGRlY19jYXBhYmlsaXR5CTogdXNlZCB0byBpZGVudGlmeSBkZWNvZGUgY2FwYWJpbGl0eSwgZXg6IDRrCisgKiBAZGVjb2RlX3dvcmtxdWV1ZQk6IHRoZSB3b3JrZXIgdXNlZCB0byBvdXRwdXQgYnVmZmVyIHNjaGVkdWxlLgorICogQGN0eF9saXN0CQk6IGxpc3Qgb2Ygc3RydWN0IGFtbF92Y29kZWNfY3R4LgorICogQGlycWxvY2sJCTogcHJvdGVjdCBkYXRhIGFjY2VzcyBieSBpcnEgaGFuZGxlciBhbmQgd29yayB0aHJlYWQuCisgKiBAZGV2X211dGV4CQk6IHZpZGVvX2RldmljZSBsb2NrLgorICogQGRlY19tdXRleAkJOiBkZWNvZGVyIGhhcmR3YXJlIGxvY2suCisgKiBAcXVldWUJCTogd2FpdHF1ZXVlIGZvciB3YWl0aW5nIGZvciBjb21wbGV0aW9uIG9mIGRldmljZSBjb21tYW5kcy4KKyAqIEB2cHBfY291bnQJCTogY291bnQgdGhlIG51bWJlciBvZiBvcGVuIHZwcC4KKyAqIEB2NGxkZWNfY2xhc3MJOiBjcmVhdCBjbGFzcyBzeXNmcyB1ZXNkIHRvIHNob3cgc29tZSBpbmZvcm1hdGlvbi4KKyAqLworc3RydWN0IGFtbF92Y29kZWNfZGV2IHsKKwlzdHJ1Y3QgdjRsMl9kZXZpY2UJCXY0bDJfZGV2OworCXN0cnVjdCB2aWRlb19kZXZpY2UJCSp2ZmRfZGVjOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJCSpwbGF0X2RldjsKKwlzdHJ1Y3QgdjRsMl9tMm1fZGV2CQkqbTJtX2Rldl9kZWM7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4CQkqY3Vycl9jdHg7CisJdWxvbmcJCQkJaWRfY291bnRlcjsKKwl1MzIJCQkJZGVjX2NhcGFiaWxpdHk7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJCSpkZWNvZGVfd29ya3F1ZXVlOworCXN0cnVjdCBsaXN0X2hlYWQJCWN0eF9saXN0OworCXN0cnVjdCBmaWxlCQkJKmZpbHA7CisJc3BpbmxvY2tfdAkJCWlycWxvY2s7CisJc3RydWN0IG11dGV4CQkJZGV2X211dGV4OworCXN0cnVjdCBtdXRleAkJCWRlY19tdXRleDsKKwl3YWl0X3F1ZXVlX2hlYWRfdAkJcXVldWU7CisJYXRvbWljX3QJCQl2cHBfY291bnQ7CisJc3RydWN0IGNsYXNzCQkJdjRsZGVjX2NsYXNzOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmZoX3RvX2N0eChzdHJ1Y3QgdjRsMl9maCAqZmgpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihmaCwgc3RydWN0IGFtbF92Y29kZWNfY3R4LCBmaCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHJsX3RvX2N0eChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQoreworCXJldHVybiBjb250YWluZXJfb2YoY3RybC0+aGFuZGxlciwgc3RydWN0IGFtbF92Y29kZWNfY3R4LCBjdHJsX2hkbCk7Cit9CisKK3ZvaWQgYW1sX3RocmVhZF9jYXB0dXJlX3dvcmtlcihzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCk7Cit2b2lkIGFtbF90aHJlYWRfcG9zdF90YXNrKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4LCBlbnVtIGFtbF90aHJlYWRfdHlwZSB0eXBlKTsKK2ludCBhbWxfdGhyZWFkX3N0YXJ0KHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4LCBhbWxfdGhyZWFkX2Z1bmMgZnVuYywKKwllbnVtIGFtbF90aHJlYWRfdHlwZSB0eXBlLCBjb25zdCBjaGFyICp0aHJlYWRfbmFtZSk7Cit2b2lkIGFtbF90aHJlYWRfc3RvcChzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCk7CisKKyNlbmRpZiAvKiBfQU1MX1ZDT0RFQ19EUlZfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2FtbF92Y29kZWNfZ2UyZC5jIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvYW1sX3Zjb2RlY19nZTJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQzMzFlZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2FtbF92Y29kZWNfZ2UyZC5jCkBAIC0wLDAgKzEsOTY4IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMjAgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorKiBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqCisqIERlc2NyaXB0aW9uOgorKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC9jbG9jay5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvc2NoZWQvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lc29uX3V2bV9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9nZTJkL2dlMmQuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NhbnZhcy9jYW52YXNfbWdyLmg+CisKKyNpbmNsdWRlICIuLi9jb21tb24vY2hpcHMvZGVjb2Rlcl9jcHVfdmVyX2luZm8uaCIKKyNpbmNsdWRlICJhbWxfdmNvZGVjX2dlMmQuaCIKKyNpbmNsdWRlICJhbWxfdmNvZGVjX2FkYXB0LmgiCisjaW5jbHVkZSAidmRlY19kcnZfaWYuaCIKKworI2RlZmluZSBLRVJORUxfQVRSQUNFX1RBRyBLRVJORUxfQVRSQUNFX1RBR19WNEwyCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL21lc29uX2F0cmFjZS5oPgorCisjZGVmaW5lIEdFMkRfQlVGX0dFVF9JRFgoZ2UyZF9idWYpIChnZTJkX2J1Zi0+YW1sX2J1Zi0+dmIudmIyX2J1Zi5pbmRleCkKKyNkZWZpbmUgSU5QVVRfUE9SVCAwCisjZGVmaW5lIE9VVFBVVF9QT1JUIDEKKworZXh0ZXJuIGludCBkdW1wX2dlMmRfaW5wdXQ7CitleHRlcm4gaW50IGdlMmRfYnlwYXNzX2ZyYW1lczsKKworZW51bSBHRTJEX0ZMQUcgeworCUdFMkRfRkxBR19QCQk9IDB4MSwKKwlHRTJEX0ZMQUdfSQkJPSAweDIsCisJR0UyRF9GTEFHX0VPUwkJPSAweDQsCisJR0UyRF9GTEFHX0JVRl9CWV9QQVNTCT0gMHg4LAorCUdFMkRfRkxBR19NQVgJCT0gMHg3RkZGRkZGRiwKK307CisKK2VudW0gdmlkZW9jb21fc291cmNlX3R5cGUgeworCURFQ09ERVJfOEJJVF9OT1JNQUwgPSAwLAorCURFQ09ERVJfOEJJVF9CT1RUT00sCisJREVDT0RFUl84QklUX1RPUCwKKwlERUNPREVSXzEwQklUX05PUk1BTCwKKwlERUNPREVSXzEwQklUX0JPVFRPTSwKKwlERUNPREVSXzEwQklUX1RPUAorfTsKKworI2lmbmRlZiAgQ09ORklHX0FNTE9HSUNfTUVESUFfR0UyRAoraW5saW5lIHZvaWQgc3RyZXRjaGJsdF9ub2FscGhhKHN0cnVjdCBnZTJkX2NvbnRleHRfcyAqd3EsCisJCWludCBzcmNfeCwgaW50IHNyY195LCBpbnQgc3JjX3csIGludCBzcmNfaCwKKwkJaW50IGRzdF94LCBpbnQgZHN0X3ksIGludCBkc3RfdywgaW50IGRzdF9oKSB7IHJldHVybjsgfQoraW5saW5lIGludCBnZTJkX2NvbnRleHRfY29uZmlnX2V4KHN0cnVjdCBnZTJkX2NvbnRleHRfcyAqY29udGV4dCwKKwkJc3RydWN0IGNvbmZpZ19wYXJhX2V4X3MgKmdlMmRfY29uZmlnKSB7IHJldHVybiAtMTsgfQoraW5saW5lIHN0cnVjdCBnZTJkX2NvbnRleHRfcyAqY3JlYXRlX2dlMmRfd29ya19xdWV1ZSh2b2lkKSB7IHJldHVybiBOVUxMOyB9CitpbmxpbmUgaW50IGRlc3Ryb3lfZ2UyZF93b3JrX3F1ZXVlKHN0cnVjdCBnZTJkX2NvbnRleHRfcyAqZ2UyZF93b3JrX3F1ZXVlKSB7IHJldHVybiAtMTsgfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZ2V0X3NvdXJjZV90eXBlKHN0cnVjdCB2ZnJhbWVfcyAqdmYpCit7CisJZW51bSB2aWRlb2NvbV9zb3VyY2VfdHlwZSByZXQ7CisJaW50IGludGVybGFjZV9tb2RlOworCisJaW50ZXJsYWNlX21vZGUgPSB2Zi0+dHlwZSAmIFZJRFRZUEVfVFlQRU1BU0s7CisKKwlpZiAoKHZmLT5iaXRkZXB0aCAmIEJJVERFUFRIX1kxMCkgICYmCisJCSghKHZmLT50eXBlICYgVklEVFlQRV9DT01QUkVTUykpICYmCisJCShnZXRfY3B1X3R5cGUoKSA+PSBNRVNPTl9DUFVfTUFKT1JfSURfVFhMKSkgeworCQlpZiAoaW50ZXJsYWNlX21vZGUgPT0gVklEVFlQRV9JTlRFUkxBQ0VfVE9QKQorCQkJcmV0ID0gREVDT0RFUl8xMEJJVF9UT1A7CisJCWVsc2UgaWYgKGludGVybGFjZV9tb2RlID09IFZJRFRZUEVfSU5URVJMQUNFX0JPVFRPTSkKKwkJCXJldCA9IERFQ09ERVJfMTBCSVRfQk9UVE9NOworCQllbHNlCisJCQlyZXQgPSBERUNPREVSXzEwQklUX05PUk1BTDsKKwl9IGVsc2UgeworCQlpZiAoaW50ZXJsYWNlX21vZGUgPT0gVklEVFlQRV9JTlRFUkxBQ0VfVE9QKQorCQkJcmV0ID0gREVDT0RFUl84QklUX1RPUDsKKwkJZWxzZSBpZiAoaW50ZXJsYWNlX21vZGUgPT0gVklEVFlQRV9JTlRFUkxBQ0VfQk9UVE9NKQorCQkJcmV0ID0gREVDT0RFUl84QklUX0JPVFRPTTsKKwkJZWxzZQorCQkJcmV0ID0gREVDT0RFUl84QklUX05PUk1BTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdldF9pbnB1dF9mb3JtYXQoc3RydWN0IHZmcmFtZV9zICp2ZikKK3sKKwlpbnQgZm9ybWF0ID0gR0UyRF9GT1JNQVRfTTI0X1lVVjQyMDsKKwllbnVtIHZpZGVvY29tX3NvdXJjZV90eXBlIHNvdXJlX3R5cGU7CisKKwlzb3VyZV90eXBlID0gZ2V0X3NvdXJjZV90eXBlKHZmKTsKKworCXN3aXRjaCAoc291cmVfdHlwZSkgeworCWNhc2UgREVDT0RFUl84QklUX05PUk1BTDoKKwkJaWYgKHZmLT50eXBlICYgVklEVFlQRV9WSVVfNDIyKQorCQkJZm9ybWF0ID0gR0UyRF9GT1JNQVRfUzE2X1lVVjQyMjsKKwkJZWxzZSBpZiAodmYtPnR5cGUgJiBWSURUWVBFX1ZJVV9OVjIxKQorCQkJZm9ybWF0ID0gR0UyRF9GT1JNQVRfTTI0X05WMjE7CisJCWVsc2UgaWYgKHZmLT50eXBlICYgVklEVFlQRV9WSVVfTlYxMikKKwkJCWZvcm1hdCA9IEdFMkRfRk9STUFUX00yNF9OVjEyOworCQllbHNlIGlmICh2Zi0+dHlwZSAmIFZJRFRZUEVfVklVXzQ0NCkKKwkJCWZvcm1hdCA9IEdFMkRfRk9STUFUX1MyNF9ZVVY0NDQ7CisJCWVsc2UKKwkJCWZvcm1hdCA9IEdFMkRfRk9STUFUX00yNF9ZVVY0MjA7CisJCWJyZWFrOworCWNhc2UgREVDT0RFUl84QklUX0JPVFRPTToKKwkJaWYgKHZmLT50eXBlICYgVklEVFlQRV9WSVVfNDIyKQorCQkJZm9ybWF0ID0gR0UyRF9GT1JNQVRfUzE2X1lVVjQyMgorCQkJCXwgKEdFMkRfRk9STUFUX1MxNl9ZVVY0MjJCICYgKDMgPDwgMykpOworCQllbHNlIGlmICh2Zi0+dHlwZSAmIFZJRFRZUEVfVklVX05WMjEpCisJCQlmb3JtYXQgPSBHRTJEX0ZPUk1BVF9NMjRfTlYyMQorCQkJCXwgKEdFMkRfRk9STUFUX00yNF9OVjIxQiAmICgzIDw8IDMpKTsKKwkJZWxzZSBpZiAodmYtPnR5cGUgJiBWSURUWVBFX1ZJVV9OVjEyKQorCQkJZm9ybWF0ID0gR0UyRF9GT1JNQVRfTTI0X05WMTIKKwkJCQl8IChHRTJEX0ZPUk1BVF9NMjRfTlYxMkIgJiAoMyA8PCAzKSk7CisJCWVsc2UgaWYgKHZmLT50eXBlICYgVklEVFlQRV9WSVVfNDQ0KQorCQkJZm9ybWF0ID0gR0UyRF9GT1JNQVRfUzI0X1lVVjQ0NAorCQkJCXwgKEdFMkRfRk9STUFUX1MyNF9ZVVY0NDRCICYgKDMgPDwgMykpOworCQllbHNlCisJCQlmb3JtYXQgPSBHRTJEX0ZPUk1BVF9NMjRfWVVWNDIwCisJCQkJfCAoR0UyRF9GTVRfTTI0X1lVVjQyMEIgJiAoMyA8PCAzKSk7CisJCWJyZWFrOworCWNhc2UgREVDT0RFUl84QklUX1RPUDoKKwkJaWYgKHZmLT50eXBlICYgVklEVFlQRV9WSVVfNDIyKQorCQkJZm9ybWF0ID0gR0UyRF9GT1JNQVRfUzE2X1lVVjQyMgorCQkJCXwgKEdFMkRfRk9STUFUX1MxNl9ZVVY0MjJUICYgKDMgPDwgMykpOworCQllbHNlIGlmICh2Zi0+dHlwZSAmIFZJRFRZUEVfVklVX05WMjEpCisJCQlmb3JtYXQgPSBHRTJEX0ZPUk1BVF9NMjRfTlYyMQorCQkJCXwgKEdFMkRfRk9STUFUX00yNF9OVjIxVCAmICgzIDw8IDMpKTsKKwkJZWxzZSBpZiAodmYtPnR5cGUgJiBWSURUWVBFX1ZJVV9OVjEyKQorCQkJZm9ybWF0ID0gR0UyRF9GT1JNQVRfTTI0X05WMTIKKwkJCQl8IChHRTJEX0ZPUk1BVF9NMjRfTlYxMlQgJiAoMyA8PCAzKSk7CisJCWVsc2UgaWYgKHZmLT50eXBlICYgVklEVFlQRV9WSVVfNDQ0KQorCQkJZm9ybWF0ID0gR0UyRF9GT1JNQVRfUzI0X1lVVjQ0NAorCQkJCXwgKEdFMkRfRk9STUFUX1MyNF9ZVVY0NDRUICYgKDMgPDwgMykpOworCQllbHNlCisJCQlmb3JtYXQgPSBHRTJEX0ZPUk1BVF9NMjRfWVVWNDIwCisJCQkJfCAoR0UyRF9GTVRfTTI0X1lVVjQyMFQgJiAoMyA8PCAzKSk7CisJCWJyZWFrOworCWNhc2UgREVDT0RFUl8xMEJJVF9OT1JNQUw6CisJCWlmICh2Zi0+dHlwZSAmIFZJRFRZUEVfVklVXzQyMikgeworCQkJaWYgKHZmLT5iaXRkZXB0aCAmIEZVTExfUEFDS180MjJfTU9ERSkKKwkJCQlmb3JtYXQgPSBHRTJEX0ZPUk1BVF9TMTZfMTBCSVRfWVVWNDIyOworCQkJZWxzZQorCQkJCWZvcm1hdCA9IEdFMkRfRk9STUFUX1MxNl8xMkJJVF9ZVVY0MjI7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBERUNPREVSXzEwQklUX0JPVFRPTToKKwkJaWYgKHZmLT50eXBlICYgVklEVFlQRV9WSVVfNDIyKSB7CisJCQlpZiAodmYtPmJpdGRlcHRoICYgRlVMTF9QQUNLXzQyMl9NT0RFKQorCQkJCWZvcm1hdCA9IEdFMkRfRk9STUFUX1MxNl8xMEJJVF9ZVVY0MjIKKwkJCQkJfCAoR0UyRF9GT1JNQVRfUzE2XzEwQklUX1lVVjQyMkIKKwkJCQkJJiAoMyA8PCAzKSk7CisJCQllbHNlCisJCQkJZm9ybWF0ID0gR0UyRF9GT1JNQVRfUzE2XzEyQklUX1lVVjQyMgorCQkJCQl8IChHRTJEX0ZPUk1BVF9TMTZfMTJCSVRfWVVWNDIyQgorCQkJCQkmICgzIDw8IDMpKTsKKwkJfQorCQlicmVhazsKKwljYXNlIERFQ09ERVJfMTBCSVRfVE9QOgorCQlpZiAodmYtPnR5cGUgJiBWSURUWVBFX1ZJVV80MjIpIHsKKwkJCWlmICh2Zi0+Yml0ZGVwdGggJiBGVUxMX1BBQ0tfNDIyX01PREUpCisJCQkJZm9ybWF0ID0gR0UyRF9GT1JNQVRfUzE2XzEwQklUX1lVVjQyMgorCQkJCQl8IChHRTJEX0ZPUk1BVF9TMTZfMTBCSVRfWVVWNDIyVAorCQkJCQkmICgzIDw8IDMpKTsKKwkJCWVsc2UKKwkJCQlmb3JtYXQgPSBHRTJEX0ZPUk1BVF9TMTZfMTJCSVRfWVVWNDIyCisJCQkJCXwgKEdFMkRfRk9STUFUX1MxNl8xMkJJVF9ZVVY0MjJUCisJCQkJCSYgKDMgPDwgMykpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZvcm1hdCA9IEdFMkRfRk9STUFUX00yNF9ZVVY0MjA7CisJfQorCXJldHVybiBmb3JtYXQ7Cit9CisKK3N0YXRpYyBpbnQgdjRsX2dlMmRfZW1wdHlfaW5wdXRfZG9uZShzdHJ1Y3QgYW1sX3Y0bDJfZ2UyZF9idWYgKmJ1ZikKK3sKKwlzdHJ1Y3QgYW1sX3Y0bDJfZ2UyZCAqZ2UyZCA9IGJ1Zi0+Y2FsbGVyX2RhdGE7CisJc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKmZiID0gTlVMTDsKKwlib29sIGVvcyA9IGZhbHNlOworCisJaWYgKCFnZTJkIHx8ICFnZTJkLT5jdHgpIHsKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkiZmF0YWwgJXMgJWQgZ2UyZDolcHhcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIGdlMmQpOworCQlyZXR1cm4gLTE7CisJfQorCisJZmIgCT0gJmJ1Zi0+YW1sX2J1Zi0+ZnJhbWVfYnVmZmVyOworCWVvcwk9IChidWYtPmZsYWcgJiBHRTJEX0ZMQUdfRU9TKTsKKworCXY0bF9kYmcoZ2UyZC0+Y3R4LCBWNExfREVCVUdfR0UyRF9CVUZNR1IsCisJCSJnZTJkX2lucHV0IGRvbmU6IHZmOiVweCwgaWR4OiAlZCwgZmxhZyh2ZjoleCBnZTJkOiV4KSAlcywgdHM6JWxsZCwgIgorCQkiaW46JWQsIG91dDolZCwgdmY6JWQsIGluIGRvbmU6JWQsIG91dCBkb25lOiVkXG4iLAorCQlidWYtPnZmLAorCQlidWYtPnZmLT5pbmRleCwKKwkJYnVmLT52Zi0+ZmxhZywKKwkJYnVmLT5mbGFnLAorCQllb3MgPyAiZW9zIiA6ICIiLAorCQlidWYtPnZmLT50aW1lc3RhbXAsCisJCWtmaWZvX2xlbigmZ2UyZC0+aW5wdXQpLAorCQlrZmlmb19sZW4oJmdlMmQtPm91dHB1dCksCisJCWtmaWZvX2xlbigmZ2UyZC0+ZnJhbWUpLAorCQlrZmlmb19sZW4oJmdlMmQtPmluX2RvbmVfcSksCisJCWtmaWZvX2xlbigmZ2UyZC0+b3V0X2RvbmVfcSkpOworCisJZmItPnRhc2stPnJlY3ljbGUoZmItPnRhc2ssIFRBU0tfVFlQRV9HRTJEKTsKKworCWtmaWZvX3B1dCgmZ2UyZC0+aW5wdXQsIGJ1Zik7CisKKwlBVFJBQ0VfQ09VTlRFUigiVkNfSU5fR0UyRC0xLnJlY3ljbGUiLCBmYi0+YnVmX2lkeCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2NGxfZ2UyZF9maWxsX291dHB1dF9kb25lKHN0cnVjdCBhbWxfdjRsMl9nZTJkX2J1ZiAqYnVmKQoreworCXN0cnVjdCBhbWxfdjRsMl9nZTJkICpnZTJkID0gYnVmLT5jYWxsZXJfZGF0YTsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPSBOVUxMOworCWJvb2wgYnlwYXNzID0gZmFsc2U7CisJYm9vbCBlb3MgPSBmYWxzZTsKKworCWlmICghZ2UyZCB8fCAhZ2UyZC0+Y3R4KSB7CisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJImZhdGFsICVzICVkIGdlMmQ6JXB4XG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBnZTJkKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZiCT0gJmJ1Zi0+YW1sX2J1Zi0+ZnJhbWVfYnVmZmVyOworCWVvcwk9IChidWYtPmZsYWcgJiBHRTJEX0ZMQUdfRU9TKTsKKwlieXBhc3MJPSAoYnVmLT5mbGFnICYgR0UyRF9GTEFHX0JVRl9CWV9QQVNTKTsKKworCS8qIHJlY292ZXJ5IGZiIGhhbmRsZS4gKi8KKwlidWYtPnZmLT52NGxfbWVtX2hhbmRsZSA9ICh1bG9uZylmYjsKKworCWtmaWZvX3B1dCgmZ2UyZC0+b3V0X2RvbmVfcSwgYnVmKTsKKworCXY0bF9kYmcoZ2UyZC0+Y3R4LCBWNExfREVCVUdfR0UyRF9CVUZNR1IsCisJCSJnZTJkX291dHB1dCBkb25lOiB2ZjolcHgsIGlkeDolZCwgZmxhZyh2ZjoleCBnZTJkOiV4KSAlcywgdHM6JWxsZCwgIgorCQkiaW46JWQsIG91dDolZCwgdmY6JWQsIGluIGRvbmU6JWQsIG91dCBkb25lOiVkLCB3eGg6JXV4JXVcbiIsCisJCWJ1Zi0+dmYsCisJCWJ1Zi0+dmYtPmluZGV4LAorCQlidWYtPnZmLT5mbGFnLAorCQlidWYtPmZsYWcsCisJCWVvcyA/ICJlb3MiIDogIiIsCisJCWJ1Zi0+dmYtPnRpbWVzdGFtcCwKKwkJa2ZpZm9fbGVuKCZnZTJkLT5pbnB1dCksCisJCWtmaWZvX2xlbigmZ2UyZC0+b3V0cHV0KSwKKwkJa2ZpZm9fbGVuKCZnZTJkLT5mcmFtZSksCisJCWtmaWZvX2xlbigmZ2UyZC0+aW5fZG9uZV9xKSwKKwkJa2ZpZm9fbGVuKCZnZTJkLT5vdXRfZG9uZV9xKSwKKwkJYnVmLT52Zi0+d2lkdGgsIGJ1Zi0+dmYtPmhlaWdodCk7CisKKwlBVFJBQ0VfQ09VTlRFUigiVkNfT1VUX0dFMkQtMi5zdWJtaXQiLCBmYi0+YnVmX2lkeCk7CisKKwlmYi0+dGFzay0+c3VibWl0KGZiLT50YXNrLCBUQVNLX1RZUEVfR0UyRCk7CisKKwlnZTJkLT5vdXRfbnVtW09VVFBVVF9QT1JUXSsrOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdlMmRfdmZfZ2V0KHZvaWQgKmNhbGxlciwgc3RydWN0IHZmcmFtZV9zICoqdmZfb3V0KQoreworCXN0cnVjdCBhbWxfdjRsMl9nZTJkICpnZTJkID0gKHN0cnVjdCBhbWxfdjRsMl9nZTJkICopY2FsbGVyOworCXN0cnVjdCBhbWxfdjRsMl9nZTJkX2J1ZiAqYnVmID0gTlVMTDsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPSBOVUxMOworCXN0cnVjdCB2ZnJhbWVfcyAqdmYgPSBOVUxMOworCWJvb2wgYnlwYXNzID0gZmFsc2U7CisJYm9vbCBlb3MgPSBmYWxzZTsKKworCWlmICghZ2UyZCB8fCAhZ2UyZC0+Y3R4KSB7CisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJImZhdGFsICVzICVkIGdlMmQ6JXB4XG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBnZTJkKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChrZmlmb19nZXQoJmdlMmQtPm91dF9kb25lX3EsICZidWYpKSB7CisJCWZiCT0gJmJ1Zi0+YW1sX2J1Zi0+ZnJhbWVfYnVmZmVyOworCQllb3MJPSAoYnVmLT5mbGFnICYgR0UyRF9GTEFHX0VPUyk7CisJCWJ5cGFzcwk9IChidWYtPmZsYWcgJiBHRTJEX0ZMQUdfQlVGX0JZX1BBU1MpOworCQl2Zgk9IGJ1Zi0+dmY7CisKKwkJaWYgKGVvcykgeworCQkJdjRsX2RiZyhnZTJkLT5jdHgsIFY0TF9ERUJVR19HRTJEX0RFVEFJTCwKKwkJCQkiJXMgJWQgZ290IGVvc1xuIiwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9WNExfRU9TOworCQkJdmYtPmZsYWcgPSBWRlJBTUVfRkxBR19FTVBUWV9GUkFNRV9WNEw7CisJCX0KKworCQkqdmZfb3V0ID0gdmY7CisKKwkJQVRSQUNFX0NPVU5URVIoIlZDX09VVF9HRTJELTMudmZfZ2V0IiwgZmItPmJ1Zl9pZHgpOworCisJCXY0bF9kYmcoZ2UyZC0+Y3R4LCBWNExfREVCVUdfR0UyRF9CVUZNR1IsCisJCQkiJXM6IHZmOiVweCwgaW5kZXg6JWQsIGZsYWcodmY6JXggZ2UyZDoleCksIHRzOiVsbGQsIHR5cGU6JXgsIHd4aDoldXgldVxuIiwKKwkJCV9fZnVuY19fLCB2ZiwKKwkJCXZmLT5pbmRleCwKKwkJCXZmLT5mbGFnLAorCQkJYnVmLT5mbGFnLAorCQkJdmYtPnRpbWVzdGFtcCwgdmYtPnR5cGUsIHZmLT53aWR0aCwgdmYtPmhlaWdodCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBnZTJkX3ZmX3B1dCh2b2lkICpjYWxsZXIsIHN0cnVjdCB2ZnJhbWVfcyAqdmYpCit7CisJc3RydWN0IGFtbF92NGwyX2dlMmQgKmdlMmQgPSAoc3RydWN0IGFtbF92NGwyX2dlMmQgKiljYWxsZXI7CisJc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKmZiID0gTlVMTDsKKwlzdHJ1Y3QgYW1sX3ZpZGVvX2RlY19idWYgKmFtbF9idWYgPSBOVUxMOworCXN0cnVjdCBhbWxfdjRsMl9nZTJkX2J1ZiAqYnVmID0gTlVMTDsKKwlib29sIGJ5cGFzcyA9IGZhbHNlOworCWJvb2wgZW9zID0gZmFsc2U7CisKKwlmYgk9IChzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqKSB2Zi0+djRsX21lbV9oYW5kbGU7CisJYW1sX2J1Zgk9IGNvbnRhaW5lcl9vZihmYiwgc3RydWN0IGFtbF92aWRlb19kZWNfYnVmLCBmcmFtZV9idWZmZXIpOworCWJ1Zgk9IChzdHJ1Y3QgYW1sX3Y0bDJfZ2UyZF9idWYgKikgYW1sX2J1Zi0+Z2UyZF9idWZfaGFuZGxlOworCWVvcwk9IChidWYtPmZsYWcgJiBHRTJEX0ZMQUdfRU9TKTsKKwlieXBhc3MJPSAoYnVmLT5mbGFnICYgR0UyRF9GTEFHX0JVRl9CWV9QQVNTKTsKKworCXY0bF9kYmcoZ2UyZC0+Y3R4LCBWNExfREVCVUdfR0UyRF9CVUZNR1IsCisJCSIlczogdmY6JXB4LCBpbmRleDolZCwgZmxhZyh2ZjoleCBnZTJkOiV4KSwgdHM6JWxsZFxuIiwKKwkJX19mdW5jX18sIHZmLAorCQl2Zi0+aW5kZXgsCisJCXZmLT5mbGFnLAorCQlidWYtPmZsYWcsCisJCXZmLT50aW1lc3RhbXApOworCisJQVRSQUNFX0NPVU5URVIoIlZDX0lOX0dFMkQtMC52Zl9wdXQiLCBmYi0+YnVmX2lkeCk7CisKKwltdXRleF9sb2NrKCZnZTJkLT5vdXRwdXRfbG9jayk7CisJa2ZpZm9fcHV0KCZnZTJkLT5mcmFtZSwgdmYpOworCWtmaWZvX3B1dCgmZ2UyZC0+b3V0cHV0LCBidWYpOworCW11dGV4X3VubG9jaygmZ2UyZC0+b3V0cHV0X2xvY2spOworCXVwKCZnZTJkLT5zZW1fb3V0KTsKK30KKworc3RhdGljIGludCBhbWxfdjRsMl9nZTJkX3RocmVhZCh2b2lkKiBwYXJhbSkKK3sKKwlzdHJ1Y3QgYW1sX3Y0bDJfZ2UyZCogZ2UyZCA9IHBhcmFtOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gZ2UyZC0+Y3R4OworCXN0cnVjdCBjb25maWdfcGFyYV9leF9zIGdlMmRfY29uZmlnOworCXUzMiBzcmNfZm10ID0gMCwgZHN0X2ZtdCA9IDA7CisJc3RydWN0IGNhbnZhc19zIGNkOworCXVsb25nIHN0YXJ0X3RpbWU7CisKKwl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0dFMkRfREVUQUlMLCAiZW50ZXIgZ2UyZCB0aHJlYWRcbiIpOworCXdoaWxlIChnZTJkLT5ydW5uaW5nKSB7CisJCXN0cnVjdCBhbWxfdjRsMl9nZTJkX2J1ZiAqaW5fYnVmOworCQlzdHJ1Y3QgYW1sX3Y0bDJfZ2UyZF9idWYgKm91dF9idWYgPSBOVUxMOworCQlzdHJ1Y3QgdmZyYW1lX3MgKnZmX291dCA9IE5VTEw7CisJCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYjsKKworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZnZTJkLT5zZW1faW4pKQorCQkJZ290byBleGl0OworcmV0cnk6CisJCWlmICghZ2UyZC0+cnVubmluZykKKwkJCWJyZWFrOworCisJCWlmIChrZmlmb19pc19lbXB0eSgmZ2UyZC0+b3V0cHV0KSkgeworCQkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZ2UyZC0+c2VtX291dCkpCisJCQkJZ290byBleGl0OworCQkJZ290byByZXRyeTsKKwkJfQorCisJCW11dGV4X2xvY2soJmdlMmQtPm91dHB1dF9sb2NrKTsKKwkJaWYgKCFrZmlmb19nZXQoJmdlMmQtPm91dHB1dCwgJm91dF9idWYpKSB7CisJCQltdXRleF91bmxvY2soJmdlMmQtPm91dHB1dF9sb2NrKTsKKwkJCXY0bF9kYmcoY3R4LCAwLCAiZ2UyZCBjYW4gbm90IGdldCBvdXRwdXRcbiIpOworCQkJZ290byBleGl0OworCQl9CisJCW11dGV4X3VubG9jaygmZ2UyZC0+b3V0cHV0X2xvY2spOworCisJCS8qIGJpbmQgdjRsMiBidWZmZXJzICovCisJCWlmICghb3V0X2J1Zi0+YW1sX2J1ZikgeworCQkJc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKm91dDsKKworCQkJaWYgKCFjdHgtPmZiX29wcy5xdWVyeSgmY3R4LT5mYl9vcHMsICZnZTJkLT5mYl90b2tlbikpIHsKKwkJCQl1c2xlZXBfcmFuZ2UoNTAwLCA1NTApOworCQkJCW11dGV4X2xvY2soJmdlMmQtPm91dHB1dF9sb2NrKTsKKwkJCQlrZmlmb19wdXQoJmdlMmQtPm91dHB1dCwgb3V0X2J1Zik7CisJCQkJbXV0ZXhfdW5sb2NrKCZnZTJkLT5vdXRwdXRfbG9jayk7CisJCQkJZ290byByZXRyeTsKKwkJCX0KKworCQkJaWYgKGN0eC0+ZmJfb3BzLmFsbG9jKCZjdHgtPmZiX29wcywgZ2UyZC0+ZmJfdG9rZW4sICZvdXQsIEFNTF9GQl9SRVFfR0UyRCkpIHsKKwkJCQl1c2xlZXBfcmFuZ2UoNTAwMCwgNTUwMCk7CisJCQkJbXV0ZXhfbG9jaygmZ2UyZC0+b3V0cHV0X2xvY2spOworCQkJCWtmaWZvX3B1dCgmZ2UyZC0+b3V0cHV0LCBvdXRfYnVmKTsKKwkJCQltdXRleF91bmxvY2soJmdlMmQtPm91dHB1dF9sb2NrKTsKKwkJCQlnb3RvIHJldHJ5OworCQkJfQorCisJCQlvdXRfYnVmLT5hbWxfYnVmID0gY29udGFpbmVyX29mKG91dCwKKwkJCQlzdHJ1Y3QgYW1sX3ZpZGVvX2RlY19idWYsIGZyYW1lX2J1ZmZlcik7CisJCQlvdXRfYnVmLT5hbWxfYnVmLT5nZTJkX2J1Zl9oYW5kbGUgPSAodWxvbmcpIG91dF9idWY7CisJCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0dFMkRfQlVGTUdSLAorCQkJCSJnZTJkIGJpbmQgYnVmOiVkIHRvIGdlMmRfYnVmOiVweFxuIiwKKwkJCQlHRTJEX0JVRl9HRVRfSURYKG91dF9idWYpLCBvdXRfYnVmKTsKKworCQkJb3V0LT5tLm1lbVswXS5ieXRlc191c2VkID0gb3V0LT5tLm1lbVswXS5zaXplOworCQkJb3V0LT5tLm1lbVsxXS5ieXRlc191c2VkID0gb3V0LT5tLm1lbVsxXS5zaXplOworCQl9CisKKwkJLyogc2FmZSB0byBwb3AgaW5fYnVmICovCisJCWlmICgha2ZpZm9fZ2V0KCZnZTJkLT5pbl9kb25lX3EsICZpbl9idWYpKSB7CisJCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJCSJnZTJkIGNhbiBub3QgZ2V0IGlucHV0XG4iKTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCisJCW11dGV4X2xvY2soJmdlMmQtPm91dHB1dF9sb2NrKTsKKwkJaWYgKCFrZmlmb19nZXQoJmdlMmQtPmZyYW1lLCAmdmZfb3V0KSkgeworCQkJbXV0ZXhfdW5sb2NrKCZnZTJkLT5vdXRwdXRfbG9jayk7CisJCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJCSJnZTJkIGNhbiBub3QgZ2V0IGZyYW1lXG4iKTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCQltdXRleF91bmxvY2soJmdlMmQtPm91dHB1dF9sb2NrKTsKKworCQlmYiA9ICZvdXRfYnVmLT5hbWxfYnVmLT5mcmFtZV9idWZmZXI7CisJCWZiLT5zdGF0dXMgPSBGQl9TVF9HRTJEOworCisJCS8qIGZpbGwgb3V0cHV0IHZmcmFtZSBpbmZvcm1hdGlvbi4gKi8KKwkJbWVtY3B5KHZmX291dCwgaW5fYnVmLT52Ziwgc2l6ZW9mKCp2Zl9vdXQpKTsKKwkJbWVtY3B5KHZmX291dC0+Y2FudmFzMF9jb25maWcsCisJCQlpbl9idWYtPnZmLT5jYW52YXMwX2NvbmZpZywKKwkJCTIgKiBzaXplb2Yoc3RydWN0IGNhbnZhc19jb25maWdfcykpOworCisJCXZmX291dC0+Y2FudmFzMF9jb25maWdbMF0ucGh5X2FkZHIgPSBmYi0+bS5tZW1bMF0uYWRkcjsKKwkJaWYgKGZiLT5udW1fcGxhbmVzID09IDEpIHsKKwkJCXZmX291dC0+Y2FudmFzMF9jb25maWdbMV0ucGh5X2FkZHIgPQorCQkJCWZiLT5tLm1lbVswXS5hZGRyICsgZmItPm0ubWVtWzBdLm9mZnNldDsKKwkJCXZmX291dC0+Y2FudmFzMF9jb25maWdbMl0ucGh5X2FkZHIgPQorCQkJCWZiLT5tLm1lbVswXS5hZGRyICsgZmItPm0ubWVtWzBdLm9mZnNldAorCQkJCSsgKGZiLT5tLm1lbVswXS5vZmZzZXQgPj4gMik7CisJCX0gZWxzZSB7CisJCQl2Zl9vdXQtPmNhbnZhczBfY29uZmlnWzFdLnBoeV9hZGRyID0KKwkJCQlmYi0+bS5tZW1bMV0uYWRkcjsKKwkJCXZmX291dC0+Y2FudmFzMF9jb25maWdbMl0ucGh5X2FkZHIgPQorCQkJCWZiLT5tLm1lbVsyXS5hZGRyOworCQl9CisKKwkJLyogZmlsbCBvdXRidWYgcGFybXMuICovCisJCW91dF9idWYtPnZmCQk9IHZmX291dDsKKwkJb3V0X2J1Zi0+ZmxhZwkJPSAwOworCQlvdXRfYnVmLT5jYWxsZXJfZGF0YQk9IGdlMmQ7CisKKwkJLyogZmlsbCBpbmJ1ZiBwYXJtcy4gKi8KKwkJaW5fYnVmLT5jYWxsZXJfZGF0YQk9IGdlMmQ7CisKKwkJbWVtc2V0KCZnZTJkX2NvbmZpZywgMCwgc2l6ZW9mKGdlMmRfY29uZmlnKSk7CisKKwkJc3JjX2ZtdCA9IGdldF9pbnB1dF9mb3JtYXQoaW5fYnVmLT52Zik7CisJCWlmIChpbl9idWYtPnZmLT5jYW52YXMwX2NvbmZpZ1swXS5lbmRpYW4gPT0gNykKKwkJCXNyY19mbXQgfD0gR0UyRF9CSUdfRU5ESUFOOworCQllbHNlCisJCQlzcmNfZm10IHw9IEdFMkRfTElUVExFX0VORElBTjsKKworCQkvKiBuZWdvdGlhdGUgZm9ybWF0IG9mIGRlc3RpbmF0aW9uICovCisJCWRzdF9mbXQgPSBnZXRfaW5wdXRfZm9ybWF0KGluX2J1Zi0+dmYpOworCQlpZiAoZ2UyZC0+d29ya19tb2RlICYgR0UyRF9NT0RFX0NPTlZFUlRfTlYxMikKKwkJCWRzdF9mbXQgfD0gR0UyRF9GT1JNQVRfTTI0X05WMTI7CisJCWVsc2UgaWYgKGdlMmQtPndvcmtfbW9kZSAmIEdFMkRfTU9ERV9DT05WRVJUX05WMjEpCisJCQlkc3RfZm10IHw9IEdFMkRfRk9STUFUX00yNF9OVjIxOworCisJCWlmIChnZTJkLT53b3JrX21vZGUgJiBHRTJEX01PREVfQ09OVkVSVF9MRSkKKwkJCWRzdF9mbXQgfD0gR0UyRF9MSVRUTEVfRU5ESUFOOworCQllbHNlCisJCQlkc3RfZm10IHw9IEdFMkRfQklHX0VORElBTjsKKworCQlpZiAoKGRzdF9mbXQgJiBHRTJEX0NPTE9SX01BUF9NQVNLKSA9PSBHRTJEX0NPTE9SX01BUF9OVjEyKSB7CisJCQl2Zl9vdXQtPnR5cGUgfD0gVklEVFlQRV9WSVVfTlYxMjsKKwkJCXZmX291dC0+dHlwZSAmPSB+VklEVFlQRV9WSVVfTlYyMTsKKwkJfSBlbHNlIGlmICgoZHN0X2ZtdCAmIEdFMkRfQ09MT1JfTUFQX01BU0spID09IEdFMkRfQ09MT1JfTUFQX05WMjEpIHsKKwkJCXZmX291dC0+dHlwZSB8PSBWSURUWVBFX1ZJVV9OVjIxOworCQkJdmZfb3V0LT50eXBlICY9IH5WSURUWVBFX1ZJVV9OVjEyOworCQl9CisJCWlmICgoZHN0X2ZtdCAmIEdFMkRfRU5ESUFOX01BU0spID09IEdFMkRfTElUVExFX0VORElBTikgeworCQkJdmZfb3V0LT5jYW52YXMwX2NvbmZpZ1swXS5lbmRpYW4gPSAwOworCQkJdmZfb3V0LT5jYW52YXMwX2NvbmZpZ1sxXS5lbmRpYW4gPSAwOworCQkJdmZfb3V0LT5jYW52YXMwX2NvbmZpZ1syXS5lbmRpYW4gPSAwOworCQl9IGVsc2UgaWYgKChkc3RfZm10ICYgR0UyRF9FTkRJQU5fTUFTSykgPT0gR0UyRF9CSUdfRU5ESUFOKXsKKwkJCXZmX291dC0+Y2FudmFzMF9jb25maWdbMF0uZW5kaWFuID0gNzsKKwkJCXZmX291dC0+Y2FudmFzMF9jb25maWdbMV0uZW5kaWFuID0gNzsKKwkJCXZmX291dC0+Y2FudmFzMF9jb25maWdbMl0uZW5kaWFuID0gNzsKKwkJfQorCisJCXN0YXJ0X3RpbWUgPSBsb2NhbF9jbG9jaygpOworCQkvKiBzcmMgY2FudmFzIGNvbmZpZ3VyZS4gKi8KKwkJaWYgKChpbl9idWYtPnZmLT5jYW52YXMwQWRkciA9PSAwKSB8fAorCQkJKGluX2J1Zi0+dmYtPmNhbnZhczBBZGRyID09ICh1MzIpLTEpKSB7CisJCQljYW52YXNfY29uZmlnX2NvbmZpZyhnZTJkLT5zcmNfY2FudmFzX2lkWzBdLCAmaW5fYnVmLT52Zi0+Y2FudmFzMF9jb25maWdbMF0pOworCQkJY2FudmFzX2NvbmZpZ19jb25maWcoZ2UyZC0+c3JjX2NhbnZhc19pZFsxXSwgJmluX2J1Zi0+dmYtPmNhbnZhczBfY29uZmlnWzFdKTsKKwkJCWNhbnZhc19jb25maWdfY29uZmlnKGdlMmQtPnNyY19jYW52YXNfaWRbMl0sICZpbl9idWYtPnZmLT5jYW52YXMwX2NvbmZpZ1syXSk7CisJCQlnZTJkX2NvbmZpZy5zcmNfcGFyYS5jYW52YXNfaW5kZXggPQorCQkJCWdlMmQtPnNyY19jYW52YXNfaWRbMF0gfAorCQkJCWdlMmQtPnNyY19jYW52YXNfaWRbMV0gPDwgOCB8CisJCQkJZ2UyZC0+c3JjX2NhbnZhc19pZFsyXSA8PCAxNjsKKworCQkJZ2UyZF9jb25maWcuc3JjX3BsYW5lc1swXS5hZGRyID0KKwkJCQlpbl9idWYtPnZmLT5jYW52YXMwX2NvbmZpZ1swXS5waHlfYWRkcjsKKwkJCWdlMmRfY29uZmlnLnNyY19wbGFuZXNbMF0udyA9CisJCQkJaW5fYnVmLT52Zi0+Y2FudmFzMF9jb25maWdbMF0ud2lkdGg7CisJCQlnZTJkX2NvbmZpZy5zcmNfcGxhbmVzWzBdLmggPQorCQkJCWluX2J1Zi0+dmYtPmNhbnZhczBfY29uZmlnWzBdLmhlaWdodDsKKwkJCWdlMmRfY29uZmlnLnNyY19wbGFuZXNbMV0uYWRkciA9CisJCQkJaW5fYnVmLT52Zi0+Y2FudmFzMF9jb25maWdbMV0ucGh5X2FkZHI7CisJCQlnZTJkX2NvbmZpZy5zcmNfcGxhbmVzWzFdLncgPQorCQkJCWluX2J1Zi0+dmYtPmNhbnZhczBfY29uZmlnWzFdLndpZHRoOworCQkJZ2UyZF9jb25maWcuc3JjX3BsYW5lc1sxXS5oID0KKwkJCQlpbl9idWYtPnZmLT5jYW52YXMwX2NvbmZpZ1sxXS5oZWlnaHQ7CisJCQlnZTJkX2NvbmZpZy5zcmNfcGxhbmVzWzJdLmFkZHIgPQorCQkJCWluX2J1Zi0+dmYtPmNhbnZhczBfY29uZmlnWzJdLnBoeV9hZGRyOworCQkJZ2UyZF9jb25maWcuc3JjX3BsYW5lc1syXS53ID0KKwkJCQlpbl9idWYtPnZmLT5jYW52YXMwX2NvbmZpZ1syXS53aWR0aDsKKwkJCWdlMmRfY29uZmlnLnNyY19wbGFuZXNbMl0uaCA9CisJCQkJaW5fYnVmLT52Zi0+Y2FudmFzMF9jb25maWdbMl0uaGVpZ2h0OworCQl9IGVsc2UgeworCQkJZ2UyZF9jb25maWcuc3JjX3BhcmEuY2FudmFzX2luZGV4ID0gaW5fYnVmLT52Zi0+Y2FudmFzMEFkZHI7CisJCX0KKwkJZ2UyZF9jb25maWcuc3JjX3BhcmEubWVtX3R5cGUJPSBDQU5WQVNfVFlQRV9JTlZBTElEOworCQlnZTJkX2NvbmZpZy5zcmNfcGFyYS5mb3JtYXQJPSBzcmNfZm10OworCQlnZTJkX2NvbmZpZy5zcmNfcGFyYS5maWxsX2NvbG9yX2VuID0gMDsKKwkJZ2UyZF9jb25maWcuc3JjX3BhcmEuZmlsbF9tb2RlCT0gMDsKKwkJZ2UyZF9jb25maWcuc3JjX3BhcmEueF9yZXYJPSAwOworCQlnZTJkX2NvbmZpZy5zcmNfcGFyYS55X3Jldgk9IDA7CisJCWdlMmRfY29uZmlnLnNyY19wYXJhLmNvbG9yCT0gMHhmZmZmZmZmZjsKKwkJZ2UyZF9jb25maWcuc3JjX3BhcmEudG9wCT0gMDsKKwkJZ2UyZF9jb25maWcuc3JjX3BhcmEubGVmdAk9IDA7CisJCWdlMmRfY29uZmlnLnNyY19wYXJhLndpZHRoCT0gaW5fYnVmLT52Zi0+d2lkdGg7CisJCWlmIChpbl9idWYtPnZmLT50eXBlICYgVklEVFlQRV9JTlRFUkxBQ0UpCisJCQlnZTJkX2NvbmZpZy5zcmNfcGFyYS5oZWlnaHQgPSBpbl9idWYtPnZmLT5oZWlnaHQgPj4gMTsKKwkJZWxzZQorCQkJZ2UyZF9jb25maWcuc3JjX3BhcmEuaGVpZ2h0ID0gaW5fYnVmLT52Zi0+aGVpZ2h0OworCisJCS8qIGRzdCBjYW52YXMgY29uZmlndXJlLiAqLworCQljYW52YXNfY29uZmlnX2NvbmZpZyhnZTJkLT5kc3RfY2FudmFzX2lkWzBdLCAmdmZfb3V0LT5jYW52YXMwX2NvbmZpZ1swXSk7CisJCWlmICgoZ2UyZF9jb25maWcuc3JjX3BhcmEuZm9ybWF0ICYgMHhmZmZmZikgPT0gR0UyRF9GT1JNQVRfTTI0X1lVVjQyMCkgeworCQkJdmZfb3V0LT5jYW52YXMwX2NvbmZpZ1sxXS53aWR0aCA8PD0gMTsKKwkJfQorCQljYW52YXNfY29uZmlnX2NvbmZpZyhnZTJkLT5kc3RfY2FudmFzX2lkWzFdLCAmdmZfb3V0LT5jYW52YXMwX2NvbmZpZ1sxXSk7CisJCWNhbnZhc19jb25maWdfY29uZmlnKGdlMmQtPmRzdF9jYW52YXNfaWRbMl0sICZ2Zl9vdXQtPmNhbnZhczBfY29uZmlnWzJdKTsKKwkJZ2UyZF9jb25maWcuZHN0X3BhcmEuY2FudmFzX2luZGV4ID0KKwkJCWdlMmQtPmRzdF9jYW52YXNfaWRbMF0gfAorCQkJZ2UyZC0+ZHN0X2NhbnZhc19pZFsxXSA8PCA4OworCQljYW52YXNfcmVhZChnZTJkLT5kc3RfY2FudmFzX2lkWzBdLCAmY2QpOworCQlnZTJkX2NvbmZpZy5kc3RfcGxhbmVzWzBdLmFkZHIJPSBjZC5hZGRyOworCQlnZTJkX2NvbmZpZy5kc3RfcGxhbmVzWzBdLncJPSBjZC53aWR0aDsKKwkJZ2UyZF9jb25maWcuZHN0X3BsYW5lc1swXS5oCT0gY2QuaGVpZ2h0OworCQljYW52YXNfcmVhZChnZTJkLT5kc3RfY2FudmFzX2lkWzFdLCAmY2QpOworCQlnZTJkX2NvbmZpZy5kc3RfcGxhbmVzWzFdLmFkZHIJPSBjZC5hZGRyOworCQlnZTJkX2NvbmZpZy5kc3RfcGxhbmVzWzFdLncJPSBjZC53aWR0aDsKKwkJZ2UyZF9jb25maWcuZHN0X3BsYW5lc1sxXS5oCT0gY2QuaGVpZ2h0OworCisJCWdlMmRfY29uZmlnLmRzdF9wYXJhLmZvcm1hdAk9ICBkc3RfZm10OworCQlnZTJkX2NvbmZpZy5kc3RfcGFyYS53aWR0aAk9IGluX2J1Zi0+dmYtPndpZHRoOworCQlnZTJkX2NvbmZpZy5kc3RfcGFyYS5oZWlnaHQJPSBpbl9idWYtPnZmLT5oZWlnaHQ7CisJCWdlMmRfY29uZmlnLmRzdF9wYXJhLm1lbV90eXBlCT0gQ0FOVkFTX1RZUEVfSU5WQUxJRDsKKwkJZ2UyZF9jb25maWcuZHN0X3BhcmEuZmlsbF9jb2xvcl9lbiA9IDA7CisJCWdlMmRfY29uZmlnLmRzdF9wYXJhLmZpbGxfbW9kZQk9IDA7CisJCWdlMmRfY29uZmlnLmRzdF9wYXJhLnhfcmV2CT0gMDsKKwkJZ2UyZF9jb25maWcuZHN0X3BhcmEueV9yZXYJPSAwOworCQlnZTJkX2NvbmZpZy5kc3RfcGFyYS5jb2xvcgk9IDA7CisJCWdlMmRfY29uZmlnLmRzdF9wYXJhLnRvcAk9IDA7CisJCWdlMmRfY29uZmlnLmRzdF9wYXJhLmxlZnQJPSAwOworCisJCS8qIG90aGVyIGdlMmQgcGFyYW1ldGVycyBjb25maWd1cmUuICovCisJCWdlMmRfY29uZmlnLnNyY19rZXkua2V5X2VuYWJsZQk9IDA7CisJCWdlMmRfY29uZmlnLnNyY19rZXkua2V5X21hc2sJPSAwOworCQlnZTJkX2NvbmZpZy5zcmNfa2V5LmtleV9tb2RlCT0gMDsKKwkJZ2UyZF9jb25maWcuYWx1X2NvbnN0X2NvbG9yCT0gMDsKKwkJZ2UyZF9jb25maWcuYml0bWFza19lbgkJPSAwOworCQlnZTJkX2NvbmZpZy5zcmMxX2diX2FscGhhCT0gMDsKKwkJZ2UyZF9jb25maWcuZHN0X3h5X3N3YXAJCT0gMDsKKwkJZ2UyZF9jb25maWcuc3JjMl9wYXJhLm1lbV90eXBlCT0gQ0FOVkFTX1RZUEVfSU5WQUxJRDsKKworCQlBVFJBQ0VfQ09VTlRFUigiVkNfT1VUX0dFMkQtMS5oYW5kbGVfc3RhcnQiLAorCQkJaW5fYnVmLT5hbWxfYnVmLT5mcmFtZV9idWZmZXIuYnVmX2lkeCk7CisKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19HRTJEX0JVRk1HUiwKKwkJCSJnZTJkX2hhbmRsZSBzdGFydDogZGVjIHZmOiVweC8lZCwgZ2UyZCB2ZjolcHgvJWQsIGlwaHk6JWx4LyVseCAlZHglZCBvcGh5OiVseC8lbHggJWR4JWQsIHZmOiV1eCV1LCBmbXQoc3JjOiV4LCBkc3Q6JXgpLCAiCisJCQkiaW46JWQsIG91dDolZCwgdmY6JWQsIGluIGRvbmU6JWQsIG91dCBkb25lOiVkXG4iLAorCQkJaW5fYnVmLT52ZiwgaW5fYnVmLT52Zi0+aW5kZXgsCisJCQlvdXRfYnVmLT52ZiwgR0UyRF9CVUZfR0VUX0lEWChvdXRfYnVmKSwKKwkJCWluX2J1Zi0+dmYtPmNhbnZhczBfY29uZmlnWzBdLnBoeV9hZGRyLAorCQkJaW5fYnVmLT52Zi0+Y2FudmFzMF9jb25maWdbMV0ucGh5X2FkZHIsCisJCQlpbl9idWYtPnZmLT5jYW52YXMwX2NvbmZpZ1swXS53aWR0aCwKKwkJCWluX2J1Zi0+dmYtPmNhbnZhczBfY29uZmlnWzBdLmhlaWdodCwKKwkJCXZmX291dC0+Y2FudmFzMF9jb25maWdbMF0ucGh5X2FkZHIsCisJCQl2Zl9vdXQtPmNhbnZhczBfY29uZmlnWzFdLnBoeV9hZGRyLAorCQkJdmZfb3V0LT5jYW52YXMwX2NvbmZpZ1swXS53aWR0aCwKKwkJCXZmX291dC0+Y2FudmFzMF9jb25maWdbMF0uaGVpZ2h0LAorCQkJdmZfb3V0LT53aWR0aCwgdmZfb3V0LT5oZWlnaHQsCisJCQlzcmNfZm10LCBkc3RfZm10LAorCQkJa2ZpZm9fbGVuKCZnZTJkLT5pbnB1dCksCisJCQlrZmlmb19sZW4oJmdlMmQtPm91dHB1dCksCisJCQlrZmlmb19sZW4oJmdlMmQtPmZyYW1lKSwKKwkJCWtmaWZvX2xlbigmZ2UyZC0+aW5fZG9uZV9xKSwKKwkJCWtmaWZvX2xlbigmZ2UyZC0+b3V0X2RvbmVfcSkpOworCisJCWlmIChnZTJkX2NvbnRleHRfY29uZmlnX2V4KGdlMmQtPmdlMmRfY29udGV4dCwgJmdlMmRfY29uZmlnKSA8IDApIHsKKwkJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkJImdlMmRfY29udGV4dF9jb25maWdfZXggZXJyb3IuXG4iKTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCisJCWlmICghKGluX2J1Zi0+ZmxhZyAmIEdFMkRfRkxBR19FT1MpKSB7CisJCQlpZiAoaW5fYnVmLT52Zi0+dHlwZSAmIFZJRFRZUEVfSU5URVJMQUNFKSB7CisJCQkJc3RyZXRjaGJsdF9ub2FscGhhKGdlMmQtPmdlMmRfY29udGV4dCwKKwkJCQkJMCwgMCwgaW5fYnVmLT52Zi0+d2lkdGgsIGluX2J1Zi0+dmYtPmhlaWdodCAvIDIsCisJCQkJCTAsIDAsIGluX2J1Zi0+dmYtPndpZHRoLCBpbl9idWYtPnZmLT5oZWlnaHQpOworCQkJfSBlbHNlIHsKKwkJCQlzdHJldGNoYmx0X25vYWxwaGEoZ2UyZC0+Z2UyZF9jb250ZXh0LAorCQkJCQkwLCAwLCBpbl9idWYtPnZmLT53aWR0aCwgaW5fYnVmLT52Zi0+aGVpZ2h0LAorCQkJCQkwLCAwLCBpbl9idWYtPnZmLT53aWR0aCwgaW5fYnVmLT52Zi0+aGVpZ2h0KTsKKwkJCX0KKwkJfQorCisJCS8vcHJfaW5mbygiY29uc3VtZSB0aW1lICVkIHVzXG4iLCBkaXY2NF91NjQobG9jYWxfY2xvY2soKSAtIHN0YXJ0X3RpbWUsIDEwMDApKTsKKworCQl2NGxfZ2UyZF9maWxsX291dHB1dF9kb25lKG91dF9idWYpOworCQl2NGxfZ2UyZF9lbXB0eV9pbnB1dF9kb25lKGluX2J1Zik7CisKKwkJZ2UyZC0+aW5fbnVtW0lOUFVUX1BPUlRdKys7CisJCWdlMmQtPm91dF9udW1bSU5QVVRfUE9SVF0rKzsKKwl9CitleGl0OgorCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKKwl9CisKKwl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0dFMkRfREVUQUlMLCAiZXhpdCBnZTJkIHRocmVhZFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGFtbF92NGwyX2dlMmRfZ2V0X2J1Zl9udW0odTMyIG1vZGUpCit7CisJcmV0dXJuIDQ7Cit9CisKK2ludCBhbWxfdjRsMl9nZTJkX2luaXQoCisJCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4LAorCQlzdHJ1Y3QgYW1sX2dlMmRfY2ZnX2luZm9zICpjZmcsCisJCXN0cnVjdCBhbWxfdjRsMl9nZTJkKiogZ2UyZF9oYW5kbGUpCit7CisJc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtID0geyAuc2NoZWRfcHJpb3JpdHkgPSBNQVhfUlRfUFJJTyAtIDEgfTsKKwlzdHJ1Y3QgYW1sX3Y0bDJfZ2UyZCAqZ2UyZDsKKwl1MzIgd29ya19tb2RlID0gY2ZnLT5tb2RlOworCXUzMiBidWZfc2l6ZTsKKwlpbnQgaSwgcmV0OworCisJaWYgKCFjZmcgfHwgIWdlMmRfaGFuZGxlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWdlMmQgPSBremFsbG9jKHNpemVvZigqZ2UyZCksIEdGUF9LRVJORUwpOworCWlmICghZ2UyZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlnZTJkLT53b3JrX21vZGUgPSB3b3JrX21vZGU7CisKKwkvKiBkZWZhdWx0IGNvbnZlcnQgbGl0dGxlIGVuZGlhbi4gKi8KKwlpZiAoIWdlMmQtPndvcmtfbW9kZSkgeworCQlnZTJkLT53b3JrX21vZGUgPSBHRTJEX01PREVfQ09OVkVSVF9MRTsKKwl9CisKKwlnZTJkLT5nZTJkX2NvbnRleHQgPSBjcmVhdGVfZ2UyZF93b3JrX3F1ZXVlKCk7CisJaWYgKCFnZTJkLT5nZTJkX2NvbnRleHQpIHsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJnZTJkX2NyZWF0ZV9pbnN0YW5jZSBmYWlsXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlJTklUX0tGSUZPKGdlMmQtPmlucHV0KTsKKwlJTklUX0tGSUZPKGdlMmQtPm91dHB1dCk7CisJSU5JVF9LRklGTyhnZTJkLT5mcmFtZSk7CisJSU5JVF9LRklGTyhnZTJkLT5vdXRfZG9uZV9xKTsKKwlJTklUX0tGSUZPKGdlMmQtPmluX2RvbmVfcSk7CisKKwlnZTJkLT5jdHggPSBjdHg7CisJYnVmX3NpemUgPSBjZmctPmJ1Zl9zaXplOworCWdlMmQtPmJ1Zl9zaXplID0gYnVmX3NpemU7CisKKwkvKiBzZXR1cCBvdXRwdXQgZmlmbyAqLworCXJldCA9IGtmaWZvX2FsbG9jKCZnZTJkLT5vdXRwdXQsIGJ1Zl9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0KSB7CisJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkiYWxsb2Mgb3V0cHV0IGZpZm8gZmFpbC5cbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yMjsKKwl9CisKKwlnZTJkLT5vdmJwb29sID0gdnphbGxvYyhidWZfc2l6ZSAqIHNpemVvZigqZ2UyZC0+b3ZicG9vbCkpOworCWlmICghZ2UyZC0+b3ZicG9vbCkgeworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJImFsbG9jIG91dHB1dCB2YiBwb29sIGZhaWwuXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjM7CisJfQorCisJLyogc2V0dXAgdmZyYW1lIGZpZm8gKi8KKwlyZXQgPSBrZmlmb19hbGxvYygmZ2UyZC0+ZnJhbWUsIGJ1Zl9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0KSB7CisJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkiYWxsb2MgZ2UyZCB2ZnJhbWUgZmlmbyBmYWlsLlxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I0OworCX0KKworCWdlMmQtPnZmcG9vbCA9IHZ6YWxsb2MoYnVmX3NpemUgKiBzaXplb2YoKmdlMmQtPnZmcG9vbCkpOworCWlmICghZ2UyZC0+dmZwb29sKSB7CisJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkiYWxsb2MgdmYgcG9vbCBmYWlsLlxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I1OworCX0KKworCXJldCA9IGtmaWZvX2FsbG9jKCZnZTJkLT5pbnB1dCwgR0UyRF9GUkFNRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0KSB7CisJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkiYWxsb2MgaW5wdXQgZmlmbyBmYWlsLlxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I2OworCX0KKworCWdlMmQtPml2YnBvb2wgPSB2emFsbG9jKEdFMkRfRlJBTUVfU0laRSAqIHNpemVvZigqZ2UyZC0+aXZicG9vbCkpOworCWlmICghZ2UyZC0+aXZicG9vbCkgeworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJImFsbG9jIGlucHV0IHZiIHBvb2wgZmFpbC5cbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yNzsKKwl9CisKKwlmb3IgKGkgPSAwIDsgaSA8IEdFMkRfRlJBTUVfU0laRSA7IGkrKykgeworCQlrZmlmb19wdXQoJmdlMmQtPmlucHV0LCAmZ2UyZC0+aXZicG9vbFtpXSk7CisJfQorCisJZm9yIChpID0gMCA7IGkgPCBidWZfc2l6ZSA7IGkrKykgeworCQlrZmlmb19wdXQoJmdlMmQtPm91dHB1dCwgJmdlMmQtPm92YnBvb2xbaV0pOworCQlrZmlmb19wdXQoJmdlMmQtPmZyYW1lLCAmZ2UyZC0+dmZwb29sW2ldKTsKKwl9CisKKwlnZTJkLT5zcmNfY2FudmFzX2lkWzBdID0gY2FudmFzX3Bvb2xfbWFwX2FsbG9jX2NhbnZhcygidjRsZGVjLWdlMmQiKTsKKwlnZTJkLT5zcmNfY2FudmFzX2lkWzFdID0gY2FudmFzX3Bvb2xfbWFwX2FsbG9jX2NhbnZhcygidjRsZGVjLWdlMmQiKTsKKwlnZTJkLT5zcmNfY2FudmFzX2lkWzJdID0gY2FudmFzX3Bvb2xfbWFwX2FsbG9jX2NhbnZhcygidjRsZGVjLWdlMmQiKTsKKwlnZTJkLT5kc3RfY2FudmFzX2lkWzBdID0gY2FudmFzX3Bvb2xfbWFwX2FsbG9jX2NhbnZhcygidjRsZGVjLWdlMmQiKTsKKwlnZTJkLT5kc3RfY2FudmFzX2lkWzFdID0gY2FudmFzX3Bvb2xfbWFwX2FsbG9jX2NhbnZhcygidjRsZGVjLWdlMmQiKTsKKwlnZTJkLT5kc3RfY2FudmFzX2lkWzJdID0gY2FudmFzX3Bvb2xfbWFwX2FsbG9jX2NhbnZhcygidjRsZGVjLWdlMmQiKTsKKwlpZiAoKGdlMmQtPnNyY19jYW52YXNfaWRbMF0gPD0gMCkgfHwKKwkJKGdlMmQtPnNyY19jYW52YXNfaWRbMV0gPD0gMCkgfHwKKwkJKGdlMmQtPnNyY19jYW52YXNfaWRbMl0gPD0gMCkgfHwKKwkJKGdlMmQtPmRzdF9jYW52YXNfaWRbMF0gPD0gMCkgfHwKKwkJKGdlMmQtPmRzdF9jYW52YXNfaWRbMV0gPD0gMCkgfHwKKwkJKGdlMmQtPmRzdF9jYW52YXNfaWRbMl0gPD0gMCkpIHsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJjYW52YXMgcG9vbCBhbGxvYyBmYWlsLiBzcmMoJWQsICVkLCAlZCkgZHN0KCVkLCAlZCwgJWQpLlxuIiwKKwkJCWdlMmQtPnNyY19jYW52YXNfaWRbMF0sCisJCQlnZTJkLT5zcmNfY2FudmFzX2lkWzFdLAorCQkJZ2UyZC0+c3JjX2NhbnZhc19pZFsyXSwKKwkJCWdlMmQtPmRzdF9jYW52YXNfaWRbMF0sCisJCQlnZTJkLT5kc3RfY2FudmFzX2lkWzFdLAorCQkJZ2UyZC0+ZHN0X2NhbnZhc19pZFsyXSk7CisJCWdvdG8gZXJyb3I4OworCX0KKworCW11dGV4X2luaXQoJmdlMmQtPm91dHB1dF9sb2NrKTsKKwlzZW1hX2luaXQoJmdlMmQtPnNlbV9pbiwgMCk7CisJc2VtYV9pbml0KCZnZTJkLT5zZW1fb3V0LCAwKTsKKworCWdlMmQtPnJ1bm5pbmcgPSB0cnVlOworCWdlMmQtPnRhc2sgPSBrdGhyZWFkX3J1bihhbWxfdjRsMl9nZTJkX3RocmVhZCwgZ2UyZCwKKwkJIiVzIiwgImFtbC12NGwyLWdlMmQiKTsKKwlpZiAoSVNfRVJSKGdlMmQtPnRhc2spKSB7CisJCXJldCA9IFBUUl9FUlIoZ2UyZC0+dGFzayk7CisJCWdvdG8gZXJyb3I5OworCX0KKwlzY2hlZF9zZXRzY2hlZHVsZXJfbm9jaGVjayhnZTJkLT50YXNrLCBTQ0hFRF9GSUZPLCAmcGFyYW0pOworCisJKmdlMmRfaGFuZGxlID0gZ2UyZDsKKworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfUFJJTkZPLAorCQkiR0UyRF9DRkcgYnNpemU6JWQsIHdrbToleCwgYm06JXgsIGRybTolZFxuIiwKKwkJZ2UyZC0+YnVmX3NpemUsCisJCWdlMmQtPndvcmtfbW9kZSwKKwkJZ2UyZC0+YnVmZmVyX21vZGUsCisJCWNmZy0+aXNfZHJtKTsKKworCXJldHVybiAwOworCitlcnJvcjk6CisJaWYgKGdlMmQtPnNyY19jYW52YXNfaWRbMF0gPiAwKQorCQljYW52YXNfcG9vbF9tYXBfZnJlZV9jYW52YXMoZ2UyZC0+c3JjX2NhbnZhc19pZFswXSk7CisJaWYgKGdlMmQtPnNyY19jYW52YXNfaWRbMV0gPiAwKQorCQljYW52YXNfcG9vbF9tYXBfZnJlZV9jYW52YXMoZ2UyZC0+c3JjX2NhbnZhc19pZFsxXSk7CisJaWYgKGdlMmQtPnNyY19jYW52YXNfaWRbMl0gPiAwKQorCQljYW52YXNfcG9vbF9tYXBfZnJlZV9jYW52YXMoZ2UyZC0+c3JjX2NhbnZhc19pZFsyXSk7CisJaWYgKGdlMmQtPmRzdF9jYW52YXNfaWRbMF0gPiAwKQorCQljYW52YXNfcG9vbF9tYXBfZnJlZV9jYW52YXMoZ2UyZC0+ZHN0X2NhbnZhc19pZFswXSk7CisJaWYgKGdlMmQtPmRzdF9jYW52YXNfaWRbMV0gPiAwKQorCQljYW52YXNfcG9vbF9tYXBfZnJlZV9jYW52YXMoZ2UyZC0+ZHN0X2NhbnZhc19pZFsxXSk7CisJaWYgKGdlMmQtPmRzdF9jYW52YXNfaWRbMl0gPiAwKQorCQljYW52YXNfcG9vbF9tYXBfZnJlZV9jYW52YXMoZ2UyZC0+ZHN0X2NhbnZhc19pZFsyXSk7CitlcnJvcjg6CisJdmZyZWUoZ2UyZC0+aXZicG9vbCk7CitlcnJvcjc6CisJa2ZpZm9fZnJlZSgmZ2UyZC0+aW5wdXQpOworZXJyb3I2OgorCXZmcmVlKGdlMmQtPnZmcG9vbCk7CitlcnJvcjU6CisJa2ZpZm9fZnJlZSgmZ2UyZC0+ZnJhbWUpOworZXJyb3I0OgorCXZmcmVlKGdlMmQtPm92YnBvb2wpOworZXJyb3IzOgorCWtmaWZvX2ZyZWUoJmdlMmQtPm91dHB1dCk7CitlcnJvcjI6CisJZGVzdHJveV9nZTJkX3dvcmtfcXVldWUoZ2UyZC0+Z2UyZF9jb250ZXh0KTsKK2Vycm9yOgorCWtmcmVlKGdlMmQpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woYW1sX3Y0bDJfZ2UyZF9pbml0KTsKKworaW50IGFtbF92NGwyX2dlMmRfZGVzdHJveShzdHJ1Y3QgYW1sX3Y0bDJfZ2UyZCogZ2UyZCkKK3sKKwl2NGxfZGJnKGdlMmQtPmN0eCwgVjRMX0RFQlVHX0dFMkRfREVUQUlMLAorCQkiZ2UyZCBkZXN0cm95IGJlZ2luXG4iKTsKKworCWdlMmQtPnJ1bm5pbmcgPSBmYWxzZTsKKwl1cCgmZ2UyZC0+c2VtX2luKTsKKwl1cCgmZ2UyZC0+c2VtX291dCk7CisJa3RocmVhZF9zdG9wKGdlMmQtPnRhc2spOworCisJZGVzdHJveV9nZTJkX3dvcmtfcXVldWUoZ2UyZC0+Z2UyZF9jb250ZXh0KTsKKwkvKiBubyBtb3JlIGdlMmQgY2FsbGJhY2sgYmVsb3cgdGhpcyBsaW5lICovCisKKwlrZmlmb19mcmVlKCZnZTJkLT5mcmFtZSk7CisJdmZyZWUoZ2UyZC0+dmZwb29sKTsKKwlrZmlmb19mcmVlKCZnZTJkLT5vdXRwdXQpOworCXZmcmVlKGdlMmQtPm92YnBvb2wpOworCWtmaWZvX2ZyZWUoJmdlMmQtPmlucHV0KTsKKwl2ZnJlZShnZTJkLT5pdmJwb29sKTsKKwltdXRleF9kZXN0cm95KCZnZTJkLT5vdXRwdXRfbG9jayk7CisKKwljYW52YXNfcG9vbF9tYXBfZnJlZV9jYW52YXMoZ2UyZC0+c3JjX2NhbnZhc19pZFswXSk7CisJY2FudmFzX3Bvb2xfbWFwX2ZyZWVfY2FudmFzKGdlMmQtPnNyY19jYW52YXNfaWRbMV0pOworCWNhbnZhc19wb29sX21hcF9mcmVlX2NhbnZhcyhnZTJkLT5zcmNfY2FudmFzX2lkWzJdKTsKKwljYW52YXNfcG9vbF9tYXBfZnJlZV9jYW52YXMoZ2UyZC0+ZHN0X2NhbnZhc19pZFswXSk7CisJY2FudmFzX3Bvb2xfbWFwX2ZyZWVfY2FudmFzKGdlMmQtPmRzdF9jYW52YXNfaWRbMV0pOworCWNhbnZhc19wb29sX21hcF9mcmVlX2NhbnZhcyhnZTJkLT5kc3RfY2FudmFzX2lkWzJdKTsKKworCXY0bF9kYmcoZ2UyZC0+Y3R4LCBWNExfREVCVUdfR0UyRF9ERVRBSUwsCisJCSJnZTJkIGRlc3Ryb3kgZG9uZVxuIik7CisKKwlrZnJlZShnZTJkKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChhbWxfdjRsMl9nZTJkX2Rlc3Ryb3kpOworCitzdGF0aWMgaW50IGFtbF92NGwyX2dlMmRfcHVzaF92ZnJhbWUoc3RydWN0IGFtbF92NGwyX2dlMmQqIGdlMmQsIHN0cnVjdCB2ZnJhbWVfcyAqdmYpCit7CisJc3RydWN0IGFtbF92NGwyX2dlMmRfYnVmKiBpbl9idWY7CisJc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKmZiID0gTlVMTDsKKworCWlmICghZ2UyZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWtmaWZvX2dldCgmZ2UyZC0+aW5wdXQsICZpbl9idWYpKSB7CisJCXY0bF9kYmcoZ2UyZC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkiY2F0IG5vdCBnZXQgZnJlZSBpbnB1dCBidWZmZXIuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICh2Zi0+dHlwZSAmIFZJRFRZUEVfVjRMX0VPUykKKwkJaW5fYnVmLT5mbGFnIHw9IEdFMkRfRkxBR19FT1M7CisKKwl2NGxfZGJnKGdlMmQtPmN0eCwgVjRMX0RFQlVHX0dFMkRfQlVGTUdSLAorCQkiZ2UyZF9wdXNoX3ZmcmFtZTogdmY6JXB4LCBpZHg6JWQsIHR5cGU6JXgsIHRzOiVsbGRcbiIsCisJCXZmLCB2Zi0+aW5kZXgsIHZmLT50eXBlLCB2Zi0+dGltZXN0YW1wKTsKKworCWZiID0gKHN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICopdmYtPnY0bF9tZW1faGFuZGxlOworCWluX2J1Zi0+YW1sX2J1ZiA9IGNvbnRhaW5lcl9vZihmYiwgc3RydWN0IGFtbF92aWRlb19kZWNfYnVmLCBmcmFtZV9idWZmZXIpOworCWluX2J1Zi0+dmYgPSB2ZjsKKworCWRvIHsKKwkJdW5zaWduZWQgaW50IGR3X21vZGUgPSBWREVDX0RXX05PX0FGQkM7CisJCXN0cnVjdCBmaWxlICpmcDsKKworCQlpZiAoIWR1bXBfZ2UyZF9pbnB1dCB8fCBnZTJkLT5jdHgtPmlzX2RybV9tb2RlKQorCQkJYnJlYWs7CisKKwkJaWYgKHZkZWNfaWZfZ2V0X3BhcmFtKGdlMmQtPmN0eCwgR0VUX1BBUkFNX0RXX01PREUsICZkd19tb2RlKSkKKwkJCWJyZWFrOworCisJCWlmIChkd19tb2RlID09IFZERUNfRFdfQUZCQ19PTkxZKQorCQkJYnJlYWs7CisKKwkJZnAgPSBmaWxwX29wZW4oIi9kYXRhL2RlY19kdW1wX2JlZm9yZS5yYXciLAorCQkJCU9fQ1JFQVQgfCBPX1JEV1IgfCBPX0xBUkdFRklMRSB8IE9fQVBQRU5ELCAwNjAwKTsKKwkJaWYgKCFJU19FUlIoZnApKSB7CisJCQlzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIgPSAmaW5fYnVmLT5hbWxfYnVmLT52Yi52YjJfYnVmOworCisJCQlrZXJuZWxfd3JpdGUoZnAsdmIyX3BsYW5lX3ZhZGRyKHZiLCAwKSx2Yi0+cGxhbmVzWzBdLmxlbmd0aCwgMCk7CisJCQlpZiAoaW5fYnVmLT5hbWxfYnVmLT5mcmFtZV9idWZmZXIubnVtX3BsYW5lcyA9PSAyKQorCQkJCWtlcm5lbF93cml0ZShmcCx2YjJfcGxhbmVfdmFkZHIodmIsIDEpLAorCQkJCQkJdmItPnBsYW5lc1sxXS5sZW5ndGgsIDApOworCQkJZHVtcF9nZTJkX2lucHV0LS07CisJCQlmaWxwX2Nsb3NlKGZwLCBOVUxMKTsKKwkJfQorCX0gd2hpbGUoMCk7CisKKwlBVFJBQ0VfQ09VTlRFUigiVkNfT1VUX0dFMkQtMC5yZWNlaXZlIiwgZmItPmJ1Zl9pZHgpOworCisJa2ZpZm9fcHV0KCZnZTJkLT5pbl9kb25lX3EsIGluX2J1Zik7CisJdXAoJmdlMmQtPnNlbV9pbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZmlsbF9nZTJkX2J1Zl9jYih2b2lkICp2NGxfY3R4LCB2b2lkICpmYl9jdHgpCit7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopdjRsX2N0eDsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPQorCQkoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKilmYl9jdHg7CisJaW50IHJldCA9IC0xOworCisJcmV0ID0gYW1sX3Y0bDJfZ2UyZF9wdXNoX3ZmcmFtZShjdHgtPmdlMmQsIGZiLT52ZnJhbWUpOworCWlmIChyZXQgPCAwKSB7CisJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkiZ2UyZCBwdXNoIHZmcmFtZSBlcnIsIHJldDogJWRcbiIsIHJldCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHRhc2tfb3BzX3MgZ2UyZF9vcHMgPSB7CisJLnR5cGUJCT0gVEFTS19UWVBFX0dFMkQsCisJLmdldF92ZnJhbWUJPSBnZTJkX3ZmX2dldCwKKwkucHV0X3ZmcmFtZQk9IGdlMmRfdmZfcHV0LAorCS5maWxsX2J1ZmZlcgk9IGZpbGxfZ2UyZF9idWZfY2IsCit9OworCitzdHJ1Y3QgdGFza19vcHNfcyAqZ2V0X2dlMmRfb3BzKHZvaWQpCit7CisJcmV0dXJuICZnZTJkX29wczsKK30KK0VYUE9SVF9TWU1CT0woZ2V0X2dlMmRfb3BzKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbXZkZWNfcG9ydHMvYW1sX3Zjb2RlY19nZTJkLmggYi9kcml2ZXJzL2FtdmRlY19wb3J0cy9hbWxfdmNvZGVjX2dlMmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTI5MzFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvYW1sX3Zjb2RlY19nZTJkLmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDIwIEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyogbW9yZSBkZXRhaWxzLgorKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKgorKiBEZXNjcmlwdGlvbjoKKyovCisjaWZuZGVmIF9BTUxfVkNPREVDX0dFMkRfSF8KKyNkZWZpbmUgX0FNTF9WQ09ERUNfR0UyRF9IXworCisjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KKyNpbmNsdWRlICJhbWxfdmNvZGVjX2Rydi5oIgorI2luY2x1ZGUgImFtbF92Y29kZWNfZGVjLmgiCisKKy8qIGRlZmluZSBnZTJkIHdvcmsgbW9kZS4gKi8KKyNkZWZpbmUgR0UyRF9NT0RFX0NPTlZFUlRfTlYxMgkJKDEgPDwgMCkKKyNkZWZpbmUgR0UyRF9NT0RFX0NPTlZFUlRfTlYyMQkJKDEgPDwgMSkKKyNkZWZpbmUgR0UyRF9NT0RFX0NPTlZFUlRfTEUJCSgxIDw8IDIpCisjZGVmaW5lIEdFMkRfTU9ERV9DT05WRVJUX0JFCQkoMSA8PCAzKQorI2RlZmluZSBHRTJEX01PREVfU0VQQVJBVEVfRklFTEQJKDEgPDwgNCkKKyNkZWZpbmUgR0UyRF9NT0RFXzQyMl9UT180MjAJCSgxIDw8IDUpCisKKyNkZWZpbmUgR0UyRF9GUkFNRV9TSVpFIDY0CisKK3N0cnVjdCBhbWxfdjRsMl9nZTJkX2J1ZiB7CisJdTMyCQkJZmxhZzsKKwlzdHJ1Y3QgdmZyYW1lX3MJCSp2ZjsKKwl2b2lkCQkJKmNhbGxlcl9kYXRhOworCXN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1ZiAqYW1sX2J1ZjsKK307CisKK3N0cnVjdCBhbWxfdjRsMl9nZTJkIHsKKwlzdHJ1Y3QgZ2UyZF9jb250ZXh0X3MJKmdlMmRfY29udGV4dDsgLyogaGFuZGxlIG9mIEdFMkQgKi8KKwl1MzIJCQlidWZfc2l6ZTsgLyogYnVmZmVyIHNpemUgZm9yIGdlMmQgKi8KKwl1MzIJCQl3b3JrX21vZGU7IC8qIGVudW0gZ2UyZF93b3JrX21vZGUgKi8KKwl1MzIJCQlidWZmZXJfbW9kZTsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHgJKmN0eDsKKworCURFQ0xBUkVfS0ZJRk9fUFRSKGlucHV0LCB0eXBlb2Yoc3RydWN0IGFtbF92NGwyX2dlMmRfYnVmKikpOworCURFQ0xBUkVfS0ZJRk9fUFRSKG91dHB1dCwgdHlwZW9mKHN0cnVjdCBhbWxfdjRsMl9nZTJkX2J1ZiopKTsKKwlERUNMQVJFX0tGSUZPX1BUUihmcmFtZSwgdHlwZW9mKHN0cnVjdCB2ZnJhbWVfcyAqKSk7CisJREVDTEFSRV9LRklGTyhvdXRfZG9uZV9xLCBzdHJ1Y3QgYW1sX3Y0bDJfZ2UyZF9idWYgKiwgR0UyRF9GUkFNRV9TSVpFKTsKKwlERUNMQVJFX0tGSUZPKGluX2RvbmVfcSwgc3RydWN0IGFtbF92NGwyX2dlMmRfYnVmICosIEdFMkRfRlJBTUVfU0laRSk7CisKKwlzdHJ1Y3QgdmZyYW1lX3MJCSp2ZnBvb2w7CisJc3RydWN0IGFtbF92NGwyX2dlMmRfYnVmICpvdmJwb29sOworCXN0cnVjdCBhbWxfdjRsMl9nZTJkX2J1ZiAqaXZicG9vbDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnRhc2s7CisJYm9vbAkJCXJ1bm5pbmc7CisJc3RydWN0IHNlbWFwaG9yZQlzZW1faW4sIHNlbV9vdXQ7CisKKwkvKiBJbiBwIHRvIGkgdHJhbnNpdGlvbiwgb3V0cHV0L2ZyYW1lIGNhbiBiZSBtdWx0aSB3cml0ZXIgKi8KKwlzdHJ1Y3QgbXV0ZXgJCW91dHB1dF9sb2NrOworCisJLyogZm9yIGRlYnVnZ2luZyAqLworCS8qCisJICogaW5bMF0gLS0+IGdlMmQgPC0tIGluWzFdCisJICogb3V0WzBdPC0tIGdlMmQgLS0+IG91dFsxXQorCSAqLworCWludAkJCWluX251bVsyXTsKKwlpbnQJCQlvdXRfbnVtWzJdOworCXVsb25nCQkJZmJfdG9rZW47CisKKwlpbnQJCQlzcmNfY2FudmFzX2lkWzNdOworCWludAkJCWRzdF9jYW52YXNfaWRbM107Cit9OworCitzdHJ1Y3QgdGFza19vcHNfcyAqZ2V0X2dlMmRfb3BzKHZvaWQpOworCitpbnQgYW1sX3Y0bDJfZ2UyZF9pbml0KAorCQlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCwKKwkJc3RydWN0IGFtbF9nZTJkX2NmZ19pbmZvcyAqY2ZnLAorCQlzdHJ1Y3QgYW1sX3Y0bDJfZ2UyZCoqIGdlMmRfaGFuZGxlKTsKKworaW50IGFtbF92NGwyX2dlMmRfZGVzdHJveShzdHJ1Y3QgYW1sX3Y0bDJfZ2UyZCogZ2UyZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbXZkZWNfcG9ydHMvYW1sX3Zjb2RlY191dGlsLmMgYi9kcml2ZXJzL2FtdmRlY19wb3J0cy9hbWxfdmNvZGVjX3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGIwZDA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvYW1sX3Zjb2RlY191dGlsLmMKQEAgLTAsMCArMSw0NiBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE3IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyogbW9yZSBkZXRhaWxzLgorKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKgorKiBEZXNjcmlwdGlvbjoKKyovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICJhbWxfdmNvZGVjX2Rydi5oIgorI2luY2x1ZGUgImFtbF92Y29kZWNfdXRpbC5oIgorCit2b2lkIGFtbF92Y29kZWNfc2V0X2N1cnJfY3R4KHN0cnVjdCBhbWxfdmNvZGVjX2RldiAqZGV2LAorCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CisJZGV2LT5jdXJyX2N0eCA9IGN0eDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woYW1sX3Zjb2RlY19zZXRfY3Vycl9jdHgpOworCitzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmFtbF92Y29kZWNfZ2V0X2N1cnJfY3R4KHN0cnVjdCBhbWxfdmNvZGVjX2RldiAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHg7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CisJY3R4ID0gZGV2LT5jdXJyX2N0eDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gY3R4OworfQorRVhQT1JUX1NZTUJPTChhbWxfdmNvZGVjX2dldF9jdXJyX2N0eCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FtdmRlY19wb3J0cy9hbWxfdmNvZGVjX3V0aWwuaCBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2FtbF92Y29kZWNfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YzU0NTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FtdmRlY19wb3J0cy9hbWxfdmNvZGVjX3V0aWwuaApAQCAtMCwwICsxLDEwNiBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE3IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyogbW9yZSBkZXRhaWxzLgorKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKgorKiBEZXNjcmlwdGlvbjoKKyovCisjaWZuZGVmIF9BTUxfVkNPREVDX1VUSUxfSF8KKyNkZWZpbmUgX0FNTF9WQ09ERUNfVVRJTF9IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtZGlyZWN0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jb2RlY19tbS9jb2RlY19tbS5oPgorLyoKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nCXU2NDsKK3R5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZwlzNjQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkJdTMyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQJdTE2OwordHlwZWRlZiBzaG9ydCBpbnQJCXMxNjsKK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJdTg7CisqLworI2RlZmluZSBDT0RFQ19NT0RFKGEsIGIsIGMsIGQpXAorCSgoKHU4KShhKSA8PCAyNCkgfCAoKHU4KShiKSA8PCAxNikgfCAoKHU4KShjKSA8PCA4KSB8ICh1OCkoZCkpCisKKyNkZWZpbmUgQlVGRl9JRFgoaCwgaSlcCisJKCgodWxvbmcpKGgpIDw8IDgpIHwgKHU4KShpKSkKKworc3RydWN0IGFtbF92Y29kZWNfbWVtIHsKKwlpbnQJaW5kZXg7CisJdWxvbmcJYWRkcjsKKwl1MzIJc2l6ZTsKKwl2b2lkCSp2YWRkcjsKKwl1MzIJYnl0ZXNfdXNlZDsKKwl1MzIJb2Zmc2V0OworCXU2NAl0aW1lc3RhbXA7CisJdTMyCW1vZGVsOworCXVsb25nCW1ldGFfcHRyOworCXN0cnVjdCBkbWFfYnVmICpkYnVmOworfTsKKworc3RydWN0IGFtbF92Y29kZWNfY3R4Oworc3RydWN0IGFtbF92Y29kZWNfZGV2OworCitleHRlcm4gdTMyIGRlYnVnX21vZGU7CitleHRlcm4gdTMyIG1hbmRhdG9yeV9kd19tbXU7CisKKyNpZmRlZiB2NGxfZGJnCisjdW5kZWYgdjRsX2RiZworI2VuZGlmCisKKy8qIHY0bCBkZWJ1ZyBkZWZpbmUuICovCisjZGVmaW5lIFY0TF9ERUJVR19DT0RFQ19FUlJPUgkoMCkKKyNkZWZpbmUgVjRMX0RFQlVHX0NPREVDX1BSSU5GTwkoMSA8PCAwKQorI2RlZmluZSBWNExfREVCVUdfQ09ERUNfU1RBVEUJKDEgPDwgMSkKKyNkZWZpbmUgVjRMX0RFQlVHX0NPREVDX0JVRk1HUgkoMSA8PCAyKQorI2RlZmluZSBWNExfREVCVUdfQ09ERUNfSU5QVVQJKDEgPDwgMykKKyNkZWZpbmUgVjRMX0RFQlVHX0NPREVDX09VVFBVVAkoMSA8PCA0KQorI2RlZmluZSBWNExfREVCVUdfQ09ERUNfQ09VTlQJKDEgPDwgNSkKKyNkZWZpbmUgVjRMX0RFQlVHX0NPREVDX1BBUlNFUgkoMSA8PCA2KQorI2RlZmluZSBWNExfREVCVUdfQ09ERUNfUFJPVAkoMSA8PCA3KQorI2RlZmluZSBWNExfREVCVUdfQ09ERUNfRVhJTkZPCSgxIDw8IDgpCisjZGVmaW5lIFY0TF9ERUJVR19WUFBfQlVGTUdSCSgxIDw8IDkpCisjZGVmaW5lIFY0TF9ERUJVR19WUFBfREVUQUlMCSgxIDw8IDEwKQorI2RlZmluZSBWNExfREVCVUdfVEFTS19DSEFJTgkoMSA8PCAxMSkKKyNkZWZpbmUgVjRMX0RFQlVHX0dFMkRfQlVGTUdSCSgxIDw8IDEyKQorI2RlZmluZSBWNExfREVCVUdfR0UyRF9ERVRBSUwJKDEgPDwgMTMpCisKKyNkZWZpbmUgX192NGxfZGJnKGgsIGlkLCBmbXQsIGFyZ3MuLi4pCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlpZiAoaCkJCQkJCQkJXAorCQkJcHJfaW5mbygiWyVkXTogIiBmbXQsIGlkLCAjI2FyZ3MpOwkJXAorCQllbHNlCQkJCQkJCVwKKwkJCXByX2luZm8oZm10LCAjI2FyZ3MpOwkJCQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSB2NGxfZGJnKGgsIGZsYWdzLCBmbXQsIGFyZ3MuLi4pCQkJCQkJXAorCWRvIHsJCQkJCQkJCQlcCisJCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqX19jdHggPSAoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopIGg7CVwKKwkJaWYgKChmbGFncyA9PSBWNExfREVCVUdfQ09ERUNfRVJST1IpIHx8CQkJCVwKKwkJCShmbGFncyA9PSBWNExfREVCVUdfQ09ERUNfUFJJTkZPKSB8fAkJCVwKKwkJCShkZWJ1Z19tb2RlICYgZmxhZ3MpKSB7CQkJCVwKKwkJCWlmIChmbGFncyA9PSBWNExfREVCVUdfQ09ERUNfRVJST1IpIHsJCQlcCisJCQkJX192NGxfZGJnKGgsIF9fY3R4LT5pZCwgIltFUlJdOiAiIGZtdCwgIyNhcmdzKTsJXAorCQkJfSBlbHNlCXsJCQkJCQlcCisJCQkJX192NGxfZGJnKGgsIF9fY3R4LT5pZCwgZm10LCAjI2FyZ3MpOwkJXAorCQkJfQkJCQkJCQlcCisJCX0JCQkJCQkJCVwKKwl9IHdoaWxlICgwKQorCit2b2lkIGFtbF92Y29kZWNfc2V0X2N1cnJfY3R4KHN0cnVjdCBhbWxfdmNvZGVjX2RldiAqZGV2LAorCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4KTsKK3N0cnVjdCBhbWxfdmNvZGVjX2N0eCAqYW1sX3Zjb2RlY19nZXRfY3Vycl9jdHgoc3RydWN0IGFtbF92Y29kZWNfZGV2ICpkZXYpOworCisjZW5kaWYgLyogX0FNTF9WQ09ERUNfVVRJTF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbXZkZWNfcG9ydHMvYW1sX3Zjb2RlY192cHAuYyBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2FtbF92Y29kZWNfdnBwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY0ZTk2MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2FtbF92Y29kZWNfdnBwLmMKQEAgLTAsMCArMSwxMTAyIEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMjAgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorKiBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqCisqIERlc2NyaXB0aW9uOgorKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L3NjaGVkL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZXNvbl91dm1fY29yZS5oPgorCisjaW5jbHVkZSAiYW1sX3Zjb2RlY192cHAuaCIKKyNpbmNsdWRlICJhbWxfdmNvZGVjX2FkYXB0LmgiCisjaW5jbHVkZSAidmRlY19kcnZfaWYuaCIKKyNpbmNsdWRlICIuLi9jb21tb24vY2hpcHMvZGVjb2Rlcl9jcHVfdmVyX2luZm8uaCIKKworI2RlZmluZSBLRVJORUxfQVRSQUNFX1RBRyBLRVJORUxfQVRSQUNFX1RBR19WNEwyCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL21lc29uX2F0cmFjZS5oPgorCisjZGVmaW5lIFZQUF9CVUZfR0VUX0lEWCh2cHBfYnVmKSAodnBwX2J1Zi0+YW1sX2J1Zi0+dmIudmIyX2J1Zi5pbmRleCkKKyNkZWZpbmUgSU5QVVRfUE9SVCAwCisjZGVmaW5lIE9VVFBVVF9QT1JUIDEKKworZXh0ZXJuIGludCBkdW1wX3ZwcF9pbnB1dDsKK2V4dGVybiBpbnQgdnBwX2J5cGFzc19mcmFtZXM7CisKK3N0YXRpYyB2b2lkIGRpX3JlbGVhc2Vfa2VlcF9idWZfd3JhcCh2b2lkICphcmcpCit7CisJc3RydWN0IGRpX2J1ZmZlciAqYnVmID0gKHN0cnVjdCBkaV9idWZmZXIgKilhcmc7CisKKwl2NGxfZGJnKDAsIFY0TF9ERUJVR19WUFBfQlVGTUdSLAorCQkiJXMgcmVsZWFzZSBkaSBsb2NhbCBidWZmZXIgJXB4LCB2ZjolcHgsIGNvbW06JXMsIHBpZDolZFxuIiwKKwkJX19mdW5jX18gLCBidWYsIGJ1Zi0+dmYsCisJCWN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCk7CisKKwlkaV9yZWxlYXNlX2tlZXBfYnVmKGJ1Zik7CisKKwlBVFJBQ0VfQ09VTlRFUigiVkNfT1VUX1ZQUF9MQy0yLmxjX3JlbGVhc2UiLCBidWYtPm1uZy5pbmRleCk7Cit9CisKK3N0YXRpYyBpbnQgYXR0YWNoX0RJX2J1ZmZlcihzdHJ1Y3QgYW1sX3Y0bDJfdnBwX2J1ZiAqdnBwX2J1ZikKK3sKKwlzdHJ1Y3QgYW1sX3Y0bDJfdnBwICp2cHAgPSB2cHBfYnVmLT5kaV9idWYuY2FsbGVyX2RhdGE7CisJc3RydWN0IGRtYV9idWYgKmRtYSA9IE5VTEw7CisJc3RydWN0IGFtbF92aWRlb19kZWNfYnVmICphbWxfYnVmID0gTlVMTDsKKwlzdHJ1Y3QgdXZtX2hvb2tfbW9kX2luZm8gdV9pbmZvOworCWludCByZXQ7CisKKwlhbWxfYnVmID0gdnBwX2J1Zi0+YW1sX2J1ZjsKKwlpZiAoIWFtbF9idWYpCisJCXJldHVybiAtRUlOVkFMOworCisJZG1hID0gYW1sX2J1Zi0+dmIudmIyX2J1Zi5wbGFuZXNbMF0uZGJ1ZjsKKwlpZiAoIWRtYSB8fCAhZG1hYnVmX2lzX3V2bShkbWEpKSB7CisJCXY0bF9kYmcodnBwLT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJhdHRhY2hfRElfYnVmZmVyIGVyclxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghdnBwX2J1Zi0+ZGlfbG9jYWxfYnVmKSB7CisJCXY0bF9kYmcodnBwLT5jdHgsIFY0TF9ERUJVR19WUFBfQlVGTUdSLAorCQkJImF0dGFjaF9ESV9idWZmZXIgbm90aGluZ1xuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICh1dm1fZ2V0X2hvb2tfbW9kKGRtYSwgVkZfUFJPQ0VTU19ESSkpIHsKKwkJdXZtX3B1dF9ob29rX21vZChkbWEsIFZGX1BST0NFU1NfREkpOworCQl2NGxfZGJnKHZwcC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkiYXR0YWNoX0RJX2J1ZmZlciBleGlzdCBob29rXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXVfaW5mby50eXBlID0gVkZfUFJPQ0VTU19ESTsKKwl1X2luZm8uYXJnID0gKHZvaWQgKil2cHBfYnVmLT5kaV9sb2NhbF9idWY7CisJdV9pbmZvLmZyZWUgPSBkaV9yZWxlYXNlX2tlZXBfYnVmX3dyYXA7CisKKwlyZXQgPSB1dm1fYXR0YWNoX2hvb2tfbW9kKGRtYSwgJnVfaW5mbyk7CisJaWYgKHJldCA8IDApIHsKKwkJdjRsX2RiZyh2cHAtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJImZhaWwgdG8gc2V0IGRtYWJ1ZiBESSBob29rXG4iKTsKKwl9CisKKwlBVFJBQ0VfQ09VTlRFUigiVkNfT1VUX1ZQUF9MQy0wLmxjX2F0dGFjaCIsIHZwcF9idWYtPmRpX2xvY2FsX2J1Zi0+bW5nLmluZGV4KTsKKworCXY0bF9kYmcodnBwLT5jdHgsIFY0TF9ERUJVR19WUFBfQlVGTUdSLAorCQkiJXMgYXR0YWNoIGRpIGxvY2FsIGJ1ZmZlciAlcHgsIGRidWY6JXB4XG4iLAorCQlfX2Z1bmNfXyAsIHZwcF9idWYtPmRpX2xvY2FsX2J1ZiwgZG1hKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZGV0YWNoX0RJX2J1ZmZlcihzdHJ1Y3QgYW1sX3Y0bDJfdnBwX2J1ZiAqdnBwX2J1ZikKK3sKKwlzdHJ1Y3QgYW1sX3Y0bDJfdnBwICp2cHAgPSB2cHBfYnVmLT5kaV9idWYuY2FsbGVyX2RhdGE7CisJc3RydWN0IGRtYV9idWYgKmRtYSA9IE5VTEw7CisJc3RydWN0IGFtbF92aWRlb19kZWNfYnVmICphbWxfYnVmID0gTlVMTDsKKwlpbnQgcmV0OworCisJYW1sX2J1ZiA9IHZwcF9idWYtPmFtbF9idWY7CisJaWYgKCFhbWxfYnVmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRtYSA9IGFtbF9idWYtPnZiLnZiMl9idWYucGxhbmVzWzBdLmRidWY7CisJaWYgKCFkbWEgfHwgIWRtYWJ1Zl9pc191dm0oZG1hKSkgeworCQl2NGxfZGJnKHZwcC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkiZGV0YWNoX0RJX2J1ZmZlciBlcnJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXZwcF9idWYtPmRpX2xvY2FsX2J1ZikgeworCQl2NGxfZGJnKHZwcC0+Y3R4LCBWNExfREVCVUdfVlBQX0JVRk1HUiwKKwkJCSJkZXRhY2hfRElfYnVmZmVyIG5vdGhpbmdcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlBVFJBQ0VfQ09VTlRFUigiVkNfT1VUX1ZQUF9MQy0xLmxjX2RldGFjaCIsIHZwcF9idWYtPmRpX2xvY2FsX2J1Zi0+bW5nLmluZGV4KTsKKworCXJldCA9IHV2bV9kZXRhY2hfaG9va19tb2QoZG1hLCBWRl9QUk9DRVNTX0RJKTsKKwlpZiAocmV0IDwgMCkgeworCQl2NGxfZGJnKHZwcC0+Y3R4LCBWNExfREVCVUdfVlBQX0JVRk1HUiwKKwkJCSJmYWlsIHRvIHJlbW92ZSBkbWFidWYgREkgaG9va1xuIik7CisJfQorCisJdjRsX2RiZyh2cHAtPmN0eCwgVjRMX0RFQlVHX1ZQUF9CVUZNR1IsCisJCSIlcyBkZXRhY2ggZGkgbG9jYWwgYnVmZmVyICVweCwgZGJ1ZjolcHhcbiIsCisJCV9fZnVuY19fICwgdnBwX2J1Zi0+ZGlfbG9jYWxfYnVmLCBkbWEpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9ESV9idWZmKHN0cnVjdCBhbWxfdjRsMl92cHAqIHZwcCkKK3sKKwlzdHJ1Y3QgYW1sX3Y0bDJfdnBwX2J1ZiAqdnBwX2J1ZiA9IE5VTEw7CisKKwl3aGlsZSAoa2ZpZm9fZ2V0KCZ2cHAtPm91dF9kb25lX3EsICZ2cHBfYnVmKSkgeworCQlpZiAodnBwX2J1Zi0+ZGlfYnVmLnByaXZhdGVfZGF0YSkgeworCQkJZGlfcmVsZWFzZV9rZWVwX2J1Zih2cHBfYnVmLT5kaV9sb2NhbF9idWYpOworCQkJdjRsX2RiZyh2cHAtPmN0eCwgVjRMX0RFQlVHX1ZQUF9CVUZNR1IsCisJCQkJIiVzIHJlbGVhc2UgZGkgbG9jYWwgYnVmZmVyICVweFxuIiwKKwkJCQlfX2Z1bmNfXyAsIHZwcF9idWYtPmRpX2xvY2FsX2J1Zik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgaXNfZGlfaW5wdXRfYnVmZl9mdWxsKHN0cnVjdCBhbWxfdjRsMl92cHAgKnZwcCkKK3sKKwlyZXR1cm4gKCh2cHAtPmluX251bVtJTlBVVF9QT1JUXSAtIHZwcC0+aW5fbnVtW09VVFBVVF9QT1JUXSkKKwkJPiB2cHAtPmRpX2lidWZfbnVtKSA/IHRydWUgOiBmYWxzZTsKK30KKworc3RhdGljIGludCBpc19kaV9vdXRwdXRfYnVmZl9mdWxsKHN0cnVjdCBhbWxfdjRsMl92cHAgKnZwcCkKK3sKKwlyZXR1cm4gKCh2cHAtPm91dF9udW1bSU5QVVRfUE9SVF0gLSB2cHAtPm91dF9udW1bT1VUUFVUX1BPUlRdKQorCQk+IHZwcC0+ZGlfb2J1Zl9udW0pID8gdHJ1ZSA6IGZhbHNlOworfQorCitzdGF0aWMgZW51bSBESV9FUlJPUlRZUEUKKwl2NGxfdnBwX2ZpbGxfb3V0cHV0X2RvbmVfYWxsb2NfYnVmZmVyKHN0cnVjdCBkaV9idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYW1sX3Y0bDJfdnBwICp2cHAgPSBidWYtPmNhbGxlcl9kYXRhOworCXN0cnVjdCBhbWxfdjRsMl92cHBfYnVmICp2cHBfYnVmID0gTlVMTDsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPSBOVUxMOworCWJvb2wgYnlwYXNzID0gZmFsc2U7CisJYm9vbCBlb3MgPSBmYWxzZTsKKworCWlmICghdnBwIHx8ICF2cHAtPmN0eCkgeworCQlwcl9lcnIoImZhdGFsICVzICVkIHZwcDolcFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgdnBwKTsKKwkJZGlfcmVsZWFzZV9rZWVwX2J1Zl93cmFwKGJ1Zik7CisJCXJldHVybiBESV9FUlJfVU5ERUZJTkVEOworCX0KKworCWlmICh2cHAtPmN0eC0+aXNfc3RyZWFtX29mZikgeworCQl2NGxfZGJnKHZwcC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVhJTkZPLAorCQkJInZwcCBkaXNjYXJkIHN1Ym1pdCBmcmFtZSAlcyAlZCB2cHA6JXBcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHZwcCk7CisJCWRpX3JlbGVhc2Vfa2VlcF9idWZfd3JhcChidWYpOworCQlyZXR1cm4gRElfRVJSX1VOREVGSU5FRDsKKwl9CisKKwlpZiAoIWtmaWZvX2dldCgmdnBwLT5wcm9jZXNzaW5nLCAmdnBwX2J1ZikpIHsKKwkJdjRsX2RiZyh2cHAtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywKKwkJCSJ2cHAgZG9lc24ndCBnZXQgb3V0cHV0ICVzICVkIHZwcDolcFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgdnBwKTsKKwkJZGlfcmVsZWFzZV9rZWVwX2J1Zl93cmFwKGJ1Zik7CisJCXJldHVybiBESV9FUlJfVU5ERUZJTkVEOworCX0KKworCWZiCT0gJnZwcF9idWYtPmFtbF9idWYtPmZyYW1lX2J1ZmZlcjsKKwllb3MJPSAoYnVmLT5mbGFnICYgRElfRkxBR19FT1MpOworCWJ5cGFzcwk9IChidWYtPmZsYWcgJiBESV9GTEFHX0JVRl9CWV9QQVNTKTsKKworCXZwcF9idWYtPmRpX2J1Zi52Zi0+dGltZXN0YW1wCT0gYnVmLT52Zi0+dGltZXN0YW1wOworCXZwcF9idWYtPmRpX2J1Zi5wcml2YXRlX2RhdGEJPSBidWYtPnByaXZhdGVfZGF0YTsKKwl2cHBfYnVmLT5kaV9idWYudmYtPnZmX2V4dAk9IGJ1Zi0+dmY7CisJdnBwX2J1Zi0+ZGlfYnVmLmZsYWcJCT0gYnVmLT5mbGFnOworCXZwcF9idWYtPmRpX2J1Zi52Zi0+djRsX21lbV9oYW5kbGUgPSAodWxvbmcpZmI7CisKKwlpZiAoIWVvcyAmJiAhYnlwYXNzKSB7CisJCXZwcF9idWYtPmRpX2xvY2FsX2J1ZiA9IGJ1ZjsKKwkJdnBwX2J1Zi0+ZGlfYnVmLnZmLT52Zl9leHQgPSBidWYtPnZmOworCQl2cHBfYnVmLT5kaV9idWYudmYtPmZsYWcgfD0gVkZSQU1FX0ZMQUdfQ09OVEFJTl9QT1NUX0ZSQU1FOworCX0KKworCWtmaWZvX3B1dCgmdnBwLT5vdXRfZG9uZV9xLCB2cHBfYnVmKTsKKworCWlmICh2cHAtPmlzX3Byb2cpCisJCWtmaWZvX3B1dCgmdnBwLT5pbnB1dCwgdnBwX2J1Zi0+aW5idWYpOworCisJdjRsX2RiZyh2cHAtPmN0eCwgVjRMX0RFQlVHX1ZQUF9CVUZNR1IsCisJCSJ2cHBfb3V0cHV0IGxvY2FsIGRvbmU6IGlkeDolZCwgdmY6JXB4LCBleHQgdmY6JXB4LCBpZHg6JWQsIGZsYWcodmY6JXggZGk6JXgpICVzICVzLCB0czolbGxkLCAiCisJCSJpbjolZCwgb3V0OiVkLCB2ZjolZCwgaW4gZG9uZTolZCwgb3V0IGRvbmU6JWRcbiIsCisJCWZiLT5idWZfaWR4LAorCQl2cHBfYnVmLT5kaV9idWYudmYsCisJCXZwcF9idWYtPmRpX2J1Zi52Zi0+dmZfZXh0LAorCQl2cHBfYnVmLT5kaV9idWYudmYtPmluZGV4LAorCQl2cHBfYnVmLT5kaV9idWYudmYtPmZsYWcsCisJCWJ1Zi0+ZmxhZywKKwkJdnBwLT5pc19wcm9nID8gIlAiIDogIkkiLAorCQllb3MgPyAiZW9zIiA6ICIiLAorCQl2cHBfYnVmLT5kaV9idWYudmYtPnRpbWVzdGFtcCwKKwkJa2ZpZm9fbGVuKCZ2cHAtPmlucHV0KSwKKwkJa2ZpZm9fbGVuKCZ2cHAtPm91dHB1dCksCisJCWtmaWZvX2xlbigmdnBwLT5mcmFtZSksCisJCWtmaWZvX2xlbigmdnBwLT5pbl9kb25lX3EpLAorCQlrZmlmb19sZW4oJnZwcC0+b3V0X2RvbmVfcSkpOworCisJQVRSQUNFX0NPVU5URVIoIlZDX09VVF9WUFAtMi5sY19zdWJtaXQiLCBmYi0+YnVmX2lkeCk7CisKKwlmYi0+dGFzay0+c3VibWl0KGZiLT50YXNrLCBUQVNLX1RZUEVfVlBQKTsKKworCXZwcC0+b3V0X251bVtPVVRQVVRfUE9SVF0rKzsKKwl2cHAtPmluX251bVtPVVRQVVRfUE9SVF0rKzsKKworCXJldHVybiBESV9FUlJfTk9ORTsKK30KKworc3RhdGljIGVudW0gRElfRVJST1JUWVBFCisJdjRsX3ZwcF9lbXB0eV9pbnB1dF9kb25lKHN0cnVjdCBkaV9idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYW1sX3Y0bDJfdnBwICp2cHAgPSBidWYtPmNhbGxlcl9kYXRhOworCXN0cnVjdCBhbWxfdjRsMl92cHBfYnVmICp2cHBfYnVmOworCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9IE5VTEw7CisJYm9vbCBlb3MgPSBmYWxzZTsKKworCWlmICghdnBwIHx8ICF2cHAtPmN0eCkgeworCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJmYXRhbCAlcyAlZCB2cHA6JXB4XG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCB2cHApOworCQlyZXR1cm4gRElfRVJSX1VOREVGSU5FRDsKKwl9CisKKwlpZiAodnBwLT5jdHgtPmlzX3N0cmVhbV9vZmYpIHsKKwkJdjRsX2RiZyh2cHAtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywKKwkJCSJ2cHAgZGlzY2FyZCByZWN5Y2xlIGZyYW1lICVzICVkIHZwcDolcFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgdnBwKTsKKwkJcmV0dXJuIERJX0VSUl9VTkRFRklORUQ7CisJfQorCisJdnBwX2J1Zgk9IGNvbnRhaW5lcl9vZihidWYsIHN0cnVjdCBhbWxfdjRsMl92cHBfYnVmLCBkaV9idWYpOworCWZiIAk9ICZ2cHBfYnVmLT5hbWxfYnVmLT5mcmFtZV9idWZmZXI7CisJZW9zCT0gKGJ1Zi0+ZmxhZyAmIERJX0ZMQUdfRU9TKTsKKworCXY0bF9kYmcodnBwLT5jdHgsIFY0TF9ERUJVR19WUFBfQlVGTUdSLAorCQkidnBwX2lucHV0IGRvbmU6IGlkeDolZCwgdmY6JXB4LCBpZHg6ICVkLCBmbGFnKHZmOiV4IGRpOiV4KSAlcyAlcywgdHM6JWxsZCwgIgorCQkiaW46JWQsIG91dDolZCwgdmY6JWQsIGluIGRvbmU6JWQsIG91dCBkb25lOiVkXG4iLAorCQlmYi0+YnVmX2lkeCwKKwkJYnVmLT52ZiwKKwkJYnVmLT52Zi0+aW5kZXgsCisJCWJ1Zi0+dmYtPmZsYWcsCisJCWJ1Zi0+ZmxhZywKKwkJdnBwLT5pc19wcm9nID8gIlAiIDogIkkiLAorCQllb3MgPyAiZW9zIiA6ICIiLAorCQlidWYtPnZmLT50aW1lc3RhbXAsCisJCWtmaWZvX2xlbigmdnBwLT5pbnB1dCksCisJCWtmaWZvX2xlbigmdnBwLT5vdXRwdXQpLAorCQlrZmlmb19sZW4oJnZwcC0+ZnJhbWUpLAorCQlrZmlmb19sZW4oJnZwcC0+aW5fZG9uZV9xKSwKKwkJa2ZpZm9fbGVuKCZ2cHAtPm91dF9kb25lX3EpKTsKKworCWlmICghdnBwLT5pc19wcm9nKSB7CisJCS8qIHJlY3ljbGUgdmYgb25seSBpbiBub24tYnlwYXNzIG1vZGUgKi8KKwkJZmItPnRhc2stPnJlY3ljbGUoZmItPnRhc2ssIFRBU0tfVFlQRV9WUFApOworCisJCWtmaWZvX3B1dCgmdnBwLT5pbnB1dCwgdnBwX2J1Zik7CisJfQorCisJaWYgKHZwcC0+YnVmZmVyX21vZGUgIT0gQlVGRkVSX01PREVfQUxMT0NfQlVGKQorCQl2cHAtPmluX251bVtPVVRQVVRfUE9SVF0rKzsKKworCUFUUkFDRV9DT1VOVEVSKCJWQ19JTl9WUFAtMS5yZWN5Y2xlIiwgZmItPmJ1Zl9pZHgpOworCisJcmV0dXJuIERJX0VSUl9OT05FOworfQorCitzdGF0aWMgZW51bSBESV9FUlJPUlRZUEUKKwl2NGxfdnBwX2ZpbGxfb3V0cHV0X2RvbmUoc3RydWN0IGRpX2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCBhbWxfdjRsMl92cHAgKnZwcCA9IGJ1Zi0+Y2FsbGVyX2RhdGE7CisJc3RydWN0IGFtbF92NGwyX3ZwcF9idWYgKnZwcF9idWYgPSBOVUxMOworCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9IE5VTEw7CisJYm9vbCBieXBhc3MgPSBmYWxzZTsKKwlib29sIGVvcyA9IGZhbHNlOworCisJaWYgKCF2cHAgfHwgIXZwcC0+Y3R4KSB7CisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJImZhdGFsICVzICVkIHZwcDolcHhcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHZwcCk7CisJCXJldHVybiBESV9FUlJfVU5ERUZJTkVEOworCX0KKworCWlmICh2cHAtPmN0eC0+aXNfc3RyZWFtX29mZikgeworCQl2NGxfZGJnKHZwcC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVhJTkZPLAorCQkJInZwcCBkaXNjYXJkIHN1Ym1pdCBmcmFtZSAlcyAlZCB2cHA6JXBcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHZwcCk7CisJCXJldHVybiBESV9FUlJfVU5ERUZJTkVEOworCX0KKworCXZwcF9idWYJPSBjb250YWluZXJfb2YoYnVmLCBzdHJ1Y3QgYW1sX3Y0bDJfdnBwX2J1ZiwgZGlfYnVmKTsKKwlmYgk9ICZ2cHBfYnVmLT5hbWxfYnVmLT5mcmFtZV9idWZmZXI7CisJZW9zCT0gKGJ1Zi0+ZmxhZyAmIERJX0ZMQUdfRU9TKTsKKwlieXBhc3MJPSAoYnVmLT5mbGFnICYgRElfRkxBR19CVUZfQllfUEFTUyk7CisKKwkvKiByZWNvdmVyeSBmYiBoYW5kbGUuICovCisJYnVmLT52Zi0+djRsX21lbV9oYW5kbGUgPSAodWxvbmcpZmI7CisKKwlrZmlmb19wdXQoJnZwcC0+b3V0X2RvbmVfcSwgdnBwX2J1Zik7CisKKwl2NGxfZGJnKHZwcC0+Y3R4LCBWNExfREVCVUdfVlBQX0JVRk1HUiwKKwkJInZwcF9vdXRwdXQgZG9uZTogaWR4OiVkLCB2ZjolcHgsIGlkeDolZCwgZmxhZyh2ZjoleCBkaToleCkgJXMgJXMsIHRzOiVsbGQsICIKKwkJImluOiVkLCBvdXQ6JWQsIHZmOiVkLCBpbiBkb25lOiVkLCBvdXQgZG9uZTolZFxuIiwKKwkJZmItPmJ1Zl9pZHgsCisJCWJ1Zi0+dmYsCisJCWJ1Zi0+dmYtPmluZGV4LAorCQlidWYtPnZmLT5mbGFnLAorCQlidWYtPmZsYWcsCisJCXZwcC0+aXNfcHJvZyA/ICJQIiA6ICJJIiwKKwkJZW9zID8gImVvcyIgOiAiIiwKKwkJYnVmLT52Zi0+dGltZXN0YW1wLAorCQlrZmlmb19sZW4oJnZwcC0+aW5wdXQpLAorCQlrZmlmb19sZW4oJnZwcC0+b3V0cHV0KSwKKwkJa2ZpZm9fbGVuKCZ2cHAtPmZyYW1lKSwKKwkJa2ZpZm9fbGVuKCZ2cHAtPmluX2RvbmVfcSksCisJCWtmaWZvX2xlbigmdnBwLT5vdXRfZG9uZV9xKSk7CisKKwlBVFJBQ0VfQ09VTlRFUigiVkNfT1VUX1ZQUC0yLnN1Ym1pdCIsIGZiLT5idWZfaWR4KTsKKworCWZiLT50YXNrLT5zdWJtaXQoZmItPnRhc2ssIFRBU0tfVFlQRV9WUFApOworCisJdnBwLT5vdXRfbnVtW09VVFBVVF9QT1JUXSsrOworCisJLyogY291bnQgZm9yIGJ5cGFzcyBuciAqLworCWlmICh2cHAtPmJ1ZmZlcl9tb2RlID09IEJVRkZFUl9NT0RFX0FMTE9DX0JVRikKKwkJdnBwLT5pbl9udW1bT1VUUFVUX1BPUlRdKys7CisKKwlyZXR1cm4gRElfRVJSX05PTkU7Cit9CisKK3N0YXRpYyB2b2lkIHZwcF92Zl9nZXQodm9pZCAqY2FsbGVyLCBzdHJ1Y3QgdmZyYW1lX3MgKip2Zl9vdXQpCit7CisJc3RydWN0IGFtbF92NGwyX3ZwcCAqdnBwID0gKHN0cnVjdCBhbWxfdjRsMl92cHAgKiljYWxsZXI7CisJc3RydWN0IGFtbF92NGwyX3ZwcF9idWYgKnZwcF9idWYgPSBOVUxMOworCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9IE5VTEw7CisJc3RydWN0IGRpX2J1ZmZlciAqYnVmID0gTlVMTDsKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmID0gTlVMTDsKKwlib29sIGJ5cGFzcyA9IGZhbHNlOworCWJvb2wgZW9zID0gZmFsc2U7CisKKwlpZiAoIXZwcCB8fCAhdnBwLT5jdHgpIHsKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkiZmF0YWwgJXMgJWQgdnBwOiVweFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgdnBwKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChrZmlmb19nZXQoJnZwcC0+b3V0X2RvbmVfcSwgJnZwcF9idWYpKSB7CisJCWZiCT0gJnZwcF9idWYtPmFtbF9idWYtPmZyYW1lX2J1ZmZlcjsKKwkJYnVmCT0gJnZwcF9idWYtPmRpX2J1ZjsKKwkJZW9zCT0gKGJ1Zi0+ZmxhZyAmIERJX0ZMQUdfRU9TKTsKKwkJYnlwYXNzCT0gKGJ1Zi0+ZmxhZyAmIERJX0ZMQUdfQlVGX0JZX1BBU1MpOworCQl2Zgk9IGJ1Zi0+dmY7CisKKwkJaWYgKGVvcykgeworCQkJdjRsX2RiZyh2cHAtPmN0eCwgVjRMX0RFQlVHX1ZQUF9ERVRBSUwsCisJCQkJIiVzICVkIGdvdCBlb3NcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJCXZmLT50eXBlIHw9IFZJRFRZUEVfVjRMX0VPUzsKKwkJCXZmLT5mbGFnID0gVkZSQU1FX0ZMQUdfRU1QVFlfRlJBTUVfVjRMOworCQl9CisKKwkJaWYgKCFlb3MgJiYgIWJ5cGFzcykgeworCQkJaWYgKHZwcC0+YnVmZmVyX21vZGUgPT0gQlVGRkVSX01PREVfQUxMT0NfQlVGKSB7CisJCQkJYXR0YWNoX0RJX2J1ZmZlcih2cHBfYnVmKTsKKwkJCX0KKwkJfQorCisJCSp2Zl9vdXQgPSB2ZjsKKworCQlBVFJBQ0VfQ09VTlRFUigiVkNfT1VUX1ZQUC0zLnZmX2dldCIsIGZiLT5idWZfaWR4KTsKKworCQl2NGxfZGJnKHZwcC0+Y3R4LCBWNExfREVCVUdfVlBQX0JVRk1HUiwKKwkJCSIlczogdmY6JXB4LCBpbmRleDolZCwgZmxhZyh2ZjoleCBkaToleCksIHRzOiVsbGRcbiIsCisJCQlfX2Z1bmNfXywgdmYsCisJCQl2Zi0+aW5kZXgsCisJCQl2Zi0+ZmxhZywKKwkJCWJ1Zi0+ZmxhZywKKwkJCXZmLT50aW1lc3RhbXApOworCX0KK30KKworc3RhdGljIHZvaWQgdnBwX3ZmX3B1dCh2b2lkICpjYWxsZXIsIHN0cnVjdCB2ZnJhbWVfcyAqdmYpCit7CisJc3RydWN0IGFtbF92NGwyX3ZwcCAqdnBwID0gKHN0cnVjdCBhbWxfdjRsMl92cHAgKiljYWxsZXI7CisJc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKmZiID0gTlVMTDsKKwlzdHJ1Y3QgYW1sX3ZpZGVvX2RlY19idWYgKmFtbF9idWYgPSBOVUxMOworCXN0cnVjdCBhbWxfdjRsMl92cHBfYnVmICp2cHBfYnVmID0gTlVMTDsKKwlzdHJ1Y3QgZGlfYnVmZmVyICpidWYgPSBOVUxMOworCWJvb2wgYnlwYXNzID0gZmFsc2U7CisJYm9vbCBlb3MgPSBmYWxzZTsKKworCWZiCT0gKHN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICopIHZmLT52NGxfbWVtX2hhbmRsZTsKKwlhbWxfYnVmCT0gY29udGFpbmVyX29mKGZiLCBzdHJ1Y3QgYW1sX3ZpZGVvX2RlY19idWYsIGZyYW1lX2J1ZmZlcik7CisKKworCXZwcF9idWYJPSAoc3RydWN0IGFtbF92NGwyX3ZwcF9idWYgKikgYW1sX2J1Zi0+dnBwX2J1Zl9oYW5kbGU7CisJYnVmCT0gJnZwcF9idWYtPmRpX2J1ZjsKKwllb3MJPSAoYnVmLT5mbGFnICYgRElfRkxBR19FT1MpOworCWJ5cGFzcwk9IChidWYtPmZsYWcgJiBESV9GTEFHX0JVRl9CWV9QQVNTKTsKKworCXY0bF9kYmcodnBwLT5jdHgsIFY0TF9ERUJVR19WUFBfQlVGTUdSLAorCQkiJXM6IHZmOiVweCwgaW5kZXg6JWQsIGZsYWcodmY6JXggZGk6JXgpLCB0czolbGxkXG4iLAorCQlfX2Z1bmNfXywgdmYsCisJCXZmLT5pbmRleCwKKwkJdmYtPmZsYWcsCisJCWJ1Zi0+ZmxhZywKKwkJdmYtPnRpbWVzdGFtcCk7CisKKwlBVFJBQ0VfQ09VTlRFUigiVkNfSU5fVlBQLTAudmZfcHV0IiwgZmItPmJ1Zl9pZHgpOworCisJaWYgKHZwcC0+aXNfcHJvZykgeworCQlBVFJBQ0VfQ09VTlRFUigiVkNfSU5fVlBQLTEucmVjeWNsZSIsIGZiLT5idWZfaWR4KTsKKwkJZmItPnRhc2stPnJlY3ljbGUoZmItPnRhc2ssIFRBU0tfVFlQRV9WUFApOworCX0KKworCWlmICghZW9zICYmICFieXBhc3MpIHsKKwkJaWYgKHZwcC0+YnVmZmVyX21vZGUgPT0gQlVGRkVSX01PREVfQUxMT0NfQlVGKSB7CisJCQlkZXRhY2hfRElfYnVmZmVyKHZwcF9idWYpOworCQl9CisJfQorCisJbXV0ZXhfbG9jaygmdnBwLT5vdXRwdXRfbG9jayk7CisJa2ZpZm9fcHV0KCZ2cHAtPmZyYW1lLCB2Zik7CisJa2ZpZm9fcHV0KCZ2cHAtPm91dHB1dCwgdnBwX2J1Zik7CisJbXV0ZXhfdW5sb2NrKCZ2cHAtPm91dHB1dF9sb2NrKTsKKwl1cCgmdnBwLT5zZW1fb3V0KTsKK30KKworc3RhdGljIGludCBhbWxfdjRsMl92cHBfdGhyZWFkKHZvaWQqIHBhcmFtKQoreworCXN0cnVjdCBhbWxfdjRsMl92cHAqIHZwcCA9IHBhcmFtOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gdnBwLT5jdHg7CisKKwl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX1ZQUF9ERVRBSUwsICJlbnRlciB2cHAgdGhyZWFkXG4iKTsKKwl3aGlsZSAodnBwLT5ydW5uaW5nKSB7CisJCXN0cnVjdCBhbWxfdjRsMl92cHBfYnVmICppbl9idWY7CisJCXN0cnVjdCBhbWxfdjRsMl92cHBfYnVmICpvdXRfYnVmID0gTlVMTDsKKwkJc3RydWN0IHZmcmFtZV9zICp2Zl9vdXQgPSBOVUxMOworCQlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmI7CisKKwkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmdnBwLT5zZW1faW4pKQorCQkJZ290byBleGl0OworcmV0cnk6CisJCWlmICghdnBwLT5ydW5uaW5nKQorCQkJYnJlYWs7CisKKwkJaWYgKGtmaWZvX2lzX2VtcHR5KCZ2cHAtPm91dHB1dCkpIHsKKwkJCWlmIChkb3duX2ludGVycnVwdGlibGUoJnZwcC0+c2VtX291dCkpCisJCQkJZ290byBleGl0OworCQkJZ290byByZXRyeTsKKwkJfQorCisJCWlmICgodnBwLT5idWZmZXJfbW9kZSA9PSBCVUZGRVJfTU9ERV9BTExPQ19CVUYpICYmCisJCQkoaXNfZGlfaW5wdXRfYnVmZl9mdWxsKHZwcCkgfHwgaXNfZGlfb3V0cHV0X2J1ZmZfZnVsbCh2cHApKSkgeworCQkJdXNsZWVwX3JhbmdlKDUwMCwgNTUwKTsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKworCQltdXRleF9sb2NrKCZ2cHAtPm91dHB1dF9sb2NrKTsKKwkJaWYgKCFrZmlmb19nZXQoJnZwcC0+b3V0cHV0LCAmb3V0X2J1ZikpIHsKKwkJCW11dGV4X3VubG9jaygmdnBwLT5vdXRwdXRfbG9jayk7CisJCQl2NGxfZGJnKGN0eCwgMCwgInZwcCBjYW4gbm90IGdldCBvdXRwdXRcbiIpOworCQkJZ290byBleGl0OworCQl9CisJCW11dGV4X3VubG9jaygmdnBwLT5vdXRwdXRfbG9jayk7CisKKwkJLyogYmluZCB2NGwyIGJ1ZmZlcnMgKi8KKwkJaWYgKCF2cHAtPmlzX3Byb2cgJiYgIW91dF9idWYtPmFtbF9idWYpIHsKKwkJCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpvdXQ7CisKKwkJCWlmICghY3R4LT5mYl9vcHMucXVlcnkoJmN0eC0+ZmJfb3BzLCAmdnBwLT5mYl90b2tlbikpIHsKKwkJCQl1c2xlZXBfcmFuZ2UoNTAwLCA1NTApOworCQkJCW11dGV4X2xvY2soJnZwcC0+b3V0cHV0X2xvY2spOworCQkJCWtmaWZvX3B1dCgmdnBwLT5vdXRwdXQsIG91dF9idWYpOworCQkJCW11dGV4X3VubG9jaygmdnBwLT5vdXRwdXRfbG9jayk7CisJCQkJZ290byByZXRyeTsKKwkJCX0KKworCQkJaWYgKGN0eC0+ZmJfb3BzLmFsbG9jKCZjdHgtPmZiX29wcywgdnBwLT5mYl90b2tlbiwgJm91dCwgQU1MX0ZCX1JFUV9WUFApKSB7CisJCQkJdXNsZWVwX3JhbmdlKDUwMDAsIDU1MDApOworCQkJCW11dGV4X2xvY2soJnZwcC0+b3V0cHV0X2xvY2spOworCQkJCWtmaWZvX3B1dCgmdnBwLT5vdXRwdXQsIG91dF9idWYpOworCQkJCW11dGV4X3VubG9jaygmdnBwLT5vdXRwdXRfbG9jayk7CisJCQkJZ290byByZXRyeTsKKwkJCX0KKworCQkJb3V0X2J1Zi0+YW1sX2J1ZiA9IGNvbnRhaW5lcl9vZihvdXQsCisJCQkJc3RydWN0IGFtbF92aWRlb19kZWNfYnVmLCBmcmFtZV9idWZmZXIpOworCQkJb3V0X2J1Zi0+YW1sX2J1Zi0+dnBwX2J1Zl9oYW5kbGUgPSAodWxvbmcpIG91dF9idWY7CisJCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX1ZQUF9CVUZNR1IsCisJCQkJInZwcCBiaW5kIGJ1ZjolZCB0byB2cHBfYnVmOiVweFxuIiwKKwkJCQlWUFBfQlVGX0dFVF9JRFgob3V0X2J1ZiksIG91dF9idWYpOworCisJCQlvdXQtPm0ubWVtWzBdLmJ5dGVzX3VzZWQgPSBvdXQtPm0ubWVtWzBdLnNpemU7CisJCQlvdXQtPm0ubWVtWzFdLmJ5dGVzX3VzZWQgPSBvdXQtPm0ubWVtWzFdLnNpemU7CisJCX0KKworCQkvKiBzYWZlIHRvIHBvcCBpbl9idWYgKi8KKwkJaWYgKCFrZmlmb19nZXQoJnZwcC0+aW5fZG9uZV9xLCAmaW5fYnVmKSkgeworCQkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCQkidnBwIGNhbiBub3QgZ2V0IGlucHV0XG4iKTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCisJCW11dGV4X2xvY2soJnZwcC0+b3V0cHV0X2xvY2spOworCQlpZiAoIWtmaWZvX2dldCgmdnBwLT5mcmFtZSwgJnZmX291dCkpIHsKKwkJCW11dGV4X3VubG9jaygmdnBwLT5vdXRwdXRfbG9jayk7CisJCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJCSJ2cHAgY2FuIG5vdCBnZXQgZnJhbWVcbiIpOworCQkJZ290byBleGl0OworCQl9CisJCW11dGV4X3VubG9jaygmdnBwLT5vdXRwdXRfbG9jayk7CisKKwkJaWYgKCF2cHAtPmlzX3Byb2cpIHsKKwkJCS8qIHN1Ym1pdCBJIHRvIERJLiAqLworCQkJZmIgPSAmb3V0X2J1Zi0+YW1sX2J1Zi0+ZnJhbWVfYnVmZmVyOworCQkJZmItPnN0YXR1cyA9IEZCX1NUX1ZQUDsKKworCQkJbWVtY3B5KHZmX291dCwgaW5fYnVmLT5kaV9idWYudmYsIHNpemVvZigqdmZfb3V0KSk7CisJCQltZW1jcHkodmZfb3V0LT5jYW52YXMwX2NvbmZpZywKKwkJCQlpbl9idWYtPmRpX2J1Zi52Zi0+Y2FudmFzMF9jb25maWcsCisJCQkJMiAqIHNpemVvZihzdHJ1Y3QgY2FudmFzX2NvbmZpZ19zKSk7CisKKwkJCXZmX291dC0+Y2FudmFzMF9jb25maWdbMF0ucGh5X2FkZHIgPSBmYi0+bS5tZW1bMF0uYWRkcjsKKwkJCWlmIChmYi0+bnVtX3BsYW5lcyA9PSAxKQorCQkJCXZmX291dC0+Y2FudmFzMF9jb25maWdbMV0ucGh5X2FkZHIgPQorCQkJCQlmYi0+bS5tZW1bMF0uYWRkciArIGZiLT5tLm1lbVswXS5vZmZzZXQ7CisJCQllbHNlCisJCQkJdmZfb3V0LT5jYW52YXMwX2NvbmZpZ1sxXS5waHlfYWRkciA9CisJCQkJCWZiLT5tLm1lbVsxXS5hZGRyOworCisJCQlpZiAoaW5fYnVmLT5kaV9idWYuZmxhZyAmIERJX0ZMQUdfRU9TKQorCQkJCW1lbXNldCh2Zl9vdXQsIDAsIHNpemVvZigqdmZfb3V0KSk7CisKKwkJCXZmX291dC0+bWV0YV9kYXRhX3NpemUgPSBpbl9idWYtPmRpX2J1Zi52Zi0+bWV0YV9kYXRhX3NpemU7CisJCQl2Zl9vdXQtPm1ldGFfZGF0YV9idWYgPSBpbl9idWYtPmRpX2J1Zi52Zi0+bWV0YV9kYXRhX2J1ZjsKKwkJfSBlbHNlIHsKKwkJCS8qIHN1Ym1pdCBQIHRvIERJLiAqLworCQkJb3V0X2J1Zi0+YW1sX2J1ZiA9IGluX2J1Zi0+YW1sX2J1ZjsKKwkJCW91dF9idWYtPmFtbF9idWYtPnZwcF9idWZfaGFuZGxlID0gKHVsb25nKSBvdXRfYnVmOworCisJCQltZW1jcHkodmZfb3V0LCBpbl9idWYtPmRpX2J1Zi52Ziwgc2l6ZW9mKCp2Zl9vdXQpKTsKKwkJfQorCisJCS8qIGZpbGwgb3V0YnVmIHBhcm1zLiAqLworCQlvdXRfYnVmLT5kaV9idWYudmYJPSB2Zl9vdXQ7CisJCW91dF9idWYtPmRpX2J1Zi5mbGFnCT0gMDsKKwkJb3V0X2J1Zi0+ZGlfbG9jYWxfYnVmCT0gTlVMTDsKKwkJb3V0X2J1Zi0+ZGlfYnVmLmNhbGxlcl9kYXRhID0gdnBwOworCisJCS8qIGZpbGwgaW5idWYgcGFybXMuICovCisJCWluX2J1Zi0+ZGlfYnVmLmNhbGxlcl9kYXRhID0gdnBwOworCisJCS8qCisJCSAqIEhXQyBvciBTRiBzaG91bGQgaG9sZCBkaSBidWZmcmVzIHJlZmNudCBhZnRlciByZXNvbHV0aW9uIGNoYW5nZWQKKwkJICogdGhhdCBtaWdodCBjYXVzZSBzdHVjaywgdGh1cyBzdW1iaXQgMTAgZnJhbWVzIGZyb20gZGVjIHRvIGRpc3BsYXkgZGlyZWN0bHkuCisJCSAqIHRoZW4gZnJhbWVzIHdpbGwgYmUgcHVzaGVkIG91dCBmcm9tIHRoZXNlIGJ1ZmZlciBxdWV1ZW4gYW5kCisJCSAqIHJlY3ljbGUgbG9jYWwgYnVmZmVycyB0byBESSBtb2R1bGUuCisJCSAqLworCQlpZiAoLyooY3R4LT52cHBfY2ZnLnJlc19jaGcpICYmICovKHZwcC0+aXNfcHJvZykgJiYKKwkJCSh2cHAtPmJ1ZmZlcl9tb2RlID09IEJVRkZFUl9NT0RFX0FMTE9DX0JVRikpIHsKKwkJCWlmICh2cHAtPmluX251bVtJTlBVVF9QT1JUXSA8IHZwcF9ieXBhc3NfZnJhbWVzKSB7CisJCQkJdnBwLT5pc19ieXBhc3NfcCA9IHRydWU7CisJCQl9IGVsc2UgeworCQkJCXZwcC0+aXNfYnlwYXNzX3AgPSBmYWxzZTsKKwkJCQljdHgtPnZwcF9jZmcucmVzX2NoZyA9IGZhbHNlOworCQkJfQorCQl9CisKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19WUFBfQlVGTUdSLAorCQkJInZwcF9oYW5kbGUgc3RhcnQ6IGlkeDooJWQsICVkKSwgZGVjIHZmOiVweC8lZCwgdnBwIHZmOiVweC8lZCwgaXBoeTolbHgvJWx4ICVkeCVkIG9waHk6JWx4LyVseCAlZHglZCwgJXMgJXMgIgorCQkJImluOiVkLCBvdXQ6JWQsIHZmOiVkLCBpbiBkb25lOiVkLCBvdXQgZG9uZTolZCIsCisJCQlpbl9idWYtPmFtbF9idWYtPmZyYW1lX2J1ZmZlci5idWZfaWR4LAorCQkJb3V0X2J1Zi0+YW1sX2J1Zi0+ZnJhbWVfYnVmZmVyLmJ1Zl9pZHgsCisJCQlpbl9idWYtPmRpX2J1Zi52ZiwgaW5fYnVmLT5kaV9idWYudmYtPmluZGV4LAorCQkJb3V0X2J1Zi0+ZGlfYnVmLnZmLCBWUFBfQlVGX0dFVF9JRFgob3V0X2J1ZiksCisJCQlpbl9idWYtPmRpX2J1Zi52Zi0+Y2FudmFzMF9jb25maWdbMF0ucGh5X2FkZHIsCisJCQlpbl9idWYtPmRpX2J1Zi52Zi0+Y2FudmFzMF9jb25maWdbMV0ucGh5X2FkZHIsCisJCQlpbl9idWYtPmRpX2J1Zi52Zi0+Y2FudmFzMF9jb25maWdbMF0ud2lkdGgsCisJCQlpbl9idWYtPmRpX2J1Zi52Zi0+Y2FudmFzMF9jb25maWdbMF0uaGVpZ2h0LAorCQkJdmZfb3V0LT5jYW52YXMwX2NvbmZpZ1swXS5waHlfYWRkciwKKwkJCXZmX291dC0+Y2FudmFzMF9jb25maWdbMV0ucGh5X2FkZHIsCisJCQl2Zl9vdXQtPmNhbnZhczBfY29uZmlnWzBdLndpZHRoLAorCQkJdmZfb3V0LT5jYW52YXMwX2NvbmZpZ1swXS5oZWlnaHQsCisJCQl2cHAtPmlzX3Byb2cgPyAiUCIgOiAiIiwKKwkJCXZwcC0+aXNfYnlwYXNzX3AgPyAiYnlwYXNzLXByb2ciIDogIiIsCisJCQlrZmlmb19sZW4oJnZwcC0+aW5wdXQpLAorCQkJa2ZpZm9fbGVuKCZ2cHAtPm91dHB1dCksCisJCQlrZmlmb19sZW4oJnZwcC0+ZnJhbWUpLAorCQkJa2ZpZm9fbGVuKCZ2cHAtPmluX2RvbmVfcSksCisJCQlrZmlmb19sZW4oJnZwcC0+b3V0X2RvbmVfcSkpOworCisJCWlmICh2cHAtPmlzX2J5cGFzc19wKSB7CisJCQlBVFJBQ0VfQ09VTlRFUigiVjRMX09VVF9WUFAtMS5kaXJlY3RfaGFuZGxlX3N0YXJ0IiwKKwkJCQlpbl9idWYtPmFtbF9idWYtPmZyYW1lX2J1ZmZlci5idWZfaWR4KTsKKwkJCW91dF9idWYtPmRpX2J1Zi5mbGFnID0gaW5fYnVmLT5kaV9idWYuZmxhZzsKKwkJCW91dF9idWYtPmRpX2J1Zi52Zi0+dmZfZXh0ID0gaW5fYnVmLT5kaV9idWYudmY7CisKKwkJCXY0bF92cHBfZmlsbF9vdXRwdXRfZG9uZSgmb3V0X2J1Zi0+ZGlfYnVmKTsKKwkJCXY0bF92cHBfZW1wdHlfaW5wdXRfZG9uZSgmaW5fYnVmLT5kaV9idWYpOworCQl9IGVsc2UgeworCQkJaWYgKHZwcC0+YnVmZmVyX21vZGUgPT0gQlVGRkVSX01PREVfQUxMT0NfQlVGKSB7CisJCQkJLyoKKwkJCQkgKiB0aGUgZmxvdyBvZiBESSBsb2NhbCBidWZmZXI6CisJCQkJICogZW1wdHkgaW5wdXQgLT4gb3V0cHV0IGRvbmUgY2IgLT4gZmV0Y2ggcHJvY2Vzc2luZyBmaWZvLgorCQkJCSAqLworCQkJCUFUUkFDRV9DT1VOVEVSKCJWQ19PVVRfVlBQLTEubGNfaGFuZGxlX3N0YXJ0IiwKKwkJCQkJaW5fYnVmLT5hbWxfYnVmLT5mcmFtZV9idWZmZXIuYnVmX2lkeCk7CisJCQkJb3V0X2J1Zi0+aW5idWYgPSBpbl9idWY7CisJCQkJa2ZpZm9fcHV0KCZ2cHAtPnByb2Nlc3NpbmcsIG91dF9idWYpOworCisJCQkJZGlfZW1wdHlfaW5wdXRfYnVmZmVyKHZwcC0+ZGlfaGFuZGxlLCAmaW5fYnVmLT5kaV9idWYpOworCQkJfSBlbHNlIHsKKwkJCQlBVFJBQ0VfQ09VTlRFUigiVkNfT1VUX1ZQUC0xLmZpbGxfb3V0cHV0X3N0YXJ0IiwKKwkJCQkJb3V0X2J1Zi0+YW1sX2J1Zi0+ZnJhbWVfYnVmZmVyLmJ1Zl9pZHgpOworCQkJCWRpX2ZpbGxfb3V0cHV0X2J1ZmZlcih2cHAtPmRpX2hhbmRsZSwgJm91dF9idWYtPmRpX2J1Zik7CisKKwkJCQlBVFJBQ0VfQ09VTlRFUigiVkNfT1VUX1ZQUC0xLmVtcHR5X2lucHV0X3N0YXJ0IiwKKwkJCQkJaW5fYnVmLT5hbWxfYnVmLT5mcmFtZV9idWZmZXIuYnVmX2lkeCk7CisJCQkJZGlfZW1wdHlfaW5wdXRfYnVmZmVyKHZwcC0+ZGlfaGFuZGxlLCAmaW5fYnVmLT5kaV9idWYpOworCQkJfQorCQl9CisJCXZwcC0+aW5fbnVtW0lOUFVUX1BPUlRdKys7CisJCXZwcC0+b3V0X251bVtJTlBVVF9QT1JUXSsrOworCX0KK2V4aXQ6CisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOworCX0KKworCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfVlBQX0RFVEFJTCwgImV4aXQgdnBwIHRocmVhZFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGFtbF92NGwyX3ZwcF9nZXRfYnVmX251bSh1MzIgbW9kZSkKK3sKKwlpZiAoKG1vZGUgPT0gVlBQX01PREVfREkpIHx8CisJCShtb2RlID09IFZQUF9NT0RFX0NPTE9SX0NPTlYpIHx8CisJCShtb2RlID09IFZQUF9NT0RFX05PSVNFX1JFRFVDKSkgeworCQlyZXR1cm4gNDsKKwl9CisJLy9UT0RPOiBzdXBwb3J0IG1vcmUgbW9kZXMKKwlyZXR1cm4gMjsKK30KKworaW50IGFtbF92NGwyX3ZwcF9yZXNldChzdHJ1Y3QgYW1sX3Y0bDJfdnBwICp2cHApCit7CisJaW50IGk7CisJc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtID0KKwkJeyAuc2NoZWRfcHJpb3JpdHkgPSBNQVhfUlRfUFJJTyAtIDEgfTsKKworCXZwcC0+cnVubmluZyA9IGZhbHNlOworCXVwKCZ2cHAtPnNlbV9pbik7CisJdXAoJnZwcC0+c2VtX291dCk7CisJa3RocmVhZF9zdG9wKHZwcC0+dGFzayk7CisKKwlrZmlmb19yZXNldCgmdnBwLT5pbnB1dCk7CisJa2ZpZm9fcmVzZXQoJnZwcC0+b3V0cHV0KTsKKwlrZmlmb19yZXNldCgmdnBwLT5mcmFtZSk7CisJa2ZpZm9fcmVzZXQoJnZwcC0+b3V0X2RvbmVfcSk7CisJa2ZpZm9fcmVzZXQoJnZwcC0+aW5fZG9uZV9xKTsKKwlrZmlmb19yZXNldCgmdnBwLT5wcm9jZXNzaW5nKTsKKworCWZvciAoaSA9IDAgOyBpIDwgVlBQX0ZSQU1FX1NJWkUgOyBpKyspIHsKKwkJbWVtc2V0KCZ2cHAtPml2YnBvb2xbaV0sIDAsIHNpemVvZihzdHJ1Y3QgYW1sX3Y0bDJfdnBwX2J1ZikpOworCisJCWtmaWZvX3B1dCgmdnBwLT5pbnB1dCwgJnZwcC0+aXZicG9vbFtpXSk7CisJfQorCisJZm9yIChpID0gMCA7IGkgPCB2cHAtPmJ1Zl9zaXplIDsgaSsrKSB7CisJCW1lbXNldCgmdnBwLT5vdmJwb29sW2ldLCAwLCBzaXplb2Yoc3RydWN0IGFtbF92NGwyX3ZwcF9idWYpKTsKKwkJbWVtc2V0KCZ2cHAtPnZmcG9vbFtpXSwgMCwgc2l6ZW9mKHN0cnVjdCB2ZnJhbWVfcykpOworCisJCWtmaWZvX3B1dCgmdnBwLT5vdXRwdXQsICZ2cHAtPm92YnBvb2xbaV0pOworCQlrZmlmb19wdXQoJnZwcC0+ZnJhbWUsICZ2cHAtPnZmcG9vbFtpXSk7CisJfQorCisJdnBwLT5pbl9udW1bMF0JPSAwOworCXZwcC0+aW5fbnVtWzFdCT0gMDsKKwl2cHAtPm91dF9udW1bMF0JPSAwOworCXZwcC0+b3V0X251bVsxXQk9IDA7CisJdnBwLT5mYl90b2tlbgk9IDA7CisJc2VtYV9pbml0KCZ2cHAtPnNlbV9pbiwgMCk7CisJc2VtYV9pbml0KCZ2cHAtPnNlbV9vdXQsIDApOworCisJdnBwLT5ydW5uaW5nID0gdHJ1ZTsKKwl2cHAtPnRhc2sgPSBrdGhyZWFkX3J1bihhbWxfdjRsMl92cHBfdGhyZWFkLCB2cHAsCisJCSIlcyIsICJhbWwtdjRsMi12cHAiKTsKKwlpZiAoSVNfRVJSKHZwcC0+dGFzaykpIHsKKwkJcmV0dXJuIFBUUl9FUlIodnBwLT50YXNrKTsKKwl9CisKKwlzY2hlZF9zZXRzY2hlZHVsZXJfbm9jaGVjayh2cHAtPnRhc2ssIFNDSEVEX0ZJRk8sICZwYXJhbSk7CisKKwl2NGxfZGJnKHZwcC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfUFJJTkZPLCAidnBwIHdyYXBwZXIgcmVzZXQuXG4iKTsKKworCXJldHVybiAwOworCit9CitFWFBPUlRfU1lNQk9MKGFtbF92NGwyX3ZwcF9yZXNldCk7CisKK2ludCBhbWxfdjRsMl92cHBfaW5pdCgKKwkJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsCisJCXN0cnVjdCBhbWxfdnBwX2NmZ19pbmZvcyAqY2ZnLAorCQlzdHJ1Y3QgYW1sX3Y0bDJfdnBwKiogdnBwX2hhbmRsZSkKK3sKKwlzdHJ1Y3QgZGlfaW5pdF9wYXJtIGluaXQ7CisJdTMyIGJ1Zl9zaXplOworCWludCBpLCByZXQ7CisJc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtID0geyAuc2NoZWRfcHJpb3JpdHkgPSBNQVhfUlRfUFJJTyAtIDEgfTsKKwlzdHJ1Y3QgYW1sX3Y0bDJfdnBwICp2cHA7CisJdTMyIHdvcmtfbW9kZSA9IGNmZy0+bW9kZTsKKworCWlmICghY2ZnIHx8IHdvcmtfbW9kZSA+IFZQUF9NT0RFX01BWCB8fCAhY3R4IHx8ICF2cHBfaGFuZGxlKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY2ZnLT5mbXQgIT0gVjRMMl9QSVhfRk1UX05WMTIgJiYgY2ZnLT5mbXQgIT0gVjRMMl9QSVhfRk1UX05WMTJNICYmCisJCWNmZy0+Zm10ICE9IFY0TDJfUElYX0ZNVF9OVjIxICYmIGNmZy0+Zm10ICE9IFY0TDJfUElYX0ZNVF9OVjIxTSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2cHAgPSBremFsbG9jKHNpemVvZigqdnBwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2cHApCisJCXJldHVybiAtRU5PTUVNOworCisJdnBwLT53b3JrX21vZGUgPSB3b3JrX21vZGU7CisJaWYgKHZwcC0+d29ya19tb2RlID49IFZQUF9NT0RFX0RJX0xPQ0FMICYmCisJCXZwcC0+d29ya19tb2RlIDw9IFZQUF9NT0RFX05PSVNFX1JFRFVDX0xPQ0FMKQorCQl2cHAtPmJ1ZmZlcl9tb2RlID0gQlVGRkVSX01PREVfQUxMT0NfQlVGOworCWVsc2UKKwkJdnBwLT5idWZmZXJfbW9kZSA9IEJVRkZFUl9NT0RFX1VTRV9CVUY7CisKKwlpbml0LndvcmtfbW9kZQkJCT0gV09SS19NT0RFX1BSRV9QT1NUOworCWluaXQuYnVmZmVyX21vZGUJCT0gdnBwLT5idWZmZXJfbW9kZTsKKwlpbml0Lm9wcy5maWxsX291dHB1dF9kb25lCT0gdjRsX3ZwcF9maWxsX291dHB1dF9kb25lOworCWluaXQub3BzLmVtcHR5X2lucHV0X2RvbmUJPSB2NGxfdnBwX2VtcHR5X2lucHV0X2RvbmU7CisJaW5pdC5jYWxsZXJfZGF0YQkJPSAodm9pZCAqKXZwcDsKKworCWlmICh2cHAtPmJ1ZmZlcl9tb2RlID09IEJVRkZFUl9NT0RFX0FMTE9DX0JVRikgeworCQlpbml0Lm9wcy5maWxsX291dHB1dF9kb25lID0KKwkJCXY0bF92cHBfZmlsbF9vdXRwdXRfZG9uZV9hbGxvY19idWZmZXI7CisJfQorCisJaWYgKHZwcC0+YnVmZmVyX21vZGUgPT0gQlVGRkVSX01PREVfQUxMT0NfQlVGKQorCQlpbml0Lm91dHB1dF9mb3JtYXQgPSBESV9PVVRQVVRfQllfRElfREVGSU5FOworCWVsc2UgaWYgKCh2cHAtPmJ1ZmZlcl9tb2RlID09IEJVRkZFUl9NT0RFX1VTRV9CVUYpICYmCisJCSgoY2ZnLT5mbXQgPT0gVjRMMl9QSVhfRk1UX05WMjFNKSB8fCAoY2ZnLT5mbXQgPT0gVjRMMl9QSVhfRk1UX05WMjEpKSkKKwkJaW5pdC5vdXRwdXRfZm9ybWF0ID0gRElfT1VUUFVUX05WMjEgfCBESV9PVVRQVVRfTElORUFSOworCWVsc2UgaWYgKCh2cHAtPmJ1ZmZlcl9tb2RlID09IEJVRkZFUl9NT0RFX1VTRV9CVUYpICYmCisJCSgoY2ZnLT5mbXQgPT0gVjRMMl9QSVhfRk1UX05WMTJNKSB8fCAoY2ZnLT5mbXQgPT0gVjRMMl9QSVhfRk1UX05WMTIpKSkKKwkJaW5pdC5vdXRwdXRfZm9ybWF0ID0gRElfT1VUUFVUX05WMTIgfCBESV9PVVRQVVRfTElORUFSOworCWVsc2UgLyogQUZCQyBkZW9jZGUgY2FzZSwgTlYxMiBhcyBkZWZhdWx0ICovCisJCWluaXQub3V0cHV0X2Zvcm1hdCA9IERJX09VVFBVVF9OVjEyIHwgRElfT1VUUFVUX0xJTkVBUjsKKworCWlmIChjZmctPmlzX2RybSkKKwkJaW5pdC5vdXRwdXRfZm9ybWF0IHw9IERJX09VVFBVVF9UVlA7CisKKwl2cHAtPmRpX2hhbmRsZSA9IGRpX2NyZWF0ZV9pbnN0YW5jZShpbml0KTsKKwlpZiAodnBwLT5kaV9oYW5kbGUgPCAwKSB7CisJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkiZGlfY3JlYXRlX2luc3RhbmNlIGZhaWxcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKworCUlOSVRfS0ZJRk8odnBwLT5pbnB1dCk7CisJSU5JVF9LRklGTyh2cHAtPm91dHB1dCk7CisJSU5JVF9LRklGTyh2cHAtPmZyYW1lKTsKKwlJTklUX0tGSUZPKHZwcC0+b3V0X2RvbmVfcSk7CisJSU5JVF9LRklGTyh2cHAtPmluX2RvbmVfcSk7CisJSU5JVF9LRklGTyh2cHAtPnByb2Nlc3NpbmcpOworCisJdnBwLT5jdHggPSBjdHg7CisJdnBwLT5pc19wcm9nID0gY2ZnLT5pc19wcm9nOworCXZwcC0+aXNfYnlwYXNzX3AgPSBjZmctPmlzX2J5cGFzc19wOworCisJYnVmX3NpemUgPSB2cHAtPmlzX3Byb2cgPyAxNiA6IGNmZy0+YnVmX3NpemU7CisJdnBwLT5idWZfc2l6ZSA9IGJ1Zl9zaXplOworCisJLyogc2V0dXAgb3V0cHV0IGZpZm8gKi8KKwlyZXQgPSBrZmlmb19hbGxvYygmdnBwLT5vdXRwdXQsIGJ1Zl9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0KSB7CisJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkiYWxsb2Mgb3V0cHV0IGZpZm8gZmFpbC5cbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yMjsKKwl9CisKKwl2cHAtPm92YnBvb2wgPSB2emFsbG9jKGJ1Zl9zaXplICogc2l6ZW9mKCp2cHAtPm92YnBvb2wpKTsKKwlpZiAoIXZwcC0+b3ZicG9vbCkgeworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJImFsbG9jIG91dHB1dCB2YiBwb29sIGZhaWwuXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjM7CisJfQorCisJLyogc2V0dXAgdmZyYW1lIGZpZm8gKi8KKwlyZXQgPSBrZmlmb19hbGxvYygmdnBwLT5mcmFtZSwgYnVmX3NpemUsIEdGUF9LRVJORUwpOworCWlmIChyZXQpIHsKKwkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJhbGxvYyB2cHAgdmZyYW1lIGZpZm8gZmFpbC5cbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yNDsKKwl9CisKKwl2cHAtPnZmcG9vbCA9IHZ6YWxsb2MoYnVmX3NpemUgKiBzaXplb2YoKnZwcC0+dmZwb29sKSk7CisJaWYgKCF2cHAtPnZmcG9vbCkgeworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJImFsbG9jIHZmIHBvb2wgZmFpbC5cbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yNTsKKwl9CisKKwkvKiBzZXR1cCBwcm9jZXNzaW5nIGZpZm8gKi8KKwlyZXQgPSBrZmlmb19hbGxvYygmdnBwLT5wcm9jZXNzaW5nLCBidWZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJldCkgeworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJImFsbG9jIHByb2Nlc3NpbmcgZmlmbyBmYWlsLlxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I2OworCX0KKworCXJldCA9IGtmaWZvX2FsbG9jKCZ2cHAtPmlucHV0LCBWUFBfRlJBTUVfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJldCkgeworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJImFsbG9jIGlucHV0IGZpZm8gZmFpbC5cbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yNzsKKwl9CisKKwl2cHAtPml2YnBvb2wgPSB2emFsbG9jKFZQUF9GUkFNRV9TSVpFICogc2l6ZW9mKCp2cHAtPml2YnBvb2wpKTsKKwlpZiAoIXZwcC0+aXZicG9vbCkgeworCQl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJImFsbG9jIGlucHV0IHZiIHBvb2wgZmFpbC5cbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yODsKKwl9CisKKwlmb3IgKGkgPSAwIDsgaSA8IFZQUF9GUkFNRV9TSVpFIDsgaSsrKSB7CisJCWtmaWZvX3B1dCgmdnBwLT5pbnB1dCwgJnZwcC0+aXZicG9vbFtpXSk7CisJfQorCisJZm9yIChpID0gMCA7IGkgPCBidWZfc2l6ZSA7IGkrKykgeworCQlrZmlmb19wdXQoJnZwcC0+b3V0cHV0LCAmdnBwLT5vdmJwb29sW2ldKTsKKwkJa2ZpZm9fcHV0KCZ2cHAtPmZyYW1lLCAmdnBwLT52ZnBvb2xbaV0pOworCX0KKworCW11dGV4X2luaXQoJnZwcC0+b3V0cHV0X2xvY2spOworCXNlbWFfaW5pdCgmdnBwLT5zZW1faW4sIDApOworCXNlbWFfaW5pdCgmdnBwLT5zZW1fb3V0LCAwKTsKKworCXZwcC0+cnVubmluZyA9IHRydWU7CisJdnBwLT50YXNrID0ga3RocmVhZF9ydW4oYW1sX3Y0bDJfdnBwX3RocmVhZCwgdnBwLAorCQkiYW1sLSVzIiwgImFtbC12NGwyLXZwcCIpOworCWlmIChJU19FUlIodnBwLT50YXNrKSkgeworCQlyZXQgPSBQVFJfRVJSKHZwcC0+dGFzayk7CisJCWdvdG8gZXJyb3I5OworCX0KKwlzY2hlZF9zZXRzY2hlZHVsZXJfbm9jaGVjayh2cHAtPnRhc2ssIFNDSEVEX0ZJRk8sICZwYXJhbSk7CisKKwl2cHAtPmRpX2lidWZfbnVtID0gZGlfZ2V0X2lucHV0X2J1ZmZlcl9udW0odnBwLT5kaV9oYW5kbGUpOworCXZwcC0+ZGlfb2J1Zl9udW0gPSBkaV9nZXRfb3V0cHV0X2J1ZmZlcl9udW0odnBwLT5kaV9oYW5kbGUpOworCisJKnZwcF9oYW5kbGUgPSB2cHA7CisKKwl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX1BSSU5GTywKKwkJInZwcF93cmFwcGVyIGluaXQgYnNpemU6JWQsIGRpKGk6JWQsIG86JWQpLCB3a206JXgsIGJtOiV4LCBmbXQ6JXgsIGRybTolZCwgcHJvZzolZCwgYnlwOiVkLCBsb2NhbDolZCwgTlI6JWRcbiIsCisJCXZwcC0+YnVmX3NpemUsCisJCXZwcC0+ZGlfaWJ1Zl9udW0sCisJCXZwcC0+ZGlfb2J1Zl9udW0sCisJCXZwcC0+d29ya19tb2RlLAorCQl2cHAtPmJ1ZmZlcl9tb2RlLAorCQlpbml0Lm91dHB1dF9mb3JtYXQsCisJCWNmZy0+aXNfZHJtLAorCQljZmctPmlzX3Byb2csCisJCWNmZy0+aXNfYnlwYXNzX3AsCisJCWNmZy0+ZW5hYmxlX2xvY2FsX2J1ZiwKKwkJY2ZnLT5lbmFibGVfbnIpOworCisJcmV0dXJuIDA7CisKK2Vycm9yOToKKwl2ZnJlZSh2cHAtPml2YnBvb2wpOworZXJyb3I4OgorCWtmaWZvX2ZyZWUoJnZwcC0+aW5wdXQpOworZXJyb3I3OgorCWtmaWZvX2ZyZWUoJnZwcC0+cHJvY2Vzc2luZyk7CitlcnJvcjY6CisJdmZyZWUodnBwLT52ZnBvb2wpOworZXJyb3I1OgorCWtmaWZvX2ZyZWUoJnZwcC0+ZnJhbWUpOworZXJyb3I0OgorCXZmcmVlKHZwcC0+b3ZicG9vbCk7CitlcnJvcjM6CisJa2ZpZm9fZnJlZSgmdnBwLT5vdXRwdXQpOworZXJyb3IyOgorCWRpX2Rlc3Ryb3lfaW5zdGFuY2UodnBwLT5kaV9oYW5kbGUpOworZXJyb3I6CisJa2ZyZWUodnBwKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChhbWxfdjRsMl92cHBfaW5pdCk7CisKK2ludCBhbWxfdjRsMl92cHBfZGVzdHJveShzdHJ1Y3QgYW1sX3Y0bDJfdnBwKiB2cHApCit7CisJdjRsX2RiZyh2cHAtPmN0eCwgVjRMX0RFQlVHX1ZQUF9ERVRBSUwsCisJCSJ2cHAgZGVzdHJveSBiZWdpblxuIik7CisJdnBwLT5ydW5uaW5nID0gZmFsc2U7CisJdXAoJnZwcC0+c2VtX2luKTsKKwl1cCgmdnBwLT5zZW1fb3V0KTsKKwlrdGhyZWFkX3N0b3AodnBwLT50YXNrKTsKKworCWRpX2Rlc3Ryb3lfaW5zdGFuY2UodnBwLT5kaV9oYW5kbGUpOworCS8qIG5vIG1vcmUgdnBwIGNhbGxiYWNrIGJlbG93IHRoaXMgbGluZSAqLworCisJaWYgKHZwcC0+YnVmZmVyX21vZGUgPT0gQlVGRkVSX01PREVfQUxMT0NfQlVGKQorCQlyZWxlYXNlX0RJX2J1ZmYodnBwKTsKKworCWtmaWZvX2ZyZWUoJnZwcC0+cHJvY2Vzc2luZyk7CisJa2ZpZm9fZnJlZSgmdnBwLT5mcmFtZSk7CisJdmZyZWUodnBwLT52ZnBvb2wpOworCWtmaWZvX2ZyZWUoJnZwcC0+b3V0cHV0KTsKKwl2ZnJlZSh2cHAtPm92YnBvb2wpOworCWtmaWZvX2ZyZWUoJnZwcC0+aW5wdXQpOworCXZmcmVlKHZwcC0+aXZicG9vbCk7CisJbXV0ZXhfZGVzdHJveSgmdnBwLT5vdXRwdXRfbG9jayk7CisJdjRsX2RiZyh2cHAtPmN0eCwgVjRMX0RFQlVHX1ZQUF9ERVRBSUwsCisJCSJ2cHBfd3JhcHBlciBkZXN0cm95IGRvbmVcbiIpOworCWtmcmVlKHZwcCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYW1sX3Y0bDJfdnBwX2Rlc3Ryb3kpOworCitzdGF0aWMgaW50IGFtbF92NGwyX3ZwcF9wdXNoX3ZmcmFtZShzdHJ1Y3QgYW1sX3Y0bDJfdnBwKiB2cHAsIHN0cnVjdCB2ZnJhbWVfcyAqdmYpCit7CisJc3RydWN0IGFtbF92NGwyX3ZwcF9idWYgKmluX2J1ZjsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPSBOVUxMOworCisJaWYgKCF2cHApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFrZmlmb19nZXQoJnZwcC0+aW5wdXQsICZpbl9idWYpKSB7CisJCXY0bF9kYmcodnBwLT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJjYXQgbm90IGdldCBmcmVlIGlucHV0IGJ1ZmZlci5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisjaWYgMCAvL3RvIGRlYnVnIGRpIGJ5IGZyYW1lCisJaWYgKHZwcC0+aW5fbnVtW0lOUFVUX1BPUlRdID4gMikKKwkJcmV0dXJuIDA7CisJaWYgKHZwcC0+aW5fbnVtW0lOUFVUX1BPUlRdID09IDIpCisJCXZmLT50eXBlIHw9IFZJRFRZUEVfVjRMX0VPUzsKKyNlbmRpZgorCisJaW5fYnVmLT5kaV9idWYudmYgPSB2ZjsKKwlpbl9idWYtPmRpX2J1Zi5mbGFnID0gMDsKKwlpZiAodmYtPnR5cGUgJiBWSURUWVBFX1Y0TF9FT1MpIHsKKwkJdTMyIGR3X21vZGUgPSBWREVDX0RXX05PX0FGQkM7CisKKwkJaW5fYnVmLT5kaV9idWYuZmxhZyB8PSBESV9GTEFHX0VPUzsKKworCQlpZiAodmRlY19pZl9nZXRfcGFyYW0odnBwLT5jdHgsIEdFVF9QQVJBTV9EV19NT0RFLCAmZHdfbW9kZSkpCisJCQlyZXR1cm4gLTE7CisKKwkJdmYtPnR5cGUgfD0gdnBwLT5jdHgtPnZwcF9jZmcuaXNfcHJvZyA/CisJCQlWSURUWVBFX1BST0dSRVNTSVZFIDoKKwkJCVZJRFRZUEVfSU5URVJMQUNFOworCisJCWlmIChkd19tb2RlICE9IFZERUNfRFdfTk9fQUZCQykKKwkJCXZmLT50eXBlIHw9IFZJRFRZUEVfQ09NUFJFU1M7CisJfQorCisJZmIgPSAoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKil2Zi0+djRsX21lbV9oYW5kbGU7CisJaW5fYnVmLT5hbWxfYnVmID0gY29udGFpbmVyX29mKGZiLCBzdHJ1Y3QgYW1sX3ZpZGVvX2RlY19idWYsIGZyYW1lX2J1ZmZlcik7CisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNykgeworCQlpZiAodmYtPmNhbnZhczBfY29uZmlnWzBdLmJsb2NrX21vZGUgPT0gQ0FOVkFTX0JMS01PREVfTElORUFSKSB7CisJCQlpZiAoKHZwcC0+Y3R4LT5vdXRwdXRfcGl4X2ZtdCAhPSBWNEwyX1BJWF9GTVRfSDI2NCkgJiYKKwkJCQkodnBwLT5jdHgtPm91dHB1dF9waXhfZm10ICE9IFY0TDJfUElYX0ZNVF9NUEVHMSkgJiYKKwkJCQkodnBwLT5jdHgtPm91dHB1dF9waXhfZm10ICE9IFY0TDJfUElYX0ZNVF9NUEVHMikgJiYKKwkJCQkodnBwLT5jdHgtPm91dHB1dF9waXhfZm10ICE9IFY0TDJfUElYX0ZNVF9NUEVHNCkgJiYKKwkJCQkodnBwLT5jdHgtPm91dHB1dF9waXhfZm10ICE9IFY0TDJfUElYX0ZNVF9NSlBFRykpIHsKKwkJCQl2Zi0+ZmxhZyB8PSBWRlJBTUVfRkxBR19WSURFT19MSU5FQVI7CisJCQl9CisJCQllbHNlIHsKKwkJCQlpZiAoZmItPnN0YXR1cyA9PSBGQl9TVF9HRTJEKQorCQkJCQl2Zi0+ZmxhZyB8PSBWRlJBTUVfRkxBR19WSURFT19MSU5FQVI7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAodmYtPmNhbnZhczBfY29uZmlnWzBdLmJsb2NrX21vZGUgPT0gQ0FOVkFTX0JMS01PREVfTElORUFSKQorCQkJdmYtPmZsYWcgfD0gVkZSQU1FX0ZMQUdfVklERU9fTElORUFSOworCX0KKworCXY0bF9kYmcodnBwLT5jdHgsIFY0TF9ERUJVR19WUFBfQlVGTUdSLAorCQkidnBwX3B1c2hfdmZyYW1lOiBpZHg6JWQsIHZmOiVweCwgaWR4OiVkLCB0eXBlOiV4LCB0czolbGxkXG4iLAorCQlmYi0+YnVmX2lkeCwgdmYsIHZmLT5pbmRleCwgdmYtPnR5cGUsIHZmLT50aW1lc3RhbXApOworCisJZG8geworCQl1bnNpZ25lZCBpbnQgZHdfbW9kZSA9IFZERUNfRFdfTk9fQUZCQzsKKwkJc3RydWN0IGZpbGUgKmZwOworCisJCWlmICghZHVtcF92cHBfaW5wdXQgfHwgdnBwLT5jdHgtPmlzX2RybV9tb2RlKQorCQkJYnJlYWs7CisJCWlmICh2ZGVjX2lmX2dldF9wYXJhbSh2cHAtPmN0eCwgR0VUX1BBUkFNX0RXX01PREUsICZkd19tb2RlKSkKKwkJCWJyZWFrOworCQlpZiAoZHdfbW9kZSA9PSBWREVDX0RXX0FGQkNfT05MWSkKKwkJCWJyZWFrOworCisJCWZwID0gZmlscF9vcGVuKCIvZGF0YS9kZWNfZHVtcF9iZWZvcmUucmF3IiwKKwkJCQlPX0NSRUFUIHwgT19SRFdSIHwgT19MQVJHRUZJTEUgfCBPX0FQUEVORCwgMDYwMCk7CisJCWlmICghSVNfRVJSKGZwKSkgeworCQkJc3RydWN0IHZiMl9idWZmZXIgKnZiID0gJmluX2J1Zi0+YW1sX2J1Zi0+dmIudmIyX2J1ZjsKKworCQkJa2VybmVsX3dyaXRlKGZwLHZiMl9wbGFuZV92YWRkcih2YiwgMCksdmItPnBsYW5lc1swXS5sZW5ndGgsIDApOworCQkJaWYgKGluX2J1Zi0+YW1sX2J1Zi0+ZnJhbWVfYnVmZmVyLm51bV9wbGFuZXMgPT0gMikKKwkJCQlrZXJuZWxfd3JpdGUoZnAsdmIyX3BsYW5lX3ZhZGRyKHZiLCAxKSwKKwkJCQkJCXZiLT5wbGFuZXNbMV0ubGVuZ3RoLCAwKTsKKwkJCWR1bXBfdnBwX2lucHV0LS07CisJCQlmaWxwX2Nsb3NlKGZwLCBOVUxMKTsKKwkJfQorCX0gd2hpbGUoMCk7CisKKwlBVFJBQ0VfQ09VTlRFUigiVkNfT1VUX1ZQUC0wLnJlY2VpdmUiLCBmYi0+YnVmX2lkeCk7CisKKwlrZmlmb19wdXQoJnZwcC0+aW5fZG9uZV9xLCBpbl9idWYpOworCXVwKCZ2cHAtPnNlbV9pbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZmlsbF92cHBfYnVmX2NiKHZvaWQgKnY0bF9jdHgsIHZvaWQgKmZiX2N0eCkKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKil2NGxfY3R4OworCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9CisJCShzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqKWZiX2N0eDsKKwlpbnQgcmV0ID0gLTE7CisKKwlyZXQgPSBhbWxfdjRsMl92cHBfcHVzaF92ZnJhbWUoY3R4LT52cHAsIGZiLT52ZnJhbWUpOworCWlmIChyZXQgPCAwKSB7CisJCXY0bF9kYmcoY3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkidnBwIHB1c2ggdmZyYW1lIGVyciwgcmV0OiAlZFxuIiwgcmV0KTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGFza19vcHNfcyB2cHBfb3BzID0geworCS50eXBlCQk9IFRBU0tfVFlQRV9WUFAsCisJLmdldF92ZnJhbWUJPSB2cHBfdmZfZ2V0LAorCS5wdXRfdmZyYW1lCT0gdnBwX3ZmX3B1dCwKKwkuZmlsbF9idWZmZXIJPSBmaWxsX3ZwcF9idWZfY2IsCit9OworCitzdHJ1Y3QgdGFza19vcHNfcyAqZ2V0X3ZwcF9vcHModm9pZCkKK3sKKwlyZXR1cm4gJnZwcF9vcHM7Cit9CitFWFBPUlRfU1lNQk9MKGdldF92cHBfb3BzKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbXZkZWNfcG9ydHMvYW1sX3Zjb2RlY192cHAuaCBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2FtbF92Y29kZWNfdnBwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E1NzcxZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2FtbF92Y29kZWNfdnBwLmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAyMCBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisqIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyoKKyogRGVzY3JpcHRpb246CisqLworI2lmbmRlZiBfQU1MX1ZDT0RFQ19WUFBfSF8KKyNkZWZpbmUgX0FNTF9WQ09ERUNfVlBQX0hfCisKKyNkZWZpbmUgU1VQUE9SVF9WNExfVlBQCisKKyNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgorI2lmZGVmIFNVUFBPUlRfVjRMX1ZQUAorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZGkvZGlfaW50ZXJmYWNlLmg+CisjZW5kaWYKKyNpbmNsdWRlICJhbWxfdmNvZGVjX2Rydi5oIgorI2luY2x1ZGUgImFtbF92Y29kZWNfZGVjLmgiCisKK2VudW0gdnBwX3dvcmtfbW9kZSB7CisJVlBQX01PREVfREksCisJVlBQX01PREVfQ09MT1JfQ09OViwKKwlWUFBfTU9ERV9OT0lTRV9SRURVQywKKwlWUFBfTU9ERV9ESV9MT0NBTCA9IDB4ODEsCisJVlBQX01PREVfQ09MT1JfQ09OVl9MT0NBTCA9IDB4ODIsCisJVlBQX01PREVfTk9JU0VfUkVEVUNfTE9DQUwgPSAweDgzLAorCVZQUF9NT0RFX01BWCA9IDB4ZmYKK307CisKKyNkZWZpbmUgVlBQX0ZSQU1FX1NJWkUgNjQKKworc3RydWN0IGFtbF92NGwyX3ZwcF9idWYgeworI2lmZGVmIFNVUFBPUlRfVjRMX1ZQUAorCXN0cnVjdCBkaV9idWZmZXIgZGlfYnVmOworCXN0cnVjdCBkaV9idWZmZXIgKmRpX2xvY2FsX2J1ZjsKKyNlbmRpZgorCXN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1ZiAqYW1sX2J1ZjsKKwlzdHJ1Y3QgYW1sX3Y0bDJfdnBwX2J1ZiAqaW5idWY7Cit9OworCitzdHJ1Y3QgYW1sX3Y0bDJfdnBwIHsKKwlpbnQgZGlfaGFuZGxlOyAvKiBoYW5kbGUgb2YgREkgKi8KKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eDsKKwl1MzIgYnVmX3NpemU7IC8qIGJ1ZmZlciBzaXplIGZvciB2cHAgKi8KKwl1MzIgd29ya19tb2RlOyAvKiBlbnVtIHZwcF93b3JrX21vZGUgKi8KKwl1MzIgYnVmZmVyX21vZGU7CisKKwlERUNMQVJFX0tGSUZPX1BUUihpbnB1dCwgdHlwZW9mKHN0cnVjdCBhbWxfdjRsMl92cHBfYnVmKikpOworCURFQ0xBUkVfS0ZJRk9fUFRSKG91dHB1dCwgdHlwZW9mKHN0cnVjdCBhbWxfdjRsMl92cHBfYnVmKikpOworCURFQ0xBUkVfS0ZJRk9fUFRSKHByb2Nlc3NpbmcsIHR5cGVvZihzdHJ1Y3QgYW1sX3Y0bDJfdnBwX2J1ZiopKTsKKwlERUNMQVJFX0tGSUZPX1BUUihmcmFtZSwgdHlwZW9mKHN0cnVjdCB2ZnJhbWVfcyAqKSk7CisJREVDTEFSRV9LRklGTyhvdXRfZG9uZV9xLCBzdHJ1Y3QgYW1sX3Y0bDJfdnBwX2J1ZiAqLCBWUFBfRlJBTUVfU0laRSk7CisJREVDTEFSRV9LRklGTyhpbl9kb25lX3EsIHN0cnVjdCBhbWxfdjRsMl92cHBfYnVmICosIFZQUF9GUkFNRV9TSVpFKTsKKworCXN0cnVjdCB2ZnJhbWVfcyAqdmZwb29sOworCXN0cnVjdCBhbWxfdjRsMl92cHBfYnVmICpvdmJwb29sOworCXN0cnVjdCBhbWxfdjRsMl92cHBfYnVmICppdmJwb29sOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwlib29sIHJ1bm5pbmc7CisJc3RydWN0IHNlbWFwaG9yZSBzZW1faW4sIHNlbV9vdXQ7CisKKwkvKiBJbiBwIHRvIGkgdHJhbnNpdGlvbiwgb3V0cHV0L2ZyYW1lIGNhbiBiZSBtdWx0aSB3cml0ZXIgKi8KKwlzdHJ1Y3QgbXV0ZXggb3V0cHV0X2xvY2s7CisKKwkvKiBmb3IgZGVidWdnaW5nICovCisJLyoKKwkgKiBpblswXSAtLT4gdnBwIDwtLSBpblsxXQorCSAqIG91dFswXTwtLSB2cHAgLS0+IG91dFsxXQorCSAqLworCWludCBpbl9udW1bMl07CisJaW50IG91dF9udW1bMl07CisJdWxvbmcgZmJfdG9rZW47CisKKwlib29sIGlzX3Byb2c7CisJYm9vbCBpc19ieXBhc3NfcDsKKwlpbnQgZGlfaWJ1Zl9udW07CisJaW50IGRpX29idWZfbnVtOworfTsKKworc3RydWN0IHRhc2tfb3BzX3MgKmdldF92cHBfb3BzKHZvaWQpOworCisjaWZkZWYgU1VQUE9SVF9WNExfVlBQCisvKiBnZXQgbnVtYmVyIG9mIGJ1ZmZlciBuZWVkZWQgZm9yIGEgd29ya2luZyBtb2RlICovCitpbnQgYW1sX3Y0bDJfdnBwX2dldF9idWZfbnVtKHUzMiBtb2RlKTsKK2ludCBhbWxfdjRsMl92cHBfaW5pdCgKKwkJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsCisJCXN0cnVjdCBhbWxfdnBwX2NmZ19pbmZvcyAqY2ZnLAorCQlzdHJ1Y3QgYW1sX3Y0bDJfdnBwKiogdnBwX2hhbmRsZSk7CitpbnQgYW1sX3Y0bDJfdnBwX2Rlc3Ryb3koc3RydWN0IGFtbF92NGwyX3ZwcCogdnBwKTsKK2ludCBhbWxfdjRsMl92cHBfcmVzZXQoc3RydWN0IGFtbF92NGwyX3ZwcCAqdnBwKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBhbWxfdjRsMl92cHBfZ2V0X2J1Zl9udW0odTMyIG1vZGUpIHsgcmV0dXJuIC0xOyB9CitzdGF0aWMgaW5saW5lIGludCBhbWxfdjRsMl92cHBfaW5pdCgKKwkJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsCisJCXN0cnVjdCBhbWxfdnBwX2NmZ19pbmZvcyAqY2ZnLAorCQlzdHJ1Y3QgYW1sX3Y0bDJfdnBwKiogdnBwX2hhbmRsZSkgeyByZXR1cm4gLTE7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGFtbF92NGwyX3ZwcF9kZXN0cm95KHN0cnVjdCBhbWxfdjRsMl92cHAqIHZwcCkgeyByZXR1cm4gLTE7IH0KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2RlY29kZXIvYW1sX2gyNjRfcGFyc2VyLmMgYi9kcml2ZXJzL2FtdmRlY19wb3J0cy9kZWNvZGVyL2FtbF9oMjY0X3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZDAxOTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FtdmRlY19wb3J0cy9kZWNvZGVyL2FtbF9oMjY0X3BhcnNlci5jCkBAIC0wLDAgKzEsNzEzIEBACisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworI2luY2x1ZGUgImFtbF9oMjY0X3BhcnNlci5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2dldF9iaXRzLmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvcHV0X2JpdHMuaCIKKyNpbmNsdWRlICIuLi91dGlscy9nb2xvbWIuaCIKKyNpbmNsdWRlICIuLi91dGlscy9jb21tb24uaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCisjZGVmaW5lIE1BWF9ERUxBWUVEX1BJQ19DT1VOVAkoMTYpCisjZGVmaW5lIE1BWF9MT0cyX01BWF9GUkFNRV9OVU0JKDEyICsgNCkKKyNkZWZpbmUgTUlOX0xPRzJfTUFYX0ZSQU1FX05VTQkoNCkKKyNkZWZpbmUgTUFYX1NQU19DT1VOVAkJKDMyKQorI2RlZmluZSBFWFRFTkRFRF9TQVIJCSgyNTUpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmF0aW9uYWwgaDI2NF9waXhlbF9hc3BlY3RbMTddID0geworCXsgICAwLCAgMSB9LAorCXsgICAxLCAgMSB9LAorCXsgIDEyLCAxMSB9LAorCXsgIDEwLCAxMSB9LAorCXsgIDE2LCAxMSB9LAorCXsgIDQwLCAzMyB9LAorCXsgIDI0LCAxMSB9LAorCXsgIDIwLCAxMSB9LAorCXsgIDMyLCAxMSB9LAorCXsgIDgwLCAzMyB9LAorCXsgIDE4LCAxMSB9LAorCXsgIDE1LCAxMSB9LAorCXsgIDY0LCAzMyB9LAorCXsgMTYwLCA5OSB9LAorCXsgICA0LCAgMyB9LAorCXsgICAzLCAgMiB9LAorCXsgICAyLCAgMSB9LAorfTsKKworLyogbWF4aW11bSBudW1iZXIgb2YgTUJzIGluIHRoZSBEUEIgZm9yIGEgZ2l2ZW4gbGV2ZWwgKi8KK3N0YXRpYyBjb25zdCBpbnQgbGV2ZWxfbWF4X2RwYl9tYnNbXVsyXSA9IHsKKwl7IDEwLCAzOTYJfSwKKwl7IDExLCA5MDAJfSwKKwl7IDEyLCAyMzc2CX0sCisJeyAxMywgMjM3Ngl9LAorCXsgMjAsIDIzNzYJfSwKKwl7IDIxLCA0NzUyCX0sCisJeyAyMiwgODEwMAl9LAorCXsgMzAsIDgxMDAJfSwKKwl7IDMxLCAxODAwMCAJfSwKKwl7IDMyLCAyMDQ4MCAJfSwKKwl7IDQwLCAzMjc2OCAJfSwKKwl7IDQxLCAzMjc2OCAJfSwKKwl7IDQyLCAzNDgxNiAJfSwKKwl7IDUwLCAxMTA0MDAJfSwKKwl7IDUxLCAxODQzMjAJfSwKKwl7IDUyLCAxODQzMjAJfSwKK307CisKK3N0YXRpYyBjb25zdCB1OCBkZWZhdWx0X3NjYWxpbmc0WzJdWzE2XSA9IHsKKwl7ICA2LCAxMywgMjAsIDI4LCAxMywgMjAsIDI4LCAzMiwKKwkgIDIwLCAyOCwgMzIsIDM3LCAyOCwgMzIsIDM3LCA0Mn0sCisJeyAxMCwgMTQsIDIwLCAyNCwgMTQsIDIwLCAyNCwgMjcsCisJICAyMCwgMjQsIDI3LCAzMCwgMjQsIDI3LCAzMCwgMzQgfQorfTsKKworc3RhdGljIGNvbnN0IHU4IGRlZmF1bHRfc2NhbGluZzhbMl1bNjRdID0geworCXsgIDYsIDEwLCAxMywgMTYsIDE4LCAyMywgMjUsIDI3LAorCSAgMTAsIDExLCAxNiwgMTgsIDIzLCAyNSwgMjcsIDI5LAorCSAgMTMsIDE2LCAxOCwgMjMsIDI1LCAyNywgMjksIDMxLAorCSAgMTYsIDE4LCAyMywgMjUsIDI3LCAyOSwgMzEsIDMzLAorCSAgMTgsIDIzLCAyNSwgMjcsIDI5LCAzMSwgMzMsIDM2LAorCSAgMjMsIDI1LCAyNywgMjksIDMxLCAzMywgMzYsIDM4LAorCSAgMjUsIDI3LCAyOSwgMzEsIDMzLCAzNiwgMzgsIDQwLAorCSAgMjcsIDI5LCAzMSwgMzMsIDM2LCAzOCwgNDAsIDQyIH0sCisJeyAgOSwgMTMsIDE1LCAxNywgMTksIDIxLCAyMiwgMjQsCisJICAxMywgMTMsIDE3LCAxOSwgMjEsIDIyLCAyNCwgMjUsCisJICAxNSwgMTcsIDE5LCAyMSwgMjIsIDI0LCAyNSwgMjcsCisJICAxNywgMTksIDIxLCAyMiwgMjQsIDI1LCAyNywgMjgsCisJICAxOSwgMjEsIDIyLCAyNCwgMjUsIDI3LCAyOCwgMzAsCisJICAyMSwgMjIsIDI0LCAyNSwgMjcsIDI4LCAzMCwgMzIsCisJICAyMiwgMjQsIDI1LCAyNywgMjgsIDMwLCAzMiwgMzMsCisJICAyNCwgMjUsIDI3LCAyOCwgMzAsIDMyLCAzMywgMzUgfQorfTsKKworZXh0ZXJuIGNvbnN0IHU4IGZmX3ppZ3phZ19zY2FuWzE2ICsgMV07CitleHRlcm4gY29uc3QgdTggZmZfemlnemFnX2RpcmVjdFs2NF07CisKK3N0YXRpYyBpbnQgZGVjb2RlX3NjYWxpbmdfbGlzdChzdHJ1Y3QgZ2V0X2JpdHNfY29udGV4dCAqZ2IsCisJdTggKmZhY3RvcnMsIGludCBzaXplLAorCWNvbnN0IHU4ICpqdnRfbGlzdCwKKwljb25zdCB1OCAqZmFsbGJhY2tfbGlzdCkKK3sKKwlpbnQgaSwgbGFzdCA9IDgsIG5leHQgPSA4OworCWNvbnN0IHU4ICpzY2FuID0gc2l6ZSA9PSAxNiA/IGZmX3ppZ3phZ19zY2FuIDogZmZfemlnemFnX2RpcmVjdDsKKworCWlmICghZ2V0X2JpdHMxKGdiKSkgLyogbWF0cml4IG5vdCB3cml0dGVuLCB3ZSB1c2UgdGhlIHByZWRpY3RlZCBvbmUgKi8KKwkJbWVtY3B5KGZhY3RvcnMsIGZhbGxiYWNrX2xpc3QsIHNpemUgKiBzaXplb2YodTgpKTsKKwllbHNlCisJCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCWlmIChuZXh0KSB7CisJCQkJaW50IHYgPSBnZXRfc2VfZ29sb21iKGdiKTsKKwkJCQkvKmlmICh2IDwgLTEyOCB8fCB2ID4gMTI3KSB7IC8vSk0xOSBoYXMgbm90IGNoZWNrLgorCQkJCQlwcl9lcnIoICJkZWx0YSBzY2FsZSAlZCBpcyBpbnZhbGlkXG4iLCB2KTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0qLworCQkJCW5leHQgPSAobGFzdCArIHYpICYgMHhmZjsKKwkJCX0KKwkJCWlmICghaSAmJiAhbmV4dCkgeyAvKiBtYXRyaXggbm90IHdyaXR0ZW4sIHdlIHVzZSB0aGUgcHJlc2V0IG9uZSAqLworCQkJCW1lbWNweShmYWN0b3JzLCBqdnRfbGlzdCwgc2l6ZSAqIHNpemVvZih1OCkpOworCQkJCWJyZWFrOworCQkJfQorCQkJbGFzdCA9IGZhY3RvcnNbc2NhbltpXV0gPSBuZXh0ID8gbmV4dCA6IGxhc3Q7CisJCX0KKwlyZXR1cm4gMDsKK30KKworLyogcmV0dXJucyBub24gemVybyBpZiB0aGUgcHJvdmlkZWQgU1BTIHNjYWxpbmcgbWF0cml4IGhhcyBiZWVuIGZpbGxlZCAqLworc3RhdGljIGludCBkZWNvZGVfc2NhbGluZ19tYXRyaWNlcyhzdHJ1Y3QgZ2V0X2JpdHNfY29udGV4dCAqZ2IsCisJY29uc3Qgc3RydWN0IGgyNjRfU1BTX3QgKnNwcywKKwljb25zdCBzdHJ1Y3QgaDI2NF9QUFNfdCAqcHBzLCBpbnQgaXNfc3BzLAorCXU4KCpzY2FsaW5nX21hdHJpeDQpWzE2XSwKKwl1OCgqc2NhbGluZ19tYXRyaXg4KVs2NF0pCit7CisJaW50IHJldCA9IDA7CisJaW50IGZhbGxiYWNrX3NwcyA9ICFpc19zcHMgJiYgc3BzLT5zY2FsaW5nX21hdHJpeF9wcmVzZW50OworCWNvbnN0IHU4ICpmYWxsYmFja1s0XSA9IHsKKwkJZmFsbGJhY2tfc3BzID8gc3BzLT5zY2FsaW5nX21hdHJpeDRbMF0gOiBkZWZhdWx0X3NjYWxpbmc0WzBdLAorCQlmYWxsYmFja19zcHMgPyBzcHMtPnNjYWxpbmdfbWF0cml4NFszXSA6IGRlZmF1bHRfc2NhbGluZzRbMV0sCisJCWZhbGxiYWNrX3NwcyA/IHNwcy0+c2NhbGluZ19tYXRyaXg4WzBdIDogZGVmYXVsdF9zY2FsaW5nOFswXSwKKwkJZmFsbGJhY2tfc3BzID8gc3BzLT5zY2FsaW5nX21hdHJpeDhbM10gOiBkZWZhdWx0X3NjYWxpbmc4WzFdCisJfTsKKworCWlmIChnZXRfYml0czEoZ2IpKSB7CisJCXJldCB8PSBkZWNvZGVfc2NhbGluZ19saXN0KGdiLCBzY2FsaW5nX21hdHJpeDRbMF0sIDE2LCBkZWZhdWx0X3NjYWxpbmc0WzBdLCBmYWxsYmFja1swXSk7ICAgICAgICAvLyBJbnRyYSwgWQorCQlyZXQgfD0gZGVjb2RlX3NjYWxpbmdfbGlzdChnYiwgc2NhbGluZ19tYXRyaXg0WzFdLCAxNiwgZGVmYXVsdF9zY2FsaW5nNFswXSwgc2NhbGluZ19tYXRyaXg0WzBdKTsgLy8gSW50cmEsIENyCisJCXJldCB8PSBkZWNvZGVfc2NhbGluZ19saXN0KGdiLCBzY2FsaW5nX21hdHJpeDRbMl0sIDE2LCBkZWZhdWx0X3NjYWxpbmc0WzBdLCBzY2FsaW5nX21hdHJpeDRbMV0pOyAvLyBJbnRyYSwgQ2IKKwkJcmV0IHw9IGRlY29kZV9zY2FsaW5nX2xpc3QoZ2IsIHNjYWxpbmdfbWF0cml4NFszXSwgMTYsIGRlZmF1bHRfc2NhbGluZzRbMV0sIGZhbGxiYWNrWzFdKTsgICAgICAgIC8vIEludGVyLCBZCisJCXJldCB8PSBkZWNvZGVfc2NhbGluZ19saXN0KGdiLCBzY2FsaW5nX21hdHJpeDRbNF0sIDE2LCBkZWZhdWx0X3NjYWxpbmc0WzFdLCBzY2FsaW5nX21hdHJpeDRbM10pOyAvLyBJbnRlciwgQ3IKKwkJcmV0IHw9IGRlY29kZV9zY2FsaW5nX2xpc3QoZ2IsIHNjYWxpbmdfbWF0cml4NFs1XSwgMTYsIGRlZmF1bHRfc2NhbGluZzRbMV0sIHNjYWxpbmdfbWF0cml4NFs0XSk7IC8vIEludGVyLCBDYgorCQlpZiAoaXNfc3BzIHx8IHBwcy0+dHJhbnNmb3JtXzh4OF9tb2RlKSB7CisJCQlyZXQgfD0gZGVjb2RlX3NjYWxpbmdfbGlzdChnYiwgc2NhbGluZ19tYXRyaXg4WzBdLCA2NCwgZGVmYXVsdF9zY2FsaW5nOFswXSwgZmFsbGJhY2tbMl0pOyAvLyBJbnRyYSwgWQorCQkJcmV0IHw9IGRlY29kZV9zY2FsaW5nX2xpc3QoZ2IsIHNjYWxpbmdfbWF0cml4OFszXSwgNjQsIGRlZmF1bHRfc2NhbGluZzhbMV0sIGZhbGxiYWNrWzNdKTsgLy8gSW50ZXIsIFkKKwkJCWlmIChzcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDMpIHsKKwkJCQlyZXQgfD0gZGVjb2RlX3NjYWxpbmdfbGlzdChnYiwgc2NhbGluZ19tYXRyaXg4WzFdLCA2NCwgZGVmYXVsdF9zY2FsaW5nOFswXSwgc2NhbGluZ19tYXRyaXg4WzBdKTsgLy8gSW50cmEsIENyCisJCQkJcmV0IHw9IGRlY29kZV9zY2FsaW5nX2xpc3QoZ2IsIHNjYWxpbmdfbWF0cml4OFs0XSwgNjQsIGRlZmF1bHRfc2NhbGluZzhbMV0sIHNjYWxpbmdfbWF0cml4OFszXSk7IC8vIEludGVyLCBDcgorCQkJCXJldCB8PSBkZWNvZGVfc2NhbGluZ19saXN0KGdiLCBzY2FsaW5nX21hdHJpeDhbMl0sIDY0LCBkZWZhdWx0X3NjYWxpbmc4WzBdLCBzY2FsaW5nX21hdHJpeDhbMV0pOyAvLyBJbnRyYSwgQ2IKKwkJCQlyZXQgfD0gZGVjb2RlX3NjYWxpbmdfbGlzdChnYiwgc2NhbGluZ19tYXRyaXg4WzVdLCA2NCwgZGVmYXVsdF9zY2FsaW5nOFsxXSwgc2NhbGluZ19tYXRyaXg4WzRdKTsgLy8gSW50ZXIsIENiCisJCQl9CisJCX0KKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBpc19zcHM7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkZWNvZGVfaHJkX3BhcmFtZXRlcnMoc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKmdiLAorCXN0cnVjdCBoMjY0X1NQU190ICpzcHMpCit7CisJaW50IGNwYl9jb3VudCwgaTsKKworCWNwYl9jb3VudCA9IGdldF91ZV9nb2xvbWJfMzEoZ2IpICsgMTsKKwlpZiAoY3BiX2NvdW50ID4gMzJVKSB7CisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJImNwYl9jb3VudCAlZCBpbnZhbGlkXG4iLCBjcGJfY291bnQpOworCQlyZXR1cm4gLTE7CisJfQorCisJZ2V0X2JpdHMoZ2IsIDQpOyAvKiBiaXRfcmF0ZV9zY2FsZSAqLworCWdldF9iaXRzKGdiLCA0KTsgLyogY3BiX3NpemVfc2NhbGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY3BiX2NvdW50OyBpKyspIHsKKwkJZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsgLyogYml0X3JhdGVfdmFsdWVfbWludXMxICovCisJCWdldF91ZV9nb2xvbWJfbG9uZyhnYik7IC8qIGNwYl9zaXplX3ZhbHVlX21pbnVzMSAqLworCQlnZXRfYml0czEoZ2IpOwkJLyogY2JyX2ZsYWcgKi8KKwl9CisKKwlzcHMtPmluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoID0gZ2V0X2JpdHMoZ2IsIDUpICsgMTsKKwlzcHMtPmNwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aAkgID0gZ2V0X2JpdHMoZ2IsIDUpICsgMTsKKwlzcHMtPmRwYl9vdXRwdXRfZGVsYXlfbGVuZ3RoCSAgPSBnZXRfYml0cyhnYiwgNSkgKyAxOworCXNwcy0+dGltZV9vZmZzZXRfbGVuZ3RoCQkgID0gZ2V0X2JpdHMoZ2IsIDUpOworCXNwcy0+Y3BiX2NudAkJCSAgPSBjcGJfY291bnQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfdnVpX3BhcmFtZXRlcnMoc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKmdiLCAgc3RydWN0IGgyNjRfU1BTX3QgKnNwcykKK3sKKwlpbnQgYXNwZWN0X3JhdGlvX2luZm9fcHJlc2VudF9mbGFnOworCXUzMiBhc3BlY3RfcmF0aW9faWRjOworCisJYXNwZWN0X3JhdGlvX2luZm9fcHJlc2VudF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKworCWlmIChhc3BlY3RfcmF0aW9faW5mb19wcmVzZW50X2ZsYWcpIHsKKwkJYXNwZWN0X3JhdGlvX2lkYyA9IGdldF9iaXRzKGdiLCA4KTsKKwkJaWYgKGFzcGVjdF9yYXRpb19pZGMgPT0gRVhURU5ERURfU0FSKSB7CisJCQlzcHMtPnNhci5udW0gPSBnZXRfYml0cyhnYiwgMTYpOworCQkJc3BzLT5zYXIuZGVuID0gZ2V0X2JpdHMoZ2IsIDE2KTsKKwkJfSBlbHNlIGlmIChhc3BlY3RfcmF0aW9faWRjIDwgQVJSQVlfU0laRShoMjY0X3BpeGVsX2FzcGVjdCkpIHsKKwkJCXNwcy0+c2FyID0gaDI2NF9waXhlbF9hc3BlY3RbYXNwZWN0X3JhdGlvX2lkY107CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9IGVsc2UgeworCQlzcHMtPnNhci5udW0gPQorCQlzcHMtPnNhci5kZW4gPSAwOworCX0KKworCWlmIChnZXRfYml0czEoZ2IpKSAgICAgIC8qIG92ZXJzY2FuX2luZm9fcHJlc2VudF9mbGFnICovCisJCWdldF9iaXRzMShnYik7ICAvKiBvdmVyc2Nhbl9hcHByb3ByaWF0ZV9mbGFnICovCisKKwlzcHMtPnZpZGVvX3NpZ25hbF90eXBlX3ByZXNlbnRfZmxhZyA9IGdldF9iaXRzMShnYik7CisJaWYgKHNwcy0+dmlkZW9fc2lnbmFsX3R5cGVfcHJlc2VudF9mbGFnKSB7CisJCWdldF9iaXRzKGdiLCAzKTsgICAgICAgICAgICAgICAgIC8qIHZpZGVvX2Zvcm1hdCAqLworCQlzcHMtPmZ1bGxfcmFuZ2UgPSBnZXRfYml0czEoZ2IpOyAvKiB2aWRlb19mdWxsX3JhbmdlX2ZsYWcgKi8KKworCQlzcHMtPmNvbG91cl9kZXNjcmlwdGlvbl9wcmVzZW50X2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCQlpZiAoc3BzLT5jb2xvdXJfZGVzY3JpcHRpb25fcHJlc2VudF9mbGFnKSB7CisJCQlzcHMtPmNvbG9yX3ByaW1hcmllcyA9IGdldF9iaXRzKGdiLCA4KTsgLyogY29sb3VyX3ByaW1hcmllcyAqLworCQkJc3BzLT5jb2xvcl90cmMgICAgICAgPSBnZXRfYml0cyhnYiwgOCk7IC8qIHRyYW5zZmVyX2NoYXJhY3RlcmlzdGljcyAqLworCQkJc3BzLT5jb2xvcnNwYWNlICAgICAgPSBnZXRfYml0cyhnYiwgOCk7IC8qIG1hdHJpeF9jb2VmZmljaWVudHMgKi8KKworCQkJLy8gU2V0IGludmFsaWQgdmFsdWVzIHRvICJ1bnNwZWNpZmllZCIKKwkJCWlmICghYXZfY29sb3JfcHJpbWFyaWVzX25hbWUoc3BzLT5jb2xvcl9wcmltYXJpZXMpKQorCQkJCXNwcy0+Y29sb3JfcHJpbWFyaWVzID0gQVZDT0xfUFJJX1VOU1BFQ0lGSUVEOworCQkJaWYgKCFhdl9jb2xvcl90cmFuc2Zlcl9uYW1lKHNwcy0+Y29sb3JfdHJjKSkKKwkJCQlzcHMtPmNvbG9yX3RyYyA9IEFWQ09MX1RSQ19VTlNQRUNJRklFRDsKKwkJCWlmICghYXZfY29sb3Jfc3BhY2VfbmFtZShzcHMtPmNvbG9yc3BhY2UpKQorCQkJCXNwcy0+Y29sb3JzcGFjZSA9IEFWQ09MX1NQQ19VTlNQRUNJRklFRDsKKwkJfQorCX0KKworCS8qIGNocm9tYV9sb2NhdGlvbl9pbmZvX3ByZXNlbnRfZmxhZyAqLworCWlmIChnZXRfYml0czEoZ2IpKSB7CisJCS8qIGNocm9tYV9zYW1wbGVfbG9jYXRpb25fdHlwZV90b3BfZmllbGQgKi8KKwkJLy9hdmN0eC0+Y2hyb21hX3NhbXBsZV9sb2NhdGlvbiA9IGdldF91ZV9nb2xvbWIoZ2IpICsgMTsKKwkJZ2V0X3VlX2dvbG9tYihnYik7ICAvKiBjaHJvbWFfc2FtcGxlX2xvY2F0aW9uX3R5cGVfYm90dG9tX2ZpZWxkICovCisJfQorCisJaWYgKHNob3dfYml0czEoZ2IpICYmIGdldF9iaXRzX2xlZnQoZ2IpIDwgMTApIHsKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLCAiVHJ1bmNhdGVkIFZVSVxuIik7CisJCXJldHVybiAwOworCX0KKworCXNwcy0+dGltaW5nX2luZm9fcHJlc2VudF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKwlpZiAoc3BzLT50aW1pbmdfaW5mb19wcmVzZW50X2ZsYWcpIHsKKwkJdW5zaWduZWQgbnVtX3VuaXRzX2luX3RpY2sgPSBnZXRfYml0c19sb25nKGdiLCAzMik7CisJCXVuc2lnbmVkIHRpbWVfc2NhbGUgICAgICAgID0gZ2V0X2JpdHNfbG9uZyhnYiwgMzIpOworCQlpZiAoIW51bV91bml0c19pbl90aWNrIHx8ICF0aW1lX3NjYWxlKSB7CisJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsCisJCQkJInRpbWVfc2NhbGUvbnVtX3VuaXRzX2luX3RpY2sgaW52YWxpZCBvciB1bnN1cHBvcnRlZCAoJXUvJXUpXG4iLAorCQkJCXRpbWVfc2NhbGUsIG51bV91bml0c19pbl90aWNrKTsKKwkJCXNwcy0+dGltaW5nX2luZm9fcHJlc2VudF9mbGFnID0gMDsKKwkJfSBlbHNlIHsKKwkJCXNwcy0+bnVtX3VuaXRzX2luX3RpY2sgPSBudW1fdW5pdHNfaW5fdGljazsKKwkJCXNwcy0+dGltZV9zY2FsZSA9IHRpbWVfc2NhbGU7CisJCX0KKwkJc3BzLT5maXhlZF9mcmFtZV9yYXRlX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCX0KKworCXNwcy0+bmFsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyA9IGdldF9iaXRzMShnYik7CisJaWYgKHNwcy0+bmFsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZykKKwkJaWYgKGRlY29kZV9ocmRfcGFyYW1ldGVycyhnYiwgc3BzKSA8IDApCisJCQlyZXR1cm4gLTE7CisJc3BzLT52Y2xfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKwlpZiAoc3BzLT52Y2xfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnKQorCQlpZiAoZGVjb2RlX2hyZF9wYXJhbWV0ZXJzKGdiLCBzcHMpIDwgMCkKKwkJCXJldHVybiAtMTsKKwlpZiAoc3BzLT5uYWxfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnIHx8CisJCXNwcy0+dmNsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZykKKwkJZ2V0X2JpdHMxKGdiKTsgICAgIC8qIGxvd19kZWxheV9ocmRfZmxhZyAqLworCXNwcy0+cGljX3N0cnVjdF9wcmVzZW50X2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCWlmICghZ2V0X2JpdHNfbGVmdChnYikpCisJCXJldHVybiAwOworCXNwcy0+Yml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCWlmIChzcHMtPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnKSB7CisJCWdldF9iaXRzMShnYik7ICAgICAvKiBtb3Rpb25fdmVjdG9yc19vdmVyX3BpY19ib3VuZGFyaWVzX2ZsYWcgKi8KKwkJZ2V0X3VlX2dvbG9tYihnYik7IC8qIG1heF9ieXRlc19wZXJfcGljX2Rlbm9tICovCisJCWdldF91ZV9nb2xvbWIoZ2IpOyAvKiBtYXhfYml0c19wZXJfbWJfZGVub20gKi8KKwkJZ2V0X3VlX2dvbG9tYihnYik7IC8qIGxvZzJfbWF4X212X2xlbmd0aF9ob3Jpem9udGFsICovCisJCWdldF91ZV9nb2xvbWIoZ2IpOyAvKiBsb2cyX21heF9tdl9sZW5ndGhfdmVydGljYWwgKi8KKwkJc3BzLT5udW1fcmVvcmRlcl9mcmFtZXMgPSBnZXRfdWVfZ29sb21iKGdiKTsKKwkJc3BzLT5tYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZyA9IGdldF91ZV9nb2xvbWIoZ2IpOyAvKm1heF9kZWNfZnJhbWVfYnVmZmVyaW5nKi8KKworCQlpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCAwKSB7CisJCQlzcHMtPm51bV9yZW9yZGVyX2ZyYW1lcyAgICAgICAgID0gMDsKKwkJCXNwcy0+Yml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcgPSAwOworCQl9CisKKwkJaWYgKHNwcy0+bnVtX3Jlb3JkZXJfZnJhbWVzID4gMTZVCisJCQkvKiBtYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZyB8fCBtYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZyA+IDE2ICovKSB7CisJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCQkiQ2xpcHBpbmcgaWxsZWdhbCBudW1fcmVvcmRlcl9mcmFtZXMgJWRcbiIsCisJCQkJc3BzLT5udW1fcmVvcmRlcl9mcmFtZXMpOworCQkJCXNwcy0+bnVtX3Jlb3JkZXJfZnJhbWVzID0gMTY7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWxfaDI2NF9wYXJzZXJfc3BzKHN0cnVjdCBnZXRfYml0c19jb250ZXh0ICpnYiwgc3RydWN0IGgyNjRfU1BTX3QgKnNwcykKK3sKKwlpbnQgcmV0OworCXUzMiBzcHNfaWQ7CisJaW50IHByb2ZpbGVfaWRjLCBsZXZlbF9pZGMsIGNvbnN0cmFpbnRfc2V0X2ZsYWdzID0gMDsKKwlpbnQgaSwgbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNDsKKworCXByb2ZpbGVfaWRjCQk9IGdldF9iaXRzKGdiLCA4KTsKKwljb25zdHJhaW50X3NldF9mbGFncwl8PSBnZXRfYml0czEoZ2IpIDw8IDA7CS8vIGNvbnN0cmFpbnRfc2V0MF9mbGFnCisJY29uc3RyYWludF9zZXRfZmxhZ3MJfD0gZ2V0X2JpdHMxKGdiKSA8PCAxOwkvLyBjb25zdHJhaW50X3NldDFfZmxhZworCWNvbnN0cmFpbnRfc2V0X2ZsYWdzCXw9IGdldF9iaXRzMShnYikgPDwgMjsJLy8gY29uc3RyYWludF9zZXQyX2ZsYWcKKwljb25zdHJhaW50X3NldF9mbGFncwl8PSBnZXRfYml0czEoZ2IpIDw8IDM7CS8vIGNvbnN0cmFpbnRfc2V0M19mbGFnCisJY29uc3RyYWludF9zZXRfZmxhZ3MJfD0gZ2V0X2JpdHMxKGdiKSA8PCA0OwkvLyBjb25zdHJhaW50X3NldDRfZmxhZworCWNvbnN0cmFpbnRfc2V0X2ZsYWdzCXw9IGdldF9iaXRzMShnYikgPDwgNTsJLy8gY29uc3RyYWludF9zZXQ1X2ZsYWcKKwlza2lwX2JpdHMoZ2IsIDIpOyAJCQkJLy8gcmVzZXJ2ZWRfemVyb18yYml0cworCWxldmVsX2lkYwk9IGdldF9iaXRzKGdiLCA4KTsKKwlzcHNfaWQJCT0gZ2V0X3VlX2dvbG9tYl8zMShnYik7CisKKwlpZiAoc3BzX2lkID49IE1BWF9TUFNfQ09VTlQpIHsKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkic3BzX2lkICV1IG91dCBvZiByYW5nZVxuIiwgc3BzX2lkKTsKKwkJZ290byBmYWlsOworCX0KKworCXNwcy0+c3BzX2lkCQkJPSBzcHNfaWQ7CisJc3BzLT50aW1lX29mZnNldF9sZW5ndGgJCT0gMjQ7CisJc3BzLT5wcm9maWxlX2lkYwkJPSBwcm9maWxlX2lkYzsKKwlzcHMtPmNvbnN0cmFpbnRfc2V0X2ZsYWdzCT0gY29uc3RyYWludF9zZXRfZmxhZ3M7CisJc3BzLT5sZXZlbF9pZGMJCQk9IGxldmVsX2lkYzsKKwlzcHMtPmZ1bGxfcmFuZ2UJCQk9IC0xOworCisJbWVtc2V0KHNwcy0+c2NhbGluZ19tYXRyaXg0LCAxNiwgc2l6ZW9mKHNwcy0+c2NhbGluZ19tYXRyaXg0KSk7CisJbWVtc2V0KHNwcy0+c2NhbGluZ19tYXRyaXg4LCAxNiwgc2l6ZW9mKHNwcy0+c2NhbGluZ19tYXRyaXg4KSk7CisJc3BzLT5zY2FsaW5nX21hdHJpeF9wcmVzZW50ID0gMDsKKwlzcHMtPmNvbG9yc3BhY2UgPSAyOyAvL0FWQ09MX1NQQ19VTlNQRUNJRklFRAorCisJaWYgKHNwcy0+cHJvZmlsZV9pZGMgPT0gMTAwIHx8ICAvLyBIaWdoIHByb2ZpbGUKKwkJc3BzLT5wcm9maWxlX2lkYyA9PSAxMTAgfHwgIC8vIEhpZ2gxMCBwcm9maWxlCisJCXNwcy0+cHJvZmlsZV9pZGMgPT0gMTIyIHx8ICAvLyBIaWdoNDIyIHByb2ZpbGUKKwkJc3BzLT5wcm9maWxlX2lkYyA9PSAyNDQgfHwgIC8vIEhpZ2g0NDQgUHJlZGljdGl2ZSBwcm9maWxlCisJCXNwcy0+cHJvZmlsZV9pZGMgPT0gIDQ0IHx8ICAvLyBDYXZsYzQ0NCBwcm9maWxlCisJCXNwcy0+cHJvZmlsZV9pZGMgPT0gIDgzIHx8ICAvLyBTY2FsYWJsZSBDb25zdHJhaW5lZCBIaWdoIHByb2ZpbGUgKFNWQykKKwkJc3BzLT5wcm9maWxlX2lkYyA9PSAgODYgfHwgIC8vIFNjYWxhYmxlIEhpZ2ggSW50cmEgcHJvZmlsZSAoU1ZDKQorCQlzcHMtPnByb2ZpbGVfaWRjID09IDExOCB8fCAgLy8gU3RlcmVvIEhpZ2ggcHJvZmlsZSAoTVZDKQorCQlzcHMtPnByb2ZpbGVfaWRjID09IDEyOCB8fCAgLy8gTXVsdGl2aWV3IEhpZ2ggcHJvZmlsZSAoTVZDKQorCQlzcHMtPnByb2ZpbGVfaWRjID09IDEzOCB8fCAgLy8gTXVsdGl2aWV3IERlcHRoIEhpZ2ggcHJvZmlsZSAoTVZDRCkKKwkJc3BzLT5wcm9maWxlX2lkYyA9PSAxNDQpIHsgIC8vIG9sZCBIaWdoNDQ0IHByb2ZpbGUKKwkJc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9IGdldF91ZV9nb2xvbWJfMzEoZ2IpOworCisJCWlmIChzcHMtPmNocm9tYV9mb3JtYXRfaWRjID4gM1UpIHsKKwkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJCSJjaHJvbWFfZm9ybWF0X2lkYyAldVxuIiwgc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyk7CisJCQlnb3RvIGZhaWw7CisJCX0gZWxzZSBpZiAoc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAzKSB7CisJCQlzcHMtPnJlc2lkdWFsX2NvbG9yX3RyYW5zZm9ybV9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKwkJCWlmIChzcHMtPnJlc2lkdWFsX2NvbG9yX3RyYW5zZm9ybV9mbGFnKSB7CisJCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkJCSJzZXBhcmF0ZSBjb2xvciBwbGFuZXMgYXJlIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJfQorCisJCXNwcy0+Yml0X2RlcHRoX2x1bWEJPSBnZXRfdWVfZ29sb21iKGdiKSArIDg7CisJCXNwcy0+Yml0X2RlcHRoX2Nocm9tYQk9IGdldF91ZV9nb2xvbWIoZ2IpICsgODsKKwkJaWYgKHNwcy0+Yml0X2RlcHRoX2Nocm9tYSAhPSBzcHMtPmJpdF9kZXB0aF9sdW1hKSB7CisJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCQkiRGlmZmVyZW50IGNocm9tYSBhbmQgbHVtYSBiaXQgZGVwdGhcbiIpOworCQkJZ290byBmYWlsOworCQl9CisKKwkJaWYgKHNwcy0+Yml0X2RlcHRoX2x1bWEJPCA4IHx8IHNwcy0+Yml0X2RlcHRoX2x1bWEgPiAxNCB8fAorCQkJc3BzLT5iaXRfZGVwdGhfY2hyb21hIDwgOCB8fCBzcHMtPmJpdF9kZXB0aF9jaHJvbWEgPiAxNCkgeworCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkJImlsbGVnYWwgYml0IGRlcHRoIHZhbHVlICglZCwgJWQpXG4iLAorCQkJCXNwcy0+Yml0X2RlcHRoX2x1bWEsIHNwcy0+Yml0X2RlcHRoX2Nocm9tYSk7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQlzcHMtPnRyYW5zZm9ybV9ieXBhc3MgPSBnZXRfYml0czEoZ2IpOworCQlyZXQgPSBkZWNvZGVfc2NhbGluZ19tYXRyaWNlcyhnYiwgc3BzLCBOVUxMLCAxLAorCQkJc3BzLT5zY2FsaW5nX21hdHJpeDQsIHNwcy0+c2NhbGluZ19tYXRyaXg4KTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGZhaWw7CisJCXNwcy0+c2NhbGluZ19tYXRyaXhfcHJlc2VudCB8PSByZXQ7CisJfSBlbHNlIHsKKwkJc3BzLT5jaHJvbWFfZm9ybWF0X2lkYwk9IDE7CisJCXNwcy0+Yml0X2RlcHRoX2x1bWEJPSA4OworCQlzcHMtPmJpdF9kZXB0aF9jaHJvbWEJPSA4OworCX0KKworCWxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgPSBnZXRfdWVfZ29sb21iKGdiKTsKKwlpZiAobG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCA8IE1JTl9MT0cyX01BWF9GUkFNRV9OVU0gLSA0IHx8CisJCWxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgPiBNQVhfTE9HMl9NQVhfRlJBTUVfTlVNIC0gNCkgeworCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJsb2cyX21heF9mcmFtZV9udW1fbWludXM0IG91dCBvZiByYW5nZSAoMC0xMik6ICVkXG4iLAorCQkJbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCk7CisJCWdvdG8gZmFpbDsKKwl9CisJc3BzLT5sb2cyX21heF9mcmFtZV9udW0gPSBsb2cyX21heF9mcmFtZV9udW1fbWludXM0ICsgNDsKKworCXNwcy0+cG9jX3R5cGUgPSBnZXRfdWVfZ29sb21iXzMxKGdiKTsKKwlpZiAoc3BzLT5wb2NfdHlwZSA9PSAwKSB7IC8vIEZJWE1FICNkZWZpbmUKKwkJdTMyIHQgPSBnZXRfdWVfZ29sb21iKGdiKTsKKwkJaWYgKHQgPiAxMikgeworCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkJImxvZzJfbWF4X3BvY19sc2IgKCVkKSBpcyBvdXQgb2YgcmFuZ2VcbiIsIHQpOworCQkJZ290byBmYWlsOworCQl9CisJCXNwcy0+bG9nMl9tYXhfcG9jX2xzYiA9IHQgKyA0OworCX0gZWxzZSBpZiAoc3BzLT5wb2NfdHlwZSA9PSAxKSB7IC8vIEZJWE1FICNkZWZpbmUKKwkJc3BzLT5kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZwk9IGdldF9iaXRzMShnYik7CisJCXNwcy0+b2Zmc2V0X2Zvcl9ub25fcmVmX3BpYwkJPSBnZXRfc2VfZ29sb21iX2xvbmcoZ2IpOworCQlzcHMtPm9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZAk9IGdldF9zZV9nb2xvbWJfbG9uZyhnYik7CisKKwkJc3BzLT5wb2NfY3ljbGVfbGVuZ3RoID0gZ2V0X3VlX2dvbG9tYihnYik7CisJCWlmICgodTMyKXNwcy0+cG9jX2N5Y2xlX2xlbmd0aCA+PSBBUlJBWV9TSVpFKHNwcy0+b2Zmc2V0X2Zvcl9yZWZfZnJhbWUpKSB7CisJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCQkicG9jX2N5Y2xlX2xlbmd0aCBvdmVyZmxvdyAlZFxuIiwgc3BzLT5wb2NfY3ljbGVfbGVuZ3RoKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBzcHMtPnBvY19jeWNsZV9sZW5ndGg7IGkrKykKKwkJCXNwcy0+b2Zmc2V0X2Zvcl9yZWZfZnJhbWVbaV0gPSBnZXRfc2VfZ29sb21iX2xvbmcoZ2IpOworCX0gZWxzZSBpZiAoc3BzLT5wb2NfdHlwZSAhPSAyKSB7CisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJImlsbGVnYWwgUE9DIHR5cGUgJWRcbiIsIHNwcy0+cG9jX3R5cGUpOworCQlnb3RvIGZhaWw7CisJfQorCisJc3BzLT5yZWZfZnJhbWVfY291bnQgPSBnZXRfdWVfZ29sb21iXzMxKGdiKTsKKwlpZiAoc3BzLT5yZWZfZnJhbWVfY291bnQgPiBNQVhfREVMQVlFRF9QSUNfQ09VTlQpIHsKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkidG9vIG1hbnkgcmVmZXJlbmNlIGZyYW1lcyAlZFxuIiwgc3BzLT5yZWZfZnJhbWVfY291bnQpOworCQlnb3RvIGZhaWw7CisJfQorCXNwcy0+Z2Fwc19pbl9mcmFtZV9udW1fYWxsb3dlZF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKwlzcHMtPm1iX3dpZHRoCT0gZ2V0X3VlX2dvbG9tYihnYikgKyAxOworCXNwcy0+bWJfaGVpZ2h0CT0gZ2V0X3VlX2dvbG9tYihnYikgKyAxOworCisJc3BzLT5mcmFtZV9tYnNfb25seV9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKworCWlmIChzcHMtPm1iX2hlaWdodCA+PSBJTlRfTUFYIC8gMlUpIHsKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJoZWlnaHQgb3ZlcmZsb3dcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCXNwcy0+bWJfaGVpZ2h0ICo9IDIgLSBzcHMtPmZyYW1lX21ic19vbmx5X2ZsYWc7CisKKwlpZiAoIXNwcy0+ZnJhbWVfbWJzX29ubHlfZmxhZykKKwkJc3BzLT5tYl9hZmYgPSBnZXRfYml0czEoZ2IpOworCWVsc2UKKwkJc3BzLT5tYl9hZmYgPSAwOworCisJaWYgKCh1MzIpc3BzLT5tYl93aWR0aCAgPj0gSU5UX01BWCAvIDE2IHx8CisJCSh1MzIpc3BzLT5tYl9oZWlnaHQgPj0gSU5UX01BWCAvIDE2KSB7CisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJIm1iX3dpZHRoL2hlaWdodCBvdmVyZmxvd1xuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlzcHMtPmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCisJc3BzLT5jcm9wID0gZ2V0X2JpdHMxKGdiKTsKKwlpZiAoc3BzLT5jcm9wKSB7CisJCXUzMiBjcm9wX2xlZnQJPSBnZXRfdWVfZ29sb21iKGdiKTsKKwkJdTMyIGNyb3BfcmlnaHQJPSBnZXRfdWVfZ29sb21iKGdiKTsKKwkJdTMyIGNyb3BfdG9wCT0gZ2V0X3VlX2dvbG9tYihnYik7CisJCXUzMiBjcm9wX2JvdHRvbQk9IGdldF91ZV9nb2xvbWIoZ2IpOworCQlpbnQgd2lkdGgJPSAxNiAqIHNwcy0+bWJfd2lkdGg7CisJCWludCBoZWlnaHQJPSAxNiAqIHNwcy0+bWJfaGVpZ2h0OworCQlpbnQgdnN1Ygk9IChzcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDEpID8gMSA6IDA7CisJCWludCBoc3ViCT0gKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMSB8fCBzcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDIpID8gMSA6IDA7CisJCWludCBzdGVwX3gJPSAxIDw8IGhzdWI7CisJCWludCBzdGVwX3kJPSAoMiAtIHNwcy0+ZnJhbWVfbWJzX29ubHlfZmxhZykgPDwgdnN1YjsKKworCQlpZiAoY3JvcF9sZWZ0ID4gKHUzMilJTlRfTUFYIC8gNCAvIHN0ZXBfeCB8fAorCQkJY3JvcF9yaWdodCA+ICh1MzIpSU5UX01BWCAvIDQgLyBzdGVwX3ggfHwKKwkJCWNyb3BfdG9wID4gKHUzMilJTlRfTUFYIC8gNCAvIHN0ZXBfeSB8fAorCQkJY3JvcF9ib3R0b20gPiAodTMyKUlOVF9NQVggLyA0IC8gc3RlcF95IHx8CisJCQkoY3JvcF9sZWZ0ICsgY3JvcF9yaWdodCApICogc3RlcF94ID49IHdpZHRoIHx8CisJCQkoY3JvcF90b3AgKyBjcm9wX2JvdHRvbSkgKiBzdGVwX3kgPj0gaGVpZ2h0KSB7CisJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCQkiY3JvcCB2YWx1ZXMgaW52YWxpZCAldSAldSAldSAldSAvICVkICVkXG4iLAorCQkJCWNyb3BfbGVmdCwgY3JvcF9yaWdodCwgY3JvcF90b3AsIGNyb3BfYm90dG9tLCB3aWR0aCwgaGVpZ2h0KTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCXNwcy0+Y3JvcF9sZWZ0CT0gY3JvcF9sZWZ0ICogc3RlcF94OworCQlzcHMtPmNyb3BfcmlnaHQJPSBjcm9wX3JpZ2h0ICogc3RlcF94OworCQlzcHMtPmNyb3BfdG9wCT0gY3JvcF90b3AgKiBzdGVwX3k7CisJCXNwcy0+Y3JvcF9ib3R0b20gPSBjcm9wX2JvdHRvbSAqIHN0ZXBfeTsKKwl9IGVsc2UgeworCQlzcHMtPmNyb3BfbGVmdAk9CisJCXNwcy0+Y3JvcF9yaWdodAk9CisJCXNwcy0+Y3JvcF90b3AJPQorCQlzcHMtPmNyb3BfYm90dG9tID0KKwkJc3BzLT5jcm9wCT0gMDsKKwl9CisKKwlzcHMtPnZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyA9IGdldF9iaXRzMShnYik7CisJaWYgKHNwcy0+dnVpX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnKSB7CisJCWludCByZXQgPSBkZWNvZGVfdnVpX3BhcmFtZXRlcnMoZ2IsICBzcHMpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCAwKSB7CisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJIk92ZXJyZWFkICVzIGJ5ICVkIGJpdHNcbiIsCisJCQlzcHMtPnZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyA/ICJWVUkiIDogIlNQUyIsIC1nZXRfYml0c19sZWZ0KGdiKSk7CisJCS8qZ290byBvdXQ7Ki8KKwl9CisKKyNpZiAwCisJLyogaWYgdGhlIG1heGltdW0gZGVsYXkgaXMgbm90IHN0b3JlZCBpbiB0aGUgU1BTLCBkZXJpdmUgaXQgYmFzZWQgb24gdGhlIGxldmVsICovCisJaWYgKCFzcHMtPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnICYmIHNwcy0+cmVmX2ZyYW1lX2NvdW50KSB7CisJCXNwcy0+bnVtX3Jlb3JkZXJfZnJhbWVzID0gTUFYX0RFTEFZRURfUElDX0NPVU5UIC0gMTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobGV2ZWxfbWF4X2RwYl9tYnMpOyBpKyspIHsKKwkJCWlmIChsZXZlbF9tYXhfZHBiX21ic1tpXVswXSA9PSBzcHMtPmxldmVsX2lkYykgeworCQkJCXNwcy0+bnVtX3Jlb3JkZXJfZnJhbWVzID0KKwkJCQkJTUlOKGxldmVsX21heF9kcGJfbWJzW2ldWzFdIC8gKHNwcy0+bWJfd2lkdGggKiBzcHMtPm1iX2hlaWdodCksCisJCQkJCQlzcHMtPm51bV9yZW9yZGVyX2ZyYW1lcyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKworCXNwcy0+bnVtX3Jlb3JkZXJfZnJhbWVzID0gTUFYX0RFTEFZRURfUElDX0NPVU5UIC0gMTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsZXZlbF9tYXhfZHBiX21icyk7IGkrKykgeworCQlpZiAobGV2ZWxfbWF4X2RwYl9tYnNbaV1bMF0gPT0gc3BzLT5sZXZlbF9pZGMpIHsKKwkJCXNwcy0+bnVtX3Jlb3JkZXJfZnJhbWVzID0KKwkJCQlNSU4obGV2ZWxfbWF4X2RwYl9tYnNbaV1bMV0gLyAoc3BzLT5tYl93aWR0aCAqIHNwcy0+bWJfaGVpZ2h0KSwKKwkJCQkJc3BzLT5udW1fcmVvcmRlcl9mcmFtZXMpOworCQkJc3BzLT5udW1fcmVvcmRlcl9mcmFtZXMgKz0gMTsKKwkJCWlmIChzcHMtPm1heF9kZWNfZnJhbWVfYnVmZmVyaW5nID4gc3BzLT5udW1fcmVvcmRlcl9mcmFtZXMpCisJCQkJc3BzLT5udW1fcmVvcmRlcl9mcmFtZXMgPSBzcHMtPm1heF9kZWNfZnJhbWVfYnVmZmVyaW5nOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoKHNwcy0+Yml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcpICYmCisJCShzcHMtPm1heF9kZWNfZnJhbWVfYnVmZmVyaW5nIDwKKwkJc3BzLT5udW1fcmVvcmRlcl9mcmFtZXMpKSB7CisJCXNwcy0+bnVtX3Jlb3JkZXJfZnJhbWVzID0gc3BzLT5tYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZzsKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLAorCQkJInNldCByZW9yZGVyX3BpY19udW0gdG8gJWRcbiIsCisJCQlzcHMtPm51bV9yZW9yZGVyX2ZyYW1lcyk7CisJfQorCisJaWYgKCFzcHMtPnNhci5kZW4pCisJCXNwcy0+c2FyLmRlbiA9IDE7CisvKm91dDoqLworCWlmICgxKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyIGNzcFs0XVs1XSA9IHsgIkdyYXkiLCAiNDIwIiwgIjQyMiIsICI0NDQiIH07CisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX1BBUlNFUiwKKwkJCSJzcHM6JXUgcHJvZmlsZTolZC8lZCBwb2M6JWQgcmVmOiVkICVkeCVkICVzICVzIGNyb3A6JXUvJXUvJXUvJXUgJXMgJXMgJWQvJWQgYiVkIHJlbzolZFxuIiwKKwkJCXNwc19pZCwgc3BzLT5wcm9maWxlX2lkYywgc3BzLT5sZXZlbF9pZGMsCisJCQlzcHMtPnBvY190eXBlLAorCQkJc3BzLT5yZWZfZnJhbWVfY291bnQsCisJCQlzcHMtPm1iX3dpZHRoLCBzcHMtPm1iX2hlaWdodCwKKwkJCXNwcy0+ZnJhbWVfbWJzX29ubHlfZmxhZyA/ICJGUk0iIDogKHNwcy0+bWJfYWZmID8gIk1CLUFGRiIgOiAiUElDLUFGRiIpLAorCQkJc3BzLT5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnID8gIjhCOCIgOiAiIiwKKwkJCXNwcy0+Y3JvcF9sZWZ0LCBzcHMtPmNyb3BfcmlnaHQsCisJCQlzcHMtPmNyb3BfdG9wLCBzcHMtPmNyb3BfYm90dG9tLAorCQkJc3BzLT52dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgPyAiVlVJIiA6ICIiLAorCQkJY3NwW3Nwcy0+Y2hyb21hX2Zvcm1hdF9pZGNdLAorCQkJc3BzLT50aW1pbmdfaW5mb19wcmVzZW50X2ZsYWcgPyBzcHMtPm51bV91bml0c19pbl90aWNrIDogMCwKKwkJCXNwcy0+dGltaW5nX2luZm9fcHJlc2VudF9mbGFnID8gc3BzLT50aW1lX3NjYWxlIDogMCwKKwkJCXNwcy0+Yml0X2RlcHRoX2x1bWEsCisJCQlzcHMtPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnID8gc3BzLT5udW1fcmVvcmRlcl9mcmFtZXMgOiAtMSk7CisJfQorCisJcmV0dXJuIDA7CisKK2ZhaWw6CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqaDI2NF9uYWxfdHlwZV9uYW1lWzMyXSA9IHsKKwkiVW5zcGVjaWZpZWQgMCIsIC8vSDI2NF9OQUxfVU5TUEVDSUZJRUQKKwkiQ29kZWQgc2xpY2Ugb2YgYSBub24tSURSIHBpY3R1cmUiLCAvLyBIMjY0X05BTF9TTElDRQorCSJDb2RlZCBzbGljZSBkYXRhIHBhcnRpdGlvbiBBIiwgLy8gSDI2NF9OQUxfRFBBCisJIkNvZGVkIHNsaWNlIGRhdGEgcGFydGl0aW9uIEIiLCAvLyBIMjY0X05BTF9EUEIKKwkiQ29kZWQgc2xpY2UgZGF0YSBwYXJ0aXRpb24gQyIsIC8vIEgyNjRfTkFMX0RQQworCSJJRFIiLCAvLyBIMjY0X05BTF9JRFJfU0xJQ0UKKwkiU0VJIiwgLy8gSDI2NF9OQUxfU0VJCisJIlNQUyIsIC8vIEgyNjRfTkFMX1NQUworCSJQUFMiLCAvLyBIMjY0X05BTF9QUFMKKwkiQVVEIiwgLy8gSDI2NF9OQUxfQVVECisJIkVuZCBvZiBzZXF1ZW5jZSIsIC8vIEgyNjRfTkFMX0VORF9TRVFVRU5DRQorCSJFbmQgb2Ygc3RyZWFtIiwgLy8gSDI2NF9OQUxfRU5EX1NUUkVBTQorCSJGaWxsZXIgZGF0YSIsIC8vIEgyNjRfTkFMX0ZJTExFUl9EQVRBCisJIlNQUyBleHRlbnNpb24iLCAvLyBIMjY0X05BTF9TUFNfRVhUCisJIlByZWZpeCIsIC8vIEgyNjRfTkFMX1BSRUZJWAorCSJTdWJzZXQgU1BTIiwgLy8gSDI2NF9OQUxfU1VCX1NQUworCSJEZXB0aCBwYXJhbWV0ZXIgc2V0IiwgLy8gSDI2NF9OQUxfRFBTCisJIlJlc2VydmVkIDE3IiwgLy8gSDI2NF9OQUxfUkVTRVJWRUQxNworCSJSZXNlcnZlZCAxOCIsIC8vIEgyNjRfTkFMX1JFU0VSVkVEMTgKKwkiQXV4aWxpYXJ5IGNvZGVkIHBpY3R1cmUgd2l0aG91dCBwYXJ0aXRpb25pbmciLCAvLyBIMjY0X05BTF9BVVhJTElBUllfU0xJQ0UKKwkiU2xpY2UgZXh0ZW5zaW9uIiwgLy8gSDI2NF9OQUxfRVhURU5fU0xJQ0UKKwkiU2xpY2UgZXh0ZW5zaW9uIGZvciBhIGRlcHRoIHZpZXcgb3IgYSAzRC1BVkMgdGV4dHVyZSB2aWV3IiwgLy8gSDI2NF9OQUxfREVQVEhfRVhURU5fU0xJQ0UKKwkiUmVzZXJ2ZWQgMjIiLCAvLyBIMjY0X05BTF9SRVNFUlZFRDIyCisJIlJlc2VydmVkIDIzIiwgLy8gSDI2NF9OQUxfUkVTRVJWRUQyMworCSJVbnNwZWNpZmllZCAyNCIsIC8vIEgyNjRfTkFMX1VOU1BFQ0lGSUVEMjQKKwkiVW5zcGVjaWZpZWQgMjUiLCAvLyBIMjY0X05BTF9VTlNQRUNJRklFRDI1CisJIlVuc3BlY2lmaWVkIDI2IiwgLy8gSDI2NF9OQUxfVU5TUEVDSUZJRUQyNgorCSJVbnNwZWNpZmllZCAyNyIsIC8vIEgyNjRfTkFMX1VOU1BFQ0lGSUVEMjcKKwkiVW5zcGVjaWZpZWQgMjgiLCAvLyBIMjY0X05BTF9VTlNQRUNJRklFRDI4CisJIlVuc3BlY2lmaWVkIDI5IiwgLy8gSDI2NF9OQUxfVU5TUEVDSUZJRUQyOQorCSJVbnNwZWNpZmllZCAzMCIsIC8vIEgyNjRfTkFMX1VOU1BFQ0lGSUVEMzAKKwkiVW5zcGVjaWZpZWQgMzEiLCAvLyBIMjY0X05BTF9VTlNQRUNJRklFRDMxCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqaDI2NF9uYWxfdW5pdF9uYW1lKGludCBuYWxfdHlwZSkKK3sKKwlyZXR1cm4gaDI2NF9uYWxfdHlwZV9uYW1lW25hbF90eXBlXTsKK30KKworc3RhdGljIGludCBkZWNvZGVfZXh0cmFkYXRhX3BzKHU4ICpkYXRhLCBpbnQgc2l6ZSwgc3RydWN0IGgyNjRfcGFyYW1fc2V0cyAqcHMpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGdldF9iaXRzX2NvbnRleHQgZ2I7CisJdTMyIHNyY19sZW4sIHJic3Bfc2l6ZSA9IDA7CisJdTggKnJic3BfYnVmID0gTlVMTDsKKwlpbnQgcmVmX2lkYywgbmFsdV9wb3M7CisJdTMyIG5hbF90eXBlOworCXU4ICpwID0gZGF0YTsKKwl1MzIgbGVuID0gc2l6ZTsKKworCW5hbHVfcG9zID0gZmluZF9zdGFydF9jb2RlKHAsIGxlbik7CisJaWYgKG5hbHVfcG9zIDwgMCkKKwkJcmV0dXJuIC0xOworCisJc3JjX2xlbiA9IGNhbGNfbmFsX2xlbihwICsgbmFsdV9wb3MsIHNpemUgLSBuYWx1X3Bvcyk7CisJcmJzcF9idWYgPSBuYWxfdW5pdF9leHRyYWN0X3Jic3AocCArIG5hbHVfcG9zLCBzcmNfbGVuLCAmcmJzcF9zaXplKTsKKwlpZiAocmJzcF9idWYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBpbml0X2dldF9iaXRzOCgmZ2IsIHJic3BfYnVmLCByYnNwX3NpemUpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCWlmIChnZXRfYml0czEoJmdiKSAhPSAwKSB7CisJCXJldCA9IC0xOworCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJpbnZhbGlkIGgyNjQgZGF0YSxyZXR1cm4hXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmVmX2lkYwkgPSBnZXRfYml0cygmZ2IsIDIpOworCW5hbF90eXBlID0gZ2V0X2JpdHMoJmdiLCA1KTsKKworCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX1BBUlNFUiwKKwkJIm5hbF91bml0X3R5cGU6ICVkKCVzKSwgbmFsX3JlZl9pZGM6ICVkXG4iLAorCQluYWxfdHlwZSwgaDI2NF9uYWxfdW5pdF9uYW1lKG5hbF90eXBlKSwgcmVmX2lkYyk7CisKKwlzd2l0Y2ggKG5hbF90eXBlKSB7CisJY2FzZSBIMjY0X05BTF9TUFM6CisJCXJldCA9IGFtbF9oMjY0X3BhcnNlcl9zcHMoJmdiLCAmcHMtPnNwcyk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJCXBzLT5zcHNfcGFyc2VkID0gdHJ1ZTsKKwkJYnJlYWs7CisJLypjYXNlIEgyNjRfTkFMX1BQUzoKKwkJcmV0ID0gZmZfaDI2NF9kZWNvZGVfcGljdHVyZV9wYXJhbWV0ZXJfc2V0KCZnYiwgJnBzLT5wcHMsIHJic3Bfc2l6ZSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBmYWlsOworCQlwcy0+cHBzX3BhcnNlZCA9IHRydWU7CisJCWJyZWFrOyovCisJZGVmYXVsdDoKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkiVW5zdXBwb3J0IHBhcnNlciBuYWwgdHlwZSAoJXMpLlxuIiwKKwkJCWgyNjRfbmFsX3VuaXRfbmFtZShuYWxfdHlwZSkpOworCQlicmVhazsKKwl9CisKK291dDoKKwl2ZnJlZShyYnNwX2J1Zik7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgaDI2NF9kZWNvZGVfZXh0cmFkYXRhX3BzKHU4ICpidWYsIGludCBzaXplLCBzdHJ1Y3QgaDI2NF9wYXJhbV9zZXRzICpwcykKK3sKKwlpbnQgcmV0ID0gMCwgaSA9IDAsIGogPSAwOworCXU4ICpwID0gYnVmOworCWludCBsZW4gPSBzaXplOworCisJZm9yIChpID0gNDsgaSA8IHNpemU7IGkrKykgeworCQlqID0gZmluZF9zdGFydF9jb2RlKHAsIGxlbik7CisJCWlmIChqID4gMCkgeworCQkJbGVuID0gc2l6ZSAtIChwIC0gYnVmKTsKKwkJCXJldCA9IGRlY29kZV9leHRyYWRhdGFfcHMocCwgbGVuLCBwcyk7CisJCQlpZiAocmV0KSB7CisJCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkJCSJwYXJzZSBleHRyYSBkYXRhIGZhaWxlZC4gZXJyOiAlZFxuIiwgcmV0KTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCisJCQlpZiAocHMtPnNwc19wYXJzZWQpCisJCQkJYnJlYWs7CisKKwkJCXAgKz0gajsKKwkJfQorCQlwKys7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FtdmRlY19wb3J0cy9kZWNvZGVyL2FtbF9oMjY0X3BhcnNlci5oIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvZGVjb2Rlci9hbWxfaDI2NF9wYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWYwMGRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvZGVjb2Rlci9hbWxfaDI2NF9wYXJzZXIuaApAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIGRyaXZlcnMvYW12ZGVjX3BvcnRzL2RlY29kZXIvYW1sX2gyNjRfcGFyc2VyLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBBTUxfSDI2NF9QQVJTRVJfSAorI2RlZmluZSBBTUxfSDI2NF9QQVJTRVJfSAorCisjaW5jbHVkZSAiLi4vYW1sX3Zjb2RlY19kcnYuaCIKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9WNExfU09GVFdBUkVfUEFSU0VSCisjaW5jbHVkZSAiLi4vdXRpbHMvcGl4Zm10LmgiCisjZW5kaWYKKworI2RlZmluZSBRUF9NQVhfTlVNICg1MSArIDYgKiA2KSAgICAgICAgICAgLy8gVGhlIG1heGltdW0gc3VwcG9ydGVkIHFwCisKKy8qIE5BTCB1bml0IHR5cGVzICovCitlbnVtIHsKKwlIMjY0X05BTF9TTElDRSAgICAgICAgICAgPSAxLAorCUgyNjRfTkFMX0RQQSAgICAgICAgICAgICA9IDIsCisJSDI2NF9OQUxfRFBCICAgICAgICAgICAgID0gMywKKwlIMjY0X05BTF9EUEMgICAgICAgICAgICAgPSA0LAorCUgyNjRfTkFMX0lEUl9TTElDRSAgICAgICA9IDUsCisJSDI2NF9OQUxfU0VJICAgICAgICAgICAgID0gNiwKKwlIMjY0X05BTF9TUFMgICAgICAgICAgICAgPSA3LAorCUgyNjRfTkFMX1BQUyAgICAgICAgICAgICA9IDgsCisJSDI2NF9OQUxfQVVEICAgICAgICAgICAgID0gOSwKKwlIMjY0X05BTF9FTkRfU0VRVUVOQ0UgICAgPSAxMCwKKwlIMjY0X05BTF9FTkRfU1RSRUFNICAgICAgPSAxMSwKKwlIMjY0X05BTF9GSUxMRVJfREFUQSAgICAgPSAxMiwKKwlIMjY0X05BTF9TUFNfRVhUICAgICAgICAgPSAxMywKKwlIMjY0X05BTF9BVVhJTElBUllfU0xJQ0UgPSAxOSwKK307CisKK2VudW0geworCS8vIDcuNC4yLjEuMTogc2VxX3BhcmFtZXRlcl9zZXRfaWQgaXMgaW4gWzAsIDMxXS4KKwlIMjY0X01BWF9TUFNfQ09VTlQgPSAzMiwKKwkvLyA3LjQuMi4yOiBwaWNfcGFyYW1ldGVyX3NldF9pZCBpcyBpbiBbMCwgMjU1XS4KKwlIMjY0X01BWF9QUFNfQ09VTlQgPSAyNTYsCisKKwkvLyBBLjM6IE1heERwYkZyYW1lcyBpcyBib3VuZGVkIGFib3ZlIGJ5IDE2LgorCUgyNjRfTUFYX0RQQl9GUkFNRVMgPSAxNiwKKwkvLyA3LjQuMi4xLjE6IG1heF9udW1fcmVmX2ZyYW1lcyBpcyBpbiBbMCwgTWF4RHBiRnJhbWVzXSwgYW5kCisJLy8gZWFjaCByZWZlcmVuY2UgZnJhbWUgY2FuIGhhdmUgdHdvIGZpZWxkcy4KKwlIMjY0X01BWF9SRUZTICAgICAgID0gMiAqIEgyNjRfTUFYX0RQQl9GUkFNRVMsCisKKwkvLyA3LjQuMy4xOiBtb2RpZmljYXRpb25fb2ZfcGljX251bXNfaWRjIGlzIG5vdCBlcXVhbCB0byAzIGF0IG1vc3QKKwkvLyBudW1fcmVmX2lkeF9sTl9hY3RpdmVfbWludXMxICsgMSB0aW1lcyAodGhhdCBpcywgb25jZSBmb3IgZWFjaAorCS8vIHBvc3NpYmxlIHJlZmVyZW5jZSksIHRoZW4gZXF1YWwgdG8gMyBvbmNlLgorCUgyNjRfTUFYX1JQTE1fQ09VTlQgPSBIMjY0X01BWF9SRUZTICsgMSwKKworCS8vIDcuNC4zLjM6IGluIHRoZSB3b3JzdCBjYXNlLCB3ZSBiZWdpbiB3aXRoIGEgZnVsbCBzaG9ydC10ZXJtCisJLy8gcmVmZXJlbmNlIHBpY3R1cmUgbGlzdC4gIEVhY2ggcGljdHVyZSBpbiB0dXJuIGlzIG1vdmVkIHRvIHRoZQorCS8vIGxvbmctdGVybSBsaXN0ICh0eXBlIDMpIGFuZCB0aGVuIGRpc2NhcmRlZCBmcm9tIHRoZXJlICh0eXBlIDIpLgorCS8vIFRoZW4sIHdlIHNldCB0aGUgbGVuZ3RoIG9mIHRoZSBsb25nLXRlcm0gbGlzdCAodHlwZSA0KSwgbWFyaworCS8vIHRoZSBjdXJyZW50IHBpY3R1cmUgYXMgbG9uZy10ZXJtICh0eXBlIDYpIGFuZCB0ZXJtaW5hdGUgdGhlCisJLy8gcHJvY2VzcyAodHlwZSAwKS4KKwlIMjY0X01BWF9NTUNPX0NPVU5UID0gSDI2NF9NQVhfUkVGUyAqIDIgKyAzLAorCisJLy8gQS4yLjEsIEEuMi4zOiBwcm9maWxlcyBzdXBwb3J0aW5nIEZNTyBjb25zdHJhaW4KKwkvLyBudW1fc2xpY2VfZ3JvdXBzX21pbnVzMSB0byBiZSBpbiBbMCwgN10uCisJSDI2NF9NQVhfU0xJQ0VfR1JPVVBTID0gOCwKKworCS8vIEUuMi4yOiBjcGJfY250X21pbnVzMSBpcyBpbiBbMCwgMzFdLgorCUgyNjRfTUFYX0NQQl9DTlQgPSAzMiwKKworCS8vIEEuMzogaW4gdGFibGUgQS0xIHRoZSBoaWdoZXN0IGxldmVsIGFsbG93cyBhIE1heEZTIG9mIDEzOTI2NC4KKwlIMjY0X01BWF9NQl9QSUNfU0laRSA9IDEzOTI2NCwKKwkvLyBBLjMuMSwgQS4zLjI6IFBpY1dpZHRoSW5NYnMgYW5kIFBpY0hlaWdodEluTWJzIGFyZSBjb25zdHJhaW5lZAorCS8vIHRvIGJlIG5vdCBncmVhdGVyIHRoYW4gc3FydChNYXhGUyAqIDgpLiAgSGVuY2UgaGVpZ2h0L3dpZHRoIGFyZQorCS8vIGJvdW5kZWQgYWJvdmUgYnkgc3FydCgxMzkyNjQgKiA4KSA9IDEwNTUuNSBtYWNyb2Jsb2Nrcy4KKwlIMjY0X01BWF9NQl9XSURUSCAgICA9IDEwNTUsCisJSDI2NF9NQVhfTUJfSEVJR0hUICAgPSAxMDU1LAorCUgyNjRfTUFYX1dJRFRIICAgICAgID0gSDI2NF9NQVhfTUJfV0lEVEggICogMTYsCisJSDI2NF9NQVhfSEVJR0hUICAgICAgPSBIMjY0X01BWF9NQl9IRUlHSFQgKiAxNiwKK307CisKKy8qKgorICogUmF0aW9uYWwgbnVtYmVyIChwYWlyIG9mIG51bWVyYXRvciBhbmQgZGVub21pbmF0b3IpLgorICovCitzdHJ1Y3QgcmF0aW9uYWx7CisJaW50IG51bTsgLy8vPCBOdW1lcmF0b3IKKwlpbnQgZGVuOyAvLy88IERlbm9taW5hdG9yCit9OworCisvKioKKyAqIFNlcXVlbmNlIHBhcmFtZXRlciBzZXQKKyAqLworc3RydWN0IGgyNjRfU1BTX3QgeworCXUzMiBzcHNfaWQ7CisJaW50IHByb2ZpbGVfaWRjOworCWludCBsZXZlbF9pZGM7CisJaW50IGNocm9tYV9mb3JtYXRfaWRjOworCWludCB0cmFuc2Zvcm1fYnlwYXNzOyAgICAgICAgICAgICAgLy8vPCBxcHByaW1lX3lfemVyb190cmFuc2Zvcm1fYnlwYXNzX2ZsYWcKKwlpbnQgbG9nMl9tYXhfZnJhbWVfbnVtOyAgICAgICAgICAgIC8vLzwgbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCArIDQKKwlpbnQgcG9jX3R5cGU7ICAgICAgICAgICAgICAgICAgICAgIC8vLzwgcGljX29yZGVyX2NudF90eXBlCisJaW50IGxvZzJfbWF4X3BvY19sc2I7ICAgICAgICAgICAgICAvLy88IGxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNAorCWludCBkZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZzsKKwlpbnQgb2Zmc2V0X2Zvcl9ub25fcmVmX3BpYzsKKwlpbnQgb2Zmc2V0X2Zvcl90b3BfdG9fYm90dG9tX2ZpZWxkOworCWludCBwb2NfY3ljbGVfbGVuZ3RoOyAgICAgICAgICAgICAgLy8vPCBudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlCisJaW50IHJlZl9mcmFtZV9jb3VudDsgICAgICAgICAgICAgICAvLy88IG51bV9yZWZfZnJhbWVzCisJaW50IGdhcHNfaW5fZnJhbWVfbnVtX2FsbG93ZWRfZmxhZzsKKwlpbnQgbWJfd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgIC8vLzwgcGljX3dpZHRoX2luX21ic19taW51czEgKyAxCisJLy8vPCAocGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxICsgMSkgKiAoMiAtIGZyYW1lX21ic19vbmx5X2ZsYWcpCisJaW50IG1iX2hlaWdodDsKKwlpbnQgZnJhbWVfbWJzX29ubHlfZmxhZzsKKwlpbnQgbWJfYWZmOyAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbWJfYWRhcHRpdmVfZnJhbWVfZmllbGRfZmxhZworCWludCBkaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnOworCWludCBjcm9wOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBmcmFtZV9jcm9wcGluZ19mbGFnCisKKwkvKiB0aG9zZSA0IGFyZSBhbHJlYWR5IGluIGx1bWEgc2FtcGxlcyAqLworCXUzMiBjcm9wX2xlZnQ7ICAgICAgICAgICAgLy8vPCBmcmFtZV9jcm9wcGluZ19yZWN0X2xlZnRfb2Zmc2V0CisJdTMyIGNyb3BfcmlnaHQ7ICAgICAgICAgICAvLy88IGZyYW1lX2Nyb3BwaW5nX3JlY3RfcmlnaHRfb2Zmc2V0CisJdTMyIGNyb3BfdG9wOyAgICAgICAgICAgICAvLy88IGZyYW1lX2Nyb3BwaW5nX3JlY3RfdG9wX29mZnNldAorCXUzMiBjcm9wX2JvdHRvbTsgICAgICAgICAgLy8vPCBmcmFtZV9jcm9wcGluZ19yZWN0X2JvdHRvbV9vZmZzZXQKKwlpbnQgdnVpX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnOworCXN0cnVjdCByYXRpb25hbCBzYXI7CisJaW50IHZpZGVvX3NpZ25hbF90eXBlX3ByZXNlbnRfZmxhZzsKKwlpbnQgZnVsbF9yYW5nZTsKKwlpbnQgY29sb3VyX2Rlc2NyaXB0aW9uX3ByZXNlbnRfZmxhZzsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9WNExfU09GVFdBUkVfUEFSU0VSCisJZW51bSBBVkNvbG9yUHJpbWFyaWVzIGNvbG9yX3ByaW1hcmllczsKKwllbnVtIEFWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljIGNvbG9yX3RyYzsKKwllbnVtIEFWQ29sb3JTcGFjZSBjb2xvcnNwYWNlOworI2VuZGlmCisJaW50IHRpbWluZ19pbmZvX3ByZXNlbnRfZmxhZzsKKwl1MzIgbnVtX3VuaXRzX2luX3RpY2s7CisJdTMyIHRpbWVfc2NhbGU7CisJaW50IGZpeGVkX2ZyYW1lX3JhdGVfZmxhZzsKKwlpbnQzMl90IG9mZnNldF9mb3JfcmVmX2ZyYW1lWzI1Nl07CisJaW50IGJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnOworCWludCBudW1fcmVvcmRlcl9mcmFtZXM7CisJaW50IG1heF9kZWNfZnJhbWVfYnVmZmVyaW5nOworCWludCBzY2FsaW5nX21hdHJpeF9wcmVzZW50OworCXU4IHNjYWxpbmdfbWF0cml4NFs2XVsxNl07CisJdTggc2NhbGluZ19tYXRyaXg4WzZdWzY0XTsKKwlpbnQgbmFsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZzsKKwlpbnQgdmNsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZzsKKwlpbnQgcGljX3N0cnVjdF9wcmVzZW50X2ZsYWc7CisJaW50IHRpbWVfb2Zmc2V0X2xlbmd0aDsKKwlpbnQgY3BiX2NudDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgU2VlIEguMjY0IEUuMS4yCisJaW50IGluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoOyAvLy88IGluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoX21pbnVzMSArIDEKKwlpbnQgY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoOyAgICAgICAgIC8vLzwgY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoX21pbnVzMSArIDEKKwlpbnQgZHBiX291dHB1dF9kZWxheV9sZW5ndGg7ICAgICAgICAgIC8vLzwgZHBiX291dHB1dF9kZWxheV9sZW5ndGhfbWludXMxICsgMQorCWludCBiaXRfZGVwdGhfbHVtYTsgICAgICAgICAgICAgICAgICAgLy8vPCBiaXRfZGVwdGhfbHVtYV9taW51czggKyA4CisJaW50IGJpdF9kZXB0aF9jaHJvbWE7ICAgICAgICAgICAgICAgICAvLy88IGJpdF9kZXB0aF9jaHJvbWFfbWludXM4ICsgOAorCWludCByZXNpZHVhbF9jb2xvcl90cmFuc2Zvcm1fZmxhZzsgICAgLy8vPCByZXNpZHVhbF9jb2xvdXJfdHJhbnNmb3JtX2ZsYWcKKwlpbnQgY29uc3RyYWludF9zZXRfZmxhZ3M7ICAgICAgICAgICAgIC8vLzwgY29uc3RyYWludF9zZXRbMC0zXV9mbGFnCit9IDsKKworLyoqCisgKiBQaWN0dXJlIHBhcmFtZXRlciBzZXQKKyAqLworc3RydWN0IGgyNjRfUFBTX3QgeworCXUzMiBzcHNfaWQ7CisJaW50IGNhYmFjOyAgICAgICAgICAgICAgICAgIC8vLzwgZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnCisJaW50IHBpY19vcmRlcl9wcmVzZW50OyAgICAgIC8vLzwgcGljX29yZGVyX3ByZXNlbnRfZmxhZworCWludCBzbGljZV9ncm91cF9jb3VudDsgICAgICAvLy88IG51bV9zbGljZV9ncm91cHNfbWludXMxICsgMQorCWludCBtYl9zbGljZV9ncm91cF9tYXBfdHlwZTsKKwl1MzIgcmVmX2NvdW50WzJdOyAgLy8vPCBudW1fcmVmX2lkeF9sMC8xX2FjdGl2ZV9taW51czEgKyAxCisJaW50IHdlaWdodGVkX3ByZWQ7ICAgICAgICAgIC8vLzwgd2VpZ2h0ZWRfcHJlZF9mbGFnCisJaW50IHdlaWdodGVkX2JpcHJlZF9pZGM7CisJaW50IGluaXRfcXA7ICAgICAgICAgICAgICAgIC8vLzwgcGljX2luaXRfcXBfbWludXMyNiArIDI2CisJaW50IGluaXRfcXM7ICAgICAgICAgICAgICAgIC8vLzwgcGljX2luaXRfcXNfbWludXMyNiArIDI2CisJaW50IGNocm9tYV9xcF9pbmRleF9vZmZzZXRbMl07CisJaW50IGRlYmxvY2tpbmdfZmlsdGVyX3BhcmFtZXRlcnNfcHJlc2VudDsgLy8vPCBkZWJsb2NraW5nX2ZpbHRlcl9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZworCWludCBjb25zdHJhaW5lZF9pbnRyYV9wcmVkOyAgICAgLy8vPCBjb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWcKKwlpbnQgcmVkdW5kYW50X3BpY19jbnRfcHJlc2VudDsgIC8vLzwgcmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnCisJaW50IHRyYW5zZm9ybV84eDhfbW9kZTsgICAgICAgICAvLy88IHRyYW5zZm9ybV84eDhfbW9kZV9mbGFnCisJdTggc2NhbGluZ19tYXRyaXg0WzZdWzE2XTsKKwl1OCBzY2FsaW5nX21hdHJpeDhbNl1bNjRdOworCXU4IGNocm9tYV9xcF90YWJsZVsyXVs4NysxXTsgIC8vLzwgcHJlLXNjYWxlZCAod2l0aCBjaHJvbWFfcXBfaW5kZXhfb2Zmc2V0KSB2ZXJzaW9uIG9mIHFwX3RhYmxlCisJaW50IGNocm9tYV9xcF9kaWZmOworCXU4IGRhdGFbNDA5Nl07CisJaW50IGRhdGFfc2l6ZTsKKworCXUzMiBkZXF1YW50NF9idWZmZXJbNl1bODcgKyAxXVsxNl07CisJdTMyIGRlcXVhbnQ4X2J1ZmZlcls2XVs4NyArIDFdWzY0XTsKKwl1MzIoKmRlcXVhbnQ0X2NvZWZmWzZdKVsxNl07CisJdTMyKCpkZXF1YW50OF9jb2VmZls2XSlbNjRdOworfSA7CisKK3N0cnVjdCBoMjY0X3BhcmFtX3NldHMgeworCWJvb2wgc3BzX3BhcnNlZDsKKwlib29sIHBwc19wYXJzZWQ7CisJc3RydWN0IGgyNjRfU1BTX3Qgc3BzOworCXN0cnVjdCBoMjY0X1BQU190IHBwczsKK307CisKKworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX1Y0TF9TT0ZUV0FSRV9QQVJTRVIKK2ludCBoMjY0X2RlY29kZV9leHRyYWRhdGFfcHModTggKmRhdGEsIGludCBzaXplLCBzdHJ1Y3QgaDI2NF9wYXJhbV9zZXRzICpwcyk7CisjZWxzZQoraW5saW5lIGludCBoMjY0X2RlY29kZV9leHRyYWRhdGFfcHModTggKmRhdGEsIGludCBzaXplLCBzdHJ1Y3QgaDI2NF9wYXJhbV9zZXRzICpwcykgeyByZXR1cm4gLTE7IH0KKyNlbmRpZgorCisjZW5kaWYgLyogQU1MX0gyNjRfUEFSU0VSX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbXZkZWNfcG9ydHMvZGVjb2Rlci9hbWxfaGV2Y19wYXJzZXIuYyBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2RlY29kZXIvYW1sX2hldmNfcGFyc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ5NzdhOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2RlY29kZXIvYW1sX2hldmNfcGFyc2VyLmMKQEAgLTAsMCArMSwxMjgyIEBACisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworI2luY2x1ZGUgImFtbF9oZXZjX3BhcnNlci5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2dldF9iaXRzLmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvcHV0X2JpdHMuaCIKKyNpbmNsdWRlICIuLi91dGlscy9nb2xvbWIuaCIKKyNpbmNsdWRlICIuLi91dGlscy9jb21tb24uaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCitjb25zdCB1OCBmZl9oZXZjX2RpYWdfc2NhbjR4NF94WzE2XSA9IHsKKwkwLCAwLCAxLCAwLAorCTEsIDIsIDAsIDEsCisJMiwgMywgMSwgMiwKKwkzLCAyLCAzLCAzLAorfTsKKworY29uc3QgdTggZmZfaGV2Y19kaWFnX3NjYW40eDRfeVsxNl0gPSB7CisJMCwgMSwgMCwgMiwKKwkxLCAwLCAzLCAyLAorCTEsIDAsIDMsIDIsCisJMSwgMywgMiwgMywKK307CisKK2NvbnN0IHU4IGZmX2hldmNfZGlhZ19zY2FuOHg4X3hbNjRdID0geworCTAsIDAsIDEsIDAsCisJMSwgMiwgMCwgMSwKKwkyLCAzLCAwLCAxLAorCTIsIDMsIDQsIDAsCisJMSwgMiwgMywgNCwKKwk1LCAwLCAxLCAyLAorCTMsIDQsIDUsIDYsCisJMCwgMSwgMiwgMywKKwk0LCA1LCA2LCA3LAorCTEsIDIsIDMsIDQsCisJNSwgNiwgNywgMiwKKwkzLCA0LCA1LCA2LAorCTcsIDMsIDQsIDUsCisJNiwgNywgNCwgNSwKKwk2LCA3LCA1LCA2LAorCTcsIDYsIDcsIDcsCit9OworCitjb25zdCB1OCBmZl9oZXZjX2RpYWdfc2Nhbjh4OF95WzY0XSA9IHsKKwkwLCAxLCAwLCAyLAorCTEsIDAsIDMsIDIsCisJMSwgMCwgNCwgMywKKwkyLCAxLCAwLCA1LAorCTQsIDMsIDIsIDEsCisJMCwgNiwgNSwgNCwKKwkzLCAyLCAxLCAwLAorCTcsIDYsIDUsIDQsCisJMywgMiwgMSwgMCwKKwk3LCA2LCA1LCA0LAorCTMsIDIsIDEsIDcsCisJNiwgNSwgNCwgMywKKwkyLCA3LCA2LCA1LAorCTQsIDMsIDcsIDYsCisJNSwgNCwgNywgNiwKKwk1LCA3LCA2LCA3LAorfTsKKworc3RhdGljIGNvbnN0IHU4IGRlZmF1bHRfc2NhbGluZ19saXN0X2ludHJhW10gPSB7CisJMTYsIDE2LCAxNiwgMTYsIDE3LCAxOCwgMjEsIDI0LAorCTE2LCAxNiwgMTYsIDE2LCAxNywgMTksIDIyLCAyNSwKKwkxNiwgMTYsIDE3LCAxOCwgMjAsIDIyLCAyNSwgMjksCisJMTYsIDE2LCAxOCwgMjEsIDI0LCAyNywgMzEsIDM2LAorCTE3LCAxNywgMjAsIDI0LCAzMCwgMzUsIDQxLCA0NywKKwkxOCwgMTksIDIyLCAyNywgMzUsIDQ0LCA1NCwgNjUsCisJMjEsIDIyLCAyNSwgMzEsIDQxLCA1NCwgNzAsIDg4LAorCTI0LCAyNSwgMjksIDM2LCA0NywgNjUsIDg4LCAxMTUKK307CisKK3N0YXRpYyBjb25zdCB1OCBkZWZhdWx0X3NjYWxpbmdfbGlzdF9pbnRlcltdID0geworCTE2LCAxNiwgMTYsIDE2LCAxNywgMTgsIDIwLCAyNCwKKwkxNiwgMTYsIDE2LCAxNywgMTgsIDIwLCAyNCwgMjUsCisJMTYsIDE2LCAxNywgMTgsIDIwLCAyNCwgMjUsIDI4LAorCTE2LCAxNywgMTgsIDIwLCAyNCwgMjUsIDI4LCAzMywKKwkxNywgMTgsIDIwLCAyNCwgMjUsIDI4LCAzMywgNDEsCisJMTgsIDIwLCAyNCwgMjUsIDI4LCAzMywgNDEsIDU0LAorCTIwLCAyNCwgMjUsIDI4LCAzMywgNDEsIDU0LCA3MSwKKwkyNCwgMjUsIDI4LCAzMywgNDEsIDU0LCA3MSwgOTEKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgQVZSYXRpb25hbCB2dWlfc2FyW10gPSB7CisJeyAgMCwgICAxIH0sCisJeyAgMSwgICAxIH0sCisJeyAxMiwgIDExIH0sCisJeyAxMCwgIDExIH0sCisJeyAxNiwgIDExIH0sCisJeyA0MCwgIDMzIH0sCisJeyAyNCwgIDExIH0sCisJeyAyMCwgIDExIH0sCisJeyAzMiwgIDExIH0sCisJeyA4MCwgIDMzIH0sCisJeyAxOCwgIDExIH0sCisJeyAxNSwgIDExIH0sCisJeyA2NCwgIDMzIH0sCisJeyAxNjAsIDk5IH0sCisJeyAgNCwgICAzIH0sCisJeyAgMywgICAyIH0sCisJeyAgMiwgICAxIH0sCit9OworCitzdGF0aWMgY29uc3QgdTggaGV2Y19zdWJfd2lkdGhfY1tdID0geworCTEsIDIsIDIsIDEKK307CisKK3N0YXRpYyBjb25zdCB1OCBoZXZjX3N1Yl9oZWlnaHRfY1tdID0geworCTEsIDIsIDEsIDEKK307CisKK3N0YXRpYyBpbnQgZGVjb2RlX3Byb2ZpbGVfdGllcl9sZXZlbChzdHJ1Y3QgZ2V0X2JpdHNfY29udGV4dCAqZ2IsIHN0cnVjdCBQVExDb21tb24gKnB0bCkKK3sKKwlpbnQgaTsKKworCWlmIChnZXRfYml0c19sZWZ0KGdiKSA8IDIrMSs1ICsgMzIgKyA0ICsgMTYgKyAxNiArIDEyKQorCQlyZXR1cm4gLTE7CisKKwlwdGwtPnByb2ZpbGVfc3BhY2UgPSBnZXRfYml0cyhnYiwgMik7CisJcHRsLT50aWVyX2ZsYWcgICAgID0gZ2V0X2JpdHMxKGdiKTsKKwlwdGwtPnByb2ZpbGVfaWRjICAgPSBnZXRfYml0cyhnYiwgNSk7CisJaWYgKHB0bC0+cHJvZmlsZV9pZGMgPT0gRkZfUFJPRklMRV9IRVZDX01BSU4pCisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX1BBUlNFUiwgIk1haW4gcHJvZmlsZSBiaXRzdHJlYW1cbiIpOworCWVsc2UgaWYgKHB0bC0+cHJvZmlsZV9pZGMgPT0gRkZfUFJPRklMRV9IRVZDX01BSU5fMTApCisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX1BBUlNFUiwgIk1haW4gMTAgcHJvZmlsZSBiaXRzdHJlYW1cbiIpOworCWVsc2UgaWYgKHB0bC0+cHJvZmlsZV9pZGMgPT0gRkZfUFJPRklMRV9IRVZDX01BSU5fU1RJTExfUElDVFVSRSkKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLCAiTWFpbiBTdGlsbCBQaWN0dXJlIHByb2ZpbGUgYml0c3RyZWFtXG4iKTsKKwllbHNlIGlmIChwdGwtPnByb2ZpbGVfaWRjID09IEZGX1BST0ZJTEVfSEVWQ19SRVhUKQorCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsICJSYW5nZSBFeHRlbnNpb24gcHJvZmlsZSBiaXRzdHJlYW1cbiIpOworCWVsc2UKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLCAiVW5rbm93biBIRVZDIHByb2ZpbGU6ICVkXG4iLCBwdGwtPnByb2ZpbGVfaWRjKTsKKworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCXB0bC0+cHJvZmlsZV9jb21wYXRpYmlsaXR5X2ZsYWdbaV0gPSBnZXRfYml0czEoZ2IpOworCisJCWlmIChwdGwtPnByb2ZpbGVfaWRjID09IDAgJiYgaSA+IDAgJiYgcHRsLT5wcm9maWxlX2NvbXBhdGliaWxpdHlfZmxhZ1tpXSkKKwkJCXB0bC0+cHJvZmlsZV9pZGMgPSBpOworCX0KKwlwdGwtPnByb2dyZXNzaXZlX3NvdXJjZV9mbGFnICAgID0gZ2V0X2JpdHMxKGdiKTsKKwlwdGwtPmludGVybGFjZWRfc291cmNlX2ZsYWcgICAgID0gZ2V0X2JpdHMxKGdiKTsKKwlwdGwtPm5vbl9wYWNrZWRfY29uc3RyYWludF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKwlwdGwtPmZyYW1lX29ubHlfY29uc3RyYWludF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKworCXNraXBfYml0cyhnYiwgMTYpOyAvLyBYWFhfcmVzZXJ2ZWRfemVyb180NGJpdHNbMC4uMTVdCisJc2tpcF9iaXRzKGdiLCAxNik7IC8vIFhYWF9yZXNlcnZlZF96ZXJvXzQ0Yml0c1sxNi4uMzFdCisJc2tpcF9iaXRzKGdiLCAxMik7IC8vIFhYWF9yZXNlcnZlZF96ZXJvXzQ0Yml0c1szMi4uNDNdCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9wdGwoc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKmdiLCBzdHJ1Y3QgUFRMICpwdGwsIGludCBtYXhfbnVtX3N1Yl9sYXllcnMpCit7CisJaW50IGk7CisJaWYgKGRlY29kZV9wcm9maWxlX3RpZXJfbGV2ZWwoZ2IsICZwdGwtPmdlbmVyYWxfcHRsKSA8IDAgfHwKKwkJZ2V0X2JpdHNfbGVmdChnYikgPCA4ICsgKDgqMiAqIChtYXhfbnVtX3N1Yl9sYXllcnMgLSAxID4gMCkpKSB7CisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAiUFRMIGluZm9ybWF0aW9uIHRvbyBzaG9ydFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlwdGwtPmdlbmVyYWxfcHRsLmxldmVsX2lkYyA9IGdldF9iaXRzKGdiLCA4KTsKKworCWZvciAoaSA9IDA7IGkgPCBtYXhfbnVtX3N1Yl9sYXllcnMgLSAxOyBpKyspIHsKKwkJcHRsLT5zdWJfbGF5ZXJfcHJvZmlsZV9wcmVzZW50X2ZsYWdbaV0gPSBnZXRfYml0czEoZ2IpOworCQlwdGwtPnN1Yl9sYXllcl9sZXZlbF9wcmVzZW50X2ZsYWdbaV0gICA9IGdldF9iaXRzMShnYik7CisJfQorCisJaWYgKG1heF9udW1fc3ViX2xheWVycyAtIDE+IDApCisJCWZvciAoaSA9IG1heF9udW1fc3ViX2xheWVycyAtIDE7IGkgPCA4OyBpKyspCisJCQlza2lwX2JpdHMoZ2IsIDIpOyAvLyByZXNlcnZlZF96ZXJvXzJiaXRzW2ldCisJZm9yIChpID0gMDsgaSA8IG1heF9udW1fc3ViX2xheWVycyAtIDE7IGkrKykgeworCQlpZiAocHRsLT5zdWJfbGF5ZXJfcHJvZmlsZV9wcmVzZW50X2ZsYWdbaV0gJiYKKwkJCWRlY29kZV9wcm9maWxlX3RpZXJfbGV2ZWwoZ2IsICZwdGwtPnN1Yl9sYXllcl9wdGxbaV0pIDwgMCkgeworCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJQVEwgaW5mb3JtYXRpb24gZm9yIHN1YmxheWVyICVpIHRvbyBzaG9ydFxuIiwgaSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKHB0bC0+c3ViX2xheWVyX2xldmVsX3ByZXNlbnRfZmxhZ1tpXSkgeworCQkJaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgOCkgeworCQkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAiTm90IGVub3VnaCBkYXRhIGZvciBzdWJsYXllciAlaSBsZXZlbF9pZGNcbiIsIGkpOworCQkJCXJldHVybiAtMTsKKwkJCX0gZWxzZQorCQkJCXB0bC0+c3ViX2xheWVyX3B0bFtpXS5sZXZlbF9pZGMgPSBnZXRfYml0cyhnYiwgOCk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVjb2RlX3N1YmxheWVyX2hyZChzdHJ1Y3QgZ2V0X2JpdHNfY29udGV4dCAqZ2IsCisJdTMyIG5iX2NwYiwgaW50IHN1YnBpY19wYXJhbXNfcHJlc2VudCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBuYl9jcGI7IGkrKykgeworCQlnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOyAvLyBiaXRfcmF0ZV92YWx1ZV9taW51czEKKwkJZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsgLy8gY3BiX3NpemVfdmFsdWVfbWludXMxCisKKwkJaWYgKHN1YnBpY19wYXJhbXNfcHJlc2VudCkgeworCQkJZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsgLy8gY3BiX3NpemVfZHVfdmFsdWVfbWludXMxCisJCQlnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOyAvLyBiaXRfcmF0ZV9kdV92YWx1ZV9taW51czEKKwkJfQorCQlza2lwX2JpdHMxKGdiKTsgLy8gY2JyX2ZsYWcKKwl9Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2hyZChzdHJ1Y3QgZ2V0X2JpdHNfY29udGV4dCAqZ2IsCisJaW50IGNvbW1vbl9pbmZfcHJlc2VudCwgaW50IG1heF9zdWJsYXllcnMpCit7CisJaW50IG5hbF9wYXJhbXNfcHJlc2VudCA9IDAsIHZjbF9wYXJhbXNfcHJlc2VudCA9IDA7CisJaW50IHN1YnBpY19wYXJhbXNfcHJlc2VudCA9IDA7CisJaW50IGk7CisKKwlpZiAoY29tbW9uX2luZl9wcmVzZW50KSB7CisJCW5hbF9wYXJhbXNfcHJlc2VudCA9IGdldF9iaXRzMShnYik7CisJCXZjbF9wYXJhbXNfcHJlc2VudCA9IGdldF9iaXRzMShnYik7CisKKwkJaWYgKG5hbF9wYXJhbXNfcHJlc2VudCB8fCB2Y2xfcGFyYW1zX3ByZXNlbnQpIHsKKwkJCXN1YnBpY19wYXJhbXNfcHJlc2VudCA9IGdldF9iaXRzMShnYik7CisKKwkJCWlmIChzdWJwaWNfcGFyYW1zX3ByZXNlbnQpIHsKKwkJCQlza2lwX2JpdHMoZ2IsIDgpOyAvLyB0aWNrX2Rpdmlzb3JfbWludXMyCisJCQkJc2tpcF9iaXRzKGdiLCA1KTsgLy8gZHVfY3BiX3JlbW92YWxfZGVsYXlfaW5jcmVtZW50X2xlbmd0aF9taW51czEKKwkJCQlza2lwX2JpdHMoZ2IsIDEpOyAvLyBzdWJfcGljX2NwYl9wYXJhbXNfaW5fcGljX3RpbWluZ19zZWlfZmxhZworCQkJCXNraXBfYml0cyhnYiwgNSk7IC8vIGRwYl9vdXRwdXRfZGVsYXlfZHVfbGVuZ3RoX21pbnVzMQorCQkJfQorCisJCQlza2lwX2JpdHMoZ2IsIDQpOyAvLyBiaXRfcmF0ZV9zY2FsZQorCQkJc2tpcF9iaXRzKGdiLCA0KTsgLy8gY3BiX3NpemVfc2NhbGUKKworCQkJaWYgKHN1YnBpY19wYXJhbXNfcHJlc2VudCkKKwkJCQlza2lwX2JpdHMoZ2IsIDQpOyAgLy8gY3BiX3NpemVfZHVfc2NhbGUKKworCQkJc2tpcF9iaXRzKGdiLCA1KTsgLy8gaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxCisJCQlza2lwX2JpdHMoZ2IsIDUpOyAvLyBhdV9jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxCisJCQlza2lwX2JpdHMoZ2IsIDUpOyAvLyBkcGJfb3V0cHV0X2RlbGF5X2xlbmd0aF9taW51czEKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBtYXhfc3VibGF5ZXJzOyBpKyspIHsKKwkJaW50IGxvd19kZWxheSA9IDA7CisJCXUzMiBuYl9jcGIgPSAxOworCQlpbnQgZml4ZWRfcmF0ZSA9IGdldF9iaXRzMShnYik7CisKKwkJaWYgKCFmaXhlZF9yYXRlKQorCQkJZml4ZWRfcmF0ZSA9IGdldF9iaXRzMShnYik7CisKKwkJaWYgKGZpeGVkX3JhdGUpCisJCQlnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOyAgLy8gZWxlbWVudGFsX2R1cmF0aW9uX2luX3RjX21pbnVzMQorCQllbHNlCisJCQlsb3dfZGVsYXkgPSBnZXRfYml0czEoZ2IpOworCisJCWlmICghbG93X2RlbGF5KSB7CisJCQluYl9jcGIgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpICsgMTsKKwkJCWlmIChuYl9jcGIgPCAxIHx8IG5iX2NwYiA+IDMyKSB7CisJCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJuYl9jcGIgJWQgaW52YWxpZFxuIiwgbmJfY3BiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKworCQlpZiAobmFsX3BhcmFtc19wcmVzZW50KQorCQkJZGVjb2RlX3N1YmxheWVyX2hyZChnYiwgbmJfY3BiLCBzdWJwaWNfcGFyYW1zX3ByZXNlbnQpOworCQlpZiAodmNsX3BhcmFtc19wcmVzZW50KQorCQkJZGVjb2RlX3N1YmxheWVyX2hyZChnYiwgbmJfY3BiLCBzdWJwaWNfcGFyYW1zX3ByZXNlbnQpOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGZmX2hldmNfcGFyc2VfdnBzKHN0cnVjdCBnZXRfYml0c19jb250ZXh0ICpnYiwgc3RydWN0IGgyNjVfVlBTX3QgKnZwcykKK3sKKwlpbnQgaSxqOworCWludCB2cHNfaWQgPSAwOworCisJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLCAiRGVjb2RpbmcgVlBTXG4iKTsKKworCXZwc19pZCA9IGdldF9iaXRzKGdiLCA0KTsKKwlpZiAodnBzX2lkID49IEhFVkNfTUFYX1ZQU19DT1VOVCkgeworCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgIlZQUyBpZCBvdXQgb2YgcmFuZ2U6ICVkXG4iLCB2cHNfaWQpOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoZ2V0X2JpdHMoZ2IsIDIpICE9IDMpIHsgLy8gdnBzX3Jlc2VydmVkX3RocmVlXzJiaXRzCisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAidnBzX3Jlc2VydmVkX3RocmVlXzJiaXRzIGlzIG5vdCB0aHJlZVxuIik7CisJCWdvdG8gZXJyOworCX0KKworCXZwcy0+dnBzX21heF9sYXllcnMJPSBnZXRfYml0cyhnYiwgNikgKyAxOworCXZwcy0+dnBzX21heF9zdWJfbGF5ZXJzCT0gZ2V0X2JpdHMoZ2IsIDMpICsgMTsKKwl2cHMtPnZwc190ZW1wb3JhbF9pZF9uZXN0aW5nX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCisJaWYgKGdldF9iaXRzKGdiLCAxNikgIT0gMHhmZmZmKSB7IC8vIHZwc19yZXNlcnZlZF9mZmZmXzE2Yml0cworCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgInZwc19yZXNlcnZlZF9mZmZmXzE2Yml0cyBpcyBub3QgMHhmZmZmXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKHZwcy0+dnBzX21heF9zdWJfbGF5ZXJzID4gSEVWQ19NQVhfU1VCX0xBWUVSUykgeworCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgInZwc19tYXhfc3ViX2xheWVycyBvdXQgb2YgcmFuZ2U6ICVkXG4iLAorCQkJdnBzLT52cHNfbWF4X3N1Yl9sYXllcnMpOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAocGFyc2VfcHRsKGdiLCAmdnBzLT5wdGwsIHZwcy0+dnBzX21heF9zdWJfbGF5ZXJzKSA8IDApCisJCWdvdG8gZXJyOworCisJdnBzLT52cHNfc3ViX2xheWVyX29yZGVyaW5nX2luZm9fcHJlc2VudF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKworCWkgPSB2cHMtPnZwc19zdWJfbGF5ZXJfb3JkZXJpbmdfaW5mb19wcmVzZW50X2ZsYWcgPyAwIDogdnBzLT52cHNfbWF4X3N1Yl9sYXllcnMgLSAxOworCWZvciAoOyBpIDwgdnBzLT52cHNfbWF4X3N1Yl9sYXllcnM7IGkrKykgeworCQl2cHMtPnZwc19tYXhfZGVjX3BpY19idWZmZXJpbmdbaV0JPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpICsgMTsKKwkJdnBzLT52cHNfbnVtX3Jlb3JkZXJfcGljc1tpXQkJPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworCQl2cHMtPnZwc19tYXhfbGF0ZW5jeV9pbmNyZWFzZVtpXQk9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgLSAxOworCisJCWlmICh2cHMtPnZwc19tYXhfZGVjX3BpY19idWZmZXJpbmdbaV0gPiBIRVZDX01BWF9EUEJfU0laRSB8fCAhdnBzLT52cHNfbWF4X2RlY19waWNfYnVmZmVyaW5nW2ldKSB7CisJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgInZwc19tYXhfZGVjX3BpY19idWZmZXJpbmdfbWludXMxIG91dCBvZiByYW5nZTogJWRcbiIsCisJCQkJdnBzLT52cHNfbWF4X2RlY19waWNfYnVmZmVyaW5nW2ldIC0gMSk7CisJCQlnb3RvIGVycjsKKwkJfQorCQlpZiAodnBzLT52cHNfbnVtX3Jlb3JkZXJfcGljc1tpXSA+IHZwcy0+dnBzX21heF9kZWNfcGljX2J1ZmZlcmluZ1tpXSAtIDEpIHsKKwkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAidnBzX21heF9udW1fcmVvcmRlcl9waWNzIG91dCBvZiByYW5nZTogJWRcbiIsCisJCQkJdnBzLT52cHNfbnVtX3Jlb3JkZXJfcGljc1tpXSk7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKworCXZwcy0+dnBzX21heF9sYXllcl9pZCAgID0gZ2V0X2JpdHMoZ2IsIDYpOworCXZwcy0+dnBzX251bV9sYXllcl9zZXRzID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSArIDE7CisJaWYgKHZwcy0+dnBzX251bV9sYXllcl9zZXRzIDwgMSB8fCB2cHMtPnZwc19udW1fbGF5ZXJfc2V0cyA+IDEwMjQgfHwKKwkJKHZwcy0+dnBzX251bV9sYXllcl9zZXRzIC0gMUxMKSAqICh2cHMtPnZwc19tYXhfbGF5ZXJfaWQgKyAxTEwpID4gZ2V0X2JpdHNfbGVmdChnYikpIHsKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJ0b28gbWFueSBsYXllcl9pZF9pbmNsdWRlZF9mbGFnc1xuIik7CisJCWdvdG8gZXJyOworCX0KKworCWZvciAoaSA9IDE7IGkgPCB2cHMtPnZwc19udW1fbGF5ZXJfc2V0czsgaSsrKQorCQlmb3IgKGogPSAwOyBqIDw9IHZwcy0+dnBzX21heF9sYXllcl9pZDsgaisrKQorCQkJc2tpcF9iaXRzKGdiLCAxKTsgIC8vIGxheWVyX2lkX2luY2x1ZGVkX2ZsYWdbaV1bal0KKworCXZwcy0+dnBzX3RpbWluZ19pbmZvX3ByZXNlbnRfZmxhZyA9IGdldF9iaXRzMShnYik7CisJaWYgKHZwcy0+dnBzX3RpbWluZ19pbmZvX3ByZXNlbnRfZmxhZykgeworCQl2cHMtPnZwc19udW1fdW5pdHNfaW5fdGljawk9IGdldF9iaXRzX2xvbmcoZ2IsIDMyKTsKKwkJdnBzLT52cHNfdGltZV9zY2FsZQkJPSBnZXRfYml0c19sb25nKGdiLCAzMik7CisJCXZwcy0+dnBzX3BvY19wcm9wb3J0aW9uYWxfdG9fdGltaW5nX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCQlpZiAodnBzLT52cHNfcG9jX3Byb3BvcnRpb25hbF90b190aW1pbmdfZmxhZykKKwkJCXZwcy0+dnBzX251bV90aWNrc19wb2NfZGlmZl9vbmUgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpICsgMTsKKwkJdnBzLT52cHNfbnVtX2hyZF9wYXJhbWV0ZXJzID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKwkJaWYgKHZwcy0+dnBzX251bV9ocmRfcGFyYW1ldGVycyA+ICh1MzIpdnBzLT52cHNfbnVtX2xheWVyX3NldHMpIHsKKwkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAidnBzX251bV9ocmRfcGFyYW1ldGVycyAlZCBpcyBpbnZhbGlkXG4iLCB2cHMtPnZwc19udW1faHJkX3BhcmFtZXRlcnMpOworCQkJZ290byBlcnI7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IHZwcy0+dnBzX251bV9ocmRfcGFyYW1ldGVyczsgaSsrKSB7CisJCQlpbnQgY29tbW9uX2luZl9wcmVzZW50ID0gMTsKKworCQkJZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsgLy8gaHJkX2xheWVyX3NldF9pZHgKKwkJCWlmIChpKQorCQkJCWNvbW1vbl9pbmZfcHJlc2VudCA9IGdldF9iaXRzMShnYik7CisJCQlkZWNvZGVfaHJkKGdiLCBjb21tb25faW5mX3ByZXNlbnQsIHZwcy0+dnBzX21heF9zdWJfbGF5ZXJzKTsKKwkJfQorCX0KKwlnZXRfYml0czEoZ2IpOyAvKiB2cHNfZXh0ZW5zaW9uX2ZsYWcgKi8KKworCWlmIChnZXRfYml0c19sZWZ0KGdiKSA8IDApIHsKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJPdmVycmVhZCBWUFMgYnkgJWQgYml0c1xuIiwgLWdldF9iaXRzX2xlZnQoZ2IpKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0dXJuIDA7CitlcnI6CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IG1hcF9waXhlbF9mb3JtYXQoc3RydWN0IGgyNjVfU1BTX3QgKnNwcykKK3sKKwkvKmNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYzsqLworCXN3aXRjaCAoc3BzLT5iaXRfZGVwdGgpIHsKKwljYXNlIDg6CisJCWlmIChzcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDApIHNwcy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR1JBWTg7CisJCWlmIChzcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDEpIHNwcy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKwkJaWYgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMikgc3BzLT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQOworCQlpZiAoc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAzKSBzcHMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFA7CisJCWJyZWFrOworCWNhc2UgOToKKwkJaWYgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMCkgc3BzLT5waXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZOTsKKwkJaWYgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMSkgc3BzLT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOTsKKwkJaWYgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMikgc3BzLT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQOTsKKwkJaWYgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMykgc3BzLT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDRQOTsKKwkJYnJlYWs7CisJY2FzZSAxMDoKKwkJaWYgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMCkgc3BzLT5waXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZMTA7CisJCWlmIChzcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDEpIHNwcy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDEwOworCQlpZiAoc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAyKSBzcHMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlAxMDsKKwkJaWYgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMykgc3BzLT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDRQMTA7CisJCWJyZWFrOworCWNhc2UgMTI6CisJCWlmIChzcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDApIHNwcy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR1JBWTEyOworCQlpZiAoc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAxKSBzcHMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFAxMjsKKwkJaWYgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMikgc3BzLT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQMTI7CisJCWlmIChzcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDMpIHNwcy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDQ0UDEyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsICJUaGUgZm9sbG93aW5nIGJpdC1kZXB0aHMgYXJlIGN1cnJlbnRseSBzcGVjaWZpZWQ6IDgsIDksIDEwIGFuZCAxMiBiaXRzLCAiCisJCQkiY2hyb21hX2Zvcm1hdF9pZGMgaXMgJWQsIGRlcHRoIGlzICVkXG4iLAorCQkJc3BzLT5jaHJvbWFfZm9ybWF0X2lkYywgc3BzLT5iaXRfZGVwdGgpOworCQlyZXR1cm4gLTE7CisJfQorCisJLypkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChzcHMtPnBpeF9mbXQpOworCWlmICghZGVzYykKKwkJcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworCXNwcy0+aHNoaWZ0WzBdID0gc3BzLT52c2hpZnRbMF0gPSAwOworCXNwcy0+aHNoaWZ0WzJdID0gc3BzLT5oc2hpZnRbMV0gPSBkZXNjLT5sb2cyX2Nocm9tYV93OworCXNwcy0+dnNoaWZ0WzJdID0gc3BzLT52c2hpZnRbMV0gPSBkZXNjLT5sb2cyX2Nocm9tYV9oOyovCisKKwlzcHMtPnBpeGVsX3NoaWZ0ID0gc3BzLT5iaXRfZGVwdGggPiA4OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9kZWZhdWx0X3NjYWxpbmdfbGlzdF9kYXRhKHN0cnVjdCBTY2FsaW5nTGlzdCAqc2wpCit7CisJaW50IG1hdHJpeElkOworCisJZm9yIChtYXRyaXhJZCA9IDA7IG1hdHJpeElkIDwgNjsgbWF0cml4SWQrKykgeworCQkvLyA0eDQgZGVmYXVsdCBpcyAxNgorCQltZW1zZXQoc2wtPnNsWzBdW21hdHJpeElkXSwgMTYsIDE2KTsKKwkJc2wtPnNsX2RjWzBdW21hdHJpeElkXSA9IDE2OyAvLyBkZWZhdWx0IGZvciAxNngxNgorCQlzbC0+c2xfZGNbMV1bbWF0cml4SWRdID0gMTY7IC8vIGRlZmF1bHQgZm9yIDMyeDMyCisJfQorCW1lbWNweShzbC0+c2xbMV1bMF0sIGRlZmF1bHRfc2NhbGluZ19saXN0X2ludHJhLCA2NCk7CisJbWVtY3B5KHNsLT5zbFsxXVsxXSwgZGVmYXVsdF9zY2FsaW5nX2xpc3RfaW50cmEsIDY0KTsKKwltZW1jcHkoc2wtPnNsWzFdWzJdLCBkZWZhdWx0X3NjYWxpbmdfbGlzdF9pbnRyYSwgNjQpOworCW1lbWNweShzbC0+c2xbMV1bM10sIGRlZmF1bHRfc2NhbGluZ19saXN0X2ludGVyLCA2NCk7CisJbWVtY3B5KHNsLT5zbFsxXVs0XSwgZGVmYXVsdF9zY2FsaW5nX2xpc3RfaW50ZXIsIDY0KTsKKwltZW1jcHkoc2wtPnNsWzFdWzVdLCBkZWZhdWx0X3NjYWxpbmdfbGlzdF9pbnRlciwgNjQpOworCW1lbWNweShzbC0+c2xbMl1bMF0sIGRlZmF1bHRfc2NhbGluZ19saXN0X2ludHJhLCA2NCk7CisJbWVtY3B5KHNsLT5zbFsyXVsxXSwgZGVmYXVsdF9zY2FsaW5nX2xpc3RfaW50cmEsIDY0KTsKKwltZW1jcHkoc2wtPnNsWzJdWzJdLCBkZWZhdWx0X3NjYWxpbmdfbGlzdF9pbnRyYSwgNjQpOworCW1lbWNweShzbC0+c2xbMl1bM10sIGRlZmF1bHRfc2NhbGluZ19saXN0X2ludGVyLCA2NCk7CisJbWVtY3B5KHNsLT5zbFsyXVs0XSwgZGVmYXVsdF9zY2FsaW5nX2xpc3RfaW50ZXIsIDY0KTsKKwltZW1jcHkoc2wtPnNsWzJdWzVdLCBkZWZhdWx0X3NjYWxpbmdfbGlzdF9pbnRlciwgNjQpOworCW1lbWNweShzbC0+c2xbM11bMF0sIGRlZmF1bHRfc2NhbGluZ19saXN0X2ludHJhLCA2NCk7CisJbWVtY3B5KHNsLT5zbFszXVsxXSwgZGVmYXVsdF9zY2FsaW5nX2xpc3RfaW50cmEsIDY0KTsKKwltZW1jcHkoc2wtPnNsWzNdWzJdLCBkZWZhdWx0X3NjYWxpbmdfbGlzdF9pbnRyYSwgNjQpOworCW1lbWNweShzbC0+c2xbM11bM10sIGRlZmF1bHRfc2NhbGluZ19saXN0X2ludGVyLCA2NCk7CisJbWVtY3B5KHNsLT5zbFszXVs0XSwgZGVmYXVsdF9zY2FsaW5nX2xpc3RfaW50ZXIsIDY0KTsKKwltZW1jcHkoc2wtPnNsWzNdWzVdLCBkZWZhdWx0X3NjYWxpbmdfbGlzdF9pbnRlciwgNjQpOworfQorCitzdGF0aWMgaW50IHNjYWxpbmdfbGlzdF9kYXRhKHN0cnVjdCBnZXRfYml0c19jb250ZXh0ICpnYiwKKwlzdHJ1Y3QgU2NhbGluZ0xpc3QgKnNsLCBzdHJ1Y3QgaDI2NV9TUFNfdCAqc3BzKQoreworCXU4IHNjYWxpbmdfbGlzdF9wcmVkX21vZGVfZmxhZzsKKwlpbnQgc2NhbGluZ19saXN0X2RjX2NvZWZbMl1bNl07CisJaW50IHNpemVfaWQsIG1hdHJpeF9pZCwgcG9zOworCWludCBpOworCisJZm9yIChzaXplX2lkID0gMDsgc2l6ZV9pZCA8IDQ7IHNpemVfaWQrKykKKwkJZm9yIChtYXRyaXhfaWQgPSAwOyBtYXRyaXhfaWQgPCA2OyBtYXRyaXhfaWQgKz0gKChzaXplX2lkID09IDMpID8gMyA6IDEpKSB7CisJCQlzY2FsaW5nX2xpc3RfcHJlZF9tb2RlX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCQkJaWYgKCFzY2FsaW5nX2xpc3RfcHJlZF9tb2RlX2ZsYWcpIHsKKwkJCQl1MzIgZGVsdGEgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworCQkJCS8qIE9ubHkgbmVlZCB0byBoYW5kbGUgbm9uLXplcm8gZGVsdGEuIFplcm8gbWVhbnMgZGVmYXVsdCwKKwkJCQkqIHdoaWNoIHNob3VsZCBhbHJlYWR5IGJlIGluIHRoZSBhcnJheXMuICovCisJCQkJaWYgKGRlbHRhKSB7CisJCQkJCS8vIENvcHkgZnJvbSBwcmV2aW91cyBhcnJheS4KKwkJCQkJZGVsdGEgKj0gKHNpemVfaWQgPT0gMykgPyAzIDogMTsKKwkJCQkJaWYgKG1hdHJpeF9pZCA8IGRlbHRhKSB7CisJCQkJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgIkludmFsaWQgZGVsdGEgaW4gc2NhbGluZyBsaXN0IGRhdGE6ICVkLlxuIiwgZGVsdGEpOworCQkJCQkJcmV0dXJuIC0xOworCQkJCQl9CisKKwkJCQkJbWVtY3B5KHNsLT5zbFtzaXplX2lkXVttYXRyaXhfaWRdLAorCQkJCQkJc2wtPnNsW3NpemVfaWRdW21hdHJpeF9pZCAtIGRlbHRhXSwKKwkJCQkJCXNpemVfaWQgPiAwID8gNjQgOiAxNik7CisJCQkJCWlmIChzaXplX2lkID4gMSkKKwkJCQkJCXNsLT5zbF9kY1tzaXplX2lkIC0gMl1bbWF0cml4X2lkXSA9IHNsLT5zbF9kY1tzaXplX2lkIC0gMl1bbWF0cml4X2lkIC0gZGVsdGFdOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaW50IG5leHRfY29lZiwgY29lZl9udW07CisJCQkJaW50IHNjYWxpbmdfbGlzdF9kZWx0YV9jb2VmOworCisJCQkJbmV4dF9jb2VmID0gODsKKwkJCQljb2VmX251bSA9IEZGTUlOKDY0LCAxIDw8ICg0ICsgKHNpemVfaWQgPDwgMSkpKTsKKwkJCQlpZiAoc2l6ZV9pZCA+IDEpIHsKKwkJCQkJc2NhbGluZ19saXN0X2RjX2NvZWZbc2l6ZV9pZCAtIDJdW21hdHJpeF9pZF0gPSBnZXRfc2VfZ29sb21iKGdiKSArIDg7CisJCQkJCW5leHRfY29lZiA9IHNjYWxpbmdfbGlzdF9kY19jb2VmW3NpemVfaWQgLSAyXVttYXRyaXhfaWRdOworCQkJCQlzbC0+c2xfZGNbc2l6ZV9pZCAtIDJdW21hdHJpeF9pZF0gPSBuZXh0X2NvZWY7CisJCQkJfQorCQkJCWZvciAoaSA9IDA7IGkgPCBjb2VmX251bTsgaSsrKSB7CisJCQkJCWlmIChzaXplX2lkID09IDApCisJCQkJCQlwb3MgPSA0ICogZmZfaGV2Y19kaWFnX3NjYW40eDRfeVtpXSArCisJCQkJCQkJZmZfaGV2Y19kaWFnX3NjYW40eDRfeFtpXTsKKwkJCQkJZWxzZQorCQkJCQkJcG9zID0gOCAqIGZmX2hldmNfZGlhZ19zY2FuOHg4X3lbaV0gKworCQkJCQkJCWZmX2hldmNfZGlhZ19zY2FuOHg4X3hbaV07CisKKwkJCQkJc2NhbGluZ19saXN0X2RlbHRhX2NvZWYgPSBnZXRfc2VfZ29sb21iKGdiKTsKKwkJCQkJbmV4dF9jb2VmID0gKG5leHRfY29lZiArIDI1NlUgKyBzY2FsaW5nX2xpc3RfZGVsdGFfY29lZikgJSAyNTY7CisJCQkJCXNsLT5zbFtzaXplX2lkXVttYXRyaXhfaWRdW3Bvc10gPSBuZXh0X2NvZWY7CisJCQkJfQorCQkJfQorCQl9CisKKwlpZiAoc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAzKSB7CisJCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisJCQlzbC0+c2xbM11bMV1baV0gPSBzbC0+c2xbMl1bMV1baV07CisJCQlzbC0+c2xbM11bMl1baV0gPSBzbC0+c2xbMl1bMl1baV07CisJCQlzbC0+c2xbM11bNF1baV0gPSBzbC0+c2xbMl1bNF1baV07CisJCQlzbC0+c2xbM11bNV1baV0gPSBzbC0+c2xbMl1bNV1baV07CisJCX0KKwkJc2wtPnNsX2RjWzFdWzFdID0gc2wtPnNsX2RjWzBdWzFdOworCQlzbC0+c2xfZGNbMV1bMl0gPSBzbC0+c2xfZGNbMF1bMl07CisJCXNsLT5zbF9kY1sxXVs0XSA9IHNsLT5zbF9kY1swXVs0XTsKKwkJc2wtPnNsX2RjWzFdWzVdID0gc2wtPnNsX2RjWzBdWzVdOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgZmZfaGV2Y19kZWNvZGVfc2hvcnRfdGVybV9ycHMoc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKmdiLAorCXN0cnVjdCBTaG9ydFRlcm1SUFMgKnJwcywgY29uc3Qgc3RydWN0IGgyNjVfU1BTX3QgKnNwcywgaW50IGlzX3NsaWNlX2hlYWRlcikKK3sKKwl1OCBycHNfcHJlZGljdCA9IDA7CisJaW50IGRlbHRhX3BvYzsKKwlpbnQgazAgPSAwOworCWludCBrMSA9IDA7CisJaW50IGsgID0gMDsKKwlpbnQgaTsKKworCWlmIChycHMgIT0gc3BzLT5zdF9ycHMgJiYgc3BzLT5uYl9zdF9ycHMpCisJCXJwc19wcmVkaWN0ID0gZ2V0X2JpdHMxKGdiKTsKKworCWlmIChycHNfcHJlZGljdCkgeworCQljb25zdCBzdHJ1Y3QgU2hvcnRUZXJtUlBTICpycHNfcmlkeDsKKwkJaW50IGRlbHRhX3JwczsKKwkJdTMyIGFic19kZWx0YV9ycHM7CisJCXU4IHVzZV9kZWx0YV9mbGFnID0gMDsKKwkJdTggZGVsdGFfcnBzX3NpZ247CisKKwkJaWYgKGlzX3NsaWNlX2hlYWRlcikgeworCQkJdTMyIGRlbHRhX2lkeCA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKyAxOworCQkJaWYgKGRlbHRhX2lkeCA+IHNwcy0+bmJfc3RfcnBzKSB7CisJCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJJbnZhbGlkIHZhbHVlIG9mIGRlbHRhX2lkeCBpbiBzbGljZSBoZWFkZXIgUlBTOiAlZCA+ICVkLlxuIiwKKwkJCQkJZGVsdGFfaWR4LCBzcHMtPm5iX3N0X3Jwcyk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcnBzX3JpZHggPSAmc3BzLT5zdF9ycHNbc3BzLT5uYl9zdF9ycHMgLSBkZWx0YV9pZHhdOworCQkJcnBzLT5ycHNfaWR4X251bV9kZWx0YV9wb2NzID0gcnBzX3JpZHgtPm51bV9kZWx0YV9wb2NzOworCQl9IGVsc2UKKwkJCXJwc19yaWR4ID0gJnNwcy0+c3RfcnBzW3JwcyAtIHNwcy0+c3RfcnBzIC0gMV07CisKKwkJZGVsdGFfcnBzX3NpZ24gPSBnZXRfYml0czEoZ2IpOworCQlhYnNfZGVsdGFfcnBzICA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKyAxOworCQlpZiAoYWJzX2RlbHRhX3JwcyA8IDEgfHwgYWJzX2RlbHRhX3JwcyA+IDMyNzY4KSB7CisJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgIkludmFsaWQgdmFsdWUgb2YgYWJzX2RlbHRhX3JwczogJWRcbiIsCisJCQkJYWJzX2RlbHRhX3Jwcyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZGVsdGFfcnBzID0gKDEgLSAoZGVsdGFfcnBzX3NpZ24gPDwgMSkpICogYWJzX2RlbHRhX3JwczsKKwkJZm9yIChpID0gMDsgaSA8PSBycHNfcmlkeC0+bnVtX2RlbHRhX3BvY3M7IGkrKykgeworCQkJaW50IHVzZWQgPSBycHMtPnVzZWRba10gPSBnZXRfYml0czEoZ2IpOworCisJCQlpZiAoIXVzZWQpCisJCQkJdXNlX2RlbHRhX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCisJCQlpZiAodXNlZCB8fCB1c2VfZGVsdGFfZmxhZykgeworCQkJCWlmIChpIDwgcnBzX3JpZHgtPm51bV9kZWx0YV9wb2NzKQorCQkJCQlkZWx0YV9wb2MgPSBkZWx0YV9ycHMgKyBycHNfcmlkeC0+ZGVsdGFfcG9jW2ldOworCQkJCWVsc2UKKwkJCQkJZGVsdGFfcG9jID0gZGVsdGFfcnBzOworCQkJCXJwcy0+ZGVsdGFfcG9jW2tdID0gZGVsdGFfcG9jOworCQkJCWlmIChkZWx0YV9wb2MgPCAwKQorCQkJCQlrMCsrOworCQkJCWVsc2UKKwkJCQkJazErKzsKKwkJCQlrKys7CisJCQl9CisJCX0KKworCQlpZiAoayA+PSBBUlJBWV9TSVpFKHJwcy0+dXNlZCkpIHsKKwkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAiSW52YWxpZCBudW1fZGVsdGFfcG9jczogJWRcbiIsIGspOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJcnBzLT5udW1fZGVsdGFfcG9jcwk9IGs7CisJCXJwcy0+bnVtX25lZ2F0aXZlX3BpY3MJPSBrMDsKKwkJLy8gc29ydCBpbiBpbmNyZWFzaW5nIG9yZGVyIChzbWFsbGVzdCBmaXJzdCkKKwkJaWYgKHJwcy0+bnVtX2RlbHRhX3BvY3MgIT0gMCkgeworCQkJaW50IHVzZWQsIHRtcDsKKwkJCWZvciAoaSA9IDE7IGkgPCBycHMtPm51bV9kZWx0YV9wb2NzOyBpKyspIHsKKwkJCQlkZWx0YV9wb2MJPSBycHMtPmRlbHRhX3BvY1tpXTsKKwkJCQl1c2VkCQk9IHJwcy0+dXNlZFtpXTsKKwkJCQlmb3IgKGsgPSBpIC0gMTsgayA+PSAwOyBrLS0pIHsKKwkJCQl0bXAgPSBycHMtPmRlbHRhX3BvY1trXTsKKwkJCQkJaWYgKGRlbHRhX3BvYyA8IHRtcCkgeworCQkJCQkJcnBzLT5kZWx0YV9wb2NbayArIDFdCT0gdG1wOworCQkJCQkJcnBzLT51c2VkW2sgKyAxXQk9IHJwcy0+dXNlZFtrXTsKKwkJCQkJCXJwcy0+ZGVsdGFfcG9jW2tdCT0gZGVsdGFfcG9jOworCQkJCQkJcnBzLT51c2VkW2tdCQk9IHVzZWQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKChycHMtPm51bV9uZWdhdGl2ZV9waWNzID4+IDEpICE9IDApIHsKKwkJCWludCB1c2VkOworCQkJayA9IHJwcy0+bnVtX25lZ2F0aXZlX3BpY3MgLSAxOworCQkJLy8gZmxpcCB0aGUgbmVnYXRpdmUgdmFsdWVzIHRvIGxhcmdlc3QgZmlyc3QKKwkJCWZvciAoaSA9IDA7IGkgPCBycHMtPm51bV9uZWdhdGl2ZV9waWNzID4+IDE7IGkrKykgeworCQkJCWRlbHRhX3BvYwk9IHJwcy0+ZGVsdGFfcG9jW2ldOworCQkJCXVzZWQJCT0gcnBzLT51c2VkW2ldOworCQkJCXJwcy0+ZGVsdGFfcG9jW2ldID0gcnBzLT5kZWx0YV9wb2Nba107CisJCQkJcnBzLT51c2VkW2ldCT0gcnBzLT51c2VkW2tdOworCQkJCXJwcy0+ZGVsdGFfcG9jW2tdID0gZGVsdGFfcG9jOworCQkJCXJwcy0+dXNlZFtrXQk9IHVzZWQ7CisJCQkJay0tOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJdTMyIHByZXYsIG5iX3Bvc2l0aXZlX3BpY3M7CisJCXJwcy0+bnVtX25lZ2F0aXZlX3BpY3MJPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworCQluYl9wb3NpdGl2ZV9waWNzCT0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKworCQlpZiAocnBzLT5udW1fbmVnYXRpdmVfcGljcyA+PSBIRVZDX01BWF9SRUZTIHx8CisJCQluYl9wb3NpdGl2ZV9waWNzID49IEhFVkNfTUFYX1JFRlMpIHsKKwkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAiVG9vIG1hbnkgcmVmcyBpbiBhIHNob3J0IHRlcm0gUlBTLlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlycHMtPm51bV9kZWx0YV9wb2NzID0gcnBzLT5udW1fbmVnYXRpdmVfcGljcyArIG5iX3Bvc2l0aXZlX3BpY3M7CisJCWlmIChycHMtPm51bV9kZWx0YV9wb2NzKSB7CisJCQlwcmV2ID0gMDsKKwkJCWZvciAoaSA9IDA7IGkgPCBycHMtPm51bV9uZWdhdGl2ZV9waWNzOyBpKyspIHsKKwkJCQlkZWx0YV9wb2MgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpICsgMTsKKwkJCQlpZiAoZGVsdGFfcG9jIDwgMSB8fCBkZWx0YV9wb2MgPiAzMjc2OCkgeworCQkJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgIkludmFsaWQgdmFsdWUgb2YgZGVsdGFfcG9jOiAlZFxuIiwKKwkJCQkJCWRlbHRhX3BvYyk7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJcHJldiAtPSBkZWx0YV9wb2M7CisJCQkJcnBzLT5kZWx0YV9wb2NbaV0gPSBwcmV2OworCQkJCXJwcy0+dXNlZFtpXSA9IGdldF9iaXRzMShnYik7CisJCQl9CisJCQlwcmV2ID0gMDsKKwkJCWZvciAoaSA9IDA7IGkgPCBuYl9wb3NpdGl2ZV9waWNzOyBpKyspIHsKKwkJCQlkZWx0YV9wb2MgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpICsgMTsKKwkJCQlpZiAoZGVsdGFfcG9jIDwgMSB8fCBkZWx0YV9wb2MgPiAzMjc2OCkgeworCQkJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgIkludmFsaWQgdmFsdWUgb2YgZGVsdGFfcG9jOiAlZFxuIiwKKwkJCQkJCWRlbHRhX3BvYyk7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJcHJldiArPSBkZWx0YV9wb2M7CisJCQkJcnBzLT5kZWx0YV9wb2NbcnBzLT5udW1fbmVnYXRpdmVfcGljcyArIGldID0gcHJldjsKKwkJCQlycHMtPnVzZWRbcnBzLT5udW1fbmVnYXRpdmVfcGljcyArIGldID0gZ2V0X2JpdHMxKGdiKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVjb2RlX3Z1aShzdHJ1Y3QgZ2V0X2JpdHNfY29udGV4dCAqZ2IsIHN0cnVjdCBoMjY1X1NQU190ICpzcHMpCit7CisJc3RydWN0IFZVSSBiYWNrdXBfdnVpLCAqdnVpID0gJnNwcy0+dnVpOworCXN0cnVjdCBnZXRfYml0c19jb250ZXh0IGJhY2t1cDsKKwlpbnQgc2FyX3ByZXNlbnQsIGFsdCA9IDA7CisKKwl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsICJEZWNvZGluZyBWVUlcbiIpOworCisJc2FyX3ByZXNlbnQgPSBnZXRfYml0czEoZ2IpOworCWlmIChzYXJfcHJlc2VudCkgeworCQl1OCBzYXJfaWR4ID0gZ2V0X2JpdHMoZ2IsIDgpOworCQlpZiAoc2FyX2lkeCA8IEFSUkFZX1NJWkUodnVpX3NhcikpCisJCQl2dWktPnNhciA9IHZ1aV9zYXJbc2FyX2lkeF07CisJCWVsc2UgaWYgKHNhcl9pZHggPT0gMjU1KSB7CisJCQl2dWktPnNhci5udW0gPSBnZXRfYml0cyhnYiwgMTYpOworCQkJdnVpLT5zYXIuZGVuID0gZ2V0X2JpdHMoZ2IsIDE2KTsKKwkJfSBlbHNlCisJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsCisJCQkJIlVua25vd24gU0FSIGluZGV4OiAldS5cbiIsIHNhcl9pZHgpOworCX0KKworCXZ1aS0+b3ZlcnNjYW5faW5mb19wcmVzZW50X2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCWlmICh2dWktPm92ZXJzY2FuX2luZm9fcHJlc2VudF9mbGFnKQorCQl2dWktPm92ZXJzY2FuX2FwcHJvcHJpYXRlX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCisJdnVpLT52aWRlb19zaWduYWxfdHlwZV9wcmVzZW50X2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCWlmICh2dWktPnZpZGVvX3NpZ25hbF90eXBlX3ByZXNlbnRfZmxhZykgeworCQl2dWktPnZpZGVvX2Zvcm1hdAkJPSBnZXRfYml0cyhnYiwgMyk7CisJCXZ1aS0+dmlkZW9fZnVsbF9yYW5nZV9mbGFnCT0gZ2V0X2JpdHMxKGdiKTsKKwkJdnVpLT5jb2xvdXJfZGVzY3JpcHRpb25fcHJlc2VudF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKwkJaWYgKHZ1aS0+dmlkZW9fZnVsbF9yYW5nZV9mbGFnICYmIHNwcy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQyMFApCisJCQlzcHMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVko0MjBQOworCQlpZiAodnVpLT5jb2xvdXJfZGVzY3JpcHRpb25fcHJlc2VudF9mbGFnKSB7CisJCQl2dWktPmNvbG91cl9wcmltYXJpZXMJCT0gZ2V0X2JpdHMoZ2IsIDgpOworCQkJdnVpLT50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpYwk9IGdldF9iaXRzKGdiLCA4KTsKKwkJCXZ1aS0+bWF0cml4X2NvZWZmcwkJPSBnZXRfYml0cyhnYiwgOCk7CisKKwkJCS8vIFNldCBpbnZhbGlkIHZhbHVlcyB0byAidW5zcGVjaWZpZWQiCisJCQlpZiAoIWF2X2NvbG9yX3ByaW1hcmllc19uYW1lKHZ1aS0+Y29sb3VyX3ByaW1hcmllcykpCisJCQkJdnVpLT5jb2xvdXJfcHJpbWFyaWVzID0gQVZDT0xfUFJJX1VOU1BFQ0lGSUVEOworCQkJaWYgKCFhdl9jb2xvcl90cmFuc2Zlcl9uYW1lKHZ1aS0+dHJhbnNmZXJfY2hhcmFjdGVyaXN0aWMpKQorCQkJCXZ1aS0+dHJhbnNmZXJfY2hhcmFjdGVyaXN0aWMgPSBBVkNPTF9UUkNfVU5TUEVDSUZJRUQ7CisJCQlpZiAoIWF2X2NvbG9yX3NwYWNlX25hbWUodnVpLT5tYXRyaXhfY29lZmZzKSkKKwkJCQl2dWktPm1hdHJpeF9jb2VmZnMgPSBBVkNPTF9TUENfVU5TUEVDSUZJRUQ7CisJCQlpZiAodnVpLT5tYXRyaXhfY29lZmZzID09IEFWQ09MX1NQQ19SR0IpIHsKKwkJCQlzd2l0Y2ggKHNwcy0+cGl4X2ZtdCkgeworCQkJCWNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQOgorCQkJCQlzcHMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dCUlA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTA6CisJCQkJCXNwcy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR0JSUDEwOworCQkJCQlicmVhazsKKwkJCQljYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDEyOgorCQkJCQlzcHMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dCUlAxMjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJdnVpLT5jaHJvbWFfbG9jX2luZm9fcHJlc2VudF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKwlpZiAodnVpLT5jaHJvbWFfbG9jX2luZm9fcHJlc2VudF9mbGFnKSB7CisJCXZ1aS0+Y2hyb21hX3NhbXBsZV9sb2NfdHlwZV90b3BfZmllbGQgICAgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworCQl2dWktPmNocm9tYV9zYW1wbGVfbG9jX3R5cGVfYm90dG9tX2ZpZWxkID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKwl9CisKKwl2dWktPm5ldXRyYV9jaHJvbWFfaW5kaWNhdGlvbl9mbGFnCT0gZ2V0X2JpdHMxKGdiKTsKKwl2dWktPmZpZWxkX3NlcV9mbGFnCQkJPSBnZXRfYml0czEoZ2IpOworCXZ1aS0+ZnJhbWVfZmllbGRfaW5mb19wcmVzZW50X2ZsYWcJPSBnZXRfYml0czEoZ2IpOworCisJLy8gQmFja3VwIGNvbnRleHQgaW4gY2FzZSBhbiBhbHRlcm5hdGUgaGVhZGVyIGlzIGRldGVjdGVkCisJbWVtY3B5KCZiYWNrdXAsIGdiLCBzaXplb2YoYmFja3VwKSk7CisJbWVtY3B5KCZiYWNrdXBfdnVpLCB2dWksIHNpemVvZihiYWNrdXBfdnVpKSk7CisJaWYgKGdldF9iaXRzX2xlZnQoZ2IpID49IDY4ICYmIHNob3dfYml0c19sb25nKGdiLCAyMSkgPT0gMHgxMDAwMDApIHsKKwkJdnVpLT5kZWZhdWx0X2Rpc3BsYXlfd2luZG93X2ZsYWcgPSAwOworCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsICJJbnZhbGlkIGRlZmF1bHQgZGlzcGxheSB3aW5kb3dcbiIpOworCX0gZWxzZQorCQl2dWktPmRlZmF1bHRfZGlzcGxheV93aW5kb3dfZmxhZyA9IGdldF9iaXRzMShnYik7CisKKwlpZiAodnVpLT5kZWZhdWx0X2Rpc3BsYXlfd2luZG93X2ZsYWcpIHsKKwkJaW50IHZlcnRfbXVsdCAgPSBoZXZjX3N1Yl9oZWlnaHRfY1tzcHMtPmNocm9tYV9mb3JtYXRfaWRjXTsKKwkJaW50IGhvcml6X211bHQgPSBoZXZjX3N1Yl93aWR0aF9jW3Nwcy0+Y2hyb21hX2Zvcm1hdF9pZGNdOworCQl2dWktPmRlZl9kaXNwX3dpbi5sZWZ0X29mZnNldAk9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKiBob3Jpel9tdWx0OworCQl2dWktPmRlZl9kaXNwX3dpbi5yaWdodF9vZmZzZXQJPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpICogaG9yaXpfbXVsdDsKKwkJdnVpLT5kZWZfZGlzcF93aW4udG9wX29mZnNldAk9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKiAgdmVydF9tdWx0OworCQl2dWktPmRlZl9kaXNwX3dpbi5ib3R0b21fb2Zmc2V0CT0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSAqICB2ZXJ0X211bHQ7CisJfQorCit0aW1pbmdfaW5mbzoKKwl2dWktPnZ1aV90aW1pbmdfaW5mb19wcmVzZW50X2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCisJaWYgKHZ1aS0+dnVpX3RpbWluZ19pbmZvX3ByZXNlbnRfZmxhZykgeworCQlpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCA2NiAmJiAhYWx0KSB7CisJCQkvLyBUaGUgYWx0ZXJuYXRlIHN5bnRheCBzZWVtIHRvIGhhdmUgdGltaW5nIGluZm8gbG9jYXRlZAorCQkJLy8gYXQgd2hlcmUgZGVmX2Rpc3Bfd2luIGlzIG5vcm1hbGx5IGxvY2F0ZWQKKwkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX1BBUlNFUiwgIlN0cmFuZ2UgVlVJIHRpbWluZyBpbmZvcm1hdGlvbiwgcmV0cnlpbmcuLi5cbiIpOworCQkJbWVtY3B5KHZ1aSwgJmJhY2t1cF92dWksIHNpemVvZihiYWNrdXBfdnVpKSk7CisJCQltZW1jcHkoZ2IsICZiYWNrdXAsIHNpemVvZihiYWNrdXApKTsKKwkJCWFsdCA9IDE7CisJCQlnb3RvIHRpbWluZ19pbmZvOworCQl9CisJCXZ1aS0+dnVpX251bV91bml0c19pbl90aWNrCT0gZ2V0X2JpdHNfbG9uZyhnYiwgMzIpOworCQl2dWktPnZ1aV90aW1lX3NjYWxlCQk9IGdldF9iaXRzX2xvbmcoZ2IsIDMyKTsKKwkJaWYgKGFsdCkgeworCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLCAiUmV0cnkgZ290ICV1LyV1IGZwc1xuIiwKKwkJCXZ1aS0+dnVpX3RpbWVfc2NhbGUsIHZ1aS0+dnVpX251bV91bml0c19pbl90aWNrKTsKKwkJfQorCQl2dWktPnZ1aV9wb2NfcHJvcG9ydGlvbmFsX3RvX3RpbWluZ19mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKwkJaWYgKHZ1aS0+dnVpX3BvY19wcm9wb3J0aW9uYWxfdG9fdGltaW5nX2ZsYWcpCisJCQl2dWktPnZ1aV9udW1fdGlja3NfcG9jX2RpZmZfb25lX21pbnVzMSA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CisJCXZ1aS0+dnVpX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyA9IGdldF9iaXRzMShnYik7CisJCWlmICh2dWktPnZ1aV9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpCisJCQlkZWNvZGVfaHJkKGdiLCAxLCBzcHMtPm1heF9zdWJfbGF5ZXJzKTsKKwl9CisKKwl2dWktPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKwlpZiAodnVpLT5iaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZykgeworCQlpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCA4ICYmICFhbHQpIHsKKwkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX1BBUlNFUiwgIlN0cmFuZ2UgVlVJIGJpdHN0cmVhbSByZXN0cmljdGlvbiBpbmZvcm1hdGlvbiwgcmV0cnlpbmciCisJCQkJIiBmcm9tIHRpbWluZyBpbmZvcm1hdGlvbi4uLlxuIik7CisJCQltZW1jcHkodnVpLCAmYmFja3VwX3Z1aSwgc2l6ZW9mKGJhY2t1cF92dWkpKTsKKwkJCW1lbWNweShnYiwgJmJhY2t1cCwgc2l6ZW9mKGJhY2t1cCkpOworCQkJYWx0ID0gMTsKKwkJCWdvdG8gdGltaW5nX2luZm87CisJCX0KKwkJdnVpLT50aWxlc19maXhlZF9zdHJ1Y3R1cmVfZmxhZwkJPSBnZXRfYml0czEoZ2IpOworCQl2dWktPm1vdGlvbl92ZWN0b3JzX292ZXJfcGljX2JvdW5kYXJpZXNfZmxhZyA9IGdldF9iaXRzMShnYik7CisJCXZ1aS0+cmVzdHJpY3RlZF9yZWZfcGljX2xpc3RzX2ZsYWcJPSBnZXRfYml0czEoZ2IpOworCQl2dWktPm1pbl9zcGF0aWFsX3NlZ21lbnRhdGlvbl9pZGMJPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworCQl2dWktPm1heF9ieXRlc19wZXJfcGljX2Rlbm9tCQk9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CisJCXZ1aS0+bWF4X2JpdHNfcGVyX21pbl9jdV9kZW5vbQkJPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworCQl2dWktPmxvZzJfbWF4X212X2xlbmd0aF9ob3Jpem9udGFsCT0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKwkJdnVpLT5sb2cyX21heF9tdl9sZW5ndGhfdmVydGljYWwJPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworCX0KKworCWlmIChnZXRfYml0c19sZWZ0KGdiKSA8IDEgJiYgIWFsdCkgeworCQkvLyBYWFg6IEFsdGVybmF0ZSBzeW50YXggd2hlbiBzcHNfcmFuZ2VfZXh0ZW5zaW9uX2ZsYWcgIT0gMD8KKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLCAiT3ZlcnJlYWQgaW4gVlVJLCByZXRyeWluZyBmcm9tIHRpbWluZyBpbmZvcm1hdGlvbi4uLlxuIik7CisJCW1lbWNweSh2dWksICZiYWNrdXBfdnVpLCBzaXplb2YoYmFja3VwX3Z1aSkpOworCQltZW1jcHkoZ2IsICZiYWNrdXAsIHNpemVvZihiYWNrdXApKTsKKwkJYWx0ID0gMTsKKwkJZ290byB0aW1pbmdfaW5mbzsKKwl9Cit9CisKK2ludCBmZl9oZXZjX3BhcnNlX3NwcyhzdHJ1Y3QgZ2V0X2JpdHNfY29udGV4dCAqZ2IsIHN0cnVjdCBoMjY1X1NQU190ICpzcHMpCit7CisJaW50IGksIHJldCA9IDA7CisJaW50IGxvZzJfZGlmZl9tYXhfbWluX3RyYW5zZm9ybV9ibG9ja19zaXplOworCWludCBiaXRfZGVwdGhfY2hyb21hLCBzdGFydCwgdnVpX3ByZXNlbnQsIHN1YmxheWVyX29yZGVyaW5nX2luZm87CisJc3RydWN0IEhFVkNXaW5kb3cgKm93OworCisJc3BzLT52cHNfaWQgPSBnZXRfYml0cyhnYiwgNCk7CisJaWYgKHNwcy0+dnBzX2lkID49IEhFVkNfTUFYX1ZQU19DT1VOVCkgeworCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgIlZQUyBpZCBvdXQgb2YgcmFuZ2U6ICVkXG4iLCBzcHMtPnZwc19pZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlzcHMtPm1heF9zdWJfbGF5ZXJzID0gZ2V0X2JpdHMoZ2IsIDMpICsgMTsKKwkJaWYgKHNwcy0+bWF4X3N1Yl9sYXllcnMgPiBIRVZDX01BWF9TVUJfTEFZRVJTKSB7CisJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgInNwc19tYXhfc3ViX2xheWVycyBvdXQgb2YgcmFuZ2U6ICVkXG4iLAorCQkJCXNwcy0+bWF4X3N1Yl9sYXllcnMpOworCQlyZXR1cm4gLTE7CisJfQorCisJc3BzLT50ZW1wb3JhbF9pZF9uZXN0aW5nX2ZsYWcgPSBnZXRfYml0cyhnYiwgMSk7CisKKwlpZiAoKHJldCA9IHBhcnNlX3B0bChnYiwgJnNwcy0+cHRsLCBzcHMtPm1heF9zdWJfbGF5ZXJzKSkgPCAwKQorCQlyZXR1cm4gcmV0OworCisJc3BzLT5zcHNfaWQgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworCWlmIChzcHMtPnNwc19pZCA+PSBIRVZDX01BWF9TUFNfQ09VTlQpIHsKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJTUFMgaWQgb3V0IG9mIHJhbmdlOiAlZFxuIiwgc3BzLT5zcHNfaWQpOworCQlyZXR1cm4gLTE7CisJfQorCisJc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CisJaWYgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPiAzVSkgeworCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgImNocm9tYV9mb3JtYXRfaWRjICVkIGlzIGludmFsaWRcbiIsIHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMykKKwkJc3BzLT5zZXBhcmF0ZV9jb2xvdXJfcGxhbmVfZmxhZyA9IGdldF9iaXRzMShnYik7CisKKwlpZiAoc3BzLT5zZXBhcmF0ZV9jb2xvdXJfcGxhbmVfZmxhZykKKwkJc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9IDA7CisKKwlzcHMtPndpZHRoCT0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKwlzcHMtPmhlaWdodAk9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CisJaWYgKHNwcy0+d2lkdGggPiA4MTkyIHx8IHNwcy0+aGVpZ2h0ID4gODE5MikgeworCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgIndpZHRoIG9yIGhlaWdodCBvdmVyc2l6ZS5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGdldF9iaXRzMShnYikpIHsgLy8gcGljX2NvbmZvcm1hbmNlX2ZsYWcKKwkJaW50IHZlcnRfbXVsdCAgPSBoZXZjX3N1Yl9oZWlnaHRfY1tzcHMtPmNocm9tYV9mb3JtYXRfaWRjXTsKKwkJaW50IGhvcml6X211bHQgPSBoZXZjX3N1Yl93aWR0aF9jW3Nwcy0+Y2hyb21hX2Zvcm1hdF9pZGNdOworCQlzcHMtPnBpY19jb25mX3dpbi5sZWZ0X29mZnNldAk9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKiBob3Jpel9tdWx0OworCQlzcHMtPnBpY19jb25mX3dpbi5yaWdodF9vZmZzZXQJPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpICogaG9yaXpfbXVsdDsKKwkJc3BzLT5waWNfY29uZl93aW4udG9wX29mZnNldAk9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKiAgdmVydF9tdWx0OworCQlzcHMtPnBpY19jb25mX3dpbi5ib3R0b21fb2Zmc2V0ID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSAqICB2ZXJ0X211bHQ7CisJCXNwcy0+b3V0cHV0X3dpbmRvdyA9IHNwcy0+cGljX2NvbmZfd2luOworCX0KKworCXNwcy0+Yml0X2RlcHRoICAgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpICsgODsKKwliaXRfZGVwdGhfY2hyb21hID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSArIDg7CisJaWYgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgJiYgYml0X2RlcHRoX2Nocm9tYSAhPSBzcHMtPmJpdF9kZXB0aCkgeworCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgIkx1bWEgYml0IGRlcHRoICglZCkgaXMgZGlmZmVyZW50IGZyb20gY2hyb21hIGJpdCBkZXB0aCAoJWQpLCB0aGlzIGlzIHVuc3VwcG9ydGVkLlxuIiwKKwkJCXNwcy0+Yml0X2RlcHRoLCBiaXRfZGVwdGhfY2hyb21hKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzcHMtPmJpdF9kZXB0aF9jaHJvbWEgPSBiaXRfZGVwdGhfY2hyb21hOworCisJcmV0ID0gbWFwX3BpeGVsX2Zvcm1hdChzcHMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJc3BzLT5sb2cyX21heF9wb2NfbHNiID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSArIDQ7CisJCWlmIChzcHMtPmxvZzJfbWF4X3BvY19sc2IgPiAxNikgeworCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJsb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgb3V0IHJhbmdlOiAlZFxuIiwKKwkJCQlzcHMtPmxvZzJfbWF4X3BvY19sc2IgLSA0KTsKKwkJcmV0dXJuIC0xOworCX0KKworCXN1YmxheWVyX29yZGVyaW5nX2luZm8gPSBnZXRfYml0czEoZ2IpOworCXN0YXJ0ID0gc3VibGF5ZXJfb3JkZXJpbmdfaW5mbyA/IDAgOiBzcHMtPm1heF9zdWJfbGF5ZXJzIC0gMTsKKwlmb3IgKGkgPSBzdGFydDsgaSA8IHNwcy0+bWF4X3N1Yl9sYXllcnM7IGkrKykgeworCQlzcHMtPnRlbXBvcmFsX2xheWVyW2ldLm1heF9kZWNfcGljX2J1ZmZlcmluZyA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKyAxOworCQlzcHMtPnRlbXBvcmFsX2xheWVyW2ldLm51bV9yZW9yZGVyX3BpY3MgICAgICA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CisJCXNwcy0+dGVtcG9yYWxfbGF5ZXJbaV0ubWF4X2xhdGVuY3lfaW5jcmVhc2UgID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSAtIDE7CisJCWlmIChzcHMtPnRlbXBvcmFsX2xheWVyW2ldLm1heF9kZWNfcGljX2J1ZmZlcmluZyA+ICh1MzIpSEVWQ19NQVhfRFBCX1NJWkUpIHsKKwkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAic3BzX21heF9kZWNfcGljX2J1ZmZlcmluZ19taW51czEgb3V0IG9mIHJhbmdlOiAlZFxuIiwKKwkJCQlzcHMtPnRlbXBvcmFsX2xheWVyW2ldLm1heF9kZWNfcGljX2J1ZmZlcmluZyAtIDFVKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAoc3BzLT50ZW1wb3JhbF9sYXllcltpXS5udW1fcmVvcmRlcl9waWNzID4gc3BzLT50ZW1wb3JhbF9sYXllcltpXS5tYXhfZGVjX3BpY19idWZmZXJpbmcgLSAxKSB7CisJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsICJzcHNfbWF4X251bV9yZW9yZGVyX3BpY3Mgb3V0IG9mIHJhbmdlOiAlZFxuIiwKKwkJCQlzcHMtPnRlbXBvcmFsX2xheWVyW2ldLm51bV9yZW9yZGVyX3BpY3MpOworCQkJaWYgKHNwcy0+dGVtcG9yYWxfbGF5ZXJbaV0ubnVtX3Jlb3JkZXJfcGljcyA+IEhFVkNfTUFYX0RQQl9TSVpFIC0gMSkgeworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXNwcy0+dGVtcG9yYWxfbGF5ZXJbaV0ubWF4X2RlY19waWNfYnVmZmVyaW5nID0gc3BzLT50ZW1wb3JhbF9sYXllcltpXS5udW1fcmVvcmRlcl9waWNzICsgMTsKKwkJfQorCX0KKworCWlmICghc3VibGF5ZXJfb3JkZXJpbmdfaW5mbykgeworCQlmb3IgKGkgPSAwOyBpIDwgc3RhcnQ7IGkrKykgeworCQkJc3BzLT50ZW1wb3JhbF9sYXllcltpXS5tYXhfZGVjX3BpY19idWZmZXJpbmcgPSBzcHMtPnRlbXBvcmFsX2xheWVyW3N0YXJ0XS5tYXhfZGVjX3BpY19idWZmZXJpbmc7CisJCQlzcHMtPnRlbXBvcmFsX2xheWVyW2ldLm51bV9yZW9yZGVyX3BpY3MJID0gc3BzLT50ZW1wb3JhbF9sYXllcltzdGFydF0ubnVtX3Jlb3JkZXJfcGljczsKKwkJCXNwcy0+dGVtcG9yYWxfbGF5ZXJbaV0ubWF4X2xhdGVuY3lfaW5jcmVhc2UgID0gc3BzLT50ZW1wb3JhbF9sYXllcltzdGFydF0ubWF4X2xhdGVuY3lfaW5jcmVhc2U7CisJCX0KKwl9CisKKwlzcHMtPmxvZzJfbWluX2NiX3NpemUJCT0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSArIDM7CisJc3BzLT5sb2cyX2RpZmZfbWF4X21pbl9jb2RpbmdfYmxvY2tfc2l6ZSA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CisJc3BzLT5sb2cyX21pbl90Yl9zaXplCQk9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKyAyOworCWxvZzJfZGlmZl9tYXhfbWluX3RyYW5zZm9ybV9ibG9ja19zaXplID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKwlzcHMtPmxvZzJfbWF4X3RyYWZvX3NpemUJPSBsb2cyX2RpZmZfbWF4X21pbl90cmFuc2Zvcm1fYmxvY2tfc2l6ZSArIHNwcy0+bG9nMl9taW5fdGJfc2l6ZTsKKworCWlmIChzcHMtPmxvZzJfbWluX2NiX3NpemUgPCAzIHx8IHNwcy0+bG9nMl9taW5fY2Jfc2l6ZSA+IDMwKSB7CisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAiSW52YWxpZCB2YWx1ZSAlZCBmb3IgbG9nMl9taW5fY2Jfc2l6ZSIsIHNwcy0+bG9nMl9taW5fY2Jfc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoc3BzLT5sb2cyX2RpZmZfbWF4X21pbl9jb2RpbmdfYmxvY2tfc2l6ZSA+IDMwKSB7CisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAiSW52YWxpZCB2YWx1ZSAlZCBmb3IgbG9nMl9kaWZmX21heF9taW5fY29kaW5nX2Jsb2NrX3NpemUiLCBzcHMtPmxvZzJfZGlmZl9tYXhfbWluX2NvZGluZ19ibG9ja19zaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChzcHMtPmxvZzJfbWluX3RiX3NpemUgPj0gc3BzLT5sb2cyX21pbl9jYl9zaXplIHx8IHNwcy0+bG9nMl9taW5fdGJfc2l6ZSA8IDIpIHsKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJJbnZhbGlkIHZhbHVlIGZvciBsb2cyX21pbl90Yl9zaXplIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAobG9nMl9kaWZmX21heF9taW5fdHJhbnNmb3JtX2Jsb2NrX3NpemUgPCAwIHx8IGxvZzJfZGlmZl9tYXhfbWluX3RyYW5zZm9ybV9ibG9ja19zaXplID4gMzApIHsKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJJbnZhbGlkIHZhbHVlICVkIGZvciBsb2cyX2RpZmZfbWF4X21pbl90cmFuc2Zvcm1fYmxvY2tfc2l6ZSIsIGxvZzJfZGlmZl9tYXhfbWluX3RyYW5zZm9ybV9ibG9ja19zaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXNwcy0+bWF4X3RyYW5zZm9ybV9oaWVyYXJjaHlfZGVwdGhfaW50ZXIgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworCXNwcy0+bWF4X3RyYW5zZm9ybV9oaWVyYXJjaHlfZGVwdGhfaW50cmEgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworCisJc3BzLT5zY2FsaW5nX2xpc3RfZW5hYmxlX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCWlmIChzcHMtPnNjYWxpbmdfbGlzdF9lbmFibGVfZmxhZykgeworCQlzZXRfZGVmYXVsdF9zY2FsaW5nX2xpc3RfZGF0YSgmc3BzLT5zY2FsaW5nX2xpc3QpOworCisJCWlmIChnZXRfYml0czEoZ2IpKSB7CisJCQlyZXQgPSBzY2FsaW5nX2xpc3RfZGF0YShnYiwgJnNwcy0+c2NhbGluZ19saXN0LCBzcHMpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXNwcy0+YW1wX2VuYWJsZWRfZmxhZwk9IGdldF9iaXRzMShnYik7CisJc3BzLT5zYW9fZW5hYmxlZAk9IGdldF9iaXRzMShnYik7CisKKwlzcHMtPnBjbV9lbmFibGVkX2ZsYWcJPSBnZXRfYml0czEoZ2IpOworCWlmIChzcHMtPnBjbV9lbmFibGVkX2ZsYWcpIHsKKwkJc3BzLT5wY20uYml0X2RlcHRoID0gZ2V0X2JpdHMoZ2IsIDQpICsgMTsKKwkJc3BzLT5wY20uYml0X2RlcHRoX2Nocm9tYSA9IGdldF9iaXRzKGdiLCA0KSArIDE7CisJCXNwcy0+cGNtLmxvZzJfbWluX3BjbV9jYl9zaXplID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSArIDM7CisJCXNwcy0+cGNtLmxvZzJfbWF4X3BjbV9jYl9zaXplID0gc3BzLT5wY20ubG9nMl9taW5fcGNtX2NiX3NpemUgKworCQkJZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKwkJaWYgKEZGTUFYKHNwcy0+cGNtLmJpdF9kZXB0aCwgc3BzLT5wY20uYml0X2RlcHRoX2Nocm9tYSkgPiBzcHMtPmJpdF9kZXB0aCkgeworCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJQQ00gYml0IGRlcHRoICglZCwgJWQpIGlzIGdyZWF0ZXIgdGhhbiBub3JtYWwgYml0IGRlcHRoICglZClcbiIsCisJCQkJc3BzLT5wY20uYml0X2RlcHRoLCBzcHMtPnBjbS5iaXRfZGVwdGhfY2hyb21hLCBzcHMtPmJpdF9kZXB0aCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlzcHMtPnBjbS5sb29wX2ZpbHRlcl9kaXNhYmxlX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCX0KKworCXNwcy0+bmJfc3RfcnBzID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKwlpZiAoc3BzLT5uYl9zdF9ycHMgPiBIRVZDX01BWF9TSE9SVF9URVJNX1JFRl9QSUNfU0VUUykgeworCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgIlRvbyBtYW55IHNob3J0IHRlcm0gUlBTOiAlZC5cbiIsIHNwcy0+bmJfc3RfcnBzKTsKKwkJcmV0dXJuIC0xOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgc3BzLT5uYl9zdF9ycHM7IGkrKykgeworCQlpZiAoKHJldCA9IGZmX2hldmNfZGVjb2RlX3Nob3J0X3Rlcm1fcnBzKGdiLCAmc3BzLT5zdF9ycHNbaV0sIHNwcywgMCkpIDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJc3BzLT5sb25nX3Rlcm1fcmVmX3BpY3NfcHJlc2VudF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKwlpZiAoc3BzLT5sb25nX3Rlcm1fcmVmX3BpY3NfcHJlc2VudF9mbGFnKSB7CisJCXNwcy0+bnVtX2xvbmdfdGVybV9yZWZfcGljc19zcHMgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworCQlpZiAoc3BzLT5udW1fbG9uZ190ZXJtX3JlZl9waWNzX3NwcyA+IEhFVkNfTUFYX0xPTkdfVEVSTV9SRUZfUElDUykgeworCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJUb28gbWFueSBsb25nIHRlcm0gcmVmIHBpY3M6ICVkLlxuIiwKKwkJCQlzcHMtPm51bV9sb25nX3Rlcm1fcmVmX3BpY3Nfc3BzKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgc3BzLT5udW1fbG9uZ190ZXJtX3JlZl9waWNzX3NwczsgaSsrKSB7CisJCQlzcHMtPmx0X3JlZl9waWNfcG9jX2xzYl9zcHNbaV0gPSBnZXRfYml0cyhnYiwgc3BzLT5sb2cyX21heF9wb2NfbHNiKTsKKwkJCXNwcy0+dXNlZF9ieV9jdXJyX3BpY19sdF9zcHNfZmxhZ1tpXSA9IGdldF9iaXRzMShnYik7CisJCX0KKwl9CisKKwlzcHMtPnNwc190ZW1wb3JhbF9tdnBfZW5hYmxlZF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKwlzcHMtPnNwc19zdHJvbmdfaW50cmFfc21vb3RoaW5nX2VuYWJsZV9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKwlzcHMtPnZ1aS5zYXIgPSAoc3RydWN0IEFWUmF0aW9uYWwpezAsIDF9OworCXZ1aV9wcmVzZW50ID0gZ2V0X2JpdHMxKGdiKTsKKwlpZiAodnVpX3ByZXNlbnQpCisJCWRlY29kZV92dWkoZ2IsIHNwcyk7CisKKwlpZiAoZ2V0X2JpdHMxKGdiKSkgeyAvLyBzcHNfZXh0ZW5zaW9uX2ZsYWcKKwkJc3BzLT5zcHNfcmFuZ2VfZXh0ZW5zaW9uX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCQlza2lwX2JpdHMoZ2IsIDcpOyAvL3Nwc19leHRlbnNpb25fN2JpdHMgPSBnZXRfYml0cyhnYiwgNyk7CisJCWlmIChzcHMtPnNwc19yYW5nZV9leHRlbnNpb25fZmxhZykgeworCQkJc3BzLT50cmFuc2Zvcm1fc2tpcF9yb3RhdGlvbl9lbmFibGVkX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCQkJc3BzLT50cmFuc2Zvcm1fc2tpcF9jb250ZXh0X2VuYWJsZWRfZmxhZyAgPSBnZXRfYml0czEoZ2IpOworCQkJc3BzLT5pbXBsaWNpdF9yZHBjbV9lbmFibGVkX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCQkJc3BzLT5leHBsaWNpdF9yZHBjbV9lbmFibGVkX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCQkJc3BzLT5leHRlbmRlZF9wcmVjaXNpb25fcHJvY2Vzc2luZ19mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKwkJCWlmIChzcHMtPmV4dGVuZGVkX3ByZWNpc2lvbl9wcm9jZXNzaW5nX2ZsYWcpCisJCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLCAiZXh0ZW5kZWRfcHJlY2lzaW9uX3Byb2Nlc3NpbmdfZmxhZyBub3QgeWV0IGltcGxlbWVudGVkXG4iKTsKKworCQkJc3BzLT5pbnRyYV9zbW9vdGhpbmdfZGlzYWJsZWRfZmxhZyA9IGdldF9iaXRzMShnYik7CisJCQlzcHMtPmhpZ2hfcHJlY2lzaW9uX29mZnNldHNfZW5hYmxlZF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKwkJCWlmIChzcHMtPmhpZ2hfcHJlY2lzaW9uX29mZnNldHNfZW5hYmxlZF9mbGFnKQorCQkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX1BBUlNFUiwgImhpZ2hfcHJlY2lzaW9uX29mZnNldHNfZW5hYmxlZF9mbGFnIG5vdCB5ZXQgaW1wbGVtZW50ZWRcbiIpOworCisJCQlzcHMtPnBlcnNpc3RlbnRfcmljZV9hZGFwdGF0aW9uX2VuYWJsZWRfZmxhZyA9IGdldF9iaXRzMShnYik7CisJCQlzcHMtPmNhYmFjX2J5cGFzc19hbGlnbm1lbnRfZW5hYmxlZF9mbGFnICA9IGdldF9iaXRzMShnYik7CisJCQlpZiAoc3BzLT5jYWJhY19ieXBhc3NfYWxpZ25tZW50X2VuYWJsZWRfZmxhZykKKwkJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsICJjYWJhY19ieXBhc3NfYWxpZ25tZW50X2VuYWJsZWRfZmxhZyBub3QgeWV0IGltcGxlbWVudGVkXG4iKTsKKwkJfQorCX0KKworCW93ID0gJnNwcy0+b3V0cHV0X3dpbmRvdzsKKwlpZiAob3ctPmxlZnRfb2Zmc2V0ID49IElOVF9NQVggLSBvdy0+cmlnaHRfb2Zmc2V0CSAgfHwKKwkJb3ctPnRvcF9vZmZzZXQJPj0gSU5UX01BWCAtIG93LT5ib3R0b21fb2Zmc2V0CSAgfHwKKwkJb3ctPmxlZnRfb2Zmc2V0ICsgb3ctPnJpZ2h0X29mZnNldCAgPj0gc3BzLT53aWR0aCB8fAorCQlvdy0+dG9wX29mZnNldAkrIG93LT5ib3R0b21fb2Zmc2V0ID49IHNwcy0+aGVpZ2h0KSB7CisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAiSW52YWxpZCBjcm9wcGluZyBvZmZzZXRzOiAldS8ldS8ldS8ldVxuIiwKKwkJCW93LT5sZWZ0X29mZnNldCwgb3ctPnJpZ2h0X29mZnNldCwgb3ctPnRvcF9vZmZzZXQsIG93LT5ib3R0b21fb2Zmc2V0KTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8vIEluZmVycmVkIHBhcmFtZXRlcnMKKwlzcHMtPmxvZzJfY3RiX3NpemUgPSBzcHMtPmxvZzJfbWluX2NiX3NpemUgKworCXNwcy0+bG9nMl9kaWZmX21heF9taW5fY29kaW5nX2Jsb2NrX3NpemU7CisJc3BzLT5sb2cyX21pbl9wdV9zaXplID0gc3BzLT5sb2cyX21pbl9jYl9zaXplIC0gMTsKKworCWlmIChzcHMtPmxvZzJfY3RiX3NpemUgPiBIRVZDX01BWF9MT0cyX0NUQl9TSVpFKSB7CisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAiQ1RCIHNpemUgb3V0IG9mIHJhbmdlOiAyXiVkXG4iLCBzcHMtPmxvZzJfY3RiX3NpemUpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChzcHMtPmxvZzJfY3RiX3NpemUgPCA0KSB7CisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAibG9nMl9jdGJfc2l6ZSAlZCBkaWZmZXJzIGZyb20gdGhlIGJvdW5kcyBvZiBhbnkga25vd24gcHJvZmlsZVxuIiwgc3BzLT5sb2cyX2N0Yl9zaXplKTsKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJsb2cyX2N0Yl9zaXplICVkIiwgc3BzLT5sb2cyX2N0Yl9zaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXNwcy0+Y3RiX3dpZHRoICA9IChzcHMtPndpZHRoICArICgxIDw8IHNwcy0+bG9nMl9jdGJfc2l6ZSkgLSAxKSA+PiBzcHMtPmxvZzJfY3RiX3NpemU7CisJc3BzLT5jdGJfaGVpZ2h0ID0gKHNwcy0+aGVpZ2h0ICsgKDEgPDwgc3BzLT5sb2cyX2N0Yl9zaXplKSAtIDEpID4+IHNwcy0+bG9nMl9jdGJfc2l6ZTsKKwlzcHMtPmN0Yl9zaXplICAgPSBzcHMtPmN0Yl93aWR0aCAqIHNwcy0+Y3RiX2hlaWdodDsKKworCXNwcy0+bWluX2NiX3dpZHRoICA9IHNwcy0+d2lkdGggID4+IHNwcy0+bG9nMl9taW5fY2Jfc2l6ZTsKKwlzcHMtPm1pbl9jYl9oZWlnaHQgPSBzcHMtPmhlaWdodCA+PiBzcHMtPmxvZzJfbWluX2NiX3NpemU7CisJc3BzLT5taW5fdGJfd2lkdGggID0gc3BzLT53aWR0aCAgPj4gc3BzLT5sb2cyX21pbl90Yl9zaXplOworCXNwcy0+bWluX3RiX2hlaWdodCA9IHNwcy0+aGVpZ2h0ID4+IHNwcy0+bG9nMl9taW5fdGJfc2l6ZTsKKwlzcHMtPm1pbl9wdV93aWR0aCAgPSBzcHMtPndpZHRoICA+PiBzcHMtPmxvZzJfbWluX3B1X3NpemU7CisJc3BzLT5taW5fcHVfaGVpZ2h0ID0gc3BzLT5oZWlnaHQgPj4gc3BzLT5sb2cyX21pbl9wdV9zaXplOworCXNwcy0+dGJfbWFzayAgICAgICA9ICgxIDw8IChzcHMtPmxvZzJfY3RiX3NpemUgLSBzcHMtPmxvZzJfbWluX3RiX3NpemUpKSAtIDE7CisJc3BzLT5xcF9iZF9vZmZzZXQgPSA2ICogKHNwcy0+Yml0X2RlcHRoIC0gOCk7CisKKwlpZiAoYXZfbW9kX3VpbnRwMihzcHMtPndpZHRoLCBzcHMtPmxvZzJfbWluX2NiX3NpemUpIHx8CisJCWF2X21vZF91aW50cDIoc3BzLT5oZWlnaHQsIHNwcy0+bG9nMl9taW5fY2Jfc2l6ZSkpIHsKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJJbnZhbGlkIGNvZGVkIGZyYW1lIGRpbWVuc2lvbnMuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChzcHMtPm1heF90cmFuc2Zvcm1faGllcmFyY2h5X2RlcHRoX2ludGVyID4gc3BzLT5sb2cyX2N0Yl9zaXplIC0gc3BzLT5sb2cyX21pbl90Yl9zaXplKSB7CisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAibWF4X3RyYW5zZm9ybV9oaWVyYXJjaHlfZGVwdGhfaW50ZXIgb3V0IG9mIHJhbmdlOiAlZFxuIiwKKwkJCXNwcy0+bWF4X3RyYW5zZm9ybV9oaWVyYXJjaHlfZGVwdGhfaW50ZXIpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChzcHMtPm1heF90cmFuc2Zvcm1faGllcmFyY2h5X2RlcHRoX2ludHJhID4gc3BzLT5sb2cyX2N0Yl9zaXplIC0gc3BzLT5sb2cyX21pbl90Yl9zaXplKSB7CisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAibWF4X3RyYW5zZm9ybV9oaWVyYXJjaHlfZGVwdGhfaW50cmEgb3V0IG9mIHJhbmdlOiAlZFxuIiwKKwkJCXNwcy0+bWF4X3RyYW5zZm9ybV9oaWVyYXJjaHlfZGVwdGhfaW50cmEpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChzcHMtPmxvZzJfbWF4X3RyYWZvX3NpemUgPiBGRk1JTihzcHMtPmxvZzJfY3RiX3NpemUsIDUpKSB7CisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAibWF4IHRyYW5zZm9ybSBibG9jayBzaXplIG91dCBvZiByYW5nZTogJWRcbiIsCisJCQlzcHMtPmxvZzJfbWF4X3RyYWZvX3NpemUpOworCQkJcmV0dXJuIC0xOworCX0KKworCWlmIChnZXRfYml0c19sZWZ0KGdiKSA8IDApIHsKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJPdmVycmVhZCBTUFMgYnkgJWQgYml0c1xuIiwgLWdldF9iaXRzX2xlZnQoZ2IpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX1BBUlNFUiwgIlBhcnNlZCBTUFM6IGlkICVkOyByZWY6ICVkLCBjb2RlZCB3eGg6ICVkeCVkLCBjcm9wcGVkIHd4aDogJWR4JWQ7IHBpeF9mbXQ6ICVkLlxuIiwKKwkgICAgICAgc3BzLT5zcHNfaWQsIHNwcy0+dGVtcG9yYWxfbGF5ZXJbMF0ubnVtX3Jlb3JkZXJfcGljcywgc3BzLT53aWR0aCwgc3BzLT5oZWlnaHQsCisJICAgICAgIHNwcy0+d2lkdGggLSAoc3BzLT5vdXRwdXRfd2luZG93LmxlZnRfb2Zmc2V0ICsgc3BzLT5vdXRwdXRfd2luZG93LnJpZ2h0X29mZnNldCksCisJICAgICAgIHNwcy0+aGVpZ2h0IC0gKHNwcy0+b3V0cHV0X3dpbmRvdy50b3Bfb2Zmc2V0ICsgc3BzLT5vdXRwdXRfd2luZG93LmJvdHRvbV9vZmZzZXQpLAorCSAgICAgICBzcHMtPnBpeF9mbXQpOworCisJcmV0dXJuIDA7Cit9CisKK2NvbnN0IGNoYXIgKmhldmNfbmFsX3R5cGVfbmFtZVs2NF0gPSB7CisJIlRSQUlMX04iLCAvLyBIRVZDX05BTF9UUkFJTF9OCisJIlRSQUlMX1IiLCAvLyBIRVZDX05BTF9UUkFJTF9SCisJIlRTQV9OIiwgLy8gSEVWQ19OQUxfVFNBX04KKwkiVFNBX1IiLCAvLyBIRVZDX05BTF9UU0FfUgorCSJTVFNBX04iLCAvLyBIRVZDX05BTF9TVFNBX04KKwkiU1RTQV9SIiwgLy8gSEVWQ19OQUxfU1RTQV9SCisJIlJBRExfTiIsIC8vIEhFVkNfTkFMX1JBRExfTgorCSJSQURMX1IiLCAvLyBIRVZDX05BTF9SQURMX1IKKwkiUkFTTF9OIiwgLy8gSEVWQ19OQUxfUkFTTF9OCisJIlJBU0xfUiIsIC8vIEhFVkNfTkFMX1JBU0xfUgorCSJSU1ZfVkNMX04xMCIsIC8vIEhFVkNfTkFMX1ZDTF9OMTAKKwkiUlNWX1ZDTF9SMTEiLCAvLyBIRVZDX05BTF9WQ0xfUjExCisJIlJTVl9WQ0xfTjEyIiwgLy8gSEVWQ19OQUxfVkNMX04xMgorCSJSU1ZfVkxDX1IxMyIsIC8vIEhFVkNfTkFMX1ZDTF9SMTMKKwkiUlNWX1ZDTF9OMTQiLCAvLyBIRVZDX05BTF9WQ0xfTjE0CisJIlJTVl9WQ0xfUjE1IiwgLy8gSEVWQ19OQUxfVkNMX1IxNQorCSJCTEFfV19MUCIsIC8vIEhFVkNfTkFMX0JMQV9XX0xQCisJIkJMQV9XX1JBREwiLCAvLyBIRVZDX05BTF9CTEFfV19SQURMCisJIkJMQV9OX0xQIiwgLy8gSEVWQ19OQUxfQkxBX05fTFAKKwkiSURSX1dfUkFETCIsIC8vIEhFVkNfTkFMX0lEUl9XX1JBREwKKwkiSURSX05fTFAiLCAvLyBIRVZDX05BTF9JRFJfTl9MUAorCSJDUkFfTlVUIiwgLy8gSEVWQ19OQUxfQ1JBX05VVAorCSJJUkFQX0lSQVBfVkNMMjIiLCAvLyBIRVZDX05BTF9JUkFQX1ZDTDIyCisJIklSQVBfSVJBUF9WQ0wyMyIsIC8vIEhFVkNfTkFMX0lSQVBfVkNMMjMKKwkiUlNWX1ZDTDI0IiwgLy8gSEVWQ19OQUxfUlNWX1ZDTDI0CisJIlJTVl9WQ0wyNSIsIC8vIEhFVkNfTkFMX1JTVl9WQ0wyNQorCSJSU1ZfVkNMMjYiLCAvLyBIRVZDX05BTF9SU1ZfVkNMMjYKKwkiUlNWX1ZDTDI3IiwgLy8gSEVWQ19OQUxfUlNWX1ZDTDI3CisJIlJTVl9WQ0wyOCIsIC8vIEhFVkNfTkFMX1JTVl9WQ0wyOAorCSJSU1ZfVkNMMjkiLCAvLyBIRVZDX05BTF9SU1ZfVkNMMjkKKwkiUlNWX1ZDTDMwIiwgLy8gSEVWQ19OQUxfUlNWX1ZDTDMwCisJIlJTVl9WQ0wzMSIsIC8vIEhFVkNfTkFMX1JTVl9WQ0wzMQorCSJWUFMiLCAvLyBIRVZDX05BTF9WUFMKKwkiU1BTIiwgLy8gSEVWQ19OQUxfU1BTCisJIlBQUyIsIC8vIEhFVkNfTkFMX1BQUworCSJBVUQiLCAvLyBIRVZDX05BTF9BVUQKKwkiRU9TX05VVCIsIC8vIEhFVkNfTkFMX0VPU19OVVQKKwkiRU9CX05VVCIsIC8vIEhFVkNfTkFMX0VPQl9OVVQKKwkiRkRfTlVUIiwgLy8gSEVWQ19OQUxfRkRfTlVUCisJIlNFSV9QUkVGSVgiLCAvLyBIRVZDX05BTF9TRUlfUFJFRklYCisJIlNFSV9TVUZGSVgiLCAvLyBIRVZDX05BTF9TRUlfU1VGRklYCisJIlJTVl9OVkNMNDEiLCAvLyBIRVZDX05BTF9SU1ZfTlZDTDQxCisJIlJTVl9OVkNMNDIiLCAvLyBIRVZDX05BTF9SU1ZfTlZDTDQyCisJIlJTVl9OVkNMNDMiLCAvLyBIRVZDX05BTF9SU1ZfTlZDTDQzCisJIlJTVl9OVkNMNDQiLCAvLyBIRVZDX05BTF9SU1ZfTlZDTDQ0CisJIlJTVl9OVkNMNDUiLCAvLyBIRVZDX05BTF9SU1ZfTlZDTDQ1CisJIlJTVl9OVkNMNDYiLCAvLyBIRVZDX05BTF9SU1ZfTlZDTDQ2CisJIlJTVl9OVkNMNDciLCAvLyBIRVZDX05BTF9SU1ZfTlZDTDQ3CisJIlVOU1BFQzQ4IiwgLy8gSEVWQ19OQUxfVU5TUEVDNDgKKwkiVU5TUEVDNDkiLCAvLyBIRVZDX05BTF9VTlNQRUM0OQorCSJVTlNQRUM1MCIsIC8vIEhFVkNfTkFMX1VOU1BFQzUwCisJIlVOU1BFQzUxIiwgLy8gSEVWQ19OQUxfVU5TUEVDNTEKKwkiVU5TUEVDNTIiLCAvLyBIRVZDX05BTF9VTlNQRUM1MgorCSJVTlNQRUM1MyIsIC8vIEhFVkNfTkFMX1VOU1BFQzUzCisJIlVOU1BFQzU0IiwgLy8gSEVWQ19OQUxfVU5TUEVDNTQKKwkiVU5TUEVDNTUiLCAvLyBIRVZDX05BTF9VTlNQRUM1NQorCSJVTlNQRUM1NiIsIC8vIEhFVkNfTkFMX1VOU1BFQzU2CisJIlVOU1BFQzU3IiwgLy8gSEVWQ19OQUxfVU5TUEVDNTcKKwkiVU5TUEVDNTgiLCAvLyBIRVZDX05BTF9VTlNQRUM1OAorCSJVTlNQRUM1OSIsIC8vIEhFVkNfTkFMX1VOU1BFQzU5CisJIlVOU1BFQzYwIiwgLy8gSEVWQ19OQUxfVU5TUEVDNjAKKwkiVU5TUEVDNjEiLCAvLyBIRVZDX05BTF9VTlNQRUM2MQorCSJVTlNQRUM2MiIsIC8vIEhFVkNfTkFMX1VOU1BFQzYyCisJIlVOU1BFQzYzIiwgLy8gSEVWQ19OQUxfVU5TUEVDNjMKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpoZXZjX25hbF91bml0X25hbWUoaW50IG5hbF90eXBlKQoreworCXJldHVybiBoZXZjX25hbF90eXBlX25hbWVbbmFsX3R5cGVdOworfQorCisvKioKKyogUGFyc2UgTkFMIHVuaXRzIG9mIGZvdW5kIHBpY3R1cmUgYW5kIGRlY29kZSBzb21lIGJhc2ljIGluZm9ybWF0aW9uLgorKgorKiBAcGFyYW0gcyBwYXJzZXIgY29udGV4dC4KKyogQHBhcmFtIGF2Y3R4IGNvZGVjIGNvbnRleHQuCisqIEBwYXJhbSBidWYgYnVmZmVyIHdpdGggZmllbGQvZnJhbWUgZGF0YS4KKyogQHBhcmFtIGJ1Zl9zaXplIHNpemUgb2YgdGhlIGJ1ZmZlci4KKyovCitzdGF0aWMgaW50IGRlY29kZV9leHRyYWRhdGFfcHModTggKmRhdGEsIGludCBzaXplLCBzdHJ1Y3QgaDI2NV9wYXJhbV9zZXRzICpwcykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgZ2V0X2JpdHNfY29udGV4dCBnYjsKKwl1MzIgc3JjX2xlbiwgcmJzcF9zaXplID0gMDsKKwl1OCAqcmJzcF9idWYgPSBOVUxMOworCWludCBuYWx1X3BvcywgbnVoX2xheWVyX2lkLCB0ZW1wb3JhbF9pZDsKKwl1MzIgbmFsX3R5cGU7CisJdTggKnAgPSBkYXRhOworCXUzMiBsZW4gPSBzaXplOworCisJbmFsdV9wb3MgPSBmaW5kX3N0YXJ0X2NvZGUocCwgbGVuKTsKKwlpZiAobmFsdV9wb3MgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlzcmNfbGVuID0gY2FsY19uYWxfbGVuKHAgKyBuYWx1X3Bvcywgc2l6ZSAtIG5hbHVfcG9zKTsKKwlyYnNwX2J1ZiA9IG5hbF91bml0X2V4dHJhY3RfcmJzcChwICsgbmFsdV9wb3MsIHNyY19sZW4sICZyYnNwX3NpemUpOworCWlmIChyYnNwX2J1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IGluaXRfZ2V0X2JpdHM4KCZnYiwgcmJzcF9idWYsIHJic3Bfc2l6ZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJaWYgKGdldF9iaXRzMSgmZ2IpICE9IDApIHsKKwkJcmV0ID0gLTE7CisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAiaW52YWxpZCBkYXRhLCByZXR1cm4hXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJbmFsX3R5cGUJPSBnZXRfYml0cygmZ2IsIDYpOworCW51aF9sYXllcl9pZAk9IGdldF9iaXRzKCZnYiwgNik7CisJdGVtcG9yYWxfaWQJPSBnZXRfYml0cygmZ2IsIDMpIC0gMTsKKwlpZiAodGVtcG9yYWxfaWQgPCAwKSB7CisJCXJldCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKwkvKnByX2luZm8oIm5hbF91bml0X3R5cGU6ICVkKCVzKSwgbnVoX2xheWVyX2lkOiAlZCwgdGVtcG9yYWxfaWQ6ICVkXG4iLAorCQluYWxfdHlwZSwgaGV2Y19uYWxfdW5pdF9uYW1lKG5hbF90eXBlKSwKKwkJbnVoX2xheWVyX2lkLCB0ZW1wb3JhbF9pZCk7Ki8KKworCXN3aXRjaCAobmFsX3R5cGUpIHsKKwljYXNlIEhFVkNfTkFMX1ZQUzoKKwkJcmV0ID0gZmZfaGV2Y19wYXJzZV92cHMoJmdiLCAmcHMtPnZwcyk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJCXBzLT52cHNfcGFyc2VkID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSBIRVZDX05BTF9TUFM6CisJCXJldCA9IGZmX2hldmNfcGFyc2Vfc3BzKCZnYiwgJnBzLT5zcHMpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCQlwcy0+c3BzX3BhcnNlZCA9IHRydWU7CisJCWJyZWFrOworCS8qY2FzZSBIRVZDX05BTF9QUFM6CisJCXJldCA9IGZmX2hldmNfZGVjb2RlX25hbF9wcHMoJmdiLCBOVUxMLCBwcyk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJCXBzLT5wcHNfcGFyc2VkID0gdHJ1ZTsKKwkJYnJlYWs7Ki8KKwlkZWZhdWx0OgorCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgIlVuc3VwcG9ydCBwYXJzZXIgbmFsIHR5cGUgKCVzKS5cbiIsCisJCQloZXZjX25hbF91bml0X25hbWUobmFsX3R5cGUpKTsKKwkJYnJlYWs7CisJfQorCitvdXQ6CisJdmZyZWUocmJzcF9idWYpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGgyNjVfZGVjb2RlX2V4dHJhZGF0YV9wcyh1OCAqYnVmLCBpbnQgc2l6ZSwgc3RydWN0IGgyNjVfcGFyYW1fc2V0cyAqcHMpCit7CisJaW50IHJldCA9IDAsIGkgPSAwLCBqID0gMDsKKwl1OCAqcCA9IGJ1ZjsKKwlpbnQgbGVuID0gc2l6ZTsKKworCWZvciAoaSA9IDQ7IGkgPCBzaXplOyBpKyspIHsKKwkJaiA9IGZpbmRfc3RhcnRfY29kZShwLCBsZW4pOworCQlpZiAoaiA+IDApIHsKKwkJCWxlbiA9IHNpemUgLSAocCAtIGJ1Zik7CisJCQlyZXQgPSBkZWNvZGVfZXh0cmFkYXRhX3BzKHAsIGxlbiwgcHMpOworCQkJaWYgKHJldCkgeworCQkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAicGFyc2UgZXh0cmEgZGF0YSBmYWlsZWQuIGVycjogJWRcbiIsIHJldCk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKworCQkJaWYgKHBzLT5zcHNfcGFyc2VkKQorCQkJCWJyZWFrOworCisJCQlwICs9IGo7CisJCX0KKwkJcCsrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2RlY29kZXIvYW1sX2hldmNfcGFyc2VyLmggYi9kcml2ZXJzL2FtdmRlY19wb3J0cy9kZWNvZGVyL2FtbF9oZXZjX3BhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMjM2MzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FtdmRlY19wb3J0cy9kZWNvZGVyL2FtbF9oZXZjX3BhcnNlci5oCkBAIC0wLDAgKzEsNTYyIEBACisvKgorICogZHJpdmVycy9hbXZkZWNfcG9ydHMvZGVjb2Rlci9hbWxfaGV2Y19wYXJzZXIuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisKKyNpZm5kZWYgQU1MX0hFVkNfUEFSU0VSX0gKKyNkZWZpbmUgQU1MX0hFVkNfUEFSU0VSX0gKKworI2luY2x1ZGUgIi4uL2FtbF92Y29kZWNfZHJ2LmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvY29tbW9uLmgiCisKKyNkZWZpbmUgTUFYX0RQQl9TSVpFCQkJCTE2IC8vIEEuNC4xCisjZGVmaW5lIE1BWF9SRUZTCQkJCTE2CisKKyNkZWZpbmUgTUFYX05CX1RIUkVBRFMJCQkJMTYKKyNkZWZpbmUgU0hJRlRfQ1RCX1dQUAkJCQkyCisKKy8qKgorICogNy40LjIuMQorICovCisjZGVmaW5lIE1BWF9TVUJfTEFZRVJTCQkJCTcKKyNkZWZpbmUgTUFYX1ZQU19DT1VOVAkJCQkxNgorI2RlZmluZSBNQVhfU1BTX0NPVU5UCQkJCTMyCisjZGVmaW5lIE1BWF9QUFNfQ09VTlQJCQkJMjU2CisjZGVmaW5lIE1BWF9TSE9SVF9URVJNX1JQU19DT1VOVCAJCTY0CisjZGVmaW5lIE1BWF9DVV9TSVpFCQkJCTEyOAorCisvL1RPRE86IGNoZWNrIGlmIHRoaXMgaXMgcmVhbGx5IHRoZSBtYXhpbXVtCisjZGVmaW5lIE1BWF9UUkFOU0ZPUk1fREVQVEgJCQk1CisKKyNkZWZpbmUgTUFYX1RCX1NJWkUJCQkJMzIKKyNkZWZpbmUgTUFYX1BCX1NJWkUJCQkJNjQKKyNkZWZpbmUgTUFYX0xPRzJfQ1RCX1NJWkUJCQk2CisjZGVmaW5lIE1BWF9RUAkJCQkJNTEKKyNkZWZpbmUgREVGQVVMVF9JTlRSQV9UQ19PRkZTRVQJCQkyCisKKyNkZWZpbmUgSEVWQ19DT05URVhUUwkJCQkxODMKKworI2RlZmluZSBNUkdfTUFYX05VTV9DQU5EUwkJCTUKKworI2RlZmluZSBMMAkJCQkJMAorI2RlZmluZSBMMQkJCQkJMQorCisjZGVmaW5lIEVQRUxfRVhUUkFfQkVGT1JFCQkJMQorI2RlZmluZSBFUEVMX0VYVFJBX0FGVEVSCQkJMgorI2RlZmluZSBFUEVMX0VYVFJBCQkJCTMKKworI2RlZmluZSBGRl9QUk9GSUxFX0hFVkNfTUFJTgkJCTEKKyNkZWZpbmUgRkZfUFJPRklMRV9IRVZDX01BSU5fMTAJCQkyCisjZGVmaW5lIEZGX1BST0ZJTEVfSEVWQ19NQUlOX1NUSUxMX1BJQ1RVUkUJMworI2RlZmluZSBGRl9QUk9GSUxFX0hFVkNfUkVYVAkJCTQKKworLyoqCisgKiBWYWx1ZSBvZiB0aGUgbHVtYSBzYW1wbGUgYXQgcG9zaXRpb24gKHgsIHkpIGluIHRoZSAyRCBhcnJheSB0YWIuCisgKi8KKyNkZWZpbmUgU0FNUExFKHRhYiwgeCwgeSkgKCh0YWIpWyh5KSAqIHMtPnNwcy0+d2lkdGggKyAoeCldKQorI2RlZmluZSBTQU1QTEVfQ1RCKHRhYiwgeCwgeSkgKCh0YWIpWyh5KSAqIG1pbl9jYl93aWR0aCArICh4KV0pCisjZGVmaW5lIFNBTVBMRV9DQkYodGFiLCB4LCB5KSAoKHRhYilbKCh5KSAmICgoMTw8bG9nMl90cmFmb19zaXplKS0xKSkgKiBNQVhfQ1VfU0laRSArICgoeCkgJiAoKDE8PGxvZzJfdHJhZm9fc2l6ZSktMSkpXSkKKworI2RlZmluZSBJU19JRFIocykgKHMtPm5hbF91bml0X3R5cGUgPT0gTkFMX0lEUl9XX1JBREwgfHwgcy0+bmFsX3VuaXRfdHlwZSA9PSBOQUxfSURSX05fTFApCisjZGVmaW5lIElTX0JMQShzKSAocy0+bmFsX3VuaXRfdHlwZSA9PSBOQUxfQkxBX1dfUkFETCB8fCBzLT5uYWxfdW5pdF90eXBlID09IE5BTF9CTEFfV19MUCB8fCBcCisgICAgICAgICAgICAgICAgICAgcy0+bmFsX3VuaXRfdHlwZSA9PSBOQUxfQkxBX05fTFApCisjZGVmaW5lIElTX0lSQVAocykgKHMtPm5hbF91bml0X3R5cGUgPj0gMTYgJiYgcy0+bmFsX3VuaXRfdHlwZSA8PSAyMykKKworLyoqCisgKiBUYWJsZSA3LTM6IE5BTCB1bml0IHR5cGUgY29kZXMKKyAqLworZW51bSBIRVZDTkFMVW5pdFR5cGUgeworCUhFVkNfTkFMX1RSQUlMX04gICAgPSAwLAorCUhFVkNfTkFMX1RSQUlMX1IgICAgPSAxLAorCUhFVkNfTkFMX1RTQV9OICAgICAgPSAyLAorCUhFVkNfTkFMX1RTQV9SICAgICAgPSAzLAorCUhFVkNfTkFMX1NUU0FfTiAgICAgPSA0LAorCUhFVkNfTkFMX1NUU0FfUiAgICAgPSA1LAorCUhFVkNfTkFMX1JBRExfTiAgICAgPSA2LAorCUhFVkNfTkFMX1JBRExfUiAgICAgPSA3LAorCUhFVkNfTkFMX1JBU0xfTiAgICAgPSA4LAorCUhFVkNfTkFMX1JBU0xfUiAgICAgPSA5LAorCUhFVkNfTkFMX1ZDTF9OMTAgICAgPSAxMCwKKwlIRVZDX05BTF9WQ0xfUjExICAgID0gMTEsCisJSEVWQ19OQUxfVkNMX04xMiAgICA9IDEyLAorCUhFVkNfTkFMX1ZDTF9SMTMgICAgPSAxMywKKwlIRVZDX05BTF9WQ0xfTjE0ICAgID0gMTQsCisJSEVWQ19OQUxfVkNMX1IxNSAgICA9IDE1LAorCUhFVkNfTkFMX0JMQV9XX0xQICAgPSAxNiwKKwlIRVZDX05BTF9CTEFfV19SQURMID0gMTcsCisJSEVWQ19OQUxfQkxBX05fTFAgICA9IDE4LAorCUhFVkNfTkFMX0lEUl9XX1JBREwgPSAxOSwKKwlIRVZDX05BTF9JRFJfTl9MUCAgID0gMjAsCisJSEVWQ19OQUxfQ1JBX05VVCAgICA9IDIxLAorCUhFVkNfTkFMX0lSQVBfVkNMMjIgPSAyMiwKKwlIRVZDX05BTF9JUkFQX1ZDTDIzID0gMjMsCisJSEVWQ19OQUxfUlNWX1ZDTDI0ICA9IDI0LAorCUhFVkNfTkFMX1JTVl9WQ0wyNSAgPSAyNSwKKwlIRVZDX05BTF9SU1ZfVkNMMjYgID0gMjYsCisJSEVWQ19OQUxfUlNWX1ZDTDI3ICA9IDI3LAorCUhFVkNfTkFMX1JTVl9WQ0wyOCAgPSAyOCwKKwlIRVZDX05BTF9SU1ZfVkNMMjkgID0gMjksCisJSEVWQ19OQUxfUlNWX1ZDTDMwICA9IDMwLAorCUhFVkNfTkFMX1JTVl9WQ0wzMSAgPSAzMSwKKwlIRVZDX05BTF9WUFMgICAgICAgID0gMzIsCisJSEVWQ19OQUxfU1BTICAgICAgICA9IDMzLAorCUhFVkNfTkFMX1BQUyAgICAgICAgPSAzNCwKKwlIRVZDX05BTF9BVUQgICAgICAgID0gMzUsCisJSEVWQ19OQUxfRU9TX05VVCAgICA9IDM2LAorCUhFVkNfTkFMX0VPQl9OVVQgICAgPSAzNywKKwlIRVZDX05BTF9GRF9OVVQgICAgID0gMzgsCisJSEVWQ19OQUxfU0VJX1BSRUZJWCA9IDM5LAorCUhFVkNfTkFMX1NFSV9TVUZGSVggPSA0MCwKK307CisKK2VudW0gSEVWQ1NsaWNlVHlwZSB7CisJSEVWQ19TTElDRV9CID0gMCwKKwlIRVZDX1NMSUNFX1AgPSAxLAorCUhFVkNfU0xJQ0VfSSA9IDIsCit9OworCitlbnVtIHsKKwkvLyA3LjQuMy4xOiB2cHNfbWF4X2xheWVyc19taW51czEgaXMgaW4gWzAsIDYyXS4KKwlIRVZDX01BWF9MQVlFUlMgICAgID0gNjMsCisJLy8gNy40LjMuMTogdnBzX21heF9zdWJfbGF5ZXJzX21pbnVzMSBpcyBpbiBbMCwgNl0uCisJSEVWQ19NQVhfU1VCX0xBWUVSUyA9IDcsCisJLy8gNy40LjMuMTogdnBzX251bV9sYXllcl9zZXRzX21pbnVzMSBpcyBpbiBbMCwgMTAyM10uCisJSEVWQ19NQVhfTEFZRVJfU0VUUyA9IDEwMjQsCisKKwkvLyA3LjQuMi4xOiB2cHNfdmlkZW9fcGFyYW1ldGVyX3NldF9pZCBpcyB1KDQpLgorCUhFVkNfTUFYX1ZQU19DT1VOVCA9IDE2LAorCS8vIDcuNC4zLjIuMTogc3BzX3NlcV9wYXJhbWV0ZXJfc2V0X2lkIGlzIGluIFswLCAxNV0uCisJSEVWQ19NQVhfU1BTX0NPVU5UID0gMTYsCisJLy8gNy40LjMuMy4xOiBwcHNfcGljX3BhcmFtZXRlcl9zZXRfaWQgaXMgaW4gWzAsIDYzXS4KKwlIRVZDX01BWF9QUFNfQ09VTlQgPSA2NCwKKworCS8vIEEuNC4yOiBNYXhEcGJTaXplIGlzIGJvdW5kZWQgYWJvdmUgYnkgMTYuCisJSEVWQ19NQVhfRFBCX1NJWkUgPSAxNiwKKwkvLyA3LjQuMy4xOiB2cHNfbWF4X2RlY19waWNfYnVmZmVyaW5nX21pbnVzMVtpXSBpcyBpbiBbMCwgTWF4RHBiU2l6ZSAtIDFdLgorCUhFVkNfTUFYX1JFRlMgICAgID0gSEVWQ19NQVhfRFBCX1NJWkUsCisKKwkvLyA3LjQuMy4yLjE6IG51bV9zaG9ydF90ZXJtX3JlZl9waWNfc2V0cyBpcyBpbiBbMCwgNjRdLgorCUhFVkNfTUFYX1NIT1JUX1RFUk1fUkVGX1BJQ19TRVRTID0gNjQsCisJLy8gNy40LjMuMi4xOiBudW1fbG9uZ190ZXJtX3JlZl9waWNzX3NwcyBpcyBpbiBbMCwgMzJdLgorCUhFVkNfTUFYX0xPTkdfVEVSTV9SRUZfUElDUyAgICAgID0gMzIsCisKKwkvLyBBLjM6IGFsbCBwcm9maWxlcyByZXF1aXJlIHRoYXQgQ3RiTG9nMlNpemVZIGlzIGluIFs0LCA2XS4KKwlIRVZDX01JTl9MT0cyX0NUQl9TSVpFID0gNCwKKwlIRVZDX01BWF9MT0cyX0NUQl9TSVpFID0gNiwKKworCS8vIEUuMy4yOiBjcGJfY250X21pbnVzMVtpXSBpcyBpbiBbMCwgMzFdLgorCUhFVkNfTUFYX0NQQl9DTlQgPSAzMiwKKworCS8vIEEuNC4xOiBpbiB0YWJsZSBBLjYgdGhlIGhpZ2hlc3QgbGV2ZWwgYWxsb3dzIGEgTWF4THVtYVBzIG9mIDM1IDY1MSA1ODQuCisJSEVWQ19NQVhfTFVNQV9QUyA9IDM1NjUxNTg0LAorCS8vIEEuNC4xOiBwaWNfd2lkdGhfaW5fbHVtYV9zYW1wbGVzIGFuZCBwaWNfaGVpZ2h0X2luX2x1bWFfc2FtcGxlcyBhcmUKKwkvLyBjb25zdHJhaW5lZCB0byBiZSBub3QgZ3JlYXRlciB0aGFuIHNxcnQoTWF4THVtYVBzICogOCkuICBIZW5jZSBoZWlnaHQvCisJLy8gd2lkdGggYXJlIGJvdW5kZWQgYWJvdmUgYnkgc3FydCg4ICogMzU2NTE1ODQpID0gMTY4ODguMiBzYW1wbGVzLgorCUhFVkNfTUFYX1dJRFRIICA9IDE2ODg4LAorCUhFVkNfTUFYX0hFSUdIVCA9IDE2ODg4LAorCisJLy8gQS40LjE6IHRhYmxlIEEuNiBhbGxvd3MgYXQgbW9zdCAyMiB0aWxlIHJvd3MgZm9yIGFueSBsZXZlbC4KKwlIRVZDX01BWF9USUxFX1JPV1MgICAgPSAyMiwKKwkvLyBBLjQuMTogdGFibGUgQS42IGFsbG93cyBhdCBtb3N0IDIwIHRpbGUgY29sdW1ucyBmb3IgYW55IGxldmVsLgorCUhFVkNfTUFYX1RJTEVfQ09MVU1OUyA9IDIwLAorCisJLy8gNy40LjcuMTogaW4gdGhlIHdvcnN0IGNhc2UgKHRpbGVzX2VuYWJsZWRfZmxhZyBhbmQKKwkvLyBlbnRyb3B5X2NvZGluZ19zeW5jX2VuYWJsZWRfZmxhZyBhcmUgYm90aCBzZXQpLCBlbnRyeSBwb2ludHMgY2FuIGJlCisJLy8gcGxhY2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkgQ3RiIHJvdyBpbiBldmVyeSB0aWxlLCBnaXZpbmcgYW4KKwkvLyB1cHBlciBib3VuZCBvZiAobnVtX3RpbGVfY29sdW1uc19taW51czEgKyAxKSAqIFBpY0hlaWdodEluQ3Ric1kgLSAxLgorCS8vIE9ubHkgYSBzdHJlYW0gd2l0aCB2ZXJ5IGhpZ2ggcmVzb2x1dGlvbiBhbmQgcGVydmVyc2UgcGFyYW1ldGVycyBjb3VsZAorCS8vIGdldCBuZWFyIHRoYXQsIHRob3VnaCwgc28gc2V0IGEgbG93ZXIgbGltaXQgaGVyZSB3aXRoIHRoZSBtYXhpbXVtCisJLy8gcG9zc2libGUgdmFsdWUgZm9yIDRLIHZpZGVvIChhdCBtb3N0IDEzNSAxNngxNiBDdGIgcm93cykuCisJSEVWQ19NQVhfRU5UUllfUE9JTlRfT0ZGU0VUUyA9IEhFVkNfTUFYX1RJTEVfQ09MVU1OUyAqIDEzNSwKK307CisKK3N0cnVjdCBTaG9ydFRlcm1SUFMgeworCXUzMiBudW1fbmVnYXRpdmVfcGljczsKKwlpbnQgbnVtX2RlbHRhX3BvY3M7CisJaW50IHJwc19pZHhfbnVtX2RlbHRhX3BvY3M7CisJaW50IGRlbHRhX3BvY1szMl07CisJdTggdXNlZFszMl07Cit9OworCitzdHJ1Y3QgTG9uZ1Rlcm1SUFMgeworCWludCBwb2NbMzJdOworCXU4IHVzZWRbMzJdOworCXU4IG5iX3JlZnM7Cit9OworCitzdHJ1Y3QgU2xpY2VIZWFkZXIgeworCXUzMiBwcHNfaWQ7CisKKwkvLy88IGFkZHJlc3MgKGluIHJhc3RlciBvcmRlcikgb2YgdGhlIGZpcnN0IGJsb2NrIGluIHRoZSBjdXJyZW50IHNsaWNlIHNlZ21lbnQKKwl1MzIgICBzbGljZV9zZWdtZW50X2FkZHI7CisJLy8vPCBhZGRyZXNzIChpbiByYXN0ZXIgb3JkZXIpIG9mIHRoZSBmaXJzdCBibG9jayBpbiB0aGUgY3VycmVudCBzbGljZQorCXUzMiAgIHNsaWNlX2FkZHI7CisKKwllbnVtIEhFVkNTbGljZVR5cGUgc2xpY2VfdHlwZTsKKworCWludCBwaWNfb3JkZXJfY250X2xzYjsKKworCXU4IGZpcnN0X3NsaWNlX2luX3BpY19mbGFnOworCXU4IGRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWc7CisJdTggcGljX291dHB1dF9mbGFnOworCXU4IGNvbG91cl9wbGFuZV9pZDsKKworCS8vLzwgUlBTIGNvZGVkIGluIHRoZSBzbGljZSBoZWFkZXIgaXRzZWxmIGlzIHN0b3JlZCBoZXJlCisJaW50IHNob3J0X3Rlcm1fcmVmX3BpY19zZXRfc3BzX2ZsYWc7CisJaW50IHNob3J0X3Rlcm1fcmVmX3BpY19zZXRfc2l6ZTsKKwlzdHJ1Y3QgU2hvcnRUZXJtUlBTIHNsaWNlX3JwczsKKwljb25zdCBzdHJ1Y3QgU2hvcnRUZXJtUlBTICpzaG9ydF90ZXJtX3JwczsKKwlpbnQgbG9uZ190ZXJtX3JlZl9waWNfc2V0X3NpemU7CisJc3RydWN0IExvbmdUZXJtUlBTIGxvbmdfdGVybV9ycHM7CisJdTMyIGxpc3RfZW50cnlfbHhbMl1bMzJdOworCisJdTggcnBsX21vZGlmaWNhdGlvbl9mbGFnWzJdOworCXU4IG5vX291dHB1dF9vZl9wcmlvcl9waWNzX2ZsYWc7CisJdTggc2xpY2VfdGVtcG9yYWxfbXZwX2VuYWJsZWRfZmxhZzsKKworCXUzMiBuYl9yZWZzWzJdOworCisJdTggc2xpY2Vfc2FtcGxlX2FkYXB0aXZlX29mZnNldF9mbGFnWzNdOworCXU4IG12ZF9sMV96ZXJvX2ZsYWc7CisKKwl1OCBjYWJhY19pbml0X2ZsYWc7CisJdTggZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9mbGFnOyAvLy88IHNsaWNlX2hlYWRlcl9kaXNhYmxlX2RlYmxvY2tpbmdfZmlsdGVyX2ZsYWcKKwl1OCBzbGljZV9sb29wX2ZpbHRlcl9hY3Jvc3Nfc2xpY2VzX2VuYWJsZWRfZmxhZzsKKwl1OCBjb2xsb2NhdGVkX2xpc3Q7CisKKwl1MzIgY29sbG9jYXRlZF9yZWZfaWR4OworCisJaW50IHNsaWNlX3FwX2RlbHRhOworCWludCBzbGljZV9jYl9xcF9vZmZzZXQ7CisJaW50IHNsaWNlX2NyX3FwX29mZnNldDsKKworCXU4IGN1X2Nocm9tYV9xcF9vZmZzZXRfZW5hYmxlZF9mbGFnOworCisJaW50IGJldGFfb2Zmc2V0OyAgICAvLy88IGJldGFfb2Zmc2V0X2RpdjIgKiAyCisJaW50IHRjX29mZnNldDsgICAgICAvLy88IHRjX29mZnNldF9kaXYyICogMgorCisJdTMyIG1heF9udW1fbWVyZ2VfY2FuZDsgLy8vPCA1IC0gNV9taW51c19tYXhfbnVtX21lcmdlX2NhbmQKKworCXU4ICplbnRyeV9wb2ludF9vZmZzZXQ7CisJaW50ICogb2Zmc2V0OworCWludCAqIHNpemU7CisJaW50IG51bV9lbnRyeV9wb2ludF9vZmZzZXRzOworCisJY2hhciBzbGljZV9xcDsKKworCXU4IGx1bWFfbG9nMl93ZWlnaHRfZGVub207CisJczE2IGNocm9tYV9sb2cyX3dlaWdodF9kZW5vbTsKKworCXMxNiBsdW1hX3dlaWdodF9sMFsxNl07CisJczE2IGNocm9tYV93ZWlnaHRfbDBbMTZdWzJdOworCXMxNiBjaHJvbWFfd2VpZ2h0X2wxWzE2XVsyXTsKKwlzMTYgbHVtYV93ZWlnaHRfbDFbMTZdOworCisJczE2IGx1bWFfb2Zmc2V0X2wwWzE2XTsKKwlzMTYgY2hyb21hX29mZnNldF9sMFsxNl1bMl07CisKKwlzMTYgbHVtYV9vZmZzZXRfbDFbMTZdOworCXMxNiBjaHJvbWFfb2Zmc2V0X2wxWzE2XVsyXTsKKworCWludCBzbGljZV9jdGJfYWRkcl9yczsKK307CisKK3N0cnVjdCBIRVZDV2luZG93IHsKKwl1MzIgbGVmdF9vZmZzZXQ7CisJdTMyIHJpZ2h0X29mZnNldDsKKwl1MzIgdG9wX29mZnNldDsKKwl1MzIgYm90dG9tX29mZnNldDsKK307CisKK3N0cnVjdCBWVUkgeworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX1Y0TF9TT0ZUV0FSRV9QQVJTRVIKKwlzdHJ1Y3QgQVZSYXRpb25hbCBzYXI7CisjZW5kaWYKKwlpbnQgb3ZlcnNjYW5faW5mb19wcmVzZW50X2ZsYWc7CisJaW50IG92ZXJzY2FuX2FwcHJvcHJpYXRlX2ZsYWc7CisKKwlpbnQgdmlkZW9fc2lnbmFsX3R5cGVfcHJlc2VudF9mbGFnOworCWludCB2aWRlb19mb3JtYXQ7CisJaW50IHZpZGVvX2Z1bGxfcmFuZ2VfZmxhZzsKKwlpbnQgY29sb3VyX2Rlc2NyaXB0aW9uX3ByZXNlbnRfZmxhZzsKKwl1OCBjb2xvdXJfcHJpbWFyaWVzOworCXU4IHRyYW5zZmVyX2NoYXJhY3RlcmlzdGljOworCXU4IG1hdHJpeF9jb2VmZnM7CisKKwlpbnQgY2hyb21hX2xvY19pbmZvX3ByZXNlbnRfZmxhZzsKKwlpbnQgY2hyb21hX3NhbXBsZV9sb2NfdHlwZV90b3BfZmllbGQ7CisJaW50IGNocm9tYV9zYW1wbGVfbG9jX3R5cGVfYm90dG9tX2ZpZWxkOworCWludCBuZXV0cmFfY2hyb21hX2luZGljYXRpb25fZmxhZzsKKworCWludCBmaWVsZF9zZXFfZmxhZzsKKwlpbnQgZnJhbWVfZmllbGRfaW5mb19wcmVzZW50X2ZsYWc7CisKKwlpbnQgZGVmYXVsdF9kaXNwbGF5X3dpbmRvd19mbGFnOworCXN0cnVjdCBIRVZDV2luZG93IGRlZl9kaXNwX3dpbjsKKworCWludCB2dWlfdGltaW5nX2luZm9fcHJlc2VudF9mbGFnOworCXUzMiB2dWlfbnVtX3VuaXRzX2luX3RpY2s7CisJdTMyIHZ1aV90aW1lX3NjYWxlOworCWludCB2dWlfcG9jX3Byb3BvcnRpb25hbF90b190aW1pbmdfZmxhZzsKKwlpbnQgdnVpX251bV90aWNrc19wb2NfZGlmZl9vbmVfbWludXMxOworCWludCB2dWlfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnOworCisJaW50IGJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnOworCWludCB0aWxlc19maXhlZF9zdHJ1Y3R1cmVfZmxhZzsKKwlpbnQgbW90aW9uX3ZlY3RvcnNfb3Zlcl9waWNfYm91bmRhcmllc19mbGFnOworCWludCByZXN0cmljdGVkX3JlZl9waWNfbGlzdHNfZmxhZzsKKwlpbnQgbWluX3NwYXRpYWxfc2VnbWVudGF0aW9uX2lkYzsKKwlpbnQgbWF4X2J5dGVzX3Blcl9waWNfZGVub207CisJaW50IG1heF9iaXRzX3Blcl9taW5fY3VfZGVub207CisJaW50IGxvZzJfbWF4X212X2xlbmd0aF9ob3Jpem9udGFsOworCWludCBsb2cyX21heF9tdl9sZW5ndGhfdmVydGljYWw7Cit9OworCitzdHJ1Y3QgUFRMQ29tbW9uIHsKKyAgICB1OCBwcm9maWxlX3NwYWNlOworICAgIHU4IHRpZXJfZmxhZzsKKyAgICB1OCBwcm9maWxlX2lkYzsKKyAgICB1OCBwcm9maWxlX2NvbXBhdGliaWxpdHlfZmxhZ1szMl07CisgICAgdTggbGV2ZWxfaWRjOworICAgIHU4IHByb2dyZXNzaXZlX3NvdXJjZV9mbGFnOworICAgIHU4IGludGVybGFjZWRfc291cmNlX2ZsYWc7CisgICAgdTggbm9uX3BhY2tlZF9jb25zdHJhaW50X2ZsYWc7CisgICAgdTggZnJhbWVfb25seV9jb25zdHJhaW50X2ZsYWc7Cit9OworCitzdHJ1Y3QgUFRMIHsKKyAgICBzdHJ1Y3QgUFRMQ29tbW9uIGdlbmVyYWxfcHRsOworICAgIHN0cnVjdCBQVExDb21tb24gc3ViX2xheWVyX3B0bFtIRVZDX01BWF9TVUJfTEFZRVJTXTsKKworICAgIHU4IHN1Yl9sYXllcl9wcm9maWxlX3ByZXNlbnRfZmxhZ1tIRVZDX01BWF9TVUJfTEFZRVJTXTsKKyAgICB1OCBzdWJfbGF5ZXJfbGV2ZWxfcHJlc2VudF9mbGFnW0hFVkNfTUFYX1NVQl9MQVlFUlNdOworfTsKKworc3RydWN0IGgyNjVfVlBTX3QgeworCXU4IHZwc190ZW1wb3JhbF9pZF9uZXN0aW5nX2ZsYWc7CisJaW50IHZwc19tYXhfbGF5ZXJzOworCWludCB2cHNfbWF4X3N1Yl9sYXllcnM7IC8vLzwgdnBzX21heF90ZW1wb3JhbF9sYXllcnNfbWludXMxICsgMQorCisJc3RydWN0IFBUTCBwdGw7CisJaW50IHZwc19zdWJfbGF5ZXJfb3JkZXJpbmdfaW5mb19wcmVzZW50X2ZsYWc7CisJdTMyIHZwc19tYXhfZGVjX3BpY19idWZmZXJpbmdbSEVWQ19NQVhfU1VCX0xBWUVSU107CisJdTMyIHZwc19udW1fcmVvcmRlcl9waWNzW0hFVkNfTUFYX1NVQl9MQVlFUlNdOworCXUzMiB2cHNfbWF4X2xhdGVuY3lfaW5jcmVhc2VbSEVWQ19NQVhfU1VCX0xBWUVSU107CisJaW50IHZwc19tYXhfbGF5ZXJfaWQ7CisJaW50IHZwc19udW1fbGF5ZXJfc2V0czsgLy8vPCB2cHNfbnVtX2xheWVyX3NldHNfbWludXMxICsgMQorCXU4IHZwc190aW1pbmdfaW5mb19wcmVzZW50X2ZsYWc7CisJdTMyIHZwc19udW1fdW5pdHNfaW5fdGljazsKKwl1MzIgdnBzX3RpbWVfc2NhbGU7CisJdTggdnBzX3BvY19wcm9wb3J0aW9uYWxfdG9fdGltaW5nX2ZsYWc7CisJaW50IHZwc19udW1fdGlja3NfcG9jX2RpZmZfb25lOyAvLy88IHZwc19udW1fdGlja3NfcG9jX2RpZmZfb25lX21pbnVzMSArIDEKKwlpbnQgdnBzX251bV9ocmRfcGFyYW1ldGVyczsKK307CisKK3N0cnVjdCBTY2FsaW5nTGlzdCB7CisJLyogVGhpcyBpcyBhIGxpdHRsZSB3YXN0ZWZ1bCwgc2luY2Ugc2l6ZUlEIDAgb25seSBuZWVkcyA4IGNvZWZmcywKKwkqIGFuZCBzaXplIElEIDMgb25seSBoYXMgMiBhcnJheXMsIG5vdCA2LiAqLworCXU4IHNsWzRdWzZdWzY0XTsKKwl1OCBzbF9kY1syXVs2XTsKK307CisKK3N0cnVjdCBoMjY1X1NQU190IHsKKwl1OCB2cHNfaWQ7CisJdTggc3BzX2lkOworCWludCBjaHJvbWFfZm9ybWF0X2lkYzsKKwl1OCBzZXBhcmF0ZV9jb2xvdXJfcGxhbmVfZmxhZzsKKworCXN0cnVjdCBIRVZDV2luZG93IG91dHB1dF93aW5kb3c7CisJc3RydWN0IEhFVkNXaW5kb3cgcGljX2NvbmZfd2luOworCisJaW50IGJpdF9kZXB0aDsKKwlpbnQgYml0X2RlcHRoX2Nocm9tYTsKKwlpbnQgcGl4ZWxfc2hpZnQ7CisJaW50IHBpeF9mbXQ7CisKKwl1MzIgbG9nMl9tYXhfcG9jX2xzYjsKKwlpbnQgcGNtX2VuYWJsZWRfZmxhZzsKKworCWludCBtYXhfc3ViX2xheWVyczsKKwlzdHJ1Y3QgeworCQlpbnQgbWF4X2RlY19waWNfYnVmZmVyaW5nOworCQlpbnQgbnVtX3Jlb3JkZXJfcGljczsKKwkJaW50IG1heF9sYXRlbmN5X2luY3JlYXNlOworCX0gdGVtcG9yYWxfbGF5ZXJbSEVWQ19NQVhfU1VCX0xBWUVSU107CisJdTggdGVtcG9yYWxfaWRfbmVzdGluZ19mbGFnOworCisJc3RydWN0IFZVSSB2dWk7CisJc3RydWN0IFBUTCBwdGw7CisKKwl1OCBzY2FsaW5nX2xpc3RfZW5hYmxlX2ZsYWc7CisJc3RydWN0IFNjYWxpbmdMaXN0IHNjYWxpbmdfbGlzdDsKKworCXUzMiBuYl9zdF9ycHM7CisJc3RydWN0IFNob3J0VGVybVJQUyBzdF9ycHNbSEVWQ19NQVhfU0hPUlRfVEVSTV9SRUZfUElDX1NFVFNdOworCisJdTggYW1wX2VuYWJsZWRfZmxhZzsKKwl1OCBzYW9fZW5hYmxlZDsKKworCXU4IGxvbmdfdGVybV9yZWZfcGljc19wcmVzZW50X2ZsYWc7CisJdTE2IGx0X3JlZl9waWNfcG9jX2xzYl9zcHNbSEVWQ19NQVhfTE9OR19URVJNX1JFRl9QSUNTXTsKKwl1OCB1c2VkX2J5X2N1cnJfcGljX2x0X3Nwc19mbGFnW0hFVkNfTUFYX0xPTkdfVEVSTV9SRUZfUElDU107CisJdTggbnVtX2xvbmdfdGVybV9yZWZfcGljc19zcHM7CisKKwlzdHJ1Y3QgeworCQl1OCBiaXRfZGVwdGg7CisJCXU4IGJpdF9kZXB0aF9jaHJvbWE7CisJCXUzMiBsb2cyX21pbl9wY21fY2Jfc2l6ZTsKKwkJdTMyIGxvZzJfbWF4X3BjbV9jYl9zaXplOworCQl1OCBsb29wX2ZpbHRlcl9kaXNhYmxlX2ZsYWc7CisJfSBwY207CisJdTggc3BzX3RlbXBvcmFsX212cF9lbmFibGVkX2ZsYWc7CisJdTggc3BzX3N0cm9uZ19pbnRyYV9zbW9vdGhpbmdfZW5hYmxlX2ZsYWc7CisKKwl1MzIgbG9nMl9taW5fY2Jfc2l6ZTsKKwl1MzIgbG9nMl9kaWZmX21heF9taW5fY29kaW5nX2Jsb2NrX3NpemU7CisJdTMyIGxvZzJfbWluX3RiX3NpemU7CisJdTMyIGxvZzJfbWF4X3RyYWZvX3NpemU7CisJdTMyIGxvZzJfY3RiX3NpemU7CisJdTMyIGxvZzJfbWluX3B1X3NpemU7CisKKwlpbnQgbWF4X3RyYW5zZm9ybV9oaWVyYXJjaHlfZGVwdGhfaW50ZXI7CisJaW50IG1heF90cmFuc2Zvcm1faGllcmFyY2h5X2RlcHRoX2ludHJhOworCisJaW50IHNwc19yYW5nZV9leHRlbnNpb25fZmxhZzsKKwlpbnQgdHJhbnNmb3JtX3NraXBfcm90YXRpb25fZW5hYmxlZF9mbGFnOworCWludCB0cmFuc2Zvcm1fc2tpcF9jb250ZXh0X2VuYWJsZWRfZmxhZzsKKwlpbnQgaW1wbGljaXRfcmRwY21fZW5hYmxlZF9mbGFnOworCWludCBleHBsaWNpdF9yZHBjbV9lbmFibGVkX2ZsYWc7CisJaW50IGV4dGVuZGVkX3ByZWNpc2lvbl9wcm9jZXNzaW5nX2ZsYWc7CisJaW50IGludHJhX3Ntb290aGluZ19kaXNhYmxlZF9mbGFnOworCWludCBoaWdoX3ByZWNpc2lvbl9vZmZzZXRzX2VuYWJsZWRfZmxhZzsKKwlpbnQgcGVyc2lzdGVudF9yaWNlX2FkYXB0YXRpb25fZW5hYmxlZF9mbGFnOworCWludCBjYWJhY19ieXBhc3NfYWxpZ25tZW50X2VuYWJsZWRfZmxhZzsKKworCS8vLzwgY29kZWQgZnJhbWUgZGltZW5zaW9uIGluIHZhcmlvdXMgdW5pdHMKKwlpbnQgd2lkdGg7CisJaW50IGhlaWdodDsKKwlpbnQgY3RiX3dpZHRoOworCWludCBjdGJfaGVpZ2h0OworCWludCBjdGJfc2l6ZTsKKwlpbnQgbWluX2NiX3dpZHRoOworCWludCBtaW5fY2JfaGVpZ2h0OworCWludCBtaW5fdGJfd2lkdGg7CisJaW50IG1pbl90Yl9oZWlnaHQ7CisJaW50IG1pbl9wdV93aWR0aDsKKwlpbnQgbWluX3B1X2hlaWdodDsKKwlpbnQgdGJfbWFzazsKKworCWludCBoc2hpZnRbM107CisJaW50IHZzaGlmdFszXTsKKworCWludCBxcF9iZF9vZmZzZXQ7CisKKwl1OCBkYXRhWzQwOTZdOworCWludCBkYXRhX3NpemU7Cit9OworCitzdHJ1Y3QgaDI2NV9QUFNfdCB7CisJdTMyIHNwc19pZDsgLy8vPCBzZXFfcGFyYW1ldGVyX3NldF9pZAorCisJdTggc2lnbl9kYXRhX2hpZGluZ19mbGFnOworCisJdTggY2FiYWNfaW5pdF9wcmVzZW50X2ZsYWc7CisKKwlpbnQgbnVtX3JlZl9pZHhfbDBfZGVmYXVsdF9hY3RpdmU7IC8vLzwgbnVtX3JlZl9pZHhfbDBfZGVmYXVsdF9hY3RpdmVfbWludXMxICsgMQorCWludCBudW1fcmVmX2lkeF9sMV9kZWZhdWx0X2FjdGl2ZTsgLy8vPCBudW1fcmVmX2lkeF9sMV9kZWZhdWx0X2FjdGl2ZV9taW51czEgKyAxCisJaW50IHBpY19pbml0X3FwX21pbnVzMjY7CisKKwl1OCBjb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWc7CisJdTggdHJhbnNmb3JtX3NraXBfZW5hYmxlZF9mbGFnOworCisJdTggY3VfcXBfZGVsdGFfZW5hYmxlZF9mbGFnOworCWludCBkaWZmX2N1X3FwX2RlbHRhX2RlcHRoOworCisJaW50IGNiX3FwX29mZnNldDsKKwlpbnQgY3JfcXBfb2Zmc2V0OworCXU4IHBpY19zbGljZV9sZXZlbF9jaHJvbWFfcXBfb2Zmc2V0c19wcmVzZW50X2ZsYWc7CisJdTggd2VpZ2h0ZWRfcHJlZF9mbGFnOworCXU4IHdlaWdodGVkX2JpcHJlZF9mbGFnOworCXU4IG91dHB1dF9mbGFnX3ByZXNlbnRfZmxhZzsKKwl1OCB0cmFuc3F1YW50X2J5cGFzc19lbmFibGVfZmxhZzsKKworCXU4IGRlcGVuZGVudF9zbGljZV9zZWdtZW50c19lbmFibGVkX2ZsYWc7CisJdTggdGlsZXNfZW5hYmxlZF9mbGFnOworCXU4IGVudHJvcHlfY29kaW5nX3N5bmNfZW5hYmxlZF9mbGFnOworCisJaW50IG51bV90aWxlX2NvbHVtbnM7ICAgLy8vPCBudW1fdGlsZV9jb2x1bW5zX21pbnVzMSArIDEKKwlpbnQgbnVtX3RpbGVfcm93czsgICAgICAvLy88IG51bV90aWxlX3Jvd3NfbWludXMxICsgMQorCXU4IHVuaWZvcm1fc3BhY2luZ19mbGFnOworCXU4IGxvb3BfZmlsdGVyX2Fjcm9zc190aWxlc19lbmFibGVkX2ZsYWc7CisKKwl1OCBzZXFfbG9vcF9maWx0ZXJfYWNyb3NzX3NsaWNlc19lbmFibGVkX2ZsYWc7CisKKwl1OCBkZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZzsKKwl1OCBkZWJsb2NraW5nX2ZpbHRlcl9vdmVycmlkZV9lbmFibGVkX2ZsYWc7CisJdTggZGlzYWJsZV9kYmY7CisJaW50IGJldGFfb2Zmc2V0OyAgICAvLy88IGJldGFfb2Zmc2V0X2RpdjIgKiAyCisJaW50IHRjX29mZnNldDsgICAgICAvLy88IHRjX29mZnNldF9kaXYyICogMgorCisJdTggc2NhbGluZ19saXN0X2RhdGFfcHJlc2VudF9mbGFnOworCXN0cnVjdCBTY2FsaW5nTGlzdCBzY2FsaW5nX2xpc3Q7CisKKwl1OCBsaXN0c19tb2RpZmljYXRpb25fcHJlc2VudF9mbGFnOworCWludCBsb2cyX3BhcmFsbGVsX21lcmdlX2xldmVsOyAvLy88IGxvZzJfcGFyYWxsZWxfbWVyZ2VfbGV2ZWxfbWludXMyICsgMgorCWludCBudW1fZXh0cmFfc2xpY2VfaGVhZGVyX2JpdHM7CisJdTggc2xpY2VfaGVhZGVyX2V4dGVuc2lvbl9wcmVzZW50X2ZsYWc7CisJdTggbG9nMl9tYXhfdHJhbnNmb3JtX3NraXBfYmxvY2tfc2l6ZTsKKwl1OCBjcm9zc19jb21wb25lbnRfcHJlZGljdGlvbl9lbmFibGVkX2ZsYWc7CisJdTggY2hyb21hX3FwX29mZnNldF9saXN0X2VuYWJsZWRfZmxhZzsKKwl1OCBkaWZmX2N1X2Nocm9tYV9xcF9vZmZzZXRfZGVwdGg7CisJdTggY2hyb21hX3FwX29mZnNldF9saXN0X2xlbl9taW51czE7CisJY2hhciAgY2JfcXBfb2Zmc2V0X2xpc3RbNl07CisJY2hhciAgY3JfcXBfb2Zmc2V0X2xpc3RbNl07CisJdTggbG9nMl9zYW9fb2Zmc2V0X3NjYWxlX2x1bWE7CisJdTggbG9nMl9zYW9fb2Zmc2V0X3NjYWxlX2Nocm9tYTsKKworCS8vIEluZmVycmVkIHBhcmFtZXRlcnMKKwl1MzIgKmNvbHVtbl93aWR0aDsgIC8vLzwgQ29sdW1uV2lkdGgKKwl1MzIgKnJvd19oZWlnaHQ7ICAgIC8vLzwgUm93SGVpZ2h0CisJdTMyICpjb2xfYmQ7ICAgICAgICAvLy88IENvbEJkCisJdTMyICpyb3dfYmQ7ICAgICAgICAvLy88IFJvd0JkCisJaW50ICpjb2xfaWR4WDsKKworCWludCAqY3RiX2FkZHJfcnNfdG9fdHM7IC8vLzwgQ3RiQWRkclJTVG9UUworCWludCAqY3RiX2FkZHJfdHNfdG9fcnM7IC8vLzwgQ3RiQWRkclRTVG9SUworCWludCAqdGlsZV9pZDsgICAgICAgICAgIC8vLzwgVGlsZUlkCisJaW50ICp0aWxlX3Bvc19yczsgICAgICAgLy8vPCBUaWxlUG9zUlMKKwlpbnQgKm1pbl90Yl9hZGRyX3pzOyAgICAvLy88IE1pblRiQWRkclpTCisJaW50ICptaW5fdGJfYWRkcl96c190YWI7Ly8vPCBNaW5UYkFkZHJaUworfTsKKworc3RydWN0IGgyNjVfcGFyYW1fc2V0cyB7CisJYm9vbCB2cHNfcGFyc2VkOworCWJvb2wgc3BzX3BhcnNlZDsKKwlib29sIHBwc19wYXJzZWQ7CisJLyogY3VycmVudGx5IGFjdGl2ZSBwYXJhbWV0ZXIgc2V0cyAqLworCXN0cnVjdCBoMjY1X1ZQU190IHZwczsKKwlzdHJ1Y3QgaDI2NV9TUFNfdCBzcHM7CisJc3RydWN0IGgyNjVfUFBTX3QgcHBzOworfTsKKworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX1Y0TF9TT0ZUV0FSRV9QQVJTRVIKK2ludCBoMjY1X2RlY29kZV9leHRyYWRhdGFfcHModTggKmRhdGEsIGludCBzaXplLCBzdHJ1Y3QgaDI2NV9wYXJhbV9zZXRzICpwcyk7CisjZWxzZQoraW5saW5lIGludCBoMjY1X2RlY29kZV9leHRyYWRhdGFfcHModTggKmRhdGEsIGludCBzaXplLCBzdHJ1Y3QgaDI2NV9wYXJhbV9zZXRzICpwcykgeyByZXR1cm4gLTE7IH0KKyNlbmRpZgorCisjZW5kaWYgLyogQU1MX0hFVkNfUEFSU0VSX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbXZkZWNfcG9ydHMvZGVjb2Rlci9hbWxfbWpwZWdfcGFyc2VyLmMgYi9kcml2ZXJzL2FtdmRlY19wb3J0cy9kZWNvZGVyL2FtbF9tanBlZ19wYXJzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTgyYWIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvZGVjb2Rlci9hbWxfbWpwZWdfcGFyc2VyLmMKQEAgLTAsMCArMSwzOTcgQEAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisjaW5jbHVkZSAiYW1sX21qcGVnX3BhcnNlci5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2dldF9iaXRzLmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvcHV0X2JpdHMuaCIKKyNpbmNsdWRlICIuLi91dGlscy9nb2xvbWIuaCIKKyNpbmNsdWRlICIuLi91dGlscy9jb21tb24uaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCisvKiByZXR1cm4gdGhlIDggYml0IHN0YXJ0IGNvZGUgdmFsdWUgYW5kIHVwZGF0ZSB0aGUgc2VhcmNoCitzdGF0ZS4gUmV0dXJuIC0xIGlmIG5vIHN0YXJ0IGNvZGUgZm91bmQgKi8KK3N0YXRpYyBpbnQgZmluZF9tYXJrZXIoY29uc3QgdTggKipwYnVmX3B0ciwgY29uc3QgdTggKmJ1Zl9lbmQpCit7CisJY29uc3QgdTggKmJ1Zl9wdHI7CisJdTMyIHYsIHYyOworCWludCB2YWw7CisJaW50IHNraXBwZWQgPSAwOworCisJYnVmX3B0ciA9ICpwYnVmX3B0cjsKKwl3aGlsZSAoYnVmX2VuZCAtIGJ1Zl9wdHIgPiAxKSB7CisJCXYgID0gKmJ1Zl9wdHIrKzsKKwkJdjIgPSAqYnVmX3B0cjsKKwkJaWYgKCh2ID09IDB4ZmYpICYmICh2MiA+PSAweGMwKSAmJiAodjIgPD0gMHhmZSkgJiYgYnVmX3B0ciA8IGJ1Zl9lbmQpIHsKKwkJCXZhbCA9ICpidWZfcHRyKys7CisJCQlnb3RvIGZvdW5kOworCQl9CisJCXNraXBwZWQrKzsKKwl9CisJYnVmX3B0ciA9IGJ1Zl9lbmQ7CisJdmFsID0gLTE7Citmb3VuZDoKKwl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsICJmaW5kX21hcmtlciBza2lwcGVkICVkIGJ5dGVzXG4iLCBza2lwcGVkKTsKKwkqcGJ1Zl9wdHIgPSBidWZfcHRyOworCisJcmV0dXJuIHZhbDsKK30KKworaW50IGZmX21qcGVnX2ZpbmRfbWFya2VyKHN0cnVjdCBNSnBlZ0RlY29kZUNvbnRleHQgKnMsCisJY29uc3QgdTggKipidWZfcHRyLCBjb25zdCB1OCAqYnVmX2VuZCwKKwljb25zdCB1OCAqKnVuZXNjYXBlZF9idWZfcHRyLAorCWludCAqdW5lc2NhcGVkX2J1Zl9zaXplKQoreworCWludCBzdGFydF9jb2RlOworCisJc3RhcnRfY29kZSA9IGZpbmRfbWFya2VyKGJ1Zl9wdHIsIGJ1Zl9lbmQpOworCisJLyogdW5lc2NhcGUgYnVmZmVyIG9mIFNPUywgdXNlIHNwZWNpYWwgdHJlYXRtZW50IGZvciBKUEVHLUxTICovCisJaWYgKHN0YXJ0X2NvZGUgPT0gU09TICYmICFzLT5scykgeworCQljb25zdCB1OCAqc3JjID0gKmJ1Zl9wdHI7CisJCWNvbnN0IHU4ICpwdHIgPSBzcmM7CisJCXU4ICpkc3QgPSBzLT5idWZmZXI7CisKKwkJI2RlZmluZSBjb3B5X2RhdGFfc2VnbWVudChza2lwKSBkbyB7CQkJXAorCQkJCWludCBsZW5ndGggPSAocHRyIC0gc3JjKSAtIChza2lwKTsJXAorCQkJCWlmIChsZW5ndGggPiAwKSB7CQkJXAorCQkJCQltZW1jcHkoZHN0LCBzcmMsIGxlbmd0aCk7CVwKKwkJCQkJZHN0ICs9IGxlbmd0aDsJCQlcCisJCQkJCXNyYyA9IHB0cjsJCQlcCisJCQkJfQkJCQkJXAorCQkJfSB3aGlsZSAoMCkKKworCisJCXdoaWxlIChwdHIgPCBidWZfZW5kKSB7CisJCQl1OCB4ID0gKihwdHIrKyk7CisKKwkJCWlmICh4ID09IDB4ZmYpIHsKKwkJCQlpbnQgc2tpcCA9IDA7CisJCQkJd2hpbGUgKHB0ciA8IGJ1Zl9lbmQgJiYgeCA9PSAweGZmKSB7CisJCQkJCXggPSAqKHB0cisrKTsKKwkJCQkJc2tpcCsrOworCQkJCX0KKworCQkJCS8qIDB4RkYsIDB4RkYsIC4uLiAqLworCQkJCWlmIChza2lwID4gMSkgeworCQkJCQljb3B5X2RhdGFfc2VnbWVudChza2lwKTsKKworCQkJCQkvKiBkZWNyZW1lbnQgc3JjIGFzIGl0IGlzIGVxdWFsIHRvIHB0ciBhZnRlciB0aGUKKwkJCQkJKiBjb3B5X2RhdGFfc2VnbWVudCBtYWNybyBhbmQgd2UgbWlnaHQgd2FudCB0bworCQkJCQkqIGNvcHkgdGhlIGN1cnJlbnQgdmFsdWUgb2YgeCBsYXRlciBvbiAqLworCQkJCQlzcmMtLTsKKwkJCQl9CisKKwkJCQlpZiAoeCA8IDB4ZDAgfHwgeCA+IDB4ZDcpIHsKKwkJCQkJY29weV9kYXRhX3NlZ21lbnQoMSk7CisJCQkJCWlmICh4KQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKHNyYyA8IHB0cikKKwkJCQljb3B5X2RhdGFfc2VnbWVudCgwKTsKKwkJfQorCQkjdW5kZWYgY29weV9kYXRhX3NlZ21lbnQKKworCQkqdW5lc2NhcGVkX2J1Zl9wdHIgID0gcy0+YnVmZmVyOworCQkqdW5lc2NhcGVkX2J1Zl9zaXplID0gZHN0IC0gcy0+YnVmZmVyOworCQltZW1zZXQocy0+YnVmZmVyICsgKnVuZXNjYXBlZF9idWZfc2l6ZSwgMCwKKwkJCUFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworCisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX1BBUlNFUiwgImVzY2FwaW5nIHJlbW92ZWQgJWQgYnl0ZXNcbiIsCisJCQkoaW50KSgoYnVmX2VuZCAtICpidWZfcHRyKSAtIChkc3QgLSBzLT5idWZmZXIpKSk7CisJfSBlbHNlIGlmIChzdGFydF9jb2RlID09IFNPUyAmJiBzLT5scykgeworCQljb25zdCB1OCAqc3JjID0gKmJ1Zl9wdHI7CisJCXU4ICpkc3QgID0gcy0+YnVmZmVyOworCQlpbnQgYml0X2NvdW50ID0gMDsKKwkJaW50IHQgPSAwLCBiID0gMDsKKwkJc3RydWN0IHB1dF9iaXRzX2NvbnRleHQgcGI7CisKKwkJLyogZmluZCBtYXJrZXIgKi8KKwkJd2hpbGUgKHNyYyArIHQgPCBidWZfZW5kKSB7CisJCQl1OCB4ID0gc3JjW3QrK107CisJCQlpZiAoeCA9PSAweGZmKSB7CisJCQkJd2hpbGUgKChzcmMgKyB0IDwgYnVmX2VuZCkgJiYgeCA9PSAweGZmKQorCQkJCQl4ID0gc3JjW3QrK107CisJCQkJaWYgKHggJiAweDgwKSB7CisJCQkJCXQgLT0gRkZNSU4oMiwgdCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQliaXRfY291bnQgPSB0ICogODsKKwkJaW5pdF9wdXRfYml0cygmcGIsIGRzdCwgdCk7CisKKwkJLyogdW5lc2NhcGUgYml0c3RyZWFtICovCisJCXdoaWxlIChiIDwgdCkgeworCQkJdTggeCA9IHNyY1tiKytdOworCQkJcHV0X2JpdHMoJnBiLCA4LCB4KTsKKwkJCWlmICh4ID09IDB4RkYgJiYgYiA8IHQpIHsKKwkJCQl4ID0gc3JjW2IrK107CisJCQkJaWYgKHggJiAweDgwKSB7CisJCQkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAiSW52YWxpZCBlc2NhcGUgc2VxdWVuY2VcbiIpOworCQkJCQl4ICY9IDB4N2Y7CisJCQkJfQorCQkJCXB1dF9iaXRzKCZwYiwgNywgeCk7CisJCQkJYml0X2NvdW50LS07CisJCQl9CisJCX0KKwkJZmx1c2hfcHV0X2JpdHMoJnBiKTsKKworCQkqdW5lc2NhcGVkX2J1Zl9wdHIJPSBkc3Q7CisJCSp1bmVzY2FwZWRfYnVmX3NpemUgPSAoYml0X2NvdW50ICsgNykgPj4gMzsKKwkJbWVtc2V0KHMtPmJ1ZmZlciArICp1bmVzY2FwZWRfYnVmX3NpemUsIDAsCisJCQlBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKwl9IGVsc2UgeworCQkqdW5lc2NhcGVkX2J1Zl9wdHIJPSAqYnVmX3B0cjsKKwkJKnVuZXNjYXBlZF9idWZfc2l6ZSA9IGJ1Zl9lbmQgLSAqYnVmX3B0cjsKKwl9CisKKwlyZXR1cm4gc3RhcnRfY29kZTsKK30KKworCitpbnQgZmZfbWpwZWdfZGVjb2RlX3NvZihzdHJ1Y3QgTUpwZWdEZWNvZGVDb250ZXh0ICpzKQoreworCWludCBsZW4sIG5iX2NvbXBvbmVudHMsIGksIHdpZHRoLCBoZWlnaHQsIGJpdHMsIHNpemVfY2hhbmdlOworCWludCBoX2NvdW50W01BWF9DT01QT05FTlRTXSA9IHsgMCB9OworCWludCB2X2NvdW50W01BWF9DT01QT05FTlRTXSA9IHsgMCB9OworCisJcy0+Y3VyX3NjYW4gPSAwOworCW1lbXNldChzLT51cHNjYWxlX2gsIDAsIHNpemVvZihzLT51cHNjYWxlX2gpKTsKKwltZW1zZXQocy0+dXBzY2FsZV92LCAwLCBzaXplb2Yocy0+dXBzY2FsZV92KSk7CisKKwkvKiBYWFg6IHZlcmlmeSBsZW4gZmllbGQgdmFsaWRpdHkgKi8KKwlsZW4gICAgID0gZ2V0X2JpdHMoJnMtPmdiLCAxNik7CisJYml0cyAgICA9IGdldF9iaXRzKCZzLT5nYiwgOCk7CisKKwlpZiAoYml0cyA+IDE2IHx8IGJpdHMgPCAxKSB7CisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAiYml0cyAlZCBpcyBpbnZhbGlkXG4iLCBiaXRzKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWhlaWdodCA9IGdldF9iaXRzKCZzLT5nYiwgMTYpOworCXdpZHRoICA9IGdldF9iaXRzKCZzLT5nYiwgMTYpOworCisJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLCAic29mMDogcGljdHVyZTogJWR4JWRcbiIsIHdpZHRoLCBoZWlnaHQpOworCisJbmJfY29tcG9uZW50cyA9IGdldF9iaXRzKCZzLT5nYiwgOCk7CisJaWYgKG5iX2NvbXBvbmVudHMgPD0gMCB8fAorCQluYl9jb21wb25lbnRzID4gTUFYX0NPTVBPTkVOVFMpCisJCXJldHVybiAtMTsKKworCXMtPm5iX2NvbXBvbmVudHMgPSBuYl9jb21wb25lbnRzOworCXMtPmhfbWF4ICAgICAgICAgPSAxOworCXMtPnZfbWF4ICAgICAgICAgPSAxOworCWZvciAoaSA9IDA7IGkgPCBuYl9jb21wb25lbnRzOyBpKyspIHsKKwkJLyogY29tcG9uZW50IGlkICovCisJCXMtPmNvbXBvbmVudF9pZFtpXSA9IGdldF9iaXRzKCZzLT5nYiwgOCkgLSAxOworCQloX2NvdW50W2ldICAgICAgICAgPSBnZXRfYml0cygmcy0+Z2IsIDQpOworCQl2X2NvdW50W2ldICAgICAgICAgPSBnZXRfYml0cygmcy0+Z2IsIDQpOworCQkvKiBjb21wdXRlIGhtYXggYW5kIHZtYXggKG9ubHkgdXNlZCBpbiBpbnRlcmxlYXZlZCBjYXNlKSAqLworCQlpZiAoaF9jb3VudFtpXSA+IHMtPmhfbWF4KQorCQkJcy0+aF9tYXggPSBoX2NvdW50W2ldOworCQlpZiAodl9jb3VudFtpXSA+IHMtPnZfbWF4KQorCQkJcy0+dl9tYXggPSB2X2NvdW50W2ldOworCQlzLT5xdWFudF9pbmRleFtpXSA9IGdldF9iaXRzKCZzLT5nYiwgOCk7CisJCWlmIChzLT5xdWFudF9pbmRleFtpXSA+PSA0KSB7CisJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgInF1YW50X2luZGV4IGlzIGludmFsaWRcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmICghaF9jb3VudFtpXSB8fCAhdl9jb3VudFtpXSkgeworCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJJbnZhbGlkIHNhbXBsaW5nIGZhY3RvciBpbiBjb21wb25lbnQgJWQgJWQ6JWRcbiIsCisJCQkJaSwgaF9jb3VudFtpXSwgdl9jb3VudFtpXSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsICJjb21wb25lbnQgJWQgJWQ6JWQgaWQ6ICVkIHF1YW50OiVkXG4iLAorCQkJaSwgaF9jb3VudFtpXSwgdl9jb3VudFtpXSwKKwkJcy0+Y29tcG9uZW50X2lkW2ldLCBzLT5xdWFudF9pbmRleFtpXSk7CisJfQorCWlmIChuYl9jb21wb25lbnRzID09IDQKKwkJJiYgcy0+Y29tcG9uZW50X2lkWzBdID09ICdDJyAtIDEKKwkJJiYgcy0+Y29tcG9uZW50X2lkWzFdID09ICdNJyAtIDEKKwkJJiYgcy0+Y29tcG9uZW50X2lkWzJdID09ICdZJyAtIDEKKwkJJiYgcy0+Y29tcG9uZW50X2lkWzNdID09ICdLJyAtIDEpCisJCXMtPmFkb2JlX3RyYW5zZm9ybSA9IDA7CisKKwkvKiBpZiBkaWZmZXJlbnQgc2l6ZSwgcmVhbGxvYy9hbGxvYyBwaWN0dXJlICovCisJaWYgKHdpZHRoICE9IHMtPndpZHRoIHx8IGhlaWdodCAhPSBzLT5oZWlnaHQgfHwgYml0cyAhPSBzLT5iaXRzIHx8CisJCW1lbWNtcChzLT5oX2NvdW50LCBoX2NvdW50LCBzaXplb2YoaF9jb3VudCkpICAgICAgICAgICAgICAgIHx8CisJCW1lbWNtcChzLT52X2NvdW50LCB2X2NvdW50LCBzaXplb2Yodl9jb3VudCkpKSB7CisJCXNpemVfY2hhbmdlID0gMTsKKworCQlzLT53aWR0aCAgICAgID0gd2lkdGg7CisJCXMtPmhlaWdodCAgICAgPSBoZWlnaHQ7CisJCXMtPmJpdHMgICAgICAgPSBiaXRzOworCQltZW1jcHkocy0+aF9jb3VudCwgaF9jb3VudCwgc2l6ZW9mKGhfY291bnQpKTsKKwkJbWVtY3B5KHMtPnZfY291bnQsIHZfY291bnQsIHNpemVvZih2X2NvdW50KSk7CisJCXMtPmludGVybGFjZWQgPSAwOworCQlzLT5nb3RfcGljdHVyZSA9IDA7CisJfSBlbHNlIHsKKwkJc2l6ZV9jaGFuZ2UgPSAwOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZmX21qcGVnX2RlY29kZV9mcmFtZSh1OCAqYnVmLCBpbnQgYnVmX3NpemUsIHN0cnVjdCBNSnBlZ0RlY29kZUNvbnRleHQgKnMpCit7CisJY29uc3QgdTggKmJ1Zl9lbmQsICpidWZfcHRyOworCWNvbnN0IHU4ICp1bmVzY2FwZWRfYnVmX3B0cjsKKwlpbnQgdW5lc2NhcGVkX2J1Zl9zaXplOworCWludCBzdGFydF9jb2RlOworCWludCByZXQgPSAwOworCisJYnVmX3B0ciA9IGJ1ZjsKKwlidWZfZW5kID0gYnVmICsgYnVmX3NpemU7CisJd2hpbGUgKGJ1Zl9wdHIgPCBidWZfZW5kKSB7CisJCS8qIGZpbmQgc3RhcnQgbmV4dCBtYXJrZXIgKi8KKwkJc3RhcnRfY29kZSA9IGZmX21qcGVnX2ZpbmRfbWFya2VyKHMsICZidWZfcHRyLCBidWZfZW5kLAorCQkJCQkJJnVuZXNjYXBlZF9idWZfcHRyLAorCQkJCQkJJnVuZXNjYXBlZF9idWZfc2l6ZSk7CisJCS8qIEVPRiAqLworCQlpZiAoc3RhcnRfY29kZSA8IDApIHsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKHVuZXNjYXBlZF9idWZfc2l6ZSA+IElOVF9NQVggLyA4KSB7CisJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgIk1KUEVHIHBhY2tldCAweCV4IHRvbyBiaWcgKCVkLyVkKSwgY29ycnVwdCBkYXRhP1xuIiwKKwkJCQlzdGFydF9jb2RlLCB1bmVzY2FwZWRfYnVmX3NpemUsIGJ1Zl9zaXplKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsICJtYXJrZXI9JXggYXZhaWxfc2l6ZV9pbl9idWY9JWRcbiIsCisJCQlzdGFydF9jb2RlLCAoaW50KShidWZfZW5kIC0gYnVmX3B0cikpOworCisJCXJldCA9IGluaXRfZ2V0X2JpdHM4KCZzLT5nYiwgdW5lc2NhcGVkX2J1Zl9wdHIsIHVuZXNjYXBlZF9idWZfc2l6ZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgImludmFsaWQgYnVmZmVyXG4iKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCXMtPnN0YXJ0X2NvZGUgPSBzdGFydF9jb2RlOworCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsICJzdGFydGNvZGU6ICVYXG4iLCBzdGFydF9jb2RlKTsKKworCQlzd2l0Y2ggKHN0YXJ0X2NvZGUpIHsKKwkJY2FzZSBTT0YwOgorCQljYXNlIFNPRjE6CisJCWNhc2UgU09GMjoKKwkJY2FzZSBTT0YzOgorCQljYXNlIFNPRjQ4OgorCQljYXNlIFNPSToKKwkJY2FzZSBTT1M6CisJCWNhc2UgRU9JOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIHNraXA7CisJCX0KKworCQlzd2l0Y2ggKHN0YXJ0X2NvZGUpIHsKKwkJY2FzZSBTT0k6CisJCQlzLT5yZXN0YXJ0X2ludGVydmFsID0gMDsKKwkJCXMtPnJlc3RhcnRfY291bnQgICAgPSAwOworCQkJcy0+cmF3X2ltYWdlX2J1ZmZlciAgICAgID0gYnVmX3B0cjsKKwkJCXMtPnJhd19pbWFnZV9idWZmZXJfc2l6ZSA9IGJ1Zl9lbmQgLSBidWZfcHRyOworCQkJLyogbm90aGluZyB0byBkbyBvbiBTT0kgKi8KKwkJCWJyZWFrOworCQljYXNlIFNPRjA6CisJCWNhc2UgU09GMToKKwkJCWlmIChzdGFydF9jb2RlID09IFNPRjApCisJCQkJcy0+cHJvZmlsZSA9IEZGX1BST0ZJTEVfTUpQRUdfSFVGRk1BTl9CQVNFTElORV9EQ1Q7CisJCQllbHNlCisJCQkJcy0+cHJvZmlsZSA9IEZGX1BST0ZJTEVfTUpQRUdfSFVGRk1BTl9FWFRFTkRFRF9TRVFVRU5USUFMX0RDVDsKKwkJCXMtPmxvc3NsZXNzICAgID0gMDsKKwkJCXMtPmxzICAgICAgICAgID0gMDsKKwkJCXMtPnByb2dyZXNzaXZlID0gMDsKKwkJCWlmICgocmV0ID0gZmZfbWpwZWdfZGVjb2RlX3NvZihzKSkgPCAwKQorCQkJCWdvdG8gZmFpbDsKKwkJCWJyZWFrOworCQljYXNlIFNPRjI6CisJCQlzLT5wcm9maWxlID0gRkZfUFJPRklMRV9NSlBFR19IVUZGTUFOX1BST0dSRVNTSVZFX0RDVDsKKwkJCXMtPmxvc3NsZXNzICAgID0gMDsKKwkJCXMtPmxzICAgICAgICAgID0gMDsKKwkJCXMtPnByb2dyZXNzaXZlID0gMTsKKwkJCWlmICgocmV0ID0gZmZfbWpwZWdfZGVjb2RlX3NvZihzKSkgPCAwKQorCQkJCWdvdG8gZmFpbDsKKwkJCWJyZWFrOworCQljYXNlIFNPRjM6CisJCQlzLT5wcm9maWxlICAgICA9IEZGX1BST0ZJTEVfTUpQRUdfSFVGRk1BTl9MT1NTTEVTUzsKKwkJCXMtPnByb3BlcnRpZXMgfD0gRkZfQ09ERUNfUFJPUEVSVFlfTE9TU0xFU1M7CisJCQlzLT5sb3NzbGVzcyAgICA9IDE7CisJCQlzLT5scyAgICAgICAgICA9IDA7CisJCQlzLT5wcm9ncmVzc2l2ZSA9IDA7CisJCQlpZiAoKHJldCA9IGZmX21qcGVnX2RlY29kZV9zb2YocykpIDwgMCkKKwkJCQlnb3RvIGZhaWw7CisJCQlicmVhazsKKwkJY2FzZSBTT0Y0ODoKKwkJCXMtPnByb2ZpbGUgICAgID0gRkZfUFJPRklMRV9NSlBFR19KUEVHX0xTOworCQkJcy0+cHJvcGVydGllcyB8PSBGRl9DT0RFQ19QUk9QRVJUWV9MT1NTTEVTUzsKKwkJCXMtPmxvc3NsZXNzICAgID0gMTsKKwkJCXMtPmxzICAgICAgICAgID0gMTsKKwkJCXMtPnByb2dyZXNzaXZlID0gMDsKKwkJCWlmICgocmV0ID0gZmZfbWpwZWdfZGVjb2RlX3NvZihzKSkgPCAwKQorCQkJCWdvdG8gZmFpbDsKKwkJCWJyZWFrOworCQljYXNlIEVPSToKKwkJCWdvdG8gdGhlX2VuZDsKKwkJY2FzZSBESFQ6CisJCWNhc2UgTFNFOgorCQljYXNlIFNPUzoKKwkJY2FzZSBEUkk6CisJCWNhc2UgU09GNToKKwkJY2FzZSBTT0Y2OgorCQljYXNlIFNPRjc6CisJCWNhc2UgU09GOToKKwkJY2FzZSBTT0YxMDoKKwkJY2FzZSBTT0YxMToKKwkJY2FzZSBTT0YxMzoKKwkJY2FzZSBTT0YxNDoKKwkJY2FzZSBTT0YxNToKKwkJY2FzZSBKUEc6CisJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgIm1qcGVnOiB1bnN1cHBvcnRlZCBjb2RpbmcgdHlwZSAoJXgpXG4iLCBzdGFydF9jb2RlKTsKKwkJCWJyZWFrOworCQl9Citza2lwOgorCQkvKiBlb2YgcHJvY2VzcyBzdGFydCBjb2RlICovCisJCWJ1Zl9wdHIgKz0gKGdldF9iaXRzX2NvdW50KCZzLT5nYikgKyA3KSAvIDg7CisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX1BBUlNFUiwgIm1hcmtlciBwYXJzZXIgdXNlZCAlZCBieXRlcyAoJWQgYml0cylcbiIsCisJCQkoZ2V0X2JpdHNfY291bnQoJnMtPmdiKSArIDcpIC8gOCwgZ2V0X2JpdHNfY291bnQoJnMtPmdiKSk7CisJfQorCisJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJObyBKUEVHIGRhdGEgZm91bmQgaW4gaW1hZ2VcbiIpOworCXJldHVybiAtMTsKK2ZhaWw6CisJcy0+Z290X3BpY3R1cmUgPSAwOworCXJldHVybiByZXQ7Cit0aGVfZW5kOgorCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX1BBUlNFUiwgImRlY29kZSBmcmFtZSB1bnVzZWQgJWQgYnl0ZXNcbiIsIChpbnQpKGJ1Zl9lbmQgLSBidWZfcHRyKSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG1qcGVnX2RlY29kZV9leHRyYWRhdGFfcHModTggKmJ1ZiwgaW50IHNpemUsIHN0cnVjdCBtanBlZ19wYXJhbV9zZXRzICpwcykKK3sKKwlpbnQgcmV0OworCisJcHMtPmhlYWRfcGFyc2VkID0gZmFsc2U7CisKKwlwcy0+ZGVjX3BzLmJ1Zl9zaXplID0gc2l6ZTsKKwlwcy0+ZGVjX3BzLmJ1ZmZlciA9IHZ6YWxsb2Moc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworCWlmICghcHMtPmRlY19wcy5idWZmZXIpCisJICAgIHJldHVybiAtMTsKKworCXJldCA9IGZmX21qcGVnX2RlY29kZV9mcmFtZShidWYsIHNpemUsICZwcy0+ZGVjX3BzKTsKKwlpZiAocmV0KSB7CisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAicGFyc2UgZXh0cmEgZGF0YSBmYWlsZWQuIGVycjogJWRcbiIsIHJldCk7CisJCXZmcmVlKHBzLT5kZWNfcHMuYnVmZmVyKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAocHMtPmRlY19wcy53aWR0aCAmJiBwcy0+ZGVjX3BzLmhlaWdodCkKKwkJcHMtPmhlYWRfcGFyc2VkID0gdHJ1ZTsKKworCXZmcmVlKHBzLT5kZWNfcHMuYnVmZmVyKTsKKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FtdmRlY19wb3J0cy9kZWNvZGVyL2FtbF9tanBlZ19wYXJzZXIuaCBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2RlY29kZXIvYW1sX21qcGVnX3BhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MDRiYTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FtdmRlY19wb3J0cy9kZWNvZGVyL2FtbF9tanBlZ19wYXJzZXIuaApAQCAtMCwwICsxLDE3MCBAQAorI2lmbmRlZiBBTUxfTUpQRUdfUEFSU0VSX0gKKyNkZWZpbmUgQU1MX01KUEVHX1BBUlNFUl9ICisKKyNpbmNsdWRlICIuLi9hbWxfdmNvZGVjX2Rydi5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2NvbW1vbi5oIgorI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX1Y0TF9TT0ZUV0FSRV9QQVJTRVIKKyNpbmNsdWRlICIuLi91dGlscy9nZXRfYml0cy5oIgorI2VuZGlmCisKKyNkZWZpbmUgRkZfUFJPRklMRV9NSlBFR19IVUZGTUFOX0JBU0VMSU5FX0RDVCAgICAgICAgICAgIDB4YzAKKyNkZWZpbmUgRkZfUFJPRklMRV9NSlBFR19IVUZGTUFOX0VYVEVOREVEX1NFUVVFTlRJQUxfRENUIDB4YzEKKyNkZWZpbmUgRkZfUFJPRklMRV9NSlBFR19IVUZGTUFOX1BST0dSRVNTSVZFX0RDVCAgICAgICAgIDB4YzIKKyNkZWZpbmUgRkZfUFJPRklMRV9NSlBFR19IVUZGTUFOX0xPU1NMRVNTICAgICAgICAgICAgICAgIDB4YzMKKyNkZWZpbmUgRkZfUFJPRklMRV9NSlBFR19KUEVHX0xTICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZjcKKworI2RlZmluZSBGRl9DT0RFQ19QUk9QRVJUWV9MT1NTTEVTUyAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBGRl9DT0RFQ19QUk9QRVJUWV9DTE9TRURfQ0FQVElPTlMgMHgwMDAwMDAwMgorCisjZGVmaW5lIE1BWF9DT01QT05FTlRTIDQKKworLyogSlBFRyBtYXJrZXIgY29kZXMgKi8KK2VudW0gSnBlZ01hcmtlciB7CisgICAgLyogc3RhcnQgb2YgZnJhbWUgKi8KKyAgICBTT0YwICA9IDB4YzAsICAgICAgIC8qIGJhc2VsaW5lICovCisgICAgU09GMSAgPSAweGMxLCAgICAgICAvKiBleHRlbmRlZCBzZXF1ZW50aWFsLCBodWZmbWFuICovCisgICAgU09GMiAgPSAweGMyLCAgICAgICAvKiBwcm9ncmVzc2l2ZSwgaHVmZm1hbiAqLworICAgIFNPRjMgID0gMHhjMywgICAgICAgLyogbG9zc2xlc3MsIGh1ZmZtYW4gKi8KKworICAgIFNPRjUgID0gMHhjNSwgICAgICAgLyogZGlmZmVyZW50aWFsIHNlcXVlbnRpYWwsIGh1ZmZtYW4gKi8KKyAgICBTT0Y2ICA9IDB4YzYsICAgICAgIC8qIGRpZmZlcmVudGlhbCBwcm9ncmVzc2l2ZSwgaHVmZm1hbiAqLworICAgIFNPRjcgID0gMHhjNywgICAgICAgLyogZGlmZmVyZW50aWFsIGxvc3NsZXNzLCBodWZmbWFuICovCisgICAgSlBHICAgPSAweGM4LCAgICAgICAvKiByZXNlcnZlZCBmb3IgSlBFRyBleHRlbnNpb24gKi8KKyAgICBTT0Y5ICA9IDB4YzksICAgICAgIC8qIGV4dGVuZGVkIHNlcXVlbnRpYWwsIGFyaXRobWV0aWMgKi8KKyAgICBTT0YxMCA9IDB4Y2EsICAgICAgIC8qIHByb2dyZXNzaXZlLCBhcml0aG1ldGljICovCisgICAgU09GMTEgPSAweGNiLCAgICAgICAvKiBsb3NzbGVzcywgYXJpdGhtZXRpYyAqLworCisgICAgU09GMTMgPSAweGNkLCAgICAgICAvKiBkaWZmZXJlbnRpYWwgc2VxdWVudGlhbCwgYXJpdGhtZXRpYyAqLworICAgIFNPRjE0ID0gMHhjZSwgICAgICAgLyogZGlmZmVyZW50aWFsIHByb2dyZXNzaXZlLCBhcml0aG1ldGljICovCisgICAgU09GMTUgPSAweGNmLCAgICAgICAvKiBkaWZmZXJlbnRpYWwgbG9zc2xlc3MsIGFyaXRobWV0aWMgKi8KKworICAgIERIVCAgID0gMHhjNCwgICAgICAgLyogZGVmaW5lIGh1ZmZtYW4gdGFibGVzICovCisKKyAgICBEQUMgICA9IDB4Y2MsICAgICAgIC8qIGRlZmluZSBhcml0aG1ldGljLWNvZGluZyBjb25kaXRpb25pbmcgKi8KKworICAgIC8qIHJlc3RhcnQgd2l0aCBtb2R1bG8gOCBjb3VudCAibSIgKi8KKyAgICBSU1QwICA9IDB4ZDAsCisgICAgUlNUMSAgPSAweGQxLAorICAgIFJTVDIgID0gMHhkMiwKKyAgICBSU1QzICA9IDB4ZDMsCisgICAgUlNUNCAgPSAweGQ0LAorICAgIFJTVDUgID0gMHhkNSwKKyAgICBSU1Q2ICA9IDB4ZDYsCisgICAgUlNUNyAgPSAweGQ3LAorCisgICAgU09JICAgPSAweGQ4LCAgICAgICAvKiBzdGFydCBvZiBpbWFnZSAqLworICAgIEVPSSAgID0gMHhkOSwgICAgICAgLyogZW5kIG9mIGltYWdlICovCisgICAgU09TICAgPSAweGRhLCAgICAgICAvKiBzdGFydCBvZiBzY2FuICovCisgICAgRFFUICAgPSAweGRiLCAgICAgICAvKiBkZWZpbmUgcXVhbnRpemF0aW9uIHRhYmxlcyAqLworICAgIEROTCAgID0gMHhkYywgICAgICAgLyogZGVmaW5lIG51bWJlciBvZiBsaW5lcyAqLworICAgIERSSSAgID0gMHhkZCwgICAgICAgLyogZGVmaW5lIHJlc3RhcnQgaW50ZXJ2YWwgKi8KKyAgICBESFAgICA9IDB4ZGUsICAgICAgIC8qIGRlZmluZSBoaWVyYXJjaGljYWwgcHJvZ3Jlc3Npb24gKi8KKyAgICBFWFAgICA9IDB4ZGYsICAgICAgIC8qIGV4cGFuZCByZWZlcmVuY2UgY29tcG9uZW50cyAqLworCisgICAgQVBQMCAgPSAweGUwLAorICAgIEFQUDEgID0gMHhlMSwKKyAgICBBUFAyICA9IDB4ZTIsCisgICAgQVBQMyAgPSAweGUzLAorICAgIEFQUDQgID0gMHhlNCwKKyAgICBBUFA1ICA9IDB4ZTUsCisgICAgQVBQNiAgPSAweGU2LAorICAgIEFQUDcgID0gMHhlNywKKyAgICBBUFA4ICA9IDB4ZTgsCisgICAgQVBQOSAgPSAweGU5LAorICAgIEFQUDEwID0gMHhlYSwKKyAgICBBUFAxMSA9IDB4ZWIsCisgICAgQVBQMTIgPSAweGVjLAorICAgIEFQUDEzID0gMHhlZCwKKyAgICBBUFAxNCA9IDB4ZWUsCisgICAgQVBQMTUgPSAweGVmLAorCisgICAgSlBHMCAgPSAweGYwLAorICAgIEpQRzEgID0gMHhmMSwKKyAgICBKUEcyICA9IDB4ZjIsCisgICAgSlBHMyAgPSAweGYzLAorICAgIEpQRzQgID0gMHhmNCwKKyAgICBKUEc1ICA9IDB4ZjUsCisgICAgSlBHNiAgPSAweGY2LAorICAgIFNPRjQ4ID0gMHhmNywgICAgICAgLy8vPCBKUEVHLUxTCisgICAgTFNFICAgPSAweGY4LCAgICAgICAvLy88IEpQRUctTFMgZXh0ZW5zaW9uIHBhcmFtZXRlcnMKKyAgICBKUEc5ICA9IDB4ZjksCisgICAgSlBHMTAgPSAweGZhLAorICAgIEpQRzExID0gMHhmYiwKKyAgICBKUEcxMiA9IDB4ZmMsCisgICAgSlBHMTMgPSAweGZkLAorCisgICAgQ09NICAgPSAweGZlLCAgICAgICAvKiBjb21tZW50ICovCisKKyAgICBURU0gICA9IDB4MDEsICAgICAgIC8qIHRlbXBvcmFyeSBwcml2YXRlIHVzZSBmb3IgYXJpdGhtZXRpYyBjb2RpbmcgKi8KKworICAgIC8qIDB4MDIgLT4gMHhiZiByZXNlcnZlZCAqLworfTsKKworc3RydWN0IFZMQyB7CisJaW50IGJpdHM7CisJc2hvcnQgKCp0YWJsZSlbMl07IC8vLzwgY29kZSwgYml0cworCWludCB0YWJsZV9zaXplLCB0YWJsZV9hbGxvY2F0ZWQ7Cit9OworCitzdHJ1Y3QgTUpwZWdEZWNvZGVDb250ZXh0IHsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9WNExfU09GVFdBUkVfUEFSU0VSCisJc3RydWN0IGdldF9iaXRzX2NvbnRleHQgZ2I7CisjZW5kaWYKKwlpbnQgYnVmX3NpemU7CisKKwlpbnQgc3RhcnRfY29kZTsgLyogY3VycmVudCBzdGFydCBjb2RlICovCisJaW50IGJ1ZmZlcl9zaXplOworCXU4ICpidWZmZXI7CisKKwl1MTYgcXVhbnRfbWF0cml4ZXNbNF1bNjRdOworCXN0cnVjdCBWTEMgdmxjc1szXVs0XTsKKwlpbnQgcXNjYWxlWzRdOyAgICAgIC8vLzwgcXVhbnRpemVyIHNjYWxlIGNhbGN1bGF0ZWQgZnJvbSBxdWFudF9tYXRyaXhlcworCisJaW50IGZpcnN0X3BpY3R1cmU7ICAgIC8qIHRydWUgaWYgZGVjb2RpbmcgZmlyc3QgcGljdHVyZSAqLworCWludCBpbnRlcmxhY2VkOyAgICAgLyogdHJ1ZSBpZiBpbnRlcmxhY2VkICovCisJaW50IGJvdHRvbV9maWVsZDsgICAvKiB0cnVlIGlmIGJvdHRvbSBmaWVsZCAqLworCWludCBsb3NzbGVzczsKKwlpbnQgbHM7CisJaW50IHByb2dyZXNzaXZlOworCXU4IHVwc2NhbGVfaFs0XTsKKwl1OCB1cHNjYWxlX3ZbNF07CisJaW50IGJpdHM7ICAgICAgICAgICAvKiBiaXRzIHBlciBjb21wb25lbnQgKi8KKwlpbnQgYWRvYmVfdHJhbnNmb3JtOworCisJaW50IHdpZHRoLCBoZWlnaHQ7CisJaW50IG1iX3dpZHRoLCBtYl9oZWlnaHQ7CisJaW50IG5iX2NvbXBvbmVudHM7CisJaW50IGJsb2NrX3N0cmlkZVtNQVhfQ09NUE9ORU5UU107CisJaW50IGNvbXBvbmVudF9pZFtNQVhfQ09NUE9ORU5UU107CisJaW50IGhfY291bnRbTUFYX0NPTVBPTkVOVFNdOyAvKiBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBjb3VudCBmb3IgZWFjaCBjb21wb25lbnQgKi8KKwlpbnQgdl9jb3VudFtNQVhfQ09NUE9ORU5UU107CisJaW50IGhfc2NvdW50W01BWF9DT01QT05FTlRTXTsKKwlpbnQgdl9zY291bnRbTUFYX0NPTVBPTkVOVFNdOworCWludCBoX21heCwgdl9tYXg7IC8qIG1heGltdW0gaCBhbmQgdiBjb3VudHMgKi8KKwlpbnQgcXVhbnRfaW5kZXhbNF07ICAgLyogcXVhbnQgdGFibGUgaW5kZXggZm9yIGVhY2ggY29tcG9uZW50ICovCisJaW50IGdvdF9waWN0dXJlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCB3ZSBmb3VuZCBhIFNPRiBhbmQgcGljdHVyZSBpcyB2YWxpZCwgdG9vLgorCWludCByZXN0YXJ0X2ludGVydmFsOworCWludCByZXN0YXJ0X2NvdW50OworCWludCBjdXJfc2NhbjsgLyogY3VycmVudCBzY2FuLCB1c2VkIGJ5IEpQRUctTFMgKi8KKworCS8vIFJhdyBzdHJlYW0gZGF0YSBmb3IgaHdhY2NlbCB1c2UuCisJY29uc3QgdTggKnJhd19pbWFnZV9idWZmZXI7CisJaW50IHJhd19pbWFnZV9idWZmZXJfc2l6ZTsKKworCWludCBwcm9maWxlOworCXUzMiBwcm9wZXJ0aWVzOworfTsKKworc3RydWN0IG1qcGVnX3BhcmFtX3NldHMgeworCWJvb2wgaGVhZF9wYXJzZWQ7CisJLyogY3VycmVudGx5IGFjdGl2ZSBwYXJhbWV0ZXIgc2V0cyAqLworCXN0cnVjdCBNSnBlZ0RlY29kZUNvbnRleHQgZGVjX3BzOworfTsKKworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX1Y0TF9TT0ZUV0FSRV9QQVJTRVIKK2ludCBtanBlZ19kZWNvZGVfZXh0cmFkYXRhX3BzKHU4ICpidWYsIGludCBzaXplLCBzdHJ1Y3QgbWpwZWdfcGFyYW1fc2V0cyAqcHMpOworI2Vsc2UKK2lubGluZSBpbnQgbWpwZWdfZGVjb2RlX2V4dHJhZGF0YV9wcyh1OCAqYnVmLCBpbnQgc2l6ZSwgc3RydWN0IG1qcGVnX3BhcmFtX3NldHMgKnBzKSB7IHJldHVybiAtMTsgfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbXZkZWNfcG9ydHMvZGVjb2Rlci9hbWxfbXBlZzEyX3BhcnNlci5jIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvZGVjb2Rlci9hbWxfbXBlZzEyX3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0OGE4M2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FtdmRlY19wb3J0cy9kZWNvZGVyL2FtbF9tcGVnMTJfcGFyc2VyLmMKQEAgLTAsMCArMSwxOTggQEAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisjaW5jbHVkZSAiYW1sX21wZWcxMl9wYXJzZXIuaCIKKyNpbmNsdWRlICIuLi91dGlscy9nZXRfYml0cy5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL3B1dF9iaXRzLmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvZ29sb21iLmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvY29tbW9uLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKworY29uc3Qgc3RydWN0IEFWUmF0aW9uYWwgZmZfbXBlZzEyX2ZyYW1lX3JhdGVfdGFiWzE2XSA9IHsKKwl7ICAgIDAsICAgIDB9LAorCXsyNDAwMCwgMTAwMX0sCisJeyAgIDI0LCAgICAxfSwKKwl7ICAgMjUsICAgIDF9LAorCXszMDAwMCwgMTAwMX0sCisJeyAgIDMwLCAgICAxfSwKKwl7ICAgNTAsICAgIDF9LAorCXs2MDAwMCwgMTAwMX0sCisJeyAgIDYwLCAgICAxfSwKKwkvLyBYaW5nJ3MgMTVmcHM6ICg5KQorCXsgICAxNSwgICAgMX0sCisJLy8gbGlibXBlZzMncyAiVW5vZmZpY2lhbCBlY29ub215IHJhdGVzIjogKDEwLTEzKQorCXsgICAgNSwgICAgMX0sCisJeyAgIDEwLCAgICAxfSwKKwl7ICAgMTIsICAgIDF9LAorCXsgICAxNSwgICAgMX0sCisJeyAgICAwLCAgICAwfSwKK307CisKK2NvbnN0IHU4ICphdnByaXZfZmluZF9zdGFydF9jb2RlKGNvbnN0IHU4ICpwLCBjb25zdCB1OCAqZW5kLCB1MzIgKnN0YXRlKQoreworCWludCBpOworCisJaWYgKHAgPj0gZW5kKQorCQlyZXR1cm4gZW5kOworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQl1MzIgdG1wID0gKnN0YXRlIDw8IDg7CisJCSpzdGF0ZSA9IHRtcCArICoocCsrKTsKKwkJaWYgKHRtcCA9PSAweDEwMCB8fCBwID09IGVuZCkKKwkJCXJldHVybiBwOworCX0KKworCXdoaWxlIChwIDwgZW5kKSB7CisJCWlmICAgICAgKHBbLTFdID4gMSAgICAgICkgcCArPSAzOworCQllbHNlIGlmIChwWy0yXSAgICAgICAgICApIHAgKz0gMjsKKwkJZWxzZSBpZiAocFstM118KHBbLTFdLTEpKSBwKys7CisJCWVsc2UgeworCQkJcCsrOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlwID0gRkZNSU4ocCwgZW5kKSAtIDQ7CisJKnN0YXRlID0gQVZfUkIzMihwKTsKKworCXJldHVybiBwICsgNDsKK30KKworc3RhdGljIHZvaWQgbXBlZ3ZpZGVvX2V4dHJhY3RfaGVhZGVycyhjb25zdCB1OCAqYnVmLCBpbnQgYnVmX3NpemUsCisJc3RydWN0IG1wZWcxMl9wYXJhbV9zZXRzICpwcykKK3sKKwlzdHJ1Y3QgTXB2UGFyc2VDb250ZXh0ICpwYyA9ICZwcy0+ZGVjX3BzOworCWNvbnN0IHU4ICpidWZfZW5kID0gYnVmICsgYnVmX3NpemU7CisJdTMyIHN0YXJ0X2NvZGU7CisJaW50IGZyYW1lX3JhdGVfaW5kZXgsIGV4dF90eXBlLCBieXRlc19sZWZ0OworCWludCBmcmFtZV9yYXRlX2V4dF9uLCBmcmFtZV9yYXRlX2V4dF9kOworCWludCB0b3BfZmllbGRfZmlyc3QsIHJlcGVhdF9maXJzdF9maWVsZCwgcHJvZ3Jlc3NpdmVfZnJhbWU7CisJaW50IGhvcml6X3NpemVfZXh0LCB2ZXJ0X3NpemVfZXh0LCBiaXRfcmF0ZV9leHQ7CisJaW50IGJpdF9yYXRlID0gMDsKKwlpbnQgdmJ2X2RlbGF5ID0gMDsKKwlpbnQgY2hyb21hX2Zvcm1hdDsKKwllbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCA9IEFWX1BJWF9GTVRfTk9ORTsKKwkvL0ZJWE1FIHJlcGxhY2UgdGhlIGNyYXAgd2l0aCBnZXRfYml0cygpCisJcGMtPnJlcGVhdF9waWN0ID0gMDsKKworCXdoaWxlIChidWYgPCBidWZfZW5kKSB7CisJCXN0YXJ0X2NvZGU9IC0xOworCQlidWY9IGF2cHJpdl9maW5kX3N0YXJ0X2NvZGUoYnVmLCBidWZfZW5kLCAmc3RhcnRfY29kZSk7CisJCWJ5dGVzX2xlZnQgPSBidWZfZW5kIC0gYnVmOworCQlzd2l0Y2ggKHN0YXJ0X2NvZGUpIHsKKwkJY2FzZSBQSUNUVVJFX1NUQVJUX0NPREU6CisJCQlpZiAoYnl0ZXNfbGVmdCA+PSAyKSB7CisJCQkJcGMtPnBpY3RfdHlwZSA9IChidWZbMV0gPj4gMykgJiA3OworCQkJCWlmIChieXRlc19sZWZ0ID49IDQpCisJCQkJCXZidl9kZWxheSA9ICgoYnVmWzFdICYgMHgwNykgPDwgMTMpIHwgKGJ1ZlsyXSA8PCA1KSB8IChidWZbM10gPj4gMyk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTRVFfU1RBUlRfQ09ERToKKwkJCWlmIChieXRlc19sZWZ0ID49IDcpIHsKKwkJCQlwYy0+d2lkdGggID0gKGJ1ZlswXSA8PCA0KSB8IChidWZbMV0gPj4gNCk7CisJCQkJcGMtPmhlaWdodCA9ICgoYnVmWzFdICYgMHgwZikgPDwgOCkgfCBidWZbMl07CisKKwkJCQlwaXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOworCQkJCWZyYW1lX3JhdGVfaW5kZXggPSBidWZbM10gJiAweGY7CisJCQkJcGMtPmZyYW1lX3JhdGUgPSBmZl9tcGVnMTJfZnJhbWVfcmF0ZV90YWJbZnJhbWVfcmF0ZV9pbmRleF07CisJCQkJYml0X3JhdGUgPSAoYnVmWzRdPDwxMCkgfCAoYnVmWzVdPDwyKSB8IChidWZbNl0+PjYpOworCQkJCXBjLT50aWNrc19wZXJfZnJhbWUgPSAxOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRVhUX1NUQVJUX0NPREU6CisJCQlpZiAoYnl0ZXNfbGVmdCA+PSAxKSB7CisJCQkJZXh0X3R5cGUgPSAoYnVmWzBdID4+IDQpOworCQkJCXN3aXRjaCAoZXh0X3R5cGUpIHsKKwkJCQljYXNlIDB4MTogLyogc2VxdWVuY2UgZXh0ZW5zaW9uICovCisJCQkJCWlmIChieXRlc19sZWZ0ID49IDYpIHsKKwkJCQkJCWhvcml6X3NpemVfZXh0ID0gKChidWZbMV0gJiAxKSA8PCAxKSB8IChidWZbMl0gPj4gNyk7CisJCQkJCQl2ZXJ0X3NpemVfZXh0ID0gKGJ1ZlsyXSA+PiA1KSAmIDM7CisJCQkJCQliaXRfcmF0ZV9leHQgPSAoKGJ1ZlsyXSAmIDB4MUYpPDw3KSB8IChidWZbM10+PjEpOworCQkJCQkJZnJhbWVfcmF0ZV9leHRfbiA9IChidWZbNV0gPj4gNSkgJiAzOworCQkJCQkJZnJhbWVfcmF0ZV9leHRfZCA9IChidWZbNV0gJiAweDFmKTsKKwkJCQkJCXBjLT5wcm9ncmVzc2l2ZV9zZXF1ZW5jZSA9IGJ1ZlsxXSAmICgxIDw8IDMpOworCQkJCQkJcGMtPmhhc19iX2ZyYW1lcz0gIShidWZbNV0gPj4gNyk7CisKKwkJCQkJCWNocm9tYV9mb3JtYXQgPSAoYnVmWzFdID4+IDEpICYgMzsKKwkJCQkJCXN3aXRjaCAoY2hyb21hX2Zvcm1hdCkgeworCQkJCQkJY2FzZSAxOiBwaXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOyBicmVhazsKKwkJCQkJCWNhc2UgMjogcGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIyUDsgYnJlYWs7CisJCQkJCQljYXNlIDM6IHBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFA7IGJyZWFrOworCQkJCQkJfQorCisJCQkJCQlwYy0+d2lkdGggID0gKHBjLT53aWR0aCAmIDB4RkZGKSB8IChob3Jpel9zaXplX2V4dCA8PCAxMik7CisJCQkJCQlwYy0+aGVpZ2h0ID0gKHBjLT5oZWlnaHQmIDB4RkZGKSB8ICggdmVydF9zaXplX2V4dCA8PCAxMik7CisJCQkJCQliaXRfcmF0ZSA9IChiaXRfcmF0ZSYweDNGRkZGKSB8IChiaXRfcmF0ZV9leHQgPDwgMTgpOworCQkJCQkJLy9pZihkaWRfc2V0X3NpemUpCisJCQkJCQkvL3NldF9kaW1fcmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIHBjLT53aWR0aCwgcGMtPmhlaWdodCk7CisJCQkJCQlwYy0+ZnJhbWVyYXRlLm51bSA9IHBjLT5mcmFtZV9yYXRlLm51bSAqIChmcmFtZV9yYXRlX2V4dF9uICsgMSk7CisJCQkJCQlwYy0+ZnJhbWVyYXRlLmRlbiA9IHBjLT5mcmFtZV9yYXRlLmRlbiAqIChmcmFtZV9yYXRlX2V4dF9kICsgMSk7CisJCQkJCQlwYy0+dGlja3NfcGVyX2ZyYW1lID0gMjsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIDB4ODogLyogcGljdHVyZSBjb2RpbmcgZXh0ZW5zaW9uICovCisJCQkJCWlmIChieXRlc19sZWZ0ID49IDUpIHsKKwkJCQkJCXRvcF9maWVsZF9maXJzdCA9IGJ1ZlszXSAmICgxIDw8IDcpOworCQkJCQkJcmVwZWF0X2ZpcnN0X2ZpZWxkID0gYnVmWzNdICYgKDEgPDwgMSk7CisJCQkJCQlwcm9ncmVzc2l2ZV9mcmFtZSA9IGJ1Zls0XSAmICgxIDw8IDcpOworCisJCQkJCQkvKiBjaGVjayBpZiB3ZSBtdXN0IHJlcGVhdCB0aGUgZnJhbWUgKi8KKwkJCQkJCXBjLT5yZXBlYXRfcGljdCA9IDE7CisJCQkJCQlpZiAocmVwZWF0X2ZpcnN0X2ZpZWxkKSB7CisJCQkJCQkJaWYgKHBjLT5wcm9ncmVzc2l2ZV9zZXF1ZW5jZSkgeworCQkJCQkJCQlpZiAodG9wX2ZpZWxkX2ZpcnN0KQorCQkJCQkJCQkJcGMtPnJlcGVhdF9waWN0ID0gNTsKKwkJCQkJCQkJZWxzZQorCQkJCQkJCQkJcGMtPnJlcGVhdF9waWN0ID0gMzsKKwkJCQkJCQl9IGVsc2UgaWYgKHByb2dyZXNzaXZlX2ZyYW1lKSB7CisJCQkJCQkJCXBjLT5yZXBlYXRfcGljdCA9IDI7CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQlpZiAoIXBjLT5wcm9ncmVzc2l2ZV9zZXF1ZW5jZSAmJiAhcHJvZ3Jlc3NpdmVfZnJhbWUpIHsKKwkJCQkJCQlpZiAodG9wX2ZpZWxkX2ZpcnN0KQorCQkJCQkJCQlwYy0+ZmllbGRfb3JkZXIgPSBBVl9GSUVMRF9UVDsKKwkJCQkJCQllbHNlCisJCQkJCQkJCXBjLT5maWVsZF9vcmRlciA9IEFWX0ZJRUxEX0JCOworCQkJCQkJfSBlbHNlCisJCQkJCQkJcGMtPmZpZWxkX29yZGVyID0gQVZfRklFTERfUFJPR1JFU1NJVkU7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgLTE6CisJCQlnb3RvIHRoZV9lbmQ7CisJCWRlZmF1bHQ6CisJCQkvKiB3ZSBzdG9wIHBhcnNpbmcgd2hlbiB3ZSBlbmNvdW50ZXIgYSBzbGljZS4gSXQgZW5zdXJlcworCQkJdGhhdCB0aGlzIGZ1bmN0aW9uIHRha2VzIGEgbmVnbGlnaWJsZSBhbW91bnQgb2YgdGltZSAqLworCQkJaWYgKHN0YXJ0X2NvZGUgPj0gU0xJQ0VfTUlOX1NUQVJUX0NPREUgJiYKKwkJCQlzdGFydF9jb2RlIDw9IFNMSUNFX01BWF9TVEFSVF9DT0RFKQorCQkJCWdvdG8gdGhlX2VuZDsKKwkJCWJyZWFrOworCQl9CisJfQordGhlX2VuZDoKKworCWlmIChwaXhfZm10ICE9IEFWX1BJWF9GTVRfTk9ORSkgeworCQlwYy0+Zm9ybWF0ID0gcGl4X2ZtdDsKKwkJcGMtPmNvZGVkX3dpZHRoICA9IEFMSUdOKHBjLT53aWR0aCwgIDE2KTsKKwkJcGMtPmNvZGVkX2hlaWdodCA9IEFMSUdOKHBjLT5oZWlnaHQsIDE2KTsKKwl9Cit9CisKK2ludCBtcGVnMTJfZGVjb2RlX2V4dHJhZGF0YV9wcyh1OCAqYnVmLCBpbnQgc2l6ZSwgc3RydWN0IG1wZWcxMl9wYXJhbV9zZXRzICpwcykKK3sKKwlwcy0+aGVhZF9wYXJzZWQgPSBmYWxzZTsKKworCW1wZWd2aWRlb19leHRyYWN0X2hlYWRlcnMoYnVmLCBzaXplLCBwcyk7CisKKwlpZiAocHMtPmRlY19wcy53aWR0aCAmJiBwcy0+ZGVjX3BzLmhlaWdodCkKKwkJcHMtPmhlYWRfcGFyc2VkID0gdHJ1ZTsKKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FtdmRlY19wb3J0cy9kZWNvZGVyL2FtbF9tcGVnMTJfcGFyc2VyLmggYi9kcml2ZXJzL2FtdmRlY19wb3J0cy9kZWNvZGVyL2FtbF9tcGVnMTJfcGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA2ZDYzMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2RlY29kZXIvYW1sX21wZWcxMl9wYXJzZXIuaApAQCAtMCwwICsxLDgxIEBACisjaWZuZGVmIEFNTF9NUEVHMTJfUEFSU0VSX0gKKyNkZWZpbmUgQU1MX01QRUcxMl9QQVJTRVJfSAorCisjaW5jbHVkZSAiLi4vYW1sX3Zjb2RlY19kcnYuaCIKKyNpbmNsdWRlICIuLi91dGlscy9jb21tb24uaCIKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9WNExfU09GVFdBUkVfUEFSU0VSCisjaW5jbHVkZSAiLi4vdXRpbHMvcGl4Zm10LmgiCisjZW5kaWYKKworLyogU3RhcnQgY29kZXMuICovCisjZGVmaW5lIFNFUV9FTkRfQ09ERSAgICAgICAgICAgIDB4MDAwMDAxYjcKKyNkZWZpbmUgU0VRX1NUQVJUX0NPREUgICAgICAgICAgMHgwMDAwMDFiMworI2RlZmluZSBHT1BfU1RBUlRfQ09ERSAgICAgICAgICAweDAwMDAwMWI4CisjZGVmaW5lIFBJQ1RVUkVfU1RBUlRfQ09ERSAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgU0xJQ0VfTUlOX1NUQVJUX0NPREUgICAgMHgwMDAwMDEwMQorI2RlZmluZSBTTElDRV9NQVhfU1RBUlRfQ09ERSAgICAweDAwMDAwMWFmCisjZGVmaW5lIEVYVF9TVEFSVF9DT0RFICAgICAgICAgIDB4MDAwMDAxYjUKKyNkZWZpbmUgVVNFUl9TVEFSVF9DT0RFICAgICAgICAgMHgwMDAwMDFiMgorI2RlZmluZSBTTElDRV9TVEFSVF9DT0RFICAgICAgICAweDAwMDAwMWI3CisKK2VudW0gQVZGaWVsZE9yZGVyIHsKKwlBVl9GSUVMRF9VTktOT1dOLAorCUFWX0ZJRUxEX1BST0dSRVNTSVZFLAorCUFWX0ZJRUxEX1RULCAgICAgICAgICAvLzwgVG9wIGNvZGVkX2ZpcnN0LCB0b3AgZGlzcGxheWVkIGZpcnN0CisJQVZfRklFTERfQkIsICAgICAgICAgIC8vPCBCb3R0b20gY29kZWQgZmlyc3QsIGJvdHRvbSBkaXNwbGF5ZWQgZmlyc3QKKwlBVl9GSUVMRF9UQiwgICAgICAgICAgLy88IFRvcCBjb2RlZCBmaXJzdCwgYm90dG9tIGRpc3BsYXllZCBmaXJzdAorCUFWX0ZJRUxEX0JULCAgICAgICAgICAvLzwgQm90dG9tIGNvZGVkIGZpcnN0LCB0b3AgZGlzcGxheWVkIGZpcnN0Cit9OworCitzdHJ1Y3QgTXB2UGFyc2VDb250ZXh0IHsKKwlzdHJ1Y3QgQVZSYXRpb25hbCBmcmFtZV9yYXRlOworCWludCBwcm9ncmVzc2l2ZV9zZXF1ZW5jZTsKKwlpbnQgd2lkdGgsIGhlaWdodDsKKworCWludCByZXBlYXRfcGljdDsgLyogWFhYOiBQdXQgaXQgYmFjayBpbiBBVkNvZGVjQ29udGV4dC4gKi8KKwlpbnQgcGljdF90eXBlOyAvKiBYWFg6IFB1dCBpdCBiYWNrIGluIEFWQ29kZWNDb250ZXh0LiAqLworCWVudW0gQVZGaWVsZE9yZGVyIGZpZWxkX29yZGVyOworCWludCBmb3JtYXQ7CisJLyoqCisJKiBEaW1lbnNpb25zIG9mIHRoZSBjb2RlZCB2aWRlby4KKwkqLworCWludCBjb2RlZF93aWR0aDsKKwlpbnQgY29kZWRfaGVpZ2h0OworCS8qKgorCSogRm9yIHNvbWUgY29kZWNzLCB0aGUgdGltZSBiYXNlIGlzIGNsb3NlciB0byB0aGUgZmllbGQgcmF0ZSB0aGFuIHRoZSBmcmFtZSByYXRlLgorCSogTW9zdCBub3RhYmx5LCBILjI2NCBhbmQgTVBFRy0yIHNwZWNpZnkgdGltZV9iYXNlIGFzIGhhbGYgb2YgZnJhbWUgZHVyYXRpb24KKwkqIGlmIG5vIHRlbGVjaW5lIGlzIHVzZWQgLi4uCisJKgorCSogU2V0IHRvIHRpbWVfYmFzZSB0aWNrcyBwZXIgZnJhbWUuIERlZmF1bHQgMSwgZS5nLiwgSC4yNjQvTVBFRy0yIHNldCBpdCB0byAyLgorCSovCisJaW50IHRpY2tzX3Blcl9mcmFtZTsKKwkvKioKKwkqIFNpemUgb2YgdGhlIGZyYW1lIHJlb3JkZXJpbmcgYnVmZmVyIGluIHRoZSBkZWNvZGVyLgorCSogRm9yIE1QRUctMiBpdCBpcyAxIElQQiBvciAwIGxvdyBkZWxheSBJUC4KKwkqIC0gZW5jb2Rpbmc6IFNldCBieSBsaWJhdmNvZGVjLgorCSogLSBkZWNvZGluZzogU2V0IGJ5IGxpYmF2Y29kZWMuCisJKi8KKwlpbnQgaGFzX2JfZnJhbWVzOworCS8qKgorCSogLSBkZWNvZGluZzogRm9yIGNvZGVjcyB0aGF0IHN0b3JlIGEgZnJhbWVyYXRlIHZhbHVlIGluIHRoZSBjb21wcmVzc2VkCisJKiAgICAgICAgICAgICBiaXRzdHJlYW0sIHRoZSBkZWNvZGVyIG1heSBleHBvcnQgaXQgaGVyZS4geyAwLCAxfSB3aGVuCisJKiAgICAgICAgICAgICB1bmtub3duLgorCSogLSBlbmNvZGluZzogTWF5IGJlIHVzZWQgdG8gc2lnbmFsIHRoZSBmcmFtZXJhdGUgb2YgQ0ZSIGNvbnRlbnQgdG8gYW4KKwkqICAgICAgICAgICAgIGVuY29kZXIuCisJKi8KKwlzdHJ1Y3QgQVZSYXRpb25hbCBmcmFtZXJhdGU7Cit9OworCitzdHJ1Y3QgbXBlZzEyX3BhcmFtX3NldHMgeworCWJvb2wgaGVhZF9wYXJzZWQ7CisJLyogY3VycmVudGx5IGFjdGl2ZSBwYXJhbWV0ZXIgc2V0cyAqLworCXN0cnVjdCBNcHZQYXJzZUNvbnRleHQgZGVjX3BzOworfTsKKworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX1Y0TF9TT0ZUV0FSRV9QQVJTRVIKK2ludCBtcGVnMTJfZGVjb2RlX2V4dHJhZGF0YV9wcyh1OCAqYnVmLCBpbnQgc2l6ZSwgc3RydWN0IG1wZWcxMl9wYXJhbV9zZXRzICpwcyk7CisjZWxzZQoraW5saW5lIGludCBtcGVnMTJfZGVjb2RlX2V4dHJhZGF0YV9wcyh1OCAqYnVmLCBpbnQgc2l6ZSwgc3RydWN0IG1wZWcxMl9wYXJhbV9zZXRzICpwcykgeyByZXR1cm4gLTE7IH0KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2RlY29kZXIvYW1sX21wZWc0X3BhcnNlci5jIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvZGVjb2Rlci9hbWxfbXBlZzRfcGFyc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM0N2MwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2RlY29kZXIvYW1sX21wZWc0X3BhcnNlci5jCkBAIC0wLDAgKzEsMTIzMSBAQAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlICJhbWxfbXBlZzRfcGFyc2VyLmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICIuLi91dGlscy9wdXRfYml0cy5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2dvbG9tYi5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2NvbW1vbi5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKK2NvbnN0IHU4IGZmX21wZWc0X2RjX3RocmVzaG9sZFs4XT17CisgICAgOTksIDEzLCAxNSwgMTcsIDE5LCAyMSwgMjMsIDAKK307CisKKy8qIHRoZXNlIG1hdHJpeGVzIHdpbGwgYmUgcGVybXV0ZWQgZm9yIHRoZSBpZGN0ICovCitjb25zdCBpbnQxNl90IGZmX21wZWc0X2RlZmF1bHRfaW50cmFfbWF0cml4WzY0XSA9IHsKKwkgOCwgMTcsIDE4LCAxOSwgMjEsIDIzLCAyNSwgMjcsCisJMTcsIDE4LCAxOSwgMjEsIDIzLCAyNSwgMjcsIDI4LAorCTIwLCAyMSwgMjIsIDIzLCAyNCwgMjYsIDI4LCAzMCwKKwkyMSwgMjIsIDIzLCAyNCwgMjYsIDI4LCAzMCwgMzIsCisJMjIsIDIzLCAyNCwgMjYsIDI4LCAzMCwgMzIsIDM1LAorCTIzLCAyNCwgMjYsIDI4LCAzMCwgMzIsIDM1LCAzOCwKKwkyNSwgMjYsIDI4LCAzMCwgMzIsIDM1LCAzOCwgNDEsCisJMjcsIDI4LCAzMCwgMzIsIDM1LCAzOCwgNDEsIDQ1LAorfTsKKworY29uc3QgaW50MTZfdCBmZl9tcGVnNF9kZWZhdWx0X25vbl9pbnRyYV9tYXRyaXhbNjRdID0geworCTE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywKKwkxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsCisJMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LAorCTE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI2LCAyNywKKwkyMCwgMjEsIDIyLCAyMywgMjUsIDI2LCAyNywgMjgsCisJMjEsIDIyLCAyMywgMjQsIDI2LCAyNywgMjgsIDMwLAorCTIyLCAyMywgMjQsIDI2LCAyNywgMjgsIDMwLCAzMSwKKwkyMywgMjQsIDI1LCAyNywgMjgsIDMwLCAzMSwgMzMsCit9OworCitjb25zdCBzdHJ1Y3QgQVZSYXRpb25hbCBmZl9oMjYzX3BpeGVsX2FzcGVjdFsxNl0gPSB7CisJeyAgMCwgIDEgfSwKKwl7ICAxLCAgMSB9LAorCXsgMTIsIDExIH0sCisJeyAxMCwgMTEgfSwKKwl7IDE2LCAxMSB9LAorCXsgNDAsIDMzIH0sCisJeyAgMCwgIDEgfSwKKwl7ICAwLCAgMSB9LAorCXsgIDAsICAxIH0sCisJeyAgMCwgIDEgfSwKKwl7ICAwLCAgMSB9LAorCXsgIDAsICAxIH0sCisJeyAgMCwgIDEgfSwKKwl7ICAwLCAgMSB9LAorCXsgIDAsICAxIH0sCisJeyAgMCwgIDEgfSwKK307CisKKy8qIEFzIHBlciBzcGVjLCBzdHVkaW8gc3RhcnQgY29kZSBzZWFyY2ggaXNuJ3QgdGhlIHNhbWUgYXMgdGhlIG9sZCB0eXBlIG9mIHN0YXJ0IGNvZGUgKi8KK3N0YXRpYyB2b2lkIG5leHRfc3RhcnRfY29kZV9zdHVkaW8oc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKmdiKQoreworCWFsaWduX2dldF9iaXRzKGdiKTsKKworCXdoaWxlIChnZXRfYml0c19sZWZ0KGdiKSA+PSAyNCAmJiBzaG93X2JpdHNfbG9uZyhnYiwgMjQpICE9IDB4MSkgeworCQlnZXRfYml0cyhnYiwgOCk7CisJfQorfQorCitzdGF0aWMgaW50IHJlYWRfcXVhbnRfbWF0cml4X2V4dChzdHJ1Y3QgTXBlZ0VuY0NvbnRleHQgKnMsIHN0cnVjdCBnZXRfYml0c19jb250ZXh0ICpnYikKK3sKKwlpbnQgaSwgLypqLCovIHY7CisKKwlpZiAoZ2V0X2JpdHMxKGdiKSkgeworCQlpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCA2NCo4KQorCQkJcmV0dXJuIC0xOworCQkvKiBpbnRyYV9xdWFudGlzZXJfbWF0cml4ICovCisJCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisJCQl2ID0gZ2V0X2JpdHMoZ2IsIDgpOworCQkJLy9qID0gcy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uW2ZmX3ppZ3phZ19kaXJlY3RbaV1dOworCQkJLy9zLT5pbnRyYV9tYXRyaXhbal0gICAgICAgID0gdjsKKwkJCS8vcy0+Y2hyb21hX2ludHJhX21hdHJpeFtqXSA9IHY7CisJCX0KKwl9CisKKwlpZiAoZ2V0X2JpdHMxKGdiKSkgeworCQlpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCA2NCo4KQorCQkJcmV0dXJuIC0xOworCQkvKiBub25faW50cmFfcXVhbnRpc2VyX21hdHJpeCAqLworCQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworCQkJZ2V0X2JpdHMoZ2IsIDgpOworCQl9CisJfQorCisJaWYgKGdldF9iaXRzMShnYikpIHsKKwkJaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgNjQqOCkKKwkJCXJldHVybiAtMTsKKwkJLyogY2hyb21hX2ludHJhX3F1YW50aXNlcl9tYXRyaXggKi8KKwkJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKwkJCXYgPSBnZXRfYml0cyhnYiwgOCk7CisJCQkvL2ogPSBzLT5pZHNwLmlkY3RfcGVybXV0YXRpb25bZmZfemlnemFnX2RpcmVjdFtpXV07CisJCQkvL3MtPmNocm9tYV9pbnRyYV9tYXRyaXhbal0gPSB2OworCQl9CisJfQorCisJaWYgKGdldF9iaXRzMShnYikpIHsKKwkJaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgNjQqOCkKKwkJCXJldHVybiAtMTsKKwkJLyogY2hyb21hX25vbl9pbnRyYV9xdWFudGlzZXJfbWF0cml4ICovCisJCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisJCQlnZXRfYml0cyhnYiwgOCk7CisJCX0KKwl9CisKKwluZXh0X3N0YXJ0X2NvZGVfc3R1ZGlvKGdiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZXh0ZW5zaW9uX2FuZF91c2VyX2RhdGEoc3RydWN0IE1wZWdFbmNDb250ZXh0ICpzLCBzdHJ1Y3QgZ2V0X2JpdHNfY29udGV4dCAqZ2IsIGludCBpZCkKK3sKKwl1MzIgc3RhcnRjb2RlOworCXU4IGV4dGVuc2lvbl90eXBlOworCisJc3RhcnRjb2RlID0gc2hvd19iaXRzX2xvbmcoZ2IsIDMyKTsKKwlpZiAoc3RhcnRjb2RlID09IFVTRVJfREFUQV9TVEFSVENPREUgfHwgc3RhcnRjb2RlID09IEVYVF9TVEFSVENPREUpIHsKKwkJaWYgKChpZCA9PSAyIHx8IGlkID09IDQpICYmIHN0YXJ0Y29kZSA9PSBFWFRfU1RBUlRDT0RFKSB7CisJCQlza2lwX2JpdHNfbG9uZyhnYiwgMzIpOworCQkJZXh0ZW5zaW9uX3R5cGUgPSBnZXRfYml0cyhnYiwgNCk7CisJCQlpZiAoZXh0ZW5zaW9uX3R5cGUgPT0gUVVBTlRfTUFUUklYX0VYVF9JRCkKKwkJCQlyZWFkX3F1YW50X21hdHJpeF9leHQocywgZ2IpOworCQl9CisJfQorfQorCisKK3N0YXRpYyBpbnQgZGVjb2RlX3N0dWRpb192b2xfaGVhZGVyKHN0cnVjdCBtcGVnNF9kZWNfcGFyYW0gKmN0eCwgc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKmdiKQoreworCXN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcyA9ICZjdHgtPm07CisJaW50IHdpZHRoLCBoZWlnaHQ7CisJaW50IGJpdHNfcGVyX3Jhd19zYW1wbGU7CisKKwkvLyByYW5kb21fYWNjZXNzaWJsZV92b2wgYW5kIHZpZGVvX29iamVjdF90eXBlX2luZGljYXRpb24gaGF2ZSBhbHJlYWR5CisJLy8gYmVlbiByZWFkIGJ5IHRoZSBjYWxsZXIgZGVjb2RlX3ZvbF9oZWFkZXIoKQorCXNraXBfYml0cyhnYiwgNCk7IC8qIHZpZGVvX29iamVjdF9sYXllcl92ZXJpZCAqLworCWN0eC0+c2hhcGUgPSBnZXRfYml0cyhnYiwgMik7IC8qIHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSAqLworCXNraXBfYml0cyhnYiwgNCk7IC8qIHZpZGVvX29iamVjdF9sYXllcl9zaGFwZV9leHRlbnNpb24gKi8KKwlza2lwX2JpdHMxKGdiKTsgLyogcHJvZ3Jlc3NpdmVfc2VxdWVuY2UgKi8KKwlpZiAoY3R4LT5zaGFwZSAhPSBCSU5fT05MWV9TSEFQRSkgeworCQljdHgtPnJnYiA9IGdldF9iaXRzMShnYik7IC8qIHJnYl9jb21wb25lbnRzICovCisJCXMtPmNocm9tYV9mb3JtYXQgPSBnZXRfYml0cyhnYiwgMik7IC8qIGNocm9tYV9mb3JtYXQgKi8KKwkJaWYgKCFzLT5jaHJvbWFfZm9ybWF0KSB7CisJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgImlsbGVnYWwgY2hyb21hIGZvcm1hdFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQliaXRzX3Blcl9yYXdfc2FtcGxlID0gZ2V0X2JpdHMoZ2IsIDQpOyAvKiBiaXRfZGVwdGggKi8KKwkJaWYgKGJpdHNfcGVyX3Jhd19zYW1wbGUgPT0gMTApIHsKKwkJCWlmIChjdHgtPnJnYikgeworCQkJCWN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR0JSUDEwOworCQkJfSBlbHNlIHsKKwkJCQljdHgtPnBpeF9mbXQgPSBzLT5jaHJvbWFfZm9ybWF0ID09IENIUk9NQV80MjIgPyBBVl9QSVhfRk1UX1lVVjQyMlAxMCA6IEFWX1BJWF9GTVRfWVVWNDQ0UDEwOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJNUEVHLTQgU3R1ZGlvIHByb2ZpbGUgYml0LWRlcHRoICV1IiwgYml0c19wZXJfcmF3X3NhbXBsZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJY3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gYml0c19wZXJfcmF3X3NhbXBsZTsKKwl9CisJaWYgKGN0eC0+c2hhcGUgPT0gUkVDVF9TSEFQRSkgeworCQljaGVja19tYXJrZXIoZ2IsICJiZWZvcmUgdmlkZW9fb2JqZWN0X2xheWVyX3dpZHRoIik7CisJCXdpZHRoID0gZ2V0X2JpdHMoZ2IsIDE0KTsgLyogdmlkZW9fb2JqZWN0X2xheWVyX3dpZHRoICovCisJCWNoZWNrX21hcmtlcihnYiwgImJlZm9yZSB2aWRlb19vYmplY3RfbGF5ZXJfaGVpZ2h0Iik7CisJCWhlaWdodCA9IGdldF9iaXRzKGdiLCAxNCk7IC8qIHZpZGVvX29iamVjdF9sYXllcl9oZWlnaHQgKi8KKwkJY2hlY2tfbWFya2VyKGdiLCAiYWZ0ZXIgdmlkZW9fb2JqZWN0X2xheWVyX2hlaWdodCIpOworCisJCS8qIERvIHRoZSBzYW1lIGNoZWNrIGFzIG5vbi1zdHVkaW8gcHJvZmlsZSAqLworCQlpZiAod2lkdGggJiYgaGVpZ2h0KSB7CisJCQlpZiAocy0+d2lkdGggJiYgcy0+aGVpZ2h0ICYmCisJCQkJKHMtPndpZHRoICE9IHdpZHRoIHx8IHMtPmhlaWdodCAhPSBoZWlnaHQpKQorCQkJCXMtPmNvbnRleHRfcmVpbml0ID0gMTsKKwkJCXMtPndpZHRoICA9IHdpZHRoOworCQkJcy0+aGVpZ2h0ID0gaGVpZ2h0OworCQl9CisJfQorCXMtPmFzcGVjdF9yYXRpb19pbmZvID0gZ2V0X2JpdHMoZ2IsIDQpOworCWlmIChzLT5hc3BlY3RfcmF0aW9faW5mbyA9PSBGRl9BU1BFQ1RfRVhURU5ERUQpIHsKKwkJY3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSA9IGdldF9iaXRzKGdiLCA4KTsgIC8vIHBhcl93aWR0aAorCQljdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuID0gZ2V0X2JpdHMoZ2IsIDgpOyAgLy8gcGFyX2hlaWdodAorCX0gZWxzZSB7CisJCWN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGZmX2gyNjNfcGl4ZWxfYXNwZWN0W3MtPmFzcGVjdF9yYXRpb19pbmZvXTsKKwl9CisJc2tpcF9iaXRzKGdiLCA0KTsgLyogZnJhbWVfcmF0ZV9jb2RlICovCisJc2tpcF9iaXRzKGdiLCAxNSk7IC8qIGZpcnN0X2hhbGZfYml0X3JhdGUgKi8KKwljaGVja19tYXJrZXIoZ2IsICJhZnRlciBmaXJzdF9oYWxmX2JpdF9yYXRlIik7CisJc2tpcF9iaXRzKGdiLCAxNSk7IC8qIGxhdHRlcl9oYWxmX2JpdF9yYXRlICovCisJY2hlY2tfbWFya2VyKGdiLCAiYWZ0ZXIgbGF0dGVyX2hhbGZfYml0X3JhdGUiKTsKKwlza2lwX2JpdHMoZ2IsIDE1KTsgLyogZmlyc3RfaGFsZl92YnZfYnVmZmVyX3NpemUgKi8KKwljaGVja19tYXJrZXIoZ2IsICJhZnRlciBmaXJzdF9oYWxmX3Zidl9idWZmZXJfc2l6ZSIpOworCXNraXBfYml0cyhnYiwgMyk7IC8qIGxhdHRlcl9oYWxmX3Zidl9idWZmZXJfc2l6ZSAqLworCXNraXBfYml0cyhnYiwgMTEpOyAvKiBmaXJzdF9oYWxmX3Zidl9idWZmZXJfc2l6ZSAqLworCWNoZWNrX21hcmtlcihnYiwgImFmdGVyIGZpcnN0X2hhbGZfdmJ2X2J1ZmZlcl9zaXplIik7CisJc2tpcF9iaXRzKGdiLCAxNSk7IC8qIGxhdHRlcl9oYWxmX3Zidl9vY2N1cGFuY3kgKi8KKwljaGVja19tYXJrZXIoZ2IsICJhZnRlciBsYXR0ZXJfaGFsZl92YnZfb2NjdXBhbmN5Iik7CisJcy0+bG93X2RlbGF5ID0gZ2V0X2JpdHMxKGdiKTsKKwlzLT5tcGVnX3F1YW50ID0gZ2V0X2JpdHMxKGdiKTsgLyogbXBlZzJfc3RyZWFtICovCisKKwluZXh0X3N0YXJ0X2NvZGVfc3R1ZGlvKGdiKTsKKwlleHRlbnNpb25fYW5kX3VzZXJfZGF0YShzLCBnYiwgMik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfdm9sX2hlYWRlcihzdHJ1Y3QgbXBlZzRfZGVjX3BhcmFtICpjdHgsIHN0cnVjdCBnZXRfYml0c19jb250ZXh0ICpnYikKK3sKKwlzdHJ1Y3QgTXBlZ0VuY0NvbnRleHQgKnMgPSAmY3R4LT5tOworCWludCB3aWR0aCwgaGVpZ2h0LCB2b192ZXJfaWQ7CisKKwkvKiB2b2wgaGVhZGVyICovCisJc2tpcF9iaXRzKGdiLCAxKTsgICAgICAgICAgICAgICAgICAgLyogcmFuZG9tIGFjY2VzcyAqLworCXMtPnZvX3R5cGUgPSBnZXRfYml0cyhnYiwgOCk7CisKKwkvKiBJZiB3ZSBhcmUgaW4gc3R1ZGlvIHByb2ZpbGUgKHBlciB2b190eXBlKSwgY2hlY2sgaWYgaXRzIGFsbCBjb25zaXN0ZW50CisJKiBhbmQgaWYgc28gY29udGludWUgcGFzcyBjb250cm9sIHRvIGRlY29kZV9zdHVkaW9fdm9sX2hlYWRlcigpLgorCSogZWxJZiBzb21ldGhpbmcgaXMgaW5jb25zaXN0ZW50LCBlcnJvciBvdXQKKwkqIGVsc2UgY29udGludWUgd2l0aCAobm9uIHN0dWRpbykgdm9sIGhlYWRlciBkZWNwb2RpbmcuCisJKi8KKwlpZiAocy0+dm9fdHlwZSA9PSBDT1JFX1NUVURJT19WT19UWVBFIHx8CisJCXMtPnZvX3R5cGUgPT0gU0lNUExFX1NUVURJT19WT19UWVBFKSB7CisJCWlmIChjdHgtPnByb2ZpbGUgIT0gRkZfUFJPRklMRV9VTktOT1dOICYmIGN0eC0+cHJvZmlsZSAhPSBGRl9QUk9GSUxFX01QRUc0X1NJTVBMRV9TVFVESU8pCisJCQlyZXR1cm4gLTE7CisJCXMtPnN0dWRpb19wcm9maWxlID0gMTsKKwkJY3R4LT5wcm9maWxlID0gRkZfUFJPRklMRV9NUEVHNF9TSU1QTEVfU1RVRElPOworCQlyZXR1cm4gZGVjb2RlX3N0dWRpb192b2xfaGVhZGVyKGN0eCwgZ2IpOworCX0gZWxzZSBpZiAocy0+c3R1ZGlvX3Byb2ZpbGUpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChnZXRfYml0czEoZ2IpICE9IDApIHsgICAgICAgICAgIC8qIGlzX29sX2lkICovCisJCXZvX3Zlcl9pZCA9IGdldF9iaXRzKGdiLCA0KTsgICAgLyogdm9fdmVyX2lkICovCisJCXNraXBfYml0cyhnYiwgMyk7ICAgICAgICAgICAgICAgLyogdm9fcHJpb3JpdHkgKi8KKwl9IGVsc2UgeworCQl2b192ZXJfaWQgPSAxOworCX0KKwlzLT5hc3BlY3RfcmF0aW9faW5mbyA9IGdldF9iaXRzKGdiLCA0KTsKKwlpZiAocy0+YXNwZWN0X3JhdGlvX2luZm8gPT0gRkZfQVNQRUNUX0VYVEVOREVEKSB7CisJCWN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPSBnZXRfYml0cyhnYiwgOCk7ICAvLyBwYXJfd2lkdGgKKwkJY3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiA9IGdldF9iaXRzKGdiLCA4KTsgIC8vIHBhcl9oZWlnaHQKKwl9IGVsc2UgeworCQljdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBmZl9oMjYzX3BpeGVsX2FzcGVjdFtzLT5hc3BlY3RfcmF0aW9faW5mb107CisJfQorCisJaWYgKChjdHgtPnZvbF9jb250cm9sX3BhcmFtZXRlcnMgPSBnZXRfYml0czEoZ2IpKSkgeyAvKiB2b2wgY29udHJvbCBwYXJhbWV0ZXIgKi8KKwkJaW50IGNocm9tYV9mb3JtYXQgPSBnZXRfYml0cyhnYiwgMik7CisJCWlmIChjaHJvbWFfZm9ybWF0ICE9IENIUk9NQV80MjApCisJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgImlsbGVnYWwgY2hyb21hIGZvcm1hdFxuIik7CisKKwkJcy0+bG93X2RlbGF5ID0gZ2V0X2JpdHMxKGdiKTsKKwkJaWYgKGdldF9iaXRzMShnYikpIHsgICAgLyogdmJ2IHBhcmFtZXRlcnMgKi8KKwkJCWdldF9iaXRzKGdiLCAxNSk7ICAgLyogZmlyc3RfaGFsZl9iaXRyYXRlICovCisJCQljaGVja19tYXJrZXIoZ2IsICJhZnRlciBmaXJzdF9oYWxmX2JpdHJhdGUiKTsKKwkJCWdldF9iaXRzKGdiLCAxNSk7ICAgLyogbGF0dGVyX2hhbGZfYml0cmF0ZSAqLworCQkJY2hlY2tfbWFya2VyKGdiLCAiYWZ0ZXIgbGF0dGVyX2hhbGZfYml0cmF0ZSIpOworCQkJZ2V0X2JpdHMoZ2IsIDE1KTsgICAvKiBmaXJzdF9oYWxmX3Zidl9idWZmZXJfc2l6ZSAqLworCQkJY2hlY2tfbWFya2VyKGdiLCAiYWZ0ZXIgZmlyc3RfaGFsZl92YnZfYnVmZmVyX3NpemUiKTsKKwkJCWdldF9iaXRzKGdiLCAzKTsgICAgLyogbGF0dGVyX2hhbGZfdmJ2X2J1ZmZlcl9zaXplICovCisJCQlnZXRfYml0cyhnYiwgMTEpOyAgIC8qIGZpcnN0X2hhbGZfdmJ2X29jY3VwYW5jeSAqLworCQkJY2hlY2tfbWFya2VyKGdiLCAiYWZ0ZXIgZmlyc3RfaGFsZl92YnZfb2NjdXBhbmN5Iik7CisJCQlnZXRfYml0cyhnYiwgMTUpOyAgIC8qIGxhdHRlcl9oYWxmX3Zidl9vY2N1cGFuY3kgKi8KKwkJCWNoZWNrX21hcmtlcihnYiwgImFmdGVyIGxhdHRlcl9oYWxmX3Zidl9vY2N1cGFuY3kiKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIGlzIHNldHRpbmcgbG93IGRlbGF5IGZsYWcgb25seSBvbmNlIHRoZSBzbWFydGVzdCB0aGluZyB0byBkbz8KKwkJKiBsb3cgZGVsYXkgZGV0ZWN0aW9uIHdpbGwgbm90IGJlIG92ZXJyaWRkZW4uICovCisJCWlmIChzLT5waWN0dXJlX251bWJlciA9PSAwKSB7CisJCQlzd2l0Y2ggKHMtPnZvX3R5cGUpIHsKKwkJCWNhc2UgU0lNUExFX1ZPX1RZUEU6CisJCQljYXNlIEFEVl9TSU1QTEVfVk9fVFlQRToKKwkJCQlzLT5sb3dfZGVsYXkgPSAxOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlzLT5sb3dfZGVsYXkgPSAwOworCQkJfQorCQl9CisJfQorCisJY3R4LT5zaGFwZSA9IGdldF9iaXRzKGdiLCAyKTsgLyogdm9sIHNoYXBlICovCisJaWYgKGN0eC0+c2hhcGUgIT0gUkVDVF9TSEFQRSkKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJvbmx5IHJlY3Rhbmd1bGFyIHZvbCBzdXBwb3J0ZWRcbiIpOworCWlmIChjdHgtPnNoYXBlID09IEdSQVlfU0hBUEUgJiYgdm9fdmVyX2lkICE9IDEpIHsKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJHcmF5IHNoYXBlIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlza2lwX2JpdHMoZ2IsIDQpOyAgLyogdmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlX2V4dGVuc2lvbiAqLworCX0KKworCWNoZWNrX21hcmtlcihnYiwgImJlZm9yZSB0aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uIik7CisKKwljdHgtPmZyYW1lcmF0ZS5udW0gPSBnZXRfYml0cyhnYiwgMTYpOworCWlmICghY3R4LT5mcmFtZXJhdGUubnVtKSB7CisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAiZnJhbWVyYXRlPT0wXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWN0eC0+dGltZV9pbmNyZW1lbnRfYml0cyA9IGF2X2xvZzIoY3R4LT5mcmFtZXJhdGUubnVtIC0gMSkgKyAxOworCWlmIChjdHgtPnRpbWVfaW5jcmVtZW50X2JpdHMgPCAxKQorCQljdHgtPnRpbWVfaW5jcmVtZW50X2JpdHMgPSAxOworCisJY2hlY2tfbWFya2VyKGdiLCAiYmVmb3JlIGZpeGVkX3ZvcF9yYXRlIik7CisKKwlpZiAoZ2V0X2JpdHMxKGdiKSAhPSAwKSAgICAgLyogZml4ZWRfdm9wX3JhdGUgICovCisJCWN0eC0+ZnJhbWVyYXRlLmRlbiA9IGdldF9iaXRzKGdiLCBjdHgtPnRpbWVfaW5jcmVtZW50X2JpdHMpOworCWVsc2UKKwkJY3R4LT5mcmFtZXJhdGUuZGVuID0gMTsKKworCS8vY3R4LT50aW1lX2Jhc2UgPSBhdl9pbnZfcShhdl9tdWxfcShjdHgtPmZyYW1lcmF0ZSwgKEFWUmF0aW9uYWwpe2N0eC0+dGlja3NfcGVyX2ZyYW1lLCAxfSkpOworCisJY3R4LT50X2ZyYW1lID0gMDsKKworCWlmIChjdHgtPnNoYXBlICE9IEJJTl9PTkxZX1NIQVBFKSB7CisJCWlmIChjdHgtPnNoYXBlID09IFJFQ1RfU0hBUEUpIHsKKwkJCWNoZWNrX21hcmtlcihnYiwgImJlZm9yZSB3aWR0aCIpOworCQkJd2lkdGggPSBnZXRfYml0cyhnYiwgMTMpOworCQkJY2hlY2tfbWFya2VyKGdiLCAiYmVmb3JlIGhlaWdodCIpOworCQkJaGVpZ2h0ID0gZ2V0X2JpdHMoZ2IsIDEzKTsKKwkJCWNoZWNrX21hcmtlcihnYiwgImFmdGVyIGhlaWdodCIpOworCQkJaWYgKHdpZHRoICYmIGhlaWdodCAmJiAgLyogdGhleSBzaG91bGQgYmUgbm9uIHplcm8gYnV0IHdobyBrbm93cyAqLworCQkJIShzLT53aWR0aCAmJiBzLT5jb2RlY190YWcgPT0gQVZfUkwzMigiTVA0UyIpKSkgeworCQkJCWlmIChzLT53aWR0aCAmJiBzLT5oZWlnaHQgJiYKKwkJCQkocy0+d2lkdGggIT0gd2lkdGggfHwgcy0+aGVpZ2h0ICE9IGhlaWdodCkpCisJCQkJcy0+Y29udGV4dF9yZWluaXQgPSAxOworCQkJCXMtPndpZHRoICA9IHdpZHRoOworCQkJCXMtPmhlaWdodCA9IGhlaWdodDsKKwkJCX0KKwkJfQorCisJCXMtPnByb2dyZXNzaXZlX3NlcXVlbmNlICA9CisJCXMtPnByb2dyZXNzaXZlX2ZyYW1lICAgICA9IGdldF9iaXRzMShnYikgXiAxOworCQlzLT5pbnRlcmxhY2VkX2RjdCAgICAgICAgPSAwOworCQlpZiAoIWdldF9iaXRzMShnYikpIC8qIE9CTUMgRGlzYWJsZSAqLworCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLCAiTVBFRy00IE9CTUMgbm90IHN1cHBvcnRlZCAodmVyeSBsaWtlbHkgYnVnZ3kgZW5jb2RlcilcbiIpOworCQlpZiAodm9fdmVyX2lkID09IDEpCisJCQljdHgtPnZvbF9zcHJpdGVfdXNhZ2UgPSBnZXRfYml0czEoZ2IpOyAgICAvKiB2b2xfc3ByaXRlX3VzYWdlICovCisJCWVsc2UKKwkJCWN0eC0+dm9sX3Nwcml0ZV91c2FnZSA9IGdldF9iaXRzKGdiLCAyKTsgIC8qIHZvbF9zcHJpdGVfdXNhZ2UgKi8KKworCQlpZiAoY3R4LT52b2xfc3ByaXRlX3VzYWdlID09IFNUQVRJQ19TUFJJVEUpCisJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsICJTdGF0aWMgU3ByaXRlcyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJaWYgKGN0eC0+dm9sX3Nwcml0ZV91c2FnZSA9PSBTVEFUSUNfU1BSSVRFIHx8CisJCQljdHgtPnZvbF9zcHJpdGVfdXNhZ2UgPT0gR01DX1NQUklURSkgeworCQlpZiAoY3R4LT52b2xfc3ByaXRlX3VzYWdlID09IFNUQVRJQ19TUFJJVEUpIHsKKwkJCXNraXBfYml0cyhnYiwgMTMpOyAvLyBzcHJpdGVfd2lkdGgKKwkJCWNoZWNrX21hcmtlcihnYiwgImFmdGVyIHNwcml0ZV93aWR0aCIpOworCQkJc2tpcF9iaXRzKGdiLCAxMyk7IC8vIHNwcml0ZV9oZWlnaHQKKwkJCWNoZWNrX21hcmtlcihnYiwgImFmdGVyIHNwcml0ZV9oZWlnaHQiKTsKKwkJCXNraXBfYml0cyhnYiwgMTMpOyAvLyBzcHJpdGVfbGVmdAorCQkJY2hlY2tfbWFya2VyKGdiLCAiYWZ0ZXIgc3ByaXRlX2xlZnQiKTsKKwkJCXNraXBfYml0cyhnYiwgMTMpOyAvLyBzcHJpdGVfdG9wCisJCQljaGVja19tYXJrZXIoZ2IsICJhZnRlciBzcHJpdGVfdG9wIik7CisJCX0KKwkJY3R4LT5udW1fc3ByaXRlX3dhcnBpbmdfcG9pbnRzID0gZ2V0X2JpdHMoZ2IsIDYpOworCQlpZiAoY3R4LT5udW1fc3ByaXRlX3dhcnBpbmdfcG9pbnRzID4gMykgeworCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICIlZCBzcHJpdGVfd2FycGluZ19wb2ludHNcbiIsCisJCQkJY3R4LT5udW1fc3ByaXRlX3dhcnBpbmdfcG9pbnRzKTsKKwkJCWN0eC0+bnVtX3Nwcml0ZV93YXJwaW5nX3BvaW50cyA9IDA7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJcy0+c3ByaXRlX3dhcnBpbmdfYWNjdXJhY3kgID0gZ2V0X2JpdHMoZ2IsIDIpOworCQljdHgtPnNwcml0ZV9icmlnaHRuZXNzX2NoYW5nZSA9IGdldF9iaXRzMShnYik7CisJCWlmIChjdHgtPnZvbF9zcHJpdGVfdXNhZ2UgPT0gU1RBVElDX1NQUklURSkKKwkJCXNraXBfYml0czEoZ2IpOyAvLyBsb3dfbGF0ZW5jeV9zcHJpdGUKKwkJfQorCQkvLyBGSVhNRSBzYWRjdCBkaXNhYmxlIGJpdCBpZiB2ZXJpZCE9MSAmJiBzaGFwZSBub3QgcmVjdAorCisJCWlmIChnZXRfYml0czEoZ2IpID09IDEpIHsgICAgICAgICAgICAgICAgICAgLyogbm90XzhfYml0ICovCisJCQkJcy0+cXVhbnRfcHJlY2lzaW9uID0gZ2V0X2JpdHMoZ2IsIDQpOyAgIC8qIHF1YW50X3ByZWNpc2lvbiAqLworCQkJaWYgKGdldF9iaXRzKGdiLCA0KSAhPSA4KSAgICAgICAgICAgICAgIC8qIGJpdHNfcGVyX3BpeGVsICovCisJCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJOLWJpdCBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJCWlmIChzLT5xdWFudF9wcmVjaXNpb24gIT0gNSkKKwkJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgInF1YW50IHByZWNpc2lvbiAlZFxuIiwgcy0+cXVhbnRfcHJlY2lzaW9uKTsKKwkJCWlmIChzLT5xdWFudF9wcmVjaXNpb248MyB8fCBzLT5xdWFudF9wcmVjaXNpb24+OSkgeworCQkJCXMtPnF1YW50X3ByZWNpc2lvbiA9IDU7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzLT5xdWFudF9wcmVjaXNpb24gPSA1OworCQl9CisKKwkJLy8gRklYTUUgYSBidW5jaCBvZiBncmF5c2NhbGUgc2hhcGUgdGhpbmdzCisKKwkJaWYgKChzLT5tcGVnX3F1YW50ID0gZ2V0X2JpdHMxKGdiKSkpIHsgLyogdm9sX3F1YW50X3R5cGUgKi8KKwkJCWludCBpLCB2OworCisJCQkvL21wZWc0X2xvYWRfZGVmYXVsdF9tYXRyaWNlcyhzKTsKKworCQkJLyogbG9hZCBjdXN0b20gaW50cmEgbWF0cml4ICovCisJCQlpZiAoZ2V0X2JpdHMxKGdiKSkgeworCQkJCWludCBsYXN0ID0gMDsKKwkJCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisJCQkJLy9pbnQgajsKKwkJCQlpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCA4KSB7CisJCQkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAiaW5zdWZmaWNpZW50IGRhdGEgZm9yIGN1c3RvbSBtYXRyaXhcbiIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCXYgPSBnZXRfYml0cyhnYiwgOCk7CisJCQkJaWYgKHYgPT0gMCkKKwkJCQkJYnJlYWs7CisKKwkJCQlsYXN0ID0gdjsKKwkJCQkvL2ogPSBzLT5pZHNwLmlkY3RfcGVybXV0YXRpb25bZmZfemlnemFnX2RpcmVjdFtpXV07CisJCQkJLy9zLT5pbnRyYV9tYXRyaXhbal0gICAgICAgID0gbGFzdDsKKwkJCQkvL3MtPmNocm9tYV9pbnRyYV9tYXRyaXhbal0gPSBsYXN0OworCQkJfQorCisJCQkvKiByZXBsaWNhdGUgbGFzdCB2YWx1ZSAqLworCQkJLy9mb3IgKDsgaSA8IDY0OyBpKyspIHsKKwkJCQkvL2ludCBqID0gcy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uW2ZmX3ppZ3phZ19kaXJlY3RbaV1dOworCQkJCS8vcy0+aW50cmFfbWF0cml4W2pdICAgICAgICA9IGxhc3Q7CisJCQkJLy9zLT5jaHJvbWFfaW50cmFfbWF0cml4W2pdID0gbGFzdDsKKwkJCS8vfQorCQkJfQorCisJCQkvKiBsb2FkIGN1c3RvbSBub24gaW50cmEgbWF0cml4ICovCisJCQlpZiAoZ2V0X2JpdHMxKGdiKSkgeworCQkJCWludCBsYXN0ID0gMDsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworCQkJCQkvL2ludCBqOworCQkJCQlpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCA4KSB7CisJCQkJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgImluc3VmZmljaWVudCBkYXRhIGZvciBjdXN0b20gbWF0cml4XG4iKTsKKwkJCQkJCXJldHVybiAtMTsKKwkJCQkJfQorCQkJCQl2ID0gZ2V0X2JpdHMoZ2IsIDgpOworCQkJCQlpZiAodiA9PSAwKQorCQkJCQkJYnJlYWs7CisKKwkJCQkJbGFzdCA9IHY7CisJCQkJCS8vaiA9IHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbltmZl96aWd6YWdfZGlyZWN0W2ldXTsKKwkJCQkJLy9zLT5pbnRlcl9tYXRyaXhbal0gICAgICAgID0gdjsKKwkJCQkJLy9zLT5jaHJvbWFfaW50ZXJfbWF0cml4W2pdID0gdjsKKwkJCQl9CisKKwkJCQkvKiByZXBsaWNhdGUgbGFzdCB2YWx1ZSAqLworCQkJCS8vZm9yICg7IGkgPCA2NDsgaSsrKSB7CisJCQkJCS8vaW50IGogPSBzLT5pZHNwLmlkY3RfcGVybXV0YXRpb25bZmZfemlnemFnX2RpcmVjdFtpXV07CisJCQkJCS8vcy0+aW50ZXJfbWF0cml4W2pdICAgICAgICA9IGxhc3Q7CisJCQkJCS8vcy0+Y2hyb21hX2ludGVyX21hdHJpeFtqXSA9IGxhc3Q7CisJCQkJLy99CisJCQl9CisKKwkJCS8vIEZJWE1FIGEgYnVuY2ggb2YgZ3JheXNjYWxlIHNoYXBlIHRoaW5ncworCQl9CisKKwkJaWYgKHZvX3Zlcl9pZCAhPSAxKQorCQkJcy0+cXVhcnRlcl9zYW1wbGUgPSBnZXRfYml0czEoZ2IpOworCQllbHNlCisJCQlzLT5xdWFydGVyX3NhbXBsZSA9IDA7CisKKwkJaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgNCkgeworCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJWT0wgSGVhZGVyIHRydW5jYXRlZFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAoIWdldF9iaXRzMShnYikpIHsKKwkJCWludCBwb3MgICAgICAgICAgICAgICA9IGdldF9iaXRzX2NvdW50KGdiKTsKKwkJCWludCBlc3RpbWF0aW9uX21ldGhvZCA9IGdldF9iaXRzKGdiLCAyKTsKKwkJCWlmIChlc3RpbWF0aW9uX21ldGhvZCA8IDIpIHsKKwkJCQlpZiAoIWdldF9iaXRzMShnYikpIHsKKwkJCQkJY3R4LT5jcGx4X2VzdGltYXRpb25fdHJhc2hfaSArPSA4ICogZ2V0X2JpdHMxKGdiKTsgIC8qIG9wYXF1ZSAqLworCQkJCQljdHgtPmNwbHhfZXN0aW1hdGlvbl90cmFzaF9pICs9IDggKiBnZXRfYml0czEoZ2IpOyAgLyogdHJhbnNwYXJlbnQgKi8KKwkJCQkJY3R4LT5jcGx4X2VzdGltYXRpb25fdHJhc2hfaSArPSA4ICogZ2V0X2JpdHMxKGdiKTsgIC8qIGludHJhX2NhZSAqLworCQkJCQljdHgtPmNwbHhfZXN0aW1hdGlvbl90cmFzaF9pICs9IDggKiBnZXRfYml0czEoZ2IpOyAgLyogaW50ZXJfY2FlICovCisJCQkJCWN0eC0+Y3BseF9lc3RpbWF0aW9uX3RyYXNoX2kgKz0gOCAqIGdldF9iaXRzMShnYik7ICAvKiBub191cGRhdGUgKi8KKwkJCQkJY3R4LT5jcGx4X2VzdGltYXRpb25fdHJhc2hfaSArPSA4ICogZ2V0X2JpdHMxKGdiKTsgIC8qIHVwc2FtcGxpbmcgKi8KKwkJCQl9CisJCQkJaWYgKCFnZXRfYml0czEoZ2IpKSB7CisJCQkJCWN0eC0+Y3BseF9lc3RpbWF0aW9uX3RyYXNoX2kgKz0gOCAqIGdldF9iaXRzMShnYik7ICAvKiBpbnRyYV9ibG9ja3MgKi8KKwkJCQkJY3R4LT5jcGx4X2VzdGltYXRpb25fdHJhc2hfcCArPSA4ICogZ2V0X2JpdHMxKGdiKTsgIC8qIGludGVyX2Jsb2NrcyAqLworCQkJCQljdHgtPmNwbHhfZXN0aW1hdGlvbl90cmFzaF9wICs9IDggKiBnZXRfYml0czEoZ2IpOyAgLyogaW50ZXI0dl9ibG9ja3MgKi8KKwkJCQkJY3R4LT5jcGx4X2VzdGltYXRpb25fdHJhc2hfaSArPSA4ICogZ2V0X2JpdHMxKGdiKTsgIC8qIG5vdCBjb2RlZCBibG9ja3MgKi8KKwkJCQl9CisJCQkJaWYgKCFjaGVja19tYXJrZXIoZ2IsICJpbiBjb21wbGV4aXR5IGVzdGltYXRpb24gcGFydCAxIikpIHsKKwkJCQkJc2tpcF9iaXRzX2xvbmcoZ2IsIHBvcyAtIGdldF9iaXRzX2NvdW50KGdiKSk7CisJCQkJCWdvdG8gbm9fY3BseF9lc3Q7CisJCQkJfQorCQkJCWlmICghZ2V0X2JpdHMxKGdiKSkgeworCQkJCQljdHgtPmNwbHhfZXN0aW1hdGlvbl90cmFzaF9pICs9IDggKiBnZXRfYml0czEoZ2IpOyAgLyogZGN0X2NvZWZmcyAqLworCQkJCQljdHgtPmNwbHhfZXN0aW1hdGlvbl90cmFzaF9pICs9IDggKiBnZXRfYml0czEoZ2IpOyAgLyogZGN0X2xpbmVzICovCisJCQkJCWN0eC0+Y3BseF9lc3RpbWF0aW9uX3RyYXNoX2kgKz0gOCAqIGdldF9iaXRzMShnYik7ICAvKiB2bGNfc3ltcyAqLworCQkJCQljdHgtPmNwbHhfZXN0aW1hdGlvbl90cmFzaF9pICs9IDQgKiBnZXRfYml0czEoZ2IpOyAgLyogdmxjX2JpdHMgKi8KKwkJCQl9CisJCQkJaWYgKCFnZXRfYml0czEoZ2IpKSB7CisJCQkJCWN0eC0+Y3BseF9lc3RpbWF0aW9uX3RyYXNoX3AgKz0gOCAqIGdldF9iaXRzMShnYik7ICAvKiBhcG0gKi8KKwkJCQkJY3R4LT5jcGx4X2VzdGltYXRpb25fdHJhc2hfcCArPSA4ICogZ2V0X2JpdHMxKGdiKTsgIC8qIG5wbSAqLworCQkJCQljdHgtPmNwbHhfZXN0aW1hdGlvbl90cmFzaF9iICs9IDggKiBnZXRfYml0czEoZ2IpOyAgLyogaW50ZXJwb2xhdGVfbWNfcSAqLworCQkJCQljdHgtPmNwbHhfZXN0aW1hdGlvbl90cmFzaF9wICs9IDggKiBnZXRfYml0czEoZ2IpOyAgLyogZm9yd2JhY2tfbWNfcSAqLworCQkJCQljdHgtPmNwbHhfZXN0aW1hdGlvbl90cmFzaF9wICs9IDggKiBnZXRfYml0czEoZ2IpOyAgLyogaGFsZnBlbDIgKi8KKwkJCQkJY3R4LT5jcGx4X2VzdGltYXRpb25fdHJhc2hfcCArPSA4ICogZ2V0X2JpdHMxKGdiKTsgIC8qIGhhbGZwZWw0ICovCisJCQkJfQorCQkJCWlmICghY2hlY2tfbWFya2VyKGdiLCAiaW4gY29tcGxleGl0eSBlc3RpbWF0aW9uIHBhcnQgMiIpKSB7CisJCQkJCXNraXBfYml0c19sb25nKGdiLCBwb3MgLSBnZXRfYml0c19jb3VudChnYikpOworCQkJCQlnb3RvIG5vX2NwbHhfZXN0OworCQkJCX0KKwkJCQlpZiAoZXN0aW1hdGlvbl9tZXRob2QgPT0gMSkgeworCQkJCQljdHgtPmNwbHhfZXN0aW1hdGlvbl90cmFzaF9pICs9IDggKiBnZXRfYml0czEoZ2IpOyAgLyogc2FkY3QgKi8KKwkJCQkJY3R4LT5jcGx4X2VzdGltYXRpb25fdHJhc2hfcCArPSA4ICogZ2V0X2JpdHMxKGdiKTsgIC8qIHFwZWwgKi8KKwkJCQl9CisJCQl9IGVsc2UKKwkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAiSW52YWxpZCBDb21wbGV4aXR5IGVzdGltYXRpb24gbWV0aG9kICVkXG4iLAorCQkJCWVzdGltYXRpb25fbWV0aG9kKTsKKwkJfSBlbHNlIHsKKworbm9fY3BseF9lc3Q6CisJCQljdHgtPmNwbHhfZXN0aW1hdGlvbl90cmFzaF9pID0KKwkJCWN0eC0+Y3BseF9lc3RpbWF0aW9uX3RyYXNoX3AgPQorCQkJY3R4LT5jcGx4X2VzdGltYXRpb25fdHJhc2hfYiA9IDA7CisJCX0KKworCQljdHgtPnJlc3luY19tYXJrZXIgPSAhZ2V0X2JpdHMxKGdiKTsgLyogcmVzeW5jX21hcmtlcl9kaXNhYmxlZCAqLworCisJCXMtPmRhdGFfcGFydGl0aW9uaW5nID0gZ2V0X2JpdHMxKGdiKTsKKwkJaWYgKHMtPmRhdGFfcGFydGl0aW9uaW5nKQorCQkJY3R4LT5ydmxjID0gZ2V0X2JpdHMxKGdiKTsKKworCQlpZiAodm9fdmVyX2lkICE9IDEpIHsKKwkJCWN0eC0+bmV3X3ByZWQgPSBnZXRfYml0czEoZ2IpOworCQlpZiAoY3R4LT5uZXdfcHJlZCkgeworCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJuZXcgcHJlZCBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJCXNraXBfYml0cyhnYiwgMik7IC8qIHJlcXVlc3RlZCB1cHN0cmVhbSBtZXNzYWdlIHR5cGUgKi8KKwkJCXNraXBfYml0czEoZ2IpOyAgIC8qIG5ld3ByZWQgc2VnbWVudCB0eXBlICovCisJCX0KKwkJaWYgKGdldF9iaXRzMShnYikpIC8vIHJlZHVjZWRfcmVzX3ZvcAorCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJyZWR1Y2VkIHJlc29sdXRpb24gVk9QIG5vdCBzdXBwb3J0ZWRcbiIpOworCQl9IGVsc2UgeworCQkJY3R4LT5uZXdfcHJlZCA9IDA7CisJCX0KKworCQljdHgtPnNjYWxhYmlsaXR5ID0gZ2V0X2JpdHMxKGdiKTsKKworCQlpZiAoY3R4LT5zY2FsYWJpbGl0eSkgeworCQkJc3RydWN0IGdldF9iaXRzX2NvbnRleHQgYmFrID0gKmdiOworCQkJaW50IGhfc2FtcGxpbmdfZmFjdG9yX247CisJCQlpbnQgaF9zYW1wbGluZ19mYWN0b3JfbTsKKwkJCWludCB2X3NhbXBsaW5nX2ZhY3Rvcl9uOworCQkJaW50IHZfc2FtcGxpbmdfZmFjdG9yX207CisKKwkJCXNraXBfYml0czEoZ2IpOyAgICAvLyBoaWVyYXJjaHlfdHlwZQorCQkJc2tpcF9iaXRzKGdiLCA0KTsgIC8qIHJlZl9sYXllcl9pZCAqLworCQkJc2tpcF9iaXRzMShnYik7ICAgIC8qIHJlZl9sYXllcl9zYW1wbGluZ19kaXIgKi8KKwkJCWhfc2FtcGxpbmdfZmFjdG9yX24gPSBnZXRfYml0cyhnYiwgNSk7CisJCQloX3NhbXBsaW5nX2ZhY3Rvcl9tID0gZ2V0X2JpdHMoZ2IsIDUpOworCQkJdl9zYW1wbGluZ19mYWN0b3JfbiA9IGdldF9iaXRzKGdiLCA1KTsKKwkJCXZfc2FtcGxpbmdfZmFjdG9yX20gPSBnZXRfYml0cyhnYiwgNSk7CisJCQljdHgtPmVuaGFuY2VtZW50X3R5cGUgPSBnZXRfYml0czEoZ2IpOworCisJCQlpZiAoaF9zYW1wbGluZ19mYWN0b3JfbiA9PSAwIHx8IGhfc2FtcGxpbmdfZmFjdG9yX20gPT0gMCB8fAorCQkJCXZfc2FtcGxpbmdfZmFjdG9yX24gPT0gMCB8fCB2X3NhbXBsaW5nX2ZhY3Rvcl9tID09IDApIHsKKwkJCQkvKiBpbGxlZ2FsIHNjYWxhYmlsaXR5IGhlYWRlciAoVkVSWSBicm9rZW4gZW5jb2RlciksCisJCQkJKiB0cnlpbmcgdG8gd29ya2Fyb3VuZCAqLworCQkJCWN0eC0+c2NhbGFiaWxpdHkgPSAwOworCQkJCSpnYiAgICAgICAgICAgID0gYmFrOworCQkJfSBlbHNlCisJCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJzY2FsYWJpbGl0eSBub3Qgc3VwcG9ydGVkXG4iKTsKKworCQkJLy8gYmluIHNoYXBlIHN0dWZmIEZJWE1FCisJCX0KKwl9CisKKwlpZiAoMSkgeworCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsICJ0YiAlZC8lZCwgdGluY3JiaXRzOiVkLCBxcF9wcmVjOiVkLCBwczolZCwgbG93X2RlbGF5OiVkICAlcyVzJXMlc1xuIiwKKwkJCWN0eC0+ZnJhbWVyYXRlLmRlbiwgY3R4LT5mcmFtZXJhdGUubnVtLAorCQkJY3R4LT50aW1lX2luY3JlbWVudF9iaXRzLAorCQkJcy0+cXVhbnRfcHJlY2lzaW9uLAorCQkJcy0+cHJvZ3Jlc3NpdmVfc2VxdWVuY2UsCisJCQlzLT5sb3dfZGVsYXksCisJCQljdHgtPnNjYWxhYmlsaXR5ID8gInNjYWxhYmlsaXR5ICIgOiIiICwgcy0+cXVhcnRlcl9zYW1wbGUgPyAicXBlbCAiIDogIiIsCisJCQlzLT5kYXRhX3BhcnRpdGlvbmluZyA/ICJwYXJ0aXRpb24gIiA6ICIiLCBjdHgtPnJ2bGMgPyAicnZsYyAiIDogIiIpOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qKgorICogRGVjb2RlIHRoZSB1c2VyIGRhdGEgc3R1ZmYgaW4gdGhlIGhlYWRlci4KKyAqIEFsc28gaW5pdGlhbGl6ZXMgZGl2eC94dmlkL2xhdmNfdmVyc2lvbi9idWlsZC4KKyAqLworc3RhdGljIGludCBkZWNvZGVfdXNlcl9kYXRhKHN0cnVjdCBtcGVnNF9kZWNfcGFyYW0gKmN0eCwgc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKmdiKQoreworCXN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcyA9ICZjdHgtPm07CisJY2hhciBidWZbMjU2XTsKKwlpbnQgaTsKKwlpbnQgZTsKKwlpbnQgdmVyID0gMCwgYnVpbGQgPSAwLCB2ZXIyID0gMCwgdmVyMyA9IDA7CisJY2hhciBsYXN0OworCisJZm9yIChpID0gMDsgaSA8IDI1NSAmJiBnZXRfYml0c19jb3VudChnYikgPCBnYi0+c2l6ZV9pbl9iaXRzOyBpKyspIHsKKwkJaWYgKHNob3dfYml0cyhnYiwgMjMpID09IDApCisJCWJyZWFrOworCQlidWZbaV0gPSBnZXRfYml0cyhnYiwgOCk7CisJfQorCWJ1ZltpXSA9IDA7CisKKwkvKiBkaXZ4IGRldGVjdGlvbiAqLworCWUgPSBzc2NhbmYoYnVmLCAiRGl2WCVkQnVpbGQlZCVjIiwgJnZlciwgJmJ1aWxkLCAmbGFzdCk7CisJaWYgKGUgPCAyKQorCQllID0gc3NjYW5mKGJ1ZiwgIkRpdlglZGIlZCVjIiwgJnZlciwgJmJ1aWxkLCAmbGFzdCk7CisJaWYgKGUgPj0gMikgeworCQljdHgtPmRpdnhfdmVyc2lvbiA9IHZlcjsKKwkJY3R4LT5kaXZ4X2J1aWxkICAgPSBidWlsZDsKKwkJcy0+ZGl2eF9wYWNrZWQgID0gZSA9PSAzICYmIGxhc3QgPT0gJ3AnOworCX0KKworCS8qIGxpYmF2Y29kZWMgZGV0ZWN0aW9uICovCisJZSA9IHNzY2FuZihidWYsICJGRm1wZSUqW15iXWIlZCIsICZidWlsZCkgKyAzOworCWlmIChlICE9IDQpCisJCWUgPSBzc2NhbmYoYnVmLCAiRkZtcGVnIHYlZC4lZC4lZCAvIGxpYmF2Y29kZWMgYnVpbGQ6ICVkIiwgJnZlciwgJnZlcjIsICZ2ZXIzLCAmYnVpbGQpOworCWlmIChlICE9IDQpIHsKKwkJZSA9IHNzY2FuZihidWYsICJMYXZjJWQuJWQuJWQiLCAmdmVyLCAmdmVyMiwgJnZlcjMpICsgMTsKKwkJaWYgKGUgPiAxKSB7CisJCQlpZiAodmVyID4gMHhGRlUgfHwgdmVyMiA+IDB4RkZVIHx8IHZlcjMgPiAweEZGVSkgeworCQkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX1BBUlNFUiwgIlVua25vd24gTGF2YyB2ZXJzaW9uIHN0cmluZyBlbmNvdW50ZXJlZCwgJWQuJWQuJWQ7ICIKKwkJCQkJImNsYW1waW5nIHN1Yi12ZXJzaW9uIHZhbHVlcyB0byA4LWJpdHMuXG4iLAorCQkJCQl2ZXIsIHZlcjIsIHZlcjMpOworCQkJfQorCQkJYnVpbGQgPSAoKHZlciAmIDB4RkYpIDw8IDE2KSArICgodmVyMiAmIDB4RkYpIDw8IDgpICsgKHZlcjMgJiAweEZGKTsKKwkJfQorCX0KKwlpZiAoZSAhPSA0KSB7CisJCWlmIChzdHJjbXAoYnVmLCAiZmZtcGVnIikgPT0gMCkKKwkJCWN0eC0+bGF2Y19idWlsZCA9IDQ2MDA7CisJfQorCWlmIChlID09IDQpCisJCWN0eC0+bGF2Y19idWlsZCA9IGJ1aWxkOworCisJLyogWHZpZCBkZXRlY3Rpb24gKi8KKwllID0gc3NjYW5mKGJ1ZiwgIlh2aUQlZCIsICZidWlsZCk7CisJaWYgKGUgPT0gMSkKKwkJY3R4LT54dmlkX2J1aWxkID0gYnVpbGQ7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IG1wZWc0X2RlY29kZV9nb3BfaGVhZGVyKHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcywgc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKmdiKQoreworCWludCBob3VycywgbWludXRlcywgc2Vjb25kczsKKworCWlmICghc2hvd19iaXRzKGdiLCAyMykpIHsKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJHT1AgaGVhZGVyIGludmFsaWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaG91cnMgICA9IGdldF9iaXRzKGdiLCA1KTsKKwltaW51dGVzID0gZ2V0X2JpdHMoZ2IsIDYpOworCWNoZWNrX21hcmtlcihnYiwgImluIGdvcF9oZWFkZXIiKTsKKwlzZWNvbmRzID0gZ2V0X2JpdHMoZ2IsIDYpOworCisJcy0+dGltZV9iYXNlID0gc2Vjb25kcyArIDYwKihtaW51dGVzICsgNjAqaG91cnMpOworCisJc2tpcF9iaXRzMShnYik7CisJc2tpcF9iaXRzMShnYik7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IG1wZWc0X2RlY29kZV9wcm9maWxlX2xldmVsKHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcywgc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKmdiLCBpbnQgKnByb2ZpbGUsIGludCAqbGV2ZWwpCit7CisKKwkqcHJvZmlsZSA9IGdldF9iaXRzKGdiLCA0KTsKKwkqbGV2ZWwgICA9IGdldF9iaXRzKGdiLCA0KTsKKworCS8vIGZvciBTaW1wbGUgcHJvZmlsZSwgbGV2ZWwgMAorCWlmICgqcHJvZmlsZSA9PSAwICYmICpsZXZlbCA9PSA4KSB7CisJCSpsZXZlbCA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBkZWNvZGVfc3R1ZGlvdmlzdWFsb2JqZWN0KHN0cnVjdCBtcGVnNF9kZWNfcGFyYW0gKmN0eCwgc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKmdiKQoreworCXN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcyA9ICZjdHgtPm07CisJaW50IHZpc3VhbF9vYmplY3RfdHlwZTsKKworCXNraXBfYml0cyhnYiwgNCk7IC8qIHZpc3VhbF9vYmplY3RfdmVyaWQgKi8KKwl2aXN1YWxfb2JqZWN0X3R5cGUgPSBnZXRfYml0cyhnYiwgNCk7CisJaWYgKHZpc3VhbF9vYmplY3RfdHlwZSAhPSBWT1RfVklERU9fSUQpIHsKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJWTyB0eXBlICV1IiwgdmlzdWFsX29iamVjdF90eXBlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW5leHRfc3RhcnRfY29kZV9zdHVkaW8oZ2IpOworCWV4dGVuc2lvbl9hbmRfdXNlcl9kYXRhKHMsIGdiLCAxKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgbXBlZzRfZGVjb2RlX3Zpc3VhbF9vYmplY3Qoc3RydWN0IE1wZWdFbmNDb250ZXh0ICpzLCBzdHJ1Y3QgZ2V0X2JpdHNfY29udGV4dCAqZ2IpCit7CisJaW50IHZpc3VhbF9vYmplY3RfdHlwZTsKKwlpbnQgaXNfdmlzdWFsX29iamVjdF9pZGVudGlmaWVyID0gZ2V0X2JpdHMxKGdiKTsKKworCWlmIChpc192aXN1YWxfb2JqZWN0X2lkZW50aWZpZXIpIHsKKwkJc2tpcF9iaXRzKGdiLCA0KzMpOworCX0KKwl2aXN1YWxfb2JqZWN0X3R5cGUgPSBnZXRfYml0cyhnYiwgNCk7CisKKwlpZiAodmlzdWFsX29iamVjdF90eXBlID09IFZPVF9WSURFT19JRCB8fAorCXZpc3VhbF9vYmplY3RfdHlwZSA9PSBWT1RfU1RJTExfVEVYVFVSRV9JRCkgeworCQlpbnQgdmlkZW9fc2lnbmFsX3R5cGUgPSBnZXRfYml0czEoZ2IpOworCQlpZiAodmlkZW9fc2lnbmFsX3R5cGUpIHsKKwkJCWludCB2aWRlb19yYW5nZSwgY29sb3JfZGVzY3JpcHRpb247CisJCQlza2lwX2JpdHMoZ2IsIDMpOyAvLyB2aWRlb19mb3JtYXQKKwkJCXZpZGVvX3JhbmdlID0gZ2V0X2JpdHMxKGdiKTsKKwkJCWNvbG9yX2Rlc2NyaXB0aW9uID0gZ2V0X2JpdHMxKGdiKTsKKworCQkJcy0+Y3R4LT5jb2xvcl9yYW5nZSA9IHZpZGVvX3JhbmdlID8gQVZDT0xfUkFOR0VfSlBFRyA6IEFWQ09MX1JBTkdFX01QRUc7CisKKwkJCWlmIChjb2xvcl9kZXNjcmlwdGlvbikgeworCQkJCXMtPmN0eC0+Y29sb3JfcHJpbWFyaWVzID0gZ2V0X2JpdHMoZ2IsIDgpOworCQkJCXMtPmN0eC0+Y29sb3JfdHJjICAgICAgID0gZ2V0X2JpdHMoZ2IsIDgpOworCQkJCXMtPmN0eC0+Y29sb3JzcGFjZSAgICAgID0gZ2V0X2JpdHMoZ2IsIDgpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9zbXB0ZV90YyhzdHJ1Y3QgbXBlZzRfZGVjX3BhcmFtICpjdHgsIHN0cnVjdCBnZXRfYml0c19jb250ZXh0ICpnYikKK3sKKwlza2lwX2JpdHMoZ2IsIDE2KTsgLyogVGltZV9jb2RlWzYzLi40OF0gKi8KKwljaGVja19tYXJrZXIoZ2IsICJhZnRlciBUaW1lX2NvZGVbNjMuLjQ4XSIpOworCXNraXBfYml0cyhnYiwgMTYpOyAvKiBUaW1lX2NvZGVbNDcuLjMyXSAqLworCWNoZWNrX21hcmtlcihnYiwgImFmdGVyIFRpbWVfY29kZVs0Ny4uMzJdIik7CisJc2tpcF9iaXRzKGdiLCAxNik7IC8qIFRpbWVfY29kZVszMS4uMTZdICovCisJY2hlY2tfbWFya2VyKGdiLCAiYWZ0ZXIgVGltZV9jb2RlWzMxLi4xNl0iKTsKKwlza2lwX2JpdHMoZ2IsIDE2KTsgLyogVGltZV9jb2RlWzE1Li4wXSAqLworCWNoZWNrX21hcmtlcihnYiwgImFmdGVyIFRpbWVfY29kZVsxNS4uMF0iKTsKKwlza2lwX2JpdHMoZ2IsIDQpOyAvKiByZXNlcnZlZF9iaXRzICovCit9CisKK3N0YXRpYyB2b2lkIHJlc2V0X3N0dWRpb19kY19wcmVkaWN0b3JzKHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcykKK3sKKwkvKiBSZXNldCBEQyBQcmVkaWN0b3JzICovCisJcy0+bGFzdF9kY1swXSA9CisJcy0+bGFzdF9kY1sxXSA9CisJcy0+bGFzdF9kY1syXSA9IDEgPDwgKHMtPmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSArIHMtPmRjdF9wcmVjaXNpb24gKyBzLT5pbnRyYV9kY19wcmVjaXNpb24gLSAxKTsKK30KKworLyoqCisgKiBEZWNvZGUgdGhlIG5leHQgc3R1ZGlvIHZvcCBoZWFkZXIuCisgKiBAcmV0dXJuIDwwIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX3N0dWRpb192b3BfaGVhZGVyKHN0cnVjdCBtcGVnNF9kZWNfcGFyYW0gKmN0eCwgc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKmdiKQoreworCXN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcyA9ICZjdHgtPm07CisKKwlpZiAoZ2V0X2JpdHNfbGVmdChnYikgPD0gMzIpCisJCXJldHVybiAwOworCisJLy9zLT5kZWNvZGVfbWIgPSBtcGVnNF9kZWNvZGVfc3R1ZGlvX21iOworCisJZGVjb2RlX3NtcHRlX3RjKGN0eCwgZ2IpOworCisJc2tpcF9iaXRzKGdiLCAxMCk7IC8qIHRlbXBvcmFsX3JlZmVyZW5jZSAqLworCXNraXBfYml0cyhnYiwgMik7IC8qIHZvcF9zdHJ1Y3R1cmUgKi8KKwlzLT5waWN0X3R5cGUgPSBnZXRfYml0cyhnYiwgMikgKyBBVl9QSUNUVVJFX1RZUEVfSTsgLyogdm9wX2NvZGluZ190eXBlICovCisJaWYgKGdldF9iaXRzMShnYikpIHsgLyogdm9wX2NvZGVkICovCisJCXNraXBfYml0czEoZ2IpOyAvKiB0b3BfZmllbGRfZmlyc3QgKi8KKwkJc2tpcF9iaXRzMShnYik7IC8qIHJlcGVhdF9maXJzdF9maWVsZCAqLworCQlzLT5wcm9ncmVzc2l2ZV9mcmFtZSA9IGdldF9iaXRzMShnYikgXiAxOyAvKiBwcm9ncmVzc2l2ZV9mcmFtZSAqLworCX0KKworCWlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKKwkJaWYgKGdldF9iaXRzMShnYikpCisJCQlyZXNldF9zdHVkaW9fZGNfcHJlZGljdG9ycyhzKTsKKwl9CisKKwlpZiAoY3R4LT5zaGFwZSAhPSBCSU5fT05MWV9TSEFQRSkgeworCQlzLT5hbHRlcm5hdGVfc2NhbiA9IGdldF9iaXRzMShnYik7CisJCXMtPmZyYW1lX3ByZWRfZnJhbWVfZGN0ID0gZ2V0X2JpdHMxKGdiKTsKKwkJcy0+ZGN0X3ByZWNpc2lvbiA9IGdldF9iaXRzKGdiLCAyKTsKKwkJcy0+aW50cmFfZGNfcHJlY2lzaW9uID0gZ2V0X2JpdHMoZ2IsIDIpOworCQlzLT5xX3NjYWxlX3R5cGUgPSBnZXRfYml0czEoZ2IpOworCX0KKworCS8vaWYgKHMtPmFsdGVybmF0ZV9zY2FuKSB7ICAgIH0KKworCS8vbXBlZzRfbG9hZF9kZWZhdWx0X21hdHJpY2VzKHMpOworCisJbmV4dF9zdGFydF9jb2RlX3N0dWRpbyhnYik7CisJZXh0ZW5zaW9uX2FuZF91c2VyX2RhdGEocywgZ2IsIDQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX25ld19wcmVkKHN0cnVjdCBtcGVnNF9kZWNfcGFyYW0gKmN0eCwgc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKmdiKQoreworCWludCBsZW4gPSBGRk1JTihjdHgtPnRpbWVfaW5jcmVtZW50X2JpdHMgKyAzLCAxNSk7CisKKwlnZXRfYml0cyhnYiwgbGVuKTsKKwlpZiAoZ2V0X2JpdHMxKGdiKSkKKwkJZ2V0X2JpdHMoZ2IsIGxlbik7CisJY2hlY2tfbWFya2VyKGdiLCAiYWZ0ZXIgbmV3X3ByZWQiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV92b3BfaGVhZGVyKHN0cnVjdCBtcGVnNF9kZWNfcGFyYW0gKmN0eCwgc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKmdiKQoreworCXN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcyA9ICZjdHgtPm07CisJaW50IHRpbWVfaW5jciwgdGltZV9pbmNyZW1lbnQ7CisJaW50NjRfdCBwdHM7CisKKwlzLT5tY3NlbCAgICAgICA9IDA7CisJcy0+cGljdF90eXBlID0gZ2V0X2JpdHMoZ2IsIDIpICsgQVZfUElDVFVSRV9UWVBFX0k7ICAgICAgICAvKiBwaWN0IHR5cGU6IEkgPSAwICwgUCA9IDEgKi8KKwlpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CICYmIHMtPmxvd19kZWxheSAmJgorCQljdHgtPnZvbF9jb250cm9sX3BhcmFtZXRlcnMgPT0gMCkgeworCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgImxvd19kZWxheSBmbGFnIHNldCBpbmNvcnJlY3RseSwgY2xlYXJpbmcgaXRcbiIpOworCQlzLT5sb3dfZGVsYXkgPSAwOworCX0KKworCXMtPnBhcnRpdGlvbmVkX2ZyYW1lID0gcy0+ZGF0YV9wYXJ0aXRpb25pbmcgJiYgcy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9COworCS8qaWYgKHMtPnBhcnRpdGlvbmVkX2ZyYW1lKQorCQlzLT5kZWNvZGVfbWIgPSBtcGVnNF9kZWNvZGVfcGFydGl0aW9uZWRfbWI7CisJZWxzZQorCQlzLT5kZWNvZGVfbWIgPSBtcGVnNF9kZWNvZGVfbWI7Ki8KKworCXRpbWVfaW5jciA9IDA7CisJd2hpbGUgKGdldF9iaXRzMShnYikgIT0gMCkKKwkJdGltZV9pbmNyKys7CisKKwljaGVja19tYXJrZXIoZ2IsICJiZWZvcmUgdGltZV9pbmNyZW1lbnQiKTsKKworCWlmIChjdHgtPnRpbWVfaW5jcmVtZW50X2JpdHMgPT0gMCB8fAorCQkhKHNob3dfYml0cyhnYiwgY3R4LT50aW1lX2luY3JlbWVudF9iaXRzICsgMSkgJiAxKSkgeworCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsICJ0aW1lX2luY3JlbWVudF9iaXRzICVkIGlzIGludmFsaWQgaW4gcmVsYXRpb24gdG8gdGhlIGN1cnJlbnQgYml0c3RyZWFtLCB0aGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBtaXNzaW5nIFZPTCBoZWFkZXJcbiIsIGN0eC0+dGltZV9pbmNyZW1lbnRfYml0cyk7CisKKwkJZm9yIChjdHgtPnRpbWVfaW5jcmVtZW50X2JpdHMgPSAxOworCQkJY3R4LT50aW1lX2luY3JlbWVudF9iaXRzIDwgMTY7CisJCQljdHgtPnRpbWVfaW5jcmVtZW50X2JpdHMrKykgeworCQkJaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCB8fAorCQkJCShzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1MgJiYKKwkJCQljdHgtPnZvbF9zcHJpdGVfdXNhZ2UgPT0gR01DX1NQUklURSkpIHsKKwkJCQlpZiAoKHNob3dfYml0cyhnYiwgY3R4LT50aW1lX2luY3JlbWVudF9iaXRzICsgNikgJiAweDM3KSA9PSAweDMwKQorCQkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoKHNob3dfYml0cyhnYiwgY3R4LT50aW1lX2luY3JlbWVudF9iaXRzICsgNSkgJiAweDFGKSA9PSAweDE4KQorCQkJCWJyZWFrOworCQl9CisKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLCAidGltZV9pbmNyZW1lbnRfYml0cyBzZXQgdG8gJWQgYml0cywgYmFzZWQgb24gYml0c3RyZWFtIGFuYWx5c2lzXG4iLCBjdHgtPnRpbWVfaW5jcmVtZW50X2JpdHMpOworCQlpZiAoY3R4LT5mcmFtZXJhdGUubnVtICYmIDQqY3R4LT5mcmFtZXJhdGUubnVtIDwgMTw8Y3R4LT50aW1lX2luY3JlbWVudF9iaXRzKSB7CisJCQljdHgtPmZyYW1lcmF0ZS5udW0gPSAxPDxjdHgtPnRpbWVfaW5jcmVtZW50X2JpdHM7CisJCQkvL2N0eC0+dGltZV9iYXNlID0gYXZfaW52X3EoYXZfbXVsX3EoY3R4LT5mcmFtZXJhdGUsIChBVlJhdGlvbmFsKXtjdHgtPnRpY2tzX3Blcl9mcmFtZSwgMX0pKTsKKwkJfQorCX0KKworCWlmIChJU18zSVYxKQorCQl0aW1lX2luY3JlbWVudCA9IGdldF9iaXRzMShnYik7ICAgICAgICAvLyBGSVhNRSBpbnZlc3RpZ2F0ZSBmdXJ0aGVyCisJZWxzZQorCQl0aW1lX2luY3JlbWVudCA9IGdldF9iaXRzKGdiLCBjdHgtPnRpbWVfaW5jcmVtZW50X2JpdHMpOworCisJaWYgKHMtPnBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfQikgeworCQlzLT5sYXN0X3RpbWVfYmFzZSA9IHMtPnRpbWVfYmFzZTsKKwkJcy0+dGltZV9iYXNlICAgICArPSB0aW1lX2luY3I7CisJCXMtPnRpbWUgPSBzLT50aW1lX2Jhc2UgKiAoaW50NjRfdCljdHgtPmZyYW1lcmF0ZS5udW0gKyB0aW1lX2luY3JlbWVudDsKKwkJLy9pZiAocy0+d29ya2Fyb3VuZF9idWdzICYgRkZfQlVHX1VNUDQpIHsgfQorCQlzLT5wcF90aW1lICAgICAgICAgPSBzLT50aW1lIC0gcy0+bGFzdF9ub25fYl90aW1lOworCQlzLT5sYXN0X25vbl9iX3RpbWUgPSBzLT50aW1lOworCX0gZWxzZSB7CisJCXMtPnRpbWUgICAgPSAocy0+bGFzdF90aW1lX2Jhc2UgKyB0aW1lX2luY3IpICogKGludDY0X3QpY3R4LT5mcmFtZXJhdGUubnVtICsgdGltZV9pbmNyZW1lbnQ7CisJCXMtPnBiX3RpbWUgPSBzLT5wcF90aW1lIC0gKHMtPmxhc3Rfbm9uX2JfdGltZSAtIHMtPnRpbWUpOworCQlpZiAocy0+cHBfdGltZSA8PSBzLT5wYl90aW1lIHx8CisJCQlzLT5wcF90aW1lIDw9IHMtPnBwX3RpbWUgLSBzLT5wYl90aW1lIHx8CisJCQlzLT5wcF90aW1lIDw9IDApIHsKKwkJCS8qIG1lc3NlZCB1cCBvcmRlciwgbWF5YmUgYWZ0ZXIgc2Vla2luZz8gc2tpcHBpbmcgY3VycmVudCBCLWZyYW1lICovCisJCQlyZXR1cm4gRlJBTUVfU0tJUFBFRDsKKwkJfQorCQkvL2ZmX21wZWc0X2luaXRfZGlyZWN0X212KHMpOworCisJCQlpZiAoY3R4LT50X2ZyYW1lID09IDApCisJCWN0eC0+dF9mcmFtZSA9IHMtPnBiX3RpbWU7CisJCWlmIChjdHgtPnRfZnJhbWUgPT0gMCkKKwkJCWN0eC0+dF9mcmFtZSA9IDE7ICAvLyAxLzAgcHJvdGVjdGlvbgorCQlzLT5wcF9maWVsZF90aW1lID0gKFJPVU5ERURfRElWKHMtPmxhc3Rfbm9uX2JfdGltZSwgY3R4LT50X2ZyYW1lKSAtCisJCVJPVU5ERURfRElWKHMtPmxhc3Rfbm9uX2JfdGltZSAtIHMtPnBwX3RpbWUsIGN0eC0+dF9mcmFtZSkpICogMjsKKwkJcy0+cGJfZmllbGRfdGltZSA9IChST1VOREVEX0RJVihzLT50aW1lLCBjdHgtPnRfZnJhbWUpIC0KKwkJUk9VTkRFRF9ESVYocy0+bGFzdF9ub25fYl90aW1lIC0gcy0+cHBfdGltZSwgY3R4LT50X2ZyYW1lKSkgKiAyOworCQlpZiAocy0+cHBfZmllbGRfdGltZSA8PSBzLT5wYl9maWVsZF90aW1lIHx8IHMtPnBiX2ZpZWxkX3RpbWUgPD0gMSkgeworCQkJcy0+cGJfZmllbGRfdGltZSA9IDI7CisJCQlzLT5wcF9maWVsZF90aW1lID0gNDsKKwkJCWlmICghcy0+cHJvZ3Jlc3NpdmVfc2VxdWVuY2UpCisJCQkJcmV0dXJuIEZSQU1FX1NLSVBQRUQ7CisJCX0KKwl9CisKKwlpZiAoY3R4LT5mcmFtZXJhdGUuZGVuKQorCQlwdHMgPSBST1VOREVEX0RJVihzLT50aW1lLCBjdHgtPmZyYW1lcmF0ZS5kZW4pOworCWVsc2UKKwkJcHRzID0gQVZfTk9QVFNfVkFMVUU7CisJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLCAiTVBFRzQgUFRTOiAlbGxkXG4iLCBwdHMpOworCisJY2hlY2tfbWFya2VyKGdiLCAiYmVmb3JlIHZvcF9jb2RlZCIpOworCisJLyogdm9wIGNvZGVkICovCisJaWYgKGdldF9iaXRzMShnYikgIT0gMSkgeworCQlpZiAoMSkKKwkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAidm9wIG5vdCBjb2RlZFxuIik7CisJCXJldHVybiBGUkFNRV9TS0lQUEVEOworCX0KKwlpZiAoY3R4LT5uZXdfcHJlZCkKKwkJZGVjb2RlX25ld19wcmVkKGN0eCwgZ2IpOworCisJaWYgKGN0eC0+c2hhcGUgIT0gQklOX09OTFlfU0hBUEUgJiYKKwkJKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCB8fAorCQkocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9TICYmCisJCWN0eC0+dm9sX3Nwcml0ZV91c2FnZSA9PSBHTUNfU1BSSVRFKSkpIHsKKwkJLyogcm91bmRpbmcgdHlwZSBmb3IgbW90aW9uIGVzdGltYXRpb24gKi8KKwkJcy0+bm9fcm91bmRpbmcgPSBnZXRfYml0czEoZ2IpOworCX0gZWxzZSB7CisJCXMtPm5vX3JvdW5kaW5nID0gMDsKKwl9CisJLy8gRklYTUUgcmVkdWNlZCByZXMgc3R1ZmYKKworCWlmIChjdHgtPnNoYXBlICE9IFJFQ1RfU0hBUEUpIHsKKwkJaWYgKGN0eC0+dm9sX3Nwcml0ZV91c2FnZSAhPSAxIHx8IHMtPnBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfSSkgeworCQkJc2tpcF9iaXRzKGdiLCAxMyk7ICAvKiB3aWR0aCAqLworCQkJY2hlY2tfbWFya2VyKGdiLCAiYWZ0ZXIgd2lkdGgiKTsKKwkJCXNraXBfYml0cyhnYiwgMTMpOyAgLyogaGVpZ2h0ICovCisJCQljaGVja19tYXJrZXIoZ2IsICJhZnRlciBoZWlnaHQiKTsKKwkJCXNraXBfYml0cyhnYiwgMTMpOyAgLyogaG9yX3NwYXRfcmVmICovCisJCQljaGVja19tYXJrZXIoZ2IsICJhZnRlciBob3Jfc3BhdF9yZWYiKTsKKwkJCXNraXBfYml0cyhnYiwgMTMpOyAgLyogdmVyX3NwYXRfcmVmICovCisJCX0KKwkJc2tpcF9iaXRzMShnYik7ICAgICAgICAgLyogY2hhbmdlX0NSX2Rpc2FibGUgKi8KKworCQlpZiAoZ2V0X2JpdHMxKGdiKSAhPSAwKQorCQkJc2tpcF9iaXRzKGdiLCA4KTsgICAvKiBjb25zdGFudF9hbHBoYV92YWx1ZSAqLworCX0KKworCS8vIEZJWE1FIGNvbXBsZXhpdHkgZXN0aW1hdGlvbiBzdHVmZgorCisJaWYgKGN0eC0+c2hhcGUgIT0gQklOX09OTFlfU0hBUEUpIHsKKwkJc2tpcF9iaXRzX2xvbmcoZ2IsIGN0eC0+Y3BseF9lc3RpbWF0aW9uX3RyYXNoX2kpOworCQlpZiAocy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9JKQorCQkJc2tpcF9iaXRzX2xvbmcoZ2IsIGN0eC0+Y3BseF9lc3RpbWF0aW9uX3RyYXNoX3ApOworCQlpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKQorCQkJc2tpcF9iaXRzX2xvbmcoZ2IsIGN0eC0+Y3BseF9lc3RpbWF0aW9uX3RyYXNoX2IpOworCisJCWlmIChnZXRfYml0c19sZWZ0KGdiKSA8IDMpIHsKKwkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAiSGVhZGVyIHRydW5jYXRlZFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJY3R4LT5pbnRyYV9kY190aHJlc2hvbGQgPSBmZl9tcGVnNF9kY190aHJlc2hvbGRbZ2V0X2JpdHMoZ2IsIDMpXTsKKwkJaWYgKCFzLT5wcm9ncmVzc2l2ZV9zZXF1ZW5jZSkgeworCQkJcy0+dG9wX2ZpZWxkX2ZpcnN0ID0gZ2V0X2JpdHMxKGdiKTsKKwkJCXMtPmFsdGVybmF0ZV9zY2FuICA9IGdldF9iaXRzMShnYik7CisJCX0gZWxzZQorCQkJcy0+YWx0ZXJuYXRlX3NjYW4gPSAwOworCX0KKworCS8qaWYgKHMtPmFsdGVybmF0ZV9zY2FuKSB7IH0gKi8KKworCWlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1MpIHsKKwkJaWYoKGN0eC0+dm9sX3Nwcml0ZV91c2FnZSA9PSBTVEFUSUNfU1BSSVRFIHx8CisJCQljdHgtPnZvbF9zcHJpdGVfdXNhZ2UgPT0gR01DX1NQUklURSkpIHsKKwkJCS8vaWYgKG1wZWc0X2RlY29kZV9zcHJpdGVfdHJhamVjdG9yeShjdHgsIGdiKSA8IDApCisJCQkJLy9yZXR1cm4gLTE7CisJCQlpZiAoY3R4LT5zcHJpdGVfYnJpZ2h0bmVzc19jaGFuZ2UpCisJCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJzcHJpdGVfYnJpZ2h0bmVzc19jaGFuZ2Ugbm90IHN1cHBvcnRlZFxuIik7CisJCQlpZiAoY3R4LT52b2xfc3ByaXRlX3VzYWdlID09IFNUQVRJQ19TUFJJVEUpCisJCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJzdGF0aWMgc3ByaXRlIG5vdCBzdXBwb3J0ZWRcbiIpOworCQl9IGVsc2UgeworCQkJbWVtc2V0KHMtPnNwcml0ZV9vZmZzZXQsIDAsIHNpemVvZihzLT5zcHJpdGVfb2Zmc2V0KSk7CisJCQltZW1zZXQocy0+c3ByaXRlX2RlbHRhLCAwLCBzaXplb2Yocy0+c3ByaXRlX2RlbHRhKSk7CisJCX0KKwl9CisKKwlpZiAoY3R4LT5zaGFwZSAhPSBCSU5fT05MWV9TSEFQRSkgeworCQlzLT5jaHJvbWFfcXNjYWxlID0gcy0+cXNjYWxlID0gZ2V0X2JpdHMoZ2IsIHMtPnF1YW50X3ByZWNpc2lvbik7CisJCWlmIChzLT5xc2NhbGUgPT0gMCkgeworCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJFcnJvciwgaGVhZGVyIGRhbWFnZWQgb3Igbm90IE1QRUctNCBoZWFkZXIgKHFzY2FsZT0wKVxuIik7CisJCQlyZXR1cm4gLTE7ICAvLyBtYWtlcyBubyBzZW5zZSB0byBjb250aW51ZSwgYXMgdGhlcmUgaXMgbm90aGluZyBsZWZ0IGZyb20gdGhlIGltYWdlIHRoZW4KKwkJfQorCisJCWlmIChzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKKwkJCXMtPmZfY29kZSA9IGdldF9iaXRzKGdiLCAzKTsgICAgICAgIC8qIGZjb2RlX2ZvciAqLworCQkJaWYgKHMtPmZfY29kZSA9PSAwKSB7CisJCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJFcnJvciwgaGVhZGVyIGRhbWFnZWQgb3Igbm90IE1QRUctNCBoZWFkZXIgKGZfY29kZT0wKVxuIik7CisJCQkJCXMtPmZfY29kZSA9IDE7CisJCQkJcmV0dXJuIC0xOyAgLy8gbWFrZXMgbm8gc2Vuc2UgdG8gY29udGludWUsIGFzIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCBmcm9tIHRoZSBpbWFnZSB0aGVuCisJCQl9CisJCX0gZWxzZQorCQkJcy0+Zl9jb2RlID0gMTsKKworCQlpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB7CisJCQlzLT5iX2NvZGUgPSBnZXRfYml0cyhnYiwgMyk7CisJCQlpZiAocy0+Yl9jb2RlID09IDApIHsKKwkJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgIkVycm9yLCBoZWFkZXIgZGFtYWdlZCBvciBub3QgTVBFRzQgaGVhZGVyIChiX2NvZGU9MClcbiIpOworCQkJCQlzLT5iX2NvZGU9MTsKKwkJCQlyZXR1cm4gLTE7IC8vIG1ha2VzIG5vIHNlbnNlIHRvIGNvbnRpbnVlLCBhcyB0aGUgTVYgZGVjb2Rpbmcgd2lsbCBicmVhayB2ZXJ5IHF1aWNrbHkKKwkJCX0KKwkJfSBlbHNlCisJCQlzLT5iX2NvZGUgPSAxOworCisJCWlmICgxKSB7CisJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsICJxcDolZCBmYzolZCwlZCAlcyBzaXplOiVkIHBybzolZCBhbHQ6JWQgdG9wOiVkICVzcGVsIHBhcnQ6JWQgcmVzeW5jOiVkIHc6JWQgYTolZCBybmQ6JWQgdm90OiVkJXMgZGM6JWQgY2U6JWQvJWQvJWQgdGltZTolbGQgdGluY3I6JWRcbiIsCisJCQkJcy0+cXNjYWxlLCBzLT5mX2NvZGUsIHMtPmJfY29kZSwKKwkJCQlzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kgPyAiSSIgOiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QID8gIlAiIDogKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiA/ICJCIiA6ICJTIikpLAorCQkJCWdiLT5zaXplX2luX2JpdHMscy0+cHJvZ3Jlc3NpdmVfc2VxdWVuY2UsIHMtPmFsdGVybmF0ZV9zY2FuLAorCQkJCXMtPnRvcF9maWVsZF9maXJzdCwgcy0+cXVhcnRlcl9zYW1wbGUgPyAicSIgOiAiaCIsCisJCQkJcy0+ZGF0YV9wYXJ0aXRpb25pbmcsIGN0eC0+cmVzeW5jX21hcmtlciwKKwkJCQljdHgtPm51bV9zcHJpdGVfd2FycGluZ19wb2ludHMsIHMtPnNwcml0ZV93YXJwaW5nX2FjY3VyYWN5LAorCQkJCTEgLSBzLT5ub19yb3VuZGluZywgcy0+dm9fdHlwZSwKKwkJCQljdHgtPnZvbF9jb250cm9sX3BhcmFtZXRlcnMgPyAiIFZPTEMiIDogIiAiLCBjdHgtPmludHJhX2RjX3RocmVzaG9sZCwKKwkJCQljdHgtPmNwbHhfZXN0aW1hdGlvbl90cmFzaF9pLCBjdHgtPmNwbHhfZXN0aW1hdGlvbl90cmFzaF9wLAorCQkJCWN0eC0+Y3BseF9lc3RpbWF0aW9uX3RyYXNoX2IsCisJCQkJcy0+dGltZSwKKwkJCQl0aW1lX2luY3JlbWVudCk7CisJCX0KKworCQlpZiAoIWN0eC0+c2NhbGFiaWxpdHkpIHsKKwkJCWlmIChjdHgtPnNoYXBlICE9IFJFQ1RfU0hBUEUgJiYgcy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9JKQorCQkJCXNraXBfYml0czEoZ2IpOyAgLy8gdm9wIHNoYXBlIGNvZGluZyB0eXBlCisJCX0gZWxzZSB7CisJCQlpZiAoY3R4LT5lbmhhbmNlbWVudF90eXBlKSB7CisJCQkJaW50IGxvYWRfYmFja3dhcmRfc2hhcGUgPSBnZXRfYml0czEoZ2IpOworCQkJCWlmIChsb2FkX2JhY2t3YXJkX3NoYXBlKQorCQkJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgImxvYWQgYmFja3dhcmQgc2hhcGUgaXNuJ3Qgc3VwcG9ydGVkXG4iKTsKKwkJCX0KKwkJCXNraXBfYml0cyhnYiwgMik7ICAvLyByZWZfc2VsZWN0X2NvZGUKKwkJfQorCX0KKwkvKiBkZXRlY3QgYnVnZ3kgZW5jb2RlcnMgd2hpY2ggZG9uJ3Qgc2V0IHRoZSBsb3dfZGVsYXkgZmxhZworCSogKGRpdng0L3h2aWQvb3BlbmRpdngpLiBOb3RlIHdlIGNhbm5vdCBkZXRlY3QgZGl2eDUgd2l0aG91dCBCLWZyYW1lcworCSogZWFzaWx5IChhbHRob3VnaCBpdCdzIGJ1Z2d5IHRvbykgKi8KKwlpZiAocy0+dm9fdHlwZSA9PSAwICYmIGN0eC0+dm9sX2NvbnRyb2xfcGFyYW1ldGVycyA9PSAwICYmCisJCWN0eC0+ZGl2eF92ZXJzaW9uID09IC0xICYmIHMtPnBpY3R1cmVfbnVtYmVyID09IDApIHsKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLCAibG9va3MgbGlrZSB0aGlzIGZpbGUgd2FzIGVuY29kZWQgd2l0aCAoZGl2eDQvKG9sZCl4dmlkL29wZW5kaXZ4KSAtPiBmb3JjaW5nIGxvd19kZWxheSBmbGFnXG4iKTsKKwkJCXMtPmxvd19kZWxheSA9IDE7CisJfQorCisJcy0+cGljdHVyZV9udW1iZXIrKzsgIC8vIGJldHRlciB0aGFuIHBpYyBudW1iZXI9PTAgYWx3YXlzIDspCisKKwkvLyBGSVhNRSBhZGQgc2hvcnQgaGVhZGVyIHN1cHBvcnQKKwkvL3MtPnlfZGNfc2NhbGVfdGFibGUgPSBmZl9tcGVnNF95X2RjX3NjYWxlX3RhYmxlOworCS8vcy0+Y19kY19zY2FsZV90YWJsZSA9IGZmX21wZWc0X2NfZGNfc2NhbGVfdGFibGU7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBEZWNvZGUgTVBFRy00IGhlYWRlcnMuCisgKiBAcmV0dXJuIDwwIGlmIG5vIFZPUCBmb3VuZCAob3IgYSBkYW1hZ2VkIG9uZSkKKyAqICAgICAgICAgRlJBTUVfU0tJUFBFRCBpZiBhIG5vdCBjb2RlZCBWT1AgaXMgZm91bmQKKyAqICAgICAgICAgMCBpZiBhIFZPUCBpcyBmb3VuZAorICovCitpbnQgZmZfbXBlZzRfZGVjb2RlX3BpY3R1cmVfaGVhZGVyKHN0cnVjdCBtcGVnNF9kZWNfcGFyYW0gKmN0eCwgc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKmdiKQoreworCXN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcyA9ICZjdHgtPm07CisKKwl1bnNpZ25lZCBzdGFydGNvZGUsIHY7CisJaW50IHJldDsKKwlpbnQgdm9sID0gMDsKKwlpbnQgYml0c19wZXJfcmF3X3NhbXBsZSA9IDA7CisKKwlzLT5jdHggPSBjdHg7CisKKwkvKiBzZWFyY2ggbmV4dCBzdGFydCBjb2RlICovCisJYWxpZ25fZ2V0X2JpdHMoZ2IpOworCisJLy8gSWYgd2UgaGF2ZSBub3Qgc3dpdGNoZWQgdG8gc3R1ZGlvIHByb2ZpbGUgdGhhbiB3ZSBhbHNvIGRpZCBub3Qgc3dpdGNoIGJwcworCS8vIHRoYXQgbWVhbnMgc29tZXRoaW5nIGVsc2UgKGxpa2UgYSBwcmV2aW91cyBpbnN0YW5jZSkgb3V0c2lkZSBzZXQgYnBzIHdoaWNoCisJLy8gd291bGQgYmUgaW5jb25zaXN0YW50IHdpdGggdGhlIGN1cnJlY3Qgc3RhdGUsIHRodXMgcmVzZXQgaXQKKwlpZiAoIXMtPnN0dWRpb19wcm9maWxlICYmIGJpdHNfcGVyX3Jhd19zYW1wbGUgIT0gOCkKKwkJYml0c19wZXJfcmF3X3NhbXBsZSA9IDA7CisKKwlpZiAoc2hvd19iaXRzKGdiLCAyNCkgPT0gMHg1NzU2MzApIHsKKwkJc2tpcF9iaXRzKGdiLCAyNCk7CisJCWlmIChnZXRfYml0cyhnYiwgOCkgPT0gMHhGMCkKKwkJCWdvdG8gZW5kOworCX0KKworCXN0YXJ0Y29kZSA9IDB4ZmY7CisJZm9yICg7OykgeworCQlpZiAoZ2V0X2JpdHNfY291bnQoZ2IpID49IGdiLT5zaXplX2luX2JpdHMpIHsKKwkJCWlmIChnYi0+c2l6ZV9pbl9iaXRzID09IDgpIHsKKwkJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsICJmcmFtZSBza2lwICVkXG4iLCBnYi0+c2l6ZV9pbl9iaXRzKTsKKwkJCQlyZXR1cm4gRlJBTUVfU0tJUFBFRDsgIC8vIGRpdnggYnVnCisJCQl9IGVsc2UKKwkJCQlyZXR1cm4gLTE7ICAvLyBlbmQgb2Ygc3RyZWFtCisJCX0KKworCQkvKiB1c2UgdGhlIGJpdHMgYWZ0ZXIgdGhlIHRlc3QgKi8KKwkJdiA9IGdldF9iaXRzKGdiLCA4KTsKKwkJc3RhcnRjb2RlID0gKChzdGFydGNvZGUgPDwgOCkgfCB2KSAmIDB4ZmZmZmZmZmY7CisKKwkJaWYgKChzdGFydGNvZGUgJiAweEZGRkZGRjAwKSAhPSAweDEwMCkKKwkJCWNvbnRpbnVlOyAgLy8gbm8gc3RhcnRjb2RlCisKKwkJaWYgKDEpIHsgLy9kZWJ1ZworCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLCAic3RhcnRjb2RlOiAlM1ggXG4iLCBzdGFydGNvZGUpOworCQkJaWYgKHN0YXJ0Y29kZSA8PSAweDExRikKKwkJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsICJWaWRlbyBPYmplY3QgU3RhcnRcbiIpOworCQkJZWxzZSBpZiAoc3RhcnRjb2RlIDw9IDB4MTJGKQorCQkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX1BBUlNFUiwgIlZpZGVvIE9iamVjdCBMYXllciBTdGFydFxuIik7CisJCQllbHNlIGlmIChzdGFydGNvZGUgPD0gMHgxM0YpCisJCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLCAiUmVzZXJ2ZWRcbiIpOworCQkJZWxzZSBpZiAoc3RhcnRjb2RlIDw9IDB4MTVGKQorCQkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX1BBUlNFUiwgIkZHUyBicCBzdGFydFxuIik7CisJCQllbHNlIGlmIChzdGFydGNvZGUgPD0gMHgxQUYpCisJCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLCAiUmVzZXJ2ZWRcbiIpOworCQkJZWxzZSBpZiAoc3RhcnRjb2RlID09IDB4MUIwKQorCQkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX1BBUlNFUiwgIlZpc3VhbCBPYmplY3QgU2VxIFN0YXJ0XG4iKTsKKwkJCWVsc2UgaWYgKHN0YXJ0Y29kZSA9PSAweDFCMSkKKwkJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsICJWaXN1YWwgT2JqZWN0IFNlcSBFbmRcbiIpOworCQkJZWxzZSBpZiAoc3RhcnRjb2RlID09IDB4MUIyKQorCQkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX1BBUlNFUiwgIlVzZXIgRGF0YVxuIik7CisJCQllbHNlIGlmIChzdGFydGNvZGUgPT0gMHgxQjMpCisJCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLCAiR3JvdXAgb2YgVk9QIHN0YXJ0XG4iKTsKKwkJCWVsc2UgaWYgKHN0YXJ0Y29kZSA9PSAweDFCNCkKKwkJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsICJWaWRlbyBTZXNzaW9uIEVycm9yXG4iKTsKKwkJCWVsc2UgaWYgKHN0YXJ0Y29kZSA9PSAweDFCNSkKKwkJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsICJWaXN1YWwgT2JqZWN0IFN0YXJ0XG4iKTsKKwkJCWVsc2UgaWYgKHN0YXJ0Y29kZSA9PSAweDFCNikKKwkJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsICJWaWRlbyBPYmplY3QgUGxhbmUgc3RhcnRcbiIpOworCQkJZWxzZSBpZiAoc3RhcnRjb2RlID09IDB4MUI3KQorCQkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX1BBUlNFUiwgInNsaWNlIHN0YXJ0XG4iKTsKKwkJCWVsc2UgaWYgKHN0YXJ0Y29kZSA9PSAweDFCOCkKKwkJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsICJleHRlbnNpb24gc3RhcnRcbiIpOworCQkJZWxzZSBpZiAoc3RhcnRjb2RlID09IDB4MUI5KQorCQkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX1BBUlNFUiwgImZncyBzdGFydFxuIik7CisJCQllbHNlIGlmIChzdGFydGNvZGUgPT0gMHgxQkEpCisJCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLCAiRkJBIE9iamVjdCBzdGFydFxuIik7CisJCQllbHNlIGlmIChzdGFydGNvZGUgPT0gMHgxQkIpCisJCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLCAiRkJBIE9iamVjdCBQbGFuZSBzdGFydFxuIik7CisJCQllbHNlIGlmIChzdGFydGNvZGUgPT0gMHgxQkMpCisJCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLCAiTWVzaCBPYmplY3Qgc3RhcnRcbiIpOworCQkJZWxzZSBpZiAoc3RhcnRjb2RlID09IDB4MUJEKQorCQkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX1BBUlNFUiwgIk1lc2ggT2JqZWN0IFBsYW5lIHN0YXJ0XG4iKTsKKwkJCWVsc2UgaWYgKHN0YXJ0Y29kZSA9PSAweDFCRSkKKwkJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsICJTdGlsbCBUZXh0dXJlIE9iamVjdCBzdGFydFxuIik7CisJCQllbHNlIGlmIChzdGFydGNvZGUgPT0gMHgxQkYpCisJCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLCAiVGV4dHVyZSBTcGF0aWFsIExheWVyIHN0YXJ0XG4iKTsKKwkJCWVsc2UgaWYgKHN0YXJ0Y29kZSA9PSAweDFDMCkKKwkJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsICJUZXh0dXJlIFNOUiBMYXllciBzdGFydFxuIik7CisJCQllbHNlIGlmIChzdGFydGNvZGUgPT0gMHgxQzEpCisJCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLCAiVGV4dHVyZSBUaWxlIHN0YXJ0XG4iKTsKKwkJCWVsc2UgaWYgKHN0YXJ0Y29kZSA9PSAweDFDMikKKwkJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsICJUZXh0dXJlIFNoYXBlIExheWVyIHN0YXJ0XG4iKTsKKwkJCWVsc2UgaWYgKHN0YXJ0Y29kZSA9PSAweDFDMykKKwkJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsICJzdHVmZmluZyBzdGFydFxuIik7CisJCQllbHNlIGlmIChzdGFydGNvZGUgPD0gMHgxQzUpCisJCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLCAicmVzZXJ2ZWRcbiIpOworCQkJZWxzZSBpZiAoc3RhcnRjb2RlIDw9IDB4MUZGKQorCQkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX1BBUlNFUiwgIlN5c3RlbSBzdGFydFxuIik7CisJCX0KKworCQlpZiAoc3RhcnRjb2RlID49IDB4MTIwICYmIHN0YXJ0Y29kZSA8PSAweDEyRikgeworCQkJaWYgKHZvbCkgeworCQkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAiSWdub3JpbmcgbXVsdGlwbGUgVk9MIGhlYWRlcnNcbiIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJdm9sKys7CisJCQlpZiAoKHJldCA9IGRlY29kZV92b2xfaGVhZGVyKGN0eCwgZ2IpKSA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJfSBlbHNlIGlmIChzdGFydGNvZGUgPT0gVVNFUl9EQVRBX1NUQVJUQ09ERSkgeworCQkJZGVjb2RlX3VzZXJfZGF0YShjdHgsIGdiKTsKKwkJfSBlbHNlIGlmIChzdGFydGNvZGUgPT0gR09QX1NUQVJUQ09ERSkgeworCQkJbXBlZzRfZGVjb2RlX2dvcF9oZWFkZXIocywgZ2IpOworCQl9IGVsc2UgaWYgKHN0YXJ0Y29kZSA9PSBWT1NfU1RBUlRDT0RFKSB7CisJCWludCBwcm9maWxlLCBsZXZlbDsKKwkJbXBlZzRfZGVjb2RlX3Byb2ZpbGVfbGV2ZWwocywgZ2IsICZwcm9maWxlLCAmbGV2ZWwpOworCQlpZiAocHJvZmlsZSA9PSBGRl9QUk9GSUxFX01QRUc0X1NJTVBMRV9TVFVESU8gJiYKKwkJCShsZXZlbCA+IDAgJiYgbGV2ZWwgPCA5KSkgeworCQkJCXMtPnN0dWRpb19wcm9maWxlID0gMTsKKwkJCQluZXh0X3N0YXJ0X2NvZGVfc3R1ZGlvKGdiKTsKKwkJCQlleHRlbnNpb25fYW5kX3VzZXJfZGF0YShzLCBnYiwgMCk7CisJCQl9IGVsc2UgaWYgKHMtPnN0dWRpb19wcm9maWxlKSB7CisJCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJNaXhlcyBzdHVkaW8gYW5kIG5vbiBzdHVkaW8gcHJvZmlsZVxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJY3R4LT5wcm9maWxlID0gcHJvZmlsZTsKKwkJCWN0eC0+bGV2ZWwgICA9IGxldmVsOworCQl9IGVsc2UgaWYgKHN0YXJ0Y29kZSA9PSBWSVNVQUxfT0JKX1NUQVJUQ09ERSkgeworCQkJaWYgKHMtPnN0dWRpb19wcm9maWxlKSB7CisJCQkJaWYgKChyZXQgPSBkZWNvZGVfc3R1ZGlvdmlzdWFsb2JqZWN0KGN0eCwgZ2IpKSA8IDApCisJCQkJCXJldHVybiByZXQ7CisJCQl9IGVsc2UKKwkJCW1wZWc0X2RlY29kZV92aXN1YWxfb2JqZWN0KHMsIGdiKTsKKwkJfSBlbHNlIGlmIChzdGFydGNvZGUgPT0gVk9QX1NUQVJUQ09ERSkgeworCQkJYnJlYWs7CisJCX0KKworCQlhbGlnbl9nZXRfYml0cyhnYik7CisJCXN0YXJ0Y29kZSA9IDB4ZmY7CisJfQorCitlbmQ6CisJaWYgKHMtPnN0dWRpb19wcm9maWxlKSB7CisJCWlmICghYml0c19wZXJfcmF3X3NhbXBsZSkgeworCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJNaXNzaW5nIFZPTCBoZWFkZXJcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXJldHVybiBkZWNvZGVfc3R1ZGlvX3ZvcF9oZWFkZXIoY3R4LCBnYik7CisJfSBlbHNlCisJCXJldHVybiBkZWNvZGVfdm9wX2hlYWRlcihjdHgsIGdiKTsKK30KKworaW50IG1wZWc0X2RlY29kZV9leHRyYWRhdGFfcHModTggKmJ1ZiwgaW50IHNpemUsIHN0cnVjdCBtcGVnNF9wYXJhbV9zZXRzICpwcykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgZ2V0X2JpdHNfY29udGV4dCBnYjsKKworCXBzLT5oZWFkX3BhcnNlZCA9IGZhbHNlOworCisJaW5pdF9nZXRfYml0czgoJmdiLCBidWYsIHNpemUpOworCisJcmV0ID0gZmZfbXBlZzRfZGVjb2RlX3BpY3R1cmVfaGVhZGVyKCZwcy0+ZGVjX3BzLCAmZ2IpOworCWlmIChyZXQgPCAtMSkgeworCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgIkZhaWxlZCB0byBwYXJzZSBleHRyYWRhdGFcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChwcy0+ZGVjX3BzLm0ud2lkdGggJiYgcHMtPmRlY19wcy5tLmhlaWdodCkKKwkJcHMtPmhlYWRfcGFyc2VkID0gdHJ1ZTsKKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FtdmRlY19wb3J0cy9kZWNvZGVyL2FtbF9tcGVnNF9wYXJzZXIuaCBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2RlY29kZXIvYW1sX21wZWc0X3BhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YjcxY2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FtdmRlY19wb3J0cy9kZWNvZGVyL2FtbF9tcGVnNF9wYXJzZXIuaApAQCAtMCwwICsxLDI1OSBAQAorI2lmbmRlZiBBVkNPREVDX01QRUc0VklERU9fSAorI2RlZmluZSBBVkNPREVDX01QRUc0VklERU9fSAorCisjaW5jbHVkZSAiLi4vYW1sX3Zjb2RlY19kcnYuaCIKKyNpbmNsdWRlICIuLi91dGlscy9jb21tb24uaCIKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9WNExfU09GVFdBUkVfUEFSU0VSCisjaW5jbHVkZSAiLi4vdXRpbHMvcGl4Zm10LmgiCisjZW5kaWYKKworLy9tcGVnNCBwcm9maWxlCisjZGVmaW5lIEZGX1BST0ZJTEVfTVBFRzRfU0lNUExFICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBGRl9QUk9GSUxFX01QRUc0X1NJTVBMRV9TQ0FMQUJMRSAgICAgICAgICAgIDEKKyNkZWZpbmUgRkZfUFJPRklMRV9NUEVHNF9DT1JFICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEZGX1BST0ZJTEVfTVBFRzRfTUFJTiAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBGRl9QUk9GSUxFX01QRUc0X05fQklUICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgRkZfUFJPRklMRV9NUEVHNF9TQ0FMQUJMRV9URVhUVVJFICAgICAgICAgICA1CisjZGVmaW5lIEZGX1BST0ZJTEVfTVBFRzRfU0lNUExFX0ZBQ0VfQU5JTUFUSU9OICAgICAgNgorI2RlZmluZSBGRl9QUk9GSUxFX01QRUc0X0JBU0lDX0FOSU1BVEVEX1RFWFRVUkUgICAgIDcKKyNkZWZpbmUgRkZfUFJPRklMRV9NUEVHNF9IWUJSSUQgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIEZGX1BST0ZJTEVfTVBFRzRfQURWQU5DRURfUkVBTF9USU1FICAgICAgICAgOQorI2RlZmluZSBGRl9QUk9GSUxFX01QRUc0X0NPUkVfU0NBTEFCTEUgICAgICAgICAgICAgMTAKKyNkZWZpbmUgRkZfUFJPRklMRV9NUEVHNF9BRFZBTkNFRF9DT0RJTkcgICAgICAgICAgIDExCisjZGVmaW5lIEZGX1BST0ZJTEVfTVBFRzRfQURWQU5DRURfQ09SRSAgICAgICAgICAgICAxMgorI2RlZmluZSBGRl9QUk9GSUxFX01QRUc0X0FEVkFOQ0VEX1NDQUxBQkxFX1RFWFRVUkUgMTMKKyNkZWZpbmUgRkZfUFJPRklMRV9NUEVHNF9TSU1QTEVfU1RVRElPICAgICAgICAgICAgIDE0CisjZGVmaW5lIEZGX1BST0ZJTEVfTVBFRzRfQURWQU5DRURfU0lNUExFICAgICAgICAgICAxNQorCisvLyBzaGFwZXMKKyNkZWZpbmUgUkVDVF9TSEFQRSAgICAgICAwCisjZGVmaW5lIEJJTl9TSEFQRSAgICAgICAgMQorI2RlZmluZSBCSU5fT05MWV9TSEFQRSAgIDIKKyNkZWZpbmUgR1JBWV9TSEFQRSAgICAgICAzCisKKyNkZWZpbmUgU0lNUExFX1ZPX1RZUEUgICAgICAgICAgIDEKKyNkZWZpbmUgQ09SRV9WT19UWVBFICAgICAgICAgICAgIDMKKyNkZWZpbmUgTUFJTl9WT19UWVBFICAgICAgICAgICAgIDQKKyNkZWZpbmUgTkJJVF9WT19UWVBFICAgICAgICAgICAgIDUKKyNkZWZpbmUgQVJUU19WT19UWVBFICAgICAgICAgICAgMTAKKyNkZWZpbmUgQUNFX1ZPX1RZUEUgICAgICAgICAgICAgMTIKKyNkZWZpbmUgU0lNUExFX1NUVURJT19WT19UWVBFICAgMTQKKyNkZWZpbmUgQ09SRV9TVFVESU9fVk9fVFlQRSAgICAgMTUKKyNkZWZpbmUgQURWX1NJTVBMRV9WT19UWVBFICAgICAgMTcKKworI2RlZmluZSBWT1RfVklERU9fSUQgMQorI2RlZmluZSBWT1RfU1RJTExfVEVYVFVSRV9JRCAyCisKKyNkZWZpbmUgRkZfUFJPRklMRV9VTktOT1dOIC05OQorI2RlZmluZSBGRl9QUk9GSUxFX1JFU0VSVkVEIC0xMDAKKworLy8gYXNwZWN0X3JhdGlvX2luZm8KKyNkZWZpbmUgRVhURU5ERURfUEFSIDE1CisKKy8vdm9sX3Nwcml0ZV91c2FnZSAvIHNwcml0ZV9lbmFibGUKKyNkZWZpbmUgU1RBVElDX1NQUklURSAxCisjZGVmaW5lIEdNQ19TUFJJVEUgMgorCisjZGVmaW5lIE1PVElPTl9NQVJLRVIgMHgxRjAwMQorI2RlZmluZSBEQ19NQVJLRVIgICAgIDB4NkIwMDEKKworI2RlZmluZSBWT1NfU1RBUlRDT0RFICAgICAgICAweDFCMAorI2RlZmluZSBVU0VSX0RBVEFfU1RBUlRDT0RFICAweDFCMgorI2RlZmluZSBHT1BfU1RBUlRDT0RFICAgICAgICAweDFCMworI2RlZmluZSBWSVNVQUxfT0JKX1NUQVJUQ09ERSAweDFCNQorI2RlZmluZSBWT1BfU1RBUlRDT0RFICAgICAgICAweDFCNgorI2RlZmluZSBTTElDRV9TVEFSVENPREUgICAgICAweDFCNworI2RlZmluZSBFWFRfU1RBUlRDT0RFICAgICAgICAweDFCOAorCisjZGVmaW5lIFFVQU5UX01BVFJJWF9FWFRfSUQgIDB4MworCisvKiBzbWFsbGVyIHBhY2tldHMgbGlrZWx5IGRvbid0IGNvbnRhaW4gYSByZWFsIGZyYW1lICovCisjZGVmaW5lIE1BWF9OVk9QX1NJWkUgMTkKKworI2RlZmluZSBJU18zSVYxIDAKKworI2RlZmluZSBDSFJPTUFfNDIwIDEKKyNkZWZpbmUgQ0hST01BXzQyMiAyCisjZGVmaW5lIENIUk9NQV80NDQgMworCisjZGVmaW5lIEZGX0FTUEVDVF9FWFRFTkRFRCAxNQorCisjZGVmaW5lIEFWX05PUFRTX1ZBTFVFICAgICAgICAgIChMT05HX01JTikKKworLyoqCisgKiBSZXR1cm4gdmFsdWUgZm9yIGhlYWRlciBwYXJzZXJzIGlmIGZyYW1lIGlzIG5vdCBjb2RlZC4KKyAqICovCisjZGVmaW5lIEZSQU1FX1NLSVBQRUQgMTAwCisKK2VudW0gQVZQaWN0dXJlVHlwZSB7CisgICAgQVZfUElDVFVSRV9UWVBFX05PTkUgPSAwLCAvLy88IFVuZGVmaW5lZAorICAgIEFWX1BJQ1RVUkVfVFlQRV9JLCAgICAgLy8vPCBJbnRyYQorICAgIEFWX1BJQ1RVUkVfVFlQRV9QLCAgICAgLy8vPCBQcmVkaWN0ZWQKKyAgICBBVl9QSUNUVVJFX1RZUEVfQiwgICAgIC8vLzwgQmktZGlyIHByZWRpY3RlZAorICAgIEFWX1BJQ1RVUkVfVFlQRV9TLCAgICAgLy8vPCBTKEdNQyktVk9QIE1QRUctNAorICAgIEFWX1BJQ1RVUkVfVFlQRV9TSSwgICAgLy8vPCBTd2l0Y2hpbmcgSW50cmEKKyAgICBBVl9QSUNUVVJFX1RZUEVfU1AsICAgIC8vLzwgU3dpdGNoaW5nIFByZWRpY3RlZAorICAgIEFWX1BJQ1RVUkVfVFlQRV9CSSwgICAgLy8vPCBCSSB0eXBlCit9OworCitzdHJ1Y3QgVkxDIHsKKwlpbnQgYml0czsKKwlzaG9ydCAoKnRhYmxlKVsyXTsgLy8vPCBjb2RlLCBiaXRzCisJaW50IHRhYmxlX3NpemUsIHRhYmxlX2FsbG9jYXRlZDsKK307CisKKy8qKgorICogTXBlZ0VuY0NvbnRleHQuCisgKi8KK3N0cnVjdCBNcGVnRW5jQ29udGV4dCB7CisJc3RydWN0IG1wZWc0X2RlY19wYXJhbSAqY3R4OworCisJLyogdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGVuY29kaW5nICovCisJaW50IHdpZHRoLCBoZWlnaHQ7Ly8vPCBwaWN0dXJlIHNpemUuIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNgorCWludCBjb2RlY190YWc7ICAgICAgICAgICAgIC8vLzwgaW50ZXJuYWwgY29kZWNfdGFnIHVwcGVyIGNhc2UgY29udmVydGVkIGZyb20gYXZjdHggY29kZWNfdGFnCisJaW50IHBpY3R1cmVfbnVtYmVyOyAgICAgICAvL0ZJWE1FIHJlbW92ZSwgdW5jbGVhciBkZWZpbml0aW9uCisKKwkvKiogbWF0cml4IHRyYW5zbWl0dGVkIGluIHRoZSBiaXRzdHJlYW0gKi8KKwl1MTYgaW50cmFfbWF0cml4WzY0XTsKKwl1MTYgY2hyb21hX2ludHJhX21hdHJpeFs2NF07CisJdTE2IGludGVyX21hdHJpeFs2NF07CisJdTE2IGNocm9tYV9pbnRlcl9tYXRyaXhbNjRdOworCisJLyogTVBFRy00IHNwZWNpZmljICovCisJaW50IHN0dWRpb19wcm9maWxlOworCWludCB0aW1lX2Jhc2U7ICAgICAgICAgICAgICAgICAgLy8vPCB0aW1lIGluIHNlY29uZHMgb2YgbGFzdCBJLFAsUyBGcmFtZQorCWludCBxdWFudF9wcmVjaXNpb247CisJaW50IHF1YXJ0ZXJfc2FtcGxlOyAgICAgICAgICAgICAgLy8vPCAxLT5xcGVsLCAwLT5oYWxmIHBlbCBNRS9NQworCWludCBhc3BlY3RfcmF0aW9faW5mbzsgLy9GSVhNRSByZW1vdmUKKwlpbnQgc3ByaXRlX3dhcnBpbmdfYWNjdXJhY3k7CisJaW50IGRhdGFfcGFydGl0aW9uaW5nOyAgICAgICAgICAgLy8vPCBkYXRhIHBhcnRpdGlvbmluZyBmbGFnIGZyb20gaGVhZGVyCisJaW50IGxvd19kZWxheTsgICAgICAgICAgICAgICAgICAgLy8vPCBubyByZW9yZGVyaW5nIG5lZWRlZCAvIGhhcyBubyBCLWZyYW1lcworCWludCB2b190eXBlOworCWludCBtcGVnX3F1YW50OworCisJLyogZGl2eCBzcGVjaWZpYywgdXNlZCB0byB3b3JrYXJvdW5kIChtYW55KSBidWdzIGluIGRpdng1ICovCisJaW50IGRpdnhfcGFja2VkOworCisJLyogTVBFRy0yLXNwZWNpZmljIC0gSSB3aXNoZWQgbm90IHRvIGhhdmUgdG8gc3VwcG9ydCB0aGlzIG1lc3MuICovCisJaW50IHByb2dyZXNzaXZlX3NlcXVlbmNlOworCisJaW50IHByb2dyZXNzaXZlX2ZyYW1lOworCWludCBpbnRlcmxhY2VkX2RjdDsKKworCWludCBoX2VkZ2VfcG9zLCB2X2VkZ2VfcG9zOy8vLzwgaG9yaXpvbnRhbCAvIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSByaWdodC9ib3R0b20gZWRnZSAocGl4ZWwgcmVwbGljYXRpb24pCisJY29uc3QgdTggKnlfZGNfc2NhbGVfdGFibGU7ICAgICAvLy88IHFzY2FsZSAtPiB5X2RjX3NjYWxlIHRhYmxlCisJY29uc3QgdTggKmNfZGNfc2NhbGVfdGFibGU7ICAgICAvLy88IHFzY2FsZSAtPiBjX2RjX3NjYWxlIHRhYmxlCisJaW50IHFzY2FsZTsJCSAgICAvLy88IFFQCisJaW50IGNocm9tYV9xc2NhbGU7CSAgICAvLy88IGNocm9tYSBRUAorCWludCBwaWN0X3R5cGU7CQkgICAgLy8vPCBBVl9QSUNUVVJFX1RZUEVfSSwgQVZfUElDVFVSRV9UWVBFX1AsIEFWX1BJQ1RVUkVfVFlQRV9CLCAuLi4KKwlpbnQgZl9jb2RlOwkJICAgIC8vLzwgZm9yd2FyZCBNViByZXNvbHV0aW9uCisJaW50IGJfY29kZTsJCSAgICAvLy88IGJhY2t3YXJkIE1WIHJlc29sdXRpb24gZm9yIEItZnJhbWVzIChNUEVHLTQpCisJaW50IG5vX3JvdW5kaW5nOyAgLyoqPCBhcHBseSBubyByb3VuZGluZyB0byBtb3Rpb24gY29tcGVuc2F0aW9uIChNUEVHLTQsIG1zbXBlZzQsIC4uLikKKwkgICAgZm9yIEItZnJhbWVzIHJvdW5kaW5nIG1vZGUgaXMgYWx3YXlzIDAgKi8KKwlpbnQgbGFzdF90aW1lX2Jhc2U7CisJbG9uZyB0aW1lOwkJICAgIC8vLzwgdGltZSBvZiBjdXJyZW50IGZyYW1lCisJbG9uZyBsYXN0X25vbl9iX3RpbWU7CisJdTE2IHBwX3RpbWU7CQkgICAgLy8vPCB0aW1lIGRpc3RhbmNlIGJldHdlZW4gdGhlIGxhc3QgMiBwLHMsaSBmcmFtZXMKKwl1MTYgcGJfdGltZTsJCSAgICAvLy88IHRpbWUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgbGFzdCBiIGFuZCBwLHMsaSBmcmFtZQorCXUxNiBwcF9maWVsZF90aW1lOworCXUxNiBwYl9maWVsZF90aW1lOwkgICAgLy8vPCBsaWtlIGFib3ZlLCBqdXN0IGZvciBpbnRlcmxhY2VkCisJaW50IHJlYWxfc3ByaXRlX3dhcnBpbmdfcG9pbnRzOworCWludCBzcHJpdGVfb2Zmc2V0WzJdWzJdOwkgICAgIC8vLzwgc3ByaXRlIG9mZnNldFtpc0Nocm9tYV1baXNNVlldCisJaW50IHNwcml0ZV9kZWx0YVsyXVsyXTsJICAgICAvLy88IHNwcml0ZV9kZWx0YSBbaXNZXVtpc01WWV0KKwlpbnQgbWNzZWw7CisJaW50IHBhcnRpdGlvbmVkX2ZyYW1lOwkgICAgIC8vLzwgaXMgY3VycmVudCBmcmFtZSBwYXJ0aXRpb25lZAorCWludCB0b3BfZmllbGRfZmlyc3Q7CisJaW50IGFsdGVybmF0ZV9zY2FuOworCWludCBsYXN0X2RjWzNdOyAgICAgICAgICAgICAgICAvLy88IGxhc3QgREMgdmFsdWVzIGZvciBNUEVHLTEKKwlpbnQgZGN0X3ByZWNpc2lvbjsKKwlpbnQgaW50cmFfZGNfcHJlY2lzaW9uOworCWludCBmcmFtZV9wcmVkX2ZyYW1lX2RjdDsKKwlpbnQgcV9zY2FsZV90eXBlOworCWludCBjb250ZXh0X3JlaW5pdDsKKwlpbnQgY2hyb21hX2Zvcm1hdDsKK307CisKK3N0cnVjdCBtcGVnNF9kZWNfcGFyYW0geworCXN0cnVjdCBNcGVnRW5jQ29udGV4dCBtOworCisJLy8vIG51bWJlciBvZiBiaXRzIHRvIHJlcHJlc2VudCB0aGUgZnJhY3Rpb25hbCBwYXJ0IG9mIHRpbWUKKwlpbnQgdGltZV9pbmNyZW1lbnRfYml0czsKKwlpbnQgc2hhcGU7CisJaW50IHZvbF9zcHJpdGVfdXNhZ2U7CisJaW50IHNwcml0ZV9icmlnaHRuZXNzX2NoYW5nZTsKKwlpbnQgbnVtX3Nwcml0ZV93YXJwaW5nX3BvaW50czsKKwkvLy8gc3ByaXRlIHRyYWplY3RvcnkgcG9pbnRzCisJdTE2IHNwcml0ZV90cmFqWzRdWzJdOworCS8vLyBzcHJpdGUgc2hpZnQgW2lzQ2hyb21hXQorCWludCBzcHJpdGVfc2hpZnRbMl07CisKKwkvLyByZXZlcnNpYmxlIHZsYworCWludCBydmxjOworCS8vLyBjb3VsZCB0aGlzIHN0cmVhbSBjb250YWluIHJlc3luYyBtYXJrZXJzCisJaW50IHJlc3luY19tYXJrZXI7CisJLy8vIHRpbWUgZGlzdGFuY2Ugb2YgZmlyc3QgSSAtPiBCLCB1c2VkIGZvciBpbnRlcmxhY2VkIEItZnJhbWVzCisJaW50IHRfZnJhbWU7CisKKwlpbnQgbmV3X3ByZWQ7CisJaW50IGVuaGFuY2VtZW50X3R5cGU7CisJaW50IHNjYWxhYmlsaXR5OworCWludCB1c2VfaW50cmFfZGNfdmxjOworCisJLy8vIFFQIGFib3ZlIHdoaWNoIHRoZSBhYyBWTEMgc2hvdWxkIGJlIHVzZWQgZm9yIGludHJhIGRjCisJaW50IGludHJhX2RjX3RocmVzaG9sZDsKKworCS8qIGJ1ZyB3b3JrYXJvdW5kcyAqLworCWludCBkaXZ4X3ZlcnNpb247CisJaW50IGRpdnhfYnVpbGQ7CisJaW50IHh2aWRfYnVpbGQ7CisJaW50IGxhdmNfYnVpbGQ7CisKKwkvLy8gZmxhZyBmb3IgaGF2aW5nIHNob3duIHRoZSB3YXJuaW5nIGFib3V0IGludmFsaWQgRGl2eCBCLWZyYW1lcworCWludCBzaG93ZWRfcGFja2VkX3dhcm5pbmc7CisJLyoqIGRvZXMgdGhlIHN0cmVhbSBjb250YWluIHRoZSBsb3dfZGVsYXkgZmxhZywKKwkqICB1c2VkIHRvIHdvcmsgYXJvdW5kIGJ1Z2d5IGVuY29kZXJzLiAqLworCWludCB2b2xfY29udHJvbF9wYXJhbWV0ZXJzOworCWludCBjcGx4X2VzdGltYXRpb25fdHJhc2hfaTsKKwlpbnQgY3BseF9lc3RpbWF0aW9uX3RyYXNoX3A7CisJaW50IGNwbHhfZXN0aW1hdGlvbl90cmFzaF9iOworCisJc3RydWN0IFZMQyBzdHVkaW9faW50cmFfdGFiWzEyXTsKKwlzdHJ1Y3QgVkxDIHN0dWRpb19sdW1hX2RjOworCXN0cnVjdCBWTEMgc3R1ZGlvX2Nocm9tYV9kYzsKKworCWludCByZ2I7CisKKwlzdHJ1Y3QgQVZSYXRpb25hbCB0aW1lX2Jhc2U7CisJaW50IHRpY2tzX3Blcl9mcmFtZTsKKwlzdHJ1Y3QgQVZSYXRpb25hbCBzYW1wbGVfYXNwZWN0X3JhdGlvOworCWVudW0gQVZDb2xvclByaW1hcmllcyBjb2xvcl9wcmltYXJpZXM7CisJZW51bSBBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYyBjb2xvcl90cmM7CisJZW51bSBBVkNvbG9yU3BhY2UgY29sb3JzcGFjZTsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9WNExfU09GVFdBUkVfUEFSU0VSCisJZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7CisJZW51bSBBVkNvbG9yUmFuZ2UgY29sb3JfcmFuZ2U7CisJZW51bSBBVkNocm9tYUxvY2F0aW9uIGNocm9tYV9zYW1wbGVfbG9jYXRpb247CisjZW5kaWYKKwlpbnQgZXJyX3JlY29nbml0aW9uOworCWludCBpZGN0X2FsZ287CisJaW50IGJpdHNfcGVyX3Jhd19zYW1wbGU7CisJaW50IHByb2ZpbGU7CisJaW50IGxldmVsOworCXN0cnVjdCBBVlJhdGlvbmFsIGZyYW1lcmF0ZTsKKwlpbnQgZmxhZ3M7Cit9OworCitzdHJ1Y3QgbXBlZzRfcGFyYW1fc2V0cyB7CisJYm9vbCBoZWFkX3BhcnNlZDsKKwkvKiBjdXJyZW50bHkgYWN0aXZlIHBhcmFtZXRlciBzZXRzICovCisJc3RydWN0IG1wZWc0X2RlY19wYXJhbSBkZWNfcHM7Cit9OworCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfVjRMX1NPRlRXQVJFX1BBUlNFUgoraW50IG1wZWc0X2RlY29kZV9leHRyYWRhdGFfcHModTggKmJ1ZiwgaW50IHNpemUsIHN0cnVjdCBtcGVnNF9wYXJhbV9zZXRzICpwcyk7CisjZWxzZQoraW5saW5lIGludCBtcGVnNF9kZWNvZGVfZXh0cmFkYXRhX3BzKHU4ICpidWYsIGludCBzaXplLCBzdHJ1Y3QgbXBlZzRfcGFyYW1fc2V0cyAqcHMpIHsgcmV0dXJuIC0xOyB9CisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2RlY29kZXIvYW1sX3ZwOV9wYXJzZXIuYyBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2RlY29kZXIvYW1sX3ZwOV9wYXJzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWQ1MjgzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvZGVjb2Rlci9hbWxfdnA5X3BhcnNlci5jCkBAIC0wLDAgKzEsMjk5IEBACisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworI2luY2x1ZGUgImFtbF92cDlfcGFyc2VyLmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICIuLi91dGlscy9wdXRfYml0cy5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2dvbG9tYi5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2NvbW1vbi5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKKyNkZWZpbmUgVlA5X1NZTkNDT0RFIDB4NDk4MzQyCisKK3N0YXRpYyBpbnQgcmVhZF9jb2xvcnNwYWNlX2RldGFpbHMoc3RydWN0IFZQOUNvbnRleHQgKnMsIGludCBwcm9maWxlKQoreworCXN0YXRpYyBjb25zdCBlbnVtIEFWQ29sb3JTcGFjZSBjb2xvcnNwYWNlc1s4XSA9IHsKKwkJQVZDT0xfU1BDX1VOU1BFQ0lGSUVELCBBVkNPTF9TUENfQlQ0NzBCRywgQVZDT0xfU1BDX0JUNzA5LCBBVkNPTF9TUENfU01QVEUxNzBNLAorCQlBVkNPTF9TUENfU01QVEUyNDBNLCBBVkNPTF9TUENfQlQyMDIwX05DTCwgQVZDT0xfU1BDX1JFU0VSVkVELCBBVkNPTF9TUENfUkdCLAorCX07CisKKwllbnVtIEFWQ29sb3JTcGFjZSBjb2xvcnNwYWNlOworCWludCBjb2xvcl9yYW5nZTsKKwlpbnQgYml0cyA9IHByb2ZpbGUgPD0gMSA/IDAgOiAxICsgZ2V0X2JpdHMxKCZzLT5nYik7IC8vIDA6OCwgMToxMCwgMjoxMgorCisJcy0+YnBwX2luZGV4ID0gYml0czsKKwlzLT5zLmguYnBwID0gOCArIGJpdHMgKiAyOworCXMtPmJ5dGVzcGVycGl4ZWwgPSAoNyArIHMtPnMuaC5icHApID4+IDM7CisJY29sb3JzcGFjZSA9IGNvbG9yc3BhY2VzW2dldF9iaXRzKCZzLT5nYiwgMyldOworCWlmIChjb2xvcnNwYWNlID09IEFWQ09MX1NQQ19SR0IpIHsgLy8gUkdCID0gcHJvZmlsZSAxCisJCWlmIChwcm9maWxlICYgMSkgeworCQkJaWYgKGdldF9iaXRzMSgmcy0+Z2IpKSB7CisJCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJSZXNlcnZlZCBiaXQgc2V0IGluIFJHQlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgeworCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJSR0Igbm90IHN1cHBvcnRlZCBpbiBwcm9maWxlICVkXG4iLCBwcm9maWxlKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0gZWxzZSB7CisJCXN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdF9mb3Jfc3NbM11bMiAvKiB2ICovXVsyIC8qIGggKi9dID0geworCQkJeyB7IEFWX1BJWF9GTVRfWVVWNDQ0UCwgQVZfUElYX0ZNVF9ZVVY0MjJQIH0sCisJCQl7IEFWX1BJWF9GTVRfWVVWNDQwUCwgQVZfUElYX0ZNVF9ZVVY0MjBQIH0gfSwKKwkJCXsgeyBBVl9QSVhfRk1UX1lVVjQ0NFAxMCwgQVZfUElYX0ZNVF9ZVVY0MjJQMTAgfSwKKwkJCXsgQVZfUElYX0ZNVF9ZVVY0NDBQMTAsIEFWX1BJWF9GTVRfWVVWNDIwUDEwIH0gfSwKKwkJCXsgeyBBVl9QSVhfRk1UX1lVVjQ0NFAxMiwgQVZfUElYX0ZNVF9ZVVY0MjJQMTIgfSwKKwkJCXsgQVZfUElYX0ZNVF9ZVVY0NDBQMTIsIEFWX1BJWF9GTVRfWVVWNDIwUDEyIH0gfX07CisJCWNvbG9yX3JhbmdlID0gZ2V0X2JpdHMxKCZzLT5nYikgPyAyIDogMTsKKwkJaWYgKHByb2ZpbGUgJiAxKSB7CisJCQlzLT5zc19oID0gZ2V0X2JpdHMxKCZzLT5nYik7CisJCQlzLT5zc192ID0gZ2V0X2JpdHMxKCZzLT5nYik7CisJCQlzLT5waXhfZm10ID0gcGl4X2ZtdF9mb3Jfc3NbYml0c11bcy0+c3Nfdl1bcy0+c3NfaF07CisJCQlpZiAocy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQyMFApIHsKKwkJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgIllVViA0OjI6MCBub3Qgc3VwcG9ydGVkIGluIHByb2ZpbGUgJWRcbiIsIHByb2ZpbGUpOworCQkJCXJldHVybiAtMTsKKwkJCX0gZWxzZSBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpIHsKKwkJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgIlByb2ZpbGUgJWQgY29sb3IgZGV0YWlscyByZXNlcnZlZCBiaXQgc2V0XG4iLCBwcm9maWxlKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzLT5zc19oID0gcy0+c3NfdiA9IDE7CisJCQlzLT5waXhfZm10ID0gcGl4X2ZtdF9mb3Jfc3NbYml0c11bMV1bMV07CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRlY29kZV9mcmFtZV9oZWFkZXIoY29uc3QgdTggKmRhdGEsIGludCBzaXplLCBzdHJ1Y3QgVlA5Q29udGV4dCAqcywgaW50ICpyZWYpCit7CisJaW50IHJldCwgbGFzdF9pbnZpc2libGUsIHByb2ZpbGU7CisKKwkvKiBnZW5lcmFsIGhlYWRlciAqLworCWlmICgocmV0ID0gaW5pdF9nZXRfYml0czgoJnMtPmdiLCBkYXRhLCBzaXplKSkgPCAwKSB7CisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgYml0c3RyZWFtIHJlYWRlclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGdldF9iaXRzKCZzLT5nYiwgMikgIT0gMHgyKSB7IC8vIGZyYW1lIG1hcmtlcgorCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgIkludmFsaWQgZnJhbWUgbWFya2VyXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXByb2ZpbGUgID0gZ2V0X2JpdHMxKCZzLT5nYik7CisJcHJvZmlsZSB8PSBnZXRfYml0czEoJnMtPmdiKSA8PCAxOworCWlmIChwcm9maWxlID09IDMpCisJCXByb2ZpbGUgKz0gZ2V0X2JpdHMxKCZzLT5nYik7CisKKwlpZiAocHJvZmlsZSA+IDMpIHsKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJQcm9maWxlICVkIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXG4iLCBwcm9maWxlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXMtPnMuaC5wcm9maWxlID0gcHJvZmlsZTsKKwlpZiAoZ2V0X2JpdHMxKCZzLT5nYikpIHsKKwkJKnJlZiA9IGdldF9iaXRzKCZzLT5nYiwgMyk7CisJCXJldHVybiAwOworCX0KKworCXMtPmxhc3Rfa2V5ZnJhbWUgID0gcy0+cy5oLmtleWZyYW1lOworCXMtPnMuaC5rZXlmcmFtZSAgID0gIWdldF9iaXRzMSgmcy0+Z2IpOworCisJbGFzdF9pbnZpc2libGUgICA9IHMtPnMuaC5pbnZpc2libGU7CisJcy0+cy5oLmludmlzaWJsZSA9ICFnZXRfYml0czEoJnMtPmdiKTsKKwlzLT5zLmguZXJyb3JyZXMgID0gZ2V0X2JpdHMxKCZzLT5nYik7CisJcy0+cy5oLnVzZV9sYXN0X2ZyYW1lX212cyA9ICFzLT5zLmguZXJyb3JyZXMgJiYgIWxhc3RfaW52aXNpYmxlOworCisJaWYgKHMtPnMuaC5rZXlmcmFtZSkgeworCQlpZiAoZ2V0X2JpdHNfbG9uZygmcy0+Z2IsIDI0KSAhPSBWUDlfU1lOQ0NPREUpIHsgLy8gc3luY2NvZGUKKwkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAiSW52YWxpZCBzeW5jIGNvZGVcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmICgocmV0ID0gcmVhZF9jb2xvcnNwYWNlX2RldGFpbHMocyxwcm9maWxlKSkgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJLy8gZm9yIHByb2ZpbGUgMSwgaGVyZSBmb2xsb3dzIHRoZSBzdWJzYW1wbGluZyBiaXRzCisJCXMtPnMuaC5yZWZyZXNocmVmbWFzayA9IDB4ZmY7CisJCXMtPndpZHRoID0gZ2V0X2JpdHMoJnMtPmdiLCAxNikgKyAxOworCQlzLT5oZWlnaHQgPSBnZXRfYml0cygmcy0+Z2IsIDE2KSArIDE7CisJCWlmIChnZXRfYml0czEoJnMtPmdiKSkgeyAvLyBoYXMgc2NhbGluZworCQkJcy0+cmVuZGVyX3dpZHRoID0gZ2V0X2JpdHMoJnMtPmdiLCAxNikgKyAxOworCQkJcy0+cmVuZGVyX2hlaWdodCA9IGdldF9iaXRzKCZzLT5nYiwgMTYpICsgMTsKKwkJfSBlbHNlIHsKKwkJCXMtPnJlbmRlcl93aWR0aCA9IHMtPndpZHRoOworCQkJcy0+cmVuZGVyX2hlaWdodCA9IHMtPmhlaWdodDsKKwkJfQorCQkvKnByX2luZm8oImtleWZyYW1lIHJlczogKCVkIHggJWQpLCByZW5kZXIgc2l6ZTogKCVkIHggJWQpXG4iLAorCQkJcy0+d2lkdGgsIHMtPmhlaWdodCwgcy0+cmVuZGVyX3dpZHRoLCBzLT5yZW5kZXJfaGVpZ2h0KTsqLworCX0gZWxzZSB7CisJCXMtPnMuaC5pbnRyYW9ubHkgPSBzLT5zLmguaW52aXNpYmxlID8gZ2V0X2JpdHMxKCZzLT5nYikgOiAwOworCQlzLT5zLmgucmVzZXRjdHggID0gcy0+cy5oLmVycm9ycmVzID8gMCA6IGdldF9iaXRzKCZzLT5nYiwgMik7CisJCWlmIChzLT5zLmguaW50cmFvbmx5KSB7CisJCQlpZiAoZ2V0X2JpdHNfbG9uZygmcy0+Z2IsIDI0KSAhPSBWUDlfU1lOQ0NPREUpIHsgLy8gc3luY2NvZGUKKwkJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgIkludmFsaWQgc3luYyBjb2RlXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAocHJvZmlsZSA+PSAxKSB7CisJCQkJaWYgKChyZXQgPSByZWFkX2NvbG9yc3BhY2VfZGV0YWlscyhzLCBwcm9maWxlKSkgPCAwKQorCQkJCQlyZXR1cm4gcmV0OworCQkJfSBlbHNlIHsKKwkJCQlzLT5zc19oID0gcy0+c3NfdiA9IDE7CisJCQkJcy0+cy5oLmJwcCA9IDg7CisJCQkJcy0+YnBwX2luZGV4ID0gMDsKKwkJCQlzLT5ieXRlc3BlcnBpeGVsID0gMTsKKwkJCQlzLT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOworCQkJfQorCQkJcy0+cy5oLnJlZnJlc2hyZWZtYXNrID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKwkJCXMtPndpZHRoID0gZ2V0X2JpdHMoJnMtPmdiLCAxNikgKyAxOworCQkJcy0+aGVpZ2h0ID0gZ2V0X2JpdHMoJnMtPmdiLCAxNikgKyAxOworCQkJaWYgKGdldF9iaXRzMSgmcy0+Z2IpKSB7IC8vIGhhcyBzY2FsaW5nCisJCQkJcy0+cmVuZGVyX3dpZHRoID0gZ2V0X2JpdHMoJnMtPmdiLCAxNikgKyAxOworCQkJCXMtPnJlbmRlcl9oZWlnaHQgPSBnZXRfYml0cygmcy0+Z2IsIDE2KSArIDE7CisJCQl9IGVsc2UgeworCQkJCXMtPnJlbmRlcl93aWR0aCA9IHMtPndpZHRoOworCQkJCXMtPnJlbmRlcl9oZWlnaHQgPSBzLT5oZWlnaHQ7CisJCQl9CisJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsICJpbnRyYSByZXM6ICglZCB4ICVkKSwgcmVuZGVyIHNpemU6ICglZCB4ICVkKVxuIiwKKwkJCQlzLT53aWR0aCwgcy0+aGVpZ2h0LCBzLT5yZW5kZXJfd2lkdGgsIHMtPnJlbmRlcl9oZWlnaHQpOworCQl9IGVsc2UgeworCQkJcy0+cy5oLnJlZnJlc2hyZWZtYXNrID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKwkJCXMtPnMuaC5yZWZpZHhbMF0gICAgICA9IGdldF9iaXRzKCZzLT5nYiwgMyk7CisJCQlzLT5zLmguc2lnbmJpYXNbMF0gICAgPSBnZXRfYml0czEoJnMtPmdiKSAmJiAhcy0+cy5oLmVycm9ycmVzOworCQkJcy0+cy5oLnJlZmlkeFsxXSAgICAgID0gZ2V0X2JpdHMoJnMtPmdiLCAzKTsKKwkJCXMtPnMuaC5zaWduYmlhc1sxXSAgICA9IGdldF9iaXRzMSgmcy0+Z2IpICYmICFzLT5zLmguZXJyb3JyZXM7CisJCQlzLT5zLmgucmVmaWR4WzJdICAgICAgPSBnZXRfYml0cygmcy0+Z2IsIDMpOworCQkJcy0+cy5oLnNpZ25iaWFzWzJdICAgID0gZ2V0X2JpdHMxKCZzLT5nYikgJiYgIXMtPnMuaC5lcnJvcnJlczsKKworCQkJLypyZWZyZXNoX2ZyYW1lX2ZsYWdzOworCQkJZm9yIChpID0gMDsgaSA8IFJFRlNfUEVSX0ZSQU1FOyArK2kpIHsKKwkJCQlmcmFtZV9yZWZzW2ldOworCQkJCXJlZl9mcmFtZV9zaWduX2JpYXNlc1tpXTsKKwkJCX0KKwkJCWZyYW1lX3NpemVfZnJvbV9yZWZzKCk7CisJCQloaWdoX3ByZWNpc2lvbl9tdjsKKwkJCWludGVycF9maWx0ZXIoKTsqLworCisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHZwOV9zdXBlcmZyYW1lX3NwbGl0X2ZpbHRlcihzdHJ1Y3QgdnA5X3N1cGVyZnJhbWVfc3BsaXQgKnMpCit7CisJaW50IGksIGosIHJldCwgbWFya2VyOworCWJvb2wgaXNfc3VwZXJmcmFtZSA9IGZhbHNlOworCWludCAqcHJlZml4ID0gKGludCAqKXMtPmRhdGE7CisKKwlpZiAoIXMtPmRhdGEpCisJCXJldHVybiAtMTsKKworCSNkZWZpbmUgQU1MX1BSRUZJWCAoJ1YnIDw8IDI0IHwgJ0wnIDw8IDE2IHwgJ00nIDw8IDggfCAnQScpCisJaWYgKHByZWZpeFszXSA9PSBBTUxfUFJFRklYKSB7CisJCXMtPnByZWZpeF9zaXplID0gMTY7CisJCS8qcHJfaW5mbygidGhlIGZyYW1lIGRhdGEgaGFzIGJlZWQgYWRkZWQgaGVhZGVyXG4iKTsqLworCX0KKworCW1hcmtlciA9IHMtPmRhdGFbcy0+ZGF0YV9zaXplIC0gMV07CisJaWYgKChtYXJrZXIgJiAweGUwKSA9PSAweGMwKSB7CisJCWludCBsZW5ndGhfc2l6ZSA9IDEgKyAoKG1hcmtlciA+PiAzKSAmIDB4Myk7CisJCWludCAgIG5iX2ZyYW1lcyA9IDEgKyAobWFya2VyICYgMHg3KTsKKwkJaW50ICAgIGlkeF9zaXplID0gMiArIG5iX2ZyYW1lcyAqIGxlbmd0aF9zaXplOworCisJCWlmIChzLT5kYXRhX3NpemUgPj0gaWR4X3NpemUgJiYKKwkJCXMtPmRhdGFbcy0+ZGF0YV9zaXplIC0gaWR4X3NpemVdID09IG1hcmtlcikgeworCQkJczY0IHRvdGFsX3NpemUgPSAwOworCQkJaW50IGlkeCA9IHMtPmRhdGFfc2l6ZSArIDEgLSBpZHhfc2l6ZTsKKworCQkJZm9yIChpID0gMDsgaSA8IG5iX2ZyYW1lczsgaSsrKSB7CisJCQkJaW50IGZyYW1lX3NpemUgPSAwOworCQkJCWZvciAoaiA9IDA7IGogPCBsZW5ndGhfc2l6ZTsgaisrKQorCQkJCQlmcmFtZV9zaXplIHw9IHMtPmRhdGFbaWR4KytdIDw8IChqICogOCk7CisKKwkJCQl0b3RhbF9zaXplICs9IGZyYW1lX3NpemU7CisJCQkJaWYgKGZyYW1lX3NpemUgPCAwIHx8CisJCQkJCXRvdGFsX3NpemUgPiBzLT5kYXRhX3NpemUgLSBpZHhfc2l6ZSkgeworCQkJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwgIkludmFsaWQgZnJhbWUgc2l6ZSBpbiBhIHNmcmFtZTogJWRcbiIsCisJCQkJCQlmcmFtZV9zaXplKTsKKwkJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQkJZ290byBmYWlsOworCQkJCX0KKwkJCQlzLT5zaXplc1tpXSA9IGZyYW1lX3NpemU7CisJCQl9CisKKwkJCXMtPm5iX2ZyYW1lcyAgICAgICAgID0gbmJfZnJhbWVzOworCQkJcy0+c2l6ZSAgICAgICAgICAgICAgPSB0b3RhbF9zaXplOworCQkJcy0+bmV4dF9mcmFtZSAgICAgICAgPSAwOworCQkJcy0+bmV4dF9mcmFtZV9vZmZzZXQgPSAwOworCQkJaXNfc3VwZXJmcmFtZSAgICAgICAgPSB0cnVlOworCQl9CisJfWVsc2UgeworCQlzLT5uYl9mcmFtZXMgPSAxOworCQlzLT5zaXplc1swXSAgPSBzLT5kYXRhX3NpemU7CisJCXMtPnNpemUgICAgICA9IHMtPmRhdGFfc2l6ZTsKKwl9CisKKwkvKnByX2luZm8oInNmcmFtZTogJWQsIGZyYW1lczogJWQsIElOOiAleCwgT1VUOiAleFxuIiwKKwkJaXNfc3VwZXJmcmFtZSwgcy0+bmJfZnJhbWVzLAorCQlzLT5kYXRhX3NpemUsIHMtPnNpemUpOyovCisKKwkvKiBwYXJzZSB1bmNvbXByZXNzZWQgaGVhZGVyLiAqLworCWlmIChpc19zdXBlcmZyYW1lKSB7CisJCS8qIGJpdHN0cmVhbSBwcm9maWxlLiAqLworCQkvKiBmcmFtZSB0eXBlLiAoaW50cmEgb3IgaW50ZXIpICovCisJCS8qIGNvbG9yc3BhY2UgZGVzY3JpcHRvciAqLworCQkvKiAuLi4gKi8KKworCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsICJ0aGUgZnJhbWUgaXMgYSBzdXBlcmZyYW1lLlxuIik7CisJfQorCisJLypwcl9lcnIoImluOiAleCwgJWQsIG91dDogJXgsIHNpemVzICVkLCVkLCVkLCVkLCVkLCVkLCVkLCVkXG4iLAorCQlzLT5kYXRhX3NpemUsCisJCXMtPm5iX2ZyYW1lcywKKwkJcy0+c2l6ZSwKKwkJcy0+c2l6ZXNbMF0sCisJCXMtPnNpemVzWzFdLAorCQlzLT5zaXplc1syXSwKKwkJcy0+c2l6ZXNbM10sCisJCXMtPnNpemVzWzRdLAorCQlzLT5zaXplc1s1XSwKKwkJcy0+c2l6ZXNbNl0sCisJCXMtPnNpemVzWzddKTsqLworCisJcmV0dXJuIDA7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK2ludCB2cDlfZGVjb2RlX2V4dHJhZGF0YV9wcyh1OCAqZGF0YSwgaW50IHNpemUsIHN0cnVjdCB2cDlfcGFyYW1fc2V0cyAqcHMpCit7CisJaW50IGksIHJlZiA9IC0xLCByZXQgPSAwOworCXN0cnVjdCB2cDlfc3VwZXJmcmFtZV9zcGxpdCBzID0gezB9OworCisJLypwYXJzZSBzdXBlcmZyYW1lLiovCisJcy5kYXRhID0gZGF0YTsKKwlzLmRhdGFfc2l6ZSA9IHNpemU7CisJcmV0ID0gdnA5X3N1cGVyZnJhbWVfc3BsaXRfZmlsdGVyKCZzKTsKKwlpZiAocmV0KSB7CisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAicGFyc2UgZnJhbWVzIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBzLm5iX2ZyYW1lczsgaSsrKSB7CisJCXUzMiBsZW4gPSBzLnNpemVzW2ldIC0gcy5wcmVmaXhfc2l6ZTsKKwkJdTggKmJ1ZiA9IHMuZGF0YSArIHMubmV4dF9mcmFtZV9vZmZzZXQgKyBzLnByZWZpeF9zaXplOworCisJCXJldCA9IGRlY29kZV9mcmFtZV9oZWFkZXIoYnVmLCBsZW4sICZwcy0+Y3R4LCAmcmVmKTsKKwkJaWYgKCFyZXQpIHsKKwkJCXBzLT5oZWFkX3BhcnNlZCA9IHJlZiA8IDAgPyB0cnVlIDogZmFsc2U7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXMubmV4dF9mcmFtZV9vZmZzZXQgPSBsZW4gKyBzLnByZWZpeF9zaXplOworCX0KKworCXJldHVybiByZXQ7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2RlY29kZXIvYW1sX3ZwOV9wYXJzZXIuaCBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2RlY29kZXIvYW1sX3ZwOV9wYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGVkZGVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvZGVjb2Rlci9hbWxfdnA5X3BhcnNlci5oCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogZHJpdmVycy9hbXZkZWNfcG9ydHMvZGVjb2Rlci9hbWxfdnA5X3BhcnNlci5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgQU1MX1ZQOV9QQVJTRVJfSAorI2RlZmluZSBBTUxfVlA5X1BBUlNFUl9ICisKKyNpbmNsdWRlICIuLi9hbWxfdmNvZGVjX2Rydi5oIgorI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX1Y0TF9TT0ZUV0FSRV9QQVJTRVIKKyNpbmNsdWRlICIuLi91dGlscy9waXhmbXQuaCIKKyNpbmNsdWRlICIuLi91dGlscy9nZXRfYml0cy5oIgorI2VuZGlmCisKKyNkZWZpbmUgTUFYX1NFR01FTlQJOAorCitzdHJ1Y3QgVlA5Qml0c3RyZWFtSGVhZGVyIHsKKwkvLyBiaXRzdHJlYW0gaGVhZGVyCisJdTggcHJvZmlsZTsKKwl1OCBicHA7CisJdTgga2V5ZnJhbWU7CisJdTggaW52aXNpYmxlOworCXU4IGVycm9ycmVzOworCXU4IGludHJhb25seTsKKwl1OCByZXNldGN0eDsKKwl1OCByZWZyZXNocmVmbWFzazsKKwl1OCBoaWdocHJlY2lzaW9ubXZzOworCXU4IGFsbG93Y29tcGludGVyOworCXU4IHJlZnJlc2hjdHg7CisJdTggcGFyYWxsZWxtb2RlOworCXU4IGZyYW1lY3R4aWQ7CisJdTggdXNlX2xhc3RfZnJhbWVfbXZzOworCXU4IHJlZmlkeFszXTsKKwl1OCBzaWduYmlhc1szXTsKKwl1OCBmaXhjb21wcmVmOworCXU4IHZhcmNvbXByZWZbMl07CisJc3RydWN0IHsKKwkJdTggbGV2ZWw7CisJCWNoYXIgc2hhcnBuZXNzOworCX0gZmlsdGVyOworCXN0cnVjdCB7CisJCXU4IGVuYWJsZWQ7CisJCXU4IHVwZGF0ZWQ7CisJCWNoYXIgbW9kZVsyXTsKKwkJY2hhciByZWZbNF07CisJfSBsZl9kZWx0YTsKKwl1OCB5YWNfcWk7CisJY2hhciB5ZGNfcWRlbHRhLCB1dmRjX3FkZWx0YSwgdXZhY19xZGVsdGE7CisJdTggbG9zc2xlc3M7CisJc3RydWN0IHsKKwkJdTggZW5hYmxlZDsKKwkJdTggdGVtcG9yYWw7CisJCXU4IGFic29sdXRlX3ZhbHM7CisJCXU4IHVwZGF0ZV9tYXA7CisJCXU4IHByb2JbN107CisJCXU4IHByZWRfcHJvYlszXTsKKwkJc3RydWN0IHsKKwkJCXU4IHFfZW5hYmxlZDsKKwkJCXU4IGxmX2VuYWJsZWQ7CisJCQl1OCByZWZfZW5hYmxlZDsKKwkJCXU4IHNraXBfZW5hYmxlZDsKKwkJCXU4IHJlZl92YWw7CisJCQlpbnQxNl90IHFfdmFsOworCQkJY2hhciBsZl92YWw7CisJCQlpbnQxNl90IHFtdWxbMl1bMl07CisJCQl1OCBsZmx2bFs0XVsyXTsKKwkJfSBmZWF0W01BWF9TRUdNRU5UXTsKKwl9IHNlZ21lbnRhdGlvbjsKKwlzdHJ1Y3QgeworCQl1MzIgbG9nMl90aWxlX2NvbHMsIGxvZzJfdGlsZV9yb3dzOworCQl1MzIgdGlsZV9jb2xzLCB0aWxlX3Jvd3M7CisJfSB0aWxpbmc7CisKKwlpbnQgdW5jb21wcmVzc2VkX2hlYWRlcl9zaXplOworCWludCBjb21wcmVzc2VkX2hlYWRlcl9zaXplOworfTsKKworc3RydWN0IFZQOVNoYXJlZENvbnRleHQgeworCXN0cnVjdCBWUDlCaXRzdHJlYW1IZWFkZXIgaDsKKworCS8vc3RydWN0IFRocmVhZEZyYW1lIHJlZnNbOF07CisjZGVmaW5lIENVUl9GUkFNRSAwCisjZGVmaW5lIFJFRl9GUkFNRV9NVlBBSVIgMQorI2RlZmluZSBSRUZfRlJBTUVfU0VHTUFQIDIKKwkvL3N0cnVjdCBWUDlGcmFtZSBmcmFtZXNbM107Cit9OworCitzdHJ1Y3QgVlA5Q29udGV4dCB7CisJc3RydWN0IFZQOVNoYXJlZENvbnRleHQgczsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9WNExfU09GVFdBUkVfUEFSU0VSCisJc3RydWN0IGdldF9iaXRzX2NvbnRleHQgZ2I7CisjZW5kaWYKKwlpbnQgcGFzcywgYWN0aXZlX3RpbGVfY29sczsKKworCXU4IHNzX2gsIHNzX3Y7CisJdTggbGFzdF9icHAsIGJwcF9pbmRleCwgYnl0ZXNwZXJwaXhlbDsKKwl1OCBsYXN0X2tleWZyYW1lOworCS8vIHNiX2NvbHMvcm93cywgcm93cy9jb2xzIGFuZCBsYXN0X2ZtdCBhcmUgdXNlZCBmb3IgYWxsb2NhdGluZyBhbGwgaW50ZXJuYWwKKwkvLyBhcnJheXMsIGFuZCBhcmUgdGh1cyBwZXItdGhyZWFkLiB3L2ggYW5kIGdmX2ZtdCBhcmUgc3luY2VkIGJldHdlZW4gdGhyZWFkcworCS8vIGFuZCBhcmUgdGhlcmVmb3JlIHBlci1zdHJlYW0uIHBpeF9mbXQgcmVwcmVzZW50cyB0aGUgdmFsdWUgaW4gdGhlIGhlYWRlcgorCS8vIG9mIHRoZSBjdXJyZW50bHkgcHJvY2Vzc2VkIGZyYW1lLgorCWludCB3aWR0aDsKKwlpbnQgaGVpZ2h0OworCisJaW50IHJlbmRlcl93aWR0aDsKKwlpbnQgcmVuZGVyX2hlaWdodDsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9WNExfU09GVFdBUkVfUEFSU0VSCisJZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQsIGxhc3RfZm10LCBnZl9mbXQ7CisjZW5kaWYKKwl1MzIgc2JfY29scywgc2Jfcm93cywgcm93cywgY29sczsKKworCXN0cnVjdCB7CisJCXU4IGxpbV9sdXRbNjRdOworCQl1OCBtYmxpbV9sdXRbNjRdOworCX0gZmlsdGVyX2x1dDsKKwlzdHJ1Y3QgeworCQl1OCBjb2VmWzRdWzJdWzJdWzZdWzZdWzNdOworCX0gcHJvYl9jdHhbNF07CisJc3RydWN0IHsKKwkJdTggY29lZls0XVsyXVsyXVs2XVs2XVsxMV07CisJfSBwcm9iOworCisJLy8gY29udGV4dHVhbCAoYWJvdmUpIGNhY2hlCisJdTggKmFib3ZlX3BhcnRpdGlvbl9jdHg7CisJdTggKmFib3ZlX21vZGVfY3R4OworCS8vIEZJWE1FIG1heWJlIG1lcmdlIHNvbWUgb2YgdGhlIGJlbG93IGluIGEgZmxhZ3MgZmllbGQ/CisJdTggKmFib3ZlX3lfbm56X2N0eDsKKwl1OCAqYWJvdmVfdXZfbm56X2N0eFsyXTsKKwl1OCAqYWJvdmVfc2tpcF9jdHg7IC8vIDFiaXQKKwl1OCAqYWJvdmVfdHhmbV9jdHg7IC8vIDJiaXQKKwl1OCAqYWJvdmVfc2VncHJlZF9jdHg7IC8vIDFiaXQKKwl1OCAqYWJvdmVfaW50cmFfY3R4OyAvLyAxYml0CisJdTggKmFib3ZlX2NvbXBfY3R4OyAvLyAxYml0CisJdTggKmFib3ZlX3JlZl9jdHg7IC8vIDJiaXQKKwl1OCAqYWJvdmVfZmlsdGVyX2N0eDsKKworCS8vIHdob2xlLWZyYW1lIGNhY2hlCisJdTggKmludHJhX3ByZWRfZGF0YVszXTsKKworCS8vIGJsb2NrIHJlY29uc3RydWN0aW9uIGludGVybWVkaWF0ZXMKKwlpbnQgYmxvY2tfYWxsb2NfdXNpbmdfMnBhc3M7CisJdWludDE2X3QgbXZzY2FsZVszXVsyXTsKKwl1OCBtdnN0ZXBbM11bMl07Cit9OworCitzdHJ1Y3QgdnA5X3N1cGVyZnJhbWVfc3BsaXQgeworCS8qaW4gZGF0YSovCisJdTggKmRhdGE7CisJdTMyIGRhdGFfc2l6ZTsKKworCS8qb3V0IGRhdGEqLworCWludCBuYl9mcmFtZXM7CisJaW50IHNpemU7CisJaW50IG5leHRfZnJhbWU7CisJdTMyIG5leHRfZnJhbWVfb2Zmc2V0OworCWludCBwcmVmaXhfc2l6ZTsKKwlpbnQgc2l6ZXNbOF07Cit9OworCitzdHJ1Y3QgdnA5X3BhcmFtX3NldHMgeworCWJvb2wgaGVhZF9wYXJzZWQ7CisJc3RydWN0IFZQOUNvbnRleHQgY3R4OworfTsKKworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX1Y0TF9TT0ZUV0FSRV9QQVJTRVIKK2ludCB2cDlfc3VwZXJmcmFtZV9zcGxpdF9maWx0ZXIoc3RydWN0IHZwOV9zdXBlcmZyYW1lX3NwbGl0ICpzKTsKK2ludCB2cDlfZGVjb2RlX2V4dHJhZGF0YV9wcyh1OCAqZGF0YSwgaW50IHNpemUsIHN0cnVjdCB2cDlfcGFyYW1fc2V0cyAqcHMpOworI2Vsc2UKK2lubGluZSBpbnQgdnA5X2RlY29kZV9leHRyYWRhdGFfcHModTggKmRhdGEsIGludCBzaXplLCBzdHJ1Y3QgdnA5X3BhcmFtX3NldHMgKnBzKSB7IHJldHVybiAtMTsgfQorI2VuZGlmCisKKyNlbmRpZiAvL0FNTF9WUDlfUEFSU0VSX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2RlY29kZXIvdXRpbHMuaCBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2RlY29kZXIvdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmIxNTUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvZGVjb2Rlci91dGlscy5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvbWVkaWFfbW9kdWxlcy9hbXZkZWNfcG9ydHMvZGVjb2Rlci91dGlscy5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgX1VUSUxTX0gKKyNkZWZpbmUgX1VUSUxTX0gKKworI2RlZmluZSBNQVgoYSwgYikgICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgTUlOKGEsIGIpICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZGVmaW5lIENMQU1QKHgsIGxvdywgaGlnaCkgXAorCSgoKHgpID4gKGhpZ2gpKSA/IChoaWdoKSA6ICgoKHgpIDwgKGxvdykpID8gKGxvdykgOiAoeCkpKQorI2RlZmluZSBCSVRBVCh4LCBuKSAoKHggJiAoMSA8PCBuKSkgPT0gKDEgPDwgbikpCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1aW50OF90OwordHlwZWRlZiBpbnQgaW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQzMl90OworCisjZW5kaWYgLy9fVVRJTFNfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbXZkZWNfcG9ydHMvZGVjb2Rlci92ZGVjX2F2MV9pZi5jIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvZGVjb2Rlci92ZGVjX2F2MV9pZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyOGNhMTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FtdmRlY19wb3J0cy9kZWNvZGVyL3ZkZWNfYXYxX2lmLmMKQEAgLTAsMCArMSwxMzc0IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorKiBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqCisqIERlc2NyaXB0aW9uOgorKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvc3dhYi5oPgorI2luY2x1ZGUgIi4uL3ZkZWNfZHJ2X2lmLmgiCisjaW5jbHVkZSAiLi4vYW1sX3Zjb2RlY191dGlsLmgiCisjaW5jbHVkZSAiLi4vYW1sX3Zjb2RlY19kZWMuaCIKKyNpbmNsdWRlICIuLi9hbWxfdmNvZGVjX2Rydi5oIgorI2luY2x1ZGUgIi4uL2FtbF92Y29kZWNfYWRhcHQuaCIKKyNpbmNsdWRlICIuLi92ZGVjX2Rydl9iYXNlLmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvY29tbW9uLmgiCisKKyNkZWZpbmUgS0VSTkVMX0FUUkFDRV9UQUcgS0VSTkVMX0FUUkFDRV9UQUdfVjRMMgorI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9tZXNvbl9hdHJhY2UuaD4KKworI2RlZmluZSBQUkVGSVhfU0laRQkoMTYpCisKKyNkZWZpbmUgSEVBREVSX0JVRkZFUl9TSVpFCQkJKDMyICogMTAyNCkKKyNkZWZpbmUgU1lOQ19DT0RFCQkJCSgweDQ5ODM0MikKKworZXh0ZXJuIGludCBhdjFfbmVlZF9wcmVmaXg7CisKKy8qKgorICogc3RydWN0IGF2MV9mYiAtIGF2MSBkZWNvZGUgZnJhbWUgYnVmZmVyIGluZm9ybWF0aW9uCisgKiBAdmRlY19mYl92YSAgOiB2aXJ0dWFsIGFkZHJlc3Mgb2Ygc3RydWN0IHZkZWNfZmIKKyAqIEB5X2ZiX2RtYSAgICA6IGRtYSBhZGRyZXNzIG9mIFkgZnJhbWUgYnVmZmVyIChsdW1hKQorICogQGNfZmJfZG1hICAgIDogZG1hIGFkZHJlc3Mgb2YgQyBmcmFtZSBidWZmZXIgKGNocm9tYSkKKyAqIEBwb2MgICAgICAgICA6IHBpY3R1cmUgb3JkZXIgY291bnQgb2YgZnJhbWUgYnVmZmVyCisgKiBAcmVzZXJ2ZWQgICAgOiBmb3IgOCBieXRlcyBhbGlnbm1lbnQKKyAqLworc3RydWN0IGF2MV9mYiB7CisJdWludDY0X3QgdmRlY19mYl92YTsKKwl1aW50NjRfdCB5X2ZiX2RtYTsKKwl1aW50NjRfdCBjX2ZiX2RtYTsKKwlpbnQzMl90IHBvYzsKKwl1aW50MzJfdCByZXNlcnZlZDsKK307CisKKy8qKgorICogc3RydWN0IHZkZWNfYXYxX2RlY19pbmZvIC0gZGVjb2RlIGluZm9ybWF0aW9uCisgKiBAZHBiX3N6CQk6IGRlY29kaW5nIHBpY3R1cmUgYnVmZmVyIHNpemUKKyAqIEByZXNvbHV0aW9uX2NoYW5nZWQgIDogcmVzb2x0aW9uIGNoYW5nZSBoYXBwZW4KKyAqIEByZXNlcnZlZAkJOiBmb3IgOCBieXRlcyBhbGlnbm1lbnQKKyAqIEBic19kbWEJCTogSW5wdXQgYml0LXN0cmVhbSBidWZmZXIgZG1hIGFkZHJlc3MKKyAqIEB5X2ZiX2RtYQkJOiBZIGZyYW1lIGJ1ZmZlciBkbWEgYWRkcmVzcworICogQGNfZmJfZG1hCQk6IEMgZnJhbWUgYnVmZmVyIGRtYSBhZGRyZXNzCisgKiBAdmRlY19mYl92YQkJOiBWREVDIGZyYW1lIGJ1ZmZlciBzdHJ1Y3QgdmlydHVhbCBhZGRyZXNzCisgKi8KK3N0cnVjdCB2ZGVjX2F2MV9kZWNfaW5mbyB7CisJdWludDMyX3QgZHBiX3N6OworCXVpbnQzMl90IHJlc29sdXRpb25fY2hhbmdlZDsKKwl1aW50MzJfdCByZXNlcnZlZDsKKwl1aW50NjRfdCBic19kbWE7CisJdWludDY0X3QgeV9mYl9kbWE7CisJdWludDY0X3QgY19mYl9kbWE7CisJdWludDY0X3QgdmRlY19mYl92YTsKK307CisKKy8qKgorICogc3RydWN0IHZkZWNfYXYxX3ZzaSAtIHNoYXJlZCBtZW1vcnkgZm9yIGRlY29kZSBpbmZvcm1hdGlvbiBleGNoYW5nZQorICogICAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIFZQVSBhbmQgSG9zdC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1lbW9yeSBpcyBhbGxvY2F0ZWQgYnkgVlBVIHRoZW4gbWFwcGluZyB0byBIb3N0CisgKiAgICAgICAgICAgICAgICAgICAgICAgIGluIHZwdV9kZWNfaW5pdCgpIGFuZCBmcmVlZCBpbiB2cHVfZGVjX2RlaW5pdCgpCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGJ5IFZQVS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgQVAtVy9SIDogQVAgaXMgd3JpdGVyL3JlYWRlciBvbiB0aGlzIGl0ZW0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgVlBVLVcvUjogVlBVIGlzIHdyaXRlL3JlYWRlciBvbiB0aGlzIGl0ZW0KKyAqIEBoZHJfYnVmICAgICAgOiBIZWFkZXIgcGFyc2luZyBidWZmZXIgKEFQLVcsIFZQVS1SKQorICogQGxpc3RfZnJlZSAgICA6IGZyZWUgZnJhbWUgYnVmZmVyIHJpbmcgbGlzdCAoQVAtVy9SLCBWUFUtVykKKyAqIEBsaXN0X2Rpc3AgICAgOiBkaXNwbGF5IGZyYW1lIGJ1ZmZlciByaW5nIGxpc3QgKEFQLVIsIFZQVS1XKQorICogQGRlYyAgICAgICAgICA6IGRlY29kZSBpbmZvcm1hdGlvbiAoQVAtUiwgVlBVLVcpCisgKiBAcGljICAgICAgICAgIDogcGljdHVyZSBpbmZvcm1hdGlvbiAoQVAtUiwgVlBVLVcpCisgKiBAY3JvcCAgICAgICAgIDogY3JvcCBpbmZvcm1hdGlvbiAoQVAtUiwgVlBVLVcpCisgKi8KK3N0cnVjdCB2ZGVjX2F2MV92c2kgeworCWNoYXIgKmhlYWRlcl9idWY7CisJaW50IHNwc19zaXplOworCWludCBwcHNfc2l6ZTsKKwlpbnQgc2VpX3NpemU7CisJaW50IGhlYWRfb2Zmc2V0OworCXN0cnVjdCB2ZGVjX2F2MV9kZWNfaW5mbyBkZWM7CisJc3RydWN0IHZkZWNfcGljX2luZm8gcGljOworCXN0cnVjdCB2ZGVjX3BpY19pbmZvIGN1cl9waWM7CisJc3RydWN0IHY0bDJfcmVjdCBjcm9wOworCWJvb2wgaXNfY29tYmluZTsKKwlpbnQgbmFsdV9wb3M7Cit9OworCisvKioKKyAqIHN0cnVjdCB2ZGVjX2F2MV9pbnN0IC0gYXYxIGRlY29kZXIgaW5zdGFuY2UKKyAqIEBudW1fbmFsdSA6IGhvdyBtYW55IG5hbHVzIGJlIGRlY29kZWQKKyAqIEBjdHggICAgICA6IHBvaW50IHRvIGFtbF92Y29kZWNfY3R4CisgKiBAdnNpICAgICAgOiBWUFUgc2hhcmVkIGluZm9ybWF0aW9uCisgKi8KK3N0cnVjdCB2ZGVjX2F2MV9pbnN0IHsKKwl1bnNpZ25lZCBpbnQgbnVtX25hbHU7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHg7CisJc3RydWN0IGFtbF92ZGVjX2FkYXB0IHZkZWM7CisJc3RydWN0IHZkZWNfYXYxX3ZzaSAqdnNpOworCXN0cnVjdCBhbWxfZGVjX3BhcmFtcyBwYXJtczsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21wOworCXN0cnVjdCB2ZGVjX2NvbXBfYnVmX2luZm8gY29tcF9pbmZvOworfTsKKworLyohXGJyaWVmIE9CVSB0eXBlcy4gKi8KK2VudW0gT0JVX1RZUEUgeworCU9CVV9TRVFVRU5DRV9IRUFERVIgPSAxLAorCU9CVV9URU1QT1JBTF9ERUxJTUlURVIgPSAyLAorCU9CVV9GUkFNRV9IRUFERVIgPSAzLAorCU9CVV9USUxFX0dST1VQID0gNCwKKwlPQlVfTUVUQURBVEEgPSA1LAorCU9CVV9GUkFNRSA9IDYsCisJT0JVX1JFRFVOREFOVF9GUkFNRV9IRUFERVIgPSA3LAorCU9CVV9USUxFX0xJU1QgPSA4LAorCU9CVV9QQURESU5HID0gMTUsCit9OworCisvKiFcYnJpZWYgT0JVIG1ldGFkYXRhIHR5cGVzLiAqLworZW51bSBPQlVfTUVUQURBVEFfVFlQRSB7CisJT0JVX01FVEFEQVRBX1RZUEVfUkVTRVJWRURfMCA9IDAsCisJT0JVX01FVEFEQVRBX1RZUEVfSERSX0NMTCA9IDEsCisJT0JVX01FVEFEQVRBX1RZUEVfSERSX01EQ1YgPSAyLAorCU9CVV9NRVRBREFUQV9UWVBFX1NDQUxBQklMSVRZID0gMywKKwlPQlVfTUVUQURBVEFfVFlQRV9JVFVUX1QzNSA9IDQsCisJT0JVX01FVEFEQVRBX1RZUEVfVElNRUNPREUgPSA1LAorfTsKKworc3RydWN0IE9idUhlYWRlciB7CisJc2l6ZV90IHNpemU7ICAvLyBTaXplICgxIG9yIDIgYnl0ZXMpIG9mIHRoZSBPQlUgaGVhZGVyIChpbmNsdWRpbmcgdGhlCisJCQkvLyBvcHRpb25hbCBPQlUgZXh0ZW5zaW9uIGhlYWRlcikgaW4gdGhlIGJpdHN0cmVhbS4KKwllbnVtIE9CVV9UWVBFIHR5cGU7CisJaW50IGhhc19zaXplX2ZpZWxkOworCWludCBoYXNfZXh0ZW5zaW9uOworCS8vIFRoZSBmb2xsb3dpbmcgZmllbGRzIGNvbWUgZnJvbSB0aGUgT0JVIGV4dGVuc2lvbiBoZWFkZXIgYW5kIHRoZXJlZm9yZSBhcmUKKwkvLyBvbmx5IHVzZWQgaWYgaGFzX2V4dGVuc2lvbiBpcyB0cnVlLgorCWludCB0ZW1wb3JhbF9sYXllcl9pZDsKKwlpbnQgc3BhdGlhbF9sYXllcl9pZDsKK307CisKK3N0YXRpYyBjb25zdCBzaXplX3Qga01heGltdW1MZWIxMjhTaXplID0gODsKK3N0YXRpYyBjb25zdCB1OCBrTGViMTI4Qnl0ZU1hc2sgPSAweDdmOyAgLy8gQmluYXJ5OiAwMTExMTExMQorCisvLyBEaXNhbGxvdyB2YWx1ZXMgbGFyZ2VyIHRoYW4gMzItYml0cyB0byBlbnN1cmUgY29uc2lzdGVudCBiZWhhdmlvciBvbiAzMiBhbmQKKy8vIDY0IGJpdCB0YXJnZXRzOiB2YWx1ZSBpcyB0eXBpY2FsbHkgdXNlZCB0byBkZXRlcm1pbmUgYnVmZmVyIGFsbG9jYXRpb24gc2l6ZQorLy8gd2hlbiBkZWNvZGVkLgorc3RhdGljIGNvbnN0IHU2NCBrTWF4aW11bUxlYjEyOFZhbHVlID0gVUxPTkdfTUFYOworCitjaGFyIG9idV90eXBlX25hbWVbMTZdWzMyXSA9IHsKKwkiVU5LTk9XTiIsCisJIk9CVV9TRVFVRU5DRV9IRUFERVIiLAorCSJPQlVfVEVNUE9SQUxfREVMSU1JVEVSIiwKKwkiT0JVX0ZSQU1FX0hFQURFUiIsCisJIk9CVV9USUxFX0dST1VQIiwKKwkiT0JVX01FVEFEQVRBIiwKKwkiT0JVX0ZSQU1FIiwKKwkiT0JVX1JFRFVOREFOVF9GUkFNRV9IRUFERVIiLAorCSJPQlVfVElMRV9MSVNUIiwKKwkiVU5LTk9XTiIsCisJIlVOS05PV04iLAorCSJVTktOT1dOIiwKKwkiVU5LTk9XTiIsCisJIlVOS05PV04iLAorCSJVTktOT1dOIiwKKwkiT0JVX1BBRERJTkciCit9OworCitjaGFyIG1ldGFfdHlwZV9uYW1lWzZdWzMyXSA9IHsKKwkiT0JVX01FVEFEQVRBX1RZUEVfUkVTRVJWRURfMCIsCisJIk9CVV9NRVRBREFUQV9UWVBFX0hEUl9DTEwiLAorCSJPQlVfTUVUQURBVEFfVFlQRV9IRFJfTURDViIsCisJIk9CVV9NRVRBREFUQV9UWVBFX1NDQUxBQklMSVRZIiwKKwkiT0JVX01FVEFEQVRBX1RZUEVfSVRVVF9UMzUiLAorCSJPQlVfTUVUQURBVEFfVFlQRV9USU1FQ09ERSIKK307CisKK3N0cnVjdCByZWFkX2JpdF9idWZmZXIgeworCWNvbnN0IHU4ICpiaXRfYnVmZmVyOworCWNvbnN0IHU4ICpiaXRfYnVmZmVyX2VuZDsKKwl1MzIgYml0X29mZnNldDsKK307CisKK3N0cnVjdCBEYXRhQnVmZmVyIHsKKwljb25zdCB1OCAqZGF0YTsKKwlzaXplX3Qgc2l6ZTsKK307CisKK3N0YXRpYyBpbnQgdmRlY193cml0ZV9uYWx1KHN0cnVjdCB2ZGVjX2F2MV9pbnN0ICppbnN0LAorCXU4ICpidWYsIHUzMiBzaXplLCB1NjQgdHMpOworc3RhdGljIGludCB2ZGVjX2dldF9kd19tb2RlKHN0cnVjdCB2ZGVjX2F2MV9pbnN0ICppbnN0LCBpbnQgZHdfbW9kZSk7CisKK3N0YXRpYyB2b2lkIGdldF9waWNfaW5mbyhzdHJ1Y3QgdmRlY19hdjFfaW5zdCAqaW5zdCwKKwkJCSBzdHJ1Y3QgdmRlY19waWNfaW5mbyAqcGljKQoreworCSpwaWMgPSBpbnN0LT52c2ktPnBpYzsKKworCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVhJTkZPLAorCQkicGljKCVkLCAlZCksIGJ1ZiglZCwgJWQpXG4iLAorCQkgcGljLT52aXNpYmxlX3dpZHRoLCBwaWMtPnZpc2libGVfaGVpZ2h0LAorCQkgcGljLT5jb2RlZF93aWR0aCwgcGljLT5jb2RlZF9oZWlnaHQpOworCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVhJTkZPLAorCQkiWSglZCwgJWQpLCBDKCVkLCAlZClcbiIsCisJCXBpYy0+eV9ic19zeiwgcGljLT55X2xlbl9zeiwKKwkJcGljLT5jX2JzX3N6LCBwaWMtPmNfbGVuX3N6KTsKK30KKworc3RhdGljIHZvaWQgZ2V0X2Nyb3BfaW5mbyhzdHJ1Y3QgdmRlY19hdjFfaW5zdCAqaW5zdCwgc3RydWN0IHY0bDJfcmVjdCAqY3IpCit7CisJY3ItPmxlZnQgPSBpbnN0LT52c2ktPmNyb3AubGVmdDsKKwljci0+dG9wID0gaW5zdC0+dnNpLT5jcm9wLnRvcDsKKwljci0+d2lkdGggPSBpbnN0LT52c2ktPmNyb3Aud2lkdGg7CisJY3ItPmhlaWdodCA9IGluc3QtPnZzaS0+Y3JvcC5oZWlnaHQ7CisKKwl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywKKwkJImw9JWQsIHQ9JWQsIHc9JWQsIGg9JWRcbiIsCisJCSBjci0+bGVmdCwgY3ItPnRvcCwgY3ItPndpZHRoLCBjci0+aGVpZ2h0KTsKK30KKworc3RhdGljIHZvaWQgZ2V0X2RwYl9zaXplKHN0cnVjdCB2ZGVjX2F2MV9pbnN0ICppbnN0LCB1bnNpZ25lZCBpbnQgKmRwYl9zeikKK3sKKwkqZHBiX3N6ID0gaW5zdC0+dnNpLT5kZWMuZHBiX3N6OworCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVhJTkZPLCAic3o9JWRcbiIsICpkcGJfc3opOworfQorCitzdGF0aWMgdTMyIHZkZWNfY29uZmlnX2RlZmF1bHRfcGFybXModTggKnBhcm0pCit7CisJdTggKnBidWYgPSBwYXJtOworCisJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJwYXJtX3Y0bF9jb2RlY19lbmFibGU6MTsiKTsKKwlwYnVmICs9IHNwcmludGYocGJ1ZiwgInBhcm1fdjRsX2J1ZmZlcl9tYXJnaW46NzsiKTsKKwlwYnVmICs9IHNwcmludGYocGJ1ZiwgImF2MV9kb3VibGVfd3JpdGVfbW9kZToxOyIpOworCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiYXYxX2J1Zl93aWR0aDoxOTIwOyIpOworCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiYXYxX2J1Zl9oZWlnaHQ6MTA4ODsiKTsKKwlwYnVmICs9IHNwcmludGYocGJ1ZiwgImF2MV9tYXhfcGljX3c6NDA5NjsiKTsKKwlwYnVmICs9IHNwcmludGYocGJ1ZiwgImF2MV9tYXhfcGljX2g6MjMwNDsiKTsKKwlwYnVmICs9IHNwcmludGYocGJ1ZiwgInNhdmVfYnVmZmVyX21vZGU6MDsiKTsKKwlwYnVmICs9IHNwcmludGYocGJ1ZiwgIm5vX2hlYWQ6MDsiKTsKKwlwYnVmICs9IHNwcmludGYocGJ1ZiwgInBhcm1fdjRsX2NhbnZhc19tZW1fbW9kZTowOyIpOworCXBidWYgKz0gc3ByaW50ZihwYnVmLCAicGFybV92NGxfY2FudmFzX21lbV9lbmRpYW46MDsiKTsKKworCXJldHVybiBwYXJtIC0gcGJ1ZjsKK30KKworc3RhdGljIHZvaWQgdmRlY19wYXJzZXJfcGFybXMoc3RydWN0IHZkZWNfYXYxX2luc3QgKmluc3QpCit7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPSBpbnN0LT5jdHg7CisKKwl2NGxfZGJnKGN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywKKwkJIiVzOnBhcm1zX3N0YXR1cyA9IDB4JXgsIHByZXNlbnRfZmxhZyA9ICVkXG4iLAorCQlfX2Z1bmNfXywgY3R4LT5jb25maWcucGFybS5kZWMucGFybXNfc3RhdHVzLAorCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5oZHIuY29sb3JfcGFybXMucHJlc2VudF9mbGFnKTsKKwlpZiAoY3R4LT5jb25maWcucGFybS5kZWMucGFybXNfc3RhdHVzICYKKwkJVjRMMl9DT05GSUdfUEFSTV9ERUNPREVfQ0ZHSU5GTykgeworCQl1OCAqcGJ1ZiA9IGN0eC0+Y29uZmlnLmJ1ZjsKKworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgInBhcm1fdjRsX2NvZGVjX2VuYWJsZToxOyIpOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgInBhcm1fdjRsX2J1ZmZlcl9tYXJnaW46JWQ7IiwKKwkJCWN0eC0+Y29uZmlnLnBhcm0uZGVjLmNmZy5yZWZfYnVmX21hcmdpbik7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiYXYxX2RvdWJsZV93cml0ZV9tb2RlOiVkOyIsCisJCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5jZmcuZG91YmxlX3dyaXRlX21vZGUpOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgImF2MV9idWZfd2lkdGg6MTkyMDsiKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJhdjFfYnVmX2hlaWdodDoxMDg4OyIpOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgInNhdmVfYnVmZmVyX21vZGU6MDsiKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJub19oZWFkOjA7Iik7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAicGFybV92NGxfY2FudmFzX21lbV9tb2RlOiVkOyIsCisJCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5jZmcuY2FudmFzX21lbV9tb2RlKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJwYXJtX3Y0bF9jYW52YXNfbWVtX2VuZGlhbjolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuY2ZnLmNhbnZhc19tZW1fZW5kaWFuKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJwYXJtX3Y0bF9sb3dfbGF0ZW5jeV9tb2RlOiVkOyIsCisJCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5jZmcubG93X2xhdGVuY3lfbW9kZSk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAicGFybV92NGxfZHVyYXRpb246JWQ7IiwKKwkJCWN0eC0+Y29uZmlnLnBhcm0uZGVjLmNmZy5kdXJhdGlvbik7CisJCWN0eC0+Y29uZmlnLmxlbmd0aCA9IHBidWYgLSBjdHgtPmNvbmZpZy5idWY7CisJfSBlbHNlIHsKKwkJY3R4LT5jb25maWcucGFybS5kZWMuY2ZnLmRvdWJsZV93cml0ZV9tb2RlID0gMTsKKwkJY3R4LT5jb25maWcucGFybS5kZWMuY2ZnLnJlZl9idWZfbWFyZ2luID0gNzsKKwkJY3R4LT5jb25maWcubGVuZ3RoID0gdmRlY19jb25maWdfZGVmYXVsdF9wYXJtcyhjdHgtPmNvbmZpZy5idWYpOworCX0KKworCWlmICgoY3R4LT5jb25maWcucGFybS5kZWMucGFybXNfc3RhdHVzICYKKwkJVjRMMl9DT05GSUdfUEFSTV9ERUNPREVfSERSSU5GTykgJiYKKwkJY3R4LT5jb25maWcucGFybS5kZWMuaGRyLmNvbG9yX3Bhcm1zLnByZXNlbnRfZmxhZykgeworCQl1OCAqcGJ1ZiA9IGN0eC0+Y29uZmlnLmJ1ZiArIGN0eC0+Y29uZmlnLmxlbmd0aDsKKworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIkhEUlN0YXRpY0luZm86JWQ7IiwgMSk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAic2lnbmFsX3R5cGU6JWQ7IiwKKwkJCWN0eC0+Y29uZmlnLnBhcm0uZGVjLmhkci5zaWduYWxfdHlwZSk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAibUcueDolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuaGRyLmNvbG9yX3Bhcm1zLnByaW1hcmllc1swXVswXSk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAibUcueTolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuaGRyLmNvbG9yX3Bhcm1zLnByaW1hcmllc1swXVsxXSk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAibUIueDolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuaGRyLmNvbG9yX3Bhcm1zLnByaW1hcmllc1sxXVswXSk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAibUIueTolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuaGRyLmNvbG9yX3Bhcm1zLnByaW1hcmllc1sxXVsxXSk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAibVIueDolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuaGRyLmNvbG9yX3Bhcm1zLnByaW1hcmllc1syXVswXSk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAibVIueTolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuaGRyLmNvbG9yX3Bhcm1zLnByaW1hcmllc1syXVsxXSk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAibVcueDolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuaGRyLmNvbG9yX3Bhcm1zLndoaXRlX3BvaW50WzBdKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJtVy55OiVkOyIsCisJCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5oZHIuY29sb3JfcGFybXMud2hpdGVfcG9pbnRbMV0pOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIm1NYXhETDolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuaGRyLmNvbG9yX3Bhcm1zLmx1bWluYW5jZVswXSAqIDEwMDApOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIm1NaW5ETDolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuaGRyLmNvbG9yX3Bhcm1zLmx1bWluYW5jZVsxXSk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAibU1heENMTDolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuaGRyLmNvbG9yX3Bhcm1zLmNvbnRlbnRfbGlnaHRfbGV2ZWwubWF4X2NvbnRlbnQpOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIm1NYXhGQUxMOiVkOyIsCisJCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5oZHIuY29sb3JfcGFybXMuY29udGVudF9saWdodF9sZXZlbC5tYXhfcGljX2F2ZXJhZ2UpOworCQljdHgtPmNvbmZpZy5sZW5ndGgJPSBwYnVmIC0gY3R4LT5jb25maWcuYnVmOworCQlpbnN0LT5wYXJtcy5oZHIJCT0gY3R4LT5jb25maWcucGFybS5kZWMuaGRyOworCQlpbnN0LT5wYXJtcy5wYXJtc19zdGF0dXMgfD0gVjRMMl9DT05GSUdfUEFSTV9ERUNPREVfSERSSU5GTzsKKwl9CisJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FWElORk8sCisJCSJjb25maWcuYnVmID0gJXNcbiIsIGN0eC0+Y29uZmlnLmJ1Zik7CisKKwlpbnN0LT52ZGVjLmNvbmZpZwk9IGN0eC0+Y29uZmlnOworCWluc3QtPnBhcm1zLmNmZwkJPSBjdHgtPmNvbmZpZy5wYXJtLmRlYy5jZmc7CisJaW5zdC0+cGFybXMucGFybXNfc3RhdHVzIHw9IFY0TDJfQ09ORklHX1BBUk1fREVDT0RFX0NGR0lORk87Cit9CisKK3N0YXRpYyBpbnQgdmRlY19hdjFfaW5pdChzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCwgdW5zaWduZWQgbG9uZyAqaF92ZGVjKQoreworCXN0cnVjdCB2ZGVjX2F2MV9pbnN0ICppbnN0ID0gTlVMTDsKKwlpbnQgcmV0ID0gLTE7CisKKwlpbnN0ID0ga3phbGxvYyhzaXplb2YoKmluc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluc3QpCisJCXJldHVybiAtRU5PTUVNOworCisJaW5zdC0+dmRlYy5mcm1fbmFtZQk9ICJBVjEiOworCWluc3QtPnZkZWMudmlkZW9fdHlwZQk9IFZGT1JNQVRfQVYxOworCWluc3QtPnZkZWMuZmlscAkJPSBjdHgtPmRldi0+ZmlscDsKKwlpbnN0LT52ZGVjLmN0eAkJPSBjdHg7CisJaW5zdC0+Y3R4CQk9IGN0eDsKKworCXZkZWNfcGFyc2VyX3Bhcm1zKGluc3QpOworCisJLyogc2V0IHBsYXkgbW9kZS4qLworCWlmIChjdHgtPmlzX2RybV9tb2RlKQorCQlpbnN0LT52ZGVjLnBvcnQuZmxhZyB8PSBQT1JUX0ZMQUdfRFJNOworCisJLyogdG8gZWFibGUgYXYxIGh3LiovCisJaW5zdC0+dmRlYy5wb3J0LnR5cGUJPSBQT1JUX1RZUEVfSEVWQzsKKworCS8qIHByb2JlIGluZm8gZnJvbSB0aGUgc3RyZWFtICovCisJaW5zdC0+dnNpID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZkZWNfYXYxX3ZzaSksIEdGUF9LRVJORUwpOworCWlmICghaW5zdC0+dnNpKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCS8qIGFsbG9jIHRoZSBoZWFkZXIgYnVmZmVyIHRvIGJlIHVzZWQgY2FjaGUgc3BzIG9yIHNwcCBldGMuKi8KKwlpbnN0LT52c2ktPmhlYWRlcl9idWYgPSB2emFsbG9jKEhFQURFUl9CVUZGRVJfU0laRSk7CisJaWYgKCFpbnN0LT52c2ktPmhlYWRlcl9idWYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJaW5pdF9jb21wbGV0aW9uKCZpbnN0LT5jb21wKTsKKworCWN0eC0+YWRhX2N0eAk9ICZpbnN0LT52ZGVjOworCSpoX3ZkZWMJCT0gKHVuc2lnbmVkIGxvbmcpaW5zdDsKKworCS8qIGluaXQgZGVjb2Rlci4gKi8KKwlyZXQgPSB2aWRlb19kZWNvZGVyX2luaXQoJmluc3QtPnZkZWMpOworCWlmIChyZXQpIHsKKwkJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJ2ZGVjX2F2MSBpbml0IGVycj0lZFxuIiwgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19QUklORk8sCisJCSJhdjEgSW5zdGFuY2UgPj4gJWx4XG4iLCAodWxvbmcpIGluc3QpOworCisJcmV0dXJuIDA7CitlcnI6CisJaWYgKGluc3QgJiYgaW5zdC0+dnNpICYmIGluc3QtPnZzaS0+aGVhZGVyX2J1ZikKKwkJdmZyZWUoaW5zdC0+dnNpLT5oZWFkZXJfYnVmKTsKKwlpZiAoaW5zdCAmJiBpbnN0LT52c2kpCisJCWtmcmVlKGluc3QtPnZzaSk7CisJaWYgKGluc3QpCisJCWtmcmVlKGluc3QpOworCSpoX3ZkZWMgPSAwOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwYXJzZV9zdHJlYW1fdWNvZGUoc3RydWN0IHZkZWNfYXYxX2luc3QgKmluc3QsCisJCQkgICAgICB1OCAqYnVmLCB1MzIgc2l6ZSwgdTY0IHRpbWVzdGFtcCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IHZkZWNfd3JpdGVfbmFsdShpbnN0LCBidWYsIHNpemUsIHRpbWVzdGFtcCk7CisJaWYgKHJldCA8IDApIHsKKwkJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJ3cml0ZSBkYXRhIGZhaWxlZC4gc2l6ZTogJWQsIGVycjogJWRcbiIsIHNpemUsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogd2FpdCB1Y29kZSBwYXJzZSBlbmRpbmcuICovCisJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpbnN0LT5jb21wLAorCQltc2Vjc190b19qaWZmaWVzKDEwMDApKTsKKworCXJldHVybiBpbnN0LT52c2ktPnBpYy5kcGJfZnJhbWVzID8gMCA6IC0xOworfQorCitzdGF0aWMgaW50IHBhcnNlX3N0cmVhbV91Y29kZV9kbWEoc3RydWN0IHZkZWNfYXYxX2luc3QgKmluc3QsCisJdWxvbmcgYnVmLCB1MzIgc2l6ZSwgdTY0IHRpbWVzdGFtcCwgdTMyIGhhbmRsZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYW1sX3ZkZWNfYWRhcHQgKnZkZWMgPSAmaW5zdC0+dmRlYzsKKworCXJldCA9IHZkZWNfdmZyYW1lX3dyaXRlX3dpdGhfZG1hKHZkZWMsIGJ1Ziwgc2l6ZSwgdGltZXN0YW1wLCBoYW5kbGUsCisJCXZkZWNfdmZyYW1lX2lucHV0X2ZyZWUsIGluc3QtPmN0eCk7CisJaWYgKHJldCA8IDApIHsKKwkJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJ3cml0ZSBmcmFtZSBkYXRhIGZhaWxlZC4gZXJyOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiB3YWl0IHVjb2RlIHBhcnNlIGVuZGluZy4gKi8KKwl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmluc3QtPmNvbXAsCisJCW1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOworCisJcmV0dXJuIGluc3QtPnZzaS0+cGljLmRwYl9mcmFtZXMgPyAwIDogLTE7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfc3RyZWFtX2NwdShzdHJ1Y3QgdmRlY19hdjFfaW5zdCAqaW5zdCwgdTggKmJ1ZiwgdTMyIHNpemUpCit7CisJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJImNhbiBub3Qgc3VwcHBvcnQgcGFyc2Ugc3RyZWFtIGJ5IGNwdS5cbiIpOworCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHZkZWNfYXYxX3Byb2JlKHVuc2lnbmVkIGxvbmcgaF92ZGVjLAorCXN0cnVjdCBhbWxfdmNvZGVjX21lbSAqYnMsIHZvaWQgKm91dCkKK3sKKwlzdHJ1Y3QgdmRlY19hdjFfaW5zdCAqaW5zdCA9CisJCShzdHJ1Y3QgdmRlY19hdjFfaW5zdCAqKWhfdmRlYzsKKwl1OCAqYnVmID0gKHU4ICopYnMtPnZhZGRyOworCXUzMiBzaXplID0gYnMtPnNpemU7CisJaW50IHJldCA9IDA7CisKKwlpZiAoaW5zdC0+Y3R4LT5pc19kcm1fbW9kZSkgeworCQlpZiAoYnMtPm1vZGVsID09IFZCMl9NRU1PUllfTU1BUCkgeworCQkJc3RydWN0IGFtbF92aWRlb19zdHJlYW0gKnMgPQorCQkJCShzdHJ1Y3QgYW1sX3ZpZGVvX3N0cmVhbSAqKSBidWY7CisKKwkJCWlmICgocy0+bWFnaWMgIT0gQU1MX1ZJREVPX01BR0lDKSAmJgorCQkJCShzLT50eXBlICE9IFY0TF9TVFJFQU1fVFlQRV9NQVRFREFUQSkpCisJCQkJcmV0dXJuIC0xOworCisJCQlpZiAoaW5zdC0+Y3R4LT5wYXJhbV9zZXRzX2Zyb21fdWNvZGUpIHsKKwkJCQlyZXQgPSBwYXJzZV9zdHJlYW1fdWNvZGUoaW5zdCwgcy0+ZGF0YSwKKwkJCQkJcy0+bGVuLCBicy0+dGltZXN0YW1wKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0ID0gcGFyc2Vfc3RyZWFtX2NwdShpbnN0LCBzLT5kYXRhLCBzLT5sZW4pOworCQkJfQorCQl9IGVsc2UgaWYgKGJzLT5tb2RlbCA9PSBWQjJfTUVNT1JZX0RNQUJVRiB8fAorCQkJYnMtPm1vZGVsID09IFZCMl9NRU1PUllfVVNFUlBUUikgeworCQkJcmV0ID0gcGFyc2Vfc3RyZWFtX3Vjb2RlX2RtYShpbnN0LCBicy0+YWRkciwgc2l6ZSwKKwkJCQlicy0+dGltZXN0YW1wLCBCVUZGX0lEWChicywgYnMtPmluZGV4KSk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoaW5zdC0+Y3R4LT5wYXJhbV9zZXRzX2Zyb21fdWNvZGUpIHsKKwkJCXJldCA9IHBhcnNlX3N0cmVhbV91Y29kZShpbnN0LCBidWYsIHNpemUsIGJzLT50aW1lc3RhbXApOworCQl9IGVsc2UgeworCQkJcmV0ID0gcGFyc2Vfc3RyZWFtX2NwdShpbnN0LCBidWYsIHNpemUpOworCQl9CisJfQorCisJaW5zdC0+dnNpLT5jdXJfcGljID0gaW5zdC0+dnNpLT5waWM7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB2ZGVjX2F2MV9kZWluaXQodW5zaWduZWQgbG9uZyBoX3ZkZWMpCit7CisJc3RydWN0IHZkZWNfYXYxX2luc3QgKmluc3QgPSAoc3RydWN0IHZkZWNfYXYxX2luc3QgKiloX3ZkZWM7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPSBpbnN0LT5jdHg7CisKKwl2aWRlb19kZWNvZGVyX3JlbGVhc2UoJmluc3QtPnZkZWMpOworCisJaWYgKGluc3QtPnZzaSAmJiBpbnN0LT52c2ktPmhlYWRlcl9idWYpCisJCXZmcmVlKGluc3QtPnZzaS0+aGVhZGVyX2J1Zik7CisKKwlpZiAoaW5zdC0+dnNpKQorCQlrZnJlZShpbnN0LT52c2kpOworCisJa2ZyZWUoaW5zdCk7CisKKwljdHgtPmRydl9oYW5kbGUgPSAwOworfQorCisvLyBSZXR1cm5zIDEgd2hlbiBPQlUgdHlwZSBpcyB2YWxpZCwgYW5kIDAgb3RoZXJ3aXNlLgorc3RhdGljIGludCB2YWxpZF9vYnVfdHlwZShpbnQgb2J1X3R5cGUpCit7CisJaW50IHZhbGlkX3R5cGUgPSAwOworCisJc3dpdGNoIChvYnVfdHlwZSkgeworCWNhc2UgT0JVX1NFUVVFTkNFX0hFQURFUjoKKwljYXNlIE9CVV9URU1QT1JBTF9ERUxJTUlURVI6CisJY2FzZSBPQlVfRlJBTUVfSEVBREVSOgorCWNhc2UgT0JVX1RJTEVfR1JPVVA6CisJY2FzZSBPQlVfTUVUQURBVEE6CisJY2FzZSBPQlVfRlJBTUU6CisJY2FzZSBPQlVfUkVEVU5EQU5UX0ZSQU1FX0hFQURFUjoKKwljYXNlIE9CVV9USUxFX0xJU1Q6CisJY2FzZSBPQlVfUEFERElORzoKKwkJdmFsaWRfdHlwZSA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiB2YWxpZF90eXBlOworfQorCitzaXplX3QgdWxlYl9zaXplX2luX2J5dGVzKHU2NCB2YWx1ZSkKK3sKKwlzaXplX3Qgc2l6ZSA9IDA7CisKKwlkbyB7CisJCSsrc2l6ZTsKKwl9IHdoaWxlICgodmFsdWUgPj49IDcpICE9IDApOworCisJcmV0dXJuIHNpemU7Cit9CisKK2ludCB1bGViX2RlY29kZShjb25zdCB1OCAqYnVmZmVyLCBzaXplX3QgYXZhaWxhYmxlLAorCXU2NCAqdmFsdWUsIHNpemVfdCAqbGVuZ3RoKQoreworCWludCBpOworCisJaWYgKGJ1ZmZlciAmJiB2YWx1ZSkgeworCQkqdmFsdWUgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBrTWF4aW11bUxlYjEyOFNpemUgJiYgaSA8IGF2YWlsYWJsZTsgKytpKSB7CisJCQljb25zdCB1OCBkZWNvZGVkX2J5dGUgPSAqKGJ1ZmZlciArIGkpICYga0xlYjEyOEJ5dGVNYXNrOworCisJCQkqdmFsdWUgfD0gKCh1NjQpZGVjb2RlZF9ieXRlKSA8PCAoaSAqIDcpOworCQkJaWYgKCgqKGJ1ZmZlciArIGkpID4+IDcpID09IDApIHsKKwkJCQlpZiAobGVuZ3RoKSB7CisJCQkJCSpsZW5ndGggPSBpICsgMTsKKwkJCQl9CisKKwkJCQkvLyBGYWlsIG9uIHZhbHVlcyBsYXJnZXIgdGhhbiAzMi1iaXRzIHRvIGVuc3VyZSBjb25zaXN0ZW50IGJlaGF2aW9yIG9uCisJCQkJLy8gMzIgYW5kIDY0IGJpdCB0YXJnZXRzOiB2YWx1ZSBpcyB0eXBpY2FsbHkgdXNlZCB0byBkZXRlcm1pbmUgYnVmZmVyCisJCQkJLy8gYWxsb2NhdGlvbiBzaXplLgorCQkJCWlmICgqdmFsdWUgPiBVTE9OR19NQVgpCisJCQkJCXJldHVybiAtMTsKKworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCisJLy8gSWYgd2UgZ2V0IGhlcmUsIGVpdGhlciB0aGUgYnVmZmVyL3ZhbHVlIHBvaW50ZXJzIHdlcmUgaW52YWxpZCwKKwkvLyBvciB3ZSByYW4gb3ZlciB0aGUgYXZhaWxhYmxlIHNwYWNlCisJcmV0dXJuIC0xOworfQorCitpbnQgdWxlYl9lbmNvZGUodTY0IHZhbHVlLCBzaXplX3QgYXZhaWxhYmxlLAorCXU4ICpjb2RlZF92YWx1ZSwgc2l6ZV90ICpjb2RlZF9zaXplKQoreworCWludCBpOworCWNvbnN0IHNpemVfdCBsZWJfc2l6ZSA9IHVsZWJfc2l6ZV9pbl9ieXRlcyh2YWx1ZSk7CisKKwlpZiAodmFsdWUgPiBrTWF4aW11bUxlYjEyOFZhbHVlIHx8IGxlYl9zaXplID4ga01heGltdW1MZWIxMjhTaXplIHx8CisJCWxlYl9zaXplID4gYXZhaWxhYmxlIHx8ICFjb2RlZF92YWx1ZSB8fCAhY29kZWRfc2l6ZSkgeworCQlyZXR1cm4gLTE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGxlYl9zaXplOyArK2kpIHsKKwkJdTggYnl0ZSA9IHZhbHVlICYgMHg3ZjsKKworCQl2YWx1ZSA+Pj0gNzsKKwkJaWYgKHZhbHVlICE9IDApIGJ5dGUgfD0gMHg4MDsgIC8vIFNpZ25hbCB0aGF0IG1vcmUgYnl0ZXMgZm9sbG93LgorCisJCSooY29kZWRfdmFsdWUgKyBpKSA9IGJ5dGU7CisJfQorCisJKmNvZGVkX3NpemUgPSBsZWJfc2l6ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJiX3JlYWRfYml0KHN0cnVjdCByZWFkX2JpdF9idWZmZXIgKnJiKQoreworCWNvbnN0IHUzMiBvZmYgPSByYi0+Yml0X29mZnNldDsKKwljb25zdCB1MzIgcCA9IG9mZiA+PiAzOworCWNvbnN0IGludCBxID0gNyAtIChpbnQpKG9mZiAmIDB4Nyk7CisKKwlpZiAocmItPmJpdF9idWZmZXIgKyBwIDwgcmItPmJpdF9idWZmZXJfZW5kKSB7CisJCWNvbnN0IGludCBiaXQgPSAocmItPmJpdF9idWZmZXJbcF0gPj4gcSkgJiAxOworCisJCXJiLT5iaXRfb2Zmc2V0ID0gb2ZmICsgMTsKKwkJcmV0dXJuIGJpdDsKKwl9IGVsc2UgeworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmJfcmVhZF9saXRlcmFsKHN0cnVjdCByZWFkX2JpdF9idWZmZXIgKnJiLCBpbnQgYml0cykKK3sKKwlpbnQgdmFsdWUgPSAwLCBiaXQ7CisKKwlmb3IgKGJpdCA9IGJpdHMgLSAxOyBiaXQgPj0gMDsgYml0LS0pCisJCXZhbHVlIHw9IHJiX3JlYWRfYml0KHJiKSA8PCBiaXQ7CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9vYnVfc2l6ZShjb25zdCB1OCAqZGF0YSwKKwlzaXplX3QgYnl0ZXNfYXZhaWxhYmxlLAorCXNpemVfdCAqY29uc3Qgb2J1X3NpemUsCisJc2l6ZV90ICpjb25zdCBsZW5ndGhfZmllbGRfc2l6ZSkKK3sKKwl1NjQgdV9vYnVfc2l6ZSA9IDA7CisKKwlpZiAodWxlYl9kZWNvZGUoZGF0YSwgYnl0ZXNfYXZhaWxhYmxlLCAmdV9vYnVfc2l6ZSwgbGVuZ3RoX2ZpZWxkX3NpemUpICE9IDApIHsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICh1X29idV9zaXplID4gVUxPTkdfTUFYKQorCQlyZXR1cm4gLTE7CisKKwkqb2J1X3NpemUgPSAoc2l6ZV90KSB1X29idV9zaXplOworCisJcmV0dXJuIDA7Cit9CisKKy8vIFBhcnNlcyBPQlUgaGVhZGVyIGFuZCBzdG9yZXMgdmFsdWVzIGluICdoZWFkZXInLgorc3RhdGljIGludCByZWFkX29idV9oZWFkZXIoc3RydWN0IHJlYWRfYml0X2J1ZmZlciAqcmIsCisJaW50IGlzX2FubmV4Yiwgc3RydWN0IE9idUhlYWRlciAqaGVhZGVyKQoreworCWNvbnN0IGludCBiaXRfYnVmZmVyX2J5dGVfbGVuZ3RoID0KKwkJcmItPmJpdF9idWZmZXJfZW5kIC0gcmItPmJpdF9idWZmZXI7CisKKwlpZiAoIXJiIHx8ICFoZWFkZXIpCisJCXJldHVybiAtMTsKKworCWlmIChiaXRfYnVmZmVyX2J5dGVfbGVuZ3RoIDwgMSkKKwkJcmV0dXJuIC0xOworCisJaGVhZGVyLT5zaXplID0gMTsKKworCWlmIChyYl9yZWFkX2JpdChyYikgIT0gMCkgeworCQkvLyBGb3JiaWRkZW4gYml0LiBNdXN0IG5vdCBiZSBzZXQuCisJCXJldHVybiAtMTsKKwl9CisKKwloZWFkZXItPnR5cGUgPSAoZW51bSBPQlVfVFlQRSkgcmJfcmVhZF9saXRlcmFsKHJiLCA0KTsKKwlpZiAoIXZhbGlkX29idV90eXBlKGhlYWRlci0+dHlwZSkpCisJCXJldHVybiAtMTsKKworCWhlYWRlci0+aGFzX2V4dGVuc2lvbiA9IHJiX3JlYWRfYml0KHJiKTsKKwloZWFkZXItPmhhc19zaXplX2ZpZWxkID0gcmJfcmVhZF9iaXQocmIpOworCisJaWYgKCFoZWFkZXItPmhhc19zaXplX2ZpZWxkICYmICFpc19hbm5leGIpIHsKKwkJLy8gc2VjdGlvbiA1IG9idSBzdHJlYW1zIG11c3QgaGF2ZSBvYnVfc2l6ZSBmaWVsZCBzZXQuCisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAocmJfcmVhZF9iaXQocmIpICE9IDApIHsKKwkJLy8gb2J1X3Jlc2VydmVkXzFiaXQgbXVzdCBiZSBzZXQgdG8gMC4KKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChoZWFkZXItPmhhc19leHRlbnNpb24pIHsKKwkJaWYgKGJpdF9idWZmZXJfYnl0ZV9sZW5ndGggPT0gMSkKKwkJCXJldHVybiAtMTsKKworCQloZWFkZXItPnNpemUgKz0gMTsKKwkJaGVhZGVyLT50ZW1wb3JhbF9sYXllcl9pZCA9IHJiX3JlYWRfbGl0ZXJhbChyYiwgMyk7CisJCWhlYWRlci0+c3BhdGlhbF9sYXllcl9pZCA9IHJiX3JlYWRfbGl0ZXJhbChyYiwgMik7CisJCWlmIChyYl9yZWFkX2xpdGVyYWwocmIsIDMpICE9IDApIHsKKwkJCS8vIGV4dGVuc2lvbl9oZWFkZXJfcmVzZXJ2ZWRfM2JpdHMgbXVzdCBiZSBzZXQgdG8gMC4KKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitpbnQgcmVhZF9vYnVfaGVhZGVyX2FuZF9zaXplKGNvbnN0IHU4ICpkYXRhLAorCXNpemVfdCBieXRlc19hdmFpbGFibGUsCisJaW50IGlzX2FubmV4YiwKKwlzdHJ1Y3QgT2J1SGVhZGVyICpvYnVfaGVhZGVyLAorCXNpemVfdCAqY29uc3QgcGF5bG9hZF9zaXplLAorCXNpemVfdCAqY29uc3QgYnl0ZXNfcmVhZCkKK3sKKwlzaXplX3QgbGVuZ3RoX2ZpZWxkX3NpemVfb2J1ID0gMDsKKwlzaXplX3QgbGVuZ3RoX2ZpZWxkX3NpemVfcGF5bG9hZCA9IDA7CisJc2l6ZV90IG9idV9zaXplID0gMDsKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgcmVhZF9iaXRfYnVmZmVyIHJiID0geyBkYXRhICsgbGVuZ3RoX2ZpZWxkX3NpemVfb2J1LAorCQlkYXRhICsgYnl0ZXNfYXZhaWxhYmxlLCAwfTsKKworCWlmIChpc19hbm5leGIpIHsKKwkJLy8gU2l6ZSBmaWVsZCBjb21lcyBiZWZvcmUgdGhlIE9CVSBoZWFkZXIsIGFuZCBpbmNsdWRlcyB0aGUgT0JVIGhlYWRlcgorCQlzdGF0dXMgPSByZWFkX29idV9zaXplKGRhdGEsIGJ5dGVzX2F2YWlsYWJsZSwgJm9idV9zaXplLCAmbGVuZ3RoX2ZpZWxkX3NpemVfb2J1KTsKKwkJaWYgKHN0YXR1cyAhPSAwKQorCQkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlzdGF0dXMgPSByZWFkX29idV9oZWFkZXIoJnJiLCBpc19hbm5leGIsIG9idV9oZWFkZXIpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCWlmICghb2J1X2hlYWRlci0+aGFzX3NpemVfZmllbGQpIHsKKwkJLy8gRGVyaXZlIHRoZSBwYXlsb2FkIHNpemUgZnJvbSB0aGUgZGF0YSB3ZSd2ZSBhbHJlYWR5IHJlYWQKKwkJaWYgKG9idV9zaXplIDwgb2J1X2hlYWRlci0+c2l6ZSkKKwkJCXJldHVybiAtMTsKKworCQkqcGF5bG9hZF9zaXplID0gb2J1X3NpemUgLSBvYnVfaGVhZGVyLT5zaXplOworCX0gZWxzZSB7CisJCS8vIFNpemUgZmllbGQgY29tZXMgYWZ0ZXIgdGhlIE9CVSBoZWFkZXIsIGFuZCBpcyBqdXN0IHRoZSBwYXlsb2FkIHNpemUKKwkJc3RhdHVzID0gcmVhZF9vYnVfc2l6ZShkYXRhICsgbGVuZ3RoX2ZpZWxkX3NpemVfb2J1ICsgb2J1X2hlYWRlci0+c2l6ZSwKKwkJCWJ5dGVzX2F2YWlsYWJsZSAtIGxlbmd0aF9maWVsZF9zaXplX29idSAtIG9idV9oZWFkZXItPnNpemUsCisJCQlwYXlsb2FkX3NpemUsICZsZW5ndGhfZmllbGRfc2l6ZV9wYXlsb2FkKTsKKwkJaWYgKHN0YXR1cyAhPSAwKQorCQkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkqYnl0ZXNfcmVhZCA9IGxlbmd0aF9maWVsZF9zaXplX29idSArIG9idV9oZWFkZXItPnNpemUgKyBsZW5ndGhfZmllbGRfc2l6ZV9wYXlsb2FkOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBwYXJzZXJfZnJhbWUoaW50IGlzX2FubmV4YiwgdTggKmRhdGEsIGNvbnN0IHU4ICpkYXRhX2VuZCwKKwl1OCAqZHN0X2RhdGEsIHUzMiAqZnJhbWVfbGVuLCB1OCAqbWV0YV9idWYsIHUzMiAqbWV0YV9sZW4pCit7CisJaW50IGZyYW1lX2RlY29kaW5nX2ZpbmlzaGVkID0gMDsKKwl1MzIgb2J1X3NpemUgPSAwOworCWludCBzZWVuX2ZyYW1lX2hlYWRlciA9IDA7CisJaW50IG5leHRfc3RhcnRfdGlsZSA9IDA7CisJc3RydWN0IERhdGFCdWZmZXIgb2J1X3NpemVfaGRyOworCXU4IGhlYWRlclsyMF0gPSB7MH07CisJdTggKnAgPSBOVUxMOworCXUzMiBycHVfc2l6ZSA9IDA7CisJc3RydWN0IE9idUhlYWRlciBvYnVfaGVhZGVyOworCisJbWVtc2V0KCZvYnVfaGVhZGVyLCAwLCBzaXplb2Yob2J1X2hlYWRlcikpOworCisJLy8gZGVjb2RlIGZyYW1lIGFzIGEgc2VyaWVzIG9mIE9CVXMKKwl3aGlsZSAoIWZyYW1lX2RlY29kaW5nX2ZpbmlzaGVkKSB7CisJCS8vCXN0cnVjdCByZWFkX2JpdF9idWZmZXIgcmI7CisJCXNpemVfdCBwYXlsb2FkX3NpemUgPSAwOworCQlzaXplX3QgaGVhZGVyX3NpemUgPSAwOworCQlzaXplX3QgYnl0ZXNfcmVhZCA9IDA7CisJCWNvbnN0IHNpemVfdCBieXRlc19hdmFpbGFibGUgPSBkYXRhX2VuZCAtIGRhdGE7CisJCWVudW0gT0JVX01FVEFEQVRBX1RZUEUgbWV0YV90eXBlOworCQlpbnQgc3RhdHVzOworCQl1NjQgdHlwZTsKKwkJdTMyIGk7CisKKwkJaWYgKGJ5dGVzX2F2YWlsYWJsZSA9PSAwICYmICFzZWVuX2ZyYW1lX2hlYWRlcikgeworCQkJYnJlYWs7CisJCX0KKworCQlzdGF0dXMgPSByZWFkX29idV9oZWFkZXJfYW5kX3NpemUoZGF0YSwgYnl0ZXNfYXZhaWxhYmxlLCBpc19hbm5leGIsCisJCQkmb2J1X2hlYWRlciwgJnBheWxvYWRfc2l6ZSwgJmJ5dGVzX3JlYWQpOworCQlpZiAoc3RhdHVzICE9IDApIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCS8vIFJlY29yZCBvYnUgc2l6ZSBoZWFkZXIgaW5mb3JtYXRpb24uCisJCW9idV9zaXplX2hkci5kYXRhID0gZGF0YSArIG9idV9oZWFkZXIuc2l6ZTsKKwkJb2J1X3NpemVfaGRyLnNpemUgPSBieXRlc19yZWFkIC0gb2J1X2hlYWRlci5zaXplOworCisJCS8vIE5vdGU6IHJlYWRfb2J1X2hlYWRlcl9hbmRfc2l6ZSgpIHRha2VzIGNhcmUgb2YgY2hlY2tpbmcgdGhhdCB0aGlzCisJCS8vIGRvZXNuJ3QgY2F1c2UgJ2RhdGEnIHRvIGFkdmFuY2UgcGFzdCAnZGF0YV9lbmQnLgorCisJCWlmICgoc2l6ZV90KShkYXRhX2VuZCAtIGRhdGEgLSBieXRlc19yZWFkKSA8IHBheWxvYWRfc2l6ZSkgeworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLCAib2J1ICVzIGxlbiAlenUrJXp1XG4iLAorCQkJb2J1X3R5cGVfbmFtZVtvYnVfaGVhZGVyLnR5cGVdLAorCQkJYnl0ZXNfcmVhZCwgcGF5bG9hZF9zaXplKTsKKworCQlpZiAoIWlzX2FubmV4YikgeworCQkJb2J1X3NpemUgPSBieXRlc19yZWFkICsgcGF5bG9hZF9zaXplICsgNDsKKwkJCWhlYWRlcl9zaXplID0gMjA7CisJCX0gZWxzZSB7CisJCQlvYnVfc2l6ZSA9IGJ5dGVzX3JlYWQgKyBwYXlsb2FkX3NpemU7CisJCQloZWFkZXJfc2l6ZSA9IDE2OworCQl9CisKKwkJaGVhZGVyWzBdID0gKChvYnVfc2l6ZSArIDQpID4+IDI0KSAmIDB4ZmY7CisJCWhlYWRlclsxXSA9ICgob2J1X3NpemUgKyA0KSA+PiAxNikgJiAweGZmOworCQloZWFkZXJbMl0gPSAoKG9idV9zaXplICsgNCkgPj4gOCkgJiAweGZmOworCQloZWFkZXJbM10gPSAoKG9idV9zaXplICsgNCkgPj4gMCkgJiAweGZmOworCQloZWFkZXJbNF0gPSBoZWFkZXJbMF0gXiAweGZmOworCQloZWFkZXJbNV0gPSBoZWFkZXJbMV0gXiAweGZmOworCQloZWFkZXJbNl0gPSBoZWFkZXJbMl0gXiAweGZmOworCQloZWFkZXJbN10gPSBoZWFkZXJbM10gXiAweGZmOworCQloZWFkZXJbOF0gPSAwOworCQloZWFkZXJbOV0gPSAwOworCQloZWFkZXJbMTBdID0gMDsKKwkJaGVhZGVyWzExXSA9IDE7CisJCWhlYWRlclsxMl0gPSAnQSc7CisJCWhlYWRlclsxM10gPSAnTSc7CisJCWhlYWRlclsxNF0gPSAnTCc7CisJCWhlYWRlclsxNV0gPSAnVic7CisKKwkJLy8gcHV0IG5ldyBzaXplIHRvIGhlcmUgYXMgYW5uZXhiCisJCWhlYWRlclsxNl0gPSAob2J1X3NpemUgJiAweGZmKSB8IDB4ODA7CisJCWhlYWRlclsxN10gPSAoKG9idV9zaXplID4+IDcpICYgMHhmZikgfCAweDgwOworCQloZWFkZXJbMThdID0gKChvYnVfc2l6ZSA+PiAxNCkgJiAweGZmKSB8IDB4ODA7CisJCWhlYWRlclsxOV0gPSAoKG9idV9zaXplID4+IDIxKSAmIDB4ZmYpIHwgMHgwMDsKKworCQltZW1jcHkoZHN0X2RhdGEsIGhlYWRlciwgaGVhZGVyX3NpemUpOworCQlkc3RfZGF0YSArPSBoZWFkZXJfc2l6ZTsKKwkJbWVtY3B5KGRzdF9kYXRhLCBkYXRhLCBieXRlc19yZWFkICsgcGF5bG9hZF9zaXplKTsKKwkJZHN0X2RhdGEgKz0gKGJ5dGVzX3JlYWQgKyBwYXlsb2FkX3NpemUpOworCisJCWRhdGEgKz0gYnl0ZXNfcmVhZDsKKwkJKmZyYW1lX2xlbiArPSAoaGVhZGVyX3NpemUgKyBieXRlc19yZWFkICsgcGF5bG9hZF9zaXplKTsKKworCQlzd2l0Y2ggKG9idV9oZWFkZXIudHlwZSkgeworCQljYXNlIE9CVV9URU1QT1JBTF9ERUxJTUlURVI6CisJCQlzZWVuX2ZyYW1lX2hlYWRlciA9IDA7CisJCQluZXh0X3N0YXJ0X3RpbGUgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgT0JVX1NFUVVFTkNFX0hFQURFUjoKKwkJCS8vIFRoZSBzZXF1ZW5jZSBoZWFkZXIgc2hvdWxkIG5vdCBjaGFuZ2UgaW4gdGhlIG1pZGRsZSBvZiBhIGZyYW1lLgorCQkJaWYgKHNlZW5fZnJhbWVfaGVhZGVyKSB7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgT0JVX0ZSQU1FX0hFQURFUjoKKwkJCWlmIChkYXRhX2VuZCA9PSBkYXRhICsgcGF5bG9hZF9zaXplKSB7CisJCQkJZnJhbWVfZGVjb2RpbmdfZmluaXNoZWQgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlzZWVuX2ZyYW1lX2hlYWRlciA9IDE7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPQlVfUkVEVU5EQU5UX0ZSQU1FX0hFQURFUjoKKwkJY2FzZSBPQlVfRlJBTUU6CisJCQlpZiAob2J1X2hlYWRlci50eXBlID09IE9CVV9SRURVTkRBTlRfRlJBTUVfSEVBREVSKSB7CisJCQkJaWYgKCFzZWVuX2ZyYW1lX2hlYWRlcikgeworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvLyBPQlVfRlJBTUVfSEVBREVSIG9yIE9CVV9GUkFNRS4KKwkJCQlpZiAoc2Vlbl9mcmFtZV9oZWFkZXIpIHsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCX0KKwkJCWlmIChvYnVfaGVhZGVyLnR5cGUgPT0gT0JVX0ZSQU1FKSB7CisJCQkJaWYgKGRhdGFfZW5kID09IGRhdGEgKyBwYXlsb2FkX3NpemUpIHsKKwkJCQkJZnJhbWVfZGVjb2RpbmdfZmluaXNoZWQgPSAxOworCQkJCQlzZWVuX2ZyYW1lX2hlYWRlciA9IDA7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgT0JVX1RJTEVfR1JPVVA6CisJCQlpZiAoIXNlZW5fZnJhbWVfaGVhZGVyKSB7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKGRhdGEgKyBwYXlsb2FkX3NpemUgPT0gZGF0YV9lbmQpCisJCQkJZnJhbWVfZGVjb2RpbmdfZmluaXNoZWQgPSAxOworCQkJaWYgKGZyYW1lX2RlY29kaW5nX2ZpbmlzaGVkKQorCQkJCXNlZW5fZnJhbWVfaGVhZGVyID0gMDsKKwkJCWJyZWFrOworCQljYXNlIE9CVV9NRVRBREFUQToKKwkJCXVsZWJfZGVjb2RlKGRhdGEsIDgsICZ0eXBlLCAmYnl0ZXNfcmVhZCk7CisJCQlpZiAodHlwZSA8IDYpCisJCQkJbWV0YV90eXBlID0gdHlwZTsKKwkJCWVsc2UKKwkJCQltZXRhX3R5cGUgPSAwOworCQkJcCA9IGRhdGEgKyBieXRlc19yZWFkOworCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLAorCQkJCSJtZXRhIHR5cGUgJXMgJXp1KyV6dVxuIiwKKwkJCQltZXRhX3R5cGVfbmFtZVt0eXBlXSwKKwkJCQlieXRlc19yZWFkLAorCQkJCXBheWxvYWRfc2l6ZSAtIGJ5dGVzX3JlYWQpOworCisJCQlpZiAobWV0YV90eXBlID09IE9CVV9NRVRBREFUQV9UWVBFX0lUVVRfVDM1KSB7CisjaWYgMCAvKiBmb3IgZHVtcGluZyBvcmlnaW5hbCBvYnUgcGF5bG9hZCAqLworCQkJCWZvciAoaSA9IDA7IGkgPCBwYXlsb2FkX3NpemUgLSBieXRlc19yZWFkOyBpKyspIHsKKwkJCQkJcHJfaW5mbygiJTAyeCAiLCBwW2ldKTsKKwkJCQkJaWYgKGkgJSAxNiA9PSAxNSkKKwkJCQkJCXByX2luZm8oIlxuIik7CisJCQkJfQorCQkJCWlmIChpICUgMTYgIT0gMCkKKwkJCQkJcHJfaW5mbygiXG4iKTsKKyNlbmRpZgorCQkJCWlmICgocFswXSA9PSAweGI1KSAvKiBjb3VudHJ5IGNvZGUgKi8KKwkJCQkJJiYgKChwWzFdID09IDB4MDApICYmIChwWzJdID09IDB4M2IpKSAvKiB0ZXJtaW5hbF9wcm92aWRlcl9jb2RlICovCisJCQkJCSYmICgocFszXSA9PSAweDAwKSAmJiAocFs0XSA9PSAweDAwKSAmJiAocFs1XSA9PSAweDA4KSAmJiAocFs2XSA9PSAweDAwKSkpIHsgLyogdGVybWluYWxfcHJvdmlkZXJfb3JpZW50ZWRfY29kZSAqLworCQkJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsCisJCQkJCQkiZG9sYnl2aXNvbiBycHVcbiIpOworCQkJCQltZXRhX2J1ZlswXSA9IG1ldGFfYnVmWzFdID0gbWV0YV9idWZbMl0gPSAwOworCQkJCQltZXRhX2J1ZlszXSA9IDB4MDE7CisJCQkJCW1ldGFfYnVmWzRdID0gMHgxOTsKKworCQkJCQlpZiAocFsxMV0gJiAweDEwKSB7CisJCQkJCQlycHVfc2l6ZSA9IDB4MTAwOworCQkJCQkJcnB1X3NpemUgfD0gKHBbMTFdICYgMHgwZikgPDwgNDsKKwkJCQkJCXJwdV9zaXplIHw9IChwWzEyXSA+PiA0KSAmIDB4MGY7CisJCQkJCQlpZiAocFsxMl0gJiAweDA4KSB7CisJCQkJCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLAorCQkJCQkJCQkibWV0YSBycHUgaW4gb2J1IGV4Y2VlZCA1MTIgYnl0ZXNcbiIpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJZm9yIChpID0gMDsgaSA8IHJwdV9zaXplOyBpKyspIHsKKwkJCQkJCQltZXRhX2J1Zls1ICsgaV0gPSAocFsxMiArIGldICYgMHgwNykgPDwgNTsKKwkJCQkJCQltZXRhX2J1Zls1ICsgaV0gfD0gKHBbMTMgKyBpXSA+PiAzKSAmIDB4MWY7CisJCQkJCQl9CisJCQkJCQlycHVfc2l6ZSArPSA1OworCQkJCQl9IGVsc2UgeworCQkJCQkJcnB1X3NpemUgPSAocFsxMF0gJiAweDFmKSA8PCAzOworCQkJCQkJcnB1X3NpemUgfD0gKHBbMTFdID4+IDUpICYgMHgwNzsKKwkJCQkJCWZvciAoaSA9IDA7IGkgPCBycHVfc2l6ZTsgaSsrKSB7CisJCQkJCQkJbWV0YV9idWZbNSArIGldID0gKHBbMTEgKyBpXSAmIDB4MGYpIDw8IDQ7CisJCQkJCQkJbWV0YV9idWZbNSArIGldIHw9IChwWzEyICsgaV0gPj4gNCkgJiAweDBmOworCQkJCQkJfQorCQkJCQkJcnB1X3NpemUgKz0gNTsKKwkJCQkJfQorCQkJCQkqbWV0YV9sZW4gPSBycHVfc2l6ZTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKG1ldGFfdHlwZSA9PSBPQlVfTUVUQURBVEFfVFlQRV9IRFJfQ0xMKSB7CisJCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLCAiaGRyMTAgY2xsOlxuIik7CisJCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLCAibWF4X2NsbCA9ICV4XG4iLCAocFswXSA8PCA4KSB8IHBbMV0pOworCQkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX1BBUlNFUiwgIm1heF9mYWxsID0gJXhcbiIsIChwWzJdIDw8IDgpIHwgcFszXSk7CisJCQl9IGVsc2UgaWYgKG1ldGFfdHlwZSA9PSBPQlVfTUVUQURBVEFfVFlQRV9IRFJfTURDVikgeworCQkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX1BBUlNFUiwgImhkcjEwIHByaW1hcmllc1tyLGcsYl0gPSBcbiIpOworCQkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfUEFSU0VSLCAiICV4LCAleFxuIiwKKwkJCQkJCShwW2kgKiA0XSA8PCA4KSB8IHBbaSAqIDQgKyAxXSwKKwkJCQkJCShwW2kgKiA0ICsgMl0gPDwgOCkgfCBwW2kgKiA0ICsgM10pOworCQkJCX0KKwkJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsCisJCQkJCSJ3aGl0ZSBwb2ludCA9ICV4LCAleFxuIiwgKHBbMTJdIDw8IDgpIHwgcFsxM10sIChwWzE0XSA8PCA4KSB8IHBbMTVdKTsKKwkJCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19QQVJTRVIsCisJCQkJCSJtYXhsID0gJXhcbiIsIChwWzE2XSA8PCAyNCkgfCAocFsxN10gPDwgMTYpIHwgKHBbMThdIDw8IDgpIHwgcFsxOV0pOworCQkJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX1BBUlNFUiwKKwkJCQkJIm1pbmwgPSAleFxuIiwgKHBbMjBdIDw8IDI0KSB8IChwWzIxXSA8PCAxNikgfCAocFsyMl0gPDwgOCkgfCBwWzIzXSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPQlVfVElMRV9MSVNUOgorCQkJYnJlYWs7CisJCWNhc2UgT0JVX1BBRERJTkc6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8vIFNraXAgdW5yZWNvZ25pemVkIE9CVXMKKwkJCWJyZWFrOworCQl9CisKKwkJZGF0YSArPSBwYXlsb2FkX3NpemU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmRlY193cml0ZV9uYWx1KHN0cnVjdCB2ZGVjX2F2MV9pbnN0ICppbnN0LAorCXU4ICpidWYsIHUzMiBzaXplLCB1NjQgdHMpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGFtbF92ZGVjX2FkYXB0ICp2ZGVjID0gJmluc3QtPnZkZWM7CisJdTggKmRhdGEgPSBOVUxMOworCXUzMiBsZW5ndGggPSAwOworCWJvb2wgbmVlZF9wcmVmaXggPSBhdjFfbmVlZF9wcmVmaXg7CisKKwlpZiAobmVlZF9wcmVmaXgpIHsKKwkJdTggbWV0YV9idWZmZXJbMTAyNF0gPSB7MH07CisJCXUzMiBtZXRhX3NpemUgPSAwOworCQl1OCAqc3JjID0gYnVmOworCisJCWRhdGEgPSB2emFsbG9jKHNpemUgKyAweDEwMDApOworCQlpZiAoIWRhdGEpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlwYXJzZXJfZnJhbWUoMCwgc3JjLCBzcmMgKyBzaXplLCBkYXRhLCAmbGVuZ3RoLCBtZXRhX2J1ZmZlciwgJm1ldGFfc2l6ZSk7CisKKwkJaWYgKGxlbmd0aCkKKwkJCXJldCA9IHZkZWNfdmZyYW1lX3dyaXRlKHZkZWMsIGRhdGEsIGxlbmd0aCwgdHMsIDApOworCQllbHNlCisJCQlyZXQgPSAtMTsKKworCQl2ZnJlZShkYXRhKTsKKwl9IGVsc2UgeworCQlyZXQgPSB2ZGVjX3ZmcmFtZV93cml0ZSh2ZGVjLCBidWYsIHNpemUsIHRzLCAwKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgYm9vbCBtb25pdG9yX3Jlc19jaGFuZ2Uoc3RydWN0IHZkZWNfYXYxX2luc3QgKmluc3QsIHU4ICpidWYsIHUzMiBzaXplKQoreworCWludCByZXQgPSAtMTsKKwl1OCAqcCA9IGJ1ZjsKKwlpbnQgbGVuID0gc2l6ZTsKKwl1MzIgc3luY2NvZGUgPSBhdjFfbmVlZF9wcmVmaXggPworCQkoKHBbMV0gPDwgMTYpIHwgKHBbMl0gPDwgOCkgfCBwWzNdKSA6CisJCSgocFsxN10gPDwgMTYpIHwgKHBbMThdIDw8IDgpIHwgcFsxOV0pOworCisJaWYgKHN5bmNjb2RlID09IFNZTkNfQ09ERSkgeworCQlyZXQgPSBwYXJzZV9zdHJlYW1fY3B1KGluc3QsIHAsIGxlbik7CisJCWlmICghcmV0ICYmIChpbnN0LT52c2ktPmN1cl9waWMuY29kZWRfd2lkdGggIT0KKwkJCWluc3QtPnZzaS0+cGljLmNvZGVkX3dpZHRoIHx8CisJCQlpbnN0LT52c2ktPmN1cl9waWMuY29kZWRfaGVpZ2h0ICE9CisJCQlpbnN0LT52c2ktPnBpYy5jb2RlZF9oZWlnaHQpKSB7CisJCQlpbnN0LT52c2ktPmN1cl9waWMgPSBpbnN0LT52c2ktPnBpYzsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50IHZkZWNfYXYxX2RlY29kZSh1bnNpZ25lZCBsb25nIGhfdmRlYywKKwkJCSAgIHN0cnVjdCBhbWxfdmNvZGVjX21lbSAqYnMsIGJvb2wgKnJlc19jaGcpCit7CisJc3RydWN0IHZkZWNfYXYxX2luc3QgKmluc3QgPSAoc3RydWN0IHZkZWNfYXYxX2luc3QgKiloX3ZkZWM7CisJc3RydWN0IGFtbF92ZGVjX2FkYXB0ICp2ZGVjID0gJmluc3QtPnZkZWM7CisJdTggKmJ1ZiA9ICh1OCAqKSBicy0+dmFkZHI7CisJdTMyIHNpemUgPSBicy0+c2l6ZTsKKwlpbnQgcmV0ID0gLTE7CisKKwlpZiAoYnMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKHZkZWNfaW5wdXRfZnVsbCh2ZGVjKSkgeworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlpZiAoaW5zdC0+Y3R4LT5pc19kcm1fbW9kZSkgeworCQlpZiAoYnMtPm1vZGVsID09IFZCMl9NRU1PUllfTU1BUCkgeworCQkJc3RydWN0IGFtbF92aWRlb19zdHJlYW0gKnMgPQorCQkJCShzdHJ1Y3QgYW1sX3ZpZGVvX3N0cmVhbSAqKSBidWY7CisKKwkJCWlmIChzLT5tYWdpYyAhPSBBTUxfVklERU9fTUFHSUMpCisJCQkJcmV0dXJuIC0xOworCisJCQlpZiAoIWluc3QtPmN0eC0+cGFyYW1fc2V0c19mcm9tX3Vjb2RlICYmCisJCQkJKHMtPnR5cGUgPT0gVjRMX1NUUkVBTV9UWVBFX01BVEVEQVRBKSkgeworCQkJCWlmICgoKnJlc19jaGcgPSBtb25pdG9yX3Jlc19jaGFuZ2UoaW5zdCwKKwkJCQkJcy0+ZGF0YSwgcy0+bGVuKSkpCisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCXJldCA9IHZkZWNfdmZyYW1lX3dyaXRlKHZkZWMsCisJCQkJcy0+ZGF0YSwKKwkJCQlzLT5sZW4sCisJCQkJYnMtPnRpbWVzdGFtcCwKKwkJCQkwKTsKKwkJfSBlbHNlIGlmIChicy0+bW9kZWwgPT0gVkIyX01FTU9SWV9ETUFCVUYgfHwKKwkJCWJzLT5tb2RlbCA9PSBWQjJfTUVNT1JZX1VTRVJQVFIpIHsKKwkJCXJldCA9IHZkZWNfdmZyYW1lX3dyaXRlX3dpdGhfZG1hKHZkZWMsCisJCQkJYnMtPmFkZHIsIHNpemUsIGJzLT50aW1lc3RhbXAsCisJCQkJQlVGRl9JRFgoYnMsIGJzLT5pbmRleCksCisJCQkJdmRlY192ZnJhbWVfaW5wdXRfZnJlZSwgaW5zdC0+Y3R4KTsKKwkJfQorCX0gZWxzZSB7CisJCS8qY2hlY2tlZCB3aGV0aGVyIHRoZSByZXNvbHV0aW9uIGNoYW5nZXMuKi8KKwkJaWYgKCghaW5zdC0+Y3R4LT5wYXJhbV9zZXRzX2Zyb21fdWNvZGUpICYmCisJCQkoKnJlc19jaGcgPSBtb25pdG9yX3Jlc19jaGFuZ2UoaW5zdCwgYnVmLCBzaXplKSkpCisJCQlyZXR1cm4gMDsKKworCQlyZXQgPSB2ZGVjX3dyaXRlX25hbHUoaW5zdCwgYnVmLCBzaXplLCBicy0+dGltZXN0YW1wKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisgc3RhdGljIHZvaWQgZ2V0X3BhcmFtX2NvbmZpZ19pbmZvKHN0cnVjdCB2ZGVjX2F2MV9pbnN0ICppbnN0LAorCXN0cnVjdCBhbWxfZGVjX3BhcmFtcyAqcGFybXMpCisgeworCSBpZiAoaW5zdC0+cGFybXMucGFybXNfc3RhdHVzICYgVjRMMl9DT05GSUdfUEFSTV9ERUNPREVfQ0ZHSU5GTykgeworCQkvKiBkdyB1c2UgdjRsIGNmZyAqLworCQlpbnN0LT5wYXJtcy5jZmcuZG91YmxlX3dyaXRlX21vZGUgPQorCQkJaW5zdC0+Y3R4LT5jb25maWcucGFybS5kZWMuY2ZnLmRvdWJsZV93cml0ZV9tb2RlOworCQlwYXJtcy0+Y2ZnID0gaW5zdC0+cGFybXMuY2ZnOworCSB9CisJIGlmIChpbnN0LT5wYXJtcy5wYXJtc19zdGF0dXMgJiBWNEwyX0NPTkZJR19QQVJNX0RFQ09ERV9QU0lORk8pCisJCSBwYXJtcy0+cHMgPSBpbnN0LT5wYXJtcy5wczsKKwkgaWYgKGluc3QtPnBhcm1zLnBhcm1zX3N0YXR1cyAmIFY0TDJfQ09ORklHX1BBUk1fREVDT0RFX0hEUklORk8pCisJCSBwYXJtcy0+aGRyID0gaW5zdC0+cGFybXMuaGRyOworCSBpZiAoaW5zdC0+cGFybXMucGFybXNfc3RhdHVzICYgVjRMMl9DT05GSUdfUEFSTV9ERUNPREVfQ05USU5GTykKKwkJIHBhcm1zLT5jbnQgPSBpbnN0LT5wYXJtcy5jbnQ7CisKKwkgcGFybXMtPnBhcm1zX3N0YXR1cyB8PSBpbnN0LT5wYXJtcy5wYXJtc19zdGF0dXM7CisKKwl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywKKwkJInBhcm1zIHN0YXR1czogJXVcbiIsIHBhcm1zLT5wYXJtc19zdGF0dXMpOworIH0KKworc3RhdGljIHZvaWQgZ2V0X3BhcmFtX2NvbXBfYnVmX2luZm8oc3RydWN0IHZkZWNfYXYxX2luc3QgKmluc3QsCisJCXN0cnVjdCB2ZGVjX2NvbXBfYnVmX2luZm8gKnBhcmFtcykKK3sKKwltZW1jcHkocGFyYW1zLCAmaW5zdC0+Y29tcF9pbmZvLCBzaXplb2YoKnBhcmFtcykpOworfQorCitzdGF0aWMgaW50IHZkZWNfYXYxX2dldF9wYXJhbSh1bnNpZ25lZCBsb25nIGhfdmRlYywKKwkJCSAgICAgICBlbnVtIHZkZWNfZ2V0X3BhcmFtX3R5cGUgdHlwZSwgdm9pZCAqb3V0KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCB2ZGVjX2F2MV9pbnN0ICppbnN0ID0gKHN0cnVjdCB2ZGVjX2F2MV9pbnN0ICopaF92ZGVjOworCisJaWYgKCFpbnN0KSB7CisJCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkidGhlIGF2MSBpbnN0IG9mIGRlYyBpcyBpbnZhbGlkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEdFVF9QQVJBTV9QSUNfSU5GTzoKKwkJZ2V0X3BpY19pbmZvKGluc3QsIG91dCk7CisJCWJyZWFrOworCisJY2FzZSBHRVRfUEFSQU1fRFBCX1NJWkU6CisJCWdldF9kcGJfc2l6ZShpbnN0LCBvdXQpOworCQlicmVhazsKKworCWNhc2UgR0VUX1BBUkFNX0NST1BfSU5GTzoKKwkJZ2V0X2Nyb3BfaW5mbyhpbnN0LCBvdXQpOworCQlicmVhazsKKworCWNhc2UgR0VUX1BBUkFNX0NPTkZJR19JTkZPOgorCQlnZXRfcGFyYW1fY29uZmlnX2luZm8oaW5zdCwgb3V0KTsKKwkJYnJlYWs7CisKKwljYXNlIEdFVF9QQVJBTV9EV19NT0RFOgorCXsKKwkJdTMyICptb2RlID0gb3V0OworCQl1MzIgbSA9IGluc3QtPmN0eC0+Y29uZmlnLnBhcm0uZGVjLmNmZy5kb3VibGVfd3JpdGVfbW9kZTsKKwkJaWYgKG0gPD0gMTYpCisJCQkqbW9kZSA9IGluc3QtPmN0eC0+Y29uZmlnLnBhcm0uZGVjLmNmZy5kb3VibGVfd3JpdGVfbW9kZTsKKwkJZWxzZQorCQkJKm1vZGUgPSB2ZGVjX2dldF9kd19tb2RlKGluc3QsIDApOworCQlicmVhazsKKwl9CisJY2FzZSBHRVRfUEFSQU1fQ09NUF9CVUZfSU5GTzoKKwkJZ2V0X3BhcmFtX2NvbXBfYnVmX2luZm8oaW5zdCwgb3V0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJImludmFsaWQgZ2V0IHBhcmFtZXRlciB0eXBlPSVkXG4iLCB0eXBlKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzZXRfcGFyYW1fd3JpdGVfc3luYyhzdHJ1Y3QgdmRlY19hdjFfaW5zdCAqaW5zdCkKK3sKKwljb21wbGV0ZSgmaW5zdC0+Y29tcCk7Cit9CisKK3N0YXRpYyBpbnQgdmRlY19nZXRfZHdfbW9kZShzdHJ1Y3QgdmRlY19hdjFfaW5zdCAqaW5zdCwgaW50IGR3X21vZGUpCit7CisJdTMyIHZhbGlkX2R3X21vZGUgPSBpbnN0LT5jdHgtPmNvbmZpZy5wYXJtLmRlYy5jZmcuZG91YmxlX3dyaXRlX21vZGU7CisJaW50IHcgPSBpbnN0LT52c2ktPnBpYy5jb2RlZF93aWR0aDsKKwlpbnQgaCA9IGluc3QtPnZzaS0+cGljLmNvZGVkX2hlaWdodDsKKwl1MzIgZHcgPSAweDE7IC8qMToxKi8KKworCXN3aXRjaCAodmFsaWRfZHdfbW9kZSkgeworCWNhc2UgMHgxMDA6CisJCWlmICh3ID4gMTkyMCAmJiBoID4gMTA4OCkKKwkJCWR3ID0gMHg0OyAvKjE6MiovCisJCWJyZWFrOworCWNhc2UgMHgyMDA6CisJCWlmICh3ID4gMTkyMCAmJiBoID4gMTA4OCkKKwkJCWR3ID0gMHgyOyAvKjE6NCovCisJCWJyZWFrOworCWNhc2UgMHgzMDA6CisJCWlmICh3ID4gMTI4MCAmJiBoID4gNzIwKQorCQkJZHcgPSAweDQ7IC8qMToyKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZHcgPSB2YWxpZF9kd19tb2RlOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZHc7Cit9CisKK3N0YXRpYyBpbnQgdmRlY19waWNfc2NhbGUoc3RydWN0IHZkZWNfYXYxX2luc3QgKmluc3QsIGludCBsZW5ndGgsIGludCBkd19tb2RlKQoreworCWludCByZXQgPSA2NDsKKworCXN3aXRjaCAodmRlY19nZXRfZHdfbW9kZShpbnN0LCBkd19tb2RlKSkgeworCWNhc2UgMHgwOiAvKiBvbmx5IGFmYmMsIG91dHB1dCBhZmJjICovCisJY2FzZSAweDIxOiAvKiBvbmx5IGFmYmMsIG91dHB1dCBhZmJjICovCisJCXJldCA9IDY0OworCQlicmVhazsKKwljYXNlIDB4MTogLyogYWZiYyBhbmQgKHcgeCBoKSwgb3V0cHV0IFlVVjQyMCAqLworCQlyZXQgPSBsZW5ndGg7CisJCWJyZWFrOworCWNhc2UgMHgyOiAvKiBhZmJjIGFuZCAody80IHggaC80KSwgb3V0cHV0IFlVVjQyMCAqLworCWNhc2UgMHgzOiAvKiBhZmJjIGFuZCAody80IHggaC80KSwgb3V0cHV0IGFmYmMgYW5kIFlVVjQyMCAqLworCQlyZXQgPSBsZW5ndGggPj4gMjsKKwkJYnJlYWs7CisJY2FzZSAweDQ6IC8qIGFmYmMgYW5kICh3LzIgeCBoLzIpLCBvdXRwdXQgWVVWNDIwICovCisJCXJldCA9IGxlbmd0aCA+PiAxOworCQlicmVhazsKKwljYXNlIDB4MTA6IC8qICh3IHggaCksIG91dHB1dCBZVVY0MjAtOGJpdCkgKi8KKwlkZWZhdWx0OgorCQlyZXQgPSBsZW5ndGg7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9wYXJhbV9wc19pbmZvKHN0cnVjdCB2ZGVjX2F2MV9pbnN0ICppbnN0LAorCXN0cnVjdCBhbWxfdmRlY19wc19pbmZvcyAqcHMpCit7CisJc3RydWN0IHZkZWNfcGljX2luZm8gKnBpYyA9ICZpbnN0LT52c2ktPnBpYzsKKwlzdHJ1Y3QgdmRlY19hdjFfZGVjX2luZm8gKmRlYyA9ICZpbnN0LT52c2ktPmRlYzsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0ID0gJmluc3QtPnZzaS0+Y3JvcDsKKwlpbnQgZHcgPSBpbnN0LT5wYXJtcy5jZmcuZG91YmxlX3dyaXRlX21vZGU7CisKKwkvKiBmaWxsIHZpc2libGUgYXJlYSBzaXplIHRoYXQgYmUgdXNlZCBmb3IgRUdMLiAqLworCXBpYy0+dmlzaWJsZV93aWR0aAk9IHBzLT52aXNpYmxlX3dpZHRoOworCXBpYy0+dmlzaWJsZV9oZWlnaHQJPSBwcy0+dmlzaWJsZV9oZWlnaHQ7CisKKwkvKiBjYWxjIHZpc2libGUgYXJlcy4gKi8KKwlyZWN0LT5sZWZ0CQk9IDA7CisJcmVjdC0+dG9wCQk9IDA7CisJcmVjdC0+d2lkdGgJCT0gcGljLT52aXNpYmxlX3dpZHRoOworCXJlY3QtPmhlaWdodAkJPSBwaWMtPnZpc2libGVfaGVpZ2h0OworCisJLyogY29uZmlnIGNhbnZhcyBzaXplIHRoYXQgYmUgdXNlZCBmb3IgZGVjb2Rlci4gKi8KKwlwaWMtPmNvZGVkX3dpZHRoCT0gcHMtPmNvZGVkX3dpZHRoOworCXBpYy0+Y29kZWRfaGVpZ2h0CT0gcHMtPmNvZGVkX2hlaWdodDsKKworCXBpYy0+eV9sZW5fc3oJCT0gQUxJR04odmRlY19waWNfc2NhbGUoaW5zdCwgcGljLT5jb2RlZF93aWR0aCwgZHcpLCA2NCkgKgorCQkJCSAgQUxJR04odmRlY19waWNfc2NhbGUoaW5zdCwgcGljLT5jb2RlZF9oZWlnaHQsIGR3KSwgNjQpOworCXBpYy0+Y19sZW5fc3oJCT0gcGljLT55X2xlbl9zeiA+PiAxOworCisJLyogY2FsYyBEUEIgc2l6ZSAqLworCXBpYy0+ZHBiX2ZyYW1lcwkJPSBwcy0+ZHBiX2ZyYW1lczsKKwlwaWMtPmRwYl9tYXJnaW4JCT0gcHMtPmRwYl9tYXJnaW47CisJcGljLT52cHBfbWFyZ2luCQk9IHBzLT5kcGJfbWFyZ2luOworCWRlYy0+ZHBiX3N6CQk9IHBzLT5kcGJfc2l6ZTsKKwlwaWMtPmZpZWxkCQk9IHBzLT5maWVsZDsKKworCWluc3QtPnBhcm1zLnBzIAk9ICpwczsKKwlpbnN0LT5wYXJtcy5wYXJtc19zdGF0dXMgfD0KKwkJVjRMMl9DT05GSUdfUEFSTV9ERUNPREVfUFNJTkZPOworCisJLyp3YWtlIHVwKi8KKwljb21wbGV0ZSgmaW5zdC0+Y29tcCk7CisKKwl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX1BSSU5GTywKKwkJIlBhcnNlIGZyb20gdWNvZGUsIHZpc2libGUoJWQgeCAlZCksIGNvZGVkKCVkIHggJWQpXG4iLAorCQlwcy0+dmlzaWJsZV93aWR0aCwgcHMtPnZpc2libGVfaGVpZ2h0LAorCQlwcy0+Y29kZWRfd2lkdGgsIHBzLT5jb2RlZF9oZWlnaHQpOworfQorCitzdGF0aWMgdm9pZCBzZXRfcGFyYW1fY29tcF9idWZfaW5mbyhzdHJ1Y3QgdmRlY19hdjFfaW5zdCAqaW5zdCwKKwkJc3RydWN0IHZkZWNfY29tcF9idWZfaW5mbyAqaW5mbykKK3sKKwltZW1jcHkoJmluc3QtPmNvbXBfaW5mbywgaW5mbywgc2l6ZW9mKCppbmZvKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9wYXJhbV9oZHJfaW5mbyhzdHJ1Y3QgdmRlY19hdjFfaW5zdCAqaW5zdCwKKwlzdHJ1Y3QgYW1sX3ZkZWNfaGRyX2luZm9zICpoZHIpCit7CisJaWYgKGhkci0+c2lnbmFsX3R5cGUgIT0gMCkgeworCQlpbnN0LT5wYXJtcy5oZHIgPSAqaGRyOworCQlpbnN0LT5wYXJtcy5wYXJtc19zdGF0dXMgfD0KKwkJCVY0TDJfQ09ORklHX1BBUk1fREVDT0RFX0hEUklORk87CisJCWFtbF92ZGVjX2Rpc3BhdGNoX2V2ZW50KGluc3QtPmN0eCwKKwkJCVY0TDJfRVZFTlRfU1JDX0NIX0hEUklORk8pOworCQl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywKKwkJCSJhdjEgc2V0IEhEUiBpbmZvc1xuIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXRfcGFyYW1fcG9zdF9ldmVudChzdHJ1Y3QgdmRlY19hdjFfaW5zdCAqaW5zdCwgdTMyICpldmVudCkKK3sKKwkJYW1sX3ZkZWNfZGlzcGF0Y2hfZXZlbnQoaW5zdC0+Y3R4LCAqZXZlbnQpOworCQl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX1BSSU5GTywKKwkJCSJhdjEgcG9zdCBldmVudDogJWRcbiIsICpldmVudCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9waWNfaW5mbyhzdHJ1Y3QgdmRlY19hdjFfaW5zdCAqaW5zdCwKKwlzdHJ1Y3QgdmRlY19waWNfaW5mbyAqcGljKQoreworCWluc3QtPnZzaS0+cGljID0gKnBpYzsKK30KKworc3RhdGljIGludCB2ZGVjX2F2MV9zZXRfcGFyYW0odW5zaWduZWQgbG9uZyBoX3ZkZWMsCisJZW51bSB2ZGVjX3NldF9wYXJhbV90eXBlIHR5cGUsIHZvaWQgKmluKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCB2ZGVjX2F2MV9pbnN0ICppbnN0ID0gKHN0cnVjdCB2ZGVjX2F2MV9pbnN0ICopaF92ZGVjOworCisJaWYgKCFpbnN0KSB7CisJCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkidGhlIGF2MSBpbnN0IG9mIGRlYyBpcyBpbnZhbGlkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNFVF9QQVJBTV9XUklURV9GUkFNRV9TWU5DOgorCQlzZXRfcGFyYW1fd3JpdGVfc3luYyhpbnN0KTsKKwkJYnJlYWs7CisKKwljYXNlIFNFVF9QQVJBTV9QU19JTkZPOgorCQlzZXRfcGFyYW1fcHNfaW5mbyhpbnN0LCBpbik7CisJCWJyZWFrOworCisJY2FzZSBTRVRfUEFSQU1fQ09NUF9CVUZfSU5GTzoKKwkJc2V0X3BhcmFtX2NvbXBfYnVmX2luZm8oaW5zdCwgaW4pOworCQlicmVhazsKKworCWNhc2UgU0VUX1BBUkFNX0hEUl9JTkZPOgorCQlzZXRfcGFyYW1faGRyX2luZm8oaW5zdCwgaW4pOworCQlicmVhazsKKworCWNhc2UgU0VUX1BBUkFNX1BPU1RfRVZFTlQ6CisJCXNldF9wYXJhbV9wb3N0X2V2ZW50KGluc3QsIGluKTsKKwkJYnJlYWs7CisKKwljYXNlIFNFVF9QQVJBTV9QSUNfSU5GTzoKKwkJc2V0X3BpY19pbmZvKGluc3QsIGluKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJImludmFsaWQgc2V0IHBhcmFtZXRlciB0eXBlPSVkXG4iLCB0eXBlKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHZkZWNfY29tbW9uX2lmIHZkZWNfYXYxX2lmID0geworCS5pbml0CQk9IHZkZWNfYXYxX2luaXQsCisJLnByb2JlCQk9IHZkZWNfYXYxX3Byb2JlLAorCS5kZWNvZGUJCT0gdmRlY19hdjFfZGVjb2RlLAorCS5nZXRfcGFyYW0JPSB2ZGVjX2F2MV9nZXRfcGFyYW0sCisJLnNldF9wYXJhbQk9IHZkZWNfYXYxX3NldF9wYXJhbSwKKwkuZGVpbml0CQk9IHZkZWNfYXYxX2RlaW5pdCwKK307CisKK3N0cnVjdCB2ZGVjX2NvbW1vbl9pZiAqZ2V0X2F2MV9kZWNfY29tbV9pZih2b2lkKTsKKworc3RydWN0IHZkZWNfY29tbW9uX2lmICpnZXRfYXYxX2RlY19jb21tX2lmKHZvaWQpCit7CisJcmV0dXJuICZ2ZGVjX2F2MV9pZjsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbXZkZWNfcG9ydHMvZGVjb2Rlci92ZGVjX2gyNjRfaWYuYyBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2RlY29kZXIvdmRlY19oMjY0X2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTExYzkxZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2RlY29kZXIvdmRlY19oMjY0X2lmLmMKQEAgLTAsMCArMSwxMDY2IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorKiBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqCisqIERlc2NyaXB0aW9uOgorKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvc3dhYi5oPgorCisjaW5jbHVkZSAiLi4vdmRlY19kcnZfaWYuaCIKKyNpbmNsdWRlICIuLi9hbWxfdmNvZGVjX3V0aWwuaCIKKyNpbmNsdWRlICIuLi9hbWxfdmNvZGVjX2RlYy5oIgorI2luY2x1ZGUgIi4uL2FtbF92Y29kZWNfZHJ2LmgiCisjaW5jbHVkZSAiLi4vYW1sX3Zjb2RlY19hZGFwdC5oIgorI2luY2x1ZGUgIi4uL3ZkZWNfZHJ2X2Jhc2UuaCIKKyNpbmNsdWRlICJhbWxfaDI2NF9wYXJzZXIuaCIKKyNpbmNsdWRlICIuLi91dGlscy9jb21tb24uaCIKKworLyogaDI2NCBOQUxVIHR5cGUgKi8KKyNkZWZpbmUgTkFMX05PTl9JRFJfU0xJQ0UJCQkweDAxCisjZGVmaW5lIE5BTF9JRFJfU0xJQ0UJCQkJMHgwNQorI2RlZmluZSBOQUxfSDI2NF9TRUkJCQkJMHgwNgorI2RlZmluZSBOQUxfSDI2NF9TUFMJCQkJMHgwNworI2RlZmluZSBOQUxfSDI2NF9QUFMJCQkJMHgwOAorI2RlZmluZSBOQUxfSDI2NF9BVUQJCQkJMHgwOQorCisjZGVmaW5lIEFWQ19OQUxfVFlQRSh2YWx1ZSkJCQkJKCh2YWx1ZSkgJiAweDFGKQorCisjZGVmaW5lIEJVRl9QUkVESUNUSU9OX1NaCQkJKDY0ICogMTAyNCkvLygzMiAqIDEwMjQpCisKKyNkZWZpbmUgTUJfVU5JVF9MRU4JCQkJMTYKKworLyogbW90aW9uIHZlY3RvciBzaXplIChieXRlcykgZm9yIGV2ZXJ5IG1hY3JvIGJsb2NrICovCisjZGVmaW5lIEhXX01CX1NUT1JFX1NaCQkJCTY0CisKKyNkZWZpbmUgSDI2NF9NQVhfRkJfTlVNCQkJCTE3CisjZGVmaW5lIEhEUl9QQVJTSU5HX0JVRl9TWgkJCTEwMjQKKworI2RlZmluZSBIRUFERVJfQlVGRkVSX1NJWkUJCQkoMTI4ICogMTAyNCkKKworLyoqCisgKiBzdHJ1Y3QgaDI2NF9mYiAtIGgyNjQgZGVjb2RlIGZyYW1lIGJ1ZmZlciBpbmZvcm1hdGlvbgorICogQHZkZWNfZmJfdmEgIDogdmlydHVhbCBhZGRyZXNzIG9mIHN0cnVjdCB2ZGVjX2ZiCisgKiBAeV9mYl9kbWEgICAgOiBkbWEgYWRkcmVzcyBvZiBZIGZyYW1lIGJ1ZmZlciAobHVtYSkKKyAqIEBjX2ZiX2RtYSAgICA6IGRtYSBhZGRyZXNzIG9mIEMgZnJhbWUgYnVmZmVyIChjaHJvbWEpCisgKiBAcG9jICAgICAgICAgOiBwaWN0dXJlIG9yZGVyIGNvdW50IG9mIGZyYW1lIGJ1ZmZlcgorICogQHJlc2VydmVkICAgIDogZm9yIDggYnl0ZXMgYWxpZ25tZW50CisgKi8KK3N0cnVjdCBoMjY0X2ZiIHsKKwl1aW50NjRfdCB2ZGVjX2ZiX3ZhOworCXVpbnQ2NF90IHlfZmJfZG1hOworCXVpbnQ2NF90IGNfZmJfZG1hOworCWludDMyX3QgcG9jOworCXVpbnQzMl90IHJlc2VydmVkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgaDI2NF9yaW5nX2ZiX2xpc3QgLSByaW5nIGZyYW1lIGJ1ZmZlciBsaXN0CisgKiBAZmJfbGlzdCAgIDogZnJhbWUgYnVmZmVyIGFycmFyeQorICogQHJlYWRfaWR4ICA6IHJlYWQgaW5kZXgKKyAqIEB3cml0ZV9pZHggOiB3cml0ZSBpbmRleAorICogQGNvdW50ICAgICA6IGJ1ZmZlciBjb3VudCBpbiBsaXN0CisgKi8KK3N0cnVjdCBoMjY0X3JpbmdfZmJfbGlzdCB7CisJc3RydWN0IGgyNjRfZmIgZmJfbGlzdFtIMjY0X01BWF9GQl9OVU1dOworCXVuc2lnbmVkIGludCByZWFkX2lkeDsKKwl1bnNpZ25lZCBpbnQgd3JpdGVfaWR4OworCXVuc2lnbmVkIGludCBjb3VudDsKKwl1bnNpZ25lZCBpbnQgcmVzZXJ2ZWQ7Cit9OworCisvKioKKyAqIHN0cnVjdCB2ZGVjX2gyNjRfZGVjX2luZm8gLSBkZWNvZGUgaW5mb3JtYXRpb24KKyAqIEBkcGJfc3oJCTogZGVjb2RpbmcgcGljdHVyZSBidWZmZXIgc2l6ZQorICogQHJlYWxsb2NfbXZfYnVmCTogZmxhZyB0byBub3RpZnkgZHJpdmVyIHRvIHJlLWFsbG9jYXRlIG12IGJ1ZmZlcgorICogQHJlc2VydmVkCQk6IGZvciA4IGJ5dGVzIGFsaWdubWVudAorICogQGJzX2RtYQkJOiBJbnB1dCBiaXQtc3RyZWFtIGJ1ZmZlciBkbWEgYWRkcmVzcworICogQHlfZmJfZG1hCQk6IFkgZnJhbWUgYnVmZmVyIGRtYSBhZGRyZXNzCisgKiBAY19mYl9kbWEJCTogQyBmcmFtZSBidWZmZXIgZG1hIGFkZHJlc3MKKyAqIEB2ZGVjX2ZiX3ZhCQk6IFZERUMgZnJhbWUgYnVmZmVyIHN0cnVjdCB2aXJ0dWFsIGFkZHJlc3MKKyAqLworc3RydWN0IHZkZWNfaDI2NF9kZWNfaW5mbyB7CisJdWludDMyX3QgZHBiX3N6OworCXVpbnQzMl90IHJlYWxsb2NfbXZfYnVmOworCXVpbnQzMl90IHJlc2VydmVkOworCXVpbnQ2NF90IGJzX2RtYTsKKwl1aW50NjRfdCB5X2ZiX2RtYTsKKwl1aW50NjRfdCBjX2ZiX2RtYTsKKwl1aW50NjRfdCB2ZGVjX2ZiX3ZhOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdmRlY19oMjY0X3ZzaSAtIHNoYXJlZCBtZW1vcnkgZm9yIGRlY29kZSBpbmZvcm1hdGlvbiBleGNoYW5nZQorICogICAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIFZQVSBhbmQgSG9zdC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1lbW9yeSBpcyBhbGxvY2F0ZWQgYnkgVlBVIHRoZW4gbWFwcGluZyB0byBIb3N0CisgKiAgICAgICAgICAgICAgICAgICAgICAgIGluIHZwdV9kZWNfaW5pdCgpIGFuZCBmcmVlZCBpbiB2cHVfZGVjX2RlaW5pdCgpCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGJ5IFZQVS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgQVAtVy9SIDogQVAgaXMgd3JpdGVyL3JlYWRlciBvbiB0aGlzIGl0ZW0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgVlBVLVcvUjogVlBVIGlzIHdyaXRlL3JlYWRlciBvbiB0aGlzIGl0ZW0KKyAqIEBkZWMgICAgICAgICAgOiBkZWNvZGUgaW5mb3JtYXRpb24gKEFQLVIsIFZQVS1XKQorICogQHBpYyAgICAgICAgICA6IHBpY3R1cmUgaW5mb3JtYXRpb24gKEFQLVIsIFZQVS1XKQorICogQGNyb3AgICAgICAgICA6IGNyb3AgaW5mb3JtYXRpb24gKEFQLVIsIFZQVS1XKQorICovCitzdHJ1Y3QgdmRlY19oMjY0X3ZzaSB7CisJdW5zaWduZWQgY2hhciBoZHJfYnVmW0hEUl9QQVJTSU5HX0JVRl9TWl07CisJY2hhciAqaGVhZGVyX2J1ZjsKKwlpbnQgc3BzX3NpemU7CisJaW50IHBwc19zaXplOworCWludCBzZWlfc2l6ZTsKKwlpbnQgaGVhZF9vZmZzZXQ7CisJc3RydWN0IHZkZWNfaDI2NF9kZWNfaW5mbyBkZWM7CisJc3RydWN0IHZkZWNfcGljX2luZm8gcGljOworCXN0cnVjdCB2ZGVjX3BpY19pbmZvIGN1cl9waWM7CisJc3RydWN0IHY0bDJfcmVjdCBjcm9wOworCWJvb2wgaXNfY29tYmluZTsKKwlpbnQgbmFsdV9wb3M7Cit9OworCisvKioKKyAqIHN0cnVjdCB2ZGVjX2gyNjRfaW5zdCAtIGgyNjQgZGVjb2RlciBpbnN0YW5jZQorICogQG51bV9uYWx1IDogaG93IG1hbnkgbmFsdXMgYmUgZGVjb2RlZAorICogQGN0eCAgICAgIDogcG9pbnQgdG8gYW1sX3Zjb2RlY19jdHgKKyAqIEBwcmVkX2J1ZiA6IEhXIHdvcmtpbmcgcHJlZGljYXRpb24gYnVmZmVyCisgKiBAbXZfYnVmICAgOiBIVyB3b3JraW5nIG1vdGlvbiB2ZWN0b3IgYnVmZmVyCisgKiBAdnB1ICAgICAgOiBWUFUgaW5zdGFuY2UKKyAqIEB2c2kgICAgICA6IFZQVSBzaGFyZWQgaW5mb3JtYXRpb24KKyAqLworc3RydWN0IHZkZWNfaDI2NF9pbnN0IHsKKwl1bnNpZ25lZCBpbnQgbnVtX25hbHU7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHg7CisJc3RydWN0IGFtbF92Y29kZWNfbWVtIHByZWRfYnVmOworCXN0cnVjdCBhbWxfdmNvZGVjX21lbSBtdl9idWZbSDI2NF9NQVhfRkJfTlVNXTsKKwlzdHJ1Y3QgYW1sX3ZkZWNfYWRhcHQgdmRlYzsKKwlzdHJ1Y3QgdmRlY19oMjY0X3ZzaSAqdnNpOworCXN0cnVjdCBhbWxfZGVjX3BhcmFtcyBwYXJtczsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21wOworfTsKKworI2lmIDAKKyNkZWZpbmUgRFVNUF9GSUxFX05BTUUgIi9kYXRhL2R1bXAvZHVtcC50bXAiCitzdGF0aWMgc3RydWN0IGZpbGUgKmZpbHA7CitzdGF0aWMgbG9mZl90IGZpbGVfcG9zOworCit2b2lkIGR1bXBfd3JpdGUoY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCW1tX3NlZ21lbnRfdCBvbGRfZnM7CisKKwlpZiAoIWZpbHApCisJCXJldHVybjsKKworCW9sZF9mcyA9IGdldF9mcygpOworCXNldF9mcyhLRVJORUxfRFMpOworCisJaWYgKGNvdW50ICE9IHZmc193cml0ZShmaWxwLCBidWYsIGNvdW50LCAmZmlsZV9wb3MpKQorCQlwcl9lcnIoIkZhaWxlZCB0byB3cml0ZSBmaWxlXG4iKTsKKworCXNldF9mcyhvbGRfZnMpOworfQorCit2b2lkIGR1bXBfaW5pdCh2b2lkKQoreworCWZpbHAgPSBmaWxwX29wZW4oRFVNUF9GSUxFX05BTUUsIE9fQ1JFQVQgfCBPX1JEV1IsIDA2NDQpOworCWlmIChJU19FUlIoZmlscCkpIHsKKwkJcHJfZXJyKCJvcGVuIGR1bXAgZmlsZSBmYWlsZWRcbiIpOworCQlmaWxwID0gTlVMTDsKKwl9Cit9CisKK3ZvaWQgZHVtcF9kZWluaXQodm9pZCkKK3sKKwlpZiAoZmlscCkgeworCQlmaWxwX2Nsb3NlKGZpbHAsIGN1cnJlbnQtPmZpbGVzKTsKKwkJZmlscCA9IE5VTEw7CisJCWZpbGVfcG9zID0gMDsKKwl9Cit9CisKK3ZvaWQgc3dhcF91dih2b2lkICp1diwgaW50IHNpemUpCit7CisJaW50IGk7CisJX191MTYgKnAgPSB1djsKKworCXNpemUgLz0gMjsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyssIHArKykKKwkJKnAgPSBfX3N3YWIxNigqcCk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgZ2V0X3BpY19pbmZvKHN0cnVjdCB2ZGVjX2gyNjRfaW5zdCAqaW5zdCwKKwkJCSBzdHJ1Y3QgdmRlY19waWNfaW5mbyAqcGljKQoreworCSpwaWMgPSBpbnN0LT52c2ktPnBpYzsKKworCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVhJTkZPLAorCQkicGljKCVkLCAlZCksIGJ1ZiglZCwgJWQpXG4iLAorCQkgcGljLT52aXNpYmxlX3dpZHRoLCBwaWMtPnZpc2libGVfaGVpZ2h0LAorCQkgcGljLT5jb2RlZF93aWR0aCwgcGljLT5jb2RlZF9oZWlnaHQpOworCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVhJTkZPLAorCQkiWSglZCwgJWQpLCBDKCVkLCAlZClcbiIsIHBpYy0+eV9ic19zeiwKKwkJIHBpYy0+eV9sZW5fc3osIHBpYy0+Y19ic19zeiwgcGljLT5jX2xlbl9zeik7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9jcm9wX2luZm8oc3RydWN0IHZkZWNfaDI2NF9pbnN0ICppbnN0LCBzdHJ1Y3QgdjRsMl9yZWN0ICpjcikKK3sKKwljci0+bGVmdCA9IGluc3QtPnZzaS0+Y3JvcC5sZWZ0OworCWNyLT50b3AgPSBpbnN0LT52c2ktPmNyb3AudG9wOworCWNyLT53aWR0aCA9IGluc3QtPnZzaS0+Y3JvcC53aWR0aDsKKwljci0+aGVpZ2h0ID0gaW5zdC0+dnNpLT5jcm9wLmhlaWdodDsKKworCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVhJTkZPLAorCQkibD0lZCwgdD0lZCwgdz0lZCwgaD0lZFxuIiwKKwkJIGNyLT5sZWZ0LCBjci0+dG9wLCBjci0+d2lkdGgsIGNyLT5oZWlnaHQpOworfQorCitzdGF0aWMgdm9pZCBnZXRfZHBiX3NpemUoc3RydWN0IHZkZWNfaDI2NF9pbnN0ICppbnN0LCB1bnNpZ25lZCBpbnQgKmRwYl9zeikKK3sKKwkqZHBiX3N6ID0gaW5zdC0+dnNpLT5kZWMuZHBiX3N6OworCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVhJTkZPLCAic3o9JWRcbiIsICpkcGJfc3opOworfQorCitzdGF0aWMgdm9pZCBza2lwX2F1ZF9kYXRhKHU4ICoqZGF0YSwgdTMyICpzaXplKQoreworCWludCBpOworCisJaSA9IGZpbmRfc3RhcnRfY29kZSgqZGF0YSwgKnNpemUpOworCWlmIChpID4gMCAmJiAoKmRhdGEpW2krK10gPT0gMHg5ICYmICgqZGF0YSlbaSsrXSA9PSAweGYwKSB7CisJCSpzaXplIC09IGk7CisJCSpkYXRhICs9IGk7CisJfQorfQorCitzdGF0aWMgdTMyIHZkZWNfY29uZmlnX2RlZmF1bHRfcGFybXModTggKnBhcm0pCit7CisJdTggKnBidWYgPSBwYXJtOworCisJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJwYXJtX3Y0bF9jb2RlY19lbmFibGU6MTsiKTsKKwlwYnVmICs9IHNwcmludGYocGJ1ZiwgIm1oMjY0X2RvdWJsZV93cml0ZV9tb2RlOjE2OyIpOworCXBidWYgKz0gc3ByaW50ZihwYnVmLCAicGFybV92NGxfYnVmZmVyX21hcmdpbjo3OyIpOworCXBidWYgKz0gc3ByaW50ZihwYnVmLCAicGFybV92NGxfY2FudmFzX21lbV9tb2RlOjA7Iik7CisJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJwYXJtX3Y0bF9jYW52YXNfbWVtX2VuZGlhbjowOyIpOworCisJcmV0dXJuIHBhcm0gLSBwYnVmOworfQorCitzdGF0aWMgdm9pZCB2ZGVjX3BhcnNlcl9wYXJtcyhzdHJ1Y3QgdmRlY19oMjY0X2luc3QgKmluc3QpCit7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPSBpbnN0LT5jdHg7CisKKwlpZiAoY3R4LT5jb25maWcucGFybS5kZWMucGFybXNfc3RhdHVzICYKKwkJVjRMMl9DT05GSUdfUEFSTV9ERUNPREVfQ0ZHSU5GTykgeworCQl1OCAqcGJ1ZiA9IGN0eC0+Y29uZmlnLmJ1ZjsKKworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgInBhcm1fdjRsX2NvZGVjX2VuYWJsZToxOyIpOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIm1oMjY0X2RvdWJsZV93cml0ZV9tb2RlOiVkOyIsCisJCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5jZmcuZG91YmxlX3dyaXRlX21vZGUpOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgInBhcm1fdjRsX2J1ZmZlcl9tYXJnaW46JWQ7IiwKKwkJCWN0eC0+Y29uZmlnLnBhcm0uZGVjLmNmZy5yZWZfYnVmX21hcmdpbik7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAicGFybV92NGxfY2FudmFzX21lbV9tb2RlOiVkOyIsCisJCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5jZmcuY2FudmFzX21lbV9tb2RlKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJwYXJtX3Y0bF9jYW52YXNfbWVtX2VuZGlhbjolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuY2ZnLmNhbnZhc19tZW1fZW5kaWFuKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJwYXJtX3Y0bF9sb3dfbGF0ZW5jeV9tb2RlOiVkOyIsCisJCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5jZmcubG93X2xhdGVuY3lfbW9kZSk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAicGFybV92NGxfbWV0YWRhdGFfY29uZmlnX2ZsYWc6JWQ7IiwKKwkJCWN0eC0+Y29uZmlnLnBhcm0uZGVjLmNmZy5tZXRhZGF0YV9jb25maWdfZmxhZyk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAicGFybV92NGxfZHVyYXRpb246JWQ7IiwKKwkJCWN0eC0+Y29uZmlnLnBhcm0uZGVjLmNmZy5kdXJhdGlvbik7CisJCWN0eC0+Y29uZmlnLmxlbmd0aCA9IHBidWYgLSBjdHgtPmNvbmZpZy5idWY7CisJfSBlbHNlIHsKKwkJY3R4LT5jb25maWcucGFybS5kZWMuY2ZnLmRvdWJsZV93cml0ZV9tb2RlID0gMTY7CisJCWN0eC0+Y29uZmlnLnBhcm0uZGVjLmNmZy5yZWZfYnVmX21hcmdpbiA9IDc7CisJCWN0eC0+Y29uZmlnLmxlbmd0aCA9IHZkZWNfY29uZmlnX2RlZmF1bHRfcGFybXMoY3R4LT5jb25maWcuYnVmKTsKKwl9CisKKwlpbnN0LT52ZGVjLmNvbmZpZwk9IGN0eC0+Y29uZmlnOworCWluc3QtPnBhcm1zLmNmZwkJPSBjdHgtPmNvbmZpZy5wYXJtLmRlYy5jZmc7CisJaW5zdC0+cGFybXMucGFybXNfc3RhdHVzIHw9IFY0TDJfQ09ORklHX1BBUk1fREVDT0RFX0NGR0lORk87Cit9CisKK3N0YXRpYyBpbnQgdmRlY19oMjY0X2luaXQoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsIHVuc2lnbmVkIGxvbmcgKmhfdmRlYykKK3sKKwlzdHJ1Y3QgdmRlY19oMjY0X2luc3QgKmluc3QgPSBOVUxMOworCWludCByZXQgPSAtMTsKKworCWluc3QgPSB2emFsbG9jKHNpemVvZigqaW5zdCkpOworCWlmICghaW5zdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbnN0LT52ZGVjLmZybV9uYW1lCT0gIkguMjY0IjsKKwlpbnN0LT52ZGVjLnZpZGVvX3R5cGUJPSBWRk9STUFUX0gyNjQ7CisJaW5zdC0+dmRlYy5maWxwCQk9IGN0eC0+ZGV2LT5maWxwOworCWluc3QtPnZkZWMuY3R4CQk9IGN0eDsKKwlpbnN0LT5jdHgJCT0gY3R4OworCisJdmRlY19wYXJzZXJfcGFybXMoaW5zdCk7CisKKwkvKiBzZXQgcGxheSBtb2RlLiovCisJaWYgKGN0eC0+aXNfZHJtX21vZGUpCisJCWluc3QtPnZkZWMucG9ydC5mbGFnIHw9IFBPUlRfRkxBR19EUk07CisKKwkvKiBwcm9iZSBpbmZvIGZyb20gdGhlIHN0cmVhbSAqLworCWluc3QtPnZzaSA9IHZ6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZGVjX2gyNjRfdnNpKSk7CisJaWYgKCFpbnN0LT52c2kpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJLyogYWxsb2MgdGhlIGhlYWRlciBidWZmZXIgdG8gYmUgdXNlZCBjYWNoZSBzcHMgb3Igc3BwIGV0Yy4qLworCWluc3QtPnZzaS0+aGVhZGVyX2J1ZiA9IHZ6YWxsb2MoSEVBREVSX0JVRkZFUl9TSVpFKTsKKwlpZiAoIWluc3QtPnZzaS0+aGVhZGVyX2J1ZikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwlpbml0X2NvbXBsZXRpb24oJmluc3QtPmNvbXApOworCisJY3R4LT5hZGFfY3R4CT0gJmluc3QtPnZkZWM7CisJKmhfdmRlYwkJPSAodW5zaWduZWQgbG9uZylpbnN0OworCisJcmV0ID0gdmlkZW9fZGVjb2Rlcl9pbml0KCZpbnN0LT52ZGVjKTsKKwlpZiAocmV0KSB7CisJCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkidmRlY19oMjY0IGluaXQgZXJyPSVkXG4iLCByZXQpOworCQlnb3RvIGVycjsKKwl9CisKKwl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX1BSSU5GTywKKwkJIkgyNjQgSW5zdGFuY2UgPj4gJWx4IiwgKHVsb25nKSBpbnN0KTsKKworCXJldHVybiAwOworZXJyOgorCWlmIChpbnN0ICYmIGluc3QtPnZzaSAmJiBpbnN0LT52c2ktPmhlYWRlcl9idWYpCisJCXZmcmVlKGluc3QtPnZzaS0+aGVhZGVyX2J1Zik7CisJaWYgKGluc3QgJiYgaW5zdC0+dnNpKQorCQl2ZnJlZShpbnN0LT52c2kpOworCWlmIChpbnN0KQorCQl2ZnJlZShpbnN0KTsKKwkqaF92ZGVjID0gMDsKKworCXJldHVybiByZXQ7Cit9CisKKyNpZiAwCitzdGF0aWMgaW50IHJlZmVyX2J1ZmZlcl9udW0oaW50IGxldmVsX2lkYywgaW50IG1heF9wb2NfY250LAorCWludCBtYl93aWR0aCwgaW50IG1iX2hlaWdodCkKK3sKKwlpbnQgc2l6ZTsKKwlpbnQgcGljX3NpemUgPSBtYl93aWR0aCAqIG1iX2hlaWdodCAqIDM4NDsKKworCXN3aXRjaCAobGV2ZWxfaWRjKSB7CisJY2FzZSA5OgorCQlzaXplID0gMTUyMDY0OworCQlicmVhazsKKwljYXNlIDEwOgorCQlzaXplID0gMTUyMDY0OworCQlicmVhazsKKwljYXNlIDExOgorCQlzaXplID0gMzQ1NjAwOworCQlicmVhazsKKwljYXNlIDEyOgorCQlzaXplID0gOTEyMzg0OworCQlicmVhazsKKwljYXNlIDEzOgorCQlzaXplID0gOTEyMzg0OworCQlicmVhazsKKwljYXNlIDIwOgorCQlzaXplID0gOTEyMzg0OworCQlicmVhazsKKwljYXNlIDIxOgorCQlzaXplID0gMTgyNDc2ODsKKwkJYnJlYWs7CisJY2FzZSAyMjoKKwkJc2l6ZSA9IDMxMTA0MDA7CisJCWJyZWFrOworCWNhc2UgMzA6CisJCXNpemUgPSAzMTEwNDAwOworCQlicmVhazsKKwljYXNlIDMxOgorCQlzaXplID0gNjkxMjAwMDsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwkJc2l6ZSA9IDc4NjQzMjA7CisJCWJyZWFrOworCWNhc2UgNDA6CisJCXNpemUgPSAxMjU4MjkxMjsKKwkJYnJlYWs7CisJY2FzZSA0MToKKwkJc2l6ZSA9IDEyNTgyOTEyOworCQlicmVhazsKKwljYXNlIDQyOgorCQlzaXplID0gMTMzNjkzNDQ7CisJCWJyZWFrOworCWNhc2UgNTA6CisJCXNpemUgPSA0MjM5MzYwMDsKKwkJYnJlYWs7CisJY2FzZSA1MToKKwljYXNlIDUyOgorCWRlZmF1bHQ6CisJCXNpemUgPSA3MDc3ODg4MDsKKwkJYnJlYWs7CisJfQorCisJc2l6ZSAvPSBwaWNfc2l6ZTsKKwlzaXplID0gc2l6ZSArIDE7IC8qIG5lZWQgbW9yZSBidWZmZXJzICovCisKKwlpZiAoc2l6ZSA+IG1heF9wb2NfY250KQorCQlzaXplID0gbWF4X3BvY19jbnQ7CisKKwlyZXR1cm4gc2l6ZTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB2ZGVjX2NvbmZpZ19kd19tb2RlKHN0cnVjdCB2ZGVjX3BpY19pbmZvICpwaWMsIGludCBkd19tb2RlKQoreworCXN3aXRjaCAoZHdfbW9kZSkgeworCWNhc2UgMHgxOiAvKiAodyB4IGgpICsgKHcvMiB4IGgpICovCisJCXBpYy0+Y29kZWRfd2lkdGgJKz0gcGljLT5jb2RlZF93aWR0aCA+PiAxOworCQlwaWMtPnlfbGVuX3N6CQk9IHBpYy0+Y29kZWRfd2lkdGggKiBwaWMtPmNvZGVkX2hlaWdodDsKKwkJcGljLT5jX2xlbl9zegkJPSBwaWMtPnlfbGVuX3N6ID4+IDE7CisJCWJyZWFrOworCWNhc2UgMHgyOiAvKiAodyB4IGgpICsgKHcvMiB4IGgvMikgKi8KKwkJcGljLT5jb2RlZF93aWR0aAkrPSBwaWMtPmNvZGVkX3dpZHRoID4+IDE7CisJCXBpYy0+Y29kZWRfaGVpZ2h0CSs9IHBpYy0+Y29kZWRfaGVpZ2h0ID4+IDE7CisJCXBpYy0+eV9sZW5fc3oJCT0gcGljLT5jb2RlZF93aWR0aCAqIHBpYy0+Y29kZWRfaGVpZ2h0OworCQlwaWMtPmNfbGVuX3N6CQk9IHBpYy0+eV9sZW5fc3ogPj4gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDogLyogbm90aGluZyB0byBkbyAqLworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfdmRlY19wYXJhbXMoc3RydWN0IHZkZWNfaDI2NF9pbnN0ICppbnN0LCBzdHJ1Y3QgaDI2NF9TUFNfdCAqc3BzKQoreworCXN0cnVjdCB2ZGVjX3BpY19pbmZvICpwaWMgPSAmaW5zdC0+dnNpLT5waWM7CisJc3RydWN0IHZkZWNfaDI2NF9kZWNfaW5mbyAqZGVjID0gJmluc3QtPnZzaS0+ZGVjOworCXN0cnVjdCB2NGwyX3JlY3QgKnJlY3QgPSAmaW5zdC0+dnNpLT5jcm9wOworCWludCBkdyA9IGluc3QtPnBhcm1zLmNmZy5kb3VibGVfd3JpdGVfbW9kZTsKKwlpbnQgbWFyZ2luID0gaW5zdC0+cGFybXMuY2ZnLnJlZl9idWZfbWFyZ2luOworCXUzMiBtYl93LCBtYl9oLCB3aWR0aCwgaGVpZ2h0OworCisJbWJfdyA9IHNwcy0+bWJfd2lkdGg7CisJbWJfaCA9IHNwcy0+bWJfaGVpZ2h0OworCisJd2lkdGggID0gbWJfdyA8PCA0OworCWhlaWdodCA9IG1iX2ggPDwgNDsKKworCXdpZHRoICAtPSAoc3BzLT5jcm9wX2xlZnQgKyBzcHMtPmNyb3BfcmlnaHQpOworCWhlaWdodCAtPSAoc3BzLT5jcm9wX3RvcCArIHNwcy0+Y3JvcF9ib3R0b20pOworCisJLyogZmlsbCB2aXNpYmxlIGFyZWEgc2l6ZSB0aGF0IGJlIHVzZWQgZm9yIEVHTC4gKi8KKwlwaWMtPnZpc2libGVfd2lkdGgJPSB3aWR0aDsKKwlwaWMtPnZpc2libGVfaGVpZ2h0CT0gaGVpZ2h0OworCisJLyogY2FsYyB2aXNpYmxlIGFyZXMuICovCisJcmVjdC0+bGVmdAkJPSAwOworCXJlY3QtPnRvcAkJPSAwOworCXJlY3QtPndpZHRoCQk9IHBpYy0+dmlzaWJsZV93aWR0aDsKKwlyZWN0LT5oZWlnaHQJCT0gcGljLT52aXNpYmxlX2hlaWdodDsKKworCS8qIGNvbmZpZyBjYW52YXMgc2l6ZSB0aGF0IGJlIHVzZWQgZm9yIGRlY29kZXIuICovCisJcGljLT5jb2RlZF93aWR0aAk9IEFMSUdOKG1iX3csIDQpIDw8IDQ7CisJcGljLT5jb2RlZF9oZWlnaHQJPSBBTElHTihtYl9oLCA0KSA8PCA0OworCXBpYy0+eV9sZW5fc3oJCT0gcGljLT5jb2RlZF93aWR0aCAqIHBpYy0+Y29kZWRfaGVpZ2h0OworCXBpYy0+Y19sZW5fc3oJCT0gcGljLT55X2xlbl9zeiA+PiAxOworCXBpYy0+cHJvZmlsZV9pZGMJPSBzcHMtPnByb2ZpbGVfaWRjOworCS8qIGNhbGMgRFBCIHNpemUgKi8KKwlkZWMtPmRwYl9zegkJPSBzcHMtPm51bV9yZW9yZGVyX2ZyYW1lcyArIG1hcmdpbjsKKworCWluc3QtPnBhcm1zLnBzLnZpc2libGVfd2lkdGgJPSBwaWMtPnZpc2libGVfd2lkdGg7CisJaW5zdC0+cGFybXMucHMudmlzaWJsZV9oZWlnaHQJPSBwaWMtPnZpc2libGVfaGVpZ2h0OworCWluc3QtPnBhcm1zLnBzLmNvZGVkX3dpZHRoCT0gcGljLT5jb2RlZF93aWR0aDsKKwlpbnN0LT5wYXJtcy5wcy5jb2RlZF9oZWlnaHQJPSBwaWMtPmNvZGVkX2hlaWdodDsKKwlpbnN0LT5wYXJtcy5wcy5wcm9maWxlCQk9IHNwcy0+cHJvZmlsZV9pZGM7CisJaW5zdC0+cGFybXMucHMubWJfd2lkdGgJCT0gc3BzLT5tYl93aWR0aDsKKwlpbnN0LT5wYXJtcy5wcy5tYl9oZWlnaHQJPSBzcHMtPm1iX2hlaWdodDsKKwlpbnN0LT5wYXJtcy5wcy5yZWZfZnJhbWVzCT0gc3BzLT5yZWZfZnJhbWVfY291bnQ7CisJaW5zdC0+cGFybXMucHMuZHBiX2ZyYW1lcwk9IHNwcy0+bnVtX3Jlb3JkZXJfZnJhbWVzOworCWluc3QtPnBhcm1zLnBzLmRwYl9zaXplCQk9IGRlYy0+ZHBiX3N6OworCWluc3QtPnBhcm1zLnBhcm1zX3N0YXR1cwl8PSBWNEwyX0NPTkZJR19QQVJNX0RFQ09ERV9QU0lORk87CisKKwl2ZGVjX2NvbmZpZ19kd19tb2RlKHBpYywgZHcpOworCisJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19CVUZNR1IsCisJCSJUaGUgc3RyZWFtIGluZm9zLCBkdzogJWQsIGNvZGVkOiglZCB4ICVkKSwgdmlzaWJsZTooJWQgeCAlZCksIERQQjogJWQsIG1hcmdpbjogJWRcbiIsCisJCWR3LCBwaWMtPmNvZGVkX3dpZHRoLCBwaWMtPmNvZGVkX2hlaWdodCwKKwkJcGljLT52aXNpYmxlX3dpZHRoLCBwaWMtPnZpc2libGVfaGVpZ2h0LAorCQlkZWMtPmRwYl9zeiAtIG1hcmdpbiwgbWFyZ2luKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tfZnJhbWVfY29tYmluZSh1OCAqYnVmLCB1MzIgc2l6ZSwgaW50ICpwb3MpCit7CisJYm9vbCBjb21iaW5lID0gZmFsc2U7CisJaW50IGkgPSAwLCBqID0gMCwgY250ID0gMDsKKwl1OCAqcCA9IGJ1ZjsKKworCWZvciAoaSA9IDQ7IGkgPCBzaXplOyBpKyspIHsKKwkJaiA9IGZpbmRfc3RhcnRfY29kZShwLCA3KTsKKwkJaWYgKGogPiAwKSB7CisJCQlpZiAoKytjbnQgPiAxKSB7CisJCQkJY29tYmluZSA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCSpwb3MgPSBwIC0gYnVmICsgajsKKwkJCXAgKz0gajsKKwkJCWkgKz0gajsKKwkJfQorCQlwKys7CisJfQorCisJLy9wcl9pbmZvKCJuYWwgcG9zOiAlZCwgaXNfY29tYmluZTogJWRcbiIsKnBvcywgKmlzX2NvbWJpbmUpOworCXJldHVybiBjb21iaW5lOworfQorCitzdGF0aWMgaW50IHZkZWNfc2VhcmNoX3N0YXJ0Y29kZSh1OCAqYnVmLCB1MzIgcmFuZ2UpCit7CisJaW50IHBvcyA9IC0xOworCWludCBpID0gMCwgaiA9IDA7CisJdTggKnAgPSBidWY7CisKKwlmb3IgKGkgPSA0OyBpIDwgcmFuZ2U7IGkrKykgeworCQlqID0gZmluZF9zdGFydF9jb2RlKHAsIDcpOworCQlpZiAoaiA+IDApIHsKKwkJCXBvcyA9IHAgLSBidWYgKyBqOworCQkJYnJlYWs7CisJCX0KKwkJcCsrOworCX0KKworCXJldHVybiBwb3M7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfc3RyZWFtX3Vjb2RlKHN0cnVjdCB2ZGVjX2gyNjRfaW5zdCAqaW5zdCwKKwkJCSAgICAgIHU4ICpidWYsIHUzMiBzaXplLCB1NjQgdGltZXN0YW1wKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhbWxfdmRlY19hZGFwdCAqdmRlYyA9ICZpbnN0LT52ZGVjOworCisJcmV0ID0gdmRlY192ZnJhbWVfd3JpdGUodmRlYywgYnVmLCBzaXplLCB0aW1lc3RhbXAsIDApOworCWlmIChyZXQgPCAwKSB7CisJCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkid3JpdGUgZnJhbWUgZGF0YSBmYWlsZWQuIGVycjogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogd2FpdCB1Y29kZSBwYXJzZSBlbmRpbmcuICovCisJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpbnN0LT5jb21wLAorCQltc2Vjc190b19qaWZmaWVzKDEwMDApKTsKKworCXJldHVybiBpbnN0LT52c2ktPnBpYy5kcGJfZnJhbWVzID8gMCA6IC0xOworfQorCitzdGF0aWMgaW50IHBhcnNlX3N0cmVhbV91Y29kZV9kbWEoc3RydWN0IHZkZWNfaDI2NF9pbnN0ICppbnN0LAorCXVsb25nIGJ1ZiwgdTMyIHNpemUsIHU2NCB0aW1lc3RhbXAsIHUzMiBoYW5kbGUpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGFtbF92ZGVjX2FkYXB0ICp2ZGVjID0gJmluc3QtPnZkZWM7CisKKwlyZXQgPSB2ZGVjX3ZmcmFtZV93cml0ZV93aXRoX2RtYSh2ZGVjLCBidWYsIHNpemUsIHRpbWVzdGFtcCwgaGFuZGxlLAorCQl2ZGVjX3ZmcmFtZV9pbnB1dF9mcmVlLCBpbnN0LT5jdHgpOworCWlmIChyZXQgPCAwKSB7CisJCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkid3JpdGUgZnJhbWUgZGF0YSBmYWlsZWQuIGVycjogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogd2FpdCB1Y29kZSBwYXJzZSBlbmRpbmcuICovCisJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpbnN0LT5jb21wLAorCQltc2Vjc190b19qaWZmaWVzKDEwMDApKTsKKworCXJldHVybiBpbnN0LT52c2ktPnBpYy5kcGJfZnJhbWVzID8gMCA6IC0xOworfQorCitzdGF0aWMgaW50IHBhcnNlX3N0cmVhbV9jcHUoc3RydWN0IHZkZWNfaDI2NF9pbnN0ICppbnN0LCB1OCAqYnVmLCB1MzIgc2l6ZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgaDI2NF9wYXJhbV9zZXRzICpwczsKKwlpbnQgbmFsX2lkeCA9IDA7CisJYm9vbCBpc19jb21iaW5lID0gZmFsc2U7CisKKwlpc19jb21iaW5lID0gY2hlY2tfZnJhbWVfY29tYmluZShidWYsIHNpemUsICZuYWxfaWR4KTsKKwlpZiAobmFsX2lkeCA8IDApCisJCXJldHVybiAtMTsKKworCS8qIGlmIHRoZSBzdCBjb21wb3NlIGZyb20gY3NkICsgc2xpY2UgdGhhdCBpcyB0aGUgY29tYmluZSBkYXRhLiAqLworCWluc3QtPnZzaS0+aXNfY29tYmluZSA9IGlzX2NvbWJpbmU7CisJaW5zdC0+dnNpLT5uYWx1X3BvcyA9IG5hbF9pZHg7CisKKwlwcyA9IHZ6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoMjY0X3BhcmFtX3NldHMpKTsKKwlpZiAocHMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBoMjY0X2RlY29kZV9leHRyYWRhdGFfcHMoYnVmLCBzaXplLCBwcyk7CisJaWYgKHJldCkgeworCQl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJInBhcnNlIGV4dHJhIGRhdGEgZmFpbGVkLiBlcnI6ICVkXG4iLCByZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocHMtPnNwc19wYXJzZWQpCisJCWZpbGxfdmRlY19wYXJhbXMoaW5zdCwgJnBzLT5zcHMpOworCisJcmV0ID0gcHMtPnNwc19wYXJzZWQgPyAwIDogLTE7CitvdXQ6CisJdmZyZWUocHMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2ZGVjX2gyNjRfcHJvYmUodW5zaWduZWQgbG9uZyBoX3ZkZWMsCisJc3RydWN0IGFtbF92Y29kZWNfbWVtICpicywgdm9pZCAqb3V0KQoreworCXN0cnVjdCB2ZGVjX2gyNjRfaW5zdCAqaW5zdCA9CisJCShzdHJ1Y3QgdmRlY19oMjY0X2luc3QgKiloX3ZkZWM7CisJdTggKmJ1ZiA9ICh1OCAqKSBicy0+dmFkZHI7CisJdTMyIHNpemUgPSBicy0+c2l6ZTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChpbnN0LT5jdHgtPmlzX2RybV9tb2RlKSB7CisJCWlmIChicy0+bW9kZWwgPT0gVkIyX01FTU9SWV9NTUFQKSB7CisJCQlzdHJ1Y3QgYW1sX3ZpZGVvX3N0cmVhbSAqcyA9CisJCQkJKHN0cnVjdCBhbWxfdmlkZW9fc3RyZWFtICopIGJ1ZjsKKworCQkJaWYgKChzLT5tYWdpYyAhPSBBTUxfVklERU9fTUFHSUMpICYmCisJCQkJKHMtPnR5cGUgIT0gVjRMX1NUUkVBTV9UWVBFX01BVEVEQVRBKSkKKwkJCQlyZXR1cm4gLTE7CisKKwkJCWlmIChpbnN0LT5jdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSkgeworCQkJCXJldCA9IHBhcnNlX3N0cmVhbV91Y29kZShpbnN0LCBzLT5kYXRhLAorCQkJCQlzLT5sZW4sIGJzLT50aW1lc3RhbXApOworCQkJfSBlbHNlIHsKKwkJCQlza2lwX2F1ZF9kYXRhKCh1OCAqKikmcy0+ZGF0YSwgJnMtPmxlbik7CisJCQkJcmV0ID0gcGFyc2Vfc3RyZWFtX2NwdShpbnN0LCBzLT5kYXRhLCBzLT5sZW4pOworCQkJfQorCQl9IGVsc2UgaWYgKGJzLT5tb2RlbCA9PSBWQjJfTUVNT1JZX0RNQUJVRiB8fAorCQkJYnMtPm1vZGVsID09IFZCMl9NRU1PUllfVVNFUlBUUikgeworCQkJcmV0ID0gcGFyc2Vfc3RyZWFtX3Vjb2RlX2RtYShpbnN0LCBicy0+YWRkciwgc2l6ZSwKKwkJCQlicy0+dGltZXN0YW1wLCBCVUZGX0lEWChicywgYnMtPmluZGV4KSk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoaW5zdC0+Y3R4LT5wYXJhbV9zZXRzX2Zyb21fdWNvZGUpIHsKKwkJCXJldCA9IHBhcnNlX3N0cmVhbV91Y29kZShpbnN0LCBidWYsIHNpemUsIGJzLT50aW1lc3RhbXApOworCQl9IGVsc2UgeworCQkJc2tpcF9hdWRfZGF0YSgmYnVmLCAmc2l6ZSk7CisJCQlyZXQgPSBwYXJzZV9zdHJlYW1fY3B1KGluc3QsIGJ1Ziwgc2l6ZSk7CisJCX0KKwl9CisKKwlpbnN0LT52c2ktPmN1cl9waWMgPSBpbnN0LT52c2ktPnBpYzsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHZkZWNfaDI2NF9kZWluaXQodW5zaWduZWQgbG9uZyBoX3ZkZWMpCit7CisJc3RydWN0IHZkZWNfaDI2NF9pbnN0ICppbnN0ID0gKHN0cnVjdCB2ZGVjX2gyNjRfaW5zdCAqKWhfdmRlYzsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IGluc3QtPmN0eDsKKworCXZpZGVvX2RlY29kZXJfcmVsZWFzZSgmaW5zdC0+dmRlYyk7CisKKwlpZiAoaW5zdC0+dnNpICYmIGluc3QtPnZzaS0+aGVhZGVyX2J1ZikKKwkJdmZyZWUoaW5zdC0+dnNpLT5oZWFkZXJfYnVmKTsKKworCWlmIChpbnN0LT52c2kpCisJCXZmcmVlKGluc3QtPnZzaSk7CisKKwl2ZnJlZShpbnN0KTsKKworCWN0eC0+ZHJ2X2hhbmRsZSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgdmRlY193cml0ZV9uYWx1KHN0cnVjdCB2ZGVjX2gyNjRfaW5zdCAqaW5zdCwKKwl1OCAqYnVmLCB1MzIgc2l6ZSwgdTY0IHRzKQoreworCWludCByZXQgPSAtMTsKKwlzdHJ1Y3QgYW1sX3ZkZWNfYWRhcHQgKnZkZWMgPSAmaW5zdC0+dmRlYzsKKwlib29sIGlzX2NvbWJpbmUgPSBpbnN0LT52c2ktPmlzX2NvbWJpbmU7CisJaW50IG5hbHVfcG9zOworCXUzMiBuYWxfdHlwZTsKKworCS8qcHJpbnRfaGV4X2RlYnVnKGJ1Ziwgc2l6ZSwgMzIpOyovCisKKwluYWx1X3BvcyA9IHZkZWNfc2VhcmNoX3N0YXJ0Y29kZShidWYsIDE2KTsKKwlpZiAobmFsdV9wb3MgPCAwKQorCQlnb3RvIGVycjsKKworCW5hbF90eXBlID0gQVZDX05BTF9UWVBFKGJ1ZltuYWx1X3Bvc10pOworCS8vdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19QUklORk8sICJOQUxVIHR5cGU6ICVkLCBzaXplOiAldVxuIiwgbmFsX3R5cGUsIHNpemUpOworCisJaWYgKG5hbF90eXBlID09IE5BTF9IMjY0X1NQUyAmJiAhaXNfY29tYmluZSkgeworCQlpZiAoaW5zdC0+dnNpLT5oZWFkX29mZnNldCArIHNpemUgPiBIRUFERVJfQlVGRkVSX1NJWkUpIHsKKwkJCXJldCA9IC1FSUxTRVE7CisJCQlnb3RvIGVycjsKKwkJfQorCQlpbnN0LT52c2ktPnNwc19zaXplID0gc2l6ZTsKKwkJbWVtY3B5KGluc3QtPnZzaS0+aGVhZGVyX2J1ZiArIGluc3QtPnZzaS0+aGVhZF9vZmZzZXQsIGJ1Ziwgc2l6ZSk7CisJCWluc3QtPnZzaS0+aGVhZF9vZmZzZXQgKz0gaW5zdC0+dnNpLT5zcHNfc2l6ZTsKKwkJcmV0ID0gc2l6ZTsKKwl9IGVsc2UgaWYgKG5hbF90eXBlID09IE5BTF9IMjY0X1BQUyAmJiAhaXNfY29tYmluZSkgeworCQkJLy9idWZfc3ogLT0gbmFsX3N0YXJ0X2lkeDsKKwkJaWYgKGluc3QtPnZzaS0+aGVhZF9vZmZzZXQgKyBzaXplID4gSEVBREVSX0JVRkZFUl9TSVpFKSB7CisJCQlyZXQgPSAtRUlMU0VROworCQkJZ290byBlcnI7CisJCX0KKwkJaW5zdC0+dnNpLT5wcHNfc2l6ZSA9IHNpemU7CisJCW1lbWNweShpbnN0LT52c2ktPmhlYWRlcl9idWYgKyBpbnN0LT52c2ktPmhlYWRfb2Zmc2V0LCBidWYsIHNpemUpOworCQlpbnN0LT52c2ktPmhlYWRfb2Zmc2V0ICs9IGluc3QtPnZzaS0+cHBzX3NpemU7CisJCXJldCA9IHNpemU7CisJfSBlbHNlIGlmIChuYWxfdHlwZSA9PSBOQUxfSDI2NF9TRUkgJiYgIWlzX2NvbWJpbmUpIHsKKwkJaWYgKGluc3QtPnZzaS0+aGVhZF9vZmZzZXQgKyBzaXplID4gSEVBREVSX0JVRkZFUl9TSVpFKSB7CisJCQlyZXQgPSAtRUlMU0VROworCQkJZ290byBlcnI7CisJCX0KKwkJaW5zdC0+dnNpLT5zZWlfc2l6ZSA9IHNpemU7CisJCW1lbWNweShpbnN0LT52c2ktPmhlYWRlcl9idWYgKyBpbnN0LT52c2ktPmhlYWRfb2Zmc2V0LCBidWYsIHNpemUpOworCQlpbnN0LT52c2ktPmhlYWRfb2Zmc2V0ICs9IGluc3QtPnZzaS0+c2VpX3NpemU7CisJCXJldCA9IHNpemU7CisJfSBlbHNlIGlmIChpbnN0LT52c2ktPmhlYWRfb2Zmc2V0ID09IDApIHsKKwkJcmV0ID0gdmRlY192ZnJhbWVfd3JpdGUodmRlYywgYnVmLCBzaXplLCB0cywgMCk7CisJfSBlbHNlIHsKKwkJY2hhciAqd3JpdGVfYnVmID0gdm1hbGxvYyhpbnN0LT52c2ktPmhlYWRfb2Zmc2V0ICsgc2l6ZSk7CisJCWlmICghd3JpdGVfYnVmKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBlcnI7CisJCX0KKworCQltZW1jcHkod3JpdGVfYnVmLCBpbnN0LT52c2ktPmhlYWRlcl9idWYsIGluc3QtPnZzaS0+aGVhZF9vZmZzZXQpOworCQltZW1jcHkod3JpdGVfYnVmICsgaW5zdC0+dnNpLT5oZWFkX29mZnNldCwgYnVmLCBzaXplKTsKKworCQlyZXQgPSB2ZGVjX3ZmcmFtZV93cml0ZSh2ZGVjLCB3cml0ZV9idWYsCisJCQlpbnN0LT52c2ktPmhlYWRfb2Zmc2V0ICsgc2l6ZSwgdHMsIDApOworCisJCW1lbXNldChpbnN0LT52c2ktPmhlYWRlcl9idWYsIDAsIEhFQURFUl9CVUZGRVJfU0laRSk7CisJCWluc3QtPnZzaS0+aGVhZF9vZmZzZXQgPSAwOworCQlpbnN0LT52c2ktPnNwc19zaXplID0gMDsKKwkJaW5zdC0+dnNpLT5wcHNfc2l6ZSA9IDA7CisJCWluc3QtPnZzaS0+c2VpX3NpemUgPSAwOworCisJCXZmcmVlKHdyaXRlX2J1Zik7CisJfQorCisJcmV0dXJuIHJldDsKK2VycjoKKwl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLCAiZXJyKCVkKSIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGJvb2wgbW9uaXRvcl9yZXNfY2hhbmdlKHN0cnVjdCB2ZGVjX2gyNjRfaW5zdCAqaW5zdCwgdTggKmJ1ZiwgdTMyIHNpemUpCit7CisJaW50IHJldCA9IDAsIGkgPSAwLCBqID0gMDsKKwl1OCAqcCA9IGJ1ZjsKKwlpbnQgbGVuID0gc2l6ZTsKKwl1MzIgdHlwZTsKKworCWZvciAoaSA9IDQ7IGkgPCBzaXplOyBpKyspIHsKKwkJaiA9IGZpbmRfc3RhcnRfY29kZShwLCBsZW4pOworCQlpZiAoaiA+IDApIHsKKwkJCWxlbiA9IHNpemUgLSAocCAtIGJ1Zik7CisJCQl0eXBlID0gQVZDX05BTF9UWVBFKHBbal0pOworCQkJaWYgKHR5cGUgIT0gTkFMX0gyNjRfQVVEICYmCisJCQkJKHR5cGUgPiBOQUxfSDI2NF9QUFMgfHwgdHlwZSA8IE5BTF9IMjY0X1NFSSkpCisJCQkJYnJlYWs7CisKKwkJCWlmICh0eXBlID09IE5BTF9IMjY0X1NQUykgeworCQkJCXJldCA9IHBhcnNlX3N0cmVhbV9jcHUoaW5zdCwgcCwgbGVuKTsKKwkJCQlpZiAocmV0KQorCQkJCQlicmVhazsKKwkJCX0KKwkJCXAgKz0gajsKKwkJfQorCQlwKys7CisJfQorCisJaWYgKCFyZXQgJiYgKChpbnN0LT52c2ktPmN1cl9waWMuY29kZWRfd2lkdGggIT0KKwkJaW5zdC0+dnNpLT5waWMuY29kZWRfd2lkdGggfHwKKwkJaW5zdC0+dnNpLT5jdXJfcGljLmNvZGVkX2hlaWdodCAhPQorCQlpbnN0LT52c2ktPnBpYy5jb2RlZF9oZWlnaHQpIHx8CisJCShpbnN0LT52c2ktPnBpYy5wcm9maWxlX2lkYyAhPQorCQlpbnN0LT52c2ktPmN1cl9waWMucHJvZmlsZV9pZGMpKSkgeworCQl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX1BSSU5GTywgInJlcyBjaGFuZ2VcbiIpOworCQlpbnN0LT52c2ktPmN1cl9waWMgPSBpbnN0LT52c2ktPnBpYzsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50IHZkZWNfaDI2NF9kZWNvZGUodW5zaWduZWQgbG9uZyBoX3ZkZWMsCisJCQkgICAgc3RydWN0IGFtbF92Y29kZWNfbWVtICpicywgYm9vbCAqcmVzX2NoZykKK3sKKwlzdHJ1Y3QgdmRlY19oMjY0X2luc3QgKmluc3QgPSAoc3RydWN0IHZkZWNfaDI2NF9pbnN0ICopaF92ZGVjOworCXN0cnVjdCBhbWxfdmRlY19hZGFwdCAqdmRlYyA9ICZpbnN0LT52ZGVjOworCXU4ICpidWYgPSAodTggKikgYnMtPnZhZGRyOworCXUzMiBzaXplID0gYnMtPnNpemU7CisJaW50IHJldCA9IC0xOworCisJaWYgKGJzID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmICh2ZGVjX2lucHV0X2Z1bGwodmRlYykpCisJCXJldHVybiAtRUFHQUlOOworCisJaWYgKGluc3QtPmN0eC0+aXNfZHJtX21vZGUpIHsKKwkJaWYgKGJzLT5tb2RlbCA9PSBWQjJfTUVNT1JZX01NQVApIHsKKwkJCXN0cnVjdCBhbWxfdmlkZW9fc3RyZWFtICpzID0KKwkJCQkoc3RydWN0IGFtbF92aWRlb19zdHJlYW0gKikgYnVmOworCisJCQlpZiAocy0+bWFnaWMgIT0gQU1MX1ZJREVPX01BR0lDKQorCQkJCXJldHVybiAtMTsKKworCQkJaWYgKCFpbnN0LT5jdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSAmJgorCQkJCShzLT50eXBlID09IFY0TF9TVFJFQU1fVFlQRV9NQVRFREFUQSkpIHsKKwkJCQlpZiAoKCpyZXNfY2hnID0gbW9uaXRvcl9yZXNfY2hhbmdlKGluc3QsCisJCQkJCXMtPmRhdGEsIHMtPmxlbikpKQorCQkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJcmV0ID0gdmRlY192ZnJhbWVfd3JpdGUodmRlYywKKwkJCQlzLT5kYXRhLAorCQkJCXMtPmxlbiwKKwkJCQlicy0+dGltZXN0YW1wLAorCQkJCTApOworCQl9IGVsc2UgaWYgKGJzLT5tb2RlbCA9PSBWQjJfTUVNT1JZX0RNQUJVRiB8fAorCQkJYnMtPm1vZGVsID09IFZCMl9NRU1PUllfVVNFUlBUUikgeworCQkJcmV0ID0gdmRlY192ZnJhbWVfd3JpdGVfd2l0aF9kbWEodmRlYywKKwkJCQlicy0+YWRkciwgc2l6ZSwgYnMtPnRpbWVzdGFtcCwKKwkJCQlCVUZGX0lEWChicywgYnMtPmluZGV4KSwKKwkJCQl2ZGVjX3ZmcmFtZV9pbnB1dF9mcmVlLCBpbnN0LT5jdHgpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGluc3QtPmN0eC0+cGFyYW1fc2V0c19mcm9tX3Vjb2RlKSB7CisJCQlpbnQgbmFsX2lkeCA9IDA7CisJCQkvKiBpZiB0aGUgc3QgY29tcG9zZSBmcm9tIGNzZCArIHNsaWNlIHRoYXQgaXMgdGhlIGNvbWJpbmUgZGF0YS4gKi8KKwkJCWluc3QtPnZzaS0+aXNfY29tYmluZSA9IGNoZWNrX2ZyYW1lX2NvbWJpbmUoYnVmLCBzaXplLCAmbmFsX2lkeCk7CisJCQkvKmlmIChuYWxfaWR4IDwgMCkKKwkJCQlyZXR1cm4gLTE7Ki8KKwkJfSBlbHNlIHsKKwkJCS8qY2hlY2tlZCB3aGV0aGVyIHRoZSByZXNvbHV0aW9uIGNoYW5nZXMuKi8KKwkJCWlmICgoKnJlc19jaGcgPSBtb25pdG9yX3Jlc19jaGFuZ2UoaW5zdCwgYnVmLCBzaXplKSkpIHsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQlyZXQgPSB2ZGVjX3dyaXRlX25hbHUoaW5zdCwgYnVmLCBzaXplLCBicy0+dGltZXN0YW1wKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBnZXRfcGFyYW1fY29uZmlnX2luZm8oc3RydWN0IHZkZWNfaDI2NF9pbnN0ICppbnN0LAorCXN0cnVjdCBhbWxfZGVjX3BhcmFtcyAqcGFybXMpCit7CisJaWYgKGluc3QtPnBhcm1zLnBhcm1zX3N0YXR1cyAmIFY0TDJfQ09ORklHX1BBUk1fREVDT0RFX0NGR0lORk8pCisJCXBhcm1zLT5jZmcgPSBpbnN0LT5wYXJtcy5jZmc7CisJaWYgKGluc3QtPnBhcm1zLnBhcm1zX3N0YXR1cyAmIFY0TDJfQ09ORklHX1BBUk1fREVDT0RFX1BTSU5GTykKKwkJcGFybXMtPnBzID0gaW5zdC0+cGFybXMucHM7CisJaWYgKGluc3QtPnBhcm1zLnBhcm1zX3N0YXR1cyAmIFY0TDJfQ09ORklHX1BBUk1fREVDT0RFX0hEUklORk8pCisJCXBhcm1zLT5oZHIgPSBpbnN0LT5wYXJtcy5oZHI7CisJaWYgKGluc3QtPnBhcm1zLnBhcm1zX3N0YXR1cyAmIFY0TDJfQ09ORklHX1BBUk1fREVDT0RFX0NOVElORk8pCisJCXBhcm1zLT5jbnQgPSBpbnN0LT5wYXJtcy5jbnQ7CisKKwlwYXJtcy0+cGFybXNfc3RhdHVzIHw9IGluc3QtPnBhcm1zLnBhcm1zX3N0YXR1czsKKworCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfUFJJTkZPLAorCQkicGFybXMgc3RhdHVzOiAldVxuIiwgcGFybXMtPnBhcm1zX3N0YXR1cyk7Cit9CisKK3N0YXRpYyBpbnQgdmRlY19oMjY0X2dldF9wYXJhbSh1bnNpZ25lZCBsb25nIGhfdmRlYywKKwkJCSAgICAgICBlbnVtIHZkZWNfZ2V0X3BhcmFtX3R5cGUgdHlwZSwgdm9pZCAqb3V0KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCB2ZGVjX2gyNjRfaW5zdCAqaW5zdCA9IChzdHJ1Y3QgdmRlY19oMjY0X2luc3QgKiloX3ZkZWM7CisKKwlpZiAoIWluc3QpIHsKKwkJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJ0aGUgaDI2NCBpbnN0IG9mIGRlYyBpcyBpbnZhbGlkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEdFVF9QQVJBTV9QSUNfSU5GTzoKKwkJZ2V0X3BpY19pbmZvKGluc3QsIG91dCk7CisJCWJyZWFrOworCisJY2FzZSBHRVRfUEFSQU1fRFBCX1NJWkU6CisJCWdldF9kcGJfc2l6ZShpbnN0LCBvdXQpOworCQlicmVhazsKKworCWNhc2UgR0VUX1BBUkFNX0NST1BfSU5GTzoKKwkJZ2V0X2Nyb3BfaW5mbyhpbnN0LCBvdXQpOworCQlicmVhazsKKworCWNhc2UgR0VUX1BBUkFNX0NPTkZJR19JTkZPOgorCQlnZXRfcGFyYW1fY29uZmlnX2luZm8oaW5zdCwgb3V0KTsKKwkJYnJlYWs7CisKKwljYXNlIEdFVF9QQVJBTV9EV19NT0RFOgorCXsKKwkJdW5zaWduZWQgaW50KiBtb2RlID0gb3V0OworCQkqbW9kZSA9IGluc3QtPmN0eC0+Y29uZmlnLnBhcm0uZGVjLmNmZy5kb3VibGVfd3JpdGVfbW9kZTsKKwkJYnJlYWs7CisJfQorCisJZGVmYXVsdDoKKwkJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJpbnZhbGlkIGdldCBwYXJhbWV0ZXIgdHlwZT0lZFxuIiwgdHlwZSk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgc2V0X3BhcmFtX3dyaXRlX3N5bmMoc3RydWN0IHZkZWNfaDI2NF9pbnN0ICppbnN0KQoreworCWNvbXBsZXRlKCZpbnN0LT5jb21wKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3BhcmFtX3BzX2luZm8oc3RydWN0IHZkZWNfaDI2NF9pbnN0ICppbnN0LAorCXN0cnVjdCBhbWxfdmRlY19wc19pbmZvcyAqcHMpCit7CisJc3RydWN0IHZkZWNfcGljX2luZm8gKnBpYyA9ICZpbnN0LT52c2ktPnBpYzsKKwlzdHJ1Y3QgdmRlY19oMjY0X2RlY19pbmZvICpkZWMgPSAmaW5zdC0+dnNpLT5kZWM7CisJc3RydWN0IHY0bDJfcmVjdCAqcmVjdCA9ICZpbnN0LT52c2ktPmNyb3A7CisJaW50IGR3ID0gaW5zdC0+cGFybXMuY2ZnLmRvdWJsZV93cml0ZV9tb2RlOworCisJLyogZmlsbCB2aXNpYmxlIGFyZWEgc2l6ZSB0aGF0IGJlIHVzZWQgZm9yIEVHTC4gKi8KKwlwaWMtPnZpc2libGVfd2lkdGgJPSBwcy0+dmlzaWJsZV93aWR0aDsKKwlwaWMtPnZpc2libGVfaGVpZ2h0CT0gcHMtPnZpc2libGVfaGVpZ2h0OworCisJLyogY2FsYyB2aXNpYmxlIGFyZXMuICovCisJcmVjdC0+bGVmdAkJPSAwOworCXJlY3QtPnRvcAkJPSAwOworCXJlY3QtPndpZHRoCQk9IHBpYy0+dmlzaWJsZV93aWR0aDsKKwlyZWN0LT5oZWlnaHQJCT0gcGljLT52aXNpYmxlX2hlaWdodDsKKworCS8qIGNvbmZpZyBjYW52YXMgc2l6ZSB0aGF0IGJlIHVzZWQgZm9yIGRlY29kZXIuICovCisJcGljLT5jb2RlZF93aWR0aAk9IHBzLT5jb2RlZF93aWR0aDsKKwlwaWMtPmNvZGVkX2hlaWdodAk9IHBzLT5jb2RlZF9oZWlnaHQ7CisJcGljLT55X2xlbl9zegkJPSBwaWMtPmNvZGVkX3dpZHRoICogcGljLT5jb2RlZF9oZWlnaHQ7CisJcGljLT5jX2xlbl9zegkJPSBwaWMtPnlfbGVuX3N6ID4+IDE7CisJcGljLT5wcm9maWxlX2lkYwk9IHBzLT5wcm9maWxlOworCXBpYy0+ZmllbGQJCT0gcHMtPmZpZWxkOworCXBpYy0+ZHBiX2ZyYW1lcwkJPSBwcy0+ZHBiX2ZyYW1lczsKKwlwaWMtPmRwYl9tYXJnaW4JCT0gcHMtPmRwYl9tYXJnaW47CisJcGljLT52cHBfbWFyZ2luCQk9IHBzLT5kcGJfbWFyZ2luOworCWRlYy0+ZHBiX3N6CQk9IHBzLT5kcGJfc2l6ZTsKKworCWluc3QtPnBhcm1zLnBzIAk9ICpwczsKKwlpbnN0LT5wYXJtcy5wYXJtc19zdGF0dXMgfD0KKwkJVjRMMl9DT05GSUdfUEFSTV9ERUNPREVfUFNJTkZPOworCisJdmRlY19jb25maWdfZHdfbW9kZShwaWMsIGR3KTsKKworCS8qd2FrZSB1cCovCisJY29tcGxldGUoJmluc3QtPmNvbXApOworCisJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19QUklORk8sCisJCSJQYXJzZSBmcm9tIHVjb2RlLCB2aXNpYmxlKCVkIHggJWQpLCBjb2RlZCglZCB4ICVkKSwgc2Nhbjolc1xuIiwKKwkJcHMtPnZpc2libGVfd2lkdGgsIHBzLT52aXNpYmxlX2hlaWdodCwKKwkJcHMtPmNvZGVkX3dpZHRoLCBwcy0+Y29kZWRfaGVpZ2h0LAorCQlwcy0+ZmllbGQgPT0gVjRMMl9GSUVMRF9OT05FID8gIlAiIDogIkkiKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3BhcmFtX2hkcl9pbmZvKHN0cnVjdCB2ZGVjX2gyNjRfaW5zdCAqaW5zdCwKKwlzdHJ1Y3QgYW1sX3ZkZWNfaGRyX2luZm9zICpoZHIpCit7CisJaW5zdC0+cGFybXMuaGRyID0gKmhkcjsKKwlpZiAoIShpbnN0LT5wYXJtcy5wYXJtc19zdGF0dXMgJgorCQlWNEwyX0NPTkZJR19QQVJNX0RFQ09ERV9IRFJJTkZPKSkgeworCQlpbnN0LT5wYXJtcy5oZHIgPSAqaGRyOworCQlpbnN0LT5wYXJtcy5wYXJtc19zdGF0dXMgfD0KKwkJCVY0TDJfQ09ORklHX1BBUk1fREVDT0RFX0hEUklORk87CisJCWFtbF92ZGVjX2Rpc3BhdGNoX2V2ZW50KGluc3QtPmN0eCwKKwkJCVY0TDJfRVZFTlRfU1JDX0NIX0hEUklORk8pOworCQl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX1BSSU5GTywKKwkJCSJIMjY0IHNldCBIRFIgaW5mb3NcbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgc2V0X3BpY19pbmZvKHN0cnVjdCB2ZGVjX2gyNjRfaW5zdCAqaW5zdCwKKwlzdHJ1Y3QgdmRlY19waWNfaW5mbyAqcGljKQoreworCWluc3QtPnZzaS0+cGljID0gKnBpYzsKK30KKworc3RhdGljIHZvaWQgc2V0X3BhcmFtX3Bvc3RfZXZlbnQoc3RydWN0IHZkZWNfaDI2NF9pbnN0ICppbnN0LCB1MzIgKmV2ZW50KQoreworCWFtbF92ZGVjX2Rpc3BhdGNoX2V2ZW50KGluc3QtPmN0eCwgKmV2ZW50KTsKKwl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX1BSSU5GTywKKwkJIkgyNjQgcG9zdCBldmVudDogJWRcbiIsICpldmVudCk7Cit9CisKK3N0YXRpYyBpbnQgdmRlY19oMjY0X3NldF9wYXJhbSh1bnNpZ25lZCBsb25nIGhfdmRlYywKKwllbnVtIHZkZWNfc2V0X3BhcmFtX3R5cGUgdHlwZSwgdm9pZCAqaW4pCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHZkZWNfaDI2NF9pbnN0ICppbnN0ID0gKHN0cnVjdCB2ZGVjX2gyNjRfaW5zdCAqKWhfdmRlYzsKKworCWlmICghaW5zdCkgeworCQl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJInRoZSBoMjY0IGluc3Qgb2YgZGVjIGlzIGludmFsaWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU0VUX1BBUkFNX1dSSVRFX0ZSQU1FX1NZTkM6CisJCXNldF9wYXJhbV93cml0ZV9zeW5jKGluc3QpOworCQlicmVhazsKKworCWNhc2UgU0VUX1BBUkFNX1BTX0lORk86CisJCXNldF9wYXJhbV9wc19pbmZvKGluc3QsIGluKTsKKwkJYnJlYWs7CisKKwljYXNlIFNFVF9QQVJBTV9IRFJfSU5GTzoKKwkJc2V0X3BhcmFtX2hkcl9pbmZvKGluc3QsIGluKTsKKwkJYnJlYWs7CisKKwljYXNlIFNFVF9QQVJBTV9QT1NUX0VWRU5UOgorCQlzZXRfcGFyYW1fcG9zdF9ldmVudChpbnN0LCBpbik7CisJCWJyZWFrOworCisJY2FzZSBTRVRfUEFSQU1fUElDX0lORk86CisJCXNldF9waWNfaW5mbyhpbnN0LCBpbik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJpbnZhbGlkIHNldCBwYXJhbWV0ZXIgdHlwZT0lZFxuIiwgdHlwZSk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCB2ZGVjX2NvbW1vbl9pZiB2ZGVjX2gyNjRfaWYgPSB7CisJLmluaXQJCT0gdmRlY19oMjY0X2luaXQsCisJLnByb2JlCQk9IHZkZWNfaDI2NF9wcm9iZSwKKwkuZGVjb2RlCQk9IHZkZWNfaDI2NF9kZWNvZGUsCisJLmdldF9wYXJhbQk9IHZkZWNfaDI2NF9nZXRfcGFyYW0sCisJLnNldF9wYXJhbQk9IHZkZWNfaDI2NF9zZXRfcGFyYW0sCisJLmRlaW5pdAkJPSB2ZGVjX2gyNjRfZGVpbml0LAorfTsKKworc3RydWN0IHZkZWNfY29tbW9uX2lmICpnZXRfaDI2NF9kZWNfY29tbV9pZih2b2lkKTsKKworc3RydWN0IHZkZWNfY29tbW9uX2lmICpnZXRfaDI2NF9kZWNfY29tbV9pZih2b2lkKQoreworCXJldHVybiAmdmRlY19oMjY0X2lmOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbXZkZWNfcG9ydHMvZGVjb2Rlci92ZGVjX2hldmNfaWYuYyBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2RlY29kZXIvdmRlY19oZXZjX2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZkNDkyYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2RlY29kZXIvdmRlY19oZXZjX2lmLmMKQEAgLTAsMCArMSw4NjYgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNyBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisqIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyoKKyogRGVzY3JpcHRpb246CisqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9zd2FiLmg+CisjaW5jbHVkZSAiLi4vdmRlY19kcnZfaWYuaCIKKyNpbmNsdWRlICIuLi9hbWxfdmNvZGVjX3V0aWwuaCIKKyNpbmNsdWRlICIuLi9hbWxfdmNvZGVjX2RlYy5oIgorI2luY2x1ZGUgIi4uL2FtbF92Y29kZWNfZHJ2LmgiCisjaW5jbHVkZSAiLi4vYW1sX3Zjb2RlY19hZGFwdC5oIgorI2luY2x1ZGUgIi4uL3ZkZWNfZHJ2X2Jhc2UuaCIKKyNpbmNsdWRlICJhbWxfaGV2Y19wYXJzZXIuaCIKKworI2RlZmluZSBIRVZDX05BTF9UWVBFKHZhbHVlKQkJCQkoKHZhbHVlID4+IDEpICYgMHgzRikKKyNkZWZpbmUgSEVBREVSX0JVRkZFUl9TSVpFCQkJKDMyICogMTAyNCkKKworLyoqCisgKiBzdHJ1Y3QgaGV2Y19mYiAtIGhldmMgZGVjb2RlIGZyYW1lIGJ1ZmZlciBpbmZvcm1hdGlvbgorICogQHZkZWNfZmJfdmEgIDogdmlydHVhbCBhZGRyZXNzIG9mIHN0cnVjdCB2ZGVjX2ZiCisgKiBAeV9mYl9kbWEgICAgOiBkbWEgYWRkcmVzcyBvZiBZIGZyYW1lIGJ1ZmZlciAobHVtYSkKKyAqIEBjX2ZiX2RtYSAgICA6IGRtYSBhZGRyZXNzIG9mIEMgZnJhbWUgYnVmZmVyIChjaHJvbWEpCisgKiBAcG9jICAgICAgICAgOiBwaWN0dXJlIG9yZGVyIGNvdW50IG9mIGZyYW1lIGJ1ZmZlcgorICogQHJlc2VydmVkICAgIDogZm9yIDggYnl0ZXMgYWxpZ25tZW50CisgKi8KK3N0cnVjdCBoZXZjX2ZiIHsKKwl1aW50NjRfdCB2ZGVjX2ZiX3ZhOworCXVpbnQ2NF90IHlfZmJfZG1hOworCXVpbnQ2NF90IGNfZmJfZG1hOworCWludDMyX3QgcG9jOworCXVpbnQzMl90IHJlc2VydmVkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdmRlY19oZXZjX2RlY19pbmZvIC0gZGVjb2RlIGluZm9ybWF0aW9uCisgKiBAZHBiX3N6CQk6IGRlY29kaW5nIHBpY3R1cmUgYnVmZmVyIHNpemUKKyAqIEByZXNvbHV0aW9uX2NoYW5nZWQgIDogcmVzb2x0aW9uIGNoYW5nZSBoYXBwZW4KKyAqIEByZXNlcnZlZAkJOiBmb3IgOCBieXRlcyBhbGlnbm1lbnQKKyAqIEBic19kbWEJCTogSW5wdXQgYml0LXN0cmVhbSBidWZmZXIgZG1hIGFkZHJlc3MKKyAqIEB5X2ZiX2RtYQkJOiBZIGZyYW1lIGJ1ZmZlciBkbWEgYWRkcmVzcworICogQGNfZmJfZG1hCQk6IEMgZnJhbWUgYnVmZmVyIGRtYSBhZGRyZXNzCisgKiBAdmRlY19mYl92YQkJOiBWREVDIGZyYW1lIGJ1ZmZlciBzdHJ1Y3QgdmlydHVhbCBhZGRyZXNzCisgKi8KK3N0cnVjdCB2ZGVjX2hldmNfZGVjX2luZm8geworCXVpbnQzMl90IGRwYl9zejsKKwl1aW50MzJfdCByZXNvbHV0aW9uX2NoYW5nZWQ7CisJdWludDMyX3QgcmVzZXJ2ZWQ7CisJdWludDY0X3QgYnNfZG1hOworCXVpbnQ2NF90IHlfZmJfZG1hOworCXVpbnQ2NF90IGNfZmJfZG1hOworCXVpbnQ2NF90IHZkZWNfZmJfdmE7Cit9OworCisvKioKKyAqIHN0cnVjdCB2ZGVjX2hldmNfdnNpIC0gc2hhcmVkIG1lbW9yeSBmb3IgZGVjb2RlIGluZm9ybWF0aW9uIGV4Y2hhbmdlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gVlBVIGFuZCBIb3N0LgorICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWVtb3J5IGlzIGFsbG9jYXRlZCBieSBWUFUgdGhlbiBtYXBwaW5nIHRvIEhvc3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgaW4gdnB1X2RlY19pbml0KCkgYW5kIGZyZWVkIGluIHZwdV9kZWNfZGVpbml0KCkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYnkgVlBVLgorICogICAgICAgICAgICAgICAgICAgICAgICBBUC1XL1IgOiBBUCBpcyB3cml0ZXIvcmVhZGVyIG9uIHRoaXMgaXRlbQorICogICAgICAgICAgICAgICAgICAgICAgICBWUFUtVy9SOiBWUFUgaXMgd3JpdGUvcmVhZGVyIG9uIHRoaXMgaXRlbQorICogQGhkcl9idWYgICAgICA6IEhlYWRlciBwYXJzaW5nIGJ1ZmZlciAoQVAtVywgVlBVLVIpCisgKiBAbGlzdF9mcmVlICAgIDogZnJlZSBmcmFtZSBidWZmZXIgcmluZyBsaXN0IChBUC1XL1IsIFZQVS1XKQorICogQGxpc3RfZGlzcCAgICA6IGRpc3BsYXkgZnJhbWUgYnVmZmVyIHJpbmcgbGlzdCAoQVAtUiwgVlBVLVcpCisgKiBAZGVjICAgICAgICAgIDogZGVjb2RlIGluZm9ybWF0aW9uIChBUC1SLCBWUFUtVykKKyAqIEBwaWMgICAgICAgICAgOiBwaWN0dXJlIGluZm9ybWF0aW9uIChBUC1SLCBWUFUtVykKKyAqIEBjcm9wICAgICAgICAgOiBjcm9wIGluZm9ybWF0aW9uIChBUC1SLCBWUFUtVykKKyAqLworc3RydWN0IHZkZWNfaGV2Y192c2kgeworCWNoYXIgKmhlYWRlcl9idWY7CisJaW50IHNwc19zaXplOworCWludCBwcHNfc2l6ZTsKKwlpbnQgc2VpX3NpemU7CisJaW50IGhlYWRfb2Zmc2V0OworCXN0cnVjdCB2ZGVjX2hldmNfZGVjX2luZm8gZGVjOworCXN0cnVjdCB2ZGVjX3BpY19pbmZvIHBpYzsKKwlzdHJ1Y3QgdmRlY19waWNfaW5mbyBjdXJfcGljOworCXN0cnVjdCB2NGwyX3JlY3QgY3JvcDsKKwlib29sIGlzX2NvbWJpbmU7CisJaW50IG5hbHVfcG9zOworCXN0cnVjdCBoMjY1X3BhcmFtX3NldHMgcHM7Cit9OworCisvKioKKyAqIHN0cnVjdCB2ZGVjX2hldmNfaW5zdCAtIGhldmMgZGVjb2RlciBpbnN0YW5jZQorICogQG51bV9uYWx1IDogaG93IG1hbnkgbmFsdXMgYmUgZGVjb2RlZAorICogQGN0eCAgICAgIDogcG9pbnQgdG8gYW1sX3Zjb2RlY19jdHgKKyAqIEB2c2kgICAgICA6IFZQVSBzaGFyZWQgaW5mb3JtYXRpb24KKyAqLworc3RydWN0IHZkZWNfaGV2Y19pbnN0IHsKKwl1bnNpZ25lZCBpbnQgbnVtX25hbHU7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHg7CisJc3RydWN0IGFtbF92ZGVjX2FkYXB0IHZkZWM7CisJc3RydWN0IHZkZWNfaGV2Y192c2kgKnZzaTsKKwlzdHJ1Y3QgYW1sX2RlY19wYXJhbXMgcGFybXM7CisJc3RydWN0IGNvbXBsZXRpb24gY29tcDsKKwlzdHJ1Y3QgdmRlY19jb21wX2J1Zl9pbmZvIGNvbXBfaW5mbzsKK307CisKK3N0YXRpYyB2b2lkIGdldF9waWNfaW5mbyhzdHJ1Y3QgdmRlY19oZXZjX2luc3QgKmluc3QsCisJCQkgc3RydWN0IHZkZWNfcGljX2luZm8gKnBpYykKK3sKKwkqcGljID0gaW5zdC0+dnNpLT5waWM7CisKKwl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywKKwkJInBpYyglZCwgJWQpLCBidWYoJWQsICVkKVxuIiwKKwkJIHBpYy0+dmlzaWJsZV93aWR0aCwgcGljLT52aXNpYmxlX2hlaWdodCwKKwkJIHBpYy0+Y29kZWRfd2lkdGgsIHBpYy0+Y29kZWRfaGVpZ2h0KTsKKwl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywKKwkJIlkoJWQsICVkKSwgQyglZCwgJWQpXG4iLCBwaWMtPnlfYnNfc3osCisJCSBwaWMtPnlfbGVuX3N6LCBwaWMtPmNfYnNfc3osIHBpYy0+Y19sZW5fc3opOworfQorCitzdGF0aWMgdm9pZCBnZXRfY3JvcF9pbmZvKHN0cnVjdCB2ZGVjX2hldmNfaW5zdCAqaW5zdCwgc3RydWN0IHY0bDJfcmVjdCAqY3IpCit7CisJY3ItPmxlZnQgPSBpbnN0LT52c2ktPmNyb3AubGVmdDsKKwljci0+dG9wID0gaW5zdC0+dnNpLT5jcm9wLnRvcDsKKwljci0+d2lkdGggPSBpbnN0LT52c2ktPmNyb3Aud2lkdGg7CisJY3ItPmhlaWdodCA9IGluc3QtPnZzaS0+Y3JvcC5oZWlnaHQ7CisKKwl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywKKwkJImw9JWQsIHQ9JWQsIHc9JWQsIGg9JWRcbiIsCisJCSBjci0+bGVmdCwgY3ItPnRvcCwgY3ItPndpZHRoLCBjci0+aGVpZ2h0KTsKK30KKworc3RhdGljIHZvaWQgZ2V0X2RwYl9zaXplKHN0cnVjdCB2ZGVjX2hldmNfaW5zdCAqaW5zdCwgdW5zaWduZWQgaW50ICpkcGJfc3opCit7CisJKmRwYl9zeiA9IGluc3QtPnZzaS0+ZGVjLmRwYl9zejsKKwl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywgInN6PSVkXG4iLCAqZHBiX3N6KTsKK30KKworc3RhdGljIHUzMiB2ZGVjX2NvbmZpZ19kZWZhdWx0X3Bhcm1zKHU4ICpwYXJtKQoreworCXU4ICpwYnVmID0gcGFybTsKKworCXBidWYgKz0gc3ByaW50ZihwYnVmLCAicGFybV92NGxfY29kZWNfZW5hYmxlOjE7Iik7CisJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJwYXJtX3Y0bF9idWZmZXJfbWFyZ2luOjc7Iik7CisJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJoZXZjX2RvdWJsZV93cml0ZV9tb2RlOjE7Iik7CisJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJoZXZjX2J1Zl93aWR0aDo0MDk2OyIpOworCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiaGV2Y19idWZfaGVpZ2h0OjIzMDQ7Iik7CisJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJzYXZlX2J1ZmZlcl9tb2RlOjA7Iik7CisJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJwYXJtX3Y0bF9jYW52YXNfbWVtX21vZGU6MDsiKTsKKwlwYnVmICs9IHNwcmludGYocGJ1ZiwgInBhcm1fdjRsX2NhbnZhc19tZW1fZW5kaWFuOjA7Iik7CisKKwlyZXR1cm4gcGFybSAtIHBidWY7Cit9CisKK3N0YXRpYyB2b2lkIHZkZWNfcGFyc2VyX3Bhcm1zKHN0cnVjdCB2ZGVjX2hldmNfaW5zdCAqaW5zdCkKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IGluc3QtPmN0eDsKKworCWlmIChjdHgtPmNvbmZpZy5wYXJtLmRlYy5wYXJtc19zdGF0dXMgJgorCQlWNEwyX0NPTkZJR19QQVJNX0RFQ09ERV9DRkdJTkZPKSB7CisJCXU4ICpwYnVmID0gY3R4LT5jb25maWcuYnVmOworCisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAicGFybV92NGxfY29kZWNfZW5hYmxlOjE7Iik7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAicGFybV92NGxfYnVmZmVyX21hcmdpbjolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuY2ZnLnJlZl9idWZfbWFyZ2luKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJoZXZjX2RvdWJsZV93cml0ZV9tb2RlOiVkOyIsCisJCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5jZmcuZG91YmxlX3dyaXRlX21vZGUpOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgImhldmNfYnVmX3dpZHRoOjQwOTY7Iik7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiaGV2Y19idWZfaGVpZ2h0OjIzMDQ7Iik7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAic2F2ZV9idWZmZXJfbW9kZTowOyIpOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgInBhcm1fdjRsX2NhbnZhc19tZW1fbW9kZTolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuY2ZnLmNhbnZhc19tZW1fbW9kZSk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAicGFybV92NGxfY2FudmFzX21lbV9lbmRpYW46JWQ7IiwKKwkJCWN0eC0+Y29uZmlnLnBhcm0uZGVjLmNmZy5jYW52YXNfbWVtX2VuZGlhbik7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAicGFybV92NGxfbG93X2xhdGVuY3lfbW9kZTolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuY2ZnLmxvd19sYXRlbmN5X21vZGUpOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgInBhcm1fdjRsX21ldGFkYXRhX2NvbmZpZ19mbGFnOiVkOyIsCisJCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5jZmcubWV0YWRhdGFfY29uZmlnX2ZsYWcpOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgInBhcm1fdjRsX2R1cmF0aW9uOiVkOyIsCisJCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5jZmcuZHVyYXRpb24pOworCQljdHgtPmNvbmZpZy5sZW5ndGggPSBwYnVmIC0gY3R4LT5jb25maWcuYnVmOworCX0gZWxzZSB7CisJCWN0eC0+Y29uZmlnLnBhcm0uZGVjLmNmZy5kb3VibGVfd3JpdGVfbW9kZSA9IDE7CisJCWN0eC0+Y29uZmlnLnBhcm0uZGVjLmNmZy5yZWZfYnVmX21hcmdpbiA9IDc7CisJCWN0eC0+Y29uZmlnLmxlbmd0aCA9IHZkZWNfY29uZmlnX2RlZmF1bHRfcGFybXMoY3R4LT5jb25maWcuYnVmKTsKKwl9CisKKwlpbnN0LT52ZGVjLmNvbmZpZwk9IGN0eC0+Y29uZmlnOworCWluc3QtPnBhcm1zLmNmZwkJPSBjdHgtPmNvbmZpZy5wYXJtLmRlYy5jZmc7CisJaW5zdC0+cGFybXMucGFybXNfc3RhdHVzIHw9IFY0TDJfQ09ORklHX1BBUk1fREVDT0RFX0NGR0lORk87Cit9CisKK3N0YXRpYyBpbnQgdmRlY19oZXZjX2luaXQoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsIHVuc2lnbmVkIGxvbmcgKmhfdmRlYykKK3sKKwlzdHJ1Y3QgdmRlY19oZXZjX2luc3QgKmluc3QgPSBOVUxMOworCWludCByZXQgPSAtMTsKKworCWluc3QgPSBremFsbG9jKHNpemVvZigqaW5zdCksIEdGUF9LRVJORUwpOworCWlmICghaW5zdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbnN0LT52ZGVjLmZybV9uYW1lCT0gIkguMjY1IjsKKwlpbnN0LT52ZGVjLnZpZGVvX3R5cGUJPSBWRk9STUFUX0hFVkM7CisJaW5zdC0+dmRlYy5maWxwCQk9IGN0eC0+ZGV2LT5maWxwOworCWluc3QtPnZkZWMuY3R4CQk9IGN0eDsKKwlpbnN0LT5jdHgJCT0gY3R4OworCisJdmRlY19wYXJzZXJfcGFybXMoaW5zdCk7CisKKwkvKiBzZXQgcGxheSBtb2RlLiovCisJaWYgKGN0eC0+aXNfZHJtX21vZGUpCisJCWluc3QtPnZkZWMucG9ydC5mbGFnIHw9IFBPUlRfRkxBR19EUk07CisKKwkvKiB0byBlYWJsZSBoZXZjIGh3LiovCisJaW5zdC0+dmRlYy5wb3J0LnR5cGUgPSBQT1JUX1RZUEVfSEVWQzsKKworCS8qIHByb2JlIGluZm8gZnJvbSB0aGUgc3RyZWFtICovCisJaW5zdC0+dnNpID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZkZWNfaGV2Y192c2kpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluc3QtPnZzaSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBhbGxvYyB0aGUgaGVhZGVyIGJ1ZmZlciB0byBiZSB1c2VkIGNhY2hlIHNwcyBvciBzcHAgZXRjLiovCisJaW5zdC0+dnNpLT5oZWFkZXJfYnVmID0gdnphbGxvYyhIRUFERVJfQlVGRkVSX1NJWkUpOworCWlmICghaW5zdC0+dnNpLT5oZWFkZXJfYnVmKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCWluaXRfY29tcGxldGlvbigmaW5zdC0+Y29tcCk7CisKKwljdHgtPmFkYV9jdHgJPSAmaW5zdC0+dmRlYzsKKwkqaF92ZGVjCQk9ICh1bnNpZ25lZCBsb25nKWluc3Q7CisKKwlyZXQgPSB2aWRlb19kZWNvZGVyX2luaXQoJmluc3QtPnZkZWMpOworCWlmIChyZXQpIHsKKwkJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJ2ZGVjX2hldmMgaW5pdCBlcnI9JWRcbiIsIHJldCk7CisJCWdvdG8gZXJyOworCX0KKworCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfUFJJTkZPLAorCQkiaGV2YyBJbnN0YW5jZSA+PiAlbHhcbiIsICh1bG9uZykgaW5zdCk7CisKKwlyZXR1cm4gMDsKK2VycjoKKwlpZiAoaW5zdCAmJiBpbnN0LT52c2kgJiYgaW5zdC0+dnNpLT5oZWFkZXJfYnVmKQorCQl2ZnJlZShpbnN0LT52c2ktPmhlYWRlcl9idWYpOworCWlmIChpbnN0ICYmIGluc3QtPnZzaSkKKwkJa2ZyZWUoaW5zdC0+dnNpKTsKKwlpZiAoaW5zdCkKKwkJa2ZyZWUoaW5zdCk7CisJKmhfdmRlYyA9IDA7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgcmVmZXJfYnVmZmVyX251bShzdHJ1Y3QgaDI2NV9TUFNfdCAqc3BzKQoreworCWludCB1c2VkX2J1Zl9udW0gPSAwOworCWludCBzcHNfcGljX2J1Zl9kaWZmID0gMDsKKworCWlmICgoIXNwcy0+dGVtcG9yYWxfbGF5ZXJbMF0ubnVtX3Jlb3JkZXJfcGljcykgJiYKKwkJKHNwcy0+dGVtcG9yYWxfbGF5ZXJbMF0ubWF4X2RlY19waWNfYnVmZmVyaW5nKSkgeworCQkvKiB0aGUgcmFuZ2Ugb2Ygc3BzX251bV9yZW9yZGVyX3BpY3NfMCBpcyBpbgorCQlbMCwgc3BzX21heF9kZWNfcGljX2J1ZmZlcmluZ19taW51czFfMF0gKi8KKwkJdXNlZF9idWZfbnVtID0gc3BzLT50ZW1wb3JhbF9sYXllclswXS5tYXhfZGVjX3BpY19idWZmZXJpbmc7CisJfSBlbHNlCisJCXVzZWRfYnVmX251bSA9IHNwcy0+dGVtcG9yYWxfbGF5ZXJbMF0ubnVtX3Jlb3JkZXJfcGljczsKKworCXNwc19waWNfYnVmX2RpZmYgPSBzcHMtPnRlbXBvcmFsX2xheWVyWzBdLm1heF9kZWNfcGljX2J1ZmZlcmluZyAtCisJCXNwcy0+dGVtcG9yYWxfbGF5ZXJbMF0ubnVtX3Jlb3JkZXJfcGljcyAtIDE7CisKKwlpZiAoc3BzX3BpY19idWZfZGlmZiA+PSA0KQorCQl1c2VkX2J1Zl9udW0gKz0gMTsKKworCS8qbmVlZCBvbmUgbW9yZSBmb3IgbXVsdGkgaW5zdGFuY2UsIGFzCisJYXBwbHlfcmVmX3BpY19zZXQoKSBoYXMgbm8gY2hhbmNoIHRvIHJ1biB0bworCXRvIGNsZWFyIHJlZmVyZW5jZWQgZmxhZyBpbiBzb21lIGNhc2UgKi8KKwl1c2VkX2J1Zl9udW0rKzsKKworCS8qIGZvciBlb3MgYWRkIG1vcmUgYnVmZmVyIHRvIGZsdXNoLiovCisJdXNlZF9idWZfbnVtKys7CisKKwlyZXR1cm4gdXNlZF9idWZfbnVtOworfQorCitzdGF0aWMgaW50IHZkZWNfZ2V0X2R3X21vZGUoc3RydWN0IHZkZWNfaGV2Y19pbnN0ICppbnN0LCBpbnQgZHdfbW9kZSkKK3sKKwl1MzIgdmFsaWRfZHdfbW9kZSA9IGluc3QtPnBhcm1zLmNmZy5kb3VibGVfd3JpdGVfbW9kZTsKKwlpbnQgdyA9IGluc3QtPnZzaS0+cGljLmNvZGVkX3dpZHRoOworCWludCBoID0gaW5zdC0+dnNpLT5waWMuY29kZWRfaGVpZ2h0OworCXUzMiBkdyA9IDB4MTsgLyoxOjEqLworCisJc3dpdGNoICh2YWxpZF9kd19tb2RlKSB7CisJY2FzZSAweDEwMDoKKwkJaWYgKHcgPiAxOTIwICYmIGggPiAxMDg4KQorCQkJZHcgPSAweDQ7IC8qMToyKi8KKwkJYnJlYWs7CisJY2FzZSAweDIwMDoKKwkJaWYgKHcgPiAxOTIwICYmIGggPiAxMDg4KQorCQkJZHcgPSAweDI7IC8qMTo0Ki8KKwkJYnJlYWs7CisJY2FzZSAweDMwMDoKKwkJaWYgKHcgPiAxMjgwICYmIGggPiA3MjApCisJCQlkdyA9IDB4NDsgLyoxOjIqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkdyA9IHZhbGlkX2R3X21vZGU7CisJCWJyZWFrOworCX0KKworCXJldHVybiBkdzsKK30KKworc3RhdGljIGludCB2ZGVjX3BpY19zY2FsZShzdHJ1Y3QgdmRlY19oZXZjX2luc3QgKmluc3QsIGludCBsZW5ndGgsIGludCBkd19tb2RlKQoreworCWludCByZXQgPSA2NDsKKworCXN3aXRjaCAodmRlY19nZXRfZHdfbW9kZShpbnN0LCBkd19tb2RlKSkgeworCWNhc2UgMHgwOiAvKiBvbmx5IGFmYmMsIG91dHB1dCBhZmJjICovCisJCXJldCA9IDY0OworCQlicmVhazsKKwljYXNlIDB4MTogLyogYWZiYyBhbmQgKHcgeCBoKSwgb3V0cHV0IFlVVjQyMCAqLworCQlyZXQgPSBsZW5ndGg7CisJCWJyZWFrOworCWNhc2UgMHgyOiAvKiBhZmJjIGFuZCAody80IHggaC80KSwgb3V0cHV0IFlVVjQyMCAqLworCWNhc2UgMHgzOiAvKiBhZmJjIGFuZCAody80IHggaC80KSwgb3V0cHV0IGFmYmMgYW5kIFlVVjQyMCAqLworCQlyZXQgPSBsZW5ndGggPj4gMjsKKwkJYnJlYWs7CisJY2FzZSAweDQ6IC8qIGFmYmMgYW5kICh3LzIgeCBoLzIpLCBvdXRwdXQgWVVWNDIwICovCisJCXJldCA9IGxlbmd0aCA+PiAxOworCQlicmVhazsKKwljYXNlIDB4MTA6IC8qICh3IHggaCksIG91dHB1dCBZVVY0MjAtOGJpdCkqLworCWRlZmF1bHQ6CisJCXJldCA9IGxlbmd0aDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZmlsbF92ZGVjX3BhcmFtcyhzdHJ1Y3QgdmRlY19oZXZjX2luc3QgKmluc3QsIHN0cnVjdCBoMjY1X1NQU190ICpzcHMpCit7CisJc3RydWN0IHZkZWNfcGljX2luZm8gKnBpYyA9ICZpbnN0LT52c2ktPnBpYzsKKwlzdHJ1Y3QgdmRlY19oZXZjX2RlY19pbmZvICpkZWMgPSAmaW5zdC0+dnNpLT5kZWM7CisJc3RydWN0IHY0bDJfcmVjdCAqcmVjdCA9ICZpbnN0LT52c2ktPmNyb3A7CisJaW50IGR3ID0gaW5zdC0+cGFybXMuY2ZnLmRvdWJsZV93cml0ZV9tb2RlOworCWludCBtYXJnaW4gPSBpbnN0LT5wYXJtcy5jZmcucmVmX2J1Zl9tYXJnaW47CisKKwkvKiBmaWxsIHZpc2libGUgYXJlYSBzaXplIHRoYXQgYmUgdXNlZCBmb3IgRUdMLiAqLworCXBpYy0+dmlzaWJsZV93aWR0aCA9IHNwcy0+d2lkdGggLSAoc3BzLT5vdXRwdXRfd2luZG93LmxlZnRfb2Zmc2V0ICsKKwkJc3BzLT5vdXRwdXRfd2luZG93LnJpZ2h0X29mZnNldCk7CisJcGljLT52aXNpYmxlX2hlaWdodCA9IHNwcy0+aGVpZ2h0IC0gKHNwcy0+b3V0cHV0X3dpbmRvdy50b3Bfb2Zmc2V0ICsKKwkJc3BzLT5vdXRwdXRfd2luZG93LmJvdHRvbV9vZmZzZXQpOworCXBpYy0+dmlzaWJsZV93aWR0aCA9IHZkZWNfcGljX3NjYWxlKGluc3QsIHBpYy0+dmlzaWJsZV93aWR0aCwgZHcpOworCXBpYy0+dmlzaWJsZV9oZWlnaHQgPSB2ZGVjX3BpY19zY2FsZShpbnN0LCBwaWMtPnZpc2libGVfaGVpZ2h0LCBkdyk7CisKKwkvKiBjYWxjIHZpc2libGUgYXJlcy4gKi8KKwlyZWN0LT5sZWZ0CQk9IDA7CisJcmVjdC0+dG9wCQk9IDA7CisJcmVjdC0+d2lkdGgJCT0gcGljLT52aXNpYmxlX3dpZHRoOworCXJlY3QtPmhlaWdodAkJPSBwaWMtPnZpc2libGVfaGVpZ2h0OworCisJLyogY29uZmlnIGNhbnZhcyBzaXplIHRoYXQgYmUgdXNlZCBmb3IgZGVjb2Rlci4gKi8KKwlwaWMtPmNvZGVkX3dpZHRoCT0gdmRlY19waWNfc2NhbGUoaW5zdCwgQUxJR04oc3BzLT53aWR0aCwgMzIpLCBkdyk7CisJcGljLT5jb2RlZF9oZWlnaHQJPSB2ZGVjX3BpY19zY2FsZShpbnN0LCBBTElHTihzcHMtPmhlaWdodCwgMzIpLCBkdyk7CisKKwlwaWMtPnlfbGVuX3N6CQk9IHBpYy0+Y29kZWRfd2lkdGggKiBwaWMtPmNvZGVkX2hlaWdodDsKKwlwaWMtPmNfbGVuX3N6CQk9IHBpYy0+eV9sZW5fc3ogPj4gMTsKKworCS8qIGNhbGMgRFBCIHNpemUgKi8KKwlkZWMtPmRwYl9zegkJPSByZWZlcl9idWZmZXJfbnVtKHNwcykgKyBtYXJnaW47CisKKwlpbnN0LT5wYXJtcy5wcy52aXNpYmxlX3dpZHRoCT0gcGljLT52aXNpYmxlX3dpZHRoOworCWluc3QtPnBhcm1zLnBzLnZpc2libGVfaGVpZ2h0CT0gcGljLT52aXNpYmxlX2hlaWdodDsKKwlpbnN0LT5wYXJtcy5wcy5jb2RlZF93aWR0aAk9IHBpYy0+Y29kZWRfd2lkdGg7CisJaW5zdC0+cGFybXMucHMuY29kZWRfaGVpZ2h0CT0gcGljLT5jb2RlZF9oZWlnaHQ7CisJaW5zdC0+cGFybXMucHMuZHBiX3NpemUJCT0gZGVjLT5kcGJfc3o7CisJaW5zdC0+cGFybXMucGFybXNfc3RhdHVzCXw9IFY0TDJfQ09ORklHX1BBUk1fREVDT0RFX1BTSU5GTzsKKworCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfQlVGTUdSLAorCQkiVGhlIHN0cmVhbSBpbmZvcywgZHc6ICVkLCBjb2RlZDooJWQgeCAlZCksIHZpc2libGU6KCVkIHggJWQpLCBEUEI6ICVkLCBtYXJnaW46ICVkXG4iLAorCQlkdywgcGljLT5jb2RlZF93aWR0aCwgcGljLT5jb2RlZF9oZWlnaHQsCisJCXBpYy0+dmlzaWJsZV93aWR0aCwgcGljLT52aXNpYmxlX2hlaWdodCwKKwkJZGVjLT5kcGJfc3ogLSBtYXJnaW4sIG1hcmdpbik7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfc3RyZWFtX3Vjb2RlKHN0cnVjdCB2ZGVjX2hldmNfaW5zdCAqaW5zdCwKKwkJCSAgICAgIHU4ICpidWYsIHUzMiBzaXplLCB1NjQgdGltZXN0YW1wKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhbWxfdmRlY19hZGFwdCAqdmRlYyA9ICZpbnN0LT52ZGVjOworCisJcmV0ID0gdmRlY192ZnJhbWVfd3JpdGUodmRlYywgYnVmLCBzaXplLCB0aW1lc3RhbXAsIDApOworCWlmIChyZXQgPCAwKSB7CisJCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkid3JpdGUgZnJhbWUgZGF0YSBmYWlsZWQuIGVycjogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogd2FpdCB1Y29kZSBwYXJzZSBlbmRpbmcuICovCisJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpbnN0LT5jb21wLAorCQltc2Vjc190b19qaWZmaWVzKDEwMDApKTsKKworCXJldHVybiBpbnN0LT52c2ktPnBpYy5kcGJfZnJhbWVzID8gMCA6IC0xOworfQorCitzdGF0aWMgaW50IHBhcnNlX3N0cmVhbV91Y29kZV9kbWEoc3RydWN0IHZkZWNfaGV2Y19pbnN0ICppbnN0LAorCXVsb25nIGJ1ZiwgdTMyIHNpemUsIHU2NCB0aW1lc3RhbXAsIHUzMiBoYW5kbGUpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGFtbF92ZGVjX2FkYXB0ICp2ZGVjID0gJmluc3QtPnZkZWM7CisKKwlyZXQgPSB2ZGVjX3ZmcmFtZV93cml0ZV93aXRoX2RtYSh2ZGVjLCBidWYsIHNpemUsIHRpbWVzdGFtcCwgaGFuZGxlLAorCQl2ZGVjX3ZmcmFtZV9pbnB1dF9mcmVlLCBpbnN0LT5jdHgpOworCWlmIChyZXQgPCAwKSB7CisJCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkid3JpdGUgZnJhbWUgZGF0YSBmYWlsZWQuIGVycjogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogd2FpdCB1Y29kZSBwYXJzZSBlbmRpbmcuICovCisJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpbnN0LT5jb21wLAorCQltc2Vjc190b19qaWZmaWVzKDEwMDApKTsKKworCXJldHVybiBpbnN0LT52c2ktPnBpYy5kcGJfZnJhbWVzID8gMCA6IC0xOworfQorCitzdGF0aWMgaW50IHBhcnNlX3N0cmVhbV9jcHUoc3RydWN0IHZkZWNfaGV2Y19pbnN0ICppbnN0LCB1OCAqYnVmLCB1MzIgc2l6ZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgaDI2NV9wYXJhbV9zZXRzICpwcyA9IE5VTEw7CisKKwlwcyA9IHZ6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoMjY1X3BhcmFtX3NldHMpKTsKKwlpZiAocHMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBoMjY1X2RlY29kZV9leHRyYWRhdGFfcHMoYnVmLCBzaXplLCBwcyk7CisJaWYgKHJldCkgeworCQl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJInBhcnNlIGV4dHJhIGRhdGEgZmFpbGVkLiBlcnI6ICVkXG4iLCByZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocHMtPnNwc19wYXJzZWQpCisJCWZpbGxfdmRlY19wYXJhbXMoaW5zdCwgJnBzLT5zcHMpOworCisJcmV0ID0gcHMtPnNwc19wYXJzZWQgPyAwIDogLTE7CitvdXQ6CisJdmZyZWUocHMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2ZGVjX2hldmNfcHJvYmUodW5zaWduZWQgbG9uZyBoX3ZkZWMsCisJc3RydWN0IGFtbF92Y29kZWNfbWVtICpicywgdm9pZCAqb3V0KQoreworCXN0cnVjdCB2ZGVjX2hldmNfaW5zdCAqaW5zdCA9CisJCShzdHJ1Y3QgdmRlY19oZXZjX2luc3QgKiloX3ZkZWM7CisJdTggKmJ1ZiA9ICh1OCAqKWJzLT52YWRkcjsKKwl1MzIgc2l6ZSA9IGJzLT5zaXplOworCWludCByZXQgPSAwOworCisJaWYgKGluc3QtPmN0eC0+aXNfZHJtX21vZGUpIHsKKwkJaWYgKGJzLT5tb2RlbCA9PSBWQjJfTUVNT1JZX01NQVApIHsKKwkJCXN0cnVjdCBhbWxfdmlkZW9fc3RyZWFtICpzID0KKwkJCQkoc3RydWN0IGFtbF92aWRlb19zdHJlYW0gKikgYnVmOworCisJCQlpZiAoKHMtPm1hZ2ljICE9IEFNTF9WSURFT19NQUdJQykgJiYKKwkJCQkocy0+dHlwZSAhPSBWNExfU1RSRUFNX1RZUEVfTUFURURBVEEpKQorCQkJCXJldHVybiAtMTsKKworCQkJaWYgKGluc3QtPmN0eC0+cGFyYW1fc2V0c19mcm9tX3Vjb2RlKSB7CisJCQkJcmV0ID0gcGFyc2Vfc3RyZWFtX3Vjb2RlKGluc3QsIHMtPmRhdGEsCisJCQkJCXMtPmxlbiwgYnMtPnRpbWVzdGFtcCk7CisJCQl9IGVsc2UgeworCQkJCXJldCA9IHBhcnNlX3N0cmVhbV9jcHUoaW5zdCwgcy0+ZGF0YSwgcy0+bGVuKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChicy0+bW9kZWwgPT0gVkIyX01FTU9SWV9ETUFCVUYgfHwKKwkJCWJzLT5tb2RlbCA9PSBWQjJfTUVNT1JZX1VTRVJQVFIpIHsKKwkJCXJldCA9IHBhcnNlX3N0cmVhbV91Y29kZV9kbWEoaW5zdCwgYnMtPmFkZHIsIHNpemUsCisJCQkJYnMtPnRpbWVzdGFtcCwgQlVGRl9JRFgoYnMsIGJzLT5pbmRleCkpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGluc3QtPmN0eC0+cGFyYW1fc2V0c19mcm9tX3Vjb2RlKSB7CisJCQlyZXQgPSBwYXJzZV9zdHJlYW1fdWNvZGUoaW5zdCwgYnVmLCBzaXplLCBicy0+dGltZXN0YW1wKTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IHBhcnNlX3N0cmVhbV9jcHUoaW5zdCwgYnVmLCBzaXplKTsKKwkJfQorCX0KKworCWluc3QtPnZzaS0+Y3VyX3BpYyA9IGluc3QtPnZzaS0+cGljOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdmRlY19oZXZjX2RlaW5pdCh1bnNpZ25lZCBsb25nIGhfdmRlYykKK3sKKwlzdHJ1Y3QgdmRlY19oZXZjX2luc3QgKmluc3QgPSAoc3RydWN0IHZkZWNfaGV2Y19pbnN0ICopaF92ZGVjOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gaW5zdC0+Y3R4OworCisJdmlkZW9fZGVjb2Rlcl9yZWxlYXNlKCZpbnN0LT52ZGVjKTsKKworCWlmIChpbnN0LT52c2kgJiYgaW5zdC0+dnNpLT5oZWFkZXJfYnVmKQorCQl2ZnJlZShpbnN0LT52c2ktPmhlYWRlcl9idWYpOworCisJaWYgKGluc3QtPnZzaSkKKwkJa2ZyZWUoaW5zdC0+dnNpKTsKKworCWtmcmVlKGluc3QpOworCisJY3R4LT5kcnZfaGFuZGxlID0gMDsKK30KKworc3RhdGljIGludCB2ZGVjX3dyaXRlX25hbHUoc3RydWN0IHZkZWNfaGV2Y19pbnN0ICppbnN0LAorCXU4ICpidWYsIHUzMiBzaXplLCB1NjQgdHMpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGFtbF92ZGVjX2FkYXB0ICp2ZGVjID0gJmluc3QtPnZkZWM7CisKKwlyZXQgPSB2ZGVjX3ZmcmFtZV93cml0ZSh2ZGVjLCBidWYsIHNpemUsIHRzLCAwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBib29sIG1vbml0b3JfcmVzX2NoYW5nZShzdHJ1Y3QgdmRlY19oZXZjX2luc3QgKmluc3QsIHU4ICpidWYsIHUzMiBzaXplKQoreworCWludCByZXQgPSAwLCBpID0gMCwgaiA9IDA7CisJdTggKnAgPSBidWY7CisJaW50IGxlbiA9IHNpemU7CisJdTMyIHR5cGU7CisKKwlmb3IgKGkgPSA0OyBpIDwgc2l6ZTsgaSsrKSB7CisJCWogPSBmaW5kX3N0YXJ0X2NvZGUocCwgbGVuKTsKKwkJaWYgKGogPiAwKSB7CisJCQlsZW4gPSBzaXplIC0gKHAgLSBidWYpOworCQkJdHlwZSA9IEhFVkNfTkFMX1RZUEUocFtqXSk7CisJCQlpZiAodHlwZSAhPSBIRVZDX05BTF9BVUQgJiYKKwkJCQkodHlwZSA+IEhFVkNfTkFMX1BQUyB8fCB0eXBlIDwgSEVWQ19OQUxfVlBTKSkKKwkJCQlicmVhazsKKworCQkJaWYgKHR5cGUgPT0gSEVWQ19OQUxfU1BTKSB7CisJCQkJcmV0ID0gcGFyc2Vfc3RyZWFtX2NwdShpbnN0LCBwLCBsZW4pOworCQkJCWlmIChyZXQpCisJCQkJCWJyZWFrOworCQkJfQorCQkJcCArPSBqOworCQl9CisJCXArKzsKKwl9CisKKwlpZiAoIXJldCAmJiAoaW5zdC0+dnNpLT5jdXJfcGljLmNvZGVkX3dpZHRoICE9CisJCWluc3QtPnZzaS0+cGljLmNvZGVkX3dpZHRoIHx8CisJCWluc3QtPnZzaS0+Y3VyX3BpYy5jb2RlZF9oZWlnaHQgIT0KKwkJaW5zdC0+dnNpLT5waWMuY29kZWRfaGVpZ2h0KSkgeworCQlpbnN0LT52c2ktPmN1cl9waWMgPSBpbnN0LT52c2ktPnBpYzsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50IHZkZWNfaGV2Y19kZWNvZGUodW5zaWduZWQgbG9uZyBoX3ZkZWMsCisJCQkgICAgc3RydWN0IGFtbF92Y29kZWNfbWVtICpicywgYm9vbCAqcmVzX2NoZykKK3sKKwlzdHJ1Y3QgdmRlY19oZXZjX2luc3QgKmluc3QgPSAoc3RydWN0IHZkZWNfaGV2Y19pbnN0ICopaF92ZGVjOworCXN0cnVjdCBhbWxfdmRlY19hZGFwdCAqdmRlYyA9ICZpbnN0LT52ZGVjOworCXU4ICpidWYgPSAodTggKikgYnMtPnZhZGRyOworCXUzMiBzaXplID0gYnMtPnNpemU7CisJaW50IHJldCA9IC0xOworCisJaWYgKGJzID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmICh2ZGVjX2lucHV0X2Z1bGwodmRlYykpCisJCXJldHVybiAtRUFHQUlOOworCisJaWYgKGluc3QtPmN0eC0+aXNfZHJtX21vZGUpIHsKKwkJaWYgKGJzLT5tb2RlbCA9PSBWQjJfTUVNT1JZX01NQVApIHsKKwkJCXN0cnVjdCBhbWxfdmlkZW9fc3RyZWFtICpzID0KKwkJCQkoc3RydWN0IGFtbF92aWRlb19zdHJlYW0gKikgYnVmOworCisJCQlpZiAocy0+bWFnaWMgIT0gQU1MX1ZJREVPX01BR0lDKQorCQkJCXJldHVybiAtMTsKKworCQkJaWYgKCFpbnN0LT5jdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSAmJgorCQkJCShzLT50eXBlID09IFY0TF9TVFJFQU1fVFlQRV9NQVRFREFUQSkpIHsKKwkJCQlpZiAoKCpyZXNfY2hnID0gbW9uaXRvcl9yZXNfY2hhbmdlKGluc3QsCisJCQkJCXMtPmRhdGEsIHMtPmxlbikpKQorCQkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJcmV0ID0gdmRlY192ZnJhbWVfd3JpdGUodmRlYywKKwkJCQlzLT5kYXRhLAorCQkJCXMtPmxlbiwKKwkJCQlicy0+dGltZXN0YW1wLAorCQkJCTApOworCQl9IGVsc2UgaWYgKGJzLT5tb2RlbCA9PSBWQjJfTUVNT1JZX0RNQUJVRiB8fAorCQkJYnMtPm1vZGVsID09IFZCMl9NRU1PUllfVVNFUlBUUikgeworCQkJcmV0ID0gdmRlY192ZnJhbWVfd3JpdGVfd2l0aF9kbWEodmRlYywKKwkJCQlicy0+YWRkciwgc2l6ZSwgYnMtPnRpbWVzdGFtcCwKKwkJCQlCVUZGX0lEWChicywgYnMtPmluZGV4KSwKKwkJCQl2ZGVjX3ZmcmFtZV9pbnB1dF9mcmVlLCBpbnN0LT5jdHgpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCFpbnN0LT5jdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSkgeworCQkJLypjaGVja2VkIHdoZXRoZXIgdGhlIHJlc29sdXRpb24gY2hhbmdlcy4qLworCQkJaWYgKCgqcmVzX2NoZyA9IG1vbml0b3JfcmVzX2NoYW5nZShpbnN0LCBidWYsIHNpemUpKSkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXQgPSB2ZGVjX3dyaXRlX25hbHUoaW5zdCwgYnVmLCBzaXplLCBicy0+dGltZXN0YW1wKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisgc3RhdGljIHZvaWQgZ2V0X3BhcmFtX2NvbmZpZ19pbmZvKHN0cnVjdCB2ZGVjX2hldmNfaW5zdCAqaW5zdCwKKwlzdHJ1Y3QgYW1sX2RlY19wYXJhbXMgKnBhcm1zKQorIHsKKwkgaWYgKGluc3QtPnBhcm1zLnBhcm1zX3N0YXR1cyAmIFY0TDJfQ09ORklHX1BBUk1fREVDT0RFX0NGR0lORk8pCisJCSBwYXJtcy0+Y2ZnID0gaW5zdC0+cGFybXMuY2ZnOworCSBpZiAoaW5zdC0+cGFybXMucGFybXNfc3RhdHVzICYgVjRMMl9DT05GSUdfUEFSTV9ERUNPREVfUFNJTkZPKQorCQkgcGFybXMtPnBzID0gaW5zdC0+cGFybXMucHM7CisJIGlmIChpbnN0LT5wYXJtcy5wYXJtc19zdGF0dXMgJiBWNEwyX0NPTkZJR19QQVJNX0RFQ09ERV9IRFJJTkZPKQorCQkgcGFybXMtPmhkciA9IGluc3QtPnBhcm1zLmhkcjsKKwkgaWYgKGluc3QtPnBhcm1zLnBhcm1zX3N0YXR1cyAmIFY0TDJfQ09ORklHX1BBUk1fREVDT0RFX0NOVElORk8pCisJCSBwYXJtcy0+Y250ID0gaW5zdC0+cGFybXMuY250OworCisJIHBhcm1zLT5wYXJtc19zdGF0dXMgfD0gaW5zdC0+cGFybXMucGFybXNfc3RhdHVzOworCisJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19QUklORk8sCisJCSJwYXJtcyBzdGF0dXM6ICV1XG4iLCBwYXJtcy0+cGFybXNfc3RhdHVzKTsKKyB9CisKK3N0YXRpYyB2b2lkIGdldF9wYXJhbV9jb21wX2J1Zl9pbmZvKHN0cnVjdCB2ZGVjX2hldmNfaW5zdCAqaW5zdCwKKwkJc3RydWN0IHZkZWNfY29tcF9idWZfaW5mbyAqcGFyYW1zKQoreworCW1lbWNweShwYXJhbXMsICZpbnN0LT5jb21wX2luZm8sIHNpemVvZigqcGFyYW1zKSk7Cit9CisKK3N0YXRpYyBpbnQgdmRlY19oZXZjX2dldF9wYXJhbSh1bnNpZ25lZCBsb25nIGhfdmRlYywKKwkJCSAgICAgICBlbnVtIHZkZWNfZ2V0X3BhcmFtX3R5cGUgdHlwZSwgdm9pZCAqb3V0KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCB2ZGVjX2hldmNfaW5zdCAqaW5zdCA9IChzdHJ1Y3QgdmRlY19oZXZjX2luc3QgKiloX3ZkZWM7CisKKwlpZiAoIWluc3QpIHsKKwkJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJ0aGUgaGV2YyBpbnN0IG9mIGRlYyBpcyBpbnZhbGlkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEdFVF9QQVJBTV9QSUNfSU5GTzoKKwkJZ2V0X3BpY19pbmZvKGluc3QsIG91dCk7CisJCWJyZWFrOworCisJY2FzZSBHRVRfUEFSQU1fRFBCX1NJWkU6CisJCWdldF9kcGJfc2l6ZShpbnN0LCBvdXQpOworCQlicmVhazsKKworCWNhc2UgR0VUX1BBUkFNX0NST1BfSU5GTzoKKwkJZ2V0X2Nyb3BfaW5mbyhpbnN0LCBvdXQpOworCQlicmVhazsKKworCWNhc2UgR0VUX1BBUkFNX0NPTkZJR19JTkZPOgorCQlnZXRfcGFyYW1fY29uZmlnX2luZm8oaW5zdCwgb3V0KTsKKwkJYnJlYWs7CisKKwljYXNlIEdFVF9QQVJBTV9EV19NT0RFOgorCXsKKwkJdTMyICptb2RlID0gb3V0OworCQl1MzIgbSA9IGluc3QtPmN0eC0+Y29uZmlnLnBhcm0uZGVjLmNmZy5kb3VibGVfd3JpdGVfbW9kZTsKKwkJaWYgKG0gPD0gMTYpCisJCQkqbW9kZSA9IGluc3QtPmN0eC0+Y29uZmlnLnBhcm0uZGVjLmNmZy5kb3VibGVfd3JpdGVfbW9kZTsKKwkJZWxzZQorCQkJKm1vZGUgPSB2ZGVjX2dldF9kd19tb2RlKGluc3QsIDApOworCQlicmVhazsKKwl9CisJY2FzZSBHRVRfUEFSQU1fQ09NUF9CVUZfSU5GTzoKKwkJZ2V0X3BhcmFtX2NvbXBfYnVmX2luZm8oaW5zdCwgb3V0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJImludmFsaWQgZ2V0IHBhcmFtZXRlciB0eXBlPSVkXG4iLCB0eXBlKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzZXRfcGFyYW1fd3JpdGVfc3luYyhzdHJ1Y3QgdmRlY19oZXZjX2luc3QgKmluc3QpCit7CisJY29tcGxldGUoJmluc3QtPmNvbXApOworfQorCitzdGF0aWMgdm9pZCBzZXRfcGFyYW1fcHNfaW5mbyhzdHJ1Y3QgdmRlY19oZXZjX2luc3QgKmluc3QsCisJc3RydWN0IGFtbF92ZGVjX3BzX2luZm9zICpwcykKK3sKKwlzdHJ1Y3QgdmRlY19waWNfaW5mbyAqcGljID0gJmluc3QtPnZzaS0+cGljOworCXN0cnVjdCB2ZGVjX2hldmNfZGVjX2luZm8gKmRlYyA9ICZpbnN0LT52c2ktPmRlYzsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0ID0gJmluc3QtPnZzaS0+Y3JvcDsKKwlpbnQgZHcgPSBpbnN0LT5wYXJtcy5jZmcuZG91YmxlX3dyaXRlX21vZGU7CisKKwkvKiBmaWxsIHZpc2libGUgYXJlYSBzaXplIHRoYXQgYmUgdXNlZCBmb3IgRUdMLiAqLworCXBpYy0+dmlzaWJsZV93aWR0aAk9IHBzLT52aXNpYmxlX3dpZHRoOworCXBpYy0+dmlzaWJsZV9oZWlnaHQJPSBwcy0+dmlzaWJsZV9oZWlnaHQ7CisKKwkvKiBjYWxjIHZpc2libGUgYXJlcy4gKi8KKwlyZWN0LT5sZWZ0CQk9IDA7CisJcmVjdC0+dG9wCQk9IDA7CisJcmVjdC0+d2lkdGgJCT0gcGljLT52aXNpYmxlX3dpZHRoOworCXJlY3QtPmhlaWdodAkJPSBwaWMtPnZpc2libGVfaGVpZ2h0OworCisJLyogY29uZmlnIGNhbnZhcyBzaXplIHRoYXQgYmUgdXNlZCBmb3IgZGVjb2Rlci4gKi8KKworCXBpYy0+Y29kZWRfd2lkdGggCT0gcHMtPmNvZGVkX3dpZHRoOworCXBpYy0+Y29kZWRfaGVpZ2h0IAk9IHBzLT5jb2RlZF9oZWlnaHQ7CisKKwlwaWMtPnlfbGVuX3N6CQk9IEFMSUdOKHZkZWNfcGljX3NjYWxlKGluc3QsIHBpYy0+Y29kZWRfd2lkdGgsIGR3KSwgNjQpICoKKwkJCQkgIEFMSUdOKHZkZWNfcGljX3NjYWxlKGluc3QsIHBpYy0+Y29kZWRfaGVpZ2h0LCBkdyksIDY0KTsKKwlwaWMtPmNfbGVuX3N6CQk9IHBpYy0+eV9sZW5fc3ogPj4gMTsKKworCXBpYy0+ZHBiX2ZyYW1lcwkJPSBwcy0+ZHBiX2ZyYW1lczsKKwlwaWMtPmRwYl9tYXJnaW4JCT0gcHMtPmRwYl9tYXJnaW47CisJcGljLT52cHBfbWFyZ2luCQk9IHBzLT5kcGJfbWFyZ2luOworCWRlYy0+ZHBiX3N6CQk9IHBzLT5kcGJfc2l6ZTsKKwlwaWMtPmZpZWxkCQk9IHBzLT5maWVsZDsKKworCWluc3QtPnBhcm1zLnBzCQk9ICpwczsKKwlpbnN0LT5wYXJtcy5wYXJtc19zdGF0dXMgfD0KKwkJVjRMMl9DT05GSUdfUEFSTV9ERUNPREVfUFNJTkZPOworCisJLyp3YWtlIHVwKi8KKwljb21wbGV0ZSgmaW5zdC0+Y29tcCk7CisKKwl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX1BSSU5GTywKKwkJIlBhcnNlIGZyb20gdWNvZGUsIHZpc2libGUoJWQgeCAlZCksIGNvZGVkKCVkIHggJWQpLCBzY2FuOiVzXG4iLAorCQlwaWMtPnZpc2libGVfd2lkdGgsIHBpYy0+dmlzaWJsZV9oZWlnaHQsCisJCXBpYy0+Y29kZWRfd2lkdGgsIHBpYy0+Y29kZWRfaGVpZ2h0LAorCQlwaWMtPmZpZWxkID09IFY0TDJfRklFTERfTk9ORSA/ICJQIiA6ICJJIik7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9jZmdfaW5mbyhzdHJ1Y3QgdmRlY19oZXZjX2luc3QgKmluc3QsCisJc3RydWN0IGFtbF92ZGVjX2NmZ19pbmZvcyAqY2ZnKQoreworCW1lbWNweSgmaW5zdC0+Y3R4LT5jb25maWcucGFybS5kZWMuY2ZnLAorCQljZmcsIHNpemVvZihzdHJ1Y3QgYW1sX3ZkZWNfY2ZnX2luZm9zKSk7CisJbWVtY3B5KCZpbnN0LT5wYXJtcy5jZmcsCisJCWNmZywgc2l6ZW9mKHN0cnVjdCBhbWxfdmRlY19jZmdfaW5mb3MpKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3BhcmFtX2NvbXBfYnVmX2luZm8oc3RydWN0IHZkZWNfaGV2Y19pbnN0ICppbnN0LAorCQlzdHJ1Y3QgdmRlY19jb21wX2J1Zl9pbmZvICppbmZvKQoreworCW1lbWNweSgmaW5zdC0+Y29tcF9pbmZvLCBpbmZvLCBzaXplb2YoKmluZm8pKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3BhcmFtX2hkcl9pbmZvKHN0cnVjdCB2ZGVjX2hldmNfaW5zdCAqaW5zdCwKKwlzdHJ1Y3QgYW1sX3ZkZWNfaGRyX2luZm9zICpoZHIpCit7CisJaWYgKCEoaW5zdC0+cGFybXMucGFybXNfc3RhdHVzICYKKwkJVjRMMl9DT05GSUdfUEFSTV9ERUNPREVfSERSSU5GTykpIHsKKwkJaW5zdC0+cGFybXMuaGRyID0gKmhkcjsKKwkJaW5zdC0+cGFybXMucGFybXNfc3RhdHVzIHw9CisJCQlWNEwyX0NPTkZJR19QQVJNX0RFQ09ERV9IRFJJTkZPOworCQlhbWxfdmRlY19kaXNwYXRjaF9ldmVudChpbnN0LT5jdHgsCisJCQlWNEwyX0VWRU5UX1NSQ19DSF9IRFJJTkZPKTsKKwkJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19QUklORk8sCisJCQkiSDI2NSBzZXQgSERSIGluZm9zXG4iKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNldF9wYXJhbV9wb3N0X2V2ZW50KHN0cnVjdCB2ZGVjX2hldmNfaW5zdCAqaW5zdCwgdTMyICpldmVudCkKK3sKKwlhbWxfdmRlY19kaXNwYXRjaF9ldmVudChpbnN0LT5jdHgsICpldmVudCk7CisJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19QUklORk8sCisJCSJIMjY1IHBvc3QgZXZlbnQ6ICVkXG4iLCAqZXZlbnQpOworfQorCitzdGF0aWMgdm9pZCBzZXRfcGljX2luZm8oc3RydWN0IHZkZWNfaGV2Y19pbnN0ICppbnN0LAorCXN0cnVjdCB2ZGVjX3BpY19pbmZvICpwaWMpCit7CisJaW5zdC0+dnNpLT5waWMgPSAqcGljOworfQorCitzdGF0aWMgaW50IHZkZWNfaGV2Y19zZXRfcGFyYW0odW5zaWduZWQgbG9uZyBoX3ZkZWMsCisJZW51bSB2ZGVjX3NldF9wYXJhbV90eXBlIHR5cGUsIHZvaWQgKmluKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCB2ZGVjX2hldmNfaW5zdCAqaW5zdCA9IChzdHJ1Y3QgdmRlY19oZXZjX2luc3QgKiloX3ZkZWM7CisKKwlpZiAoIWluc3QpIHsKKwkJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJ0aGUgaGV2YyBpbnN0IG9mIGRlYyBpcyBpbnZhbGlkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNFVF9QQVJBTV9XUklURV9GUkFNRV9TWU5DOgorCQlzZXRfcGFyYW1fd3JpdGVfc3luYyhpbnN0KTsKKwkJYnJlYWs7CisKKwljYXNlIFNFVF9QQVJBTV9DRkdfSU5GTzoKKwkJc2V0X2NmZ19pbmZvKGluc3QsIGluKTsKKwkJYnJlYWs7CisKKwljYXNlIFNFVF9QQVJBTV9QU19JTkZPOgorCQlzZXRfcGFyYW1fcHNfaW5mbyhpbnN0LCBpbik7CisJCWJyZWFrOworCisJY2FzZSBTRVRfUEFSQU1fQ09NUF9CVUZfSU5GTzoKKwkJc2V0X3BhcmFtX2NvbXBfYnVmX2luZm8oaW5zdCwgaW4pOworCQlicmVhazsKKworCWNhc2UgU0VUX1BBUkFNX0hEUl9JTkZPOgorCQlzZXRfcGFyYW1faGRyX2luZm8oaW5zdCwgaW4pOworCQlicmVhazsKKworCWNhc2UgU0VUX1BBUkFNX1BPU1RfRVZFTlQ6CisJCXNldF9wYXJhbV9wb3N0X2V2ZW50KGluc3QsIGluKTsKKwkJYnJlYWs7CisKKwljYXNlIFNFVF9QQVJBTV9QSUNfSU5GTzoKKwkJc2V0X3BpY19pbmZvKGluc3QsIGluKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJpbnZhbGlkIHNldCBwYXJhbWV0ZXIgdHlwZT0lZFxuIiwgdHlwZSk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCB2ZGVjX2NvbW1vbl9pZiB2ZGVjX2hldmNfaWYgPSB7CisJLmluaXQJCT0gdmRlY19oZXZjX2luaXQsCisJLnByb2JlCQk9IHZkZWNfaGV2Y19wcm9iZSwKKwkuZGVjb2RlCQk9IHZkZWNfaGV2Y19kZWNvZGUsCisJLmdldF9wYXJhbQk9IHZkZWNfaGV2Y19nZXRfcGFyYW0sCisJLnNldF9wYXJhbQk9IHZkZWNfaGV2Y19zZXRfcGFyYW0sCisJLmRlaW5pdAkJPSB2ZGVjX2hldmNfZGVpbml0LAorfTsKKworc3RydWN0IHZkZWNfY29tbW9uX2lmICpnZXRfaGV2Y19kZWNfY29tbV9pZih2b2lkKTsKKworc3RydWN0IHZkZWNfY29tbW9uX2lmICpnZXRfaGV2Y19kZWNfY29tbV9pZih2b2lkKQoreworCXJldHVybiAmdmRlY19oZXZjX2lmOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbXZkZWNfcG9ydHMvZGVjb2Rlci92ZGVjX21qcGVnX2lmLmMgYi9kcml2ZXJzL2FtdmRlY19wb3J0cy9kZWNvZGVyL3ZkZWNfbWpwZWdfaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzMyOTU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvZGVjb2Rlci92ZGVjX21qcGVnX2lmLmMKQEAgLTAsMCArMSw2MjAgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNyBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisqIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyoKKyogRGVzY3JpcHRpb246CisqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9zd2FiLmg+CisjaW5jbHVkZSAiLi4vdmRlY19kcnZfaWYuaCIKKyNpbmNsdWRlICIuLi9hbWxfdmNvZGVjX3V0aWwuaCIKKyNpbmNsdWRlICIuLi9hbWxfdmNvZGVjX2RlYy5oIgorI2luY2x1ZGUgIi4uL2FtbF92Y29kZWNfYWRhcHQuaCIKKyNpbmNsdWRlICIuLi92ZGVjX2Rydl9iYXNlLmgiCisjaW5jbHVkZSAiYW1sX21qcGVnX3BhcnNlci5oIgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItbWVtMm1lbS5oPgorCisjZGVmaW5lIE5BTF9UWVBFKHZhbHVlKQkJCQkoKHZhbHVlKSAmIDB4MUYpCisjZGVmaW5lIEhFQURFUl9CVUZGRVJfU0laRQkJCSgzMiAqIDEwMjQpCisKKy8qKgorICogc3RydWN0IG1qcGVnX2ZiIC0gbWpwZWcgZGVjb2RlIGZyYW1lIGJ1ZmZlciBpbmZvcm1hdGlvbgorICogQHZkZWNfZmJfdmEgIDogdmlydHVhbCBhZGRyZXNzIG9mIHN0cnVjdCB2ZGVjX2ZiCisgKiBAeV9mYl9kbWEgICAgOiBkbWEgYWRkcmVzcyBvZiBZIGZyYW1lIGJ1ZmZlciAobHVtYSkKKyAqIEBjX2ZiX2RtYSAgICA6IGRtYSBhZGRyZXNzIG9mIEMgZnJhbWUgYnVmZmVyIChjaHJvbWEpCisgKiBAcG9jICAgICAgICAgOiBwaWN0dXJlIG9yZGVyIGNvdW50IG9mIGZyYW1lIGJ1ZmZlcgorICogQHJlc2VydmVkICAgIDogZm9yIDggYnl0ZXMgYWxpZ25tZW50CisgKi8KK3N0cnVjdCBtanBlZ19mYiB7CisJdWludDY0X3QgdmRlY19mYl92YTsKKwl1aW50NjRfdCB5X2ZiX2RtYTsKKwl1aW50NjRfdCBjX2ZiX2RtYTsKKwlpbnQzMl90IHBvYzsKKwl1aW50MzJfdCByZXNlcnZlZDsKK307CisKKy8qKgorICogc3RydWN0IHZkZWNfbWpwZWdfZGVjX2luZm8gLSBkZWNvZGUgaW5mb3JtYXRpb24KKyAqIEBkcGJfc3oJCTogZGVjb2RpbmcgcGljdHVyZSBidWZmZXIgc2l6ZQorICogQHJlc29sdXRpb25fY2hhbmdlZCAgOiByZXNvbHRpb24gY2hhbmdlIGhhcHBlbgorICogQHJlc2VydmVkCQk6IGZvciA4IGJ5dGVzIGFsaWdubWVudAorICogQGJzX2RtYQkJOiBJbnB1dCBiaXQtc3RyZWFtIGJ1ZmZlciBkbWEgYWRkcmVzcworICogQHlfZmJfZG1hCQk6IFkgZnJhbWUgYnVmZmVyIGRtYSBhZGRyZXNzCisgKiBAY19mYl9kbWEJCTogQyBmcmFtZSBidWZmZXIgZG1hIGFkZHJlc3MKKyAqIEB2ZGVjX2ZiX3ZhCQk6IFZERUMgZnJhbWUgYnVmZmVyIHN0cnVjdCB2aXJ0dWFsIGFkZHJlc3MKKyAqLworc3RydWN0IHZkZWNfbWpwZWdfZGVjX2luZm8geworCXVpbnQzMl90IGRwYl9zejsKKwl1aW50MzJfdCByZXNvbHV0aW9uX2NoYW5nZWQ7CisJdWludDMyX3QgcmVzZXJ2ZWQ7CisJdWludDY0X3QgYnNfZG1hOworCXVpbnQ2NF90IHlfZmJfZG1hOworCXVpbnQ2NF90IGNfZmJfZG1hOworCXVpbnQ2NF90IHZkZWNfZmJfdmE7Cit9OworCisvKioKKyAqIHN0cnVjdCB2ZGVjX21qcGVnX3ZzaSAtIHNoYXJlZCBtZW1vcnkgZm9yIGRlY29kZSBpbmZvcm1hdGlvbiBleGNoYW5nZQorICogICAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIFZQVSBhbmQgSG9zdC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1lbW9yeSBpcyBhbGxvY2F0ZWQgYnkgVlBVIHRoZW4gbWFwcGluZyB0byBIb3N0CisgKiAgICAgICAgICAgICAgICAgICAgICAgIGluIHZwdV9kZWNfaW5pdCgpIGFuZCBmcmVlZCBpbiB2cHVfZGVjX2RlaW5pdCgpCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGJ5IFZQVS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgQVAtVy9SIDogQVAgaXMgd3JpdGVyL3JlYWRlciBvbiB0aGlzIGl0ZW0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgVlBVLVcvUjogVlBVIGlzIHdyaXRlL3JlYWRlciBvbiB0aGlzIGl0ZW0KKyAqIEBoZHJfYnVmICAgICAgOiBIZWFkZXIgcGFyc2luZyBidWZmZXIgKEFQLVcsIFZQVS1SKQorICogQGxpc3RfZnJlZSAgICA6IGZyZWUgZnJhbWUgYnVmZmVyIHJpbmcgbGlzdCAoQVAtVy9SLCBWUFUtVykKKyAqIEBsaXN0X2Rpc3AgICAgOiBkaXNwbGF5IGZyYW1lIGJ1ZmZlciByaW5nIGxpc3QgKEFQLVIsIFZQVS1XKQorICogQGRlYyAgICAgICAgICA6IGRlY29kZSBpbmZvcm1hdGlvbiAoQVAtUiwgVlBVLVcpCisgKiBAcGljICAgICAgICAgIDogcGljdHVyZSBpbmZvcm1hdGlvbiAoQVAtUiwgVlBVLVcpCisgKiBAY3JvcCAgICAgICAgIDogY3JvcCBpbmZvcm1hdGlvbiAoQVAtUiwgVlBVLVcpCisgKi8KK3N0cnVjdCB2ZGVjX21qcGVnX3ZzaSB7CisJY2hhciAqaGVhZGVyX2J1ZjsKKwlpbnQgc3BzX3NpemU7CisJaW50IHBwc19zaXplOworCWludCBzZWlfc2l6ZTsKKwlpbnQgaGVhZF9vZmZzZXQ7CisJc3RydWN0IHZkZWNfbWpwZWdfZGVjX2luZm8gZGVjOworCXN0cnVjdCB2ZGVjX3BpY19pbmZvIHBpYzsKKwlzdHJ1Y3QgdmRlY19waWNfaW5mbyBjdXJfcGljOworCXN0cnVjdCB2NGwyX3JlY3QgY3JvcDsKKwlib29sIGlzX2NvbWJpbmU7CisJaW50IG5hbHVfcG9zOworCS8vc3RydWN0IG1qcGVnX3BhcmFtX3NldHMgcHM7Cit9OworCisvKioKKyAqIHN0cnVjdCB2ZGVjX21qcGVnX2luc3QgLSBtanBlZyBkZWNvZGVyIGluc3RhbmNlCisgKiBAbnVtX25hbHUgOiBob3cgbWFueSBuYWx1cyBiZSBkZWNvZGVkCisgKiBAY3R4ICAgICAgOiBwb2ludCB0byBhbWxfdmNvZGVjX2N0eAorICogQHZzaSAgICAgIDogVlBVIHNoYXJlZCBpbmZvcm1hdGlvbgorICovCitzdHJ1Y3QgdmRlY19tanBlZ19pbnN0IHsKKwl1bnNpZ25lZCBpbnQgbnVtX25hbHU7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHg7CisJc3RydWN0IGFtbF92ZGVjX2FkYXB0IHZkZWM7CisJc3RydWN0IHZkZWNfbWpwZWdfdnNpICp2c2k7CisJc3RydWN0IGFtbF9kZWNfcGFyYW1zIHBhcm1zOworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXA7Cit9OworCitzdGF0aWMgdm9pZCBnZXRfcGljX2luZm8oc3RydWN0IHZkZWNfbWpwZWdfaW5zdCAqaW5zdCwKKwkJCSBzdHJ1Y3QgdmRlY19waWNfaW5mbyAqcGljKQoreworCSpwaWMgPSBpbnN0LT52c2ktPnBpYzsKKworCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVhJTkZPLAorCQkicGljKCVkLCAlZCksIGJ1ZiglZCwgJWQpXG4iLAorCQkgcGljLT52aXNpYmxlX3dpZHRoLCBwaWMtPnZpc2libGVfaGVpZ2h0LAorCQkgcGljLT5jb2RlZF93aWR0aCwgcGljLT5jb2RlZF9oZWlnaHQpOworCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVhJTkZPLAorCQkiWSglZCwgJWQpLCBDKCVkLCAlZClcbiIsCisJCXBpYy0+eV9ic19zeiwgcGljLT55X2xlbl9zeiwKKwkJcGljLT5jX2JzX3N6LCBwaWMtPmNfbGVuX3N6KTsKK30KKworc3RhdGljIHZvaWQgZ2V0X2Nyb3BfaW5mbyhzdHJ1Y3QgdmRlY19tanBlZ19pbnN0ICppbnN0LCBzdHJ1Y3QgdjRsMl9yZWN0ICpjcikKK3sKKwljci0+bGVmdCA9IGluc3QtPnZzaS0+Y3JvcC5sZWZ0OworCWNyLT50b3AgPSBpbnN0LT52c2ktPmNyb3AudG9wOworCWNyLT53aWR0aCA9IGluc3QtPnZzaS0+Y3JvcC53aWR0aDsKKwljci0+aGVpZ2h0ID0gaW5zdC0+dnNpLT5jcm9wLmhlaWdodDsKKworCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVhJTkZPLAorCQkibD0lZCwgdD0lZCwgdz0lZCwgaD0lZFxuIiwKKwkJIGNyLT5sZWZ0LCBjci0+dG9wLCBjci0+d2lkdGgsIGNyLT5oZWlnaHQpOworfQorCitzdGF0aWMgdm9pZCBnZXRfZHBiX3NpemUoc3RydWN0IHZkZWNfbWpwZWdfaW5zdCAqaW5zdCwgdW5zaWduZWQgaW50ICpkcGJfc3opCit7CisJKmRwYl9zeiA9IGluc3QtPnZzaS0+ZGVjLmRwYl9zejsKKwl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywKKwkJInN6PSVkXG4iLCAqZHBiX3N6KTsKK30KKworc3RhdGljIHUzMiB2ZGVjX2NvbmZpZ19kZWZhdWx0X3Bhcm1zKHU4ICpwYXJtKQoreworCXU4ICpwYnVmID0gcGFybTsKKworCXBidWYgKz0gc3ByaW50ZihwYnVmLCAicGFybV92NGxfY29kZWNfZW5hYmxlOjE7Iik7CisJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJwYXJtX3Y0bF9jYW52YXNfbWVtX21vZGU6MDsiKTsKKwlwYnVmICs9IHNwcmludGYocGJ1ZiwgInBhcm1fdjRsX2J1ZmZlcl9tYXJnaW46MDsiKTsKKwlwYnVmICs9IHNwcmludGYocGJ1ZiwgInBhcm1fdjRsX2NhbnZhc19tZW1fZW5kaWFuOjA7Iik7CisKKwlyZXR1cm4gcGJ1ZiAtIHBhcm07Cit9CisKK3N0YXRpYyB2b2lkIHZkZWNfcGFyc2VyX3Bhcm1zKHN0cnVjdCB2ZGVjX21qcGVnX2luc3QgKmluc3QpCit7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPSBpbnN0LT5jdHg7CisKKwlpZiAoY3R4LT5jb25maWcucGFybS5kZWMucGFybXNfc3RhdHVzICYKKwkJVjRMMl9DT05GSUdfUEFSTV9ERUNPREVfQ0ZHSU5GTykgeworCQl1OCAqcGJ1ZiA9IGN0eC0+Y29uZmlnLmJ1ZjsKKworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgInBhcm1fdjRsX2NvZGVjX2VuYWJsZToxOyIpOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgInBhcm1fdjRsX2NhbnZhc19tZW1fbW9kZTolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuY2ZnLmNhbnZhc19tZW1fbW9kZSk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAicGFybV92NGxfYnVmZmVyX21hcmdpbjolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuY2ZnLnJlZl9idWZfbWFyZ2luKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJwYXJtX3Y0bF9jYW52YXNfbWVtX2VuZGlhbjolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuY2ZnLmNhbnZhc19tZW1fZW5kaWFuKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJwYXJtX3Y0bF9kdXJhdGlvbjolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuY2ZnLmR1cmF0aW9uKTsKKwkJY3R4LT5jb25maWcubGVuZ3RoID0gcGJ1ZiAtIGN0eC0+Y29uZmlnLmJ1ZjsKKwl9IGVsc2UgeworCQljdHgtPmNvbmZpZy5sZW5ndGggPSB2ZGVjX2NvbmZpZ19kZWZhdWx0X3Bhcm1zKGN0eC0+Y29uZmlnLmJ1Zik7CisJfQorCisJaW5zdC0+dmRlYy5jb25maWcJPSBjdHgtPmNvbmZpZzsKKwlpbnN0LT5wYXJtcy5jZmcJCT0gY3R4LT5jb25maWcucGFybS5kZWMuY2ZnOworCWluc3QtPnBhcm1zLnBhcm1zX3N0YXR1cyB8PSBWNEwyX0NPTkZJR19QQVJNX0RFQ09ERV9DRkdJTkZPOworfQorCisKK3N0YXRpYyBpbnQgdmRlY19tanBlZ19pbml0KHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4LCB1bnNpZ25lZCBsb25nICpoX3ZkZWMpCit7CisJc3RydWN0IHZkZWNfbWpwZWdfaW5zdCAqaW5zdCA9IE5VTEw7CisJaW50IHJldCA9IC0xOworCisJaW5zdCA9IGt6YWxsb2Moc2l6ZW9mKCppbnN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbnN0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWluc3QtPnZkZWMuZnJtX25hbWUJPSAiTUpQRUciOworCWluc3QtPnZkZWMudmlkZW9fdHlwZQk9IFZGT1JNQVRfTUpQRUc7CisJaW5zdC0+dmRlYy5maWxwCQk9IGN0eC0+ZGV2LT5maWxwOworCWluc3QtPnZkZWMuY29uZmlnCT0gY3R4LT5jb25maWc7CisJaW5zdC0+dmRlYy5jdHgJCT0gY3R4OworCWluc3QtPmN0eAkJPSBjdHg7CisKKwl2ZGVjX3BhcnNlcl9wYXJtcyhpbnN0KTsKKwkvKiBzZXQgcGxheSBtb2RlLiovCisJaWYgKGN0eC0+aXNfZHJtX21vZGUpCisJCWluc3QtPnZkZWMucG9ydC5mbGFnIHw9IFBPUlRfRkxBR19EUk07CisKKwkvKiB0byBlYWJsZSBtanBlZyBody4qLworCWluc3QtPnZkZWMucG9ydC50eXBlID0gUE9SVF9UWVBFX1ZJREVPOworCisJLyogcHJvYmUgaW5mbyBmcm9tIHRoZSBzdHJlYW0gKi8KKwlpbnN0LT52c2kgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdmRlY19tanBlZ192c2kpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluc3QtPnZzaSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBhbGxvYyB0aGUgaGVhZGVyIGJ1ZmZlciB0byBiZSB1c2VkIGNhY2hlIHNwcyBvciBzcHAgZXRjLiovCisJaW5zdC0+dnNpLT5oZWFkZXJfYnVmID0gdnphbGxvYyhIRUFERVJfQlVGRkVSX1NJWkUpOworCWlmICghaW5zdC0+dnNpLT5oZWFkZXJfYnVmKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCWluaXRfY29tcGxldGlvbigmaW5zdC0+Y29tcCk7CisJY3R4LT5hZGFfY3R4CT0gJmluc3QtPnZkZWM7CisJKmhfdmRlYwkJPSAodW5zaWduZWQgbG9uZylpbnN0OworCisJcmV0ID0gdmlkZW9fZGVjb2Rlcl9pbml0KCZpbnN0LT52ZGVjKTsKKwlpZiAocmV0KSB7CisJCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkidmRlY19tanBlZyBpbml0IGVycj0lZFxuIiwgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19QUklORk8sCisJCSJtanBlZyBJbnN0YW5jZSA+PiAlbHhcbiIsICh1bG9uZykgaW5zdCk7CisKKwlyZXR1cm4gMDsKKworZXJyOgorCWlmIChpbnN0ICYmIGluc3QtPnZzaSAmJiBpbnN0LT52c2ktPmhlYWRlcl9idWYpCisJCXZmcmVlKGluc3QtPnZzaS0+aGVhZGVyX2J1Zik7CisJaWYgKGluc3QgJiYgaW5zdC0+dnNpKQorCQlrZnJlZShpbnN0LT52c2kpOworCWlmIChpbnN0KQorCQlrZnJlZShpbnN0KTsKKwkqaF92ZGVjID0gMDsKKworCXJldHVybiByZXQ7Cit9CisKKyNpZiAwCitzdGF0aWMgaW50IHJlZmVyX2J1ZmZlcl9udW0oaW50IGxldmVsX2lkYywgaW50IHBvY19jbnQsCisJaW50IG1iX3dpZHRoLCBpbnQgbWJfaGVpZ2h0KQoreworCXJldHVybiAyMDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBmaWxsX3ZkZWNfcGFyYW1zKHN0cnVjdCB2ZGVjX21qcGVnX2luc3QgKmluc3QsCisJc3RydWN0IE1KcGVnRGVjb2RlQ29udGV4dCAqcHMpCit7CisJc3RydWN0IHZkZWNfcGljX2luZm8gKnBpYyA9ICZpbnN0LT52c2ktPnBpYzsKKwlzdHJ1Y3QgdmRlY19tanBlZ19kZWNfaW5mbyAqZGVjID0gJmluc3QtPnZzaS0+ZGVjOworCXN0cnVjdCB2NGwyX3JlY3QgKnJlY3QgPSAmaW5zdC0+dnNpLT5jcm9wOworCisJLyogZmlsbCB2aXNpYmxlIGFyZWEgc2l6ZSB0aGF0IGJlIHVzZWQgZm9yIEVHTC4gKi8KKwlwaWMtPnZpc2libGVfd2lkdGgJPSBwcy0+d2lkdGg7CisJcGljLT52aXNpYmxlX2hlaWdodAk9IHBzLT5oZWlnaHQ7CisKKwkvKiBjYWxjIHZpc2libGUgYXJlcy4gKi8KKwlyZWN0LT5sZWZ0CQk9IDA7CisJcmVjdC0+dG9wCQk9IDA7CisJcmVjdC0+d2lkdGgJCT0gcGljLT52aXNpYmxlX3dpZHRoOworCXJlY3QtPmhlaWdodAkJPSBwaWMtPnZpc2libGVfaGVpZ2h0OworCisJLyogY29uZmlnIGNhbnZhcyBzaXplIHRoYXQgYmUgdXNlZCBmb3IgZGVjb2Rlci4gKi8KKwlwaWMtPmNvZGVkX3dpZHRoCT0gQUxJR04ocHMtPndpZHRoLCA2NCk7CisJcGljLT5jb2RlZF9oZWlnaHQJPSBBTElHTihwcy0+aGVpZ2h0LCA2NCk7CisKKwlwaWMtPnlfbGVuX3N6CQk9IHBpYy0+Y29kZWRfd2lkdGggKiBwaWMtPmNvZGVkX2hlaWdodDsKKwlwaWMtPmNfbGVuX3N6CQk9IHBpYy0+eV9sZW5fc3o7CisKKwkvKjgoREVDT0RFX0JVRkZFUl9OVU1fREVGKSAqLworCWRlYy0+ZHBiX3N6ID0gODsKKworCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfQlVGTUdSLAorCQkiVGhlIHN0cmVhbSBpbmZvcywgY29kZWQ6KCVkIHggJWQpLCB2aXNpYmxlOiglZCB4ICVkKVxuIiwKKwkJcGljLT5jb2RlZF93aWR0aCwgcGljLT5jb2RlZF9oZWlnaHQsCisJCXBpYy0+dmlzaWJsZV93aWR0aCwgcGljLT52aXNpYmxlX2hlaWdodCk7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfc3RyZWFtX3Vjb2RlKHN0cnVjdCB2ZGVjX21qcGVnX2luc3QgKmluc3QsCisJCQkgICAgICB1OCAqYnVmLCB1MzIgc2l6ZSwgdTY0IHRpbWVzdGFtcCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYW1sX3ZkZWNfYWRhcHQgKnZkZWMgPSAmaW5zdC0+dmRlYzsKKworCXJldCA9IHZkZWNfdmZyYW1lX3dyaXRlKHZkZWMsIGJ1Ziwgc2l6ZSwgdGltZXN0YW1wLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJIndyaXRlIGZyYW1lIGRhdGEgZmFpbGVkLiBlcnI6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIHdhaXQgdWNvZGUgcGFyc2UgZW5kaW5nLiAqLworCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaW5zdC0+Y29tcCwKKwkJbXNlY3NfdG9famlmZmllcygxMDAwKSk7CisKKwlyZXR1cm4gaW5zdC0+dnNpLT5waWMuZHBiX2ZyYW1lcyA/IDAgOiAtMTsKK30KKworc3RhdGljIGludCBwYXJzZV9zdHJlYW1fdWNvZGVfZG1hKHN0cnVjdCB2ZGVjX21qcGVnX2luc3QgKmluc3QsCisJdWxvbmcgYnVmLCB1MzIgc2l6ZSwgdTY0IHRpbWVzdGFtcCwgdTMyIGhhbmRsZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYW1sX3ZkZWNfYWRhcHQgKnZkZWMgPSAmaW5zdC0+dmRlYzsKKworCXJldCA9IHZkZWNfdmZyYW1lX3dyaXRlX3dpdGhfZG1hKHZkZWMsIGJ1Ziwgc2l6ZSwgdGltZXN0YW1wLCBoYW5kbGUsCisJCXZkZWNfdmZyYW1lX2lucHV0X2ZyZWUsIGluc3QtPmN0eCk7CisJaWYgKHJldCA8IDApIHsKKwkJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJ3cml0ZSBmcmFtZSBkYXRhIGZhaWxlZC4gZXJyOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiB3YWl0IHVjb2RlIHBhcnNlIGVuZGluZy4gKi8KKwl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmluc3QtPmNvbXAsCisJCW1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOworCisJcmV0dXJuIGluc3QtPnZzaS0+cGljLmRwYl9mcmFtZXMgPyAwIDogLTE7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfc3RyZWFtX2NwdShzdHJ1Y3QgdmRlY19tanBlZ19pbnN0ICppbnN0LCB1OCAqYnVmLCB1MzIgc2l6ZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgbWpwZWdfcGFyYW1fc2V0cyAqcHMgPSBOVUxMOworCisJcHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWpwZWdfcGFyYW1fc2V0cyksIEdGUF9LRVJORUwpOworCWlmIChwcyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IG1qcGVnX2RlY29kZV9leHRyYWRhdGFfcHMoYnVmLCBzaXplLCBwcyk7CisJaWYgKHJldCkgeworCQl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJInBhcnNlIGV4dHJhIGRhdGEgZmFpbGVkLiBlcnI6ICVkXG4iLCByZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocHMtPmhlYWRfcGFyc2VkKQorCQlmaWxsX3ZkZWNfcGFyYW1zKGluc3QsICZwcy0+ZGVjX3BzKTsKKworCXJldCA9IHBzLT5oZWFkX3BhcnNlZCA/IDAgOiAtMTsKK291dDoKKwlrZnJlZShwcyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZkZWNfbWpwZWdfcHJvYmUodW5zaWduZWQgbG9uZyBoX3ZkZWMsCisJc3RydWN0IGFtbF92Y29kZWNfbWVtICpicywgdm9pZCAqb3V0KQoreworCXN0cnVjdCB2ZGVjX21qcGVnX2luc3QgKmluc3QgPQorCQkoc3RydWN0IHZkZWNfbWpwZWdfaW5zdCAqKWhfdmRlYzsKKwl1OCAqYnVmID0gKHU4ICopYnMtPnZhZGRyOworCXUzMiBzaXplID0gYnMtPnNpemU7CisJaW50IHJldCA9IDA7CisKKwlpZiAoaW5zdC0+Y3R4LT5pc19kcm1fbW9kZSkgeworCQlpZiAoYnMtPm1vZGVsID09IFZCMl9NRU1PUllfTU1BUCkgeworCQkJc3RydWN0IGFtbF92aWRlb19zdHJlYW0gKnMgPQorCQkJCShzdHJ1Y3QgYW1sX3ZpZGVvX3N0cmVhbSAqKSBidWY7CisKKwkJCWlmICgocy0+bWFnaWMgIT0gQU1MX1ZJREVPX01BR0lDKSAmJgorCQkJCShzLT50eXBlICE9IFY0TF9TVFJFQU1fVFlQRV9NQVRFREFUQSkpCisJCQkJcmV0dXJuIC0xOworCisJCQlpZiAoaW5zdC0+Y3R4LT5wYXJhbV9zZXRzX2Zyb21fdWNvZGUpIHsKKwkJCQlyZXQgPSBwYXJzZV9zdHJlYW1fdWNvZGUoaW5zdCwgcy0+ZGF0YSwKKwkJCQkJcy0+bGVuLCBicy0+dGltZXN0YW1wKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0ID0gcGFyc2Vfc3RyZWFtX2NwdShpbnN0LCBzLT5kYXRhLCBzLT5sZW4pOworCQkJfQorCQl9IGVsc2UgaWYgKGJzLT5tb2RlbCA9PSBWQjJfTUVNT1JZX0RNQUJVRiB8fAorCQkJYnMtPm1vZGVsID09IFZCMl9NRU1PUllfVVNFUlBUUikgeworCQkJcmV0ID0gcGFyc2Vfc3RyZWFtX3Vjb2RlX2RtYShpbnN0LCBicy0+YWRkciwgc2l6ZSwKKwkJCQlicy0+dGltZXN0YW1wLCBCVUZGX0lEWChicywgYnMtPmluZGV4KSk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoaW5zdC0+Y3R4LT5wYXJhbV9zZXRzX2Zyb21fdWNvZGUpIHsKKwkJCXJldCA9IHBhcnNlX3N0cmVhbV91Y29kZShpbnN0LCBidWYsIHNpemUsIGJzLT50aW1lc3RhbXApOworCQl9IGVsc2UgeworCQkJcmV0ID0gcGFyc2Vfc3RyZWFtX2NwdShpbnN0LCBidWYsIHNpemUpOworCQl9CisJfQorCisJaW5zdC0+dnNpLT5jdXJfcGljID0gaW5zdC0+dnNpLT5waWM7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB2ZGVjX21qcGVnX2RlaW5pdCh1bnNpZ25lZCBsb25nIGhfdmRlYykKK3sKKwlzdHJ1Y3QgdmRlY19tanBlZ19pbnN0ICppbnN0ID0gKHN0cnVjdCB2ZGVjX21qcGVnX2luc3QgKiloX3ZkZWM7CisKKwlpZiAoIWluc3QpCisJCXJldHVybjsKKworCXZpZGVvX2RlY29kZXJfcmVsZWFzZSgmaW5zdC0+dmRlYyk7CisKKwlpZiAoaW5zdC0+dnNpICYmIGluc3QtPnZzaS0+aGVhZGVyX2J1ZikKKwkJdmZyZWUoaW5zdC0+dnNpLT5oZWFkZXJfYnVmKTsKKworCWlmIChpbnN0LT52c2kpCisJCWtmcmVlKGluc3QtPnZzaSk7CisKKwlrZnJlZShpbnN0KTsKK30KKworc3RhdGljIGludCB2ZGVjX3dyaXRlX25hbHUoc3RydWN0IHZkZWNfbWpwZWdfaW5zdCAqaW5zdCwKKwl1OCAqYnVmLCB1MzIgc2l6ZSwgdTY0IHRzKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhbWxfdmRlY19hZGFwdCAqdmRlYyA9ICZpbnN0LT52ZGVjOworCisJcmV0ID0gdmRlY192ZnJhbWVfd3JpdGUodmRlYywgYnVmLCBzaXplLCB0cywgMCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZkZWNfbWpwZWdfZGVjb2RlKHVuc2lnbmVkIGxvbmcgaF92ZGVjLAorCQkJICAgICBzdHJ1Y3QgYW1sX3Zjb2RlY19tZW0gKmJzLCBib29sICpyZXNfY2hnKQoreworCXN0cnVjdCB2ZGVjX21qcGVnX2luc3QgKmluc3QgPSAoc3RydWN0IHZkZWNfbWpwZWdfaW5zdCAqKWhfdmRlYzsKKwlzdHJ1Y3QgYW1sX3ZkZWNfYWRhcHQgKnZkZWMgPSAmaW5zdC0+dmRlYzsKKwl1OCAqYnVmID0gKHU4ICopIGJzLT52YWRkcjsKKwl1MzIgc2l6ZSA9IGJzLT5zaXplOworCWludCByZXQgPSAtMTsKKworCWlmICh2ZGVjX2lucHV0X2Z1bGwodmRlYykpCisJCXJldHVybiAtRUFHQUlOOworCisJaWYgKGluc3QtPmN0eC0+aXNfZHJtX21vZGUpIHsKKwkJaWYgKGJzLT5tb2RlbCA9PSBWQjJfTUVNT1JZX01NQVApIHsKKwkJCXN0cnVjdCBhbWxfdmlkZW9fc3RyZWFtICpzID0KKwkJCQkoc3RydWN0IGFtbF92aWRlb19zdHJlYW0gKikgYnVmOworCisJCQlpZiAocy0+bWFnaWMgIT0gQU1MX1ZJREVPX01BR0lDKQorCQkJCXJldHVybiAtMTsKKworCQkJcmV0ID0gdmRlY192ZnJhbWVfd3JpdGUodmRlYywKKwkJCQlzLT5kYXRhLAorCQkJCXMtPmxlbiwKKwkJCQlicy0+dGltZXN0YW1wLAorCQkJCTApOworCQl9IGVsc2UgaWYgKGJzLT5tb2RlbCA9PSBWQjJfTUVNT1JZX0RNQUJVRiB8fAorCQkJYnMtPm1vZGVsID09IFZCMl9NRU1PUllfVVNFUlBUUikgeworCQkJcmV0ID0gdmRlY192ZnJhbWVfd3JpdGVfd2l0aF9kbWEodmRlYywKKwkJCQlicy0+YWRkciwgc2l6ZSwgYnMtPnRpbWVzdGFtcCwKKwkJCQlCVUZGX0lEWChicywgYnMtPmluZGV4KSwKKwkJCQl2ZGVjX3ZmcmFtZV9pbnB1dF9mcmVlLCBpbnN0LT5jdHgpOworCQl9CisJfSBlbHNlIHsKKwkJcmV0ID0gdmRlY193cml0ZV9uYWx1KGluc3QsIGJ1Ziwgc2l6ZSwgYnMtPnRpbWVzdGFtcCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2ZGVjX21qcGVnX2dldF9wYXJhbSh1bnNpZ25lZCBsb25nIGhfdmRlYywKKwkJCSAgICAgICBlbnVtIHZkZWNfZ2V0X3BhcmFtX3R5cGUgdHlwZSwgdm9pZCAqb3V0KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCB2ZGVjX21qcGVnX2luc3QgKmluc3QgPSAoc3RydWN0IHZkZWNfbWpwZWdfaW5zdCAqKWhfdmRlYzsKKworCWlmICghaW5zdCkgeworCQl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJInRoZSBtanBlZyBpbnN0IG9mIGRlYyBpcyBpbnZhbGlkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEdFVF9QQVJBTV9QSUNfSU5GTzoKKwkJZ2V0X3BpY19pbmZvKGluc3QsIG91dCk7CisJCWJyZWFrOworCisJY2FzZSBHRVRfUEFSQU1fRFBCX1NJWkU6CisJCWdldF9kcGJfc2l6ZShpbnN0LCBvdXQpOworCQlicmVhazsKKworCWNhc2UgR0VUX1BBUkFNX0NST1BfSU5GTzoKKwkJZ2V0X2Nyb3BfaW5mbyhpbnN0LCBvdXQpOworCQlicmVhazsKKworCWNhc2UgR0VUX1BBUkFNX0RXX01PREU6CisJeworCQl1bnNpZ25lZCBpbnQqIG1vZGUgPSBvdXQ7CisJCSptb2RlID0gVkRFQ19EV19OT19BRkJDOworCQlicmVhazsKKwl9CisKKwlkZWZhdWx0OgorCQl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJImludmFsaWQgZ2V0IHBhcmFtZXRlciB0eXBlPSVkXG4iLCB0eXBlKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzZXRfcGFyYW1fcHNfaW5mbyhzdHJ1Y3QgdmRlY19tanBlZ19pbnN0ICppbnN0LAorCXN0cnVjdCBhbWxfdmRlY19wc19pbmZvcyAqcHMpCit7CisJc3RydWN0IHZkZWNfcGljX2luZm8gKnBpYyA9ICZpbnN0LT52c2ktPnBpYzsKKwlzdHJ1Y3QgdmRlY19tanBlZ19kZWNfaW5mbyAqZGVjID0gJmluc3QtPnZzaS0+ZGVjOworCXN0cnVjdCB2NGwyX3JlY3QgKnJlY3QgPSAmaW5zdC0+dnNpLT5jcm9wOworCisJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19QUklORk8sICIlcyBpblxuIiwgX19mdW5jX18pOworCS8qIGZpbGwgdmlzaWJsZSBhcmVhIHNpemUgdGhhdCBiZSB1c2VkIGZvciBFR0wuICovCisJcGljLT52aXNpYmxlX3dpZHRoCT0gcHMtPnZpc2libGVfd2lkdGg7CisJcGljLT52aXNpYmxlX2hlaWdodAk9IHBzLT52aXNpYmxlX2hlaWdodDsKKworCS8qIGNhbGMgdmlzaWJsZSBhcmVzLiAqLworCXJlY3QtPmxlZnQJCT0gMDsKKwlyZWN0LT50b3AJCT0gMDsKKwlyZWN0LT53aWR0aAkJPSBwaWMtPnZpc2libGVfd2lkdGg7CisJcmVjdC0+aGVpZ2h0CQk9IHBpYy0+dmlzaWJsZV9oZWlnaHQ7CisKKwkvKiBjb25maWcgY2FudmFzIHNpemUgdGhhdCBiZSB1c2VkIGZvciBkZWNvZGVyLiAqLworCXBpYy0+Y29kZWRfd2lkdGgJPSBwcy0+Y29kZWRfd2lkdGg7CisJcGljLT5jb2RlZF9oZWlnaHQJPSBwcy0+Y29kZWRfaGVpZ2h0OworCXBpYy0+eV9sZW5fc3oJCT0gcGljLT5jb2RlZF93aWR0aCAqIHBpYy0+Y29kZWRfaGVpZ2h0OworCXBpYy0+Y19sZW5fc3oJCT0gcGljLT55X2xlbl9zeiA+PiAxOworCisJcGljLT5kcGJfZnJhbWVzCQk9IHBzLT5kcGJfZnJhbWVzOworCXBpYy0+ZHBiX21hcmdpbgkJPSBwcy0+ZHBiX21hcmdpbjsKKwlwaWMtPnZwcF9tYXJnaW4JCT0gcHMtPmRwYl9tYXJnaW47CisJZGVjLT5kcGJfc3oJCT0gcHMtPmRwYl9zaXplOworCXBpYy0+ZmllbGQJCT0gcHMtPmZpZWxkOworCisJaW5zdC0+cGFybXMucHMgCT0gKnBzOworCWluc3QtPnBhcm1zLnBhcm1zX3N0YXR1cyB8PQorCQlWNEwyX0NPTkZJR19QQVJNX0RFQ09ERV9QU0lORk87CisKKwkvKndha2UgdXAqLworCWNvbXBsZXRlKCZpbnN0LT5jb21wKTsKKworCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfUFJJTkZPLAorCQkiUGFyc2UgZnJvbSB1Y29kZSwgdmlzaWJsZSglZCB4ICVkKSwgY29kZWQoJWQgeCAlZCksIHNjYW46JXNcbiIsCisJCXBzLT52aXNpYmxlX3dpZHRoLCBwcy0+dmlzaWJsZV9oZWlnaHQsCisJCXBzLT5jb2RlZF93aWR0aCwgcHMtPmNvZGVkX2hlaWdodCwKKwkJcGljLT5maWVsZCA9PSBWNEwyX0ZJRUxEX05PTkUgPyAiUCIgOiAiSSIpOworfQorCitzdGF0aWMgdm9pZCBzZXRfcGFyYW1fd3JpdGVfc3luYyhzdHJ1Y3QgdmRlY19tanBlZ19pbnN0ICppbnN0KQoreworCWNvbXBsZXRlKCZpbnN0LT5jb21wKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3BpY19pbmZvKHN0cnVjdCB2ZGVjX21qcGVnX2luc3QgKmluc3QsCisJc3RydWN0IHZkZWNfcGljX2luZm8gKnBpYykKK3sKKwlpbnN0LT52c2ktPnBpYyA9ICpwaWM7Cit9CisKK3N0YXRpYyBpbnQgdmRlY19tanBlZ19zZXRfcGFyYW0odW5zaWduZWQgbG9uZyBoX3ZkZWMsCisJZW51bSB2ZGVjX3NldF9wYXJhbV90eXBlIHR5cGUsIHZvaWQgKmluKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCB2ZGVjX21qcGVnX2luc3QgKmluc3QgPSAoc3RydWN0IHZkZWNfbWpwZWdfaW5zdCAqKWhfdmRlYzsKKworCWlmICghaW5zdCkgeworCQl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJInRoZSBtanBlZyBpbnN0IG9mIGRlYyBpcyBpbnZhbGlkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNFVF9QQVJBTV9XUklURV9GUkFNRV9TWU5DOgorCQlzZXRfcGFyYW1fd3JpdGVfc3luYyhpbnN0KTsKKwkJYnJlYWs7CisKKwljYXNlIFNFVF9QQVJBTV9QU19JTkZPOgorCQlzZXRfcGFyYW1fcHNfaW5mbyhpbnN0LCBpbik7CisJCWJyZWFrOworCisJY2FzZSBTRVRfUEFSQU1fUElDX0lORk86CisJCXNldF9waWNfaW5mbyhpbnN0LCBpbik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJpbnZhbGlkIHNldCBwYXJhbWV0ZXIgdHlwZT0lZFxuIiwgdHlwZSk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCB2ZGVjX2NvbW1vbl9pZiB2ZGVjX21qcGVnX2lmID0geworCS5pbml0CQk9IHZkZWNfbWpwZWdfaW5pdCwKKwkucHJvYmUJCT0gdmRlY19tanBlZ19wcm9iZSwKKwkuZGVjb2RlCQk9IHZkZWNfbWpwZWdfZGVjb2RlLAorCS5nZXRfcGFyYW0JPSB2ZGVjX21qcGVnX2dldF9wYXJhbSwKKwkuc2V0X3BhcmFtCT0gdmRlY19tanBlZ19zZXRfcGFyYW0sCisJLmRlaW5pdAkJPSB2ZGVjX21qcGVnX2RlaW5pdCwKK307CisKK3N0cnVjdCB2ZGVjX2NvbW1vbl9pZiAqZ2V0X21qcGVnX2RlY19jb21tX2lmKHZvaWQpOworCitzdHJ1Y3QgdmRlY19jb21tb25faWYgKmdldF9tanBlZ19kZWNfY29tbV9pZih2b2lkKQoreworCXJldHVybiAmdmRlY19tanBlZ19pZjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2RlY29kZXIvdmRlY19tcGVnMTJfaWYuYyBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2RlY29kZXIvdmRlY19tcGVnMTJfaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDcyYWMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvZGVjb2Rlci92ZGVjX21wZWcxMl9pZi5jCkBAIC0wLDAgKzEsNjQ1IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorKiBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqCisqIERlc2NyaXB0aW9uOgorKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvc3dhYi5oPgorI2luY2x1ZGUgIi4uL3ZkZWNfZHJ2X2lmLmgiCisjaW5jbHVkZSAiLi4vYW1sX3Zjb2RlY191dGlsLmgiCisjaW5jbHVkZSAiLi4vYW1sX3Zjb2RlY19kZWMuaCIKKyNpbmNsdWRlICIuLi9hbWxfdmNvZGVjX2FkYXB0LmgiCisjaW5jbHVkZSAiLi4vdmRlY19kcnZfYmFzZS5oIgorI2luY2x1ZGUgImFtbF9tcGVnMTJfcGFyc2VyLmgiCisKKyNkZWZpbmUgTkFMX1RZUEUodmFsdWUpCQkJCSgodmFsdWUpICYgMHgxRikKKyNkZWZpbmUgSEVBREVSX0JVRkZFUl9TSVpFCQkJKDMyICogMTAyNCkKKworLyoqCisgKiBzdHJ1Y3QgbXBlZzEyX2ZiIC0gbXBlZzEyIGRlY29kZSBmcmFtZSBidWZmZXIgaW5mb3JtYXRpb24KKyAqIEB2ZGVjX2ZiX3ZhICA6IHZpcnR1YWwgYWRkcmVzcyBvZiBzdHJ1Y3QgdmRlY19mYgorICogQHlfZmJfZG1hICAgIDogZG1hIGFkZHJlc3Mgb2YgWSBmcmFtZSBidWZmZXIgKGx1bWEpCisgKiBAY19mYl9kbWEgICAgOiBkbWEgYWRkcmVzcyBvZiBDIGZyYW1lIGJ1ZmZlciAoY2hyb21hKQorICogQHBvYyAgICAgICAgIDogcGljdHVyZSBvcmRlciBjb3VudCBvZiBmcmFtZSBidWZmZXIKKyAqIEByZXNlcnZlZCAgICA6IGZvciA4IGJ5dGVzIGFsaWdubWVudAorICovCitzdHJ1Y3QgbXBlZzEyX2ZiIHsKKwl1aW50NjRfdCB2ZGVjX2ZiX3ZhOworCXVpbnQ2NF90IHlfZmJfZG1hOworCXVpbnQ2NF90IGNfZmJfZG1hOworCWludDMyX3QgcG9jOworCXVpbnQzMl90IHJlc2VydmVkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdmRlY19tcGVnMTJfZGVjX2luZm8gLSBkZWNvZGUgaW5mb3JtYXRpb24KKyAqIEBkcGJfc3oJCTogZGVjb2RpbmcgcGljdHVyZSBidWZmZXIgc2l6ZQorICogQHJlc29sdXRpb25fY2hhbmdlZCAgOiByZXNvbHRpb24gY2hhbmdlIGhhcHBlbgorICogQHJlc2VydmVkCQk6IGZvciA4IGJ5dGVzIGFsaWdubWVudAorICogQGJzX2RtYQkJOiBJbnB1dCBiaXQtc3RyZWFtIGJ1ZmZlciBkbWEgYWRkcmVzcworICogQHlfZmJfZG1hCQk6IFkgZnJhbWUgYnVmZmVyIGRtYSBhZGRyZXNzCisgKiBAY19mYl9kbWEJCTogQyBmcmFtZSBidWZmZXIgZG1hIGFkZHJlc3MKKyAqIEB2ZGVjX2ZiX3ZhCQk6IFZERUMgZnJhbWUgYnVmZmVyIHN0cnVjdCB2aXJ0dWFsIGFkZHJlc3MKKyAqLworc3RydWN0IHZkZWNfbXBlZzEyX2RlY19pbmZvIHsKKwl1aW50MzJfdCBkcGJfc3o7CisJdWludDMyX3QgcmVzb2x1dGlvbl9jaGFuZ2VkOworCXVpbnQzMl90IHJlc2VydmVkOworCXVpbnQ2NF90IGJzX2RtYTsKKwl1aW50NjRfdCB5X2ZiX2RtYTsKKwl1aW50NjRfdCBjX2ZiX2RtYTsKKwl1aW50NjRfdCB2ZGVjX2ZiX3ZhOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdmRlY19tcGVnMTJfdnNpIC0gc2hhcmVkIG1lbW9yeSBmb3IgZGVjb2RlIGluZm9ybWF0aW9uIGV4Y2hhbmdlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gVlBVIGFuZCBIb3N0LgorICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWVtb3J5IGlzIGFsbG9jYXRlZCBieSBWUFUgdGhlbiBtYXBwaW5nIHRvIEhvc3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgaW4gdnB1X2RlY19pbml0KCkgYW5kIGZyZWVkIGluIHZwdV9kZWNfZGVpbml0KCkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYnkgVlBVLgorICogICAgICAgICAgICAgICAgICAgICAgICBBUC1XL1IgOiBBUCBpcyB3cml0ZXIvcmVhZGVyIG9uIHRoaXMgaXRlbQorICogICAgICAgICAgICAgICAgICAgICAgICBWUFUtVy9SOiBWUFUgaXMgd3JpdGUvcmVhZGVyIG9uIHRoaXMgaXRlbQorICogQGhkcl9idWYgICAgICA6IEhlYWRlciBwYXJzaW5nIGJ1ZmZlciAoQVAtVywgVlBVLVIpCisgKiBAbGlzdF9mcmVlICAgIDogZnJlZSBmcmFtZSBidWZmZXIgcmluZyBsaXN0IChBUC1XL1IsIFZQVS1XKQorICogQGxpc3RfZGlzcCAgICA6IGRpc3BsYXkgZnJhbWUgYnVmZmVyIHJpbmcgbGlzdCAoQVAtUiwgVlBVLVcpCisgKiBAZGVjICAgICAgICAgIDogZGVjb2RlIGluZm9ybWF0aW9uIChBUC1SLCBWUFUtVykKKyAqIEBwaWMgICAgICAgICAgOiBwaWN0dXJlIGluZm9ybWF0aW9uIChBUC1SLCBWUFUtVykKKyAqIEBjcm9wICAgICAgICAgOiBjcm9wIGluZm9ybWF0aW9uIChBUC1SLCBWUFUtVykKKyAqLworc3RydWN0IHZkZWNfbXBlZzEyX3ZzaSB7CisJY2hhciAqaGVhZGVyX2J1ZjsKKwlpbnQgc3BzX3NpemU7CisJaW50IHBwc19zaXplOworCWludCBzZWlfc2l6ZTsKKwlpbnQgaGVhZF9vZmZzZXQ7CisJc3RydWN0IHZkZWNfbXBlZzEyX2RlY19pbmZvIGRlYzsKKwlzdHJ1Y3QgdmRlY19waWNfaW5mbyBwaWM7CisJc3RydWN0IHZkZWNfcGljX2luZm8gY3VyX3BpYzsKKwlzdHJ1Y3QgdjRsMl9yZWN0IGNyb3A7CisJYm9vbCBpc19jb21iaW5lOworCWludCBuYWx1X3BvczsKKwkvL3N0cnVjdCBtcGVnMTJfcGFyYW1fc2V0cyBwczsKK307CisKKy8qKgorICogc3RydWN0IHZkZWNfbXBlZzEyX2luc3QgLSBtcGVnMTIgZGVjb2RlciBpbnN0YW5jZQorICogQG51bV9uYWx1IDogaG93IG1hbnkgbmFsdXMgYmUgZGVjb2RlZAorICogQGN0eCAgICAgIDogcG9pbnQgdG8gYW1sX3Zjb2RlY19jdHgKKyAqIEB2c2kgICAgICA6IFZQVSBzaGFyZWQgaW5mb3JtYXRpb24KKyAqLworc3RydWN0IHZkZWNfbXBlZzEyX2luc3QgeworCXVuc2lnbmVkIGludCBudW1fbmFsdTsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eDsKKwlzdHJ1Y3QgYW1sX3ZkZWNfYWRhcHQgdmRlYzsKKwlzdHJ1Y3QgdmRlY19tcGVnMTJfdnNpICp2c2k7CisJc3RydWN0IGFtbF9kZWNfcGFyYW1zIHBhcm1zOworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXA7Cit9OworCitzdGF0aWMgdm9pZCBnZXRfcGljX2luZm8oc3RydWN0IHZkZWNfbXBlZzEyX2luc3QgKmluc3QsCisJCQkgc3RydWN0IHZkZWNfcGljX2luZm8gKnBpYykKK3sKKwkqcGljID0gaW5zdC0+dnNpLT5waWM7CisKKwl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywKKwkJInBpYyglZCwgJWQpLCBidWYoJWQsICVkKVxuIiwKKwkJIHBpYy0+dmlzaWJsZV93aWR0aCwgcGljLT52aXNpYmxlX2hlaWdodCwKKwkJIHBpYy0+Y29kZWRfd2lkdGgsIHBpYy0+Y29kZWRfaGVpZ2h0KTsKKwl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywKKwkJIlkoJWQsICVkKSwgQyglZCwgJWQpXG4iLAorCQlwaWMtPnlfYnNfc3osIHBpYy0+eV9sZW5fc3osCisJCXBpYy0+Y19ic19zeiwgcGljLT5jX2xlbl9zeik7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9jcm9wX2luZm8oc3RydWN0IHZkZWNfbXBlZzEyX2luc3QgKmluc3QsIHN0cnVjdCB2NGwyX3JlY3QgKmNyKQoreworCWNyLT5sZWZ0ID0gaW5zdC0+dnNpLT5jcm9wLmxlZnQ7CisJY3ItPnRvcCA9IGluc3QtPnZzaS0+Y3JvcC50b3A7CisJY3ItPndpZHRoID0gaW5zdC0+dnNpLT5jcm9wLndpZHRoOworCWNyLT5oZWlnaHQgPSBpbnN0LT52c2ktPmNyb3AuaGVpZ2h0OworCisJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FWElORk8sCisJCSJsPSVkLCB0PSVkLCB3PSVkLCBoPSVkXG4iLAorCQkgY3ItPmxlZnQsIGNyLT50b3AsIGNyLT53aWR0aCwgY3ItPmhlaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9kcGJfc2l6ZShzdHJ1Y3QgdmRlY19tcGVnMTJfaW5zdCAqaW5zdCwgdW5zaWduZWQgaW50ICpkcGJfc3opCit7CisJKmRwYl9zeiA9IGluc3QtPnZzaS0+ZGVjLmRwYl9zejsKKwl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywgInN6PSVkXG4iLCAqZHBiX3N6KTsKK30KKworc3RhdGljIHUzMiB2ZGVjX2NvbmZpZ19kZWZhdWx0X3Bhcm1zKHU4ICpwYXJtKQoreworCXU4ICpwYnVmID0gcGFybTsKKworCXBidWYgKz0gc3ByaW50ZihwYnVmLCAicGFybV92NGxfY29kZWNfZW5hYmxlOjE7Iik7CisJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJwYXJtX3Y0bF9jYW52YXNfbWVtX21vZGU6MDsiKTsKKwlwYnVmICs9IHNwcmludGYocGJ1ZiwgInBhcm1fdjRsX2J1ZmZlcl9tYXJnaW46MDsiKTsKKworCXJldHVybiBwYnVmIC0gcGFybTsKK30KKworc3RhdGljIHZvaWQgdmRlY19wYXJzZXJfcGFybXMoc3RydWN0IHZkZWNfbXBlZzEyX2luc3QgKmluc3QpCit7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPSBpbnN0LT5jdHg7CisKKwlpZiAoY3R4LT5jb25maWcucGFybS5kZWMucGFybXNfc3RhdHVzICYKKwkJVjRMMl9DT05GSUdfUEFSTV9ERUNPREVfQ0ZHSU5GTykgeworCQl1OCAqcGJ1ZiA9IGN0eC0+Y29uZmlnLmJ1ZjsKKworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgInBhcm1fdjRsX2NvZGVjX2VuYWJsZToxOyIpOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgInBhcm1fdjRsX2NhbnZhc19tZW1fbW9kZTolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuY2ZnLmNhbnZhc19tZW1fbW9kZSk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAicGFybV92NGxfYnVmZmVyX21hcmdpbjolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuY2ZnLnJlZl9idWZfbWFyZ2luKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJwYXJtX3Y0bF9tZXRhZGF0YV9jb25maWdfZmxhZzolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuY2ZnLm1ldGFkYXRhX2NvbmZpZ19mbGFnKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJwYXJtX3Y0bF9kdXJhdGlvbjolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuY2ZnLmR1cmF0aW9uKTsKKwkJY3R4LT5jb25maWcubGVuZ3RoID0gcGJ1ZiAtIGN0eC0+Y29uZmlnLmJ1ZjsKKwl9IGVsc2UgeworCQljdHgtPmNvbmZpZy5sZW5ndGggPSB2ZGVjX2NvbmZpZ19kZWZhdWx0X3Bhcm1zKGN0eC0+Y29uZmlnLmJ1Zik7CisJfQorCisJaW5zdC0+dmRlYy5jb25maWcJPSBjdHgtPmNvbmZpZzsKKwlpbnN0LT5wYXJtcy5jZmcJCT0gY3R4LT5jb25maWcucGFybS5kZWMuY2ZnOworCWluc3QtPnBhcm1zLnBhcm1zX3N0YXR1cyB8PSBWNEwyX0NPTkZJR19QQVJNX0RFQ09ERV9DRkdJTkZPOworfQorCitzdGF0aWMgaW50IHZkZWNfbXBlZzEyX2luaXQoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsIHVuc2lnbmVkIGxvbmcgKmhfdmRlYykKK3sKKwlzdHJ1Y3QgdmRlY19tcGVnMTJfaW5zdCAqaW5zdCA9IE5VTEw7CisJaW50IHJldCA9IC0xOworCisJaW5zdCA9IGt6YWxsb2Moc2l6ZW9mKCppbnN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbnN0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWluc3QtPnZkZWMuZnJtX25hbWUJPSAiTVBFRzIiOworCWluc3QtPnZkZWMudmlkZW9fdHlwZQk9IFZGT1JNQVRfTVBFRzEyOworCWluc3QtPnZkZWMuZmlscAkJPSBjdHgtPmRldi0+ZmlscDsKKwlpbnN0LT52ZGVjLmNvbmZpZwk9IGN0eC0+Y29uZmlnOworCWluc3QtPnZkZWMuY3R4CQk9IGN0eDsKKwlpbnN0LT5jdHgJCT0gY3R4OworCisJdmRlY19wYXJzZXJfcGFybXMoaW5zdCk7CisKKwkvKiBzZXQgcGxheSBtb2RlLiovCisJaWYgKGN0eC0+aXNfZHJtX21vZGUpCisJCWluc3QtPnZkZWMucG9ydC5mbGFnIHw9IFBPUlRfRkxBR19EUk07CisKKwkvKiB0byBlYWJsZSBtcGVnMTIgaHcuKi8KKwlpbnN0LT52ZGVjLnBvcnQudHlwZSA9IFBPUlRfVFlQRV9WSURFTzsKKworCS8qIHByb2JlIGluZm8gZnJvbSB0aGUgc3RyZWFtICovCisJaW5zdC0+dnNpID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZkZWNfbXBlZzEyX3ZzaSksIEdGUF9LRVJORUwpOworCWlmICghaW5zdC0+dnNpKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCS8qIGFsbG9jIHRoZSBoZWFkZXIgYnVmZmVyIHRvIGJlIHVzZWQgY2FjaGUgc3BzIG9yIHNwcCBldGMuKi8KKwlpbnN0LT52c2ktPmhlYWRlcl9idWYgPSB2emFsbG9jKEhFQURFUl9CVUZGRVJfU0laRSk7CisJaWYgKCFpbnN0LT52c2ktPmhlYWRlcl9idWYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJaW5pdF9jb21wbGV0aW9uKCZpbnN0LT5jb21wKTsKKwljdHgtPmFkYV9jdHgJPSAmaW5zdC0+dmRlYzsKKwkqaF92ZGVjCQk9ICh1bnNpZ25lZCBsb25nKWluc3Q7CisKKwlyZXQgPSB2aWRlb19kZWNvZGVyX2luaXQoJmluc3QtPnZkZWMpOworCWlmIChyZXQpIHsKKwkJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJ2ZGVjX21wZWcxMiBpbml0IGVycj0lZFxuIiwgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19QUklORk8sCisJCSJtcGVnMTIgSW5zdGFuY2UgPj4gJWx4XG4iLCAodWxvbmcpIGluc3QpOworCisJcmV0dXJuIDA7CisKK2VycjoKKwlpZiAoaW5zdCAmJiBpbnN0LT52c2kgJiYgaW5zdC0+dnNpLT5oZWFkZXJfYnVmKQorCQl2ZnJlZShpbnN0LT52c2ktPmhlYWRlcl9idWYpOworCWlmIChpbnN0ICYmIGluc3QtPnZzaSkKKwkJa2ZyZWUoaW5zdC0+dnNpKTsKKwlpZiAoaW5zdCkKKwkJa2ZyZWUoaW5zdCk7CisJKmhfdmRlYyA9IDA7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBmaWxsX3ZkZWNfcGFyYW1zKHN0cnVjdCB2ZGVjX21wZWcxMl9pbnN0ICppbnN0LAorCXN0cnVjdCBNcHZQYXJzZUNvbnRleHQgKmRlY19wcykKK3sKKwlzdHJ1Y3QgdmRlY19waWNfaW5mbyAqcGljID0gJmluc3QtPnZzaS0+cGljOworCXN0cnVjdCB2ZGVjX21wZWcxMl9kZWNfaW5mbyAqZGVjID0gJmluc3QtPnZzaS0+ZGVjOworCXN0cnVjdCB2NGwyX3JlY3QgKnJlY3QgPSAmaW5zdC0+dnNpLT5jcm9wOworCisJLyogZmlsbCB2aXNpYmxlIGFyZWEgc2l6ZSB0aGF0IGJlIHVzZWQgZm9yIEVHTC4gKi8KKwlwaWMtPnZpc2libGVfd2lkdGgJPSBkZWNfcHMtPndpZHRoOworCXBpYy0+dmlzaWJsZV9oZWlnaHQJPSBkZWNfcHMtPmhlaWdodDsKKworCS8qIGNhbGMgdmlzaWJsZSBhcmVzLiAqLworCXJlY3QtPmxlZnQJCT0gMDsKKwlyZWN0LT50b3AJCT0gMDsKKwlyZWN0LT53aWR0aAkJPSBwaWMtPnZpc2libGVfd2lkdGg7CisJcmVjdC0+aGVpZ2h0CQk9IHBpYy0+dmlzaWJsZV9oZWlnaHQ7CisKKwkvKiBjb25maWcgY2FudmFzIHNpemUgdGhhdCBiZSB1c2VkIGZvciBkZWNvZGVyLiAqLworCXBpYy0+Y29kZWRfd2lkdGgJPSBBTElHTihkZWNfcHMtPmNvZGVkX3dpZHRoLCA2NCk7CisJcGljLT5jb2RlZF9oZWlnaHQJPSBBTElHTihkZWNfcHMtPmNvZGVkX2hlaWdodCwgMzIpOworCisJcGljLT55X2xlbl9zegkJPSBwaWMtPmNvZGVkX3dpZHRoICogcGljLT5jb2RlZF9oZWlnaHQ7CisJcGljLT5jX2xlbl9zegkJPSBwaWMtPnlfbGVuX3N6ID4+IDE7CisKKwkvKjcocGFybV92NGxfYnVmZmVyX21hcmdpbikgKyA4KERFQ09ERV9CVUZGRVJfTlVNX0RFRikqLworCWRlYy0+ZHBiX3N6ID0gMTU7CisKKwl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0JVRk1HUiwKKwkJIlRoZSBzdHJlYW0gaW5mb3MsIGNvZGVkOiglZCB4ICVkKSwgdmlzaWJsZTooJWQgeCAlZCksIERQQjogJWRcbiIsCisJCXBpYy0+Y29kZWRfd2lkdGgsIHBpYy0+Y29kZWRfaGVpZ2h0LAorCQlwaWMtPnZpc2libGVfd2lkdGgsIHBpYy0+dmlzaWJsZV9oZWlnaHQsIGRlYy0+ZHBiX3N6KTsKK30KKworc3RhdGljIGludCBwYXJzZV9zdHJlYW1fdWNvZGUoc3RydWN0IHZkZWNfbXBlZzEyX2luc3QgKmluc3QsCisJCQkgICAgICB1OCAqYnVmLCB1MzIgc2l6ZSwgdTY0IHRpbWVzdGFtcCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYW1sX3ZkZWNfYWRhcHQgKnZkZWMgPSAmaW5zdC0+dmRlYzsKKworCXJldCA9IHZkZWNfdmZyYW1lX3dyaXRlKHZkZWMsIGJ1Ziwgc2l6ZSwgdGltZXN0YW1wLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJIndyaXRlIGZyYW1lIGRhdGEgZmFpbGVkLiBlcnI6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIHdhaXQgdWNvZGUgcGFyc2UgZW5kaW5nLiAqLworCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaW5zdC0+Y29tcCwKKwkJbXNlY3NfdG9famlmZmllcygxMDAwKSk7CisKKwlyZXR1cm4gaW5zdC0+dnNpLT5waWMuZHBiX2ZyYW1lcyA/IDAgOiAtMTsKK30KKworc3RhdGljIGludCBwYXJzZV9zdHJlYW1fdWNvZGVfZG1hKHN0cnVjdCB2ZGVjX21wZWcxMl9pbnN0ICppbnN0LAorCXVsb25nIGJ1ZiwgdTMyIHNpemUsIHU2NCB0aW1lc3RhbXAsIHUzMiBoYW5kbGUpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGFtbF92ZGVjX2FkYXB0ICp2ZGVjID0gJmluc3QtPnZkZWM7CisKKwlyZXQgPSB2ZGVjX3ZmcmFtZV93cml0ZV93aXRoX2RtYSh2ZGVjLCBidWYsIHNpemUsIHRpbWVzdGFtcCwgaGFuZGxlLAorCQl2ZGVjX3ZmcmFtZV9pbnB1dF9mcmVlLCBpbnN0LT5jdHgpOworCWlmIChyZXQgPCAwKSB7CisJCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkid3JpdGUgZnJhbWUgZGF0YSBmYWlsZWQuIGVycjogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogd2FpdCB1Y29kZSBwYXJzZSBlbmRpbmcuICovCisJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpbnN0LT5jb21wLAorCQltc2Vjc190b19qaWZmaWVzKDEwMDApKTsKKworCXJldHVybiBpbnN0LT52c2ktPnBpYy5kcGJfZnJhbWVzID8gMCA6IC0xOworfQorCitzdGF0aWMgaW50IHBhcnNlX3N0cmVhbV9jcHUoc3RydWN0IHZkZWNfbXBlZzEyX2luc3QgKmluc3QsIHU4ICpidWYsIHUzMiBzaXplKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBtcGVnMTJfcGFyYW1fc2V0cyAqcHMgPSBOVUxMOworCisJcHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXBlZzEyX3BhcmFtX3NldHMpLCBHRlBfS0VSTkVMKTsKKwlpZiAocHMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBtcGVnMTJfZGVjb2RlX2V4dHJhZGF0YV9wcyhidWYsIHNpemUsIHBzKTsKKwlpZiAocmV0KSB7CisJCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkicGFyc2UgZXh0cmEgZGF0YSBmYWlsZWQuIGVycjogJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChwcy0+aGVhZF9wYXJzZWQpCisJCWZpbGxfdmRlY19wYXJhbXMoaW5zdCwgJnBzLT5kZWNfcHMpOworCisJcmV0ID0gcHMtPmhlYWRfcGFyc2VkID8gMCA6IC0xOworb3V0OgorCWtmcmVlKHBzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmRlY19tcGVnMTJfcHJvYmUodW5zaWduZWQgbG9uZyBoX3ZkZWMsCisJc3RydWN0IGFtbF92Y29kZWNfbWVtICpicywgdm9pZCAqb3V0KQoreworCXN0cnVjdCB2ZGVjX21wZWcxMl9pbnN0ICppbnN0ID0KKwkJKHN0cnVjdCB2ZGVjX21wZWcxMl9pbnN0ICopaF92ZGVjOworCXU4ICpidWYgPSAodTggKilicy0+dmFkZHI7CisJdTMyIHNpemUgPSBicy0+c2l6ZTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChpbnN0LT5jdHgtPmlzX2RybV9tb2RlKSB7CisJCWlmIChicy0+bW9kZWwgPT0gVkIyX01FTU9SWV9NTUFQKSB7CisJCQlzdHJ1Y3QgYW1sX3ZpZGVvX3N0cmVhbSAqcyA9CisJCQkJKHN0cnVjdCBhbWxfdmlkZW9fc3RyZWFtICopIGJ1ZjsKKworCQkJaWYgKChzLT5tYWdpYyAhPSBBTUxfVklERU9fTUFHSUMpICYmCisJCQkJKHMtPnR5cGUgIT0gVjRMX1NUUkVBTV9UWVBFX01BVEVEQVRBKSkKKwkJCQlyZXR1cm4gLTE7CisKKwkJCWlmIChpbnN0LT5jdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSkgeworCQkJCXJldCA9IHBhcnNlX3N0cmVhbV91Y29kZShpbnN0LCBzLT5kYXRhLAorCQkJCQlzLT5sZW4sIGJzLT50aW1lc3RhbXApOworCQkJfSBlbHNlIHsKKwkJCQlyZXQgPSBwYXJzZV9zdHJlYW1fY3B1KGluc3QsIHMtPmRhdGEsIHMtPmxlbik7CisJCQl9CisJCX0gZWxzZSBpZiAoYnMtPm1vZGVsID09IFZCMl9NRU1PUllfRE1BQlVGIHx8CisJCQlicy0+bW9kZWwgPT0gVkIyX01FTU9SWV9VU0VSUFRSKSB7CisJCQlyZXQgPSBwYXJzZV9zdHJlYW1fdWNvZGVfZG1hKGluc3QsIGJzLT5hZGRyLCBzaXplLAorCQkJCWJzLT50aW1lc3RhbXAsIEJVRkZfSURYKGJzLCBicy0+aW5kZXgpKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChpbnN0LT5jdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSkgeworCQkJcmV0ID0gcGFyc2Vfc3RyZWFtX3Vjb2RlKGluc3QsIGJ1Ziwgc2l6ZSwgYnMtPnRpbWVzdGFtcCk7CisJCX0gZWxzZSB7CisJCQlyZXQgPSBwYXJzZV9zdHJlYW1fY3B1KGluc3QsIGJ1Ziwgc2l6ZSk7CisJCX0KKwl9CisKKwlpbnN0LT52c2ktPmN1cl9waWMgPSBpbnN0LT52c2ktPnBpYzsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHZkZWNfbXBlZzEyX2RlaW5pdCh1bnNpZ25lZCBsb25nIGhfdmRlYykKK3sKKwlzdHJ1Y3QgdmRlY19tcGVnMTJfaW5zdCAqaW5zdCA9IChzdHJ1Y3QgdmRlY19tcGVnMTJfaW5zdCAqKWhfdmRlYzsKKworCWlmICghaW5zdCkKKwkJcmV0dXJuOworCisJdmlkZW9fZGVjb2Rlcl9yZWxlYXNlKCZpbnN0LT52ZGVjKTsKKworCWlmIChpbnN0LT52c2kgJiYgaW5zdC0+dnNpLT5oZWFkZXJfYnVmKQorCQl2ZnJlZShpbnN0LT52c2ktPmhlYWRlcl9idWYpOworCisJaWYgKGluc3QtPnZzaSkKKwkJa2ZyZWUoaW5zdC0+dnNpKTsKKworCWtmcmVlKGluc3QpOworfQorCitzdGF0aWMgaW50IHZkZWNfd3JpdGVfbmFsdShzdHJ1Y3QgdmRlY19tcGVnMTJfaW5zdCAqaW5zdCwKKwl1OCAqYnVmLCB1MzIgc2l6ZSwgdTY0IHRzKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhbWxfdmRlY19hZGFwdCAqdmRlYyA9ICZpbnN0LT52ZGVjOworCisJcmV0ID0gdmRlY192ZnJhbWVfd3JpdGUodmRlYywgYnVmLCBzaXplLCB0cywgMCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZkZWNfbXBlZzEyX2RlY29kZSh1bnNpZ25lZCBsb25nIGhfdmRlYywKKwkJCSAgICAgIHN0cnVjdCBhbWxfdmNvZGVjX21lbSAqYnMsIGJvb2wgKnJlc19jaGcpCit7CisJc3RydWN0IHZkZWNfbXBlZzEyX2luc3QgKmluc3QgPSAoc3RydWN0IHZkZWNfbXBlZzEyX2luc3QgKiloX3ZkZWM7CisJc3RydWN0IGFtbF92ZGVjX2FkYXB0ICp2ZGVjID0gJmluc3QtPnZkZWM7CisJdTggKmJ1ZiA9ICh1OCAqKSBicy0+dmFkZHI7CisJdTMyIHNpemUgPSBicy0+c2l6ZTsKKwlpbnQgcmV0ID0gLTE7CisKKwlpZiAodmRlY19pbnB1dF9mdWxsKHZkZWMpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWlmIChpbnN0LT5jdHgtPmlzX2RybV9tb2RlKSB7CisJCWlmIChicy0+bW9kZWwgPT0gVkIyX01FTU9SWV9NTUFQKSB7CisJCQlzdHJ1Y3QgYW1sX3ZpZGVvX3N0cmVhbSAqcyA9CisJCQkJKHN0cnVjdCBhbWxfdmlkZW9fc3RyZWFtICopIGJ1ZjsKKworCQkJaWYgKHMtPm1hZ2ljICE9IEFNTF9WSURFT19NQUdJQykKKwkJCQlyZXR1cm4gLTE7CisKKwkJCXJldCA9IHZkZWNfdmZyYW1lX3dyaXRlKHZkZWMsCisJCQkJcy0+ZGF0YSwKKwkJCQlzLT5sZW4sCisJCQkJYnMtPnRpbWVzdGFtcCwKKwkJCQkwKTsKKwkJfSBlbHNlIGlmIChicy0+bW9kZWwgPT0gVkIyX01FTU9SWV9ETUFCVUYgfHwKKwkJCWJzLT5tb2RlbCA9PSBWQjJfTUVNT1JZX1VTRVJQVFIpIHsKKwkJCXJldCA9IHZkZWNfdmZyYW1lX3dyaXRlX3dpdGhfZG1hKHZkZWMsCisJCQkJYnMtPmFkZHIsIHNpemUsIGJzLT50aW1lc3RhbXAsCisJCQkJQlVGRl9JRFgoYnMsIGJzLT5pbmRleCksCisJCQkJdmRlY192ZnJhbWVfaW5wdXRfZnJlZSwgaW5zdC0+Y3R4KTsKKwkJfQorCX0gZWxzZSB7CisJCXJldCA9IHZkZWNfd3JpdGVfbmFsdShpbnN0LCBidWYsIHNpemUsIGJzLT50aW1lc3RhbXApOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9wYXJhbV9jb25maWdfaW5mbyhzdHJ1Y3QgdmRlY19tcGVnMTJfaW5zdCAqaW5zdCwKKyAgc3RydWN0IGFtbF9kZWNfcGFyYW1zICpwYXJtcykKK3sKKworCWlmIChpbnN0LT5wYXJtcy5wYXJtc19zdGF0dXMgJiBWNEwyX0NPTkZJR19QQVJNX0RFQ09ERV9IRFJJTkZPKQorCQlwYXJtcy0+aGRyID0gaW5zdC0+cGFybXMuaGRyOworCisJcGFybXMtPnBhcm1zX3N0YXR1cyB8PSBpbnN0LT5wYXJtcy5wYXJtc19zdGF0dXM7CisKKwl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX1BSSU5GTywKKwkJInBhcm1zIHN0YXR1czogJXVcbiIsIHBhcm1zLT5wYXJtc19zdGF0dXMpOworfQorCitzdGF0aWMgaW50IHZkZWNfbXBlZzEyX2dldF9wYXJhbSh1bnNpZ25lZCBsb25nIGhfdmRlYywKKwkJCSAgICAgICBlbnVtIHZkZWNfZ2V0X3BhcmFtX3R5cGUgdHlwZSwgdm9pZCAqb3V0KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCB2ZGVjX21wZWcxMl9pbnN0ICppbnN0ID0gKHN0cnVjdCB2ZGVjX21wZWcxMl9pbnN0ICopaF92ZGVjOworCisJaWYgKCFpbnN0KSB7CisJCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkidGhlIG1wZWcxMiBpbnN0IG9mIGRlYyBpcyBpbnZhbGlkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEdFVF9QQVJBTV9QSUNfSU5GTzoKKwkJZ2V0X3BpY19pbmZvKGluc3QsIG91dCk7CisJCWJyZWFrOworCisJY2FzZSBHRVRfUEFSQU1fRFBCX1NJWkU6CisJCWdldF9kcGJfc2l6ZShpbnN0LCBvdXQpOworCQlicmVhazsKKworCWNhc2UgR0VUX1BBUkFNX0NST1BfSU5GTzoKKwkJZ2V0X2Nyb3BfaW5mbyhpbnN0LCBvdXQpOworCQlicmVhazsKKworCWNhc2UgR0VUX1BBUkFNX0NPTkZJR19JTkZPOgorCQlnZXRfcGFyYW1fY29uZmlnX2luZm8oaW5zdCwgb3V0KTsKKwkJYnJlYWs7CisKKwljYXNlIEdFVF9QQVJBTV9EV19NT0RFOgorCXsKKwkJdW5zaWduZWQgaW50KiBtb2RlID0gb3V0OworCQkqbW9kZSA9IFZERUNfRFdfTk9fQUZCQzsKKwkJYnJlYWs7CisJfQorCisJZGVmYXVsdDoKKwkJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJpbnZhbGlkIGdldCBwYXJhbWV0ZXIgdHlwZT0lZFxuIiwgdHlwZSk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgc2V0X3BhcmFtX3dyaXRlX3N5bmMoc3RydWN0IHZkZWNfbXBlZzEyX2luc3QgKmluc3QpCit7CisJY29tcGxldGUoJmluc3QtPmNvbXApOworfQorCitzdGF0aWMgdm9pZCBzZXRfcGljX2luZm8oc3RydWN0IHZkZWNfbXBlZzEyX2luc3QgKmluc3QsCisJc3RydWN0IHZkZWNfcGljX2luZm8gKnBpYykKK3sKKwlpbnN0LT52c2ktPnBpYyA9ICpwaWM7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9wYXJhbV9wc19pbmZvKHN0cnVjdCB2ZGVjX21wZWcxMl9pbnN0ICppbnN0LAorCXN0cnVjdCBhbWxfdmRlY19wc19pbmZvcyAqcHMpCit7CisJc3RydWN0IHZkZWNfcGljX2luZm8gKnBpYyA9ICZpbnN0LT52c2ktPnBpYzsKKwlzdHJ1Y3QgdmRlY19tcGVnMTJfZGVjX2luZm8gKmRlYyA9ICZpbnN0LT52c2ktPmRlYzsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0ID0gJmluc3QtPnZzaS0+Y3JvcDsKKworCS8qIGZpbGwgdmlzaWJsZSBhcmVhIHNpemUgdGhhdCBiZSB1c2VkIGZvciBFR0wuICovCisJcGljLT52aXNpYmxlX3dpZHRoCT0gcHMtPnZpc2libGVfd2lkdGg7CisJcGljLT52aXNpYmxlX2hlaWdodAk9IHBzLT52aXNpYmxlX2hlaWdodDsKKworCS8qIGNhbGMgdmlzaWJsZSBhcmVzLiAqLworCXJlY3QtPmxlZnQJCT0gMDsKKwlyZWN0LT50b3AJCT0gMDsKKwlyZWN0LT53aWR0aAkJPSBwaWMtPnZpc2libGVfd2lkdGg7CisJcmVjdC0+aGVpZ2h0CQk9IHBpYy0+dmlzaWJsZV9oZWlnaHQ7CisKKwkvKiBjb25maWcgY2FudmFzIHNpemUgdGhhdCBiZSB1c2VkIGZvciBkZWNvZGVyLiAqLworCXBpYy0+Y29kZWRfd2lkdGgJPSBwcy0+Y29kZWRfd2lkdGg7CisJcGljLT5jb2RlZF9oZWlnaHQJPSBwcy0+Y29kZWRfaGVpZ2h0OworCXBpYy0+eV9sZW5fc3oJCT0gcGljLT5jb2RlZF93aWR0aCAqIHBpYy0+Y29kZWRfaGVpZ2h0OworCXBpYy0+Y19sZW5fc3oJCT0gcGljLT55X2xlbl9zeiA+PiAxOworCisJcGljLT5kcGJfZnJhbWVzCQk9IHBzLT5kcGJfZnJhbWVzOworCXBpYy0+ZHBiX21hcmdpbgkJPSBwcy0+ZHBiX21hcmdpbjsKKwlwaWMtPnZwcF9tYXJnaW4JCT0gcHMtPmRwYl9tYXJnaW47CisJZGVjLT5kcGJfc3oJCT0gcHMtPmRwYl9zaXplOworCXBpYy0+ZmllbGQJCT0gcHMtPmZpZWxkOworCisJaW5zdC0+cGFybXMucHMgCT0gKnBzOworCWluc3QtPnBhcm1zLnBhcm1zX3N0YXR1cyB8PQorCQlWNEwyX0NPTkZJR19QQVJNX0RFQ09ERV9QU0lORk87CisKKwkvKndha2UgdXAqLworCWNvbXBsZXRlKCZpbnN0LT5jb21wKTsKKworCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfUFJJTkZPLAorCQkiUGFyc2UgZnJvbSB1Y29kZSwgdmlzaWJsZSglZCB4ICVkKSwgY29kZWQoJWQgeCAlZCksIHNjYW46JXNcbiIsCisJCXBzLT52aXNpYmxlX3dpZHRoLCBwcy0+dmlzaWJsZV9oZWlnaHQsCisJCXBzLT5jb2RlZF93aWR0aCwgcHMtPmNvZGVkX2hlaWdodCwKKwkJcGljLT5maWVsZCA9PSBWNEwyX0ZJRUxEX05PTkUgPyAiUCIgOiAiSSIpOworfQorCitzdGF0aWMgdm9pZCBzZXRfcGFyYW1faGRyX2luZm8oc3RydWN0IHZkZWNfbXBlZzEyX2luc3QgKmluc3QsCisJc3RydWN0IGFtbF92ZGVjX2hkcl9pbmZvcyAqaGRyKQoreworCWluc3QtPnBhcm1zLmhkciA9ICpoZHI7CisJaWYgKCEoaW5zdC0+cGFybXMucGFybXNfc3RhdHVzICYKKwkJVjRMMl9DT05GSUdfUEFSTV9ERUNPREVfSERSSU5GTykpIHsKKwkJaW5zdC0+cGFybXMuaGRyID0gKmhkcjsKKwkJaW5zdC0+cGFybXMucGFybXNfc3RhdHVzIHw9CisJCQlWNEwyX0NPTkZJR19QQVJNX0RFQ09ERV9IRFJJTkZPOworCQlhbWxfdmRlY19kaXNwYXRjaF9ldmVudChpbnN0LT5jdHgsCisJCQlWNEwyX0VWRU5UX1NSQ19DSF9IRFJJTkZPKTsKKwkJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19QUklORk8sCisJCQkibXBlZzEyIHNldCBIRFIgaW5mb3NcbiIpOworCX0KK30KKworc3RhdGljIGludCB2ZGVjX21wZWcxMl9zZXRfcGFyYW0odW5zaWduZWQgbG9uZyBoX3ZkZWMsCisJZW51bSB2ZGVjX3NldF9wYXJhbV90eXBlIHR5cGUsIHZvaWQgKmluKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCB2ZGVjX21wZWcxMl9pbnN0ICppbnN0ID0gKHN0cnVjdCB2ZGVjX21wZWcxMl9pbnN0ICopaF92ZGVjOworCisJaWYgKCFpbnN0KSB7CisJCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkidGhlIG1wZWcxMiBpbnN0IG9mIGRlYyBpcyBpbnZhbGlkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNFVF9QQVJBTV9XUklURV9GUkFNRV9TWU5DOgorCQlzZXRfcGFyYW1fd3JpdGVfc3luYyhpbnN0KTsKKwkJYnJlYWs7CisKKwljYXNlIFNFVF9QQVJBTV9IRFJfSU5GTzoKKwkJc2V0X3BhcmFtX2hkcl9pbmZvKGluc3QsIGluKTsKKwkJYnJlYWs7CisKKwljYXNlIFNFVF9QQVJBTV9QU19JTkZPOgorCQlzZXRfcGFyYW1fcHNfaW5mbyhpbnN0LCBpbik7CisJCWJyZWFrOworCisJY2FzZSBTRVRfUEFSQU1fUElDX0lORk86CisJCXNldF9waWNfaW5mbyhpbnN0LCBpbik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJpbnZhbGlkIHNldCBwYXJhbWV0ZXIgdHlwZT0lZFxuIiwgdHlwZSk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCB2ZGVjX2NvbW1vbl9pZiB2ZGVjX21wZWcxMl9pZiA9IHsKKwkuaW5pdAkJPSB2ZGVjX21wZWcxMl9pbml0LAorCS5wcm9iZQkJPSB2ZGVjX21wZWcxMl9wcm9iZSwKKwkuZGVjb2RlCQk9IHZkZWNfbXBlZzEyX2RlY29kZSwKKwkuZ2V0X3BhcmFtCT0gdmRlY19tcGVnMTJfZ2V0X3BhcmFtLAorCS5zZXRfcGFyYW0JPSB2ZGVjX21wZWcxMl9zZXRfcGFyYW0sCisJLmRlaW5pdAkJPSB2ZGVjX21wZWcxMl9kZWluaXQsCit9OworCitzdHJ1Y3QgdmRlY19jb21tb25faWYgKmdldF9tcGVnMTJfZGVjX2NvbW1faWYodm9pZCk7CisKK3N0cnVjdCB2ZGVjX2NvbW1vbl9pZiAqZ2V0X21wZWcxMl9kZWNfY29tbV9pZih2b2lkKQoreworCXJldHVybiAmdmRlY19tcGVnMTJfaWY7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FtdmRlY19wb3J0cy9kZWNvZGVyL3ZkZWNfbXBlZzRfaWYuYyBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2RlY29kZXIvdmRlY19tcGVnNF9pZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMGFmMjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FtdmRlY19wb3J0cy9kZWNvZGVyL3ZkZWNfbXBlZzRfaWYuYwpAQCAtMCwwICsxLDYxNSBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE3IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyogbW9yZSBkZXRhaWxzLgorKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKgorKiBEZXNjcmlwdGlvbjoKKyovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L3N3YWIuaD4KKyNpbmNsdWRlICIuLi92ZGVjX2Rydl9pZi5oIgorI2luY2x1ZGUgIi4uL2FtbF92Y29kZWNfdXRpbC5oIgorI2luY2x1ZGUgIi4uL2FtbF92Y29kZWNfZGVjLmgiCisjaW5jbHVkZSAiLi4vYW1sX3Zjb2RlY19hZGFwdC5oIgorI2luY2x1ZGUgIi4uL3ZkZWNfZHJ2X2Jhc2UuaCIKKyNpbmNsdWRlICJhbWxfbXBlZzRfcGFyc2VyLmgiCisKKyNkZWZpbmUgTkFMX1RZUEUodmFsdWUpCQkJCSgodmFsdWUpICYgMHgxRikKKyNkZWZpbmUgSEVBREVSX0JVRkZFUl9TSVpFCQkJKDMyICogMTAyNCkKKworLyoqCisgKiBzdHJ1Y3QgbXBlZzRfZmIgLSBtcGVnNCBkZWNvZGUgZnJhbWUgYnVmZmVyIGluZm9ybWF0aW9uCisgKiBAdmRlY19mYl92YSAgOiB2aXJ0dWFsIGFkZHJlc3Mgb2Ygc3RydWN0IHZkZWNfZmIKKyAqIEB5X2ZiX2RtYSAgICA6IGRtYSBhZGRyZXNzIG9mIFkgZnJhbWUgYnVmZmVyIChsdW1hKQorICogQGNfZmJfZG1hICAgIDogZG1hIGFkZHJlc3Mgb2YgQyBmcmFtZSBidWZmZXIgKGNocm9tYSkKKyAqIEBwb2MgICAgICAgICA6IHBpY3R1cmUgb3JkZXIgY291bnQgb2YgZnJhbWUgYnVmZmVyCisgKiBAcmVzZXJ2ZWQgICAgOiBmb3IgOCBieXRlcyBhbGlnbm1lbnQKKyAqLworc3RydWN0IG1wZWc0X2ZiIHsKKwl1aW50NjRfdCB2ZGVjX2ZiX3ZhOworCXVpbnQ2NF90IHlfZmJfZG1hOworCXVpbnQ2NF90IGNfZmJfZG1hOworCWludDMyX3QgcG9jOworCXVpbnQzMl90IHJlc2VydmVkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdmRlY19tcGVnNF9kZWNfaW5mbyAtIGRlY29kZSBpbmZvcm1hdGlvbgorICogQGRwYl9zegkJOiBkZWNvZGluZyBwaWN0dXJlIGJ1ZmZlciBzaXplCisgKiBAcmVzb2x1dGlvbl9jaGFuZ2VkICA6IHJlc29sdGlvbiBjaGFuZ2UgaGFwcGVuCisgKiBAcmVzZXJ2ZWQJCTogZm9yIDggYnl0ZXMgYWxpZ25tZW50CisgKiBAYnNfZG1hCQk6IElucHV0IGJpdC1zdHJlYW0gYnVmZmVyIGRtYSBhZGRyZXNzCisgKiBAeV9mYl9kbWEJCTogWSBmcmFtZSBidWZmZXIgZG1hIGFkZHJlc3MKKyAqIEBjX2ZiX2RtYQkJOiBDIGZyYW1lIGJ1ZmZlciBkbWEgYWRkcmVzcworICogQHZkZWNfZmJfdmEJCTogVkRFQyBmcmFtZSBidWZmZXIgc3RydWN0IHZpcnR1YWwgYWRkcmVzcworICovCitzdHJ1Y3QgdmRlY19tcGVnNF9kZWNfaW5mbyB7CisJdWludDMyX3QgZHBiX3N6OworCXVpbnQzMl90IHJlc29sdXRpb25fY2hhbmdlZDsKKwl1aW50MzJfdCByZXNlcnZlZDsKKwl1aW50NjRfdCBic19kbWE7CisJdWludDY0X3QgeV9mYl9kbWE7CisJdWludDY0X3QgY19mYl9kbWE7CisJdWludDY0X3QgdmRlY19mYl92YTsKK307CisKKy8qKgorICogc3RydWN0IHZkZWNfbXBlZzRfdnNpIC0gc2hhcmVkIG1lbW9yeSBmb3IgZGVjb2RlIGluZm9ybWF0aW9uIGV4Y2hhbmdlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gVlBVIGFuZCBIb3N0LgorICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWVtb3J5IGlzIGFsbG9jYXRlZCBieSBWUFUgdGhlbiBtYXBwaW5nIHRvIEhvc3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgaW4gdnB1X2RlY19pbml0KCkgYW5kIGZyZWVkIGluIHZwdV9kZWNfZGVpbml0KCkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYnkgVlBVLgorICogICAgICAgICAgICAgICAgICAgICAgICBBUC1XL1IgOiBBUCBpcyB3cml0ZXIvcmVhZGVyIG9uIHRoaXMgaXRlbQorICogICAgICAgICAgICAgICAgICAgICAgICBWUFUtVy9SOiBWUFUgaXMgd3JpdGUvcmVhZGVyIG9uIHRoaXMgaXRlbQorICogQGhkcl9idWYgICAgICA6IEhlYWRlciBwYXJzaW5nIGJ1ZmZlciAoQVAtVywgVlBVLVIpCisgKiBAbGlzdF9mcmVlICAgIDogZnJlZSBmcmFtZSBidWZmZXIgcmluZyBsaXN0IChBUC1XL1IsIFZQVS1XKQorICogQGxpc3RfZGlzcCAgICA6IGRpc3BsYXkgZnJhbWUgYnVmZmVyIHJpbmcgbGlzdCAoQVAtUiwgVlBVLVcpCisgKiBAZGVjICAgICAgICAgIDogZGVjb2RlIGluZm9ybWF0aW9uIChBUC1SLCBWUFUtVykKKyAqIEBwaWMgICAgICAgICAgOiBwaWN0dXJlIGluZm9ybWF0aW9uIChBUC1SLCBWUFUtVykKKyAqIEBjcm9wICAgICAgICAgOiBjcm9wIGluZm9ybWF0aW9uIChBUC1SLCBWUFUtVykKKyAqLworc3RydWN0IHZkZWNfbXBlZzRfdnNpIHsKKwljaGFyICpoZWFkZXJfYnVmOworCWludCBzcHNfc2l6ZTsKKwlpbnQgcHBzX3NpemU7CisJaW50IHNlaV9zaXplOworCWludCBoZWFkX29mZnNldDsKKwlzdHJ1Y3QgdmRlY19tcGVnNF9kZWNfaW5mbyBkZWM7CisJc3RydWN0IHZkZWNfcGljX2luZm8gcGljOworCXN0cnVjdCB2ZGVjX3BpY19pbmZvIGN1cl9waWM7CisJc3RydWN0IHY0bDJfcmVjdCBjcm9wOworCWJvb2wgaXNfY29tYmluZTsKKwlpbnQgbmFsdV9wb3M7CisJLy9zdHJ1Y3QgbXBlZzRQYXJhbVNldHMgcHM7Cit9OworCisvKioKKyAqIHN0cnVjdCB2ZGVjX21wZWc0X2luc3QgLSBtcGVnNCBkZWNvZGVyIGluc3RhbmNlCisgKiBAbnVtX25hbHUgOiBob3cgbWFueSBuYWx1cyBiZSBkZWNvZGVkCisgKiBAY3R4ICAgICAgOiBwb2ludCB0byBhbWxfdmNvZGVjX2N0eAorICogQHZzaSAgICAgIDogVlBVIHNoYXJlZCBpbmZvcm1hdGlvbgorICovCitzdHJ1Y3QgdmRlY19tcGVnNF9pbnN0IHsKKwl1bnNpZ25lZCBpbnQgbnVtX25hbHU7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHg7CisJc3RydWN0IGFtbF92ZGVjX2FkYXB0IHZkZWM7CisJc3RydWN0IHZkZWNfbXBlZzRfdnNpICp2c2k7CisJc3RydWN0IGFtbF9kZWNfcGFyYW1zIHBhcm1zOworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXA7Cit9OworCitzdGF0aWMgdm9pZCBnZXRfcGljX2luZm8oc3RydWN0IHZkZWNfbXBlZzRfaW5zdCAqaW5zdCwKKwkJCSBzdHJ1Y3QgdmRlY19waWNfaW5mbyAqcGljKQoreworCSpwaWMgPSBpbnN0LT52c2ktPnBpYzsKKworCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVhJTkZPLAorCQkicGljKCVkLCAlZCksIGJ1ZiglZCwgJWQpXG4iLAorCQkgcGljLT52aXNpYmxlX3dpZHRoLCBwaWMtPnZpc2libGVfaGVpZ2h0LAorCQkgcGljLT5jb2RlZF93aWR0aCwgcGljLT5jb2RlZF9oZWlnaHQpOworCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVhJTkZPLAorCQkiWSglZCwgJWQpLCBDKCVkLCAlZClcbiIsCisJCXBpYy0+eV9ic19zeiwgcGljLT55X2xlbl9zeiwKKwkJcGljLT5jX2JzX3N6LCBwaWMtPmNfbGVuX3N6KTsKK30KKworc3RhdGljIHZvaWQgZ2V0X2Nyb3BfaW5mbyhzdHJ1Y3QgdmRlY19tcGVnNF9pbnN0ICppbnN0LCBzdHJ1Y3QgdjRsMl9yZWN0ICpjcikKK3sKKwljci0+bGVmdCA9IGluc3QtPnZzaS0+Y3JvcC5sZWZ0OworCWNyLT50b3AgPSBpbnN0LT52c2ktPmNyb3AudG9wOworCWNyLT53aWR0aCA9IGluc3QtPnZzaS0+Y3JvcC53aWR0aDsKKwljci0+aGVpZ2h0ID0gaW5zdC0+dnNpLT5jcm9wLmhlaWdodDsKKworCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVhJTkZPLAorCQkibD0lZCwgdD0lZCwgdz0lZCwgaD0lZFxuIiwKKwkJIGNyLT5sZWZ0LCBjci0+dG9wLCBjci0+d2lkdGgsIGNyLT5oZWlnaHQpOworfQorCitzdGF0aWMgdm9pZCBnZXRfZHBiX3NpemUoc3RydWN0IHZkZWNfbXBlZzRfaW5zdCAqaW5zdCwgdW5zaWduZWQgaW50ICpkcGJfc3opCit7CisJKmRwYl9zeiA9IGluc3QtPnZzaS0+ZGVjLmRwYl9zejsKKwl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywgInN6PSVkXG4iLCAqZHBiX3N6KTsKK30KKworc3RhdGljIHUzMiB2ZGVjX2NvbmZpZ19kZWZhdWx0X3Bhcm1zKHU4ICpwYXJtKQoreworCXU4ICpwYnVmID0gcGFybTsKKworCXBidWYgKz0gc3ByaW50ZihwYnVmLCAicGFybV92NGxfY29kZWNfZW5hYmxlOjE7Iik7CisJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJwYXJtX3Y0bF9jYW52YXNfbWVtX21vZGU6MDsiKTsKKwlwYnVmICs9IHNwcmludGYocGJ1ZiwgInBhcm1fdjRsX2J1ZmZlcl9tYXJnaW46MDsiKTsKKworCXJldHVybiBwYnVmIC0gcGFybTsKK30KKworc3RhdGljIHZvaWQgdmRlY19wYXJzZXJfcGFybXMoc3RydWN0IHZkZWNfbXBlZzRfaW5zdCAqaW5zdCkKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IGluc3QtPmN0eDsKKworCWlmIChjdHgtPmNvbmZpZy5wYXJtLmRlYy5wYXJtc19zdGF0dXMgJgorCQlWNEwyX0NPTkZJR19QQVJNX0RFQ09ERV9DRkdJTkZPKSB7CisJCXU4ICpwYnVmID0gY3R4LT5jb25maWcuYnVmOworCisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAicGFybV92NGxfY29kZWNfZW5hYmxlOjE7Iik7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAicGFybV92NGxfY2FudmFzX21lbV9tb2RlOiVkOyIsCisJCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5jZmcuY2FudmFzX21lbV9tb2RlKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJwYXJtX3Y0bF9idWZmZXJfbWFyZ2luOiVkOyIsCisJCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5jZmcucmVmX2J1Zl9tYXJnaW4pOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgInBhcm1fdjRsX2R1cmF0aW9uOiVkOyIsCisJCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5jZmcuZHVyYXRpb24pOworCQljdHgtPmNvbmZpZy5sZW5ndGggPSBwYnVmIC0gY3R4LT5jb25maWcuYnVmOworCX0gZWxzZSB7CisJCWN0eC0+Y29uZmlnLmxlbmd0aCA9IHZkZWNfY29uZmlnX2RlZmF1bHRfcGFybXMoY3R4LT5jb25maWcuYnVmKTsKKwl9CisKKwlpbnN0LT52ZGVjLmNvbmZpZwk9IGN0eC0+Y29uZmlnOworCWluc3QtPnBhcm1zLmNmZwkJPSBjdHgtPmNvbmZpZy5wYXJtLmRlYy5jZmc7CisJaW5zdC0+cGFybXMucGFybXNfc3RhdHVzIHw9IFY0TDJfQ09ORklHX1BBUk1fREVDT0RFX0NGR0lORk87Cit9CisKKworc3RhdGljIGludCB2ZGVjX21wZWc0X2luaXQoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsIHVuc2lnbmVkIGxvbmcgKmhfdmRlYykKK3sKKwlzdHJ1Y3QgdmRlY19tcGVnNF9pbnN0ICppbnN0ID0gTlVMTDsKKwlpbnQgcmV0ID0gLTE7CisKKwlpbnN0ID0ga3phbGxvYyhzaXplb2YoKmluc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluc3QpCisJCXJldHVybiAtRU5PTUVNOworCisJaW5zdC0+dmRlYy5mcm1fbmFtZQk9ICJNUEVHNCI7CisJaW5zdC0+dmRlYy52aWRlb190eXBlCT0gVkZPUk1BVF9NUEVHNDsKKwlpbnN0LT52ZGVjLmZvcm1hdAk9IFZJREVPX0RFQ19GT1JNQVRfTVBFRzRfNTsKKwlpbnN0LT52ZGVjLmZpbHAJCT0gY3R4LT5kZXYtPmZpbHA7CisJaW5zdC0+dmRlYy5jb25maWcJPSBjdHgtPmNvbmZpZzsKKwlpbnN0LT52ZGVjLmN0eAkJPSBjdHg7CisJaW5zdC0+Y3R4CQk9IGN0eDsKKworCXZkZWNfcGFyc2VyX3Bhcm1zKGluc3QpOworCS8qIHNldCBwbGF5IG1vZGUuKi8KKwlpZiAoY3R4LT5pc19kcm1fbW9kZSkKKwkJaW5zdC0+dmRlYy5wb3J0LmZsYWcgfD0gUE9SVF9GTEFHX0RSTTsKKworCS8qIHRvIGVhYmxlIG1wZWc0IGh3LiovCisJaW5zdC0+dmRlYy5wb3J0LnR5cGUJPSBQT1JUX1RZUEVfVklERU87CisKKwkvKiBwcm9iZSBpbmZvIGZyb20gdGhlIHN0cmVhbSAqLworCWluc3QtPnZzaSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZGVjX21wZWc0X3ZzaSksIEdGUF9LRVJORUwpOworCWlmICghaW5zdC0+dnNpKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCS8qIGFsbG9jIHRoZSBoZWFkZXIgYnVmZmVyIHRvIGJlIHVzZWQgY2FjaGUgc3BzIG9yIHNwcCBldGMuKi8KKwlpbnN0LT52c2ktPmhlYWRlcl9idWYgPSB2emFsbG9jKEhFQURFUl9CVUZGRVJfU0laRSk7CisJaWYgKCFpbnN0LT52c2ktPmhlYWRlcl9idWYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJaW5pdF9jb21wbGV0aW9uKCZpbnN0LT5jb21wKTsKKwljdHgtPmFkYV9jdHgJPSAmaW5zdC0+dmRlYzsKKwkqaF92ZGVjCQk9ICh1bnNpZ25lZCBsb25nKWluc3Q7CisKKwlyZXQgPSB2aWRlb19kZWNvZGVyX2luaXQoJmluc3QtPnZkZWMpOworCWlmIChyZXQpIHsKKwkJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJ2ZGVjX21wZWc0IGluaXQgZXJyPSVkXG4iLCByZXQpOworCQlnb3RvIGVycjsKKwl9CisKKwl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX1BSSU5GTywKKwkJIm1wZWc0IEluc3RhbmNlID4+ICVseFxuIiwgKHVsb25nKSBpbnN0KTsKKworCXJldHVybiAwOworCitlcnI6CisJaWYgKGluc3QgJiYgaW5zdC0+dnNpICYmIGluc3QtPnZzaS0+aGVhZGVyX2J1ZikKKwkJdmZyZWUoaW5zdC0+dnNpLT5oZWFkZXJfYnVmKTsKKwlpZiAoaW5zdCAmJiBpbnN0LT52c2kpCisJCWtmcmVlKGluc3QtPnZzaSk7CisJaWYgKGluc3QpCisJCWtmcmVlKGluc3QpOworCSpoX3ZkZWMgPSAwOworCisJcmV0dXJuIHJldDsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQgcmVmZXJfYnVmZmVyX251bShpbnQgbGV2ZWxfaWRjLCBpbnQgcG9jX2NudCwKKwlpbnQgbWJfd2lkdGgsIGludCBtYl9oZWlnaHQpCit7CisJcmV0dXJuIDIwOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGZpbGxfdmRlY19wYXJhbXMoc3RydWN0IHZkZWNfbXBlZzRfaW5zdCAqaW5zdCwKKwlzdHJ1Y3QgbXBlZzRfZGVjX3BhcmFtICpkZWNfcHMpCit7CisJc3RydWN0IHZkZWNfcGljX2luZm8gKnBpYyA9ICZpbnN0LT52c2ktPnBpYzsKKwlzdHJ1Y3QgdmRlY19tcGVnNF9kZWNfaW5mbyAqZGVjID0gJmluc3QtPnZzaS0+ZGVjOworCXN0cnVjdCB2NGwyX3JlY3QgKnJlY3QgPSAmaW5zdC0+dnNpLT5jcm9wOworCisJLyogZmlsbCB2aXNpYmxlIGFyZWEgc2l6ZSB0aGF0IGJlIHVzZWQgZm9yIEVHTC4gKi8KKwlwaWMtPnZpc2libGVfd2lkdGgJPSBkZWNfcHMtPm0ud2lkdGg7CisJcGljLT52aXNpYmxlX2hlaWdodAk9IGRlY19wcy0+bS5oZWlnaHQ7CisKKwkvKiBjYWxjIHZpc2libGUgYXJlcy4gKi8KKwlyZWN0LT5sZWZ0CQk9IDA7CisJcmVjdC0+dG9wCQk9IDA7CisJcmVjdC0+d2lkdGgJCT0gcGljLT52aXNpYmxlX3dpZHRoOworCXJlY3QtPmhlaWdodAkJPSBwaWMtPnZpc2libGVfaGVpZ2h0OworCisJLyogY29uZmlnIGNhbnZhcyBzaXplIHRoYXQgYmUgdXNlZCBmb3IgZGVjb2Rlci4gKi8KKwlwaWMtPmNvZGVkX3dpZHRoCT0gQUxJR04oZGVjX3BzLT5tLndpZHRoLCA2NCk7CisJcGljLT5jb2RlZF9oZWlnaHQJPSBBTElHTihkZWNfcHMtPm0uaGVpZ2h0LCA2NCk7CisKKwlwaWMtPnlfbGVuX3N6CQk9IHBpYy0+Y29kZWRfd2lkdGggKiBwaWMtPmNvZGVkX2hlaWdodDsKKwlwaWMtPmNfbGVuX3N6CQk9IHBpYy0+eV9sZW5fc3ogPj4gMTsKKworCS8qOChERUNPREVfQlVGRkVSX05VTV9ERUYpICovCisJZGVjLT5kcGJfc3ogPSA4OworCisJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19CVUZNR1IsCisJCSJUaGUgc3RyZWFtIGluZm9zLCBjb2RlZDooJWQgeCAlZCksIHZpc2libGU6KCVkIHggJWQpLCBEUEI6ICVkXG4iLAorCQlwaWMtPmNvZGVkX3dpZHRoLCBwaWMtPmNvZGVkX2hlaWdodCwKKwkJcGljLT52aXNpYmxlX3dpZHRoLCBwaWMtPnZpc2libGVfaGVpZ2h0LCBkZWMtPmRwYl9zeik7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfc3RyZWFtX3Vjb2RlKHN0cnVjdCB2ZGVjX21wZWc0X2luc3QgKmluc3QsCisJCQkgICAgIHU4ICpidWYsIHUzMiBzaXplLCB1NjQgdGltZXN0YW1wKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhbWxfdmRlY19hZGFwdCAqdmRlYyA9ICZpbnN0LT52ZGVjOworCisJcmV0ID0gdmRlY192ZnJhbWVfd3JpdGUodmRlYywgYnVmLCBzaXplLCB0aW1lc3RhbXAsIDApOworCWlmIChyZXQgPCAwKSB7CisJCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkid3JpdGUgZnJhbWUgZGF0YSBmYWlsZWQuIGVycjogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogd2FpdCB1Y29kZSBwYXJzZSBlbmRpbmcuICovCisJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpbnN0LT5jb21wLAorCQltc2Vjc190b19qaWZmaWVzKDEwMDApKTsKKworCXJldHVybiBpbnN0LT52c2ktPnBpYy5kcGJfZnJhbWVzID8gMCA6IC0xOworfQorCitzdGF0aWMgaW50IHBhcnNlX3N0cmVhbV91Y29kZV9kbWEoc3RydWN0IHZkZWNfbXBlZzRfaW5zdCAqaW5zdCwKKwl1bG9uZyBidWYsIHUzMiBzaXplLCB1NjQgdGltZXN0YW1wLCB1MzIgaGFuZGxlKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhbWxfdmRlY19hZGFwdCAqdmRlYyA9ICZpbnN0LT52ZGVjOworCisJcmV0ID0gdmRlY192ZnJhbWVfd3JpdGVfd2l0aF9kbWEodmRlYywgYnVmLCBzaXplLCB0aW1lc3RhbXAsIGhhbmRsZSwKKwkJdmRlY192ZnJhbWVfaW5wdXRfZnJlZSwgaW5zdC0+Y3R4KTsKKwlpZiAocmV0IDwgMCkgeworCQl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJIndyaXRlIGZyYW1lIGRhdGEgZmFpbGVkLiBlcnI6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIHdhaXQgdWNvZGUgcGFyc2UgZW5kaW5nLiAqLworCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaW5zdC0+Y29tcCwKKwkJbXNlY3NfdG9famlmZmllcygxMDAwKSk7CisKKwlyZXR1cm4gaW5zdC0+dnNpLT5waWMuZHBiX2ZyYW1lcyA/IDAgOiAtMTsKK30KKworc3RhdGljIGludCBwYXJzZV9zdHJlYW1fY3B1KHN0cnVjdCB2ZGVjX21wZWc0X2luc3QgKmluc3QsIHU4ICpidWYsIHUzMiBzaXplKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBtcGVnNF9wYXJhbV9zZXRzICpwcyA9IE5VTEw7CisKKwlwcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtcGVnNF9wYXJhbV9zZXRzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBzID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gbXBlZzRfZGVjb2RlX2V4dHJhZGF0YV9wcyhidWYsIHNpemUsIHBzKTsKKwlpZiAocmV0KSB7CisJCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkicGFyc2UgZXh0cmEgZGF0YSBmYWlsZWQuIGVycjogJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChwcy0+aGVhZF9wYXJzZWQpCisJCWZpbGxfdmRlY19wYXJhbXMoaW5zdCwgJnBzLT5kZWNfcHMpOworCisJcmV0ID0gcHMtPmhlYWRfcGFyc2VkID8gMCA6IC0xOworb3V0OgorCWtmcmVlKHBzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmRlY19tcGVnNF9wcm9iZSh1bnNpZ25lZCBsb25nIGhfdmRlYywKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19tZW0gKmJzLCB2b2lkICpvdXQpCit7CisJc3RydWN0IHZkZWNfbXBlZzRfaW5zdCAqaW5zdCA9CisJCShzdHJ1Y3QgdmRlY19tcGVnNF9pbnN0ICopaF92ZGVjOworCXU4ICpidWYgPSAodTggKilicy0+dmFkZHI7CisJdTMyIHNpemUgPSBicy0+c2l6ZTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChpbnN0LT5jdHgtPmlzX2RybV9tb2RlKSB7CisJCWlmIChicy0+bW9kZWwgPT0gVkIyX01FTU9SWV9NTUFQKSB7CisJCQlzdHJ1Y3QgYW1sX3ZpZGVvX3N0cmVhbSAqcyA9CisJCQkJKHN0cnVjdCBhbWxfdmlkZW9fc3RyZWFtICopIGJ1ZjsKKworCQkJaWYgKChzLT5tYWdpYyAhPSBBTUxfVklERU9fTUFHSUMpICYmCisJCQkJKHMtPnR5cGUgIT0gVjRMX1NUUkVBTV9UWVBFX01BVEVEQVRBKSkKKwkJCQlyZXR1cm4gLTE7CisKKwkJCWlmIChpbnN0LT5jdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSkgeworCQkJCXJldCA9IHBhcnNlX3N0cmVhbV91Y29kZShpbnN0LCBzLT5kYXRhLAorCQkJCQlzLT5sZW4sIGJzLT50aW1lc3RhbXApOworCQkJfSBlbHNlIHsKKwkJCQlyZXQgPSBwYXJzZV9zdHJlYW1fY3B1KGluc3QsIHMtPmRhdGEsIHMtPmxlbik7CisJCQl9CisJCX0gZWxzZSBpZiAoYnMtPm1vZGVsID09IFZCMl9NRU1PUllfRE1BQlVGIHx8CisJCQlicy0+bW9kZWwgPT0gVkIyX01FTU9SWV9VU0VSUFRSKSB7CisJCQlyZXQgPSBwYXJzZV9zdHJlYW1fdWNvZGVfZG1hKGluc3QsIGJzLT5hZGRyLCBzaXplLAorCQkJCWJzLT50aW1lc3RhbXAsIEJVRkZfSURYKGJzLCBicy0+aW5kZXgpKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChpbnN0LT5jdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSkgeworCQkJcmV0ID0gcGFyc2Vfc3RyZWFtX3Vjb2RlKGluc3QsIGJ1Ziwgc2l6ZSwgYnMtPnRpbWVzdGFtcCk7CisJCX0gZWxzZSB7CisJCQlyZXQgPSBwYXJzZV9zdHJlYW1fY3B1KGluc3QsIGJ1Ziwgc2l6ZSk7CisJCX0KKwl9CisKKwlpbnN0LT52c2ktPmN1cl9waWMgPSBpbnN0LT52c2ktPnBpYzsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHZkZWNfbXBlZzRfZGVpbml0KHVuc2lnbmVkIGxvbmcgaF92ZGVjKQoreworCXN0cnVjdCB2ZGVjX21wZWc0X2luc3QgKmluc3QgPSAoc3RydWN0IHZkZWNfbXBlZzRfaW5zdCAqKWhfdmRlYzsKKworCWlmICghaW5zdCkKKwkJcmV0dXJuOworCisJdmlkZW9fZGVjb2Rlcl9yZWxlYXNlKCZpbnN0LT52ZGVjKTsKKworCWlmIChpbnN0LT52c2kgJiYgaW5zdC0+dnNpLT5oZWFkZXJfYnVmKQorCQl2ZnJlZShpbnN0LT52c2ktPmhlYWRlcl9idWYpOworCisJaWYgKGluc3QtPnZzaSkKKwkJa2ZyZWUoaW5zdC0+dnNpKTsKKworCWtmcmVlKGluc3QpOworfQorCitzdGF0aWMgaW50IHZkZWNfd3JpdGVfbmFsdShzdHJ1Y3QgdmRlY19tcGVnNF9pbnN0ICppbnN0LAorCXU4ICpidWYsIHUzMiBzaXplLCB1NjQgdHMpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGFtbF92ZGVjX2FkYXB0ICp2ZGVjID0gJmluc3QtPnZkZWM7CisKKwlyZXQgPSB2ZGVjX3ZmcmFtZV93cml0ZSh2ZGVjLCBidWYsIHNpemUsIHRzLCAwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmRlY19tcGVnNF9kZWNvZGUodW5zaWduZWQgbG9uZyBoX3ZkZWMsCisJCQkgICAgIHN0cnVjdCBhbWxfdmNvZGVjX21lbSAqYnMsIGJvb2wgKnJlc19jaGcpCit7CisJc3RydWN0IHZkZWNfbXBlZzRfaW5zdCAqaW5zdCA9IChzdHJ1Y3QgdmRlY19tcGVnNF9pbnN0ICopaF92ZGVjOworCXN0cnVjdCBhbWxfdmRlY19hZGFwdCAqdmRlYyA9ICZpbnN0LT52ZGVjOworCXU4ICpidWYgPSAodTggKikgYnMtPnZhZGRyOworCXUzMiBzaXplID0gYnMtPnNpemU7CisJaW50IHJldCA9IC0xOworCisJaWYgKHZkZWNfaW5wdXRfZnVsbCh2ZGVjKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlpZiAoaW5zdC0+Y3R4LT5pc19kcm1fbW9kZSkgeworCQlpZiAoYnMtPm1vZGVsID09IFZCMl9NRU1PUllfTU1BUCkgeworCQkJc3RydWN0IGFtbF92aWRlb19zdHJlYW0gKnMgPQorCQkJCShzdHJ1Y3QgYW1sX3ZpZGVvX3N0cmVhbSAqKSBidWY7CisKKwkJCWlmIChzLT5tYWdpYyAhPSBBTUxfVklERU9fTUFHSUMpCisJCQkJcmV0dXJuIC0xOworCisJCQlyZXQgPSB2ZGVjX3ZmcmFtZV93cml0ZSh2ZGVjLAorCQkJCXMtPmRhdGEsCisJCQkJcy0+bGVuLAorCQkJCWJzLT50aW1lc3RhbXAsCisJCQkJMCk7CisJCX0gZWxzZSBpZiAoYnMtPm1vZGVsID09IFZCMl9NRU1PUllfRE1BQlVGIHx8CisJCQlicy0+bW9kZWwgPT0gVkIyX01FTU9SWV9VU0VSUFRSKSB7CisJCQlyZXQgPSB2ZGVjX3ZmcmFtZV93cml0ZV93aXRoX2RtYSh2ZGVjLAorCQkJCWJzLT5hZGRyLCBzaXplLCBicy0+dGltZXN0YW1wLAorCQkJCUJVRkZfSURYKGJzLCBicy0+aW5kZXgpLAorCQkJCXZkZWNfdmZyYW1lX2lucHV0X2ZyZWUsIGluc3QtPmN0eCk7CisJCX0KKwl9IGVsc2UgeworCQlyZXQgPSB2ZGVjX3dyaXRlX25hbHUoaW5zdCwgYnVmLCBzaXplLCBicy0+dGltZXN0YW1wKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZkZWNfbXBlZzRfZ2V0X3BhcmFtKHVuc2lnbmVkIGxvbmcgaF92ZGVjLAorCQkJICAgICAgIGVudW0gdmRlY19nZXRfcGFyYW1fdHlwZSB0eXBlLCB2b2lkICpvdXQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHZkZWNfbXBlZzRfaW5zdCAqaW5zdCA9IChzdHJ1Y3QgdmRlY19tcGVnNF9pbnN0ICopaF92ZGVjOworCisJaWYgKCFpbnN0KSB7CisJCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkidGhlIG1wZWc0IGluc3Qgb2YgZGVjIGlzIGludmFsaWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgR0VUX1BBUkFNX1BJQ19JTkZPOgorCQlnZXRfcGljX2luZm8oaW5zdCwgb3V0KTsKKwkJYnJlYWs7CisKKwljYXNlIEdFVF9QQVJBTV9EUEJfU0laRToKKwkJZ2V0X2RwYl9zaXplKGluc3QsIG91dCk7CisJCWJyZWFrOworCisJY2FzZSBHRVRfUEFSQU1fQ1JPUF9JTkZPOgorCQlnZXRfY3JvcF9pbmZvKGluc3QsIG91dCk7CisJCWJyZWFrOworCWNhc2UgR0VUX1BBUkFNX0RXX01PREU6CisJeworCQl1bnNpZ25lZCBpbnQqIG1vZGUgPSBvdXQ7CisJCSptb2RlID0gVkRFQ19EV19OT19BRkJDOworCQlicmVhazsKKwl9CisKKwlkZWZhdWx0OgorCQl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX1BSSU5GTywKKwkJCSJpbnZhbGlkIGdldCBwYXJhbWV0ZXIgdHlwZT0lZFxuIiwgdHlwZSk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgc2V0X3BhcmFtX3BzX2luZm8oc3RydWN0IHZkZWNfbXBlZzRfaW5zdCAqaW5zdCwKKwlzdHJ1Y3QgYW1sX3ZkZWNfcHNfaW5mb3MgKnBzKQoreworCXN0cnVjdCB2ZGVjX3BpY19pbmZvICpwaWMgPSAmaW5zdC0+dnNpLT5waWM7CisJc3RydWN0IHZkZWNfbXBlZzRfZGVjX2luZm8gKmRlYyA9ICZpbnN0LT52c2ktPmRlYzsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0ID0gJmluc3QtPnZzaS0+Y3JvcDsKKworCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfUFJJTkZPLCAiJXMgaW5cbiIsIF9fZnVuY19fKTsKKwkvKiBmaWxsIHZpc2libGUgYXJlYSBzaXplIHRoYXQgYmUgdXNlZCBmb3IgRUdMLiAqLworCXBpYy0+dmlzaWJsZV93aWR0aAk9IHBzLT52aXNpYmxlX3dpZHRoOworCXBpYy0+dmlzaWJsZV9oZWlnaHQJPSBwcy0+dmlzaWJsZV9oZWlnaHQ7CisKKwkvKiBjYWxjIHZpc2libGUgYXJlcy4gKi8KKwlyZWN0LT5sZWZ0CQk9IDA7CisJcmVjdC0+dG9wCQk9IDA7CisJcmVjdC0+d2lkdGgJCT0gcGljLT52aXNpYmxlX3dpZHRoOworCXJlY3QtPmhlaWdodAkJPSBwaWMtPnZpc2libGVfaGVpZ2h0OworCisJLyogY29uZmlnIGNhbnZhcyBzaXplIHRoYXQgYmUgdXNlZCBmb3IgZGVjb2Rlci4gKi8KKwlwaWMtPmNvZGVkX3dpZHRoCT0gcHMtPmNvZGVkX3dpZHRoOworCXBpYy0+Y29kZWRfaGVpZ2h0CT0gcHMtPmNvZGVkX2hlaWdodDsKKwlwaWMtPnlfbGVuX3N6CQk9IHBpYy0+Y29kZWRfd2lkdGggKiBwaWMtPmNvZGVkX2hlaWdodDsKKwlwaWMtPmNfbGVuX3N6CQk9IHBpYy0+eV9sZW5fc3ogPj4gMTsKKworCXBpYy0+ZHBiX2ZyYW1lcwkJPSBwcy0+ZHBiX2ZyYW1lczsKKwlwaWMtPmRwYl9tYXJnaW4JCT0gcHMtPmRwYl9tYXJnaW47CisJcGljLT52cHBfbWFyZ2luCQk9IHBzLT5kcGJfbWFyZ2luOworCWRlYy0+ZHBiX3N6CQk9IHBzLT5kcGJfc2l6ZTsKKwlwaWMtPmZpZWxkCQk9IHBzLT5maWVsZDsKKworCWluc3QtPnBhcm1zLnBzIAk9ICpwczsKKwlpbnN0LT5wYXJtcy5wYXJtc19zdGF0dXMgfD0KKwkJVjRMMl9DT05GSUdfUEFSTV9ERUNPREVfUFNJTkZPOworCisJLyp3YWtlIHVwKi8KKwljb21wbGV0ZSgmaW5zdC0+Y29tcCk7CisKKwl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX1BSSU5GTywKKwkJIlBhcnNlIGZyb20gdWNvZGUsIHZpc2libGUoJWQgeCAlZCksIGNvZGVkKCVkIHggJWQpLCBzY2FuOiVzXG4iLAorCQlwcy0+dmlzaWJsZV93aWR0aCwgcHMtPnZpc2libGVfaGVpZ2h0LAorCQlwcy0+Y29kZWRfd2lkdGgsIHBzLT5jb2RlZF9oZWlnaHQsCisJCXBpYy0+ZmllbGQgPT0gVjRMMl9GSUVMRF9OT05FID8gIlAiIDogIkkiKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3BhcmFtX3dyaXRlX3N5bmMoc3RydWN0IHZkZWNfbXBlZzRfaW5zdCAqaW5zdCkKK3sKKwljb21wbGV0ZSgmaW5zdC0+Y29tcCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9waWNfaW5mbyhzdHJ1Y3QgdmRlY19tcGVnNF9pbnN0ICppbnN0LAorCXN0cnVjdCB2ZGVjX3BpY19pbmZvICpwaWMpCit7CisJaW5zdC0+dnNpLT5waWMgPSAqcGljOworfQorCitzdGF0aWMgaW50IHZkZWNfbXBlZzRfc2V0X3BhcmFtKHVuc2lnbmVkIGxvbmcgaF92ZGVjLAorCWVudW0gdmRlY19zZXRfcGFyYW1fdHlwZSB0eXBlLCB2b2lkICppbikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgdmRlY19tcGVnNF9pbnN0ICppbnN0ID0gKHN0cnVjdCB2ZGVjX21wZWc0X2luc3QgKiloX3ZkZWM7CisKKwlpZiAoIWluc3QpIHsKKwkJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJ0aGUgbXBlZzQgaW5zdCBvZiBkZWMgaXMgaW52YWxpZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTRVRfUEFSQU1fV1JJVEVfRlJBTUVfU1lOQzoKKwkJc2V0X3BhcmFtX3dyaXRlX3N5bmMoaW5zdCk7CisJCWJyZWFrOworCisJY2FzZSBTRVRfUEFSQU1fUFNfSU5GTzoKKwkJc2V0X3BhcmFtX3BzX2luZm8oaW5zdCwgaW4pOworCQlicmVhazsKKworCWNhc2UgU0VUX1BBUkFNX1BJQ19JTkZPOgorCQlzZXRfcGljX2luZm8oaW5zdCwgaW4pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkiaW52YWxpZCBzZXQgcGFyYW1ldGVyIHR5cGU9JWRcbiIsIHR5cGUpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmRlY19jb21tb25faWYgdmRlY19tcGVnNF9pZiA9IHsKKwkuaW5pdAkJPSB2ZGVjX21wZWc0X2luaXQsCisJLnByb2JlCQk9IHZkZWNfbXBlZzRfcHJvYmUsCisJLmRlY29kZQkJPSB2ZGVjX21wZWc0X2RlY29kZSwKKwkuZ2V0X3BhcmFtCT0gdmRlY19tcGVnNF9nZXRfcGFyYW0sCisJLnNldF9wYXJhbQk9IHZkZWNfbXBlZzRfc2V0X3BhcmFtLAorCS5kZWluaXQJCT0gdmRlY19tcGVnNF9kZWluaXQsCit9OworCitzdHJ1Y3QgdmRlY19jb21tb25faWYgKmdldF9tcGVnNF9kZWNfY29tbV9pZih2b2lkKTsKKworc3RydWN0IHZkZWNfY29tbW9uX2lmICpnZXRfbXBlZzRfZGVjX2NvbW1faWYodm9pZCkKK3sKKwlyZXR1cm4gJnZkZWNfbXBlZzRfaWY7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FtdmRlY19wb3J0cy9kZWNvZGVyL3ZkZWNfdnA5X2lmLmMgYi9kcml2ZXJzL2FtdmRlY19wb3J0cy9kZWNvZGVyL3ZkZWNfdnA5X2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU4MWRkZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL2RlY29kZXIvdmRlY192cDlfaWYuYwpAQCAtMCwwICsxLDEwNjUgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNyBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisqIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyoKKyogRGVzY3JpcHRpb246CisqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9zd2FiLmg+CisjaW5jbHVkZSAiLi4vdmRlY19kcnZfaWYuaCIKKyNpbmNsdWRlICIuLi9hbWxfdmNvZGVjX3V0aWwuaCIKKyNpbmNsdWRlICIuLi9hbWxfdmNvZGVjX2RlYy5oIgorI2luY2x1ZGUgIi4uL2FtbF92Y29kZWNfZHJ2LmgiCisjaW5jbHVkZSAiLi4vYW1sX3Zjb2RlY19hZGFwdC5oIgorI2luY2x1ZGUgIi4uL3ZkZWNfZHJ2X2Jhc2UuaCIKKyNpbmNsdWRlICJhbWxfdnA5X3BhcnNlci5oIgorI2luY2x1ZGUgInZkZWNfdnA5X3RyaWdnZXIuaCIKKworI2RlZmluZSBLRVJORUxfQVRSQUNFX1RBRyBLRVJORUxfQVRSQUNFX1RBR19WNEwyCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL21lc29uX2F0cmFjZS5oPgorCisjZGVmaW5lIFBSRUZJWF9TSVpFCSgxNikKKworI2RlZmluZSBOQUxfVFlQRSh2YWx1ZSkJCQkJKCh2YWx1ZSkgJiAweDFGKQorI2RlZmluZSBIRUFERVJfQlVGRkVSX1NJWkUJCQkoMzIgKiAxMDI0KQorI2RlZmluZSBTWU5DX0NPREUJCQkJKDB4NDk4MzQyKQorCitleHRlcm4gaW50IHZwOV9uZWVkX3ByZWZpeDsKK2Jvb2wgbmVlZF90cmlnZ2VyOworaW50IGR1bXBfY250ID0gMDsKKworLyoqCisgKiBzdHJ1Y3QgdnA5X2ZiIC0gdnA5IGRlY29kZSBmcmFtZSBidWZmZXIgaW5mb3JtYXRpb24KKyAqIEB2ZGVjX2ZiX3ZhICA6IHZpcnR1YWwgYWRkcmVzcyBvZiBzdHJ1Y3QgdmRlY19mYgorICogQHlfZmJfZG1hICAgIDogZG1hIGFkZHJlc3Mgb2YgWSBmcmFtZSBidWZmZXIgKGx1bWEpCisgKiBAY19mYl9kbWEgICAgOiBkbWEgYWRkcmVzcyBvZiBDIGZyYW1lIGJ1ZmZlciAoY2hyb21hKQorICogQHBvYyAgICAgICAgIDogcGljdHVyZSBvcmRlciBjb3VudCBvZiBmcmFtZSBidWZmZXIKKyAqIEByZXNlcnZlZCAgICA6IGZvciA4IGJ5dGVzIGFsaWdubWVudAorICovCitzdHJ1Y3QgdnA5X2ZiIHsKKwl1aW50NjRfdCB2ZGVjX2ZiX3ZhOworCXVpbnQ2NF90IHlfZmJfZG1hOworCXVpbnQ2NF90IGNfZmJfZG1hOworCWludDMyX3QgcG9jOworCXVpbnQzMl90IHJlc2VydmVkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdmRlY192cDlfZGVjX2luZm8gLSBkZWNvZGUgaW5mb3JtYXRpb24KKyAqIEBkcGJfc3oJCTogZGVjb2RpbmcgcGljdHVyZSBidWZmZXIgc2l6ZQorICogQHJlc29sdXRpb25fY2hhbmdlZCAgOiByZXNvbHRpb24gY2hhbmdlIGhhcHBlbgorICogQHJlc2VydmVkCQk6IGZvciA4IGJ5dGVzIGFsaWdubWVudAorICogQGJzX2RtYQkJOiBJbnB1dCBiaXQtc3RyZWFtIGJ1ZmZlciBkbWEgYWRkcmVzcworICogQHlfZmJfZG1hCQk6IFkgZnJhbWUgYnVmZmVyIGRtYSBhZGRyZXNzCisgKiBAY19mYl9kbWEJCTogQyBmcmFtZSBidWZmZXIgZG1hIGFkZHJlc3MKKyAqIEB2ZGVjX2ZiX3ZhCQk6IFZERUMgZnJhbWUgYnVmZmVyIHN0cnVjdCB2aXJ0dWFsIGFkZHJlc3MKKyAqLworc3RydWN0IHZkZWNfdnA5X2RlY19pbmZvIHsKKwl1aW50MzJfdCBkcGJfc3o7CisJdWludDMyX3QgcmVzb2x1dGlvbl9jaGFuZ2VkOworCXVpbnQzMl90IHJlc2VydmVkOworCXVpbnQ2NF90IGJzX2RtYTsKKwl1aW50NjRfdCB5X2ZiX2RtYTsKKwl1aW50NjRfdCBjX2ZiX2RtYTsKKwl1aW50NjRfdCB2ZGVjX2ZiX3ZhOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdmRlY192cDlfdnNpIC0gc2hhcmVkIG1lbW9yeSBmb3IgZGVjb2RlIGluZm9ybWF0aW9uIGV4Y2hhbmdlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gVlBVIGFuZCBIb3N0LgorICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWVtb3J5IGlzIGFsbG9jYXRlZCBieSBWUFUgdGhlbiBtYXBwaW5nIHRvIEhvc3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgaW4gdnB1X2RlY19pbml0KCkgYW5kIGZyZWVkIGluIHZwdV9kZWNfZGVpbml0KCkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYnkgVlBVLgorICogICAgICAgICAgICAgICAgICAgICAgICBBUC1XL1IgOiBBUCBpcyB3cml0ZXIvcmVhZGVyIG9uIHRoaXMgaXRlbQorICogICAgICAgICAgICAgICAgICAgICAgICBWUFUtVy9SOiBWUFUgaXMgd3JpdGUvcmVhZGVyIG9uIHRoaXMgaXRlbQorICogQGhkcl9idWYgICAgICA6IEhlYWRlciBwYXJzaW5nIGJ1ZmZlciAoQVAtVywgVlBVLVIpCisgKiBAbGlzdF9mcmVlICAgIDogZnJlZSBmcmFtZSBidWZmZXIgcmluZyBsaXN0IChBUC1XL1IsIFZQVS1XKQorICogQGxpc3RfZGlzcCAgICA6IGRpc3BsYXkgZnJhbWUgYnVmZmVyIHJpbmcgbGlzdCAoQVAtUiwgVlBVLVcpCisgKiBAZGVjICAgICAgICAgIDogZGVjb2RlIGluZm9ybWF0aW9uIChBUC1SLCBWUFUtVykKKyAqIEBwaWMgICAgICAgICAgOiBwaWN0dXJlIGluZm9ybWF0aW9uIChBUC1SLCBWUFUtVykKKyAqIEBjcm9wICAgICAgICAgOiBjcm9wIGluZm9ybWF0aW9uIChBUC1SLCBWUFUtVykKKyAqLworc3RydWN0IHZkZWNfdnA5X3ZzaSB7CisJY2hhciAqaGVhZGVyX2J1ZjsKKwlpbnQgc3BzX3NpemU7CisJaW50IHBwc19zaXplOworCWludCBzZWlfc2l6ZTsKKwlpbnQgaGVhZF9vZmZzZXQ7CisJc3RydWN0IHZkZWNfdnA5X2RlY19pbmZvIGRlYzsKKwlzdHJ1Y3QgdmRlY19waWNfaW5mbyBwaWM7CisJc3RydWN0IHZkZWNfcGljX2luZm8gY3VyX3BpYzsKKwlzdHJ1Y3QgdjRsMl9yZWN0IGNyb3A7CisJYm9vbCBpc19jb21iaW5lOworCWludCBuYWx1X3BvczsKKwlzdHJ1Y3QgdnA5X3BhcmFtX3NldHMgcHM7Cit9OworCisvKioKKyAqIHN0cnVjdCB2ZGVjX3ZwOV9pbnN0IC0gdnA5IGRlY29kZXIgaW5zdGFuY2UKKyAqIEBudW1fbmFsdSA6IGhvdyBtYW55IG5hbHVzIGJlIGRlY29kZWQKKyAqIEBjdHggICAgICA6IHBvaW50IHRvIGFtbF92Y29kZWNfY3R4CisgKiBAdnNpICAgICAgOiBWUFUgc2hhcmVkIGluZm9ybWF0aW9uCisgKi8KK3N0cnVjdCB2ZGVjX3ZwOV9pbnN0IHsKKwl1bnNpZ25lZCBpbnQgbnVtX25hbHU7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHg7CisJc3RydWN0IGFtbF92ZGVjX2FkYXB0IHZkZWM7CisJc3RydWN0IHZkZWNfdnA5X3ZzaSAqdnNpOworCXN0cnVjdCBhbWxfZGVjX3BhcmFtcyBwYXJtczsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21wOworCXN0cnVjdCB2ZGVjX2NvbXBfYnVmX2luZm8gY29tcF9pbmZvOworfTsKKworc3RhdGljIGludCB2ZGVjX3dyaXRlX25hbHUoc3RydWN0IHZkZWNfdnA5X2luc3QgKmluc3QsCisJdTggKmJ1ZiwgdTMyIHNpemUsIHU2NCB0cywgdWxvbmcgbWV0YV9wdHIpOworCitzdGF0aWMgdm9pZCBnZXRfcGljX2luZm8oc3RydWN0IHZkZWNfdnA5X2luc3QgKmluc3QsCisJCQkgc3RydWN0IHZkZWNfcGljX2luZm8gKnBpYykKK3sKKwkqcGljID0gaW5zdC0+dnNpLT5waWM7CisKKwl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywKKwkJInBpYyglZCwgJWQpLCBidWYoJWQsICVkKVxuIiwKKwkJIHBpYy0+dmlzaWJsZV93aWR0aCwgcGljLT52aXNpYmxlX2hlaWdodCwKKwkJIHBpYy0+Y29kZWRfd2lkdGgsIHBpYy0+Y29kZWRfaGVpZ2h0KTsKKwl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywKKwkJIlkoJWQsICVkKSwgQyglZCwgJWQpXG4iLAorCQlwaWMtPnlfYnNfc3osIHBpYy0+eV9sZW5fc3osCisJCXBpYy0+Y19ic19zeiwgcGljLT5jX2xlbl9zeik7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9jcm9wX2luZm8oc3RydWN0IHZkZWNfdnA5X2luc3QgKmluc3QsIHN0cnVjdCB2NGwyX3JlY3QgKmNyKQoreworCWNyLT5sZWZ0ID0gaW5zdC0+dnNpLT5jcm9wLmxlZnQ7CisJY3ItPnRvcCA9IGluc3QtPnZzaS0+Y3JvcC50b3A7CisJY3ItPndpZHRoID0gaW5zdC0+dnNpLT5jcm9wLndpZHRoOworCWNyLT5oZWlnaHQgPSBpbnN0LT52c2ktPmNyb3AuaGVpZ2h0OworCisJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FWElORk8sCisJCSJsPSVkLCB0PSVkLCB3PSVkLCBoPSVkXG4iLAorCQkgY3ItPmxlZnQsIGNyLT50b3AsIGNyLT53aWR0aCwgY3ItPmhlaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9kcGJfc2l6ZShzdHJ1Y3QgdmRlY192cDlfaW5zdCAqaW5zdCwgdW5zaWduZWQgaW50ICpkcGJfc3opCit7CisJKmRwYl9zeiA9IGluc3QtPnZzaS0+ZGVjLmRwYl9zejsKKwl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywgInN6PSVkXG4iLCAqZHBiX3N6KTsKK30KKworc3RhdGljIHUzMiB2ZGVjX2NvbmZpZ19kZWZhdWx0X3Bhcm1zKHU4ICpwYXJtKQoreworCXU4ICpwYnVmID0gcGFybTsKKworCXBidWYgKz0gc3ByaW50ZihwYnVmLCAicGFybV92NGxfY29kZWNfZW5hYmxlOjE7Iik7CisJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJwYXJtX3Y0bF9idWZmZXJfbWFyZ2luOjc7Iik7CisJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJ2cDlfZG91YmxlX3dyaXRlX21vZGU6MTsiKTsKKwlwYnVmICs9IHNwcmludGYocGJ1ZiwgInZwOV9idWZfd2lkdGg6MTkyMDsiKTsKKwlwYnVmICs9IHNwcmludGYocGJ1ZiwgInZwOV9idWZfaGVpZ2h0OjEwODg7Iik7CisJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJ2cDlfbWF4X3BpY193OjQwOTY7Iik7CisJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJ2cDlfbWF4X3BpY19oOjIzMDQ7Iik7CisJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJzYXZlX2J1ZmZlcl9tb2RlOjA7Iik7CisJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJub19oZWFkOjA7Iik7CisJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJwYXJtX3Y0bF9jYW52YXNfbWVtX21vZGU6MDsiKTsKKwlwYnVmICs9IHNwcmludGYocGJ1ZiwgInBhcm1fdjRsX2NhbnZhc19tZW1fZW5kaWFuOjA7Iik7CisKKwlyZXR1cm4gcGFybSAtIHBidWY7Cit9CisKK3N0YXRpYyB2b2lkIHZkZWNfcGFyc2VyX3Bhcm1zKHN0cnVjdCB2ZGVjX3ZwOV9pbnN0ICppbnN0KQoreworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gaW5zdC0+Y3R4OworCisJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FWElORk8sCisJCSIlczpwYXJtc19zdGF0dXMgPSAweCV4LCBwcmVzZW50X2ZsYWcgPSAlZFxuIiwKKwkJX19mdW5jX18sIGN0eC0+Y29uZmlnLnBhcm0uZGVjLnBhcm1zX3N0YXR1cywKKwkJY3R4LT5jb25maWcucGFybS5kZWMuaGRyLmNvbG9yX3Bhcm1zLnByZXNlbnRfZmxhZyk7CisJaWYgKGN0eC0+Y29uZmlnLnBhcm0uZGVjLnBhcm1zX3N0YXR1cyAmCisJCVY0TDJfQ09ORklHX1BBUk1fREVDT0RFX0NGR0lORk8pIHsKKwkJdTggKnBidWYgPSBjdHgtPmNvbmZpZy5idWY7CisKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJwYXJtX3Y0bF9jb2RlY19lbmFibGU6MTsiKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJwYXJtX3Y0bF9idWZmZXJfbWFyZ2luOiVkOyIsCisJCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5jZmcucmVmX2J1Zl9tYXJnaW4pOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgInZwOV9kb3VibGVfd3JpdGVfbW9kZTolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuY2ZnLmRvdWJsZV93cml0ZV9tb2RlKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJ2cDlfYnVmX3dpZHRoOiVkOyIsCisJCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5jZmcuaW5pdF93aWR0aCk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAidnA5X2J1Zl9oZWlnaHQ6JWQ7IiwKKwkJCWN0eC0+Y29uZmlnLnBhcm0uZGVjLmNmZy5pbml0X2hlaWdodCk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAic2F2ZV9idWZmZXJfbW9kZTowOyIpOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIm5vX2hlYWQ6MDsiKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJwYXJtX3Y0bF9jYW52YXNfbWVtX21vZGU6JWQ7IiwKKwkJCWN0eC0+Y29uZmlnLnBhcm0uZGVjLmNmZy5jYW52YXNfbWVtX21vZGUpOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgInBhcm1fdjRsX2NhbnZhc19tZW1fZW5kaWFuOiVkOyIsCisJCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5jZmcuY2FudmFzX21lbV9lbmRpYW4pOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgInBhcm1fdjRsX2xvd19sYXRlbmN5X21vZGU6JWQ7IiwKKwkJCWN0eC0+Y29uZmlnLnBhcm0uZGVjLmNmZy5sb3dfbGF0ZW5jeV9tb2RlKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJwYXJtX3Y0bF9kdXJhdGlvbjolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuY2ZnLmR1cmF0aW9uKTsKKwkJY3R4LT5jb25maWcubGVuZ3RoID0gcGJ1ZiAtIGN0eC0+Y29uZmlnLmJ1ZjsKKwl9IGVsc2UgeworCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5jZmcuZG91YmxlX3dyaXRlX21vZGUgPSAxOworCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5jZmcucmVmX2J1Zl9tYXJnaW4gPSA3OworCQljdHgtPmNvbmZpZy5sZW5ndGggPSB2ZGVjX2NvbmZpZ19kZWZhdWx0X3Bhcm1zKGN0eC0+Y29uZmlnLmJ1Zik7CisJfQorCisJaWYgKChjdHgtPmNvbmZpZy5wYXJtLmRlYy5wYXJtc19zdGF0dXMgJgorCQlWNEwyX0NPTkZJR19QQVJNX0RFQ09ERV9IRFJJTkZPKSAmJgorCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5oZHIuY29sb3JfcGFybXMucHJlc2VudF9mbGFnKSB7CisJCXU4ICpwYnVmID0gY3R4LT5jb25maWcuYnVmICsgY3R4LT5jb25maWcubGVuZ3RoOworCisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiSERSU3RhdGljSW5mbzolZDsiLCAxKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJzaWduYWxfdHlwZTolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuaGRyLnNpZ25hbF90eXBlKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJtRy54OiVkOyIsCisJCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5oZHIuY29sb3JfcGFybXMucHJpbWFyaWVzWzBdWzBdKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJtRy55OiVkOyIsCisJCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5oZHIuY29sb3JfcGFybXMucHJpbWFyaWVzWzBdWzFdKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJtQi54OiVkOyIsCisJCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5oZHIuY29sb3JfcGFybXMucHJpbWFyaWVzWzFdWzBdKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJtQi55OiVkOyIsCisJCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5oZHIuY29sb3JfcGFybXMucHJpbWFyaWVzWzFdWzFdKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJtUi54OiVkOyIsCisJCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5oZHIuY29sb3JfcGFybXMucHJpbWFyaWVzWzJdWzBdKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJtUi55OiVkOyIsCisJCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5oZHIuY29sb3JfcGFybXMucHJpbWFyaWVzWzJdWzFdKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJtVy54OiVkOyIsCisJCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5oZHIuY29sb3JfcGFybXMud2hpdGVfcG9pbnRbMF0pOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIm1XLnk6JWQ7IiwKKwkJCWN0eC0+Y29uZmlnLnBhcm0uZGVjLmhkci5jb2xvcl9wYXJtcy53aGl0ZV9wb2ludFsxXSk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAibU1heERMOiVkOyIsCisJCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5oZHIuY29sb3JfcGFybXMubHVtaW5hbmNlWzBdICogMTAwMDApOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIm1NaW5ETDolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuaGRyLmNvbG9yX3Bhcm1zLmx1bWluYW5jZVsxXSk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAibU1heENMTDolZDsiLAorCQkJY3R4LT5jb25maWcucGFybS5kZWMuaGRyLmNvbG9yX3Bhcm1zLmNvbnRlbnRfbGlnaHRfbGV2ZWwubWF4X2NvbnRlbnQpOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIm1NYXhGQUxMOiVkOyIsCisJCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5oZHIuY29sb3JfcGFybXMuY29udGVudF9saWdodF9sZXZlbC5tYXhfcGljX2F2ZXJhZ2UpOworCQljdHgtPmNvbmZpZy5sZW5ndGgJPSBwYnVmIC0gY3R4LT5jb25maWcuYnVmOworCQlpbnN0LT5wYXJtcy5oZHIJCT0gY3R4LT5jb25maWcucGFybS5kZWMuaGRyOworCQlpbnN0LT5wYXJtcy5wYXJtc19zdGF0dXMgfD0gVjRMMl9DT05GSUdfUEFSTV9ERUNPREVfSERSSU5GTzsKKwl9CisJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FWElORk8sCisJCSJjb25maWcuYnVmID0gJXNcbiIsIGN0eC0+Y29uZmlnLmJ1Zik7CisKKwlpbnN0LT52ZGVjLmNvbmZpZwk9IGN0eC0+Y29uZmlnOworCWluc3QtPnBhcm1zLmNmZwkJPSBjdHgtPmNvbmZpZy5wYXJtLmRlYy5jZmc7CisJaW5zdC0+cGFybXMucGFybXNfc3RhdHVzIHw9IFY0TDJfQ09ORklHX1BBUk1fREVDT0RFX0NGR0lORk87Cit9CisKK3N0YXRpYyBpbnQgdmRlY192cDlfaW5pdChzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCwgdW5zaWduZWQgbG9uZyAqaF92ZGVjKQoreworCXN0cnVjdCB2ZGVjX3ZwOV9pbnN0ICppbnN0ID0gTlVMTDsKKwlpbnQgcmV0ID0gLTE7CisKKwlpbnN0ID0ga3phbGxvYyhzaXplb2YoKmluc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluc3QpCisJCXJldHVybiAtRU5PTUVNOworCisJaW5zdC0+dmRlYy5mcm1fbmFtZQk9ICJWUDkiOworCWluc3QtPnZkZWMudmlkZW9fdHlwZQk9IFZGT1JNQVRfVlA5OworCWluc3QtPnZkZWMuZmlscAkJPSBjdHgtPmRldi0+ZmlscDsKKwlpbnN0LT52ZGVjLmN0eAkJPSBjdHg7CisJaW5zdC0+Y3R4CQk9IGN0eDsKKworCXZkZWNfcGFyc2VyX3Bhcm1zKGluc3QpOworCisJLyogc2V0IHBsYXkgbW9kZS4qLworCWlmIChjdHgtPmlzX2RybV9tb2RlKQorCQlpbnN0LT52ZGVjLnBvcnQuZmxhZyB8PSBQT1JUX0ZMQUdfRFJNOworCisJLyogdG8gZWFibGUgdnA5IGh3LiovCisJaW5zdC0+dmRlYy5wb3J0LnR5cGUJPSBQT1JUX1RZUEVfSEVWQzsKKworCS8qIHByb2JlIGluZm8gZnJvbSB0aGUgc3RyZWFtICovCisJaW5zdC0+dnNpID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZkZWNfdnA5X3ZzaSksIEdGUF9LRVJORUwpOworCWlmICghaW5zdC0+dnNpKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCS8qIGFsbG9jIHRoZSBoZWFkZXIgYnVmZmVyIHRvIGJlIHVzZWQgY2FjaGUgc3BzIG9yIHNwcCBldGMuKi8KKwlpbnN0LT52c2ktPmhlYWRlcl9idWYgPSB2emFsbG9jKEhFQURFUl9CVUZGRVJfU0laRSk7CisJaWYgKCFpbnN0LT52c2ktPmhlYWRlcl9idWYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJaW5pdF9jb21wbGV0aW9uKCZpbnN0LT5jb21wKTsKKworCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfUFJJTkZPLAorCQkidnA5IEluc3RhbmNlID4+ICVseFxuIiwgKHVsb25nKSBpbnN0KTsKKworCWN0eC0+YWRhX2N0eAk9ICZpbnN0LT52ZGVjOworCSpoX3ZkZWMJCT0gKHVuc2lnbmVkIGxvbmcpaW5zdDsKKworCS8qIGluaXQgZGVjb2Rlci4gKi8KKwlyZXQgPSB2aWRlb19kZWNvZGVyX2luaXQoJmluc3QtPnZkZWMpOworCWlmIChyZXQpIHsKKwkJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJ2ZGVjX3ZwOSBpbml0IGVycj0lZFxuIiwgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0dXJuIDA7CitlcnI6CisJaWYgKGluc3QgJiYgaW5zdC0+dnNpICYmIGluc3QtPnZzaS0+aGVhZGVyX2J1ZikKKwkJdmZyZWUoaW5zdC0+dnNpLT5oZWFkZXJfYnVmKTsKKwlpZiAoaW5zdCAmJiBpbnN0LT52c2kpCisJCWtmcmVlKGluc3QtPnZzaSk7CisJaWYgKGluc3QpCisJCWtmcmVlKGluc3QpOworCSpoX3ZkZWMgPSAwOworCisJcmV0dXJuIHJldDsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQgcmVmZXJfYnVmZmVyX251bShpbnQgbGV2ZWxfaWRjLCBpbnQgcG9jX2NudCwKKwlpbnQgbWJfd2lkdGgsIGludCBtYl9oZWlnaHQpCit7CisJcmV0dXJuIDIwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgdmRlY19nZXRfZHdfbW9kZShzdHJ1Y3QgdmRlY192cDlfaW5zdCAqaW5zdCwgaW50IGR3X21vZGUpCit7CisJdTMyIHZhbGlkX2R3X21vZGUgPSBpbnN0LT5wYXJtcy5jZmcuZG91YmxlX3dyaXRlX21vZGU7CisJaW50IHcgPSBpbnN0LT52c2ktPnBpYy5jb2RlZF93aWR0aDsKKwlpbnQgaCA9IGluc3QtPnZzaS0+cGljLmNvZGVkX2hlaWdodDsKKwl1MzIgZHcgPSAweDE7IC8qMToxKi8KKworCXN3aXRjaCAodmFsaWRfZHdfbW9kZSkgeworCWNhc2UgMHgxMDA6CisJCWlmICh3ID4gMTkyMCAmJiBoID4gMTA4OCkKKwkJCWR3ID0gMHg0OyAvKjE6MiovCisJCWJyZWFrOworCWNhc2UgMHgyMDA6CisJCWlmICh3ID4gMTkyMCAmJiBoID4gMTA4OCkKKwkJCWR3ID0gMHgyOyAvKjE6NCovCisJCWJyZWFrOworCWNhc2UgMHgzMDA6CisJCWlmICh3ID4gMTI4MCAmJiBoID4gNzIwKQorCQkJZHcgPSAweDQ7IC8qMToyKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZHcgPSB2YWxpZF9kd19tb2RlOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZHc7Cit9CisKK3N0YXRpYyBpbnQgdmRlY19waWNfc2NhbGUoc3RydWN0IHZkZWNfdnA5X2luc3QgKmluc3QsIGludCBsZW5ndGgsIGludCBkd19tb2RlKQoreworCWludCByZXQgPSA2NDsKKworCXN3aXRjaCAodmRlY19nZXRfZHdfbW9kZShpbnN0LCBkd19tb2RlKSkgeworCWNhc2UgMHgwOiAvKiBvbmx5IGFmYmMsIG91dHB1dCBhZmJjICovCisJCXJldCA9IDY0OworCQlicmVhazsKKwljYXNlIDB4MTogLyogYWZiYyBhbmQgKHcgeCBoKSwgb3V0cHV0IFlVVjQyMCAqLworCQlyZXQgPSBsZW5ndGg7CisJCWJyZWFrOworCWNhc2UgMHgyOiAvKiBhZmJjIGFuZCAody80IHggaC80KSwgb3V0cHV0IFlVVjQyMCAqLworCWNhc2UgMHgzOiAvKiBhZmJjIGFuZCAody80IHggaC80KSwgb3V0cHV0IGFmYmMgYW5kIFlVVjQyMCAqLworCQlyZXQgPSBsZW5ndGggPj4gMjsKKwkJYnJlYWs7CisJY2FzZSAweDQ6IC8qIGFmYmMgYW5kICh3LzIgeCBoLzIpLCBvdXRwdXQgWVVWNDIwICovCisJCXJldCA9IGxlbmd0aCA+PiAxOworCQlicmVhazsKKwljYXNlIDB4MTA6IC8qICh3IHggaCksIG91dHB1dCBZVVY0MjAtOGJpdCkgKi8KKwlkZWZhdWx0OgorCQlyZXQgPSBsZW5ndGg7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfdmRlY19wYXJhbXMoc3RydWN0IHZkZWNfdnA5X2luc3QgKmluc3QsCisJc3RydWN0IFZQOUNvbnRleHQgKnZwOV9jdHgpCit7CisJc3RydWN0IHZkZWNfcGljX2luZm8gKnBpYyA9ICZpbnN0LT52c2ktPnBpYzsKKwlzdHJ1Y3QgdmRlY192cDlfZGVjX2luZm8gKmRlYyA9ICZpbnN0LT52c2ktPmRlYzsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0ID0gJmluc3QtPnZzaS0+Y3JvcDsKKwlpbnQgZHcgPSBpbnN0LT5wYXJtcy5jZmcuZG91YmxlX3dyaXRlX21vZGU7CisJaW50IG1hcmdpbiA9IGluc3QtPnBhcm1zLmNmZy5yZWZfYnVmX21hcmdpbjsKKworCS8qIGZpbGwgdmlzaWJsZSBhcmVhIHNpemUgdGhhdCBiZSB1c2VkIGZvciBFR0wuICovCisJcGljLT52aXNpYmxlX3dpZHRoCT0gdmRlY19waWNfc2NhbGUoaW5zdCwgdnA5X2N0eC0+cmVuZGVyX3dpZHRoLCBkdyk7CisJcGljLT52aXNpYmxlX2hlaWdodAk9IHZkZWNfcGljX3NjYWxlKGluc3QsIHZwOV9jdHgtPnJlbmRlcl9oZWlnaHQsIGR3KTsKKworCS8qIGNhbGMgdmlzaWJsZSBhcmVzLiAqLworCXJlY3QtPmxlZnQJCT0gMDsKKwlyZWN0LT50b3AJCT0gMDsKKwlyZWN0LT53aWR0aAkJPSBwaWMtPnZpc2libGVfd2lkdGg7CisJcmVjdC0+aGVpZ2h0CQk9IHBpYy0+dmlzaWJsZV9oZWlnaHQ7CisKKwkvKiBjb25maWcgY2FudmFzIHNpemUgdGhhdCBiZSB1c2VkIGZvciBkZWNvZGVyLiAqLworCXBpYy0+Y29kZWRfd2lkdGgJPSB2ZGVjX3BpY19zY2FsZShpbnN0LCBBTElHTih2cDlfY3R4LT53aWR0aCwgMzIpLCBkdyk7CisJcGljLT5jb2RlZF9oZWlnaHQJPSB2ZGVjX3BpY19zY2FsZShpbnN0LCBBTElHTih2cDlfY3R4LT5oZWlnaHQsIDMyKSwgZHcpOworCisJcGljLT55X2xlbl9zegkJPSBwaWMtPmNvZGVkX3dpZHRoICogcGljLT5jb2RlZF9oZWlnaHQ7CisJcGljLT5jX2xlbl9zegkJPSBwaWMtPnlfbGVuX3N6ID4+IDE7CisKKwkvKiBjYWxjIERQQiBzaXplICovCisJZGVjLT5kcGJfc3ogPSA1ICsgbWFyZ2luOy8vcmVmZXJfYnVmZmVyX251bShzcHMtPmxldmVsX2lkYywgcG9jX2NudCwgbWJfdywgbWJfaCk7CisKKwlpbnN0LT5wYXJtcy5wcy52aXNpYmxlX3dpZHRoCT0gcGljLT52aXNpYmxlX3dpZHRoOworCWluc3QtPnBhcm1zLnBzLnZpc2libGVfaGVpZ2h0CT0gcGljLT52aXNpYmxlX2hlaWdodDsKKwlpbnN0LT5wYXJtcy5wcy5jb2RlZF93aWR0aAk9IHBpYy0+Y29kZWRfd2lkdGg7CisJaW5zdC0+cGFybXMucHMuY29kZWRfaGVpZ2h0CT0gcGljLT5jb2RlZF9oZWlnaHQ7CisJaW5zdC0+cGFybXMucHMuZHBiX3NpemUJCT0gZGVjLT5kcGJfc3o7CisJaW5zdC0+cGFybXMucGFybXNfc3RhdHVzCXw9IFY0TDJfQ09ORklHX1BBUk1fREVDT0RFX1BTSU5GTzsKKworCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfQlVGTUdSLAorCQkiVGhlIHN0cmVhbSBpbmZvcywgZHc6ICVkLCBjb2RlZDooJWQgeCAlZCksIHZpc2libGU6KCVkIHggJWQpLCBEUEI6ICVkLCBtYXJnaW46ICVkXG4iLAorCQlkdywgcGljLT5jb2RlZF93aWR0aCwgcGljLT5jb2RlZF9oZWlnaHQsCisJCXBpYy0+dmlzaWJsZV93aWR0aCwgcGljLT52aXNpYmxlX2hlaWdodCwKKwkJZGVjLT5kcGJfc3ogLSBtYXJnaW4sIG1hcmdpbik7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfc3RyZWFtX3Vjb2RlKHN0cnVjdCB2ZGVjX3ZwOV9pbnN0ICppbnN0LAorCQkJICAgICAgdTggKmJ1ZiwgdTMyIHNpemUsIHU2NCB0aW1lc3RhbXAsIHVsb25nIG1ldGFfcHRyKQoreworCWludCByZXQgPSAwOworCisJcmV0ID0gdmRlY193cml0ZV9uYWx1KGluc3QsIGJ1Ziwgc2l6ZSwgdGltZXN0YW1wLCBtZXRhX3B0cik7CisJaWYgKHJldCA8IDApIHsKKwkJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJ3cml0ZSBmcmFtZSBkYXRhIGZhaWxlZC4gZXJyOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiB3YWl0IHVjb2RlIHBhcnNlIGVuZGluZy4gKi8KKwl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmluc3QtPmNvbXAsCisJCW1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOworCisJcmV0dXJuIGluc3QtPnZzaS0+cGljLmRwYl9mcmFtZXMgPyAwIDogLTE7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfc3RyZWFtX3Vjb2RlX2RtYShzdHJ1Y3QgdmRlY192cDlfaW5zdCAqaW5zdCwKKwl1bG9uZyBidWYsIHUzMiBzaXplLCB1NjQgdGltZXN0YW1wLCB1MzIgaGFuZGxlKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhbWxfdmRlY19hZGFwdCAqdmRlYyA9ICZpbnN0LT52ZGVjOworCisJcmV0ID0gdmRlY192ZnJhbWVfd3JpdGVfd2l0aF9kbWEodmRlYywgYnVmLCBzaXplLCB0aW1lc3RhbXAsIGhhbmRsZSwKKwkJdmRlY192ZnJhbWVfaW5wdXRfZnJlZSwgaW5zdC0+Y3R4KTsKKwlpZiAocmV0IDwgMCkgeworCQl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJIndyaXRlIGZyYW1lIGRhdGEgZmFpbGVkLiBlcnI6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIHdhaXQgdWNvZGUgcGFyc2UgZW5kaW5nLiAqLworCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaW5zdC0+Y29tcCwKKwkJbXNlY3NfdG9famlmZmllcygxMDAwKSk7CisKKwlyZXR1cm4gaW5zdC0+dnNpLT5waWMuZHBiX2ZyYW1lcyA/IDAgOiAtMTsKK30KKworc3RhdGljIGludCBwYXJzZV9zdHJlYW1fY3B1KHN0cnVjdCB2ZGVjX3ZwOV9pbnN0ICppbnN0LCB1OCAqYnVmLCB1MzIgc2l6ZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgdnA5X3BhcmFtX3NldHMgKnBzID0gTlVMTDsKKworCXBzID0gdnphbGxvYyhzaXplb2Yoc3RydWN0IHZwOV9wYXJhbV9zZXRzKSk7CisJaWYgKHBzID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gdnA5X2RlY29kZV9leHRyYWRhdGFfcHMoYnVmLCBzaXplLCBwcyk7CisJaWYgKHJldCkgeworCQl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJInBhcnNlIGV4dHJhIGRhdGEgZmFpbGVkLiBlcnI6ICVkXG4iLCByZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocHMtPmhlYWRfcGFyc2VkKQorCQlmaWxsX3ZkZWNfcGFyYW1zKGluc3QsICZwcy0+Y3R4KTsKKworCXJldCA9IHBzLT5oZWFkX3BhcnNlZCA/IDAgOiAtMTsKK291dDoKKwl2ZnJlZShwcyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZkZWNfdnA5X3Byb2JlKHVuc2lnbmVkIGxvbmcgaF92ZGVjLAorCXN0cnVjdCBhbWxfdmNvZGVjX21lbSAqYnMsIHZvaWQgKm91dCkKK3sKKwlzdHJ1Y3QgdmRlY192cDlfaW5zdCAqaW5zdCA9CisJCShzdHJ1Y3QgdmRlY192cDlfaW5zdCAqKWhfdmRlYzsKKwl1OCAqYnVmID0gKHU4ICopYnMtPnZhZGRyOworCXUzMiBzaXplID0gYnMtPnNpemU7CisJaW50IHJldCA9IDA7CisKKwlpZiAoaW5zdC0+Y3R4LT5pc19kcm1fbW9kZSkgeworCQlpZiAoYnMtPm1vZGVsID09IFZCMl9NRU1PUllfTU1BUCkgeworCQkJc3RydWN0IGFtbF92aWRlb19zdHJlYW0gKnMgPQorCQkJCShzdHJ1Y3QgYW1sX3ZpZGVvX3N0cmVhbSAqKSBidWY7CisKKwkJCWlmICgocy0+bWFnaWMgIT0gQU1MX1ZJREVPX01BR0lDKSAmJgorCQkJCShzLT50eXBlICE9IFY0TF9TVFJFQU1fVFlQRV9NQVRFREFUQSkpCisJCQkJcmV0dXJuIC0xOworCisJCQlpZiAoaW5zdC0+Y3R4LT5wYXJhbV9zZXRzX2Zyb21fdWNvZGUpIHsKKwkJCQlyZXQgPSBwYXJzZV9zdHJlYW1fdWNvZGUoaW5zdCwgcy0+ZGF0YSwKKwkJCQkJcy0+bGVuLCBicy0+dGltZXN0YW1wLCAwKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0ID0gcGFyc2Vfc3RyZWFtX2NwdShpbnN0LCBzLT5kYXRhLCBzLT5sZW4pOworCQkJfQorCQl9IGVsc2UgaWYgKGJzLT5tb2RlbCA9PSBWQjJfTUVNT1JZX0RNQUJVRiB8fAorCQkJYnMtPm1vZGVsID09IFZCMl9NRU1PUllfVVNFUlBUUikgeworCQkJcmV0ID0gcGFyc2Vfc3RyZWFtX3Vjb2RlX2RtYShpbnN0LCBicy0+YWRkciwgc2l6ZSwKKwkJCQlicy0+dGltZXN0YW1wLCBCVUZGX0lEWChicywgYnMtPmluZGV4KSk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoaW5zdC0+Y3R4LT5wYXJhbV9zZXRzX2Zyb21fdWNvZGUpIHsKKwkJCXJldCA9IHBhcnNlX3N0cmVhbV91Y29kZShpbnN0LCBidWYsIHNpemUsIGJzLT50aW1lc3RhbXAsIGJzLT5tZXRhX3B0cik7CisJCX0gZWxzZSB7CisJCQlyZXQgPSBwYXJzZV9zdHJlYW1fY3B1KGluc3QsIGJ1Ziwgc2l6ZSk7CisJCX0KKwl9CisKKwlpbnN0LT52c2ktPmN1cl9waWMgPSBpbnN0LT52c2ktPnBpYzsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHZkZWNfdnA5X2RlaW5pdCh1bnNpZ25lZCBsb25nIGhfdmRlYykKK3sKKwlzdHJ1Y3QgdmRlY192cDlfaW5zdCAqaW5zdCA9IChzdHJ1Y3QgdmRlY192cDlfaW5zdCAqKWhfdmRlYzsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IGluc3QtPmN0eDsKKworCXZpZGVvX2RlY29kZXJfcmVsZWFzZSgmaW5zdC0+dmRlYyk7CisKKwlpZiAoaW5zdC0+dnNpICYmIGluc3QtPnZzaS0+aGVhZGVyX2J1ZikKKwkJdmZyZWUoaW5zdC0+dnNpLT5oZWFkZXJfYnVmKTsKKworCWlmIChpbnN0LT52c2kpCisJCWtmcmVlKGluc3QtPnZzaSk7CisKKwlrZnJlZShpbnN0KTsKKworCWN0eC0+ZHJ2X2hhbmRsZSA9IDA7CisKKwluZWVkX3RyaWdnZXIgPSBmYWxzZTsKKwlkdW1wX2NudCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9wcmVmaXhfZGF0YShzdHJ1Y3QgdnA5X3N1cGVyZnJhbWVfc3BsaXQgKnMsCisJdTggKipvdXQsIHUzMiAqb3V0X3NpemUpCit7CisJaW50IGk7CisJdTggKnAgPSBOVUxMOworCXUzMiBsZW5ndGg7CisKKwlsZW5ndGggPSBzLT5zaXplICsgcy0+bmJfZnJhbWVzICogUFJFRklYX1NJWkU7CisJaWYgKCFsZW5ndGgpCisJCXJldHVybjsKKwlwID0gdnphbGxvYyhsZW5ndGgpOworCWlmICghcCkgeworCQl2NGxfZGJnKDAsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJhbGxvYyBzaXplICVkIGZhaWxlZC5cbiIgLGxlbmd0aCk7CisJCXJldHVybjsKKwl9CisKKwltZW1jcHkocCwgcy0+ZGF0YSwgcy0+c2l6ZSk7CisJcCArPSBzLT5zaXplOworCisJZm9yIChpID0gcy0+bmJfZnJhbWVzOyBpID4gMDsgaS0tKSB7CisJCXUzMiBmcmFtZV9zaXplID0gcy0+c2l6ZXNbaSAtIDFdOworCQl1OCAqcHJlZml4ID0gTlVMTDsKKworCQlwIC09IGZyYW1lX3NpemU7CisJCW1lbW1vdmUocCArIFBSRUZJWF9TSVpFICogaSwgcCwgZnJhbWVfc2l6ZSk7CisJCXByZWZpeCA9IHAgKyBQUkVGSVhfU0laRSAqIChpIC0gMSk7CisKKwkJLyphZGQgYW1sb2dpYyBmcmFtZSBoZWFkZXJzLiovCisJCWZyYW1lX3NpemUgKz0gMTY7CisJCXByZWZpeFswXSAgPSAoZnJhbWVfc2l6ZSA+PiAyNCkgJiAweGZmOworCQlwcmVmaXhbMV0gID0gKGZyYW1lX3NpemUgPj4gMTYpICYgMHhmZjsKKwkJcHJlZml4WzJdICA9IChmcmFtZV9zaXplID4+IDggKSAmIDB4ZmY7CisJCXByZWZpeFszXSAgPSAoZnJhbWVfc2l6ZSA+PiAwICkgJiAweGZmOworCQlwcmVmaXhbNF0gID0gKChmcmFtZV9zaXplID4+IDI0KSAmIDB4ZmYpIF4gMHhmZjsKKwkJcHJlZml4WzVdICA9ICgoZnJhbWVfc2l6ZSA+PiAxNikgJiAweGZmKSBeIDB4ZmY7CisJCXByZWZpeFs2XSAgPSAoKGZyYW1lX3NpemUgPj4gOCApICYgMHhmZikgXiAweGZmOworCQlwcmVmaXhbN10gID0gKChmcmFtZV9zaXplID4+IDAgKSAmIDB4ZmYpIF4gMHhmZjsKKwkJcHJlZml4WzhdICA9IDA7CisJCXByZWZpeFs5XSAgPSAwOworCQlwcmVmaXhbMTBdID0gMDsKKwkJcHJlZml4WzExXSA9IDE7CisJCXByZWZpeFsxMl0gPSAnQSc7CisJCXByZWZpeFsxM10gPSAnTSc7CisJCXByZWZpeFsxNF0gPSAnTCc7CisJCXByZWZpeFsxNV0gPSAnVic7CisJCWZyYW1lX3NpemUgLT0gMTY7CisJfQorCisJKm91dCA9IHA7CisJKm91dF9zaXplID0gbGVuZ3RoOworfQorCisjaWZuZGVmIENPTkZJR19BTUxPR0lDX01FRElBX1Y0TF9TT0ZUV0FSRV9QQVJTRVIKK3N0YXRpYyBpbnQgdnA5X3N1cGVyZnJhbWVfc3BsaXRfZmlsdGVyKHN0cnVjdCB2cDlfc3VwZXJmcmFtZV9zcGxpdCAqcykKK3sKKwlpbnQgaSwgaiwgcmV0LCBtYXJrZXI7CisJYm9vbCBpc19zdXBlcmZyYW1lID0gZmFsc2U7CisJaW50ICpwcmVmaXggPSAoaW50ICopcy0+ZGF0YTsKKworCWlmICghcy0+ZGF0YSkKKwkJcmV0dXJuIC0xOworCisjZGVmaW5lIEFNTF9QUkVGSVggKCdWJyA8PCAyNCB8ICdMJyA8PCAxNiB8ICdNJyA8PCA4IHwgJ0EnKQorCWlmIChwcmVmaXhbM10gPT0gQU1MX1BSRUZJWCkgeworCQlzLT5wcmVmaXhfc2l6ZSA9IDE2OworCQkvKnByX2luZm8oInRoZSBmcmFtZSBkYXRhIGhhcyBiZWVkIGFkZGVkIGhlYWRlclxuIik7Ki8KKwl9CisKKwltYXJrZXIgPSBzLT5kYXRhW3MtPmRhdGFfc2l6ZSAtIDFdOworCWlmICgobWFya2VyICYgMHhlMCkgPT0gMHhjMCkgeworCQlpbnQgbGVuZ3RoX3NpemUgPSAxICsgKChtYXJrZXIgPj4gMykgJiAweDMpOworCQlpbnQgICBuYl9mcmFtZXMgPSAxICsgKG1hcmtlciAmIDB4Nyk7CisJCWludCAgICBpZHhfc2l6ZSA9IDIgKyBuYl9mcmFtZXMgKiBsZW5ndGhfc2l6ZTsKKworCQlpZiAocy0+ZGF0YV9zaXplID49IGlkeF9zaXplICYmCisJCQlzLT5kYXRhW3MtPmRhdGFfc2l6ZSAtIGlkeF9zaXplXSA9PSBtYXJrZXIpIHsKKwkJCXM2NCB0b3RhbF9zaXplID0gMDsKKwkJCWludCBpZHggPSBzLT5kYXRhX3NpemUgKyAxIC0gaWR4X3NpemU7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBuYl9mcmFtZXM7IGkrKykgeworCQkJCWludCBmcmFtZV9zaXplID0gMDsKKwkJCQlmb3IgKGogPSAwOyBqIDwgbGVuZ3RoX3NpemU7IGorKykKKwkJCQkJZnJhbWVfc2l6ZSB8PSBzLT5kYXRhW2lkeCsrXSA8PCAoaiAqIDgpOworCisJCQkJdG90YWxfc2l6ZSArPSBmcmFtZV9zaXplOworCQkJCWlmIChmcmFtZV9zaXplIDwgMCB8fAorCQkJCQl0b3RhbF9zaXplID4gcy0+ZGF0YV9zaXplIC0gaWR4X3NpemUpIHsKKwkJCQkJdjRsX2RiZygwLCBWNExfREVCVUdfQ09ERUNfRVJST1IsICJJbnZhbGlkIGZyYW1lIHNpemUgaW4gYSBzZnJhbWU6ICVkXG4iLAorCQkJCQkJZnJhbWVfc2l6ZSk7CisJCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJCWdvdG8gZmFpbDsKKwkJCQl9CisJCQkJcy0+c2l6ZXNbaV0gPSBmcmFtZV9zaXplOworCQkJfQorCisJCQlzLT5uYl9mcmFtZXMJICAgICA9IG5iX2ZyYW1lczsKKwkJCXMtPnNpemUgCSAgICAgPSB0b3RhbF9zaXplOworCQkJcy0+bmV4dF9mcmFtZQkgICAgID0gMDsKKwkJCXMtPm5leHRfZnJhbWVfb2Zmc2V0ID0gMDsKKwkJCWlzX3N1cGVyZnJhbWUJICAgICA9IHRydWU7CisJCX0KKwl9ZWxzZSB7CisJCXMtPm5iX2ZyYW1lcyA9IDE7CisJCXMtPnNpemVzWzBdICA9IHMtPmRhdGFfc2l6ZTsKKwkJcy0+c2l6ZSAgICAgID0gcy0+ZGF0YV9zaXplOworCX0KKworCS8qcHJfaW5mbygic2ZyYW1lOiAlZCwgZnJhbWVzOiAlZCwgSU46ICV4LCBPVVQ6ICV4XG4iLAorCQlpc19zdXBlcmZyYW1lLCBzLT5uYl9mcmFtZXMsCisJCXMtPmRhdGFfc2l6ZSwgcy0+c2l6ZSk7Ki8KKworCS8qIHBhcnNlIHVuY29tcHJlc3NlZCBoZWFkZXIuICovCisJaWYgKGlzX3N1cGVyZnJhbWUpIHsKKwkJLyogYml0c3RyZWFtIHByb2ZpbGUuICovCisJCS8qIGZyYW1lIHR5cGUuIChpbnRyYSBvciBpbnRlcikgKi8KKwkJLyogY29sb3JzcGFjZSBkZXNjcmlwdG9yICovCisJCS8qIC4uLiAqLworCisJCXY0bF9kYmcoMCwgVjRMX0RFQlVHX0NPREVDX1BBUlNFUiwgInRoZSBmcmFtZSBpcyBhIHN1cGVyZnJhbWUuXG4iKTsKKwl9CisKKwkvKnByX2VycigiaW46ICV4LCAlZCwgb3V0OiAleCwgc2l6ZXMgJWQsJWQsJWQsJWQsJWQsJWQsJWQsJWRcbiIsCisJCXMtPmRhdGFfc2l6ZSwKKwkJcy0+bmJfZnJhbWVzLAorCQlzLT5zaXplLAorCQlzLT5zaXplc1swXSwKKwkJcy0+c2l6ZXNbMV0sCisJCXMtPnNpemVzWzJdLAorCQlzLT5zaXplc1szXSwKKwkJcy0+c2l6ZXNbNF0sCisJCXMtPnNpemVzWzVdLAorCQlzLT5zaXplc1s2XSwKKwkJcy0+c2l6ZXNbN10pOyovCisKKwlyZXR1cm4gMDsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB0cmlnZ2VyX2RlY29kZXIoc3RydWN0IGFtbF92ZGVjX2FkYXB0ICp2ZGVjKQoreworCWludCBpLCByZXQ7CisJdTMyIGZyYW1lX3NpemUgPSAwOworCXU4ICpwID0gdnA5X3RyaWdnZXJfaGVhZGVyOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodnA5X3RyaWdnZXJfZnJhbWVzaXplKTsgaSsrKSB7CisJCWZyYW1lX3NpemUgPSB2cDlfdHJpZ2dlcl9mcmFtZXNpemVbaV07CisJCXJldCA9IHZkZWNfdmZyYW1lX3dyaXRlKHZkZWMsIHAsCisJCQlmcmFtZV9zaXplLCAwLCAwKTsKKwkJdjRsX2RiZyh2ZGVjLT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJ3cml0ZSB0cmlnZ2VyIGZyYW1lICVkXG4iLCByZXQpOworCQlwICs9IGZyYW1lX3NpemU7CisJfQorfQorCitzdGF0aWMgaW50IHZkZWNfd3JpdGVfbmFsdShzdHJ1Y3QgdmRlY192cDlfaW5zdCAqaW5zdCwKKwl1OCAqYnVmLCB1MzIgc2l6ZSwgdTY0IHRzLCB1bG9uZyBtZXRhX3B0cikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYW1sX3ZkZWNfYWRhcHQgKnZkZWMgPSAmaW5zdC0+dmRlYzsKKwlzdHJ1Y3QgdnA5X3N1cGVyZnJhbWVfc3BsaXQgczsKKwl1OCAqZGF0YSA9IE5VTEw7CisJdTMyIGxlbmd0aCA9IDA7CisJYm9vbCBuZWVkX3ByZWZpeCA9IHZwOV9uZWVkX3ByZWZpeDsKKworCW1lbXNldCgmcywgMCwgc2l6ZW9mKHMpKTsKKworCS8qdHJpZ2dlci4qLworCWlmICgwICYmICFuZWVkX3RyaWdnZXIpIHsKKwkJdHJpZ2dlcl9kZWNvZGVyKHZkZWMpOworCQluZWVkX3RyaWdnZXIgPSB0cnVlOworCX0KKworCWlmIChuZWVkX3ByZWZpeCkgeworCQkvKnBhcnNlIHN1cGVyZnJhbWUuKi8KKwkJcy5kYXRhID0gYnVmOworCQlzLmRhdGFfc2l6ZSA9IHNpemU7CisJCXJldCA9IHZwOV9zdXBlcmZyYW1lX3NwbGl0X2ZpbHRlcigmcyk7CisJCWlmIChyZXQpIHsKKwkJCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkJInBhcnNlIGZyYW1lcyBmYWlsZWQuXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQkvKmFkZCBoZWFkZXJzLiovCisJCWFkZF9wcmVmaXhfZGF0YSgmcywgJmRhdGEsICZsZW5ndGgpOworCQlyZXQgPSB2ZGVjX3ZmcmFtZV93cml0ZSh2ZGVjLCBkYXRhLCBsZW5ndGgsIHRzLCAwKTsKKwkJdmZyZWUoZGF0YSk7CisJfSBlbHNlIHsKKwkJcmV0ID0gdmRlY192ZnJhbWVfd3JpdGUodmRlYywgYnVmLCBzaXplLCB0cywgbWV0YV9wdHIpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBib29sIG1vbml0b3JfcmVzX2NoYW5nZShzdHJ1Y3QgdmRlY192cDlfaW5zdCAqaW5zdCwgdTggKmJ1ZiwgdTMyIHNpemUpCit7CisJaW50IHJldCA9IC0xOworCXU4ICpwID0gYnVmOworCWludCBsZW4gPSBzaXplOworCXUzMiBzeW5jY29kZSA9IHZwOV9uZWVkX3ByZWZpeCA/CisJCSgocFsxXSA8PCAxNikgfCAocFsyXSA8PCA4KSB8IHBbM10pIDoKKwkJKChwWzE3XSA8PCAxNikgfCAocFsxOF0gPDwgOCkgfCBwWzE5XSk7CisKKwlpZiAoc3luY2NvZGUgPT0gU1lOQ19DT0RFKSB7CisJCXJldCA9IHBhcnNlX3N0cmVhbV9jcHUoaW5zdCwgcCwgbGVuKTsKKwkJaWYgKCFyZXQgJiYgKGluc3QtPnZzaS0+Y3VyX3BpYy5jb2RlZF93aWR0aCAhPQorCQkJaW5zdC0+dnNpLT5waWMuY29kZWRfd2lkdGggfHwKKwkJCWluc3QtPnZzaS0+Y3VyX3BpYy5jb2RlZF9oZWlnaHQgIT0KKwkJCWluc3QtPnZzaS0+cGljLmNvZGVkX2hlaWdodCkpIHsKKwkJCWluc3QtPnZzaS0+Y3VyX3BpYyA9IGluc3QtPnZzaS0+cGljOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgdmRlY192cDlfZGVjb2RlKHVuc2lnbmVkIGxvbmcgaF92ZGVjLAorCQkJICAgc3RydWN0IGFtbF92Y29kZWNfbWVtICpicywgYm9vbCAqcmVzX2NoZykKK3sKKwlzdHJ1Y3QgdmRlY192cDlfaW5zdCAqaW5zdCA9IChzdHJ1Y3QgdmRlY192cDlfaW5zdCAqKWhfdmRlYzsKKwlzdHJ1Y3QgYW1sX3ZkZWNfYWRhcHQgKnZkZWMgPSAmaW5zdC0+dmRlYzsKKwl1OCAqYnVmID0gKHU4ICopIGJzLT52YWRkcjsKKwl1MzIgc2l6ZSA9IGJzLT5zaXplOworCWludCByZXQgPSAtMTsKKworCWlmIChicyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAodmRlY19pbnB1dF9mdWxsKHZkZWMpKSB7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCWlmIChpbnN0LT5jdHgtPmlzX2RybV9tb2RlKSB7CisJCWlmIChicy0+bW9kZWwgPT0gVkIyX01FTU9SWV9NTUFQKSB7CisJCQlzdHJ1Y3QgYW1sX3ZpZGVvX3N0cmVhbSAqcyA9CisJCQkJKHN0cnVjdCBhbWxfdmlkZW9fc3RyZWFtICopIGJ1ZjsKKworCQkJaWYgKHMtPm1hZ2ljICE9IEFNTF9WSURFT19NQUdJQykKKwkJCQlyZXR1cm4gLTE7CisKKwkJCWlmICghaW5zdC0+Y3R4LT5wYXJhbV9zZXRzX2Zyb21fdWNvZGUgJiYKKwkJCQkocy0+dHlwZSA9PSBWNExfU1RSRUFNX1RZUEVfTUFURURBVEEpKSB7CisJCQkJaWYgKCgqcmVzX2NoZyA9IG1vbml0b3JfcmVzX2NoYW5nZShpbnN0LAorCQkJCQlzLT5kYXRhLCBzLT5sZW4pKSkKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJcmV0ID0gdmRlY192ZnJhbWVfd3JpdGUodmRlYywKKwkJCQlzLT5kYXRhLAorCQkJCXMtPmxlbiwKKwkJCQlicy0+dGltZXN0YW1wLAorCQkJCTApOworCQl9IGVsc2UgaWYgKGJzLT5tb2RlbCA9PSBWQjJfTUVNT1JZX0RNQUJVRiB8fAorCQkJYnMtPm1vZGVsID09IFZCMl9NRU1PUllfVVNFUlBUUikgeworCQkJcmV0ID0gdmRlY192ZnJhbWVfd3JpdGVfd2l0aF9kbWEodmRlYywKKwkJCQlicy0+YWRkciwgc2l6ZSwgYnMtPnRpbWVzdGFtcCwKKwkJCQlCVUZGX0lEWChicywgYnMtPmluZGV4KSwKKwkJCQl2ZGVjX3ZmcmFtZV9pbnB1dF9mcmVlLCBpbnN0LT5jdHgpOworCQl9CisJfSBlbHNlIHsKKwkJLypjaGVja2VkIHdoZXRoZXIgdGhlIHJlc29sdXRpb24gY2hhbmdlcy4qLworCQlpZiAoKCFpbnN0LT5jdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSkgJiYKKwkJCSgqcmVzX2NoZyA9IG1vbml0b3JfcmVzX2NoYW5nZShpbnN0LCBidWYsIHNpemUpKSkKKwkJCXJldHVybiAwOworCQlyZXQgPSB2ZGVjX3dyaXRlX25hbHUoaW5zdCwgYnVmLCBzaXplLCBicy0+dGltZXN0YW1wLCBicy0+bWV0YV9wdHIpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKyBzdGF0aWMgdm9pZCBnZXRfcGFyYW1fY29uZmlnX2luZm8oc3RydWN0IHZkZWNfdnA5X2luc3QgKmluc3QsCisJc3RydWN0IGFtbF9kZWNfcGFyYW1zICpwYXJtcykKKyB7CisJIGlmIChpbnN0LT5wYXJtcy5wYXJtc19zdGF0dXMgJiBWNEwyX0NPTkZJR19QQVJNX0RFQ09ERV9DRkdJTkZPKQorCQkgcGFybXMtPmNmZyA9IGluc3QtPnBhcm1zLmNmZzsKKwkgaWYgKGluc3QtPnBhcm1zLnBhcm1zX3N0YXR1cyAmIFY0TDJfQ09ORklHX1BBUk1fREVDT0RFX1BTSU5GTykKKwkJIHBhcm1zLT5wcyA9IGluc3QtPnBhcm1zLnBzOworCSBpZiAoaW5zdC0+cGFybXMucGFybXNfc3RhdHVzICYgVjRMMl9DT05GSUdfUEFSTV9ERUNPREVfSERSSU5GTykKKwkJIHBhcm1zLT5oZHIgPSBpbnN0LT5wYXJtcy5oZHI7CisJIGlmIChpbnN0LT5wYXJtcy5wYXJtc19zdGF0dXMgJiBWNEwyX0NPTkZJR19QQVJNX0RFQ09ERV9DTlRJTkZPKQorCQkgcGFybXMtPmNudCA9IGluc3QtPnBhcm1zLmNudDsKKworCSBwYXJtcy0+cGFybXNfc3RhdHVzIHw9IGluc3QtPnBhcm1zLnBhcm1zX3N0YXR1czsKKworCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVhJTkZPLAorCQkicGFybXMgc3RhdHVzOiAldVxuIiwgcGFybXMtPnBhcm1zX3N0YXR1cyk7CisgfQorCitzdGF0aWMgdm9pZCBnZXRfcGFyYW1fY29tcF9idWZfaW5mbyhzdHJ1Y3QgdmRlY192cDlfaW5zdCAqaW5zdCwKKwkJc3RydWN0IHZkZWNfY29tcF9idWZfaW5mbyAqcGFyYW1zKQoreworCW1lbWNweShwYXJhbXMsICZpbnN0LT5jb21wX2luZm8sIHNpemVvZigqcGFyYW1zKSk7Cit9CisKK3N0YXRpYyBpbnQgdmRlY192cDlfZ2V0X3BhcmFtKHVuc2lnbmVkIGxvbmcgaF92ZGVjLAorCQkJICAgICAgIGVudW0gdmRlY19nZXRfcGFyYW1fdHlwZSB0eXBlLCB2b2lkICpvdXQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHZkZWNfdnA5X2luc3QgKmluc3QgPSAoc3RydWN0IHZkZWNfdnA5X2luc3QgKiloX3ZkZWM7CisKKwlpZiAoIWluc3QpIHsKKwkJdjRsX2RiZyhpbnN0LT5jdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCSJ0aGUgdnA5IGluc3Qgb2YgZGVjIGlzIGludmFsaWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgR0VUX1BBUkFNX1BJQ19JTkZPOgorCQlnZXRfcGljX2luZm8oaW5zdCwgb3V0KTsKKwkJYnJlYWs7CisKKwljYXNlIEdFVF9QQVJBTV9EUEJfU0laRToKKwkJZ2V0X2RwYl9zaXplKGluc3QsIG91dCk7CisJCWJyZWFrOworCisJY2FzZSBHRVRfUEFSQU1fQ1JPUF9JTkZPOgorCQlnZXRfY3JvcF9pbmZvKGluc3QsIG91dCk7CisJCWJyZWFrOworCisJY2FzZSBHRVRfUEFSQU1fQ09ORklHX0lORk86CisJCWdldF9wYXJhbV9jb25maWdfaW5mbyhpbnN0LCBvdXQpOworCQlicmVhazsKKworCWNhc2UgR0VUX1BBUkFNX0RXX01PREU6CisJeworCQl1MzIgKm1vZGUgPSBvdXQ7CisJCXUzMiBtID0gaW5zdC0+Y3R4LT5jb25maWcucGFybS5kZWMuY2ZnLmRvdWJsZV93cml0ZV9tb2RlOworCQlpZiAobSA8PSAxNikKKwkJCSptb2RlID0gaW5zdC0+Y3R4LT5jb25maWcucGFybS5kZWMuY2ZnLmRvdWJsZV93cml0ZV9tb2RlOworCQllbHNlCisJCQkqbW9kZSA9IHZkZWNfZ2V0X2R3X21vZGUoaW5zdCwgMCk7CisJCWJyZWFrOworCX0KKwljYXNlIEdFVF9QQVJBTV9DT01QX0JVRl9JTkZPOgorCQlnZXRfcGFyYW1fY29tcF9idWZfaW5mbyhpbnN0LCBvdXQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkiaW52YWxpZCBnZXQgcGFyYW1ldGVyIHR5cGU9JWRcbiIsIHR5cGUpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9wYXJhbV93cml0ZV9zeW5jKHN0cnVjdCB2ZGVjX3ZwOV9pbnN0ICppbnN0KQoreworCWNvbXBsZXRlKCZpbnN0LT5jb21wKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3BhcmFtX3BzX2luZm8oc3RydWN0IHZkZWNfdnA5X2luc3QgKmluc3QsCisJc3RydWN0IGFtbF92ZGVjX3BzX2luZm9zICpwcykKK3sKKwlzdHJ1Y3QgdmRlY19waWNfaW5mbyAqcGljID0gJmluc3QtPnZzaS0+cGljOworCXN0cnVjdCB2ZGVjX3ZwOV9kZWNfaW5mbyAqZGVjID0gJmluc3QtPnZzaS0+ZGVjOworCXN0cnVjdCB2NGwyX3JlY3QgKnJlY3QgPSAmaW5zdC0+dnNpLT5jcm9wOworCWludCBkdyA9IGluc3QtPnBhcm1zLmNmZy5kb3VibGVfd3JpdGVfbW9kZTsKKworCS8qIGZpbGwgdmlzaWJsZSBhcmVhIHNpemUgdGhhdCBiZSB1c2VkIGZvciBFR0wuICovCisJcGljLT52aXNpYmxlX3dpZHRoCT0gcHMtPnZpc2libGVfd2lkdGg7CisJcGljLT52aXNpYmxlX2hlaWdodAk9IHBzLT52aXNpYmxlX2hlaWdodDsKKworCS8qIGNhbGMgdmlzaWJsZSBhcmVzLiAqLworCXJlY3QtPmxlZnQJCT0gMDsKKwlyZWN0LT50b3AJCT0gMDsKKwlyZWN0LT53aWR0aAkJPSBwaWMtPnZpc2libGVfd2lkdGg7CisJcmVjdC0+aGVpZ2h0CQk9IHBpYy0+dmlzaWJsZV9oZWlnaHQ7CisKKwkvKiBjb25maWcgY2FudmFzIHNpemUgdGhhdCBiZSB1c2VkIGZvciBkZWNvZGVyLiAqLworCXBpYy0+Y29kZWRfd2lkdGgJPSBwcy0+Y29kZWRfd2lkdGg7CisJcGljLT5jb2RlZF9oZWlnaHQJPSBwcy0+Y29kZWRfaGVpZ2h0OworCisJcGljLT55X2xlbl9zegkJPSBBTElHTih2ZGVjX3BpY19zY2FsZShpbnN0LCBwaWMtPmNvZGVkX3dpZHRoLCBkdyksIDY0KSAqCisJCQkJICBBTElHTih2ZGVjX3BpY19zY2FsZShpbnN0LCBwaWMtPmNvZGVkX2hlaWdodCwgZHcpLCA2NCk7CisJcGljLT5jX2xlbl9zegkJPSBwaWMtPnlfbGVuX3N6ID4+IDE7CisKKwkvKiBjYWxjIERQQiBzaXplICovCisJcGljLT5kcGJfZnJhbWVzCQk9IHBzLT5kcGJfZnJhbWVzOworCXBpYy0+ZHBiX21hcmdpbgkJPSBwcy0+ZHBiX21hcmdpbjsKKwlwaWMtPnZwcF9tYXJnaW4JCT0gcHMtPmRwYl9tYXJnaW47CisJZGVjLT5kcGJfc3oJCT0gcHMtPmRwYl9zaXplOworCXBpYy0+ZmllbGQJCT0gcHMtPmZpZWxkOworCisJaW5zdC0+cGFybXMucHMgCT0gKnBzOworCWluc3QtPnBhcm1zLnBhcm1zX3N0YXR1cyB8PQorCQlWNEwyX0NPTkZJR19QQVJNX0RFQ09ERV9QU0lORk87CisKKwkvKndha2UgdXAqLworCWNvbXBsZXRlKCZpbnN0LT5jb21wKTsKKworCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfUFJJTkZPLAorCQkiUGFyc2UgZnJvbSB1Y29kZSwgdmlzaWJsZSglZCB4ICVkKSwgY29kZWQoJWQgeCAlZClcbiIsCisJCXBpYy0+dmlzaWJsZV93aWR0aCwgcGljLT52aXNpYmxlX2hlaWdodCwKKwkJcGljLT5jb2RlZF93aWR0aCwgcGljLT5jb2RlZF9oZWlnaHQpOworfQorCitzdGF0aWMgdm9pZCBzZXRfcGFyYW1fY29tcF9idWZfaW5mbyhzdHJ1Y3QgdmRlY192cDlfaW5zdCAqaW5zdCwKKwkJc3RydWN0IHZkZWNfY29tcF9idWZfaW5mbyAqaW5mbykKK3sKKwltZW1jcHkoJmluc3QtPmNvbXBfaW5mbywgaW5mbywgc2l6ZW9mKCppbmZvKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9wYXJhbV9oZHJfaW5mbyhzdHJ1Y3QgdmRlY192cDlfaW5zdCAqaW5zdCwKKwlzdHJ1Y3QgYW1sX3ZkZWNfaGRyX2luZm9zICpoZHIpCit7CisJaWYgKChpbnN0LT5wYXJtcy5wYXJtc19zdGF0dXMgJgorCQlWNEwyX0NPTkZJR19QQVJNX0RFQ09ERV9IRFJJTkZPKSkgeworCQlpbnN0LT5wYXJtcy5oZHIgPSAqaGRyOworCQlpbnN0LT5wYXJtcy5wYXJtc19zdGF0dXMgfD0KKwkJCVY0TDJfQ09ORklHX1BBUk1fREVDT0RFX0hEUklORk87CisJCWFtbF92ZGVjX2Rpc3BhdGNoX2V2ZW50KGluc3QtPmN0eCwKKwkJCVY0TDJfRVZFTlRfU1JDX0NIX0hEUklORk8pOworCQl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VYSU5GTywKKwkJCSJWUDkgc2V0IEhEUiBpbmZvc1xuIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXRfcGFyYW1fcG9zdF9ldmVudChzdHJ1Y3QgdmRlY192cDlfaW5zdCAqaW5zdCwgdTMyICpldmVudCkKK3sKKwkJYW1sX3ZkZWNfZGlzcGF0Y2hfZXZlbnQoaW5zdC0+Y3R4LCAqZXZlbnQpOworCQl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX1BSSU5GTywKKwkJCSJWUDkgcG9zdCBldmVudDogJWRcbiIsICpldmVudCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9waWNfaW5mbyhzdHJ1Y3QgdmRlY192cDlfaW5zdCAqaW5zdCwKKwlzdHJ1Y3QgdmRlY19waWNfaW5mbyAqcGljKQoreworCWluc3QtPnZzaS0+cGljID0gKnBpYzsKK30KKworc3RhdGljIGludCB2ZGVjX3ZwOV9zZXRfcGFyYW0odW5zaWduZWQgbG9uZyBoX3ZkZWMsCisJZW51bSB2ZGVjX3NldF9wYXJhbV90eXBlIHR5cGUsIHZvaWQgKmluKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCB2ZGVjX3ZwOV9pbnN0ICppbnN0ID0gKHN0cnVjdCB2ZGVjX3ZwOV9pbnN0ICopaF92ZGVjOworCisJaWYgKCFpbnN0KSB7CisJCXY0bF9kYmcoaW5zdC0+Y3R4LCBWNExfREVCVUdfQ09ERUNfRVJST1IsCisJCQkidGhlIHZwOSBpbnN0IG9mIGRlYyBpcyBpbnZhbGlkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNFVF9QQVJBTV9XUklURV9GUkFNRV9TWU5DOgorCQlzZXRfcGFyYW1fd3JpdGVfc3luYyhpbnN0KTsKKwkJYnJlYWs7CisKKwljYXNlIFNFVF9QQVJBTV9QU19JTkZPOgorCQlzZXRfcGFyYW1fcHNfaW5mbyhpbnN0LCBpbik7CisJCWJyZWFrOworCisJY2FzZSBTRVRfUEFSQU1fQ09NUF9CVUZfSU5GTzoKKwkJc2V0X3BhcmFtX2NvbXBfYnVmX2luZm8oaW5zdCwgaW4pOworCQlicmVhazsKKworCWNhc2UgU0VUX1BBUkFNX0hEUl9JTkZPOgorCQlzZXRfcGFyYW1faGRyX2luZm8oaW5zdCwgaW4pOworCQlicmVhazsKKworCWNhc2UgU0VUX1BBUkFNX1BPU1RfRVZFTlQ6CisJCXNldF9wYXJhbV9wb3N0X2V2ZW50KGluc3QsIGluKTsKKwkJYnJlYWs7CisKKwljYXNlIFNFVF9QQVJBTV9QSUNfSU5GTzoKKwkJc2V0X3BpY19pbmZvKGluc3QsIGluKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQl2NGxfZGJnKGluc3QtPmN0eCwgVjRMX0RFQlVHX0NPREVDX0VSUk9SLAorCQkJImludmFsaWQgc2V0IHBhcmFtZXRlciB0eXBlPSVkXG4iLCB0eXBlKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHZkZWNfY29tbW9uX2lmIHZkZWNfdnA5X2lmID0geworCS5pbml0CQk9IHZkZWNfdnA5X2luaXQsCisJLnByb2JlCQk9IHZkZWNfdnA5X3Byb2JlLAorCS5kZWNvZGUJCT0gdmRlY192cDlfZGVjb2RlLAorCS5nZXRfcGFyYW0JPSB2ZGVjX3ZwOV9nZXRfcGFyYW0sCisJLnNldF9wYXJhbQk9IHZkZWNfdnA5X3NldF9wYXJhbSwKKwkuZGVpbml0CQk9IHZkZWNfdnA5X2RlaW5pdCwKK307CisKK3N0cnVjdCB2ZGVjX2NvbW1vbl9pZiAqZ2V0X3ZwOV9kZWNfY29tbV9pZih2b2lkKTsKKworc3RydWN0IHZkZWNfY29tbW9uX2lmICpnZXRfdnA5X2RlY19jb21tX2lmKHZvaWQpCit7CisJcmV0dXJuICZ2ZGVjX3ZwOV9pZjsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbXZkZWNfcG9ydHMvZGVjb2Rlci92ZGVjX3ZwOV90cmlnZ2VyLmggYi9kcml2ZXJzL2FtdmRlY19wb3J0cy9kZWNvZGVyL3ZkZWNfdnA5X3RyaWdnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDk3NjkwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvZGVjb2Rlci92ZGVjX3ZwOV90cmlnZ2VyLmgKQEAgLTAsMCArMSw4NjAgQEAKKy8qCisgKiBkcml2ZXJzL2FtdmRlY19wb3J0cy9kZWNvZGVyL3ZkZWNfdnA5X3RyaWdnZXIuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9WREVDX1ZQOV9UUklHXworI2RlZmluZSBfVkRFQ19WUDlfVFJJR18KKworI2RlZmluZSBWUDlfVVNFX1RSSUdHRVJfQklHX1NJWkUgMQorCitzdGF0aWMgdTggdnA5X3RyaWdnZXJfaGVhZGVyW10gPSB7CisjaWYgVlA5X1VTRV9UUklHR0VSX0JJR19TSVpFCisgICAgICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgxNSwgMHgyOSwgMHhmZiwgMHhmZiwgMHhlYSwgMHhkNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg0MSwgMHg0ZCwgMHg0YywgMHg1NiwKKyAgICAgICAgICAgICAgICAweDgyLCAweDQ5LCAweDgzLCAweDQyLCAweDAwLCAweDBjLCAweDMwLCAweDBjLCAweDM0LCAweDI0LCAweDM4LCAweDI0LCAweDFjLCAweDE5LCAweDI4LCAweDAwLAorICAgICAgICAgICAgICAgIDB4MDIsIDB4OTAsIDB4N2MsIDB4NTIsIDB4ZmYsIDB4MTksIDB4MDUsIDB4ZmEsIDB4YmUsIDB4YTksIDB4ZWQsIDB4MzAsIDB4NzIsIDB4ZGQsIDB4MWIsIDB4YWQsCisgICAgICAgICAgICAgICAgMHhlOCwgMHhkZCwgMHhkYywgMHhlMiwgMHgzOSwgMHhiMiwgMHhiNywgMHhkMywgMHgzNywgMHhlYSwgMHg0YiwgMHhlNywgMHhkMSwgMHhmZSwgMHg1NywgMHhmMCwKKyAgICAgICAgICAgICAgICAweDdhLCAweDlmLCAweDUxLCAweGE0LCAweDVlLCAweGI3LCAweDE4LCAweDgwLCAweDc3LCAweDYwLCAweDAwLCAweDdmLCAweGRiLCAweDRkLCAweGVhLCAweGJiLAorICAgICAgICAgICAgICAgIDB4MDAsIDB4OTIsIDB4ZWQsIDB4YmMsIDB4ZjYsIDB4NmUsIDB4MjQsIDB4MmIsIDB4M2YsIDB4ZDAsIDB4YjgsIDB4MDksIDB4NzcsIDB4MTEsIDB4NDMsIDB4NjUsCisgICAgICAgICAgICAgICAgMHg2MiwgMHg5NCwgMHhlZCwgMHgzMywgMHhlMSwgMHg2ZSwgMHhlOCwgMHgxYSwgMHhkMCwgMHg0ZSwgMHhiMSwgMHg3MiwgMHgzNCwgMHg4ZSwgMHgyNCwgMHhlNSwKKyAgICAgICAgICAgICAgICAweDFiLCAweDI2LCAweDU4LCAweGRmLCAweDE5LCAweDhkLCAweDU5LCAweDgyLCAweDE5LCAweGFlLCAweGVhLCAweDEyLCAweDYzLCAweDZjLCAweDg5LCAweDljLAorICAgICAgICAgICAgICAgIDB4N2YsIDB4YzIsIDB4NjcsIDB4NDAsIDB4ZWQsIDB4ZjIsIDB4OGMsIDB4YWEsIDB4OWYsIDB4ZTEsIDB4MWUsIDB4MjcsIDB4MTIsIDB4ZGIsIDB4MDEsIDB4ODYsCisgICAgICAgICAgICAgICAgMHhjYywgMHg0NywgMHhlZSwgMHhhZiwgMHg1YiwgMHhhZiwgMHg0NCwgMHgzZCwgMHg4ZSwgMHg2NywgMHgyYywgMHg1NywgMHhkOSwgMHhiOSwgMHhiNSwgMHg3YSwKKyAgICAgICAgICAgICAgICAweDgzLCAweDI4LCAweGFiLCAweGY0LCAweGUwLCAweDg2LCAweGYwLCAweDE0LCAweGQwLCAweDVkLCAweGE0LCAweDczLCAweDI4LCAweDA0LCAweDNlLCAweDk5LAorICAgICAgICAgICAgICAgIDB4YTMsIDB4ZDcsIDB4YjUsIDB4YzYsIDB4ZjcsIDB4YjEsIDB4ZDksIDB4MTEsIDB4MDYsIDB4MzQsIDB4MWIsIDB4OTEsIDB4NmQsIDB4MzEsIDB4ZWUsIDB4MjYsCisgICAgICAgICAgICAgICAgMHg5NSwgMHhkZSwgMHgwZSwgMHg1NSwgMHg4ZiwgMHhmMSwgMHg1OSwgMHhlNSwgMHhjOCwgMHhiNywgMHg3NCwgMHg4YSwgMHg1NiwgMHg5OSwgMHhlNSwgMHhmNywKKyAgICAgICAgICAgICAgICAweDA0LCAweDQ5LCAweGE1LCAweDY2LCAweGEyLCAweDE1LCAweGFmLCAweDNjLCAweGU1LCAweGNlLCAweDI2LCAweGIwLCAweDY2LCAweDYzLCAweGFlLCAweDdiLAorICAgICAgICAgICAgICAgIDB4ZjEsIDB4MDksIDB4ZDIsIDB4NjIsIDB4YjUsIDB4ZTEsIDB4NGYsIDB4MGMsIDB4NTQsIDB4YWQsIDB4ZTUsIDB4MDAsIDB4ODYsIDB4MTQsIDB4NGIsIDB4MDYsCisgICAgICAgICAgICAgICAgMHg4MiwgMHhhZCwgMHg2MiwgMHg5NSwgMHg2ZCwgMHgzYSwgMHg5OSwgMHg2NywgMHgxZCwgMHgxYiwgMHg4NSwgMHhmNiwgMHhlNywgMHg2OSwgMHhkOCwgMHgwMCwKKyAgICAgICAgICAgICAgICAweGRlLCAweDYzLCAweGI1LCAweDM1LCAweGYxLCAweDQ0LCAweDQyLCAweDIxLCAweGQzLCAweGYzLCAweGM5LCAweDA3LCAweDIzLCAweDY3LCAweGU1LCAweGVhLAorICAgICAgICAgICAgICAgIDB4NWUsIDB4ZDIsIDB4NjMsIDB4NzgsIDB4YjksIDB4N2IsIDB4ZWIsIDB4ZDcsIDB4MmQsIDB4NGMsIDB4NWUsIDB4NDQsIDB4NmEsIDB4NDYsIDB4NjgsIDB4ZWIsCisgICAgICAgICAgICAgICAgMHg1ZCwgMHg2MSwgMHhhYSwgMHhjNywgMHhjZSwgMHhiNSwgMHhlMywgMHgwMSwgMHhjOCwgMHgyNCwgMHhjYSwgMHg3MiwgMHhjYywgMHhkZiwgMHg4OSwgMHgzNCwKKyAgICAgICAgICAgICAgICAweGI2LCAweGFiLCAweGZkLCAweDdiLCAweGI5LCAweGJkLCAweGVmLCAweDMzLCAweGIwLCAweDJiLCAweDFlLCAweGQzLCAweDIwLCAweGE0LCAweGNkLCAweDhhLAorICAgICAgICAgICAgICAgIDB4NTEsIDB4MmUsIDB4OWQsIDB4MmUsIDB4NWMsIDB4YzcsIDB4NTIsIDB4ZWQsIDB4YjgsIDB4MjksIDB4NjgsIDB4NWQsIDB4NjMsIDB4ZTEsIDB4NzksIDB4OTgsCisgICAgICAgICAgICAgICAgMHgyZCwgMHhiMSwgMHhmNCwgMHhhMCwgMHgwMSwgMHgzMCwgMHgyZCwgMHgxMCwgMHhlYywgMHhlNCwgMHg2YywgMHhlZCwgMHg1NSwgMHhiMSwgMHhmOSwgMHgwZiwKKyAgICAgICAgICAgICAgICAweGQ0LCAweGFlLCAweDBmLCAweDc1LCAweDVkLCAweDgxLCAweDc2LCAweGZlLCAweDk0LCAweDQ0LCAweDFjLCAweGNjLCAweDhjLCAweDdlLCAweDBmLCAweDRjLAorICAgICAgICAgICAgICAgIDB4ZGEsIDB4ODgsIDB4NjEsIDB4NmEsIDB4MTcsIDB4NzAsIDB4MTQsIDB4ZjUsIDB4MGQsIDB4N2MsIDB4ZDEsIDB4ZjgsIDB4MGYsIDB4MTksIDB4YTIsIDB4MDUsCisgICAgICAgICAgICAgICAgMHhlMywgMHg5OCwgMHhkYywgMHhlMSwgMHhiNCwgMHg2YSwgMHg3NCwgMHhhMCwgMHg4ZiwgMHgxYiwgMHhjOCwgMHgxMiwgMHhiNCwgMHhkZSwgMHg2MiwgMHg4OCwKKyAgICAgICAgICAgICAgICAweGQ0LCAweDBkLCAweGVkLCAweDBiLCAweDc2LCAweGFlLCAweGUwLCAweDkyLCAweGEyLCAweDEzLCAweDcwLCAweDAzLCAweDA4LCAweDI2LCAweDhmLCAweGVkLAorICAgICAgICAgICAgICAgIDB4YTcsIDB4NWMsIDB4NWEsIDB4NTUsIDB4NmUsIDB4OTIsIDB4NzYsIDB4ZDAsIDB4YzIsIDB4OWMsIDB4MjQsIDB4NzcsIDB4NzgsIDB4OWIsIDB4MzMsIDB4ZTUsCisgICAgICAgICAgICAgICAgMHg4OCwgMHhjNiwgMHgwOCwgMHg4YSwgMHgyOCwgMHg0NiwgMHg5ZiwgMHhiNCwgMHhkOSwgMHhkNywgMHg4NiwgMHg4MiwgMHhlNCwgMHhiYSwgMHg5NywgMHgzZCwKKyAgICAgICAgICAgICAgICAweDM2LCAweGQ1LCAweDMxLCAweDYxLCAweDdmLCAweDhlLCAweGI5LCAweGExLCAweGFiLCAweDY4LCAweGE2LCAweDhjLCAweGE4LCAweDQ3LCAweDhkLCAweDVjLAorICAgICAgICAgICAgICAgIDB4OTcsIDB4ZTksIDB4ZjAsIDB4OGYsIDB4YTQsIDB4ZTgsIDB4MTMsIDB4MmIsIDB4OWMsIDB4NGQsIDB4ZmYsIDB4OTUsIDB4OGUsIDB4OTgsIDB4MDgsIDB4NzUsCisgICAgICAgICAgICAgICAgMHhkNCwgMHhlZCwgMHg1ZSwgMHg4NiwgMHhlNSwgMHg2OCwgMHg0YiwgMHgwMSwgMHgwYiwgMHhkMiwgMHgxMywgMHhiMCwgMHg5NCwgMHhkMSwgMHgyOCwgMHgyMiwKKyAgICAgICAgICAgICAgICAweDEzLCAweDZiLCAweDk1LCAweDMwLCAweDc5LCAweGI2LCAweGQ5LCAweDU1LCAweDJlLCAweDNiLCAweDM2LCAweDE4LCAweGVmLCAweDM5LCAweDE2LCAweDk3LAorICAgICAgICAgICAgICAgIDB4MWUsIDB4YzQsIDB4MDMsIDB4YjQsIDB4NzUsIDB4YmUsIDB4ZmQsIDB4MDQsIDB4MmUsIDB4ZDUsIDB4YWMsIDB4OTUsIDB4YWMsIDB4NzAsIDB4NDAsIDB4YjMsCisgICAgICAgICAgICAgICAgMHgxYSwgMHg2MSwgMHgwMywgMHg5YSwgMHg5ZiwgMHhiZiwgMHg5MywgMHgxNCwgMHhjYywgMHhjMCwgMHgyOCwgMHhmOCwgMHg5MywgMHhhNiwgMHg3ZiwgMHgwNywKKyAgICAgICAgICAgICAgICAweDEyLCAweGUxLCAweGMyLCAweDg2LCAweGUzLCAweDg3LCAweDBkLCAweDRkLCAweDIwLCAweDc1LCAweGY3LCAweGEwLCAweDE0LCAweDQ5LCAweDZmLCAweDUyLAorICAgICAgICAgICAgICAgIDB4YzYsIDB4NmUsIDB4OWQsIDB4YTgsIDB4OGUsIDB4MTQsIDB4M2EsIDB4OWYsIDB4YTYsIDB4YWMsIDB4ZGMsIDB4NTYsIDB4OWMsIDB4ZGYsIDB4ZjQsIDB4NzUsCisgICAgICAgICAgICAgICAgMHg2YSwgMHgzMSwgMHg5NCwgMHg1MCwgMHg5YywgMHg0MywgMHhkNSwgMHg2YiwgMHgyMCwgMHhlNCwgMHhiYywgMHgyMCwgMHhkMCwgMHg5YSwgMHg3ZiwgMHg4NCwKKyAgICAgICAgICAgICAgICAweDZlLCAweGQ1LCAweDdjLCAweDJlLCAweDkzLCAweGY4LCAweDI1LCAweDUwLCAweDRmLCAweGNiLCAweDEzLCAweDc0LCAweDc4LCAweDA4LCAweDgyLCAweDBkLAorICAgICAgICAgICAgICAgIDB4ZDAsIDB4MzksIDB4YWYsIDB4NGMsIDB4NmUsIDB4OWUsIDB4MjUsIDB4MzcsIDB4YmYsIDB4N2QsIDB4ZTMsIDB4OTMsIDB4YmQsIDB4OTEsIDB4YjksIDB4NTIsCisgICAgICAgICAgICAgICAgMHhhYywgMHg2ZCwgMHhhNiwgMHhjZCwgMHg3OCwgMHg1MCwgMHg3OCwgMHgzYSwgMHhjMCwgMHhjNCwgMHgxMywgMHhjMCwgMHg0ZSwgMHhhNSwgMHgwOSwgMHgwOSwKKyAgICAgICAgICAgICAgICAweDgwLCAweGQ4LCAweDA4LCAweGZjLCAweDYzLCAweGQ0LCAweDI4LCAweDNkLCAweGVmLCAweGZkLCAweGY4LCAweDMwLCAweDNlLCAweDA5LCAweDNhLCAweDU2LAorICAgICAgICAgICAgICAgIDB4ZjgsIDB4MTEsIDB4YTMsIDB4NjcsIDB4ZGQsIDB4NTEsIDB4MTUsIDB4ZGUsIDB4MjAsIDB4OGQsIDB4ZDgsIDB4NjYsIDB4YWMsIDB4MDgsIDB4NzAsIDB4OWMsCisgICAgICAgICAgICAgICAgMHg4ZSwgMHhiMiwgMHhmZiwgMHgyNiwgMHg1YSwgMHg4MiwgMHgxNCwgMHgxZCwgMHhmNSwgMHhmMywgMHgxYywgMHhmOSwgMHg2YSwgMHgwMCwgMHgyNSwgMHg4NCwKKyAgICAgICAgICAgICAgICAweDk0LCAweGM5LCAweDZmLCAweDE2LCAweDc1LCAweGY2LCAweGQyLCAweDEzLCAweGEyLCAweDcwLCAweGUwLCAweDk0LCAweDRiLCAweGU3LCAweGU0LCAweDZkLAorICAgICAgICAgICAgICAgIDB4ZjEsIDB4ZDIsIDB4YTMsIDB4OTQsIDB4NjUsIDB4MjUsIDB4MzgsIDB4YjQsIDB4MzEsIDB4OGIsIDB4ZGYsIDB4MWMsIDB4YjYsIDB4MjIsIDB4MmIsIDB4NGIsCisgICAgICAgICAgICAgICAgMHgwMywgMHhkMiwgMHg5MiwgMHhjYywgMHhhMSwgMHhjZiwgMHhiNiwgMHhmNSwgMHgyOCwgMHgwMiwgMHhiOCwgMHhlMCwgMHg0NCwgMHg2OSwgMHgzNCwgMHhhOCwKKyAgICAgICAgICAgICAgICAweGIzLCAweGFhLCAweGVhLCAweDQ4LCAweDZlLCAweGYwLCAweDY3LCAweDM5LCAweDBlLCAweGJkLCAweGZkLCAweDIwLCAweDlkLCAweDhkLCAweGM4LCAweDBiLAorICAgICAgICAgICAgICAgIDB4YTMsIDB4N2UsIDB4NjYsIDB4NWIsIDB4ZGUsIDB4MjEsIDB4Y2MsIDB4MTksIDB4YWUsIDB4ZmQsIDB4ODIsIDB4NzMsIDB4NzUsIDB4MDksIDB4MzUsIDB4MmYsCisgICAgICAgICAgICAgICAgMHhiZiwgMHg5MSwgMHhhYSwgMHhmYSwgMHgxZCwgMHhhNCwgMHg0NCwgMHg3YiwgMHhmOSwgMHhhYywgMHhhOSwgMHgwMiwgMHhiNCwgMHgzOSwgMHhmOCwgMHg5NiwKKyAgICAgICAgICAgICAgICAweDkwLCAweDAxLCAweGZmLCAweDczLCAweGU2LCAweDUyLCAweGExLCAweDIyLCAweGZlLCAweDA0LCAweGUzLCAweDNlLCAweDhhLCAweDZkLCAweGEwLCAweDE5LAorICAgICAgICAgICAgICAgIDB4NGUsIDB4MTEsIDB4OTAsIDB4OWEsIDB4MDUsIDB4YjIsIDB4N2EsIDB4OGQsIDB4OTgsIDB4ZmMsIDB4ZGEsIDB4MWMsIDB4NWYsIDB4ODYsIDB4OTQsIDB4N2YsCisgICAgICAgICAgICAgICAgMHg1OCwgMHgyMCwgMHhkZiwgMHhiNiwgMHhjMCwgMHgxMSwgMHhkMCwgMHg4YywgMHhjMiwgMHgxMSwgMHg2MSwgMHg3NSwgMHg0NywgMHhiZSwgMHhlYywgMHg5MiwKKyAgICAgICAgICAgICAgICAweDgyLCAweGEzLCAweGZlLCAweGNkLCAweDEzLCAweGRkLCAweGUwLCAweGU2LCAweDVhLCAweDBhLCAweGMxLCAweDlmLCAweDMxLCAweDZkLCAweDc4LCAweDMxLAorICAgICAgICAgICAgICAgIDB4YjYsIDB4NjAsIDB4YmUsIDB4MGIsIDB4ZDUsIDB4ODEsIDB4MjQsIDB4ZTYsIDB4YzcsIDB4ZTcsIDB4ZTgsIDB4MDgsIDB4NTMsIDB4MjcsIDB4ZjMsIDB4OWEsCisgICAgICAgICAgICAgICAgMHhmMiwgMHg3ZSwgMHhiNywgMHhjOCwgMHhkOSwgMHg3NCwgMHg3MiwgMHg0NSwgMHhlNiwgMHhmOCwgMHhiYSwgMHhiOSwgMHg0MCwgMHhmZiwgMHhhNCwgMHhmYiwKKyAgICAgICAgICAgICAgICAweDZhLCAweGQwLCAweDk4LCAweDRkLCAweDRkLCAweGNjLCAweDRhLCAweDM4LCAweGNiLCAweGEwLCAweGYwLCAweDA4LCAweDdkLCAweGQ3LCAweDcwLCAweGNhLAorICAgICAgICAgICAgICAgIDB4ZGYsIDB4ZTYsIDB4MTYsIDB4YTIsIDB4ZDEsIDB4OWQsIDB4YWYsIDB4Y2MsIDB4ZDcsIDB4NmMsIDB4NWEsIDB4ZmQsIDB4YWMsIDB4NDIsIDB4YWIsIDB4MTYsCisgICAgICAgICAgICAgICAgMHgzMywgMHhjMCwgMHgyYSwgMHg2OCwgMHhkZCwgMHg1OCwgMHhiMiwgMHg0MSwgMHhjNSwgMHgwNSwgMHg2MSwgMHgwOSwgMHg2MCwgMHhjOCwgMHg3MiwgMHgyOSwKKyAgICAgICAgICAgICAgICAweGI4LCAweDFjLCAweDkwLCAweGM1LCAweDAyLCAweDc2LCAweGRjLCAweGNiLCAweDQ1LCAweDVjLCAweDZjLCAweDE2LCAweDM3LCAweGU2LCAweDExLCAweGNlLAorICAgICAgICAgICAgICAgIDB4NGUsIDB4MmUsIDB4ZmEsIDB4ZjQsIDB4MmMsIDB4NGYsIDB4ODAsIDB4NjQsIDB4ODUsIDB4ZjQsIDB4YmQsIDB4MDMsIDB4MDMsIDB4ZDIsIDB4ODYsIDB4M2UsCisgICAgICAgICAgICAgICAgMHg5NywgMHhiYiwgMHgwNywgMHgyMiwgMHg4MiwgMHgzZiwgMHhjOCwgMHhjNSwgMHhjNCwgMHg4ZCwgMHg0ZiwgMHg2NiwgMHgxOCwgMHhjNywgMHg3NCwgMHhlNiwKKyAgICAgICAgICAgICAgICAweDE5LCAweDVlLCAweGU3LCAweGM4LCAweGM4LCAweGZkLCAweGIxLCAweGM1LCAweDUxLCAweGM0LCAweDI1LCAweGVjLCAweDJkLCAweDBiLCAweGVkLCAweGQwLAorICAgICAgICAgICAgICAgIDB4NTMsIDB4NWIsIDB4NWQsIDB4ODAsIDB4MmMsIDB4MjgsIDB4ZDAsIDB4MTksIDB4ZTIsIDB4MWQsIDB4ZDgsIDB4MjUsIDB4MWIsIDB4YjEsIDB4YjIsIDB4OTksCisgICAgICAgICAgICAgICAgMHgyNiwgMHg5MywgMHhlYywgMHgwOCwgMHgxNCwgMHgxNiwgMHg2MCwgMHgyOCwgMHhlYiwgMHg4OCwgMHgwYSwgMHg4NCwgMHgyZCwgMHhkZSwgMHg0MSwgMHhlMywKKyAgICAgICAgICAgICAgICAweDY3LCAweDBmLCAweDc0LCAweDdjLCAweGY5LCAweGNjLCAweDM4LCAweGVhLCAweGY4LCAweGE3LCAweDEzLCAweDUzLCAweGZiLCAweGVhLCAweDhiLCAweDUwLAorICAgICAgICAgICAgICAgIDB4OWMsIDB4MzcsIDB4ZmYsIDB4MjMsIDB4NGEsIDB4ZGYsIDB4YzUsIDB4ZTAsIDB4MDQsIDB4NzIsIDB4OGQsIDB4MmIsIDB4Y2EsIDB4MWMsIDB4MmMsIDB4MzMsCisgICAgICAgICAgICAgICAgMHg3YSwgMHgzZCwgMHgyNSwgMHhhMywgMHg3NiwgMHgxNSwgMHhjYiwgMHg4ZCwgMHhiOCwgMHgyNCwgMHhhNCwgMHhhMywgMHhmOCwgMHhjMiwgMHg2OSwgMHgzMywKKyAgICAgICAgICAgICAgICAweDI3LCAweDU4LCAweDUxLCAweGQ5LCAweDNjLCAweDRjLCAweDNiLCAweDRhLCAweGQ3LCAweDRlLCAweDBiLCAweGI1LCAweGUyLCAweDY4LCAweGViLCAweGEzLAorICAgICAgICAgICAgICAgIDB4ZjgsIDB4OTMsIDB4YzEsIDB4OTIsIDB4NTgsIDB4ZjQsIDB4YzIsIDB4ZjYsIDB4MWUsIDB4N2QsIDB4YTMsIDB4MTMsIDB4MjAsIDB4NTAsIDB4NWIsIDB4YjMsCisgICAgICAgICAgICAgICAgMHgzZiwgMHgwNywgMHhiMywgMHg3ZSwgMHhmNSwgMHg3MSwgMHgxZSwgMHhmMCwgMHgyMywgMHg5NywgMHg5NSwgMHg2NCwgMHg3MCwgMHhjMiwgMHhiOSwgMHg0YSwKKyAgICAgICAgICAgICAgICAweDE2LCAweDliLCAweGJiLCAweGFmLCAweGQyLCAweDFkLCAweGM2LCAweGFlLCAweDNmLCAweGEyLCAweDdlLCAweDIzLCAweDU1LCAweGRjLCAweDY4LCAweDY0LAorICAgICAgICAgICAgICAgIDB4NTYsIDB4MzMsIDB4ZjgsIDB4ZDQsIDB4NGUsIDB4ZjQsIDB4OTQsIDB4MGMsIDB4MDksIDB4ZWEsIDB4YWUsIDB4YWYsIDB4ZmIsIDB4MTIsIDB4MzEsIDB4NzIsCisgICAgICAgICAgICAgICAgMHhkYSwgMHhjMSwgMHgyMywgMHg3MiwgMHhiNywgMHg2OSwgMHhlNiwgMHgyYiwgMHgzNiwgMHg4YiwgMHhlNSwgMHhkYywgMHhkNSwgMHhjZCwgMHgzZSwgMHhkZCwKKyAgICAgICAgICAgICAgICAweDJjLCAweDhlLCAweDcyLCAweDIzLCAweGM4LCAweDFmLCAweDUyLCAweGVhLCAweDk1LCAweDIxLCAweGViLCAweGM2LCAweDE5LCAweDliLCAweDZkLCAweDgwLAorICAgICAgICAgICAgICAgIDB4NGUsIDB4M2EsIDB4NWIsIDB4MmYsIDB4M2IsIDB4ODEsIDB4OTEsIDB4MTIsIDB4ZWQsIDB4YmMsIDB4NDUsIDB4NGYsIDB4OTMsIDB4NWMsIDB4ZGYsIDB4ZjAsCisgICAgICAgICAgICAgICAgMHhiNywgMHg1YSwgMHhmZCwgMHgzNSwgMHg1NCwgMHhlYSwgMHg2OCwgMHg3MCwgMHg0ZCwgMHg0YywgMHhiMywgMHg1NiwgMHg2YywgMHgzOCwgMHhiZiwgMHhhYSwKKyAgICAgICAgICAgICAgICAweDI5LCAweGU2LCAweDljLCAweDc4LCAweDdmLCAweDVlLCAweDdiLCAweGEzLCAweDA0LCAweGViLCAweDNkLCAweDI1LCAweGNlLCAweDU2LCAweDVlLCAweDYyLAorICAgICAgICAgICAgICAgIDB4NjksIDB4ODcsIDB4ZWUsIDB4N2QsIDB4ZjEsIDB4MWQsIDB4YjYsIDB4MWQsIDB4N2IsIDB4NGYsIDB4NDcsIDB4NzAsIDB4NWUsIDB4MDYsIDB4N2IsIDB4NDgsCisgICAgICAgICAgICAgICAgMHgwMiwgMHgxZCwgMHgwMSwgMHhmZCwgMHhiYiwgMHhhNiwgMHhhMywgMHg2ZiwgMHg5MCwgMHhlMywgMHhiMiwgMHgxMCwgMHhhMSwgMHhjOSwgMHg0MCwgMHg5NiwKKyAgICAgICAgICAgICAgICAweDZjLCAweDRlLCAweDM1LCAweDQ3LCAweDcxLCAweDIyLCAweDgwLCAweDQwLCAweDUyLCAweGE4LCAweDhmLCAweDAyLCAweDYyLCAweDZhLCAweGI1LCAweDcyLAorICAgICAgICAgICAgICAgIDB4YTAsIDB4NjUsIDB4NTUsIDB4ZGMsIDB4NjksIDB4NjMsIDB4MmUsIDB4YWUsIDB4OWYsIDB4Y2QsIDB4YTcsIDB4M2EsIDB4MzIsIDB4NGEsIDB4NzYsIDB4MDMsCisgICAgICAgICAgICAgICAgMHhjNywgMHhmNCwgMHg3YSwgMHhkZSwgMHgyOSwgMHgxZCwgMHg3YywgMHhhZCwgMHg0NiwgMHhlOSwgMHg5MCwgMHgzYiwgMHhmZiwgMHg0ZiwgMHhhMywgMHhlMSwKKyAgICAgICAgICAgICAgICAweDQwLCAweGUxLCAweGU3LCAweDJhLCAweGQ2LCAweDJkLCAweDZiLCAweDIzLCAweDQyLCAweDFiLCAweGU4LCAweGRmLCAweDc2LCAweGU2LCAweDExLCAweDdkLAorICAgICAgICAgICAgICAgIDB4YjIsIDB4YmUsIDB4ZDEsIDB4ODMsIDB4ODEsIDB4ODYsIDB4YjYsIDB4NWQsIDB4YzIsIDB4MjksIDB4ZGYsIDB4ZjQsIDB4ZmUsIDB4ODIsIDB4MTQsIDB4ODEsCisgICAgICAgICAgICAgICAgMHhlZCwgMHhlMywgMHg3NywgMHhiYywgMHhlMywgMHg0MiwgMHhiYSwgMHgxNCwgMHg4MiwgMHg4NSwgMHg4NCwgMHhjYSwgMHgwMCwgMHgzNywgMHgwZSwgMHhiYywKKyAgICAgICAgICAgICAgICAweDg4LCAweGE2LCAweGE5LCAweDYzLCAweDY3LCAweDNiLCAweDlmLCAweDQyLCAweGEyLCAweDdhLCAweGU0LCAweDcxLCAweDExLCAweGQwLCAweDBhLCAweGQ4LAorICAgICAgICAgICAgICAgIDB4MmUsIDB4Y2IsIDB4OTUsIDB4ZTksIDB4OGYsIDB4YjMsIDB4ODUsIDB4MTcsIDB4NzgsIDB4NGUsIDB4YTcsIDB4Y2UsIDB4MGQsIDB4YzQsIDB4NTYsIDB4ZjAsCisgICAgICAgICAgICAgICAgMHgyMiwgMHgwYiwgMHg2NSwgMHhjMCwgMHhmNCwgMHgxMywgMHg1NSwgMHg4OSwgMHgwMCwgMHg5OSwgMHg3ZiwgMHgxOSwgMHhiYSwgMHhhNiwgMHhlMCwgMHhhNiwKKyAgICAgICAgICAgICAgICAweGEwLCAweDYwLCAweDI3LCAweGQwLCAweDI0LCAweGI3LCAweDY5LCAweDMzLCAweDk1LCAweGM4LCAweDliLCAweDE4LCAweDM4LCAweDYyLCAweGM4LCAweGRlLAorICAgICAgICAgICAgICAgIDB4ZWYsIDB4YmUsIDB4ODgsIDB4NWYsIDB4MjEsIDB4NDIsIDB4MGIsIDB4NTksIDB4MTAsIDB4MGMsIDB4OWUsIDB4OWUsIDB4NjYsIDB4NGEsIDB4YjcsIDB4ZDYsCisgICAgICAgICAgICAgICAgMHg0ZiwgMHg3YSwgMHhhOCwgMHhjZCwgMHgyMCwgMHg2YSwgMHg3MCwgMHgzYSwgMHgzZSwgMHhjOSwgMHgzYywgMHg0ZCwgMHgzNSwgMHhmZSwgMHhhYSwgMHhhZCwKKyAgICAgICAgICAgICAgICAweDRmLCAweDE1LCAweDc3LCAweDM5LCAweDI5LCAweDIwLCAweGFjLCAweDhhLCAweDE5LCAweGRjLCAweGQ1LCAweDYxLCAweDI0LCAweDU5LCAweDJhLCAweDMzLAorICAgICAgICAgICAgICAgIDB4YTUsIDB4ZGIsIDB4MDUsIDB4Y2YsIDB4OTMsIDB4NzAsIDB4NzcsIDB4YjMsIDB4MGUsIDB4ZGYsIDB4ZWIsIDB4NTgsIDB4NzgsIDB4ZDQsIDB4NmMsIDB4YzMsCisgICAgICAgICAgICAgICAgMHhlMCwgMHg3YSwgMHgwOSwgMHhjZiwgMHhhYSwgMHgwOSwgMHhhZiwgMHhiZCwgMHgyYywgMHgwMSwgMHgwOSwgMHgxMSwgMHgyMCwgMHgwMCwgMHg1NywgMHg4YSwKKyAgICAgICAgICAgICAgICAweDMyLCAweGQ3LCAweGY5LCAweDIwLCAweDE5LCAweGU4LCAweDgwLCAweGY2LCAweDk2LCAweGNmLCAweGFkLCAweGY5LCAweDJjLCAweGU4LCAweDRkLCAweDZkLAorICAgICAgICAgICAgICAgIDB4ZTMsIDB4ZDQsIDB4ZmMsIDB4MmUsIDB4OGEsIDB4Y2UsIDB4NGEsIDB4MDYsIDB4NTEsIDB4MjAsIDB4MjMsIDB4NTgsIDB4ZTUsIDB4OGEsIDB4Y2IsIDB4YTEsCisgICAgICAgICAgICAgICAgMHhjYywgMHgxMiwgMHg5ZiwgMHgzNCwgMHgxNywgMHgxZSwgMHg2OSwgMHg2NiwgMHgwMiwgMHhlYiwgMHgyZSwgMHg3MSwgMHg2YiwgMHgyNSwgMHhkZSwgMHg3YywKKyAgICAgICAgICAgICAgICAweDk2LCAweDE3LCAweGNhLCAweGFjLCAweDQzLCAweDQxLCAweDIyLCAweDNiLCAweDg3LCAweGI5LCAweDQ2LCAweDg1LCAweDIwLCAweGFjLCAweDc1LCAweGJiLAorICAgICAgICAgICAgICAgIDB4MGIsIDB4NDgsIDB4NmMsIDB4N2YsIDB4ZmUsIDB4MWIsIDB4YTUsIDB4NmMsIDB4OTgsIDB4ZmQsIDB4YjUsIDB4OGQsIDB4OTMsIDB4N2EsIDB4ZmIsIDB4NWIsCisgICAgICAgICAgICAgICAgMHgyMiwgMHgyNiwgMHgyNSwgMHhkYSwgMHg5MiwgMHg5NiwgMHg0MSwgMHhlNywgMHg3NSwgMHhhZiwgMHhmMCwgMHgzMiwgMHhlYSwgMHhhYSwgMHhhZCwgMHhjMSwKKyAgICAgICAgICAgICAgICAweDVhLCAweGIwLCAweDc4LCAweGE3LCAweDAzLCAweGRmLCAweDU3LCAweGFmLCAweGFjLCAweDY5LCAweGIzLCAweGEzLCAweGE5LCAweDAyLCAweDlmLCAweDMxLAorICAgICAgICAgICAgICAgIDB4ZDUsIDB4Y2YsIDB4MzksIDB4YzAsIDB4YzQsIDB4ODMsIDB4ZGEsIDB4YzIsIDB4YTQsIDB4NWYsIDB4OWEsIDB4MzEsIDB4OTAsIDB4YzgsIDB4ZDYsIDB4MjksCisgICAgICAgICAgICAgICAgMHg1NywgMHhmOCwgMHgzMSwgMHhhNiwgMHg0YSwgMHg1MSwgMHg4MCwgMHg3MCwgMHgxMiwgMHg3ZiwgMHg1ZCwgMHhjMCwgMHg2ZiwgMHgwZSwgMHg2MiwgMHg5OSwKKyAgICAgICAgICAgICAgICAweGMwLCAweDAzLCAweGRiLCAweDE2LCAweDBhLCAweDA2LCAweDc5LCAweDlhLCAweGQyLCAweDg0LCAweGM1LCAweDRlLCAweGI5LCAweDA1LCAweDBiLCAweGI1LAorICAgICAgICAgICAgICAgIDB4MmEsIDB4ZDIsIDB4OTgsIDB4OGMsIDB4ZjAsIDB4ZDMsIDB4NDMsIDB4YzYsIDB4ZmQsIDB4NzMsIDB4M2QsIDB4OTYsIDB4MjgsIDB4ZTMsIDB4MTgsIDB4YmMsCisgICAgICAgICAgICAgICAgMHg2YywgMHgyZiwgMHhmZCwgMHgxMCwgMHg5YSwgMHg5MCwgMHgxMywgMHg4YywgMHgxNywgMHhmZSwgMHhlMSwgMHhlYywgMHhiOCwgMHg0NCwgMHhlNywgMHhlZCwKKyAgICAgICAgICAgICAgICAweGNmLCAweDAxLCAweGJiLCAweDQ3LCAweDA4LCAweGMxLCAweDBjLCAweDQ5LCAweDIyLCAweGM0LCAweDhiLCAweDJhLCAweGU4LCAweDg5LCAweDZkLCAweDAxLAorICAgICAgICAgICAgICAgIDB4MTcsIDB4ZGMsIDB4NTgsIDB4OTQsIDB4MWMsIDB4NTIsIDB4YTcsIDB4N2YsIDB4MTksIDB4ZGEsIDB4NzksIDB4OTIsIDB4NDAsIDB4ZGIsIDB4MjgsIDB4OTMsCisgICAgICAgICAgICAgICAgMHgxYiwgMHhkZiwgMHhkYiwgMHg0ZiwgMHhjMCwgMHgxMCwgMHg5NSwgMHg2ZCwgMHg4MSwgMHg2MiwgMHg4ZCwgMHgwYSwgMHhiZSwgMHgzZSwgMHgzYiwgMHg1MywKKyAgICAgICAgICAgICAgICAweDU5LCAweGNhLCAweDlmLCAweDcwLCAweGM4LCAweDMyLCAweGMzLCAweDM5LCAweGJlLCAweDQ0LCAweDk5LCAweDk2LCAweDAyLCAweDQ2LCAweGE5LCAweGE5LAorICAgICAgICAgICAgICAgIDB4ZTQsIDB4ZTIsIDB4YTYsIDB4MWYsIDB4Y2UsIDB4ZjAsIDB4M2EsIDB4ZGMsIDB4NDIsIDB4YWUsIDB4NmIsIDB4YTcsIDB4OTUsIDB4YTEsIDB4MmEsIDB4MWYsCisgICAgICAgICAgICAgICAgMHhhMiwgMHhkNSwgMHg0NCwgMHgyYSwgMHg4NSwgMHhkNCwgMHg0MywgMHgwZCwgMHhmNiwgMHhhNiwgMHhiZCwgMHhjYywgMHhiMCwgMHhhYiwgMHhkMCwgMHhmNiwKKyAgICAgICAgICAgICAgICAweDJmLCAweGFjLCAweDJjLCAweDYxLCAweGIwLCAweDUyLCAweGJhLCAweGNmLCAweDNmLCAweGI1LCAweGVhLCAweGRmLCAweDlmLCAweDQ2LCAweGJmLCAweDU4LAorICAgICAgICAgICAgICAgIDB4MWIsIDB4ZjksIDB4MTYsIDB4ZGIsIDB4NjAsIDB4Y2UsIDB4ZWEsIDB4ZjUsIDB4NzIsIDB4YzIsIDB4NzQsIDB4MzIsIDB4YWUsIDB4N2IsIDB4NDEsIDB4NGQsCisgICAgICAgICAgICAgICAgMHhhMiwgMHgzMywgMHg4OCwgMHhmOCwgMHg3YiwgMHg4OSwgMHhlMCwgMHgxOCwgMHhlNCwgMHg3ZCwgMHg2YywgMHhhYiwgMHhjZSwgMHg5ZSwgMHhiNCwgMHhjZCwKKyAgICAgICAgICAgICAgICAweGQyLCAweDlhLCAweGE1LCAweDU1LCAweGZiLCAweDgzLCAweDA1LCAweDliLCAweDA2LCAweDVhLCAweGNmLCAweGI3LCAweDFhLCAweGJlLCAweGI5LCAweDZhLAorICAgICAgICAgICAgICAgIDB4ZTEsIDB4MGEsIDB4NDgsIDB4OTgsIDB4MjUsIDB4Y2QsIDB4YjgsIDB4YTYsIDB4N2UsIDB4OTUsIDB4MjIsIDB4YjQsIDB4NTUsIDB4MmMsIDB4MjEsIDB4MWMsCisgICAgICAgICAgICAgICAgMHgwNywgMHhlNywgMHg5NCwgMHhlNCwgMHg3OCwgMHg5MiwgMHgwOSwgMHg4OSwgMHgwNSwgMHhlYywgMHhmMCwgMHhjZSwgMHgzZiwgMHg0ZiwgMHgzMSwgMHgzMCwKKyAgICAgICAgICAgICAgICAweGI1LCAweDYxLCAweDM4LCAweGNlLCAweDU1LCAweDU0LCAweDk2LCAweGY2LCAweDVlLCAweDQyLCAweGEwLCAweGQ3LCAweGQ0LCAweDQxLCAweGQ2LCAweDRmLAorICAgICAgICAgICAgICAgIDB4NzEsIDB4YzAsIDB4YzcsIDB4NDUsIDB4MTIsIDB4ODksIDB4MmMsIDB4MGQsIDB4N2UsIDB4ZDIsIDB4ZjksIDB4NDMsIDB4YWEsIDB4YTksIDB4ZWIsIDB4YzIsCisgICAgICAgICAgICAgICAgMHg0NiwgMHhhNCwgMHg5NywgMHhkOSwgMHgxNiwgMHhiNiwgMHhhNCwgMHhkMiwgMHhlYiwgMHhmZSwgMHhiZCwgMHhjZCwgMHg2MiwgMHhhYiwgMHhiYywgMHhjMiwKKyAgICAgICAgICAgICAgICAweGM0LCAweDM5LCAweDA3LCAweDlmLCAweDAzLCAweGVkLCAweDVjLCAweDEzLCAweDVlLCAweDkyLCAweDdjLCAweDFhLCAweGYzLCAweGE2LCAweDdmLCAweDlhLAorICAgICAgICAgICAgICAgIDB4MDcsIDB4NWEsIDB4ZmYsIDB4YTYsIDB4YmYsIDB4NTcsIDB4ZjksIDB4ZWIsIDB4ZDIsIDB4NTYsIDB4NzgsIDB4M2YsIDB4NzQsIDB4YjMsIDB4MmQsIDB4YmUsCisgICAgICAgICAgICAgICAgMHhjOSwgMHgyZCwgMHhiMiwgMHg1MiwgMHg1YiwgMHg3YiwgMHg3OSwgMHgzMiwgMHhiOCwgMHhmYiwgMHg1ZiwgMHhmYywgMHgzZiwgMHg2MiwgMHg5MCwgMHhlNiwKKyAgICAgICAgICAgICAgICAweDIyLCAweGU4LCAweDVlLCAweGVkLCAweDQxLCAweDRjLCAweGIwLCAweGY5LCAweGU0LCAweDdkLCAweDZlLCAweDk2LCAweDk3LCAweDhjLCAweGE3LCAweGY0LAorICAgICAgICAgICAgICAgIDB4ZjEsIDB4YWQsIDB4M2MsIDB4YTIsIDB4ZGIsIDB4YTcsIDB4OGYsIDB4ODEsIDB4YzAsIDB4ZTUsIDB4ZjYsIDB4MDYsIDB4ZDcsIDB4YWUsIDB4ZjUsIDB4OGIsCisgICAgICAgICAgICAgICAgMHg2NiwgMHhmOSwgMHg4NCwgMHhlYywgMHgzZiwgMHhlNiwgMHg3NiwgMHhjZSwgMHg5MSwgMHg2NCwgMHhjZSwgMHgxZCwgMHg3OCwgMHg4YiwgMHgzZSwgMHg4NSwKKyAgICAgICAgICAgICAgICAweGE1LCAweDc1LCAweGQ3LCAweGNkLCAweDZjLCAweDU3LCAweDI4LCAweGQ1LCAweDZmLCAweDYyLCAweDNkLCAweDAzLCAweDQ3LCAweDllLCAweGI1LCAweGY4LAorICAgICAgICAgICAgICAgIDB4MTIsIDB4ODMsIDB4ZGIsIDB4ZjcsIDB4M2IsIDB4ZjIsIDB4OGQsIDB4MDMsIDB4MWUsIDB4NzAsIDB4NTMsIDB4OWUsIDB4NjIsIDB4NTQsIDB4OWQsIDB4ZjYsCisgICAgICAgICAgICAgICAgMHg5NCwgMHg0NiwgMHhkZiwgMHg2OCwgMHhiOCwgMHhhYSwgMHgwMiwgMHgxOSwgMHhhZCwgMHhmZCwgMHgzYiwgMHhmOSwgMHhkYywgMHhiNywgMHhlMCwgMHg3OCwKKyAgICAgICAgICAgICAgICAweGY4LCAweDgzLCAweDE4LCAweDFhLCAweDQyLCAweDhjLCAweDViLCAweDVlLCAweDY0LCAweDI4LCAweDBjLCAweGU1LCAweGE3LCAweDgwLCAweDhiLCAweDA3LAorICAgICAgICAgICAgICAgIDB4ZGQsIDB4OTMsIDB4MzksIDB4NzYsIDB4NWIsIDB4NGEsIDB4NWMsIDB4OTIsIDB4YWIsIDB4YTYsIDB4ZjYsIDB4ZjQsIDB4MWUsIDB4MjIsIDB4YzksIDB4YjMsCisgICAgICAgICAgICAgICAgMHg5NCwgMHg1NSwgMHg4MSwgMHgzMiwgMHhjMiwgMHhlMCwgMHgxOSwgMHg2NCwgMHgxNCwgMHhlMCwgMHhkNSwgMHg0YSwgMHhiOCwgMHgwYywgMHgyMSwgMHhkMSwKKyAgICAgICAgICAgICAgICAweDdiLCAweDM4LCAweDRiLCAweDk5LCAweGZmLCAweDhlLCAweGJiLCAweDFkLCAweGJiLCAweGNjLCAweGE0LCAweGI3LCAweDY0LCAweDMwLCAweGM3LCAweDJiLAorICAgICAgICAgICAgICAgIDB4MTEsIDB4OGYsIDB4ZmMsIDB4YmEsIDB4YjYsIDB4YWUsIDB4ZjEsIDB4YmMsIDB4MjQsIDB4MWIsIDB4MGUsIDB4N2UsIDB4MDYsIDB4ZDYsIDB4YmMsIDB4MjcsCisgICAgICAgICAgICAgICAgMHgzYiwgMHg3ZSwgMHgzYiwgMHgwOCwgMHhjYiwgMHhiYiwgMHgyMywgMHg1MSwgMHgwYSwgMHg2ZSwgMHhjZSwgMHhmNiwgMHgwNywgMHgwYiwgMHhkMSwgMHgxYSwKKyAgICAgICAgICAgICAgICAweDA0LCAweGZjLCAweDg4LCAweGI1LCAweGYzLCAweDAxLCAweDE3LCAweGZjLCAweDk5LCAweGVmLCAweDJjLCAweDIwLCAweDJmLCAweDUwLCAweDlmLCAweGQwLAorICAgICAgICAgICAgICAgIDB4ZTYsIDB4ZWMsIDB4NDYsIDB4OWUsIDB4ZjIsIDB4MjUsIDB4ZWQsIDB4OTksIDB4ODQsIDB4MjYsIDB4NjQsIDB4Y2UsIDB4Y2EsIDB4YjksIDB4MmUsIDB4ZjMsCisgICAgICAgICAgICAgICAgMHg0NSwgMHhlNywgMHgxZSwgMHg1NiwgMHg4NywgMHgxYSwgMHgxZiwgMHg0MCwgMHhkMiwgMHg1ZiwgMHg5YywgMHg0NiwgMHg2YSwgMHgwYiwgMHhkYSwgMHg2YSwKKyAgICAgICAgICAgICAgICAweDU3LCAweGJkLCAweDc0LCAweDc2LCAweDBiLCAweGJmLCAweDViLCAweDViLCAweGNkLCAweDZjLCAweDRhLCAweDM0LCAweDczLCAweDE4LCAweDU3LCAweGEzLAorICAgICAgICAgICAgICAgIDB4MWIsIDB4MzIsIDB4NDQsIDB4ZDksIDB4NzYsIDB4NTMsIDB4NWIsIDB4ZGUsIDB4OTIsIDB4MmQsIDB4YjQsIDB4YWIsIDB4OTAsIDB4YTMsIDB4NTgsIDB4YzIsCisgICAgICAgICAgICAgICAgMHgxZSwgMHg3ZCwgMHhkZiwgMHg5ZSwgMHg5OCwgMHhkZiwgMHg3MCwgMHg2NiwgMHg4OCwgMHhhNSwgMHgxYywgMHhjNywgMHhiOCwgMHg2NSwgMHgxMiwgMHg2MiwKKyAgICAgICAgICAgICAgICAweDNlLCAweDdmLCAweDAwLCAweDE0LCAweGY5LCAweDNmLCAweDcwLCAweDkwLCAweGZhLCAweDk0LCAweDRjLCAweDZlLCAweDMyLCAweDI2LCAweGMzLCAweDk3LAorICAgICAgICAgICAgICAgIDB4OTgsIDB4ZTIsIDB4YTUsIDB4MzMsIDB4YjksIDB4YTgsIDB4ZWMsIDB4OWUsIDB4NDEsIDB4MTYsIDB4ZjYsIDB4YTQsIDB4OGIsIDB4MTQsIDB4NjEsIDB4MzUsCisgICAgICAgICAgICAgICAgMHhmMiwgMHhjNSwgMHhiNCwgMHhjYSwgMHg5MCwgMHhkMSwgMHhhYywgMHhlZiwgMHg5YSwgMHg0YywgMHgyNCwgMHgxOSwgMHg1ZCwgMHg5YiwgMHgxNSwgMHhhNSwKKyAgICAgICAgICAgICAgICAweGNhLCAweGQ3LCAweDFjLCAweDdlLCAweDhlLCAweGM1LCAweDUwLCAweDg2LCAweDY0LCAweDEzLCAweGJjLCAweDJjLCAweGYzLCAweDc3LCAweGIyLCAweDU5LAorICAgICAgICAgICAgICAgIDB4YTgsIDB4NmUsIDB4M2YsIDB4NzUsIDB4YjQsIDB4OGQsIDB4MWMsIDB4YWQsIDB4YWQsIDB4ZjUsIDB4NzYsIDB4NTQsIDB4YzYsIDB4MDAsIDB4NzYsIDB4OTQsCisgICAgICAgICAgICAgICAgMHhmYywgMHg4OCwgMHg3MSwgMHgzMywgMHhiYywgMHhmNCwgMHhlZCwgMHhhNCwgMHgzMSwgMHg3NiwgMHg2NiwgMHg3ZiwgMHgwNSwgMHg1NywgMHhlYiwgMHhlOCwKKyAgICAgICAgICAgICAgICAweGI5LCAweDI1LCAweGMwLCAweDMwLCAweDJiLCAweDBmLCAweGU3LCAweGEwLCAweDk2LCAweGFmLCAweDdlLCAweDZhLCAweGM0LCAweDVhLCAweDM5LCAweDRhLAorICAgICAgICAgICAgICAgIDB4YmMsIDB4MTQsIDB4N2MsIDB4NmUsIDB4MDAsIDB4ZGYsIDB4NTMsIDB4OGQsIDB4OTcsIDB4NWEsIDB4ZTIsIDB4NDksIDB4ZTksIDB4ODksIDB4NzQsIDB4ZmYsCisgICAgICAgICAgICAgICAgMHhlYywgMHg5NCwgMHgyMiwgMHhhNSwgMHgzYSwgMHhjNSwgMHhhZSwgMHgxNCwgMHhjZCwgMHhjMywgMHg0NiwgMHhmNiwgMHgxNywgMHg1MywgMHgyYywgMHhjZCwKKyAgICAgICAgICAgICAgICAweDU5LCAweDk0LCAweGM3LCAweDNjLCAweGFkLCAweGRiLCAweDQzLCAweGIwLCAweDFkLCAweDhlLCAweDBkLCAweGFlLCAweDFhLCAweDA0LCAweGFkLCAweGEyLAorICAgICAgICAgICAgICAgIDB4OTQsIDB4ZTQsIDB4OTAsIDB4NWMsIDB4ODAsIDB4YTEsIDB4NDIsIDB4YTIsIDB4MDgsIDB4NjEsIDB4ZTMsIDB4NWEsIDB4OWUsIDB4N2MsIDB4YzQsIDB4NGQsCisgICAgICAgICAgICAgICAgMHgxOCwgMHgxYiwgMHg4ZCwgMHgwZiwgMHg2MSwgMHgwOSwgMHg3OCwgMHhiYiwgMHhjNSwgMHg5OCwgMHhiMSwgMHhlMCwgMHgxZCwgMHg4ZCwgMHgwOSwgMHg3NCwKKyAgICAgICAgICAgICAgICAweDdkLCAweDI2LCAweGNiLCAweDEzLCAweDIxLCAweDJkLCAweDEzLCAweDJiLCAweGQxLCAweGM4LCAweDA1LCAweDJiLCAweGY4LCAweDI5LCAweDI3LCAweGIwLAorICAgICAgICAgICAgICAgIDB4ZjksIDB4OTQsIDB4YmIsIDB4YTQsIDB4YWYsIDB4ZjcsIDB4ZWEsIDB4NTEsIDB4NDcsIDB4MDQsIDB4ODYsIDB4NGUsIDB4MTQsIDB4MDEsIDB4ZGIsIDB4ZmEsCisgICAgICAgICAgICAgICAgMHg5YiwgMHhlZSwgMHgwYywgMHg5ZiwgMHg3NywgMHg4ZCwgMHhiMiwgMHgyZCwgMHhiNiwgMHgzMCwgMHgwMiwgMHg5MSwgMHg2ZSwgMHg4ZiwgMHg1MywgMHhlMCwKKyAgICAgICAgICAgICAgICAweDQ0LCAweDhmLCAweGVlLCAweGQ4LCAweDM1LCAweDBiLCAweDk0LCAweGExLCAweDZhLCAweDhiLCAweGY1LCAweGQzLCAweDJjLCAweGQxLCAweDNkLCAweGUzLAorICAgICAgICAgICAgICAgIDB4ZmIsIDB4NTYsIDB4YjksIDB4MDIsIDB4N2EsIDB4ODUsIDB4YzcsIDB4M2QsIDB4NjQsIDB4NjQsIDB4NDYsIDB4NDcsIDB4MTQsIDB4NWMsIDB4ZTQsIDB4Y2MsCisgICAgICAgICAgICAgICAgMHhiMCwgMHgxNiwgMHhiMywgMHgwZCwgMHhhNywgMHg4ZCwgMHhmNSwgMHhjOSwgMHhhNSwgMHg4MywgMHhjOSwgMHg2NiwgMHg2NCwgMHgxOSwgMHgwZCwgMHgzMiwKKyAgICAgICAgICAgICAgICAweDNkLCAweDEwLCAweGMyLCAweGMwLCAweDhiLCAweDEyLCAweGIzLCAweDkwLCAweGY0LCAweDZjLCAweDM0LCAweDM5LCAweDI0LCAweDg5LCAweDkzLCAweDI2LAorICAgICAgICAgICAgICAgIDB4NDksIDB4NzksIDB4ZDgsIDB4OWYsIDB4NmMsIDB4NDQsIDB4MDIsIDB4OGYsIDB4ZDgsIDB4MjIsIDB4MWIsIDB4NmYsIDB4ZjMsIDB4YjcsIDB4ZjEsIDB4OGIsCisgICAgICAgICAgICAgICAgMHg5OSwgMHg5MCwgMHgwZiwgMHg5NSwgMHhiOCwgMHg5MiwgMHgyMywgMHgxYSwgMHgyMCwgMHhhMywgMHg3NCwgMHg2ZiwgMHg0MCwgMHg4YSwgMHhhZiwgMHg2YSwKKyAgICAgICAgICAgICAgICAweDMzLCAweGYxLCAweGYwLCAweDVhLCAweGU5LCAweDUwLCAweDU4LCAweDBiLCAweDc2LCAweDg3LCAweGU3LCAweDQyLCAweDM0LCAweDNhLCAweDUwLCAweGZmLAorICAgICAgICAgICAgICAgIDB4MTAsIDB4MGQsIDB4OTEsIDB4YzIsIDB4NjMsIDB4MzUsIDB4NTEsIDB4ZGUsIDB4NjcsIDB4YWEsIDB4NDEsIDB4ZGMsIDB4MGQsIDB4MGEsIDB4NmEsIDB4ZjQsCisgICAgICAgICAgICAgICAgMHgwNywgMHhlNiwgMHhkOCwgMHhlMSwgMHhmZiwgMHgwMSwgMHgzMywgMHgxMCwgMHg3ZiwgMHhjOCwgMHgxZCwgMHgzMCwgMHgzYSwgMHhjNSwgMHhjZSwgMHg3MiwKKyAgICAgICAgICAgICAgICAweGNiLCAweDA1LCAweDlkLCAweDJmLCAweGNiLCAweDQ4LCAweGYyLCAweGM1LCAweDdkLCAweGZiLCAweDRjLCAweGU1LCAweDY0LCAweDYzLCAweDI2LCAweDE4LAorICAgICAgICAgICAgICAgIDB4OTUsIDB4NmMsIDB4ODcsIDB4MTMsIDB4Y2QsIDB4NDQsIDB4MjYsIDB4OWIsIDB4MzEsIDB4MDIsIDB4Y2YsIDB4ZWUsIDB4NjUsIDB4ZjYsIDB4MWMsIDB4NDksCisgICAgICAgICAgICAgICAgMHgxZSwgMHhkMywgMHhiNSwgMHg5MSwgMHhjMSwgMHgxZSwgMHhlOSwgMHhmMiwgMHg4MSwgMHg4NywgMHg1NSwgMHg2YywgMHgxOCwgMHhhZiwgMHhhZiwgMHg5MywKKyAgICAgICAgICAgICAgICAweDhiLCAweDg2LCAweGYyLCAweGU5LCAweDY5LCAweDEzLCAweGUyLCAweDI1LCAweDFmLCAweDMyLCAweGM0LCAweDM2LCAweGEyLCAweGZkLCAweGRiLCAweDZiLAorICAgICAgICAgICAgICAgIDB4OTMsIDB4MmQsIDB4MTUsIDB4ZWMsIDB4ODAsIDB4NTUsIDB4YTgsIDB4NTgsIDB4NGYsIDB4MWYsIDB4ZDgsIDB4YmUsIDB4MmIsIDB4OGUsIDB4MjYsIDB4MDYsCisgICAgICAgICAgICAgICAgMHhmMywgMHg3MywgMHgyYSwgMHhhZSwgMHg4NywgMHhlNCwgMHg5NSwgMHg3YiwgMHhiMywgMHg4YiwgMHhiMSwgMHgwZiwgMHhlMywgMHg5ZCwgMHg0NywgMHg2NywKKyAgICAgICAgICAgICAgICAweDRmLCAweDFkLCAweGFlLCAweGQ4LCAweGUwLCAweDc2LCAweDFhLCAweGMyLCAweDBiLCAweDNlLCAweDg5LCAweDIyLCAweDYyLCAweGRjLCAweDE1LCAweDA1LAorICAgICAgICAgICAgICAgIDB4MTUsIDB4NTEsIDB4MjIsIDB4MmMsIDB4Y2UsIDB4MmYsIDB4ZTIsIDB4OTksIDB4NzQsIDB4NzUsIDB4YzMsIDB4N2UsIDB4Y2QsIDB4NjYsIDB4NGUsIDB4ZGYsCisgICAgICAgICAgICAgICAgMHg5NywgMHg5NSwgMHhlYSwgMHhmYSwgMHg1NCwgMHhhZSwgMHgwMSwgMHg1OCwgMHg0YSwgMHhhNiwgMHg5MCwgMHhmZSwgMHg2YSwgMHhlNSwgMHhmOCwgMHhjZSwKKyAgICAgICAgICAgICAgICAweDc4LCAweDEzLCAweDFiLCAweDIwLCAweDU1LCAweDMzLCAweGFmLCAweGM3LCAweDBhLCAweDk2LCAweDE0LCAweDk5LCAweGI0LCAweDIyLCAweGVjLCAweGNmLAorICAgICAgICAgICAgICAgIDB4M2MsIDB4NmEsIDB4NWMsIDB4OWQsIDB4NDYsIDB4OTIsIDB4ODEsIDB4ZWUsIDB4NzIsIDB4N2EsIDB4NmMsIDB4NWMsIDB4ZTUsIDB4YTEsIDB4Y2MsIDB4NWMsCisgICAgICAgICAgICAgICAgMHg3YiwgMHg5OSwgMHhhZSwgMHg1MywgMHgzZCwgMHgwNSwgMHhhZiwgMHgyMSwgMHhmMiwgMHg0YiwgMHg2YSwgMHhmOCwgMHhkNiwgMHhjNSwgMHhjZSwgMHhmOSwKKyAgICAgICAgICAgICAgICAweDE1LCAweGNlLCAweGM4LCAweGE1LCAweDM3LCAweDU4LCAweDNjLCAweGUxLCAweDgzLCAweGQ0LCAweGJlLCAweDNlLCAweDFlLCAweDdhLCAweDZlLCAweDllLAorICAgICAgICAgICAgICAgIDB4NmEsIDB4OTQsIDB4MDMsIDB4YTcsIDB4MjUsIDB4OWMsIDB4MWMsIDB4MjYsIDB4ODQsIDB4OGUsIDB4YzQsIDB4ZjEsIDB4NTIsIDB4OGQsIDB4YzcsIDB4NzYsCisgICAgICAgICAgICAgICAgMHhkNywgMHhhNCwgMHg3ZiwgMHhjMiwgMHg1MiwgMHg1YywgMHg2YiwgMHgzYSwgMHhiMywgMHhiMiwgMHhhOSwgMHg5YSwgMHg0YiwgMHhmZiwgMHhjMSwgMHg4OSwKKyAgICAgICAgICAgICAgICAweDk5LCAweGM1LCAweDc3LCAweGFjLCAweDBkLCAweDA5LCAweDY5LCAweGRlLCAweDUwLCAweDQ5LCAweDAzLCAweGQyLCAweGY3LCAweDdhLCAweGM5LCAweGU5LAorICAgICAgICAgICAgICAgIDB4NDgsIDB4OWYsIDB4NjYsIDB4YTMsIDB4OTEsIDB4MGQsIDB4OGUsIDB4NGYsIDB4ZTEsIDB4NzAsIDB4YzgsIDB4NzQsIDB4OTMsIDB4ZDgsIDB4NzYsIDB4MmIsCisgICAgICAgICAgICAgICAgMHg5ZiwgMHg0ZiwgMHgxNSwgMHhkNSwgMHhmZiwgMHhiMCwgMHg1YSwgMHg0ZiwgMHgwNiwgMHhhYSwgMHhlMCwgMHhjYSwgMHhkZCwgMHgwYiwgMHhkNywgMHg2ZCwKKyAgICAgICAgICAgICAgICAweDI4LCAweGE3LCAweDIwLCAweDMyLCAweDZiLCAweDIwLCAweDU3LCAweDUxLCAweDE1LCAweGJjLCAweGMwLCAweGM3LCAweGEyLCAweDIxLCAweGZhLCAweDkyLAorICAgICAgICAgICAgICAgIDB4NDUsIDB4ZjAsIDB4MjQsIDB4ODgsIDB4YzMsIDB4MjIsIDB4NjUsIDB4MzIsIDB4MjcsIDB4NDUsIDB4OTYsIDB4MWIsIDB4NmYsIDB4ZGIsIDB4OGIsIDB4MjIsCisgICAgICAgICAgICAgICAgMHgxNywgMHg3OCwgMHhhMCwgMHg3OCwgMHhlMSwgMHhkNSwgMHg2YSwgMHg5ZSwgMHg2YSwgMHhjOSwgMHhkZSwgMHhlMywgMHg3MSwgMHgxYiwgMHg5ZCwgMHgzMSwKKyAgICAgICAgICAgICAgICAweDI3LCAweGIyLCAweDI1LCAweDgwLCAweGZkLCAweDQ3LCAweDg1LCAweGE3LCAweGI3LCAweGNkLCAweDYzLCAweGIzLCAweDU0LCAweGM3LCAweGYyLCAweDUzLAorICAgICAgICAgICAgICAgIDB4YmYsIDB4MjIsIDB4NTgsIDB4OTUsIDB4YzQsIDB4MzksIDB4MTksIDB4OWQsIDB4Y2UsIDB4YmUsIDB4NTQsIDB4ZDUsIDB4NTgsIDB4NjgsIDB4MDEsIDB4ZjgsCisgICAgICAgICAgICAgICAgMHgwZCwgMHgyOCwgMHhhYSwgMHhmOCwgMHgyNywgMHg3MSwgMHg2OCwgMHgzYiwgMHgxMywgMHg1MywgMHgwNywgMHhkNCwgMHg0MiwgMHhiMCwgMHgwMiwgMHg2NiwKKyAgICAgICAgICAgICAgICAweDM1LCAweDJiLCAweGVjLCAweDYyLCAweDg0LCAweDg1LCAweDJiLCAweDJjLCAweGU3LCAweDA5LCAweGE1LCAweGU2LCAweDFhLCAweDc3LCAweDE4LCAweDI4LAorICAgICAgICAgICAgICAgIDB4OTQsIDB4ZmYsIDB4MWIsIDB4M2UsIDB4Y2YsIDB4ZGQsIDB4MjEsIDB4MmEsIDB4ZTIsIDB4NDksIDB4YTQsIDB4MjcsIDB4Y2YsIDB4M2EsIDB4NzIsIDB4Y2MsCisgICAgICAgICAgICAgICAgMHgzZSwgMHhiZSwgMHgyNCwgMHg2MSwgMHhlMiwgMHg0MywgMHg0YiwgMHgzZSwgMHhjYiwgMHhlNSwgMHgxOCwgMHg2MywgMHhmYywgMHhkMCwgMHhiMywgMHg0OSwKKyAgICAgICAgICAgICAgICAweGNjLCAweGQxLCAweGNlLCAweGQ1LCAweDFkLCAweDM4LCAweDcyLCAweDA3LCAweGJjLCAweGE1LCAweDY4LCAweGE1LCAweGIxLCAweDMwLCAweGM3LCAweDViLAorICAgICAgICAgICAgICAgIDB4ZmMsIDB4MTUsIDB4Y2YsIDB4ZjUsIDB4YTAsIDB4ZjcsIDB4ZTksIDB4MzgsIDB4N2QsIDB4ZDMsIDB4Y2IsIDB4YzAsIDB4NzcsIDB4MTYsIDB4MmEsIDB4MzcsCisgICAgICAgICAgICAgICAgMHhmZiwgMHg2MiwgMHgwOSwgMHg1YywgMHhlNywgMHg1ZSwgMHg1YiwgMHhmYywgMHhhZiwgMHhjYywgMHhlNCwgMHhjZiwgMHg2MywgMHgxMywgMHhiMCwgMHg1MywKKyAgICAgICAgICAgICAgICAweGJmLCAweGYyLCAweDk0LCAweDc2LCAweGI1LCAweGQzLCAweDYwLCAweDcyLCAweDBjLCAweGYxLCAweDcxLCAweDQzLCAweGEwLCAweDA0LCAweGFhLCAweGU1LAorICAgICAgICAgICAgICAgIDB4ODcsIDB4OGMsIDB4NTcsIDB4NjYsIDB4MjAsIDB4ZTIsIDB4OWMsIDB4MzksIDB4YjQsIDB4YzAsIDB4YjQsIDB4NDAsIDB4NTUsIDB4MzQsIDB4ZTYsIDB4MzEsCisgICAgICAgICAgICAgICAgMHg3NSwgMHgwMywgMHhkZiwgMHhmMywgMHg1YywgMHhkOCwgMHgxNSwgMHgxNiwgMHgzNSwgMHg0MCwgMHhjNSwgMHhjZiwgMHhjNywgMHg1MSwgMHgzYiwgMHgwMywKKyAgICAgICAgICAgICAgICAweGI0LCAweDhmLCAweDIxLCAweDk2LCAweDNkLCAweDRmLCAweDMyLCAweGI4LCAweDA1LCAweGRmLCAweDY2LCAweGI0LCAweGNkLCAweDQyLCAweGQ0LCAweDM2LAorICAgICAgICAgICAgICAgIDB4MmUsIDB4MmQsIDB4NzMsIDB4NzYsIDB4YzUsIDB4NTksIDB4OTIsIDB4ZTcsIDB4MGYsIDB4ZTYsIDB4NDIsIDB4MWYsIDB4MzQsIDB4YzYsIDB4OWMsIDB4MjgsCisgICAgICAgICAgICAgICAgMHg1ZSwgMHhlZSwgMHgxNCwgMHgyNCwgMHhkNiwgMHg2NiwgMHhhOSwgMHgxYSwgMHhkMCwgMHhkNSwgMHg2MCwgMHhhMiwgMHhjMCwgMHg3MywgMHgzMCwgMHgxYSwKKyAgICAgICAgICAgICAgICAweDQwLCAweGMzLCAweGYzLCAweDc3LCAweDhiLCAweDk2LCAweGVmLCAweGNiLCAweDMwLCAweDgzLCAweDA5LCAweDYyLCAweDA4LCAweDFlLCAweDUwLCAweDJkLAorICAgICAgICAgICAgICAgIDB4MjYsIDB4ZGUsIDB4YWEsIDB4YTQsIDB4NzQsIDB4ODUsIDB4NWIsIDB4ZDMsIDB4NGQsIDB4YmUsIDB4NzAsIDB4MDMsIDB4MjYsIDB4ZjYsIDB4NTksIDB4MGMsCisgICAgICAgICAgICAgICAgMHgzZSwgMHgwNiwgMHg1YSwgMHhmYiwgMHhmYiwgMHhkMSwgMHgzYiwgMHgzMiwgMHhjOSwgMHg3MSwgMHg2NywgMHg4OSwgMHgzOCwgMHgwNywgMHhjZSwgMHgyNCwKKyAgICAgICAgICAgICAgICAweGUzLCAweDllLCAweDI2LCAweDA2LCAweDY2LCAweDA2LCAweGJiLCAweDkwLCAweDFlLCAweDY3LCAweGQ1LCAweDAwLCAweDNlLCAweDhiLCAweGViLCAweDQ5LAorICAgICAgICAgICAgICAgIDB4Y2UsIDB4ZGYsIDB4M2QsIDB4YjYsIDB4NTQsIDB4NGMsIDB4ZWYsIDB4ZDIsIDB4OTgsIDB4N2MsIDB4NDksIDB4NDksIDB4ZDksIDB4YjgsIDB4MDYsIDB4YWMsCisgICAgICAgICAgICAgICAgMHg4OSwgMHhhOCwgMHg5NCwgMHg3OCwgMHhlNSwgMHg4MywgMHgwNCwgMHg0OSwgMHhmYiwgMHg1YSwgMHg4NywgMHg3ZCwgMHgxMCwgMHg5YywgMHg1NiwgMHgzZiwKKyAgICAgICAgICAgICAgICAweDQyLCAweGQ2LCAweDZmLCAweDk3LCAweDY2LCAweGUxLCAweDE4LCAweGJjLCAweDcxLCAweGMxLCAweDAzLCAweDI0LCAweGFmLCAweGRmLCAweDM2LCAweDA0LAorICAgICAgICAgICAgICAgIDB4NjYsIDB4MDIsIDB4NTUsIDB4ZDgsIDB4YWUsIDB4MTksIDB4OTYsIDB4NDgsIDB4YzUsIDB4NmYsIDB4NGMsIDB4N2MsIDB4MzQsIDB4MmMsIDB4MDEsIDB4MjQsCisgICAgICAgICAgICAgICAgMHhkMCwgMHg0OSwgMHhmNSwgMHg4NSwgMHg3NiwgMHhjYywgMHg2OSwgMHg1NiwgMHg3YSwgMHgyZiwgMHg1NywgMHgzYywgMHg1YywgMHg4MSwgMHg3NiwgMHg3MywKKyAgICAgICAgICAgICAgICAweDEzLCAweDg0LCAweGE1LCAweGQ3LCAweDNhLCAweGZhLCAweDNjLCAweDg0LCAweDY3LCAweDNlLCAweDExLCAweDFkLCAweDM0LCAweGU5LCAweDMzLCAweDBiLAorICAgICAgICAgICAgICAgIDB4NDcsIDB4OTYsIDB4MDIsIDB4OTIsIDB4NGUsIDB4NDMsIDB4MGIsIDB4YWIsIDB4NTYsIDB4NjQsIDB4NTMsIDB4ZGYsIDB4MWQsIDB4MzcsIDB4MWEsIDB4NTcsCisgICAgICAgICAgICAgICAgMHgwMCwgMHg3ZCwgMHgwZCwgMHg5OSwgMHgxYSwgMHg3YywgMHg2ZCwgMHg2OCwgMHhmNywgMHhiMiwgMHg3ZSwgMHgwNywgMHhlYiwgMHg2NSwgMHhmNCwgMHg0YywKKyAgICAgICAgICAgICAgICAweGJiLCAweDJkLCAweGU3LCAweGQ5LCAweGM3LCAweGE3LCAweDUyLCAweDU4LCAweDM2LCAweDI3LCAweDJhLCAweDUxLCAweGQ5LCAweDBlLCAweDZiLCAweDcwLAorICAgICAgICAgICAgICAgIDB4ZmUsIDB4YjksIDB4YTIsIDB4MzQsIDB4NDEsIDB4NzIsIDB4NjgsIDB4YzUsIDB4OWMsIDB4Y2MsIDB4ZDQsIDB4N2EsIDB4OTAsIDB4ZjAsIDB4NjIsIDB4YTAsCisgICAgICAgICAgICAgICAgMHhmNiwgMHgwNSwgMHg0YiwgMHhkNiwgMHg3MCwgMHg5YywgMHgwNCwgMHhkOSwgMHg3NiwgMHhkZSwgMHhiNiwgMHgwOSwgMHhiNCwgMHhjNSwgMHgyNCwgMHg0YiwKKyAgICAgICAgICAgICAgICAweDhlLCAweDc5LCAweDExLCAweDkxLCAweGFmLCAweDg5LCAweDEwLCAweDY4LCAweDhjLCAweGVkLCAweGI1LCAweGYyLCAweDM5LCAweDhkLCAweGU4LCAweDBkLAorICAgICAgICAgICAgICAgIDB4ZWQsIDB4YjksIDB4MjIsIDB4MjAsIDB4ZTAsIDB4NDUsIDB4OGEsIDB4YzIsIDB4N2QsIDB4MjMsIDB4YjIsIDB4YjAsIDB4YjIsIDB4ZGUsIDB4ZGIsIDB4MGYsCisgICAgICAgICAgICAgICAgMHhhMSwgMHg2YiwgMHg4YiwgMHhmMCwgMHg5NCwgMHg4YiwgMHhhNSwgMHg0MCwgMHgxYiwgMHgyYiwgMHhjYiwgMHg0MSwgMHgzNSwgMHgzOSwgMHgyOCwgMHgzZCwKKyAgICAgICAgICAgICAgICAweDRlLCAweDEzLCAweDZiLCAweDJjLCAweGJmLCAweGE3LCAweDZkLCAweGQwLCAweDExLCAweGRmLCAweDQzLCAweGQ2LCAweGYzLCAweGM1LCAweDU0LCAweDc5LAorICAgICAgICAgICAgICAgIDB4ODYsIDB4MDcsIDB4N2MsIDB4ZWYsIDB4MWEsIDB4NTEsIDB4YzMsIDB4YjIsIDB4YzYsIDB4YWEsIDB4MDQsIDB4NjgsIDB4ZmIsIDB4Y2IsIDB4ZjAsIDB4MWIsCisgICAgICAgICAgICAgICAgMHgxZiwgMHhmMywgMHg0NSwgMHhlMCwgMHg2ZSwgMHg2ZCwgMHhhYiwgMHhiNywgMHg3YywgMHg0MiwgMHg1OCwgMHhjOSwgMHhiYiwgMHgzNSwgMHhkOSwgMHgxZiwKKyAgICAgICAgICAgICAgICAweDlhLCAweDg4LCAweDI2LCAweDEyLCAweDU0LCAweGRhLCAweDFkLCAweDBkLCAweGM0LCAweDNlLCAweDUwLCAweGQ1LCAweDE3LCAweDAwLCAweDA4LCAweDU0LAorICAgICAgICAgICAgICAgIDB4ZDMsIDB4MTEsIDB4MDEsIDB4ZWEsIDB4YjQsIDB4NDcsIDB4ZDcsIDB4NWMsIDB4OGYsIDB4N2EsIDB4NTgsIDB4ZmIsIDB4MDcsIDB4MmEsIDB4YjcsIDB4NTMsCisgICAgICAgICAgICAgICAgMHhkNiwgMHgyYiwgMHg1OSwgMHgxMywgMHhhZiwgMHg3OCwgMHgyMiwgMHg3MCwgMHgxZiwgMHgxMCwgMHhlMywgMHg0OCwgMHhhZSwgMHg0ZiwgMHhkYSwgMHg5OCwKKyAgICAgICAgICAgICAgICAweGNhLCAweGRkLCAweDUzLCAweGFiLCAweGI4LCAweDAyLCAweGE1LCAweDk1LCAweGM4LCAweGUwLCAweDFjLCAweDk5LCAweGY2LCAweDljLCAweDE4LCAweDU1LAorICAgICAgICAgICAgICAgIDB4MTgsIDB4Y2YsIDB4NjcsIDB4OTEsIDB4NDYsIDB4YmIsIDB4MjEsIDB4MWIsIDB4ZWEsIDB4MjYsIDB4YmQsIDB4NWYsIDB4OTAsIDB4MDAsIDB4N2IsIDB4YmMsCisgICAgICAgICAgICAgICAgMHhlNSwgMHg2ZiwgMHhhMCwgMHhhZiwgMHhkOCwgMHhlNiwgMHhjZCwgMHgxOCwgMHg3NSwgMHg1MCwgMHgzYywgMHgwOCwgMHg5OCwgMHg1NiwgMHg2NywgMHhmZCwKKyAgICAgICAgICAgICAgICAweDFhLCAweDU4LCAweDY0LCAweGMwLCAweDg5LCAweDExLCAweGYwLCAweDM5LCAweDY1LCAweDhhLCAweDVmLCAweDhjLCAweDA0LCAweGQzLCAweDkzLCAweDgzLAorICAgICAgICAgICAgICAgIDB4ZjAsIDB4N2QsIDB4ZDgsIDB4ZGYsIDB4ZWUsIDB4MGEsIDB4MmUsIDB4OGIsIDB4YzIsIDB4MTIsIDB4MGUsIDB4MjEsIDB4ZTAsIDB4NzUsIDB4ZTIsIDB4MWQsCisgICAgICAgICAgICAgICAgMHg2YywgMHgyMiwgMHgwOCwgMHg1YSwgMHhhZiwgMHhkYiwgMHgxNywgMHg1YSwgMHgyOSwgMHhjNywgMHg3NiwgMHhhOCwgMHhmYywgMHg5YSwgMHg3NCwgMHgxYSwKKyAgICAgICAgICAgICAgICAweGJkLCAweGZlLCAweDg5LCAweGM2LCAweDIzLCAweGY4LCAweDA5LCAweDU4LCAweGZlLCAweGYyLCAweDlkLCAweGYwLCAweGMzLCAweDNlLCAweGE5LCAweDA2LAorICAgICAgICAgICAgICAgIDB4NTcsIDB4MmQsIDB4NWYsIDB4NDEsIDB4NzYsIDB4ZDcsIDB4YTksIDB4ZWMsIDB4M2IsIDB4MDgsIDB4YWMsIDB4M2QsIDB4NjIsIDB4MGUsIDB4NjYsIDB4MjUsCisgICAgICAgICAgICAgICAgMHhjYSwgMHgyZiwgMHgxMCwgMHhjNSwgMHhjNywgMHg0NywgMHgyYiwgMHhjMiwgMHgzYSwgMHhkYSwgMHg2OSwgMHg1NSwgMHhlNiwgMHg4OCwgMHhiNiwgMHg0ZCwKKyAgICAgICAgICAgICAgICAweDgyLCAweDBlLCAweGU3LCAweDQwLCAweDk1LCAweDJlLCAweGU2LCAweDZiLCAweDRmLCAweGIzLCAweGMzLCAweDMwLCAweDFlLCAweDkwLCAweDQ0LCAweDQyLAorICAgICAgICAgICAgICAgIDB4ZWYsIDB4NDYsIDB4NTMsIDB4ZjIsIDB4NDYsIDB4ZTcsIDB4YjUsIDB4M2IsIDB4MTIsIDB4YWUsIDB4MjAsIDB4OTksIDB4YTAsIDB4ZmMsIDB4NjUsIDB4M2MsCisgICAgICAgICAgICAgICAgMHg4MCwgMHhlYywgMHg1YywgMHhmNSwgMHg1NiwgMHg5YywgMHg5NCwgMHgxNSwgMHhiMSwgMHhhOCwgMHhlMywgMHhhMSwgMHhkZSwgMHhkNywgMHhkYywgMHg2NywKKyAgICAgICAgICAgICAgICAweGEwLCAweDg5LCAweDRhLCAweDA0LCAweDAwLCAweDRmLCAweDhmLCAweGI0LCAweGU2LCAweDgxLCAweGI1LCAweDRmLCAweDM2LCAweGNiLCAweGE4LCAweDcxLAorICAgICAgICAgICAgICAgIDB4Y2QsIDB4MzMsIDB4YzYsIDB4MTYsIDB4MGMsIDB4OWUsIDB4YTgsIDB4MmUsIDB4NGIsIDB4NTYsIDB4MDQsIDB4NWYsIDB4MjQsIDB4NmIsIDB4MGEsIDB4MDIsCisgICAgICAgICAgICAgICAgMHg5MiwgMHgzNiwgMHg2NywgMHhhMiwgMHgwMSwgMHhiOCwgMHhkZSwgMHg0NiwgMHgyMCwgMHgyNywgMHg2OSwgMHgxYywgMHgzYywgMHg5NiwgMHg4MiwgMHg2MCwKKyAgICAgICAgICAgICAgICAweDAxLCAweGRhLCAweGE3LCAweDE5LCAweGZkLCAweDAwLCAweGFiLCAweDU0LCAweDliLCAweDY2LCAweGY4LCAweGE4LCAweGUzLCAweDdkLCAweGU4LCAweDk0LAorICAgICAgICAgICAgICAgIDB4NWUsIDB4YzQsIDB4YzIsIDB4MzQsIDB4NWQsIDB4YTksIDB4OTEsIDB4NDEsIDB4N2UsIDB4YTYsIDB4ZTUsIDB4ODQsIDB4Y2IsIDB4M2QsIDB4MTAsIDB4YmYsCisgICAgICAgICAgICAgICAgMHhhYiwgMHgwMiwgMHhkMSwgMHg5ZCwgMHhjMywgMHhhZSwgMHhlMywgMHgwYiwgMHgwMywgMHgwOCwgMHgxOSwgMHg3NywgMHg0ZSwgMHhiNSwgMHg1NSwgMHgzNSwKKyAgICAgICAgICAgICAgICAweDQyLCAweGMxLCAweDAzLCAweDk5LCAweDNjLCAweGQ2LCAweDMzLCAweDdhLCAweDU4LCAweGI5LCAweGNjLCAweDIzLCAweDcxLCAweDNjLCAweDY3LCAweGFiLAorICAgICAgICAgICAgICAgIDB4MzMsIDB4MjYsIDB4ZjUsIDB4NjgsIDB4ZTYsIDB4YjIsIDB4MjMsIDB4ODksIDB4MWIsIDB4ZDksIDB4YjYsIDB4ZjMsIDB4NWIsIDB4YmEsIDB4ZWEsIDB4NDEsCisgICAgICAgICAgICAgICAgMHhiMSwgMHhkOSwgMHg3YiwgMHhjNSwgMHhlOSwgMHhlYiwgMHhlYywgMHg0NSwgMHgwOSwgMHg0YiwgMHgxZiwgMHg2YywgMHgxNywgMHg1NCwgMHgzZiwgMHgyYSwKKyAgICAgICAgICAgICAgICAweDY4LCAweGY1LCAweGU5LCAweGRiLCAweGNiLCAweGE0LCAweDk5LCAweDBhLCAweGFlLCAweDRiLCAweGU0LCAweDlmLCAweDA5LCAweDg0LCAweGQxLCAweDgyLAorICAgICAgICAgICAgICAgIDB4NzksIDB4ZjMsIDB4OGMsIDB4ZDUsIDB4MTAsIDB4NmQsIDB4NzksIDB4YzksIDB4MmQsIDB4ZTMsIDB4NDcsIDB4ZmQsIDB4ODEsIDB4NmEsIDB4OWEsIDB4MzgsCisgICAgICAgICAgICAgICAgMHgzZCwgMHg3YiwgMHgyNSwgMHg1ZCwgMHg5NiwgMHgzNSwgMHgzYSwgMHg1OSwgMHhiYiwgMHhiMywgMHg2YiwgMHgzMSwgMHgwMywgMHg0MywgMHhmMCwgMHg5YiwKKyAgICAgICAgICAgICAgICAweDcyLCAweGU1LCAweGVkLCAweDJhLCAweDE4LCAweDJmLCAweGI0LCAweDVmLCAweDg3LCAweDU0LCAweDBlLCAweDA2LCAweGM0LCAweDU4LCAweDg1LCAweDgwLAorICAgICAgICAgICAgICAgIDB4MjksIDB4ZGEsIDB4ODUsIDB4MjEsIDB4MmYsIDB4MTEsIDB4OGIsIDB4M2MsIDB4OWYsIDB4ZGUsIDB4YjMsIDB4NTMsIDB4N2UsIDB4MTIsIDB4MTksIDB4MDEsCisgICAgICAgICAgICAgICAgMHhjOSwgMHhiNywgMHg1MSwgMHgzNSwgMHg3ZCwgMHg3OSwgMHgzOCwgMHgwZSwgMHhjMiwgMHhjNiwgMHg2NiwgMHhhYiwgMHgxNCwgMHhiYSwgMHg5NCwgMHhmZiwKKyAgICAgICAgICAgICAgICAweDY0LCAweDBiLCAweGE3LCAweDBlLCAweDkyLCAweDZjLCAweDU1LCAweDBhLCAweGQwLCAweDdhLCAweGFlLCAweDg4LCAweDk5LCAweGFhLCAweDUyLCAweDA2LAorICAgICAgICAgICAgICAgIDB4NDMsIDB4M2IsIDB4YTYsIDB4ZWYsIDB4MmIsIDB4NGUsIDB4YTEsIDB4YzksIDB4ZGYsIDB4NDcsIDB4MjYsIDB4YzEsIDB4NjIsIDB4N2QsIDB4ZTMsIDB4NjYsCisgICAgICAgICAgICAgICAgMHg0MCwgMHg5YywgMHg4NywgMHgyZiwgMHhmOCwgMHhkNiwgMHhlOSwgMHgzYSwgMHg1MSwgMHhmZiwgMHhkNiwgMHg2OCwgMHhmOCwgMHg3MiwgMHhmMSwgMHhjYywKKyAgICAgICAgICAgICAgICAweGI3LCAweDM3LCAweDk1LCAweDE5LCAweGRmLCAweDRlLCAweDM5LCAweDZmLCAweDVhLCAweDczLCAweGU2LCAweGM1LCAweDM3LCAweDk0LCAweGM5LCAweGIzLAorICAgICAgICAgICAgICAgIDB4ZjEsIDB4MzksIDB4ZmEsIDB4MWIsIDB4MTUsIDB4MjgsIDB4ZDYsIDB4MjUsIDB4YWYsIDB4NzEsIDB4NWYsIDB4NTEsIDB4NjUsIDB4M2EsIDB4ZDEsIDB4YzYsCisgICAgICAgICAgICAgICAgMHhhNCwgMHg4NywgMHg4OCwgMHg5ZCwgMHhlZSwgMHg5YywgMHg1NiwgMHg4YSwgMHhkNSwgMHhlMiwgMHhkNiwgMHg0MCwgMHg0YSwgMHhmYiwgMHgyYiwgMHg3YywKKyAgICAgICAgICAgICAgICAweGI0LCAweDZmLCAweGVmLCAweDIxLCAweDVkLCAweDQwLCAweDc0LCAweDBiLCAweGVlLCAweDU5LCAweDUzLCAweGEzLCAweDQ1LCAweDVlLCAweDMzLCAweDk3LAorICAgICAgICAgICAgICAgIDB4NTksIDB4ZWMsIDB4OGMsIDB4NmIsIDB4OTcsIDB4ZjgsIDB4YTMsIDB4NGMsIDB4YjQsIDB4ZWEsIDB4MGMsIDB4MjcsIDB4MDQsIDB4YzksIDB4YjcsIDB4YjYsCisgICAgICAgICAgICAgICAgMHhlMiwgMHgxYiwgMHhkNiwgMHg2YSwgMHhlYywgMHg2MCwgMHg4OSwgMHgxMCwgMHhjMiwgMHhkMSwgMHg3NywgMHhjMSwgMHgyNiwgMHhkNiwgMHhmNSwgMHgxNSwKKyAgICAgICAgICAgICAgICAweGEyLCAweDVjLCAweDgzLCAweGJkLCAweGUyLCAweDkyLCAweDI5LCAweDE4LCAweDUxLCAweGM4LCAweDJjLCAweDYxLCAweGVmLCAweDkwLCAweDljLCAweGZhLAorICAgICAgICAgICAgICAgIDB4MmMsIDB4ZDIsIDB4ZWUsIDB4NGIsIDB4OWYsIDB4NGIsIDB4ZWEsIDB4MTMsIDB4MDYsIDB4ZGUsIDB4ODQsIDB4NDMsIDB4ODMsIDB4NGUsIDB4NjUsIDB4YmYsCisgICAgICAgICAgICAgICAgMHgxMiwgMHgwMiwgMHg1NCwgMHhmNSwgMHhiOCwgMHg3ZSwgMHg4NywgMHg2YSwgMHg5OCwgMHhkOSwgMHhiMywgMHgwZCwgMHhkOSwgMHhkMSwgMHg4NywgMHg5NiwKKyAgICAgICAgICAgICAgICAweDlhLCAweGFhLCAweDkzLCAweDA1LCAweGM2LCAweDEzLCAweDliLCAweGJhLCAweDIzLCAweDYzLCAweDQxLCAweDgwLCAweGY5LCAweDkxLCAweDNiLCAweGEyLAorICAgICAgICAgICAgICAgIDB4ZmQsIDB4ZDcsIDB4YTMsIDB4MGMsIDB4MzMsIDB4N2MsIDB4M2IsIDB4YzksIDB4MzQsIDB4NTQsIDB4NzQsIDB4ZjQsIDB4YjUsIDB4OWUsIDB4ZDUsIDB4MmIsCisgICAgICAgICAgICAgICAgMHhiMSwgMHhhYSwgMHgwZiwgMHg4NiwgMHg1MywgMHgxYywgMHg2NiwgMHg2ZiwgMHg2YSwgMHgzOCwgMHgzZCwgMHgwMiwgMHgyMCwgMHhiNywgMHhhYiwgMHg5ZSwKKyAgICAgICAgICAgICAgICAweDUzLCAweDE1LCAweDE5LCAweDJlLCAweGRkLCAweGQzLCAweDgyLCAweGY1LCAweGI1LCAweDY5LCAweDZhLCAweDk3LCAweDQ3LCAweGU5LCAweDA0LCAweGVhLAorICAgICAgICAgICAgICAgIDB4MzQsIDB4MmQsIDB4NjcsIDB4ZWMsIDB4ODIsIDB4MGYsIDB4MzYsIDB4ZDEsIDB4NzksIDB4OTYsIDB4ODksIDB4YTEsIDB4NGQsIDB4NzMsIDB4MWMsIDB4N2EsCisgICAgICAgICAgICAgICAgMHg3OCwgMHhmNSwgMHhlOSwgMHg2MiwgMHg5ZCwgMHg4NywgMHg5MywgMHg1MCwgMHgwMCwgMHg5NywgMHg3NSwgMHg0NiwgMHhjMSwgMHg5YywgMHg2NiwgMHgxNiwKKyAgICAgICAgICAgICAgICAweDcyLCAweGFiLCAweDY3LCAweDIyLCAweGIyLCAweDZiLCAweDBjLCAweDIzLCAweDg4LCAweDAxLCAweGNjLCAweGMzLCAweGYwLCAweDFlLCAweGYwLCAweDlkLAorICAgICAgICAgICAgICAgIDB4OWUsIDB4NWEsIDB4ZDMsIDB4ZTIsIDB4MGYsIDB4NTksIDB4MTgsIDB4MzgsIDB4YjUsIDB4MzgsIDB4NmQsIDB4OWMsIDB4NWMsIDB4ZjgsIDB4ZTAsIDB4YTksCisgICAgICAgICAgICAgICAgMHgyZCwgMHgxYSwgMHg3MiwgMHgzOCwgMHgzNSwgMHhmMywgMHg4YSwgMHg5MiwgMHg0YSwgMHhjNywgMHhiYSwgMHg1YSwgMHhmMSwgMHg1YSwgMHg4NSwgMHgyZiwKKyAgICAgICAgICAgICAgICAweDEzLCAweDJhLCAweDkzLCAweGFmLCAweDEyLCAweGQzLCAweDgzLCAweGNiLCAweGIwLCAweDQwLCAweDNkLCAweGVlLCAweDNiLCAweDZhLCAweDZlLCAweDNlLAorICAgICAgICAgICAgICAgIDB4YjIsIDB4ZDIsIDB4N2UsIDB4YjcsIDB4MDcsIDB4MWUsIDB4NTQsIDB4YzgsIDB4OGUsIDB4YzAsIDB4ZjcsIDB4MjMsIDB4YjEsIDB4YTAsIDB4YmQsIDB4NzgsCisgICAgICAgICAgICAgICAgMHhiNywgMHg4YiwgMHg4MywgMHg1OSwgMHgyZCwgMHhkNSwgMHgzYiwgMHg1ZiwgMHg0NCwgMHgzYSwgMHg2MywgMHg4YiwgMHg4OCwgMHg4NCwgMHg2OSwgMHgzYywKKyAgICAgICAgICAgICAgICAweDdiLCAweGFlLCAweGZlLCAweDIxLCAweGU4LCAweGZmLCAweDAzLCAweGQ4LCAweDIzLCAweGMzLCAweDgzLCAweDMxLCAweDA2LCAweGUyLCAweDNmLCAweDhhLAorICAgICAgICAgICAgICAgIDB4MjEsIDB4MTQsIDB4ZWUsIDB4NGIsIDB4ZDMsIDB4Y2EsIDB4YjEsIDB4MGEsIDB4ZDksIDB4YzcsIDB4MzEsIDB4YmYsIDB4YmMsIDB4YWIsIDB4MzUsIDB4MTYsCisgICAgICAgICAgICAgICAgMHgwZSwgMHgxMywgMHg1ZCwgMHg0MCwgMHhjMiwgMHhiMSwgMHhlNSwgMHhkMywgMHhiMiwgMHg3NiwgMHhjNSwgMHgzOCwgMHg0OCwgMHg0OSwgMHhjYywgMHg5NywKKyAgICAgICAgICAgICAgICAweDcwLCAweDM1LCAweGExLCAweDBkLCAweDZlLCAweGM2LCAweGE4LCAweDI5LCAweGU2LCAweGFhLCAweGMyLCAweGUxLCAweDYzLCAweDk1LCAweDViLCAweDc3LAorICAgICAgICAgICAgICAgIDB4NjMsIDB4N2YsIDB4MDksIDB4ZjUsIDB4NjYsIDB4ZDEsIDB4ZTcsIDB4NjAsIDB4OTcsIDB4NTMsIDB4MDUsIDB4MjIsIDB4MWQsIDB4NzcsIDB4MDcsIDB4YzYsCisgICAgICAgICAgICAgICAgMHgzMCwgMHhhMCwgMHg5ZSwgMHg3OCwgMHg3ZiwgMHg5MiwgMHhkMiwgMHg3NiwgMHg5YywgMHg2MywgMHg5ZCwgMHhmMywgMHhhMywgMHg2ZiwgMHhiMCwgMHhiOCwKKyAgICAgICAgICAgICAgICAweDMwLCAweDczLCAweGRhLCAweGJkLCAweDUwLCAweGFkLCAweGE4LCAweDMwLCAweGE0LCAweDE3LCAweDM4LCAweDZkLCAweDU3LCAweDE3LCAweDlkLCAweDA5LAorICAgICAgICAgICAgICAgIDB4YTYsIDB4N2MsIDB4NGEsIDB4MzAsIDB4Y2MsIDB4Y2MsIDB4ODksIDB4MTYsIDB4MTEsIDB4ODEsIDB4NjEsIDB4MjksIDB4OWIsIDB4NjEsIDB4MDcsIDB4ODksCisgICAgICAgICAgICAgICAgMHg4MiwgMHgyOCwgMHgxYywgMHhjOSwgMHg2YiwgMHhjYSwgMHg3NSwgMHg4MywgMHg1NSwgMHhlOCwgMHgzMCwgMHhlMSwgMHg2MywgMHhhYiwgMHhhOCwgMHg3ZSwKKyAgICAgICAgICAgICAgICAweDZlLCAweDZhLCAweGE4LCAweGRjLCAweDg5LCAweDAzLCAweDU3LCAweGZlLCAweDMyLCAweDBhLCAweGZhLCAweGRkLCAweDg3LCAweGEzLCAweGMyLCAweDFkLAorICAgICAgICAgICAgICAgIDB4NDEsIDB4YzcsIDB4NTUsIDB4OTQsIDB4MzgsIDB4NWQsIDB4ZWMsIDB4NGMsIDB4MDYsIDB4ZjgsIDB4ZDUsIDB4MjksIDB4YTYsIDB4NjQsIDB4NGIsIDB4OTMsCisgICAgICAgICAgICAgICAgMHgzOCwgMHgxNCwgMHg2MywgMHg1MSwgMHg1MywgMHgwMywgMHgwOSwgMHg0YiwgMHg2NywgMHg3NCwgMHgzZCwgMHg0MSwgMHhjNiwgMHg1ZCwgMHg2OSwgMHhjOSwKKyAgICAgICAgICAgICAgICAweGQyLCAweDc2LCAweGJhLCAweDFhLCAweDA3LCAweDZmLCAweDcyLCAweDg1LCAweGIxLCAweGIyLCAweDFhLCAweDljLCAweGU3LCAweGVkLCAweGY1LCAweDFlLAorICAgICAgICAgICAgICAgIDB4ZDYsIDB4ZTcsIDB4NWYsIDB4YzcsIDB4N2QsIDB4NjQsIDB4MzUsIDB4YzcsIDB4MTAsIDB4YzcsIDB4YWUsIDB4OTMsIDB4ODcsIDB4NTQsIDB4NDksIDB4ZGIsCisgICAgICAgICAgICAgICAgMHgxZSwgMHg3ZCwgMHhhYSwgMHg5NCwgMHgzZSwgMHg1YiwgMHhmMywgMHg3OSwgMHg3MiwgMHhjZiwgMHhiYSwgMHhhMiwgMHg1OSwgMHg0MiwgMHg3YywgMHhhZCwKKyAgICAgICAgICAgICAgICAweDBmLCAweDE5LCAweDZiLCAweGU4LCAweGVmLCAweGE3LCAweDAxLCAweDk4LCAweGNlLCAweDM0LCAweGY2LCAweGYwLCAweGZjLCAweDhkLCAweGVmLCAweDMyLAorICAgICAgICAgICAgICAgIDB4MTAsIDB4NTcsIDB4MjUsIDB4ZGMsIDB4YjYsIDB4NDMsIDB4NDYsIDB4ZDMsIDB4ZjcsIDB4ZjQsIDB4NWMsIDB4ZDEsIDB4NmMsIDB4YzgsIDB4NjQsIDB4YzUsCisgICAgICAgICAgICAgICAgMHg0NCwgMHg1NSwgMHgyOCwgMHgxMCwgMHgzZCwgMHgxOSwgMHg0MCwgMHhmMSwgMHhiYSwgMHhkMiwgMHg0NywgMHg5ZCwgMHhmMCwgMHg4ZSwgMHgwYSwgMHg2MSwKKyAgICAgICAgICAgICAgICAweDA0LCAweDcxLCAweDJmLCAweDMyLCAweGVjLCAweDliLCAweDkxLCAweGE5LCAweDZhLCAweDczLCAweDFjLCAweGM1LCAweGQ3LCAweDI1LCAweDA3LCAweGFmLAorICAgICAgICAgICAgICAgIDB4OGUsIDB4NmUsIDB4OTgsIDB4MDksIDB4ZDQsIDB4YTcsIDB4YTcsIDB4ZjcsIDB4MjcsIDB4NTUsIDB4NDIsIDB4ZTMsIDB4ZjcsIDB4ZjUsIDB4ZjEsIDB4MTUsCisgICAgICAgICAgICAgICAgMHgzYiwgMHgzYywgMHgwZSwgMHg0ZCwgMHg5OSwgMHg4NiwgMHhiMSwgMHhkNCwgMHg5YywgMHgyZSwgMHgyOCwgMHg2YSwgMHhiNSwgMHhhOSwgMHhlMSwgMHg5MiwKKyAgICAgICAgICAgICAgICAweGZlLCAweDlkLCAweGI3LCAweDRmLCAweDg2LCAweDRiLCAweDIxLCAweDc1LCAweGVlLCAweGI4LCAweGM2LCAweGZmLCAweGU1LCAweDBhLCAweDliLCAweDFiLAorICAgICAgICAgICAgICAgIDB4MWUsIDB4ZjYsIDB4OGEsIDB4OWIsIDB4NmQsIDB4YjEsIDB4NzYsIDB4OTMsIDB4MmQsIDB4OGMsIDB4ZjcsIDB4NjEsIDB4NTEsIDB4MzQsIDB4MTQsIDB4MTYsCisgICAgICAgICAgICAgICAgMHhkMywgMHhiOSwgMHhkZSwgMHgzOCwgMHg1MCwgMHgwMywgMHhjMiwgMHgzYywgMHg1ZCwgMHhmOSwgMHhjMiwgMHhhYywgMHgyNywgMHgxNCwgMHg2NSwgMHg0ZiwKKyAgICAgICAgICAgICAgICAweGJkLCAweDU2LCAweDY3LCAweGM1LCAweDFhLCAweGU2LCAweGI0LCAweDk1LCAweDFhLCAweDczLCAweDFmLCAweDQ0LCAweDRkLCAweGMxLCAweDk2LCAweGJhLAorICAgICAgICAgICAgICAgIDB4ZWYsIDB4NTksIDB4MmQsIDB4MDUsIDB4N2MsIDB4ZGEsIDB4YmMsIDB4M2QsIDB4NGQsIDB4MzQsIDB4NWQsIDB4MmYsIDB4ZmIsIDB4YTMsIDB4OWUsIDB4ZTksCisgICAgICAgICAgICAgICAgMHhhOCwgMHg3NiwgMHg4NiwgMHgwNSwgMHhiZCwgMHhhMiwgMHhkYywgMHhjYSwgMHg4MywgMHgwMSwgMHhmNSwgMHhiNywgMHg2ZiwgMHg1MCwgMHhmOSwgMHhhNywKKyAgICAgICAgICAgICAgICAweGJlLCAweGMxLCAweGUxLCAweGI0LCAweDI0LCAweDFlLCAweDQyLCAweGRkLCAweGIyLCAweGMyLCAweDM1LCAweDEyLCAweGI0LCAweGFiLCAweDYwLCAweDIwLAorICAgICAgICAgICAgICAgIDB4OWUsIDB4MTAsIDB4MjIsIDB4OTgsIDB4YzYsIDB4ZGYsIDB4ODcsIDB4Y2IsIDB4ZDgsIDB4OWIsIDB4YWIsIDB4YWUsIDB4OWQsIDB4ZDksIDB4YTgsIDB4NjMsCisgICAgICAgICAgICAgICAgMHg1MSwgMHgyOSwgMHgxNywgMHhkYiwgMHgyOCwgMHhlNSwgMHg4OSwgMHhjOSwgMHg5ZiwgMHgzZCwgMHg4YiwgMHhiZSwgMHg0ZiwgMHg1NCwgMHhmMiwgMHhmMCwKKyAgICAgICAgICAgICAgICAweGZkLCAweGE1LCAweDYxLCAweGE3LCAweDA2LCAweDY5LCAweGU0LCAweDM3LCAweDEyLCAweDg2LCAweDVhLCAweDM3LCAweDNhLCAweDFmLCAweDA0LCAweGIxLAorICAgICAgICAgICAgICAgIDB4MmUsIDB4YTMsIDB4OGIsIDB4MDMsIDB4NWYsIDB4ZmEsIDB4YzEsIDB4ZGQsIDB4NGMsIDB4ZjgsIDB4NjQsIDB4YTcsIDB4OWUsIDB4YjYsIDB4NDUsIDB4NmEsCisgICAgICAgICAgICAgICAgMHg5MywgMHhiMiwgMHhjMCwgMHgwZiwgMHg2MCwgMHgzMSwgMHgxZCwgMHhlNywgMHhmNSwgMHhmNiwgMHgyZCwgMHgzOCwgMHhmNiwgMHg3MiwgMHhlNSwgMHhjZiwKKyAgICAgICAgICAgICAgICAweDJkLCAweGU3LCAweDQ0LCAweDk2LCAweDc0LCAweDE5LCAweGQ5LCAweDcwLCAweDllLCAweDc2LCAweDdiLCAweDc0LCAweDhhLCAweDhiLCAweDVhLCAweDg4LAorICAgICAgICAgICAgICAgIDB4ZjEsIDB4ODUsIDB4YzMsIDB4ODcsIDB4ODcsIDB4MjcsIDB4MGUsIDB4MjQsIDB4MDMsIDB4MDksIDB4MTUsIDB4MzAsIDB4OGMsIDB4MTUsIDB4MDksIDB4NWYsCisgICAgICAgICAgICAgICAgMHg4MCwgMHg0ZiwgMHhkYiwgMHhhNywgMHg5MywgMHg2YywgMHg4YiwgMHgyNiwgMHhiYSwgMHg2ZSwgMHhjNiwgMHhiYSwgMHhmOCwgMHg2OCwgMHgyYiwgMHhlNiwKKyAgICAgICAgICAgICAgICAweDUyLCAweDM0LCAweDAwLCAweDQwLCAweDllLCAweGUyLCAweDMzLCAweGRmLCAweGI2LCAweGQyLCAweGFjLCAweDI0LCAweDAyLCAweDcyLCAweDNiLCAweGM2LAorICAgICAgICAgICAgICAgIDB4YmMsIDB4ZWIsIDB4ZjgsIDB4MmMsIDB4OTUsIDB4MDcsIDB4NjUsIDB4NzYsIDB4ZGEsIDB4ZDksIDB4MGMsIDB4MDIsIDB4NzIsIDB4YTgsIDB4ZGIsIDB4MTYsCisgICAgICAgICAgICAgICAgMHgxMiwgMHg1YSwgMHhiMSwgMHg1MSwgMHg3MywgMHg1ZCwgMHg3NiwgMHgzNywgMHhkOCwgMHhkYiwgMHg2MCwgMHg0ZiwgMHhhMiwgMHg4ZSwgMHg5MCwgMHg5NiwKKyAgICAgICAgICAgICAgICAweGU0LCAweDc4LCAweDk2LCAweGNiLCAweDY3LCAweGQyLCAweDMyLCAweGNhLCAweGY3LCAweDJmLCAweDY2LCAweGJmLCAweDgyLCAweDBmLCAweDJhLCAweDE3LAorICAgICAgICAgICAgICAgIDB4NjgsIDB4YjMsIDB4OTUsIDB4MzgsIDB4NGMsIDB4MDgsIDB4ODYsIDB4MDAsIDB4YjQsIDB4NjYsIDB4YTAsIDB4MjAsIDB4YTQsIDB4MDIsIDB4OTcsIDB4NzEsCisgICAgICAgICAgICAgICAgMHg4YywgMHg1OSwgMHgwNCwgMHhlOSwgMHg5OCwgMHhiYSwgMHgwOCwgMHhmMiwgMHhkOSwgMHhjZiwgMHhhZiwgMHg3MywgMHgyZSwgMHg4OCwgMHhiMSwgMHg2OCwKKyAgICAgICAgICAgICAgICAweDMwLCAweDA2LCAweGRkLCAweDA1LCAweGY0LCAweDFmLCAweDU1LCAweDEzLCAweDA0LCAweGU2LCAweGIxLCAweDQwLCAweDFmLCAweGNmLCAweDQ2LCAweDgzLAorICAgICAgICAgICAgICAgIDB4MjYsIDB4OTYsIDB4OGYsIDB4NDEsIDB4MjAsIDB4ZWMsIDB4MWMsIDB4MDAsIDB4NzgsIDB4MWQsIDB4YjQsIDB4OGMsIDB4MjUsIDB4YjMsIDB4ZTQsIDB4MmYsCisgICAgICAgICAgICAgICAgMHg5NCwgMHgyZiwgMHhmZSwgMHg5OCwgMHg5MiwgMHgzYSwgMHgxMiwgMHhhZiwgMHgzNCwgMHgzNywgMHhlZSwgMHhhYSwgMHg1MSwgMHg2MCwgMHg2ZSwgMHg5YywKKyAgICAgICAgICAgICAgICAweDBhLCAweDFmLCAweGE5LCAweDM4LCAweDAwLCAweDAxLCAweDE3LCAweGRkLCAweDRjLCAweDYwLCAweGJmLCAweDBkLCAweDA4LCAweDZmLCAweGQzLCAweGNmLAorICAgICAgICAgICAgICAgIDB4NGEsIDB4MjMsIDB4ODEsIDB4NWYsIDB4M2IsIDB4Y2EsIDB4NjYsIDB4NGYsIDB4ZjEsIDB4ZjgsIDB4MTUsIDB4NTEsIDB4ZjcsIDB4ZTEsIDB4NmQsIDB4OWYsCisgICAgICAgICAgICAgICAgMHg1NSwgMHhkMywgMHhkOCwgMHhiMiwgMHhiMywgMHg5NCwgMHg2NywgMHhhMSwgMHgyNCwgMHhkYSwgMHhmZSwgMHg2MCwgMHhlOSwgMHg3MywgMHhmNiwgMHg5MywKKyAgICAgICAgICAgICAgICAweDQ5LCAweDIyLCAweDUxLCAweDRhLCAweGFmLCAweDQ3LCAweDc3LCAweGZhLCAweGNlLCAweDAzLCAweDY5LCAweGIxLCAweDY1LCAweDhjLCAweGNlLCAweDQ4LAorICAgICAgICAgICAgICAgIDB4NjIsIDB4Y2MsIDB4ODgsIDB4NjEsIDB4ZmIsIDB4MDcsIDB4Y2MsIDB4ZGIsIDB4NGQsIDB4MDEsIDB4OWQsIDB4MjEsIDB4NjUsIDB4MzMsIDB4MWEsIDB4NzIsCisgICAgICAgICAgICAgICAgMHg5MywgMHg2NywgMHg5MCwgMHhmZiwgMHg0NSwgMHhhMSwgMHg1MCwgMHgzMywgMHg3NCwgMHhhZiwgMHg2MiwgMHhmMywgMHg2MSwgMHhjZiwgMHhkYiwgMHg3YSwKKyAgICAgICAgICAgICAgICAweGQ1LCAweDc4LCAweGNlLCAweDU2LCAweGJmLCAweGVlLCAweGQ2LCAweDZiLCAweDAzLCAweGQyLCAweDdkLCAweDY5LCAweGNkLCAweDg5LCAweDgxLCAweGIxLAorICAgICAgICAgICAgICAgIDB4YzEsIDB4YjIsIDB4MjEsIDB4ZjUsIDB4ZDgsIDB4Y2YsIDB4MTUsIDB4NzksIDB4ZmIsIDB4YmQsIDB4NTYsIDB4ZjYsIDB4MDYsIDB4OTAsIDB4YTEsIDB4OTgsCisgICAgICAgICAgICAgICAgMHhjMSwgMHg2YSwgMHhiOCwgMHg3MCwgMHhhNywgMHhlZSwgMHhiYywgMHgwMiwgMHhlMywgMHg4YSwgMHhkYSwgMHhhYywgMHgxZiwgMHgyYiwgMHg0MiwgMHhhOCwKKyAgICAgICAgICAgICAgICAweGM0LCAweDM5LCAweGNjLCAweGE4LCAweDJkLCAweDZkLCAweDYyLCAweDViLCAweGE3LCAweDU1LCAweDgzLCAweDRhLCAweDdmLCAweDFjLCAweGJkLCAweDE2LAorICAgICAgICAgICAgICAgIDB4ZWMsIDB4OWMsIDB4MDMsIDB4NGQsIDB4ZmIsIDB4NjMsIDB4MzMsIDB4OTAsIDB4YWIsIDB4NjUsIDB4MmQsIDB4YTgsIDB4N2MsIDB4NTUsIDB4OGIsIDB4YzgsCisgICAgICAgICAgICAgICAgMHg4OSwgMHg5NywgMHg5NywgMHg4YSwgMHgzMywgMHgyNiwgMHgwMywgMHhlMiwgMHg5NywgMHg0MiwgMHg4NywgMHhmNSwgMHhjOSwgMHg2ZCwgMHhhZSwgMHgwMCwKKyAgICAgICAgICAgICAgICAweDAwLCAweDEwLCAweGM0LCAweGM0LCAweDZiLCAweGZkLCAweGNkLCAweGI3LCAweDU4LCAweDAwLCAweGVlLCAweGNhLCAweDUxLCAweDNkLCAweDZkLCAweDA0LAorICAgICAgICAgICAgICAgIDB4YjAsIDB4N2QsIDB4MzYsIDB4MmYsIDB4NTQsIDB4ZjIsIDB4YTYsIDB4ZDUsIDB4MzUsIDB4ZjksIDB4YTQsIDB4MjgsIDB4NTYsIDB4ZmQsIDB4MDgsIDB4YzYsCisgICAgICAgICAgICAgICAgMHg3YiwgMHhkOCwgMHgwZSwgMHgzOCwgMHgyOCwgMHhkMiwgMHg2NywgMHg2NiwgMHg1MSwgMHgzMCwgMHgwNiwgMHg0ZiwgMHg1MSwgMHhjYywgMHhhMywgMHg0NiwKKyAgICAgICAgICAgICAgICAweDhlLCAweGNiLCAweDk1LCAweGVlLCAweDQ4LCAweDJmLCAweGFjLCAweGQwLCAweDMxLCAweDViLCAweGJlLCAweGIxLCAweGYwLCAweGYxLCAweDc4LCAweDEzLAorICAgICAgICAgICAgICAgIDB4ZDIsIDB4MmMsIDB4MTYsIDB4NDgsIDB4MTgsIDB4NTksIDB4ZTQsIDB4ZWUsIDB4NDAsIDB4N2EsIDB4NGQsIDB4OWIsIDB4MTAsIDB4NjgsIDB4MGMsIDB4ODksCisgICAgICAgICAgICAgICAgMHhjNSwgMHgwYywgMHhmYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHg0MywgMHhmZiwgMHhmZiwgMHhmZCwgMHhiYywgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgICAgICAgICAweDAxLCAweDQxLCAweDRkLCAweDRjLCAweDU2LCAweDg2LCAweDAwLCAweDQwLCAweDkyLCAweGUxLCAweDgxLCAweDU2LCAweDAwLCAweDAwLCAweDE4LCAweDcwLAorICAgICAgICAgICAgICAgIDB4NWEsIDB4OWEsIDB4NzQsIDB4MDAsIDB4MDAsIDB4N2YsIDB4ZTgsIDB4MmIsIDB4ZmMsIDB4MGMsIDB4MjksIDB4NzEsIDB4NGQsIDB4MTcsIDB4MTcsIDB4ZTcsCisgICAgICAgICAgICAgICAgMHhkOSwgMHg0NSwgMHgxNiwgMHg2OSwgMHg4OSwgMHg2YiwgMHg2OCwgMHg3MywgMHhmZSwgMHgzYSwgMHhlOSwgMHgwOCwgMHg5NiwgMHhlMiwgMHgwZiwgMHhjNSwKKyAgICAgICAgICAgICAgICAweDVkLCAweDhjLCAweGIxLCAweDc3LCAweGVjLCAweDY0LCAweDllLCAweGNlLCAweDAzLCAweDI2LCAweDU5LCAweGVlLCAweDM3LCAweGU4LCAweGMxLCAweDJhLAorICAgICAgICAgICAgICAgIDB4MmEsIDB4ZGMsIDB4ZmEsIDB4YTEsIDB4YjIsIDB4NWEsIDB4NGIsIDB4NTksIDB4ZGUsIDB4YTYsIDB4OTEsIDB4ZDEsIDB4NjMsIDB4YTAsIDB4YTEsIDB4ODEsCisgICAgICAgICAgICAgICAgMHhiMSwgMHg4ZCwgMHhhYiwgMHgzOCwgMHhiMCwgMHhhNSwgMHg0NSwgMHhjZiwgMHg0MSwgMHhlNSwgMHg2YywgMHg1NCwgMHgxMywgMHhhYywgMHg4NSwgMHg3MiwKKyAgICAgICAgICAgICAgICAweGQzLCAweDdhLCAweDBjLCAweDdkLCAweDQ3LCAweGQwLCAweGU1LCAweDZjLCAweGQ1LCAweDgxLCAweGI3LCAweGY2LCAweDhlLCAweDUzLCAweDgxLCAweDQyLAorICAgICAgICAgICAgICAgIDB4OWUsIDB4NzQsIDB4YjAsIDB4M2IsIDB4MWMsIDB4N2QsIDB4YmMsIDB4MDQsIDB4ZmUsIDB4MTUsIDB4YzYsIDB4MDAsIDB4MDEsIDB4OWMsIDB4MDUsIDB4OTcsCisgICAgICAgICAgICAgICAgMHg0NCwgMHgwZSwgMHhkNiwgMHhmMCwgMHg4NSwgMHgwZiwgMHgyOCwgMHg1YiwgMHg0ZCwgMHg0YiwgMHg2NywgMHgwNywgMHgyNSwgMHgxNiwgMHhmZSwgMHg1OSwKKyAgICAgICAgICAgICAgICAweDY5LCAweGUyLCAweDI4LCAweDQyLCAweGM2LCAweGQwLCAweGI0LCAweDJjLCAweDRlLCAweGNmLCAweDc4LCAweDhjLCAweDljLCAweDg1LCAweDAyLCAweDA5LAorICAgICAgICAgICAgICAgIDB4YTMsIDB4NTMsIDB4NTMsIDB4ZWQsIDB4MGEsIDB4NTIsIDB4YTcsIDB4MDAsIDB4NDgsIDB4NDYsIDB4MTIsIDB4MGYsIDB4MTcsIDB4N2MsIDB4NmQsIDB4OTksCisgICAgICAgICAgICAgICAgMHgwZiwgMHgwNiwgMHgxNCwgMHhhYywgMHg2OCwgMHhhNCwgMHgwOSwgMHgwMSwgMHgxZCwgMHg5NywgMHg3ZCwgMHgyYiwgMHg4MSwgMHhjMiwgMHgwMiwgMHhhZCwKKyAgICAgICAgICAgICAgICAweDZlLCAweDEwLCAweDgyLCAweGVkLCAweDNjLCAweDUxLCAweGFlLCAweDIzLCAweGM2LCAweGZiLCAweDc3LCAweDU0LCAweDQyLCAweDdkLCAweDQ2LCAweDdlLAorICAgICAgICAgICAgICAgIDB4NzEsIDB4ZmEsIDB4YTksIDB4NjMsIDB4ZGEsIDB4OGIsIDB4NGIsIDB4YzcsIDB4ODUsIDB4NjEsIDB4OWEsIDB4NWUsIDB4MDgsIDB4YWIsIDB4NzQsIDB4MjcsCisgICAgICAgICAgICAgICAgMHgzNSwgMHg2MywgMHgyMSwgMHgxOSwgMHgwOSwgMHhmNCwgMHhhMywgMHg0MCwgMHgxOSwgMHgxYSwgMHhiZCwgMHg4NywgMHgwMCwgMHg5OSwgMHhkNywgMHhkNywKKyAgICAgICAgICAgICAgICAweGRhLCAweGNmLCAweDAxLCAweGRmLCAweGMyLCAweDliLCAweDM1LCAweGQ4LCAweDg5LCAweDU4LCAweGRiLCAweGY1LCAweDBjLCAweGZiLCAweDY3LCAweGIxLAorICAgICAgICAgICAgICAgIDB4NTQsIDB4NmYsIDB4MTYsIDB4YzIsIDB4ZWQsIDB4MjAsIDB4MmQsIDB4NjcsIDB4YmIsIDB4YjcsIDB4YjUsIDB4MGIsIDB4YjcsIDB4ZGUsIDB4MmMsIDB4ZmEsCisgICAgICAgICAgICAgICAgMHhhOSwgMHhlNSwgMHgwZiwgMHhmMSwgMHgxMCwgMHgwZSwgMHg4MCwgMHg3ZiwgMHgyZCwgMHgyNSwgMHg3OSwgMHgzYSwgMHhkMiwgMHg4MCwgMHgyMywgMHgwNywKKyAgICAgICAgICAgICAgICAweDg1LCAweGMyLCAweDgwLCAweDRmLCAweDRmLCAweDk5LCAweDZlLCAweGY1LCAweGQ0LCAweDRkLCAweDlhLCAweDIzLCAweDYxLCAweGE5LCAweGU3LCAweDZjLAorICAgICAgICAgICAgICAgIDB4OGUsIDB4M2QsIDB4YzEsIDB4MzQsIDB4N2QsIDB4YmMsIDB4NDcsIDB4ZWEsIDB4N2QsIDB4MzYsIDB4OWQsIDB4OTIsIDB4N2YsIDB4ZTgsIDB4MTAsIDB4ZjAsCisgICAgICAgICAgICAgICAgMHg2YiwgMHg2MywgMHg3MiwgMHhlZSwgMHhlNywgMHg0NiwgMHgzNSwgMHhhNiwgMHhmYywgMHhlYiwgMHgzMiwgMHgyNywgMHhiZSwgMHg4ZSwgMHgxMywgMHg1OCwKKyAgICAgICAgICAgICAgICAweDZlLCAweGE5LCAweGUxLCAweDcxLCAweDlmLCAweDFhLCAweGY1LCAweGIxLCAweDVlLCAweDNlLCAweDA4LCAweGRiLCAweGI4LCAweDYxLCAweGVmLCAweGRkLAorICAgICAgICAgICAgICAgIDB4YmIsIDB4NWMsIDB4MWIsIDB4NjEsIDB4ZTAsIDB4MTIsIDB4YjYsIDB4ZWEsIDB4ZmUsIDB4ZmUsIDB4NzUsIDB4YWUsIDB4NzEsIDB4NGYsIDB4NzEsIDB4OTcsCisgICAgICAgICAgICAgICAgMHgzZSwgMHgwNCwgMHgwMiwgMHgyZSwgMHg3YSwgMHhmZCwgMHhiZiwgMHgyZCwgMHgzNiwgMHhkNSwgMHg0NSwgMHg1NywgMHg4MCwgMHhkMCwgMHhlNiwgMHhjOCwKKyAgICAgICAgICAgICAgICAweDM2LCAweDYzLCAweDIyLCAweGRhLCAweDg5LCAweGM1LCAweDkwLCAweGIzLCAweDQ0LCAweGZmLCAweDc1LCAweDRmLCAweDI1LCAweGE3LCAweGMxLCAweGE5LAorICAgICAgICAgICAgICAgIDB4MGEsIDB4ZTYsIDB4MGIsIDB4M2QsIDB4N2MsIDB4OTAsIDB4ZmEsIDB4NTksIDB4MTEsIDB4N2IsIDB4ZDEsIDB4YmIsIDB4YTAsIDB4MWUsIDB4MzgsIDB4N2UsCisgICAgICAgICAgICAgICAgMHhkZCwgMHhkMiwgMHg5YSwgMHhhNSwgMHhmYiwgMHg1OSwgMHg2MywgMHgyYSwgMHgzNywgMHhjNiwgMHgwNiwgMHg3MCwgMHg1NCwgMHg5ZSwgMHg4MywgMHgzNSwKKyAgICAgICAgICAgICAgICAweGM1LCAweGZiLCAweGE0LCAweDdmLCAweGE0LCAweGI3LCAweDQ4LCAweGYzLCAweDE2LCAweGUxLCAweDRjLCAweGM2LCAweDY2LCAweDlmLCAweDhkLCAweGI0LAorICAgICAgICAgICAgICAgIDB4M2EsIDB4YjIsIDB4OGIsIDB4YjIsIDB4OWEsIDB4ODgsIDB4MmYsIDB4YjcsIDB4NTcsIDB4ZDMsIDB4OTEsIDB4ZDEsIDB4OTQsIDB4MWYsIDB4ZmIsIDB4ODUsCisgICAgICAgICAgICAgICAgMHgwZCwgMHg4NiwgMHgzOSwgMHg2NSwgMHhjZCwgMHhmYSwgMHhhMywgMHgyNSwgMHgzMiwgMHg1NCwgMHg4MSwgMHhkZiwgMHgxZSwgMHgzYywgMHhjZiwgMHg5ZSwKKyAgICAgICAgICAgICAgICAweGU4LCAweDc0LCAweGIxLCAweDk0LCAweGRmLCAweGFlLCAweDAxLCAweDEwLCAweDUyLCAweDQzLCAweGE0LCAweDJjLCAweGU3LCAweGRkLCAweDdmLCAweDgyLAorICAgICAgICAgICAgICAgIDB4MTgsIDB4YmYsIDB4YzMsIDB4OGMsIDB4YjgsIDB4ZjIsIDB4YWIsIDB4MTYsIDB4ZTgsIDB4ZTksIDB4YzUsIDB4MWQsIDB4ZTIsIDB4YzEsIDB4NTgsIDB4ZGMsCisgICAgICAgICAgICAgICAgMHg5MywgMHg0ZSwgMHgyZSwgMHgxOSwgMHhjNSwgMHg4MywgMHgwZiwgMHhmNywgMHgyNSwgMHgyOCwgMHg3MCwgMHgxYiwgMHg3MCwgMHhjYSwgMHg1MywgMHg4NiwKKyAgICAgICAgICAgICAgICAweGVkLCAweDU5LCAweDk2LCAweGYwLCAweDA0LCAweGJhLCAweDQ3LCAweDI2LCAweGU4LCAweGFlLCAweDVhLCAweGE4LCAweGM4LCAweDZiLCAweDRhLCAweGU0LAorICAgICAgICAgICAgICAgIDB4NDYsIDB4YWYsIDB4NTEsIDB4ZjUsIDB4MmYsIDB4YjksIDB4MDMsIDB4YzUsIDB4ZGIsIDB4ODUsIDB4MjgsIDB4NGYsIDB4YTIsIDB4YTksIDB4NWMsIDB4YzQsCisgICAgICAgICAgICAgICAgMHg0ZCwgMHhjNywgMHg1OCwgMHhjZSwgMHg2ZiwgMHhjOSwgMHhhOSwgMHgyMSwgMHgwNCwgMHg1NywgMHg5MSwgMHg2MSwgMHg3ZiwgMHg2YiwgMHhiNSwgMHg2MSwKKyAgICAgICAgICAgICAgICAweDM2LCAweGQ3LCAweDkwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDEzLCAweGZmLCAweGZmLCAweGZjLCAweGVjLCAweDAwLCAweDAwLCAweDAwLCAweDAxLAorICAgICAgICAgICAgICAgIDB4NDEsIDB4NGQsIDB4NGMsIDB4NTYsIDB4ODYsIDB4MDAsIDB4NDAsIDB4OTIsIDB4ZTEsIDB4ODEsIDB4NTYsIDB4MDAsIDB4MDAsIDB4MTQsIDB4NzAsIDB4MTIsCisgICAgICAgICAgICAgICAgMHgyMCwgMHgwMCwgMHgwMCwgMHg3ZiwgMHhkYiwgMHhmNCwgMHg4MCwgMHg1OCwgMHhhZiwgMHg2MCwgMHg5ZiwgMHgwMywgMHgyNywgMHg1MCwgMHhlMiwgMHg4OSwKKyAgICAgICAgICAgICAgICAweDYyLCAweDExLCAweGE1LCAweDVhLCAweDIxLCAweDUxLCAweDRmLCAweGRiLCAweDhjLCAweDk1LCAweDRmLCAweGZkLCAweGVjLCAweDM3LCAweGQzLCAweDNiLAorICAgICAgICAgICAgICAgIDB4NmUsIDB4NzMsIDB4MTUsIDB4NjAsIDB4NmUsIDB4ZmEsIDB4NjYsIDB4Y2QsIDB4NjEsIDB4ZmYsIDB4YjMsIDB4YzcsIDB4M2QsIDB4MGUsIDB4ZDUsIDB4NjEsCisgICAgICAgICAgICAgICAgMHgzZSwgMHhlMSwgMHg1YiwgMHgwMywgMHg3ZiwgMHgwOCwgMHhiNywgMHg2NiwgMHg2YiwgMHg1NywgMHhhYiwgMHg3NywgMHgwYywgMHg4NCwgMHhlZCwgMHhjNywKKyAgICAgICAgICAgICAgICAweDgxLCAweGZlLCAweDIwLCAweDgwLCAweDFmLCAweDExLCAweGYyLCAweDAyLCAweDhkLCAweDVjLCAweDkxLCAweDVjLCAweGViLCAweDYxLCAweDQ2LCAweGU2LAorICAgICAgICAgICAgICAgIDB4MDYsIDB4MmQsIDB4OTAsIDB4NDMsIDB4NzYsIDB4Y2EsIDB4NGIsIDB4MDEsIDB4OGYsIDB4MDIsIDB4MDEsIDB4NDEsIDB4MDcsIDB4OWEsIDB4ZWUsIDB4OTcsCisgICAgICAgICAgICAgICAgMHg5OSwgMHg4OCwgMHg1ZCwgMHhhMiwgMHhiZiwgMHg5MywgMHgwMiwgMHg4YSwgMHgwMiwgMHg4YSwgMHg2MSwgMHgwOCwgMHg0ZiwgMHhiYywgMHhjNCwgMHg3ZSwKKyAgICAgICAgICAgICAgICAweDQwLCAweDE1LCAweDhlLCAweGFhLCAweDE0LCAweDdlLCAweGJlLCAweGRiLCAweDg2LCAweDE4LCAweGYxLCAweGNjLCAweGQ4LCAweDU2LCAweDUwLCAweGU1LAorICAgICAgICAgICAgICAgIDB4MTQsIDB4YTAsIDB4MmMsIDB4NmIsIDB4MDYsIDB4MzAsIDB4YzQsIDB4OWYsIDB4NDUsIDB4ZTAsIDB4OGIsIDB4MzMsIDB4MTgsIDB4ZTIsIDB4NDcsIDB4MTIsCisgICAgICAgICAgICAgICAgMHg1YSwgMHgyMiwgMHhiNCwgMHg2OCwgMHgzMywgMHg4YSwgMHhlNiwgMHg3NSwgMHg0MSwgMHg1YSwgMHhjZiwgMHgwZiwgMHhjOCwgMHhlZCwgMHhhNywgMHg0ZSwKKyAgICAgICAgICAgICAgICAweDkwLCAweGQwLCAweDM4LCAweGU4LCAweDUxLCAweDE0LCAweDM3LCAweDljLCAweDhlLCAweDk2LCAweGUwLCAweDIyLCAweDBhLCAweGY4LCAweGFiLCAweDYzLAorICAgICAgICAgICAgICAgIDB4NjcsIDB4YWEsIDB4OTYsIDB4NDcsIDB4NTUsIDB4YmQsIDB4ODYsIDB4MzMsIDB4MGYsIDB4NTcsIDB4MDcsIDB4M2IsIDB4YWUsIDB4NDIsIDB4NDQsIDB4ODQsCisgICAgICAgICAgICAgICAgMHg1OSwgMHgzNiwgMHgzMywgMHg0ZiwgMHg0MSwgMHhjNywgMHg4OSwgMHgzNSwgMHg4MSwgMHhiYSwgMHg1OCwgMHhjNCwgMHhkMywgMHg5NywgMHg5YiwgMHhlNiwKKyAgICAgICAgICAgICAgICAweDQ4LCAweDkyLCAweGYzLCAweDVmLCAweGY5LCAweGUzLCAweGQ1LCAweGE0LCAweGZkLCAweDM1LCAweDQ3LCAweDljLCAweGRkLCAweDY4LCAweGNhLCAweGJkLAorICAgICAgICAgICAgICAgIDB4NTksIDB4MzYsIDB4ZDUsIDB4NDAsIDB4NjUsIDB4ZDcsIDB4ZmEsIDB4MTksIDB4NmEsIDB4Y2MsIDB4MTcsIDB4YzAsIDB4MTEsIDB4MmMsIDB4NzIsIDB4NjksCisgICAgICAgICAgICAgICAgMHgwYSwgMHg3YSwgMHgwZiwgMHgyNywgMHgyMSwgMHgyMSwgMHhjYSwgMHhjNywgMHg3ZiwgMHg1OSwgMHgyNywgMHgyMSwgMHg4NywgMHg2NCwgMHg4ZCwgMHhjNCwKKyAgICAgICAgICAgICAgICAweGZkLCAweDNiLCAweDEyLCAweGZhLCAweDk2LCAweGJlLCAweDY2LCAweGQ5LCAweDRhLCAweGY4LCAweGEzLCAweGQ0LCAweDMyLCAweDQ3LCAweDgxLCAweDcwLAorICAgICAgICAgICAgICAgIDB4ZTEsIDB4NmMsIDB4OTksIDB4ZTQsIDB4ZWMsIDB4YWMsIDB4MmMsIDB4YzUsIDB4YjgsIDB4N2UsIDB4MmEsIDB4NjEsIDB4MzEsIDB4MWIsIDB4NWUsIDB4ZmIsCisgICAgICAgICAgICAgICAgMHg0NCwgMHhiYywgMHhhYiwgMHg0YywgMHg0MSwgMHgzMiwgMHhiMSwgMHhmYywgMHhmYSwgMHgzOSwgMHgwNCwgMHhhOSwgMHg0YSwgMHg0MCwgMHg1MCwgMHg3NCwKKyAgICAgICAgICAgICAgICAweGEzLCAweDZmLCAweDkwLCAweDFlLCAweDYwLCAweDcxLCAweGIwLCAweGZkLCAweDZlLCAweDUxLCAweDZiLCAweGVmLCAweGVhLCAweDJmLCAweGU3LCAweGJhLAorICAgICAgICAgICAgICAgIDB4MzAsIDB4YTYsIDB4ZTQsIDB4MjksIDB4OGIsIDB4MGIsIDB4YTIsIDB4ZTQsIDB4YmYsIDB4NTQsIDB4YzcsIDB4MzgsIDB4YmYsIDB4NTksIDB4YWIsIDB4MTksCisgICAgICAgICAgICAgICAgMHhmMiwgMHhlNCwgMHg5MiwgMHg4OCwgMHg5YywgMHgyMiwgMHg0YiwgMHgyMCwgMHg2OSwgMHg4MywgMHgxNywgMHhlZSwgMHg3YiwgMHgxMCwgMHgxOSwgMHg5MiwKKyAgICAgICAgICAgICAgICAweGNmLCAweDI0LCAweGQ0LCAweDAxLCAweGI1LCAweDM2LCAweDllLCAweDkzLCAweDk2LCAweGU5LCAweGU4LCAweDVkLCAweDc3LCAweDFhLCAweDI0LCAweDllLAorICAgICAgICAgICAgICAgIDB4NzksIDB4ZWYsIDB4M2UsIDB4NjMsIDB4ZTUsIDB4NTMsIDB4YTcsIDB4NTcsIDB4ZGQsIDB4YWIsIDB4MGUsIDB4NjIsIDB4YTIsIDB4OGUsIDB4YzcsIDB4YjQsCisgICAgICAgICAgICAgICAgMHhmYiwgMHhhYiwgMHhhMCwgMHg5YSwgMHhkZCwgMHhiOSwgMHhlMCwgMHgxYiwgMHg2NiwgMHgzYywgMHgxMiwgMHg5ZSwgMHhiMSwgMHg5ZiwgMHhmMCwgMHg1ZCwKKyAgICAgICAgICAgICAgICAweGUwLCAweDUzLCAweGQ0LCAweGIyLCAweGQzLCAweGViLCAweDZjLCAweDg2LCAweGVkLCAweGRjLCAweGU4LCAweGJiLCAweGE4LCAweGY5LCAweDkyLCAweDYzLAorICAgICAgICAgICAgICAgIDB4YjIsIDB4ZTcsIDB4ZDksIDB4NmUsIDB4N2IsIDB4MTcsIDB4MGUsIDB4N2UsIDB4NmIsIDB4ODQsIDB4NmYsIDB4N2QsIDB4M2MsIDB4MzcsIDB4ZTUsIDB4NTAsCisgICAgICAgICAgICAgICAgMHhlZiwgMHgxNiwgMHg4NywgMHhmNSwgMHhiMSwgMHg5MiwgMHg5YiwgMHg1OCwgMHgwMywgMHhlZiwgMHg5OSwgMHg2ZSwgMHgzYiwgMHg3OSwgMHgxNiwgMHhiMiwKKyAgICAgICAgICAgICAgICAweDZjLCAweDEwLCAweGIyLCAweGE5LCAweGNkLCAweDZiLCAweDBiLCAweDcxLCAweDIzLCAweDk1LCAweGE5LCAweGUzLCAweGE3LCAweDZlLCAweDM0LCAweDMxLAorICAgICAgICAgICAgICAgIDB4MjksIDB4ZWMsIDB4MGQsIDB4NzIsIDB4M2QsIDB4YTcsIDB4YjksIDB4MDEsIDB4ZDQsIDB4Y2IsIDB4YmIsIDB4MTEsIDB4ZGEsIDB4NzEsIDB4ZDEsIDB4YmUsCisgICAgICAgICAgICAgICAgMHhiZCwgMHgzZSwgMHg1MywgMHhlNiwgMHhmOCwgMHg4NywgMHgwZiwgMHgyZSwgMHg2MywgMHhmZSwgMHgyNCwgMHg0NiwgMHhhOSwgMHgxOSwgMHg5NCwgMHhmNSwKKyAgICAgICAgICAgICAgICAweDRhLCAweGRjLCAweDY1LCAweDYxLCAweDdiLCAweDhiLCAweGNlLCAweGY3LCAweDA3LCAweDNiLCAweDI1LCAweGEzLCAweDRjLCAweDVjLCAweDAxLCAweDg4LAorICAgICAgICAgICAgICAgIDB4ZDEsIDB4M2YsIDB4NWYsIDB4MjEsIDB4MzMsIDB4MjYsIDB4ZTksIDB4Y2QsIDB4ODcsIDB4YjksIDB4NjksIDB4ZWUsIDB4OGUsIDB4NDUsIDB4ZjEsIDB4MDMsCisgICAgICAgICAgICAgICAgMHg3ZCwgMHhiNSwgMHg3MywgMHg5NywgMHg2MiwgMHg5YSwgMHgzZSwgMHg4MCwgMHhmMSwgMHg4NCwgMHhkZCwgMHhlYSwgMHhhYSwgMHg4YiwgMHhmZCwgMHgzMCwKKyAgICAgICAgICAgICAgICAweDBlLCAweDRjLCAweGJiLCAweGZmLCAweGZhLCAweDc0LCAweDg2LCAweGU0LCAweDM1LCAweDlmLCAweDEyLCAweDA0LCAweDRmLCAweGY3LCAweDM3LCAweDE0LAorICAgICAgICAgICAgICAgIDB4MDUsIDB4ZWYsIDB4OWYsIDB4NTYsIDB4YmEsIDB4OWIsIDB4YjcsIDB4NzUsIDB4YjUsIDB4NjMsIDB4NmIsIDB4YTgsIDB4OGYsIDB4NzUsIDB4NjMsIDB4MDEsCisgICAgICAgICAgICAgICAgMHgxMCwgMHgxOSwgMHhiMCwgMHhlYSwgMHhmNywgMHhmNCwgMHg4ZiwgMHhjYiwgMHgyYywgMHgyMSwgMHgzNSwgMHgxOSwgMHgxNSwgMHg4ZCwgMHhlZiwgMHgxMCwKKyAgICAgICAgICAgICAgICAweDRhLCAweDYxLCAweGVjLCAweDA5LCAweGEzLCAweGUwLCAweGU1LCAweDhiLCAweDYwLCAweGExLCAweDA0LCAweGY1LCAweDExLCAweGU2LCAweGM2LCAweGJhLAorICAgICAgICAgICAgICAgIDB4NjYsIDB4NzUsIDB4YTcsIDB4ZTIsIDB4ZWQsIDB4NjAsIDB4N2YsIDB4NTMsIDB4YjQsIDB4YTcsIDB4MGEsIDB4ZWIsIDB4OTQsIDB4YTcsIDB4MzMsIDB4OTksCisgICAgICAgICAgICAgICAgMHgyMiwgMHgzNiwgMHhhNywgMHhjMSwgMHhlZiwgMHgwZCwgMHhmZSwgMHhkZSwgMHgwZCwgMHgzYywgMHhhNiwgMHg5ZSwgMHhlNywgMHg4OSwgMHg5NCwgMHhmZCwKKyAgICAgICAgICAgICAgICAweDJmLCAweDQwLCAweGJmLCAweDQ0LCAweDQyLCAweGMzLCAweDA1LCAweGNkLCAweDNjLCAweDhkLCAweDRiLCAweDcwLCAweGEyLCAweDBhLCAweDFmLCAweDY0LAorICAgICAgICAgICAgICAgIDB4N2MsIDB4NWUsIDB4MzQsIDB4YjIsIDB4NDksIDB4MmQsIDB4ZDIsIDB4M2MsIDB4YWMsIDB4NmEsIDB4Y2QsIDB4OGUsIDB4NGMsIDB4MWUsIDB4MjMsIDB4YzYsCisgICAgICAgICAgICAgICAgMHg3MSwgMHgxZCwgMHgxMCwgMHhjYiwgMHg2MSwgMHg5YiwgMHhlOCwgMHhjYiwgMHhjOCwgMHg0OCwgMHhiMiwgMHg3ZCwgMHhmNSwgMHgwZCwgMHhhNSwgMHg2ZiwKKyAgICAgICAgICAgICAgICAweDM3LCAweDJjLCAweDk4LCAweGE2LCAweDc4LCAweGEzLCAweDg3LCAweDM5LCAweGQ0LCAweDE5LCAweDRlLCAweDIyLCAweGI1LCAweDdjLCAweDA5LCAweGVkLAorICAgICAgICAgICAgICAgIDB4YmUsIDB4MDYsIDB4MzMsIDB4ODgsIDB4NTcsIDB4ZDgsIDB4MjMsIDB4MjUsIDB4YmIsIDB4YjQsIDB4YTAsIDB4ZjIsIDB4YmIsIDB4NzIsIDB4YTAsIDB4OTYsCisgICAgICAgICAgICAgICAgMHgyNSwgMHhiNywgMHhhMSwgMHg0NSwgMHgzNCwgMHg4YywgMHg4ZCwgMHg5ZCwgMHg1YywgMHg4ZiwgMHhiMSwgMHgxNCwgMHg4OCwgMHgxZCwgMHg1YywgMHhkZiwKKyAgICAgICAgICAgICAgICAweDdmLCAweGZiLCAweGEyLCAweGFlLCAweDljLCAweDNhLCAweDAyLCAweDkyLCAweGViLCAweDAxLCAweGY0LCAweDBhLCAweDU1LCAweDMyLCAweGIzLCAweGRiLAorICAgICAgICAgICAgICAgIDB4YWEsIDB4YjIsIDB4MDAsIDB4NDIsIDB4YjQsIDB4ZDcsIDB4OWIsIDB4NTUsIDB4NjQsIDB4MjYsIDB4MDcsIDB4ZTksIDB4MmMsIDB4NTUsIDB4ODgsIDB4ZDIsCisgICAgICAgICAgICAgICAgMHhlYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHg4MywgMHhmZiwgMHhmZiwgMHhmZCwgMHg3YywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg0MSwKKyAgICAgICAgICAgICAgICAweDRkLCAweDRjLCAweDU2LCAweDg2LCAweDAwLCAweDQwLCAweDkyLCAweGUxLCAweGExLCAweDU2LCAweDAwLCAweDAwLCAweDBjLCAweDcwLCAweDAwLCAweDAwLAorICAgICAgICAgICAgICAgIDB4N2IsIDB4ZmIsIDB4ZWEsIDB4NTksIDB4NjIsIDB4OGUsIDB4YWEsIDB4NWQsIDB4ODcsIDB4OTksIDB4OTIsIDB4YzEsIDB4ZjQsIDB4NWIsIDB4YjIsIDB4ZTcsCisgICAgICAgICAgICAgICAgMHg4NSwgMHgyYiwgMHhlNywgMHg1ZCwgMHg1OCwgMHg1NywgMHhlMSwgMHg0ZSwgMHhkOCwgMHhmNCwgMHhkMiwgMHgwMywgMHg1NCwgMHg1YSwgMHgyOCwgMHgxYSwKKyAgICAgICAgICAgICAgICAweDg3LCAweDVlLCAweDEwLCAweGJiLCAweDg4LCAweDg3LCAweDMzLCAweGJhLCAweDk2LCAweDFkLCAweDhiLCAweDQ0LCAweDQ0LCAweDI3LCAweDk3LCAweGFhLAorICAgICAgICAgICAgICAgIDB4MzQsIDB4ZTAsIDB4NGYsIDB4MjUsIDB4NzAsIDB4NzUsIDB4NDIsIDB4OGMsIDB4MDMsIDB4MzEsIDB4NjgsIDB4ZjQsIDB4ODEsIDB4YzMsIDB4YjcsIDB4NmYsCisgICAgICAgICAgICAgICAgMHg0OSwgMHhmNiwgMHg3NSwgMHhhMCwgMHg0NiwgMHgwYywgMHg2YiwgMHhiNywgMHg2MiwgMHg4MiwgMHhkYSwgMHhiNSwgMHhiZiwgMHg3YSwgMHhiNywgMHhkNiwKKyAgICAgICAgICAgICAgICAweDNiLCAweDc3LCAweDcxLCAweDQ0LCAweGZkLCAweGMyLCAweGFkLCAweDhkLCAweGZiLCAweGJhLCAweGFkLCAweGFiLCAweGQ4LCAweDVjLCAweDQ3LCAweDFlLAorICAgICAgICAgICAgICAgIDB4NjIsIDB4NGYsIDB4ZmMsIDB4OGIsIDB4MDIsIDB4ZTYsIDB4MWEsIDB4NjgsIDB4ODgsIDB4Y2MsIDB4MDcsIDB4YjEsIDB4NTYsIDB4YjgsIDB4OTcsIDB4YmEsCisgICAgICAgICAgICAgICAgMHhkOCwgMHg2NiwgMHg3ZSwgMHhmMSwgMHhjMCwgMHg5NywgMHgyMCwgMHhkZiwgMHgxZCwgMHgzZiwgMHhiYywgMHhmZiwgMHg1OSwgMHhkNSwgMHhjOCwgMHhkNiwKKyAgICAgICAgICAgICAgICAweGVjLCAweGZlLCAweGUxLCAweGQ4LCAweDA5LCAweDEwLCAweGM0LCAweDlkLCAweGJmLCAweDcwLCAweDZlLCAweGU4LCAweGViLCAweGEzLCAweGVmLCAweGVlLAorICAgICAgICAgICAgICAgIDB4ZjQsIDB4NDAsIDB4NzAsIDB4NzMsIDB4ZTAsIDB4MTYsIDB4OWMsIDB4MzEsIDB4M2QsIDB4ODYsIDB4YzgsIDB4MDgsIDB4MzcsIDB4MzAsIDB4NGMsIDB4ODAsCisgICAgICAgICAgICAgICAgMHhmNSwgMHg2ZCwgMHg1NywgMHg3NCwgMHhiOSwgMHhkNywgMHhkYSwgMHgxMSwgMHhhMiwgMHhkMSwgMHgxYywgMHhmOCwgMHgwNCwgMHhjMCwgMHhiYywgMHgyZSwKKyAgICAgICAgICAgICAgICAweDUxLCAweDBlLCAweGJiLCAweGU4LCAweDRiLCAweDRlLCAweGY4LCAweGMyLCAweGIxLCAweGE0LCAweDAwLCAweDkzLCAweGQxLCAweDNmLCAweGExLCAweDA0LAorICAgICAgICAgICAgICAgIDB4OTgsIDB4Y2MsIDB4MTIsIDB4YmYsIDB4NzIsIDB4YTMsIDB4MmQsIDB4MjcsIDB4MDIsIDB4MTcsIDB4MzYsIDB4YzksIDB4OTAsIDB4MjcsIDB4OTEsIDB4YjQsCisgICAgICAgICAgICAgICAgMHhlMCwgMHg0MCwgMHhlMCwgMHhkNCwgMHgxZCwgMHhkMSwgMHg2YiwgMHhjMCwgMHg1NSwgMHg5YSwgMHhjNiwgMHhkZiwgMHhlZCwgMHg3YywgMHgxMiwgMHhjNiwKKyAgICAgICAgICAgICAgICAweDNhLCAweGRhLCAweDY1LCAweGY4LCAweGQzLCAweDNiLCAweDE0LCAweDAyLCAweGM0LCAweDgwLCAweDllLCAweDljLCAweGVkLCAweDZjLCAweGVlLCAweDFmLAorICAgICAgICAgICAgICAgIDB4MDksIDB4OWIsIDB4MzIsIDB4NmIsIDB4ZDcsIDB4MDQsIDB4MDYsIDB4ZDQsIDB4ZWMsIDB4Y2MsIDB4ZjksIDB4ZjgsIDB4MDYsIDB4ZDcsIDB4ZjcsIDB4NWEsCisgICAgICAgICAgICAgICAgMHhmYSwgMHgyNCwgMHg3MiwgMHg4YiwgMHhkMywgMHhmYywgMHgyZCwgMHg5ZSwgMHhlYSwgMHg3YSwgMHhjMiwgMHg0YywgMHhmYywgMHhkMiwgMHhkMCwgMHgwZiwKKyAgICAgICAgICAgICAgICAweDQ5LCAweDVhLCAweDM0LCAweGYzLCAweDI1LCAweGRlLCAweGFhLCAweDk5LCAweGFkLCAweGJhLCAweDU1LCAweGNkLCAweGE5LCAweDVkLCAweDE1LCAweDg1LAorICAgICAgICAgICAgICAgIDB4YzEsIDB4M2YsIDB4NWEsIDB4N2MsIDB4MDAsIDB4ZTYsIDB4MjYsIDB4OWEsIDB4OTksIDB4YTUsIDB4YWQsIDB4OGYsIDB4ZTMsIDB4NmEsIDB4YmMsIDB4YjQsCisgICAgICAgICAgICAgICAgMHhhZSwgMHgyOCwgMHhhNiwgMHg5ZiwgMHg2NiwgMHhkMiwgMHg5MiwgMHhiOCwgMHg5YSwgMHgxNiwgMHg1NCwgMHg4YiwgMHg5ZSwgMHg1MCwgMHhkNiwgMHhkZSwKKyAgICAgICAgICAgICAgICAweGJkLCAweDYzLCAweDc1LCAweDVjLCAweDQ2LCAweDY5LCAweGUxLCAweDg0LCAweGE2LCAweDhhLCAweDc4LCAweDE4LCAweDlkLCAweGJjLCAweDNmLCAweGViLAorICAgICAgICAgICAgICAgIDB4ZTksIDB4OWYsIDB4ZTIsIDB4MjcsIDB4ZDgsIDB4MWQsIDB4OTksIDB4NmUsIDB4YzQsIDB4NTUsIDB4MmMsIDB4NDgsIDB4NTcsIDB4ODQsIDB4ZjAsIDB4ODYsCisgICAgICAgICAgICAgICAgMHg2YywgMHg2NSwgMHgwNSwgMHgzYywgMHhjYiwgMHg1NiwgMHgwZSwgMHg2OCwgMHhlZCwgMHg3MSwgMHg3MCwgMHg5OCwgMHg3NCwgMHg2ZCwgMHgyZiwgMHhmNywKKyAgICAgICAgICAgICAgICAweGNmLCAweDMwLCAweDJkLCAweDQ4LCAweDY1LCAweDlmLCAweDA2LCAweGNjLCAweDI0LCAweGU2LCAweDNhLCAweDNhLCAweDM2LCAweDhkLCAweGQwLCAweGNkLAorICAgICAgICAgICAgICAgIDB4MmMsIDB4ZDMsIDB4NjMsIDB4NTIsIDB4ODMsIDB4NTQsIDB4ZjIsIDB4ZTksIDB4N2IsIDB4ODksIDB4NjIsIDB4ZTUsIDB4M2EsIDB4M2YsIDB4NTQsIDB4YTQsCisgICAgICAgICAgICAgICAgMHgyZiwgMHgwOCwgMHhmZiwgMHhhZSwgMHgyMCwgMHhmMSwgMHhhZSwgMHhiNiwgMHhiMiwgMHhiMCwgMHg3YiwgMHhiYywgMHg1MCwgMHhkYSwgMHhkOSwgMHhiNywKKyAgICAgICAgICAgICAgICAweGVkLCAweDliLCAweGYwLCAweGM3LCAweGQyLCAweDlkLCAweGI5LCAweDI5LCAweDllLCAweDExLCAweDk5LCAweDRmLCAweGEwLCAweGNlLCAweDIxLCAweDQ3LAorICAgICAgICAgICAgICAgIDB4MmUsIDB4NzksIDB4NjAsIDB4MWMsIDB4MTcsIDB4NTQsIDB4YmQsIDB4NTQsIDB4YTQsIDB4NmYsIDB4Y2IsIDB4NzcsIDB4MzksIDB4OWIsIDB4MjAsIDB4YzUsCisgICAgICAgICAgICAgICAgMHg2YiwgMHg5MiwgMHhhZSwgMHg2ZCwgMHg4YiwgMHhjZSwgMHhiMiwgMHgxZiwgMHg3NSwgMHg3ZSwgMHg3YSwgMHg1NSwgMHg5ZiwgMHg0MiwgMHhhNCwgMHhiMSwKKyAgICAgICAgICAgICAgICAweDAyLCAweGYyLCAweGJjLCAweDVhLCAweDViLCAweDljLCAweGUyLCAweGYxLCAweDkxLCAweDkzLCAweDJmLCAweDQ4LCAweGViLCAweDQ2LCAweDljLCAweGExLAorICAgICAgICAgICAgICAgIDB4YTAsIDB4MjcsIDB4MzIsIDB4ZGUsIDB4YTMsIDB4MDAsIDB4ZmEsIDB4NmEsIDB4MWQsIDB4N2MsIDB4NTYsIDB4NDAsIDB4MzcsIDB4YTcsIDB4ZWMsIDB4MWQsCisgICAgICAgICAgICAgICAgMHhmZiwgMHgxMiwgMHg5YSwgMHhjNCwgMHhlOCwgMHhjZSwgMHhmYywgMHg1NywgMHhhZSwgMHhlYiwgMHgxNywgMHgwOSwgMHhlOSwgMHhhYiwgMHhiOCwgMHgzNywKKyAgICAgICAgICAgICAgICAweDYxLCAweDMwLCAweDZkLCAweGQ0LCAweGFkLCAweGEyLCAweDQ3LCAweGMxLCAweDk3LCAweGQ0LCAweGQ1LCAweDk0LCAweDFhLCAweDM5LCAweDNlLCAweDQ1LAorICAgICAgICAgICAgICAgIDB4NDMsIDB4NDcsIDB4OGEsIDB4NjcsIDB4ZjQsIDB4MTIsIDB4NWQsIDB4NTIsIDB4ZjEsIDB4YmYsIDB4NTMsIDB4NTUsIDB4NjksIDB4ODIsIDB4MGYsIDB4MGEsCisgICAgICAgICAgICAgICAgMHgwNSwgMHhhNSwgMHg3OSwgMHg1NywgMHhkNCwgMHhkNSwgMHgxMiwgMHgyNiwgMHg3ZSwgMHhhNSwgMHhlNiwgMHgzYywgMHhjMSwgMHgwOSwgMHgzMSwgMHgyOCwKKyAgICAgICAgICAgICAgICAweDNlLCAweDVjLCAweGVhLCAweDBlLCAweDk1LCAweGIzLCAweDIyLCAweGMwLCAweDBkLCAweDM3LCAweDNmLCAweDJiLCAweDE5LCAweGM0LCAweGUwLCAweGFiLAorICAgICAgICAgICAgICAgIDB4NjYsIDB4YzksIDB4NDAsIDB4MDIsIDB4NzcsIDB4NmUsIDB4OTksIDB4NjksIDB4ZGQsIDB4NzAsIDB4NjcsIDB4ODMsIDB4YzksIDB4MjgsIDB4ZTQsIDB4YjEsCisgICAgICAgICAgICAgICAgMHgyNCwgMHhmOSwgMHhiMywgMHg1YiwgMHg0MywgMHg1NCwgMHhhMCwgMHhhYywgMHg2ZiwgMHg5NywgMHg4ZSwgMHg1ZSwgMHgyMiwgMHg4MSwgMHg0YiwgMHhiOCwKKyAgICAgICAgICAgICAgICAweGNiLCAweDY4LCAweDNkLCAweGRhLCAweGExLCAweGRlLCAweGExLCAweDY3LCAweDJhLCAweDFiLCAweDc5LCAweGMxLCAweGRkLCAweDcwLCAweDVjLCAweDBhLAorICAgICAgICAgICAgICAgIDB4ZDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4ODMsIDB4ZmYsIDB4ZmYsIDB4ZmQsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NDEsIDB4NGQsCisgICAgICAgICAgICAgICAgMHg0YywgMHg1NiwgMHg4NiwgMHgwMCwgMHg0MCwgMHg5MiwgMHhlMSwgMHg5MSwgMHg1NiwgMHgwMCwgMHgwMCwgMHgwYywgMHg3MCwgMHgwMCwgMHgwMCwgMHg3ZiwKKyAgICAgICAgICAgICAgICAweGQzLCAweDE1LCAweDhhLCAweDhhLCAweGNkLCAweGIyLCAweGVlLCAweDc2LCAweDhiLCAweGUyLCAweDA0LCAweDIyLCAweGU5LCAweDc0LCAweGVlLCAweDFkLAorICAgICAgICAgICAgICAgIDB4NmUsIDB4N2YsIDB4YTEsIDB4N2YsIDB4MjcsIDB4NGUsIDB4YTgsIDB4MmMsIDB4OWEsIDB4YjksIDB4NTMsIDB4MDAsIDB4NjgsIDB4Y2MsIDB4ZjksIDB4YjMsCisgICAgICAgICAgICAgICAgMHhmOCwgMHhiNiwgMHhlYSwgMHhmYywgMHhlOSwgMHg3YiwgMHhhYywgMHgxZiwgMHg5NiwgMHg0ZSwgMHg0ZiwgMHhkYywgMHgxOCwgMHg3MCwgMHhmYywgMHgxNiwKKyAgICAgICAgICAgICAgICAweDY2LCAweDVkLCAweDc0LCAweDViLCAweGU2LCAweDVlLCAweDI4LCAweDc2LCAweGJlLCAweGI4LCAweGM4LCAweGFmLCAweDFkLCAweDlhLCAweGE0LCAweDU1LAorICAgICAgICAgICAgICAgIDB4MjYsIDB4NzEsIDB4ODAsIDB4ODgsIDB4NWYsIDB4MGMsIDB4YmQsIDB4ODgsIDB4ZDUsIDB4OGQsIDB4OTEsIDB4NTQsIDB4OGYsIDB4Y2IsIDB4ZWIsIDB4MjQsCisgICAgICAgICAgICAgICAgMHhiNCwgMHgzOSwgMHg5OSwgMHhhYSwgMHhmMiwgMHgwYSwgMHg5MCwgMHhlNCwgMHg0MSwgMHg2OSwgMHhlOCwgMHhmNCwgMHhjZSwgMHgyMSwgMHg2NywgMHhjYywKKyAgICAgICAgICAgICAgICAweGRmLCAweDg2LCAweDI5LCAweDQ3LCAweDI2LCAweGYwLCAweGYyLCAweDVhLCAweDgxLCAweDMyLCAweGU5LCAweGMzLCAweDg2LCAweDRkLCAweGM5LCAweGVmLAorICAgICAgICAgICAgICAgIDB4ZDYsIDB4NzcsIDB4NTEsIDB4Y2MsIDB4NmIsIDB4NzksIDB4NDUsIDB4OWMsIDB4ZGEsIDB4OTYsIDB4MDcsIDB4YTUsIDB4MGQsIDB4MDMsIDB4MDQsIDB4NDMsCisgICAgICAgICAgICAgICAgMHgwNywgMHg1NCwgMHg1NiwgMHhkZSwgMHhiMywgMHg2YSwgMHhmOSwgMHhiYiwgMHgzZiwgMHhmMywgMHhmMiwgMHg4YiwgMHhiOSwgMHgyZiwgMHg5OCwgMHg2OSwKKyAgICAgICAgICAgICAgICAweGM4LCAweGQzLCAweDUwLCAweDJjLCAweDNkLCAweGRkLCAweGFiLCAweDVjLCAweDhjLCAweDU2LCAweGM3LCAweDYxLCAweGFmLCAweGJkLCAweDU1LCAweGUxLAorICAgICAgICAgICAgICAgIDB4MmUsIDB4ZTIsIDB4NmYsIDB4MGYsIDB4NGIsIDB4MTAsIDB4MDcsIDB4YzEsIDB4MTMsIDB4MTQsIDB4ZDYsIDB4OGEsIDB4YWIsIDB4NmYsIDB4OWEsIDB4NTIsCisgICAgICAgICAgICAgICAgMHg2YSwgMHg0MSwgMHg5MSwgMHgzMCwgMHhmMywgMHg0NSwgMHhjZSwgMHg0NywgMHhmMCwgMHgxNiwgMHg5MCwgMHhiMywgMHgwNiwgMHhjNiwgMHhmNywgMHgyMywKKyAgICAgICAgICAgICAgICAweDljLCAweDYxLCAweGFkLCAweGM2LCAweDA3LCAweDVmLCAweGVmLCAweDY0LCAweDJmLCAweDczLCAweDQ3LCAweDRlLCAweGUxLCAweDIzLCAweGE3LCAweGY2LAorICAgICAgICAgICAgICAgIDB4YTgsIDB4M2EsIDB4NzksIDB4YTEsIDB4NWYsIDB4ZDUsIDB4NmUsIDB4ZGIsIDB4NDAsIDB4NmIsIDB4MjYsIDB4YjksIDB4N2UsIDB4MTUsIDB4YzEsIDB4ZjEsCisgICAgICAgICAgICAgICAgMHgxYiwgMHhlYiwgMHgzYywgMHgxMCwgMHhiZCwgMHg1MywgMHhhNiwgMHgyNywgMHhkZiwgMHhiOSwgMHg4YywgMHgwOSwgMHhkMiwgMHg4ZCwgMHgxZCwgMHg2NywKKyAgICAgICAgICAgICAgICAweGZkLCAweGZiLCAweGVlLCAweDVjLCAweDliLCAweDRiLCAweGM3LCAweDY4LCAweDA4LCAweDAyLCAweDVkLCAweDNkLCAweGYyLCAweGFiLCAweDhmLCAweGY5LAorICAgICAgICAgICAgICAgIDB4MzIsIDB4YWMsIDB4MmMsIDB4ODUsIDB4MTQsIDB4MTcsIDB4YWUsIDB4OTUsIDB4N2QsIDB4ZWEsIDB4OTIsIDB4ZjgsIDB4NDUsIDB4MjgsIDB4YTMsIDB4ODQsCisgICAgICAgICAgICAgICAgMHg5MywgMHg3YSwgMHhlMiwgMHgwMywgMHgwNywgMHgyZiwgMHg4MCwgMHgxOCwgMHhjNywgMHg0ZiwgMHhmMCwgMHgyMywgMHhlOCwgMHgxZiwgMHgyMCwgMHgyNSwKKyAgICAgICAgICAgICAgICAweDFkLCAweGEzLCAweDJiLCAweDliLCAweGRlLCAweDBmLCAweDM1LCAweDFiLCAweDU5LCAweDkzLCAweDA2LCAweGFiLCAweDhhLCAweGJmLCAweDMwLCAweDA0LAorICAgICAgICAgICAgICAgIDB4YWUsIDB4ZmIsIDB4ZmEsIDB4NjUsIDB4NGYsIDB4YWIsIDB4NjUsIDB4ZTEsIDB4OWMsIDB4NTcsIDB4NGUsIDB4MmYsIDB4ZDcsIDB4MzcsIDB4ZmMsIDB4OTUsCisgICAgICAgICAgICAgICAgMHg2NCwgMHhmNCwgMHgwMiwgMHg4NCwgMHhhMCwgMHg1MSwgMHhhZSwgMHhkNCwgMHg1NCwgMHhmZiwgMHhhZSwgMHgxNiwgMHg5ZCwgMHhhNSwgMHg2OCwgMHg5NCwKKyAgICAgICAgICAgICAgICAweDE1LCAweGYyLCAweGUxLCAweGNhLCAweDU3LCAweDgwLCAweDgzLCAweDg5LCAweGNmLCAweGZlLCAweDY2LCAweDczLCAweDI2LCAweDBjLCAweDhlLCAweGRjLAorICAgICAgICAgICAgICAgIDB4YWQsIDB4OTMsIDB4YTYsIDB4OTgsIDB4OTYsIDB4ZjAsIDB4ZTcsIDB4Y2QsIDB4ZWIsIDB4YzIsIDB4NzgsIDB4MzMsIDB4MDUsIDB4MDUsIDB4OTgsIDB4MjgsCisgICAgICAgICAgICAgICAgMHhmNSwgMHg4MSwgMHhiYSwgMHhiNiwgMHhlNywgMHhhNywgMHg0MSwgMHg5YywgMHhiOSwgMHg5NiwgMHhmMSwgMHhhNCwgMHgxMywgMHhiMSwgMHhiYywgMHhkOCwKKyAgICAgICAgICAgICAgICAweDc3LCAweDFiLCAweDk4LCAweDYwLCAweDM1LCAweDQ1LCAweGI4LCAweDU0LCAweDZjLCAweDM2LCAweGI0LCAweDM4LCAweGUyLCAweGFhLCAweGI5LCAweDM5LAorICAgICAgICAgICAgICAgIDB4OTksIDB4YmMsIDB4NTksIDB4NjUsIDB4ZmUsIDB4MDEsIDB4MjEsIDB4MTUsIDB4NjUsIDB4OGQsIDB4MmMsIDB4ODgsIDB4MDgsIDB4NWYsIDB4N2YsIDB4MzgsCisgICAgICAgICAgICAgICAgMHg3MywgMHg1NSwgMHg3ZSwgMHgzZSwgMHgwNiwgMHg4MSwgMHhmNiwgMHhhMCwgMHg1YywgMHhhMywgMHhmZCwgMHhjZSwgMHhlMiwgMHg0MCwgMHg0MiwgMHhkZiwKKyAgICAgICAgICAgICAgICAweDhhLCAweDllLCAweDcyLCAweDEzLCAweGU2LCAweGQxLCAweDcxLCAweDRlLCAweDFjLCAweDk2LCAweDU5LCAweDBhLCAweDVjLCAweGViLCAweGM5LCAweDc5LAorICAgICAgICAgICAgICAgIDB4NzksIDB4YzksIDB4NWUsIDB4ZmMsIDB4ZDksIDB4NjUsIDB4YWQsIDB4NTUsIDB4NWYsIDB4MTksIDB4ZDEsIDB4ZTcsIDB4MjAsIDB4MTAsIDB4ZTIsIDB4YjcsCisgICAgICAgICAgICAgICAgMHg1NCwgMHg0NiwgMHg5NiwgMHg5MiwgMHg2NCwgMHg3OSwgMHg4NSwgMHhjOSwgMHhiOSwgMHhkYiwgMHgwMiwgMHg0YiwgMHhiMywgMHhjNiwgMHgyYywgMHhmMCwKKyAgICAgICAgICAgICAgICAweDBmLCAweGM5LCAweDJkLCAweGE3LCAweDhiLCAweDMyLCAweDIwLCAweDMwLCAweGZkLCAweGJkLCAweDY1LCAweDFiLCAweDg2LCAweGFmLCAweDI3LCAweGM3LAorICAgICAgICAgICAgICAgIDB4M2MsIDB4YjAsIDB4ZGIsIDB4ZDEsIDB4NjAsIDB4OTQsIDB4YzIsIDB4OTksIDB4YTcsIDB4MzcsIDB4ZmIsIDB4NmEsIDB4OTIsIDB4MjEsIDB4MjIsIDB4NjEsCisgICAgICAgICAgICAgICAgMHg3ZSwgMHg1OSwgMHhiMSwgMHg3NCwgMHhlMiwgMHhjZCwgMHg5OCwgMHg5MCwgMHgyYywgMHhmMiwgMHg0OCwgMHg1MSwgMHgzYywgMHhlYywgMHhmYSwgMHhmNywKKyAgICAgICAgICAgICAgICAweDdjLCAweGQxLCAweGExLCAweDAwLCAweDk4LCAweDMwLCAweDMzLCAweDAyLCAweDZkLCAweGYzLCAweGZkLCAweDJhLCAweDkyLCAweDhhLCAweDc2LCAweDU1LAorICAgICAgICAgICAgICAgIDB4ODQsIDB4OTksIDB4OWQsIDB4ZDEsIDB4MjMsIDB4ODAsIDB4NDAsIDB4ZGUsIDB4OTAsIDB4MGEsIDB4NTcsIDB4ZmUsIDB4NDgsIDB4MDUsIDB4NmUsIDB4NDcsCisgICAgICAgICAgICAgICAgMHg1MSwgMHhhNiwgMHhkNCwgMHg3ZSwgMHhkMCwgMHg0MywgMHg2ZiwgMHg2MSwgMHgxOCwgMHhlYSwgMHgwNSwgMHhlMywgMHg2NiwgMHg2ZSwgMHhkYywgMHhlZCwKKyAgICAgICAgICAgICAgICAweDQ4LCAweDRkLCAweDUzLCAweGZhLCAweDNkLCAweDI3LCAweGI2LCAweGJiLCAweDU0LCAweGIwLCAweDE0LCAweGU3LCAweGRlLCAweGI4LCAweDAyLCAweGUyLAorICAgICAgICAgICAgICAgIDB4ZjIsIDB4NzUsIDB4MmUsIDB4ZWUsIDB4NDcsIDB4MmIsIDB4OWUsIDB4ZTYsIDB4OGEsIDB4YjYsIDB4NzcsIDB4OTUsIDB4YmIsIDB4ZjEsIDB4NjcsIDB4MGYsCisgICAgICAgICAgICAgICAgMHg5NiwgMHhiYywgMHgwNiwgMHg0NiwgMHgwYiwgMHhhMCwgMHg0YiwgMHhlZiwgMHg3NiwgMHg4NCwgMHgxNiwgMHgxNCwgMHgwYywgMHg3NCwgMHhkNiwgMHhmMSwKKyAgICAgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDdiLCAweGZmLCAweGZmLCAweGZkLCAweDg0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDQxLCAweDRkLCAweDRjLAorICAgICAgICAgICAgICAgIDB4NTYsIDB4ODYsIDB4MDAsIDB4NDAsIDB4OTIsIDB4ZTEsIDB4OTEsIDB4NTYsIDB4MDAsIDB4MDAsIDB4MGMsIDB4NzAsIDB4MDAsIDB4MDAsIDB4N2YsIDB4NzYsCisgICAgICAgICAgICAgICAgMHg4YiwgMHhkMSwgMHhjOSwgMHgzOCwgMHgyYiwgMHgzZiwgMHhhYywgMHhmMCwgMHhlZSwgMHg5OSwgMHgzNCwgMHhjYywgMHg2ZSwgMHhjYiwgMHgzNSwgMHg2YiwKKyAgICAgICAgICAgICAgICAweGQxLCAweGI2LCAweDY4LCAweDBmLCAweDc2LCAweDEyLCAweDJkLCAweDMyLCAweDg2LCAweGNlLCAweDliLCAweDIyLCAweGFhLCAweGU4LCAweDJjLCAweDU0LAorICAgICAgICAgICAgICAgIDB4ZTMsIDB4MzAsIDB4ZjMsIDB4MGEsIDB4YmUsIDB4YmIsIDB4MWMsIDB4NDMsIDB4OGEsIDB4NGYsIDB4NWMsIDB4ODksIDB4ZDAsIDB4MTgsIDB4MGIsIDB4NzQsCisgICAgICAgICAgICAgICAgMHhjOSwgMHhmNiwgMHhlNSwgMHgxNiwgMHhiOCwgMHhiNSwgMHg0NywgMHgyMywgMHg2NCwgMHhiOCwgMHgzOCwgMHhhOCwgMHg5ZCwgMHhiOCwgMHgzZiwgMHhlNSwKKyAgICAgICAgICAgICAgICAweGEzLCAweDM2LCAweGQwLCAweDYyLCAweDJhLCAweGQ3LCAweDZlLCAweDViLCAweGZmLCAweDRjLCAweDRhLCAweGM4LCAweGZhLCAweDc2LCAweGMzLCAweGUxLAorICAgICAgICAgICAgICAgIDB4OGMsIDB4N2IsIDB4ZGQsIDB4YTgsIDB4ZTgsIDB4MjQsIDB4YmYsIDB4MmIsIDB4OWIsIDB4Y2QsIDB4NmMsIDB4YTAsIDB4ODIsIDB4MTcsIDB4ZWYsIDB4MmMsCisgICAgICAgICAgICAgICAgMHhmNCwgMHhiMiwgMHg5NywgMHhlZSwgMHg5OSwgMHgyOSwgMHhkNywgMHgwZSwgMHg1NCwgMHg2YSwgMHhmZSwgMHhlMSwgMHg4OCwgMHgzYSwgMHgxNiwgMHg5YywKKyAgICAgICAgICAgICAgICAweDFmLCAweDFkLCAweDkxLCAweGU0LCAweDZmLCAweGZjLCAweGE0LCAweDVhLCAweGZkLCAweDI0LCAweDU3LCAweDNkLCAweDJkLCAweDQyLCAweGI2LCAweDY0LAorICAgICAgICAgICAgICAgIDB4ZGEsIDB4NTUsIDB4ZmQsIDB4MjgsIDB4NWMsIDB4OTMsIDB4MmIsIDB4OGMsIDB4YTAsIDB4MGUsIDB4MmIsIDB4OTMsIDB4NDIsIDB4MmEsIDB4ZTEsIDB4Y2QsCisgICAgICAgICAgICAgICAgMHhlZSwgMHgxMCwgMHhjMSwgMHgwMywgMHhkYywgMHhhNCwgMHhjMCwgMHhmNSwgMHhmOSwgMHg3ZiwgMHgzMywgMHhlMiwgMHhmNCwgMHg5MCwgMHgyNywgMHg5MiwKKyAgICAgICAgICAgICAgICAweDExLCAweDIwLCAweGExLCAweDE0LCAweDQyLCAweGU0LCAweGZmLCAweDBkLCAweDA3LCAweDI4LCAweDZlLCAweGJjLCAweDNiLCAweGJjLCAweGU4LCAweDcyLAorICAgICAgICAgICAgICAgIDB4ZTIsIDB4ZTUsIDB4YmUsIDB4YTYsIDB4MjcsIDB4NWIsIDB4MDIsIDB4NWMsIDB4Y2YsIDB4OWMsIDB4MDksIDB4MzIsIDB4MjUsIDB4Y2EsIDB4ZjgsIDB4MDMsCisgICAgICAgICAgICAgICAgMHg5NCwgMHhiZCwgMHg1YywgMHg2ZiwgMHg0MSwgMHhmZiwgMHg2ZCwgMHgyOSwgMHg4ZSwgMHhmYSwgMHgwNSwgMHhmZSwgMHhmMCwgMHg0MiwgMHgyZSwgMHhhOCwKKyAgICAgICAgICAgICAgICAweGZhLCAweDMwLCAweDRhLCAweDIyLCAweDEzLCAweDIxLCAweDVlLCAweGM1LCAweGEwLCAweDllLCAweGZlLCAweGIyLCAweDkzLCAweGI1LCAweDZhLCAweGIzLAorICAgICAgICAgICAgICAgIDB4NDQsIDB4ZjcsIDB4NTEsIDB4MjIsIDB4ZGYsIDB4MDIsIDB4MDEsIDB4MGEsIDB4MjgsIDB4ZDgsIDB4OWYsIDB4YWUsIDB4ZjAsIDB4OWUsIDB4ODksIDB4ODIsCisgICAgICAgICAgICAgICAgMHg3YiwgMHg5NCwgMHgzYywgMHg1MCwgMHg0MywgMHg1YSwgMHhjNSwgMHhiZSwgMHg0MywgMHg0ZSwgMHgzZSwgMHhhMywgMHhlMCwgMHgzMywgMHhhMCwgMHg5OSwKKyAgICAgICAgICAgICAgICAweDdjLCAweDRlLCAweDNiLCAweDVhLCAweDg1LCAweDA2LCAweDk0LCAweGM3LCAweGZkLCAweGU4LCAweDZhLCAweDdkLCAweGEyLCAweDhiLCAweDRkLCAweDE0LAorICAgICAgICAgICAgICAgIDB4ZDksIDB4ZDgsIDB4YmYsIDB4ODYsIDB4NTMsIDB4YzAsIDB4YTAsIDB4M2QsIDB4ZTMsIDB4MGYsIDB4ODUsIDB4YTYsIDB4ZTAsIDB4YzIsIDB4YzMsIDB4NzMsCisgICAgICAgICAgICAgICAgMHg2ZSwgMHgyNywgMHhmZiwgMHhiZSwgMHgzMCwgMHg1MywgMHgzZiwgMHg3NiwgMHgyZCwgMHg4NSwgMHhiOSwgMHhmNCwgMHgzOSwgMHg1MSwgMHhiNywgMHhhZSwKKyAgICAgICAgICAgICAgICAweDRjLCAweDA4LCAweDA4LCAweDViLCAweGQ4LCAweGUxLCAweDZkLCAweDhmLCAweDAxLCAweDBmLCAweDk4LCAweDcwLCAweGRiLCAweDQ5LCAweDIxLCAweDE4LAorICAgICAgICAgICAgICAgIDB4MTUsIDB4NGUsIDB4Y2UsIDB4YzQsIDB4YjYsIDB4ZDUsIDB4YTAsIDB4NzIsIDB4YzYsIDB4NGIsIDB4NmIsIDB4ODIsIDB4OGIsIDB4N2IsIDB4ODUsIDB4MzksCisgICAgICAgICAgICAgICAgMHhkYiwgMHg5NywgMHhmMiwgMHhkNCwgMHgwMywgMHgwNywgMHg0NCwgMHhjNSwgMHhiZCwgMHg5ZCwgMHhjMywgMHhiNiwgMHg4NiwgMHg3NiwgMHhjYSwgMHhkMSwKKyAgICAgICAgICAgICAgICAweGQ2LCAweDVhLCAweGY4LCAweDQxLCAweDY4LCAweGUzLCAweGE4LCAweDVhLCAweGEyLCAweGU4LCAweDBkLCAweGY4LCAweDNlLCAweGNkLCAweDI4LCAweDdkLAorICAgICAgICAgICAgICAgIDB4NWYsIDB4OWMsIDB4MzgsIDB4NGQsIDB4N2MsIDB4NjMsIDB4ZDMsIDB4OGUsIDB4YTcsIDB4NWEsIDB4YTcsIDB4MjEsIDB4MWYsIDB4YzQsIDB4ZGUsIDB4NjQsCisgICAgICAgICAgICAgICAgMHhmMCwgMHg3ZiwgMHgwNSwgMHhmNSwgMHhhOCwgMHhkZCwgMHg2YywgMHhkNSwgMHg0ZiwgMHg4YywgMHgxNCwgMHg2NSwgMHg5YiwgMHhlOSwgMHgzZSwgMHhjYiwKKyAgICAgICAgICAgICAgICAweDBjLCAweGY0LCAweDk0LCAweDNiLCAweDEyLCAweGIxLCAweGVjLCAweGY1LCAweDE1LCAweDIyLCAweDFlLCAweDQ3LCAweDAyLCAweDZkLCAweGE0LCAweDhmLAorICAgICAgICAgICAgICAgIDB4MDgsIDB4ZTEsIDB4ODQsIDB4MmEsIDB4MjYsIDB4ZWMsIDB4OTUsIDB4MjksIDB4N2EsIDB4ZjMsIDB4Y2QsIDB4NDgsIDB4NjEsIDB4NjUsIDB4YjAsIDB4ZmYsCisgICAgICAgICAgICAgICAgMHhiYSwgMHgwZSwgMHhkOCwgMHg1NiwgMHg2YiwgMHg1ZiwgMHg1ZSwgMHhkZCwgMHhkYywgMHg0MywgMHgxMiwgMHg1NCwgMHgxZiwgMHhhNiwgMHhlYSwgMHgyNywKKyAgICAgICAgICAgICAgICAweDVkLCAweDk3LCAweDVjLCAweGZlLCAweGQ2LCAweGIzLCAweGFhLCAweGMxLCAweGQ2LCAweDM3LCAweDE5LCAweGRjLCAweGE4LCAweGZjLCAweDc2LCAweGRiLAorICAgICAgICAgICAgICAgIDB4ODEsIDB4NTQsIDB4MTAsIDB4YTYsIDB4YjcsIDB4YzEsIDB4YjEsIDB4YjksIDB4NDIsIDB4NTQsIDB4YjgsIDB4NjksIDB4ZDYsIDB4NWIsIDB4ZGYsIDB4OGMsCisgICAgICAgICAgICAgICAgMHhkMiwgMHg4NSwgMHg0YiwgMHhkZiwgMHg4MCwgMHgzNiwgMHgxZSwgMHgzMSwgMHg0ZCwgMHhhMSwgMHgxYSwgMHg1NiwgMHhiOCwgMHgyYSwgMHg2YywgMHg1OSwKKyAgICAgICAgICAgICAgICAweDMzLCAweDExLCAweDFjLCAweGU2LCAweDM2LCAweDFiLCAweGJhLCAweDZiLCAweDU1LCAweDgyLCAweDhjLCAweDY5LCAweDg5LCAweGUyLCAweDdhLCAweGY2LAorICAgICAgICAgICAgICAgIDB4OTUsIDB4NTMsIDB4ZDksIDB4MjksIDB4ZDAsIDB4MDYsIDB4ZmIsIDB4MzgsIDB4ZjIsIDB4MzgsIDB4ZjYsIDB4MTIsIDB4OGUsIDB4NTQsIDB4MTYsIDB4ZDgsCisgICAgICAgICAgICAgICAgMHgzYiwgMHhmYSwgMHg1YSwgMHg3ZSwgMHg2MywgMHgwMSwgMHhkNywgMHg5OCwgMHg3ZSwgMHg3NCwgMHhkZiwgMHg0NywgMHhjNywgMHg4NCwgMHg3MiwgMHgyZCwKKyAgICAgICAgICAgICAgICAweDVkLCAweDBhLCAweGZmLCAweGFjLCAweGRmLCAweDdmLCAweDMxLCAweGE3LCAweDZiLCAweGY4LCAweDYzLCAweDk1LCAweDRhLCAweGZlLCAweDgxLCAweDA2LAorICAgICAgICAgICAgICAgIDB4M2EsIDB4MjMsIDB4YmEsIDB4MzAsIDB4OWQsIDB4MmYsIDB4MDAsIDB4MjcsIDB4ZDcsIDB4NTQsIDB4YTMsIDB4YmQsIDB4ZmEsIDB4OWYsIDB4YzgsIDB4MzUsCisgICAgICAgICAgICAgICAgMHgxZCwgMHgxZiwgMHg2MywgMHgxYywgMHhlNywgMHg2NywgMHhmMiwgMHhmNCwgMHhmMiwgMHg0NywgMHg3ZCwgMHg5ZCwgMHhjZSwgMHhhNSwgMHhlNiwgMHgyOCwKKyAgICAgICAgICAgICAgICAweDdkLCAweDkzLCAweDVhLCAweDg1LCAweGRjLCAweDUxLCAweDRjLCAweDYzLCAweDUyLCAweGZlLCAweGU5LCAweDQ2LCAweDg3LCAweDQyLCAweDZmLCAweGUyLAorICAgICAgICAgICAgICAgIDB4NTksIDB4ODUsIDB4YjIsIDB4NTEsIDB4ZGEsIDB4NTUsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4ZjUsIDB4ZmYsIDB4ZmYsIDB4ZmQsIDB4MGEsCisgICAgICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg0MSwgMHg0ZCwgMHg0YywgMHg1NiwgMHg4NiwgMHgwMCwgMHg0MCwgMHg5MiwgMHhlMSwgMHg0MSwgMHg1NiwgMHgwMCwKKyAgICAgICAgICAgICAgICAweDAwLCAweDBjLCAweDcwLCAweDAwLCAweDAwLCAweDdmLCAweDVmLCAweDVhLCAweDc2LCAweGMxLCAweGE4LCAweGNlLCAweGExLCAweDk2LCAweGUzLCAweDM0LAorICAgICAgICAgICAgICAgIDB4YTAsIDB4MzUsIDB4MDYsIDB4ZDAsIDB4ZDgsIDB4NDMsIDB4NDcsIDB4ZjQsIDB4ZTgsIDB4ZWQsIDB4ZTYsIDB4ZWEsIDB4NjksIDB4ZmEsIDB4YWEsIDB4MzEsCisgICAgICAgICAgICAgICAgMHhhYiwgMHg1MywgMHgyNywgMHg4MiwgMHg2NywgMHhjNCwgMHgzMCwgMHhmZiwgMHg4MiwgMHhjZiwgMHhhYSwgMHhiOCwgMHg2NiwgMHg0ZCwgMHhkYiwgMHhkOSwKKyAgICAgICAgICAgICAgICAweGU0LCAweGYxLCAweDU1LCAweDExLCAweDM2LCAweDlmLCAweGE4LCAweDExLCAweDZhLCAweGNiLCAweDUwLCAweGRkLCAweDk1LCAweDY3LCAweGY1LCAweGJhLAorICAgICAgICAgICAgICAgIDB4MmMsIDB4NjksIDB4MDQsIDB4YjAsIDB4YjAsIDB4MTEsIDB4YWQsIDB4MjEsIDB4YzYsIDB4ZWMsIDB4M2UsIDB4MmUsIDB4ZTUsIDB4MjgsIDB4N2YsIDB4NTMsCisgICAgICAgICAgICAgICAgMHgwNiwgMHhkMiwgMHg1ZCwgMHg2NiwgMHg1ZSwgMHg4MSwgMHgyMSwgMHgxMywgMHhhNywgMHg2MiwgMHgxMiwgMHg4NCwgMHgzZCwgMHgxZSwgMHhjYywgMHg0OSwKKyAgICAgICAgICAgICAgICAweDFjLCAweDk5LCAweGI0LCAweDMzLCAweGNmLCAweGZiLCAweGIxLCAweDQxLCAweDVlLCAweDg4LCAweDI2LCAweDJmLCAweGQzLCAweGJmLCAweGNmLCAweDJlLAorICAgICAgICAgICAgICAgIDB4OWQsIDB4MWMsIDB4ODEsIDB4OWQsIDB4YmUsIDB4Y2MsIDB4OGMsIDB4MGQsIDB4NWIsIDB4ZDAsIDB4YjIsIDB4YjcsIDB4YzAsIDB4YjgsIDB4NTMsIDB4YjAsCisgICAgICAgICAgICAgICAgMHg3ZCwgMHgzYSwgMHhiNywgMHg2MywgMHg2NiwgMHhhMiwgMHhjMCwgMHhkOCwgMHgwOCwgMHg3NiwgMHgyNiwgMHhjNywgMHhlMCwgMHg4NSwgMHg5OCwgMHgyYiwKKyAgICAgICAgICAgICAgICAweDM5LCAweGE2LCAweDY1LCAweGU1LCAweDFjLCAweGFkLCAweGU0LCAweDllLCAweDgyLCAweGE0LCAweDdjLCAweDcxLCAweDMxLCAweDA3LCAweGNhLCAweGVjLAorICAgICAgICAgICAgICAgIDB4NDcsIDB4YjQsIDB4NzUsIDB4M2UsIDB4MmIsIDB4NjUsIDB4MGMsIDB4OWIsIDB4MWMsIDB4MmQsIDB4Y2MsIDB4YTMsIDB4NDAsIDB4NDAsIDB4ZDYsIDB4ZGQsCisgICAgICAgICAgICAgICAgMHgyMSwgMHhhMSwgMHgxMCwgMHg3NiwgMHgzNSwgMHgxMywgMHhiMywgMHgxYSwgMHhkMywgMHg0MywgMHg4NywgMHhmMiwgMHhiYywgMHgyOCwgMHhkZSwgMHg4MiwKKyAgICAgICAgICAgICAgICAweDU5LCAweDRjLCAweDNkLCAweGFkLCAweDMzLCAweDhkLCAweGM1LCAweDk2LCAweDI1LCAweDg2LCAweGEzLCAweDMzLCAweDk1LCAweDM2LCAweDg1LCAweDA4LAorICAgICAgICAgICAgICAgIDB4YjEsIDB4OTUsIDB4ZDUsIDB4YjYsIDB4NWEsIDB4YWEsIDB4YjMsIDB4NzcsIDB4ZjksIDB4YmQsIDB4ZDAsIDB4YjQsIDB4NGEsIDB4YzcsIDB4N2MsIDB4MDAsCisgICAgICAgICAgICAgICAgMHgzOCwgMHg3MiwgMHg5MCwgMHgzNywgMHhjOCwgMHg0MCwgMHgwMCwgMHhjOCwgMHhiYiwgMHg1MSwgMHgwZSwgMHg3NywgMHg3MSwgMHg0OCwgMHg0ZiwgMHhmOSwKKyAgICAgICAgICAgICAgICAweDkyLCAweDU0LCAweDAxLCAweGM5LCAweDAyLCAweGUyLCAweDM2LCAweGFjLCAweDQxLCAweDU0LCAweDY0LCAweGNkLCAweGM1LCAweDE2LCAweDY0LCAweDJlLAorICAgICAgICAgICAgICAgIDB4NmMsIDB4OGUsIDB4NjMsIDB4ZTgsIDB4ZWEsIDB4NDgsIDB4NjEsIDB4NzQsIDB4NmEsIDB4Y2IsIDB4YjYsIDB4MTEsIDB4OTcsIDB4MTksIDB4NjgsIDB4YzMsCisgICAgICAgICAgICAgICAgMHg4NiwgMHgxOCwgMHg4ZSwgMHgxZSwgMHgyOCwgMHgyMSwgMHhlNywgMHhhMywgMHg0YywgMHhlZCwgMHgyMywgMHgzZiwgMHhiYywgMHgyNiwgMHhlNSwgMHg5MiwKKyAgICAgICAgICAgICAgICAweGRhLCAweGMxLCAweDliLCAweDYzLCAweGFiLCAweGRhLCAweGQ5LCAweGEzLCAweDVhLCAweDE3LCAweDQ4LCAweGJkLCAweDg5LCAweGQyLCAweDNlLCAweDE0LAorICAgICAgICAgICAgICAgIDB4M2IsIDB4MWIsIDB4YzAsIDB4NmQsIDB4ZTcsIDB4M2QsIDB4ODYsIDB4ODUsIDB4NDUsIDB4ZTIsIDB4OWUsIDB4N2YsIDB4ZmYsIDB4NjMsIDB4MDcsIDB4ZTYsCisgICAgICAgICAgICAgICAgMHgxMiwgMHgyMywgMHhhOSwgMHgxYywgMHg1MywgMHgyNCwgMHhjOCwgMHhlMSwgMHg4OSwgMHhlZSwgMHhlNywgMHg3MiwgMHgwNywgMHgwNCwgMHgxMSwgMHg4YywKKyAgICAgICAgICAgICAgICAweGNiLCAweDY2LCAweDYxLCAweDIzLCAweDZkLCAweDY4LCAweGUyLCAweGFhLCAweGI3LCAweGY4LCAweGI2LCAweGQ4LCAweGI0LCAweDZjLCAweDEzLCAweGM0LAorICAgICAgICAgICAgICAgIDB4ZDYsIDB4YmEsIDB4MDgsIDB4YTAsIDB4MDUsIDB4MjMsIDB4ZGMsIDB4YWQsIDB4ZWQsIDB4ZmYsIDB4NmQsIDB4MWIsIDB4MDMsIDB4M2UsIDB4ZjIsIDB4MWMsCisgICAgICAgICAgICAgICAgMHhmNiwgMHhkZCwgMHgyYSwgMHhmMSwgMHgxOCwgMHg3NiwgMHgyZSwgMHg4MiwgMHgzOCwgMHhhNCwgMHhiNywgMHgzZSwgMHhhYiwgMHg3NCwgMHgyNCwgMHg3OSwKKyAgICAgICAgICAgICAgICAweDgzLCAweDBiLCAweDJlLCAweDhlLCAweDBiLCAweDE5LCAweDA1LCAweDUyLCAweDIwLCAweDc4LCAweDlhLCAweGU4LCAweDU3LCAweDc3LCAweGRlLCAweGQ1LAorICAgICAgICAgICAgICAgIDB4MzYsIDB4YWIsIDB4NjAsIDB4MmIsIDB4ZDUsIDB4NTgsIDB4NmIsIDB4ZjgsIDB4NjQsIDB4ZGYsIDB4ZWIsIDB4NTIsIDB4YWQsIDB4NGIsIDB4ZTUsIDB4OGIsCisgICAgICAgICAgICAgICAgMHgwNSwgMHg2YSwgMHg5MCwgMHhjYywgMHg3MiwgMHg4YSwgMHgzYSwgMHg5NSwgMHhkMCwgMHgzMSwgMHhhNSwgMHg3NSwgMHgzYSwgMHhkZCwgMHgwOCwgMHhmNSwKKyAgICAgICAgICAgICAgICAweGQ1LCAweDNmLCAweDc2LCAweDllLCAweDI5LCAweDdkLCAweDRlLCAweGI3LCAweDkzLCAweDc1LCAweGMzLCAweGQ1LCAweDM4LCAweGRmLCAweDk3LCAweDdjLAorICAgICAgICAgICAgICAgIDB4ZjAsIDB4MTUsIDB4NGEsIDB4NWMsIDB4NTIsIDB4NjQsIDB4M2EsIDB4ZjYsIDB4MWUsIDB4MjYsIDB4MmYsIDB4YzYsIDB4YzgsIDB4YTMsIDB4NWEsIDB4OWYsCisgICAgICAgICAgICAgICAgMHg0MCwgMHg1MywgMHg3YSwgMHg0YiwgMHg1YywgMHg5NCwgMHhlMiwgMHg3OSwgMHgwNywgMHgyMywgMHgwNiwgMHgzZSwgMHhlNSwgMHhlZSwgMHg0ZiwgMHhlZCwKKyAgICAgICAgICAgICAgICAweDBmLCAweDM3LCAweDE5LCAweGQ4LCAweDg0LCAweGRiLCAweDAyLCAweDY5LCAweDIwLCAweDU3LCAweDRkLCAweDA4LCAweDgxLCAweGY5LCAweDQ0LCAweDEzLAorICAgICAgICAgICAgICAgIDB4NDEsIDB4MDIsIDB4NzksIDB4NGIsIDB4M2YsIDB4YzksIDB4MDcsIDB4MTYsIDB4ZTIsIDB4YjEsIDB4NzMsIDB4NDMsIDB4OWQsIDB4MDQsIDB4ZWEsIDB4OGMsCisgICAgICAgICAgICAgICAgMHhkYSwgMHg0ZiwgMHg4NSwgMHgzMCwgMHgxMiwgMHhjNCwgMHg4NywgMHhiNCwgMHgxOCwgMHgwYSwgMHgxOCwgMHgzMiwgMHgwYywgMHg3NywgMHhjNCwgMHgxZSwKKyAgICAgICAgICAgICAgICAweGEyLCAweDIzLCAweGZhLCAweGNmLCAweGJkLCAweDhiLCAweDM1LCAweGY0LCAweDRjLCAweDRlLCAweDc1LCAweDFhLCAweDgwLCAweGY5LCAweDJjLCAweGM1LAorICAgICAgICAgICAgICAgIDB4MGIsIDB4ODEsIDB4N2EsIDB4NDAsIDB4MzYsIDB4YTAsIDB4NTgsIDB4ODYsIDB4ZjMsIDB4ZGQsIDB4MmQsIDB4NzEsIDB4YzcsIDB4OGYsIDB4MDUsIDB4ZDAsCisgICAgICAgICAgICAgICAgMHg4MSwgMHhmMiwgMHhiOSwgMHhiMiwgMHg3ZSwgMHhkOSwgMHg2NSwgMHg3MywgMHg0ZiwgMHg4ZCwgMHgxYywgMHhlZCwgMHgwOSwgMHg5YiwgMHhjZCwgMHhkZCwKKyAgICAgICAgICAgICAgICAweGRkLCAweDlhLCAweGEwLCAweDIyLCAweDVjLCAweDViLCAweGM1LCAweGY1LCAweGRhLCAweDhkLCAweDAxLCAweDg3LCAweDhlLCAweDAxLCAweGUzLCAweDEyLAorICAgICAgICAgICAgICAgIDB4NWMsIDB4YjIsIDB4MjMsIDB4MmEsIDB4OTQsIDB4NjUsIDB4YTYsIDB4OWEsIDB4ODcsIDB4ZjgsIDB4NjMsIDB4NWYsIDB4NGMsIDB4ZjAsIDB4MTgsIDB4ZTIsCisgICAgICAgICAgICAgICAgMHgwYywgMHhiOCwgMHg4ZCwgMHhkYywgMHg0ZCwgMHg3YywgMHg1MCwgMHhhMiwgMHhlMSwgMHg4NywgMHg0OSwgMHg4NiwgMHhiNCwgMHgzOCwgMHhlYywgMHhkMywKKyAgICAgICAgICAgICAgICAweDVkLCAweDIyLCAweDI3LCAweDQyLCAweGRjLCAweGFlLCAweDhiLCAweDdmLCAweGJlLCAweDRlLCAweDFkLCAweGFkLCAweDA2LCAweGM5LCAweGQwLCAweDk4LAorICAgICAgICAgICAgICAgIDB4MWYsIDB4NjcsIDB4MmEsIDB4MjIsIDB4MTksIDB4OTAsIDB4YmIsIDB4OGYsIDB4ZWYsIDB4NDIsIDB4MjMsIDB4YzEsIDB4ZDIsIDB4NTEsIDB4ZDEsIDB4OWMsCisgICAgICAgICAgICAgICAgMHg1YiwgMHhhMCwgMHgzYSwgMHg1NiwgMHhhZSwgMHg5NCwgMHg0ZSwgMHgwYywgMHgxNywgMHg1ZSwgMHg4MiwgMHhlNywgMHgyMSwgMHhmZCwgMHgwZSwgMHhhNiwKKyAgICAgICAgICAgICAgICAweDY2LCAweGI3LCAweDhlLCAweDljLCAweDhkLCAweDRiLCAweDAyLCAweDYzLCAweGRmLCAweDFjLCAweDdhLCAweDBjLCAweGQ5LCAweGNhLCAweDI0LCAweGM1LAorICAgICAgICAgICAgICAgIDB4MWQsIDB4YjMsIDB4MjksIDB4ZmYsIDB4NDgsIDB4MTYsIDB4NDgsIDB4M2QsIDB4NzUsIDB4ZDIsIDB4YjksIDB4NDQsIDB4MDAsIDB4ZGMsIDB4M2UsIDB4Y2IsCisgICAgICAgICAgICAgICAgMHgzNywgMHhkOSwgMHhlZSwgMHgxNiwgMHhjZSwgMHhiNywgMHg1MCwgMHgxMCwgMHhhZCwgMHhhOCwgMHgxZiwgMHhhMCwgMHhkYiwgMHgyZiwgMHg1NywgMHhkMSwKKyAgICAgICAgICAgICAgICAweGI2LCAweDQ0LCAweDg3LCAweDAwLCAweDc5LCAweGMyLCAweDI1LCAweDAzLCAweGE4LCAweDdhLCAweDk0LCAweGVhLCAweDAyLCAweDZiLCAweDU2LCAweDZjLAorICAgICAgICAgICAgICAgIDB4MWMsIDB4NzcsIDB4MzUsIDB4ZDgsIDB4ODUsIDB4ODIsIDB4YmIsIDB4NmUsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MmEsIDB4ZmYsIDB4ZmYsIDB4ZmMsCisgICAgICAgICAgICAgICAgMHhkNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg0MSwgMHg0ZCwgMHg0YywgMHg1NiwgMHg4NiwgMHgwMCwgMHg0MCwgMHg5MiwgMHhlMSwgMHg4MSwgMHg1NiwKKyAgICAgICAgICAgICAgICAweDAwLCAweDAwLCAweDE0LCAweDcwLCAweDk2LCAweGMwLCAweDAwLCAweDAwLCAweDdmLCAweGZhLCAweDQ1LCAweDZhLCAweDZlLCAweGUxLCAweDJlLCAweDYxLAorICAgICAgICAgICAgICAgIDB4NGEsIDB4NDksIDB4ODgsIDB4MzUsIDB4NTksIDB4MjAsIDB4OTEsIDB4YjYsIDB4MGQsIDB4ZTIsIDB4ZGYsIDB4YTgsIDB4YWIsIDB4ZjIsIDB4YjEsIDB4YjgsCisgICAgICAgICAgICAgICAgMHhmNiwgMHg5YywgMHg5ZSwgMHhjNiwgMHg1MCwgMHgwNiwgMHhlYywgMHgyZiwgMHg5YSwgMHg5ZSwgMHg5MSwgMHg5NCwgMHgzNiwgMHg0ZCwgMHgxMywgMHg3NSwKKyAgICAgICAgICAgICAgICAweGYwLCAweDRlLCAweDYzLCAweGRjLCAweDg1LCAweGExLCAweGRjLCAweDNmLCAweDA5LCAweDRhLCAweDRiLCAweGQ0LCAweDA4LCAweDcwLCAweDk0LCAweGM5LAorICAgICAgICAgICAgICAgIDB4NzMsIDB4NWIsIDB4NTAsIDB4NzEsIDB4YTMsIDB4MzIsIDB4NjUsIDB4ZTYsIDB4OWUsIDB4ZTUsIDB4ZDcsIDB4YzUsIDB4NGQsIDB4YTUsIDB4MDIsIDB4NWEsCisgICAgICAgICAgICAgICAgMHgwMCwgMHg3NSwgMHhkOSwgMHg4MCwgMHhjOSwgMHg5NSwgMHg3OSwgMHg0NywgMHhiMSwgMHgzMCwgMHhhYywgMHg4YiwgMHhmMCwgMHgzYywgMHhkMSwgMHg1NywKKyAgICAgICAgICAgICAgICAweGUxLCAweGYzLCAweDZmLCAweDM5LCAweGUwLCAweDVjLCAweDZjLCAweDg5LCAweDdjLCAweDgwLCAweDc4LCAweDMyLCAweDBlLCAweDJhLCAweDk1LCAweGYwLAorICAgICAgICAgICAgICAgIDB4NTIsIDB4ODgsIDB4NjMsIDB4MzAsIDB4ZmMsIDB4MmYsIDB4ZTIsIDB4MmQsIDB4MGEsIDB4YjYsIDB4MWUsIDB4YTQsIDB4ZDUsIDB4NTksIDB4MzIsIDB4OTksCisgICAgICAgICAgICAgICAgMHg4MiwgMHhjNCwgMHgyYywgMHg3NywgMHg4OSwgMHg1ZCwgMHgyOCwgMHhhYiwgMHgwZiwgMHgwNywgMHhlZCwgMHhhMywgMHgwMiwgMHhjMiwgMHgwYywgMHg5NSwKKyAgICAgICAgICAgICAgICAweDQ1LCAweGRjLCAweDBiLCAweDJlLCAweGE2LCAweDk2LCAweDFkLCAweDJhLCAweDM2LCAweDkwLCAweGE5LCAweDAzLCAweGNkLCAweDA5LCAweDJlLCAweGM5LAorICAgICAgICAgICAgICAgIDB4OTUsIDB4MjgsIDB4NzMsIDB4ZjIsIDB4MWIsIDB4MmIsIDB4M2EsIDB4NWUsIDB4NjYsIDB4ZjAsIDB4ZjgsIDB4NTAsIDB4YWMsIDB4ZjUsIDB4MjMsIDB4OTgsCisgICAgICAgICAgICAgICAgMHhhMCwgMHhiMiwgMHhjMCwgMHhlNywgMHgwYiwgMHhjNCwgMHg5MywgMHg5NywgMHgwYSwgMHhiZSwgMHg4MywgMHg4MiwgMHg1NiwgMHg0YywgMHhhOSwgMHhkOSwKKyAgICAgICAgICAgICAgICAweDMyLCAweDBmLCAweDg4LCAweGM1LCAweGQ4LCAweDMwLCAweGFjLCAweDZmLCAweDkyLCAweDQyLCAweDk0LCAweDY0LCAweGIxLCAweDMzLCAweDk1LCAweDI3LAorICAgICAgICAgICAgICAgIDB4MGIsIDB4M2EsIDB4NjksIDB4NGEsIDB4YmQsIDB4NjAsIDB4NzUsIDB4OWQsIDB4YjUsIDB4YzUsIDB4ODIsIDB4MTUsIDB4YTcsIDB4MGQsIDB4MjcsIDB4ZTksCisgICAgICAgICAgICAgICAgMHg1YiwgMHhmMCwgMHgxZSwgMHg0MCwgMHg2YywgMHg2YiwgMHg2ZCwgMHg0OCwgMHhmZiwgMHg3NywgMHg0ZSwgMHhmYywgMHg1OCwgMHgzMywgMHhjMCwgMHgwMCwKKyAgICAgICAgICAgICAgICAweDU4LCAweDYyLCAweGZjLCAweGUzLCAweDBlLCAweGEyLCAweGM1LCAweGY3LCAweGQ5LCAweDM4LCAweDVkLCAweGJiLCAweDgwLCAweDRiLCAweDFkLCAweDM2LAorICAgICAgICAgICAgICAgIDB4M2QsIDB4NjMsIDB4ZjAsIDB4M2MsIDB4YWEsIDB4ODMsIDB4OWYsIDB4MTIsIDB4N2IsIDB4NDgsIDB4OTgsIDB4YWQsIDB4NjcsIDB4ZGEsIDB4MTgsIDB4NGEsCisgICAgICAgICAgICAgICAgMHg0ZSwgMHg3OSwgMHg3YywgMHhkOSwgMHhiOSwgMHhkYSwgMHgyZCwgMHgzMiwgMHhlMywgMHg2YSwgMHg2YiwgMHg1YywgMHhmNCwgMHhiYiwgMHhmZSwgMHg1MiwKKyAgICAgICAgICAgICAgICAweDNlLCAweGVlLCAweGU2LCAweDM3LCAweGMzLCAweDEwLCAweGZjLCAweGQ1LCAweGYyLCAweDdkLCAweGNhLCAweGVmLCAweDYwLCAweDI1LCAweGEwLCAweDBlLAorICAgICAgICAgICAgICAgIDB4M2UsIDB4ZTIsIDB4YjMsIDB4MjYsIDB4YmEsIDB4YWMsIDB4ZWEsIDB4ODcsIDB4NjYsIDB4ZDgsIDB4YTYsIDB4ZTYsIDB4MmQsIDB4M2IsIDB4NzcsIDB4MjUsCisgICAgICAgICAgICAgICAgMHhlMiwgMHg4NCwgMHgzMiwgMHg4NSwgMHgyNywgMHg3ZCwgMHgyMCwgMHg5NywgMHhkNSwgMHg1YywgMHg0OSwgMHg3MSwgMHgxNiwgMHg5NSwgMHgxMCwgMHgzMCwKKyAgICAgICAgICAgICAgICAweDI3LCAweDY3LCAweGEzLCAweGQ0LCAweDVlLCAweDVhLCAweDhjLCAweGNmLCAweDU2LCAweDM3LCAweGE5LCAweDA0LCAweGIxLCAweGVjLCAweGQ4LCAweDY5LAorICAgICAgICAgICAgICAgIDB4OTAsIDB4Y2EsIDB4MzcsIDB4MGQsIDB4NGYsIDB4ODIsIDB4OTEsIDB4NTgsIDB4MGUsIDB4ZjYsIDB4ZmUsIDB4ODQsIDB4YTUsIDB4N2IsIDB4YTgsIDB4YWMsCisgICAgICAgICAgICAgICAgMHg5OSwgMHgyMywgMHgwMSwgMHhhNiwgMHgzNywgMHg4YSwgMHg1MCwgMHgwZSwgMHgyNywgMHg0NywgMHg5NiwgMHgzNywgMHhiNiwgMHgxMywgMHg0NywgMHhiMSwKKyAgICAgICAgICAgICAgICAweDZmLCAweGU5LCAweGIxLCAweGViLCAweGU2LCAweDczLCAweDZiLCAweGYyLCAweGQ4LCAweDVhLCAweDNjLCAweDU1LCAweGI0LCAweDg3LCAweDNmLCAweDFjLAorICAgICAgICAgICAgICAgIDB4OTYsIDB4OTQsIDB4ODQsIDB4ZDksIDB4M2QsIDB4NmYsIDB4NTEsIDB4YzYsIDB4MDYsIDB4YzYsIDB4NDAsIDB4NWYsIDB4ZGUsIDB4OWEsIDB4NGEsIDB4NzIsCisgICAgICAgICAgICAgICAgMHg5YiwgMHg4ZCwgMHgzZSwgMHgxZSwgMHgxZCwgMHg3ZCwgMHhiNywgMHg0NiwgMHg5MCwgMHg0OCwgMHg3YiwgMHgzMCwgMHgzOCwgMHhlZiwgMHg2YiwgMHgwMiwKKyAgICAgICAgICAgICAgICAweDkyLCAweDEwLCAweDk0LCAweDgxLCAweDE1LCAweDY2LCAweDliLCAweGMzLCAweGIwLCAweDYyLCAweGFiLCAweGQ2LCAweDZjLCAweGQ4LCAweGJkLCAweDA0LAorICAgICAgICAgICAgICAgIDB4YWQsIDB4NjksIDB4OTMsIDB4YjksIDB4MGEsIDB4ZDIsIDB4YzUsIDB4MzksIDB4YjcsIDB4ZGUsIDB4MjAsIDB4YTYsIDB4MjcsIDB4NTgsIDB4MGEsIDB4NzksCisgICAgICAgICAgICAgICAgMHg0YSwgMHhkNSwgMHhiMCwgMHhhOSwgMHgwYSwgMHg5ZiwgMHg1ZCwgMHgwNSwgMHgyMCwgMHhkZCwgMHgxMSwgMHhhOCwgMHg4ZCwgMHg4MiwgMHhiMywgMHhhOSwKKyAgICAgICAgICAgICAgICAweDI4LCAweDVmLCAweGI3LCAweDEzLCAweGE2LCAweDdkLCAweGY1LCAweDQ4LCAweDA5LCAweDVjLCAweGRiLCAweDRkLCAweDkyLCAweGI3LCAweDY4LCAweDU3LAorICAgICAgICAgICAgICAgIDB4ZDAsIDB4MGMsIDB4OTQsIDB4MDMsIDB4OTksIDB4ZTQsIDB4YWUsIDB4YjMsIDB4NWMsIDB4OWQsIDB4ZTcsIDB4NzMsIDB4MzYsIDB4MTYsIDB4NGUsIDB4OWYsCisgICAgICAgICAgICAgICAgMHhlYSwgMHgyZSwgMHg4YywgMHg4MywgMHhmZCwgMHg3YSwgMHhiNCwgMHhlZiwgMHhkZCwgMHg1ZCwgMHg2MCwgMHgyNCwgMHg3MCwgMHhhNCwgMHgxZCwgMHgxMSwKKyAgICAgICAgICAgICAgICAweGQ3LCAweDQ0LCAweGExLCAweDUxLCAweDE4LCAweDEyLCAweDc4LCAweDIwLCAweGY3LCAweDIyLCAweDY4LCAweDMyLCAweGQ4LCAweDUwLCAweGQ5LCAweDczLAorICAgICAgICAgICAgICAgIDB4YTIsIDB4MDAsIDB4YzgsIDB4NTIsIDB4ZmUsIDB4YjYsIDB4MDYsIDB4MDMsIDB4MDUsIDB4ZDMsIDB4YTAsIDB4NDcsIDB4YzQsIDB4MmMsIDB4OWEsIDB4N2YsCisgICAgICAgICAgICAgICAgMHg2YSwgMHg4ZiwgMHhkYywgMHgwMywgMHg3YSwgMHg0YSwgMHg5NiwgMHgxNiwgMHg4NiwgMHg4YiwgMHgwOSwgMHg3MywgMHg5MCwgMHgyMiwgMHg5OSwgMHg5ZSwKKyAgICAgICAgICAgICAgICAweDc5LCAweDAxLCAweGY5LCAweGU4LCAweDI2LCAweGNiLCAweDgwLCAweDdlLCAweDJmLCAweGY3LCAweDkyLCAweDU2LCAweGZhLCAweGExLCAweDIyLCAweGQzLAorICAgICAgICAgICAgICAgIDB4NWQsIDB4NjQsIDB4YTYsIDB4ZTEsIDB4MTQsIDB4NzMsIDB4M2UsIDB4YTEsIDB4NjcsIDB4MzQsIDB4YzUsIDB4YzksIDB4YWMsIDB4ZDQsIDB4ZWYsIDB4ZDUsCisgICAgICAgICAgICAgICAgMHgwOSwgMHhjNCwgMHg5ZCwgMHgzOCwgMHhhOCwgMHhlOSwgMHg3YSwgMHhkZCwgMHhmYywgMHgzYywgMHhiOCwgMHg1ZCwgMHg4NCwgMHg1NSwgMHhjYywgMHg3NSwKKyAgICAgICAgICAgICAgICAweGZkLCAweDExLCAweDEyLCAweDcyLCAweGUxLCAweDQ2LCAweDA2LCAweGQ5LCAweDhlLCAweDZhLCAweGVlLCAweGEzLCAweGJkLCAweGEzLCAweGM1LCAweDg5LAorICAgICAgICAgICAgICAgIDB4OWUsIDB4OWIsIDB4NTYsIDB4YjIsIDB4ZTcsIDB4ZDYsIDB4MTMsIDB4NDQsIDB4OTYsIDB4YmQsIDB4MDEsIDB4YWUsIDB4YmIsIDB4ZjYsIDB4ZTUsIDB4NTYsCisgICAgICAgICAgICAgICAgMHg4ZCwgMHhjMCwgMHg3NSwgMHhkMSwgMHg3ZiwgMHg4NSwgMHgyNSwgMHhiMywgMHg5OCwgMHhlZSwgMHg5NywgMHhiZiwgMHhhMiwgMHg1MCwgMHg0NywgMHg1YSwKKyAgICAgICAgICAgICAgICAweDJiLCAweDMxLCAweDMyLCAweDQyLCAweDA4LCAweDgwLCAweDcyLCAweDcwLCAweDUyLCAweGI5LCAweGI5LCAweDc2LCAweDcxLCAweDAyLCAweDE4LCAweDNiLAorICAgICAgICAgICAgICAgIDB4YTAsIDB4YzMsIDB4ZWUsIDB4YmIsIDB4NDQsIDB4MzgsIDB4NGQsIDB4MjUsIDB4Y2IsIDB4YzksIDB4NTQsIDB4ZmEsIDB4MjYsIDB4M2MsIDB4ZmYsIDB4NWQsCisgICAgICAgICAgICAgICAgMHhhYywgMHhhNywgMHgzMCwgMHg1NiwgMHhmZCwgMHg4MSwgMHhkNywgMHhiYiwgMHg3YywgMHg0NCwgMHhmMSwgMHg0OCwgMHg1MSwgMHhjMCwgMHgwOSwgMHgwMCwKKyAgICAgICAgICAgICAgICAweDE1LCAweGRkLCAweGY2LCAweDRkLCAweGJiLCAweDU5LCAweDhhLCAweDE5LCAweGI3LCAweGFiLCAweDZiLCAweDk1LCAweGI5LCAweDQ2LCAweDM1LCAweDAzLAorICAgICAgICAgICAgICAgIDB4MzgsIDB4OTUsIDB4NTEsIDB4NDIsIDB4OWMsIDB4MTAsIDB4MzEsIDB4OTgsIDB4ZmQsIDB4ODQsIDB4NjUsIDB4ZjAsIDB4YTcsIDB4NjcsIDB4NTEsIDB4ZWEsCisgICAgICAgICAgICAgICAgMHgwMiwgMHgyMCwgMHhmOCwgMHhkMCwgMHhjMSwgMHg1YSwgMHgyYywgMHhjYywgMHgwNCwgMHgxZiwgMHhmNSwgMHgyZCwgMHg1OCwgMHg3NSwgMHhlNCwgMHg1NiwKKyAgICAgICAgICAgICAgICAweGRhLCAweGM1LCAweDkwLCAweGQyLCAweGMzLCAweDA4LCAweDY0LCAweDRlLCAweDNmLCAweDQ4LCAweDYwLCAweGYzLCAweGE2LCAweDUyLCAweDY2LCAweGVjLAorICAgICAgICAgICAgICAgIDB4NzcsIDB4YWMsIDB4ZjUsIDB4MGEsIDB4YWUsIDB4ZDAsIDB4ODYsIDB4OWYsIDB4MjgsIDB4NWYsIDB4MTAsIDB4OTUsIDB4ZjMsIDB4ZjQsIDB4ODAsIDB4MDAsCisgICAgICAgICAgICAgICAgMHgwMCwgMHgwMywgMHg1NywgMHhmZiwgMHhmZiwgMHhmYywgMHhhOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg0MSwgMHg0ZCwgMHg0YywgMHg1NiwgMHg4NiwKKyAgICAgICAgICAgICAgICAweDAwLCAweDQwLCAweDkyLCAweGUxLCAweDYxLCAweDU2LCAweDAwLCAweDAwLCAweDBjLCAweDcwLCAweDAwLCAweDAwLCAweDdmLCAweGRmLCAweGJmLCAweDI4LAorICAgICAgICAgICAgICAgIDB4ZjEsIDB4Y2EsIDB4NGUsIDB4ZTgsIDB4ZTIsIDB4MGIsIDB4YzcsIDB4MGQsIDB4ZTQsIDB4MzgsIDB4YmUsIDB4ZmEsIDB4YjAsIDB4ZDksIDB4MGYsIDB4MGYsCisgICAgICAgICAgICAgICAgMHg2MywgMHg0ZiwgMHg1NywgMHgwMCwgMHgyYiwgMHgwMSwgMHgzNSwgMHg4ZiwgMHhlMSwgMHg4MiwgMHhhZiwgMHhiZCwgMHg2OSwgMHg1MywgMHgwYywgMHgyZCwKKyAgICAgICAgICAgICAgICAweDZiLCAweDY4LCAweGFiLCAweDRiLCAweGY0LCAweDYwLCAweGFlLCAweDczLCAweDgyLCAweDFjLCAweGU4LCAweDk1LCAweDg0LCAweGVkLCAweGMyLCAweDRlLAorICAgICAgICAgICAgICAgIDB4ODEsIDB4OWEsIDB4ZTUsIDB4ZjUsIDB4OGUsIDB4M2YsIDB4ZTIsIDB4NTUsIDB4NmEsIDB4MWUsIDB4MTgsIDB4YjUsIDB4MWIsIDB4ZjUsIDB4ZWEsIDB4M2YsCisgICAgICAgICAgICAgICAgMHg5NCwgMHg4MiwgMHhjZSwgMHhiZiwgMHgzNSwgMHhlYSwgMHhkNiwgMHg4ZCwgMHhiMCwgMHhhZiwgMHg5YSwgMHhmOSwgMHhkZCwgMHg0ZiwgMHhmZiwgMHhlYSwKKyAgICAgICAgICAgICAgICAweDA3LCAweDYzLCAweDkzLCAweDhkLCAweDE3LCAweDY1LCAweDU0LCAweGQzLCAweDFkLCAweDQ1LCAweDcwLCAweDY4LCAweGYyLCAweGJjLCAweDQwLCAweDg0LAorICAgICAgICAgICAgICAgIDB4YWMsIDB4OGIsIDB4ZmYsIDB4NDIsIDB4YTEsIDB4YTEsIDB4MjksIDB4NzcsIDB4YzksIDB4YzYsIDB4ODEsIDB4ZjksIDB4NDYsIDB4NDUsIDB4ZjcsIDB4MTAsCisgICAgICAgICAgICAgICAgMHg1MCwgMHg4NSwgMHg2NywgMHhlNiwgMHhhYiwgMHhkNiwgMHgxZSwgMHhlMCwgMHhhOSwgMHhlYiwgMHgxYiwgMHg5ZiwgMHgxYSwgMHhlMywgMHhjMiwgMHg0MSwKKyAgICAgICAgICAgICAgICAweDg3LCAweDcxLCAweDk3LCAweGM0LCAweGM4LCAweDZhLCAweDJkLCAweDY0LCAweGRlLCAweDRkLCAweDAyLCAweDMzLCAweDQyLCAweGY3LCAweGE5LCAweGMyLAorICAgICAgICAgICAgICAgIDB4NmUsIDB4MjAsIDB4N2YsIDB4ZjMsIDB4MWEsIDB4ZDMsIDB4MzMsIDB4OTIsIDB4M2UsIDB4ZDgsIDB4ZTMsIDB4NzcsIDB4MjQsIDB4NWYsIDB4NzAsIDB4NGQsCisgICAgICAgICAgICAgICAgMHg1MCwgMHgwZCwgMHhjNywgMHgxOCwgMHg4MiwgMHg4MiwgMHg2NSwgMHgxZCwgMHhlNCwgMHg0OSwgMHgzZSwgMHg5ZiwgMHg4ZSwgMHhlYywgMHhkOCwgMHgyOSwKKyAgICAgICAgICAgICAgICAweDhjLCAweGQ0LCAweDY3LCAweGJmLCAweGU2LCAweDUxLCAweGMzLCAweDY2LCAweDc0LCAweDBmLCAweDhhLCAweDhjLCAweGFlLCAweGQ0LCAweDhmLCAweGFiLAorICAgICAgICAgICAgICAgIDB4YzMsIDB4MzcsIDB4ZWUsIDB4YmUsIDB4ZWMsIDB4ODEsIDB4MjQsIDB4NzcsIDB4NzMsIDB4NGIsIDB4ODQsIDB4N2UsIDB4MjQsIDB4NjIsIDB4NjIsIDB4NmQsCisgICAgICAgICAgICAgICAgMHg3OSwgMHg1ZCwgMHg2OCwgMHg2NCwgMHgzZiwgMHg5OCwgMHhkZCwgMHg3ZSwgMHg4MiwgMHhhOCwgMHgwZiwgMHg0NSwgMHgwZSwgMHg5MywgMHhjZCwgMHgzZCwKKyAgICAgICAgICAgICAgICAweDFkLCAweDUwLCAweDE2LCAweGY1LCAweGY1LCAweDUzLCAweDI5LCAweGMwLCAweGJiLCAweGJiLCAweGQ2LCAweDY4LCAweDg3LCAweDQ3LCAweDVkLCAweGRhLAorICAgICAgICAgICAgICAgIDB4ZGYsIDB4ZTQsIDB4ODQsIDB4ZmUsIDB4NDAsIDB4MjEsIDB4ZDQsIDB4MGIsIDB4ZjAsIDB4M2QsIDB4MTksIDB4MzIsIDB4MDMsIDB4ODUsIDB4MWIsIDB4YTgsCisgICAgICAgICAgICAgICAgMHhhNywgMHhlYSwgMHg2ZiwgMHhkOSwgMHhmNSwgMHg1NCwgMHg1OCwgMHhhMywgMHhkYywgMHhkNywgMHhjMCwgMHhkNSwgMHgyNiwgMHgyZCwgMHgzOSwgMHhlZCwKKyAgICAgICAgICAgICAgICAweGNjLCAweGI3LCAweGZiLCAweDM2LCAweGViLCAweGM2LCAweDIxLCAweDU4LCAweGU0LCAweDUyLCAweGVhLCAweDgxLCAweGEwLCAweGEyLCAweDYzLCAweDhhLAorICAgICAgICAgICAgICAgIDB4YWUsIDB4MGMsIDB4YjEsIDB4MWQsIDB4NzksIDB4YjksIDB4Y2QsIDB4NDksIDB4YjgsIDB4MzEsIDB4ODgsIDB4ZTUsIDB4ZTIsIDB4NWMsIDB4YmQsIDB4N2EsCisgICAgICAgICAgICAgICAgMHhiZSwgMHhjYywgMHg3NCwgMHg0NywgMHhlNywgMHg2NSwgMHgyZCwgMHgzZCwgMHhlOSwgMHg0MSwgMHg2NCwgMHg2NywgMHgwMSwgMHg3NiwgMHhjOCwgMHg0MSwKKyAgICAgICAgICAgICAgICAweDNiLCAweDdlLCAweGRlLCAweDNjLCAweDY1LCAweGM2LCAweDM2LCAweDhhLCAweGViLCAweGUxLCAweDc3LCAweGU4LCAweDRiLCAweDhmLCAweDZiLCAweGIwLAorICAgICAgICAgICAgICAgIDB4MDksIDB4OGIsIDB4YzMsIDB4ZjksIDB4OWUsIDB4OWMsIDB4ZGIsIDB4MjYsIDB4NDUsIDB4MDAsIDB4NTIsIDB4NGQsIDB4YzEsIDB4ZmIsIDB4MzMsIDB4MGYsCisgICAgICAgICAgICAgICAgMHhmYywgMHgwMSwgMHgzMSwgMHhlMSwgMHgxYSwgMHg5MiwgMHg1YywgMHg1NywgMHg1ZCwgMHhjZSwgMHg2NSwgMHg1MSwgMHgxNiwgMHg2MiwgMHhhMCwgMHg0YiwKKyAgICAgICAgICAgICAgICAweDRmLCAweDg2LCAweGY0LCAweDdkLCAweGI0LCAweDNjLCAweDAxLCAweDE5LCAweDMyLCAweDdhLCAweDg4LCAweDRhLCAweDUwLCAweDk2LCAweGJkLCAweDk5LAorICAgICAgICAgICAgICAgIDB4ZTcsIDB4M2MsIDB4OWUsIDB4MzgsIDB4ZDgsIDB4MDgsIDB4NDIsIDB4MDMsIDB4YWUsIDB4YmMsIDB4MTksIDB4ZjEsIDB4MmIsIDB4ZTEsIDB4N2YsIDB4MmYsCisgICAgICAgICAgICAgICAgMHhkNiwgMHgxZSwgMHhkYSwgMHg4ZiwgMHhmMiwgMHgwZSwgMHg4OCwgMHg5ZSwgMHgwNywgMHg3NiwgMHg2YSwgMHhkOCwgMHhkZSwgMHhmYSwgMHhhYywgMHgwOCwKKyAgICAgICAgICAgICAgICAweDA2LCAweDM0LCAweDE1LCAweDE4LCAweGY0LCAweDA5LCAweDQ3LCAweDRlLCAweDc2LCAweDkxLCAweGZjLCAweDUzLCAweDAzLCAweGVkLCAweGM3LCAweDUzLAorICAgICAgICAgICAgICAgIDB4OWUsIDB4YmMsIDB4YzcsIDB4NWUsIDB4MTcsIDB4ZDQsIDB4MTgsIDB4MjksIDB4MDQsIDB4YjYsIDB4ZTksIDB4NTcsIDB4OTcsIDB4NWEsIDB4MzYsIDB4NjEsCisgICAgICAgICAgICAgICAgMHhmNywgMHgzYSwgMHg0NywgMHg2MiwgMHgyNCwgMHhiOCwgMHg1MywgMHg0NCwgMHg0MSwgMHgyMiwgMHhiOCwgMHg0ZCwgMHg3NSwgMHg4OSwgMHhlMiwgMHhjZSwKKyAgICAgICAgICAgICAgICAweDAxLCAweDNhLCAweGNlLCAweDMzLCAweGQwLCAweGE2LCAweDE4LCAweGQ0LCAweDNlLCAweDUxLCAweDAyLCAweGJjLCAweDAyLCAweDAxLCAweDI2LCAweDhlLAorICAgICAgICAgICAgICAgIDB4NDQsIDB4OTcsIDB4YTYsIDB4MmEsIDB4ZDMsIDB4ZTEsIDB4NDMsIDB4YmIsIDB4YTYsIDB4ZWEsIDB4MTUsIDB4M2IsIDB4ZWIsIDB4YWIsIDB4ZjYsIDB4ZmUsCisgICAgICAgICAgICAgICAgMHg1ZCwgMHhlNywgMHg0YywgMHg4ZiwgMHgxNiwgMHg0NywgMHhkZCwgMHhmNiwgMHhkZCwgMHhlNCwgMHg1YSwgMHg0NywgMHg4YywgMHg2ZCwgMHgxYywgMHg2NiwKKyAgICAgICAgICAgICAgICAweGZiLCAweDZjLCAweDAwLCAweGUyLCAweGY2LCAweDc5LCAweGFlLCAweDM1LCAweDRlLCAweDgxLCAweGM4LCAweGRkLCAweGQ2LCAweGI4LCAweDMxLCAweDUyLAorICAgICAgICAgICAgICAgIDB4NGQsIDB4ZWUsIDB4NmIsIDB4NjYsIDB4ZjEsIDB4MTcsIDB4MWMsIDB4MzQsIDB4YTIsIDB4OWMsIDB4MWIsIDB4OWQsIDB4MGYsIDB4MjksIDB4MjMsIDB4OWUsCisgICAgICAgICAgICAgICAgMHhmMSwgMHhhOCwgMHg0YSwgMHg0NCwgMHg1ZCwgMHg4ZCwgMHg2ZCwgMHg3NSwgMHgxNSwgMHhlNiwgMHgyOSwgMHgzZCwgMHhmOSwgMHgxMCwgMHg3ZCwgMHgyYywKKyAgICAgICAgICAgICAgICAweDAyLCAweGIzLCAweDQyLCAweDI4LCAweGZlLCAweDcwLCAweDNkLCAweDBmLCAweDVhLCAweGFjLCAweDVkLCAweDgxLCAweDZlLCAweGVhLCAweGI5LCAweDA1LAorICAgICAgICAgICAgICAgIDB4OTQsIDB4MmEsIDB4YWYsIDB4YzUsIDB4NmEsIDB4MGQsIDB4OTAsIDB4NzIsIDB4YmYsIDB4MTcsIDB4MzQsIDB4MjgsIDB4NGMsIDB4OTIsIDB4M2IsIDB4Y2YsCisgICAgICAgICAgICAgICAgMHhiYywgMHg0NSwgMHhjMSwgMHhiNSwgMHhhYywgMHgxZCwgMHg2MCwgMHg2ZiwgMHhjZSwgMHg3YywgMHhlNiwgMHg4MSwgMHgzMywgMHg1YywgMHgzMCwgMHhkZiwKKyAgICAgICAgICAgICAgICAweGFlLCAweDgwLCAweDhkLCAweDFkLCAweGMzLCAweDY2LCAweDk2LCAweGY0LCAweDU5LCAweDA4LCAweDE1LCAweDEzLCAweDA5LCAweDI4LCAweDNiLCAweDE1LAorICAgICAgICAgICAgICAgIDB4NDIsIDB4NzgsIDB4MTUsIDB4YTcsIDB4MTQsIDB4NzMsIDB4MjUsIDB4OTgsIDB4ZTUsIDB4MWQsIDB4OTMsIDB4ZjAsIDB4YTIsIDB4N2UsIDB4M2QsIDB4ZGYsCisgICAgICAgICAgICAgICAgMHg1MywgMHhjYywgMHgzMiwgMHhiMSwgMHg1NCwgMHg1NSwgMHhlMSwgMHhiNSwgMHg4OCwgMHg0NiwgMHg3NSwgMHhjYywgMHg2MSwgMHg3MSwgMHg3MSwgMHgxMSwKKyAgICAgICAgICAgICAgICAweGQ1LCAweDc0LCAweDk5LCAweDJjLCAweGY5LCAweDY3LCAweDRhLCAweDdkLCAweDcwLCAweGZiLCAweGE0LCAweDhiLCAweDBlLCAweGE4LCAweDRkLCAweDBiLAorICAgICAgICAgICAgICAgIDB4NWIsIDB4ZDUsIDB4OGQsIDB4YTUsIDB4YjMsIDB4YjgsIDB4ZGEsIDB4MmQsIDB4MzYsIDB4ZjQsIDB4ODAsIDB4M2MsIDB4ZGUsIDB4YmQsIDB4MjksIDB4YTIsCisgICAgICAgICAgICAgICAgMHhlNiwgMHg1NywgMHhjNywgMHgwYiwgMHgyYSwgMHg4ZiwgMHg2NywgMHgzNywgMHhmYiwgMHhkNiwgMHg1ZiwgMHhjYiwgMHhkZSwgMHhiNSwgMHg0ZSwgMHgyYiwKKyAgICAgICAgICAgICAgICAweDRiLCAweDFhLCAweDFiLCAweDY3LCAweGRjLCAweDRiLCAweDNlLCAweGQ1LCAweDJiLCAweDNmLCAweDk2LCAweDU3LCAweDAwLCAweGEzLCAweGI0LCAweDVhLAorICAgICAgICAgICAgICAgIDB4MzAsIDB4NWQsIDB4MjUsIDB4MWEsIDB4YTYsIDB4NDksIDB4M2UsIDB4ZDYsIDB4ZDUsIDB4NGUsIDB4MTgsIDB4OWQsIDB4ZTAsIDB4ODgsIDB4ZTcsIDB4ZDEsCisgICAgICAgICAgICAgICAgMHhjMCwgMHgwOSwgMHg5OCwgMHgyZCwgMHgxYSwgMHg3YiwgMHhlZSwgMHhkYSwgMHhjNCwgMHgzNSwgMHhiYSwgMHg2MCwgMHg2NiwgMHg3MiwgMHgyMCwgMHgxZiwKKyAgICAgICAgICAgICAgICAweDE2LCAweDlmLCAweGE3LCAweGMzLCAweDk2LCAweDk0LCAweDIyLCAweDcwLCAweDA1LCAweDFlLCAweDA4LCAweDYzLCAweDhmLCAweGQ4LCAweDg1LCAweDcxLAorICAgICAgICAgICAgICAgIDB4OTQsIDB4YjQsIDB4MjYsIDB4NGQsIDB4N2MsIDB4Y2QsIDB4NDYsIDB4OTAsIDB4NmEsIDB4MDcsIDB4MmMsIDB4MDgsIDB4ZTUsIDB4YTcsIDB4MDQsIDB4MDUsCisgICAgICAgICAgICAgICAgMHhlZCwgMHgyZCwgMHhlYSwgMHgwZSwgMHhjMSwgMHg2OSwgMHg2YSwgMHhhNSwgMHg1NywgMHg0MSwgMHhiMCwgMHg5MSwgMHhkZiwgMHhlMiwgMHg1MiwgMHhhZCwKKyAgICAgICAgICAgICAgICAweDY4LCAweDE5LCAweGVmLCAweDJmLCAweDhmLCAweDRiLCAweDY1LCAweGVhLCAweDRhLCAweGU3LCAweDAwLCAweDJlLCAweGZkLCAweDdjLCAweGQ4LCAweDBiLAorICAgICAgICAgICAgICAgIDB4ZjksIDB4MWUsIDB4OTgsIDB4NDQsIDB4MWIsIDB4ZGMsIDB4N2UsIDB4NWUsIDB4ZmUsIDB4ZjMsIDB4M2QsIDB4YTUsIDB4YmEsIDB4NWYsIDB4M2IsIDB4MzcsCisgICAgICAgICAgICAgICAgMHg2NCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMywgMHhhNSwgMHhmZiwgMHhmZiwgMHhmYywgMHg1YSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg0MSwgMHg0ZCwKKyAgICAgICAgICAgICAgICAweDRjLCAweDU2LCAweDg2LCAweDAwLCAweDQwLCAweDkyLCAweGUxLCAweDQxLCAweDU2LCAweDAwLCAweDAwLCAweDBjLCAweDcwLCAweDAwLCAweDAwLCAweDdkLAorICAgICAgICAgICAgICAgIDB4OWMsIDB4ZTEsIDB4ZjYsIDB4MWQsIDB4NzAsIDB4NjcsIDB4ZjYsIDB4ZjYsIDB4ZjgsIDB4YzMsIDB4ZmYsIDB4NmUsIDB4ZWEsIDB4YjcsIDB4NGUsIDB4MWQsCisgICAgICAgICAgICAgICAgMHhhMCwgMHhmNiwgMHhhNywgMHg2NSwgMHg3MywgMHg5NywgMHhkOSwgMHhkMSwgMHhkYywgMHg1ZiwgMHhjMSwgMHg1YSwgMHhmMywgMHg2YywgMHg1YiwgMHhmOSwKKyAgICAgICAgICAgICAgICAweDZhLCAweDVhLCAweDg3LCAweGRjLCAweGQ1LCAweDZkLCAweDZjLCAweGQ2LCAweDQ4LCAweDI5LCAweDJhLCAweDk0LCAweDk5LCAweGVhLCAweGM5LCAweGQwLAorICAgICAgICAgICAgICAgIDB4ZjcsIDB4MDYsIDB4MTMsIDB4ZjcsIDB4Y2QsIDB4ZGEsIDB4MDMsIDB4YzIsIDB4OTUsIDB4MmUsIDB4OGMsIDB4YTgsIDB4NGMsIDB4ZjMsIDB4ZDUsIDB4MTEsCisgICAgICAgICAgICAgICAgMHgzOCwgMHgzMSwgMHg2ZiwgMHhkOCwgMHgxNiwgMHhlYiwgMHhkNSwgMHg3MiwgMHhhYywgMHg2MiwgMHhjMiwgMHhkOSwgMHhmNywgMHg2ZiwgMHhiYiwgMHhmYywKKyAgICAgICAgICAgICAgICAweDRiLCAweDEyLCAweDQ2LCAweGQ3LCAweGM2LCAweDIzLCAweDAwLCAweGI0LCAweDJhLCAweGU0LCAweDE4LCAweDQ1LCAweGE2LCAweGYyLCAweDBhLCAweDFjLAorICAgICAgICAgICAgICAgIDB4YTYsIDB4OGEsIDB4YzcsIDB4MzAsIDB4M2QsIDB4NzMsIDB4YTEsIDB4ZmIsIDB4NDcsIDB4MDcsIDB4MTgsIDB4ZjQsIDB4NjMsIDB4MzMsIDB4NDQsIDB4YTcsCisgICAgICAgICAgICAgICAgMHg3ZSwgMHhkYiwgMHhkNiwgMHgyNSwgMHhkNSwgMHgxYiwgMHg1YSwgMHg2NywgMHg0NiwgMHg2YiwgMHg4ZCwgMHg5MSwgMHgwOSwgMHg3ZCwgMHhmNCwgMHgyYywKKyAgICAgICAgICAgICAgICAweGM3LCAweDQ1LCAweGExLCAweGNlLCAweDZlLCAweDkwLCAweDBmLCAweDM2LCAweGE0LCAweDU3LCAweDQ5LCAweDdjLCAweDAzLCAweDFiLCAweDYyLCAweDMzLAorICAgICAgICAgICAgICAgIDB4MDksIDB4MDUsIDB4NTksIDB4Y2EsIDB4ZGQsIDB4ZmIsIDB4MTMsIDB4NGEsIDB4NTgsIDB4ZmMsIDB4ZGMsIDB4OGYsIDB4NWUsIDB4ZGEsIDB4MjAsIDB4N2QsCisgICAgICAgICAgICAgICAgMHgxZiwgMHg2YSwgMHg4MCwgMHgwMSwgMHgwMSwgMHhlYSwgMHg0ZCwgMHhmYywgMHhlNCwgMHg4ZCwgMHg5MCwgMHhiMCwgMHhmMSwgMHhhMSwgMHgxNiwgMHg0NywKKyAgICAgICAgICAgICAgICAweDE5LCAweDRmLCAweGFiLCAweDRmLCAweDM4LCAweDMyLCAweGM4LCAweDE3LCAweGIyLCAweDk5LCAweGVkLCAweDcxLCAweDViLCAweDVjLCAweDcyLCAweGRhLAorICAgICAgICAgICAgICAgIDB4NjQsIDB4NmUsIDB4YzUsIDB4MTMsIDB4NWIsIDB4NTEsIDB4ZjMsIDB4NDYsIDB4MDQsIDB4MjYsIDB4Y2MsIDB4NDcsIDB4YTAsIDB4NDQsIDB4OTEsIDB4NGMsCisgICAgICAgICAgICAgICAgMHg3NSwgMHg1NywgMHhiZSwgMHhiNiwgMHg4OCwgMHg0OSwgMHg2YywgMHg0YSwgMHhlYywgMHhkMCwgMHg2NSwgMHgzZiwgMHhmMCwgMHhjMiwgMHgxNSwgMHgyOCwKKyAgICAgICAgICAgICAgICAweDUxLCAweDI4LCAweDgzLCAweGZkLCAweGZjLCAweDg2LCAweDBmLCAweDZiLCAweGMxLCAweDIwLCAweDYwLCAweDU3LCAweGJiLCAweDE1LCAweDRjLCAweDAxLAorICAgICAgICAgICAgICAgIDB4MDcsIDB4YzksIDB4MmYsIDB4OGUsIDB4MTksIDB4YzEsIDB4ZWYsIDB4NzMsIDB4NjUsIDB4M2EsIDB4OWUsIDB4MDAsIDB4NGYsIDB4MDMsIDB4ODgsIDB4N2MsCisgICAgICAgICAgICAgICAgMHhjMywgMHgwNCwgMHgyYiwgMHgxNiwgMHhlZSwgMHhmMSwgMHgzNywgMHg0MiwgMHg2ZSwgMHgwNSwgMHg5MywgMHg5OCwgMHg2NSwgMHg1MSwgMHhlZiwgMHg1YiwKKyAgICAgICAgICAgICAgICAweGIzLCAweGU2LCAweDBhLCAweDA4LCAweGFkLCAweDAyLCAweGMyLCAweGZhLCAweGZjLCAweGM3LCAweDBlLCAweDM5LCAweDc0LCAweDU0LCAweGVmLCAweGYwLAorICAgICAgICAgICAgICAgIDB4ZGMsIDB4N2IsIDB4MTksIDB4Y2UsIDB4MzUsIDB4NzQsIDB4ZTAsIDB4MzUsIDB4NWMsIDB4ZjMsIDB4MjMsIDB4ZTgsIDB4YzUsIDB4NzEsIDB4OWYsIDB4NjMsCisgICAgICAgICAgICAgICAgMHg0YywgMHgzZiwgMHhiOSwgMHg2NCwgMHhjZCwgMHgzNywgMHg3ZCwgMHg1OSwgMHgyOCwgMHgzNywgMHg4MywgMHgwNiwgMHhjYiwgMHg0ZiwgMHgyMiwgMHhmOSwKKyAgICAgICAgICAgICAgICAweDAzLCAweDg1LCAweDJhLCAweDE4LCAweGM3LCAweGIwLCAweGI3LCAweDI3LCAweDNlLCAweGM0LCAweDhhLCAweGExLCAweGJlLCAweGY2LCAweGUwLCAweDMxLAorICAgICAgICAgICAgICAgIDB4NzUsIDB4NGIsIDB4ZmUsIDB4NzAsIDB4OTYsIDB4ODIsIDB4OGUsIDB4ZmUsIDB4ODIsIDB4OGMsIDB4ZDYsIDB4NjQsIDB4MDIsIDB4OTYsIDB4ZWQsIDB4ZGYsCisgICAgICAgICAgICAgICAgMHgxNCwgMHgwNCwgMHgyNywgMHhhMiwgMHg3YiwgMHgyYywgMHhlMCwgMHhkNCwgMHgxZSwgMHg2MSwgMHgwZSwgMHgwZiwgMHgyZCwgMHg1ZiwgMHg5MywgMHhmYywKKyAgICAgICAgICAgICAgICAweDg5LCAweGYxLCAweGZlLCAweGFmLCAweGE0LCAweGRhLCAweDUzLCAweDE4LCAweDEyLCAweGM0LCAweDBjLCAweGQ5LCAweDE1LCAweDQ3LCAweDYwLCAweDMxLAorICAgICAgICAgICAgICAgIDB4YzgsIDB4ZWEsIDB4OWQsIDB4MzMsIDB4NzgsIDB4OTEsIDB4YmYsIDB4ZTMsIDB4YzksIDB4ZTEsIDB4ZGMsIDB4MjYsIDB4ZTksIDB4ZjgsIDB4NzAsIDB4NTUsCisgICAgICAgICAgICAgICAgMHg4ZiwgMHgyYiwgMHhhOCwgMHg1YiwgMHg0YywgMHgxMSwgMHg3ZCwgMHhkMSwgMHhhMSwgMHhlMiwgMHhkMCwgMHhiYSwgMHhlNiwgMHg2MiwgMHgzNiwgMHg2NywKKyAgICAgICAgICAgICAgICAweGU5LCAweDVmLCAweDAxLCAweDA1LCAweDcxLCAweDI5LCAweGJhLCAweDMxLCAweDM2LCAweGJlLCAweDRiLCAweGMwLCAweDQzLCAweGE0LCAweGIyLCAweDlmLAorICAgICAgICAgICAgICAgIDB4MDksIDB4YTYsIDB4YzQsIDB4OWIsIDB4ZmQsIDB4MWYsIDB4NDYsIDB4M2MsIDB4NDQsIDB4NDgsIDB4M2MsIDB4YzcsIDB4NTgsIDB4MzQsIDB4N2UsIDB4ZmEsCisgICAgICAgICAgICAgICAgMHg4YiwgMHg3MywgMHhlZSwgMHgwZSwgMHgwNCwgMHg5ZSwgMHgwMSwgMHgxMCwgMHgwYSwgMHhlMSwgMHg5ZiwgMHgxNSwgMHg5MiwgMHhiMywgMHg4YiwgMHg5YywKKyAgICAgICAgICAgICAgICAweDEwLCAweDJmLCAweGZhLCAweGIzLCAweDhkLCAweDIxLCAweDQ4LCAweDRkLCAweDgyLCAweDQ1LCAweDBiLCAweDg5LCAweDQ3LCAweGExLCAweGQyLCAweDdjLAorICAgICAgICAgICAgICAgIDB4ZWIsIDB4MzAsIDB4NDQsIDB4NTEsIDB4ZGQsIDB4NjQsIDB4YjgsIDB4N2UsIDB4M2MsIDB4Y2UsIDB4YzksIDB4NWIsIDB4ZjEsIDB4OGEsIDB4ZjksIDB4YWQsCisgICAgICAgICAgICAgICAgMHg2MiwgMHhlOSwgMHg3ZiwgMHgwNiwgMHg1NiwgMHgzMSwgMHhiMywgMHhhZSwgMHhiMywgMHg3ZCwgMHg4ZSwgMHgxMSwgMHhhNCwgMHg0ZSwgMHhiZCwgMHg0NiwKKyAgICAgICAgICAgICAgICAweGMzLCAweDAxLCAweGNlLCAweDEzLCAweGIwLCAweDNjLCAweDJkLCAweDZjLCAweDdjLCAweGJkLCAweGEzLCAweDAwLCAweDFlLCAweDU5LCAweDFmLCAweDkyLAorICAgICAgICAgICAgICAgIDB4NDksIDB4MTYsIDB4YmQsIDB4NGIsIDB4MWUsIDB4MjQsIDB4MjMsIDB4NGMsIDB4OTEsIDB4YjksIDB4YjUsIDB4ZjIsIDB4NTgsIDB4NzYsIDB4MmYsIDB4Y2IsCisgICAgICAgICAgICAgICAgMHhkYSwgMHhkNCwgMHhlNCwgMHhlMCwgMHg1YiwgMHgzMiwgMHg5MywgMHg1MywgMHg0MCwgMHg5NCwgMHhlMSwgMHg3YiwgMHgxMiwgMHhiNywgMHhhYSwgMHhiYSwKKyAgICAgICAgICAgICAgICAweDcwLCAweDkzLCAweDI2LCAweDkzLCAweDdkLCAweDY4LCAweDVmLCAweGRhLCAweDRmLCAweDMzLCAweGFjLCAweGM0LCAweGY5LCAweDRiLCAweGNiLCAweGIwLAorICAgICAgICAgICAgICAgIDB4OGUsIDB4N2EsIDB4ZGEsIDB4NjUsIDB4ZGYsIDB4NWYsIDB4MzEsIDB4YmIsIDB4MzYsIDB4MGQsIDB4ZGYsIDB4ZDQsIDB4OGMsIDB4ZjAsIDB4ZDUsIDB4YTgsCisgICAgICAgICAgICAgICAgMHg5ZCwgMHgzYywgMHg4OSwgMHgzZCwgMHgxYywgMHgwZSwgMHgyNSwgMHg4ZSwgMHg1YSwgMHhjOSwgMHg2OCwgMHgzOCwgMHhjZCwgMHg3NCwgMHg1YywgMHgyYSwKKyAgICAgICAgICAgICAgICAweGI3LCAweDA2LCAweDdiLCAweDhmLCAweDBjLCAweDExLCAweDQzLCAweDllLCAweDEzLCAweDYxLCAweGRjLCAweDcyLCAweDA5LCAweDkyLCAweDNlLCAweDVmLAorICAgICAgICAgICAgICAgIDB4OWUsIDB4YWYsIDB4NWYsIDB4NWQsIDB4NjksIDB4MjUsIDB4ZjUsIDB4MjMsIDB4NzQsIDB4NzQsIDB4YWIsIDB4YzIsIDB4MmYsIDB4OTQsIDB4YWMsIDB4YTksCisgICAgICAgICAgICAgICAgMHhlZiwgMHhjZCwgMHhmNiwgMHg0OCwgMHg3NywgMHg5MSwgMHhiYiwgMHg0ZiwgMHhjOCwgMHg1NywgMHg4ZiwgMHgxYywgMHhjNiwgMHgwOSwgMHhkZSwgMHhjYiwKKyAgICAgICAgICAgICAgICAweDRmLCAweGRjLCAweDZmLCAweGY5LCAweGNjLCAweGNjLCAweGQxLCAweGNlLCAweDlhLCAweGI2LCAweDRhLCAweDE2LCAweGViLCAweDVjLCAweDU0LCAweDI2LAorICAgICAgICAgICAgICAgIDB4NDgsIDB4ZTgsIDB4ODUsIDB4OWEsIDB4NTMsIDB4ZGYsIDB4YjMsIDB4YWQsIDB4OWQsIDB4NTksIDB4NzcsIDB4ZGMsIDB4Y2EsIDB4YTcsIDB4MWQsIDB4YzIsCisgICAgICAgICAgICAgICAgMHgzOSwgMHg2MCwgMHhkMywgMHhiOCwgMHhiOSwgMHhkOSwgMHg1MSwgMHhmOCwgMHgzNCwgMHgyNiwgMHhjZSwgMHg4NywgMHhiOCwgMHg4NywgMHg5YSwgMHhiMCwKKyAgICAgICAgICAgICAgICAweGE2LCAweDZmLCAweGJhLCAweGU2LCAweGZmLCAweGEwLCAweGZmLCAweDU3LCAweDRiLCAweGRlLCAweDIwLCAweDVmLCAweDcxLCAweGFkLCAweGMzLCAweGFkLAorICAgICAgICAgICAgICAgIDB4ZDUsIDB4MTIsIDB4ZWUsIDB4YWQsIDB4ZDMsIDB4M2IsIDB4ZGYsIDB4NmUsIDB4YTMsIDB4MzgsIDB4YzAsIDB4ODcsIDB4MzksIDB4M2UsIDB4Y2UsIDB4ZmUsCisgICAgICAgICAgICAgICAgMHhmZSwgMHg3MiwgMHg4NCwgMHgxYywgMHhlNywgMHhmZCwgMHhhYywgMHg4OCwgMHhhYiwgMHg3OSwgMHg3MywgMHg5NywgMHhjNCwgMHgyZCwgMHgyYiwgMHhmMywKKyAgICAgICAgICAgICAgICAweGEzLCAweDY5LCAweDU1LCAweDY0LCAweDI1LCAweDFhLCAweDMyLCAweGUwLCAweDU3LCAweGMxLCAweDEwLCAweDE4LCAweDBkLCAweGRiLCAweDIwLCAweDZjLAorICAgICAgICAgICAgICAgIDB4YTIsIDB4M2QsIDB4YzksIDB4YmYsIDB4OTMsIDB4MmUsIDB4NmEsIDB4NmYsIDB4YWMsIDB4YTMsIDB4OWEsIDB4YzksIDB4ZTgsIDB4NmEsIDB4ZDMsIDB4ZmUsCisgICAgICAgICAgICAgICAgMHg0MywgMHgwNSwgMHg5ZCwgMHhhMCwgMHgyMSwgMHhhOSwgMHhiZSwgMHhlOSwgMHg4NywgMHgwNiwgMHg3NSwgMHhlMywgMHg5ZSwgMHhlZSwgMHg0MCwgMHg5MywKKyAgICAgICAgICAgICAgICAweDlkLCAweDIxLCAweGVjLCAweGU5LCAweGRjLCAweDE3LCAweDYyLCAweGY0LCAweGZjLCAweDc0LCAweDRmLCAweGYyLCAweGYyLCAweDViLCAweGVkLCAweDczLAorICAgICAgICAgICAgICAgIDB4OTMsIDB4NzksIDB4NjYsIDB4ZjgsIDB4NmIsIDB4MzgsIDB4YjEsIDB4YmUsIDB4MjksIDB4MTEsIDB4M2YsIDB4NTIsIDB4NzgsIDB4N2MsIDB4YWIsIDB4YjcsCisgICAgICAgICAgICAgICAgMHg5YSwgMHg5ZSwgMHgwYSwgMHhmYSwgMHgyOSwgMHgwZiwgMHg0MSwgMHg0NCwgMHhkMiwgMHhkNiwgMHgzOCwgMHhiYiwgMHgxMSwgMHg4MywgMHgyNSwgMHhmOSwKKyAgICAgICAgICAgICAgICAweGY4LCAweDJhLCAweDdjLCAweDRhLCAweDcyLCAweGExLCAweDQyLCAweDU0LCAweDQxLCAweGJkLCAweDNhLCAweDZmLCAweDdlLCAweDNhLCAweGM2LCAweGVlLAorICAgICAgICAgICAgICAgIDB4NDUsIDB4ZjAsIDB4OTAsIDB4ZTUsIDB4ODYsIDB4NmUsIDB4OTEsIDB4YmMsIDB4MzUsIDB4MjEsIDB4NDcsIDB4YTAsIDB4MGEsIDB4MmQsIDB4ZDIsIDB4NWMsCisgICAgICAgICAgICAgICAgMHhiYywgMHg4MywgMHgyMSwgMHg4YiwgMHg3NCwgMHhiMSwgMHgxMSwgMHg4NiwgMHg2MCwgMHgwMCwgMHhhYiwgMHg1YiwgMHg0ZiwgMHgwOCwgMHgyNiwgMHhjZSwKKyAgICAgICAgICAgICAgICAweGNlLCAweGU1LCAweDM2LCAweDAyLCAweDBkLCAweDQyLCAweDM1LCAweDFlLCAweDRkLCAweDI4LCAweDZlLCAweGMwLCAweGU0LCAweDRhLCAweDFjLCAweDJjLAorICAgICAgICAgICAgICAgIDB4N2IsIDB4OTMsIDB4ODAKKyNlbHNlCisgICAgICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgzNCwgMHhmZiwgMHhmZiwgMHhmZSwgMHhjYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg0MSwgMHg0ZCwgMHg0YywgMHg1NiwKKyAgICAgICAgICAgICAgICAweDgyLCAweDQ5LCAweDgzLCAweDQyLCAweDAwLCAweDA0LCAweDEwLCAweDA0LCAweDE0LCAweDBlLCAweDM4LCAweDI0LCAweDFjLCAweDE5LCAweGJhLCAweDAwLAorICAgICAgICAgICAgICAgIDB4MDAsIDB4OTAsIDB4N2MsIDB4MTEsIDB4YjQsIDB4Y2MsIDB4N2UsIDB4MTksIDB4ODYsIDB4MDAsIDB4MDAsIDB4N2YsIDB4YzMsIDB4YjYsIDB4MzUsIDB4NTQsCisgICAgICAgICAgICAgICAgMHg0NSwgMHgzOCwgMHgxMiwgMHhlMiwgMHhkNywgMHhhOSwgMHgxYiwgMHg0OSwgMHhlZiwgMHhjNiwgMHhmYywgMHgxNCwgMHgzNCwgMHg0MSwgMHhjNywgMHhhMywKKyAgICAgICAgICAgICAgICAweDkxLCAweGY0LCAweDc2LCAweDhhLCAweDE5LCAweDZiLCAweGIwLCAweGE0LCAweGEwLCAweDA0LCAweDEzLCAweGIwLCAweGJlLCAweDEwLCAweDcyLCAweDgwLAorICAgICAgICAgICAgICAgIDB4MGEsIDB4NTgsIDB4YmMsIDB4MTgsIDB4ZjIsIDB4ZDAsIDB4NGYsIDB4NjIsIDB4MWIsIDB4ZWEsIDB4YzIsIDB4MGIsIDB4YmEsIDB4ZmMsIDB4N2IsIDB4YmMsCisgICAgICAgICAgICAgICAgMHhiMywgMHg2YSwgMHg5NywgMHgxNSwgMHgxZiwgMHgzYywgMHgyMSwgMHg0ZSwgMHgzZiwgMHhhMiwgMHhlOSwgMHhlOSwgMHhmYywgMHg5MiwgMHhjMywgMHhlNywKKyAgICAgICAgICAgICAgICAweDdkLCAweGIyLCAweDA4LCAweDg3LCAweDk4LCAweDhlLCAweDc3LCAweDBmLCAweDA5LCAweDdiLCAweGE3LCAweDQxLCAweDQyLCAweGZmLCAweDE0LCAweGExLAorICAgICAgICAgICAgICAgIDB4MGUsIDB4ZjMsIDB4MjgsIDB4MmQsIDB4ZTEsIDB4MTMsIDB4NzMsIDB4NDksIDB4MjYsIDB4ZWQsIDB4ODgsIDB4MjIsIDB4ODIsIDB4NmEsIDB4MDIsIDB4ODcsCisgICAgICAgICAgICAgICAgMHhhNSwgMHhiZSwgMHg5YywgMHhlNSwgMHgzZiwgMHhjNywgMHhiNSwgMHg2NSwgMHgzZiwgMHg3ZSwgMHhhMiwgMHg4MiwgMHgzZSwgMHgyMiwgMHhhMSwgMHgwMywKKyAgICAgICAgICAgICAgICAweGUxLCAweGNkLCAweDg5LCAweGU2LCAweGYwLCAweDQ3LCAweDYyLCAweDgxLCAweDg5LCAweGFhLCAweDdlLCAweGJjLCAweDRhLCAweGMxLCAweDdjLCAweDI2LAorICAgICAgICAgICAgICAgIDB4ZTQsIDB4YzAsIDB4ZDQsIDB4YmMsIDB4YjgsIDB4Y2MsIDB4YjgsIDB4NDQsIDB4MDcsIDB4NTEsIDB4YjQsIDB4YjMsIDB4YjksIDB4ZjUsIDB4MDQsIDB4YWYsCisgICAgICAgICAgICAgICAgMHgzZiwgMHg0MSwgMHg0OSwgMHg1NiwgMHg2YSwgMHg4NywgMHg0NiwgMHg5NSwgMHhhMSwgMHhlNywgMHg2OSwgMHhlNywgMHgzYywgMHgzMiwgMHgwNiwgMHhjMiwKKyAgICAgICAgICAgICAgICAweGEyLCAweDY2LCAweDQ4LCAweDFmLCAweDE0LCAweDQzLCAweDgxLCAweGYwLCAweGEwLCAweDNjLCAweGE0LCAweDgyLCAweDdmLCAweDE4LCAweDliLCAweGU0LAorICAgICAgICAgICAgICAgIDB4MjIsIDB4MmQsIDB4NjQsIDB4MmEsIDB4ZDAsIDB4NGQsIDB4YjQsIDB4ZmQsIDB4MTQsIDB4MmQsIDB4NmQsIDB4NjgsIDB4YWYsIDB4MTksIDB4N2QsIDB4MGYsCisgICAgICAgICAgICAgICAgMHgwZiwgMHg2MCwgMHhjNCwgMHg5MiwgMHg3MywgMHgzNCwgMHhjOSwgMHg1MSwgMHg5YSwgMHhiNiwgMHhhYywgMHgwNiwgMHg5MCwgMHhhZiwgMHgxMSwgMHgyMSwKKyAgICAgICAgICAgICAgICAweDBjLCAweGIwLCAweDAyLCAweGQ5LCAweGQ3LCAweGQxLCAweDA2LCAweGEwLCAweDA1LCAweGI2LCAweDc1LCAweDcwLCAweDVkLCAweGJjLCAweDg0LCAweDk5LAorICAgICAgICAgICAgICAgIDB4MDgsIDB4ZmQsIDB4OGIsIDB4NjAsIDB4MzMsIDB4ZjUsIDB4MGYsIDB4YWIsIDB4NDIsIDB4YWIsIDB4NjMsIDB4MWEsIDB4MzcsIDB4MWMsIDB4NWEsIDB4ODksCisgICAgICAgICAgICAgICAgMHhjMSwgMHg1ZiwgMHg0MywgMHg1YywgMHg2NSwgMHg2MywgMHg2MCwgMHhjNCwgMHhjYSwgMHhlOSwgMHg1OSwgMHg3MiwgMHhlYSwgMHg5MywgMHhmOSwgMHhjYiwKKyAgICAgICAgICAgICAgICAweDBkLCAweDk2LCAweDVlLCAweDMzLCAweDIxLCAweGE5LCAweGUxLCAweGYxLCAweDM3LCAweGNjLCAweDFiLCAweDNjLCAweDk5LCAweDM2LCAweDc4LCAweDQwLAorICAgICAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ODksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NDEsIDB4NGQsIDB4NGMsIDB4NTYsCisgICAgICAgICAgICAgICAgMHg4NCwgMHgwMCwgMHg4MCwgMHg0OSwgMHg3MiwgMHg1OCwgMHhiYSwgMHgwMCwgMHgwMCwgMHgwNiwgMHg3MCwgMHgwMCwgMHgwMCwgMHg3ZiwgMHgwYSwgMHg1NSwKKyAgICAgICAgICAgICAgICAweDY0LCAweDFmLCAweDc3LCAweDIyLCAweDExLCAweDY0LCAweDg2LCAweDQxLCAweDJlLCAweDc1LCAweGUzLCAweGJhLCAweDI0LCAweGY3LCAweDAyLCAweGFhLAorICAgICAgICAgICAgICAgIDB4MWYsIDB4OWEsIDB4OTcsIDB4ODQsIDB4MjQsIDB4ODMsIDB4YTgsIDB4YTMsIDB4OTIsIDB4MWMsIDB4OWMsIDB4ZTcsIDB4ODUsIDB4NzEsIDB4MTgsIDB4NDksCisgICAgICAgICAgICAgICAgMHhjNSwgMHgwOSwgMHgzNiwgMHhmMCwgMHg5ZSwgMHgwNCwgMHg4NCwgMHg4OCwgMHhhMCwgMHhhZCwgMHg5YywgMHg4ZSwgMHg3NSwgMHg5ZCwgMHgwOCwgMHhmYiwKKyAgICAgICAgICAgICAgICAweGFiLCAweGZkLCAweDNkLCAweDY4LCAweGRkLCAweDE0LCAweDkzLCAweDUwLCAweGEzLCAweDQ4LCAweDk2LCAweGY3LCAweGU2LCAweGE0LCAweDU0LCAweDYyLAorICAgICAgICAgICAgICAgIDB4M2IsIDB4MzEsIDB4MTgsIDB4NTcsIDB4ZWYsIDB4M2IsIDB4YjcsIDB4OTgsIDB4OGUsIDB4ZTksIDB4M2IsIDB4ZGYsIDB4NjMsIDB4MGMsIDB4ZmEsIDB4NWQsCisgICAgICAgICAgICAgICAgMHgzMCwgMHg1MSwgMHg0ZSwgMHg2MSwgMHgwNiwgMHhmOSwgMHgxZiwgMHhlNSwgMHhjNSwgMHg5MCwgMHhiMCwgMHg4MCwgMHg3YywgMHhhMCwgMHgwNCwgMHg5OCwKKyAgICAgICAgICAgICAgICAweDViLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDMwLCAweGZmLCAweGZmLCAweGZmLCAweGNmLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDQxLCAweDRkLAorICAgICAgICAgICAgICAgIDB4NGMsIDB4NTYsIDB4ODYsIDB4MDAsIDB4NDAsIDB4OTYsIDB4NjEsIDB4ZjEsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MjMsIDB4MTgsIDB4MDAsIDB4N2MsCisgICAgICAgICAgICAgICAgMHhjMSwgMHg0NiwgMHhhYiwgMHg0NSwgMHgyNSwgMHg2NiwgMHg5ZCwgMHg2ZiwgMHhhNywgMHgxOCwgMHg4MiwgMHhiYywgMHhjMywgMHhkNSwgMHhhMCwgMHhiYSwKKyAgICAgICAgICAgICAgICAweDQyLCAweDA0LCAweDQ5LCAweDdkLCAweDIwLCAweGIzLCAweDBmLCAweDRjLCAweDc4LCAweDRjLCAweGFlLCAweDliLCAweDIwLCAweDAwLCAweDAwLCAweDAwLAorICAgICAgICAgICAgICAgIDB4MDAsIDB4MjksIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NDEsIDB4NGQsIDB4NGMsIDB4NTYsIDB4ODYsIDB4MDAsCisgICAgICAgICAgICAgICAgMHg0MCwgMHg5NiwgMHg2MSwgMHgyMSwgMHg3OCwgMHgwMCwgMHgwMCwgMHgwYywgMHg3MCwgMHg1MCwgMHg0MCwgMHg3OCwgMHhmYywgMHgyMSwgMHhmZiwgMHhlMSwKKyAgICAgICAgICAgICAgICAweDQ1LCAweDg1LCAweDUwLCAweDViLCAweGZhLCAweDM1LCAweGM4LCAweDEwLCAweDVmLCAweDc4LCAweDAxLCAweGI3LCAweDZiLCAweDU4LCAweDdlLCAweDU4LAorICAgICAgICAgICAgICAgIDB4MmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MzgsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NDEsCisgICAgICAgICAgICAgICAgMHg0ZCwgMHg0YywgMHg1NiwgMHg4NiwgMHgwMCwgMHg0MCwgMHg5NiwgMHg2MiwgMHg1MSwgMHg3OCwgMHgwMCwgMHgwMCwgMHgwYywgMHg2MCwgMHg2MywgMHgwMCwKKyAgICAgICAgICAgICAgICAweDdlLCAweDZjLCAweDRiLCAweDg0LCAweDNlLCAweDFkLCAweGU0LCAweDNlLCAweDI1LCAweDlmLCAweDNmLCAweDVhLCAweDJhLCAweDE5LCAweGI2LCAweGRkLAorICAgICAgICAgICAgICAgIDB4ODAsIDB4OTcsIDB4ZjcsIDB4NjUsIDB4MWUsIDB4YTEsIDB4MTcsIDB4ZTIsIDB4ZmYsIDB4YWMsIDB4YjMsIDB4NGMsIDB4NWEsIDB4ZmEsIDB4NWYsIDB4NjAsCisgICAgICAgICAgICAgICAgMHhjZiwgMHg3OCwgMHhjMywgMHgyOCwgMHg2ZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyNywgMHhmZiwgMHhmZiwgMHhmZiwgMHhkOCwgMHgwMCwKKyAgICAgICAgICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDQxLCAweDRkLCAweDRjLCAweDU2LCAweDg2LCAweDAwLCAweDQwLCAweDk2LCAweDE4LCAweDcwLCAweDVlLCAweDAwLCAweDAwLAorICAgICAgICAgICAgICAgIDB4MDMsIDB4MjMsIDB4YTgsIDB4MDAsIDB4NzYsIDB4MGYsIDB4YjQsIDB4MDMsIDB4ZGMsIDB4NGUsIDB4YWYsIDB4NTMsIDB4ZGUsIDB4ZmUsIDB4OTEsIDB4ZDksCisgICAgICAgICAgICAgICAgMHg2NiwgMHgwYiwgMHhhYiwgMHg3NiwgMHhiYiwgMHg0NCwgMHgyYywgMHhhNiwgMHg5MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMywgMHhmZiwgMHhmZiwKKyAgICAgICAgICAgICAgICAweGZmLCAweGRjLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDQxLCAweDRkLCAweDRjLCAweDU2LCAweDg2LCAweDAwLCAweDQwLCAweDk2LCAweDE4LCAweDcwLAorICAgICAgICAgICAgICAgIDB4NWUsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MjMsIDB4YTgsIDB4MDAsIDB4NWQsIDB4ZmMsIDB4MTUsIDB4OWQsIDB4NTcsIDB4YjUsIDB4ODEsIDB4NjMsIDB4ODQsCisgICAgICAgICAgICAgICAgMHhiZCwgMHgyYiwgMHhlZSwgMHgzNywgMHg3YywgMHhhMCwgMHhiNiwgMHgyZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAgICAgICAgICAgICAweGU3LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDQxLCAweDRkLCAweDRjLCAweDU2LCAweDg2LCAweDAxLCAweDAwLCAweDk2LCAweDE4LCAweDQ4LCAweDVmLAorICAgICAgICAgICAgICAgIDB4ZTAsIDB4MDAsIDB4MDMsIDB4MjAsIDB4MDAsIDB4MDAsIDB4NDYsIDB4NzQsIDB4OGYsIDB4ZWYsIDB4YjcsIDB4MDksIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgICAgICAgICAgICAgMHgzMSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhjZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg0MSwgMHg0ZCwgMHg0YywgMHg1NiwgMHg4NiwgMHgwMCwgMHg0MSwKKyAgICAgICAgICAgICAgICAweDBhLCAweDYxLCAweGExLCAweDc4LCAweDAwLCAweDAwLCAweDBjLCAweDIwLCAweDAwLCAweDAwLCAweDcyLCAweDI1LCAweDBiLCAweDQxLCAweDViLCAweDJlLAorICAgICAgICAgICAgICAgIDB4M2UsIDB4OGQsIDB4NjQsIDB4NmQsIDB4ZjAsIDB4MTEsIDB4OGYsIDB4ZDksIDB4OWYsIDB4NGYsIDB4MjgsIDB4NzIsIDB4ZjYsIDB4ZDUsIDB4MWUsIDB4NWYsCisgICAgICAgICAgICAgICAgMHg5MiwgMHg2OSwgMHhiOCwgMHhiMCwgMHhmNiwgMHhlMCwgMHhjOCwgMHhkNiwgMHg3YSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzZSwgMHhmZiwgMHhmZiwKKyAgICAgICAgICAgICAgICAweGZmLCAweGMxLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDQxLCAweDRkLCAweDRjLCAweDU2LCAweDg2LCAweDAwLCAweDQxLCAweDBhLCAweDYyLCAweDAxLAorICAgICAgICAgICAgICAgIDB4NzgsIDB4MDAsIDB4MDAsIDB4MGMsIDB4NzAsIDB4MDAsIDB4MDAsIDB4N2QsIDB4ODAsIDB4OWYsIDB4YzUsIDB4MTksIDB4ODEsIDB4N2EsIDB4Y2QsIDB4YzQsCisgICAgICAgICAgICAgICAgMHhjNSwgMHgwOCwgMHgxYywgMHg3OSwgMHg5NCwgMHhjZSwgMHhiNCwgMHg2ZiwgMHhjNCwgMHhkOCwgMHg4YywgMHg0NSwgMHgwYSwgMHhjZiwgMHhjYiwgMHhiMiwKKyAgICAgICAgICAgICAgICAweDIxLCAweDg0LCAweGUyLCAweDdlLCAweDg0LCAweGViLCAweDczLCAweGQ5LCAweDRjLCAweGFkLCAweDEwLCAweDUwLCAweDQ4LCAweDk2LCAweGMyLCAweDE3LAorICAgICAgICAgICAgICAgIDB4MjQsIDB4YTIsIDB4NGMsIDB4OTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4YmEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsCisgICAgICAgICAgICAgICAgMHg0MSwgMHg0ZCwgMHg0YywgMHg1NiwgMHg4NiwgMHgwMCwgMHg0MSwgMHgwYSwgMHg2MiwgMHg2MSwgMHg3OCwgMHgwMCwgMHgwMCwgMHgwYywgMHgyMCwgMHgwMCwKKyAgICAgICAgICAgICAgICAweDAwLCAweDdiLCAweGVhLCAweGFlLCAweDM3LCAweDgxLCAweGJhLCAweGMxLCAweDg4LCAweDRmLCAweGJkLCAweGYxLCAweDBjLCAweGM1LCAweGYzLCAweDgwLAorICAgICAgICAgICAgICAgIDB4NmMsIDB4NjksIDB4OWYsIDB4ZWUsIDB4ZDEsIDB4OGQsIDB4MDMsIDB4MDgsIDB4NDksIDB4MTksIDB4NDEsIDB4NTAsIDB4MGYsIDB4YTgsIDB4ODUsIDB4YmQsCisgICAgICAgICAgICAgICAgMHgyNywgMHg0OSwgMHhmMCwgMHhmYSwgMHgxZSwgMHg5NiwgMHgzYSwgMHg0ZCwgMHg1NCwgMHhmNiwgMHgxMSwgMHhmYywgMHgxZSwgMHgxMCwgMHhlMywgMHg3NSwKKyAgICAgICAgICAgICAgICAweDY3LCAweGU1LCAweDMzLCAweDczLCAweGIwCisjZW5kaWYKKyAgICAgICAgfTsKKworI2lmIFZQOV9VU0VfVFJJR0dFUl9CSUdfU0laRQorICAgICAgICBzdGF0aWMgdTMyIHZwOV90cmlnZ2VyX2ZyYW1lc2l6ZVtdID0gezU0MjksNTkxLDc5OSw2NTUsNjU1LDY0Nyw3NjksODIyLDg2Nyw5NDV9OworI2Vsc2UKKyAgICAgICAgc3RhdGljIHUzMiB2cDlfdHJpZ2dlcl9mcmFtZXNpemVbXSA9IHszMjAsMTMwLDYwLDUzLDY4LDUxLDQ3LDM2LDYxLDc0LDgxfTsKKyNlbmRpZgorCisjZW5kaWYgLy9fVkRFQ19WUDlfVFJJR18KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbXZkZWNfcG9ydHMvdGVzdC9BbmRyb2lkLm1rIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvdGVzdC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NjUyZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FtdmRlY19wb3J0cy90ZXN0L0FuZHJvaWQubWsKQEAgLTAsMCArMSwyMyBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRQkJOj0gdmNvZGVfbTJtCitMT0NBTF9NT0RVTEVfVEFHUwk6PSBvcHRpb25hbAorTE9DQUxfU1JDX0ZJTEVTCQk6PSB2Y29kZWNfbTJtX3Rlc3QuYworTE9DQUxfQVJNX01PREUJCTo9IGFybQorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKwkkKEpOSV9IX0lOQ0xVREUpIFwKKwkkKEJPQVJEX0FNTF9WRU5ET1JfUEFUSCkvdmVuZG9yL2FtbG9naWMvZXh0ZXJuYWwvZmZtcGVnCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYmFtZmZtcGVnCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfUFJFQlVJTFRfTElCUzo9IFwKKyMgICAgICAgIGxpYmF2Y29kZWM6ZmZtcGVnL2xpYi9saWJhdmNvZGVjLnNvIFwKKworaW5jbHVkZSAkKEJVSUxEX01VTFRJX1BSRUJVSUxUKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbXZkZWNfcG9ydHMvdGVzdC92Y29kZWNfbTJtX3Rlc3QuYyBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL3Rlc3QvdmNvZGVjX20ybV90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVjMDQwYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL3Rlc3QvdmNvZGVjX20ybV90ZXN0LmMKQEAgLTAsMCArMSwzNDMgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNyBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisqIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyoKKyogRGVzY3JpcHRpb246CisqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bGliYXZjb2RlYy9hdmNvZGVjLmg+CisjaW5jbHVkZSA8bGliYXZmb3JtYXQvYXZmb3JtYXQuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNkZWZpbmUgSU5CVUZfU0laRQkoNDA5NikKKyNkZWZpbmUgRFVNUF9ESVIJIi9kYXRhL3ZpZGVvX2ZyYW1lcyIKK3N0YXRpYyBpbnQgZHVtcDsKKwordHlwZWRlZiBzdHJ1Y3QgVmNvZGVjQ3R4IHsKKwlBVkZvcm1hdENvbnRleHQgKmZtdF9jdHg7CisJQVZTdHJlYW0gKnN0cmVhbTsKKwlpbnQgbmJfc3RyZWFtczsKKwlpbnQgdnN0X2lkeDsKKwljaGFyICpmaWxlbmFtZTsKKwlwdGhyZWFkX3QgdGlkOworCXB0aHJlYWRfbXV0ZXhfdCBwdGhyZWFkX211dGV4OworCXB0aHJlYWRfY29uZF90IHB0aHJlYWRfY29uZDsKK30gVmNvZGVjQ3R4OworCitzdGF0aWMgdm9pZCBkdW1wX3l1dihBVkZyYW1lICpmcmFtZSwgY2hhciAqZmlsZW5hbWUpCit7CisJRklMRSAqZjsKKworCXByaW50ZigibmFtZTogJXMsIHJlc29sdXRpb246ICVkeCVkLCBzaXplOiAlZFxuIiwKKwkJZmlsZW5hbWUsIGZyYW1lLT53aWR0aCwgZnJhbWUtPmhlaWdodCwKKwkJZnJhbWUtPmJ1ZlswXS0+c2l6ZSArIGZyYW1lLT5idWZbMV0tPnNpemUpOworCisJZiA9IGZvcGVuKGZpbGVuYW1lLCJ3KyIpOworCisJZndyaXRlKGZyYW1lLT5idWZbMF0tPmRhdGEsIDEsIGZyYW1lLT5idWZbMF0tPnNpemUsIGYpOworCWZ3cml0ZShmcmFtZS0+YnVmWzFdLT5kYXRhLCAxLCBmcmFtZS0+YnVmWzFdLT5zaXplLCBmKTsKKworCWZjbG9zZShmKTsKK30KKworc3RhdGljIHZvaWQgZGVjb2RlKEFWQ29kZWNDb250ZXh0ICpkZWNfY3R4LCBBVkZyYW1lICpmcmFtZSwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwljaGFyIGJ1ZlsxMDI0XTsKKwlpbnQgcmV0OworCisJcmV0ID0gYXZjb2RlY19zZW5kX3BhY2tldChkZWNfY3R4LCBwa3QpOworCWlmIChyZXQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRXJyb3Igc2VuZGluZyBhIHBhY2tldCBmb3IgZGVjb2RpbmdcbiIpOworCQlyZXR1cm47CisJfQorCisJd2hpbGUgKHJldCA+PSAwKSB7CisJCXJldCA9IGF2Y29kZWNfcmVjZWl2ZV9mcmFtZShkZWNfY3R4LCBmcmFtZSk7CisJCWlmIChyZXQgPT0gQVZFUlJPUihFQUdBSU4pIHx8IHJldCA9PSBBVkVSUk9SX0VPRikKKwkJCXJldHVybjsKKwkJZWxzZSBpZiAocmV0IDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJFcnJvciBkdXJpbmcgZGVjb2RpbmcsIHJldDogJXNcbiIsIGF2X2VycjJzdHIocmV0KSk7CisJCQlicmVhazsKKwkJfQorCisJCS8vZnByaW50ZihzdGRlcnIsICJzYXZpbmcgZnJhbWUgJTNkXG4iLCBkZWNfY3R4LT5mcmFtZV9udW1iZXIpOworCQlmZmx1c2goc3Rkb3V0KTsKKworCQkvKiB0aGUgcGljdHVyZSBpcyBhbGxvY2F0ZWQgYnkgdGhlIGRlY29kZXIuIG5vIG5lZWQgdG8gZnJlZSBpdCAqLworCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMvZnJhbWUtJWQiLCBmaWxlbmFtZSwgZGVjX2N0eC0+ZnJhbWVfbnVtYmVyKTsKKworCQlpZiAoZHVtcCkKKwkJCWR1bXBfeXV2KGZyYW1lLCBidWYpOworCX0KK30KKworc3RhdGljIHZvaWQqIHJlYWRfdGhyZWFkKHZvaWQgKmFyZykKK3sKKwlpbnQgcmV0LCBlcnI7CisJQVZGb3JtYXRDb250ZXh0ICppYyA9IE5VTEw7CisJQVZDb2RlY0NvbnRleHQgKmRlY19jdHggPSBOVUxMOworCUFWU3RyZWFtICpzdHJlYW0gPSBOVUxMOworCUFWQ29kZWMgKmNvZGVjID0gTlVMTDsKKwlBVlBhY2tldCBwa3QxLCAqcGt0ID0gJnBrdDE7CisJQVZGcmFtZSAqZnJhbWUgPSBOVUxMOworCWludCB2c3RfaWR4ID0gMDsKKwlpbnQgaGFzX3ZpZGVvID0gMDsKKwl1bnNpZ25lZCBpbnQgc3RfaWR4ID0gMDsKKwlWY29kZWNDdHggKnZjdHggPSBhcmc7CisJY29uc3QgY2hhciAqZm9yY2VkX2NvZGVjX25hbWUgPSBOVUxMOworCisJcHJpbnRmKCJlbnRyeSByZWFkIHRocmVhZCwgdGlkOiAlbGQuXG4iLCB2Y3R4LT50aWQpOworCisJaWMgPSBhdmZvcm1hdF9hbGxvY19jb250ZXh0KCk7CisJaWYgKCFpYykgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBhdmZvcm1hdCBjb250ZXh0LlxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IGF2Zm9ybWF0X29wZW5faW5wdXQoJmljLCB2Y3R4LT5maWxlbmFtZSwgTlVMTCwgTlVMTCk7CisJaWYgKGVyciA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBhdmZvcm1hdCBpbnB1dC5cbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSBhdmZvcm1hdF9maW5kX3N0cmVhbV9pbmZvKGljLCBOVUxMKTsKKwlpZiAoZXJyIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImZpbmQgc3RyZWFtIGluZm8gZXJyLlxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWZvciAoc3RfaWR4ID0gMDsgc3RfaWR4IDwgaWMtPm5iX3N0cmVhbXM7IHN0X2lkeCsrKSB7CisJCUFWU3RyZWFtICpzdCA9IGljLT5zdHJlYW1zW3N0X2lkeF07CisKKwkJZW51bSBBVk1lZGlhVHlwZSB0eXBlID0gc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlOworCQlzdC0+ZGlzY2FyZCA9IEFWRElTQ0FSRF9BTEw7CisKKwkJaWYgKHR5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisJCQlzdC0+ZGlzY2FyZCA9IEFWRElTQ0FSRF9OT05FOworCQkJdmN0eC0+dnN0X2lkeCA9IHN0X2lkeDsKKwkJCWhhc192aWRlbyA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghaGFzX3ZpZGVvKSB7CisJCWZwcmludGYoc3RkZXJyLCAibm8gdmlkZW8gc3RyZWFtLlxuIik7CisJCWdvdG8gb3V0OworCX0KKworCXN0cmVhbSA9IGljLT5zdHJlYW1zW3ZjdHgtPnZzdF9pZHhdOworCisJLy9jb2RlYyA9IGF2Y29kZWNfZmluZF9kZWNvZGVyKHN0cmVhbS0+Y29kZWNwYXItPmNvZGVjX2lkKTsKKwlzd2l0Y2ggKHN0cmVhbS0+Y29kZWNwYXItPmNvZGVjX2lkKSB7CisJCWNhc2UgQVZfQ09ERUNfSURfSDI2NDoKKwkJCWZvcmNlZF9jb2RlY19uYW1lID0gImgyNjRfdjRsMm0ybSI7CisJCQlicmVhazsKKwkJY2FzZSBBVl9DT0RFQ19JRF9IRVZDOgorCQkJZm9yY2VkX2NvZGVjX25hbWUgPSAiaGV2Y192NGwybTJtIjsKKwkJCWJyZWFrOworCQljYXNlIEFWX0NPREVDX0lEX1ZQOToKKwkJCWZvcmNlZF9jb2RlY19uYW1lID0gInZwOV92NGwybTJtIjsKKwkJCWJyZWFrOworCQljYXNlIEFWX0NPREVDX0lEX01QRUcxVklERU86CisJCQlmb3JjZWRfY29kZWNfbmFtZSA9ICJtcGVnMV92NGwybTJtIjsKKwkJCWJyZWFrOworCQljYXNlIEFWX0NPREVDX0lEX01QRUcyVklERU86CisJCQlmb3JjZWRfY29kZWNfbmFtZSA9ICJtcGVnMl92NGwybTJtIjsKKwkJCWJyZWFrOworCQljYXNlIEFWX0NPREVDX0lEX1ZDMToKKwkJCWZvcmNlZF9jb2RlY19uYW1lID0gInZjMV92NGwybTJtIjsKKwkJCWJyZWFrOworCQljYXNlIEFWX0NPREVDX0lEX0gyNjM6CisJCQlmb3JjZWRfY29kZWNfbmFtZSA9ICJoMjYzX3Y0bDJtMm0iOworCQkJYnJlYWs7CisJCWNhc2UgQVZfQ09ERUNfSURfTVBFRzQ6CisJCQlmb3JjZWRfY29kZWNfbmFtZSA9ICJtcGVnNF92NGwybTJtIjsKKwkJCWJyZWFrOworCQljYXNlIEFWX0NPREVDX0lEX01KUEVHOgorCQkJZm9yY2VkX2NvZGVjX25hbWUgPSAibWpwZWdfdjRsMm0ybSI7CisJCQlicmVhazsKKwl9CisKKwljb2RlYyA9IGF2Y29kZWNfZmluZF9kZWNvZGVyX2J5X25hbWUoZm9yY2VkX2NvZGVjX25hbWUpOworCWlmICghY29kZWMpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVbnN1cHBvcnRlZCBjb2RlYyB3aXRoIGlkICVkIGZvciBpbnB1dCBzdHJlYW0gJWRcbiIsCisJCQlzdHJlYW0tPmNvZGVjcGFyLT5jb2RlY19pZCwgc3RyZWFtLT5pbmRleCk7CisJCWdvdG8gb3V0OworCX0KKworCWRlY19jdHggPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKGNvZGVjKTsKKwlpZiAoIWRlY19jdHgpIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgYWxsb2NhdGUgdmlkZW8gY29kZWMgY29udGV4dFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IGF2Y29kZWNfcGFyYW1ldGVyc190b19jb250ZXh0KGRlY19jdHgsIHN0cmVhbS0+Y29kZWNwYXIpOworCWlmIChlcnIgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHNldCBwYXJhcyB0byBjb250ZXh0XG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJYXZfY29kZWNfc2V0X3BrdF90aW1lYmFzZShkZWNfY3R4LCBzdHJlYW0tPnRpbWVfYmFzZSk7CisJZGVjX2N0eC0+ZnJhbWVyYXRlID0gc3RyZWFtLT5hdmdfZnJhbWVfcmF0ZTsKKworCWlmIChhdmNvZGVjX29wZW4yKGRlY19jdHgsIGNvZGVjLCBOVUxMKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBjb2RlYyBmb3IgaW5wdXQgc3RyZWFtICVkXG4iLAorCQkJc3RyZWFtLT5pbmRleCk7CisJCWdvdG8gb3V0OworCX0KKworCXByaW50ZigiZm10IGN0eDogJXAsIHN0cmVhbTogJXAsIHZpZGVvIHN0IGlkeDogJWQsIG51bTogJWRcbiIsCisJCWljLCBzdHJlYW0sIHZzdF9pZHgsIGljLT5uYl9zdHJlYW1zKTsKKyAgICAgICAgcHJpbnRmKCJmb3JtYXQ6ICVzXG4iLGljLT5pZm9ybWF0LT5uYW1lKTsKKworCWljLT5mbGFncyB8PSBBVkZNVF9GTEFHX0dFTlBUUzsKKwlpYy0+ZGVidWcgPSAweGZmOworCisJLy9pZiAoaWMtPnBiKQorCS8vICAgIGljLT5wYi0+ZW9mX3JlYWNoZWQgPSAwOworCisJZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworCWlmICghZnJhbWUpIHsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgYWxsb2NhdGUgdmlkZW8gZnJhbWVcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlmb3IgKDs7KSB7CisJCXJldCA9IGF2X3JlYWRfZnJhbWUoaWMsIHBrdCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlpZiAocmV0ID09IEFWRVJST1JfRU9GIHx8IGF2aW9fZmVvZihpYy0+cGIpKSB7CisJCQkJcHJpbnRmKCJyZWFkIGRhdGEgZW5kLCByZXQ6ICVkLlxuIiwgcmV0KTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKGljLT5wYiAmJiBpYy0+cGItPmVycm9yKQorCQkJICAgIGJyZWFrOworCisJCQlwcmludGYoInJlYWQgZGF0YSBmYWlsLCByZXQ6ICVkLlxuIiwgcmV0KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHBrdC0+c3RyZWFtX2luZGV4ID09IHZjdHgtPnZzdF9pZHgpIHsKKwkJCS8vcGFja2V0X3F1ZXVlX3B1dCgmaXMtPmF1ZGlvcSwgcGt0KTsKKwkJCS8vcHJpbnRmKCJyZWFkIHZpZGVvIGRhdGEgc2l6ZTogJWQuXG4iLCBwa3QtPnNpemUpOworCQkJaWYgKHBrdC0+c2l6ZSkKKwkJCQlkZWNvZGUoZGVjX2N0eCwgZnJhbWUsIHBrdCwgRFVNUF9ESVIpOworCQl9CisKKwkJYXZfcGFja2V0X3VucmVmKHBrdCk7CisKKwkJdXNsZWVwKDggKiAxMDAwKTsKKwl9CisKKwkvKiBmbHVzaCB0aGUgZGVjb2RlciAqLworCWRlY29kZShkZWNfY3R4LCBmcmFtZSwgTlVMTCwgRFVNUF9ESVIpOworb3V0OgorCWlmIChkZWNfY3R4KQorCQlhdmNvZGVjX2ZyZWVfY29udGV4dCgmZGVjX2N0eCk7CisKKwlpZiAoZnJhbWUpCisJCWF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKworCWlmIChpYykgeworCSAgICBhdmZvcm1hdF9jbG9zZV9pbnB1dCgmaWMpOworCSAgICBhdmZvcm1hdF9mcmVlX2NvbnRleHQoaWMpOworCX0KKworCXByaW50ZigicmVhZCB0aHJlYWQgZXhpdC5cbiIpOworCisJcHRocmVhZF9tdXRleF9sb2NrKCZ2Y3R4LT5wdGhyZWFkX211dGV4KTsKKwlwdGhyZWFkX2NvbmRfc2lnbmFsKCZ2Y3R4LT5wdGhyZWFkX2NvbmQpOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ2Y3R4LT5wdGhyZWFkX211dGV4KTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IG9wZW5faW5wdXRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlpbnQgcmV0OworCVZjb2RlY0N0eCAqdmN0eDsKKwlwdGhyZWFkX3QgcGlkID0gcHRocmVhZF9zZWxmKCk7CisKKwl2Y3R4ID0gYXZfbWFsbG9jeihzaXplb2YoVmNvZGVjQ3R4KSk7CisJaWYgKCF2Y3R4KQorCSAgICByZXR1cm4gLTE7CisKKwl2Y3R4LT5maWxlbmFtZSA9IGF2X3N0cmR1cChmaWxlbmFtZSk7CisJaWYgKCF2Y3R4LT5maWxlbmFtZSkgeworCSAgICBhdl9mcmVlKHZjdHgpOworCSAgICByZXR1cm4gLTE7CisJfQorCisJcHRocmVhZF9tdXRleF9pbml0KCZ2Y3R4LT5wdGhyZWFkX211dGV4LCBOVUxMKTsKKwlwdGhyZWFkX2NvbmRfaW5pdCgmdmN0eC0+cHRocmVhZF9jb25kLCBOVUxMKTsKKworCXJldCA9IHB0aHJlYWRfY3JlYXRlKCZ2Y3R4LT50aWQsIE5VTEwsIHJlYWRfdGhyZWFkLCAodm9pZCAqKXZjdHgpOworCWlmIChyZXQgPT0gMCkgeworCQlwdGhyZWFkX3NldG5hbWVfbnAocGlkLCAicmVhZF90aHJlYWQiKTsKKworCQlwdGhyZWFkX211dGV4X2xvY2soJnZjdHgtPnB0aHJlYWRfbXV0ZXgpOworCQlwdGhyZWFkX2NvbmRfd2FpdCgmdmN0eC0+cHRocmVhZF9jb25kLCAmdmN0eC0+cHRocmVhZF9tdXRleCk7CisJCXB0aHJlYWRfam9pbih2Y3R4LT50aWQsIE5VTEwpOworCQlwdGhyZWFkX211dGV4X3VubG9jaygmdmN0eC0+cHRocmVhZF9tdXRleCk7CisJfQorCisJYXZfZnJlZSh2Y3R4LT5maWxlbmFtZSk7CisJYXZfZnJlZSh2Y3R4KTsKKworCXByaW50ZigiY3JlYXQgdGhlIHJlYWQgdGhyZWFkLCByZXQ6ICVkLlxuIiwgcmV0KTsKKworCXJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IHJldDsKKwljb25zdCBjaGFyICpmaWxlbmFtZTsKKwlpbnQgbG9nX2xldmVsID0gMDsKKworCWlmIChhcmdjIDwgMikgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyA8aW5wdXQgZmlsZT5cbiA9PT4gJXMvZnJhbWUtMTIzXG4iLCBhcmd2WzBdLCBEVU1QX0RJUik7CisJCWV4aXQoMCk7CisJfQorCisJZmlsZW5hbWUgPSBhcmd2WzFdOworCWlmIChhcmd2WzJdKSB7CisJCWlmICghc3RyY21wKGFyZ3ZbMl0sICJkdW1wIikpCisJCQlkdW1wID0gMTsKKwkJZWxzZQorCQkJbG9nX2xldmVsID0gYXRvaShhcmd2WzJdKTsKKwl9CisKKwlta2RpcihEVU1QX0RJUiwgMDY2NCk7CisKKwkvKnNldCBkZWJ1ZyBsZXZlbCovCisJYXZfbG9nX3NldF9sZXZlbChsb2dfbGV2ZWwpOyAvL0FWX0xPR19ERUJVRworCisJLyogcmVnaXN0ZXIgYWxsIHRoZSBjb2RlY3MgKi8KKwlhdmNvZGVjX3JlZ2lzdGVyX2FsbCgpOworCisJcmV0ID0gb3Blbl9pbnB1dF9maWxlKGZpbGVuYW1lKTsKKwlpZiAocmV0IDwgMCkKKwkJZnByaW50ZihzdGRlcnIsICJvcGVuIGlucHV0IGZpbGUgZmFpbC5cbiIpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FtdmRlY19wb3J0cy91dGlscy9jb21tb24uYyBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL3V0aWxzL2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3Y2Y5M2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FtdmRlY19wb3J0cy91dGlscy9jb21tb24uYwpAQCAtMCwwICsxLDIzMiBAQAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9WNExfU09GVFdBUkVfUEFSU0VSCisjaW5jbHVkZSAicGl4Zm10LmgiCisjZW5kaWYKKworY29uc3QgdTggZmZfemlnemFnX2RpcmVjdFs2NF0gPSB7CisJMCwgIDEsICA4LCAxNiwgOSwgMiwgMywgMTAsCisJMTcsIDI0LCAzMiwgMjUsIDE4LCAxMSwgNCwgNSwKKwkxMiwgMTksIDI2LCAzMywgNDAsIDQ4LCA0MSwgMzQsCisJMjcsIDIwLCAxMywgNiwgNywgMTQsIDIxLCAyOCwKKwkzNSwgNDIsIDQ5LCA1NiwgNTcsIDUwLCA0MywgMzYsCisJMjksIDIyLCAxNSwgMjMsIDMwLCAzNywgNDQsIDUxLAorCTU4LCA1OSwgNTIsIDQ1LCAzOCwgMzEsIDM5LCA0NiwKKwk1MywgNjAsIDYxLCA1NCwgNDcsIDU1LCA2MiwgNjMKK307CisKK2NvbnN0IHU4IGZmX3ppZ3phZ19zY2FuWzE2ICsgMV0gPSB7CisJMCArIDAgKiA0LCAxICsgMCAqIDQsIDAgKyAxICogNCwgMCArIDIgKiA0LAorCTEgKyAxICogNCwgMiArIDAgKiA0LCAzICsgMCAqIDQsIDIgKyAxICogNCwKKwkxICsgMiAqIDQsIDAgKyAzICogNCwgMSArIDMgKiA0LCAyICsgMiAqIDQsCisJMyArIDEgKiA0LCAzICsgMiAqIDQsIDIgKyAzICogNCwgMyArIDMgKiA0LAorfTsKKworY29uc3QgY2hhciAqIGNvbnN0IGNvbG9yX3NwYWNlX25hbWVzW10gPSB7CisJW0FWQ09MX1NQQ19SR0JdCQk9ICJnYnIiLAorCVtBVkNPTF9TUENfQlQ3MDldCT0gImJ0NzA5IiwKKwlbQVZDT0xfU1BDX1VOU1BFQ0lGSUVEXQk9ICJ1bmtub3duIiwKKwlbQVZDT0xfU1BDX1JFU0VSVkVEXQk9ICJyZXNlcnZlZCIsCisJW0FWQ09MX1NQQ19GQ0NdCQk9ICJmY2MiLAorCVtBVkNPTF9TUENfQlQ0NzBCR10JPSAiYnQ0NzBiZyIsCisJW0FWQ09MX1NQQ19TTVBURTE3ME1dCT0gInNtcHRlMTcwbSIsCisJW0FWQ09MX1NQQ19TTVBURTI0ME1dCT0gInNtcHRlMjQwbSIsCisJW0FWQ09MX1NQQ19ZQ0dDT10JPSAieWNnY28iLAorCVtBVkNPTF9TUENfQlQyMDIwX05DTF0JPSAiYnQyMDIwbmMiLAorCVtBVkNPTF9TUENfQlQyMDIwX0NMXQk9ICJidDIwMjBjIiwKKwlbQVZDT0xfU1BDX1NNUFRFMjA4NV0JPSAic21wdGUyMDg1IiwKKwlbQVZDT0xfU1BDX0NIUk9NQV9ERVJJVkVEX05DTF0gPSAiY2hyb21hLWRlcml2ZWQtbmMiLAorCVtBVkNPTF9TUENfQ0hST01BX0RFUklWRURfQ0xdID0gImNocm9tYS1kZXJpdmVkLWMiLAorCVtBVkNPTF9TUENfSUNUQ1BdCT0gImljdGNwIiwKK307CisKK2NvbnN0IGNoYXIgKmF2X2NvbG9yX3NwYWNlX25hbWUoZW51bSBBVkNvbG9yU3BhY2Ugc3BhY2UpCit7CisJcmV0dXJuICh1bnNpZ25lZCkgc3BhY2UgPCBBVkNPTF9TUENfTkIgPworCQljb2xvcl9zcGFjZV9uYW1lc1tzcGFjZV0gOiBOVUxMOworfQorCitjb25zdCBjaGFyICogY29uc3QgY29sb3JfcHJpbWFyaWVzX25hbWVzW0FWQ09MX1BSSV9OQl0gPSB7CisJW0FWQ09MX1BSSV9SRVNFUlZFRDBdCT0gInJlc2VydmVkIiwKKwlbQVZDT0xfUFJJX0JUNzA5XQk9ICJidDcwOSIsCisJW0FWQ09MX1BSSV9VTlNQRUNJRklFRF0JPSAidW5rbm93biIsCisJW0FWQ09MX1BSSV9SRVNFUlZFRF0JPSAicmVzZXJ2ZWQiLAorCVtBVkNPTF9QUklfQlQ0NzBNXQk9ICJidDQ3MG0iLAorCVtBVkNPTF9QUklfQlQ0NzBCR10JPSAiYnQ0NzBiZyIsCisJW0FWQ09MX1BSSV9TTVBURTE3ME1dCT0gInNtcHRlMTcwbSIsCisJW0FWQ09MX1BSSV9TTVBURTI0ME1dCT0gInNtcHRlMjQwbSIsCisJW0FWQ09MX1BSSV9GSUxNXQk9ICJmaWxtIiwKKwlbQVZDT0xfUFJJX0JUMjAyMF0JPSAiYnQyMDIwIiwKKwlbQVZDT0xfUFJJX1NNUFRFNDI4XQk9ICJzbXB0ZTQyOCIsCisJW0FWQ09MX1BSSV9TTVBURTQzMV0JPSAic21wdGU0MzEiLAorCVtBVkNPTF9QUklfU01QVEU0MzJdCT0gInNtcHRlNDMyIiwKKwlbQVZDT0xfUFJJX0pFREVDX1AyMl0JPSAiamVkZWMtcDIyIiwKK307CisKK2NvbnN0IGNoYXIgKmF2X2NvbG9yX3ByaW1hcmllc19uYW1lKGVudW0gQVZDb2xvclByaW1hcmllcyBwcmltYXJpZXMpCit7CisJcmV0dXJuICh1bnNpZ25lZCkgcHJpbWFyaWVzIDwgQVZDT0xfUFJJX05CID8KKwkJY29sb3JfcHJpbWFyaWVzX25hbWVzW3ByaW1hcmllc10gOiBOVUxMOworfQorCitjb25zdCBjaGFyICogY29uc3QgY29sb3JfdHJhbnNmZXJfbmFtZXNbXSA9IHsKKyAgICBbQVZDT0xfVFJDX1JFU0VSVkVEMF0JPSAicmVzZXJ2ZWQiLAorICAgIFtBVkNPTF9UUkNfQlQ3MDldCQk9ICJidDcwOSIsCisgICAgW0FWQ09MX1RSQ19VTlNQRUNJRklFRF0JPSAidW5rbm93biIsCisgICAgW0FWQ09MX1RSQ19SRVNFUlZFRF0JPSAicmVzZXJ2ZWQiLAorICAgIFtBVkNPTF9UUkNfR0FNTUEyMl0JCT0gImJ0NDcwbSIsCisgICAgW0FWQ09MX1RSQ19HQU1NQTI4XQkJPSAiYnQ0NzBiZyIsCisgICAgW0FWQ09MX1RSQ19TTVBURTE3ME1dCT0gInNtcHRlMTcwbSIsCisgICAgW0FWQ09MX1RSQ19TTVBURTI0ME1dCT0gInNtcHRlMjQwbSIsCisgICAgW0FWQ09MX1RSQ19MSU5FQVJdCQk9ICJsaW5lYXIiLAorICAgIFtBVkNPTF9UUkNfTE9HXQkJPSAibG9nMTAwIiwKKyAgICBbQVZDT0xfVFJDX0xPR19TUVJUXQk9ICJsb2czMTYiLAorICAgIFtBVkNPTF9UUkNfSUVDNjE5NjZfMl80XQk9ICJpZWM2MTk2Ni0yLTQiLAorICAgIFtBVkNPTF9UUkNfQlQxMzYxX0VDR10JPSAiYnQxMzYxZSIsCisgICAgW0FWQ09MX1RSQ19JRUM2MTk2Nl8yXzFdCT0gImllYzYxOTY2LTItMSIsCisgICAgW0FWQ09MX1RSQ19CVDIwMjBfMTBdCT0gImJ0MjAyMC0xMCIsCisgICAgW0FWQ09MX1RSQ19CVDIwMjBfMTJdCT0gImJ0MjAyMC0xMiIsCisgICAgW0FWQ09MX1RSQ19TTVBURTIwODRdCT0gInNtcHRlMjA4NCIsCisgICAgW0FWQ09MX1RSQ19TTVBURTQyOF0JPSAic21wdGU0MjgiLAorICAgIFtBVkNPTF9UUkNfQVJJQl9TVERfQjY3XQk9ICJhcmliLXN0ZC1iNjciLAorfTsKKworY29uc3QgY2hhciAqYXZfY29sb3JfdHJhbnNmZXJfbmFtZShlbnVtIEFWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljIHRyYW5zZmVyKQoreworCXJldHVybiAodW5zaWduZWQpIHRyYW5zZmVyIDwgQVZDT0xfVFJDX05CID8KKwkJY29sb3JfdHJhbnNmZXJfbmFtZXNbdHJhbnNmZXJdIDogTlVMTDsKK30KKworLy9tYXRoCitjb25zdCB1OCBmZl9sb2cyX3RhYlsyNTZdPXsKKwkwLDAsMSwxLDIsMiwyLDIsMywzLDMsMywzLDMsMywzLDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsCisJNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LAorCTYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiwKKwk2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsCisJNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LAorCTcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywKKwk3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsCisJNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3Cit9OworCitpbnQgYXZfbG9nMih1MzIgdikKK3sKKwlpbnQgbiA9IDA7CisKKwlpZiAodiAmIDB4ZmZmZjAwMDApIHsKKwkJdiA+Pj0gMTY7CisJCW4gKz0gMTY7CisJfQorCWlmICh2ICYgMHhmZjAwKSB7CisJCXYgPj49IDg7CisJCW4gKz0gODsKKwl9CisJCW4gKz0gZmZfbG9nMl90YWJbdl07CisKKwlyZXR1cm4gbjsKK30KKworLy9iaXRzdHJlYW0KK2ludCBmaW5kX3N0YXJ0X2NvZGUodTggKmRhdGEsIGludCBkYXRhX3N6KQoreworCWlmIChkYXRhX3N6ID4gMyAmJiBkYXRhWzBdID09IDAgJiYgZGF0YVsxXSA9PSAwICYmIGRhdGFbMl0gPT0gMSkKKwkJcmV0dXJuIDM7CisKKwlpZiAoZGF0YV9zeiA+IDQgJiYgZGF0YVswXSA9PSAwICYmIGRhdGFbMV0gPT0gMCAmJiBkYXRhWzJdID09IDAgJiYgZGF0YVszXSA9PSAxKQorCQlyZXR1cm4gNDsKKworCXJldHVybiAtMTsKK30KKworaW50IGNhbGNfbmFsX2xlbih1OCAqZGF0YSwgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW4gLSA0OyBpKyspIHsKKwkJaWYgKGRhdGFbaV0pCisJCQljb250aW51ZTsKKworCQlpZiAoKGRhdGFbaV0gPT0gMCAmJiBkYXRhW2kgKyAxXSA9PSAwICYmIGRhdGFbaSArIDJdID09IDEpIHx8CisJCQkoZGF0YVtpXSA9PSAwICYmIGRhdGFbaSArIDFdID09IDAgJiYKKwkJCWRhdGFbaSArIDJdPT0wICYmIGRhdGFbaSArIDNdID09IDEpKQorCQkgcmV0dXJuIGk7CisJfQorCXJldHVybiBsZW47IC8vTm90IGZpbmQgdGhlIGVuZCBvZiBuYWx1Cit9CisKK3U4ICpuYWxfdW5pdF9leHRyYWN0X3Jic3AoY29uc3QgdTggKnNyYywgdTMyIHNyY19sZW4sIHUzMiAqZHN0X2xlbikKK3sKKwl1OCAqZHN0OworCXUzMiBpLCBsZW47CisKKwlkc3QgPSB2bWFsbG9jKHNyY19sZW4gKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKwlpZiAoIWRzdCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBOQUwgdW5pdCBoZWFkZXIgKDIgYnl0ZXMpICovCisJaSA9IGxlbiA9IDA7CisJd2hpbGUgKGkgPCAyICYmIGkgPCBzcmNfbGVuKQorCQlkc3RbbGVuKytdID0gc3JjW2krK107CisKKwl3aGlsZSAoaSArIDIgPCBzcmNfbGVuKQorCWlmICghc3JjW2ldICYmICFzcmNbaSArIDFdICYmIHNyY1tpICsgMl0gPT0gMykgeworCQlkc3RbbGVuKytdID0gc3JjW2krK107CisJCWRzdFtsZW4rK10gPSBzcmNbaSsrXTsKKwkJaSsrOyAvLyByZW1vdmUgZW11bGF0aW9uX3ByZXZlbnRpb25fdGhyZWVfYnl0ZQorCX0gZWxzZQorCQlkc3RbbGVuKytdID0gc3JjW2krK107CisKKwl3aGlsZSAoaSA8IHNyY19sZW4pCisJCWRzdFtsZW4rK10gPSBzcmNbaSsrXTsKKworCW1lbXNldChkc3QgKyBsZW4sIDAsIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworCisJKmRzdF9sZW4gPSBsZW47CisKKwlyZXR1cm4gZHN0OworfQorCisvL2RlYnVnCitzdGF0aWMgdm9pZCBfcHJfaGV4KGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXU4IGJ1Zls1MTJdOworCWludCBsZW4gPSAwOworCisJdmFfbGlzdCBhcmdzOworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJdnNucHJpbnRmKGJ1ZiArIGxlbiwgNTEyIC0gbGVuLCBmbXQsIGFyZ3MpOworCXByaW50aygiJXMiLCBidWYpOworCXZhX2VuZChhcmdzKTsKK30KKwordm9pZCBwcmludF9oZXhfZGVidWcodTggKmRhdGEsIHUzMiBsZW4sIGludCBtYXgpCit7CisJaW50IGksIGw7CisKKwlsID0gbGVuID4gbWF4ID8gbWF4IDogbGVuOworCisJZm9yIChpID0gMDsgaSA8IGw7IGkrKykgeworCQlpZiAoKGkgJiAweGYpID09IDApCisJCQlfcHJfaGV4KCIlMDZ4OiIsIGkpOworCQlfcHJfaGV4KCIlMDJ4ICIsIGRhdGFbaV0pOworCQlpZiAoKCgoaSArIDEpICYgMHhmKSA9PSAwKSB8fCAoKGkgKyAxKSA9PSBsKSkKKwkJCV9wcl9oZXgoIlxuIik7CisJfQorCisJX3ByX2hleCgicHJpbnQgaGV4IGVuZGluZy4gbGVuICVkXG5cbiIsIGwpOworfQorCitib29sIGlzX292ZXJfc2l6ZShpbnQgdywgaW50IGgsIGludCBzaXplKQoreworCWlmIChoICE9IDAgJiYgKHcgPiBzaXplIC8gaCkpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYW12ZGVjX3BvcnRzL3V0aWxzL2NvbW1vbi5oIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvdXRpbHMvY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlhZTUwYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL3V0aWxzL2NvbW1vbi5oCkBAIC0wLDAgKzEsMTU1IEBACisjaWZuZGVmIFVUSUxTX0NPTU1PTl9ICisjZGVmaW5lIFVUSUxTX0NPTU1PTl9ICisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9WNExfU09GVFdBUkVfUEFSU0VSCisjaW5jbHVkZSAicGl4Zm10LmgiCisjZW5kaWYKKworI2RlZmluZSBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFCTY0CisjZGVmaW5lIE1JTl9DQUNIRV9CSVRTCQkJNjQKKworI2RlZmluZSBGRk1BWChhLGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCisjZGVmaW5lIEZGTUFYMyhhLGIsYykgRkZNQVgoRkZNQVgoYSxiKSxjKQorI2RlZmluZSBGRk1JTihhLGIpICgoYSkgPiAoYikgPyAoYikgOiAoYSkpCisjZGVmaW5lIEZGTUlOMyhhLGIsYykgRkZNSU4oRkZNSU4oYSxiKSxjKQorCisjZGVmaW5lIEFWX1dMMzIocCwgdmFsKQkJCQlcCisJZG8gewkJCQkJXAorCQl1MzIgZCA9ICh2YWwpOwkJCVwKKwkJKCh1OCopKHApKVswXSA9IChkKTsJCVwKKwkJKCh1OCopKHApKVsxXSA9IChkKSA+PiA4OwlcCisJCSgodTgqKShwKSlbMl0gPSAoZCkgPj4gMTY7CVwKKwkJKCh1OCopKHApKVszXSA9IChkKSA+PiAyNDsJXAorCX0gd2hpbGUoMCkKKworI2RlZmluZSBBVl9XQjMyKHAsIHZhbCkJCQkJXAorCWRvIHsgdTMyIGQgPSAodmFsKTsJCQlcCisJCSgodTgqKShwKSlbM10gPSAoZCk7CQlcCisJCSgodTgqKShwKSlbMl0gPSAoZCkgPj4gODsJXAorCQkoKHU4KikocCkpWzFdID0gKGQpID4+IDE2OwlcCisJCSgodTgqKShwKSlbMF0gPSAoZCkgPj4gMjQ7CVwKKwl9IHdoaWxlKDApCisKKyNkZWZpbmUgQVZfUkIzMih4KQkJCQlcCisJKCgodTMyKSgoY29uc3QgdTgqKSh4KSlbMF0gPDwgMjQpIHwJXAorCSgoKGNvbnN0IHU4KikoeCkpWzFdIDw8IDE2KSB8CQlcCisJKCgoY29uc3QgdTgqKSh4KSlbMl0gPDwgIDgpIHwJCVwKKwkoKGNvbnN0IHU4KikoeCkpWzNdKQorCisjZGVmaW5lIEFWX1JMMzIoeCkJCQkJXAorCSgoKHUzMikoKGNvbnN0IHU4KikoeCkpWzNdIDw8IDI0KSB8CVwKKwkoKChjb25zdCB1OCopKHgpKVsyXSA8PCAxNikgfAkJXAorCSgoKGNvbnN0IHU4KikoeCkpWzFdIDw8ICA4KSB8CQlcCisJKChjb25zdCB1OCopKHgpKVswXSkKKworI2RlZmluZSBORUdfU1NSMzIoYSwgcykgICAoKChpbnQpKGEpKSA+PiAoKHMgPCAzMikgPyAoMzIgLSAocykpIDogMCkpCisjZGVmaW5lIE5FR19VU1IzMihhLCBzKSAgICgoKHUzMikoYSkpID4+ICgocyA8IDMyKSA/ICgzMiAtIChzKSkgOiAwKSkKKworLy9yb3VuZGVkIGRpdmlzaW9uICYgc2hpZnQKKyNkZWZpbmUgUlNISUZUKGEsYikgKChhKSA+IDAgPyAoKGEpICsgKCgxPDwoYikpPj4xKSk+PihiKSA6ICgoYSkgKyAoKDE8PChiKSk+PjEpLTEpPj4oYikpCisvKiBhc3N1bWUgYj4wICovCisjZGVmaW5lIFJPVU5ERURfRElWKGEsYikgKCgoYSk+MCA/IChhKSArICgoYik+PjEpIDogKGEpIC0gKChiKT4+MSkpLyhiKSkKKworc3RydWN0IEFWUmF0aW9uYWx7CisJaW50IG51bTsgLy8vPCBudW1lcmF0b3IKKwlpbnQgZGVuOyAvLy88IGRlbm9taW5hdG9yCit9OworCisjaWZuZGVmIENPTkZJR19BTUxPR0lDX01FRElBX1Y0TF9TT0ZUV0FSRV9QQVJTRVIKKy8qKgorICogWVVWIGNvbG9yc3BhY2UgdHlwZS4KKyAqIFRoZXNlIHZhbHVlcyBtYXRjaCB0aGUgb25lcyBkZWZpbmVkIGJ5IElTTy9JRUMgMjMwMDEtOF8yMDEzIKHsIDcuMy4KKyAqLworZW51bSBBVkNvbG9yU3BhY2UgeworCUFWQ09MX1NQQ19SR0IgICAgICAgICA9IDAsICAvLy88IG9yZGVyIG9mIGNvZWZmaWNpZW50cyBpcyBhY3R1YWxseSBHQlIsIGFsc28gSUVDIDYxOTY2LTItMSAoc1JHQikKKwlBVkNPTF9TUENfQlQ3MDkgICAgICAgPSAxLCAgLy8vPCBhbHNvIElUVS1SIEJUMTM2MSAvIElFQyA2MTk2Ni0yLTQgeHZZQ0M3MDkgLyBTTVBURSBSUDE3NyBBbm5leCBCCisJQVZDT0xfU1BDX1VOU1BFQ0lGSUVEID0gMiwKKwlBVkNPTF9TUENfUkVTRVJWRUQgICAgPSAzLAorCUFWQ09MX1NQQ19GQ0MgICAgICAgICA9IDQsICAvLy88IEZDQyBUaXRsZSA0NyBDb2RlIG9mIEZlZGVyYWwgUmVndWxhdGlvbnMgNzMuNjgyIChhKSgyMCkKKwlBVkNPTF9TUENfQlQ0NzBCRyAgICAgPSA1LCAgLy8vPCBhbHNvIElUVS1SIEJUNjAxLTYgNjI1IC8gSVRVLVIgQlQxMzU4IDYyNSAvIElUVS1SIEJUMTcwMCA2MjUgUEFMICYgU0VDQU0gLyBJRUMgNjE5NjYtMi00IHh2WUNDNjAxCisJQVZDT0xfU1BDX1NNUFRFMTcwTSAgID0gNiwgIC8vLzwgYWxzbyBJVFUtUiBCVDYwMS02IDUyNSAvIElUVS1SIEJUMTM1OCA1MjUgLyBJVFUtUiBCVDE3MDAgTlRTQworCUFWQ09MX1NQQ19TTVBURTI0ME0gICA9IDcsICAvLy88IGZ1bmN0aW9uYWxseSBpZGVudGljYWwgdG8gYWJvdmUKKwlBVkNPTF9TUENfWUNHQ08gICAgICAgPSA4LCAgLy8vPCBVc2VkIGJ5IERpcmFjIC8gVkMtMiBhbmQgSC4yNjQgRlJleHQsIHNlZSBJVFUtVCBTRzE2CisJQVZDT0xfU1BDX1lDT0NHICAgICAgID0gQVZDT0xfU1BDX1lDR0NPLAorCUFWQ09MX1NQQ19CVDIwMjBfTkNMICA9IDksICAvLy88IElUVS1SIEJUMjAyMCBub24tY29uc3RhbnQgbHVtaW5hbmNlIHN5c3RlbQorCUFWQ09MX1NQQ19CVDIwMjBfQ0wgICA9IDEwLCAvLy88IElUVS1SIEJUMjAyMCBjb25zdGFudCBsdW1pbmFuY2Ugc3lzdGVtCisJQVZDT0xfU1BDX1NNUFRFMjA4NSAgID0gMTEsIC8vLzwgU01QVEUgMjA4NSwgWSdEJ3pEJ3gKKwlBVkNPTF9TUENfQ0hST01BX0RFUklWRURfTkNMID0gMTIsIC8vLzwgQ2hyb21hdGljaXR5LWRlcml2ZWQgbm9uLWNvbnN0YW50IGx1bWluYW5jZSBzeXN0ZW0KKwlBVkNPTF9TUENfQ0hST01BX0RFUklWRURfQ0wgPSAxMywgLy8vPCBDaHJvbWF0aWNpdHktZGVyaXZlZCBjb25zdGFudCBsdW1pbmFuY2Ugc3lzdGVtCisJQVZDT0xfU1BDX0lDVENQICAgICAgID0gMTQsIC8vLzwgSVRVLVIgQlQuMjEwMC0wLCBJQ3RDcAorCUFWQ09MX1NQQ19OQiAgICAgICAgICAgICAgICAvLy88IE5vdCBwYXJ0IG9mIEFCSQorfTsKKworLyoqCisgICogQ2hyb21hdGljaXR5IGNvb3JkaW5hdGVzIG9mIHRoZSBzb3VyY2UgcHJpbWFyaWVzLgorICAqIFRoZXNlIHZhbHVlcyBtYXRjaCB0aGUgb25lcyBkZWZpbmVkIGJ5IElTTy9JRUMgMjMwMDEtOF8yMDEzIKHsIDcuMS4KKyAgKi8KK2VudW0gQVZDb2xvclByaW1hcmllcyB7CisJQVZDT0xfUFJJX1JFU0VSVkVEMCAgID0gMCwKKwlBVkNPTF9QUklfQlQ3MDkgICAgICAgPSAxLCAgLy8vPCBhbHNvIElUVS1SIEJUMTM2MSAvIElFQyA2MTk2Ni0yLTQgLyBTTVBURSBSUDE3NyBBbm5leCBCCisJQVZDT0xfUFJJX1VOU1BFQ0lGSUVEID0gMiwKKwlBVkNPTF9QUklfUkVTRVJWRUQgICAgPSAzLAorCUFWQ09MX1BSSV9CVDQ3ME0gICAgICA9IDQsICAvLy88IGFsc28gRkNDIFRpdGxlIDQ3IENvZGUgb2YgRmVkZXJhbCBSZWd1bGF0aW9ucyA3My42ODIgKGEpKDIwKQorCisJQVZDT0xfUFJJX0JUNDcwQkcgICAgID0gNSwgIC8vLzwgYWxzbyBJVFUtUiBCVDYwMS02IDYyNSAvIElUVS1SIEJUMTM1OCA2MjUgLyBJVFUtUiBCVDE3MDAgNjI1IFBBTCAmIFNFQ0FNCisJQVZDT0xfUFJJX1NNUFRFMTcwTSAgID0gNiwgIC8vLzwgYWxzbyBJVFUtUiBCVDYwMS02IDUyNSAvIElUVS1SIEJUMTM1OCA1MjUgLyBJVFUtUiBCVDE3MDAgTlRTQworCUFWQ09MX1BSSV9TTVBURTI0ME0gICA9IDcsICAvLy88IGZ1bmN0aW9uYWxseSBpZGVudGljYWwgdG8gYWJvdmUKKwlBVkNPTF9QUklfRklMTSAgICAgICAgPSA4LCAgLy8vPCBjb2xvdXIgZmlsdGVycyB1c2luZyBJbGx1bWluYW50IEMKKwlBVkNPTF9QUklfQlQyMDIwICAgICAgPSA5LCAgLy8vPCBJVFUtUiBCVDIwMjAKKwlBVkNPTF9QUklfU01QVEU0MjggICAgPSAxMCwgLy8vPCBTTVBURSBTVCA0MjgtMSAoQ0lFIDE5MzEgWFlaKQorCUFWQ09MX1BSSV9TTVBURVNUNDI4XzEgPSBBVkNPTF9QUklfU01QVEU0MjgsCisJQVZDT0xfUFJJX1NNUFRFNDMxICAgID0gMTEsIC8vLzwgU01QVEUgU1QgNDMxLTIgKDIwMTEpIC8gRENJIFAzCisJQVZDT0xfUFJJX1NNUFRFNDMyICAgID0gMTIsIC8vLzwgU01QVEUgU1QgNDMyLTEgKDIwMTApIC8gUDMgRDY1IC8gRGlzcGxheSBQMworCUFWQ09MX1BSSV9KRURFQ19QMjIgICA9IDIyLCAvLy88IEpFREVDIFAyMiBwaG9zcGhvcnMKKwlBVkNPTF9QUklfTkIgICAgICAgICAgICAgICAgLy8vPCBOb3QgcGFydCBvZiBBQkkKK307CisKKy8qKgorICogQ29sb3IgVHJhbnNmZXIgQ2hhcmFjdGVyaXN0aWMuCisgKiBUaGVzZSB2YWx1ZXMgbWF0Y2ggdGhlIG9uZXMgZGVmaW5lZCBieSBJU08vSUVDIDIzMDAxLThfMjAxMyCh7CA3LjIuCisgKi8KK2VudW0gQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWMgeworCUFWQ09MX1RSQ19SRVNFUlZFRDAgICAgPSAwLAorCUFWQ09MX1RSQ19CVDcwOSAgICAgICAgPSAxLCAgLy8vPCBhbHNvIElUVS1SIEJUMTM2MQorCUFWQ09MX1RSQ19VTlNQRUNJRklFRCAgPSAyLAorCUFWQ09MX1RSQ19SRVNFUlZFRCAgICAgPSAzLAorCUFWQ09MX1RSQ19HQU1NQTIyICAgICAgPSA0LCAgLy8vPCBhbHNvIElUVS1SIEJUNDcwTSAvIElUVS1SIEJUMTcwMCA2MjUgUEFMICYgU0VDQU0KKwlBVkNPTF9UUkNfR0FNTUEyOCAgICAgID0gNSwgIC8vLzwgYWxzbyBJVFUtUiBCVDQ3MEJHCisJQVZDT0xfVFJDX1NNUFRFMTcwTSAgICA9IDYsICAvLy88IGFsc28gSVRVLVIgQlQ2MDEtNiA1MjUgb3IgNjI1IC8gSVRVLVIgQlQxMzU4IDUyNSBvciA2MjUgLyBJVFUtUiBCVDE3MDAgTlRTQworCUFWQ09MX1RSQ19TTVBURTI0ME0gICAgPSA3LAorCUFWQ09MX1RSQ19MSU5FQVIgICAgICAgPSA4LCAgLy8vPCAiTGluZWFyIHRyYW5zZmVyIGNoYXJhY3RlcmlzdGljcyIKKwlBVkNPTF9UUkNfTE9HICAgICAgICAgID0gOSwgIC8vLzwgIkxvZ2FyaXRobWljIHRyYW5zZmVyIGNoYXJhY3RlcmlzdGljICgxMDA6MSByYW5nZSkiCisJQVZDT0xfVFJDX0xPR19TUVJUICAgICA9IDEwLCAvLy88ICJMb2dhcml0aG1pYyB0cmFuc2ZlciBjaGFyYWN0ZXJpc3RpYyAoMTAwICogU3FydCgxMCkgOiAxIHJhbmdlKSIKKwlBVkNPTF9UUkNfSUVDNjE5NjZfMl80ID0gMTEsIC8vLzwgSUVDIDYxOTY2LTItNAorCUFWQ09MX1RSQ19CVDEzNjFfRUNHICAgPSAxMiwgLy8vPCBJVFUtUiBCVDEzNjEgRXh0ZW5kZWQgQ29sb3VyIEdhbXV0CisJQVZDT0xfVFJDX0lFQzYxOTY2XzJfMSA9IDEzLCAvLy88IElFQyA2MTk2Ni0yLTEgKHNSR0Igb3Igc1lDQykKKwlBVkNPTF9UUkNfQlQyMDIwXzEwICAgID0gMTQsIC8vLzwgSVRVLVIgQlQyMDIwIGZvciAxMC1iaXQgc3lzdGVtCisJQVZDT0xfVFJDX0JUMjAyMF8xMiAgICA9IDE1LCAvLy88IElUVS1SIEJUMjAyMCBmb3IgMTItYml0IHN5c3RlbQorCUFWQ09MX1RSQ19TTVBURTIwODQgICAgPSAxNiwgLy8vPCBTTVBURSBTVCAyMDg0IGZvciAxMC0sIDEyLSwgMTQtIGFuZCAxNi1iaXQgc3lzdGVtcworCUFWQ09MX1RSQ19TTVBURVNUMjA4NCAgPSBBVkNPTF9UUkNfU01QVEUyMDg0LAorCUFWQ09MX1RSQ19TTVBURTQyOCAgICAgPSAxNywgLy8vPCBTTVBURSBTVCA0MjgtMQorCUFWQ09MX1RSQ19TTVBURVNUNDI4XzEgPSBBVkNPTF9UUkNfU01QVEU0MjgsCisJQVZDT0xfVFJDX0FSSUJfU1REX0I2NyA9IDE4LCAvLy88IEFSSUIgU1RELUI2Nywga25vd24gYXMgIkh5YnJpZCBsb2ctZ2FtbWEiCisJQVZDT0xfVFJDX05CICAgICAgICAgICAgICAgICAvLy88IE5vdCBwYXJ0IG9mIEFCSQorfTsKKyNlbmRpZgorCisvL2ZtdAorY29uc3QgY2hhciAqYXZfY29sb3Jfc3BhY2VfbmFtZShlbnVtIEFWQ29sb3JTcGFjZSBzcGFjZSk7Citjb25zdCBjaGFyICphdl9jb2xvcl9wcmltYXJpZXNfbmFtZShlbnVtIEFWQ29sb3JQcmltYXJpZXMgcHJpbWFyaWVzKTsKK2NvbnN0IGNoYXIgKmF2X2NvbG9yX3RyYW5zZmVyX25hbWUoZW51bSBBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYyB0cmFuc2Zlcik7CisKKy8vbWF0aAoraW50IGF2X2xvZzIodTMyIHYpOworCisvL2JpdHN0cmVhbQoraW50IGZpbmRfc3RhcnRfY29kZSh1OCAqZGF0YSwgaW50IGRhdGFfc3opOworaW50IGNhbGNfbmFsX2xlbih1OCAqZGF0YSwgaW50IGxlbik7Cit1OCAqbmFsX3VuaXRfZXh0cmFjdF9yYnNwKGNvbnN0IHU4ICpzcmMsIHUzMiBzcmNfbGVuLCB1MzIgKmRzdF9sZW4pOworCisvL2RlYnVnCit2b2lkIHByaW50X2hleF9kZWJ1Zyh1OCAqZGF0YSwgdTMyIGxlbiwgaW50IG1heCk7CisKK2Jvb2wgaXNfb3Zlcl9zaXplKGludCB3LCBpbnQgaCwgaW50IHNpemUpOworCisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FtdmRlY19wb3J0cy91dGlscy9nZXRfYml0cy5oIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvdXRpbHMvZ2V0X2JpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjk4ZWJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvdXRpbHMvZ2V0X2JpdHMuaApAQCAtMCwwICsxLDU5MCBAQAorI2lmbmRlZiBBVkNPREVDX0dFVF9CSVRTX0gKKyNkZWZpbmUgQVZDT0RFQ19HRVRfQklUU19ICisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgImNvbW1vbi5oIgorCisvKgorICogU2FmZSBiaXRzdHJlYW0gcmVhZGluZzoKKyAqIG9wdGlvbmFsbHksIHRoZSBnZXRfYml0cyBBUEkgY2FuIGNoZWNrIHRvIGVuc3VyZSB0aGF0IHdlCisgKiBkb24ndCByZWFkIHBhc3QgaW5wdXQgYnVmZmVyIGJvdW5kYXJpZXMuIFRoaXMgaXMgcHJvdGVjdGVkCisgKiB3aXRoIENPTkZJR19TQUZFX0JJVFNUUkVBTV9SRUFERVIgYXQgdGhlIGdsb2JhbCBsZXZlbCwgYW5kCisgKiB0aGVuIGJlbG93IHRoYXQgd2l0aCBVTkNIRUNLRURfQklUU1RSRUFNX1JFQURFUiBhdCB0aGUgcGVyLQorICogZGVjb2RlciBsZXZlbC4gVGhpcyBtZWFucyB0aGF0IGRlY29kZXJzIHRoYXQgY2hlY2sgaW50ZXJuYWxseQorICogY2FuICIjZGVmaW5lIFVOQ0hFQ0tFRF9CSVRTVFJFQU1fUkVBREVSIDEiIHRvIGRpc2FibGUKKyAqIG92ZXJyZWFkIGNoZWNrcy4KKyAqIEJvdW5kYXJ5IGNoZWNraW5nIGNhdXNlcyBhIG1pbm9yIHBlcmZvcm1hbmNlIHBlbmFsdHkgc28gZm9yCisgKiBhcHBsaWNhdGlvbnMgdGhhdCB3b24ndCB3YW50L25lZWQgdGhpcywgaXQgY2FuIGJlIGRpc2FibGVkCisgKiBnbG9iYWxseSB1c2luZyAiI2RlZmluZSBDT05GSUdfU0FGRV9CSVRTVFJFQU1fUkVBREVSIDAiLgorICovCisKK3N0cnVjdCBnZXRfYml0c19jb250ZXh0IHsKKwljb25zdCB1OCAqYnVmZmVyOworCWNvbnN0IHU4ICpidWZmZXJfZW5kOworCWludCBpbmRleDsKKwlpbnQgc2l6ZV9pbl9iaXRzOworCWludCBzaXplX2luX2JpdHNfcGx1czg7Cit9OworCisvKiBCaXRzdHJlYW0gcmVhZGVyIEFQSSBkb2NzOgorICogbmFtZQorICogICBhcmJpdHJhcnkgbmFtZSB3aGljaCBpcyB1c2VkIGFzIHByZWZpeCBmb3IgdGhlIGludGVybmFsIHZhcmlhYmxlcworICoKKyAqIGdiCisgKiAgIHN0cnVjdCBnZXRfYml0c19jb250ZXh0CisgKgorICogT1BFTl9SRUFERVIobmFtZSwgZ2IpCisgKiAgIGxvYWQgZ2IgaW50byBsb2NhbCB2YXJpYWJsZXMKKyAqCisgKiBDTE9TRV9SRUFERVIobmFtZSwgZ2IpCisgKiAgIHN0b3JlIGxvY2FsIHZhcnMgaW4gZ2IKKyAqCisgKiBVUERBVEVfQ0FDSEUobmFtZSwgZ2IpCisgKiAgIFJlZmlsbCB0aGUgaW50ZXJuYWwgY2FjaGUgZnJvbSB0aGUgYml0c3RyZWFtLgorICogICBBZnRlciB0aGlzIGNhbGwgYXQgbGVhc3QgTUlOX0NBQ0hFX0JJVFMgd2lsbCBiZSBhdmFpbGFibGUuCisgKgorICogR0VUX0NBQ0hFKG5hbWUsIGdiKQorICogICBXaWxsIG91dHB1dCB0aGUgY29udGVudHMgb2YgdGhlIGludGVybmFsIGNhY2hlLAorICogICBuZXh0IGJpdCBpcyBNU0Igb2YgMzIgb3IgNjQgYml0cyAoRklYTUUgNjQgYml0cykuCisgKgorICogU0hPV19VQklUUyhuYW1lLCBnYiwgbnVtKQorICogICBXaWxsIHJldHVybiB0aGUgbmV4dCBudW0gYml0cy4KKyAqCisgKiBTSE9XX1NCSVRTKG5hbWUsIGdiLCBudW0pCisgKiAgIFdpbGwgcmV0dXJuIHRoZSBuZXh0IG51bSBiaXRzIGFuZCBkbyBzaWduIGV4dGVuc2lvbi4KKyAqCisgKiBTS0lQX0JJVFMobmFtZSwgZ2IsIG51bSkKKyAqICAgV2lsbCBza2lwIG92ZXIgdGhlIG5leHQgbnVtIGJpdHMuCisgKiAgIE5vdGUsIHRoaXMgaXMgZXF1aXZhbGVudCB0byBTS0lQX0NBQ0hFOyBTS0lQX0NPVU5URVIuCisgKgorICogU0tJUF9DQUNIRShuYW1lLCBnYiwgbnVtKQorICogICBXaWxsIHJlbW92ZSB0aGUgbmV4dCBudW0gYml0cyBmcm9tIHRoZSBjYWNoZSAobm90ZSBTS0lQX0NPVU5URVIKKyAqICAgTVVTVCBiZSBjYWxsZWQgYmVmb3JlIFVQREFURV9DQUNIRSAvIENMT1NFX1JFQURFUikuCisgKgorICogU0tJUF9DT1VOVEVSKG5hbWUsIGdiLCBudW0pCisgKiAgIFdpbGwgaW5jcmVtZW50IHRoZSBpbnRlcm5hbCBiaXQgY291bnRlciAoc2VlIFNLSVBfQ0FDSEUgJiBTS0lQX0JJVFMpLgorICoKKyAqIExBU1RfU0tJUF9CSVRTKG5hbWUsIGdiLCBudW0pCisgKiAgIExpa2UgU0tJUF9CSVRTLCB0byBiZSB1c2VkIGlmIG5leHQgY2FsbCBpcyBVUERBVEVfQ0FDSEUgb3IgQ0xPU0VfUkVBREVSLgorICoKKyAqIEJJVFNfTEVGVChuYW1lLCBnYikKKyAqICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgYml0cyBsZWZ0CisgKgorICogRm9yIGV4YW1wbGVzIHNlZSBnZXRfYml0cywgc2hvd19iaXRzLCBza2lwX2JpdHMsIGdldF92bGMuCisgKi8KKworI2RlZmluZSBPUEVOX1JFQURFUl9OT1NJWkUobmFtZSwgZ2IpCQlcCisJdTMyIG5hbWUgIyMgX2luZGV4ID0gKGdiKS0+aW5kZXg7CVwKKwl1MzIgbmFtZSAjIyBfY2FjaGUKKworI2RlZmluZSBPUEVOX1JFQURFUihuYW1lLCBnYikgT1BFTl9SRUFERVJfTk9TSVpFKG5hbWUsIGdiKQorI2RlZmluZSBCSVRTX0FWQUlMQUJMRShuYW1lLCBnYikgMQorCisjZGVmaW5lIENMT1NFX1JFQURFUihuYW1lLCBnYikgKGdiKS0+aW5kZXggPSBuYW1lICMjIF9pbmRleAorCisjZGVmaW5lIFVQREFURV9DQUNIRV9MRShuYW1lLCBnYikgbmFtZSAjI19jYWNoZSA9IFwKKyAgICAgIEFWX1JMMzIoKGdiKS0+YnVmZmVyICsgKG5hbWUgIyMgX2luZGV4ID4+IDMpKSA+PiAobmFtZSAjIyBfaW5kZXggJiA3KQorCisjZGVmaW5lIFVQREFURV9DQUNIRV9CRShuYW1lLCBnYikgbmFtZSAjIyBfY2FjaGUgPSBcCisgICAgICBBVl9SQjMyKChnYiktPmJ1ZmZlciArIChuYW1lICMjIF9pbmRleCA+PiAzKSkgPDwgKG5hbWUgIyMgX2luZGV4ICYgNykKKworI2RlZmluZSBTS0lQX0NPVU5URVIobmFtZSwgZ2IsIG51bSkgbmFtZSAjIyBfaW5kZXggKz0gKG51bSkKKworI2RlZmluZSBCSVRTX0xFRlQobmFtZSwgZ2IpICgoaW50KSgoZ2IpLT5zaXplX2luX2JpdHMgLSBuYW1lICMjIF9pbmRleCkpCisKKyNkZWZpbmUgU0tJUF9CSVRTKG5hbWUsIGdiLCBudW0pCQlcCisJZG8gewkJCQkJXAorCQlTS0lQX0NBQ0hFKG5hbWUsIGdiLCBudW0pOwlcCisJCVNLSVBfQ09VTlRFUihuYW1lLCBnYiwgbnVtKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgR0VUX0NBQ0hFKG5hbWUsIGdiKSAoKHUzMikgbmFtZSAjIyBfY2FjaGUpCisKKyNkZWZpbmUgTEFTVF9TS0lQX0JJVFMobmFtZSwgZ2IsIG51bSkgU0tJUF9DT1VOVEVSKG5hbWUsIGdiLCBudW0pCisKKyNkZWZpbmUgU0hPV19VQklUU19MRShuYW1lLCBnYiwgbnVtKSB6ZXJvX2V4dGVuZChuYW1lICMjIF9jYWNoZSwgbnVtKQorI2RlZmluZSBTSE9XX1NCSVRTX0xFKG5hbWUsIGdiLCBudW0pIHNpZ25fZXh0ZW5kKG5hbWUgIyMgX2NhY2hlLCBudW0pCisKKyNkZWZpbmUgU0hPV19VQklUU19CRShuYW1lLCBnYiwgbnVtKSBORUdfVVNSMzIobmFtZSAjIyBfY2FjaGUsIG51bSkKKyNkZWZpbmUgU0hPV19TQklUU19CRShuYW1lLCBnYiwgbnVtKSBORUdfU1NSMzIobmFtZSAjIyBfY2FjaGUsIG51bSkKKworI2lmZGVmIEJJVFNUUkVBTV9SRUFERVJfTEUKKyNkZWZpbmUgVVBEQVRFX0NBQ0hFKG5hbWUsIGdiKSBVUERBVEVfQ0FDSEVfTEUobmFtZSwgZ2IpCisjZGVmaW5lIFNLSVBfQ0FDSEUobmFtZSwgZ2IsIG51bSkgbmFtZSAjIyBfY2FjaGUgPj49IChudW0pCisKKyNkZWZpbmUgU0hPV19VQklUUyhuYW1lLCBnYiwgbnVtKSBTSE9XX1VCSVRTX0xFKG5hbWUsIGdiLCBudW0pCisjZGVmaW5lIFNIT1dfU0JJVFMobmFtZSwgZ2IsIG51bSkgU0hPV19TQklUU19MRShuYW1lLCBnYiwgbnVtKQorI2Vsc2UKKyNkZWZpbmUgVVBEQVRFX0NBQ0hFKG5hbWUsIGdiKSBVUERBVEVfQ0FDSEVfQkUobmFtZSwgZ2IpCisjZGVmaW5lIFNLSVBfQ0FDSEUobmFtZSwgZ2IsIG51bSkgbmFtZSAjIyBfY2FjaGUgPDw9IChudW0pCisKKyNkZWZpbmUgU0hPV19VQklUUyhuYW1lLCBnYiwgbnVtKSBTSE9XX1VCSVRTX0JFKG5hbWUsIGdiLCBudW0pCisjZGVmaW5lIFNIT1dfU0JJVFMobmFtZSwgZ2IsIG51bSkgU0hPV19TQklUU19CRShuYW1lLCBnYiwgbnVtKQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgY29uc3QgaW50IHNpZ25fZXh0ZW5kKGludCB2YWwsIHUzMiBiaXRzKQoreworCXUzMiBzaGlmdCA9IDggKiBzaXplb2YoaW50KSAtIGJpdHM7CisKKwl1bmlvbiB7IHUzMiB1OyBpbnQgczsgfSB2ID0geyAodTMyKSB2YWwgPDwgc2hpZnQgfTsKKwlyZXR1cm4gdi5zID4+IHNoaWZ0OworfQorCitzdGF0aWMgaW5saW5lIHUzMiB6ZXJvX2V4dGVuZCh1MzIgdmFsLCB1MzIgYml0cykKK3sKKwlyZXR1cm4gKHZhbCA8PCAoKDggKiBzaXplb2YoaW50KSkgLSBiaXRzKSkgPj4gKCg4ICogc2l6ZW9mKGludCkpIC0gYml0cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9iaXRzX2NvdW50KGNvbnN0IHN0cnVjdCBnZXRfYml0c19jb250ZXh0ICpzKQoreworCXJldHVybiBzLT5pbmRleDsKK30KKworLyoqCisgKiBTa2lwcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBiaXRzLgorICogQHBhcmFtIG4gdGhlIG51bWJlciBvZiBiaXRzIHRvIHNraXAsCisgKiAgICAgICAgICBGb3IgdGhlIFVOQ0hFQ0tFRF9CSVRTVFJFQU1fUkVBREVSIHRoaXMgbXVzdCBub3QgY2F1c2UgdGhlIGRpc3RhbmNlCisgKiAgICAgICAgICBmcm9tIHRoZSBzdGFydCB0byBvdmVyZmxvdyBpbnQuIFN0YXlpbmcgd2l0aGluIHRoZSBiaXRzdHJlYW0gKyBwYWRkaW5nCisgKiAgICAgICAgICBpcyBzdWZmaWNpZW50LCB0b28uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBza2lwX2JpdHNfbG9uZyhzdHJ1Y3QgZ2V0X2JpdHNfY29udGV4dCAqcywgaW50IG4pCit7CisJcy0+aW5kZXggKz0gbjsKK30KKworLyoqCisgKiBSZWFkIE1QRUctMSBkYy1zdHlsZSBWTEMgKHNpZ24gYml0ICsgbWFudGlzc2Egd2l0aCBubyBNU0IpLgorICogaWYgTVNCIG5vdCBzZXQgaXQgaXMgbmVnYXRpdmUKKyAqIEBwYXJhbSBuIGxlbmd0aCBpbiBiaXRzCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdldF94Yml0cyhzdHJ1Y3QgZ2V0X2JpdHNfY29udGV4dCAqcywgaW50IG4pCit7CisJcmVnaXN0ZXIgaW50IHNpZ247CisJcmVnaXN0ZXIgaW50IGNhY2hlOworCisJT1BFTl9SRUFERVIocmUsIHMpOworCVVQREFURV9DQUNIRShyZSwgcyk7CisJY2FjaGUgPSBHRVRfQ0FDSEUocmUsIHMpOworCXNpZ24gID0gfmNhY2hlID4+IDMxOworCUxBU1RfU0tJUF9CSVRTKHJlLCBzLCBuKTsKKwlDTE9TRV9SRUFERVIocmUsIHMpOworCisJcmV0dXJuIChORUdfVVNSMzIoc2lnbiBeIGNhY2hlLCBuKSBeIHNpZ24pIC0gc2lnbjsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBnZXRfeGJpdHNfbGUoc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKnMsIGludCBuKQoreworCXJlZ2lzdGVyIGludCBzaWduOworCXJlZ2lzdGVyIGludCBjYWNoZTsKKworCU9QRU5fUkVBREVSKHJlLCBzKTsKKwlVUERBVEVfQ0FDSEVfTEUocmUsIHMpOworCWNhY2hlID0gR0VUX0NBQ0hFKHJlLCBzKTsKKwlzaWduICA9IHNpZ25fZXh0ZW5kKH5jYWNoZSwgbikgPj4gMzE7CisJTEFTVF9TS0lQX0JJVFMocmUsIHMsIG4pOworCUNMT1NFX1JFQURFUihyZSwgcyk7CisKKwlyZXR1cm4gKHplcm9fZXh0ZW5kKHNpZ24gXiBjYWNoZSwgbikgXiBzaWduKSAtIHNpZ247Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9zYml0cyhzdHJ1Y3QgZ2V0X2JpdHNfY29udGV4dCAqcywgaW50IG4pCit7CisJcmVnaXN0ZXIgaW50IHRtcDsKKworCU9QRU5fUkVBREVSKHJlLCBzKTsKKwlVUERBVEVfQ0FDSEUocmUsIHMpOworCXRtcCA9IFNIT1dfU0JJVFMocmUsIHMsIG4pOworCUxBU1RfU0tJUF9CSVRTKHJlLCBzLCBuKTsKKwlDTE9TRV9SRUFERVIocmUsIHMpOworCisJcmV0dXJuIHRtcDsKK30KKworLyoqCisgKiBSZWFkIDEtMjUgYml0cy4KKyAqLworc3RhdGljIGlubGluZSB1MzIgZ2V0X2JpdHMoc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKnMsIGludCBuKQoreworCXJlZ2lzdGVyIHUzMiB0bXA7CisKKwlPUEVOX1JFQURFUihyZSwgcyk7CisJVVBEQVRFX0NBQ0hFKHJlLCBzKTsKKwl0bXAgPSBTSE9XX1VCSVRTKHJlLCBzLCBuKTsKKwlMQVNUX1NLSVBfQklUUyhyZSwgcywgbik7CisJQ0xPU0VfUkVBREVSKHJlLCBzKTsKKworCXJldHVybiB0bXA7Cit9CisKKy8qKgorICogUmVhZCAwLTI1IGJpdHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdldF9iaXRzeihzdHJ1Y3QgZ2V0X2JpdHNfY29udGV4dCAqcywgaW50IG4pCit7CisJcmV0dXJuIG4gPyBnZXRfYml0cyhzLCBuKSA6IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGdldF9iaXRzX2xlKHN0cnVjdCBnZXRfYml0c19jb250ZXh0ICpzLCBpbnQgbikKK3sKKwlyZWdpc3RlciBpbnQgdG1wOworCisJT1BFTl9SRUFERVIocmUsIHMpOworCVVQREFURV9DQUNIRV9MRShyZSwgcyk7CisJdG1wID0gU0hPV19VQklUU19MRShyZSwgcywgbik7CisJTEFTVF9TS0lQX0JJVFMocmUsIHMsIG4pOworCUNMT1NFX1JFQURFUihyZSwgcyk7CisKKwlyZXR1cm4gdG1wOworfQorCisvKioKKyAqIFNob3cgMS0yNSBiaXRzLgorICovCitzdGF0aWMgaW5saW5lIHUzMiBzaG93X2JpdHMoc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKnMsIGludCBuKQoreworCXJlZ2lzdGVyIHUzMiB0bXA7CisKKwlPUEVOX1JFQURFUl9OT1NJWkUocmUsIHMpOworCVVQREFURV9DQUNIRShyZSwgcyk7CisJdG1wID0gU0hPV19VQklUUyhyZSwgcywgbik7CisKKwlyZXR1cm4gdG1wOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2tpcF9iaXRzKHN0cnVjdCBnZXRfYml0c19jb250ZXh0ICpzLCBpbnQgbikKK3sKKwl1MzIgcmVfaW5kZXggPSBzLT5pbmRleDsKKwlMQVNUX1NLSVBfQklUUyhyZSwgcywgbik7CisJQ0xPU0VfUkVBREVSKHJlLCBzKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgZ2V0X2JpdHMxKHN0cnVjdCBnZXRfYml0c19jb250ZXh0ICpzKQoreworCXUzMiBpbmRleCA9IHMtPmluZGV4OworCXU4IHJlc3VsdCA9IHMtPmJ1ZmZlcltpbmRleCA+PiAzXTsKKworI2lmZGVmIEJJVFNUUkVBTV9SRUFERVJfTEUKKwlyZXN1bHQgPj49IGluZGV4ICYgNzsKKwlyZXN1bHQgICY9IDE7CisjZWxzZQorCXJlc3VsdCA8PD0gaW5kZXggJiA3OworCXJlc3VsdCA+Pj0gOCAtIDE7CisjZW5kaWYKKworCWluZGV4Kys7CisJcy0+aW5kZXggPSBpbmRleDsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHNob3dfYml0czEoc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKnMpCit7CisJcmV0dXJuIHNob3dfYml0cyhzLCAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNraXBfYml0czEoc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKnMpCit7CisJc2tpcF9iaXRzKHMsIDEpOworfQorCisvKioKKyAqIFJlYWQgMC0zMiBiaXRzLgorICovCitzdGF0aWMgaW5saW5lIHUzMiBnZXRfYml0c19sb25nKHN0cnVjdCBnZXRfYml0c19jb250ZXh0ICpzLCBpbnQgbikKK3sKKwlpZiAoIW4pIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChuIDw9IE1JTl9DQUNIRV9CSVRTKSB7CisJCXJldHVybiBnZXRfYml0cyhzLCBuKTsKKwl9IGVsc2UgeworI2lmZGVmIEJJVFNUUkVBTV9SRUFERVJfTEUKKwkJdTMyIHJldCA9IGdldF9iaXRzKHMsIDE2KTsKKwkJcmV0dXJuIHJldCB8IChnZXRfYml0cyhzLCBuIC0gMTYpIDw8IDE2KTsKKyNlbHNlCisJCXUzMiByZXQgPSBnZXRfYml0cyhzLCAxNikgPDwgKG4gLSAxNik7CisJCXJldHVybiByZXQgfCBnZXRfYml0cyhzLCBuIC0gMTYpOworI2VuZGlmCisJfQorfQorCisvKioKKyAqIFJlYWQgMC02NCBiaXRzLgorICovCitzdGF0aWMgaW5saW5lIHU2NCBnZXRfYml0czY0KHN0cnVjdCBnZXRfYml0c19jb250ZXh0ICpzLCBpbnQgbikKK3sKKwlpZiAobiA8PSAzMikgeworCQlyZXR1cm4gZ2V0X2JpdHNfbG9uZyhzLCBuKTsKKwl9IGVsc2UgeworI2lmZGVmIEJJVFNUUkVBTV9SRUFERVJfTEUKKwkJdTY0IHJldCA9IGdldF9iaXRzX2xvbmcocywgMzIpOworCQlyZXR1cm4gcmV0IHwgKHU2NCkgZ2V0X2JpdHNfbG9uZyhzLCBuIC0gMzIpIDw8IDMyOworI2Vsc2UKKwkJdTY0IHJldCA9ICh1NjQpIGdldF9iaXRzX2xvbmcocywgbiAtIDMyKSA8PCAzMjsKKwkJcmV0dXJuIHJldCB8IGdldF9iaXRzX2xvbmcocywgMzIpOworI2VuZGlmCisJfQorfQorCisvKioKKyAqIFJlYWQgMC0zMiBiaXRzIGFzIGEgc2lnbmVkIGludGVnZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdldF9zYml0c19sb25nKHN0cnVjdCBnZXRfYml0c19jb250ZXh0ICpzLCBpbnQgbikKK3sKKwlpZiAoIW4pCisJCXJldHVybiAwOworCisJcmV0dXJuIHNpZ25fZXh0ZW5kKGdldF9iaXRzX2xvbmcocywgbiksIG4pOworfQorCisvKioKKyAqIFNob3cgMC0zMiBiaXRzLgorICovCitzdGF0aWMgaW5saW5lIHUzMiBzaG93X2JpdHNfbG9uZyhzdHJ1Y3QgZ2V0X2JpdHNfY29udGV4dCAqcywgaW50IG4pCit7CisJaWYgKG4gPD0gTUlOX0NBQ0hFX0JJVFMpIHsKKwkJcmV0dXJuIHNob3dfYml0cyhzLCBuKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZ2V0X2JpdHNfY29udGV4dCBnYiA9ICpzOworCisJCXJldHVybiBnZXRfYml0c19sb25nKCZnYiwgbik7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBjaGVja19tYXJrZXIoc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKnMsIGNvbnN0IGNoYXIgKm1zZykKK3sKKwlpbnQgYml0ID0gZ2V0X2JpdHMxKHMpOworCisJaWYgKCFiaXQpCisJCXByX2VycigiTWFya2VyIGJpdCBtaXNzaW5nIGF0ICVkIG9mICVkICVzXG4iLAorCQkJZ2V0X2JpdHNfY291bnQocykgLSAxLCBzLT5zaXplX2luX2JpdHMsIG1zZyk7CisJcmV0dXJuIGJpdDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaW5pdF9nZXRfYml0c194ZShzdHJ1Y3QgZ2V0X2JpdHNfY29udGV4dCAqcywKKwljb25zdCB1OCAqYnVmZmVyLCBpbnQgYml0X3NpemUsIGludCBpc19sZSkKK3sKKwlpbnQgYnVmZmVyX3NpemU7CisJaW50IHJldCA9IDA7CisKKwlpZiAoYml0X3NpemUgPj0gSU5UX01BWCAtIEZGTUFYKDcsIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUgKiA4KSB8fAorCQliaXRfc2l6ZSA8IDAgfHwgIWJ1ZmZlcikgeworCQliaXRfc2l6ZSAgICA9IDA7CisJCWJ1ZmZlciAgICAgID0gTlVMTDsKKwkJcmV0ICAgICAgICAgPSAtMTsKKwl9CisKKwlidWZmZXJfc2l6ZSA9IChiaXRfc2l6ZSArIDcpID4+IDM7CisKKwlzLT5idWZmZXIgICAgICAgICAgICAgPSBidWZmZXI7CisJcy0+c2l6ZV9pbl9iaXRzICAgICAgID0gYml0X3NpemU7CisJcy0+c2l6ZV9pbl9iaXRzX3BsdXM4ID0gYml0X3NpemUgKyA4OworCXMtPmJ1ZmZlcl9lbmQgICAgICAgICA9IGJ1ZmZlciArIGJ1ZmZlcl9zaXplOworCXMtPmluZGV4ICAgICAgICAgICAgICA9IDA7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIEluaXRpYWxpemUgc3RydWN0IGdldF9iaXRzX2NvbnRleHQuCisgKiBAcGFyYW0gYnVmZmVyIGJpdHN0cmVhbSBidWZmZXIsIG11c3QgYmUgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSBieXRlcworICogICAgICAgIGxhcmdlciB0aGFuIHRoZSBhY3R1YWwgcmVhZCBiaXRzIGJlY2F1c2Ugc29tZSBvcHRpbWl6ZWQgYml0c3RyZWFtCisgKiAgICAgICAgcmVhZGVycyByZWFkIDMyIG9yIDY0IGJpdCBhdCBvbmNlIGFuZCBjb3VsZCByZWFkIG92ZXIgdGhlIGVuZAorICogQHBhcmFtIGJpdF9zaXplIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgaW4gYml0cworICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIGlmIHRoZSBidWZmZXJfc2l6ZSB3b3VsZCBvdmVyZmxvdy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgaW5pdF9nZXRfYml0cyhzdHJ1Y3QgZ2V0X2JpdHNfY29udGV4dCAqcywKKwljb25zdCB1OCAqYnVmZmVyLCBpbnQgYml0X3NpemUpCit7CisjaWZkZWYgQklUU1RSRUFNX1JFQURFUl9MRQorCXJldHVybiBpbml0X2dldF9iaXRzX3hlKHMsIGJ1ZmZlciwgYml0X3NpemUsIDEpOworI2Vsc2UKKwlyZXR1cm4gaW5pdF9nZXRfYml0c194ZShzLCBidWZmZXIsIGJpdF9zaXplLCAwKTsKKyNlbmRpZgorfQorCisvKioKKyAqIEluaXRpYWxpemUgc3RydWN0IGdldF9iaXRzX2NvbnRleHQuCisgKiBAcGFyYW0gYnVmZmVyIGJpdHN0cmVhbSBidWZmZXIsIG11c3QgYmUgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSBieXRlcworICogICAgICAgIGxhcmdlciB0aGFuIHRoZSBhY3R1YWwgcmVhZCBiaXRzIGJlY2F1c2Ugc29tZSBvcHRpbWl6ZWQgYml0c3RyZWFtCisgKiAgICAgICAgcmVhZGVycyByZWFkIDMyIG9yIDY0IGJpdCBhdCBvbmNlIGFuZCBjb3VsZCByZWFkIG92ZXIgdGhlIGVuZAorICogQHBhcmFtIGJ5dGVfc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGluIGJ5dGVzCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgaWYgdGhlIGJ1ZmZlcl9zaXplIHdvdWxkIG92ZXJmbG93LgorICovCitzdGF0aWMgaW5saW5lIGludCBpbml0X2dldF9iaXRzOChzdHJ1Y3QgZ2V0X2JpdHNfY29udGV4dCAqcywKKwljb25zdCB1OCAqYnVmZmVyLCBpbnQgYnl0ZV9zaXplKQoreworCWlmIChieXRlX3NpemUgPiBJTlRfTUFYIC8gOCB8fCBieXRlX3NpemUgPCAwKQorCQlieXRlX3NpemUgPSAtMTsKKwlyZXR1cm4gaW5pdF9nZXRfYml0cyhzLCBidWZmZXIsIGJ5dGVfc2l6ZSAqIDgpOworfQorCitzdGF0aWMgaW5saW5lIGludCBpbml0X2dldF9iaXRzOF9sZShzdHJ1Y3QgZ2V0X2JpdHNfY29udGV4dCAqcywKKwljb25zdCB1OCAqYnVmZmVyLCBpbnQgYnl0ZV9zaXplKQoreworCWlmIChieXRlX3NpemUgPiBJTlRfTUFYIC8gOCB8fCBieXRlX3NpemUgPCAwKQorCQlieXRlX3NpemUgPSAtMTsKKwlyZXR1cm4gaW5pdF9nZXRfYml0c194ZShzLCBidWZmZXIsIGJ5dGVfc2l6ZSAqIDgsIDEpOworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IHU4ICphbGlnbl9nZXRfYml0cyhzdHJ1Y3QgZ2V0X2JpdHNfY29udGV4dCAqcykKK3sKKwlpbnQgbiA9IC1nZXRfYml0c19jb3VudChzKSAmIDc7CisKKwlpZiAobikKKwkJc2tpcF9iaXRzKHMsIG4pOworCXJldHVybiBzLT5idWZmZXIgKyAocy0+aW5kZXggPj4gMyk7Cit9CisKKy8qKgorICogSWYgdGhlIHZsYyBjb2RlIGlzIGludmFsaWQgYW5kIG1heF9kZXB0aD0xLCB0aGVuIG5vIGJpdHMgd2lsbCBiZSByZW1vdmVkLgorICogSWYgdGhlIHZsYyBjb2RlIGlzIGludmFsaWQgYW5kIG1heF9kZXB0aD4xLCB0aGVuIHRoZSBudW1iZXIgb2YgYml0cyByZW1vdmVkCisgKiBpcyB1bmRlZmluZWQuCisgKi8KKyNkZWZpbmUgR0VUX1ZMQyhjb2RlLCBuYW1lLCBnYiwgdGFibGUsIGJpdHMsIG1heF9kZXB0aCkgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgbiwgbmJfYml0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdTMyIGluZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbmRleCA9IFNIT1dfVUJJVFMobmFtZSwgZ2IsIGJpdHMpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29kZSAgPSB0YWJsZVtpbmRleF1bMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG4gICAgID0gdGFibGVbaW5kZXhdWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG1heF9kZXB0aCA+IDEgJiYgbiA8IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBMQVNUX1NLSVBfQklUUyhuYW1lLCBnYiwgYml0cyk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgVVBEQVRFX0NBQ0hFKG5hbWUsIGdiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBuYl9iaXRzID0gLW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGluZGV4ID0gU0hPV19VQklUUyhuYW1lLCBnYiwgbmJfYml0cykgKyBjb2RlOyAgICAgICBcCisgICAgICAgICAgICBjb2RlICA9IHRhYmxlW2luZGV4XVswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbiAgICAgPSB0YWJsZVtpbmRleF1bMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChtYXhfZGVwdGggPiAyICYmIG4gPCAwKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgTEFTVF9TS0lQX0JJVFMobmFtZSwgZ2IsIG5iX2JpdHMpOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFVQREFURV9DQUNIRShuYW1lLCBnYik7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbmJfYml0cyA9IC1uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpbmRleCA9IFNIT1dfVUJJVFMobmFtZSwgZ2IsIG5iX2JpdHMpICsgY29kZTsgICBcCisgICAgICAgICAgICAgICAgY29kZSAgPSB0YWJsZVtpbmRleF1bMF07ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG4gICAgID0gdGFibGVbaW5kZXhdWzFdOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTS0lQX0JJVFMobmFtZSwgZ2IsIG4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEdFVF9STF9WTEMobGV2ZWwsIHJ1biwgbmFtZSwgZ2IsIHRhYmxlLCBiaXRzLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIG1heF9kZXB0aCwgbmVlZF91cGRhdGUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBuLCBuYl9iaXRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1MzIgaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGluZGV4ID0gU0hPV19VQklUUyhuYW1lLCBnYiwgYml0cyk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsZXZlbCA9IHRhYmxlW2luZGV4XS5sZXZlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbiAgICAgPSB0YWJsZVtpbmRleF0ubGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAobWF4X2RlcHRoID4gMSAmJiBuIDwgMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFNLSVBfQklUUyhuYW1lLCBnYiwgYml0cyk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAobmVlZF91cGRhdGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFVQREFURV9DQUNIRShuYW1lLCBnYik7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbmJfYml0cyA9IC1uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbmRleCA9IFNIT1dfVUJJVFMobmFtZSwgZ2IsIG5iX2JpdHMpICsgbGV2ZWw7ICAgICAgXAorICAgICAgICAgICAgbGV2ZWwgPSB0YWJsZVtpbmRleF0ubGV2ZWw7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG4gICAgID0gdGFibGVbaW5kZXhdLmxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAobWF4X2RlcHRoID4gMiAmJiBuIDwgMCkgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIExBU1RfU0tJUF9CSVRTKG5hbWUsIGdiLCBuYl9iaXRzKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAobmVlZF91cGRhdGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIFVQREFURV9DQUNIRShuYW1lLCBnYik7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBuYl9iaXRzID0gLW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGluZGV4ID0gU0hPV19VQklUUyhuYW1lLCBnYiwgbmJfYml0cykgKyBsZXZlbDsgIFwKKyAgICAgICAgICAgICAgICBsZXZlbCA9IHRhYmxlW2luZGV4XS5sZXZlbDsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbiAgICAgPSB0YWJsZVtpbmRleF0ubGVuOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJ1biA9IHRhYmxlW2luZGV4XS5ydW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTS0lQX0JJVFMobmFtZSwgZ2IsIG4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBSZXR1cm4gdGhlIExVVCBlbGVtZW50IGZvciB0aGUgZ2l2ZW4gYml0c3RyZWFtIGNvbmZpZ3VyYXRpb24uICovCitzdGF0aWMgaW5saW5lIGludCBzZXRfaWR4KHN0cnVjdCBnZXRfYml0c19jb250ZXh0ICpzLAorCWludCBjb2RlLCBpbnQgKm4sIGludCAqbmJfYml0cywgaW50ICgqdGFibGUpWzJdKQoreworCXUzMiBpZHg7CisKKwkqbmJfYml0cyA9IC0qbjsKKwlpZHggPSBzaG93X2JpdHMocywgKm5iX2JpdHMpICsgY29kZTsKKwkqbiA9IHRhYmxlW2lkeF1bMV07CisKKwlyZXR1cm4gdGFibGVbaWR4XVswXTsKK30KKworLyoqCisgKiBQYXJzZSBhIHZsYyBjb2RlLgorICogQHBhcmFtIGJpdHMgaXMgdGhlIG51bWJlciBvZiBiaXRzIHdoaWNoIHdpbGwgYmUgcmVhZCBhdCBvbmNlLCBtdXN0IGJlCisgKiAgICAgICAgICAgICBpZGVudGljYWwgdG8gbmJfYml0cyBpbiBpbml0X3ZsYygpCisgKiBAcGFyYW0gbWF4X2RlcHRoIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgYml0cyBiaXRzIG11c3QgYmUgcmVhZCB0byBjb21wbGV0ZWx5CisgKiAgICAgICAgICAgICAgICAgIHJlYWQgdGhlIGxvbmdlc3QgdmxjIGNvZGUKKyAqICAgICAgICAgICAgICAgICAgPSAobWF4X3ZsY19sZW5ndGggKyBiaXRzIC0gMSkgLyBiaXRzCisgKiBAcmV0dXJucyB0aGUgY29kZSBwYXJzZWQgb3IgLTEgaWYgbm8gdmxjIG1hdGNoZXMKKyAqLworc3RhdGljIGlubGluZSBpbnQgZ2V0X3ZsYzIoc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKnMsCisJaW50ICgqdGFibGUpWzJdLCBpbnQgYml0cywgaW50IG1heF9kZXB0aCkKK3sKKwlpbnQgY29kZTsKKworCU9QRU5fUkVBREVSKHJlLCBzKTsKKwlVUERBVEVfQ0FDSEUocmUsIHMpOworCisJR0VUX1ZMQyhjb2RlLCByZSwgcywgdGFibGUsIGJpdHMsIG1heF9kZXB0aCk7CisKKwlDTE9TRV9SRUFERVIocmUsIHMpOworCisJcmV0dXJuIGNvZGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRlY29kZTAxMihzdHJ1Y3QgZ2V0X2JpdHNfY29udGV4dCAqZ2IpCit7CisJaW50IG47CisKKwluID0gZ2V0X2JpdHMxKGdiKTsKKwlpZiAobiA9PSAwKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiBnZXRfYml0czEoZ2IpICsgMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGVjb2RlMjEwKHN0cnVjdCBnZXRfYml0c19jb250ZXh0ICpnYikKK3sKKwlpZiAoZ2V0X2JpdHMxKGdiKSkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMiAtIGdldF9iaXRzMShnYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9iaXRzX2xlZnQoc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKmdiKQoreworCXJldHVybiBnYi0+c2l6ZV9pbl9iaXRzIC0gZ2V0X2JpdHNfY291bnQoZ2IpOworfQorCitzdGF0aWMgaW5saW5lIGludCBza2lwXzFzdG9wXzhkYXRhX2JpdHMoc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKmdiKQoreworCWlmIChnZXRfYml0c19sZWZ0KGdiKSA8PSAwKQorCXJldHVybiAtMTsKKworCXdoaWxlIChnZXRfYml0czEoZ2IpKSB7CisJCXNraXBfYml0cyhnYiwgOCk7CisJCWlmIChnZXRfYml0c19sZWZ0KGdiKSA8PSAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogQVZDT0RFQ19HRVRfQklUU19IICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYW12ZGVjX3BvcnRzL3V0aWxzL2dvbG9tYi5jIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvdXRpbHMvZ29sb21iLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFmY2I2YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL3V0aWxzL2dvbG9tYi5jCkBAIC0wLDAgKzEsMTQ3IEBACisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworY29uc3QgdTggZmZfZ29sb21iX3ZsY19sZW5bNTEyXT17CisJMTksMTcsMTUsMTUsMTMsMTMsMTMsMTMsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSwKKwk3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsCisJNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LAorCTUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSwKKwkzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsCisJMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLAorCTMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywKKwkzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsCisJMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorCTEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKKwkxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsCisJMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorCTEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKKwkxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsCisJMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorCTEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMQorfTsKKworY29uc3QgdTggZmZfdWVfZ29sb21iX3ZsY19jb2RlWzUxMl09eworCTMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMxLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLAorCSA3LCA3LCA3LCA3LCA4LCA4LCA4LCA4LCA5LCA5LCA5LCA5LDEwLDEwLDEwLDEwLDExLDExLDExLDExLDEyLDEyLDEyLDEyLDEzLDEzLDEzLDEzLDE0LDE0LDE0LDE0LAorCSAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorCSA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAorCSAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorCSAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorCSAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorCSAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorCSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCit9OworCitjb25zdCBjaGFyIGZmX3NlX2dvbG9tYl92bGNfY29kZVs1MTJdPXsKKwkgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNiwgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsICA4LCAtOCwgIDksIC05LCAxMCwtMTAsIDExLC0xMSwgMTIsLTEyLCAxMywtMTMsIDE0LC0xNCwgMTUsLTE1LAorCSAgNCwgIDQsICA0LCAgNCwgLTQsIC00LCAtNCwgLTQsICA1LCAgNSwgIDUsICA1LCAtNSwgLTUsIC01LCAtNSwgIDYsICA2LCAgNiwgIDYsIC02LCAtNiwgLTYsIC02LCAgNywgIDcsICA3LCAgNywgLTcsIC03LCAtNywgLTcsCisJICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwKKwkgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsIC0zLCAtMywgLTMsIC0zLCAtMywgLTMsIC0zLCAtMywgLTMsIC0zLCAtMywgLTMsIC0zLCAtMywgLTMsIC0zLAorCSAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKwkgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCSAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKwkgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorCSAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisJICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKwkgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorCSAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisJICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKwkgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorfTsKKworY29uc3QgdTggZmZfdWVfZ29sb21iX2xlblsyNTZdPXsKKwkgMSwgMywgMywgNSwgNSwgNSwgNSwgNywgNywgNywgNywgNywgNywgNywgNywgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwxMSwKKwkxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMywKKwkxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywKKwkxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxMywxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNywKK307CisKK2NvbnN0IHU4IGZmX2ludGVybGVhdmVkX2dvbG9tYl92bGNfbGVuWzI1Nl09eworCTksOSw3LDcsOSw5LDcsNyw1LDUsNSw1LDUsNSw1LDUsCisJOSw5LDcsNyw5LDksNyw3LDUsNSw1LDUsNSw1LDUsNSwKKwkzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLAorCTMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsCisJOSw5LDcsNyw5LDksNyw3LDUsNSw1LDUsNSw1LDUsNSwKKwk5LDksNyw3LDksOSw3LDcsNSw1LDUsNSw1LDUsNSw1LAorCTMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsCisJMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywKKwkxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorCTEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsCisJMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKKwkxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorCTEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsCisJMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKKwkxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorCTEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsCit9OworCitjb25zdCB1OCBmZl9pbnRlcmxlYXZlZF91ZV9nb2xvbWJfdmxjX2NvZGVbMjU2XT17CisJMTUsMTYsNywgNywgMTcsMTgsOCwgOCwgMywgMywgMywgMywgMywgMywgMywgMywKKwkxOSwyMCw5LCA5LCAyMSwyMiwxMCwxMCw0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKwkyMywyNCwxMSwxMSwyNSwyNiwxMiwxMiw1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LAorCTI3LDI4LDEzLDEzLDI5LDMwLDE0LDE0LDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsCisJMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKwkyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKK307CisKK2NvbnN0IGNoYXIgZmZfaW50ZXJsZWF2ZWRfc2VfZ29sb21iX3ZsY19jb2RlWzI1Nl09eworCTgsIC04LCAgNCwgIDQsICA5LCAtOSwgLTQsIC00LCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsCisJMTAsLTEwLCAgNSwgIDUsIDExLC0xMSwgLTUsIC01LCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0yLCAtMiwgLTIsCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKwkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorCTEyLC0xMiwgIDYsICA2LCAxMywtMTMsIC02LCAtNiwgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLAorCTE0LC0xNCwgIDcsICA3LCAxNSwtMTUsIC03LCAtNywgLTMsIC0zLCAtMywgLTMsIC0zLCAtMywgLTMsIC0zLAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCTAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisJMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKwkwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorCTAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisJMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKwkwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorCTAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisJMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKK307CisKK2NvbnN0IHU4IGZmX2ludGVybGVhdmVkX2RpcmFjX2dvbG9tYl92bGNfY29kZVsyNTZdPXsKKwkwLCAxLCAwLCAwLCAyLCAzLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTQsIDUsIDIsIDIsIDYsIDcsIDMsIDMsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTgsIDksIDQsIDQsIDEwLDExLDUsIDUsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisJMTIsMTMsNiwgNiwgMTQsMTUsNywgNywgMywgMywgMywgMywgMywgMywgMywgMywKKwkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbXZkZWNfcG9ydHMvdXRpbHMvZ29sb21iLmggYi9kcml2ZXJzL2FtdmRlY19wb3J0cy91dGlscy9nb2xvbWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjZjMTgyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvdXRpbHMvZ29sb21iLmgKQEAgLTAsMCArMSw1MDAgQEAKKyNpZm5kZWYgQVZDT0RFQ19HT0xPTUJfSAorI2RlZmluZSBBVkNPREVDX0dPTE9NQl9ICisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJwdXRfYml0cy5oIgorI2luY2x1ZGUgImNvbW1vbi5oIgorCisjZGVmaW5lIElOVkFMSURfVkxDICAgICAgICAgICAweDgwMDAwMDAwCisKK2V4dGVybiBjb25zdCB1OCBmZl9nb2xvbWJfdmxjX2xlbls1MTJdOworZXh0ZXJuIGNvbnN0IHU4IGZmX3VlX2dvbG9tYl92bGNfY29kZVs1MTJdOworZXh0ZXJuIGNvbnN0IGNoYXIgZmZfc2VfZ29sb21iX3ZsY19jb2RlWzUxMl07CitleHRlcm4gY29uc3QgdTggZmZfdWVfZ29sb21iX2xlblsyNTZdOworCitleHRlcm4gY29uc3QgdTggZmZfaW50ZXJsZWF2ZWRfZ29sb21iX3ZsY19sZW5bMjU2XTsKK2V4dGVybiBjb25zdCB1OCBmZl9pbnRlcmxlYXZlZF91ZV9nb2xvbWJfdmxjX2NvZGVbMjU2XTsKK2V4dGVybiBjb25zdCBjaGFyIGZmX2ludGVybGVhdmVkX3NlX2dvbG9tYl92bGNfY29kZVsyNTZdOworZXh0ZXJuIGNvbnN0IHU4IGZmX2ludGVybGVhdmVkX2RpcmFjX2dvbG9tYl92bGNfY29kZVsyNTZdOworCisvKioKKyAqIFJlYWQgYW4gdTMyIEV4cC1Hb2xvbWIgY29kZSBpbiB0aGUgcmFuZ2UgMCB0byA4MTkwLgorICoKKyAqIEByZXR1cm5zIHRoZSByZWFkIHZhbHVlIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZ2V0X3VlX2dvbG9tYihzdHJ1Y3QgZ2V0X2JpdHNfY29udGV4dCAqZ2IpCit7CisJdTMyIGJ1ZjsKKworCU9QRU5fUkVBREVSKHJlLCBnYik7CisJVVBEQVRFX0NBQ0hFKHJlLCBnYik7CisJYnVmID0gR0VUX0NBQ0hFKHJlLCBnYik7CisKKwlpZiAoYnVmID49ICgxIDw8IDI3KSkgeworCQlidWYgPj49IDMyIC0gOTsKKwkJTEFTVF9TS0lQX0JJVFMocmUsIGdiLCBmZl9nb2xvbWJfdmxjX2xlbltidWZdKTsKKwkJQ0xPU0VfUkVBREVSKHJlLCBnYik7CisKKwkJcmV0dXJuIGZmX3VlX2dvbG9tYl92bGNfY29kZVtidWZdOworCX0gZWxzZSB7CisJCWludCBsb2cgPSAyICogYXZfbG9nMihidWYpIC0gMzE7CisJCUxBU1RfU0tJUF9CSVRTKHJlLCBnYiwgMzIgLSBsb2cpOworCQlDTE9TRV9SRUFERVIocmUsIGdiKTsKKwkJaWYgKGxvZyA8IDcpIHsKKwkJCXByX2VycigiSW52YWxpZCBVRSBnb2xvbWIgY29kZVxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYnVmID4+PSBsb2c7CisJCWJ1Zi0tOworCisJCXJldHVybiBidWY7CisJfQorfQorCisvKioKKyAqIFJlYWQgYW4gdTMyIEV4cC1Hb2xvbWIgY29kZSBpbiB0aGUgcmFuZ2UgMCB0byBVSU5UX01BWC0xLgorICovCitzdGF0aWMgaW5saW5lIHUzMiBnZXRfdWVfZ29sb21iX2xvbmcoc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKmdiKQoreworCXUzMiBidWYsIGxvZzsKKworCWJ1ZiA9IHNob3dfYml0c19sb25nKGdiLCAzMik7CisJbG9nID0gMzEgLSBhdl9sb2cyKGJ1Zik7CisJc2tpcF9iaXRzX2xvbmcoZ2IsIGxvZyk7CisKKwlyZXR1cm4gZ2V0X2JpdHNfbG9uZyhnYiwgbG9nICsgMSkgLSAxOworfQorCisvKioKKyAqIHJlYWQgdTMyIGV4cCBnb2xvbWIgY29kZSwgY29uc3RyYWludCB0byBhIG1heCBvZiAzMS4KKyAqIHRoZSByZXR1cm4gdmFsdWUgaXMgdW5kZWZpbmVkIGlmIHRoZSBzdG9yZWQgdmFsdWUgZXhjZWVkcyAzMS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZ2V0X3VlX2dvbG9tYl8zMShzdHJ1Y3QgZ2V0X2JpdHNfY29udGV4dCAqZ2IpCit7CisJdTMyIGJ1ZjsKKworCU9QRU5fUkVBREVSKHJlLCBnYik7CisJVVBEQVRFX0NBQ0hFKHJlLCBnYik7CisJYnVmID0gR0VUX0NBQ0hFKHJlLCBnYik7CisKKwlidWYgPj49IDMyIC0gOTsKKwlMQVNUX1NLSVBfQklUUyhyZSwgZ2IsIGZmX2dvbG9tYl92bGNfbGVuW2J1Zl0pOworCUNMT1NFX1JFQURFUihyZSwgZ2IpOworCisJcmV0dXJuIGZmX3VlX2dvbG9tYl92bGNfY29kZVtidWZdOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBnZXRfaW50ZXJsZWF2ZWRfdWVfZ29sb21iKHN0cnVjdCBnZXRfYml0c19jb250ZXh0ICpnYikKK3sKKwl1MzIgYnVmOworCisJT1BFTl9SRUFERVIocmUsIGdiKTsKKwlVUERBVEVfQ0FDSEUocmUsIGdiKTsKKwlidWYgPSBHRVRfQ0FDSEUocmUsIGdiKTsKKworCWlmIChidWYgJiAweEFBODAwMDAwKSB7CisJCWJ1ZiA+Pj0gMzIgLSA4OworCQlMQVNUX1NLSVBfQklUUyhyZSwgZ2IsIGZmX2ludGVybGVhdmVkX2dvbG9tYl92bGNfbGVuW2J1Zl0pOworCQlDTE9TRV9SRUFERVIocmUsIGdiKTsKKworCQlyZXR1cm4gZmZfaW50ZXJsZWF2ZWRfdWVfZ29sb21iX3ZsY19jb2RlW2J1Zl07CisJfSBlbHNlIHsKKwkJdTMyIHJldCA9IDE7CisKKwkJZG8geworCQkJYnVmID4+PSAzMiAtIDg7CisJCQlMQVNUX1NLSVBfQklUUyhyZSwgZ2IsCisJCQlGRk1JTihmZl9pbnRlcmxlYXZlZF9nb2xvbWJfdmxjX2xlbltidWZdLCA4KSk7CisKKwkJCWlmIChmZl9pbnRlcmxlYXZlZF9nb2xvbWJfdmxjX2xlbltidWZdICE9IDkpIHsKKwkJCQlyZXQgPDw9IChmZl9pbnRlcmxlYXZlZF9nb2xvbWJfdmxjX2xlbltidWZdIC0gMSkgPj4gMTsKKwkJCQlyZXQgIHw9IGZmX2ludGVybGVhdmVkX2RpcmFjX2dvbG9tYl92bGNfY29kZVtidWZdOworCQkJCWJyZWFrOworCQkJfQorCQkJcmV0ID0gKHJldCA8PCA0KSB8IGZmX2ludGVybGVhdmVkX2RpcmFjX2dvbG9tYl92bGNfY29kZVtidWZdOworCQkJVVBEQVRFX0NBQ0hFKHJlLCBnYik7CisJCQlidWYgPSBHRVRfQ0FDSEUocmUsIGdiKTsKKwkJfSB3aGlsZSAocmV0PDB4ODAwMDAwMFUgJiYgQklUU19BVkFJTEFCTEUocmUsIGdiKSk7CisKKwkJQ0xPU0VfUkVBREVSKHJlLCBnYik7CisJCXJldHVybiByZXQgLSAxOworCX0KK30KKworLyoqCisgKiByZWFkIHUzMiB0cnVuY2F0ZWQgZXhwIGdvbG9tYiBjb2RlLgorICovCitzdGF0aWMgaW5saW5lIGludCBnZXRfdGUwX2dvbG9tYihzdHJ1Y3QgZ2V0X2JpdHNfY29udGV4dCAqZ2IsIGludCByYW5nZSkKK3sKKwlpZiAocmFuZ2UgPT0gMSkKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAocmFuZ2UgPT0gMikKKwkJcmV0dXJuIGdldF9iaXRzMShnYikgXiAxOworCWVsc2UKKwkJcmV0dXJuIGdldF91ZV9nb2xvbWIoZ2IpOworfQorCisvKioKKyAqIHJlYWQgdTMyIHRydW5jYXRlZCBleHAgZ29sb21iIGNvZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdldF90ZV9nb2xvbWIoc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKmdiLCBpbnQgcmFuZ2UpCit7CisJaWYgKHJhbmdlID09IDIpCisJCXJldHVybiBnZXRfYml0czEoZ2IpIF4gMTsKKwllbHNlCisJCXJldHVybiBnZXRfdWVfZ29sb21iKGdiKTsKK30KKworLyoqCisgKiByZWFkIHNpZ25lZCBleHAgZ29sb21iIGNvZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdldF9zZV9nb2xvbWIoc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKmdiKQoreworCXUzMiBidWY7CisKKwlPUEVOX1JFQURFUihyZSwgZ2IpOworCVVQREFURV9DQUNIRShyZSwgZ2IpOworCWJ1ZiA9IEdFVF9DQUNIRShyZSwgZ2IpOworCisJaWYgKGJ1ZiA+PSAoMSA8PCAyNykpIHsKKwkJYnVmID4+PSAzMiAtIDk7CisJCUxBU1RfU0tJUF9CSVRTKHJlLCBnYiwgZmZfZ29sb21iX3ZsY19sZW5bYnVmXSk7CisJCUNMT1NFX1JFQURFUihyZSwgZ2IpOworCisJCXJldHVybiBmZl9zZV9nb2xvbWJfdmxjX2NvZGVbYnVmXTsKKwl9IGVsc2UgeworCQlpbnQgbG9nID0gYXZfbG9nMihidWYpLCBzaWduOworCQlMQVNUX1NLSVBfQklUUyhyZSwgZ2IsIDMxIC0gbG9nKTsKKwkJVVBEQVRFX0NBQ0hFKHJlLCBnYik7CisJCWJ1ZiA9IEdFVF9DQUNIRShyZSwgZ2IpOworCisJCWJ1ZiA+Pj0gbG9nOworCisJCUxBU1RfU0tJUF9CSVRTKHJlLCBnYiwgMzIgLSBsb2cpOworCQlDTE9TRV9SRUFERVIocmUsIGdiKTsKKworCQlzaWduID0gLShidWYgJiAxKTsKKwkJYnVmICA9ICgoYnVmID4+IDEpIF4gc2lnbikgLSBzaWduOworCisJCXJldHVybiBidWY7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfc2VfZ29sb21iX2xvbmcoc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKmdiKQoreworCXUzMiBidWYgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworCWludCBzaWduID0gKGJ1ZiAmIDEpIC0gMTsKKworCXJldHVybiAoKGJ1ZiA+PiAxKSBeIHNpZ24pICsgMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0X2ludGVybGVhdmVkX3NlX2dvbG9tYihzdHJ1Y3QgZ2V0X2JpdHNfY29udGV4dCAqZ2IpCit7CisJdTMyIGJ1ZjsKKworCU9QRU5fUkVBREVSKHJlLCBnYik7CisJVVBEQVRFX0NBQ0hFKHJlLCBnYik7CisJYnVmID0gR0VUX0NBQ0hFKHJlLCBnYik7CisKKwlpZiAoYnVmICYgMHhBQTgwMDAwMCkgeworCQlidWYgPj49IDMyIC0gODsKKwkJTEFTVF9TS0lQX0JJVFMocmUsIGdiLCBmZl9pbnRlcmxlYXZlZF9nb2xvbWJfdmxjX2xlbltidWZdKTsKKwkJQ0xPU0VfUkVBREVSKHJlLCBnYik7CisKKwkJcmV0dXJuIGZmX2ludGVybGVhdmVkX3NlX2dvbG9tYl92bGNfY29kZVtidWZdOworCX0gZWxzZSB7CisJCWludCBsb2c7CisJCUxBU1RfU0tJUF9CSVRTKHJlLCBnYiwgOCk7CisJCVVQREFURV9DQUNIRShyZSwgZ2IpOworCQlidWYgfD0gMSB8IChHRVRfQ0FDSEUocmUsIGdiKSA+PiA4KTsKKworCQlpZiAoKGJ1ZiAmIDB4QUFBQUFBQUEpID09IDApCisJCQlyZXR1cm4gSU5WQUxJRF9WTEM7CisKKwkJZm9yIChsb2cgPSAzMTsgKGJ1ZiAmIDB4ODAwMDAwMDApID09IDA7IGxvZy0tKQorCQkJYnVmID0gKGJ1ZiA8PCAyKSAtICgoYnVmIDw8IGxvZykgPj4gKGxvZyAtIDEpKSArIChidWYgPj4gMzApOworCisJCUxBU1RfU0tJUF9CSVRTKHJlLCBnYiwgNjMgLSAyICogbG9nIC0gOCk7CisJCUNMT1NFX1JFQURFUihyZSwgZ2IpOworCQlyZXR1cm4gKHNpZ25lZCkgKCgoKChidWYgPDwgbG9nKSA+PiBsb2cpIC0gMSkgXiAtKGJ1ZiAmIDB4MSkpICsgMSkgPj4gMTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRpcmFjX2dldF9zZV9nb2xvbWIoc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKmdiKQoreworCXUzMiByZXQgPSBnZXRfaW50ZXJsZWF2ZWRfdWVfZ29sb21iKGdiKTsKKworCWlmIChyZXQpIHsKKwkJaW50IHNpZ24gPSAtZ2V0X2JpdHMxKGdiKTsKKwkJcmV0ID0gKHJldCBeIHNpZ24pIC0gc2lnbjsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHJlYWQgdTMyIGdvbG9tYiByaWNlIGNvZGUgKGZmdjEpLgorICovCitzdGF0aWMgaW5saW5lIGludCBnZXRfdXJfZ29sb21iKHN0cnVjdCBnZXRfYml0c19jb250ZXh0ICpnYiwKKwlpbnQgaywgaW50IGxpbWl0LCBpbnQgZXNjX2xlbikKK3sKKwl1MzIgYnVmOworCWludCBsb2c7CisKKwlPUEVOX1JFQURFUihyZSwgZ2IpOworCVVQREFURV9DQUNIRShyZSwgZ2IpOworCWJ1ZiA9IEdFVF9DQUNIRShyZSwgZ2IpOworCisJbG9nID0gYXZfbG9nMihidWYpOworCisJaWYgKGxvZyA+IDMxIC0gbGltaXQpIHsKKwkJYnVmID4+PSBsb2cgLSBrOworCQlidWYgICs9ICgzMFUgLSBsb2cpIDw8IGs7CisJCUxBU1RfU0tJUF9CSVRTKHJlLCBnYiwgMzIgKyBrIC0gbG9nKTsKKwkJQ0xPU0VfUkVBREVSKHJlLCBnYik7CisKKwkJcmV0dXJuIGJ1ZjsKKwl9IGVsc2UgeworCQlMQVNUX1NLSVBfQklUUyhyZSwgZ2IsIGxpbWl0KTsKKwkJVVBEQVRFX0NBQ0hFKHJlLCBnYik7CisKKwkJYnVmID0gU0hPV19VQklUUyhyZSwgZ2IsIGVzY19sZW4pOworCisJCUxBU1RfU0tJUF9CSVRTKHJlLCBnYiwgZXNjX2xlbik7CisJCUNMT1NFX1JFQURFUihyZSwgZ2IpOworCisJCXJldHVybiBidWYgKyBsaW1pdCAtIDE7CisJfQorfQorCisvKioKKyAqIHJlYWQgdTMyIGdvbG9tYiByaWNlIGNvZGUgKGpwZWdscykuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdldF91cl9nb2xvbWJfanBlZ2xzKHN0cnVjdCBnZXRfYml0c19jb250ZXh0ICpnYiwKKwlpbnQgaywgaW50IGxpbWl0LCBpbnQgZXNjX2xlbikKK3sKKwl1MzIgYnVmOworCWludCBsb2c7CisKKwlPUEVOX1JFQURFUihyZSwgZ2IpOworCVVQREFURV9DQUNIRShyZSwgZ2IpOworCWJ1ZiA9IEdFVF9DQUNIRShyZSwgZ2IpOworCisJbG9nID0gYXZfbG9nMihidWYpOworCisJaWYgKGxvZyAtIGsgPj0gMzIgLSBNSU5fQ0FDSEVfQklUUyArIChNSU5fQ0FDSEVfQklUUyA9PSAzMikgJiYKKwkJMzIgLSBsb2cgPCBsaW1pdCkgeworCQlidWYgPj49IGxvZyAtIGs7CisJCWJ1ZiAgKz0gKDMwVSAtIGxvZykgPDwgazsKKwkJTEFTVF9TS0lQX0JJVFMocmUsIGdiLCAzMiArIGsgLSBsb2cpOworCQlDTE9TRV9SRUFERVIocmUsIGdiKTsKKworCQlyZXR1cm4gYnVmOworCX0gZWxzZSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpICsgTUlOX0NBQ0hFX0JJVFMgPD0gbGltaXQgJiYgU0hPV19VQklUUyhyZSwgZ2IsIE1JTl9DQUNIRV9CSVRTKSA9PSAwOyBpICs9IE1JTl9DQUNIRV9CSVRTKSB7CisJCQlpZiAoZ2ItPnNpemVfaW5fYml0cyA8PSByZV9pbmRleCkgeworCQkJCUNMT1NFX1JFQURFUihyZSwgZ2IpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCUxBU1RfU0tJUF9CSVRTKHJlLCBnYiwgTUlOX0NBQ0hFX0JJVFMpOworCQkJVVBEQVRFX0NBQ0hFKHJlLCBnYik7CisJCX0KKwkJZm9yICg7IGkgPCBsaW1pdCAmJiBTSE9XX1VCSVRTKHJlLCBnYiwgMSkgPT0gMDsgaSsrKSB7CisJCQlTS0lQX0JJVFMocmUsIGdiLCAxKTsKKwkJfQorCQlMQVNUX1NLSVBfQklUUyhyZSwgZ2IsIDEpOworCQlVUERBVEVfQ0FDSEUocmUsIGdiKTsKKworCQlpZiAoaSA8IGxpbWl0IC0gMSkgeworCQkJaWYgKGspIHsKKwkJCQlpZiAoayA+IE1JTl9DQUNIRV9CSVRTIC0gMSkgeworCQkJCQlidWYgPSBTSE9XX1VCSVRTKHJlLCBnYiwgMTYpIDw8IChrLTE2KTsKKwkJCQkJTEFTVF9TS0lQX0JJVFMocmUsIGdiLCAxNik7CisJCQkJCVVQREFURV9DQUNIRShyZSwgZ2IpOworCQkJCQlidWYgfD0gU0hPV19VQklUUyhyZSwgZ2IsIGstMTYpOworCQkJCQlMQVNUX1NLSVBfQklUUyhyZSwgZ2IsIGstMTYpOworCQkJCX0gZWxzZSB7CisJCQkJCWJ1ZiA9IFNIT1dfVUJJVFMocmUsIGdiLCBrKTsKKwkJCQkJTEFTVF9TS0lQX0JJVFMocmUsIGdiLCBrKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWJ1ZiA9IDA7CisJCQl9CisJCQlidWYgKz0gKCh1MzIpaSA8PCBrKTsKKwkJfSBlbHNlIGlmIChpID09IGxpbWl0IC0gMSkgeworCQkJYnVmID0gU0hPV19VQklUUyhyZSwgZ2IsIGVzY19sZW4pOworCQkJTEFTVF9TS0lQX0JJVFMocmUsIGdiLCBlc2NfbGVuKTsKKworCQkJYnVmICsrOworCQl9IGVsc2UgeworCQkJYnVmID0gLTE7CisJCX0KKwkJQ0xPU0VfUkVBREVSKHJlLCBnYik7CisJCXJldHVybiBidWY7CisJfQorfQorCisvKioKKyAqIHJlYWQgc2lnbmVkIGdvbG9tYiByaWNlIGNvZGUgKGZmdjEpLgorICovCitzdGF0aWMgaW5saW5lIGludCBnZXRfc3JfZ29sb21iKHN0cnVjdCBnZXRfYml0c19jb250ZXh0ICpnYiwKKwlpbnQgaywgaW50IGxpbWl0LCBpbnQgZXNjX2xlbikKK3sKKwl1MzIgdiA9IGdldF91cl9nb2xvbWIoZ2IsIGssIGxpbWl0LCBlc2NfbGVuKTsKKworCXJldHVybiAodiA+PiAxKSBeIC0odiAmIDEpOworfQorCisvKioKKyAqIHJlYWQgc2lnbmVkIGdvbG9tYiByaWNlIGNvZGUgKGZsYWMpLgorICovCitzdGF0aWMgaW5saW5lIGludCBnZXRfc3JfZ29sb21iX2ZsYWMoc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKmdiLAorCWludCBrLCBpbnQgbGltaXQsIGludCBlc2NfbGVuKQoreworCXUzMiB2ID0gZ2V0X3VyX2dvbG9tYl9qcGVnbHMoZ2IsIGssIGxpbWl0LCBlc2NfbGVuKTsKKworCXJldHVybiAodiA+PiAxKSBeIC0odiAmIDEpOworfQorCisvKioKKyAqIHJlYWQgdTMyIGdvbG9tYiByaWNlIGNvZGUgKHNob3J0ZW4pLgorICovCitzdGF0aWMgaW5saW5lIHUzMiBnZXRfdXJfZ29sb21iX3Nob3J0ZW4oc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKmdiLCBpbnQgaykKK3sKKwlyZXR1cm4gZ2V0X3VyX2dvbG9tYl9qcGVnbHMoZ2IsIGssIElOVF9NQVgsIDApOworfQorCisvKioKKyAqIHJlYWQgc2lnbmVkIGdvbG9tYiByaWNlIGNvZGUgKHNob3J0ZW4pLgorICovCitzdGF0aWMgaW5saW5lIGludCBnZXRfc3JfZ29sb21iX3Nob3J0ZW4oc3RydWN0IGdldF9iaXRzX2NvbnRleHQgKmdiLCBpbnQgaykKK3sKKwlpbnQgdXZhciA9IGdldF91cl9nb2xvbWJfanBlZ2xzKGdiLCBrICsgMSwgSU5UX01BWCwgMCk7CisKKwlyZXR1cm4gKHV2YXIgPj4gMSkgXiAtKHV2YXIgJiAxKTsKK30KKworLyoqCisgKiB3cml0ZSB1MzIgZXhwIGdvbG9tYiBjb2RlLiAyXjE2IC0gMiBhdCBtb3N0CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfdWVfZ29sb21iKHN0cnVjdCBwdXRfYml0c19jb250ZXh0ICpwYiwgaW50IGkpCit7CisJaWYgKGkgPCAyNTYpCisJCXB1dF9iaXRzKHBiLCBmZl91ZV9nb2xvbWJfbGVuW2ldLCBpICsgMSk7CisJZWxzZSB7CisJCWludCBlID0gYXZfbG9nMihpICsgMSk7CisJCXB1dF9iaXRzKHBiLCAyICogZSArIDEsIGkgKyAxKTsKKwl9Cit9CisKKy8qKgorICogd3JpdGUgdTMyIGV4cCBnb2xvbWIgY29kZS4gMl4zMi0yIGF0IG1vc3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfdWVfZ29sb21iX2xvbmcoc3RydWN0IHB1dF9iaXRzX2NvbnRleHQgKnBiLCB1MzIgaSkKK3sKKwlpZiAoaSA8IDI1NikKKwkJcHV0X2JpdHMocGIsIGZmX3VlX2dvbG9tYl9sZW5baV0sIGkgKyAxKTsKKwllbHNlIHsKKwkJaW50IGUgPSBhdl9sb2cyKGkgKyAxKTsKKwkJcHV0X2JpdHM2NChwYiwgMiAqIGUgKyAxLCBpICsgMSk7CisJfQorfQorCisvKioKKyAqIHdyaXRlIHRydW5jYXRlZCB1MzIgZXhwIGdvbG9tYiBjb2RlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3RlX2dvbG9tYihzdHJ1Y3QgcHV0X2JpdHNfY29udGV4dCAqcGIsIGludCBpLCBpbnQgcmFuZ2UpCit7CisJaWYgKHJhbmdlID09IDIpCisJCXB1dF9iaXRzKHBiLCAxLCBpIF4gMSk7CisJZWxzZQorCQlzZXRfdWVfZ29sb21iKHBiLCBpKTsKK30KKworLyoqCisgKiB3cml0ZSBzaWduZWQgZXhwIGdvbG9tYiBjb2RlLiAxNiBiaXRzIGF0IG1vc3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfc2VfZ29sb21iKHN0cnVjdCBwdXRfYml0c19jb250ZXh0ICpwYiwgaW50IGkpCit7CisJaSA9IDIgKiBpIC0gMTsKKworCWlmIChpIDwgMCkKKwkJaSBePSAtMTsgICAgLy9GSVhNRSBjaGVjayBpZiBnY2MgZG9lcyB0aGUgcmlnaHQgdGhpbmcKKwlzZXRfdWVfZ29sb21iKHBiLCBpKTsKK30KKworLyoqCisgKiB3cml0ZSB1MzIgZ29sb21iIHJpY2UgY29kZSAoZmZ2MSkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfdXJfZ29sb21iKHN0cnVjdCBwdXRfYml0c19jb250ZXh0ICpwYiwgaW50IGksIGludCBrLCBpbnQgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXNjX2xlbikKK3sKKwlpbnQgZTsKKworCWUgPSBpID4+IGs7CisJaWYgKGUgPCBsaW1pdCkKKwkJcHV0X2JpdHMocGIsIGUgKyBrICsgMSwgKDEgPDwgaykgKyBhdl9tb2RfdWludHAyKGksIGspKTsKKwllbHNlCisJCXB1dF9iaXRzKHBiLCBsaW1pdCArIGVzY19sZW4sIGkgLSBsaW1pdCArIDEpOworfQorCisvKioKKyAqIHdyaXRlIHUzMiBnb2xvbWIgcmljZSBjb2RlIChqcGVnbHMpLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3VyX2dvbG9tYl9qcGVnbHMoc3RydWN0IHB1dF9iaXRzX2NvbnRleHQgKnBiLAorCWludCBpLCBpbnQgaywgaW50IGxpbWl0LCBpbnQgZXNjX2xlbikKK3sKKwlpbnQgZTsKKworCWUgPSAoaSA+PiBrKSArIDE7CisJaWYgKGUgPCBsaW1pdCkgeworCQl3aGlsZSAoZSA+IDMxKSB7CisJCQlwdXRfYml0cyhwYiwgMzEsIDApOworCQkJZSAtPSAzMTsKKwkJfQorCQlwdXRfYml0cyhwYiwgZSwgMSk7CisJCWlmIChrKQorCQkJcHV0X3NiaXRzKHBiLCBrLCBpKTsKKwl9IGVsc2UgeworCQl3aGlsZSAobGltaXQgPiAzMSkgeworCQkJcHV0X2JpdHMocGIsIDMxLCAwKTsKKwkJCWxpbWl0IC09IDMxOworCQl9CisJCXB1dF9iaXRzKHBiLCBsaW1pdCwgMSk7CisJCXB1dF9iaXRzKHBiLCBlc2NfbGVuLCBpIC0gMSk7CisJfQorfQorCisvKioKKyAqIHdyaXRlIHNpZ25lZCBnb2xvbWIgcmljZSBjb2RlIChmZnYxKS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNldF9zcl9nb2xvbWIoc3RydWN0IHB1dF9iaXRzX2NvbnRleHQgKnBiLAorCWludCBpLCBpbnQgaywgaW50IGxpbWl0LCBpbnQgZXNjX2xlbikKK3sKKwlpbnQgdjsKKworCXYgID0gLTIgKiBpIC0gMTsKKwl2IF49ICh2ID4+IDMxKTsKKworCXNldF91cl9nb2xvbWIocGIsIHYsIGssIGxpbWl0LCBlc2NfbGVuKTsKK30KKworLyoqCisgKiB3cml0ZSBzaWduZWQgZ29sb21iIHJpY2UgY29kZSAoZmxhYykuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfc3JfZ29sb21iX2ZsYWMoc3RydWN0IHB1dF9iaXRzX2NvbnRleHQgKnBiLAorCWludCBpLCBpbnQgaywgaW50IGxpbWl0LCBpbnQgZXNjX2xlbikKK3sKKwlpbnQgdjsKKworCXYgID0gLTIgKiBpIC0gMTsKKwl2IF49ICh2ID4+IDMxKTsKKworCXNldF91cl9nb2xvbWJfanBlZ2xzKHBiLCB2LCBrLCBsaW1pdCwgZXNjX2xlbik7Cit9CisKKyNlbmRpZiAvKiBBVkNPREVDX0dPTE9NQl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FtdmRlY19wb3J0cy91dGlscy9waXhmbXQuaCBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL3V0aWxzL3BpeGZtdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMzQxMWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FtdmRlY19wb3J0cy91dGlscy9waXhmbXQuaApAQCAtMCwwICsxLDQ3MCBAQAorI2lmbmRlZiBBVlVUSUxfUElYRk1UX0gKKyNkZWZpbmUgQVZVVElMX1BJWEZNVF9ICisKKy8qKgorICogUGl4ZWwgZm9ybWF0LgorICoKKyAqIEBub3RlCisgKiBBVl9QSVhfRk1UX1JHQjMyIGlzIGhhbmRsZWQgaW4gYW4gZW5kaWFuLXNwZWNpZmljIG1hbm5lci4gQW4gUkdCQQorICogY29sb3IgaXMgcHV0IHRvZ2V0aGVyIGFzOgorICogIChBIDw8IDI0KSB8IChSIDw8IDE2KSB8IChHIDw8IDgpIHwgQgorICogVGhpcyBpcyBzdG9yZWQgYXMgQkdSQSBvbiBsaXR0bGUtZW5kaWFuIENQVSBhcmNoaXRlY3R1cmVzIGFuZCBBUkdCIG9uCisgKiBiaWctZW5kaWFuIENQVXMuCisgKgorICogQG5vdGUKKyAqIElmIHRoZSByZXNvbHV0aW9uIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBjaHJvbWEgc3Vic2FtcGxpbmcgZmFjdG9yCisgKiB0aGVuIHRoZSBjaHJvbWEgcGxhbmUgcmVzb2x1dGlvbiBtdXN0IGJlIHJvdW5kZWQgdXAuCisgKgorICogQHBhcgorICogV2hlbiB0aGUgcGl4ZWwgZm9ybWF0IGlzIHBhbGV0dGl6ZWQgUkdCMzIgKEFWX1BJWF9GTVRfUEFMOCksIHRoZSBwYWxldHRpemVkCisgKiBpbWFnZSBkYXRhIGlzIHN0b3JlZCBpbiBBVkZyYW1lLmRhdGFbMF0uIFRoZSBwYWxldHRlIGlzIHRyYW5zcG9ydGVkIGluCisgKiBBVkZyYW1lLmRhdGFbMV0sIGlzIDEwMjQgYnl0ZXMgbG9uZyAoMjU2IDQtYnl0ZSBlbnRyaWVzKSBhbmQgaXMKKyAqIGZvcm1hdHRlZCB0aGUgc2FtZSBhcyBpbiBBVl9QSVhfRk1UX1JHQjMyIGRlc2NyaWJlZCBhYm92ZSAoaS5lLiwgaXQgaXMKKyAqIGFsc28gZW5kaWFuLXNwZWNpZmljKS4gTm90ZSBhbHNvIHRoYXQgdGhlIGluZGl2aWR1YWwgUkdCMzIgcGFsZXR0ZQorICogY29tcG9uZW50cyBzdG9yZWQgaW4gQVZGcmFtZS5kYXRhWzFdIHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgMC4uMjU1LgorICogVGhpcyBpcyBpbXBvcnRhbnQgYXMgbWFueSBjdXN0b20gUEFMOCB2aWRlbyBjb2RlY3MgdGhhdCB3ZXJlIGRlc2lnbmVkCisgKiB0byBydW4gb24gdGhlIElCTSBWR0EgZ3JhcGhpY3MgYWRhcHRlciB1c2UgNi1iaXQgcGFsZXR0ZSBjb21wb25lbnRzLgorICoKKyAqIEBwYXIKKyAqIEZvciBhbGwgdGhlIDggYml0cyBwZXIgcGl4ZWwgZm9ybWF0cywgYW4gUkdCMzIgcGFsZXR0ZSBpcyBpbiBkYXRhWzFdIGxpa2UKKyAqIGZvciBwYWw4LiBUaGlzIHBhbGV0dGUgaXMgZmlsbGVkIGluIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGZ1bmN0aW9uCisgKiBhbGxvY2F0aW5nIHRoZSBwaWN0dXJlLgorICovCitlbnVtIEFWUGl4ZWxGb3JtYXQgeworICAgIEFWX1BJWF9GTVRfTk9ORSA9IC0xLAorICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwgICAvLy88IHBsYW5hciBZVVYgNDoyOjAsIDEyYnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngyIFkgc2FtcGxlcykKKyAgICBBVl9QSVhfRk1UX1lVWVY0MjIsICAgLy8vPCBwYWNrZWQgWVVWIDQ6MjoyLCAxNmJwcCwgWTAgQ2IgWTEgQ3IKKyAgICBBVl9QSVhfRk1UX1JHQjI0LCAgICAgLy8vPCBwYWNrZWQgUkdCIDg6ODo4LCAyNGJwcCwgUkdCUkdCLi4uCisgICAgQVZfUElYX0ZNVF9CR1IyNCwgICAgIC8vLzwgcGFja2VkIFJHQiA4Ojg6OCwgMjRicHAsIEJHUkJHUi4uLgorICAgIEFWX1BJWF9GTVRfWVVWNDIyUCwgICAvLy88IHBsYW5hciBZVVYgNDoyOjIsIDE2YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngxIFkgc2FtcGxlcykKKyAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsICAgLy8vPCBwbGFuYXIgWVVWIDQ6NDo0LCAyNGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDF4MSBZIHNhbXBsZXMpCisgICAgQVZfUElYX0ZNVF9ZVVY0MTBQLCAgIC8vLzwgcGxhbmFyIFlVViA0OjE6MCwgIDlicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciA0eDQgWSBzYW1wbGVzKQorICAgIEFWX1BJWF9GTVRfWVVWNDExUCwgICAvLy88IHBsYW5hciBZVVYgNDoxOjEsIDEyYnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgNHgxIFkgc2FtcGxlcykKKyAgICBBVl9QSVhfRk1UX0dSQVk4LCAgICAgLy8vPCAgICAgICAgWSAgICAgICAgLCAgOGJwcAorICAgIEFWX1BJWF9GTVRfTU9OT1dISVRFLCAvLy88ICAgICAgICBZICAgICAgICAsICAxYnBwLCAwIGlzIHdoaXRlLCAxIGlzIGJsYWNrLCBpbiBlYWNoIGJ5dGUgcGl4ZWxzIGFyZSBvcmRlcmVkIGZyb20gdGhlIG1zYiB0byB0aGUgbHNiCisgICAgQVZfUElYX0ZNVF9NT05PQkxBQ0ssIC8vLzwgICAgICAgIFkgICAgICAgICwgIDFicHAsIDAgaXMgYmxhY2ssIDEgaXMgd2hpdGUsIGluIGVhY2ggYnl0ZSBwaXhlbHMgYXJlIG9yZGVyZWQgZnJvbSB0aGUgbXNiIHRvIHRoZSBsc2IKKyAgICBBVl9QSVhfRk1UX1BBTDgsICAgICAgLy8vPCA4IGJpdHMgd2l0aCBBVl9QSVhfRk1UX1JHQjMyIHBhbGV0dGUKKyAgICBBVl9QSVhfRk1UX1lVVko0MjBQLCAgLy8vPCBwbGFuYXIgWVVWIDQ6MjowLCAxMmJwcCwgZnVsbCBzY2FsZSAoSlBFRyksIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgQVZfUElYX0ZNVF9ZVVY0MjBQIGFuZCBzZXR0aW5nIGNvbG9yX3JhbmdlCisgICAgQVZfUElYX0ZNVF9ZVVZKNDIyUCwgIC8vLzwgcGxhbmFyIFlVViA0OjI6MiwgMTZicHAsIGZ1bGwgc2NhbGUgKEpQRUcpLCBkZXByZWNhdGVkIGluIGZhdm9yIG9mIEFWX1BJWF9GTVRfWVVWNDIyUCBhbmQgc2V0dGluZyBjb2xvcl9yYW5nZQorICAgIEFWX1BJWF9GTVRfWVVWSjQ0NFAsICAvLy88IHBsYW5hciBZVVYgNDo0OjQsIDI0YnBwLCBmdWxsIHNjYWxlIChKUEVHKSwgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBBVl9QSVhfRk1UX1lVVjQ0NFAgYW5kIHNldHRpbmcgY29sb3JfcmFuZ2UKKyAgICBBVl9QSVhfRk1UX1VZVlk0MjIsICAgLy8vPCBwYWNrZWQgWVVWIDQ6MjoyLCAxNmJwcCwgQ2IgWTAgQ3IgWTEKKyAgICBBVl9QSVhfRk1UX1VZWVZZWTQxMSwgLy8vPCBwYWNrZWQgWVVWIDQ6MToxLCAxMmJwcCwgQ2IgWTAgWTEgQ3IgWTIgWTMKKyAgICBBVl9QSVhfRk1UX0JHUjgsICAgICAgLy8vPCBwYWNrZWQgUkdCIDM6MzoyLCAgOGJwcCwgKG1zYikyQiAzRyAzUihsc2IpCisgICAgQVZfUElYX0ZNVF9CR1I0LCAgICAgIC8vLzwgcGFja2VkIFJHQiAxOjI6MSBiaXRzdHJlYW0sICA0YnBwLCAobXNiKTFCIDJHIDFSKGxzYiksIGEgYnl0ZSBjb250YWlucyB0d28gcGl4ZWxzLCB0aGUgZmlyc3QgcGl4ZWwgaW4gdGhlIGJ5dGUgaXMgdGhlIG9uZSBjb21wb3NlZCBieSB0aGUgNCBtc2IgYml0cworICAgIEFWX1BJWF9GTVRfQkdSNF9CWVRFLCAvLy88IHBhY2tlZCBSR0IgMToyOjEsICA4YnBwLCAobXNiKTFCIDJHIDFSKGxzYikKKyAgICBBVl9QSVhfRk1UX1JHQjgsICAgICAgLy8vPCBwYWNrZWQgUkdCIDM6MzoyLCAgOGJwcCwgKG1zYikyUiAzRyAzQihsc2IpCisgICAgQVZfUElYX0ZNVF9SR0I0LCAgICAgIC8vLzwgcGFja2VkIFJHQiAxOjI6MSBiaXRzdHJlYW0sICA0YnBwLCAobXNiKTFSIDJHIDFCKGxzYiksIGEgYnl0ZSBjb250YWlucyB0d28gcGl4ZWxzLCB0aGUgZmlyc3QgcGl4ZWwgaW4gdGhlIGJ5dGUgaXMgdGhlIG9uZSBjb21wb3NlZCBieSB0aGUgNCBtc2IgYml0cworICAgIEFWX1BJWF9GTVRfUkdCNF9CWVRFLCAvLy88IHBhY2tlZCBSR0IgMToyOjEsICA4YnBwLCAobXNiKTFSIDJHIDFCKGxzYikKKyAgICBBVl9QSVhfRk1UX05WMTIsICAgICAgLy8vPCBwbGFuYXIgWVVWIDQ6MjowLCAxMmJwcCwgMSBwbGFuZSBmb3IgWSBhbmQgMSBwbGFuZSBmb3IgdGhlIFVWIGNvbXBvbmVudHMsIHdoaWNoIGFyZSBpbnRlcmxlYXZlZCAoZmlyc3QgYnl0ZSBVIGFuZCB0aGUgZm9sbG93aW5nIGJ5dGUgVikKKyAgICBBVl9QSVhfRk1UX05WMjEsICAgICAgLy8vPCBhcyBhYm92ZSwgYnV0IFUgYW5kIFYgYnl0ZXMgYXJlIHN3YXBwZWQKKworICAgIEFWX1BJWF9GTVRfQVJHQiwgICAgICAvLy88IHBhY2tlZCBBUkdCIDg6ODo4OjgsIDMyYnBwLCBBUkdCQVJHQi4uLgorICAgIEFWX1BJWF9GTVRfUkdCQSwgICAgICAvLy88IHBhY2tlZCBSR0JBIDg6ODo4OjgsIDMyYnBwLCBSR0JBUkdCQS4uLgorICAgIEFWX1BJWF9GTVRfQUJHUiwgICAgICAvLy88IHBhY2tlZCBBQkdSIDg6ODo4OjgsIDMyYnBwLCBBQkdSQUJHUi4uLgorICAgIEFWX1BJWF9GTVRfQkdSQSwgICAgICAvLy88IHBhY2tlZCBCR1JBIDg6ODo4OjgsIDMyYnBwLCBCR1JBQkdSQS4uLgorCisgICAgQVZfUElYX0ZNVF9HUkFZMTZCRSwgIC8vLzwgICAgICAgIFkgICAgICAgICwgMTZicHAsIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX0dSQVkxNkxFLCAgLy8vPCAgICAgICAgWSAgICAgICAgLCAxNmJwcCwgbGl0dGxlLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfWVVWNDQwUCwgICAvLy88IHBsYW5hciBZVVYgNDo0OjAgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDF4MiBZIHNhbXBsZXMpCisgICAgQVZfUElYX0ZNVF9ZVVZKNDQwUCwgIC8vLzwgcGxhbmFyIFlVViA0OjQ6MCBmdWxsIHNjYWxlIChKUEVHKSwgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBBVl9QSVhfRk1UX1lVVjQ0MFAgYW5kIHNldHRpbmcgY29sb3JfcmFuZ2UKKyAgICBBVl9QSVhfRk1UX1lVVkE0MjBQLCAgLy8vPCBwbGFuYXIgWVVWIDQ6MjowLCAyMGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MiBZICYgQSBzYW1wbGVzKQorICAgIEFWX1BJWF9GTVRfUkdCNDhCRSwgICAvLy88IHBhY2tlZCBSR0IgMTY6MTY6MTYsIDQ4YnBwLCAxNlIsIDE2RywgMTZCLCB0aGUgMi1ieXRlIHZhbHVlIGZvciBlYWNoIFIvRy9CIGNvbXBvbmVudCBpcyBzdG9yZWQgYXMgYmlnLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfUkdCNDhMRSwgICAvLy88IHBhY2tlZCBSR0IgMTY6MTY6MTYsIDQ4YnBwLCAxNlIsIDE2RywgMTZCLCB0aGUgMi1ieXRlIHZhbHVlIGZvciBlYWNoIFIvRy9CIGNvbXBvbmVudCBpcyBzdG9yZWQgYXMgbGl0dGxlLWVuZGlhbgorCisgICAgQVZfUElYX0ZNVF9SR0I1NjVCRSwgIC8vLzwgcGFja2VkIFJHQiA1OjY6NSwgMTZicHAsIChtc2IpICAgNVIgNkcgNUIobHNiKSwgYmlnLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfUkdCNTY1TEUsICAvLy88IHBhY2tlZCBSR0IgNTo2OjUsIDE2YnBwLCAobXNiKSAgIDVSIDZHIDVCKGxzYiksIGxpdHRsZS1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1JHQjU1NUJFLCAgLy8vPCBwYWNrZWQgUkdCIDU6NTo1LCAxNmJwcCwgKG1zYikxWCA1UiA1RyA1Qihsc2IpLCBiaWctZW5kaWFuICAgLCBYPXVudXNlZC91bmRlZmluZWQKKyAgICBBVl9QSVhfRk1UX1JHQjU1NUxFLCAgLy8vPCBwYWNrZWQgUkdCIDU6NTo1LCAxNmJwcCwgKG1zYikxWCA1UiA1RyA1Qihsc2IpLCBsaXR0bGUtZW5kaWFuLCBYPXVudXNlZC91bmRlZmluZWQKKworICAgIEFWX1BJWF9GTVRfQkdSNTY1QkUsICAvLy88IHBhY2tlZCBCR1IgNTo2OjUsIDE2YnBwLCAobXNiKSAgIDVCIDZHIDVSKGxzYiksIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX0JHUjU2NUxFLCAgLy8vPCBwYWNrZWQgQkdSIDU6Njo1LCAxNmJwcCwgKG1zYikgICA1QiA2RyA1Uihsc2IpLCBsaXR0bGUtZW5kaWFuCisgICAgQVZfUElYX0ZNVF9CR1I1NTVCRSwgIC8vLzwgcGFja2VkIEJHUiA1OjU6NSwgMTZicHAsIChtc2IpMVggNUIgNUcgNVIobHNiKSwgYmlnLWVuZGlhbiAgICwgWD11bnVzZWQvdW5kZWZpbmVkCisgICAgQVZfUElYX0ZNVF9CR1I1NTVMRSwgIC8vLzwgcGFja2VkIEJHUiA1OjU6NSwgMTZicHAsIChtc2IpMVggNUIgNUcgNVIobHNiKSwgbGl0dGxlLWVuZGlhbiwgWD11bnVzZWQvdW5kZWZpbmVkCisKKyNpZmRlZiBGRl9BUElfVkFBUEkKKyAgICAvKiogQG5hbWUgRGVwcmVjYXRlZCBwaXhlbCBmb3JtYXRzICovCisgICAgLyoqQHsqLworICAgIEFWX1BJWF9GTVRfVkFBUElfTU9DTywgLy8vPCBIVyBhY2NlbGVyYXRpb24gdGhyb3VnaCBWQSBBUEkgYXQgbW90aW9uIGNvbXBlbnNhdGlvbiBlbnRyeS1wb2ludCwgUGljdHVyZS5kYXRhWzNdIGNvbnRhaW5zIGEgdmFhcGlfcmVuZGVyX3N0YXRlIHN0cnVjdCB3aGljaCBjb250YWlucyBtYWNyb2Jsb2NrcyBhcyB3ZWxsIGFzIHZhcmlvdXMgZmllbGRzIGV4dHJhY3RlZCBmcm9tIGhlYWRlcnMKKyAgICBBVl9QSVhfRk1UX1ZBQVBJX0lEQ1QsIC8vLzwgSFcgYWNjZWxlcmF0aW9uIHRocm91Z2ggVkEgQVBJIGF0IElEQ1QgZW50cnktcG9pbnQsIFBpY3R1cmUuZGF0YVszXSBjb250YWlucyBhIHZhYXBpX3JlbmRlcl9zdGF0ZSBzdHJ1Y3Qgd2hpY2ggY29udGFpbnMgZmllbGRzIGV4dHJhY3RlZCBmcm9tIGhlYWRlcnMKKyAgICBBVl9QSVhfRk1UX1ZBQVBJX1ZMRCwgIC8vLzwgSFcgZGVjb2RpbmcgdGhyb3VnaCBWQSBBUEksIFBpY3R1cmUuZGF0YVszXSBjb250YWlucyBhIFZBU3VyZmFjZUlECisgICAgLyoqQH0qLworICAgIEFWX1BJWF9GTVRfVkFBUEkgPSBBVl9QSVhfRk1UX1ZBQVBJX1ZMRCwKKyNlbHNlCisgICAgLyoqCisgICAgICogIEhhcmR3YXJlIGFjY2VsZXJhdGlvbiB0aHJvdWdoIFZBLUFQSSwgZGF0YVszXSBjb250YWlucyBhCisgICAgICogIFZBU3VyZmFjZUlELgorICAgICAqLworICAgIEFWX1BJWF9GTVRfVkFBUEksCisjZW5kaWYKKworICAgIEFWX1BJWF9GTVRfWVVWNDIwUDE2TEUsICAvLy88IHBsYW5hciBZVVYgNDoyOjAsIDI0YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngyIFkgc2FtcGxlcyksIGxpdHRsZS1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVjQyMFAxNkJFLCAgLy8vPCBwbGFuYXIgWVVWIDQ6MjowLCAyNGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MiBZIHNhbXBsZXMpLCBiaWctZW5kaWFuCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTZMRSwgIC8vLzwgcGxhbmFyIFlVViA0OjI6MiwgMzJicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDEgWSBzYW1wbGVzKSwgbGl0dGxlLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfWVVWNDIyUDE2QkUsICAvLy88IHBsYW5hciBZVVYgNDoyOjIsIDMyYnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngxIFkgc2FtcGxlcyksIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxNkxFLCAgLy8vPCBwbGFuYXIgWVVWIDQ6NDo0LCA0OGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDF4MSBZIHNhbXBsZXMpLCBsaXR0bGUtZW5kaWFuCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTZCRSwgIC8vLzwgcGxhbmFyIFlVViA0OjQ6NCwgNDhicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAxeDEgWSBzYW1wbGVzKSwgYmlnLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfRFhWQTJfVkxELCAgICAvLy88IEhXIGRlY29kaW5nIHRocm91Z2ggRFhWQTIsIFBpY3R1cmUuZGF0YVszXSBjb250YWlucyBhIExQRElSRUNUM0RTVVJGQUNFOSBwb2ludGVyCisKKyAgICBBVl9QSVhfRk1UX1JHQjQ0NExFLCAgLy8vPCBwYWNrZWQgUkdCIDQ6NDo0LCAxNmJwcCwgKG1zYik0WCA0UiA0RyA0Qihsc2IpLCBsaXR0bGUtZW5kaWFuLCBYPXVudXNlZC91bmRlZmluZWQKKyAgICBBVl9QSVhfRk1UX1JHQjQ0NEJFLCAgLy8vPCBwYWNrZWQgUkdCIDQ6NDo0LCAxNmJwcCwgKG1zYik0WCA0UiA0RyA0Qihsc2IpLCBiaWctZW5kaWFuLCAgICBYPXVudXNlZC91bmRlZmluZWQKKyAgICBBVl9QSVhfRk1UX0JHUjQ0NExFLCAgLy8vPCBwYWNrZWQgQkdSIDQ6NDo0LCAxNmJwcCwgKG1zYik0WCA0QiA0RyA0Uihsc2IpLCBsaXR0bGUtZW5kaWFuLCBYPXVudXNlZC91bmRlZmluZWQKKyAgICBBVl9QSVhfRk1UX0JHUjQ0NEJFLCAgLy8vPCBwYWNrZWQgQkdSIDQ6NDo0LCAxNmJwcCwgKG1zYik0WCA0QiA0RyA0Uihsc2IpLCBiaWctZW5kaWFuLCAgICBYPXVudXNlZC91bmRlZmluZWQKKyAgICBBVl9QSVhfRk1UX1lBOCwgICAgICAgLy8vPCA4IGJpdHMgZ3JheSwgOCBiaXRzIGFscGhhCisKKyAgICBBVl9QSVhfRk1UX1k0MDBBID0gQVZfUElYX0ZNVF9ZQTgsIC8vLzwgYWxpYXMgZm9yIEFWX1BJWF9GTVRfWUE4CisgICAgQVZfUElYX0ZNVF9HUkFZOEE9IEFWX1BJWF9GTVRfWUE4LCAvLy88IGFsaWFzIGZvciBBVl9QSVhfRk1UX1lBOAorCisgICAgQVZfUElYX0ZNVF9CR1I0OEJFLCAgIC8vLzwgcGFja2VkIFJHQiAxNjoxNjoxNiwgNDhicHAsIDE2QiwgMTZHLCAxNlIsIHRoZSAyLWJ5dGUgdmFsdWUgZm9yIGVhY2ggUi9HL0IgY29tcG9uZW50IGlzIHN0b3JlZCBhcyBiaWctZW5kaWFuCisgICAgQVZfUElYX0ZNVF9CR1I0OExFLCAgIC8vLzwgcGFja2VkIFJHQiAxNjoxNjoxNiwgNDhicHAsIDE2QiwgMTZHLCAxNlIsIHRoZSAyLWJ5dGUgdmFsdWUgZm9yIGVhY2ggUi9HL0IgY29tcG9uZW50IGlzIHN0b3JlZCBhcyBsaXR0bGUtZW5kaWFuCisKKyAgICAvKioKKyAgICAgKiBUaGUgZm9sbG93aW5nIDEyIGZvcm1hdHMgaGF2ZSB0aGUgZGlzYWR2YW50YWdlIG9mIG5lZWRpbmcgMSBmb3JtYXQgZm9yIGVhY2ggYml0IGRlcHRoLgorICAgICAqIE5vdGljZSB0aGF0IGVhY2ggOS8xMCBiaXRzIHNhbXBsZSBpcyBzdG9yZWQgaW4gMTYgYml0cyB3aXRoIGV4dHJhIHBhZGRpbmcuCisgICAgICogSWYgeW91IHdhbnQgdG8gc3VwcG9ydCBtdWx0aXBsZSBiaXQgZGVwdGhzLCB0aGVuIHVzaW5nIEFWX1BJWF9GTVRfWVVWNDIwUDE2KiB3aXRoIHRoZSBicHAgc3RvcmVkIHNlcGFyYXRlbHkgaXMgYmV0dGVyLgorICAgICAqLworICAgIEFWX1BJWF9GTVRfWVVWNDIwUDlCRSwgLy8vPCBwbGFuYXIgWVVWIDQ6MjowLCAxMy41YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngyIFkgc2FtcGxlcyksIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVjQyMFA5TEUsIC8vLzwgcGxhbmFyIFlVViA0OjI6MCwgMTMuNWJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MiBZIHNhbXBsZXMpLCBsaXR0bGUtZW5kaWFuCisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTBCRSwvLy88IHBsYW5hciBZVVYgNDoyOjAsIDE1YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngyIFkgc2FtcGxlcyksIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMExFLC8vLzwgcGxhbmFyIFlVViA0OjI6MCwgMTVicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDIgWSBzYW1wbGVzKSwgbGl0dGxlLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfWVVWNDIyUDEwQkUsLy8vPCBwbGFuYXIgWVVWIDQ6MjoyLCAyMGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MSBZIHNhbXBsZXMpLCBiaWctZW5kaWFuCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTBMRSwvLy88IHBsYW5hciBZVVYgNDoyOjIsIDIwYnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngxIFkgc2FtcGxlcyksIGxpdHRsZS1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVjQ0NFA5QkUsIC8vLzwgcGxhbmFyIFlVViA0OjQ6NCwgMjdicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAxeDEgWSBzYW1wbGVzKSwgYmlnLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDlMRSwgLy8vPCBwbGFuYXIgWVVWIDQ6NDo0LCAyN2JwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDF4MSBZIHNhbXBsZXMpLCBsaXR0bGUtZW5kaWFuCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTBCRSwvLy88IHBsYW5hciBZVVYgNDo0OjQsIDMwYnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMXgxIFkgc2FtcGxlcyksIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxMExFLC8vLzwgcGxhbmFyIFlVViA0OjQ6NCwgMzBicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAxeDEgWSBzYW1wbGVzKSwgbGl0dGxlLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfWVVWNDIyUDlCRSwgLy8vPCBwbGFuYXIgWVVWIDQ6MjoyLCAxOGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MSBZIHNhbXBsZXMpLCBiaWctZW5kaWFuCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQOUxFLCAvLy88IHBsYW5hciBZVVYgNDoyOjIsIDE4YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngxIFkgc2FtcGxlcyksIGxpdHRsZS1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX0dCUlAsICAgICAgLy8vPCBwbGFuYXIgR0JSIDQ6NDo0IDI0YnBwCisgICAgQVZfUElYX0ZNVF9HQlIyNFAgPSBBVl9QSVhfRk1UX0dCUlAsIC8vIGFsaWFzIGZvciAjQVZfUElYX0ZNVF9HQlJQCisgICAgQVZfUElYX0ZNVF9HQlJQOUJFLCAgIC8vLzwgcGxhbmFyIEdCUiA0OjQ6NCAyN2JwcCwgYmlnLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfR0JSUDlMRSwgICAvLy88IHBsYW5hciBHQlIgNDo0OjQgMjdicHAsIGxpdHRsZS1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX0dCUlAxMEJFLCAgLy8vPCBwbGFuYXIgR0JSIDQ6NDo0IDMwYnBwLCBiaWctZW5kaWFuCisgICAgQVZfUElYX0ZNVF9HQlJQMTBMRSwgIC8vLzwgcGxhbmFyIEdCUiA0OjQ6NCAzMGJwcCwgbGl0dGxlLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfR0JSUDE2QkUsICAvLy88IHBsYW5hciBHQlIgNDo0OjQgNDhicHAsIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX0dCUlAxNkxFLCAgLy8vPCBwbGFuYXIgR0JSIDQ6NDo0IDQ4YnBwLCBsaXR0bGUtZW5kaWFuCisgICAgQVZfUElYX0ZNVF9ZVVZBNDIyUCwgIC8vLzwgcGxhbmFyIFlVViA0OjI6MiAyNGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MSBZICYgQSBzYW1wbGVzKQorICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFAsICAvLy88IHBsYW5hciBZVVYgNDo0OjQgMzJicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAxeDEgWSAmIEEgc2FtcGxlcykKKyAgICBBVl9QSVhfRk1UX1lVVkE0MjBQOUJFLCAgLy8vPCBwbGFuYXIgWVVWIDQ6MjowIDIyLjVicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDIgWSAmIEEgc2FtcGxlcyksIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVkE0MjBQOUxFLCAgLy8vPCBwbGFuYXIgWVVWIDQ6MjowIDIyLjVicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDIgWSAmIEEgc2FtcGxlcyksIGxpdHRsZS1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVkE0MjJQOUJFLCAgLy8vPCBwbGFuYXIgWVVWIDQ6MjoyIDI3YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngxIFkgJiBBIHNhbXBsZXMpLCBiaWctZW5kaWFuCisgICAgQVZfUElYX0ZNVF9ZVVZBNDIyUDlMRSwgIC8vLzwgcGxhbmFyIFlVViA0OjI6MiAyN2JwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MSBZICYgQSBzYW1wbGVzKSwgbGl0dGxlLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFA5QkUsICAvLy88IHBsYW5hciBZVVYgNDo0OjQgMzZicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAxeDEgWSAmIEEgc2FtcGxlcyksIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVkE0NDRQOUxFLCAgLy8vPCBwbGFuYXIgWVVWIDQ6NDo0IDM2YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMXgxIFkgJiBBIHNhbXBsZXMpLCBsaXR0bGUtZW5kaWFuCisgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDEwQkUsIC8vLzwgcGxhbmFyIFlVViA0OjI6MCAyNWJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MiBZICYgQSBzYW1wbGVzLCBiaWctZW5kaWFuKQorICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAxMExFLCAvLy88IHBsYW5hciBZVVYgNDoyOjAgMjVicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDIgWSAmIEEgc2FtcGxlcywgbGl0dGxlLWVuZGlhbikKKyAgICBBVl9QSVhfRk1UX1lVVkE0MjJQMTBCRSwgLy8vPCBwbGFuYXIgWVVWIDQ6MjoyIDMwYnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngxIFkgJiBBIHNhbXBsZXMsIGJpZy1lbmRpYW4pCisgICAgQVZfUElYX0ZNVF9ZVVZBNDIyUDEwTEUsIC8vLzwgcGxhbmFyIFlVViA0OjI6MiAzMGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MSBZICYgQSBzYW1wbGVzLCBsaXR0bGUtZW5kaWFuKQorICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFAxMEJFLCAvLy88IHBsYW5hciBZVVYgNDo0OjQgNDBicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAxeDEgWSAmIEEgc2FtcGxlcywgYmlnLWVuZGlhbikKKyAgICBBVl9QSVhfRk1UX1lVVkE0NDRQMTBMRSwgLy8vPCBwbGFuYXIgWVVWIDQ6NDo0IDQwYnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMXgxIFkgJiBBIHNhbXBsZXMsIGxpdHRsZS1lbmRpYW4pCisgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDE2QkUsIC8vLzwgcGxhbmFyIFlVViA0OjI6MCA0MGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MiBZICYgQSBzYW1wbGVzLCBiaWctZW5kaWFuKQorICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAxNkxFLCAvLy88IHBsYW5hciBZVVYgNDoyOjAgNDBicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDIgWSAmIEEgc2FtcGxlcywgbGl0dGxlLWVuZGlhbikKKyAgICBBVl9QSVhfRk1UX1lVVkE0MjJQMTZCRSwgLy8vPCBwbGFuYXIgWVVWIDQ6MjoyIDQ4YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngxIFkgJiBBIHNhbXBsZXMsIGJpZy1lbmRpYW4pCisgICAgQVZfUElYX0ZNVF9ZVVZBNDIyUDE2TEUsIC8vLzwgcGxhbmFyIFlVViA0OjI6MiA0OGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MSBZICYgQSBzYW1wbGVzLCBsaXR0bGUtZW5kaWFuKQorICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFAxNkJFLCAvLy88IHBsYW5hciBZVVYgNDo0OjQgNjRicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAxeDEgWSAmIEEgc2FtcGxlcywgYmlnLWVuZGlhbikKKyAgICBBVl9QSVhfRk1UX1lVVkE0NDRQMTZMRSwgLy8vPCBwbGFuYXIgWVVWIDQ6NDo0IDY0YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMXgxIFkgJiBBIHNhbXBsZXMsIGxpdHRsZS1lbmRpYW4pCisKKyAgICBBVl9QSVhfRk1UX1ZEUEFVLCAgICAgLy8vPCBIVyBhY2NlbGVyYXRpb24gdGhyb3VnaCBWRFBBVSwgUGljdHVyZS5kYXRhWzNdIGNvbnRhaW5zIGEgVmRwVmlkZW9TdXJmYWNlCisKKyAgICBBVl9QSVhfRk1UX1hZWjEyTEUsICAgICAgLy8vPCBwYWNrZWQgWFlaIDQ6NDo0LCAzNiBicHAsIChtc2IpIDEyWCwgMTJZLCAxMlogKGxzYiksIHRoZSAyLWJ5dGUgdmFsdWUgZm9yIGVhY2ggWC9ZL1ogaXMgc3RvcmVkIGFzIGxpdHRsZS1lbmRpYW4sIHRoZSA0IGxvd2VyIGJpdHMgYXJlIHNldCB0byAwCisgICAgQVZfUElYX0ZNVF9YWVoxMkJFLCAgICAgIC8vLzwgcGFja2VkIFhZWiA0OjQ6NCwgMzYgYnBwLCAobXNiKSAxMlgsIDEyWSwgMTJaIChsc2IpLCB0aGUgMi1ieXRlIHZhbHVlIGZvciBlYWNoIFgvWS9aIGlzIHN0b3JlZCBhcyBiaWctZW5kaWFuLCB0aGUgNCBsb3dlciBiaXRzIGFyZSBzZXQgdG8gMAorICAgIEFWX1BJWF9GTVRfTlYxNiwgICAgICAgICAvLy88IGludGVybGVhdmVkIGNocm9tYSBZVVYgNDoyOjIsIDE2YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngxIFkgc2FtcGxlcykKKyAgICBBVl9QSVhfRk1UX05WMjBMRSwgICAgICAgLy8vPCBpbnRlcmxlYXZlZCBjaHJvbWEgWVVWIDQ6MjoyLCAyMGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MSBZIHNhbXBsZXMpLCBsaXR0bGUtZW5kaWFuCisgICAgQVZfUElYX0ZNVF9OVjIwQkUsICAgICAgIC8vLzwgaW50ZXJsZWF2ZWQgY2hyb21hIFlVViA0OjI6MiwgMjBicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDEgWSBzYW1wbGVzKSwgYmlnLWVuZGlhbgorCisgICAgQVZfUElYX0ZNVF9SR0JBNjRCRSwgICAgIC8vLzwgcGFja2VkIFJHQkEgMTY6MTY6MTY6MTYsIDY0YnBwLCAxNlIsIDE2RywgMTZCLCAxNkEsIHRoZSAyLWJ5dGUgdmFsdWUgZm9yIGVhY2ggUi9HL0IvQSBjb21wb25lbnQgaXMgc3RvcmVkIGFzIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1JHQkE2NExFLCAgICAgLy8vPCBwYWNrZWQgUkdCQSAxNjoxNjoxNjoxNiwgNjRicHAsIDE2UiwgMTZHLCAxNkIsIDE2QSwgdGhlIDItYnl0ZSB2YWx1ZSBmb3IgZWFjaCBSL0cvQi9BIGNvbXBvbmVudCBpcyBzdG9yZWQgYXMgbGl0dGxlLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfQkdSQTY0QkUsICAgICAvLy88IHBhY2tlZCBSR0JBIDE2OjE2OjE2OjE2LCA2NGJwcCwgMTZCLCAxNkcsIDE2UiwgMTZBLCB0aGUgMi1ieXRlIHZhbHVlIGZvciBlYWNoIFIvRy9CL0EgY29tcG9uZW50IGlzIHN0b3JlZCBhcyBiaWctZW5kaWFuCisgICAgQVZfUElYX0ZNVF9CR1JBNjRMRSwgICAgIC8vLzwgcGFja2VkIFJHQkEgMTY6MTY6MTY6MTYsIDY0YnBwLCAxNkIsIDE2RywgMTZSLCAxNkEsIHRoZSAyLWJ5dGUgdmFsdWUgZm9yIGVhY2ggUi9HL0IvQSBjb21wb25lbnQgaXMgc3RvcmVkIGFzIGxpdHRsZS1lbmRpYW4KKworICAgIEFWX1BJWF9GTVRfWVZZVTQyMiwgICAvLy88IHBhY2tlZCBZVVYgNDoyOjIsIDE2YnBwLCBZMCBDciBZMSBDYgorCisgICAgQVZfUElYX0ZNVF9ZQTE2QkUsICAgICAgIC8vLzwgMTYgYml0cyBncmF5LCAxNiBiaXRzIGFscGhhIChiaWctZW5kaWFuKQorICAgIEFWX1BJWF9GTVRfWUExNkxFLCAgICAgICAvLy88IDE2IGJpdHMgZ3JheSwgMTYgYml0cyBhbHBoYSAobGl0dGxlLWVuZGlhbikKKworICAgIEFWX1BJWF9GTVRfR0JSQVAsICAgICAgICAvLy88IHBsYW5hciBHQlJBIDQ6NDo0OjQgMzJicHAKKyAgICBBVl9QSVhfRk1UX0dCUkFQMTZCRSwgICAgLy8vPCBwbGFuYXIgR0JSQSA0OjQ6NDo0IDY0YnBwLCBiaWctZW5kaWFuCisgICAgQVZfUElYX0ZNVF9HQlJBUDE2TEUsICAgIC8vLzwgcGxhbmFyIEdCUkEgNDo0OjQ6NCA2NGJwcCwgbGl0dGxlLWVuZGlhbgorICAgIC8qKgorICAgICAqICBIVyBhY2NlbGVyYXRpb24gdGhyb3VnaCBRU1YsIGRhdGFbM10gY29udGFpbnMgYSBwb2ludGVyIHRvIHRoZQorICAgICAqICBtZnhGcmFtZVN1cmZhY2UxIHN0cnVjdHVyZS4KKyAgICAgKi8KKyAgICBBVl9QSVhfRk1UX1FTViwKKyAgICAvKioKKyAgICAgKiBIVyBhY2NlbGVyYXRpb24gdGhvdWdoIE1NQUwsIGRhdGFbM10gY29udGFpbnMgYSBwb2ludGVyIHRvIHRoZQorICAgICAqIE1NQUxfQlVGRkVSX0hFQURFUl9UIHN0cnVjdHVyZS4KKyAgICAgKi8KKyAgICBBVl9QSVhfRk1UX01NQUwsCisKKyAgICBBVl9QSVhfRk1UX0QzRDExVkFfVkxELCAgLy8vPCBIVyBkZWNvZGluZyB0aHJvdWdoIERpcmVjdDNEMTEgdmlhIG9sZCBBUEksIFBpY3R1cmUuZGF0YVszXSBjb250YWlucyBhIElEM0QxMVZpZGVvRGVjb2Rlck91dHB1dFZpZXcgcG9pbnRlcgorCisgICAgLyoqCisgICAgICogSFcgYWNjZWxlcmF0aW9uIHRocm91Z2ggQ1VEQS4gZGF0YVtpXSBjb250YWluIENVZGV2aWNlcHRyIHBvaW50ZXJzCisgICAgICogZXhhY3RseSBhcyBmb3Igc3lzdGVtIG1lbW9yeSBmcmFtZXMuCisgICAgICovCisgICAgQVZfUElYX0ZNVF9DVURBLAorCisgICAgQVZfUElYX0ZNVF8wUkdCLCAgICAgICAgLy8vPCBwYWNrZWQgUkdCIDg6ODo4LCAzMmJwcCwgWFJHQlhSR0IuLi4gICBYPXVudXNlZC91bmRlZmluZWQKKyAgICBBVl9QSVhfRk1UX1JHQjAsICAgICAgICAvLy88IHBhY2tlZCBSR0IgODo4OjgsIDMyYnBwLCBSR0JYUkdCWC4uLiAgIFg9dW51c2VkL3VuZGVmaW5lZAorICAgIEFWX1BJWF9GTVRfMEJHUiwgICAgICAgIC8vLzwgcGFja2VkIEJHUiA4Ojg6OCwgMzJicHAsIFhCR1JYQkdSLi4uICAgWD11bnVzZWQvdW5kZWZpbmVkCisgICAgQVZfUElYX0ZNVF9CR1IwLCAgICAgICAgLy8vPCBwYWNrZWQgQkdSIDg6ODo4LCAzMmJwcCwgQkdSWEJHUlguLi4gICBYPXVudXNlZC91bmRlZmluZWQKKworICAgIEFWX1BJWF9GTVRfWVVWNDIwUDEyQkUsIC8vLzwgcGxhbmFyIFlVViA0OjI6MCwxOGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MiBZIHNhbXBsZXMpLCBiaWctZW5kaWFuCisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTJMRSwgLy8vPCBwbGFuYXIgWVVWIDQ6MjowLDE4YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngyIFkgc2FtcGxlcyksIGxpdHRsZS1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVjQyMFAxNEJFLCAvLy88IHBsYW5hciBZVVYgNDoyOjAsMjFicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDIgWSBzYW1wbGVzKSwgYmlnLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfWVVWNDIwUDE0TEUsIC8vLzwgcGxhbmFyIFlVViA0OjI6MCwyMWJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MiBZIHNhbXBsZXMpLCBsaXR0bGUtZW5kaWFuCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTJCRSwgLy8vPCBwbGFuYXIgWVVWIDQ6MjoyLDI0YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngxIFkgc2FtcGxlcyksIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVjQyMlAxMkxFLCAvLy88IHBsYW5hciBZVVYgNDoyOjIsMjRicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDEgWSBzYW1wbGVzKSwgbGl0dGxlLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfWVVWNDIyUDE0QkUsIC8vLzwgcGxhbmFyIFlVViA0OjI6MiwyOGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MSBZIHNhbXBsZXMpLCBiaWctZW5kaWFuCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTRMRSwgLy8vPCBwbGFuYXIgWVVWIDQ6MjoyLDI4YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngxIFkgc2FtcGxlcyksIGxpdHRsZS1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxMkJFLCAvLy88IHBsYW5hciBZVVYgNDo0OjQsMzZicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAxeDEgWSBzYW1wbGVzKSwgYmlnLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDEyTEUsIC8vLzwgcGxhbmFyIFlVViA0OjQ6NCwzNmJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDF4MSBZIHNhbXBsZXMpLCBsaXR0bGUtZW5kaWFuCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTRCRSwgLy8vPCBwbGFuYXIgWVVWIDQ6NDo0LDQyYnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMXgxIFkgc2FtcGxlcyksIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxNExFLCAvLy88IHBsYW5hciBZVVYgNDo0OjQsNDJicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAxeDEgWSBzYW1wbGVzKSwgbGl0dGxlLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfR0JSUDEyQkUsICAgIC8vLzwgcGxhbmFyIEdCUiA0OjQ6NCAzNmJwcCwgYmlnLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfR0JSUDEyTEUsICAgIC8vLzwgcGxhbmFyIEdCUiA0OjQ6NCAzNmJwcCwgbGl0dGxlLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfR0JSUDE0QkUsICAgIC8vLzwgcGxhbmFyIEdCUiA0OjQ6NCA0MmJwcCwgYmlnLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfR0JSUDE0TEUsICAgIC8vLzwgcGxhbmFyIEdCUiA0OjQ6NCA0MmJwcCwgbGl0dGxlLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfWVVWSjQxMVAsICAgIC8vLzwgcGxhbmFyIFlVViA0OjE6MSwgMTJicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciA0eDEgWSBzYW1wbGVzKSBmdWxsIHNjYWxlIChKUEVHKSwgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBBVl9QSVhfRk1UX1lVVjQxMVAgYW5kIHNldHRpbmcgY29sb3JfcmFuZ2UKKworICAgIEFWX1BJWF9GTVRfQkFZRVJfQkdHUjgsICAgIC8vLzwgYmF5ZXIsIEJHQkcuLihvZGQgbGluZSksIEdSR1IuLihldmVuIGxpbmUpLCA4LWJpdCBzYW1wbGVzICovCisgICAgQVZfUElYX0ZNVF9CQVlFUl9SR0dCOCwgICAgLy8vPCBiYXllciwgUkdSRy4uKG9kZCBsaW5lKSwgR0JHQi4uKGV2ZW4gbGluZSksIDgtYml0IHNhbXBsZXMgKi8KKyAgICBBVl9QSVhfRk1UX0JBWUVSX0dCUkc4LCAgICAvLy88IGJheWVyLCBHQkdCLi4ob2RkIGxpbmUpLCBSR1JHLi4oZXZlbiBsaW5lKSwgOC1iaXQgc2FtcGxlcyAqLworICAgIEFWX1BJWF9GTVRfQkFZRVJfR1JCRzgsICAgIC8vLzwgYmF5ZXIsIEdSR1IuLihvZGQgbGluZSksIEJHQkcuLihldmVuIGxpbmUpLCA4LWJpdCBzYW1wbGVzICovCisgICAgQVZfUElYX0ZNVF9CQVlFUl9CR0dSMTZMRSwgLy8vPCBiYXllciwgQkdCRy4uKG9kZCBsaW5lKSwgR1JHUi4uKGV2ZW4gbGluZSksIDE2LWJpdCBzYW1wbGVzLCBsaXR0bGUtZW5kaWFuICovCisgICAgQVZfUElYX0ZNVF9CQVlFUl9CR0dSMTZCRSwgLy8vPCBiYXllciwgQkdCRy4uKG9kZCBsaW5lKSwgR1JHUi4uKGV2ZW4gbGluZSksIDE2LWJpdCBzYW1wbGVzLCBiaWctZW5kaWFuICovCisgICAgQVZfUElYX0ZNVF9CQVlFUl9SR0dCMTZMRSwgLy8vPCBiYXllciwgUkdSRy4uKG9kZCBsaW5lKSwgR0JHQi4uKGV2ZW4gbGluZSksIDE2LWJpdCBzYW1wbGVzLCBsaXR0bGUtZW5kaWFuICovCisgICAgQVZfUElYX0ZNVF9CQVlFUl9SR0dCMTZCRSwgLy8vPCBiYXllciwgUkdSRy4uKG9kZCBsaW5lKSwgR0JHQi4uKGV2ZW4gbGluZSksIDE2LWJpdCBzYW1wbGVzLCBiaWctZW5kaWFuICovCisgICAgQVZfUElYX0ZNVF9CQVlFUl9HQlJHMTZMRSwgLy8vPCBiYXllciwgR0JHQi4uKG9kZCBsaW5lKSwgUkdSRy4uKGV2ZW4gbGluZSksIDE2LWJpdCBzYW1wbGVzLCBsaXR0bGUtZW5kaWFuICovCisgICAgQVZfUElYX0ZNVF9CQVlFUl9HQlJHMTZCRSwgLy8vPCBiYXllciwgR0JHQi4uKG9kZCBsaW5lKSwgUkdSRy4uKGV2ZW4gbGluZSksIDE2LWJpdCBzYW1wbGVzLCBiaWctZW5kaWFuICovCisgICAgQVZfUElYX0ZNVF9CQVlFUl9HUkJHMTZMRSwgLy8vPCBiYXllciwgR1JHUi4uKG9kZCBsaW5lKSwgQkdCRy4uKGV2ZW4gbGluZSksIDE2LWJpdCBzYW1wbGVzLCBsaXR0bGUtZW5kaWFuICovCisgICAgQVZfUElYX0ZNVF9CQVlFUl9HUkJHMTZCRSwgLy8vPCBiYXllciwgR1JHUi4uKG9kZCBsaW5lKSwgQkdCRy4uKGV2ZW4gbGluZSksIDE2LWJpdCBzYW1wbGVzLCBiaWctZW5kaWFuICovCisKKyAgICBBVl9QSVhfRk1UX1hWTUMsLy8vPCBYVmlkZW8gTW90aW9uIEFjY2VsZXJhdGlvbiB2aWEgY29tbW9uIHBhY2tldCBwYXNzaW5nCisKKyAgICBBVl9QSVhfRk1UX1lVVjQ0MFAxMExFLCAvLy88IHBsYW5hciBZVVYgNDo0OjAsMjBicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAxeDIgWSBzYW1wbGVzKSwgbGl0dGxlLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfWVVWNDQwUDEwQkUsIC8vLzwgcGxhbmFyIFlVViA0OjQ6MCwyMGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDF4MiBZIHNhbXBsZXMpLCBiaWctZW5kaWFuCisgICAgQVZfUElYX0ZNVF9ZVVY0NDBQMTJMRSwgLy8vPCBwbGFuYXIgWVVWIDQ6NDowLDI0YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMXgyIFkgc2FtcGxlcyksIGxpdHRsZS1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVjQ0MFAxMkJFLCAvLy88IHBsYW5hciBZVVYgNDo0OjAsMjRicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAxeDIgWSBzYW1wbGVzKSwgYmlnLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfQVlVVjY0TEUsICAgIC8vLzwgcGFja2VkIEFZVVYgNDo0OjQsNjRicHAgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDF4MSBZICYgQSBzYW1wbGVzKSwgbGl0dGxlLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfQVlVVjY0QkUsICAgIC8vLzwgcGFja2VkIEFZVVYgNDo0OjQsNjRicHAgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDF4MSBZICYgQSBzYW1wbGVzKSwgYmlnLWVuZGlhbgorCisgICAgQVZfUElYX0ZNVF9WSURFT1RPT0xCT1gsIC8vLzwgaGFyZHdhcmUgZGVjb2RpbmcgdGhyb3VnaCBWaWRlb3Rvb2xib3gKKworICAgIEFWX1BJWF9GTVRfUDAxMExFLCAvLy88IGxpa2UgTlYxMiwgd2l0aCAxMGJwcCBwZXIgY29tcG9uZW50LCBkYXRhIGluIHRoZSBoaWdoIGJpdHMsIHplcm9zIGluIHRoZSBsb3cgYml0cywgbGl0dGxlLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfUDAxMEJFLCAvLy88IGxpa2UgTlYxMiwgd2l0aCAxMGJwcCBwZXIgY29tcG9uZW50LCBkYXRhIGluIHRoZSBoaWdoIGJpdHMsIHplcm9zIGluIHRoZSBsb3cgYml0cywgYmlnLWVuZGlhbgorCisgICAgQVZfUElYX0ZNVF9HQlJBUDEyQkUsICAvLy88IHBsYW5hciBHQlIgNDo0OjQ6NCA0OGJwcCwgYmlnLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfR0JSQVAxMkxFLCAgLy8vPCBwbGFuYXIgR0JSIDQ6NDo0OjQgNDhicHAsIGxpdHRsZS1lbmRpYW4KKworICAgIEFWX1BJWF9GTVRfR0JSQVAxMEJFLCAgLy8vPCBwbGFuYXIgR0JSIDQ6NDo0OjQgNDBicHAsIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX0dCUkFQMTBMRSwgIC8vLzwgcGxhbmFyIEdCUiA0OjQ6NDo0IDQwYnBwLCBsaXR0bGUtZW5kaWFuCisKKyAgICBBVl9QSVhfRk1UX01FRElBQ09ERUMsIC8vLzwgaGFyZHdhcmUgZGVjb2RpbmcgdGhyb3VnaCBNZWRpYUNvZGVjCisKKyAgICBBVl9QSVhfRk1UX0dSQVkxMkJFLCAgIC8vLzwgICAgICAgIFkgICAgICAgICwgMTJicHAsIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX0dSQVkxMkxFLCAgIC8vLzwgICAgICAgIFkgICAgICAgICwgMTJicHAsIGxpdHRsZS1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX0dSQVkxMEJFLCAgIC8vLzwgICAgICAgIFkgICAgICAgICwgMTBicHAsIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX0dSQVkxMExFLCAgIC8vLzwgICAgICAgIFkgICAgICAgICwgMTBicHAsIGxpdHRsZS1lbmRpYW4KKworICAgIEFWX1BJWF9GTVRfUDAxNkxFLCAvLy88IGxpa2UgTlYxMiwgd2l0aCAxNmJwcCBwZXIgY29tcG9uZW50LCBsaXR0bGUtZW5kaWFuCisgICAgQVZfUElYX0ZNVF9QMDE2QkUsIC8vLzwgbGlrZSBOVjEyLCB3aXRoIDE2YnBwIHBlciBjb21wb25lbnQsIGJpZy1lbmRpYW4KKworICAgIC8qKgorICAgICAqIEhhcmR3YXJlIHN1cmZhY2VzIGZvciBEaXJlY3QzRDExLgorICAgICAqCisgICAgICogVGhpcyBpcyBwcmVmZXJyZWQgb3ZlciB0aGUgbGVnYWN5IEFWX1BJWF9GTVRfRDNEMTFWQV9WTEQuIFRoZSBuZXcgRDNEMTEKKyAgICAgKiBod2FjY2VsIEFQSSBhbmQgZmlsdGVyaW5nIHN1cHBvcnQgQVZfUElYX0ZNVF9EM0QxMSBvbmx5LgorICAgICAqCisgICAgICogZGF0YVswXSBjb250YWlucyBhIElEM0QxMVRleHR1cmUyRCBwb2ludGVyLCBhbmQgZGF0YVsxXSBjb250YWlucyB0aGUKKyAgICAgKiB0ZXh0dXJlIGFycmF5IGluZGV4IG9mIHRoZSBmcmFtZSBhcyBpbnRwdHJfdCBpZiB0aGUgSUQzRDExVGV4dHVyZTJEIGlzCisgICAgICogYW4gYXJyYXkgdGV4dHVyZSAob3IgYWx3YXlzIDAgaWYgaXQncyBhIG5vcm1hbCB0ZXh0dXJlKS4KKyAgICAgKi8KKyAgICBBVl9QSVhfRk1UX0QzRDExLAorCisgICAgQVZfUElYX0ZNVF9HUkFZOUJFLCAgIC8vLzwgICAgICAgIFkgICAgICAgICwgOWJwcCwgYmlnLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfR1JBWTlMRSwgICAvLy88ICAgICAgICBZICAgICAgICAsIDlicHAsIGxpdHRsZS1lbmRpYW4KKworICAgIEFWX1BJWF9GTVRfR0JSUEYzMkJFLCAgLy8vPCBJRUVFLTc1NCBzaW5nbGUgcHJlY2lzaW9uIHBsYW5hciBHQlIgNDo0OjQsICAgICA5NmJwcCwgYmlnLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfR0JSUEYzMkxFLCAgLy8vPCBJRUVFLTc1NCBzaW5nbGUgcHJlY2lzaW9uIHBsYW5hciBHQlIgNDo0OjQsICAgICA5NmJwcCwgbGl0dGxlLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfR0JSQVBGMzJCRSwgLy8vPCBJRUVFLTc1NCBzaW5nbGUgcHJlY2lzaW9uIHBsYW5hciBHQlJBIDQ6NDo0OjQsIDEyOGJwcCwgYmlnLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfR0JSQVBGMzJMRSwgLy8vPCBJRUVFLTc1NCBzaW5nbGUgcHJlY2lzaW9uIHBsYW5hciBHQlJBIDQ6NDo0OjQsIDEyOGJwcCwgbGl0dGxlLWVuZGlhbgorCisgICAgLyoqCisgICAgICogRFJNLW1hbmFnZWQgYnVmZmVycyBleHBvc2VkIHRocm91Z2ggUFJJTUUgYnVmZmVyIHNoYXJpbmcuCisgICAgICoKKyAgICAgKiBkYXRhWzBdIHBvaW50cyB0byBhbiBBVkRSTUZyYW1lRGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICBBVl9QSVhfRk1UX0RSTV9QUklNRSwKKyAgICAvKioKKyAgICAgKiBIYXJkd2FyZSBzdXJmYWNlcyBmb3IgT3BlbkNMLgorICAgICAqCisgICAgICogZGF0YVtpXSBjb250YWluIDJEIGltYWdlIG9iamVjdHMgKHR5cGVkIGluIEMgYXMgY2xfbWVtLCB1c2VkCisgICAgICogaW4gT3BlbkNMIGFzIGltYWdlMmRfdCkgZm9yIGVhY2ggcGxhbmUgb2YgdGhlIHN1cmZhY2UuCisgICAgICovCisgICAgQVZfUElYX0ZNVF9PUEVOQ0wsCisKKyAgICBBVl9QSVhfRk1UX0dSQVkxNEJFLCAgIC8vLzwgICAgICAgIFkgICAgICAgICwgMTRicHAsIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX0dSQVkxNExFLCAgIC8vLzwgICAgICAgIFkgICAgICAgICwgMTRicHAsIGxpdHRsZS1lbmRpYW4KKworICAgIEFWX1BJWF9GTVRfR1JBWUYzMkJFLCAgLy8vPCBJRUVFLTc1NCBzaW5nbGUgcHJlY2lzaW9uIFksIDMyYnBwLCBiaWctZW5kaWFuCisgICAgQVZfUElYX0ZNVF9HUkFZRjMyTEUsICAvLy88IElFRUUtNzU0IHNpbmdsZSBwcmVjaXNpb24gWSwgMzJicHAsIGxpdHRsZS1lbmRpYW4KKworICAgIEFWX1BJWF9GTVRfWVVWQTQyMlAxMkJFLCAvLy88IHBsYW5hciBZVVYgNDoyOjIsMjRicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDEgWSBzYW1wbGVzKSwgMTJiIGFscGhhLCBiaWctZW5kaWFuCisgICAgQVZfUElYX0ZNVF9ZVVZBNDIyUDEyTEUsIC8vLzwgcGxhbmFyIFlVViA0OjI6MiwyNGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MSBZIHNhbXBsZXMpLCAxMmIgYWxwaGEsIGxpdHRsZS1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX1lVVkE0NDRQMTJCRSwgLy8vPCBwbGFuYXIgWVVWIDQ6NDo0LDM2YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMXgxIFkgc2FtcGxlcyksIDEyYiBhbHBoYSwgYmlnLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFAxMkxFLCAvLy88IHBsYW5hciBZVVYgNDo0OjQsMzZicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAxeDEgWSBzYW1wbGVzKSwgMTJiIGFscGhhLCBsaXR0bGUtZW5kaWFuCisKKyAgICBBVl9QSVhfRk1UX05WMjQsICAgICAgLy8vPCBwbGFuYXIgWVVWIDQ6NDo0LCAyNGJwcCwgMSBwbGFuZSBmb3IgWSBhbmQgMSBwbGFuZSBmb3IgdGhlIFVWIGNvbXBvbmVudHMsIHdoaWNoIGFyZSBpbnRlcmxlYXZlZCAoZmlyc3QgYnl0ZSBVIGFuZCB0aGUgZm9sbG93aW5nIGJ5dGUgVikKKyAgICBBVl9QSVhfRk1UX05WNDIsICAgICAgLy8vPCBhcyBhYm92ZSwgYnV0IFUgYW5kIFYgYnl0ZXMgYXJlIHN3YXBwZWQKKworICAgIEFWX1BJWF9GTVRfTkIgICAgICAgICAvLy88IG51bWJlciBvZiBwaXhlbCBmb3JtYXRzLCBETyBOT1QgVVNFIFRISVMgaWYgeW91IHdhbnQgdG8gbGluayB3aXRoIHNoYXJlZCBsaWJhdiogYmVjYXVzZSB0aGUgbnVtYmVyIG9mIGZvcm1hdHMgbWlnaHQgZGlmZmVyIGJldHdlZW4gdmVyc2lvbnMKK307CisKKyNpZmRlZiBBVl9IQVZFX0JJR0VORElBTgorI2RlZmluZSBBVl9QSVhfRk1UX05FKGJlLCBsZSkgQVZfUElYX0ZNVF8jI2JlCisjZWxzZQorI2RlZmluZSBBVl9QSVhfRk1UX05FKGJlLCBsZSkgQVZfUElYX0ZNVF8jI2xlCisjZW5kaWYKKworI2RlZmluZSBBVl9QSVhfRk1UX1lVVjQyMFAxMCBBVl9QSVhfRk1UX05FKFlVVjQyMFAxMEJFLCBZVVY0MjBQMTBMRSkKKyNkZWZpbmUgQVZfUElYX0ZNVF9ZVVY0MjJQMTAgQVZfUElYX0ZNVF9ORShZVVY0MjJQMTBCRSwgWVVWNDIyUDEwTEUpCisjZGVmaW5lIEFWX1BJWF9GTVRfWVVWNDQwUDEwIEFWX1BJWF9GTVRfTkUoWVVWNDQwUDEwQkUsIFlVVjQ0MFAxMExFKQorI2RlZmluZSBBVl9QSVhfRk1UX1lVVjQ0NFAxMCBBVl9QSVhfRk1UX05FKFlVVjQ0NFAxMEJFLCBZVVY0NDRQMTBMRSkKKyNkZWZpbmUgQVZfUElYX0ZNVF9ZVVY0MjBQMTIgQVZfUElYX0ZNVF9ORShZVVY0MjBQMTJCRSwgWVVWNDIwUDEyTEUpCisjZGVmaW5lIEFWX1BJWF9GTVRfWVVWNDIyUDEyIEFWX1BJWF9GTVRfTkUoWVVWNDIyUDEyQkUsIFlVVjQyMlAxMkxFKQorI2RlZmluZSBBVl9QSVhfRk1UX1lVVjQ0MFAxMiBBVl9QSVhfRk1UX05FKFlVVjQ0MFAxMkJFLCBZVVY0NDBQMTJMRSkKKyNkZWZpbmUgQVZfUElYX0ZNVF9ZVVY0NDRQMTIgQVZfUElYX0ZNVF9ORShZVVY0NDRQMTJCRSwgWVVWNDQ0UDEyTEUpCisKKworI2RlZmluZSBBVl9QSVhfRk1UX0dCUlA5ICAgICBBVl9QSVhfRk1UX05FKEdCUlA5QkUgLCAgICBHQlJQOUxFKQorI2RlZmluZSBBVl9QSVhfRk1UX0dCUlAxMCAgICBBVl9QSVhfRk1UX05FKEdCUlAxMEJFLCAgICBHQlJQMTBMRSkKKyNkZWZpbmUgQVZfUElYX0ZNVF9HQlJQMTIgICAgQVZfUElYX0ZNVF9ORShHQlJQMTJCRSwgICAgR0JSUDEyTEUpCisjZGVmaW5lIEFWX1BJWF9GTVRfR0JSUDE0ICAgIEFWX1BJWF9GTVRfTkUoR0JSUDE0QkUsICAgIEdCUlAxNExFKQorI2RlZmluZSBBVl9QSVhfRk1UX0dCUlAxNiAgICBBVl9QSVhfRk1UX05FKEdCUlAxNkJFLCAgICBHQlJQMTZMRSkKKyNkZWZpbmUgQVZfUElYX0ZNVF9HQlJBUDEwICAgQVZfUElYX0ZNVF9ORShHQlJBUDEwQkUsICAgR0JSQVAxMExFKQorI2RlZmluZSBBVl9QSVhfRk1UX0dCUkFQMTIgICBBVl9QSVhfRk1UX05FKEdCUkFQMTJCRSwgICBHQlJBUDEyTEUpCisjZGVmaW5lIEFWX1BJWF9GTVRfR0JSQVAxNiAgIEFWX1BJWF9GTVRfTkUoR0JSQVAxNkJFLCAgIEdCUkFQMTZMRSkKKworI2RlZmluZSBBVl9QSVhfRk1UX0dSQVk5ICBBVl9QSVhfRk1UX05FKEdSQVk5QkUsICBHUkFZOUxFKQorI2RlZmluZSBBVl9QSVhfRk1UX0dSQVkxMCBBVl9QSVhfRk1UX05FKEdSQVkxMEJFLCBHUkFZMTBMRSkKKyNkZWZpbmUgQVZfUElYX0ZNVF9HUkFZMTIgQVZfUElYX0ZNVF9ORShHUkFZMTJCRSwgR1JBWTEyTEUpCisKKyNkZWZpbmUgQVZfUElYX0ZNVF9ZVVY0MjBQOSAgQVZfUElYX0ZNVF9ORShZVVY0MjBQOUJFICwgWVVWNDIwUDlMRSkKKyNkZWZpbmUgQVZfUElYX0ZNVF9ZVVY0MjJQOSAgQVZfUElYX0ZNVF9ORShZVVY0MjJQOUJFICwgWVVWNDIyUDlMRSkKKyNkZWZpbmUgQVZfUElYX0ZNVF9ZVVY0NDRQOSAgQVZfUElYX0ZNVF9ORShZVVY0NDRQOUJFICwgWVVWNDQ0UDlMRSkKKworLyoqCisgICogQ2hyb21hdGljaXR5IGNvb3JkaW5hdGVzIG9mIHRoZSBzb3VyY2UgcHJpbWFyaWVzLgorICAqIFRoZXNlIHZhbHVlcyBtYXRjaCB0aGUgb25lcyBkZWZpbmVkIGJ5IElTTy9JRUMgMjMwMDEtOF8yMDEzIMKnIDcuMS4KKyAgKi8KK2VudW0gQVZDb2xvclByaW1hcmllcyB7CisJQVZDT0xfUFJJX1JFU0VSVkVEMCAgID0gMCwKKwlBVkNPTF9QUklfQlQ3MDkgICAgICAgPSAxLCAgLy8vPCBhbHNvIElUVS1SIEJUMTM2MSAvIElFQyA2MTk2Ni0yLTQgLyBTTVBURSBSUDE3NyBBbm5leCBCCisJQVZDT0xfUFJJX1VOU1BFQ0lGSUVEID0gMiwKKwlBVkNPTF9QUklfUkVTRVJWRUQgICAgPSAzLAorCUFWQ09MX1BSSV9CVDQ3ME0gICAgICA9IDQsICAvLy88IGFsc28gRkNDIFRpdGxlIDQ3IENvZGUgb2YgRmVkZXJhbCBSZWd1bGF0aW9ucyA3My42ODIgKGEpKDIwKQorCisJQVZDT0xfUFJJX0JUNDcwQkcgICAgID0gNSwgIC8vLzwgYWxzbyBJVFUtUiBCVDYwMS02IDYyNSAvIElUVS1SIEJUMTM1OCA2MjUgLyBJVFUtUiBCVDE3MDAgNjI1IFBBTCAmIFNFQ0FNCisJQVZDT0xfUFJJX1NNUFRFMTcwTSAgID0gNiwgIC8vLzwgYWxzbyBJVFUtUiBCVDYwMS02IDUyNSAvIElUVS1SIEJUMTM1OCA1MjUgLyBJVFUtUiBCVDE3MDAgTlRTQworCUFWQ09MX1BSSV9TTVBURTI0ME0gICA9IDcsICAvLy88IGZ1bmN0aW9uYWxseSBpZGVudGljYWwgdG8gYWJvdmUKKwlBVkNPTF9QUklfRklMTSAgICAgICAgPSA4LCAgLy8vPCBjb2xvdXIgZmlsdGVycyB1c2luZyBJbGx1bWluYW50IEMKKwlBVkNPTF9QUklfQlQyMDIwICAgICAgPSA5LCAgLy8vPCBJVFUtUiBCVDIwMjAKKwlBVkNPTF9QUklfU01QVEU0MjggICAgPSAxMCwgLy8vPCBTTVBURSBTVCA0MjgtMSAoQ0lFIDE5MzEgWFlaKQorCUFWQ09MX1BSSV9TTVBURVNUNDI4XzEgPSBBVkNPTF9QUklfU01QVEU0MjgsCisJQVZDT0xfUFJJX1NNUFRFNDMxICAgID0gMTEsIC8vLzwgU01QVEUgU1QgNDMxLTIgKDIwMTEpIC8gRENJIFAzCisJQVZDT0xfUFJJX1NNUFRFNDMyICAgID0gMTIsIC8vLzwgU01QVEUgU1QgNDMyLTEgKDIwMTApIC8gUDMgRDY1IC8gRGlzcGxheSBQMworCUFWQ09MX1BSSV9KRURFQ19QMjIgICA9IDIyLCAvLy88IEpFREVDIFAyMiBwaG9zcGhvcnMKKwlBVkNPTF9QUklfTkIgICAgICAgICAgICAgICAgLy8vPCBOb3QgcGFydCBvZiBBQkkKK307CisKKy8qKgorICogQ29sb3IgVHJhbnNmZXIgQ2hhcmFjdGVyaXN0aWMuCisgKiBUaGVzZSB2YWx1ZXMgbWF0Y2ggdGhlIG9uZXMgZGVmaW5lZCBieSBJU08vSUVDIDIzMDAxLThfMjAxMyDCpyA3LjIuCisgKi8KK2VudW0gQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWMgeworCUFWQ09MX1RSQ19SRVNFUlZFRDAgICAgPSAwLAorCUFWQ09MX1RSQ19CVDcwOSAgICAgICAgPSAxLCAgLy8vPCBhbHNvIElUVS1SIEJUMTM2MQorCUFWQ09MX1RSQ19VTlNQRUNJRklFRCAgPSAyLAorCUFWQ09MX1RSQ19SRVNFUlZFRCAgICAgPSAzLAorCUFWQ09MX1RSQ19HQU1NQTIyICAgICAgPSA0LCAgLy8vPCBhbHNvIElUVS1SIEJUNDcwTSAvIElUVS1SIEJUMTcwMCA2MjUgUEFMICYgU0VDQU0KKwlBVkNPTF9UUkNfR0FNTUEyOCAgICAgID0gNSwgIC8vLzwgYWxzbyBJVFUtUiBCVDQ3MEJHCisJQVZDT0xfVFJDX1NNUFRFMTcwTSAgICA9IDYsICAvLy88IGFsc28gSVRVLVIgQlQ2MDEtNiA1MjUgb3IgNjI1IC8gSVRVLVIgQlQxMzU4IDUyNSBvciA2MjUgLyBJVFUtUiBCVDE3MDAgTlRTQworCUFWQ09MX1RSQ19TTVBURTI0ME0gICAgPSA3LAorCUFWQ09MX1RSQ19MSU5FQVIgICAgICAgPSA4LCAgLy8vPCAiTGluZWFyIHRyYW5zZmVyIGNoYXJhY3RlcmlzdGljcyIKKwlBVkNPTF9UUkNfTE9HICAgICAgICAgID0gOSwgIC8vLzwgIkxvZ2FyaXRobWljIHRyYW5zZmVyIGNoYXJhY3RlcmlzdGljICgxMDA6MSByYW5nZSkiCisJQVZDT0xfVFJDX0xPR19TUVJUICAgICA9IDEwLCAvLy88ICJMb2dhcml0aG1pYyB0cmFuc2ZlciBjaGFyYWN0ZXJpc3RpYyAoMTAwICogU3FydCgxMCkgOiAxIHJhbmdlKSIKKwlBVkNPTF9UUkNfSUVDNjE5NjZfMl80ID0gMTEsIC8vLzwgSUVDIDYxOTY2LTItNAorCUFWQ09MX1RSQ19CVDEzNjFfRUNHICAgPSAxMiwgLy8vPCBJVFUtUiBCVDEzNjEgRXh0ZW5kZWQgQ29sb3VyIEdhbXV0CisJQVZDT0xfVFJDX0lFQzYxOTY2XzJfMSA9IDEzLCAvLy88IElFQyA2MTk2Ni0yLTEgKHNSR0Igb3Igc1lDQykKKwlBVkNPTF9UUkNfQlQyMDIwXzEwICAgID0gMTQsIC8vLzwgSVRVLVIgQlQyMDIwIGZvciAxMC1iaXQgc3lzdGVtCisJQVZDT0xfVFJDX0JUMjAyMF8xMiAgICA9IDE1LCAvLy88IElUVS1SIEJUMjAyMCBmb3IgMTItYml0IHN5c3RlbQorCUFWQ09MX1RSQ19TTVBURTIwODQgICAgPSAxNiwgLy8vPCBTTVBURSBTVCAyMDg0IGZvciAxMC0sIDEyLSwgMTQtIGFuZCAxNi1iaXQgc3lzdGVtcworCUFWQ09MX1RSQ19TTVBURVNUMjA4NCAgPSBBVkNPTF9UUkNfU01QVEUyMDg0LAorCUFWQ09MX1RSQ19TTVBURTQyOCAgICAgPSAxNywgLy8vPCBTTVBURSBTVCA0MjgtMQorCUFWQ09MX1RSQ19TTVBURVNUNDI4XzEgPSBBVkNPTF9UUkNfU01QVEU0MjgsCisJQVZDT0xfVFJDX0FSSUJfU1REX0I2NyA9IDE4LCAvLy88IEFSSUIgU1RELUI2Nywga25vd24gYXMgIkh5YnJpZCBsb2ctZ2FtbWEiCisJQVZDT0xfVFJDX05CICAgICAgICAgICAgICAgICAvLy88IE5vdCBwYXJ0IG9mIEFCSQorfTsKKworLyoqCisgKiBZVVYgY29sb3JzcGFjZSB0eXBlLgorICogVGhlc2UgdmFsdWVzIG1hdGNoIHRoZSBvbmVzIGRlZmluZWQgYnkgSVNPL0lFQyAyMzAwMS04XzIwMTMgwqcgNy4zLgorICovCitlbnVtIEFWQ29sb3JTcGFjZSB7CisJQVZDT0xfU1BDX1JHQiAgICAgICAgID0gMCwgIC8vLzwgb3JkZXIgb2YgY29lZmZpY2llbnRzIGlzIGFjdHVhbGx5IEdCUiwgYWxzbyBJRUMgNjE5NjYtMi0xIChzUkdCKQorCUFWQ09MX1NQQ19CVDcwOSAgICAgICA9IDEsICAvLy88IGFsc28gSVRVLVIgQlQxMzYxIC8gSUVDIDYxOTY2LTItNCB4dllDQzcwOSAvIFNNUFRFIFJQMTc3IEFubmV4IEIKKwlBVkNPTF9TUENfVU5TUEVDSUZJRUQgPSAyLAorCUFWQ09MX1NQQ19SRVNFUlZFRCAgICA9IDMsCisJQVZDT0xfU1BDX0ZDQyAgICAgICAgID0gNCwgIC8vLzwgRkNDIFRpdGxlIDQ3IENvZGUgb2YgRmVkZXJhbCBSZWd1bGF0aW9ucyA3My42ODIgKGEpKDIwKQorCUFWQ09MX1NQQ19CVDQ3MEJHICAgICA9IDUsICAvLy88IGFsc28gSVRVLVIgQlQ2MDEtNiA2MjUgLyBJVFUtUiBCVDEzNTggNjI1IC8gSVRVLVIgQlQxNzAwIDYyNSBQQUwgJiBTRUNBTSAvIElFQyA2MTk2Ni0yLTQgeHZZQ0M2MDEKKwlBVkNPTF9TUENfU01QVEUxNzBNICAgPSA2LCAgLy8vPCBhbHNvIElUVS1SIEJUNjAxLTYgNTI1IC8gSVRVLVIgQlQxMzU4IDUyNSAvIElUVS1SIEJUMTcwMCBOVFNDCisJQVZDT0xfU1BDX1NNUFRFMjQwTSAgID0gNywgIC8vLzwgZnVuY3Rpb25hbGx5IGlkZW50aWNhbCB0byBhYm92ZQorCUFWQ09MX1NQQ19ZQ0dDTyAgICAgICA9IDgsICAvLy88IFVzZWQgYnkgRGlyYWMgLyBWQy0yIGFuZCBILjI2NCBGUmV4dCwgc2VlIElUVS1UIFNHMTYKKwlBVkNPTF9TUENfWUNPQ0cgICAgICAgPSBBVkNPTF9TUENfWUNHQ08sCisJQVZDT0xfU1BDX0JUMjAyMF9OQ0wgID0gOSwgIC8vLzwgSVRVLVIgQlQyMDIwIG5vbi1jb25zdGFudCBsdW1pbmFuY2Ugc3lzdGVtCisJQVZDT0xfU1BDX0JUMjAyMF9DTCAgID0gMTAsIC8vLzwgSVRVLVIgQlQyMDIwIGNvbnN0YW50IGx1bWluYW5jZSBzeXN0ZW0KKwlBVkNPTF9TUENfU01QVEUyMDg1ICAgPSAxMSwgLy8vPCBTTVBURSAyMDg1LCBZJ0QnekQneAorCUFWQ09MX1NQQ19DSFJPTUFfREVSSVZFRF9OQ0wgPSAxMiwgLy8vPCBDaHJvbWF0aWNpdHktZGVyaXZlZCBub24tY29uc3RhbnQgbHVtaW5hbmNlIHN5c3RlbQorCUFWQ09MX1NQQ19DSFJPTUFfREVSSVZFRF9DTCA9IDEzLCAvLy88IENocm9tYXRpY2l0eS1kZXJpdmVkIGNvbnN0YW50IGx1bWluYW5jZSBzeXN0ZW0KKwlBVkNPTF9TUENfSUNUQ1AgICAgICAgPSAxNCwgLy8vPCBJVFUtUiBCVC4yMTAwLTAsIElDdENwCisJQVZDT0xfU1BDX05CICAgICAgICAgICAgICAgIC8vLzwgTm90IHBhcnQgb2YgQUJJCit9OworCisvKioKKyAqIE1QRUcgdnMgSlBFRyBZVVYgcmFuZ2UuCisgKi8KK2VudW0gQVZDb2xvclJhbmdlIHsKKwlBVkNPTF9SQU5HRV9VTlNQRUNJRklFRCA9IDAsCisJQVZDT0xfUkFOR0VfTVBFRyAgICAgICAgPSAxLCAvLy88IHRoZSBub3JtYWwgMjE5KjJeKG4tOCkgIk1QRUciIFlVViByYW5nZXMKKwlBVkNPTF9SQU5HRV9KUEVHICAgICAgICA9IDIsIC8vLzwgdGhlIG5vcm1hbCAgICAgMl5uLTEgICAiSlBFRyIgWVVWIHJhbmdlcworCUFWQ09MX1JBTkdFX05CICAgICAgICAgICAgICAgLy8vPCBOb3QgcGFydCBvZiBBQkkKK307CisKKy8qKgorICogTG9jYXRpb24gb2YgY2hyb21hIHNhbXBsZXMuCisgKgorICogSWxsdXN0cmF0aW9uIHNob3dpbmcgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaXJzdCAodG9wIGxlZnQpIGNocm9tYSBzYW1wbGUgb2YgdGhlCisgKiBpbWFnZSwgdGhlIGxlZnQgc2hvd3Mgb25seSBsdW1hLCB0aGUgcmlnaHQKKyAqIHNob3dzIHRoZSBsb2NhdGlvbiBvZiB0aGUgY2hyb21hIHNhbXBsZSwgdGhlIDIgY291bGQgYmUgaW1hZ2luZWQgdG8gb3ZlcmxheQorICogZWFjaCBvdGhlciBidXQgYXJlIGRyYXduIHNlcGFyYXRlbHkgZHVlIHRvIGxpbWl0YXRpb25zIG9mIEFTQ0lJCisgKgorICogICAgICAgICAgICAgICAgMXN0IDJuZCAgICAgICAxc3QgMm5kIGhvcml6b250YWwgbHVtYSBzYW1wbGUgcG9zaXRpb25zCisgKiAgICAgICAgICAgICAgICAgdiAgIHYgICAgICAgICB2ICAgdgorICogICAgICAgICAgICAgICAgIF9fX19fXyAgICAgICAgX19fX19fCisgKjFzdCBsdW1hIGxpbmUgPiB8WCAgIFggLi4uICAgIHwzIDQgWCAuLi4gICAgIFggYXJlIGx1bWEgc2FtcGxlcywKKyAqICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfDEgMiAgICAgICAgICAgMS02IGFyZSBwb3NzaWJsZSBjaHJvbWEgcG9zaXRpb25zCisgKjJuZCBsdW1hIGxpbmUgPiB8WCAgIFggLi4uICAgIHw1IDYgWCAuLi4gICAgIDAgaXMgdW5kZWZpbmVkL3Vua25vd24gcG9zaXRpb24KKyAqLworZW51bSBBVkNocm9tYUxvY2F0aW9uIHsKKwlBVkNIUk9NQV9MT0NfVU5TUEVDSUZJRUQgPSAwLAorCUFWQ0hST01BX0xPQ19MRUZUICAgICAgICA9IDEsIC8vLzwgTVBFRy0yLzQgNDoyOjAsIEguMjY0IGRlZmF1bHQgZm9yIDQ6MjowCisJQVZDSFJPTUFfTE9DX0NFTlRFUiAgICAgID0gMiwgLy8vPCBNUEVHLTEgNDoyOjAsIEpQRUcgNDoyOjAsIEguMjYzIDQ6MjowCisJQVZDSFJPTUFfTE9DX1RPUExFRlQgICAgID0gMywgLy8vPCBJVFUtUiA2MDEsIFNNUFRFIDI3NE0gMjk2TSBTMzE0TShEViA0OjE6MSksIG1wZWcyIDQ6MjoyCisJQVZDSFJPTUFfTE9DX1RPUCAgICAgICAgID0gNCwKKwlBVkNIUk9NQV9MT0NfQk9UVE9NTEVGVCAgPSA1LAorCUFWQ0hST01BX0xPQ19CT1RUT00gICAgICA9IDYsCisJQVZDSFJPTUFfTE9DX05CICAgICAgICAgICAgICAgLy8vPCBOb3QgcGFydCBvZiBBQkkKK307CisKKyNlbmRpZiAvKiBBVlVUSUxfUElYRk1UX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbXZkZWNfcG9ydHMvdXRpbHMvcHV0X2JpdHMuaCBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL3V0aWxzL3B1dF9iaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIyYWExNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYW12ZGVjX3BvcnRzL3V0aWxzL3B1dF9iaXRzLmgKQEAgLTAsMCArMSwzMjMgQEAKKyNpZm5kZWYgQVZDT0RFQ19QVVRfQklUU19ICisjZGVmaW5lIEFWQ09ERUNfUFVUX0JJVFNfSAorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlICJjb21tb24uaCIKKworc3RydWN0IHB1dF9iaXRzX2NvbnRleHQgeworCXUzMiBiaXRfYnVmOworCWludCBiaXRfbGVmdDsKKwl1OCAqYnVmOworCXU4ICpidWZfcHRyOworCXU4ICpidWZfZW5kOworCWludCBzaXplX2luX2JpdHM7Cit9OworCisvKioKKyAqIEluaXRpYWxpemUgdGhlIHN0cnVjdCBwdXRfYml0c19jb250ZXh0IHMuCisgKgorICogQHBhcmFtIGJ1ZmZlciB0aGUgYnVmZmVyIHdoZXJlIHRvIHB1dCBiaXRzCisgKiBAcGFyYW0gYnVmZmVyX3NpemUgdGhlIHNpemUgaW4gYnl0ZXMgb2YgYnVmZmVyCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpbml0X3B1dF9iaXRzKHN0cnVjdCBwdXRfYml0c19jb250ZXh0ICpzLAorCXU4ICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSkKK3sKKwlpZiAoYnVmZmVyX3NpemUgPCAwKSB7CisJCWJ1ZmZlcl9zaXplID0gMDsKKwkJYnVmZmVyICAgICAgPSBOVUxMOworCX0KKworCXMtPnNpemVfaW5fYml0cyA9IDggKiBidWZmZXJfc2l6ZTsKKwlzLT5idWYgICAgICAgICAgPSBidWZmZXI7CisJcy0+YnVmX2VuZCAgICAgID0gcy0+YnVmICsgYnVmZmVyX3NpemU7CisJcy0+YnVmX3B0ciAgICAgID0gcy0+YnVmOworCXMtPmJpdF9sZWZ0ICAgICA9IDMyOworCXMtPmJpdF9idWYgICAgICA9IDA7Cit9CisKKy8qKgorICogUmViYXNlIHRoZSBiaXQgd3JpdGVyIG9udG8gYSByZWFsbG9jYXRlZCBidWZmZXIuCisgKgorICogQHBhcmFtIGJ1ZmZlciB0aGUgYnVmZmVyIHdoZXJlIHRvIHB1dCBiaXRzCisgKiBAcGFyYW0gYnVmZmVyX3NpemUgdGhlIHNpemUgaW4gYnl0ZXMgb2YgYnVmZmVyLAorICogICAgICAgICAgICAgICAgICAgIG11c3QgYmUgbGFyZ2VyIHRoYW4gdGhlIHByZXZpb3VzIHNpemUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHJlYmFzZV9wdXRfYml0cyhzdHJ1Y3QgcHV0X2JpdHNfY29udGV4dCAqcywKKwl1OCAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpCit7CisJcy0+YnVmX2VuZCA9IGJ1ZmZlciArIGJ1ZmZlcl9zaXplOworCXMtPmJ1Zl9wdHIgPSBidWZmZXIgKyAocy0+YnVmX3B0ciAtIHMtPmJ1Zik7CisJcy0+YnVmICAgICA9IGJ1ZmZlcjsKKwlzLT5zaXplX2luX2JpdHMgPSA4ICogYnVmZmVyX3NpemU7Cit9CisKKy8qKgorICogQHJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGJpdHMgd3JpdHRlbiB0byB0aGUgYml0c3RyZWFtLgorICovCitzdGF0aWMgaW5saW5lIGludCBwdXRfYml0c19jb3VudChzdHJ1Y3QgcHV0X2JpdHNfY29udGV4dCAqcykKK3sKKwlyZXR1cm4gKHMtPmJ1Zl9wdHIgLSBzLT5idWYpICogOCArIDMyIC0gcy0+Yml0X2xlZnQ7Cit9CisKKy8qKgorICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgYXZhaWxhYmxlIGluIHRoZSBiaXRzdHJlYW0uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHB1dF9iaXRzX2xlZnQoc3RydWN0IHB1dF9iaXRzX2NvbnRleHQqIHMpCit7CisJcmV0dXJuIChzLT5idWZfZW5kIC0gcy0+YnVmX3B0cikgKiA4IC0gMzIgKyBzLT5iaXRfbGVmdDsKK30KKworLyoqCisgKiBQYWQgdGhlIGVuZCBvZiB0aGUgb3V0cHV0IHN0cmVhbSB3aXRoIHplcm9zLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfcHV0X2JpdHMoc3RydWN0IHB1dF9iaXRzX2NvbnRleHQgKnMpCit7CisjaWZuZGVmIEJJVFNUUkVBTV9XUklURVJfTEUKKwlpZiAocy0+Yml0X2xlZnQgPCAzMikKKwkJcy0+Yml0X2J1ZiA8PD0gcy0+Yml0X2xlZnQ7CisjZW5kaWYKKwl3aGlsZSAocy0+Yml0X2xlZnQgPCAzMikgeworI2lmZGVmIEJJVFNUUkVBTV9XUklURVJfTEUKKwkJKnMtPmJ1Zl9wdHIrKyA9IHMtPmJpdF9idWY7CisJCXMtPmJpdF9idWYgID4+PSA4OworI2Vsc2UKKwkJKnMtPmJ1Zl9wdHIrKyA9IHMtPmJpdF9idWYgPj4gMjQ7CisJCXMtPmJpdF9idWYgIDw8PSA4OworI2VuZGlmCisJCXMtPmJpdF9sZWZ0ICArPSA4OworCX0KKwlzLT5iaXRfbGVmdCA9IDMyOworCXMtPmJpdF9idWYgID0gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX3B1dF9iaXRzX2xlKHN0cnVjdCBwdXRfYml0c19jb250ZXh0ICpzKQoreworCXdoaWxlIChzLT5iaXRfbGVmdCA8IDMyKSB7CisJCSpzLT5idWZfcHRyKysgPSBzLT5iaXRfYnVmOworCQlzLT5iaXRfYnVmICA+Pj0gODsKKwkJcy0+Yml0X2xlZnQgICs9IDg7CisJfQorCXMtPmJpdF9sZWZ0ID0gMzI7CisJcy0+Yml0X2J1ZiAgPSAwOworfQorCisjaWZkZWYgQklUU1RSRUFNX1dSSVRFUl9MRQorI2RlZmluZSBhdnByaXZfYWxpZ25fcHV0X2JpdHMgYWxpZ25fcHV0X2JpdHNfdW5zdXBwb3J0ZWRfaGVyZQorI2RlZmluZSBhdnByaXZfcHV0X3N0cmluZyBmZl9wdXRfc3RyaW5nX3Vuc3VwcG9ydGVkX2hlcmUKKyNkZWZpbmUgYXZwcml2X2NvcHlfYml0cyBhdnByaXZfY29weV9iaXRzX3Vuc3VwcG9ydGVkX2hlcmUKKyNlbHNlCisvKioKKyAqIFBhZCB0aGUgYml0c3RyZWFtIHdpdGggemVyb3MgdXAgdG8gdGhlIG5leHQgYnl0ZSBib3VuZGFyeS4KKyAqLwordm9pZCBhdnByaXZfYWxpZ25fcHV0X2JpdHMoc3RydWN0IHB1dF9iaXRzX2NvbnRleHQgKnMpOworCisvKioKKyAqIFB1dCB0aGUgc3RyaW5nIHN0cmluZyBpbiB0aGUgYml0c3RyZWFtLgorICoKKyAqIEBwYXJhbSB0ZXJtaW5hdGVfc3RyaW5nIDAtdGVybWluYXRlcyB0aGUgd3JpdHRlbiBzdHJpbmcgaWYgdmFsdWUgaXMgMQorICovCit2b2lkIGF2cHJpdl9wdXRfc3RyaW5nKHN0cnVjdCBwdXRfYml0c19jb250ZXh0ICpwYiwKKwljb25zdCBjaGFyICpzdHJpbmcsIGludCB0ZXJtaW5hdGVfc3RyaW5nKTsKKworLyoqCisgKiBDb3B5IHRoZSBjb250ZW50IG9mIHNyYyB0byB0aGUgYml0c3RyZWFtLgorICoKKyAqIEBwYXJhbSBsZW5ndGggdGhlIG51bWJlciBvZiBiaXRzIG9mIHNyYyB0byBjb3B5CisgKi8KK3ZvaWQgYXZwcml2X2NvcHlfYml0cyhzdHJ1Y3QgcHV0X2JpdHNfY29udGV4dCAqcGIsIGNvbnN0IHU4ICpzcmMsIGludCBsZW5ndGgpOworI2VuZGlmCisKKy8qKgorICogV3JpdGUgdXAgdG8gMzEgYml0cyBpbnRvIGEgYml0c3RyZWFtLgorICogVXNlIHB1dF9iaXRzMzIgdG8gd3JpdGUgMzIgYml0cy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHB1dF9iaXRzKHN0cnVjdCBwdXRfYml0c19jb250ZXh0ICpzLCBpbnQgbiwgdTMyIHZhbHVlKQoreworCXUzMiBiaXRfYnVmOworCWludCBiaXRfbGVmdDsKKworCWJpdF9idWYgID0gcy0+Yml0X2J1ZjsKKwliaXRfbGVmdCA9IHMtPmJpdF9sZWZ0OworCisJLyogWFhYOiBvcHRpbWl6ZSAqLworI2lmZGVmIEJJVFNUUkVBTV9XUklURVJfTEUKKwliaXRfYnVmIHw9IHZhbHVlIDw8ICgzMiAtIGJpdF9sZWZ0KTsKKwlpZiAobiA+PSBiaXRfbGVmdCkgeworCQlpZiAoMyA8IHMtPmJ1Zl9lbmQgLSBzLT5idWZfcHRyKSB7CisJCQlBVl9XTDMyKHMtPmJ1Zl9wdHIsIGJpdF9idWYpOworCQkJcy0+YnVmX3B0ciArPSA0OworCQl9IGVsc2UgeworCQkJcHJfZXJyKCJJbnRlcm5hbCBlcnJvciwgcHV0X2JpdHMgYnVmZmVyIHRvbyBzbWFsbFxuIik7CisJCX0KKwkJYml0X2J1ZiAgICAgPSB2YWx1ZSA+PiBiaXRfbGVmdDsKKwkJYml0X2xlZnQgICArPSAzMjsKKwl9CisJYml0X2xlZnQgLT0gbjsKKyNlbHNlCisJaWYgKG4gPCBiaXRfbGVmdCkgeworCQliaXRfYnVmICAgICA9IChiaXRfYnVmIDw8IG4pIHwgdmFsdWU7CisJCWJpdF9sZWZ0ICAgLT0gbjsKKwl9IGVsc2UgeworCQliaXRfYnVmICAgPDw9IGJpdF9sZWZ0OworCQliaXRfYnVmICAgIHw9IHZhbHVlID4+IChuIC0gYml0X2xlZnQpOworCQlpZiAoMyA8IHMtPmJ1Zl9lbmQgLSBzLT5idWZfcHRyKSB7CisJCQlBVl9XQjMyKHMtPmJ1Zl9wdHIsIGJpdF9idWYpOworCQkJcy0+YnVmX3B0ciArPSA0OworCQl9IGVsc2UgeworCQkJcHJfZXJyKCJJbnRlcm5hbCBlcnJvciwgcHV0X2JpdHMgYnVmZmVyIHRvbyBzbWFsbFxuIik7CisJCX0KKwkJYml0X2xlZnQgICArPSAzMiAtIG47CisJCWJpdF9idWYgICAgID0gdmFsdWU7CisJfQorI2VuZGlmCisJcy0+Yml0X2J1ZiAgPSBiaXRfYnVmOworCXMtPmJpdF9sZWZ0ID0gYml0X2xlZnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfYml0c19sZShzdHJ1Y3QgcHV0X2JpdHNfY29udGV4dCAqcywgaW50IG4sIHUzMiB2YWx1ZSkKK3sKKwl1MzIgYml0X2J1ZjsKKwlpbnQgYml0X2xlZnQ7CisKKwliaXRfYnVmICA9IHMtPmJpdF9idWY7CisJYml0X2xlZnQgPSBzLT5iaXRfbGVmdDsKKworCWJpdF9idWYgfD0gdmFsdWUgPDwgKDMyIC0gYml0X2xlZnQpOworCWlmIChuID49IGJpdF9sZWZ0KSB7CisJCWlmICgzIDwgcy0+YnVmX2VuZCAtIHMtPmJ1Zl9wdHIpIHsKKwkJCUFWX1dMMzIocy0+YnVmX3B0ciwgYml0X2J1Zik7CisJCQlzLT5idWZfcHRyICs9IDQ7CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIkludGVybmFsIGVycm9yLCBwdXRfYml0cyBidWZmZXIgdG9vIHNtYWxsXG4iKTsKKwkJfQorCQliaXRfYnVmICAgICA9IHZhbHVlID4+IGJpdF9sZWZ0OworCQliaXRfbGVmdCAgICs9IDMyOworCX0KKwliaXRfbGVmdCAtPSBuOworCisJcy0+Yml0X2J1ZiAgPSBiaXRfYnVmOworCXMtPmJpdF9sZWZ0ID0gYml0X2xlZnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGF2X21vZF91aW50cDIodTMyIGEsIHUzMiBwKQoreworCXJldHVybiBhICYgKCgxIDw8IHApIC0gMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfc2JpdHMoc3RydWN0IHB1dF9iaXRzX2NvbnRleHQgKnBiLCBpbnQgbiwgaW50MzJfdCB2YWx1ZSkKK3sKKwlwdXRfYml0cyhwYiwgbiwgYXZfbW9kX3VpbnRwMih2YWx1ZSwgbikpOworfQorCisvKioKKyAqIFdyaXRlIGV4YWN0bHkgMzIgYml0cyBpbnRvIGEgYml0c3RyZWFtLgorICovCitzdGF0aWMgdm9pZCBwdXRfYml0czMyKHN0cnVjdCBwdXRfYml0c19jb250ZXh0ICpzLCB1MzIgdmFsdWUpCit7CisJdTMyIGJpdF9idWY7CisJaW50IGJpdF9sZWZ0OworCisJYml0X2J1ZiAgPSBzLT5iaXRfYnVmOworCWJpdF9sZWZ0ID0gcy0+Yml0X2xlZnQ7CisKKyNpZmRlZiBCSVRTVFJFQU1fV1JJVEVSX0xFCisJYml0X2J1ZiB8PSB2YWx1ZSA8PCAoMzIgLSBiaXRfbGVmdCk7CisJaWYgKDMgPCBzLT5idWZfZW5kIC0gcy0+YnVmX3B0cikgeworCQlBVl9XTDMyKHMtPmJ1Zl9wdHIsIGJpdF9idWYpOworCQlzLT5idWZfcHRyICs9IDQ7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCJJbnRlcm5hbCBlcnJvciwgcHV0X2JpdHMgYnVmZmVyIHRvbyBzbWFsbFxuIik7CisJfQorCWJpdF9idWYgICAgID0gKHVpbnQ2NF90KXZhbHVlID4+IGJpdF9sZWZ0OworI2Vsc2UKKwliaXRfYnVmICAgICA9ICh1aW50NjRfdCliaXRfYnVmIDw8IGJpdF9sZWZ0OworCWJpdF9idWYgICAgfD0gdmFsdWUgPj4gKDMyIC0gYml0X2xlZnQpOworCWlmICgzIDwgcy0+YnVmX2VuZCAtIHMtPmJ1Zl9wdHIpIHsKKwkJQVZfV0IzMihzLT5idWZfcHRyLCBiaXRfYnVmKTsKKwkJcy0+YnVmX3B0ciArPSA0OworCX0gZWxzZSB7CisJCXByX2VycigiSW50ZXJuYWwgZXJyb3IsIHB1dF9iaXRzIGJ1ZmZlciB0b28gc21hbGxcbiIpOworCX0KKwliaXRfYnVmICAgICA9IHZhbHVlOworI2VuZGlmCisKKwlzLT5iaXRfYnVmICA9IGJpdF9idWY7CisJcy0+Yml0X2xlZnQgPSBiaXRfbGVmdDsKK30KKworLyoqCisgKiBXcml0ZSB1cCB0byA2NCBiaXRzIGludG8gYSBiaXRzdHJlYW0uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfYml0czY0KHN0cnVjdCBwdXRfYml0c19jb250ZXh0ICpzLCBpbnQgbiwgdWludDY0X3QgdmFsdWUpCit7CisJaWYgKG4gPCAzMikKKwkJcHV0X2JpdHMocywgbiwgdmFsdWUpOworCWVsc2UgaWYgKG4gPT0gMzIpCisJCXB1dF9iaXRzMzIocywgdmFsdWUpOworCWVsc2UgaWYgKG4gPCA2NCkgeworCQl1MzIgbG8gPSB2YWx1ZSAmIDB4ZmZmZmZmZmY7CisJCXUzMiBoaSA9IHZhbHVlID4+IDMyOworI2lmZGVmIEJJVFNUUkVBTV9XUklURVJfTEUKKwkJcHV0X2JpdHMzMihzLCBsbyk7CisJCXB1dF9iaXRzKHMsIG4gLSAzMiwgaGkpOworI2Vsc2UKKwkJcHV0X2JpdHMocywgbiAtIDMyLCBoaSk7CisJCXB1dF9iaXRzMzIocywgbG8pOworI2VuZGlmCisJfSBlbHNlIHsKKwkJdTMyIGxvID0gdmFsdWUgJiAweGZmZmZmZmZmOworCQl1MzIgaGkgPSB2YWx1ZSA+PiAzMjsKKyNpZmRlZiBCSVRTVFJFQU1fV1JJVEVSX0xFCisJCXB1dF9iaXRzMzIocywgbG8pOworCQlwdXRfYml0czMyKHMsIGhpKTsKKyNlbHNlCisJCXB1dF9iaXRzMzIocywgaGkpOworCQlwdXRfYml0czMyKHMsIGxvKTsKKyNlbmRpZgorCX0KK30KKworLyoqCisgKiBSZXR1cm4gdGhlIHBvaW50ZXIgdG8gdGhlIGJ5dGUgd2hlcmUgdGhlIGJpdHN0cmVhbSB3cml0ZXIgd2lsbCBwdXQKKyAqIHRoZSBuZXh0IGJpdC4KKyAqLworc3RhdGljIGlubGluZSB1OCAqcHV0X2JpdHNfcHRyKHN0cnVjdCBwdXRfYml0c19jb250ZXh0ICpzKQoreworCXJldHVybiBzLT5idWZfcHRyOworfQorCisvKioKKyAqIFNraXAgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcy4KKyAqIHN0cnVjdCBwdXRfYml0c19jb250ZXh0IG11c3QgYmUgZmx1c2hlZCAmIGFsaWduZWQgdG8gYSBieXRlIGJvdW5kYXJ5IGJlZm9yZSBjYWxsaW5nIHRoaXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBza2lwX3B1dF9ieXRlcyhzdHJ1Y3QgcHV0X2JpdHNfY29udGV4dCAqcywgaW50IG4pCit7CisJcy0+YnVmX3B0ciArPSBuOworfQorCisvKioKKyAqIFNraXAgdGhlIGdpdmVuIG51bWJlciBvZiBiaXRzLgorICogTXVzdCBvbmx5IGJlIHVzZWQgaWYgdGhlIGFjdHVhbCB2YWx1ZXMgaW4gdGhlIGJpdHN0cmVhbSBkbyBub3QgbWF0dGVyLgorICogSWYgbiBpcyAwIHRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBza2lwX3B1dF9iaXRzKHN0cnVjdCBwdXRfYml0c19jb250ZXh0ICpzLCBpbnQgbikKK3sKKwlzLT5iaXRfbGVmdCAtPSBuOworCXMtPmJ1Zl9wdHIgIC09IDQgKiAocy0+Yml0X2xlZnQgPj4gNSk7CisJcy0+Yml0X2xlZnQgJj0gMzE7Cit9CisKKy8qKgorICogQ2hhbmdlIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gc2l6ZSB0aGUgbmV3IHNpemUgaW4gYnl0ZXMgb2YgdGhlIGJ1ZmZlciB3aGVyZSB0byBwdXQgYml0cworICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3B1dF9iaXRzX2J1ZmZlcl9zaXplKHN0cnVjdCBwdXRfYml0c19jb250ZXh0ICpzLCBpbnQgc2l6ZSkKK3sKKwlzLT5idWZfZW5kID0gcy0+YnVmICsgc2l6ZTsKKwlzLT5zaXplX2luX2JpdHMgPSA4KnNpemU7Cit9CisKKyNlbmRpZiAvKiBBVkNPREVDX1BVVF9CSVRTX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbXZkZWNfcG9ydHMvdmRlY19kcnZfYmFzZS5oIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvdmRlY19kcnZfYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MGQ0MDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FtdmRlY19wb3J0cy92ZGVjX2Rydl9iYXNlLmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE3IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyogbW9yZSBkZXRhaWxzLgorKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKgorKiBEZXNjcmlwdGlvbjoKKyovCisjaWZuZGVmIF9WREVDX0RSVl9CQVNFXworI2RlZmluZSBfVkRFQ19EUlZfQkFTRV8KKworI2luY2x1ZGUgImFtbF92Y29kZWNfZHJ2LmgiCisKKyNpbmNsdWRlICJ2ZGVjX2Rydl9pZi5oIgorCitzdHJ1Y3QgdmRlY19jb21tb25faWYgeworCS8qKgorCSAqICgqaW5pdCkoKSAtIGluaXRpYWxpemUgZGVjb2RlIGRyaXZlcgorCSAqIEBjdHggICAgIDogW2luXSBhbWwgdjRsMiBjb250ZXh0CisJICogQGhfdmRlYyAgOiBbb3V0XSBkcml2ZXIgaGFuZGxlCisJICovCisJaW50ICgqaW5pdCkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsIHVuc2lnbmVkIGxvbmcgKmhfdmRlYyk7CisKKwlpbnQgKCpwcm9iZSkodW5zaWduZWQgbG9uZyBoX3ZkZWMsCisJCXN0cnVjdCBhbWxfdmNvZGVjX21lbSAqYnMsIHZvaWQgKm91dCk7CisKKwkvKioKKwkgKiAoKmRlY29kZSkoKSAtIHRyaWdnZXIgZGVjb2RlCisJICogQGhfdmRlYyAgOiBbaW5dIGRyaXZlciBoYW5kbGUKKwkgKiBAYnMgICAgICA6IFtpbl0gaW5wdXQgYml0c3RyZWFtCisJICogQGZiICAgICAgOiBbaW5dIGZyYW1lIGJ1ZmZlciB0byBzdG9yZSBkZWNvZGVkIGZyYW1lCisJICogQHJlc19jaGcgOiBbb3V0XSByZXNvbHV0aW9uIGNoYW5nZSBoYXBwZW4KKwkgKi8KKwlpbnQgKCpkZWNvZGUpKHVuc2lnbmVkIGxvbmcgaF92ZGVjLCBzdHJ1Y3QgYW1sX3Zjb2RlY19tZW0gKmJzLAorCQlib29sICpyZXNfY2hnKTsKKworCS8qKgorCSAqICgqZ2V0X3BhcmFtKSgpIC0gZ2V0IGRyaXZlcidzIHBhcmFtZXRlcgorCSAqIEBoX3ZkZWMgOiBbaW5dIGRyaXZlciBoYW5kbGUKKwkgKiBAdHlwZSAgIDogW2luXSBpbnB1dCBwYXJhbWV0ZXIgdHlwZQorCSAqIEBvdXQgICAgOiBbb3V0XSBidWZmZXIgdG8gc3RvcmUgcXVlcnkgcmVzdWx0CisJICovCisJaW50ICgqZ2V0X3BhcmFtKSh1bnNpZ25lZCBsb25nIGhfdmRlYywKKwkJZW51bSB2ZGVjX2dldF9wYXJhbV90eXBlIHR5cGUsIHZvaWQgKm91dCk7CisKKwkvKioKKwkgKiAoKnNldF9wYXJhbSkoKSAtIHNldCBkcml2ZXIncyBwYXJhbWV0ZXIKKwkgKiBAaF92ZGVjIDogW2luXSBkcml2ZXIgaGFuZGxlCisJICogQHR5cGUgICA6IFtpbl0gaW5wdXQgcGFyYW1ldGVyIHR5cGUKKwkgKiBAaW4gICAgOiBbaW5dIGJ1ZmZlciB0byBzdG9yZSBxdWVyeSByZXN1bHQKKwkgKi8KKwlpbnQgKCpzZXRfcGFyYW0pKHVuc2lnbmVkIGxvbmcgaF92ZGVjLAorCQllbnVtIHZkZWNfc2V0X3BhcmFtX3R5cGUgdHlwZSwgdm9pZCAqaW4pOworCisJLyoqCisJICogKCpkZWluaXQpKCkgLSBkZWluaXRpYWxpemUgZHJpdmVyLgorCSAqIEBoX3ZkZWMgOiBbaW5dIGRyaXZlciBoYW5kbGUgdG8gYmUgZGVpbml0CisJICovCisJdm9pZCAoKmRlaW5pdCkodW5zaWduZWQgbG9uZyBoX3ZkZWMpOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FtdmRlY19wb3J0cy92ZGVjX2Rydl9pZi5jIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvdmRlY19kcnZfaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTUxMGM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hbXZkZWNfcG9ydHMvdmRlY19kcnZfaWYuYwpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE3IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyogbW9yZSBkZXRhaWxzLgorKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKgorKiBEZXNjcmlwdGlvbjoKKyovCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAidmRlY19kcnZfaWYuaCIKKyNpbmNsdWRlICJhbWxfdmNvZGVjX2RlYy5oIgorI2luY2x1ZGUgInZkZWNfZHJ2X2Jhc2UuaCIKKworY29uc3Qgc3RydWN0IHZkZWNfY29tbW9uX2lmICpnZXRfaDI2NF9kZWNfY29tbV9pZih2b2lkKTsKK2NvbnN0IHN0cnVjdCB2ZGVjX2NvbW1vbl9pZiAqZ2V0X2hldmNfZGVjX2NvbW1faWYodm9pZCk7Citjb25zdCBzdHJ1Y3QgdmRlY19jb21tb25faWYgKmdldF92cDlfZGVjX2NvbW1faWYodm9pZCk7Citjb25zdCBzdHJ1Y3QgdmRlY19jb21tb25faWYgKmdldF9tcGVnMTJfZGVjX2NvbW1faWYodm9pZCk7Citjb25zdCBzdHJ1Y3QgdmRlY19jb21tb25faWYgKmdldF9tcGVnNF9kZWNfY29tbV9pZih2b2lkKTsKK2NvbnN0IHN0cnVjdCB2ZGVjX2NvbW1vbl9pZiAqZ2V0X21qcGVnX2RlY19jb21tX2lmKHZvaWQpOworY29uc3Qgc3RydWN0IHZkZWNfY29tbW9uX2lmICpnZXRfYXYxX2RlY19jb21tX2lmKHZvaWQpOworCitpbnQgdmRlY19pZl9pbml0KHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4LCB1bnNpZ25lZCBpbnQgZm91cmNjKQoreworCWludCByZXQgPSAwOworCisJc3dpdGNoIChmb3VyY2MpIHsKKwljYXNlIFY0TDJfUElYX0ZNVF9IMjY0OgorCQljdHgtPmRlY19pZiA9IGdldF9oMjY0X2RlY19jb21tX2lmKCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9QSVhfRk1UX0hFVkM6CisJCWN0eC0+ZGVjX2lmID0gZ2V0X2hldmNfZGVjX2NvbW1faWYoKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX1BJWF9GTVRfVlA5OgorCQljdHgtPmRlY19pZiA9IGdldF92cDlfZGVjX2NvbW1faWYoKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX1BJWF9GTVRfTVBFRzoKKwljYXNlIFY0TDJfUElYX0ZNVF9NUEVHMToKKwljYXNlIFY0TDJfUElYX0ZNVF9NUEVHMjoKKwkJY3R4LT5kZWNfaWYgPSBnZXRfbXBlZzEyX2RlY19jb21tX2lmKCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9QSVhfRk1UX01QRUc0OgorCQljdHgtPmRlY19pZiA9IGdldF9tcGVnNF9kZWNfY29tbV9pZigpOworCQlicmVhazsKKwljYXNlIFY0TDJfUElYX0ZNVF9NSlBFRzoKKwkJY3R4LT5kZWNfaWYgPSBnZXRfbWpwZWdfZGVjX2NvbW1faWYoKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX1BJWF9GTVRfQVYxOgorCQljdHgtPmRlY19pZiA9IGdldF9hdjFfZGVjX2NvbW1faWYoKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gY3R4LT5kZWNfaWYtPmluaXQoY3R4LCAmY3R4LT5kcnZfaGFuZGxlKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCB2ZGVjX2lmX3Byb2JlKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4LAorCXN0cnVjdCBhbWxfdmNvZGVjX21lbSAqYnMsIHZvaWQgKm91dCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGN0eC0+ZGVjX2lmLT5wcm9iZShjdHgtPmRydl9oYW5kbGUsIGJzLCBvdXQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHZkZWNfaWZfZGVjb2RlKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4LAorCQkgICBzdHJ1Y3QgYW1sX3Zjb2RlY19tZW0gKmJzLCBib29sICpyZXNfY2hnKQoreworCWludCByZXQgPSAwOworCisJaWYgKGJzKSB7CisJCWlmICgoYnMtPmFkZHIgJiA2MykgIT0gMCkgeworCQkJdjRsX2RiZyhjdHgsIFY0TF9ERUJVR19DT0RFQ19FUlJPUiwKKwkJCQkiYnMgZG1hX2FkZHIgc2hvdWxkIDY0IGJ5dGUgYWxpZ25cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlpZiAoY3R4LT5kcnZfaGFuZGxlID09IDApCisJCXJldHVybiAtRUlPOworCisJYW1sX3Zjb2RlY19zZXRfY3Vycl9jdHgoY3R4LT5kZXYsIGN0eCk7CisJcmV0ID0gY3R4LT5kZWNfaWYtPmRlY29kZShjdHgtPmRydl9oYW5kbGUsIGJzLCByZXNfY2hnKTsKKwlhbWxfdmNvZGVjX3NldF9jdXJyX2N0eChjdHgtPmRldiwgTlVMTCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgdmRlY19pZl9nZXRfcGFyYW0oc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsCisJZW51bSB2ZGVjX2dldF9wYXJhbV90eXBlIHR5cGUsIHZvaWQgKm91dCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChjdHgtPmRydl9oYW5kbGUgPT0gMCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXQgPSBjdHgtPmRlY19pZi0+Z2V0X3BhcmFtKGN0eC0+ZHJ2X2hhbmRsZSwgdHlwZSwgb3V0KTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCB2ZGVjX2lmX3NldF9wYXJhbShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCwKKwllbnVtIHZkZWNfc2V0X3BhcmFtX3R5cGUgdHlwZSwgdm9pZCAqaW4pCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoY3R4LT5kcnZfaGFuZGxlID09IDApCisJCXJldHVybiAtRUlPOworCisJcmV0ID0gY3R4LT5kZWNfaWYtPnNldF9wYXJhbShjdHgtPmRydl9oYW5kbGUsIHR5cGUsIGluKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgdmRlY19pZl9kZWluaXQoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgpCit7CisJaWYgKGN0eC0+ZHJ2X2hhbmRsZSA9PSAwKQorCQlyZXR1cm47CisKKwljdHgtPmRlY19pZi0+ZGVpbml0KGN0eC0+ZHJ2X2hhbmRsZSk7CisJY3R4LT5kcnZfaGFuZGxlID0gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYW12ZGVjX3BvcnRzL3ZkZWNfZHJ2X2lmLmggYi9kcml2ZXJzL2FtdmRlY19wb3J0cy92ZGVjX2Rydl9pZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OTExZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FtdmRlY19wb3J0cy92ZGVjX2Rydl9pZi5oCkBAIC0wLDAgKzEsMTY1IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorKiBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqCisqIERlc2NyaXB0aW9uOgorKi8KKyNpZm5kZWYgX1ZERUNfRFJWX0lGX0hfCisjZGVmaW5lIF9WREVDX0RSVl9JRl9IXworCisjaW5jbHVkZSAiYW1sX3Zjb2RlY19kcnYuaCIKKyNpbmNsdWRlICJhbWxfdmNvZGVjX2RlYy5oIgorI2luY2x1ZGUgImFtbF92Y29kZWNfdXRpbC5oIgorI2luY2x1ZGUgIi4uL3N0cmVhbV9pbnB1dC9hbXBvcnRzL3N0cmVhbWJ1Zi5oIgorCisjZGVmaW5lIEFNTF9WSURFT19NQUdJQyBDT0RFQ19NT0RFKCdBJywgJ00nLCAnTCcsICdWJykKKworI2RlZmluZSBWNExfU1RSRUFNX1RZUEVfTUFURURBVEEJKDApCisjZGVmaW5lIFY0TF9TVFJFQU1fVFlQRV9GUkFNRQkJKDEpCisKK3N0cnVjdCBzdHJlYW1faW5mbyB7CisJdTMyIHN0cmVhbV93aWR0aDsKKwl1MzIgc3RyZWFtX2hlaWdodDsKKwl1MzIgc3RyZWFtX2ZpZWxkOworCXUzMiBzdHJlYW1fZHBiOworfTsKKworc3RydWN0IGFtbF92aWRlb19zdHJlYW0geworCXUzMiBtYWdpYzsKKwl1MzIgdHlwZTsKKwl1bmlvbiB7CisJCXN0cnVjdCBzdHJlYW1faW5mbyBzOworCQl1OCBidWZbNjRdOworCX0gbTsKKwl1MzIgbGVuOworCXU4IGRhdGFbMF07Cit9OworCisvKioKKyAqIHN0cnVjdCB2ZGVjX2ZiX3N0YXR1cyAgLSBkZWNvZGVyIGZyYW1lIGJ1ZmZlciBzdGF0dXMKKyAqIEBGQl9TVF9JTklUCQk6IGluaXRpYWwgc3RhdGUKKyAqIEBGQl9TVF9ERUNPREVSCTogZnJhbWUgYnVmZmVyIGJlIGFsbG9jdGVkIGJ5IGRlY29kZXIuCisgKiBARkJfU1RfVlBQCQk6IGZyYW1lIGJ1ZmZlciBiZSBhbGxvY2F0ZSBieSB2cHAuCisgKiBARkJfU1RfRElTUExBWQk6IGZyYW1lIGJ1ZmZlciBpcyByZWFkeSB0byBiZSBkaXNwbGF5ZWQuCisgKiBARkJfU1RfRlJFRQkJOiBmcmFtZSBidWZmZXIgaXMgbm90IHVzZWQgYnkgZGVjb2RlciBhbnkgbW9yZQorICovCitlbnVtIHZkZWNfZmJfc3RhdHVzIHsKKwlGQl9TVF9JTklULAorCUZCX1NUX0RFQ09ERVIsCisJRkJfU1RfVlBQLAorCUZCX1NUX0dFMkQsCisJRkJfU1RfRElTUExBWSwKKwlGQl9TVF9GUkVFCit9OworCitlbnVtIHZkZWNfZHdfbW9kZSB7CisJVkRFQ19EV19BRkJDX09OTFkgPSAwLAorCVZERUNfRFdfQUZCQ18xXzFfRFcgPSAxLAorCVZERUNfRFdfQUZCQ18xXzRfRFcgPSAyLAorCVZERUNfRFdfQUZCQ194Ml8xXzRfRFcgPSAzLAorCVZERUNfRFdfQUZCQ18xXzJfRFcgPSA0LAorCVZERUNfRFdfTk9fQUZCQyA9IDE2LAorCVZERUNfRFdfQUZCQ19BVVRPXzFfMiA9IDB4MTAwLAorCVZERUNfRFdfQUZCQ19BVVRPXzFfNCA9IDB4MjAwLAorfTsKKworLyoKKyAqIHRoZSBjYWxsZXIgZG9lcyBub3Qgb3duIHRoZSByZXR1cm5lZCBidWZmZXIuIFRoZSBidWZmZXIgd2lsbCBub3QgYmUKKyAqCQkJCXJlbGVhc2VkIGJlZm9yZSB2ZGVjX2lmX2RlaW5pdC4KKyAqIEdFVF9QQVJBTV9QSUNfSU5GTwkJOiBnZXQgcGljdHVyZSBpbmZvLCBzdHJ1Y3QgdmRlY19waWNfaW5mbyoKKyAqIEdFVF9QQVJBTV9DUk9QX0lORk8JCTogZ2V0IGNyb3AgaW5mbywgc3RydWN0IHY0bDJfY3JvcCoKKyAqIEdFVF9QQVJBTV9EUEJfU0laRQkJOiBnZXQgZHBiIHNpemUsIHVuc2lnbmVkIGludCoKKyAqIEdFVF9QQVJBTV9EV19NT0RFOgkJOiBnZXQgZG91YmxlIHdyaXRlIG1vZGUsIHVuc2lnbmVkIGludCoKKyAqIEdFVF9QQVJBTV9DT01QX0JVRl9JTkZPCTogZ2V0IGNvbXByZXNzZWQgYnVmIGluZm8sICBzdHJ1Y3QgdmRlY19jb21wX2J1Zl9pbmZvKgorICovCitlbnVtIHZkZWNfZ2V0X3BhcmFtX3R5cGUgeworCUdFVF9QQVJBTV9QSUNfSU5GTywKKwlHRVRfUEFSQU1fQ1JPUF9JTkZPLAorCUdFVF9QQVJBTV9EUEJfU0laRSwKKwlHRVRfUEFSQU1fQ09ORklHX0lORk8sCisJR0VUX1BBUkFNX0RXX01PREUsCisJR0VUX1BBUkFNX0NPTVBfQlVGX0lORk8KK307CisKKy8qCisgKiBTRVRfUEFSQU1fUFNfSU5GTwkgICAgICAgOiBzZXQgcGljdHVyZSBwYXJtcywgZGF0YSBwYXJzZWQgZnJvbSB1Y29kZS4KKyAqLworZW51bSB2ZGVjX3NldF9wYXJhbV90eXBlIHsKKwlTRVRfUEFSQU1fV1JJVEVfRlJBTUVfU1lOQywKKwlTRVRfUEFSQU1fUFNfSU5GTywKKwlTRVRfUEFSQU1fQ09NUF9CVUZfSU5GTywKKwlTRVRfUEFSQU1fSERSX0lORk8sCisJU0VUX1BBUkFNX1BPU1RfRVZFTlQsCisJU0VUX1BBUkFNX1BJQ19JTkZPLAorCVNFVF9QQVJBTV9DRkdfSU5GTworfTsKKworLyoqCisgKiBzdHJ1Y3QgdmRlY19mYl9ub2RlICAtIGRlY29kZXIgZnJhbWUgYnVmZmVyIG5vZGUKKyAqIEBsaXN0CTogbGlzdCB0byBob2xkIHRoaXMgbm9kZQorICogQGZiCTogcG9pbnQgdG8gZnJhbWUgYnVmZmVyICh2ZGVjX2ZiKSwgZmIgY291bGQgcG9pbnQgdG8gZnJhbWUgYnVmZmVyIGFuZAorICoJd29ya2luZyBidWZmZXIgdGhpcyBpcyBmb3IgbWFpbnRhaW4gYnVmZmVycyBpbiBkaWZmZXJlbnQgc3RhdGUKKyAqLworc3RydWN0IHZkZWNfZmJfbm9kZSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCB2ZGVjX2ZiICpmYjsKK307CisKKy8qKgorICogdmRlY19pZl9pbml0KCkgLSBpbml0aWFsaXplIGRlY29kZSBkcml2ZXIKKyAqIEBjdHgJOiBbaW5dIHY0bDIgY29udGV4dAorICogQGZvdXJjYwk6IFtpbl0gdmlkZW8gZm9ybWF0IGZvdXJjYywgVjRMMl9QSVhfRk1UX0gyNjQvVlA4L1ZQOS4uCisgKi8KK2ludCB2ZGVjX2lmX2luaXQoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsIHVuc2lnbmVkIGludCBmb3VyY2MpOworCitpbnQgdmRlY19pZl9wcm9iZShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCwKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19tZW0gKmJzLCB2b2lkICpvdXQpOworCisvKioKKyAqIHZkZWNfaWZfZGVpbml0KCkgLSBkZWluaXRpYWxpemUgZGVjb2RlIGRyaXZlcgorICogQGN0eAk6IFtpbl0gdjRsMiBjb250ZXh0CisgKgorICovCit2b2lkIHZkZWNfaWZfZGVpbml0KHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4KTsKKworLyoqCisgKiB2ZGVjX2lmX2RlY29kZSgpIC0gdHJpZ2dlciBkZWNvZGUKKyAqIEBjdHgJOiBbaW5dIHY0bDIgY29udGV4dAorICogQGJzCTogW2luXSBpbnB1dCBiaXRzdHJlYW0KKyAqIEBmYgk6IFtpbl0gZnJhbWUgYnVmZmVyIHRvIHN0b3JlIGRlY29kZWQgZnJhbWUsIHdoZW4gbnVsbCBtZW5hcyBwYXJzZQorICoJaGVhZGVyIG9ubHkKKyAqIEByZXNfY2hnCTogW291dF0gcmVzb2x1dGlvbiBjaGFuZ2UgaGFwcGVucyBpZiBjdXJyZW50IGJzIGhhdmUgZGlmZmVyZW50CisgKglwaWN0dXJlIHdpZHRoL2hlaWdodAorICogTm90ZTogVG8gZmx1c2ggdGhlIGRlY29kZXIgd2hlbiByZWFjaGluZyBFT0YsIHNldCBpbnB1dCBiaXRzdHJlYW0gYXMgTlVMTC4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcy4gLUVJTyBvbiB1bnJlY292ZXJhYmxlIGVycm9yLgorICovCitpbnQgdmRlY19pZl9kZWNvZGUoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsCisJCSAgIHN0cnVjdCBhbWxfdmNvZGVjX21lbSAqYnMsIGJvb2wgKnJlc19jaGcpOworCisvKioKKyAqIHZkZWNfaWZfZ2V0X3BhcmFtKCkgLSBnZXQgZHJpdmVyJ3MgcGFyYW1ldGVyCisgKiBAY3R4CTogW2luXSB2NGwyIGNvbnRleHQKKyAqIEB0eXBlCTogW2luXSBpbnB1dCBwYXJhbWV0ZXIgdHlwZQorICogQG91dAk6IFtvdXRdIGJ1ZmZlciB0byBzdG9yZSBxdWVyeSByZXN1bHQKKyAqLworaW50IHZkZWNfaWZfZ2V0X3BhcmFtKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4LAorCWVudW0gdmRlY19nZXRfcGFyYW1fdHlwZSB0eXBlLCB2b2lkICpvdXQpOworCitpbnQgdmRlY19pZl9zZXRfcGFyYW0oc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsCisJZW51bSB2ZGVjX3NldF9wYXJhbV90eXBlIHR5cGUsIHZvaWQgKmluKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NvbW1vbi9NYWtlZmlsZSBiL2RyaXZlcnMvY29tbW9uL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3Y2UwODAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NvbW1vbi9NYWtlZmlsZQpAQCAtMCwwICsxLDIgQEAKK29iai15CSs9CW1lZGlhX2Nsb2NrLworb2JqLXkJKz0JZmlybXdhcmUvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NvbW1vbi9jaGlwcy9jaGlwcy5jIGIvZHJpdmVycy9jb21tb24vY2hpcHMvY2hpcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNThlMzJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jb21tb24vY2hpcHMvY2hpcHMuYwpAQCAtMCwwICsxLDE5OCBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9tZWRpYS9jb21tb24vYXJjaC9jaGlwcy9jaGlwcy5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy92Zm9ybWF0Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9yZWdpc3RlcnMvY3B1X3ZlcnNpb24uaD4KKyNpbmNsdWRlICIuLi8uLi9zdHJlYW1faW5wdXQvYW1wb3J0cy9hbXBvcnRzX3ByaXYuaCIKKyNpbmNsdWRlICIuLi8uLi9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWMuaCIKKyNpbmNsdWRlICJjaGlwcy5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvbG9nLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy92ZGVjX3JlZy5oPgorI2luY2x1ZGUgImRlY29kZXJfY3B1X3Zlcl9pbmZvLmgiCisKKyNkZWZpbmUgVklERU9fRklSTVdBUkVfRkFUSEVSX05BTUUgInZpZGVvIgorCisvKgorICojZGVmaW5lIE1FU09OX0NQVV9NQUpPUl9JRF9NNgkJMHgxNgorICojZGVmaW5lIE1FU09OX0NQVV9NQUpPUl9JRF9NNlRWCQkweDE3CisgKiNkZWZpbmUgTUVTT05fQ1BVX01BSk9SX0lEX002VFZMCTB4MTgKKyAqI2RlZmluZSBNRVNPTl9DUFVfTUFKT1JfSURfTTgJCTB4MTkKKyAqI2RlZmluZSBNRVNPTl9DUFVfTUFKT1JfSURfTVRWRAkJMHgxQQorICojZGVmaW5lIE1FU09OX0NQVV9NQUpPUl9JRF9NOEIJCTB4MUIKKyAqI2RlZmluZSBNRVNPTl9DUFVfTUFKT1JfSURfTUc5VFYJMHgxQworICojZGVmaW5lIE1FU09OX0NQVV9NQUpPUl9JRF9NOE0yCQkweDFECisgKiNkZWZpbmUgTUVTT05fQ1BVX01BSk9SX0lEX0dYQkIJCTB4MUYKKyAqI2RlZmluZSBNRVNPTl9DUFVfTUFKT1JfSURfR1hUVkJCCQkweDIwCisgKiNkZWZpbmUgTUVTT05fQ1BVX01BSk9SX0lEX0dYTAkJMHgyMQorICojZGVmaW5lIE1FU09OX0NQVV9NQUpPUl9JRF9HWE0JCTB4MjIKKyAqI2RlZmluZSBNRVNPTl9DUFVfTUFKT1JfSURfVFhMCQkweDIzCisgKi8KK3N0cnVjdCB0eXBlX25hbWUgeworCisJaW50IHR5cGU7CisKKwljb25zdCBjaGFyICpuYW1lOworfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHlwZV9uYW1lIGNwdV90eXBlX25hbWVbXSA9IHsKKwl7QU1fTUVTT05fQ1BVX01BSk9SX0lEX002LCAibTYifSwKKwl7QU1fTUVTT05fQ1BVX01BSk9SX0lEX002VFYsICJtNnR2In0sCisJe0FNX01FU09OX0NQVV9NQUpPUl9JRF9NNlRWTCwgIm02dHZsIn0sCisJe0FNX01FU09OX0NQVV9NQUpPUl9JRF9NOCwgIm04In0sCisJe0FNX01FU09OX0NQVV9NQUpPUl9JRF9NVFZELCAibXR2ZCJ9LAorCXtBTV9NRVNPTl9DUFVfTUFKT1JfSURfTThCLCAibThiIn0sCisJe0FNX01FU09OX0NQVV9NQUpPUl9JRF9NRzlUViwgIm1nOXR2In0sCisJe0FNX01FU09OX0NQVV9NQUpPUl9JRF9NOE0yLCAibTgifSwKKwl7QU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYQkIsICJneGJiIn0sCisJe0FNX01FU09OX0NQVV9NQUpPUl9JRF9HWFRWQkIsICJneHR2YmIifSwKKwl7QU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTCwgImd4bCJ9LAorCXtBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hNLCAiZ3htIn0sCisJe0FNX01FU09OX0NQVV9NQUpPUl9JRF9UWEwsICJ0eGwifSwKKwl7QU1fTUVTT05fQ1BVX01BSk9SX0lEX1RYTFgsICJ0eGx4In0sCisJe0FNX01FU09OX0NQVV9NQUpPUl9JRF9HWExYLCAiZ3hseCJ9LAorCXtBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQSwgImcxMmEifSwKKwl7QU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkIsICJnMTJiIn0sCisJe0FNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEsICJzbTEifSwKKwl7QU1fTUVTT05fQ1BVX01BSk9SX0lEX1RMMSwgInRsMSJ9LAorCXtBTV9NRVNPTl9DUFVfTUFKT1JfSURfVE0yLCAidG0yIn0sCisJe0FNX01FU09OX0NQVV9NQUpPUl9JRF9TQzIsICJzYzIifSwKKwl7QU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1LCAidDUifSwKKwl7QU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1RCwgInQ1ZCJ9LAorCXtBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDcsICJ0NyJ9LAorCXtBTV9NRVNPTl9DUFVfTUFKT1JfSURfUzQsICJzNCJ9LAorCXtBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDMsICJ0MyJ9LAorCXtBTV9NRVNPTl9DUFVfTUFKT1JfSURfUDEsICJwMSJ9LAorCXtBTV9NRVNPTl9DUFVfTUFKT1JfSURfUzRELCAiczRkIn0sCisJe0FNX01FU09OX0NQVV9NQUpPUl9JRF9UNVcsICJ0NXcifSwKKwl7MCwgTlVMTH0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X3R5cGVfbmFtZShjb25zdCBzdHJ1Y3QgdHlwZV9uYW1lICp0eXBlbmFtZSwgaW50IHNpemUsCisJaW50IHR5cGUpCit7CisKKwljb25zdCBjaGFyICpuYW1lID0gInVua25vd24iOworCisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisKKwkJaWYgKHR5cGUgPT0gdHlwZW5hbWVbaV0udHlwZSkKKworCQkJbmFtZSA9IHR5cGVuYW1lW2ldLm5hbWU7CisKKwl9CisKKwlyZXR1cm4gbmFtZTsKK30KKworY29uc3QgY2hhciAqZ2V0X2NwdV90eXBlX25hbWUodm9pZCkKK3sKKworCXJldHVybiBnZXRfdHlwZV9uYW1lKGNwdV90eXBlX25hbWUsCisJCXNpemVvZihjcHVfdHlwZV9uYW1lKSAvIHNpemVvZihzdHJ1Y3QgdHlwZV9uYW1lKSwKKwkJZ2V0X2NwdV9tYWpvcl9pZCgpKTsKK30KK0VYUE9SVF9TWU1CT0woZ2V0X2NwdV90eXBlX25hbWUpOworCisvKgorICplbnVtIHZmb3JtYXRfZSB7CisgKglWRk9STUFUX01QRUcxMiA9IDAsCisgKglWRk9STUFUX01QRUc0LAorICoJVkZPUk1BVF9IMjY0LAorICoJVkZPUk1BVF9NSlBFRywKKyAqCVZGT1JNQVRfUkVBTCwKKyAqCVZGT1JNQVRfSlBFRywKKyAqCVZGT1JNQVRfVkMxLAorICoJVkZPUk1BVF9BVlMsCisgKglWRk9STUFUX1lVViwKKyAqCVZGT1JNQVRfSDI2NE1WQywKKyAqCVZGT1JNQVRfSDI2NF80SzJLLAorICoJVkZPUk1BVF9IRVZDLAorICoJVkZPUk1BVF9IMjY0X0VOQywKKyAqCVZGT1JNQVRfSlBFR19FTkMsCisgKglWRk9STUFUX1ZQOSwKKyoJVkZPUk1BVF9BVlMyLAorICoJVkZPUk1BVF9NQVgKKyAqfTsKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB0eXBlX25hbWUgdmZvcm1hdF90eXBlX25hbWVbXSA9IHsKKwl7VkZPUk1BVF9NUEVHMTIsICJtcGVnMTIifSwKKwl7VkZPUk1BVF9NUEVHNCwgIm1wZWc0In0sCisJe1ZGT1JNQVRfSDI2NCwgImgyNjQifSwKKwl7VkZPUk1BVF9NSlBFRywgIm1qcGVnIn0sCisJe1ZGT1JNQVRfUkVBTCwgInJlYWwifSwKKwl7VkZPUk1BVF9KUEVHLCAianBlZyJ9LAorCXtWRk9STUFUX1ZDMSwgInZjMSJ9LAorCXtWRk9STUFUX0FWUywgImF2cyJ9LAorCXtWRk9STUFUX1lVViwgInl1diJ9LAorCXtWRk9STUFUX0gyNjRNVkMsICJoMjY0bXZjIn0sCisJe1ZGT1JNQVRfSDI2NF80SzJLLCAiaDI2NF80ayJ9LAorCXtWRk9STUFUX0hFVkMsICJoZXZjIn0sCisJe1ZGT1JNQVRfSDI2NF9FTkMsICJoMjY0X2VuYyJ9LAorCXtWRk9STUFUX0pQRUdfRU5DLCAianBlZ19lbmMifSwKKwl7VkZPUk1BVF9WUDksICJ2cDkifSwKKwl7VkZPUk1BVF9BVlMyLCAiYXZzMiJ9LAorCXtWRk9STUFUX0FWMSwgImF2MSJ9LAorCXtWRk9STUFUX1lVViwgInl1diJ9LAorCXswLCBOVUxMfSwKK307CisKK2NvbnN0IGNoYXIgKmdldF92aWRlb19mb3JtYXRfbmFtZShlbnVtIHZmb3JtYXRfZSB0eXBlKQoreworCisJcmV0dXJuIGdldF90eXBlX25hbWUodmZvcm1hdF90eXBlX25hbWUsCisJCXNpemVvZih2Zm9ybWF0X3R5cGVfbmFtZSkgLyBzaXplb2Yoc3RydWN0IHR5cGVfbmFtZSksIHR5cGUpOworfQorRVhQT1JUX1NZTUJPTChnZXRfdmlkZW9fZm9ybWF0X25hbWUpOworCitzdGF0aWMgc3RydWN0IGNoaXBfdmRlY19pbmZvX3MgY3VycmVudF9jaGlwX2luZm87CisKK3N0cnVjdCBjaGlwX3ZkZWNfaW5mb19zICpnZXRfY3VycmVudF92ZGVjX2NoaXAodm9pZCkKK3sKKworCXJldHVybiAmY3VycmVudF9jaGlwX2luZm87Cit9CitFWFBPUlRfU1lNQk9MKGdldF9jdXJyZW50X3ZkZWNfY2hpcCk7CisKK2Jvb2wgY2hlY2tfZWZ1c2VfY2hpcChpbnQgdmZvcm1hdCkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzLCBpID0gMDsKKwlpbnQgdHlwZVtdID0gezE1LCAxNCwgMTEsIDJ9OyAvKiBhdnMyLCB2cDksIGgyNjUsIGgyNjQgKi8KKworCXN0YXR1cyA9ICAoUkVBRF9FRlVTRV9SRUcoRUZVU0VfTElDMikgPj4gOCAmIDB4Zik7CisJaWYgKCFzdGF0dXMpCisJCXJldHVybiBmYWxzZTsKKworCWRvIHsKKwkJaWYgKChzdGF0dXMgJiAxKSAmJiAodHlwZVtpXSA9PSB2Zm9ybWF0KSkKKwkJCXJldHVybiB0cnVlOworCQlpKys7CisJfSB3aGlsZSAoc3RhdHVzID4+PSAxKTsKKworCXJldHVybiBmYWxzZTsKK30KK0VYUE9SVF9TWU1CT0woY2hlY2tfZWZ1c2VfY2hpcCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY29tbW9uL2NoaXBzL2NoaXBzLmggYi9kcml2ZXJzL2NvbW1vbi9jaGlwcy9jaGlwcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwM2U5ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NvbW1vbi9jaGlwcy9jaGlwcy5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvbWVkaWEvY29tbW9uL2FyY2gvY2hpcHMvY2hpcHMuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIFVDT0RFX01BTkFHRVJfSEVBREVSCisjZGVmaW5lIFVDT0RFX01BTkFHRVJfSEVBREVSCisjaW5jbHVkZSAiLi4vbWVkaWFfY2xvY2svY2xrL2Nsa19wcml2LmgiCisKK3N0cnVjdCBjaGlwX3ZkZWNfaW5mb19zIHsKKworCWludCBjcHVfdHlwZTsKKworCXN0cnVjdCB2aWRlb19maXJtd2FyZV9zICpmaXJtd2FyZTsKKworCXN0cnVjdCBjaGlwX3ZkZWNfY2xrX3MgKmNsa19tZ3JbVkRFQ19NQVhdOworCisJc3RydWN0IGNsa19zZXRfc2V0dGluZyAqY2xrX3NldHRpbmdfYXJyYXk7Cit9OworCitjb25zdCBjaGFyICpnZXRfY3B1X3R5cGVfbmFtZSh2b2lkKTsKK2NvbnN0IGNoYXIgKmdldF92aWRlb19mb3JtYXRfbmFtZShlbnVtIHZmb3JtYXRfZSB0eXBlKTsKKworc3RydWN0IGNoaXBfdmRlY19pbmZvX3MgKmdldF9jdXJyZW50X3ZkZWNfY2hpcCh2b2lkKTsKKworYm9vbCBjaGVja19lZnVzZV9jaGlwKGludCB2Zm9ybWF0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NvbW1vbi9jaGlwcy9kZWNvZGVyX2NwdV92ZXJfaW5mby5jIGIvZHJpdmVycy9jb21tb24vY2hpcHMvZGVjb2Rlcl9jcHVfdmVyX2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjE2MmI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jb21tb24vY2hpcHMvZGVjb2Rlcl9jcHVfdmVyX2luZm8uYwpAQCAtMCwwICsxLDI3MSBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE3IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyogbW9yZSBkZXRhaWxzLgorKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKgorKiBEZXNjcmlwdGlvbjoKKyovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvcmVnaXN0ZXJzL2NwdV92ZXJzaW9uLmg+CisjaW5jbHVkZSAiZGVjb2Rlcl9jcHVfdmVyX2luZm8uaCIKKworI2RlZmluZSBERUNPREVfQ1BVX1ZFUl9JRF9OT0RFX05BTUUgImNwdV92ZXJfbmFtZSIKKyNkZWZpbmUgQU1fU1VDRVNTIDAKKyNkZWZpbmUgTUFKT1JfSURfU1RBUlQgQU1fTUVTT05fQ1BVX01BSk9SX0lEX002CisKK3N0YXRpYyBlbnVtIEFNX01FU09OX0NQVV9NQUpPUl9JRCBjcHVfdmVyX2lkID0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX01BWDsKK3N0YXRpYyBpbnQgY3B1X3N1Yl9pZCA9IDA7CisKK3N0YXRpYyBlbnVtIEFNX01FU09OX0NQVV9NQUpPUl9JRCBjcHVfdmVyX2luZm9bQU1fTUVTT05fQ1BVX01BSk9SX0lEX01BWCAtIE1BSk9SX0lEX1NUQVJUXT0KK3sKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfTTYsCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX002VFYsCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX002VFZMLAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9NOCwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfTVRWRCwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfTThCLAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9NRzlUViwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfTThNMiwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfVU5VU0UsCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYQkIsCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYVFZCQiwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hMLAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9HWE0sCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RYTCwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfVFhMWCwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfQVhHLAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9HWExYLAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9UWEhELAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBLAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJCLAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9HWExYMiwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xLAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9BMSwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfUkVTXzB4MmQsCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RMMSwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfVE0yLAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9DMSwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfUkVTXzB4MzEsCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NDMiwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfQzIsCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1LAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9UNUQsCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3LAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9TNCwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDMsCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX1AxLAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9TNEQsCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1VywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGNwdV92ZXJfb2ZfbWF0Y2hbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0gImFtbG9naWMsIGNwdS1tYWpvci1pZC1heGciLAorCQkuZGF0YSA9ICZjcHVfdmVyX2luZm9bQU1fTUVTT05fQ1BVX01BSk9SX0lEX0FYRyAtIE1BSk9SX0lEX1NUQVJUXSwKKwl9LAorCisJeworCQkuY29tcGF0aWJsZSA9ICJhbWxvZ2ljLCBjcHUtbWFqb3ItaWQtZzEyYSIsCisJCS5kYXRhID0gJmNwdV92ZXJfaW5mb1tBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQSAtIE1BSk9SX0lEX1NUQVJUXSwKKwl9LAorCisJeworCQkuY29tcGF0aWJsZSA9ICJhbWxvZ2ljLCBjcHUtbWFqb3ItaWQtZ3hsIiwKKwkJLmRhdGEgPSAmY3B1X3Zlcl9pbmZvW0FNX01FU09OX0NQVV9NQUpPUl9JRF9HWEwgLSBNQUpPUl9JRF9TVEFSVF0sCisJfSwKKworCXsKKwkJLmNvbXBhdGlibGUgPSAiYW1sb2dpYywgY3B1LW1ham9yLWlkLWd4bSIsCisJCS5kYXRhID0gJmNwdV92ZXJfaW5mb1tBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hNIC0gTUFKT1JfSURfU1RBUlRdLAorCX0sCisKKwl7CisJCS5jb21wYXRpYmxlID0gImFtbG9naWMsIGNwdS1tYWpvci1pZC10eGwiLAorCQkuZGF0YSA9ICZjcHVfdmVyX2luZm9bQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RYTCAtIE1BSk9SX0lEX1NUQVJUXSwKKwl9LAorCisJeworCQkuY29tcGF0aWJsZSA9ICJhbWxvZ2ljLCBjcHUtbWFqb3ItaWQtdHhseCIsCisJCS5kYXRhID0gJmNwdV92ZXJfaW5mb1tBTV9NRVNPTl9DUFVfTUFKT1JfSURfVFhMWCAtIE1BSk9SX0lEX1NUQVJUXSwKKwl9LAorCisJeworCQkuY29tcGF0aWJsZSA9ICJhbWxvZ2ljLCBjcHUtbWFqb3ItaWQtc20xIiwKKwkJLmRhdGEgPSAmY3B1X3Zlcl9pbmZvW0FNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEgLSBNQUpPUl9JRF9TVEFSVF0sCisJfSwKKworCXsKKwkJLmNvbXBhdGlibGUgPSAiYW1sb2dpYywgY3B1LW1ham9yLWlkLXRsMSIsCisJCS5kYXRhID0gJmNwdV92ZXJfaW5mb1tBTV9NRVNPTl9DUFVfTUFKT1JfSURfVEwxIC0gTUFKT1JfSURfU1RBUlRdLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJhbWxvZ2ljLCBjcHUtbWFqb3ItaWQtdG0yIiwKKwkJLmRhdGEgPSAmY3B1X3Zlcl9pbmZvW0FNX01FU09OX0NQVV9NQUpPUl9JRF9UTTIgLSBNQUpPUl9JRF9TVEFSVF0sCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gImFtbG9naWMsIGNwdS1tYWpvci1pZC1zYzIiLAorCQkuZGF0YSA9ICZjcHVfdmVyX2luZm9bQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NDMiAtIE1BSk9SX0lEX1NUQVJUXSwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAiYW1sb2dpYywgY3B1LW1ham9yLWlkLXQ1IiwKKwkJLmRhdGEgPSAmY3B1X3Zlcl9pbmZvW0FNX01FU09OX0NQVV9NQUpPUl9JRF9UNSAtIE1BSk9SX0lEX1NUQVJUXSwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAiYW1sb2dpYywgY3B1LW1ham9yLWlkLXQ1ZCIsCisJCS5kYXRhID0gJmNwdV92ZXJfaW5mb1tBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDVEIC0gTUFKT1JfSURfU1RBUlRdLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJhbWxvZ2ljLCBjcHUtbWFqb3ItaWQtdDciLAorCQkuZGF0YSA9ICZjcHVfdmVyX2luZm9bQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3IC0gTUFKT1JfSURfU1RBUlRdLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJhbWxvZ2ljLCBjcHUtbWFqb3ItaWQtczQiLAorCQkuZGF0YSA9ICZjcHVfdmVyX2luZm9bQU1fTUVTT05fQ1BVX01BSk9SX0lEX1M0IC0gTUFKT1JfSURfU1RBUlRdLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJhbWxvZ2ljLCBjcHUtbWFqb3ItaWQtdDMiLAorCQkuZGF0YSA9ICZjcHVfdmVyX2luZm9bQU1fTUVTT05fQ1BVX01BSk9SX0lEX1QzIC0gTUFKT1JfSURfU1RBUlRdLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJhbWxvZ2ljLCBjcHUtbWFqb3ItaWQtcDEiLAorCQkuZGF0YSA9ICZjcHVfdmVyX2luZm9bQU1fTUVTT05fQ1BVX01BSk9SX0lEX1AxIC0gTUFKT1JfSURfU1RBUlRdLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJhbWxvZ2ljLCBjcHUtbWFqb3ItaWQtczRkIiwKKwkJLmRhdGEgPSAmY3B1X3Zlcl9pbmZvW0FNX01FU09OX0NQVV9NQUpPUl9JRF9TNEQgLSBNQUpPUl9JRF9TVEFSVF0sCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gImFtbG9naWMsIGNwdS1tYWpvci1pZC10NXciLAorCQkuZGF0YSA9ICZjcHVfdmVyX2luZm9bQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1VyAtIE1BSk9SX0lEX1NUQVJUXSwKKwl9LAorCXt9LAorfTsKKworc3RhdGljIGNvbnN0IGludCBjcHVfc3ViX2luZm9bXSA9IHsKKwkJQU1fTUVTT05fQ1BVX01JTk9SX0lEX1JFVkJfRzEyQiwKKwkJQU1fTUVTT05fQ1BVX01JTk9SX0lEX1JFVkJfVE0yLAorCQlBTV9NRVNPTl9DUFVfTUlOT1JfSURfUzRfUzgwNVgyLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgY3B1X3N1Yl9pZF9vZl9tYXRjaFtdID0geworCXsKKwkJLmNvbXBhdGlibGUgPSAiYW1sb2dpYywgY3B1LW1ham9yLWlkLWcxMmItYiIsCisJCS5kYXRhID0gJmNwdV9zdWJfaW5mb1swXSwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAiYW1sb2dpYywgY3B1LW1ham9yLWlkLXRtMi1iIiwKKwkJLmRhdGEgPSAmY3B1X3N1Yl9pbmZvWzFdLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJhbWxvZ2ljLCBjcHUtbWFqb3ItaWQtczQtODA1eDIiLAorCQkuZGF0YSA9ICZjcHVfc3ViX2luZm9bMl0sCisJfSwKK307CisKK3N0YXRpYyBib29sIGdldF9jcHVfaWRfZnJvbV9kdGIoZW51bSBBTV9NRVNPTl9DUFVfTUFKT1JfSUQgKnBpZF90eXBlLCBpbnQgKnN1Yl9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBub2RlID0gTlVMTDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gTlVMTDsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpwbWF0Y2ggPSBOVUxMOworCisJcG5vZGUgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCBERUNPREVfQ1BVX1ZFUl9JRF9OT0RFX05BTUUpOworCWlmIChOVUxMID09IHBub2RlKSB7CisJCXByX2VycigiTm8gZmluZCBub2RlLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBkZXYgPSAgb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShwbm9kZSk7CisJaWYgKE5VTEwgPT0gcGRldikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwbWF0Y2ggPSBvZl9tYXRjaF9kZXZpY2UoY3B1X3Zlcl9vZl9tYXRjaCwgJnBkZXYtPmRldik7CisJaWYgKE5VTEwgPT0gcG1hdGNoKSB7CisJCXBtYXRjaCA9IG9mX21hdGNoX2RldmljZShjcHVfc3ViX2lkX29mX21hdGNoLCAmcGRldi0+ZGV2KTsKKwkJaWYgKE5VTEwgPT0gcG1hdGNoKSB7CisJCQlwcl9lcnIoIk5vIGZpbmQgb2ZfbWF0Y2hfZGV2aWNlXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJKnBpZF90eXBlID0gKGVudW0gQU1fTUVTT05fQ1BVX01BSk9SX0lEKSgqKGludCAqKXBtYXRjaC0+ZGF0YSkgJiAoTUFKT1lfSURfTUFTSyk7CisKKwkqc3ViX2lkID0gKCgqKGludCAqKXBtYXRjaC0+ZGF0YSkgJiAoU1VCX0lEX01BU0spKSA+PiA4OworCisJcmV0dXJuIEFNX1NVQ0VTUzsKK30KKworc3RhdGljIHZvaWQgaW5pdGlhbF9jcHVfaWQodm9pZCkKK3sKKwllbnVtIEFNX01FU09OX0NQVV9NQUpPUl9JRCBpZF90eXBlID0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX01BWDsKKwlpbnQgc3ViX2lkID0gMDsKKworCWlmIChBTV9TVUNFU1MgPT0gZ2V0X2NwdV9pZF9mcm9tX2R0YigmaWRfdHlwZSwgJnN1Yl9pZCkpIHsKKwkJY3B1X3Zlcl9pZCA9IGlkX3R5cGU7CisJCWNwdV9zdWJfaWQgPSBzdWJfaWQ7CisJfSBlbHNlIHsKKwkJY3B1X3Zlcl9pZCA9IChlbnVtIEFNX01FU09OX0NQVV9NQUpPUl9JRClnZXRfY3B1X3R5cGUoKTsKKwkJY3B1X3N1Yl9pZCA9IChpc19tZXNvbl9yZXZfYigpKSA/IENISVBfUkVWQiA6IENISVBfUkVWQTsKKwl9CisKKwlpZiAoKEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJCID09IGNwdV92ZXJfaWQpICYmIChDSElQX1JFVkIgPT0gY3B1X3N1Yl9pZCkpCisJCWNwdV92ZXJfaWQgPSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVEwxOworCisJcHJfaW5mbygidmRlYyBpbml0IGNwdSBpZDogMHgleCglZCkiLCBjcHVfdmVyX2lkLCBjcHVfc3ViX2lkKTsKK30KKworZW51bSBBTV9NRVNPTl9DUFVfTUFKT1JfSUQgZ2V0X2NwdV9tYWpvcl9pZCh2b2lkKQoreworCWlmIChBTV9NRVNPTl9DUFVfTUFKT1JfSURfTUFYID09IGNwdV92ZXJfaWQpCisJCWluaXRpYWxfY3B1X2lkKCk7CisKKwlyZXR1cm4gY3B1X3Zlcl9pZDsKK30KK0VYUE9SVF9TWU1CT0woZ2V0X2NwdV9tYWpvcl9pZCk7CisKK2ludCBnZXRfY3B1X3N1Yl9pZCh2b2lkKQoreworCXJldHVybiBjcHVfc3ViX2lkOworfQorRVhQT1JUX1NZTUJPTChnZXRfY3B1X3N1Yl9pZCk7CisKK2Jvb2wgaXNfY3B1X21lc29uX3JldmIodm9pZCkKK3sKKwlpZiAoQU1fTUVTT05fQ1BVX01BSk9SX0lEX01BWCA9PSBjcHVfdmVyX2lkKQorCQlpbml0aWFsX2NwdV9pZCgpOworCisJcmV0dXJuIChjcHVfc3ViX2lkID09IENISVBfUkVWQik7Cit9CitFWFBPUlRfU1lNQk9MKGlzX2NwdV9tZXNvbl9yZXZiKTsKKworYm9vbCBpc19jcHVfdG0yX3JldmIodm9pZCkKK3sKKwlyZXR1cm4gKChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RNMikKKwkJJiYgKGlzX2NwdV9tZXNvbl9yZXZiKCkpKTsKK30KK0VYUE9SVF9TWU1CT0woaXNfY3B1X3RtMl9yZXZiKTsKKworYm9vbCBpc19jcHVfczRfczgwNXgyKHZvaWQpCit7CisJcmV0dXJuICgoZ2V0X2NwdV9tYWpvcl9pZCgpID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TNCkKKwkJJiYgKGdldF9jcHVfc3ViX2lkKCkgPT0gQ0hJUF9SRVZYKSk7Cit9CitFWFBPUlRfU1lNQk9MKGlzX2NwdV9zNF9zODA1eDIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NvbW1vbi9jaGlwcy9kZWNvZGVyX2NwdV92ZXJfaW5mby5oIGIvZHJpdmVycy9jb21tb24vY2hpcHMvZGVjb2Rlcl9jcHVfdmVyX2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTI5MjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jb21tb24vY2hpcHMvZGVjb2Rlcl9jcHVfdmVyX2luZm8uaApAQCAtMCwwICsxLDk1IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorKiBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqCisqIERlc2NyaXB0aW9uOgorKi8KKyNpZm5kZWYgREVDT0RFUl9DUFVfVkVSX0lORk9fSAorI2RlZmluZSBERUNPREVSX0NQVV9WRVJfSU5GT19ICisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9yZWdpc3RlcnMvY3B1X3ZlcnNpb24uaD4KKy8qIG1ham95IGNoaXAgaWQgZGVmaW5lICovCisjZGVmaW5lIE1BSk9ZX0lEX01BU0sgKDB4MDAwMDAwZmYpCisKK2VudW0gQU1fTUVTT05fQ1BVX01BSk9SX0lEIHsKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfTTYJPSAweDE2LAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9NNlRWCT0gMHgxNywKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfTTZUVkwJPSAweDE4LAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9NOAk9IDB4MTksCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX01UVkQJPSAweDFBLAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9NOEIJPSAweDFCLAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9NRzlUVgk9IDB4MUMsCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX004TTIJPSAweDFELAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9VTlVTRQk9IDB4MUUsCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYQkIJPSAweDFGLAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9HWFRWQkIJPSAweDIwLAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9HWEwJPSAweDIxLAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9HWE0JPSAweDIyLAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9UWEwJPSAweDIzLAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9UWExYCT0gMHgyNCwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfQVhHCT0gMHgyNSwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hMWAk9IDB4MjYsCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RYSEQJPSAweDI3LAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBCT0gMHgyOCwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQgk9IDB4MjksCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTFgyCT0gMHgyYSwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xCT0gMHgyYiwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfQTEJPSAweDJjLAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9SRVNfMHgyZCwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfVEwxCT0gMHgyZSwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfVE0yCT0gMHgyZiwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfQzEJPSAweDMwLAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9SRVNfMHgzMSwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfU0MyCT0gMHgzMiwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfQzIJPSAweDMzLAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9UNQk9IDB4MzQsCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1RAk9IDB4MzUsCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3CT0gMHgzNiwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfUzQJPSAweDM3LAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9UMwk9IDB4MzgsCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX1AxCT0gMHgzOSwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfUzRECT0gMHgzYSwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDVXCT0gMHgzYiwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfTUFYLAorfTsKKworLyogY2hpcHMgc3ViIGlkIGRlZmluZSAqLworI2RlZmluZSBDSElQX1JFVkEgMHgwCisjZGVmaW5lIENISVBfUkVWQiAweDEKKyNkZWZpbmUgQ0hJUF9SRVZDIDB4MgorI2RlZmluZSBDSElQX1JFVlggMHgxMAorCisjZGVmaW5lIFJFVkJfTUFTSyAoQ0hJUF9SRVZCIDw8IDgpCisjZGVmaW5lIFJFVkNfTUFTSyAoQ0hJUF9SRVZDIDw8IDgpCisjZGVmaW5lIFJFVlhfTUFTSyAoQ0hJUF9SRVZYIDw8IDgpCisKKyNkZWZpbmUgU1VCX0lEX01BU0sgKFJFVkJfTUFTSyB8IFJFVkNfTUFTSyB8IFJFVlhfTUFTSykKKworI2RlZmluZSBBTV9NRVNPTl9DUFVfTUlOT1JfSURfUkVWQl9HMTJCCSAoUkVWQl9NQVNLIHwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkIpCisjZGVmaW5lIEFNX01FU09OX0NQVV9NSU5PUl9JRF9SRVZCX1RNMiAgIChSRVZCX01BU0sgfCBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVE0yKQorI2RlZmluZSBBTV9NRVNPTl9DUFVfTUlOT1JfSURfUzRfUzgwNVgyICAoUkVWWF9NQVNLIHwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX1M0KQorCisvKiBleHBvcnQgZnVuY3Rpb25zICovCitlbnVtIEFNX01FU09OX0NQVV9NQUpPUl9JRCBnZXRfY3B1X21ham9yX2lkKHZvaWQpOworCitib29sIGlzX2NwdV9tZXNvbl9yZXZiKHZvaWQpOworCitib29sIGlzX2NwdV90bTJfcmV2Yih2b2lkKTsKKworaW50IGdldF9jcHVfc3ViX2lkKHZvaWQpOworCitib29sIGlzX2NwdV9zNF9zODA1eDIodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jb21tb24vZmlybXdhcmUvTWFrZWZpbGUgYi9kcml2ZXJzL2NvbW1vbi9maXJtd2FyZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDgwMzljCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jb21tb24vZmlybXdhcmUvTWFrZWZpbGUKQEAgLTAsMCArMSwzIEBACitvYmotbQkrPQlmaXJtd2FyZS5vCitmaXJtd2FyZS1vYmpzCSs9CWZpcm13YXJlX2Rydi5vCitmaXJtd2FyZS1vYmpzCSs9CWZpcm13YXJlX3R5cGUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jb21tb24vZmlybXdhcmUvZmlybXdhcmVfY2ZnLmggYi9kcml2ZXJzL2NvbW1vbi9maXJtd2FyZS9maXJtd2FyZV9jZmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjNhYzJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jb21tb24vZmlybXdhcmUvZmlybXdhcmVfY2ZnLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9tZWRpYS9jb21tb24vZmlybXdhcmUvZmlybXdhcmVfY2ZnLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworLyphbGwgZmlybXdhcmVzIGluIG9uZSBiaW4uKi8KK3tWSURFT19NSVNDLAlWSURFT19QQUNLQUdFLAkidmlkZW9fdWNvZGUuYmluIn0sCisKKy8qIE5vdGU6IGlmIHRoZSBhZGRpdGlvbiBvZiBuZXcgcGFja2FnZSBoYXMgdGhlIHNhbWUgbmFtZSAqLworLyogYXMgdGhlIGZpcm13YXJlIGluIHRoZSB2aWRlb191Y29kZS5iaW4sIHRoZSBmaXJtd2FyZSAqLworLyogaW4gdGhlIHZpZGVvX3Vjb2RlLmJpbiB3aWxsIGJlIGlnbm9yZWQgeWV0LCBiZWNhdXNlIHRoZSAqLworLyogdmlkZW9fdWNvZGUuYmluIHdpbGwgYWx3YXlzIGJlIHByb2Nlc3NlZCBpbiB0aGUgZW5kICovCit7VklERU9fRU5DT0RFLAlWSURFT19QQUNLQUdFLAkiaDI2NF9lbmMuYmluIn0sCisKKworLypmaXJtd2FyZSBmb3IgYSBzcGVjaWFsIGZvcm1hdCwgdG8gcmVwbGFjZSB0aGUgZm9ybWF0IGluIHRoZSBwYWNrYWdlLiovCisvKntWSURFT19ERUNPREUsCVZJREVPX0ZXX0ZJTEUsCSJoMjY1LmJpbiJ9LCovCisvKntWSURFT19ERUNPREUsCVZJREVPX0ZXX0ZJTEUsCSJoMjY0LmJpbiJ9LCovCisvKntWSURFT19ERUNPREUsCVZJREVPX0ZXX0ZJTEUsCSJoMjY0X211bHRpLmJpbiJ9LCovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY29tbW9uL2Zpcm13YXJlL2Zpcm13YXJlX2Rydi5jIGIvZHJpdmVycy9jb21tb24vZmlybXdhcmUvZmlybXdhcmVfZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQyMjE5OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY29tbW9uL2Zpcm13YXJlL2Zpcm13YXJlX2Rydi5jCkBAIC0wLDAgKzEsMTA1NiBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9tZWRpYS9jb21tb24vZmlybXdhcmUvZmlybXdhcmUuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy92Zm9ybWF0Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9yZWdpc3RlcnMvY3B1X3ZlcnNpb24uaD4KKyNpbmNsdWRlICIuLi8uLi9zdHJlYW1faW5wdXQvYW1wb3J0cy9hbXBvcnRzX3ByaXYuaCIKKyNpbmNsdWRlICIuLi8uLi9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWMuaCIKKyNpbmNsdWRlICJmaXJtd2FyZV9wcml2LmgiCisjaW5jbHVkZSAiLi4vY2hpcHMvY2hpcHMuaCIKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL2xvZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy90ZWUuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWFqb3IuaD4gLy9pZiBrZXJuZWwgaXMgNC45IHRoZW4gdXNlIHRoaXMgb25lCisjaW5jbHVkZSA8dWFwaS9saW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgIi4uL2NoaXBzL2RlY29kZXJfY3B1X3Zlcl9pbmZvLmgiCisKKy8qIG1ham9yLm1pbm9yICovCisjZGVmaW5lIFBBQ0tfVkVSUyAidjAuMyIKKworI2RlZmluZSBDTEFTU19OQU1FCSJmaXJtd2FyZV9jb2RlYyIKKyNkZWZpbmUgREVWX05BTUUJImZpcm13YXJlX3ZkZWMiCisjZGVmaW5lIERJUgkJInZpZGVvIgorI2RlZmluZSBGUklNV0FSRV9TSVpFCSg2NCAqIDEwMjQpIC8qNjRrKi8KKyNkZWZpbmUgQlVGRl9TSVpFCSgxMDI0ICogMTAyNCAqIDIpCisKKyNkZWZpbmUgRldfTE9BRF9GT1JDRQkoMHgxKQorI2RlZmluZSBGV19MT0FEX1RSWQkoMFgyKQorCisvKnRoZSBmaXJzdCAyNTYgYnl0ZXMgYXJlIHNpZ25hdHVyZSBkYXRhKi8KKyNkZWZpbmUgU0VDX09GRlNFVAkoMjU2KQorCisjZGVmaW5lIFRSWV9QQVJTRV9NQVgJKDI1NikKKworI2RlZmluZSBQQUNLICgnUCcgPDwgMjQgfCAnQScgPDwgMTYgfCAnQycgPDwgOCB8ICdLJykKKyNkZWZpbmUgQ09ERSAoJ0MnIDw8IDI0IHwgJ08nIDw8IDE2IHwgJ0QnIDw8IDggfCAnRScpCisKKyNpZm5kZWYgRklSTVdBUkVfTUFKT1IKKyNkZWZpbmUgRklSTVdBUkVfTUFKT1IgQU1TVFJFQU1fTUFKT1IKKyNlbmRpZgorCitzdGF0aWMgREVGSU5FX01VVEVYKG11dGV4KTsKKworc3RhdGljICBzdHJ1Y3QgdWNvZGVfZmlsZV9pbmZvX3MgdWNvZGVfaW5mb1tdID0geworI2luY2x1ZGUgImZpcm13YXJlX2NmZy5oIgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZndfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRQorfTsKKworc3RydWN0IGZ3X21ncl9zICpnX21ncjsKK3N0cnVjdCBmd19kZXZfcyAqZ19kZXY7CitzdHJ1Y3QgcGFja2FnZV9oZWFkX3MgcGFja2FnZV9oZWFkOworCitzdGF0aWMgdTMyIGRlYnVnOworc3RhdGljIHUzMiBkZXRhaWw7CisKK2ludCBnZXRfZmlybXdhcmVfZGF0YSh1bnNpZ25lZCBpbnQgZm9ybWF0LCBjaGFyICpidWYpCit7CisJaW50IGRhdGFfbGVuLCByZXQgPSAtMTsKKwlzdHJ1Y3QgZndfbWdyX3MgKm1nciA9IGdfbWdyOworCXN0cnVjdCBmd19pbmZvX3MgKmluZm87CisKKwlwcl9pbmZvKCJbJXNdLCB0aGUgZncgKCVzKSB3aWxsIGJlIGxvYWRlZC4uLlxuIiwKKwkJdGVlX2VuYWJsZWQoKSA/ICJURUUiIDogIkxPQ0FMIiwKKwkJZ2V0X2Z3X2Zvcm1hdF9uYW1lKGZvcm1hdCkpOworCisJaWYgKHRlZV9lbmFibGVkKCkpCisJCXJldHVybiAwOworCisJbXV0ZXhfbG9jaygmbXV0ZXgpOworCisJaWYgKGxpc3RfZW1wdHkoJm1nci0+ZndfaGVhZCkpIHsKKwkJcHJfaW5mbygidGhlIGluZm8gbGlzdCBpcyBlbXB0eS5cbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGluZm8sICZtZ3ItPmZ3X2hlYWQsIG5vZGUpIHsKKwkJaWYgKGZvcm1hdCAhPSBpbmZvLT5mb3JtYXQpCisJCQljb250aW51ZTsKKworCQlkYXRhX2xlbiA9IGluZm8tPmRhdGEtPmhlYWQuZGF0YV9zaXplOworCQltZW1jcHkoYnVmLCBpbmZvLT5kYXRhLT5kYXRhLCBkYXRhX2xlbik7CisJCXJldCA9IGRhdGFfbGVuOworCisJCWJyZWFrOworCX0KKworb3V0OgorCW11dGV4X3VubG9jaygmbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZ2V0X2Zpcm13YXJlX2RhdGEpOworCitpbnQgZ2V0X2RhdGFfZnJvbV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgZGF0YV9sZW4sIHJldCA9IC0xOworCXN0cnVjdCBmd19tZ3JfcyAqbWdyID0gZ19tZ3I7CisJc3RydWN0IGZ3X2luZm9fcyAqaW5mbzsKKwljaGFyICpmd19uYW1lID0gX19nZXRuYW1lKCk7CisJaW50IGxlbjsKKworCWlmIChmd19uYW1lID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJbGVuID0gc25wcmludGYoZndfbmFtZSwgUEFUSF9NQVgsICIlcy5iaW4iLCBuYW1lKTsKKwlpZiAobGVuID49IFBBVEhfTUFYKSB7CisJCV9fcHV0bmFtZShmd19uYW1lKTsKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisJfQorCisJbXV0ZXhfbG9jaygmbXV0ZXgpOworCisJaWYgKGxpc3RfZW1wdHkoJm1nci0+ZndfaGVhZCkpIHsKKwkJcHJfaW5mbygidGhlIGluZm8gbGlzdCBpcyBlbXB0eS5cbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGluZm8sICZtZ3ItPmZ3X2hlYWQsIG5vZGUpIHsKKwkJaWYgKHN0cmNtcChmd19uYW1lLCBpbmZvLT5uYW1lKSkKKwkJCWNvbnRpbnVlOworCisJCWRhdGFfbGVuID0gaW5mby0+ZGF0YS0+aGVhZC5kYXRhX3NpemU7CisJCW1lbWNweShidWYsIGluZm8tPmRhdGEtPmRhdGEsIGRhdGFfbGVuKTsKKwkJcmV0ID0gZGF0YV9sZW47CisKKwkJYnJlYWs7CisJfQorb3V0OgorCW11dGV4X3VubG9jaygmbXV0ZXgpOworCisJX19wdXRuYW1lKGZ3X25hbWUpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZ2V0X2RhdGFfZnJvbV9uYW1lKTsKKworc3RhdGljIGludCBmd19wcm9iZShjaGFyICpidWYpCit7CisJaW50IG1hZ2ljID0gMDsKKworCW1lbWNweSgmbWFnaWMsIGJ1Ziwgc2l6ZW9mKGludCkpOworCXJldHVybiBtYWdpYzsKK30KKworc3RhdGljIGludCByZXF1ZXN0X2Zpcm13YXJlX2Zyb21fc3lzKGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwKKwkJY2hhciAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlpbnQgcmV0ID0gLTE7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwlpbnQgbWFnaWMsIG9mZnNldCA9IDA7CisKKwlwcl9pbmZvKCJUcnkgdG8gbG9hZCAlcyAgLi4uXG4iLCBmaWxlX25hbWUpOworCisJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZpbGVfbmFtZSwgZ19kZXYtPmRldik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfaW5mbygiRXJyb3IgOiAlZCBjYW4ndCBsb2FkIHRoZSAlcy5cbiIsIHJldCwgZmlsZV9uYW1lKTsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKGZ3LT5zaXplID4gc2l6ZSkgeworCQlwcl9pbmZvKCJOb3QgZW5vdWdoIG1lbW9yeSBzaXplIGZvciB1Y29kZS5cbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHJlbGVhc2U7CisJfQorCisJbWFnaWMgPSBmd19wcm9iZSgoY2hhciAqKWZ3LT5kYXRhKTsKKwlpZiAobWFnaWMgIT0gUEFDSyAmJiBtYWdpYyAhPSBDT0RFKSB7CisJCWlmIChmdy0+c2l6ZSA8IFNFQ19PRkZTRVQpIHsKKwkJCXByX2luZm8oIlRoaXMgaXMgYW4gaW52YWxpZCBmaXJtd2FyZSBmaWxlLlxuIik7CisJCQlnb3RvIHJlbGVhc2U7CisJCX0KKworCQltYWdpYyA9IGZ3X3Byb2JlKChjaGFyICopZnctPmRhdGEgKyBTRUNfT0ZGU0VUKTsKKwkJaWYgKG1hZ2ljICE9IFBBQ0spIHsKKwkJCXByX2luZm8oIlRoZSBmaXJtd2FyZSBmaWxlIGlzIG5vdCBwYWNrZXQuXG4iKTsKKwkJCWdvdG8gcmVsZWFzZTsKKwkJfQorCisJCW9mZnNldCA9IFNFQ19PRkZTRVQ7CisJfQorCisJbWVtY3B5KGJ1ZiwgKGNoYXIgKilmdy0+ZGF0YSArIG9mZnNldCwgZnctPnNpemUgLSBvZmZzZXQpOworCisJcHJfaW5mbygibG9hZCBmaXJtd2FyZSBzaXplIDogJXpkLCBOYW1lIDogJXMuXG4iLAorCQlmdy0+c2l6ZSwgZmlsZV9uYW1lKTsKKwlyZXQgPSBmdy0+c2l6ZTsKK3JlbGVhc2U6CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworaW50IHJlcXVlc3RfZGVjb2Rlcl9maXJtd2FyZV9vbl9zeXMoZW51bSB2Zm9ybWF0X2UgZm9ybWF0LAorCWNvbnN0IGNoYXIgKmZpbGVfbmFtZSwgY2hhciAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZ2V0X2RhdGFfZnJvbV9uYW1lKGZpbGVfbmFtZSwgYnVmKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfaW5mbygiR2V0IGZpcm13YXJlIGZhaWwuXG4iKTsKKworCWlmIChyZXQgPiBzaXplKSB7CisJCXByX2luZm8oIk5vdCBlbm91Z2ggbWVtb3J5LlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiByZXQ7Cit9CitpbnQgZ2V0X2RlY29kZXJfZmlybXdhcmVfZGF0YShlbnVtIHZmb3JtYXRfZSBmb3JtYXQsCisJY29uc3QgY2hhciAqZmlsZV9uYW1lLCBjaGFyICpidWYsIGludCBzaXplKQoreworCWludCByZXQ7CisKKwlyZXQgPSByZXF1ZXN0X2RlY29kZXJfZmlybXdhcmVfb25fc3lzKGZvcm1hdCwgZmlsZV9uYW1lLCBidWYsIHNpemUpOworCWlmIChyZXQgPCAwKQorCQlwcl9pbmZvKCJnZXRfZGVjb2Rlcl9maXJtd2FyZV9kYXRhICVzIGZvciBmb3JtYXQgJWQgZmFpbGVkIVxuIiwKKwkJCQlmaWxlX25hbWUsIGZvcm1hdCk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChnZXRfZGVjb2Rlcl9maXJtd2FyZV9kYXRhKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZndfbWdyX2xvY2soc3RydWN0IGZ3X21ncl9zICptZ3IpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtZ3ItPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gZmxhZ3M7Cit9CisKK3N0YXRpYyB2b2lkIGZ3X21ncl91bmxvY2soc3RydWN0IGZ3X21ncl9zICptZ3IsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWdyLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGZ3X2FkZF9pbmZvKHN0cnVjdCBmd19pbmZvX3MgKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZndfbWdyX3MgKm1nciA9IGdfbWdyOworCisJZmxhZ3MgPSBmd19tZ3JfbG9jayhtZ3IpOworCWxpc3RfYWRkKCZpbmZvLT5ub2RlLCAmbWdyLT5md19oZWFkKTsKKwlmd19tZ3JfdW5sb2NrKG1nciwgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBmd19kZWxfaW5mbyhzdHJ1Y3QgZndfaW5mb19zICppbmZvKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGZ3X21ncl9zICptZ3IgPSBnX21ncjsKKworCWZsYWdzID0gZndfbWdyX2xvY2sobWdyKTsKKwlsaXN0X2RlbCgmaW5mby0+bm9kZSk7CisJa2ZyZWUoaW5mbyk7CisJZndfbWdyX3VubG9jayhtZ3IsIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgZndfaW5mb193YWxrKHZvaWQpCit7CisJc3RydWN0IGZ3X21ncl9zICptZ3IgPSBnX21ncjsKKwlzdHJ1Y3QgZndfaW5mb19zICppbmZvOworCisJaWYgKGxpc3RfZW1wdHkoJm1nci0+ZndfaGVhZCkpIHsKKwkJcHJfaW5mbygidGhlIGluZm8gbGlzdCBpcyBlbXB0eS5cbiIpOworCQlyZXR1cm47CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpbmZvLCAmbWdyLT5md19oZWFkLCBub2RlKSB7CisJCWlmIChJU19FUlJfT1JfTlVMTChpbmZvLT5kYXRhKSkKKwkJCWNvbnRpbnVlOworCisJCXByX2luZm8oIm5hbWUgOiAlcy5cbiIsIGluZm8tPm5hbWUpOworCQlwcl9pbmZvKCJ2ZXIgIDogJXMuXG4iLAorCQkJaW5mby0+ZGF0YS0+aGVhZC52ZXJzaW9uKTsKKwkJcHJfaW5mbygiY3JjICA6IDB4JXguXG4iLAorCQkJaW5mby0+ZGF0YS0+aGVhZC5jaGVja3N1bSk7CisJCXByX2luZm8oInNpemUgOiAlZC5cbiIsCisJCQlpbmZvLT5kYXRhLT5oZWFkLmRhdGFfc2l6ZSk7CisJCXByX2luZm8oIm1ha2VyOiAlcy5cbiIsCisJCQlpbmZvLT5kYXRhLT5oZWFkLm1ha2VyKTsKKwkJcHJfaW5mbygiZnJvbSA6ICVzLlxuIiwgaW5mby0+c3JjX2Zyb20pOworCQlwcl9pbmZvKCJkYXRlIDogJXMuXG4iLAorCQkJaW5mby0+ZGF0YS0+aGVhZC5kYXRlKTsKKwkJaWYgKGluZm8tPmRhdGEtPmhlYWQuZHVwbGljYXRlKQorCQkJcHJfaW5mbygiTk9URSA6IER1cCBmcm9tICVzLlxuIiwKKwkJCQlpbmZvLT5kYXRhLT5oZWFkLmR1cF9mcm9tKTsKKwkJcHJfaW5mbygiXG4iKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZ3X2ZpbGVzX2luZm9fd2Fsayh2b2lkKQoreworCXN0cnVjdCBmd19tZ3JfcyAqbWdyID0gZ19tZ3I7CisJc3RydWN0IGZ3X2ZpbGVzX3MgKmZpbGVzOworCisJaWYgKGxpc3RfZW1wdHkoJm1nci0+ZmlsZXNfaGVhZCkpIHsKKwkJcHJfaW5mbygidGhlIGZpbGUgbGlzdCBpcyBlbXB0eS5cbiIpOworCQlyZXR1cm47CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmaWxlcywgJm1nci0+ZmlsZXNfaGVhZCwgbm9kZSkgeworCQlwcl9pbmZvKCJ0eXBlIDogJXMuXG4iLCAhZmlsZXMtPmZ3X3R5cGUgPworCQkJIlZJREVPX0RFQ09ERSIgOiBmaWxlcy0+ZndfdHlwZSA9PSAxID8KKwkJCSJWSURFT19FTkNPREUiIDogIlZJREVPX01JU0MiKTsKKwkJcHJfaW5mbygiZnJvbSA6ICVzLlxuIiwgIWZpbGVzLT5maWxlX3R5cGUgPworCQkJIlZJREVPX1BBQ0tBR0UiIDogIlZJREVPX0ZXX0ZJTEUiKTsKKwkJcHJfaW5mbygicGF0aCA6ICVzLlxuIiwgZmlsZXMtPnBhdGgpOworCQlwcl9pbmZvKCJuYW1lIDogJXMuXG5cbiIsIGZpbGVzLT5uYW1lKTsKKwl9Cit9CisKK3N0YXRpYyBzc2l6ZV90IGluZm9fc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWNoYXIgKnBidWYgPSBidWY7CisJc3RydWN0IGZ3X21ncl9zICptZ3IgPSBnX21ncjsKKwlzdHJ1Y3QgZndfaW5mb19zICppbmZvOworCXVuc2lnbmVkIGludCBzZWNzID0gMDsKKwlzdHJ1Y3QgdG0gdG07CisJY2hhciBoaXN0b3J5X2NoYW5nZV9pZFs3XSA9IHswfTsKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJm11dGV4KTsKKworCWlmIChsaXN0X2VtcHR5KCZtZ3ItPmZ3X2hlYWQpKSB7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiTm8gZmlybXdhcmUuXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogc2hvd3MgdmVyc2lvbiBvZiBkcml2ZXIuICovCisJcHJfaW5mbygiVGhlIHVjb2RlIGRyaXZlciB2ZXJzaW9uIGlzICVzXG4iLCBQQUNLX1ZFUlMpOworCisJcHJfaW5mbygiVGhlIGZpcm13YXJlIHZlcnNpb24gaXMgJWQuJWQuJWQtZyVzXG4iLAorCQkJKHBhY2thZ2VfaGVhZC52ZXJzaW9uID4+IDE2KSAmIDB4ZmYsCisJCQlwYWNrYWdlX2hlYWQudmVyc2lvbiAmIDB4ZmYsCisJCQlwYWNrYWdlX2hlYWQuc3VibWl0X2NvdW50LAorCQkJcGFja2FnZV9oZWFkLmNvbW1pdCk7CisKKwlwcl9pbmZvKCJjaGFuZ2UgaWQgaGlzdG9yeTpcbiIpOworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJbWVtc2V0KGhpc3RvcnlfY2hhbmdlX2lkLCAwLCBzaXplb2YoaGlzdG9yeV9jaGFuZ2VfaWQpKTsKKwkJc3RybmNweShoaXN0b3J5X2NoYW5nZV9pZCwgJihwYWNrYWdlX2hlYWQuaGlzdG9yeV9jaGFuZ2VfaWRbaSAqIDZdKSwgNik7CisJCXByX2luZm8oIlx0JXNcbiIsIGhpc3RvcnlfY2hhbmdlX2lkKTsKKwkJCisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpbmZvLCAmbWdyLT5md19oZWFkLCBub2RlKSB7CisJCWlmIChJU19FUlJfT1JfTlVMTChpbmZvLT5kYXRhKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChkZXRhaWwpIHsKKwkJCXByX2luZm8oIiUtNXM6ICVzXG4iLCAibmFtZSIsIGluZm8tPm5hbWUpOworCQkJcHJfaW5mbygiJS01czogJXNcbiIsICJ2ZXIiLAorCQkJCWluZm8tPmRhdGEtPmhlYWQudmVyc2lvbik7CisJCQlwcl9pbmZvKCIlLTVzOiAweCV4XG4iLCAic3VtIiwKKwkJCQlpbmZvLT5kYXRhLT5oZWFkLmNoZWNrc3VtKTsKKwkJCXByX2luZm8oIiUtNXM6ICVkXG4iLCAic2l6ZSIsCisJCQkJaW5mby0+ZGF0YS0+aGVhZC5kYXRhX3NpemUpOworCQkJcHJfaW5mbygiJS01czogJXNcbiIsICJtYWtlciIsCisJCQkJaW5mby0+ZGF0YS0+aGVhZC5tYWtlcik7CisJCQlwcl9pbmZvKCIlLTVzOiAlc1xuIiwgImZyb20iLAorCQkJCWluZm8tPnNyY19mcm9tKTsKKwkJCXByX2luZm8oIiUtNXM6ICVzXG5cbiIsICJkYXRlIiwKKwkJCQlpbmZvLT5kYXRhLT5oZWFkLmRhdGUpOworCQkJY29udGludWU7CisJCX0KKworCQlzZWNzID0gaW5mby0+ZGF0YS0+aGVhZC50aW1lCisJCQktIHN5c190ei50el9taW51dGVzd2VzdCAqIDYwOworCQkvL3RpbWVfdG9fdG0oc2VjcywgMCwgJnRtKTsvL2tlcm5lbDQuOQorCQl0aW1lNjRfdG9fdG0oc2VjcywgMCwgJnRtKTsKKworCQlwcl9pbmZvKCIlcyAlLTE2cywgJTAyZDolMDJkOiUwMmQgJWQvJWQvJWxkLCAlcyAlLThzLCAlcyAlLThzLCAlcyAlc1xuIiwKKwkJCSJmbXQ6IiwgaW5mby0+ZGF0YS0+aGVhZC5mb3JtYXQsCisJCQl0bS50bV9ob3VyLCB0bS50bV9taW4sIHRtLnRtX3NlYywKKwkJCXRtLnRtX21vbiArIDEsIHRtLnRtX21kYXksIHRtLnRtX3llYXIgKyAxOTAwLAorCQkJImNtdGlkOiIsIGluZm8tPmRhdGEtPmhlYWQuY29tbWl0LAorCQkJImNoZ2lkOiIsIGluZm8tPmRhdGEtPmhlYWQuY2hhbmdlX2lkLAorCQkJIm1rOiIsIGluZm8tPmRhdGEtPmhlYWQubWFrZXIpOworCX0KK291dDoKKwltdXRleF91bmxvY2soJm11dGV4KTsKKworCXJldHVybiBwYnVmIC0gYnVmOworfQorCitzdGF0aWMgc3NpemVfdCBpbmZvX3N0b3JlKHN0cnVjdCBjbGFzcyAqY2xzLAorCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWlmIChrc3RydG9pbnQoYnVmLCAwLCAmZGV0YWlsKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IGZ3X2luZm9fZmlsbCh2b2lkKQoreworCWludCByZXQgPSAwLCBpLCBsZW47CisJc3RydWN0IGZ3X21ncl9zICptZ3IgPSBnX21ncjsKKwlzdHJ1Y3QgZndfZmlsZXNfcyAqZmlsZXM7CisJaW50IGluZm9fc2l6ZSA9IEFSUkFZX1NJWkUodWNvZGVfaW5mbyk7CisJY2hhciAqcGF0aCA9IF9fZ2V0bmFtZSgpOworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwlpZiAocGF0aCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBpbmZvX3NpemU7IGkrKykgeworCQluYW1lID0gdWNvZGVfaW5mb1tpXS5uYW1lOworCQlpZiAoSVNfRVJSX09SX05VTEwobmFtZSkpCisJCQlicmVhazsKKworCQlsZW4gPSBzbnByaW50ZihwYXRoLCBQQVRIX01BWCwgIiVzLyVzIiwgRElSLAorCQkJdWNvZGVfaW5mb1tpXS5uYW1lKTsKKwkJaWYgKGxlbiA+PSBQQVRIX01BWCkKKwkJCWNvbnRpbnVlOworCisJCWZpbGVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZ3X2ZpbGVzX3MpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGZpbGVzID09IE5VTEwpIHsKKwkJCV9fcHV0bmFtZShwYXRoKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJZmlsZXMtPmZpbGVfdHlwZSA9IHVjb2RlX2luZm9baV0uZmlsZV90eXBlOworCQlmaWxlcy0+ZndfdHlwZSA9IHVjb2RlX2luZm9baV0uZndfdHlwZTsKKwkJc3RybmNweShmaWxlcy0+cGF0aCwgcGF0aCwgc2l6ZW9mKGZpbGVzLT5wYXRoKSk7CisJCWZpbGVzLT5wYXRoW3NpemVvZihmaWxlcy0+cGF0aCkgLSAxXSA9ICdcMCc7CisJCXN0cm5jcHkoZmlsZXMtPm5hbWUsIG5hbWUsIHNpemVvZihmaWxlcy0+bmFtZSkpOworCQlmaWxlcy0+bmFtZVtzaXplb2YoZmlsZXMtPm5hbWUpIC0gMV0gPSAnXDAnOworCisJCWxpc3RfYWRkKCZmaWxlcy0+bm9kZSwgJm1nci0+ZmlsZXNfaGVhZCk7CisJfQorCisJX19wdXRuYW1lKHBhdGgpOworCisJaWYgKGRlYnVnKQorCQlmd19maWxlc19pbmZvX3dhbGsoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZndfZGF0YV9jaGVja19zdW0oc3RydWN0IGZpcm13YXJlX3MgKmZ3KQoreworCXVuc2lnbmVkIGludCBjcmM7CisKKwljcmMgPSBjcmMzMl9sZSh+MFUsIGZ3LT5kYXRhLCBmdy0+aGVhZC5kYXRhX3NpemUpOworCisJLypwcl9pbmZvKCJmaXJtd2FyZSBjcmMgcmVzdWx0IDogMHgleFxuIiwgY3JjIF4gfjBVKTsqLworCisJcmV0dXJuIGZ3LT5oZWFkLmNoZWNrc3VtICE9IChjcmMgXiB+MFUpID8gMCA6IDE7Cit9CisKK3N0YXRpYyBpbnQgZndfZGF0YV9maWx0ZXIoc3RydWN0IGZpcm13YXJlX3MgKmZ3LAorCXN0cnVjdCBmd19pbmZvX3MgKmZ3X2luZm8pCit7CisJc3RydWN0IGZ3X21ncl9zICptZ3IgPSBnX21ncjsKKwlzdHJ1Y3QgZndfaW5mb19zICppbmZvLCAqdG1wOworCWludCBjcHUgPSBmd19nZXRfY3B1KGZ3LT5oZWFkLmNwdSk7CisKKwlpZiAobWdyLT5jdXJfY3B1IDwgY3B1KSB7CisJCWtmcmVlKGZ3X2luZm8pOworCQlrZnJlZShmdyk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiB0aGUgZW5jb2RlIGZ3IG5lZWQgdG8gaWdub3JpbmcgZmlsdGVyaW5nIHJ1bGVzLiAqLworCWlmIChmd19pbmZvLT5mb3JtYXQgPT0gRklSTVdBUkVfTUFYKQorCQlyZXR1cm4gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpbmZvLCB0bXAsICZtZ3ItPmZ3X2hlYWQsIG5vZGUpIHsKKwkJaWYgKGluZm8tPmZvcm1hdCAhPSBmd19pbmZvLT5mb3JtYXQpCisJCQljb250aW51ZTsKKworCQlpZiAoSVNfRVJSX09SX05VTEwoaW5mby0+ZGF0YSkpIHsKKwkJCWZ3X2RlbF9pbmZvKGluZm8pOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBoaWdoIHByaW9yaXR5IG9mIFZJREVPX0ZXX0ZJTEUgKi8KKwkJaWYgKGluZm8tPmZpbGVfdHlwZSA9PSBWSURFT19GV19GSUxFKSB7CisJCQlwcl9pbmZvKCJ0aGUgJXMgbmVlZCB0byBwcmlvcml0eSBwcm9jLlxuIixpbmZvLT5uYW1lKTsKKwkJCWtmcmVlKGZ3X2luZm8pOworCQkJa2ZyZWUoZncpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQkvKiB0aGUgY3B1IHZlciBpcyBsb3dlciBhbmQgbmVlZHMgdG8gYmUgZmlsdGVyZWQgKi8KKwkJaWYgKGNwdSA8IGZ3X2dldF9jcHUoaW5mby0+ZGF0YS0+aGVhZC5jcHUpKSB7CisJCQlpZiAoZGVidWcpCisJCQkJcHJfaW5mbygia2VlcCB0aGUgbmV3ZXIgZncgKCVzKSBhbmQgaWdub3JlIHRoZSBvbGRlciBmdyAoJXMpLlxuIiwKKwkJCQkJaW5mby0+bmFtZSwgZndfaW5mby0+bmFtZSk7CisJCQlrZnJlZShmd19pbmZvKTsKKwkJCWtmcmVlKGZ3KTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJLyogcmVtb3ZlcyBub3QgbWF0Y2ggZncgZnJvbSBpbmZvIGxpc3QgKi8KKwkJaWYgKGRlYnVnKQorCQkJcHJfaW5mbygiZHJvcCB0aGUgb2xkIGZ3ICglcykgd2lsbCBiZSBsb2FkIHRoZSBuZXdlciBmdyAoJXMpLlxuIiwKKwkJCQkJaW5mby0+bmFtZSwgZndfaW5mby0+bmFtZSk7CisJCWtmcmVlKGluZm8tPmRhdGEpOworCQlmd19kZWxfaW5mbyhpbmZvKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmd19yZXBsYWNlX2R1cF9kYXRhKGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgZndfbWdyX3MgKm1nciA9IGdfbWdyOworCXN0cnVjdCBwYWNrYWdlX3MgKnBrZyA9CisJCShzdHJ1Y3QgcGFja2FnZV9zICopIGJ1ZjsKKwlzdHJ1Y3QgcGFja2FnZV9pbmZvX3MgKnBpbmZvID0KKwkJKHN0cnVjdCBwYWNrYWdlX2luZm9fcyAqKSBwa2ctPmRhdGE7CisJc3RydWN0IGZ3X2luZm9fcyAqaW5mbyA9IE5VTEw7CisJY2hhciAqcGRhdGEgPSBwa2ctPmRhdGE7CisJaW50IHRyeV9jbnQgPSBUUllfUEFSU0VfTUFYOworCisJZG8geworCQlpZiAoIXBpbmZvLT5oZWFkLmxlbmd0aCkKKwkJCWJyZWFrOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGluZm8sICZtZ3ItPmZ3X2hlYWQsIG5vZGUpIHsKKwkJCXN0cnVjdCBmaXJtd2FyZV9zICpjb21wID0gTlVMTDsKKwkJCXN0cnVjdCBmaXJtd2FyZV9zICpkYXRhID0gTlVMTDsKKwkJCWludCBsZW4gPSAwOworCisJCQljb21wID0gKHN0cnVjdCBmaXJtd2FyZV9zICopcGluZm8tPmRhdGE7CisJCQlpZiAoY29tcC0+aGVhZC5kdXBsaWNhdGUpCisJCQkJYnJlYWs7CisKKwkJCWlmICghaW5mby0+ZGF0YS0+aGVhZC5kdXBsaWNhdGUgfHwKKwkJCQljb21wLT5oZWFkLmNoZWNrc3VtICE9CisJCQkJaW5mby0+ZGF0YS0+aGVhZC5jaGVja3N1bSkKKwkJCQljb250aW51ZTsKKworCQkJbGVuID0gcGluZm8tPmhlYWQubGVuZ3RoOworCQkJZGF0YSA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwkJCWlmIChkYXRhID09IE5VTEwpIHsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQltZW1jcHkoZGF0YSwgcGluZm8tPmRhdGEsIGxlbik7CisKKwkJCS8qIHVwZGF0ZSBoZWFkZXIgaW5mb3JtYXRpb24uICovCisJCQltZW1jcHkoZGF0YSwgaW5mby0+ZGF0YSwgc2l6ZW9mKCpkYXRhKSk7CisKKwkJCS8qIGlmIHJlcGxhY2VkIHN1Y2Nlc3MgbmVlZCB0byB1cGRhdGUgcmVhbCBzaXplLiAqLworCQkJZGF0YS0+aGVhZC5kYXRhX3NpemUgPSBjb21wLT5oZWFkLmRhdGFfc2l6ZTsKKworCQkJa2ZyZWUoaW5mby0+ZGF0YSk7CisJCQlpbmZvLT5kYXRhID0gZGF0YTsKKwkJfQorCQlwZGF0YSArPSAocGluZm8tPmhlYWQubGVuZ3RoICsgc2l6ZW9mKCpwaW5mbykpOworCQlwaW5mbyA9IChzdHJ1Y3QgcGFja2FnZV9pbmZvX3MgKilwZGF0YTsKKwl9IHdoaWxlICh0cnlfY250LS0pOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZndfY2hlY2tfcGFja192ZXJzaW9uKGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcGFja2FnZV9zICpwYWNrID0gTlVMTDsKKwlpbnQgbWFqb3IsIG1pbm9yLCBtYWpvcl9mdywgbWlub3JfZnc7CisJaW50IHJldDsKKworCXBhY2sgPSAoc3RydWN0IHBhY2thZ2VfcyAqKSBidWY7CisJcmV0ID0gc3NjYW5mKFBBQ0tfVkVSUywgInYleC4leCIsICZtYWpvciwgJm1pbm9yKTsKKwlpZiAocmV0ICE9IDIpCisJCXJldHVybiAtMTsKKworCXBhY2thZ2VfaGVhZCA9IHBhY2stPmhlYWQ7CisJbWFqb3JfZncgPSAocGFjay0+aGVhZC52ZXJzaW9uID4+IDE2KSAmIDB4ZmY7CisJbWlub3JfZncgPSBwYWNrLT5oZWFkLnZlcnNpb24gJiAweGZmOworCisJaWYgKG1ham9yIDwgbWFqb3JfZncpIHsKKwkJcHJfaW5mbygidGhlIHBhY2sgdmVyIHYlZC4lZCB0b28gaGlnaGVyIHRvIHVuc3VwcG9ydC5cbiIsCisJCQltYWpvcl9mdywgbWlub3JfZncpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKG1pbm9yIDwgbWlub3JfZncpIHsKKwkJcHJfaW5mbygiVGhlIGZ3IGRyaXZlciB2ZXJzaW9uICh2JWQuJWQpIGlzIGxvd2VyIHRoYW4gdGhlIHBrZyB2ZXJzaW9uICh2JWQuJWQpLlxuIiwKKwkJCW1ham9yLCBtaW5vciwgbWFqb3JfZncsIG1pbm9yX2Z3KTsKKwkJcHJfaW5mbygiVGhlIGRyaXZlciB2ZXJzaW9uIGlzIHRvbyBsb3cgdGhhdCBtYXkgYWZmZWN0IHRoZSB3b3JrIHBsZWFzZSB1cGRhdGUgYXNhcC5cbiIpOworCX0KKworCWlmIChkZWJ1ZykgeworCQlwcl9pbmZvKCJUaGUgcGFja2FnZSBoYXMgJWQgZndzIHRvdGFsbHkuXG4iLCBwYWNrLT5oZWFkLnRvdGFsKTsKKwkJcHJfaW5mbygiVGhlIGRyaXZlciB2ZXIgaXMgdiVkLiVkXG4iLCBtYWpvciwgbWlub3IpOworCQlwcl9pbmZvKCJUaGUgZmlybXdhcmUgdmVyIGlzIHYlZC4lZC4lZFxuIiwgbWFqb3JfZncsIG1pbm9yX2Z3LCBwYWNrLT5oZWFkLnN1Ym1pdF9jb3VudCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZndfcGFja2FnZV9wYXJzZShzdHJ1Y3QgZndfZmlsZXNfcyAqZmlsZXMsCisJY2hhciAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgcGFja2FnZV9pbmZvX3MgKnBhY2tfaW5mbzsKKwlzdHJ1Y3QgZndfaW5mb19zICppbmZvOworCXN0cnVjdCBmaXJtd2FyZV9zICpkYXRhOworCWNoYXIgKnBhY2tfZGF0YTsKKwlpbnQgaW5mb19sZW4sIGxlbjsKKwlpbnQgdHJ5X2NudCA9IFRSWV9QQVJTRV9NQVg7CisJY2hhciAqcGF0aCA9IF9fZ2V0bmFtZSgpOworCisJaWYgKHBhdGggPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwYWNrX2RhdGEgPSAoKHN0cnVjdCBwYWNrYWdlX3MgKilidWYpLT5kYXRhOworCXBhY2tfaW5mbyA9IChzdHJ1Y3QgcGFja2FnZV9pbmZvX3MgKilwYWNrX2RhdGE7CisJaW5mb19sZW4gPSBzaXplb2Yoc3RydWN0IHBhY2thZ2VfaW5mb19zKTsKKworCWRvIHsKKwkJaWYgKCFwYWNrX2luZm8tPmhlYWQubGVuZ3RoKQorCQkJYnJlYWs7CisKKwkJbGVuID0gc25wcmludGYocGF0aCwgUEFUSF9NQVgsICIlcy8lcyIsIERJUiwKKwkJCXBhY2tfaW5mby0+aGVhZC5uYW1lKTsKKwkJaWYgKGxlbiA+PSBQQVRIX01BWCkKKwkJCWNvbnRpbnVlOworCisJCWluZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZndfaW5mb19zKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChpbmZvID09IE5VTEwpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWRhdGEgPSBremFsbG9jKEZSSU1XQVJFX1NJWkUsIEdGUF9LRVJORUwpOworCQlpZiAoZGF0YSA9PSBOVUxMKSB7CisJCQlrZnJlZShpbmZvKTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWluZm8tPmZpbGVfdHlwZSA9IGZpbGVzLT5maWxlX3R5cGU7CisJCXN0cm5jcHkoaW5mby0+c3JjX2Zyb20sIGZpbGVzLT5uYW1lLAorCQkJc2l6ZW9mKGluZm8tPnNyY19mcm9tKSk7CisJCWluZm8tPnNyY19mcm9tW3NpemVvZihpbmZvLT5zcmNfZnJvbSkgLSAxXSA9ICdcMCc7CisJCXN0cm5jcHkoaW5mby0+bmFtZSwgcGFja19pbmZvLT5oZWFkLm5hbWUsCisJCQlzaXplb2YoaW5mby0+bmFtZSkpOworCQlpbmZvLT5uYW1lW3NpemVvZihpbmZvLT5uYW1lKSAtIDFdID0gJ1wwJzsKKwkJaW5mby0+Zm9ybWF0ID0gZ2V0X2Z3X2Zvcm1hdChwYWNrX2luZm8tPmhlYWQuZm9ybWF0KTsKKworCQlsZW4gPSBwYWNrX2luZm8tPmhlYWQubGVuZ3RoOworCQltZW1jcHkoZGF0YSwgcGFja19pbmZvLT5kYXRhLCBsZW4pOworCisJCXBhY2tfZGF0YSArPSAocGFja19pbmZvLT5oZWFkLmxlbmd0aCArIGluZm9fbGVuKTsKKwkJcGFja19pbmZvID0gKHN0cnVjdCBwYWNrYWdlX2luZm9fcyAqKXBhY2tfZGF0YTsKKworCQlpZiAoIWRhdGEtPmhlYWQuZHVwbGljYXRlICYmCisJCQkhZndfZGF0YV9jaGVja19zdW0oZGF0YSkpIHsKKwkJCXByX2luZm8oImNoZWNrIHN1bSBmYWlsICFcbiIpOworCQkJa2ZyZWUoZGF0YSk7CisJCQlrZnJlZShpbmZvKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGZ3X2RhdGFfZmlsdGVyKGRhdGEsIGluZm8pKQorCQkJY29udGludWU7CisKKwkJaWYgKGRlYnVnKQorCQkJcHJfaW5mbygiYWRkcyAlcyB0byB0aGUgZncgbGlzdC5cbiIsIGluZm8tPm5hbWUpOworCisJCWluZm8tPmRhdGEgPSBkYXRhOworCQlmd19hZGRfaW5mbyhpbmZvKTsKKwl9IHdoaWxlICh0cnlfY250LS0pOworCisJLyogcHJvY2VzcyB0aGUgZncgb2YgZHVwIGF0dHJpYnV0ZS4gKi8KKwlyZXQgPSBmd19yZXBsYWNlX2R1cF9kYXRhKGJ1Zik7CisJaWYgKHJldCkKKwkJcHJfZXJyKCJyZXBsYWNlIGR1cCBmdyBmYWlsZWQuXG4iKTsKK291dDoKKwlfX3B1dG5hbWUocGF0aCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZ3X2NvZGVfcGFyc2Uoc3RydWN0IGZ3X2ZpbGVzX3MgKmZpbGVzLAorCWNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisJc3RydWN0IGZ3X2luZm9fcyAqaW5mbzsKKworCWluZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZndfaW5mb19zKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGluZm8gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbmZvLT5kYXRhID0ga3phbGxvYyhGUklNV0FSRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoaW5mby0+ZGF0YSA9PSBOVUxMKSB7CisJCWtmcmVlKGluZm8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpbmZvLT5maWxlX3R5cGUgPSBmaWxlcy0+ZmlsZV90eXBlOworCXN0cm5jcHkoaW5mby0+c3JjX2Zyb20sIGZpbGVzLT5uYW1lLAorCQlzaXplb2YoaW5mby0+c3JjX2Zyb20pKTsKKwlpbmZvLT5zcmNfZnJvbVtzaXplb2YoaW5mby0+c3JjX2Zyb20pIC0gMV0gPSAnXDAnOworCW1lbWNweShpbmZvLT5kYXRhLCBidWYsIHNpemUpOworCisJaWYgKCFmd19kYXRhX2NoZWNrX3N1bShpbmZvLT5kYXRhKSkgeworCQlwcl9pbmZvKCJjaGVjayBzdW0gZmFpbCAhXG4iKTsKKwkJa2ZyZWUoaW5mby0+ZGF0YSk7CisJCWtmcmVlKGluZm8pOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGRlYnVnKQorCQlwcl9pbmZvKCJhZGRzICVzIHRvIHRoZSBmdyBsaXN0LlxuIiwgaW5mby0+bmFtZSk7CisKKwlmd19hZGRfaW5mbyhpbmZvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9maXJtd2FyZV9mcm9tX3N5cyhjb25zdCBjaGFyICpwYXRoLAorCWNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisJaW50IGxlbiA9IDA7CisKKwlsZW4gPSByZXF1ZXN0X2Zpcm13YXJlX2Zyb21fc3lzKHBhdGgsIGJ1Ziwgc2l6ZSk7CisJaWYgKGxlbiA8IDApCisJCXByX2luZm8oImdldCBkYXRhIGZyb20gZnN5cyBmYWlsLlxuIik7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGZ3X2RhdGFfYmluZGluZyh2b2lkKQoreworCWludCByZXQgPSAwLCBtYWdpYyA9IDA7CisJc3RydWN0IGZ3X21ncl9zICptZ3IgPSBnX21ncjsKKwlzdHJ1Y3QgZndfZmlsZXNfcyAqZmlsZXMsICp0bXA7CisJY2hhciAqYnVmID0gTlVMTDsKKwlpbnQgc2l6ZTsKKworCWlmIChsaXN0X2VtcHR5KCZtZ3ItPmZpbGVzX2hlYWQpKSB7CisJCXByX2luZm8oInRoZSBmaWxlIGxpc3QgaXMgZW1wdHkuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJYnVmID0gdm1hbGxvYyhCVUZGX1NJWkUpOworCWlmIChJU19FUlJfT1JfTlVMTChidWYpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChidWYsIDAsIEJVRkZfU0laRSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmlsZXMsIHRtcCwgJm1nci0+ZmlsZXNfaGVhZCwgbm9kZSkgeworCQlzaXplID0gZ2V0X2Zpcm13YXJlX2Zyb21fc3lzKGZpbGVzLT5wYXRoLCBidWYsIEJVRkZfU0laRSk7CisJCW1hZ2ljID0gZndfcHJvYmUoYnVmKTsKKworCQlpZiAoZmlsZXMtPmZpbGVfdHlwZSA9PSBWSURFT19QQUNLQUdFICYmIG1hZ2ljID09IFBBQ0spIHsKKwkJCWlmICghZndfY2hlY2tfcGFja192ZXJzaW9uKGJ1ZikpCisJCQkJcmV0ID0gZndfcGFja2FnZV9wYXJzZShmaWxlcywgYnVmLCBzaXplKTsKKwkJfSBlbHNlIGlmIChmaWxlcy0+ZmlsZV90eXBlID09IFZJREVPX0ZXX0ZJTEUgJiYgbWFnaWMgPT0gQ09ERSkgeworCQkJcmV0ID0gZndfY29kZV9wYXJzZShmaWxlcywgYnVmLCBzaXplKTsKKwkJfSBlbHNlIHsKKwkJCWxpc3RfZGVsKCZmaWxlcy0+bm9kZSk7CisJCQlrZnJlZShmaWxlcyk7CisJCQlwcl9pbmZvKCJpbnZhaWxkIGZpbGUgdHlwZS5cbiIpOworCQl9CisKKwkJbWVtc2V0KGJ1ZiwgMCwgQlVGRl9TSVpFKTsKKwl9CisKKwlpZiAoZGVidWcpCisJCWZ3X2luZm9fd2FsaygpOworCisJdmZyZWUoYnVmKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZndfcHJlX2xvYWQodm9pZCkKK3sKKwlpZiAoZndfaW5mb19maWxsKCkgPCAwKSB7CisJCXByX2luZm8oIkdldCBwYXRoIGZhaWwuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChmd19kYXRhX2JpbmRpbmcoKSA8IDApIHsKKwkJcHJfaW5mbygiU2V0IGRhdGEgZmFpbC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZndfbWdyX2luaXQodm9pZCkKK3sKKwlnX21nciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmd19tZ3JfcyksIEdGUF9LRVJORUwpOworCWlmIChJU19FUlJfT1JfTlVMTChnX21ncikpCisJCXJldHVybiAtRU5PTUVNOworCisJZ19tZ3ItPmN1cl9jcHUgPSBnZXRfY3B1X21ham9yX2lkKCk7CisJSU5JVF9MSVNUX0hFQUQoJmdfbWdyLT5maWxlc19oZWFkKTsKKwlJTklUX0xJU1RfSEVBRCgmZ19tZ3ItPmZ3X2hlYWQpOworCXNwaW5fbG9ja19pbml0KCZnX21nci0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZndfY3R4X2NsZWFuKHZvaWQpCit7CisJc3RydWN0IGZ3X21ncl9zICptZ3IgPSBnX21ncjsKKwlzdHJ1Y3QgZndfZmlsZXNfcyAqZmlsZXM7CisJc3RydWN0IGZ3X2luZm9fcyAqaW5mbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZmxhZ3MgPSBmd19tZ3JfbG9jayhtZ3IpOworCXdoaWxlICghbGlzdF9lbXB0eSgmbWdyLT5maWxlc19oZWFkKSkgeworCQlmaWxlcyA9IGxpc3RfZW50cnkobWdyLT5maWxlc19oZWFkLm5leHQsCisJCQlzdHJ1Y3QgZndfZmlsZXNfcywgbm9kZSk7CisJCWxpc3RfZGVsKCZmaWxlcy0+bm9kZSk7CisJCWtmcmVlKGZpbGVzKTsKKwl9CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJm1nci0+ZndfaGVhZCkpIHsKKwkJaW5mbyA9IGxpc3RfZW50cnkobWdyLT5md19oZWFkLm5leHQsCisJCQlzdHJ1Y3QgZndfaW5mb19zLCBub2RlKTsKKwkJbGlzdF9kZWwoJmluZm8tPm5vZGUpOworCQlrZnJlZShpbmZvLT5kYXRhKTsKKwkJa2ZyZWUoaW5mbyk7CisJfQorCWZ3X21ncl91bmxvY2sobWdyLCBmbGFncyk7Cit9CisKK2ludCB2aWRlb19md19yZWxvYWQoaW50IG1vZGUpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGZ3X21ncl9zICptZ3IgPSBnX21ncjsKKworCWlmICh0ZWVfZW5hYmxlZCgpKQorCQlyZXR1cm4gMDsKKworCW11dGV4X2xvY2soJm11dGV4KTsKKworCWlmIChtb2RlICYgRldfTE9BRF9GT1JDRSkgeworCQlmd19jdHhfY2xlYW4oKTsKKworCQlyZXQgPSBmd19wcmVfbG9hZCgpOworCQlpZiAocmV0IDwgMCkKKwkJCXByX2VycigiVGhlIGZ3IHJlbG9hZCBmYWlsLlxuIik7CisJfSBlbHNlIGlmIChtb2RlICYgRldfTE9BRF9UUlkpIHsKKwkJaWYgKCFsaXN0X2VtcHR5KCZtZ3ItPmZ3X2hlYWQpKSB7CisJCQlwcl9pbmZvKCJUaGUgZncgaGFzIGJlZW4gbG9hZGVkLlxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXJldCA9IGZ3X3ByZV9sb2FkKCk7CisJCWlmIChyZXQgPCAwKQorCQkJcHJfZXJyKCJUaGUgZncgdHJ5IHRvIHJlbG9hZCBmYWlsLlxuIik7CisJfQorb3V0OgorCW11dGV4X3VubG9jaygmbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wodmlkZW9fZndfcmVsb2FkKTsKKworc3RhdGljIHNzaXplX3QgcmVsb2FkX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKKwkJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwljaGFyICpwYnVmID0gYnVmOworCisJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJUaGUgZncgcmVsb2FkIHVzYWdlLlxuIik7CisJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICI+IHNldCAxIG1lYW5zIHRoYXQgdGhlIGZ3IGlzIGZvcmNlZCB0byB1cGRhdGVcbiIpOworCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiPiBzZXQgMiBtZWFucyB0aGF0IHRoZSBmdyBpcyB0cnkgdG8gcmVsb2FkXG4iKTsKKworCXJldHVybiBwYnVmIC0gYnVmOworfQorCitzdGF0aWMgc3NpemVfdCByZWxvYWRfc3RvcmUoc3RydWN0IGNsYXNzICpjbGFzcywKKwkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgcmV0ID0gLTE7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXJldCA9IGtzdHJ0b2ludChidWYsIDAsICZ2YWwpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSB2aWRlb19md19yZWxvYWQodmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfZXJyKCJmdyByZWxvYWQgZmFpbC5cbiIpOworCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRlYnVnX3Nob3coc3RydWN0IGNsYXNzICpjbHMsCisJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV4XG4iLCBkZWJ1Zyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRlYnVnX3N0b3JlKHN0cnVjdCBjbGFzcyAqY2xzLAorCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWlmIChrc3RydG9pbnQoYnVmLCAwLCAmZGVidWcpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNpZiAwIC8va2VybmVsNC45CitzdGF0aWMgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSBmd19jbGFzc19hdHRyc1tdID0geworCV9fQVRUUihpbmZvLCAwNjY0LCBpbmZvX3Nob3csIGluZm9fc3RvcmUpLAorCV9fQVRUUihyZWxvYWQsIDA2NjQsIHJlbG9hZF9zaG93LCByZWxvYWRfc3RvcmUpLAorCV9fQVRUUihkZWJ1ZywgMDY2NCwgZGVidWdfc2hvdywgZGVidWdfc3RvcmUpLAorCV9fQVRUUl9OVUxMCit9OworCitzdGF0aWMgc3RydWN0IGNsYXNzIGZ3X2NsYXNzID0geworCS5uYW1lID0gQ0xBU1NfTkFNRSwKKwkuY2xhc3NfYXR0cnMgPSBmd19jbGFzc19hdHRycywKK307CisjZWxzZSAvL2JlbG93IGlzIGZvciBrZXJuZWwgNC4xOSBhbmQgNS40CitzdGF0aWMgQ0xBU1NfQVRUUl9SVyhpbmZvKTsKK3N0YXRpYyBDTEFTU19BVFRSX1JXKHJlbG9hZCk7CitzdGF0aWMgQ0xBU1NfQVRUUl9SVyhkZWJ1Zyk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpmd19jbGFzc19hdHRyc1tdID0geworCSZjbGFzc19hdHRyX2luZm8uYXR0ciwKKwkmY2xhc3NfYXR0cl9yZWxvYWQuYXR0ciwKKwkmY2xhc3NfYXR0cl9kZWJ1Zy5hdHRyLAorCU5VTEwKK307CisKK0FUVFJJQlVURV9HUk9VUFMoZndfY2xhc3MpOworCitzdGF0aWMgc3RydWN0IGNsYXNzIGZ3X2NsYXNzID0geworCS5uYW1lID0gQ0xBU1NfTkFNRSwKKwkuY2xhc3NfZ3JvdXBzID0gZndfY2xhc3NfZ3JvdXBzLAorfTsKKworI2VuZGlmCitzdGF0aWMgaW50IGZ3X2RyaXZlcl9pbml0KHZvaWQpCit7CisJaW50IHJldCA9IC0xOworCisJZ19kZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZndfZGV2X3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZ19kZXYpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWdfZGV2LT5kZXZfbm8gPSBNS0RFVihGSVJNV0FSRV9NQUpPUiwgMTAwKTsKKworCXJldCA9IHJlZ2lzdGVyX2NocmRldl9yZWdpb24oZ19kZXYtPmRldl9ubywgMSwgREVWX05BTUUpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2luZm8oIkNhbid0IGdldCBtYWpvciBudW1iZXIgJWQuXG4iLCBGSVJNV0FSRV9NQUpPUik7CisJCWdvdG8gZXJyOworCX0KKworCWNkZXZfaW5pdCgmZ19kZXYtPmNkZXYsICZmd19mb3BzKTsKKwlnX2Rldi0+Y2Rldi5vd25lciA9IFRISVNfTU9EVUxFOworCisJcmV0ID0gY2Rldl9hZGQoJmdfZGV2LT5jZGV2LCBnX2Rldi0+ZGV2X25vLCAxKTsKKwlpZiAocmV0KSB7CisJCXByX2luZm8oIkVycm9yICVkIGFkZGluZyBjZGV2IGZhaWwuXG4iLCByZXQpOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXQgPSBjbGFzc19yZWdpc3RlcigmZndfY2xhc3MpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2luZm8oIkZhaWxlZCBpbiBjcmVhdGluZyBjbGFzcy5cbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlnX2Rldi0+ZGV2ID0gZGV2aWNlX2NyZWF0ZSgmZndfY2xhc3MsIE5VTEwsCisJCWdfZGV2LT5kZXZfbm8sIE5VTEwsIERFVl9OQU1FKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZ19kZXYtPmRldikpIHsKKwkJcHJfaW5mbygiQ3JlYXRlIGRldmljZSBmYWlsZWQuXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CisJfQorCisJcHJfaW5mbygiUmVnaXN0ZXJlZCBmaXJtd2FyZSBkcml2ZXIgc3VjY2Vzcy5cbiIpOworZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGZ3X2RyaXZlcl9leGl0KHZvaWQpCit7CisJY2Rldl9kZWwoJmdfZGV2LT5jZGV2KTsKKwlkZXZpY2VfZGVzdHJveSgmZndfY2xhc3MsIGdfZGV2LT5kZXZfbm8pOworCWNsYXNzX3VucmVnaXN0ZXIoJmZ3X2NsYXNzKTsKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oZ19kZXYtPmRldl9ubywgMSk7CisJa2ZyZWUoZ19kZXYpOworCWtmcmVlKGdfbWdyKTsKK30KKworc3RhdGljIGludCBfX2luaXQgZndfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gLTE7CisKKwlyZXQgPSBmd19kcml2ZXJfaW5pdCgpOworCWlmIChyZXQpIHsKKwkJcHJfaW5mbygiRXJyb3IgJWQgZmlybXdhcmUgZHJpdmVyIGluaXQgZmFpbC5cbiIsIHJldCk7CisJCWdvdG8gZXJyOworCX0KKworCXJldCA9IGZ3X21ncl9pbml0KCk7CisJaWYgKHJldCkgeworCQlwcl9pbmZvKCJFcnJvciAlZCBmaXJtd2FyZSBtZ3IgaW5pdCBmYWlsLlxuIiwgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gZndfcHJlX2xvYWQoKTsKKwlpZiAocmV0KSB7CisJCXByX2luZm8oIkVycm9yICVkIGZpcm13YXJlIHByZSBsb2FkIGZhaWwuXG4iLCByZXQpOworCQlnb3RvIGVycjsKKwl9CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZ3X21vZHVsZV9leGl0KHZvaWQpCit7CisJZndfY3R4X2NsZWFuKCk7CisJZndfZHJpdmVyX2V4aXQoKTsKKwlwcl9pbmZvKCJGaXJtd2FyZSBkcml2ZXIgY2xlYW5lZCB1cC5cbiIpOworfQorCittb2R1bGVfaW5pdChmd19tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChmd19tb2R1bGVfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIk5hbnhpbiBRaW4gPG5hbnhpbi5xaW5AYW1sb2dpYy5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NvbW1vbi9maXJtd2FyZS9maXJtd2FyZV9wcml2LmggYi9kcml2ZXJzL2NvbW1vbi9maXJtd2FyZS9maXJtd2FyZV9wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkwMWY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY29tbW9uL2Zpcm13YXJlL2Zpcm13YXJlX3ByaXYuaApAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9tZWRpYS9jb21tb24vZmlybXdhcmUvZmlybXdhcmUuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyovCisKKyNpZm5kZWYgX19WSURFT19GSVJNV0FSRV9QUklWX0hFQURfCisjZGVmaW5lIF9fVklERU9fRklSTVdBUkVfUFJJVl9IRUFEXworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlICJmaXJtd2FyZV90eXBlLmgiCisKK3N0cnVjdCBmd19tZ3JfcyB7CisJc3RydWN0IGxpc3RfaGVhZCBmd19oZWFkOworCXN0cnVjdCBsaXN0X2hlYWQgZmlsZXNfaGVhZDsKKwlzcGlubG9ja190IGxvY2s7CisJaW50IGN1cl9jcHU7Cit9OworCitzdHJ1Y3QgZndfZmlsZXNfcyB7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCWludCBmd190eXBlOworCWludCBmaWxlX3R5cGU7CisJY2hhciBuYW1lWzMyXTsKKwljaGFyIHBhdGhbNjRdOworfTsKKworc3RydWN0IHVjb2RlX2ZpbGVfaW5mb19zIHsKKwlpbnQgZndfdHlwZTsKKwlpbnQgZmlsZV90eXBlOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCitzdHJ1Y3QgZndfaW5mb19zIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisJY2hhciBuYW1lWzMyXTsKKwljaGFyIHNyY19mcm9tWzMyXTsKKwlpbnQgZmlsZV90eXBlOworCXVuc2lnbmVkIGludCBmb3JtYXQ7CisJc3RydWN0IGZpcm13YXJlX3MgKmRhdGE7Cit9OworCitzdHJ1Y3QgZndfaGVhZF9zIHsKKwlpbnQgbWFnaWM7CisJaW50IGNoZWNrc3VtOworCWNoYXIgbmFtZVszMl07CisJY2hhciBjcHVbMTZdOworCWNoYXIgZm9ybWF0WzMyXTsKKwljaGFyIHZlcnNpb25bMzJdOworCWNoYXIgbWFrZXJbMzJdOworCWNoYXIgZGF0ZVszMl07CisJY2hhciBjb21taXRbMTZdOworCWludCBkYXRhX3NpemU7CisJdW5zaWduZWQgaW50IHRpbWU7CisJY2hhciBjaGFuZ2VfaWRbMTZdOworCWludCBkdXBsaWNhdGU7CisJY2hhciBkdXBfZnJvbVsxNl07CisJY2hhciByZXNlcnZlZFs5Ml07Cit9OworCitzdHJ1Y3QgZmlybXdhcmVfcyB7CisJdW5pb24geworCQlzdHJ1Y3QgZndfaGVhZF9zIGhlYWQ7CisJCWNoYXIgYnVmWzUxMl07CisJfTsKKwljaGFyIGRhdGFbMF07Cit9OworCitzdHJ1Y3QgcGFja2FnZV9oZWFkX3MgeworCWludCBtYWdpYzsKKwlpbnQgc2l6ZTsKKwlpbnQgY2hlY2tzdW07CisJaW50IHRvdGFsOworCWludCB2ZXJzaW9uOworCWludCBzdWJtaXRfY291bnQ7CisJY2hhciBjaGFuZ2VfaWRbMTZdOworCWNoYXIgY29tbWl0WzE2XTsKKwljaGFyIGhpc3RvcnlfY2hhbmdlX2lkWzMwXTsKKwljaGFyIHJlc2VydmVkWzYyXTsKK307CisKK3N0cnVjdCBwYWNrYWdlX3MgeworCXVuaW9uIHsKKwkJc3RydWN0IHBhY2thZ2VfaGVhZF9zIGhlYWQ7CisJCWNoYXIgYnVmWzI1Nl07CisJfTsKKwljaGFyIGRhdGFbMF07Cit9OworCitzdHJ1Y3QgaW5mb19oZWFkX3MgeworCWNoYXIgbmFtZVszMl07CisJY2hhciBmb3JtYXRbMzJdOworCWNoYXIgY3B1WzMyXTsKKwlpbnQgbGVuZ3RoOworfTsKKworc3RydWN0IHBhY2thZ2VfaW5mb19zIHsKKwl1bmlvbiB7CisJCXN0cnVjdCBpbmZvX2hlYWRfcyBoZWFkOworCQljaGFyIGJ1ZlsyNTZdOworCX07CisJY2hhciBkYXRhWzBdOworfTsKKworc3RydWN0IGZ3X2Rldl9zIHsKKwlzdHJ1Y3QgY2RldiBjZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlkZXZfdCBkZXZfbm87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY29tbW9uL2Zpcm13YXJlL2Zpcm13YXJlX3R5cGUuYyBiL2RyaXZlcnMvY29tbW9uL2Zpcm13YXJlL2Zpcm13YXJlX3R5cGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDk1YzEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jb21tb24vZmlybXdhcmUvZmlybXdhcmVfdHlwZS5jCkBAIC0wLDAgKzEsMTI5IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorKiBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqCisqIERlc2NyaXB0aW9uOgorKi8KKyNpbmNsdWRlICJmaXJtd2FyZV90eXBlLmgiCisjaW5jbHVkZSAiLi4vY2hpcHMvZGVjb2Rlcl9jcHVfdmVyX2luZm8uaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmb3JtYXRfbmFtZV9zIGZvcm1hdF9uYW1lW10gPSB7CisJe1ZJREVPX0RFQ19NUEVHMTIsCQkibXBlZzEyIn0sCisJe1ZJREVPX0RFQ19NUEVHMTJfTVVMVEksCSJtcGVnMTJfbXVsdGkifSwKKwl7VklERU9fREVDX01QRUc0XzMsCQkibXBlZzRfMyJ9LAorCXtWSURFT19ERUNfTVBFRzRfNCwJCSJtcGVnNF80In0sCisJe1ZJREVPX0RFQ19NUEVHNF80X01VTFRJLAkibXBlZzRfNF9tdWx0aSJ9LAorCXtWSURFT19ERUNfTVBFRzRfNSwJCSJ4dmlkIn0sCisJe1ZJREVPX0RFQ19NUEVHNF81X01VTFRJLAkieHZpZF9tdWx0aSJ9LAorCXtWSURFT19ERUNfSDI2MywJCSJoMjYzIn0sCisJe1ZJREVPX0RFQ19IMjYzX01VTFRJLAkJImgyNjNfbXVsdGkifSwKKwl7VklERU9fREVDX01KUEVHLAkJIm1qcGVnIn0sCisJe1ZJREVPX0RFQ19NSlBFR19NVUxUSSwJCSJtanBlZ19tdWx0aSJ9LAorCXtWSURFT19ERUNfUkVBTF9WOCwJCSJyZWFsX3Y4In0sCisJe1ZJREVPX0RFQ19SRUFMX1Y5LAkJInJlYWxfdjkifSwKKwl7VklERU9fREVDX1ZDMSwJCQkidmMxIn0sCisJe1ZJREVPX0RFQ19WQzFfRzEyQSwJCSJ2YzFfZzEyYSJ9LAorCXtWSURFT19ERUNfQVZTLAkJCSJhdnMifSwKKwl7VklERU9fREVDX0FWU19HWE0sCQkiYXZzX2d4bSJ9LAorCXtWSURFT19ERUNfQVZTX05PQ0FCQUMsCQkiYXZzX25vX2NhYmFjIn0sCisJe1ZJREVPX0RFQ19BVlNfTVVMVEksCQkiYXZzX211bHRpIn0sCisJe1ZJREVPX0RFQ19IMjY0LAkJImgyNjQifSwKKwl7VklERU9fREVDX0gyNjRfTVZDLAkJImgyNjRfbXZjIn0sCisJe1ZJREVPX0RFQ19IMjY0X01WQ19HWE0sCSJoMjY0X212Y19neG0ifSwKKwl7VklERU9fREVDX0gyNjRfTVVMVEksCQkiaDI2NF9tdWx0aSJ9LAorCXtWSURFT19ERUNfSDI2NF9NVUxUSV9NTVUsCSJoMjY0X211bHRpX21tdSJ9LAorCXtWSURFT19ERUNfSDI2NF9NVUxUSV9HWE0sCSJoMjY0X211bHRpX2d4bSJ9LAorCXtWSURFT19ERUNfSEVWQywJCSJoZXZjIn0sCisJe1ZJREVPX0RFQ19IRVZDX01NVSwJCSJoZXZjX21tdSJ9LAorCXtWSURFT19ERUNfSEVWQ19NTVVfU1dBUCwJImhldmNfbW11X3N3YXAifSwKKwl7VklERU9fREVDX0hFVkNfRzEyQSwJCSJoZXZjX2cxMmEifSwKKwl7VklERU9fREVDX1ZQOSwJCQkidnA5In0sCisJe1ZJREVPX0RFQ19WUDlfTU1VLAkJInZwOV9tbXUifSwKKwl7VklERU9fREVDX1ZQOV9HMTJBLAkJInZwOV9nMTJhIn0sCisJe1ZJREVPX0RFQ19BVlMyLAkJImF2czIifSwKKwl7VklERU9fREVDX0FWUzJfTU1VLAkJImF2czJfbW11In0sCisJe1ZJREVPX0RFQ19BVjFfTU1VLAkJImF2MV9tbXUifSwKKwl7VklERU9fRU5DX0gyNjQsCQkiaDI2NF9lbmMifSwKKwl7VklERU9fRU5DX0pQRUcsCQkianBlZ19lbmMifSwKKwl7RklSTVdBUkVfTUFYLAkJCSJ1bmtub3duIn0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNwdV90eXBlX3MgY3B1X3R5cGVbXSA9IHsKKwl7QU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTCwJImd4bCJ9LAorCXtBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hNLAkiZ3htIn0sCisJe0FNX01FU09OX0NQVV9NQUpPUl9JRF9UWEwsCSJ0eGwifSwKKwl7QU1fTUVTT05fQ1BVX01BSk9SX0lEX1RYTFgsCSJ0eGx4In0sCisJe0FNX01FU09OX0NQVV9NQUpPUl9JRF9BWEcsCSJheGcifSwKKwl7QU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTFgsCSJneGx4In0sCisJe0FNX01FU09OX0NQVV9NQUpPUl9JRF9UWEhELAkidHhoZCJ9LAorCXtBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQSwJImcxMmEifSwKKwl7QU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkIsCSJnMTJiIn0sCisJe0FNX01FU09OX0NQVV9NQUpPUl9JRF9HWExYMiwJImd4bHgyIn0sCisJe0FNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEsCSJzbTEifSwKKwl7QU1fTUVTT05fQ1BVX01BSk9SX0lEX1RMMSwJInRsMSJ9LAorCXtBTV9NRVNPTl9DUFVfTUFKT1JfSURfVE0yLAkidG0yIn0sCisJe0FNX01FU09OX0NQVV9NQUpPUl9JRF9TQzIsCSJzYzIifSwKKwl7QU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1LAkidDUifSwKKwl7QU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1RCwJInQ1ZCJ9LAorCXtBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDcsCSJ0NyJ9LAorCXtBTV9NRVNPTl9DUFVfTUFKT1JfSURfUzQsCSJzNCJ9LAorCXtBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDMsCSJ0MyJ9LAorCXtBTV9NRVNPTl9DUFVfTUFKT1JfSURfUDEsCSJwMSJ9LAorCXtBTV9NRVNPTl9DUFVfTUFKT1JfSURfUzRELAkiczRkIn0sCit9OworCitjb25zdCBjaGFyICpnZXRfZndfZm9ybWF0X25hbWUodW5zaWduZWQgaW50IGZvcm1hdCkKK3sKKwljb25zdCBjaGFyICpuYW1lID0gInVua25vd24iOworCWludCBpLCBzaXplID0gQVJSQVlfU0laRShmb3JtYXRfbmFtZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCWlmIChmb3JtYXQgPT0gZm9ybWF0X25hbWVbaV0uZm9ybWF0KQorCQkJbmFtZSA9IGZvcm1hdF9uYW1lW2ldLm5hbWU7CisJfQorCisJcmV0dXJuIG5hbWU7Cit9CitFWFBPUlRfU1lNQk9MKGdldF9md19mb3JtYXRfbmFtZSk7CisKK3Vuc2lnbmVkIGludCBnZXRfZndfZm9ybWF0KGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgaW50IGZvcm1hdCA9IEZJUk1XQVJFX01BWDsKKwlpbnQgaSwgc2l6ZSA9IEFSUkFZX1NJWkUoZm9ybWF0X25hbWUpOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlpZiAoIXN0cmNtcChuYW1lLCBmb3JtYXRfbmFtZVtpXS5uYW1lKSkKKwkJCWZvcm1hdCA9IGZvcm1hdF9uYW1lW2ldLmZvcm1hdDsKKwl9CisKKwlyZXR1cm4gZm9ybWF0OworfQorRVhQT1JUX1NZTUJPTChnZXRfZndfZm9ybWF0KTsKKworaW50IGZ3X2dldF9jcHUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgdHlwZSA9IDA7CisJaW50IGksIHNpemUgPSBBUlJBWV9TSVpFKGNwdV90eXBlKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJaWYgKCFzdHJjbXAobmFtZSwgY3B1X3R5cGVbaV0ubmFtZSkpCisJCQl0eXBlID0gY3B1X3R5cGVbaV0udHlwZTsKKwl9CisKKwlyZXR1cm4gdHlwZTsKK30KK0VYUE9SVF9TWU1CT0woZndfZ2V0X2NwdSk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY29tbW9uL2Zpcm13YXJlL2Zpcm13YXJlX3R5cGUuaCBiL2RyaXZlcnMvY29tbW9uL2Zpcm13YXJlL2Zpcm13YXJlX3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjE1YmFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jb21tb24vZmlybXdhcmUvZmlybXdhcmVfdHlwZS5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNyBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisqIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyoKKyogRGVzY3JpcHRpb246CisqLworI2lmbmRlZiBfX1ZJREVPX0ZJUk1XQVJFX0ZPUk1BVF8KKyNkZWZpbmUgX19WSURFT19GSVJNV0FSRV9GT1JNQVRfCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKy8qIGV4YW1wbGU6ICNkZWZpbmUgVklERU9fREVDX0FWMSAgVEFHKCdBJywgJ1YnLCAnMScsICctJykqLworI2RlZmluZSBUQUcoYSwgYiwgYywgZClcCisJKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChjIDw8IDgpIHwgZCkKKworLyogZndzIGRlZmluZSAqLworI2RlZmluZSBWSURFT19ERUNfTVBFRzEyCQkoMCkKKyNkZWZpbmUgVklERU9fREVDX01QRUc0XzMJCSgxKQorI2RlZmluZSBWSURFT19ERUNfTVBFRzRfNAkJKDIpCisjZGVmaW5lIFZJREVPX0RFQ19NUEVHNF81CQkoMykKKyNkZWZpbmUgVklERU9fREVDX0gyNjMJCQkoNCkKKyNkZWZpbmUgVklERU9fREVDX01KUEVHCQkJKDUpCisjZGVmaW5lIFZJREVPX0RFQ19NSlBFR19NVUxUSQkJKDYpCisjZGVmaW5lIFZJREVPX0RFQ19SRUFMX1Y4CQkoNykKKyNkZWZpbmUgVklERU9fREVDX1JFQUxfVjkJCSg4KQorI2RlZmluZSBWSURFT19ERUNfVkMxCQkJKDkpCisjZGVmaW5lIFZJREVPX0RFQ19BVlMJCQkoMTApCisjZGVmaW5lIFZJREVPX0RFQ19IMjY0CQkJKDExKQorI2RlZmluZSBWSURFT19ERUNfSDI2NF80azJLCQkoMTIpCisjZGVmaW5lIFZJREVPX0RFQ19IMjY0XzRrMktfU0lOR0xFCSgxMykKKyNkZWZpbmUgVklERU9fREVDX0gyNjRfTVZDCQkoMTQpCisjZGVmaW5lIFZJREVPX0RFQ19IMjY0X01VTFRJCQkoMTUpCisjZGVmaW5lIFZJREVPX0RFQ19IRVZDCQkJKDE2KQorI2RlZmluZSBWSURFT19ERUNfSEVWQ19NTVUJCSgxNykKKyNkZWZpbmUgVklERU9fREVDX1ZQOQkJCSgxOCkKKyNkZWZpbmUgVklERU9fREVDX1ZQOV9NTVUJCSgxOSkKKyNkZWZpbmUgVklERU9fRU5DX0gyNjQJCQkoMjApCisjZGVmaW5lIFZJREVPX0VOQ19KUEVHCQkJKDIxKQorI2RlZmluZSBWSURFT19ERUNfSDI2NF9NVUxUSV9NTVUJKDIzKQorI2RlZmluZSBWSURFT19ERUNfSEVWQ19HMTJBCQkoMjQpCisjZGVmaW5lIFZJREVPX0RFQ19WUDlfRzEyQQkJKDI1KQorI2RlZmluZSBWSURFT19ERUNfQVZTMgkJCSgyNikKKyNkZWZpbmUgVklERU9fREVDX0FWUzJfTU1VCQkoMjcpCisjZGVmaW5lIFZJREVPX0RFQ19BVlNfR1hNCQkoMjgpCisjZGVmaW5lIFZJREVPX0RFQ19BVlNfTk9DQUJBQwkJKDI5KQorI2RlZmluZSBWSURFT19ERUNfSDI2NF9NVUxUSV9HWE0JKDMwKQorI2RlZmluZSBWSURFT19ERUNfSDI2NF9NVkNfR1hNCQkoMzEpCisjZGVmaW5lIFZJREVPX0RFQ19WQzFfRzEyQQkJKDMyKQorI2RlZmluZSBWSURFT19ERUNfTVBFRzEyX01VTFRJCQlUQUcoJ00nLCAnMScsICcyJywgJ00nKQorI2RlZmluZSBWSURFT19ERUNfTVBFRzRfNF9NVUxUSQkJVEFHKCdNJywgJzQnLCAnNCcsICdNJykKKyNkZWZpbmUgVklERU9fREVDX01QRUc0XzVfTVVMVEkJCVRBRygnTScsICc0JywgJzUnLCAnTScpCisjZGVmaW5lIFZJREVPX0RFQ19IMjYzX01VTFRJCQlUQUcoJzInLCAnNicsICczJywgJ00nKQorI2RlZmluZSBWSURFT19ERUNfSEVWQ19NTVVfU1dBUAkJVEFHKCcyJywgJzYnLCAnNScsICdTJykKKyNkZWZpbmUgVklERU9fREVDX0FWU19NVUxUSQkJVEFHKCdBJywgJ1YnLCAnUycsICdNJykKKyNkZWZpbmUgVklERU9fREVDX0FWMV9NTVUJCVRBRygnQScsICdWJywgJzEnLCAnTScpCisKKy8qIC4uLiAqLworI2RlZmluZSBGSVJNV0FSRV9NQVgJCQkoVUlOVF9NQVgpCisKKyNkZWZpbmUgVklERU9fUEFDS0FHRQkJCSgwKQorI2RlZmluZSBWSURFT19GV19GSUxFCQkJKDEpCisKKyNkZWZpbmUgVklERU9fREVDT0RFCQkJKDApCisjZGVmaW5lIFZJREVPX0VOQ09ERQkJCSgxKQorI2RlZmluZSBWSURFT19NSVNDCQkJKDIpCisKKyNkZWZpbmUgT1BURUVfVkRFQ19MRUdFTkNZCQkoMCkKKyNkZWZpbmUgT1BURUVfVkRFQwkJCSgxKQorI2RlZmluZSBPUFRFRV9WREVDX0hFVkMJCQkoMikKKyNkZWZpbmUgT1BURUVfVkRFQ19IQ0RFQwkJCSgzKQorCitzdHJ1Y3QgZm9ybWF0X25hbWVfcyB7CisJdW5zaWduZWQgaW50IGZvcm1hdDsKKwljb25zdCBjaGFyICpuYW1lOworfTsKKworc3RydWN0IGNwdV90eXBlX3MgeworCWludCB0eXBlOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCitjb25zdCBjaGFyICpnZXRfZndfZm9ybWF0X25hbWUodW5zaWduZWQgaW50IGZvcm1hdCk7Cit1bnNpZ25lZCBpbnQgZ2V0X2Z3X2Zvcm1hdChjb25zdCBjaGFyICpuYW1lKTsKK2ludCBmd19nZXRfY3B1KGNvbnN0IGNoYXIgKm5hbWUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY29tbW9uL21lZGlhX2Nsb2NrL01ha2VmaWxlIGIvZHJpdmVycy9jb21tb24vbWVkaWFfY2xvY2svTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc1YjVlNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY29tbW9uL21lZGlhX2Nsb2NrL01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorb2JqLW0JKz0JbWVkaWFfY2xvY2subworbWVkaWFfY2xvY2stb2JqcyArPSAuLi9jaGlwcy9jaGlwcy5vCittZWRpYV9jbG9jay1vYmpzICs9IGNsay9jbGtnMTIubworbWVkaWFfY2xvY2stb2JqcyArPSBjbGsvY2xrLm8KK21lZGlhX2Nsb2NrLW9ianMgKz0gc3dpdGNoL2FtcG9ydHNfZ2F0ZS5vCittZWRpYV9jbG9jay1vYmpzICs9IC4uL2NoaXBzL2RlY29kZXJfY3B1X3Zlcl9pbmZvLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY29tbW9uL21lZGlhX2Nsb2NrL2Nsay9jbGsuYyBiL2RyaXZlcnMvY29tbW9uL21lZGlhX2Nsb2NrL2Nsay9jbGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzQwYzFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jb21tb24vbWVkaWFfY2xvY2svY2xrL2Nsay5jCkBAIC0wLDAgKzEsNDczIEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL21lZGlhL2NvbW1vbi9hcmNoL2Nsay9jbGsuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy92Zm9ybWF0Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9yZWdpc3RlcnMvY3B1X3ZlcnNpb24uaD4KKyNpbmNsdWRlICIuLi8uLi8uLi9zdHJlYW1faW5wdXQvYW1wb3J0cy9hbXBvcnRzX3ByaXYuaCIKKyNpbmNsdWRlICIuLi8uLi8uLi9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWMuaCIKKyNpbmNsdWRlICIuLi8uLi9jaGlwcy9jaGlwcy5oIgorI2luY2x1ZGUgImNsa19wcml2LmgiCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy9sb2cuaD4KKyNpbmNsdWRlICIuLi8uLi9jaGlwcy9kZWNvZGVyX2NwdV92ZXJfaW5mby5oIgorCisjZGVmaW5lIHBfdmRlYygpIChnZXRfY3VycmVudF92ZGVjX2NoaXAoKS0+Y2xrX21ncltWREVDXzFdKQorI2RlZmluZSBwX3ZkZWMyKCkgKGdldF9jdXJyZW50X3ZkZWNfY2hpcCgpLT5jbGtfbWdyW1ZERUNfMl0pCisjZGVmaW5lIHBfdmRlY19oY29kZWMoKSAoZ2V0X2N1cnJlbnRfdmRlY19jaGlwKCktPmNsa19tZ3JbVkRFQ19IQ09ERUNdKQorI2RlZmluZSBwX3ZkZWNfaGV2YygpIChnZXRfY3VycmVudF92ZGVjX2NoaXAoKS0+Y2xrX21ncltWREVDX0hFVkNdKQorI2RlZmluZSBwX3ZkZWNfaGV2Y19iYWNrKCkgKGdldF9jdXJyZW50X3ZkZWNfY2hpcCgpLT5jbGtfbWdyW1ZERUNfSEVWQ0JdKQorCitzdGF0aWMgaW50IGNsb2NrX3NvdXJjZV93eGh4ZnBzX3NhdmVkW1ZERUNfTUFYICsgMV07CisKKyNkZWZpbmUgSUZfSEFWRV9SVU4ocCwgZm4pXAorCWRvIHtcCisJCWlmIChwICYmIHAtPmZuKVwKKwkJCXAtPmZuKCk7XAorCX0gd2hpbGUgKDApCisvKgorICojZGVmaW5lIElGX0hBVkVfUlVOX1AxX1JFVChwLCBmbiwgcDEpXAorICoJCQlkbyB7XAorICoJCQkJcHJfZGVidWcoIiVzLS0tLS0lZFxuIiwgX19mdW5jX18sIGNsayk7XAorICoJCQkJaWYgKHAgJiYgcC0+Zm4pXAorICoJCQkJCXJldHVybiBwLT5mbihwMSk7XAorICoJCQkJZWxzZVwKKyAqCQkJCQlyZXR1cm4gLTE7XAorICoJCQl9IHdoaWxlICgwKQorICoKKyAqI2RlZmluZSBJRl9IQVZFX1JVTl9SRVQocCwgZm4pXAorICoJZG8ge1wKKyAqCQlpZiAocCAmJiBwLT5mbilcCisgKgkJCXJldHVybiBwLT5mbigpO1wKKyAqCQllbHNlXAorICoJCQlyZXR1cm4gMDtcCisgKgl9IHdoaWxlICgwKQorICovCisKK2ludCB2ZGVjX2Nsb2NrX2luaXQodm9pZCkKK3sKKwlpZiAocF92ZGVjKCkgJiYgcF92ZGVjKCktPmNsb2NrX2luaXQpCisJCXJldHVybiBwX3ZkZWMoKS0+Y2xvY2tfaW5pdCgpOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfY2xvY2tfaW5pdCk7CisKKy8qCisgKmNsayA9PTAgOgorICoJdG8gYmUgcmVsZWFzZS4KKyAqCXJlbGVhc2VkIHNoYXJlZCBjbGssCisgKmNsayA9PTEgOmRlZmF1bHQgbG93IGNsaworICpjbGsgPT0yIDpkZWZhdWx0IGhpZ2ggY2xrCisgKi8KK2ludCB2ZGVjX2Nsb2NrX3NldChpbnQgY2xrKQoreworCXByX2RlYnVnKCIlcy0tLS0tJWRcbiIsIF9fZnVuY19fLCBjbGspOworCWlmIChwX3ZkZWMoKSAmJiBwX3ZkZWMoKS0+Y2xvY2tfc2V0KQorCQlyZXR1cm4gcF92ZGVjKCktPmNsb2NrX3NldChjbGspOworCWVsc2UKKwkJcmV0dXJuIC0xOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX2Nsb2NrX3NldCk7CisKK3ZvaWQgdmRlY19jbG9ja19lbmFibGUodm9pZCkKK3sKKwl2ZGVjX2Nsb2NrX3NldCgxKTsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19jbG9ja19lbmFibGUpOworCit2b2lkIHZkZWNfY2xvY2tfaGlfZW5hYmxlKHZvaWQpCit7CisJdmRlY19jbG9ja19zZXQoMik7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfY2xvY2tfaGlfZW5hYmxlKTsKKwordm9pZCB2ZGVjX2Nsb2NrX29uKHZvaWQpCit7CisJSUZfSEFWRV9SVU4ocF92ZGVjKCksIGNsb2NrX29uKTsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19jbG9ja19vbik7CisKK3ZvaWQgdmRlY19jbG9ja19vZmYodm9pZCkKK3sKKwlJRl9IQVZFX1JVTihwX3ZkZWMoKSwgY2xvY2tfb2ZmKTsKKwljbG9ja19zb3VyY2Vfd3hoeGZwc19zYXZlZFtWREVDXzFdID0gMDsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19jbG9ja19vZmYpOworCitpbnQgdmRlYzJfY2xvY2tfc2V0KGludCBjbGspCit7CisJcHJfZGVidWcoIiVzLS0tLS0lZFxuIiwgX19mdW5jX18sIGNsayk7CisJaWYgKHBfdmRlYzIoKSAmJiBwX3ZkZWMyKCktPmNsb2NrX3NldCkKKwkJcmV0dXJuIHBfdmRlYzIoKS0+Y2xvY2tfc2V0KGNsayk7CisJZWxzZQorCQlyZXR1cm4gLTE7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWMyX2Nsb2NrX3NldCk7CisKK3ZvaWQgdmRlYzJfY2xvY2tfZW5hYmxlKHZvaWQpCit7CisJdmRlYzJfY2xvY2tfc2V0KDEpOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjMl9jbG9ja19lbmFibGUpOworCit2b2lkIHZkZWMyX2Nsb2NrX2hpX2VuYWJsZSh2b2lkKQoreworCXZkZWMyX2Nsb2NrX3NldCgyKTsKK30KK0VYUE9SVF9TWU1CT0wodmRlYzJfY2xvY2tfaGlfZW5hYmxlKTsKKwordm9pZCB2ZGVjMl9jbG9ja19vbih2b2lkKQoreworCUlGX0hBVkVfUlVOKHBfdmRlYzIoKSwgY2xvY2tfb24pOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjMl9jbG9ja19vbik7CisKK3ZvaWQgdmRlYzJfY2xvY2tfb2ZmKHZvaWQpCit7CisJSUZfSEFWRV9SVU4ocF92ZGVjMigpLCBjbG9ja19vZmYpOworCWNsb2NrX3NvdXJjZV93eGh4ZnBzX3NhdmVkW1ZERUNfMl0gPSAwOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjMl9jbG9ja19vZmYpOworCitpbnQgaGNvZGVjX2Nsb2NrX3NldChpbnQgY2xrKQoreworCXByX2RlYnVnKCIlcy0tLS0tJWRcbiIsIF9fZnVuY19fLCBjbGspOworCWlmIChwX3ZkZWNfaGNvZGVjKCkgJiYgcF92ZGVjX2hjb2RlYygpLT5jbG9ja19zZXQpCisJCXJldHVybiBwX3ZkZWNfaGNvZGVjKCktPmNsb2NrX3NldChjbGspOworCWVsc2UKKwkJcmV0dXJuIC0xOworfQorRVhQT1JUX1NZTUJPTChoY29kZWNfY2xvY2tfc2V0KTsKKwordm9pZCBoY29kZWNfY2xvY2tfZW5hYmxlKHZvaWQpCit7CisJaGNvZGVjX2Nsb2NrX3NldCg2NjcpOworfQorRVhQT1JUX1NZTUJPTChoY29kZWNfY2xvY2tfZW5hYmxlKTsKKwordm9pZCBoY29kZWNfY2xvY2tfaGlfZW5hYmxlKHZvaWQpCit7CisJaGNvZGVjX2Nsb2NrX3NldCgyKTsKK30KK0VYUE9SVF9TWU1CT0woaGNvZGVjX2Nsb2NrX2hpX2VuYWJsZSk7CisKK3ZvaWQgaGNvZGVjX2Nsb2NrX29uKHZvaWQpCit7CisJSUZfSEFWRV9SVU4ocF92ZGVjX2hjb2RlYygpLCBjbG9ja19vbik7Cit9CitFWFBPUlRfU1lNQk9MKGhjb2RlY19jbG9ja19vbik7CisKK3ZvaWQgaGNvZGVjX2Nsb2NrX29mZih2b2lkKQoreworCUlGX0hBVkVfUlVOKHBfdmRlY19oY29kZWMoKSwgY2xvY2tfb2ZmKTsKKwljbG9ja19zb3VyY2Vfd3hoeGZwc19zYXZlZFtWREVDX0hDT0RFQ10gPSAwOworfQorRVhQT1JUX1NZTUJPTChoY29kZWNfY2xvY2tfb2ZmKTsKKworaW50IGhldmNfYmFja19jbG9ja19pbml0KHZvaWQpCit7CisJaWYgKHBfdmRlY19oZXZjX2JhY2soKSAmJiBwX3ZkZWNfaGV2Y19iYWNrKCktPmNsb2NrX2luaXQpCisJCXJldHVybiBwX3ZkZWNfaGV2Y19iYWNrKCktPmNsb2NrX2luaXQoKTsKKwllbHNlCisJCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChoZXZjX2JhY2tfY2xvY2tfaW5pdCk7CisKK2ludCBoZXZjX2JhY2tfY2xvY2tfc2V0KGludCBjbGspCit7CisJcHJfZGVidWcoIiVzLS0tLS0lZFxuIiwgX19mdW5jX18sIGNsayk7CisJaWYgKHBfdmRlY19oZXZjX2JhY2soKSAmJiBwX3ZkZWNfaGV2Y19iYWNrKCktPmNsb2NrX3NldCkKKwkJcmV0dXJuIHBfdmRlY19oZXZjX2JhY2soKS0+Y2xvY2tfc2V0KGNsayk7CisJZWxzZQorCQlyZXR1cm4gLTE7Cit9CitFWFBPUlRfU1lNQk9MKGhldmNfYmFja19jbG9ja19zZXQpOworCit2b2lkIGhldmNfYmFja19jbG9ja19lbmFibGUodm9pZCkKK3sKKwloZXZjX2JhY2tfY2xvY2tfc2V0KDEpOworfQorRVhQT1JUX1NZTUJPTChoZXZjX2JhY2tfY2xvY2tfZW5hYmxlKTsKKwordm9pZCBoZXZjX2JhY2tfY2xvY2tfaGlfZW5hYmxlKHZvaWQpCit7CisJaGV2Y19iYWNrX2Nsb2NrX3NldCgyKTsKK30KK0VYUE9SVF9TWU1CT0woaGV2Y19iYWNrX2Nsb2NrX2hpX2VuYWJsZSk7CisKK2ludCBoZXZjX2Nsb2NrX2luaXQodm9pZCkKK3sKKwlpZiAocF92ZGVjX2hldmMoKSAmJiBwX3ZkZWNfaGV2YygpLT5jbG9ja19pbml0KQorCQlyZXR1cm4gcF92ZGVjX2hldmMoKS0+Y2xvY2tfaW5pdCgpOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGhldmNfY2xvY2tfaW5pdCk7CisKK2ludCBoZXZjX2Nsb2NrX3NldChpbnQgY2xrKQoreworCXByX2RlYnVnKCIlcy0tLS0tJWRcbiIsIF9fZnVuY19fLCBjbGspOworCWlmIChwX3ZkZWNfaGV2YygpICYmIHBfdmRlY19oZXZjKCktPmNsb2NrX3NldCkKKwkJcmV0dXJuIHBfdmRlY19oZXZjKCktPmNsb2NrX3NldChjbGspOworCWVsc2UKKwkJcmV0dXJuIC0xOworfQorRVhQT1JUX1NZTUJPTChoZXZjX2Nsb2NrX3NldCk7CisKK3ZvaWQgaGV2Y19jbG9ja19lbmFibGUodm9pZCkKK3sKKwloZXZjX2Nsb2NrX3NldCgxKTsKK30KK0VYUE9SVF9TWU1CT0woaGV2Y19jbG9ja19lbmFibGUpOworCit2b2lkIGhldmNfY2xvY2tfaGlfZW5hYmxlKHZvaWQpCit7CisJaGV2Y19jbG9ja19zZXQoMik7Cit9CitFWFBPUlRfU1lNQk9MKGhldmNfY2xvY2tfaGlfZW5hYmxlKTsKKwordm9pZCBoZXZjX2JhY2tfY2xvY2tfb24odm9pZCkKK3sKKwlJRl9IQVZFX1JVTihwX3ZkZWNfaGV2Y19iYWNrKCksIGNsb2NrX29uKTsKK30KK0VYUE9SVF9TWU1CT0woaGV2Y19iYWNrX2Nsb2NrX29uKTsKKwordm9pZCBoZXZjX2JhY2tfY2xvY2tfb2ZmKHZvaWQpCit7CisJSUZfSEFWRV9SVU4ocF92ZGVjX2hldmNfYmFjaygpLCBjbG9ja19vZmYpOworCWNsb2NrX3NvdXJjZV93eGh4ZnBzX3NhdmVkW1ZERUNfSEVWQ0JdID0gMDsKK30KK0VYUE9SVF9TWU1CT0woaGV2Y19iYWNrX2Nsb2NrX29mZik7CisKK3ZvaWQgaGV2Y19jbG9ja19vbih2b2lkKQoreworCUlGX0hBVkVfUlVOKHBfdmRlY19oZXZjKCksIGNsb2NrX29uKTsKK30KK0VYUE9SVF9TWU1CT0woaGV2Y19jbG9ja19vbik7CisKK3ZvaWQgaGV2Y19jbG9ja19vZmYodm9pZCkKK3sKKwlJRl9IQVZFX1JVTihwX3ZkZWNfaGV2YygpLCBjbG9ja19vZmYpOworCWNsb2NrX3NvdXJjZV93eGh4ZnBzX3NhdmVkW1ZERUNfSEVWQ10gPSAwOworfQorRVhQT1JUX1NZTUJPTChoZXZjX2Nsb2NrX29mZik7CisKK2ludCB2ZGVjX3NvdXJjZV9nZXQoZW51bSB2ZGVjX3R5cGVfZSBjb3JlKQoreworCXJldHVybiBjbG9ja19zb3VyY2Vfd3hoeGZwc19zYXZlZFtjb3JlXTsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19zb3VyY2VfZ2V0KTsKKworaW50IHZkZWNfY2xrX2dldChlbnVtIHZkZWNfdHlwZV9lIGNvcmUpCit7CisJcmV0dXJuIGdldF9jdXJyZW50X3ZkZWNfY2hpcCgpLT5jbGtfbWdyW2NvcmVdLT5jbG9ja19nZXQoY29yZSk7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfY2xrX2dldCk7CisKK2ludCBnZXRfY2xrX3dpdGhfc291cmNlKGludCBmb3JtYXQsIGludCB3X3hfaF9mcHMpCit7CisJc3RydWN0IGNsa19zZXRfc2V0dGluZyAqcF9zZXR0aW5nOworCWludCBpOworCWludCBjbGsgPSAtMjsKKworCXBfc2V0dGluZyA9IGdldF9jdXJyZW50X3ZkZWNfY2hpcCgpLT5jbGtfc2V0dGluZ19hcnJheTsKKwlpZiAoIXBfc2V0dGluZyB8fCBmb3JtYXQgPCAwIHx8IGZvcm1hdCA+IFZGT1JNQVRfTUFYKSB7CisJCXByX2luZm8oImVycm9yIG9uIGdldF9jbGtfd2l0aF9zb3VyY2UgLCVwLCVkXG4iLAorCQkJcF9zZXR0aW5nLCBmb3JtYXQpOworCQlyZXR1cm4gLTE7CS8qbm8gc2V0dGluZyBmb3VuZC4gKi8KKwl9CisJcF9zZXR0aW5nID0gJnBfc2V0dGluZ1tmb3JtYXRdOworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0xLX1NFVDsgaSsrKSB7CisJCWlmIChwX3NldHRpbmctPnNldFtpXS53aF9YX2ZwcyA+IHdfeF9oX2ZwcykgeworCQkJY2xrID0gcF9zZXR0aW5nLT5zZXRbaV0uY2xrX01oejsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBjbGs7Cit9CitFWFBPUlRfU1lNQk9MKGdldF9jbGtfd2l0aF9zb3VyY2UpOworCitib29sIGlzX2hldmNfZnJvbnRfYmFja19jbGtfY29tYmluZWQodm9pZCkKK3sKKwlpbnQgY3B1X2lkID0gZ2V0X2NwdV9tYWpvcl9pZCgpOworCisJaWYgKGNwdV9pZCA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDUgfHwKKwkJKGNwdV9pZCA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDVEKSB8fAorCQkoY3B1X2lkID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TNCkgfHwKKwkJKGNwdV9pZCA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfUzREKSB8fAorCQkoY3B1X2lkID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNVcpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KK0VYUE9SVF9TWU1CT0woaXNfaGV2Y19mcm9udF9iYWNrX2Nsa19jb21iaW5lZCk7CisKK2ludCB2ZGVjX3NvdXJjZV9jaGFuZ2VkX2Zvcl9jbGtfc2V0KGludCBmb3JtYXQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZwcykKK3sKKwlpbnQgY2xrID0gZ2V0X2Nsa193aXRoX3NvdXJjZShmb3JtYXQsIHdpZHRoICogaGVpZ2h0ICogZnBzKTsKKwlpbnQgcmV0X2NsazsKKworCWlmIChjbGsgPCAwKSB7CisJCXByX2luZm8oImNhbid0IGdldCB2YWxpZCBjbGsgZm9yIHNvdXJjZSAsJWQsJWQsJWRcbiIsCisJCQl3aWR0aCwgaGVpZ2h0LCBmcHMpOworCQlpZiAoZm9ybWF0ID49IDE5MjAgJiYgd2lkdGggPj0gMTA4MCAmJiBmcHMgPj0gMzApCisJCQljbGsgPSAyOwkvKmRlZmF1bHQgaGlnaCBjbGsgKi8KKwkJZWxzZQorCQkJY2xrID0gMDsJLypkZWZhdWx0IGNsay4gKi8KKwl9CisJaWYgKHdpZHRoICogaGVpZ2h0ICogZnBzID09IDApCisJCWNsayA9IDA7CisJLyoKKwkgKmNsayA9PSAwCisJICppcyB1c2VkIGZvciBzZXQgZGVmYXVsdCBjbGs7CisJICppZiB1c2VkIHN1cHBlciBjbGsuCisJICpjaGFuZ2VkIHRvIGRlZmF1bHQgIG1pbiBjbGsuCisJICovCisKKwlpZiAoZm9ybWF0ID09IFZGT1JNQVRfSEVWQyB8fCBmb3JtYXQgPT0gVkZPUk1BVF9WUDkKKwkJfHwgZm9ybWF0ID09IFZGT1JNQVRfQVZTMgorCQl8fCBmb3JtYXQgPT0gVkZPUk1BVF9BVjEpIHsKKwkJcmV0X2NsayA9IGhldmNfY2xvY2tfc2V0KGNsayk7CisJCWNsb2NrX3NvdXJjZV93eGh4ZnBzX3NhdmVkW1ZERUNfSEVWQ10gPSB3aWR0aCAqIGhlaWdodCAqIGZwczsKKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQSAmJgorCQkJIWlzX2hldmNfZnJvbnRfYmFja19jbGtfY29tYmluZWQoKSkgeworCQkJcmV0X2NsayA9IGhldmNfYmFja19jbG9ja19zZXQoY2xrKTsKKwkJCWNsb2NrX3NvdXJjZV93eGh4ZnBzX3NhdmVkW1ZERUNfSEVWQ0JdID0gd2lkdGggKiBoZWlnaHQgKiBmcHM7CisJCX0KKwl9IGVsc2UgaWYgKGZvcm1hdCA9PSBWRk9STUFUX0gyNjRfRU5DIHx8IGZvcm1hdCA9PSBWRk9STUFUX0pQRUdfRU5DKSB7CisJCXJldF9jbGsgPSBoY29kZWNfY2xvY2tfc2V0KGNsayk7CisJCWNsb2NrX3NvdXJjZV93eGh4ZnBzX3NhdmVkW1ZERUNfSENPREVDXSA9IHdpZHRoICogaGVpZ2h0ICogZnBzOworCX0gZWxzZSBpZiAoZm9ybWF0ID09IFZGT1JNQVRfSDI2NF80SzJLICYmCisJCWdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfTTgpIHsKKwkJcmV0X2NsayA9IHZkZWMyX2Nsb2NrX3NldChjbGspOworCQljbG9ja19zb3VyY2Vfd3hoeGZwc19zYXZlZFtWREVDXzJdID0gd2lkdGggKiBoZWlnaHQgKiBmcHM7CisJCXJldF9jbGsgPSB2ZGVjX2Nsb2NrX3NldChjbGspOworCQljbG9ja19zb3VyY2Vfd3hoeGZwc19zYXZlZFtWREVDXzFdID0gd2lkdGggKiBoZWlnaHQgKiBmcHM7CisJfSBlbHNlIHsKKwkJcmV0X2NsayA9IHZkZWNfY2xvY2tfc2V0KGNsayk7CisJCWNsb2NrX3NvdXJjZV93eGh4ZnBzX3NhdmVkW1ZERUNfMV0gPSB3aWR0aCAqIGhlaWdodCAqIGZwczsKKwl9CisJcmV0dXJuIHJldF9jbGs7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfc291cmNlX2NoYW5nZWRfZm9yX2Nsa19zZXQpOworCitzdGF0aWMgaW50IHJlZ2lzdGVyX3ZkZWNfY2xrX21ncl9wZXJfY3B1KGludCBjcHV0eXBlLAorCWVudW0gdmRlY190eXBlX2UgdmRlY190eXBlLCBzdHJ1Y3QgY2hpcF92ZGVjX2Nsa19zICp0X21ncikKK3sKKworCXN0cnVjdCBjaGlwX3ZkZWNfY2xrX3MgKm1ncjsKKworCWlmIChjcHV0eXBlICE9IGdldF9jcHVfbWFqb3JfaWQoKSB8fCB2ZGVjX3R5cGUgPj0gVkRFQ19NQVgpIHsKKwkJLyoKKwkJICpwcl9pbmZvKCJpZ25vcmUgdmRlYyBjbGsgbWdyIGZvciB2ZGVjWyVkXSBjcHU9JWRcbiIsCisJCSAqdmRlY190eXBlLCBjcHV0eXBlKTsKKwkJICovCisJCXJldHVybiAwOwkvKiBpZ25vcmUgZG9uJ3QgbmVlZGVkIGZpcm1hcmUuICovCisJfQorCW1nciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjaGlwX3ZkZWNfY2xrX3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1ncikKKwkJcmV0dXJuIC1FTk9NRU07CisJKm1nciA9ICp0X21ncjsKKwkvKgorCSAqcHJfaW5mbygicmVnaXN0ZXIgdmRlYyBjbGsgbWdyIGZvciB2ZGVjWyVkXVxuIiwgdmRlY190eXBlKTsKKwkgKi8KKwlpZiAobWdyLT5jbG9ja19pbml0KSB7CisJCWlmIChtZ3ItPmNsb2NrX2luaXQoKSkgeworCQkJa2ZyZWUobWdyKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCWdldF9jdXJyZW50X3ZkZWNfY2hpcCgpLT5jbGtfbWdyW3ZkZWNfdHlwZV0gPSBtZ3I7CisJcmV0dXJuIDA7Cit9CisKK2ludCByZWdpc3Rlcl92ZGVjX2Nsa19tZ3IoaW50IGNwdXR5cGVbXSwgZW51bSB2ZGVjX3R5cGVfZSB2ZGVjX3R5cGUsCisJc3RydWN0IGNoaXBfdmRlY19jbGtfcyAqdF9tZ3IpCit7CisJaW50IGkgPSAwOworCisJd2hpbGUgKGNwdXR5cGVbaV0gPiAwKSB7CisJCXJlZ2lzdGVyX3ZkZWNfY2xrX21ncl9wZXJfY3B1KGNwdXR5cGVbaV0sIHZkZWNfdHlwZSwgdF9tZ3IpOworCQlpKys7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl92ZGVjX2Nsa19tZ3IpOworCitpbnQgdW5yZWdpc3Rlcl92ZGVjX2Nsa19tZ3IoZW51bSB2ZGVjX3R5cGVfZSB2ZGVjX3R5cGUpCit7CisJa2ZyZWUoZ2V0X2N1cnJlbnRfdmRlY19jaGlwKCktPmNsa19tZ3JbdmRlY190eXBlXSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl92ZGVjX2Nsa19tZ3IpOworCitzdGF0aWMgaW50IHJlZ2lzdGVyX3ZkZWNfY2xrX3NldHRpbmdfcGVyX2NwdShpbnQgY3B1dHlwZSwKKwlzdHJ1Y3QgY2xrX3NldF9zZXR0aW5nICpzZXR0aW5nLCBpbnQgc2l6ZSkKK3sKKworCXN0cnVjdCBjbGtfc2V0X3NldHRpbmcgKnBfc2V0dGluZzsKKworCWlmIChjcHV0eXBlICE9IGdldF9jcHVfbWFqb3JfaWQoKSkgeworCQkvKgorCQkgKnByX2luZm8oImlnbm9yZSBjbGtfc2V0X3NldHRpbmcgZm9yIGNwdT0lZFxuIiwKKwkJICpjcHV0eXBlKTsKKwkJICovCisJCXJldHVybiAwOwkvKiBpZ25vcmUgZG9uJ3QgbmVlZGVkIHRoaXMgc2V0dGluZyAuICovCisJfQorCXBfc2V0dGluZyA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwX3NldHRpbmcpCisJCXJldHVybiAtRU5PTUVNOworCW1lbWNweShwX3NldHRpbmcsIHNldHRpbmcsIHNpemUpOworCisJcHJfaW5mbygicmVnaXN0ZXIgY2xrX3NldF9zZXR0aW5nIGNwdVslZF1cbiIsIGNwdXR5cGUpOworCisJZ2V0X2N1cnJlbnRfdmRlY19jaGlwKCktPmNsa19zZXR0aW5nX2FycmF5ID0gcF9zZXR0aW5nOworCXJldHVybiAwOworfQorCitpbnQgcmVnaXN0ZXJfdmRlY19jbGtfc2V0dGluZyhpbnQgY3B1dHlwZVtdLAorCXN0cnVjdCBjbGtfc2V0X3NldHRpbmcgKnBfc2V0aW5nLCBpbnQgc2l6ZSkKK3sKKwlpbnQgaSA9IDA7CisKKwl3aGlsZSAoY3B1dHlwZVtpXSA+IDApIHsKKwkJcmVnaXN0ZXJfdmRlY19jbGtfc2V0dGluZ19wZXJfY3B1KGNwdXR5cGVbaV0sIHBfc2V0aW5nLCBzaXplKTsKKwkJaSsrOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfdmRlY19jbGtfc2V0dGluZyk7CisKK2ludCB1bnJlZ2lzdGVyX3ZkZWNfY2xrX3NldHRpbmcodm9pZCkKK3sKKwlrZnJlZShnZXRfY3VycmVudF92ZGVjX2NoaXAoKS0+Y2xrX3NldHRpbmdfYXJyYXkpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfdmRlY19jbGtfc2V0dGluZyk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY29tbW9uL21lZGlhX2Nsb2NrL2Nsay9jbGsuaCBiL2RyaXZlcnMvY29tbW9uL21lZGlhX2Nsb2NrL2Nsay9jbGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmMzYmVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jb21tb24vbWVkaWFfY2xvY2svY2xrL2Nsay5oCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL21lZGlhL2NvbW1vbi9hcmNoL2Nsay9jbGsuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIFZERUNfQ0hJUF9DTEtfSEVBREVSCisjZGVmaW5lIFZERUNfQ0hJUF9DTEtfSEVBREVSCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSAiY2xrX3ByaXYuaCIKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2Nsay9ncF9wbGwuaD4KKworI2lmbmRlZiBJTkNMVURFX0ZST01fQVJDSF9DTEtfTUdSCitpbnQgdmRlY19jbG9ja19pbml0KHZvaWQpOworaW50IHZkZWNfY2xvY2tfc2V0KGludCBjbGspOworaW50IHZkZWMyX2Nsb2NrX3NldChpbnQgY2xrKTsKKworaW50IGhjb2RlY19jbG9ja19zZXQoaW50IGNsayk7CitpbnQgaGV2Y19jbG9ja19pbml0KHZvaWQpOworaW50IGhldmNfY2xvY2tfc2V0KGludCBjbGspOworCit2b2lkIHZkZWNfY2xvY2tfb24odm9pZCk7Cit2b2lkIHZkZWNfY2xvY2tfb2ZmKHZvaWQpOwordm9pZCB2ZGVjMl9jbG9ja19vbih2b2lkKTsKKwordm9pZCB2ZGVjMl9jbG9ja19vZmYodm9pZCk7Cit2b2lkIGhjb2RlY19jbG9ja19vbih2b2lkKTsKK3ZvaWQgaGNvZGVjX2Nsb2NrX29mZih2b2lkKTsKK3ZvaWQgaGV2Y19jbG9ja19vbih2b2lkKTsKK3ZvaWQgaGV2Y19jbG9ja19vZmYodm9pZCk7CisKK2ludCBoZXZjX2JhY2tfY2xvY2tfaW5pdCh2b2lkKTsKK3ZvaWQgaGV2Y19iYWNrX2Nsb2NrX29uKHZvaWQpOwordm9pZCBoZXZjX2JhY2tfY2xvY2tfb2ZmKHZvaWQpOworaW50IGhldmNfYmFja19jbG9ja19zZXQoaW50IGNsayk7Cit2b2lkIGhldmNfYmFja19jbG9ja19lbmFibGUodm9pZCk7Cit2b2lkIGhldmNfYmFja19jbG9ja19oaV9lbmFibGUodm9pZCk7CisKK2ludCB2ZGVjX3NvdXJjZV9nZXQoZW51bSB2ZGVjX3R5cGVfZSBjb3JlKTsKK2ludCB2ZGVjX2Nsa19nZXQoZW51bSB2ZGVjX3R5cGVfZSBjb3JlKTsKKworYm9vbCBpc19oZXZjX2Zyb250X2JhY2tfY2xrX2NvbWJpbmVkKHZvaWQpOworCitpbnQgdmRlY19zb3VyY2VfY2hhbmdlZF9mb3JfY2xrX3NldChpbnQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmcHMpOworaW50IGdldF9jbGtfd2l0aF9zb3VyY2UoaW50IGZvcm1hdCwgaW50IHdfeF9oX2Zwcyk7CisKK3ZvaWQgdmRlY19jbG9ja19lbmFibGUodm9pZCk7Cit2b2lkIHZkZWNfY2xvY2tfaGlfZW5hYmxlKHZvaWQpOwordm9pZCBoY29kZWNfY2xvY2tfZW5hYmxlKHZvaWQpOwordm9pZCBoY29kZWNfY2xvY2tfaGlfZW5hYmxlKHZvaWQpOwordm9pZCBoZXZjX2Nsb2NrX2VuYWJsZSh2b2lkKTsKK3ZvaWQgaGV2Y19jbG9ja19oaV9lbmFibGUodm9pZCk7Cit2b2lkIHZkZWMyX2Nsb2NrX2VuYWJsZSh2b2lkKTsKK3ZvaWQgdmRlYzJfY2xvY2tfaGlfZW5hYmxlKHZvaWQpOwordm9pZCBzZXRfY2xvY2tfZ2F0ZShzdHJ1Y3QgZ2F0ZV9zd2l0Y2hfbm9kZSAqbm9kZXMsIGludCBudW0pOworCisjZW5kaWYKK2ludCByZWdpc3Rlcl92ZGVjX2Nsa19tZ3IoaW50IGNwdXR5cGVbXSwKKwllbnVtIHZkZWNfdHlwZV9lIHZkZWNfdHlwZSwgc3RydWN0IGNoaXBfdmRlY19jbGtfcyAqdF9tZ3IpOworCitpbnQgdW5yZWdpc3Rlcl92ZGVjX2Nsa19tZ3IoZW51bSB2ZGVjX3R5cGVfZSB2ZGVjX3R5cGUpOworCitpbnQgcmVnaXN0ZXJfdmRlY19jbGtfc2V0dGluZyhpbnQgY3B1dHlwZVtdLAorCXN0cnVjdCBjbGtfc2V0X3NldHRpbmcgKnBfc2V0aW5nLCBpbnQgc2l6ZSk7CisKK2ludCB1bnJlZ2lzdGVyX3ZkZWNfY2xrX3NldHRpbmcodm9pZCk7CisKKyNpZmRlZiBJTkNMVURFX0ZST01fQVJDSF9DTEtfTUdSCitzdGF0aWMgc3RydWN0IGNoaXBfdmRlY19jbGtfcyB2ZGVjX2Nsa19tZ3IgX19pbml0ZGF0YSA9IHsKKwkuY2xvY2tfaW5pdCA9IHZkZWNfY2xvY2tfaW5pdCwKKwkuY2xvY2tfc2V0ID0gdmRlY19jbG9ja19zZXQsCisJLmNsb2NrX29uID0gdmRlY19jbG9ja19vbiwKKwkuY2xvY2tfb2ZmID0gdmRlY19jbG9ja19vZmYsCisJLmNsb2NrX2dldCA9IHZkZWNfY2xvY2tfZ2V0LAorfTsKKworI2lmZGVmIFZERUNfSEFTX1ZERUMyCitzdGF0aWMgc3RydWN0IGNoaXBfdmRlY19jbGtfcyB2ZGVjMl9jbGtfbWdyIF9faW5pdGRhdGEgPSB7CisJLmNsb2NrX3NldCA9IHZkZWMyX2Nsb2NrX3NldCwKKwkuY2xvY2tfb24gPSB2ZGVjMl9jbG9ja19vbiwKKwkuY2xvY2tfb2ZmID0gdmRlYzJfY2xvY2tfb2ZmLAorCS5jbG9ja19nZXQgPSB2ZGVjX2Nsb2NrX2dldCwKK307CisjZW5kaWYKKworI2lmZGVmIFZERUNfSEFTX0hFVkMKK3N0YXRpYyBzdHJ1Y3QgY2hpcF92ZGVjX2Nsa19zIHZkZWNfaGV2Y19jbGtfbWdyIF9faW5pdGRhdGEgPSB7CisJLmNsb2NrX2luaXQgPSBoZXZjX2Nsb2NrX2luaXQsCisJLmNsb2NrX3NldCA9IGhldmNfY2xvY2tfc2V0LAorCS5jbG9ja19vbiA9IGhldmNfY2xvY2tfb24sCisJLmNsb2NrX29mZiA9IGhldmNfY2xvY2tfb2ZmLAorCS5jbG9ja19nZXQgPSB2ZGVjX2Nsb2NrX2dldCwKK307CitzdGF0aWMgc3RydWN0IGNoaXBfdmRlY19jbGtfcyB2ZGVjX2hldmNfYmFja19jbGtfbWdyIF9faW5pdGRhdGEgPSB7CisgICAgICAgIC5jbG9ja19pbml0ID0gaGV2Y19iYWNrX2Nsb2NrX2luaXQsCisgICAgICAgIC5jbG9ja19zZXQgPSBoZXZjX2JhY2tfY2xvY2tfc2V0LAorICAgICAgICAuY2xvY2tfb24gPSBoZXZjX2JhY2tfY2xvY2tfb24sCisgICAgICAgIC5jbG9ja19vZmYgPSBoZXZjX2JhY2tfY2xvY2tfb2ZmLAorICAgICAgICAuY2xvY2tfZ2V0ID0gdmRlY19jbG9ja19nZXQsCit9OworI2VuZGlmCisKKyNpZmRlZiBWREVDX0hBU19WREVDX0hDT0RFQworc3RhdGljIHN0cnVjdCBjaGlwX3ZkZWNfY2xrX3MgdmRlY19oY29kZWNfY2xrX21nciBfX2luaXRkYXRhID0geworCS5jbG9ja19zZXQgPSBoY29kZWNfY2xvY2tfc2V0LAorCS5jbG9ja19vbiA9IGhjb2RlY19jbG9ja19vbiwKKwkuY2xvY2tfb2ZmID0gaGNvZGVjX2Nsb2NrX29mZiwKKwkuY2xvY2tfZ2V0ID0gdmRlY19jbG9ja19nZXQsCit9OworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IHZkZWNfaW5pdF9jbGsodm9pZCkKK3sKKwlpbnQgY3B1c1tdID0gQ0xLX0ZPUl9DUFU7CisKKwlyZWdpc3Rlcl92ZGVjX2Nsa19tZ3IoY3B1cywgVkRFQ18xLCAmdmRlY19jbGtfbWdyKTsKKyNpZmRlZiBWREVDX0hBU19WREVDMgorCXJlZ2lzdGVyX3ZkZWNfY2xrX21ncihjcHVzLCBWREVDXzIsICZ2ZGVjMl9jbGtfbWdyKTsKKyNlbmRpZgorI2lmZGVmIFZERUNfSEFTX0hFVkMKKwlyZWdpc3Rlcl92ZGVjX2Nsa19tZ3IoY3B1cywgVkRFQ19IRVZDLCAmdmRlY19oZXZjX2Nsa19tZ3IpOworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpCisJCXJlZ2lzdGVyX3ZkZWNfY2xrX21ncihjcHVzLCBWREVDX0hFVkNCLCAmdmRlY19oZXZjX2JhY2tfY2xrX21ncik7CisjZW5kaWYKKyNpZmRlZiBWREVDX0hBU19WREVDX0hDT0RFQworCXJlZ2lzdGVyX3ZkZWNfY2xrX21ncihjcHVzLCBWREVDX0hDT0RFQywgJnZkZWNfaGNvZGVjX2Nsa19tZ3IpOworI2VuZGlmCisKKyNpZmRlZiBWREVDX0hBU19DTEtfU0VUVElOR1MKKwlyZWdpc3Rlcl92ZGVjX2Nsa19zZXR0aW5nKGNwdXMsCisJCWNsa3NfZm9yX2Zvcm1hdHMsIHNpemVvZihjbGtzX2Zvcl9mb3JtYXRzKSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHZkZWNfY2xrX2V4aXQodm9pZCkKK3sKKwkJdW5yZWdpc3Rlcl92ZGVjX2Nsa19tZ3IoVkRFQ18xKTsKKyNpZmRlZiBWREVDX0hBU19WREVDMgorCQl1bnJlZ2lzdGVyX3ZkZWNfY2xrX21ncihWREVDXzIpOworI2VuZGlmCisjaWZkZWYgVkRFQ19IQVNfSEVWQworCQl1bnJlZ2lzdGVyX3ZkZWNfY2xrX21ncihWREVDX0hFVkMpOworI2VuZGlmCisjaWZkZWYgVkRFQ19IQVNfVkRFQ19IQ09ERUMKKwkJdW5yZWdpc3Rlcl92ZGVjX2Nsa19tZ3IoVkRFQ19IQ09ERUMpOworI2VuZGlmCisjaWZkZWYgVkRFQ19IQVNfQ0xLX1NFVFRJTkdTCisJCXVucmVnaXN0ZXJfdmRlY19jbGtfc2V0dGluZygpOworI2VuZGlmCisJCXByX2luZm8oIm1lZGlhIGNsb2NrIGV4aXQuXG4iKTsKK30KKworI2RlZmluZSBBUkNIX1ZERUNfQ0xLX0lOSVQoKVwKKwkJbW9kdWxlX2luaXQodmRlY19pbml0X2NsaykKKworI2RlZmluZSBBUkNIX1ZERUNfQ0xLX0VYSVQoKVwKKwkJbW9kdWxlX2V4aXQodmRlY19jbGtfZXhpdCkKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTUxPR0lDIGNsayBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY29tbW9uL21lZGlhX2Nsb2NrL2Nsay9jbGtfcHJpdi5oIGIvZHJpdmVycy9jb21tb24vbWVkaWFfY2xvY2svY2xrL2Nsa19wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBiN2JlMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY29tbW9uL21lZGlhX2Nsb2NrL2Nsay9jbGtfcHJpdi5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvbWVkaWEvY29tbW9uL2FyY2gvY2xrL2Nsa19wcml2LmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBBTVBPUlRTX0NMS19QUklWX0hFQURFUgorI2RlZmluZSBBTVBPUlRTX0NMS19QUklWX0hFQURFUgorCitzdHJ1Y3QgY2xrX3NldCB7CisJdTMyIHdoX1hfZnBzOwkJLyogW3gqeSpmcHMgKi8KKwl1MzIgY2xrX01oejsJCS8qbWluIE1IWiAqLworfTsKKyNkZWZpbmUgTUFYX0NMS19TRVQgNgorc3RydWN0IGNsa19zZXRfc2V0dGluZyB7CisJc3RydWN0IGNsa19zZXQgc2V0W01BWF9DTEtfU0VUXTsKK307CisKK3N0cnVjdCBjaGlwX3ZkZWNfY2xrX3MgeworCWludCAoKmNsb2NrX2dldCkoZW51bSB2ZGVjX3R5cGVfZSBjb3JlKTsKKwlpbnQgKCpjbG9ja19pbml0KSh2b2lkKTsKKwlpbnQgKCpjbG9ja19zZXQpKGludCBjbGspOworCXZvaWQgKCpjbG9ja19vbikodm9pZCk7CisJdm9pZCAoKmNsb2NrX29mZikodm9pZCk7CisJdm9pZCAoKmNsb2NrX3ByZXBhcmVfc3dpdGNoKSh2b2lkKTsKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY29tbW9uL21lZGlhX2Nsb2NrL2Nsay9jbGtnMTIuYyBiL2RyaXZlcnMvY29tbW9uL21lZGlhX2Nsb2NrL2Nsay9jbGtnMTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDlkMTUwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jb21tb24vbWVkaWFfY2xvY2svY2xrL2Nsa2cxMi5jCkBAIC0wLDAgKzEsMTA3MSBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9tZWRpYS9jb21tb24vYXJjaC9jbGsvY2xrZ3guYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2RlZmluZSBERUJVRworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jbGsvZ3BfcGxsLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy92ZGVjX3JlZy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvYW1wb3J0c19jb25maWcuaD4KKyNpbmNsdWRlICIuLi8uLi8uLi9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWMuaCIKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3JlZ2lzdGVycy9yZWdpc3Rlci5oPgorI2luY2x1ZGUgImNsa19wcml2LmgiCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy9sb2cuaD4KKworI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvcmVnaXN0ZXJzL3JlZ2lzdGVyX29wcy5oPgorI2luY2x1ZGUgIi4uL3N3aXRjaC9hbXBvcnRzX2dhdGUuaCIKKyNpbmNsdWRlICIuLi8uLi9jaGlwcy9kZWNvZGVyX2NwdV92ZXJfaW5mby5oIgorCisjZGVmaW5lIE1IeiAoMTAwMDAwMCkKKyNkZWZpbmUgZGVidWdfcHJpbnQgcHJfaW5mbworI2RlZmluZSBUTDFfSEVWQ19NQVhfQ0xLICAoODAwKQorCisvLyNkZWZpbmUgIE5PX0NMS1RSRUUKKworLyogc2V0IGdwMCA2NDhNIHZkZWMgdXNlIGdwMCBjbGsqLworI2RlZmluZSBWREVDMV82NDhNKCkgXAorCVdSSVRFX0hISV9SRUdfQklUUyhISElfVkRFQ19DTEtfQ05UTCwgICg2IDw8IDkpIHwgKDApLCAwLCAxNikKKworI2RlZmluZSBIRVZDXzY0OE0oKSBcCisJV1JJVEVfSEhJX1JFR19CSVRTKEhISV9WREVDMl9DTEtfQ05UTCwgKDYgPDwgOSkgfCAoMCksIDE2LCAxNikKKworLypzZXQgZ3AwIDEyOTZNIHZkZWMgdXNlIGdwMCBjbGsgZGl2MiovCisjZGVmaW5lIFZERUMxXzY0OE1fRElWKCkgXAorCVdSSVRFX0hISV9SRUdfQklUUyhISElfVkRFQ19DTEtfQ05UTCwgICg2IDw8IDkpIHwgKDEpLCAwLCAxNikKKworI2RlZmluZSBIRVZDXzY0OE1fRElWKCkgXAorCVdSSVRFX0hISV9SRUdfQklUUyhISElfVkRFQzJfQ0xLX0NOVEwsICg2IDw8IDkpIHwgKDEpLCAxNiwgMTYpCisKKyNkZWZpbmUgVkRFQzFfV0lUSF9HUF9QTEwoKSBcCisJKChSRUFEX0hISV9SRUcoSEhJX1ZERUNfQ0xLX0NOVEwpICYgMHhlMDApID09IDB4YzAwKQorI2RlZmluZSBIRVZDX1dJVEhfR1BfUExMKCkgXAorCSgoUkVBRF9ISElfUkVHKEhISV9WREVDMl9DTEtfQ05UTCkgJiAweGUwMDAwMDApID09IDB4YzAwMDAwMCkKKworI2RlZmluZSBWREVDMV9DTE9DS19PTigpICBcCisJZG8geyBpZiAoaXNfbWVzb25fbThfY3B1KCkpIHsgXAorCQlXUklURV9ISElfUkVHX0JJVFMoSEhJX1ZERUNfQ0xLX0NOVEwsIDEsIDgsIDEpOyBcCisJCVdSSVRFX1ZSRUdfQklUUyhET1NfR0NMS19FTjAsIDB4M2ZmLCAwLCAxMCk7IFwKKwkJfSBlbHNlIHsgXAorCQlXUklURV9ISElfUkVHX0JJVFMoSEhJX1ZERUNfQ0xLX0NOVEwsIDEsIDgsIDEpOyBcCisJCVdSSVRFX0hISV9SRUdfQklUUyhISElfVkRFQzNfQ0xLX0NOVEwsIDAsIDE1LCAxKTsgXAorCQlXUklURV9ISElfUkVHX0JJVFMoSEhJX1ZERUMzX0NMS19DTlRMLCAwLCA4LCAxKTsgXAorCQlXUklURV9WUkVHX0JJVFMoRE9TX0dDTEtfRU4wLCAweDNmZiwgMCwgMTApOyBcCisJCX0gXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgVkRFQzJfQ0xPQ0tfT04oKSAgIGRvIHtcCisJCVdSSVRFX0hISV9SRUdfQklUUyhISElfVkRFQzJfQ0xLX0NOVEwsIDEsIDgsIDEpOyBcCisJCVdSSVRFX1ZSRUcoRE9TX0dDTEtfRU4xLCAweDNmZik7XAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgSENPREVDX0NMT0NLX09OKCkgIGRvIHtcCisJCVdSSVRFX0hISV9SRUdfQklUUyhISElfVkRFQ19DTEtfQ05UTCwgMSwgMjQsIDEpOyBcCisJCVdSSVRFX1ZSRUdfQklUUyhET1NfR0NMS19FTjAsIDB4N2ZmZiwgMTIsIDE1KTtcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSEVWQ19DTE9DS19PTigpICAgIGRvIHtcCisJCVdSSVRFX0hISV9SRUdfQklUUyhISElfVkRFQzJfQ0xLX0NOVEwsIDEsIDI0LCAxKTsgXAorCQlXUklURV9ISElfUkVHX0JJVFMoSEhJX1ZERUMyX0NMS19DTlRMLCAxLCA4LCAxKTsgXAorCQlXUklURV9ISElfUkVHX0JJVFMoSEhJX1ZERUM0X0NMS19DTlRMLCAwLCAzMSwgMSk7IFwKKwkJV1JJVEVfSEhJX1JFR19CSVRTKEhISV9WREVDNF9DTEtfQ05UTCwgMCwgMTUsIDEpOyBcCisJCVdSSVRFX0hISV9SRUdfQklUUyhISElfVkRFQzRfQ0xLX0NOVEwsIDAsIDI0LCAxKTsgXAorCQlXUklURV9WUkVHKERPU19HQ0xLX0VOMywgMHhmZmZmZmZmZik7XAorCX0gd2hpbGUgKDApCisjZGVmaW5lIFZERUMxX1NBRkVfQ0xPQ0soKSBkbyB7XAorCVdSSVRFX0hISV9SRUdfQklUUyhISElfVkRFQzNfQ0xLX0NOVEwsIFwKKwkJUkVBRF9ISElfUkVHKEhISV9WREVDX0NMS19DTlRMKSAmIDB4N2YsIDAsIDcpOyBcCisJV1JJVEVfSEhJX1JFR19CSVRTKEhISV9WREVDM19DTEtfQ05UTCwgMSwgOCwgMSk7IFwKKwlXUklURV9ISElfUkVHX0JJVFMoSEhJX1ZERUMzX0NMS19DTlRMLCAxLCAxNSwgMSk7XAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgVkRFQzFfQ0xPQ0tfT0ZGKCkgIFwKKwlXUklURV9ISElfUkVHX0JJVFMoSEhJX1ZERUNfQ0xLX0NOVEwsICAwLCA4LCAxKQorI2RlZmluZSBWREVDMl9DTE9DS19PRkYoKSAgXAorCVdSSVRFX0hISV9SRUdfQklUUyhISElfVkRFQzJfQ0xLX0NOVEwsIDAsIDgsIDEpCisjZGVmaW5lIEhDT0RFQ19DTE9DS19PRkYoKSBcCisJV1JJVEVfSEhJX1JFR19CSVRTKEhISV9WREVDX0NMS19DTlRMLCAwLCAyNCwgMSkKKyNkZWZpbmUgSEVWQ19TQUZFX0NMT0NLKCkgIGRvIHsgXAorCVdSSVRFX0hISV9SRUdfQklUUyhISElfVkRFQzRfQ0xLX0NOVEwsIFwKKwkJKFJFQURfSEhJX1JFRyhISElfVkRFQzJfQ0xLX0NOVEwpID4+IDE2KSAmIDB4N2YsIDE2LCA3KTtcCisJV1JJVEVfSEhJX1JFR19CSVRTKEhISV9WREVDNF9DTEtfQ05UTCwgXAorCQkoUkVBRF9ISElfUkVHKEhISV9WREVDMl9DTEtfQ05UTCkgPj4gMjUpICYgMHg3ZiwgMjUsIDcpO1wKKwlXUklURV9ISElfUkVHX0JJVFMoSEhJX1ZERUM0X0NMS19DTlRMLCAxLCAyNCwgMSk7IFwKKwlXUklURV9ISElfUkVHX0JJVFMoSEhJX1ZERUM0X0NMS19DTlRMLCAxLCAzMSwgMSk7XAorCVdSSVRFX0hISV9SRUdfQklUUyhISElfVkRFQzRfQ0xLX0NOVEwsIDEsIDE1LCAxKTtcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBIRVZDX0NMT0NLX09GRigpICBkbyB7XAorCVdSSVRFX0hISV9SRUdfQklUUyhISElfVkRFQzJfQ0xLX0NOVEwsIDAsIDI0LCAxKTtcCisJV1JJVEVfSEhJX1JFR19CSVRTKEhISV9WREVDMl9DTEtfQ05UTCwgMCwgOCwgMSk7XAorfXdoaWxlKDApCisKK3N0YXRpYyBpbnQgY2xvY2tfcmVhbF9jbGtbVkRFQ19NQVggKyAxXTsKKworc3RhdGljIHVuc2lnbmVkIGludCBzZXRfZnJxX2VuYWJsZSwgdmRlY19mcnEsIGhldmNfZnJxLCBoZXZjYl9mcnE7CisKKyNpZmRlZiBOT19DTEtUUkVFCitzdGF0aWMgc3RydWN0IGdwX3BsbF91c2VyX2hhbmRsZV9zICpncF9wbGxfdXNlcl92ZGVjLCAqZ3BfcGxsX3VzZXJfaGV2YzsKK3N0YXRpYyBib29sIGlzX2dwMF9kaXYyID0gdHJ1ZTsKKworc3RhdGljIGludCBncF9wbGxfdXNlcl9jYl92ZGVjKHN0cnVjdCBncF9wbGxfdXNlcl9oYW5kbGVfcyAqdXNlciwKKwkJCWludCBldmVudCkKK3sKKwlkZWJ1Z19wcmludCgiZ3BfcGxsX3VzZXJfY2JfdmRlYyBjYWxsXG4iKTsKKwlpZiAoZXZlbnQgPT0gR1BfUExMX1VTRVJfRVZFTlRfR1JBTlQpIHsKKwkJc3RydWN0IGNsayAqY2xrID0gY2xrX2dldChOVUxMLCAiZ3AwX3BsbCIpOworCQlpZiAoIUlTX0VSUihjbGspKSB7CisJCQlpZiAoaXNfZ3AwX2RpdjIpCisJCQkJY2xrX3NldF9yYXRlKGNsaywgMTI5NjAwMDAwMFVMKTsKKwkJCWVsc2UKKwkJCQljbGtfc2V0X3JhdGUoY2xrLCA2NDgwMDAwMDBVTCk7CisJCQlWREVDMV9TQUZFX0NMT0NLKCk7CisJCQlWREVDMV9DTE9DS19PRkYoKTsKKwkJCWlmIChpc19ncDBfZGl2MikKKwkJCQlWREVDMV82NDhNX0RJVigpOworCQkJZWxzZQorCQkJCVZERUMxXzY0OE0oKTsKKworCQkJVkRFQzFfQ0xPQ0tfT04oKTsKKwkJCWRlYnVnX3ByaW50KCJncF9wbGxfdXNlcl9jYl92ZGVjIGNhbGwgc2V0XG4iKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBncF9wbGxfdXNlcl9jYl9oZXZjKHN0cnVjdCBncF9wbGxfdXNlcl9oYW5kbGVfcyAqdXNlciwKKwkJCWludCBldmVudCkKK3sKKwlkZWJ1Z19wcmludCgiZ3BfcGxsX3VzZXJfY2JfaGV2YyBjYWxsYmFja1xuIik7CisJaWYgKGV2ZW50ID09IEdQX1BMTF9VU0VSX0VWRU5UX0dSQU5UKSB7CisJCXN0cnVjdCBjbGsgKmNsayA9IGNsa19nZXQoTlVMTCwgImdwMF9wbGwiKTsKKwkJaWYgKCFJU19FUlIoY2xrKSkgeworCQkJaWYgKGlzX2dwMF9kaXYyKQorCQkJCWNsa19zZXRfcmF0ZShjbGssIDEyOTYwMDAwMDBVTCk7CisJCQllbHNlCisJCQkJY2xrX3NldF9yYXRlKGNsaywgNjQ4MDAwMDAwVUwpOworLy8JCQlIRVZDX1NBRkVfQ0xPQ0soKTsKKwkJCUhFVkNfQ0xPQ0tfT0ZGKCk7CisJCQlpZiAoaXNfZ3AwX2RpdjIpCisJCQkJSEVWQ182NDhNX0RJVigpOworCQkJZWxzZQorCQkJCUhFVkNfNjQ4TSgpOworCQkJSEVWQ19DTE9DS19PTigpOworCQkJZGVidWdfcHJpbnQoImdwX3BsbF91c2VyX2NiX2hldmMgY2FsbGJhY2syXG4iKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisKKyNlbmRpZgorCitzdHJ1Y3QgY2xrX211eF9zIHsKKwlzdHJ1Y3QgZ2F0ZV9zd2l0Y2hfbm9kZSAqdmRlY19tdXhfbm9kZTsKKwlzdHJ1Y3QgZ2F0ZV9zd2l0Y2hfbm9kZSAqaGNvZGVjX211eF9ub2RlOworCXN0cnVjdCBnYXRlX3N3aXRjaF9ub2RlICpoZXZjX211eF9ub2RlOworCXN0cnVjdCBnYXRlX3N3aXRjaF9ub2RlICpoZXZjX2JhY2tfbXV4X25vZGU7Cit9OworCitzdHJ1Y3QgY2xrX211eF9zIGdjbGs7CisKK3ZvaWQgdmRlYzFfc2V0X2NsayhpbnQgc291cmNlLCBpbnQgZGl2KQoreworCXByX2RlYnVnKCJ2ZGVjMV9zZXRfY2xrICVkLCAlZFxuIiwgc291cmNlLCBkaXYpOworCVdSSVRFX0hISV9SRUdfQklUUyhISElfVkRFQ19DTEtfQ05UTCwgKHNvdXJjZSA8PCA5KSB8IChkaXYgLSAxKSwgMCwgMTYpOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjMV9zZXRfY2xrKTsKKwordm9pZCBoY29kZWNfc2V0X2NsayhpbnQgc291cmNlLCBpbnQgZGl2KQoreworCVdSSVRFX0hISV9SRUdfQklUUyhISElfVkRFQ19DTEtfQ05UTCwKKwkJKHNvdXJjZSA8PCA5KSB8IChkaXYgLSAxKSwgMTYsIDE2KTsKK30KK0VYUE9SVF9TWU1CT0woaGNvZGVjX3NldF9jbGspOworCit2b2lkIHZkZWMyX3NldF9jbGsoaW50IHNvdXJjZSwgaW50IGRpdikKK3sKKwlXUklURV9ISElfUkVHX0JJVFMoSEhJX1ZERUMyX0NMS19DTlRMLAorCQkoc291cmNlIDw8IDkpIHwgKGRpdiAtIDEpLCAwLCAxNik7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWMyX3NldF9jbGspOworCisvL2V4dGVybiB1aW50IGZvcmNlX2hldmNfY2xvY2tfY250bDsKK3VpbnQgZm9yY2VfaGV2Y19jbG9ja19jbnRsID0gMDsKK3ZvaWQgaGV2Y19zZXRfY2xrKGludCBzb3VyY2UsIGludCBkaXYpCit7CisJaWYgKGZvcmNlX2hldmNfY2xvY2tfY250bCkgeworCQlwcl9pbmZvKCIlcywgd3JpdGUgZm9yY2UgY2xvY2sgY250bCAleFxuIiwgX19mdW5jX18sIGZvcmNlX2hldmNfY2xvY2tfY250bCk7CisJCVdSSVRFX0hISV9SRUcoSEhJX1ZERUMyX0NMS19DTlRMLCBmb3JjZV9oZXZjX2Nsb2NrX2NudGwpOworCX0gZWxzZSB7CisJCXByX2RlYnVnKCJoZXZjX3NldF9jbGsgJWQsICVkXG4iLCBzb3VyY2UsIGRpdik7CisJCVdSSVRFX0hISV9SRUdfQklUUyhISElfVkRFQzJfQ0xLX0NOVEwsCisJCQkoc291cmNlIDw8IDkpIHwgKGRpdiAtIDEpLCAxNiwgMTYpOworCQlXUklURV9ISElfUkVHX0JJVFMoSEhJX1ZERUMyX0NMS19DTlRMLCAoc291cmNlIDw8IDkpIHwgKGRpdiAtIDEpLCAwLCAxNik7CisJfQorfQorRVhQT1JUX1NZTUJPTChoZXZjX3NldF9jbGspOworCit2b2lkIHZkZWNfZ2V0X2Nsa19zb3VyY2UoaW50IGNsaywgaW50ICpzb3VyY2UsIGludCAqZGl2LCBpbnQgKnJjbGspCit7CisjZGVmaW5lIHNvdXJjZV9kaXY0ICgwKQorI2RlZmluZSBzb3VyY2VfZGl2MyAoMSkKKyNkZWZpbmUgc291cmNlX2RpdjUgKDIpCisjZGVmaW5lIHNvdXJjZV9kaXY3ICgzKQorCWlmIChjbGsgPiA1MDApIHsKKwkJKnNvdXJjZSA9IHNvdXJjZV9kaXYzOworCQkqZGl2ID0gMTsKKwkJKnJjbGsgPSA2Njc7CisJfSBlbHNlIGlmIChjbGsgPj0gNTAwKSB7CisJCSpzb3VyY2UgPSBzb3VyY2VfZGl2NDsKKwkJKmRpdiA9IDE7CisJCSpyY2xrID0gNTAwOworCX0gZWxzZSBpZiAoY2xrID49IDQwMCkgeworCQkqc291cmNlID0gc291cmNlX2RpdjU7CisJCSpkaXYgPSAxOworCQkqcmNsayA9IDQwMDsKKwl9IGVsc2UgaWYgKGNsayA+PSAzMzMpIHsKKwkJKnNvdXJjZSA9IHNvdXJjZV9kaXYzOworCQkqZGl2ID0gMjsKKwkJKnJjbGsgPSAzMzM7CisJfSBlbHNlIGlmIChjbGsgPj0gMjAwKSB7CisJCSpzb3VyY2UgPSBzb3VyY2VfZGl2NTsKKwkJKmRpdiA9IDI7CisJCSpyY2xrID0gMjAwOworCX0gZWxzZSBpZiAoY2xrID49IDE2NikgeworCQkqc291cmNlID0gc291cmNlX2RpdjQ7CisJCSpkaXYgPSAzOworCQkqcmNsayA9IDE2NjsKKwl9IGVsc2UgaWYgKGNsayA+PSAxMzMpIHsKKwkJKnNvdXJjZSA9IHNvdXJjZV9kaXY1OworCQkqZGl2ID0gMzsKKwkJKnJjbGsgPSAxMzM7CisJfSBlbHNlIGlmIChjbGsgPj0gMTAwKSB7CisJCSpzb3VyY2UgPSBzb3VyY2VfZGl2NTsKKwkJKmRpdiA9IDQ7CisJCSpyY2xrID0gMTAwOworCX0gZWxzZSBpZiAoY2xrID49IDUwKSB7CisJCSpzb3VyY2UgPSBzb3VyY2VfZGl2NTsKKwkJKmRpdiA9IDg7CisJCSpyY2xrID0gNTA7CisJfSBlbHNlIHsKKwkJKnNvdXJjZSA9IHNvdXJjZV9kaXY1OworCQkqZGl2ID0gMjA7CisJCSpyY2xrID0gMTA7CisJfQorfQorRVhQT1JUX1NZTUJPTCh2ZGVjX2dldF9jbGtfc291cmNlKTsKKworCisvKgorICplbnVtIHZmb3JtYXRfZSB7CisgKglWRk9STUFUX01QRUcxMiA9IDAsCisgKglWRk9STUFUX01QRUc0LAorICoJVkZPUk1BVF9IMjY0LAorICoJVkZPUk1BVF9NSlBFRywKKyAqCVZGT1JNQVRfUkVBTCwKKyAqCVZGT1JNQVRfSlBFRywKKyAqCVZGT1JNQVRfVkMxLAorICoJVkZPUk1BVF9BVlMsCisgKglWRk9STUFUX1lVViwKKyAqCVZGT1JNQVRfSDI2NE1WQywKKyAqCVZGT1JNQVRfSDI2NF80SzJLLAorICoJVkZPUk1BVF9IRVZDLAorICoJVkZPUk1BVF9IMjY0X0VOQywKKyAqCVZGT1JNQVRfSlBFR19FTkMsCisgKglWRk9STUFUX1ZQOSwKKyAqCVZGT1JNQVRfTUFYCisgKn07CisgKnNhbXBsZToKKyAqe3sxMjgwKjcyMCozMCwgMTAwfSwgezE5MjAqMTA4MCozMCwgMTY2fSwgezE5MjAqMTA4MCo2MCwgMzMzfSwKKyAqCXs0MDk2KjIwNDgqMzAsIDYwMH0sIHs0MDk2KjIwNDgqNjAsIDYwMH0sIHtJTlRfTUFYLCA2MDB9LH0KKyAqbWVhbjoKKyAqd2lkdGggKiBoZWlnaHQgKiBmcHMKKyAqPDcyMHAzMGZwcwkJCQkJCWNsaz0xMDBNSFoKKyAqPj03MjBwMzBmcHMgJiA8IDEwODBwMzBmcHMJCWNsaz0xNjZNSFoKKyAqPj0xMDgwcCAzMGZwcyAmIDwgMTA4MHA2MGZwcwljbGs9MzMzTUhaCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrX3NldF9zZXR0aW5nIGNsa3NfZm9yX2Zvcm1hdHNbXSA9IHsKKwl7CQkJLypbVkZPUk1BVF9NUEVHMTJdICovCisJCQl7ezEyODAgKiA3MjAgKiAzMCwgMTAwfSwgezE5MjAgKiAxMDgwICogMzAsIDE2Nn0sCisJCQkJezE5MjAgKiAxMDgwICogNjAsIDMzM30sCisJCQkJezQwOTYgKiAyMDQ4ICogMzAsIDYwMH0sIHs0MDk2ICogMjA0OCAqIDYwLAorCQkJCQkJNjAwfSwge0lOVF9NQVgsIDYwMH0sCisJCQkJfQorCQl9LAorCXsJCQkvKltWRk9STUFUX01QRUc0XSAqLworCQkJe3sxMjgwICogNzIwICogMzAsIDEwMH0sIHsxOTIwICogMTA4MCAqIDMwLCAxNjZ9LAorCQkJCXsxOTIwICogMTA4MCAqIDYwLCAzMzN9LAorCQkJCXs0MDk2ICogMjA0OCAqIDMwLCA2MDB9LCB7NDA5NiAqIDIwNDggKiA2MCwKKwkJCQkJCTYwMH0sIHtJTlRfTUFYLCA2MDB9LAorCQkJCX0KKwkJfSwKKwl7CQkJLypbVkZPUk1BVF9IMjY0XSAqLworCQkJe3sxMjgwICogNzIwICogMzAsIDEwMH0sIHsxOTIwICogMTA4MCAqIDIxLCAxNjZ9LAorCQkJCXsxOTIwICogMTA4MCAqIDMwLCAzMzN9LAorCQkJCXsxOTIwICogMTA4MCAqIDYwLCA2MDB9LCB7NDA5NiAqIDIwNDggKiA2MCwKKwkJCQkJCTYwMH0sIHtJTlRfTUFYLCA2MDB9LAorCQkJCX0KKwkJfSwKKwl7CQkJLypbVkZPUk1BVF9NSlBFR10gKi8KKwkJCXt7MTI4MCAqIDcyMCAqIDMwLCAyMDB9LCB7MTkyMCAqIDEwODAgKiAzMCwgMjAwfSwKKwkJCQl7MTkyMCAqIDEwODAgKiA2MCwgMzMzfSwKKwkJCQl7NDA5NiAqIDIwNDggKiAzMCwgNjAwfSwgezQwOTYgKiAyMDQ4ICogNjAsCisJCQkJCQk2MDB9LCB7SU5UX01BWCwgNjAwfSwKKwkJCQl9CisJCX0sCisJewkJCS8qW1ZGT1JNQVRfUkVBTF0gKi8KKwkJCXt7MTI4MCAqIDcyMCAqIDIwLCAyMDB9LCB7MTkyMCAqIDEwODAgKiAzMCwgNTAwfSwKKwkJCQl7MTkyMCAqIDEwODAgKiA2MCwgNTAwfSwKKwkJCQl7NDA5NiAqIDIwNDggKiAzMCwgNjAwfSwgezQwOTYgKiAyMDQ4ICogNjAsCisJCQkJCQk2MDB9LCB7SU5UX01BWCwgNjAwfSwKKwkJCQl9CisJCX0sCisJewkJCS8qW1ZGT1JNQVRfSlBFR10gKi8KKwkJCXt7MTI4MCAqIDcyMCAqIDMwLCAxMDB9LCB7MTkyMCAqIDEwODAgKiAzMCwgMTY2fSwKKwkJCQl7MTkyMCAqIDEwODAgKiA2MCwgMzMzfSwKKwkJCQl7NDA5NiAqIDIwNDggKiAzMCwgNjAwfSwgezQwOTYgKiAyMDQ4ICogNjAsCisJCQkJCQk2MDB9LCB7SU5UX01BWCwgNjAwfSwKKwkJCQl9CisJCX0sCisJewkJCS8qW1ZGT1JNQVRfVkMxXSAqLworCQkJe3sxMjgwICogNzIwICogMzAsIDEwMH0sIHsxOTIwICogMTA4MCAqIDMwLCAxNjZ9LAorCQkJCXsxOTIwICogMTA4MCAqIDYwLCAzMzN9LAorCQkJCXs0MDk2ICogMjA0OCAqIDMwLCA2MDB9LCB7NDA5NiAqIDIwNDggKiA2MCwKKwkJCQkJCTYwMH0sIHtJTlRfTUFYLCA2MDB9LAorCQkJCX0KKwkJfSwKKwl7CQkJLypbVkZPUk1BVF9BVlNdICovCisJCQl7ezEyODAgKiA3MjAgKiAzMCwgMTAwfSwgezE5MjAgKiAxMDgwICogMzAsIDE2Nn0sCisJCQkJezE5MjAgKiAxMDgwICogNjAsIDMzM30sCisJCQkJezQwOTYgKiAyMDQ4ICogMzAsIDYwMH0sIHs0MDk2ICogMjA0OCAqIDYwLAorCQkJCQkJNjAwfSwge0lOVF9NQVgsIDYwMH0sCisJCQkJfQorCQl9LAorCXsJCQkvKltWRk9STUFUX1lVVl0gKi8KKwkJCXt7MTI4MCAqIDcyMCAqIDMwLCAxMDB9LCB7SU5UX01BWCwgMTAwfSwKKwkJCQl7MCwgMH0sIHswLCAwfSwgezAsIDB9LCB7MCwgMH0sCisJCQkJfQorCQl9LAorCXsJCQkvKlZGT1JNQVRfSDI2NE1WQyAqLworCQkJe3sxMjgwICogNzIwICogMzAsIDMzM30sIHsxOTIwICogMTA4MCAqIDMwLCAzMzN9LAorCQkJCXs0MDk2ICogMjA0OCAqIDYwLCA2MDB9LAorCQkJCXtJTlRfTUFYLCA2MzB9LCB7MCwgMH0sIHswLCAwfSwKKwkJCQl9CisJCX0sCisJewkJCS8qVkZPUk1BVF9IMjY0XzRLMksgKi8KKwkJCXt7MTI4MCAqIDcyMCAqIDMwLCA2MDB9LCB7NDA5NiAqIDIwNDggKiA2MCwgNjMwfSwKKwkJCQl7SU5UX01BWCwgNjMwfSwKKwkJCQl7MCwgMH0sIHswLCAwfSwgezAsIDB9LAorCQkJCX0KKwkJfSwKKwl7CQkJLypWRk9STUFUX0hFVkMgKi8KKwkJCXt7MTI4MCAqIDcyMCAqIDMwLCAxMDB9LCB7MTkyMCAqIDEwODAgKiA2MCwgNjAwfSwKKwkJCQl7NDA5NiAqIDIwNDggKiAyNSwgNjMwfSwKKwkJCQl7NDA5NiAqIDIwNDggKiAzMCwgNjMwfSwgezQwOTYgKiAyMDQ4ICogNjAsCisJCQkJCQk2MzB9LCB7SU5UX01BWCwgNjMwfSwKKwkJCQl9CisJCX0sCisJewkJCS8qVkZPUk1BVF9IMjY0X0VOQyAqLworCQkJe3sxMjgwICogNzIwICogMzAsIDB9LCB7SU5UX01BWCwgMH0sCisJCQkJezAsIDB9LCB7MCwgMH0sIHswLCAwfSwgezAsIDB9LAorCQkJCX0KKwkJfSwKKwl7CQkJLypWRk9STUFUX0pQRUdfRU5DICovCisJCQl7ezEyODAgKiA3MjAgKiAzMCwgMH0sIHtJTlRfTUFYLCAwfSwKKwkJCQl7MCwgMH0sIHswLCAwfSwgezAsIDB9LCB7MCwgMH0sCisJCQkJfQorCQl9LAorCXsJCQkvKlZGT1JNQVRfVlA5ICovCisJCQl7ezEyODAgKiA3MjAgKiAzMCwgMTAwfSwgezE5MjAgKiAxMDgwICogMzAsIDEwMH0sCisJCQkJezE5MjAgKiAxMDgwICogNjAsIDE2Nn0sCisJCQkJezQwOTYgKiAyMDQ4ICogMzAsIDMzM30sIHs0MDk2ICogMjA0OCAqIDYwLAorCQkJCQkJNjMwfSwge0lOVF9NQVgsIDYzMH0sCisJCQkJfQorCQl9LAorCXsvKlZGT1JNQVRfQVZTMiovCisJCXt7MTI4MCo3MjAqMzAsIDEwMH0sIHsxOTIwKjEwODAqMzAsIDEwMH0sCisJCXsxOTIwKjEwODAqNjAsIDE2Nn0sIHs0MDk2KjIwNDgqMzAsIDMzM30sCisJCXs0MDk2KjIwNDgqNjAsIDYzMH0sIHtJTlRfTUFYLCA2MzB9LH0KKwl9LAorCXsvKlZGT1JNQVRfQVYxKi8KKwkJe3sxMjgwKjcyMCozMCwgMTAwfSwgezE5MjAqMTA4MCozMCwgMTAwfSwKKwkJezE5MjAqMTA4MCo2MCwgMTY2fSwgezQwOTYqMjA0OCozMCwgMzMzfSwKKwkJezQwOTYqMjA0OCo2MCwgNjMwfSwge0lOVF9NQVgsIDYzMH0sfQorCX0sCisKK307CisKK3ZvaWQgc2V0X2Nsb2NrX2dhdGUoc3RydWN0IGdhdGVfc3dpdGNoX25vZGUgKm5vZGVzLCBpbnQgbnVtKQoreworCXN0cnVjdCBnYXRlX3N3aXRjaF9ub2RlICpub2RlID0gTlVMTDsKKwljaGFyICpoZXZjX211eF9zdHIgPSBOVUxMOworCisJaWYgKChnZXRfY3B1X21ham9yX2lkKCkgPCBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU0MyKSB8fAorCQkoZ2V0X2NwdV9tYWpvcl9pZCgpID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNSkgfHwKKwkJKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDVEKSkKKwkJaGV2Y19tdXhfc3RyID0gImNsa19oZXZjX211eCI7CisJZWxzZQorCQloZXZjX211eF9zdHIgPSAiY2xrX2hldmNmX211eCI7CisKKwlkbyB7CisJCW5vZGUgPSAmbm9kZXNbbnVtIC0gMV07CisJCWlmIChJU19FUlJfT1JfTlVMTChub2RlKSB8fCAoSVNfRVJSX09SX05VTEwobm9kZS0+Y2xrKSkpCisJCQlwcl9pbmZvKCJnZXQgbXV4IGNsayBlcnIuXG4iKTsKKworCQlpZiAoIXN0cmNtcChub2RlLT5uYW1lLCAiY2xrX3ZkZWNfbXV4IikpCisJCQlnY2xrLnZkZWNfbXV4X25vZGUgPSBub2RlOworCQllbHNlIGlmICghc3RyY21wKG5vZGUtPm5hbWUsICJjbGtfaGNvZGVjX211eCIpKQorCQkJZ2Nsay5oY29kZWNfbXV4X25vZGUgPSBub2RlOworCQllbHNlIGlmICghc3RyY21wKG5vZGUtPm5hbWUsIGhldmNfbXV4X3N0cikpCisJCQkJZ2Nsay5oZXZjX211eF9ub2RlID0gbm9kZTsKKwkJZWxzZSBpZiAoIXN0cmNtcChub2RlLT5uYW1lLCAiY2xrX2hldmNiX211eCIpKQorCQkJZ2Nsay5oZXZjX2JhY2tfbXV4X25vZGUgPSBub2RlOworCX0gd2hpbGUoLS1udW0pOworfQorRVhQT1JUX1NZTUJPTChzZXRfY2xvY2tfZ2F0ZSk7CisjaWZkZWYgTk9fQ0xLVFJFRQoraW50IHZkZWNfc2V0X2NsayhpbnQgZGVjLCBpbnQgc291cmNlLCBpbnQgZGl2KQoreworCisJaWYgKGRlYyA9PSBWREVDXzEpCisJCXZkZWMxX3NldF9jbGsoc291cmNlLCBkaXYpOworCWVsc2UgaWYgKGRlYyA9PSBWREVDXzIpCisJCXZkZWMyX3NldF9jbGsoc291cmNlLCBkaXYpOworCWVsc2UgaWYgKGRlYyA9PSBWREVDX0hFVkMpCisJCWhldmNfc2V0X2Nsayhzb3VyY2UsIGRpdik7CisJZWxzZSBpZiAoZGVjID09IFZERUNfSENPREVDKQorCQloY29kZWNfc2V0X2Nsayhzb3VyY2UsIGRpdik7CisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCitzdGF0aWMgaW50IHZkZWNfc2V0X2NsayhpbnQgZGVjLCBpbnQgcmF0ZSkKK3sKKwlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOworCisJc3dpdGNoIChkZWMpIHsKKwljYXNlIFZERUNfMToKKwkJY2xrID0gZ2Nsay52ZGVjX211eF9ub2RlLT5jbGs7CisJCVdSSVRFX1ZSRUdfQklUUyhET1NfR0NMS19FTjAsIDB4M2ZmLCAwLCAxMCk7CisJCWJyZWFrOworCisJY2FzZSBWREVDX0hDT0RFQzoKKwkJY2xrID0gZ2Nsay5oY29kZWNfbXV4X25vZGUtPmNsazsKKwkJV1JJVEVfVlJFR19CSVRTKERPU19HQ0xLX0VOMCwgMHg3ZmZmLCAxMiwgMTUpOworCQlicmVhazsKKworCWNhc2UgVkRFQ18yOgorCQljbGsgPSBnY2xrLnZkZWNfbXV4X25vZGUtPmNsazsKKwkJV1JJVEVfVlJFRyhET1NfR0NMS19FTjEsIDB4M2ZmKTsKKwkJYnJlYWs7CisKKwljYXNlIFZERUNfSEVWQzoKKwkJY2xrID0gZ2Nsay5oZXZjX211eF9ub2RlLT5jbGs7CisJCVdSSVRFX1ZSRUcoRE9TX0dDTEtfRU4zLCAweGZmZmZmZmZmKTsKKwkJYnJlYWs7CisKKwljYXNlIFZERUNfSEVWQ0I6CisJCWNsayA9IGdjbGsuaGV2Y19iYWNrX211eF9ub2RlLT5jbGs7CisJCVdSSVRFX1ZSRUcoRE9TX0dDTEtfRU4zLCAweGZmZmZmZmZmKTsKKwkJYnJlYWs7CisKKwljYXNlIFZERUNfTUFYOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByX2luZm8oImludmFpbGQgdmRlYyB0eXBlLlxuIik7CisJfQorCisJaWYgKElTX0VSUl9PUl9OVUxMKGNsaykpIHsKKwkJcHJfaW5mbygidGhlIG11eCBjbGsgZXJyLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwljbGtfc2V0X3JhdGUoY2xrLCByYXRlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZkZWNfY2xvY2tfaW5pdCh2b2lkKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYKKyNpZmRlZiBOT19DTEtUUkVFCitzdGF0aWMgaW50IHZkZWNfY2xvY2tfaW5pdCh2b2lkKQoreworCWdwX3BsbF91c2VyX3ZkZWMgPSBncF9wbGxfdXNlcl9yZWdpc3RlcigidmRlYyIsIDAsCisJCWdwX3BsbF91c2VyX2NiX3ZkZWMpOworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTCkKKwkJaXNfZ3AwX2RpdjIgPSBmYWxzZTsKKwllbHNlCisJCWlzX2dwMF9kaXYyID0gdHJ1ZTsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTCkgeworCQlwcl9pbmZvKCJ1c2VkIGZpeCBjbGsgZm9yIHZkZWMgY2xrIHNvdXJjZSFcbiIpOworCQkvL3VwZGF0ZV92ZGVjX2Nsa19jb25maWdfc2V0dGluZ3MoMSk7CisJfQorCXJldHVybiAoZ3BfcGxsX3VzZXJfdmRlYykgPyAwIDogLUVOT01FTTsKK30KKworCisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9jbGtfd2l0aF9jbGtfY29uZmlncygKKwlpbnQgY2xrLCBpbnQgKnNvdXJjZSwgaW50ICpkaXYsIGludCAqcmNsaykKK3sKKwl1bnNpZ25lZCBpbnQgY29uZmlnID0gMDsvL2dldF92ZGVjX2Nsa19jb25maWdfc2V0dGluZ3MoKTsKKworCWlmICghY29uZmlnKQorCQlyZXR1cm47CisJaWYgKGNvbmZpZyA+PSAxMCkgeworCQlpbnQgd2FudGNsazsKKwkJd2FudGNsayA9IGNvbmZpZzsKKwkJdmRlY19nZXRfY2xrX3NvdXJjZSh3YW50Y2xrLCBzb3VyY2UsIGRpdiwgcmNsayk7CisJfQorCXJldHVybjsKK30KKyNkZWZpbmUgTk9fR1AwX1BMTCAwLy8oZ2V0X3ZkZWNfY2xrX2NvbmZpZ19zZXR0aW5ncygpID09IDEpCisjZGVmaW5lIEFMV0FZU19HUDBfUExMIDAvLyhnZXRfdmRlY19jbGtfY29uZmlnX3NldHRpbmdzKCkgPT0gMikKKworI2RlZmluZSBOT19HUDBfUExMIDAvLyhnZXRfdmRlY19jbGtfY29uZmlnX3NldHRpbmdzKCkgPT0gMSkKKyNkZWZpbmUgQUxXQVlTX0dQMF9QTEwgMC8vKGdldF92ZGVjX2Nsa19jb25maWdfc2V0dGluZ3MoKSA9PSAyKQorCitzdGF0aWMgaW50IHZkZWNfY2xvY2tfc2V0KGludCBjbGspCit7CisJaW50IHVzZV9ncGxsID0gMDsKKwlpbnQgc291cmNlLCBkaXYsIHJjbGs7CisJaW50IGNsa19zZXRlZCA9IDA7CisJaW50IGdwX3BsbF93YWl0ID0gMDsKKwlpZiAoY2xrID09IDEpCisJCWNsayA9IDIwMDsKKwllbHNlIGlmIChjbGsgPT0gMikgeworCQlpZiAoY2xvY2tfcmVhbF9jbGtbVkRFQ18xXSAhPSA2NDgpCisJCQljbGsgPSA1MDA7CisJCWVsc2UKKwkJCWNsayA9IDY0ODsKKwl9IGVsc2UgaWYgKGNsayA9PSAwKSB7CisJCS8qdXNlZCBmb3IgcmVsZWFzZSBncCBwdWxsLgorCQkgICBpZiB1c2VkLCByZWxlYXNlIGl0LgorCQkgICBpZiBub3QgdXNlZCBncCBwbGwKKwkJICAgZG8gbm90aGluZy4KKwkJICovCisJCWlmIChjbG9ja19yZWFsX2Nsa1tWREVDXzFdID09IDY2NyB8fAorCQkgICAgKGNsb2NrX3JlYWxfY2xrW1ZERUNfMV0gPT0gNjQ4KSB8fAorCQkJY2xvY2tfcmVhbF9jbGtbVkRFQ18xXSA8PSAwKQorCQkJY2xrID0gMjAwOworCQllbHNlCisJCQljbGsgPSBjbG9ja19yZWFsX2Nsa1tWREVDXzFdOworCX0KKwl2ZGVjX2dldF9jbGtfc291cmNlKGNsaywgJnNvdXJjZSwgJmRpdiwgJnJjbGspOworCXVwZGF0ZV9jbGtfd2l0aF9jbGtfY29uZmlncyhjbGssICZzb3VyY2UsICZkaXYsICZyY2xrKTsKKworCWlmIChjbG9ja19yZWFsX2Nsa1tWREVDXzFdID09IHJjbGspCisJCXJldHVybiByY2xrOworCWlmIChOT19HUDBfUExMKSB7CisJCXVzZV9ncGxsID0gMDsKKwkJY2xrX3NldGVkID0gMDsKKwl9IGVsc2UgaWYgKChyY2xrID4gNTAwICYmIGNsayAhPSA2NjcpIHx8IEFMV0FZU19HUDBfUExMKSB7CisJCWlmIChjbG9ja19yZWFsX2Nsa1tWREVDXzFdID09IDY0OCkKKwkJCXJldHVybiA2NDg7CisJCXVzZV9ncGxsID0gMTsKKwkJZ3BfcGxsX3JlcXVlc3QoZ3BfcGxsX3VzZXJfdmRlYyk7CisJCXdoaWxlICghVkRFQzFfV0lUSF9HUF9QTEwoKSAmJiBncF9wbGxfd2FpdCsrIDwgMTAwMDAwMCkKKwkJCXVkZWxheSgxKTsKKwkJaWYgKFZERUMxX1dJVEhfR1BfUExMKCkpIHsKKwkJCWNsa19zZXRlZCA9IDE7CisJCQlyY2xrID0gNjQ4OworCQl9IGVsc2UgeworCQkJdXNlX2dwbGwgPSAwOworCQkJcmNsayA9IDY2NzsKKwkJCS8qZ3BfcHVsbCByZXF1ZXN0IGZhaWxlZCx1c2VkIGRlZmF1bHQgNTAwTWh6Ki8KKwkJCXByX2luZm8oImdldCBncCBwbGwgZmFpbGVkIHVzZWQgZml4IHB1bGxcbiIpOworCQl9CisJfQorCWlmICghY2xrX3NldGVkKSB7LyppZiA2NDggbm90IHNldCwqLworCQlWREVDMV9TQUZFX0NMT0NLKCk7CisJCVZERUMxX0NMT0NLX09GRigpOworCQl2ZGVjX3NldF9jbGsoVkRFQ18xLCBzb3VyY2UsIGRpdik7CisJCVZERUMxX0NMT0NLX09OKCk7CisJfQorCisJaWYgKCF1c2VfZ3BsbCkKKwkJZ3BfcGxsX3JlbGVhc2UoZ3BfcGxsX3VzZXJfdmRlYyk7CisJY2xvY2tfcmVhbF9jbGtbVkRFQ18xXSA9IHJjbGs7CisJZGVidWdfcHJpbnQoInZkZWNfY2xvY2tfc2V0IDIgdG8gJWRcbiIsIHJjbGspOworCXJldHVybiByY2xrOworfQorc3RhdGljIGludCBoZXZjX2Nsb2NrX2luaXQodm9pZCkKK3sKKwlncF9wbGxfdXNlcl9oZXZjID0gZ3BfcGxsX3VzZXJfcmVnaXN0ZXIoImhldmMiLCAwLAorCQlncF9wbGxfdXNlcl9jYl9oZXZjKTsKKworCXJldHVybiAoZ3BfcGxsX3VzZXJfaGV2YykgPyAwIDogLUVOT01FTTsKK30KK3N0YXRpYyBpbnQgaGV2Y19iYWNrX2Nsb2NrX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZXZjX2JhY2tfY2xvY2tfc2V0KGludCBjbGspCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGV2Y19jbG9ja19zZXQoaW50IGNsaykKK3sKKwlpbnQgdXNlX2dwbGwgPSAwOworCWludCBzb3VyY2UsIGRpdiwgcmNsazsKKwlpbnQgZ3BfcGxsX3dhaXQgPSAwOworCWludCBjbGtfc2V0ZWQgPSAwOworCisJZGVidWdfcHJpbnQoImhldmNfY2xvY2tfc2V0IDEgdG8gY2xrICVkXG4iLCBjbGspOworCWlmIChjbGsgPT0gMSkKKwkJY2xrID0gMjAwOworCWVsc2UgaWYgKGNsayA9PSAyKSB7CisJCWlmIChjbG9ja19yZWFsX2Nsa1tWREVDX0hFVkNdICE9IDY0OCkKKwkJCWNsayA9IDUwMDsKKwkJZWxzZQorCQkJY2xrID0gNjQ4OworCX0gZWxzZSBpZiAoY2xrID09IDApIHsKKwkJLyp1c2VkIGZvciByZWxlYXNlIGdwIHB1bGwuCisJCSAgIGlmIHVzZWQsIHJlbGVhc2UgaXQuCisJCSAgIGlmIG5vdCB1c2VkIGdwIHBsbAorCQkgICBkbyBub3RoaW5nLgorCQkgKi8KKwkJaWYgKChjbG9ja19yZWFsX2Nsa1tWREVDX0hFVkNdID09IDY2NykgfHwKKwkJCShjbG9ja19yZWFsX2Nsa1tWREVDX0hFVkNdID09IDY0OCkgfHwKKwkJCShjbG9ja19yZWFsX2Nsa1tWREVDX0hFVkNdIDw9IDApKQorCQkJY2xrID0gMjAwOworCQllbHNlCisJCQljbGsgPSBjbG9ja19yZWFsX2Nsa1tWREVDX0hFVkNdOworCX0KKwl2ZGVjX2dldF9jbGtfc291cmNlKGNsaywgJnNvdXJjZSwgJmRpdiwgJnJjbGspOworCXVwZGF0ZV9jbGtfd2l0aF9jbGtfY29uZmlncyhjbGssICZzb3VyY2UsICZkaXYsICZyY2xrKTsKKworCWlmIChyY2xrID09IGNsb2NrX3JlYWxfY2xrW1ZERUNfSEVWQ10pCisJCXJldHVybiByY2xrOy8qY2xrIG5vdCBjaGFuZ2VkLCovCisJaWYgKE5PX0dQMF9QTEwpIHsKKwkJdXNlX2dwbGwgPSAwOworCQljbGtfc2V0ZWQgPSAwOworCX0gZWxzZSBpZiAoKHJjbGsgPiA1MDAgJiYgY2xrICE9IDY2NykgfHwgQUxXQVlTX0dQMF9QTEwpIHsKKwkJaWYgKGNsb2NrX3JlYWxfY2xrW1ZERUNfSEVWQ10gPT0gNjQ4KQorCQkJcmV0dXJuIDY0ODsKKwkJdXNlX2dwbGwgPSAxOworCQlncF9wbGxfcmVxdWVzdChncF9wbGxfdXNlcl9oZXZjKTsKKwkJd2hpbGUgKCFIRVZDX1dJVEhfR1BfUExMKCkgJiYgZ3BfcGxsX3dhaXQrKyA8IDEwMDAwMDApCisJCQl1ZGVsYXkoMSk7CisJCWlmIChIRVZDX1dJVEhfR1BfUExMKCkpIHsKKwkJCWNsa19zZXRlZCA9IDE7CisJCQlyY2xrID0gNjQ4OworCQl9IGVsc2UgeworCQkJcmNsayA9IDY2NzsKKwkJCS8qZ3BfcHVsbCByZXF1ZXN0IGZhaWxlZCx1c2VkIGRlZmF1bHQgNTAwTWh6Ki8KKwkJCXByX2luZm8oImdldCBncCBwbGwgZmFpbGVkIHVzZWQgZml4IHB1bGxcbiIpOworCQl9CisJfQorCWlmICghY2xrX3NldGVkKSB7LyppZiA2NDggbm90IHNldCwqLworLy8JCUhFVkNfU0FGRV9DTE9DSygpOworCQlIRVZDX0NMT0NLX09GRigpOworCQl2ZGVjX3NldF9jbGsoVkRFQ19IRVZDLCBzb3VyY2UsIGRpdik7CisJCUhFVkNfQ0xPQ0tfT04oKTsKKwl9CisJaWYgKCF1c2VfZ3BsbCkKKwkJZ3BfcGxsX3JlbGVhc2UoZ3BfcGxsX3VzZXJfaGV2Yyk7CisJY2xvY2tfcmVhbF9jbGtbVkRFQ19IRVZDXSA9IHJjbGs7CisJLypkZWJ1Z19wcmludCgiaGV2Y19jbG9ja19zZXQgMiB0byByY2xrPSVkLCBjb25maWdzPSVkXG4iLAorCQlyY2xrLAorCQlnZXRfdmRlY19jbGtfY29uZmlnX3NldHRpbmdzKCkpOyovIC8vREVCVUdfVE1QCisJcmV0dXJuIHJjbGs7Cit9CisKK3N0YXRpYyBpbnQgaGNvZGVjX2Nsb2NrX3NldChpbnQgY2xrKQoreworCWludCBzb3VyY2UsIGRpdiwgcmNsazsKKwlIQ09ERUNfQ0xPQ0tfT0ZGKCk7CisJdmRlY19nZXRfY2xrX3NvdXJjZSgyMDAsICZzb3VyY2UsICZkaXYsICZyY2xrKTsKKwl2ZGVjX3NldF9jbGsoVkRFQ19IQ09ERUMsIHNvdXJjZSwgZGl2KTsKKwlIQ09ERUNfQ0xPQ0tfT04oKTsKKwljbG9ja19yZWFsX2Nsa1tWREVDX0hDT0RFQ10gPSByY2xrOworCXJldHVybiByY2xrOworfQorCisKKyNlbHNlCitzdGF0aWMgaW50IHZkZWNfY2xvY2tfc2V0KGludCBjbGspCit7CisJaWYgKGNsayA9PSAxKQorCQljbGsgPSAyMDA7CisJZWxzZSBpZiAoY2xrID09IDIpIHsKKwkJaWYgKGNsb2NrX3JlYWxfY2xrW1ZERUNfMV0gIT0gNjQ4KQorCQkJY2xrID0gNTAwOworCQllbHNlCisJCQljbGsgPSA2NDg7CisJfSBlbHNlIGlmIChjbGsgPT0gMCkgeworCQlpZiAoY2xvY2tfcmVhbF9jbGtbVkRFQ18xXSA9PSA2NjcgfHwKKwkJCShjbG9ja19yZWFsX2Nsa1tWREVDXzFdID09IDY0OCkgfHwKKwkJCWNsb2NrX3JlYWxfY2xrW1ZERUNfMV0gPD0gMCkKKwkJCWNsayA9IDIwMDsKKwkJZWxzZQorCQkJY2xrID0gY2xvY2tfcmVhbF9jbGtbVkRFQ18xXTsKKwl9CisKKwlpZiAoKGNsayA+IDUwMCAmJiBjbGsgIT0gNjY3KSkgeworCQlpZiAoY2xvY2tfcmVhbF9jbGtbVkRFQ18xXSA9PSA2NDgpCisJCQlyZXR1cm4gNjQ4OworCQljbGsgPSA2Njc7CisJfQorCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xICYmCisJCWdldF9jcHVfbWFqb3JfaWQoKSAhPSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVEwxICYmCisJCWdldF9jcHVfbWFqb3JfaWQoKSAhPSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDUgJiYKKwkJZ2V0X2NwdV9tYWpvcl9pZCgpICE9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNUQpCisJCWNsayA9IDgwMDsKKworCWlmIChpc19jcHVfczRfczgwNXgyKCkpCisJCWNsayA9IDUwMDsKKworCWlmIChzZXRfZnJxX2VuYWJsZSAmJiB2ZGVjX2ZycSkgeworCQlwcl9pbmZvKCJTZXQgdGhlIHZkZWMgZnJxIGlzICV1IE1IelxuIiwgdmRlY19mcnEpOworCQljbGsgPSB2ZGVjX2ZycTsKKwl9CisKKwl2ZGVjX3NldF9jbGsoVkRFQ18xLCBjbGsgKiBNSHopOworCisJY2xvY2tfcmVhbF9jbGtbVkRFQ18xXSA9IGNsazsKKworCXByX2RlYnVnKCJ2ZGVjIG11eCBjbG9jayBpcyAlbHUgSHpcbiIsCisJCWNsa19nZXRfcmF0ZShnY2xrLnZkZWNfbXV4X25vZGUtPmNsaykpOworCisJcmV0dXJuIGNsazsKK30KKworc3RhdGljIGludCBoZXZjX2Nsb2NrX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZXZjX2JhY2tfY2xvY2tfaW5pdCh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhldmNfYmFja19jbG9ja19zZXQoaW50IGNsaykKK3sKKwlpZiAoY2xrID09IDEpCisJCWNsayA9IDIwMDsKKwllbHNlIGlmIChjbGsgPT0gMikgeworCQlpZiAoY2xvY2tfcmVhbF9jbGtbVkRFQ19IRVZDQl0gIT0gNjQ4KQorCQkJY2xrID0gNTAwOworCQllbHNlCisJCQljbGsgPSA2NDg7CisJfSBlbHNlIGlmIChjbGsgPT0gMCkgeworCQlpZiAoY2xvY2tfcmVhbF9jbGtbVkRFQ19IRVZDQl0gPT0gNjY3IHx8CisJCQkoY2xvY2tfcmVhbF9jbGtbVkRFQ19IRVZDQl0gPT0gNjQ4KSB8fAorCQkJY2xvY2tfcmVhbF9jbGtbVkRFQ19IRVZDQl0gPD0gMCkKKwkJCWNsayA9IDIwMDsKKwkJZWxzZQorCQkJY2xrID0gY2xvY2tfcmVhbF9jbGtbVkRFQ19IRVZDQl07CisJfQorCisJaWYgKChjbGsgPiA1MDAgJiYgY2xrICE9IDY2NykpIHsKKwkJaWYgKGNsb2NrX3JlYWxfY2xrW1ZERUNfSEVWQ0JdID09IDY0OCkKKwkJcmV0dXJuIDY0ODsKKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKQorCQkJY2xrID0gVEwxX0hFVkNfTUFYX0NMSzsKKwkJZWxzZQorCQkJY2xrID0gNjY3OworCX0KKworCWlmIChzZXRfZnJxX2VuYWJsZSAmJiBoZXZjYl9mcnEpIHsKKwkJcHJfaW5mbygiU2V0IHRoZSBoZXZjYiBmcnEgaXMgJXUgTUh6XG4iLCBoZXZjYl9mcnEpOworCQljbGsgPSBoZXZjYl9mcnE7CisJfQorCisJaWYgKChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RYTFgpICYmCisJCShnZXRfY3B1X21ham9yX2lkKCkgPCBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU0MyKSkgeworCQlpZiAoKFJFQURfRUZVU0VfUkVHKEVGVVNFX0xJQzEpID4+IDI4ICYgMHgxKSAmJiBjbGsgPiAzMzMpIHsKKwkJCXByX2luZm8oIlRoZSBoZXZjYiBjbG9jayBsaW1pdCB0byAzMzNNSHouXG4iKTsKKwkJCWNsayA9IDMzMzsKKwkJfQorCX0KKworCXZkZWNfc2V0X2NsayhWREVDX0hFVkNCLCBjbGsgKiBNSHopOworCisJY2xvY2tfcmVhbF9jbGtbVkRFQ19IRVZDQl0gPSBjbGs7CisJcHJfZGVidWcoImhldmMgYmFjayBtdXggY2xvY2sgaXMgJWx1IEh6XG4iLAorCQljbGtfZ2V0X3JhdGUoZ2Nsay5oZXZjX2JhY2tfbXV4X25vZGUtPmNsaykpOworCisJcmV0dXJuIGNsazsKK30KKworc3RhdGljIGludCBoZXZjX2Nsb2NrX3NldChpbnQgY2xrKQoreworCWlmIChjbGsgPT0gMSkKKwkJY2xrID0gMjAwOworCWVsc2UgaWYgKGNsayA9PSAyKSB7CisJCWlmIChjbG9ja19yZWFsX2Nsa1tWREVDX0hFVkNdICE9IDY0OCkKKwkJCWNsayA9IDUwMDsKKwkJZWxzZQorCQkJY2xrID0gNjQ4OworCX0gZWxzZSBpZiAoY2xrID09IDApIHsKKwkJaWYgKGNsb2NrX3JlYWxfY2xrW1ZERUNfSEVWQ10gPT0gNjY3IHx8CisJCQkoY2xvY2tfcmVhbF9jbGtbVkRFQ19IRVZDXSA9PSA2NDgpIHx8CisJCQljbG9ja19yZWFsX2Nsa1tWREVDX0hFVkNdIDw9IDApCisJCQljbGsgPSAyMDA7CisJCWVsc2UKKwkJCWNsayA9IGNsb2NrX3JlYWxfY2xrW1ZERUNfSEVWQ107CisJfQorCisJaWYgKChjbGsgPiA1MDAgJiYgY2xrICE9IDY2NykpIHsKKwkJaWYgKGNsb2NrX3JlYWxfY2xrW1ZERUNfSEVWQ10gPT0gNjQ4KQorCQkJcmV0dXJuIDY0ODsKKwkJaWYgKChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkgJiYKKwkJCShnZXRfY3B1X21ham9yX2lkKCkgIT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1KSAmJgorCQkJKGdldF9jcHVfbWFqb3JfaWQoKSAhPSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDVEKSkKKwkJCWNsayA9IFRMMV9IRVZDX01BWF9DTEs7CisJCWVsc2UKKwkJCWNsayA9IDY2NzsKKworCQlpZiAoaXNfY3B1X3M0X3M4MDV4MigpKQorCQkJY2xrID0gNTAwOworCX0KKworCWlmIChzZXRfZnJxX2VuYWJsZSAmJiBoZXZjX2ZycSkgeworCQlwcl9pbmZvKCJTZXQgdGhlIGhldmMgZnJxIGlzICV1IE1IelxuIiwgaGV2Y19mcnEpOworCQljbGsgPSBoZXZjX2ZycTsKKwl9CisKKwl2ZGVjX3NldF9jbGsoVkRFQ19IRVZDLCBjbGsgKiBNSHopOworCisJY2xvY2tfcmVhbF9jbGtbVkRFQ19IRVZDXSA9IGNsazsKKworCXByX2RlYnVnKCJoZXZjIG11eCBjbG9jayBpcyAlbHUgSHpcbiIsCisJCWNsa19nZXRfcmF0ZShnY2xrLmhldmNfbXV4X25vZGUtPmNsaykpOworCisJcmV0dXJuIGNsazsKK30KKworc3RhdGljIGludCBoY29kZWNfY2xvY2tfc2V0KGludCBjbGspCit7CisJaWYgKGNsayA9PSAxKQorCQljbGsgPSAyMDA7CisJZWxzZSBpZiAoY2xrID09IDIpIHsKKwkJaWYgKGNsb2NrX3JlYWxfY2xrW1ZERUNfSENPREVDXSAhPSA2NDgpCisJCQljbGsgPSA1MDA7CisJCWVsc2UKKwkJCWNsayA9IDY0ODsKKwl9IGVsc2UgaWYgKGNsayA9PSAwKSB7CisJCWlmIChjbG9ja19yZWFsX2Nsa1tWREVDX0hDT0RFQ10gPT0gNjY3IHx8CisJCQkoY2xvY2tfcmVhbF9jbGtbVkRFQ19IQ09ERUNdID09IDY0OCkgfHwKKwkJCWNsb2NrX3JlYWxfY2xrW1ZERUNfSENPREVDXSA8PSAwKQorCQkJY2xrID0gMjAwOworCQllbHNlCisJCQljbGsgPSBjbG9ja19yZWFsX2Nsa1tWREVDX0hDT0RFQ107CisJfQorCisJaWYgKChjbGsgPiA1MDAgJiYgY2xrICE9IDY2NykpIHsKKwkJaWYgKGNsb2NrX3JlYWxfY2xrW1ZERUNfSENPREVDXSA9PSA2NDgpCisJCQlyZXR1cm4gNjQ4OworCQljbGsgPSA2Njc7CisJfQorCisJdmRlY19zZXRfY2xrKFZERUNfSENPREVDLCBjbGsgKiBNSHopOworCisJY2xvY2tfcmVhbF9jbGtbVkRFQ19IQ09ERUNdID0gY2xrOworCisJcHJfZGVidWcoImhjb2RlYyBtdXggY2xvY2sgaXMgJWx1IEh6XG4iLAorCQljbGtfZ2V0X3JhdGUoZ2Nsay5oY29kZWNfbXV4X25vZGUtPmNsaykpOworCisJcmV0dXJuIGNsazsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB2ZGVjX2Nsb2NrX29uKHZvaWQpCit7CisJbXV0ZXhfbG9jaygmZ2Nsay52ZGVjX211eF9ub2RlLT5tdXRleCk7CisJaWYgKCFnY2xrLnZkZWNfbXV4X25vZGUtPnJlZl9jb3VudCkKKwkJY2xrX3ByZXBhcmVfZW5hYmxlKGdjbGsudmRlY19tdXhfbm9kZS0+Y2xrKTsKKworCWdjbGsudmRlY19tdXhfbm9kZS0+cmVmX2NvdW50Kys7CisJbXV0ZXhfdW5sb2NrKCZnY2xrLnZkZWNfbXV4X25vZGUtPm11dGV4KTsKKworCXByX2RlYnVnKCJ0aGUgJS0xNXMgY2xvY2sgb24sIHJlZiBjbnQ6ICVkXG4iLAorCQlnY2xrLnZkZWNfbXV4X25vZGUtPm5hbWUsCisJCWdjbGsudmRlY19tdXhfbm9kZS0+cmVmX2NvdW50KTsKK30KKworc3RhdGljIHZvaWQgdmRlY19jbG9ja19vZmYodm9pZCkKK3sKKwltdXRleF9sb2NrKCZnY2xrLnZkZWNfbXV4X25vZGUtPm11dGV4KTsKKwlnY2xrLnZkZWNfbXV4X25vZGUtPnJlZl9jb3VudC0tOworCWlmICghZ2Nsay52ZGVjX211eF9ub2RlLT5yZWZfY291bnQpCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShnY2xrLnZkZWNfbXV4X25vZGUtPmNsayk7CisKKwljbG9ja19yZWFsX2Nsa1tWREVDXzFdID0gMDsKKwltdXRleF91bmxvY2soJmdjbGsudmRlY19tdXhfbm9kZS0+bXV0ZXgpOworCisJcHJfZGVidWcoInRoZSAlLTE1cyBjbG9jayBvZmYsIHJlZiBjbnQ6ICVkXG4iLAorCQlnY2xrLnZkZWNfbXV4X25vZGUtPm5hbWUsCisJCWdjbGsudmRlY19tdXhfbm9kZS0+cmVmX2NvdW50KTsKK30KKworc3RhdGljIHZvaWQgaGNvZGVjX2Nsb2NrX29uKHZvaWQpCit7CisJbXV0ZXhfbG9jaygmZ2Nsay5oY29kZWNfbXV4X25vZGUtPm11dGV4KTsKKwlpZiAoIWdjbGsuaGNvZGVjX211eF9ub2RlLT5yZWZfY291bnQpCisJCWNsa19wcmVwYXJlX2VuYWJsZShnY2xrLmhjb2RlY19tdXhfbm9kZS0+Y2xrKTsKKworCWdjbGsuaGNvZGVjX211eF9ub2RlLT5yZWZfY291bnQrKzsKKwltdXRleF91bmxvY2soJmdjbGsuaGNvZGVjX211eF9ub2RlLT5tdXRleCk7CisKKwlwcl9kZWJ1ZygidGhlICUtMTVzIGNsb2NrIG9uLCByZWYgY250OiAlZFxuIiwKKwkJZ2Nsay5oY29kZWNfbXV4X25vZGUtPm5hbWUsCisJCWdjbGsuaGNvZGVjX211eF9ub2RlLT5yZWZfY291bnQpOworfQorCitzdGF0aWMgdm9pZCBoY29kZWNfY2xvY2tfb2ZmKHZvaWQpCit7CisJbXV0ZXhfbG9jaygmZ2Nsay5oY29kZWNfbXV4X25vZGUtPm11dGV4KTsKKwlnY2xrLmhjb2RlY19tdXhfbm9kZS0+cmVmX2NvdW50LS07CisJaWYgKCFnY2xrLmhjb2RlY19tdXhfbm9kZS0+cmVmX2NvdW50KQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZ2Nsay5oY29kZWNfbXV4X25vZGUtPmNsayk7CisKKwltdXRleF91bmxvY2soJmdjbGsuaGNvZGVjX211eF9ub2RlLT5tdXRleCk7CisKKwlwcl9kZWJ1ZygidGhlICUtMTVzIGNsb2NrIG9mZiwgcmVmIGNudDogJWRcbiIsCisJCWdjbGsuaGNvZGVjX211eF9ub2RlLT5uYW1lLAorCQlnY2xrLmhjb2RlY19tdXhfbm9kZS0+cmVmX2NvdW50KTsKK30KKworc3RhdGljIHZvaWQgaGV2Y19jbG9ja19vbih2b2lkKQoreworCW11dGV4X2xvY2soJmdjbGsuaGV2Y19tdXhfbm9kZS0+bXV0ZXgpOworCWlmICghZ2Nsay5oZXZjX211eF9ub2RlLT5yZWZfY291bnQpCisJCWNsa19wcmVwYXJlX2VuYWJsZShnY2xrLmhldmNfbXV4X25vZGUtPmNsayk7CisKKwlnY2xrLmhldmNfbXV4X25vZGUtPnJlZl9jb3VudCsrOworCVdSSVRFX1ZSRUcoRE9TX0dDTEtfRU4zLCAweGZmZmZmZmZmKTsKKwltdXRleF91bmxvY2soJmdjbGsuaGV2Y19tdXhfbm9kZS0+bXV0ZXgpOworCisJcHJfZGVidWcoInRoZSAlLTE1cyBjbG9jayBvbiwgcmVmIGNudDogJWRcbiIsCisJCWdjbGsuaGV2Y19tdXhfbm9kZS0+bmFtZSwKKwkJZ2Nsay5oZXZjX211eF9ub2RlLT5yZWZfY291bnQpOworfQorCitzdGF0aWMgdm9pZCBoZXZjX2Nsb2NrX29mZih2b2lkKQoreworCW11dGV4X2xvY2soJmdjbGsuaGV2Y19tdXhfbm9kZS0+bXV0ZXgpOworCWdjbGsuaGV2Y19tdXhfbm9kZS0+cmVmX2NvdW50LS07CisJaWYgKCFnY2xrLmhldmNfbXV4X25vZGUtPnJlZl9jb3VudCkKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGdjbGsuaGV2Y19tdXhfbm9kZS0+Y2xrKTsKKworCWNsb2NrX3JlYWxfY2xrW1ZERUNfSEVWQ10gPSAwOworCW11dGV4X3VubG9jaygmZ2Nsay5oZXZjX211eF9ub2RlLT5tdXRleCk7CisKKwlwcl9kZWJ1ZygidGhlICUtMTVzIGNsb2NrIG9mZiwgcmVmIGNudDogJWRcbiIsCisJCWdjbGsuaGV2Y19tdXhfbm9kZS0+bmFtZSwKKwkJZ2Nsay5oZXZjX211eF9ub2RlLT5yZWZfY291bnQpOworfQorCitzdGF0aWMgdm9pZCBoZXZjX2JhY2tfY2xvY2tfb24odm9pZCkKK3sKKwltdXRleF9sb2NrKCZnY2xrLmhldmNfYmFja19tdXhfbm9kZS0+bXV0ZXgpOworCWlmICghZ2Nsay5oZXZjX2JhY2tfbXV4X25vZGUtPnJlZl9jb3VudCkKKwkJY2xrX3ByZXBhcmVfZW5hYmxlKGdjbGsuaGV2Y19iYWNrX211eF9ub2RlLT5jbGspOworCisJZ2Nsay5oZXZjX2JhY2tfbXV4X25vZGUtPnJlZl9jb3VudCsrOworCVdSSVRFX1ZSRUcoRE9TX0dDTEtfRU4zLCAweGZmZmZmZmZmKTsKKwltdXRleF91bmxvY2soJmdjbGsuaGV2Y19iYWNrX211eF9ub2RlLT5tdXRleCk7CisKKwlwcl9kZWJ1ZygidGhlICUtMTVzIGNsb2NrIG9uLCByZWYgY250OiAlZFxuIiwKKwkJZ2Nsay5oZXZjX2JhY2tfbXV4X25vZGUtPm5hbWUsCisJCWdjbGsuaGV2Y19iYWNrX211eF9ub2RlLT5yZWZfY291bnQpOworfQorCitzdGF0aWMgdm9pZCBoZXZjX2JhY2tfY2xvY2tfb2ZmKHZvaWQpCit7CisJbXV0ZXhfbG9jaygmZ2Nsay5oZXZjX2JhY2tfbXV4X25vZGUtPm11dGV4KTsKKwlnY2xrLmhldmNfYmFja19tdXhfbm9kZS0+cmVmX2NvdW50LS07CisJaWYgKCFnY2xrLmhldmNfYmFja19tdXhfbm9kZS0+cmVmX2NvdW50KQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZ2Nsay5oZXZjX2JhY2tfbXV4X25vZGUtPmNsayk7CisKKwljbG9ja19yZWFsX2Nsa1tWREVDX0hFVkNdID0gMDsKKwltdXRleF91bmxvY2soJmdjbGsuaGV2Y19iYWNrX211eF9ub2RlLT5tdXRleCk7CisKKwlwcl9kZWJ1ZygidGhlICUtMTVzIGNsb2NrIG9mZiwgcmVmIGNudDogJWRcbiIsCisJCWdjbGsuaGV2Y19iYWNrX211eF9ub2RlLT5uYW1lLAorCQlnY2xrLmhldmNfYmFja19tdXhfbm9kZS0+cmVmX2NvdW50KTsKK30KKworc3RhdGljIGludCB2ZGVjX2Nsb2NrX2dldChlbnVtIHZkZWNfdHlwZV9lIGNvcmUpCit7CisJaWYgKGNvcmUgPj0gVkRFQ19NQVgpCisJCXJldHVybiAwOworCisJcmV0dXJuIGNsb2NrX3JlYWxfY2xrW2NvcmVdOworfQorCisjZGVmaW5lIElOQ0xVREVfRlJPTV9BUkNIX0NMS19NR1IKKworLyojZGVmaW5lIFZERUNfSEFTX1ZERUMyKi8KKyNkZWZpbmUgVkRFQ19IQVNfSEVWQworI2RlZmluZSBWREVDX0hBU19WREVDX0hDT0RFQworI2RlZmluZSBWREVDX0hBU19DTEtfU0VUVElOR1MKKyNkZWZpbmUgQ0xLX0ZPUl9DUFUge1wKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hCQixcCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYVFZCQixcCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTCxcCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTSxcCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RYTCxcCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RYTFgsXAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9HWExYLFwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQSxcCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkIsXAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEsXAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9UTDEsXAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9UTTIsXAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9TQzIsXAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9UNSxcCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1RCxcCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3LFwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfUzQsXAorCUFNX01FU09OX0NQVV9NQUpPUl9JRF9UMyxcCisJQU1fTUVTT05fQ1BVX01BSk9SX0lEX1AxLFwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfUzRELFwKKwlBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDVXLFwKKwkwfQorI2luY2x1ZGUgImNsay5oIgorCittb2R1bGVfcGFyYW0oc2V0X2ZycV9lbmFibGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhzZXRfZnJxX2VuYWJsZSwgIlxuIHNldCBmcmVxdWVuY3kgZW5hYmxlXG4iKTsKKworbW9kdWxlX3BhcmFtKHZkZWNfZnJxLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModmRlY19mcnEsICJcbiBzZXQgdmRlYyBmcmVxdWVuY3lcbiIpOworCittb2R1bGVfcGFyYW0oaGV2Y19mcnEsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhoZXZjX2ZycSwgIlxuIHNldCBoZXZjIGZyZXF1ZW5jeVxuIik7CisKK21vZHVsZV9wYXJhbShoZXZjYl9mcnEsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhoZXZjYl9mcnEsICJcbiBzZXQgaGV2Y2IgZnJlcXVlbmN5XG4iKTsKKworQVJDSF9WREVDX0NMS19JTklUKCk7CitBUkNIX1ZERUNfQ0xLX0VYSVQoKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jb21tb24vbWVkaWFfY2xvY2svc3dpdGNoL2FtcG9ydHNfZ2F0ZS5jIGIvZHJpdmVycy9jb21tb24vbWVkaWFfY2xvY2svc3dpdGNoL2FtcG9ydHNfZ2F0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YTAyODkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NvbW1vbi9tZWRpYV9jbG9jay9zd2l0Y2gvYW1wb3J0c19nYXRlLmMKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvbWVkaWEvY29tbW9uL2FyY2gvc3dpdGNoL2FtcG9ydHNfZ2F0ZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisjZGVmaW5lIERFQlVHCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgImFtcG9ydHNfZ2F0ZS5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmRlY19yZWcuaD4KKyNpbmNsdWRlICIuLi8uLi8uLi9zdHJlYW1faW5wdXQvYW1wb3J0cy9hbXBvcnRzX3ByaXYuaCIKKyNpbmNsdWRlICIuLi8uLi8uLi9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWMuaCIKKyNpbmNsdWRlICIuLi9jbGsvY2xrLmgiCisKKworI2RlZmluZSBERUJVR19SRUYgMQorI2RlZmluZSBHQVRFX1JFU0VUX09LCisKKyNpZmRlZiBHQVRFX1JFU0VUX09LCisKK3N0cnVjdCBnYXRlX3N3aXRjaF9ub2RlIGdhdGVzW10gPSB7CisJeworCQkubmFtZSA9ICJkZW11eCIsCisJfSwKKwl7CisJCS5uYW1lID0gInBhcnNlcl90b3AiLAorCX0sCisJeworCQkubmFtZSA9ICJ2ZGVjIiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiY2xrXzgxIiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiY2xrX3ZkZWNfbXV4IiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiY2xrX2hjb2RlY19tdXgiLAorCX0sCisJeworCQkubmFtZSA9ICJjbGtfaGV2Y19tdXgiLAorCX0sCisJeworCQkubmFtZSA9ICJjbGtfaGV2Y2JfbXV4IiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiYWhiYXJiMCIsCisJfSwKKwl7CisJCS5uYW1lID0gImFzeW5jZmlmbyIsCisJfSwKKwl7CisJCS5uYW1lID0gImNsa19oZXZjZl9tdXgiLAorCX0sCit9OworCisvKgorICptZXNvbnN0cmVhbSB7CisgKgljb21wYXRpYmxlID0gImFtbG9naWMsIGNvZGVjLCBzdHJlYW1idWYiOworICoJZGV2X25hbWUgPSAibWVzb25zdHJlYW0iOworICoJc3RhdHVzID0gIm9rYXkiOworICoJY2xvY2tzID0gPCZjbGtjIENMS0lEX0RPU19QQVJTRVIKKyAqCQkmY2xrYyBDTEtJRF9ERU1VWAorICoJCSZjbGtjIENMS0lEX0RPUworICoJCSZjbGtjIENMS0lEX1ZERUNfTVVYCisgKgkJJmNsa2MgQ0xLSURfSENPREVDX01VWAorICoJCSZjbGtjIENMS0lEX0hFVkNGX01VWAorICoJCSZjbGtjIENMS0lEX0hFVkNfTVVYPjsKKyAqCWNsb2NrLW5hbWVzID0gInBhcnNlcl90b3AiLAorICoJCSJkZW11eCIsCisgKgkJInZkZWMiLAorICoJCSJjbGtfdmRlY19tdXgiLAorICoJCSJjbGtfaGNvZGVjX211eCIsCisgKgkJImNsa19oZXZjX211eCIsCisgKgkJImNsa19oZXZjYl9tdXgiOworICp9OworICovCisKK2ludCBhbXBvcnRzX2Nsb2NrX2dhdGVfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGdhdGVzKSAvIHNpemVvZihzdHJ1Y3QgZ2F0ZV9zd2l0Y2hfbm9kZSk7IGkrKykgeworCQlnYXRlc1tpXS5jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCBnYXRlc1tpXS5uYW1lKTsKKwkJaWYgKElTX0VSUl9PUl9OVUxMKGdhdGVzW2ldLmNsaykpIHsKKwkJCWdhdGVzW2ldLmNsayA9IE5VTEw7CisJCQlwcl9pbmZvKCJnZXQgZ2F0ZSAlcyBjb250cm9sIGZhaWxlZCAlcHhcbiIsCisJCQkJZ2F0ZXNbaV0ubmFtZSwKKwkJCQlnYXRlc1tpXS5jbGspOworCQl9IGVsc2UgeworCQkJcHJfaW5mbygiZ2V0IGdhdGUgJXMgY29udHJvbCBvayAlcHhcbiIsCisJCQkJZ2F0ZXNbaV0ubmFtZSwKKwkJCQlnYXRlc1tpXS5jbGspOworCQl9CisJCWdhdGVzW2ldLnJlZl9jb3VudCA9IDA7CisJCW11dGV4X2luaXQoJmdhdGVzW2ldLm11dGV4KTsKKwl9CisKKwlzZXRfY2xvY2tfZ2F0ZShnYXRlcywgQVJSQVlfU0laRShnYXRlcykpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGFtcG9ydHNfY2xvY2tfZ2F0ZV9pbml0KTsKKworc3RhdGljIGludCBhbXBvcnRzX2dhdGVfY2xrKHN0cnVjdCBnYXRlX3N3aXRjaF9ub2RlICpnYXRlX25vZGUsIGludCBlbmFibGUpCit7CisJbXV0ZXhfbG9jaygmZ2F0ZV9ub2RlLT5tdXRleCk7CisJaWYgKGVuYWJsZSkgeworCQlpZiAoZ2F0ZV9ub2RlLT5yZWZfY291bnQgPT0gMCkKKwkJCWNsa19wcmVwYXJlX2VuYWJsZShnYXRlX25vZGUtPmNsayk7CisKKwkJZ2F0ZV9ub2RlLT5yZWZfY291bnQrKzsKKworCQlpZiAoREVCVUdfUkVGKQorCQkJcHJfZGVidWcoInRoZSAlLTE1cyBjbG9jayBvbiwgcmVmIGNudDogJWRcbiIsCisJCQkJZ2F0ZV9ub2RlLT5uYW1lLCBnYXRlX25vZGUtPnJlZl9jb3VudCk7CisJfSBlbHNlIHsKKwkJZ2F0ZV9ub2RlLT5yZWZfY291bnQtLTsKKwkJaWYgKGdhdGVfbm9kZS0+cmVmX2NvdW50ID09IDApCisJCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZ2F0ZV9ub2RlLT5jbGspOworCisJCWlmIChERUJVR19SRUYpCisJCQlwcl9kZWJ1ZygidGhlICUtMTVzIGNsb2NrIG9mZiwgcmVmIGNudDogJWRcbiIsCisJCQkJZ2F0ZV9ub2RlLT5uYW1lLCBnYXRlX25vZGUtPnJlZl9jb3VudCk7CisJfQorCW11dGV4X3VubG9jaygmZ2F0ZV9ub2RlLT5tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGFtcG9ydHNfc3dpdGNoX2dhdGUoY29uc3QgY2hhciAqbmFtZSwgaW50IGVuYWJsZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoZ2F0ZXMpIC8gc2l6ZW9mKHN0cnVjdCBnYXRlX3N3aXRjaF9ub2RlKTsgaSsrKSB7CisJCWlmICghc3RyY21wKG5hbWUsIGdhdGVzW2ldLm5hbWUpKSB7CisKKwkJCS8qcHJfaW5mbygib3BlbmNsb3NlOiVkIGdhdGUgJXMgY29udHJvbFxuIiwgZW5hYmxlLAorCQkJICoJZ2F0ZXNbaV0ubmFtZSk7CisJCQkgKi8KKworCQkJaWYgKGdhdGVzW2ldLmNsaykKKwkJCQlhbXBvcnRzX2dhdGVfY2xrKCZnYXRlc1tpXSwgZW5hYmxlKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYW1wb3J0c19zd2l0Y2hfZ2F0ZSk7CisKKyNlbHNlCisvKgorICpjYW4gdXNlZCBmb3IgZGVidWcuCisgKm9uIGNoaXAgYnJpbmd1cC4KKyAqLworaW50IGFtcG9ydHNfY2xvY2tfZ2F0ZV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdGF0aWMgaW50IGdhdGVfaW5pdGVkOworCisJaWYgKGdhdGVfaW5pdGVkKQorCQlyZXR1cm4gMDsKKy8qCisgKiNkZWZpbmUgSEhJX0dDTEtfTVBFRzAgICAgMHgxMDUwCisgKiNkZWZpbmUgSEhJX0dDTEtfTVBFRzEgICAgMHgxMDUxCisgKiNkZWZpbmUgSEhJX0dDTEtfTVBFRzIgICAgMHgxMDUyCisgKiNkZWZpbmUgSEhJX0dDTEtfT1RIRVIgICAgMHgxMDU0CisgKiNkZWZpbmUgSEhJX0dDTEtfQU8gICAgICAgMHgxMDU1CisgKi8KKwlXUklURV9ISElfUkVHX0JJVFMoSEhJX0dDTEtfTVBFRzAsIDEsIDEsIDEpOy8qZG9zKi8KKwlXUklURV9ISElfUkVHX0JJVFMoSEhJX0dDTEtfTVBFRzEsIDEsIDI1LCAxKTsvKlVfcGFyc2VyX3RvcCgpKi8KKwlXUklURV9ISElfUkVHX0JJVFMoSEhJX0dDTEtfTVBFRzEsIDB4ZmYsIDYsIDgpOy8qYWl1KCkqLworCVdSSVRFX0hISV9SRUdfQklUUyhISElfR0NMS19NUEVHMSwgMSwgNCwgMSk7LypkZW11eCgpKi8KKwlXUklURV9ISElfUkVHX0JJVFMoSEhJX0dDTEtfTVBFRzEsIDEsIDIsIDEpOy8qYXVkaW8gaW4oKSovCisJV1JJVEVfSEhJX1JFR19CSVRTKEhISV9HQ0xLX01QRUcyLCAxLCAyNSwgMSk7LypWUFUgSW50ZXJydXB0Ki8KKwlnYXRlX2luaXRlZCsrOworCisKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChhbXBvcnRzX2Nsb2NrX2dhdGVfaW5pdCk7CisKKworaW50IGFtcG9ydHNfc3dpdGNoX2dhdGUoY29uc3QgY2hhciAqbmFtZSwgaW50IGVuYWJsZSkKK3sKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYW1wb3J0c19zd2l0Y2hfZ2F0ZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jb21tb24vbWVkaWFfY2xvY2svc3dpdGNoL2FtcG9ydHNfZ2F0ZS5oIGIvZHJpdmVycy9jb21tb24vbWVkaWFfY2xvY2svc3dpdGNoL2FtcG9ydHNfZ2F0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YWJjOTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NvbW1vbi9tZWRpYV9jbG9jay9zd2l0Y2gvYW1wb3J0c19nYXRlLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9tZWRpYS9jb21tb24vYXJjaC9zd2l0Y2gvYW1wb3J0c19nYXRlLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBBTVBPUlRfR0FURV9ICisjZGVmaW5lIEFNUE9SVF9HQVRFX0gKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworc3RydWN0IGdhdGVfc3dpdGNoX25vZGUgeworCXN0cnVjdCBjbGsgKmNsazsKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBtdXRleCBtdXRleDsKKwlpbnQgcmVmX2NvdW50OworfTsKKworZXh0ZXJuIGludCBhbXBvcnRzX2Nsb2NrX2dhdGVfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBhbXBvcnRzX3N3aXRjaF9nYXRlKGNvbnN0IGNoYXIgKm5hbWUsIGludCBlbmFibGUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvTWFrZWZpbGUgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMGM0ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL01ha2VmaWxlCkBAIC0wLDAgKzEsMiBAQAorb2JqLXkJKz0JZGVjb2Rlci8KK29iai15CSs9CWRlY29kZXJfdjRsLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL01ha2VmaWxlIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMDA3OWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvTWFrZWZpbGUKQEAgLTAsMCArMSwxMyBAQAorb2JqLXkJKz0JdXRpbHMvCitvYmoteQkrPQltcGVnMTIvCitvYmoteQkrPQltcGVnNC8KK29iai15CSs9CXZjMS8KK29iai15CSs9CWgyNjQvCitvYmoteQkrPQloMjY0X211bHRpLworb2JqLXkJKz0JaDI2NS8KK29iai15CSs9CXZwOS8KK29iai15CSs9CW1qcGVnLworb2JqLXkJKz0JYXZzLworb2JqLXkJKz0JYXZzMi8KK29iai15CSs9CWF2c19tdWx0aS8KK29iai15CSs9CXZhdjEvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvYXZzL01ha2VmaWxlIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL2F2cy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDU2MjM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL2F2cy9NYWtlZmlsZQpAQCAtMCwwICsxLDIgQEAKK29iai0kKENPTkZJR19BTUxPR0lDX01FRElBX1ZERUNfQVZTKSArPSBhbXZkZWNfYXZzLm8KK2FtdmRlY19hdnMtb2JqcyArPSBhdnMubyBhdnNwX3RyYW5zLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9hdnMvYXZzLmMgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvYXZzL2F2cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NjllYWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvYXZzL2F2cy5jCkBAIC0wLDAgKzEsMTk4OCBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9hbXBvcnRzL3ZhdnMuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2RlZmluZSBERUJVRworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL2Ftc3RyZWFtLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9mcmFtZV9zeW5jL3B0c3NlcnYuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NhbnZhcy9jYW52YXMuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWVfcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWVfcmVjZWl2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL3ZkZWNfcmVnLmg+CisjaW5jbHVkZSAiLi4vLi4vLi4vc3RyZWFtX2lucHV0L2FtcG9ydHMvc3RyZWFtYnVmX3JlZy5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2FtdmRlYy5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvcmVnaXN0ZXJzL3JlZ2lzdGVyLmg+CisjaW5jbHVkZSAiLi4vLi4vLi4vc3RyZWFtX2lucHV0L2FtcG9ydHMvYW1wb3J0c19wcml2LmgiCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvZGVjX21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgImF2cy5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29uZmlncy5oPgorI2luY2x1ZGUgIi4uL3V0aWxzL2RlY29kZXJfbW11X2JveC5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2RlY29kZXJfYm1tdV9ib3guaCIKKyNpbmNsdWRlICIuLi91dGlscy9maXJtd2FyZS5oIgorI2luY2x1ZGUgIi4uLy4uLy4uL2NvbW1vbi9jaGlwcy9kZWNvZGVyX2NwdV92ZXJfaW5mby5oIgorLy8jaW5jbHVkZSA8bGludXgvYW1sb2dpYy90ZWUuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L3RlZS5oPgorCisjZGVmaW5lIERSSVZFUl9OQU1FICJhbXZkZWNfYXZzIgorI2RlZmluZSBNT0RVTEVfTkFNRSAiYW12ZGVjX2F2cyIKKworCisjaWYgMS8qIE1FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09ONiAqLworI2RlZmluZSBOVjIxCisjZW5kaWYKKworI2RlZmluZSBVU0VfQVZTX1NFUV9JTkZPCisjZGVmaW5lIEhBTkRMRV9BVlNfSVJRCisjZGVmaW5lIERFQlVHX1BUUworCisjZGVmaW5lIElfUElDVFVSRSAgIDAKKyNkZWZpbmUgUF9QSUNUVVJFICAgMQorI2RlZmluZSBCX1BJQ1RVUkUgICAyCisKKy8qICNkZWZpbmUgT1JJX0JVRkZFUl9TVEFSVF9BRERSICAgMHg4MTAwMDAwMCAqLworI2RlZmluZSBPUklfQlVGRkVSX1NUQVJUX0FERFIgICAweDgwMDAwMDAwCisKKyNkZWZpbmUgSU5URVJMQUNFX0ZMQUcgICAgICAgICAgMHg4MAorI2RlZmluZSBUT1BfRklFTERfRklSU1RfRkxBRyAweDQwCisKKy8qIHByb3RvY29sIHJlZ2lzdGVycyAqLworI2RlZmluZSBBVlNfUElDX1JBVElPICAgICAgIEFWX1NDUkFUQ0hfMAorI2RlZmluZSBBVlNfUElDX1dJRFRIICAgICAgQVZfU0NSQVRDSF8xCisjZGVmaW5lIEFWU19QSUNfSEVJR0hUICAgICBBVl9TQ1JBVENIXzIKKyNkZWZpbmUgQVZTX0ZSQU1FX1JBVEUgICAgIEFWX1NDUkFUQ0hfMworCisjZGVmaW5lIEFWU19FUlJPUl9DT1VOVCAgICBBVl9TQ1JBVENIXzYKKyNkZWZpbmUgQVZTX1NPU19DT1VOVCAgICAgQVZfU0NSQVRDSF83CisjZGVmaW5lIEFWU19CVUZGRVJJTiAgICAgICBBVl9TQ1JBVENIXzgKKyNkZWZpbmUgQVZTX0JVRkZFUk9VVCAgICAgIEFWX1NDUkFUQ0hfOQorI2RlZmluZSBBVlNfUkVQRUFUX0NPVU5UICAgIEFWX1NDUkFUQ0hfQQorI2RlZmluZSBBVlNfVElNRV9TVEFNUCAgICAgIEFWX1NDUkFUQ0hfQgorI2RlZmluZSBBVlNfT0ZGU0VUX1JFRyAgICAgIEFWX1NDUkFUQ0hfQworI2RlZmluZSBNRU1fT0ZGU0VUX1JFRyAgICAgIEFWX1NDUkFUQ0hfRgorI2RlZmluZSBBVlNfRVJST1JfUkVDT1ZFUllfTU9ERSAgIEFWX1NDUkFUQ0hfRworCisjZGVmaW5lIFZGX1BPT0xfU0laRSAgICAgICAgMzIKKyNkZWZpbmUgUFVUX0lOVEVSVkFMICAgICAgICAoSFovMTAwKQorCisjaWYgMSAvKk1FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09OOCovCisjZGVmaW5lIElOVF9BTVZFTkNPREVSIElOVF9ET1NfTUFJTEJPWF8xCisjZWxzZQorLyogI2RlZmluZSBBTVZFTkNfREVWX1ZFUlNJT04gIkFNTC1NVCIgKi8KKyNkZWZpbmUgSU5UX0FNVkVOQ09ERVIgSU5UX01BSUxCT1hfMUEKKyNlbmRpZgorCisKKyNkZWZpbmUgREVDX0NPTlRST0xfRkxBR19GT1JDRV8yNTAwXzEwODBQX0lOVEVSTEFDRSAweDAwMDEKK3N0YXRpYyB1MzIgZGVjX2NvbnRyb2wgPSBERUNfQ09OVFJPTF9GTEFHX0ZPUkNFXzI1MDBfMTA4MFBfSU5URVJMQUNFOworCisKKyNkZWZpbmUgVlBQX1ZEMV9QT1NUQkxFTkQgICAgICAgKDEgPDwgMTApCisKK3N0YXRpYyBpbnQgZGVidWdfZmxhZzsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitmaXJtd2FyZV9zZWwKKyAgICAwOiB1c2UgYXZzcF90cmFucyBsb25nIGNhYmFjIHVjb2RlOworICAgIDE6IG5vdCB1c2UgYXZzcF90cmFucyBsb25nIGNhYmFjIHVjb2RlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZmlybXdhcmVfc2VsOworc3RhdGljIGludCBkaXNhYmxlX2xvbmdjYWJhY190cmFucyA9IDE7CisKK3N0YXRpYyBpbnQgc3VwcG9ydF91c2VyX2RhdGEgPSAxOworCitpbnQgYXZzX2dldF9kZWJ1Z19mbGFnKHZvaWQpCit7CisJcmV0dXJuIGRlYnVnX2ZsYWc7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZhdnNfdmZfcGVlayh2b2lkICopOworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyAqdmF2c192Zl9nZXQodm9pZCAqKTsKK3N0YXRpYyB2b2lkIHZhdnNfdmZfcHV0KHN0cnVjdCB2ZnJhbWVfcyAqLCB2b2lkICopOworc3RhdGljIGludCB2YXZzX2V2ZW50X2NiKGludCB0eXBlLCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlX2RhdGEpOworc3RhdGljIGludCB2YXZzX3ZmX3N0YXRlcyhzdHJ1Y3QgdmZyYW1lX3N0YXRlcyAqc3RhdGVzLCB2b2lkICopOworCitzdGF0aWMgY29uc3QgY2hhciB2YXZzX2RlY19pZFtdID0gInZhdnMtZGV2IjsKKworI2RlZmluZSBQUk9WSURFUl9OQU1FICAgImRlY29kZXIuYXZzIgorc3RhdGljIERFRklORV9TUElOTE9DSyhsb2NrKTsKK3N0YXRpYyBERUZJTkVfTVVURVgodmF2c19tdXRleCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmZyYW1lX29wZXJhdGlvbnNfcyB2YXZzX3ZmX3Byb3ZpZGVyID0geworCS5wZWVrID0gdmF2c192Zl9wZWVrLAorCS5nZXQgPSB2YXZzX3ZmX2dldCwKKwkucHV0ID0gdmF2c192Zl9wdXQsCisJLmV2ZW50X2NiID0gdmF2c19ldmVudF9jYiwKKwkudmZfc3RhdGVzID0gdmF2c192Zl9zdGF0ZXMsCit9Oworc3RhdGljIHZvaWQgKm1tX2Jsa19oYW5kbGU7CitzdGF0aWMgc3RydWN0IHZmcmFtZV9wcm92aWRlcl9zIHZhdnNfdmZfcHJvdjsKKworI2RlZmluZSBWRl9CVUZfTlVNX01BWCAxNgorI2RlZmluZSBXT1JLU1BBQ0VfU0laRQkJKDQgKiBTWl8xTSkKKworI2lmZGVmIEFWU1BfTE9OR19DQUJBQworI2RlZmluZSBNQVhfQk1NVV9CVUZGRVJfTlVNCShWRl9CVUZfTlVNX01BWCArIDIpCisjZGVmaW5lIFdPUktTUEFDRV9TSVpFX0EJCShNQVhfQ09ERURfRlJBTUVfU0laRSArIExPQ0FMX0hFQVBfU0laRSkKKyNlbHNlCisjZGVmaW5lIE1BWF9CTU1VX0JVRkZFUl9OVU0JKFZGX0JVRl9OVU1fTUFYICsgMSkKKyNlbmRpZgorCisjZGVmaW5lIFJWX0FJX0JVRkZfU1RBUlRfQUREUgkgMHgwMWEwMDAwMAorI2RlZmluZSBMT05HX0NBQkFDX1JWX0FJX0JVRkZfU1RBUlRfQUREUgkgMHgwMDAwMDAwMAorCitzdGF0aWMgdTMyIHZmX2J1Zl9udW0gPSA4Oworc3RhdGljIHUzMiB2Zl9idWZfbnVtX3VzZWQ7CitzdGF0aWMgdTMyIGNhbnZhc19iYXNlID0gMTI4OworI2lmZGVmIE5WMjEKKwlpbnQJY2FudmFzX251bSA9IDI7IC8qTlYyMSovCisjZWxzZQorCWludAljYW52YXNfbnVtID0gMzsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHZmcmFtZV9zIHZmcG9vbFtWRl9QT09MX1NJWkVdOworLypzdGF0aWMgc3RydWN0IHZmcmFtZV9zIHZmcG9vbDJbVkZfUE9PTF9TSVpFXTsqLworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyAqY3VyX3ZmcG9vbDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJlY292ZXJfZmxhZzsKK3N0YXRpYyBzMzIgdmZidWZfdXNlW1ZGX0JVRl9OVU1fTUFYXTsKK3N0YXRpYyB1MzIgc2F2ZWRfcmVzb2x1dGlvbjsKK3N0YXRpYyB1MzIgZnJhbWVfd2lkdGgsIGZyYW1lX2hlaWdodCwgZnJhbWVfZHVyLCBmcmFtZV9wcm9nOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHJlY3ljbGVfdGltZXI7CitzdGF0aWMgdTMyIHN0YXQ7CitzdGF0aWMgdTMyIGJ1Zl9zaXplID0gMzIgKiAxMDI0ICogMTAyNDsKK3N0YXRpYyB1MzIgYnVmX29mZnNldDsKK3N0YXRpYyB1MzIgYXZpX2ZsYWc7CitzdGF0aWMgdTMyIHZhdnNfcmF0aW87CitzdGF0aWMgdTMyIHBpY190eXBlOworc3RhdGljIHUzMiBwdHNfYnlfb2Zmc2V0ID0gMTsKK3N0YXRpYyB1MzIgdG90YWxfZnJhbWU7CitzdGF0aWMgdTMyIG5leHRfcHRzOworc3RhdGljIHVuc2lnbmVkIGNoYXIgdGhyb3dfcGJfZmxhZzsKKyNpZmRlZiBERUJVR19QVFMKK3N0YXRpYyB1MzIgcHRzX2hpdCwgcHRzX21pc3NlZCwgcHRzX2lfaGl0LCBwdHNfaV9taXNzZWQ7CisjZW5kaWYKKworc3RhdGljIHUzMiByYWRyLCBydmFsOworc3RhdGljIHN0cnVjdCBkZWNfc3lzaW5mbyB2YXZzX2Ftc3RyZWFtX2RlY19pbmZvOworc3RhdGljIHN0cnVjdCB2ZGVjX2luZm8gKmd2czsKK3N0YXRpYyB1MzIgZnJfaGludF9zdGF0dXM7CitzdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IG5vdGlmeV93b3JrOworc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBzZXRfY2xrX3dvcms7CitzdGF0aWMgYm9vbCBpc19yZXNldDsKKworc3RhdGljIHN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBOVUxMOworCisjaWZkZWYgQVZTUF9MT05HX0NBQkFDCitzdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IGxvbmdfY2FiYWNfd2Rfd29yazsKK3ZvaWQgKmVzX3dyaXRlX2FkZHJfdmlydDsKK2RtYV9hZGRyX3QgZXNfd3JpdGVfYWRkcl9waHk7CisKK3ZvaWQgKmJpdHN0cmVhbV9yZWFkX3RtcDsKK2RtYV9hZGRyX3QgYml0c3RyZWFtX3JlYWRfdG1wX3BoeTsKK3ZvaWQgKmF2c3BfaGVhcF9hZHI7CitzdGF0aWMgdWludCBsb25nX2NhYmFjX2J1c3k7CisjZW5kaWYKKworCitzdGF0aWMgdm9pZCAqdXNlcl9kYXRhX2J1ZmZlcjsKK3N0YXRpYyBkbWFfYWRkcl90IHVzZXJfZGF0YV9idWZmZXJfcGh5czsKKworc3RhdGljIERFQ0xBUkVfS0ZJRk8obmV3ZnJhbWVfcSwgc3RydWN0IHZmcmFtZV9zICosIFZGX1BPT0xfU0laRSk7CitzdGF0aWMgREVDTEFSRV9LRklGTyhkaXNwbGF5X3EsIHN0cnVjdCB2ZnJhbWVfcyAqLCBWRl9QT09MX1NJWkUpOworc3RhdGljIERFQ0xBUkVfS0ZJRk8ocmVjeWNsZV9xLCBzdHJ1Y3QgdmZyYW1lX3MgKiwgVkZfUE9PTF9TSVpFKTsKKworc3RhdGljIGlubGluZSB1MzIgaW5kZXgyY2FudmFzKHUzMiBpbmRleCkKK3sKKwljb25zdCB1MzIgY2FudmFzX3RhYltWRl9CVUZfTlVNX01BWF0gPSB7CisJCTB4MDEwMTAwLCAweDAzMDMwMiwgMHgwNTA1MDQsIDB4MDcwNzA2LAorCQkweDA5MDkwOCwgMHgwYjBiMGEsIDB4MGQwZDBjLCAweDBmMGYwZSwKKwkJMHgxMTExMTAsIDB4MTMxMzEyLCAweDE1MTUxNCwgMHgxNzE3MTYsCisJCTB4MTkxOTE4LCAweDFiMWIxYSwgMHgxZDFkMWMsIDB4MWYxZjFlLAorCX07CisJY29uc3QgdTMyIGNhbnZhc190YWJfM1s0XSA9IHsKKwkJMHgwMTAxMDAsIDB4MDQwNDAzLCAweDA3MDcwNiwgMHgwYTBhMDkKKwl9OworCisJaWYgKGNhbnZhc19udW0gPT0gMikKKwkJcmV0dXJuIGNhbnZhc190YWJbaW5kZXhdICsgKGNhbnZhc19iYXNlIDw8IDE2KQorCQkrIChjYW52YXNfYmFzZSA8PCA4KSArIGNhbnZhc19iYXNlOworCisJcmV0dXJuIGNhbnZhc190YWJfM1tpbmRleF0gKyAoY2FudmFzX2Jhc2UgPDwgMTYpCisJCSsgKGNhbnZhc19iYXNlIDw8IDgpICsgY2FudmFzX2Jhc2U7Cit9CisKK3N0YXRpYyBjb25zdCB1MzIgZnJhbWVfcmF0ZV90YWJbMTZdID0geworCTk2MDAwIC8gMzAsCQkvKiBmb3JiaWRkZW4gKi8KKwk5NjAwMDAwMCAvIDIzOTc2LAkvKiAyNDAwMC8xMDAxICgyMy45NjcpICovCisJOTYwMDAgLyAyNCwKKwk5NjAwMCAvIDI1LAorCTk2MDAwMDAgLyAyOTk3LAkJLyogMzAwMDAvMTAwMSAoMjkuOTcpICovCisJOTYwMDAgLyAzMCwKKwk5NjAwMCAvIDUwLAorCTk2MDAwMDAgLyA1OTk0LAkJLyogNjAwMDAvMTAwMSAoNTkuOTQpICovCisJOTYwMDAgLyA2MCwKKwkvKiA+IDggcmVzZXJ2ZWQsIHVzZSAyNCAqLworCTk2MDAwIC8gMjQsIDk2MDAwIC8gMjQsIDk2MDAwIC8gMjQsIDk2MDAwIC8gMjQsCisJOTYwMDAgLyAyNCwgOTYwMDAgLyAyNCwgOTYwMDAgLyAyNAorfTsKKworc3RhdGljIHZvaWQgc2V0X2ZyYW1lX2luZm8oc3RydWN0IHZmcmFtZV9zICp2ZiwgdW5zaWduZWQgaW50ICpkdXJhdGlvbikKK3sKKwlpbnQgYXIgPSAwOworCisJdW5zaWduZWQgaW50IHBpeGVsX3JhdGlvID0gUkVBRF9WUkVHKEFWU19QSUNfUkFUSU8pOworI2lmbmRlZiBVU0VfQVZTX1NFUV9JTkZPCisJaWYgKHZhdnNfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGggPiAwCisJCSYmIHZhdnNfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0ID4gMCkgeworCQl2Zi0+d2lkdGggPSB2YXZzX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoOworCQl2Zi0+aGVpZ2h0ID0gdmF2c19hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQ7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCXZmLT53aWR0aCA9IFJFQURfVlJFRyhBVlNfUElDX1dJRFRIKTsKKwkJdmYtPmhlaWdodCA9IFJFQURfVlJFRyhBVlNfUElDX0hFSUdIVCk7CisJCWZyYW1lX3dpZHRoID0gdmYtPndpZHRoOworCQlmcmFtZV9oZWlnaHQgPSB2Zi0+aGVpZ2h0OworCQkvKiBwcl9pbmZvKCIlczogKCVkLCVkKVxuIiwgX19mdW5jX18sdmYtPndpZHRoLCB2Zi0+aGVpZ2h0KTsqLworCX0KKworI2lmbmRlZiBVU0VfQVZTX1NFUV9JTkZPCisJaWYgKHZhdnNfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSA+IDApCisJCSpkdXJhdGlvbiA9IHZhdnNfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZTsKKwllbHNlCisjZW5kaWYKKwl7CisJCSpkdXJhdGlvbiA9IGZyYW1lX3JhdGVfdGFiW1JFQURfVlJFRyhBVlNfRlJBTUVfUkFURSkgJiAweGZdOworCQkvKiBwcl9pbmZvKCIlczogZHVyYXRpb24gPSAlZFxuIiwgX19mdW5jX18sICpkdXJhdGlvbik7ICovCisJCWZyYW1lX2R1ciA9ICpkdXJhdGlvbjsKKwkJc2NoZWR1bGVfd29yaygmbm90aWZ5X3dvcmspOworCX0KKworCWlmICh2YXZzX3JhdGlvID09IDApIHsKKwkJLyogYWx3YXlzIHN0cmV0Y2ggdG8gMTY6OSAqLworCQl2Zi0+cmF0aW9fY29udHJvbCB8PSAoMHg5MCA8PAorCQkJCURJU1BfUkFUSU9fQVNQRUNUX1JBVElPX0JJVCk7CisJfSBlbHNlIHsKKwkJc3dpdGNoIChwaXhlbF9yYXRpbykgeworCQljYXNlIDE6CisJCQlhciA9ICh2Zi0+aGVpZ2h0ICogdmF2c19yYXRpbykgLyB2Zi0+d2lkdGg7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJYXIgPSAodmYtPmhlaWdodCAqIDMgKiB2YXZzX3JhdGlvKSAvICh2Zi0+d2lkdGggKiA0KTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlhciA9ICh2Zi0+aGVpZ2h0ICogOSAqIHZhdnNfcmF0aW8pIC8gKHZmLT53aWR0aCAqIDE2KTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlhciA9ICh2Zi0+aGVpZ2h0ICogMTAwICogdmF2c19yYXRpbykgLyAodmYtPndpZHRoICoKKwkJCQkJMjIxKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYXIgPSAodmYtPmhlaWdodCAqIHZhdnNfcmF0aW8pIC8gdmYtPndpZHRoOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlhciA9IG1pbihhciwgRElTUF9SQVRJT19BU1BFQ1RfUkFUSU9fTUFYKTsKKworCXZmLT5yYXRpb19jb250cm9sID0gKGFyIDw8IERJU1BfUkFUSU9fQVNQRUNUX1JBVElPX0JJVCk7CisJLyp2Zi0+cmF0aW9fY29udHJvbCB8PSBESVNQX1JBVElPX0ZPUkNFQ09ORklHIHwgRElTUF9SQVRJT19LRUVQUkFUSU87ICovCisKKwl2Zi0+ZmxhZyA9IDA7Cit9CisKKworc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCB1c2VyZGF0YV9wdXNoX3dvcms7CisvKgorI2RlZmluZSBEVU1QX0xBU1RfUkVQT1JURURfVVNFUl9EQVRBCisqLworc3RhdGljIHZvaWQgdXNlcmRhdGFfcHVzaF9kb193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwl1bnNpZ25lZCBpbnQgdXNlcl9kYXRhX2ZsYWdzOworCXVuc2lnbmVkIGludCB1c2VyX2RhdGFfd3A7CisJdW5zaWduZWQgaW50IHVzZXJfZGF0YV9sZW5ndGg7CisJc3RydWN0IHVzZXJkYXRhX3BvY19pbmZvX3QgdXNlcl9kYXRhX3BvYzsKKyNpZmRlZiBEVU1QX0xBU1RfUkVQT1JURURfVVNFUl9EQVRBCisJaW50IHVzZXJfZGF0YV9sZW47CisJaW50IHdwX3N0YXJ0OworCXVuc2lnbmVkIGNoYXIgKnBkYXRhOworCWludCBuTGVmdDsKKyNlbmRpZgorCisJdXNlcl9kYXRhX2ZsYWdzID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfTik7CisJdXNlcl9kYXRhX3dwID0gKHVzZXJfZGF0YV9mbGFncyA+PiAxNikgJiAweGZmZmY7CisJdXNlcl9kYXRhX2xlbmd0aCA9IHVzZXJfZGF0YV9mbGFncyAmIDB4N2ZmZjsKKworI2lmZGVmIERVTVBfTEFTVF9SRVBPUlRFRF9VU0VSX0RBVEEKKwlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQl1c2VyX2RhdGFfYnVmZmVyX3BoeXMsIFVTRVJfREFUQV9TSVpFLAorCQkJRE1BX0ZST01fREVWSUNFKTsKKworCWlmICh1c2VyX2RhdGFfbGVuZ3RoICYgMHgwNykKKwkJdXNlcl9kYXRhX2xlbiA9ICh1c2VyX2RhdGFfbGVuZ3RoICsgOCkgJiAweEZGRkZGRkY4OworCWVsc2UKKwkJdXNlcl9kYXRhX2xlbiA9IHVzZXJfZGF0YV9sZW5ndGg7CisKKwlpZiAodXNlcl9kYXRhX3dwID49IHVzZXJfZGF0YV9sZW4pIHsKKwkJd3Bfc3RhcnQgPSB1c2VyX2RhdGFfd3AgLSB1c2VyX2RhdGFfbGVuOworCisJCXBkYXRhID0gKHVuc2lnbmVkIGNoYXIgKil1c2VyX2RhdGFfYnVmZmVyOworCQlwZGF0YSArPSB3cF9zdGFydDsKKwkJbkxlZnQgPSB1c2VyX2RhdGFfbGVuOworCQl3aGlsZSAobkxlZnQgPj0gOCkgeworCQkJcHJfaW5mbygiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJCXBkYXRhWzBdLCBwZGF0YVsxXSwgcGRhdGFbMl0sIHBkYXRhWzNdLAorCQkJCXBkYXRhWzRdLCBwZGF0YVs1XSwgcGRhdGFbNl0sIHBkYXRhWzddKTsKKwkJCW5MZWZ0IC09IDg7CisJCQlwZGF0YSArPSA4OworCQl9CisJfSBlbHNlIHsKKwkJd3Bfc3RhcnQgPSB1c2VyX2RhdGFfd3AgKworCQkJVVNFUl9EQVRBX1NJWkUgLSB1c2VyX2RhdGFfbGVuOworCisJCXBkYXRhID0gKHVuc2lnbmVkIGNoYXIgKil1c2VyX2RhdGFfYnVmZmVyOworCQlwZGF0YSArPSB3cF9zdGFydDsKKwkJbkxlZnQgPSBVU0VSX0RBVEFfU0laRSAtIHdwX3N0YXJ0OworCisJCXdoaWxlIChuTGVmdCA+PSA4KSB7CisJCQlwcl9pbmZvKCIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQkJcGRhdGFbMF0sIHBkYXRhWzFdLCBwZGF0YVsyXSwgcGRhdGFbM10sCisJCQkJcGRhdGFbNF0sIHBkYXRhWzVdLCBwZGF0YVs2XSwgcGRhdGFbN10pOworCQkJbkxlZnQgLT0gODsKKwkJCXBkYXRhICs9IDg7CisJCX0KKworCQlwZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopdXNlcl9kYXRhX2J1ZmZlcjsKKwkJbkxlZnQgPSB1c2VyX2RhdGFfd3A7CisJCXdoaWxlIChuTGVmdCA+PSA4KSB7CisJCQlwcl9pbmZvKCIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQkJcGRhdGFbMF0sIHBkYXRhWzFdLCBwZGF0YVsyXSwgcGRhdGFbM10sCisJCQkJcGRhdGFbNF0sIHBkYXRhWzVdLCBwZGF0YVs2XSwgcGRhdGFbN10pOworCQkJbkxlZnQgLT0gODsKKwkJCXBkYXRhICs9IDg7CisJCX0KKwl9CisjZW5kaWYKKworLyoKKwlwcl9pbmZvKCJwb2NpbmZvIDB4JXgsIHBvYyAlZCwgd3AgMHgleCwgbGVuICVkXG4iLAorCQkgICBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9MKSwgUkVBRF9WUkVHKEFWX1NDUkFUQ0hfTSksCisJCSAgIHVzZXJfZGF0YV93cCwgdXNlcl9kYXRhX2xlbmd0aCk7CisqLworCXVzZXJfZGF0YV9wb2MucG9jX2luZm8gPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9MKTsKKwl1c2VyX2RhdGFfcG9jLnBvY19udW1iZXIgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9NKTsKKworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9OLCAwKTsKKy8qCisJd2FrZXVwX3VzZXJkYXRhX3BvbGwodXNlcl9kYXRhX3BvYywgdXNlcl9kYXRhX3dwLAorCQkJCSh1bnNpZ25lZCBsb25nKXVzZXJfZGF0YV9idWZmZXIsCisJCQkJVVNFUl9EQVRBX1NJWkUsIHVzZXJfZGF0YV9sZW5ndGgpOworKi8KK30KKworc3RhdGljIHZvaWQgVXNlckRhdGFIYW5kbGVyKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHVzZXJfZGF0YV9mbGFnczsKKworCXVzZXJfZGF0YV9mbGFncyA9IFJFQURfVlJFRyhBVl9TQ1JBVENIX04pOworCWlmICh1c2VyX2RhdGFfZmxhZ3MgJiAoMSA8PCAxNSkpIHsJLyogZGF0YSByZWFkeSAqLworCQlzY2hlZHVsZV93b3JrKCZ1c2VyZGF0YV9wdXNoX3dvcmspOworCX0KK30KKworCisjaWZkZWYgSEFORExFX0FWU19JUlEKK3N0YXRpYyBpcnFyZXR1cm5fdCB2YXZzX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCisjZWxzZQorc3RhdGljIHZvaWQgdmF2c19pc3Iodm9pZCkKKyNlbmRpZgoreworCXUzMiByZWc7CisJc3RydWN0IHZmcmFtZV9zICp2ZjsKKwl1MzIgZHVyOworCXUzMiByZXBlYXRfY291bnQ7CisJdTMyIHBpY3R1cmVfdHlwZTsKKwl1MzIgYnVmZmVyX2luZGV4OworCXUzMiBmcmFtZV9zaXplOworCWJvb2wgZm9yY2VfaW50ZXJsYWNlZF9mcmFtZSA9IGZhbHNlOworCXVuc2lnbmVkIGludCBwdHMsIHB0c192YWxpZCA9IDAsIG9mZnNldCA9IDA7CisJdTY0IHB0c191czY0OworCWlmIChkZWJ1Z19mbGFnICYgQVZTX0RFQlVHX1VDT0RFKSB7CisJCWlmIChSRUFEX1ZSRUcoQVZfU0NSQVRDSF9FKSAhPSAwKSB7CisJCQlwcl9pbmZvKCJkYmcleDogJXhcbiIsIFJFQURfVlJFRyhBVl9TQ1JBVENIX0UpLAorCQkJCSAgIFJFQURfVlJFRyhBVl9TQ1JBVENIX0QpKTsKKwkJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9FLCAwKTsKKwkJfQorCX0KKyNpZmRlZiBBVlNQX0xPTkdfQ0FCQUMKKwlpZiAoZmlybXdhcmVfc2VsID09IDAgJiYgUkVBRF9WUkVHKExPTkdfQ0FCQUNfUkVRKSkgeworI2lmZGVmIFBFUkZPUk1BTkNFX0RFQlVHCisJCXByX2luZm8oIiVzOnNjaGVkdWxlIGxvbmdfY2FiYWNfd2Rfd29ya1xyXG4iLCBfX2Z1bmNfXyk7CisjZW5kaWYKKwkJcHJfaW5mbygic2NoZWR1bGUgbG9uZ19jYWJhY193ZF93b3JrIGFuZCByZXF1ZXN0ZWQgZnJvbSAlZFxuIiwKKwkJCShSRUFEX1ZSRUcoTE9OR19DQUJBQ19SRVEpID4+IDgpJjB4RkYpOworCQlzY2hlZHVsZV93b3JrKCZsb25nX2NhYmFjX3dkX3dvcmspOworCX0KKyNlbmRpZgorCisKKwlVc2VyRGF0YUhhbmRsZXIoKTsKKworCXJlZyA9IFJFQURfVlJFRyhBVlNfQlVGRkVST1VUKTsKKworCWlmIChyZWcpIHsKKwkJaWYgKGRlYnVnX2ZsYWcgJiBBVlNfREVCVUdfUFJJTlQpCisJCQlwcl9pbmZvKCJBVlNfQlVGRkVST1VUPSV4XG4iLCByZWcpOworCQlpZiAocHRzX2J5X29mZnNldCkgeworCQkJb2Zmc2V0ID0gUkVBRF9WUkVHKEFWU19PRkZTRVRfUkVHKTsKKwkJCWlmIChkZWJ1Z19mbGFnICYgQVZTX0RFQlVHX1BSSU5UKQorCQkJCXByX2luZm8oIkFWUyBPRkZTRVQ9JXhcbiIsIG9mZnNldCk7CisJCQlpZiAocHRzX2xvb2t1cF9vZmZzZXRfdXM2NChQVFNfVFlQRV9WSURFTywgb2Zmc2V0LCAmcHRzLAorCQkJCSZmcmFtZV9zaXplLAorCQkJCTAsICZwdHNfdXM2NCkgPT0gMCkgeworCQkJCXB0c192YWxpZCA9IDE7CisjaWZkZWYgREVCVUdfUFRTCisJCQkJcHRzX2hpdCsrOworI2VuZGlmCisJCQl9IGVsc2UgeworI2lmZGVmIERFQlVHX1BUUworCQkJCXB0c19taXNzZWQrKzsKKyNlbmRpZgorCQkJfQorCQl9CisKKwkJcmVwZWF0X2NvdW50ID0gUkVBRF9WUkVHKEFWU19SRVBFQVRfQ09VTlQpOworCQlpZiAoZmlybXdhcmVfc2VsID09IDApCisJCQlidWZmZXJfaW5kZXggPQorCQkJCSgocmVnICYgMHg3KSArCisJCQkJKCgocmVnID4+IDgpICYgMHgzKSA8PCAzKSAtIDEpICYgMHgxZjsKKwkJZWxzZQorCQkJYnVmZmVyX2luZGV4ID0KKwkJCQkoKHJlZyAmIDB4NykgLSAxKSAmIDc7CisKKwkJcGljdHVyZV90eXBlID0gKHJlZyA+PiAzKSAmIDc7CisjaWZkZWYgREVCVUdfUFRTCisJCWlmIChwaWN0dXJlX3R5cGUgPT0gSV9QSUNUVVJFKSB7CisJCQkvKiBwcl9pbmZvKCJJIG9mZnNldCAweCV4LCBwdHNfdmFsaWQgJWRcbiIsCisJCQkgKiAgIG9mZnNldCwgcHRzX3ZhbGlkKTsKKwkJCSAqLworCQkJaWYgKCFwdHNfdmFsaWQpCisJCQkJcHRzX2lfbWlzc2VkKys7CisJCQllbHNlCisJCQkJcHRzX2lfaGl0Kys7CisJCX0KKyNlbmRpZgorCisJCWlmICgoZGVjX2NvbnRyb2wgJiBERUNfQ09OVFJPTF9GTEFHX0ZPUkNFXzI1MDBfMTA4MFBfSU5URVJMQUNFKQorCQkJJiYgZnJhbWVfd2lkdGggPT0gMTkyMCAmJiBmcmFtZV9oZWlnaHQgPT0gMTA4MCkgeworCQkJZm9yY2VfaW50ZXJsYWNlZF9mcmFtZSA9IHRydWU7CisJCX0KKworCQlpZiAodGhyb3dfcGJfZmxhZyAmJiBwaWN0dXJlX3R5cGUgIT0gSV9QSUNUVVJFKSB7CisKKwkJCWlmIChkZWJ1Z19mbGFnICYgQVZTX0RFQlVHX1BSSU5UKSB7CisJCQkJcHJfaW5mbygicGljdHVyZSB0eXBlICVkIHRocm93ZWRcbiIsCisJCQkJCSAgIHBpY3R1cmVfdHlwZSk7CisJCQl9CisJCQlXUklURV9WUkVHKEFWU19CVUZGRVJJTiwgfigxIDw8IGJ1ZmZlcl9pbmRleCkpOworCQl9IGVsc2UgaWYgKHJlZyAmIElOVEVSTEFDRV9GTEFHIHx8IGZvcmNlX2ludGVybGFjZWRfZnJhbWUpIHsJLyogaW50ZXJsYWNlICovCisJCQl0aHJvd19wYl9mbGFnID0gMDsKKworCQkJaWYgKGRlYnVnX2ZsYWcgJiBBVlNfREVCVUdfUFJJTlQpIHsKKwkJCQlwcl9pbmZvKCJpbnRlcmxhY2UsIHBpY3R1cmUgdHlwZSAlZFxuIiwKKwkJCQkJICAgcGljdHVyZV90eXBlKTsKKwkJCX0KKworCQkJaWYgKGtmaWZvX2dldCgmbmV3ZnJhbWVfcSwgJnZmKSA9PSAwKSB7CisJCQkJcHJfaW5mbworCQkJCSgiZmF0YWwgZXJyb3IsIG5vIGF2YWlsYWJsZSBidWZmZXIgc2xvdC4iKTsKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQl9CisJCQlzZXRfZnJhbWVfaW5mbyh2ZiwgJmR1cik7CisJCQl2Zi0+YnVmV2lkdGggPSAxOTIwOworCQkJcGljX3R5cGUgPSAyOworCQkJaWYgKChwaWN0dXJlX3R5cGUgPT0gSV9QSUNUVVJFKSAmJiBwdHNfdmFsaWQpIHsKKwkJCQl2Zi0+cHRzID0gcHRzOworCQkJCXZmLT5wdHNfdXM2NCA9IHB0c191czY0OworCQkJCWlmICgocmVwZWF0X2NvdW50ID4gMSkgJiYgYXZpX2ZsYWcpIHsKKwkJCQkJLyogbmV4dF9wdHMgPSBwdHMgKworCQkJCQkgKiAgICh2YXZzX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgKgorCQkJCQkgKiAgIHJlcGVhdF9jb3VudCA+PiAxKSoxNS8xNjsKKwkJCQkJICovCisJCQkJCW5leHRfcHRzID0KKwkJCQkJCXB0cyArCisJCQkJCQkoZHVyICogcmVwZWF0X2NvdW50ID4+IDEpICoKKwkJCQkJCTE1IC8gMTY7CisJCQkJfSBlbHNlCisJCQkJCW5leHRfcHRzID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJdmYtPnB0cyA9IG5leHRfcHRzOworCQkJCWlmICh2Zi0+cHRzID09IDApIHsKKwkJCQkJdmYtPnB0c191czY0ID0gMDsKKwkJCQl9CisJCQkJaWYgKChyZXBlYXRfY291bnQgPiAxKSAmJiBhdmlfZmxhZykgeworCQkJCQkvKiB2Zi0+ZHVyYXRpb24gPQorCQkJCQkgKiAgIHZhdnNfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSAqCisJCQkJCSAqICAgcmVwZWF0X2NvdW50ID4+IDE7CisJCQkJCSAqLworCQkJCQl2Zi0+ZHVyYXRpb24gPSBkdXIgKiByZXBlYXRfY291bnQgPj4gMTsKKwkJCQkJaWYgKG5leHRfcHRzICE9IDApIHsKKwkJCQkJCW5leHRfcHRzICs9CisJCQkJCQkJKCh2Zi0+ZHVyYXRpb24pIC0KKwkJCQkJCQkgKCh2Zi0+ZHVyYXRpb24pID4+IDQpKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCS8qIHZmLT5kdXJhdGlvbiA9CisJCQkJCSAqICAgdmF2c19hbXN0cmVhbV9kZWNfaW5mby5yYXRlID4+IDE7CisJCQkJCSAqLworCQkJCQl2Zi0+ZHVyYXRpb24gPSBkdXIgPj4gMTsKKwkJCQkJbmV4dF9wdHMgPSAwOworCQkJCX0KKwkJCX0KKwkJCXZmLT5zaWduYWxfdHlwZSA9IDA7CisJCQl2Zi0+aW5kZXggPSBidWZmZXJfaW5kZXg7CisJCQl2Zi0+ZHVyYXRpb25fcHVsbGRvd24gPSAwOworCQkJaWYgKGZvcmNlX2ludGVybGFjZWRfZnJhbWUpIHsKKwkJCQl2Zi0+dHlwZSA9IFZJRFRZUEVfSU5URVJMQUNFX1RPUDsKKwkJCX1lbHNleworCQkJCXZmLT50eXBlID0KKwkJCQkocmVnICYgVE9QX0ZJRUxEX0ZJUlNUX0ZMQUcpCisJCQkJPyBWSURUWVBFX0lOVEVSTEFDRV9UT1AKKwkJCQk6IFZJRFRZUEVfSU5URVJMQUNFX0JPVFRPTTsKKwkJCQl9CisjaWZkZWYgTlYyMQorCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9WSVVfTlYyMTsKKyNlbmRpZgorCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0KKwkJCQlpbmRleDJjYW52YXMoYnVmZmVyX2luZGV4KTsKKwkJCXZmLT50eXBlX29yaWdpbmFsID0gdmYtPnR5cGU7CisKKwkJCWlmIChkZWJ1Z19mbGFnICYgQVZTX0RFQlVHX1BSSU5UKSB7CisJCQkJcHJfaW5mbygiYnVmZmVyX2luZGV4ICVkLCBjYW52YXMgYWRkciAleFxuIiwKKwkJCQkJICAgYnVmZmVyX2luZGV4LCB2Zi0+Y2FudmFzMEFkZHIpOworCQkJfQorCisJCQl2Zi0+cHRzID0gKHB0c192YWxpZCk/cHRzOjA7CisJCQkvKgorCQkJKnZmLT5wdHNfdXM2NCA9IChwdHNfdmFsaWQpID8gcHRzX3VzNjQgOiAwOworCQkJKi8KKwkJCXZmYnVmX3VzZVtidWZmZXJfaW5kZXhdKys7CisJCQl2Zi0+bWVtX2hhbmRsZSA9CisJCQkJZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCQkJbW1fYmxrX2hhbmRsZSwKKwkJCQkJYnVmZmVyX2luZGV4KTsKKwkJCWRlY29kZXJfZG9fZnJhbWVfY2hlY2soTlVMTCwgdmYpOworCQkJa2ZpZm9fcHV0KCZkaXNwbGF5X3EsCisJCQkJCSAgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwkJCUFUUkFDRV9DT1VOVEVSKE1PRFVMRV9OQU1FLCB2Zi0+cHRzKTsKKwkJCXZmX25vdGlmeV9yZWNlaXZlcihQUk9WSURFUl9OQU1FLAorCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfVkZSQU1FX1JFQURZLAorCQkJCQlOVUxMKTsKKworCQkJaWYgKGtmaWZvX2dldCgmbmV3ZnJhbWVfcSwgJnZmKSA9PSAwKSB7CisJCQkJcHJfaW5mbygiZmF0YWwgZXJyb3IsIG5vIGF2YWlsYWJsZSBidWZmZXIgc2xvdC4iKTsKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQkJCQl9CisJCQlzZXRfZnJhbWVfaW5mbyh2ZiwgJmR1cik7CisJCQl2Zi0+YnVmV2lkdGggPSAxOTIwOworCQkJaWYgKGZvcmNlX2ludGVybGFjZWRfZnJhbWUpCisJCQkJdmYtPnB0cyA9IDA7CisJCQllbHNlCisJCQl2Zi0+cHRzID0gbmV4dF9wdHM7CisJCQlpZiAodmYtPnB0cyA9PSAwKSB7CisJCQkJdmYtPnB0c191czY0ID0gMDsKKwkJCX0KKwkJCWlmICgocmVwZWF0X2NvdW50ID4gMSkgJiYgYXZpX2ZsYWcpIHsKKwkJCQkvKiB2Zi0+ZHVyYXRpb24gPSB2YXZzX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgKgorCQkJCSAqICAgcmVwZWF0X2NvdW50ID4+IDE7CisJCQkJICovCisJCQkJdmYtPmR1cmF0aW9uID0gZHVyICogcmVwZWF0X2NvdW50ID4+IDE7CisJCQkJaWYgKG5leHRfcHRzICE9IDApIHsKKwkJCQkJbmV4dF9wdHMgKz0KKwkJCQkJCSgodmYtPmR1cmF0aW9uKSAtCisJCQkJCQkgKCh2Zi0+ZHVyYXRpb24pID4+IDQpKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIHZmLT5kdXJhdGlvbiA9IHZhdnNfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZQorCQkJCSAqICAgPj4gMTsKKwkJCQkgKi8KKwkJCQl2Zi0+ZHVyYXRpb24gPSBkdXIgPj4gMTsKKwkJCQluZXh0X3B0cyA9IDA7CisJCQl9CisJCQl2Zi0+c2lnbmFsX3R5cGUgPSAwOworCQkJdmYtPmluZGV4ID0gYnVmZmVyX2luZGV4OworCQkJdmYtPmR1cmF0aW9uX3B1bGxkb3duID0gMDsKKwkJCWlmIChmb3JjZV9pbnRlcmxhY2VkX2ZyYW1lKSB7CisJCQkJdmYtPnR5cGUgPSBWSURUWVBFX0lOVEVSTEFDRV9CT1RUT007CisJCQl9IGVsc2UgeworCQkJCQkJdmYtPnR5cGUgPQorCQkJCQkJKHJlZyAmIFRPUF9GSUVMRF9GSVJTVF9GTEFHKSA/CisJCQkJCQlWSURUWVBFX0lOVEVSTEFDRV9CT1RUT00gOgorCQkJCQkJVklEVFlQRV9JTlRFUkxBQ0VfVE9QOworCQkJCQl9CisjaWZkZWYgTlYyMQorCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9WSVVfTlYyMTsKKyNlbmRpZgorCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0KKwkJCQlpbmRleDJjYW52YXMoYnVmZmVyX2luZGV4KTsKKwkJCXZmLT50eXBlX29yaWdpbmFsID0gdmYtPnR5cGU7CisJCQl2Zi0+cHRzX3VzNjQgPSAwOworCQkJdmZidWZfdXNlW2J1ZmZlcl9pbmRleF0rKzsKKwkJCXZmLT5tZW1faGFuZGxlID0KKwkJCQlkZWNvZGVyX2JtbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCQltbV9ibGtfaGFuZGxlLAorCQkJCQlidWZmZXJfaW5kZXgpOworCisJCQlrZmlmb19wdXQoJmRpc3BsYXlfcSwKKwkJCQkJICAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQkJQVRSQUNFX0NPVU5URVIoTU9EVUxFX05BTUUsIHZmLT5wdHMpOworCQkJdmZfbm90aWZ5X3JlY2VpdmVyKFBST1ZJREVSX05BTUUsCisJCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9WRlJBTUVfUkVBRFksCisJCQkJCU5VTEwpOworCQkJdG90YWxfZnJhbWUrKzsKKwkJfSBlbHNlIHsJLyogcHJvZ3Jlc3NpdmUgKi8KKwkJCXRocm93X3BiX2ZsYWcgPSAwOworCisJCQlpZiAoZGVidWdfZmxhZyAmIEFWU19ERUJVR19QUklOVCkgeworCQkJCXByX2luZm8oInByb2dyZXNzaXZlIHBpY3R1cmUgdHlwZSAlZFxuIiwKKwkJCQkJICAgcGljdHVyZV90eXBlKTsKKwkJCX0KKwkJCWlmIChrZmlmb19nZXQoJm5ld2ZyYW1lX3EsICZ2ZikgPT0gMCkgeworCQkJCXByX2luZm8KKwkJCQkoImZhdGFsIGVycm9yLCBubyBhdmFpbGFibGUgYnVmZmVyIHNsb3QuIik7CisJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJfQorCQkJc2V0X2ZyYW1lX2luZm8odmYsICZkdXIpOworCQkJdmYtPmJ1ZldpZHRoID0gMTkyMDsKKwkJCXBpY190eXBlID0gMTsKKworCQkJaWYgKChwaWN0dXJlX3R5cGUgPT0gSV9QSUNUVVJFKSAmJiBwdHNfdmFsaWQpIHsKKwkJCQl2Zi0+cHRzID0gcHRzOworCQkJCWlmICgocmVwZWF0X2NvdW50ID4gMSkgJiYgYXZpX2ZsYWcpIHsKKwkJCQkJLyogbmV4dF9wdHMgPSBwdHMgKworCQkJCQkgKiAgICh2YXZzX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgKgorCQkJCQkgKiAgIHJlcGVhdF9jb3VudCkqMTUvMTY7CisJCQkJCSAqLworCQkJCQluZXh0X3B0cyA9CisJCQkJCQlwdHMgKworCQkJCQkJKGR1ciAqIHJlcGVhdF9jb3VudCkgKiAxNSAvIDE2OworCQkJCX0gZWxzZQorCQkJCQluZXh0X3B0cyA9IDA7CisJCQl9IGVsc2UgeworCQkJCXZmLT5wdHMgPSBuZXh0X3B0czsKKwkJCQlpZiAodmYtPnB0cyA9PSAwKSB7CisJCQkJCXZmLT5wdHNfdXM2NCA9IDA7CisJCQkJfQorCQkJCWlmICgocmVwZWF0X2NvdW50ID4gMSkgJiYgYXZpX2ZsYWcpIHsKKwkJCQkJLyogdmYtPmR1cmF0aW9uID0KKwkJCQkJICogICB2YXZzX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgKgorCQkJCQkgKiAgIHJlcGVhdF9jb3VudDsKKwkJCQkJICovCisJCQkJCXZmLT5kdXJhdGlvbiA9IGR1ciAqIHJlcGVhdF9jb3VudDsKKwkJCQkJaWYgKG5leHRfcHRzICE9IDApIHsKKwkJCQkJCW5leHRfcHRzICs9CisJCQkJCQkJKCh2Zi0+ZHVyYXRpb24pIC0KKwkJCQkJCQkgKCh2Zi0+ZHVyYXRpb24pID4+IDQpKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCS8qIHZmLT5kdXJhdGlvbiA9CisJCQkJCSAqICAgdmF2c19hbXN0cmVhbV9kZWNfaW5mby5yYXRlOworCQkJCQkgKi8KKwkJCQkJdmYtPmR1cmF0aW9uID0gZHVyOworCQkJCQluZXh0X3B0cyA9IDA7CisJCQkJfQorCQkJfQorCQkJdmYtPnNpZ25hbF90eXBlID0gMDsKKwkJCXZmLT5pbmRleCA9IGJ1ZmZlcl9pbmRleDsKKwkJCXZmLT5kdXJhdGlvbl9wdWxsZG93biA9IDA7CisJCQl2Zi0+dHlwZSA9IFZJRFRZUEVfUFJPR1JFU1NJVkUgfCBWSURUWVBFX1ZJVV9GSUVMRDsKKyNpZmRlZiBOVjIxCisJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX1ZJVV9OVjIxOworI2VuZGlmCisJCQl2Zi0+Y2FudmFzMEFkZHIgPSB2Zi0+Y2FudmFzMUFkZHIgPQorCQkJCWluZGV4MmNhbnZhcyhidWZmZXJfaW5kZXgpOworCQkJdmYtPnR5cGVfb3JpZ2luYWwgPSB2Zi0+dHlwZTsKKwkJCXZmLT5wdHMgPSAocHRzX3ZhbGlkKT9wdHM6MDsKKwkJCS8qCisJCQkqdmYtPnB0c191czY0ID0gKHB0c192YWxpZCkgPyBwdHNfdXM2NCA6IDA7CisJCQkqLworCQkJaWYgKGRlYnVnX2ZsYWcgJiBBVlNfREVCVUdfUFJJTlQpIHsKKwkJCQlwcl9pbmZvKCJidWZmZXJfaW5kZXggJWQsIGNhbnZhcyBhZGRyICV4XG4iLAorCQkJCQkgICBidWZmZXJfaW5kZXgsIHZmLT5jYW52YXMwQWRkcgorCQkJCQkgICApOworCQkJIHByX2luZm8oIlBpY1R5cGUgPSAlZCwgUFRTID0gMHgleFxuIiwKKwkJCQlwaWN0dXJlX3R5cGUsIHZmLT5wdHMpOworCQkJfQorCisJCQl2ZmJ1Zl91c2VbYnVmZmVyX2luZGV4XSsrOworCQkJdmYtPm1lbV9oYW5kbGUgPQorCQkJCWRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJCW1tX2Jsa19oYW5kbGUsCisJCQkJCWJ1ZmZlcl9pbmRleCk7CisJCQlkZWNvZGVyX2RvX2ZyYW1lX2NoZWNrKE5VTEwsIHZmKTsKKwkJCWtmaWZvX3B1dCgmZGlzcGxheV9xLAorCQkJCQkgIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCQlBVFJBQ0VfQ09VTlRFUihNT0RVTEVfTkFNRSwgdmYtPnB0cyk7CisJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoUFJPVklERVJfTkFNRSwKKwkJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1ZGUkFNRV9SRUFEWSwKKwkJCQkJTlVMTCk7CisJCQl0b3RhbF9mcmFtZSsrOworCQl9CisKKwkJLypjb3VudCBpbmZvKi8KKwkJZ3ZzLT5mcmFtZV9kdXIgPSBmcmFtZV9kdXI7CisJCXZkZWNfY291bnRfaW5mbyhndnMsIDAsIG9mZnNldCk7CisKKwkJLyogcHJfaW5mbygiUGljVHlwZSA9ICVkLCBQVFMgPSAweCV4XG4iLAorCQkgKiAgIHBpY3R1cmVfdHlwZSwgdmYtPnB0cyk7CisJCSAqLworCQlXUklURV9WUkVHKEFWU19CVUZGRVJPVVQsIDApOworCX0KKwlXUklURV9WUkVHKEFTU0lTVF9NQk9YMV9DTFJfUkVHLCAxKTsKKworI2lmZGVmIEhBTkRMRV9BVlNfSVJRCisJcmV0dXJuIElSUV9IQU5ETEVEOworI2Vsc2UKKwlyZXR1cm47CisjZW5kaWYKK30KKy8qCisgKnN0YXRpYyBpbnQgcnVuX2ZsYWcgPSAxOworICpzdGF0aWMgaW50IHN0ZXBfZmxhZzsKKyAqLworc3RhdGljIGludCBlcnJvcl9yZWNvdmVyeV9tb2RlOyAgIC8qMDogYmxvY2t5ICAxOiBtb3NhaWMqLworLyoKKyAqc3RhdGljIHVpbnQgZXJyb3Jfd2F0Y2hkb2dfdGhyZXNob2xkPTEwOworICpzdGF0aWMgdWludCBlcnJvcl93YXRjaGRvZ19jb3VudDsKKyAqc3RhdGljIHVpbnQgZXJyb3Jfd2F0Y2hkb2dfYnVmX3RocmVzaG9sZCA9IDB4NDAwMDAwMDsKKyAqLworCitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2YXZzX3ZmX3BlZWsodm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCB2ZnJhbWVfcyAqdmY7CisKKwlpZiAocmVjb3Zlcl9mbGFnKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChrZmlmb19wZWVrKCZkaXNwbGF5X3EsICZ2ZikpCisJCXJldHVybiB2ZjsKKworCXJldHVybiBOVUxMOworCit9CisKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZhdnNfdmZfZ2V0KHZvaWQgKm9wX2FyZykKK3sKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmOworCisJaWYgKHJlY292ZXJfZmxhZykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoa2ZpZm9fZ2V0KCZkaXNwbGF5X3EsICZ2ZikpCisJCXJldHVybiB2ZjsKKworCXJldHVybiBOVUxMOworCit9CisKK3N0YXRpYyB2b2lkIHZhdnNfdmZfcHV0KHN0cnVjdCB2ZnJhbWVfcyAqdmYsIHZvaWQgKm9wX2FyZykKK3sKKwlpbnQgaTsKKworCWlmIChyZWNvdmVyX2ZsYWcpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBWRl9QT09MX1NJWkU7IGkrKykgeworCQlpZiAodmYgPT0gJmN1cl92ZnBvb2xbaV0pCisJCQlicmVhazsKKwl9CisJaWYgKGkgPCBWRl9QT09MX1NJWkUpCisJCWtmaWZvX3B1dCgmcmVjeWNsZV9xLCAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCit9CisKK3N0YXRpYyBpbnQgdmF2c19ldmVudF9jYihpbnQgdHlwZSwgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZV9kYXRhKQoreworCWlmICh0eXBlICYgVkZSQU1FX0VWRU5UX1JFQ0VJVkVSX1JFUV9TVEFURSkgeworCQlzdHJ1Y3QgcHJvdmlkZXJfc3RhdGVfcmVxX3MgKnJlcSA9CisJCQkoc3RydWN0IHByb3ZpZGVyX3N0YXRlX3JlcV9zICopZGF0YTsKKwkJaWYgKHJlcS0+cmVxX3R5cGUgPT0gUkVRX1NUQVRFX1NFQ1VSRSAmJiB2ZGVjKQorCQkJcmVxLT5yZXFfcmVzdWx0WzBdID0gdmRlY19zZWN1cmUodmRlYyk7CisJCWVsc2UKKwkJCXJlcS0+cmVxX3Jlc3VsdFswXSA9IDB4ZmZmZmZmZmY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCB2YXZzX2RlY19zdGF0dXMoc3RydWN0IHZkZWNfcyAqdmRlYywgc3RydWN0IHZkZWNfaW5mbyAqdnN0YXR1cykKK3sKKwlpZiAoIShzdGF0ICYgU1RBVF9WREVDX1JVTikpCisJCXJldHVybiAtMTsKKworCXZzdGF0dXMtPmZyYW1lX3dpZHRoID0gZnJhbWVfd2lkdGg7CisJdnN0YXR1cy0+ZnJhbWVfaGVpZ2h0ID0gZnJhbWVfaGVpZ2h0OworCWlmIChmcmFtZV9kdXIgIT0gMCkKKwkJdnN0YXR1cy0+ZnJhbWVfcmF0ZSA9IDk2MDAwIC8gZnJhbWVfZHVyOworCWVsc2UKKwkJdnN0YXR1cy0+ZnJhbWVfcmF0ZSA9IC0xOworCXZzdGF0dXMtPmVycm9yX2NvdW50ID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfQyk7CisJdnN0YXR1cy0+c3RhdHVzID0gc3RhdDsKKwl2c3RhdHVzLT5iaXRfcmF0ZSA9IGd2cy0+Yml0X3JhdGU7CisJdnN0YXR1cy0+ZnJhbWVfZHVyID0gZnJhbWVfZHVyOworCXZzdGF0dXMtPmZyYW1lX2RhdGEgPSBndnMtPmZyYW1lX2RhdGE7CisJdnN0YXR1cy0+dG90YWxfZGF0YSA9IGd2cy0+dG90YWxfZGF0YTsKKwl2c3RhdHVzLT5mcmFtZV9jb3VudCA9IGd2cy0+ZnJhbWVfY291bnQ7CisJdnN0YXR1cy0+ZXJyb3JfZnJhbWVfY291bnQgPSBndnMtPmVycm9yX2ZyYW1lX2NvdW50OworCXZzdGF0dXMtPmRyb3BfZnJhbWVfY291bnQgPSBndnMtPmRyb3BfZnJhbWVfY291bnQ7CisJdnN0YXR1cy0+dG90YWxfZGF0YSA9IGd2cy0+dG90YWxfZGF0YTsKKwl2c3RhdHVzLT5zYW1wX2NudCA9IGd2cy0+c2FtcF9jbnQ7CisJdnN0YXR1cy0+b2Zmc2V0ID0gZ3ZzLT5vZmZzZXQ7CisJc25wcmludGYodnN0YXR1cy0+dmRlY19uYW1lLCBzaXplb2YodnN0YXR1cy0+dmRlY19uYW1lKSwKKwkJIiVzIiwgRFJJVkVSX05BTUUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB2YXZzX3NldF9pc3Jlc2V0KHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBpc3Jlc2V0KQoreworCWlzX3Jlc2V0ID0gaXNyZXNldDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2YXZzX3ZkZWNfaW5mb19pbml0KHZvaWQpCit7CisJZ3ZzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZkZWNfaW5mbyksIEdGUF9LRVJORUwpOworCWlmIChOVUxMID09IGd2cykgeworCQlwcl9pbmZvKCJ0aGUgc3RydWN0IG9mIHZkZWMgc3RhdHVzIG1hbGxvYyBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHZhdnNfY2FudmFzX2luaXQodm9pZCkKK3sKKwlpbnQgaSwgcmV0OworCXUzMiBjYW52YXNfd2lkdGgsIGNhbnZhc19oZWlnaHQ7CisJdTMyIGRlY2J1Zl9zaXplLCBkZWNidWZfeV9zaXplLCBkZWNidWZfdXZfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGJ1Zl9zdGFydDsKKwlpbnQgbmVlZF9hbGxvY19idWZfbnVtOworCXUzMiBlbmRpYW47CisKKwl2Zl9idWZfbnVtX3VzZWQgPSB2Zl9idWZfbnVtOworCWlmIChidWZfc2l6ZSA8PSAweDAwNDAwMDAwKSB7CisJCS8qIFNEIG9ubHkgKi8KKwkJY2FudmFzX3dpZHRoID0gNzY4OworCQljYW52YXNfaGVpZ2h0ID0gNTc2OworCQlkZWNidWZfeV9zaXplID0gMHg4MDAwMDsKKwkJZGVjYnVmX3V2X3NpemUgPSAweDIwMDAwOworCQlkZWNidWZfc2l6ZSA9IDB4MTAwMDAwOworCX0gZWxzZSB7CisJCS8qIEhEICYgU0QgKi8KKwkJY2FudmFzX3dpZHRoID0gMTkyMDsKKwkJY2FudmFzX2hlaWdodCA9IDEwODg7CisJCWRlY2J1Zl95X3NpemUgPSAweDIwMDAwMDsKKwkJZGVjYnVmX3V2X3NpemUgPSAweDgwMDAwOworCQlkZWNidWZfc2l6ZSA9IDB4MzAwMDAwOworCX0KKworI2lmZGVmIEFWU1BfTE9OR19DQUJBQworCW5lZWRfYWxsb2NfYnVmX251bSA9IHZmX2J1Zl9udW1fdXNlZCArIDI7CisjZWxzZQorCW5lZWRfYWxsb2NfYnVmX251bSA9IHZmX2J1Zl9udW1fdXNlZCArIDE7CisjZW5kaWYKKwlmb3IgKGkgPSAwOyBpIDwgbmVlZF9hbGxvY19idWZfbnVtOyBpKyspIHsKKworCQlpZiAoaSA9PSAobmVlZF9hbGxvY19idWZfbnVtIC0gMSkpCisJCQlkZWNidWZfc2l6ZSA9IFdPUktTUEFDRV9TSVpFOworI2lmZGVmIEFWU1BfTE9OR19DQUJBQworCQllbHNlIGlmIChpID09IChuZWVkX2FsbG9jX2J1Zl9udW0gLSAyKSkKKwkJCWRlY2J1Zl9zaXplID0gV09SS1NQQUNFX1NJWkVfQTsKKyNlbmRpZgorCQlyZXQgPSBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkobW1fYmxrX2hhbmRsZSwgaSwKKwkJCQlkZWNidWZfc2l6ZSwgRFJJVkVSX05BTUUsICZidWZfc3RhcnQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCWlmIChpID09IChuZWVkX2FsbG9jX2J1Zl9udW0gLSAxKSkgeworCQkJaWYgKGZpcm13YXJlX3NlbCA9PSAxKQorCQkJCWJ1Zl9vZmZzZXQgPSBidWZfc3RhcnQgLQorCQkJCQlSVl9BSV9CVUZGX1NUQVJUX0FERFI7CisJCQllbHNlCisJCQkJYnVmX29mZnNldCA9IGJ1Zl9zdGFydCAtCisJCQkJCUxPTkdfQ0FCQUNfUlZfQUlfQlVGRl9TVEFSVF9BRERSOworCQkJY29udGludWU7CisJCX0KKyNpZmRlZiBBVlNQX0xPTkdfQ0FCQUMKKwkJZWxzZSBpZiAoaSA9PSAobmVlZF9hbGxvY19idWZfbnVtIC0gMikpIHsKKwkJCWF2c3BfaGVhcF9hZHIgPSBjb2RlY19tbV9waHlzX3RvX3ZpcnQoYnVmX3N0YXJ0KTsKKwkJCWNvbnRpbnVlOworCQl9CisjZW5kaWYKKwkJaWYgKHZkZWMtPmNhbnZhc19tb2RlID09IENBTlZBU19CTEtNT0RFX0xJTkVBUikKKwkJCWVuZGlhbiA9IDc7CisJCWVsc2UKKwkJCWVuZGlhbiA9IDA7CisjaWZkZWYgTlYyMQorCQkJY29uZmlnX2Nhdl9sdXRfZXgoY2FudmFzX2Jhc2UgKyBjYW52YXNfbnVtICogaSArIDAsCisJCQkJCWJ1Zl9zdGFydCwKKwkJCQkJY2FudmFzX3dpZHRoLCBjYW52YXNfaGVpZ2h0LAorCQkJCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCQkJCXZkZWMtPmNhbnZhc19tb2RlLCBlbmRpYW4sIFZERUNfMSk7CisJCQljb25maWdfY2F2X2x1dF9leChjYW52YXNfYmFzZSArIGNhbnZhc19udW0gKiBpICsgMSwKKwkJCQkJYnVmX3N0YXJ0ICsKKwkJCQkJZGVjYnVmX3lfc2l6ZSwgY2FudmFzX3dpZHRoLAorCQkJCQljYW52YXNfaGVpZ2h0IC8gMiwKKwkJCQkJQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJCQl2ZGVjLT5jYW52YXNfbW9kZSwgZW5kaWFuLCBWREVDXzEpOworI2Vsc2UKKwkJCWNvbmZpZ19jYXZfbHV0X2V4KGNhbnZhc19udW0gKiBpICsgMCwKKwkJCQkJYnVmX3N0YXJ0LAorCQkJCQljYW52YXNfd2lkdGgsIGNhbnZhc19oZWlnaHQsCisJCQkJCUNBTlZBU19BRERSX05PV1JBUCwKKwkJCQkJdmRlYy0+Y2FudmFzX21vZGUsIGVuZGlhbiwgVkRFQ18xKTsKKwkJCWNvbmZpZ19jYXZfbHV0X2V4KGNhbnZhc19udW0gKiBpICsgMSwKKwkJCQkJYnVmX3N0YXJ0ICsKKwkJCQkJZGVjYnVmX3lfc2l6ZSwgY2FudmFzX3dpZHRoIC8gMiwKKwkJCQkJY2FudmFzX2hlaWdodCAvIDIsCisJCQkJCUNBTlZBU19BRERSX05PV1JBUCwKKwkJCQkJdmRlYy0+Y2FudmFzX21vZGUsIGVuZGlhbiwgVkRFQ18xKTsKKwkJCWNvbmZpZ19jYXZfbHV0X2V4KGNhbnZhc19udW0gKiBpICsgMiwKKwkJCQkJYnVmX3N0YXJ0ICsKKwkJCQkJZGVjYnVmX3lfc2l6ZSArIGRlY2J1Zl91dl9zaXplLAorCQkJCQljYW52YXNfd2lkdGggLyAyLCBjYW52YXNfaGVpZ2h0IC8gMiwKKwkJCQkJQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJCQl2ZGVjLT5jYW52YXNfbW9kZSwgZW5kaWFuLCBWREVDXzEpOworI2VuZGlmCisJCQlpZiAoZGVidWdfZmxhZyAmIEFWU19ERUJVR19QUklOVCkgeworCQkJCXByX2luZm8oImNhbnZhcyBjb25maWcgJWQsIGFkZHIgJXBcbiIsIGksCisJCQkJCSAgICh2b2lkICopYnVmX3N0YXJ0KTsKKwkJCX0KKworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCB2YXZzX3JlY292ZXIodm9pZCkKK3sKKwl2YXZzX2NhbnZhc19pbml0KCk7CisKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsICgxIDw8IDcpIHwgKDEgPDwgNikgfCAoMSA8PCA0KSk7CisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAwKTsKKworCVJFQURfVlJFRyhET1NfU1dfUkVTRVQwKTsKKworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgKDEgPDwgNykgfCAoMSA8PCA2KSB8ICgxIDw8IDQpKTsKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsIDApOworCisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAoMSA8PCA5KSB8ICgxIDw8IDgpKTsKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsIDApOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9ILCAwKTsKKwlpZiAoZmlybXdhcmVfc2VsID09IDEpIHsKKwkJV1JJVEVfVlJFRyhQT1dFUl9DVExfVkxELCAweDEwKTsKKwkJV1JJVEVfVlJFR19CSVRTKFZMRF9NRU1fVklGSUZPX0NPTlRST0wsIDIsCisJCQlNRU1fRklGT19DTlRfQklULCAyKTsKKwkJV1JJVEVfVlJFR19CSVRTKFZMRF9NRU1fVklGSUZPX0NPTlRST0wsIDgsCisJCQlNRU1fTEVWRUxfQ05UX0JJVCwgNik7CisJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9ILCAxKTsgLy8gOCBidWYgZmxhZyB0byB1Y29kZQorCX0KKworCisJaWYgKGZpcm13YXJlX3NlbCA9PSAwKSB7CisJCS8qIGZpeGVkIGNhbnZhcyBpbmRleCAqLworCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfMCwgY2FudmFzX2Jhc2UpOworCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfMSwgdmZfYnVmX251bV91c2VkKTsKKwl9IGVsc2UgeworCQlpbnQgaWk7CisKKwkJZm9yIChpaSA9IDA7IGlpIDwgNDsgaWkrKykgeworCQkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzAgKyBpaSwKKwkJCQkoY2FudmFzX2Jhc2UgKyBjYW52YXNfbnVtICogaWkpIHwKKwkJCQkoKGNhbnZhc19iYXNlICsgY2FudmFzX251bSAqIGlpICsgMSkKKwkJCQkJPDwgOCkgfAorCQkJCSgoY2FudmFzX2Jhc2UgKyBjYW52YXNfbnVtICogaWkgKyAxKQorCQkJCQk8PCAxNikKKwkJCSk7CisJCX0KKwl9CisKKwkvKiBub3RpZnkgdWNvZGUgdGhlIGJ1ZmZlciBvZmZzZXQgKi8KKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfRiwgYnVmX29mZnNldCk7CisKKwkvKiBkaXNhYmxlIFBTQ0FMRSBmb3IgaGFyZHdhcmUgc2hhcmluZyAqLworCVdSSVRFX1ZSRUcoUFNDQUxFX0NUUkwsIDApOworCisJV1JJVEVfVlJFRyhBVlNfU09TX0NPVU5ULCAwKTsKKwlXUklURV9WUkVHKEFWU19CVUZGRVJJTiwgMCk7CisJV1JJVEVfVlJFRyhBVlNfQlVGRkVST1VULCAwKTsKKwlpZiAoZXJyb3JfcmVjb3ZlcnlfbW9kZSkKKwkJV1JJVEVfVlJFRyhBVlNfRVJST1JfUkVDT1ZFUllfTU9ERSwgMCk7CisJZWxzZQorCQlXUklURV9WUkVHKEFWU19FUlJPUl9SRUNPVkVSWV9NT0RFLCAxKTsKKwkvKiBjbGVhciBtYWlsYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoQVNTSVNUX01CT1gxX0NMUl9SRUcsIDEpOworCisJLyogZW5hYmxlIG1haWxib3ggaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfTUFTSywgMSk7CisjaWYgMQkJCQkvKiBkZWYgREVCVUdfVUNPREUgKi8KKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfRCwgMCk7CisjZW5kaWYKKworI2lmZGVmIE5WMjEKKwlTRVRfVlJFR19NQVNLKE1ERUNfUElDX0RDX0NUUkwsIDEgPDwgMTcpOworI2VuZGlmCisKKyNpZmRlZiBQSUNfRENfTkVFRF9DTEVBUgorCUNMRUFSX1ZSRUdfTUFTSyhNREVDX1BJQ19EQ19DVFJMLCAxIDw8IDMxKTsKKyNlbmRpZgorCisjaWZkZWYgQVZTUF9MT05HX0NBQkFDCisJaWYgKGZpcm13YXJlX3NlbCA9PSAwKSB7CisJCVdSSVRFX1ZSRUcoTE9OR19DQUJBQ19ERVNfQUREUiwgZXNfd3JpdGVfYWRkcl9waHkpOworCQlXUklURV9WUkVHKExPTkdfQ0FCQUNfUkVRLCAwKTsKKwkJV1JJVEVfVlJFRyhMT05HX0NBQkFDX1BJQ19TSVpFLCAwKTsKKwkJV1JJVEVfVlJFRyhMT05HX0NBQkFDX1NSQ19BRERSLCAwKTsKKwl9CisjZW5kaWYKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfTiwgKHUzMikodXNlcl9kYXRhX2J1ZmZlcl9waHlzIC0gYnVmX29mZnNldCkpOworCXByX2luZm8oInN1cHBvcnRfdXNlcl9kYXRhID0gJWRcbiIsIHN1cHBvcnRfdXNlcl9kYXRhKTsKKwlpZiAoc3VwcG9ydF91c2VyX2RhdGEpCisJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9NLCAxKTsKKwllbHNlCisJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9NLCAwKTsKKworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF81LCAwKTsKKworfQorCitzdGF0aWMgaW50IHZhdnNfcHJvdF9pbml0KHZvaWQpCit7CisJaW50IHI7CisjaWYgMSAvKiBNRVNPTl9DUFVfVFlQRSA+PSBNRVNPTl9DUFVfVFlQRV9NRVNPTjYgKi8KKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsICgxIDw8IDcpIHwgKDEgPDwgNikgfCAoMSA8PCA0KSk7CisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAwKTsKKworCVJFQURfVlJFRyhET1NfU1dfUkVTRVQwKTsKKworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgKDEgPDwgNykgfCAoMSA8PCA2KSB8ICgxIDw8IDQpKTsKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsIDApOworCisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAoMSA8PCA5KSB8ICgxIDw8IDgpKTsKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsIDApOworCisjZWxzZQorCVdSSVRFX1JFU0VUX1JFRyhSRVNFVDBfUkVHSVNURVIsCisJCQkJICAgUkVTRVRfSVFJRENUIHwgUkVTRVRfTUMgfCBSRVNFVF9WTERfUEFSVCk7CisJUkVBRF9SRVNFVF9SRUcoUkVTRVQwX1JFR0lTVEVSKTsKKwlXUklURV9SRVNFVF9SRUcoUkVTRVQwX1JFR0lTVEVSLAorCQkJCSAgIFJFU0VUX0lRSURDVCB8IFJFU0VUX01DIHwgUkVTRVRfVkxEX1BBUlQpOworCisJV1JJVEVfUkVTRVRfUkVHKFJFU0VUMl9SRUdJU1RFUiwgUkVTRVRfUElDX0RDIHwgUkVTRVRfREJMSyk7CisjZW5kaWYKKworCS8qKioqKioqKioqKioqKioqKiByZXNldCB2bGQgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCVdSSVRFX1ZSRUcoUE9XRVJfQ1RMX1ZMRCwgMHgxMCk7CisJV1JJVEVfVlJFR19CSVRTKFZMRF9NRU1fVklGSUZPX0NPTlRST0wsIDIsIE1FTV9GSUZPX0NOVF9CSVQsIDIpOworCVdSSVRFX1ZSRUdfQklUUyhWTERfTUVNX1ZJRklGT19DT05UUk9MLAk4LCBNRU1fTEVWRUxfQ05UX0JJVCwgNik7CisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwlyID0gdmF2c19jYW52YXNfaW5pdCgpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9ILCAwKTsKKyNpZmRlZiBOVjIxCisJCWlmIChmaXJtd2FyZV9zZWwgPT0gMCkgeworCQkJLyogZml4ZWQgY2FudmFzIGluZGV4ICovCisJCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfMCwgY2FudmFzX2Jhc2UpOworCQkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzEsIHZmX2J1Zl9udW1fdXNlZCk7CisJCX0gZWxzZSB7CisJCQlpbnQgaWk7CisKKwkJCWZvciAoaWkgPSAwOyBpaSA8IDQ7IGlpKyspIHsKKwkJCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfMCArIGlpLAorCQkJCQkoY2FudmFzX2Jhc2UgKyBjYW52YXNfbnVtICogaWkpIHwKKwkJCQkJKChjYW52YXNfYmFzZSArIGNhbnZhc19udW0gKiBpaSArIDEpCisJCQkJCQk8PCA4KSB8CisJCQkJCSgoY2FudmFzX2Jhc2UgKyBjYW52YXNfbnVtICogaWkgKyAxKQorCQkJCQkJPDwgMTYpCisJCQkJKTsKKwkJCX0KKwkJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9ILCAxKTsgLy8gOCBidWYgZmxhZyB0byB1Y29kZQorCQl9CisjZWxzZQorCS8qIGluZGV4IHYgPDwgMTYgfCB1IDw8IDggfCB5ICovCisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzAsIDB4MDIwMTAwKTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfMSwgMHgwNTA0MDMpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8yLCAweDA4MDcwNik7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzMsIDB4MGIwYTA5KTsKKyNlbmRpZgorCS8qIG5vdGlmeSB1Y29kZSB0aGUgYnVmZmVyIG9mZnNldCAqLworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9GLCBidWZfb2Zmc2V0KTsKKworCS8qIGRpc2FibGUgUFNDQUxFIGZvciBoYXJkd2FyZSBzaGFyaW5nICovCisJV1JJVEVfVlJFRyhQU0NBTEVfQ1RSTCwgMCk7CisKKwlXUklURV9WUkVHKEFWU19TT1NfQ09VTlQsIDApOworCVdSSVRFX1ZSRUcoQVZTX0JVRkZFUklOLCAwKTsKKwlXUklURV9WUkVHKEFWU19CVUZGRVJPVVQsIDApOworCWlmIChlcnJvcl9yZWNvdmVyeV9tb2RlKQorCQlXUklURV9WUkVHKEFWU19FUlJPUl9SRUNPVkVSWV9NT0RFLCAwKTsKKwllbHNlCisJCVdSSVRFX1ZSRUcoQVZTX0VSUk9SX1JFQ09WRVJZX01PREUsIDEpOworCS8qIGNsZWFyIG1haWxib3ggaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfQ0xSX1JFRywgMSk7CisKKwkvKiBlbmFibGUgbWFpbGJveCBpbnRlcnJ1cHQgKi8KKwlXUklURV9WUkVHKEFTU0lTVF9NQk9YMV9NQVNLLCAxKTsKKyNpZiAxCQkJCS8qIGRlZiBERUJVR19VQ09ERSAqLworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9ELCAwKTsKKyNlbmRpZgorCisjaWZkZWYgTlYyMQorCVNFVF9WUkVHX01BU0soTURFQ19QSUNfRENfQ1RSTCwgMSA8PCAxNyk7CisjZW5kaWYKKworI2lmZGVmIFBJQ19EQ19ORUVEX0NMRUFSCisJQ0xFQVJfVlJFR19NQVNLKE1ERUNfUElDX0RDX0NUUkwsIDEgPDwgMzEpOworI2VuZGlmCisKKyNpZmRlZiBBVlNQX0xPTkdfQ0FCQUMKKwlpZiAoZmlybXdhcmVfc2VsID09IDApIHsKKwkJV1JJVEVfVlJFRyhMT05HX0NBQkFDX0RFU19BRERSLCBlc193cml0ZV9hZGRyX3BoeSk7CisJCVdSSVRFX1ZSRUcoTE9OR19DQUJBQ19SRVEsIDApOworCQlXUklURV9WUkVHKExPTkdfQ0FCQUNfUElDX1NJWkUsIDApOworCQlXUklURV9WUkVHKExPTkdfQ0FCQUNfU1JDX0FERFIsIDApOworCX0KKyNlbmRpZgorCisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX04sICh1MzIpKHVzZXJfZGF0YV9idWZmZXJfcGh5cyAtIGJ1Zl9vZmZzZXQpKTsKKwlwcl9pbmZvKCJzdXBwb3J0X3VzZXJfZGF0YSA9ICVkXG4iLCBzdXBwb3J0X3VzZXJfZGF0YSk7CisJaWYgKHN1cHBvcnRfdXNlcl9kYXRhKQorCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfTSwgMSk7CisJZWxzZQorCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfTSwgMCk7CisKKwlyZXR1cm4gcjsKK30KKworI2lmZGVmIEFWU1BfTE9OR19DQUJBQworc3RhdGljIHVuc2lnbmVkIGNoYXIgZXNfd3JpdGVfYWRkcltNQVhfQ09ERURfRlJBTUVfU0laRV0gIF9fYWxpZ25lZCg2NCk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIHZhdnNfbG9jYWxfaW5pdChib29sIGlzX3Jlc2V0KQoreworCWludCBpOworCisJaXNfcmVzZXQgPSAwOworCXZhdnNfcmF0aW8gPSB2YXZzX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGlvOworCisJYXZpX2ZsYWcgPSAodW5zaWduZWQgbG9uZykgdmF2c19hbXN0cmVhbV9kZWNfaW5mby5wYXJhbTsKKworCWZyYW1lX3dpZHRoID0gZnJhbWVfaGVpZ2h0ID0gZnJhbWVfZHVyID0gZnJhbWVfcHJvZyA9IDA7CisKKwl0aHJvd19wYl9mbGFnID0gMTsKKworCXRvdGFsX2ZyYW1lID0gMDsKKwlzYXZlZF9yZXNvbHV0aW9uID0gMDsKKwluZXh0X3B0cyA9IDA7CisKKyNpZmRlZiBERUJVR19QVFMKKwlwdHNfaGl0ID0gcHRzX21pc3NlZCA9IHB0c19pX2hpdCA9IHB0c19pX21pc3NlZCA9IDA7CisjZW5kaWYKKworCWlmICghaXNfcmVzZXQpIHsKKwkJSU5JVF9LRklGTyhkaXNwbGF5X3EpOworCQlJTklUX0tGSUZPKHJlY3ljbGVfcSk7CisJCUlOSVRfS0ZJRk8obmV3ZnJhbWVfcSk7CisKKwkJZm9yIChpID0gMDsgaSA8IFZGX1BPT0xfU0laRTsgaSsrKSB7CisJCQljb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKnZmID0gJnZmcG9vbFtpXTsKKworCQkJdmZwb29sW2ldLmluZGV4ID0gdmZfYnVmX251bTsKKwkJCXZmcG9vbFtpXS5idWZXaWR0aCA9IDE5MjA7CisJCQlrZmlmb19wdXQoJm5ld2ZyYW1lX3EsIHZmKTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCB2Zl9idWZfbnVtOyBpKyspCisJCQl2ZmJ1Zl91c2VbaV0gPSAwOworCX0KKworCWN1cl92ZnBvb2wgPSB2ZnBvb2w7CisKKwlpZiAocmVjb3Zlcl9mbGFnID09IDEpCisJCXJldHVybjsKKworCWlmIChtbV9ibGtfaGFuZGxlKSB7CisJCWRlY29kZXJfYm1tdV9ib3hfZnJlZShtbV9ibGtfaGFuZGxlKTsKKwkJbW1fYmxrX2hhbmRsZSA9IE5VTEw7CisJfQorCisJbW1fYmxrX2hhbmRsZSA9IGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYm94KAorCQlEUklWRVJfTkFNRSwKKwkJMCwKKwkJTUFYX0JNTVVfQlVGRkVSX05VTSwKKwkJNCArIFBBR0VfU0hJRlQsCisJCUNPREVDX01NX0ZMQUdTX0NNQV9DTEVBUiB8CisJCUNPREVDX01NX0ZMQUdTX0ZPUl9WREVDT0RFUik7CisKK30KKworc3RhdGljIGludCB2YXZzX3ZmX3N0YXRlcyhzdHJ1Y3QgdmZyYW1lX3N0YXRlcyAqc3RhdGVzLCB2b2lkICpvcF9hcmcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CisJc3RhdGVzLT52Zl9wb29sX3NpemUgPSBWRl9QT09MX1NJWkU7CisJc3RhdGVzLT5idWZfZnJlZV9udW0gPSBrZmlmb19sZW4oJm5ld2ZyYW1lX3EpOworCXN0YXRlcy0+YnVmX2F2YWlsX251bSA9IGtmaWZvX2xlbigmZGlzcGxheV9xKTsKKwlzdGF0ZXMtPmJ1Zl9yZWN5Y2xlX251bSA9IGtmaWZvX2xlbigmcmVjeWNsZV9xKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19QT1NUX1BST0NFU1NfTUFOQUdFUgorc3RhdGljIHZvaWQgdmF2c19wcG1ncl9yZXNldCh2b2lkKQoreworCXZmX25vdGlmeV9yZWNlaXZlcihQUk9WSURFUl9OQU1FLCBWRlJBTUVfRVZFTlRfUFJPVklERVJfUkVTRVQsIE5VTEwpOworCisJdmF2c19sb2NhbF9pbml0KHRydWUpOworCisJcHJfaW5mbygidmF2czogdmZfcHBtZ3JfcmVzZXRcbiIpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHZhdnNfbG9jYWxfcmVzZXQodm9pZCkKK3sKKwltdXRleF9sb2NrKCZ2YXZzX211dGV4KTsKKwkvL3JlY292ZXJfZmxhZyA9IDE7CisJcHJfaW5mbygiZXJyb3IsIGxvY2FsIHJlc2V0XG4iKTsKKwlhbXZkZWNfc3RvcCgpOworCW1zbGVlcCgxMDApOworCXZmX25vdGlmeV9yZWNlaXZlcihQUk9WSURFUl9OQU1FLCBWRlJBTUVfRVZFTlRfUFJPVklERVJfUkVTRVQsIE5VTEwpOworCXZhdnNfbG9jYWxfaW5pdCh0cnVlKTsKKwl2YXZzX3JlY292ZXIoKTsKKworCisJcmVzZXRfdXNlcmRhdGFfZmlmbygxKTsKKworCisJYW12ZGVjX3N0YXJ0KCk7CisJcmVjb3Zlcl9mbGFnID0gMDsKKyNpZiAwCisJZXJyb3Jfd2F0Y2hkb2dfY291bnQgPSAwOworCisJcHJfaW5mbygicGMgJXggc3RyZWFtIGJ1ZiB3cCAleCBycCAleCBsZXZlbCAleFxuIiwKKwkJUkVBRF9WUkVHKE1QQ19FKSwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1dQKSwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKSk7CisjZW5kaWYKKworCisKKwltdXRleF91bmxvY2soJnZhdnNfbXV0ZXgpOworfQorCitzdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IGZhdGFsX2Vycm9yX3dkX3dvcms7CitzdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IG5vdGlmeV93b3JrOworc3RhdGljIGF0b21pY190IGVycm9yX2hhbmRsZXJfcnVuID0gQVRPTUlDX0lOSVQoMCk7CitzdGF0aWMgdm9pZCB2YXZzX2ZhdGFsX2Vycm9yX2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWlmIChkZWJ1Z19mbGFnICYgQVZTX0RFQlVHX09MRF9FUlJPUl9IQU5ETEUpIHsKKwkJbXV0ZXhfbG9jaygmdmF2c19tdXRleCk7CisJCXByX2luZm8oInZhdnMgZmF0YWwgZXJyb3IgcmVzZXQgIVxuIik7CisJCWFtdmRlY19zdG9wKCk7CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfUE9TVF9QUk9DRVNTX01BTkFHRVIKKwkJdmF2c19wcG1ncl9yZXNldCgpOworI2Vsc2UKKwkJdmZfbGlnaHRfdW5yZWdfcHJvdmlkZXIoJnZhdnNfdmZfcHJvdik7CisJCXZhdnNfbG9jYWxfaW5pdCh0cnVlKTsKKwkJdmZfcmVnX3Byb3ZpZGVyKCZ2YXZzX3ZmX3Byb3YpOworI2VuZGlmCisJCXZhdnNfcmVjb3ZlcigpOworCQlhbXZkZWNfc3RhcnQoKTsKKwkJbXV0ZXhfdW5sb2NrKCZ2YXZzX211dGV4KTsKKwl9IGVsc2UgeworCQlwcl9pbmZvKCJhdnMgZmF0YWxfZXJyb3JfaGFuZGxlclxuIik7CisJCXZhdnNfbG9jYWxfcmVzZXQoKTsKKwl9CisJYXRvbWljX3NldCgmZXJyb3JfaGFuZGxlcl9ydW4sIDApOworfQorCitzdGF0aWMgdm9pZCB2YXZzX25vdGlmeV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlpZiAoZnJfaGludF9zdGF0dXMgPT0gVkRFQ19ORUVEX0hJTlQpIHsKKwkJdmZfbm90aWZ5X3JlY2VpdmVyKFBST1ZJREVSX05BTUUgLAorCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX0ZSX0hJTlQgLAorCQkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpZnJhbWVfZHVyKSk7CisJCWZyX2hpbnRfc3RhdHVzID0gVkRFQ19ISU5URUQ7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgYXZzX3NldF9jbGsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCQlpbnQgZnBzID0gOTYwMDAgLyBmcmFtZV9kdXI7CisKKwkJc2F2ZWRfcmVzb2x1dGlvbiA9IGZyYW1lX3dpZHRoICogZnJhbWVfaGVpZ2h0ICogZnBzOworCQlpZiAoZmlybXdhcmVfc2VsID09IDAgJiYKKwkJCShkZWJ1Z19mbGFnICYgQVZTX0RFQlVHX1VTRV9GVUxMX1NQRUVEKSkgeworCQkJdmRlY19zb3VyY2VfY2hhbmdlZChWRk9STUFUX0FWUywKKwkJCQk0MDk2LCAyMDQ4LCA2MCk7CisJCX0gZWxzZSB7CisJCQl2ZGVjX3NvdXJjZV9jaGFuZ2VkKFZGT1JNQVRfQVZTLAorCQkJZnJhbWVfd2lkdGgsIGZyYW1lX2hlaWdodCwgZnBzKTsKKwkJfQorfQorCitzdGF0aWMgdm9pZCB2YXZzX3B1dF90aW1lcl9mdW5jKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKK3sKKyNpZm5kZWYgSEFORExFX0FWU19JUlEKKwl2YXZzX2lzcigpOworI2VuZGlmCisKKwlpZiAoUkVBRF9WUkVHKEFWU19TT1NfQ09VTlQpKSB7CisJCWlmICghZXJyb3JfcmVjb3ZlcnlfbW9kZSkgeworI2lmIDAKKwkJCWlmIChkZWJ1Z19mbGFnICYgQVZTX0RFQlVHX09MRF9FUlJPUl9IQU5ETEUpIHsKKwkJCQltdXRleF9sb2NrKCZ2YXZzX211dGV4KTsKKwkJCQlwcl9pbmZvKCJ2YXZzIGZhdGFsIGVycm9yIHJlc2V0ICFcbiIpOworCQkJCWFtdmRlY19zdG9wKCk7CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfUE9TVF9QUk9DRVNTX01BTkFHRVIKKwkJCQl2YXZzX3BwbWdyX3Jlc2V0KCk7CisjZWxzZQorCQkJCXZmX2xpZ2h0X3VucmVnX3Byb3ZpZGVyKCZ2YXZzX3ZmX3Byb3YpOworCQkJCXZhdnNfbG9jYWxfaW5pdCh0cnVlKTsKKwkJCQl2Zl9yZWdfcHJvdmlkZXIoJnZhdnNfdmZfcHJvdik7CisjZW5kaWYKKwkJCQl2YXZzX3JlY292ZXIoKTsKKwkJCQlhbXZkZWNfc3RhcnQoKTsKKwkJCQltdXRleF91bmxvY2soJnZhdnNfbXV0ZXgpOworCQkJfSBlbHNlIHsKKwkJCQl2YXZzX2xvY2FsX3Jlc2V0KCk7CisJCQl9CisjZWxzZQorCQkJaWYgKCFhdG9taWNfcmVhZCgmZXJyb3JfaGFuZGxlcl9ydW4pKSB7CisJCQkJYXRvbWljX3NldCgmZXJyb3JfaGFuZGxlcl9ydW4sIDEpOworCQkJCXByX2luZm8oIkFWU19TT1NfQ09VTlQgPSAlZFxuIiwKKwkJCQkJUkVBRF9WUkVHKEFWU19TT1NfQ09VTlQpKTsKKwkJCQlwcl9pbmZvKCJXUCA9IDB4JXgsIFJQID0gMHgleCwgTEVWRUwgPSAweCV4LCBBVkFJTCA9IDB4JXgsIENVUl9QVFIgPSAweCV4XG4iLAorCQkJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApLAorCQkJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApLAorCQkJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpLAorCQkJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fQllURVNfQVZBSUwpLAorCQkJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fQ1VSUl9QVFIpKTsKKwkJCQlzY2hlZHVsZV93b3JrKCZmYXRhbF9lcnJvcl93ZF93b3JrKTsKKwkJCX0KKyNlbmRpZgorCQl9CisJfQorI2lmIDAKKwlpZiAobG9uZ19jYWJhY19idXN5ID09IDAgJiYKKwkJZXJyb3Jfd2F0Y2hkb2dfdGhyZXNob2xkID4gMCAmJgorCQlrZmlmb19sZW4oJmRpc3BsYXlfcSkgPT0gMCAmJgorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpID4KKwkJZXJyb3Jfd2F0Y2hkb2dfYnVmX3RocmVzaG9sZCkgeworCQlwcl9pbmZvKCJuZXdxICVkIGRpc3BxICVkIHJlY3lxICVkXHJcbiIsCisJCQlrZmlmb19sZW4oJm5ld2ZyYW1lX3EpLAorCQkJa2ZpZm9fbGVuKCZkaXNwbGF5X3EpLAorCQkJa2ZpZm9fbGVuKCZyZWN5Y2xlX3EpKTsKKwkJcHJfaW5mbygicGMgJXggc3RyZWFtIGJ1ZiB3cCAleCBycCAleCBsZXZlbCAleFxuIiwKKwkJCVJFQURfVlJFRyhNUENfRSksCisJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSwKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCkpOworCQllcnJvcl93YXRjaGRvZ19jb3VudCsrOworCQlpZiAoZXJyb3Jfd2F0Y2hkb2dfY291bnQgPj0gZXJyb3Jfd2F0Y2hkb2dfdGhyZXNob2xkKQorCQkJdmF2c19sb2NhbF9yZXNldCgpOworCX0gZWxzZQorCQllcnJvcl93YXRjaGRvZ19jb3VudCA9IDA7CisjZW5kaWYKKwlpZiAocmFkciAhPSAwKSB7CisJCWlmIChydmFsICE9IDApIHsKKwkJCVdSSVRFX1ZSRUcocmFkciwgcnZhbCk7CisJCQlwcl9pbmZvKCJXUklURV9WUkVHKCV4LCV4KVxuIiwgcmFkciwgcnZhbCk7CisJCX0gZWxzZQorCQkJcHJfaW5mbygiUkVBRF9WUkVHKCV4KT0leFxuIiwgcmFkciwgUkVBRF9WUkVHKHJhZHIpKTsKKwkJcnZhbCA9IDA7CisJCXJhZHIgPSAwOworCX0KKworCWlmICgha2ZpZm9faXNfZW1wdHkoJnJlY3ljbGVfcSkgJiYgKFJFQURfVlJFRyhBVlNfQlVGRkVSSU4pID09IDApKSB7CisJCXN0cnVjdCB2ZnJhbWVfcyAqdmY7CisKKwkJaWYgKGtmaWZvX2dldCgmcmVjeWNsZV9xLCAmdmYpKSB7CisJCQlpZiAoKHZmLT5pbmRleCA8IHZmX2J1Zl9udW0pICYmCisJCQkgKC0tdmZidWZfdXNlW3ZmLT5pbmRleF0gPT0gMCkpIHsKKwkJCQlXUklURV9WUkVHKEFWU19CVUZGRVJJTiwgfigxIDw8IHZmLT5pbmRleCkpOworCQkJCXZmLT5pbmRleCA9IHZmX2J1Zl9udW07CisJCQl9CisJCQkJa2ZpZm9fcHV0KCZuZXdmcmFtZV9xLAorCQkJCQkJICAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQl9CisJfQorCisJaWYgKGZyYW1lX2R1ciA+IDAgJiYgc2F2ZWRfcmVzb2x1dGlvbiAhPQorCQlmcmFtZV93aWR0aCAqIGZyYW1lX2hlaWdodCAqICg5NjAwMCAvIGZyYW1lX2R1cikpCisJCXNjaGVkdWxlX3dvcmsoJnNldF9jbGtfd29yayk7CisKKwl0aW1lci0+ZXhwaXJlcyA9IGppZmZpZXMgKyBQVVRfSU5URVJWQUw7CisKKwlhZGRfdGltZXIodGltZXIpOworfQorCisjaWZkZWYgQVZTUF9MT05HX0NBQkFDCisKK3N0YXRpYyB2b2lkIGxvbmdfY2FiYWNfZG9fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJaW50IHN0YXR1cyA9IDA7CisjaWZkZWYgUEVSRk9STUFOQ0VfREVCVUcKKwlwcl9pbmZvKCJlbnRlciAlcyBidWYgbGV2ZWwgKG5ldyAlZCwgZGlzcGxheSAlZCwgcmVjeWNsZSAlZClcclxuIiwKKwkJX19mdW5jX18sCisJCWtmaWZvX2xlbigmbmV3ZnJhbWVfcSksCisJCWtmaWZvX2xlbigmZGlzcGxheV9xKSwKKwkJa2ZpZm9fbGVuKCZyZWN5Y2xlX3EpCisJCSk7CisjZW5kaWYKKwltdXRleF9sb2NrKCZ2YXZzX211dGV4KTsKKwlsb25nX2NhYmFjX2J1c3kgPSAxOworCXdoaWxlIChSRUFEX1ZSRUcoTE9OR19DQUJBQ19SRVEpKSB7CisJCWlmIChwcm9jZXNzX2xvbmdfY2FiYWMoKSA8IDApIHsKKwkJCXN0YXR1cyA9IC0xOworCQkJYnJlYWs7CisJCX0KKwl9CisJbG9uZ19jYWJhY19idXN5ID0gMDsKKwltdXRleF91bmxvY2soJnZhdnNfbXV0ZXgpOworI2lmZGVmIFBFUkZPUk1BTkNFX0RFQlVHCisJcHJfaW5mbygiZXhpdCAlcyBidWYgbGV2ZWwgKG5ldyAlZCwgZGlzcGxheSAlZCwgcmVjeWNsZSAlZClcclxuIiwKKwkJX19mdW5jX18sCisJCWtmaWZvX2xlbigmbmV3ZnJhbWVfcSksCisJCWtmaWZvX2xlbigmZGlzcGxheV9xKSwKKwkJa2ZpZm9fbGVuKCZyZWN5Y2xlX3EpCisJCSk7CisjZW5kaWYKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlwcl9pbmZvKCJ0cmFuc2NvZGluZyBlcnJvciwgbG9jYWwgcmVzZXRcclxuIik7CisJCXZhdnNfbG9jYWxfcmVzZXQoKTsKKwl9CisKK30KKyNlbmRpZgorCisjaWZkZWYgQVZTUF9MT05HX0NBQkFDCitzdGF0aWMgdm9pZCBpbml0X2F2c3BfbG9uZ19jYWJhY19idWYodm9pZCkKK3sKKyNpZiAwCisJZXNfd3JpdGVfYWRkcl9waHkgPSAodW5zaWduZWQgbG9uZyljb2RlY19tbV9hbGxvY19mb3JfZG1hKAorCQkidmF2cyIsCisJCVBBR0VfQUxJR04oTUFYX0NPREVEX0ZSQU1FX1NJWkUpL1BBR0VfU0laRSwKKwkJMCwgQ09ERUNfTU1fRkxBR1NfRE1BX0NQVSk7CisJZXNfd3JpdGVfYWRkcl92aXJ0ID0gY29kZWNfbW1fcGh5c190b192aXJ0KGVzX3dyaXRlX2FkZHJfcGh5KTsKKworI2VsaWYgMAorCWVzX3dyaXRlX2FkZHJfdmlydCA9CisJCSh2b2lkICopZG1hX2FsbG9jX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJIE1BWF9DT0RFRF9GUkFNRV9TSVpFLCAmZXNfd3JpdGVfYWRkcl9waHksCisJCUdGUF9LRVJORUwpOworI2Vsc2UKKwkvKmVzX3dyaXRlX2FkZHJfdmlydCA9IGttYWxsb2MoTUFYX0NPREVEX0ZSQU1FX1NJWkUsIEdGUF9LRVJORUwpOworCSAqCWVzX3dyaXRlX2FkZHJfdmlydCA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLAorCSAqCWdldF9vcmRlcihNQVhfQ09ERURfRlJBTUVfU0laRSkpOworCSAqLworCWVzX3dyaXRlX2FkZHJfdmlydCA9ICZlc193cml0ZV9hZGRyWzBdOworCWlmIChlc193cml0ZV9hZGRyX3ZpcnQgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgZXNfd3JpdGVfYWRkcl92aXJ0IGJ1ZmZlclxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWVzX3dyaXRlX2FkZHJfcGh5ID0gZG1hX21hcF9zaW5nbGUoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJZXNfd3JpdGVfYWRkcl92aXJ0LAorCQkJTUFYX0NPREVEX0ZSQU1FX1NJWkUsIERNQV9CSURJUkVDVElPTkFMKTsKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJZXNfd3JpdGVfYWRkcl9waHkpKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBtYXAgZXNfd3JpdGVfYWRkcl92aXJ0IGJ1ZmZlclxuIiwKKwkJCV9fZnVuY19fKTsKKwkJLyprZnJlZShlc193cml0ZV9hZGRyX3ZpcnQpOyovCisJCWVzX3dyaXRlX2FkZHJfdmlydCA9IE5VTEw7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKworCisjaWZkZWYgQklUU1RSRUFNX1JFQURfVE1QX05PX0NBQ0hFCisJYml0c3RyZWFtX3JlYWRfdG1wID0KKwkJKHZvaWQgKilkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJU1ZBX1NUUkVBTV9CVUZfU0laRSwgJmJpdHN0cmVhbV9yZWFkX3RtcF9waHksCisJCQkgR0ZQX0tFUk5FTCk7CisKKyNlbHNlCisKKwliaXRzdHJlYW1fcmVhZF90bXAgPSBrbWFsbG9jKFNWQV9TVFJFQU1fQlVGX1NJWkUsIEdGUF9LRVJORUwpOworCQkvKmJpdHN0cmVhbV9yZWFkX3RtcCA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLAorCQkgKmdldF9vcmRlcihNQVhfQ09ERURfRlJBTUVfU0laRSkpOworCQkgKi8KKwlpZiAoYml0c3RyZWFtX3JlYWRfdG1wID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFsbG9jIGJpdHN0cmVhbV9yZWFkX3RtcCBidWZmZXJcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwliaXRzdHJlYW1fcmVhZF90bXBfcGh5ID0gZG1hX21hcF9zaW5nbGUoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJYml0c3RyZWFtX3JlYWRfdG1wLAorCQkJU1ZBX1NUUkVBTV9CVUZfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJYml0c3RyZWFtX3JlYWRfdG1wX3BoeSkpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIG1hcCBycG0gYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJCWtmcmVlKGJpdHN0cmVhbV9yZWFkX3RtcCk7CisJCWJpdHN0cmVhbV9yZWFkX3RtcCA9IE5VTEw7CisJCXJldHVybjsKKwl9CisjZW5kaWYKK30KKyNlbmRpZgorCisKK3N0YXRpYyBzMzIgdmF2c19pbml0KHZvaWQpCit7CisJaW50IHJldCwgc2l6ZSA9IC0xOworCWNoYXIgKmJ1ZiA9IHZtYWxsb2MoMHgxMDAwICogMTYpOworCisJaWYgKElTX0VSUl9PUl9OVUxMKGJ1ZikpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJfaW5mbygidmF2c19pbml0XG4iKTsKKworCXN0YXQgfD0gU1RBVF9USU1FUl9JTklUOworCisJYW12ZGVjX2VuYWJsZSgpOworCXZhdnNfbG9jYWxfaW5pdChmYWxzZSk7CisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWE0pCisJCXNpemUgPSBnZXRfZmlybXdhcmVfZGF0YShWSURFT19ERUNfQVZTLCBidWYpOworCWVsc2UgeworCQlpZiAoZmlybXdhcmVfc2VsID09IDEpCisJCQlzaXplID0gZ2V0X2Zpcm13YXJlX2RhdGEoVklERU9fREVDX0FWU19OT0NBQkFDLCBidWYpOworI2lmZGVmIEFWU1BfTE9OR19DQUJBQworCQllbHNlIHsKKwkJCWluaXRfYXZzcF9sb25nX2NhYmFjX2J1ZigpOworCQkJc2l6ZSA9IGdldF9maXJtd2FyZV9kYXRhKFZJREVPX0RFQ19BVlMsIGJ1Zik7CisJCX0KKyNlbmRpZgorCX0KKworCWlmIChzaXplIDwgMCkgeworCQlhbXZkZWNfZGlzYWJsZSgpOworCQlwcl9lcnIoImdldCBmaXJtd2FyZSBmYWlsLiIpOworCQl2ZnJlZShidWYpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hNKQorCQlyZXQgPSBhbXZkZWNfbG9hZG1jX2V4KFZGT1JNQVRfQVZTLCBOVUxMLCBidWYpOworCWVsc2UgaWYgKGZpcm13YXJlX3NlbCA9PSAxKQorCQlyZXQgPSBhbXZkZWNfbG9hZG1jX2V4KFZGT1JNQVRfQVZTLCAiYXZzX25vX2NhYmFjIiwgYnVmKTsKKwllbHNlCisJCXJldCA9IGFtdmRlY19sb2FkbWNfZXgoVkZPUk1BVF9BVlMsIE5VTEwsIGJ1Zik7CisKKwlpZiAocmV0IDwgMCkgeworCQlhbXZkZWNfZGlzYWJsZSgpOworCQl2ZnJlZShidWYpOworCQlwcl9lcnIoIkFWUzogdGhlICVzIGZ3IGxvYWRpbmcgZmFpbGVkLCBlcnI6ICV4XG4iLAorCQkJdGVlX2VuYWJsZWQoKSA/ICJURUUiIDogImxvY2FsIiwgcmV0KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwl2ZnJlZShidWYpOworCisJc3RhdCB8PSBTVEFUX01DX0xPQUQ7CisKKwkvKiBlbmFibGUgQU1SSVNDIHNpZGUgcHJvdG9jb2wgKi8KKwlyZXQgPSB2YXZzX3Byb3RfaW5pdCgpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisjaWZkZWYgSEFORExFX0FWU19JUlEKKwlpZiAodmRlY19yZXF1ZXN0X2lycShWREVDX0lSUV8xLCB2YXZzX2lzciwKKwkJCSJ2YXZzLWlycSIsICh2b2lkICopdmF2c19kZWNfaWQpKSB7CisJCWFtdmRlY19kaXNhYmxlKCk7CisJCXByX2luZm8oInZhdnMgaXJxIHJlZ2lzdGVyIGVycm9yLlxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKyNlbmRpZgorCisJc3RhdCB8PSBTVEFUX0lTUl9SRUc7CisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19QT1NUX1BST0NFU1NfTUFOQUdFUgorCXZmX3Byb3ZpZGVyX2luaXQoJnZhdnNfdmZfcHJvdiwgUFJPVklERVJfTkFNRSwgJnZhdnNfdmZfcHJvdmlkZXIsIE5VTEwpOworCXZmX3JlZ19wcm92aWRlcigmdmF2c192Zl9wcm92KTsKKwl2Zl9ub3RpZnlfcmVjZWl2ZXIoUFJPVklERVJfTkFNRSwgVkZSQU1FX0VWRU5UX1BST1ZJREVSX1NUQVJULCBOVUxMKTsKKyNlbHNlCisJdmZfcHJvdmlkZXJfaW5pdCgmdmF2c192Zl9wcm92LCBQUk9WSURFUl9OQU1FLCAmdmF2c192Zl9wcm92aWRlciwgTlVMTCk7CisJdmZfcmVnX3Byb3ZpZGVyKCZ2YXZzX3ZmX3Byb3YpOworI2VuZGlmCisKKwlpZiAodmF2c19hbXN0cmVhbV9kZWNfaW5mby5yYXRlICE9IDApIHsKKwkJaWYgKCFpc19yZXNldCkgeworCQkJdmZfbm90aWZ5X3JlY2VpdmVyKFBST1ZJREVSX05BTUUsCisJCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9GUl9ISU5ULAorCQkJCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykKKwkJCQkJdmF2c19hbXN0cmVhbV9kZWNfaW5mby5yYXRlKSk7CisJCQlmcl9oaW50X3N0YXR1cyA9IFZERUNfSElOVEVEOworCQl9CisJfSBlbHNlCisJCWZyX2hpbnRfc3RhdHVzID0gVkRFQ19ORUVEX0hJTlQ7CisKKwlzdGF0IHw9IFNUQVRfVkZfSE9PSzsKKworCXRpbWVyX3NldHVwKCZyZWN5Y2xlX3RpbWVyLCB2YXZzX3B1dF90aW1lcl9mdW5jLCAwKTsKKwlyZWN5Y2xlX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgUFVUX0lOVEVSVkFMOworCWFkZF90aW1lcigmcmVjeWNsZV90aW1lcik7CisKKwlzdGF0IHw9IFNUQVRfVElNRVJfQVJNOworCisjaWZkZWYgQVZTUF9MT05HX0NBQkFDCisJaWYgKGZpcm13YXJlX3NlbCA9PSAwKQorCQlJTklUX1dPUksoJmxvbmdfY2FiYWNfd2Rfd29yaywgbG9uZ19jYWJhY19kb193b3JrKTsKKyNlbmRpZgorCXZkZWNfc291cmNlX2NoYW5nZWQoVkZPUk1BVF9BVlMsCisJCQkJCTE5MjAsIDEwODAsIDMwKTsKKwlhbXZkZWNfc3RhcnQoKTsKKworCXN0YXQgfD0gU1RBVF9WREVDX1JVTjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtdmRlY19hdnNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdmRlY19zICpwZGF0YSA9ICooc3RydWN0IHZkZWNfcyAqKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWlmIChwZGF0YSA9PSBOVUxMKSB7CisJCXByX2luZm8oImFtdmRlY19hdnMgbWVtb3J5IHJlc291cmNlIHVuZGVmaW5lZC5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hNIHx8IGRpc2FibGVfbG9uZ2NhYmFjX3RyYW5zKQorCQlmaXJtd2FyZV9zZWwgPSAxOworCisJaWYgKGZpcm13YXJlX3NlbCA9PSAxKSB7CisJCXZmX2J1Zl9udW0gPSA4OworCQljYW52YXNfYmFzZSA9IDA7CisJCWNhbnZhc19udW0gPSAyOworCX0gZWxzZSB7CisKKwkJY2FudmFzX2Jhc2UgPSAxMjg7CisJCWNhbnZhc19udW0gPSAyOyAvKk5WMjEqLworCX0KKworCisJaWYgKHBkYXRhLT5zeXNfaW5mbykKKwkJdmF2c19hbXN0cmVhbV9kZWNfaW5mbyA9ICpwZGF0YS0+c3lzX2luZm87CisKKwlwcl9pbmZvKCIlcyAoJWQsJWQpICVkXG4iLCBfX2Z1bmNfXywgdmF2c19hbXN0cmVhbV9kZWNfaW5mby53aWR0aCwKKwkJICAgdmF2c19hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQsIHZhdnNfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSk7CisKKwlwZGF0YS0+ZGVjX3N0YXR1cyA9IHZhdnNfZGVjX3N0YXR1czsKKwlwZGF0YS0+c2V0X2lzcmVzZXQgPSB2YXZzX3NldF9pc3Jlc2V0OworCWlzX3Jlc2V0ID0gMDsKKworCXBkYXRhLT51c2VyX2RhdGFfcmVhZCA9IE5VTEw7CisJcGRhdGEtPnJlc2V0X3VzZXJkYXRhX2ZpZm8gPSBOVUxMOworCisJdmF2c192ZGVjX2luZm9faW5pdCgpOworCisKKwlpZiAoTlVMTCA9PSB1c2VyX2RhdGFfYnVmZmVyKSB7CisJCXVzZXJfZGF0YV9idWZmZXIgPQorCQkJZG1hX2FsbG9jX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlVU0VSX0RBVEFfU0laRSwKKwkJCQkmdXNlcl9kYXRhX2J1ZmZlcl9waHlzLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF1c2VyX2RhdGFfYnVmZmVyKSB7CisJCQlwcl9pbmZvKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSB1c2VyX2RhdGFfYnVmZmVyXG4iLAorCQkJCSAgIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXByX2RlYnVnKCJ1c2VyX2RhdGFfYnVmZmVyID0gMHglcCwgdXNlcl9kYXRhX2J1ZmZlcl9waHlzID0gMHgleFxuIiwKKwkJCXVzZXJfZGF0YV9idWZmZXIsICh1MzIpdXNlcl9kYXRhX2J1ZmZlcl9waHlzKTsKKwl9CisKKwlJTklUX1dPUksoJnNldF9jbGtfd29yaywgYXZzX3NldF9jbGspOworCXZkZWMgPSBwZGF0YTsKKworCUlOSVRfV09SSygmZmF0YWxfZXJyb3Jfd2Rfd29yaywgdmF2c19mYXRhbF9lcnJvcl9oYW5kbGVyKTsKKwlhdG9taWNfc2V0KCZlcnJvcl9oYW5kbGVyX3J1biwgMCk7CisKKwlJTklUX1dPUksoJnVzZXJkYXRhX3B1c2hfd29yaywgdXNlcmRhdGFfcHVzaF9kb193b3JrKTsKKwlJTklUX1dPUksoJm5vdGlmeV93b3JrLCB2YXZzX25vdGlmeV93b3JrKTsKKworCWlmICh2YXZzX2luaXQoKSA8IDApIHsKKwkJcHJfaW5mbygiYW12ZGVjX2F2cyBpbml0IGZhaWxlZC5cbiIpOworCQlrZnJlZShndnMpOworCQlndnMgPSBOVUxMOworCQlwZGF0YS0+ZGVjX3N0YXR1cyA9IE5VTEw7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbXZkZWNfYXZzX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWlmIChzdGF0ICYgU1RBVF9USU1FUl9BUk0pIHsKKwkJZGVsX3RpbWVyX3N5bmMoJnJlY3ljbGVfdGltZXIpOworCQlzdGF0ICY9IH5TVEFUX1RJTUVSX0FSTTsKKwl9CisJY2FuY2VsX3dvcmtfc3luYygmZmF0YWxfZXJyb3Jfd2Rfd29yayk7CisJYXRvbWljX3NldCgmZXJyb3JfaGFuZGxlcl9ydW4sIDApOworCisJY2FuY2VsX3dvcmtfc3luYygmdXNlcmRhdGFfcHVzaF93b3JrKTsKKworCWNhbmNlbF93b3JrX3N5bmMoJm5vdGlmeV93b3JrKTsKKwlpZiAoc3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJYW12ZGVjX3N0b3AoKTsKKwkJc3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwl9CisKKwlpZiAoc3RhdCAmIFNUQVRfSVNSX1JFRykgeworCQl2ZGVjX2ZyZWVfaXJxKFZERUNfSVJRXzEsICh2b2lkICopdmF2c19kZWNfaWQpOworCQlzdGF0ICY9IH5TVEFUX0lTUl9SRUc7CisJfQorCisjaWZkZWYgQVZTUF9MT05HX0NBQkFDCisJaWYgKGZpcm13YXJlX3NlbCA9PSAwKSB7CisJCW11dGV4X2xvY2soJnZhdnNfbXV0ZXgpOworCQljYW5jZWxfd29ya19zeW5jKCZsb25nX2NhYmFjX3dkX3dvcmspOworCQltdXRleF91bmxvY2soJnZhdnNfbXV0ZXgpOworCisJCWlmIChlc193cml0ZV9hZGRyX3ZpcnQpIHsKKyNpZiAwCisJCQljb2RlY19tbV9mcmVlX2Zvcl9kbWEoInZhdnMiLCBlc193cml0ZV9hZGRyX3BoeSk7CisjZWxzZQorCQkJZG1hX3VubWFwX3NpbmdsZShhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJZXNfd3JpdGVfYWRkcl9waHksCisJCQkJTUFYX0NPREVEX0ZSQU1FX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJCQkvKmtmcmVlKGVzX3dyaXRlX2FkZHJfdmlydCk7Ki8KKwkJCWVzX3dyaXRlX2FkZHJfdmlydCA9IE5VTEw7CisjZW5kaWYKKwkJfQorCisjaWZkZWYgQklUU1RSRUFNX1JFQURfVE1QX05PX0NBQ0hFCisJCWlmIChiaXRzdHJlYW1fcmVhZF90bXApIHsKKwkJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlTVkFfU1RSRUFNX0JVRl9TSVpFLCBiaXRzdHJlYW1fcmVhZF90bXAsCisJCQkJYml0c3RyZWFtX3JlYWRfdG1wX3BoeSk7CisJCQliaXRzdHJlYW1fcmVhZF90bXAgPSBOVUxMOworCQl9CisjZWxzZQorCQlpZiAoYml0c3RyZWFtX3JlYWRfdG1wKSB7CisJCQlkbWFfdW5tYXBfc2luZ2xlKGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQliaXRzdHJlYW1fcmVhZF90bXBfcGh5LAorCQkJCVNWQV9TVFJFQU1fQlVGX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJCQlrZnJlZShiaXRzdHJlYW1fcmVhZF90bXApOworCQkJYml0c3RyZWFtX3JlYWRfdG1wID0gTlVMTDsKKwkJfQorI2VuZGlmCisJfQorI2VuZGlmCisJaWYgKHN0YXQgJiBTVEFUX1ZGX0hPT0spIHsKKwkJaWYgKGZyX2hpbnRfc3RhdHVzID09IFZERUNfSElOVEVEKQorCQkJdmZfbm90aWZ5X3JlY2VpdmVyKFBST1ZJREVSX05BTUUsCisJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX0ZSX0VORF9ISU5ULCBOVUxMKTsKKwkJZnJfaGludF9zdGF0dXMgPSBWREVDX05PX05FRURfSElOVDsKKwkJdmZfdW5yZWdfcHJvdmlkZXIoJnZhdnNfdmZfcHJvdik7CisJCXN0YXQgJj0gflNUQVRfVkZfSE9PSzsKKwl9CisKKworCWlmICh1c2VyX2RhdGFfYnVmZmVyICE9IE5VTEwpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoCisJCQlhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQlVU0VSX0RBVEFfU0laRSwKKwkJCXVzZXJfZGF0YV9idWZmZXIsCisJCQl1c2VyX2RhdGFfYnVmZmVyX3BoeXMpOworCQl1c2VyX2RhdGFfYnVmZmVyID0gTlVMTDsKKwkJdXNlcl9kYXRhX2J1ZmZlcl9waHlzID0gMDsKKwl9CisKKworCWFtdmRlY19kaXNhYmxlKCk7CisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVE0yKQorCQl2ZGVjX3Jlc2V0X2NvcmUoTlVMTCk7CisJcGljX3R5cGUgPSAwOworCWlmIChtbV9ibGtfaGFuZGxlKSB7CisJCWRlY29kZXJfYm1tdV9ib3hfZnJlZShtbV9ibGtfaGFuZGxlKTsKKwkJbW1fYmxrX2hhbmRsZSA9IE5VTEw7CisJfQorI2lmZGVmIERFQlVHX1BUUworCXByX2RlYnVnKCJwdHMgaGl0ICVkLCBwdHMgbWlzc2VkICVkLCBpIGhpdCAlZCwgbWlzc2VkICVkXG4iLCBwdHNfaGl0LAorCQkgICBwdHNfbWlzc2VkLCBwdHNfaV9oaXQsIHB0c19pX21pc3NlZCk7CisJcHJfZGVidWcoInRvdGFsIGZyYW1lICVkLCBhdmlfZmxhZyAlZCwgcmF0ZSAlZFxuIiwgdG90YWxfZnJhbWUsIGF2aV9mbGFnLAorCQkgICB2YXZzX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUpOworI2VuZGlmCisJa2ZyZWUoZ3ZzKTsKKwlndnMgPSBOVUxMOworCXZkZWMgPSBOVUxMOworCisJY2FuY2VsX3dvcmtfc3luYygmc2V0X2Nsa193b3JrKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGF2c19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlhbXZkZWNfc3VzcGVuZCh0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSwgZGV2LT5wb3dlci5wb3dlcl9zdGF0ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXZzX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJYW12ZGVjX3Jlc3VtZSh0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBhdnNfcG1fb3BzID0geworCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKGF2c19zdXNwZW5kLCBhdnNfcmVzdW1lKQorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhbXZkZWNfYXZzX2RyaXZlciA9IHsKKwkucHJvYmUgPSBhbXZkZWNfYXZzX3Byb2JlLAorCS5yZW1vdmUgPSBhbXZkZWNfYXZzX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9IERSSVZFUl9OQU1FLAorI2lmZGVmIENPTkZJR19QTQorCQkucG0gPSAmYXZzX3BtX29wcywKKyNlbmRpZgorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY29kZWNfcHJvZmlsZV90IGFtdmRlY19hdnNfcHJvZmlsZSA9IHsKKwkubmFtZSA9ICJhdnMiLAorCS5wcm9maWxlID0gIiIKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWNvbmZpZyBhdnNfY29uZmlnc1tdID0geworCU1DX1BVMzIoInN0YXQiLCAmc3RhdCksCisJTUNfUFUzMigiZGVidWdfZmxhZyIsICZkZWJ1Z19mbGFnKSwKKwlNQ19QVTMyKCJlcnJvcl9yZWNvdmVyeV9tb2RlIiwgJmVycm9yX3JlY292ZXJ5X21vZGUpLAorCU1DX1BVMzIoInBpY190eXBlIiwgJnBpY190eXBlKSwKKwlNQ19QVTMyKCJyYWRyIiwgJnJhZHIpLAorCU1DX1BVMzIoInZmX2J1Zl9udW0iLCAmdmZfYnVmX251bSksCisJTUNfUFUzMigidmZfYnVmX251bV91c2VkIiwgJnZmX2J1Zl9udW1fdXNlZCksCisJTUNfUFUzMigiY2FudmFzX2Jhc2UiLCAmY2FudmFzX2Jhc2UpLAorCU1DX1BVMzIoImZpcm13YXJlX3NlbCIsICZmaXJtd2FyZV9zZWwpLAorfTsKK3N0YXRpYyBzdHJ1Y3QgbWNvbmZpZ19ub2RlIGF2c19ub2RlOworCisKK3N0YXRpYyBpbnQgX19pbml0IGFtdmRlY19hdnNfZHJpdmVyX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcHJfZGVidWcoImFtdmRlY19hdnMgbW9kdWxlIGluaXRcbiIpOworCisJaWYgKHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYW12ZGVjX2F2c19kcml2ZXIpKSB7CisJCXByX2luZm8oImZhaWxlZCB0byByZWdpc3RlciBhbXZkZWNfYXZzIGRyaXZlclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYQkIpCisJCWFtdmRlY19hdnNfcHJvZmlsZS5wcm9maWxlID0gImF2cysiOworCisJdmNvZGVjX3Byb2ZpbGVfcmVnaXN0ZXIoJmFtdmRlY19hdnNfcHJvZmlsZSk7CisJSU5JVF9SRUdfTk9ERV9DT05GSUdTKCJtZWRpYS5kZWNvZGVyIiwgJmF2c19ub2RlLAorCQkiYXZzIiwgYXZzX2NvbmZpZ3MsIENPTkZJR19GT1JfUlcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYW12ZGVjX2F2c19kcml2ZXJfcmVtb3ZlX21vZHVsZSh2b2lkKQoreworCXByX2RlYnVnKCJhbXZkZWNfYXZzIG1vZHVsZSByZW1vdmUuXG4iKTsKKworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhbXZkZWNfYXZzX2RyaXZlcik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCittb2R1bGVfcGFyYW0oc3RhdCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHN0YXQsICJcbiBhbXZkZWNfYXZzIHN0YXRcbiIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKm1vZHVsZV9wYXJhbShydW5fZmxhZywgdWludCwgMDY2NCk7CisgKk1PRFVMRV9QQVJNX0RFU0MocnVuX2ZsYWcsICJcbiBydW5fZmxhZ1xuIik7CisgKgorICptb2R1bGVfcGFyYW0oc3RlcF9mbGFnLCB1aW50LCAwNjY0KTsKKyAqTU9EVUxFX1BBUk1fREVTQyhzdGVwX2ZsYWcsICJcbiBzdGVwX2ZsYWdcbiIpOworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCittb2R1bGVfcGFyYW0oZGVidWdfZmxhZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnX2ZsYWcsICJcbiBkZWJ1Z19mbGFnXG4iKTsKKworbW9kdWxlX3BhcmFtKGVycm9yX3JlY292ZXJ5X21vZGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhlcnJvcl9yZWNvdmVyeV9tb2RlLCAiXG4gZXJyb3JfcmVjb3ZlcnlfbW9kZVxuIik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqbW9kdWxlX3BhcmFtKGVycm9yX3dhdGNoZG9nX3RocmVzaG9sZCwgdWludCwgMDY2NCk7CisgKk1PRFVMRV9QQVJNX0RFU0MoZXJyb3Jfd2F0Y2hkb2dfdGhyZXNob2xkLCAiXG4gZXJyb3Jfd2F0Y2hkb2dfdGhyZXNob2xkXG4iKTsKKyAqCisgKm1vZHVsZV9wYXJhbShlcnJvcl93YXRjaGRvZ19idWZfdGhyZXNob2xkLCB1aW50LCAwNjY0KTsKKyAqTU9EVUxFX1BBUk1fREVTQyhlcnJvcl93YXRjaGRvZ19idWZfdGhyZXNob2xkLAorICoJCQkiXG4gZXJyb3Jfd2F0Y2hkb2dfYnVmX3RocmVzaG9sZFxuIik7CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK21vZHVsZV9wYXJhbShwaWNfdHlwZSwgdWludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBpY190eXBlLCAiXG4gYW1kZWNfdmFzIHBpY3R1cmUgdHlwZVxuIik7CisKK21vZHVsZV9wYXJhbShyYWRyLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocmFkciwgIlxucmFkclxuIik7CisKK21vZHVsZV9wYXJhbShydmFsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocnZhbCwgIlxucnZhbFxuIik7CisKK21vZHVsZV9wYXJhbSh2Zl9idWZfbnVtLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModmZfYnVmX251bSwgIlxudmZfYnVmX251bVxuIik7CisKK21vZHVsZV9wYXJhbSh2Zl9idWZfbnVtX3VzZWQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh2Zl9idWZfbnVtX3VzZWQsICJcbnZmX2J1Zl9udW1fdXNlZFxuIik7CisKK21vZHVsZV9wYXJhbShjYW52YXNfYmFzZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNhbnZhc19iYXNlLCAiXG5jYW52YXNfYmFzZVxuIik7CisKKworbW9kdWxlX3BhcmFtKGZpcm13YXJlX3NlbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZpcm13YXJlX3NlbCwgIlxuIGZpcm13YXJlX3NlbFxuIik7CisKK21vZHVsZV9wYXJhbShkaXNhYmxlX2xvbmdjYWJhY190cmFucywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVfbG9uZ2NhYmFjX3RyYW5zLCAiXG4gZGlzYWJsZV9sb25nY2FiYWNfdHJhbnNcbiIpOworCittb2R1bGVfcGFyYW0oZGVjX2NvbnRyb2wsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkZWNfY29udHJvbCwgIlxuIGFtdmRlY192YXZzIGRlY29kZXIgY29udHJvbFxuIik7CisKK21vZHVsZV9wYXJhbShzdXBwb3J0X3VzZXJfZGF0YSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHN1cHBvcnRfdXNlcl9kYXRhLCAiXG4gc3VwcG9ydF91c2VyX2RhdGFcbiIpOworCittb2R1bGVfaW5pdChhbXZkZWNfYXZzX2RyaXZlcl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChhbXZkZWNfYXZzX2RyaXZlcl9yZW1vdmVfbW9kdWxlKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTUxPR0lDIEFWUyBWaWRlbyBEZWNvZGVyIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiUWkgV2FuZyA8cWkud2FuZ0BhbWxvZ2ljLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9hdnMvYXZzLmggYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvYXZzL2F2cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNzdkMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvYXZzL2F2cy5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNyBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisqIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyoKKyogRGVzY3JpcHRpb246CisqLworI2lmbmRlZiBBVlNfSF8KKyNkZWZpbmUgQVZTX0hfCisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19BVlNQX0xPTkdfQ0FCQUMKKyNkZWZpbmUgQVZTUF9MT05HX0NBQkFDCisjZW5kaWYKKy8qI2RlZmluZSBCSVRTVFJFQU1fUkVBRF9UTVBfTk9fQ0FDSEUqLworCisjaWZkZWYgQVZTUF9MT05HX0NBQkFDCisjZGVmaW5lIE1BWF9DT0RFRF9GUkFNRV9TSVpFIDE1MDAwMDAgICAgICAgICAvKiE8IGJ5dGVzIGZvciBvbmUgZnJhbWUqLworI2RlZmluZSBMT0NBTF9IRUFQX1NJWkUgICAgKDEwMjQqMTAyNCoxMCkKKy8qCisgKiNkZWZpbmUgTUFYX0NPREVEX0ZSQU1FX1NJWkUgIDI0MDAwMAorICojZGVmaW5lIE1BWF9DT0RFRF9GUkFNRV9TSVpFICA3MDAwMDAKKyAqLworI2RlZmluZSBTVkFfU1RSRUFNX0JVRl9TSVpFIDEwMjQKKworZXh0ZXJuIHZvaWQgKmVzX3dyaXRlX2FkZHJfdmlydDsKK2V4dGVybiBkbWFfYWRkcl90IGVzX3dyaXRlX2FkZHJfcGh5OworCitleHRlcm4gdm9pZCAqYml0c3RyZWFtX3JlYWRfdG1wOworZXh0ZXJuIGRtYV9hZGRyX3QgYml0c3RyZWFtX3JlYWRfdG1wX3BoeTsKK2V4dGVybiB2b2lkICphdnNwX2hlYXBfYWRyOworCitpbnQgYXZzX2dldF9kZWJ1Z19mbGFnKHZvaWQpOworCitpbnQgcHJvY2Vzc19sb25nX2NhYmFjKHZvaWQpOworCisvKiBiaXQgWzZdIC0gc2tpcF9tb2RlX2ZsYWcKKyAqIGJpdCBbNTo0XSAtIHBpY3R1cmVfdHlwZQorICogYml0IFszXSAtIHBpY3R1cmVfc3RydWN0dXJlICgwLUZpZWxkLCAxLUZyYW1lKQorICogYml0IFsyXSAtIGZpeGVkX3BpY3R1cmVfcXAKKyAqIGJpdCBbMV0gLSBwcm9ncmVzc2l2ZV9zZXF1ZW5jZQorICogYml0IFswXSAtIGFjdGl2ZQorICovCisjZGVmaW5lIExPTkdfQ0FCQUNfUkVRICAgICAgICBBVl9TQ1JBVENIX0sKKyNkZWZpbmUgTE9OR19DQUJBQ19TUkNfQUREUiAgIEFWX1NDUkFUQ0hfSAorI2RlZmluZSBMT05HX0NBQkFDX0RFU19BRERSICAgQVZfU0NSQVRDSF9JCisvKiBiaXRbMzE6MTZdIC0gdmVydGljYWxfc2l6ZQorICogYml0WzE1OjBdIC0gaG9yaXpvbnRhbF9zaXplCisgKi8KKyNkZWZpbmUgTE9OR19DQUJBQ19QSUNfU0laRSAgIEFWX1NDUkFUQ0hfSgorCisjZW5kaWYKKworLyoKKyAqI2RlZmluZSBQRVJGT1JNQU5DRV9ERUJVRworICojZGVmaW5lIERVTVBfREVCVUcKKyAqLworI2RlZmluZSBBVlNfREVCVUdfUFJJTlQgICAgICAgICAweDAxCisjZGVmaW5lIEFWU19ERUJVR19VQ09ERSAgICAgICAgIDB4MDIKKyNkZWZpbmUgQVZTX0RFQlVHX09MRF9FUlJPUl9IQU5ETEUJMHgxMAorI2RlZmluZSBBVlNfREVCVUdfVVNFX0ZVTExfU1BFRUQgMHg4MAorI2RlZmluZSBBRUNfRFVNUAkJCQkweDEwMAorI2RlZmluZSBTVFJFQU1fSU5GT19EVU1QCQkweDIwMAorI2RlZmluZSBTTElDRV9JTkZPX0RVTVAJCQkweDQwMAorI2RlZmluZSBNQl9JTkZPX0RVTVAJCQkweDgwMAorI2RlZmluZSBNQl9OVU1fRFVNUAkJCQkweDEwMDAKKyNkZWZpbmUgQkxPQ0tfTlVNX0RVTVAJCQkweDIwMDAKKyNkZWZpbmUgQ09FRkZfRFVNUAkJCQkweDQwMDAKKyNkZWZpbmUgRVNfRFVNUAkJCQkJMHg4MDAwCisjZGVmaW5lIERRVUFOVF9EVU1QCQkJCTB4MTAwMDAKKyNkZWZpbmUgU1RSRUFNX0lORk9fRFVNUF9NT1JFICAgMHgyMDAwMAorI2RlZmluZSBTVFJFQU1fSU5GT19EVU1QX01PUkUyICAweDQwMDAwCisKK2V4dGVybiB2b2lkICplc193cml0ZV9hZGRyX3ZpcnQ7CitleHRlcm4gdm9pZCAqYml0c3RyZWFtX3JlYWRfdG1wOworZXh0ZXJuIGRtYV9hZGRyX3QgYml0c3RyZWFtX3JlYWRfdG1wX3BoeTsKK2ludCByZWFkX2JpdHN0cmVhbSh1bnNpZ25lZCBjaGFyICpCdWYsIGludCBzaXplKTsKK2ludCB1X3YoaW50IExlbkluQml0cywgY2hhciAqdHJhY2VzdHJpbmcpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9hdnMvYXZzcF90cmFucy5jIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL2F2cy9hdnNwX3RyYW5zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkyZGJiOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9hdnMvYXZzcF90cmFucy5jCkBAIC0wLDAgKzEsNTA2NSBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE3IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyogbW9yZSBkZXRhaWxzLgorKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKgorKiBEZXNjcmlwdGlvbjoKKyovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy9hbXN0cmVhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZnJhbWVfc3luYy9wdHNzZXJ2Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jYW52YXMvY2FudmFzLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3Byb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3JlY2VpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy92Zm9ybWF0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvZGVjX21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorLyogI2luY2x1ZGUgPG1hY2gvYW1fcmVncy5oPiAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmRlY19yZWcuaD4KKyNpbmNsdWRlICIuLi8uLi8uLi9zdHJlYW1faW5wdXQvYW1wb3J0cy9zdHJlYW1idWZfcmVnLmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvYW12ZGVjLmgiCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9yZWdpc3RlcnMvcmVnaXN0ZXIuaD4KKyNpbmNsdWRlICIuLi8uLi8uLi9zdHJlYW1faW5wdXQvYW1wb3J0cy9hbXBvcnRzX3ByaXYuaCIKKworI2luY2x1ZGUgImF2cy5oIgorI2lmZGVmIEFWU1BfTE9OR19DQUJBQworCisjZGVmaW5lIERFQ09ESU5HX1NBTklUWV9DSEVDSworCisjZGVmaW5lIFRSQUNFIDAKKyNkZWZpbmUgTElXUl9GSVggMAorI2RlZmluZSBwb3cyKGEsIGIpICgxPDxiKQorI2RlZmluZSBpb19wcmludGYgcHJfaW5mbworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqbG9jYWxfaGVhcF9hZHI7CitzdGF0aWMgaW50IGxvY2FsX2hlYXBfc2l6ZTsKK3N0YXRpYyBpbnQgbG9jYWxfaGVhcF9wb3M7CitzdGF0aWMgaW50IHRyYW5zY29kaW5nX2Vycm9yX2ZsYWc7CisKK3Vuc2lnbmVkIGNoYXIgKmxvY2FsX2FsbG9jKGludCBudW0sIGludCBzaXplKQoreworCXVuc2lnbmVkIGNoYXIgKnJldF9idWYgPSBOVUxMOworCWludCBhbGxvY19zaXplID0gbnVtICogc2l6ZTsKKworCWlmICgobG9jYWxfaGVhcF9wb3MgKyBhbGxvY19zaXplKSA8PSBsb2NhbF9oZWFwX3NpemUpIHsKKwkJcmV0X2J1ZiA9IGxvY2FsX2hlYXBfYWRyICsgbG9jYWxfaGVhcF9wb3M7CisJCWxvY2FsX2hlYXBfcG9zICs9IGFsbG9jX3NpemU7CisJfSBlbHNlIHsKKwkJcHJfaW5mbygKKwkJCQkiISEhbG9jYWxfYWxsb2MoJWQpIGVycm9yLCBsb2NhbF9oZWFwIChzaXplICVkKSBpcyBub3QgZW5vdWdoXHJcbiIsCisJCQkJYWxsb2Nfc2l6ZSwgbG9jYWxfaGVhcF9zaXplKTsKKwl9CisJcmV0dXJuIHJldF9idWY7Cit9CisKK2ludCBsb2NhbF9oZWFwX2luaXQoaW50IHNpemUpCit7CisJLypsb2NhbF9oZWFwX2FkciA9ICZsb2NhbF9oZWFwWzBdOyovCisJbG9jYWxfaGVhcF9hZHIgPSAodW5zaWduZWQgY2hhciAqKShhdnNwX2hlYXBfYWRyICsKKwlNQVhfQ09ERURfRlJBTUVfU0laRSk7CisJbWVtc2V0KGxvY2FsX2hlYXBfYWRyLCAwLCBMT0NBTF9IRUFQX1NJWkUpOworCisJbG9jYWxfaGVhcF9zaXplID0gTE9DQUxfSEVBUF9TSVpFOworCWxvY2FsX2hlYXBfcG9zID0gMDsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBsb2NhbF9oZWFwX3VuaW5pdCh2b2lkKQoreworCWxvY2FsX2hlYXBfYWRyID0gTlVMTDsKKwlsb2NhbF9oZWFwX3NpemUgPSAwOworCWxvY2FsX2hlYXBfcG9zID0gMDsKK30KKworI2RlZmluZSBDT0RFMkRfRVNDQVBFX1NZTUJPTCA1OQorCitjb25zdCBpbnQgdmxjX2dvbG9tYl9vcmRlclszXVs3XVsyXSA9CisKK3t7ezIsIDl9LCB7MiwgOX0sIHsyLCA5fSwgezIsIDl9LCB7MiwgOX0sIHsyLCA5fSwgezIsIDl9LCB9LCB7ezMsIDl9LCB7MiwgOX0sIHsKKwkJMiwgOX0sIHsyLCA5fSwgezIsIDl9LCB7MiwgOX0sIHsyLCA5fSwgfSwge3syLCA5fSwgezAsIDl9LAorCQl7MSwgOX0sIHsxLCA5fSwgezAsIDl9LCB7LTEsIC0xfSwgey0xLCAtMX0sIH0sIH07CisKK2NvbnN0IGludCBNYXhSdW5bM11bN10gPSB7ezIyLCAxNCwgOSwgNiwgNCwgMiwgMX0sIHsyNSwgMTgsIDEzLCA5LCA2LCA0LCAzfSwgeworCQkyNCwgMTksIDEwLCA3LCA0LCAtMSwgLTF9IH07CisKK2NvbnN0IGludCByZWZhYnNsZXZlbFsxOV1bMjZdID0ge3s0LCAzLCAzLCAzLCAzLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorCQkyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAtMSwgLTEsIC0xfSwgezcsIDQsIDQsIDMsIDMsIDMsIDMsIDMsIDIsCisJCTIsIDIsIDIsIDIsIDIsIDIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHsKKwkJMTAsIDYsIDQsIDQsIDMsIDMsIDMsIDIsIDIsIDIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgezEzLCA3LCA1LCA0LCAzLCAyLCAyLCAtMSwgLTEsCisJCS0xIC0gMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMX0sIHsxOCwgOCwgNCwgMiwgMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHsyMiwgNywgMywgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xfSwgezI3LCA0LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgezQsCisJCTMsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisJCTIsIDIsIDIsIDJ9LCB7NSwgNCwgMywgMywgMywgMywgMywgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKwkJMiwgMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7NywgNSwgNCwgNCwgMywgMywgMywgMiwgMiwKKwkJMiwgMiwgMiwgMiwgMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sCisJCXsxMCwgNiwgNSwgNCwgMywgMywgMiwgMiwgMiwgMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHsxMywgNywgNSwgNCwKKwkJCQkzLCAyLCAyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgezE3LCA4LCA0LAorCQkJCTMsIDIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHsKKwkJCQkyMiwgNiwgMywgMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xfSwgezUsIDMsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisJCQkJMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgLTF9LCB7NiwgNCwgMywKKwkJCQkzLCAzLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorCQkJCTIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7MTAsIDYsIDQsIDQsIDMsIDMsCisJCQkJMiwgMiwgMiwgMiwgMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgezE0LCA3LCA0LCAzLCAzLCAyLAorCQkJCTIsIDIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHsyMCwgNywgMywgMiwKKwkJCQkyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9IH07CisKK3N0YXRpYyBjb25zdCBpbnQgaW5jdmxjX2ludHJhWzddID0gezAsIDEsIDIsIDQsIDcsIDEwLCAzMDAwfTsKK3N0YXRpYyBjb25zdCBpbnQgaW5jdmxjX2Nocm9tYVs1XSA9IHswLCAxLCAyLCA0LCAzMDAwfTsKKworY29uc3QgaW50IEFWU18yRFZMQ19JTlRSQVs3XVsyNl1bMjddID0ge3t7MCwgMjIsIDM4LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xfSwgezIsIDMyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHs0LCA0NCwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7NiwgNTAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xfSwgezgsIDU0LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHsxMCwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgezEyLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTF9LCB7MTQsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMX0sIHsxNiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgezE4LCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7MjAsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMX0sIHsyNCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xfSwgezI2LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7MjgsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHszMCwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xfSwgezM0LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTF9LCB7MzYsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHs0MCwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgezQyLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTF9LCB7NDYsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMX0sIHs0OCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgezUyLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7NTYsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIH0sIHt7OCwgMCwgNCwgMTUsIDI3LCA0MSwKKwkJNTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgMiwgMTcsIDM1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LAorCQl7LTEsIDYsIDI1LCA1MywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7CisJCQkJLTEsIDksIDMzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMX0sIHstMSwgMTEsIDM5LCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgMTMsIDQ1LCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHsKKwkJCQktMSwgMTksIDQ5LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMX0sIHstMSwgMjEsIDUxLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgMjMsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHsKKwkJCQktMSwgMjksIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMX0sIHstMSwgMzEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgMzcsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHsKKwkJCQktMSwgNDMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMX0sIHstMSwgNDcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgNTcsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHsKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHsKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHsKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHsKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIH0sIHt7OCwgMCwgMiwgNiwKKwkJMTMsIDE3LCAyNywgMzUsIDQ1LCA1NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCA0LCAxMSwgMjEsIDMzLCA0OSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMX0sIHstMSwgOSwgMjMsIDM3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIDE1LAorCQkyOSwgNTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgMTksIDM5LCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAyNSwgNDMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTF9LCB7LTEsIDMxLCA1MywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgNDEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCA0NywgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIDU3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xfSwgfSwge3s4LCAwLCAyLCA0LCA5LCAxMSwgMTcsIDIxLCAyNSwgMzMsIDM5LCA0NSwgNTUsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgNiwgMTMsIDE5LAorCQkyOSwgMzUsIDQ3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIDE1LCAyNywgNDEsIDU3LCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMX0sIHstMSwgMjMsIDM3LCA1MywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgeworCQktMSwgMzEsIDUxLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCA0MywgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIDQ5LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgeworCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgeworCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgeworCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgeworCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgeworCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB9LCB7ezYsIDAsIDIsIDQsIDcsIDksIDExLCAxNSwgMTcsCisJCTIxLCAyMywgMjksIDMzLCAzNSwgNDMsIDQ3LCA0OSwgNTcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTF9LCB7LTEsIDEzLCAxOSwgMjcsIDMxLCAzNywgNDUsIDU1LCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwKKwkJMjUsIDQxLCA1MSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAzOSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIDUzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIH0sIHt7MCwKKwkJMSwgMywgNSwgNywgOSwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjUsIDI3LCAzMSwgMzMsIDM3LCA0MSwKKwkJNDUsIDQ5LCA1MSwgNTUsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgMjEsIDI5LCAzNSwgNDMsIDQ3LAorCQk1MywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAzOSwgNTcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xfSwgfSwge3swLCAxLCAzLCA1LCA3LCA5LCAxMSwgMTMsIDE1LCAxNywgMTksCisJCTIxLCAyMywgMjUsIDI3LCAyOSwgMzEsIDM1LCAzNywgMzksIDQxLCA0MywgNDcsIDQ5LCA1MSwgNTMsIDU3fSwKKwkJey0xLCAzMywgNDUsIDU1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHsKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHsKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHsKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHsKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHsKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHsKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHsKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHsKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0gfSB9OworCitjb25zdCBpbnQgQVZTXzJEVkxDX0NIUk9NQVs1XVsyNl1bMjddID0ge3t7MCwgMTQsIDMyLCA1NiwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xfSwgezIsIDQ4LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHs0LCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7NiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xfSwgezgsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHsxMCwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgezEyLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7MTYsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMX0sIHsxOCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgezIwLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7MjIsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHsyNCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xfSwgezI2LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7MjgsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHszMCwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgezM0LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTF9LCB7MzYsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHszOCwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgezQwLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7NDIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMX0sIHs0NCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgezQ2LAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7NTAsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHs1MiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xfSwgezU0LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIH0sIHt7MCwgMSwgNSwgMTUsIDI5LAorCQk0MywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgMywgMjEsIDQ1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTF9LCB7LTEsIDcsIDM3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCA5LCA0MSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgMTEsIDUzLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xfSwgey0xLCAxMywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7CisJCS0xLCAxNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIDE5LCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgMjMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xfSwgey0xLCAyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7CisJCS0xLCAyNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIDMxLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgMzMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xfSwgey0xLCAzNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7CisJCS0xLCAzOSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIDQ3LCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgNDksIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xfSwgey0xLCA1MSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7CisJCS0xLCA1NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIDU3LCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7CisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB9LAorCQl7ezIsIDAsIDMsIDcsIDExLCAxNywgMjcsIDMzLCA0NywgNTMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgeworCQkJCS0xLCA1LCAxMywgMjEsIDM3LCA1NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTF9LCB7LTEsIDksIDIzLCA0MSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgMTUsIDMxLCA1NywgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwKKwkJCQkxOSwgNDMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xfSwgey0xLCAyNSwgNDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAyOSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLAorCQkJCTM1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTF9LCB7LTEsIDM5LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIDQ5LCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsCisJCQkJNTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTF9LCB9LCB7ezAsIDEsIDMsIDUsIDcsIDExLCAxNSwgMTksIDIzLCAyOSwKKwkJCQkzNSwgNDMsIDQ3LCA1MywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgOSwgMTMsIDIxLCAzMSwgMzksIDUxLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAxNywgMjcsCisJCQkJMzcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwKKwkJCQl7LTEsIDI1LCA0MSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgeworCQkJCQkJLTEsIDMzLCA1NSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMX0sIHstMSwgNDUsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgeworCQkJCQkJLTEsIDQ5LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMX0sIHstMSwgNTcsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgeworCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgeworCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgeworCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgeworCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgeworCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgeworCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgeworCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgeworCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgeworCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkJLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgfSwKKwkJe3swLCAxLCAzLCA1LCA3LCA5LCAxMSwgMTMsIDE1LCAxOSwgMjEsIDIzLCAyNywgMjksIDMzLCAzNywgNDEsCisJCQkJNDMsIDUxLCA1NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsCisJCQkJMTcsIDI1LCAzMSwgMzksIDQ1LCA1MywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMX0sIHstMSwgMzUsIDQ5LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgNDcsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwKKwkJCQk1NywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLAorCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTF9LCB9IH07CisKK2NvbnN0IGludCBVRVs2NF1bMl0gPSB7ezEsIDF9LCB7MiwgM30sIHszLCAzfSwgezQsIDV9LCB7NSwgNX0sIHs2LCA1fSwgezcsIDV9LCB7CisJCTgsIDd9LCB7OSwgN30sIHsxMCwgN30sIHsxMSwgN30sIHsxMiwgN30sIHsxMywgN30sIHsxNCwgN30sIHsxNSwKKwkJN30sIHsxNiwgOX0sIHsxNywgOX0sIHsxOCwgOX0sIHsxOSwgOX0sIHsyMCwgOX0sIHsyMSwgOX0sCisJCXsyMiwgOX0sIHsyMywgOX0sIHsyNCwgOX0sIHsyNSwgOX0sIHsyNiwgOX0sIHsyNywgOX0sIHsyOCwgOX0sIHsKKwkJCQkyOSwgOX0sIHszMCwgOX0sIHszMSwgOX0sIHszMiwgMTF9LCB7MzMsIDExfSwgeworCQkJCTM0LCAxMX0sIHszNSwgMTF9LCB7MzYsIDExfSwgezM3LCAxMX0sIHszOCwgMTF9LAorCQl7MzksIDExfSwgezQwLCAxMX0sIHs0MSwgMTF9LCB7NDIsIDExfSwgezQzLCAxMX0sIHs0NCwgMTF9LCB7NDUsCisJCQkJMTF9LCB7NDYsIDExfSwgezQ3LCAxMX0sIHs0OCwgMTF9LCB7NDksIDExfSwgeworCQkJCTUwLCAxMX0sIHs1MSwgMTF9LCB7NTIsIDExfSwgezUzLCAxMX0sIHs1NCwgMTF9LAorCQl7NTUsIDExfSwgezU2LCAxMX0sIHs1NywgMTF9LCB7NTgsIDExfSwgezU5LCAxMX0sIHs2MCwgMTF9LCB7NjEsCisJCQkJMTF9LCB7NjIsIDExfSwgezYzLCAxMX0sIHs2NCwgMTN9IH07CisKK3Vuc2lnbmVkIGludCBzcmNfc3RhcnQ7Cit1bnNpZ25lZCBpbnQgZGVzX3N0YXJ0OworCisjaWZkZWYgQVZTUF9MT05HX0NBQkFDCisKK3Vuc2lnbmVkIGNoYXIgKmVzX2J1ZjsKK3Vuc2lnbmVkIGludCBlc19idWZfcHRyOwordW5zaWduZWQgaW50IGVzX2J1Zl9pc19vdmVyZmxvdzsKKworI2Vsc2UKK0ZJTEUgKmZfZXM7CisjZW5kaWYKK3Vuc2lnbmVkIGludCBlc19wdHI7Cit1bnNpZ25lZCBpbnQgZXNfcmVzOwordW5zaWduZWQgaW50IGVzX3Jlc19wdHI7Cit1bnNpZ25lZCBpbnQgcHJldmlvdXNfZXM7CisKK3ZvaWQgaW5pdF9lcyh2b2lkKQoreworCisjaWZkZWYgQVZTUF9MT05HX0NBQkFDCisJZXNfYnVmX2lzX292ZXJmbG93ID0gMDsKKworCWVzX2J1ZlswXSA9IDB4MDA7CisJZXNfYnVmWzFdID0gMHgwMDsKKwllc19idWZbMl0gPSAweDAxOworCWVzX2J1Zl9wdHIgPSAzOworCWVzX3B0ciA9IDM7CisjZWxzZQorCWZfZXMgPSBmb3BlbigiZXMub3V0IiwgIndiIik7CisJaWYgKGZfZXMgPT0gTlVMTCkKKwkJaW9fcHJpbnRmKCIgRVJST1IgOiBDYW4gbm90IG9wZW4gZXMub3V0IGZvciB3cml0ZVxuIik7CisJcHV0YygweDAwLCBmX2VzKTsKKwlwdXRjKDB4MDAsIGZfZXMpOworCXB1dGMoMHgwMSwgZl9lcyk7CisKKwllc19wdHIgPSAzOworI2VuZGlmCisJZXNfcmVzID0gMDsKKwllc19yZXNfcHRyID0gMDsKKwlwcmV2aW91c19lcyA9IDB4ZmY7CisKK30KKwordm9pZCBwdXNoX2VzKGludCB2YWx1ZSwgaW50IG51bSkKK3sKKwl1bnNpZ25lZCBjaGFyIHdyX2VzX2RhdGE7CisJaW50IHB1c2hfbnVtOworCWludCBwdXNoX3ZhbHVlOworCisjaWZkZWYgRFVNUF9ERUJVRworCWlmIChhdnNfZ2V0X2RlYnVnX2ZsYWcoKSAmIEVTX0RVTVApCisJCWlvX3ByaW50ZigiIHB1c2hfZXMgOiB2YWx1ZSA6IDB4JXgsIG51bSA6ICVkXG4iLCB2YWx1ZSwgbnVtKTsKKyNlbmRpZgorCXdoaWxlIChudW0gPiAwKSB7CisJCWlmIChudW0gPj0gOCkKKwkJCXB1c2hfbnVtID0gODsKKwkJZWxzZQorCQkJcHVzaF9udW0gPSBudW07CisKKwkJbnVtID0gbnVtIC0gcHVzaF9udW07CisJCXB1c2hfdmFsdWUgPSAodmFsdWUgPj4gbnVtKTsKKworCQllc19yZXMgPSAoZXNfcmVzIDw8IHB1c2hfbnVtKSB8IHB1c2hfdmFsdWU7CisJCWVzX3Jlc19wdHIgPSBlc19yZXNfcHRyICsgcHVzaF9udW07CisKKyNpZmRlZiBEVU1QX0RFQlVHCisJCWlmIChhdnNfZ2V0X2RlYnVnX2ZsYWcoKSAmIEVTX0RVTVApCisJCQlpb19wcmludGYoIiAjIyMjIGVzX3JlcyA6IDB4JVgsIGVzX3Jlc19wdHIgOiAlZFxuIiwKKwkJCQllc19yZXMsIGVzX3Jlc19wdHIpOworI2VuZGlmCisKKwkJd2hpbGUgKGVzX3Jlc19wdHIgPj0gOCkgeworCQkJZXNfcmVzX3B0ciA9IGVzX3Jlc19wdHIgJiA3OworCQkJd3JfZXNfZGF0YSA9IChlc19yZXMgPj4gZXNfcmVzX3B0cikgJiAweGZmOworCQkJaWYgKChwcmV2aW91c19lcyA9PSAwKSAmICh3cl9lc19kYXRhIDwgNCkpIHsKKwkJCQlpb19wcmludGYoCisJCQkJCQkiIEluc2VydCAyJ2IxMCBmb3IgZW11IGF0IHBvc2l0aW9uIDogJWRcbiIsCisJCQkJCQllc19wdHIpOworCisJCQkJZXNfcmVzX3B0ciA9IGVzX3Jlc19wdHIgKyAyOworCQkJCXdyX2VzX2RhdGEgPSAyOworCQkJfQorI2lmZGVmIEFWU1BfTE9OR19DQUJBQworI2lmZGVmIERVTVBfREVCVUcKKwkJCWlmIChhdnNfZ2V0X2RlYnVnX2ZsYWcoKSAmIEVTX0RVTVApCisJCQkJcHJfaW5mbygiZXNfYnVmWyVkXSA9IDB4JTAyeFxyXG4iLAorCQkJCQllc19idWZfcHRyLCB3cl9lc19kYXRhKTsKKyNlbmRpZgorCQkJaWYgKCFlc19idWZfaXNfb3ZlcmZsb3cpIHsKKwkJCQllc19idWZbZXNfYnVmX3B0cisrXSA9IHdyX2VzX2RhdGE7CisJCQkJaWYgKGVzX2J1Zl9wdHIgPj0gTUFYX0NPREVEX0ZSQU1FX1NJWkUpCisJCQkJCWVzX2J1Zl9pc19vdmVyZmxvdyA9IDE7CisJCQl9CisjZWxzZQorCQkJcHV0Yyh3cl9lc19kYXRhLCBmX2VzKTsKKyNlbmRpZgorCQkJZXNfcHRyKys7CisJCQlwcmV2aW91c19lcyA9ICgocHJldmlvdXNfZXMgPDwgOCkgfCB3cl9lc19kYXRhKQorCQkJCQkmIDB4ZmZmZjsKKwkJfQorCisJfQorfQorCisjaWZkZWYgQkxPQ0tfU0laRQorI3VuZGVmIEJMT0NLX1NJWkUKKyNlbmRpZgorCisjZGVmaW5lIE1JTl9RUCAgICAgICAgICAwCisjZGVmaW5lIE1BWF9RUCAgICAgICAgICA2MworCisjZGVmaW5lIEJMT0NLX1NJWkUgICAgICA0CisjZGVmaW5lIEI4X1NJWkUgICAgICAgICA4CisjZGVmaW5lIE1CX0JMT0NLX1NJWkUgICAxNgorCisjZGVmaW5lIEJMT0NLX01VTFRJUExFICAgICAgKE1CX0JMT0NLX1NJWkUvKEJMT0NLX1NJWkUqMikpCisKKyNkZWZpbmUgREVDT0RFX0NPUFlfTUIgIDAKKyNkZWZpbmUgREVDT0RFX01CICAgICAgIDEKKworI2RlZmluZSBOT19JTlRSQV9QTU9ERSAgNQorI2RlZmluZSBJTlRSQV9QTU9ERV80eDQgICAxMAorI2RlZmluZSBOT19JTlRSQV9QTU9ERV80eDQJMTkKKy8qIDh4OCBpbnRyYSBwcmVkaWN0aW9uIG1vZGVzICovCisjZGVmaW5lIFZFUlRfUFJFRCAgICAgICAgICAgICAwCisjZGVmaW5lIEhPUl9QUkVEICAgICAgICAgICAgICAxCisjZGVmaW5lIERDX1BSRUQgICAgICAgICAgICAgICAyCisjZGVmaW5lIERPV05fTEVGVF9QUkVEICAgMworI2RlZmluZSBET1dOX1JJR0hUX1BSRUQgIDQKKworI2RlZmluZSBWRVJUX1BSRURfNHg0ICAgMAorI2RlZmluZSBIT1JfUFJFRF80eDQJMQorI2RlZmluZSBEQ19QUkVEXzR4NAkJMgorI2RlZmluZSBET1dOX0xFRlRfUFJFRF80eDQJMworI2RlZmluZSBET1dOX1JJR0hUX1BSRURfNHg0CTQKKworI2RlZmluZSBIT1JfRE9XTl9QUkVEXzR4NAkJNQorI2RlZmluZSBWRVJUX0xFRlRfUFJFRF80eDQJNgorI2RlZmluZSBIT1JfVVBfUFJFRF80eDQJICAgNworI2RlZmluZSBWRVJUX1JJR0hUX1BSRURfNHg0CTgKKworI2RlZmluZSBEQ19QUkVEXzggICAgICAgMAorI2RlZmluZSBIT1JfUFJFRF84ICAgICAgMQorI2RlZmluZSBWRVJUX1BSRURfOCAgICAgMgorI2RlZmluZSBQTEFORV84ICAgICAgICAgMworCisjZGVmaW5lIExVTUFfMTZEQyAgICAgICAwCisjZGVmaW5lIExVTUFfMTZBQyAgICAgICAxCisjZGVmaW5lIExVTUFfOHg4ICAgICAgICAyCisjZGVmaW5lIExVTUFfOHg0ICAgICAgICAzCisjZGVmaW5lIExVTUFfNHg4ICAgICAgICA0CisjZGVmaW5lIExVTUFfNHg0ICAgICAgICA1CisjZGVmaW5lIENIUk9NQV9EQyAgICAgICA2CisjZGVmaW5lIENIUk9NQV9BQyAgICAgICA3CisjZGVmaW5lIE5VTV9CTE9DS19UWVBFUyA4CisKKyNkZWZpbmUgSV9QSUNUVVJFX1NUQVJUX0NPREUgICAgMHhCMworI2RlZmluZSBQQl9QSUNUVVJFX1NUQVJUX0NPREUgICAweEI2CisjZGVmaW5lIFNMSUNFX1NUQVJUX0NPREVfTUlOICAgIDB4MDAKKyNkZWZpbmUgU0xJQ0VfU1RBUlRfQ09ERV9NQVggICAgMHhBRgorI2RlZmluZSBVU0VSX0RBVEFfU1RBUlRfQ09ERSAgICAweEIyCisjZGVmaW5lIFNFUVVFTkNFX0hFQURFUl9DT0RFICAgIDB4QjAKKyNkZWZpbmUgRVhURU5TSU9OX1NUQVJUX0NPREUgICAgMHhCNQorI2RlZmluZSBTRVFVRU5DRV9FTkRfQ09ERSAgICAgICAweEIxCisjZGVmaW5lIFZJREVPX0VESVRfQ09ERSAgICAgICAgIDB4QjcKKworI2RlZmluZSBFT1MgICAgICAgICAgICAgMQorI2RlZmluZSBTT1AgICAgICAgICAgICAgMgorI2RlZmluZSBTT1MgICAgICAgICAgICAgMworI2RlZmluZSBQOHg4ICAgIDgKKyNkZWZpbmUgSThNQiAgICA5CisjZGVmaW5lIEk0TUIgICAxMAorI2RlZmluZSBJQkxPQ0sgIDExCisjZGVmaW5lIFNJNE1CICAgMTIKKyNkZWZpbmUgTUFYTU9ERSAxMworCisjZGVmaW5lIElTX0lOVFJBKE1CKSAgICAoKE1CKS0+bWJfdHlwZSA9PSBJOE1CICB8fCAoTUIpLT5tYl90eXBlID09IEk0TUIpCisjZGVmaW5lIElTX05FV0lOVFJBKE1CKSAoKE1CKS0+bWJfdHlwZSA9PSBJNE1CKQorI2RlZmluZSBJU19PTERJTlRSQShNQikgKChNQiktPm1iX3R5cGUgPT0gSThNQikKKyNkZWZpbmUgSVNfSU5URVIoTUIpICAgICgoTUIpLT5tYl90eXBlICE9IEk4TUIgICYmIChNQiktPm1iX3R5cGUgIT0gSTRNQikKKyNkZWZpbmUgSVNfSU5URVJNVihNQikgICgoTUIpLT5tYl90eXBlICE9IEk4TUIgICYmIChNQiktPm1iX3R5cGUgIT0gSTRNQlwKKwkmJiAoTUIpLT5tYl90eXBlICE9IDApCisKKyNkZWZpbmUgSVNfRElSRUNUKE1CKSAgICgoTUIpLT5tYl90eXBlID09IDAgICAgICYmIChpbWctPnR5cGUgPT0gQl9JTUcpKQorI2RlZmluZSBJU19DT1BZKE1CKSAgICAgKChNQiktPm1iX3R5cGUgPT0gMCAgICAgJiYgKGltZy0+dHlwZSA9PSBQX0lNRykpCisjZGVmaW5lIElTX1A4eDgoTUIpICAgICAoKE1CKS0+bWJfdHlwZSA9PSBQOHg4KQorCisjZGVmaW5lIFBfSU1HICAgICAwCisjZGVmaW5lIEJfSU1HICAgICAxCisjZGVmaW5lIElfSU1HICAgICAyCisKKyNkZWZpbmUgRklFTEQgICAgIDAKKyNkZWZpbmUgRlJBTUUgICAgIDEKKworI2RlZmluZSBTRV9DQUJQICAgIDIxCitzdHJ1Y3QgZGVjb2RpbmdfZW52aXJvbm1lbnRfcyB7CisJdW5zaWduZWQgaW50IGRidWZmZXI7CisJaW50IGRiaXRzX3RvX2dvOworCXVuc2lnbmVkIGNoYXIgKmRjb2Rlc3RybTsKKwlpbnQgKmRjb2Rlc3RybV9sZW47Cit9OworCitzdHJ1Y3QgYmlfY29udGV4dF90eXBlX3MgeworCXVuc2lnbmVkIGNoYXIgTVBTOworCXVuc2lnbmVkIGludCBMR19QTVBTOworCXVuc2lnbmVkIGNoYXIgY3ljbm87Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDIE8gTiBUIEUgWCBUIFMgICBGIE8gUiAgIFIgTSAgIFMgWSBOIFQgQSBYICAgRSBMIEUgTSBFIE4gVCBTCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNkZWZpbmUgTlVNX01CX1RZUEVfQ1RYICAxMQorI2RlZmluZSBOVU1fQjhfVFlQRV9DVFggIDkKKyNkZWZpbmUgTlVNX01WX1JFU19DVFggICAxMAorI2RlZmluZSBOVU1fUkVGX05PX0NUWCAgIDYKKyNkZWZpbmUgTlVNX0RFTFRBX1FQX0NUWCA0CisjZGVmaW5lIE5VTV9NQl9BRkZfQ1RYIDQKKworc3RydWN0IG1vdGlvbl9pbmZvX2NvbnRleHRzX3MgeworCXN0cnVjdCBiaV9jb250ZXh0X3R5cGVfcyBtYl90eXBlX2NvbnRleHRzWzRdW05VTV9NQl9UWVBFX0NUWF07CisJc3RydWN0IGJpX2NvbnRleHRfdHlwZV9zIGI4X3R5cGVfY29udGV4dHNbMl1bTlVNX0I4X1RZUEVfQ1RYXTsKKwlzdHJ1Y3QgYmlfY29udGV4dF90eXBlX3MgbXZfcmVzX2NvbnRleHRzWzJdW05VTV9NVl9SRVNfQ1RYXTsKKwlzdHJ1Y3QgYmlfY29udGV4dF90eXBlX3MgcmVmX25vX2NvbnRleHRzWzJdW05VTV9SRUZfTk9fQ1RYXTsKKwlzdHJ1Y3QgYmlfY29udGV4dF90eXBlX3MgZGVsdGFfcXBfY29udGV4dHNbTlVNX0RFTFRBX1FQX0NUWF07CisJc3RydWN0IGJpX2NvbnRleHRfdHlwZV9zIG1iX2FmZl9jb250ZXh0c1tOVU1fTUJfQUZGX0NUWF07CisjaWZkZWYgVEVTVF9XRUlHSFRJTkdfQUVDCitzdHJ1Y3QgYmlfY29udGV4dF90eXBlX3MgbWJfd2VpZ2h0aW5nX3ByZWQ7CisjZW5kaWYKK307CisKKyNkZWZpbmUgTlVNX0lQUl9DVFggICAgMgorI2RlZmluZSBOVU1fQ0lQUl9DVFggICA0CisjZGVmaW5lIE5VTV9DQlBfQ1RYICAgIDQKKyNkZWZpbmUgTlVNX0JDQlBfQ1RYICAgNAorI2RlZmluZSBOVU1fTUFQX0NUWCAgIDE2CisjZGVmaW5lIE5VTV9MQVNUX0NUWCAgMTYKKworI2RlZmluZSBOVU1fT05FX0NUWCAgICA1CisjZGVmaW5lIE5VTV9BQlNfQ1RYICAgIDUKKworc3RydWN0IHRleHR1cmVfaW5mb19jb250ZXh0cyB7CisJc3RydWN0IGJpX2NvbnRleHRfdHlwZV9zIGlwcl9jb250ZXh0c1tOVU1fSVBSX0NUWF07CisJc3RydWN0IGJpX2NvbnRleHRfdHlwZV9zIGNpcHJfY29udGV4dHNbTlVNX0NJUFJfQ1RYXTsKKwlzdHJ1Y3QgYmlfY29udGV4dF90eXBlX3MgY2JwX2NvbnRleHRzWzNdW05VTV9DQlBfQ1RYXTsKKwlzdHJ1Y3QgYmlfY29udGV4dF90eXBlX3MgYmNicF9jb250ZXh0c1tOVU1fQkxPQ0tfVFlQRVNdW05VTV9CQ0JQX0NUWF07CisJc3RydWN0IGJpX2NvbnRleHRfdHlwZV9zIG9uZV9jb250ZXh0c1tOVU1fQkxPQ0tfVFlQRVNdW05VTV9PTkVfQ1RYXTsKKwlzdHJ1Y3QgYmlfY29udGV4dF90eXBlX3MgYWJzX2NvbnRleHRzW05VTV9CTE9DS19UWVBFU11bTlVNX0FCU19DVFhdOworCXN0cnVjdCBiaV9jb250ZXh0X3R5cGVfcyBmbGRfbWFwX2NvbnRleHRzW05VTV9CTE9DS19UWVBFU11bTlVNX01BUF9DVFhdOworCXN0cnVjdCBiaV9jb250ZXh0X3R5cGVfcyBmbGRfbGFzdF9jb250ZXh0cworCVtOVU1fQkxPQ0tfVFlQRVNdW05VTV9MQVNUX0NUWF07CisJc3RydWN0IGJpX2NvbnRleHRfdHlwZV9zIG1hcF9jb250ZXh0c1tOVU1fQkxPQ0tfVFlQRVNdW05VTV9NQVBfQ1RYXTsKKwlzdHJ1Y3QgYmlfY29udGV4dF90eXBlX3MgbGFzdF9jb250ZXh0c1tOVU1fQkxPQ0tfVFlQRVNdW05VTV9MQVNUX0NUWF07Cit9Oworc3RydWN0IGltZ19wYXI7CisKK3N0cnVjdCBzeW50YXhlbGVtZW50IHsKKwlpbnQgdHlwZTsKKwlpbnQgdmFsdWUxOworCWludCB2YWx1ZTI7CisJaW50IGxlbjsKKwlpbnQgaW5mOworCXVuc2lnbmVkIGludCBiaXRwYXR0ZXJuOworCWludCBjb250ZXh0OworCWludCBrOworCWludCBnb2xvbWJfZ3JhZDsKKwlpbnQgZ29sb21iX21heGxldmVsczsKKyNpZiBUUkFDRQorI2RlZmluZSAgICAgICBUUkFDRVNUUklOR19TSVpFIDEwMAorCWNoYXIgdHJhY2VzdHJpbmdbVFJBQ0VTVFJJTkdfU0laRV07CisjZW5kaWYKKworCXZvaWQgKCptYXBwaW5nKShpbnQgbGVuLCBpbnQgaW5mbywgaW50ICp2YWx1ZTEsIGludCAqdmFsdWUyKTsKKworCXZvaWQgKCpyZWFkaW5nKShzdHJ1Y3Qgc3ludGF4ZWxlbWVudCAqLCBzdHJ1Y3QgaW1nX3BhciAqLAorCQkJc3RydWN0IGRlY29kaW5nX2Vudmlyb25tZW50X3MgKik7CisKK307CisKK3N0cnVjdCBiaXRzdHJlYW1fcyB7CisKKwlpbnQgcmVhZF9sZW47CisJaW50IGNvZGVfbGVuOworCisJaW50IGZyYW1lX2JpdG9mZnNldDsKKwlpbnQgYml0c3RyZWFtX2xlbmd0aDsKKworCXVuc2lnbmVkIGNoYXIgKnN0cmVhbV9idWZmZXI7Cit9OworCitzdHJ1Y3QgZGF0YXBhcnRpdGlvbiB7CisKKwlzdHJ1Y3QgYml0c3RyZWFtX3MgKmJpdHN0cmVhbTsKKwlzdHJ1Y3QgZGVjb2RpbmdfZW52aXJvbm1lbnRfcyBkZV9hZWM7CisKKwlpbnQgKCpyZWFkX3N5bnRheF9lbGVtZW50KShzdHJ1Y3Qgc3ludGF4ZWxlbWVudCAqLCBzdHJ1Y3QgaW1nX3BhciAqLAorCQkJc3RydWN0IGRhdGFwYXJ0aXRpb24gKik7CisvKiE8IHZpcnR1YWwgZnVuY3Rpb247CisgKiBhY3R1YWwgbWV0aG9kIGRlcGVuZHMgb24gY2hvc2VuIGRhdGEgcGFydGl0aW9uIGFuZAorICogZW50cm9weSBjb2RpbmcgbWV0aG9kCisgKi8KK307CisKK3N0cnVjdCBzbGljZV9zIHsKKwlpbnQgcGljdHVyZV9pZDsKKwlpbnQgcXA7CisJaW50IHBpY3R1cmVfdHlwZTsKKwlpbnQgc3RhcnRfbWJfbnI7CisJaW50IG1heF9wYXJ0X25yOworCWludCBudW1fbWI7CisKKwlzdHJ1Y3QgZGF0YXBhcnRpdGlvbiAqcGFydF9hcnI7CisJc3RydWN0IG1vdGlvbl9pbmZvX2NvbnRleHRzX3MgKm1vdF9jdHg7CisJc3RydWN0IHRleHR1cmVfaW5mb19jb250ZXh0cyAqdGV4X2N0eDsKKwlpbnQgZmllbGRfY3R4WzNdWzJdOworfTsKKworc3RydWN0IGltZ19wYXIgeworCWludCBudW1iZXI7CisJaW50IGN1cnJlbnRfbWJfbnI7CisJaW50IG1heF9tYl9ucjsKKwlpbnQgY3VycmVudF9zbGljZV9ucjsKKwlpbnQgdHI7CisJaW50IHFwOworCWludCB0eXBlOworCisJaW50IHR5cGViOworCisJaW50IHdpZHRoOworCWludCBoZWlnaHQ7CisJaW50IHdpZHRoX2NyOworCWludCBoZWlnaHRfY3I7CisJaW50IHNvdXJjZV9iaXRkZXB0aDsKKwlpbnQgbWJfeTsKKwlpbnQgbWJfeDsKKwlpbnQgYmxvY2tfeTsKKwlpbnQgcGl4X3k7CisJaW50IHBpeF94OworCWludCBwaXhfY195OworCWludCBibG9ja194OworCWludCBwaXhfY194OworCisJaW50ICoqKm12OworCWludCBtcHJbMTZdWzE2XTsKKworCWludCBtN1sxNl1bMTZdOworCWludCBtOFsvKjIqLzRdWzhdWzhdOworCWludCBjb2ZbNF1bLyo2Ki84XVs0XVs0XTsKKwlpbnQgY29mdVs0XTsKKwlpbnQgKippcHJlZG1vZGU7CisJaW50IHF1YWRbMjU2XTsKKwlpbnQgY29kX2NvdW50ZXI7CisKKwlpbnQgKioqZGZtdjsKKwlpbnQgKioqZGJtdjsKKwlpbnQgKipmd19yZWZmcmFycjsKKwlpbnQgKipid19yZWZmcmFycjsKKworCWludCAqKiptdl9mcm07CisJaW50ICoqZndfcmVmZnJhcnJfZnJtOworCWludCAqKmJ3X3JlZmZyYXJyX2ZybTsKKwlpbnQgaW1ndHJfbmV4dF9wOworCWludCBpbWd0cl9sYXN0X3A7CisJaW50IHRyX2ZybTsKKwlpbnQgdHJfZmxkOworCWludCBpbWd0cl9sYXN0X3ByZXZfcDsKKworCWludCBub19mb3J3YXJkX3JlZmVyZW5jZTsKKwlpbnQgc2VxX2hlYWRlcl9pbmRpY2F0ZTsKKwlpbnQgYl9kaXNjYXJkX2ZsYWc7CisKKwlpbnQgKioqZndfbXY7CisJaW50ICoqKmJ3X212OworCWludCBzdWJibG9ja194OworCWludCBzdWJibG9ja195OworCisJaW50IGJ1Zl9jeWNsZTsKKworCWludCBkaXJlY3RfdHlwZTsKKworCWludCAqKiptdl90b3A7CisJaW50ICoqKm12X2JvdDsKKwlpbnQgKipmd19yZWZmcmFycl90b3A7CisJaW50ICoqYndfcmVmZnJhcnJfdG9wOworCWludCAqKmZ3X3JlZmZyYXJyX2JvdDsKKwlpbnQgKipid19yZWZmcmFycl9ib3Q7CisKKwlpbnQgKippcHJlZG1vZGVfdG9wOworCWludCAqKmlwcmVkbW9kZV9ib3Q7CisJaW50ICoqKmZ3X212X3RvcDsKKwlpbnQgKioqZndfbXZfYm90OworCWludCAqKipid19tdl90b3A7CisJaW50ICoqKmJ3X212X2JvdDsKKwlpbnQgKioqZGZtdl90b3A7CisJaW50ICoqKmRibXZfdG9wOworCWludCAqKipkZm12X2JvdDsKKwlpbnQgKioqZGJtX2JvdDsKKworCWludCB0b3Bwb2M7CisJaW50IGJvdHRvbXBvYzsKKwlpbnQgZnJhbWVwb2M7CisJdW5zaWduZWQgaW50IGZyYW1lX251bTsKKworCXVuc2lnbmVkIGludCBwaWNfZGlzdGFuY2U7CisJaW50IGRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tOworCisJc2lnbmVkIGludCBwaWNfZGlzdGFuY2VfbXNiOworCXVuc2lnbmVkIGludCBwcmV2X3BpY19kaXN0YW5jZV9sc2I7CisJc2lnbmVkIGludCBjdXJyX3BpY19kaXN0YW5jZV9tc2I7CisJdW5zaWduZWQgaW50IHRoaXNfcG9jOworCisJaW50IHBpY193aWR0aF9pbm1iczsKKwlpbnQgcGljX2hlaWdodF9pbm1iczsKKwlpbnQgcGljX3NpemVfaW5tYnM7CisKKwlpbnQgYmxvY2s4X3gsIGJsb2NrOF95OworCWludCBzdHJ1Y3R1cmU7CisJaW50IHBuOworCWludCBidWZfdXNlZDsKKwlpbnQgYnVmX3NpemU7CisJaW50IHBpY3R1cmVfc3RydWN0dXJlOworCWludCBhZHZhbmNlZF9wcmVkX21vZGVfZGlzYWJsZTsKKwlpbnQgdHlwZXM7CisJaW50IGN1cnJlbnRfbWJfbnJfZmxkOworCisJaW50IHBfZmllbGRfZW5oYW5jZWQ7CisJaW50IGJfZmllbGRfZW5oYW5jZWQ7CisKKwlpbnQgc2xpY2Vfd2VpZ2h0aW5nX2ZsYWc7CisJaW50IGx1bV9zY2FsZVs0XTsKKwlpbnQgbHVtX3NoaWZ0WzRdOworCWludCBjaHJvbWFfc2NhbGVbNF07CisJaW50IGNocm9tYV9zaGlmdFs0XTsKKwlpbnQgbWJfd2VpZ2h0aW5nX2ZsYWc7CisJaW50IHdlaWdodGluZ19wcmVkaWN0aW9uOworCWludCBtcHJfd2VpZ2h0WzE2XVsxNl07CisJaW50IHRvcF9ib3Q7CisJaW50IGJmcmFtZV9udW1iZXI7CisKKwlpbnQgYXV0b19jcm9wX3JpZ2h0OworCWludCBhdXRvX2Nyb3BfYm90dG9tOworCisJc3RydWN0IHNsaWNlX3MgKmN1cnJlbnRfc2xpY2U7CisJaW50IGlzX3ZfYmxvY2s7CisJaW50IGlzX2ludHJhX2Jsb2NrOworCisJaW50IG5ld19zZXFfaGVhZGVyX2ZsYWc7CisJaW50IG5ld19zZXF1ZW5jZV9mbGFnOworCWludCBsYXN0X3BpY19iYnZfZGVsYXk7CisKKwlpbnQgc2VxdWVuY2VfZW5kX2ZsYWc7CisJaW50IGlzX3RvcF9maWVsZDsKKworCWludCBhYnRfZmxhZzsKKwlpbnQgcXBfc2hpZnQ7CisKKyNpZmRlZiBFSUdIVEgKK2ludCBlaWdodGhfc3VicGl4ZWxfZmxhZzsKK2ludCBzdWJwaXhlbF9wcmVjaXNpb247CitpbnQgdW5pdF9sZW5ndGg7CitpbnQgc3VicGl4ZWxfbWFzazsKKworaW50IG1heF9tdmQ7CitpbnQgbWluX212ZDsKKyNlbmRpZgorCit9OworCitzdHJ1Y3QgbWFjcm9ibG9jayB7CisJaW50IHFwOworCWludCBzbGljZV9ucjsKKwlpbnQgZGVsdGFfcXVhbnQ7CisJc3RydWN0IG1hY3JvYmxvY2sgKm1iX2F2YWlsYWJsZVszXVszXTsKKwkvKiE8IHBvaW50ZXIgdG8gbmVpZ2hib3JpbmcgTUJzIGluIGEgM3gzIHdpbmRvdyBvZiBjdXJyZW50IE1CLAorCSAqd2hpY2ggaXMgbG9jYXRlZCBhdCBbMV1bMV0KKwkgKiBOVUxMIHBvaW50ZXIgaWRlbnRpZmllcyBuZWlnaGJvcmluZyBNQnMgd2hpY2ggYXJlIHVuYXZhaWxhYmxlCisJICovCisKKwlpbnQgbWJfdHlwZTsKKwlpbnQgbXZkWzJdW0JMT0NLX01VTFRJUExFXVtCTE9DS19NVUxUSVBMRV1bMl07CisJaW50IGNicCwgY2JwX2JsaywgY2JwMDE7CisJdW5zaWduZWQgbG9uZyBjYnBfYml0czsKKworCWludCBiOG1vZGVbNF07CisJaW50IGI4cGRpcls0XTsKKwlpbnQgbWJfdHlwZV8yOworCWludCBjX2lwcmVkX21vZGVfMjsKKwlpbnQgZGN0X21vZGU7CisKKwlpbnQgY19pcHJlZF9tb2RlOworCWludCBsZl9kaXNhYmxlOworCWludCBsZl9hbHBoYV9jMF9vZmZzZXQ7CisJaW50IGxmX2JldGFfb2Zmc2V0OworCisJaW50IENBQlRbNF07CisJaW50IENBQlBbNF07CisJaW50IGNicF80eDRbNF07CisKKwlpbnQgc2tpcF9mbGFnOworCisJc3RydWN0IG1hY3JvYmxvY2sgKm1iX2F2YWlsYWJsZV91cDsKKwlzdHJ1Y3QgbWFjcm9ibG9jayAqbWJfYXZhaWxhYmxlX2xlZnQ7CisJdW5zaWduZWQgaW50IG1iYWRkcl9hLCBtYmFkZHJfYiwgbWJhZGRyX2MsIG1iYWRkcl9kOworCXVuc2lnbmVkIGludCBtYmF2YWlsX2EsIG1iYXZhaWxfYiwgbWJhdmFpbF9jLCBtYmF2YWlsX2Q7CisKK307CisKK3N0cnVjdCBtYWNyb2Jsb2NrICptYl9kYXRhOworCitzdHJ1Y3QgaW1nX3BhciAqaW1nOworCitzdHJ1Y3QgYml0c3RyZWFtX3MgKmN1cnJfc3RyZWFtOworCitzdHJ1Y3QgZGF0YXBhcnRpdGlvbiAqYWxsb2NfcGFydGl0aW9uKGludCBuKTsKKwordW5zaWduZWQgaW50IHZsZF9tZW1fc3RhcnRfYWRkcjsKK3Vuc2lnbmVkIGludCB2bGRfbWVtX2VuZF9hZGRyOworCitpbnQgbWFya2VyX2JpdDsKKworaW50IHByb2dyZXNzaXZlX3NlcXVlbmNlOworaW50IGhvcml6b250YWxfc2l6ZTsKK2ludCB2ZXJ0aWNhbF9zaXplOworCitpbnQgc2Vjb25kX2lmaWVsZDsKK2ludCBwcmVfaW1nX3R5cGU7CisKKy8qIHNsaWNlX2hlYWRlcigpICovCitpbnQgc2xpY2VfdmVydGljYWxfcG9zaXRpb247CitpbnQgc2xpY2VfdmVydGljYWxfcG9zaXRpb25fZXh0ZW5zaW9uOworaW50IGZpeGVkX3BpY3R1cmVfcXA7CitpbnQgZml4ZWRfc2xpY2VfcXA7CitpbnQgc2xpY2VfcXA7CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246dWVfdiwgcmVhZHMgYW4gdSh2KSBzeW50YXggZWxlbWVudCwgdGhlIGxlbmd0aCBpbiBiaXRzIGlzIHN0b3JlZCBpbgorIHRoZSBnbG9iYWwgVXNlZEJpdHMgdmFyaWFibGUKKyAqIElucHV0OgorIHRyYWNlc3RyaW5nCisgdGhlIHN0cmluZyBmb3IgdGhlIHRyYWNlIGZpbGUKKyBiaXRzdHJlYW0KKyB0aGUgc3RyZWFtIHRvIGJlIHJlYWQgZnJvbQorICogT3V0cHV0OgorICogUmV0dXJuOiB0aGUgdmFsdWUgb2YgdGhlIGNvZGVkIHN5bnRheCBlbGVtZW50CisgKiBBdHRlbnRpb246CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisvKiEKKyAqICBkZWZpbml0aW9uIG9mIEFWUyBzeW50YXhlbGVtZW50cworICogIG9yZGVyIG9mIGVsZW1lbnRzIGZvbGxvdyBkZXBlbmRlbmNpZXMgZm9yIHBpY3R1cmUgcmVjb25zdHJ1Y3Rpb24KKyAqLworLyohCisgKiBcYnJpZWYgICBBc3NpZ25tZW50IG9mIG9sZCBUWVBFIHBhcnRpdGlvbiBlbGVtZW50cyB0byBuZXcKKyAqICAgICAgICAgIGVsZW1lbnRzCisgKgorICogIG9sZCBlbGVtZW50ICAgICB8IG5ldyBlbGVtZW50cworICogIFRZUEVfSEVBREVSICAgICB8IFNFX0hFQURFUiwgU0VfUFRZUEUKKyAqICBUWVBFX01CSEVBREVSICAgIHwgU0VfTUJUWVBFLCBTRV9SRUZGUkFNRSwgU0VfSU5UUkFQUkVETU9ERQorICogIFRZUEVfTVZEICAgICAgICB8IFNFX01WRAorICogIFRZUEVfQ0JQICAgICAgICB8IFNFX0NCUF9JTlRSQSwgU0VfQ0JQX0lOVEVSICogU0VfREVMVEFfUVVBTlRfSU5URVIKKyAqICBTRV9ERUxUQV9RVUFOVF9JTlRSQQorICogIFRZUEVfQ09FRkZfWSAgICB8IFNFX0xVTV9EQ19JTlRSQSwgU0VfTFVNX0FDX0lOVFJBLAorICAgIFNFX0xVTV9EQ19JTlRFUiwgU0VfTFVNX0FDX0lOVEVSCisgKiAgVFlQRV8yeDJEQyAgICAgIHwgU0VfQ0hSX0RDX0lOVFJBLCBTRV9DSFJfRENfSU5URVIKKyAqICBUWVBFX0NPRUZGX0MgICAgfCBTRV9DSFJfQUNfSU5UUkEsIFNFX0NIUl9BQ19JTlRFUgorICogIFRZUEVfRU9TICAgICAgICB8IFNFX0VPUworICovCisKKyNkZWZpbmUgU0VfSEVBREVSICAgICAgICAgICAwCisjZGVmaW5lIFNFX1BUWVBFICAgICAgICAgICAgMQorI2RlZmluZSBTRV9NQlRZUEUgICAgICAgICAgIDIKKyNkZWZpbmUgU0VfUkVGRlJBTUUgICAgICAgICAzCisjZGVmaW5lIFNFX0lOVFJBUFJFRE1PREUgICAgNAorI2RlZmluZSBTRV9NVkQgICAgICAgICAgICAgIDUKKyNkZWZpbmUgU0VfQ0JQX0lOVFJBICAgICAgICA2CisjZGVmaW5lIFNFX0xVTV9EQ19JTlRSQSAgICAgNworI2RlZmluZSBTRV9DSFJfRENfSU5UUkEgICAgIDgKKyNkZWZpbmUgU0VfTFVNX0FDX0lOVFJBICAgICA5CisjZGVmaW5lIFNFX0NIUl9BQ19JTlRSQSAgICAgMTAKKyNkZWZpbmUgU0VfQ0JQX0lOVEVSICAgICAgICAxMQorI2RlZmluZSBTRV9MVU1fRENfSU5URVIgICAgIDEyCisjZGVmaW5lIFNFX0NIUl9EQ19JTlRFUiAgICAgMTMKKyNkZWZpbmUgU0VfTFVNX0FDX0lOVEVSICAgICAxNAorI2RlZmluZSBTRV9DSFJfQUNfSU5URVIgICAgIDE1CisjZGVmaW5lIFNFX0RFTFRBX1FVQU5UX0lOVEVSICAgICAgMTYKKyNkZWZpbmUgU0VfREVMVEFfUVVBTlRfSU5UUkEgICAgICAxNworI2RlZmluZSBTRV9CRlJBTUUgICAgICAgICAgIDE4CisjZGVmaW5lIFNFX0VPUyAgICAgICAgICAgICAgMTkKKyNkZWZpbmUgU0VfTUFYX0VMRU1FTlRTICAgICAyMAorI2RlZmluZSBTRV9DQlAwMSAgICAgICAgICAgIDIxCitpbnQgY2hyb21hX2Zvcm1hdDsKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246UmVhZHMgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0gYnVmZmVyCisgKiBJbnB1dDoKKyBieXRlIGJ1ZmZlcltdCisgY29udGFpbmluZyBWTEMtY29kZWQgZGF0YSBiaXRzCisgaW50IHRvdGJpdG9mZnNldAorIGJpdCBvZmZzZXQgZnJvbSBzdGFydCBvZiBwYXJ0aXRpb24KKyBpbnQgYnl0ZWNvdW50CisgdG90YWwgYnl0ZXMgaW4gYml0c3RyZWFtCisgaW50IG51bWJpdHMKKyBudW1iZXIgb2YgYml0cyB0byByZWFkCisgKiBPdXRwdXQ6CisgKiBSZXR1cm46CisgKiBBdHRlbnRpb246CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK2ludCBnZXRfYml0cyh1bnNpZ25lZCBjaGFyIGJ1ZmZlcltdLCBpbnQgdG90Yml0b2Zmc2V0LCBpbnQgKmluZm8sIGludCBieXRlY291bnQsCisJCWludCBudW1iaXRzKQoreworCXJlZ2lzdGVyIGludCBpbmY7CisJbG9uZyBieXRlb2Zmc2V0OworCWludCBiaXRvZmZzZXQ7CisKKwlpbnQgYml0Y291bnRlciA9IG51bWJpdHM7CisKKwlieXRlb2Zmc2V0ID0gdG90Yml0b2Zmc2V0IC8gODsKKwliaXRvZmZzZXQgPSA3IC0gKHRvdGJpdG9mZnNldCAlIDgpOworCisJaW5mID0gMDsKKwl3aGlsZSAobnVtYml0cykgeworCQlpbmYgPDw9IDE7CisJCWluZiB8PSAoYnVmZmVyW2J5dGVvZmZzZXRdICYgKDB4MDEgPDwgYml0b2Zmc2V0KSkgPj4gYml0b2Zmc2V0OworCQludW1iaXRzLS07CisJCWJpdG9mZnNldC0tOworCQlpZiAoYml0b2Zmc2V0IDwgMCkgeworCQkJYnl0ZW9mZnNldCsrOworCQkJYml0b2Zmc2V0ICs9IDg7CisJCQlpZiAoYnl0ZW9mZnNldCA+IGJ5dGVjb3VudCkKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwkqaW5mbyA9IGluZjsKKworCisJcmV0dXJuIGJpdGNvdW50ZXI7Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246cmVhZCBGTEMgY29kZXdvcmQgZnJvbSBVVkxDLXBhcnRpdGlvbgorICogSW5wdXQ6CisgKiBPdXRwdXQ6CisgKiBSZXR1cm46CisgKiBBdHRlbnRpb246CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK2ludCByZWFkX3N5bnRheGVsZW1lbnRfZmxjKHN0cnVjdCBzeW50YXhlbGVtZW50ICpzeW0pCit7CisJaW50IGZyYW1lX2JpdG9mZnNldCA9IGN1cnJfc3RyZWFtLT5mcmFtZV9iaXRvZmZzZXQ7CisJdW5zaWduZWQgY2hhciAqYnVmID0gY3Vycl9zdHJlYW0tPnN0cmVhbV9idWZmZXI7CisJaW50IGJpdHN0cmVhbWxlbmd0aGluYnl0ZXMgPSBjdXJyX3N0cmVhbS0+Yml0c3RyZWFtX2xlbmd0aDsKKworCWlmICgoZ2V0X2JpdHMoYnVmLCBmcmFtZV9iaXRvZmZzZXQsICYoc3ltLT5pbmYpLCBiaXRzdHJlYW1sZW5ndGhpbmJ5dGVzLAorCQkJc3ltLT5sZW4pKSA8IDApCisJCXJldHVybiAtMTsKKworCWN1cnJfc3RyZWFtLT5mcmFtZV9iaXRvZmZzZXQgKz0gc3ltLT5sZW47CisJc3ltLT52YWx1ZTEgPSBzeW0tPmluZjsKKworI2lmIFRSQUNFCisJdHJhY2ViaXRzMihzeW0tPnRyYWNlc3RyaW5nLCBzeW0tPmxlbiwgc3ltLT5pbmYpOworI2VuZGlmCisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjp1ZV92LCByZWFkcyBhbiB1KDEpIHN5bnRheCBlbGVtZW50LCB0aGUgbGVuZ3RoIGluIGJpdHMgaXMgc3RvcmVkIGluCisgdGhlIGdsb2JhbCBVc2VkQml0cyB2YXJpYWJsZQorICogSW5wdXQ6CisgdHJhY2VzdHJpbmcKKyB0aGUgc3RyaW5nIGZvciB0aGUgdHJhY2UgZmlsZQorIGJpdHN0cmVhbQorIHRoZSBzdHJlYW0gdG8gYmUgcmVhZCBmcm9tCisgKiBPdXRwdXQ6CisgKiBSZXR1cm46IHRoZSB2YWx1ZSBvZiB0aGUgY29kZWQgc3ludGF4IGVsZW1lbnQKKyAqIEF0dGVudGlvbjoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2ludCB1XzEoY2hhciAqdHJhY2VzdHJpbmcpCit7CisJcmV0dXJuIHVfdigxLCB0cmFjZXN0cmluZyk7Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246bWFwcGluZyBydWxlIGZvciB1ZSh2KSBzeW50YXggZWxlbWVudHMKKyAqIElucHV0Omxlbmd0aCBhbmQgaW5mbworICogT3V0cHV0Om51bWJlciBpbiB0aGUgY29kZSB0YWJsZQorICogUmV0dXJuOgorICogQXR0ZW50aW9uOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLwordm9pZCBsaW5mb191ZShpbnQgbGVuLCBpbnQgaW5mbywgaW50ICp2YWx1ZTEsIGludCAqZHVtbXkpCit7CisJKnZhbHVlMSA9IChpbnQpcG93MigyLCAobGVuIC8gMikpICsgaW5mbyAtIDE7Cit9CisKK2ludCB1X3YoaW50IGxlbmluYml0cywgY2hhciAqdHJhY2VzdHJpbmcpCit7CisJc3RydWN0IHN5bnRheGVsZW1lbnQgc3ltYm9sLCAqc3ltID0gJnN5bWJvbDsKKworI2lmZGVmIEFWU1BfTE9OR19DQUJBQworI2Vsc2UKKwlhc3NlcnQoY3Vycl9zdHJlYW0tPnN0cmVhbV9idWZmZXIgIT0gTlVMTCk7CisjZW5kaWYKKwlzeW0tPnR5cGUgPSBTRV9IRUFERVI7CisJc3ltLT5tYXBwaW5nID0gbGluZm9fdWU7CisJc3ltLT5sZW4gPSBsZW5pbmJpdHM7CisJcmVhZF9zeW50YXhlbGVtZW50X2ZsYyhzeW0pOworCisJcmV0dXJuIHN5bS0+aW5mOworfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOm1hcHBpbmcgcnVsZSBmb3Igc2Uodikgc3ludGF4IGVsZW1lbnRzCisgKiBJbnB1dDpsZW5ndGggYW5kIGluZm8KKyAqIE91dHB1dDpzaWduZWQgbXZkCisgKiBSZXR1cm46CisgKiBBdHRlbnRpb246CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK3ZvaWQgbGluZm9fc2UoaW50IGxlbiwgaW50IGluZm8sIGludCAqdmFsdWUxLCBpbnQgKmR1bW15KQoreworCWludCBuOworCisJbiA9IChpbnQpcG93MigyLCAobGVuIC8gMikpICsgaW5mbyAtIDE7CisJKnZhbHVlMSA9IChuICsgMSkgLyAyOworCWlmICgobiAmIDB4MDEpID09IDApCisJCSp2YWx1ZTEgPSAtKnZhbHVlMTsKKworfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOmxlbmd0aCBhbmQgaW5mbworICogSW5wdXQ6CisgKiBPdXRwdXQ6Y2JwIChpbnRyYSkKKyAqIFJldHVybjoKKyAqIEF0dGVudGlvbjoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKwordm9pZCBsaW5mb19jYnBfaW50cmEoaW50IGxlbiwgaW50IGluZm8sIGludCAqY2JwLCBpbnQgKmR1bW15KQoreworfQorCitjb25zdCBpbnQgTkNCUFs2NF1bMl0gPSB7ezQsIDB9LCB7MTYsIDE5fSwgezE3LCAxNn0sIHsxOSwgMTV9LCB7MTQsIDE4fSwKKwkJezksIDExfSwgezIyLCAzMX0sIHs4LCAxM30sIHsxMSwgMTd9LCB7MjEsIDMwfSwgezEwLCAxMn0sCisJCXs3LCA5fSwgezEyLCAxMH0sIHs2LCA3fSwgezUsIDh9LCB7MSwgMX0sIHszNSwgNH0sIHs0NywgNDJ9LCB7CisJCQkJNDgsIDM4fSwgezM4LCAyN30sIHs0NiwgMzl9LCB7MzYsIDMzfSwgezUwLCA1OX0sCisJCXsyNiwgMjZ9LCB7NDUsIDQwfSwgezUyLCA1OH0sIHs0MSwgMzV9LCB7MjgsIDI1fSwgezM3LCAyOX0sIHsyMywKKwkJCQkyNH0sIHszMSwgMjh9LCB7MiwgM30sIHs0MywgNX0sIHs1MSwgNTF9LCB7NTYsCisJCQkJNTJ9LCB7MzksIDM3fSwgezU1LCA1MH0sIHszMywgNDN9LCB7NjIsIDYzfSwgeworCQkJCTI3LCA0NH0sIHs1NCwgNTN9LCB7NjAsIDYyfSwgezQwLCA0OH0sIHszMiwgNDd9LAorCQl7NDIsIDM0fSwgezI0LCA0NX0sIHsyOSwgNDl9LCB7MywgNn0sIHs0OSwgMTR9LCB7NTMsIDU1fSwgezU3LAorCQkJCTU2fSwgezI1LCAzNn0sIHs1OCwgNTR9LCB7MzAsIDQxfSwgezU5LCA2MH0sIHsKKwkJCQkxNSwgMjF9LCB7NjEsIDU3fSwgezYzLCA2MX0sIHs0NCwgNDZ9LCB7MTgsIDIyfSwKKwkJezM0LCAzMn0sIHsxMywgMjB9LCB7MjAsIDIzfSwgezAsIDJ9IH07CisKK3Vuc2lnbmVkIGludCBzMSwgdDEsIHZhbHVlX3MsIHZhbHVlX3Q7Cit1bnNpZ25lZCBjaGFyIGRlY19ieXBhc3MsIGRlY19maW5hbDsKKworI2RlZmluZSBnZXRfYnl0ZSgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlkYnVmZmVyID0gZGNvZGVzdHJtWygqZGNvZGVzdHJtX2xlbikrK107XAorCWRiaXRzX3RvX2dvID0gNzsgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgZGJ1ZmZlciAgICAgICAgIChkZXAtPmRidWZmZXIpCisjZGVmaW5lIGRiaXRzX3RvX2dvICAgICAoZGVwLT5kYml0c190b19nbykKKyNkZWZpbmUgZGNvZGVzdHJtICAgICAgIChkZXAtPmRjb2Rlc3RybSkKKyNkZWZpbmUgZGNvZGVzdHJtX2xlbiAgIChkZXAtPmRjb2Rlc3RybV9sZW4pCisKKyNkZWZpbmUgQl9CSVRTCTEwCisKKyNkZWZpbmUgTEdfUE1QU19TSElGVE5PIDIKKworI2RlZmluZSBIQUxGICAgICAgKDEgPDwgKEJfQklUUy0xKSkKKyNkZWZpbmUgUVVBUlRFUiAgICgxIDw8IChCX0JJVFMtMikpCisKK3Vuc2lnbmVkIGludCBiaWFyaV9kZWNvZGVfc3ltYm9sKHN0cnVjdCBkZWNvZGluZ19lbnZpcm9ubWVudF9zICpkZXAsCisJCXN0cnVjdCBiaV9jb250ZXh0X3R5cGVfcyAqYmlfY3QpCit7CisJcmVnaXN0ZXIgdW5zaWduZWQgY2hhciBiaXQ7CisJcmVnaXN0ZXIgdW5zaWduZWQgY2hhciBzX2ZsYWc7CisJcmVnaXN0ZXIgdW5zaWduZWQgY2hhciBpc19scHMgPSAwOworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgY3dyOworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgY3ljbm8gPSBiaV9jdC0+Y3ljbm87CisJcmVnaXN0ZXIgdW5zaWduZWQgaW50IGxnX3BtcHMgPSBiaV9jdC0+TEdfUE1QUzsKKwlyZWdpc3RlciB1bnNpZ25lZCBpbnQgdF9ybHBzOworCXJlZ2lzdGVyIHVuc2lnbmVkIGludCBzMiwgdDI7CisKKyNpZmRlZiBEVU1QX0RFQlVHCisJaWYgKGF2c19nZXRfZGVidWdfZmxhZygpICYgQUVDX0RVTVApCisJCWlvX3ByaW50ZigiTEdfUE1QUyA6ICUwM1gsIE1QUyA6ICVkLCBjeWNubyA6ICVkIC0tICVwXG4iLAorCQkJYmlfY3QtPkxHX1BNUFMsIGJpX2N0LT5NUFMsIGJpX2N0LT5jeWNubywgYmlfY3QpOworI2VuZGlmCisKKwliaXQgPSBiaV9jdC0+TVBTOworCisJY3dyID0gKGN5Y25vIDw9IDEpID8gMyA6IChjeWNubyA9PSAyKSA/IDQgOiA1OworCisJaWYgKHQxID49IChsZ19wbXBzID4+IExHX1BNUFNfU0hJRlROTykpIHsKKwkJczIgPSBzMTsKKwkJdDIgPSB0MSAtIChsZ19wbXBzID4+IExHX1BNUFNfU0hJRlROTyk7CisJCXNfZmxhZyA9IDA7CisJfSBlbHNlIHsKKwkJczIgPSBzMSArIDE7CisJCXQyID0gMjU2ICsgdDEgLSAobGdfcG1wcyA+PiBMR19QTVBTX1NISUZUTk8pOworCQlzX2ZsYWcgPSAxOworCX0KKworI2lmZGVmIERVTVBfREVCVUcKKwlpZiAoYXZzX2dldF9kZWJ1Z19mbGFnKCkgJiBBRUNfRFVNUCkKKwkJaW9fcHJpbnRmKCIgczIgOiAlZCwgdDIgOiAlMDNYXG4iLCBzMiwgdDIpOworI2VuZGlmCisKKwlpZiAoczIgPiB2YWx1ZV9zIHx8IChzMiA9PSB2YWx1ZV9zICYmIHZhbHVlX3QgPj0gdDIpKSB7CisJCWlzX2xwcyA9IDE7CisJCWJpdCA9ICFiaXQ7CisKKwkJdF9ybHBzID0gKHNfZmxhZyA9PSAwKSA/CisJCQkJKGxnX3BtcHMgPj4gTEdfUE1QU19TSElGVE5PKSA6CisJCQkJKHQxICsgKGxnX3BtcHMgPj4gTEdfUE1QU19TSElGVE5PKSk7CisKKwkJaWYgKHMyID09IHZhbHVlX3MpCisJCQl2YWx1ZV90ID0gKHZhbHVlX3QgLSB0Mik7CisJCWVsc2UgeworCQkJaWYgKC0tZGJpdHNfdG9fZ28gPCAwKQorCQkJCWdldF9ieXRlKCk7CisKKwkJCXZhbHVlX3QgPSAodmFsdWVfdCA8PCAxKQorCQkJCQl8ICgoZGJ1ZmZlciA+PiBkYml0c190b19nbykgJiAweDAxKTsKKwkJCXZhbHVlX3QgPSAyNTYgKyB2YWx1ZV90IC0gdDI7CisKKwkJfQorCisJCXdoaWxlICh0X3JscHMgPCBRVUFSVEVSKSB7CisJCQl0X3JscHMgPSB0X3JscHMgPDwgMTsKKwkJCWlmICgtLWRiaXRzX3RvX2dvIDwgMCkKKwkJCQlnZXRfYnl0ZSgpOworCisJCQl2YWx1ZV90ID0gKHZhbHVlX3QgPDwgMSkKKwkJCQkJfCAoKGRidWZmZXIgPj4gZGJpdHNfdG9fZ28pICYgMHgwMSk7CisJCX0KKworCQlzMSA9IDA7CisJCXQxID0gdF9ybHBzICYgMHhmZjsKKworCQl2YWx1ZV9zID0gMDsKKwkJd2hpbGUgKHZhbHVlX3QgPCBRVUFSVEVSKSB7CisJCQlpbnQgajsKKworCQkJaWYgKC0tZGJpdHNfdG9fZ28gPCAwKQorCQkJCWdldF9ieXRlKCk7CisJCQlqID0gKGRidWZmZXIgPj4gZGJpdHNfdG9fZ28pICYgMHgwMTsKKworCQkJdmFsdWVfdCA9ICh2YWx1ZV90IDw8IDEpIHwgajsKKwkJCXZhbHVlX3MrKzsKKwkJfQorCQl2YWx1ZV90ID0gdmFsdWVfdCAmIDB4ZmY7CisJfSBlbHNlIHsKKworCQlzMSA9IHMyOworCQl0MSA9IHQyOworCX0KKworCWlmIChkZWNfYnlwYXNzKQorCQlyZXR1cm4gYml0OworCisJaWYgKGlzX2xwcykKKwkJY3ljbm8gPSAoY3ljbm8gPD0gMikgPyAoY3ljbm8gKyAxKSA6IDM7CisJZWxzZSBpZiAoY3ljbm8gPT0gMCkKKwkJY3ljbm8gPSAxOworCWJpX2N0LT5jeWNubyA9IGN5Y25vOworCisJaWYgKGlzX2xwcykgeworCQlzd2l0Y2ggKGN3cikgeworCQljYXNlIDM6CisJCQlsZ19wbXBzID0gbGdfcG1wcyArIDE5NzsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlsZ19wbXBzID0gbGdfcG1wcyArIDk1OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlsZ19wbXBzID0gbGdfcG1wcyArIDQ2OworCQl9CisKKwkJaWYgKGxnX3BtcHMgPj0gKDI1NiA8PCBMR19QTVBTX1NISUZUTk8pKSB7CisJCQlsZ19wbXBzID0gKDUxMiA8PCBMR19QTVBTX1NISUZUTk8pIC0gMSAtIGxnX3BtcHM7CisJCQliaV9jdC0+TVBTID0gIShiaV9jdC0+TVBTKTsKKwkJfQorCX0gZWxzZSB7CisjaWZkZWYgRFVNUF9ERUJVRworCQlpZiAoYXZzX2dldF9kZWJ1Z19mbGFnKCkgJiBBRUNfRFVNUCkKKwkJCWlvX3ByaW50ZigiIC0gbGdfcG1wc19NUFMgOiAlWCAoJVggLSAlWCAtICVYKVxuIiwKKwkJCQkJbGdfcG1wcyAtICh1bnNpZ25lZCBpbnQpKGxnX3BtcHM+PmN3cikKKwkJCQkJLSAodW5zaWduZWQgaW50KShsZ19wbXBzPj4oY3dyKzIpKSwKKwkJCQkJbGdfcG1wcywKKwkJCQkJKHVuc2lnbmVkIGludCkobGdfcG1wcz4+Y3dyKSwKKwkJCQkJKHVuc2lnbmVkIGludCkobGdfcG1wcz4+KGN3cisyKSkKKwkJCSk7CisjZW5kaWYKKwkJbGdfcG1wcyA9IGxnX3BtcHMgLSAodW5zaWduZWQgaW50KShsZ19wbXBzID4+IGN3cikKKwkJCQktICh1bnNpZ25lZCBpbnQpKGxnX3BtcHMgPj4gKGN3ciArIDIpKTsKKwl9CisKKwliaV9jdC0+TEdfUE1QUyA9IGxnX3BtcHM7CisKKwlyZXR1cm4gYml0OworfQorCit1bnNpZ25lZCBpbnQgYmlhcmlfZGVjb2RlX3N5bWJvbHcoc3RydWN0IGRlY29kaW5nX2Vudmlyb25tZW50X3MgKmRlcCwKKwkJc3RydWN0IGJpX2NvbnRleHRfdHlwZV9zICpiaV9jdDEsCisJCXN0cnVjdCBiaV9jb250ZXh0X3R5cGVfcyAqYmlfY3QyKQoreworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgYml0MSwgYml0MjsKKwlyZWdpc3RlciB1bnNpZ25lZCBjaGFyIHByZWRfbXBzLCBiaXQ7CisJcmVnaXN0ZXIgdW5zaWduZWQgaW50IGxnX3BtcHM7CisJcmVnaXN0ZXIgdW5zaWduZWQgY2hhciBjd3IxLCBjeWNubzEgPSBiaV9jdDEtPmN5Y25vOworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgY3dyMiwgY3ljbm8yID0gYmlfY3QyLT5jeWNubzsKKwlyZWdpc3RlciB1bnNpZ25lZCBpbnQgbGdfcG1wczEgPSBiaV9jdDEtPkxHX1BNUFM7CisJcmVnaXN0ZXIgdW5zaWduZWQgaW50IGxnX3BtcHMyID0KKwkJCWJpX2N0Mi0+TEdfUE1QUzsKKwlyZWdpc3RlciB1bnNpZ25lZCBpbnQgdF9ybHBzOworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgc19mbGFnLCBpc19scHMgPSAwOworCXJlZ2lzdGVyIHVuc2lnbmVkIGludCBzMiwgdDI7CisKKworCWJpdDEgPSBiaV9jdDEtPk1QUzsKKwliaXQyID0gYmlfY3QyLT5NUFM7CisKKwljd3IxID0gKGN5Y25vMSA8PSAxKSA/IDMgOiAoY3ljbm8xID09IDIpID8gNCA6IDU7CisJY3dyMiA9IChjeWNubzIgPD0gMSkgPyAzIDogKGN5Y25vMiA9PSAyKSA/IDQgOiA1OworCisJaWYgKGJpdDEgPT0gYml0MikgeworCQlwcmVkX21wcyA9IGJpdDE7CisJCWxnX3BtcHMgPSAobGdfcG1wczEgKyBsZ19wbXBzMikgLyAyOworCX0gZWxzZSB7CisJCWlmIChsZ19wbXBzMSA8IGxnX3BtcHMyKSB7CisJCQlwcmVkX21wcyA9IGJpdDE7CisJCQlsZ19wbXBzID0gKDI1NiA8PCBMR19QTVBTX1NISUZUTk8pIC0gMQorCQkJCQktICgobGdfcG1wczIgLSBsZ19wbXBzMSkgPj4gMSk7CisJCX0gZWxzZSB7CisJCQlwcmVkX21wcyA9IGJpdDI7CisJCQlsZ19wbXBzID0gKDI1NiA8PCBMR19QTVBTX1NISUZUTk8pIC0gMQorCQkJCQktICgobGdfcG1wczEgLSBsZ19wbXBzMikgPj4gMSk7CisJCX0KKwl9CisKKyNpZmRlZiBEVU1QX0RFQlVHCisJaWYgKGF2c19nZXRfZGVidWdfZmxhZygpICYgQUVDX0RVTVApCisJCWlvX3ByaW50ZigiIC0gQmVnaW4gLSBMR19QTVBTIDogJTAzWCwgTVBTIDogJWRcbiIsCisJCQlsZ19wbXBzLCBwcmVkX21wcyk7CisjZW5kaWYKKwlpZiAodDEgPj0gKGxnX3BtcHMgPj4gTEdfUE1QU19TSElGVE5PKSkgeworCQlzMiA9IHMxOworCQl0MiA9IHQxIC0gKGxnX3BtcHMgPj4gTEdfUE1QU19TSElGVE5PKTsKKwkJc19mbGFnID0gMDsKKwl9IGVsc2UgeworCQlzMiA9IHMxICsgMTsKKwkJdDIgPSAyNTYgKyB0MSAtIChsZ19wbXBzID4+IExHX1BNUFNfU0hJRlROTyk7CisJCXNfZmxhZyA9IDE7CisJfQorCisJYml0ID0gcHJlZF9tcHM7CisJaWYgKHMyID4gdmFsdWVfcyB8fCAoczIgPT0gdmFsdWVfcyAmJiB2YWx1ZV90ID49IHQyKSkgeworCQlpc19scHMgPSAxOworCQliaXQgPSAhYml0OworCQl0X3JscHMgPSAoc19mbGFnID09IDApID8KKwkJCQkobGdfcG1wcyA+PiBMR19QTVBTX1NISUZUTk8pIDoKKwkJCQkodDEgKyAobGdfcG1wcyA+PiBMR19QTVBTX1NISUZUTk8pKTsKKworCQlpZiAoczIgPT0gdmFsdWVfcykKKwkJCXZhbHVlX3QgPSAodmFsdWVfdCAtIHQyKTsKKwkJZWxzZSB7CisJCQlpZiAoLS1kYml0c190b19nbyA8IDApCisJCQkJZ2V0X2J5dGUoKTsKKworCQkJdmFsdWVfdCA9ICh2YWx1ZV90IDw8IDEpCisJCQkJCXwgKChkYnVmZmVyID4+IGRiaXRzX3RvX2dvKSAmIDB4MDEpOworCQkJdmFsdWVfdCA9IDI1NiArIHZhbHVlX3QgLSB0MjsKKwkJfQorCisJCXdoaWxlICh0X3JscHMgPCBRVUFSVEVSKSB7CisJCQl0X3JscHMgPSB0X3JscHMgPDwgMTsKKwkJCWlmICgtLWRiaXRzX3RvX2dvIDwgMCkKKwkJCQlnZXRfYnl0ZSgpOworCisJCQl2YWx1ZV90ID0gKHZhbHVlX3QgPDwgMSkKKwkJCQkJfCAoKGRidWZmZXIgPj4gZGJpdHNfdG9fZ28pICYgMHgwMSk7CisJCX0KKwkJczEgPSAwOworCQl0MSA9IHRfcmxwcyAmIDB4ZmY7CisKKwkJdmFsdWVfcyA9IDA7CisJCXdoaWxlICh2YWx1ZV90IDwgUVVBUlRFUikgeworCQkJaW50IGo7CisKKwkJCWlmICgtLWRiaXRzX3RvX2dvIDwgMCkKKwkJCQlnZXRfYnl0ZSgpOworCQkJaiA9IChkYnVmZmVyID4+IGRiaXRzX3RvX2dvKSAmIDB4MDE7CisKKwkJCXZhbHVlX3QgPSAodmFsdWVfdCA8PCAxKSB8IGo7CisJCQl2YWx1ZV9zKys7CisJCX0KKwkJdmFsdWVfdCA9IHZhbHVlX3QgJiAweGZmOworCX0gZWxzZSB7CisJCXMxID0gczI7CisJCXQxID0gdDI7CisJfQorCisJaWYgKGJpdCAhPSBiaXQxKSB7CisJCWN5Y25vMSA9IChjeWNubzEgPD0gMikgPyAoY3ljbm8xICsgMSkgOiAzOworCX0gZWxzZSB7CisJCWlmIChjeWNubzEgPT0gMCkKKwkJCWN5Y25vMSA9IDE7CisJfQorCisJaWYgKGJpdCAhPSBiaXQyKSB7CisJCWN5Y25vMiA9IChjeWNubzIgPD0gMikgPyAoY3ljbm8yICsgMSkgOiAzOworCX0gZWxzZSB7CisJCWlmIChjeWNubzIgPT0gMCkKKwkJCWN5Y25vMiA9IDE7CisJfQorCWJpX2N0MS0+Y3ljbm8gPSBjeWNubzE7CisJYmlfY3QyLT5jeWNubyA9IGN5Y25vMjsKKworCXsKKworCQlpZiAoYml0ID09IGJpdDEpIHsKKwkJCWxnX3BtcHMxID0KKwkJCQkJbGdfcG1wczEKKwkJCQktICh1bnNpZ25lZCBpbnQpKGxnX3BtcHMxCisJCQkJCT4+IGN3cjEpCisJCQkJLSAodW5zaWduZWQgaW50KShsZ19wbXBzMQorCQkJCQk+PiAoY3dyMQorCQkJCQkrIDIpKTsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAoY3dyMSkgeworCQkJY2FzZSAzOgorCQkJCWxnX3BtcHMxID0gbGdfcG1wczEgKyAxOTc7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJbGdfcG1wczEgPSBsZ19wbXBzMSArIDk1OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlsZ19wbXBzMSA9IGxnX3BtcHMxICsgNDY7CisJCQl9CisKKwkJCWlmIChsZ19wbXBzMSA+PSAoMjU2IDw8IExHX1BNUFNfU0hJRlROTykpIHsKKwkJCQlsZ19wbXBzMSA9ICg1MTIgPDwgTEdfUE1QU19TSElGVE5PKSAtIDEKKwkJCQkJCS0gbGdfcG1wczE7CisJCQkJYmlfY3QxLT5NUFMgPSAhKGJpX2N0MS0+TVBTKTsKKwkJCX0KKwkJfQorCQliaV9jdDEtPkxHX1BNUFMgPSBsZ19wbXBzMTsKKworCQlpZiAoYml0ID09IGJpdDIpIHsKKwkJCWxnX3BtcHMyID0KKwkJCQkJbGdfcG1wczIKKwkJCQktICh1bnNpZ25lZCBpbnQpKGxnX3BtcHMyCisJCQkJPj4gY3dyMikKKwkJCQktICh1bnNpZ25lZCBpbnQpKGxnX3BtcHMyCisJCQkJPj4gKGN3cjIKKwkJCQkrIDIpKTsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAoY3dyMikgeworCQkJY2FzZSAzOgorCQkJCWxnX3BtcHMyID0gbGdfcG1wczIgKyAxOTc7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJbGdfcG1wczIgPSBsZ19wbXBzMiArIDk1OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlsZ19wbXBzMiA9IGxnX3BtcHMyICsgNDY7CisJCQl9CisKKwkJCWlmIChsZ19wbXBzMiA+PSAoMjU2IDw8IExHX1BNUFNfU0hJRlROTykpIHsKKwkJCQlsZ19wbXBzMiA9ICg1MTIgPDwgTEdfUE1QU19TSElGVE5PKSAtIDEKKwkJCQkJCS0gbGdfcG1wczI7CisJCQkJYmlfY3QyLT5NUFMgPSAhKGJpX2N0Mi0+TVBTKTsKKwkJCX0KKwkJfQorCQliaV9jdDItPkxHX1BNUFMgPSBsZ19wbXBzMjsKKwl9CisKKworCXJldHVybiBiaXQ7Cit9CisKKy8qIQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogXGJyaWVmCisgKiAgICBiaWFyaV9kZWNvZGVfc3ltYm9sX2VxX3Byb2IoKToKKyAqIFxyZXR1cm4KKyAqICAgIHRoZSBkZWNvZGVkIHN5bWJvbAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCit1bnNpZ25lZCBpbnQgYmlhcmlfZGVjb2RlX3N5bWJvbF9lcV9wcm9iKHN0cnVjdCBkZWNvZGluZ19lbnZpcm9ubWVudF9zICpkZXApCit7CisJdW5zaWduZWQgY2hhciBiaXQ7CisJc3RydWN0IGJpX2NvbnRleHRfdHlwZV9zIG9jdHg7CisJc3RydWN0IGJpX2NvbnRleHRfdHlwZV9zICpjdHggPSAmb2N0eDsKKworCWN0eC0+TEdfUE1QUyA9IChRVUFSVEVSIDw8IExHX1BNUFNfU0hJRlROTykgLSAxOworCWN0eC0+TVBTID0gMDsKKwljdHgtPmN5Y25vID0gMHhmZTsKKwlkZWNfYnlwYXNzID0gMTsKKwliaXQgPSBiaWFyaV9kZWNvZGVfc3ltYm9sKGRlcCwgY3R4KTsKKwlkZWNfYnlwYXNzID0gMDsKKwlyZXR1cm4gYml0OworfQorCit1bnNpZ25lZCBpbnQgYmlhcmlfZGVjb2RlX2ZpbmFsKHN0cnVjdCBkZWNvZGluZ19lbnZpcm9ubWVudF9zICpkZXApCit7CisJdW5zaWduZWQgY2hhciBiaXQ7CisJc3RydWN0IGJpX2NvbnRleHRfdHlwZV9zIG9jdHg7CisJc3RydWN0IGJpX2NvbnRleHRfdHlwZV9zICpjdHggPSAmb2N0eDsKKworCWN0eC0+TEdfUE1QUyA9IDEgPDwgTEdfUE1QU19TSElGVE5POworCWN0eC0+TVBTID0gMDsKKwljdHgtPmN5Y25vID0gMHhmZjsKKwlkZWNfZmluYWwgPSAxOworCWJpdCA9IGJpYXJpX2RlY29kZV9zeW1ib2woZGVwLCBjdHgpOworCWRlY19maW5hbCA9IDA7CisJcmV0dXJuIGJpdDsKK30KKworaW50IGlfOChjaGFyICp0cmFjZXN0cmluZykKK3sKKwlpbnQgZnJhbWVfYml0b2Zmc2V0ID0gY3Vycl9zdHJlYW0tPmZyYW1lX2JpdG9mZnNldDsKKwl1bnNpZ25lZCBjaGFyICpidWYgPSBjdXJyX3N0cmVhbS0+c3RyZWFtX2J1ZmZlcjsKKwlpbnQgYml0c3RyZWFtbGVuZ3RoaW5ieXRlcyA9IGN1cnJfc3RyZWFtLT5iaXRzdHJlYW1fbGVuZ3RoOworCXN0cnVjdCBzeW50YXhlbGVtZW50IHN5bWJvbCwgKnN5bSA9ICZzeW1ib2w7CisjaWZkZWYgQVZTUF9MT05HX0NBQkFDCisjZWxzZQorCWFzc2VydChjdXJyX3N0cmVhbS0+c3RyZWFtX2J1ZmZlciAhPSBOVUxMKTsKKyNlbmRpZgorCisJc3ltLT5sZW4gPSA4OworCXN5bS0+dHlwZSA9IFNFX0hFQURFUjsKKwlzeW0tPm1hcHBpbmcgPSBsaW5mb191ZTsKKworCWlmICgoZ2V0X2JpdHMoYnVmLCBmcmFtZV9iaXRvZmZzZXQsICYoc3ltLT5pbmYpLCBiaXRzdHJlYW1sZW5ndGhpbmJ5dGVzLAorCQkJc3ltLT5sZW4pKSA8IDApCisJCXJldHVybiAtMTsKKwljdXJyX3N0cmVhbS0+ZnJhbWVfYml0b2Zmc2V0ICs9IHN5bS0+bGVuOworCXN5bS0+dmFsdWUxID0gc3ltLT5pbmY7CisJaWYgKHN5bS0+aW5mICYgMHg4MCkKKwkJc3ltLT5pbmYgPSAtKH4oKGludCkweGZmZmZmZjAwIHwgc3ltLT5pbmYpICsgMSk7CisjaWYgVFJBQ0UKKwl0cmFjZWJpdHMyKHN5bS0+dHJhY2VzdHJpbmcsIHN5bS0+bGVuLCBzeW0tPmluZik7CisjZW5kaWYKKwlyZXR1cm4gc3ltLT5pbmY7Cit9CisKKy8qIQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogXGJyaWVmCisgKiAgICBhcmlkZWNvX2JpdHNfcmVhZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitpbnQgYXJpZGVjb19iaXRzX3JlYWQoc3RydWN0IGRlY29kaW5nX2Vudmlyb25tZW50X3MgKmRlcCkKK3sKKworCXJldHVybiA4ICogKCgqZGNvZGVzdHJtX2xlbikgLSAxKSArICg4IC0gZGJpdHNfdG9fZ28pOworfQorCisvKiEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFxicmllZgorICogICAgYXJpdGhtZXRpYyBkZWNvZGluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitpbnQgcmVhZF9zeW50YXhlbGVtZW50X2FlYyhzdHJ1Y3Qgc3ludGF4ZWxlbWVudCAqc2UsIHN0cnVjdCBpbWdfcGFyICppbWcsCisJCXN0cnVjdCBkYXRhcGFydGl0aW9uICp0aGlzX2RhdGFfcGFydCkKK3sKKwlpbnQgY3Vycl9sZW47CisJc3RydWN0IGRlY29kaW5nX2Vudmlyb25tZW50X3MgKmRlcF9kcCA9ICYodGhpc19kYXRhX3BhcnQtPmRlX2FlYyk7CisKKwljdXJyX2xlbiA9IGFyaWRlY29fYml0c19yZWFkKGRlcF9kcCk7CisKKwlzZS0+cmVhZGluZyhzZSwgaW1nLCBkZXBfZHApOworCisJc2UtPmxlbiA9IChhcmlkZWNvX2JpdHNfcmVhZChkZXBfZHApIC0gY3Vycl9sZW4pOworCXJldHVybiBzZS0+bGVuOworfQorCisvKiEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFxicmllZgorICogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFyaXRobWV0aWNhbGx5IGRlY29kZSB0aGUKKyAqICAgIHJ1biBsZW5ndGggaW5mbyBvZiB0aGUgc2tpcCBtYgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCit2b2lkIHJlYWRydW5sZW5naHRmcm9tYnVmZmVyX2FlYyhzdHJ1Y3Qgc3ludGF4ZWxlbWVudCAqc2UsIHN0cnVjdCBpbWdfcGFyICppbWcsCisJCXN0cnVjdCBkZWNvZGluZ19lbnZpcm9ubWVudF9zICpkZXBfZHApCit7CisJc3RydWN0IGJpX2NvbnRleHRfdHlwZV9zICpwY3R4OworCWludCBjdHgsIHN5bWJvbDsKKworCXBjdHggPSBpbWctPmN1cnJlbnRfc2xpY2UtPnRleF9jdHgtPm9uZV9jb250ZXh0c1swXTsKKwlzeW1ib2wgPSAwOworCWN0eCA9IDA7CisJd2hpbGUgKGJpYXJpX2RlY29kZV9zeW1ib2woZGVwX2RwLCBwY3R4ICsgY3R4KSA9PSAwKSB7CisJCXN5bWJvbCArPSAxOworCQljdHgrKzsKKwkJaWYgKGN0eCA+PSAzKQorCQkJY3R4ID0gMzsKKwl9CisJc2UtPnZhbHVlMSA9IHN5bWJvbDsKKyNpZiBUUkFDRQorCWZwcmludGYocF90cmFjZSwgIkAlZCVzXHRcdFx0JWRcbiIsCisJCXN5bWJvbF9jb3VudCsrLCBzZS0+dHJhY2VzdHJpbmcsIHNlLT52YWx1ZTEpOworCWZmbHVzaChwX3RyYWNlKTsKKyNlbmRpZgorfQorCisvKiEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFxicmllZgorICogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFyaXRobWV0aWNhbGx5IGRlY29kZSBhIHBhaXIgb2YKKyAqICAgIGludHJhIHByZWRpY3Rpb24gbW9kZXMgb2YgYSBnaXZlbiBNQi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworaW50IG1hcGRfaW50cmFwWzVdID0gezAsIDIsIDMsIDQsIDF9Owordm9pZCByZWFkX2ludHJhcHJlZG1vZGVfYWVjKHN0cnVjdCBzeW50YXhlbGVtZW50ICpzZSwgc3RydWN0IGltZ19wYXIgKmltZywKKwkJc3RydWN0IGRlY29kaW5nX2Vudmlyb25tZW50X3MgKmRlcF9kcCkKK3sKKwlzdHJ1Y3QgYmlfY29udGV4dF90eXBlX3MgKnBjdHg7CisJaW50IGN0eCwgc3ltYm9sOworCisJcGN0eCA9IGltZy0+Y3VycmVudF9zbGljZS0+dGV4X2N0eC0+b25lX2NvbnRleHRzWzFdOworCXN5bWJvbCA9IDA7CisJY3R4ID0gMDsKKyNpZmRlZiBEVU1QX0RFQlVHCisJaWYgKGF2c19nZXRfZGVidWdfZmxhZygpICYgQUVDX0RVTVApCisJCWlvX3ByaW50ZigiIC0tIHJlYWRfaW50cmFwcmVkbW9kZV9hZWMgY3R4IDogJWRcbiIsIGN0eCk7CisjZW5kaWYKKwl3aGlsZSAoYmlhcmlfZGVjb2RlX3N5bWJvbChkZXBfZHAsIHBjdHggKyBjdHgpID09IDApIHsKKwkJc3ltYm9sICs9IDE7CisJCWN0eCsrOworCQlpZiAoY3R4ID49IDMpCisJCQljdHggPSAzOworI2lmZGVmIERVTVBfREVCVUcKKwkJaWYgKGF2c19nZXRfZGVidWdfZmxhZygpICYgQUVDX0RVTVApCisJCQlpb19wcmludGYoIiAtLSByZWFkX2ludHJhcHJlZG1vZGVfYWVjIGN0eCA6ICVkXG4iLCBjdHgpOworI2VuZGlmCisJCWlmIChzeW1ib2wgPT0gNCkKKwkJCWJyZWFrOworCQl9CisJc2UtPnZhbHVlMSA9IG1hcGRfaW50cmFwW3N5bWJvbF0gLSAxOworCisjaWYgVFJBQ0UKKwlmcHJpbnRmKHBfdHJhY2UsICJAJWQgJXNcdFx0XHQlZFxuIiwKKwkJc3ltYm9sX2NvdW50KyssIHNlLT50cmFjZXN0cmluZywgc2UtPnZhbHVlMSk7CisJZmZsdXNoKHBfdHJhY2UpOworI2VuZGlmCit9CisKKy8qIQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogXGJyaWVmCisgKiAgICBkZWNvZGluZyBvZiB1bmFyeSBiaW5hcml6YXRpb24gdXNpbmcgb25lIG9yIDIgZGlzdGluY3QKKyAqICAgIG1vZGVscyBmb3IgdGhlIGZpcnN0IGFuZCBhbGwgcmVtYWluaW5nIGJpbnM7IG5vIHRlcm1pbmF0aW5nCisgKiAgICAiMCIgZm9yIG1heF9zeW1ib2wKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCit1bnNpZ25lZCBpbnQgdW5hcnlfYmluX21heF9kZWNvZGUoc3RydWN0IGRlY29kaW5nX2Vudmlyb25tZW50X3MgKmRlcF9kcCwKKwkJc3RydWN0IGJpX2NvbnRleHRfdHlwZV9zICpjdHgsCisJCWludCBjdHhfb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbWF4X3N5bWJvbCkKK3sKKwl1bnNpZ25lZCBpbnQgbDsKKwl1bnNpZ25lZCBpbnQgc3ltYm9sOworCXN0cnVjdCBiaV9jb250ZXh0X3R5cGVfcyAqaWN0eDsKKworCXN5bWJvbCA9IGJpYXJpX2RlY29kZV9zeW1ib2woZGVwX2RwLCBjdHgpOworCisJaWYgKHN5bWJvbCA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmIChtYXhfc3ltYm9sID09IDEpCisJCXJldHVybiBzeW1ib2w7CisJc3ltYm9sID0gMDsKKwlpY3R4ID0gY3R4ICsgY3R4X29mZnNldDsKKwlkbyB7CisJCWwgPSBiaWFyaV9kZWNvZGVfc3ltYm9sKGRlcF9kcCwgaWN0eCk7CisJCXN5bWJvbCsrOworCX0gd2hpbGUgKChsICE9IDApICYmIChzeW1ib2wgPCBtYXhfc3ltYm9sIC0gMSkpOworCWlmICgobCAhPSAwKSAmJiAoc3ltYm9sID09IG1heF9zeW1ib2wgLSAxKSkKKwkJc3ltYm9sKys7CisJcmV0dXJuIHN5bWJvbDsKK30KKworLyohCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBcYnJpZWYKKyAqICAgIGRlY29kaW5nIG9mIHVuYXJ5IGJpbmFyaXphdGlvbiB1c2luZyBvbmUgb3IgMiBkaXN0aW5jdAorICogICAgbW9kZWxzIGZvciB0aGUgZmlyc3QgYW5kIGFsbCByZW1haW5pbmcgYmlucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3Vuc2lnbmVkIGludCB1bmFyeV9iaW5fZGVjb2RlKHN0cnVjdCBkZWNvZGluZ19lbnZpcm9ubWVudF9zICpkZXBfZHAsCisJCXN0cnVjdCBiaV9jb250ZXh0X3R5cGVfcyAqY3R4LCBpbnQgY3R4X29mZnNldCkKK3sKKwl1bnNpZ25lZCBpbnQgbDsKKwl1bnNpZ25lZCBpbnQgc3ltYm9sOworCXN0cnVjdCBiaV9jb250ZXh0X3R5cGVfcyAqaWN0eDsKKworCXN5bWJvbCA9IDEgLSBiaWFyaV9kZWNvZGVfc3ltYm9sKGRlcF9kcCwgY3R4KTsKKworCWlmIChzeW1ib2wgPT0gMCkKKwkJcmV0dXJuIDA7CisJc3ltYm9sID0gMDsKKwlpY3R4ID0gY3R4ICsgY3R4X29mZnNldDsKKwlkbyB7CisJCWwgPSAxIC0gYmlhcmlfZGVjb2RlX3N5bWJvbChkZXBfZHAsIGljdHgpOworCQlzeW1ib2wrKzsKKwl9IHdoaWxlIChsICE9IDApOworCXJldHVybiBzeW1ib2w7Cit9CisKKy8qIQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogXGJyaWVmCisgKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXJpdGhtZXRpY2FsbHkgZGVjb2RlIHRoZSBjaHJvbWEKKyAqICAgIGludHJhIHByZWRpY3Rpb24gbW9kZSBvZiBhIGdpdmVuIE1CLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCit2b2lkIHJlYWRfY2lwcmVkbW9kZV9hZWMoc3RydWN0IHN5bnRheGVsZW1lbnQgKnNlLAorCXN0cnVjdCBpbWdfcGFyICppbWcsCisJCXN0cnVjdCBkZWNvZGluZ19lbnZpcm9ubWVudF9zICpkZXBfZHApCit7CisJc3RydWN0IHRleHR1cmVfaW5mb19jb250ZXh0cyAqY3R4ID0gaW1nLT5jdXJyZW50X3NsaWNlLT50ZXhfY3R4OworCXN0cnVjdCBtYWNyb2Jsb2NrICpjdXJyX21iID0gJm1iX2RhdGFbaW1nLT5jdXJyZW50X21iX25yXTsKKwlpbnQgYWN0X2N0eCwgYSwgYjsKKwlpbnQgYWN0X3N5bSA9IHNlLT52YWx1ZTE7CisKKwlpZiAoY3Vycl9tYi0+bWJfYXZhaWxhYmxlX3VwID09IE5VTEwpCisJCWIgPSAwOworCWVsc2UgeworCQkvKmlmICggKGN1cnJfbWItPm1iX2F2YWlsYWJsZV91cCktPm1iX3R5cGU9PUlQQ00pCisJCSAqIGI9MDsKKwkJICogZWxzZQorCQkgKi8KKwkJYiA9ICgoKGN1cnJfbWItPm1iX2F2YWlsYWJsZV91cCktPmNfaXByZWRfbW9kZSAhPSAwKSA/IDEgOiAwKTsKKwl9CisKKwlpZiAoY3Vycl9tYi0+bWJfYXZhaWxhYmxlX2xlZnQgPT0gTlVMTCkKKwkJYSA9IDA7CisJZWxzZSB7CisJCS8qIGlmICggKGN1cnJfbWItPm1iX2F2YWlsYWJsZV9sZWZ0KS0+bWJfdHlwZT09SVBDTSkKKwkJICogYT0wOworCQkgKiBlbHNlCisJCSAqLworCQlhID0gKCgoY3Vycl9tYi0+bWJfYXZhaWxhYmxlX2xlZnQpLT5jX2lwcmVkX21vZGUgIT0gMCkgPyAxIDogMCk7CisJfQorCisJYWN0X2N0eCA9IGEgKyBiOworCisKKwlhY3Rfc3ltID0gYmlhcmlfZGVjb2RlX3N5bWJvbChkZXBfZHAsIGN0eC0+Y2lwcl9jb250ZXh0cyArIGFjdF9jdHgpOworCisJaWYgKGFjdF9zeW0gIT0gMCkKKwkJYWN0X3N5bSA9IHVuYXJ5X2Jpbl9tYXhfZGVjb2RlKGRlcF9kcCwgY3R4LT5jaXByX2NvbnRleHRzICsgMywKKwkJCQkwLCAyKSArIDE7CisKKwlzZS0+dmFsdWUxID0gYWN0X3N5bTsKKworI2lmIFRSQUNFCisJZnByaW50ZihwX3RyYWNlLCAiQCVkICVzXHRcdCVkXG4iLAorCQlzeW1ib2xfY291bnQrKywgc2UtPnRyYWNlc3RyaW5nLCBzZS0+dmFsdWUxKTsKKwlmZmx1c2gocF90cmFjZSk7CisjZW5kaWYKKworfQorCitpbnQgc2xpY2VfaGVhZGVyKGNoYXIgKmJ1ZiwgaW50IHN0YXJ0Y29kZXBvcywgaW50IGxlbmd0aCkKK3sKKwlpbnQgaTsKKworCWludCB3ZWlnaHRfcGFyYV9udW0gPSAwOworCWludCBtYl9yb3c7CisJaW50IG1iX2NvbHVtbjsKKwlpbnQgbWJfaW5kZXg7CisJaW50IG1iX3dpZHRoLCBtYl9oZWlnaHQ7CisKKwltYl9jb2x1bW4gPSAwOworCisJbWVtY3B5KGN1cnJfc3RyZWFtLT5zdHJlYW1fYnVmZmVyLCBidWYsIGxlbmd0aCk7CisJY3Vycl9zdHJlYW0tPmNvZGVfbGVuID0gY3Vycl9zdHJlYW0tPmJpdHN0cmVhbV9sZW5ndGggPSBsZW5ndGg7CisKKwljdXJyX3N0cmVhbS0+cmVhZF9sZW4gPQorCWN1cnJfc3RyZWFtLT5mcmFtZV9iaXRvZmZzZXQgPSAoc3RhcnRjb2RlcG9zKSAqIDg7CisJc2xpY2VfdmVydGljYWxfcG9zaXRpb24gPSB1X3YoOCwgInNsaWNlIHZlcnRpY2FsIHBvc2l0aW9uIik7CisKKwlwdXNoX2VzKHNsaWNlX3ZlcnRpY2FsX3Bvc2l0aW9uLCA4KTsKKworI2lmZGVmIERVTVBfREVCVUcKKwlpZiAoYXZzX2dldF9kZWJ1Z19mbGFnKCkgJiBTTElDRV9JTkZPX0RVTVApCisJCWlvX3ByaW50ZigiICogOC1iaXRzIHNsaWNlX3ZlcnRpY2FsX3Bvc2l0aW9uIDogJWRcbiIsCisJCQlzbGljZV92ZXJ0aWNhbF9wb3NpdGlvbik7CisjZW5kaWYKKworCWlmICh2ZXJ0aWNhbF9zaXplID4gMjgwMCkgeworCQlzbGljZV92ZXJ0aWNhbF9wb3NpdGlvbl9leHRlbnNpb24gPSB1X3YoMywKKwkJCQkic2xpY2UgdmVydGljYWwgcG9zaXRpb24gZXh0ZW5zaW9uIik7CisJCXB1c2hfZXMoc2xpY2VfdmVydGljYWxfcG9zaXRpb25fZXh0ZW5zaW9uLCAzKTsKKworCX0KKworCWlmICh2ZXJ0aWNhbF9zaXplID4gMjgwMCkKKwkJbWJfcm93ID0gKHNsaWNlX3ZlcnRpY2FsX3Bvc2l0aW9uX2V4dGVuc2lvbiA8PCA3KQorCQkJCSsgc2xpY2VfdmVydGljYWxfcG9zaXRpb247CisJZWxzZQorCQltYl9yb3cgPSBzbGljZV92ZXJ0aWNhbF9wb3NpdGlvbjsKKworCW1iX3dpZHRoID0gKGhvcml6b250YWxfc2l6ZSArIDE1KSAvIDE2OworCWlmICghcHJvZ3Jlc3NpdmVfc2VxdWVuY2UpCisJCW1iX2hlaWdodCA9IDIgKiAoKHZlcnRpY2FsX3NpemUgKyAzMSkgLyAzMik7CisJZWxzZQorCQltYl9oZWlnaHQgPSAodmVydGljYWxfc2l6ZSArIDE1KSAvIDE2OworCisKKwltYl9pbmRleCA9IG1iX3JvdyAqIG1iX3dpZHRoICsgbWJfY29sdW1uOworCisJaWYgKCFpbWctPnBpY3R1cmVfc3RydWN0dXJlICYmIGltZy0+dHlwZSA9PSBJX0lNRworCQkJJiYgKG1iX2luZGV4ID49IG1iX3dpZHRoICogbWJfaGVpZ2h0IC8gMikpIHsKKwkJc2Vjb25kX2lmaWVsZCA9IDE7CisJCWltZy0+dHlwZSA9IFBfSU1HOworCQlwcmVfaW1nX3R5cGUgPSBQX0lNRzsKKwl9CisKKwl7CisJCWlmICghZml4ZWRfcGljdHVyZV9xcCkgeworCQkJZml4ZWRfc2xpY2VfcXAgPSB1X3YoMSwgImZpeGVkX3NsaWNlX3FwIik7CisJCQlwdXNoX2VzKGZpeGVkX3NsaWNlX3FwLCAxKTsKKyNpZmRlZiBEVU1QX0RFQlVHCisJCQlpZiAoYXZzX2dldF9kZWJ1Z19mbGFnKCkgJiBTTElDRV9JTkZPX0RVTVApCisJCQkJaW9fcHJpbnRmKCIgKiAxLWJpdCBmaXhlZF9zbGljZV9xcCA6ICVkXG4iLAorCQkJCQlmaXhlZF9zbGljZV9xcCk7CisjZW5kaWYKKwkJCXNsaWNlX3FwID0gdV92KDYsICJzbGljZV9xcCIpOworCQkJcHVzaF9lcyhzbGljZV9xcCwgNik7CisjaWZkZWYgRFVNUF9ERUJVRworCQkJaWYgKGF2c19nZXRfZGVidWdfZmxhZygpICYgU0xJQ0VfSU5GT19EVU1QKQorCQkJCWlvX3ByaW50ZigiICogNi1iaXRzIHNsaWNlX3FwIDogJWRcbiIsCisJCQkJCXNsaWNlX3FwKTsKKyNlbmRpZgorCisJCQlpbWctPnFwID0gc2xpY2VfcXA7CisJCX0KKworCQlpZiAoaW1nLT50eXBlICE9IElfSU1HKSB7CisJCQlpbWctPnNsaWNlX3dlaWdodGluZ19mbGFnID0gdV92KDEsCisJCQkJCSJzbGljZSB3ZWlnaHRpbmcgZmxhZyIpOworCisJCQlpZiAoaW1nLT5zbGljZV93ZWlnaHRpbmdfZmxhZykgeworCisJCQkJaWYgKHNlY29uZF9pZmllbGQgJiYgIWltZy0+cGljdHVyZV9zdHJ1Y3R1cmUpCisJCQkJCXdlaWdodF9wYXJhX251bSA9IDE7CisJCQkJZWxzZSBpZiAoaW1nLT50eXBlID09IFBfSU1HCisJCQkJCQkmJiBpbWctPnBpY3R1cmVfc3RydWN0dXJlKQorCQkJCQl3ZWlnaHRfcGFyYV9udW0gPSAyOworCQkJCWVsc2UgaWYgKGltZy0+dHlwZSA9PSBQX0lNRworCQkJCQkJJiYgIWltZy0+cGljdHVyZV9zdHJ1Y3R1cmUpCisJCQkJCXdlaWdodF9wYXJhX251bSA9IDQ7CisJCQkJZWxzZSBpZiAoaW1nLT50eXBlID09IEJfSU1HCisJCQkJCQkmJiBpbWctPnBpY3R1cmVfc3RydWN0dXJlKQorCQkJCQl3ZWlnaHRfcGFyYV9udW0gPSAyOworCQkJCWVsc2UgaWYgKGltZy0+dHlwZSA9PSBCX0lNRworCQkJCQkJJiYgIWltZy0+cGljdHVyZV9zdHJ1Y3R1cmUpCisJCQkJCXdlaWdodF9wYXJhX251bSA9IDQ7CisKKyNpZmRlZiBEVU1QX0RFQlVHCisJCQkJaWYgKGF2c19nZXRfZGVidWdfZmxhZygpICYgU0xJQ0VfSU5GT19EVU1QKQorCQkJCQlpb19wcmludGYoIiAtIHdlaWdodF9wYXJhX251bSA6ICVkXG4iLAorCQkJCQkJd2VpZ2h0X3BhcmFfbnVtKTsKKyNlbmRpZgorCQkJCWZvciAoaSA9IDA7IGkgPCB3ZWlnaHRfcGFyYV9udW07IGkrKykgeworCQkJCQlpbWctPmx1bV9zY2FsZVtpXSA9IHVfdig4LAorCQkJCQkJCSJsdW1hIHNjYWxlIik7CisKKwkJCQkJaW1nLT5sdW1fc2hpZnRbaV0gPSBpXzgoImx1bWEgc2hpZnQiKTsKKworCQkJCQltYXJrZXJfYml0ID0gdV8xKCJpbnNlcnQgYml0Iik7CisKKworCQkJCQl7CisJCQkJCQlpbWctPmNocm9tYV9zY2FsZVtpXSA9IHVfdig4LAorCQkJCQkJCQkiY2hyb21hIHNjYWxlIik7CisKKwkJCQkJCWltZy0+Y2hyb21hX3NoaWZ0W2ldID0gaV84KAorCQkJCQkJCQkiY2hyb21hIHNoaWZ0Iik7CisKKwkJCQkJCW1hcmtlcl9iaXQgPSB1XzEoImluc2VydCBiaXQiKTsKKworCQkJCQl9CisJCQkJfQorCQkJCWltZy0+bWJfd2VpZ2h0aW5nX2ZsYWcgPSB1X3YoMSwKKwkJCQkJCSJNQiB3ZWlnaHRpbmcgZmxhZyIpOworCisJCQl9CisJCX0KKwl9CisKKworI2lmIDEKKwlyZXR1cm4gbWJfaW5kZXg7CisjZW5kaWYKK30KKwordm9pZCBub19tZW1fZXhpdChjaGFyICp3aGVyZSkKK3sKKwlpb19wcmludGYoIiVzXHJcbiIsIHdoZXJlKTsKK30KKwordW5zaWduZWQgY2hhciBiaXRbOF0gPSB7MHg4MCwgMHg0MCwgMHgyMCwgMHgxMCwgMHgwOCwgMHgwNCwgMHgwMiwgMHgwMX07CisKK3N0cnVjdCBpbnB1dHN0cmVhbV9zIHsKKwkvKkZJTEUgKmY7Ki8KKwl1bnNpZ25lZCBjaGFyIGJ1ZltTVkFfU1RSRUFNX0JVRl9TSVpFXTsKKwl1bnNpZ25lZCBpbnQgdWNsZWFyX2JpdHM7CisJdW5zaWduZWQgaW50IHVwcmVfM2J5dGVzOworCWludCBpYnl0ZV9wb3NpdGlvbjsKKwlpbnQgaWJ1Zl9ieXRlc251bTsKKwlpbnQgaWNsZWFyX2JpdHNudW07CisJaW50IGlzdHVmZl9iaXRzbnVtOworCWludCBpYml0c19jb3VudDsKK307CisKK3N0cnVjdCBpbnB1dHN0cmVhbV9zIElSQUJTOworc3RydWN0IGlucHV0c3RyZWFtX3MgKnBfaXJhYnMgPSAmSVJBQlM7CisKK3N0cnVjdCBzdGF0X2JpdHMgeworCWludCBjdXJyX2ZyYW1lX2JpdHM7CisJaW50IHByZXZfZnJhbWVfYml0czsKKwlpbnQgZW11bGF0ZV9iaXRzOworCWludCBwcmV2X2VtdWxhdGVfYml0czsKKwlpbnQgbGFzdF91bml0X2JpdHM7CisJaW50IGJpdHJhdGU7CisJaW50IHRvdGFsX2JpdHJhdGVbMTAwMF07CisJaW50IGNvZGVkX3BpY19udW07CisJaW50IHRpbWVfczsKK307CisKK3N0cnVjdCBzdGF0X2JpdHMgKnN0YXRfYml0c19wdHI7CisKK3Vuc2lnbmVkIGNoYXIgKnRlbXBfc2xpY2VfYnVmOworaW50IHN0YXJ0X2NvZGVwb3NpdGlvbjsKK2ludCBmaXJzdF9zbGljZV9sZW5ndGg7CitpbnQgZmlyc3Rfc2xpY2Vfc3RhcnRwb3M7CisKK2ludCBiaXRzdHJlYW1fYnVmX3VzZWQ7CitpbnQgc3RhcnRjb2RlX29mZnNldDsKKworaW50IGJpdHN0cmVhbV9yZWFkX3B0cjsKKworaW50IGRlbXVsYXRlX2VuYWJsZTsKKworaW50IGxhc3RfZHF1YW50OworCitpbnQgdG90YWxfbWJfY291bnQ7CisKK2ludCBjdXJyZW50X21iX3NraXA7CisKK2ludCBza2lwX21vZGVfZmxhZzsKKworaW50IGN1cnJlbnRfbWJfaW50cmE7CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246IENoZWNrIHN0YXJ0IGNvZGUncyB0eXBlCisgKiBJbnB1dDoKKyAqIE91dHB1dDoKKyAqIFJldHVybjoKKyAqIEF1dGhvcjogWFpIRU5HLCAyMDA4MDUxNQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLwordm9pZCBjaGVja190eXBlKGludCBzdGFydGNvZGUpCit7CisJc3RhcnRjb2RlID0gc3RhcnRjb2RlICYgMHgwMDAwMDBmZjsKKwlzd2l0Y2ggKHN0YXJ0Y29kZSkgeworCWNhc2UgMHhiMDoKKwljYXNlIDB4YjI6CisJY2FzZSAweGI1OgorCQlkZW11bGF0ZV9lbmFibGUgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZW11bGF0ZV9lbmFibGUgPSAxOworCQlicmVhazsKKwl9CisKK30KKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiBJbnB1dDoKKyAqIE91dHB1dDoKKyAqIFJldHVybjogIDAgOiBPSworIC0xIDogYXJyaXZlIGF0IHN0cmVhbSBlbmQKKyAtMiA6IG1lZXQgYW5vdGhlciBzdGFydCBjb2RlCisgKiBBdHRlbnRpb246CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitpbnQgY2xlYXJfbmV4dGJ5dGUoc3RydWN0IGlucHV0c3RyZWFtX3MgKnApCit7CisJaW50IGksIGssIGo7CisJdW5zaWduZWQgY2hhciB0ZW1wWzNdOworCisJaSA9IHAtPmlieXRlX3Bvc2l0aW9uOworCWsgPSBwLT5pYnVmX2J5dGVzbnVtIC0gaTsKKwlpZiAoayA8IDMpIHsKKwkJZm9yIChqID0gMDsgaiA8IGs7IGorKykKKwkJCXRlbXBbal0gPSBwLT5idWZbaSArIGpdOworCisJCXAtPmlidWZfYnl0ZXNudW0gPSByZWFkX2JpdHN0cmVhbShwLT5idWYgKyBrLAorCQkJCVNWQV9TVFJFQU1fQlVGX1NJWkUgLSBrKTsKKwkJYml0c3RyZWFtX2J1Zl91c2VkKys7CisJCWlmIChwLT5pYnVmX2J5dGVzbnVtID09IDApIHsKKwkJCWlmIChrID4gMCkgeworCQkJCXdoaWxlIChrID4gMCkgeworCQkJCQlwLT51cHJlXzNieXRlcyA9ICgocC0+dXByZV8zYnl0ZXMgPDwgOCkKKwkJCQkJCQl8IHAtPmJ1ZltpXSkKKwkJCQkJCQkmIDB4MDBmZmZmZmY7CisJCQkJCWlmIChwLT51cHJlXzNieXRlcyA8IDQKKwkJCQkJCQkmJiBkZW11bGF0ZV9lbmFibGUpIHsKKwkJCQkJCXAtPnVjbGVhcl9iaXRzID0KKwkJCQkJCShwLT51Y2xlYXJfYml0cworCQkJCQkJPDwgNikKKwkJCQkJCXwgKHAtPmJ1ZltpXQorCQkJCQkJPj4gMik7CisJCQkJCQlwLT5pY2xlYXJfYml0c251bSArPSA2OworCQkJCQkJc3RhdF9iaXRzX3B0ci0+ZW11bGF0ZV9iaXRzCisJCQkJCQkrPSAyOworCQkJCQl9IGVsc2UgeworCQkJCQkJcC0+dWNsZWFyX2JpdHMgPSAocC0+dWNsZWFyX2JpdHMKKwkJCQkJCTw8IDgpCisJCQkJCQl8IHAtPmJ1ZltpXTsKKwkJCQkJCXAtPmljbGVhcl9iaXRzbnVtICs9IDg7CisJCQkJCX0KKwkJCQkJcC0+aWJ5dGVfcG9zaXRpb24rKzsKKwkJCQkJay0tOworCQkJCQlpKys7CisJCQkJfQorCQkJCXJldHVybiAwOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSB7CisJCQlmb3IgKGogPSAwOyBqIDwgazsgaisrKQorCQkJCXAtPmJ1ZltqXSA9IHRlbXBbal07CisJCQlwLT5pYnVmX2J5dGVzbnVtICs9IGs7CisJCQlpID0gcC0+aWJ5dGVfcG9zaXRpb24gPSAwOworCQl9CisJfQorCWlmIChwLT5idWZbaV0gPT0gMCAmJiBwLT5idWZbaSArIDFdID09IDAgJiYgcC0+YnVmW2kgKyAyXSA9PSAxKQorCQlyZXR1cm4gLTI7CisJcC0+dXByZV8zYnl0ZXMgPSAoKHAtPnVwcmVfM2J5dGVzIDw8IDgpIHwgcC0+YnVmW2ldKSAmIDB4MDBmZmZmZmY7CisJaWYgKHAtPnVwcmVfM2J5dGVzIDwgNCAmJiBkZW11bGF0ZV9lbmFibGUpIHsKKwkJcC0+dWNsZWFyX2JpdHMgPSAocC0+dWNsZWFyX2JpdHMgPDwgNikgfCAocC0+YnVmW2ldID4+IDIpOworCQlwLT5pY2xlYXJfYml0c251bSArPSA2OworCQlzdGF0X2JpdHNfcHRyLT5lbXVsYXRlX2JpdHMgKz0gMjsKKwl9IGVsc2UgeworCQlwLT51Y2xlYXJfYml0cyA9IChwLT51Y2xlYXJfYml0cyA8PCA4KSB8IHAtPmJ1ZltpXTsKKwkJcC0+aWNsZWFyX2JpdHNudW0gKz0gODsKKwl9CisJcC0+aWJ5dGVfcG9zaXRpb24rKzsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqIElucHV0OgorICogT3V0cHV0OgorICogUmV0dXJuOiAgMCA6IE9LCisgLTEgOiBhcnJpdmUgYXQgc3RyZWFtIGVuZAorIC0yIDogbWVldCBhbm90aGVyIHN0YXJ0IGNvZGUKKyAqIEF0dGVudGlvbjoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2ludCByZWFkX25fYml0KHN0cnVjdCBpbnB1dHN0cmVhbV9zICpwLCBpbnQgbiwgaW50ICp2KQoreworCWludCByOworCXVuc2lnbmVkIGludCB0OworCisJd2hpbGUgKG4gPiBwLT5pY2xlYXJfYml0c251bSkgeworCQlyID0gY2xlYXJfbmV4dGJ5dGUocCk7CisJCWlmIChyKSB7CisJCQlpZiAociA9PSAtMSkgeworCQkJCWlmIChwLT5pYnVmX2J5dGVzbnVtIC0gcC0+aWJ5dGVfcG9zaXRpb24gPiAwKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCXJldHVybiByOworCQl9CisJfQorCXQgPSBwLT51Y2xlYXJfYml0czsKKwlyID0gMzIgLSBwLT5pY2xlYXJfYml0c251bTsKKwkqdiA9ICh0IDw8IHIpID4+ICgzMiAtIG4pOworCXAtPmljbGVhcl9iaXRzbnVtIC09IG47CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBBVlNQX0xPTkdfQ0FCQUMKK3Vuc2lnbmVkIGNoYXIgVE1QX0JVRlsyICogU1ZBX1NUUkVBTV9CVUZfU0laRV07CitpbnQgdG1wX2J1Zl93cl9wdHI7CitpbnQgdG1wX2J1Zl9yZF9wdHI7CitpbnQgdG1wX2J1Zl9jb3VudDsKKyNlbmRpZgordm9pZCBvcGVuX2lyYWJzKHN0cnVjdCBpbnB1dHN0cmVhbV9zICpwKQoreworCXAtPnVjbGVhcl9iaXRzID0gMHhmZmZmZmZmZjsKKwlwLT5pYnl0ZV9wb3NpdGlvbiA9IDA7CisJcC0+aWJ1Zl9ieXRlc251bSA9IDA7CisJcC0+aWNsZWFyX2JpdHNudW0gPSAwOworCXAtPmlzdHVmZl9iaXRzbnVtID0gMDsKKwlwLT5pYml0c19jb3VudCA9IDA7CisJcC0+dXByZV8zYnl0ZXMgPSAwOworCisJYml0c3RyZWFtX2J1Zl91c2VkID0gMDsKKwliaXRzdHJlYW1fcmVhZF9wdHIgPSAoc3JjX3N0YXJ0IC0gMTYpICYgMHhmZmZmZmZmMDsKKworI2lmZGVmIEFWU1BfTE9OR19DQUJBQworCXRtcF9idWZfY291bnQgPSAwOworCXRtcF9idWZfd3JfcHRyID0gMDsKKwl0bXBfYnVmX3JkX3B0ciA9IDA7CisjZW5kaWYKKworfQorCit2b2lkIG1vdmVfYml0c3RyZWFtKHVuc2lnbmVkIGludCBtb3ZlX2Zyb21fYWRkciwgdW5zaWduZWQgaW50IG1vdmVfdG9fYWRkciwKKwkJaW50IG1vdmVfc2l6ZSkKK3sKKwlpbnQgbW92ZV9ieXRlc19sZWZ0ID0gbW92ZV9zaXplOworCXVuc2lnbmVkIGludCBtb3ZlX3JlYWRfYWRkcjsKKwl1bnNpZ25lZCBpbnQgbW92ZV93cml0ZV9hZGRyID0gbW92ZV90b19hZGRyOworCisJaW50IG1vdmVfYnl0ZTsKKwl1bnNpZ25lZCBpbnQgZGF0YTMyOworCisJd2hpbGUgKG1vdmVfZnJvbV9hZGRyID4gdmxkX21lbV9lbmRfYWRkcikgeworCQltb3ZlX2Zyb21fYWRkciA9IG1vdmVfZnJvbV9hZGRyICsgdmxkX21lbV9zdGFydF9hZGRyCisJCQkJLSB2bGRfbWVtX2VuZF9hZGRyIC0gODsKKwl9CisJbW92ZV9yZWFkX2FkZHIgPSBtb3ZlX2Zyb21fYWRkcjsKKwl3aGlsZSAobW92ZV9ieXRlc19sZWZ0ID4gMCkgeworCQltb3ZlX2J5dGUgPSBtb3ZlX2J5dGVzX2xlZnQ7CisJCWlmIChtb3ZlX2J5dGUgPiA1MTIpCisJCQltb3ZlX2J5dGUgPSA1MTI7CisJCWlmICgobW92ZV9yZWFkX2FkZHIgKyBtb3ZlX2J5dGUpID4gdmxkX21lbV9lbmRfYWRkcikKKwkJCW1vdmVfYnl0ZSA9ICh2bGRfbWVtX2VuZF9hZGRyICsgOCkgLSBtb3ZlX3JlYWRfYWRkcjsKKworCQlXUklURV9WUkVHKExNRU1fRE1BX0FEUiwgbW92ZV9yZWFkX2FkZHIpOworCQlXUklURV9WUkVHKExNRU1fRE1BX0NPVU5ULCBtb3ZlX2J5dGUgLyAyKTsKKwkJV1JJVEVfVlJFRyhMTUVNX0RNQV9DVFJMLCAweGMyMDApOworCisJCWRhdGEzMiA9IDB4ODAwMDsKKwkJd2hpbGUgKGRhdGEzMiAmIDB4ODAwMCkKKwkJCWRhdGEzMiA9IFJFQURfVlJFRyhMTUVNX0RNQV9DVFJMKTsKKworCQlXUklURV9WUkVHKExNRU1fRE1BX0FEUiwgbW92ZV93cml0ZV9hZGRyKTsKKwkJV1JJVEVfVlJFRyhMTUVNX0RNQV9DT1VOVCwgbW92ZV9ieXRlIC8gMik7CisJCVdSSVRFX1ZSRUcoTE1FTV9ETUFfQ1RSTCwgMHg4MjAwKTsKKworCQlkYXRhMzIgPSAweDgwMDA7CisJCXdoaWxlIChkYXRhMzIgJiAweDgwMDApCisJCQlkYXRhMzIgPSBSRUFEX1ZSRUcoTE1FTV9ETUFfQ1RSTCk7CisKKwkJZGF0YTMyID0gMHgwZmZmOworCQl3aGlsZSAoZGF0YTMyICYgMHgwZmZmKQorCQkJZGF0YTMyID0gUkVBRF9WUkVHKFdSUlNQX0xNRU0pOworCisjaWZkZWYgRFVNUF9ERUJVRworCQlpZiAoYXZzX2dldF9kZWJ1Z19mbGFnKCkgJiBTVFJFQU1fSU5GT19EVU1QKQorCQkJaW9fcHJpbnRmKCIgIDIgTU9WRSAlZCBCeXRlcyBmcm9tIDB4JXggdG8gMHgleFxuIiwKKwkJCQltb3ZlX2J5dGUsIG1vdmVfcmVhZF9hZGRyLCBtb3ZlX3dyaXRlX2FkZHIpOworI2VuZGlmCisKKwkJbW92ZV9yZWFkX2FkZHIgPSBtb3ZlX3JlYWRfYWRkciArIG1vdmVfYnl0ZTsKKwkJaWYgKG1vdmVfcmVhZF9hZGRyID4gdmxkX21lbV9lbmRfYWRkcikKKwkJCW1vdmVfcmVhZF9hZGRyID0gdmxkX21lbV9zdGFydF9hZGRyOworCQltb3ZlX3dyaXRlX2FkZHIgPSBtb3ZlX3dyaXRlX2FkZHIgKyBtb3ZlX2J5dGU7CisJCW1vdmVfYnl0ZXNfbGVmdCA9IG1vdmVfYnl0ZXNfbGVmdCAtIG1vdmVfYnl0ZTsKKwl9CisKK30KKworaW50IHJlYWRfYml0c3RyZWFtKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisJaW50IGk7CisKKyNpZmRlZiBBVlNQX0xPTkdfQ0FCQUMKKworCXVuc2lnbmVkIGludCAqVE1QX0JVRl8zMiA9ICh1bnNpZ25lZCBpbnQgKiliaXRzdHJlYW1fcmVhZF90bXA7CisKKwlpZiAodG1wX2J1Zl9jb3VudCA8IHNpemUpIHsKKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCWJpdHN0cmVhbV9yZWFkX3RtcF9waHksIFNWQV9TVFJFQU1fQlVGX1NJWkUsCisJCQkJRE1BX0ZST01fREVWSUNFKTsKKworCQltb3ZlX2JpdHN0cmVhbShiaXRzdHJlYW1fcmVhZF9wdHIsIGJpdHN0cmVhbV9yZWFkX3RtcF9waHksCisJCQkJU1ZBX1NUUkVBTV9CVUZfU0laRSk7CisKKwkJZm9yIChpID0gMDsgaSA8IFNWQV9TVFJFQU1fQlVGX1NJWkUgLyA4OyBpKyspIHsKKwkJCVRNUF9CVUZbdG1wX2J1Zl93cl9wdHIrK10gPQorCQkJCQkoVE1QX0JVRl8zMlsyICogaSArIDFdID4+IDI0KSAmIDB4ZmY7CisJCQlpZiAodG1wX2J1Zl93cl9wdHIgPj0gKDIgKiBTVkFfU1RSRUFNX0JVRl9TSVpFKSkKKwkJCQl0bXBfYnVmX3dyX3B0ciA9IDA7CisJCQlUTVBfQlVGW3RtcF9idWZfd3JfcHRyKytdID0KKwkJCQkJKFRNUF9CVUZfMzJbMiAqIGkgKyAxXSA+PiAxNikgJiAweGZmOworCQkJaWYgKHRtcF9idWZfd3JfcHRyID49ICgyICogU1ZBX1NUUkVBTV9CVUZfU0laRSkpCisJCQkJdG1wX2J1Zl93cl9wdHIgPSAwOworCQkJVE1QX0JVRlt0bXBfYnVmX3dyX3B0cisrXSA9IChUTVBfQlVGXzMyWzIgKiBpICsgMV0gPj4gOCkKKwkJCQkJJiAweGZmOworCQkJaWYgKHRtcF9idWZfd3JfcHRyID49ICgyICogU1ZBX1NUUkVBTV9CVUZfU0laRSkpCisJCQkJdG1wX2J1Zl93cl9wdHIgPSAwOworCQkJVE1QX0JVRlt0bXBfYnVmX3dyX3B0cisrXSA9IChUTVBfQlVGXzMyWzIgKiBpICsgMV0gPj4gMCkKKwkJCQkJJiAweGZmOworCQkJaWYgKHRtcF9idWZfd3JfcHRyID49ICgyICogU1ZBX1NUUkVBTV9CVUZfU0laRSkpCisJCQkJdG1wX2J1Zl93cl9wdHIgPSAwOworCQkJVE1QX0JVRlt0bXBfYnVmX3dyX3B0cisrXSA9CisJCQkJCShUTVBfQlVGXzMyWzIgKiBpICsgMF0gPj4gMjQpICYgMHhmZjsKKwkJCWlmICh0bXBfYnVmX3dyX3B0ciA+PSAoMiAqIFNWQV9TVFJFQU1fQlVGX1NJWkUpKQorCQkJCXRtcF9idWZfd3JfcHRyID0gMDsKKwkJCVRNUF9CVUZbdG1wX2J1Zl93cl9wdHIrK10gPQorCQkJCQkoVE1QX0JVRl8zMlsyICogaSArIDBdID4+IDE2KSAmIDB4ZmY7CisJCQlpZiAodG1wX2J1Zl93cl9wdHIgPj0gKDIgKiBTVkFfU1RSRUFNX0JVRl9TSVpFKSkKKwkJCQl0bXBfYnVmX3dyX3B0ciA9IDA7CisJCQlUTVBfQlVGW3RtcF9idWZfd3JfcHRyKytdID0gKFRNUF9CVUZfMzJbMiAqIGkgKyAwXSA+PiA4KQorCQkJCQkmIDB4ZmY7CisJCQlpZiAodG1wX2J1Zl93cl9wdHIgPj0gKDIgKiBTVkFfU1RSRUFNX0JVRl9TSVpFKSkKKwkJCQl0bXBfYnVmX3dyX3B0ciA9IDA7CisJCQlUTVBfQlVGW3RtcF9idWZfd3JfcHRyKytdID0gKFRNUF9CVUZfMzJbMiAqIGkgKyAwXSA+PiAwKQorCQkJCQkmIDB4ZmY7CisJCQlpZiAodG1wX2J1Zl93cl9wdHIgPj0gKDIgKiBTVkFfU1RSRUFNX0JVRl9TSVpFKSkKKwkJCQl0bXBfYnVmX3dyX3B0ciA9IDA7CisJCX0KKwkJdG1wX2J1Zl9jb3VudCA9IHRtcF9idWZfY291bnQgKyBTVkFfU1RSRUFNX0JVRl9TSVpFOworCQliaXRzdHJlYW1fcmVhZF9wdHIgPSBiaXRzdHJlYW1fcmVhZF9wdHIgKyBTVkFfU1RSRUFNX0JVRl9TSVpFOworCX0KKworI2lmZGVmIERVTVBfREVCVUcKKwlpZiAoYXZzX2dldF9kZWJ1Z19mbGFnKCkgJiBTVFJFQU1fSU5GT19EVU1QKQorCQlpb19wcmludGYoIiBSZWFkICVkIGJ5dGVzIGZyb20gJWQsIHNpemUgbGVmdCA6ICVkXG4iLAorCQkJc2l6ZSwgdG1wX2J1Zl9yZF9wdHIsIHRtcF9idWZfY291bnQpOworI2VuZGlmCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlidWZbaV0gPSBUTVBfQlVGW3RtcF9idWZfcmRfcHRyKytdOworCQlpZiAodG1wX2J1Zl9yZF9wdHIgPj0gKDIgKiBTVkFfU1RSRUFNX0JVRl9TSVpFKSkKKwkJCXRtcF9idWZfcmRfcHRyID0gMDsKKwl9CisJdG1wX2J1Zl9jb3VudCA9IHRtcF9idWZfY291bnQgLSBzaXplOworCisjZWxzZQorCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCWJ1ZltpXSA9IHRtcF9zdHJlYW1bYml0c3RyZWFtX3JlYWRfcHRyICsgaV07CisJYml0c3RyZWFtX3JlYWRfcHRyID0gYml0c3RyZWFtX3JlYWRfcHRyICsgc2l6ZTsKKyNlbmRpZgorCisJcmV0dXJuIHNpemU7Cit9CisKK2ludCBuZXh0X3N0YXJ0Y29kZShzdHJ1Y3QgaW5wdXRzdHJlYW1fcyAqcCkKK3sKKwlpbnQgaSwgbTsKKwl1bnNpZ25lZCBjaGFyIGEgPSAwLCBiID0gMDsKKworCW0gPSAwOworCisJd2hpbGUgKDEpIHsKKwkJaWYgKHAtPmlieXRlX3Bvc2l0aW9uID49IHAtPmlidWZfYnl0ZXNudW0gLSAyKSB7CisJCQltID0gcC0+aWJ1Zl9ieXRlc251bSAtIHAtPmlieXRlX3Bvc2l0aW9uOworCQkJaWYgKG0gPCAwKQorCQkJCXJldHVybiAtMjsKKwkJCWlmIChtID09IDEpCisJCQkJYiA9IHAtPmJ1ZltwLT5pYnl0ZV9wb3NpdGlvbiArIDFdOworCQkJaWYgKG0gPT0gMikgeworCQkJCWIgPSBwLT5idWZbcC0+aWJ5dGVfcG9zaXRpb24gKyAxXTsKKwkJCQlhID0gcC0+YnVmW3AtPmlieXRlX3Bvc2l0aW9uXTsKKwkJCX0KKwkJCXAtPmlidWZfYnl0ZXNudW0gPSByZWFkX2JpdHN0cmVhbShwLT5idWYsCisJCQkJCVNWQV9TVFJFQU1fQlVGX1NJWkUpOworCQkJcC0+aWJ5dGVfcG9zaXRpb24gPSAwOworCQkJYml0c3RyZWFtX2J1Zl91c2VkKys7CisJCX0KKworCQlpZiAocC0+aWJ1Zl9ieXRlc251bSArIG0gPCAzKQorCQkJcmV0dXJuIC0xOworCisJCWlmIChtID09IDEgJiYgYiA9PSAwICYmIHAtPmJ1ZlswXSA9PSAwICYmIHAtPmJ1ZlsxXSA9PSAxKSB7CisJCQlwLT5pYnl0ZV9wb3NpdGlvbiA9IDI7CisJCQlwLT5pY2xlYXJfYml0c251bSA9IDA7CisJCQlwLT5pc3R1ZmZfYml0c251bSA9IDA7CisJCQlwLT5pYml0c19jb3VudCArPSAyNDsKKwkJCXAtPnVwcmVfM2J5dGVzID0gMTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKG0gPT0gMiAmJiBiID09IDAgJiYgYSA9PSAwICYmIHAtPmJ1ZlswXSA9PSAxKSB7CisJCQlwLT5pYnl0ZV9wb3NpdGlvbiA9IDE7CisJCQlwLT5pY2xlYXJfYml0c251bSA9IDA7CisJCQlwLT5pc3R1ZmZfYml0c251bSA9IDA7CisJCQlwLT5pYml0c19jb3VudCArPSAyNDsKKwkJCXAtPnVwcmVfM2J5dGVzID0gMTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKG0gPT0gMiAmJiBiID09IDAgJiYgcC0+YnVmWzBdID09IDAgJiYgcC0+YnVmWzFdID09IDEpIHsKKwkJCXAtPmlieXRlX3Bvc2l0aW9uID0gMjsKKwkJCXAtPmljbGVhcl9iaXRzbnVtID0gMDsKKwkJCXAtPmlzdHVmZl9iaXRzbnVtID0gMDsKKwkJCXAtPmliaXRzX2NvdW50ICs9IDI0OworCQkJcC0+dXByZV8zYnl0ZXMgPSAxOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlmb3IgKGkgPSBwLT5pYnl0ZV9wb3NpdGlvbjsgaSA8IHAtPmlidWZfYnl0ZXNudW0gLSAyOyBpKyspIHsKKwkJCWlmIChwLT5idWZbaV0gPT0gMCAmJiBwLT5idWZbaSArIDFdID09IDAKKwkJCQkJJiYgcC0+YnVmW2kgKyAyXSA9PSAxKSB7CisJCQkJcC0+aWJ5dGVfcG9zaXRpb24gPSBpICsgMzsKKwkJCQlwLT5pY2xlYXJfYml0c251bSA9IDA7CisJCQkJcC0+aXN0dWZmX2JpdHNudW0gPSAwOworCQkJCXAtPmliaXRzX2NvdW50ICs9IDI0OworCQkJCXAtPnVwcmVfM2J5dGVzID0gMTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXAtPmliaXRzX2NvdW50ICs9IDg7CisJCX0KKwkJcC0+aWJ5dGVfcG9zaXRpb24gPSBpOworCX0KK30KKworaW50IGdldF9vbmV1bml0KGNoYXIgKmJ1ZiwgaW50ICpzdGFydGNvZGVwb3MsIGludCAqbGVuZ3RoKQoreworCWludCBpLCBqLCBrOworCisJaSA9IG5leHRfc3RhcnRjb2RlKHBfaXJhYnMpOworCisJaWYgKGkgIT0gMCkgeworCQlpZiAoaSA9PSAtMSkKKwkJCWlvX3ByaW50ZigKKwkJCQkJIlxuYXJyaXZlIGF0IHN0cmVhbSBlbmQgYW5kIHN0YXJ0IGNvZGUgaXMgbm90IGZvdW5kISIpOworCQlpZiAoaSA9PSAtMikKKwkJCWlvX3ByaW50ZigiXG5wLT5pYnl0ZV9wb3NpdGlvbiBlcnJvciEiKTsKKworCX0KKwlzdGFydGNvZGVfb2Zmc2V0ID0KKwkJCXBfaXJhYnMtPmlieXRlX3Bvc2l0aW9uCisJCQkJCS0gMyArIChiaXRzdHJlYW1fYnVmX3VzZWQtMSkKKwkJCQkJKiBTVkFfU1RSRUFNX0JVRl9TSVpFOworCWJ1ZlswXSA9IDA7CisJYnVmWzFdID0gMDsKKwlidWZbMl0gPSAxOworCSpzdGFydGNvZGVwb3MgPSAzOworCWkgPSByZWFkX25fYml0KHBfaXJhYnMsIDgsICZqKTsKKwlidWZbM10gPSAoY2hhcilqOworCisJY2hlY2tfdHlwZShidWZbM10pOworCWlmIChidWZbM10gPT0gU0VRVUVOQ0VfRU5EX0NPREUpIHsKKwkJKmxlbmd0aCA9IDQ7CisJCXJldHVybiAtMTsKKwl9CisJayA9IDQ7CisJd2hpbGUgKDEpIHsKKwkJaSA9IHJlYWRfbl9iaXQocF9pcmFicywgOCwgJmopOworCQlpZiAoaSA8IDApCisJCQlicmVhazsKKwkJYnVmW2srK10gPSAoY2hhcilqOworCQlpZiAoayA+PSAoTUFYX0NPREVEX0ZSQU1FX1NJWkUgLSAxKSkKKwkJCWJyZWFrOworCX0KKwlpZiAocF9pcmFicy0+aWNsZWFyX2JpdHNudW0gPiAwKSB7CisJCWludCBzaGlmdDsKKworCQlzaGlmdCA9IDggLSBwX2lyYWJzLT5pY2xlYXJfYml0c251bTsKKwkJaSA9IHJlYWRfbl9iaXQocF9pcmFicywgcF9pcmFicy0+aWNsZWFyX2JpdHNudW0sICZqKTsKKworCQlpZiAoaiAhPSAwKQorCQkJYnVmW2srK10gPSAoY2hhcikoaiA8PCBzaGlmdCk7CisJCXN0YXRfYml0c19wdHItPmxhc3RfdW5pdF9iaXRzICs9IHNoaWZ0OworCX0KKwkqbGVuZ3RoID0gazsKKwlyZXR1cm4gazsKK30KKworLyp1bnNpZ25lZCBjaGFyIHRtcF9idWZbTUFYX0NPREVEX0ZSQU1FX1NJWkVdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDY0KSkpOyovCisvKnVuc2lnbmVkIGNoYXIgdG1wX2J1ZltNQVhfQ09ERURfRlJBTUVfU0laRV0gX19hbGlnbmVkKDY0KTsqLworaW50IGhlYWRlcih2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwlpbnQgc3RhcnRjb2RlcG9zLCBsZW5ndGg7CisKKwl1bnNpZ25lZCBjaGFyICp0bXBfYnVmOworCisJdG1wX2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopYXZzcF9oZWFwX2FkcjsKKworCWJ1ZiA9ICZ0bXBfYnVmWzBdOworCXdoaWxlICgxKSB7CisJCXN0YXJ0X2NvZGVwb3NpdGlvbiA9IGdldF9vbmV1bml0KGJ1ZiwgJnN0YXJ0Y29kZXBvcywgJmxlbmd0aCk7CisKKwkJc3dpdGNoIChidWZbc3RhcnRjb2RlcG9zXSkgeworCQljYXNlIFNFUVVFTkNFX0hFQURFUl9DT0RFOgorCQkJaW9fcHJpbnRmKAorCQkJCQkiIyBTRVFVRU5DRV9IRUFERVJfQ09ERSAoMHglMDJ4KSBmb3VuZCBhdCBvZmZzZXQgJWQgKDB4JXgpXG4iLAorCQkJCQlidWZbc3RhcnRjb2RlcG9zXSwgc3RhcnRjb2RlX29mZnNldCwKKwkJCQkJc3RhcnRjb2RlX29mZnNldCk7CisJCQlicmVhazsKKwkJY2FzZSBFWFRFTlNJT05fU1RBUlRfQ09ERToKKwkJCWlvX3ByaW50ZigKKwkJCQkJIiMgRVhURU5TSU9OX1NUQVJUX0NPREUgKDB4JTAyeCkgZm91bmQgYXQgb2Zmc2V0ICVkICgweCV4KVxuIiwKKwkJCQkJYnVmW3N0YXJ0Y29kZXBvc10sIHN0YXJ0Y29kZV9vZmZzZXQsCisJCQkJCXN0YXJ0Y29kZV9vZmZzZXQpOworCQkJYnJlYWs7CisJCWNhc2UgVVNFUl9EQVRBX1NUQVJUX0NPREU6CisJCQlpb19wcmludGYoCisJCQkJCSIjIFVTRVJfREFUQV9TVEFSVF9DT0RFICgweCUwMngpIGZvdW5kIGF0IG9mZnNldCAlZCAoMHgleClcbiIsCisJCQkJCWJ1ZltzdGFydGNvZGVwb3NdLCBzdGFydGNvZGVfb2Zmc2V0LAorCQkJCQlzdGFydGNvZGVfb2Zmc2V0KTsKKwkJCWJyZWFrOworCQljYXNlIFZJREVPX0VESVRfQ09ERToKKwkJCWlvX3ByaW50ZigKKwkJCQkJIiMgVklERU9fRURJVF9DT0RFICgweCUwMngpIGZvdW5kIGF0IG9mZnNldCAlZCAoMHgleClcbiIsCisJCQkJCWJ1ZltzdGFydGNvZGVwb3NdLCBzdGFydGNvZGVfb2Zmc2V0LAorCQkJCQlzdGFydGNvZGVfb2Zmc2V0KTsKKwkJCWJyZWFrOworCQljYXNlIElfUElDVFVSRV9TVEFSVF9DT0RFOgorCQkJaW9fcHJpbnRmKAorCQkJCQkiIyBJX1BJQ1RVUkVfU1RBUlRfQ09ERSAoMHglMDJ4KSBmb3VuZCBhdCBvZmZzZXQgJWQgKDB4JXgpXG4iLAorCQkJCQlidWZbc3RhcnRjb2RlcG9zXSwgc3RhcnRjb2RlX29mZnNldCwKKwkJCQkJc3RhcnRjb2RlX29mZnNldCk7CisJCQlicmVhazsKKwkJY2FzZSBQQl9QSUNUVVJFX1NUQVJUX0NPREU6CisJCQlpb19wcmludGYoCisJCQkJCSIjIFBCX1BJQ1RVUkVfU1RBUlRfQ09ERSAoMHglMDJ4KSBmb3VuZCBhdCBvZmZzZXQgJWQgKDB4JXgpXG4iLAorCQkJCQlidWZbc3RhcnRjb2RlcG9zXSwgc3RhcnRjb2RlX29mZnNldCwKKwkJCQkJc3RhcnRjb2RlX29mZnNldCk7CisJCQlicmVhazsKKwkJY2FzZSBTRVFVRU5DRV9FTkRfQ09ERToKKwkJCWlvX3ByaW50ZigKKwkJCQkJIiMgU0VRVUVOQ0VfRU5EX0NPREUgKDB4JTAyeCkgZm91bmQgYXQgb2Zmc2V0ICVkICgweCV4KVxuIiwKKwkJCQkJYnVmW3N0YXJ0Y29kZXBvc10sIHN0YXJ0Y29kZV9vZmZzZXQsCisJCQkJCXN0YXJ0Y29kZV9vZmZzZXQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpb19wcmludGYoCisJCQkJCSIjIFNMSUNFX1NUQVJUX0NPREUgKDB4JTAyeCkgZm91bmQgYXQgb2Zmc2V0ICVkICgweCV4KVxuIiwKKwkJCQkJYnVmW3N0YXJ0Y29kZXBvc10sIHN0YXJ0Y29kZV9vZmZzZXQsCisJCQkJCXN0YXJ0Y29kZV9vZmZzZXQpOworI2lmIDAKKwkJCWlvX3ByaW50ZigiVkxEX01FTV9WSUZJRk9fU1RBUlRfUFRSICV4XHJcbiIsCisJCQkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19TVEFSVF9QVFIpKTsKKwkJCWlvX3ByaW50ZigiVkxEX01FTV9WSUZJRk9fQ1VSUl9QVFIgJXhcclxuIiwKKwkJCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0NVUlJfUFRSKSk7CisJCQlpb19wcmludGYoIlZMRF9NRU1fVklGSUZPX0VORF9QVFIgJXhcclxuIiwKKwkJCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0VORF9QVFIpKTsKKwkJCWlvX3ByaW50ZigiVkxEX01FTV9WSUZJRk9fV1AgJXhcclxuIgorCQkJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApKTsKKwkJCWlvX3ByaW50ZigiVkxEX01FTV9WSUZJRk9fUlAgJXhcclxuIiwKKwkJCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSk7CisJCQlpb19wcmludGYoIlZMRF9NRU1fVkJVRl9SRF9QVFIgJXhcclxuIgorCQkJCQlSRUFEX1ZSRUcoVkxEX01FTV9WQlVGX1JEX1BUUikpOworCQkJaW9fcHJpbnRmKCJWTERfTUVNX1ZJRklGT19CVUZfQ05UTCAleFxyXG4iLAorCQkJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fQlVGX0NOVEwpKTsKKwkJCWlvX3ByaW50ZigiUEFSU0VSX1ZJREVPX0hPTEUgJXhcclxuIiwKKwkJCQkJUkVBRF9NUEVHX1JFRyhQQVJTRVJfVklERU9fSE9MRSkpOworI2VuZGlmCisJCQlpZiAoKGJ1ZltzdGFydGNvZGVwb3NdID49IFNMSUNFX1NUQVJUX0NPREVfTUlOCisJCQkJJiYgYnVmW3N0YXJ0Y29kZXBvc10KKwkJCQk8PSBTTElDRV9TVEFSVF9DT0RFX01BWCkKKwkJCQkmJiAoKCFpbWctPnNlcV9oZWFkZXJfaW5kaWNhdGUpCisJCQkJfHwgKGltZy0+dHlwZSA9PSBCX0lNRworCQkJCSYmIGltZy0+Yl9kaXNjYXJkX2ZsYWcKKwkJCQk9PSAxCisJCQkJJiYgIWltZy0+bm9fZm9yd2FyZF9yZWZlcmVuY2UpKSkgeworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChidWZbc3RhcnRjb2RlcG9zXSA+PSBTTElDRV9TVEFSVF9DT0RFX01JTikgeworCisJCQkJZmlyc3Rfc2xpY2VfbGVuZ3RoID0gbGVuZ3RoOworCQkJCWZpcnN0X3NsaWNlX3N0YXJ0cG9zID0gc3RhcnRjb2RlcG9zOworCisJCQkJdGVtcF9zbGljZV9idWYgPSAmdG1wX2J1ZlswXTsKKwkJCQlyZXR1cm4gU09QOworCQkJfSBlbHNlIHsKKwkJCQlpb19wcmludGYoIkNhbid0IGZpbmQgc3RhcnQgY29kZSIpOworCQkJCXJldHVybiAtRU9TOworCQkJfQorCQl9CisJfQorCit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246QWxsb2NhdGVzIGEgQml0c3RyZWFtCisgKiBJbnB1dDoKKyAqIE91dHB1dDphbGxvY2F0ZWQgQml0c3RyZWFtIHBvaW50CisgKiBSZXR1cm46CisgKiBBdHRlbnRpb246CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdHJ1Y3QgYml0c3RyZWFtX3MgKmFsbG9jX2JpdHN0cmVhbSh2b2lkKQoreworCXN0cnVjdCBiaXRzdHJlYW1fcyAqYml0c3RyZWFtOworCisJYml0c3RyZWFtID0gKHN0cnVjdCBiaXRzdHJlYW1fcyAqKWxvY2FsX2FsbG9jKDEsCisJCXNpemVvZihzdHJ1Y3QgYml0c3RyZWFtX3MpKTsKKwlpZiAoYml0c3RyZWFtID09IE5VTEwpIHsKKwkJaW9fcHJpbnRmKAorCQkJIkFsbG9jQml0c3RyZWFtOiBNZW1vcnkgYWxsb2NhdGlvbiBmb3IgQml0c3RyZWFtIGZhaWxlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYml0c3RyZWFtLT5zdHJlYW1fYnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKilsb2NhbF9hbGxvYygKKwkJCU1BWF9DT0RFRF9GUkFNRV9TSVpFLAorCQkJc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKTsKKwlpZiAoYml0c3RyZWFtLT5zdHJlYW1fYnVmZmVyID09IE5VTEwpIHsKKwkJaW9fcHJpbnRmKAorCQkJCSJBbGxvY0JpdHN0cmVhbTogTWVtb3J5IGFsbG9jYXRpb24gZm9yIHN0cmVhbUJ1ZmZlciBmYWlsZWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGJpdHN0cmVhbTsKK30KKwordm9pZCBiaWFyaV9pbml0X2NvbnRleHRfbG9nYWMoc3RydWN0IGJpX2NvbnRleHRfdHlwZV9zICpjdHgpCit7CisJY3R4LT5MR19QTVBTID0gKFFVQVJURVIgPDwgTEdfUE1QU19TSElGVE5PKSAtIDE7CisJY3R4LT5NUFMgPSAwOworCWN0eC0+Y3ljbm8gPSAwOworfQorCisjZGVmaW5lIEJJQVJJX0NUWF9JTklUMV9MT0coamosIGN0eClcCit7XAorCWZvciAoaiA9IDA7IGogPCBqajsgaisrKVwKKwkJYmlhcmlfaW5pdF9jb250ZXh0X2xvZ2FjKCYoY3R4W2pdKSk7XAorfQorCisjZGVmaW5lIEJJQVJJX0NUWF9JTklUMl9MT0coaWksIGpqLCBjdHgpXAore1wKKwlmb3IgKGkgPSAwOyBpIDwgaWk7IGkrKylcCisJCWZvciAoaiA9IDA7IGogPCBqajsgaisrKVwKKwkJCWJpYXJpX2luaXRfY29udGV4dF9sb2dhYygmKGN0eFtpXVtqXSkpO1wKK30KKworI2RlZmluZSBCSUFSSV9DVFhfSU5JVDNfTE9HKGlpLCBqaiwga2ssIGN0eClcCit7XAorCWZvciAoaSA9IDA7IGkgPCBpaTsgaSsrKVwKKwkJZm9yIChqID0gMDsgaiA8IGpqOyBqKyspXAorCQkJZm9yIChrID0gMDsgayA8IGtrOyBrKyspXAorCQkJCWJpYXJpX2luaXRfY29udGV4dF9sb2dhYygmKGN0eFtpXVtqXVtrXSkpO1wKK30KKworI2RlZmluZSBCSUFSSV9DVFhfSU5JVDRfTE9HKGlpLCBqaiwga2ssIGxsLCBjdHgpXAore1wKKwlmb3IgKGkgPSAwOyBpIDwgaWk7IGkrKylcCisJCWZvciAoaiA9IDA7IGogPCBqajsgaisrKVwKKwkJCWZvciAoayA9IDA7IGsgPCBrazsgaysrKVwKKwkJCQlmb3IgKGwgPSAwOyBsIDwgbGw7IGwrKylcCisJCQkJCWJpYXJpX2luaXRfY29udGV4dF9sb2dhY1wKKwkJCQkJKCYoY3R4W2ldW2pdW2tdW2xdKSk7XAorfQorCit2b2lkIGluaXRfY29udGV4dHMoc3RydWN0IGltZ19wYXIgKmltZykKK3sKKwlzdHJ1Y3QgbW90aW9uX2luZm9fY29udGV4dHNfcyAqbWMgPSBpbWctPmN1cnJlbnRfc2xpY2UtPm1vdF9jdHg7CisJc3RydWN0IHRleHR1cmVfaW5mb19jb250ZXh0cyAqdGMgPSBpbWctPmN1cnJlbnRfc2xpY2UtPnRleF9jdHg7CisJaW50IGksIGo7CisKKyNpZmRlZiBEVU1QX0RFQlVHCisJaWYgKGF2c19nZXRfZGVidWdfZmxhZygpICYgU0xJQ0VfSU5GT19EVU1QKQorCQlpb19wcmludGYoIiAtLS0tIGluaXRfY29udGV4dHMgLS0tLVxuIik7CisjZW5kaWYKKworCUJJQVJJX0NUWF9JTklUMl9MT0coMywgTlVNX01CX1RZUEVfQ1RYLCBtYy0+bWJfdHlwZV9jb250ZXh0cyk7CisJQklBUklfQ1RYX0lOSVQyX0xPRygyLCBOVU1fQjhfVFlQRV9DVFgsIG1jLT5iOF90eXBlX2NvbnRleHRzKTsKKwlCSUFSSV9DVFhfSU5JVDJfTE9HKDIsIE5VTV9NVl9SRVNfQ1RYLCBtYy0+bXZfcmVzX2NvbnRleHRzKTsKKwlCSUFSSV9DVFhfSU5JVDJfTE9HKDIsIE5VTV9SRUZfTk9fQ1RYLCBtYy0+cmVmX25vX2NvbnRleHRzKTsKKwlCSUFSSV9DVFhfSU5JVDFfTE9HKE5VTV9ERUxUQV9RUF9DVFgsIG1jLT5kZWx0YV9xcF9jb250ZXh0cyk7CisJQklBUklfQ1RYX0lOSVQxX0xPRyhOVU1fTUJfQUZGX0NUWCwgbWMtPm1iX2FmZl9jb250ZXh0cyk7CisKKwlCSUFSSV9DVFhfSU5JVDFfTE9HKE5VTV9JUFJfQ1RYLCB0Yy0+aXByX2NvbnRleHRzKTsKKwlCSUFSSV9DVFhfSU5JVDFfTE9HKE5VTV9DSVBSX0NUWCwgdGMtPmNpcHJfY29udGV4dHMpOworCUJJQVJJX0NUWF9JTklUMl9MT0coMywgTlVNX0NCUF9DVFgsIHRjLT5jYnBfY29udGV4dHMpOworCUJJQVJJX0NUWF9JTklUMl9MT0coTlVNX0JMT0NLX1RZUEVTLCBOVU1fQkNCUF9DVFgsIHRjLT5iY2JwX2NvbnRleHRzKTsKKwlCSUFSSV9DVFhfSU5JVDJfTE9HKE5VTV9CTE9DS19UWVBFUywgTlVNX09ORV9DVFgsIHRjLT5vbmVfY29udGV4dHMpOworCUJJQVJJX0NUWF9JTklUMl9MT0coTlVNX0JMT0NLX1RZUEVTLCBOVU1fQUJTX0NUWCwgdGMtPmFic19jb250ZXh0cyk7CisJQklBUklfQ1RYX0lOSVQyX0xPRyhOVU1fQkxPQ0tfVFlQRVMsIE5VTV9NQVBfQ1RYLCB0Yy0+ZmxkX21hcF9jb250ZXh0cyk7CisJQklBUklfQ1RYX0lOSVQyX0xPRyhOVU1fQkxPQ0tfVFlQRVMsIE5VTV9MQVNUX0NUWCwKKwkJCXRjLT5mbGRfbGFzdF9jb250ZXh0cyk7CisJQklBUklfQ1RYX0lOSVQyX0xPRyhOVU1fQkxPQ0tfVFlQRVMsIE5VTV9NQVBfQ1RYLCB0Yy0+bWFwX2NvbnRleHRzKTsKKwlCSUFSSV9DVFhfSU5JVDJfTE9HKE5VTV9CTE9DS19UWVBFUywgTlVNX0xBU1RfQ1RYLCB0Yy0+bGFzdF9jb250ZXh0cyk7CisjaWZkZWYgVEVTVF9XRUlHSFRJTkdfQUVDCisJYmlhcmlfaW5pdF9jb250ZXh0X2xvZ2FjKCZtYy0+bWJfd2VpZ2h0aW5nX3ByZWQpOworI2VuZGlmCit9CisKKy8qIQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogXGJyaWVmCisgKiAgICBBbGxvY2F0aW9uIG9mIGNvbnRleHRzIG1vZGVscyBmb3IgdGhlIG1vdGlvbiBpbmZvCisgKiAgICB1c2VkIGZvciBhcml0aG1ldGljIGRlY29kaW5nCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdHJ1Y3QgbW90aW9uX2luZm9fY29udGV4dHNfcyAqY3JlYXRlX2NvbnRleHRzX21vdGlvbmluZm8odm9pZCkKK3sKKwlzdHJ1Y3QgbW90aW9uX2luZm9fY29udGV4dHNfcyAqZGVjb19jdHg7CisKKwlkZWNvX2N0eCA9IChzdHJ1Y3QgbW90aW9uX2luZm9fY29udGV4dHNfcyAqKWxvY2FsX2FsbG9jKDEsCisJCQlzaXplb2Yoc3RydWN0IG1vdGlvbl9pbmZvX2NvbnRleHRzX3MpKTsKKwlpZiAoZGVjb19jdHggPT0gTlVMTCkKKwkJbm9fbWVtX2V4aXQoImNyZWF0ZV9jb250ZXh0c19tb3Rpb25pbmZvOiBkZWNvX2N0eCIpOworCisJcmV0dXJuIGRlY29fY3R4OworfQorCisvKiEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFxicmllZgorICogICAgQWxsb2NhdGVzIG9mIGNvbnRleHRzIG1vZGVscyBmb3IgdGhlIHRleHR1cmUgaW5mbworICogICAgdXNlZCBmb3IgYXJpdGhtZXRpYyBkZWNvZGluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdHJ1Y3QgdGV4dHVyZV9pbmZvX2NvbnRleHRzICpjcmVhdGVfY29udGV4dHNfdGV4dHVyZWluZm8odm9pZCkKK3sKKwlzdHJ1Y3QgdGV4dHVyZV9pbmZvX2NvbnRleHRzICpkZWNvX2N0eDsKKworCWRlY29fY3R4ID0gKHN0cnVjdCB0ZXh0dXJlX2luZm9fY29udGV4dHMgKilsb2NhbF9hbGxvYygxLAorCQkJc2l6ZW9mKHN0cnVjdCB0ZXh0dXJlX2luZm9fY29udGV4dHMpKTsKKwlpZiAoZGVjb19jdHggPT0gTlVMTCkKKwkJbm9fbWVtX2V4aXQoImNyZWF0ZV9jb250ZXh0c190ZXh0dXJlaW5mbzogZGVjb19jdHgiKTsKKworCXJldHVybiBkZWNvX2N0eDsKK30KKworc3RydWN0IGRhdGFwYXJ0aXRpb24gKmFsbG9jX3BhcnRpdGlvbihpbnQgbikKK3sKKwlzdHJ1Y3QgZGF0YXBhcnRpdGlvbiAqcGFydF9hcnIsICpkYXRhcGFydDsKKwlpbnQgaTsKKworCXBhcnRfYXJyID0KKwkoc3RydWN0IGRhdGFwYXJ0aXRpb24gKilsb2NhbF9hbGxvYyhuLCBzaXplb2Yoc3RydWN0IGRhdGFwYXJ0aXRpb24pKTsKKwlpZiAocGFydF9hcnIgPT0gTlVMTCkgeworCQlub19tZW1fZXhpdCgKKwkJCQkiYWxsb2NfcGFydGl0aW9uOiBNZW1vcnkgYWxsb2NhdGlvbiBmb3IgRGF0YSBQYXJ0aXRpb24gZmFpbGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKworI2lmIExJV1JfRklYCisJcGFydF9hcnJbMF0uYml0c3RyZWFtID0gTlVMTDsKKyNlbHNlCisJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQlkYXRhcGFydCA9ICYocGFydF9hcnJbaV0pOworCQlkYXRhcGFydC0+Yml0c3RyZWFtID0gKHN0cnVjdCBiaXRzdHJlYW1fcyAqKWxvY2FsX2FsbG9jKDEsCisJCQkJc2l6ZW9mKHN0cnVjdCBiaXRzdHJlYW1fcykpOworCQlpZiAoZGF0YXBhcnQtPmJpdHN0cmVhbSA9PSBOVUxMKSB7CisJCQlub19tZW1fZXhpdCgKKwkJCQkJImFsbG9jX3BhcnRpdGlvbjogTWVtb3J5IGFsbG9jYXRpb24gZm9yIEJpdHN0cmVhbSBmYWlsZWQiKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorI2VuZGlmCisJcmV0dXJuIHBhcnRfYXJyOworfQorCitpbnQgbWFsbG9jX3NsaWNlKHN0cnVjdCBpbWdfcGFyICppbWcpCit7CisJc3RydWN0IHNsaWNlX3MgKmN1cnJzbGljZTsKKworCWltZy0+Y3VycmVudF9zbGljZSA9CisJKHN0cnVjdCBzbGljZV9zICopbG9jYWxfYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBzbGljZV9zKSk7CisJY3VycnNsaWNlID0gaW1nLT5jdXJyZW50X3NsaWNlOworCWlmIChjdXJyc2xpY2UgPT0gTlVMTCkgeworCQlub19tZW1fZXhpdCgKKwkJCSJNZW1vcnkgYWxsb2NhdGlvbiBmb3Igc3RydWN0IHNsaWNlX3MgZGF0YXN0cnVjdCBGYWlsZWQiCisJCQkpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKDEpIHsKKworCQljdXJyc2xpY2UtPm1vdF9jdHggPSBjcmVhdGVfY29udGV4dHNfbW90aW9uaW5mbygpOworCQlpZiAoY3VycnNsaWNlLT5tb3RfY3R4ID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKworCQljdXJyc2xpY2UtPnRleF9jdHggPSBjcmVhdGVfY29udGV4dHNfdGV4dHVyZWluZm8oKTsKKwkJaWYgKGN1cnJzbGljZS0+dGV4X2N0eCA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJfQorI2lmIExJV1JfRklYCisJY3VycnNsaWNlLT5tYXhfcGFydF9uciA9IDE7CisjZWxzZQorCWN1cnJzbGljZS0+bWF4X3BhcnRfbnIgPSAzOworI2VuZGlmCisJY3VycnNsaWNlLT5wYXJ0X2FyciA9IGFsbG9jX3BhcnRpdGlvbihjdXJyc2xpY2UtPm1heF9wYXJ0X25yKTsKKwlpZiAoY3VycnNsaWNlLT5wYXJ0X2FyciA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKwordm9pZCBpbml0KHN0cnVjdCBpbWdfcGFyICppbWcpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCWltZy0+cXVhZFtpXSA9IGkgKiBpOworfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOkFsbG9jYXRlIDJEIG1lbW9yeSBhcnJheSAtPiBpbnQgYXJyYXkyRFtyb3dzXVtjb2x1bW5zXQorICogSW5wdXQ6CisgKiBPdXRwdXQ6IG1lbW9yeSBzaXplIGluIGJ5dGVzCisgKiBSZXR1cm46CisgKiBBdHRlbnRpb246CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK2ludCBnZXRfbWVtMkRpbnQoaW50ICoqKmFycmF5MkQsIGludCByb3dzLCBpbnQgY29sdW1ucykKK3sKKwlpbnQgaTsKKworCSphcnJheTJEID0gKGludCAqKilsb2NhbF9hbGxvYyhyb3dzLCBzaXplb2YoaW50ICopKTsKKwlpZiAoKmFycmF5MkQgPT0gTlVMTCkgeworCQlub19tZW1fZXhpdCgiZ2V0X21lbTJEaW50OiBhcnJheTJEIik7CisJCXJldHVybiAtMTsKKwl9CisJKCphcnJheTJEKVswXSA9IChpbnQgKilsb2NhbF9hbGxvYyhyb3dzICogY29sdW1ucywgc2l6ZW9mKGludCkpOworCWlmICgoKmFycmF5MkQpWzBdID09IE5VTEwpIHsKKwkJbm9fbWVtX2V4aXQoImdldF9tZW0yRGludDogYXJyYXkyRCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZm9yIChpID0gMTsgaSA8IHJvd3M7IGkrKykKKwkJKCphcnJheTJEKVtpXSA9ICgqYXJyYXkyRClbaSAtIDFdICsgY29sdW1uczsKKworCXJldHVybiByb3dzICogY29sdW1ucyAqIHNpemVvZihpbnQpOworfQorCitpbnQgaW5pdGlhbF9kZWNvZGUodm9pZCkKK3sKKwlpbnQgaSwgajsKKwlpbnQgcmV0OworCWludCBpbWdfaGVpZ2h0ID0gKHZlcnRpY2FsX3NpemUgKyBpbWctPmF1dG9fY3JvcF9ib3R0b20pOworCWludCBtZW1vcnlfc2l6ZSA9IDA7CisKKwlyZXQgPSBtYWxsb2Nfc2xpY2UoaW1nKTsKKwlpZiAocmV0ID09IDApCisJCXJldHVybiAwOworCisJbWJfZGF0YSA9IChzdHJ1Y3QgbWFjcm9ibG9jayAqKWxvY2FsX2FsbG9jKAorCQkJKGltZy0+d2lkdGggLyBNQl9CTE9DS19TSVpFKQorCQkJKiAoaW1nX2hlaWdodCAvKnZlcnRpY2FsX3NpemUqLworCQkJLyBNQl9CTE9DS19TSVpFKSwgc2l6ZW9mKHN0cnVjdCBtYWNyb2Jsb2NrKSk7CisJaWYgKG1iX2RhdGEgPT0gTlVMTCkgeworCQlub19tZW1fZXhpdCgiaW5pdF9nbG9iYWxfYnVmZmVyczogbWJfZGF0YSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocHJvZ3Jlc3NpdmVfc2VxdWVuY2UpIHsKKwkJaW50IHNpemU7CisJCXNpemUgPSBnZXRfbWVtMkRpbnQoJihpbWctPmlwcmVkbW9kZSksCisJCQkJaW1nLT53aWR0aCAvIEI4X1NJWkUgKiAyICsgNCwKKwkJCQl2ZXJ0aWNhbF9zaXplIC8gQjhfU0laRSAqIDIgKyA0KTsKKwkJaWYgKHNpemUgPT0gLTEpCisJCQlyZXR1cm4gMDsKKworCQltZW1vcnlfc2l6ZSArPSBzaXplOworCX0gZWxzZSB7CisJCWludCBzaXplOworCQlzaXplID0gZ2V0X21lbTJEaW50KCYoaW1nLT5pcHJlZG1vZGUpLAorCQkJCWltZy0+d2lkdGggLyBCOF9TSVpFICogMiArIDQsCisJCQkJKHZlcnRpY2FsX3NpemUgKyAzMikgLyAoMiAqIEI4X1NJWkUpICogNCArIDQpOworCQlpZiAoc2l6ZSA9PSAtMSkKKwkJCXJldHVybiAwOworCisJCW1lbW9yeV9zaXplICs9IHNpemU7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGltZy0+d2lkdGggLyAoQjhfU0laRSkgKiAyICsgNDsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBpbWctPmhlaWdodCAvIChCOF9TSVpFKSAqIDIgKyA0OyBqKyspCisJCQlpbWctPmlwcmVkbW9kZVtpXVtqXSA9IC0xOworCX0KKworCWluaXQoaW1nKTsKKwlpbWctPm51bWJlciA9IDA7CisJaW1nLT50eXBlID0gSV9JTUc7CisJaW1nLT5pbWd0cl9sYXN0X3AgPSAwOworCWltZy0+aW1ndHJfbmV4dF9wID0gMDsKKworCWltZy0+bmV3X3NlcV9oZWFkZXJfZmxhZyA9IDE7CisJaW1nLT5uZXdfc2VxdWVuY2VfZmxhZyA9IDE7CisKKwlyZXR1cm4gMTsKK30KKwordm9pZCBhZWNfbmV3X3NsaWNlKHZvaWQpCit7CisJbGFzdF9kcXVhbnQgPSAwOworfQorCisvKiEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFxicmllZgorICogICAgSW5pdGlhbGl6ZXMgdGhlIERlY29kaW5nRW52aXJvbm1lbnQgZm9yIHRoZSBhcml0aG1ldGljIGNvZGVyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKwordm9pZCBhcmlkZWNvX3N0YXJ0X2RlY29kaW5nKHN0cnVjdCBkZWNvZGluZ19lbnZpcm9ubWVudF9zICpkZXAsCisJdW5zaWduZWQgY2hhciAqY3BpeGNvZGUsCisJCWludCBmaXJzdGJ5dGUsIGludCAqY3BpeGNvZGVfbGVuLCBpbnQgc2xpY2VfdHlwZSkKK3sKKworCWRjb2Rlc3RybSA9IGNwaXhjb2RlOworCWRjb2Rlc3RybV9sZW4gPSBjcGl4Y29kZV9sZW47CisJKmRjb2Rlc3RybV9sZW4gPSBmaXJzdGJ5dGU7CisKKwlzMSA9IDA7CisJdDEgPSBRVUFSVEVSIC0gMTsKKwl2YWx1ZV9zID0gMDsKKworCXZhbHVlX3QgPSAwOworCisJeworCQlpbnQgaTsKKworCQlkYml0c190b19nbyA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBCX0JJVFMgLSAxOyBpKyspIHsKKwkJCWlmICgtLWRiaXRzX3RvX2dvIDwgMCkKKwkJCQlnZXRfYnl0ZSgpOworCisJCQl2YWx1ZV90ID0gKHZhbHVlX3QgPDwgMSkKKwkJCQkJfCAoKGRidWZmZXIgPj4gZGJpdHNfdG9fZ28pICYgMHgwMSk7CisJCX0KKwl9CisKKwl3aGlsZSAodmFsdWVfdCA8IFFVQVJURVIpIHsKKwkJaWYgKC0tZGJpdHNfdG9fZ28gPCAwKQorCQkJZ2V0X2J5dGUoKTsKKworCQl2YWx1ZV90ID0gKHZhbHVlX3QgPDwgMSkgfCAoKGRidWZmZXIgPj4gZGJpdHNfdG9fZ28pICYgMHgwMSk7CisJCXZhbHVlX3MrKzsKKwl9CisJdmFsdWVfdCA9IHZhbHVlX3QgJiAweGZmOworCisJZGVjX2ZpbmFsID0gZGVjX2J5cGFzcyA9IDA7CisKKworCit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246Q2hlY2tzIHRoZSBhdmFpbGFiaWxpdHkgb2YgbmVpZ2hib3JpbmcgbWFjcm9ibG9ja3Mgb2YKKyB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGZvciBwcmVkaWN0aW9uIGFuZCBjb250ZXh0IGRldGVybWluYXRpb247CisgbWFya3MgdGhlIHVuYXZhaWxhYmxlIE1CcyBmb3IgaW50cmEgcHJlZGljdGlvbiBpbiB0aGUKKyBpcHJlZG1vZGUtYXJyYXkgYnkgLTEuIE9ubHkgbmVpZ2hib3JpbmcgTUJzIGluIHRoZSBjYXVzYWwKKyBwYXN0IG9mIHRoZSBjdXJyZW50IE1CIGFyZSBjaGVja2VkLgorICogSW5wdXQ6CisgKiBPdXRwdXQ6CisgKiBSZXR1cm46CisgKiBBdHRlbnRpb246CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK3ZvaWQgY2hlY2thdmFpbGFiaWxpdHlvZm5laWdoYm9ycyhzdHJ1Y3QgaW1nX3BhciAqaW1nKQoreworCWludCBpLCBqOworCWNvbnN0IGludCBtYl93aWR0aCA9IGltZy0+d2lkdGggLyBNQl9CTE9DS19TSVpFOworCWNvbnN0IGludCBtYl9uciA9IGltZy0+Y3VycmVudF9tYl9ucjsKKwlzdHJ1Y3QgbWFjcm9ibG9jayAqY3Vycl9tYiA9ICZtYl9kYXRhW21iX25yXTsKKwlpbnQgY2hlY2tfdmFsdWU7CisJaW50IHJlbW92ZV9wcmVkaWN0aW9uOworCisJY3Vycl9tYi0+bWJfYXZhaWxhYmxlX3VwID0gTlVMTDsKKwljdXJyX21iLT5tYl9hdmFpbGFibGVfbGVmdCA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQlmb3IgKGogPSAwOyBqIDwgMzsgaisrKQorCQkJbWJfZGF0YVttYl9ucl0ubWJfYXZhaWxhYmxlW2ldW2pdID0gTlVMTDsKKworCW1iX2RhdGFbbWJfbnJdLm1iX2F2YWlsYWJsZVsxXVsxXSA9IGN1cnJfbWI7CisKKwlpZiAoaW1nLT5waXhfeCA+PSBNQl9CTE9DS19TSVpFKSB7CisJCXJlbW92ZV9wcmVkaWN0aW9uID0gY3Vycl9tYi0+c2xpY2VfbnIKKwkJCQkhPSBtYl9kYXRhW21iX25yIC0gMV0uc2xpY2VfbnI7CisKKwkJaWYgKHJlbW92ZV9wcmVkaWN0aW9uKQorCisJCXsKKworCQkJaW1nLT5pcHJlZG1vZGVbKGltZy0+YmxvY2tfeCArIDEpICogMiAtIDFdWyhpbWctPmJsb2NrX3kKKwkJCQkJKyAxKSAqIDJdID0gLTE7CisJCQlpbWctPmlwcmVkbW9kZVsoaW1nLT5ibG9ja194ICsgMSkgKiAyIC0gMV1bKGltZy0+YmxvY2tfeQorCQkJCQkrIDEpICogMiArIDFdID0gLTE7CisJCQlpbWctPmlwcmVkbW9kZVsoaW1nLT5ibG9ja194ICsgMSkgKiAyIC0gMV1bKGltZy0+YmxvY2tfeQorCQkJCQkrIDIpICogMl0gPSAtMTsKKwkJCWltZy0+aXByZWRtb2RlWyhpbWctPmJsb2NrX3ggKyAxKSAqIDIgLSAxXVsoaW1nLT5ibG9ja195CisJCQkJCSsgMikgKiAyICsgMV0gPSAtMTsKKwkJfQorCQlpZiAoIXJlbW92ZV9wcmVkaWN0aW9uKQorCQkJY3Vycl9tYi0+bWJfYXZhaWxhYmxlWzFdWzBdID0gJihtYl9kYXRhW21iX25yIC0gMV0pOworCisJfQorCisJY2hlY2tfdmFsdWUgPSAoaW1nLT5waXhfeSA+PSBNQl9CTE9DS19TSVpFKTsKKwlpZiAoY2hlY2tfdmFsdWUpIHsKKwkJcmVtb3ZlX3ByZWRpY3Rpb24gPSBjdXJyX21iLT5zbGljZV9ucgorCQkJCSE9IG1iX2RhdGFbbWJfbnIgLSBtYl93aWR0aF0uc2xpY2VfbnI7CisKKwkJaWYgKHJlbW92ZV9wcmVkaWN0aW9uKSB7CisJCQlpbWctPmlwcmVkbW9kZQorCQkJWyhpbWctPmJsb2NrX3ggKyAxKSAqIDJdWyhpbWctPmJsb2NrX3kgKyAxKQorCQkJCQkqIDIgLSAxXSA9IC0xOworCQkJaW1nLT5pcHJlZG1vZGVbKGltZy0+YmxvY2tfeCArIDEpICogMiArIDFdWyhpbWctPmJsb2NrX3kKKwkJCQkJKyAxKSAqIDIgLSAxXSA9IC0xOworCQkJaW1nLT5pcHJlZG1vZGVbKGltZy0+YmxvY2tfeCArIDEpICogMiArIDJdWyhpbWctPmJsb2NrX3kKKwkJCQkJKyAxKSAqIDIgLSAxXSA9IC0xOworCQkJaW1nLT5pcHJlZG1vZGVbKGltZy0+YmxvY2tfeCArIDEpICogMiArIDNdWyhpbWctPmJsb2NrX3kKKwkJCQkJKyAxKSAqIDIgLSAxXSA9IC0xOworCQl9CisKKwkJaWYgKCFyZW1vdmVfcHJlZGljdGlvbikgeworCQkJY3Vycl9tYi0+bWJfYXZhaWxhYmxlWzBdWzFdID0KKwkJCQkJJihtYl9kYXRhW21iX25yIC0gbWJfd2lkdGhdKTsKKwkJfQorCX0KKworCWlmIChpbWctPnBpeF95ID49IE1CX0JMT0NLX1NJWkUgJiYgaW1nLT5waXhfeCA+PSBNQl9CTE9DS19TSVpFKSB7CisJCXJlbW92ZV9wcmVkaWN0aW9uID0gY3Vycl9tYi0+c2xpY2VfbnIKKwkJCQkhPSBtYl9kYXRhW21iX25yIC0gbWJfd2lkdGggLSAxXS5zbGljZV9ucjsKKworCQlpZiAocmVtb3ZlX3ByZWRpY3Rpb24pIHsKKwkJCWltZy0+aXByZWRtb2RlW2ltZy0+YmxvY2tfeCAqIDIgKyAxXVtpbWctPmJsb2NrX3kgKiAyCisJCQkJCSsgMV0gPSAtMTsKKwkJfQorCQlpZiAoIXJlbW92ZV9wcmVkaWN0aW9uKSB7CisJCQljdXJyX21iLT5tYl9hdmFpbGFibGVbMF1bMF0gPSAmKG1iX2RhdGFbbWJfbnIgLSBtYl93aWR0aAorCQkJCQktIDFdKTsKKwkJfQorCX0KKworCWlmIChpbWctPnBpeF95ID49IE1CX0JMT0NLX1NJWkUKKwkJCSYmIGltZy0+cGl4X3ggPCAoaW1nLT53aWR0aCAtIE1CX0JMT0NLX1NJWkUpKSB7CisJCWlmIChjdXJyX21iLT5zbGljZV9uciA9PSBtYl9kYXRhW21iX25yIC0gbWJfd2lkdGggKyAxXS5zbGljZV9ucikKKwkJCWN1cnJfbWItPm1iX2F2YWlsYWJsZVswXVsyXSA9ICYobWJfZGF0YVttYl9uciAtIG1iX3dpZHRoCisJCQkJCSsgMV0pOworCX0KKworCWlmICgxKSB7CisJCWN1cnJfbWItPm1iYWRkcl9hID0gbWJfbnIgLSAxOworCQljdXJyX21iLT5tYmFkZHJfYiA9IG1iX25yIC0gaW1nLT5waWNfd2lkdGhfaW5tYnM7CisJCWN1cnJfbWItPm1iYWRkcl9jID0gbWJfbnIgLSBpbWctPnBpY193aWR0aF9pbm1icyArIDE7CisJCWN1cnJfbWItPm1iYWRkcl9kID0gbWJfbnIgLSBpbWctPnBpY193aWR0aF9pbm1icyAtIDE7CisKKwkJY3Vycl9tYi0+bWJhdmFpbF9hID0KKwkJKGN1cnJfbWItPm1iX2F2YWlsYWJsZVsxXVswXSAhPSBOVUxMKSA/IDEgOiAwOworCQljdXJyX21iLT5tYmF2YWlsX2IgPQorCQkoY3Vycl9tYi0+bWJfYXZhaWxhYmxlWzBdWzFdICE9IE5VTEwpID8gMSA6IDA7CisJCWN1cnJfbWItPm1iYXZhaWxfYyA9CisJCShjdXJyX21iLT5tYl9hdmFpbGFibGVbMF1bMl0gIT0gTlVMTCkgPyAxIDogMDsKKwkJY3Vycl9tYi0+bWJhdmFpbF9kID0KKwkJKGN1cnJfbWItPm1iX2F2YWlsYWJsZVswXVswXSAhPSBOVUxMKSA/IDEgOiAwOworCisJfQorCit9CisKK3ZvaWQgY2hlY2thdmFpbGFiaWxpdHlvZm5laWdoYm9yc2FlYyh2b2lkKQoreworCisJaW50IGksIGo7CisJY29uc3QgaW50IG1iX3dpZHRoID0gaW1nLT53aWR0aCAvIE1CX0JMT0NLX1NJWkU7CisJY29uc3QgaW50IG1iX25yID0gaW1nLT5jdXJyZW50X21iX25yOworCXN0cnVjdCBtYWNyb2Jsb2NrICpjdXJyX21iID0gJihtYl9kYXRhW21iX25yXSk7CisJaW50IGNoZWNrX3ZhbHVlOworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJZm9yIChqID0gMDsgaiA8IDM7IGorKykKKwkJCW1iX2RhdGFbbWJfbnJdLm1iX2F2YWlsYWJsZVtpXVtqXSA9IE5VTEw7CisJbWJfZGF0YVttYl9ucl0ubWJfYXZhaWxhYmxlWzFdWzFdID0gJihtYl9kYXRhW21iX25yXSk7CisKKwlpZiAoaW1nLT5waXhfeCA+PSBNQl9CTE9DS19TSVpFKSB7CisJCWludCByZW1vdmVfcHJlZGljdGlvbiA9IGN1cnJfbWItPnNsaWNlX25yCisJCQkJIT0gbWJfZGF0YVttYl9uciAtIDFdLnNsaWNlX25yOworCQlpZiAoIXJlbW92ZV9wcmVkaWN0aW9uKQorCQkJY3Vycl9tYi0+bWJfYXZhaWxhYmxlWzFdWzBdID0gJihtYl9kYXRhW21iX25yIC0gMV0pOworCX0KKworCWNoZWNrX3ZhbHVlID0gKGltZy0+cGl4X3kgPj0gTUJfQkxPQ0tfU0laRSk7CisJaWYgKGNoZWNrX3ZhbHVlKSB7CisJCWludCByZW1vdmVfcHJlZGljdGlvbiA9IGN1cnJfbWItPnNsaWNlX25yCisJCQkJIT0gbWJfZGF0YVttYl9uciAtIG1iX3dpZHRoXS5zbGljZV9ucjsKKworCQlpZiAoIXJlbW92ZV9wcmVkaWN0aW9uKSB7CisJCQljdXJyX21iLT5tYl9hdmFpbGFibGVbMF1bMV0gPQorCQkJCQkmKG1iX2RhdGFbbWJfbnIgLSBtYl93aWR0aF0pOworCQl9CisJfQorCisJaWYgKGltZy0+cGl4X3kgPj0gTUJfQkxPQ0tfU0laRSAmJiBpbWctPnBpeF94ID49IE1CX0JMT0NLX1NJWkUpIHsKKwkJaW50IHJlbW92ZV9wcmVkaWN0aW9uID0gY3Vycl9tYi0+c2xpY2VfbnIKKwkJCQkhPSBtYl9kYXRhW21iX25yIC0gbWJfd2lkdGggLSAxXS5zbGljZV9ucjsKKwkJaWYgKCFyZW1vdmVfcHJlZGljdGlvbikgeworCQkJY3Vycl9tYi0+bWJfYXZhaWxhYmxlWzBdWzBdID0gJihtYl9kYXRhW21iX25yIC0gbWJfd2lkdGgKKwkJCQkJLSAxXSk7CisJCX0KKwl9CisKKwlpZiAoaW1nLT5waXhfeSA+PSBNQl9CTE9DS19TSVpFCisJCQkmJiBpbWctPnBpeF94IDwgKGltZy0+d2lkdGggLSBNQl9CTE9DS19TSVpFKSkgeworCQlpZiAoY3Vycl9tYi0+c2xpY2VfbnIgPT0gbWJfZGF0YVttYl9uciAtIG1iX3dpZHRoICsgMV0uc2xpY2VfbnIpCisJCQljdXJyX21iLT5tYl9hdmFpbGFibGVbMF1bMl0gPSAmKG1iX2RhdGFbbWJfbnIgLSBtYl93aWR0aAorCQkJCQkrIDFdKTsKKwl9CisJY3Vycl9tYi0+bWJfYXZhaWxhYmxlX2xlZnQgPSBjdXJyX21iLT5tYl9hdmFpbGFibGVbMV1bMF07CisJY3Vycl9tYi0+bWJfYXZhaWxhYmxlX3VwID0gY3Vycl9tYi0+bWJfYXZhaWxhYmxlWzBdWzFdOworCWN1cnJfbWItPm1iYWRkcl9hID0gbWJfbnIgLSAxOworCWN1cnJfbWItPm1iYWRkcl9iID0gbWJfbnIgLSBpbWctPnBpY193aWR0aF9pbm1iczsKKwljdXJyX21iLT5tYmFkZHJfYyA9IG1iX25yIC0gaW1nLT5waWNfd2lkdGhfaW5tYnMgKyAxOworCWN1cnJfbWItPm1iYWRkcl9kID0gbWJfbnIgLSBpbWctPnBpY193aWR0aF9pbm1icyAtIDE7CisKKwljdXJyX21iLT5tYmF2YWlsX2EgPSAoY3Vycl9tYi0+bWJfYXZhaWxhYmxlWzFdWzBdICE9IE5VTEwpID8gMSA6IDA7CisJY3Vycl9tYi0+bWJhdmFpbF9iID0gKGN1cnJfbWItPm1iX2F2YWlsYWJsZVswXVsxXSAhPSBOVUxMKSA/IDEgOiAwOworCWN1cnJfbWItPm1iYXZhaWxfYyA9IChjdXJyX21iLT5tYl9hdmFpbGFibGVbMF1bMl0gIT0gTlVMTCkgPyAxIDogMDsKKwljdXJyX21iLT5tYmF2YWlsX2QgPSAoY3Vycl9tYi0+bWJfYXZhaWxhYmxlWzBdWzBdICE9IE5VTEwpID8gMSA6IDA7Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246aW5pdGlhbGl6ZXMgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaworICogSW5wdXQ6CisgKiBPdXRwdXQ6CisgKiBSZXR1cm46CisgKiBBdHRlbnRpb246CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK3ZvaWQgc3RhcnRfbWFjcm9ibG9jayhzdHJ1Y3QgaW1nX3BhciAqaW1nKQoreworCWludCBpLCBqLCBrLCBsOworCXN0cnVjdCBtYWNyb2Jsb2NrICpjdXJyX21iOworCisjaWZkZWYgQVZTUF9MT05HX0NBQkFDCisjZWxzZQorCisjZW5kaWYKKworCWN1cnJfbWIgPSAmbWJfZGF0YVtpbWctPmN1cnJlbnRfbWJfbnJdOworCisJLyogVXBkYXRlIGNvb3JkaW5hdGVzIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgKi8KKwlpbWctPm1iX3ggPSAoaW1nLT5jdXJyZW50X21iX25yKSAlIChpbWctPndpZHRoIC8gTUJfQkxPQ0tfU0laRSk7CisJaW1nLT5tYl95ID0gKGltZy0+Y3VycmVudF9tYl9ucikgLyAoaW1nLT53aWR0aCAvIE1CX0JMT0NLX1NJWkUpOworCisjaWZkZWYgRFVNUF9ERUJVRworCWlmIChhdnNfZ2V0X2RlYnVnX2ZsYWcoKSAmIE1CX05VTV9EVU1QKQorCQlpb19wcmludGYoIiAjQmVnaW4gTUIgOiAlZCwgKCV4LCAleCkgZXNfcHRyICVkXG4iLAorCQkJaW1nLT5jdXJyZW50X21iX25yLCBpbWctPm1iX3gsIGltZy0+bWJfeSwgZXNfcHRyKTsKKyNlbmRpZgorCisKKwl0b3RhbF9tYl9jb3VudCA9IHRvdGFsX21iX2NvdW50ICsgMTsKKworCS8qIERlZmluZSB2ZXJ0aWNhbCBwb3NpdGlvbnMgKi8KKwlpbWctPmJsb2NrX3kgPSBpbWctPm1iX3kgKiBCTE9DS19TSVpFIC8gMjsgLyogbHVtYSBibG9jayBwb3NpdGlvbiAqLworCWltZy0+YmxvY2s4X3kgPSBpbWctPm1iX3kgKiBCTE9DS19TSVpFIC8gMjsKKwlpbWctPnBpeF95ID0gaW1nLT5tYl95ICogTUJfQkxPQ0tfU0laRTsgLyogbHVtYSBtYWNyb2Jsb2NrIHBvc2l0aW9uICovCisJaWYgKGNocm9tYV9mb3JtYXQgPT0gMikKKwkJaW1nLT5waXhfY195ID0gaW1nLT5tYl95ICoKKwkJTUJfQkxPQ0tfU0laRTsgLyogY2hyb21hIG1hY3JvYmxvY2sgcG9zaXRpb24gKi8KKwllbHNlCisJCWltZy0+cGl4X2NfeSA9IGltZy0+bWJfeSAqCisJCU1CX0JMT0NLX1NJWkUgLyAyOyAvKiBjaHJvbWEgbWFjcm9ibG9jayBwb3NpdGlvbiAqLworCisJLyogRGVmaW5lIGhvcml6b250YWwgcG9zaXRpb25zICovCisJaW1nLT5ibG9ja194ID0gaW1nLT5tYl94ICogQkxPQ0tfU0laRSAvIDI7IC8qIGx1bWEgYmxvY2sgcG9zaXRpb24gKi8KKwlpbWctPmJsb2NrOF94ID0gaW1nLT5tYl94ICogQkxPQ0tfU0laRSAvIDI7CisJaW1nLT5waXhfeCA9IGltZy0+bWJfeCAqIE1CX0JMT0NLX1NJWkU7IC8qIGx1bWEgcGl4ZWwgcG9zaXRpb24gKi8KKwlpbWctPnBpeF9jX3ggPSBpbWctPm1iX3ggKgorCU1CX0JMT0NLX1NJWkUgLyAyOyAvKiBjaHJvbWEgcGl4ZWwgcG9zaXRpb24gKi8KKworCWNoZWNrYXZhaWxhYmlsaXR5b2ZuZWlnaGJvcnMoaW1nKTsKKworCS8qPCEqKioqKioqRURJVCBTVEFSVCBCWSBsemhhbmcgKioqKioqKioqKioqKioqKioqLworCisJaWYgKDEpCisJCWNoZWNrYXZhaWxhYmlsaXR5b2ZuZWlnaGJvcnNhZWMoKTsKKwkvKjwhKioqKioqKkVESVQgZW5kIEJZIGx6aGFuZyAqKioqKioqKioqKioqKioqKiovCisKKwljdXJyX21iLT5xcCA9IGltZy0+cXA7CisJY3Vycl9tYi0+bWJfdHlwZSA9IDA7CisJY3Vycl9tYi0+ZGVsdGFfcXVhbnQgPSAwOworCWN1cnJfbWItPmNicCA9IDA7CisJY3Vycl9tYi0+Y2JwX2JsayA9IDA7CisJY3Vycl9tYi0+Y19pcHJlZF9tb2RlID0gRENfUFJFRF84OworCWN1cnJfbWItPmNfaXByZWRfbW9kZV8yID0gRENfUFJFRF84OworCisJZm9yIChsID0gMDsgbCA8IDI7IGwrKykKKwkJZm9yIChqID0gMDsgaiA8IEJMT0NLX01VTFRJUExFOyBqKyspCisJCQlmb3IgKGkgPSAwOyBpIDwgQkxPQ0tfTVVMVElQTEU7IGkrKykKKwkJCQlmb3IgKGsgPSAwOyBrIDwgMjsgaysrKQorCQkJCQljdXJyX21iLT5tdmRbbF1bal1baV1ba10gPSAwOworCisJY3Vycl9tYi0+Y2JwX2JpdHMgPSAwOworCisJZm9yIChqID0gMDsgaiA8IE1CX0JMT0NLX1NJWkU7IGorKykKKwkJZm9yIChpID0gMDsgaSA8IE1CX0JMT0NLX1NJWkU7IGkrKykKKwkJCWltZy0+bTdbaV1bal0gPSAwOworCisJZm9yIChqID0gMDsgaiA8IDIgKiBCTE9DS19TSVpFOyBqKyspCisJCWZvciAoaSA9IDA7IGkgPCAyICogQkxPQ0tfU0laRTsgaSsrKSB7CisJCQlpbWctPm04WzBdW2ldW2pdID0gMDsKKwkJCWltZy0+bThbMV1baV1bal0gPSAwOworCQkJaW1nLT5tOFsyXVtpXVtqXSA9IDA7CisJCQlpbWctPm04WzNdW2ldW2pdID0gMDsKKwkJfQorCisJY3Vycl9tYi0+bGZfZGlzYWJsZSA9IDE7CisKKwlpbWctPndlaWdodGluZ19wcmVkaWN0aW9uID0gMDsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjppbml0IG1hY3JvYmxvY2sgSSBhbmQgUCBmcmFtZXMKKyAqIElucHV0OgorICogT3V0cHV0OgorICogUmV0dXJuOgorICogQXR0ZW50aW9uOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCit2b2lkIGluaXRfbWFjcm9ibG9jayhzdHJ1Y3QgaW1nX3BhciAqaW1nKQoreworCWludCBpLCBqOworCisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKwkJCWltZy0+aXByZWRtb2RlW2ltZy0+YmxvY2tfeCAqIDIgKyBpICsgMl1baW1nLT5ibG9ja195CisJCQkJCSogMiArIGogKyAyXSA9IC0xOworCQl9CisJfQorCit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246SW50ZXJwcmV0IHRoZSBtYiBtb2RlIGZvciBJLUZyYW1lcworICogSW5wdXQ6CisgKiBPdXRwdXQ6CisgKiBSZXR1cm46CisgKiBBdHRlbnRpb246CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK3ZvaWQgaW50ZXJwcmV0X21iX21vZGVfaShzdHJ1Y3QgaW1nX3BhciAqaW1nKQoreworCWludCBpOworCisJc3RydWN0IG1hY3JvYmxvY2sgKmN1cnJfbWIgPSAmbWJfZGF0YVtpbWctPmN1cnJlbnRfbWJfbnJdOworCWludCBudW0gPSA0OworCisJY3Vycl9tYi0+bWJfdHlwZSA9IEk4TUI7CisKKworCWN1cnJlbnRfbWJfaW50cmEgPSAxOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQljdXJyX21iLT5iOG1vZGVbaV0gPSBJQkxPQ0s7CisJCWN1cnJfbWItPmI4cGRpcltpXSA9IC0xOworCX0KKworCWZvciAoaSA9IG51bTsgaSA8IDQ7IGkrKykgeworCQljdXJyX21iLT5iOG1vZGVbaV0gPQorCQkJCWN1cnJfbWItPm1iX3R5cGVfMiA9PSBQOHg4ID8KKwkJCQkJCTQgOiBjdXJyX21iLT5tYl90eXBlXzI7CisJCWN1cnJfbWItPmI4cGRpcltpXSA9IDA7CisJfQorfQorCitjb25zdCBpbnQgcHJlZF80eDRbOV1bOV0gPSB7ezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LCB7MSwgMSwgMSwgMSwgMSwgMSwgMSwKKwkJMSwgMX0sIHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4fSwgezAsIDAsIDAsIDMsIDMsIDMsIDMsIDMsIDN9LAorCQl7MCwgMSwgNCwgNCwgNCwgNCwgNCwgNCwgNH0sIHswLCAxLCA1LCA1LCA1LCA1LCA1LCA1LCA1fSwgezAsIDAsCisJCQkJMCwgMCwgMCwgMCwgNiwgMCwgMH0sCisJCXswLCAxLCA3LCA3LCA3LCA3LCA3LCA3LCA3fSwgezAsIDAsIDAsIDAsIDQsIDUsIDYsIDcsIDh9CisKK307CisKK2NvbnN0IGludCBwcmVkXzR4NHRvOHg4WzldID0gezAsIDEsIDIsIDMsIDQsIDEsIDAsIDEsIDAKKworfTsKKworY29uc3QgaW50IHByZWRfOHg4dG80eDRbNV0gPSB7MCwgMSwgMiwgMywgNH07CisKK3ZvaWQgcmVhZF9pcHJlZF9ibG9ja19tb2RlcyhzdHJ1Y3QgaW1nX3BhciAqaW1nLCBpbnQgYjgpCit7CisJaW50IGJpLCBiaiwgZGVjOworCXN0cnVjdCBzeW50YXhlbGVtZW50IGN1cnJfc2U7CisJc3RydWN0IG1hY3JvYmxvY2sgKmN1cnJfbWI7CisJaW50IGoyOworCWludCBtb3N0cHJvYmFibGVpbnRyYXByZWRtb2RlOworCWludCB1cGludHJhcHJlZG1vZGU7CisJaW50IHVwcmlnaHRpbnRyYXByZWRtb2RlOworCWludCBsZWZ0aW50cmFwcmVkbW9kZTsKKwlpbnQgbGVmdGRvd25pbnRyYXByZWRtb2RlOworCWludCBpbnRyYWNocm9tYXByZWRtb2RlZmxhZzsKKworCXN0cnVjdCBzbGljZV9zICpjdXJyc2xpY2UgPSBpbWctPmN1cnJlbnRfc2xpY2U7CisJc3RydWN0IGRhdGFwYXJ0aXRpb24gKmRwOworCisJY3Vycl9tYiA9IG1iX2RhdGEgKyBpbWctPmN1cnJlbnRfbWJfbnI7CisJaW50cmFjaHJvbWFwcmVkbW9kZWZsYWcgPSBJU19JTlRSQShjdXJyX21iKTsKKworCWN1cnJfc2UudHlwZSA9IFNFX0lOVFJBUFJFRE1PREU7CisjaWYgVFJBQ0UKKwlzdHJuY3B5KGN1cnJfc2UudHJhY2VzdHJpbmcsICJJcHJlZCBNb2RlIiwgVFJBQ0VTVFJJTkdfU0laRSk7CisjZW5kaWYKKworCWlmIChiOCA8IDQpIHsKKwkJaWYgKGN1cnJfbWItPmI4bW9kZVtiOF0gPT0gSUJMT0NLKSB7CisJCQlpbnRyYWNocm9tYXByZWRtb2RlZmxhZyA9IDE7CisKKwkJCWlmICgxKSB7CisJCQkJZHAgPSAmKGN1cnJzbGljZS0+cGFydF9hcnJbMF0pOworCQkJCWN1cnJfc2UucmVhZGluZyA9IHJlYWRfaW50cmFwcmVkbW9kZV9hZWM7CisJCQkJZHAtPnJlYWRfc3ludGF4X2VsZW1lbnQoJmN1cnJfc2UsIGltZywgZHApOworCisJCQkJaWYgKGN1cnJfc2UudmFsdWUxID09IC0xKQorCQkJCQlwdXNoX2VzKDEsIDEpOworCQkJCWVsc2UKKwkJCQkJcHVzaF9lcyhjdXJyX3NlLnZhbHVlMSwgMyk7CisKKworCQkJfQorCQkJYmkgPSBpbWctPmJsb2NrX3ggKyAoYjggJiAxKTsKKwkJCWJqID0gaW1nLT5ibG9ja195ICsgKGI4IC8gMik7CisKKwkJCXVwaW50cmFwcmVkbW9kZSA9IGltZy0+aXByZWRtb2RlWyhiaSArIDEpICogMl1bKGJqKSAqIDIKKwkJCQkJKyAxXTsKKwkJCXVwcmlnaHRpbnRyYXByZWRtb2RlID0KKwkJCQkJaW1nLT5pcHJlZG1vZGVbKGJpICsgMSkgKiAyICsgMV1bKGJqKQorCQkJCQkJCSogMiArIDFdOworCQkJbGVmdGludHJhcHJlZG1vZGUgPQorCQkJCQlpbWctPmlwcmVkbW9kZVsoYmkpICogMiArIDFdWyhiaiArIDEpCisJCQkJCQkJKiAyXTsKKwkJCWxlZnRkb3duaW50cmFwcmVkbW9kZSA9IGltZy0+aXByZWRtb2RlWyhiaSkgKiAyICsgMV1bKGJqCisJCQkJCSsgMSkgKiAyICsgMV07CisKKwkJCWlmICgodXBpbnRyYXByZWRtb2RlIDwgMCkgfHwgKGxlZnRpbnRyYXByZWRtb2RlIDwgMCkpIHsKKwkJCQltb3N0cHJvYmFibGVpbnRyYXByZWRtb2RlID0gRENfUFJFRDsKKwkJCX0gZWxzZSBpZiAoKHVwaW50cmFwcmVkbW9kZSA8IE5PX0lOVFJBX1BNT0RFKQorCQkJCQkmJiAobGVmdGludHJhcHJlZG1vZGUgPAorCQkJCQkJTk9fSU5UUkFfUE1PREUpKSB7CisJCQkJbW9zdHByb2JhYmxlaW50cmFwcmVkbW9kZSA9CisJCQkJCXVwaW50cmFwcmVkbW9kZQorCQkJCQk8IGxlZnRpbnRyYXByZWRtb2RlID8KKwkJCQkJdXBpbnRyYXByZWRtb2RlIDoKKwkJCQkJbGVmdGludHJhcHJlZG1vZGU7CisJCQl9IGVsc2UgaWYgKHVwaW50cmFwcmVkbW9kZSA8IE5PX0lOVFJBX1BNT0RFKSB7CisJCQkJbW9zdHByb2JhYmxlaW50cmFwcmVkbW9kZSA9IHVwaW50cmFwcmVkbW9kZTsKKwkJCX0gZWxzZSBpZiAobGVmdGludHJhcHJlZG1vZGUgPCBOT19JTlRSQV9QTU9ERSkgeworCQkJCW1vc3Rwcm9iYWJsZWludHJhcHJlZG1vZGUgPSBsZWZ0aW50cmFwcmVkbW9kZTsKKwkJCX0gZWxzZSB7CisJCQkJbW9zdHByb2JhYmxlaW50cmFwcmVkbW9kZSA9CisJCQkJCXByZWRfNHg0W2xlZnRpbnRyYXByZWRtb2RlCisJCQkJCS0gSU5UUkFfUE1PREVfNHg0XVt1cGludHJhcHJlZG1vZGUKKwkJCQkJLSBJTlRSQV9QTU9ERV80eDRdOworCQkJCW1vc3Rwcm9iYWJsZWludHJhcHJlZG1vZGUgPQorCQkJCXByZWRfNHg0dG84eDhbbW9zdHByb2JhYmxlaW50cmFwcmVkbW9kZV07CisJCQl9CisKKworCisJCQlkZWMgPQorCQkJCQkoY3Vycl9zZS52YWx1ZTEgPT0gLTEpID8KKwkJCQkJbW9zdHByb2JhYmxlaW50cmFwcmVkbW9kZSA6CisJCQkJCWN1cnJfc2UudmFsdWUxCisJCQkJCSsgKGN1cnJfc2UudmFsdWUxCisJCQkJCT49IG1vc3Rwcm9iYWJsZWludHJhcHJlZG1vZGUpOworCisjaWZkZWYgRFVNUF9ERUJVRworCQkJaWYgKGF2c19nZXRfZGVidWdfZmxhZygpICYgTUJfSU5GT19EVU1QKQorCQkJCWlvX3ByaW50ZigiIC0gaXByZWRtb2RlWyVkXSA6ICVkXG4iLCBiOCwgZGVjKTsKKyNlbmRpZgorCisJCQlpbWctPmlwcmVkbW9kZVsoMSArIGJpKSAqIDJdWygxICsgYmopICogMl0gPSBkZWM7CisJCQlpbWctPmlwcmVkbW9kZVsoMSArIGJpKSAqIDIgKyAxXVsoMSArIGJqKSAqIDJdID0gZGVjOworCQkJaW1nLT5pcHJlZG1vZGVbKDEgKyBiaSkgKiAyXVsoMSArIGJqKSAqIDIgKyAxXSA9IGRlYzsKKwkJCWltZy0+aXByZWRtb2RlWygxICsgYmkpICogMiArIDFdWygxICsgYmopICogMiArIDFdID0KKwkJCQkJZGVjOworCisJCQlqMiA9IGJqOworCQl9CisJfSBlbHNlIGlmIChiOCA9PSA0ICYmIGN1cnJfbWItPmI4bW9kZVtiOCAtIDNdID09IElCTE9DSykgeworCisJCWN1cnJfc2UudHlwZSA9IFNFX0lOVFJBUFJFRE1PREU7CisjaWYgVFJBQ0UKKwkJc3RybmNweShjdXJyX3NlLnRyYWNlc3RyaW5nLAorCQkJIkNocm9tYSBpbnRyYSBwcmVkIG1vZGUiLCBUUkFDRVNUUklOR19TSVpFKTsKKyNlbmRpZgorCisJCWlmICgxKSB7CisJCQlkcCA9ICYoY3VycnNsaWNlLT5wYXJ0X2FyclswXSk7CisJCQljdXJyX3NlLnJlYWRpbmcgPSByZWFkX2NpcHJlZG1vZGVfYWVjOworCQkJZHAtPnJlYWRfc3ludGF4X2VsZW1lbnQoJmN1cnJfc2UsIGltZywgZHApOworCQl9IGVsc2UKKworCQl7CisJCX0KKwkJY3Vycl9tYi0+Y19pcHJlZF9tb2RlID0gY3Vycl9zZS52YWx1ZTE7CisKKwkJcHVzaF9lcyhVRVtjdXJyX3NlLnZhbHVlMV1bMF0sIFVFW2N1cnJfc2UudmFsdWUxXVsxXSk7CisKKyNpZmRlZiBEVU1QX0RFQlVHCisJCWlmIChhdnNfZ2V0X2RlYnVnX2ZsYWcoKSAmIE1CX0lORk9fRFVNUCkKKwkJCWlvX3ByaW50ZigiICogVUUgY19pcHJlZF9tb2RlIHJlYWQgOiAlZFxuIiwKKwkJCQljdXJyX21iLT5jX2lwcmVkX21vZGUpOworI2VuZGlmCisKKwkJaWYgKGN1cnJfc2UudmFsdWUxIDwgRENfUFJFRF84IHx8IGN1cnJfc2UudmFsdWUxID4gUExBTkVfOCkgeworI2lmZGVmIERVTVBfREVCVUcKKwkJCWlmIChhdnNfZ2V0X2RlYnVnX2ZsYWcoKSAmIE1CX0lORk9fRFVNUCkKKwkJCQlpb19wcmludGYoIiVkXG4iLCBpbWctPmN1cnJlbnRfbWJfbnIpOworI2VuZGlmCisJCQlwcl9pbmZvKCJpbGxlZ2FsIGNocm9tYSBpbnRyYSBwcmVkIG1vZGUhXG4iKTsKKwkJfQorCX0KK30KKworLyohCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBcYnJpZWYKKyAqICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhcml0aG1ldGljYWxseSBkZWNvZGUgdGhlIGNvZGVkCisgKiAgICBibG9jayBwYXR0ZXJuIG9mIGEgZ2l2ZW4gTUIuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3ZvaWQgcmVhZGNwX2FlYyhzdHJ1Y3Qgc3ludGF4ZWxlbWVudCAqc2UsIHN0cnVjdCBpbWdfcGFyICppbWcsCisJCXN0cnVjdCBkZWNvZGluZ19lbnZpcm9ubWVudF9zICpkZXBfZHApCit7CisJc3RydWN0IHRleHR1cmVfaW5mb19jb250ZXh0cyAqY3R4ID0gaW1nLT5jdXJyZW50X3NsaWNlLT50ZXhfY3R4OworCXN0cnVjdCBtYWNyb2Jsb2NrICpjdXJyX21iID0gJm1iX2RhdGFbaW1nLT5jdXJyZW50X21iX25yXTsKKworCWludCBtYl94LCBtYl95OworCWludCBhLCBiOworCWludCBjdXJyX2NicF9jdHgsIGN1cnJfY2JwX2lkeDsKKwlpbnQgY2JwID0gMDsKKwlpbnQgY2JwX2JpdDsKKwlpbnQgbWFzazsKKworCWZvciAobWJfeSA9IDA7IG1iX3kgPCA0OyBtYl95ICs9IDIpIHsKKwkJZm9yIChtYl94ID0gMDsgbWJfeCA8IDQ7IG1iX3ggKz0gMikgeworCQkJaWYgKGN1cnJfbWItPmI4bW9kZVttYl95ICsgKG1iX3ggLyAyKV0gPT0gSUJMT0NLKQorCQkJCWN1cnJfY2JwX2lkeCA9IDA7CisJCQllbHNlCisJCQkJY3Vycl9jYnBfaWR4ID0gMTsKKworCQkJaWYgKG1iX3kgPT0gMCkgeworCQkJCWlmIChjdXJyX21iLT5tYl9hdmFpbGFibGVfdXAgPT0gTlVMTCkKKwkJCQkJYiA9IDA7CisJCQkJZWxzZSB7CisJCQkJCWIgPSAoKCgoY3Vycl9tYi0+bWJfYXZhaWxhYmxlX3VwKS0+Y2JwCisJCQkJCQkJJiAoMSA8PCAoMiArIG1iX3ggLyAyKSkpCisJCQkJCQkJPT0gMCkgPyAxIDogMCk7CisJCQkJfQorCisJCQl9IGVsc2UKKwkJCQliID0gKCgoY2JwICYgKDEgPDwgKG1iX3ggLyAyKSkpID09IDApID8gMSA6IDApOworCisJCQlpZiAobWJfeCA9PSAwKSB7CisJCQkJaWYgKGN1cnJfbWItPm1iX2F2YWlsYWJsZV9sZWZ0ID09IE5VTEwpCisJCQkJCWEgPSAwOworCQkJCWVsc2UgeworCQkJCQlhID0KKwkJCQkJKCgoKGN1cnJfbWItPm1iX2F2YWlsYWJsZV9sZWZ0KS0+Y2JwCisJCQkJCSYgKDEKKwkJCQkJPDwgKDIKKwkJCQkJKiAobWJfeQorCQkJCQkvIDIpCisJCQkJCSsgMSkpKQorCQkJCQk9PSAwKSA/CisJCQkJCTEgOiAwKTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlhID0gKCgoY2JwICYgKDEgPDwgbWJfeSkpID09IDApID8gMSA6IDApOworCQkJY3Vycl9jYnBfY3R4ID0gYSArIDIgKiBiOworCQkJbWFzayA9ICgxIDw8IChtYl95ICsgbWJfeCAvIDIpKTsKKwkJCWNicF9iaXQgPSBiaWFyaV9kZWNvZGVfc3ltYm9sKGRlcF9kcCwKKwkJCQkJY3R4LT5jYnBfY29udGV4dHNbMF0gKyBjdXJyX2NicF9jdHgpOworCisJCQlpZiAoY2JwX2JpdCkKKwkJCQljYnAgKz0gbWFzazsKKwkJfQorCX0KKwljdXJyX2NicF9jdHggPSAwOworCWNicF9iaXQgPSBiaWFyaV9kZWNvZGVfc3ltYm9sKGRlcF9kcCwKKwkJCWN0eC0+Y2JwX2NvbnRleHRzWzFdICsgY3Vycl9jYnBfY3R4KTsKKworCWlmIChjYnBfYml0KSB7CisJCWN1cnJfY2JwX2N0eCA9IDE7CisJCWNicF9iaXQgPSBiaWFyaV9kZWNvZGVfc3ltYm9sKGRlcF9kcCwKKwkJCQljdHgtPmNicF9jb250ZXh0c1sxXSArIGN1cnJfY2JwX2N0eCk7CisJCWlmIChjYnBfYml0KSB7CisJCQljYnAgKz0gNDg7CisKKwkJfSBlbHNlIHsKKwkJCWN1cnJfY2JwX2N0eCA9IDE7CisJCQljYnBfYml0ID0gYmlhcmlfZGVjb2RlX3N5bWJvbChkZXBfZHAsCisJCQkJCWN0eC0+Y2JwX2NvbnRleHRzWzFdICsgY3Vycl9jYnBfY3R4KTsKKwkJCWNicCArPSAoY2JwX2JpdCA9PSAxKSA/IDMyIDogMTY7CisKKwkJfQorCX0KKworCXNlLT52YWx1ZTEgPSBjYnA7CisJaWYgKCFjYnApCisJCWxhc3RfZHF1YW50ID0gMDsKKworCisKK30KKworLyohCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBcYnJpZWYKKyAqICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhcml0aG1ldGljYWxseSBkZWNvZGUgdGhlIGRlbHRhIHFwCisgKiAgICAgb2YgYSBnaXZlbiBNQi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLwordm9pZCByZWFkZHF1YW50X2FlYyhzdHJ1Y3Qgc3ludGF4ZWxlbWVudCAqc2UsIHN0cnVjdCBpbWdfcGFyICppbWcsCisJCXN0cnVjdCBkZWNvZGluZ19lbnZpcm9ubWVudF9zICpkZXBfZHApCit7CisJc3RydWN0IG1vdGlvbl9pbmZvX2NvbnRleHRzX3MgKmN0eCA9IGltZy0+Y3VycmVudF9zbGljZS0+bW90X2N0eDsKKworCWludCBhY3RfY3R4OworCWludCBhY3Rfc3ltOworCWludCBkcXVhbnQ7CisKKworCWFjdF9jdHggPSAoKGxhc3RfZHF1YW50ICE9IDApID8gMSA6IDApOworCisJYWN0X3N5bSA9IDEKKwkJCS0gYmlhcmlfZGVjb2RlX3N5bWJvbChkZXBfZHAsCisJCQkJCWN0eC0+ZGVsdGFfcXBfY29udGV4dHMgKyBhY3RfY3R4KTsKKwlpZiAoYWN0X3N5bSAhPSAwKSB7CisJCWFjdF9jdHggPSAyOworCQlhY3Rfc3ltID0gdW5hcnlfYmluX2RlY29kZShkZXBfZHAsCisJCQkJY3R4LT5kZWx0YV9xcF9jb250ZXh0cyArIGFjdF9jdHgsIDEpOworCQlhY3Rfc3ltKys7CisJfQorCWFjdF9zeW0gJj0gMHgzZjsKKwlwdXNoX2VzKFVFW2FjdF9zeW1dWzBdLCBVRVthY3Rfc3ltXVsxXSk7CisKKwlkcXVhbnQgPSAoYWN0X3N5bSArIDEpIC8gMjsKKwlpZiAoKGFjdF9zeW0gJiAweDAxKSA9PSAwKQorCQlkcXVhbnQgPSAtZHF1YW50OworCXNlLT52YWx1ZTEgPSBkcXVhbnQ7CisKKwlsYXN0X2RxdWFudCA9IGRxdWFudDsKKworfQorCitpbnQgY3N5bnRheDsKKworI2RlZmluZSBDSEVDS0RFTFRBUVAge1wKKwlpZiAoaW1nLT5xcCtjdXJyX21iLT5kZWx0YV9xdWFudCA+IDYzXAorCQkJfHwgaW1nLT5xcCtjdXJyX21iLT5kZWx0YV9xdWFudCA8IDApIHtcCisJCWNzeW50YXggPSAwO1wKKwkJdHJhbnNjb2RpbmdfZXJyb3JfZmxhZyA9IDE7XAorCQlpb19wcmludGYoImVycm9yKDApICglM2R8JTNkKSBAIE1CJWRcbiIsXAorCQkJY3Vycl9tYi0+ZGVsdGFfcXVhbnQsXAorCQkJaW1nLT5xcCtjdXJyX21iLT5kZWx0YV9xdWFudCxcCisJCQlpbWctPnBpY3R1cmVfc3RydWN0dXJlID09IDAgXAorCQkJPyBpbWctPmN1cnJlbnRfbWJfbnJfZmxkIDogaW1nLT5jdXJyZW50X21iX25yKTtcCisJCX0gfQorCitpbnQgZGN0X2xldmVsWzY1XTsKK2ludCBkY3RfcnVuWzY1XTsKK2ludCBwYWlyX3BvczsKK2ludCBkY3RfcGFpcnMgPSAtMTsKK2NvbnN0IGludCB0X2Nocls1XSA9IHswLCAxLCAyLCA0LCAzMDAwfTsKKwordm9pZCByZWFkcnVubGV2ZWxfYWVjX3JlZihzdHJ1Y3Qgc3ludGF4ZWxlbWVudCAqc2UsIHN0cnVjdCBpbWdfcGFyICppbWcsCisJCXN0cnVjdCBkZWNvZGluZ19lbnZpcm9ubWVudF9zICpkZXBfZHApCit7CisJaW50IHBhaXJzLCByYW5rLCBwb3M7CisJaW50IHJ1biwgbGV2ZWwsIGFic2xldmVsLCBzeW1ib2w7CisJaW50IHNpZ247CisKKwlpZiAoZGN0X3BhaXJzIDwgMCkgeworCQlzdHJ1Y3QgYmlfY29udGV4dF90eXBlX3MgKCpwcmltYXJ5KVtOVU1fTUFQX0NUWF07CisJCXN0cnVjdCBiaV9jb250ZXh0X3R5cGVfcyAqcGN0eDsKKwkJc3RydWN0IGJpX2NvbnRleHRfdHlwZV9zICpwQ1RYMjsKKwkJaW50IGN0eCwgY3R4Miwgb2Zmc2V0OworCisJCWlmIChzZS0+Y29udGV4dCA9PSBMVU1BXzh4OCkgeworCQkJaWYgKGltZy0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gMCkgeworCQkJCXByaW1hcnkgPQorCQkJCWltZy0+Y3VycmVudF9zbGljZS0+dGV4X2N0eC0+ZmxkX21hcF9jb250ZXh0czsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbWFyeSA9CisJCQkJaW1nLT5jdXJyZW50X3NsaWNlLT50ZXhfY3R4LT5tYXBfY29udGV4dHM7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoaW1nLT5waWN0dXJlX3N0cnVjdHVyZSA9PSAwKSB7CisJCQkJcHJpbWFyeSA9CisJCQkJaW1nLT5jdXJyZW50X3NsaWNlLT50ZXhfY3R4LT5mbGRfbGFzdF9jb250ZXh0czsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbWFyeSA9CisJCQkJaW1nLT5jdXJyZW50X3NsaWNlLT50ZXhfY3R4LT5sYXN0X2NvbnRleHRzOworCQkJfQorCQl9CisKKwkJcmFuayA9IDA7CisJCXBvcyA9IDA7CisJCWZvciAocGFpcnMgPSAwOyBwYWlycyA8IDY1OyBwYWlycysrKSB7CisjaWZkZWYgREVDT0RJTkdfU0FOSVRZX0NIRUNLCisJCQkvKm1heCBpbmRleCBpcyBOVU1fQkxPQ0tfVFlQRVMgLSAxKi8KKwkJCXBjdHggPSBwcmltYXJ5W3JhbmsgJiAweDddOworI2Vsc2UKKwkJCXBjdHggPSBwcmltYXJ5W3JhbmtdOworI2VuZGlmCisJCQlpZiAocmFuayA+IDApIHsKKyNpZmRlZiBERUNPRElOR19TQU5JVFlfQ0hFQ0sKKwkJCQkvKm1heCBpbmRleCBpcyBOVU1fQkxPQ0tfVFlQRVMgLSAxKi8KKwkJCQlwQ1RYMiA9IHByaW1hcnlbKDUgKyAocG9zID4+IDUpKSAmIDB4N107CisjZWxzZQorCQkJCXBDVFgyID0gcHJpbWFyeVs1ICsgKHBvcyA+PiA1KV07CisjZW5kaWYKKwkJCQljdHgyID0gKHBvcyA+PiAxKSAmIDB4MGY7CisJCQkJY3R4ID0gMDsKKworCisJCQkJaWYgKGJpYXJpX2RlY29kZV9zeW1ib2x3KGRlcF9kcCwgcGN0eCArIGN0eCwKKwkJCQkJCXBDVFgyICsgY3R4MikpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQljdHggPSAxOworCQkJc3ltYm9sID0gMDsKKwkJCXdoaWxlIChiaWFyaV9kZWNvZGVfc3ltYm9sKGRlcF9kcCwgcGN0eCArIGN0eCkgPT0gMCkgeworCQkJCXN5bWJvbCArPSAxOworCQkJCWN0eCsrOworCQkJCWlmIChjdHggPj0gMikKKwkJCQkJY3R4ID0gMjsKKwkJCX0KKwkJCWFic2xldmVsID0gc3ltYm9sICsgMTsKKworCQkJaWYgKGJpYXJpX2RlY29kZV9zeW1ib2xfZXFfcHJvYihkZXBfZHApKSB7CisJCQkJbGV2ZWwgPSAtYWJzbGV2ZWw7CisJCQkJc2lnbiA9IDE7CisJCQl9IGVsc2UgeworCQkJCWxldmVsID0gYWJzbGV2ZWw7CisJCQkJc2lnbiA9IDA7CisJCQl9CisjaWYgVFJBQ0UKKwkJCXRyYWNlYml0czIoImxldmVsIiwgMSwgbGV2ZWwpOworI2VuZGlmCisKKwkJCWlmIChhYnNsZXZlbCA9PSAxKQorCQkJCW9mZnNldCA9IDQ7CisJCQllbHNlCisJCQkJb2Zmc2V0ID0gNjsKKwkJCXN5bWJvbCA9IDA7CisJCQljdHggPSAwOworCQkJd2hpbGUgKGJpYXJpX2RlY29kZV9zeW1ib2woZGVwX2RwLCBwY3R4ICsgY3R4ICsgb2Zmc2V0KQorCQkJCQk9PSAwKSB7CisJCQkJc3ltYm9sICs9IDE7CisJCQkJY3R4Kys7CisJCQkJaWYgKGN0eCA+PSAxKQorCQkJCQljdHggPSAxOworCQkJfQorCQkJcnVuID0gc3ltYm9sOworCisjaWYgVFJBQ0UKKwkJCXRyYWNlYml0czIoInJ1biIsIDEsIHJ1bik7CisjZW5kaWYKKwkJCWRjdF9sZXZlbFtwYWlyc10gPSBsZXZlbDsKKwkJCWRjdF9ydW5bcGFpcnNdID0gcnVuOworCQkJaWYgKGFic2xldmVsID4gdF9jaHJbcmFua10pIHsKKwkJCQlpZiAoYWJzbGV2ZWwgPD0gMikKKwkJCQkJcmFuayA9IGFic2xldmVsOworCQkJCWVsc2UgaWYgKGFic2xldmVsIDw9IDQpCisJCQkJCXJhbmsgPSAzOworCQkJCWVsc2UKKwkJCQkJcmFuayA9IDQ7CisJCQl9CisJCQlwb3MgKz0gKHJ1biArIDEpOworCQkJaWYgKHBvcyA+PSA2NCkKKwkJCQlwb3MgPSA2MzsKKwkJfQorCQlkY3RfcGFpcnMgPSBwYWlyczsKKwkJcGFpcl9wb3MgPSBkY3RfcGFpcnM7CisJfQorCisJaWYgKGRjdF9wYWlycyA+IDApIHsKKwkJc2UtPnZhbHVlMSA9IGRjdF9sZXZlbFtwYWlyX3BvcyAtIDFdOworCQlzZS0+dmFsdWUyID0gZGN0X3J1bltwYWlyX3BvcyAtIDFdOworCQlwYWlyX3Bvcy0tOworCX0gZWxzZSB7CisKKwkJc2UtPnZhbHVlMSA9IHNlLT52YWx1ZTIgPSAwOworCX0KKworCWlmICgoZGN0X3BhaXJzLS0pID09IDApCisJCXBhaXJfcG9zID0gMDsKK30KKworaW50IGI4X2N0cjsKKyNpZiAwCitpbnQgY3Vycl9yZXNpZHVhbF9jaHJvbWFbNF1bMTZdWzE2XTsKK2ludCBjdXJyX3Jlc2lkdWFsX2x1bWFbMTZdWzE2XTsKKyNlbmRpZgorCitjb25zdCBpbnQgU0NBTlsyXVs2NF1bMl0gPSB7e3swLCAwfSwgezAsIDF9LCB7MCwgMn0sIHsxLCAwfSwgezAsIDN9LCB7MCwgNH0sIHsxLAorCQkxfSwgezEsIDJ9LCB7MCwgNX0sIHswLCA2fSwgezEsIDN9LCB7MiwgMH0sIHsyLCAxfSwgezAsIDd9LCB7MSwKKwkJNH0sIHsyLCAyfSwgezMsIDB9LCB7MSwgNX0sIHsxLCA2fSwgezIsIDN9LCB7MywgMX0sIHszLCAyfSwgezQsCisJCTB9LCB7MSwgN30sIHsyLCA0fSwgezQsIDF9LCB7MiwgNX0sIHszLCAzfSwgezQsIDJ9LCB7MiwgNn0sIHszLAorCQk0fSwgezQsIDN9LCB7NSwgMH0sIHs1LCAxfSwgezIsIDd9LCB7MywgNX0sIHs0LCA0fSwgezUsIDJ9LCB7NiwKKwkJMH0sIHs1LCAzfSwgezMsIDZ9LCB7NCwgNX0sIHs2LCAxfSwgezYsIDJ9LCB7NSwgNH0sIHszLCA3fSwgezQsCisJCTZ9LCB7NiwgM30sIHs1LCA1fSwgezQsIDd9LCB7NiwgNH0sIHs1LCA2fSwgezYsIDV9LCB7NSwgN30sIHs2LAorCQk2fSwgezcsIDB9LCB7NiwgN30sIHs3LCAxfSwgezcsIDJ9LCB7NywgM30sIHs3LCA0fSwgezcsIDV9LCB7NywKKwkJNn0sIHs3LCA3fSB9LCB7ezAsIDB9LCB7MSwgMH0sIHswLCAxfSwgezAsIDJ9LCB7MSwgMX0sIHsyLCAwfSwgeworCQkzLCAwfSwgezIsIDF9LCB7MSwgMn0sIHswLCAzfSwgezAsIDR9LCB7MSwgM30sIHsyLCAyfSwgezMsIDF9LCB7CisJCTQsIDB9LCB7NSwgMH0sIHs0LCAxfSwgezMsIDJ9LCB7MiwgM30sIHsxLCA0fSwgezAsIDV9LCB7MCwgNn0sIHsKKwkJMSwgNX0sIHsyLCA0fSwgezMsIDN9LCB7NCwgMn0sIHs1LCAxfSwgezYsIDB9LCB7NywgMH0sIHs2LCAxfSwgeworCQk1LCAyfSwgezQsIDN9LCB7MywgNH0sIHsyLCA1fSwgezEsIDZ9LCB7MCwgN30sIHsxLCA3fSwgezIsIDZ9LCB7CisJCTMsIDV9LCB7NCwgNH0sIHs1LCAzfSwgezYsIDJ9LCB7NywgMX0sIHs3LCAyfSwgezYsIDN9LCB7NSwgNH0sIHsKKwkJNCwgNX0sIHszLCA2fSwgezIsIDd9LCB7MywgN30sIHs0LCA2fSwgezUsIDV9LCB7NiwgNH0sIHs3LCAzfSwgeworCQk3LCA0fSwgezYsIDV9LCB7NSwgNn0sIHs0LCA3fSwgezUsIDd9LCB7NiwgNn0sIHs3LCA1fSwgezcsIDZ9LCB7CisJCTYsIDd9LCB7NywgN30gfSB9OworCitjb25zdCBpbnQgU0NBTl80eDRbMTZdWzJdID0ge3swLCAwfSwgezEsIDB9LCB7MCwgMX0sIHswLCAyfSwgezEsIDF9LCB7MiwgMH0sIHszLAorCQkwfSwgezIsIDF9LCB7MSwgMn0sIHswLCAzfSwgezEsIDN9LCB7MiwgMn0sIHszLCAxfSwgezMsIDJ9LCB7MiwKKwkJM30sIHszLCAzfSB9OworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogSW5wdXQ6CisgKiBPdXRwdXQ6CisgKiBSZXR1cm46CisgKiBBdHRlbnRpb246CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK3ZvaWQgZW5jb2RlX2dvbG9tYl93b3JkKHVuc2lnbmVkIGludCBzeW1ib2wsIHVuc2lnbmVkIGludCBncmFkMCwKKwkJdW5zaWduZWQgaW50IG1heF9sZXZlbHMsIHVuc2lnbmVkIGludCAqcmVzX2JpdHMsCisJCXVuc2lnbmVkIGludCAqcmVzX2xlbikKK3sKKwl1bnNpZ25lZCBpbnQgbGV2ZWwsIHJlcywgbnVtYml0czsKKworCXJlcyA9IDFVTCA8PCBncmFkMDsKKwlsZXZlbCA9IDFVTDsKKwludW1iaXRzID0gMVVMICsgZ3JhZDA7CisKKwl3aGlsZSAoc3ltYm9sID49IHJlcyAmJiBsZXZlbCA8IG1heF9sZXZlbHMpIHsKKwkJc3ltYm9sIC09IHJlczsKKwkJcmVzID0gcmVzIDw8IDE7CisJCWxldmVsKys7CisJCW51bWJpdHMgKz0gMlVMOworCX0KKworCWlmIChsZXZlbCA+PSBtYXhfbGV2ZWxzKSB7CisJCWlmIChzeW1ib2wgPj0gcmVzKQorCQkJc3ltYm9sID0gcmVzIC0gMVVMOworCX0KKworCSpyZXNfYml0cyA9IHJlcyB8IHN5bWJvbDsKKwkqcmVzX2xlbiA9IG51bWJpdHM7Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiBJbnB1dDoKKyAqIE91dHB1dDoKKyAqIFJldHVybjoKKyAqIEF0dGVudGlvbjoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKwordm9pZCBlbmNvZGVfbXVsdGlsYXllcl9nb2xvbWJfd29yZCh1bnNpZ25lZCBpbnQgc3ltYm9sLAorCQljb25zdCB1bnNpZ25lZCBpbnQgKmdyYWQsIGNvbnN0IHVuc2lnbmVkIGludCAqbWF4X2xldmVscywKKwkJdW5zaWduZWQgaW50ICpyZXNfYml0cywgdW5zaWduZWQgaW50ICpyZXNfbGVuKQoreworCXVuc2lnbmVkIGludCBhY2NiaXRzLCBhY2NsZW4sIGJpdHMsIGxlbiwgdG1wOworCisJYWNjYml0cyA9IGFjY2xlbiA9IDBVTDsKKworCXdoaWxlICgxKSB7CisJCWVuY29kZV9nb2xvbWJfd29yZChzeW1ib2wsICpncmFkLCAqbWF4X2xldmVscywgJmJpdHMsICZsZW4pOworCQlhY2NiaXRzID0gKGFjY2JpdHMgPDwgbGVuKSB8IGJpdHM7CisJCWFjY2xlbiArPSBsZW47CisjaWZkZWYgQVZTUF9MT05HX0NBQkFDCisjZWxzZQorCQlhc3NlcnQoYWNjbGVuIDw9IDMyVUwpOworI2VuZGlmCisJCXRtcCA9ICptYXhfbGV2ZWxzIC0gMVVMOworCisJCWlmICghKChsZW4gPT0gKHRtcCA8PCAxKSArICgqZ3JhZCkpCisJCQkJJiYgKGJpdHMgPT0gKDFVTCA8PCAodG1wICsgKmdyYWQpKSAtIDFVTCkpKQorCQkJYnJlYWs7CisKKwkJdG1wID0gKm1heF9sZXZlbHM7CisJCXN5bWJvbCAtPSAoKCgxVUwgPDwgdG1wKSAtIDFVTCkgPDwgKCpncmFkKSkgLSAxVUw7CisJCWdyYWQrKzsKKwkJbWF4X2xldmVscysrOworCX0KKwkqcmVzX2JpdHMgPSBhY2NiaXRzOworCSpyZXNfbGVuID0gYWNjbGVuOworfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogSW5wdXQ6CisgKiBPdXRwdXQ6CisgKiBSZXR1cm46CisgKiBBdHRlbnRpb246CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK2ludCB3cml0ZXN5bnRheGVsZW1lbnRfZ29sb21iKHN0cnVjdCBzeW50YXhlbGVtZW50ICpzZSwgaW50IHdyaXRlX3RvX3N0cmVhbSkKK3sKKwl1bnNpZ25lZCBpbnQgYml0cywgbGVuLCBpOworCXVuc2lnbmVkIGludCBncmFkWzRdLCBtYXhfbGV2WzRdOworCisJaWYgKCEoc2UtPmdvbG9tYl9tYXhsZXZlbHMgJiB+MHhGRikpCisJCWVuY29kZV9nb2xvbWJfd29yZChzZS0+dmFsdWUxLCBzZS0+Z29sb21iX2dyYWQsCisJCQkJc2UtPmdvbG9tYl9tYXhsZXZlbHMsICZiaXRzLCAmbGVuKTsKKwllbHNlIHsKKwkJZm9yIChpID0gMFVMOyBpIDwgNFVMOyBpKyspIHsKKwkJCWdyYWRbaV0gPSAoc2UtPmdvbG9tYl9ncmFkID4+IChpIDw8IDMpKSAmIDB4RkZVTDsKKwkJCW1heF9sZXZbaV0gPSAoc2UtPmdvbG9tYl9tYXhsZXZlbHMgPj4gKGkgPDwgMykpCisJCQkJCSYgMHhGRlVMOworCQl9CisJCWVuY29kZV9tdWx0aWxheWVyX2dvbG9tYl93b3JkKHNlLT52YWx1ZTEsIGdyYWQsIG1heF9sZXYsICZiaXRzLAorCQkJCSZsZW4pOworCX0KKworCXNlLT5sZW4gPSBsZW47CisJc2UtPmJpdHBhdHRlcm4gPSBiaXRzOworCisJaWYgKHdyaXRlX3RvX3N0cmVhbSkKKwkJcHVzaF9lcyhiaXRzLCBsZW4pOworCXJldHVybiBzZS0+bGVuOworfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOkdldCBjb2RlZCBibG9jayBwYXR0ZXJuIGFuZCBjb2VmZmljaWVudHMgKHJ1bi9sZXZlbCkKKyBmcm9tIHRoZSBiaXRzdHJlYW0KKyAqIElucHV0OgorICogT3V0cHV0OgorICogUmV0dXJuOgorICogQXR0ZW50aW9uOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCit2b2lkIHJlYWRfY2JwYW5kY29lZmZzZnJvbV9uYWwoc3RydWN0IGltZ19wYXIgKmltZykKK3sKKworCWludCB0YWJsZW51bTsKKwlpbnQgaW51bWJsazsKKwlpbnQgaW51bWNvZWZmOworCWludCBzeW1ib2wyRDsKKwlpbnQgZXNjYXBlX2xldmVsX2RpZmY7CisJY29uc3QgaW50ICgqQVZTXzJEVkxDX3RhYmxlX2ludHJhKVsyNl1bMjddOworCWNvbnN0IGludCAoKkFWU18yRFZMQ190YWJsZV9jaHJvbWEpWzI2XVsyN107CisJaW50IHdyaXRlX3RvX3N0cmVhbTsKKwlzdHJ1Y3Qgc3ludGF4ZWxlbWVudCBjdXJyc2VfZW5jOworCXN0cnVjdCBzeW50YXhlbGVtZW50ICplX2N1cnJzZSA9ICZjdXJyc2VfZW5jOworCisJaW50IGNvZWZmX3NhdmVbNjVdWzJdOworCWludCBjb2VmZl9wdHI7CisKKwlpbnQgaWksIGpqOworCWludCBtYl9uciA9IGltZy0+Y3VycmVudF9tYl9ucjsKKworCWludCBtMiwgamcyOworCXN0cnVjdCBtYWNyb2Jsb2NrICpjdXJyX21iID0gJm1iX2RhdGFbbWJfbnJdOworCisJaW50IGJsb2NrOHg4OworCisJaW50IGJsb2NrX3gsIGJsb2NrX3k7CisKKwlzdHJ1Y3Qgc2xpY2VfcyAqY3VycnNsaWNlID0gaW1nLT5jdXJyZW50X3NsaWNlOworCWludCBsZXZlbCwgcnVuLCBjb2VmX2N0ciwgbGVuLCBrLCBpMCwgajAsIHV2LCBxcDsKKworCWludCBib2ZmX3gsIGJvZmZfeSwgc3RhcnRfc2NhbjsKKwlzdHJ1Y3Qgc3ludGF4ZWxlbWVudCBjdXJyX3NlOworCXN0cnVjdCBkYXRhcGFydGl0aW9uICpkcDsKKworCUFWU18yRFZMQ190YWJsZV9pbnRyYSA9IEFWU18yRFZMQ19JTlRSQTsKKwlBVlNfMkRWTENfdGFibGVfY2hyb21hID0gQVZTXzJEVkxDX0NIUk9NQTsKKwl3cml0ZV90b19zdHJlYW0gPSAxOworCisJZGN0X3BhaXJzID0gLTE7CisKKwljdXJyX21iLT5xcCA9IGltZy0+cXA7CisJcXAgPSBjdXJyX21iLT5xcDsKKworCisJZm9yIChibG9ja195ID0gMDsgYmxvY2tfeSA8IDQ7IGJsb2NrX3kgKz0gMikgey8qIGFsbCBtb2RlcyAqLworCWZvciAoYmxvY2tfeCA9IDA7IGJsb2NrX3ggPCA0OyBibG9ja194ICs9IDIpIHsKKwkJYmxvY2s4eDggPSAyICogKGJsb2NrX3kgLyAyKSArIGJsb2NrX3ggLyAyOworCQlpZiAoY3Vycl9tYi0+Y2JwICYgKDEgPDwgYmxvY2s4eDgpKSB7CisJCQl0YWJsZW51bSA9IDA7CisJCQlpbnVtYmxrID0gMTsKKwkJCWludW1jb2VmZiA9IDY1OworCQkJY29lZmZfc2F2ZVswXVswXSA9IDA7CisJCQljb2VmZl9zYXZlWzBdWzFdID0gMDsKKwkJCWNvZWZmX3B0ciA9IDE7CisKKwkJCWI4X2N0ciA9IGJsb2NrOHg4OworCisJCQlib2ZmX3ggPSAoYmxvY2s4eDggJSAyKSA8PCAzOworCQkJYm9mZl95ID0gKGJsb2NrOHg4IC8gMikgPDwgMzsKKworCQkJaW1nLT5zdWJibG9ja194ID0gYm9mZl94ID4+IDI7CisJCQlpbWctPnN1YmJsb2NrX3kgPSBib2ZmX3kgPj4gMjsKKworCQkJc3RhcnRfc2NhbiA9IDA7CisJCQljb2VmX2N0ciA9IHN0YXJ0X3NjYW4gLSAxOworCQkJbGV2ZWwgPSAxOworCQkJaW1nLT5pc192X2Jsb2NrID0gMDsKKwkJCWltZy0+aXNfaW50cmFfYmxvY2sgPSBJU19JTlRSQShjdXJyX21iKTsKKwkJCWZvciAoayA9IHN0YXJ0X3NjYW47CisJCQkJKGsgPCA2NSkgJiYgKGxldmVsICE9IDApOworCQkJCWsrKykgeworCisJCQkJY3Vycl9zZS5jb250ZXh0ID0gTFVNQV84eDg7CisJCQkJY3Vycl9zZS50eXBlID0KKwkJCQkoSVNfSU5UUkEoY3Vycl9tYikpID8KKwkJCQkJU0VfTFVNX0FDX0lOVFJBIDoKKwkJCQkJU0VfTFVNX0FDX0lOVEVSOworCisJCQkJZHAgPSAmKGN1cnJzbGljZS0+cGFydF9hcnJbMF0pOworCQkJCWN1cnJfc2UucmVhZGluZyA9CisJCQkJCXJlYWRydW5sZXZlbF9hZWNfcmVmOworCQkJCWRwLT4KKwkJCQlyZWFkX3N5bnRheF9lbGVtZW50KCZjdXJyX3NlLAorCQkJCQlpbWcsIGRwKTsKKwkJCQlsZXZlbCA9IGN1cnJfc2UudmFsdWUxOworCQkJCXJ1biA9IGN1cnJfc2UudmFsdWUyOworCQkJCWxlbiA9IGN1cnJfc2UubGVuOworCisJCQkJaWYgKGxldmVsICE9IDApIHsKKwkJCQkJY29lZmZfc2F2ZVtjb2VmZl9wdHJdWzBdID0KKwkJCQkJcnVuOworCQkJCQljb2VmZl9zYXZlW2NvZWZmX3B0cl1bMV0gPQorCQkJCQlsZXZlbDsKKwkJCQkJY29lZmZfcHRyKys7CisJCQkJfQorCisKKworCQkJCWlmIChsZXZlbCAhPSAwKSB7LyogbGVhdmUgaWYgbGVuID0gMSAqLworCQkJCQljb2VmX2N0ciArPSBydW4gKyAxOworCQkJCQlpZiAoKGltZy0+cGljdHVyZV9zdHJ1Y3R1cmUKKwkJCQkJCT09IEZSQU1FKSkgeworCQkJCQkJaWkgPQorCQkJCQkJU0NBTltpbWctPnBpY3R1cmVfc3RydWN0dXJlXQorCQkJCQkJW2NvZWZfY3RyXVswXTsKKwkJCQkJCWpqID0KKwkJCQkJCVNDQU5baW1nLT5waWN0dXJlX3N0cnVjdHVyZV0KKwkJCQkJCVtjb2VmX2N0cl1bMV07CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpaSA9CisJCQkJCQlTQ0FOW2ltZy0+cGljdHVyZV9zdHJ1Y3R1cmVdCisJCQkJCQlbY29lZl9jdHJdWzBdOworCQkJCQkJamogPQorCQkJCQkJU0NBTltpbWctPnBpY3R1cmVfc3RydWN0dXJlXQorCQkJCQkJW2NvZWZfY3RyXVsxXTsKKwkJCQkJfQorCisJCQkJfQorCQkJfQorCisJCQl3aGlsZSAoY29lZmZfcHRyID4gMCkgeworCQkJCXJ1biA9CisJCQkJCQljb2VmZl9zYXZlW2NvZWZmX3B0cgorCQkJCQkJCQktIDFdWzBdOworCQkJCWxldmVsID0KKwkJCQkJCWNvZWZmX3NhdmVbY29lZmZfcHRyCisJCQkJCQkJCS0gMV1bMV07CisKKwkJCQljb2VmZl9wdHItLTsKKworCQkJCXN5bWJvbDJEID0gQ09ERTJEX0VTQ0FQRV9TWU1CT0w7CisJCQkJaWYgKGxldmVsID4gLTI3ICYmIGxldmVsIDwgMjcKKwkJCQkJJiYgcnVuIDwgMjYpIHsKKwkJCQkJaWYgKHRhYmxlbnVtID09IDApCisKKwkJCQkJCXN5bWJvbDJEID0KKwkJCQkJCUFWU18yRFZMQ190YWJsZV9pbnRyYQorCQkJCQkJW3RhYmxlbnVtXQorCQkJCQkJW3J1bl1bYWJzKAorCQkJCQkJbGV2ZWwpCisJCQkJCQktIDFdOworCQkJCQllbHNlCisKKwkJCQkJCXN5bWJvbDJEID0KKwkJCQkJCUFWU18yRFZMQ190YWJsZV9pbnRyYQorCQkJCQkJW3RhYmxlbnVtXQorCQkJCQkJW3J1bl1bYWJzKAorCQkJCQlsZXZlbCldOworCQkJCQlpZiAoc3ltYm9sMkQgPj0gMAorCQkJCQkJCSYmIGxldmVsCisJCQkJCQkJCQk8IDApCisJCQkJCQlzeW1ib2wyRCsrOworCQkJCQlpZiAoc3ltYm9sMkQgPCAwKQorCisJCQkJCQlzeW1ib2wyRCA9CisJCQkJCQkoQ09ERTJEX0VTQ0FQRV9TWU1CT0wKKwkJCQkJCSsgKHJ1bgorCQkJCQkJPDwgMSkKKwkJCQkJCSsgKChsZXZlbAorCQkJCQkJPiAwKSA/CisJCQkJCQkxIDoKKwkJCQkJCTApKTsKKwkJCQl9CisKKwkJCQllbHNlIHsKKworCQkJCQlzeW1ib2wyRCA9CisJCQkJCQkoQ09ERTJEX0VTQ0FQRV9TWU1CT0wKKwkJCQkJCSsgKHJ1bgorCQkJCQkJPDwgMSkKKwkJCQkJCSsgKChsZXZlbAorCQkJCQkJPiAwKSA/CisJCQkJCQkxIDoKKwkJCQkJCTApKTsKKwkJCQl9CisKKworCisJCQkJZV9jdXJyc2UtPnR5cGUgPSBTRV9MVU1fQUNfSU5URVI7CisJCQkJZV9jdXJyc2UtPnZhbHVlMSA9IHN5bWJvbDJEOworCQkJCWVfY3VycnNlLT52YWx1ZTIgPSAwOworCisJCQkJZV9jdXJyc2UtPmdvbG9tYl9ncmFkID0KKwkJCQkJCXZsY19nb2xvbWJfb3JkZXIKKwkJCQkJCVswXVt0YWJsZW51bV1bMF07CisJCQkJZV9jdXJyc2UtPmdvbG9tYl9tYXhsZXZlbHMgPQorCQkJCQkJdmxjX2dvbG9tYl9vcmRlcgorCQkJCQkJWzBdW3RhYmxlbnVtXVsxXTsKKworCQkJCXdyaXRlc3ludGF4ZWxlbWVudF9nb2xvbWIoCisJCQkJCQllX2N1cnJzZSwKKwkJCQkJCXdyaXRlX3RvX3N0cmVhbSk7CisKKwkJCQlpZiAoc3ltYm9sMkQKKwkJCQkJCT49IENPREUyRF9FU0NBUEVfU1lNQk9MKSB7CisKKwkJCQkJZV9jdXJyc2UtPnR5cGUgPQorCQkJCQkJCVNFX0xVTV9BQ19JTlRFUjsKKwkJCQkJZV9jdXJyc2UtPmdvbG9tYl9ncmFkID0KKwkJCQkJCQkxOworCQkJCQllX2N1cnJzZS0+Z29sb21iX21heGxldmVscyA9CisJCQkJCQkJMTE7CisJCQkJCWVzY2FwZV9sZXZlbF9kaWZmID0KKwkJCQkJCWFicygKKwkJCQkJCWxldmVsKQorCQkJCQkJLSAoKHJ1bgorCQkJCQkJPiBNYXhSdW5bMF1bdGFibGVudW1dKSA/CisJCQkJCQkxIDoKKwkJCQkJCXJlZmFic2xldmVsW3RhYmxlbnVtXVtydW5dKTsKKwkJCQkJZV9jdXJyc2UtPnZhbHVlMSA9CisJCQkJCQkJZXNjYXBlX2xldmVsX2RpZmY7CisKKwkJCQkJd3JpdGVzeW50YXhlbGVtZW50X2dvbG9tYigKKwkJCQkJCQllX2N1cnJzZSwKKwkJCQkJCQl3cml0ZV90b19zdHJlYW0pOworCisJCQkJfQorCisJCQkJaWYgKGFicyhsZXZlbCkKKwkJCQkJPiBpbmN2bGNfaW50cmFbdGFibGVudW1dKSB7CisJCQkJCWlmIChhYnMobGV2ZWwpIDw9IDIpCisJCQkJCQl0YWJsZW51bSA9CisJCQkJCQlhYnMoCisJCQkJCQlsZXZlbCk7CisJCQkJCWVsc2UgaWYgKGFicyhsZXZlbCkgPD0gNCkKKwkJCQkJCXRhYmxlbnVtID0gMzsKKwkJCQkJZWxzZSBpZiAoYWJzKGxldmVsKSA8PSA3KQorCQkJCQkJdGFibGVudW0gPSA0OworCQkJCQllbHNlIGlmIChhYnMobGV2ZWwpCisJCQkJCQkJPD0gMTApCisJCQkJCQl0YWJsZW51bSA9IDU7CisJCQkJCWVsc2UKKwkJCQkJCXRhYmxlbnVtID0gNjsKKwkJCQl9CisJCQl9CisKKworCQl9CisJCX0KKwl9CisKKworCisJbTIgPSBpbWctPm1iX3ggKiAyOworCWpnMiA9IGltZy0+bWJfeSAqIDI7CisKKworCXV2ID0gLTE7CisJYmxvY2tfeSA9IDQ7CisjaWYgMAorCXFwID0gUVBfU0NBTEVfQ1JbY3Vycl9tYi0+cXBdOworI2VuZGlmCisJZm9yIChibG9ja194ID0gMDsgYmxvY2tfeCA8IDQ7IGJsb2NrX3ggKz0gMikgeworCisJCXV2Kys7CisKKworCQliOF9jdHIgPSAodXYgKyA0KTsKKwkJaWYgKChjdXJyX21iLT5jYnAgPj4gKHV2ICsgNCkpICYgMHgxKSB7CisKKwkJCXRhYmxlbnVtID0gMDsKKwkJCWludW1ibGsgPSAxOworCQkJaW51bWNvZWZmID0gNjU7CisJCQljb2VmZl9zYXZlWzBdWzBdID0gMDsKKwkJCWNvZWZmX3NhdmVbMF1bMV0gPSAwOworCQkJY29lZmZfcHRyID0gMTsKKworCQkJY29lZl9jdHIgPSAtMTsKKwkJCWxldmVsID0gMTsKKwkJCWltZy0+c3ViYmxvY2tfeCA9IDA7CisJCQlpbWctPnN1YmJsb2NrX3kgPSAwOworCQkJY3Vycl9zZS5jb250ZXh0ID0gQ0hST01BX0FDOworCQkJY3Vycl9zZS50eXBlID0gKElTX0lOVFJBKGN1cnJfbWIpID8KKwkJCQkJU0VfQ0hSX0FDX0lOVFJBIDoKKwkJCQkJU0VfQ0hSX0FDX0lOVEVSKTsKKwkJCWRwID0gJihjdXJyc2xpY2UtPnBhcnRfYXJyWzBdKTsKKwkJCWN1cnJfc2UucmVhZGluZyA9IHJlYWRydW5sZXZlbF9hZWNfcmVmOworCQkJaW1nLT5pc192X2Jsb2NrID0gdXY7CisJCQlpbWctPmlzX2ludHJhX2Jsb2NrID0gSVNfSU5UUkEoY3Vycl9tYik7CisJCQlmb3IgKGsgPSAwOyAoayA8IDY1KSAmJiAobGV2ZWwgIT0gMCk7IGsrKykgeworCisJCQkJZHAtPnJlYWRfc3ludGF4X2VsZW1lbnQKKwkJCQkoJmN1cnJfc2UsIGltZywgZHApOworCQkJCWxldmVsID0gY3Vycl9zZS52YWx1ZTE7CisJCQkJcnVuID0gY3Vycl9zZS52YWx1ZTI7CisJCQkJbGVuID0gY3Vycl9zZS5sZW47CisKKwkJCQlpZiAobGV2ZWwgIT0gMCkgeworCQkJCQljb2VmZl9zYXZlW2NvZWZmX3B0cl1bMF0gPSBydW47CisJCQkJCWNvZWZmX3NhdmVbY29lZmZfcHRyXVsxXSA9CisJCQkJCQkJbGV2ZWw7CisJCQkJCWNvZWZmX3B0cisrOworCQkJCX0KKworCisJCQkJaWYgKGxldmVsICE9IDApIHsKKwkJCQkJY29lZl9jdHIgPSBjb2VmX2N0ciArIHJ1biArIDE7CisJCQkJCWlmICgoaW1nLT5waWN0dXJlX3N0cnVjdHVyZQorCQkJCQkJPT0gRlJBTUUpCisJCQkJCQkvKiYmICghY3Vycl9tYi0+bWJfZmllbGQpKi8pIHsKKwkJCQkJCWkwID0KKwkJCQkJCVNDQU5baW1nLT5waWN0dXJlX3N0cnVjdHVyZV0KKwkJCQkJCVtjb2VmX2N0cl1bMF07CisJCQkJCQlqMCA9CisJCQkJCQlTQ0FOW2ltZy0+cGljdHVyZV9zdHJ1Y3R1cmVdCisJCQkJCQlbY29lZl9jdHJdWzFdOworCQkJCQl9IGVsc2UgeworCQkJCQkJaTAgPQorCQkJCQkJU0NBTltpbWctPnBpY3R1cmVfc3RydWN0dXJlXQorCQkJCQkJW2NvZWZfY3RyXVswXTsKKwkJCQkJCWowID0KKwkJCQkJCVNDQU5baW1nLT5waWN0dXJlX3N0cnVjdHVyZV0KKwkJCQkJCVtjb2VmX2N0cl1bMV07CisJCQkJCX0KKworCQkJCX0KKwkJCX0KKworCQkJd2hpbGUgKGNvZWZmX3B0ciA+IDApIHsKKworCQkJCXJ1biA9IGNvZWZmX3NhdmVbY29lZmZfcHRyIC0gMV1bMF07CisJCQkJbGV2ZWwgPSBjb2VmZl9zYXZlW2NvZWZmX3B0ciAtIDFdWzFdOworCisJCQkJY29lZmZfcHRyLS07CisKKwkJCQlzeW1ib2wyRCA9IENPREUyRF9FU0NBUEVfU1lNQk9MOworCQkJCWlmIChsZXZlbCA+IC0yNyAmJiBsZXZlbCA8IDI3CisJCQkJCQkmJiBydW4gPCAyNikgeworCQkJCQlpZiAodGFibGVudW0gPT0gMCkKKworCQkJCQkJc3ltYm9sMkQgPQorCQkJCQkJQVZTXzJEVkxDX3RhYmxlX2Nocm9tYQorCQkJCQkJW3RhYmxlbnVtXVtydW5dW2FicygKKwkJCQkJCWxldmVsKQorCQkJCQkJLSAxXTsKKwkJCQkJZWxzZQorCQkJCQkJc3ltYm9sMkQgPQorCQkJCQkJCUFWU18yRFZMQ190YWJsZV9jaHJvbWEKKwkJCQkJCQlbdGFibGVudW1dW3J1bl1bYWJzKAorCQkJCQkJCWxldmVsKV07CisJCQkJCWlmIChzeW1ib2wyRCA+PSAwCisJCQkJCQkmJiBsZXZlbCA8IDApCisJCQkJCQlzeW1ib2wyRCsrOworCQkJCQlpZiAoc3ltYm9sMkQgPCAwKQorCQkJCQkJc3ltYm9sMkQgPQorCQkJCQkJKENPREUyRF9FU0NBUEVfU1lNQk9MCisJCQkJCQkrIChydW4KKwkJCQkJCTw8IDEpCisJCQkJCQkrICgobGV2ZWwKKwkJCQkJCT4gMCkgPworCQkJCQkJMSA6CisJCQkJCQkwKSk7CisJCQkJfQorCisJCQkJZWxzZSB7CisJCQkJCXN5bWJvbDJEID0KKwkJCQkJKENPREUyRF9FU0NBUEVfU1lNQk9MCisJCQkJCSsgKHJ1bgorCQkJCQk8PCAxKQorCQkJCQkrICgobGV2ZWwKKwkJCQkJPiAwKSA/CisJCQkJCTEgOgorCQkJCQkwKSk7CisJCQkJfQorCisJCQkJZV9jdXJyc2UtPnR5cGUgPSBTRV9MVU1fQUNfSU5URVI7CisJCQkJZV9jdXJyc2UtPnZhbHVlMSA9IHN5bWJvbDJEOworCQkJCWVfY3VycnNlLT52YWx1ZTIgPSAwOworCQkJCWVfY3VycnNlLT5nb2xvbWJfZ3JhZCA9CisJCQkJCQl2bGNfZ29sb21iX29yZGVyWzJdCisJCQkJCQlbdGFibGVudW1dWzBdOworCQkJCWVfY3VycnNlLT5nb2xvbWJfbWF4bGV2ZWxzID0KKwkJCQkJCXZsY19nb2xvbWJfb3JkZXJbMl0KKwkJCQkJCVt0YWJsZW51bV1bMV07CisKKwkJCQl3cml0ZXN5bnRheGVsZW1lbnRfZ29sb21iKGVfY3VycnNlLAorCQkJCQkJd3JpdGVfdG9fc3RyZWFtKTsKKworCQkJCS8qCisJCQkJICogaWYgKHdyaXRlX3RvX3N0cmVhbSkKKwkJCQkgKiB7CisJCQkJICogYml0Q291bnRbQklUU19DT0VGRl9VVl9NQl0rPWVfY3VycnNlLT5sZW47CisJCQkJICogZV9jdXJyc2UrKzsKKwkJCQkgKiBjdXJyX21iLT5jdXJyU0VucisrOworCQkJCSAqIH0KKwkJCQkgKiBub19iaXRzKz1lX2N1cnJzZS0+bGVuOworCisKKwkJCQkgKiBpZiAoaWNvZWYgPT0gMCkgYnJlYWs7CisJCQkJICovCisKKwkJCQlpZiAoc3ltYm9sMkQgPj0gQ09ERTJEX0VTQ0FQRV9TWU1CT0wpIHsKKworCQkJCQllX2N1cnJzZS0+dHlwZSA9IFNFX0xVTV9BQ19JTlRFUjsKKwkJCQkJZV9jdXJyc2UtPmdvbG9tYl9ncmFkID0gMDsKKwkJCQkJZV9jdXJyc2UtPmdvbG9tYl9tYXhsZXZlbHMgPSAxMTsKKwkJCQkJZXNjYXBlX2xldmVsX2RpZmYgPQorCQkJCQkJYWJzKGxldmVsKQorCQkJCQkJLSAoKHJ1bgorCQkJCQkJPiBNYXhSdW5bMl1bdGFibGVudW1dKSA/CisJCQkJCQkxIDoKKwkJCQkJCXJlZmFic2xldmVsW3RhYmxlbnVtCisJCQkJCQkrIDE0XVtydW5dKTsKKwkJCQkJZV9jdXJyc2UtPnZhbHVlMSA9CisJCQkJCQkJZXNjYXBlX2xldmVsX2RpZmY7CisKKwkJCQkJd3JpdGVzeW50YXhlbGVtZW50X2dvbG9tYigKKwkJCQkJCQllX2N1cnJzZSwKKwkJCQkJCQl3cml0ZV90b19zdHJlYW0pOworCisJCQkJfQorCisJCQkJaWYgKGFicyhsZXZlbCkKKwkJCQk+IGluY3ZsY19jaHJvbWFbdGFibGVudW1dKSB7CisJCQkJCWlmIChhYnMobGV2ZWwpIDw9IDIpCisJCQkJCQl0YWJsZW51bSA9IGFicyhsZXZlbCk7CisJCQkJCWVsc2UgaWYgKGFicyhsZXZlbCkgPD0gNCkKKwkJCQkJCXRhYmxlbnVtID0gMzsKKwkJCQkJZWxzZQorCQkJCQkJdGFibGVudW0gPSA0OworCQkJCX0KKwkJCX0KKworCQl9CisJfQorfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOkdldCB0aGUgc3ludGF4IGVsZW1lbnRzIGZyb20gdGhlIE5BTAorICogSW5wdXQ6CisgKiBPdXRwdXQ6CisgKiBSZXR1cm46CisgKiBBdHRlbnRpb246CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK2ludCByZWFkX29uZV9tYWNyb2Jsb2NrKHN0cnVjdCBpbWdfcGFyICppbWcpCit7CisJaW50IGksIGo7CisKKwlzdHJ1Y3Qgc3ludGF4ZWxlbWVudCBjdXJyX3NlOworCXN0cnVjdCBtYWNyb2Jsb2NrICpjdXJyX21iID0gJm1iX2RhdGFbaW1nLT5jdXJyZW50X21iX25yXTsKKworCWludCBjYWJwX2ZsYWc7CisKKwlpbnQgdGVtcGNicDsKKwlpbnQgZml4cXA7CisKKwlzdHJ1Y3Qgc2xpY2VfcyAqY3VycnNsaWNlID0gaW1nLT5jdXJyZW50X3NsaWNlOworCXN0cnVjdCBkYXRhcGFydGl0aW9uICpkcDsKKworCWZpeHFwID0gKGZpeGVkX3BpY3R1cmVfcXAgfHwgZml4ZWRfc2xpY2VfcXApOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworCQkJaW1nLT5tOFswXVtpXVtqXSA9IDA7CisJCQlpbWctPm04WzFdW2ldW2pdID0gMDsKKwkJCWltZy0+bThbMl1baV1bal0gPSAwOworCQkJaW1nLT5tOFszXVtpXVtqXSA9IDA7CisJCX0KKworCWN1cnJlbnRfbWJfc2tpcCA9IDA7CisKKwljdXJyX21iLT5xcCA9IGltZy0+cXA7CisJY3Vycl9zZS50eXBlID0gU0VfTUJUWVBFOworCWN1cnJfc2UubWFwcGluZyA9IGxpbmZvX3VlOworCisJY3Vycl9tYi0+bWJfdHlwZV8yID0gMDsKKworCWlmIChpbWctPnR5cGUgPT0gSV9JTUcpCisJCWN1cnJfbWItPm1iX3R5cGUgPSAwOworCisJaW50ZXJwcmV0X21iX21vZGVfaShpbWcpOworCisJaW5pdF9tYWNyb2Jsb2NrKGltZyk7CisKKwlpZiAoKElTX0lOVFJBKGN1cnJfbWIpKSAmJiAoaW1nLT5hYnRfZmxhZykpIHsKKworI2lmIFRSQUNFCisJCXN0cm5jcHkoY3Vycl9zZS50cmFjZXN0cmluZywgImNhYnBfZmxhZyIsIFRSQUNFU1RSSU5HX1NJWkUpOworI2VuZGlmCisKKwkJY3Vycl9zZS5sZW4gPSAxOworCQljdXJyX3NlLnR5cGUgPSBTRV9DQUJQOworCQlyZWFkX3N5bnRheGVsZW1lbnRfZmxjKCZjdXJyX3NlKTsKKwkJY2FicF9mbGFnID0gY3Vycl9zZS52YWx1ZTE7CisJCWlmIChjYWJwX2ZsYWcgPT0gMCkgeworCQkJY3Vycl9tYi0+Q0FCUFswXSA9IDA7CisJCQljdXJyX21iLT5DQUJQWzFdID0gMDsKKwkJCWN1cnJfbWItPkNBQlBbMl0gPSAwOworCQkJY3Vycl9tYi0+Q0FCUFszXSA9IDA7CisJCX0gZWxzZSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQkJY3Vycl9zZS5sZW4gPSAxOworCQkJCWN1cnJfc2UudHlwZSA9IFNFX0NBQlA7CisJCQkJcmVhZF9zeW50YXhlbGVtZW50X2ZsYygmY3Vycl9zZSk7CisJCQkJY3Vycl9tYi0+Q0FCUFtpXSA9IGN1cnJfc2UudmFsdWUxOworCQkJfQorCQl9CisKKwl9IGVsc2UgeworCQljdXJyX21iLT5DQUJQWzBdID0gMDsKKwkJY3Vycl9tYi0+Q0FCUFsxXSA9IDA7CisJCWN1cnJfbWItPkNBQlBbMl0gPSAwOworCQljdXJyX21iLT5DQUJQWzNdID0gMDsKKworCX0KKworCWlmIChJU19JTlRSQShjdXJyX21iKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgLyo1Ki8oY2hyb21hX2Zvcm1hdCArIDQpOyBpKyspCisKKwkJCXJlYWRfaXByZWRfYmxvY2tfbW9kZXMoaW1nLCBpKTsKKwl9CisKKwljdXJyX3NlLnR5cGUgPSBTRV9DQlBfSU5UUkE7CisJY3Vycl9zZS5tYXBwaW5nID0gbGluZm9fY2JwX2ludHJhOworCisjaWYgVFJBQ0UKKwlzbnByaW50ZihjdXJyX3NlLnRyYWNlc3RyaW5nLCBUUkFDRVNUUklOR19TSVpFLCAiQ0JQIik7CisjZW5kaWYKKworCWlmIChpbWctPnR5cGUgPT0gSV9JTUcgfHwgSVNfSU5URVIoY3Vycl9tYikpIHsKKwkJY3Vycl9zZS5nb2xvbWJfbWF4bGV2ZWxzID0gMDsKKworCQlpZiAoMSkgeworCQkJZHAgPSAmKGN1cnJzbGljZS0+cGFydF9hcnJbMF0pOworCQkJY3Vycl9zZS5yZWFkaW5nID0gcmVhZGNwX2FlYzsKKwkJCWRwLT5yZWFkX3N5bnRheF9lbGVtZW50KCZjdXJyX3NlLCBpbWcsIGRwKTsKKwkJfQorCisKKwkJY3Vycl9tYi0+Y2JwID0gY3Vycl9zZS52YWx1ZTE7CisJCXB1c2hfZXMoVUVbTkNCUFtjdXJyX3NlLnZhbHVlMV1bMF1dWzBdLAorCQkJCVVFW05DQlBbY3Vycl9zZS52YWx1ZTFdWzBdXVsxXSk7CisKKwl9CisKKyMgaWYgMQorCWlmIChjdXJyX21iLT5jYnAgIT0gMCkKKwkJdGVtcGNicCA9IDE7CisJZWxzZQorCQl0ZW1wY2JwID0gMDsKKyNlbHNlCisKKwlpZiAoY2hyb21hX2Zvcm1hdCA9PSAyKQl7CisjaWYgVFJBQ0UKKwkJc25wcmludGYoY3Vycl9zZS50cmFjZXN0cmluZywgVFJBQ0VTVFJJTkdfU0laRSwgIkNCUDQyMiIpOworI2VuZGlmCisJCWN1cnJfc2UubWFwcGluZyA9IC8qbGluZm9fc2UqL2xpbmZvX3VlOworCQljdXJyX3NlLnR5cGUgPSBTRV9DQlBfSU5UUkE7CisJCXJlYWRzeW50YXhlbGVtZW50X3V2bGMoJmN1cnJfc2UsIGlucCk7CisJCWN1cnJfbWItPmNicDAxID0gY3Vycl9zZS52YWx1ZTE7CisJCWlvX3ByaW50ZigiICogVUUgY2JwMDEgcmVhZCA6IDB4JTAyWFxuIiwgY3Vycl9tYi0+Y2JwMDEpOworCX0KKworCWlmIChjaHJvbWFfZm9ybWF0ID09IDIpCXsKKwkJaWYgKGN1cnJfbWItPmNicCAhPSAwIHx8IGN1cnJfbWItPmNicDAxICE9IDApCisJCQl0ZW1wY2JwID0gMTsKKwkJZWxzZQorCQkJdGVtcGNicCA9IDA7CisKKwl9IGVsc2UgeworCQlpZiAoY3Vycl9tYi0+Y2JwICE9IDApCisJCQl0ZW1wY2JwID0gMTsKKwkJZWxzZQorCQkJdGVtcGNicCA9IDA7CisJfQorCisjZW5kaWYKKworCWlmIChJU19JTlRSQShjdXJyX21iKSAmJiAoaW1nLT5hYnRfZmxhZykgJiYgKGN1cnJfbWItPmNicCAmICgweEYpKSkgeworCQljdXJyX21iLT5DQUJUWzBdID0gY3Vycl9tYi0+Q0FCUFswXTsKKwkJY3Vycl9tYi0+Q0FCVFsxXSA9IGN1cnJfbWItPkNBQlBbMV07CisJCWN1cnJfbWItPkNBQlRbMl0gPSBjdXJyX21iLT5DQUJQWzJdOworCQljdXJyX21iLT5DQUJUWzNdID0gY3Vycl9tYi0+Q0FCUFszXTsKKwl9IGVsc2UgeworCisJCWN1cnJfbWItPkNBQlRbMF0gPSAwOworCQljdXJyX21iLT5DQUJUWzFdID0gMDsKKwkJY3Vycl9tYi0+Q0FCVFsyXSA9IDA7CisJCWN1cnJfbWItPkNBQlRbM10gPSAwOworCisJCWlmICghZml4cXAgJiYgKHRlbXBjYnApKSB7CisJCQlpZiAoSVNfSU5URVIoY3Vycl9tYikpCisJCQkJY3Vycl9zZS50eXBlID0gU0VfREVMVEFfUVVBTlRfSU5URVI7CisJCQllbHNlCisJCQkJY3Vycl9zZS50eXBlID0gU0VfREVMVEFfUVVBTlRfSU5UUkE7CisKKyNpZiBUUkFDRQorCQkJc25wcmludGYoY3Vycl9zZS50cmFjZXN0cmluZywKKwkJCQlUUkFDRVNUUklOR19TSVpFLCAiRGVsdGEgcXVhbnQgIik7CisjZW5kaWYKKworCQkJaWYgKDEpIHsKKwkJCQlkcCA9ICYoY3VycnNsaWNlLT5wYXJ0X2FyclswXSk7CisJCQkJY3Vycl9zZS5yZWFkaW5nID0gcmVhZGRxdWFudF9hZWM7CisJCQkJZHAtPnJlYWRfc3ludGF4X2VsZW1lbnQoJmN1cnJfc2UsIGltZywgZHApOworCQkJfQorCisJCQljdXJyX21iLT5kZWx0YV9xdWFudCA9IGN1cnJfc2UudmFsdWUxOworI2lmZGVmIERVTVBfREVCVUcKKwkJCWlmIChhdnNfZ2V0X2RlYnVnX2ZsYWcoKSAmIE1CX0lORk9fRFVNUCkgeworCQkJCWlvX3ByaW50ZigiICogU0UgZGVsdGFfcXVhbnQgcmVhZCA6ICVkXG4iLAorCQkJCQljdXJyX21iLT5kZWx0YV9xdWFudCk7CisJCQl9CisjZW5kaWYKKwkJCUNIRUNLREVMVEFRUAorCisJCQlpZiAodHJhbnNjb2RpbmdfZXJyb3JfZmxhZykKKwkJCQlyZXR1cm4gLTE7CisKKwkJCWltZy0+cXAgPSAoaW1nLT5xcCAtIE1JTl9RUCArIGN1cnJfbWItPmRlbHRhX3F1YW50CisJCQkJCSsgKE1BWF9RUCAtIE1JTl9RUCArIDEpKQorCQkJCQklIChNQVhfUVAgLSBNSU5fUVAgKyAxKSArIE1JTl9RUDsKKwkJfQorCisJCWlmIChmaXhxcCkgeworCQkJY3Vycl9tYi0+ZGVsdGFfcXVhbnQgPSAwOworCQkJaW1nLT5xcCA9IChpbWctPnFwIC0gTUlOX1FQICsgY3Vycl9tYi0+ZGVsdGFfcXVhbnQKKwkJCQkJKyAoTUFYX1FQIC0gTUlOX1FQICsgMSkpCisJCQkJCSUgKE1BWF9RUCAtIE1JTl9RUCArIDEpICsgTUlOX1FQOworCisJCX0KKyNpZmRlZiBEVU1QX0RFQlVHCisJCWlmIChhdnNfZ2V0X2RlYnVnX2ZsYWcoKSAmIE1CX0lORk9fRFVNUCkKKwkJCWlvX3ByaW50ZigiIC0gaW1nLT5xcCA6ICVkXG4iLCBpbWctPnFwKTsKKyNlbmRpZgorCX0KKworCXJlYWRfY2JwYW5kY29lZmZzZnJvbV9uYWwoaW1nKTsKKwlyZXR1cm4gREVDT0RFX01COworfQorCisvKiEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFxicmllZgorICogICAgZmluZGluZyBlbmQgb2YgYSBzbGljZSBpbiBjYXNlIHRoaXMgaXMgbm90IHRoZSBlbmQgb2YgYSBmcmFtZQorICoKKyAqIFVuc3VyZSB3aGV0aGVyIHRoZSAiY29ycmVjdGlvbiIgYmVsb3cgYWN0dWFsbHkgc29sdmVzIGFuIG9mZi1ieS1vbmUKKyAqIHByb2JsZW0gb3Igd2hldGhlciBpdCBpbnRyb2R1Y2VzIG9uZSBpbiBzb21lIGNhc2VzIDotKCAgQW55d2F5LAorICogd2l0aCB0aGlzIGNoYW5nZSB0aGUgYml0IHN0cmVhbSBmb3JtYXQgd29ya3Mgd2l0aCBBRUMgYWdhaW4uCisgKiBTdFcsIDguNy4wMgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitpbnQgYWVjX3N0YXJ0Y29kZV9mb2xsb3dzKHN0cnVjdCBpbWdfcGFyICppbWcsIGludCBlb3NfYml0KQoreworCXN0cnVjdCBzbGljZV9zICpjdXJyc2xpY2UgPSBpbWctPmN1cnJlbnRfc2xpY2U7CisJc3RydWN0IGRhdGFwYXJ0aXRpb24gKmRwOworCXVuc2lnbmVkIGludCBiaXQ7CisJc3RydWN0IGRlY29kaW5nX2Vudmlyb25tZW50X3MgKmRlcF9kcDsKKworCWRwID0gJihjdXJyc2xpY2UtPnBhcnRfYXJyWzBdKTsKKwlkZXBfZHAgPSAmKGRwLT5kZV9hZWMpOworCisJaWYgKGVvc19iaXQpCisJCWJpdCA9IGJpYXJpX2RlY29kZV9maW5hbChkZXBfZHApOworCWVsc2UKKwkJYml0ID0gMDsKKworCXJldHVybiBiaXQgPT0gMSA/IDEgOiAwOworfQorCisjaWZkZWYgQVZTUF9MT05HX0NBQkFDCitpbnQgcHJvY2Vzc19sb25nX2NhYmFjKHZvaWQpCisjZWxzZQordm9pZCBtYWluKHZvaWQpCisjZW5kaWYKK3sKKwlpbnQgZGF0YTMyOworCWludCBjdXJyZW50X2hlYWRlcjsKKwlpbnQgaTsKKwlpbnQgdG1wOworCWludCByZXQ7CisKKwlpbnQgYnl0ZV9zdGFydHBvc2l0aW9uOworCWludCBhZWNfbWJfc3R1ZmZpbmdfYml0OworCXN0cnVjdCBzbGljZV9zICpjdXJyc2xpY2U7CisjaWZkZWYgUEVSRk9STUFOQ0VfREVCVUcKKwlwcl9pbmZvKCJlbnRlciAlc1xyXG4iLCBfX2Z1bmNfXyk7CisjZW5kaWYKKwl0cmFuc2NvZGluZ19lcnJvcl9mbGFnID0gMDsKKwlyZXQgPSAwOworCWVzX2J1ZiA9IGVzX3dyaXRlX2FkZHJfdmlydDsKKworCWlmIChsb2NhbF9oZWFwX2luaXQoTUFYX0NPREVEX0ZSQU1FX1NJWkUgKiA0KSA8IDApIHsKKwkJcmV0ID0gLTE7CisJCWdvdG8gRW5kOworCX0KKworCWltZyA9IChzdHJ1Y3QgaW1nX3BhciAqKWxvY2FsX2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgaW1nX3BhcikpOworCWlmIChpbWcJPT0gTlVMTCkgeworCQlub19tZW1fZXhpdCgibWFpbjogaW1nIik7CisJCXJldCA9IC0xOworCQlnb3RvIEVuZDsKKwl9CisJc3RhdF9iaXRzX3B0ciA9IChzdHJ1Y3Qgc3RhdF9iaXRzICopbG9jYWxfYWxsb2MoMSwKKwkJCXNpemVvZihzdHJ1Y3Qgc3RhdF9iaXRzKSk7CisJaWYgKHN0YXRfYml0c19wdHIgPT0gTlVMTCkgeworCQlub19tZW1fZXhpdCgibWFpbjogc3RhdF9iaXRzIik7CisJCXJldCA9IC0xOworCQlnb3RvIEVuZDsKKwl9CisKKwljdXJyX3N0cmVhbSA9IGFsbG9jX2JpdHN0cmVhbSgpOworCWlmIChjdXJyX3N0cmVhbSA9PSBOVUxMKSB7CisJCWlvX3ByaW50ZigiYWxsb2MgYml0c3RyZWFtIGZhaWxlZFxuIik7CisJCXJldCA9IC0xOworCQlnb3RvIEVuZDsKKwl9CisKKwljaHJvbWFfZm9ybWF0ID0gMTsKKwlkZW11bGF0ZV9lbmFibGUgPSAwOworCWltZy0+c2VxX2hlYWRlcl9pbmRpY2F0ZSA9IDE7CisKKyNpZmRlZiBBVlNQX0xPTkdfQ0FCQUMKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoTE9OR19DQUJBQ19SRVEpOworCXByb2dyZXNzaXZlX3NlcXVlbmNlID0gKGRhdGEzMiA+PiAxKSAmIDE7CisJZml4ZWRfcGljdHVyZV9xcCA9IChkYXRhMzIgPj4gMikgJiAxOworCWltZy0+cGljdHVyZV9zdHJ1Y3R1cmUgPSAoZGF0YTMyID4+IDMpICYgMTsKKwlpbWctPnR5cGUgPSAoZGF0YTMyID4+IDQpICYgMzsKKwlza2lwX21vZGVfZmxhZyA9IChkYXRhMzIgPj4gNikgJiAxOworCisJc3JjX3N0YXJ0ID0gUkVBRF9WUkVHKExPTkdfQ0FCQUNfU1JDX0FERFIpOworCWRlc19zdGFydCA9IFJFQURfVlJFRyhMT05HX0NBQkFDX0RFU19BRERSKTsKKworCWRhdGEzMiA9IFJFQURfVlJFRyhMT05HX0NBQkFDX1BJQ19TSVpFKTsKKwlob3Jpem9udGFsX3NpemUgPSAoZGF0YTMyID4+IDApICYgMHhmZmZmOworCXZlcnRpY2FsX3NpemUgPSAoZGF0YTMyID4+IDE2KSAmIDB4ZmZmZjsKKwlpZiAoaG9yaXpvbnRhbF9zaXplICogdmVydGljYWxfc2l6ZSA+IDE5MjAgKiAxMDgwKSB7CisJCWlvX3ByaW50ZigicGljIHNpemUgY2hlY2sgZmFpbGVkOiB3aWR0aCA9ICVkLCBoZWlnaHQgPSAlZFxuIiwKKwkJCWhvcml6b250YWxfc2l6ZSwgdmVydGljYWxfc2l6ZSk7CisJCXJldCA9IC0xOworCQlnb3RvIEVuZDsKKwl9CisKKwl2bGRfbWVtX3N0YXJ0X2FkZHIgPSBSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fU1RBUlRfUFRSKTsKKwl2bGRfbWVtX2VuZF9hZGRyID0gUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0VORF9QVFIpOworCisjZWxzZQorCXByb2dyZXNzaXZlX3NlcXVlbmNlID0gMDsKKwlmaXhlZF9waWN0dXJlX3FwID0gMDsKKwlpbWctPnBpY3R1cmVfc3RydWN0dXJlID0gMDsKKwlpbWctPnR5cGUgPSBJX0lNRzsKKwlza2lwX21vZGVfZmxhZyA9IDE7CisJaG9yaXpvbnRhbF9zaXplID0gMTkyMDsKKwl2ZXJ0aWNhbF9zaXplID0gMTA4MDsKKworCXNyY19zdGFydCA9IDA7CisjZW5kaWYKKworCWlmIChob3Jpem9udGFsX3NpemUgJSAxNiAhPSAwKQorCQlpbWctPmF1dG9fY3JvcF9yaWdodCA9IDE2IC0gKGhvcml6b250YWxfc2l6ZSAlIDE2KTsKKwllbHNlCisJCWltZy0+YXV0b19jcm9wX3JpZ2h0ID0gMDsKKworCWlmICghcHJvZ3Jlc3NpdmVfc2VxdWVuY2UpIHsKKwkJaWYgKHZlcnRpY2FsX3NpemUgJSAzMiAhPSAwKQorCQkJaW1nLT5hdXRvX2Nyb3BfYm90dG9tID0gMzIgLSAodmVydGljYWxfc2l6ZSAlIDMyKTsKKwkJZWxzZQorCQkJaW1nLT5hdXRvX2Nyb3BfYm90dG9tID0gMDsKKwl9IGVsc2UgeworCQlpZiAodmVydGljYWxfc2l6ZSAlIDE2ICE9IDApCisJCQlpbWctPmF1dG9fY3JvcF9ib3R0b20gPSAxNiAtICh2ZXJ0aWNhbF9zaXplICUgMTYpOworCQllbHNlCisJCQlpbWctPmF1dG9fY3JvcF9ib3R0b20gPSAwOworCX0KKworCWltZy0+d2lkdGggPSAoaG9yaXpvbnRhbF9zaXplICsgaW1nLT5hdXRvX2Nyb3BfcmlnaHQpOworCWlmIChpbWctPnBpY3R1cmVfc3RydWN0dXJlKQorCQlpbWctPmhlaWdodCA9ICh2ZXJ0aWNhbF9zaXplICsgaW1nLT5hdXRvX2Nyb3BfYm90dG9tKTsKKwllbHNlCisJCWltZy0+aGVpZ2h0ID0gKHZlcnRpY2FsX3NpemUgKyBpbWctPmF1dG9fY3JvcF9ib3R0b20pIC8gMjsKKwlpbWctPndpZHRoX2NyID0gKGltZy0+d2lkdGggPj4gMSk7CisKKwlpbWctPnBpY193aWR0aF9pbm1icyA9IGltZy0+d2lkdGggLyBNQl9CTE9DS19TSVpFOworCWltZy0+cGljX2hlaWdodF9pbm1icyA9IGltZy0+aGVpZ2h0IC8gTUJfQkxPQ0tfU0laRTsKKwlpbWctPnBpY19zaXplX2lubWJzID0gaW1nLT5waWNfd2lkdGhfaW5tYnMgKiBpbWctPnBpY19oZWlnaHRfaW5tYnM7CisKKwlpb19wcmludGYoCisJCQkiW0xPTkcgQ0FCQUNdIFN0YXJ0IFRyYW5zY29kaW5nIGZyb20gMHgleCB0byAweCV4IFNpemUgOiAlZCB4ICVkXHJcbiIsCisJCQlzcmNfc3RhcnQsIGRlc19zdGFydCwgaG9yaXpvbnRhbF9zaXplLCB2ZXJ0aWNhbF9zaXplKTsKKyNpZiAwCisJaW9fcHJpbnRmKCJWTERfTUVNX1ZJRklGT19TVEFSVF9QVFIgJXhcclxuIiwKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19TVEFSVF9QVFIpKTsKKwlpb19wcmludGYoIlZMRF9NRU1fVklGSUZPX0NVUlJfUFRSICV4XHJcbiIsCisJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fQ1VSUl9QVFIpKTsKKwlpb19wcmludGYoIlZMRF9NRU1fVklGSUZPX0VORF9QVFIgJXhcclxuIiwKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19FTkRfUFRSKSk7CisJaW9fcHJpbnRmKCJWTERfTUVNX1ZJRklGT19XUCAleFxyXG4iLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1dQKSk7CisJaW9fcHJpbnRmKCJWTERfTUVNX1ZJRklGT19SUCAleFxyXG4iLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSk7CisJaW9fcHJpbnRmKCJWTERfTUVNX1ZCVUZfUkRfUFRSICV4XHJcbiIsCisJCQlSRUFEX1ZSRUcoVkxEX01FTV9WQlVGX1JEX1BUUikpOworCWlvX3ByaW50ZigiVkxEX01FTV9WSUZJRk9fQlVGX0NOVEwgJXhcclxuIiwKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19CVUZfQ05UTCkpOworI2VuZGlmCisJaW9fcHJpbnRmKAorCQkJIltMT05HIENBQkFDXSBwcm9ncmVzc2l2ZV9zZXF1ZW5jZSA6ICVkLCBmaXhlZF9waWN0dXJlX3FwIDogJWQsIHNraXBfbW9kZV9mbGFnIDogJWRcclxuIiwKKwkJCXByb2dyZXNzaXZlX3NlcXVlbmNlLCBmaXhlZF9waWN0dXJlX3FwLCBza2lwX21vZGVfZmxhZyk7CisJaW9fcHJpbnRmKCJbTE9ORyBDQUJBQ10gcGljdHVyZV9zdHJ1Y3R1cmUgOiAlZCwgcGljdHVyZV90eXBlIDogJWRcclxuIiwKKwkJCWltZy0+cGljdHVyZV9zdHJ1Y3R1cmUsIGltZy0+dHlwZSk7CisKKwlvcGVuX2lyYWJzKHBfaXJhYnMpOworCisKKwlpZiAoaW5pdGlhbF9kZWNvZGUoKSA9PSAwKSB7CisJCWlvX3ByaW50ZigiaW5pdGlhbF9kZWNvZGUgZmFpbGVkXG4iKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gRW5kOworCX0KKworCWluaXRfZXMoKTsKKworCWN1cnJlbnRfaGVhZGVyID0gaGVhZGVyKCk7CisJaW9fcHJpbnRmKCJbTE9ORyBDQUJBQ10gaGVhZGVyIFJldHVybiA6ICVkXG4iLCBjdXJyZW50X2hlYWRlcik7CisKKwl0bXAgPSBzbGljZV9oZWFkZXIodGVtcF9zbGljZV9idWYsIGZpcnN0X3NsaWNlX3N0YXJ0cG9zLAorCQkJZmlyc3Rfc2xpY2VfbGVuZ3RoKTsKKworCWluaXRfY29udGV4dHMoaW1nKTsKKwlhZWNfbmV3X3NsaWNlKCk7CisJYnl0ZV9zdGFydHBvc2l0aW9uID0gKGN1cnJfc3RyZWFtLT5mcmFtZV9iaXRvZmZzZXQpIC8gODsKKworCWN1cnJzbGljZSA9IGltZy0+Y3VycmVudF9zbGljZTsKKworCWlmICgxKSB7CisJCWZvciAoaSA9IDA7IGkgPCAxOyBpKyspIHsKKwkJCWltZy0+Y3VycmVudF9zbGljZS0+cGFydF9hcnJbaV0ucmVhZF9zeW50YXhfZWxlbWVudCA9CisJCQkJCXJlYWRfc3ludGF4ZWxlbWVudF9hZWM7CisJCQlpbWctPmN1cnJlbnRfc2xpY2UtPnBhcnRfYXJyW2ldLmJpdHN0cmVhbSA9IGN1cnJfc3RyZWFtOworCQl9CisJCWN1cnJfc3RyZWFtID0gY3VycnNsaWNlLT5wYXJ0X2FyclswXS5iaXRzdHJlYW07CisJfQorCWlmICgoY3Vycl9zdHJlYW0tPmZyYW1lX2JpdG9mZnNldCkgJSA4ICE9IDApCisJCWJ5dGVfc3RhcnRwb3NpdGlvbisrOworCisJYXJpZGVjb19zdGFydF9kZWNvZGluZygmaW1nLT5jdXJyZW50X3NsaWNlLT5wYXJ0X2FyclswXS5kZV9hZWMsCisJCQljdXJyX3N0cmVhbS0+c3RyZWFtX2J1ZmZlciwgKGJ5dGVfc3RhcnRwb3NpdGlvbiksCisJCQkmKGN1cnJfc3RyZWFtLT5yZWFkX2xlbiksIGltZy0+dHlwZSk7CisKKwlpbWctPmN1cnJlbnRfbWJfbnIgPSAwOworCXRvdGFsX21iX2NvdW50ID0gMDsKKwl3aGlsZSAoaW1nLT5jdXJyZW50X21iX25yIDwgaW1nLT5waWNfc2l6ZV9pbm1icykKKworCXsKKwkJc3RhcnRfbWFjcm9ibG9jayhpbWcpOworCQlpZiAoLTEgPT0gcmVhZF9vbmVfbWFjcm9ibG9jayhpbWcpKSB7CisJCQlyZXQgPSAtMTsKKwkJCXByX2luZm8oIm1hY3JvYmxvY2sgdHJhbnMgZmFpbGVkLCBleGl0XG4iKTsKKwkJCWdvdG8gRW5kOworCQl9CisJCWlmIChpbWctPmNvZF9jb3VudGVyIDw9IDApCisJCQlhZWNfbWJfc3R1ZmZpbmdfYml0ID0gYWVjX3N0YXJ0Y29kZV9mb2xsb3dzKGltZywgMSk7CisJCWltZy0+Y3VycmVudF9tYl9ucisrOworCX0KKworCXB1c2hfZXMoMHhmZiwgOCk7CisJaW9fcHJpbnRmKCIgVG90YWwgRVNfTEVOR1RIIDogJWRcbiIsIGVzX3B0cik7CisKKyNpZmRlZiBBVlNQX0xPTkdfQ0FCQUMKKwlwdXNoX2VzKDB4ZmYsIDY0KTsKKwlpZiAoZXNfYnVmX2lzX292ZXJmbG93KSB7CisJCWlvX3ByaW50ZigiZmF0YWwgZXJyb3I6IGVzX2J1Zl9pc19vdmVyZmxvd1xuIik7CisJCXJldCA9IC0xOworCQlnb3RvIEVuZDsKKwl9CisKKwlpZiAodHJhbnNjb2RpbmdfZXJyb3JfZmxhZyA9PSAwKSB7CisjaWYgMQorCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQllc193cml0ZV9hZGRyX3BoeSwKKwkJCWVzX3B0ciwgRE1BX1RPX0RFVklDRSk7CisKKwkJd21iKCk7IC8qKi8KKyNlbmRpZgorCX0KKyNlbHNlCisJZmNsb3NlKGZfZXMpOworI2VuZGlmCisKK0VuZDoKKyNpZmRlZiBBVlNQX0xPTkdfQ0FCQUMKKwlXUklURV9WUkVHKExPTkdfQ0FCQUNfUkVRLCAwKTsKKyNlbmRpZgorCWxvY2FsX2hlYXBfdW5pbml0KCk7CisjaWZkZWYgUEVSRk9STUFOQ0VfREVCVUcKKwlwcl9pbmZvKCJleGl0ICVzXHJcbiIsIF9fZnVuY19fKTsKKyNlbmRpZgorCXJldHVybiByZXQ7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9hdnMyL01ha2VmaWxlIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL2F2czIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZlODU2NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9hdnMyL01ha2VmaWxlCkBAIC0wLDAgKzEsMiBAQAorb2JqLSQoQ09ORklHX0FNTE9HSUNfTUVESUFfVkRFQ19BVlMyKSArPSBhbXZkZWNfYXZzMi5vCithbXZkZWNfYXZzMi1vYmpzICs9IHZhdnMyLm8gYXZzMl9idWZtZ3IubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL2F2czIvYXZzMl9idWZtZ3IuYyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9hdnMyL2F2czJfYnVmbWdyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU5YTNkMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9hdnMyL2F2czJfYnVmbWdyLmMKQEAgLTAsMCArMSwyMjA1IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorKiBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqCisqIERlc2NyaXB0aW9uOgorKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy9hbXN0cmVhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmZvcm1hdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZnJhbWVfc3luYy9wdHNzZXJ2Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jYW52YXMvY2FudmFzLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3Byb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3JlY2VpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtY29udGlndW91cy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvdGVlLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC90ZWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC9jbG9jay5oPgorI2luY2x1ZGUgIi4uLy4uLy4uL3N0cmVhbV9pbnB1dC9hbXBvcnRzL2FtcG9ydHNfcHJpdi5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29kZWNfbW0uaD4KKyNpbmNsdWRlICIuLi91dGlscy9kZWNvZGVyX21tdV9ib3guaCIKKyNpbmNsdWRlICIuLi91dGlscy9kZWNvZGVyX2JtbXVfYm94LmgiCisjaW5jbHVkZSAiYXZzMl9nbG9iYWwuaCIKKworI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmRlY19yZWcuaD4KKyNpbmNsdWRlICIuLi91dGlscy92ZGVjLmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvYW12ZGVjLmgiCisKKyN1bmRlZiBwcl9pbmZvCisjZGVmaW5lIHByX2luZm8gcHJpbnRrCisKKyNkZWZpbmUgYXNzZXJ0KGNoa19jb25kKSB7XAorCWlmICghKGNoa19jb25kKSlcCisJCXByX2luZm8oImVycm9yIGxpbmUgJWRcbiIsIF9fTElORV9fKTtcCisJd2hpbGUgKCEoY2hrX2NvbmQpKVwKKwkJO1wKK30KKworaW50MTZfdCBnZXRfcGFyYW0odWludDE2X3QgdmFsdWUsIGludDhfdCAqcHJpbnRfaW5mbykKK3sKKwlpZiAoaXNfYXZzMl9wcmludF9wYXJhbSgpKQorCQlwcl9pbmZvKCIlcyA9ICV4XG4iLCBwcmludF9pbmZvLCB2YWx1ZSk7CisJcmV0dXJuIChpbnQxNl90KXZhbHVlOworfQorCit2b2lkIHJlYWRBbGZDb2VmZihzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYywgc3RydWN0IEFMRlBhcmFtX3MgKkFsZnApCit7CisJaW50MzJfdCBwb3M7CisJdW5pb24gcGFyYW1fdSAqcnBtX3BhcmFtID0gJmF2czJfZGVjLT5wYXJhbTsKKworCWludDMyX3QgZiA9IDAsIHN5bWJvbCwgcHJlX3N5bWJvbGU7CisJY29uc3QgaW50MzJfdCBudW1Db2VmZiA9IChpbnQzMl90KUFMRl9NQVhfTlVNX0NPRUY7CisKKwlzd2l0Y2ggKEFsZnAtPmNvbXBvbmVudElEKSB7CisJY2FzZSBBTEZfQ2I6CisJY2FzZSBBTEZfQ3I6IHsKKwkJZm9yIChwb3MgPSAwOyBwb3MgPCBudW1Db2VmZjsgcG9zKyspIHsKKwkJCWlmIChBbGZwLT5jb21wb25lbnRJRCA9PSBBTEZfQ2IpCisJCQkJQWxmcC0+Y29lZmZtdWx0aVswXVtwb3NdID0KKwkJCQkJZ2V0X3BhcmFtKAorCQkJCQlycG1fcGFyYW0tPmFsZi5hbGZfY2JfY29lZmZtdWx0aVtwb3NdLAorCQkJCQkiQ2hyb21hIEFMRiBjb2VmZmljaWVudHMiKTsKKwkJCWVsc2UKKwkJCQlBbGZwLT5jb2VmZm11bHRpWzBdW3Bvc10gPQorCQkJCQlnZXRfcGFyYW0oCisJCQkJCXJwbV9wYXJhbS0+YWxmLmFsZl9jcl9jb2VmZm11bHRpW3Bvc10sCisJCQkJCSJDaHJvbWEgQUxGIGNvZWZmaWNpZW50cyIpOworI2lmIENoZWNrX0JpdHN0cmVhbQorCQkJaWYgKHBvcyA8PSA3KQorCQkJCWFzc2VydChBbGZwLT5jb2VmZm11bHRpWzBdW3Bvc10gPj0gLTY0CisJCQkJCSYmIEFsZnAtPmNvZWZmbXVsdGlbMF1bcG9zXSA8PSA2Myk7CisJCQlpZiAocG9zID09IDgpCisJCQkJYXNzZXJ0KEFsZnAtPmNvZWZmbXVsdGlbMF1bcG9zXSA+PSAtMTA4OAorCQkJCQkmJiBBbGZwLT5jb2VmZm11bHRpWzBdW3Bvc10gPD0gMTA3MSk7CisjZW5kaWYKKwkJfQorCX0KKwlicmVhazsKKwljYXNlIEFMRl9ZOiB7CisJCWludDMyX3QgcmVnaW9uX2Rpc3RhbmNlX2lkeCA9IDA7CisJCUFsZnAtPmZpbHRlcnNfcGVyX2dyb3VwID0KKwkJCWdldF9wYXJhbShycG1fcGFyYW0tPmFsZi5hbGZfZmlsdGVyc19udW1fbV8xLAorCQkJCSJBTEZfZmlsdGVyX251bWJlcl9taW51c18xIik7CisjaWYgQ2hlY2tfQml0c3RyZWFtCisJCWFzc2VydChBbGZwLT5maWx0ZXJzX3Blcl9ncm91cCA+PSAwCisJCQkmJiBBbGZwLT5maWx0ZXJzX3Blcl9ncm91cCA8PSAxNSk7CisjZW5kaWYKKwkJQWxmcC0+ZmlsdGVyc19wZXJfZ3JvdXAgPSBBbGZwLT5maWx0ZXJzX3Blcl9ncm91cCArIDE7CisKKwkJbWVtc2V0KEFsZnAtPmZpbHRlclBhdHRlcm4sIDAsIE5PX1ZBUl9CSU5TICogc2l6ZW9mKGludDMyX3QpKTsKKwkJcHJlX3N5bWJvbGUgPSAwOworCQlzeW1ib2wgPSAwOworCQlmb3IgKGYgPSAwOyBmIDwgQWxmcC0+ZmlsdGVyc19wZXJfZ3JvdXA7IGYrKykgeworCQkJaWYgKGYgPiAwKSB7CisJCQkJaWYgKEFsZnAtPmZpbHRlcnNfcGVyX2dyb3VwICE9IDE2KSB7CisJCQkJCXN5bWJvbCA9CisJCQkJCWdldF9wYXJhbShycG1fcGFyYW0tPmFsZi5yZWdpb25fZGlzdGFuY2UKKwkJCQkJCVtyZWdpb25fZGlzdGFuY2VfaWR4KytdLAorCQkJCQkJIlJlZ2lvbiBkaXN0YW5jZSIpOworCQkJCX0gZWxzZSB7CisJCQkJCXN5bWJvbCA9IDE7CisJCQkJfQorCQkJCUFsZnAtPmZpbHRlclBhdHRlcm5bc3ltYm9sICsgcHJlX3N5bWJvbGVdID0gMTsKKwkJCQlwcmVfc3ltYm9sZSA9IHN5bWJvbCArIHByZV9zeW1ib2xlOworCQkJfQorCisJCQlmb3IgKHBvcyA9IDA7IHBvcyA8IG51bUNvZWZmOyBwb3MrKykgeworCQkJCUFsZnAtPmNvZWZmbXVsdGlbZl1bcG9zXSA9CisJCQkJZ2V0X3BhcmFtKAorCQkJCQlycG1fcGFyYW0tPmFsZi5hbGZfeV9jb2VmZm11bHRpW2ZdW3Bvc10sCisJCQkJCSJMdW1hIEFMRiBjb2VmZmljaWVudHMiKTsKKyNpZiBDaGVja19CaXRzdHJlYW0KKwkJCQlpZiAocG9zIDw9IDcpCisJCQkJCWFzc2VydCgKKwkJCQkJCUFsZnAtPmNvZWZmbXVsdGlbZl1bcG9zXQorCQkJCQkJPj0gLTY0ICYmCisJCQkJCQlBbGZwLT5jb2VmZm11bHRpW2ZdW3Bvc10KKwkJCQkJCTw9IDYzKTsKKwkJCQlpZiAocG9zID09IDgpCisJCQkJCWFzc2VydCgKKwkJCQkJCUFsZnAtPmNvZWZmbXVsdGlbZl1bcG9zXQorCQkJCQkJPj0gLTEwODggJiYKKwkJCQkJCUFsZnAtPmNvZWZmbXVsdGlbZl1bcG9zXQorCQkJCQkJPD0gMTA3MSk7CisjZW5kaWYKKworCQkJfQorCQl9CisKKyNpZiBDaGVja19CaXRzdHJlYW0KKwkJYXNzZXJ0KHByZV9zeW1ib2xlID49IDAgJiYgcHJlX3N5bWJvbGUgPD0gMTUpOworCisjZW5kaWYKKwl9CisJYnJlYWs7CisJZGVmYXVsdDogeworCQlwcl9pbmZvKCJOb3QgYSBsZWdhbCBjb21wb25lbnQgSURcbiIpOworCQlhc3NlcnQoMCk7CisJCXJldHVybjsgLyogZXhpdCgtMSk7Ki8KKwl9CisJfQorfQorCit2b2lkIFJlYWRfQUxGX3BhcmFtKHN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjKQoreworCXN0cnVjdCBpbnBfcGFyICAgICppbnB1dCA9ICZhdnMyX2RlYy0+aW5wdXQ7CisJc3RydWN0IEltYWdlUGFyYW1ldGVyc19zICAgICppbWcgPSAmYXZzMl9kZWMtPmltZzsKKwl1bmlvbiBwYXJhbV91ICpycG1fcGFyYW0gPSAmYXZzMl9kZWMtPnBhcmFtOworCWludDMyX3QgY29tcElkeDsKKwlpZiAoaW5wdXQtPmFsZl9lbmFibGUpIHsKKwkJaW1nLT5waWNfYWxmX29uWzBdID0KKwkJCWdldF9wYXJhbSgKKwkJCXJwbV9wYXJhbS0+YWxmLnBpY3R1cmVfYWxmX2VuYWJsZV9ZLAorCQkJImFsZl9waWNfZmxhZ19ZIik7CisJCWltZy0+cGljX2FsZl9vblsxXSA9CisJCQlnZXRfcGFyYW0oCisJCQlycG1fcGFyYW0tPmFsZi5waWN0dXJlX2FsZl9lbmFibGVfQ2IsCisJCQkiYWxmX3BpY19mbGFnX0NiIik7CisJCWltZy0+cGljX2FsZl9vblsyXSA9CisJCQlnZXRfcGFyYW0oCisJCQlycG1fcGFyYW0tPmFsZi5waWN0dXJlX2FsZl9lbmFibGVfQ3IsCisJCQkiYWxmX3BpY19mbGFnX0NyIik7CisKKwkJYXZzMl9kZWMtPm1fYWxmUGljdHVyZVBhcmFtW0FMRl9ZXS5hbGZfZmxhZworCQkJPSBpbWctPnBpY19hbGZfb25bQUxGX1ldOworCQlhdnMyX2RlYy0+bV9hbGZQaWN0dXJlUGFyYW1bQUxGX0NiXS5hbGZfZmxhZworCQkJPSBpbWctPnBpY19hbGZfb25bQUxGX0NiXTsKKwkJYXZzMl9kZWMtPm1fYWxmUGljdHVyZVBhcmFtW0FMRl9Dcl0uYWxmX2ZsYWcKKwkJCT0gaW1nLT5waWNfYWxmX29uW0FMRl9Dcl07CisJCWlmIChpbWctPnBpY19hbGZfb25bMF0KKwkJCXx8IGltZy0+cGljX2FsZl9vblsxXQorCQkJfHwgaW1nLT5waWNfYWxmX29uWzJdKSB7CisJCQlmb3IgKGNvbXBJZHggPSAwOworCQkJCWNvbXBJZHggPCBOVU1fQUxGX0NPTVBPTkVOVDsKKwkJCQljb21wSWR4KyspIHsKKwkJCQlpZiAoaW1nLT5waWNfYWxmX29uW2NvbXBJZHhdKSB7CisJCQkJCXJlYWRBbGZDb2VmZigKKwkJCQkJYXZzMl9kZWMsCisJCQkJCSZhdnMyX2RlYy0+bV9hbGZQaWN0dXJlUGFyYW1bY29tcElkeF0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworfQorCit2b2lkIEdldF9TZXF1ZW5jZUhlYWRlcihzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYykKK3sKKwlzdHJ1Y3QgaW5wX3BhciAgICAqaW5wdXQgPSAmYXZzMl9kZWMtPmlucHV0OworCXN0cnVjdCBJbWFnZVBhcmFtZXRlcnNfcyAgICAqaW1nID0gJmF2czJfZGVjLT5pbWc7CisJc3RydWN0IFZpZGVvX0NvbV9kYXRhX3MgKmhjID0gJmF2czJfZGVjLT5oYzsKKwlzdHJ1Y3QgVmlkZW9fRGVjX2RhdGFfcyAqaGQgPSAmYXZzMl9kZWMtPmhkOworCXVuaW9uIHBhcmFtX3UgKnJwbV9wYXJhbSA9ICZhdnMyX2RlYy0+cGFyYW07CisJLyppbnQzMl90IGksIGo7Ki8KKworCS8qZnByX2luZm8oc3Rkb3V0LCAiU2VxdWVuY2UgSGVhZGVyXG4iKTsqLworCS8qbWVtY3B5KGN1cnJTdHJlYW0tPnN0cmVhbUJ1ZmZlciwgYnVmLCBsZW5ndGgpOyovCisJLypjdXJyU3RyZWFtLT5jb2RlX2xlbiA9IGN1cnJTdHJlYW0tPmJpdHN0cmVhbV9sZW5ndGggPSBsZW5ndGg7Ki8KKwkvKmN1cnJTdHJlYW0tPnJlYWRfbGVuID0gY3VyclN0cmVhbS0+ZnJhbWVfYml0b2Zmc2V0ID0gKHN0YXJ0Y29kZXBvcyArCisJICAxKSAqIDg7Ki8KKworCWlucHV0LT5wcm9maWxlX2lkICAgICAgICAgICA9CisJCWdldF9wYXJhbShycG1fcGFyYW0tPnAucHJvZmlsZV9pZCwgInByb2ZpbGVfaWQiKTsKKwlpbnB1dC0+bGV2ZWxfaWQgICAgICAgICAgICAgPQorCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLmxldmVsX2lkLCAibGV2ZWxfaWQiKTsKKwloZC0+cHJvZ3Jlc3NpdmVfc2VxdWVuY2UgICAgICAgID0KKwkJZ2V0X3BhcmFtKAorCQkJcnBtX3BhcmFtLT5wLnByb2dyZXNzaXZlX3NlcXVlbmNlLAorCQkJInByb2dyZXNzaXZlX3NlcXVlbmNlIik7CisjaWYgSU5URVJMQUNFX0NPRElORworCWhkLT5pc19maWVsZF9zZXF1ZW5jZSAgICAgICAgICAgPQorCQlnZXRfcGFyYW0oCisJCQlycG1fcGFyYW0tPnAuaXNfZmllbGRfc2VxdWVuY2UsCisJCQkiZmllbGRfY29kZWRfc2VxdWVuY2UiKTsKKyNlbmRpZgorI2lmIEhBTEZfUElYRUxfQ09NUEVOU0FUSU9OIHx8IEhBTEZfUElYRUxfQ0hST01BCisJaW1nLT5pc19maWVsZF9zZXF1ZW5jZSA9IGhkLT5pc19maWVsZF9zZXF1ZW5jZTsKKyNlbmRpZgorCWhkLT5ob3Jpem9udGFsX3NpemUgPQorCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLmhvcml6b250YWxfc2l6ZSwgImhvcml6b250YWxfc2l6ZSIpOworCWhkLT52ZXJ0aWNhbF9zaXplID0KKwkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC52ZXJ0aWNhbF9zaXplLCAidmVydGljYWxfc2l6ZSIpOworCWlucHV0LT5jaHJvbWFfZm9ybWF0ICAgICAgICAgICAgICAgPQorCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLmNocm9tYV9mb3JtYXQsICJjaHJvbWFfZm9ybWF0Iik7CisJaW5wdXQtPm91dHB1dF9iaXRfZGVwdGggPSA4OworCWlucHV0LT5zYW1wbGVfYml0X2RlcHRoID0gODsKKwloZC0+c2FtcGxlX3ByZWNpc2lvbiA9IDE7CisJaWYgKGlucHV0LT5wcm9maWxlX2lkID09IEJBU0VMSU5FMTBfUFJPRklMRSkgeyAvKiAxMGJpdCBwcm9maWxlICgweDUyKSovCisJCWlucHV0LT5vdXRwdXRfYml0X2RlcHRoID0KKwkJCWdldF9wYXJhbShycG1fcGFyYW0tPnAuc2FtcGxlX3ByZWNpc2lvbiwKKwkJCSJzYW1wbGVfcHJlY2lzaW9uIik7CisJCWlucHV0LT5vdXRwdXRfYml0X2RlcHRoID0KKwkJCTYgKyAoaW5wdXQtPm91dHB1dF9iaXRfZGVwdGgpICogMjsKKwkJaW5wdXQtPnNhbXBsZV9iaXRfZGVwdGggPQorCQkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5lbmNvZGluZ19wcmVjaXNpb24sCisJCQkiZW5jb2RpbmdfcHJlY2lzaW9uIik7CisJCWlucHV0LT5zYW1wbGVfYml0X2RlcHRoID0KKwkJCTYgKyAoaW5wdXQtPnNhbXBsZV9iaXRfZGVwdGgpICogMjsKKwl9IGVsc2UgeyAvKiBvdGhlciBwcm9maWxlKi8KKwkJaGQtPnNhbXBsZV9wcmVjaXNpb24gPQorCQkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5zYW1wbGVfcHJlY2lzaW9uLAorCQkJCSJzYW1wbGVfcHJlY2lzaW9uIik7CisJfQorCWhkLT5hc3BlY3RfcmF0aW9faW5mb3JtYXRpb24gICAgPQorCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLmFzcGVjdF9yYXRpb19pbmZvcm1hdGlvbiwKKwkJCSJhc3BlY3RfcmF0aW9faW5mb3JtYXRpb24iKTsKKwloZC0+ZnJhbWVfcmF0ZV9jb2RlICAgICAgICAgICAgID0KKwkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5mcmFtZV9yYXRlX2NvZGUsICJmcmFtZV9yYXRlX2NvZGUiKTsKKworCWhkLT5iaXRfcmF0ZV9sb3dlciAgICAgICAgICAgICAgPQorCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLmJpdF9yYXRlX2xvd2VyLCAiYml0X3JhdGVfbG93ZXIiKTsKKwkvKmhkLT5tYXJrZXJfYml0ICAgICAgICAgICAgICAgICAgPSBnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLm1hcmtlcl9iaXQsCisJICogIm1hcmtlciBiaXQiKTsqLworCS8qQ0hFQ0tNQVJLRVJCSVQqLworCWhkLT5iaXRfcmF0ZV91cHBlciAgICAgICAgICAgICAgPQorCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLmJpdF9yYXRlX3VwcGVyLCAiYml0X3JhdGVfdXBwZXIiKTsKKwloZC0+bG93X2RlbGF5ICAgICAgICAgICAgICAgICAgID0KKwkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5sb3dfZGVsYXksICJsb3dfZGVsYXkiKTsKKwkvKmhkLT5tYXJrZXJfYml0ICAgICAgICAgICAgICAgICAgPQorCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLm1hcmtlcl9iaXQyLAorCSAibWFya2VyIGJpdCIpOyovCisJLypDSEVDS01BUktFUkJJVCovCisjaWYgTTM0ODBfVEVNUE9SQUxfU0NBTEFCTEUKKwloZC0+dGVtcG9yYWxfaWRfZXhpc3RfZmxhZyAgICAgID0KKwkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC50ZW1wb3JhbF9pZF9leGlzdF9mbGFnLAorCQkJInRlbXBvcmFsX2lkIGV4aXN0IGZsYWciKTsgLypnZXQKKwkJRXh0ZW50aW9uIEZsYWcqLworI2VuZGlmCisJLyp1X3YoMTgsICJiYnYgYnVmZmVyIHNpemUiKTsqLworCWlucHV0LT5nX3VpTWF4U2l6ZUluQml0ICAgICAgICAgPQorCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLmdfdWlNYXhTaXplSW5CaXQsCisJCSJMYXJnZXN0IENvZGluZyBCbG9jayBTaXplIik7CisKKworCS8qaGQtPmJhY2tncm91bmRfcGljdHVyZV9lbmFibGUgPSAweDAxIF4KKwkJKGdldF9wYXJhbShycG1fcGFyYW0tPnAuYXZzMl9zZXFfZmxhZ3MsCisJCSJiYWNrZ3JvdW5kX3BpY3R1cmVfZGlzYWJsZSIpCisJCT4+IEJBQ0tHUk9VTkRfUElDVFVSRV9ESVNBQkxFX0JJVCkgJiAweDE7Ki8KKwkvKnJhaW4/Pz8qLworCWhkLT5iYWNrZ3JvdW5kX3BpY3R1cmVfZW5hYmxlID0gMHgwMSBeCisJCSgoZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5hdnMyX3NlcV9mbGFncywKKwkJImJhY2tncm91bmRfcGljdHVyZV9kaXNhYmxlIikKKwkJPj4gQkFDS0dST1VORF9QSUNUVVJFX0RJU0FCTEVfQklUKSAmIDB4MSk7CisKKworCWhkLT5iX2RtaF9lbmFibGVkICAgICAgICAgICA9IDE7CisKKwloZC0+Yl9taHBza2lwX2VuYWJsZWQgICAgICAgPQorCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLmF2czJfc2VxX2ZsYWdzID4+IEJfTUhQU0tJUF9FTkFCTEVEX0JJVCwKKwkJCSJtaHBza2lwIGVuYWJsZWQiKSAmIDB4MTsKKwloZC0+ZGhwX2VuYWJsZWQgICAgICAgICAgICAgPQorCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLmF2czJfc2VxX2ZsYWdzID4+IERIUF9FTkFCTEVEX0JJVCwKKwkJCSJkaHAgZW5hYmxlZCIpICYgMHgxOworCWhkLT53c21fZW5hYmxlZCAgICAgICAgICAgICA9CisJCWdldF9wYXJhbShycG1fcGFyYW0tPnAuYXZzMl9zZXFfZmxhZ3MgPj4gV1NNX0VOQUJMRURfQklULAorCQkJIndzbSBlbmFibGVkIikgJiAweDE7CisKKwlpbWctPmludGVyX2FtcF9lbmFibGUgICAgICAgPQorCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLmF2czJfc2VxX2ZsYWdzID4+IElOVEVSX0FNUF9FTkFCTEVfQklULAorCQkJIkFzeW1tZXRyaWMgTW90aW9uIFBhcnRpdGlvbnMiKSAmIDB4MTsKKwlpbnB1dC0+dXNlTlNRVCAgICAgICAgICAgICAgPQorCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLmF2czJfc2VxX2ZsYWdzID4+IFVTRU5TUVRfQklULAorCQkJInVzZU5TUVQiKSAmIDB4MTsKKwlpbnB1dC0+dXNlU0RJUCAgICAgICAgICAgICAgPQorCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLmF2czJfc2VxX2ZsYWdzID4+IFVTRVNESVBfQklULAorCQkJInVzZU5TSVAiKSAmIDB4MTsKKworCWhkLT5iX3NlY1RfZW5hYmxlZCAgICAgICAgICA9CisJCWdldF9wYXJhbShycG1fcGFyYW0tPnAuYXZzMl9zZXFfZmxhZ3MgPj4gQl9TRUNUX0VOQUJMRURfQklULAorCQkJInNlY1QgZW5hYmxlZCIpICYgMHgxOworCisJaW5wdXQtPnNhb19lbmFibGUgICAgICAgICAgID0KKwkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5hdnMyX3NlcV9mbGFncyA+PiBTQU9fRU5BQkxFX0JJVCwKKwkJCSJTQU8gRW5hYmxlIEZsYWciKSAmIDB4MTsKKwlpbnB1dC0+YWxmX2VuYWJsZSAgICAgICAgICAgPQorCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLmF2czJfc2VxX2ZsYWdzID4+IEFMRl9FTkFCTEVfQklULAorCQkJIkFMRiBFbmFibGUgRmxhZyIpICYgMHgxOworCWhkLT5iX3BtdnJfZW5hYmxlZCAgICAgICAgICA9CisJCWdldF9wYXJhbShycG1fcGFyYW0tPnAuYXZzMl9zZXFfZmxhZ3MgPj4gQl9QTVZSX0VOQUJMRURfQklULAorCQkJInBtdnIgZW5hYmxlZCIpICYgMHgxOworCisKKwloZC0+Z29wX3NpemUgPSBnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLm51bV9vZl9SUFMsCisJCSJudW1fb2ZfUlBTIik7CisjaWYgQ2hlY2tfQml0c3RyZWFtCisJLyphc3NlcnQoaGQtPmdvcF9zaXplPD0zMik7Ki8KKyNlbmRpZgorCisJaWYgKGhkLT5sb3dfZGVsYXkgPT0gMCkgeworCQloZC0+cGljdHVyZV9yZW9yZGVyX2RlbGF5ICA9CisJCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLnBpY3R1cmVfcmVvcmRlcl9kZWxheSwKKwkJCSJwaWN0dXJlX3Jlb3JkZXJfZGVsYXkiKTsKKwl9CisKKwlpbnB1dC0+Y3Jvc3NTbGljZUxvb3BGaWx0ZXIgICAgPQorCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLmF2czJfc2VxX2ZsYWdzCisJCQk+PiBDUk9TU1NMSUNFTE9PUEZJTFRFUl9CSVQsCisJCQkiQ3Jvc3MgTG9vcCBGaWx0ZXIgRmxhZyIpICYgMHgxOworCisjaWYgQkNCUgorCWlmICgoaW5wdXQtPnByb2ZpbGVfaWQgPT0gU0NFTkVfUFJPRklMRSB8fAorCQlpbnB1dC0+cHJvZmlsZV9pZCA9PSBTQ0VORTEwX1BST0ZJTEUpICYmCisJCWhkLT5iYWNrZ3JvdW5kX3BpY3R1cmVfZW5hYmxlKSB7CisJCWhkLT5iY2JyX2VuYWJsZSA9IHVfdigxLAorCQkJImJsb2NrX2NvbXBvc2VkX2JhY2tncm91bmRfcGljdHVyZV9lbmFibGUiKTsKKwkJdV92KDEsICJyZXNlcnZlZCBiaXRzIik7CisJfSBlbHNlIHsKKwkJaGQtPmJjYnJfZW5hYmxlID0gMDsKKwkJdV92KDIsICJyZXNlcnZlZCBiaXRzIik7CisJfQorI2Vsc2UKKwkvKnVfdigyLCAicmVzZXJ2ZWQgYml0cyIpOyovCisjZW5kaWYKKworCWltZy0+d2lkdGggICAgICAgICAgPSBoZC0+aG9yaXpvbnRhbF9zaXplOworCWltZy0+aGVpZ2h0ICAgICAgICAgPSBoZC0+dmVydGljYWxfc2l6ZTsKKwlpbWctPndpZHRoX2NyICAgICAgID0gKGltZy0+d2lkdGggPj4gMSk7CisKKwlpZiAoaW5wdXQtPmNocm9tYV9mb3JtYXQgPT0gMSkgeworCQlpbWctPmhlaWdodF9jcgorCQk9IChpbWctPmhlaWdodCA+PiAxKTsKKwl9CisKKwlpbWctPlBpY1dpZHRoSW5NYnMgID0gaW1nLT53aWR0aCAvIE1JTl9DVV9TSVpFOworCWltZy0+UGljSGVpZ2h0SW5NYnMgPSBpbWctPmhlaWdodCAvIE1JTl9DVV9TSVpFOworCWltZy0+UGljU2l6ZUluTWJzICAgPSBpbWctPlBpY1dpZHRoSW5NYnMgKiBpbWctPlBpY0hlaWdodEluTWJzOworCWltZy0+YnVmX2N5Y2xlICAgICAgPSBpbnB1dC0+YnVmX2N5Y2xlICsgMTsKKwlpbWctPm1heF9tYl9uciAgICAgID0gKGltZy0+d2lkdGggKiBpbWctPmhlaWdodCkKKwkJLyAoTUlOX0NVX1NJWkUgKiBNSU5fQ1VfU0laRSk7CisKKyNpZmRlZiBBTUwKK2F2czJfZGVjLT5sY3Vfc2l6ZSA9CisJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5sY3Vfc2l6ZSwgImxjdV9zaXplIik7CithdnMyX2RlYy0+bGN1X3NpemUgPSAxPDwoYXZzMl9kZWMtPmxjdV9zaXplKTsKKyNlbmRpZgoraGMtPnNlcV9oZWFkZXIrKzsKK30KKworCit2b2lkIEdldF9JX1BpY3R1cmVfSGVhZGVyKHN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjKQoreworCXN0cnVjdCBJbWFnZVBhcmFtZXRlcnNfcyAgICAqaW1nID0gJmF2czJfZGVjLT5pbWc7CisJc3RydWN0IFZpZGVvX0RlY19kYXRhX3MgKmhkID0gJmF2czJfZGVjLT5oZDsKKwl1bmlvbiBwYXJhbV91ICpycG1fcGFyYW0gPSAmYXZzMl9kZWMtPnBhcmFtOworCisjaWYgUkQxNTAxX0ZJWF9CRyAvKi8vTG9uZ2ZlaS5XYW5nQG1lZGlhdGVrLmNvbSovCisJaGQtPmJhY2tncm91bmRfcGljdHVyZV9mbGFnID0gMDsKKwloZC0+YmFja2dyb3VuZF9waWN0dXJlX291dHB1dF9mbGFnID0gMDsKKwlpbWctPnR5cGViID0gMDsKKyNlbmRpZgorCisJaGQtPnRpbWVfY29kZV9mbGFnICAgICAgID0KKwkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC50aW1lX2NvZGVfZmxhZywKKwkJInRpbWVfY29kZV9mbGFnIik7CisKKwlpZiAoaGQtPnRpbWVfY29kZV9mbGFnKSB7CisJCWhkLT50aW1lX2NvZGUgICAgICAgID0KKwkJCWdldF9wYXJhbShycG1fcGFyYW0tPnAudGltZV9jb2RlLAorCQkJInRpbWVfY29kZSIpOworCX0KKwlpZiAoaGQtPmJhY2tncm91bmRfcGljdHVyZV9lbmFibGUpIHsKKwkJaGQtPmJhY2tncm91bmRfcGljdHVyZV9mbGFnID0KKwkJCWdldF9wYXJhbShycG1fcGFyYW0tPnAuYmFja2dyb3VuZF9waWN0dXJlX2ZsYWcsCisJCQkiYmFja2dyb3VuZF9waWN0dXJlX2ZsYWciKTsKKworCQlpZiAoaGQtPmJhY2tncm91bmRfcGljdHVyZV9mbGFnKSB7CisJCQlpbWctPnR5cGViID0KKwkJCQlCQUNLR1JPVU5EX0lNRzsKKwkJfSBlbHNlIHsKKwkJCWltZy0+dHlwZWIgPSAwOworCQl9CisKKwkJaWYgKGltZy0+dHlwZWIgPT0gQkFDS0dST1VORF9JTUcpIHsKKwkJCWhkLT5iYWNrZ3JvdW5kX3BpY3R1cmVfb3V0cHV0X2ZsYWcgPQorCQkJCWdldF9wYXJhbSgKKwkJCQlycG1fcGFyYW0tPnAuYmFja2dyb3VuZF9waWN0dXJlX291dHB1dF9mbGFnLAorCQkJCSJiYWNrZ3JvdW5kX3BpY3R1cmVfb3V0cHV0X2ZsYWciKTsKKwkJfQorCX0KKworCisJeworCQlpbWctPmNvZGluZ19vcmRlciAgICAgICAgID0KKwkJCWdldF9wYXJhbShycG1fcGFyYW0tPnAuY29kaW5nX29yZGVyLAorCQkJImNvZGluZ19vcmRlciIpOworCisKKworI2lmIE0zNDgwX1RFTVBPUkFMX1NDQUxBQkxFCisJCWlmIChoZC0+dGVtcG9yYWxfaWRfZXhpc3RfZmxhZyA9PSAxKSB7CisJCQloZC0+Y3VyX2xheWVyID0KKwkJCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLmN1cl9sYXllciwKKwkJCQkidGVtcG9yYWxfaWQiKTsKKwkJfQorI2VuZGlmCisjaWYgUkQxNTAxX0ZJWF9CRyAgLypMb25nZmVpLldhbmdAbWVkaWF0ZWsuY29tKi8KKwkJaWYgKGhkLT5sb3dfZGVsYXkgPT0gMAorCQkJJiYgIShoZC0+YmFja2dyb3VuZF9waWN0dXJlX2ZsYWcgJiYKKwkJIWhkLT5iYWNrZ3JvdW5kX3BpY3R1cmVfb3V0cHV0X2ZsYWcpKSB7IC8qY2RwKi8KKyNlbHNlCisJCQlpZiAoaGQtPmxvd19kZWxheSA9PSAwICYmCisJCQkgICAgIShoZC0+YmFja2dyb3VuZF9waWN0dXJlX2VuYWJsZSAmJgorCQkJICAgICAgIWhkLT5iYWNrZ3JvdW5kX3BpY3R1cmVfb3V0cHV0X2ZsYWcpKSB7IC8qY2RwKi8KKyNlbmRpZgorCQkJCWhkLT5kaXNwbGF5ZGVsYXkgPQorCQkJCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLmRpc3BsYXlkZWxheSwKKwkJCQkJInBpY3R1cmVfb3V0cHV0X2RlbGF5Iik7CisJCQl9CisKKwkJfQorCQl7CisJCQlpbnQzMl90IFJQU19pZHg7LyogPSAoaW1nLT5jb2Rpbmdfb3JkZXItMSkgJSBnb3Bfc2l6ZTsqLworCQkJaW50MzJfdCBwcmVkaWN0OworCQkJaW50MzJfdCBqOworCQkJcHJlZGljdCA9CisJCQkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5wcmVkaWN0LAorCQkJCSJ1c2UgUkNTIGluIFNQUyIpOworCQkJLyppZiAocHJlZGljdCkgeyovCisJCQlSUFNfaWR4ID0KKwkJCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLlJQU19pZHgsCisJCQkJInByZWRpY3QgZm9yIFJDUyIpOworCQkJLyogICAgaGQtPmN1cnJfUlBTID0gaGQtPmRlY29kX1JQU1tSUFNfaWR4XTsqLworCQkJLyp9IGVsc2UgeyovCisJCQkvKmdvcCBzaXplMTYqLworCQkJaGQtPmN1cnJfUlBTLnJlZmVyZF9ieV9vdGhlcnMgPQorCQkJCWdldF9wYXJhbShycG1fcGFyYW0tPnAucmVmZXJkX2J5X290aGVyc19jdXIsCisJCQkJInJlZmVyZWQgYnkgb3RoZXJzIik7CisJCQloZC0+Y3Vycl9SUFMubnVtX29mX3JlZiA9CisJCQkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5udW1fb2ZfcmVmX2N1ciwKKwkJCQkibnVtIG9mIHJlZmVyZW5jZSBwaWN0dXJlIik7CisJCQlmb3IgKGogPSAwOyBqIDwgaGQtPmN1cnJfUlBTLm51bV9vZl9yZWY7IGorKykgeworCQkJCWhkLT5jdXJyX1JQUy5yZWZfcGljW2pdID0KKwkJCQkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5yZWZfcGljX2N1cltqXSwKKwkJCQkJImRlbHRhIENPSSBvZiByZWYgcGljIik7CisJCQl9CisJCQloZC0+Y3Vycl9SUFMubnVtX3RvX3JlbW92ZSA9CisJCQkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5udW1fdG9fcmVtb3ZlX2N1ciwKKwkJCQkibnVtIG9mIHJlbW92ZWQgcGljdHVyZSIpOworI2lmZGVmIFNBTklUWV9DSEVDSworCQkJaWYgKGhkLT5jdXJyX1JQUy5udW1fdG9fcmVtb3ZlID4gTUFYUkVGKQl7CisJCQkJaGQtPmN1cnJfUlBTLm51bV90b19yZW1vdmUgPSBNQVhSRUY7CisJCQkJcHJfaW5mbygiV2FybmluZywgJXM6IG51bV90b19yZW1vdmUgJWQgYmV5b25kIHJhbmdlLCBmb3JjZSB0byBNQVhSRUZcbiIsCisJCQkJCV9fZnVuY19fLCBoZC0+Y3Vycl9SUFMubnVtX3RvX3JlbW92ZSk7CisJCQl9CisjZW5kaWYKKworCQkJZm9yIChqID0gMDsgaiA8IGhkLT5jdXJyX1JQUy5udW1fdG9fcmVtb3ZlOyBqKyspIHsKKwkJCQloZC0+Y3Vycl9SUFMucmVtb3ZlX3BpY1tqXSA9CisJCQkJCWdldF9wYXJhbSgKKwkJCQkJcnBtX3BhcmFtLT5wLnJlbW92ZV9waWNfY3VyW2pdLAorCQkJCQkiZGVsdGEgQ09JIG9mIHJlbW92ZWQgcGljIik7CisJCQl9CisJCQkvKnVfdigxLCAibWFya2VyIGJpdCIpOyovCisKKwkJCS8qfSovCisJCX0KKwkJLyp4eWppIDEyLjIzKi8KKwkJaWYgKGhkLT5sb3dfZGVsYXkpIHsKKwkJCS8qdWVfdigKKwkJCSJiYnYgY2hlY2sgdGltZXMiKTsqLworCQl9CisKKwkJaGQtPnByb2dyZXNzaXZlX2ZyYW1lID0KKwkJCWdldF9wYXJhbShycG1fcGFyYW0tPnAucHJvZ3Jlc3NpdmVfZnJhbWUsCisJCQkicHJvZ3Jlc3NpdmVfZnJhbWUiKTsKKworCQlpZiAoIWhkLT5wcm9ncmVzc2l2ZV9mcmFtZSkgeworCQkJaW1nLT5waWN0dXJlX3N0cnVjdHVyZSAgID0KKwkJCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLnBpY3R1cmVfc3RydWN0dXJlLAorCQkJCSJwaWN0dXJlX3N0cnVjdHVyZSIpOworCQl9IGVsc2UgeworCQkJaW1nLT5waWN0dXJlX3N0cnVjdHVyZQorCQkJCT0gMTsKKwkJfQorCisJCWhkLT50b3BfZmllbGRfZmlyc3QgPQorCQkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC50b3BfZmllbGRfZmlyc3QsCisJCQkidG9wX2ZpZWxkX2ZpcnN0Iik7CisJCWhkLT5yZXBlYXRfZmlyc3RfZmllbGQgPQorCQkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5yZXBlYXRfZmlyc3RfZmllbGQsCisJCQkicmVwZWF0X2ZpcnN0X2ZpZWxkIik7CisjaWYgSU5URVJMQUNFX0NPRElORworCQlpZiAoaGQtPmlzX2ZpZWxkX3NlcXVlbmNlKSB7CisJCQloZC0+aXNfdG9wX2ZpZWxkICAgICAgICAgPQorCQkJCWdldF9wYXJhbShycG1fcGFyYW0tPnAuaXNfdG9wX2ZpZWxkLAorCQkJCSJpc190b3BfZmllbGQiKTsKKyNpZiBIQUxGX1BJWEVMX0NPTVBFTlNBVElPTiB8fCBIQUxGX1BJWEVMX0NIUk9NQQorCQkJaW1nLT5pc190b3BfZmllbGQgICAgICAgPSBoZC0+aXNfdG9wX2ZpZWxkOworI2VuZGlmCisJCX0KKyNlbmRpZgorCisKKwlpbWctPnFwICAgICAgICAgICAgICAgID0gaGQtPnBpY3R1cmVfcXA7CisKKwlpbWctPnR5cGUgICAgICAgICAgICAgID0gSV9JTUc7CisKK30KKworLyoKKyAqIEZ1bmN0aW9uOnBiIHBpY3R1cmUgaGVhZGVyCisgKiBJbnB1dDoKKyAqIE91dHB1dDoKKyAqIFJldHVybjoKKyAqIEF0dGVudGlvbjoKKyAqLworCit2b2lkIEdldF9QQl9QaWN0dXJlX0hlYWRlcihzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYykKK3sKKwlzdHJ1Y3QgSW1hZ2VQYXJhbWV0ZXJzX3MgICAgKmltZyA9ICZhdnMyX2RlYy0+aW1nOworCXN0cnVjdCBWaWRlb19EZWNfZGF0YV9zICpoZCA9ICZhdnMyX2RlYy0+aGQ7CisJdW5pb24gcGFyYW1fdSAqcnBtX3BhcmFtID0gJmF2czJfZGVjLT5wYXJhbTsKKworCisJLyp1X3YoMzIsICJiYnYgZGVsYXkiKTsqLworCisJaGQtPnBpY3R1cmVfY29kaW5nX3R5cGUgICAgICAgICAgICAgICAgPQorCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLnBpY3R1cmVfY29kaW5nX3R5cGUsCisJCSJwaWN0dXJlX2NvZGluZ190eXBlIik7CisKKwlpZiAoaGQtPmJhY2tncm91bmRfcGljdHVyZV9lbmFibGUgJiYKKwkJKGhkLT5waWN0dXJlX2NvZGluZ190eXBlID09IDEgfHwKKwkJCWhkLT5waWN0dXJlX2NvZGluZ190eXBlID09IDMpKSB7CisJCWlmIChoZC0+cGljdHVyZV9jb2RpbmdfdHlwZSA9PSAxKSB7CisJCQloZC0+YmFja2dyb3VuZF9wcmVkX2ZsYWcgICAgICAgPQorCQkJCWdldF9wYXJhbSgKKwkJCQlycG1fcGFyYW0tPnAuYmFja2dyb3VuZF9wcmVkX2ZsYWcsCisJCQkJImJhY2tncm91bmRfcHJlZF9mbGFnIik7CisJCX0gZWxzZSB7CisJCQloZC0+YmFja2dyb3VuZF9wcmVkX2ZsYWcgPSAwOworCQl9CisJCWlmIChoZC0+YmFja2dyb3VuZF9wcmVkX2ZsYWcgPT0gMCkgeworCisJCQloZC0+YmFja2dyb3VuZF9yZWZlcmVuY2VfZW5hYmxlID0KKwkJCQlnZXRfcGFyYW0oCisJCQkJcnBtX3BhcmFtLT4KKwkJCQlwLmJhY2tncm91bmRfcmVmZXJlbmNlX2VuYWJsZSwKKwkJCQkiYmFja2dyb3VuZF9yZWZlcmVuY2VfZW5hYmxlIik7CisKKwkJfSBlbHNlIHsKKyNpZiBSRDE3MF9GSVhfQkcKKwkJCWhkLT5iYWNrZ3JvdW5kX3JlZmVyZW5jZV9lbmFibGUgPSAxOworI2Vsc2UKKwkJCWhkLT5iYWNrZ3JvdW5kX3JlZmVyZW5jZV9lbmFibGUgPSAwOworI2VuZGlmCisJCX0KKworCX0gZWxzZSB7CisJCWhkLT5iYWNrZ3JvdW5kX3ByZWRfZmxhZyA9IDA7CisJCWhkLT5iYWNrZ3JvdW5kX3JlZmVyZW5jZV9lbmFibGUgPSAwOworCX0KKworCisKKwlpZiAoaGQtPnBpY3R1cmVfY29kaW5nX3R5cGUgPT0gMSkgeworCQlpbWctPnR5cGUgPQorCQkJUF9JTUc7CisJfSBlbHNlIGlmIChoZC0+cGljdHVyZV9jb2RpbmdfdHlwZSA9PSAzKSB7CisJCWltZy0+dHlwZSA9CisJCQlGX0lNRzsKKwl9IGVsc2UgeworCQlpbWctPnR5cGUgPQorCQkJQl9JTUc7CisJfQorCisKKwlpZiAoaGQtPnBpY3R1cmVfY29kaW5nX3R5cGUgPT0gMSAmJgorCQloZC0+YmFja2dyb3VuZF9wcmVkX2ZsYWcpIHsKKwkJaW1nLT50eXBlYiA9IEJQX0lNRzsKKwl9IGVsc2UgeworCQlpbWctPnR5cGViID0gMDsKKwl9CisKKworCXsKKwkJaW1nLT5jb2Rpbmdfb3JkZXIgICAgICAgICA9CisJCQlnZXRfcGFyYW0oCisJCQlycG1fcGFyYW0tPnAuY29kaW5nX29yZGVyLAorCQkJImNvZGluZ19vcmRlciIpOworCisKKyNpZiBNMzQ4MF9URU1QT1JBTF9TQ0FMQUJMRQorCQlpZiAoaGQtPnRlbXBvcmFsX2lkX2V4aXN0X2ZsYWcgPT0gMSkgeworCQkJaGQtPmN1cl9sYXllciA9CisJCQkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5jdXJfbGF5ZXIsCisJCQkJInRlbXBvcmFsX2lkIik7CisJCX0KKyNlbmRpZgorCisJCWlmIChoZC0+bG93X2RlbGF5ID09IDApIHsKKwkJCWhkLT5kaXNwbGF5ZGVsYXkgICAgICA9CisJCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLmRpc3BsYXlkZWxheSwKKwkJCSJkaXNwbGF5ZGVsYXkiKTsKKwkJfQorCX0KKwl7CisJCWludDMyX3QgUlBTX2lkeDsvKiA9IChpbWctPmNvZGluZ19vcmRlci0xKSAlIGdvcF9zaXplOyovCisJCWludDMyX3QgcHJlZGljdDsKKwkJcHJlZGljdCAgICA9CisJCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLnByZWRpY3QsCisJCQkidXNlIFJQUyBpbiBTUFMiKTsKKwkJaWYgKHByZWRpY3QpIHsKKwkJCVJQU19pZHggPQorCQkJCWdldF9wYXJhbShycG1fcGFyYW0tPnAuUlBTX2lkeCwKKwkJCQkicHJlZGljdCBmb3IgUlBTIik7CisJCQloZC0+Y3Vycl9SUFMgPSBoZC0+ZGVjb2RfUlBTW1JQU19pZHhdOworCQl9IC8qZWxzZSovCisJCXsKKwkJCS8qZ29wIHNpemUxNiovCisJCQlpbnQzMl90IGo7CisJCQloZC0+Y3Vycl9SUFMucmVmZXJkX2J5X290aGVycyA9CisJCQkJZ2V0X3BhcmFtKAorCQkJCXJwbV9wYXJhbS0+cC5yZWZlcmRfYnlfb3RoZXJzX2N1ciwKKwkJCQkicmVmZXJlZCBieSBvdGhlcnMiKTsKKwkJCWhkLT5jdXJyX1JQUy5udW1fb2ZfcmVmID0KKwkJCQlnZXRfcGFyYW0oCisJCQkJcnBtX3BhcmFtLT5wLm51bV9vZl9yZWZfY3VyLAorCQkJCSJudW0gb2YgcmVmZXJlbmNlIHBpY3R1cmUiKTsKKwkJCWZvciAoaiA9IDA7IGogPCBoZC0+Y3Vycl9SUFMubnVtX29mX3JlZjsgaisrKSB7CisJCQkJaGQtPmN1cnJfUlBTLnJlZl9waWNbal0gPQorCQkJCQlnZXRfcGFyYW0oCisJCQkJCXJwbV9wYXJhbS0+cC5yZWZfcGljX2N1cltqXSwKKwkJCQkJImRlbHRhIENPSSBvZiByZWYgcGljIik7CisJCQl9CisJCQloZC0+Y3Vycl9SUFMubnVtX3RvX3JlbW92ZSA9CisJCQkJZ2V0X3BhcmFtKAorCQkJCXJwbV9wYXJhbS0+cC5udW1fdG9fcmVtb3ZlX2N1ciwKKwkJCQkibnVtIG9mIHJlbW92ZWQgcGljdHVyZSIpOworI2lmZGVmIFNBTklUWV9DSEVDSworCQkJaWYgKGhkLT5jdXJyX1JQUy5udW1fdG9fcmVtb3ZlID4gTUFYUkVGKQl7CisJCQkJaGQtPmN1cnJfUlBTLm51bV90b19yZW1vdmUgPSBNQVhSRUY7CisJCQkJcHJfaW5mbygiV2FybmluZywgJXM6IG51bV90b19yZW1vdmUgJWQgYmV5b25kIHJhbmdlLCBmb3JjZSB0byBNQVhSRUZcbiIsCisJCQkJCV9fZnVuY19fLCBoZC0+Y3Vycl9SUFMubnVtX3RvX3JlbW92ZSk7CisJCQl9CisjZW5kaWYKKwkJCWZvciAoaiA9IDA7CisJCQkJaiA8IGhkLT5jdXJyX1JQUy5udW1fdG9fcmVtb3ZlOyBqKyspIHsKKwkJCQloZC0+Y3Vycl9SUFMucmVtb3ZlX3BpY1tqXSA9CisJCQkJZ2V0X3BhcmFtKAorCQkJCQlycG1fcGFyYW0tPnAucmVtb3ZlX3BpY19jdXJbal0sCisJCQkJCSJkZWx0YSBDT0kgb2YgcmVtb3ZlZCBwaWMiKTsKKwkJCX0KKwkJCS8qdV92KDEsICJtYXJrZXIgYml0Iik7Ki8KKworCQl9CisJfQorCS8qeHlqaSAxMi4yMyovCisJaWYgKGhkLT5sb3dfZGVsYXkpIHsKKwkJLyp1ZV92KAorCQkiYmJ2IGNoZWNrIHRpbWVzIik7Ki8KKwl9CisKKwloZC0+cHJvZ3Jlc3NpdmVfZnJhbWUgICAgICAgPQorCWdldF9wYXJhbShycG1fcGFyYW0tPnAucHJvZ3Jlc3NpdmVfZnJhbWUsCisJCSJwcm9ncmVzc2l2ZV9mcmFtZSIpOworCisJaWYgKCFoZC0+cHJvZ3Jlc3NpdmVfZnJhbWUpIHsKKwkJaW1nLT5waWN0dXJlX3N0cnVjdHVyZSAgPQorCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLnBpY3R1cmVfc3RydWN0dXJlLAorCQkJInBpY3R1cmVfc3RydWN0dXJlIik7CisJfSBlbHNlIHsKKwkJaW1nLT5waWN0dXJlX3N0cnVjdHVyZSAgPSAxOworCX0KKworCWhkLT50b3BfZmllbGRfZmlyc3QgICAgICAgICA9CisJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC50b3BfZmllbGRfZmlyc3QsCisJCSJ0b3BfZmllbGRfZmlyc3QiKTsKKwloZC0+cmVwZWF0X2ZpcnN0X2ZpZWxkICAgICAgPQorCWdldF9wYXJhbShycG1fcGFyYW0tPnAucmVwZWF0X2ZpcnN0X2ZpZWxkLAorCQkicmVwZWF0X2ZpcnN0X2ZpZWxkIik7CisjaWYgSU5URVJMQUNFX0NPRElORworCWlmIChoZC0+aXNfZmllbGRfc2VxdWVuY2UpIHsKKwkJaGQtPmlzX3RvcF9maWVsZCAgICAgICAgPQorCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLmlzX3RvcF9maWVsZCwKKwkJCSJpc190b3BfZmllbGQiKTsKKyNpZiBIQUxGX1BJWEVMX0NPTVBFTlNBVElPTiB8fCBIQUxGX1BJWEVMX0NIUk9NQQorCQlpbWctPmlzX3RvcF9maWVsZCA9IGhkLT5pc190b3BfZmllbGQ7CisjZW5kaWYKKwkJLyp1X3YoMSwgInJlc2VydmVkIGJpdCBmb3IgaW50ZXJsYWNlIGNvZGluZyIpOyovCisJfQorI2VuZGlmCisKKyNpZiBDaGVja19CaXRzdHJlYW0KKwkvKmFzc2VydChoZC0+cGljdHVyZV9xcD49MCYmaGQtPnBpY3R1cmVfcXA8PSg2MyArIDggKgorCSAgKGlucHV0LT5zYW1wbGVfYml0X2RlcHRoIC0gOCkpKTsqLworI2VuZGlmCisKKwlpbWctPnJhbmRvbV9hY2Nlc3NfZGVjb2RhYmxlX2ZsYWcgPQorCWdldF9wYXJhbShycG1fcGFyYW0tPnAucmFuZG9tX2FjY2Vzc19kZWNvZGFibGVfZmxhZywKKwkJInJhbmRvbV9hY2Nlc3NfZGVjb2RhYmxlX2ZsYWciKTsKKworCWltZy0+cXAgICAgICAgICAgICAgICAgPSBoZC0+cGljdHVyZV9xcDsKK30KKworCisKKwordm9pZCBjYWxjX3BpY3R1cmVfZGlzdGFuY2Uoc3RydWN0IGF2czJfZGVjb2RlciAqYXZzMl9kZWMpCit7CisJc3RydWN0IEltYWdlUGFyYW1ldGVyc19zICAgICppbWcgPSAmYXZzMl9kZWMtPmltZzsKKwlzdHJ1Y3QgVmlkZW9fQ29tX2RhdGFfcyAqaGMgPSAmYXZzMl9kZWMtPmhjOworCXN0cnVjdCBWaWRlb19EZWNfZGF0YV9zICpoZCA9ICZhdnMyX2RlYy0+aGQ7CisJLyoKKwl1bmlvbiBwYXJhbV91ICpycG1fcGFyYW0gPSAmYXZzMl9kZWMtPnBhcmFtOworCisJZm9yIFBPQyBtb2RlIDA6CisJdWludDMyX3QgICAgICAgIE1heFBpY0Rpc3RhbmNlTHNiID0gKDEgPDwgOCk7CisJICovCisJaWYgKGltZy0+Y29kaW5nX29yZGVyICA8ICBpbWctPlByZXZQaWNEaXN0YW5jZUxzYikKKworCXsKKwkJaW50MzJfdCBpLCBqOworCisJCWhjLT50b3RhbF9mcmFtZXMrKzsKKwkJZm9yIChpID0gMDsgaSA8IGF2czJfZGVjLT5yZWZfbWF4YnVmZmVyOyBpKyspIHsKKwkJCWlmICgKKwkJCQlhdnMyX2RlYy0+ZnJlZltpXS0+aW1ndHJfZndSZWZEaXN0YW5jZQorCQkJCT49IDApIHsKKwkJCQlhdnMyX2RlYy0+ZnJlZltpXS0+CisJCQkJaW1ndHJfZndSZWZEaXN0YW5jZSAtPSAyNTY7CisJCQkJYXZzMl9kZWMtPmZyZWZbaV0tPgorCQkJCWltZ2NvaV9yZWYgLT0gMjU2OworCQkJfQorI2lmIFJEMTcwX0ZJWF9CRworCWZvciAoaiA9IDA7IGogPCBNQVhSRUY7IGorKykgeworI2Vsc2UKKwkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworI2VuZGlmCisJCQlhdnMyX2RlYy0+ZnJlZltpXS0+cmVmX3BvY1tqXSAtPSAyNTY7CisJCX0KKwl9CisJZm9yIChpID0gMDsgaSA8IGF2czJfZGVjLT5vdXRwcmludC5idWZmZXJfbnVtOyBpKyspIHsKKwkJYXZzMl9kZWMtPm91dHByaW50LnN0ZG91dGRhdGFbaV0uZnJhbWVudW0gLT0gMjU2OworCQlhdnMyX2RlYy0+b3V0cHJpbnQuc3Rkb3V0ZGF0YVtpXS50ciAtPSAyNTY7CisJfQorCisJaGQtPmxhc3Rfb3V0cHV0IC09IDI1NjsKKwloZC0+Y3Vycl9JRFJ0ciAtPSAyNTY7CisJaGQtPmN1cnJfSURSY29pIC09IDI1NjsKKwloZC0+bmV4dF9JRFJ0ciAtPSAyNTY7CisJaGQtPm5leHRfSURSY29pIC09IDI1NjsKKwl9CisJaWYgKGhkLT5sb3dfZGVsYXkgPT0gMCkgeworCQlpbWctPnRyID0gaW1nLT5jb2Rpbmdfb3JkZXIgKworCQloZC0+ZGlzcGxheWRlbGF5IC0gaGQtPnBpY3R1cmVfcmVvcmRlcl9kZWxheTsKKwl9IGVsc2UgeworCQlpbWctPnRyID0KKwkJaW1nLT5jb2Rpbmdfb3JkZXI7CisJfQorCisjaWYgUkVNT1ZFX1VOVVNFRAorCWltZy0+cGljX2Rpc3RhbmNlID0gaW1nLT50cjsKKyNlbHNlCisJaW1nLT5waWNfZGlzdGFuY2UgPSBpbWctPnRyICUgMjU2OworI2VuZGlmCisJaGMtPnBpY3R1cmVfZGlzdGFuY2UgPSBpbWctPnBpY19kaXN0YW5jZTsKKworfQorCitpbnQzMl90IGF2czJfaW5pdF9nbG9iYWxfYnVmZmVycyhzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYykKK3sKKwlzdHJ1Y3QgaW5wX3BhciAgICAqaW5wdXQgPSAmYXZzMl9kZWMtPmlucHV0OworCXN0cnVjdCBJbWFnZVBhcmFtZXRlcnNfcyAgICAqaW1nID0gJmF2czJfZGVjLT5pbWc7CisJc3RydWN0IFZpZGVvX0NvbV9kYXRhX3MgKmhjID0gJmF2czJfZGVjLT5oYzsKKworCWludDMyX3QgcmVmbnVtOworCisJaW50MzJfdCBtZW1vcnlfc2l6ZSA9IDA7CisJLyoKK2ludDMyX3QgaW1nX2hlaWdodCA9IChoZC0+dmVydGljYWxfc2l6ZSArIGltZy0+YXV0b19jcm9wX2JvdHRvbSk7CisJICovCisJaW1nLT5idWZfY3ljbGUgPSBpbnB1dC0+YnVmX2N5Y2xlICsgMTsKKworCWltZy0+YnVmX2N5Y2xlICo9IDI7CisKKwloYy0+YmFja2dyb3VuZF9yZWYgPSBoYy0+YmFja2dyb3VuZFJlZmVyZW5jZUZyYW1lOworCisJZm9yIChyZWZudW0gPSAwOyByZWZudW0gPCBSRUZfTUFYQlVGRkVSOyByZWZudW0rKykgeworCQlhdnMyX2RlYy0+ZnJlZltyZWZudW1dID0gJmF2czJfZGVjLT5mcm1fcG9vbFtyZWZudW1dOworCisJCS8qLy9hdnMyX2RlYy0+ZnJlZltpXSBtZW1vcnkgYWxsb2NhdGlvbiovCisJCWlmIChpc19hdnMyX3ByaW50X2J1Zm1ncl9kZXRhaWwoKSkKKwkJCXByX2luZm8oIlt0XSBhdnMyX2RlYy0+ZnJlZlslZF1AMHglcFxuIiwKKwkJCXJlZm51bSwgYXZzMl9kZWMtPmZyZWZbcmVmbnVtXSk7CisJCWF2czJfZGVjLT5mcmVmW3JlZm51bV0tPmltZ2NvaV9yZWYgPSAtMjU3OworCQlhdnMyX2RlYy0+ZnJlZltyZWZudW1dLT5pc19vdXRwdXQgPSAtMTsKKwkJYXZzMl9kZWMtPmZyZWZbcmVmbnVtXS0+cmVmZXJlZF9ieV9vdGhlcnMgPSAtMTsKKwkJYXZzMl9kZWMtPmZyZWZbcmVmbnVtXS0+CisJCQlpbWd0cl9md1JlZkRpc3RhbmNlID0gLTI1NjsKKwkJaW5pdF9mcmFtZV90KGF2czJfZGVjLT5mcmVmW3JlZm51bV0pOworI2lmZGVmIEFNTAorCQlhdnMyX2RlYy0+ZnJlZltyZWZudW1dLT5pbmRleCA9IHJlZm51bTsKKyNlbmRpZgorCX0KKyNpZmRlZiBBTUwKKwlhdnMyX2RlYy0+Zl9iZyA9IE5VTEw7CisKKwlhdnMyX2RlYy0+bV9iZyA9ICZhdnMyX2RlYy0+ZnJtX3Bvb2xbUkVGX01BWEJVRkZFUl07CisJCS8qLy8vYXZzMl9kZWMtPmZyZWZbaV0gbWVtb3J5IGFsbG9jYXRpb24qLworCWlmIChpc19hdnMyX3ByaW50X2J1Zm1ncl9kZXRhaWwoKSkKKwkJcHJfaW5mbygiW3RdIGF2czJfZGVjLT5tX2JnQDB4JXBcbiIsCisJCWF2czJfZGVjLT5tX2JnKTsKKwlhdnMyX2RlYy0+bV9iZy0+aW1nY29pX3JlZiA9IC0yNTc7CisJYXZzMl9kZWMtPm1fYmctPmlzX291dHB1dCA9IC0xOworCWF2czJfZGVjLT5tX2JnLT5yZWZlcmVkX2J5X290aGVycyA9IC0xOworCWF2czJfZGVjLT5tX2JnLT5pbWd0cl9md1JlZkRpc3RhbmNlID0gLTI1NjsKKwlpbml0X2ZyYW1lX3QoYXZzMl9kZWMtPm1fYmcpOworCWF2czJfZGVjLT5tX2JnLT5pbmRleCA9IHJlZm51bTsKKyNlbmRpZgorCisjaWYgQkNCUgorCS8qaW5pdCBCQ0JSIHJlbGF0ZWQqLworCWltZy0+aU51bUNVc0luRnJhbWUgPQorCQkoKGltZy0+d2lkdGggKyBNQVhfQ1VfU0laRSAtIDEpIC8gTUFYX0NVX1NJWkUpCisJCSogKChpbWctPmhlaWdodCArIE1BWF9DVV9TSVpFIC0gMSkKKwkJLyBNQVhfQ1VfU0laRSk7CisJLyppbWctPkJMQ1VpZHggPSAgKGludDMyX3QqKSBjYWxsb2MoCisJICBpbWctPmlOdW1DVXNJbkZyYW1lLCBzaXplb2YoaW50MzJfdCkpOyovCisJLyptZW1zZXQoIGltZy0+QkxDVWlkeCwgMCwgaW1nLT5pTnVtQ1VzSW5GcmFtZSk7Ki8KKyNlbmRpZgorCXJldHVybiBtZW1vcnlfc2l6ZTsKK30KKworI2lmZGVmIEFNTAorc3RhdGljIHZvaWQgZnJlZV91bnVzZWRfYnVmZmVycyhzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYykKK3sKKwlzdHJ1Y3QgaW5wX3BhciAgICAqaW5wdXQgPSAmYXZzMl9kZWMtPmlucHV0OworCXN0cnVjdCBJbWFnZVBhcmFtZXRlcnNfcyAgICAqaW1nID0gJmF2czJfZGVjLT5pbWc7CisJc3RydWN0IFZpZGVvX0NvbV9kYXRhX3MgKmhjID0gJmF2czJfZGVjLT5oYzsKKworCWludDMyX3QgcmVmbnVtOworCisJaW1nLT5idWZfY3ljbGUgPSBpbnB1dC0+YnVmX2N5Y2xlICsgMTsKKworCWltZy0+YnVmX2N5Y2xlICo9IDI7CisKKwloYy0+YmFja2dyb3VuZF9yZWYgPSBoYy0+YmFja2dyb3VuZFJlZmVyZW5jZUZyYW1lOworCisJZm9yIChyZWZudW0gPSAwOyByZWZudW0gPCBSRUZfTUFYQlVGRkVSOyByZWZudW0rKykgeworI2lmbmRlZiBOT19ESVNQTEFZCisJCWlmIChhdnMyX2RlYy0+ZnJlZltyZWZudW1dLT52Zl9yZWYgPiAwIHx8CisJCQlhdnMyX2RlYy0+ZnJlZltyZWZudW1dLT50b19wcmVwYXJlX2Rpc3ApCisJCQljb250aW51ZTsKKyNlbmRpZgorCQlpZiAoaXNfYXZzMl9wcmludF9idWZtZ3JfZGV0YWlsKCkpCisJCQlwcl9pbmZvKCIlc1t0XSBhdnMyX2RlYy0+ZnJlZlslZF1AMHglcFxuIiwKKwkJCV9fZnVuY19fLCByZWZudW0sIGF2czJfZGVjLT5mcmVmW3JlZm51bV0pOworCQlhdnMyX2RlYy0+ZnJlZltyZWZudW1dLT5pbWdjb2lfcmVmID0gLTI1NzsKKwkJYXZzMl9kZWMtPmZyZWZbcmVmbnVtXS0+aXNfb3V0cHV0ID0gLTE7CisJCWF2czJfZGVjLT5mcmVmW3JlZm51bV0tPnJlZmVyZWRfYnlfb3RoZXJzID0gLTE7CisJCWF2czJfZGVjLT5mcmVmW3JlZm51bV0tPgorCQkJaW1ndHJfZndSZWZEaXN0YW5jZSA9IC0yNTY7CisJCW1lbXNldChhdnMyX2RlYy0+ZnJlZltyZWZudW1dLT5yZWZfcG9jLCAwLAorCQkJc2l6ZW9mKGF2czJfZGVjLT5mcmVmW3JlZm51bV0tPnJlZl9wb2MpKTsKKwl9CisJYXZzMl9kZWMtPmZfYmcgPSBOVUxMOworCisJaWYgKGlzX2F2czJfcHJpbnRfYnVmbWdyX2RldGFpbCgpKQorCQlwcl9pbmZvKCIlc1t0XSBhdnMyX2RlYy0+bV9iZ0AweCVwXG4iLAorCQlfX2Z1bmNfXywgYXZzMl9kZWMtPm1fYmcpOworCWF2czJfZGVjLT5tX2JnLT5pbWdjb2lfcmVmID0gLTI1NzsKKwlhdnMyX2RlYy0+bV9iZy0+aXNfb3V0cHV0ID0gLTE7CisJYXZzMl9kZWMtPm1fYmctPnJlZmVyZWRfYnlfb3RoZXJzID0gLTE7CisJYXZzMl9kZWMtPm1fYmctPmltZ3RyX2Z3UmVmRGlzdGFuY2UgPSAtMjU2OworCW1lbXNldChhdnMyX2RlYy0+bV9iZy0+cmVmX3BvYywgMCwKKwkJc2l6ZW9mKGF2czJfZGVjLT5tX2JnLT5yZWZfcG9jKSk7CisKKyNpZiBCQ0JSCisJLyppbml0IEJDQlIgcmVsYXRlZCovCisJaW1nLT5pTnVtQ1VzSW5GcmFtZSA9CisJCSgoaW1nLT53aWR0aCArIE1BWF9DVV9TSVpFIC0gMSkgLyBNQVhfQ1VfU0laRSkKKwkJKiAoKGltZy0+aGVpZ2h0ICsgTUFYX0NVX1NJWkUgLSAxKQorCQkvIE1BWF9DVV9TSVpFKTsKKwkvKmltZy0+QkxDVWlkeCA9ICAoaW50MzJfdCopIGNhbGxvYygKKwkgIGltZy0+aU51bUNVc0luRnJhbWUsIHNpemVvZihpbnQzMl90KSk7Ki8KKwkvKm1lbXNldCggaW1nLT5CTENVaWR4LCAwLCBpbWctPmlOdW1DVXNJbkZyYW1lKTsqLworI2VuZGlmCit9CisjZW5kaWYKKwordm9pZCBpbml0X2ZyYW1lX3Qoc3RydWN0IGF2czJfZnJhbWVfcyAqY3VycmZyZWYpCit7CisJbWVtc2V0KGN1cnJmcmVmLCAwLCBzaXplb2Yoc3RydWN0IGF2czJfZnJhbWVfcykpOworCWN1cnJmcmVmLT5pbWdjb2lfcmVmICAgICAgICAgID0gLTI1NzsKKwljdXJyZnJlZi0+aXNfb3V0cHV0ICAgICAgICAgICA9IC0xOworCWN1cnJmcmVmLT5yZWZlcmVkX2J5X290aGVycyAgID0gLTE7CisJY3VycmZyZWYtPmltZ3RyX2Z3UmVmRGlzdGFuY2UgPSAtMjU2OworCW1lbXNldChjdXJyZnJlZi0+cmVmX3BvYywgMCwgc2l6ZW9mKGN1cnJmcmVmLT5yZWZfcG9jKSk7Cit9CisKK3ZvaWQgZ2V0X3JlZmVyZW5jZV9saXN0X2luZm8oc3RydWN0IGF2czJfZGVjb2RlciAqYXZzMl9kZWMsIGludDhfdCAqc3RyKQoreworCXN0cnVjdCBJbWFnZVBhcmFtZXRlcnNfcyAgICAqaW1nID0gJmF2czJfZGVjLT5pbWc7CisJc3RydWN0IFZpZGVvX0NvbV9kYXRhX3MgKmhjID0gJmF2czJfZGVjLT5oYzsKKworCWludDhfdCBzdHJfdG1wWzE2XTsKKwlpbnQzMl90IGk7CisJLyogaW50MzJfdCBwb2MgPSBoYy0+Zl9yZWMtPmltZ3RyX2Z3UmVmRGlzdGFuY2U7CisJICBmcmVkLmNoaXVAbWVkaWF0ZWsuY29tKi8KKworCWlmIChpbWctPm51bV9vZl9yZWZlcmVuY2VzID4gMCkgeworCQlzdHJjcHkoc3RyLCAiWyIpOworCQlmb3IgKGkgPSAwOyBpIDwgaW1nLT5udW1fb2ZfcmVmZXJlbmNlczsgaSsrKSB7CisjaWYgUkQxNTEwX0ZJWF9CRworCQkJaWYgKGltZy0+dHlwZSA9PSBCX0lNRykgeworCQkJCXNwcmludGYoc3RyX3RtcCwgIiU0ZCAgICAiLAorCQkJCQloYy0+Zl9yZWMtPgorCQkJCQlyZWZfcG9jWworCQkJCQlpbWctPm51bV9vZl9yZWZlcmVuY2VzIC0gMSAtIGldKTsKKwkJCX0gZWxzZSB7CisJCQkJc3ByaW50ZihzdHJfdG1wLCAiJTRkICAgICIsCisJCQkJCWhjLT5mX3JlYy0+cmVmX3BvY1tpXSk7CisJCQl9CisjZWxzZQorCQkJc3ByaW50ZihzdHJfdG1wLCAiJTRkICAgICAiLAorCQkJCWF2czJfZGVjLT5mcmVmW2ldLT5pbWd0cl9md1JlZkRpc3RhbmNlKTsKKyNlbmRpZgorCisJCQlzdHJfdG1wWzVdID0gJ1wwJzsKKwkJCXN0cmNhdChzdHIsIHN0cl90bXApOworCQl9CisJCXN0cmNhdChzdHIsICJdIik7CisJfSBlbHNlIHsKKwkJc3RyWzBdID0gJ1wwJzsKKwl9Cit9CisKK3ZvaWQgcHJlcGFyZV9SZWZJbmZvKHN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjKQoreworCXN0cnVjdCBJbWFnZVBhcmFtZXRlcnNfcyAgICAqaW1nID0gJmF2czJfZGVjLT5pbWc7CisJc3RydWN0IFZpZGVvX0NvbV9kYXRhX3MgKmhjID0gJmF2czJfZGVjLT5oYzsKKwlzdHJ1Y3QgVmlkZW9fRGVjX2RhdGFfcyAqaGQgPSAmYXZzMl9kZWMtPmhkOworCisJaW50MzJfdCBpLCBqOworCWludDMyX3QgaWk7CisJc3RydWN0IGF2czJfZnJhbWVfcyAqdG1wX2ZyZWY7CisKKwkvKnVwZGF0ZSBJRFIgZnJhbWUqLworCWlmIChpbWctPnRyID4gaGQtPm5leHRfSURSdHIgJiYgaGQtPmN1cnJfSURSdHIgIT0gaGQtPm5leHRfSURSdHIpIHsKKwkJaGQtPmN1cnJfSURSdHIgID0gaGQtPm5leHRfSURSdHI7CisJCWhkLT5jdXJyX0lEUmNvaSA9IGhkLT5uZXh0X0lEUmNvaTsKKwl9CisJLyogcmUtb3JkZXIgdGhlIHJlZiBidWZmZXIgYWNjb3JkaW5nIHRvIFJQUyovCisJaW1nLT5udW1fb2ZfcmVmZXJlbmNlcyA9IGhkLT5jdXJyX1JQUy5udW1fb2ZfcmVmOworCisjaWYgMQorCS8qcmFpbiovCisJaWYgKGlzX2F2czJfcHJpbnRfYnVmbWdyX2RldGFpbCgpKSB7CisJCXByX2luZm8oIiVzOiBjb2Rpbmdfb3JkZXIgaXMgJWQsIGN1cnJfSURSY29pIGlzICVkXG4iLAorCQlfX2Z1bmNfXywgaW1nLT5jb2Rpbmdfb3JkZXIsIGhkLT5jdXJyX0lEUmNvaSk7CisJCWZvciAoaWkgPSAwOyBpaSA8IE1BWFJFRjsgaWkrKykgeworCQkJcHJfaW5mbygicmVmX3BpYyglZCk9JWRcbiIsCisJCQlpaSwgaGQtPmN1cnJfUlBTLnJlZl9waWNbaWldKTsKKwl9CisJZm9yIChpaSA9IDA7IGlpIDwgYXZzMl9kZWMtPnJlZl9tYXhidWZmZXI7IGlpKyspIHsKKwkJcHJfaW5mbygKKwkJCSJmcmVmWyVkXTogaW5kZXggJWQgaW1nY29pX3JlZiAlZCBpbWd0cl9md1JlZkRpc3RhbmNlICVkXG4iLAorCQkJaWksIGF2czJfZGVjLT5mcmVmW2lpXS0+aW5kZXgsCisJCQlhdnMyX2RlYy0+ZnJlZltpaV0tPmltZ2NvaV9yZWYsCisJCQlhdnMyX2RlYy0+ZnJlZltpaV0tPmltZ3RyX2Z3UmVmRGlzdGFuY2UpOworCX0KKwl9CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCBoZC0+Y3Vycl9SUFMubnVtX29mX3JlZjsgaSsrKSB7CisJCS8qaW50MzJfdCBhY2N1bXVsYXRlID0gMDsqLworCQkvKiBjb3B5IHRtcF9mcmVmIGZyb20gYXZzMl9kZWMtPmZyZWZbaV0gKi8KKwkJdG1wX2ZyZWYgPSBhdnMyX2RlYy0+ZnJlZltpXTsKKworI2lmIFJFTU9WRV9VTlVTRUQKKwkJZm9yIChqID0gaTsgaiA8IGF2czJfZGVjLT5yZWZfbWF4YnVmZmVyOyBqKyspIHsKKwkJCS8qLy8vLy8vLy8vLy8vL3RvIGJlIG1vZGlmaWVkICBJRFIqLworCQkJaWYgKGF2czJfZGVjLT5mcmVmW2pdLT5pbWdjb2lfcmVmID09CisJCQkJaW1nLT5jb2Rpbmdfb3JkZXIgLQorCQkJCWhkLT5jdXJyX1JQUy5yZWZfcGljW2ldKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKyNlbHNlCisKKwkJZm9yIChqID0gaTsgaiA8IGF2czJfZGVjLT5yZWZfbWF4YnVmZmVyOyBqKyspIHsKKwkJCS8qLy8vLy8vLy8vLy8vL3RvIGJlIG1vZGlmaWVkICBJRFIqLworCQkJaW50MzJfdCBrICwgdG1wX3RyOworCQkJZm9yIChrID0gMDsgayA8IGF2czJfZGVjLT5yZWZfbWF4YnVmZmVyOyBrKyspIHsKKwkJCQlpZiAoKChpbnQzMl90KWltZy0+Y29kaW5nX29yZGVyIC0KKwkJCQkJKGludDMyX3QpaGQtPmN1cnJfUlBTLnJlZl9waWNbaV0pID09CisJCQkJCWF2czJfZGVjLT5mcmVmW2tdLT5pbWdjb2lfcmVmICYmCisJCQkJCWF2czJfZGVjLT5mcmVmW2tdLT5pbWdjb2lfcmVmID49IC0yNTYpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKGsgPT0gYXZzMl9kZWMtPnJlZl9tYXhidWZmZXIpIHsKKwkJCQl0bXBfdHIgPQorCQkJCS0xLTE7CisJCQl9IGVsc2UgeworCQkJCXRtcF90ciA9CisJCQkJCWF2czJfZGVjLT5mcmVmW2tdLT5pbWd0cl9md1JlZkRpc3RhbmNlOworCQkJfQorCQkJaWYgKHRtcF90ciA8IGhkLT5jdXJyX0lEUnRyKSB7CisJCQkJaGQtPmN1cnJfUlBTLnJlZl9waWNbaV0gPQorCQkJCQlpbWctPmNvZGluZ19vcmRlciAtIGhkLT5jdXJyX0lEUmNvaTsKKworCQkJCWZvciAoayA9IDA7IGsgPCBpOyBrKyspIHsKKwkJCQkJaWYgKGhkLT5jdXJyX1JQUy5yZWZfcGljW2tdID09CisJCQkJCQloZC0+Y3Vycl9SUFMucmVmX3BpY1tpXSkgeworCQkJCQkJYWNjdW11bGF0ZSsrOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAoYXZzMl9kZWMtPmZyZWZbal0tPmltZ2NvaV9yZWYgPT0KKwkJCQlpbWctPmNvZGluZ19vcmRlciAtIGhkLT5jdXJyX1JQUy5yZWZfcGljW2ldKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGogPT0gYXZzMl9kZWMtPnJlZl9tYXhidWZmZXIgfHwgYWNjdW11bGF0ZSkKKwkJCWltZy0+bnVtX29mX3JlZmVyZW5jZXMtLTsKKyNlbmRpZgorCQlpZiAoaiAhPSBhdnMyX2RlYy0+cmVmX21heGJ1ZmZlcikgeworCQkJLyogY29weSBhdnMyX2RlYy0+ZnJlZltpXSBmcm9tIGF2czJfZGVjLT5mcmVmW2pdICovCisJCQlhdnMyX2RlYy0+ZnJlZltpXSA9IGF2czJfZGVjLT5mcmVmW2pdOworCQkJLyogY29weSBhdnMyX2RlYy0+ZnJlZltqXSBmcm9tIGZlcmZbdG1wXSAqLworCQkJYXZzMl9kZWMtPmZyZWZbal0gPSB0bXBfZnJlZjsKKwkJCWlmIChpc19hdnMyX3ByaW50X2J1Zm1ncl9kZXRhaWwoKSkgeworCQkJCXByX2luZm8oIiVzLCBzd2l0Y2ggJWQgJWQ6ICIsIF9fZnVuY19fLCBpLCBqKTsKKwkJCQlmb3IgKGlpID0gMDsgaWkgPCBoZC0+Y3Vycl9SUFMubnVtX29mX3JlZgorCQkJCXx8IGlpIDw9IGo7IGlpKyspCisJCQkJCXByX2luZm8oIiVkICIsCisJCQkJCWF2czJfZGVjLT5mcmVmW2lpXS0+aW5kZXgpOworCQkJCXByX2luZm8oIlxuIik7CisJCQl9CisJCX0KKwl9CisJaWYgKGltZy0+dHlwZSA9PSBCX0lNRyAmJgorCQkoYXZzMl9kZWMtPmZyZWZbMF0tPmltZ3RyX2Z3UmVmRGlzdGFuY2UgPD0gaW1nLT50cgorCQl8fCBhdnMyX2RlYy0+ZnJlZlsxXS0+aW1ndHJfZndSZWZEaXN0YW5jZSA+PSBpbWctPnRyKSkgeworCisJCXByX2luZm8oIndyb25nIHJlZmVyZW5jZSBjb25maWd1cmF0aW9uIGZvciBCIGZyYW1lXG4iKTsKKwkJcHJfaW5mbygKKwkJCSJmcmVmMCBpbWd0cl9md1JlZkRpc3RhbmNlICVkLCBmcmVmMSBpbWd0cl9md1JlZkRpc3RhbmNlICVkLCBpbWctPnRyICVkXG4iLAorCQkJCWF2czJfZGVjLT5mcmVmWzBdLT5pbWd0cl9md1JlZkRpc3RhbmNlLAorCQkJCWF2czJfZGVjLT5mcmVmWzFdLT5pbWd0cl9md1JlZkRpc3RhbmNlLAorCQkJCWltZy0+dHIpOworCQloYy0+Zl9yZWMtPmVycm9yX21hcmsgPSAxOworCQlhdnMyX2RlYy0+YnVmbWdyX2Vycm9yX2ZsYWcgPSAxOworCQlyZXR1cm47IC8qIGV4aXQoLTEpOyovCisJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCX0KKworI2lmICFGSVhfUFJPRklMRV9MRVZFTF9EUEJfUlBTXzEKKwkvKiBkZWxldGUgdGhlIGZyYW1lIHRoYXQgd2lsbCBuZXZlciBiZSB1c2VkKi8KKwlmb3IgKGkgPSAwOyBpIDwgaGQtPmN1cnJfUlBTLm51bV90b19yZW1vdmU7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgYXZzMl9kZWMtPnJlZl9tYXhidWZmZXI7IGorKykgeworCQkJaWYgKGF2czJfZGVjLT5mcmVmW2pdLT5pbWdjb2lfcmVmID49IC0yNTYKKwkJCQkmJiBhdnMyX2RlYy0+ZnJlZltqXS0+aW1nY29pX3JlZgorCQkJCT09IGltZy0+Y29kaW5nX29yZGVyIC0KKwkJCQloZC0+Y3Vycl9SUFMucmVtb3ZlX3BpY1tpXSkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChqIDwgYXZzMl9kZWMtPnJlZl9tYXhidWZmZXIgJiYKKwkJCWogPj0gaW1nLT5udW1fb2ZfcmVmZXJlbmNlcykgeworCQkJYXZzMl9kZWMtPmZyZWZbal0tPmltZ2NvaV9yZWYgPSAtMjU3OworI2lmIE0zNDgwX1RFTVBPUkFMX1NDQUxBQkxFCisJCQlhdnMyX2RlYy0+ZnJlZltqXS0+dGVtcG9yYWxfaWQgPSAtMTsKKyNlbmRpZgorCQkJaWYgKGF2czJfZGVjLT5mcmVmW2pdLT5pc19vdXRwdXQgPT0gLTEpIHsKKwkJCQlhdnMyX2RlYy0+ZnJlZltqXS0+CisJCQkJaW1ndHJfZndSZWZEaXN0YW5jZSA9IC0yNTY7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKworCS8qIGFkZCBpbnRlci12aWV3IHJlZmVyZW5jZSBwaWN0dXJlKi8KKworCS8qICAgYWRkIGN1cnJlbnQgZnJhbWUgdG8gcmVmIGJ1ZmZlciovCisJZm9yIChpID0gMDsgaSA8IGF2czJfZGVjLT5yZWZfbWF4YnVmZmVyOyBpKyspIHsKKwkJaWYgKChhdnMyX2RlYy0+ZnJlZltpXS0+aW1nY29pX3JlZiA8IC0yNTYKKwkJCXx8IGFicyhhdnMyX2RlYy0+ZnJlZltpXS0+CisJCQkJaW1ndHJfZndSZWZEaXN0YW5jZSAtIGltZy0+dHIpID49IDEyOCkKKwkJCQkmJiBhdnMyX2RlYy0+ZnJlZltpXS0+aXNfb3V0cHV0ID09IC0xCisJCQkJJiYgYXZzMl9kZWMtPmZyZWZbaV0tPmJnX2ZsYWcgPT0gMAorI2lmbmRlZiBOT19ESVNQTEFZCisJCQkJJiYgYXZzMl9kZWMtPmZyZWZbaV0tPnZmX3JlZiA9PSAwCisJCQkJJiYgYXZzMl9kZWMtPmZyZWZbaV0tPnRvX3ByZXBhcmVfZGlzcCA9PSAwCisjZW5kaWYKKwkJCQkpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChpID09IGF2czJfZGVjLT5yZWZfbWF4YnVmZmVyKSB7CisJCXByX2luZm8oCisJCQkiJXMsIHdhcm5pbmcsIG5vIGVub3VnaCBidWZcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWktLTsKKwl9CisKKwloYy0+Zl9yZWMgICAgICAgID0gYXZzMl9kZWMtPmZyZWZbaV07CisJaGMtPmN1cnJlbnRGcmFtZSA9IGhjLT5mX3JlYy0+cmVmOworCWhjLT5mX3JlYy0+aW1ndHJfZndSZWZEaXN0YW5jZSA9IGltZy0+dHI7CisJaGMtPmZfcmVjLT5pbWdjb2lfcmVmID0gaW1nLT5jb2Rpbmdfb3JkZXI7CisjaWYgTTM0ODBfVEVNUE9SQUxfU0NBTEFCTEUKKwloYy0+Zl9yZWMtPnRlbXBvcmFsX2lkID0gaGQtPmN1cl9sYXllcjsKKyNlbmRpZgorCWhjLT5mX3JlYy0+aXNfb3V0cHV0ID0gMTsKKyNpZmRlZiBBTUwKKwloYy0+Zl9yZWMtPmVycm9yX21hcmsgPSAwOworCWhjLT5mX3JlYy0+ZGVjb2RlZF9sY3UgPSAwOworCWhjLT5mX3JlYy0+c2xpY2VfdHlwZSA9IGltZy0+dHlwZTsKKyNlbmRpZgorCWhjLT5mX3JlYy0+cmVmZXJlZF9ieV9vdGhlcnMgPSBoZC0+Y3Vycl9SUFMucmVmZXJkX2J5X290aGVyczsKKwlpZiAoaXNfYXZzMl9wcmludF9idWZtZ3JfZGV0YWlsKCkpCisJCXByX2luZm8oCisJCQkiJXMsIHNldCBmX3JlYyAoY3VyX3BpYykgPD0gZnJlZlslZF0gaW1nLT50ciAlZCBjb2Rpbmdfb3JkZXIgJWQgaW1nX3R5cGUgJWRcbiIsCisJCQlfX2Z1bmNfXywgaSwgaW1nLT50ciwgaW1nLT5jb2Rpbmdfb3JkZXIsCisJCQlpbWctPnR5cGUpOworCisJaWYgKGltZy0+dHlwZSAhPSBCX0lNRykgeworCQlmb3IgKGogPSAwOworCQkJaiA8IGltZy0+bnVtX29mX3JlZmVyZW5jZXM7IGorKykgeworCQkJaGMtPmZfcmVjLT5yZWZfcG9jW2pdID0KKwkJCWF2czJfZGVjLT5mcmVmW2pdLT5pbWd0cl9md1JlZkRpc3RhbmNlOworCQl9CisJfSBlbHNlIHsKKwkJaGMtPmZfcmVjLT5yZWZfcG9jWzBdID0KKwkJCWF2czJfZGVjLT5mcmVmWzFdLT5pbWd0cl9md1JlZkRpc3RhbmNlOworCQloYy0+Zl9yZWMtPnJlZl9wb2NbMV0gPQorCQkJYXZzMl9kZWMtPmZyZWZbMF0tPmltZ3RyX2Z3UmVmRGlzdGFuY2U7CisJfQorCisjaWYgTTM0ODBfVEVNUE9SQUxfU0NBTEFCTEUKKworCWZvciAoaiA9IGltZy0+bnVtX29mX3JlZmVyZW5jZXM7CisJCWogPCA0OyBqKyspIHsKKwkJLyoqLworCQloYy0+Zl9yZWMtPnJlZl9wb2Nbal0gPSAwOworCX0KKworCWlmIChpbWctPnR5cGUgPT0gSU5UUkFfSU1HKSB7CisJCWludDMyX3QgbDsKKwkJZm9yIChsID0gMDsgbCA8IDQ7IGwrKykgeworCQkJaGMtPmZfcmVjLT5yZWZfcG9jW2xdCisJCQk9IGltZy0+dHI7CisJCX0KKwl9CisKKyNlbmRpZgorCisvKi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovCisJLyogdXBkYXRhIHJlZiBwb2ludGVyKi8KKworCWlmIChpbWctPnR5cGUgIT0gSV9JTUcpIHsKKworCQlpbWctPmltZ3RyX25leHRfUCA9IGltZy0+dHlwZSA9PSBCX0lNRyA/CisJCQlhdnMyX2RlYy0+ZnJlZlswXS0+aW1ndHJfZndSZWZEaXN0YW5jZSA6IGltZy0+dHI7CisJCWlmIChpbWctPnR5cGUgPT0gQl9JTUcpIHsKKwkJCWhkLT50cnRtcCA9IGF2czJfZGVjLT5mcmVmWzBdLT5pbWd0cl9md1JlZkRpc3RhbmNlOworCQkJYXZzMl9kZWMtPmZyZWZbMF0tPmltZ3RyX2Z3UmVmRGlzdGFuY2UgPQorCQkJYXZzMl9kZWMtPmZyZWZbMV0tPmltZ3RyX2Z3UmVmRGlzdGFuY2U7CisJCX0KKwl9CisjaWYgMQorCS8qcmFpbiovCisJaWYgKGlzX2F2czJfcHJpbnRfYnVmbWdyX2RldGFpbCgpKSB7CisJCWZvciAoaWkgPSAwOyBpaSA8IGF2czJfZGVjLT5yZWZfbWF4YnVmZmVyOyBpaSsrKSB7CisJCQlwcl9pbmZvKAorCQkJImZyZWZbJWRdOiBpbmRleCAlZCBpbWdjb2lfcmVmICVkIGltZ3RyX2Z3UmVmRGlzdGFuY2UgJWQgcmVmZXJlZCAlZCwgaXNfb3V0ICVkLCBiZyAlZCwgdmZfcmVmICVkIHJlZl9wb3MoJWQsJWQsJWQsJWQsJWQsJWQsJWQpXG4iLAorCQkJaWksIGF2czJfZGVjLT5mcmVmW2lpXS0+aW5kZXgsCisJCQlhdnMyX2RlYy0+ZnJlZltpaV0tPmltZ2NvaV9yZWYsCisJCQlhdnMyX2RlYy0+ZnJlZltpaV0tPmltZ3RyX2Z3UmVmRGlzdGFuY2UsCisJCQlhdnMyX2RlYy0+ZnJlZltpaV0tPnJlZmVyZWRfYnlfb3RoZXJzLAorCQkJYXZzMl9kZWMtPmZyZWZbaWldLT5pc19vdXRwdXQsCisJCQlhdnMyX2RlYy0+ZnJlZltpaV0tPmJnX2ZsYWcsCisJCQlhdnMyX2RlYy0+ZnJlZltpaV0tPnZmX3JlZiwKKwkJCWF2czJfZGVjLT5mcmVmW2lpXS0+cmVmX3BvY1swXSwKKwkJCWF2czJfZGVjLT5mcmVmW2lpXS0+cmVmX3BvY1sxXSwKKwkJCWF2czJfZGVjLT5mcmVmW2lpXS0+cmVmX3BvY1syXSwKKwkJCWF2czJfZGVjLT5mcmVmW2lpXS0+cmVmX3BvY1szXSwKKwkJCWF2czJfZGVjLT5mcmVmW2lpXS0+cmVmX3BvY1s0XSwKKwkJCWF2czJfZGVjLT5mcmVmW2lpXS0+cmVmX3BvY1s1XSwKKwkJCWF2czJfZGVjLT5mcmVmW2lpXS0+cmVmX3BvY1s2XQorCQkpOworCX0KKwl9CisjZW5kaWYKK30KKworaW50MzJfdCBpbml0X2ZyYW1lKHN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjKQoreworCXN0cnVjdCBJbWFnZVBhcmFtZXRlcnNfcyAgICAqaW1nID0gJmF2czJfZGVjLT5pbWc7CisJc3RydWN0IFZpZGVvX0NvbV9kYXRhX3MgKmhjID0gJmF2czJfZGVjLT5oYzsKKwlzdHJ1Y3QgVmlkZW9fRGVjX2RhdGFfcyAqaGQgPSAmYXZzMl9kZWMtPmhkOworCisKKyNpZiBSRDE1MTBfRklYX0JHCisJaWYgKGltZy0+dHlwZSA9PSBJX0lNRyAmJgorCQlpbWctPnR5cGViID09IEJBQ0tHUk9VTkRfSU1HKSB7IC8qRy9HQiBmcmFtZSovCisJCWltZy0+bnVtX29mX3JlZmVyZW5jZXMgPSAwOworCX0gZWxzZSBpZiAoaW1nLT50eXBlID09IFBfSU1HICYmIGltZy0+dHlwZWIgPT0gQlBfSU1HKSB7CisJCS8qIG9ubHkgb25lIHJlZmVyZW5jZSBmcmFtZShHXEdCKSBmb3IgUyBmcmFtZSovCisJCWltZy0+bnVtX29mX3JlZmVyZW5jZXMgPSAxOworCX0KKyNlbmRpZgorCisJaWYgKGltZy0+dHlwZWIgPT0gQkFDS0dST1VORF9JTUcgJiYKKwkJaGQtPmJhY2tncm91bmRfcGljdHVyZV9vdXRwdXRfZmxhZyA9PSAwKSB7CisJCWhjLT5jdXJyZW50RnJhbWUgPSBoYy0+YmFja2dyb3VuZF9yZWY7CisjaWZkZWYgQU1MCisJCWhjLT5jdXJfcGljID0gYXZzMl9kZWMtPm1fYmc7CisjZW5kaWYKKwl9IGVsc2UgeworCQlwcmVwYXJlX1JlZkluZm8oYXZzMl9kZWMpOworI2lmZGVmIEFNTAorCQloYy0+Y3VyX3BpYyA9IGhjLT5mX3JlYzsKKyNlbmRpZgorCX0KKworCisjaWZkZWYgRklYX0NIUk9NQV9GSUVMRF9NVl9CS19ESVNUCisJaWYgKGltZy0+dHlwZWIgPT0gQkFDS0dST1VORF9JTUcKKwkJJiYgaW1nLT5pc19maWVsZF9zZXF1ZW5jZSkgeworCQlhdnMyX2RlYy0+YmtfaW1nX2lzX3RvcF9maWVsZAorCQkJPSBpbWctPmlzX3RvcF9maWVsZDsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKwordm9pZCBkZWxldGVfdHJidWZmZXIoc3RydWN0IG91dGRhdGFfcyAqZGF0YSwgaW50MzJfdCBwb3MpCit7CisJaW50MzJfdCBpOworCWZvciAoaSA9IHBvczsKKwkJaSA8IGRhdGEtPmJ1ZmZlcl9udW0gLSAxOyBpKyspIHsKKwkJZGF0YS0+c3Rkb3V0ZGF0YVtpXSA9CisJCWRhdGEtPnN0ZG91dGRhdGFbaSArIDFdOworCX0KKwlkYXRhLT5idWZmZXJfbnVtLS07Cit9CisKKyNpZiBSRDE3MF9GSVhfQkcKK3ZvaWQgZmx1c2hEUEIoc3RydWN0IGF2czJfZGVjb2RlciAqYXZzMl9kZWMpCit7CisJc3RydWN0IFZpZGVvX0RlY19kYXRhX3MgKmhkID0gJmF2czJfZGVjLT5oZDsKKwlpbnQgaiwgdG1wX21pbiwgaSwgcG9zID0gLTE7CisJaW50IHNlYXJjaF90aW1lcyA9IGF2czJfZGVjLT5vdXRwcmludC5idWZmZXJfbnVtOworCisJdG1wX21pbiA9IDEgPDwgMjA7CisJaSA9IDAsIGogPSAwOworCXBvcyA9IC0xOworCisJZm9yIChqID0gMDsgaiA8IHNlYXJjaF90aW1lczsgaisrKSB7CisJCXBvcyA9IC0xOworCQl0bXBfbWluID0gKDEgPDwgMjApOworCQkvKnNlYXJjaCBmb3IgbWluIHBvaSBwaWN0dXJlIHRvIGRpc3BsYXkqLworCQlmb3IgKGkgPSAwOyBpIDwgYXZzMl9kZWMtPm91dHByaW50LmJ1ZmZlcl9udW07IGkrKykgeworCQkJaWYgKGF2czJfZGVjLT5vdXRwcmludC5zdGRvdXRkYXRhW2ldLnRyIDwgdG1wX21pbikgeworCQkJCXBvcyA9IGk7CisJCQkJdG1wX21pbiA9IGF2czJfZGVjLT5vdXRwcmludC5zdGRvdXRkYXRhW2ldLnRyOworCQkJfQorCQl9CisKKwkJaWYgKHBvcyAhPSAtMSkgeworCQkJaGQtPmxhc3Rfb3V0cHV0ID0gYXZzMl9kZWMtPm91dHByaW50LnN0ZG91dGRhdGFbcG9zXS50cjsKKwkJCXJlcG9ydF9mcmFtZShhdnMyX2RlYywgJmF2czJfZGVjLT5vdXRwcmludCwgcG9zKTsKKwkJCWlmIChhdnMyX2RlYy0+b3V0cHJpbnQuc3Rkb3V0ZGF0YVtwb3NdLnR5cGViCisJCQkJPT0gQkFDS0dST1VORF9JTUcgJiYKKwkJCWF2czJfZGVjLT5vdXRwcmludC5zdGRvdXRkYXRhW3Bvc10uCisJCQliYWNrZ3JvdW5kX3BpY3R1cmVfb3V0cHV0X2ZsYWcKKwkJCT09IDApIHsKKwkJCQkvKndyaXRlX0dCX2ZyYW1lKGhkLT5wX291dF9iYWNrZ3JvdW5kKTsqLworCQkJfSBlbHNlIHsKKwkJCQl3cml0ZV9mcmFtZShhdnMyX2RlYywKKwkJCQkJYXZzMl9kZWMtPm91dHByaW50LnN0ZG91dGRhdGFbcG9zXS50cik7CisJCQl9CisKKwkJCWRlbGV0ZV90cmJ1ZmZlcigmYXZzMl9kZWMtPm91dHByaW50LCBwb3MpOworCQl9CisJfQorCisJLypjbGVhciBkcGIgaW5mbyovCisJZm9yIChqID0gMDsgaiA8IFJFRl9NQVhCVUZGRVI7IGorKykgeworCQlhdnMyX2RlYy0+ZnJlZltqXS0+aW1ndHJfZndSZWZEaXN0YW5jZSA9IC0yNTY7CisJCWF2czJfZGVjLT5mcmVmW2pdLT5pbWdjb2lfcmVmID0gLTI1NzsKKwkJYXZzMl9kZWMtPmZyZWZbal0tPnRlbXBvcmFsX2lkID0gLTE7CisJCWF2czJfZGVjLT5mcmVmW2pdLT5yZWZlcmVkX2J5X290aGVycyA9IDA7CisJfQorfQorI2VuZGlmCisKKworCisjaWYgTTM0ODBfVEVNUE9SQUxfU0NBTEFCTEUKK3ZvaWQgY2xlYW5SZWZNVkJ1ZlJlZihpbnQgcG9zKQoreworI2lmIDAKKwlpbnQgaywgeCwgeTsKKwkvKnJlLWluaXQgbXZidWYqLworCWZvciAoayA9IDA7IGsgPCAyOyBrKyspIHsKKwkJZm9yICh5ID0gMDsgeSA8IGltZy0+aGVpZ2h0IC8gTUlOX0JMT0NLX1NJWkU7IHkrKykgeworCQkJZm9yICh4ID0gMDsgeCA8IGltZy0+d2lkdGggLyBNSU5fQkxPQ0tfU0laRTsgeCsrKQorCQkJCWZyZWZbcG9zXS0+bXZidWZbeV1beF1ba10gPSAwOworCisJCX0KKwl9CisJLypyZS1pbml0IHJlZmJ1ZiovCisJZm9yICh5ID0gMDsgeSA8IGltZy0+aGVpZ2h0IC8gTUlOX0JMT0NLX1NJWkU7IHkrKykgeworCQlmb3IgKHggPSAwOyB4IDwgaW1nLT53aWR0aCAvIE1JTl9CTE9DS19TSVpFIDsgeCsrKQorCQkJZnJlZltwb3NdLT5yZWZidWZbeV1beF0gPSAtMTsKKworCX0KKyNlbmRpZgorfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZnJhbWVfcG9zdHByb2Nlc3Npbmcoc3RydWN0IGF2czJfZGVjb2RlciAqYXZzMl9kZWMpCit7CisJc3RydWN0IEltYWdlUGFyYW1ldGVyc19zICAgICppbWcgPSAmYXZzMl9kZWMtPmltZzsKKwlzdHJ1Y3QgVmlkZW9fQ29tX2RhdGFfcyAqaGMgPSAmYXZzMl9kZWMtPmhjOworCXN0cnVjdCBWaWRlb19EZWNfZGF0YV9zICpoZCA9ICZhdnMyX2RlYy0+aGQ7CisKKwlpbnQzMl90IHBvaW50ZXJfdG1wID0gYXZzMl9kZWMtPm91dHByaW50LmJ1ZmZlcl9udW07CisJaW50MzJfdCBpOworCXN0cnVjdCBTVERPVVRfREFUQV9zICpwX291dGRhdGE7CisjaWYgUkQxNjBfRklYX0JHCisJaW50MzJfdCBqLCB0bXBfbWluLCBvdXRwdXRfY3VyX2RlY19waWMsIHBvcyA9IC0xOworCWludDMyX3Qgc2VhcmNoX3RpbWVzID0gYXZzMl9kZWMtPm91dHByaW50LmJ1ZmZlcl9udW07CisjZW5kaWYKKwkvKnBpYyBkaXN0IGJ5IEdyYW5kdmlldyBTZW1pLiBAIFswNi0wNy0yMCAxNToyNV0qLworCWltZy0+UHJldlBpY0Rpc3RhbmNlTHNiID0gKGltZy0+Y29kaW5nX29yZGVyICUgMjU2KTsKKworCXBvaW50ZXJfdG1wID0gYXZzMl9kZWMtPm91dHByaW50LmJ1ZmZlcl9udW07CisJcF9vdXRkYXRhICAgPSAmYXZzMl9kZWMtPm91dHByaW50LnN0ZG91dGRhdGFbcG9pbnRlcl90bXBdOworCisJcF9vdXRkYXRhLT50eXBlID0gaW1nLT50eXBlOworCXBfb3V0ZGF0YS0+dHlwZWIgPSBpbWctPnR5cGViOworCXBfb3V0ZGF0YS0+ZnJhbWVudW0gPSBpbWctPnRyOworCXBfb3V0ZGF0YS0+dHIgPSBpbWctPnRyOworI2lmIDAgLypkZWYgT1JJKi8KKwlwX291dGRhdGEtPnFwID0gaW1nLT5xcDsKKyNlbHNlCisJcF9vdXRkYXRhLT5xcCA9IDA7CisjZW5kaWYKKwkvKnBfb3V0ZGF0YS0+c25yX3kgPSBzbnItPnNucl95OyovCisJLypwX291dGRhdGEtPnNucl91ID0gc25yLT5zbnJfdTsqLworCS8qcF9vdXRkYXRhLT5zbnJfdiA9IHNuci0+c25yX3Y7Ki8KKwlwX291dGRhdGEtPnRtcF90aW1lID0gaGQtPnRtcF90aW1lOworCXBfb3V0ZGF0YS0+cGljdHVyZV9zdHJ1Y3R1cmUgPSBpbWctPnBpY3R1cmVfc3RydWN0dXJlOworCS8qcF9vdXRkYXRhLT5jdXJyX2ZyYW1lX2JpdHMgPQorCSAgU3RhdEJpdHNQdHItPmN1cnJfZnJhbWVfYml0czsqLworCS8qcF9vdXRkYXRhLT5lbXVsYXRlX2JpdHMgPSBTdGF0Qml0c1B0ci0+ZW11bGF0ZV9iaXRzOyovCisjaWYgUkQxNTAxX0ZJWF9CRworCXBfb3V0ZGF0YS0+YmFja2dyb3VuZF9waWN0dXJlX291dHB1dF9mbGFnCisJCT0gaGQtPmJhY2tncm91bmRfcGljdHVyZV9vdXRwdXRfZmxhZzsKKwkJLypMb25nZmVpLldhbmdAbWVkaWF0ZWsuY29tKi8KKyNlbmRpZgorCisjaWYgUkQxNjBfRklYX0JHCisJcF9vdXRkYXRhLT5waWN0dXJlX3Jlb3JkZXJfZGVsYXkgPSBoZC0+cGljdHVyZV9yZW9yZGVyX2RlbGF5OworI2VuZGlmCisJYXZzMl9kZWMtPm91dHByaW50LmJ1ZmZlcl9udW0rKzsKKworI2lmIFJEMTcwX0ZJWF9CRworCXNlYXJjaF90aW1lcyA9IGF2czJfZGVjLT5vdXRwcmludC5idWZmZXJfbnVtOworI2VuZGlmCisJLyogcmVjb3JkIHRoZSByZWZlcmVuY2UgbGlzdCovCisJc3RyY3B5KHBfb3V0ZGF0YS0+c3RyX3JlZmVyZW5jZV9saXN0LCBoYy0+c3RyX2xpc3RfcmVmZXJlbmNlKTsKKworI2lmICFSRUZfT1VUUFVUCisJI2Vycm9yICIhISFSRUZfT1VUUFVUIHNob3VsZCBiZSAxIgorCWZvciAoaSA9IDA7IGkgPCBhdnMyX2RlYy0+b3V0cHJpbnQuYnVmZmVyX251bTsgaSsrKSB7CisJCW1pbl90cihhdnMyX2RlYy0+b3V0cHJpbnQsICZwb3MpOworCQlpZiAoYXZzMl9kZWMtPm91dHByaW50LnN0ZG91dGRhdGFbcG9zXS50ciA8IGltZy0+dHIKKwkJCXx8IGF2czJfZGVjLT5vdXRwcmludC5zdGRvdXRkYXRhW3Bvc10udHIKKwkJCT09IChoZC0+bGFzdF9vdXRwdXQgKyAxKSkgeworCQkJaGQtPmxhc3Rfb3V0cHV0ID0gYXZzMl9kZWMtPm91dHByaW50LnN0ZG91dGRhdGFbcG9zXS50cjsKKwkJCXJlcG9ydF9mcmFtZShhdnMyX2RlYywgJmF2czJfZGVjLT5vdXRwcmludCwgcG9zKTsKKyNpZiAwIC8qZGVmIE9SSSovCisJCQl3cml0ZV9mcmFtZShoZC0+cF9vdXQsCisJCQlhdnMyX2RlYy0+b3V0cHJpbnQuc3Rkb3V0ZGF0YVtwb3NdLnRyKTsKKyNlbmRpZgorCQkJZGVsZXRlX3RyYnVmZmVyKCZhdnMyX2RlYy0+b3V0cHJpbnQsIHBvcyk7CisJCQlpLS07CisJCX0gZWxzZSB7CisJCQlicmVhazsKKwkJfQorCX0KKyNlbHNlCisjaWYgUkQxNjBfRklYX0JHIC8qTG9uZ2ZlaS5XYW5nQG1lZGlhdGVrLmNvbSovCisJdG1wX21pbiA9IDEgPDwgMjA7CisJaSA9IDAsIGogPSAwOworCW91dHB1dF9jdXJfZGVjX3BpYyA9IDA7CisJcG9zID0gLTE7CisJZm9yIChqID0gMDsgaiA8IHNlYXJjaF90aW1lczsgaisrKSB7CisJCXBvcyA9IC0xOworCQl0bXBfbWluID0gKDEgPDwgMjApOworCQkvKnNlYXJjaCBmb3IgbWluIHBvaSBwaWN0dXJlIHRvIGRpc3BsYXkqLworCQlmb3IgKGkgPSAwOyBpIDwgYXZzMl9kZWMtPm91dHByaW50LmJ1ZmZlcl9udW07IGkrKykgeworCQkJaWYgKChhdnMyX2RlYy0+b3V0cHJpbnQuc3Rkb3V0ZGF0YVtpXS50ciA8IHRtcF9taW4pICYmCisJCQkJKChhdnMyX2RlYy0+b3V0cHJpbnQuc3Rkb3V0ZGF0YVtpXS50cgorCQkJCSsgYXZzMl9kZWMtPm91dHByaW50LnN0ZG91dGRhdGFbaV0uCisJCQkJCXBpY3R1cmVfcmVvcmRlcl9kZWxheSkKKwkJCQk8PSAoaW50MzJfdClpbWctPmNvZGluZ19vcmRlcikpIHsKKwkJCQlwb3MgPSBpOworCQkJCXRtcF9taW4gPSBhdnMyX2RlYy0+b3V0cHJpbnQuc3Rkb3V0ZGF0YVtpXS50cjsKKwkJCX0KKwkJfQorCisJCWlmICgoMCA9PSBoZC0+ZGlzcGxheWRlbGF5KSAmJiAoMCA9PSBvdXRwdXRfY3VyX2RlY19waWMpKSB7CisJCQlpZiAoaW1nLT50ciA8PSB0bXBfbWluKQl7LypmcmVkLmNoaXVAbWVkaWF0ZWsuY29tKi8KKwkJCQkvKm91dHB1dCBjdXJyZW50IGRlY29kZSBwaWN0dXJlCisJCQkJICByaWdodCBub3cqLworCQkJCXBvcyA9IGF2czJfZGVjLT5vdXRwcmludC5idWZmZXJfbnVtIC0gMTsKKwkJCQlvdXRwdXRfY3VyX2RlY19waWMgPSAxOworCQkJfQorCQl9CisJCWlmIChwb3MgIT0gLTEpIHsKKwkJCWhkLT5sYXN0X291dHB1dCA9IGF2czJfZGVjLT5vdXRwcmludC5zdGRvdXRkYXRhW3Bvc10udHI7CisJCQlyZXBvcnRfZnJhbWUoYXZzMl9kZWMsICZhdnMyX2RlYy0+b3V0cHJpbnQsIHBvcyk7CisjaWYgMSAvKmRlZiBPUkkqLworCQkJaWYgKGF2czJfZGVjLT5vdXRwcmludC5zdGRvdXRkYXRhW3Bvc10udHlwZWIKKwkJCQk9PSBCQUNLR1JPVU5EX0lNRyAmJgorCQkJCWF2czJfZGVjLT5vdXRwcmludC5zdGRvdXRkYXRhW3Bvc10uCisJCQkJYmFja2dyb3VuZF9waWN0dXJlX291dHB1dF9mbGFnID09IDApIHsKKwkJCQkvKiovCisJCQkJLyoqLworCQkJfSBlbHNlIHsKKwkJCQl3cml0ZV9mcmFtZShhdnMyX2RlYywKKwkJCQlhdnMyX2RlYy0+b3V0cHJpbnQuc3Rkb3V0ZGF0YVtwb3NdLnRyKTsKKwkJCX0KKyNlbmRpZgorCQkJZGVsZXRlX3RyYnVmZmVyKCZhdnMyX2RlYy0+b3V0cHJpbnQsIHBvcyk7CisJCX0KKworCX0KKworI2Vsc2UKKwkjZXJyb3IgIiEhIVJEMTYwX0ZJWF9CRyBzaG91bGQgYmUgZGVmaW5lZCIKKwlpZiAoaW1nLT5jb2Rpbmdfb3JkZXIgKworCQkodWludDMyX3QpaGMtPnRvdGFsX2ZyYW1lcyAqIDI1NiA+PQorCQkodWludDMyX3QpaGQtPnBpY3R1cmVfcmVvcmRlcl9kZWxheSkgeworCQlpbnQzMl90IHRtcF9taW4sIHBvcyA9IC0xOworCQl0bXBfbWluID0gMSA8PCAyMDsKKworCQlmb3IgKGkgPSAwOyBpIDwKKwkJCWF2czJfZGVjLT5vdXRwcmludC5idWZmZXJfbnVtOyBpKyspIHsKKwkJCWlmIChhdnMyX2RlYy0+b3V0cHJpbnQuc3Rkb3V0ZGF0YVtpXS50cgorCQkJCTwgdG1wX21pbiAmJgorCQkJCWF2czJfZGVjLT5vdXRwcmludC5zdGRvdXRkYXRhW2ldLnRyCisJCQkJPj0gaGQtPmxhc3Rfb3V0cHV0KSB7CisJCQkJLypHQiBoYXMgdGhlIHNhbWUgInRyIiB3aXRoICJsYXN0X291dHB1dCIqLworCQkJCXBvcyA9IGk7CisJCQkJdG1wX21pbiA9CisJCQkJYXZzMl9kZWMtPm91dHByaW50LnN0ZG91dGRhdGFbaV0udHI7CisJCQl9CisJCX0KKworCQlpZiAocG9zICE9IC0xKSB7CisJCQloZC0+bGFzdF9vdXRwdXQgPSBhdnMyX2RlYy0+b3V0cHJpbnQuc3Rkb3V0ZGF0YVtwb3NdLnRyOworCQkJcmVwb3J0X2ZyYW1lKGF2czJfZGVjLCAmYXZzMl9kZWMtPm91dHByaW50LCBwb3MpOworI2lmIFJEMTUwMV9GSVhfQkcKKwkJCWlmIChhdnMyX2RlYy0+b3V0cHJpbnQuc3Rkb3V0ZGF0YVtwb3NdLnR5cGViCisJCQkJPT0gQkFDS0dST1VORF9JTUcgJiYgYXZzMl9kZWMtPgorCQkJCW91dHByaW50LnN0ZG91dGRhdGFbcG9zXS4KKwkJCQliYWNrZ3JvdW5kX3BpY3R1cmVfb3V0cHV0X2ZsYWcgPT0gMCkgeworI2Vsc2UKKwkJCQlpZiAoYXZzMl9kZWMtPm91dHByaW50LnN0ZG91dGRhdGFbcG9zXS50eXBlYgorCQkJCQk9PSBCQUNLR1JPVU5EX0lNRyAmJgorCQkJCQloZC0+YmFja2dyb3VuZF9waWN0dXJlX291dHB1dF9mbGFnCisJCQkJCT09IDApIHsKKyNlbmRpZgorCQkJCQl3cml0ZV9HQl9mcmFtZSgKKwkJCQkJCWhkLT5wX291dF9iYWNrZ3JvdW5kKTsKKwkJCQl9IGVsc2UgeworCQkJCQl3cml0ZV9mcmFtZShhdnMyX2RlYywKKwkJCQkJYXZzMl9kZWMtPm91dHByaW50LnN0ZG91dGRhdGFbcG9zXS50cik7CisJCQkJfQorCQkJCWRlbGV0ZV90cmJ1ZmZlcigmYXZzMl9kZWMtPm91dHByaW50LCBwb3MpOworCisJCQl9CisKKwkJfQorI2VuZGlmCisjZW5kaWYKKwlyZXR1cm4gcG9zOworCisJfQorCit2b2lkIHdyaXRlX2ZyYW1lKHN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjLCBpbnQzMl90IHBvcykKK3sKKwlpbnQzMl90IGo7CisKKwlpZiAoaXNfYXZzMl9wcmludF9idWZtZ3JfZGV0YWlsKCkpCisJCXByX2luZm8oIiVzKHBvcyA9ICVkKVxuIiwgX19mdW5jX18sIHBvcyk7CisKKwlmb3IgKGogPSAwOyBqIDwgYXZzMl9kZWMtPnJlZl9tYXhidWZmZXI7IGorKykgeworCQlpZiAoYXZzMl9kZWMtPmZyZWZbal0tPmltZ3RyX2Z3UmVmRGlzdGFuY2UgPT0gcG9zKSB7CisJCQlhdnMyX2RlYy0+ZnJlZltqXS0+aW1ndHJfZndSZWZEaXN0YW5jZV9iYWsgPSBwb3M7CisJCQlhdnMyX2RlYy0+ZnJlZltqXS0+aXNfb3V0cHV0ID0gLTE7CisJCQlhdnMyX2RlYy0+ZnJlZltqXS0+dG9fcHJlcGFyZV9kaXNwID0KKwkJCQlhdnMyX2RlYy0+dG9fcHJlcGFyZV9kaXNwX2NvdW50Kys7CisJCQlpZiAoYXZzMl9kZWMtPmZyZWZbal0tPnJlZmVyZWRfYnlfb3RoZXJzID09IDAKKwkJCQl8fCBhdnMyX2RlYy0+ZnJlZltqXS0+aW1nY29pX3JlZgorCQkJCT09IC0yNTcpIHsKKwkJCQlhdnMyX2RlYy0+ZnJlZltqXS0+aW1ndHJfZndSZWZEaXN0YW5jZQorCQkJCQk9IC0yNTY7CisJCQkJYXZzMl9kZWMtPmZyZWZbal0tPmltZ2NvaV9yZWYgPSAtMjU3OworI2lmIE0zNDgwX1RFTVBPUkFMX1NDQUxBQkxFCisJCQkJYXZzMl9kZWMtPmZyZWZbal0tPnRlbXBvcmFsX2lkID0gLTE7CisjZW5kaWYKKwkJCQlpZiAoaXNfYXZzMl9wcmludF9idWZtZ3JfZGV0YWlsKCkpCisJCQkJCXByX2luZm8oIiVzLCBmcmVmIGluZGV4ICVkXG4iLAorCQkJCQkJIF9fZnVuY19fLCBqKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKnJhaW4/Pz8sIG91dGRhdGEgKmRhdGEqLwordm9pZCByZXBvcnRfZnJhbWUoc3RydWN0IGF2czJfZGVjb2RlciAqYXZzMl9kZWMsCisJc3RydWN0IG91dGRhdGFfcyAqZGF0YSwgaW50MzJfdCBwb3MpCit7CisJc3RydWN0IEltYWdlUGFyYW1ldGVyc19zICAgICppbWcgPSAmYXZzMl9kZWMtPmltZzsKKwlzdHJ1Y3QgVmlkZW9fQ29tX2RhdGFfcyAqaGMgPSAmYXZzMl9kZWMtPmhjOworCXN0cnVjdCBWaWRlb19EZWNfZGF0YV9zICpoZCA9ICZhdnMyX2RlYy0+aGQ7CisKKwlpbnQ4X3QgKkZybWZsZDsKKwlpbnQ4X3QgRnJtW10gPSAiRlJNIjsKKwlpbnQ4X3QgRmxkW10gPSAiRkxEIjsKKwlzdHJ1Y3QgU1RET1VUX0RBVEFfcyAqcF9zdGRvdXRkYXRhCisJPSAmZGF0YS0+c3Rkb3V0ZGF0YVtwb3NdOworCWNvbnN0IGludDhfdCAqdHlwOworCisjaWYgMAorCWlmIChpbnB1dC0+TUQ1RW5hYmxlICYgMHgwMikgeworCQlzcHJpbnRmKE1ENXN0ciwgIiUwOFglMDhYJTA4WCUwOFhcMCIsCisJCQkJcF9zdGRvdXRkYXRhLT5EZWNNRDVWYWx1ZVswXSwKKwkJCQlwX3N0ZG91dGRhdGEtPkRlY01ENVZhbHVlWzFdLAorCQkJCXBfc3Rkb3V0ZGF0YS0+RGVjTUQ1VmFsdWVbMl0sCisJCQkJcF9zdGRvdXRkYXRhLT5EZWNNRDVWYWx1ZVszXSk7CisJfSBlbHNlIHsKKwkJbWVtc2V0KE1ENXZhbCwgMCwgMTYpOworCQltZW1zZXQoTUQ1c3RyLCAwLCAzMyk7CisJfQorI2VuZGlmCisKKwlpZiAocF9zdGRvdXRkYXRhLT4KKwkJcGljdHVyZV9zdHJ1Y3R1cmUpIHsKKwkJRnJtZmxkID0gRnJtOworCX0gZWxzZSB7CisJCUZybWZsZCA9IEZsZDsKKwl9CisjaWYgSU5URVJMQUNFX0NPRElORworCWlmIChpbWctPmlzX2ZpZWxkX3NlcXVlbmNlKSB7IC8qcmNzPz8qLworCQlGcm1mbGQgPSBGbGQ7CisJfQorI2VuZGlmCisJaWYgKChwX3N0ZG91dGRhdGEtPnRyICsgaGMtPnRvdGFsX2ZyYW1lcyAqIDI1NikKKwkgICAgPT0gaGQtPmVuZF9TZXFUcikgeyAgIC8qIEkgcGljdHVyZSovCisJCS8qaWYgKCBpbWctPm5ld19zZXF1ZW5jZV9mbGFnID09IDEgKSovCisJCXsKKwkJCWltZy0+c2VxdWVuY2VfZW5kX2ZsYWcgPSAwOworCQkJLypmcHJpbnRmKHN0ZG91dCwgIlNlcXVlbmNlCisJCQkgIEVuZFxuXG4iKTsqLworCQl9CisJfQorCWlmICgocF9zdGRvdXRkYXRhLT50ciArIGhjLT50b3RhbF9mcmFtZXMgKiAyNTYpCisJCT09IGhkLT5uZXh0X0lEUnRyKSB7CisjaWYgIVJEMTcwX0ZJWF9CRworCQlpZiAoaGQtPnZlY19mbGFnKSAvKiovCisjZW5kaWYKKwkJeworCQkJaGQtPnZlY19mbGFnID0gMDsKKwkJCS8qZnByaW50ZihzdGRvdXQsICJWaWRlbyBFZGl0CisJCQkgIENvZGVcbiIpOyovCisJCX0KKwl9CisKKwlpZiAocF9zdGRvdXRkYXRhLT50eXBlYiA9PSBCQUNLR1JPVU5EX0lNRykgeworCQl0eXAgPSAoaGQtPmJhY2tncm91bmRfcGljdHVyZV9vdXRwdXRfZmxhZyAhPSAwKSA/ICJHIiA6ICJHQiI7CisJfSBlbHNlIHsKKyNpZiBSRU1PVkVfVU5VU0VECisJCXR5cCA9IChwX3N0ZG91dGRhdGEtPnR5cGUgPT0gSU5UUkFfSU1HKQorCQkJPyAiSSIgOiAocF9zdGRvdXRkYXRhLT50eXBlID09IElOVEVSX0lNRykgPworCQkJKChwX3N0ZG91dGRhdGEtPnR5cGViID09IEJQX0lNRykgPyAiUyIgOiAiUCIpCisJCQk6IChwX3N0ZG91dGRhdGEtPnR5cGUgPT0gRl9JTUcgPyAiRiIgOiAiQiIpOworI2Vsc2UKKwkJdHlwID0gKHBfc3Rkb3V0ZGF0YS0+dHlwZSA9PSBJTlRSQV9JTUcpID8gIkkiIDoKKwkJCShwX3N0ZG91dGRhdGEtPnR5cGUgPT0gSU5URVJfSU1HKSA/CisJCQkoKHBfc3Rkb3V0ZGF0YS0+dHlwZSA9PSBCUF9JTUcpID8gIlMiIDogIlAiKQorCQkJOiAocF9zdGRvdXRkYXRhLT50eXBlID09IEZfSU1HID8gIkYiIDogIkIiKTsKKyNlbmRpZgorCX0KKworI2lmIDAKKwkvKnJhaW4/Pz8qLworCXByX2luZm8oIiUzZCglcykgICUzZCAlNWQgJTcuNGYgJTcuNGYgJTcuNGYgJTVkXHRcdCVzICU4ZCAlNmRcdCVzIiwKKwkJCXBfc3Rkb3V0ZGF0YS0+ZnJhbWVudW0gKyBoYy0+dG90YWxfZnJhbWVzICogMjU2LAorCQkJdHlwLCBwX3N0ZG91dGRhdGEtPnRyICsgaGMtPnRvdGFsX2ZyYW1lcyAqIDI1NiwKKwkJCXBfc3Rkb3V0ZGF0YS0+cXAsIHBfc3Rkb3V0ZGF0YS0+c25yX3ksCisJCQlwX3N0ZG91dGRhdGEtPnNucl91LCBwX3N0ZG91dGRhdGEtPnNucl92LAorCQkJcF9zdGRvdXRkYXRhLT50bXBfdGltZSwgRnJtZmxkLAorCQkJcF9zdGRvdXRkYXRhLT5jdXJyX2ZyYW1lX2JpdHMsCisJCQlwX3N0ZG91dGRhdGEtPmVtdWxhdGVfYml0cywKKwkJCSIiKTsKKyNlbmRpZgorCWlmIChpc19hdnMyX3ByaW50X2J1Zm1ncl9kZXRhaWwoKSkKKwkJcHJfaW5mbygiICVzXG4iLCBwX3N0ZG91dGRhdGEtPnN0cl9yZWZlcmVuY2VfbGlzdCk7CisKKwkvKmZmbHVzaChzdGRvdXQpOyovCisJaGQtPkZyYW1lTnVtKys7Cit9CisKK3ZvaWQgYXZzMl9wcmVwYXJlX2hlYWRlcihzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYywgaW50MzJfdCBzdGFydF9jb2RlKQoreworCXN0cnVjdCBJbWFnZVBhcmFtZXRlcnNfcyAgICAqaW1nID0gJmF2czJfZGVjLT5pbWc7CisJc3RydWN0IFZpZGVvX0RlY19kYXRhX3MgKmhkID0gJmF2czJfZGVjLT5oZDsKKworCXN3aXRjaCAoc3RhcnRfY29kZSkgeworCWNhc2UgU0VRVUVOQ0VfSEVBREVSX0NPREU6CisJCWltZy0+bmV3X3NlcXVlbmNlX2ZsYWcgPSAxOworCQlpZiAoaXNfYXZzMl9wcmludF9idWZtZ3JfZGV0YWlsKCkpCisJCQlwcl9pbmZvKCJTRVFVRU5DRVxuIik7CisjaWZkZWYgVE9fQ0hFQ0sKKyNpZiBTRVFfQ0hBTkdFX0NIRUNLRVIKKwkJaWYgKHNlcV9jaGVja2VyX2J1ZiA9PSBOVUxMKSB7CisJCQlzZXFfY2hlY2tlcl9idWYgPSBtYWxsb2MobGVuZ3RoKTsKKwkJCXNlcV9jaGVja2VyX2xlbmd0aCA9IGxlbmd0aDsKKwkJCW1lbWNweShzZXFfY2hlY2tlcl9idWYsIEJ1ZiwgbGVuZ3RoKTsKKwkJfSBlbHNlIHsKKwkJCWlmICgoc2VxX2NoZWNrZXJfbGVuZ3RoICE9IGxlbmd0aCkgfHwKKwkJCQkobWVtY21wKHNlcV9jaGVja2VyX2J1ZiwgQnVmLCBsZW5ndGgpICE9IDApKSB7CisJCQkJZnJlZShzZXFfY2hlY2tlcl9idWYpOworCQkJCS8qZnByaW50ZihzdGRvdXQsCisJCQkJICAiTm9uLWNvbmZvcm1hbmNlCisJCQkJICBzdHJlYW06IHNlcXVlbmNlCisJCQkJICBoZWFkZXIgY2Fubm90IGNoYW5nZQorCQkJCSAgISFcbiIpOyovCisjaWYgUkQxNzBfRklYX0JHCisJCQkJc2VxX2NoZWNrZXJfYnVmID0gTlVMTDsKKwkJCQlzZXFfY2hlY2tlcl9sZW5ndGggPSAwOworCQkJCXNlcV9jaGVja2VyX2J1ZiA9IG1hbGxvYyhsZW5ndGgpOworCQkJCXNlcV9jaGVja2VyX2xlbmd0aCA9IGxlbmd0aDsKKwkJCQltZW1jcHkoc2VxX2NoZWNrZXJfYnVmLCBCdWYsIGxlbmd0aCk7CisjZW5kaWYKKwkJCX0KKworCisJCX0KKyNlbmRpZgorI2lmIFJEMTcwX0ZJWF9CRworCQlpZiAoaW5wdXQtPmFsZl9lbmFibGUKKwkJCSYmIGFsZlBhckFsbGNvYXRlZCA9PSAxKSB7CisJCQlSZWxlYXNlQWxmR2xvYmFsQnVmZmVyKCk7CisJCQlhbGZQYXJBbGxjb2F0ZWQgPSAwOworCQl9CisjZW5kaWYKKy8qVE9fQ0hFQ0sqLworI2VuZGlmCisjaWYgRklYX0ZMVVNIX0RQQl9CWV9MRgorCQlpZiAoaGQtPnZlY19mbGFnKSB7CisJCQlpbnQzMl90IGs7CisJCQlpZiAoaXNfYXZzMl9wcmludF9idWZtZ3JfZGV0YWlsKCkpCisJCQkJcHJfaW5mbygidmVjX2ZsYWcgaXMgMSwgZmx1c2hEUEIgYW5kIHJlaW5pdCBidWdtZ3JcbiIpOworCisJCQlmbHVzaERQQihhdnMyX2RlYyk7CisJCQlmb3IgKGsgPSAwOyBrIDwgYXZzMl9kZWMtPnJlZl9tYXhidWZmZXI7IGsrKykKKwkJCQljbGVhblJlZk1WQnVmUmVmKGspOworCisJCQloZC0+dmVjX2ZsYWcgPSAwOworI2lmZGVmIEFNTAorCQkJZnJlZV91bnVzZWRfYnVmZmVycyhhdnMyX2RlYyk7CisjZWxzZQorCQkJZnJlZV9nbG9iYWxfYnVmZmVycyhhdnMyX2RlYyk7CisjZW5kaWYKKwkJCWltZy0+bnVtYmVyID0gMDsKKwkJCWltZy0+UHJldlBpY0Rpc3RhbmNlTHNiID0gMDsKKwkJCWF2czJfZGVjLT5pbml0X2h3X2ZsYWcgPSAwOworCQl9CisjZW5kaWYKKworI2lmIEZJWF9TRVFfRU5EX0ZMVVNIX0RQQl9CWV9MRgorCQlpZiAoaW1nLT5uZXdfc2VxdWVuY2VfZmxhZworCQkJJiYgaW1nLT5zZXF1ZW5jZV9lbmRfZmxhZykgeworCQkJaW50MzJfdCBrOworCQkJaWYgKGlzX2F2czJfcHJpbnRfYnVmbWdyX2RldGFpbCgpKQorCQkJCXByX2luZm8oCisJCQkJIm5ld19zZXF1ZW5jZV9mbGFnIGFmdGVyIHNlcXVlbmNlX2VuZF9mbGFnLCBmbHVzaERQQiBhbmQgcmVpbml0IGJ1Z21nclxuIik7CisJCQlmbHVzaERQQihhdnMyX2RlYyk7CisJCQlmb3IgKGsgPSAwOyBrIDwgYXZzMl9kZWMtPnJlZl9tYXhidWZmZXI7IGsrKykKKwkJCQljbGVhblJlZk1WQnVmUmVmKGspOworCisjaWZkZWYgQU1MCisJCQlmcmVlX3VudXNlZF9idWZmZXJzKGF2czJfZGVjKTsKKyNlbHNlCisJCQlmcmVlX2dsb2JhbF9idWZmZXJzKGF2czJfZGVjKTsKKyNlbmRpZgorCQkJaW1nLT5udW1iZXIgPSAwOworCQkJaW1nLT5QcmV2UGljRGlzdGFuY2VMc2IgPSAwOworCQkJYXZzMl9kZWMtPmluaXRfaHdfZmxhZyA9IDA7CisJCX0KKyNlbmRpZgorCQlpbWctPnNlcV9oZWFkZXJfaW5kaWNhdGUgPSAxOworCQlicmVhazsKKwljYXNlIElfUElDVFVSRV9TVEFSVF9DT0RFOgorCQlpZiAoaXNfYXZzMl9wcmludF9idWZtZ3JfZGV0YWlsKCkpCisJCQlwcl9pbmZvKCJQSUMtSVxuIik7CisJCUdldF9TZXF1ZW5jZUhlYWRlcihhdnMyX2RlYyk7CisJCUdldF9JX1BpY3R1cmVfSGVhZGVyKGF2czJfZGVjKTsKKwkJY2FsY19waWN0dXJlX2Rpc3RhbmNlKGF2czJfZGVjKTsKKwkJUmVhZF9BTEZfcGFyYW0oYXZzMl9kZWMpOworCQlpZiAoIWltZy0+c2VxX2hlYWRlcl9pbmRpY2F0ZSkgeworCQkJaW1nLT5CX2Rpc2NhcmRfZmxhZyA9IDE7CisJCQkvKmZwcmludGYoc3Rkb3V0LCAiICAgIEkKKwkJCSAgJTNkXHRcdERJRFNDQVJEISFcbiIsCisJCQkgIGltZy0+dHIpOyovCisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIFBCX1BJQ1RVUkVfU1RBUlRfQ09ERToKKwkJaWYgKGlzX2F2czJfcHJpbnRfYnVmbWdyX2RldGFpbCgpKQorCQkJcHJfaW5mbygiUElDLVBCXG4iKTsKKwkJR2V0X1NlcXVlbmNlSGVhZGVyKGF2czJfZGVjKTsKKwkJR2V0X1BCX1BpY3R1cmVfSGVhZGVyKGF2czJfZGVjKTsKKwkJY2FsY19waWN0dXJlX2Rpc3RhbmNlKGF2czJfZGVjKTsKKwkJUmVhZF9BTEZfcGFyYW0oYXZzMl9kZWMpOworCQkvKiB4aWFvemhlbiB6aGVuZywgMjAwNzEwMDkqLworCQlpZiAoIWltZy0+c2VxX2hlYWRlcl9pbmRpY2F0ZSkgeworCQkJaW1nLT5CX2Rpc2NhcmRfZmxhZyA9IDE7CisKKwkJCWlmIChpbWctPnR5cGUgPT0gUF9JTUcpIHsKKwkJCQkvKmZwcmludGYoc3Rkb3V0LCAiICAgIFAKKwkJCQkgICUzZFx0XHRESURTQ0FSRCEhXG4iLAorCQkJCSAgaW1nLT50cik7Ki8KKwkJCX0KKwkJCWlmIChpbWctPnR5cGUgPT0gRl9JTUcpIHsKKwkJCQkvKmZwcmludGYoc3Rkb3V0LCAiICAgIEYKKwkJCQkgICUzZFx0XHRESURTQ0FSRCEhXG4iLAorCQkJCSAgaW1nLT50cik7Ki8KKwkJCX0gZWxzZSB7CisJCQkJLypmcHJpbnRmKHN0ZG91dCwgIiAgICBCCisJCQkJICAlM2RcdFx0RElEU0NBUkQhIVxuIiwKKwkJCQkgIGltZy0+dHIpOyovCisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGltZy0+c2VxX2hlYWRlcl9pbmRpY2F0ZSA9PSAxCisJCQkmJiBpbWctPnR5cGUgIT0gQl9JTUcpIHsKKwkJCWltZy0+Ql9kaXNjYXJkX2ZsYWcgPSAwOworCQl9CisJCWlmIChpbWctPnR5cGUgPT0gQl9JTUcgJiYgaW1nLT5CX2Rpc2NhcmRfZmxhZyA9PSAxCisJCQkmJiAhaW1nLT5yYW5kb21fYWNjZXNzX2RlY29kYWJsZV9mbGFnKSB7CisJCQkvKmZwcmludGYoc3Rkb3V0LCAiICAgIEIKKwkJCSAgJTNkXHRcdERJRFNDQVJEISFcbiIsCisJCQkgIGltZy0+dHIpOyovCisJCQlicmVhazsKKwkJfQorCisJCWJyZWFrOworCWNhc2UgU0VRVUVOQ0VfRU5EX0NPREU6CisJCWlmIChpc19hdnMyX3ByaW50X2J1Zm1ncl9kZXRhaWwoKSkKKwkJCXByX2luZm8oIlNFUVVFTkNFX0VORF9DT0RFXG4iKTsKKyNpZmRlZiBUT19DSEVDSworI2lmIFNFUV9DSEFOR0VfQ0hFQ0tFUgorCQlpZiAoc2VxX2NoZWNrZXJfYnVmICE9IE5VTEwpIHsKKwkJCWZyZWUoc2VxX2NoZWNrZXJfYnVmKTsKKwkJCXNlcV9jaGVja2VyX2J1ZiA9IE5VTEw7CisJCQlzZXFfY2hlY2tlcl9sZW5ndGggPSAwOworCQl9CisjZW5kaWYKKyNlbmRpZgoraW1nLT5uZXdfc2VxdWVuY2VfZmxhZyA9IDE7CitpbWctPnNlcXVlbmNlX2VuZF9mbGFnID0gMTsKK2JyZWFrOworCWNhc2UgVklERU9fRURJVF9DT0RFOgorCQlpZiAoaXNfYXZzMl9wcmludF9idWZtZ3JfZGV0YWlsKCkpCisJCQlwcl9pbmZvKCJWSURFT19FRElUX0NPREVcbiIpOworCQkvKnZpZGVvX2VkaXRfY29kZV9kYXRhKEJ1Ziwgc3RhcnRjb2RlcG9zLCBsZW5ndGgpOyovCisJCWhkLT52ZWNfZmxhZyA9IDE7CisjaWZkZWYgVE9fQ0hFQ0sKKyNpZiBTRVFfQ0hBTkdFX0NIRUNLRVIKKwkJaWYgKHNlcV9jaGVja2VyX2J1ZiAhPSBOVUxMKSB7CisJCQlmcmVlKHNlcV9jaGVja2VyX2J1Zik7CisJCQlzZXFfY2hlY2tlcl9idWYgPSBOVUxMOworCQkJc2VxX2NoZWNrZXJfbGVuZ3RoID0gMDsKKwkJfQorI2VuZGlmCisjZW5kaWYKKworYnJlYWs7CisJfQorfQorCisjaWZkZWYgQU1MCitzdGF0aWMgdWludDMyX3QgbG9nMmkodWludDMyX3QgdmFsKQoreworCXVpbnQzMl90IHJldCA9IC0xOworCXdoaWxlICh2YWwgIT0gMCkgeworCQl2YWwgPj49IDE7CisJCXJldCsrOworCX0KKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKK2ludDMyX3QgYXZzMl9wcm9jZXNzX2hlYWRlcihzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYykKK3sKKwlzdHJ1Y3QgaW5wX3BhciAgICAqaW5wdXQgPSAmYXZzMl9kZWMtPmlucHV0OworCXN0cnVjdCBJbWFnZVBhcmFtZXRlcnNfcyAgICAqaW1nID0gJmF2czJfZGVjLT5pbWc7CisJc3RydWN0IFZpZGVvX0RlY19kYXRhX3MgKmhkID0gJmF2czJfZGVjLT5oZDsKKwlpbnQzMl90IGxjdV94X251bV9kaXY7CisJaW50MzJfdCBsY3VfeV9udW1fZGl2OworCisJaW50MzJfdCBOOF9TaXplU2NhbGU7CisJLypwcl9pbmZvKCIlc1xuIiwgX19mdW5jX18pOyovCisJeworCQlOOF9TaXplU2NhbGUgPSAxOworCisJCWlmIChoZC0+aG9yaXpvbnRhbF9zaXplICUKKwkJCShNSU5fQ1VfU0laRSAqIE44X1NpemVTY2FsZSkgIT0gMCkgeworCQkJaW1nLT5hdXRvX2Nyb3BfcmlnaHQgPQorCQkJCShNSU5fQ1VfU0laRSAqIE44X1NpemVTY2FsZSkgLQorCQkJCShoZC0+aG9yaXpvbnRhbF9zaXplICUKKwkJCQkoTUlOX0NVX1NJWkUgKiBOOF9TaXplU2NhbGUpKTsKKwkJfSBlbHNlCisJCQlpbWctPmF1dG9fY3JvcF9yaWdodCA9IDA7CisKKyNpZiAhSU5URVJMQUNFX0NPRElORworCQlpZiAoaGQtPnByb2dyZXNzaXZlX3NlcXVlbmNlKSAvKiovCisjZW5kaWYKKwkJeworCQkJaWYgKGhkLT52ZXJ0aWNhbF9zaXplICUKKwkJCQkoTUlOX0NVX1NJWkUgKiBOOF9TaXplU2NhbGUpICE9IDApIHsKKwkJCQlpbWctPmF1dG9fY3JvcF9ib3R0b20gPQorCQkJCShNSU5fQ1VfU0laRSAqIE44X1NpemVTY2FsZSkgLQorCQkJCShoZC0+dmVydGljYWxfc2l6ZSAlCisJCQkJKE1JTl9DVV9TSVpFICogTjhfU2l6ZVNjYWxlKSk7CisJCQl9IGVsc2UKKwkJCQlpbWctPmF1dG9fY3JvcF9ib3R0b20gPSAwOworCQl9CisKKwkJLyogUmVpbml0IHBhcmFtZXRlcnMgKE5PVEU6IG5lZWQgdG8gZG8KKwkJICBiZWZvcmUgaW5pdF9mcmFtZSAvLyovCisJCWltZy0+d2lkdGggICAgICAgICAgPQorCQkJKGhkLT5ob3Jpem9udGFsX3NpemUgKyBpbWctPmF1dG9fY3JvcF9yaWdodCk7CisJCWltZy0+aGVpZ2h0ICAgICAgICAgPQorCQkJKGhkLT52ZXJ0aWNhbF9zaXplICsgaW1nLT5hdXRvX2Nyb3BfYm90dG9tKTsKKwkJaW1nLT53aWR0aF9jciAgICAgICA9IChpbWctPndpZHRoID4+IDEpOworCisJCWlmIChpbnB1dC0+Y2hyb21hX2Zvcm1hdCA9PSAxKQorCQkJaW1nLT5oZWlnaHRfY3IgICAgICA9IChpbWctPmhlaWdodCA+PiAxKTsKKworCQlpbWctPlBpY1dpZHRoSW5NYnMgID0gaW1nLT53aWR0aCAvIE1JTl9DVV9TSVpFOworCQlpbWctPlBpY0hlaWdodEluTWJzID0gaW1nLT5oZWlnaHQgLyBNSU5fQ1VfU0laRTsKKwkJaW1nLT5QaWNTaXplSW5NYnMgICA9IGltZy0+UGljV2lkdGhJbk1icyAqIGltZy0+UGljSGVpZ2h0SW5NYnM7CisJCWltZy0+bWF4X21iX25yICAgICAgPSAoaW1nLT53aWR0aCAqIGltZy0+aGVpZ2h0KSAvCisJCQkoTUlOX0NVX1NJWkUgKiBNSU5fQ1VfU0laRSk7CisJfQorCisJaWYgKGltZy0+bmV3X3NlcXVlbmNlX2ZsYWcgJiYgaW1nLT5zZXF1ZW5jZV9lbmRfZmxhZykgeworI2lmIDAvKlJEMTcwX0ZJWF9CRyAvLyovCisJCWludDMyX3QgazsKKwkJZmx1c2hEUEIoKTsKKwkJZm9yIChrID0gMDsgayA8IGF2czJfZGVjLT5yZWZfbWF4YnVmZmVyOyBrKyspCisJCQljbGVhblJlZk1WQnVmUmVmKGspOworCisJCWZyZWVfZ2xvYmFsX2J1ZmZlcnMoKTsKKwkJaW1nLT5udW1iZXIgPSAwOworI2VuZGlmCisJCWhkLT5lbmRfU2VxVHIgPSBpbWctPnRyOworCQlpbWctPnNlcXVlbmNlX2VuZF9mbGFnID0gMDsKKwl9CisJaWYgKGltZy0+bmV3X3NlcXVlbmNlX2ZsYWcpIHsKKwkJaGQtPm5leHRfSURSdHIgPSBpbWctPnRyOworCQloZC0+bmV4dF9JRFJjb2kgPSBpbWctPmNvZGluZ19vcmRlcjsKKwkJaW1nLT5uZXdfc2VxdWVuY2VfZmxhZyA9IDA7CisJfQorI2lmIDAvKlJEMTcwX0ZJWF9CRyovCisJaWYgKGhkLT52ZWNfZmxhZykgeworCQlpbnQzMl90IGs7CisJCWZsdXNoRFBCKCk7CisJCWZvciAoayA9IDA7IGsgPCBhdnMyX2RlYy0+cmVmX21heGJ1ZmZlcjsgaysrKQorCQkJY2xlYW5SZWZNVkJ1ZlJlZihrKTsKKworCQloZC0+dmVjX2ZsYWcgPSAwOworCQlmcmVlX2dsb2JhbF9idWZmZXJzKCk7CisJCWltZy0+bnVtYmVyID0gMDsKKwl9CisjZW5kaWYKKy8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgZnJhbWUgYnVmZmVycyovCisjaWYgMAorLyogY2FsbGVkIGluIHZhdnMyLmMqLworCWlmIChpbWctPm51bWJlciA9PSAwKQorCQlhdnMyX2luaXRfZ2xvYmFsX2J1ZmZlcnMoYXZzMl9kZWMpOworI2VuZGlmCisJaW1nLT5jdXJyZW50X21iX25yID0gMDsKKworCWluaXRfZnJhbWUoYXZzMl9kZWMpOworCisJaW1nLT50eXBlcyA9IGltZy0+dHlwZTsgICAvKiBqbHpoZW5nIDcuMTUqLworCisJaWYgKGltZy0+dHlwZSAhPSBCX0lNRykgeworCQloZC0+cHJlX2ltZ190eXBlID0gaW1nLT50eXBlOworCQloZC0+cHJlX2ltZ190eXBlcyA9IGltZy0+dHlwZXM7CisJfQorCisjaWZkZWYgQU1MCisJYXZzMl9kZWMtPmxjdV9zaXplX2xvZzIgPSBsb2cyaShhdnMyX2RlYy0+bGN1X3NpemUpOworCWxjdV94X251bV9kaXYgPSAoaW1nLT53aWR0aC9hdnMyX2RlYy0+bGN1X3NpemUpOworCWxjdV95X251bV9kaXYgPSAoaW1nLT5oZWlnaHQvYXZzMl9kZWMtPmxjdV9zaXplKTsKKwlhdnMyX2RlYy0+bGN1X3hfbnVtID0gKChpbWctPndpZHRoICUgYXZzMl9kZWMtPmxjdV9zaXplKSA9PSAwKSA/CisJCWxjdV94X251bV9kaXYgOiBsY3VfeF9udW1fZGl2KzE7CisJYXZzMl9kZWMtPmxjdV95X251bSA9ICgoaW1nLT5oZWlnaHQgJSBhdnMyX2RlYy0+bGN1X3NpemUpID09IDApID8KKwkJbGN1X3lfbnVtX2RpdiA6IGxjdV95X251bV9kaXYrMTsKKwlhdnMyX2RlYy0+bGN1X3RvdGFsID0gYXZzMl9kZWMtPmxjdV94X251bSphdnMyX2RlYy0+bGN1X3lfbnVtOworI2VuZGlmCisJcmV0dXJuIFNPUDsKK30KKworaW50IGF2czJfcG9zdF9wcm9jZXNzKHN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjKQoreworCXN0cnVjdCBJbWFnZVBhcmFtZXRlcnNfcyAgICAqaW1nID0gJmF2czJfZGVjLT5pbWc7CisJc3RydWN0IFZpZGVvX0NvbV9kYXRhX3MgKmhjID0gJmF2czJfZGVjLT5oYzsKKwlzdHJ1Y3QgVmlkZW9fRGVjX2RhdGFfcyAqaGQgPSAmYXZzMl9kZWMtPmhkOworCWludDMyX3QgaTsKKwlpbnQgcmV0OworCWlmIChpbWctPnR5cGViID09IEJBQ0tHUk9VTkRfSU1HICYmIGhkLT5iYWNrZ3JvdW5kX3BpY3R1cmVfZW5hYmxlKSB7CisjaWZkZWYgQU1MCisJCWZvciAoaSA9IDA7IGkgPCBhdnMyX2RlYy0+cmVmX21heGJ1ZmZlcjsgaSsrKSB7CisJCQlpZiAoYXZzMl9kZWMtPmZyZWZbaV0tPmJnX2ZsYWcgIT0gMCkgeworCQkJCWF2czJfZGVjLT5mcmVmW2ldLT5iZ19mbGFnID0gMDsKKwkJCQlpZiAoaXNfYXZzMl9wcmludF9idWZtZ3JfZGV0YWlsKCkpCisJCQkJCXByX2luZm8oCisJCQkJCSJjbGVhciBvbGQgQkFDS0dST1VORF9JTUcgZm9yIGluZGV4ICVkXHJcbiIsCisJCQkJCWF2czJfZGVjLT5mcmVmW2ldLT5pbmRleCk7CisJCQl9CisJCX0KKwkJaWYgKGlzX2F2czJfcHJpbnRfYnVmbWdyX2RldGFpbCgpKQorCQkJcHJfaW5mbygKKwkJCSJwb3N0X3Byb2Nlc3M6IHNldCBCQUNLR1JPVU5EX0lNRyBmbGFnIGZvciAlZFxyXG4iLAorCQkJaGMtPmN1cl9waWMtPmluZGV4KTsKKwkJYXZzMl9kZWMtPmZfYmcgPSBoYy0+Y3VyX3BpYzsKKwkJaGMtPmN1cl9waWMtPmJnX2ZsYWcgPSAxOworI2VuZGlmCisJfQorCisjaWYgQkNCUgorCWlmIChoZC0+YmFja2dyb3VuZF9waWN0dXJlX2VuYWJsZQorCQkmJiBoZC0+YmNicl9lbmFibGUgJiYgaW1nLT5udW1iZXIgPiAwKQorCQl1cGRhdGVCZ1JlZmVyZW5jZSgpOworI2VuZGlmCisKKwlpZiAoaW1nLT50eXBlYiA9PSBCQUNLR1JPVU5EX0lNRyAmJgorCQloZC0+YmFja2dyb3VuZF9waWN0dXJlX291dHB1dF9mbGFnID09IDApCisJCWhkLT5iYWNrZ3JvdW5kX251bWJlcisrOworCisJaWYgKGltZy0+dHlwZSA9PSBCX0lNRykgeworCQlhdnMyX2RlYy0+ZnJlZlswXS0+aW1ndHJfZndSZWZEaXN0YW5jZQorCQk9IGhkLT50cnRtcDsKKwl9CisKKwkvKiByZWNvcmQgdGhlIHJlZmVyZW5jZSBsaXN0IGluZm9ybWF0aW9uKi8KKwlnZXRfcmVmZXJlbmNlX2xpc3RfaW5mbyhhdnMyX2RlYywgYXZzMl9kZWMtPmhjLnN0cl9saXN0X3JlZmVyZW5jZSk7CisKKwkvKnByX2luZm8oIiVzXG4iLCBfX2Z1bmNfXyk7Ki8KKwlyZXQgPSBmcmFtZV9wb3N0cHJvY2Vzc2luZyhhdnMyX2RlYyk7CisKKyNpZiBGSVhfUFJPRklMRV9MRVZFTF9EUEJfUlBTXzEKKwkvKiBkZWxldGUgdGhlIGZyYW1lIHRoYXQgd2lsbCBuZXZlciBiZSB1c2VkKi8KKwl7CisJCWludDMyX3QgaSwgajsKKwkJaWYgKGlzX2F2czJfcHJpbnRfYnVmbWdyX2RldGFpbCgpKSB7CisJCQlwcl9pbmZvKAorCQkJCSIlcywgY29kaW5nX29yZGVyICVkIHRvIHJlbW92ZSAlZCBidWY6ICIsCisJCQkJX19mdW5jX18sCisJCQkJaW1nLT5jb2Rpbmdfb3JkZXIsCisJCQkJaGQtPmN1cnJfUlBTLm51bV90b19yZW1vdmUpOworCQkJZm9yIChpID0gMDsgaSA8IGhkLT5jdXJyX1JQUy5udW1fdG9fcmVtb3ZlOyBpKyspCisJCQkJcHJfaW5mbygiJWQgIiwgaGQtPmN1cnJfUlBTLnJlbW92ZV9waWNbaV0pOworCQkJcHJfaW5mbygiXG4iKTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgaGQtPmN1cnJfUlBTLm51bV90b19yZW1vdmU7IGkrKykgeworCQkJZm9yIChqID0gMDsgaiA8IGF2czJfZGVjLT5yZWZfbWF4YnVmZmVyOyBqKyspIHsKKworCQkJCWlmIChhdnMyX2RlYy0+ZnJlZltqXS0+aW1nY29pX3JlZiA+PSAtMjU2CisJCQkJCSYmIGF2czJfZGVjLT5mcmVmW2pdLT5pbWdjb2lfcmVmID09CisJCQkJCWltZy0+Y29kaW5nX29yZGVyIC0KKwkJCQkJaGQtPmN1cnJfUlBTLnJlbW92ZV9waWNbaV0pCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGogPCBhdnMyX2RlYy0+cmVmX21heGJ1ZmZlcikgeyAvKiovCisjaWYgRklYX1JQU19QSUNUVVJFX1JFTU9WRQorLyogTGFiZWwgbmV3IGZyYW1lcyBhcyAidW4tcmVmZXJlbmNlZCIgKi8KKwkJCQlhdnMyX2RlYy0+ZnJlZltqXS0+cmVmZXJlZF9ieV9vdGhlcnMgPSAwOworCisJCQkJLyogcmVtb3ZlIGZyYW1lcyB3aGljaCBoYXZlIGJlZW4gb3V0cHV0dGVkICovCisJCQkJaWYgKGF2czJfZGVjLT5mcmVmW2pdLT5pc19vdXRwdXQgPT0gLTEpIHsKKwkJCQkJYXZzMl9kZWMtPmZyZWZbal0tPgorCQkJCQlpbWd0cl9md1JlZkRpc3RhbmNlID0gLTI1NjsKKwkJCQkJYXZzMl9kZWMtPmZyZWZbal0tPmltZ2NvaV9yZWYgPSAtMjU3OworCQkJCQlhdnMyX2RlYy0+ZnJlZltqXS0+dGVtcG9yYWxfaWQgPSAtMTsKKworCQkJCX0KKyNlbHNlCisJCQkJYXZzMl9kZWMtPmZyZWZbal0tPmltZ2NvaV9yZWYgPSAtMjU3OworI2lmIE0zNDgwX1RFTVBPUkFMX1NDQUxBQkxFCisJCQkJYXZzMl9kZWMtPmZyZWZbal0tPnRlbXBvcmFsX2lkID0gLTE7CisjZW5kaWYKKwkJCQlpZiAoYXZzMl9kZWMtPmZyZWZbal0tPmlzX291dHB1dCA9PSAtMSkgeworCQkJCQlhdnMyX2RlYy0+ZnJlZltqXS0+aW1ndHJfZndSZWZEaXN0YW5jZQorCQkJCQkJPSAtMjU2OworCQkJCX0KKyNlbmRpZgorCQkJfQorCQl9CisJfQorI2VuZGlmCisKKworCS8qISBUTyAxOS4xMS4yMDAxIEtub3duIFByb2JsZW06IGZvciBpbml0X2ZyYW1lCisJICogd2UgaGF2ZSB0byBrbm93IHRoZSBwaWN0dXJlIHR5cGUgb2YgdGhlCisJICogYWN0dWFsIGZyYW1lKi8KKwkvKiEgaW4gY2FzZSB0aGUgZmlyc3Qgc2xpY2Ugb2YgdGhlIFAtRnJhbWUKKwkgKiBmb2xsb3dpbmcgdGhlIEktRnJhbWUgd2FzIGxvc3Qgd2UgZGVjb2RlIHRoaXMKKwkgKiBQLUZyYW1lIGJ1dCEgZG8gbm90IHdyaXRlIGl0IGJlY2F1c2UgaXQKKwkgKiB3YXMKKwkgKiBhc3N1bWVkIHRvIGJlIGFuIEktRnJhbWUgaW4gaW5pdF9mcmFtZS5TbyB3ZQorCSAqIGZvcmNlIHRoZSBkZWNvZGVyIHRvKi8KKwkvKiEgZ3Vlc3MgdGhlIHJpZ2h0IHBpY3R1cmUgdHlwZS4gVGhpcyBpcyBhIGhhY2sKKwkgKiBhIHNob3VsZCBiZSByZW1vdmVkIGJ5IHRoZSB0aW1lIHRoZXJlIGlzIGEKKwkgKiBjbGVhbiovCisJLyohIHNvbHV0aW9uIHdoZXJlIHdlIGRvIG5vdCBoYXZlIHRvIGtub3cgdGhlCisJICogcGljdHVyZSB0eXBlIGZvciB0aGUgZnVuY3Rpb24gaW5pdF9mcmFtZS4qLworCS8qISBFbmQgVE8gMTkuMTEuMjAwMS8vTG91Ki8KKworCXsKKwkJaWYgKGltZy0+dHlwZSA9PSBJX0lNRyB8fAorCQkJaW1nLT50eXBlID09IFBfSU1HIHx8CisJCQlpbWctPnR5cGUgPT0gRl9JTUcpCisJCQlpbWctPm51bWJlcisrOworCQllbHNlIHsKKwkJCWhjLT5CZnJhbWVfY3RyKys7ICAvKiBCCisJCQkJCSAgICAgIHBpY3R1cmVzKi8KKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGluaXRfYXZzMl9kZWNvZGVyKHN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjKQoreworCWludDMyX3QgaSwgaiwgazsKKworCXN0cnVjdCBpbnBfcGFyICAgICppbnB1dCA9ICZhdnMyX2RlYy0+aW5wdXQ7CisJc3RydWN0IEltYWdlUGFyYW1ldGVyc19zICAgICppbWcgPSAmYXZzMl9kZWMtPmltZzsKKwlzdHJ1Y3QgVmlkZW9fQ29tX2RhdGFfcyAqaGMgPSAmYXZzMl9kZWMtPmhjOworCXN0cnVjdCBWaWRlb19EZWNfZGF0YV9zICpoZCA9ICZhdnMyX2RlYy0+aGQ7CisJaWYgKGlzX2F2czJfcHJpbnRfYnVmbWdyX2RldGFpbCgpKQorCQlwcl9pbmZvKCJbdF0gc3RydWN0IGF2czJfZGVjIEAweCVwXG4iLCBhdnMyX2RlYyk7CisJbWVtc2V0KGF2czJfZGVjLCAwLCBzaXplb2Yoc3RydWN0IGF2czJfZGVjb2RlcikpOworI2lmZGVmIEFNTAorCWF2czJfZGVjLT50b19wcmVwYXJlX2Rpc3BfY291bnQgPSAxOworI2VuZGlmCisJLyoKKwkgKiBBTEZQYXJhbSBpbml0CisJICovCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlhdnMyX2RlYy0+bV9hbGZQaWN0dXJlUGFyYW1baV0uYWxmX2ZsYWcgPSAwOyAvKjEqLworCQlhdnMyX2RlYy0+bV9hbGZQaWN0dXJlUGFyYW1baV0ubnVtX2NvZWZmID0gOTsgLyoxKi8KKwkJYXZzMl9kZWMtPm1fYWxmUGljdHVyZVBhcmFtW2ldLmZpbHRlcnNfcGVyX2dyb3VwID0gMzsgIC8qMSovCisJCWF2czJfZGVjLT5tX2FsZlBpY3R1cmVQYXJhbVtpXS5jb21wb25lbnRJRCA9IGk7IC8qMSovCisJCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7CisJCQlhdnMyX2RlYy0+bV9hbGZQaWN0dXJlUGFyYW1baV0uZmlsdGVyUGF0dGVybltqXQk9IDA7CisJCQkvKjE2Ki8KKwkJfQorCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykgeworCQkJZm9yIChrID0gMDsgayA8IDk7IGsrKykgeworCQkJCWF2czJfZGVjLT4KKwkJCQltX2FsZlBpY3R1cmVQYXJhbVtpXS5jb2VmZm11bHRpW2pdW2tdID0gMDsKKwkJCQkvKjE2KjkqLworCQkJfQorCQl9CisJfQorCisJaW1nLT5zZXFfaGVhZGVyX2luZGljYXRlID0gMDsKKwlpbWctPkJfZGlzY2FyZF9mbGFnID0gMDsKKworCWhkLT5lb3MgPSAwOworCisJaWYgKGlucHV0LT5yZWZfcGljX29yZGVyKSB7ICAgLypyZWYgb3JkZXIqLworCQloZC0+ZGVjX3JlZl9udW0gPSAwOworCX0KKworCS8qCisJbWVtc2V0KGdfbG9nMnNpemUsIC0xLCBNQVhfQ1VfU0laRSArIDEpOworCWMgPSAyOworCWZvciAoayA9IDQ7IGsgPD0gTUFYX0NVX1NJWkU7IGsgKj0gMikgeworCQlnX2xvZzJzaXplW2tdID0gYzsKKwkJYysrOworCX0KKwkgKi8KKworCWF2czJfZGVjLT5vdXRwcmludC5idWZmZXJfbnVtID0gMDsKKworCWhkLT5sYXN0X291dHB1dCA9IC0xOworCWhkLT5lbmRfU2VxVHIgPSAtMTsKKwloZC0+Y3Vycl9JRFJ0ciA9IDA7CisJaGQtPmN1cnJfSURSY29pID0gMDsKKwloZC0+bmV4dF9JRFJ0ciA9IDA7CisJaGQtPm5leHRfSURSY29pID0gMDsKKwkvKiBBbGxvY2F0ZSBTbGljZSBkYXRhIHN0cnVjdCovCisJaW1nLT5udW1iZXIgPSAwOworCWltZy0+dHlwZSA9IElfSU1HOworCisJaW1nLT5pbWd0cl9uZXh0X1AgPSAwOworCisJaW1nLT5pbWdjb2lfbmV4dF9yZWYgPSAwOworCisKKwlpbWctPm51bV9vZl9yZWZlcmVuY2VzID0gMDsKKwloYy0+c2VxX2hlYWRlciA9IDA7CisKKwlpbWctPm5ld19zZXF1ZW5jZV9mbGFnICAgPSAxOworCisJaGQtPnZlY19mbGFnID0gMDsKKworCWhkLT5GcmFtZU51bSA9IDA7CisKKwkvKiBCIHBpY3R1cmVzKi8KKwloYy0+QmZyYW1lX2N0ciA9IDA7CisJaGMtPnRvdGFsX2ZyYW1lcyA9IDA7CisKKwkvKiB0aW1lIGZvciB0b3RhbCBkZWNvZGluZyBzZXNzaW9uKi8KKwloYy0+dG90X3RpbWUgPSAwOworCit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9hdnMyL2F2czJfZ2xvYmFsLmggYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvYXZzMi9hdnMyX2dsb2JhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMzVhNWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvYXZzMi9hdnMyX2dsb2JhbC5oCkBAIC0wLDAgKzEsMTY5MCBAQAorLyogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBCU0QKKyAqIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkIHBhcnR5CisgKiBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzIGFyZQorICogZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTYsIEF1ZGlvIFZpZGVvIGNvZGluZyBTdGFuZGFyZCBXb3JrZ3JvdXAgb2YgQ2hpbmEKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEF1ZGlvIFZpZGVvIGNvZGluZyBTdGFuZGFyZCBXb3JrZ3JvdXAgb2YgQ2hpbmEKKyAqICAgIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXliZQorICogICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisKKworCisvKgorICogRmlsZSBuYW1lOiBnbG9iYWwuaAorICogRnVuY3Rpb246ICBnbG9iYWwgZGVmaW5pdGlvbnMgZm9yIGZvciBBVlMgZGVjb2Rlci4KKyAqCisgKi8KKworI2lmbmRlZiBfR0xPQkFMX0hfCisjZGVmaW5lIF9HTE9CQUxfSF8KKworLyogI2luY2x1ZGUgPHN0ZGlvLmg+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8hPCBmb3IgRklMRSAqLworLyogI2luY2x1ZGUgPHN0ZGxpYi5oPiAqLworCisjZGVmaW5lIEFNTAorI2RlZmluZSBTQU5JVFlfQ0hFQ0sKKyN1bmRlZiBOT19ESVNQTEFZCisKKy8qICNpbmNsdWRlICJkZWZpbmUuaCIgKi8KKyNkZWZpbmUgUkQgICAgICAiMTkuMiIKKyNkZWZpbmUgVkVSU0lPTiAiMTkuMiIKKworI2RlZmluZSBSRVNFUlZFRF9QUk9GSUxFX0lEICAgICAgMHgyNAorI2RlZmluZSBCQVNFTElORV9QSUNUVVJFX1BST0ZJTEUgMTgKKyNkZWZpbmUgQkFTRUxJTkVfUFJPRklMRSAgICAgICAgIDMyICAvKiAweDIwICovCisjZGVmaW5lIEJBU0VMSU5FMTBfUFJPRklMRSAgICAgICAzNCAgLyogMHgyMiAqLworCisKKyNkZWZpbmUgU0NFTkVfUFJPRklMRSAgICAgICAgICAgIDQ4ICAvKiAweDIxICovCisjZGVmaW5lIFNDRU5FMTBfUFJPRklMRSAgICAgICAgICA1MCAgLyogMHgyMyAqLworCisjZGVmaW5lIFRSQUNFICAgICAgICAgICAgICAgICAgICAwIC8qICE8IDA6VHJhY2Ugb2ZmIDE6VHJhY2Ugb24gKi8KKworCisvKiBUeXBlIGRlZmluaXRpb25zIGFuZCBmaWxlIG9wZXJhdGlvbiBmb3IgV2luZG93cy9MaW51eAorICogQWxsIGZpbGUgb3BlcmF0aW9ucyBmb3Igd2luZG93cyBhcmUgcmVwbGFjZWQgd2l0aCBuYXRpdmUgKEZJTEUgKikgb3BlcmF0aW9ucworICogRmFsZWkgTFVPIChmYWxlaS5sdW9AdmlwbC5pY3QuYWMuY24pCisgKiAqLworCisjZGVmaW5lIF9GSUxFX09GRlNFVF9CSVRTIDY0ICAgICAgIC8qIGZvciA2NCBiaXQgZnNlZWtvICovCisjZGVmaW5lIGZzZWVrIGZzZWVrbworCisjZGVmaW5lIGludDE2IGludDE2X3QKKyNkZWZpbmUgaW50NjQgaW50NjRfdAorCisvKiAvLy8vLy8vLy8vLy8vLy8vLy8gYnVnIGZpeCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworI2RlZmluZSBBTEZTbGljZUZpeCAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV1JJVEVOQklUX0ZJWCAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEZJWF9QUk9GSUxFX0xFVkVMX0RQQl9SUFNfMSAgICAgICAgMQorI2RlZmluZSBGSVhfUFJPRklMRV9MRVZFTF9EUEJfUlBTXzIgICAgICAgIDEKKyNkZWZpbmUgRklYX1JQU19QSUNUVVJFX1JFTU9WRSAgICAgICAgICAgICAxICAgLyogZmxsdW9AcGt1LmVkdS5jbiAqLworI2RlZmluZSBNdl9DbGlwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAvKiB5dXF1YW5oZUBoaXNpbGljb24uY29tICovCisjZGVmaW5lIFJFTU9WRV9VTlVTRUQgICAgICAgICAgICAgICAgICAgICAgMSAgIC8qIHl1cXVhbmhlQGhpc2lsaWNvbi5jb20gKi8KKyNkZWZpbmUgU0FPX0hlaWdodF9GaXggICAgICAgICAgICAgICAgICAgICAxICAgLyogeXVxdWFuaGVAaGlzaWxpY29uLmNvbSAqLworI2RlZmluZSBCX0JBQ0tHUk9VTkRfRml4ICAgICAgICAgICAgICAgICAgIDEgICAvKiB5dXF1YW5oZUBoaXNpbGljb24uY29tICovCisjZGVmaW5lIENoZWNrX0JpdHN0cmVhbSAgICAgICAgICAgICAgICAgICAgMSAgIC8qIHl1cXVhbmhlQGhpc2lsaWNvbi5jb20gKi8KKyNkZWZpbmUgV3FfcGFyYW1fQ2xpcCAgICAgICAgICAgICAgICAgICAgICAxICAgLyogeXVxdWFuaGVAaGlzaWxpY29uLmNvbSAqLworICAgIC8qIGx1b2ZhbGVpIGZsbHVvQHBrdS5lZHUuY24gLCB3bHExNUBtYWlscy50c2luZ2h1YS5lZHUuY24gLAorICAgIExvbmdmZWkuV2FuZ0BtZWRpYXRlay5jb20gKi8KKyNkZWZpbmUgUkQxNTAxX0ZJWF9CRyAgICAgICAgICAgICAgICAgICAgICAxCisgICAgLyogeXVxdWFuaGVAaGlzaWxpY29uLmNvbSA7IGhlLXl1YW4ubGluQG1zdGFyc2VtaS5jb20gKi8KKyNkZWZpbmUgTXZfUmFuZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisgICAgIC8qIExvbmdmZWkuV2FuZ0BtZWRpYXRlay5jb20gO2ZyZWQuY2hpdUBtZWRpYXRlay5jb20KKyAgICAgamllMTIyMi5jaGVuQHNhbXN1bmcuY29tICovCisjZGVmaW5lIFJEMTYwX0ZJWF9CRyAgICAgICAgICAgICAgICAgICAgICAgMQorICAgICAvKiBZX0tfVHVAbm92YXRlay5jb20udHcsIGhlLXl1YW4ubGluQG1zdGFyc2VtaS5jb20sCisgICAgIHZpY3Rvci5odWFuZ0Btb250YWdlLXRlY2guY29tIE00MDQxICovCisjZGVmaW5lIFJEMTYwMV9GSVhfQkcgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBTRVFfQ0hBTkdFX0NIRUNLRVIgICAgICAgICAgICAgICAgIDEgICAgLyogaGUteXVhbi5saW5AbXN0YXJzZW1pLmNvbSAqLworI2RlZmluZSBNNDE0MF9FTkRfT0ZfU0xJQ0VfQ0hFQ0tFUiAgICAgICAgIDEgICAgLyogaGUteXVhbi5saW5AbXN0YXJzZW1pLmNvbSAqLworICAgICAvKiB3bHExNUBtYWlscy50c2luZ2h1YS5lZHUuY24gKi8KKyNkZWZpbmUgTXZfY2hlY2tfYnVnICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNBT19BU1NFUlRJT05fRklYICAgICAgICAgICAgICAgICAgMSAgICAvKiBmcmVkLmNoaXVAbWVkaWF0ZWsuY29tICovCisjZGVmaW5lIEZJRUxEX0hPUklfTVZfTk9fU0NBTEVfRklYICAgICAgICAgMSAgICAvKiBmcmVkLmNoaXVAbWVkaWF0ZWsuY29tICovCisjZGVmaW5lIFJEMTcwX0ZJWF9CRyAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBGSVhfQ0hST01BX0ZJRUxEX01WX0JLX0RJU1QgICAgICAgIDEKKyNkZWZpbmUgRklYX0xVTUFfRklFTERfTVZfQktfRElTVCAgICAgICAgICAxCisjZGVmaW5lIEZJWF9DSFJPTUFfRklFTERfTVZfQ0xJUCAgICAgICAgICAgMQorI2lmIDEKKyNkZWZpbmUgRklYX0ZMVVNIX0RQQl9CWV9MRiAgICAgICAgICAgICAgICAxICAgIC8qIGZyZWQuY2hpdUBtZWRpYXRlay5jb20gKi8KKyNkZWZpbmUgRklYX1NFUV9FTkRfRkxVU0hfRFBCX0JZX0xGICAgICAgICAxICAgLyogZnJlZC5jaGl1QG1lZGlhdGVrLmNvbSAqLworI2Vsc2UKKyNkZWZpbmUgRklYX0ZMVVNIX0RQQl9CWV9MRiAgICAgICAgICAgICAgICAwICAgIC8qIGZyZWQuY2hpdUBtZWRpYXRlay5jb20gKi8KKyNkZWZpbmUgRklYX1NFUV9FTkRfRkxVU0hfRFBCX0JZX0xGICAgICAgICAwICAgLyogZnJlZC5jaGl1QG1lZGlhdGVrLmNvbSAqLworI2VuZGlmCisjZGVmaW5lIFJEMTkxX0ZJWF9CVUcgICAgICAgICAgICAgICAgICAgICAgMSAgLyogeXVxdWFuaGVAaHNpbGljb24uY29tICovCisjZGVmaW5lIFNZTV9NVl9TQ0FMRV9GSVggICAgICAgICAgICAgICAgICAgMS8qIHBlaXNvbmcuY2hlbkBicm9hZGNvbS5jb20gKi8KKyNkZWZpbmUgQlVHXzEwQklUX1JFRklORVFQICAgICAgICAgICAgICAgICAwIC8qIHdhbmd6aGVueXUgKi8KKworCisKKyNpZiBSRDE5MV9GSVhfQlVHCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKgorICogQVZTMiBtYWNyb3Mgc3RhcnQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJTlRFUkxBQ0VfQ09ESU5HICAgICAgICAgICAgICAgICAgIDEKKyNpZiBJTlRFUkxBQ0VfQ09ESU5HICAvKiBNMzUzMTogTVYgc2NhbGluZyBjb21wZW5zYXRpb24gKi8KKy8qIEx1bWEgY29tcG9uZW50ICovCisjZGVmaW5lIEhBTEZfUElYRUxfQ09NUEVOU0FUSU9OICAgICAgICAgICAgMSAvKiBjb21tb24gZnVuY3Rpb25zIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgSEFMRl9QSVhFTF9DT01QRU5TQVRJT05fUE1WICAgICAgICAxIC8qIHNwYWNpYWwgTVYgcHJlZGljdGlvbiAqLworI2RlZmluZSBIQUxGX1BJWEVMX0NPTVBFTlNBVElPTl9ESVJFQ1QgICAgIDEgLyogQiBkaXJlY3QgbW9kZSAqLworICAvKiBNViBkZXJpdmF0aW9uIG1ldGhvZCAxLCB3ZWlnaHRlZCBQX3NraXAgbW9kZSAqLworI2RlZmluZSBIQUxGX1BJWEVMX0NPTVBFTlNBVElPTl9NMSAgICAgICAgIDEKKyAgLyogTTEgcmVsYXRlZCB3aXRoIG12LXNjYWxpbmcgZnVuY3Rpb24gKi8KKyNkZWZpbmUgSEFMRl9QSVhFTF9DT01QRU5TQVRJT05fTTFfRlVDVElPTiAxCisjZGVmaW5lIEhBTEZfUElYRUxfQ09NUEVOU0FUSU9OX01WRCAgICAgICAgMSAvKiBNViBzY2FsaW5nIGZyb20gRlctPkJXICovCisvKiBDaHJvbWEgY29tcG9uZW50cyAqLworICAvKiBjaHJvbWEgTVYgaXMgc2NhbGVkIHdpdGggbHVtYSBNViBmb3IgNDoyOjAgZm9ybWF0ICovCisjZGVmaW5lIEhBTEZfUElYRUxfQ0hST01BICAgICAgICAgICAgICAgICAgMQorICAvKiBoYWxmIHBpeGVsIGNvbXBlbnNhdGlvbiBmb3IgcCBza2lwL2RpcmVjdCAqLworI2RlZmluZSBIQUxGX1BJWEVMX1BTS0lQICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5URVJMQUNFX0NPRElOR19GSVggICAgICAgICAgICAgICAxIC8qIEhMUyBmaXggKi8KKyNkZWZpbmUgT1VUUFVUX0lOVEVSTEFDRV9NRVJHRURfUElDICAgICAgICAxCisKKyNlbmRpZgorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitBVlMyIDEwYml0LzEyYml0IHByb2ZpbGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNkZWZpbmUgREJGSVhfMTBiaXQgICAgICAgICAgICAgIDEKKworI2RlZmluZSBCVUdfMTBiaXQgICAgICAgICAgICAgIDEKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0FWUzIgSElHSCBMRVZFTCBTWU5UQVgKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworI2RlZmluZSBBVlMyX0hEUl9ITFMgICAgICAgICAgICAgMQorIC8qIEFWUzIgSERSIHRlY2hub2xvZ3kgLy95dXF1YW5oZUBoaXNpbGljb24uY29tICovCisjZGVmaW5lIEFWUzJfSERSX1RlYyAgICAgICAgICAgICAgICAgICAgICAgMQorI2lmIEFWUzJfSERSX1RlYworI2RlZmluZSBIRFJfQ0hST01BX0RFTFRBX1FQICAgICAgICAgICAgICAgIDEgLyogTTM5MDUgKi8KKyNkZWZpbmUgSERSX0FEUFRJVkVfVVZfREVMVEEgICAgICAgICAgICAgICAgICAxCisjZW5kaWYKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQVZTMiBTMgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworI2RlZmluZSBBVlMyX1MyX0ZBU1RNT0RFREVDSVNJT04gMQorI2RlZmluZSBSRDE1MTBfRklYX0JHICAgICAgICAgICAgMSAgICAgIC8qIDIwMTYwNzE0LCBmbGx1b0Bwa3UuZWR1LmNuICovCisKKworLyogLy8vLy8vLy8vLy8vLy8vLy8vIHByZWRpY3Rpb24gdGVjaG5pcXVlcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworI2RlZmluZSBMQU1fMkxldmVsX1RVICAgICAgICAgICAgMC44CisKKworI2RlZmluZSBESVJFQ1RJT04gICAgICAgICAgICAgICAgNAorI2RlZmluZSBEU19GT1JXQVJEICAgICAgICAgICAgICAgNAorI2RlZmluZSBEU19CQUNLV0FSRCAgICAgICAgICAgICAgMgorI2RlZmluZSBEU19TWU0gICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBEU19CSUQgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIE1IX1BTS0lQX05VTSAgICAgICAgICAgICA0CisjZGVmaW5lIE5VTV9PRkZTRVQgICAgICAgICAgICAgICAwCisjZGVmaW5lIEJJRF9QX0ZTVCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEJJRF9QX1NORCAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEZXX1BfRlNUICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIEZXX1BfU05EICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFdQTV9OVU0gICAgICAgICAgICAgICAgICAzCisgICAgICAvKiBNMzMzMCBjaGFuZ2VzIGl0IHRvIDIsIHRoZSBvcmlnaW5hbCB2YWx1ZSBpcyAzICovCisjZGVmaW5lIE1BWF9NVlBfQ0FORF9OVU0gICAgICAgICAyCisKKyNkZWZpbmUgRE1IX01PREVfTlVNICAgICAgICAgICAgIDUgICAgIC8qIE51bWJlciBvZiBETUggbW9kZSAqLworI2RlZmluZSBUSF9NRSAgICAgICAgICAgICAgICAgICAgMCAgICAgLyogVGhyZXNob2xkIG9mIE1FICovCisKKyNkZWZpbmUgTVZfU0NBTEUgICAgICAgICAgICAgICAgIDEKKworLyogLy8vLy8gcmVmZXJlbmNlIHBpY3R1cmUgbWFuYWdlbWVudCAvLyAqLworI2RlZmluZSBGSVhfTUFYX1JFRiAgICAgICAgICAgICAgMSAgICAgLyogRmFsZWkgTFVPLCBmbGx1b0Bwa3UuZWR1LmNuICovCisjaWYgRklYX01BWF9SRUYKKyAgICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIHJlZmVyZW5jZSBmcmFtZSBmb3IgZWFjaCBmcmFtZSAqLworI2RlZmluZSBNQVhSRUYgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBNQVhHT1AgICAgICAgICAgICAgICAgICAgMzIKKyNlbmRpZgorCisvKiAjZGVmaW5lIFJFRl9NQVhCVUZGRVIgICAgICAgICAgICA3ICovCisvKiBtb3JlIGJ1ZmZlcmVzIGZvciBkaXNwbGF5aW5nIGFuZCBiYWNrZ3JvdW5kICovCisvKiAjZGVmaW5lIFJFRl9NQVhCVUZGRVIgICAgICAgICAgICAxNSAqLworI2lmIDEKKyNkZWZpbmUgUkVGX01BWEJVRkZFUiAgICAgICAgICAgIDIzCisjZGVmaW5lIFJFRl9CVUZGRVIgIDE2CisjZWxzZQorI2lmIFJEMTcwX0ZJWF9CRworI2RlZmluZSBSRUZfTUFYQlVGRkVSICAgICAgICAgICAgMTYKKyNlbHNlCisjZGVmaW5lIFJFRl9NQVhCVUZGRVIgICAgICAgICAgICA3CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgVE9fUE9SVElORworICAgIC8qIGJsb2NrLWNvbXBvc2VkIGJhY2tncm91bmQgcmVmZXJlbmNlLCBmYW5nZG9uZ0BtYWlsLnVzdGMuZWR1LmNuICovCisjZGVmaW5lIEJDQlIgICAgICAgICAgICAgICAgICAgICAxCisjZWxzZQorI2RlZmluZSBCQ0JSICAgIDAKKyNlbmRpZgorLyogb25lIG1vcmUgYnVmZmVyIGZvciBiYWNrZ3JvdW5kIHdoZW4gYmFja2dyb3VuZF9waWN0dXJlX291dHB1dF9mbGFnIGlzIDAqLworI2RlZmluZSBBVlMyX01BWF9CVUZGRVJfTlVNICAgICAgICAgICAgICAgKFJFRl9NQVhCVUZGRVIgKyAxKQorCisvKiAvLy8vLy8vLy8vLy8vLy8vL0FkYXB0aXZlIExvb3AgRmlsdGVyLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKyNkZWZpbmUgTlVNX0FMRl9DT0VGRl9DVFggICAgICAgIDEKKyNkZWZpbmUgTlVNX0FMRl9MQ1VfQ1RYICAgICAgICAgIDQKKworI2RlZmluZSBMQU1CREFfU0NBTEVfTFVNQSAgICAgICAoMS4wKQorI2RlZmluZSBMQU1CREFfU0NBTEVfQ0hST01BICAgICAoMS4wKQorCisKKworLyogLy8vLy8vLy8vLy8vLy8vLy8vIGVudHJvcHkgY29kaW5nIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisgICAvKiBNMzA5MDogTWFrZSBzdXJlIHJzMSB3aWxsIG5vdCBvdmVyZmxvdyBmb3IgOC1iaXQgdW5zaWduIGNoYXIgKi8KKyNkZWZpbmUgTlVOX1ZBTFVFX0JPVU5EICAgICAgICAgIDI1NAorI2RlZmluZSBFbmNvZGVyX0JZUEFTU19GaW5hbCAgICAgMSAgICAvKiBNMzQ4NCAqLworI2RlZmluZSBEZWNvZGVyX0J5cGFzc19Bbm5leCAgICAgMCAgICAvKiBNMzQ4NCAqLworI2RlZmluZSBEZWNvZGVyX0ZpbmFsX0FubmV4ICAgICAgMCAgICAvKiBNMzU0MCAqLworCisKKy8qIC8vLy8vLy8vLy8vLy8vLy8vLyBjb2VmZmljaWVudCBjb2RpbmcgLy8vLy8gKi8KKyAgICAgLyogTTMwMzUgc2l6ZSBvZiBhbiBjb2VmZmljaWVudCBncm91cCwgNHg0ICovCisjZGVmaW5lIENHX1NJWkUgICAgICAgICAgICAgICAgICAxNgorCisjZGVmaW5lIFNXQVAoeCwgeSkge1wKKwkoeSkgPSAoeSkgXiAoeCk7XAorCSh4KSA9ICh5KSBeICh4KTtcCisJKHkpID0gKHgpIF4gKHkpO1wKK30KKworLyogLy8vLy8vLy8vLy8vLy8vLy8vIGVuY29kZXIgb3B0aW1pemF0aW9uIC8vLy8vLy8gKi8KKyNkZWZpbmUgVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgTTM2MjRNRExPRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQgKi8KKworI2RlZmluZSBURFJETyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNMzUyOCAqLworLyogI2RlZmluZSBGSVhfVERSRE9fQkcgIDEgIC8vIGZsbHVvQHBrdS5lZHUuY24sIDIwMTYwMzE4Ly8gKi8KKyNkZWZpbmUgUkFURUNPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTTM1ODAgTTM2MjcgTTM2ODkgKi8KKyNkZWZpbmUgQVFQTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTTM2MjMgKi8KKyNkZWZpbmUgQVFQT00zNjk0ICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUVBPTTQwNjMgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFRUE9NMzc2MiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQkdRUE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTTQwNjEgKi8KKyNpZiBCR1FQTworI2RlZmluZSBMT05HUkVGRVJFTkNFICAgICAgICAgICAgICAgICAgICAgICAzMgorI2VuZGlmCisKKy8qICNkZWZpbmUgUkVQT1JUICovCisvKiAvLy8vLy8vLy8vLy8vLy8vLy8gUXVhbnRpemF0aW9uICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisgLyogQWRhcHRpdmUgZnJlcXVlbmN5IHdlaWdodGluZyBxdWFudGl6YXRpb24gKi8KKyNkZWZpbmUgRlJFUVVFTkNZX1dFSUdIVElOR19RVUFOVElaQVRJT04gICAgMQorI2lmIEZSRVFVRU5DWV9XRUlHSFRJTkdfUVVBTlRJWkFUSU9OCisjZGVmaW5lIENIUk9NQV9ERUxUQV9RUCAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVdRX1dFSUdIVElORyAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBV1FfTEFSR0VfQkxPQ0tfRU5BQkxFICAgICAgICAgICAgICAxCisjZGVmaW5lIENPVU5UX0JJVF9PVkVSSEVBRCAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVdRX0xBUkdFX0JMT0NLX0VYVF9NQVBQSU5HICAgICAgICAgMQorI2VuZGlmCisKKyNkZWZpbmUgUXVhbnRDbGlwICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBRdWFudE1hdHJpeENsaXBGaXggICAgICAgICAgICAgICAgICAxICAvKiAyMDE2MDQxOCwgZmxsdUBwa3UuZWR1LmNuICovCisKKyNkZWZpbmUgV1FfTUFUUklYX0ZDRCAgICAgICAgICAgICAgICAgICAgICAgMQorI2lmICFXUV9NQVRSSVhfRkNECisjZGVmaW5lIFdRX0ZMQVRCQVNFX0lOQklUICA3CisjZWxzZQorI2RlZmluZSBXUV9GTEFUQkFTRV9JTkJJVCAgNgorI2VuZGlmCisKKworI2RlZmluZSBSRUZJTkVEX1FQICAgICAgICAgICAgICAgICAgICAgICAgICAxCisKKworLyogLy8vLy8vLy8vLy8vLy8vLy8vIGRlbHRhIFFQIC8vLy8vICovCisgICAgICAvKiBNMzEyMjogdGhlIG1pbmltdW0gZFFQIHVuaXQgaXMgTWFjcm8gYmxvY2sgKi8KKyNkZWZpbmUgTUJfRFFQICAgICAgICAgICAgICAgICAgICAxCisgICAgICAvKiBNMzEyMjogMSByZXByZXNlbnRzIGxlZnQgcHJlZGljdGlvbgorICAgICAgYW5kIDAgcmVwcmVzZW50cyBwcmV2aW91cyBwcmVkaWN0aW9uICovCisjZGVmaW5lIExFRlRfUFJFRElDVElPTiAgICAgICAgICAgMQorCisKKy8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy9TQU8vLy8vLy8vLy8gKi8KKyNkZWZpbmUgTlVNX0JPX09GRlNFVCAgICAgICAgICAgICAzMgorI2RlZmluZSBNQVhfTlVNX1NBT19DTEFTU0VTICAgICAgIDMyCisjZGVmaW5lIE5VTV9TQU9fQk9fQ0xBU1NFU19MT0cyICAgNQorI2RlZmluZSBOVU1fU0FPX0JPX0NMQVNTRVNfSU5fQklUIDUKKyNkZWZpbmUgTUFYX0RPVUJMRSAgICAgICAgICAgICAgICAoMS43ZSArIDMwOCkKKyNkZWZpbmUgTlVNX1NBT19FT19UWVBFU19MT0cyICAgICAyCisjZGVmaW5lIE5VTV9TQU9fQk9fQ0xBU1NFUyAgICAgICAgKDE8PE5VTV9TQU9fQk9fQ0xBU1NFU19MT0cyKQorI2RlZmluZSBTQU9fUkFURV9USFIgICAgICAgICAgICAgIDAuNzUKKyNkZWZpbmUgU0FPX1JBVEVfQ0hST01BX1RIUiAgICAgICAxCisjZGVmaW5lIFNBT19TSElGVF9QSVhfTlVNICAgICAgICAgNAorCisjZGVmaW5lIFNBT19QQVJBX0NST1NTX1NMSUNFICAgICAgMQorI2RlZmluZSBTQU9fTVVMU0xJQ0VfRlRSX0ZJWCAgICAgIDEKKworLyogLy8vLy8vLy8vLy8vLy8vLy8vLyBUcmFuc2Zvcm0gLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisjZGVmaW5lIFNFQ19UUl9TSVpFICAgICAgICAgICAgICAgNAorICAgLyogYXBwbHkgc2VjVCB0byBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gOHg4IGJsb2NrLCAqLworI2RlZmluZSBTRUNfVFJfTUlOX0JJVFNJWkUgICAgICAgIDMKKworI2RlZmluZSBCVUdGSVhFRF9DT01CSU5FRF9TVF9CRCAgIDEKKworLyogLy8vLy8vLy8vLy8vLy8vLy8vLyBTY2FsYWJsZSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKyNkZWZpbmUgTTM0ODBfVEVNUE9SQUxfU0NBTEFCTEUgICAxCisjZGVmaW5lIFRFTVBPUkFMX01BWExFVkVMICAgICAgICAgOAorI2RlZmluZSBURU1QT1JBTF9NQVhMRVZFTF9CSVQgICAgIDMKKworCisKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBVlMyIG1hY3JvcyBlbmQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNkZWZpbmUgQ0hST01BICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIExVTUFfOHg4ICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBOVU1fQkxPQ0tfVFlQRVMgICAgICAgICAgIDgKKworI2lmICghZGVmaW5lZCBjbGFtcCkKKyAgICAgLyogITwgY2xhbXAgYSB0byB0aGUgcmFuZ2Ugb2YgW2I7Y10gKi8KKyNkZWZpbmUgY2xhbXAoYSwgYiwgYykgKChhKSA8IChiKSA/IChiKSA6ICgoYSkgPiAoYykgPyAoYykgOiAoYSkpKQorI2VuZGlmCisKKwkvKiBQT0MyMDAzMDEgbW92ZWQgZnJvbSBkZWZpbmVzLmggKi8KKyNkZWZpbmUgTE9HMl9NQVhfRlJBTUVfTlVNX01JTlVTNCAgICA0CisJLyogITwgYnl0ZXMgZm9yIG9uZSBmcmFtZSAqLworI2RlZmluZSBNQVhfQ09ERURfRlJBTUVfU0laRSAgICAgICAgIDE1MDAwMDAwCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBGTEFHUyBhbmQgREVGSU5FUyBmb3IgbmV3IGNocm9tYSBpbnRyYSBwcmVkaWN0aW9uLCBEenVuZyBIb2FuZyAqLworLyogVGhyZXNob2xkIHZhbHVlcyB0byB6ZXJvIG91dCBxdWFudGl6ZWQgdHJhbnNmb3JtIGNvZWZmaWNpZW50cy4gKi8KKy8qIFJlY29tbWVuZCB0aGF0IF9DSFJPTUFfQ09FRkZfQ09TVF8gYmUgbG93IHRvIGltcHJvdmUgY2hyb21hIHF1YWxpdHkgKi8KKyNkZWZpbmUgX0xVTUFfQ09FRkZfQ09TVF8gICAgICAgICA0IC8qICE8IHRocmVzaG9sZCBmb3IgbHVtYSBjb2VmZnMgKi8KKyAgLyogITwgTnVtYmVyIG9mIHBpeGVscyBwYWRkZWQgYXJvdW5kIHRoZSByZWZlcmVuY2UgZnJhbWUgKD49NCkgKi8KKyNkZWZpbmUgSU1HX1BBRF9TSVpFICAgICAgICAgICAgICA2NAorCisjZGVmaW5lIE9VVFNUUklOR19TSVpFICAgICAgICAgICAgMjU1CisKKwkvKiAhPCBhYnMgbWFjcm8sIGZhc3RlciB0aGFuIHByb2NlZHVyZSAqLworI2RlZmluZSBhYnNtKEEpICgoQSkgPCAoMCkgPyAoLShBKSkgOiAoQSkpCisgICAgLyogITwgdXNlZCBmb3Igc3RhcnQgdmFsdWUgZm9yIHNvbWUgdmFyaWFibGVzICovCisjZGVmaW5lIE1BWF9WQUxVRSAgICAgICAgICAgICAgICA5OTk5OTkKKworI2RlZmluZSBDbGlwMShhKSAgICAgKChhKSA+IDI1NSA/IDI1NTooKGEpIDwgMCA/IDAgOiAoYSkpKQorI2RlZmluZSBDbGlwMyhtaW4sIG1heCwgdmFsKSAoKCh2YWwpIDwgKG1pbikpID9cCisJCShtaW4pIDogKCgodmFsKSA+IChtYXgpKSA/IChtYXgpIDogKHZhbCkpKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogYmxvY2sgc2l6ZSBvZiBibG9jayB0cmFuc2Zvcm1lZCBieSBBVlMgKi8KKyNkZWZpbmUgUFNLSVBESVJFQ1QgICAgICAgICAgICAgICAwCisjZGVmaW5lIFAyTlgyTiAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQMk5YTiAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUE5YMk4gICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFBIT1JfVVAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBQSE9SX0RPV04gICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgUFZFUl9MRUZUICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFBWRVJfUklHSFQgICAgICAgICAgICAgICAgNworI2RlZmluZSBQTlhOICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgSThNQiAgICAgICAgICAgICAgICAgICAgICA5CisjZGVmaW5lIEkxNk1CICAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgSUJMT0NLICAgICAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBJbk54Tk1CICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIElOeG5OTUIgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgTUFYTU9ERSAgICAgICAgICAgICAgICAgICAxNCAgIC8qIGFkZCB5dXFoIDIwMTMwODI0ICovCisjZGVmaW5lICBMQU1CREFfQUNDVVJBQ1lfQklUUyAgICAgMTYKKyNkZWZpbmUgIExBTUJEQV9GQUNUT1IobGFtYmRhKSAoKGludCkoKGRvdWJsZSkoMSA8PCBMQU1CREFfQUNDVVJBQ1lfQklUUylcCisJCSogbGFtYmRhICsgMC41KSkKKyNkZWZpbmUgIFdFSUdIVEVEX0NPU1QoZmFjdG9yLCBiaXRzKSAoKChmYWN0b3IpICogKGJpdHMpKVwKKwkJPj4gTEFNQkRBX0FDQ1VSQUNZX0JJVFMpCisjZGVmaW5lICBNVl9DT1NUKGYsIHMsIGN4LCBjeSwgcHgsIHB5KSAoV0VJR0hURURfQ09TVChmLCBtdmJpdHNbKChjeCkgPDwgKHMpKVwKKwkJLSBweF0gKwltdmJpdHNbKChjeSkgPDwgKHMpKSAtIHB5XSkpCisjZGVmaW5lICBSRUZfQ09TVChmLCByZWYpICAgICAgICAgICAgICAoV0VJR0hURURfQ09TVChmLCByZWZiaXRzWyhyZWYpXSkpCisKKyNkZWZpbmUgIEJXRF9JRFgocmVmKSAgICAgICAgICAgICAgICAgKCgocmVmKSA8IDIpID8gMSAtIChyZWYpIDogKHJlZikpCisjZGVmaW5lICBSRUZfQ09TVF9GV0QoZiwgcmVmKSAoV0VJR0hURURfQ09TVChmLFwKKwkJKChpbWctPm51bV9yZWZfcGljX2FjdGl2ZV9md2RfbWludXMxID09IDApID9cCisJCQkwIDogcmVmYml0c1socmVmKV0pKSkKKyNkZWZpbmUgIFJFRl9DT1NUX0JXRChmLCBlZikgKFdFSUdIVEVEX0NPU1QoZixcCisJCSgoaW1nLT5udW1fcmVmX3BpY19hY3RpdmVfYndkX21pbnVzMSA9PSAwKSA/XAorCQkJMCA6IEJXRF9JRFgocmVmYml0c1tyZWZdKSkpKQorCisjZGVmaW5lIElTX0lOVFJBKE1CKSAoKE1CKS0+Y3VUeXBlID09IEk4TUIgfHxcCisJKE1CKS0+Y3VUeXBlID09IEkxNk1CIHx8XAorCShNQiktPmN1VHlwZSA9PSBJbk54Tk1CIHx8IChNQiktPmN1VHlwZSA9PSBJTnhuTk1CKQorI2RlZmluZSBJU19JTlRFUihNQikgKChNQiktPmN1VHlwZSAhPSBJOE1CICYmXAorCShNQiktPmN1VHlwZSAhPSBJMTZNQiAmJiAoTUIpLT5jdVR5cGUgIT0gSW5OeE5NQlwKKwkmJiAoTUIpLT5jdVR5cGUgIT0gSU54bk5NQikKKyNkZWZpbmUgSVNfSU5URVJNVihNQikgKChNQiktPmN1VHlwZSAhPSBJOE1CICYmXAorCShNQiktPmN1VHlwZSAhPSBJMTZNQiAmJiAoTUIpLT5jdVR5cGUgIT0gSW5OeE5NQiAmJlwKKwkoTUIpLT5jdVR5cGUgIT0gSU54bk5NQiAmJiAoTUIpLT5jdVR5cGUgIT0gMCkKKworCisjZGVmaW5lIElTX0RJUkVDVChNQikgKChNQiktPmN1VHlwZSA9PSBQU0tJUERJUkVDVCAmJiAoaW1nLT50eXBlID09IEJfSU1HKSkKKyNkZWZpbmUgSVNfUF9TS0lQKE1CKSAoKE1CKS0+Y3VUeXBlID09IFBTS0lQRElSRUNUICYmXAorCSgoKGltZy0+dHlwZSA9PSBGX0lNRykpIHx8ICgoaW1nLT50eXBlID09IFBfSU1HKSkpKQorI2RlZmluZSBJU19QOHg4KE1CKSAgKChNQiktPmN1VHlwZSA9PSBQTlhOKQorCisvKiBRdWFudGl6YXRpb24gcGFyYW1ldGVyIHJhbmdlICovCisjZGVmaW5lIE1JTl9RUCAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNQVhfUVAgICAgICAgICAgICAgICAgICAgICAgIDYzCisjZGVmaW5lIFNISUZUX1FQICAgICAgICAgICAgICAgICAgICAgMTEKKworLyogUGljdHVyZSB0eXBlcyAqLworI2RlZmluZSBJTlRSQV9JTUcgICAgICAgICAgICAgICAgICAgIDAgICAvKiAhPCBJIGZyYW1lICovCisjZGVmaW5lIElOVEVSX0lNRyAgICAgICAgICAgICAgICAgICAgMSAgIC8qICE8IFAgZnJhbWUgKi8KKyNkZWZpbmUgQl9JTUcgICAgICAgICAgICAgICAgICAgICAgICAyICAgLyogITwgQiBmcmFtZSAqLworI2RlZmluZSBJX0lNRyAgICAgICAgICAgICAgICAgICAgICAgIDAgICAvKiAhPCBJIGZyYW1lICovCisjZGVmaW5lIFBfSU1HICAgICAgICAgICAgICAgICAgICAgICAgMSAgIC8qICE8IFAgZnJhbWUgKi8KKyNkZWZpbmUgRl9JTUcgICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiAhPCBGIGZyYW1lICovCisKKyNkZWZpbmUgQkFDS0dST1VORF9JTUcgICAgICAgICAgICAgICAzCisKKyNkZWZpbmUgQlBfSU1HICAgICAgICAgICAgICAgICAgICAgICA1CisKKworLyogRGlyZWN0IE1vZGUgdHlwZXMgKi8KKyNkZWZpbmUgTUlOX0NVX1NJWkUgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIE1JTl9CTE9DS19TSVpFICAgICAgICAgICAgICAgNAorI2RlZmluZSBNSU5fQ1VfU0laRV9JTl9CSVQgICAgICAgICAgIDMKKyNkZWZpbmUgTUlOX0JMT0NLX1NJWkVfSU5fQklUICAgICAgICAyCisjZGVmaW5lIEJMT0NLX01VTFRJUExFICAgICAgICAgICAgICAoTUlOX0NVX1NJWkUvKE1JTl9CTE9DS19TSVpFKSkKKyNkZWZpbmUgTUFYX0NVX1NJWkUgICAgICAgICAgICAgICAgICA2NAorI2RlZmluZSBNQVhfQ1VfU0laRV9JTl9CSVQgICAgICAgICAgIDYKKyNkZWZpbmUgQjRYNF9JTl9CSVQgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEI4WDhfSU5fQklUICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBCMTZYMTZfSU5fQklUICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQjMyWDMyX0lOX0JJVCAgICAgICAgICAgICAgICA1CisjZGVmaW5lIEI2NFg2NF9JTl9CSVQgICAgICAgICAgICAgICAgNgorICAgIC8qICE8ICMgbHVtYSBpbnRyYSBwcmVkaWN0aW9uIG1vZGVzICovCisjZGVmaW5lIE5VTV9JTlRSQV9QTU9ERSAgICAgICAgICAgICAgMzMKKyAgICAvKiBudW1iZXIgb2YgbHVtYSBtb2RlcyBmb3IgZnVsbCBSRCBzZWFyY2ggKi8KKyNkZWZpbmUgTlVNX01PREVfRlVMTF9SRCAgICAgICAgICAgICA5CisgICAgLyogITwgI2Nocm9tYSBpbnRyYSBwcmVkaWN0aW9uIG1vZGVzICovCisjZGVmaW5lIE5VTV9JTlRSQV9QTU9ERV9DSFJPTUEgICAgICAgNQorCisvKiBsdW1hIGludHJhIHByZWRpY3Rpb24gbW9kZXMgKi8KKworI2RlZmluZSBEQ19QUkVEICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUExBTkVfUFJFRCAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEJJX1BSRUQgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBWRVJUX1BSRUQgICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIEhPUl9QUkVEICAgICAgICAgICAgICAgICAgICAgMjQKKworCisvKiBjaHJvbWEgaW50cmEgcHJlZGljdGlvbiBtb2RlcyAqLworI2RlZmluZSBETV9QUkVEX0MgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRENfUFJFRF9DICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEhPUl9QUkVEX0MgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBWRVJUX1BSRURfQyAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQklfUFJFRF9DICAgICAgICAgICAgICAgICAgICA0CisKKyNkZWZpbmUgRU9TICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogITwgRW5kIE9mIFNlcXVlbmNlICovCisJLyogITwgU3RhcnQgT2YgUGljdHVyZSAqLworI2RlZmluZSBTT1AgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKworI2RlZmluZSBERUNPRElOR19PSyAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU0VBUkNIX1NZTkMgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFQ09ERV9NQiAgICAgICAgICAgICAgICAgICAgMQorCisjaWZuZGVmIG1heAorICAvKiAhPCBNYWNybyByZXR1cm5pbmcgbWF4IHZhbHVlICovCisjZGVmaW5lIG1heChhLCBiKSAgICAgICAgICAgICAgICAgICAoKGEpID4gKGIpID8gKGEpIDogKGIpKQorICAvKiAhPCBNYWNybyByZXR1cm5pbmcgbWluIHZhbHVlICovCisjZGVmaW5lIG1pbihhLCBiKSAgICAgICAgICAgICAgICAgICAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQorI2VuZGlmCisKKworI2RlZmluZSBYWV9NSU5fUE1WICAgICAgICAgICAgICAgICAgIDEKKyNpZiBYWV9NSU5fUE1WCisjZGVmaW5lIE1WUFJFRF94eV9NSU4gICAgICAgICAgICAgICAgMAorI2Vsc2UKKyNkZWZpbmUgTVZQUkVEX01FRElBTiAgICAgICAgICAgICAgICAwCisjZW5kaWYKKyNkZWZpbmUgTVZQUkVEX0wgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1WUFJFRF9VICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNVlBSRURfVVIgICAgICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBEVUFMICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgRk9SV0FSRCAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEJBQ0tXQVJEICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBTWU0gICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQklEICAgICAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIElOVFJBICAgICAgICAgICAgICAgICAgICAgICAgLTEKKworI2RlZmluZSBCVUZfQ1lDTEUgICAgICAgICAgICAgICAgICAgIDUKKworI2RlZmluZSBST0lfTTMyNjQgICAgICAgICAgICAgICAgICAgIDEgICAgICAvKiBST0kgSW5mb3JtYXRpb24gRW5jb2RpbmcgKi8KKworI2RlZmluZSBQaWNFeHRlbnNpb25EYXRhICAgICAgICAgICAgIDEKKworCisjZGVmaW5lIFJFRl9PVVRQVVQgICAgICAgICAgICAgICAgICAgMSAgLyogTTMzMzcgKi8KKworCisvKiBNViBzY2FsaW5nIDE0IGJpdCAqLworI2RlZmluZSBNVUxUSSAgICAgICAgICAgICAgICAgICAgICAgIDE2Mzg0CisjZGVmaW5lIEhBTEZfTVVMVEkgICAgICAgICAgICAgICAgICAgODE5MgorI2RlZmluZSBPRkZTRVQgICAgICAgICAgICAgICAgICAgICAgIDE0CisvKiBlbmQgb2YgTVYgc2NhbGluZyAqLworIC8qIHN0b3JlIHRoZSBtaWRkbGUgcGl4ZWwncyBtdiBpbiBhIG1vdGlvbiBpbmZvcm1hdGlvbiB1bml0ICovCisjZGVmaW5lIE1WX0RFQ0lNQVRJT05fRkFDVE9SICAgICAgICAgNAorCisvKiBCVUdGSVhfQVZBSUxBQklMSVRZX0lOVFJBICovCisjZGVmaW5lIE5FSUdIQk9SX0lOVFJBX0xFRlQgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTkVJR0hCT1JfSU5UUkFfVVAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBORUlHSEJPUl9JTlRSQV9VUF9SSUdIVCAgICAgICAgICAgICAyCisjZGVmaW5lIE5FSUdIQk9SX0lOVFJBX1VQX0xFRlQgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTkVJR0hCT1JfSU5UUkFfTEVGVF9ET1dOICAgICAgICAgICAgNAorLyogZW5kIG9mIEJVR0ZJWF9BVkFJTEFCSUxJVFlfSU5UUkEgKi8KKworLyogZW5kICNpbmNsdWRlICJkZWZpbmUuaCIgKi8KKworLyojaW5jbHVkZSAiY29tbW9uU3RydWN0dXJlcy5oIiovCisKKy8qdHlwZWRlZiB1aW50MTZfdCBieXRlOyovICAgIC8qICE8IGJ5dGUgdHlwZSBkZWZpbml0aW9uICovCisjZGVmaW5lIGJ5dGUgdWludDE2X3QKKyNkZWZpbmUgcGVsX3QgYnl0ZQorCitlbnVtIEJpdENvdW50VHlwZV9lIHsKKwlCSVRTX0hFQURFUiwKKwlCSVRTX1RPVEFMX01CLAorCUJJVFNfTUJfTU9ERSwKKwlCSVRTX0lOVEVSX01CLAorCUJJVFNfQ0JQX01CLAorCUJJVFNfQ0JQMDFfTUIsCisJQklUU19DT0VGRl9ZX01CLAorCUJJVFNfQ09FRkZfVVZfTUIsCisJQklUU19ERUxUQV9RVUFOVF9NQiwKKwlCSVRTX1NBT19NQiwKKwlNQVhfQklUQ09VTlRFUl9NQgorfTsKKworCitlbnVtIFNBT0VPQ2xhc3NlcyB7CisvKiBFTyBHcm91cHMsIHRoZSBhc3NpZ25tZW50cyBkZXBlbmRlZCBvbgoraG93IHlvdSBpbXBsZW1lbnQgdGhlIGVkZ2VUeXBlIGNhbGN1bGF0aW9uICovCisJU0FPX0NMQVNTX0VPX0ZVTExfVkFMTEVZID0gMCwKKwlTQU9fQ0xBU1NfRU9fSEFMRl9WQUxMRVkgPSAxLAorCVNBT19DTEFTU19FT19QTEFJTiAgICAgICA9IDIsCisJU0FPX0NMQVNTX0VPX0hBTEZfUEVBSyAgID0gMywKKwlTQU9fQ0xBU1NfRU9fRlVMTF9QRUFLICAgPSA0LAorCVNBT19DTEFTU19CTyAgICAgICAgICAgICA9IDUsCisJTlVNX1NBT19FT19DTEFTU0VTID0gU0FPX0NMQVNTX0JPLAorCU5VTV9TQU9fT0ZGU0VUCit9OworCitzdHJ1Y3QgU0FPc3RhdGRhdGEgeworCWludDMyX3QgZGlmZltNQVhfTlVNX1NBT19DTEFTU0VTXTsKKwlpbnQzMl90ICBjb3VudFtNQVhfTlVNX1NBT19DTEFTU0VTXTsKK307CisKK3N0cnVjdCBDb3B5UmlnaHRfcyB7CisJaW50MzJfdCBleHRlbnNpb25faWQ7CisJaW50MzJfdCBjb3B5cmlnaHRfZmxhZzsKKwlpbnQzMl90IGNvcHlyaWdodF9pZDsKKwlpbnQzMl90IG9yaWdpbmFsX29yX2NvcHk7CisJaW50MzJfdCByZXNlcnZlZDsKKwlpbnQzMl90IGNvcHlyaWdodF9udW1iZXI7Cit9OworCitzdHJ1Y3QgQ2FtZXJhUGFyYW10ZXJzX3MgeworCWludDMyX3QgcmVzZXJ2ZWQ7CisJaW50MzJfdCBjYW1lcmFfaWQ7CisJaW50MzJfdCBoZWlnaHRfb2ZfaW1hZ2VfZGV2aWNlOworCWludDMyX3QgZm9jYWxfbGVuZ3RoOworCWludDMyX3QgZl9udW1iZXI7CisJaW50MzJfdCB2ZXJ0aWNhbF9hbmdsZV9vZl92aWV3OworCWludDMyX3QgY2FtZXJhX3Bvc2l0aW9uX3g7CisJaW50MzJfdCBjYW1lcmFfcG9zaXRpb25feTsKKwlpbnQzMl90IGNhbWVyYV9wb3NpdGlvbl96OworCWludDMyX3QgY2FtZXJhX2RpcmVjdGlvbl94OworCWludDMyX3QgY2FtZXJhX2RpcmVjdGlvbl95OworCWludDMyX3QgY2FtZXJhX2RpcmVjdGlvbl96OworCWludDMyX3QgaW1hZ2VfcGxhbmVfdmVydGljYWxfeDsKKwlpbnQzMl90IGltYWdlX3BsYW5lX3ZlcnRpY2FsX3k7CisJaW50MzJfdCBpbWFnZV9wbGFuZV92ZXJ0aWNhbF96OworfTsKKworLyogISBTTlJQYXJhbWV0ZXJzICovCitzdHJ1Y3QgU05SUGFyYW1ldGVyc19zIHsKKwlkb3VibGUgc25yX3k7ICAgICAgICAgICAgICAgLyogITwgY3VycmVudCBZIFNOUiAqLworCWRvdWJsZSBzbnJfdTsgICAgICAgICAgICAgICAvKiAhPCBjdXJyZW50IFUgU05SICovCisJZG91YmxlIHNucl92OyAgICAgICAgICAgICAgIC8qICE8IGN1cnJlbnQgViBTTlIgKi8KKwlkb3VibGUgc25yX3kxOyAgICAgICAgICAgICAgLyogITwgU05SIFkoZEIpIGZpcnN0IGZyYW1lICovCisJZG91YmxlIHNucl91MTsgICAgICAgICAgICAgIC8qICE8IFNOUiBVKGRCKSBmaXJzdCBmcmFtZSAqLworCWRvdWJsZSBzbnJfdjE7ICAgICAgICAgICAgICAvKiAhPCBTTlIgVihkQikgZmlyc3QgZnJhbWUgKi8KKwlkb3VibGUgc25yX3lhOyAgICAgICAgICAgICAgLyogITwgQXZlcmFnZSBTTlIgWShkQikgcmVtYWluaW5nIGZyYW1lcyAqLworCWRvdWJsZSBzbnJfdWE7ICAgICAgICAgICAgICAvKiAhPCBBdmVyYWdlIFNOUiBVKGRCKSByZW1haW5pbmcgZnJhbWVzICovCisJZG91YmxlIHNucl92YTsgICAgICAgICAgICAgIC8qICE8IEF2ZXJhZ2UgU05SIFYoZEIpIHJlbWFpbmluZyBmcmFtZXMgKi8KKyNpZiBJTlRFUkxBQ0VfQ09ESU5HCisJZG91YmxlIGlfc25yX3lhOyAgICAgICAgICAgICAgIC8qICE8IGN1cnJlbnQgWSBTTlIgKi8KKwlkb3VibGUgaV9zbnJfdWE7ICAgICAgICAgICAgICAgLyogITwgY3VycmVudCBVIFNOUiAqLworCWRvdWJsZSBpX3Nucl92YTsgICAgICAgICAgICAgICAvKiAhPCBjdXJyZW50IFYgU05SICovCisjZW5kaWYKK307CisKKy8qIHNpZ25hbCB0byBub2lzZSByYXRpbyBwYXJhbWV0ZXJzICovCisKKy8qICEgY29kaW5nVW5pdCAqLworc3RydWN0IGNvZGluZ1VuaXQgeworCXVpbnQzMl90ICAgICAgICB1aV9NYkJpdFNpemU7CisJaW50MzJfdCAgICAgICAgICAgICAgICAgdWlCaXRTaXplOyAgICAgICAgICAgIC8qIHNpemUgb2YgTUIgKi8KKwkvKiAhPCBudW1iZXIgb2YgY3VycmVudCBzeW50YXggZWxlbWVudCAqLworCWludDMyX3QgICAgICAgICAgICAgICAgIGN1cnJTRW5yOworCWludDMyX3QgICAgICAgICAgICAgICAgIHNsaWNlX25yOworCWludDMyX3QgICAgICAgICAgICAgICAgIGRlbHRhX3F1YW50OyAgICAgICAgICAvKiAhPCBmb3IgcmF0ZSBjb250cm9sICovCisJaW50MzJfdCAgICAgICAgICAgICAgICAgZGVsdGFfcXA7CisJaW50MzJfdCAgICAgICAgICAgICAgICAgcXA7CisJaW50MzJfdCAgICAgICAgICAgICAgICAgYml0Y291bnRlcltNQVhfQklUQ09VTlRFUl9NQl07CisJc3RydWN0IGNvZGluZ1VuaXQKKwkqbWJfYXZhaWxhYmxlWzNdWzNdOyAvKiE8IHBvaW50ZXIgdG8gbmVpZ2hib3JpbmcgTUJzCisJCWluIGEgM3gzIHdpbmRvdyBvZiBjdXJyZW50IE1CLCB3aGljaCBpcyBsb2NhdGVkIGF0IFsxXVsxXSBcbgorCQlOVUxMIHBvaW50ZXIgaWRlbnRpZmllcyBuZWlnaGJvcmluZyBNQnMgd2hpY2ggYXJlIHVuYXZhaWxhYmxlICovCisJLyogc29tZSBzdG9yYWdlIG9mIGNvZGluZ1VuaXQgc3ludGF4IGVsZW1lbnRzIGZvciBnbG9iYWwgYWNjZXNzICovCisJaW50MzJfdCAgICAgICAgICAgICAgICAgY3VUeXBlOworCWludDMyX3QgICAgICAgICAgICAgICAgIHdlaWdodGVkX3NraXBtb2RlOworCisJaW50MzJfdCAgICAgICAgICAgICAgICAgbWRfZGlyZWN0c2tpcF9tb2RlOworCisJaW50MzJfdCAgICAgICAgICAgICAgICAgdHJhbnNfc2l6ZTsKKwlpbnQKKwkvKiAhPCBpbmRpY2VzIGNvcnJlc3BvbmQgdG8gW2ZvcncsYmFja3ddW2Jsb2NrX3ldW2Jsb2NrX3hdW3gseSwgZG1oXSAqLworCW12ZFsyXVtCTE9DS19NVUxUSVBMRV1bQkxPQ0tfTVVMVElQTEVdWzNdOworCisJaW50MzJfdCAgaW50cmFfcHJlZF9tb2Rlc1tCTE9DS19NVUxUSVBMRSAqIEJMT0NLX01VTFRJUExFXTsKKwlpbnQzMl90ICByZWFsX2ludHJhX3ByZWRfbW9kZXNbQkxPQ0tfTVVMVElQTEUgKiBCTE9DS19NVUxUSVBMRV07CisJaW50MzJfdCAgbF9pcHJlZF9tb2RlOworCWludDMyX3QgIGNicCwgY2JwX2JsazsKKwl1aW50MzJfdCBjYnBfYml0czsKKworCWludDMyX3QgICAgICAgICAgICAgICAgIGI4bW9kZVs0XTsKKwlpbnQzMl90ICAgICAgICAgICAgICAgICBiOHBkaXJbNF07CisgICAgICAvKiAhPCBjaHJvbWEgaW50cmEgcHJlZGljdGlvbiBtb2RlICovCisJaW50MzJfdCAgICAgICAgICAgICAgICAgY19pcHJlZF9tb2RlOworCisgICAvKiAhPCBwb2ludGVyIHRvIG5laWdoYm9yaW5nIE1CIChBRUMpICovCisJc3RydWN0IGNvZGluZ1VuaXQgICAqbWJfYXZhaWxhYmxlX3VwOworCSAvKiAhPCBwb2ludGVyIHRvIG5laWdoYm9yaW5nIE1CIChBRUMpICovCisJc3RydWN0IGNvZGluZ1VuaXQgICAqbWJfYXZhaWxhYmxlX2xlZnQ7CisJaW50MzJfdCAgICAgICAgICAgICAgICAgbWJBZGRyQSwgbWJBZGRyQiwgbWJBZGRyQywgbWJBZGRyRDsKKyAgICAgICAvKiAhPGFkZGVkIGJ5IG16LCAyMDA4LjA0ICovCisJaW50MzJfdCAgICAgICAgICAgICAgICAgc2xpY2Vfc2V0X2luZGV4OworICAgICAvKiBhZGRlZCBieSBteiwgMjAwOC4wNCAqLworCWludDMyX3QgICAgICAgICAgICAgICAgIHNsaWNlX2hlYWRlcl9mbGFnOworCWludDMyX3QgICAgICAgICAgICAgICAgIHNsaWNlcXA7ICAgICAgICAgLyogYWRkZWQgYnkgbXosIDIwMDguMDQgKi8KKyNpZiBNQl9EUVAKKwlpbnQzMl90ICAgICAgICAgICAgICAgICBwcmV2aW91c2VfcXA7CisJaW50MzJfdCAgICAgICAgICAgICAgICAgbGVmdF9jdV9xcDsKKyNlbmRpZgorCWludDMyX3QgICAgICAgICAgICAgICAgIGJsb2NrX2F2YWlsYWJsZV91cDsKKwlpbnQzMl90ICAgICAgICAgICAgICAgICBibG9ja19hdmFpbGFibGVfbGVmdDsKKworfTsKKworCisvKiBpbWFnZSBwYXJhbWV0ZXJzICovCitzdHJ1Y3Qgc3ludGF4ZWxlbWVudDsKK3N0cnVjdCBzbGljZTsKK3N0cnVjdCBhbGZkYXRhcGFydDsKK3N0cnVjdCBTQU9CbGtQYXJhbV9zIHsKKwlpbnQzMl90IG1vZGVJZGM7IC8qIE5FVywgTUVSR0UsIE9GRiAqLworCS8qIE5FVzogRU9fMCwgRU9fOTAsIEVPXzEzNSwgRU9fNDUsIEJPLiBNRVJHRTogbGVmdCwgYWJvdmUgKi8KKwlpbnQzMl90IHR5cGVJZGM7CisJaW50MzJfdCBzdGFydEJhbmQ7IC8qIEJPOiBzdGFydGluZyBiYW5kIGluZGV4ICovCisJaW50MzJfdCBzdGFydEJhbmQyOworCWludDMyX3QgZGVsdGFiYW5kOworCWludDMyX3Qgb2Zmc2V0W01BWF9OVU1fU0FPX0NMQVNTRVNdOworfTsKK3N0cnVjdCBBTEZQYXJhbV9zIHsKKwlpbnQzMl90IGFsZl9mbGFnOworCWludDMyX3QgbnVtX2NvZWZmOworCWludDMyX3QgZmlsdGVyc19wZXJfZ3JvdXA7CisJaW50MzJfdCBjb21wb25lbnRJRDsKKwlpbnQzMl90IGZpbHRlclBhdHRlcm5bMTZdOyAvKiAqZmlsdGVyUGF0dGVybjsgKi8KKwlpbnQzMl90IGNvZWZmbXVsdGlbMTZdWzldOyAvKiAqKmNvZWZmbXVsdGk7ICovCit9OworCitlbnVtIEFMRkNvbXBvbmVudElEIHsKKwlBTEZfWSA9IDAsCisJQUxGX0NiLAorCUFMRl9DciwKKwlOVU1fQUxGX0NPTVBPTkVOVAorfTsKK3N0cnVjdCBBTEZfQVBTX3MgeworCWludDMyX3QgdXNlZGZsYWc7CisJaW50MzJfdCBjdXJfbnVtYmVyOworCWludDMyX3QgbWF4X251bWJlcjsKKwlzdHJ1Y3QgQUxGUGFyYW1fcyBhbGZfcGFyW05VTV9BTEZfQ09NUE9ORU5UXTsKK307CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBmcmFtZSBkYXRhCisgKi8KK3N0cnVjdCBhdnMyX2ZyYW1lX3MgeworCWludDMyX3QgaW1nY29pX3JlZjsKKwlieXRlICogKnJlZmVyZW5jZUZyYW1lWzNdOworCWludDMyX3QgKipyZWZidWY7CisJaW50MzJfdCAqKiptdmJ1ZjsKKyNpZiAwCisJZG91YmxlIHNhb3JhdGVbTlVNX1NBT19DT01QT05FTlRTXTsKKyNlbmRpZgorCWJ5dGUgKioqcmVmOworCisJaW50MzJfdCBpbWd0cl9md1JlZkRpc3RhbmNlOworCWludDMyX3QgcmVmZXJlZF9ieV9vdGhlcnM7CisJaW50MzJfdCBpc19vdXRwdXQ7CisJaW50MzJfdCB0b19wcmVwYXJlX2Rpc3A7CisjaWYgTTM0ODBfVEVNUE9SQUxfU0NBTEFCTEUKKwkvKiB0ZW1wb3JhbCBsZXZlbCBzZXR0ZWQgaW4gY29uZmlndXJlIGZpbGUgKi8KKwlpbnQzMl90IHRlbXBvcmFsX2lkOworI2VuZGlmCisJYnl0ZSAqKm9uZUZvcnRoUmVmWTsKKyNpZiBGSVhfTUFYX1JFRgorCWludDMyX3QgcmVmX3BvY1tNQVhSRUZdOworI2Vsc2UKKwlpbnQzMl90IHJlZl9wb2NbNF07CisjZW5kaWYKKyNpZmRlZiBBTUwKKwlpbnQzMl90IGluZGV4OworCWludDMyX3QgbW11X2FsbG9jX2ZsYWc7CisJaW50MzJfdCBsY3Vfc2l6ZV9sb2cyOworCS8qdWludDMyX3QgaGVhZGVyX2FkcjsqLworCXVpbnQzMl90IG1jX3lfYWRyOworCXVpbnQzMl90IG1jX3Vfdl9hZHI7CisJdWludDMyX3QgbWNfY2FudmFzX3k7CisJdWludDMyX3QgbWNfY2FudmFzX3VfdjsKKwl1aW50MzJfdCBtcHJlZF9tdl93cl9zdGFydF9hZGRyOworCXVpbnQ4X3QgYmdfZmxhZzsKKwkvKiovCisJdW5zaWduZWQgbG9uZyBoZWFkZXJfYWRyOworCS8qQVZTMl8xMEJfTU1VX0RXKi8KKwl1bnNpZ25lZCBsb25nIGR3X2hlYWRlcl9hZHI7CisKKwlpbnQgYnVmX3NpemU7CisJaW50IGxjdV90b3RhbDsKKwlpbnQgY29tcF9ib2R5X3NpemU7CisJdWludDMyX3QgZHdfeV9hZHI7CisJdWludDMyX3QgZHdfdV92X2FkcjsKKwlpbnQgeV9jYW52YXNfaW5kZXg7CisJaW50IHV2X2NhbnZhc19pbmRleDsKKwlzdHJ1Y3QgY2FudmFzX2NvbmZpZ19zIGNhbnZhc19jb25maWdbMl07CisJaW50IGRvdWJsZV93cml0ZV9tb2RlOworCWludCBiaXRfZGVwdGg7CisJdW5zaWduZWQgbG9uZyBjbWFfYWxsb2NfYWRkcjsKKwlpbnQgQlVGX2luZGV4OworCWludCBwaWNfdzsKKwlpbnQgcGljX2g7CisJaW50IHN0cmVhbV9vZmZzZXQ7CisJdTMyIHB0czsKKwl1NjQgcHRzNjQ7CisJLyoqLworCWludCB2Zl9yZWY7CisJaW50IGRlY29kZV9pZHg7CisJaW50IHNsaWNlX3R5cGU7CisJaW50MzJfdCBpbWd0cl9md1JlZkRpc3RhbmNlX2JhazsKKwlpbnQzMl90IGVycm9yX21hcms7CisJaW50MzJfdCBkZWNvZGVkX2xjdTsKKyNlbmRpZgorI2lmbmRlZiBNVl9VU0VfRklYRURfQlVGCisJaW50IG12X2J1Zl9pbmRleDsKKyNlbmRpZgorCisJLyogcGljdHVyZSBxb3MgaW5mb21hdGlvbiovCisJaW50IG1heF9xcDsKKwlpbnQgYXZnX3FwOworCWludCBtaW5fcXA7CisJaW50IG1heF9za2lwOworCWludCBhdmdfc2tpcDsKKwlpbnQgbWluX3NraXA7CisJaW50IG1heF9tdjsKKwlpbnQgbWluX212OworCWludCBhdmdfbXY7CisKKwl1MzIgaHdfZGVjb2RlX3RpbWU7CisJdTMyIGZyYW1lX3NpemU7IC8vIEZvciBmcmFtZSBiYXNlIG1vZGUKKworCWNoYXIgKmN1dmFfZGF0YV9idWY7CisJaW50ICBjdXZhX2RhdGFfc2l6ZTsKK307CisKKworc3RydWN0IEltYWdlUGFyYW1ldGVyc19zIHsKKwlzdHJ1Y3QgY29kaW5nVW5pdCAgICAqbWJfZGF0YTsKKwlpbnQzMl90IG51bWJlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA8ISBmcmFtZSBudW1iZXIgKi8KKwlpbnQzMl90IG51bUlQRnJhbWVzOworCisJaW50MzJfdCB0eXBlOworCWludDMyX3QgdHlwZWI7CisJaW50MzJfdCB0eXBlYl9iZWZvcmU7CisKKwlpbnQzMl90IHFwOyAvKiA8ISBxdWFudCBmb3IgdGhlIGN1cnJlbnQgZnJhbWUgKi8KKwlpbnQzMl90IGN1cnJlbnRfbWJfbnI7IC8qIGJpdHN0cmVhbSBvcmRlciAqLworCWludDMyX3QgY3VycmVudF9zbGljZV9ucjsKKwlpbnQzMl90IHRyOyAgIC8qIDwhIHRlbXBvcmFsIHJlZmVyZW5jZSwgOCBiaXQsICovCisKKwlpbnQzMl90IHdpZHRoOyAgICAgICAgICAgICAgICAgICAvKiAhPCBOdW1iZXIgb2YgcGVscyAqLworCWludDMyX3Qgd2lkdGhfY3I7ICAgICAgICAgICAgICAgIC8qICE8IE51bWJlciBvZiBwZWxzIGNocm9tYSAqLworCWludDMyX3QgaGVpZ2h0OyAgICAgICAgICAgICAgICAgIC8qICE8IE51bWJlciBvZiBsaW5lcyAqLworCWludDMyX3QgaGVpZ2h0X2NyOyAgICAgICAgICAgICAgIC8qICE8IE51bWJlciBvZiBsaW5lcyAgY2hyb21hICovCisJaW50MzJfdCBQaWNXaWR0aEluTWJzOworCWludDMyX3QgUGljU2l6ZUluTWJzOworCWludDMyX3QgYmxvY2s4X3gsIGJsb2NrOF95OworCWludDMyX3QgICBzdWJibG9ja194OworCWludDMyX3QgICBzdWJibG9ja195OworCisJaW50MzJfdCBudW1fb2ZfcmVmZXJlbmNlczsKKyAgICAvKiA8ISBCdWcgRml4OiBjb3JyZWN0IHBpY3R1cmUgc2l6ZSBmb3Igb3V0cHV0dGVkIHJlY29uc3RydWN0ZWQgcGljdHVyZXMgKi8KKwlpbnQzMl90IGF1dG9fY3JvcF9yaWdodDsKKwlpbnQzMl90IGF1dG9fY3JvcF9ib3R0b207CisJaW50MzJfdCBidWZfY3ljbGU7CisJaW50MzJfdCBwaWN0dXJlX3N0cnVjdHVyZTsKKwkgLyogPCEgcG9pbnRlciB0byBjdXJyZW50IFNsaWNlIGRhdGEgc3RydWN0ICovCisJc3RydWN0IHNsaWNlICAgICAgICpjdXJyZW50U2xpY2U7CisKKwlpbnQzMl90ICoqcHJlZEJsb2NrOyAgICAgICAgICAgICAvKiAhPCBjdXJyZW50IGJlc3QgcHJlZGljdGlvbiBtb2RlICovCisJaW50MzJfdCAqKnByZWRCbG9ja1RtcDsKKwkvKiAhPCB0aGUgZGlmZiBwaXhlbCB2YWx1ZXMgYmV0d2VlbiBvcmdpbmFsIGltYWdlIGFuZCBwcmVkaWN0aW9uICovCisJaW50MzJfdCAqKnJlc2lZOworCS8qICE8IEFycmF5IGNvbnRhaW5pbmcgc3F1YXJlIHZhbHVlcyx1c2VkIGZvciBzbnIgY29tcHV0YXRpb24gKi8KKwlpbnQzMl90ICpxdWFkOworCisJLyogLy9sb2NhdGlvbiBvZiBjdXJyZW50IE1CLy8vLy8vICovCisJaW50MzJfdCBtYl95OyAgICAgICAgICAgICAgICAgICAgLyogITwgY3VycmVudCBNQiB2ZXJ0aWNhbCAqLworCWludDMyX3QgbWJfeDsgICAgICAgICAgICAgICAgICAgIC8qICE8IGN1cnJlbnQgTUIgaG9yaXpvbnRhbCAqLworCWludDMyX3QgcGl4X3k7ICAgICAgICAgICAgICAgICAgIC8qICE8IGN1cnJlbnQgcGl4ZWwgdmVydGljYWwgKi8KKwlpbnQzMl90IHBpeF94OyAgICAgICAgICAgICAgICAgICAvKiAhPCBjdXJyZW50IHBpeGVsIGhvcml6b250YWwgKi8KKwlpbnQzMl90IHBpeF9jX3k7ICAgICAgICAgICAgICAgICAvKiAhPCBjdXJyZW50IHBpeGVsIGNocm9tYSB2ZXJ0aWNhbCAqLworCWludDMyX3QgcGl4X2NfeDsgLyogITwgY3VycmVudCBwaXhlbCBjaHJvbWEgaG9yaXpvbnRhbCAqLworCisJaW50MzJfdCBpbWd0cl9uZXh0X1A7CisKKwlpbnQzMl90IGltZ2NvaV9uZXh0X3JlZjsKKworICAgIC8qICE8IEdIIGlwcmVkbW9kZVs5MF1bNzRdO3ByZWRpY3Rpb24gbW9kZSBmb3IgaW50ZXIgZnJhbWVzICovCisgICAgLyogZml4IGZyb20gdmVyIDQuMSAqLworCWludDMyX3QgKippcHJlZG1vZGU7CisJaW50MzJfdCAqKnJlY19pcHJlZG1vZGU7CisKKworCS8qIC8vLy8vLy8vLy8vLy8vZGVjb2Rlci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisJaW50MzJfdCBtYXhfbWJfbnI7CisJaW50MzJfdCAqKmludHJhX2Jsb2NrOworCisJaW50MzJfdCBibG9ja195OworCWludDMyX3QgYmxvY2tfeDsKKyAgICAvKiA8ISBmaW5hbCA0eDQgYmxvY2suIEV4dGVuZGVkIHRvIDE2eDE2IGZvciBBVlMgKi8KKwlpbnQzMl90IHJlc2lVVlsyXVtNQVhfQ1VfU0laRV1bTUFYX0NVX1NJWkVdOworCisJaW50MzJfdCAqKmZ3X3JlZkZyQXJyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogPCEgWzcyXVs4OF07ICovCisJaW50MzJfdCAqKmJ3X3JlZkZyQXJyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogPCEgWzcyXVs4OF07ICovCisKKwlpbnQzMl90IHJhbmRvbV9hY2Nlc3NfZGVjb2RhYmxlX2ZsYWc7CisKKwlpbnQzMl90IHNlcV9oZWFkZXJfaW5kaWNhdGU7CisJaW50MzJfdCBCX2Rpc2NhcmRfZmxhZzsKKworCS8qIEIgcGljdHVyZXMgKi8KKwl1aW50MzJfdCBwaWNfZGlzdGFuY2U7CisKKwl1aW50MzJfdCBjb2Rpbmdfb3JkZXI7CisKKwl1aW50MzJfdCBQcmV2UGljRGlzdGFuY2VMc2I7CisJaW50MzJfdCBDdXJyUGljRGlzdGFuY2VNc2I7CisKKwlpbnQzMl90IFBpY0hlaWdodEluTWJzOworCisJaW50MzJfdCB0eXBlczsKKworCWludDMyX3QgbmV3X3NlcXVlbmNlX2ZsYWc7CisJaW50MzJfdCBzZXF1ZW5jZV9lbmRfZmxhZzsgICAgICAgICAgICAvKiA8ISBybTUya19yMiAqLworCisJaW50MzJfdCBjdXJyZW50X3NsaWNlX3NldF9pbmRleDsgICAgICAgICAgLyogPCEgYWRkZWQgYnkgbXosIDIwMDguMDQgKi8KKwlpbnQzMl90IGN1cnJlbnRfc2xpY2VfaGVhZGVyX2ZsYWc7ICAgICAgICAvKiA8ISBhZGRlZCBieSBteiwgMjAwOC4wNCAqLworCWludDMyX3Qgc2xpY2Vfc2V0X3FwWzY0XTsgICAgICAgICAgICAgLyogPCEgYWRkZWQgYnkgbXosIDIwMDguMDQgKi8KKworCisJaW50MzJfdCBpbnRlcl9hbXBfZW5hYmxlOworCisJLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vZW5jb2Rlci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisKKwkvKiBpbnQzMl90IG5iX3JlZmVyZW5jZXM7ICAgICAvLyE8IHJlcGxhY2VkIGJ5ICJudW1fb2ZfcmVmZXJlbmNlcyIgKi8KKworCWludDMyX3QgZnJhbWVyYXRlOworCisJaW50MzJfdCAqKipwcmVkQmxvY2tZOyAgICAgICAgLyogITwgYWxsIDkgcHJlZGljdGlvbiBtb2RlcyAqLworICAgICAvKiAhPCBuZXcgY2hyb21hIDh4OCBpbnRyYSBwcmVkaWN0aW9uIG1vZGVzICovCisJaW50MzJfdCAqKioqcHJlZEJsb2NrVVY7CisKKwlpbnQzMl90ICoqQ29lZmZfYWxsOy8qIHF5dSAwODIxICovCisKKwlzdHJ1Y3Qgc3ludGF4ZWxlbWVudCAgICpNQl9TeW50YXhFbGVtZW50czsgLyogITwgYnkgb2xpdmVyIDA2MTIgKi8KKworCS8qIEIgcGljdHVyZXMgKi8KKworCWludDMyX3QgYl9mcmFtZV90b19jb2RlOworCWludDMyX3QgbnVtX3JlZl9waWNfYWN0aXZlX2Z3ZF9taW51czE7CisJaW50MzJfdCBudW1fcmVmX3BpY19hY3RpdmVfYndkX21pbnVzMTsKKwlpbnQzMl90IG12X3JhbmdlX2ZsYWc7CisKKwl1aW50MzJfdCBmcmFtZV9udW07ICAgLyogZnJhbWVfbnVtIGZvciB0aGlzIGZyYW1lICovCisJaW50MzJfdCBzbGljZV9vZmZzZXQ7CisJLyogdGhlIGZvbGxvd2luZyBhcmUgc2VudCBpbiB0aGUgc2xpY2UgaGVhZGVyICovCisJaW50MzJfdCBOb1Jlc2lkdWVEaXJlY3Q7CisJaW50MzJfdCBjb2RlZF9tYl9ucjsKKwlpbnQzMl90IHByb2dyZXNzaXZlX2ZyYW1lOworCWludDMyX3QgdGNfcmVzZXJ2ZV9iaXQ7CisJIC8qIHRoZSBsYXN0IE1CIG5vIGluIGN1cnJlbnQgc2xpY2UuICAgICAgWXVsaiAyMDA0LjA3LjE1ICovCisJaW50MzJfdCBtYl9ub19jdXJyU2xpY2VMYXN0TUI7CisJaW50MzJfdCBTZXFoZWFkZXJfZmxhZzsgICAgIC8qIEFkZGVkIGJ5IGNqdywgMjAwNzAzMjcgKi8KKwlpbnQzMl90IEVuY29kZUVuZF9mbGFnOyAgICAgICAgIC8qIENhcm1lbiwgMjAwNy8xMi8xOSAqLworCisJdWludDE2X3QgYmJ2X2RlbGF5OworCisJaW50MzJfdCB0bXBfZndCU2tpcE12W0RJUkVDVElPTiArIDFdWzJdOworCWludDMyX3QgdG1wX2J3QlNraXBNdltESVJFQ1RJT04gKyAxXVsyXTsKKworCWludDMyX3QgdG1wX3ByZWZfZnN0W01IX1BTS0lQX05VTSArIE5VTV9PRkZTRVQgKyAxXTsKKwlpbnQzMl90IHRtcF9wcmVmX3NuZFtNSF9QU0tJUF9OVU0gKyBOVU1fT0ZGU0VUICsgMV07CisJaW50MzJfdCB0bXBfZnN0UFNraXBNdltNSF9QU0tJUF9OVU0gKyBOVU1fT0ZGU0VUICsgMV1bM107CisJaW50MzJfdCB0bXBfc25kUFNraXBNdltNSF9QU0tJUF9OVU0gKyBOVU1fT0ZGU0VUICsgMV1bM107CisjaWYgQkNCUgorYnl0ZSAqb3JnX3JlZl95OworYnl0ZSAqb3JnX3JlZl91OworYnl0ZSAqb3JnX3JlZl92OworaW50MzJfdCAgKkJMQ1VpZHg7CitpbnQzMl90ICAqRFFQTGlzdDsKK2ludDMyX3QgIGlOdW1DVXNJbkZyYW1lOworCitieXRlICpvcmdfcmVmMl95OworYnl0ZSAqb3JnX3JlZjJfdTsKK2J5dGUgKm9yZ19yZWYyX3Y7CitpbnQzMl90ICByZWYyTnVtOworI2VuZGlmCisvKiAvLy8vLy8vLy8vLy8vL1NBTyBwYXJhbWV0ZXIvLy8vLy8vLy8vLy8vLy8vLy8gKi8KK2RvdWJsZSAgICAgICAgKmN1cl9zYW9yYXRlOworI2lmIDAKK2ludDMyX3QgICAgICAgICAgICBzbGljZV9zYW9fb25bTlVNX1NBT19DT01QT05FTlRTXTsKKyNlbmRpZgoraW50MzJfdCAgICAgICAgICAgIHBpY19hbGZfb25bTlVNX0FMRl9DT01QT05FTlRdOworc3RydWN0IGFsZmRhdGFwYXJ0ICAgKmRwX0FMRjsKKworI2lmIElOVEVSTEFDRV9DT0RJTkcKK2ludDMyX3QgaXNfZmllbGRfc2VxdWVuY2U7CitpbnQzMl90IGlzX3RvcF9maWVsZDsKKyNlbmRpZgorCisKK307CisKKworCisvKiAhIHN0cnVjdCBmb3IgY29udGV4dCBtYW5hZ2VtZW50ICovCitzdHJ1Y3QgQmlDb250ZXh0VHlwZV9zIHsKKwl1aW50OF90IE1QUzsgICAvKiAxIGJpdCAqLworCXVpbnQzMl90ICBMR19QTVBTOyAvKiAxMCBiaXRzICovCisJdWludDhfdCBjeWNubzsgIC8qIDIgYml0cyAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEIGEgdCBhICAgIHQgeSBwIGUgcyAgIGYgbyByICBBIEUgQworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKK3N0cnVjdCBwaXhfcG9zIHsKKwlpbnQzMl90IGF2YWlsYWJsZTsgICAvKiBBQkNEICovCisJaW50MzJfdCBtYl9hZGRyOyAgICAvKiBNQiBwb3NpdGlvbiAqLworCWludDMyX3QgeDsKKwlpbnQzMl90IHk7CisJaW50MzJfdCBwb3NfeDsgICAgIC8qIDR4NCB4LXBvcyAqLworCWludDMyX3QgcG9zX3k7Cit9OworCisKKworc3RydWN0IFNURE9VVF9EQVRBX3MgeworCWludDMyX3QgdHlwZTsKKwlpbnQzMl90IHR5cGViOworCisJaW50MzJfdCAgIGZyYW1lbnVtOworCWludDMyX3QgICB0cjsKKwlpbnQzMl90ICAgcXA7CisJZG91YmxlIHNucl95OworCWRvdWJsZSBzbnJfdTsKKwlkb3VibGUgc25yX3Y7CisJaW50MzJfdCAgIHRtcF90aW1lOworCWludDMyX3QgICBwaWN0dXJlX3N0cnVjdHVyZTsKKwlpbnQzMl90ICAgY3Vycl9mcmFtZV9iaXRzOworCWludDMyX3QgICBlbXVsYXRlX2JpdHM7CisKKwl1aW50MzJfdCBEZWNNRDVWYWx1ZVs0XTsKKyNpZiBSRDE1MDFfRklYX0JHCitpbnQzMl90IGJhY2tncm91bmRfcGljdHVyZV9vdXRwdXRfZmxhZzsvKiBMb25nZmVpLldhbmdAbWVkaWF0ZWsuY29tICovCisjZW5kaWYKKyNpZiBSRDE2MF9GSVhfQkcKK2ludDMyX3QgcGljdHVyZV9yZW9yZGVyX2RlbGF5OworI2VuZGlmCitpbnQ4X3Qgc3RyX3JlZmVyZW5jZV9saXN0WzEyOF07ICAvKiByZWZlcmVuY2UgbGlzdCBpbmZvcm1hdGlvbiAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEMgTyBOIFQgRSBYIFQgUyAgIEYgTyBSICAgVCBNIEwgICBTIFkgTiBUIEEgWCAgIEUgTCBFIE0gRSBOIFQgUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworI2RlZmluZSBOVU1fQ3VUeXBlX0NUWCAgICAgICAgICAgICAgKDExICsgMTApCisjZGVmaW5lIE5VTV9COF9UWVBFX0NUWCAgICAgICAgICAgICAgOQorI2RlZmluZSBOVU1fTVZEX0NUWCAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgTlVNX1BNVl9JRFhfQ1RYICAgICAgICAgICAgIDEwCisjZGVmaW5lIE5VTV9SRUZfTk9fQ1RYICAgICAgICAgICAgICAgNgorI2RlZmluZSBOVU1fREVMVEFfUVBfQ1RYICAgICAgICAgICAgIDQKKyNkZWZpbmUgTlVNX0lOVEVSX0RJUl9DVFggICAgICAgICAgIDE4CisjZGVmaW5lIE5VTV9JTlRFUl9ESVJfREhQX0NUWCAgICAgICAgICAgMworI2RlZmluZSBOVU1fQjhfVFlQRV9ESFBfQ1RYICAgICAgICAgICAgIDEKKyNkZWZpbmUgTlVNX0FNUF9DVFggICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIE5VTV9DX0lOVFJBX01PREVfQ1RYICAgICAgICAgNAorI2RlZmluZSBOVU1fQ0JQX0NUWCAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTlVNX0JDQlBfQ1RYICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE5VTV9NQVBfQ1RYICAgICAgICAgICAgICAgICAxNworI2RlZmluZSBOVU1fTEFTVF9DVFggICAgICAgICAgICAgICAgMTcKKworI2RlZmluZSBOVU1fSU5UUkFfTU9ERV9DVFggICAgICAgICAgIDcKKworI2RlZmluZSBOVU1fQUJTX0NUWCAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTlVNX1RVX0NUWCAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIE5VTV9TUExJVF9DVFggICAgICAgICAgICAgICAgOCAgLyogQ1UgZGVwdGggKi8KKyNpZiBCQ0JSCisjZGVmaW5lIE5VTV9CR0JMQ09LX0NUWCAgICAgICAgICAgICAgMQorI2VuZGlmCisKKyNkZWZpbmUgTlVNX0JSUF9DVFggICAgICAgICAgICAgICAgICA4CisKKworI2RlZmluZSBOVU1fTEFTVF9DR19DVFhfTFVNQSAgICAgICAgMTIKKyNkZWZpbmUgTlVNX0xBU1RfQ0dfQ1RYX0NIUk9NQSAgICAgICA2CisjZGVmaW5lIE5VTV9TSUdDR19DVFhfTFVNQSAgICAgICAgICAgMgorI2RlZmluZSBOVU1fU0lHQ0dfQ1RYX0NIUk9NQSAgICAgICAgIDEKKyNkZWZpbmUgTlVNX0xBU1RfUE9TX0NUWF9MVU1BICAgNTYKKyNkZWZpbmUgTlVNX0xBU1RfUE9TX0NUWF9DSFJPTUEgMTYKKyNkZWZpbmUgTlVNX0xBU1RfQ0dfQ1RYIChOVU1fTEFTVF9DR19DVFhfTFVNQSArIE5VTV9MQVNUX0NHX0NUWF9DSFJPTUEpCisjZGVmaW5lIE5VTV9TSUdDR19DVFggKE5VTV9TSUdDR19DVFhfTFVNQSArIE5VTV9TSUdDR19DVFhfQ0hST01BKQorI2RlZmluZSBOVU1fTEFTVF9QT1NfQ1RYIChOVU1fTEFTVF9QT1NfQ1RYX0xVTUEgKyBOVU1fTEFTVF9QT1NfQ1RYX0NIUk9NQSkKKyNkZWZpbmUgTlVNX1NBT19NRVJHRV9GTEFHX0NUWCAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIE5VTV9TQU9fTU9ERV9DVFggICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBOVU1fU0FPX09GRlNFVF9DVFggICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTlVNX0lOVEVSX0RJUl9NSU5fQ1RYICAgICAgICAgMgorCisvKmVuZCAjaW5jbHVkZSAiY29tbW9uU3RydWN0dXJlcy5oIiovCisKKy8qI2luY2x1ZGUgImNvbW1vblZhcmlhYmxlcy5oIiovCisKKy8qCitleHRlcm4gc3RydWN0IENhbWVyYVBhcmFtdGVyc19zICpjYW1lcmE7CitleHRlcm4gc3RydWN0IFNOUlBhcmFtZXRlcnNfcyAqc25yOworZXh0ZXJuIHN0cnVjdCBJbWFnZVBhcmFtZXRlcnNfcyAqaW1nOworICovCisKKy8qIGF2czJfZnJhbWVfdCAqZnJlZltSRUZfTUFYQlVGRkVSXTsgKi8KKworCisjZGVmaW5lIEVUX1NJWkUgMzAwICAgICAgLyogITwgc2l6ZSBvZiBlcnJvciB0ZXh0IGJ1ZmZlciAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogY29tbW9uIGRhdGEKKyAqLworc3RydWN0IFZpZGVvX0NvbV9kYXRhX3MgeworCWludDMyX3QgICBCZnJhbWVfY3RyOworCisJLyogRklMRSAqcF9sb2c7ICAgICAgICAgICAgICAgICAgICAgLy8hPCBTTlIgZmlsZSAqLworCS8qIEZJTEUgKnBfdHJhY2U7ICAgICAgICAgICAgICAgICAgIC8vITwgVHJhY2UgZmlsZSAqLworCisJaW50MzJfdCAgIHRvdF90aW1lOworCisJLyogVHNpbmdodWEgZm9yIHBpY3R1cmVfZGlzdGFuY2UgIDIwMDcwMSAqLworCWludDMyX3QgICBwaWN0dXJlX2Rpc3RhbmNlOworCisJLyogTTMxNzggUEtVIFJlZmVyZW5jZSBNYW5hZ2UgKi8KKwlpbnQzMl90ICAgY29kaW5nX29yZGVyOworCS8qICE8IGN1cnJlbnQgZW5jb2RpbmcvZGVjb2RpbmcgZnJhbWUgcG9pbnRlciAqLworCXN0cnVjdCBhdnMyX2ZyYW1lX3MgKmZfcmVjOworCWludDMyX3QgICBzZXFfaGVhZGVyOworICAgIC8qICE8IEFycmF5IGZvciByZWZlcmVuY2UgZnJhbWVzIG9mIGVhY2ggYmxvY2sgKi8KKwlpbnQzMl90ICAgICoqcmVmRnJBcnI7CisJaW50MzJfdCAgICAqKnBfc25kX3JlZkZyQXJyOworCisJYnl0ZSAgKioqY3VycmVudEZyYW1lOyAvKiBbeXV2XVtoZWlnaHRdW3dpZHRoXSAqLworI2lmZGVmIEFNTAorCXN0cnVjdCBhdnMyX2ZyYW1lX3MgKmN1cl9waWM7IC8qZWl0aGVyIGZfcmVjIG9yIG1fYmcqLworI2VuZGlmCisJYnl0ZSAgICoqYmFja2dyb3VuZFJlZmVyZW5jZUZyYW1lWzNdOworCWJ5dGUgICoqKmJhY2tncm91bmRfcmVmOworCisKKwlpbnQzMl90ICB0b3RhbF9mcmFtZXM7CisKKwkvKiBtdl9yYW5nZSwgMjAwNzEwMDkgKi8KKwlpbnQzMl90ICBNaW5fVl9NVjsKKwlpbnQzMl90ICBNYXhfVl9NVjsKKwlpbnQzMl90ICBNaW5fSF9NVjsKKwlpbnQzMl90ICBNYXhfSF9NVjsKKwkvKiAhPCBidWZmZXIgZm9yIGVycm9yIG1lc3NhZ2UgZm9yIGV4aXQgd2l0aCBlcnJvcih2b2lkKSAqLworCWludDhfdCBlcnJvcnRleHRbRVRfU0laRV07CisJaW50OF90IHN0cl9saXN0X3JlZmVyZW5jZVsxMjhdOworCisKK307CisvKiBleHRlcm4gVmlkZW9fQ29tX2RhdGEgKmhjOyAqLworCisKKy8qZW5kICNpbmNsdWRlICJjb21tb25WYXJpYWJsZXMuaCIqLworLyogI2RlZmluZSBVU0VfUEFSQU1fVFhUICovCisvKgorI2lmIEZJWF9DSFJPTUFfRklFTERfTVZfQktfRElTVAoraW50OF90IGJrX2ltZ19pc190b3BfZmllbGQ7CisjZW5kaWYKKyovCisvKiB2b2lkIHdyaXRlX0dCX2ZyYW1lKEZJTEUgKnBfZGVjKTsgKi8KKworI2lmICFGSVhfTUFYX1JFRgorI2RlZmluZSBNQVhSRUYgICAgNAorI2RlZmluZSBNQVhHT1AgICAgMzIKKyNlbmRpZgorCitzdHJ1Y3QgU3RhdEJpdHMgeworCWludDMyX3QgICBjdXJyX2ZyYW1lX2JpdHM7CisJaW50MzJfdCAgIHByZXZfZnJhbWVfYml0czsKKwlpbnQzMl90ICAgZW11bGF0ZV9iaXRzOworCWludDMyX3QgICBwcmV2X2VtdWxhdGVfYml0czsKKwlpbnQzMl90ICAgbGFzdF91bml0X2JpdHM7CisJaW50MzJfdCAgIGJpdHJhdGU7CisJaW50MzJfdCAgIHRvdGFsX2JpdHJhdGVbMTAwMF07CisJaW50MzJfdCAgIGNvZGVkX3BpY19udW07CisJaW50MzJfdCAgIHRpbWVfczsKK307CisKK3N0cnVjdCByZWZlcmVuY2VfbWFuYWdlbWVudCB7CisJaW50MzJfdCBwb2M7CisJaW50MzJfdCBxcF9vZmZzZXQ7CisJaW50MzJfdCBudW1fb2ZfcmVmOworCWludDMyX3QgcmVmZXJkX2J5X290aGVyczsKKwlpbnQzMl90IHJlZl9waWNbTUFYUkVGXTsKKwlpbnQzMl90IHByZWRpY3Q7CisJaW50MzJfdCBkZWx0YVJQUzsKKwlpbnQzMl90IG51bV90b19yZW1vdmU7CisJaW50MzJfdCByZW1vdmVfcGljW01BWFJFRl07Cit9OworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZGVjIGRhdGEKKyAqLworc3RydWN0IFZpZGVvX0RlY19kYXRhX3MgeworCWJ5dGUgKipiYWNrZ3JvdW5kX2ZyYW1lWzNdOworCWludDMyX3QgYmFja2dyb3VuZF9yZWZlcmVuY2VfZW5hYmxlOworCisJaW50MzJfdCBiYWNrZ3JvdW5kX3BpY3R1cmVfZmxhZzsKKwlpbnQzMl90IGJhY2tncm91bmRfcGljdHVyZV9vdXRwdXRfZmxhZzsKKwlpbnQzMl90IGJhY2tncm91bmRfcGljdHVyZV9lbmFibGU7CisKKwlpbnQzMl90IGJhY2tncm91bmRfbnVtYmVyOworCisjaWYgQkNCUgorCWludDMyX3QgYmNicl9lbmFibGU7CisjZW5kaWYKKworCWludDMyX3QgZGVtdWxhdGVfZW5hYmxlOworCWludDMyX3QgY3VycmVudGJpdG9mZnNldDsKKworCWludDMyX3QgYXNwZWN0X3JhdGlvX2luZm9ybWF0aW9uOworCWludDMyX3QgZnJhbWVfcmF0ZV9jb2RlOworCWludDMyX3QgYml0X3JhdGVfbG93ZXI7CisJaW50MzJfdCBiaXRfcmF0ZV91cHBlcjsKKwlpbnQzMl90ICBtYXJrZXJfYml0OworCisJaW50MzJfdCB2aWRlb19mb3JtYXQ7CisJaW50MzJfdCBjb2xvcl9kZXNjcmlwdGlvbjsKKwlpbnQzMl90IGNvbG9yX3ByaW1hcmllczsKKwlpbnQzMl90IHRyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKKwlpbnQzMl90IG1hdHJpeF9jb2VmZmljaWVudHM7CisKKwlpbnQzMl90IHByb2dyZXNzaXZlX3NlcXVlbmNlOworI2lmIElOVEVSTEFDRV9DT0RJTkcKK2ludDMyX3QgaXNfZmllbGRfc2VxdWVuY2U7CisjZW5kaWYKK2ludDMyX3QgbG93X2RlbGF5OworaW50MzJfdCBob3Jpem9udGFsX3NpemU7CitpbnQzMl90IHZlcnRpY2FsX3NpemU7CitpbnQzMl90IHNhbXBsZV9wcmVjaXNpb247CitpbnQzMl90IHZpZGVvX3JhbmdlOworCitpbnQzMl90IGRpc3BsYXlfaG9yaXpvbnRhbF9zaXplOworaW50MzJfdCBkaXNwbGF5X3ZlcnRpY2FsX3NpemU7CitpbnQzMl90IFREX21vZGU7CitpbnQzMl90IHZpZXdfcGFja2luZ19tb2RlOworaW50MzJfdCB2aWV3X3JldmVyc2U7CisKK2ludDMyX3QgYl9wbXZyX2VuYWJsZWQ7CitpbnQzMl90IGRocF9lbmFibGVkOworaW50MzJfdCBiX2RtaF9lbmFibGVkOworaW50MzJfdCBiX21ocHNraXBfZW5hYmxlZDsKK2ludDMyX3Qgd3NtX2VuYWJsZWQ7CitpbnQzMl90IGJfc2VjVF9lbmFibGVkOworCitpbnQzMl90IHRtcF90aW1lOworaW50MzJfdCBGcmFtZU51bTsKK2ludDMyX3QgZW9zOworaW50MzJfdCBwcmVfaW1nX3R5cGU7CitpbnQzMl90IHByZV9pbWdfdHlwZXM7CisvKiBpbnQzMl90IHByZV9zdHJfdmVjOyAqLworaW50MzJfdCBwcmVfaW1nX3RyOworaW50MzJfdCBwcmVfaW1nX3FwOworaW50MzJfdCBwcmVfdG1wX3RpbWU7CitpbnQzMl90IFJlZlBpY0V4aXN0OyAgIC8qIDIwMDcxMjI0ICovCitpbnQzMl90IEJnUmVmUGljRXhpc3Q7CitpbnQzMl90IGRlY19yZWZfbnVtOyAgICAgICAgICAgICAgICAvKiByZWYgb3JkZXIgKi8KKworLyogdmlkZW8gZWRpdCBjb2RlICovIC8qIE0xOTU2IGJ5IEdyYW5kdmlldyAyMDA2LjEyLjEyICovCitpbnQzMl90IHZlY19mbGFnOworCisvKiBDb3B5cmlnaHRfZXh0ZW5zaW9uKHZvaWQpIGhlYWRlciAqLworaW50MzJfdCBjb3B5cmlnaHRfZmxhZzsKK2ludDMyX3QgY29weXJpZ2h0X2lkZW50aWZpZXI7CitpbnQzMl90IG9yaWdpbmFsX29yX2NvcHk7CitpbnQ2NF90IGNvcHlyaWdodF9udW1iZXJfMTsKK2ludDY0X3QgY29weXJpZ2h0X251bWJlcl8yOworaW50NjRfdCBjb3B5cmlnaHRfbnVtYmVyXzM7CisvKiBDYW1lcmFfcGFyYW1ldGVyc19leHRlbnNpb24gKi8KK2ludDMyX3QgY2FtZXJhX2lkOworaW50MzJfdCBoZWlnaHRfb2ZfaW1hZ2VfZGV2aWNlOworaW50MzJfdCBmb2NhbF9sZW5ndGg7CitpbnQzMl90IGZfbnVtYmVyOworaW50MzJfdCB2ZXJ0aWNhbF9hbmdsZV9vZl92aWV3OworaW50MzJfdCBjYW1lcmFfcG9zaXRpb25feF91cHBlcjsKK2ludDMyX3QgY2FtZXJhX3Bvc2l0aW9uX3hfbG93ZXI7CitpbnQzMl90IGNhbWVyYV9wb3NpdGlvbl95X3VwcGVyOworaW50MzJfdCBjYW1lcmFfcG9zaXRpb25feV9sb3dlcjsKK2ludDMyX3QgY2FtZXJhX3Bvc2l0aW9uX3pfdXBwZXI7CitpbnQzMl90IGNhbWVyYV9wb3NpdGlvbl96X2xvd2VyOworaW50MzJfdCBjYW1lcmFfZGlyZWN0aW9uX3g7CitpbnQzMl90IGNhbWVyYV9kaXJlY3Rpb25feTsKK2ludDMyX3QgY2FtZXJhX2RpcmVjdGlvbl96OworaW50MzJfdCBpbWFnZV9wbGFuZV92ZXJ0aWNhbF94OworaW50MzJfdCBpbWFnZV9wbGFuZV92ZXJ0aWNhbF95OworaW50MzJfdCBpbWFnZV9wbGFuZV92ZXJ0aWNhbF96OworCisjaWYgQVZTMl9IRFJfSExTCisvKiBtYXN0ZXJpbmdfZGlzcGxheV9hbmRfY29udGVudF9tZXRhZGF0YV9leHRlbnNpb24odm9pZCkgaGVhZGVyICovCitpbnQzMl90IGRpc3BsYXlfcHJpbWFyaWVzX3gwOworaW50MzJfdCBkaXNwbGF5X3ByaW1hcmllc195MDsKK2ludDMyX3QgZGlzcGxheV9wcmltYXJpZXNfeDE7CitpbnQzMl90IGRpc3BsYXlfcHJpbWFyaWVzX3kxOworaW50MzJfdCBkaXNwbGF5X3ByaW1hcmllc194MjsKK2ludDMyX3QgZGlzcGxheV9wcmltYXJpZXNfeTI7CitpbnQzMl90IHdoaXRlX3BvaW50X3g7CitpbnQzMl90IHdoaXRlX3BvaW50X3k7CitpbnQzMl90IG1heF9kaXNwbGF5X21hc3RlcmluZ19sdW1pbmFuY2U7CitpbnQzMl90IG1pbl9kaXNwbGF5X21hc3RlcmluZ19sdW1pbmFuY2U7CitpbnQzMl90IG1heGltdW1fY29udGVudF9saWdodF9sZXZlbDsKK2ludDMyX3QgbWF4aW11bV9mcmFtZV9hdmVyYWdlX2xpZ2h0X2xldmVsOworI2VuZGlmCisKKy8qIElfcGljdHVyZXNfaGVhZGVyKHZvaWQpICovCitpbnQzMl90IHRvcF9maWVsZF9maXJzdDsKK2ludDMyX3QgcmVwZWF0X2ZpcnN0X2ZpZWxkOworaW50MzJfdCBwcm9ncmVzc2l2ZV9mcmFtZTsKKyNpZiBJTlRFUkxBQ0VfQ09ESU5HCitpbnQzMl90IGlzX3RvcF9maWVsZDsKKyNlbmRpZgorLyogaW50MzJfdCBmaXhlZF9waWN0dXJlX3FwOyAgIC8vcXl1IDA5MjcgKi8KK2ludDMyX3QgcGljdHVyZV9xcDsKK2ludDMyX3QgZml4ZWRfcGljdHVyZV9xcDsKK2ludDMyX3QgdGltZV9jb2RlX2ZsYWc7CitpbnQzMl90IHRpbWVfY29kZTsKK2ludDMyX3QgbG9vcF9maWx0ZXJfZGlzYWJsZTsKK2ludDMyX3QgbG9vcF9maWx0ZXJfcGFyYW1ldGVyX2ZsYWc7CisvKiBpbnQzMl90IGFscGhhX29mZnNldDsgKi8KKy8qIGludDMyX3QgYmV0YV9vZmZzZXQ7ICovCisKKy8qIFBiX3BpY3R1cmVfaGVhZGVyKHZvaWQpICovCitpbnQzMl90IHBpY3R1cmVfY29kaW5nX3R5cGU7CisKKy8qcGljdHVyZV9kaXNwbGF5X2V4dGVuc2lvbih2b2lkKSovCitpbnQzMl90IGZyYW1lX2NlbnRyZV9ob3Jpem9udGFsX29mZnNldFs0XTsKK2ludDMyX3QgZnJhbWVfY2VudHJlX3ZlcnRpY2FsX29mZnNldFs0XTsKKworLyogc2xpY2VfaGVhZGVyKHZvaWQpICovCitpbnQzMl90IGltZ193aWR0aDsKK2ludDMyX3Qgc2xpY2VfdmVydGljYWxfcG9zaXRpb247CitpbnQzMl90IHNsaWNlX3ZlcnRpY2FsX3Bvc2l0aW9uX2V4dGVuc2lvbjsKK2ludDMyX3QgZml4ZWRfc2xpY2VfcXA7CitpbnQzMl90IHNsaWNlX3FwOworaW50MzJfdCBzbGljZV9ob3Jpem9udGFsX3Bvc2l0b247ICAgICAgIC8qIGFkZGVkIGJ5IG16LCAyMDA4LjA0ICovCitpbnQzMl90IHNsaWNlX2hvcml6b250YWxfcG9zaXRvbl9leHRlbnNpb247CisKK2ludDMyX3QgU3RhcnRDb2RlUG9zaXRpb247CitpbnQzMl90IGJhY2tncm91bmRfcHJlZF9mbGFnOworCisKKy8qIFJlZmVyZW5jZSBNYW5hZ2UgKi8KK2ludDMyX3QgZGlzcGxheWRlbGF5OworaW50MzJfdCBwaWN0dXJlX3Jlb3JkZXJfZGVsYXk7CisjaWYgTTM0ODBfVEVNUE9SQUxfU0NBTEFCTEUKK2ludDMyX3QgdGVtcG9yYWxfaWRfZXhpc3RfZmxhZzsKKyNlbmRpZgorCitpbnQzMl90IGdvcF9zaXplOworc3RydWN0IHJlZmVyZW5jZV9tYW5hZ2VtZW50IGRlY29kX1JQU1tNQVhHT1BdOworc3RydWN0IHJlZmVyZW5jZV9tYW5hZ2VtZW50IGN1cnJfUlBTOworaW50MzJfdCBsYXN0X291dHB1dDsKK2ludDMyX3QgdHJ0bXA7CisjaWYgTTM0ODBfVEVNUE9SQUxfU0NBTEFCTEUKK2ludDMyX3QgY3VyX2xheWVyOworI2VuZGlmCisKKy8qIEFkYXB0aXZlIGZyZXF1ZW5jeSB3ZWlnaHRpbmcgcXVhbnRpemF0aW9uICovCisjaWYgRlJFUVVFTkNZX1dFSUdIVElOR19RVUFOVElaQVRJT04KK2ludDMyX3Qgd2VpZ2h0X3F1YW50X2VuYWJsZV9mbGFnOworaW50MzJfdCBsb2FkX3NlcV93ZWlnaHRfcXVhbnRfZGF0YV9mbGFnOworCitpbnQzMl90IHBpY193ZWlnaHRfcXVhbnRfZW5hYmxlX2ZsYWc7CitpbnQzMl90IHBpY193ZWlnaHRfcXVhbnRfZGF0YV9pbmRleDsKK2ludDMyX3Qgd2VpZ2h0aW5nX3F1YW50X3BhcmFtOworaW50MzJfdCB3ZWlnaHRpbmdfcXVhbnRfbW9kZWw7CitpbnQxNl90IHF1YW50X3BhcmFtX3VuZGV0YWlsWzZdOyAgICAgIC8qIE0yMTQ4IDIwMDctMDkgKi8KK2ludDE2X3QgcXVhbnRfcGFyYW1fZGV0YWlsWzZdOyAgICAgICAgLyogTTIxNDggMjAwNy0wOSAqLworaW50MzJfdCBXZWlnaHRRdWFudEVuYWJsZTsgICAgICAgICAgICAgIC8qIE0yMTQ4IDIwMDctMDkgKi8KK2ludDMyX3QgbWJfYWRhcHRfd3FfZGlzYWJsZTsgICAgICAgICAgICAvKiBNMjMzMSAyMDA4LTA0ICovCitpbnQzMl90IG1iX3dxX21vZGU7ICAgICAgICAgICAgICAgICAgICAgLyogTTIzMzEgMjAwOC0wNCAqLworI2lmIENIUk9NQV9ERUxUQV9RUAoraW50MzJfdCBjaHJvbWFfcXVhbnRfcGFyYW1fZGlzYWJsZTsKK2ludDMyX3QgY2hyb21hX3F1YW50X3BhcmFtX2RlbHRhX3U7CitpbnQzMl90IGNocm9tYV9xdWFudF9wYXJhbV9kZWx0YV92OworI2VuZGlmCisKK2ludDMyX3QgYl9wcmVfZGVjX2ludHJhX2ltZzsKK2ludDMyX3QgcHJlX2RlY19pbWdfdHlwZTsKK2ludDMyX3QgQ3VycmVudFNjZW5lTW9kZWw7CisjZW5kaWYKKworaW50MzJfdCBjdXJyX0lEUmNvaTsKK2ludDMyX3QgY3Vycl9JRFJ0cjsKK2ludDMyX3QgbmV4dF9JRFJ0cjsKK2ludDMyX3QgbmV4dF9JRFJjb2k7CitpbnQzMl90IGVuZF9TZXFUcjsKKworI2lmIE1CX0RRUAoraW50MzJfdCBsYXN0UVA7CisvKiBGSUxFICogdGVzdFFQOyAqLworI2VuZGlmCisKK307CisvKiBleHRlcm4gVmlkZW9fRGVjX2RhdGEgKmhkOyAqLworCitzdHJ1Y3QgRGVjb2RpbmdFbnZpcm9ubWVudF9zIHsKKwl1aW50MzJfdCAgICBEYnVmZmVyOworCWludDMyX3QgICAgICAgICAgICAgRGJpdHNfdG9fZ287CisJdWludDhfdCAgICAgICAgICAgICpEY29kZXN0cm07CisJaW50MzJfdCAgICAgICAgICAgICAqRGNvZGVzdHJtX2xlbjsKK307CisKKy8qIGFkZGVkIGF0IHJtNTJrIHZlcnNpb24gKi8KKworc3RydWN0IGlucF9wYXI7CisKKworCisvKiAhIFNsaWNlICovCitzdHJ1Y3Qgc2xpY2UgeworCWludDMyX3QgICAgICAgICAgICAgICAgIHBpY3R1cmVfaWQ7CisJaW50MzJfdCAgICAgICAgICAgICAgICAgcXA7CisJaW50MzJfdCAgICAgICAgICAgICAgICAgcGljdHVyZV90eXBlOyAvKiAhPCBwaWN0dXJlIHR5cGUgKi8KKwlpbnQzMl90ICAgICAgICAgICAgICAgICBzdGFydF9tYl9ucjsKKwkgLyogITwgbnVtYmVyIG9mIGRpZmZlcmVudCBwYXJ0aXRpb25zICovCisJaW50MzJfdCAgICAgICAgICAgICAgICAgbWF4X3BhcnRfbnI7CisKKwkvKiBhZGRlZCBieSBsemhhbmcgKi8KKwkvKiAhPCBwb2ludGVyIHRvIHN0cnVjdCBvZiBjb250ZXh0IG1vZGVscyBmb3IgdXNlIGluIEFFQyAqLworCXN0cnVjdCBTeW50YXhJbmZvQ29udGV4dHNfcyAgKnN5bl9jdHg7Cit9OworCitzdHJ1Y3QgYWxmZGF0YXBhcnQgeworCXN0cnVjdCBCaXRzdHJlYW1fcyAgICAgICAgICAgKmJpdHN0cmVhbTsKKwlzdHJ1Y3QgRGVjb2RpbmdFbnZpcm9ubWVudF9zIGRlX0FFQzsKKwlzdHJ1Y3QgU3ludGF4SW5mb0NvbnRleHRzX3MgICpzeW5fY3R4OworfTsKKy8qIHN0YXRpYyBpbnQzMl90IGFsZlBhckFsbGNvYXRlZCA9IDA7ICovCisKKy8qIGlucHV0IHBhcmFtZXRlcnMgZnJvbSBjb25maWd1cmF0aW9uIGZpbGUgKi8KK3N0cnVjdCBpbnBfcGFyIHsKKwlpbnQzMl90ICAgYnVmX2N5Y2xlOyAgICAgICAgICAgICAgICAgLyogPCEgRnJhbWUgYnVmZmVyIHNpemUgKi8KKwlpbnQzMl90ICAgcmVmX3BpY19vcmRlcjsgICAgICAgICAgICAgLyogPCEgcmVmIG9yZGVyICovCisJaW50MzJfdCAgIG91dHB1dF9kZWNfcGljOyAgICAgICAgICAgIC8qIDwhIG91dHB1dF9kZWNfcGljICovCisJaW50MzJfdCAgIHByb2ZpbGVfaWQ7CisJaW50MzJfdCAgIGxldmVsX2lkOworCWludDMyX3QgICBjaHJvbWFfZm9ybWF0OworCWludDMyX3QgICBnX3VpTWF4U2l6ZUluQml0OworCWludDMyX3QgICBhbHBoYV9jX29mZnNldDsKKwlpbnQzMl90ICAgYmV0YV9vZmZzZXQ7CisJaW50MzJfdCAgIHVzZU5TUVQ7CisjaWYgTUJfRFFQCisJaW50MzJfdCAgIHVzZURRUDsKKyNlbmRpZgorCWludDMyX3QgICB1c2VTRElQOworCWludDMyX3Qgc2FvX2VuYWJsZTsKKyNpZiBNMzQ4MF9URU1QT1JBTF9TQ0FMQUJMRQorCWludDMyX3QgdGVtcG9yYWxfaWRfZXhpc3RfZmxhZzsKKyNlbmRpZgorCWludDMyX3QgYWxmX2VuYWJsZTsKKworCWludDMyX3QgY3Jvc3NTbGljZUxvb3BGaWx0ZXI7CisKKwlpbnQzMl90ICAgc2FtcGxlX2JpdF9kZXB0aDsgIC8qIHNhbXBsZSBiaXQgZGVwdGggKi8KKyAgLyogZGVjb2RlZCBmaWxlIGJpdCBkZXB0aCAoYXNzdW1pbmcgb3V0cHV0X2JpdF9kZXB0aCBpcworICBsZXNzIG9yIGVxdWFsIHRvIHNhbXBsZV9iaXRfZGVwdGgpICovCisJaW50MzJfdCAgIG91dHB1dF9iaXRfZGVwdGg7CisKKworCWludDMyX3QgTUQ1RW5hYmxlOworCisjaWYgT1VUUFVUX0lOVEVSTEFDRV9NRVJHRURfUElDCisJaW50MzJfdCBvdXRwdXRfaW50ZXJsYWNlX21lcmdlZF9waWN0dXJlOworI2VuZGlmCisKK307CisKKy8qIGV4dGVybiBzdHJ1Y3QgaW5wX3BhciAqaW5wdXQ7ICovCisKK3N0cnVjdCBvdXRkYXRhX3MgeworI2lmIFJEMTcwX0ZJWF9CRworCXN0cnVjdCBTVERPVVRfREFUQV9zIHN0ZG91dGRhdGFbUkVGX01BWEJVRkZFUl07CisjZWxzZQorCXN0cnVjdCBTVERPVVRfREFUQV9zIHN0ZG91dGRhdGFbOF07CisjZW5kaWYKKwlpbnQzMl90ICAgICAgICAgYnVmZmVyX251bTsKK307CisvKiBvdXRkYXRhIG91dHByaW50OyAqLworCisjZGVmaW5lIFBBWUxPQURfVFlQRV9JREVSUCA4CisKK3N0cnVjdCBCaXRzdHJlYW1fcyAqQWxsb2NCaXRzdHJlYW0odm9pZCk7Cit2b2lkIEZyZWVCaXRzdHJlYW0odm9pZCk7CisjaWYgVFJBQ0UKK3ZvaWQgdHJhY2ViaXRzMihjb25zdCBpbnQ4X3QgKnRyYWNlX3N0ciwgaW50MzJfdCBsZW4sIGludDMyX3QgaW5mbyk7CisjZW5kaWYKKworLyogaW50MzJfdCAgIGRpcmVjdF9tdls0NV1bODBdWzRdWzRdWzNdOyAvLyBvbmx5IHRvIHZlcmlmeSByZXN1bHQgKi8KKworI2RlZmluZSBJX1BJQ1RVUkVfU1RBUlRfQ09ERSAgICAweEIzCisjZGVmaW5lIFBCX1BJQ1RVUkVfU1RBUlRfQ09ERSAgIDB4QjYKKyNkZWZpbmUgU0xJQ0VfU1RBUlRfQ09ERV9NSU4gICAgMHgwMAorI2RlZmluZSBTTElDRV9TVEFSVF9DT0RFX01BWCAgICAweDhGCisjZGVmaW5lIFVTRVJfREFUQV9TVEFSVF9DT0RFICAgIDB4QjIKKyNkZWZpbmUgU0VRVUVOQ0VfSEVBREVSX0NPREUgICAgMHhCMAorI2RlZmluZSBFWFRFTlNJT05fU1RBUlRfQ09ERSAgICAweEI1CisjZGVmaW5lIFNFUVVFTkNFX0VORF9DT0RFICAgICAgIDB4QjEKKyNkZWZpbmUgVklERU9fRURJVF9DT0RFICAgICAgICAgMHhCNworCisKKyNkZWZpbmUgU0VRVUVOQ0VfRElTUExBWV9FWFRFTlNJT05fSUQgICAgICAgICAgICAyCisjZGVmaW5lIENPUFlSSUdIVF9FWFRFTlNJT05fSUQgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBDQU1FUkFQQVJBTUVURVJTX0VYVEVOU0lPTl9JRCAgICAgICAgICAgIDExCisjZGVmaW5lIFBJQ1RVUkVfRElTUExBWV9FWFRFTlNJT05fSUQgICAgICAgICAgICAgNworI2lmIE0zNDgwX1RFTVBPUkFMX1NDQUxBQkxFCisjZGVmaW5lIFRFTVBPUkFMX1NDQUxBQkxFX0VYVEVOU0lPTl9JRCAgICAgICAgICAgMworI2VuZGlmCisKKyNpZiBST0lfTTMyNjQKKyNpZiBSRDE1MDFfRklYX0JHCisjZGVmaW5lIExPQ0FUSU9OX0RBVEFfRVhURU5TSU9OX0lEICAgICAgICAgICAgICAgMTIKKyNlbHNlCisjZGVmaW5lIExPQ0FUSU9OX0RBVEFfRVhURU5TSU9OX0lEICAgICAgICAgICAgICAgMTUKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBBVlMyX0hEUl9ITFMKKyNkZWZpbmUgTUFTVEVSSU5HX0RJU1BMQVlfQU5EX0NPTlRFTlRfTUVUQURBVEFfRVhURU5TSU9OICAgICAxMAorI2VuZGlmCisKK3ZvaWQgbWFsbG9jX3NsaWNlKHZvaWQpOwordm9pZCBmcmVlX3NsaWNlKHZvaWQpOworCisKK3ZvaWQgcmVhZF9pcHJlZF9tb2Rlcyh2b2lkKTsKKworaW50MzJfdCAgQUVDX3N0YXJ0Y29kZV9mb2xsb3dzKGludDMyX3QgZW9zX2JpdCk7CisKKy8qIGV4dGVybiB1aW50MzJfdCBtYXhfdmFsdWVfczsgKi8KKworLypDb21BZGFwdGl2ZUxvb3BGaWx0ZXIuaCovCisjZGVmaW5lIEFMRl9NQVhfTlVNX0NPRUYgICAgICAgOQorI2RlZmluZSBOT19WQVJfQklOUyAgICAgICAgICAgIDE2CisKKworI2RlZmluZSBSUE1fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAKKyNkZWZpbmUgQUxGX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgwCisjZGVmaW5lIFJQTV9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDI4MAorCit1bmlvbiBwYXJhbV91IHsKKwlzdHJ1Y3QgeworCQl1aW50MTZfdCBkYXRhW1JQTV9FTkQgLSBSUE1fQkVHSU5dOworCX0gbDsKKwlzdHJ1Y3QgeworCQkvKnNlcXVlbmNlKi8KKwkJdWludDE2X3QgcHJvZmlsZV9pZDsKKwkJdWludDE2X3QgbGV2ZWxfaWQ7CisJCXVpbnQxNl90IHByb2dyZXNzaXZlX3NlcXVlbmNlOworCQl1aW50MTZfdCBpc19maWVsZF9zZXF1ZW5jZTsKKwkJdWludDE2X3QgaG9yaXpvbnRhbF9zaXplOworCQl1aW50MTZfdCB2ZXJ0aWNhbF9zaXplOworCQl1aW50MTZfdCBjaHJvbWFfZm9ybWF0OworCQl1aW50MTZfdCBzYW1wbGVfcHJlY2lzaW9uOworCQl1aW50MTZfdCBlbmNvZGluZ19wcmVjaXNpb247CisJCXVpbnQxNl90IGFzcGVjdF9yYXRpb19pbmZvcm1hdGlvbjsKKwkJdWludDE2X3QgZnJhbWVfcmF0ZV9jb2RlOworCQl1aW50MTZfdCBiaXRfcmF0ZV9sb3dlcjsKKwkJdWludDE2X3QgYml0X3JhdGVfdXBwZXI7CisJCXVpbnQxNl90IGxvd19kZWxheTsKKwkJdWludDE2X3QgdGVtcG9yYWxfaWRfZXhpc3RfZmxhZzsKKwkJdWludDE2X3QgZ191aU1heFNpemVJbkJpdDsKKworI2RlZmluZSBCQUNLR1JPVU5EX1BJQ1RVUkVfRElTQUJMRV9CSVQgICAgICAgICAxMQorI2RlZmluZSBCX01IUFNLSVBfRU5BQkxFRF9CSVQgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBESFBfRU5BQkxFRF9CSVQgICAgICAgICAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBXU01fRU5BQkxFRF9CSVQgICAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIElOVEVSX0FNUF9FTkFCTEVfQklUICAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgVVNFTlNRVF9CSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBVU0VTRElQX0JJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIEJfU0VDVF9FTkFCTEVEX0JJVCAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgU0FPX0VOQUJMRV9CSVQgICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBBTEZfRU5BQkxFX0JJVCAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEJfUE1WUl9FTkFCTEVEX0JJVCAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1JPU1NTTElDRUxPT1BGSUxURVJfQklUICAgICAgICAgICAgICAgMAorCQl1aW50MTZfdCBhdnMyX3NlcV9mbGFnczsKKworCQl1aW50MTZfdCBudW1fb2ZfUlBTOworCQl1aW50MTZfdCBwaWN0dXJlX3Jlb3JkZXJfZGVsYXk7CisJCS8qUElDKi8KKwkJdWludDE2X3QgdGltZV9jb2RlX2ZsYWc7CisJCXVpbnQxNl90IHRpbWVfY29kZTsKKwkJdWludDE2X3QgYmFja2dyb3VuZF9waWN0dXJlX2ZsYWc7CisJCXVpbnQxNl90IGJhY2tncm91bmRfcGljdHVyZV9vdXRwdXRfZmxhZzsKKwkJdWludDE2X3QgY29kaW5nX29yZGVyOworCQl1aW50MTZfdCBjdXJfbGF5ZXI7CisJCXVpbnQxNl90IGRpc3BsYXlkZWxheTsgLyo/Pz8qLworCQl1aW50MTZfdCBwcmVkaWN0OyAgICAgLyo/Pz8qLworCQl1aW50MTZfdCBSUFNfaWR4OyAgICAgIC8qPz8/Ki8KKwkJdWludDE2X3QgcmVmZXJkX2J5X290aGVyc19jdXI7CisJCXVpbnQxNl90IG51bV9vZl9yZWZfY3VyOworCQl1aW50MTZfdCByZWZfcGljX2N1cls4XTsKKwkJdWludDE2X3QgbnVtX3RvX3JlbW92ZV9jdXI7CisJCXVpbnQxNl90IHJlbW92ZV9waWNfY3VyWzhdOworCQl1aW50MTZfdCBwcm9ncmVzc2l2ZV9mcmFtZTsKKwkJdWludDE2X3QgcGljdHVyZV9zdHJ1Y3R1cmU7CisJCXVpbnQxNl90IHRvcF9maWVsZF9maXJzdDsKKwkJdWludDE2X3QgcmVwZWF0X2ZpcnN0X2ZpZWxkOworCQl1aW50MTZfdCBpc190b3BfZmllbGQ7CisKKwkJdWludDE2X3QgcGljdHVyZV9jb2RpbmdfdHlwZTsKKwkJdWludDE2X3QgYmFja2dyb3VuZF9wcmVkX2ZsYWc7CisJCXVpbnQxNl90IGJhY2tncm91bmRfcmVmZXJlbmNlX2VuYWJsZTsKKwkJdWludDE2X3QgcmFuZG9tX2FjY2Vzc19kZWNvZGFibGVfZmxhZzsKKwkJdWludDE2X3QgbGN1X3NpemU7CisJCXVpbnQxNl90IGFscGhhX2Nfb2Zmc2V0OworCQl1aW50MTZfdCBiZXRhX29mZnNldDsKKwkJdWludDE2X3QgY2hyb21hX3F1YW50X3BhcmFtX2RlbHRhX2NiOworCQl1aW50MTZfdCBjaHJvbWFfcXVhbnRfcGFyYW1fZGVsdGFfY3I7CisJCXVpbnQxNl90IGxvb3BfZmlsdGVyX2Rpc2FibGU7CisKKwkJdWludDE2X3QgdmlkZW9fc2lnbmFsX3R5cGU7CisJCXVpbnQxNl90IGNvbG9yX2Rlc2NyaXB0aW9uOworCQl1aW50MTZfdCBkaXNwbGF5X3ByaW1hcmllc194WzNdOworCQl1aW50MTZfdCBkaXNwbGF5X3ByaW1hcmllc195WzNdOworCQl1aW50MTZfdCB3aGl0ZV9wb2ludF94OworCQl1aW50MTZfdCB3aGl0ZV9wb2ludF95OworCQl1aW50MTZfdCBtYXhfZGlzcGxheV9tYXN0ZXJpbmdfbHVtaW5hbmNlOworCQl1aW50MTZfdCBtaW5fZGlzcGxheV9tYXN0ZXJpbmdfbHVtaW5hbmNlOworCQl1aW50MTZfdCBtYXhfY29udGVudF9saWdodF9sZXZlbDsKKwkJdWludDE2X3QgbWF4X3BpY3R1cmVfYXZlcmFnZV9saWdodF9sZXZlbDsKKwl9IHA7CisJc3RydWN0IHsKKwkJdWludDE2X3QgcGFkZGluZ1tBTEZfQkVHSU4gLSBSUE1fQkVHSU5dOworCQl1aW50MTZfdCBwaWN0dXJlX2FsZl9lbmFibGVfWTsKKwkJdWludDE2X3QgcGljdHVyZV9hbGZfZW5hYmxlX0NiOworCQl1aW50MTZfdCBwaWN0dXJlX2FsZl9lbmFibGVfQ3I7CisJCXVpbnQxNl90IGFsZl9maWx0ZXJzX251bV9tXzE7CisJCXVpbnQxNl90IHJlZ2lvbl9kaXN0YW5jZVsxNl07CisJCXVpbnQxNl90IGFsZl9jYl9jb2VmZm11bHRpWzldOworCQl1aW50MTZfdCBhbGZfY3JfY29lZmZtdWx0aVs5XTsKKwkJdWludDE2X3QgYWxmX3lfY29lZmZtdWx0aVsxNl1bOV07CisJfSBhbGY7Cit9OworCisKK3N0cnVjdCBhdnMyX2RlY29kZXIgeworCXVpbnQ4X3QgaW5pdF9od19mbGFnOworCXN0cnVjdCBpbnBfcGFyICAgaW5wdXQ7CisJc3RydWN0IEltYWdlUGFyYW1ldGVyc19zICBpbWc7CisJc3RydWN0IFZpZGVvX0NvbV9kYXRhX3MgIGhjOworCXN0cnVjdCBWaWRlb19EZWNfZGF0YV9zICBoZDsKKwl1bmlvbiBwYXJhbV91IHBhcmFtOworCXN0cnVjdCBhdnMyX2ZyYW1lX3MgZnJtX3Bvb2xbQVZTMl9NQVhfQlVGRkVSX05VTV07CisJc3RydWN0IGF2czJfZnJhbWVfcyAqZnJlZltSRUZfTUFYQlVGRkVSXTsKKyNpZmRlZiBBTUwKKwkvKnVzZWQgZm9yIGJhY2tncm91bmQKKwl3aGVuIGJhY2tncm91bmRfcGljdHVyZV9vdXRwdXRfZmxhZyBpcyAwKi8KKwlzdHJ1Y3QgYXZzMl9mcmFtZV9zICptX2JnOworCS8qY3VycmVudCBiYWNrZ3JvdW5kIHBpY3R1cmUsIGV0aGVyIG1fYmcgb3IgZnJlZlsuLl0qLworCXN0cnVjdCBhdnMyX2ZyYW1lX3MgKmZfYmc7CisjZW5kaWYKKwlzdHJ1Y3Qgb3V0ZGF0YV9zIG91dHByaW50OworCXVpbnQzMl90IGNtX2hlYWRlcl9zdGFydDsKKwlzdHJ1Y3QgQUxGUGFyYW1fcyBtX2FsZlBpY3R1cmVQYXJhbVtOVU1fQUxGX0NPTVBPTkVOVF07CisjaWZkZWYgRklYX0NIUk9NQV9GSUVMRF9NVl9CS19ESVNUCisJaW50OF90IGJrX2ltZ19pc190b3BfZmllbGQ7CisjZW5kaWYKKyNpZmRlZiBBTUwKKwlpbnQzMl90IGxjdV9zaXplOworCWludDMyX3QgbGN1X3NpemVfbG9nMjsKKwlpbnQzMl90IGxjdV94X251bTsKKwlpbnQzMl90IGxjdV95X251bTsKKwlpbnQzMl90IGxjdV90b3RhbDsKKwlpbnQzMl90IHJlZl9tYXhidWZmZXI7CisJaW50MzJfdCB0b19wcmVwYXJlX2Rpc3BfY291bnQ7CisJaW50OF90IGJ1Zm1ncl9lcnJvcl9mbGFnOworI2VuZGlmCit9OworCisKK2V4dGVybiB2b2lkIHdyaXRlX2ZyYW1lKHN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjLCBpbnQzMl90IHBvcyk7CitleHRlcm4gdm9pZCBpbml0X2ZyYW1lX3Qoc3RydWN0IGF2czJfZnJhbWVfcyAqY3VycmZyZWYpOworZXh0ZXJuIHZvaWQgcmVwb3J0X2ZyYW1lKHN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjLAorCXN0cnVjdCBvdXRkYXRhX3MgKmRhdGEsIGludDMyX3QgcG9zKTsKKworZXh0ZXJuIGludCBhdnMyX3Bvc3RfcHJvY2VzcyhzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYyk7CitleHRlcm4gdm9pZCBhdnMyX3ByZXBhcmVfaGVhZGVyKHN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjLAorCWludDMyX3Qgc3RhcnRfY29kZSk7CitleHRlcm4gaW50MzJfdCBhdnMyX3Byb2Nlc3NfaGVhZGVyKHN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjKTsKKworZXh0ZXJuIHZvaWQgaW5pdF9hdnMyX2RlY29kZXIoc3RydWN0IGF2czJfZGVjb2RlciAqYXZzMl9kZWMpOworCitleHRlcm4gaW50MzJfdCBhdnMyX2luaXRfZ2xvYmFsX2J1ZmZlcnMoc3RydWN0IGF2czJfZGVjb2RlciAqYXZzMl9kZWMpOworCitleHRlcm4gYm9vbCBpc19hdnMyX3ByaW50X3BhcmFtKHZvaWQpOworZXh0ZXJuIGJvb2wgaXNfYXZzMl9wcmludF9idWZtZ3JfZGV0YWlsKHZvaWQpOworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9hdnMyL3ZhdnMyLmMgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvYXZzMi92YXZzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMWRjNTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvYXZzMi92YXZzMi5jCkBAIC0wLDAgKzEsODYyMyBAQAorIC8qCisgKiBkcml2ZXJzL2FtbG9naWMvYW1wb3J0cy9hdnMyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL2Ftc3RyZWFtLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy92Zm9ybWF0Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9mcmFtZV9zeW5jL3B0c3NlcnYuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2ZyYW1lX3N5bmMvdHN5bmMuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NhbnZhcy9jYW52YXMuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWVfcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWVfcmVjZWl2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1jb250aWd1b3VzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorLy8jaW5jbHVkZSA8bGludXgvYW1sb2dpYy90ZWUuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L3RlZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkL2Nsb2NrLmg+CisjaW5jbHVkZSAiLi4vLi4vLi4vc3RyZWFtX2lucHV0L2FtcG9ydHMvYW1wb3J0c19wcml2LmgiCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jb2RlY19tbS9jb2RlY19tbS5oPgorI2luY2x1ZGUgIi4uL3V0aWxzL2RlY29kZXJfbW11X2JveC5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2RlY29kZXJfYm1tdV9ib3guaCIKKyNpbmNsdWRlICJhdnMyX2dsb2JhbC5oIgorCisjZGVmaW5lIE1FTV9OQU1FICJjb2RlY19hdnMyIgorLyogI2luY2x1ZGUgPG1hY2gvYW1fcmVncy5oPiAqLworI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmRlY19yZWcuaD4KKyNpbmNsdWRlICIuLi91dGlscy92ZGVjLmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvYW12ZGVjLmgiCisKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZpZGVvX3NpbmsvdmlkZW8uaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvbmZpZ3MuaD4KKyNpbmNsdWRlICIuLi91dGlscy9jb25maWdfcGFyc2VyLmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvZmlybXdhcmUuaCIKKyNpbmNsdWRlICIuLi8uLi8uLi9jb21tb24vY2hpcHMvZGVjb2Rlcl9jcHVfdmVyX2luZm8uaCIKKyNpbmNsdWRlICIuLi91dGlscy92ZGVjX2ZlYXR1cmUuaCIKKworI2RlZmluZSBJX09OTFlfU1VQUE9SVAorI2RlZmluZSBNSVhfU1RSRUFNX1NVUFBPUlQKKyNkZWZpbmUgQ09OU1RSQUlOX01BWF9CVUZfTlVNCisKKyNkZWZpbmUgQ09fTVZfQ09NUFJFU1MKKworI2luY2x1ZGUgInZhdnMyLmgiCisjZGVmaW5lIEhFVkNfU0hJRlRfTEVOR1RIX1BST1RFQ1QgICAgICAgICAgICAgICAgICAweDMxM2EKKyNkZWZpbmUgSEVWQ19NUFJFRF9DVFJMNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzI0YworI2RlZmluZSBIRVZDX01QUkVEX0NUUkw5ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMjViCisjZGVmaW5lIEhFVkNfREJMS19DRkdEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM1MGQKKyNkZWZpbmUgSEVWQ19DTV9IRUFERVJfU1RBUlRfQUREUiAgICAgICAgICAgICAgICAgIDB4MzYyOAorI2RlZmluZSBIRVZDX0RCTEtfQ0ZHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNTBiCisjZGVmaW5lIEhFVkNEX01QUF9BTkMyQVhJX1RCTF9EQVRBICAgICAgICAgICAgICAgICAweDM0NjQKKyNkZWZpbmUgSEVWQ19TQU9fTU1VX1ZIMV9BRERSICAgICAgICAgICAgICAgICAgICAgIDB4MzYzYgorI2RlZmluZSBIRVZDX1NBT19NTVVfVkgwX0FERFIgICAgICAgICAgICAgICAgICAgICAgMHgzNjNhCisKKyNkZWZpbmUgSEVWQ19DTV9CT0RZX0xFTkdUSDIgICAgICAgICAgICAgICAgICAgICAgIDB4MzY2MworI2RlZmluZSBIRVZDX0NNX0hFQURFUl9PRkZTRVQyICAgICAgICAgICAgICAgICAgICAgMHgzNjY0CisjZGVmaW5lIEhFVkNfQ01fSEVBREVSX0xFTkdUSDIgICAgICAgICAgICAgICAgICAgICAweDM2NjUKKworI2RlZmluZSBIRVZDX0FTU0lTVF9NTVVfTUFQX0FERFIgICAgICAgICAgICAgICAgICAgMHgzMDA5CisKKyNkZWZpbmUgSEVWQ19DTV9IRUFERVJfU1RBUlRfQUREUiAgICAgICAgICAgICAgICAgIDB4MzYyOAorI2RlZmluZSBIRVZDX0NNX0hFQURFUl9TVEFSVF9BRERSMiAgICAgICAgICAgICAgICAgMHgzNjRhCisjZGVmaW5lIEhFVkNfU0FPX01NVV9WSDFfQUREUiAgICAgICAgICAgICAgICAgICAgICAweDM2M2IKKyNkZWZpbmUgSEVWQ19TQU9fTU1VX1ZIMF9BRERSICAgICAgICAgICAgICAgICAgICAgIDB4MzYzYQorI2RlZmluZSBIRVZDX1NBT19NTVVfVkgwX0FERFIyICAgICAgICAgICAgICAgICAgICAgMHgzNjRkCisjZGVmaW5lIEhFVkNfU0FPX01NVV9WSDFfQUREUjIgICAgICAgICAgICAgICAgICAgICAweDM2NGUKKworI2RlZmluZSBIRVZDX1NBT19NTVVfRE1BX0NUUkwyICAgICAgICAgICAgICAgICAgICAgMHgzNjRjCisjZGVmaW5lIEhFVkNfU0FPX01NVV9TVEFUVVMyICAgICAgICAgICAgICAgICAgICAgICAweDM2NTAKKyNkZWZpbmUgSEVWQ19EV19WSDBfQURERFIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzY1ZQorI2RlZmluZSBIRVZDX0RXX1ZIMV9BREREUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNjVmCisKKyNkZWZpbmUgSEVWQ19TQU9fQ1RSTDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzYyZAorCisKKworLyoKKyAqIEFWUzJfREVDX1NUQVRVUyBkZWZpbmUKKyovCisvKmludGVybmFsKi8KKyNkZWZpbmUgQVZTMl9ERUNfSURMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVZTMl9TRVFVRU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVZTMl9JX1BJQ1RVUkUgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVZTMl9QQl9QSUNUVVJFICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQVZTMl9ESVNDQVJEX1NUQVJUQ09ERSAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQVZTMl9ESVNDQVJEX05BTCAgICAgICAgICAgICAgICAgICAgICAgIDQKKworI2RlZmluZSBBVlMyX1NMSUNFX0RFQ09ESU5HICAgICAgICAgICAgICAgICAgICAgNgorCisjZGVmaW5lIFNXQVBfSU5fQ01EICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIFNXQVBfT1VUX0NNRCAgICAgICAgICAgICAgICAgICAgICAgICAweDExCisjZGVmaW5lIFNXQVBfT1VUSU5fQ01EICAgICAgICAgICAgICAgICAgICAgICAweDEyCisjZGVmaW5lIFNXQVBfRE9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEzCisjZGVmaW5lIFNXQVBfUE9TVF9JTklUICAgICAgICAgICAgICAgICAgICAgICAweDE0CisKKy8qaGVhZCovCisjZGVmaW5lIEFWUzJfSEVBRF9TRVFfUkVBRFkgICAgICAgICAgICAgICAgICAweDIxCisjZGVmaW5lIEFWUzJfSEVBRF9QSUNfSV9SRUFEWSAgICAgICAgICAgICAgICAweDIyCisjZGVmaW5lIEFWUzJfSEVBRF9QSUNfUEJfUkVBRFkgICAgICAgICAgICAgICAweDIzCisjZGVmaW5lIEFWUzJfSEVBRF9TRVFfRU5EX1JFQURZICAgICAgICAgICAgICAweDI0CisjZGVmaW5lIEFWUzJfU1RBUlRDT0RFX1NFQVJDSF9ET05FICAgICAgICAgICAweDI1CisKKy8qcGljIGRvbmUqLworI2RlZmluZSBIRVZDX0RFQ1BJQ19EQVRBX0RPTkUgICAgICAgMHgzMAorI2RlZmluZSBIRVZDX0RFQ1BJQ19EQVRBX0VSUk9SICAgICAgMHgzMQorI2RlZmluZSBIRVZDX05BTF9ERUNPREVfRE9ORSAgICAgICAgMHgzMgorI2RlZmluZSBBVlMyX0RFQ09ERV9CVUZFTVBUWSAgICAgICAgMHgzMworI2RlZmluZSBBVlMyX0RFQ09ERV9USU1FT1VUICAgICAgICAgMHgzNAorI2RlZmluZSBBVlMyX0RFQ09ERV9PVkVSX1NJWkUgICAgICAgMHgzNQorI2RlZmluZSBBVlMyX0VPUyAgICAgICAgICAgICAgICAgICAgMHgzNgorCisvKmNtZCovCisjZGVmaW5lIEFWUzJfMTBCX0RJU0NBUkRfTkFMICAgICAgICAgICAgICAgICAweGYwCisjZGVmaW5lIEFWUzJfU0VBUkNIX05FV19QSUMgICAgICAgICAgICAgICAgICAweGYxCisjZGVmaW5lIEFWUzJfQUNUSU9OX0VSUk9SICAgICAgICAgICAgICAgICAgICAweGZlCisjZGVmaW5lIEhFVkNfQUNUSU9OX0VSUk9SICAgICAgICAgICAgICAgICAgICAweGZlCisjZGVmaW5lIEFWUzJfQUNUSU9OX0RPTkUgICAgICAgICAgICAgICAgICAgICAweGZmCisvKkFWUzJfREVDX1NUQVRVUyBlbmQqLworCisKKyNkZWZpbmUgVkZfUE9PTF9TSVpFICAgICAgICAzMgorCisjdW5kZWYgcHJfaW5mbworI2RlZmluZSBwcl9pbmZvIHByaW50aworCisjZGVmaW5lIERFQ09ERV9NT0RFX1NJTkdMRQkJCQkoMCB8ICgweDgwIDw8IDI0KSkKKyNkZWZpbmUgREVDT0RFX01PREVfTVVMVElfU1RSRUFNQkFTRQkoMSB8ICgweDgwIDw8IDI0KSkKKyNkZWZpbmUgREVDT0RFX01PREVfTVVMVElfRlJBTUVCQVNFCQkoMiB8ICgweDgwIDw8IDI0KSkKKworCisjZGVmaW5lICBWUDlfVFJJR0dFUl9GUkFNRV9ET05FCQkweDEwMAorI2RlZmluZSAgVlA5X1RSSUdHRVJfRlJBTUVfRU5BQkxFCTB4MjAwCisKKy8qI2RlZmluZSBNVl9NRU1fVU5JVCAweDI0MCovCisjZGVmaW5lIE1WX01FTV9VTklUIDB4MjAwCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEluY2x1ZGUgInBhcnNlcl9jbWQuaCIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFBBUlNFUl9DTURfU0tJUF9DRkdfMCAweDAwMDAwOTBiCisKKyNkZWZpbmUgUEFSU0VSX0NNRF9TS0lQX0NGR18xIDB4MWIxNDE0MGYKKworI2RlZmluZSBQQVJTRVJfQ01EX1NLSVBfQ0ZHXzIgMHgwMDFiMTkxMAorCisKKyNkZWZpbmUgUEFSU0VSX0NNRF9OVU1CRVIgMzcKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHBhcnNlcl9jbWRbUEFSU0VSX0NNRF9OVU1CRVJdID0geworMHgwNDAxLAorMHg4NDAxLAorMHgwODAwLAorMHgwNDAyLAorMHg5MDAyLAorMHgxNDIzLAorMHg4Q0MzLAorMHgxNDIzLAorMHg4ODA0LAorMHg5ODI1LAorMHgwODAwLAorMHgwNEZFLAorMHg4NDA2LAorMHg4NDExLAorMHgxODAwLAorMHg4NDA4LAorMHg4NDA5LAorMHg4QzJBLAorMHg5QzJCLAorMHgxQzAwLAorMHg4NDBGLAorMHg4NDA3LAorMHg4MDAwLAorMHg4NDA4LAorMHgyMDAwLAorMHhBODAwLAorMHg4NDEwLAorMHgwNERFLAorMHg4NDBDLAorMHg4NDBELAorMHhBQzAwLAorMHhBMDAwLAorMHgwOEMwLAorMHgwOEUwLAorMHhBNDBFLAorMHhGQzAwLAorMHg3QzAwCit9OworCitzdGF0aWMgaW50MzJfdCBnX1dxTURlZmF1bHQ0eDRbMTZdID0geworCTY0LCAgICAgNjQsICAgICA2NCwgICAgIDY4LAorCTY0LCAgICAgNjQsICAgICA2OCwgICAgIDcyLAorCTY0LCAgICAgNjgsICAgICA3NiwgICAgIDgwLAorCTcyLCAgICAgNzYsICAgICA4NCwgICAgIDk2Cit9OworCisKK3N0YXRpYyBpbnQzMl90IGdfV3FNRGVmYXVsdDh4OFs2NF0gPSB7CisJNjQsICAgICA2NCwgICAgIDY0LCAgICAgNjQsICAgICA2OCwgICAgIDY4LCAgICAgNzIsICAgICA3NiwKKwk2NCwgICAgIDY0LCAgICAgNjQsICAgICA2OCwgICAgIDcyLCAgICAgNzYsICAgICA4NCwgICAgIDkyLAorCTY0LCAgICAgNjQsICAgICA2OCwgICAgIDcyLCAgICAgNzYsICAgICA4MCwgICAgIDg4LCAgICAgMTAwLAorCTY0LCAgICAgNjgsICAgICA3MiwgICAgIDgwLCAgICAgODQsICAgICA5MiwgICAgIDEwMCwgICAgMTEyLAorCTY4LCAgICAgNzIsICAgICA4MCwgICAgIDg0LCAgICAgOTIsICAgICAxMDQsICAgIDExMiwgICAgMTI4LAorCTc2LCAgICAgODAsICAgICA4NCwgICAgIDkyLCAgICAgMTA0LCAgICAxMTYsICAgIDEzMiwgICAgMTUyLAorCTk2LCAgICAgMTAwLCAgICAxMDQsICAgIDExNiwgICAgMTI0LCAgICAxNDAsICAgIDE2NCwgICAgMTg4LAorCTEwNCwgICAgMTA4LCAgICAxMTYsICAgIDEyOCwgICAgMTUyLCAgICAxNzIsICAgIDE5MiwgICAgMjE2Cit9OworLyojZGVmaW5lIEhFVkNfUElDX1NUUlVDVF9TVVBQT1JUKi8KKy8qIHRvIHJlbW92ZSwgZml4IGJ1aWxkIGVycm9yICovCisKKy8qI2RlZmluZSBDT0RFQ19NTV9GTEFHU19GT1JfVkRFQ09ERVIgIDAqLworCisjZGVmaW5lIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKy8qICNkZWZpbmUgRVJST1JfSEFORExFX0RFQlVHICovCisKKyNpZm5kZWYgU1RBVF9LVEhSRUFECisjZGVmaW5lIFNUQVRfS1RIUkVBRCAweDQwCisjZW5kaWYKKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKyNkZWZpbmUgTUFYX0RFQ09ERV9JTlNUQU5DRV9OVU0gICAgIDEyCisjZGVmaW5lIE1VTFRJX0RSSVZFUl9OQU1FICJhbW12ZGVjX2F2czIiCisKKyNkZWZpbmUgbG9ja19idWZmZXIoZGVjLCBmbGFncykgXAorCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGVjLT5idWZmZXJfbG9jaywgZmxhZ3MpCisKKyNkZWZpbmUgdW5sb2NrX2J1ZmZlcihkZWMsIGZsYWdzKSBcCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlYy0+YnVmZmVyX2xvY2ssIGZsYWdzKQorCitzdGF0aWMgdTMyIGRlYnVnX21hc2sgPSAweGZmZmZmZmZmOworI2RlZmluZSBnZXRfZGJnX2ZsYWcoZGVjKSAoKGRlYnVnX21hc2sgJiAoMSA8PCBkZWMtPmluZGV4KSkgPyBkZWJ1ZyA6IDApCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X2RlY29kZV9pbnN0YW5jZV9udW0KKwkJCQk9IE1BWF9ERUNPREVfSU5TVEFOQ0VfTlVNOworc3RhdGljIHVuc2lnbmVkIGludCBkZWNvZGVfZnJhbWVfY291bnRbTUFYX0RFQ09ERV9JTlNUQU5DRV9OVU1dOworc3RhdGljIHVuc2lnbmVkIGludCBkaXNwbGF5X2ZyYW1lX2NvdW50W01BWF9ERUNPREVfSU5TVEFOQ0VfTlVNXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X3Byb2Nlc3NfdGltZVtNQVhfREVDT0RFX0lOU1RBTkNFX05VTV07CitzdGF0aWMgdW5zaWduZWQgaW50IHJ1bl9jb3VudFtNQVhfREVDT0RFX0lOU1RBTkNFX05VTV07CitzdGF0aWMgdW5zaWduZWQgaW50IGlucHV0X2VtcHR5W01BWF9ERUNPREVfSU5TVEFOQ0VfTlVNXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm90X3J1bl9yZWFkeVtNQVhfREVDT0RFX0lOU1RBTkNFX05VTV07CisKK3N0YXRpYyB1MzIgZGVjb2RlX3RpbWVvdXRfdmFsID0gMjAwOworCitzdGF0aWMgaW50IHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwgPSAweDgwMDA7CisKK3N0YXRpYyB1MzIgd29ya19idWZfc2l6ZTsKKworc3RhdGljIHUzMiBtdl9idWZfbWFyZ2luOworc3RhdGljIGludCBwcmVfZGVjb2RlX2J1Zl9sZXZlbCA9IDB4MTAwMDsKK3N0YXRpYyB1MzIgYWdhaW5fdGhyZXNob2xkOworCisKKy8qIERPVUJMRV9XUklURV9NT0RFIGlzIGVuYWJsZWQgb25seSB3aGVuIE5WMjEgOCBiaXQgb3V0cHV0IGlzIG5lZWRlZCAqLworLyogZG91YmxlX3dyaXRlX21vZGU6CisgKgkwLCBubyBkb3VibGUgd3JpdGU7CisgKgkxLCAxOjEgcmF0aW87CisgKgkyLCAoMS80KTooMS80KSByYXRpbzsKKyAqCTMsICgxLzQpOigxLzQpIHJhdGlvLCB3aXRoIGJvdGggY29tcHJlc3NlZCBmcmFtZSBpbmNsdWRlZAorICoJNCwgKDEvMik6KDEvMikgcmF0aW87CisgKgk4LCAoMS84KTooMS84KSByYXRpbzsKKyAqCTB4MTAsIGRvdWJsZSB3cml0ZSBvbmx5CisgKgkweDEwMCwgaWYgPiAxMDgwcCx1c2UgbW9kZSA0LGVsc2UgdXNlIG1vZGUgMTsKKyAqCTB4MjAwLCBpZiA+IDEwODBwLHVzZSBtb2RlIDIsZWxzZSB1c2UgbW9kZSAxOworICoJMHgzMDAsIGlmID4gNzIwcCwgdXNlIG1vZGUgNCwgZWxzZSB1c2UgbW9kZSAxOworICovCitzdGF0aWMgdTMyIGRvdWJsZV93cml0ZV9tb2RlOworc3RhdGljIHUzMiB3aXRob3V0X2Rpc3BsYXlfbW9kZTsKKworc3RhdGljIHUzMiBtdl9idWZfZHluYW1pY19hbGxvYzsKKworI2RlZmluZSBEUklWRVJfTkFNRSAiYW12ZGVjX2F2czIiCisjZGVmaW5lIERSSVZFUl9IRUFERVJfTkFNRSAiYW12ZGVjX2F2czJfaGVhZGVyIgorCisKKyNkZWZpbmUgUFVUX0lOVEVSVkFMICAgICAgICAoSFovMTAwKQorI2RlZmluZSBFUlJPUl9TWVNURU1fUkVTRVRfQ09VTlQgICAyMDAKKworI2RlZmluZSBQVFNfTk9STUFMICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUFRTX05PTkVfUkVGX1VTRV9EVVJBVElPTiAxCisKKyNkZWZpbmUgUFRTX01PREVfU1dJVENISU5HX1RIUkVTSE9MRCAgICAgICAgICAgMworI2RlZmluZSBQVFNfTU9ERV9TV0lUQ0hJTkdfUkVDT1ZFUllfVEhSRUFTSE9MRCAzCisKKyNkZWZpbmUgRFVSMlBUUyh4KSAoKHgpKjkwLzk2KQorCitzdHJ1Y3QgQVZTMkRlY29kZXJfczsKK3N0YXRpYyBpbnQgdmF2czJfdmZfc3RhdGVzKHN0cnVjdCB2ZnJhbWVfc3RhdGVzICpzdGF0ZXMsIHZvaWQgKik7CitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2YXZzMl92Zl9wZWVrKHZvaWQgKik7CitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2YXZzMl92Zl9nZXQodm9pZCAqKTsKK3N0YXRpYyB2b2lkIHZhdnMyX3ZmX3B1dChzdHJ1Y3QgdmZyYW1lX3MgKiwgdm9pZCAqKTsKK3N0YXRpYyBpbnQgdmF2czJfZXZlbnRfY2IoaW50IHR5cGUsIHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGVfZGF0YSk7CitzdGF0aWMgdm9pZCBzZXRfdmZyYW1lKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMsCisJc3RydWN0IHZmcmFtZV9zICp2Ziwgc3RydWN0IGF2czJfZnJhbWVfcyAqcGljLCB1OCBkdW1teSk7CisKK3N0YXRpYyBpbnQgdmF2czJfc3RvcChzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKTsKK3N0YXRpYyBzMzIgdmF2czJfaW5pdChzdHJ1Y3QgdmRlY19zICp2ZGVjKTsKK3N0YXRpYyB2b2lkIHZhdnMyX3Byb3RfaW5pdChzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKTsKK3N0YXRpYyBpbnQgdmF2czJfbG9jYWxfaW5pdChzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKTsKK3N0YXRpYyB2b2lkIHZhdnMyX3B1dF90aW1lcl9mdW5jKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcik7CitzdGF0aWMgdm9pZCBkdW1wX2RhdGEoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYywgaW50IHNpemUpOworc3RhdGljIHVuc2lnbmVkIGNoYXIgZ2V0X2RhdGFfY2hlY2tfc3VtCisJKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMsIGludCBzaXplKTsKK3N0YXRpYyB2b2lkIGR1bXBfcGljX2xpc3Qoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYyk7CisKK3N0YXRpYyBjb25zdCBjaGFyIHZhdnMyX2RlY19pZFtdID0gInZhdnMyLWRldiI7CisKKyNkZWZpbmUgUFJPVklERVJfTkFNRSAgICJkZWNvZGVyLmF2czIiCisjZGVmaW5lIE1VTFRJX0lOU1RBTkNFX1BST1ZJREVSX05BTUUgICAgInZkZWMuYXZzMiIKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2ZnJhbWVfb3BlcmF0aW9uc19zIHZhdnMyX3ZmX3Byb3ZpZGVyID0geworCS5wZWVrID0gdmF2czJfdmZfcGVlaywKKwkuZ2V0ID0gdmF2czJfdmZfZ2V0LAorCS5wdXQgPSB2YXZzMl92Zl9wdXQsCisJLmV2ZW50X2NiID0gdmF2czJfZXZlbnRfY2IsCisJLnZmX3N0YXRlcyA9IHZhdnMyX3ZmX3N0YXRlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3Byb3ZpZGVyX3MgdmF2czJfdmZfcHJvdjsKKworc3RhdGljIHUzMiBiaXRfZGVwdGhfbHVtYTsKK3N0YXRpYyB1MzIgYml0X2RlcHRoX2Nocm9tYTsKK3N0YXRpYyB1MzIgZnJhbWVfd2lkdGg7CitzdGF0aWMgdTMyIGZyYW1lX2hlaWdodDsKK3N0YXRpYyB1MzIgdmlkZW9fc2lnbmFsX3R5cGU7CitzdGF0aWMgdTMyIHB0c191bnN0YWJsZTsKK3N0YXRpYyB1MzIgb25fbm9fa2V5ZnJhbWVfc2tpcGVkOworCitzdGF0aWMgdTMyIGZvcmNlX3ZpZGVvX3NpZ25hbF90eXBlOworc3RhdGljIHUzMiBlbmFibGVfZm9yY2VfdmlkZW9fc2lnbmFsX3R5cGU7CisjZGVmaW5lIFZJREVPX1NJR05BTF9UWVBFX0FWQUlMQUJMRV9NQVNLCTB4MjAwMDAwMDAKKyNkZWZpbmUgSERSX0NVVkFfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZpZGVvX2Zvcm1hdF9uYW1lc1tdID0geworCSJjb21wb25lbnQiLCAiUEFMIiwgIk5UU0MiLCAiU0VDQU0iLAorCSJNQUMiLCAidW5zcGVjaWZpZWQiLCAiUmVzZXJ2ZWQiLCAiUmVzZXJ2ZWQiCit9OworCitzdGF0aWMgaW5saW5lIGludCBkaXZfcjMyKGludDY0X3QgbSwgaW50IG4pCit7CisvKgorcmV0dXJuIChpbnQpKG0vbikKKyovCisjaWZuZGVmIENPTkZJR19BUk02NAorCWludDY0X3QgcXUgPSAwOworCXF1ID0gZGl2X3M2NChtLCBuKTsKKwlyZXR1cm4gKGludClxdTsKKyNlbHNlCisJcmV0dXJuIChpbnQpKG0vbik7CisjZW5kaWYKK30KKworZW51bSB2cHhfYml0X2RlcHRoX3QgeworCUFWUzJfQklUU184ICA9ICA4LCAgLyoqPCAgOCBiaXRzICovCisJQVZTMl9CSVRTXzEwID0gMTAsICAvKio8IDEwIGJpdHMgKi8KKwlBVlMyX0JJVFNfMTIgPSAxMiwgIC8qKjwgMTIgYml0cyAqLworfTsKKworLypVU0VfQlVGX0JMT0NLKi8KK3N0cnVjdCBCVUZfcyB7CisJaW50IGluZGV4OworCXVuc2lnbmVkIGludCBhbGxvY19mbGFnOworCS8qYnVmZmVyICovCisJdW5zaWduZWQgaW50IGNtYV9wYWdlX2NvdW50OworCXVuc2lnbmVkIGxvbmcgYWxsb2NfYWRkcjsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X2FkcjsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCXVuc2lnbmVkIGludCBmcmVlX3N0YXJ0X2FkcjsKK30gLypCVUZfdCAqLzsKKworc3RydWN0IE1WQlVGX3MgeworCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRyOworCXVuc2lnbmVkIGludCBzaXplOworCWludCB1c2VkX2ZsYWc7Cit9IC8qTVZCVUZfdCAqLzsKKworCS8qICN1bmRlZiBCVUZNR1JfT05MWSB0byBlbmFibGUgaGFyZHdhcmUgY29uZmlndXJhdGlvbiAqLworCisvKiNkZWZpbmUgVEVTVF9XUl9QVFJfSU5DKi8KKyNkZWZpbmUgV1JfUFRSX0lOQ19OVU0gMTI4CisKKyNkZWZpbmUgU0lNVUxBVElPTgorI2RlZmluZSBET1NfUFJPSkVDVAorI3VuZGVmIE1FTU9SWV9NQVBfSU5fUkVBTF9DSElQCisKKy8qI3VuZGVmIERPU19QUk9KRUNUKi8KKy8qI2RlZmluZSBNRU1PUllfTUFQX0lOX1JFQUxfQ0hJUCovCisKKy8qI2RlZmluZSBCVUZGRVJfTUdSX09OTFkqLworLyojZGVmaW5lIENPTkZJR19IRVZDX0NMS19GT1JDRURfT04qLworLyojZGVmaW5lIEVOQUJMRV9TV0FQX1RFU1QqLworCisjaWZkZWYgQVZTMl8xMEJfTlYyMQorI2RlZmluZSBNRU1fTUFQX01PREUgMiAgLyogMDpsaW5lYXIgMTozMngzMiAyOjY0eDMyKi8KKyNlbHNlCisjZGVmaW5lIE1FTV9NQVBfTU9ERSAwICAvKiAwOmxpbmVhciAxOjMyeDMyIDI6NjR4MzIqLworI2VuZGlmCisKKyNpZmRlZiBBVlMyXzEwQl9OVjIxCisjZWxzZQorI2RlZmluZSBMT1NMRVNTX0NPTVBSRVNTX01PREUKKyNlbmRpZgorCisjZGVmaW5lIERPVUJMRV9XUklURV9ZU1RBUlRfVEVNUCAweDAyMDAwMDAwCisjZGVmaW5lIERPVUJMRV9XUklURV9DU1RBUlRfVEVNUCAweDAyOTAwMDAwCisKKyNkZWZpbmUgQVZTMl9EQkdfQlVGTUdSICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQVZTMl9EQkdfQlVGTUdSX01PUkUgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQVZTMl9EQkdfQlVGTUdSX0RFVEFJTCAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgQVZTMl9EQkdfSVJRX0VWRU5UICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgQVZTMl9EQkdfT1VUX1BUUyAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQVZTMl9EQkdfUFJJTlRfU09VUkNFX0xJTkUgICAgICAgIDB4MjAKKyNkZWZpbmUgQVZTMl9EQkdfUFJJTlRfUEFSQU0gICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgQVZTMl9EQkdfUFJJTlRfUElDX0xJU1QgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgQVZTMl9EQkdfU0VORF9QQVJBTV9XSVRIX1JFRyAgICAgIDB4MTAwCisjZGVmaW5lIEFWUzJfREJHX01FUkdFICAgICAgICAgICAgICAgICAgICAweDIwMAorI2RlZmluZSBBVlMyX0RCR19EQkdfTEZfUFJJTlQgICAgICAgICAgICAgMHg0MDAKKyNkZWZpbmUgQVZTMl9EQkdfUkVHICAgICAgICAgICAgICAgICAgICAgIDB4ODAwCisjZGVmaW5lIEFWUzJfREJHX1BJQ19MRUFLICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgQVZTMl9EQkdfUElDX0xFQUtfV0FJVCAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBBVlMyX0RCR19IRFJfSU5GTyAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIEFWUzJfREJHX0hEUl9EQVRBICAgICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgQVZTMl9EQkdfRElTX0xPQ19FUlJPUl9QUk9DICAgICAgIDB4MTAwMDAKKyNkZWZpbmUgQVZTMl9EQkdfRElTX1NZU19FUlJPUl9QUk9DICAgMHgyMDAwMAorI2RlZmluZSBBVlMyX0RCR19EVU1QX1BJQ19MSVNUICAgICAgIDB4NDAwMDAKKyNkZWZpbmUgQVZTMl9EQkdfVFJJR19TTElDRV9TRUdNRU5UX1BST0MgMHg4MDAwMAorI2RlZmluZSBBVlMyX0RCR19GT1JDRV9VTkNPTVBSRVNTICAgICAgIDB4MTAwMDAwCisjZGVmaW5lIEFWUzJfREJHX0xPQURfVUNPREVfRlJPTV9GSUxFICAgMHgyMDAwMDAKKyNkZWZpbmUgQVZTMl9EQkdfRk9SQ0VfU0VORF9BR0FJTiAgICAgICAweDQwMDAwMAorI2RlZmluZSBBVlMyX0RCR19EVU1QX0RBVEEgICAgICAgICAgICAgIDB4ODAwMDAwCisjZGVmaW5lIEFWUzJfREJHX0RVTVBfTE1FTV9CVUYgICAgICAgICAweDEwMDAwMDAKKyNkZWZpbmUgQVZTMl9EQkdfRFVNUF9SUE1fQlVGICAgICAgICAgIDB4MjAwMDAwMAorI2RlZmluZSBBVlMyX0RCR19DQUNIRSAgICAgICAgICAgICAgICAgMHg0MDAwMDAwCisjZGVmaW5lIElHTk9SRV9QQVJBTV9GUk9NX0NPTkZJRyAgICAgICAgIDB4ODAwMDAwMAorLypNVUxUSV9JTlNUQU5DRV9TVVBQT1JUKi8KKyNkZWZpbmUgUFJJTlRfRkxBR19FUlJPUgkJCQkwCisjZGVmaW5lIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMgICAgICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBQUklOVF9GTEFHX1ZERUNfREVUQUlMICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgUFJJTlRfRkxBR19WREVDX0RBVEEgICAgICAgICAgICAgMHg4MDAwMDAwMAorCisjZGVmaW5lIFBSSU5UX0xJTkUoKSBcCisJZG8geyBcCisJCWlmIChkZWJ1ZyAmIEFWUzJfREJHX1BSSU5UX1NPVVJDRV9MSU5FKVwKKwkJCXByX2luZm8oIiVzIGxpbmUgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7XAorCX0gd2hpbGUgKDApCisKK3N0YXRpYyB1MzIgZGVidWc7CisKK3N0YXRpYyB1MzIgZGVidWdfYWdhaW47CisKK2Jvb2wgaXNfYXZzMl9wcmludF9wYXJhbSh2b2lkKQoreworCWJvb2wgcmV0ID0gZmFsc2U7CisJaWYgKGRlYnVnICYgQVZTMl9EQkdfUFJJTlRfUEFSQU0pCisJCXJldCA9IHRydWU7CisJcmV0dXJuIHJldDsKK30KKworYm9vbCBpc19hdnMyX3ByaW50X2J1Zm1ncl9kZXRhaWwodm9pZCkKK3sKKwlib29sIHJldCA9IGZhbHNlOworCWlmIChkZWJ1ZyAmIEFWUzJfREJHX0JVRk1HUl9ERVRBSUwpCisJCXJldCA9IHRydWU7CisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBib29sIGlzX3Jlc2V0OworLypmb3IgZGVidWcqLworc3RhdGljIHUzMiBmb3JjZV9idWZzcGVjOworLyoKKwl1ZGVidWdfZmxhZzoKKwliaXQgMCwgZW5hYmxlIHVjb2RlIHByaW50CisJYml0IDEsIGVuYWJsZSB1Y29kZSBkZXRhaWwgcHJpbnQKKwliaXQgWzMxOjE2XSBub3QgMCwgcG9zIHRvIGR1bXAgbG1lbQorCQliaXQgMiwgcG9wIGJpdHMgdG8gbG1lbQorCQliaXQgWzExOjhdLCBwcmUtcG9wIGJpdHMgZm9yIGFsaWdubWVudCAod2hlbiBiaXQgMiBpcyAxKQorKi8KK3N0YXRpYyB1MzIgdWRlYnVnX2ZsYWc7CisvKgorCXdoZW4gdWRlYnVnX2ZsYWdbMTowXSBpcyBub3QgMAorCXVkZWJ1Z19wYXVzZV9wb3Mgbm90IDAsCisJCXBhdXNlIHBvc2l0aW9uCisqLworc3RhdGljIHUzMiB1ZGVidWdfcGF1c2VfcG9zOworLyoKKwl3aGVuIHVkZWJ1Z19mbGFnWzE6MF0gaXMgbm90IDAKKwlhbmQgdWRlYnVnX3BhdXNlX3BvcyBpcyBub3QgMCwKKwkJcGF1c2Ugb25seSB3aGVuIERFQlVHX1JFRzIgaXMgZXF1YWwgdG8gdGhpcyB2YWwKKyovCitzdGF0aWMgdTMyIHVkZWJ1Z19wYXVzZV92YWw7CisKK3N0YXRpYyB1MzIgdWRlYnVnX3BhdXNlX2RlY29kZV9pZHg7CisKK3N0YXRpYyB1MzIgZm9yY2VfZGlzcF9waWNfaW5kZXg7CisKKyNkZWZpbmUgQVVYX0JVRl9BTElHTihhZHIpICgoYWRyICsgMHhmKSAmICh+MHhmKSkKK3N0YXRpYyB1MzIgY3V2YV9idWZfc2l6ZSA9IDUxMjsKKworI2RlZmluZSBERUJVR19SRUcKKyNpZmRlZiBERUJVR19SRUcKK3N0YXRpYyB2b2lkIFdSSVRFX1ZSRUdfREJHMih1bnNpZ25lZCBhZHIsIHVuc2lnbmVkIHZhbCkKK3sKKwlpZiAoZGVidWcgJiBBVlMyX0RCR19SRUcpCisJCXByX2luZm8oIiVzKCV4LCAleClcbiIsIF9fZnVuY19fLCBhZHIsIHZhbCk7CisJaWYgKGFkciAhPSAwKQorCQlXUklURV9WUkVHKGFkciwgdmFsKTsKK30KKworI3VuZGVmIFdSSVRFX1ZSRUcKKyNkZWZpbmUgV1JJVEVfVlJFRyBXUklURV9WUkVHX0RCRzIKKyNlbmRpZgorCisjZGVmaW5lIE1NVV9DT01QUkVTU19IRUFERVJfU0laRV8xMDgwUCAgMHgxMDAwMAorI2RlZmluZSBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfNEsgIDB4NDgwMDAKKyNkZWZpbmUgTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFXzhLICAweDEyMDAwMAorCisjZGVmaW5lIElOVkFMSURfSURYIC0xICAvKiBJbnZhbGlkIGJ1ZmZlciBpbmRleC4qLworCisKKyNkZWZpbmUgRlJBTUVfQlVGRkVSUyAoQVZTMl9NQVhfQlVGRkVSX05VTSkKKyNkZWZpbmUgSEVBREVSX0ZSQU1FX0JVRkZFUlMgKEZSQU1FX0JVRkZFUlMpCisjZGVmaW5lIE1BWF9CVUZfTlVNIChGUkFNRV9CVUZGRVJTKQorCisjZGVmaW5lIEZSQU1FX0NPTlRFWFRTX0xPRzIgMgorI2RlZmluZSBGUkFNRV9DT05URVhUUyAoMSA8PCBGUkFNRV9DT05URVhUU19MT0cyKQorLypidWZmZXIgKyBoZWFkZXIgYnVmZmVyICsgd29ya3NwYWNlKi8KKworI2lmZGVmIE1WX1VTRV9GSVhFRF9CVUYKKyNkZWZpbmUgTUFYX0JNTVVfQlVGRkVSX05VTSAoKEZSQU1FX0JVRkZFUlMgKyBIRUFERVJfRlJBTUVfQlVGRkVSUyArIDEpKzEpCisjZGVmaW5lIFZGX0JVRkZFUl9JRFgobikgKG4pCisjZGVmaW5lIEhFQURFUl9CVUZGRVJfSURYKG4pIChGUkFNRV9CVUZGRVJTICsgbisxKQorI2RlZmluZSBXT1JLX1NQQUNFX0JVRl9JRCAoRlJBTUVfQlVGRkVSUyArIEhFQURFUl9GUkFNRV9CVUZGRVJTKzEpCisjZWxzZQorI2RlZmluZSBNQVhfQk1NVV9CVUZGRVJfTlVNICgoKEZSQU1FX0JVRkZFUlMqMikrSEVBREVSX0ZSQU1FX0JVRkZFUlMrMSkrMSkKKyNkZWZpbmUgVkZfQlVGRkVSX0lEWChuKSAobikKKyNkZWZpbmUgSEVBREVSX0JVRkZFUl9JRFgobikgKEZSQU1FX0JVRkZFUlMgKyBuKzEpCisjZGVmaW5lIE1WX0JVRkZFUl9JRFgobikgKChGUkFNRV9CVUZGRVJTICogMikgKyBuKzEpCisjZGVmaW5lIFdPUktfU1BBQ0VfQlVGX0lEICgoRlJBTUVfQlVGRkVSUyAqIDIpICsgSEVBREVSX0ZSQU1FX0JVRkZFUlMrMSkKKy8vI2RlZmluZSBEV19IRUFERVJfQlVGRkVSX0lEWChuKSAoKEZSQU1FX0JVRkZFUlMgKiAzKSArIG4rMSkKKyNlbmRpZgorCisjZGVmaW5lIENPX01WX0JVRl9TSVpFXzEwODBQICAweDNmYzAwCisjZGVmaW5lIENPX01WX0JVRl9TSVpFXzRLICAgICAweDEyMDAwMAorI2RlZmluZSBDT19NVl9CVUZfU0laRV84SyAgICAgMHg0ODAwMDAKKy8qCitzdGF0aWMgdm9pZCBzZXRfY2FudmFzKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMsCisJc3RydWN0IGF2czJfZnJhbWVfcyAqcGljKTsKK2ludCBhdnMyX3ByZXBhcmVfZGlzcGxheV9idWYoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYywKKwkJCQkJaW50IHBvcyk7CisqLworCisKK3N0cnVjdCBidWZmX3MgeworCXUzMiBidWZfc3RhcnQ7CisJdTMyIGJ1Zl9zaXplOworCXUzMiBidWZfZW5kOworfTsKKworc3RydWN0IEJ1ZmZJbmZvX3MgeworCXUzMiBtYXhfd2lkdGg7CisJdTMyIG1heF9oZWlnaHQ7CisJdTMyIHN0YXJ0X2FkcjsKKwl1MzIgZW5kX2FkcjsKKwlzdHJ1Y3QgYnVmZl9zIGlwcDsKKwlzdHJ1Y3QgYnVmZl9zIHNhb19hYnY7CisJc3RydWN0IGJ1ZmZfcyBzYW9fdmI7CisJc3RydWN0IGJ1ZmZfcyBzaG9ydF90ZXJtX3JwczsKKwlzdHJ1Y3QgYnVmZl9zIHJjczsKKwlzdHJ1Y3QgYnVmZl9zIHNwczsKKwlzdHJ1Y3QgYnVmZl9zIHBwczsKKwlzdHJ1Y3QgYnVmZl9zIHNhb191cDsKKwlzdHJ1Y3QgYnVmZl9zIHN3YXBfYnVmOworCXN0cnVjdCBidWZmX3Mgc3dhcF9idWYyOworCXN0cnVjdCBidWZmX3Mgc2NhbGVsdXQ7CisJc3RydWN0IGJ1ZmZfcyBkYmxrX3BhcmE7CisJc3RydWN0IGJ1ZmZfcyBkYmxrX2RhdGE7CisJc3RydWN0IGJ1ZmZfcyBkYmxrX2RhdGEyOworI2lmZGVmIEFWUzJfMTBCX01NVQorCXN0cnVjdCBidWZmX3MgbW11X3ZiaDsKKwlzdHJ1Y3QgYnVmZl9zIGNtX2hlYWRlcjsKKyNlbmRpZgorI2lmZGVmIEFWUzJfMTBCX01NVV9EVworCXN0cnVjdCBidWZmX3MgbW11X3ZiaF9kdzsKKwlzdHJ1Y3QgYnVmZl9zIGNtX2hlYWRlcl9kdzsKKyNlbmRpZgorCXN0cnVjdCBidWZmX3MgbXByZWRfYWJvdmU7CisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCXN0cnVjdCBidWZmX3MgbXByZWRfbXY7CisjZW5kaWYKKwlzdHJ1Y3QgYnVmZl9zIHJwbTsKKwlzdHJ1Y3QgYnVmZl9zIGxtZW07Cit9OworCisjZGVmaW5lIERFQ19SRVNVTFRfTk9ORSAgICAgICAgICAgICAwCisjZGVmaW5lIERFQ19SRVNVTFRfRE9ORSAgICAgICAgICAgICAxCisjZGVmaW5lIERFQ19SRVNVTFRfQUdBSU4gICAgICAgICAgICAyCisjZGVmaW5lIERFQ19SRVNVTFRfQ09ORklHX1BBUkFNICAgICAzCisjZGVmaW5lIERFQ19SRVNVTFRfRVJST1IgICAgICAgICAgICA0CisjZGVmaW5lIERFQ19JTklUX1BJQ0xJU1QJCQk1CisjZGVmaW5lIERFQ19VTklOSVRfUElDTElTVAkJCTYKKyNkZWZpbmUgREVDX1JFU1VMVF9HRVRfREFUQSAgICAgICAgIDcKKyNkZWZpbmUgREVDX1JFU1VMVF9HRVRfREFUQV9SRVRSWSAgIDgKKyNkZWZpbmUgREVDX1JFU1VMVF9FT1MgICAgICAgICAgICAgIDkKKyNkZWZpbmUgREVDX1JFU1VMVF9GT1JDRV9FWElUICAgICAgIDEwCisKK3N0YXRpYyB2b2lkIGF2czJfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworc3RydWN0IGxvb3BfZmlsdGVyX2luZm9fbjsKK3N0cnVjdCBsb29wZmlsdGVyOworc3RydWN0IHNlZ21lbnRhdGlvbjsKKworc3RydWN0IEFWUzJEZWNvZGVyX3MgeworCWludCBwaWNfbGlzdF9pbml0X2ZsYWc7CisJdW5zaWduZWQgY2hhciBpbmRleDsKKwlzcGlubG9ja190IGJ1ZmZlcl9sb2NrOworCXN0cnVjdCBkZXZpY2UgKmNtYV9kZXY7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2OworCXZvaWQgKCp2ZGVjX2NiKShzdHJ1Y3QgdmRlY19zICosIHZvaWQgKik7CisJdm9pZCAqdmRlY19jYl9hcmc7CisJc3RydWN0IHZmcmFtZV9jaHVua19zICpjaHVuazsKKwlpbnQgZGVjX3Jlc3VsdDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwl1MzIgc3RhcnRfc2hpZnRfYnl0ZXM7CisKKwlzdHJ1Y3QgQnVmZkluZm9fcyB3b3JrX3NwYWNlX2J1Zl9zdG9yZTsKKwl1bnNpZ25lZCBsb25nIGJ1Zl9zdGFydDsKKwl1MzIgYnVmX3NpemU7CisJdTMyIGNtYV9hbGxvY19jb3VudDsKKwl1bnNpZ25lZCBsb25nIGNtYV9hbGxvY19hZGRyOworCXVpbnQ4X3QgZW9zOworCXVuc2lnbmVkIGxvbmcgaW50IHN0YXJ0X3Byb2Nlc3NfdGltZTsKKwl1bnNpZ25lZCBsYXN0X2xjdV9pZHg7CisJaW50IGRlY29kZV90aW1lb3V0X2NvdW50OworCXVuc2lnbmVkIHRpbWVvdXRfbnVtOworCisJaW50IGRvdWJsZV93cml0ZV9tb2RlOworCisJdW5zaWduZWQgY2hhciBtX2luc19mbGFnOworCWNoYXIgKnByb3ZpZGVyX25hbWU7CisJaW50IGZyYW1lX2NvdW50OworCXUzMiBzdGF0OworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCXUzMiBmcmFtZV9kdXI7CisJdTMyIGZyYW1lX2FyOworCXUzMiB2YXZzMl9yYXRpbzsKKwlpbnQgZmF0YWxfZXJyb3I7CisJdWludDhfdCBpbml0X2ZsYWc7CisJdWludDhfdCBmaXJzdF9zY19jaGVja2VkOworCXVpbnQ4X3QgcHJvY2Vzc19idXN5OworI2RlZmluZSBQUk9DX1NUQVRFX0lOSVQJCQkwCisjZGVmaW5lIFBST0NfU1RBVEVfSEVBRF9ET05FCTEKKyNkZWZpbmUgUFJPQ19TVEFURV9ERUNPRElORwkJMgorI2RlZmluZSBQUk9DX1NUQVRFX0hFQURfQUdBSU4JMworI2RlZmluZSBQUk9DX1NUQVRFX0RFQ09ERV9BR0FJTgk0CisjZGVmaW5lIFBST0NfU1RBVEVfVEVTVDEJCTUKKwl1aW50OF90IHByb2Nlc3Nfc3RhdGU7CisJdTMyIHVjb2RlX3BhdXNlX3BvczsKKworCWludCBzaG93X2ZyYW1lX251bTsKKyNpZm5kZWYgQVZTMl8xMEJfTU1VCisJc3RydWN0IGJ1ZmZfcyBtY19idWZfc3BlYzsKKyNlbmRpZgorCXN0cnVjdCBkZWNfc3lzaW5mbyB2YXZzMl9hbXN0cmVhbV9kZWNfaW5mbzsKKwl2b2lkICpycG1fYWRkcjsKKwl2b2lkICpsbWVtX2FkZHI7CisJZG1hX2FkZHJfdCBycG1fcGh5X2FkZHI7CisJZG1hX2FkZHJfdCBsbWVtX3BoeV9hZGRyOworCXVuc2lnbmVkIHNob3J0ICpsbWVtX3B0cjsKKwl1bnNpZ25lZCBzaG9ydCAqZGVidWdfcHRyOworCisjaWZkZWYgQVZTMl8xMEJfTU1VCisJYm9vbCBtbXVfZW5hYmxlOworCisJdTMyIGN1dmFfc2l6ZTsKKwl2b2lkICpjdXZhX2FkZHI7CisJZG1hX2FkZHJfdCBjdXZhX3BoeV9hZGRyOworCisJdm9pZCAqZnJhbWVfbW11X21hcF9hZGRyOworCWRtYV9hZGRyX3QgZnJhbWVfbW11X21hcF9waHlfYWRkcjsKKyNlbmRpZgorI2lmZGVmIEFWUzJfMTBCX01NVV9EVworCWJvb2wgZHdfbW11X2VuYWJsZTsKKwl2b2lkICpkd19tbXVfYm94OworCXZvaWQgKmR3X2ZyYW1lX21tdV9tYXBfYWRkcjsKKwlkbWFfYWRkcl90IGR3X2ZyYW1lX21tdV9tYXBfcGh5X2FkZHI7CisjZW5kaWYKKwl1bnNpZ25lZCBpbnQgdXNlX2NtYV9mbGFnOworCisJc3RydWN0IEJVRl9zIG1fQlVGW01BWF9CVUZfTlVNXTsKKwlzdHJ1Y3QgTVZCVUZfcyBtX212X0JVRltNQVhfQlVGX05VTV07CisJdTMyIHVzZWRfYnVmX251bTsKKwlERUNMQVJFX0tGSUZPKG5ld2ZyYW1lX3EsIHN0cnVjdCB2ZnJhbWVfcyAqLCBWRl9QT09MX1NJWkUpOworCURFQ0xBUkVfS0ZJRk8oZGlzcGxheV9xLCBzdHJ1Y3QgdmZyYW1lX3MgKiwgVkZfUE9PTF9TSVpFKTsKKwlERUNMQVJFX0tGSUZPKHBlbmRpbmdfcSwgc3RydWN0IHZmcmFtZV9zICosIFZGX1BPT0xfU0laRSk7CisJc3RydWN0IHZmcmFtZV9zIHZmcG9vbFtWRl9QT09MX1NJWkVdOworCXUzMiB2Zl9wcmVfY291bnQ7CisJdTMyIHZmX2dldF9jb3VudDsKKwl1MzIgdmZfcHV0X2NvdW50OworCWludCBidWZfbnVtOworCXVuc2lnbmVkIGludCBsb3NsZXNzX2NvbXBfYm9keV9zaXplOworCisJdTMyIHZpZGVvX3NpZ25hbF90eXBlOworCXUzMiB2aWRlb19vcmlfc2lnbmFsX3R5cGU7CisKKwlpbnQgcHRzX21vZGU7CisJaW50IGxhc3RfbG9va3VwX3B0czsKKwlpbnQgbGFzdF9wdHM7CisJdTY0IGxhc3RfbG9va3VwX3B0c191czY0OworCXU2NCBsYXN0X3B0c191czY0OworCXU2NCBzaGlmdF9ieXRlX2NvdW50OworCXUzMiBzaGlmdF9ieXRlX2NvdW50X2xvOworCXUzMiBzaGlmdF9ieXRlX2NvdW50X2hpOworCWludCBwdHNfbW9kZV9zd2l0Y2hpbmdfY291bnQ7CisJaW50IHB0c19tb2RlX3JlY292ZXJ5X2NvdW50OworCisJYm9vbCBnZXRfZnJhbWVfZHVyOworCXUzMiBzYXZlZF9yZXNvbHV0aW9uOworCisJLyoqLworCWludCByZWZyZXNoX2ZyYW1lX2ZsYWdzOworCXVpbnQ4X3QgaG9sZF9yZWZfYnVmOworCXN0cnVjdCBCdWZmSW5mb19zICp3b3JrX3NwYWNlX2J1ZjsKKyNpZm5kZWYgQVZTMl8xMEJfTU1VCisJc3RydWN0IGJ1ZmZfcyAqbWNfYnVmOworI2VuZGlmCisJdW5zaWduZWQgaW50IGZyYW1lX3dpZHRoOworCXVuc2lnbmVkIGludCBmcmFtZV9oZWlnaHQ7CisKKwl1bnNpZ25lZCBzaG9ydCAqcnBtX3B0cjsKKwlpbnQgICAgIGluaXRfcGljX3c7CisJaW50ICAgICBpbml0X3BpY19oOworCisJaW50ICAgICBzbGljZV90eXBlOworCisJaW50IGRlY29kZV9pZHg7CisJaW50IHNsaWNlX2lkeDsKKwl1aW50OF90IHdhaXRfYnVmOworCXVpbnQ4X3QgZXJyb3JfZmxhZzsKKwl1bnNpZ25lZCBpbnQgYnVmbWdyX2Vycm9yX2NvdW50OworCisJLyogYml0IDAsIGZvciBkZWNvZGluZzsgYml0IDEsIGZvciBkaXNwbGF5aW5nICovCisJdWludDhfdCBpZ25vcmVfYnVmbWdyX2Vycm9yOworCXVpbnQ4X3Qgc2tpcF9QQl9iZWZvcmVfSTsKKwlpbnQgUEJfc2tpcF9tb2RlOworCWludCBQQl9za2lwX2NvdW50X2FmdGVyX2RlY29kaW5nOworCS8qaHcqLworCisJLyoqLworCXN0cnVjdCB2ZGVjX2luZm8gKmd2czsKKworCisJdW5zaWduZWQgaW50IGRlY19zdGF0dXM7CisJdTMyIGxhc3RfcHV0X2lkeDsKKwlpbnQgbmV3X2ZyYW1lX2Rpc3BsYXllZDsKKwl2b2lkICptbXVfYm94OworCXZvaWQgKmJtbXVfYm94OworCXN0cnVjdCB2ZnJhbWVfbWFzdGVyX2Rpc3BsYXlfY29sb3VyX3MgdmZfZHA7CisJc3RydWN0IGZpcm13YXJlX3MgKmZ3OworI2lmZGVmIEFWUzJfMTBCX01NVQorCWludCBjdXJfZmJfaWR4X21tdTsKKwlsb25nIHVzZWRfNGtfbnVtOworI2VuZGlmCisJc3RydWN0IGF2czJfZGVjb2RlciBhdnMyX2RlYzsKKyNkZWZpbmUgQUxGX05VTV9CSVRfU0hJRlQgICAgICA2CisjZGVmaW5lIE5PX1ZBUl9CSU5TICAgICAgICAgICAgMTYKKwlpbnQzMl90IG1fZmlsdGVyQ29lZmZTeW1bMTZdWzldOworCWludDMyX3QgbV92YXJJbmRUYWJbTk9fVkFSX0JJTlNdOworCisJc3RydWN0IHZmcmFtZV9zIHZmcmFtZV9kdW1teTsKKwkJLyogc3RhcnRfZGVjb2RpbmdfZmxhZywKKwkJCWJpdCAwLCBTRVEgcmVhZHkKKwkJCWJpdCAxLCBJIHJlYWR5CisJCSovCisJdW5zaWduZWQgY2hhciBzdGFydF9kZWNvZGluZ19mbGFnOworCXVpbnQzMl90IG1wcmVkX2Fidl9zdGFydF9hZGRyOworCXVpbnQzMl90IG1wcmVkX2Fidl9zdGFydF9hZGRyX2JhazsKKwl1OCBuZXh0X2FnYWluX2ZsYWc7CisJdTMyIHByZV9wYXJzZXJfd3JfcHRyOworCWludCBuZWVkX2NhY2hlX3NpemU7CisJdTY0IHNjX3N0YXJ0X3RpbWU7CisjaWZkZWYgSV9PTkxZX1NVUFBPUlQKKwl1MzIgaV9vbmx5OworI2VuZGlmCisJaW50IGZyYW1laW5mb19lbmFibGU7CisJc3RydWN0IHZmcmFtZV9xb3NfcyB2ZnJhbWVfcW9zOworCXUzMiBkeW5hbWljX2J1Zl9tYXJnaW47CisJaW50IHNpZGViaW5kX3R5cGU7CisJaW50IHNpZGViaW5kX2NoYW5uZWxfaWQ7CisJdTMyIGVuZGlhbjsKKwljaGFyIHZkZWNfbmFtZVszMl07CisJY2hhciBwdHNfbmFtZVszMl07CisJY2hhciBuZXdfcV9uYW1lWzMyXTsKKwljaGFyIGRpc3BfcV9uYW1lWzMyXTsKKwlkbWFfYWRkcl90IHJkbWFfcGh5X2FkcjsKKwl1bnNpZ25lZCAqcmRtYV9hZHI7CisJaW50IGhkcl9mbGFnOworfTsKKworc3RhdGljIGludCAgY29tcHV0ZV9sb3NsZXNzX2NvbXBfYm9keV9zaXplKAorCQlzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisJCXVpbnQ4X3QgaXNfYml0X2RlcHRoXzEwKTsKKworc3RhdGljIGludCBhdnMyX3ByaW50KHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMsCisJaW50IGZsYWcsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworI2RlZmluZSBIRVZDX1BSSU5UX0JVRgkJMjU2CisJdW5zaWduZWQgY2hhciBidWZbSEVWQ19QUklOVF9CVUZdOworCWludCBsZW4gPSAwOworCWlmIChkZWMgPT0gTlVMTCB8fAorCQkoZmxhZyA9PSAwKSB8fAorCQkoZGVidWcgJiBmbGFnKSkgeworCQl2YV9saXN0IGFyZ3M7CisJCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJCWlmIChkZWMpCisJCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIlslZF0iLCBkZWMtPmluZGV4KTsKKwkJdnNucHJpbnRmKGJ1ZiArIGxlbiwgSEVWQ19QUklOVF9CVUYgLSBsZW4sIGZtdCwgYXJncyk7CisJCXByX2luZm8oIiVzIiwgYnVmKTsKKwkJdmFfZW5kKGFyZ3MpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdnMyX3ByaW50X2NvbnQoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYywKKwlpbnQgZmxhZywgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdW5zaWduZWQgY2hhciBidWZbSEVWQ19QUklOVF9CVUZdOworCWludCBsZW4gPSAwOworCWlmIChkZWMgPT0gTlVMTCB8fAorCQkoZmxhZyA9PSAwKSB8fAorCQkoZGVidWcgJiBmbGFnKSkgeworCQl2YV9saXN0IGFyZ3M7CisJCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJCXZzbnByaW50ZihidWYgKyBsZW4sIEhFVkNfUFJJTlRfQlVGIC0gbGVuLCBmbXQsIGFyZ3MpOworCQlwcl9pbmZvKCIlcyIsIGJ1Zik7CisJCXZhX2VuZChhcmdzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgUFJPQl9TSVpFICAgICg0OTYgKiAyICogNCkKKyNkZWZpbmUgUFJPQl9CVUZfU0laRSAgICAoMHg1MDAwKQorI2RlZmluZSBDT1VOVF9CVUZfU0laRSAgICgweDMwMCAqIDQgKiA0KQorLypjb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemUoNDA5NiwgMjMwNCwgMSkgPSAxODg3NDM2OCgweDEyMDAwMDApKi8KKyNkZWZpbmUgTUFYX0ZSQU1FXzRLX05VTSAweDEyMDAKKyNkZWZpbmUgTUFYX0ZSQU1FXzhLX05VTSAweDQ4MDAKKyNkZWZpbmUgTUFYX1NJWkVfNEsgKDQwOTYgKiAyMzA0KQorI2RlZmluZSBJU184S19TSVpFKHcsIGgpCSgoKHcpICogKGgpKSA+IE1BWF9TSVpFXzRLKQorI2RlZmluZSBJU180S19TSVpFKHcsIGgpICAoKCh3KSAqIChoKSkgPiAoMTkyMCoxMDg4KSkKKworc3RhdGljIGludCBnZXRfZnJhbWVfbW11X21hcF9zaXplKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMpCit7CisJaWYgKChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkgJiYKKwkJKElTXzhLX1NJWkUoZGVjLT5pbml0X3BpY193LCBkZWMtPmluaXRfcGljX2gpKSkKKwkJcmV0dXJuIChNQVhfRlJBTUVfOEtfTlVNICogNCk7CisJcmV0dXJuIChNQVhfRlJBTUVfNEtfTlVNICogNCk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2NvbXByZXNzX2hlYWRlcl9zaXplKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMpCit7CisJaWYgKChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkgJiYKKwkJKElTXzhLX1NJWkUoZGVjLT5pbml0X3BpY193LCBkZWMtPmluaXRfcGljX2gpKSkKKwkJcmV0dXJuIE1NVV9DT01QUkVTU19IRUFERVJfU0laRV84SzsKKwllbHNlIGlmIChJU180S19TSVpFKGRlYy0+aW5pdF9waWNfdywgZGVjLT5pbml0X3BpY19oKSkKKwkJcmV0dXJuIE1NVV9DT01QUkVTU19IRUFERVJfU0laRV80SzsKKwlyZXR1cm4gTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFXzEwODBQOworfQorCitzdGF0aWMgdm9pZCByZXNldF9wcm9jZXNzX3RpbWUoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYykKK3sKKwlpZiAoZGVjLT5zdGFydF9wcm9jZXNzX3RpbWUpIHsKKwkJdW5zaWduZWQgcHJvY2Vzc190aW1lID0KKwkJCTEwMDAgKiAoamlmZmllcyAtIGRlYy0+c3RhcnRfcHJvY2Vzc190aW1lKSAvIEhaOworCQlkZWMtPnN0YXJ0X3Byb2Nlc3NfdGltZSA9IDA7CisJCWlmIChwcm9jZXNzX3RpbWUgPiBtYXhfcHJvY2Vzc190aW1lW2RlYy0+aW5kZXhdKQorCQkJbWF4X3Byb2Nlc3NfdGltZVtkZWMtPmluZGV4XSA9IHByb2Nlc3NfdGltZTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X3Byb2Nlc3NfdGltZShzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCWRlYy0+c3RhcnRfcHJvY2Vzc190aW1lID0gamlmZmllczsKKwlkZWMtPmRlY29kZV90aW1lb3V0X2NvdW50ID0gMDsKKwlkZWMtPmxhc3RfbGN1X2lkeCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9kZWNvZGVkX3BpYyhzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKTsKKworc3RhdGljIHZvaWQgdGltZW91dF9wcm9jZXNzKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMpCit7CisJc3RydWN0IGF2czJfZGVjb2RlciAqYXZzMl9kZWMgPSAmZGVjLT5hdnMyX2RlYzsKKwlzdHJ1Y3QgYXZzMl9mcmFtZV9zICpjdXJfcGljID0gYXZzMl9kZWMtPmhjLmN1cl9waWM7CisJZGVjLT50aW1lb3V0X251bSsrOworCWFtaGV2Y19zdG9wKCk7CisJYXZzMl9wcmludChkZWMsCisJCTAsICIlcyBkZWNvZGVyIHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwlpZiAoY3VyX3BpYykKKwkJY3VyX3BpYy0+ZXJyb3JfbWFyayA9IDE7CisJZGVjLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworCXVwZGF0ZV9kZWNvZGVkX3BpYyhkZWMpOworCXJlc2V0X3Byb2Nlc3NfdGltZShkZWMpOworCXZkZWNfc2NoZWR1bGVfd29yaygmZGVjLT53b3JrKTsKK30KKworc3RhdGljIHUzMiBnZXRfdmFsaWRfZG91YmxlX3dyaXRlX21vZGUoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYykKK3sKKwl1MzIgZHdfbW9kZTsKKworCWR3X21vZGUgPSAoZGVjLT5tX2luc19mbGFnICYmCisJCSgoZG91YmxlX3dyaXRlX21vZGUgJiAweDgwMDAwMDAwKSA9PSAwKSkgPworCQlkZWMtPmRvdWJsZV93cml0ZV9tb2RlIDoKKwkJKGRvdWJsZV93cml0ZV9tb2RlICYgMHg3ZmZmZmZmZik7CisJaWYgKGR3X21vZGUgJiAweDIwKSB7CisJCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX1QzKQorCQkJJiYgKChkd19tb2RlICYgMHhmKSA9PSAyIHx8IChkd19tb2RlICYgMHhmKSA9PSAzKSkKKwkJCWR3X21vZGUgPSAwOworCX0KKworCXJldHVybiBkd19tb2RlOworfQorCitzdGF0aWMgaW50IGdldF9kb3VibGVfd3JpdGVfbW9kZShzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCXUzMiB2YWxpZF9kd19tb2RlID0gZ2V0X3ZhbGlkX2RvdWJsZV93cml0ZV9tb2RlKGRlYyk7CisJaW50IHcgPSBkZWMtPmF2czJfZGVjLmltZy53aWR0aDsKKwlpbnQgaCA9IGRlYy0+YXZzMl9kZWMuaW1nLmhlaWdodDsKKwl1MzIgZHcgPSAweDE7IC8qMToxKi8KKwlzd2l0Y2ggKHZhbGlkX2R3X21vZGUpIHsKKwljYXNlIDB4MTAwOgorCQlpZiAodyA+IDE5MjAgJiYgaCA+IDEwODgpCisJCQlkdyA9IDB4NDsgLyoxOjIqLworCQlicmVhazsKKwljYXNlIDB4MjAwOgorCQlpZiAodyA+IDE5MjAgJiYgaCA+IDEwODgpCisJCQlkdyA9IDB4MjsgLyoxOjQqLworCQlicmVhazsKKwljYXNlIDB4MzAwOgorCQlpZiAodyA+IDEyODAgJiYgaCA+IDcyMCkKKwkJCWR3ID0gMHg0OyAvKjE6MiovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWR3ID0gdmFsaWRfZHdfbW9kZTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBkdzsKK30KKworLyogZm9yIGRvdWJsZSB3cml0ZSBidWYgYWxsb2MgKi8KK3N0YXRpYyBpbnQgZ2V0X2RvdWJsZV93cml0ZV9tb2RlX2luaXQoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYykKK3sKKwl1MzIgdmFsaWRfZHdfbW9kZSA9IGdldF92YWxpZF9kb3VibGVfd3JpdGVfbW9kZShkZWMpOworCXUzMiBkdzsKKwlpbnQgdyA9IGRlYy0+aW5pdF9waWNfdzsKKwlpbnQgaCA9IGRlYy0+aW5pdF9waWNfaDsKKworCWR3ID0gMHgxOyAvKjE6MSovCisJc3dpdGNoICh2YWxpZF9kd19tb2RlKSB7CisJY2FzZSAweDEwMDoKKwkJaWYgKHcgPiAxOTIwICYmIGggPiAxMDg4KQorCQkJZHcgPSAweDQ7IC8qMToyKi8KKwkJYnJlYWs7CisJY2FzZSAweDIwMDoKKwkJaWYgKHcgPiAxOTIwICYmIGggPiAxMDg4KQorCQkJZHcgPSAweDI7IC8qMTo0Ki8KKwkJYnJlYWs7CisJY2FzZSAweDMwMDoKKwkJaWYgKHcgPiAxMjgwICYmIGggPiA3MjApCisJCQlkdyA9IDB4NDsgLyoxOjIqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkdyA9IHZhbGlkX2R3X21vZGU7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gZHc7Cit9CisKKy8vI2RlZmluZQlNQVhfNEtfTlVNCQkweDEyMDAKKyNpZmRlZiBBVlMyXzEwQl9NTVUKK2ludCBhdnMyX2FsbG9jX21tdSgKKwlzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjLAorCWludCBjdXJfYnVmX2lkeCwKKwlpbnQgcGljX3dpZHRoLAorCWludCBwaWNfaGVpZ2h0LAorCXVuc2lnbmVkIHNob3J0IGJpdF9kZXB0aCwKKwl1bnNpZ25lZCBpbnQgKm1tdV9pbmRleF9hZHIpCit7CisJaW50IGJpdF9kZXB0aF8xMCA9IChiaXRfZGVwdGggPT0gQVZTMl9CSVRTXzEwKTsKKwlpbnQgcGljdHVyZV9zaXplOworCWludCBjdXJfbW11XzRrX251bWJlciwgbWF4X2ZyYW1lX251bTsKKworCXBpY3R1cmVfc2l6ZSA9IGNvbXB1dGVfbG9zbGVzc19jb21wX2JvZHlfc2l6ZSgKKwkJZGVjLCBwaWNfd2lkdGgsIHBpY19oZWlnaHQsCisJCWJpdF9kZXB0aF8xMCk7CisJY3VyX21tdV80a19udW1iZXIgPSAoKHBpY3R1cmVfc2l6ZSArICgxIDw8IDEyKSAtIDEpID4+IDEyKTsKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpCisJCW1heF9mcmFtZV9udW0gPSBNQVhfRlJBTUVfOEtfTlVNOworCWVsc2UKKwkJbWF4X2ZyYW1lX251bSA9IE1BWF9GUkFNRV80S19OVU07CisJaWYgKGN1cl9tbXVfNGtfbnVtYmVyID4gbWF4X2ZyYW1lX251bSkgeworCQlwcl9lcnIoIm92ZXIgbWF4ICEhIGN1cl9tbXVfNGtfbnVtYmVyIDB4JXggd2lkdGggJWQgaGVpZ2h0ICVkXG4iLAorCQkJY3VyX21tdV80a19udW1iZXIsIHBpY193aWR0aCwgcGljX2hlaWdodCk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIGRlY29kZXJfbW11X2JveF9hbGxvY19pZHgoCisJCWRlYy0+bW11X2JveCwKKwkJY3VyX2J1Zl9pZHgsCisJCWN1cl9tbXVfNGtfbnVtYmVyLAorCQltbXVfaW5kZXhfYWRyKTsKK30KKyNlbmRpZgorCisjaWZkZWYgQVZTMl8xMEJfTU1VX0RXCitpbnQgYXZzMl9hbGxvY19kd19tbXUoCisJc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYywKKwlpbnQgY3VyX2J1Zl9pZHgsCisJaW50IHBpY193aWR0aCwKKwlpbnQgcGljX2hlaWdodCwKKwl1bnNpZ25lZCBzaG9ydCBiaXRfZGVwdGgsCisJdW5zaWduZWQgaW50ICptbXVfaW5kZXhfYWRyKQoreworCWludCBiaXRfZGVwdGhfMTAgPSAoYml0X2RlcHRoID09IEFWUzJfQklUU18xMCk7CisJaW50IHBpY3R1cmVfc2l6ZTsKKwlpbnQgY3VyX21tdV80a19udW1iZXIsIG1heF9mcmFtZV9udW07CisKKwlwaWN0dXJlX3NpemUgPSBjb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemUoCisJCWRlYywgcGljX3dpZHRoLCBwaWNfaGVpZ2h0LAorCQliaXRfZGVwdGhfMTApOworCWN1cl9tbXVfNGtfbnVtYmVyID0gKChwaWN0dXJlX3NpemUgKyAoMSA8PCAxMikgLSAxKSA+PiAxMik7CisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKQorCQltYXhfZnJhbWVfbnVtID0gTUFYX0ZSQU1FXzhLX05VTTsKKwllbHNlCisJCW1heF9mcmFtZV9udW0gPSBNQVhfRlJBTUVfNEtfTlVNOworCWlmIChjdXJfbW11XzRrX251bWJlciA+IG1heF9mcmFtZV9udW0pIHsKKwkJcHJfZXJyKCJvdmVyIG1heCAhISBjdXJfbW11XzRrX251bWJlciAweCV4IHdpZHRoICVkIGhlaWdodCAlZFxuIiwKKwkJCWN1cl9tbXVfNGtfbnVtYmVyLCBwaWNfd2lkdGgsIHBpY19oZWlnaHQpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiBkZWNvZGVyX21tdV9ib3hfYWxsb2NfaWR4KAorCQlkZWMtPmR3X21tdV9ib3gsCisJCWN1cl9idWZfaWR4LAorCQljdXJfbW11XzRrX251bWJlciwKKwkJbW11X2luZGV4X2Fkcik7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBnZXRfZnJlZV9idWZfY291bnQoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYykKK3sKKwlzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYyA9ICZkZWMtPmF2czJfZGVjOworCWludCBpOworCWludCBjb3VudCA9IDA7CisJZm9yIChpID0gMDsgaSA8IGF2czJfZGVjLT5yZWZfbWF4YnVmZmVyOyBpKyspIHsKKwkJaWYgKChhdnMyX2RlYy0+ZnJlZltpXS0+aW1nY29pX3JlZiA8IC0yNTYKKyNpZiAwCisJCQl8fCBhYnMoYXZzMl9kZWMtPmZyZWZbaV0tPgorCQkJCWltZ3RyX2Z3UmVmRGlzdGFuY2UgLSBpbWctPnRyKSA+PSAxMjgKKyNlbmRpZgorCQkJCSkgJiYgYXZzMl9kZWMtPmZyZWZbaV0tPmlzX291dHB1dCA9PSAtMQorCQkJCSYmIGF2czJfZGVjLT5mcmVmW2ldLT5iZ19mbGFnID09IDAKKyNpZm5kZWYgTk9fRElTUExBWQorCQkJCSYmIGF2czJfZGVjLT5mcmVmW2ldLT52Zl9yZWYgPT0gMAorCQkJCSYmIGF2czJfZGVjLT5mcmVmW2ldLT50b19wcmVwYXJlX2Rpc3AgPT0gMAorI2VuZGlmCisJCQkJKSB7CisJCQljb3VudCsrOworCQl9CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCisjaWZkZWYgQ09OU1RSQUlOX01BWF9CVUZfTlVNCitzdGF0aWMgaW50IGdldF92Zl9yZWZfb25seV9idWZfY291bnQoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYykKK3sKKwlzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYyA9ICZkZWMtPmF2czJfZGVjOworCWludCBpOworCWludCBjb3VudCA9IDA7CisJZm9yIChpID0gMDsgaSA8IGF2czJfZGVjLT5yZWZfbWF4YnVmZmVyOyBpKyspIHsKKwkJaWYgKChhdnMyX2RlYy0+ZnJlZltpXS0+aW1nY29pX3JlZiA8IC0yNTYKKyNpZiAwCisJCQl8fCBhYnMoYXZzMl9kZWMtPmZyZWZbaV0tPgorCQkJCWltZ3RyX2Z3UmVmRGlzdGFuY2UgLSBpbWctPnRyKSA+PSAxMjgKKyNlbmRpZgorCQkJCSkgJiYgYXZzMl9kZWMtPmZyZWZbaV0tPmlzX291dHB1dCA9PSAtMQorCQkJCSYmIGF2czJfZGVjLT5mcmVmW2ldLT5iZ19mbGFnID09IDAKKyNpZm5kZWYgTk9fRElTUExBWQorCQkJCSYmIGF2czJfZGVjLT5mcmVmW2ldLT52Zl9yZWYgPiAwCisJCQkJJiYgYXZzMl9kZWMtPmZyZWZbaV0tPnRvX3ByZXBhcmVfZGlzcCA9PSAwCisjZW5kaWYKKwkJCQkpIHsKKwkJCWNvdW50Kys7CisJCX0KKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3VzZWRfYnVmX2NvdW50KHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMpCit7CisJc3RydWN0IGF2czJfZGVjb2RlciAqYXZzMl9kZWMgPSAmZGVjLT5hdnMyX2RlYzsKKwlpbnQgaTsKKwlpbnQgY291bnQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBhdnMyX2RlYy0+cmVmX21heGJ1ZmZlcjsgaSsrKSB7CisJCWlmICgoYXZzMl9kZWMtPmZyZWZbaV0tPmltZ2NvaV9yZWYgPj0gLTI1NgorI2lmIDAKKwkJCXx8IGFicyhhdnMyX2RlYy0+ZnJlZltpXS0+CisJCQkJaW1ndHJfZndSZWZEaXN0YW5jZSAtIGltZy0+dHIpID49IDEyOAorI2VuZGlmCisJCQkJKSB8fCBhdnMyX2RlYy0+ZnJlZltpXS0+aXNfb3V0cHV0ICE9IC0xCisJCQkJfHwgYXZzMl9kZWMtPmZyZWZbaV0tPmJnX2ZsYWcgIT0gMAorI2lmbmRlZiBOT19ESVNQTEFZCisJCQkJfHwgYXZzMl9kZWMtPmZyZWZbaV0tPnZmX3JlZiAhPSAwCisJCQkJfHwgYXZzMl9kZWMtPmZyZWZbaV0tPnRvX3ByZXBhcmVfZGlzcCAhPSAwCisjZW5kaWYKKwkJCQkpIHsKKwkJCWNvdW50Kys7CisJCX0KKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisjZW5kaWYKKworaW50IGF2czJfYnVmbWdyX2luaXQoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYywgc3RydWN0IEJ1ZmZJbmZvX3MgKmJ1Zl9zcGVjX2ksCisJCXN0cnVjdCBidWZmX3MgKm1jX2J1Zl9pKSB7CisKKwlkZWMtPmZyYW1lX2NvdW50ID0gMDsKKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwlkZWMtPnVzZWRfNGtfbnVtID0gLTE7CisJZGVjLT5jdXJfZmJfaWR4X21tdSA9IElOVkFMSURfSURYOworI2VuZGlmCisKKworCS8qIHByaXZhdGUgaW5pdCAqLworCWRlYy0+d29ya19zcGFjZV9idWYgPSBidWZfc3BlY19pOworI2lmbmRlZiBBVlMyXzEwQl9NTVUKKwlkZWMtPm1jX2J1ZiA9IG1jX2J1Zl9pOworI2VuZGlmCisJZGVjLT5ycG1fYWRkciA9IE5VTEw7CisJZGVjLT5sbWVtX2FkZHIgPSBOVUxMOworCisJZGVjLT51c2VfY21hX2ZsYWcgPSAwOworCWRlYy0+ZGVjb2RlX2lkeCA9IDA7CisJZGVjLT5zbGljZV9pZHggPSAwOworCS8qaW50IG1fdWlNYXhDVVdpZHRoID0gMTw8NzsqLworCS8qaW50IG1fdWlNYXhDVUhlaWdodCA9IDE8PDc7Ki8KKwlkZWMtPndhaXRfYnVmID0gMDsKKwlkZWMtPmVycm9yX2ZsYWcgPSAwOworCWRlYy0+c2tpcF9QQl9iZWZvcmVfSSA9IDA7CisKKwlkZWMtPnB0c19tb2RlID0gUFRTX05PUk1BTDsKKwlkZWMtPmxhc3RfcHRzID0gMDsKKwlkZWMtPmxhc3RfbG9va3VwX3B0cyA9IDA7CisJZGVjLT5sYXN0X3B0c191czY0ID0gMDsKKwlkZWMtPmxhc3RfbG9va3VwX3B0c191czY0ID0gMDsKKwlkZWMtPnNoaWZ0X2J5dGVfY291bnQgPSAwOworCWRlYy0+c2hpZnRfYnl0ZV9jb3VudF9sbyA9IDA7CisJZGVjLT5zaGlmdF9ieXRlX2NvdW50X2hpID0gMDsKKwlkZWMtPnB0c19tb2RlX3N3aXRjaGluZ19jb3VudCA9IDA7CisJZGVjLT5wdHNfbW9kZV9yZWNvdmVyeV9jb3VudCA9IDA7CisKKwlkZWMtPmJ1Zl9udW0gPSAwOworCisJZGVjLT5idWZtZ3JfZXJyb3JfY291bnQgPSAwOworCXJldHVybiAwOworfQorCisKKworI2RlZmluZSBIRVZDX0NNX0JPRFlfU1RBUlRfQUREUiAgICAgICAgICAgICAgICAgICAgMHgzNjI2CisjZGVmaW5lIEhFVkNfQ01fQk9EWV9MRU5HVEggICAgICAgICAgICAgICAgICAgICAgICAweDM2MjcKKyNkZWZpbmUgSEVWQ19DTV9IRUFERVJfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgIDB4MzYyOQorI2RlZmluZSBIRVZDX0NNX0hFQURFUl9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgMHgzNjJiCisKKyNkZWZpbmUgTE9TTEVTU19DT01QUkVTU19NT0RFCisKKy8qI2RlZmluZSBERUNPTVBfSEVBRFJfU1VSR0VOVCovCisKK3N0YXRpYyB1MzIgbWVtX21hcF9tb2RlOyAvKiAwOmxpbmVhciAxOjMyeDMyIDI6NjR4MzIgOyBtOGJhYnkgdGVzdDE5MDIgKi8KK3N0YXRpYyB1MzIgZW5hYmxlX21lbV9zYXZpbmcgPSAxOworc3RhdGljIHUzMiBmb3JjZV93X2g7CisKK3N0YXRpYyB1MzIgZm9yY2VfZnBzOworCisKK2NvbnN0IHUzMiBhdnMyX3ZlcnNpb24gPSAyMDE2MDIxMDE7CitzdGF0aWMgdTMyIHJhZHI7CitzdGF0aWMgdTMyIHJ2YWw7CitzdGF0aWMgdTMyIHBvcF9zaG9ydHM7CitzdGF0aWMgdTMyIGRiZ19jbWQ7CitzdGF0aWMgdTMyIGRiZ19za2lwX2RlY29kZV9pbmRleDsKKy8qCisgKiBiaXQgMH4zLCBmb3IgSEVWQ0RfSVBQX0FYSUlGX0NPTkZJRyBlbmRpYW4gY29uZmlnCisgKiBiaXQgOH4yMywgZm9yIEhFVkNfU0FPX0NUUkwxIGVuZGlhbiBjb25maWcKKyAqLworc3RhdGljIHUzMiBlbmRpYW47CisjZGVmaW5lIEhFVkNfQ09ORklHX0JJR19FTkRJQU4gICAgICgoMHg4ODAgPDwgOCkgfCAweDgpCisjZGVmaW5lIEhFVkNfQ09ORklHX0xJVFRMRV9FTkRJQU4gICgoMHhmZjAgPDwgOCkgfCAweGYpCisKKyNpZmRlZiBFUlJPUl9IQU5ETEVfREVCVUcKK3N0YXRpYyB1MzIgZGJnX25hbF9za2lwX2ZsYWc7CisJCS8qIGJpdFswXSwgc2tpcCB2cHM7IGJpdFsxXSwgc2tpcCBzcHM7IGJpdFsyXSwgc2tpcCBwcHMgKi8KK3N0YXRpYyB1MzIgZGJnX25hbF9za2lwX2NvdW50OworI2VuZGlmCisvKmZvciBkZWJ1ZyovCitzdGF0aWMgdTMyIGRlY29kZV9waWNfYmVnaW47CitzdGF0aWMgdWludCBzbGljZV9wYXJzZV9iZWdpbjsKK3N0YXRpYyB1MzIgc3RlcDsKKyNpZmRlZiBNSVhfU1RSRUFNX1NVUFBPUlQKK3N0YXRpYyB1MzIgYnVmX2FsbG9jX3dpZHRoID0gNDA5NjsKK3N0YXRpYyB1MzIgYnVmX2FsbG9jX2hlaWdodCA9IDIzMDQ7CisKK3N0YXRpYyB1MzIgZHluYW1pY19idWZfbnVtX21hcmdpbjsKKyNlbHNlCitzdGF0aWMgdTMyIGJ1Zl9hbGxvY193aWR0aDsKK3N0YXRpYyB1MzIgYnVmX2FsbG9jX2hlaWdodDsKK3N0YXRpYyB1MzIgZHluYW1pY19idWZfbnVtX21hcmdpbiA9IDc7CisjZW5kaWYKKyNpZmRlZiBDT05TVFJBSU5fTUFYX0JVRl9OVU0KK3N0YXRpYyB1MzIgcnVuX3JlYWR5X21heF92Zl9vbmx5X251bTsKK3N0YXRpYyB1MzIgcnVuX3JlYWR5X2Rpc3BsYXlfcV9udW07CisJLyowOiBub3QgY2hlY2sKKwkgIDB4ZmY6IGF2czJfZGVjLnJlZl9tYXhidWZmZXIKKwkgICovCitzdGF0aWMgdTMyIHJ1bl9yZWFkeV9tYXhfYnVmX251bSA9IDB4ZmY7CisjZW5kaWYKK3N0YXRpYyB1MzIgYnVmX2FsbG9jX2RlcHRoID0gMTA7CitzdGF0aWMgdTMyIGJ1Zl9hbGxvY19zaXplOworLyoKK2JpdFswXTogMCwKKyAgICBiaXRbMV06IDAsIGFsd2F5cyByZWxlYXNlIGNtYSBidWZmZXIgd2hlbiBzdG9wCisgICAgYml0WzFdOiAxLCBuZXZlciByZWxlYXNlIGNtYSBidWZmZXIgd2hlbiBzdG9wCitiaXRbMF06IDEsIHdoZW4gc3RvcCwgcmVsZWFzZSBjbWEgYnVmZmVyIGlmIGJsYWNrb3V0IGlzIDE7CitkbyBub3QgcmVsZWFzZSBjbWEgYnVmZmVyIGlzIGJsYWNrb3V0IGlzIG5vdCAxCisKK2JpdFsyXTogMCwgd2hlbiBzdGFydCBkZWNvZGluZywgY2hlY2sgY3VycmVudCBkaXNwbGF5ZWQgYnVmZmVyCisJIChvbmx5IGZvciBidWZmZXIgZGVjb2RlZCBieSB2cDkpIGlmIGJsYWNrb3V0IGlzIDAKKwkgMSwgZG8gbm90IGNoZWNrIGN1cnJlbnQgZGlzcGxheWVkIGJ1ZmZlcgorCitiaXRbM106IDEsIGlmIGJsYWNrb3V0IGlzIG5vdCAxLCBkbyBub3QgcmVsZWFzZSBjdXJyZW50CisJCQlkaXNwbGF5ZWQgY21hIGJ1ZmZlciBhbHdheXMuCisqLworLyogc2V0IHRvIDEgZm9yIGZhc3QgcGxheTsKKwlzZXQgdG8gOCBmb3Igb3RoZXIgY2FzZSBvZiAia2VlcCBsYXN0IGZyYW1lIgorKi8KK3N0YXRpYyB1MzIgYnVmZmVyX21vZGUgPSAxOworLyogYnVmZmVyX21vZGVfZGJnOiBkZWJ1ZyBvbmx5Ki8KK3N0YXRpYyB1MzIgYnVmZmVyX21vZGVfZGJnID0gMHhmZmZmMDAwMDsKKy8qKi8KKworLyoKK2JpdCAwLCAxOiBvbmx5IGRpc3BsYXkgSSBwaWN0dXJlOworYml0IDEsIDE6IG9ubHkgZGVjb2RlIEkgcGljdHVyZTsKKyovCitzdGF0aWMgdTMyIGlfb25seV9mbGFnOworCisKK3N0YXRpYyB1MzIgbWF4X2RlY29kaW5nX3RpbWU7CisvKgorZXJyb3IgaGFuZGxpbmcKKyovCisvKmVycm9yX2hhbmRsZV9wb2xpY3k6CitiaXQgMDogc2VhcmNoIHNlcSBhZ2FpbiBpZiBidWZmZXIgbWdyIGVycm9yIG9jY3VyCisJKGJ1ZmZlciBtZ3IgZXJyb3IgY291bnQgbmVlZCBiaWcgdGhhbgorCXJlX3NlYXJjaF9zZXFfdGhyZXNob2xkKQorYml0IDE6ICAxLCBkaXNwbGF5IGZyb20gSSBwaWN0dXJlOworCQkwLCBkaXNwbGF5IGZyb20gYW55IGNvcnJlY3QgcGljCisqLworCitzdGF0aWMgdTMyIGVycm9yX2hhbmRsZV9wb2xpY3kgPSAxOworLyoKK3JlX3NlYXJjaF9zZXFfdGhyZXNob2xkOgorCWJpdCA3fjA6IGJ1ZmZlciBtZ3IgZXJyb3IgcmVzZWFyY2ggc2VxIGNvdW50CisJYml0IDE1fjg6IGZyYW1lIGNvdW50IHRocmVzaG9sZAorKi8KK3N0YXRpYyB1MzIgcmVfc2VhcmNoX3NlcV90aHJlc2hvbGQgPSAweDgwMDsgLyoweDg7Ki8KKy8qc3RhdGljIHUzMiBwYXJzZXJfc2VpX2VuYWJsZSA9IDE7Ki8KKworc3RhdGljIHUzMiBtYXhfYnVmX251bSA9IChSRUZfQlVGRkVSICsgMSk7CisKK3N0YXRpYyB1MzIgcnVuX3JlYWR5X21pbl9idWZfbnVtID0gMjsKKworc3RhdGljIERFRklORV9NVVRFWCh2YXZzMl9tdXRleCk7CisKKyNkZWZpbmUgSEVWQ19ERUNfU1RBVFVTX1JFRyAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzAKKyNkZWZpbmUgSEVWQ19SUE1fQlVGRkVSICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzEKKyNkZWZpbmUgQVZTMl9BTEZfU1dBUF9CVUZGRVIgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzIKKyNkZWZpbmUgSEVWQ19SQ1NfQlVGRkVSICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzMKKyNkZWZpbmUgSEVWQ19TUFNfQlVGRkVSICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzQKKyNkZWZpbmUgSEVWQ19QUFNfQlVGRkVSICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzUKKy8vI2RlZmluZSBIRVZDX1NBT19VUCAgICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfNgorI2lmZGVmIEFWUzJfMTBCX01NVQorI2RlZmluZSBBVlMyX01NVV9NQVBfQlVGRkVSICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfNworI2Vsc2UKKyNkZWZpbmUgSEVWQ19TVFJFQU1fU1dBUF9CVUZGRVIgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzcKKyNlbmRpZgorI2RlZmluZSBIRVZDX1NUUkVBTV9TV0FQX0JVRkZFUjIgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfOAorLyoKKyNkZWZpbmUgVlA5X1BST0JfU1dBUF9CVUZGRVIgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzkKKyNkZWZpbmUgVlA5X0NPVU5UX1NXQVBfQlVGRkVSICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0EKKyNkZWZpbmUgVlA5X1NFR19NQVBfQlVGRkVSICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0IKKyovCisjZGVmaW5lIEFWUzJfQ1VWQV9BRFIgICAgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9BCisjZGVmaW5lIEFWUzJfQ1VWQV9EQVRBX1NJWkUgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9CCisKKy8vI2RlZmluZSBIRVZDX1NDQUxFTFVUICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfRAorI2RlZmluZSBIRVZDX1dBSVRfRkxBRyAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfRQorI2RlZmluZSBSUE1fQ01EX1JFRyAgICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfRgorI2RlZmluZSBMTUVNX0RVTVBfQURSICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfOQorI2RlZmluZSBIRVZDX1NUUkVBTV9TV0FQX1RFU1QgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfTAorLyohISEqLworI2RlZmluZSBIRVZDX0RFQ09ERV9DT1VOVCAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX00KKyNkZWZpbmUgSEVWQ19ERUNPREVfU0laRQkJSEVWQ19BU1NJU1RfU0NSQVRDSF9OCisjZGVmaW5lIERFQlVHX1JFRzEgICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfRworI2RlZmluZSBERUJVR19SRUcyICAgICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0gKKworCisvKgordWNvZGUgcGFyc2VyL3NlYXJjaCBjb250cm9sCitiaXQgMDogIDAsIGhlYWRlciBhdXRvIHBhcnNlOyAxLCBoZWFkZXIgbWFudWFsIHBhcnNlCitiaXQgMTogIDAsIGF1dG8gc2tpcCBmb3Igbm9uZXNlYW1sZXNzIHN0cmVhbTsgMSwgbm8gc2tpcAorYml0IFszOjJdOiB2YWxpZCB3aGVuIGJpdDE9PTA7CiswLCBhdXRvIHNraXAgbmFsIGJlZm9yZSBmaXJzdCB2cHMvc3BzL3Bwcy9pZHI7CisxLCBhdXRvIHNraXAgbmFsIGJlZm9yZSBmaXJzdCB2cHMvc3BzL3BwcworMiwgYXV0byBza2lwIG5hbCBiZWZvcmUgZmlyc3QgIHZwcy9zcHMvcHBzLAorCWFuZCBub3QgZGVjb2RlIHVudGlsIHRoZSBmaXJzdCBJIHNsaWNlICh3aXRoIHNsaWNlIGFkZHJlc3Mgb2YgMCkKKworMywgYXV0byBza2lwIGJlZm9yZSBmaXJzdCBJIHNsaWNlIChuYWxfdHlwZSA+PTE2ICYmIG5hbF90eXBlPD0yMSkKK2JpdCBbMTU6NF0gbmFsIHNraXAgY291bnQgKHZhbGlkIHdoZW4gYml0MCA9PSAxIChtYW51YWwgbW9kZSkgKQorYml0IFsxNl06IGZvciBOQUxfVU5JVF9FT1Mgd2hlbiBiaXQwIGlzIDA6CisJMCwgc2VuZCBTRUFSQ0hfRE9ORSB0byBhcm0gOyAgMSwgZG8gbm90IHNlbmQgU0VBUkNIX0RPTkUgdG8gYXJtCitiaXQgWzE3XTogZm9yIE5BTF9TRUkgd2hlbiBiaXQwIGlzIDA6CisJMCwgZG8gbm90IHBhcnNlIFNFSSBpbiB1Y29kZTsgMSwgcGFyc2UgU0VJIGluIHVjb2RlCitiaXQgWzMxOjIwXTogdXNlZCBieSB1Y29kZSBmb3IgZGVidWcgcHVycG9zZQorKi8KKyNkZWZpbmUgTkFMX1NFQVJDSF9DVEwgICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0kKKwkvKkRFQ09ERV9NT0RFOiBzZXQgYmVmb3JlIHN0YXJ0IGRlY29kZXIKKwkJYml0IDd+MDogZGVjb2RlIG1vZGUKKwkJYml0IDIzfjE2OiBzdGFydF9kZWNvZGluZ19mbGFnCisJCQliaXQgWzBdICAgLSBTRVFfcmVhZHkKKwkJCWJpdCBbMjoxXSAtIEkgUGljdHVyZSBDb3VudAorCQliaXQgMzF+MjQ6IGNoaXAgZmVhdHVyZQorCSovCisjZGVmaW5lIERFQ09ERV9NT0RFICAgICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0oKKyNkZWZpbmUgREVDT0RFX1NUT1BfUE9TICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9LCisJLypyZWFkIG9ubHkqLworI2RlZmluZSBDVVJfTkFMX1VOSVRfVFlQRSAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0oKKworI2RlZmluZSBSUE1fQlVGX1NJWkUgKDB4NjAwICogMikKKyNkZWZpbmUgTE1FTV9CVUZfU0laRSAoMHg2MDAgKiAyKQorCisJLyptbXVfdmJoIGJ1ZiBpcyB1c2VkIGJ5IEhFVkNfU0FPX01NVV9WSDBfQUREUiwgSEVWQ19TQU9fTU1VX1ZIMV9BRERSKi8KKyNkZWZpbmUgVkJIX0JVRl9TSVpFXzEwODBQIDB4MzAwMAorI2RlZmluZSBWQkhfQlVGX1NJWkVfNEsgMHg1MDAwCisjZGVmaW5lIFZCSF9CVUZfU0laRV84SyAweGEwMDAKKyNkZWZpbmUgVkJIX0JVRl9TSVpFKGJ1ZnNwZWMpIChidWZzcGVjLT5tbXVfdmJoLmJ1Zl9zaXplIC8gMikKKwkvKm1tdV92YmhfZHcgYnVmIGlzIHVzZWQgYnkgSEVWQ19TQU9fTU1VX1ZIMF9BRERSMixIRVZDX1NBT19NTVVfVkgxX0FERFIyLAorCQlIRVZDX0RXX1ZIMF9BREREUiwgSEVWQ19EV19WSDFfQURERFIqLworI2RlZmluZSBEV19WQkhfQlVGX1NJWkVfMTA4MFAgKFZCSF9CVUZfU0laRV8xMDgwUCAqIDIpCisjZGVmaW5lIERXX1ZCSF9CVUZfU0laRV80SyAoVkJIX0JVRl9TSVpFXzRLICogMikKKyNkZWZpbmUgRFdfVkJIX0JVRl9TSVpFXzhLIChWQkhfQlVGX1NJWkVfOEsgKiAyKQorI2RlZmluZSBEV19WQkhfQlVGX1NJWkUoYnVmc3BlYykgKGJ1ZnNwZWMtPm1tdV92YmhfZHcuYnVmX3NpemUgLyA0KQorCisvKiBuZWNlc3NhcnkgNEsgcGFnZSBzaXplIGFsaWduIGZvciB0Ny90MyBkZWNvZGVyIGFuZCBhZnRlciAqLworI2RlZmluZSBXT1JLQlVGX0FMSUdOKGFkZHIpIChBTElHTihhZGRyLCBQQUdFX1NJWkUpKQorCisjZGVmaW5lIFdPUktfQlVGX1NQRUNfTlVNIDYKK3N0YXRpYyBzdHJ1Y3QgQnVmZkluZm9fcyBhbXZhdnMyX3dvcmtidWZmX3NwZWNbV09SS19CVUZfU1BFQ19OVU1dID0geworCXsKKwkJLyogOE0gYnl0ZXMgKi8KKwkJLm1heF93aWR0aCA9IDE5MjAsCisJCS5tYXhfaGVpZ2h0ID0gMTA4OCwKKwkJLmlwcCA9IHsKKwkJCS8qIElQUCB3b3JrIHNwYWNlIGNhbGN1bGF0aW9uIDoKKwkJCSAgIDQwOTYgKiAoWStDYkNyK0ZsYWdzKSA9IDEyaywgcm91bmQgdG8gMTZrICovCisJCQkuYnVmX3NpemUgPSAweDQwMDAsCisJCX0sCisJCS5zYW9fYWJ2ID0geworCQkJLmJ1Zl9zaXplID0gMHgzMDAwMCwKKwkJfSwKKwkJLnNhb192YiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MzAwMDAsCisJCX0sCisJCS5zaG9ydF90ZXJtX3JwcyA9IHsKKwkJCS8qIFNIT1JUX1RFUk1fUlBTIC0gTWF4IDY0IHNldCwgMTYgZW50cnkgZXZlcnkgc2V0LAorCQkJICAgdG90YWwgNjR4MTZ4MiA9IDIwNDggYnl0ZXMgKDB4ODAwKSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5yY3MgPSB7CisJCQkvKiBSQ1MgU1RPUkUgQVJFQSAtIE1heCAzMiBSQ1MsIGVhY2ggaGFzIDMyIGJ5dGVzLAorCQkJCXRvdGFsIDB4MDQwMCBieXRlcyAqLworCQkJLmJ1Zl9zaXplID0gMHg0MDAsCisJCX0sCisJCS5zcHMgPSB7CisJCQkvKiBTUFMgU1RPUkUgQVJFQSAtIE1heCAxNiBTUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsCisJCQl0b3RhbCAweDA4MDAgYnl0ZXMqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5wcHMgPSB7CisJCQkvKlBQUyBTVE9SRSBBUkVBIC0gTWF4IDY0IFBQUywgZWFjaCBoYXMgMHg4MCBieXRlcywKKwkJCXRvdGFsIDB4MjAwMCBieXRlcyovCisJCQkuYnVmX3NpemUgPSAweDIwMDAsCisJCX0sCisJCS5zYW9fdXAgPSB7CisJCQkvKiBTQU8gVVAgU1RPUkUgQVJFQSAtIE1heCA2NDAoMTAyNDAvMTYpIExDVSwKKwkJCSAgIGVhY2ggaGFzIDE2IGJ5dGVzIHRvdGFsIDB4MjgwMCBieXRlcyAqLworCQkJLmJ1Zl9zaXplID0gMHgyODAwLAorCQl9LAorCQkuc3dhcF9idWYgPSB7CisJCQkvKiAyNTZjeWNsZXg2NGJpdCA9IDJLIGJ5dGVzIDB4ODAwCisJCQkgICAob25seSAxNDQgY3ljbGVzIHZhbGlkKSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zd2FwX2J1ZjIgPSB7CisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNjYWxlbHV0ID0geworCQkJLyogc3VwcG9ydCB1cCB0byAzMiBTQ0FMRUxVVCAxMDI0eDMyID0KKwkJCSAgIDMyS2J5dGVzICgweDgwMDApICovCisJCQkuYnVmX3NpemUgPSAweDgwMDAsCisJCX0sCisJCS5kYmxrX3BhcmEgPSB7CisJCQkvKiBEQkxLIC0+IE1heCAyNTYoNDA5Ni8xNikgTENVLAorCQkJZWFjaCBwYXJhIDEwMjRieXRlcyh0b3RhbDoweDQwMDAwKSwKKwkJCWRhdGEgMTAyNGJ5dGVzKHRvdGFsOjB4NDAwMDApKi8KKwkJCS5idWZfc2l6ZSA9IDB4NDAwMDAsCisJCX0sCisJCS5kYmxrX2RhdGEgPSB7CisJCQkuYnVmX3NpemUgPSAweDQwMDAwLAorCQl9LAorCQkuZGJsa19kYXRhMiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4NDAwMDAsCisJCX0sCisjaWZkZWYgQVZTMl8xMEJfTU1VCisJCS5tbXVfdmJoID0geworCQkJLmJ1Zl9zaXplID0gMHg1MDAwLCAvKjIqMTYqKG1vcmUgdGhhbiAyMzA0KS80LCA0SyovCisJCX0sCisjaWYgMAorCQkuY21faGVhZGVyID0geworCQkJLyphZGQgb25lIGZvciBrZWVwZXIuKi8KKwkJCS5idWZfc2l6ZSA9IE1NVV9DT01QUkVTU19IRUFERVJfU0laRSAqCisJCQkJCQkoRlJBTUVfQlVGRkVSUyArIDEpLAorCQkJLyogMHg0NDAwMCA9ICgoMTA4OCoyKjEwMjQqNCkvMzIvNCkqKDMyLzgpICovCisJCX0sCisjZW5kaWYKKyNlbmRpZgorCQkubXByZWRfYWJvdmUgPSB7CisJCQkuYnVmX3NpemUgPSAweDgwMDAsIC8qIDIgKiBzaXplIG9mIGhldmMqLworCQl9LAorI2lmZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwkJLm1wcmVkX212ID0gey8qIDEwODBwLCAweDQwMDAwIHBlciBidWZmZXIgKi8KKwkJCS5idWZfc2l6ZSA9IDB4NDAwMDAgKiBGUkFNRV9CVUZGRVJTLAorCQl9LAorI2VuZGlmCisJCS5ycG0gPSB7CisJCQkuYnVmX3NpemUgPSBSUE1fQlVGX1NJWkUsCisJCX0sCisJCS5sbWVtID0geworCQkJLmJ1Zl9zaXplID0gMHg0MDAgKiAyLAorCQl9CisJfSwKKwl7CisJCS5tYXhfd2lkdGggPSA0MDk2LAorCQkubWF4X2hlaWdodCA9IDIzMDQsCisJCS5pcHAgPSB7CisJCQkvKiBJUFAgd29yayBzcGFjZSBjYWxjdWxhdGlvbiA6CisJCQkgICA0MDk2ICogKFkrQ2JDcitGbGFncykgPSAxMmssIHJvdW5kIHRvIDE2ayAqLworCQkJLmJ1Zl9zaXplID0gMHg0MDAwLAorCQl9LAorCQkuc2FvX2FidiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MzAwMDAsCisJCX0sCisJCS5zYW9fdmIgPSB7CisJCQkuYnVmX3NpemUgPSAweDMwMDAwLAorCQl9LAorCQkuc2hvcnRfdGVybV9ycHMgPSB7CisJCQkvKiBTSE9SVF9URVJNX1JQUyAtIE1heCA2NCBzZXQsIDE2IGVudHJ5IGV2ZXJ5IHNldCwKKwkJCSAgIHRvdGFsIDY0eDE2eDIgPSAyMDQ4IGJ5dGVzICgweDgwMCkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkucmNzID0geworCQkJLyogUkNTIFNUT1JFIEFSRUEgLSBNYXggMTYgUkNTLCBlYWNoIGhhcyAzMiBieXRlcywKKwkJCXRvdGFsIDB4MDQwMCBieXRlcyAqLworCQkJLmJ1Zl9zaXplID0gMHg0MDAsCisJCX0sCisJCS5zcHMgPSB7CisJCQkvKiBTUFMgU1RPUkUgQVJFQSAtIE1heCAxNiBTUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsCisJCQkgICB0b3RhbCAweDA4MDAgYnl0ZXMgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkucHBzID0geworCQkJLyogUFBTIFNUT1JFIEFSRUEgLSBNYXggNjQgUFBTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLAorCQkJICAgdG90YWwgMHgyMDAwIGJ5dGVzICovCisJCQkuYnVmX3NpemUgPSAweDIwMDAsCisJCX0sCisJCS5zYW9fdXAgPSB7CisJCQkvKiBTQU8gVVAgU1RPUkUgQVJFQSAtIE1heCA2NDAoMTAyNDAvMTYpIExDVSwKKwkJCSAgIGVhY2ggaGFzIDE2IGJ5dGVzIHRvdGFsIDB4MjgwMCBieXRlcyAqLworCQkJLmJ1Zl9zaXplID0gMHgyODAwLAorCQl9LAorCQkuc3dhcF9idWYgPSB7CisJCQkvKiAyNTZjeWNsZXg2NGJpdCA9IDJLIGJ5dGVzIDB4ODAwCisJCQkgICAob25seSAxNDQgY3ljbGVzIHZhbGlkKSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zd2FwX2J1ZjIgPSB7CisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNjYWxlbHV0ID0geworCQkJLyogc3VwcG9ydCB1cCB0byAzMiBTQ0FMRUxVVCAxMDI0eDMyID0gMzJLYnl0ZXMKKwkJCSAgICgweDgwMDApICovCisJCQkuYnVmX3NpemUgPSAweDgwMDAsCisJCX0sCisJCS5kYmxrX3BhcmEgPSB7CisJCQkvKiBEQkxLIC0+IE1heCAyNTYoNDA5Ni8xNikgTENVLAorCQkJZWFjaCBwYXJhIDEwMjRieXRlcyh0b3RhbDoweDQwMDAwKSwKKwkJCWRhdGEgMTAyNGJ5dGVzKHRvdGFsOjB4NDAwMDApKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwMDAsCisJCX0sCisJCS5kYmxrX2RhdGEgPSB7CisJCQkvKkRCTEsgLT4gTWF4IDI1Nig0MDk2LzE2KSBMQ1UsCisJCQllYWNoIHBhcmEgMTAyNGJ5dGVzKHRvdGFsOjB4NDAwMDApLAorCQkJZGF0YSAxMDI0Ynl0ZXModG90YWw6MHg0MDAwMCkqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAwMCwKKwkJfSwKKwkJLmRibGtfZGF0YTIgPSB7CisJCQkuYnVmX3NpemUgPSAweDgwMDAwLAorCQl9LAorI2lmZGVmIEFWUzJfMTBCX01NVQorCQkubW11X3ZiaCA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4NTAwMCwvKjIqMTYqKG1vcmUgdGhhbiAyMzA0KS80LCA0SyovCisJCX0sCisjaWYgMAorCQkuY21faGVhZGVyID0geworCQkJLyphZGQgb25lIGZvciBrZWVwZXIuKi8KKwkJCS5idWZfc2l6ZSA9IE1NVV9DT01QUkVTU19IRUFERVJfU0laRSAqCisJCQkJCQkoRlJBTUVfQlVGRkVSUyArIDEpLAorCQkJLyogMHg0NDAwMCA9ICgoMTA4OCoyKjEwMjQqNCkvMzIvNCkqKDMyLzgpICovCisJCX0sCisjZW5kaWYKKyNlbmRpZgorCQkubXByZWRfYWJvdmUgPSB7CisJCQkuYnVmX3NpemUgPSAweDEwMDAwLCAvKiAyICogc2l6ZSBvZiBoZXZjKi8KKwkJfSwKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJCS5tcHJlZF9tdiA9IHsKKwkJCS8qIC5idWZfc2l6ZSA9IDB4MTAwMDAwKjE2LAorCQkJLy80azJrICwgMHgxMDAwMDAgcGVyIGJ1ZmZlciAqLworCQkJLyogNDA5NngyMzA0ICwgMHgxMjAwMDAgcGVyIGJ1ZmZlciAqLworCQkJLmJ1Zl9zaXplID0gMHgxMjAwMDAgKiBGUkFNRV9CVUZGRVJTLAorCQl9LAorI2VuZGlmCisJCS5ycG0gPSB7CisJCQkuYnVmX3NpemUgPSBSUE1fQlVGX1NJWkUsCisJCX0sCisJCS5sbWVtID0geworCQkJLmJ1Zl9zaXplID0gMHg0MDAgKiAyLAorCQl9CisJfSwKKwl7CisJCS5tYXhfd2lkdGggPSA0MDk2ICogMiwKKwkJLm1heF9oZWlnaHQgPSAyMzA0ICogMiwKKwkJLmlwcCA9IHsKKwkJLypJUFAgd29yayBzcGFjZSBjYWxjdWxhdGlvbiA6IDQwOTYgKiAoWStDYkNyK0ZsYWdzKSA9IDEyaywKKwkJcm91bmQgdG8gMTZrKi8KKwkJCS5idWZfc2l6ZSA9IDB4NDAwMCAqIDIsCisJCX0sCisJCS5zYW9fYWJ2ID0geworCQkJLmJ1Zl9zaXplID0gMHgzMDAwMCAqIDIsCisJCX0sCisJCS5zYW9fdmIgPSB7CisJCQkuYnVmX3NpemUgPSAweDMwMDAwICogMiwKKwkJfSwKKwkJLnNob3J0X3Rlcm1fcnBzID0geworCQkvKlNIT1JUX1RFUk1fUlBTIC0gTWF4IDY0IHNldCwgMTYgZW50cnkgZXZlcnkgc2V0LAorCQkJdG90YWwgNjR4MTZ4MiA9IDIwNDggYnl0ZXMgKDB4ODAwKSovCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnJjcyA9IHsKKwkJLypSQ1MgU1RPUkUgQVJFQSAtIE1heCAxNiBSQ1MsIGVhY2ggaGFzIDMyIGJ5dGVzLAorCQl0b3RhbCAweDA0MDAgYnl0ZXMqLworCQkJLmJ1Zl9zaXplID0gMHg0MDAsCisJCX0sCisJCS5zcHMgPSB7CisJCS8qU1BTIFNUT1JFIEFSRUEgLSBNYXggMTYgU1BTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLAorCQkJdG90YWwgMHgwODAwIGJ5dGVzKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkucHBzID0geworCQkvKlBQUyBTVE9SRSBBUkVBIC0gTWF4IDY0IFBQUywgZWFjaCBoYXMgMHg4MCBieXRlcywgdG90YWwKKwkJCTB4MjAwMCBieXRlcyovCisJCQkuYnVmX3NpemUgPSAweDIwMDAsCisJCX0sCisJCS5zYW9fdXAgPSB7CisJCS8qU0FPIFVQIFNUT1JFIEFSRUEgLSBNYXggNjQwKDEwMjQwLzE2KSBMQ1UsIGVhY2ggaGFzIDE2IGJ5dGVzIGkKKwkJCQl0b3RhbCAweDI4MDAgYnl0ZXMqLworCQkJLmJ1Zl9zaXplID0gMHgyODAwICogMiwKKwkJfSwKKwkJLnN3YXBfYnVmID0geworCQkvKjI1NmN5Y2xleDY0Yml0ID0gMksgYnl0ZXMgMHg4MDAgKG9ubHkgMTQ0IGN5Y2xlcyB2YWxpZCkqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zd2FwX2J1ZjIgPSB7CisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNjYWxlbHV0ID0geworCQkvKnN1cHBvcnQgdXAgdG8gMzIgU0NBTEVMVVQgMTAyNHgzMiA9IDMyS2J5dGVzICgweDgwMDApKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwMCAqIDIsCisJCX0sCisJCS5kYmxrX3BhcmEgID0geworCQkJLmJ1Zl9zaXplID0gMHg0MDAwMCAqIDIsCisJCX0sCisJCS5kYmxrX2RhdGEgID0geworCQkJLmJ1Zl9zaXplID0gMHg4MDAwMCAqIDIsCisJCX0sCisJCS5kYmxrX2RhdGEyID0geworCQkJLmJ1Zl9zaXplID0gMHg4MDAwMCAqIDIsCisJCX0sCisjaWZkZWYgQVZTMl8xMEJfTU1VCisJCS5tbXVfdmJoID0geworCQkgIC5idWZfc2l6ZSA9IDB4NTAwMCAqIDIsIC8qMioxNioyMzA0LzQsIDRLKi8KKwkJfSwKKyNpZiAwCisJCS5jbV9oZWFkZXIgPSB7CisJCQkvKjB4NDQwMDAgPSAoKDEwODgqMioxMDI0KjQpLzMyLzQpKigzMi84KSovCisJCQkuYnVmX3NpemUgPSBNTVVfQ09NUFJFU1NfOEtfSEVBREVSX1NJWkUgKiAxNywKKwkJfSwKKyNlbmRpZgorI2VuZGlmCisJCS5tcHJlZF9hYm92ZSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4ODAwMCAqIDIsCisJCX0sCisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCQkubXByZWRfbXYgPSB7CisJCQkvKjRrMmsgLCAweDEwMDAwMCBwZXIgYnVmZmVyKi8KKwkJCS5idWZfc2l6ZSA9IDB4MTIwMDAwICogRlJBTUVfQlVGRkVSUyAqIDQsCisJCX0sCisjZW5kaWYKKwkJLnJwbSA9IHsKKwkJCS5idWZfc2l6ZSA9IFJQTV9CVUZfU0laRSwKKwkJfSwKKwkJLmxtZW0gPSB7CisJCQkuYnVmX3NpemUgPSAweDQwMCAqIDIsCisJCX0KKwl9LAorCXsKKwkJLyogOE0gYnl0ZXMgKi8KKwkJLm1heF93aWR0aCA9IDE5MjAsCisJCS5tYXhfaGVpZ2h0ID0gMTA4OCwKKwkJLmlwcCA9IHsKKwkJCS8qIElQUCB3b3JrIHNwYWNlIGNhbGN1bGF0aW9uIDoKKwkJCSAgIDQwOTYgKiAoWStDYkNyK0ZsYWdzKSA9IDEyaywgcm91bmQgdG8gMTZrICovCisJCQkuYnVmX3NpemUgPSAweDFlMDAsCisJCX0sCisJCS5zYW9fYWJ2ID0geworCQkJLmJ1Zl9zaXplID0gMCwKKwkJfSwKKwkJLnNhb192YiA9IHsKKwkJCS5idWZfc2l6ZSA9IDAsCisJCX0sCisJCS5zaG9ydF90ZXJtX3JwcyA9IHsKKwkJCS8qIFNIT1JUX1RFUk1fUlBTIC0gTWF4IDY0IHNldCwgMTYgZW50cnkgZXZlcnkgc2V0LAorCQkJICAgdG90YWwgNjR4MTZ4MiA9IDIwNDggYnl0ZXMgKDB4ODAwKSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5yY3MgPSB7CisJCQkvKiBSQ1MgU1RPUkUgQVJFQSAtIE1heCAzMiBSQ1MsIGVhY2ggaGFzIDMyIGJ5dGVzLAorCQkJCXRvdGFsIDB4MDQwMCBieXRlcyAqLworCQkJLmJ1Zl9zaXplID0gMHg0MDAsCisJCX0sCisJCS5zcHMgPSB7CisJCQkvKiBTUFMgU1RPUkUgQVJFQSAtIE1heCAxNiBTUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsCisJCQl0b3RhbCAweDA4MDAgYnl0ZXMqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5wcHMgPSB7CisJCQkvKlBQUyBTVE9SRSBBUkVBIC0gTWF4IDY0IFBQUywgZWFjaCBoYXMgMHg4MCBieXRlcywKKwkJCXRvdGFsIDB4MjAwMCBieXRlcyovCisJCQkuYnVmX3NpemUgPSAweDIwMDAsCisJCX0sCisJCS5zYW9fdXAgPSB7CisJCQkvKiBTQU8gVVAgU1RPUkUgQVJFQSAtIE1heCA2NDAoMTAyNDAvMTYpIExDVSwKKwkJCSAgIGVhY2ggaGFzIDE2IGJ5dGVzIHRvdGFsIDB4MjgwMCBieXRlcyAqLworCQkJLmJ1Zl9zaXplID0gMCwKKwkJfSwKKwkJLnN3YXBfYnVmID0geworCQkJLyogMjU2Y3ljbGV4NjRiaXQgPSAySyBieXRlcyAweDgwMAorCQkJICAgKG9ubHkgMTQ0IGN5Y2xlcyB2YWxpZCkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc3dhcF9idWYyID0geworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zY2FsZWx1dCA9IHsKKwkJCS8qIHN1cHBvcnQgdXAgdG8gMzIgU0NBTEVMVVQgMTAyNHgzMiA9CisJCQkgICAzMktieXRlcyAoMHg4MDAwKSAqLworCQkJLmJ1Zl9zaXplID0gMCwKKwkJfSwKKwkJLmRibGtfcGFyYSA9IHsKKwkJCS8qIERCTEsgLT4gTWF4IDI1Nig0MDk2LzE2KSBMQ1UsCisJCQllYWNoIHBhcmEgMTAyNGJ5dGVzKHRvdGFsOjB4NDAwMDApLAorCQkJZGF0YSAxMDI0Ynl0ZXModG90YWw6MHg0MDAwMCkqLworCQkJLmJ1Zl9zaXplID0gMHgzZDAwLCAvLzB4M2M4MCwKKwkJfSwKKwkJLmRibGtfZGF0YSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4NjI4MDAsCisJCX0sCisJCS5kYmxrX2RhdGEyID0geworCQkJLmJ1Zl9zaXplID0gMHg2MjgwMCwKKwkJfSwKKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwkJLm1tdV92YmggPSB7CisJCQkuYnVmX3NpemUgPSBWQkhfQlVGX1NJWkVfMTA4MFAsIC8qMioxNioobW9yZSB0aGFuIDIzMDQpLzQsIDRLKi8KKwkJfSwKKyNpZiAwCisJCS5jbV9oZWFkZXIgPSB7CisJCQkvKmFkZCBvbmUgZm9yIGtlZXBlci4qLworCQkJLmJ1Zl9zaXplID0gTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFICoKKwkJCQkJCShGUkFNRV9CVUZGRVJTICsgMSksCisJCQkvKiAweDQ0MDAwID0gKCgxMDg4KjIqMTAyNCo0KS8zMi80KSooMzIvOCkgKi8KKwkJfSwKKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgQVZTMl8xMEJfTU1VX0RXCisJCS5tbXVfdmJoX2R3ID0geworCQkJLmJ1Zl9zaXplID0gRFdfVkJIX0JVRl9TSVpFXzEwODBQLCAvLzIqMTYqMjMwNC80LCA0SworCQl9LAorI2lmIDAKKwkJLmNtX2hlYWRlcl9kdyA9IHsKKwkJCS5idWZfc2l6ZSA9IE1NVV9DT01QUkVTU19IRUFERVJfU0laRV9EVyoxNywgLy8gMHg0NDAwMCA9ICgoMTA4OCoyKjEwMjQqNCkvMzIvNCkqKDMyLzgpCisJCX0sCisjZW5kaWYKKyNlbmRpZgorCQkubXByZWRfYWJvdmUgPSB7CisJCQkuYnVmX3NpemUgPSAweDFlMDAsIC8qIDIgKiBzaXplIG9mIGhldmMqLworCQl9LAorI2lmZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwkJLm1wcmVkX212ID0gey8qIDEwODBwLCAweDQwMDAwIHBlciBidWZmZXIgKi8KKwkJCS5idWZfc2l6ZSA9IENPX01WX0JVRl9TSVpFXzEwODBQICogRlJBTUVfQlVGRkVSUywKKwkJfSwKKyNlbmRpZgorCQkucnBtID0geworCQkJLmJ1Zl9zaXplID0gUlBNX0JVRl9TSVpFLAorCQl9LAorCQkubG1lbSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4NDAwICogMiwKKwkJfQorCX0sCisJeworCQkubWF4X3dpZHRoID0gNDA5NiwKKwkJLm1heF9oZWlnaHQgPSAyMzA0LAorCQkuaXBwID0geworCQkJLyogSVBQIHdvcmsgc3BhY2UgY2FsY3VsYXRpb24gOgorCQkJICAgNDA5NiAqIChZK0NiQ3IrRmxhZ3MpID0gMTJrLCByb3VuZCB0byAxNmsgKi8KKwkJCS5idWZfc2l6ZSA9IDB4NDAwMCwKKwkJfSwKKwkJLnNhb19hYnYgPSB7CisJCQkuYnVmX3NpemUgPSAwLAorCQl9LAorCQkuc2FvX3ZiID0geworCQkJLmJ1Zl9zaXplID0gMCwKKwkJfSwKKwkJLnNob3J0X3Rlcm1fcnBzID0geworCQkJLyogU0hPUlRfVEVSTV9SUFMgLSBNYXggNjQgc2V0LCAxNiBlbnRyeSBldmVyeSBzZXQsCisJCQkgICB0b3RhbCA2NHgxNngyID0gMjA0OCBieXRlcyAoMHg4MDApICovCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnJjcyA9IHsKKwkJCS8qIFJDUyBTVE9SRSBBUkVBIC0gTWF4IDE2IFJDUywgZWFjaCBoYXMgMzIgYnl0ZXMsCisJCQl0b3RhbCAweDA0MDAgYnl0ZXMgKi8KKwkJCS5idWZfc2l6ZSA9IDB4NDAwLAorCQl9LAorCQkuc3BzID0geworCQkJLyogU1BTIFNUT1JFIEFSRUEgLSBNYXggMTYgU1BTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLAorCQkJICAgdG90YWwgMHgwODAwIGJ5dGVzICovCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnBwcyA9IHsKKwkJCS8qIFBQUyBTVE9SRSBBUkVBIC0gTWF4IDY0IFBQUywgZWFjaCBoYXMgMHg4MCBieXRlcywKKwkJCSAgIHRvdGFsIDB4MjAwMCBieXRlcyAqLworCQkJLmJ1Zl9zaXplID0gMHgyMDAwLAorCQl9LAorCQkuc2FvX3VwID0geworCQkJLyogU0FPIFVQIFNUT1JFIEFSRUEgLSBNYXggNjQwKDEwMjQwLzE2KSBMQ1UsCisJCQkgICBlYWNoIGhhcyAxNiBieXRlcyB0b3RhbCAweDI4MDAgYnl0ZXMgKi8KKwkJCS5idWZfc2l6ZSA9IDAsCisJCX0sCisJCS5zd2FwX2J1ZiA9IHsKKwkJCS8qIDI1NmN5Y2xleDY0Yml0ID0gMksgYnl0ZXMgMHg4MDAKKwkJCSAgIChvbmx5IDE0NCBjeWNsZXMgdmFsaWQpICovCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnN3YXBfYnVmMiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc2NhbGVsdXQgPSB7CisJCQkvKiBzdXBwb3J0IHVwIHRvIDMyIFNDQUxFTFVUIDEwMjR4MzIgPSAzMktieXRlcworCQkJICAgKDB4ODAwMCkgKi8KKwkJCS5idWZfc2l6ZSA9IDAsCisJCX0sCisJCS5kYmxrX3BhcmEgPSB7CisJCQkvKiBEQkxLIC0+IE1heCAyNTYoNDA5Ni8xNikgTENVLAorCQkJZWFjaCBwYXJhIDEwMjRieXRlcyh0b3RhbDoweDQwMDAwKSwKKwkJCWRhdGEgMTAyNGJ5dGVzKHRvdGFsOjB4NDAwMDApKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODEwMCwgLy8weDgwODAsCisJCX0sCisJCS5kYmxrX2RhdGEgPSB7CisJCQkvKkRCTEsgLT4gTWF4IDI1Nig0MDk2LzE2KSBMQ1UsCisJCQllYWNoIHBhcmEgMTAyNGJ5dGVzKHRvdGFsOjB4NDAwMDApLAorCQkJZGF0YSAxMDI0Ynl0ZXModG90YWw6MHg0MDAwMCkqLworCQkJLmJ1Zl9zaXplID0gMHg4ODgwMCwKKwkJfSwKKwkJLmRibGtfZGF0YTIgPSB7CisJCQkuYnVmX3NpemUgPSAweDg4ODAwLAorCQl9LAorI2lmZGVmIEFWUzJfMTBCX01NVQorCQkubW11X3ZiaCA9IHsKKwkJCS5idWZfc2l6ZSA9IFZCSF9CVUZfU0laRV80SywvKjIqMTYqKG1vcmUgdGhhbiAyMzA0KS80LCA0SyovCisJCX0sCisjaWYgMAorCQkuY21faGVhZGVyID0geworCQkJLyphZGQgb25lIGZvciBrZWVwZXIuKi8KKwkJCS5idWZfc2l6ZSA9IE1NVV9DT01QUkVTU19IRUFERVJfU0laRSAqCisJCQkJCQkoRlJBTUVfQlVGRkVSUyArIDEpLAorCQkJLyogMHg0NDAwMCA9ICgoMTA4OCoyKjEwMjQqNCkvMzIvNCkqKDMyLzgpICovCisJCX0sCisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIEFWUzJfMTBCX01NVV9EVworCQkubW11X3ZiaF9kdyA9IHsKKwkJCS5idWZfc2l6ZSA9IERXX1ZCSF9CVUZfU0laRV80SywgLy8yKjE2KjIzMDQvNCwgNEsKKwkJfSwKKyNpZiAwCisJCS5jbV9oZWFkZXJfZHcgPSB7CisJCQkuYnVmX3NpemUgPSBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfRFcqMTcsIC8vIDB4NDQwMDAgPSAoKDEwODgqMioxMDI0KjQpLzMyLzQpKigzMi84KQorCQl9LAorI2VuZGlmCisjZW5kaWYKKwkJLm1wcmVkX2Fib3ZlID0geworCQkJLmJ1Zl9zaXplID0gMHg0MDAwLCAvKiAyICogc2l6ZSBvZiBoZXZjKi8KKwkJfSwKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJCS5tcHJlZF9tdiA9IHsKKwkJCS8qIC5idWZfc2l6ZSA9IDB4MTAwMDAwKjE2LAorCQkJLy80azJrICwgMHgxMDAwMDAgcGVyIGJ1ZmZlciAqLworCQkJLyogNDA5NngyMzA0ICwgMHgxMjAwMDAgcGVyIGJ1ZmZlciAqLworCQkJLmJ1Zl9zaXplID0gQ09fTVZfQlVGX1NJWkVfNEsgKiBGUkFNRV9CVUZGRVJTLAorCQl9LAorI2VuZGlmCisJCS5ycG0gPSB7CisJCQkuYnVmX3NpemUgPSBSUE1fQlVGX1NJWkUsCisJCX0sCisJCS5sbWVtID0geworCQkJLmJ1Zl9zaXplID0gMHg0MDAgKiAyLAorCQl9CisJfSwKKwl7CisJCS5tYXhfd2lkdGggPSA0MDk2ICogMiwKKwkJLm1heF9oZWlnaHQgPSAyMzA0ICogMiwKKwkJLmlwcCA9IHsKKwkJLypJUFAgd29yayBzcGFjZSBjYWxjdWxhdGlvbiA6IDQwOTYgKiAoWStDYkNyK0ZsYWdzKSA9IDEyaywKKwkJcm91bmQgdG8gMTZrKi8KKwkJCS5idWZfc2l6ZSA9IDB4NDAwMCAqIDIsCisJCX0sCisJCS5zYW9fYWJ2ID0geworCQkJLmJ1Zl9zaXplID0gMCwKKwkJfSwKKwkJLnNhb192YiA9IHsKKwkJCS5idWZfc2l6ZSA9IDAsCisJCX0sCisJCS5zaG9ydF90ZXJtX3JwcyA9IHsKKwkJLypTSE9SVF9URVJNX1JQUyAtIE1heCA2NCBzZXQsIDE2IGVudHJ5IGV2ZXJ5IHNldCwKKwkJCXRvdGFsIDY0eDE2eDIgPSAyMDQ4IGJ5dGVzICgweDgwMCkqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5yY3MgPSB7CisJCS8qUkNTIFNUT1JFIEFSRUEgLSBNYXggMTYgUkNTLCBlYWNoIGhhcyAzMiBieXRlcywKKwkJdG90YWwgMHgwNDAwIGJ5dGVzKi8KKwkJCS5idWZfc2l6ZSA9IDB4NDAwLAorCQl9LAorCQkuc3BzID0geworCQkvKlNQUyBTVE9SRSBBUkVBIC0gTWF4IDE2IFNQUywgZWFjaCBoYXMgMHg4MCBieXRlcywKKwkJCXRvdGFsIDB4MDgwMCBieXRlcyovCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnBwcyA9IHsKKwkJLypQUFMgU1RPUkUgQVJFQSAtIE1heCA2NCBQUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsIHRvdGFsCisJCQkweDIwMDAgYnl0ZXMqLworCQkJLmJ1Zl9zaXplID0gMHgyMDAwLAorCQl9LAorCQkuc2FvX3VwID0geworCQkvKlNBTyBVUCBTVE9SRSBBUkVBIC0gTWF4IDY0MCgxMDI0MC8xNikgTENVLCBlYWNoIGhhcyAxNiBieXRlcyBpCisJCQkJdG90YWwgMHgyODAwIGJ5dGVzKi8KKwkJCS5idWZfc2l6ZSA9IDAsCisJCX0sCisJCS5zd2FwX2J1ZiA9IHsKKwkJLyoyNTZjeWNsZXg2NGJpdCA9IDJLIGJ5dGVzIDB4ODAwIChvbmx5IDE0NCBjeWNsZXMgdmFsaWQpKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc3dhcF9idWYyID0geworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zY2FsZWx1dCA9IHsKKwkJLypzdXBwb3J0IHVwIHRvIDMyIFNDQUxFTFVUIDEwMjR4MzIgPSAzMktieXRlcyAoMHg4MDAwKSovCisJCQkuYnVmX3NpemUgPSAwLAorCQl9LAorCQkuZGJsa19wYXJhICA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MTAxMDAsIC8vMHgxMDA4MCwKKwkJfSwKKwkJLmRibGtfZGF0YSAgPSB7CisJCQkuYnVmX3NpemUgPSAweDExMDgwMCwKKwkJfSwKKwkJLmRibGtfZGF0YTIgPSB7CisJCQkuYnVmX3NpemUgPSAweDExMDgwMCwKKwkJfSwKKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwkJLm1tdV92YmggPSB7CisJCSAgLmJ1Zl9zaXplID0gVkJIX0JVRl9TSVpFXzhLLCAvKjIqMTYqMjMwNC80LCA0SyovCisJCX0sCisjaWYgMAorCQkuY21faGVhZGVyID0geworCQkJLyoweDQ0MDAwID0gKCgxMDg4KjIqMTAyNCo0KS8zMi80KSooMzIvOCkqLworCQkJLmJ1Zl9zaXplID0gTU1VX0NPTVBSRVNTXzhLX0hFQURFUl9TSVpFICogMTcsCisJCX0sCisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIEFWUzJfMTBCX01NVV9EVworCQkubW11X3ZiaF9kdyA9IHsKKwkJCS5idWZfc2l6ZSA9IERXX1ZCSF9CVUZfU0laRV84SywgLy8yKjE2KjIzMDQvNCwgNEsKKwkJfSwKKyNpZiAwCisJCS5jbV9oZWFkZXJfZHcgPSB7CisJCQkuYnVmX3NpemUgPSBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfRFcqMTcsIC8vIDB4NDQwMDAgPSAoKDEwODgqMioxMDI0KjQpLzMyLzQpKigzMi84KQorCQl9LAorI2VuZGlmCisjZW5kaWYKKwkJLm1wcmVkX2Fib3ZlID0geworCQkJLmJ1Zl9zaXplID0gMHg4MDAwLAorCQl9LAorI2lmZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwkJLm1wcmVkX212ID0geworCQkJLyo0azJrICwgMHgxMDAwMDAgcGVyIGJ1ZmZlciovCisJCQkuYnVmX3NpemUgPSBDT19NVl9CVUZfU0laRV84SyAqIEZSQU1FX0JVRkZFUlMsCisJCX0sCisjZW5kaWYKKwkJLnJwbSA9IHsKKwkJCS5idWZfc2l6ZSA9IFJQTV9CVUZfU0laRSwKKwkJfSwKKwkJLmxtZW0gPSB7CisJCQkuYnVmX3NpemUgPSAweDQwMCAqIDIsCisJCX0KKwl9Cit9OworCisjZGVmaW5lIElTXzhLX1NJWkUodywgaCkgICgoKHcpICogKGgpKSA+IE1BWF9TSVpFXzRLKQorI2RlZmluZSBJU180S19TSVpFKHcsIGgpICAoKCh3KSAqIChoKSkgPiAoMTkyMCoxMDg4KSkKKyNpZm5kZWYgTVZfVVNFX0ZJWEVEX0JVRgorc3RhdGljIHVpbnQzMl90IGdldF9tdl9idWZfc2l6ZShzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKwlzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYyA9ICZkZWMtPmF2czJfZGVjOworCXVpbnQzMl90IHNpemU7CisJaWYgKG12X2J1Zl9keW5hbWljX2FsbG9jID09IDEpIHsKKwkJaW50IG12X21lbV91bml0ID0KKwkJCWF2czJfZGVjLT5sY3Vfc2l6ZV9sb2cyID09IDYgPyAweDIwMCA6IGF2czJfZGVjLT5sY3Vfc2l6ZV9sb2cyID09CisJCQk1ID8gMHg4MCA6IDB4MjA7CisJCWludCBleHRlbmRlZF9waWNfd2lkdGggPSAod2lkdGggKyBhdnMyX2RlYy0+bGN1X3NpemUgLTEpCisJCQkJJiAofihhdnMyX2RlYy0+bGN1X3NpemUgLSAxKSk7CisJCWludCBleHRlbmRlZF9waWNfaGVpZ2h0ID0gKGhlaWdodCArIGF2czJfZGVjLT5sY3Vfc2l6ZSAtMSkKKwkJCQkmICh+KGF2czJfZGVjLT5sY3Vfc2l6ZSAtIDEpKTsKKwkJaW50IGxjdV94X251bSA9IGV4dGVuZGVkX3BpY193aWR0aCAvIGF2czJfZGVjLT5sY3Vfc2l6ZTsKKwkJaW50IGxjdV95X251bSA9IGV4dGVuZGVkX3BpY19oZWlnaHQgLyBhdnMyX2RlYy0+bGN1X3NpemU7CisJCWludCBuZXdfc2l6ZSA9ICBsY3VfeF9udW0gKiBsY3VfeV9udW0gKiBtdl9tZW1fdW5pdDsKKwkJc2l6ZSA9IChuZXdfc2l6ZSArIDB4ZmZmZikgJiAofjB4ZmZmZik7CisKKwl9IGVsc2UgeworCQlpZiAoSVNfOEtfU0laRSh3aWR0aCwgaGVpZ2h0KSkKKwkJCXNpemUgPSBDT19NVl9CVUZfU0laRV84SzsKKwkJZWxzZSBpZiAoSVNfNEtfU0laRSh3aWR0aCwgaGVpZ2h0KSkKKwkJCXNpemUgPSBDT19NVl9CVUZfU0laRV80SzsKKwkJZWxzZQorCQkJc2l6ZSA9IENPX01WX0JVRl9TSVpFXzEwODBQOworCX0KKwlyZXR1cm4gc2l6ZTsKK30KKyNlbmRpZgorCisvKkxvc2xlc3MgY29tcHJlc3Npb24gYm9keSBidWZmZXIgc2l6ZSA0SyBwZXIgNjR4MzIgKGp0KSovCitzdGF0aWMgaW50ICBjb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemUoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYywKKwlpbnQgd2lkdGgsIGludCBoZWlnaHQsCisJdWludDhfdCBpc19iaXRfZGVwdGhfMTApCit7CisJaW50ICAgICB3aWR0aF94NjQ7CisJaW50ICAgICBoZWlnaHRfeDMyOworCWludCAgICAgYnNpemU7CisJd2lkdGhfeDY0ID0gd2lkdGggKyA2MzsKKwl3aWR0aF94NjQgPj49IDY7CisJaGVpZ2h0X3gzMiA9IGhlaWdodCArIDMxOworCWhlaWdodF94MzIgPj49IDU7CisjaWZkZWYgQVZTMl8xMEJfTU1VCisJIGJzaXplID0gKGlzX2JpdF9kZXB0aF8xMCA/IDQwOTYgOiAzMjAwKQorCQkqIHdpZHRoX3g2NCAqIGhlaWdodF94MzI7CisjZWxzZQorCSBic2l6ZSA9IChpc19iaXRfZGVwdGhfMTAgPyA0MDk2IDogMzA3MikKKwkJKiB3aWR0aF94NjQgKiBoZWlnaHRfeDMyOworI2VuZGlmCisJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUl9NT1JFLAorCQkiJXMoJWQsJWQsJWQpPT4lZFxuIiwKKwkJX19mdW5jX18sIHdpZHRoLCBoZWlnaHQsCisJCWlzX2JpdF9kZXB0aF8xMCwgYnNpemUpOworCisJcmV0dXJuICBic2l6ZTsKK30KKworLyogTG9zbGVzcyBjb21wcmVzc2lvbiBoZWFkZXIgYnVmZmVyIHNpemUgMzJieXRlcyBwZXIgMTI4eDY0IChqdCkqLworc3RhdGljICBpbnQgIGNvbXB1dGVfbG9zbGVzc19jb21wX2hlYWRlcl9zaXplKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMsCisJaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworCWludCAgICAgd2lkdGhfeDEyODsKKwlpbnQgICAgIGhlaWdodF94NjQ7CisJaW50ICAgICBoc2l6ZTsKKwl3aWR0aF94MTI4ID0gd2lkdGggKyAxMjc7CisJd2lkdGhfeDEyOCA+Pj0gNzsKKwloZWlnaHRfeDY0ID0gaGVpZ2h0ICsgNjM7CisJaGVpZ2h0X3g2NCA+Pj0gNjsKKworCWhzaXplID0gMzIgKiB3aWR0aF94MTI4ICogaGVpZ2h0X3g2NDsKKwlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX01PUkUsCisJCSIlcyglZCwlZCk9PiVkXG4iLAorCQlfX2Z1bmNfXywgd2lkdGgsIGhlaWdodCwKKwkJaHNpemUpOworCisJcmV0dXJuICBoc2l6ZTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9idWZmX3NwZWMoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYywKKwlzdHJ1Y3QgQnVmZkluZm9fcyAqYnVmX3NwZWMpCit7CisJdm9pZCAqbWVtX3N0YXJ0X3ZpcnQ7CisJYnVmX3NwZWMtPmlwcC5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5zdGFydF9hZHIpOworCWJ1Zl9zcGVjLT5zYW9fYWJ2LmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPmlwcC5idWZfc3RhcnQgKyBidWZfc3BlYy0+aXBwLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+c2FvX3ZiLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnNhb19hYnYuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnNhb19hYnYuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5zaG9ydF90ZXJtX3Jwcy5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5zYW9fdmIuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnNhb192Yi5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPnJjcy5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5zaG9ydF90ZXJtX3Jwcy5idWZfc3RhcnQgKyBidWZfc3BlYy0+c2hvcnRfdGVybV9ycHMuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5zcHMuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+cmNzLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5yY3MuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5wcHMuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c3BzLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5zcHMuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5zYW9fdXAuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+cHBzLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5wcHMuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5zd2FwX2J1Zi5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5zYW9fdXAuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnNhb191cC5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPnN3YXBfYnVmMi5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5zd2FwX2J1Zi5idWZfc3RhcnQgKyBidWZfc3BlYy0+c3dhcF9idWYuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5zY2FsZWx1dC5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5zd2FwX2J1ZjIuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnN3YXBfYnVmMi5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5zY2FsZWx1dC5idWZfc3RhcnQgKyBidWZfc3BlYy0+c2NhbGVsdXQuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5kYmxrX2RhdGEuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5kYmxrX3BhcmEuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5kYmxrX2RhdGEyLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPmRibGtfZGF0YS5idWZfc3RhcnQgKyBidWZfc3BlYy0+ZGJsa19kYXRhLmJ1Zl9zaXplKTsKKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwlidWZfc3BlYy0+bW11X3ZiaC5idWZfc3RhcnQgID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+ZGJsa19kYXRhMi5idWZfc3RhcnQgKyBidWZfc3BlYy0+ZGJsa19kYXRhMi5idWZfc2l6ZSk7CisJI2lmZGVmIEFWUzJfMTBCX01NVV9EVworCWJ1Zl9zcGVjLT5tbXVfdmJoX2R3LmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPm1tdV92YmguYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPm1tdV92YmguYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5tcHJlZF9hYm92ZS5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5tbXVfdmJoX2R3LmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5tbXVfdmJoX2R3LmJ1Zl9zaXplKTsKKwkjZWxzZQorCWJ1Zl9zcGVjLT5tcHJlZF9hYm92ZS5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5tbXVfdmJoLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5tbXVfdmJoLmJ1Zl9zaXplKTsKKwkjZW5kaWYKKyNlbHNlIC8qIEFWUzJfMTBCX01NVSAqLworCSNpZmRlZiBBVlMyXzEwQl9NTVVfRFcKKwlidWZfc3BlYy0+bW11X3ZiaF9kdy5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5kYmxrX2RhdGEyLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5kYmxrX2RhdGEyLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+bXByZWRfYWJvdmUuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+bW11X3ZiaF9kdy5idWZfc3RhcnQgKyBidWZfc3BlYy0+bW11X3ZiaF9kdy5idWZfc2l6ZSk7CisJI2Vsc2UKKwlidWZfc3BlYy0+bXByZWRfYWJvdmUuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+ZGJsa19kYXRhMi5idWZfc3RhcnQgKyBidWZfc3BlYy0+ZGJsa19kYXRhMi5idWZfc2l6ZSk7CisJI2VuZGlmCisjZW5kaWYgLyogQVZTMl8xMEJfTU1VICovCisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCWJ1Zl9zcGVjLT5tcHJlZF9tdi5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5tcHJlZF9hYm92ZS5idWZfc3RhcnQgKyBidWZfc3BlYy0+bXByZWRfYWJvdmUuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5ycG0uYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+bXByZWRfbXYuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPm1wcmVkX212LmJ1Zl9zaXplKTsKKyNlbHNlCisJYnVmX3NwZWMtPnJwbS5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5tcHJlZF9hYm92ZS5idWZfc3RhcnQgKyBidWZfc3BlYy0+bXByZWRfYWJvdmUuYnVmX3NpemUpOworI2VuZGlmCisJYnVmX3NwZWMtPmxtZW0uYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+cnBtLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5ycG0uYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5lbmRfYWRyID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+bG1lbS5idWZfc3RhcnQgKyBidWZfc3BlYy0+bG1lbS5idWZfc2l6ZSk7CisKKwlpZiAoZGVjKSB7CisJCW1lbV9zdGFydF92aXJ0ID0KKwkJCWNvZGVjX21tX3BoeXNfdG9fdmlydChidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zdGFydCk7CisJCWlmIChtZW1fc3RhcnRfdmlydCkgeworCQkJbWVtc2V0KG1lbV9zdGFydF92aXJ0LCAwLCBidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zaXplKTsKKwkJCWNvZGVjX21tX2RtYV9mbHVzaChtZW1fc3RhcnRfdmlydCwKKwkJCQlidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zaXplLAorCQkJCURNQV9UT19ERVZJQ0UpOworCQl9IGVsc2UgeworCQkJLypub3QgdmlydCBmb3IgdHZwIHBsYXlpbmcsCisJCQltYXkgbmVlZCBjbGVhciBvbiB1Y29kZS4qLworCQkJcHJfZXJyKCJtZW1fc3RhcnRfdmlydCBmYWlsZWRcbiIpOworCQl9CisJCWlmIChkZWJ1ZykgeworCQkJcHJfaW5mbygiJXMgd29ya3NwYWNlICgleCAleCkgc2l6ZSA9ICV4XG4iLCBfX2Z1bmNfXywKKwkJCQkgICBidWZfc3BlYy0+c3RhcnRfYWRyLCBidWZfc3BlYy0+ZW5kX2FkciwKKwkJCQkgICBidWZfc3BlYy0+ZW5kX2FkciAtIGJ1Zl9zcGVjLT5zdGFydF9hZHIpOworCQl9CisJCWlmIChkZWJ1ZykgeworCQkJcHJfaW5mbygiaXBwLmJ1Zl9zdGFydCAgICAgICAgICAgICA6JXhcbiIsCisJCQkJICAgYnVmX3NwZWMtPmlwcC5idWZfc3RhcnQpOworCQkJcHJfaW5mbygic2FvX2Fidi5idWZfc3RhcnQgICAgICAgICAgOiV4XG4iLAorCQkJCSAgIGJ1Zl9zcGVjLT5zYW9fYWJ2LmJ1Zl9zdGFydCk7CisJCQlwcl9pbmZvKCJzYW9fdmIuYnVmX3N0YXJ0ICAgICAgICAgIDoleFxuIiwKKwkJCQkgICBidWZfc3BlYy0+c2FvX3ZiLmJ1Zl9zdGFydCk7CisJCQlwcl9pbmZvKCJzaG9ydF90ZXJtX3Jwcy5idWZfc3RhcnQgIDoleFxuIiwKKwkJCQkgICBidWZfc3BlYy0+c2hvcnRfdGVybV9ycHMuYnVmX3N0YXJ0KTsKKwkJCXByX2luZm8oInJjcy5idWZfc3RhcnQgICAgICAgICAgICAgOiV4XG4iLAorCQkJCSAgIGJ1Zl9zcGVjLT5yY3MuYnVmX3N0YXJ0KTsKKwkJCXByX2luZm8oInNwcy5idWZfc3RhcnQgICAgICAgICAgICAgOiV4XG4iLAorCQkJCSAgIGJ1Zl9zcGVjLT5zcHMuYnVmX3N0YXJ0KTsKKwkJCXByX2luZm8oInBwcy5idWZfc3RhcnQgICAgICAgICAgICAgOiV4XG4iLAorCQkJCSAgIGJ1Zl9zcGVjLT5wcHMuYnVmX3N0YXJ0KTsKKwkJCXByX2luZm8oInNhb191cC5idWZfc3RhcnQgICAgICAgICAgOiV4XG4iLAorCQkJCSAgIGJ1Zl9zcGVjLT5zYW9fdXAuYnVmX3N0YXJ0KTsKKwkJCXByX2luZm8oInN3YXBfYnVmLmJ1Zl9zdGFydCAgICAgICAgOiV4XG4iLAorCQkJCSAgIGJ1Zl9zcGVjLT5zd2FwX2J1Zi5idWZfc3RhcnQpOworCQkJcHJfaW5mbygic3dhcF9idWYyLmJ1Zl9zdGFydCAgICAgICA6JXhcbiIsCisJCQkJICAgYnVmX3NwZWMtPnN3YXBfYnVmMi5idWZfc3RhcnQpOworCQkJcHJfaW5mbygic2NhbGVsdXQuYnVmX3N0YXJ0ICAgICAgICA6JXhcbiIsCisJCQkJICAgYnVmX3NwZWMtPnNjYWxlbHV0LmJ1Zl9zdGFydCk7CisJCQlwcl9pbmZvKCJkYmxrX3BhcmEuYnVmX3N0YXJ0ICAgICAgIDoleFxuIiwKKwkJCQkgICBidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zdGFydCk7CisJCQlwcl9pbmZvKCJkYmxrX2RhdGEuYnVmX3N0YXJ0ICAgICAgIDoleFxuIiwKKwkJCQkgICBidWZfc3BlYy0+ZGJsa19kYXRhLmJ1Zl9zdGFydCk7CisJCQlwcl9pbmZvKCJkYmxrX2RhdGEyLmJ1Zl9zdGFydCAgICAgICA6JXhcbiIsCisJCQkJICAgYnVmX3NwZWMtPmRibGtfZGF0YTIuYnVmX3N0YXJ0KTsKKwkjaWZkZWYgQVZTMl8xMEJfTU1VCisJCQlwcl9pbmZvKCJtbXVfdmJoLmJ1Zl9zdGFydCAgICAgOiV4XG4iLAorCQkJCWJ1Zl9zcGVjLT5tbXVfdmJoLmJ1Zl9zdGFydCk7CisJI2VuZGlmCisJI2lmZGVmIEFWUzJfMTBCX01NVV9EVworCQkJcHJfaW5mbygibW11X3ZiaF9kdy5idWZfc3RhcnQgICAgIDoleFxuIiwKKwkJCQlidWZfc3BlYy0+bW11X3ZiaF9kdy5idWZfc3RhcnQpOworCSNlbmRpZgorCQkJcHJfaW5mbygibXByZWRfYWJvdmUuYnVmX3N0YXJ0ICAgICA6JXhcbiIsCisJCQkJICAgYnVmX3NwZWMtPm1wcmVkX2Fib3ZlLmJ1Zl9zdGFydCk7CisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCQkJcHJfaW5mbygibXByZWRfbXYuYnVmX3N0YXJ0ICAgICAgICA6JXhcbiIsCisJCQkJICAgYnVmX3NwZWMtPm1wcmVkX212LmJ1Zl9zdGFydCk7CisjZW5kaWYKKwkJCWlmICgoZGVidWcgJiBBVlMyX0RCR19TRU5EX1BBUkFNX1dJVEhfUkVHKSA9PSAwKSB7CisJCQkJcHJfaW5mbygicnBtLmJ1Zl9zdGFydCAgICAgICAgICAgICA6JXhcbiIsCisJCQkJCSAgIGJ1Zl9zcGVjLT5ycG0uYnVmX3N0YXJ0KTsKKwkJCX0KKwkJfQorCX0KKworfQorCitzdGF0aWMgdm9pZCB1bmluaXRfbW11X2J1ZmZlcnMoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYykKK3sKKyNpZmRlZiBBVlMyXzEwQl9NTVVfRFcKKwlpZiAoZGVjLT5kd19tbXVfZW5hYmxlICYmIGRlYy0+ZHdfbW11X2JveCkgeworCQlkZWNvZGVyX21tdV9ib3hfZnJlZShkZWMtPmR3X21tdV9ib3gpOworCQlkZWMtPmR3X21tdV9ib3ggPSBOVUxMOworCX0KKyNlbmRpZgorCWRlY29kZXJfbW11X2JveF9mcmVlKGRlYy0+bW11X2JveCk7CisJZGVjLT5tbXVfYm94ID0gTlVMTDsKKworCWlmIChkZWMtPmJtbXVfYm94KQorCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWUoZGVjLT5ibW11X2JveCk7CisJZGVjLT5ibW11X2JveCA9IE5VTEw7Cit9CisKKyNpZm5kZWYgQVZTMl8xMEJfTU1VCitzdGF0aWMgdm9pZCBpbml0X2J1Zl9saXN0KHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMpCit7CisJaW50IGk7CisJaW50IGJ1Zl9zaXplOworCWludCBtY19idWZmZXJfZW5kID0gZGVjLT5tY19idWYtPmJ1Zl9zdGFydCArIGRlYy0+bWNfYnVmLT5idWZfc2l6ZTsKKwlkZWMtPnVzZWRfYnVmX251bSA9IG1heF9idWZfbnVtOworCisJaWYgKGRlYy0+dXNlZF9idWZfbnVtID4gTUFYX0JVRl9OVU0pCisJCWRlYy0+dXNlZF9idWZfbnVtID0gTUFYX0JVRl9OVU07CisJaWYgKGJ1Zl9hbGxvY19zaXplID4gMCkgeworCQlidWZfc2l6ZSA9IGJ1Zl9hbGxvY19zaXplOworCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSLAorCQkJIltCdWZmZXIgTWFuYWdlbWVudF0gaW5pdF9idWZfbGlzdDpcbiIpOworCX0gZWxzZSB7CisJCWludCBwaWNfd2lkdGggPSBkZWMtPmluaXRfcGljX3c7CisJCWludCBwaWNfaGVpZ2h0ID0gZGVjLT5pbml0X3BpY19oOworCisJLypTVVBQT1JUXzEwQklUKi8KKwlpbnQgbG9zbGVzc19jb21wX2hlYWRlcl9zaXplID0gY29tcHV0ZV9sb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUKKwkJCShkZWMsIHBpY193aWR0aCwgcGljX2hlaWdodCk7CisJaW50IGxvc2xlc3NfY29tcF9ib2R5X3NpemUgPSBjb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemUKKwkJCShkZWMsIHBpY193aWR0aCwgcGljX2hlaWdodCwgYnVmX2FsbG9jX2RlcHRoID09IDEwKTsKKwlpbnQgbWNfYnVmZmVyX3NpemUgPSBsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUKKwkJKyBsb3NsZXNzX2NvbXBfYm9keV9zaXplOworCWludCBtY19idWZmZXJfc2l6ZV9oID0gKG1jX2J1ZmZlcl9zaXplICsgMHhmZmZmKT4+MTY7CisKKwlpbnQgZHdfbW9kZSA9IGdldF9kb3VibGVfd3JpdGVfbW9kZV9pbml0KGRlYyk7CisKKwlpZiAoZHdfbW9kZSkgeworCQlpbnQgcGljX3dpZHRoX2R3ID0gcGljX3dpZHRoIC8KKwkJCWdldF9kb3VibGVfd3JpdGVfcmF0aW8oZHdfbW9kZSk7CisJCWludCBwaWNfaGVpZ2h0X2R3ID0gcGljX2hlaWdodCAvCisJCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKGR3X21vZGUpOworCQlpbnQgbGN1X3NpemUgPSA2NDsgLypmaXhlZCA2NCovCisJCWludCBwaWNfd2lkdGhfNjQgPSAocGljX3dpZHRoX2R3ICsgNjMpICYgKH4weDNmKTsKKwkJaW50IHBpY19oZWlnaHRfMzIgPSAocGljX2hlaWdodF9kdyArIDMxKSAmICh+MHgxZik7CisJCWludCBwaWNfd2lkdGhfbGN1ICA9CisJCQkocGljX3dpZHRoXzY0ICUgbGN1X3NpemUpID8gcGljX3dpZHRoXzY0IC8gbGN1X3NpemUKKwkJCSsgMSA6IHBpY193aWR0aF82NCAvIGxjdV9zaXplOworCQlpbnQgcGljX2hlaWdodF9sY3UgPQorCQkJKHBpY19oZWlnaHRfMzIgJSBsY3Vfc2l6ZSkgPyBwaWNfaGVpZ2h0XzMyIC8gbGN1X3NpemUKKwkJCSsgMSA6IHBpY19oZWlnaHRfMzIgLyBsY3Vfc2l6ZTsKKwkJaW50IGxjdV90b3RhbCAgICAgICA9IHBpY193aWR0aF9sY3UgKiBwaWNfaGVpZ2h0X2xjdTsKKwkJaW50IG1jX2J1ZmZlcl9zaXplX3VfdiA9IGxjdV90b3RhbCAqIGxjdV9zaXplICogbGN1X3NpemUgLyAyOworCQlpbnQgbWNfYnVmZmVyX3NpemVfdV92X2ggPSAobWNfYnVmZmVyX3NpemVfdV92ICsgMHhmZmZmKSA+PiAxNjsKKwkJCS8qNjRrIGFsaWdubWVudCovCisJCWJ1Zl9zaXplID0gKChtY19idWZmZXJfc2l6ZV91X3ZfaCA8PCAxNikgKiAzKTsKKwl9IGVsc2UKKwkJYnVmX3NpemUgPSAwOworCisJaWYgKG1jX2J1ZmZlcl9zaXplICYgMHhmZmZmKSB7IC8qNjRrIGFsaWdubWVudCovCisJCW1jX2J1ZmZlcl9zaXplX2ggKz0gMTsKKwl9CisJaWYgKChkd19tb2RlICYgMHgxMCkgPT0gMCkKKwkJYnVmX3NpemUgKz0gKG1jX2J1ZmZlcl9zaXplX2ggPDwgMTYpOworCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSLAorCQkJImluaXRfYnVmX2xpc3QgbnVtICVkICh3aWR0aCAlZCBoZWlnaHQgJWQpOlxuIiwKKwkJCSBkZWMtPnVzZWRfYnVmX251bSwgcGljX3dpZHRoLCBwaWNfaGVpZ2h0KTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZGVjLT51c2VkX2J1Zl9udW07IGkrKykgeworCQlpZiAoKChpICsgMSkgKiBidWZfc2l6ZSkgPiBkZWMtPm1jX2J1Zi0+YnVmX3NpemUpCisJCQlkZWMtPnVzZV9jbWFfZmxhZyA9IDE7CisKKwkJZGVjLT5tX0JVRltpXS5hbGxvY19mbGFnID0gMDsKKwkJZGVjLT5tX0JVRltpXS5pbmRleCA9IGk7CisKKwkJZGVjLT51c2VfY21hX2ZsYWcgPSAxOworCQlpZiAoZGVjLT51c2VfY21hX2ZsYWcpIHsKKwkJCWRlYy0+bV9CVUZbaV0uY21hX3BhZ2VfY291bnQgPQorCQkJCQlQQUdFX0FMSUdOKGJ1Zl9zaXplKSAvIFBBR0VfU0laRTsKKwkJCWlmIChkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkoZGVjLT5ibW11X2JveCwKKwkJCQkJVkZfQlVGRkVSX0lEWChpKSwgYnVmX3NpemUsIERSSVZFUl9OQU1FLAorCQkJCQkmZGVjLT5tX0JVRltpXS5hbGxvY19hZGRyKSA8IDApIHsKKwkJCQlkZWMtPm1fQlVGW2ldLmNtYV9wYWdlX2NvdW50ID0gMDsKKwkJCQlpZiAoaSA8PSA1KSB7CisJCQkJCWRlYy0+ZmF0YWxfZXJyb3IgfD0KKwkJCQkJREVDT0RFUl9GQVRBTF9FUlJPUl9OT19NRU07CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJZGVjLT5tX0JVRltpXS5zdGFydF9hZHIgPSAgZGVjLT5tX0JVRltpXS5hbGxvY19hZGRyOworCQl9IGVsc2UgeworCQkJZGVjLT5tX0JVRltpXS5jbWFfcGFnZV9jb3VudCA9IDA7CisJCQlkZWMtPm1fQlVGW2ldLmFsbG9jX2FkZHIgPSAwOworCQkJZGVjLT5tX0JVRltpXS5zdGFydF9hZHIgPQorCQkJCWRlYy0+bWNfYnVmLT5idWZfc3RhcnQgKyBpICogYnVmX3NpemU7CisJCX0KKwkJZGVjLT5tX0JVRltpXS5zaXplID0gYnVmX3NpemU7CisJCWRlYy0+bV9CVUZbaV0uZnJlZV9zdGFydF9hZHIgPSBkZWMtPm1fQlVGW2ldLnN0YXJ0X2FkcjsKKworCQlpZiAoKChkZWMtPm1fQlVGW2ldLnN0YXJ0X2FkciArIGJ1Zl9zaXplKSA+IG1jX2J1ZmZlcl9lbmQpCisJCQkmJiAoZGVjLT5tX0JVRltpXS5hbGxvY19hZGRyID09IDApKSB7CisJCQlpZiAoZGVidWcpIHsKKwkJCQlhdnMyX3ByaW50KGRlYywgMCwKKwkJCQkiTWF4IG1jIGJ1ZmZlciBvciBtcHJlZF9tdiBidWZmZXIgaXMgdXNlZFxuIik7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1IsCisJCQkiQnVmZmVyICVkOiBzdGFydF9hZHIgJXAgc2l6ZSAleFxuIiwgaSwKKwkJCSAgICh2b2lkICopZGVjLT5tX0JVRltpXS5zdGFydF9hZHIsCisJCQkgICBkZWMtPm1fQlVGW2ldLnNpemUpOworCX0KKwlkZWMtPmJ1Zl9udW0gPSBpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgY29uZmlnX3BpYyhzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjLAorCQkJCXN0cnVjdCBhdnMyX2ZyYW1lX3MgKnBpYywgaW50MzJfdCBsY3Vfc2l6ZV9sb2cyKQoreworCWludCByZXQgPSAtMTsKKwlpbnQgaTsKKwlpbnQgcGljX3dpZHRoID0gZGVjLT5pbml0X3BpY193OworCWludCBwaWNfaGVpZ2h0ID0gZGVjLT5pbml0X3BpY19oOworCS8qc3RydWN0IGF2czJfZGVjb2RlciAqYXZzMl9kZWMgPSAmZGVjLT5hdnMyX2RlYzsKKwlpbnQzMl90IGxjdV9zaXplX2xvZzIgPSBhdnMyX2RlYy0+bGN1X3NpemVfbG9nMjsqLworCWludDMyX3QgbGN1X3NpemUgPSAxIDw8IGxjdV9zaXplX2xvZzI7CisJaW50IHBpY193aWR0aF82NCA9IChwaWNfd2lkdGggKyA2MykgJiAofjB4M2YpOworCWludCBwaWNfaGVpZ2h0XzMyID0gKHBpY19oZWlnaHQgKyAzMSkgJiAofjB4MWYpOworCWludCBwaWNfd2lkdGhfbGN1ICA9IChwaWNfd2lkdGhfNjQgJSBsY3Vfc2l6ZSkgPworCQkJCXBpY193aWR0aF82NCAvIGxjdV9zaXplICArIDEKKwkJCQk6IHBpY193aWR0aF82NCAvIGxjdV9zaXplOworCWludCBwaWNfaGVpZ2h0X2xjdSA9IChwaWNfaGVpZ2h0XzMyICUgbGN1X3NpemUpID8KKwkJCQlwaWNfaGVpZ2h0XzMyIC8gbGN1X3NpemUgKyAxCisJCQkJOiBwaWNfaGVpZ2h0XzMyIC8gbGN1X3NpemU7CisJaW50IGxjdV90b3RhbCAgICAgICA9IHBpY193aWR0aF9sY3UgKiBwaWNfaGVpZ2h0X2xjdTsKKworCXUzMiB5X2FkciA9IDA7CisJaW50IGJ1Zl9zaXplID0gMDsKKworCWludCBsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUgPQorCQkJY29tcHV0ZV9sb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUoCisJCQlkZWMsIHBpY193aWR0aCwgcGljX2hlaWdodCk7CisJaW50IGxvc2xlc3NfY29tcF9ib2R5X3NpemUgPSBjb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemUoCisJCQlkZWMsIHBpY193aWR0aCwKKwkJCXBpY19oZWlnaHQsIGJ1Zl9hbGxvY19kZXB0aCA9PSAxMCk7CisJaW50IG1jX2J1ZmZlcl9zaXplID0gbG9zbGVzc19jb21wX2hlYWRlcl9zaXplICsgbG9zbGVzc19jb21wX2JvZHlfc2l6ZTsKKwlpbnQgbWNfYnVmZmVyX3NpemVfaCA9IChtY19idWZmZXJfc2l6ZSArIDB4ZmZmZikgPj4gMTY7CisJaW50IG1jX2J1ZmZlcl9zaXplX3VfdiA9IDA7CisJaW50IG1jX2J1ZmZlcl9zaXplX3Vfdl9oID0gMDsKKwlpbnQgZHdfbW9kZSA9IGdldF9kb3VibGVfd3JpdGVfbW9kZV9pbml0KGRlYyk7CisKKwlpZiAoZHdfbW9kZSAmJiAoKGR3X21vZGUgJiAweDIwKSA9PSAwKSkgeworCQlpbnQgcGljX3dpZHRoX2R3ID0gcGljX3dpZHRoIC8KKwkJCWdldF9kb3VibGVfd3JpdGVfcmF0aW8oZHdfbW9kZSk7CisJCWludCBwaWNfaGVpZ2h0X2R3ID0gcGljX2hlaWdodCAvCisJCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKGR3X21vZGUpOworCQlpbnQgcGljX3dpZHRoXzY0X2R3ID0gKHBpY193aWR0aF9kdyArIDYzKSAmICh+MHgzZik7CisJCWludCBwaWNfaGVpZ2h0XzMyX2R3ID0gKHBpY19oZWlnaHRfZHcgKyAzMSkgJiAofjB4MWYpOworCQlpbnQgcGljX3dpZHRoX2xjdV9kdyAgPSAocGljX3dpZHRoXzY0X2R3ICUgbGN1X3NpemUpID8KKwkJCQkJcGljX3dpZHRoXzY0X2R3IC8gbGN1X3NpemUgICsgMQorCQkJCQk6IHBpY193aWR0aF82NF9kdyAvIGxjdV9zaXplOworCQlpbnQgcGljX2hlaWdodF9sY3VfZHcgPSAocGljX2hlaWdodF8zMl9kdyAlIGxjdV9zaXplKSA/CisJCQkJCXBpY19oZWlnaHRfMzJfZHcgLyBsY3Vfc2l6ZSArIDEKKwkJCQkJOiBwaWNfaGVpZ2h0XzMyX2R3IC8gbGN1X3NpemU7CisJCWludCBsY3VfdG90YWxfZHcgICAgICAgPSBwaWNfd2lkdGhfbGN1X2R3ICogcGljX2hlaWdodF9sY3VfZHc7CisKKwkJbWNfYnVmZmVyX3NpemVfdV92ID0gbGN1X3RvdGFsX2R3ICogbGN1X3NpemUgKiBsY3Vfc2l6ZSAvIDI7CisJCW1jX2J1ZmZlcl9zaXplX3Vfdl9oID0gKG1jX2J1ZmZlcl9zaXplX3VfdiArIDB4ZmZmZikgPj4gMTY7CisJCS8qNjRrIGFsaWdubWVudCovCisJCWJ1Zl9zaXplID0gKChtY19idWZmZXJfc2l6ZV91X3ZfaCA8PCAxNikgKiAzKTsKKwkJYnVmX3NpemUgPSAoKGJ1Zl9zaXplICsgMHhmZmZmKSA+PiAxNikgPDwgMTY7CisJfQorCWlmIChtY19idWZmZXJfc2l6ZSAmIDB4ZmZmZikgLyo2NGsgYWxpZ25tZW50Ki8KKwkJbWNfYnVmZmVyX3NpemVfaCArPSAxOworCisKKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwlpZiAoZGVjLT5tbXVfZW5hYmxlKSB7CisJCXBpYy0+aGVhZGVyX2FkciA9IGRlY29kZXJfYm1tdV9ib3hfZ2V0X3BoeV9hZGRyKAorCQkJCWRlYy0+Ym1tdV9ib3gsIEhFQURFUl9CVUZGRVJfSURYKHBpYy0+aW5kZXgpKTsKKworI2lmZGVmIEFWUzJfMTBCX01NVV9EVworCQlpZiAoZGVjLT5kd19tbXVfZW5hYmxlKSB7CisJCQlwaWMtPmR3X2hlYWRlcl9hZHIgPSBwaWMtPmhlYWRlcl9hZHIKKwkJCQkrIGdldF9jb21wcmVzc19oZWFkZXJfc2l6ZShkZWMpOworCQl9CisjZW5kaWYKKwkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUl9NT1JFLAorCQkJImJ1Zl9zaXplICVkLCBNTVUgaGVhZGVyX2FkciAlZDogJWxkXG4iLAorCQkJYnVmX3NpemUsIHBpYy0+aW5kZXgsIHBpYy0+aGVhZGVyX2Fkcik7CisJfQorI2Vsc2UKKwlpZiAoKGR3X21vZGUgJiAweDEwKSA9PSAwKQorCQlidWZfc2l6ZSArPSAobWNfYnVmZmVyX3NpemVfaCA8PCAxNik7CisjZW5kaWYKKworCWkgPSBwaWMtPmluZGV4OworCisjaWZuZGVmIEFWUzJfMTBCX01NVQorCWlmIChkZWJ1ZykgeworCQlwcl9lcnIoInN0YXJ0ICV4ICAuc2l6ZT0lZFxuIiwKKwkJCWRlYy0+bWNfYnVmX3NwZWMuYnVmX3N0YXJ0ICsgaSAqIGJ1Zl9zaXplLCBidWZfc2l6ZSk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBkZWMtPmJ1Zl9udW07IGkrKykgeworCQl5X2FkciA9ICgoZGVjLT5tX0JVRltpXS5mcmVlX3N0YXJ0X2FkcgorCQkJKyAweGZmZmYpID4+IDE2KSA8PCAxNjsKKwkJLyo2NGsgYWxpZ25tZW50Ki8KKwkJaWYgKCh5X2FkcitidWZfc2l6ZSkgPD0JKGRlYy0+bV9CVUZbaV0uc3RhcnRfYWRyKworCQkJZGVjLT5tX0JVRltpXS5zaXplKSkgeworCQkJZGVjLT5tX0JVRltpXS5mcmVlX3N0YXJ0X2FkciA9CisJCQkJeV9hZHIgKyBidWZfc2l6ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChpIDwgZGVjLT5idWZfbnVtKQorI2Vsc2UKKwkvKmlmICgoZGVjLT5tY19idWYtPmJ1Zl9zdGFydCArIChpICsgMSkgKiBidWZfc2l6ZSkgPAorCQlkZWMtPm1jX2J1Zi0+YnVmX2VuZCkKKwkJeV9hZHIgPSBkZWMtPm1jX2J1Zi0+YnVmX3N0YXJ0ICsgaSAqIGJ1Zl9zaXplOworCWVsc2UgeyovCisJaWYgKGJ1Zl9zaXplID4gMCAmJiBwaWMtPmNtYV9hbGxvY19hZGRyID09IDApIHsKKwkJcmV0ID0gZGVjb2Rlcl9ibW11X2JveF9hbGxvY19idWZfcGh5KGRlYy0+Ym1tdV9ib3gsCisJCQkJVkZfQlVGRkVSX0lEWChpKSwKKwkJCQlidWZfc2l6ZSwgRFJJVkVSX05BTUUsCisJCQkJJnBpYy0+Y21hX2FsbG9jX2FkZHIpOworCQlpZiAocmV0IDwgMCkgeworCQkJYXZzMl9wcmludChkZWMsIDAsCisJCQkJImRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeSBpZHggJWQgc2l6ZSAlZCBmYWlsXG4iLAorCQkJCVZGX0JVRkZFUl9JRFgoaSksCisJCQkJYnVmX3NpemUKKwkJCQkpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWlmIChwaWMtPmNtYV9hbGxvY19hZGRyKQorCQkJeV9hZHIgPSBwaWMtPmNtYV9hbGxvY19hZGRyOworCQllbHNlIHsKKwkJCWF2czJfcHJpbnQoZGVjLCAwLAorCQkJCSJkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkgaWR4ICVkIHNpemUgJWQgcmV0dXJuIG51bGxcbiIsCisJCQkJVkZfQlVGRkVSX0lEWChpKSwKKwkJCQlidWZfc2l6ZQorCQkJCSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisjZW5kaWYKKwl7CisJCS8qZW5zdXJlIGdldF9waWNfYnlfUE9DKCkKKwkJbm90IGdldCB0aGUgYnVmZmVyIG5vdCBkZWNvZGVkKi8KKwkJcGljLT5CVUZfaW5kZXggPSBpOworCQlwaWMtPmxjdV90b3RhbCA9IGxjdV90b3RhbDsKKworCQlwaWMtPmNvbXBfYm9keV9zaXplID0gbG9zbGVzc19jb21wX2JvZHlfc2l6ZTsKKwkJcGljLT5idWZfc2l6ZSA9IGJ1Zl9zaXplOworCQlwaWMtPm1jX2NhbnZhc195ID0gcGljLT5pbmRleDsKKwkJcGljLT5tY19jYW52YXNfdV92ID0gcGljLT5pbmRleDsKKyNpZm5kZWYgQVZTMl8xMEJfTU1VCisJCXBpYy0+bWNfeV9hZHIgPSB5X2FkcjsKKwkJaWYgKGR3X21vZGUgJiAweDEwKSB7CisJCQlwaWMtPm1jX3Vfdl9hZHIgPSB5X2FkciArCisJCQkoKG1jX2J1ZmZlcl9zaXplX3Vfdl9oIDw8IDE2KSA8PCAxKTsKKworCQkJcGljLT5tY19jYW52YXNfeSA9CisJCQkJKHBpYy0+aW5kZXggPDwgMSk7CisJCQlwaWMtPm1jX2NhbnZhc191X3YgPQorCQkJCShwaWMtPmluZGV4IDw8IDEpICsgMTsKKworCQkJcGljLT5kd195X2FkciA9IHlfYWRyOworCQkJcGljLT5kd191X3ZfYWRyID0gcGljLT5tY191X3ZfYWRyOworCQl9IGVsc2UKKyNlbmRpZgorCQlpZiAoZHdfbW9kZSkgeworI2lmZGVmIEFWUzJfMTBCX01NVQorCQkJcGljLT5kd195X2FkciA9IHlfYWRyOworCQkJcGljLT5kd191X3ZfYWRyID0gcGljLT5kd195X2FkciArCisJCQkJKChtY19idWZmZXJfc2l6ZV91X3ZfaCA8PCAxNikgPDwgMSk7CisJCQlwaWMtPm1jX3lfYWRyID0gcGljLT5kd195X2FkcjsKKwkJCXBpYy0+bWNfdV92X2FkciA9IHBpYy0+ZHdfdV92X2FkcjsKKyNlbHNlCisJCQlwaWMtPmR3X3lfYWRyID0geV9hZHIgKyAobWNfYnVmZmVyX3NpemVfaCA8PCAxNik7CisJCQlwaWMtPmR3X3Vfdl9hZHIgPSBwaWMtPmR3X3lfYWRyICsKKwkJCQkoKG1jX2J1ZmZlcl9zaXplX3Vfdl9oIDw8IDE2KSA8PCAxKTsKKyNlbmRpZgorCQl9CisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCQlwaWMtPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIgPQorCQkJZGVjLT53b3JrX3NwYWNlX2J1Zi0+bXByZWRfbXYuYnVmX3N0YXJ0ICsKKwkJCXBpYy0+aW5kZXggKiAoZGVjLT53b3JrX3NwYWNlX2J1Zi0+bXByZWRfbXYuYnVmX3NpemUgLyBGUkFNRV9CVUZGRVJTKTsKKwkJaWYgKHBpYy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkciA+CisJCQkoZGVjLT53b3JrX3NwYWNlX2J1Zi0+bXByZWRfbXYuYnVmX3N0YXJ0CisJCQkrIGRlYy0+d29ya19zcGFjZV9idWYtPm1wcmVkX212LmJ1Zl9zaXplKSkgeworCQkJYXZzMl9wcmludChkZWMsIDAsICJlcnI6IGZpeGVkIG12IGJ1ZiBvdXQgb2Ygc2l6ZSwgMHgwJXhcbiIsCisJCQkJcGljLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyKTsKKwkJCXBpYy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkciA9CisJCQkJZGVjLT53b3JrX3NwYWNlX2J1Zi0+bXByZWRfbXYuYnVmX3N0YXJ0OworCQl9CisjZW5kaWYKKwkJaWYgKGRlYnVnKSB7CisJCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSLAorCQkJIiVzIGluZGV4ICVkIEJVRl9pbmRleCAlZCBtY195X2FkciAleCAiLAorCQkJX19mdW5jX18sIHBpYy0+aW5kZXgsCisJCQlwaWMtPkJVRl9pbmRleCwKKwkJCXBpYy0+bWNfeV9hZHIpOworCQkJYXZzMl9wcmludF9jb250KGRlYywgQVZTMl9EQkdfQlVGTUdSLAorCQkJImNvbXBfYm9keV9zaXplICV4IGNvbXBfYnVmX3NpemUgJXggIiwKKwkJCXBpYy0+Y29tcF9ib2R5X3NpemUsCisJCQlwaWMtPmJ1Zl9zaXplKTsKKwkJCWF2czJfcHJpbnRfY29udChkZWMsIEFWUzJfREJHX0JVRk1HUiwKKwkJCSJtcHJlZF9tdl93cl9zdGFydF9hZHIgJWRcbiIsCisJCQlwaWMtPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIpOworCQkJYXZzMl9wcmludF9jb250KGRlYywgQVZTMl9EQkdfQlVGTUdSLAorCQkJCSJkd195X2FkciAlZCwgcGljLT5kd191X3ZfYWRyID0lZFxuIiwKKwkJCQlwaWMtPmR3X3lfYWRyLAorCQkJCXBpYy0+ZHdfdV92X2Fkcik7CisJCX0KKwkJcmV0ID0gMDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpbml0X3BpY19saXN0KHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMsCisJaW50MzJfdCBsY3Vfc2l6ZV9sb2cyKQoreworCWludCBpOworCXN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjID0gJmRlYy0+YXZzMl9kZWM7CisJc3RydWN0IGF2czJfZnJhbWVfcyAqcGljOworI2lmZGVmIEFWUzJfMTBCX01NVQorCWlmIChkZWMtPm1tdV9lbmFibGUpIHsKKwkJZm9yIChpID0gMDsgaSA8IGRlYy0+dXNlZF9idWZfbnVtOyBpKyspIHsKKwkJCXVuc2lnbmVkIGxvbmcgYnVmX2FkZHI7CisJCQl1MzIgaGVhZGVyX3NpemUgPSBnZXRfY29tcHJlc3NfaGVhZGVyX3NpemUoZGVjKTsKKyNpZmRlZiBBVlMyXzEwQl9NTVVfRFcKKwkJCWlmIChkZWMtPmR3X21tdV9lbmFibGUpCisJCQkJaGVhZGVyX3NpemUgPDw9IDE7CisjZW5kaWYKKwkJCWlmIChkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkKKwkJCQkJKGRlYy0+Ym1tdV9ib3gsCisJCQkJCUhFQURFUl9CVUZGRVJfSURYKGkpLCBoZWFkZXJfc2l6ZSwKKwkJCQkJRFJJVkVSX0hFQURFUl9OQU1FLAorCQkJCQkmYnVmX2FkZHIpIDwgMCl7CisJCQkJYXZzMl9wcmludChkZWMsIDAsCisJCQkJCSIlcyBtYWxsb2MgY29tcHJlc3MgaGVhZGVyIGZhaWxlZCAlZFxuIiwKKwkJCQkJRFJJVkVSX0hFQURFUl9OQU1FLCBpKTsKKwkJCQlkZWMtPmZhdGFsX2Vycm9yIHw9IERFQ09ERVJfRkFUQUxfRVJST1JfTk9fTUVNOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCWRlYy0+ZnJhbWVfaGVpZ2h0ID0gYXZzMl9kZWMtPmltZy5oZWlnaHQ7CisJZGVjLT5mcmFtZV93aWR0aCA9IGF2czJfZGVjLT5pbWcud2lkdGg7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGVjLT51c2VkX2J1Zl9udW07IGkrKykgeworCQlpZiAoaSA9PSAoZGVjLT51c2VkX2J1Zl9udW0gLSAxKSkKKwkJCXBpYyA9IGF2czJfZGVjLT5tX2JnOworCQllbHNlCisJCQlwaWMgPSBhdnMyX2RlYy0+ZnJlZltpXTsKKwkJcGljLT5pbmRleCA9IGk7CisJCXBpYy0+QlVGX2luZGV4ID0gLTE7CisJCXBpYy0+bXZfYnVmX2luZGV4ID0gLTE7CisJCWlmIChjb25maWdfcGljKGRlYywgcGljLCBsY3Vfc2l6ZV9sb2cyKSA8IDApIHsKKwkJCWlmIChkZWJ1ZykKKwkJCQlhdnMyX3ByaW50KGRlYywgMCwKKwkJCQkJIkNvbmZpZ19waWMgJWQgZmFpbFxuIiwKKwkJCQkJcGljLT5pbmRleCk7CisJCQlwaWMtPmluZGV4ID0gLTE7CisJCQlicmVhazsKKwkJfQorCQlwaWMtPnBpY193ID0gYXZzMl9kZWMtPmltZy53aWR0aDsKKwkJcGljLT5waWNfaCA9IGF2czJfZGVjLT5pbWcuaGVpZ2h0OworCX0KKwlmb3IgKDsgaSA8IGRlYy0+dXNlZF9idWZfbnVtOyBpKyspIHsKKwkJaWYgKGkgPT0gKGRlYy0+dXNlZF9idWZfbnVtIC0gMSkpCisJCQlwaWMgPSBhdnMyX2RlYy0+bV9iZzsKKwkJZWxzZQorCQkJcGljID0gYXZzMl9kZWMtPmZyZWZbaV07CisJCXBpYy0+aW5kZXggPSAtMTsKKwkJcGljLT5CVUZfaW5kZXggPSAtMTsKKwkJcGljLT5tdl9idWZfaW5kZXggPSAtMTsKKwl9CisJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUiwKKwkJIiVzIG9rLCB1c2VkX2J1Zl9udW0gPSAlZFxuIiwKKwkJX19mdW5jX18sIGRlYy0+dXNlZF9idWZfbnVtKTsKKwlkZWMtPnBpY19saXN0X2luaXRfZmxhZyA9IDE7Cit9CisKKworc3RhdGljIHZvaWQgaW5pdF9waWNfbGlzdF9odyhzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCWludCBpOworCXN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjID0gJmRlYy0+YXZzMl9kZWM7CisJc3RydWN0IGF2czJfZnJhbWVfcyAqcGljOworCS8qV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DMkFYSV9UQkxfQ09ORl9BRERSLCAweDApOyovCisjaWYgMAorCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0NPTkZfQUREUiwKKwkJKDB4MSA8PCAxKSB8ICgweDEgPDwgMikpOworCisjaWZkZWYgRFVBTF9DT1JFXzY0CisJV1JJVEVfVlJFRyhIRVZDMl9IRVZDRF9NUFBfQU5DMkFYSV9UQkxfQ09ORl9BRERSLAorCQkoMHgxIDw8IDEpIHwgKDB4MSA8PCAyKSk7CisjZW5kaWYKKyNlbmRpZgorCWZvciAoaSA9IDA7IGkgPCBkZWMtPnVzZWRfYnVmX251bTsgaSsrKSB7CisJCWlmIChpID09IChkZWMtPnVzZWRfYnVmX251bSAtIDEpKQorCQkJcGljID0gYXZzMl9kZWMtPm1fYmc7CisJCWVsc2UKKwkJCXBpYyA9IGF2czJfZGVjLT5mcmVmW2ldOworCQlpZiAocGljLT5pbmRleCA8IDApCisJCQlicmVhazsKKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwkvKldSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0NNRF9BRERSLAorCQlwaWMtPmhlYWRlcl9hZHIKKwkJfCAocGljLT5tY19jYW52YXNfeSA8PCA4KXwweDEpOyovCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0NPTkZfQUREUiwKKwkJCSgweDEgPDwgMSkgfCAocGljLT5pbmRleCA8PCA4KSk7CisKKyNpZmRlZiBEVUFMX0NPUkVfNjQKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWExYMikKKwkJV1JJVEVfVlJFRyhIRVZDMl9NUFBfQU5DMkFYSV9UQkxfQ09ORl9BRERSLAorCQkJKDB4MSA8PCAxKSB8IChwaWMtPmluZGV4IDw8IDgpKTsKKwllbHNlCisJCVdSSVRFX1ZSRUcoSEVWQzJfSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0NPTkZfQUREUiwKKwkJCSgweDEgPDwgMSkgfCAocGljLT5pbmRleCA8PCA4KSk7CisjZW5kaWYKKwlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9EQVRBLCBwaWMtPmhlYWRlcl9hZHIgPj4gNSk7CisjZWxzZQorCS8qV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DMkFYSV9UQkxfQ01EX0FERFIsCisJCXBpYy0+bWNfeV9hZHIKKwkJfCAocGljLT5tY19jYW52YXNfeSA8PCA4KSB8IDB4MSk7Ki8KKwlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9EQVRBLCBwaWMtPm1jX3lfYWRyID4+IDUpOworI2VuZGlmCisjaWZuZGVmIExPU0xFU1NfQ09NUFJFU1NfTU9ERQorCS8qV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DMkFYSV9UQkxfQ01EX0FERFIsCisJCXBpYy0+bWNfdV92X2FkcgorCQl8IChwaWMtPm1jX2NhbnZhc191X3YgPDwgOCl8IDB4MSk7Ki8KKwlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9EQVRBLCBwaWMtPm1jX3Vfdl9hZHIgPj4gNSk7CisjZW5kaWYKKyNpZmRlZiBEVUFMX0NPUkVfNjQKKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwlXUklURV9WUkVHKEhFVkMyX0hFVkNEX01QUF9BTkMyQVhJX1RCTF9EQVRBLAorCQlwaWMtPmhlYWRlcl9hZHIgPj4gNSk7CisjZWxzZQorCVdSSVRFX1ZSRUcoSEVWQzJfSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0RBVEEsCisJCXBpYy0+bWNfeV9hZHIgPj4gNSk7CisjZW5kaWYKKyNpZm5kZWYgTE9TTEVTU19DT01QUkVTU19NT0RFCisJV1JJVEVfVlJFRyhIRVZDMl9IRVZDRF9NUFBfQU5DMkFYSV9UQkxfREFUQSwKKwkJcGljLT5tY191X3ZfYWRyID4+IDUpOworI2VuZGlmCisvKkRVQUxfQ09SRV82NCovCisjZW5kaWYKKwl9CisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DMkFYSV9UQkxfQ09ORl9BRERSLCAweDEpOworI2lmZGVmIERVQUxfQ09SRV82NAorCVdSSVRFX1ZSRUcoSEVWQzJfSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0NPTkZfQUREUiwKKwkJMHgxKTsKKyNlbmRpZgorCS8qWmVybyBvdXQgY2FudmFzIHJlZ2lzdGVycyBpbiBJUFAgLS0gYXZvaWQgc2ltdWxhdGlvbiBYKi8KKwlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0FDQ0NPTkZJR19BRERSLAorCQkJKDAgPDwgOCkgfCAoMCA8PCAxKSB8IDEpOworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSLCAwKTsKKyNpZmRlZiBEVUFMX0NPUkVfNjQKKwkJV1JJVEVfVlJFRyhIRVZDMl9IRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIsIDApOworI2VuZGlmCisJfQorfQorCisKK3N0YXRpYyB2b2lkIGR1bXBfcGljX2xpc3Qoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYykKK3sKKwlpbnQgaWk7CisJc3RydWN0IGF2czJfZGVjb2RlciAqYXZzMl9kZWMgPSAmZGVjLT5hdnMyX2RlYzsKKwlmb3IgKGlpID0gMDsgaWkgPCBhdnMyX2RlYy0+cmVmX21heGJ1ZmZlcjsgaWkrKykgeworCQlhdnMyX3ByaW50KGRlYywgMCwKKwkJImZyZWZbJWRdOiBpbmRleCAlZCBkZWNvZGVfaWQgJWQgbXZidWYgJWQgaW1nY29pX3JlZiAlZCBpbWd0cl9md1JlZkRpc3RhbmNlICVkIHJlZmVyZWQgJWQsIHByZSAlZCBpc19vdXQgJWQsIGJnICVkLCB2Zl9yZWYgJWQgZXJyb3IgJWQgbGN1ICVkIHJlZl9wb3MoJWQsJWQsJWQsJWQsJWQsJWQsJWQpXG4iLAorCQlpaSwgYXZzMl9kZWMtPmZyZWZbaWldLT5pbmRleCwKKwkJYXZzMl9kZWMtPmZyZWZbaWldLT5kZWNvZGVfaWR4LAorCQlhdnMyX2RlYy0+ZnJlZltpaV0tPm12X2J1Zl9pbmRleCwKKwkJYXZzMl9kZWMtPmZyZWZbaWldLT5pbWdjb2lfcmVmLAorCQlhdnMyX2RlYy0+ZnJlZltpaV0tPmltZ3RyX2Z3UmVmRGlzdGFuY2UsCisJCWF2czJfZGVjLT5mcmVmW2lpXS0+cmVmZXJlZF9ieV9vdGhlcnMsCisJCWF2czJfZGVjLT5mcmVmW2lpXS0+dG9fcHJlcGFyZV9kaXNwLAorCQlhdnMyX2RlYy0+ZnJlZltpaV0tPmlzX291dHB1dCwKKwkJYXZzMl9kZWMtPmZyZWZbaWldLT5iZ19mbGFnLAorCQlhdnMyX2RlYy0+ZnJlZltpaV0tPnZmX3JlZiwKKwkJYXZzMl9kZWMtPmZyZWZbaWldLT5lcnJvcl9tYXJrLAorCQlhdnMyX2RlYy0+ZnJlZltpaV0tPmRlY29kZWRfbGN1LAorCQlhdnMyX2RlYy0+ZnJlZltpaV0tPnJlZl9wb2NbMF0sCisJCWF2czJfZGVjLT5mcmVmW2lpXS0+cmVmX3BvY1sxXSwKKwkJYXZzMl9kZWMtPmZyZWZbaWldLT5yZWZfcG9jWzJdLAorCQlhdnMyX2RlYy0+ZnJlZltpaV0tPnJlZl9wb2NbM10sCisJCWF2czJfZGVjLT5mcmVmW2lpXS0+cmVmX3BvY1s0XSwKKwkJYXZzMl9kZWMtPmZyZWZbaWldLT5yZWZfcG9jWzVdLAorCQlhdnMyX2RlYy0+ZnJlZltpaV0tPnJlZl9wb2NbNl0KKwkJKTsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19tY19idWZmZXIoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYykKK3sKKwlpbnQzMl90IGk7CisJc3RydWN0IGF2czJfZGVjb2RlciAqYXZzMl9kZWMgPSAmZGVjLT5hdnMyX2RlYzsKKwlzdHJ1Y3QgYXZzMl9mcmFtZV9zICpwaWM7CisJc3RydWN0IGF2czJfZnJhbWVfcyAqY3VyX3BpYyA9IGF2czJfZGVjLT5oYy5jdXJfcGljOworCisJLyppZiAoYXZzMl9kZWMtPmltZy50eXBlID09IElfSU1HKQorCXJldHVybiAwOworCSovCisJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUl9ERVRBSUwsCisJCSJFbnRlcmVkIGNvbmZpZ19tY19idWZmZXIuLi4uXG4iKTsKKwlpZiAoYXZzMl9kZWMtPmZfYmcgIT0gTlVMTCkgeworCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX0RFVEFJTCwKKwkJCSJjb25maWdfbWNfYnVmZmVyIGZvciBiYWNrZ3JvdW5kIChjYW52YXNfeSAlZCwgY2FudmFzX3VfdiAlZClcbiIsCisJCWF2czJfZGVjLT5mX2JnLT5tY19jYW52YXNfeSwgYXZzMl9kZWMtPmZfYmctPm1jX2NhbnZhc191X3YpOworCQkvKldSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfQUNDQ09ORklHX0FERFIsCisJCQkoNyA8PCA4KSB8ICgwPDwxKSB8IDEpOyAgICBMMDpCRyAqLworCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0FDQ0NPTkZJR19BRERSLAorCQkJKDE1IDw8IDgpIHwgKDA8PDEpIHwgMSk7ICAgLyogTDA6QkcqLworCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUiwKKwkJCShhdnMyX2RlYy0+Zl9iZy0+bWNfY2FudmFzX3VfdiA8PCAxNikgfAorCQkJKGF2czJfZGVjLT5mX2JnLT5tY19jYW52YXNfdV92IDw8IDgpIHwKKwkJCWF2czJfZGVjLT5mX2JnLT5tY19jYW52YXNfeSk7CisJCS8qV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwKKwkJCSgyMyA8PCA4KSB8ICgwPDwxKSB8IDEpOyAgIEwxOkJHKi8KKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwKKwkJCSgzMSA8PCA4KSB8ICgwPDwxKSB8IDEpOyAgLyogTDE6QkcqLworCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUiwKKwkJCShhdnMyX2RlYy0+Zl9iZy0+bWNfY2FudmFzX3VfdiA8PCAxNikgfAorCQkJKGF2czJfZGVjLT5mX2JnLT5tY19jYW52YXNfdV92IDw8IDgpIHwKKwkJCWF2czJfZGVjLT5mX2JnLT5tY19jYW52YXNfeSk7CisJfQorCisJaWYgKGF2czJfZGVjLT5pbWcudHlwZSA9PSBJX0lNRykKKwkJcmV0dXJuIDA7CisKKwlpZiAoYXZzMl9kZWMtPmltZy50eXBlID09IFBfSU1HKSB7CisJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1JfREVUQUlMLAorCQkJImNvbmZpZ19tY19idWZmZXIgZm9yIFBfSU1HLCBpbWcgdHlwZSAlZFxuIiwKKwkJCWF2czJfZGVjLT5pbWcudHlwZSk7CisJCS8qcmVmZXIgdG8gcHJlcGFyZV9SZWZJbmZvKCkqLworCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0FDQ0NPTkZJR19BRERSLAorCQkJKDAgPDwgOCkgfCAoMDw8MSkgfCAxKTsKKwkJZm9yIChpID0gMDsgaSA8IGF2czJfZGVjLT5pbWcubnVtX29mX3JlZmVyZW5jZXM7IGkrKykgeworCQkJcGljID0gYXZzMl9kZWMtPmZyZWZbaV07CisJCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUiwKKwkJCShwaWMtPm1jX2NhbnZhc191X3YgPDwgMTYpIHwKKwkJCShwaWMtPm1jX2NhbnZhc191X3YgPDwgOCkgfAorCQkJcGljLT5tY19jYW52YXNfeSk7CisKKwkJCWlmIChwaWMtPmVycm9yX21hcmspCisJCQkJY3VyX3BpYy0+ZXJyb3JfbWFyayA9IDE7CisKKwkJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1JfREVUQUlMLAorCQkJCSJyZWZpZCAleCBtY19jYW52YXNfdV92ICV4IG1jX2NhbnZhc195ICV4IGVycm9yX21hcmsgJXhcbiIsCisJCQkJaSwgcGljLT5tY19jYW52YXNfdV92LCBwaWMtPm1jX2NhbnZhc195LAorCQkJCXBpYy0+ZXJyb3JfbWFyayk7CisJCX0KKwl9IGVsc2UgaWYgKGF2czJfZGVjLT5pbWcudHlwZSA9PSBGX0lNRykgeworCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX0RFVEFJTCwKKwkJCSJjb25maWdfbWNfYnVmZmVyIGZvciBGX0lNRywgaW1nIHR5cGUgJWRcbiIsCisJCQlhdnMyX2RlYy0+aW1nLnR5cGUpOworCQkvKnJlZmVyIHRvIHByZXBhcmVfUmVmSW5mbygpKi8KKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwKKwkJCSgwIDw8IDgpIHwgKDA8PDEpIHwgMSk7CisJCWZvciAoaSA9IDA7IGkgPCBhdnMyX2RlYy0+aW1nLm51bV9vZl9yZWZlcmVuY2VzOyBpKyspIHsKKwkJCXBpYyA9IGF2czJfZGVjLT5mcmVmW2ldOworCQkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIsCisJCQkJKHBpYy0+bWNfY2FudmFzX3VfdiA8PCAxNikgfAorCQkJCShwaWMtPm1jX2NhbnZhc191X3YgPDwgOCkgfAorCQkJCXBpYy0+bWNfY2FudmFzX3kpOworCisJCQlpZiAocGljLT5lcnJvcl9tYXJrKQorCQkJCWN1cl9waWMtPmVycm9yX21hcmsgPSAxOworCisJCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX0RFVEFJTCwKKwkJCQkicmVmaWQgJXggbWNfY2FudmFzX3VfdiAleCBtY19jYW52YXNfeSAleCBlcnJvcl9tYXJrICV4XG4iLAorCQkJCWksIHBpYy0+bWNfY2FudmFzX3VfdiwgcGljLT5tY19jYW52YXNfeSwKKwkJCQlwaWMtPmVycm9yX21hcmspOworCQl9CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfQUNDQ09ORklHX0FERFIsCisJCQkoMTYgPDwgOCkgfCAoMDw8MSkgfCAxKTsKKwkJZm9yIChpID0gMDsgaSA8IGF2czJfZGVjLT5pbWcubnVtX29mX3JlZmVyZW5jZXM7IGkrKykgeworCQkJcGljID0gYXZzMl9kZWMtPmZyZWZbaV07CisJCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUiwKKwkJCQkocGljLT5tY19jYW52YXNfdV92IDw8IDE2KSB8CisJCQkJKHBpYy0+bWNfY2FudmFzX3VfdiA8PCA4KSB8CisJCQkJcGljLT5tY19jYW52YXNfeSk7CisJCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX0RFVEFJTCwKKwkJCQkicmVmaWQgJXggbWNfY2FudmFzX3VfdiAleCBtY19jYW52YXNfeSAleFxuIiwKKwkJCQlpLCBwaWMtPm1jX2NhbnZhc191X3YsIHBpYy0+bWNfY2FudmFzX3kpOworCQl9CisJfSBlbHNlIHsKKwkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUl9ERVRBSUwsCisJCQkiY29uZmlnX21jX2J1ZmZlciBmb3IgQl9JTUdcbiIpOworCQkvKnJlZmVyIHRvIHByZXBhcmVfUmVmSW5mbygpKi8KKwkJcGljID0gYXZzMl9kZWMtPmZyZWZbMV07CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfQUNDQ09ORklHX0FERFIsCisJCQkoMCA8PCA4KSB8ICgwPDwxKSB8IDEpOworCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUiwKKwkJCShwaWMtPm1jX2NhbnZhc191X3YgPDwgMTYpIHwKKwkJCShwaWMtPm1jX2NhbnZhc191X3YgPDwgOCkgfAorCQkJcGljLT5tY19jYW52YXNfeSk7CisKKwkJaWYgKHBpYy0+ZXJyb3JfbWFyaykKKwkJCWN1cl9waWMtPmVycm9yX21hcmsgPSAxOworCisJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1JfREVUQUlMLAorCQkJInJlZmlkICV4IG1jX2NhbnZhc191X3YgJXggbWNfY2FudmFzX3kgJXggZXJyb3JfbWFyayAleFxuIiwKKwkJCTEsIHBpYy0+bWNfY2FudmFzX3VfdiwgcGljLT5tY19jYW52YXNfeSwKKwkJCXBpYy0+ZXJyb3JfbWFyayk7CisKKwkJcGljID0gYXZzMl9kZWMtPmZyZWZbMF07CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfQUNDQ09ORklHX0FERFIsCisJCQkoMTYgPDwgOCkgfCAoMDw8MSkgfCAxKTsKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIsCisJCQkocGljLT5tY19jYW52YXNfdV92PDwxNikgfAorCQkJKHBpYy0+bWNfY2FudmFzX3Vfdjw8OCkgfAorCQkJcGljLT5tY19jYW52YXNfeSk7CisKKwkJaWYgKHBpYy0+ZXJyb3JfbWFyaykKKwkJCWN1cl9waWMtPmVycm9yX21hcmsgPSAxOworCisJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1JfREVUQUlMLAorCQkJInJlZmlkICV4IG1jX2NhbnZhc191X3YgJXggbWNfY2FudmFzX3kgJXggZXJyb3JfbWFyayAleFxuIiwKKwkJCTAsIHBpYy0+bWNfY2FudmFzX3VfdiwgcGljLT5tY19jYW52YXNfeSwKKwkJCXBpYy0+ZXJyb3JfbWFyayk7CisJfQorCXJldHVybiAwOworfQorI2lmIDAKK3N0YXRpYyB2b2lkIG1jcmNjX2dldF9oaXRyYXRlKHZvaWQpCit7CisJdTMyIHRtcDsKKwl1MzIgcmF3X21jcl9jbnQ7CisJdTMyIGhpdF9tY3JfY250OworCXUzMiBieXBfbWNyX2NudF9uY2hvdXR3aW47CisJdTMyIGJ5cF9tY3JfY250X25jaGNhbnY7CisJaW50IGhpdHJhdGU7CisKKwlpZiAoZGVidWcgJiBBVlMyX0RCR19DQUNIRSkKKwkJcHJfaW5mbygiW2NhY2hlX3V0aWwuY10gRW50ZXJlZCBtY3JjY19nZXRfaGl0cmF0ZS4uLlxuIik7CisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHgwPDwxKSk7CisJcmF3X21jcl9jbnQgPSBSRUFEX1ZSRUcoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9EQVRBKTsKKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDE8PDEpKTsKKwloaXRfbWNyX2NudCA9IFJFQURfVlJFRyhIRVZDRF9NQ1JDQ19QRVJGTU9OX0RBVEEpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4Mjw8MSkpOworCWJ5cF9tY3JfY250X25jaG91dHdpbiA9IFJFQURfVlJFRyhIRVZDRF9NQ1JDQ19QRVJGTU9OX0RBVEEpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4Mzw8MSkpOworCWJ5cF9tY3JfY250X25jaGNhbnYgPSBSRUFEX1ZSRUcoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9EQVRBKTsKKworCWlmIChkZWJ1ZyAmIEFWUzJfREJHX0NBQ0hFKSB7CisJCXByX2luZm8oInJhd19tY3JfY250X3RvdGFsOiAlZFxuIixyYXdfbWNyX2NudCk7CisJCXByX2luZm8oImhpdF9tY3JfY250X3RvdGFsOiAlZFxuIixoaXRfbWNyX2NudCk7CisJCXByX2luZm8oImJ5cF9tY3JfY250X25jaG91dHdpbl90b3RhbDogJWRcbiIsYnlwX21jcl9jbnRfbmNob3V0d2luKTsKKwkJcHJfaW5mbygiYnlwX21jcl9jbnRfbmNoY2Fudl90b3RhbDogJWRcbiIsYnlwX21jcl9jbnRfbmNoY2Fudik7CisJfQorCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4NDw8MSkpOworCXRtcCA9IFJFQURfVlJFRyhIRVZDRF9NQ1JDQ19QRVJGTU9OX0RBVEEpOworCWlmIChkZWJ1ZyAmIEFWUzJfREJHX0NBQ0hFKQorCQlwcl9pbmZvKCJtaXNzX21jcl8wX2NudF90b3RhbDogJWRcbiIsIHRtcCk7CisKKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDU8PDEpKTsKKwl0bXAgPSBSRUFEX1ZSRUcoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9EQVRBKTsKKwlpZiAoZGVidWcgJiBBVlMyX0RCR19DQUNIRSkKKwkJcHJfaW5mbygibWlzc19tY3JfMV9jbnRfdG90YWw6ICVkXG4iLCB0bXApOworCisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHg2PDwxKSk7CisJdG1wID0gUkVBRF9WUkVHKEhFVkNEX01DUkNDX1BFUkZNT05fREFUQSk7CisJaWYgKGRlYnVnICYgQVZTMl9EQkdfQ0FDSEUpCisJCXByX2luZm8oImhpdF9tY3JfMF9jbnRfdG90YWw6ICVkXG4iLHRtcCk7CisKKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDc8PDEpKTsKKwl0bXA9IFJFQURfVlJFRyhIRVZDRF9NQ1JDQ19QRVJGTU9OX0RBVEEpOworCWlmIChkZWJ1ZyAmIEFWUzJfREJHX0NBQ0hFKQorCQlwcl9pbmZvKCJoaXRfbWNyXzFfY250X3RvdGFsOiAlZFxuIix0bXApOworCisJaWYgKHJhd19tY3JfY250ICE9IDApIHsKKwkJaGl0cmF0ZSA9IChoaXRfbWNyX2NudCAvIHJhd19tY3JfY250KSAqIDEwMDsKKwkJaWYgKGRlYnVnICYgQVZTMl9EQkdfQ0FDSEUpCisJCQlwcl9pbmZvKCJNQ1JDQ19ISVRfUkFURSA6ICVkXG4iLCBoaXRyYXRlKTsKKwkJaGl0cmF0ZSA9ICgoYnlwX21jcl9jbnRfbmNob3V0d2luICsgYnlwX21jcl9jbnRfbmNoY2FudikKKwkJCS9yYXdfbWNyX2NudCkgKiAxMDA7CisJCWlmIChkZWJ1ZyAmIEFWUzJfREJHX0NBQ0hFKQorCQkJcHJfaW5mbygiTUNSQ0NfQllQX1JBVEUgOiAlZFxuIiwgaGl0cmF0ZSk7CisJfSBlbHNlIGlmIChkZWJ1ZyAmIEFWUzJfREJHX0NBQ0hFKSB7CisJCQlwcl9pbmZvKCJNQ1JDQ19ISVRfUkFURSA6IG5hXG4iKTsKKwkJCXByX2luZm8oIk1DUkNDX0JZUF9SQVRFIDogbmFcbiIpOworCX0KKwlyZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQgIGRlY29tcF9nZXRfaGl0cmF0ZSh2b2lkKQoreworCXUzMiByYXdfbWNyX2NudDsKKwl1MzIgaGl0X21jcl9jbnQ7CisJaW50IGhpdHJhdGU7CisKKwlpZiAoZGVidWcgJiBBVlMyX0RCR19DQUNIRSkKKwkJcHJfaW5mbygiW2NhY2hlX3V0aWwuY10gRW50ZXJlZCBkZWNvbXBfZ2V0X2hpdHJhdGUuLi5cbiIpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHgwPDwxKSk7CisJcmF3X21jcl9jbnQgPSBSRUFEX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9QRVJGTU9OX0RBVEEpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHgxPDwxKSk7CisJaGl0X21jcl9jbnQgPSBSRUFEX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9QRVJGTU9OX0RBVEEpOworCisJaWYgKGRlYnVnICYgQVZTMl9EQkdfQ0FDSEUpIHsKKwkJcHJfaW5mbygiaGNhY2hlX3Jhd19jbnRfdG90YWw6ICVkXG4iLHJhd19tY3JfY250KTsKKwkJcHJfaW5mbygiaGNhY2hlX2hpdF9jbnRfdG90YWw6ICVkXG4iLGhpdF9tY3JfY250KTsKKwl9CisJaWYgKHJhd19tY3JfY250ICE9IDApIHsKKwkJaGl0cmF0ZSA9IChoaXRfbWNyX2NudCAvIHJhd19tY3JfY250KSAqIDEwMDsKKwkJaWYgKGRlYnVnICYgQVZTMl9EQkdfQ0FDSEUpCisJCQlwcl9pbmZvKCJERUNPTVBfSENBQ0hFX0hJVF9SQVRFIDogJWRcbiIsIGhpdHJhdGUpOworCX0gZWxzZSB7CisJCWlmIChkZWJ1ZyAmIEFWUzJfREJHX0NBQ0hFKQorCQkJcHJfaW5mbygiREVDT01QX0hDQUNIRV9ISVRfUkFURSA6IG5hXG4iKTsKKwl9CisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDI8PDEpKTsKKwlyYXdfbWNyX2NudCA9IFJFQURfVlJFRyhIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fREFUQSk7CisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDM8PDEpKTsKKwloaXRfbWNyX2NudCA9IFJFQURfVlJFRyhIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fREFUQSk7CisKKwlpZiAoZGVidWcgJiBBVlMyX0RCR19DQUNIRSkgeworCQlwcl9pbmZvKCJkY2FjaGVfcmF3X2NudF90b3RhbDogJWRcbiIsIHJhd19tY3JfY250KTsKKwkJcHJfaW5mbygiZGNhY2hlX2hpdF9jbnRfdG90YWw6ICVkXG4iLCBoaXRfbWNyX2NudCk7CisJfQorCWlmIChyYXdfbWNyX2NudCAhPSAwKSB7CisJCWhpdHJhdGUgPSAoaGl0X21jcl9jbnQgLyByYXdfbWNyX2NudCkgKiAxMDA7CisJCWlmIChkZWJ1ZyAmIEFWUzJfREJHX0NBQ0hFKQorCQkJcHJfaW5mbygiREVDT01QX0RDQUNIRV9ISVRfUkFURSA6ICVkXG4iLCBoaXRyYXRlKTsKKwl9IGVsc2UgaWYgKGRlYnVnICYgQVZTMl9EQkdfQ0FDSEUpIHsKKwkJcHJfaW5mbygiREVDT01QX0RDQUNIRV9ISVRfUkFURSA6IG5hXG4iKTsKKwl9CityZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGRlY29tcF9nZXRfY29tcHJhdGUodm9pZCkKK3sKKwl1MzIgcmF3X3Vjb21wX2NudDsKKwl1MzIgZmFzdF9jb21wX2NudDsKKwl1MzIgc2xvd19jb21wX2NudDsKKwlpbnQgY29tcHJhdGU7CisKKwlpZiAoZGVidWcgJiBBVlMyX0RCR19DQUNIRSkKKwkJcHJfaW5mbygiW2NhY2hlX3V0aWwuY10gRW50ZXJlZCBkZWNvbXBfZ2V0X2NvbXByYXRlLi4uXG4iKTsKKwlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4NDw8MSkpOworCWZhc3RfY29tcF9jbnQgPSBSRUFEX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9QRVJGTU9OX0RBVEEpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHg1PDwxKSk7CisJc2xvd19jb21wX2NudCA9IFJFQURfVlJFRyhIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fREFUQSk7CisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDY8PDEpKTsKKwlyYXdfdWNvbXBfY250ID0gUkVBRF9WUkVHKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9EQVRBKTsKKwlpZiAoZGVidWcgJiBBVlMyX0RCR19DQUNIRSkgeworCQlwcl9pbmZvKCJkZWNvbXBfZmFzdF9jb21wX3RvdGFsOiAlZFxuIiwgZmFzdF9jb21wX2NudCk7CisJCXByX2luZm8oImRlY29tcF9zbG93X2NvbXBfdG90YWw6ICVkXG4iLCBzbG93X2NvbXBfY250KTsKKwkJcHJfaW5mbygiZGVjb21wX3Jhd191bmNvbXBfdG90YWw6ICVkXG4iLCByYXdfdWNvbXBfY250KTsKKwl9CisKKwlpZiAocmF3X3Vjb21wX2NudCAhPSAwKSB7CisJCWNvbXByYXRlID0gKChmYXN0X2NvbXBfY250ICsgc2xvd19jb21wX2NudCkKKwkJCS8gcmF3X3Vjb21wX2NudCkgKiAxMDA7CisJCWlmIChkZWJ1ZyAmIEFWUzJfREJHX0NBQ0hFKQorCQkJcHJfaW5mbygiREVDT01QX0NPTVBfUkFUSU8gOiAlZFxuIiwgY29tcHJhdGUpOworCX0gZWxzZSBpZiAoZGVidWcgJiBBVlMyX0RCR19DQUNIRSkgeworCQkJcHJfaW5mbygiREVDT01QX0NPTVBfUkFUSU8gOiBuYVxuIik7CisJfQorCXJldHVybjsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBjb25maWdfbWNyY2NfYXhpX2h3KHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMpCit7CisJdWludDMyX3QgcmRhdGEzMjsKKwl1aW50MzJfdCByZGF0YTMyXzI7CisJc3RydWN0IGF2czJfZGVjb2RlciAqYXZzMl9kZWMgPSAmZGVjLT5hdnMyX2RlYzsKKworCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMSwgMHgyKTsgLyogcmVzZXQgbWNyY2MqLworCisJaWYgKGF2czJfZGVjLT5pbWcudHlwZSA9PSBJX0lNRykgeyAvKiBJLVBJQyovCisJCS8qIHJlbW92ZSByZXNldCAtLSBkaXNhYmxlcyBjbG9jayAqLworCQlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDEsIDB4MCk7CisJCXJldHVybjsKKwl9CisvKgorCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkgeworCQltY3JjY19nZXRfaGl0cmF0ZSgpOworCQlkZWNvbXBfZ2V0X2hpdHJhdGUoKTsKKwkJZGVjb21wX2dldF9jb21wcmF0ZSgpOworCX0KKyovCisJaWYgKChhdnMyX2RlYy0+aW1nLnR5cGUgPT0gQl9JTUcpIHx8CisJCShhdnMyX2RlYy0+aW1nLnR5cGUgPT0gRl9JTUcpKSB7IC8qQi1QSUMgb3IgRl9QSUMqLworCQkvKlByb2dyYW1tZSBjYW52YXMwICovCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfQUNDQ09ORklHX0FERFIsCisJCQkoMCA8PCA4KSB8ICgwIDw8IDEpIHwgMCk7CisJCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSKTsKKwkJcmRhdGEzMiA9IHJkYXRhMzIgJiAweGZmZmY7CisJCXJkYXRhMzIgPSByZGF0YTMyIHwgKHJkYXRhMzIgPDwgMTYpOworCQlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDIsIHJkYXRhMzIpOworCisJCS8qUHJvZ3JhbW1lIGNhbnZhczEgKi8KKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwKKwkJCSgxNiA8PCA4KSB8ICgxIDw8IDEpIHwgMCk7CisJCXJkYXRhMzJfMiA9IFJFQURfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIpOworCQlyZGF0YTMyXzIgPSByZGF0YTMyXzIgJiAweGZmZmY7CisJCXJkYXRhMzJfMiA9IHJkYXRhMzJfMiB8IChyZGF0YTMyXzIgPDwgMTYpOworCQlpZiAocmRhdGEzMiA9PSByZGF0YTMyXzIpIHsKKwkJCXJkYXRhMzJfMiA9CisJCQkJUkVBRF9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUik7CisJCQlyZGF0YTMyXzIgPSByZGF0YTMyXzIgJiAweGZmZmY7CisJCQlyZGF0YTMyXzIgPSByZGF0YTMyXzIgfCAocmRhdGEzMl8yIDw8IDE2KTsKKwkJfQorCQlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDMsIHJkYXRhMzJfMik7CisJfSBlbHNlIHsgLyogUC1QSUMgKi8KKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwKKwkJCSgwIDw8IDgpIHwgKDEgPDwgMSkgfCAwKTsKKwkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIpOworCQlyZGF0YTMyID0gcmRhdGEzMiAmIDB4ZmZmZjsKKwkJcmRhdGEzMiA9IHJkYXRhMzIgfCAocmRhdGEzMiA8PCAxNik7CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMiwgcmRhdGEzMik7CisKKwkJLypQcm9ncmFtbWUgY2FudmFzMSovCisJCXJkYXRhMzIgPQorCQkJUkVBRF9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUik7CisJCXJkYXRhMzIgPSByZGF0YTMyICYgMHhmZmZmOworCQlyZGF0YTMyID0gcmRhdGEzMiB8IChyZGF0YTMyIDw8IDE2KTsKKwkJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwzLCByZGF0YTMyKTsKKwl9CisJLyplbmFibGUgbWNyY2MgcHJvZ3Jlc3NpdmUtbW9kZSAqLworCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMSwgMHhmZjApOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgY29uZmlnX21wcmVkX2h3KHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMpCit7CisJdWludDMyX3QgZGF0YTMyOworCXN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjID0gJmRlYy0+YXZzMl9kZWM7CisJc3RydWN0IGF2czJfZnJhbWVfcyAqY3VyX3BpYyA9IGF2czJfZGVjLT5oYy5jdXJfcGljOworCXN0cnVjdCBhdnMyX2ZyYW1lX3MgKmNvbF9waWMgPSBhdnMyX2RlYy0+ZnJlZlswXTsKKwlpbnQzMl90IG1wcmVkX212X3JkX3N0YXJ0X2FkZHI7CisJaW50MzJfdCBtcHJlZF9jdXJyX2xjdV94OworCWludDMyX3QgbXByZWRfY3Vycl9sY3VfeTsKKwlpbnQzMl90IG1wcmVkX212X3JkX2VuZF9hZGRyOworCWludDMyX3QgYWJvdmVfZW47CisJaW50MzJfdCBtdl93cl9lbjsKKwlpbnQzMl90IG12X3JkX2VuOworCWludDMyX3QgY29sX2lzSW50cmE7CisJaW50IG12X21lbV91bml0OworCWlmIChhdnMyX2RlYy0+aW1nLnR5cGUgIT0gSV9JTUcpIHsKKwkJYWJvdmVfZW4gPSAxOworCQltdl93cl9lbiA9IDE7CisJCW12X3JkX2VuID0gMTsKKwkJY29sX2lzSW50cmEgPSAwOworCX0gZWxzZSB7CisJCWFib3ZlX2VuID0gMTsKKwkJbXZfd3JfZW4gPSAxOworCQltdl9yZF9lbiA9IDA7CisJCWNvbF9pc0ludHJhID0gMDsKKwl9CisKKwltcHJlZF9tdl9yZF9zdGFydF9hZGRyID0KKwkJY29sX3BpYy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkcjsKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19NUFJFRF9DVVJSX0xDVSk7CisJbXByZWRfY3Vycl9sY3VfeCA9IGRhdGEzMiAmIDB4ZmZmZjsKKwltcHJlZF9jdXJyX2xjdV95ID0gKGRhdGEzMiA+PiAxNikgJiAweGZmZmY7CisKKwltdl9tZW1fdW5pdCA9IGF2czJfZGVjLT5sY3Vfc2l6ZV9sb2cyID09IDYgPworCQkweDIwMCA6IChhdnMyX2RlYy0+bGN1X3NpemVfbG9nMiA9PSA1ID8KKwkJCTB4ODAgOiAweDIwKTsKKworCW1wcmVkX212X3JkX2VuZF9hZGRyID0KKwkJbXByZWRfbXZfcmRfc3RhcnRfYWRkciArCisJCSgoYXZzMl9kZWMtPmxjdV94X251bSAqCisJCWF2czJfZGVjLT5sY3VfeV9udW0pICogbXZfbWVtX3VuaXQpOworCisJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUl9ERVRBSUwsCisJCSJjdXIgcGljIGluZGV4ICVkICBjb2wgcGljIGluZGV4ICVkXG4iLAorCQljdXJfcGljLT5pbmRleCwgY29sX3BpYy0+aW5kZXgpOworCisKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfV1JfU1RBUlRfQUREUiwKKwkJY3VyX3BpYy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkcik7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX01WX1JEX1NUQVJUX0FERFIsCisJCWNvbF9waWMtPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIpOworCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1JfREVUQUlMLAorCQkiW01QUkVEIENPX01WXSB3cml0ZSAweCV4ICByZWFkIDB4JXhcbiIsCisJCWN1cl9waWMtPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIsCisJCWNvbF9waWMtPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIpOworCisJZGF0YTMyID0KKwkJKChhdnMyX2RlYy0+YmtfaW1nX2lzX3RvcF9maWVsZCkgPDwgMTMpIHwKKwkJKChhdnMyX2RlYy0+aGQuYmFja2dyb3VuZF9waWN0dXJlX2VuYWJsZSAmIDEpIDw8IDEyKSB8CisJCSgoYXZzMl9kZWMtPmhkLmN1cnJfUlBTLm51bV9vZl9yZWYgJiA3KSA8PCA4KSB8CisJCSgoYXZzMl9kZWMtPmhkLmJfcG12cl9lbmFibGVkICYgMSkgPDwgNikgfAorCQkoKGF2czJfZGVjLT5pbWcuaXNfdG9wX2ZpZWxkICYgMSkgPDwgNSkgfAorCQkoKGF2czJfZGVjLT5pbWcuaXNfZmllbGRfc2VxdWVuY2UgJiAxKSA8PCA0KSB8CisJCSgoYXZzMl9kZWMtPmltZy50eXBlYiAmIDcpIDw8IDEpIHwKKwkJKGF2czJfZGVjLT5oZC5iYWNrZ3JvdW5kX3JlZmVyZW5jZV9lbmFibGUgJiAweDEpOworCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1JfREVUQUlMLAorCQkiSEVWQ19NUFJFRF9DVFJMOSA8PSAweCV4KG51bSBvZiByZWYgJWQpXG4iLAorCQlkYXRhMzIsIGF2czJfZGVjLT5oZC5jdXJyX1JQUy5udW1fb2ZfcmVmKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfQ1RSTDksIGRhdGEzMik7CisKKwlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX0RFVEFJTCwKKwkJIiVzOiBkaXMgJWQgJWQgJWQgJWQgJWQgJWQgJWQgZnJlZjBfcmVmX3BvYyAlZCAlZCAlZCAlZCAlZCAlZCAlZFxuIiwKKwkJX19mdW5jX18sCisJCWF2czJfZGVjLT5mcmVmWzBdLT5pbWd0cl9md1JlZkRpc3RhbmNlLAorCQlhdnMyX2RlYy0+ZnJlZlsxXS0+aW1ndHJfZndSZWZEaXN0YW5jZSwKKwkJYXZzMl9kZWMtPmZyZWZbMl0tPmltZ3RyX2Z3UmVmRGlzdGFuY2UsCisJCWF2czJfZGVjLT5mcmVmWzNdLT5pbWd0cl9md1JlZkRpc3RhbmNlLAorCQlhdnMyX2RlYy0+ZnJlZls0XS0+aW1ndHJfZndSZWZEaXN0YW5jZSwKKwkJYXZzMl9kZWMtPmZyZWZbNV0tPmltZ3RyX2Z3UmVmRGlzdGFuY2UsCisJCWF2czJfZGVjLT5mcmVmWzZdLT5pbWd0cl9md1JlZkRpc3RhbmNlLAorCQlhdnMyX2RlYy0+ZnJlZlswXS0+cmVmX3BvY1swXSwKKwkJYXZzMl9kZWMtPmZyZWZbMF0tPnJlZl9wb2NbMV0sCisJCWF2czJfZGVjLT5mcmVmWzBdLT5yZWZfcG9jWzJdLAorCQlhdnMyX2RlYy0+ZnJlZlswXS0+cmVmX3BvY1szXSwKKwkJYXZzMl9kZWMtPmZyZWZbMF0tPnJlZl9wb2NbNF0sCisJCWF2czJfZGVjLT5mcmVmWzBdLT5yZWZfcG9jWzVdLAorCQlhdnMyX2RlYy0+ZnJlZlswXS0+cmVmX3BvY1s2XQorCQkpOworCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1JfREVUQUlMLAorCQkicGljX2Rpc3RhbmNlICVkLCBpbWd0cl9uZXh0X1AgJWRcbiIsCisJCWF2czJfZGVjLT5pbWcucGljX2Rpc3RhbmNlLCBhdnMyX2RlYy0+aW1nLmltZ3RyX25leHRfUCk7CisKKworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9DVVJfUE9DLCBhdnMyX2RlYy0+aW1nLnBpY19kaXN0YW5jZSk7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0NPTF9QT0MsIGF2czJfZGVjLT5pbWcuaW1ndHJfbmV4dF9QKTsKKworCS8qYmVsb3cgTVBSRUQgUmVmX1BPQ194eF9MeCByZWdpc3RlcnMKKwkJbXVzdCBmb2xsb3cgUmVmX1BPQ194eF9MMCAtPgorCQlSZWZfUE9DX3h4X0wxIGluIHBhaXIgd3JpdGUgb3JkZXIhISEqLworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMF9SRUYwMF9QT0MsCisJCWF2czJfZGVjLT5mcmVmWzBdLT5pbWd0cl9md1JlZkRpc3RhbmNlKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDFfUkVGMDBfUE9DLAorCQlhdnMyX2RlYy0+ZnJlZlswXS0+cmVmX3BvY1swXSk7CisKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDBfUkVGMDFfUE9DLAorCQlhdnMyX2RlYy0+ZnJlZlsxXS0+aW1ndHJfZndSZWZEaXN0YW5jZSk7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wxX1JFRjAxX1BPQywKKwkJYXZzMl9kZWMtPmZyZWZbMF0tPnJlZl9wb2NbMV0pOworCisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wwX1JFRjAyX1BPQywKKwkJYXZzMl9kZWMtPmZyZWZbMl0tPmltZ3RyX2Z3UmVmRGlzdGFuY2UpOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMV9SRUYwMl9QT0MsCisJCWF2czJfZGVjLT5mcmVmWzBdLT5yZWZfcG9jWzJdKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMF9SRUYwM19QT0MsCisJCWF2czJfZGVjLT5mcmVmWzNdLT5pbWd0cl9md1JlZkRpc3RhbmNlKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDFfUkVGMDNfUE9DLAorCQlhdnMyX2RlYy0+ZnJlZlswXS0+cmVmX3BvY1szXSk7CisKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDBfUkVGMDRfUE9DLAorCQlhdnMyX2RlYy0+ZnJlZls0XS0+aW1ndHJfZndSZWZEaXN0YW5jZSk7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wxX1JFRjA0X1BPQywKKwkJYXZzMl9kZWMtPmZyZWZbMF0tPnJlZl9wb2NbNF0pOworCisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wwX1JFRjA1X1BPQywKKwkJYXZzMl9kZWMtPmZyZWZbNV0tPmltZ3RyX2Z3UmVmRGlzdGFuY2UpOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMV9SRUYwNV9QT0MsCisJCWF2czJfZGVjLT5mcmVmWzBdLT5yZWZfcG9jWzVdKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMF9SRUYwNl9QT0MsCisJCWF2czJfZGVjLT5mcmVmWzZdLT5pbWd0cl9md1JlZkRpc3RhbmNlKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDFfUkVGMDZfUE9DLAorCQlhdnMyX2RlYy0+ZnJlZlswXS0+cmVmX3BvY1s2XSk7CisKKworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9NVl9SRF9FTkRfQUREUiwKKwkJbXByZWRfbXZfcmRfZW5kX2FkZHIpOworfQorCitzdGF0aWMgdm9pZCBjb25maWdfZGJsa19odyhzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCS8qCisJKiBQaWN0dXJlIGxldmVsIGRlLWJsb2NrIHBhcmFtZXRlciBjb25maWd1cmF0aW9uIGhlcmUKKwkqLworCXN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjID0gJmRlYy0+YXZzMl9kZWM7CisJdW5pb24gcGFyYW1fdSAqcnBtX3BhcmFtID0gJmF2czJfZGVjLT5wYXJhbTsKKwl1aW50MzJfdCBkYXRhMzI7CisKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19EQkxLX0NGRzEpOworCWRhdGEzMiA9ICgoKGRhdGEzMiA+PiAyMCkgJiAweGZmZikgPDwgMjApIHwKKwkJKCgoYXZzMl9kZWMtPmlucHV0LnNhbXBsZV9iaXRfZGVwdGggPT0gMTApCisJCT8gMHhhIDogMHgwKSA8PCAxNikgfCAgIC8qWzE2ICs6IDRdOiB7bHVtYV9iZFsxOjBdLAorCQkJCQkJCWNocm9tYV9iZFsxOjBdfSovCisJCSgoKGRhdGEzMiA+PiAyKSAmIDB4M2ZmZikgPDwgMikgfAorCQkoKChycG1fcGFyYW0tPnAubGN1X3NpemUgPT0gNikKKwkJPyAwIDogKHJwbV9wYXJhbS0+cC5sY3Vfc2l6ZSA9PSA1KQorCQk/IDEgOiAyKSA8PCAwKTsvKlsgMCArOiAyXTogbGN1X3NpemUqLworCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGRzEsIGRhdGEzMik7CisKKwlkYXRhMzIgPSAoYXZzMl9kZWMtPmltZy5oZWlnaHQgPDwgMTYpIHwKKwkJYXZzMl9kZWMtPmltZy53aWR0aDsKKwlXUklURV9WUkVHKEhFVkNfREJMS19DRkcyLCBkYXRhMzIpOworCS8qCisJWzI3ICs6IDFdOiBjcm9zc19zbGljZV9sb29wZmlsdGVyX2VuYWJsZV9mbGFnCisJWzI2ICs6IDFdOiBsb29wX2ZpbHRlcl9kaXNhYmxlCisJWzI1ICs6IDFdOiB1c2VOU1FUCisJWzIyICs6IDNdOiBpbWd0eXBlCisJWzE3ICs6IDVdOiBhbHBoYV9jX29mZnNldCAoLTh+OCkKKwlbMTIgKzogNV06IGJldGFfb2Zmc2V0ICgtOH44KQorCVsgNiArOiA2XTogY2hyb21hX3F1YW50X3BhcmFtX2RlbHRhX3UgKC0xNn4xNikKKwlbIDAgKzogNl06IGNocm9tYV9xdWFudF9wYXJhbV9kZWx0YV92ICgtMTZ+MTYpCisJKi8KKwlkYXRhMzIgPSAoKGF2czJfZGVjLT5pbnB1dC5jcm9zc1NsaWNlTG9vcEZpbHRlcgorCQkmIDB4MSkgPDwgMjcpIHwKKwkoKHJwbV9wYXJhbS0+cC5sb29wX2ZpbHRlcl9kaXNhYmxlICYgMHgxKSA8PCAyNikgfAorCSgoYXZzMl9kZWMtPmlucHV0LnVzZU5TUVQgJiAweDEpIDw8IDI1KSB8CisJKChhdnMyX2RlYy0+aW1nLnR5cGUgJiAweDcpIDw8IDIyKSB8CisJKChycG1fcGFyYW0tPnAuYWxwaGFfY19vZmZzZXQgJiAweDFmKSA8PCAxNykgfAorCSgocnBtX3BhcmFtLT5wLmJldGFfb2Zmc2V0ICYgMHgxZikgPDwgMTIpIHwKKwkoKHJwbV9wYXJhbS0+cC5jaHJvbWFfcXVhbnRfcGFyYW1fZGVsdGFfY2IgJiAweDNmKSA8PCA2KSB8CisJKChycG1fcGFyYW0tPnAuY2hyb21hX3F1YW50X3BhcmFtX2RlbHRhX2NyICYgMHgzZikgPDwgMCk7CisKKwlXUklURV9WUkVHKEhFVkNfREJMS19DRkc5LCBkYXRhMzIpOworCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1JfREVUQUlMLAorCQkiW2NdIGNmZ0RCTEs6IGNyb3Nzc2xpY2UoJWQpLGxmZGlzYWJsZSglZCksYml0RGVwdGgoJWQpLGxjdVNpemUoJWQpLE5TUVQoJWQpXG4iLAorCQlhdnMyX2RlYy0+aW5wdXQuY3Jvc3NTbGljZUxvb3BGaWx0ZXIsCisJCXJwbV9wYXJhbS0+cC5sb29wX2ZpbHRlcl9kaXNhYmxlLAorCQlhdnMyX2RlYy0+aW5wdXQuc2FtcGxlX2JpdF9kZXB0aCwKKwkJYXZzMl9kZWMtPmxjdV9zaXplLAorCQlhdnMyX2RlYy0+aW5wdXQudXNlTlNRVCk7CisJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUl9ERVRBSUwsCisJCSJbY10gY2ZnREJMSzogYWxwaGFDT2Zmc2V0KCVkKSxiZXRhT2Zmc2V0KCVkKSxxdWFudERlbHRhQ2IoJWQpLHF1YW50RGVsdGFDciglZClcbiIsCisJCXJwbV9wYXJhbS0+cC5hbHBoYV9jX29mZnNldCwKKwkJcnBtX3BhcmFtLT5wLmJldGFfb2Zmc2V0LAorCQlycG1fcGFyYW0tPnAuY2hyb21hX3F1YW50X3BhcmFtX2RlbHRhX2NiLAorCQlycG1fcGFyYW0tPnAuY2hyb21hX3F1YW50X3BhcmFtX2RlbHRhX2NyKTsKKwlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX0RFVEFJTCwKKwkJIltjXSBjZmdEQkxLOiAuZG9uZS5cbiIpOworfQorCitzdGF0aWMgdm9pZCBjb25maWdfc2FvX2h3KHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMpCit7CisJdWludDMyX3QgZGF0YTMyOworCXN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjID0gJmRlYy0+YXZzMl9kZWM7CisJc3RydWN0IGF2czJfZnJhbWVfcyAqY3VyX3BpYyA9IGF2czJfZGVjLT5oYy5jdXJfcGljOworCisJaW50IGxjdV9zaXplID0gNjQ7CisJaW50IG1jX2J1ZmZlcl9zaXplX3VfdiA9CisJCWN1cl9waWMtPmxjdV90b3RhbCAqIGxjdV9zaXplKmxjdV9zaXplLzI7CisJaW50IG1jX2J1ZmZlcl9zaXplX3Vfdl9oID0KKwkJKG1jX2J1ZmZlcl9zaXplX3VfdiArIDB4ZmZmZikgPj4gMTY7Lyo2NGsgYWxpZ25tZW50Ki8KKworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMMCk7CisJZGF0YTMyICY9ICh+MHhmKTsKKwlkYXRhMzIgfD0gYXZzMl9kZWMtPmxjdV9zaXplX2xvZzI7CisJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUl9ERVRBSUwsCisJCSIlcywgbGN1X3NpemVfbG9nMiA9ICVkLCBjb25maWcgSEVWQ19TQU9fQ1RSTDAgMHgleFxuIiwKKwkJX19mdW5jX18sCisJCWF2czJfZGVjLT5sY3Vfc2l6ZV9sb2cyLAorCQlkYXRhMzIpOworCisJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMMCwgZGF0YTMyKTsKKworI2lmbmRlZiBBVlMyXzEwQl9NTVUKKwlpZiAoKGdldF9kb3VibGVfd3JpdGVfbW9kZShkZWMpICYgMHgxMCkgPT0gMCkKKwkJV1JJVEVfVlJFRyhIRVZDX0NNX0JPRFlfU1RBUlRfQUREUiwgY3VyX3BpYy0+bWNfeV9hZHIpOworI2VuZGlmCisJaWYgKChnZXRfZG91YmxlX3dyaXRlX21vZGUoZGVjKSAmIDB4MjApID09IDApIHsKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19ZX1NUQVJUX0FERFIsIGN1cl9waWMtPmR3X3lfYWRyKTsKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19DX1NUQVJUX0FERFIsIGN1cl9waWMtPmR3X3Vfdl9hZHIpOworCQlXUklURV9WUkVHKEhFVkNfU0FPX1lfV1BUUiwgY3VyX3BpYy0+ZHdfeV9hZHIpOworCQlXUklURV9WUkVHKEhFVkNfU0FPX0NfV1BUUiwgY3VyX3BpYy0+ZHdfdV92X2Fkcik7CisJfSBlbHNlIHsKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19ZX1NUQVJUX0FERFIsIDB4ZmZmZmZmZmYpOworCQlXUklURV9WUkVHKEhFVkNfU0FPX0NfU1RBUlRfQUREUiwgMHhmZmZmZmZmZik7CisJfQorI2lmZGVmIEFWUzJfMTBCX01NVQorCVdSSVRFX1ZSRUcoSEVWQ19DTV9IRUFERVJfU1RBUlRfQUREUiwgY3VyX3BpYy0+aGVhZGVyX2Fkcik7CisjZW5kaWYKKyNpZmRlZiBBVlMyXzEwQl9NTVVfRFcKKwlpZiAoZGVjLT5kd19tbXVfZW5hYmxlKSB7CisJCVdSSVRFX1ZSRUcoSEVWQ19DTV9IRUFERVJfU1RBUlRfQUREUjIsIGN1cl9waWMtPmR3X2hlYWRlcl9hZHIpOworCQlXUklURV9WUkVHKEhFVkNfU0FPX1lfU1RBUlRfQUREUiwgMCk7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ19TVEFSVF9BRERSLCAwKTsKKwl9CisjZW5kaWYKKworCWRhdGEzMiA9IChtY19idWZmZXJfc2l6ZV91X3ZfaCA8PCAxNikgPDwgMTsKKwkvKnByX2luZm8oImRhdGEzMj0leCxtY19idWZmZXJfc2l6ZV91X3ZfaD0leCxsY3VfdG90YWw9JXhcbiIsCisJCWRhdGEzMiwgbWNfYnVmZmVyX3NpemVfdV92X2gsIGN1cl9waWMtPmxjdV90b3RhbCk7Ki8KKwlXUklURV9WUkVHKEhFVkNfU0FPX1lfTEVOR1RILCBkYXRhMzIpOworCisJZGF0YTMyID0gKG1jX2J1ZmZlcl9zaXplX3Vfdl9oIDw8IDE2KTsKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NfTEVOR1RILCBkYXRhMzIpOworCisjaWZkZWYgQVZTMl8xMEJfTlYyMQorI2lmZGVmIERPU19QUk9KRUNUCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkwxKTsKKwlkYXRhMzIgJj0gKH4weDMwMDApOworCS8qWzEzOjEyXSBheGlfYWZvcm1hdCwgMC1MaW5lYXIsIDEtMzJ4MzIsIDItNjR4MzIqLworCWRhdGEzMiB8PSAoTUVNX01BUF9NT0RFIDw8IDEyKTsKKwlkYXRhMzIgJj0gKH4weDMpOworCWRhdGEzMiB8PSAweDE7IC8qIFsxXTpkd19kaXNhYmxlIFswXTpjbV9kaXNhYmxlKi8KKworCS8qCisJKiAgWzMxOjI0XSBhcl9maWZvMV9heGlfdGhyZWQKKwkqICBbMjM6MTZdIGFyX2ZpZm8wX2F4aV90aHJlZAorCSogIFsxNToxNF0gYXhpX2xpbmVhbGlnbiwgMC0xNmJ5dGVzLCAxLTMyYnl0ZXMsIDItNjRieXRlcworCSogIFsxMzoxMl0gYXhpX2Fmb3JtYXQsIDAtTGluZWFyLCAxLTMyeDMyLCAyLTY0eDMyCisJKiAgWzExOjA4XSBheGlfbGVuZGlhbl9DCisJKiAgWzA3OjA0XSBheGlfbGVuZGlhbl9ZCisJKiAgWzNdICAgICByZXNlcnZlZAorCSogIFsyXSAgICAgY2xrX2ZvcmNlb24KKwkqICBbMV0gICAgIGR3X2Rpc2FibGU6ZGlzYWJsZSBkb3VibGUgd3JpdGUgb3V0cHV0CisJKiAgWzBdICAgICBjbV9kaXNhYmxlOmRpc2FibGUgY29tcHJlc3Mgb3V0cHV0CisJKi8KKwlkYXRhMzIgJj0gKH4oMyA8PCAxNCkpOworCWRhdGEzMiB8PSAoMiA8PCAxNCk7CisKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkwxLCBkYXRhMzIpOworCS8qWzIzOjIyXSBkd192MV9jdHJsIFsyMToyMF0gZHdfdjBfY3RybCBbMTk6MThdIGR3X2gxX2N0cmwKKwkJWzE3OjE2XSBkd19oMF9jdHJsKi8KKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDUpOworCS8qc2V0IHRoZW0gYWxsIDAgZm9yIEgyNjVfTlYyMSAobm8gZG93bi1zY2FsZSkqLworCWRhdGEzMiAmPSB+KDB4ZmYgPDwgMTYpOworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDUsIGRhdGEzMik7CisJYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ0RfSVBQX0FYSUlGX0NPTkZJRyk7CisJZGF0YTMyICY9ICh+MHgzMCk7CisJLypbNTo0XSBhZGRyZXNzX2Zvcm1hdCAwMDpsaW5lYXIgMDE6MzJ4MzIgMTA6NjR4MzIqLworCWRhdGEzMiB8PSAoTUVNX01BUF9NT0RFIDw8IDQpOworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX0FYSUlGX0NPTkZJRywgZGF0YTMyKTsKKyNlbHNlCisJLyptOGJhYnkgdGVzdDE5MDIqLworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMMSk7CisJZGF0YTMyICY9ICh+MHgzMDAwKTsKKwkvKlsxMzoxMl0gYXhpX2Fmb3JtYXQsIDAtTGluZWFyLCAxLTMyeDMyLCAyLTY0eDMyKi8KKwlkYXRhMzIgfD0gKE1FTV9NQVBfTU9ERSA8PCAxMik7CisJZGF0YTMyICY9ICh+MHhmZjApOworCS8qZGF0YTMyIHw9IDB4NjcwOyovIC8qQmlnLUVuZGlhbiBwZXIgNjQtYml0Ki8KKwlkYXRhMzIgfD0gMHg4ODA7ICAvKi5CaWctRW5kaWFuIHBlciA2NC1iaXQgKi8KKwlkYXRhMzIgJj0gKH4weDMpOworCWRhdGEzMiB8PSAweDE7IC8qWzFdOmR3X2Rpc2FibGUgWzBdOmNtX2Rpc2FibGUqLworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDEsIGRhdGEzMik7CisJLyogWzIzOjIyXSBkd192MV9jdHJsIFsyMToyMF0gZHdfdjBfY3RybAorCVsxOToxOF0gZHdfaDFfY3RybCBbMTc6MTZdIGR3X2gwX2N0cmwqLworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMNSk7CisJLyogc2V0IHRoZW0gYWxsIDAgZm9yIEgyNjVfTlYyMSAobm8gZG93bi1zY2FsZSkqLworCWRhdGEzMiAmPSB+KDB4ZmYgPDwgMTYpOworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDUsIGRhdGEzMik7CisKKwkvKgorCSogWzM6MF0gICBsaXR0bGVfZW5kaWFuCisJKiBbNTo0XSAgIGFkZHJlc3NfZm9ybWF0IDAwOmxpbmVhciAwMTozMngzMiAxMDo2NHgzMgorCSogWzc6Nl0gICByZXNlcnZlZAorCSogWzk6OF0gICBMaW5lYXJfTGluZUFsaWdubWVudCAwMDoxNmJ5dGUgMDE6MzJieXRlIDEwOjY0Ynl0ZQorCSogWzExOjEwXSByZXNlcnZlZAorCSogWzEyXSAgICBDYkNyX2J5dGVfc3dhcAorCSogWzMxOjEzXSByZXNlcnZlZAorCSovCisKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ0RfSVBQX0FYSUlGX0NPTkZJRyk7CisJZGF0YTMyICY9ICh+MHgzMCk7CisJLypbNTo0XSBhZGRyZXNzX2Zvcm1hdCAwMDpsaW5lYXIgMDE6MzJ4MzIgMTA6NjR4MzIqLworCWRhdGEzMiB8PSAoTUVNX01BUF9NT0RFIDw8IDQpOworCWRhdGEzMiAmPSAofjB4Rik7CisJZGF0YTMyIHw9IDB4ODsgLypCaWctRW5kaWFuIHBlciA2NC1iaXQqLworCisJZGF0YTMyICY9ICh+KDMgPDwgOCkpOworCWRhdGEzMiB8PSAoMiA8PCA4KTsKKwlXUklURV9WUkVHKEhFVkNEX0lQUF9BWElJRl9DT05GSUcsIGRhdGEzMik7CisjZW5kaWYKKyNlbHNlCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkwxKTsKKwlkYXRhMzIgJj0gKH4oMyA8PCAxNCkpOworCWRhdGEzMiB8PSAoMiA8PCAxNCk7CS8qIGxpbmUgYWxpZ24gd2l0aCA2NCovCisJZGF0YTMyICY9ICh+MHgzMDAwKTsKKwlkYXRhMzIgfD0gKE1FTV9NQVBfTU9ERSA8PCAxMik7CS8qIFsxMzoxMl0gYXhpX2Fmb3JtYXQsIDAtTGluZWFyLAorCQkJCSAgIDEtMzJ4MzIsIDItNjR4MzIgKi8KKwlkYXRhMzIgJj0gKH4weGZmMCk7CisjaWZkZWYgQVZTMl8xMEJfTU1VX0RXCisJaWYgKGRlYy0+ZHdfbW11X2VuYWJsZSA9PSAwKQorCQlkYXRhMzIgfD0gKChkZWMtPmVuZGlhbiA+PiA4KSAmIDB4ZmZmKTsKKyNlbHNlCisJZGF0YTMyIHw9ICgoZGVjLT5lbmRpYW4gPj4gOCkgJiAweGZmZik7CS8qIGRhdGEzMiB8PSAweDY3MDsgQmlnLUVuZGlhbiBwZXIgNjQtYml0ICovCisjZW5kaWYKKwlkYXRhMzIgJj0gKH4weDMpOyAvKlsxXTpkd19kaXNhYmxlIFswXTpjbV9kaXNhYmxlKi8KKyNpZiAwCisJaWYgIChnZXRfY3B1X21ham9yX2lkKCkgPCBNRVNPTl9DUFVfTUFKT1JfSURfRzEyQSkgeworCQlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGRlYykgPT0gMCkKKwkJCWRhdGEzMiB8PSAweDI7IC8qZGlzYWJsZSBkb3VibGUgd3JpdGUqLworI2lmbmRlZiBBVlMyXzEwQl9NTVUKKwkJZWxzZQorCQlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGRlYykgJiAweDEwKQorCQkJZGF0YTMyIHw9IDB4MTsgLypkaXNhYmxlIGNtKi8KKyNlbmRpZgorCX0KKyNlbmRpZgorCWlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUoZGVjKSA9PSAwKQorCQlkYXRhMzIgfD0gMHgyOyAvKmRpc2FibGUgZG91YmxlIHdyaXRlKi8KKwllbHNlIGlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUoZGVjKSAmIDB4MTApCisJCWRhdGEzMiB8PSAweDE7IC8qZGlzYWJsZSBjbSovCisKKwkvKgorCSogIFszMToyNF0gYXJfZmlmbzFfYXhpX3RocmVkCisJKiAgWzIzOjE2XSBhcl9maWZvMF9heGlfdGhyZWQKKwkqICBbMTU6MTRdIGF4aV9saW5lYWxpZ24sIDAtMTZieXRlcywgMS0zMmJ5dGVzLCAyLTY0Ynl0ZXMKKwkqICBbMTM6MTJdIGF4aV9hZm9ybWF0LCAwLUxpbmVhciwgMS0zMngzMiwgMi02NHgzMgorCSogIFsxMTowOF0gYXhpX2xlbmRpYW5fQworCSogIFswNzowNF0gYXhpX2xlbmRpYW5fWQorCSogIFszXSAgICAgcmVzZXJ2ZWQKKwkqICBbMl0gICAgIGNsa19mb3JjZW9uCisJKiAgWzFdICAgICBkd19kaXNhYmxlOmRpc2FibGUgZG91YmxlIHdyaXRlIG91dHB1dAorCSogIFswXSAgICAgY21fZGlzYWJsZTpkaXNhYmxlIGNvbXByZXNzIG91dHB1dAorCSovCisJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMMSwgZGF0YTMyKTsKKworCWlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUoZGVjKSAmIDB4MTApIHsKKwkJLyogWzIzOjIyXSBkd192MV9jdHJsCisJCVsyMToyMF0gZHdfdjBfY3RybAorCQlbMTk6MThdIGR3X2gxX2N0cmwKKwkJWzE3OjE2XSBkd19oMF9jdHJsCisJCSovCisJCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMNSk7CisJCS8qc2V0IHRoZW0gYWxsIDAgZm9yIEgyNjVfTlYyMSAobm8gZG93bi1zY2FsZSkqLworCQlkYXRhMzIgJj0gfigweGZmIDw8IDE2KTsKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMNSwgZGF0YTMyKTsKKwl9IGVsc2UgeworCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNykKKwkJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDI2LCAwKTsKKworCQlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDUpOworCQlkYXRhMzIgJj0gKH4oMHhmZiA8PCAxNikpOworCQlpZiAoKGdldF9kb3VibGVfd3JpdGVfbW9kZShkZWMpICYgMHhmKSA9PSA4IHx8CisJCQkoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGRlYykgJiAweGYpID09IDkpIHsKKwkJCWRhdGEzMiB8PSAoMHhmZjw8MTYpOworCQkJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMMjYsIDB4Zik7CisJCX0gZWxzZSBpZiAoKGdldF9kb3VibGVfd3JpdGVfbW9kZShkZWMpICYgMHhmKSA9PSAyIHx8CisJCQkoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGRlYykgJiAweGYpID09IDMpCisJCQlkYXRhMzIgfD0gKDB4ZmY8PDE2KTsKKwkJZWxzZSBpZiAoKGdldF9kb3VibGVfd3JpdGVfbW9kZShkZWMpICYgMHhmKSA9PSA0KQorCQkJZGF0YTMyIHw9ICgweDMzPDwxNik7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDUsIGRhdGEzMik7CisJfQorCisJLyoKKwkqIFszOjBdICAgbGl0dGxlX2VuZGlhbgorCSogWzU6NF0gICBhZGRyZXNzX2Zvcm1hdCAwMDpsaW5lYXIgMDE6MzJ4MzIgMTA6NjR4MzIKKwkqIFs3OjZdICAgcmVzZXJ2ZWQKKwkqIFs5OjhdICAgTGluZWFyX0xpbmVBbGlnbm1lbnQgMDA6MTZieXRlIDAxOjMyYnl0ZSAxMDo2NGJ5dGUKKwkqIFsxMToxMF0gcmVzZXJ2ZWQKKwkqIFsxMl0gICAgQ2JDcl9ieXRlX3N3YXAKKwkqIFszMToxM10gcmVzZXJ2ZWQKKwkqLworCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNEX0lQUF9BWElJRl9DT05GSUcpOworCWRhdGEzMiAmPSAofjB4MzApOworCS8qIFs1OjRdICAgIC0tIGFkZHJlc3NfZm9ybWF0IDAwOmxpbmVhciAwMTozMngzMiAxMDo2NHgzMiAqLworCWRhdGEzMiB8PSAobWVtX21hcF9tb2RlIDw8IDQpOworCWRhdGEzMiAmPSAofjB4Rik7CisJZGF0YTMyIHw9IChkZWMtPmVuZGlhbiAmIDB4Zik7ICAvKiB2YWxpZCBvbmx5IHdoZW4gZG91YmxlIHdyaXRlIG9ubHkgKi8KKwkvKmRhdGEzMiB8PSAweDg7Ki8JCS8qIEJpZy1FbmRpYW4gcGVyIDY0LWJpdCAqLworCWRhdGEzMiAmPSAofigzIDw8IDgpKTsKKwlkYXRhMzIgfD0gKDIgPDwgOCk7CQkvKiBsaW5lIGFsaWduIHdpdGggNjQgZm9yIGR3IG9ubHkgKi8KKwlXUklURV9WUkVHKEhFVkNEX0lQUF9BWElJRl9DT05GSUcsIGRhdGEzMik7CisjZW5kaWYKKyNpZm5kZWYgQVZTMl8xMEJfTlYyMQorI2lmZGVmIEFWUzJfMTBCX01NVV9EVworCWlmIChkZWMtPmR3X21tdV9lbmFibGUpIHsKKwkJc3RydWN0IEJ1ZmZJbmZvX3MgKmJ1Zl9zcGVjID0gTlVMTDsKKwkJYnVmX3NwZWMgPSAmZGVjLT53b3JrX3NwYWNlX2J1Zl9zdG9yZTsKKwkJV1JJVEVfVlJFRyhIRVZDX0RXX1ZIMF9BREREUiwgYnVmX3NwZWMtPm1tdV92YmhfZHcuYnVmX3N0YXJ0ICsgKDIgKiBEV19WQkhfQlVGX1NJWkUoYnVmX3NwZWMpKSk7CisJCVdSSVRFX1ZSRUcoSEVWQ19EV19WSDFfQURERFIsIGJ1Zl9zcGVjLT5tbXVfdmJoX2R3LmJ1Zl9zdGFydCArICgzICogRFdfVkJIX0JVRl9TSVpFKGJ1Zl9zcGVjKSkpOworCX0KKyNlbmRpZgorI2VuZGlmCisKK30KKworc3RhdGljIHZvaWQgcmVjb25zdHJ1Y3RDb2VmZmljaWVudHMoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYywKKwlzdHJ1Y3QgQUxGUGFyYW1fcyAqYWxmUGFyYW0pCit7CisJaW50MzJfdCBnLCBzdW0sIGksIGNvZWZmUHJlZDsKKwlmb3IgKGcgPSAwOyBnIDwgYWxmUGFyYW0tPmZpbHRlcnNfcGVyX2dyb3VwOyBnKyspIHsKKwkJc3VtID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IGFsZlBhcmFtLT5udW1fY29lZmYgLSAxOyBpKyspIHsKKwkJCXN1bSArPSAoMiAqIGFsZlBhcmFtLT5jb2VmZm11bHRpW2ddW2ldKTsKKwkJCWRlYy0+bV9maWx0ZXJDb2VmZlN5bVtnXVtpXSA9CisJCQlhbGZQYXJhbS0+Y29lZmZtdWx0aVtnXVtpXTsKKwkJCS8qcHJfaW5mbygiW3RdIGRlYy0+bV9maWx0ZXJDb2VmZlN5bVslZF1bJWRdPTB4JXhcbiIsCisJCQlnLCBpLCBkZWMtPm1fZmlsdGVyQ29lZmZTeW1bZ11baV0pOyovCisJCX0KKwkJY29lZmZQcmVkID0gKDEgPDwgQUxGX05VTV9CSVRfU0hJRlQpIC0gc3VtOworCQlkZWMtPm1fZmlsdGVyQ29lZmZTeW1bZ11bYWxmUGFyYW0tPm51bV9jb2VmZiAtIDFdCisJCT0gY29lZmZQcmVkICsKKwkJYWxmUGFyYW0tPmNvZWZmbXVsdGlbZ11bYWxmUGFyYW0tPm51bV9jb2VmZiAtIDFdOworCQkvKnByX2luZm8oIlt0XSBkZWMtPm1fZmlsdGVyQ29lZmZTeW1bJWRdWyVkXT0weCV4XG4iLAorCQlnLCAoYWxmUGFyYW0tPm51bV9jb2VmZiAtIDEpLAorCQlkZWMtPm1fZmlsdGVyQ29lZmZTeW1bZ11bYWxmUGFyYW0tPm51bV9jb2VmZiAtIDFdKTsqLworCX0KK30KKworc3RhdGljIHZvaWQgcmVjb25zdHJ1Y3RDb2VmSW5mbyhzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjLAorCWludDMyX3QgY29tcElkeCwgc3RydWN0IEFMRlBhcmFtX3MgKmFsZlBhcmFtKQoreworCWludDMyX3QgaTsKKwlpZiAoY29tcElkeCA9PSBBTEZfWSkgeworCQlpZiAoYWxmUGFyYW0tPmZpbHRlcnNfcGVyX2dyb3VwID4gMSkgeworCQkJZm9yIChpID0gMTsgaSA8IE5PX1ZBUl9CSU5TOyArK2kpIHsKKwkJCQlpZiAoYWxmUGFyYW0tPmZpbHRlclBhdHRlcm5baV0pCisJCQkJCWRlYy0+bV92YXJJbmRUYWJbaV0gPQorCQkJCQkJZGVjLT5tX3ZhckluZFRhYltpIC0gMV0gKyAxOworCQkJCWVsc2UKKwkJCQkJZGVjLT5tX3ZhckluZFRhYltpXSA9CisJCQkJCQlkZWMtPm1fdmFySW5kVGFiW2kgLSAxXTsKKwkJCX0KKwkJfQorCX0KKwlyZWNvbnN0cnVjdENvZWZmaWNpZW50cyhkZWMsIGFsZlBhcmFtKTsKK30KKworc3RhdGljIHZvaWQgY29uZmlnX2FsZl9odyhzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCS8qCisJKiBQaWN0dXJlIGxldmVsIEFMRiBwYXJhbWV0ZXIgY29uZmlndXJhdGlvbiBoZXJlCisJKi8KKwl1aW50MzJfdCBkYXRhMzI7CisJaW50MzJfdCBpLCBqOworCWludDMyX3QgbV9maWx0ZXJzX3Blcl9ncm91cDsKKwlzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYyA9ICZkZWMtPmF2czJfZGVjOworCXN0cnVjdCBBTEZQYXJhbV9zICptX2FsZlBpY3R1cmVQYXJhbV95ID0KKwkJJmF2czJfZGVjLT5tX2FsZlBpY3R1cmVQYXJhbVswXTsKKwlzdHJ1Y3QgQUxGUGFyYW1fcyAqbV9hbGZQaWN0dXJlUGFyYW1fY2IgPQorCQkmYXZzMl9kZWMtPm1fYWxmUGljdHVyZVBhcmFtWzFdOworCXN0cnVjdCBBTEZQYXJhbV9zICptX2FsZlBpY3R1cmVQYXJhbV9jciA9CisJCSZhdnMyX2RlYy0+bV9hbGZQaWN0dXJlUGFyYW1bMl07CisKKwlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX0RFVEFJTCwKKwkJIlt0XWFsZnksY2lkeCglZCksZmxhZyglZCksZmlsdGVyc19wZXJfZ3JvdXAoJWQpLGZpbHRlclBhdHRlcm5bMF09MHgleCxbMTVdPTB4JXhcbiIsCisJCW1fYWxmUGljdHVyZVBhcmFtX3ktPmNvbXBvbmVudElELAorCQltX2FsZlBpY3R1cmVQYXJhbV95LT5hbGZfZmxhZywKKwkJbV9hbGZQaWN0dXJlUGFyYW1feS0+ZmlsdGVyc19wZXJfZ3JvdXAsCisJCW1fYWxmUGljdHVyZVBhcmFtX3ktPmZpbHRlclBhdHRlcm5bMF0sCisJCW1fYWxmUGljdHVyZVBhcmFtX3ktPmZpbHRlclBhdHRlcm5bMTVdKTsKKwlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX0RFVEFJTCwKKwkJIlt0XWFsZnksbnVtX2NvZWZmKCVkKSxjb2VmZm11bHRpWzBdWzBdPTB4JXgsWzBdWzFdPTB4JXgsWzFdWzBdPTB4JXgsWzFdWzFdPTB4JXhcbiIsCisJCW1fYWxmUGljdHVyZVBhcmFtX3ktPm51bV9jb2VmZiwKKwkJbV9hbGZQaWN0dXJlUGFyYW1feS0+Y29lZmZtdWx0aVswXVswXSwKKwkJbV9hbGZQaWN0dXJlUGFyYW1feS0+Y29lZmZtdWx0aVswXVsxXSwKKwkJbV9hbGZQaWN0dXJlUGFyYW1feS0+Y29lZmZtdWx0aVsxXVswXSwKKwkJbV9hbGZQaWN0dXJlUGFyYW1feS0+Y29lZmZtdWx0aVsxXVsxXSk7CisKKwkvKkNyKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJZGVjLT5tX3ZhckluZFRhYltpXSA9IDA7CisJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisJCWZvciAoaSA9IDA7IGkgPCA5OyBpKyspCisJCQlkZWMtPm1fZmlsdGVyQ29lZmZTeW1bal1baV0gPSAwOworCXJlY29uc3RydWN0Q29lZkluZm8oZGVjLCAyLCBtX2FsZlBpY3R1cmVQYXJhbV9jcik7CisJZGF0YTMyID0KKwkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bNF0gJiAweGYpIDw8IDI4KSB8CisJCSgoZGVjLT5tX2ZpbHRlckNvZWZmU3ltWzBdWzNdICYgMHg3ZikgPDwgMjEpIHwKKwkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bMl0gJiAweDdmKSA8PCAxNCkgfAorCQkoKGRlYy0+bV9maWx0ZXJDb2VmZlN5bVswXVsxXSAmIDB4N2YpIDw8IDcpIHwKKwkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bMF0gJiAweDdmKSA8PCAwKTsKKwlXUklURV9WUkVHKEhFVkNfREJMS19DRkdELCBkYXRhMzIpOworCWRhdGEzMiA9CisJCSgoZGVjLT5tX2ZpbHRlckNvZWZmU3ltWzBdWzhdICYgMHg3ZikgPDwgMjQpIHwKKwkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bN10gJiAweDdmKSA8PCAxNykgfAorCQkoKGRlYy0+bV9maWx0ZXJDb2VmZlN5bVswXVs2XSAmIDB4N2YpIDw8IDEwKSB8CisJCSgoZGVjLT5tX2ZpbHRlckNvZWZmU3ltWzBdWzVdICYgMHg3ZikgPDwgMykgfAorCQkoKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bNF0gPj4gNCkgJiAweDcpIDw8ICAwKTsKKwlXUklURV9WUkVHKEhFVkNfREJMS19DRkdELCBkYXRhMzIpOworCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1JfREVUQUlMLAorCQkiW2NdIHBpY19hbGZfb25fY3IoJWQpLCBhbGZfY3JfY29lZiglZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZClcbiIsCisJCW1fYWxmUGljdHVyZVBhcmFtX2NyLT5hbGZfZmxhZywKKwkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltWzBdWzBdLAorCQlkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bMV0sCisJCWRlYy0+bV9maWx0ZXJDb2VmZlN5bVswXVsyXSwKKwkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltWzBdWzNdLAorCQlkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bNF0sCisJCWRlYy0+bV9maWx0ZXJDb2VmZlN5bVswXVs1XSwKKwkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltWzBdWzZdLAorCQlkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bN10sCisJCWRlYy0+bV9maWx0ZXJDb2VmZlN5bVswXVs4XSk7CisKKwkvKiBDYiovCisJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisJCWZvciAoaSA9IDA7IGkgPCA5OyBpKyspCisJCQlkZWMtPm1fZmlsdGVyQ29lZmZTeW1bal1baV0gPSAwOworCXJlY29uc3RydWN0Q29lZkluZm8oZGVjLCAxLCBtX2FsZlBpY3R1cmVQYXJhbV9jYik7CisJZGF0YTMyID0KKwkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bNF0gJiAweGYpIDw8IDI4KSB8CisJCSgoZGVjLT5tX2ZpbHRlckNvZWZmU3ltWzBdWzNdICYgMHg3ZikgPDwgMjEpIHwKKwkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bMl0gJiAweDdmKSA8PCAxNCkgfAorCQkoKGRlYy0+bV9maWx0ZXJDb2VmZlN5bVswXVsxXSAmIDB4N2YpIDw8IDcpIHwKKwkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bMF0gJiAweDdmKSA8PCAwKTsKKwlXUklURV9WUkVHKEhFVkNfREJMS19DRkdELCBkYXRhMzIpOworCWRhdGEzMiA9CisJCSgoZGVjLT5tX2ZpbHRlckNvZWZmU3ltWzBdWzhdICYgMHg3ZikgPDwgMjQpIHwKKwkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bN10gJiAweDdmKSA8PCAxNykgfAorCQkoKGRlYy0+bV9maWx0ZXJDb2VmZlN5bVswXVs2XSAmIDB4N2YpIDw8IDEwKSB8CisJCSgoZGVjLT5tX2ZpbHRlckNvZWZmU3ltWzBdWzVdICYgMHg3ZikgPDwgMykgfAorCQkoKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bNF0gPj4gNCkgJiAweDcpIDw8IDApOworCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGR0QsIGRhdGEzMik7CisJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUl9ERVRBSUwsCisJCSJbY10gcGljX2FsZl9vbl9jYiglZCksIGFsZl9jYl9jb2VmKCVkICVkICVkICVkICVkICVkICVkICVkICVkKVxuIiwKKwkJbV9hbGZQaWN0dXJlUGFyYW1fY2ItPmFsZl9mbGFnLAorCQlkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bMF0sCisJCWRlYy0+bV9maWx0ZXJDb2VmZlN5bVswXVsxXSwKKwkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltWzBdWzJdLAorCQlkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bM10sCisJCWRlYy0+bV9maWx0ZXJDb2VmZlN5bVswXVs0XSwKKwkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltWzBdWzVdLAorCQlkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bNl0sCisJCWRlYy0+bV9maWx0ZXJDb2VmZlN5bVswXVs3XSwKKwkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltWzBdWzhdKTsKKworCS8qIFkqLworCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorCQlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQorCQkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltW2pdW2ldID0gMDsKKwlyZWNvbnN0cnVjdENvZWZJbmZvKGRlYywgMCwgbV9hbGZQaWN0dXJlUGFyYW1feSk7CisJZGF0YTMyID0KKwkJKChkZWMtPm1fdmFySW5kVGFiWzddICYgMHhmKSA8PCAyOCkgfAorCQkoKGRlYy0+bV92YXJJbmRUYWJbNl0gJiAweGYpIDw8IDI0KSB8CisJCSgoZGVjLT5tX3ZhckluZFRhYls1XSAmIDB4ZikgPDwgMjApIHwKKwkJKChkZWMtPm1fdmFySW5kVGFiWzRdICYgMHhmKSA8PCAxNikgfAorCQkoKGRlYy0+bV92YXJJbmRUYWJbM10gJiAweGYpIDw8IDEyKSB8CisJCSgoZGVjLT5tX3ZhckluZFRhYlsyXSAmIDB4ZikgPDwgOCkgfAorCQkoKGRlYy0+bV92YXJJbmRUYWJbMV0gJiAweGYpIDw8IDQpIHwKKwkJKChkZWMtPm1fdmFySW5kVGFiWzBdICYgMHhmKSA8PCAwKTsKKwlXUklURV9WUkVHKEhFVkNfREJMS19DRkdELCBkYXRhMzIpOworCWRhdGEzMiA9ICgoZGVjLT5tX3ZhckluZFRhYlsxNV0gJiAweGYpIDw8IDI4KSB8CisJCSgoZGVjLT5tX3ZhckluZFRhYlsxNF0gJiAweGYpIDw8IDI0KSB8CisJCSgoZGVjLT5tX3ZhckluZFRhYlsxM10gJiAweGYpIDw8IDIwKSB8CisJCSgoZGVjLT5tX3ZhckluZFRhYlsxMl0gJiAweGYpIDw8IDE2KSB8CisJCSgoZGVjLT5tX3ZhckluZFRhYlsxMV0gJiAweGYpIDw8IDEyKSB8CisJCSgoZGVjLT5tX3ZhckluZFRhYlsxMF0gJiAweGYpIDw8IDgpIHwKKwkJKChkZWMtPm1fdmFySW5kVGFiWzldICYgMHhmKSA8PCA0KSB8CisJCSgoZGVjLT5tX3ZhckluZFRhYls4XSAmIDB4ZikgPDwgMCk7CisJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHRCwgZGF0YTMyKTsKKwlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX0RFVEFJTCwKKwkJIltjXSBwaWNfYWxmX29uX3koJWQpLCBhbGZfeV90YWIoJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQpXG4iLAorCQltX2FsZlBpY3R1cmVQYXJhbV95LT5hbGZfZmxhZywKKwkJZGVjLT5tX3ZhckluZFRhYlswXSwKKwkJZGVjLT5tX3ZhckluZFRhYlsxXSwKKwkJZGVjLT5tX3ZhckluZFRhYlsyXSwKKwkJZGVjLT5tX3ZhckluZFRhYlszXSwKKwkJZGVjLT5tX3ZhckluZFRhYls0XSwKKwkJZGVjLT5tX3ZhckluZFRhYls1XSwKKwkJZGVjLT5tX3ZhckluZFRhYls2XSwKKwkJZGVjLT5tX3ZhckluZFRhYls3XSwKKwkJZGVjLT5tX3ZhckluZFRhYls4XSwKKwkJZGVjLT5tX3ZhckluZFRhYls5XSwKKwkJZGVjLT5tX3ZhckluZFRhYlsxMF0sCisJCWRlYy0+bV92YXJJbmRUYWJbMTFdLAorCQlkZWMtPm1fdmFySW5kVGFiWzEyXSwKKwkJZGVjLT5tX3ZhckluZFRhYlsxM10sCisJCWRlYy0+bV92YXJJbmRUYWJbMTRdLAorCQlkZWMtPm1fdmFySW5kVGFiWzE1XSk7CisKKwltX2ZpbHRlcnNfcGVyX2dyb3VwID0KKwkJKG1fYWxmUGljdHVyZVBhcmFtX3ktPmFsZl9mbGFnID09IDApID8KKwkJMSA6IG1fYWxmUGljdHVyZVBhcmFtX3ktPmZpbHRlcnNfcGVyX2dyb3VwOworCWZvciAoaSA9IDA7IGkgPCBtX2ZpbHRlcnNfcGVyX2dyb3VwOyBpKyspIHsKKwkJZGF0YTMyID0KKwkJCSgoZGVjLT5tX2ZpbHRlckNvZWZmU3ltW2ldWzRdICYgMHhmKSA8PCAyOCkgfAorCQkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1baV1bM10gJiAweDdmKSA8PCAyMSkgfAorCQkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1baV1bMl0gJiAweDdmKSA8PCAxNCkgfAorCQkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1baV1bMV0gJiAweDdmKSA8PCA3KSB8CisJCQkoKGRlYy0+bV9maWx0ZXJDb2VmZlN5bVtpXVswXSAmIDB4N2YpIDw8IDApOworCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkdELCBkYXRhMzIpOworCQlkYXRhMzIgPQorCQkJLypbMzFdIGxhc3QgaW5kaWNhdGlvbiovCisJCQkoKGkgPT0gbV9maWx0ZXJzX3Blcl9ncm91cC0xKSA8PCAzMSkgfAorCQkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1baV1bOF0gJiAweDdmKSA8PCAyNCkgfAorCQkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1baV1bN10gJiAweDdmKSA8PCAxNykgfAorCQkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1baV1bNl0gJiAweDdmKSA8PCAxMCkgfAorCQkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1baV1bNV0gJiAweDdmKSA8PCAzKSB8CisJCQkoKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1baV1bNF0gPj4gNCkgJiAweDcpIDw8IDApOworCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkdELCBkYXRhMzIpOworCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX0RFVEFJTCwKKwkJCSJbY10gYWxmX3lfY29lZlslZF0oJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQpXG4iLAorCQkJaSwgZGVjLT5tX2ZpbHRlckNvZWZmU3ltW2ldWzBdLAorCQkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltW2ldWzFdLAorCQkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltW2ldWzJdLAorCQkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltW2ldWzNdLAorCQkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltW2ldWzRdLAorCQkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltW2ldWzVdLAorCQkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltW2ldWzZdLAorCQkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltW2ldWzddLAorCQkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltW2ldWzhdKTsKKwl9CisJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUl9ERVRBSUwsCisJCSJbY10gY2ZnQUxGIC5kb25lLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19vdGhlcl9odyhzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCXVpbnQzMl90IGRhdGEzMjsKKwlzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYyA9ICZkZWMtPmF2czJfZGVjOworCXN0cnVjdCBhdnMyX2ZyYW1lX3MgKmN1cl9waWMgPSBhdnMyX2RlYy0+aGMuY3VyX3BpYzsKKwlpbnQgYml0X2RlcHRoID0gY3VyX3BpYy0+Yml0X2RlcHRoOworCWludCBsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUgPQorCQljb21wdXRlX2xvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSgKKwkJZGVjLCBjdXJfcGljLT5waWNfdywKKwkJY3VyX3BpYy0+cGljX2gpOworCWludCBsb3NsZXNzX2NvbXBfYm9keV9zaXplID0KKwkJY29tcHV0ZV9sb3NsZXNzX2NvbXBfYm9keV9zaXplKAorCQlkZWMsIGN1cl9waWMtPnBpY193LAorCQljdXJfcGljLT5waWNfaCwgKGJpdF9kZXB0aCA9PSBBVlMyX0JJVFNfMTApKTsKKwljdXJfcGljLT5jb21wX2JvZHlfc2l6ZSA9IGxvc2xlc3NfY29tcF9ib2R5X3NpemU7CisKKyNpZmRlZiBMT1NMRVNTX0NPTVBSRVNTX01PREUKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDUpOworCWlmIChiaXRfZGVwdGggPT0gQVZTMl9CSVRTXzEwKQorCQlkYXRhMzIgJj0gfigxIDw8IDkpOworCWVsc2UKKwkJZGF0YTMyIHw9ICgxIDw8IDkpOworCisJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMNSwgZGF0YTMyKTsKKworI2lmZGVmIEFWUzJfMTBCX01NVQorCS8qYml0WzRdIDogcGFnZWRfbWVtX21vZGUqLworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLCAoMHgxIDw8IDQpKTsKKyNlbHNlCisJLypiaXRbM10gc21lbSBtZG9lKi8KKwlpZiAoYml0X2RlcHRoID09IEFWUzJfQklUU18xMCkKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDEsICgwIDw8IDMpKTsKKwllbHNlCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLCAoMSA8PCAzKSk7CisjZW5kaWYKKwlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMiwgKGxvc2xlc3NfY29tcF9ib2R5X3NpemUgPj4gNSkpOworCS8qV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDMsKDB4ZmY8PDIwKSB8ICgweGZmPDwxMCkgfCAweGZmKTsqLworCVdSSVRFX1ZSRUcoSEVWQ19DTV9CT0RZX0xFTkdUSCwgbG9zbGVzc19jb21wX2JvZHlfc2l6ZSk7CisJV1JJVEVfVlJFRyhIRVZDX0NNX0hFQURFUl9PRkZTRVQsIGxvc2xlc3NfY29tcF9ib2R5X3NpemUpOworCVdSSVRFX1ZSRUcoSEVWQ19DTV9IRUFERVJfTEVOR1RILCBsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUpOworI2Vsc2UKKwlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMSwgMHgxIDw8IDMxKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdTMyIGluaXRfY3V2YV9zaXplOworc3RhdGljIGludCBjdXZhX2RhdGFfaXNfYXZhaWJsZShzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCXUzMiByZWdfdmFsOworCisJcmVnX3ZhbCA9IFJFQURfVlJFRyhBVlMyX0NVVkFfREFUQV9TSVpFKTsKKwlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX01PUkUsCisJCSIlczpyZWdfdmFsOiAldSBcbiIsCisJCV9fZnVuY19fLCByZWdfdmFsKTsKKwlpZiAocmVnX3ZhbCAhPSAwICYmIHJlZ192YWwgIT0gaW5pdF9jdXZhX3NpemUpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19jdXZhX2J1ZihzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCVdSSVRFX1ZSRUcoQVZTMl9DVVZBX0FEUiwgZGVjLT5jdXZhX3BoeV9hZGRyKTsKKwlpbml0X2N1dmFfc2l6ZSA9IChkZWMtPmN1dmFfc2l6ZSA+PiA0KSA8PCAxNjsKKwlXUklURV9WUkVHKEFWUzJfQ1VWQV9EQVRBX1NJWkUsIGluaXRfY3V2YV9zaXplKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2N1dmFfZGF0YShzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCWludCBpOworCXVuc2lnbmVkIHNob3J0ICpjdXZhX2FkcjsKKwl1bnNpZ25lZCBpbnQgc2l6ZV9yZWdfdmFsID0KKwkJUkVBRF9WUkVHKEFWUzJfQ1VWQV9EQVRBX1NJWkUpOworCXVuc2lnbmVkIGludCBjdXZhX2NvdW50ID0gMDsKKwlpbnQgY3V2YV9zaXplID0gMDsKKwlzdHJ1Y3QgYXZzMl9mcmFtZV9zICpwaWMgPSBkZWMtPmF2czJfZGVjLmhjLmN1cl9waWM7CisJaWYgKHBpYyA9PSBOVUxMIHx8IDAgPT0gY3V2YV9kYXRhX2lzX2F2YWlibGUoZGVjKSkgeworCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfSERSX0lORk8sCisJCSIlczpwaWMgMHglcCBvciBkYXRhIG5vdCBhdmFpYmxlXG4iLAorCQlfX2Z1bmNfXywgcGljKTsKKwkJcmV0dXJuOworCX0KKworCWN1dmFfYWRyID0gKHVuc2lnbmVkIHNob3J0ICopZGVjLT5jdXZhX2FkZHI7CisJY3V2YV9jb3VudCA9ICgoc2l6ZV9yZWdfdmFsID4+IDE2KSA8PCA0KSA+PiAxOworCWN1dmFfc2l6ZSA9IGRlYy0+Y3V2YV9zaXplOworCWRlYy0+aGRyX2ZsYWcgfD0gSERSX0NVVkFfTUFTSzsKKworCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1JfTU9SRSwKKwkJCSIlczpwaWMgMHglcCBjdXZhX2NvdW50KCVkKSBjdXZhX3NpemUoJWQpIGhkcl9mbGFnIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgcGljLCBjdXZhX2NvdW50LCBjdXZhX3NpemUsIGRlYy0+aGRyX2ZsYWcpOworCWlmIChjdXZhX3NpemUgPiAwICYmIGN1dmFfY291bnQgPiAwKSB7CisJCWludCBuZXdfc2l6ZTsKKwkJY2hhciAqbmV3X2J1ZjsKKworCQluZXdfc2l6ZSA9IGN1dmFfc2l6ZTsKKwkJbmV3X2J1ZiA9IHZ6YWxsb2MobmV3X3NpemUpOworCQlpZiAobmV3X2J1ZikgeworCQkJdW5zaWduZWQgY2hhciAqcCA9IG5ld19idWY7CisJCQlpbnQgbGVuID0gMDsKKwkJCXBpYy0+Y3V2YV9kYXRhX2J1ZiA9IG5ld19idWY7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBjdXZhX2NvdW50OyBpICs9IDQpIHsKKwkJCQlpbnQgajsKKworCQkJCWZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKwkJCQkJdW5zaWduZWQgc2hvcnQgYWEgPSBjdXZhX2FkcltpICsgMyAtIGpdOworCQkJCQkqcCA9IGFhICYgMHhmZjsKKwkJCQkJcCsrOworCQkJCQlsZW4rKzsKKwkJCQl9CisJCQl9CisJCQlpZiAobGVuID4gMCkgeworCQkJCXBpYy0+Y3V2YV9kYXRhX3NpemUgPSBsZW47CisJCQl9CisKKwkJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1JfTU9SRSwKKwkJCQkiY3V2YTogKHNpemUgJWQpXG4iLAorCQkJCXBpYy0+Y3V2YV9kYXRhX3NpemUpOworCQkJaWYgKGdldF9kYmdfZmxhZyhkZWMpICYgQVZTMl9EQkdfSERSX0RBVEEpIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgcGljLT5jdXZhX2RhdGFfc2l6ZTsgaSsrKSB7CisJCQkJCXByX2luZm8oIiUwMnggIiwgcGljLT5jdXZhX2RhdGFfYnVmW2ldKTsKKwkJCQkJaWYgKCgoaSArIDEpICYgMHhmKSA9PSAwKQorCQkJCQkJcHJfaW5mbygiXG4iKTsKKwkJCQl9CisJCQkJcHJfaW5mbygiXG4iKTsKKwkJCX0KKworCQl9IGVsc2UgeworCQkJYXZzMl9wcmludChkZWMsIDAsICJuZXcgYnVmIGFsbG9jIGZhaWxlZFxuIik7CisJCQlpZiAocGljLT5jdXZhX2RhdGFfYnVmKQorCQkJCXZmcmVlKHBpYy0+Y3V2YV9kYXRhX2J1Zik7CisJCQlwaWMtPmN1dmFfZGF0YV9idWYgPSBOVUxMOworCQkJcGljLT5jdXZhX2RhdGFfc2l6ZSA9IDA7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfY3V2YV9kYXRhKHN0cnVjdCBhdnMyX2ZyYW1lX3MgKnBpYykKK3sKKwlpZiAocGljID09IE5VTEwpCisJCXJldHVybjsKKwlpZiAocGljLT5jdXZhX2RhdGFfYnVmKSB7CisJCXZmcmVlKHBpYy0+Y3V2YV9kYXRhX2J1Zik7CisJfQorCXBpYy0+Y3V2YV9kYXRhX2J1ZiA9IE5VTEw7CisJcGljLT5jdXZhX2RhdGFfc2l6ZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGF2czJfY29uZmlnX3dvcmtfc3BhY2VfaHcoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYykKK3sKKwlzdHJ1Y3QgQnVmZkluZm9fcyAqYnVmX3NwZWMgPSBkZWMtPndvcmtfc3BhY2VfYnVmOworI2lmZGVmIExPU0xFU1NfQ09NUFJFU1NfTU9ERQorCWludCBsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUgPQorCQljb21wdXRlX2xvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSgKKwkJZGVjLCBkZWMtPmluaXRfcGljX3csCisJCWRlYy0+aW5pdF9waWNfaCk7CisJaW50IGxvc2xlc3NfY29tcF9ib2R5X3NpemUgPQorCQljb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemUoZGVjLAorCQlkZWMtPmluaXRfcGljX3csCisJCWRlYy0+aW5pdF9waWNfaCwgYnVmX2FsbG9jX2RlcHRoID09IDEwKTsKKyNlbmRpZgorI2lmZGVmIEFWUzJfMTBCX01NVQorCXVuc2lnbmVkIGludCBkYXRhMzI7CisjZW5kaWYKKwlpZiAoZGVidWcgJiYgZGVjLT5pbml0X2ZsYWcgPT0gMCkKKwkJYXZzMl9wcmludChkZWMsIDAsCisJCQkiJXMgJXggJXggJXggJXggJXggJXggJXggJXggJXggJXggJXggJXggJXhcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWJ1Zl9zcGVjLT5pcHAuYnVmX3N0YXJ0LAorCQkJYnVmX3NwZWMtPnN0YXJ0X2FkciwKKwkJCWJ1Zl9zcGVjLT5zaG9ydF90ZXJtX3Jwcy5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+cmNzLmJ1Zl9zdGFydCwKKwkJCWJ1Zl9zcGVjLT5zcHMuYnVmX3N0YXJ0LAorCQkJYnVmX3NwZWMtPnBwcy5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+c2FvX3VwLmJ1Zl9zdGFydCwKKwkJCWJ1Zl9zcGVjLT5zd2FwX2J1Zi5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+c3dhcF9idWYyLmJ1Zl9zdGFydCwKKwkJCWJ1Zl9zcGVjLT5zY2FsZWx1dC5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zdGFydCwKKwkJCWJ1Zl9zcGVjLT5kYmxrX2RhdGEuYnVmX3N0YXJ0LAorCQkJYnVmX3NwZWMtPmRibGtfZGF0YTIuYnVmX3N0YXJ0KTsKKwlXUklURV9WUkVHKEhFVkNEX0lQUF9MSU5FQlVGRl9CQVNFLCBidWZfc3BlYy0+aXBwLmJ1Zl9zdGFydCk7CisJaWYgKChkZWJ1ZyAmIEFWUzJfREJHX1NFTkRfUEFSQU1fV0lUSF9SRUcpID09IDApCisJCVdSSVRFX1ZSRUcoSEVWQ19SUE1fQlVGRkVSLCAodTMyKWRlYy0+cnBtX3BoeV9hZGRyKTsKKwlXUklURV9WUkVHKEFWUzJfQUxGX1NXQVBfQlVGRkVSLCBidWZfc3BlYy0+c2hvcnRfdGVybV9ycHMuYnVmX3N0YXJ0KTsKKwlXUklURV9WUkVHKEhFVkNfUkNTX0JVRkZFUiwgYnVmX3NwZWMtPnJjcy5idWZfc3RhcnQpOworCVdSSVRFX1ZSRUcoSEVWQ19TUFNfQlVGRkVSLCBidWZfc3BlYy0+c3BzLmJ1Zl9zdGFydCk7CisJV1JJVEVfVlJFRyhIRVZDX1BQU19CVUZGRVIsIGJ1Zl9zcGVjLT5wcHMuYnVmX3N0YXJ0KTsKKwkvL1dSSVRFX1ZSRUcoSEVWQ19TQU9fVVAsIGJ1Zl9zcGVjLT5zYW9fdXAuYnVmX3N0YXJ0KTsKKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwlXUklURV9WUkVHKEFWUzJfTU1VX01BUF9CVUZGRVIsIGRlYy0+ZnJhbWVfbW11X21hcF9waHlfYWRkcik7CisjZWxzZQorCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fU1dBUF9CVUZGRVIsIGJ1Zl9zcGVjLT5zd2FwX2J1Zi5idWZfc3RhcnQpOworI2VuZGlmCisjaWZkZWYgQVZTMl8xMEJfTU1VX0RXCisJaWYgKGRlYy0+ZHdfbW11X2VuYWJsZSkgeworCQkvL1dSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTU1VX01BUF9BRERSMiwgRlJBTUVfTU1VX01BUF9BRERSX0RXKTsKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19NTVVfRE1BX0NUUkwyLCBkZWMtPmR3X2ZyYW1lX21tdV9tYXBfcGh5X2FkZHIpOworCX0KKyNlbmRpZgorCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fU1dBUF9CVUZGRVIyLCBidWZfc3BlYy0+c3dhcF9idWYyLmJ1Zl9zdGFydCk7CisJLy9XUklURV9WUkVHKEhFVkNfU0NBTEVMVVQsIGJ1Zl9zcGVjLT5zY2FsZWx1dC5idWZfc3RhcnQpOworCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKSB7CisJCWlmIChidWZfc3BlYy0+bWF4X3dpZHRoIDw9IDQwOTYgJiYgYnVmX3NwZWMtPm1heF9oZWlnaHQgPD0gMjMwNCkKKwkJCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGRzMsIDB4NDA0MDEwKTsgLy9kZWZhdWx0IHZhbHVlCisJCWVsc2UKKwkJCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGRzMsIDB4ODA4MDIwKTsgLy8gbWFrZSBsZWZ0IHN0b3JhZ2UgMiB4IDRrXQorCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSLAorCQkJIkhFVkNfREJMS19DRkczID0gJXhcbiIsIFJFQURfVlJFRyhIRVZDX0RCTEtfQ0ZHMykpOworCX0KKworCS8qIGNmZ19wX2FkZHIgKi8KKwlXUklURV9WUkVHKEhFVkNfREJMS19DRkc0LCBidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zdGFydCk7CisJLyogY2ZnX2RfYWRkciAqLworCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGRzUsIGJ1Zl9zcGVjLT5kYmxrX2RhdGEuYnVmX3N0YXJ0KTsKKworCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGR0UsIGJ1Zl9zcGVjLT5kYmxrX2RhdGEyLmJ1Zl9zdGFydCk7CisKKyNpZmRlZiBMT1NMRVNTX0NPTVBSRVNTX01PREUKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDUpOworI2lmIDEKKwlkYXRhMzIgJj0gfigxPDw5KTsKKyNlbHNlCisJaWYgKHBhcmFtcy0+cC5iaXRfZGVwdGggIT0gMHgwMCkKKwkJZGF0YTMyICY9IH4oMTw8OSk7CisJZWxzZQorCQlkYXRhMzIgfD0gKDE8PDkpOworI2VuZGlmCisJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMNSwgZGF0YTMyKTsKKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwkvKmJpdFs0XSA6IHBhZ2VkX21lbV9tb2RlKi8KKwlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMSwgKDB4MSA8PCA0KSk7CisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDIsIDApOworI2Vsc2UKKwkvKiBiaXRbM10gc21lbSBtb2RlKi8KKwlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMSwgKDA8PDMpKTsKKworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwyLCAobG9zbGVzc19jb21wX2JvZHlfc2l6ZSA+PiA1KSk7CisjZW5kaWYKKwkvKldSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwyLChsb3NsZXNzX2NvbXBfYm9keV9zaXplID4+IDUpKTsqLworCS8qV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDMsKDB4ZmY8PDIwKSB8ICgweGZmPDwxMCkgfCAweGZmKTsqLworLyo4LWJpdCBtb2RlICovCisJV1JJVEVfVlJFRyhIRVZDX0NNX0JPRFlfTEVOR1RILCBsb3NsZXNzX2NvbXBfYm9keV9zaXplKTsKKwlXUklURV9WUkVHKEhFVkNfQ01fSEVBREVSX09GRlNFVCwgbG9zbGVzc19jb21wX2JvZHlfc2l6ZSk7CisJV1JJVEVfVlJFRyhIRVZDX0NNX0hFQURFUl9MRU5HVEgsIGxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSk7CisjZWxzZQorCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLCAweDEgPDwgMzEpOworI2VuZGlmCisKKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwlXUklURV9WUkVHKEhFVkNfU0FPX01NVV9WSDBfQUREUiwgYnVmX3NwZWMtPm1tdV92YmguYnVmX3N0YXJ0KTsKKwlXUklURV9WUkVHKEhFVkNfU0FPX01NVV9WSDFfQUREUiwgYnVmX3NwZWMtPm1tdV92YmguYnVmX3N0YXJ0CisJCQkrIFZCSF9CVUZfU0laRShidWZfc3BlYykpOworCS8qZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkw5KTsqLworCS8qZGF0YTMyIHw9IDB4MTsqLworCS8qV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMOSwgZGF0YTMyKTsqLworCisJLyogdXNlIEhFVkNfQ01fSEVBREVSX1NUQVJUX0FERFIgKi8KKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDUpOworCWRhdGEzMiB8PSAoMTw8MTApOworI2lmIDEKKwlpZiAoZGVidWcgJiBBVlMyX0RCR19GT1JDRV9VTkNPTVBSRVNTKQorCQlkYXRhMzIgfD0gMHg4MDsKKyNlbmRpZgorCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDUsIGRhdGEzMik7CisKKyNlbmRpZgorCisjaWZkZWYgQVZTMl8xMEJfTU1VX0RXCisJaWYgKGRlYy0+ZHdfbW11X2VuYWJsZSkgeworCQl1MzIgZGF0YV90bXA7CisJCWRhdGFfdG1wID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkw5KTsKKwkJZGF0YV90bXAgfD0gKDE8PDEwKTsKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMOSwgZGF0YV90bXApOworCisJCVdSSVRFX1ZSRUcoSEVWQ19DTV9CT0RZX0xFTkdUSDIsbG9zbGVzc19jb21wX2JvZHlfc2l6ZSk7CisJCVdSSVRFX1ZSRUcoSEVWQ19DTV9IRUFERVJfT0ZGU0VUMixsb3NsZXNzX2NvbXBfYm9keV9zaXplKTsKKwkJV1JJVEVfVlJFRyhIRVZDX0NNX0hFQURFUl9MRU5HVEgyLGxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSk7CisKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19NTVVfVkgwX0FERFIyLCBidWZfc3BlYy0+bW11X3ZiaF9kdy5idWZfc3RhcnQpOworCQlXUklURV9WUkVHKEhFVkNfU0FPX01NVV9WSDFfQUREUjIsIGJ1Zl9zcGVjLT5tbXVfdmJoX2R3LmJ1Zl9zdGFydCArIERXX1ZCSF9CVUZfU0laRShidWZfc3BlYykpOworCisJCS8qIHVzZSBIRVZDX0NNX0hFQURFUl9TVEFSVF9BRERSICovCisJCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMNSk7CisJCWRhdGEzMiB8PSAoMTw8MTUpOworCQlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw1LCBkYXRhMzIpOworCX0KKyNlbmRpZgorCisKKwlXUklURV9WUkVHKExNRU1fRFVNUF9BRFIsICh1MzIpZGVjLT5sbWVtX3BoeV9hZGRyKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9BQlZfU1RBUlRfQUREUiwgYnVmX3NwZWMtPm1wcmVkX2Fib3ZlLmJ1Zl9zdGFydCk7CisKKyNpZmRlZiBDT19NVl9DT01QUkVTUworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3KSB7CisJICAgIGRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX01QUkVEX0NUUkw0KTsKKwkgICAgZGF0YTMyIHw9ICAoMSA8PCAxKTsKKwkgICAgV1JJVEVfVlJFRyhIRVZDX01QUkVEX0NUUkw0LCBkYXRhMzIpOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBkZWNvbXBfcGVyZmNvdW50X3Jlc2V0KHZvaWQpCit7CisJaWYgKGRlYnVnICYgQVZTMl9EQkdfQ0FDSEUpCisJCXByX2luZm8oIltjYWNoZV91dGlsLmNdIEVudGVyZWQgZGVjb21wX3BlcmZjb3VudF9yZXNldC4uLlxuIik7CisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KTB4MSk7CisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KTB4MCk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBtY3JjY19wZXJmY291bnRfcmVzZXQodm9pZCkKK3sKKwlpZiAoZGVidWcgJiBBVlMyX0RCR19DQUNIRSkKKwkJcHJfaW5mbygiW2NhY2hlX3V0aWwuY10gRW50ZXJlZCBtY3JjY19wZXJmY291bnRfcmVzZXQuLi5cbiIpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpMHgxKTsKKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KTB4MCk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBhdnMyX2luaXRfZGVjb2Rlcl9odyhzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCXVuc2lnbmVkIGludCBkYXRhMzI7CisJdW5zaWduZWQgaW50IGRlY29kZV9tb2RlOworCWludCBpOworCS8qaWYgKGRlYnVnICYgQVZTMl9EQkdfQlVGTUdSX01PUkUpCisJCXByX2luZm8oIiVzXG4iLCBfX2Z1bmNfXyk7Ki8KKwkJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0lOVF9DT05UUk9MKTsKKyNpZiAxCisJCS8qIHNldCBiaXQgMzF+MjkgdG8gMyBpZiBIRVZDX1NUUkVBTV9GSUZPX0NUTFsyOV0gaXMgMSAqLworCQlkYXRhMzIgJj0gfig3IDw8IDI5KTsKKwkJZGF0YTMyIHw9ICgzIDw8IDI5KTsKKyNlbmRpZgorCQlkYXRhMzIgPSBkYXRhMzIgfAorCQkoMSA8PCAyNCkgfC8qc3RyZWFtX2J1ZmZlcl9lbXB0eV9pbnRfYW1yaXNjX2VuYWJsZSovCisJCSgxIDw8IDIyKSB8LypzdHJlYW1fZmlmb19lbXB0eV9pbnRfYW1yaXNjX2VuYWJsZSovCisJCSgxIDw8IDcpIHwvKmRlY19kb25lX2ludF9jcHVfZW5hYmxlKi8KKwkJKDEgPDwgNCkgfC8qc3RhcnRjb2RlX2ZvdW5kX2ludF9jcHVfZW5hYmxlKi8KKwkJKDAgPDwgMykgfC8qc3RhcnRjb2RlX2ZvdW5kX2ludF9hbXJpc2NfZW5hYmxlKi8KKwkJKDEgPDwgMCkgICAgLypwYXJzZXJfaW50X2VuYWJsZSovCisJCTsKKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0lOVF9DT05UUk9MLCBkYXRhMzIpOworCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0hJRlRfU1RBVFVTKTsKKwlkYXRhMzIgPSBkYXRhMzIgfAorCSgwIDw8IDEpIHwvKmVtdWxhdGlvbl9jaGVja19vZmYgVlA5CisJCWRvIG5vdCBoYXZlIGVtdWxhdGlvbiovCisJKDEgPDwgMCkvKnN0YXJ0Y29kZV9jaGVja19vbiovCisJOworCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9TVEFUVVMsIGRhdGEzMik7CisJV1JJVEVfVlJFRyhIRVZDX1NISUZUX0NPTlRST0wsCisJCSg2IDw8IDIwKSB8IC8qIGVtdV9wdXNoX2JpdHMgICg2LWJpdHMgZm9yIEFWUzIpKi8KKwkJKDAgPDwgMTkpIHwgLyogZW11XzNfZW5hYmxlLCBtYXliZSB0dXJuZWQgb24gaW4gbWljcm9jb2RlKi8KKwkJKDAgPDwgMTgpIHwgLyogZW11XzJfZW5hYmxlLCBtYXliZSB0dXJuZWQgb24gaW4gbWljcm9jb2RlKi8KKwkJKDAgPDwgMTcpIHwgLyogZW11XzFfZW5hYmxlLCBtYXliZSB0dXJuZWQgb24gaW4gbWljcm9jb2RlKi8KKwkJKDAgPDwgMTYpIHwgLyogZW11XzBfZW5hYmxlLCBtYXliZSB0dXJuZWQgb24gaW4gbWljcm9jb2RlKi8KKwkJKDAgPDwgMTQpIHwgLypkaXNhYmxlX3N0YXJ0X2NvZGVfcHJvdGVjdCovCisJCSgzIDw8IDYpIHwgLyogc2Z0X3ZhbGlkX3dyX3Bvc2l0aW9uKi8KKwkJKDIgPDwgNCkgfCAvKiBlbXVsYXRlX2NvZGVfbGVuZ3RoX3N1Yl8xKi8KKwkJKDIgPDwgMSkgfCAvKiBzdGFydF9jb2RlX2xlbmd0aF9zdWJfMSovCisJCSgxIDw8IDApICAgLyogc3RyZWFtX3NoaWZ0X2VuYWJsZSovCisJCSk7CisKKwlXUklURV9WUkVHKEhFVkNfU0hJRlRfTEVOR1RIX1BST1RFQ1QsCisJCSgwIDw8IDMwKSB8ICAgLypkYXRhX3Byb3RlY3RfZmlsbF8wMF9lbmFibGUqLworCQkoMSA8PCAyOSkgICAgIC8qZGF0YV9wcm90ZWN0X2ZpbGxfZmZfZW5hYmxlKi8KKwkJKTsKKwlXUklURV9WUkVHKEhFVkNfQ0FCQUNfQ09OVFJPTCwKKwkJKDEgPDwgMCkvKmNhYmFjX2VuYWJsZSovCisJKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfQ09SRV9DT05UUk9MLAorCQkoMSA8PCAwKS8qIGhldmNfcGFyc2VyX2NvcmVfY2xrX2VuKi8KKwkpOworCisKKwlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIDApOworCisJLypJbml0aWFsIElRSVRfU0NBTEVMVVQgbWVtb3J5IC0tIGp1c3QgdG8gYXZvaWQgWCBpbiBzaW11bGF0aW9uKi8KKwlpZiAoaXNfcmRtYV9lbmFibGUoKSkKKwkJcmRtYV9iYWNrX2VuZF93b3JrKGRlYy0+cmRtYV9waHlfYWRyLCBSRE1BX1NJWkUpOworCWVsc2UgeworCQlXUklURV9WUkVHKEhFVkNfSVFJVF9TQ0FMRUxVVF9XUl9BRERSLCAwKTsvKmNmZ19wX2FkZHIqLworCQlmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorCQkJV1JJVEVfVlJFRyhIRVZDX0lRSVRfU0NBTEVMVVRfREFUQSwgMCk7CisJfQorCisjaWZkZWYgRU5BQkxFX1NXQVBfVEVTVAorCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fU1dBUF9URVNULCAxMDApOworI2Vsc2UKKwlXUklURV9WUkVHKEhFVkNfU1RSRUFNX1NXQVBfVEVTVCwgMCk7CisjZW5kaWYKKwlpZiAoIWRlYy0+bV9pbnNfZmxhZykKKwkJZGVjb2RlX21vZGUgPSBERUNPREVfTU9ERV9TSU5HTEU7CisJZWxzZSBpZiAodmRlY19mcmFtZV9iYXNlZChod190b192ZGVjKGRlYykpKQorCQlkZWNvZGVfbW9kZSA9IERFQ09ERV9NT0RFX01VTFRJX0ZSQU1FQkFTRTsKKwllbHNlCisJCWRlY29kZV9tb2RlID0gREVDT0RFX01PREVfTVVMVElfU1RSRUFNQkFTRTsKKwlpZiAoZGVjLT5hdnMyX2RlYy5idWZtZ3JfZXJyb3JfZmxhZyAmJgorCQkoZXJyb3JfaGFuZGxlX3BvbGljeSAmIDB4MSkpIHsKKwkJZGVjLT5idWZtZ3JfZXJyb3JfY291bnQrKzsKKwkJZGVjLT5hdnMyX2RlYy5idWZtZ3JfZXJyb3JfZmxhZyA9IDA7CisJCWlmIChkZWMtPmJ1Zm1ncl9lcnJvcl9jb3VudCA+CisJCQkocmVfc2VhcmNoX3NlcV90aHJlc2hvbGQgJiAweGZmKQorCQkJJiYgZGVjLT5mcmFtZV9jb3VudCA+CisJCQkoKHJlX3NlYXJjaF9zZXFfdGhyZXNob2xkID4+IDgpICYgMHhmZikpIHsKKwkJCXN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjID0gJmRlYy0+YXZzMl9kZWM7CisJCQlkZWMtPnN0YXJ0X2RlY29kaW5nX2ZsYWcgPSAwOworCQkJYXZzMl9kZWMtPmhkLnZlY19mbGFnID0gMTsKKwkJCWRlYy0+c2tpcF9QQl9iZWZvcmVfSSA9IDE7CisJCQlhdnMyX3ByaW50KGRlYywgMCwKKwkJCQkiISFCdWZtZ3IgZXJyb3IsIHNlYXJjaCBzZXEgYWdhaW4gKDB4JXggJWQgJWQpXG4iLAorCQkJCWVycm9yX2hhbmRsZV9wb2xpY3ksCisJCQkJZGVjLT5mcmFtZV9jb3VudCwKKwkJCQlkZWMtPmJ1Zm1ncl9lcnJvcl9jb3VudCk7CisJCQlkZWMtPmJ1Zm1ncl9lcnJvcl9jb3VudCA9IDA7CisJCX0KKwl9CisJZGVjb2RlX21vZGUgfD0gKGRlYy0+c3RhcnRfZGVjb2RpbmdfZmxhZyA8PCAxNik7CisKKwlXUklURV9WUkVHKERFQ09ERV9NT0RFLCBkZWNvZGVfbW9kZSk7CisJV1JJVEVfVlJFRyhIRVZDX0RFQ09ERV9TSVpFLCAwKTsKKwlXUklURV9WUkVHKEhFVkNfREVDT0RFX0NPVU5ULCAwKTsKKworCS8qU2VuZCBwYXJzZXJfY21kKi8KKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0NNRF9XUklURSwgKDEgPDwgMTYpIHwgKDAgPDwgMCkpOworCWZvciAoaSA9IDA7IGkgPCBQQVJTRVJfQ01EX05VTUJFUjsgaSsrKQorCQlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0NNRF9XUklURSwgcGFyc2VyX2NtZFtpXSk7CisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9DTURfU0tJUF8wLCBQQVJTRVJfQ01EX1NLSVBfQ0ZHXzApOworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfQ01EX1NLSVBfMSwgUEFSU0VSX0NNRF9TS0lQX0NGR18xKTsKKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0NNRF9TS0lQXzIsIFBBUlNFUl9DTURfU0tJUF9DRkdfMik7CisKKworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfSUZfQ09OVFJPTCwKKwkJKDEgPDwgOSkgfCAvKiBwYXJzZXJfYWxmX2lmX2VuKi8KKwkJLyogICgxIDw8IDgpIHwqLyAvKnNhb19zd19wcmVkX2VuYWJsZSovCisJCSgxIDw8IDUpIHwgLypwYXJzZXJfc2FvX2lmX2VuKi8KKwkJKDEgPDwgMikgfCAvKnBhcnNlcl9tcHJlZF9pZl9lbiovCisJCSgxIDw8IDApIC8qcGFyc2VyX3NjYWxlcl9pZl9lbiovCisJKTsKKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfSU5UX1NUQVRVUywgKDE8PDMxKSk7CisKKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX1JFU1VMVF8zLCAweGZmZmZmZmZmKTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX01QUkVEX0FCVl9TVEFSVF9BRERSKTsKKworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMywgKDE8PDE4KSk7IC8qIHJlc2V0IG1wcmVkICovCisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQzLCAwKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfQUJWX1NUQVJUX0FERFIsIGRhdGEzMik7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0FCVl9TVEFSVF9BRERSLCBkYXRhMzIpOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9BQlZfU1RBUlRfQUREUiwgZGF0YTMyKTsKKyNlbmRpZgorCS8qRW5kIG9mIE11bHRpLWluc3RhbmNlKi8KKwkvKkNoYW5nZWQgdG8gU3RhcnQgTVBSRUQgaW4gbWljcm9jb2RlKi8KKwkvKgorCXByX2luZm8oIlt0ZXN0LmNdIFN0YXJ0IE1QUkVEXG4iKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfSU5UX1NUQVRVUywKKwkoMTw8MzEpCisJKTsKKwkqLworCisJLypBVlMyIGRlZmF1bHQgc2VxX3dxX21hdHJpeCBjb25maWcqLworCisJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUl9NT1JFLAorCQkiQ29uZmlnIEFWUzIgZGVmYXVsdCBzZXFfd3FfbWF0cml4IC4uLlxuIik7CisJLyo0eDQqLworCSAvKiBkZWZhdWx0IHNlcV93cV9tYXRyaXhfNHg0IGJlZ2luIGFkZHJlc3MqLworCVdSSVRFX1ZSRUcoSEVWQ19JUUlUX1NDQUxFTFVUX1dSX0FERFIsIDY0KTsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJV1JJVEVfVlJFRyhIRVZDX0lRSVRfU0NBTEVMVVRfREFUQSwgZ19XcU1EZWZhdWx0NHg0W2ldKTsKKworCS8qOHg4Ki8KKwkvKmRlZmF1bHQgc2VxX3dxX21hdHJpeF84eDggYmVnaW4gYWRkcmVzcyovCisJV1JJVEVfVlJFRyhIRVZDX0lRSVRfU0NBTEVMVVRfV1JfQUREUiwgMCk7CisJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisJCVdSSVRFX1ZSRUcoSEVWQ19JUUlUX1NDQUxFTFVUX0RBVEEsIGdfV3FNRGVmYXVsdDh4OFtpXSk7CisKKworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX1RPUF9DTlRMLAorCQkoMCA8PCAxKSB8IC8qZW5hYmxlIGlwcCovCisJCSgxIDw8IDApICAgLypzb2Z0d2FyZSByZXNldCBpcHAgYW5kIG1wcCovCisJKTsKKwlXUklURV9WUkVHKEhFVkNEX0lQUF9UT1BfQ05UTCwKKwkJKDEgPDwgMSkgfCAvKmVuYWJsZSBpcHAqLworCQkoMCA8PCAwKSAgIC8qc29mdHdhcmUgcmVzZXQgaXBwIGFuZCBtcHAqLworCSk7CisjaWYgMAorLypBVlMyXzEwQl9OVjIxKi8KKwkvKkVuYWJsZSBOVjIxIHJlZmVyZW5jZSByZWFkIG1vZGUgZm9yIE1DKi8KKwlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMSwgMHgxIDw8IDMxKTsKKyNlbmRpZgorCS8qIEluaXQgZGJsayovCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfREJMS19DRkdCKTsKKwlkYXRhMzIgfD0gKDIgPDwgMCk7CisJLyogWzM6MF0gY2ZnX3ZpZGVvX3R5cGUgLT4gQVZTMiovCisKKwlkYXRhMzIgJj0gKH4weDMwMCk7IC8qWzhdOmZpcnN0IHdyaXRlIGVuYWJsZSAoY29tcHJlc3MpCisJCQkJCVs5XTpkb3VibGUgd3JpdGUgZW5hYmxlICh1bmNvbXByZXNzKSovCisJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShkZWMpID09IDApCisJCWRhdGEzMiB8PSAoMHgxIDw8IDgpOyAvKmVuYWJsZSBmaXJzdCB3cml0ZSovCisJZWxzZSBpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGRlYykgPT0gMHgxMCkKKwkJZGF0YTMyIHw9ICgweDEgPDwgOSk7IC8qZG91YmxlIHdyaXRlIG9ubHkqLworCWVsc2UKKwkJZGF0YTMyIHw9ICgoMHgxIDw8IDgpIHwgKDB4MSA8PCA5KSk7CisJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHQiwgZGF0YTMyKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGRzAsICgxIDw8IDApKTsgLyogWzBdIHJzdF9zeW5jKi8KKwlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX01PUkUsCisJCSJCaXRzdHJlYW0gbGV2ZWwgSW5pdCBmb3IgREJMSyAuRG9uZS5cbiIpOworCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKSB7CisJICAgIG1jcmNjX3BlcmZjb3VudF9yZXNldCgpOworCSAgICBkZWNvbXBfcGVyZmNvdW50X3Jlc2V0KCk7CisJfQorCisJcmV0dXJuOworfQorCisKKyNpZmRlZiBDT05GSUdfSEVWQ19DTEtfRk9SQ0VEX09OCitzdGF0aWMgdm9pZCBjb25maWdfYXZzMl9jbGtfZm9yY2VkX29uKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHJkYXRhMzI7CisJLypJUUlUKi8KKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfSVFJVF9DTEtfUlNUX0NUUkwpOworCVdSSVRFX1ZSRUcoSEVWQ19JUUlUX0NMS19SU1RfQ1RSTCwgcmRhdGEzMiB8ICgweDEgPDwgMikpOworCisJLyogREJMSyovCisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX0RCTEtfQ0ZHMCk7CisJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHMCwgcmRhdGEzMiB8ICgweDEgPDwgMikpOworCisJLyogU0FPKi8KKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkwxKTsKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkwxLCByZGF0YTMyIHwgKDB4MSA8PCAyKSk7CisKKwkvKk1QUkVEKi8KKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfTVBSRURfQ1RSTDEpOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9DVFJMMSwgcmRhdGEzMiB8ICgweDEgPDwgMjQpKTsKKworCS8qIFBBUlNFUiovCisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NUUkVBTV9DT05UUk9MKTsKKwlXUklURV9WUkVHKEhFVkNfU1RSRUFNX0NPTlRST0wsIHJkYXRhMzIgfCAoMHgxIDw8IDE1KSk7CisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NISUZUX0NPTlRST0wpOworCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9DT05UUk9MLCByZGF0YTMyIHwgKDB4MSA8PCAxNSkpOworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19DQUJBQ19DT05UUk9MKTsKKwlXUklURV9WUkVHKEhFVkNfQ0FCQUNfQ09OVFJPTCwgcmRhdGEzMiB8ICgweDEgPDwgMTMpKTsKKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0NPUkVfQ09OVFJPTCk7CisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9DT1JFX0NPTlRST0wsIHJkYXRhMzIgfCAoMHgxIDw8IDE1KSk7CisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BBUlNFUl9JTlRfQ09OVFJPTCk7CisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9JTlRfQ09OVFJPTCwgcmRhdGEzMiB8ICgweDEgPDwgMTUpKTsKKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0lGX0NPTlRST0wpOworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfSUZfQ09OVFJPTCwKKwkJCXJkYXRhMzIgfCAoMHgxIDw8IDYpIHwgKDB4MSA8PCAzKSB8ICgweDEgPDwgMSkpOworCisJLypJUFAqLworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ0RfSVBQX0RZTkNMS0dBVEVfQ09ORklHKTsKKwlXUklURV9WUkVHKEhFVkNEX0lQUF9EWU5DTEtHQVRFX0NPTkZJRywgcmRhdGEzMiB8IDB4ZmZmZmZmZmYpOworCisJLyogTUNSQ0MqLworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMSk7CisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwxLCByZGF0YTMyIHwgKDB4MSA8PCAzKSk7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBBVlMyRGVjb2Rlcl9zIGdBVlMyRGVjb2RlcjsKKworc3RhdGljIHZvaWQgYXZzMl9sb2NhbF91bmluaXQoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYykKK3sKKwlkZWMtPnJwbV9wdHIgPSBOVUxMOworCWRlYy0+bG1lbV9wdHIgPSBOVUxMOworCWlmIChkZWMtPnJwbV9hZGRyKSB7CisJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQkJCVJQTV9CVUZfU0laRSwgZGVjLT5ycG1fYWRkciwKKwkJCQkJCWRlYy0+cnBtX3BoeV9hZGRyKTsKKwkJZGVjLT5ycG1fYWRkciA9IE5VTEw7CisJfQorCisJaWYgKGRlYy0+Y3V2YV9hZGRyKSB7CisJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlkZWMtPmN1dmFfc2l6ZSwgZGVjLT5jdXZhX2FkZHIsCisJCQkJCWRlYy0+Y3V2YV9waHlfYWRkcik7CisJCWRlYy0+Y3V2YV9hZGRyID0gTlVMTDsKKwl9CisKKwlpZiAoZGVjLT5sbWVtX2FkZHIpIHsKKwkJCWlmIChkZWMtPmxtZW1fcGh5X2FkZHIpCisJCQkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCQkJTE1FTV9CVUZfU0laRSwgZGVjLT5sbWVtX2FkZHIsCisJCQkJCQlkZWMtPmxtZW1fcGh5X2FkZHIpOworCQlkZWMtPmxtZW1fYWRkciA9IE5VTEw7CisJfQorCisjaWZkZWYgQVZTMl8xMEJfTU1VCisJaWYgKGRlYy0+ZnJhbWVfbW11X21hcF9hZGRyKSB7CisJCWlmIChkZWMtPmZyYW1lX21tdV9tYXBfcGh5X2FkZHIpCisJCQlkbWFfZnJlZV9jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJZ2V0X2ZyYW1lX21tdV9tYXBfc2l6ZShkZWMpLCBkZWMtPmZyYW1lX21tdV9tYXBfYWRkciwKKwkJCQkJZGVjLT5mcmFtZV9tbXVfbWFwX3BoeV9hZGRyKTsKKwkJZGVjLT5mcmFtZV9tbXVfbWFwX2FkZHIgPSBOVUxMOworCX0KKyNlbmRpZgorCisjaWZkZWYgQVZTMl8xMEJfTU1VX0RXCisJaWYgKGRlYy0+ZHdfZnJhbWVfbW11X21hcF9hZGRyKSB7CisJCWlmIChkZWMtPmR3X2ZyYW1lX21tdV9tYXBfcGh5X2FkZHIpCisJCQlkbWFfZnJlZV9jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJZ2V0X2ZyYW1lX21tdV9tYXBfc2l6ZShkZWMpLCBkZWMtPmR3X2ZyYW1lX21tdV9tYXBfYWRkciwKKwkJCQkJZGVjLT5kd19mcmFtZV9tbXVfbWFwX3BoeV9hZGRyKTsKKwkJZGVjLT5kd19mcmFtZV9tbXVfbWFwX2FkZHIgPSBOVUxMOworCX0KKyNlbmRpZgorCisJaWYgKGRlYy0+Z3ZzKQorCQl2ZnJlZShkZWMtPmd2cyk7CisJZGVjLT5ndnMgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGF2czJfbG9jYWxfaW5pdChzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCWludCByZXQgPSAtMTsKKwkvKmludCBsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUsIGxvc2xlc3NfY29tcF9ib2R5X3NpemU7Ki8KKworCXN0cnVjdCBCdWZmSW5mb19zICpjdXJfYnVmX2luZm8gPSBOVUxMOworCisJY3VyX2J1Zl9pbmZvID0gJmRlYy0+d29ya19zcGFjZV9idWZfc3RvcmU7CisJaWYgKGZvcmNlX2J1ZnNwZWMpIHsKKwkJbWVtY3B5KGN1cl9idWZfaW5mbywgJmFtdmF2czJfd29ya2J1ZmZfc3BlY1tmb3JjZV9idWZzcGVjICYgMHhmXSwKKwkJc2l6ZW9mKHN0cnVjdCBCdWZmSW5mb19zKSk7CisJCXByX2luZm8oImZvcmNlIGJ1ZmZlciBzcGVjICVkXG4iLCBmb3JjZV9idWZzcGVjICYgMHhmKTsKKwl9IGVsc2UgeworCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDw9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UTTIgJiYgIWlzX2NwdV90bTJfcmV2YigpKSB7CisJCQlpZiAodmRlY19pc19zdXBwb3J0XzRrKCkpIHsKKwkJCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpCisJCQkJCW1lbWNweShjdXJfYnVmX2luZm8sICZhbXZhdnMyX3dvcmtidWZmX3NwZWNbMl0sCS8qIDhrICovCisJCQkJCXNpemVvZihzdHJ1Y3QgQnVmZkluZm9fcykpOworCQkJCWVsc2UKKwkJCQkJbWVtY3B5KGN1cl9idWZfaW5mbywgJmFtdmF2czJfd29ya2J1ZmZfc3BlY1sxXSwJLyogNGsgKi8KKwkJCQkJc2l6ZW9mKHN0cnVjdCBCdWZmSW5mb19zKSk7CisJCQl9IGVsc2UKKwkJCQltZW1jcHkoY3VyX2J1Zl9pbmZvLCAmYW12YXZzMl93b3JrYnVmZl9zcGVjWzBdLC8qIDEwODBwICovCisJCQkJc2l6ZW9mKHN0cnVjdCBCdWZmSW5mb19zKSk7CisJCX0gZWxzZSB7IC8vZ2V0X2NwdV9tYWpvcl9pZCgpID4gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RNMiB8fCBpc19jcHVfdG0yX3JldmIoKQorCQkJaWYgKHZkZWNfaXNfc3VwcG9ydF80aygpKSB7CisJCQkJbWVtY3B5KGN1cl9idWZfaW5mbywgJmFtdmF2czJfd29ya2J1ZmZfc3BlY1s1XSwJLyogOGsgKi8KKwkJCQlzaXplb2Yoc3RydWN0IEJ1ZmZJbmZvX3MpKTsKKwkJCX0gZWxzZQorCQkJCW1lbWNweShjdXJfYnVmX2luZm8sICZhbXZhdnMyX3dvcmtidWZmX3NwZWNbM10sLyogMTA4MHAgKi8KKwkJCQlzaXplb2Yoc3RydWN0IEJ1ZmZJbmZvX3MpKTsKKwkJfQorCX0KKworCWN1cl9idWZfaW5mby0+c3RhcnRfYWRyID0gZGVjLT5idWZfc3RhcnQ7CisjaWZuZGVmIEFWUzJfMTBCX01NVQorCWRlYy0+bWNfYnVmX3NwZWMuYnVmX2VuZCA9IGRlYy0+YnVmX3N0YXJ0ICsgZGVjLT5idWZfc2l6ZTsKKyNlbmRpZgorCisJaW5pdF9idWZmX3NwZWMoZGVjLCBjdXJfYnVmX2luZm8pOworCisJaW5pdF9hdnMyX2RlY29kZXIoJmRlYy0+YXZzMl9kZWMpOworCisjaWZkZWYgQVZTMl8xMEJfTU1VCisJYXZzMl9idWZtZ3JfaW5pdChkZWMsIGN1cl9idWZfaW5mbywgTlVMTCk7CisjZWxzZQorCWRlYy0+bWNfYnVmX3NwZWMuYnVmX3N0YXJ0ID0gKGN1cl9idWZfaW5mby0+ZW5kX2FkciArIDB4ZmZmZikKKwkgICAgJiAofjB4ZmZmZik7CisJZGVjLT5tY19idWZfc3BlYy5idWZfc2l6ZSA9IChkZWMtPm1jX2J1Zl9zcGVjLmJ1Zl9lbmQKKwkgICAgLSBkZWMtPm1jX2J1Zl9zcGVjLmJ1Zl9zdGFydCk7CisJaWYgKGRlYnVnKSB7CisJCXByX2VycigiZGVjLT5tY19idWZfc3BlYy5idWZfc3RhcnQgJXgtJXhcbiIsCisJCQlkZWMtPm1jX2J1Zl9zcGVjLmJ1Zl9zdGFydCwKKwkJCWRlYy0+bWNfYnVmX3NwZWMuYnVmX3N0YXJ0ICsKKwkJCWRlYy0+bWNfYnVmX3NwZWMuYnVmX3NpemUpOworCX0KKwlhdnMyX2J1Zm1ncl9pbml0KGRlYywgY3VyX2J1Zl9pbmZvLCAmZGVjLT5tY19idWZfc3BlYyk7CisjZW5kaWYKKwlpZiAoKGJ1Zl9hbGxvY193aWR0aCAmIGJ1Zl9hbGxvY19oZWlnaHQpID09IDApIHsKKwkJaWYgKCF2ZGVjX2lzX3N1cHBvcnRfNGsoKQorCQkJJiYgKGJ1Zl9hbGxvY193aWR0aCA+IDE5MjAgJiYgIGJ1Zl9hbGxvY19oZWlnaHQgPiAxMDg4KSkgeworCQkJYnVmX2FsbG9jX3dpZHRoID0gMTkyMDsKKwkJCWJ1Zl9hbGxvY19oZWlnaHQgPSAxMDg4OworCQl9IGVsc2UgaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKSB7CisJCQlidWZfYWxsb2Nfd2lkdGggPSAzODQwOworCQkJYnVmX2FsbG9jX2hlaWdodCA9IDIxNjA7CisJCX0KKwl9CisJZGVjLT5pbml0X3BpY193ID0gYnVmX2FsbG9jX3dpZHRoID8gYnVmX2FsbG9jX3dpZHRoIDoKKwkJKGRlYy0+dmF2czJfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGggPworCQlkZWMtPnZhdnMyX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoIDoKKwkJZGVjLT53b3JrX3NwYWNlX2J1Zi0+bWF4X3dpZHRoKTsKKwlkZWMtPmluaXRfcGljX2ggPSBidWZfYWxsb2NfaGVpZ2h0ID8gYnVmX2FsbG9jX2hlaWdodCA6CisJCShkZWMtPnZhdnMyX2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodCA/CisJCWRlYy0+dmF2czJfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0IDoKKwkJZGVjLT53b3JrX3NwYWNlX2J1Zi0+bWF4X2hlaWdodCk7CisKKyNpZm5kZWYgQVZTMl8xMEJfTU1VCisJaW5pdF9idWZfbGlzdChkZWMpOworI2Vsc2UKKwlkZWMtPnVzZWRfYnVmX251bSA9IG1heF9idWZfbnVtICsgZGVjLT5keW5hbWljX2J1Zl9tYXJnaW47CisJaWYgKGRlYy0+dXNlZF9idWZfbnVtID4gTUFYX0JVRl9OVU0pCisJCWRlYy0+dXNlZF9idWZfbnVtID0gTUFYX0JVRl9OVU07CisJaWYgKGRlYy0+dXNlZF9idWZfbnVtID4gRlJBTUVfQlVGRkVSUykKKwkJZGVjLT51c2VkX2J1Zl9udW0gPSBGUkFNRV9CVUZGRVJTOworI2VuZGlmCisJZGVjLT5hdnMyX2RlYy5yZWZfbWF4YnVmZmVyID0gZGVjLT51c2VkX2J1Zl9udW0gLSAxOworCS8qaW5pdF9waWNfbGlzdChkZWMpOyovCisKKwlwdHNfdW5zdGFibGUgPSAoKHVuc2lnbmVkIGxvbmcpKGRlYy0+dmF2czJfYW1zdHJlYW1fZGVjX2luZm8ucGFyYW0pCisJCQkmIDB4NDApID4+IDY7CisKKwlpZiAoKGRlYnVnICYgQVZTMl9EQkdfU0VORF9QQVJBTV9XSVRIX1JFRykgPT0gMCkgeworCQlkZWMtPnJwbV9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCVJQTV9CVUZfU0laRSwKKwkJCSZkZWMtPnJwbV9waHlfYWRkciwgR0ZQX0tFUk5FTCk7CisJCWlmIChkZWMtPnJwbV9hZGRyID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvYyBycG0gYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUiwKKwkJCSJycG1fcGh5X2FkZHIgJXhcbiIsICh1MzIpIGRlYy0+cnBtX3BoeV9hZGRyKTsKKwkJZGVjLT5ycG1fcHRyID0gZGVjLT5ycG1fYWRkcjsKKwl9CisKKwlpZiAoY3V2YV9idWZfc2l6ZSA+IDApIHsKKwkJZGVjLT5jdXZhX3NpemUgPSBBVVhfQlVGX0FMSUdOKGN1dmFfYnVmX3NpemUpOworCisJCWRlYy0+Y3V2YV9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlkZWMtPmN1dmFfc2l6ZSwgJmRlYy0+Y3V2YV9waHlfYWRkciwgR0ZQX0tFUk5FTCk7CisJICAgICAgICBhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSLAorCQkJIiVzLCBjdXZhX3NpemUgPSAlZCBjdXZhX3BoeV9hZGRyICV4IGRlYy0+Y3V2YV9hZGRyID0gJXB4XG4iLAorCQkJX19mdW5jX18sIGRlYy0+Y3V2YV9zaXplLCAodTMyKWRlYy0+Y3V2YV9waHlfYWRkciwgZGVjLT5jdXZhX2FkZHIpOworCQlpZiAoZGVjLT5jdXZhX2FkZHIgPT0gTlVMTCkgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFsbG9jIGN1dmEgYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlkZWMtPmxtZW1fYWRkciA9IGRtYV9hbGxvY19jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQlMTUVNX0JVRl9TSVpFLAorCQkJJmRlYy0+bG1lbV9waHlfYWRkciwgR0ZQX0tFUk5FTCk7CisJaWYgKGRlYy0+bG1lbV9hZGRyID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFsbG9jIGxtZW0gYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtMTsKKwl9IGVsc2UKKwkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUiwKKwkJCSIlcywgbG1lbV9waHlfYWRkciAleFxuIiwKKwkJCV9fZnVuY19fLCAodTMyKWRlYy0+bG1lbV9waHlfYWRkcik7CisJZGVjLT5sbWVtX3B0ciA9IGRlYy0+bG1lbV9hZGRyOworCisjaWZkZWYgQVZTMl8xMEJfTU1VCisJaWYgKGRlYy0+bW11X2VuYWJsZSkgeworCQlkZWMtPmZyYW1lX21tdV9tYXBfYWRkciA9IGRtYV9hbGxvY19jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJCWdldF9mcmFtZV9tbXVfbWFwX3NpemUoZGVjKSwKKwkJCQkJJmRlYy0+ZnJhbWVfbW11X21hcF9waHlfYWRkciwgR0ZQX0tFUk5FTCk7CisJCWlmIChkZWMtPmZyYW1lX21tdV9tYXBfYWRkciA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgY291bnRfYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbWVtc2V0KGRlYy0+ZnJhbWVfbW11X21hcF9hZGRyLCAwLCBnZXRfZnJhbWVfbW11X21hcF9zaXplKGRlYykpOworCX0KKyNlbmRpZgorCisjaWZkZWYgQVZTMl8xMEJfTU1VX0RXCisJaWYgKGRlYy0+ZHdfbW11X2VuYWJsZSkgeworCQlkZWMtPmR3X2ZyYW1lX21tdV9tYXBfYWRkciA9IGRtYV9hbGxvY19jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJCWdldF9mcmFtZV9tbXVfbWFwX3NpemUoZGVjKSwKKwkJCQkJJmRlYy0+ZHdfZnJhbWVfbW11X21hcF9waHlfYWRkciwgR0ZQX0tFUk5FTCk7CisJCWlmIChkZWMtPmR3X2ZyYW1lX21tdV9tYXBfYWRkciA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgY291bnRfYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbWVtc2V0KGRlYy0+ZHdfZnJhbWVfbW11X21hcF9hZGRyLCAwLCBnZXRfZnJhbWVfbW11X21hcF9zaXplKGRlYykpOworCX0KKyNlbmRpZgorCXJldCA9IDA7CisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgTWFpbGJveCBjb21tYW5kCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENNRF9GSU5JU0hFRCAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ01EX0FMTE9DX1ZJRVcgICAgICAgICAgICAgMQorI2RlZmluZSBDTURfRlJBTUVfRElTUExBWSAgICAgICAgICAzCisjZGVmaW5lIENNRF9ERUJVRyAgICAgICAgICAgICAgICAgIDEwCisKKworI2RlZmluZSBERUNPREVfQlVGRkVSX05VTV9NQVggICAgMzIKKyNkZWZpbmUgRElTUExBWV9CVUZGRVJfTlVNICAgICAgIDYKKworI2RlZmluZSB2aWRlb19kb21haW5fYWRkcihhZHIpIChhZHImMHg3ZmZmZmZmZikKKyNkZWZpbmUgREVDT0RFUl9XT1JLX1NQQUNFX1NJWkUgMHg4MDAwMDAKKworI2RlZmluZSBzcGVjMmNhbnZhcyh4KSAgXAorCSgoKHgpLT51dl9jYW52YXNfaW5kZXggPDwgMTYpIHwgXAorCSAoKHgpLT51dl9jYW52YXNfaW5kZXggPDwgOCkgIHwgXAorCSAoKHgpLT55X2NhbnZhc19pbmRleCA8PCAwKSkKKworCitzdGF0aWMgdm9pZCBzZXRfY2FudmFzKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMsCisJc3RydWN0IGF2czJfZnJhbWVfcyAqcGljKQoreworCWludCBjYW52YXNfdyA9IEFMSUdOKHBpYy0+cGljX3csIDY0KS80OworCWludCBjYW52YXNfaCA9IEFMSUdOKHBpYy0+cGljX2gsIDMyKS80OworCWludCBibGttb2RlID0gbWVtX21hcF9tb2RlOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGRlYyk7CisJLypDQU5WQVNfQkxLTU9ERV82NFgzMiovCisJaWYJKHBpYy0+ZG91YmxlX3dyaXRlX21vZGUpIHsKKwkJY2FudmFzX3cgPSBwaWMtPnBpY193CS8KKwkJCWdldF9kb3VibGVfd3JpdGVfcmF0aW8ocGljLT5kb3VibGVfd3JpdGVfbW9kZSk7CisJCWNhbnZhc19oID0gcGljLT5waWNfaCAvCisJCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKHBpYy0+ZG91YmxlX3dyaXRlX21vZGUpOworCQkvKnNhb19jcnRsMSBhbGlnbmVkIHdpdGggNjQqLworCQljYW52YXNfdyA9IEFMSUdOKGNhbnZhc193LCA2NCk7CisJCWNhbnZhc19oID0gQUxJR04oY2FudmFzX2gsIDMyKTsKKworCQlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJCWlmIChwaWMtPnlfY2FudmFzX2luZGV4ID09IC0xKQorCQkJCXBpYy0+eV9jYW52YXNfaW5kZXggPSB2ZGVjLT5nZXRfY2FudmFzX2V4KENPUkVfTUFTS19IRVZDLCB2ZGVjLT5pZCk7CisJCQlpZiAocGljLT51dl9jYW52YXNfaW5kZXggPT0gLTEpCisJCQkJcGljLT51dl9jYW52YXNfaW5kZXggPSB2ZGVjLT5nZXRfY2FudmFzX2V4KENPUkVfTUFTS19IRVZDLCB2ZGVjLT5pZCk7CisJCX0gZWxzZSB7CisJCQlwaWMtPnlfY2FudmFzX2luZGV4ID0gMTI4ICsgcGljLT5pbmRleCAqIDI7CisJCQlwaWMtPnV2X2NhbnZhc19pbmRleCA9IDEyOCArIHBpYy0+aW5kZXggKiAyICsgMTsKKwkJfQorCisJCWNvbmZpZ19jYXZfbHV0X2V4KHBpYy0+eV9jYW52YXNfaW5kZXgsCisJCQlwaWMtPmR3X3lfYWRyLCBjYW52YXNfdywgY2FudmFzX2gsCisJCQlDQU5WQVNfQUREUl9OT1dSQVAsIGJsa21vZGUsIDB4NywgVkRFQ19IRVZDKTsKKwkJY29uZmlnX2Nhdl9sdXRfZXgocGljLT51dl9jYW52YXNfaW5kZXgsCisJCQlwaWMtPmR3X3Vfdl9hZHIsCWNhbnZhc193LCBjYW52YXNfaCwKKwkJCUNBTlZBU19BRERSX05PV1JBUCwgYmxrbW9kZSwgMHg3LCBWREVDX0hFVkMpOworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwkJcGljLT5jYW52YXNfY29uZmlnWzBdLnBoeV9hZGRyID0gcGljLT5kd195X2FkcjsKKwkJcGljLT5jYW52YXNfY29uZmlnWzBdLndpZHRoID0gY2FudmFzX3c7CisJCXBpYy0+Y2FudmFzX2NvbmZpZ1swXS5oZWlnaHQgPSBjYW52YXNfaDsKKwkJcGljLT5jYW52YXNfY29uZmlnWzBdLmJsb2NrX21vZGUgPSBibGttb2RlOworCQlwaWMtPmNhbnZhc19jb25maWdbMF0uZW5kaWFuID0gNzsKKworCQlwaWMtPmNhbnZhc19jb25maWdbMV0ucGh5X2FkZHIgPSBwaWMtPmR3X3Vfdl9hZHI7CisJCXBpYy0+Y2FudmFzX2NvbmZpZ1sxXS53aWR0aCA9IGNhbnZhc193OworCQlwaWMtPmNhbnZhc19jb25maWdbMV0uaGVpZ2h0ID0gY2FudmFzX2g7CisJCXBpYy0+Y2FudmFzX2NvbmZpZ1sxXS5ibG9ja19tb2RlID0gYmxrbW9kZTsKKwkJcGljLT5jYW52YXNfY29uZmlnWzFdLmVuZGlhbiA9IDc7CisjZW5kaWYKKwl9IGVsc2UgeworCSNpZm5kZWYgQVZTMl8xMEJfTU1VCisJCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQkJaWYgKHBpYy0+eV9jYW52YXNfaW5kZXggPT0gLTEpCisJCQkJcGljLT55X2NhbnZhc19pbmRleCA9IHZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX0hFVkMsIHZkZWMtPmlkKTsKKwkJCWlmIChwaWMtPnV2X2NhbnZhc19pbmRleCA9PSAtMSkKKwkJCQlwaWMtPnV2X2NhbnZhc19pbmRleCA9IHZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX0hFVkMsIHZkZWMtPmlkKTsKKwkJfSBlbHNlIHsKKwkJCXBpYy0+eV9jYW52YXNfaW5kZXggPSAxMjggKyBwaWMtPmluZGV4OworCQkJcGljLT51dl9jYW52YXNfaW5kZXggPSAxMjggKyBwaWMtPmluZGV4OworCQl9CisKKwkJY29uZmlnX2Nhdl9sdXRfZXgocGljLT55X2NhbnZhc19pbmRleCwKKwkJCXBpYy0+bWNfeV9hZHIsIGNhbnZhc193LCBjYW52YXNfaCwKKwkJCUNBTlZBU19BRERSX05PV1JBUCwgYmxrbW9kZSwgMHg3LCBWREVDX0hFVkMpOworCQljb25maWdfY2F2X2x1dF9leChwaWMtPnV2X2NhbnZhc19pbmRleCwKKwkJCXBpYy0+bWNfdV92X2FkcixjYW52YXNfdywgY2FudmFzX2gsCisJCQlDQU5WQVNfQUREUl9OT1dSQVAsIGJsa21vZGUsIDB4NywgVkRFQ19IRVZDKTsKKwkjZW5kaWYKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNldF9mcmFtZV9pbmZvKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMsIHN0cnVjdCB2ZnJhbWVfcyAqdmYpCit7CisJdW5zaWduZWQgaW50IGFyID0gMDsKKwl1bnNpZ25lZCBpbnQgcGl4ZWxfcmF0aW8gPSAwOzsKKworCXZmLT5kdXJhdGlvbiA9IGRlYy0+ZnJhbWVfZHVyOworCXZmLT5kdXJhdGlvbl9wdWxsZG93biA9IDA7CisJdmYtPmZsYWcgPSAwOworCXZmLT5wcm9wLm1hc3Rlcl9kaXNwbGF5X2NvbG91ciA9IGRlYy0+dmZfZHA7CisJaWYgKGRlYy0+aGRyX2ZsYWcgJiBIRFJfQ1VWQV9NQVNLKQorCQlkZWMtPnZpZGVvX3NpZ25hbF90eXBlIHw9IDEgPDwgMzE7CisJdmYtPnNpZ25hbF90eXBlID0gZGVjLT52aWRlb19zaWduYWxfdHlwZTsKKworCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19IRFJfSU5GTywKKwkJCSJzaWduYWxfdHlwZXNpZ25hbF90eXBlIDB4JXggXG4iLAorCQkJdmYtPnNpZ25hbF90eXBlKTsKKworCXBpeGVsX3JhdGlvID0gZGVjLT52YXZzMl9hbXN0cmVhbV9kZWNfaW5mby5yYXRpbzsKKworCWlmIChkZWMtPnZhdnMyX3JhdGlvID09IDApIHsKKwkJCS8qIGFsd2F5cyBzdHJldGNoIHRvIDE2OjkgKi8KKwkJCXZmLT5yYXRpb19jb250cm9sIHw9ICgweDkwIDw8CisJCQkJCURJU1BfUkFUSU9fQVNQRUNUX1JBVElPX0JJVCk7CisJCQl2Zi0+c2FyX3dpZHRoID0gMTsKKwkJCXZmLT5zYXJfaGVpZ2h0ID0gMTsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAocGl4ZWxfcmF0aW8pIHsKKwkJCWNhc2UgMToKKwkJCQl2Zi0+c2FyX3dpZHRoID0gMTsKKwkJCQl2Zi0+c2FyX2hlaWdodCA9IDE7CisJCQkJYXIgPSAodmYtPmhlaWdodCAqIGRlYy0+dmF2czJfcmF0aW8pIC8gdmYtPndpZHRoOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCXZmLT5zYXJfd2lkdGggPSA0OworCQkJCXZmLT5zYXJfaGVpZ2h0ID0gMzsKKwkJCQlhciA9ICh2Zi0+aGVpZ2h0ICogMyAqIGRlYy0+dmF2czJfcmF0aW8pIC8gKHZmLT53aWR0aCAqIDQpOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCXZmLT5zYXJfd2lkdGggPSAxNjsKKwkJCQl2Zi0+c2FyX2hlaWdodCA9IDk7CisJCQkJYXIgPSAodmYtPmhlaWdodCAqIDkgKiBkZWMtPnZhdnMyX3JhdGlvKSAvICh2Zi0+d2lkdGggKiAxNik7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJdmYtPnNhcl93aWR0aCA9IDIyMTsKKwkJCQl2Zi0+c2FyX2hlaWdodCA9IDEwMDsKKwkJCQlhciA9ICh2Zi0+aGVpZ2h0ICogMTAwICogZGVjLT52YXZzMl9yYXRpbykgLyAodmYtPndpZHRoICoKKwkJCQkJCTIyMSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXZmLT5zYXJfd2lkdGggPSAxOworCQkJCXZmLT5zYXJfaGVpZ2h0ID0gMTsKKwkJCQlhciA9ICh2Zi0+aGVpZ2h0ICogZGVjLT52YXZzMl9yYXRpbykgLyB2Zi0+d2lkdGg7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCWFyID0gbWluX3QodTMyLCBhciwgRElTUF9SQVRJT19BU1BFQ1RfUkFUSU9fTUFYKTsKKwl2Zi0+cmF0aW9fY29udHJvbCA9IChhciA8PCBESVNQX1JBVElPX0FTUEVDVF9SQVRJT19CSVQpOworCisJdmYtPnNpZGViaW5kX3R5cGUgPSBkZWMtPnNpZGViaW5kX3R5cGU7CisJdmYtPnNpZGViaW5kX2NoYW5uZWxfaWQgPSBkZWMtPnNpZGViaW5kX2NoYW5uZWxfaWQ7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgdmF2czJfdmZfc3RhdGVzKHN0cnVjdCB2ZnJhbWVfc3RhdGVzICpzdGF0ZXMsIHZvaWQgKm9wX2FyZykKK3sKKwlzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjID0gKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICopb3BfYXJnOworCisJc3RhdGVzLT52Zl9wb29sX3NpemUgPSBWRl9QT09MX1NJWkU7CisJc3RhdGVzLT5idWZfZnJlZV9udW0gPSBrZmlmb19sZW4oJmRlYy0+bmV3ZnJhbWVfcSk7CisJc3RhdGVzLT5idWZfYXZhaWxfbnVtID0ga2ZpZm9fbGVuKCZkZWMtPmRpc3BsYXlfcSk7CisKKwlpZiAoc3RlcCA9PSAyKQorCQlzdGF0ZXMtPmJ1Zl9hdmFpbF9udW0gPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2YXZzMl92Zl9wZWVrKHZvaWQgKm9wX2FyZykKK3sKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmOworCXN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMgPSAoc3RydWN0IEFWUzJEZWNvZGVyX3MgKilvcF9hcmc7CisJaWYgKHN0ZXAgPT0gMikKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoZm9yY2VfZGlzcF9waWNfaW5kZXggJiAweDEwMCkgeworCQlpZiAoZm9yY2VfZGlzcF9waWNfaW5kZXggJiAweDIwMCkKKwkJCXJldHVybiBOVUxMOworCQlyZXR1cm4gJmRlYy0+dmZyYW1lX2R1bW15OworCX0KKworCWlmIChrZmlmb19sZW4oJmRlYy0+ZGlzcGxheV9xKSA+IFZGX1BPT0xfU0laRSkgeworCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSLAorCQkJImtmaWZvIGxlbjolZCBpbnZhaWxkLCBwZWVrIGVycm9yXG4iLAorCQkJa2ZpZm9fbGVuKCZkZWMtPmRpc3BsYXlfcSkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoa2ZpZm9fcGVlaygmZGVjLT5kaXNwbGF5X3EsICZ2ZikpCisJCXJldHVybiB2ZjsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGF2czJfZnJhbWVfcyAqZ2V0X3BpY19ieV9pbmRleCgKKwlzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjLCBpbnQgaW5kZXgpCit7CisJaW50IGk7CisJc3RydWN0IGF2czJfZnJhbWVfcyAqcGljID0gTlVMTDsKKwlpZiAoaW5kZXggPT0gKGRlYy0+dXNlZF9idWZfbnVtIC0gMSkpCisJCXBpYyA9IGRlYy0+YXZzMl9kZWMubV9iZzsKKwllbHNlIGlmIChpbmRleCA+PSAwCSYmIGluZGV4IDwgZGVjLT51c2VkX2J1Zl9udW0pIHsKKwkJZm9yIChpID0gMDsgaSA8IGRlYy0+dXNlZF9idWZfbnVtOyBpKyspIHsKKwkJCWlmIChkZWMtPmF2czJfZGVjLmZyZWZbaV0tPmluZGV4ID09IGluZGV4KQorCQkJCXBpYyA9IGRlYy0+YXZzMl9kZWMuZnJlZltpXTsKKwkJfQorCX0KKwlyZXR1cm4gcGljOworfQorCitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2YXZzMl92Zl9nZXQodm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCB2ZnJhbWVfcyAqdmY7CisJc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYyA9IChzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqKW9wX2FyZzsKKwlpZiAoc3RlcCA9PSAyKQorCQlyZXR1cm4gTlVMTDsKKwllbHNlIGlmIChzdGVwID09IDEpCisJCQlzdGVwID0gMjsKKworCWlmIChmb3JjZV9kaXNwX3BpY19pbmRleCAmIDB4MTAwKSB7CisJCWludCBpZHggPSBmb3JjZV9kaXNwX3BpY19pbmRleCAmIDB4ZmY7CisJCXN0cnVjdCBhdnMyX2ZyYW1lX3MgKnBpYyA9IE5VTEw7CisJCWlmIChpZHggPj0gMAorCQkJJiYgaWR4IDwgZGVjLT5hdnMyX2RlYy5yZWZfbWF4YnVmZmVyKQorCQkJcGljID0gZ2V0X3BpY19ieV9pbmRleChkZWMsIGlkeCk7CisJCWlmIChwaWMgPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCQlpZiAoZm9yY2VfZGlzcF9waWNfaW5kZXggJiAweDIwMCkKKwkJCXJldHVybiBOVUxMOworCisJCXZmID0gJmRlYy0+dmZyYW1lX2R1bW15OworCisJCXNldF92ZnJhbWUoZGVjLCB2ZiwgcGljLCAxKTsKKworCQlmb3JjZV9kaXNwX3BpY19pbmRleCB8PSAweDIwMDsKKwkJcmV0dXJuIHZmOworCX0KKworCWlmIChrZmlmb19nZXQoJmRlYy0+ZGlzcGxheV9xLCAmdmYpKSB7CisJCXVpbnQ4X3QgaW5kZXggPSB2Zi0+aW5kZXggJiAweGZmOworCQlBVFJBQ0VfQ09VTlRFUihkZWMtPmRpc3BfcV9uYW1lLCBrZmlmb19sZW4oJmRlYy0+ZGlzcGxheV9xKSk7CisJCWlmIChpbmRleCA8IGRlYy0+dXNlZF9idWZfbnVtKSB7CisJCQlzdHJ1Y3QgYXZzMl9mcmFtZV9zICpwaWMgPSBnZXRfcGljX2J5X2luZGV4KGRlYywgaW5kZXgpOworCQkJaWYgKHBpYyA9PSBOVUxMICYmCisJCQkJKGRlYnVnICYgQVZTMl9EQkdfUElDX0xFQUspKSB7CisJCQkJaW50IGk7CisJCQkJYXZzMl9wcmludChkZWMsIDAsCisJCQkJIiVzIGVycm9yIGluZGV4IDB4JXggcGljIG5vdCBleGlzdFxuIiwKKwkJCQlfX2Z1bmNfXywgaW5kZXgpOworCQkJCWR1bXBfcGljX2xpc3QoZGVjKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQkJCQlwaWMgPSBnZXRfcGljX2J5X2luZGV4KGRlYywgaW5kZXgpOworCQkJCQlwcl9pbmZvKCJwaWMgPSAlcFxuIiwgcGljKTsKKwkJCQl9CisKKwkJCWlmIChkZWJ1ZyAmIEFWUzJfREJHX1BJQ19MRUFLKQorCQkJCWRlYnVnIHw9IEFWUzJfREJHX1BJQ19MRUFLX1dBSVQ7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlkZWMtPnZmX2dldF9jb3VudCsrOworCQlpZiAocGljKQorCQkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUiwKKwkJCSIlcyBpbmRleCAweCV4IHBvcyAlZCBnZXRjb3VudCAlZCB0eXBlIDB4JXggdy9oICVkLyVkLCBwdHMgJWQsICVsbGRcbiIsCisJCQlfX2Z1bmNfXywgaW5kZXgsCisJCQlwaWMtPmltZ3RyX2Z3UmVmRGlzdGFuY2VfYmFrLAorCQkJZGVjLT52Zl9nZXRfY291bnQsCisJCQl2Zi0+dHlwZSwKKwkJCXZmLT53aWR0aCwgdmYtPmhlaWdodCwKKwkJCXZmLT5wdHMsCisJCQl2Zi0+cHRzX3VzNjQpOworCQlyZXR1cm4gdmY7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHZhdnMyX3ZmX3B1dChzdHJ1Y3QgdmZyYW1lX3MgKnZmLCB2b2lkICpvcF9hcmcpCit7CisJc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYyA9IChzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqKW9wX2FyZzsKKwl1aW50OF90IGluZGV4OworCisJaWYgKHZmID09ICgmZGVjLT52ZnJhbWVfZHVtbXkpKQorCQlyZXR1cm47CisKKwlpZiAoIXZmKQorCQlyZXR1cm47CisKKwlpbmRleCA9IHZmLT5pbmRleCAmIDB4ZmY7CisKKwlrZmlmb19wdXQoJmRlYy0+bmV3ZnJhbWVfcSwgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwlBVFJBQ0VfQ09VTlRFUihkZWMtPm5ld19xX25hbWUsIGtmaWZvX2xlbigmZGVjLT5uZXdmcmFtZV9xKSk7CisJZGVjLT52Zl9wdXRfY291bnQrKzsKKwlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSLAorCQkiJXMgaW5kZXggcHV0Y291bnQgMHgleCAlZFxuIiwKKwkJX19mdW5jX18sIHZmLT5pbmRleCwKKwkJZGVjLT52Zl9wdXRfY291bnQpOworCisJaWYgKGluZGV4IDwgZGVjLT51c2VkX2J1Zl9udW0pIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJc3RydWN0IGF2czJfZnJhbWVfcyAqcGljOworCisJCWxvY2tfYnVmZmVyKGRlYywgZmxhZ3MpOworCQlwaWMgPSBnZXRfcGljX2J5X2luZGV4KGRlYywgaW5kZXgpOworCQlpZiAocGljICYmIHBpYy0+dmZfcmVmID4gMCkKKwkJCXBpYy0+dmZfcmVmLS07CisJCWVsc2UgeworCQkJaWYgKHBpYykKKwkJCQlhdnMyX3ByaW50KGRlYywgMCwKKwkJCQkJIiVzLCBlcnJvciBwaWMgKGluZGV4ICVkKSB2Zl9yZWYgaXMgJWRcbiIsCisJCQkJCV9fZnVuY19fLCBpbmRleCwgcGljLT52Zl9yZWYpOworCQkJZWxzZQorCQkJCWF2czJfcHJpbnQoZGVjLCAwLAorCQkJCQkiJXMsIGVycm9yIHBpYyAoaW5kZXggJWQpIGlzIE5VTExcbiIsCisJCQkJCV9fZnVuY19fLCBpbmRleCk7CisJCX0KKwkJaWYgKGRlYy0+d2FpdF9idWYpCisJCQlXUklURV9WUkVHKEhFVkNfQVNTSVNUX01CT1gwX0lSUV9SRUcsCisJCQkJCQkweDEpOworCQlkZWMtPmxhc3RfcHV0X2lkeCA9IGluZGV4OworCQlkZWMtPm5ld19mcmFtZV9kaXNwbGF5ZWQrKzsKKwkJdW5sb2NrX2J1ZmZlcihkZWMsIGZsYWdzKTsKKwl9CisKK30KKworc3RhdGljIGludCB2YXZzMl9ldmVudF9jYihpbnQgdHlwZSwgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZV9kYXRhKQoreworCXN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMgPSAoc3RydWN0IEFWUzJEZWNvZGVyX3MgKilwcml2YXRlX2RhdGE7CisKKwlpZiAodHlwZSAmIFZGUkFNRV9FVkVOVF9SRUNFSVZFUl9SRVFfU1RBVEUpIHsKKwkJc3RydWN0IHByb3ZpZGVyX3N0YXRlX3JlcV9zICpyZXEgPQorCQkJKHN0cnVjdCBwcm92aWRlcl9zdGF0ZV9yZXFfcyAqKWRhdGE7CisJCWlmIChyZXEtPnJlcV90eXBlID09IFJFUV9TVEFURV9TRUNVUkUpCisJCQlyZXEtPnJlcV9yZXN1bHRbMF0gPSB2ZGVjX3NlY3VyZShod190b192ZGVjKGRlYykpOworCQllbHNlCisJCQlyZXEtPnJlcV9yZXN1bHRbMF0gPSAweGZmZmZmZmZmOworCX0gZWxzZSBpZiAodHlwZSAmIFZGUkFNRV9FVkVOVF9SRUNFSVZFUl9HRVRfQVVYX0RBVEEpIHsKKwkJc3RydWN0IHByb3ZpZGVyX2F1eF9yZXFfcyAqcmVxID0KKwkJCShzdHJ1Y3QgcHJvdmlkZXJfYXV4X3JlcV9zICopZGF0YTsKKwkJdW5zaWduZWQgY2hhciBpbmRleDsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJc3RydWN0IGF2czJfZnJhbWVfcyAqcGljOworCisJCWlmICghcmVxLT52ZikgeworCQkJcmVxLT5hdXhfc2l6ZSA9IGRlYy0+dmZfcHV0X2NvdW50OworCQkJcmV0dXJuIDA7CisJCX0KKwkJbG9ja19idWZmZXIoZGVjLCBmbGFncyk7CisJCWluZGV4ID0gcmVxLT52Zi0+aW5kZXggJiAweGZmOworCQlyZXEtPmF1eF9idWYgPSBOVUxMOworCQlyZXEtPmF1eF9zaXplID0gMDsKKwkJcmVxLT5mb3JtYXQgPSBWRk9STUFUX0FWUzI7CisJCWlmIChpbmRleCA8IGRlYy0+dXNlZF9idWZfbnVtKSB7CisJCQlwaWMgPSBnZXRfcGljX2J5X2luZGV4KGRlYywgaW5kZXgpOworCQkJcmVxLT5hdXhfYnVmID0gcGljLT5jdXZhX2RhdGFfYnVmOworCQkJcmVxLT5hdXhfc2l6ZSA9IHBpYy0+Y3V2YV9kYXRhX3NpemU7CisJCX0KKwkJdW5sb2NrX2J1ZmZlcihkZWMsIGZsYWdzKTsKKworCQlhdnMyX3ByaW50KGRlYywgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJIiVzIHBpYyAweCVwIGluZGV4ICVkID0+c2l6ZSAlZFxuIiwKKwkJX19mdW5jX18sIHBpYywgaW5kZXgsIHJlcS0+YXV4X3NpemUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGF2czJfZnJhbWVfcyAqZ2V0X2Rpc3BfcGljKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMpCit7CisJc3RydWN0IGF2czJfZGVjb2RlciAqYXZzMl9kZWMgPSAmZGVjLT5hdnMyX2RlYzsKKwlzdHJ1Y3QgYXZzMl9mcmFtZV9zICpwaWMgPSBOVUxMOworCWludDMyX3QgajsKKwlpbnQzMl90IHByZV9kaXNwX2NvdW50X21pbiA9IDB4N2ZmZmZmZmY7CisJZm9yIChqID0gMDsgaiA8IGF2czJfZGVjLT5yZWZfbWF4YnVmZmVyOyBqKyspIHsKKwkJaWYgKGF2czJfZGVjLT5mcmVmW2pdLT50b19wcmVwYXJlX2Rpc3AgJiYKKwkJCWF2czJfZGVjLT5mcmVmW2pdLT50b19wcmVwYXJlX2Rpc3AgPAorCQkJcHJlX2Rpc3BfY291bnRfbWluKSB7CisJCQlwcmVfZGlzcF9jb3VudF9taW4gPQorCQkJCWF2czJfZGVjLT5mcmVmW2pdLT50b19wcmVwYXJlX2Rpc3A7CisJCQlwaWMgPSBhdnMyX2RlYy0+ZnJlZltqXTsKKwkJfQorCX0KKwlpZiAocGljKQorCQlwaWMtPnRvX3ByZXBhcmVfZGlzcCA9IDA7CisKKwlyZXR1cm4gcGljOworCit9CisKKworCitzdGF0aWMgdm9pZCBmaWxsX2ZyYW1lX2luZm8oc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYywKKwlzdHJ1Y3QgYXZzMl9mcmFtZV9zICpwaWMsIHVuc2lnbmVkIGludCBmcmFtZXNpemUsIHVuc2lnbmVkIGludCBwdHMpCit7CisJc3RydWN0IHZmcmFtZV9xb3NfcyAqdmZyYW1lX3FvcyA9ICZkZWMtPnZmcmFtZV9xb3M7CisKKwlpZiAocGljLT5zbGljZV90eXBlID09IElfSU1HKQorCQl2ZnJhbWVfcW9zLT50eXBlID0gMTsKKwllbHNlIGlmIChwaWMtPnNsaWNlX3R5cGUgPT0gUF9JTUcpCisJCXZmcmFtZV9xb3MtPnR5cGUgPSAyOworCWVsc2UgaWYgKHBpYy0+c2xpY2VfdHlwZSA9PSBCX0lNRykKKwkJdmZyYW1lX3Fvcy0+dHlwZSA9IDM7CisvKgorI2RlZmluZSBTSE9XX1FPU19JTkZPCisqLworCWlmIChpbnB1dF9mcmFtZV9iYXNlZChod190b192ZGVjKGRlYykpKQorCQl2ZnJhbWVfcW9zLT5zaXplID0gcGljLT5mcmFtZV9zaXplOworCWVsc2UKKwkJdmZyYW1lX3Fvcy0+c2l6ZSA9IGZyYW1lc2l6ZTsKKwl2ZnJhbWVfcW9zLT5wdHMgPSBwdHM7CisjaWZkZWYgU0hPV19RT1NfSU5GTworCWF2czJfcHJpbnQoZGVjLCAwLCAic2xpY2U6JWRcbiIsIHBpYy0+c2xpY2VfdHlwZSk7CisjZW5kaWYKKworCisJdmZyYW1lX3Fvcy0+bWF4X212ID0gcGljLT5tYXhfbXY7CisJdmZyYW1lX3Fvcy0+YXZnX212ID0gcGljLT5hdmdfbXY7CisJdmZyYW1lX3Fvcy0+bWluX212ID0gcGljLT5taW5fbXY7CisjaWZkZWYgU0hPV19RT1NfSU5GTworCWF2czJfcHJpbnQoZGVjLCAwLCAibXY6IG1heDolZCwgIGF2ZzolZCwgbWluOiVkXG4iLAorCQkJdmZyYW1lX3Fvcy0+bWF4X212LAorCQkJdmZyYW1lX3Fvcy0+YXZnX212LAorCQkJdmZyYW1lX3Fvcy0+bWluX212KTsKKyNlbmRpZgorCisJdmZyYW1lX3Fvcy0+bWF4X3FwID0gcGljLT5tYXhfcXA7CisJdmZyYW1lX3Fvcy0+YXZnX3FwID0gcGljLT5hdmdfcXA7CisJdmZyYW1lX3Fvcy0+bWluX3FwID0gcGljLT5taW5fcXA7CisjaWZkZWYgU0hPV19RT1NfSU5GTworCWF2czJfcHJpbnQoZGVjLCAwLCAicXA6IG1heDolZCwgIGF2ZzolZCwgbWluOiVkXG4iLAorCQkJdmZyYW1lX3Fvcy0+bWF4X3FwLAorCQkJdmZyYW1lX3Fvcy0+YXZnX3FwLAorCQkJdmZyYW1lX3Fvcy0+bWluX3FwKTsKKyNlbmRpZgorCisJdmZyYW1lX3Fvcy0+bWF4X3NraXAgPSBwaWMtPm1heF9za2lwOworCXZmcmFtZV9xb3MtPmF2Z19za2lwID0gcGljLT5hdmdfc2tpcDsKKwl2ZnJhbWVfcW9zLT5taW5fc2tpcCA9IHBpYy0+bWluX3NraXA7CisjaWZkZWYgU0hPV19RT1NfSU5GTworCWF2czJfcHJpbnQoZGVjLCAwLCAic2tpcDogbWF4OiVkLAlhdmc6JWQsIG1pbjolZFxuIiwKKwkJCXZmcmFtZV9xb3MtPm1heF9za2lwLAorCQkJdmZyYW1lX3Fvcy0+YXZnX3NraXAsCisJCQl2ZnJhbWVfcW9zLT5taW5fc2tpcCk7CisjZW5kaWYKKworCXZmcmFtZV9xb3MtPm51bSsrOworCit9CisKK3N0YXRpYyB2b2lkIHNldF92ZnJhbWUoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYywKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmLCBzdHJ1Y3QgYXZzMl9mcmFtZV9zICpwaWMsIHU4IGR1bW15KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHN0cmVhbV9vZmZzZXQ7CisJdW5zaWduZWQgaW50IGZyYW1lX3NpemUgPSAwOworCWludCBwdHNfZGlzY29udGludWU7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoZGVjKTsKKwlzdHJlYW1fb2Zmc2V0ID0gcGljLT5zdHJlYW1fb2Zmc2V0OworCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1IsCisJCSIlcyBpbmRleCA9ICVkIHBvcyA9ICVkXHJcbiIsCisJCV9fZnVuY19fLCBwaWMtPmluZGV4LAorCQlwaWMtPmltZ3RyX2Z3UmVmRGlzdGFuY2UpOworCisJaWYgKHBpYy0+ZG91YmxlX3dyaXRlX21vZGUgJiYgKHBpYy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDIwKSA9PSAwKQorCQlzZXRfY2FudmFzKGRlYywgcGljKTsKKworCWRpc3BsYXlfZnJhbWVfY291bnRbZGVjLT5pbmRleF0rKzsKKworCWlmICghZHVtbXkpIHsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCWlmICh2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpKSB7CisJCQl2Zi0+cHRzID0gcGljLT5wdHM7CisJCQl2Zi0+cHRzX3VzNjQgPSBwaWMtPnB0czY0OworCQl9IGVsc2UgeworI2VuZGlmCisJCQlpZiAoKHZkZWMtPnZidWYubm9fcGFyc2VyID09IDApIHx8ICh2ZGVjLT52YnVmLnVzZV9wdHNzZXJ2KSkgeworCQkJLyogaWYgKHB0c19sb29rdXBfb2Zmc2V0KFBUU19UWVBFX1ZJREVPLAorCQkJICAgc3RyZWFtX29mZnNldCwgJnZmLT5wdHMsIDApICE9IDApIHsgKi8KKwkJCQlpZiAocHRzX2xvb2t1cF9vZmZzZXRfdXM2NAorCQkJCQkoUFRTX1RZUEVfVklERU8sIHN0cmVhbV9vZmZzZXQsCisJCQkJCSZ2Zi0+cHRzLCAmZnJhbWVfc2l6ZSwgMCwKKwkJCQkJICZ2Zi0+cHRzX3VzNjQpICE9IDApIHsKKyNpZmRlZiBERUJVR19QVFMKKwkJCQkJZGVjLT5wdHNfbWlzc2VkKys7CisjZW5kaWYKKwkJCQkJdmYtPnB0cyA9IDA7CisJCQkJCXZmLT5wdHNfdXM2NCA9IDA7CisJCQkJfQorCQkJfQorCQl9CisjaWZkZWYgREVCVUdfUFRTCisJCWVsc2UKKwkJCWRlYy0+cHRzX2hpdCsrOworI2VuZGlmCisJCWlmIChwdHNfdW5zdGFibGUpCisJCQlkZWMtPnB0c19tb2RlID0gUFRTX05PTkVfUkVGX1VTRV9EVVJBVElPTjsKKworCQlmaWxsX2ZyYW1lX2luZm8oZGVjLCBwaWMsIGZyYW1lX3NpemUsIHZmLT5wdHMpOworCisJCWlmICgoZGVjLT5wdHNfbW9kZSA9PSBQVFNfTk9STUFMKSAmJiAodmYtPnB0cyAhPSAwKQorCQkJJiYgZGVjLT5nZXRfZnJhbWVfZHVyKSB7CisJCQlpbnQgcHRzX2RpZmYgPSAoaW50KXZmLT5wdHMgLSBkZWMtPmxhc3RfbG9va3VwX3B0czsKKworCQkJaWYgKHB0c19kaWZmIDwgMCkgeworCQkJCWRlYy0+cHRzX21vZGVfc3dpdGNoaW5nX2NvdW50Kys7CisJCQkJZGVjLT5wdHNfbW9kZV9yZWNvdmVyeV9jb3VudCA9IDA7CisKKwkJCQlpZiAoZGVjLT5wdHNfbW9kZV9zd2l0Y2hpbmdfY291bnQgPj0KKwkJCQkJUFRTX01PREVfU1dJVENISU5HX1RIUkVTSE9MRCkgeworCQkJCQlkZWMtPnB0c19tb2RlID0KKwkJCQkJCVBUU19OT05FX1JFRl9VU0VfRFVSQVRJT047CisJCQkJCXByX2luZm8KKwkJCQkJKCJIRVZDOiBzd2l0Y2ggdG8gbl9kIG1vZGUuXG4iKTsKKwkJCQl9CisKKwkJCX0gZWxzZSB7CisJCQkJaW50IHAgPSBQVFNfTU9ERV9TV0lUQ0hJTkdfUkVDT1ZFUllfVEhSRUFTSE9MRDsKKwkJCQlkZWMtPnB0c19tb2RlX3JlY292ZXJ5X2NvdW50Kys7CisJCQkJaWYgKGRlYy0+cHRzX21vZGVfcmVjb3ZlcnlfY291bnQgPiBwKSB7CisJCQkJCWRlYy0+cHRzX21vZGVfc3dpdGNoaW5nX2NvdW50ID0gMDsKKwkJCQkJZGVjLT5wdHNfbW9kZV9yZWNvdmVyeV9jb3VudCA9IDA7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcHRzX2Rpc2NvbnRpbnVlID0KKwkJCShhYnMoZGVjLT5sYXN0X3B0cyAgLSB2Zi0+cHRzKSA+PQorCQkJIHRzeW5jX3ZwdHNfZGlzY29udGludWl0eV9tYXJnaW4oKSk7CisKKwkJaWYgKHZmLT5wdHMgIT0gMCkKKwkJCWRlYy0+bGFzdF9sb29rdXBfcHRzID0gdmYtPnB0czsKKworCQlpZiAoKGRlYy0+cHRzX21vZGUgPT0gUFRTX05PTkVfUkVGX1VTRV9EVVJBVElPTikKKwkJCSYmICgocGljLT5zbGljZV90eXBlICE9IElfSU1HKSB8fCAoIXB0c19kaXNjb250aW51ZSAmJgorCQkJIWZpcnN0X3B0c19jaGVja2luX2NvbXBsZXRlKFBUU19UWVBFX0FVRElPKSkpKQorCQkJdmYtPnB0cyA9IGRlYy0+bGFzdF9wdHMgKyBEVVIyUFRTKGRlYy0+ZnJhbWVfZHVyKTsKKwkJZGVjLT5sYXN0X3B0cyA9IHZmLT5wdHM7CisKKwkJaWYgKHZmLT5wdHNfdXM2NCAhPSAwKQorCQkJZGVjLT5sYXN0X2xvb2t1cF9wdHNfdXM2NCA9IHZmLT5wdHNfdXM2NDsKKworCQlpZiAoKGRlYy0+cHRzX21vZGUgPT0gUFRTX05PTkVfUkVGX1VTRV9EVVJBVElPTikKKwkJCSYmICgocGljLT5zbGljZV90eXBlICE9IElfSU1HKSB8fCAoIXB0c19kaXNjb250aW51ZSAmJgorCQkJIWZpcnN0X3B0c19jaGVja2luX2NvbXBsZXRlKFBUU19UWVBFX0FVRElPKSkpKSB7CisJCQl2Zi0+cHRzX3VzNjQgPQorCQkJCWRlYy0+bGFzdF9wdHNfdXM2NCArCisJCQkJKERVUjJQVFMoZGVjLT5mcmFtZV9kdXIpICogMTAwIC8gOSk7CisJCX0KKworCQlkZWMtPmxhc3RfcHRzX3VzNjQgPSB2Zi0+cHRzX3VzNjQ7CisJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19PVVRfUFRTLAorCQkJImF2czIgZGVjIG91dCBwdHM6IHZmLT5wdHM9JWQsIHZmLT5wdHNfdXM2NCA9ICVsbGRcbiIsCisJCQl2Zi0+cHRzLCB2Zi0+cHRzX3VzNjQpOworCQl9CisKKwkJdmYtPmluZGV4ID0gMHhmZjAwIHwgcGljLT5pbmRleDsKKworCQlpZiAocGljLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MTApIHsKKwkJCS8qIGRvdWJsZSB3cml0ZSBvbmx5ICovCisJCQl2Zi0+Y29tcEJvZHlBZGRyID0gMDsKKwkJCXZmLT5jb21wSGVhZEFkZHIgPSAwOworCQl9IGVsc2UgeworI2lmZGVmIEFWUzJfMTBCX01NVQorCQkJdmYtPmNvbXBCb2R5QWRkciA9IDA7CisJCQl2Zi0+Y29tcEhlYWRBZGRyID0gcGljLT5oZWFkZXJfYWRyOworI2lmZGVmIEFWUzJfMTBCX01NVV9EVworCQkJdmYtPmR3Qm9keUFkZHIgPSAwOworCQkJdmYtPmR3SGVhZEFkZHIgPSAwOworCQkJaWYgKHBpYy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDIwKSB7CisJCQkJdTMyIG1vZGUgPSBwaWMtPmRvdWJsZV93cml0ZV9tb2RlICYgMHhmOworCQkJCWlmIChtb2RlID09IDUgfHwgbW9kZSA9PSAzKQorCQkJCQl2Zi0+ZHdIZWFkQWRkciA9IHBpYy0+ZHdfaGVhZGVyX2FkcjsKKwkJCQllbHNlIGlmICgobW9kZSA9PSAxIHx8IG1vZGUgPT0gMiB8fCBtb2RlID09IDQpCisJCQkJCSYmICgoZGVidWcgJiBBVlMyX0RCR19PVVRfUFRTKSA9PSAwKSkgeworCQkJCQl2Zi0+Y29tcEhlYWRBZGRyID0gcGljLT5kd19oZWFkZXJfYWRyOworCQkJCQlwcl9pbmZvKCJVc2UgZHcgbW11IGZvciBkaXNwbGF5XG4iKTsKKwkJCQl9CisJCQl9CisjZW5kaWYKKworI2Vsc2UKKwkJCXZmLT5jb21wQm9keUFkZHIgPSBwaWMtPm1jX3lfYWRyOyAvKmJvZHkgYWRyKi8KKwkJCXZmLT5jb21wSGVhZEFkZHIgPSBwaWMtPm1jX3lfYWRyICsgcGljLT5jb21wX2JvZHlfc2l6ZTsKKyNlbmRpZgorCQl9CisJCWlmIChwaWMtPmRvdWJsZV93cml0ZV9tb2RlICYmCisJCQkoKHBpYy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDIwKSA9PSAwKSkgeworCQkJdmYtPnR5cGUgPSBWSURUWVBFX1BST0dSRVNTSVZFIHwKKwkJCQlWSURUWVBFX1ZJVV9GSUVMRDsKKwkJCXZmLT50eXBlIHw9IFZJRFRZUEVfVklVX05WMjE7CisJCQlpZiAocGljLT5kb3VibGVfd3JpdGVfbW9kZSA9PSAzKSB7CisJCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9DT01QUkVTUzsKKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwkJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX1NDQVRURVI7CisjZW5kaWYKKwkJCX0KKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCQlpZiAoZGVjLT5tX2luc19mbGFnKSB7CisJCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IC0xOworCQkJCQl2Zi0+cGxhbmVfbnVtID0gMjsKKwkJCQkJdmYtPmNhbnZhczBfY29uZmlnWzBdID0KKwkJCQkJCXBpYy0+Y2FudmFzX2NvbmZpZ1swXTsKKwkJCQkJdmYtPmNhbnZhczBfY29uZmlnWzFdID0KKwkJCQkJCXBpYy0+Y2FudmFzX2NvbmZpZ1sxXTsKKworCQkJCQl2Zi0+Y2FudmFzMV9jb25maWdbMF0gPQorCQkJCQkJcGljLT5jYW52YXNfY29uZmlnWzBdOworCQkJCQl2Zi0+Y2FudmFzMV9jb25maWdbMV0gPQorCQkJCQkJcGljLT5jYW52YXNfY29uZmlnWzFdOworCisJCQl9IGVsc2UKKyNlbmRpZgorCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9CisJCQkJCXNwZWMyY2FudmFzKHBpYyk7CisJCX0gZWxzZSB7CisJCQl2Zi0+Y2FudmFzMEFkZHIgPSB2Zi0+Y2FudmFzMUFkZHIgPSAwOworCQkJdmYtPnR5cGUgPSBWSURUWVBFX0NPTVBSRVNTIHwgVklEVFlQRV9WSVVfRklFTEQ7CisjaWZkZWYgQVZTMl8xMEJfTU1VCisJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX1NDQVRURVI7CisjZW5kaWYKKwkJfQorCisJCXN3aXRjaCAocGljLT5iaXRfZGVwdGgpIHsKKwkJY2FzZSBBVlMyX0JJVFNfODoKKwkJCXZmLT5iaXRkZXB0aCA9IEJJVERFUFRIX1k4IHwKKwkJCQlCSVRERVBUSF9VOCB8IEJJVERFUFRIX1Y4OworCQkJYnJlYWs7CisJCWNhc2UgQVZTMl9CSVRTXzEwOgorCQljYXNlIEFWUzJfQklUU18xMjoKKwkJCXZmLT5iaXRkZXB0aCA9IEJJVERFUFRIX1kxMCB8CisJCQkJQklUREVQVEhfVTEwIHwgQklUREVQVEhfVjEwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl2Zi0+Yml0ZGVwdGggPSBCSVRERVBUSF9ZMTAgfAorCQkJCUJJVERFUFRIX1UxMCB8IEJJVERFUFRIX1YxMDsKKwkJCWJyZWFrOworCQl9CisJCWlmICgodmYtPnR5cGUgJiBWSURUWVBFX0NPTVBSRVNTKSA9PSAwKQorCQkJdmYtPmJpdGRlcHRoID0KKwkJCQlCSVRERVBUSF9ZOCB8IEJJVERFUFRIX1U4IHwgQklUREVQVEhfVjg7CisJCWlmIChwaWMtPmJpdF9kZXB0aCA9PSBBVlMyX0JJVFNfOCkKKwkJCXZmLT5iaXRkZXB0aCB8PSBCSVRERVBUSF9TQVZJTkdfTU9ERTsKKworCQlzZXRfZnJhbWVfaW5mbyhkZWMsIHZmKTsKKwkJLyogaWYoKHZmLT53aWR0aCE9cGljLT53aWR0aCl8CisJCQkodmYtPmhlaWdodCE9cGljLT5oZWlnaHQpKSAqLworCQkvKiBwcl9pbmZvKCJhYWE6ICVkLyVkLCAlZC8lZFxuIiwKKwkJICAgdmYtPndpZHRoLHZmLT5oZWlnaHQsIHBpYy0+d2lkdGgsCisJCQlwaWMtPmhlaWdodCk7ICovCisJCXZmLT53aWR0aCA9IHBpYy0+cGljX3cgLworCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhwaWMtPmRvdWJsZV93cml0ZV9tb2RlKTsKKwkJdmYtPmhlaWdodCA9IHBpYy0+cGljX2ggLworCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhwaWMtPmRvdWJsZV93cml0ZV9tb2RlKTsKKwkJaWYgKGZvcmNlX3dfaCAhPSAwKSB7CisJCQl2Zi0+d2lkdGggPSAoZm9yY2Vfd19oID4+IDE2KSAmIDB4ZmZmZjsKKwkJCXZmLT5oZWlnaHQgPSBmb3JjZV93X2ggJiAweGZmZmY7CisJCX0KKwkJaWYgKChwaWMtPmRvdWJsZV93cml0ZV9tb2RlICYgMHgyMCkgJiYKKwkJCSgocGljLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4ZikgPT0gMiB8fAorCQkJKHBpYy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweGYpID09IDQpKSB7CisJCQl2Zi0+Y29tcFdpZHRoID0gcGljLT5waWNfdyAvCisJCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbygKKwkJCQkJcGljLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4Zik7CisJCQl2Zi0+Y29tcEhlaWdodCA9IHBpYy0+cGljX2ggLworCQkJCWdldF9kb3VibGVfd3JpdGVfcmF0aW8oCisJCQkJCXBpYy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweGYpOworCQl9IGVsc2UgeworCQkJdmYtPmNvbXBXaWR0aCA9IHBpYy0+cGljX3c7CisJCQl2Zi0+Y29tcEhlaWdodCA9IHBpYy0+cGljX2g7CisJCX0KKwkJaWYgKGZvcmNlX2ZwcyAmIDB4MTAwKSB7CisJCQl1MzIgcmF0ZSA9IGZvcmNlX2ZwcyAmIDB4ZmY7CisJCQlpZiAocmF0ZSkKKwkJCQl2Zi0+ZHVyYXRpb24gPSA5NjAwMC9yYXRlOworCQkJZWxzZQorCQkJCXZmLT5kdXJhdGlvbiA9IDA7CisJCX0KKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwkJaWYgKHZmLT50eXBlICYgVklEVFlQRV9TQ0FUVEVSKSB7CisjaWZkZWYgQVZTMl8xMEJfTU1VX0RXCisJCWlmIChwaWMtPmRvdWJsZV93cml0ZV9tb2RlICYgMHgyMCkgeworCQkJdmYtPm1lbV9oYW5kbGUgPQorCQkJCWRlY29kZXJfbW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCQkJZGVjLT5kd19tbXVfYm94LCBwaWMtPmluZGV4KTsKKwkJCXZmLT5tZW1faGVhZF9oYW5kbGUgPQorCQkJCWRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJCWRlYy0+Ym1tdV9ib3gsCisJCQkJCUhFQURFUl9CVUZGRVJfSURYKHBpYy0+QlVGX2luZGV4KSk7CisJCQl2Zi0+bWVtX2R3X2hhbmRsZSA9IE5VTEw7CisJCX0gZWxzZQorI2VuZGlmCisJCXsKKwkJCXZmLT5tZW1faGFuZGxlID0gZGVjb2Rlcl9tbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCWRlYy0+bW11X2JveCwKKwkJCQlwaWMtPmluZGV4KTsKKwkJCXZmLT5tZW1faGVhZF9oYW5kbGUgPSBkZWNvZGVyX2JtbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCWRlYy0+Ym1tdV9ib3gsCisJCQkJSEVBREVSX0JVRkZFUl9JRFgocGljLT5pbmRleCkpOworCQl9CisJCX0gZWxzZSB7CisJCQl2Zi0+bWVtX2hhbmRsZSA9IGRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJZGVjLT5ibW11X2JveCwKKwkJCQlWRl9CVUZGRVJfSURYKHBpYy0+aW5kZXgpKTsKKwkJCXZmLT5tZW1faGVhZF9oYW5kbGUgPSBkZWNvZGVyX2JtbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCWRlYy0+Ym1tdV9ib3gsCisJCQkJSEVBREVSX0JVRkZFUl9JRFgocGljLT5pbmRleCkpOworCQl9CisjZWxzZQorCQl2Zi0+bWVtX2hhbmRsZSA9IGRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQlkZWMtPmJtbXVfYm94LAorCQkJVkZfQlVGRkVSX0lEWChwaWMtPmluZGV4KSk7CisjZW5kaWYKKwlpZiAoIXZkZWMtPnZidWYudXNlX3B0c3NlcnYgJiYgdmRlY19zdHJlYW1fYmFzZWQodmRlYykpIHsKKwkJdmYtPnB0c191czY0ID0gc3RyZWFtX29mZnNldDsKKwkJdmYtPnB0cyA9IDA7CisJfQorCWlmICghZHVtbXkpIHsKKwkJbG9ja19idWZmZXIoZGVjLCBmbGFncyk7CisJCXBpYy0+dmZfcmVmID0gMTsKKwkJdW5sb2NrX2J1ZmZlcihkZWMsIGZsYWdzKTsKKwl9CisJZGVjLT52Zl9wcmVfY291bnQrKzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRlY191cGRhdGVfZ3ZzKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMpCit7CisJaWYgKGRlYy0+Z3ZzLT5mcmFtZV9oZWlnaHQgIT0gZGVjLT5mcmFtZV9oZWlnaHQpIHsKKwkJZGVjLT5ndnMtPmZyYW1lX3dpZHRoID0gZGVjLT5mcmFtZV93aWR0aDsKKwkJZGVjLT5ndnMtPmZyYW1lX2hlaWdodCA9IGRlYy0+ZnJhbWVfaGVpZ2h0OworCX0KKwlpZiAoZGVjLT5ndnMtPmZyYW1lX2R1ciAhPSBkZWMtPmZyYW1lX2R1cikgeworCQlkZWMtPmd2cy0+ZnJhbWVfZHVyID0gZGVjLT5mcmFtZV9kdXI7CisJCWlmIChkZWMtPmZyYW1lX2R1ciAhPSAwKQorCQkJZGVjLT5ndnMtPmZyYW1lX3JhdGUgPSAoKDk2MDAwICogMTAgLyBkZWMtPmZyYW1lX2R1cikgJSAxMCkgPCA1ID8KKwkJCQkJOTYwMDAgLyBkZWMtPmZyYW1lX2R1ciA6ICg5NjAwMCAvIGRlYy0+ZnJhbWVfZHVyICsxKTsKKwkJZWxzZQorCQkJZGVjLT5ndnMtPmZyYW1lX3JhdGUgPSAtMTsKKwl9CisJZGVjLT5ndnMtPnN0YXR1cyA9IGRlYy0+c3RhdCB8IGRlYy0+ZmF0YWxfZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgYXZzMl9wcmVwYXJlX2Rpc3BsYXlfYnVmKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMpCit7CisjaWZuZGVmIE5PX0RJU1BMQVkKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmID0gTlVMTDsKKwkvKnVuc2lnbmVkIHNob3J0IHNsaWNlX3R5cGU7Ki8KKwlzdHJ1Y3QgYXZzMl9mcmFtZV9zICpwaWM7CisJc3RydWN0IHZkZWNfcyAqcHZkZWMgPSBod190b192ZGVjKGRlYyk7CisJd2hpbGUgKDEpIHsKKwkJcGljID0gZ2V0X2Rpc3BfcGljKGRlYyk7CisJCWlmIChwaWMgPT0gTlVMTCkKKwkJCWJyZWFrOworCisJCWlmIChmb3JjZV9kaXNwX3BpY19pbmRleCAmIDB4MTAwKSB7CisJCQkvKnJlY3ljbGUgZGlyZWN0bHkqLworCQkJY29udGludWU7CisJCX0KKworCQlpZiAocGljLT5lcnJvcl9tYXJrKSB7CisJCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX0RFVEFJTCwKKwkJCQkiISEhZXJyb3IgcGljLCBza2lwXG4iLAorCQkJCTApOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoZGVjLT5zdGFydF9kZWNvZGluZ19mbGFnICE9IDApIHsKKwkJCWlmIChkZWMtPnNraXBfUEJfYmVmb3JlX0kgJiYKKwkJCQlwaWMtPnNsaWNlX3R5cGUgIT0gSV9JTUcpIHsKKwkJCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX0RFVEFJTCwKKwkJCQkJIiEhIXNsaWNlIHR5cGUgJWQgKG5vdCBJKSBza2lwXG4iLAorCQkJCQkwLCBwaWMtPnNsaWNlX3R5cGUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZGVjLT5za2lwX1BCX2JlZm9yZV9JID0gMDsKKwkJfQorCisJCWlmIChrZmlmb19nZXQoJmRlYy0+bmV3ZnJhbWVfcSwgJnZmKSA9PSAwKSB7CisJCQlwcl9pbmZvKCJmYXRhbCBlcnJvciwgbm8gYXZhaWxhYmxlIGJ1ZmZlciBzbG90LiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaWYgKHZmKSB7CisJCQlzdHJ1Y3QgdmRlY19pbmZvIHRtcDR4OworCQkJaW50IHN0cmVhbV9vZmZzZXQgPSBwaWMtPnN0cmVhbV9vZmZzZXQ7CisJCQlzZXRfdmZyYW1lKGRlYywgdmYsIHBpYywgMCk7CisJCQlkZWNvZGVyX2RvX2ZyYW1lX2NoZWNrKHB2ZGVjLCB2Zik7CisJCQl2ZGVjX3ZmcmFtZV9yZWFkeShwdmRlYywgdmYpOworCQkJa2ZpZm9fcHV0KCZkZWMtPmRpc3BsYXlfcSwgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwkJCUFUUkFDRV9DT1VOVEVSKGRlYy0+cHRzX25hbWUsIHZmLT5wdHMpOworCQkJQVRSQUNFX0NPVU5URVIoZGVjLT5uZXdfcV9uYW1lLCBrZmlmb19sZW4oJmRlYy0+bmV3ZnJhbWVfcSkpOworCQkJQVRSQUNFX0NPVU5URVIoZGVjLT5kaXNwX3FfbmFtZSwga2ZpZm9fbGVuKCZkZWMtPmRpc3BsYXlfcSkpOworCisJCQlkZWNfdXBkYXRlX2d2cyhkZWMpOworCQkJLypjb3VudCBpbmZvKi8KKwkJCXZkZWNfY291bnRfaW5mbyhkZWMtPmd2cywgMCwgc3RyZWFtX29mZnNldCk7CisJCWlmIChzdHJlYW1fb2Zmc2V0KSB7CisJCQlpZiAocGljLT5zbGljZV90eXBlID09IElfSU1HKSB7CisJCQkJZGVjLT5ndnMtPmlfZGVjb2RlZF9mcmFtZXMrKzsKKwkJCX0gZWxzZSBpZiAocGljLT5zbGljZV90eXBlID09IFBfSU1HKSB7CisJCQkJZGVjLT5ndnMtPnBfZGVjb2RlZF9mcmFtZXMrKzsKKwkJCX0gZWxzZSBpZiAocGljLT5zbGljZV90eXBlID09IEJfSU1HKSB7CisJCQkJZGVjLT5ndnMtPmJfZGVjb2RlZF9mcmFtZXMrKzsKKwkJCX0KKwkJfQorCQkJbWVtY3B5KCZ0bXA0eCwgZGVjLT5ndnMsIHNpemVvZihzdHJ1Y3QgdmRlY19pbmZvKSk7CisJCQl0bXA0eC5iaXRfZGVwdGhfbHVtYSA9IGJpdF9kZXB0aF9sdW1hOworCQkJdG1wNHguYml0X2RlcHRoX2Nocm9tYSA9IGJpdF9kZXB0aF9jaHJvbWE7CisJCQl0bXA0eC5kb3VibGVfd3JpdGVfbW9kZSA9IHBpYy0+ZG91YmxlX3dyaXRlX21vZGU7CisJCQl2ZGVjX2ZpbGxfdmRlY19mcmFtZShwdmRlYywgJmRlYy0+dmZyYW1lX3FvcywgJnRtcDR4LCB2ZiwgcGljLT5od19kZWNvZGVfdGltZSk7CisJCQlwdmRlYy0+dmRlY19mcHNfZGV0ZWMocHZkZWMtPmlkKTsKKwkJCWlmICh3aXRob3V0X2Rpc3BsYXlfbW9kZSA9PSAwKSB7CisJCQkJdmZfbm90aWZ5X3JlY2VpdmVyKGRlYy0+cHJvdmlkZXJfbmFtZSwKKwkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfVkZSQU1FX1JFQURZLCBOVUxMKTsKKwkJCX0gZWxzZQorCQkJCXZhdnMyX3ZmX3B1dCh2YXZzMl92Zl9nZXQoZGVjKSwgZGVjKTsKKwkJfQorCX0KKy8qIU5PX0RJU1BMQVkqLworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9ycG1fcGFyYW0odW5pb24gcGFyYW1fdSAqcGFyYW1zKQoreworCWludCBpOworCXVuc2lnbmVkIGludCBkYXRhMzI7CisJaWYgKGRlYnVnICYgQVZTMl9EQkdfQlVGTUdSKQorCQlwcl9pbmZvKCJlbnRlciAlc1xyXG4iLCBfX2Z1bmNfXyk7CisJZm9yIChpID0gMDsgaSA8IChSUE1fRU5EIC0gUlBNX0JFR0lOKTsgaSsrKSB7CisJCWRvIHsKKwkJCWRhdGEzMiA9IFJFQURfVlJFRyhSUE1fQ01EX1JFRyk7CisJCQkvKnByX2luZm8oIiV4XG4iLCBkYXRhMzIpOyovCisJCX0gd2hpbGUgKChkYXRhMzIgJiAweDEwMDAwKSA9PSAwKTsKKwkJcGFyYW1zLT5sLmRhdGFbaV0gPSBkYXRhMzImMHhmZmZmOworCQkvKnByX2luZm8oIiV4XG4iLCBkYXRhMzIpOyovCisJCVdSSVRFX1ZSRUcoUlBNX0NNRF9SRUcsIDApOworCX0KKwlpZiAoZGVidWcgJiBBVlMyX0RCR19CVUZNR1IpCisJCXByX2luZm8oImxlYXZlICVzXHJcbiIsIF9fZnVuY19fKTsKK30KK3N0YXRpYyB2b2lkIGRlYnVnX2J1ZmZlcl9tZ3JfbW9yZShzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCWludCBpOworCWlmICghKGRlYnVnICYgQVZTMl9EQkdfQlVGTUdSX01PUkUpKQorCQlyZXR1cm47CisJcHJfaW5mbygiYXZzMl9wYXJhbTogKCVkKVxuIiwgZGVjLT5hdnMyX2RlYy5pbWcubnVtYmVyKTsKKwlmb3IgKGkgPSAwOyBpIDwgKFJQTV9FTkQtUlBNX0JFR0lOKTsgaSsrKSB7CisJCXByX2luZm8oIiUwNHggIiwgZGVjLT5hdnMyX2RlYy5wYXJhbS5sLmRhdGFbaV0pOworCQlpZiAoKChpICsgMSkgJiAweGYpID09IDApCisJCQlwcl9pbmZvKCJcbiIpOworCX0KK30KKworI2lmZGVmIEFWUzJfMTBCX01NVQorc3RhdGljIHZvaWQgYXZzMl9yZWN5Y2xlX21tdV9idWZfdGFpbChzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCWlmIChkZWMtPmN1cl9mYl9pZHhfbW11ICE9IElOVkFMSURfSURYKSB7CisJCWlmIChkZWMtPnVzZWRfNGtfbnVtID09IC0xKSB7CisJCQlkZWMtPnVzZWRfNGtfbnVtID0KKwkJCShSRUFEX1ZSRUcoSEVWQ19TQU9fTU1VX1NUQVRVUykgPj4gMTYpOworCQkJaWYgKGRlYy0+bV9pbnNfZmxhZykKKwkJCQloZXZjX21tdV9kbWFfY2hlY2soaHdfdG9fdmRlYyhkZWMpKTsKKwkJCWRlY29kZXJfbW11X2JveF9mcmVlX2lkeF90YWlsKGRlYy0+bW11X2JveCwKKwkJCWRlYy0+Y3VyX2ZiX2lkeF9tbXUsIGRlYy0+dXNlZF80a19udW0pOworCQl9CisJCWRlYy0+Y3VyX2ZiX2lkeF9tbXUgPSBJTlZBTElEX0lEWDsKKwkJZGVjLT51c2VkXzRrX251bSA9IC0xOworCX0KK30KKworc3RhdGljIHZvaWQgYXZzMl9yZWN5Y2xlX21tdV9idWYoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYykKK3sKKwlpZiAoZGVjLT5jdXJfZmJfaWR4X21tdSAhPSBJTlZBTElEX0lEWCkgeworCQlkZWNvZGVyX21tdV9ib3hfZnJlZV9pZHgoZGVjLT5tbXVfYm94LAorCQkJZGVjLT5jdXJfZmJfaWR4X21tdSk7CisKKwkJZGVjLT5jdXJfZmJfaWR4X21tdSA9IElOVkFMSURfSURYOworCQlkZWMtPnVzZWRfNGtfbnVtID0gLTE7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGRlY19hZ2Fpbl9wcm9jZXNzKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMpCit7CisJYW1oZXZjX3N0b3AoKTsKKwlkZWMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0FHQUlOOworCWlmIChkZWMtPnByb2Nlc3Nfc3RhdGUgPT0KKwkJUFJPQ19TVEFURV9ERUNPRElORykgeworCQlkZWMtPnByb2Nlc3Nfc3RhdGUgPQorCQlQUk9DX1NUQVRFX0RFQ09ERV9BR0FJTjsKKwl9IGVsc2UgaWYgKGRlYy0+cHJvY2Vzc19zdGF0ZSA9PQorCQlQUk9DX1NUQVRFX0hFQURfRE9ORSkgeworCQlkZWMtPnByb2Nlc3Nfc3RhdGUgPQorCQlQUk9DX1NUQVRFX0hFQURfQUdBSU47CisJfQorCWRlYy0+bmV4dF9hZ2Fpbl9mbGFnID0gMTsKKwlyZXNldF9wcm9jZXNzX3RpbWUoZGVjKTsKKwl2ZGVjX3NjaGVkdWxlX3dvcmsoJmRlYy0+d29yayk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBsb2cyaSh1aW50MzJfdCB2YWwpCit7CisJdWludDMyX3QgcmV0ID0gLTE7CisJd2hpbGUgKHZhbCAhPSAwKSB7CisJCXZhbCA+Pj0gMTsKKwkJcmV0Kys7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3BpY19lcnJvcihzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjLAorCXN0cnVjdCBhdnMyX2ZyYW1lX3MgKnBpYykKK3sKKwlpZiAocGljLT5kZWNvZGVkX2xjdSA9PSAwKSB7CisJCXBpYy0+ZGVjb2RlZF9sY3UgPQorCQkJKFJFQURfVlJFRyhIRVZDX1BBUlNFUl9MQ1VfU1RBUlQpCisJCQkJCSYgMHhmZmZmZmYpICsgMTsKKwl9CisJaWYgKHBpYy0+ZGVjb2RlZF9sY3UgIT0gZGVjLT5hdnMyX2RlYy5sY3VfdG90YWwpIHsKKwkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUiwKKwkJCSIlcyBlcnJvciBwaWMoaW5kZXggJWQgaW1ndHJfZndSZWZEaXN0YW5jZSAlZCkgZGVjb2RlZCBsY3UgJWQgKHRvdGFsICVkKVxuIiwKKwkJCV9fZnVuY19fLCBwaWMtPmluZGV4LCBwaWMtPmltZ3RyX2Z3UmVmRGlzdGFuY2UsCisJCQlwaWMtPmRlY29kZWRfbGN1LCBkZWMtPmF2czJfZGVjLmxjdV90b3RhbCk7CisJCXBpYy0+ZXJyb3JfbWFyayA9IDE7CisJfSBlbHNlIHsKKwkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUl9NT1JFLAorCQkJIiVzIHBpYyhpbmRleCAlZCBpbWd0cl9md1JlZkRpc3RhbmNlICVkKSBkZWNvZGVkIGxjdSAlZCAodG90YWwgJWQpXG4iLAorCQkJX19mdW5jX18sIHBpYy0+aW5kZXgsIHBpYy0+aW1ndHJfZndSZWZEaXN0YW5jZSwKKwkJCXBpYy0+ZGVjb2RlZF9sY3UsIGRlYy0+YXZzMl9kZWMubGN1X3RvdGFsKTsKKworCX0KK30KK3N0YXRpYyB2b2lkIHVwZGF0ZV9kZWNvZGVkX3BpYyhzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCXN0cnVjdCBhdnMyX2ZyYW1lX3MgKnBpYyA9IGRlYy0+YXZzMl9kZWMuaGMuY3VyX3BpYzsKKwlpZiAocGljKSB7CisJCWRlYy0+YXZzMl9kZWMuaGMuY3VyX3BpYy0+ZGVjb2RlZF9sY3UgPQorCQkJKFJFQURfVlJFRyhIRVZDX1BBUlNFUl9MQ1VfU1RBUlQpCisJCQkJCSYgMHhmZmZmZmYpICsgMTsKKwkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUl9NT1JFLAorCQkJIiVzIHBpYyhpbmRleCAlZCBpbWd0cl9md1JlZkRpc3RhbmNlICVkKSBkZWNvZGVkIGxjdSAlZCAodG90YWwgJWQpXG4iLAorCQkJX19mdW5jX18sIHBpYy0+aW5kZXgsIHBpYy0+aW1ndHJfZndSZWZEaXN0YW5jZSwKKwkJCXBpYy0+ZGVjb2RlZF9sY3UsIGRlYy0+YXZzMl9kZWMubGN1X3RvdGFsKTsKKwl9Cit9CisvKiArW1NFXSBbQlVHXVtCVUctMTcxNDYzXVtjaHVhbnFpLndhbmddOiBnZXQgZnJhbWUgcmF0ZSBieSB2aWRlbyBzZXF1ZXVlKi8KK3N0YXRpYyBpbnQgZ2V0X2ZyYW1lX3JhdGUodW5pb24gcGFyYW1fdSAqcGFyYW1zLCBzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCWludCB0bXAgPSAwOworCisJc3dpdGNoIChwYXJhbXMtPnAuZnJhbWVfcmF0ZV9jb2RlKSB7CisJY2FzZSAxOgorCWNhc2UgMjoKKwkJdG1wID0gMjQ7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJdG1wID0gIDI1OworCQlicmVhazsKKwljYXNlIDQ6CisJY2FzZSA1OgorCQl0bXAgPSAgMzA7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJdG1wID0gIDUwOworCQlicmVhazsKKwljYXNlIDc6CisJY2FzZSA4OgorCQl0bXAgPSAgNjA7CisJCWJyZWFrOworCWNhc2UgOToKKwkJdG1wID0gIDEwMDsKKwkJYnJlYWs7CisJY2FzZSAxMDoKKwkJdG1wID0gMTIwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl0bXAgPSAgMjU7CisJCWJyZWFrOworCX0KKworCWlmICghcGFyYW1zLT5wLnByb2dyZXNzaXZlX3NlcXVlbmNlKQorCQl0bXAgPSB0bXAgLyAyOworCWRlYy0+ZnJhbWVfZHVyID0gZGl2X3U2NCg5NjAwMFVMTCwgdG1wKTsKKwlkZWMtPmdldF9mcmFtZV9kdXIgPSB0cnVlOworCS8qYXZzMl9wcmludChkZWMsIDAsICJhdnMyIGZyYW1lX2R1cjolZCxwcm9ncmVzc2l2ZTolZFxuIiwgZGVjLT5mcmFtZV9kdXIsIHBhcmFtcy0+cC5wcm9ncmVzc2l2ZV9zZXF1ZW5jZSk7Ki8KKwlyZXR1cm4gMDsKK30KKworCisjZGVmaW5lIEhFVkNfTVZfSU5GTyAgIDB4MzEwZAorI2RlZmluZSBIRVZDX1FQX0lORk8gICAweDMxMzcKKyNkZWZpbmUgSEVWQ19TS0lQX0lORk8gMHgzMTM2CisKKy8qIG9ubHkgd2hlbiB3ZSBkZWNvZGVkIG9uZSBmaWVsZCBvciBvbmUgZnJhbWUsCit3ZSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGdldCBxb3MgaW5mbyovCitzdGF0aWMgdm9pZCBnZXRfcGljdHVyZV9xb3NfaW5mbyhzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCXN0cnVjdCBhdnMyX2ZyYW1lX3MgKnBpY3R1cmUgPSBkZWMtPmF2czJfZGVjLmhjLmN1cl9waWM7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoZGVjKTsKKwlpZiAoIXBpY3R1cmUpIHsKKwkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUl9NT1JFLAorCQkJIiVzIGRlY29kZSBwaWN0dXJlIGlzIG5vbmUgZXhpc3RcbiIpOworCisJCXJldHVybjsKKwl9CisJaWYgKHZkZWMtPm12ZnJtKSB7CisJCXBpY3R1cmUtPmZyYW1lX3NpemUgPSB2ZGVjLT5tdmZybS0+ZnJhbWVfc2l6ZTsKKwkJcGljdHVyZS0+aHdfZGVjb2RlX3RpbWUgPQorCQlsb2NhbF9jbG9jaygpIC0gdmRlYy0+bXZmcm0tPmh3X2RlY29kZV9zdGFydDsKKwl9CisKKy8qCisjZGVmaW5lIERFQlVHX1FPUworKi8KKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPCBBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQSkgeworCQl1bnNpZ25lZCBjaGFyIGFbM107CisJCXVuc2lnbmVkIGNoYXIgaSwgaiwgdDsKKwkJdW5zaWduZWQgbG9uZyAgZGF0YTsKKworCQlkYXRhID0gUkVBRF9WUkVHKEhFVkNfTVZfSU5GTyk7CisJCWlmIChwaWN0dXJlLT5zbGljZV90eXBlID09IElfSU1HKQorCQkJZGF0YSA9IDA7CisJCWFbMF0gPSBkYXRhICYgMHhmZjsKKwkJYVsxXSA9IChkYXRhID4+IDgpICYgMHhmZjsKKwkJYVsyXSA9IChkYXRhID4+IDE2KSAmIDB4ZmY7CisKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCWZvciAoaiA9IGkrMTsgaiA8IDM7IGorKykgeworCQkJCWlmIChhW2pdIDwgYVtpXSkgeworCQkJCQl0ID0gYVtqXTsKKwkJCQkJYVtqXSA9IGFbaV07CisJCQkJCWFbaV0gPSB0OworCQkJCX0gZWxzZSBpZiAoYVtqXSA9PSBhW2ldKSB7CisJCQkJCWFbaV0rKzsKKwkJCQkJdCA9IGFbal07CisJCQkJCWFbal0gPSBhW2ldOworCQkJCQlhW2ldID0gdDsKKwkJCQl9CisJCQl9CisJCXBpY3R1cmUtPm1heF9tdiA9IGFbMl07CisJCXBpY3R1cmUtPmF2Z19tdiA9IGFbMV07CisJCXBpY3R1cmUtPm1pbl9tdiA9IGFbMF07CisjaWZkZWYgREVCVUdfUU9TCisJCWF2czJfcHJpbnQoZGVjLCAwLCAibXYgZGF0YSAleCAgYVswXT0gJXggYVsxXT0gJXggYVsyXT0gJXhcbiIsCisJCQlkYXRhLCBhWzBdLCBhWzFdLCBhWzJdKTsKKyNlbmRpZgorCisJCWRhdGEgPSBSRUFEX1ZSRUcoSEVWQ19RUF9JTkZPKTsKKwkJYVswXSA9IGRhdGEgJiAweDFmOworCQlhWzFdID0gKGRhdGEgPj4gOCkgJiAweDNmOworCQlhWzJdID0gKGRhdGEgPj4gMTYpICYgMHg3ZjsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJZm9yIChqID0gaSsxOyBqIDwgMzsgaisrKSB7CisJCQkJaWYgKGFbal0gPCBhW2ldKSB7CisJCQkJCXQgPSBhW2pdOworCQkJCQlhW2pdID0gYVtpXTsKKwkJCQkJYVtpXSA9IHQ7CisJCQkJfSBlbHNlIGlmIChhW2pdID09IGFbaV0pIHsKKwkJCQkJYVtpXSsrOworCQkJCQl0ID0gYVtqXTsKKwkJCQkJYVtqXSA9IGFbaV07CisJCQkJCWFbaV0gPSB0OworCQkJCX0KKwkJCX0KKwkJcGljdHVyZS0+bWF4X3FwID0gYVsyXTsKKwkJcGljdHVyZS0+YXZnX3FwID0gYVsxXTsKKwkJcGljdHVyZS0+bWluX3FwID0gYVswXTsKKyNpZmRlZiBERUJVR19RT1MKKwkJYXZzMl9wcmludChkZWMsIDAsICJxcCBkYXRhICV4ICBhWzBdPSAleCBhWzFdPSAleCBhWzJdPSAleFxuIiwKKwkJCWRhdGEsIGFbMF0sIGFbMV0sIGFbMl0pOworI2VuZGlmCisKKwkJZGF0YSA9IFJFQURfVlJFRyhIRVZDX1NLSVBfSU5GTyk7CisJCWFbMF0gPSBkYXRhICYgMHgxZjsKKwkJYVsxXSA9IChkYXRhID4+IDgpICYgMHgzZjsKKwkJYVsyXSA9IChkYXRhID4+IDE2KSAmIDB4N2Y7CisKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCWZvciAoaiA9IGkrMTsgaiA8IDM7IGorKykgeworCQkJCWlmIChhW2pdIDwgYVtpXSkgeworCQkJCQl0ID0gYVtqXTsKKwkJCQkJYVtqXSA9IGFbaV07CisJCQkJCWFbaV0gPSB0OworCQkJCX0gZWxzZSBpZiAoYVtqXSA9PSBhW2ldKSB7CisJCQkJCWFbaV0rKzsKKwkJCQkJdCA9IGFbal07CisJCQkJCWFbal0gPSBhW2ldOworCQkJCQlhW2ldID0gdDsKKwkJCQl9CisJCQl9CisJCXBpY3R1cmUtPm1heF9za2lwID0gYVsyXTsKKwkJcGljdHVyZS0+YXZnX3NraXAgPSBhWzFdOworCQlwaWN0dXJlLT5taW5fc2tpcCA9IGFbMF07CisKKyNpZmRlZiBERUJVR19RT1MKKwkJYXZzMl9wcmludChkZWMsIDAsCisJCQkic2tpcCBkYXRhICV4ICBhWzBdPSAleCBhWzFdPSAleCBhWzJdPSAleFxuIiwKKwkJCWRhdGEsIGFbMF0sIGFbMV0sIGFbMl0pOworI2VuZGlmCisJfSBlbHNlIHsKKwkJdWludDMyX3QgYmxrODhfeV9jb3VudDsKKwkJdWludDMyX3QgYmxrODhfY19jb3VudDsKKwkJdWludDMyX3QgYmxrMjJfbXZfY291bnQ7CisJCXVpbnQzMl90IHJkYXRhMzI7CisJCWludDMyX3QgbXZfaGk7CisJCWludDMyX3QgbXZfbG87CisJCXVpbnQzMl90IHJkYXRhMzJfbDsKKwkJdWludDMyX3QgbXZ4X0wwX2hpOworCQl1aW50MzJfdCBtdnlfTDBfaGk7CisJCXVpbnQzMl90IG12eF9MMV9oaTsKKwkJdWludDMyX3QgbXZ5X0wxX2hpOworCQlpbnQ2NF90IHZhbHVlOworCQl1aW50NjRfdCB0ZW1wX3ZhbHVlOworI2lmZGVmIERFQlVHX1FPUworCQlpbnQgcGljX251bWJlciA9IDA7CisjZW5kaWYKKworCQlwaWN0dXJlLT5tYXhfbXYgPSAwOworCQlwaWN0dXJlLT5hdmdfbXYgPSAwOworCQlwaWN0dXJlLT5taW5fbXYgPSAwOworCisJCXBpY3R1cmUtPm1heF9za2lwID0gMDsKKwkJcGljdHVyZS0+YXZnX3NraXAgPSAwOworCQlwaWN0dXJlLT5taW5fc2tpcCA9IDA7CisKKwkJcGljdHVyZS0+bWF4X3FwID0gMDsKKwkJcGljdHVyZS0+YXZnX3FwID0gMDsKKwkJcGljdHVyZS0+bWluX3FwID0gMDsKKworCisKKyNpZmRlZiBERUJVR19RT1MKKwkJYXZzMl9wcmludChkZWMsIDAsICJzbGljZV90eXBlOiVkLCBwb2M6JWRcbiIsCisJCQlwaWN0dXJlLT5zbGljZV90eXBlLAorCQkJcGljX251bWJlcik7CisjZW5kaWYKKwkJLyogc2V0IHJkX2lkeCB0byAwICovCisJICAgIFdSSVRFX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9DVFJMLCAwKTsKKworCSAgICBibGs4OF95X2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJICAgIGlmIChibGs4OF95X2NvdW50ID09IDApIHsKKyNpZmRlZiBERUJVR19RT1MKKwkJCWF2czJfcHJpbnQoZGVjLCAwLAorCQkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBOTyBEYXRhIHlldC5cbiIsCisJCQkJcGljX251bWJlcik7CisjZW5kaWYKKwkJCS8qIHJlc2V0IGFsbCBjb3VudHMgKi8KKwkJCVdSSVRFX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9DVFJMLCAoMTw8OCkpOworCQkJcmV0dXJuOworCSAgICB9CisJCS8qIHFwX3lfc3VtICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgYXZzMl9wcmludChkZWMsIDAsCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gWSBRUCBBVkcgOiAlZCAoJWQvJWQpXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMi9ibGs4OF95X2NvdW50LAorCQkJcmRhdGEzMiwgYmxrODhfeV9jb3VudCk7CisjZW5kaWYKKwkJcGljdHVyZS0+YXZnX3FwID0gcmRhdGEzMi9ibGs4OF95X2NvdW50OworCQkvKiBpbnRyYV95X2NvdW50ICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgYXZzMl9wcmludChkZWMsIDAsCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gWSBpbnRyYSByYXRlIDogJWQlYyAoJWQpXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMioxMDAvYmxrODhfeV9jb3VudCwKKwkJCSclJywgcmRhdGEzMik7CisjZW5kaWYKKwkJLyogc2tpcHBlZF95X2NvdW50ICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgYXZzMl9wcmludChkZWMsIDAsCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gWSBza2lwcGVkIHJhdGUgOiAlZCVjICglZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyKjEwMC9ibGs4OF95X2NvdW50LAorCQkJJyUnLCByZGF0YTMyKTsKKyNlbmRpZgorCQlwaWN0dXJlLT5hdmdfc2tpcCA9IHJkYXRhMzIqMTAwL2Jsazg4X3lfY291bnQ7CisJCS8qIGNvZWZmX25vbl96ZXJvX3lfY291bnQgKi8KKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworI2lmZGVmIERFQlVHX1FPUworCSAgICBhdnMyX3ByaW50KGRlYywgMCwKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBZIFpFUk9fQ29lZmYgcmF0ZSA6ICVkJWMgKCVkKVxuIiwKKwkJCXBpY19udW1iZXIsICgxMDAgLSByZGF0YTMyKjEwMC8oYmxrODhfeV9jb3VudCoxKSksCisJCQknJScsIHJkYXRhMzIpOworI2VuZGlmCisJCS8qIGJsazY2X2NfY291bnQgKi8KKwkgICAgYmxrODhfY19jb3VudCA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCSAgICBpZiAoYmxrODhfY19jb3VudCA9PSAwKSB7CisjaWZkZWYgREVCVUdfUU9TCisJCQlhdnMyX3ByaW50KGRlYywgMCwKKwkJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTk8gRGF0YSB5ZXQuXG4iLAorCQkJCXBpY19udW1iZXIpOworI2VuZGlmCisJCQkvKiByZXNldCBhbGwgY291bnRzICovCisJCQlXUklURV9WUkVHKEhFVkNfUElDX1FVQUxJVFlfQ1RSTCwgKDE8PDgpKTsKKwkJCXJldHVybjsKKwkgICAgfQorCQkvKiBxcF9jX3N1bSAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisjaWZkZWYgREVCVUdfUU9TCisJICAgIGF2czJfcHJpbnQoZGVjLCAwLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIEMgUVAgQVZHIDogJWQgKCVkLyVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzIvYmxrODhfY19jb3VudCwKKwkJCXJkYXRhMzIsIGJsazg4X2NfY291bnQpOworI2VuZGlmCisJCS8qIGludHJhX2NfY291bnQgKi8KKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworI2lmZGVmIERFQlVHX1FPUworCSAgICBhdnMyX3ByaW50KGRlYywgMCwKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBDIGludHJhIHJhdGUgOiAlZCVjICglZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyKjEwMC9ibGs4OF9jX2NvdW50LAorCQkJJyUnLCByZGF0YTMyKTsKKyNlbmRpZgorCQkvKiBza2lwcGVkX2N1X2NfY291bnQgKi8KKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworI2lmZGVmIERFQlVHX1FPUworCSAgICBhdnMyX3ByaW50KGRlYywgMCwKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBDIHNraXBwZWQgcmF0ZSA6ICVkJWMgKCVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzIqMTAwL2Jsazg4X2NfY291bnQsCisJCQknJScsIHJkYXRhMzIpOworI2VuZGlmCisJCS8qIGNvZWZmX25vbl96ZXJvX2NfY291bnQgKi8KKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworI2lmZGVmIERFQlVHX1FPUworCSAgICBhdnMyX3ByaW50KGRlYywgMCwKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBDIFpFUk9fQ29lZmYgcmF0ZSA6ICVkJWMgKCVkKVxuIiwKKwkJCXBpY19udW1iZXIsICgxMDAgLSByZGF0YTMyKjEwMC8oYmxrODhfY19jb3VudCoxKSksCisJCQknJScsIHJkYXRhMzIpOworI2VuZGlmCisKKwkJLyogMSdoMCwgcXBfY19tYXhbNjowXSwgMSdoMCwgcXBfY19taW5bNjowXSwKKwkJMSdoMCwgcXBfeV9tYXhbNjowXSwgMSdoMCwgcXBfeV9taW5bNjowXSAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisjaWZkZWYgREVCVUdfUU9TCisJICAgIGF2czJfcHJpbnQoZGVjLCAwLCAiW1BpY3R1cmUgJWQgUXVhbGl0eV0gWSBRUCBtaW4gOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIChyZGF0YTMyPj4wKSYweGZmKTsKKyNlbmRpZgorCQlwaWN0dXJlLT5taW5fcXAgPSAocmRhdGEzMj4+MCkmMHhmZjsKKworI2lmZGVmIERFQlVHX1FPUworCSAgICBhdnMyX3ByaW50KGRlYywgMCwgIltQaWN0dXJlICVkIFF1YWxpdHldIFkgUVAgbWF4IDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCAocmRhdGEzMj4+OCkmMHhmZik7CisjZW5kaWYKKwkJcGljdHVyZS0+bWF4X3FwID0gKHJkYXRhMzI+PjgpJjB4ZmY7CisKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgYXZzMl9wcmludChkZWMsIDAsICJbUGljdHVyZSAlZCBRdWFsaXR5XSBDIFFQIG1pbiA6ICVkXG4iLAorCQkJcGljX251bWJlciwgKHJkYXRhMzI+PjE2KSYweGZmKTsKKwkgICAgYXZzMl9wcmludChkZWMsIDAsICJbUGljdHVyZSAlZCBRdWFsaXR5XSBDIFFQIG1heCA6ICVkXG4iLAorCQkJcGljX251bWJlciwgKHJkYXRhMzI+PjI0KSYweGZmKTsKKyNlbmRpZgorCisJCS8qIGJsazIyX212X2NvdW50ICovCisJICAgIGJsazIyX212X2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJICAgIGlmIChibGsyMl9tdl9jb3VudCA9PSAwKSB7CisjaWZkZWYgREVCVUdfUU9TCisJCQlhdnMyX3ByaW50KGRlYywgMCwKKwkJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTk8gTVYgRGF0YSB5ZXQuXG4iLAorCQkJCXBpY19udW1iZXIpOworI2VuZGlmCisJCQkvKiByZXNldCBhbGwgY291bnRzICovCisJCQlXUklURV9WUkVHKEhFVkNfUElDX1FVQUxJVFlfQ1RSTCwgKDE8PDgpKTsKKwkJCXJldHVybjsKKwkgICAgfQorCQkvKiBtdnlfTDFfY291bnRbMzk6MzJdLCBtdnhfTDFfY291bnRbMzk6MzJdLAorCQltdnlfTDBfY291bnRbMzk6MzJdLCBtdnhfTDBfY291bnRbMzk6MzJdICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkgICAgLyogc2hvdWxkIGFsbCBiZSAweDAwIG9yIDB4ZmYgKi8KKyNpZmRlZiBERUJVR19RT1MKKwkgICAgYXZzMl9wcmludChkZWMsIDAsCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVYgQVZHIEhpZ2ggQml0czogMHglWFxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzIpOworI2VuZGlmCisJICAgIG12eF9MMF9oaSA9ICgocmRhdGEzMj4+MCkmMHhmZik7CisJICAgIG12eV9MMF9oaSA9ICgocmRhdGEzMj4+OCkmMHhmZik7CisJICAgIG12eF9MMV9oaSA9ICgocmRhdGEzMj4+MTYpJjB4ZmYpOworCSAgICBtdnlfTDFfaGkgPSAoKHJkYXRhMzI+PjI0KSYweGZmKTsKKworCQkvKiBtdnhfTDBfY291bnRbMzE6MF0gKi8KKwkgICAgcmRhdGEzMl9sID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJCXRlbXBfdmFsdWUgPSBtdnhfTDBfaGk7CisJCXRlbXBfdmFsdWUgPSAodGVtcF92YWx1ZSA8PCAzMikgfCByZGF0YTMyX2w7CisKKwkJaWYgKG12eF9MMF9oaSAmIDB4ODApCisJCQl2YWx1ZSA9IDB4RkZGRkZGRjAwMDAwMDAwMCB8IHRlbXBfdmFsdWU7CisJCWVsc2UKKwkJCXZhbHVlID0gdGVtcF92YWx1ZTsKKwkJIHZhbHVlID0gZGl2X3M2NCh2YWx1ZSwgYmxrMjJfbXZfY291bnQpOworI2lmZGVmIERFQlVHX1FPUworCQlhdnMyX3ByaW50KGRlYywgMCwKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVlhfTDAgQVZHIDogJWQgKCVsbGQvJWQpXG4iLAorCQkJcGljX251bWJlciwgKGludCl2YWx1ZSwKKwkJCXZhbHVlLCBibGsyMl9tdl9jb3VudCk7CisjZW5kaWYKKwkJcGljdHVyZS0+YXZnX212ID0gdmFsdWU7CisKKwkJLyogbXZ5X0wwX2NvdW50WzMxOjBdICovCisJICAgIHJkYXRhMzJfbCA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCQl0ZW1wX3ZhbHVlID0gbXZ5X0wwX2hpOworCQl0ZW1wX3ZhbHVlID0gKHRlbXBfdmFsdWUgPDwgMzIpIHwgcmRhdGEzMl9sOworCisJCWlmIChtdnlfTDBfaGkgJiAweDgwKQorCQkJdmFsdWUgPSAweEZGRkZGRkYwMDAwMDAwMDAgfCB0ZW1wX3ZhbHVlOworCQllbHNlCisJCQl2YWx1ZSA9IHRlbXBfdmFsdWU7CisjaWZkZWYgREVCVUdfUU9TCisJICAgIGF2czJfcHJpbnQoZGVjLCAwLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWV9MMCBBVkcgOiAlZCAoJWxsZC8lZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyX2wvYmxrMjJfbXZfY291bnQsCisJCQl2YWx1ZSwgYmxrMjJfbXZfY291bnQpOworI2VuZGlmCisKKwkJLyogbXZ4X0wxX2NvdW50WzMxOjBdICovCisJICAgIHJkYXRhMzJfbCA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCQl0ZW1wX3ZhbHVlID0gbXZ4X0wxX2hpOworCQl0ZW1wX3ZhbHVlID0gKHRlbXBfdmFsdWUgPDwgMzIpIHwgcmRhdGEzMl9sOworCQlpZiAobXZ4X0wxX2hpICYgMHg4MCkKKwkJCXZhbHVlID0gMHhGRkZGRkZGMDAwMDAwMDAwIHwgdGVtcF92YWx1ZTsKKwkJZWxzZQorCQkJdmFsdWUgPSB0ZW1wX3ZhbHVlOworI2lmZGVmIERFQlVHX1FPUworCSAgICBhdnMyX3ByaW50KGRlYywgMCwKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVlhfTDEgQVZHIDogJWQgKCVsbGQvJWQpXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMl9sL2JsazIyX212X2NvdW50LAorCQkJdmFsdWUsIGJsazIyX212X2NvdW50KTsKKyNlbmRpZgorCisJCS8qIG12eV9MMV9jb3VudFszMTowXSAqLworCSAgICByZGF0YTMyX2wgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkJdGVtcF92YWx1ZSA9IG12eV9MMV9oaTsKKwkJdGVtcF92YWx1ZSA9ICh0ZW1wX3ZhbHVlIDw8IDMyKSB8IHJkYXRhMzJfbDsKKwkJaWYgKG12eV9MMV9oaSAmIDB4ODApCisJCQl2YWx1ZSA9IDB4RkZGRkZGRjAwMDAwMDAwMCB8IHRlbXBfdmFsdWU7CisJCWVsc2UKKwkJCXZhbHVlID0gdGVtcF92YWx1ZTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgYXZzMl9wcmludChkZWMsIDAsCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZZX0wxIEFWRyA6ICVkICglbGxkLyVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzJfbC9ibGsyMl9tdl9jb3VudCwKKwkJCXZhbHVlLCBibGsyMl9tdl9jb3VudCk7CisjZW5kaWYKKworCQkvKiB7bXZ4X0wwX21heCwgbXZ4X0wwX21pbn0gLy8gZm9ybWF0IDoge3NpZ24sIGFic1sxNDowXX0gICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkgICAgbXZfaGkgPSAocmRhdGEzMj4+MTYpJjB4ZmZmZjsKKwkgICAgaWYgKG12X2hpICYgMHg4MDAwKQorCQkJbXZfaGkgPSAweDgwMDAgLSBtdl9oaTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgYXZzMl9wcmludChkZWMsIDAsICJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVlhfTDAgTUFYIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9oaSk7CisjZW5kaWYKKwkJcGljdHVyZS0+bWF4X212ID0gbXZfaGk7CisKKwkgICAgbXZfbG8gPSAocmRhdGEzMj4+MCkmMHhmZmZmOworCSAgICBpZiAobXZfbG8gJiAweDgwMDApCisJCQltdl9sbyA9IDB4ODAwMCAtIG12X2xvOworI2lmZGVmIERFQlVHX1FPUworCSAgICBhdnMyX3ByaW50KGRlYywgMCwgIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWF9MMCBNSU4gOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIG12X2xvKTsKKyNlbmRpZgorCQlwaWN0dXJlLT5taW5fbXYgPSBtdl9sbzsKKworI2lmZGVmIERFQlVHX1FPUworCQkvKiB7bXZ5X0wwX21heCwgbXZ5X0wwX21pbn0gKi8KKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCSAgICBtdl9oaSA9IChyZGF0YTMyPj4xNikmMHhmZmZmOworCSAgICBpZiAobXZfaGkgJiAweDgwMDApCisJCQltdl9oaSA9IDB4ODAwMCAtIG12X2hpOworCSAgICBhdnMyX3ByaW50KGRlYywgMCwgIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWV9MMCBNQVggOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIG12X2hpKTsKKworCisJICAgIG12X2xvID0gKHJkYXRhMzI+PjApJjB4ZmZmZjsKKwkgICAgaWYgKG12X2xvICYgMHg4MDAwKQorCQkJbXZfbG8gPSAweDgwMDAgLSBtdl9sbzsKKworCSAgICBhdnMyX3ByaW50KGRlYywgMCwgIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWV9MMCBNSU4gOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIG12X2xvKTsKKworCisJCS8qIHttdnhfTDFfbWF4LCBtdnhfTDFfbWlufSAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJICAgIG12X2hpID0gKHJkYXRhMzI+PjE2KSYweGZmZmY7CisJICAgIGlmIChtdl9oaSAmIDB4ODAwMCkKKwkJCW12X2hpID0gMHg4MDAwIC0gbXZfaGk7CisKKwkgICAgYXZzMl9wcmludChkZWMsIDAsICJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVlhfTDEgTUFYIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9oaSk7CisKKworCSAgICBtdl9sbyA9IChyZGF0YTMyPj4wKSYweGZmZmY7CisJICAgIGlmIChtdl9sbyAmIDB4ODAwMCkKKwkJCW12X2xvID0gMHg4MDAwIC0gbXZfbG87CisKKwkgICAgYXZzMl9wcmludChkZWMsIDAsICJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVlhfTDEgTUlOIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9sbyk7CisKKworCQkvKiB7bXZ5X0wxX21heCwgbXZ5X0wxX21pbn0gKi8KKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCSAgICBtdl9oaSA9IChyZGF0YTMyPj4xNikmMHhmZmZmOworCSAgICBpZiAobXZfaGkgJiAweDgwMDApCisJCQltdl9oaSA9IDB4ODAwMCAtIG12X2hpOworCisJICAgIGF2czJfcHJpbnQoZGVjLCAwLCAiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZZX0wxIE1BWCA6ICVkXG4iLAorCQkJcGljX251bWJlciwgbXZfaGkpOworCisJICAgIG12X2xvID0gKHJkYXRhMzI+PjApJjB4ZmZmZjsKKwkgICAgaWYgKG12X2xvICYgMHg4MDAwKQorCQkJbXZfbG8gPSAweDgwMDAgLSBtdl9sbzsKKworCSAgICBhdnMyX3ByaW50KGRlYywgMCwgIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWV9MMSBNSU4gOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIG12X2xvKTsKKyNlbmRpZgorCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9DVFJMKTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgYXZzMl9wcmludChkZWMsIDAsCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gQWZ0ZXIgUmVhZCA6IFZERUNfUElDX1FVQUxJVFlfQ1RSTCA6IDB4JXhcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyKTsKKyNlbmRpZgorCQkvKiByZXNldCBhbGwgY291bnRzICovCisJICAgIFdSSVRFX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9DVFJMLCAoMTw8OCkpOworCX0KK30KKworc3RhdGljIGlycXJldHVybl90IHZhdnMyX2lzcl90aHJlYWRfZm4oaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjID0gKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICopZGF0YTsKKwl1bnNpZ25lZCBpbnQgZGVjX3N0YXR1cyA9IGRlYy0+ZGVjX3N0YXR1czsKKwlpbnQgaSwgcmV0OworCWludDMyX3Qgc3RhcnRfY29kZSA9IDA7CisKKwkvKmlmIChkZWMtPndhaXRfYnVmKQorCQlwcl9pbmZvKCJzZXQgd2FpdF9idWYgdG8gMFxyXG4iKTsKKwkqLworCisJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUl9NT1JFLAorCQkiJXMgZGVjb2RlX3N0YXR1cyAweCV4IHByb2Nlc3Nfc3RhdGUgJWQgbGN1IDB4JXhcbiIsCisJCV9fZnVuY19fLCBkZWNfc3RhdHVzLCBkZWMtPnByb2Nlc3Nfc3RhdGUsCisJCVJFQURfVlJFRyhIRVZDX1BBUlNFUl9MQ1VfU1RBUlQpKTsKKworI2lmbmRlZiBHMTJBX0JSSU5HVVBfREVCVUcKKwlpZiAoZGVjLT5lb3MpIHsKKwkJUFJJTlRfTElORSgpOworCQlnb3RvIGlycV9oYW5kbGVkX2V4aXQ7CisJfQorI2VuZGlmCisJZGVjLT53YWl0X2J1ZiA9IDA7CisJaWYgKGRlY19zdGF0dXMgPT0gQVZTMl9ERUNPREVfQlVGRU1QVFkpIHsKKwkJUFJJTlRfTElORSgpOworCQlpZiAoZGVjLT5tX2luc19mbGFnKSB7CisJCQlyZXNldF9wcm9jZXNzX3RpbWUoZGVjKTsKKwkJCWlmICghdmRlY19mcmFtZV9iYXNlZChod190b192ZGVjKGRlYykpKQorCQkJCWRlY19hZ2Fpbl9wcm9jZXNzKGRlYyk7CisJCQllbHNlIHsKKwkJCQlkZWMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJCQkJcmVzZXRfcHJvY2Vzc190aW1lKGRlYyk7CisJCQkJYW1oZXZjX3N0b3AoKTsKKwkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmRlYy0+d29yayk7CisJCQl9CisJCX0KKwkJZ290byBpcnFfaGFuZGxlZF9leGl0OworCX0gZWxzZSBpZiAoZGVjX3N0YXR1cyA9PSBIRVZDX0RFQ1BJQ19EQVRBX0RPTkUpIHsKKwkJUFJJTlRfTElORSgpOworCQlkZWMtPnN0YXJ0X2RlY29kaW5nX2ZsYWcgfD0gMHgzOworCQlpZiAoZGVjLT5tX2luc19mbGFnKSB7CisJCQlzZXRfY3V2YV9kYXRhKGRlYyk7CisJCQl1cGRhdGVfZGVjb2RlZF9waWMoZGVjKTsKKwkJCWdldF9waWN0dXJlX3Fvc19pbmZvKGRlYyk7CisJCQlyZXNldF9wcm9jZXNzX3RpbWUoZGVjKTsKKwkJCWRlYy0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwkJCWFtaGV2Y19zdG9wKCk7CisjaWYgMCAvKmRlZiBBVlMyXzEwQl9NTVUqLworCQkJaWYgKGRlYy0+bV9pbnNfZmxhZykgeworCQkJCS8qYXZzMl9yZWN5Y2xlX21tdV9idWZfdGFpbChkZWMpOyovCisJCQkJZGVjLT51c2VkXzRrX251bSA9CisJCQkJCShSRUFEX1ZSRUcoSEVWQ19TQU9fTU1VX1NUQVRVUykgPj4gMTYpOworCQkJfQorI2VuZGlmCisKKyNpZiAwCisJCQkvKmtlZXAgaGFyZHdhcmUgc3RhdGUqLworCQkJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0lOVF9TVEFUVVMsICgxPDwzMSkpOworCQkJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9SRVNVTFRfMywgMHhmZmZmZmZmZik7CisJCQlkZWMtPm1wcmVkX2Fidl9zdGFydF9hZGRyID0KKwkJCQlSRUFEX1ZSRUcoSEVWQ19NUFJFRF9BQlZfU1RBUlRfQUREUik7CisJCQkvKiovCisjZW5kaWYKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmZGVjLT53b3JrKTsKKwkJfQorCQlnb3RvIGlycV9oYW5kbGVkX2V4aXQ7CisJfQorCVBSSU5UX0xJTkUoKTsKKyNpZiAwCisJaWYgKGRlY19zdGF0dXMgPT0gQVZTMl9FT1MpIHsKKwkJaWYgKGRlYy0+bV9pbnNfZmxhZykKKwkJCXJlc2V0X3Byb2Nlc3NfdGltZShkZWMpOworCisJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1IsCisJCQkiQVZTMl9FT1MsIGZsdXNoIGJ1ZmZlclxyXG4iKTsKKworCQlhdnMyX3Bvc3RfcHJvY2VzcygmZGVjLT5hdnMyX2RlYyk7CisJCWF2czJfcHJlcGFyZV9kaXNwbGF5X2J1ZihkZWMpOworCisJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1IsCisJCQkic2VuZCBBVlMyXzEwQl9ESVNDQVJEX05BTFxyXG4iKTsKKwkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCBBVlMyXzEwQl9ESVNDQVJEX05BTCk7CisJCWlmIChkZWMtPm1faW5zX2ZsYWcpIHsKKwkJCXVwZGF0ZV9kZWNvZGVkX3BpYyhkZWMpOworCQkJZGVjLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworCQkJYW1oZXZjX3N0b3AoKTsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmZGVjLT53b3JrKTsKKwkJfQorCQlnb3RvIGlycV9oYW5kbGVkX2V4aXQ7CisJfSBlbHNlCisjZW5kaWYKKwlpZiAoZGVjX3N0YXR1cyA9PSBBVlMyX0RFQ09ERV9PVkVSX1NJWkUpIHsKKwkJYXZzMl9wcmludChkZWMsIDAsCisJCQkiYXZzMiAgZGVjb2RlIG92ZXJzaXplICEhXG4iKTsKKwkJZGVidWcgfD0gKEFWUzJfREJHX0RJU19MT0NfRVJST1JfUFJPQyB8CisJCQlBVlMyX0RCR19ESVNfU1lTX0VSUk9SX1BST0MpOworCQlkZWMtPmZhdGFsX2Vycm9yIHw9IERFQ09ERVJfRkFUQUxfRVJST1JfU0laRV9PVkVSRkxPVzsKKwkJaWYgKGRlYy0+bV9pbnNfZmxhZykKKwkJCXJlc2V0X3Byb2Nlc3NfdGltZShkZWMpOworCQlnb3RvIGlycV9oYW5kbGVkX2V4aXQ7CisJfQorCVBSSU5UX0xJTkUoKTsKKworCWlmIChkZWMtPm1faW5zX2ZsYWcpCisJCXJlc2V0X3Byb2Nlc3NfdGltZShkZWMpOworCisJaWYgKGRlY19zdGF0dXMgPT0gQVZTMl9IRUFEX1NFUV9SRUFEWSkKKwkJc3RhcnRfY29kZSA9IFNFUVVFTkNFX0hFQURFUl9DT0RFOworCWVsc2UgaWYgKGRlY19zdGF0dXMgPT0gQVZTMl9IRUFEX1BJQ19JX1JFQURZKQorCQlzdGFydF9jb2RlID0gSV9QSUNUVVJFX1NUQVJUX0NPREU7CisJZWxzZSBpZiAoZGVjX3N0YXR1cyA9PSBBVlMyX0hFQURfUElDX1BCX1JFQURZKQorCQlzdGFydF9jb2RlID0gUEJfUElDVFVSRV9TVEFSVF9DT0RFOworCWVsc2UgaWYgKGRlY19zdGF0dXMgPT0gQVZTMl9TVEFSVENPREVfU0VBUkNIX0RPTkUpCisJCS8qU0VRVUVOQ0VfRU5EX0NPREUsIFZJREVPX0VESVRfQ09ERSovCisJCXN0YXJ0X2NvZGUgPSBSRUFEX1ZSRUcoQ1VSX05BTF9VTklUX1RZUEUpOworCisJaWYgKGRlYy0+cHJvY2Vzc19zdGF0ZSA9PQorCQkJUFJPQ19TVEFURV9IRUFEX0FHQUlOCisJCQkpIHsKKwkJaWYgKChzdGFydF9jb2RlID09IElfUElDVFVSRV9TVEFSVF9DT0RFKQorCQl8fCAoc3RhcnRfY29kZSA9PSBQQl9QSUNUVVJFX1NUQVJUX0NPREUpKSB7CisJCQlhdnMyX3ByaW50KGRlYywgMCwKKwkJCQkiUFJPQ19TVEFURV9IRUFEX0FHQUlOIGVycm9yLCBzdGFydF9jb2RlIDB4JXghISFcclxuIiwKKwkJCQlzdGFydF9jb2RlKTsKKwkJCWdvdG8gaXJxX2hhbmRsZWRfZXhpdDsKKwkJfSBlbHNlIHsKKwkJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1IsCisJCQkJIlBST0NfU1RBVEVfSEVBRF9BR0FJTiwgc3RhcnRfY29kZSAweCV4XHJcbiIsCisJCQkJc3RhcnRfY29kZSk7CisJCQlkZWMtPnByb2Nlc3Nfc3RhdGUgPSBQUk9DX1NUQVRFX0hFQURfRE9ORTsKKwkJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgQVZTMl9BQ1RJT05fRE9ORSk7CisJCQlnb3RvIGlycV9oYW5kbGVkX2V4aXQ7CisJCX0KKwl9IGVsc2UgaWYgKGRlYy0+cHJvY2Vzc19zdGF0ZSA9PQorCQkJUFJPQ19TVEFURV9ERUNPREVfQUdBSU4pIHsKKwkJaWYgKChzdGFydF9jb2RlID09IElfUElDVFVSRV9TVEFSVF9DT0RFKQorCQl8fCAoc3RhcnRfY29kZSA9PSBQQl9QSUNUVVJFX1NUQVJUX0NPREUpKSB7CisJCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSLAorCQkJCSJQUk9DX1NUQVRFX0RFQ09ERV9BR0FJTj0+IGRlY29kZV9zbGljZSwgc3RhcnRfY29kZSAweCV4XHJcbiIsCisJCQkJc3RhcnRfY29kZSk7CisJCQlnb3RvIGRlY29kZV9zbGljZTsKKwkJfSBlbHNlIHsKKwkJCWF2czJfcHJpbnQoZGVjLCAwLAorCQkJCSJQUk9DX1NUQVRFX0RFQ09ERV9BR0FJTiwgc3RhcnRfY29kZSAweCV4ISEhXHJcbiIsCisJCQkJc3RhcnRfY29kZSk7CisJCQlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIEFWUzJfQUNUSU9OX0RPTkUpOworCQkJZ290byBpcnFfaGFuZGxlZF9leGl0OworCQl9CisJfQorCisJaWYgKChzdGFydF9jb2RlID09IElfUElDVFVSRV9TVEFSVF9DT0RFKQorCQl8fCAoc3RhcnRfY29kZSA9PSBQQl9QSUNUVVJFX1NUQVJUX0NPREUpCisJCXx8IChzdGFydF9jb2RlID09IFNFUVVFTkNFX0VORF9DT0RFKQorCQl8fCAoc3RhcnRfY29kZSA9PSBWSURFT19FRElUX0NPREUpKSB7CisJCVBSSU5UX0xJTkUoKTsKKworCQlpZiAoZGVjLT5hdnMyX2RlYy5oYy5jdXJfcGljICE9IE5VTEwpIHsKKwkJCWludDMyX3QgaWk7CisjaWZkZWYgQVZTMl8xMEJfTU1VCisJCQlhdnMyX3JlY3ljbGVfbW11X2J1Zl90YWlsKGRlYyk7CisjZW5kaWYKKwkJCWNoZWNrX3BpY19lcnJvcihkZWMsIGRlYy0+YXZzMl9kZWMuaGMuY3VyX3BpYyk7CisJCQlhdnMyX3Bvc3RfcHJvY2VzcygmZGVjLT5hdnMyX2RlYyk7CisKKwkJCWlmIChkZWJ1ZyAmIEFWUzJfREJHX1BSSU5UX1BJQ19MSVNUKQorCQkJCWR1bXBfcGljX2xpc3QoZGVjKTsKKworCQkJYXZzMl9wcmVwYXJlX2Rpc3BsYXlfYnVmKGRlYyk7CisJCQlkZWMtPmF2czJfZGVjLmhjLmN1cl9waWMgPSBOVUxMOworCQkJZm9yIChpaSA9IDA7IGlpIDwgZGVjLT5hdnMyX2RlYy5yZWZfbWF4YnVmZmVyOworCQkJCQlpaSsrKSB7CisJCQkJc3RydWN0IGF2czJfZnJhbWVfcyAqcGljID0KKwkJCQkJZGVjLT5hdnMyX2RlYy5mcmVmW2lpXTsKKwkJCQlpZiAocGljLT5iZ19mbGFnID09IDAgJiYKKwkJCQkJcGljLT5pc19vdXRwdXQgPT0gLTEgJiYKKwkJCQkJcGljLT5tbXVfYWxsb2NfZmxhZyAmJgorCQkJCQlwaWMtPnZmX3JlZiA9PSAwKSB7CisJCQkJCWlmIChwaWMtPnJlZmVyZWRfYnlfb3RoZXJzID09IDApIHsKKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwkJCQkJCXBpYy0+bW11X2FsbG9jX2ZsYWcgPSAwOworCQkJCQkJLypyZWxlYXNlX2J1ZmZlcl80aygKKwkJCQkJCWRlYy0+YXZzMl9kZWMuZnJlZltpaV0tPmluZGV4KTsqLworCQkJCQkJZGVjb2Rlcl9tbXVfYm94X2ZyZWVfaWR4KGRlYy0+bW11X2JveCwKKwkJCQkJCQlwaWMtPmluZGV4KTsKKyNlbmRpZgorI2lmbmRlZiBNVl9VU0VfRklYRURfQlVGCisJCQkJCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWVfaWR4KAorCQkJCQkJCWRlYy0+Ym1tdV9ib3gsCisJCQkJCQkJTVZfQlVGRkVSX0lEWChwaWMtPmluZGV4KSk7CisJCQkJCQlwaWMtPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIgPSAwOworI2VuZGlmCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZiAoKGRlY19zdGF0dXMgPT0gQVZTMl9IRUFEX1BJQ19JX1JFQURZKQorCQl8fCAoZGVjX3N0YXR1cyA9PSBBVlMyX0hFQURfUElDX1BCX1JFQURZKSkgeworCQlQUklOVF9MSU5FKCk7CisKKwkJaWYgKGRlYnVnICYgQVZTMl9EQkdfU0VORF9QQVJBTV9XSVRIX1JFRykgeworCQkJZ2V0X3JwbV9wYXJhbSgKKwkJCQkmZGVjLT5hdnMyX2RlYy5wYXJhbSk7CisJCX0gZWxzZSB7CisKKwkJCWZvciAoaSA9IDA7IGkgPCAoUlBNX0VORCAtIFJQTV9CRUdJTik7IGkgKz0gNCkgeworCQkJCWludCBpaTsKKwkJCQlmb3IgKGlpID0gMDsgaWkgPCA0OyBpaSsrKQorCQkJCQlkZWMtPmF2czJfZGVjLnBhcmFtLmwuZGF0YVtpICsgaWldID0KKwkJCQkJCWRlYy0+cnBtX3B0cltpICsgMyAtIGlpXTsKKwkJCSAgIH0KKwkJfQorI2lmZGVmIFNBTklUWV9DSEVDSworCQlpZiAoZGVjLT5hdnMyX2RlYy5wYXJhbS5wLm51bV9vZl9yZWZfY3VyID4KKwkJCWRlYy0+YXZzMl9kZWMucmVmX21heGJ1ZmZlcikgeworCQkJcHJfaW5mbygiV2FybmluZzogV3JvbmcgbnVtX29mX3JlZl9jdXIgJWQsIGZvcmNlIHRvICVkXG4iLAorCQkJCWRlYy0+YXZzMl9kZWMucGFyYW0ucC5udW1fb2ZfcmVmX2N1ciwKKwkJCQlkZWMtPmF2czJfZGVjLnJlZl9tYXhidWZmZXIpOworCQkJZGVjLT5hdnMyX2RlYy5wYXJhbS5wLm51bV9vZl9yZWZfY3VyID0KKwkJCQlkZWMtPmF2czJfZGVjLnJlZl9tYXhidWZmZXI7CisJCX0KKyNlbmRpZgorCQlQUklOVF9MSU5FKCk7CisKKwkJZGVidWdfYnVmZmVyX21ncl9tb3JlKGRlYyk7CisJCWdldF9mcmFtZV9yYXRlKCZkZWMtPmF2czJfZGVjLnBhcmFtLCBkZWMpOworCisjaWYgMSAvLyBUaGUgdmlkZW9fc2lnbmFsX3R5cGUgaXMgdHlwZSBvZiB1aW50MTZfdCBhbmQgcmVzdWx0IGZhbHNlLCBzbyBjb21tZW50IGl0IG91dC4KKwkJaWYgKGRlYy0+YXZzMl9kZWMucGFyYW0ucC52aWRlb19zaWduYWxfdHlwZQorCQkJCSYgKDE8PDMwKSkgeworCQkJdW5pb24gcGFyYW1fdSAqcFBhcmE7CisKKwkJCWF2czJfcHJpbnQoZGVjLCAwLAorCQkJCQkiYXZzMiBIRFIgbWV0YSBkYXRhIHByZXNlbnRcbiIpOworCQkJcFBhcmEgPSAmZGVjLT5hdnMyX2RlYy5wYXJhbTsKKworCQkJLypjbGVhbiB0aGlzIGZsYWcqLworCQkJcFBhcmEtPnAudmlkZW9fc2lnbmFsX3R5cGUKKwkJCQkmPSB+KDE8PDMwKTsKKworCQkJZGVjLT52Zl9kcC5wcmVzZW50X2ZsYWcgPSAxOworCisJCQlkZWMtPnZmX2RwLndoaXRlX3BvaW50WzBdCisJCQkJPSBwUGFyYS0+cC53aGl0ZV9wb2ludF94OworCQkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0hEUl9JTkZPLAorCQkJCSJ3aGl0ZV9wb2ludFswXToweCV4XG4iLAorCQkJCWRlYy0+dmZfZHAud2hpdGVfcG9pbnRbMF0pOworCisJCQlkZWMtPnZmX2RwLndoaXRlX3BvaW50WzFdCisJCQkJPSBwUGFyYS0+cC53aGl0ZV9wb2ludF95OworCQkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0hEUl9JTkZPLAorCQkJCSJ3aGl0ZV9wb2ludFsxXToweCV4XG4iLAorCQkJCWRlYy0+dmZfZHAud2hpdGVfcG9pbnRbMV0pOworCisJCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQkJZGVjLT52Zl9kcC5wcmltYXJpZXNbaV1bMF0KKwkJCQkJPSBwUGFyYS0+cC5kaXNwbGF5X3ByaW1hcmllc194W2ldOworCQkJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19IRFJfSU5GTywKKwkJCQkJInByaW1hcmllc1slZF1bMF06MHgleFxuIiwKKwkJCQkJaSwKKwkJCQkJZGVjLT52Zl9kcC5wcmltYXJpZXNbaV1bMF0pOworCQkJfQorCisJCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQkJZGVjLT52Zl9kcC5wcmltYXJpZXNbaV1bMV0KKwkJCQkJPSBwUGFyYS0+cC5kaXNwbGF5X3ByaW1hcmllc195W2ldOworCQkJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19IRFJfSU5GTywKKwkJCQkJInByaW1hcmllc1slZF1bMV06MHgleFxuIiwKKwkJCQkJaSwKKwkJCQkJZGVjLT52Zl9kcC5wcmltYXJpZXNbaV1bMV0pOworCQkJfQorCisJCQlkZWMtPnZmX2RwLmx1bWluYW5jZVswXQorCQkJCT0gcFBhcmEtPnAubWF4X2Rpc3BsYXlfbWFzdGVyaW5nX2x1bWluYW5jZTsKKwkJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19IRFJfSU5GTywKKwkJCQkibHVtaW5hbmNlWzBdOjB4JXhcbiIsCisJCQkJZGVjLT52Zl9kcC5sdW1pbmFuY2VbMF0pOworCisJCQlkZWMtPnZmX2RwLmx1bWluYW5jZVsxXQorCQkJCT0gcFBhcmEtPnAubWluX2Rpc3BsYXlfbWFzdGVyaW5nX2x1bWluYW5jZTsKKwkJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19IRFJfSU5GTywKKwkJCQkibHVtaW5hbmNlWzFdOjB4JXhcbiIsCisJCQkJZGVjLT52Zl9kcC5sdW1pbmFuY2VbMV0pOworCisKKwkJCWRlYy0+dmZfZHAuY29udGVudF9saWdodF9sZXZlbC5wcmVzZW50X2ZsYWcKKwkJCQk9IDE7CisJCQlkZWMtPnZmX2RwLmNvbnRlbnRfbGlnaHRfbGV2ZWwubWF4X2NvbnRlbnQKKwkJCQk9IHBQYXJhLT5wLm1heF9jb250ZW50X2xpZ2h0X2xldmVsOworCQkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0hEUl9JTkZPLAorCQkJCSJtYXhfY29udGVudDoweCV4XG4iLAorCQkJCWRlYy0+dmZfZHAuY29udGVudF9saWdodF9sZXZlbC5tYXhfY29udGVudCk7CisKKwkJCWRlYy0+dmZfZHAuY29udGVudF9saWdodF9sZXZlbC5tYXhfcGljX2F2ZXJhZ2UKKwkJCQk9IHBQYXJhLT5wLm1heF9waWN0dXJlX2F2ZXJhZ2VfbGlnaHRfbGV2ZWw7CisKKwkJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19IRFJfSU5GTywKKwkJCQkibWF4X3BpY19hdmVyYWdlOjB4JXhcbiIsCisJCQkJZGVjLT52Zl9kcC5jb250ZW50X2xpZ2h0X2xldmVsLm1heF9waWNfYXZlcmFnZSk7CisJCX0KKyNlbmRpZgorCisKKwkJaWYgKGRlYy0+dmlkZW9fb3JpX3NpZ25hbF90eXBlICE9CisJCQkoKGRlYy0+YXZzMl9kZWMucGFyYW0ucC52aWRlb19zaWduYWxfdHlwZSA8PCAxNikKKwkJCXwgZGVjLT5hdnMyX2RlYy5wYXJhbS5wLmNvbG9yX2Rlc2NyaXB0aW9uKSkgeworCQkJdTMyIHYgPSBkZWMtPmF2czJfZGVjLnBhcmFtLnAudmlkZW9fc2lnbmFsX3R5cGU7CisJCQl1MzIgYyA9IGRlYy0+YXZzMl9kZWMucGFyYW0ucC5jb2xvcl9kZXNjcmlwdGlvbjsKKwkJCXUzMiBjb252ZXJ0X2MgPSBjOworCisJCQlpZiAodiAmIDB4MjAwMCkgeworCQkJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19IRFJfSU5GTywKKwkJCQkJInZpZGVvX3NpZ25hbF90eXBlIHByZXNlbnQ6XG4iKTsKKwkJCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfSERSX0lORk8sCisJCQkJCSIgJXMgJXNcbiIsCisJCQkJCXZpZGVvX2Zvcm1hdF9uYW1lc1sodiA+PiAxMCkgJiA3XSwKKwkJCQkJKCh2ID4+IDkpICYgMSkgPworCQkJCQkJImZ1bGxfcmFuZ2UiIDogImxpbWl0ZWQiKTsKKwkJCQlpZiAodiAmIDB4MTAwKSB7CisJCQkJCXUzMiB0cmFuc2ZlcjsKKwkJCQkJdTMyIG1heHRyaXg7CisKKwkJCQkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0hEUl9JTkZPLAorCQkJCQkJImNvbG9yX2Rlc2NyaXB0aW9uIHByZXNlbnQ6XG4iKTsKKwkJCQkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0hEUl9JTkZPLAorCQkJCQkJImNvbG9yX3ByaW1hcmllID0gJWRcbiIsCisJCQkJCQl2ICYgMHhmZik7CisJCQkJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19IRFJfSU5GTywKKwkJCQkJCSJ0cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpYyA9ICVkXG4iLAorCQkJCQkJKGMgPj4gOCkgJiAweGZmKTsKKwkJCQkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0hEUl9JTkZPLAorCQkJCQkJIiAgbWF0cml4X2NvZWZmaWNpZW50ID0gJWRcbiIsCisJCQkJCQljICYgMHhmZik7CisKKwkJCQkJdHJhbnNmZXIgPSAoYyA+PiA4KSAmIDB4RkY7CisJCQkJCWlmICh0cmFuc2ZlciA+PSAxNSkKKwkJCQkJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19IRFJfSU5GTywKKwkJCQkJCQkidW5zdXBwb3J0IHRyYW5zZmVyX2NoYXJhY3RlcmlzdGljXG4iKTsKKwkJCQkJZWxzZSBpZiAodHJhbnNmZXIgID09IDE0KQorCQkJCQkJdHJhbnNmZXIgPSAxODsgLyogSExHICovCisJCQkJCWVsc2UgaWYgKHRyYW5zZmVyID09IDEzKQorCQkJCQkJdHJhbnNmZXIgPSAzMjsKKwkJCQkJZWxzZSBpZiAodHJhbnNmZXIgPT0gMTIpCisJCQkJCQl0cmFuc2ZlciA9IDE2OworCQkJCQllbHNlIGlmICh0cmFuc2ZlciA9PSAxMSkKKwkJCQkJCXRyYW5zZmVyID0gMTU7CisKKwkJCQkJbWF4dHJpeCA9IGMgJiAweEZGOworCQkJCQlpZiAobWF4dHJpeCA+PSAxMCkKKwkJCQkJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19IRFJfSU5GTywKKwkJCQkJCQkidW5zdXBwb3J0IG1hdHJpeF9jb2VmZmljaWVudFxuIik7CisJCQkJCWVsc2UgaWYgKG1heHRyaXggPT0gOSkKKwkJCQkJCW1heHRyaXggPSAxMDsKKwkJCQkJZWxzZSBpZiAobWF4dHJpeCA9PSA4KQorCQkJCQkJbWF4dHJpeCA9IDk7CisKKwkJCQkJY29udmVydF9jID0gKHRyYW5zZmVyIDw8IDgpIHwgKG1heHRyaXgpOworCisJCQkJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19IRFJfSU5GTywKKwkJCQkJCSIgY29udmVyZWQgYzoweCV4XG4iLAorCQkJCQkJY29udmVydF9jKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChlbmFibGVfZm9yY2VfdmlkZW9fc2lnbmFsX3R5cGUpCisJCQkJZGVjLT52aWRlb19zaWduYWxfdHlwZQorCQkJCQk9IGZvcmNlX3ZpZGVvX3NpZ25hbF90eXBlOworCQkJZWxzZSB7CisJCQkJZGVjLT52aWRlb19zaWduYWxfdHlwZQorCQkJCQk9ICh2IDw8IDE2KSB8IGNvbnZlcnRfYzsKKworCQkJCWRlYy0+dmlkZW9fb3JpX3NpZ25hbF90eXBlCisJCQkJCT0gKHYgPDwgMTYpIHwgYzsKKwkJCX0KKworCQkJdmlkZW9fc2lnbmFsX3R5cGUgPSBkZWMtPnZpZGVvX3NpZ25hbF90eXBlOworCQl9CisJfQorI2lmIDAKKwlpZiAoKGRlYnVnX2FnYWluICYgMHg0KSAmJgorCQlkZWMtPnByb2Nlc3Nfc3RhdGUgPT0KKwkJUFJPQ19TVEFURV9JTklUKSB7CisJCWlmIChzdGFydF9jb2RlID09IFBCX1BJQ1RVUkVfU1RBUlRfQ09ERSkgeworCQkJZGVjLT5wcm9jZXNzX3N0YXRlID0gUFJPQ19TVEFURV9URVNUMTsKKwkJCWRlY19hZ2Fpbl9wcm9jZXNzKGRlYyk7CisJCQlnb3RvIGlycV9oYW5kbGVkX2V4aXQ7CisJCX0KKwl9CisjZW5kaWYKKwlQUklOVF9MSU5FKCk7CisJYXZzMl9wcmVwYXJlX2hlYWRlcigmZGVjLT5hdnMyX2RlYywgc3RhcnRfY29kZSk7CisKKwlpZiAoc3RhcnRfY29kZSA9PSBTRVFVRU5DRV9IRUFERVJfQ09ERSB8fAorCQlzdGFydF9jb2RlID09IFZJREVPX0VESVRfQ09ERSB8fAorCQlzdGFydF9jb2RlID09IFNFUVVFTkNFX0VORF9DT0RFKSB7CisJCWlmIChkZWMtPm1faW5zX2ZsYWcgJiYKKwkJCXZkZWNfZnJhbWVfYmFzZWQoaHdfdG9fdmRlYyhkZWMpKSkKKwkJCWRlYy0+c3RhcnRfZGVjb2RpbmdfZmxhZyB8PSAweDE7CisJCWRlYy0+cHJvY2Vzc19zdGF0ZSA9IFBST0NfU1RBVEVfSEVBRF9ET05FOworCQlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIEFWUzJfQUNUSU9OX0RPTkUpOworCX0gZWxzZSBpZiAoc3RhcnRfY29kZSA9PSBJX1BJQ1RVUkVfU1RBUlRfQ09ERSB8fAorCQlzdGFydF9jb2RlID09IFBCX1BJQ1RVUkVfU1RBUlRfQ09ERSkgeworCQlyZXQgPSAwOworCQlpZiAoZGVjLT5waWNfbGlzdF9pbml0X2ZsYWcgPT0gMCkgeworCQkJaW50MzJfdCBsY3Vfc2l6ZV9sb2cyID0KKwkJCQlsb2cyaShkZWMtPmF2czJfZGVjLnBhcmFtLnAubGN1X3NpemUpOworCisJCQlhdnMyX2luaXRfZ2xvYmFsX2J1ZmZlcnMoJmRlYy0+YXZzMl9kZWMpOworCQkJCS8qYXZzMl9kZWMtPm1fYmctPmluZGV4IGlzCisJCQkJc2V0IHRvIGRlYy0+dXNlZF9idWZfbnVtIC0gMSovCisJCQlpbml0X3BpY19saXN0KGRlYywgbGN1X3NpemVfbG9nMik7CisJCQlpbml0X3BpY19saXN0X2h3KGRlYyk7CisJCX0KKwkJcmV0ID0gYXZzMl9wcm9jZXNzX2hlYWRlcigmZGVjLT5hdnMyX2RlYyk7CisJCWlmICghZGVjLT5tX2luc19mbGFnKQorCQkJZGVjLT5zbGljZV9pZHgrKzsKKworCQlpZiAoZGVjLT5tX2luc19mbGFnICYmIHJldAorCQkJJiYgZGVjLT5hdnMyX2RlYy5oYy5jdXJfcGljLT5jdXZhX2RhdGFfYnVmICE9IE5VTEwpCisJCQlyZWxlYXNlX2N1dmFfZGF0YShkZWMtPmF2czJfZGVjLmhjLmN1cl9waWMpOworCisJCVBSSU5UX0xJTkUoKTsKKyNpZmRlZiBJX09OTFlfU1VQUE9SVAorCQlpZiAoKHN0YXJ0X2NvZGUgPT0gUEJfUElDVFVSRV9TVEFSVF9DT0RFKSAmJgorCQkJKGRlYy0+aV9vbmx5ICYgMHgyKSkKKwkJCXJldCA9IC0yOworI2VuZGlmCisKKwkJaWYgKHJldCA+PSAwKSB7CisjaWZkZWYgQVZTMl8xMEJfTU1VCisJCQlpZiAoZGVjLT5tbXVfZW5hYmxlKSB7CisJCQkJcmV0ID0gYXZzMl9hbGxvY19tbXUoZGVjLAorCQkJCQlkZWMtPmF2czJfZGVjLmhjLmN1cl9waWMtPmluZGV4LAorCQkJCQlkZWMtPmF2czJfZGVjLmltZy53aWR0aCwKKwkJCQkJZGVjLT5hdnMyX2RlYy5pbWcuaGVpZ2h0LAorCQkJCQlkZWMtPmF2czJfZGVjLmlucHV0LnNhbXBsZV9iaXRfZGVwdGgsCisJCQkJCWRlYy0+ZnJhbWVfbW11X21hcF9hZGRyKTsKKwkJCQlpZiAocmV0ID49IDApIHsKKwkJCQkJZGVjLT5jdXJfZmJfaWR4X21tdSA9CisJCQkJCQlkZWMtPmF2czJfZGVjLmhjLmN1cl9waWMtPmluZGV4OworCQkJCQlkZWMtPmF2czJfZGVjLmhjLmN1cl9waWMtPm1tdV9hbGxvY19mbGFnID0gMTsKKwkJCQl9IGVsc2UKKwkJCQkJcHJfZXJyKCJjYW4ndCBhbGxvYyBuZWVkIG1tdTEsaWR4ICVkIHJldCA9JWRcbiIsCisJCQkJCQlkZWMtPmF2czJfZGVjLmhjLmN1cl9waWMtPmluZGV4LAorCQkJCQkJcmV0KTsKKwkJCX0KKyNlbmRpZgorI2lmZGVmIEFWUzJfMTBCX01NVV9EVworCQkJaWYgKGRlYy0+ZHdfbW11X2VuYWJsZSkgeworCQkJCXJldCA9IGF2czJfYWxsb2NfZHdfbW11KGRlYywKKwkJCQkJZGVjLT5hdnMyX2RlYy5oYy5jdXJfcGljLT5pbmRleCwKKwkJCQkJZGVjLT5hdnMyX2RlYy5pbWcud2lkdGgsCisJCQkJCWRlYy0+YXZzMl9kZWMuaW1nLmhlaWdodCwKKwkJCQkJZGVjLT5hdnMyX2RlYy5pbnB1dC5zYW1wbGVfYml0X2RlcHRoLAorCQkJCQlkZWMtPmR3X2ZyYW1lX21tdV9tYXBfYWRkcik7CisJCQkJaWYgKHJldCA+PSAwKSB7CisJCQkJCWRlYy0+Y3VyX2ZiX2lkeF9tbXUgPQorCQkJCQkJZGVjLT5hdnMyX2RlYy5oYy5jdXJfcGljLT5pbmRleDsKKwkJCQkJZGVjLT5hdnMyX2RlYy5oYy5jdXJfcGljLT5tbXVfYWxsb2NfZmxhZyA9IDE7CisJCQkJfSBlbHNlCisJCQkJCXByX2VycigiY2FuJ3QgYWxsb2MgbmVlZCBkdyBtbXUxLGlkeCAlZCByZXQgPSVkXG4iLAorCQkJCQkJZGVjLT5hdnMyX2RlYy5oYy5jdXJfcGljLT5pbmRleCwKKwkJCQkJCXJldCk7CisJCQl9CisjZW5kaWYKKwkJfQorCisjaWZuZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwkJaWYgKHJldCA+PSAwICYmIGRlYy0+YXZzMl9kZWMuaGMuY3VyX3BpYy0+CisJCQltcHJlZF9tdl93cl9zdGFydF9hZGRyID09IDApIHsKKwkJCXVuc2lnbmVkIGxvbmcgYnVmX2FkZHI7CisJCQl1bnNpZ25lZCBtdl9idWZfc2l6ZSA9IGdldF9tdl9idWZfc2l6ZSgKKwkJCQlkZWMsCisJCQkJZGVjLT5hdnMyX2RlYy5oYy5jdXJfcGljLT5waWNfdywKKwkJCQlkZWMtPmF2czJfZGVjLmhjLmN1cl9waWMtPnBpY19oKTsKKwkJCWludCBpID0gZGVjLT5hdnMyX2RlYy5oYy5jdXJfcGljLT5pbmRleDsKKwkJCS8qaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKQorCQkJCW12X2J1Zl9zaXplID0gMHgxMjAwMDAgKiA0OyovCisJCQlpZiAoZGVjb2Rlcl9ibW11X2JveF9hbGxvY19idWZfcGh5CisJCQkoZGVjLT5ibW11X2JveCwKKwkJCU1WX0JVRkZFUl9JRFgoaSksCisJCQltdl9idWZfc2l6ZSwKKwkJCURSSVZFUl9OQU1FLAorCQkJJmJ1Zl9hZGRyKSA8IDApCisJCQkJcmV0ID0gLTE7CisJCQllbHNlCisJCQkJZGVjLT5hdnMyX2RlYy5oYy5jdXJfcGljLT4KKwkJCQltcHJlZF9tdl93cl9zdGFydF9hZGRyCisJCQkJPSBidWZfYWRkcjsKKwkJfQorI2VuZGlmCisJCWlmIChyZXQgPCAwKSB7CisJCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSLAorCQkJCSJhdnMyX2J1Zm1ncl9wcm9jZXNzPT4gJWQsIEFWUzJfMTBCX0RJU0NBUkRfTkFMXHJcbiIsCisJCQkgcmV0KTsKKwkJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgQVZTMl8xMEJfRElTQ0FSRF9OQUwpOworCSNpZmRlZiBBVlMyXzEwQl9NTVUKKwkJCWlmIChkZWMtPm1tdV9lbmFibGUpCisJCQkJYXZzMl9yZWN5Y2xlX21tdV9idWYoZGVjKTsKKwkjZW5kaWYKKwkJCWlmIChkZWMtPm1faW5zX2ZsYWcpIHsKKwkJCQlkZWMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJCQkJYW1oZXZjX3N0b3AoKTsKKwkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmRlYy0+d29yayk7CisJCQl9CisKKwkJCWdvdG8gaXJxX2hhbmRsZWRfZXhpdDsKKwkJfSBlbHNlIHsKKwkJCVBSSU5UX0xJTkUoKTsKKwkJCWRlYy0+YXZzMl9kZWMuaGMuY3VyX3BpYy0+c3RyZWFtX29mZnNldCA9CisJCQlSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKTsKKwkJCS8qCisJCQlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqY3VyX3BpYworCQkJCT0gJmNtLT5jdXJfZnJhbWUtPmJ1ZjsKKwkJCWN1cl9waWMtPmRlY29kZV9pZHggPSBkZWMtPmZyYW1lX2NvdW50OworCQkJKi8KKwkJCWlmICghZGVjLT5tX2luc19mbGFnKSB7CisJCQkJZGVjLT5mcmFtZV9jb3VudCsrOworCQkJCWRlY29kZV9mcmFtZV9jb3VudFtkZWMtPmluZGV4XQorCQkJCQk9IGRlYy0+ZnJhbWVfY291bnQ7CisJCQl9CisJCQkvKk1VTFRJX0lOU1RBTkNFX1NVUFBPUlQqLworCQkJaWYgKGRlYy0+Y2h1bmspIHsKKwkJCQlkZWMtPmF2czJfZGVjLmhjLmN1cl9waWMtPnB0cyA9CisJCQkJZGVjLT5jaHVuay0+cHRzOworCQkJCWRlYy0+YXZzMl9kZWMuaGMuY3VyX3BpYy0+cHRzNjQgPQorCQkJCWRlYy0+Y2h1bmstPnB0czY0OworCQkJfQorCQkJLyoqLworCQkJZGVjLT5hdnMyX2RlYy5oYy5jdXJfcGljLT5iaXRfZGVwdGgKKwkJCQk9IGRlYy0+YXZzMl9kZWMuaW5wdXQuc2FtcGxlX2JpdF9kZXB0aDsKKwkJCWRlYy0+YXZzMl9kZWMuaGMuY3VyX3BpYy0+ZG91YmxlX3dyaXRlX21vZGUKKwkJCQk9IGdldF9kb3VibGVfd3JpdGVfbW9kZShkZWMpOworZGVjb2RlX3NsaWNlOgorCQkJUFJJTlRfTElORSgpOworCisJCQljb25maWdfbWNfYnVmZmVyKGRlYyk7CisJCQljb25maWdfbWNyY2NfYXhpX2h3KGRlYyk7CisJCQljb25maWdfbXByZWRfaHcoZGVjKTsKKwkJCWNvbmZpZ19kYmxrX2h3KGRlYyk7CisJCQljb25maWdfc2FvX2h3KGRlYyk7CisJCQljb25maWdfYWxmX2h3KGRlYyk7CisJCQljb25maWdfb3RoZXJfaHcoZGVjKTsKKworCQkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUl9NT1JFLAorCQkJCSI9PmZyZWYwIGltZ3RyX2Z3UmVmRGlzdGFuY2UgJWQsIGZyZWYxIGltZ3RyX2Z3UmVmRGlzdGFuY2UgJWQsIGRpczIvZGlzMy9kaXM0ICVkICVkICVkICBpbWctPnRyICVkXG4iLAorCQkJICAgIGRlYy0+YXZzMl9kZWMuZnJlZlswXS0+aW1ndHJfZndSZWZEaXN0YW5jZSwKKwkJCSAgICBkZWMtPmF2czJfZGVjLmZyZWZbMV0tPmltZ3RyX2Z3UmVmRGlzdGFuY2UsCisJCQlkZWMtPmF2czJfZGVjLmZyZWZbMl0tPmltZ3RyX2Z3UmVmRGlzdGFuY2UsCisJCQlkZWMtPmF2czJfZGVjLmZyZWZbM10tPmltZ3RyX2Z3UmVmRGlzdGFuY2UsCisJCQlkZWMtPmF2czJfZGVjLmZyZWZbNF0tPmltZ3RyX2Z3UmVmRGlzdGFuY2UsCisJCQlkZWMtPmF2czJfZGVjLmltZy50cik7CisKKwkJCWlmICgoZGVidWdfYWdhaW4gJiAweDIpICYmCisJCQkJZGVjLT5wcm9jZXNzX3N0YXRlID09CisJCQkJUFJPQ19TVEFURV9JTklUKSB7CisJCQkJZGVjLT5wcm9jZXNzX3N0YXRlID0gUFJPQ19TVEFURV9ERUNPRElORzsKKwkJCQlkZWNfYWdhaW5fcHJvY2VzcyhkZWMpOworCQkJCWdvdG8gaXJxX2hhbmRsZWRfZXhpdDsKKwkJCX0KKworCQkJZGVjLT5wcm9jZXNzX3N0YXRlID0gUFJPQ19TVEFURV9ERUNPRElORzsKKworCQkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCBBVlMyX0FDVElPTl9ET05FKTsKKworCQl9CisKKwkJaWYgKGRlYy0+bV9pbnNfZmxhZykKKwkJCXN0YXJ0X3Byb2Nlc3NfdGltZShkZWMpOworCX0KK2lycV9oYW5kbGVkX2V4aXQ6CisJUFJJTlRfTElORSgpOworCWRlYy0+cHJvY2Vzc19idXN5ID0gMDsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB2YXZzMl9pc3IoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgZGVjX3N0YXR1czsKKwlzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjID0gKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICopZGF0YTsKKwl1aW50IGRlYnVnX3RhZzsKKworCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTUJPWDBfQ0xSX1JFRywgMSk7CisKKwlkZWNfc3RhdHVzID0gUkVBRF9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcpOworCisJaWYgKCFkZWMpCisJCXJldHVybiBJUlFfSEFORExFRDsKKwlpZiAoZGVjLT5pbml0X2ZsYWcgPT0gMCkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCWlmIChkZWMtPnByb2Nlc3NfYnVzeSkvKm9uIHByb2Nlc3MuKi8KKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCWRlYy0+ZGVjX3N0YXR1cyA9IGRlY19zdGF0dXM7CisJZGVjLT5wcm9jZXNzX2J1c3kgPSAxOworCWlmIChkZWJ1ZyAmIEFWUzJfREJHX0lSUV9FVkVOVCkKKwkJYXZzMl9wcmludChkZWMsIDAsCisJCQkiYXZzMiBpc3IgZGVjIHN0YXR1cyAgPSAweCV4LCBsY3UgMHgleCBzaGlmdGJ5dGUgMHgleCAoJXggJXggbGV2ICV4LCB3ciAleCwgcmQgJXgpXG4iLAorCQkJZGVjX3N0YXR1cywgUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0xDVV9TVEFSVCksCisJCQlSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9TVEFSVF9BRERSKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9FTkRfQUREUiksCisJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fTEVWRUwpLAorCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1dSX1BUUiksCisJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSKQorCQkpOworCisJZGVidWdfdGFnID0gUkVBRF9IUkVHKERFQlVHX1JFRzEpOworCWlmIChkZWJ1Z190YWcgJiAweDEwMDAwKSB7CisJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KAorCQkJYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJZGVjLT5sbWVtX3BoeV9hZGRyLAorCQkJTE1FTV9CVUZfU0laRSwKKwkJCURNQV9GUk9NX0RFVklDRSk7CisKKwkJcHJfaW5mbygiTE1FTTx0YWcgJXg+OlxuIiwgUkVBRF9IUkVHKERFQlVHX1JFRzEpKTsKKwkJZm9yIChpID0gMDsgaSA8IDB4NDAwOyBpICs9IDQpIHsKKwkJCWludCBpaTsKKwkJCWlmICgoaSAmIDB4ZikgPT0gMCkKKwkJCQlwcl9pbmZvKCIlMDN4OiAiLCBpKTsKKwkJCWZvciAoaWkgPSAwOyBpaSA8IDQ7IGlpKyspIHsKKwkJCQlwcl9pbmZvKCIlMDR4ICIsCisJCQkJCSAgIGRlYy0+bG1lbV9wdHJbaSArIDMgLSBpaV0pOworCQkJfQorCQkJaWYgKCgoaSArIGlpKSAmIDB4ZikgPT0gMCkKKwkJCQlwcl9pbmZvKCJcbiIpOworCQl9CisKKwkJaWYgKCgodWRlYnVnX3BhdXNlX3BvcyAmIDB4ZmZmZikKKwkJCT09IChkZWJ1Z190YWcgJiAweGZmZmYpKSAmJgorCQkJKHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4ID09IDAgfHwKKwkJCXVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4ID09IGRlYy0+ZGVjb2RlX2lkeCkgJiYKKwkJCSh1ZGVidWdfcGF1c2VfdmFsID09IDAgfHwKKwkJCXVkZWJ1Z19wYXVzZV92YWwgPT0gUkVBRF9IUkVHKERFQlVHX1JFRzIpKSkgeworCQkJdWRlYnVnX3BhdXNlX3BvcyAmPSAweGZmZmY7CisJCQlkZWMtPnVjb2RlX3BhdXNlX3BvcyA9IHVkZWJ1Z19wYXVzZV9wb3M7CisJCX0gZWxzZSBpZiAoZGVidWdfdGFnICYgMHgyMDAwMCkKKwkJCWRlYy0+dWNvZGVfcGF1c2VfcG9zID0gMHhmZmZmZmZmZjsKKwkJaWYgKGRlYy0+dWNvZGVfcGF1c2VfcG9zKQorCQkJcmVzZXRfcHJvY2Vzc190aW1lKGRlYyk7CisJCWVsc2UKKwkJCVdSSVRFX0hSRUcoREVCVUdfUkVHMSwgMCk7CisJfSBlbHNlIGlmIChkZWJ1Z190YWcgIT0gMCkgeworCQlwcl9pbmZvKAorCQkJImRiZyV4OiAleCBsY3UgJXhcbiIsIFJFQURfSFJFRyhERUJVR19SRUcxKSwKKwkJCSAgIFJFQURfSFJFRyhERUJVR19SRUcyKSwKKwkJCSAgIFJFQURfVlJFRyhIRVZDX1BBUlNFUl9MQ1VfU1RBUlQpKTsKKwkJaWYgKCgodWRlYnVnX3BhdXNlX3BvcyAmIDB4ZmZmZikKKwkJCT09IChkZWJ1Z190YWcgJiAweGZmZmYpKSAmJgorCQkJKHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4ID09IDAgfHwKKwkJCXVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4ID09IGRlYy0+ZGVjb2RlX2lkeCkgJiYKKwkJCSh1ZGVidWdfcGF1c2VfdmFsID09IDAgfHwKKwkJCXVkZWJ1Z19wYXVzZV92YWwgPT0gUkVBRF9IUkVHKERFQlVHX1JFRzIpKSkgeworCQkJdWRlYnVnX3BhdXNlX3BvcyAmPSAweGZmZmY7CisJCQlkZWMtPnVjb2RlX3BhdXNlX3BvcyA9IHVkZWJ1Z19wYXVzZV9wb3M7CisJCX0KKwkJaWYgKGRlYy0+dWNvZGVfcGF1c2VfcG9zKQorCQkJcmVzZXRfcHJvY2Vzc190aW1lKGRlYyk7CisJCWVsc2UKKwkJCVdSSVRFX0hSRUcoREVCVUdfUkVHMSwgMCk7CisJCWRlYy0+cHJvY2Vzc19idXN5ID0gMDsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWlmICghZGVjLT5tX2luc19mbGFnKSB7CisJCWlmIChkZWMtPmVycm9yX2ZsYWcgPT0gMSkgeworCQkJZGVjLT5lcnJvcl9mbGFnID0gMjsKKwkJCWRlYy0+cHJvY2Vzc19idXN5ID0gMDsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfSBlbHNlIGlmIChkZWMtPmVycm9yX2ZsYWcgPT0gMykgeworCQkJZGVjLT5wcm9jZXNzX2J1c3kgPSAwOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisKKwkJaWYgKChkZWMtPnBpY19saXN0X2luaXRfZmxhZykgJiYKKwkJCWdldF9mcmVlX2J1Zl9jb3VudChkZWMpIDw9IDApIHsKKwkJCS8qCisJCQlpZiAoZGVjLT53YWl0X2J1ZiA9PSAwKQorCQkJCXByX2luZm8oInNldCB3YWl0X2J1ZiB0byAxXHJcbiIpOworCQkJKi8KKwkJCWRlYy0+d2FpdF9idWYgPSAxOworCQkJZGVjLT5wcm9jZXNzX2J1c3kgPSAwOworCQkJaWYgKGRlYnVnICYgQVZTMl9EQkdfSVJRX0VWRU5UKQorCQkJCWF2czJfcHJpbnQoZGVjLCAwLCAid2FpdF9idWZcbiIpOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9IGVsc2UgaWYgKGZvcmNlX2Rpc3BfcGljX2luZGV4KSB7CisJCQlkZWMtPnByb2Nlc3NfYnVzeSA9IDA7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKwl9CisJcmV0dXJuIElSUV9XQUtFX1RIUkVBRDsKK30KKworc3RhdGljIHZvaWQgdmF2czJfcHV0X3RpbWVyX2Z1bmMoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworCXN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMgPSBjb250YWluZXJfb2YodGltZXIsCisJCXN0cnVjdCBBVlMyRGVjb2Rlcl9zLCB0aW1lcik7CisJdWludDhfdCBlbXB0eV9mbGFnOworCXVuc2lnbmVkIGludCBidWZfbGV2ZWw7CisKKwllbnVtIHJlY2V2aXZlcl9zdGFydF9lIHN0YXRlID0gUkVDRUlWRVJfSU5BQ1RJVkU7CisJaWYgKGRlYy0+bV9pbnNfZmxhZykgeworCQlpZiAoaHdfdG9fdmRlYyhkZWMpLT5uZXh0X3N0YXR1cworCQkJPT0gVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEKSB7CisJCQlkZWMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0ZPUkNFX0VYSVQ7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmRlYy0+d29yayk7CisJCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSLAorCQkJCSJ2ZGVjIHJlcXVlc3RlZCB0byBiZSBkaXNjb25uZWN0ZWRcbiIpOworCQkJcmV0dXJuOworCQl9CisJfQorCWlmIChkZWMtPmluaXRfZmxhZyA9PSAwKSB7CisJCWlmIChkZWMtPnN0YXQgJiBTVEFUX1RJTUVSX0FSTSkgeworCQkJdGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgUFVUX0lOVEVSVkFMOworCQkJYWRkX3RpbWVyKCZkZWMtPnRpbWVyKTsKKwkJfQorCQlyZXR1cm47CisJfQorCWlmIChkZWMtPm1faW5zX2ZsYWcgPT0gMCkgeworCQlpZiAodmZfZ2V0X3JlY2VpdmVyKGRlYy0+cHJvdmlkZXJfbmFtZSkpIHsKKwkJCXN0YXRlID0KKwkJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoZGVjLT5wcm92aWRlcl9uYW1lLAorCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfUVVSRVlfU1RBVEUsCisJCQkJCU5VTEwpOworCQkJaWYgKChzdGF0ZSA9PSBSRUNFSVZFUl9TVEFURV9OVUxMKQorCQkJCXx8IChzdGF0ZSA9PSBSRUNFSVZFUl9TVEFURV9OT05FKSkKKwkJCQlzdGF0ZSA9IFJFQ0VJVkVSX0lOQUNUSVZFOworCQl9IGVsc2UKKwkJCXN0YXRlID0gUkVDRUlWRVJfSU5BQ1RJVkU7CisKKwkJZW1wdHlfZmxhZyA9IChSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfSU5UX1NUQVRVUykgPj4gNikgJiAweDE7CisJCS8qIGVycm9yIHdhdGNoZG9nICovCisJCWlmIChlbXB0eV9mbGFnID09IDApIHsKKwkJCS8qIGRlY29kZXIgaGFzIGlucHV0ICovCisJCQlpZiAoKGRlYnVnICYgQVZTMl9EQkdfRElTX0xPQ19FUlJPUl9QUk9DKSA9PSAwKSB7CisKKwkJCQlidWZfbGV2ZWwgPSBSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fTEVWRUwpOworCQkJCS8qIHJlY2VpdmVyIGhhcyBubyBidWZmZXIgdG8gcmVjeWNsZSAqLworCQkJCWlmICgoc3RhdGUgPT0gUkVDRUlWRVJfSU5BQ1RJVkUpICYmCisJCQkJCShrZmlmb19pc19lbXB0eSgmZGVjLT5kaXNwbGF5X3EpICYmCisJCQkJCSBidWZfbGV2ZWwgPiAweDIwMCkKKwkJCQkJKSB7CisJCQkJCQlXUklURV9WUkVHCisJCQkJCQkoSEVWQ19BU1NJU1RfTUJPWDBfSVJRX1JFRywKKwkJCQkJCSAweDEpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKChkZWJ1ZyAmIEFWUzJfREJHX0RJU19TWVNfRVJST1JfUFJPQykgPT0gMCkgeworCQkJCS8qIHJlY2VpdmVyIGhhcyBubyBidWZmZXIgdG8gcmVjeWNsZSAqLworCQkJCS8qaWYgKChzdGF0ZSA9PSBSRUNFSVZFUl9JTkFDVElWRSkgJiYKKwkJCQkJKGtmaWZvX2lzX2VtcHR5KCZkZWMtPmRpc3BsYXlfcSkpKSB7CisJCQkJcHJfaW5mbygiYXZzMiBzb21ldGhpbmcgZXJyb3IsbmVlZCByZXNldFxuIik7CisJCQkJfSovCisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAoCisJCQkoZGVjb2RlX3RpbWVvdXRfdmFsID4gMCkgJiYKKwkJCShkZWMtPnN0YXJ0X3Byb2Nlc3NfdGltZSA+IDApICYmCisJCQkoKDEwMDAgKiAoamlmZmllcyAtIGRlYy0+c3RhcnRfcHJvY2Vzc190aW1lKSAvIEhaKQorCQkJCT4gZGVjb2RlX3RpbWVvdXRfdmFsKQorCQkpIHsKKwkJCWludCBjdXJyZW50X2xjdV9pZHggPQorCQkJCVJFQURfVlJFRyhIRVZDX1BBUlNFUl9MQ1VfU1RBUlQpCisJCQkJJiAweGZmZmZmZjsKKwkJCWlmIChkZWMtPmxhc3RfbGN1X2lkeCA9PSBjdXJyZW50X2xjdV9pZHgpIHsKKwkJCQlpZiAoZGVjLT5kZWNvZGVfdGltZW91dF9jb3VudCA+IDApCisJCQkJCWRlYy0+ZGVjb2RlX3RpbWVvdXRfY291bnQtLTsKKwkJCQlpZiAoZGVjLT5kZWNvZGVfdGltZW91dF9jb3VudCA9PSAwKSB7CisJCQkJCWlmIChpbnB1dF9mcmFtZV9iYXNlZCgKKwkJCQkJCWh3X3RvX3ZkZWMoZGVjKSkgfHwKKwkJCQkJKFJFQURfVlJFRyhIRVZDX1NUUkVBTV9MRVZFTCkgPiAweDIwMCkpCisJCQkJCQl0aW1lb3V0X3Byb2Nlc3MoZGVjKTsKKwkJCQkJZWxzZSB7CisJCQkJCQlhdnMyX3ByaW50KGRlYywgMCwKKwkJCQkJCQkidGltZW91dCAmIGVtcHR5LCBhZ2FpblxuIik7CisJCQkJCQlkZWNfYWdhaW5fcHJvY2VzcyhkZWMpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlzdGFydF9wcm9jZXNzX3RpbWUoZGVjKTsKKwkJCQlkZWMtPmxhc3RfbGN1X2lkeCA9IGN1cnJlbnRfbGN1X2lkeDsKKwkJCX0KKwkJfQorCX0KKworCWlmICgoZGVjLT51Y29kZV9wYXVzZV9wb3MgIT0gMCkgJiYKKwkJKGRlYy0+dWNvZGVfcGF1c2VfcG9zICE9IDB4ZmZmZmZmZmYpICYmCisJCXVkZWJ1Z19wYXVzZV9wb3MgIT0gZGVjLT51Y29kZV9wYXVzZV9wb3MpIHsKKwkJZGVjLT51Y29kZV9wYXVzZV9wb3MgPSAwOworCQlXUklURV9IUkVHKERFQlVHX1JFRzEsIDApOworCX0KKwlpZiAoZGVidWcgJiBBVlMyX0RCR19EVU1QX0RBVEEpIHsKKwkJZGVidWcgJj0gfkFWUzJfREJHX0RVTVBfREFUQTsKKwkJYXZzMl9wcmludChkZWMsIDAsCisJCQkiJXM6IGNodW5rIHNpemUgMHgleCBvZmYgMHgleCBzdW0gMHgleFxuIiwKKwkJCV9fZnVuY19fLAorCQkJZGVjLT5jaHVuay0+c2l6ZSwKKwkJCWRlYy0+Y2h1bmstPm9mZnNldCwKKwkJCWdldF9kYXRhX2NoZWNrX3N1bShkZWMsIGRlYy0+Y2h1bmstPnNpemUpCisJCQkpOworCQlkdW1wX2RhdGEoZGVjLCBkZWMtPmNodW5rLT5zaXplKTsKKwl9CisJaWYgKGRlYnVnICYgQVZTMl9EQkdfRFVNUF9QSUNfTElTVCkgeworCQlkdW1wX3BpY19saXN0KGRlYyk7CisJCWRlYnVnICY9IH5BVlMyX0RCR19EVU1QX1BJQ19MSVNUOworCX0KKwlpZiAoZGVidWcgJiBBVlMyX0RCR19UUklHX1NMSUNFX1NFR01FTlRfUFJPQykgeworCQlXUklURV9WUkVHKEhFVkNfQVNTSVNUX01CT1gwX0lSUV9SRUcsIDB4MSk7CisJCWRlYnVnICY9IH5BVlMyX0RCR19UUklHX1NMSUNFX1NFR01FTlRfUFJPQzsKKwl9CisJaWYgKGRlYnVnICYgQVZTMl9EQkdfRFVNUF9SUE1fQlVGKSB7CisJCWludCBpOworCisJCXByX2luZm8oIlJQTTpcbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgUlBNX0JVRl9TSVpFOyBpICs9IDQpIHsKKwkJCWludCBpaTsKKwkJCWlmICgoaSAmIDB4ZikgPT0gMCkKKwkJCQlwcl9pbmZvKCIlMDN4OiAiLCBpKTsKKwkJCWZvciAoaWkgPSAwOyBpaSA8IDQ7IGlpKyspIHsKKwkJCQlwcl9pbmZvKCIlMDR4ICIsCisJCQkJCSAgIGRlYy0+bG1lbV9wdHJbaSArIDMgLSBpaV0pOworCQkJfQorCQkJaWYgKCgoaSArIGlpKSAmIDB4ZikgPT0gMCkKKwkJCQlwcl9pbmZvKCJcbiIpOworCQl9CisJCWRlYnVnICY9IH5BVlMyX0RCR19EVU1QX1JQTV9CVUY7CisJfQorCWlmIChkZWJ1ZyAmIEFWUzJfREJHX0RVTVBfTE1FTV9CVUYpIHsKKwkJaW50IGk7CisKKwkJcHJfaW5mbygiTE1FTTpcbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgTE1FTV9CVUZfU0laRTsgaSArPSA0KSB7CisJCQlpbnQgaWk7CisJCQlpZiAoKGkgJiAweGYpID09IDApCisJCQkJcHJfaW5mbygiJTAzeDogIiwgaSk7CisJCQlmb3IgKGlpID0gMDsgaWkgPCA0OyBpaSsrKSB7CisJCQkJcHJfaW5mbygiJTA0eCAiLAorCQkJCQkgICBkZWMtPmxtZW1fcHRyW2kgKyAzIC0gaWldKTsKKwkJCX0KKwkJCWlmICgoKGkgKyBpaSkgJiAweGYpID09IDApCisJCQkJcHJfaW5mbygiXG4iKTsKKwkJfQorCQlkZWJ1ZyAmPSB+QVZTMl9EQkdfRFVNUF9MTUVNX0JVRjsKKwl9CisJLyppZiAoZGVidWcgJiBBVlMyX0RCR19IV19SRVNFVCkgeworCX0qLworCisJaWYgKHJhZHIgIT0gMCkgeworCQlpZiAocnZhbCAhPSAwKSB7CisJCQlXUklURV9WUkVHKHJhZHIsIHJ2YWwpOworCQkJcHJfaW5mbygiV1JJVEVfVlJFRygleCwleClcbiIsIHJhZHIsIHJ2YWwpOworCQl9IGVsc2UKKwkJCXByX2luZm8oIlJFQURfVlJFRygleCk9JXhcbiIsIHJhZHIsIFJFQURfVlJFRyhyYWRyKSk7CisJCXJ2YWwgPSAwOworCQlyYWRyID0gMDsKKwl9CisJaWYgKHBvcF9zaG9ydHMgIT0gMCkgeworCQlpbnQgaTsKKwkJdTMyIHN1bSA9IDA7CisJCXByX2luZm8oInBvcCBzdHJlYW0gMHgleCBzaG9ydHNcclxuIiwgcG9wX3Nob3J0cyk7CisJCWZvciAoaSA9IDA7IGkgPCBwb3Bfc2hvcnRzOyBpKyspIHsKKwkJCXUzMiBkYXRhID0KKwkJCShSRUFEX0hSRUcoSEVWQ19TSElGVEVEX0RBVEEpID4+IDE2KTsKKwkJCVdSSVRFX0hSRUcoSEVWQ19TSElGVF9DT01NQU5ELAorCQkJKDE8PDcpfDE2KTsKKwkJCWlmICgoaSAmIDB4ZikgPT0gMCkKKwkJCQlwcl9pbmZvKCIlMDR4OiIsIGkpOworCQkJcHJfaW5mbygiJTA0eCAiLCBkYXRhKTsKKwkJCWlmICgoKGkgKyAxKSAmIDB4ZikgPT0gMCkKKwkJCQlwcl9pbmZvKCJcclxuIik7CisJCQlzdW0gKz0gZGF0YTsKKwkJfQorCQlwcl9pbmZvKCJcclxuc3VtID0gJXhcclxuIiwgc3VtKTsKKwkJcG9wX3Nob3J0cyA9IDA7CisJfQorCWlmIChkYmdfY21kICE9IDApIHsKKwkJaWYgKGRiZ19jbWQgPT0gMSkgeworCQkJdTMyIGRpc3BfbGFkZHI7CisJCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWEJCICYmCisJCQkJZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGRlYykgPT0gMCkgeworCQkJCWRpc3BfbGFkZHIgPQorCQkJCQlSRUFEX1ZDQlVTX1JFRyhBRkJDX0JPRFlfQkFERFIpIDw8IDQ7CisJCQl9IGVsc2UgeworCQkJCXN0cnVjdCBjYW52YXNfcyBjdXJfY2FudmFzOworCQkJCWNhbnZhc19yZWFkKChSRUFEX1ZDQlVTX1JFRyhWRDFfSUYwX0NBTlZBUzApCisJCQkJCSYgMHhmZiksICZjdXJfY2FudmFzKTsKKwkJCQlkaXNwX2xhZGRyID0gY3VyX2NhbnZhcy5hZGRyOworCQkJfQorCQkJcHJfaW5mbygiY3VycmVudCBkaXNwbGF5ZWQgYnVmZmVyIGFkZHJlc3MgJXhcclxuIiwKKwkJCQlkaXNwX2xhZGRyKTsKKwkJfQorCQlkYmdfY21kID0gMDsKKwl9CisJLypkb24ndCBjaGFuZ2VkIGF0IHN0YXJ0LiovCisJaWYgKGRlYy0+Z2V0X2ZyYW1lX2R1ciAmJiBkZWMtPnNob3dfZnJhbWVfbnVtID4gNjAgJiYKKwkJZGVjLT5mcmFtZV9kdXIgPiAwICYmIGRlYy0+c2F2ZWRfcmVzb2x1dGlvbiAhPQorCQlmcmFtZV93aWR0aCAqIGZyYW1lX2hlaWdodCAqCisJCQkoOTYwMDAgLyBkZWMtPmZyYW1lX2R1cikpIHsKKwkJaW50IGZwcyA9IDk2MDAwIC8gZGVjLT5mcmFtZV9kdXI7CisJCWlmIChoZXZjX3NvdXJjZV9jaGFuZ2VkKFZGT1JNQVRfQVZTMiwKKwkJCWZyYW1lX3dpZHRoLCBmcmFtZV9oZWlnaHQsIGZwcykgPiAwKQorCQkJZGVjLT5zYXZlZF9yZXNvbHV0aW9uID0gZnJhbWVfd2lkdGggKgorCQkJZnJhbWVfaGVpZ2h0ICogZnBzOworCX0KKworCXRpbWVyLT5leHBpcmVzID0gamlmZmllcyArIFBVVF9JTlRFUlZBTDsKKwlhZGRfdGltZXIodGltZXIpOworfQorCisKK2ludCB2YXZzMl9kZWNfc3RhdHVzKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHN0cnVjdCB2ZGVjX2luZm8gKnZzdGF0dXMpCit7CisJc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYyA9CisJCShzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqKXZkZWMtPnByaXZhdGU7CisKKwlpZiAoIWRlYykKKwkJcmV0dXJuIC0xOworCisJdnN0YXR1cy0+ZnJhbWVfd2lkdGggPSBkZWMtPmZyYW1lX3dpZHRoOworCXZzdGF0dXMtPmZyYW1lX2hlaWdodCA9IGRlYy0+ZnJhbWVfaGVpZ2h0OworCisJaWYgKGRlYy0+ZnJhbWVfZHVyICE9IDApCisJCXZzdGF0dXMtPmZyYW1lX3JhdGUgPSAoKDk2MDAwICogMTAgLyBkZWMtPmZyYW1lX2R1cikgJSAxMCkgPCA1ID8KKwkJICAgICAgICAgICAgICAgICAgICA5NjAwMCAvIGRlYy0+ZnJhbWVfZHVyIDogKDk2MDAwIC8gZGVjLT5mcmFtZV9kdXIgKzEpOworCWVsc2UKKwkJdnN0YXR1cy0+ZnJhbWVfcmF0ZSA9IC0xOworCXZzdGF0dXMtPmVycm9yX2NvdW50ID0gMDsKKwl2c3RhdHVzLT5zdGF0dXMgPSBkZWMtPnN0YXQgfCBkZWMtPmZhdGFsX2Vycm9yOworCXZzdGF0dXMtPmZyYW1lX2R1ciA9IGRlYy0+ZnJhbWVfZHVyOworCXZzdGF0dXMtPmJpdF9yYXRlID0gZGVjLT5ndnMtPmJpdF9yYXRlOworCXZzdGF0dXMtPmZyYW1lX2RhdGEgPSBkZWMtPmd2cy0+ZnJhbWVfZGF0YTsKKwl2c3RhdHVzLT50b3RhbF9kYXRhID0gZGVjLT5ndnMtPnRvdGFsX2RhdGE7CisJdnN0YXR1cy0+ZnJhbWVfY291bnQgPSBkZWMtPmd2cy0+ZnJhbWVfY291bnQ7CisJdnN0YXR1cy0+ZXJyb3JfZnJhbWVfY291bnQgPSBkZWMtPmd2cy0+ZXJyb3JfZnJhbWVfY291bnQ7CisJdnN0YXR1cy0+ZHJvcF9mcmFtZV9jb3VudCA9IGRlYy0+Z3ZzLT5kcm9wX2ZyYW1lX2NvdW50OworCXZzdGF0dXMtPmlfZGVjb2RlZF9mcmFtZXMgPSBkZWMtPmd2cy0+aV9kZWNvZGVkX2ZyYW1lczsKKwl2c3RhdHVzLT5pX2xvc3RfZnJhbWVzID0gIGRlYy0+Z3ZzLT5pX2xvc3RfZnJhbWVzOworCXZzdGF0dXMtPmlfY29uY2VhbGVkX2ZyYW1lcyA9ICBkZWMtPmd2cy0+aV9jb25jZWFsZWRfZnJhbWVzOworCXZzdGF0dXMtPnBfZGVjb2RlZF9mcmFtZXMgPSAgZGVjLT5ndnMtPnBfZGVjb2RlZF9mcmFtZXM7CisJdnN0YXR1cy0+cF9sb3N0X2ZyYW1lcyA9ICBkZWMtPmd2cy0+cF9sb3N0X2ZyYW1lczsKKwl2c3RhdHVzLT5wX2NvbmNlYWxlZF9mcmFtZXMgPSAgZGVjLT5ndnMtPnBfY29uY2VhbGVkX2ZyYW1lczsKKwl2c3RhdHVzLT5iX2RlY29kZWRfZnJhbWVzID0gIGRlYy0+Z3ZzLT5iX2RlY29kZWRfZnJhbWVzOworCXZzdGF0dXMtPmJfbG9zdF9mcmFtZXMgPSAgZGVjLT5ndnMtPmJfbG9zdF9mcmFtZXM7CisJdnN0YXR1cy0+Yl9jb25jZWFsZWRfZnJhbWVzID0gIGRlYy0+Z3ZzLT5iX2NvbmNlYWxlZF9mcmFtZXM7CisJdnN0YXR1cy0+dG90YWxfZGF0YSA9IGRlYy0+Z3ZzLT50b3RhbF9kYXRhOworCXZzdGF0dXMtPnNhbXBfY250ID0gZGVjLT5ndnMtPnNhbXBfY250OworCXZzdGF0dXMtPm9mZnNldCA9IGRlYy0+Z3ZzLT5vZmZzZXQ7CisJc25wcmludGYodnN0YXR1cy0+dmRlY19uYW1lLCBzaXplb2YodnN0YXR1cy0+dmRlY19uYW1lKSwKKwkJIiVzIiwgRFJJVkVSX05BTUUpOworCXJldHVybiAwOworfQorCitpbnQgdmF2czJfc2V0X2lzcmVzZXQoc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGlzcmVzZXQpCit7CisJaXNfcmVzZXQgPSBpc3Jlc2V0OworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2YXZzMl9wcm90X2luaXQoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYykKK3sKKwl1bnNpZ25lZCBpbnQgZGF0YTMyOworCisJYXZzMl9jb25maWdfd29ya19zcGFjZV9odyhkZWMpOworCWlmIChkZWMtPnBpY19saXN0X2luaXRfZmxhZykKKwkJaW5pdF9waWNfbGlzdF9odyhkZWMpOworCisJYXZzMl9pbml0X2RlY29kZXJfaHcoZGVjKTsKKworI2lmIDEKKwlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX01PUkUsCisJCSIlc1xuIiwgX19mdW5jX18pOworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NUUkVBTV9DT05UUk9MKTsKKwlkYXRhMzIgPSBkYXRhMzIgfAorCQkoMSA8PCAwKS8qc3RyZWFtX2ZldGNoX2VuYWJsZSovCisJCTsKKwlXUklURV9WUkVHKEhFVkNfU1RSRUFNX0NPTlRST0wsIGRhdGEzMik7CisjaWYgMAorCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NISUZUX1NUQVJUQ09ERSk7CisJaWYgKGRhdGEzMiAhPSAweDAwMDAwMTAwKSB7CisJCXByX2luZm8oImF2czIgcHJvdCBpbml0IGVycm9yICVkXG4iLCBfX0xJTkVfXyk7CisJCXJldHVybjsKKwl9CisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0hJRlRfRU1VTEFURUNPREUpOworCWlmIChkYXRhMzIgIT0gMHgwMDAwMDMwMCkgeworCQlwcl9pbmZvKCJhdnMyIHByb3QgaW5pdCBlcnJvciAlZFxuIiwgX19MSU5FX18pOworCQlyZXR1cm47CisJfQorCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9TVEFSVENPREUsIDB4MTIzNDU2NzgpOworCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9FTVVMQVRFQ09ERSwgMHg5YWJjZGVmMCk7CisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0hJRlRfU1RBUlRDT0RFKTsKKwlpZiAoZGF0YTMyICE9IDB4MTIzNDU2NzgpIHsKKwkJcHJfaW5mbygiYXZzMiBwcm90IGluaXQgZXJyb3IgJWRcbiIsIF9fTElORV9fKTsKKwkJcmV0dXJuOworCX0KKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9FTVVMQVRFQ09ERSk7CisJaWYgKGRhdGEzMiAhPSAweDlhYmNkZWYwKSB7CisJCXByX2luZm8oImF2czIgcHJvdCBpbml0IGVycm9yICVkXG4iLCBfX0xJTkVfXyk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwlXUklURV9WUkVHKEhFVkNfU0hJRlRfU1RBUlRDT0RFLCAweDAwMDAwMTAwKTsKKwlXUklURV9WUkVHKEhFVkNfU0hJRlRfRU1VTEFURUNPREUsIDB4MDAwMDAwMDApOworI2VuZGlmCisKKworCisJV1JJVEVfVlJFRyhIRVZDX1dBSVRfRkxBRywgMSk7CisKKwkvKiBXUklURV9WUkVHKEhFVkNfTVBTUiwgMSk7ICovCisKKwkvKiBjbGVhciBtYWlsYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTUJPWDBfQ0xSX1JFRywgMSk7CisKKwkvKiBlbmFibGUgbWFpbGJveCBpbnRlcnJ1cHQgKi8KKwlXUklURV9WUkVHKEhFVkNfQVNTSVNUX01CT1gwX01BU0ssIDEpOworCisJLyogZGlzYWJsZSBQU0NBTEUgZm9yIGhhcmR3YXJlIHNoYXJpbmcgKi8KKwlXUklURV9WUkVHKEhFVkNfUFNDQUxFX0NUUkwsIDApOworCisJV1JJVEVfVlJFRyhERUJVR19SRUcxLCAweDApOworCS8qY2hlY2sgdnBzL3Nwcy9wcHMvaS1zbGljZSBpbiB1Y29kZSovCisJV1JJVEVfVlJFRyhOQUxfU0VBUkNIX0NUTCwgMHg4KTsKKworCVdSSVRFX1ZSRUcoREVDT0RFX1NUT1BfUE9TLCB1ZGVidWdfZmxhZyk7CisKKwljb25maWdfY3V2YV9idWYoZGVjKTsKK30KKworI2lmZGVmIElfT05MWV9TVVBQT1JUCitzdGF0aWMgaW50IHZhdnMyX3NldF90cmlja21vZGUoc3RydWN0IHZkZWNfcyAqdmRlYywgdW5zaWduZWQgbG9uZyB0cmlja21vZGUpCit7CisJc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYyA9CisJCShzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqKXZkZWMtPnByaXZhdGU7CisJaWYgKGlfb25seV9mbGFnICYgMHgxMDApCisJCXJldHVybiAwOworCWlmICh0cmlja21vZGUgPT0gVFJJQ0tNT0RFX0kgfHwgdHJpY2ttb2RlID09IFRSSUNLTU9ERV9JX0hFVkMpCisJCWRlYy0+aV9vbmx5ID0gMHgzOworCWVsc2UgaWYgKHRyaWNrbW9kZSA9PSBUUklDS01PREVfTk9ORSkKKwkJZGVjLT5pX29ubHkgPSAweDA7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCB2YXZzMl9sb2NhbF9pbml0KHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMpCit7CisJaW50IGk7CisJaW50IHJldDsKKwlpbnQgd2lkdGgsIGhlaWdodDsKKworCWRlYy0+dmF2czJfcmF0aW8gPSBkZWMtPnZhdnMyX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGlvOworCisJZGVjLT5ndnMgPSB2emFsbG9jKHNpemVvZihzdHJ1Y3QgdmRlY19pbmZvKSk7CisJaWYgKE5VTEwgPT0gZGVjLT5ndnMpIHsKKwkJYXZzMl9wcmludChkZWMsIDAsCisJCQkidGhlIHN0cnVjdCBvZiB2ZGVjIHN0YXR1cyBtYWxsb2MgZmFpbGVkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisjaWZkZWYgREVCVUdfUFRTCisJZGVjLT5wdHNfbWlzc2VkID0gMDsKKwlkZWMtPnB0c19oaXQgPSAwOworI2VuZGlmCisJZGVjLT5uZXdfZnJhbWVfZGlzcGxheWVkID0gMDsKKwlkZWMtPmxhc3RfcHV0X2lkeCA9IC0xOworCWRlYy0+c2F2ZWRfcmVzb2x1dGlvbiA9IDA7CisJZGVjLT5nZXRfZnJhbWVfZHVyID0gZmFsc2U7CisJb25fbm9fa2V5ZnJhbWVfc2tpcGVkID0gMDsKKwl3aWR0aCA9IGRlYy0+dmF2czJfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGg7CisJaGVpZ2h0ID0gZGVjLT52YXZzMl9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQ7CisJZGVjLT5mcmFtZV9kdXIgPQorCQkoZGVjLT52YXZzMl9hbXN0cmVhbV9kZWNfaW5mby5yYXRlID09CisJCSAwKSA/IDM2MDAgOiBkZWMtPnZhdnMyX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGU7CisJaWYgKHdpZHRoICYmIGhlaWdodCkKKwkJZGVjLT5mcmFtZV9hciA9IGhlaWdodCAqIDB4MTAwIC8gd2lkdGg7CisvKgorVE9ETzpGT1IgVkVSU0lPTgorKi8KKwlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSLAorCQkiYXZzMjogdmVyICglZCwlZCkgZGVjaW5mbzogJWR4JWQgcmF0ZT0lZFxuIiwgYXZzMl92ZXJzaW9uLAorCQkgICAwLCB3aWR0aCwgaGVpZ2h0LCBkZWMtPmZyYW1lX2R1cik7CisKKwlpZiAoZGVjLT5mcmFtZV9kdXIgPT0gMCkKKwkJZGVjLT5mcmFtZV9kdXIgPSA5NjAwMCAvIDI0OworI2lmZGVmIElfT05MWV9TVVBQT1JUCisJaWYgKGlfb25seV9mbGFnICYgMHgxMDApCisJCWRlYy0+aV9vbmx5ID0gaV9vbmx5X2ZsYWcgJiAweGZmOworCWVsc2UgaWYgKCh1bnNpZ25lZCBsb25nKSBkZWMtPnZhdnMyX2Ftc3RyZWFtX2RlY19pbmZvLnBhcmFtCisJCSYgMHgwOCkKKwkJZGVjLT5pX29ubHkgPSAweDc7CisJZWxzZQorCQlkZWMtPmlfb25seSA9IDB4MDsKKyNlbmRpZgorCUlOSVRfS0ZJRk8oZGVjLT5kaXNwbGF5X3EpOworCUlOSVRfS0ZJRk8oZGVjLT5uZXdmcmFtZV9xKTsKKworCisJZm9yIChpID0gMDsgaSA8IFZGX1BPT0xfU0laRTsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqdmYgPSAmZGVjLT52ZnBvb2xbaV07CisJCWRlYy0+dmZwb29sW2ldLmluZGV4ID0gLTE7CisJCWtmaWZvX3B1dCgmZGVjLT5uZXdmcmFtZV9xLCB2Zik7CisJfQorCisKKwlyZXQgPSBhdnMyX2xvY2FsX2luaXQoZGVjKTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHMzMiB2YXZzMl9pbml0KHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJaW50IHJldCA9IC0xLCBzaXplID0gLTE7CisJaW50IGZ3X3NpemUgPSAweDEwMDAgKiAxNjsKKwlzdHJ1Y3QgZmlybXdhcmVfcyAqZncgPSBOVUxMOworCXN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMgPSAoc3RydWN0IEFWUzJEZWNvZGVyX3MgKil2ZGVjLT5wcml2YXRlOworCisJdGltZXJfc2V0dXAoJmRlYy0+dGltZXIsIHZhdnMyX3B1dF90aW1lcl9mdW5jLCAwKTsKKworCWRlYy0+c3RhdCB8PSBTVEFUX1RJTUVSX0lOSVQ7CisJaWYgKHZhdnMyX2xvY2FsX2luaXQoZGVjKSA8IDApCisJCXJldHVybiAtRUJVU1k7CisKKwl2ZGVjX3NldF92ZnJhbWVfY29tbSh2ZGVjLCBEUklWRVJfTkFNRSk7CisKKwlmdyA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBmaXJtd2FyZV9zKSArIGZ3X3NpemUpOworCWlmIChJU19FUlJfT1JfTlVMTChmdykpCisJCXJldHVybiAtRU5PTUVNOworCisJc2l6ZSA9IGdldF9maXJtd2FyZV9kYXRhKFZJREVPX0RFQ19BVlMyX01NVSwgZnctPmRhdGEpOworCWlmIChzaXplIDwgMCkgeworCQlwcl9lcnIoImdldCBmaXJtd2FyZSBmYWlsLlxuIik7CisJCXZmcmVlKGZ3KTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZ3LT5sZW4gPSBmd19zaXplOworCisJaWYgKGRlYy0+bV9pbnNfZmxhZykgeworCQlkZWMtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgUFVUX0lOVEVSVkFMOworCisJCS8qYWRkX3RpbWVyKCZkZWMtPnRpbWVyKTsKKworCQlkZWMtPnN0YXQgfD0gU1RBVF9USU1FUl9BUk07CisJCWRlYy0+c3RhdCB8PSBTVEFUX0lTUl9SRUc7Ki8KKworCQlJTklUX1dPUksoJmRlYy0+d29yaywgYXZzMl93b3JrKTsKKwkJZGVjLT5mdyA9IGZ3OworCisJCXJldHVybiAwOworCX0KKworCWFtaGV2Y19lbmFibGUoKTsKKworCXJldCA9IGFtaGV2Y19sb2FkbWNfZXgoVkZPUk1BVF9BVlMyLCBOVUxMLCBmdy0+ZGF0YSk7CisJaWYgKHJldCA8IDApIHsKKwkJYW1oZXZjX2Rpc2FibGUoKTsKKwkJdmZyZWUoZncpOworCQlwcl9lcnIoIkFWUzI6IHRoZSAlcyBmdyBsb2FkaW5nIGZhaWxlZCwgZXJyOiAleFxuIiwKKwkJCXRlZV9lbmFibGVkKCkgPyAiVEVFIiA6ICJsb2NhbCIsIHJldCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJdmZyZWUoZncpOworCisJZGVjLT5zdGF0IHw9IFNUQVRfTUNfTE9BRDsKKworCS8qIGVuYWJsZSBBTVJJU0Mgc2lkZSBwcm90b2NvbCAqLworCXZhdnMyX3Byb3RfaW5pdChkZWMpOworCisJaWYgKHZkZWNfcmVxdWVzdF90aHJlYWRlZF9pcnEoVkRFQ19JUlFfMCwKKwkJCQl2YXZzMl9pc3IsCisJCQkJdmF2czJfaXNyX3RocmVhZF9mbiwKKwkJCQlJUlFGX09ORVNIT1QsLypydW4gdGhyZWFkIG9uIHRoaXMgaXJxIGRpc2FibGVkKi8KKwkJCQkidmF2czItaXJxIiwgKHZvaWQgKilkZWMpKSB7CisJCXByX2luZm8oInZhdnMyIGlycSByZWdpc3RlciBlcnJvci5cbiIpOworCQlhbWhldmNfZGlzYWJsZSgpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlkZWMtPnN0YXQgfD0gU1RBVF9JU1JfUkVHOworCisJZGVjLT5wcm92aWRlcl9uYW1lID0gUFJPVklERVJfTkFNRTsKKwl2Zl9wcm92aWRlcl9pbml0KCZ2YXZzMl92Zl9wcm92LCBQUk9WSURFUl9OQU1FLAorCQkJCSZ2YXZzMl92Zl9wcm92aWRlciwgZGVjKTsKKwl2Zl9yZWdfcHJvdmlkZXIoJnZhdnMyX3ZmX3Byb3YpOworCXZmX25vdGlmeV9yZWNlaXZlcihQUk9WSURFUl9OQU1FLCBWRlJBTUVfRVZFTlRfUFJPVklERVJfU1RBUlQsIE5VTEwpOworCWlmIChkZWMtPmZyYW1lX2R1ciAhPSAwKSB7CisJCWlmICghaXNfcmVzZXQpCisJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoZGVjLT5wcm92aWRlcl9uYW1lLAorCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfRlJfSElOVCwKKwkJCQkJKHZvaWQgKikKKwkJCQkJKCh1bnNpZ25lZCBsb25nKWRlYy0+ZnJhbWVfZHVyKSk7CisJfQorCWRlYy0+c3RhdCB8PSBTVEFUX1ZGX0hPT0s7CisKKwlkZWMtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgUFVUX0lOVEVSVkFMOworCWFkZF90aW1lcigmZGVjLT50aW1lcik7CisKKwlkZWMtPnN0YXQgfD0gU1RBVF9USU1FUl9BUk07CisKKwkvKiBkZWMtPnN0YXQgfD0gU1RBVF9LVEhSRUFEOyAqLworCWRlYy0+cHJvY2Vzc19idXN5ID0gMDsKKwlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX01PUkUsCisJCSIlZCwgdmF2czJfaW5pdCwgUlA9MHgleFxuIiwKKwkJX19MSU5FX18sIFJFQURfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bWF2czJfc3RvcChzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCWRlYy0+aW5pdF9mbGFnID0gMDsKKwlkZWMtPmZpcnN0X3NjX2NoZWNrZWQgPSAwOworCWlmIChkZWMtPnN0YXQgJiBTVEFUX1RJTUVSX0FSTSkgeworCQlkZWxfdGltZXJfc3luYygmZGVjLT50aW1lcik7CisJCWRlYy0+c3RhdCAmPSB+U1RBVF9USU1FUl9BUk07CisJfQorCisJaWYgKGRlYy0+c3RhdCAmIFNUQVRfVkZfSE9PSykgeworCQlpZiAoIWlzX3Jlc2V0KQorCQkJdmZfbm90aWZ5X3JlY2VpdmVyKGRlYy0+cHJvdmlkZXJfbmFtZSwKKwkJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX0ZSX0VORF9ISU5ULAorCQkJCQlOVUxMKTsKKworCQl2Zl91bnJlZ19wcm92aWRlcigmdmF2czJfdmZfcHJvdik7CisJCWRlYy0+c3RhdCAmPSB+U1RBVF9WRl9IT09LOworCX0KKwlhdnMyX2xvY2FsX3VuaW5pdChkZWMpOworCXJlc2V0X3Byb2Nlc3NfdGltZShkZWMpOworCWNhbmNlbF93b3JrX3N5bmMoJmRlYy0+d29yayk7CisJdW5pbml0X21tdV9idWZmZXJzKGRlYyk7CisJaWYgKGRlYy0+ZncpIHsKKwkJdmZyZWUoZGVjLT5mdyk7CisJCWRlYy0+ZncgPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgdmF2czJfc3RvcChzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCisJZGVjLT5pbml0X2ZsYWcgPSAwOworCWRlYy0+Zmlyc3Rfc2NfY2hlY2tlZCA9IDA7CisJaWYgKGRlYy0+c3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJYW1oZXZjX3N0b3AoKTsKKwkJZGVjLT5zdGF0ICY9IH5TVEFUX1ZERUNfUlVOOworCX0KKworCWlmIChkZWMtPnN0YXQgJiBTVEFUX0lTUl9SRUcpIHsKKwkJaWYgKCFkZWMtPm1faW5zX2ZsYWcpCisJCQlXUklURV9WUkVHKEhFVkNfQVNTSVNUX01CT1gwX01BU0ssIDApOworCQl2ZGVjX2ZyZWVfaXJxKFZERUNfSVJRXzAsICh2b2lkICopZGVjKTsKKwkJZGVjLT5zdGF0ICY9IH5TVEFUX0lTUl9SRUc7CisJfQorCisJaWYgKGRlYy0+c3RhdCAmIFNUQVRfVElNRVJfQVJNKSB7CisJCWRlbF90aW1lcl9zeW5jKCZkZWMtPnRpbWVyKTsKKwkJZGVjLT5zdGF0ICY9IH5TVEFUX1RJTUVSX0FSTTsKKwl9CisKKwlpZiAoZGVjLT5zdGF0ICYgU1RBVF9WRl9IT09LKSB7CisJCWlmICghaXNfcmVzZXQpCisJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoZGVjLT5wcm92aWRlcl9uYW1lLAorCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfRlJfRU5EX0hJTlQsCisJCQkJCU5VTEwpOworCisJCXZmX3VucmVnX3Byb3ZpZGVyKCZ2YXZzMl92Zl9wcm92KTsKKwkJZGVjLT5zdGF0ICY9IH5TVEFUX1ZGX0hPT0s7CisJfQorCWF2czJfbG9jYWxfdW5pbml0KGRlYyk7CisKKwlpZiAoZGVjLT5tX2luc19mbGFnKQorCQljYW5jZWxfd29ya19zeW5jKCZkZWMtPndvcmspOworCWVsc2UKKwkJYW1oZXZjX2Rpc2FibGUoKTsKKwl1bmluaXRfbW11X2J1ZmZlcnMoZGVjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtdmRlY19hdnMyX21tdV9pbml0KHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMpCit7CisJaW50IHR2cF9mbGFnID0gdmRlY19zZWN1cmUoaHdfdG9fdmRlYyhkZWMpKSA/CisJCUNPREVDX01NX0ZMQUdTX1RWUCA6IDA7CisJaW50IGJ1Zl9zaXplID0gNDg7CisKKwlkZWMtPm5lZWRfY2FjaGVfc2l6ZSA9IGJ1Zl9zaXplICogU1pfMU07CisJZGVjLT5zY19zdGFydF90aW1lID0gZ2V0X2ppZmZpZXNfNjQoKTsKKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwlpZiAoZGVjLT5tbXVfZW5hYmxlKSB7CisJCWRlYy0+bW11X2JveCA9IGRlY29kZXJfbW11X2JveF9hbGxvY19ib3goRFJJVkVSX05BTUUsCisJCQlkZWMtPmluZGV4LCBGUkFNRV9CVUZGRVJTLAorCQkJZGVjLT5uZWVkX2NhY2hlX3NpemUsCisJCQl0dnBfZmxhZworCQkJKTsKKwkJaWYgKCFkZWMtPm1tdV9ib3gpIHsKKwkJCXByX2VycigiYXZzMiBhbGxvYyBtbXUgYm94IGZhaWxlZCEhXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKyNlbmRpZgorI2lmZGVmIEFWUzJfMTBCX01NVV9EVworCWlmIChkZWMtPmR3X21tdV9lbmFibGUpIHsKKwkJZGVjLT5kd19tbXVfYm94ID0gZGVjb2Rlcl9tbXVfYm94X2FsbG9jX2JveChEUklWRVJfTkFNRSwKKwkJCWRlYy0+aW5kZXgsIEZSQU1FX0JVRkZFUlMsCisJCQlkZWMtPm5lZWRfY2FjaGVfc2l6ZSwKKwkJCXR2cF9mbGFnCisJCQkpOworCQlpZiAoIWRlYy0+ZHdfbW11X2JveCkgeworCQkJcHJfZXJyKCJhdnMyIGFsbG9jIGR3IG1tdSBib3ggZmFpbGVkISFcbiIpOworCQkJZGVjLT5kd19tbXVfZW5hYmxlID0gMDsKKwkJfQorCX0KKyNlbmRpZgorCWRlYy0+Ym1tdV9ib3ggPSBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2JveCgKKwkJCURSSVZFUl9OQU1FLAorCQkJZGVjLT5pbmRleCwKKwkJCU1BWF9CTU1VX0JVRkZFUl9OVU0sCisJCQk0ICsgUEFHRV9TSElGVCwKKwkJCUNPREVDX01NX0ZMQUdTX0NNQV9DTEVBUiB8CisJCQlDT0RFQ19NTV9GTEFHU19GT1JfVkRFQ09ERVIgfAorCQkJdHZwX2ZsYWcpOworCWlmICghZGVjLT5ibW11X2JveCkgeworCQlwcl9lcnIoImF2czIgYWxsb2MgYm1tdSBib3ggZmFpbGVkISFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtdmRlY19hdnMyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHZkZWNfcyAqcGRhdGEgPSAqKHN0cnVjdCB2ZGVjX3MgKiopcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJLypzdHJ1Y3QgQlVGX3MgQlVGW01BWF9CVUZfTlVNXTsqLworCXN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMgPSAmZ0FWUzJEZWNvZGVyOworCWludCByZXQ7CisJcHJfaW5mbygiJXNcbiIsIF9fZnVuY19fKTsKKworCWRlYyA9IHZ6YWxsb2Moc2l6ZW9mKHN0cnVjdCBBVlMyRGVjb2Rlcl9zKSk7CisJaWYgKCFkZWMpCisJCXJldHVybiAtRU5PTUVNOworCisJcGRhdGEtPnByaXZhdGUgPSBkZWM7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGRhdGEpOworCisJbXV0ZXhfbG9jaygmdmF2czJfbXV0ZXgpOworCisJZGVjLT5pbml0X2ZsYWcgPSAwOworCWRlYy0+Zmlyc3Rfc2NfY2hlY2tlZCA9IDA7CisJZGVjLT5lb3MgPSAwOworCWRlYy0+c3RhcnRfcHJvY2Vzc190aW1lID0gMDsKKwlkZWMtPnRpbWVvdXRfbnVtID0gMDsKKwlkZWMtPmZhdGFsX2Vycm9yID0gMDsKKwlkZWMtPnNob3dfZnJhbWVfbnVtID0gMDsKKwlpZiAocGRhdGEgPT0gTlVMTCkgeworCQlhdnMyX3ByaW50KGRlYywgMCwKKwkJCSJcbmFtdmRlY19hdnMyIG1lbW9yeSByZXNvdXJjZSB1bmRlZmluZWQuXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZ2YXZzMl9tdXRleCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlkZWMtPm1faW5zX2ZsYWcgPSAwOworCWRlYy0+cGxhdGZvcm1fZGV2ID0gcGRldjsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwZGF0YSk7CisKKyNpZmRlZiBBVlMyXzEwQl9NTVVfRFcKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNUQpIHsKKwkJZGVjLT5kd19tbXVfZW5hYmxlID0KKwkJCShnZXRfZG91YmxlX3dyaXRlX21vZGUoZGVjKSAmIDB4MjApID8gMSA6IDA7CisJfSBlbHNlIHsKKwkJZGVjLT5kd19tbXVfZW5hYmxlID0gMDsKKwl9CisjZW5kaWYKKwlpZiAoYW12ZGVjX2F2czJfbW11X2luaXQoZGVjKSA8IDApIHsKKwkJbXV0ZXhfdW5sb2NrKCZ2YXZzMl9tdXRleCk7CisJCXByX2VycigiYXZzMiBhbGxvYyBibW11IGJveCBmYWlsZWQhIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXQgPSBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkoZGVjLT5ibW11X2JveCwgV09SS19TUEFDRV9CVUZfSUQsCisJCQl3b3JrX2J1Zl9zaXplLCBEUklWRVJfTkFNRSwgJnBkYXRhLT5tZW1fc3RhcnQpOworCWlmIChyZXQgPCAwKSB7CisJCXVuaW5pdF9tbXVfYnVmZmVycyhkZWMpOworCQltdXRleF91bmxvY2soJnZhdnMyX211dGV4KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJZGVjLT5idWZfc2l6ZSA9IHdvcmtfYnVmX3NpemU7CisKKwlkZWMtPmJ1Zl9zdGFydCA9IHBkYXRhLT5tZW1fc3RhcnQ7CisKKworCWlmIChkZWJ1ZykgeworCQlhdnMyX3ByaW50KGRlYywgMCwKKwkJCSI9PT1BVlMyIGRlY29kZXIgbWVtIHJlc291cmNlIDB4JWx4IHNpemUgMHgleFxuIiwKKwkJCSAgIHBkYXRhLT5tZW1fc3RhcnQsIGRlYy0+YnVmX3NpemUpOworCX0KKworCWlmIChwZGF0YS0+c3lzX2luZm8pIHsKKwkJZGVjLT52YXZzMl9hbXN0cmVhbV9kZWNfaW5mbyA9ICpwZGF0YS0+c3lzX2luZm87CisJCWRlYy0+ZnJhbWVfd2lkdGggPSBkZWMtPnZhdnMyX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoOworCQlkZWMtPmZyYW1lX2hlaWdodCA9IGRlYy0+dmF2czJfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0OworCX0gZWxzZSB7CisJCWRlYy0+dmF2czJfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGggPSAwOworCQlkZWMtPnZhdnMyX2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodCA9IDA7CisJCWRlYy0+dmF2czJfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSA9IDMwOworCX0KKwlkZWMtPmNtYV9kZXYgPSBwZGF0YS0+Y21hX2RldjsKKworCWRlYy0+ZW5kaWFuID0gSEVWQ19DT05GSUdfTElUVExFX0VORElBTjsKKwlpZiAoaXNfc3VwcG9ydF92ZGVjX2NhbnZhcygpKQorCQlkZWMtPmVuZGlhbiA9IEhFVkNfQ09ORklHX0JJR19FTkRJQU47CisJaWYgKGVuZGlhbikKKwkJZGVjLT5lbmRpYW4gPSBlbmRpYW47CisKKwlwZGF0YS0+cHJpdmF0ZSA9IGRlYzsKKwlwZGF0YS0+ZGVjX3N0YXR1cyA9IHZhdnMyX2RlY19zdGF0dXM7CisJLypwZGF0YS0+c2V0X2lzcmVzZXQgPSB2YXZzMl9zZXRfaXNyZXNldDsqLworCWlzX3Jlc2V0ID0gMDsKKwlpZiAodmF2czJfaW5pdChwZGF0YSkgPCAwKSB7CisJCXByX2luZm8oIlxuYW12ZGVjX2F2czIgaW5pdCBmYWlsZWQuXG4iKTsKKwkJYXZzMl9sb2NhbF91bmluaXQoZGVjKTsKKwkJdW5pbml0X21tdV9idWZmZXJzKGRlYyk7CisJCXBkYXRhLT5kZWNfc3RhdHVzID0gTlVMTDsKKwkJbXV0ZXhfdW5sb2NrKCZ2YXZzMl9tdXRleCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkvKnNldCB0aGUgbWF4IGNsayBmb3Igc21vb3RoIHBsYXlpbmcuLi4qLworCWhldmNfc291cmNlX2NoYW5nZWQoVkZPUk1BVF9BVlMyLAorCQkJNDA5NiwgMjA0OCwgNjApOworCW11dGV4X3VubG9jaygmdmF2czJfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW12ZGVjX2F2czJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYyA9ICZnQVZTMkRlY29kZXI7CisJaWYgKGRlYnVnKQorCQlwcl9pbmZvKCJhbXZkZWNfYXZzMl9yZW1vdmVcbiIpOworCisJbXV0ZXhfbG9jaygmdmF2czJfbXV0ZXgpOworCisJdmF2czJfc3RvcChkZWMpOworCisKKwloZXZjX3NvdXJjZV9jaGFuZ2VkKFZGT1JNQVRfQVZTMiwgMCwgMCwgMCk7CisKKworI2lmZGVmIERFQlVHX1BUUworCXByX2luZm8oInB0cyBtaXNzZWQgJWxkLCBwdHMgaGl0ICVsZCwgZHVyYXRpb24gJWRcbiIsCisJCSAgIGRlYy0+cHRzX21pc3NlZCwgZGVjLT5wdHNfaGl0LCBkZWMtPmZyYW1lX2R1cik7CisjZW5kaWYKKworCW11dGV4X3VubG9jaygmdmF2czJfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhbXZkZWNfYXZzMl9kcml2ZXIgPSB7CisJLnByb2JlID0gYW12ZGVjX2F2czJfcHJvYmUsCisJLnJlbW92ZSA9IGFtdmRlY19hdnMyX3JlbW92ZSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZCA9IGFtaGV2Y19zdXNwZW5kLAorCS5yZXN1bWUgPSBhbWhldmNfcmVzdW1lLAorI2VuZGlmCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGNvZGVjX3Byb2ZpbGVfdCBhbXZkZWNfYXZzMl9wcm9maWxlID0geworCS5uYW1lID0gImF2czIiLAorCS5wcm9maWxlID0gIiIKK307CisKK3N0YXRpYyBzdHJ1Y3QgY29kZWNfcHJvZmlsZV90IGFtdmRlY19hdnMyX3Byb2ZpbGVfbXVsdDsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgZ2V0X2RhdGFfY2hlY2tfc3VtCisJKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMsIGludCBzaXplKQoreworCWludCBqajsKKwlpbnQgc3VtID0gMDsKKwl1OCAqZGF0YSA9IE5VTEw7CisKKwlpZiAoIWRlYy0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCWRhdGEgPSBjb2RlY19tbV92bWFwKGRlYy0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQlkZWMtPmNodW5rLT5vZmZzZXQsIHNpemUpOworCWVsc2UKKwkJZGF0YSA9ICgodTggKilkZWMtPmNodW5rLT5ibG9jay0+c3RhcnRfdmlydCkgKworCQkJZGVjLT5jaHVuay0+b2Zmc2V0OworCisJZm9yIChqaiA9IDA7IGpqIDwgc2l6ZTsgamorKykKKwkJc3VtICs9IGRhdGFbampdOworCisJaWYgKCFkZWMtPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQljb2RlY19tbV91bm1hcF9waHlhZGRyKGRhdGEpOworCXJldHVybiBzdW07Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfZGF0YShzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjLCBpbnQgc2l6ZSkKK3sKKwlpbnQgamo7CisJdTggKmRhdGEgPSBOVUxMOworCWludCBwYWRkaW5nX3NpemUgPSBkZWMtPmNodW5rLT5vZmZzZXQgJgorCQkoVkRFQ19GSUZPX0FMSUdOIC0gMSk7CisKKwlpZiAoIWRlYy0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCWRhdGEgPSBjb2RlY19tbV92bWFwKGRlYy0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQlkZWMtPmNodW5rLT5vZmZzZXQsIHNpemUpOworCWVsc2UKKwkJZGF0YSA9ICgodTggKilkZWMtPmNodW5rLT5ibG9jay0+c3RhcnRfdmlydCkgKworCQkJZGVjLT5jaHVuay0+b2Zmc2V0OworCisJYXZzMl9wcmludChkZWMsIDAsICJwYWRkaW5nOiAiKTsKKwlmb3IgKGpqID0gcGFkZGluZ19zaXplOyBqaiA+IDA7IGpqLS0pCisJCWF2czJfcHJpbnRfY29udChkZWMsCisJCQkwLAorCQkJIiUwMnggIiwgKihkYXRhIC0gamopKTsKKwlhdnMyX3ByaW50X2NvbnQoZGVjLCAwLCAiZGF0YSBhZHIgJXBcbiIsCisJCWRhdGEpOworCisJZm9yIChqaiA9IDA7IGpqIDwgc2l6ZTsgamorKykgeworCQlpZiAoKGpqICYgMHhmKSA9PSAwKQorCQkJYXZzMl9wcmludChkZWMsCisJCQkJMCwKKwkJCQkiJTA2eDoiLCBqaik7CisJCWF2czJfcHJpbnRfY29udChkZWMsCisJCQkwLAorCQkJIiUwMnggIiwgZGF0YVtqal0pOworCQlpZiAoKChqaiArIDEpICYgMHhmKSA9PSAwKQorCQkJYXZzMl9wcmludChkZWMsCisJCQkgMCwKKwkJCQkiXG4iKTsKKwl9CisJYXZzMl9wcmludChkZWMsCisJIDAsCisJCSJcbiIpOworCisJaWYgKCFkZWMtPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQljb2RlY19tbV91bm1hcF9waHlhZGRyKGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBhdnMyX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMgPSBjb250YWluZXJfb2Yod29yaywKKwkJc3RydWN0IEFWUzJEZWNvZGVyX3MsIHdvcmspOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGRlYyk7CisJLyogZmluaXNoZWQgZGVjb2Rpbmcgb25lIGZyYW1lIG9yIGVycm9yLAorCSAqIG5vdGlmeSB2ZGVjIGNvcmUgdG8gc3dpdGNoIGNvbnRleHQKKwkgKi8KKwlhdnMyX3ByaW50KGRlYywgUFJJTlRfRkxBR19WREVDX0RFVEFJTCwKKwkJIiVzIGRlY19yZXN1bHQgJWQgJXggJXggJXhcbiIsCisJCV9fZnVuY19fLAorCQlkZWMtPmRlY19yZXN1bHQsCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9MRVZFTCksCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9XUl9QVFIpLAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSKSk7CisKKwlpZiAoKChkZWMtPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9HRVRfREFUQSkgfHwKKwkJKGRlYy0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0dFVF9EQVRBX1JFVFJZKSkKKwkJJiYgKGh3X3RvX3ZkZWMoZGVjKS0+bmV4dF9zdGF0dXMgIT0KKwkJVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEKSkgeworCQlpZiAoIXZkZWNfaGFzX21vcmVfaW5wdXQodmRlYykpIHsKKwkJCWRlYy0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRU9TOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZkZWMtPndvcmspOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKGRlYy0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0dFVF9EQVRBKSB7CisJCQlhdnMyX3ByaW50KGRlYywgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCQkiJXMgREVDX1JFU1VMVF9HRVRfREFUQSAleCAleCAleFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fTEVWRUwpLAorCQkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9XUl9QVFIpLAorCQkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIpKTsKKwkJCXZkZWNfdmZyYW1lX2RpcnR5KHZkZWMsIGRlYy0+Y2h1bmspOworCQkJdmRlY19jbGVhbl9pbnB1dCh2ZGVjKTsKKwkJfQorCisJCWlmIChnZXRfZnJlZV9idWZfY291bnQoZGVjKSA+PQorCQkJcnVuX3JlYWR5X21pbl9idWZfbnVtKSB7CisJCQlpbnQgcjsKKwkJCWludCBkZWNvZGVfc2l6ZTsKKwkJCXIgPSB2ZGVjX3ByZXBhcmVfaW5wdXQodmRlYywgJmRlYy0+Y2h1bmspOworCQkJaWYgKHIgPCAwKSB7CisJCQkJZGVjLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9HRVRfREFUQV9SRVRSWTsKKworCQkJCWF2czJfcHJpbnQoZGVjLAorCQkJCQlQUklOVF9GTEFHX1ZERUNfREVUQUlMLAorCQkJCQkiYW12ZGVjX3ZoMjY1OiBJbnN1ZmZpY2llbnQgZGF0YVxuIik7CisKKwkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmRlYy0+d29yayk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJZGVjLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9OT05FOworCQkJYXZzMl9wcmludChkZWMsIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkJIiVzOiBjaHVuayBzaXplIDB4JXggc3VtIDB4JXhcbiIsCisJCQkJX19mdW5jX18sIHIsCisJCQkJKGRlYnVnICYgUFJJTlRfRkxBR19WREVDX1NUQVRVUykgPworCQkJCWdldF9kYXRhX2NoZWNrX3N1bShkZWMsIHIpIDogMAorCQkJCSk7CisJCQlpZiAoZGVidWcgJiBQUklOVF9GTEFHX1ZERUNfREFUQSkKKwkJCQlkdW1wX2RhdGEoZGVjLCBkZWMtPmNodW5rLT5zaXplKTsKKworCQkJZGVjb2RlX3NpemUgPSBkZWMtPmNodW5rLT5zaXplICsKKwkJCQkoZGVjLT5jaHVuay0+b2Zmc2V0ICYgKFZERUNfRklGT19BTElHTiAtIDEpKTsKKworCQkJV1JJVEVfVlJFRyhIRVZDX0RFQ09ERV9TSVpFLAorCQkJCVJFQURfVlJFRyhIRVZDX0RFQ09ERV9TSVpFKSArIGRlY29kZV9zaXplKTsKKworCQkJdmRlY19lbmFibGVfaW5wdXQodmRlYyk7CisKKwkJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgQVZTMl9BQ1RJT05fRE9ORSk7CisKKwkJCXN0YXJ0X3Byb2Nlc3NfdGltZShkZWMpOworCisJCX0gZWxzZXsKKwkJCWRlYy0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfR0VUX0RBVEFfUkVUUlk7CisKKwkJCWF2czJfcHJpbnQoZGVjLCBQUklOVF9GTEFHX1ZERUNfREVUQUlMLAorCQkJCSJhbXZkZWNfdmgyNjU6IEluc3VmZmljaWVudCBkYXRhXG4iKTsKKworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZkZWMtPndvcmspOworCQl9CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKGRlYy0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0RPTkUpIHsKKwkJLyogaWYgKCFkZWMtPmN0eF92YWxpZCkKKwkJCWRlYy0+Y3R4X3ZhbGlkID0gMTsgKi8KKwkJZGVjLT5zbGljZV9pZHgrKzsKKwkJZGVjLT5mcmFtZV9jb3VudCsrOworCQlkZWMtPnByb2Nlc3Nfc3RhdGUgPSBQUk9DX1NUQVRFX0lOSVQ7CisJCWRlY29kZV9mcmFtZV9jb3VudFtkZWMtPmluZGV4XSA9IGRlYy0+ZnJhbWVfY291bnQ7CisKKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwkJaWYgKGRlYy0+bW11X2VuYWJsZSkKKwkJCWRlYy0+dXNlZF80a19udW0gPSAoUkVBRF9WUkVHKEhFVkNfU0FPX01NVV9TVEFUVVMpID4+IDE2KTsKKyNlbmRpZgorCQlhdnMyX3ByaW50KGRlYywgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCSIlcyAoPT09PiAlZCkgZGVjX3Jlc3VsdCAlZCAleCAleCAleCBzaGlmdGJ5dGVzIDB4JXggZGVjYnl0ZXMgMHgleFxuIiwKKwkJCV9fZnVuY19fLAorCQkJZGVjLT5mcmFtZV9jb3VudCwKKwkJCWRlYy0+ZGVjX3Jlc3VsdCwKKwkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9MRVZFTCksCisJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fV1JfUFRSKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIpLAorCQkJUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCksCisJCQlSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKSAtCisJCQlkZWMtPnN0YXJ0X3NoaWZ0X2J5dGVzCisJCQkpOworCQl2ZGVjX3ZmcmFtZV9kaXJ0eShod190b192ZGVjKGRlYyksIGRlYy0+Y2h1bmspOworCX0gZWxzZSBpZiAoZGVjLT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfQUdBSU4pIHsKKwkJLyoKKwkJCXN0cmVhbSBiYXNlOiBzdHJlYW0gYnVmIGVtcHR5IG9yIHRpbWVvdXQKKwkJCWZyYW1lIGJhc2U6IHZkZWNfcHJlcGFyZV9pbnB1dCBmYWlsCisJCSovCisJCWlmICghdmRlY19oYXNfbW9yZV9pbnB1dCh2ZGVjKSkgeworCQkJZGVjLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9FT1M7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmRlYy0+d29yayk7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgaWYgKGRlYy0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0VPUykgeworCQlhdnMyX3ByaW50KGRlYywgMCwKKwkJCSIlczogZW5kIG9mIHN0cmVhbVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJZGVjLT5lb3MgPSAxOworCQlpZiAoIGRlYy0+YXZzMl9kZWMuaGMuY3VyX3BpYyAhPSBOVUxMKSB7CisJCQljaGVja19waWNfZXJyb3IoZGVjLCBkZWMtPmF2czJfZGVjLmhjLmN1cl9waWMpOworCQkJYXZzMl9wb3N0X3Byb2Nlc3MoJmRlYy0+YXZzMl9kZWMpOworCQkJYXZzMl9wcmVwYXJlX2Rpc3BsYXlfYnVmKGRlYyk7CisJCX0KKwkJdmRlY192ZnJhbWVfZGlydHkoaHdfdG9fdmRlYyhkZWMpLCBkZWMtPmNodW5rKTsKKwl9IGVsc2UgaWYgKGRlYy0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0ZPUkNFX0VYSVQpIHsKKwkJYXZzMl9wcmludChkZWMsIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkiJXM6IGZvcmNlIGV4aXRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWlmIChkZWMtPnN0YXQgJiBTVEFUX1ZERUNfUlVOKSB7CisJCQlhbWhldmNfc3RvcCgpOworCQkJZGVjLT5zdGF0ICY9IH5TVEFUX1ZERUNfUlVOOworCQl9CisKKwkJaWYgKGRlYy0+c3RhdCAmIFNUQVRfSVNSX1JFRykgeworCQkJaWYgKCFkZWMtPm1faW5zX2ZsYWcpCisJCQkJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9NQk9YMF9NQVNLLCAwKTsKKwkJCXZkZWNfZnJlZV9pcnEoVkRFQ19JUlFfMCwgKHZvaWQgKilkZWMpOworCQkJZGVjLT5zdGF0ICY9IH5TVEFUX0lTUl9SRUc7CisJCX0KKwl9CisKKwlpZiAoZGVjLT5zdGF0ICYgU1RBVF9USU1FUl9BUk0pIHsKKwkJZGVsX3RpbWVyX3N5bmMoJmRlYy0+dGltZXIpOworCQlkZWMtPnN0YXQgJj0gflNUQVRfVElNRVJfQVJNOworCX0KKwkvKiBtYXJrIGl0c2VsZiBoYXMgYWxsIEhXIHJlc291cmNlIHJlbGVhc2VkIGFuZCBpbnB1dCByZWxlYXNlZCAqLworCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0xKQorCQl2ZGVjX2NvcmVfZmluaXNoX3J1bih2ZGVjLCBDT1JFX01BU0tfSEVWQyk7CisJZWxzZQorCQl2ZGVjX2NvcmVfZmluaXNoX3J1bih2ZGVjLCBDT1JFX01BU0tfVkRFQ18xIHwgQ09SRV9NQVNLX0hFVkMpOworCisJaWYgKGRlYy0+dmRlY19jYikKKwkJZGVjLT52ZGVjX2NiKGh3X3RvX3ZkZWMoZGVjKSwgZGVjLT52ZGVjX2NiX2FyZyk7Cit9CisKK3N0YXRpYyBpbnQgYXZzMl9od19jdHhfcmVzdG9yZShzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCS8qIG5ldyB0byBkbyAuLi4gKi8KKwl2YXZzMl9wcm90X2luaXQoZGVjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcnVuX3JlYWR5KHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjID0KKwkJKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICopdmRlYy0+cHJpdmF0ZTsKKwlpbnQgdHZwID0gdmRlY19zZWN1cmUoaHdfdG9fdmRlYyhkZWMpKSA/CisJCUNPREVDX01NX0ZMQUdTX1RWUCA6IDA7CisJdW5zaWduZWQgbG9uZyByZXQgPSAwOworCWF2czJfcHJpbnQoZGVjLAorCQlQUklOVF9GTEFHX1ZERUNfREVUQUlMLCAiJXNcclxuIiwgX19mdW5jX18pOworCWlmIChkZWJ1ZyAmIEFWUzJfREJHX1BJQ19MRUFLX1dBSVQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoZGVjLT5lb3MpCisJCXJldHVybiByZXQ7CisJaWYgKCFkZWMtPmZpcnN0X3NjX2NoZWNrZWQpIHsKKwkJaW50IHNpemUgPSBkZWNvZGVyX21tdV9ib3hfc2NfY2hlY2soZGVjLT5tbXVfYm94LCB0dnApOworCQlkZWMtPmZpcnN0X3NjX2NoZWNrZWQgPSAxOworCQlhdnMyX3ByaW50KGRlYywgMCwgInZhdnMyIGNhY2hlZD0lZCAgbmVlZF9zaXplPSVkIHNwZWVkPSAlZCBtc1xuIiwKKwkJCXNpemUsIChkZWMtPm5lZWRfY2FjaGVfc2l6ZSA+PiBQQUdFX1NISUZUKSwKKwkJCQkJKGludCkoZ2V0X2ppZmZpZXNfNjQoKSAtIGRlYy0+c2Nfc3RhcnRfdGltZSkgKiAxMDAwL0haKTsKKwl9CisKKwlpZiAoZGVjLT5uZXh0X2FnYWluX2ZsYWcgJiYKKwkJKCF2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpKSkgeworCQl1MzIgcGFyc2VyX3dyX3B0ciA9CisJCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApOworCQlpZiAocGFyc2VyX3dyX3B0ciA+PSBkZWMtPnByZV9wYXJzZXJfd3JfcHRyICYmCisJCQkocGFyc2VyX3dyX3B0ciAtIGRlYy0+cHJlX3BhcnNlcl93cl9wdHIpIDwKKwkJCWFnYWluX3RocmVzaG9sZCkgeworCQkJaW50IHIgPSB2ZGVjX3N5bmNfaW5wdXQodmRlYyk7CisJCQlhdnMyX3ByaW50KGRlYywKKwkJCVBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsICIlcyBidWYgbGVsdmVsOiV4XG4iLCBfX2Z1bmNfXywgcik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKy8qCisJaWYgKHZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpICYmIChkZWMtPnBpY19saXN0X2luaXRfZmxhZyA9PSAwKQorCQkmJiBwcmVfZGVjb2RlX2J1Zl9sZXZlbCAhPSAwKSB7CisJCXUzMiBycCwgd3AsIGxldmVsOworCisJCXJwID0gU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3JwKTsKKwkJd3AgPSBTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApOworCQlpZiAod3AgPCBycCkKKwkJCWxldmVsID0gdmRlYy0+aW5wdXQuc2l6ZSArIHdwIC0gcnA7CisJCWVsc2UKKwkJCWxldmVsID0gd3AgLSBycDsKKworCQlpZiAobGV2ZWwgPCBwcmVfZGVjb2RlX2J1Zl9sZXZlbCkKKwkJCXJldHVybiAwOworCX0KKyovCisKKwlpZiAoKGRlYy0+cGljX2xpc3RfaW5pdF9mbGFnID09IDApIHx8CisJCWdldF9mcmVlX2J1Zl9jb3VudChkZWMpID49CisJCXJ1bl9yZWFkeV9taW5fYnVmX251bSkKKwkJcmV0ID0gMTsKKyNpZmRlZiBDT05TVFJBSU5fTUFYX0JVRl9OVU0KKwlpZiAoZGVjLT5waWNfbGlzdF9pbml0X2ZsYWcpIHsKKwkJaWYgKHJ1bl9yZWFkeV9tYXhfdmZfb25seV9udW0gPiAwICYmCisJCQlnZXRfdmZfcmVmX29ubHlfYnVmX2NvdW50KGRlYykgPj0KKwkJCXJ1bl9yZWFkeV9tYXhfdmZfb25seV9udW0KKwkJCSkKKwkJCXJldCA9IDA7CisJCWlmIChydW5fcmVhZHlfZGlzcGxheV9xX251bSA+IDAgJiYKKwkJCWtmaWZvX2xlbigmZGVjLT5kaXNwbGF5X3EpID49CisJCQlydW5fcmVhZHlfZGlzcGxheV9xX251bSkKKwkJCXJldCA9IDA7CisKKwkJaWYgKHJ1bl9yZWFkeV9tYXhfYnVmX251bSA9PSAweGZmICYmCisJCQlnZXRfdXNlZF9idWZfY291bnQoZGVjKSA+PQorCQkJZGVjLT5hdnMyX2RlYy5yZWZfbWF4YnVmZmVyKQorCQkJcmV0ID0gMDsKKwkJZWxzZSBpZiAocnVuX3JlYWR5X21heF9idWZfbnVtICYmCisJCQlnZXRfdXNlZF9idWZfY291bnQoZGVjKSA+PQorCQkJcnVuX3JlYWR5X21heF9idWZfbnVtKQorCQkJcmV0ID0gMDsKKwl9CisjZW5kaWYKKwlpZiAocmV0KQorCQlub3RfcnVuX3JlYWR5W2RlYy0+aW5kZXhdID0gMDsKKwllbHNlCisJCW5vdF9ydW5fcmVhZHlbZGVjLT5pbmRleF0rKzsKKworCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkKKwkJcmV0dXJuIHJldCA/IENPUkVfTUFTS19IRVZDIDogMDsKKwllbHNlCisJCXJldHVybiByZXQgPyAoQ09SRV9NQVNLX1ZERUNfMSB8IENPUkVfTUFTS19IRVZDKSA6IDA7Cit9CisKK3N0YXRpYyB2b2lkIHJ1bihzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1bnNpZ25lZCBsb25nIG1hc2ssCisJdm9pZCAoKmNhbGxiYWNrKShzdHJ1Y3QgdmRlY19zICosIHZvaWQgKiksIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjID0KKwkJKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICopdmRlYy0+cHJpdmF0ZTsKKwlpbnQgcjsKKworCXJ1bl9jb3VudFtkZWMtPmluZGV4XSsrOworCWRlYy0+dmRlY19jYl9hcmcgPSBhcmc7CisJZGVjLT52ZGVjX2NiID0gY2FsbGJhY2s7CisJLyogZGVjLT5jaHVuayA9IHZkZWNfcHJlcGFyZV9pbnB1dCh2ZGVjKTsgKi8KKwloZXZjX3Jlc2V0X2NvcmUodmRlYyk7CisKKwlpZiAodmRlY19zdHJlYW1fYmFzZWQodmRlYykpIHsKKwkJZGVjLT5wcmVfcGFyc2VyX3dyX3B0ciA9CisJCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApOworCQlkZWMtPm5leHRfYWdhaW5fZmxhZyA9IDA7CisJfQorCisJciA9IHZkZWNfcHJlcGFyZV9pbnB1dCh2ZGVjLCAmZGVjLT5jaHVuayk7CisJaWYgKHIgPCAwKSB7CisJCWlucHV0X2VtcHR5W2RlYy0+aW5kZXhdKys7CisKKwkJZGVjLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKworCQlhdnMyX3ByaW50KGRlYywgUFJJTlRfRkxBR19WREVDX0RFVEFJTCwKKwkJCSJhbW12ZGVjX3ZoMjY1OiBJbnN1ZmZpY2llbnQgZGF0YVxuIik7CisKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZkZWMtPndvcmspOworCQlyZXR1cm47CisJfQorCWlucHV0X2VtcHR5W2RlYy0+aW5kZXhdID0gMDsKKwlkZWMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX05PTkU7CisJZGVjLT5zdGFydF9zaGlmdF9ieXRlcyA9IFJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpOworCisJaWYgKGRlYnVnICYgUFJJTlRfRkxBR19WREVDX1NUQVRVUykgeworCQlpbnQgaWk7CisJCWF2czJfcHJpbnQoZGVjLCAwLAorCQkJIiVzICglZCk6IHNpemUgMHgleCAoMHgleCAweCV4KSBzdW0gMHgleCAoJXggJXggJXggJXggJXgpIGJ5dGVzIDB4JXgiLAorCQkJX19mdW5jX18sCisJCQlkZWMtPmZyYW1lX2NvdW50LCByLAorCQkJZGVjLT5jaHVuayA/IGRlYy0+Y2h1bmstPnNpemUgOiAwLAorCQkJZGVjLT5jaHVuayA/IGRlYy0+Y2h1bmstPm9mZnNldCA6IDAsCisJCQlkZWMtPmNodW5rID8gKCh2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpICYmCisJCQkoZGVidWcgJiBQUklOVF9GTEFHX1ZERUNfU1RBVFVTKSkgPworCQkJZ2V0X2RhdGFfY2hlY2tfc3VtKGRlYywgcikgOiAwKSA6IDAsCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9TVEFSVF9BRERSKSwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0VORF9BRERSKSwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0xFVkVMKSwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1dSX1BUUiksCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIpLAorCQlkZWMtPnN0YXJ0X3NoaWZ0X2J5dGVzKTsKKwkJaWYgKHZkZWNfZnJhbWVfYmFzZWQodmRlYykgJiYgZGVjLT5jaHVuaykgeworCQkJdTggKmRhdGEgPSBOVUxMOworCQkJaWYgKCFkZWMtPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQkJCWRhdGEgPSBjb2RlY19tbV92bWFwKGRlYy0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQkJCWRlYy0+Y2h1bmstPm9mZnNldCwgOCk7CisJCQllbHNlCisJCQkJZGF0YSA9ICgodTggKilkZWMtPmNodW5rLT5ibG9jay0+c3RhcnRfdmlydCkgKworCQkJCQlkZWMtPmNodW5rLT5vZmZzZXQ7CisKKwkJCWF2czJfcHJpbnRfY29udChkZWMsIDAsICJkYXRhIGFkciAlcDoiLAorCQkJCWRhdGEpOworCQkJZm9yIChpaSA9IDA7IGlpIDwgODsgaWkrKykKKwkJCQlhdnMyX3ByaW50X2NvbnQoZGVjLCAwLCAiJTAyeCAiLAorCQkJCQlkYXRhW2lpXSk7CisJCQlpZiAoIWRlYy0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcihkYXRhKTsKKwkJfQorCQlhdnMyX3ByaW50X2NvbnQoZGVjLCAwLCAiXHJcbiIpOworCX0KKwlpZiAodmRlYy0+bWNfbG9hZGVkKSB7CisJCS8qZmlybXdhcmUgaGF2ZSBsb2FkIGJlZm9yZSwKKwkJICBhbmQgbm90IGNoYW5nZXMgdG8gYW5vdGhlci4KKwkJICBpZ25vcmUgcmVsb2FkLgorCQkqLworCX0gZWxzZSBpZiAoYW1oZXZjX2xvYWRtY19leChWRk9STUFUX0FWUzIsIE5VTEwsIGRlYy0+ZnctPmRhdGEpIDwgMCkgeworCQl2ZGVjLT5tY19sb2FkZWQgPSAwOworCQlhbWhldmNfZGlzYWJsZSgpOworCQlhdnMyX3ByaW50KGRlYywgMCwKKwkJCSIlczogRXJyb3IgYW12ZGVjX2xvYWRtYyBmYWlsXG4iLCBfX2Z1bmNfXyk7CisJCWRlYy0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRk9SQ0VfRVhJVDsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZkZWMtPndvcmspOworCQlyZXR1cm47CisJfSBlbHNlIHsKKwkJdmRlYy0+bWNfbG9hZGVkID0gMTsKKwkJdmRlYy0+bWNfdHlwZSA9IFZGT1JNQVRfQVZTMjsKKwl9CisKKworCWlmIChhdnMyX2h3X2N0eF9yZXN0b3JlKGRlYykgPCAwKSB7CisJCXZkZWNfc2NoZWR1bGVfd29yaygmZGVjLT53b3JrKTsKKwkJcmV0dXJuOworCX0KKworCXZkZWNfZW5hYmxlX2lucHV0KHZkZWMpOworCisJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCBBVlMyX1NFQVJDSF9ORVdfUElDKTsKKworCWlmICh2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpICYmIGRlYy0+Y2h1bmspIHsKKwkJaWYgKGRlYnVnICYgUFJJTlRfRkxBR19WREVDX0RBVEEpCisJCQlkdW1wX2RhdGEoZGVjLCBkZWMtPmNodW5rLT5zaXplKTsKKworCQlXUklURV9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCwgMCk7CisJCXIgPSBkZWMtPmNodW5rLT5zaXplICsKKwkJCShkZWMtPmNodW5rLT5vZmZzZXQgJiAoVkRFQ19GSUZPX0FMSUdOIC0gMSkpOworCQlpZiAodmRlYy0+bXZmcm0pCisJCQl2ZGVjLT5tdmZybS0+ZnJhbWVfc2l6ZSA9IGRlYy0+Y2h1bmstPnNpemU7CisJfQorCisJV1JJVEVfVlJFRyhIRVZDX0RFQ09ERV9TSVpFLCByKTsKKwlXUklURV9WUkVHKEhFVkNfREVDT0RFX0NPVU5ULCBkZWMtPnNsaWNlX2lkeCk7CisJZGVjLT5pbml0X2ZsYWcgPSAxOworCisJYXZzMl9wcmludChkZWMsIFBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsCisJCSIlczogc3RhcnQgaGV2YyAoJXggJXggJXgpXG4iLAorCQlfX2Z1bmNfXywKKwkJUkVBRF9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcpLAorCQlSRUFEX1ZSRUcoSEVWQ19NUENfRSksCisJCVJFQURfVlJFRyhIRVZDX01QU1IpKTsKKworCXN0YXJ0X3Byb2Nlc3NfdGltZShkZWMpOworCW1vZF90aW1lcigmZGVjLT50aW1lciwgamlmZmllcyk7CisJZGVjLT5zdGF0IHw9IFNUQVRfVElNRVJfQVJNOworCWRlYy0+c3RhdCB8PSBTVEFUX0lTUl9SRUc7CisJaWYgKHZkZWMtPm12ZnJtKQorCQl2ZGVjLT5tdmZybS0+aHdfZGVjb2RlX3N0YXJ0ID0gbG9jYWxfY2xvY2soKTsKKwlhbWhldmNfc3RhcnQoKTsKKwlkZWMtPnN0YXQgfD0gU1RBVF9WREVDX1JVTjsKK30KKworc3RhdGljIHZvaWQgcmVzZXQoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKworCXN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMgPQorCQkoc3RydWN0IEFWUzJEZWNvZGVyX3MgKil2ZGVjLT5wcml2YXRlOworCisJYXZzMl9wcmludChkZWMsCisJCVBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsICIlc1xyXG4iLCBfX2Z1bmNfXyk7CisKK30KKworc3RhdGljIGlycXJldHVybl90IGF2czJfaXJxX2NiKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBpcnEpCit7CisJc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYyA9CisJCShzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqKXZkZWMtPnByaXZhdGU7CisJcmV0dXJuIHZhdnMyX2lzcigwLCBkZWMpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYXZzMl90aHJlYWRlZF9pcnFfY2Ioc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGlycSkKK3sKKwlzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjID0KKwkJKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICopdmRlYy0+cHJpdmF0ZTsKKwlyZXR1cm4gdmF2czJfaXNyX3RocmVhZF9mbigwLCBkZWMpOworfQorCitzdGF0aWMgdm9pZCBhdnMyX2R1bXBfc3RhdGUoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjID0KKwkJKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICopdmRlYy0+cHJpdmF0ZTsKKwlpbnQgaTsKKwlhdnMyX3ByaW50KGRlYywgMCwgIj09PT09PSAlc1xuIiwgX19mdW5jX18pOworCisJYXZzMl9wcmludChkZWMsIDAsCisJCSJ3aWR0aC9oZWlnaHQgKCVkLyVkKSwgdXNlZF9idWZfbnVtICVkXG4iLAorCQlkZWMtPmF2czJfZGVjLmltZy53aWR0aCwKKwkJZGVjLT5hdnMyX2RlYy5pbWcuaGVpZ2h0LAorCQlkZWMtPnVzZWRfYnVmX251bQorCQkpOworCisJYXZzMl9wcmludChkZWMsIDAsCisJCSJpc19mcmFtZWJhc2UoJWQpLCBlb3MgJWQsIGRlY19yZXN1bHQgMHgleCBkZWNfZnJtICVkIGRpc3BfZnJtICVkIHJ1biAlZCBub3RfcnVuX3JlYWR5ICVkIGlucHV0X2VtcHR5ICVkXG4iLAorCQlpbnB1dF9mcmFtZV9iYXNlZCh2ZGVjKSwKKwkJZGVjLT5lb3MsCisJCWRlYy0+ZGVjX3Jlc3VsdCwKKwkJZGVjb2RlX2ZyYW1lX2NvdW50W2RlYy0+aW5kZXhdLAorCQlkaXNwbGF5X2ZyYW1lX2NvdW50W2RlYy0+aW5kZXhdLAorCQlydW5fY291bnRbZGVjLT5pbmRleF0sCisJCW5vdF9ydW5fcmVhZHlbZGVjLT5pbmRleF0sCisJCWlucHV0X2VtcHR5W2RlYy0+aW5kZXhdCisJCSk7CisKKwlpZiAodmZfZ2V0X3JlY2VpdmVyKHZkZWMtPnZmX3Byb3ZpZGVyX25hbWUpKSB7CisJCWVudW0gcmVjZXZpdmVyX3N0YXJ0X2Ugc3RhdGUgPQorCQl2Zl9ub3RpZnlfcmVjZWl2ZXIodmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9RVVJFWV9TVEFURSwKKwkJCU5VTEwpOworCQlhdnMyX3ByaW50KGRlYywgMCwKKwkJCSJcbnJlY2VpdmVyKCVzKSBzdGF0ZSAlZFxuIiwKKwkJCXZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQlzdGF0ZSk7CisJfQorCisJYXZzMl9wcmludChkZWMsIDAsCisJIiVzLCBuZXdxKCVkLyVkKSwgZGlzcHEoJWQvJWQpLCB2ZiBwcmVwYXJlL2dldC9wdXQgKCVkLyVkLyVkKSwgZnJlZV9idWZfY291bnQgJWQgKG1pbiAlZCBmb3IgcnVuX3JlYWR5KVxuIiwKKwlfX2Z1bmNfXywKKwlrZmlmb19sZW4oJmRlYy0+bmV3ZnJhbWVfcSksCisJVkZfUE9PTF9TSVpFLAorCWtmaWZvX2xlbigmZGVjLT5kaXNwbGF5X3EpLAorCVZGX1BPT0xfU0laRSwKKwlkZWMtPnZmX3ByZV9jb3VudCwKKwlkZWMtPnZmX2dldF9jb3VudCwKKwlkZWMtPnZmX3B1dF9jb3VudCwKKwlnZXRfZnJlZV9idWZfY291bnQoZGVjKSwKKwlydW5fcmVhZHlfbWluX2J1Zl9udW0KKwkpOworCisJZHVtcF9waWNfbGlzdChkZWMpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9CVUZfTlVNOyBpKyspIHsKKwkJYXZzMl9wcmludChkZWMsIDAsCisJCQkibXZfQnVmKCVkKSBzdGFydF9hZHIgMHgleCBzaXplIDB4JXggdXNlZCAlZFxuIiwKKwkJCWksCisJCQlkZWMtPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciwKKwkJCWRlYy0+bV9tdl9CVUZbaV0uc2l6ZSwKKwkJCWRlYy0+bV9tdl9CVUZbaV0udXNlZF9mbGFnKTsKKwl9CisKKwlhdnMyX3ByaW50KGRlYywgMCwKKwkJIkhFVkNfREVDX1NUQVRVU19SRUc9MHgleFxuIiwKKwkJUkVBRF9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcpKTsKKwlhdnMyX3ByaW50KGRlYywgMCwKKwkJIkhFVkNfTVBDX0U9MHgleFxuIiwKKwkJUkVBRF9WUkVHKEhFVkNfTVBDX0UpKTsKKwlhdnMyX3ByaW50KGRlYywgMCwKKwkJIkRFQ09ERV9NT0RFPTB4JXhcbiIsCisJCVJFQURfVlJFRyhERUNPREVfTU9ERSkpOworCWF2czJfcHJpbnQoZGVjLCAwLAorCQkiTkFMX1NFQVJDSF9DVEw9MHgleFxuIiwKKwkJUkVBRF9WUkVHKE5BTF9TRUFSQ0hfQ1RMKSk7CisJYXZzMl9wcmludChkZWMsIDAsCisJCSJIRVZDX1BBUlNFUl9MQ1VfU1RBUlQ9MHgleFxuIiwKKwkJUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0xDVV9TVEFSVCkpOworCWF2czJfcHJpbnQoZGVjLCAwLAorCQkiSEVWQ19ERUNPREVfU0laRT0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19ERUNPREVfU0laRSkpOworCWF2czJfcHJpbnQoZGVjLCAwLAorCQkiSEVWQ19TSElGVF9CWVRFX0NPVU5UPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpKTsKKwlhdnMyX3ByaW50KGRlYywgMCwKKwkJIkhFVkNfU1RSRUFNX1NUQVJUX0FERFI9MHgleFxuIiwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1NUQVJUX0FERFIpKTsKKwlhdnMyX3ByaW50KGRlYywgMCwKKwkJIkhFVkNfU1RSRUFNX0VORF9BRERSPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9FTkRfQUREUikpOworCWF2czJfcHJpbnQoZGVjLCAwLAorCQkiSEVWQ19TVFJFQU1fTEVWRUw9MHgleFxuIiwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0xFVkVMKSk7CisJYXZzMl9wcmludChkZWMsIDAsCisJCSJIRVZDX1NUUkVBTV9XUl9QVFI9MHgleFxuIiwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1dSX1BUUikpOworCWF2czJfcHJpbnQoZGVjLCAwLAorCQkiSEVWQ19TVFJFQU1fUkRfUFRSPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIpKTsKKwlhdnMyX3ByaW50KGRlYywgMCwKKwkJIlBBUlNFUl9WSURFT19SUD0weCV4XG4iLAorCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfcnApKTsKKwlhdnMyX3ByaW50KGRlYywgMCwKKwkJIlBBUlNFUl9WSURFT19XUD0weCV4XG4iLAorCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApKTsKKworCWlmIChpbnB1dF9mcmFtZV9iYXNlZCh2ZGVjKSAmJgorCQkoZGVidWcgJiBQUklOVF9GTEFHX1ZERUNfREFUQSkKKwkJKSB7CisJCWludCBqajsKKwkJaWYgKGRlYy0+Y2h1bmsgJiYgZGVjLT5jaHVuay0+YmxvY2sgJiYKKwkJCWRlYy0+Y2h1bmstPnNpemUgPiAwKSB7CisJCQl1OCAqZGF0YSA9IE5VTEw7CisJCQlpZiAoIWRlYy0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQkJZGF0YSA9IGNvZGVjX21tX3ZtYXAoZGVjLT5jaHVuay0+YmxvY2stPnN0YXJ0ICsKKwkJCQkJZGVjLT5jaHVuay0+b2Zmc2V0LCBkZWMtPmNodW5rLT5zaXplKTsKKwkJCWVsc2UKKwkJCQlkYXRhID0gKCh1OCAqKWRlYy0+Y2h1bmstPmJsb2NrLT5zdGFydF92aXJ0KSArCisJCQkJCWRlYy0+Y2h1bmstPm9mZnNldDsKKwkJCWF2czJfcHJpbnQoZGVjLCAwLAorCQkJCSJmcmFtZSBkYXRhIHNpemUgMHgleFxuIiwKKwkJCQlkZWMtPmNodW5rLT5zaXplKTsKKwkJCWZvciAoamogPSAwOyBqaiA8IGRlYy0+Y2h1bmstPnNpemU7IGpqKyspIHsKKwkJCQlpZiAoKGpqICYgMHhmKSA9PSAwKQorCQkJCQlhdnMyX3ByaW50KGRlYywgMCwKKwkJCQkJCSIlMDZ4OiIsIGpqKTsKKwkJCQlhdnMyX3ByaW50X2NvbnQoZGVjLCAwLAorCQkJCQkiJTAyeCAiLCBkYXRhW2pqXSk7CisJCQkJaWYgKCgoamogKyAxKSAmIDB4ZikgPT0gMCkKKwkJCQkJYXZzMl9wcmludF9jb250KGRlYywgMCwKKwkJCQkJCSJcbiIpOworCQkJfQorCisJCQlpZiAoIWRlYy0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcihkYXRhKTsKKwkJfQorCX0KKworfQorCitzdGF0aWMgaW50IGFtbXZkZWNfYXZzMl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB2ZGVjX3MgKnBkYXRhID0gKihzdHJ1Y3QgdmRlY19zICoqKXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCByZXQ7CisJaW50IGNvbmZpZ192YWw7CisJaW50IGk7CisJc3RydWN0IHZmcmFtZV9jb250ZW50X2xpZ2h0X2xldmVsX3MgY29udGVudF9saWdodF9sZXZlbDsKKwlzdHJ1Y3QgdmZyYW1lX21hc3Rlcl9kaXNwbGF5X2NvbG91cl9zIHZmX2RwOworCS8qc3RydWN0IEJVRl9zIEJVRltNQVhfQlVGX05VTV07Ki8KKwlzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjID0gTlVMTDsKKworCXByX2luZm8oIiVzXG4iLCBfX2Z1bmNfXyk7CisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDVEKSB7CisJCXByX2luZm8oIiVzLCBjaGlwIGlkICVkIGlzIG5vdCBzdXBwb3J0IGF2czJcbiIsCisJCQlfX2Z1bmNfXywgZ2V0X2NwdV9tYWpvcl9pZCgpKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAocGRhdGEgPT0gTlVMTCkgeworCQlwcl9pbmZvKCJcbmFtbXZkZWNfYXZzMiBtZW1vcnkgcmVzb3VyY2UgdW5kZWZpbmVkLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwkvKmRlYyA9IChzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqKWRldm1fa3phbGxvYygmcGRldi0+ZGV2LAorCQlzaXplb2Yoc3RydWN0IEFWUzJEZWNvZGVyX3MpLCBHRlBfS0VSTkVMKTsqLworCW1lbXNldCgmdmZfZHAsIDAsIHNpemVvZihzdHJ1Y3QgdmZyYW1lX21hc3Rlcl9kaXNwbGF5X2NvbG91cl9zKSk7CisJZGVjID0gdnphbGxvYyhzaXplb2Yoc3RydWN0IEFWUzJEZWNvZGVyX3MpKTsKKwlpZiAoZGVjID09IE5VTEwpIHsKKwkJcHJfaW5mbygiXG5hbW12ZGVjX2F2czIgZGV2aWNlIGRhdGEgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaWYgKHBkYXRhLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IEFWUzJfTUFYX0JVRkZFUl9OVU07IGkrKykgeworCQkJZGVjLT5hdnMyX2RlYy5mcm1fcG9vbFtpXS55X2NhbnZhc19pbmRleCA9IC0xOworCQkJZGVjLT5hdnMyX2RlYy5mcm1fcG9vbFtpXS51dl9jYW52YXNfaW5kZXggPSAtMTsKKwkJfQorCX0KKwlwZGF0YS0+cHJpdmF0ZSA9IGRlYzsKKwlwZGF0YS0+ZGVjX3N0YXR1cyA9IHZhdnMyX2RlY19zdGF0dXM7CisjaWZkZWYgSV9PTkxZX1NVUFBPUlQKKwlwZGF0YS0+c2V0X3RyaWNrbW9kZSA9IHZhdnMyX3NldF90cmlja21vZGU7CisjZW5kaWYKKwlwZGF0YS0+cnVuX3JlYWR5ID0gcnVuX3JlYWR5OworCXBkYXRhLT5ydW4gPSBydW47CisJcGRhdGEtPnJlc2V0ID0gcmVzZXQ7CisJcGRhdGEtPmlycV9oYW5kbGVyID0gYXZzMl9pcnFfY2I7CisJcGRhdGEtPnRocmVhZGVkX2lycV9oYW5kbGVyID0gYXZzMl90aHJlYWRlZF9pcnFfY2I7CisJcGRhdGEtPmR1bXBfc3RhdGUgPSBhdnMyX2R1bXBfc3RhdGU7CisKKwkvKgorCSAqIG1lbWNweSgmQlVGWzBdLCAmZGVjLT5tX0JVRlswXSwgc2l6ZW9mKHN0cnVjdCBCVUZfcykgKiBNQVhfQlVGX05VTSk7CisJICogbWVtc2V0KGRlYywgMCwgc2l6ZW9mKHN0cnVjdCBBVlMyRGVjb2Rlcl9zKSk7CisJICogbWVtY3B5KCZkZWMtPm1fQlVGWzBdLCAmQlVGWzBdLCBzaXplb2Yoc3RydWN0IEJVRl9zKSAqIE1BWF9CVUZfTlVNKTsKKwkgKi8KKworCWRlYy0+aW5kZXggPSBwZGV2LT5pZDsKKwlkZWMtPm1faW5zX2ZsYWcgPSAxOworCWlmIChpc19yZG1hX2VuYWJsZSgpKSB7CisJCWRlYy0+cmRtYV9hZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLCBSRE1BX1NJWkUsICZkZWMtPnJkbWFfcGh5X2FkciwgR0ZQX0tFUk5FTCk7CisJCWZvciAoaSA9IDA7IGkgPCBTQ0FMRUxVVF9EQVRBX1dSSVRFX05VTTsgaSsrKSB7CisJCQlkZWMtPnJkbWFfYWRyW2kgKiA0XSA9IEhFVkNfSVFJVF9TQ0FMRUxVVF9XUl9BRERSICYgMHhmZmY7CisJCQlkZWMtPnJkbWFfYWRyW2kgKiA0ICsgMV0gPSBpOworCQkJZGVjLT5yZG1hX2FkcltpICogNCArIDJdID0gSEVWQ19JUUlUX1NDQUxFTFVUX0RBVEEgJiAweGZmZjsKKwkJCWRlYy0+cmRtYV9hZHJbaSAqIDQgKyAzXSA9IDA7CisJCQlpZiAoaSA9PSBTQ0FMRUxVVF9EQVRBX1dSSVRFX05VTSAtIDEpIHsKKwkJCQlkZWMtPnJkbWFfYWRyW2kgKiA0ICsgMl0gPSAoSEVWQ19JUUlUX1NDQUxFTFVUX0RBVEEgJiAweGZmZikgfCAweDIwMDAwOworCQkJfQorCQl9CisJfQorCisJc25wcmludGYoZGVjLT52ZGVjX25hbWUsIHNpemVvZihkZWMtPnZkZWNfbmFtZSksCisJCSJhdnMyLSVkIiwgZGVjLT5pbmRleCk7CisJc25wcmludGYoZGVjLT5wdHNfbmFtZSwgc2l6ZW9mKGRlYy0+cHRzX25hbWUpLAorCQkiJXMtcHRzIiwgZGVjLT52ZGVjX25hbWUpOworCXNucHJpbnRmKGRlYy0+bmV3X3FfbmFtZSwgc2l6ZW9mKGRlYy0+bmV3X3FfbmFtZSksCisJCSIlcy1uZXdmcmFtZV9xIiwgZGVjLT52ZGVjX25hbWUpOworCXNucHJpbnRmKGRlYy0+ZGlzcF9xX25hbWUsIHNpemVvZihkZWMtPmRpc3BfcV9uYW1lKSwKKwkJIiVzLWRpc3BmcmFtZV9xIiwgZGVjLT52ZGVjX25hbWUpOworCisJaWYgKHBkYXRhLT51c2VfdmZtX3BhdGgpIHsKKwkJc25wcmludGYocGRhdGEtPnZmX3Byb3ZpZGVyX25hbWUsIFZERUNfUFJPVklERVJfTkFNRV9TSVpFLAorCQkJVkZNX0RFQ19QUk9WSURFUl9OQU1FKTsKKwkJZGVjLT5mcmFtZWluZm9fZW5hYmxlID0gMTsKKwl9IGVsc2UKKwkJc25wcmludGYocGRhdGEtPnZmX3Byb3ZpZGVyX25hbWUsIFZERUNfUFJPVklERVJfTkFNRV9TSVpFLAorCQkJTVVMVElfSU5TVEFOQ0VfUFJPVklERVJfTkFNRSAiLiUwMngiLCBwZGV2LT5pZCAmIDB4ZmYpOworCisJdmZfcHJvdmlkZXJfaW5pdCgmcGRhdGEtPnZmcmFtZV9wcm92aWRlciwgcGRhdGEtPnZmX3Byb3ZpZGVyX25hbWUsCisJCSZ2YXZzMl92Zl9wcm92aWRlciwgZGVjKTsKKworCWRlYy0+cHJvdmlkZXJfbmFtZSA9IHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBkYXRhKTsKKworCWRlYy0+cGxhdGZvcm1fZGV2ID0gcGRldjsKKwlkZWMtPnZpZGVvX3NpZ25hbF90eXBlID0gMDsKKwlkZWMtPnZpZGVvX29yaV9zaWduYWxfdHlwZSA9IDA7CisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA8IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UWExYKQorCQlkZWMtPnN0YXQgfD0gVlA5X1RSSUdHRVJfRlJBTUVfRU5BQkxFOworCisJaWYgKChkZWJ1ZyAmIElHTk9SRV9QQVJBTV9GUk9NX0NPTkZJRykgPT0gMCAmJiBwZGF0YS0+Y29uZmlnX2xlbikgeworCQkvKnVzZSBwdHIgY29uZmlnIGZvciBkb3ViZWxfd3JpdGVfbW9kZSwgZXRjKi8KKwkJYXZzMl9wcmludChkZWMsIDAsICJwZGF0YS0+Y29uZmlnPSVzXG4iLCBwZGF0YS0+Y29uZmlnKTsKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJhdnMyX2RvdWJsZV93cml0ZV9tb2RlIiwKKwkJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWRlYy0+ZG91YmxlX3dyaXRlX21vZGUgPSBjb25maWdfdmFsOworCQllbHNlCisJCQlkZWMtPmRvdWJsZV93cml0ZV9tb2RlID0gZG91YmxlX3dyaXRlX21vZGU7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJwYXJtX3Y0bF9idWZmZXJfbWFyZ2luIiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJZGVjLT5keW5hbWljX2J1Zl9tYXJnaW4gPSBjb25maWdfdmFsOworCQllbHNlCisJCQlkZWMtPmR5bmFtaWNfYnVmX21hcmdpbiA9IDA7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJzaWRlYmluZF90eXBlIiwKKwkJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWRlYy0+c2lkZWJpbmRfdHlwZSA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJzaWRlYmluZF9jaGFubmVsX2lkIiwKKwkJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWRlYy0+c2lkZWJpbmRfY2hhbm5lbF9pZCA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJIRFJTdGF0aWNJbmZvIiwKKwkJCQkmdmZfZHAucHJlc2VudF9mbGFnKSA9PSAwCisJCQkJJiYgdmZfZHAucHJlc2VudF9mbGFnID09IDEpIHsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtRy54IiwKKwkJCQkJJnZmX2RwLnByaW1hcmllc1swXVswXSk7CisJCQlnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAibUcueSIsCisJCQkJCSZ2Zl9kcC5wcmltYXJpZXNbMF1bMV0pOworCQkJZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm1CLngiLAorCQkJCQkmdmZfZHAucHJpbWFyaWVzWzFdWzBdKTsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtQi55IiwKKwkJCQkJJnZmX2RwLnByaW1hcmllc1sxXVsxXSk7CisJCQlnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAibVIueCIsCisJCQkJCSZ2Zl9kcC5wcmltYXJpZXNbMl1bMF0pOworCQkJZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm1SLnkiLAorCQkJCQkmdmZfZHAucHJpbWFyaWVzWzJdWzFdKTsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtVy54IiwKKwkJCQkJJnZmX2RwLndoaXRlX3BvaW50WzBdKTsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtVy55IiwKKwkJCQkJJnZmX2RwLndoaXRlX3BvaW50WzFdKTsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtTWF4REwiLAorCQkJCQkmdmZfZHAubHVtaW5hbmNlWzBdKTsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtTWluREwiLAorCQkJCQkmdmZfZHAubHVtaW5hbmNlWzFdKTsKKwkJCXZmX2RwLmNvbnRlbnRfbGlnaHRfbGV2ZWwucHJlc2VudF9mbGFnID0gMTsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtTWF4Q0xMIiwKKwkJCQkJJmNvbnRlbnRfbGlnaHRfbGV2ZWwubWF4X2NvbnRlbnQpOworCQkJZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm1NYXhGQUxMIiwKKwkJCQkJJmNvbnRlbnRfbGlnaHRfbGV2ZWwubWF4X3BpY19hdmVyYWdlKTsKKwkJCXZmX2RwLmNvbnRlbnRfbGlnaHRfbGV2ZWwgPSBjb250ZW50X2xpZ2h0X2xldmVsOworCQkJZGVjLT52aWRlb19zaWduYWxfdHlwZSA9ICgxIDw8IDI5KQorCQkJCQl8ICg1IDw8IDI2KQkvKiB1bnNwZWNpZmllZCAqLworCQkJCQl8ICgwIDw8IDI1KQkvKiBsaW1pdCAqLworCQkJCQl8ICgxIDw8IDI0KQkvKiBjb2xvciBhdmFpbGFibGUgKi8KKwkJCQkJfCAoOSA8PCAxNikJLyogMjAyMCAqLworCQkJCQl8ICgxNiA8PCA4KQkvKiAyMDg0ICovCisJCQkJCXwgKDkgPDwgMCk7CS8qIDIwMjAgKi8KKwkJfQorCQlkZWMtPnZmX2RwID0gdmZfZHA7CisJfSBlbHNlIHsKKwkJLypkZWMtPnZhdnMyX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoID0gMDsKKwkJZGVjLT52YXZzMl9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQgPSAwOworCQlkZWMtPnZhdnMyX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgPSAzMDsqLworCQlkZWMtPmRvdWJsZV93cml0ZV9tb2RlID0gZG91YmxlX3dyaXRlX21vZGU7CisJCWRlYy0+ZHluYW1pY19idWZfbWFyZ2luID0gZHluYW1pY19idWZfbnVtX21hcmdpbjsKKwl9CisJdmlkZW9fc2lnbmFsX3R5cGUgPSBkZWMtPnZpZGVvX3NpZ25hbF90eXBlOworCisJaWYgKGRvdWJsZV93cml0ZV9tb2RlKSB7CisJCWRlYy0+ZG91YmxlX3dyaXRlX21vZGUgPSBnZXRfZG91YmxlX3dyaXRlX21vZGUoZGVjKTsKKwl9CisKKwlpZiAoKGRlYy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDEwKSA9PSAwKQorCQlkZWMtPm1tdV9lbmFibGUgPSAxOworCisjaWZkZWYgQVZTMl8xMEJfTU1VX0RXCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDVEKSB7CisJCWRlYy0+ZHdfbW11X2VuYWJsZSA9CisJCQkoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGRlYykgJiAweDIwKSA/IDEgOiAwOworCX0gZWxzZSB7CisJCWRlYy0+ZHdfbW11X2VuYWJsZSA9IDA7CisJfQorI2VuZGlmCisJaWYgKGFtdmRlY19hdnMyX21tdV9pbml0KGRlYykgPCAwKSB7CisJCXByX2VycigiYXZzMiBhbGxvYyBibW11IGJveCBmYWlsZWQhIVxuIik7CisJCS8qIGRldm1fa2ZyZWUoJnBkZXYtPmRldiwgKHZvaWQgKilkZWMpOyAqLworCQl2ZnJlZSgodm9pZCAqKWRlYyk7CisJCXJldHVybiAtMTsKKwl9CisJZGVjLT5jbWFfYWxsb2NfY291bnQgPSBQQUdFX0FMSUdOKHdvcmtfYnVmX3NpemUpIC8gUEFHRV9TSVpFOworCXJldCA9IGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeShkZWMtPmJtbXVfYm94LCBXT1JLX1NQQUNFX0JVRl9JRCwKKwkJCWRlYy0+Y21hX2FsbG9jX2NvdW50ICogUEFHRV9TSVpFLCBEUklWRVJfTkFNRSwKKwkJCSZkZWMtPmNtYV9hbGxvY19hZGRyKTsKKwlpZiAocmV0IDwgMCkgeworCQl1bmluaXRfbW11X2J1ZmZlcnMoZGVjKTsKKwkJLyogZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCAodm9pZCAqKWRlYyk7ICovCisJCXZmcmVlKCh2b2lkICopZGVjKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJZGVjLT5idWZfc3RhcnQgPSBkZWMtPmNtYV9hbGxvY19hZGRyOworCWRlYy0+YnVmX3NpemUgPSB3b3JrX2J1Zl9zaXplOworCisJZGVjLT5pbml0X2ZsYWcgPSAwOworCWRlYy0+Zmlyc3Rfc2NfY2hlY2tlZCA9IDA7CisJZGVjLT5mYXRhbF9lcnJvciA9IDA7CisJZGVjLT5zaG93X2ZyYW1lX251bSA9IDA7CisKKwlpZiAoZGVidWcpIHsKKwkJcHJfaW5mbygiPT09QVZTMiBkZWNvZGVyIG1lbSByZXNvdXJjZSAweCVseCBzaXplIDB4JXhcbiIsCisJCQkgICBkZWMtPmJ1Zl9zdGFydCwKKwkJCSAgIGRlYy0+YnVmX3NpemUpOworCX0KKworCWlmIChwZGF0YS0+c3lzX2luZm8pIHsKKwkJZGVjLT52YXZzMl9hbXN0cmVhbV9kZWNfaW5mbyA9ICpwZGF0YS0+c3lzX2luZm87CisJCWRlYy0+ZnJhbWVfd2lkdGggPSBkZWMtPnZhdnMyX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoOworCQlkZWMtPmZyYW1lX2hlaWdodCA9IGRlYy0+dmF2czJfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0OworCX0gZWxzZSB7CisJCWRlYy0+dmF2czJfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGggPSAwOworCQlkZWMtPnZhdnMyX2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodCA9IDA7CisJCWRlYy0+dmF2czJfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSA9IDMwOworCX0KKworCWRlYy0+ZW5kaWFuID0gSEVWQ19DT05GSUdfTElUVExFX0VORElBTjsKKwlpZiAoaXNfc3VwcG9ydF92ZGVjX2NhbnZhcygpKQorCQlkZWMtPmVuZGlhbiA9IEhFVkNfQ09ORklHX0JJR19FTkRJQU47CisJaWYgKGVuZGlhbikKKwkJZGVjLT5lbmRpYW4gPSBlbmRpYW47CisKKwlkZWMtPmNtYV9kZXYgPSBwZGF0YS0+Y21hX2RldjsKKwlpZiAodmF2czJfaW5pdChwZGF0YSkgPCAwKSB7CisJCXByX2luZm8oIlxuYW12ZGVjX2F2czIgaW5pdCBmYWlsZWQuXG4iKTsKKwkJYXZzMl9sb2NhbF91bmluaXQoZGVjKTsKKwkJdW5pbml0X21tdV9idWZmZXJzKGRlYyk7CisJCS8qIGRldm1fa2ZyZWUoJnBkZXYtPmRldiwgKHZvaWQgKilkZWMpOyAqLworCQl2ZnJlZSgodm9pZCAqKWRlYyk7CisJCXBkYXRhLT5kZWNfc3RhdHVzID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXZkZWNfc2V0X3ByZXBhcmVfbGV2ZWwocGRhdGEsIHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwpOworCWhldmNfc291cmNlX2NoYW5nZWQoVkZPUk1BVF9BVlMyLAorCQkJNDA5NiwgMjA0OCwgNjApOworCWlmIChwZGF0YS0+cGFyYWxsZWxfZGVjID09IDEpCisJCXZkZWNfY29yZV9yZXF1ZXN0KHBkYXRhLCBDT1JFX01BU0tfSEVWQyk7CisJZWxzZSB7CisJCXZkZWNfY29yZV9yZXF1ZXN0KHBkYXRhLCBDT1JFX01BU0tfVkRFQ18xIHwgQ09SRV9NQVNLX0hFVkMKKwkJCQl8IENPUkVfTUFTS19DT01CSU5FKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbW12ZGVjX2F2czJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYyA9IChzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqKQorCQkoKChzdHJ1Y3QgdmRlY19zICopKHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpKSktPnByaXZhdGUpOworCXN0cnVjdCB2ZGVjX3MgKnBkYXRhID0gKihzdHJ1Y3QgdmRlY19zICoqKXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjID0gJmRlYy0+YXZzMl9kZWM7CisJc3RydWN0IGF2czJfZnJhbWVfcyAqcGljOworCWludCBpOworCisJaWYgKGRlYnVnKQorCQlwcl9pbmZvKCJhbXZkZWNfYXZzMl9yZW1vdmVcbiIpOworCisJdm1hdnMyX3N0b3AoZGVjKTsKKworCWlmIChwZGF0YS0+cGFyYWxsZWxfZGVjID09IDEpCisJCXZkZWNfY29yZV9yZWxlYXNlKGh3X3RvX3ZkZWMoZGVjKSwgQ09SRV9NQVNLX0hFVkMpOworCWVsc2UKKwkJdmRlY19jb3JlX3JlbGVhc2UoaHdfdG9fdmRlYyhkZWMpLCBDT1JFX01BU0tfSEVWQyk7CisKKwl2ZGVjX3NldF9zdGF0dXMoaHdfdG9fdmRlYyhkZWMpLCBWREVDX1NUQVRVU19ESVNDT05ORUNURUQpOworCWlmIChwZGF0YS0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJZm9yIChpID0gMDsgaSA8IEFWUzJfTUFYX0JVRkZFUl9OVU07IGkrKykgeworCQkJcGRhdGEtPmZyZWVfY2FudmFzX2V4KGRlYy0+YXZzMl9kZWMuZnJtX3Bvb2xbaV0ueV9jYW52YXNfaW5kZXgsIHBkYXRhLT5pZCk7CisJCQlwZGF0YS0+ZnJlZV9jYW52YXNfZXgoZGVjLT5hdnMyX2RlYy5mcm1fcG9vbFtpXS51dl9jYW52YXNfaW5kZXgsIHBkYXRhLT5pZCk7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZGVjLT51c2VkX2J1Zl9udW07IGkrKykgeworCQlpZiAoaSA9PSAoZGVjLT51c2VkX2J1Zl9udW0gLSAxKSkKKwkJCXBpYyA9IGF2czJfZGVjLT5tX2JnOworCQllbHNlCisJCQlwaWMgPSBhdnMyX2RlYy0+ZnJlZltpXTsKKwkJcmVsZWFzZV9jdXZhX2RhdGEocGljKTsKKwl9CisKKworI2lmZGVmIERFQlVHX1BUUworCXByX2luZm8oInB0cyBtaXNzZWQgJWxkLCBwdHMgaGl0ICVsZCwgZHVyYXRpb24gJWRcbiIsCisJCSAgIGRlYy0+cHRzX21pc3NlZCwgZGVjLT5wdHNfaGl0LCBkZWMtPmZyYW1lX2R1cik7CisjZW5kaWYKKwlpZiAoaXNfcmRtYV9lbmFibGUoKSkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLCBSRE1BX1NJWkUsIGRlYy0+cmRtYV9hZHIsIGRlYy0+cmRtYV9waHlfYWRyKTsKKwkvKiBkZXZtX2tmcmVlKCZwZGV2LT5kZXYsICh2b2lkICopZGVjKTsgKi8KKwl2ZnJlZSgodm9pZCAqKWRlYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFtbXZkZWNfYXZzMl9kcml2ZXIgPSB7CisJLnByb2JlID0gYW1tdmRlY19hdnMyX3Byb2JlLAorCS5yZW1vdmUgPSBhbW12ZGVjX2F2czJfcmVtb3ZlLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kID0gYW12ZGVjX3N1c3BlbmQsCisJLnJlc3VtZSA9IGFtdmRlY19yZXN1bWUsCisjZW5kaWYKKwkuZHJpdmVyID0geworCQkubmFtZSA9IE1VTFRJX0RSSVZFUl9OQU1FLAorCX0KK307CisjZW5kaWYKK3N0YXRpYyBzdHJ1Y3QgbWNvbmZpZyBhdnMyX2NvbmZpZ3NbXSA9IHsKKwlNQ19QVTMyKCJiaXRfZGVwdGhfbHVtYSIsICZiaXRfZGVwdGhfbHVtYSksCisJTUNfUFUzMigiYml0X2RlcHRoX2Nocm9tYSIsICZiaXRfZGVwdGhfY2hyb21hKSwKKwlNQ19QVTMyKCJmcmFtZV93aWR0aCIsICZmcmFtZV93aWR0aCksCisJTUNfUFUzMigiZnJhbWVfaGVpZ2h0IiwgJmZyYW1lX2hlaWdodCksCisJTUNfUFUzMigiZGVidWciLCAmZGVidWcpLAorCU1DX1BVMzIoInJhZHIiLCAmcmFkciksCisJTUNfUFUzMigicnZhbCIsICZydmFsKSwKKwlNQ19QVTMyKCJwb3Bfc2hvcnRzIiwgJnBvcF9zaG9ydHMpLAorCU1DX1BVMzIoImRiZ19jbWQiLCAmZGJnX2NtZCksCisJTUNfUFUzMigiZGJnX3NraXBfZGVjb2RlX2luZGV4IiwgJmRiZ19za2lwX2RlY29kZV9pbmRleCksCisJTUNfUFUzMigiZW5kaWFuIiwgJmVuZGlhbiksCisJTUNfUFUzMigic3RlcCIsICZzdGVwKSwKKwlNQ19QVTMyKCJ1ZGVidWdfZmxhZyIsICZ1ZGVidWdfZmxhZyksCisJTUNfUFUzMigiZGVjb2RlX3BpY19iZWdpbiIsICZkZWNvZGVfcGljX2JlZ2luKSwKKwlNQ19QVTMyKCJzbGljZV9wYXJzZV9iZWdpbiIsICZzbGljZV9wYXJzZV9iZWdpbiksCisJTUNfUFUzMigiaV9vbmx5X2ZsYWciLCAmaV9vbmx5X2ZsYWcpLAorCU1DX1BVMzIoImVycm9yX2hhbmRsZV9wb2xpY3kiLCAmZXJyb3JfaGFuZGxlX3BvbGljeSksCisJTUNfUFUzMigiYnVmX2FsbG9jX3dpZHRoIiwgJmJ1Zl9hbGxvY193aWR0aCksCisJTUNfUFUzMigiYnVmX2FsbG9jX2hlaWdodCIsICZidWZfYWxsb2NfaGVpZ2h0KSwKKwlNQ19QVTMyKCJidWZfYWxsb2NfZGVwdGgiLCAmYnVmX2FsbG9jX2RlcHRoKSwKKwlNQ19QVTMyKCJidWZfYWxsb2Nfc2l6ZSIsICZidWZfYWxsb2Nfc2l6ZSksCisJTUNfUFUzMigiYnVmZmVyX21vZGUiLCAmYnVmZmVyX21vZGUpLAorCU1DX1BVMzIoImJ1ZmZlcl9tb2RlX2RiZyIsICZidWZmZXJfbW9kZV9kYmcpLAorCU1DX1BVMzIoIm1heF9idWZfbnVtIiwgJm1heF9idWZfbnVtKSwKKwlNQ19QVTMyKCJkeW5hbWljX2J1Zl9udW1fbWFyZ2luIiwgJmR5bmFtaWNfYnVmX251bV9tYXJnaW4pLAorCU1DX1BVMzIoIm1lbV9tYXBfbW9kZSIsICZtZW1fbWFwX21vZGUpLAorCU1DX1BVMzIoImRvdWJsZV93cml0ZV9tb2RlIiwgJmRvdWJsZV93cml0ZV9tb2RlKSwKKwlNQ19QVTMyKCJlbmFibGVfbWVtX3NhdmluZyIsICZlbmFibGVfbWVtX3NhdmluZyksCisJTUNfUFUzMigiZm9yY2Vfd19oIiwgJmZvcmNlX3dfaCksCisJTUNfUFUzMigiZm9yY2VfZnBzIiwgJmZvcmNlX2ZwcyksCisJTUNfUFUzMigibWF4X2RlY29kaW5nX3RpbWUiLCAmbWF4X2RlY29kaW5nX3RpbWUpLAorCU1DX1BVMzIoIm9uX25vX2tleWZyYW1lX3NraXBlZCIsICZvbl9ub19rZXlmcmFtZV9za2lwZWQpLAorCU1DX1BVMzIoInN0YXJ0X2RlY29kZV9idWZfbGV2ZWwiLCAmc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCksCisJTUNfUFUzMigiZGVjb2RlX3RpbWVvdXRfdmFsIiwgJmRlY29kZV90aW1lb3V0X3ZhbCksCit9Oworc3RhdGljIHN0cnVjdCBtY29uZmlnX25vZGUgYXZzMl9ub2RlOworCitzdGF0aWMgaW50IF9faW5pdCBhbXZkZWNfYXZzMl9kcml2ZXJfaW5pdF9tb2R1bGUodm9pZCkKK3sKKworI2lmZGVmIEFWUzJfMTBCX01NVQorCXN0cnVjdCBCdWZmSW5mb19zICpwX2J1Zl9pbmZvOworCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA8PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVE0yICYmICFpc19jcHVfdG0yX3JldmIoKSkgeworCQlpZiAodmRlY19pc19zdXBwb3J0XzRrKCkpIHsKKwkJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkKKwkJCQlwX2J1Zl9pbmZvID0gJmFtdmF2czJfd29ya2J1ZmZfc3BlY1syXTsKKwkJCWVsc2UKKwkJCQlwX2J1Zl9pbmZvID0gJmFtdmF2czJfd29ya2J1ZmZfc3BlY1sxXTsKKwkJfSBlbHNlCisJCQlwX2J1Zl9pbmZvID0gJmFtdmF2czJfd29ya2J1ZmZfc3BlY1swXTsKKwl9IGVsc2UgeyAvL2dldF9jcHVfbWFqb3JfaWQoKSA+IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UTTIgfHwgaXNfY3B1X3RtMl9yZXZiKCkKKwkJaWYgKHZkZWNfaXNfc3VwcG9ydF80aygpKSB7CisJCQlwX2J1Zl9pbmZvID0gJmFtdmF2czJfd29ya2J1ZmZfc3BlY1s1XTsKKwkJfSBlbHNlCisJCQlwX2J1Zl9pbmZvID0gJmFtdmF2czJfd29ya2J1ZmZfc3BlY1szXTsKKwl9CisKKwlpbml0X2J1ZmZfc3BlYyhOVUxMLCBwX2J1Zl9pbmZvKTsKKwl3b3JrX2J1Zl9zaXplID0KKwkJKHBfYnVmX2luZm8tPmVuZF9hZHIgLSBwX2J1Zl9pbmZvLT5zdGFydF9hZHIKKwkJICsgMHhmZmZmKSAmICh+MHhmZmZmKTsKKworI2VuZGlmCisJcHJfZGVidWcoImFtdmRlY19hdnMyIG1vZHVsZSBpbml0XG4iKTsKKworI2lmZGVmIEVSUk9SX0hBTkRMRV9ERUJVRworCWRiZ19uYWxfc2tpcF9mbGFnID0gMDsKKwlkYmdfbmFsX3NraXBfY291bnQgPSAwOworI2VuZGlmCisJdWRlYnVnX2ZsYWcgPSAwOworCWRlY29kZV9waWNfYmVnaW4gPSAwOworCXNsaWNlX3BhcnNlX2JlZ2luID0gMDsKKwlzdGVwID0gMDsKKwlidWZfYWxsb2Nfc2l6ZSA9IDA7CisJaWYgKHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYW1tdmRlY19hdnMyX2RyaXZlcikpCisJCXByX2VycigiZmFpbGVkIHRvIHJlZ2lzdGVyIGFtbXZkZWNfYXZzMiBkcml2ZXJcbiIpOworCisJaWYgKHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYW12ZGVjX2F2czJfZHJpdmVyKSkgeworCQlwcl9lcnIoImZhaWxlZCB0byByZWdpc3RlciBhbXZkZWNfYXZzMiBkcml2ZXJcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA8IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKSB8fAorCQkoZ2V0X2NwdV9tYWpvcl9pZCgpID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNUQpKSB7CisJCWFtdmRlY19hdnMyX3Byb2ZpbGUubmFtZSA9ICJhdnMyX3Vuc3VwcG9ydCI7CisJfSBlbHNlIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPCBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKSB7CisJCWlmICh2ZGVjX2lzX3N1cHBvcnRfNGsoKSkKKwkJCWFtdmRlY19hdnMyX3Byb2ZpbGUucHJvZmlsZSA9CisJCQkJIjRrLCAxMGJpdCwgZHdyaXRlLCBjb21wcmVzc2VkIjsKKwkJZWxzZQorCQkJYW12ZGVjX2F2czJfcHJvZmlsZS5wcm9maWxlID0KKwkJCQkiMTBiaXQsIGR3cml0ZSwgY29tcHJlc3NlZCI7CisJfSBlbHNlIHsKKwkJLyogY3B1IGlkIGxhcmdlciB0aGFuIHNtMSBzdXBwb3J0IDhrICovCisJCWFtdmRlY19hdnMyX3Byb2ZpbGUucHJvZmlsZSA9CisJCQkJIjhrLCAxMGJpdCwgZHdyaXRlLCBjb21wcmVzc2VkIjsKKwl9CisKKwl2Y29kZWNfcHJvZmlsZV9yZWdpc3RlcigmYW12ZGVjX2F2czJfcHJvZmlsZSk7CisJYW12ZGVjX2F2czJfcHJvZmlsZV9tdWx0ID0gYW12ZGVjX2F2czJfcHJvZmlsZTsKKwlhbXZkZWNfYXZzMl9wcm9maWxlX211bHQubmFtZSA9ICJtYXZzMiI7CisJdmNvZGVjX3Byb2ZpbGVfcmVnaXN0ZXIoJmFtdmRlY19hdnMyX3Byb2ZpbGVfbXVsdCk7CisKKwlJTklUX1JFR19OT0RFX0NPTkZJR1MoIm1lZGlhLmRlY29kZXIiLCAmYXZzMl9ub2RlLAorCQkiYXZzMiIsIGF2czJfY29uZmlncywgQ09ORklHX0ZPUl9SVyk7CisJdmNvZGVjX2ZlYXR1cmVfcmVnaXN0ZXIoVkZPUk1BVF9BVlMyLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYW12ZGVjX2F2czJfZHJpdmVyX3JlbW92ZV9tb2R1bGUodm9pZCkKK3sKKwlwcl9kZWJ1ZygiYW12ZGVjX2F2czIgbW9kdWxlIHJlbW92ZS5cbiIpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhbW12ZGVjX2F2czJfZHJpdmVyKTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYW12ZGVjX2F2czJfZHJpdmVyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK21vZHVsZV9wYXJhbShiaXRfZGVwdGhfbHVtYSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGJpdF9kZXB0aF9sdW1hLCAiXG4gYW12ZGVjX2F2czIgYml0X2RlcHRoX2x1bWFcbiIpOworCittb2R1bGVfcGFyYW0oYml0X2RlcHRoX2Nocm9tYSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGJpdF9kZXB0aF9jaHJvbWEsICJcbiBhbXZkZWNfYXZzMiBiaXRfZGVwdGhfY2hyb21hXG4iKTsKKworbW9kdWxlX3BhcmFtKGZyYW1lX3dpZHRoLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZnJhbWVfd2lkdGgsICJcbiBhbXZkZWNfYXZzMiBmcmFtZV93aWR0aFxuIik7CisKK21vZHVsZV9wYXJhbShmcmFtZV9oZWlnaHQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmcmFtZV9oZWlnaHQsICJcbiBhbXZkZWNfYXZzMiBmcmFtZV9oZWlnaHRcbiIpOworCittb2R1bGVfcGFyYW0oZGVidWcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIlxuIGFtdmRlY19hdnMyIGRlYnVnXG4iKTsKKworbW9kdWxlX3BhcmFtKGRlYnVnX2FnYWluLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWdfYWdhaW4sICJcbiBhbXZkZWNfYXZzMiBkZWJ1Z19hZ2FpblxuIik7CisKK21vZHVsZV9wYXJhbShyYWRyLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocmFkciwgIlxucmFkclxuIik7CisKK21vZHVsZV9wYXJhbShydmFsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocnZhbCwgIlxucnZhbFxuIik7CisKK21vZHVsZV9wYXJhbShwb3Bfc2hvcnRzLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocG9wX3Nob3J0cywgIlxucnZhbFxuIik7CisKK21vZHVsZV9wYXJhbShkYmdfY21kLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGJnX2NtZCwgIlxuZGJnX2NtZFxuIik7CisKK21vZHVsZV9wYXJhbShkYmdfc2tpcF9kZWNvZGVfaW5kZXgsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkYmdfc2tpcF9kZWNvZGVfaW5kZXgsICJcbmRiZ19za2lwX2RlY29kZV9pbmRleFxuIik7CisKK21vZHVsZV9wYXJhbShlbmRpYW4sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhlbmRpYW4sICJcbnJ2YWxcbiIpOworCittb2R1bGVfcGFyYW0oc3RlcCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHN0ZXAsICJcbiBhbXZkZWNfYXZzMiBzdGVwXG4iKTsKKworbW9kdWxlX3BhcmFtKGRlY29kZV9waWNfYmVnaW4sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkZWNvZGVfcGljX2JlZ2luLCAiXG4gYW12ZGVjX2F2czIgZGVjb2RlX3BpY19iZWdpblxuIik7CisKK21vZHVsZV9wYXJhbShzbGljZV9wYXJzZV9iZWdpbiwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHNsaWNlX3BhcnNlX2JlZ2luLCAiXG4gYW12ZGVjX2F2czIgc2xpY2VfcGFyc2VfYmVnaW5cbiIpOworCittb2R1bGVfcGFyYW0oaV9vbmx5X2ZsYWcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhpX29ubHlfZmxhZywgIlxuIGFtdmRlY19hdnMyIGlfb25seV9mbGFnXG4iKTsKKworbW9kdWxlX3BhcmFtKGVycm9yX2hhbmRsZV9wb2xpY3ksIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhlcnJvcl9oYW5kbGVfcG9saWN5LCAiXG4gYW12ZGVjX2F2czIgZXJyb3JfaGFuZGxlX3BvbGljeVxuIik7CisKK21vZHVsZV9wYXJhbShyZV9zZWFyY2hfc2VxX3RocmVzaG9sZCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJlX3NlYXJjaF9zZXFfdGhyZXNob2xkLCAiXG4gYW12ZGVjX2F2czIgcmVfc2VhcmNoX3NlcV90aHJlc2hvbGRcbiIpOworCittb2R1bGVfcGFyYW0oYnVmX2FsbG9jX3dpZHRoLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoYnVmX2FsbG9jX3dpZHRoLCAiXG4gYnVmX2FsbG9jX3dpZHRoXG4iKTsKKworbW9kdWxlX3BhcmFtKGJ1Zl9hbGxvY19oZWlnaHQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhidWZfYWxsb2NfaGVpZ2h0LCAiXG4gYnVmX2FsbG9jX2hlaWdodFxuIik7CisKK21vZHVsZV9wYXJhbShidWZfYWxsb2NfZGVwdGgsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhidWZfYWxsb2NfZGVwdGgsICJcbiBidWZfYWxsb2NfZGVwdGhcbiIpOworCittb2R1bGVfcGFyYW0oYnVmX2FsbG9jX3NpemUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhidWZfYWxsb2Nfc2l6ZSwgIlxuIGJ1Zl9hbGxvY19zaXplXG4iKTsKKworbW9kdWxlX3BhcmFtKGJ1ZmZlcl9tb2RlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoYnVmZmVyX21vZGUsICJcbiBidWZmZXJfbW9kZVxuIik7CisKK21vZHVsZV9wYXJhbShidWZmZXJfbW9kZV9kYmcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhidWZmZXJfbW9kZV9kYmcsICJcbiBidWZmZXJfbW9kZV9kYmdcbiIpOworLypVU0VfQlVGX0JMT0NLKi8KK21vZHVsZV9wYXJhbShtYXhfYnVmX251bSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9idWZfbnVtLCAiXG4gbWF4X2J1Zl9udW1cbiIpOworCittb2R1bGVfcGFyYW0oZHluYW1pY19idWZfbnVtX21hcmdpbiwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGR5bmFtaWNfYnVmX251bV9tYXJnaW4sICJcbiBkeW5hbWljX2J1Zl9udW1fbWFyZ2luXG4iKTsKKworI2lmZGVmIENPTlNUUkFJTl9NQVhfQlVGX05VTQorbW9kdWxlX3BhcmFtKHJ1bl9yZWFkeV9tYXhfdmZfb25seV9udW0sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhydW5fcmVhZHlfbWF4X3ZmX29ubHlfbnVtLCAiXG4gcnVuX3JlYWR5X21heF92Zl9vbmx5X251bVxuIik7CisKK21vZHVsZV9wYXJhbShydW5fcmVhZHlfZGlzcGxheV9xX251bSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJ1bl9yZWFkeV9kaXNwbGF5X3FfbnVtLCAiXG4gcnVuX3JlYWR5X2Rpc3BsYXlfcV9udW1cbiIpOworCittb2R1bGVfcGFyYW0ocnVuX3JlYWR5X21heF9idWZfbnVtLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocnVuX3JlYWR5X21heF9idWZfbnVtLCAiXG4gcnVuX3JlYWR5X21heF9idWZfbnVtXG4iKTsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0obXZfYnVmX21hcmdpbiwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG12X2J1Zl9tYXJnaW4sICJcbiBtdl9idWZfbWFyZ2luXG4iKTsKKworbW9kdWxlX3BhcmFtKHJ1bl9yZWFkeV9taW5fYnVmX251bSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJ1bl9yZWFkeV9taW5fYnVmX251bSwgIlxuIHJ1bl9yZWFkeV9taW5fYnVmX251bVxuIik7CisKKy8qKi8KKworbW9kdWxlX3BhcmFtKG1lbV9tYXBfbW9kZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG1lbV9tYXBfbW9kZSwgIlxuIG1lbV9tYXBfbW9kZVxuIik7CisKK21vZHVsZV9wYXJhbShkb3VibGVfd3JpdGVfbW9kZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRvdWJsZV93cml0ZV9tb2RlLCAiXG4gZG91YmxlX3dyaXRlX21vZGVcbiIpOworCittb2R1bGVfcGFyYW0oZW5hYmxlX21lbV9zYXZpbmcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhlbmFibGVfbWVtX3NhdmluZywgIlxuIGVuYWJsZV9tZW1fc2F2aW5nXG4iKTsKKworbW9kdWxlX3BhcmFtKGZvcmNlX3dfaCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX3dfaCwgIlxuIGZvcmNlX3dfaFxuIik7CisKK21vZHVsZV9wYXJhbShmb3JjZV9mcHMsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9mcHMsICJcbiBmb3JjZV9mcHNcbiIpOworCittb2R1bGVfcGFyYW0obWF4X2RlY29kaW5nX3RpbWUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfZGVjb2RpbmdfdGltZSwgIlxuIG1heF9kZWNvZGluZ190aW1lXG4iKTsKKworbW9kdWxlX3BhcmFtKG9uX25vX2tleWZyYW1lX3NraXBlZCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG9uX25vX2tleWZyYW1lX3NraXBlZCwgIlxuIG9uX25vX2tleWZyYW1lX3NraXBlZFxuIik7CisKKworbW9kdWxlX3BhcmFtKHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwsCisJCSJcbiBhdnMyIHN0YXJ0X2RlY29kZV9idWZfbGV2ZWxcbiIpOworCittb2R1bGVfcGFyYW0oZGVjb2RlX3RpbWVvdXRfdmFsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVjb2RlX3RpbWVvdXRfdmFsLAorCSJcbiBhdnMyIGRlY29kZV90aW1lb3V0X3ZhbFxuIik7CisKK21vZHVsZV9wYXJhbV9hcnJheShkZWNvZGVfZnJhbWVfY291bnQsIHVpbnQsCisJJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGRpc3BsYXlfZnJhbWVfY291bnQsIHVpbnQsCisJJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtX2FycmF5KG1heF9wcm9jZXNzX3RpbWUsIHVpbnQsCisJJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtX2FycmF5KHJ1bl9jb3VudCwgdWludCwKKwkmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCittb2R1bGVfcGFyYW1fYXJyYXkoaW5wdXRfZW1wdHksIHVpbnQsCisJJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtX2FycmF5KG5vdF9ydW5fcmVhZHksIHVpbnQsCisJJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtKHZpZGVvX3NpZ25hbF90eXBlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModmlkZW9fc2lnbmFsX3R5cGUsICJcbiBhbXZkZWNfYXZzMiB2aWRlb19zaWduYWxfdHlwZVxuIik7CisKK21vZHVsZV9wYXJhbShmb3JjZV92aWRlb19zaWduYWxfdHlwZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX3ZpZGVvX3NpZ25hbF90eXBlLCAiXG4gYW12ZGVjX2F2czIgZm9yY2VfdmlkZW9fc2lnbmFsX3R5cGVcbiIpOworCittb2R1bGVfcGFyYW0oZW5hYmxlX2ZvcmNlX3ZpZGVvX3NpZ25hbF90eXBlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlX2ZvcmNlX3ZpZGVvX3NpZ25hbF90eXBlLCAiXG4gYW12ZGVjX2F2czIgZW5hYmxlX2ZvcmNlX3ZpZGVvX3NpZ25hbF90eXBlXG4iKTsKKworbW9kdWxlX3BhcmFtKGZvcmNlX2J1ZnNwZWMsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9idWZzcGVjLCAiXG4gYW12ZGVjX2gyNjUgZm9yY2VfYnVmc3BlY1xuIik7CisKK21vZHVsZV9wYXJhbSh1ZGVidWdfZmxhZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHVkZWJ1Z19mbGFnLCAiXG4gYW12ZGVjX2gyNjUgdWRlYnVnX2ZsYWdcbiIpOworCittb2R1bGVfcGFyYW0odWRlYnVnX3BhdXNlX3BvcywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHVkZWJ1Z19wYXVzZV9wb3MsICJcbiB1ZGVidWdfcGF1c2VfcG9zXG4iKTsKKworbW9kdWxlX3BhcmFtKHVkZWJ1Z19wYXVzZV92YWwsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh1ZGVidWdfcGF1c2VfdmFsLCAiXG4gdWRlYnVnX3BhdXNlX3ZhbFxuIik7CisKK21vZHVsZV9wYXJhbSh1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4LCAiXG4gdWRlYnVnX3BhdXNlX2RlY29kZV9pZHhcbiIpOworCittb2R1bGVfcGFyYW0ocHJlX2RlY29kZV9idWZfbGV2ZWwsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHByZV9kZWNvZGVfYnVmX2xldmVsLAorCQkiXG4gYW12ZGVjX2F2czIgcHJlX2RlY29kZV9idWZfbGV2ZWxcbiIpOworCittb2R1bGVfcGFyYW0oYWdhaW5fdGhyZXNob2xkLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoYWdhaW5fdGhyZXNob2xkLCAiXG4gYWdhaW5fdGhyZXNob2xkXG4iKTsKKworCittb2R1bGVfcGFyYW0oZm9yY2VfZGlzcF9waWNfaW5kZXgsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2Rpc3BfcGljX2luZGV4LAorCSJcbiBhbXZkZWNfaDI2NSBmb3JjZV9kaXNwX3BpY19pbmRleFxuIik7CisKK21vZHVsZV9wYXJhbSh3aXRob3V0X2Rpc3BsYXlfbW9kZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHdpdGhvdXRfZGlzcGxheV9tb2RlLCAiXG4gd2l0aG91dF9kaXNwbGF5X21vZGVcbiIpOworCittb2R1bGVfcGFyYW0obXZfYnVmX2R5bmFtaWNfYWxsb2MsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhtdl9idWZfZHluYW1pY19hbGxvYywgIlxuIG12X2J1Zl9keW5hbWljX2FsbG9jXG4iKTsKKworbW9kdWxlX2luaXQoYW12ZGVjX2F2czJfZHJpdmVyX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGFtdmRlY19hdnMyX2RyaXZlcl9yZW1vdmVfbW9kdWxlKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTUxPR0lDIGF2czIgVmlkZW8gRGVjb2RlciBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlRpbSBZYW8gPHRpbS55YW9AYW1sb2dpYy5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvYXZzMi92YXZzMi5oIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL2F2czIvdmF2czIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzFiZmIzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL2F2czIvdmF2czIuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL2FtcG9ydHMvdmF2czIuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyovCisKKyNpZm5kZWYgVkFWUzJfSAorI2RlZmluZSBWQVZTMl9ICisKKyNkZWZpbmUgQVZTMl8xMEJfTU1VCisjZGVmaW5lIEFWUzJfMTBCX01NVV9EVworCit2b2lkIGFkYXB0X2NvZWZfcHJvYnMoaW50IHBpY19jb3VudCwgaW50IHByZXZfa2YsIGludCBjdXJfa2YsIGludCBwcmVfZmMsCit1bnNpZ25lZCBpbnQgKnByZXZfcHJvYiwgdW5zaWduZWQgaW50ICpjdXJfcHJvYiwgdW5zaWduZWQgaW50ICpjb3VudCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9hdnNfbXVsdGkvTWFrZWZpbGUgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvYXZzX211bHRpL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzOGNlYzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvYXZzX211bHRpL01ha2VmaWxlCkBAIC0wLDAgKzEsMiBAQAorb2JqLSQoQ09ORklHX0FNTE9HSUNfTUVESUFfVkRFQ19BVlNfTVVMVEkpICs9IGFtdmRlY19tYXZzLm8KK2FtdmRlY19tYXZzLW9ianMgKz0gYXZzX211bHRpLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9hdnNfbXVsdGkvYXZzX211bHRpLmMgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvYXZzX211bHRpL2F2c19tdWx0aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZDIwYmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvYXZzX211bHRpL2F2c19tdWx0aS5jCkBAIC0wLDAgKzEsNTAzMCBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9hbXBvcnRzL3ZhdnMuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL2Ftc3RyZWFtLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9mcmFtZV9zeW5jL3B0c3NlcnYuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NhbnZhcy9jYW52YXMuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWVfcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWVfcmVjZWl2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL3ZkZWNfcmVnLmg+CisjaW5jbHVkZSAiLi4vLi4vLi4vc3RyZWFtX2lucHV0L2FtcG9ydHMvc3RyZWFtYnVmX3JlZy5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2FtdmRlYy5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvcmVnaXN0ZXJzL3JlZ2lzdGVyLmg+CisjaW5jbHVkZSAiLi4vLi4vLi4vc3RyZWFtX2lucHV0L2FtcG9ydHMvYW1wb3J0c19wcml2LmgiCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvZGVjX21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgImF2c19tdWx0aS5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29uZmlncy5oPgorI2luY2x1ZGUgIi4uL3V0aWxzL2RlY29kZXJfbW11X2JveC5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2RlY29kZXJfYm1tdV9ib3guaCIKKyNpbmNsdWRlICIuLi91dGlscy9maXJtd2FyZS5oIgorI2luY2x1ZGUgIi4uLy4uLy4uL2NvbW1vbi9jaGlwcy9kZWNvZGVyX2NwdV92ZXJfaW5mby5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvdGVlLmg+CisjaW5jbHVkZSAiLi4vdXRpbHMvdmRlY19mZWF0dXJlLmgiCisKKyNkZWZpbmUgREVCVUdfTVVMVElfRkxBRyAgMAorLyoKKyNkZWZpbmUgREVCVUdfV0lUSF9TSU5HTEVfTU9ERQorI2RlZmluZSBERUJVR19NVUxUSV9XSVRIX0FVVE9NT0RFCisjZGVmaW5lIERFQlVHX01VTFRJX0ZSQU1FX0lOUworKi8KKworCisjZGVmaW5lIFVTRV9EWU5BTUlDX0JVRl9OVU0KKworI2lmZGVmIERFQlVHX1dJVEhfU0lOR0xFX01PREUKKyNkZWZpbmUgRFJJVkVSX05BTUUgImFtdmRlY19hdnMiCisjZWxzZQorI2RlZmluZSBEUklWRVJfTkFNRSAiYW1tdmRlY19hdnMiCisjZW5kaWYKKworI2RlZmluZSBNVUxUSV9EUklWRVJfTkFNRSAiYW1tdmRlY19hdnMiCisKKyNkZWZpbmUgRU5BQkxFX1VTRVJfREFUQQorCisjaWYgMS8qIE1FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09ONiAqLworI2RlZmluZSBOVjIxCisjZW5kaWYKKworI2RlZmluZSBVU0VfQVZTX1NFUV9JTkZPCisjZGVmaW5lIEhBTkRMRV9BVlNfSVJRCisjZGVmaW5lIERFQlVHX1BUUworCisjZGVmaW5lIENIRUNLX0lOVEVSVkFMICAgICAgICAoSFovMTAwKQorCisjZGVmaW5lIElfUElDVFVSRSAgIDAKKyNkZWZpbmUgUF9QSUNUVVJFICAgMQorI2RlZmluZSBCX1BJQ1RVUkUgICAyCisKKyNkZWZpbmUgTE1FTV9CVUZfU0laRSAoMHg1MDAgKiAyKQorCisvKiAjZGVmaW5lIE9SSV9CVUZGRVJfU1RBUlRfQUREUiAgIDB4ODEwMDAwMDAgKi8KKyNkZWZpbmUgT1JJX0JVRkZFUl9TVEFSVF9BRERSICAgMHg4MDAwMDAwMAorCisjZGVmaW5lIElOVEVSTEFDRV9GTEFHICAgICAgICAgIDB4ODAKKyNkZWZpbmUgVE9QX0ZJRUxEX0ZJUlNUX0ZMQUcgMHg0MAorCisvKiBwcm90b2NvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQVZTX1BJQ19SQVRJTyAgICAgICBBVl9TQ1JBVENIXzAKKyNkZWZpbmUgQVZTX1BJQ19XSURUSCAgICAgIEFWX1NDUkFUQ0hfMQorI2RlZmluZSBBVlNfUElDX0hFSUdIVCAgICAgQVZfU0NSQVRDSF8yCisjZGVmaW5lIEFWU19GUkFNRV9SQVRFICAgICBBVl9TQ1JBVENIXzMKKworLyojZGVmaW5lIEFWU19FUlJPUl9DT1VOVCAgICBBVl9TQ1JBVENIXzYqLworI2RlZmluZSBBVlNfU09TX0NPVU5UICAgICBBVl9TQ1JBVENIXzcKKyNkZWZpbmUgQVZTX0JVRkZFUklOICAgICAgIEFWX1NDUkFUQ0hfOAorI2RlZmluZSBBVlNfQlVGRkVST1VUICAgICAgQVZfU0NSQVRDSF85CisjZGVmaW5lIEFWU19SRVBFQVRfQ09VTlQgICAgQVZfU0NSQVRDSF9BCisjZGVmaW5lIEFWU19USU1FX1NUQU1QICAgICAgQVZfU0NSQVRDSF9CCisjZGVmaW5lIEFWU19PRkZTRVRfUkVHICAgICAgQVZfU0NSQVRDSF9DCisjZGVmaW5lIE1FTV9PRkZTRVRfUkVHICAgICAgQVZfU0NSQVRDSF9GCisjZGVmaW5lIEFWU19FUlJPUl9SRUNPVkVSWV9NT0RFICAgQVZfU0NSQVRDSF9HCisjZGVmaW5lIERFQ09ERV9QSUNfQ09VTlQgICAgIEFWX1NDUkFUQ0hfRworCisjZGVmaW5lIERFQ09ERV9NT0RFCQlBVl9TQ1JBVENIXzYKKyNkZWZpbmUgREVDT0RFX01PREVfU0lOR0xFCQkJCQkweDAKKyNkZWZpbmUgREVDT0RFX01PREVfTVVMVElfRlJBTUVCQVNFCQkJMHgxCisjZGVmaW5lIERFQ09ERV9NT0RFX01VTFRJX1NUUkVBTUJBU0UJCTB4MgorI2RlZmluZSBERUNPREVfTU9ERV9NVUxUSV9TVFJFQU1CQVNFX0NPTlQgICAweDMKKworI2RlZmluZSBERUNPREVfU1RBVFVTCUFWX1NDUkFUQ0hfSAorI2RlZmluZSBERUNPREVfU1RBVFVTX1BJQ19ET05FICAgIDB4MQorI2RlZmluZSBERUNPREVfU1RBVFVTX0RFQ09ERV9CVUZfRU1QVFkJMHgyCisjZGVmaW5lIERFQ09ERV9TVEFUVVNfU0VBUkNIX0JVRl9FTVBUWQkweDMKKyNkZWZpbmUgREVDT0RFX1NUQVRVU19TS0lQX1BJQ19ET05FICAgICAweDQKKyNkZWZpbmUgREVDT0RFX1NFQVJDSF9IRUFECTB4ZmYKKworI2RlZmluZSBERUNPREVfU1RPUF9QT1MJCUFWX1NDUkFUQ0hfSgorCisjZGVmaW5lIERFQ09ERV9MTUVNX0JVRl9BRFIgICBBVl9TQ1JBVENIX0kKKworI2RlZmluZSBERUNPREVfQ0ZHICAgICAgICAgICAgQVZfU0NSQVRDSF9LCisKKyNkZWZpbmUgVkZfUE9PTF9TSVpFICAgICAgICA2NAorI2RlZmluZSBQVVRfSU5URVJWQUwgICAgICAgIChIWi8xMDApCisKKyNpZiAxIC8qTUVTT05fQ1BVX1RZUEUgPj0gTUVTT05fQ1BVX1RZUEVfTUVTT044Ki8KKyNkZWZpbmUgSU5UX0FNVkVOQ09ERVIgSU5UX0RPU19NQUlMQk9YXzEKKyNlbHNlCisvKiAjZGVmaW5lIEFNVkVOQ19ERVZfVkVSU0lPTiAiQU1MLU1UIiAqLworI2RlZmluZSBJTlRfQU1WRU5DT0RFUiBJTlRfTUFJTEJPWF8xQQorI2VuZGlmCisKKyNpZmRlZiBVU0VfRFlOQU1JQ19CVUZfTlVNCitzdGF0aWMgdW5zaWduZWQgaW50IGJ1Zl9zcGVjX3JlZ1tdID0geworCUFWX1NDUkFUQ0hfMCwKKwlBVl9TQ1JBVENIXzEsCisJQVZfU0NSQVRDSF8yLAorCUFWX1NDUkFUQ0hfMywKKwlBVl9TQ1JBVENIXzcsIC8qQVZTX1NPU19DT1VOVCovCisJQVZfU0NSQVRDSF9ELCAvKkRFQlVHX1JFRzIqLworCUFWX1NDUkFUQ0hfRSwgLypERUJVR19SRUcxKi8KKwlBVl9TQ1JBVENIX00gIC8qdXNlcl9kYXRhX3BvY19udW1iZXIqLworfTsKKyNlbmRpZgorCisjZGVmaW5lIERFQlVHX1JFRzEJQVZfU0NSQVRDSF9FCisjZGVmaW5lIERFQlVHX1JFRzIJQVZfU0NSQVRDSF9ECisKKworc3RhdGljIHZvaWQgY2hlY2tfdGltZXJfZnVuYyhzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpOworc3RhdGljIHZvaWQgdmF2c193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKKyNkZWZpbmUgREVDX0NPTlRST0xfRkxBR19GT1JDRV8yNTAwXzEwODBQX0lOVEVSTEFDRSAweDAwMDEKK3N0YXRpYyB1MzIgZGVjX2NvbnRyb2wgPSBERUNfQ09OVFJPTF9GTEFHX0ZPUkNFXzI1MDBfMTA4MFBfSU5URVJMQUNFOworCisKKyNkZWZpbmUgVlBQX1ZEMV9QT1NUQkxFTkQgICAgICAgKDEgPDwgMTApCisKK3N0YXRpYyBpbnQgZGVidWc7CitzdGF0aWMgdW5zaWduZWQgaW50IGRlYnVnX21hc2sgPSAweGZmOworCisvKmZvciBkZWJ1ZyovCisvKgorCXVkZWJ1Z19mbGFnOgorCWJpdCAwLCBlbmFibGUgdWNvZGUgcHJpbnQKKwliaXQgMSwgZW5hYmxlIHVjb2RlIG1vcmUgcHJpbnQKKwliaXQgMywgZW5hYmxlIHVjZG9kZSBkZXRhaWwgcHJpbnQKKwliaXQgWzMxOjE2XSBub3QgMCwgcG9zIHRvIGR1bXAgbG1lbQorCQliaXQgMiwgcG9wIGJpdHMgdG8gbG1lbQorCQliaXQgWzExOjhdLCBwcmUtcG9wIGJpdHMgZm9yIGFsaWdubWVudCAod2hlbiBiaXQgMiBpcyAxKQorCisJYXZzIG9ubHk6CisJYml0IFs4XSwgZGlzYWJsZSBlbXB0eSBtdWl0bC1pbnN0YW5jZSBoYW5kbGluZworCWJpdCBbOV0sIGVuYWJsZSB3cml0dGluZyBvZiBWQzFfQ09OVFJPTF9SRUcgaW4gdWNvZGUKKyovCitzdGF0aWMgdTMyIHVkZWJ1Z19mbGFnOworLyoKKwl3aGVuIHVkZWJ1Z19mbGFnWzE6MF0gaXMgbm90IDAKKwl1ZGVidWdfcGF1c2VfcG9zIG5vdCAwLAorCQlwYXVzZSBwb3NpdGlvbgorKi8KK3N0YXRpYyB1MzIgdWRlYnVnX3BhdXNlX3BvczsKKy8qCisJd2hlbiB1ZGVidWdfZmxhZ1sxOjBdIGlzIG5vdCAwCisJYW5kIHVkZWJ1Z19wYXVzZV9wb3MgaXMgbm90IDAsCisJCXBhdXNlIG9ubHkgd2hlbiBERUJVR19SRUcyIGlzIGVxdWFsIHRvIHRoaXMgdmFsCisqLworc3RhdGljIHUzMiB1ZGVidWdfcGF1c2VfdmFsOworCitzdGF0aWMgdTMyIHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4OworCitzdGF0aWMgdTMyIHVkZWJ1Z19wYXVzZV9pbnNfaWQ7CisKK3N0YXRpYyB1MzIgZm9yY2VfZnBzOworCisjaWZkZWYgREVCVUdfTVVMVElfRlJBTUVfSU5TCitzdGF0aWMgdTMyIGRlbGF5OworI2VuZGlmCisKK3N0YXRpYyB1MzIgc3RlcDsKKworc3RhdGljIHUzMiBzdGFydF9kZWNvZGluZ19kZWxheTsKKworI2RlZmluZSBBVlNfREVWX05VTSAgICAgICAgOQorc3RhdGljIHVuc2lnbmVkIGludCBtYXhfZGVjb2RlX2luc3RhbmNlX251bSA9IEFWU19ERVZfTlVNOworc3RhdGljIHVuc2lnbmVkIGludCBtYXhfcHJvY2Vzc190aW1lW0FWU19ERVZfTlVNXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X2dldF9mcmFtZV9pbnRlcnZhbFtBVlNfREVWX05VTV07CitzdGF0aWMgdW5zaWduZWQgaW50IHJ1bl9jb3VudFtBVlNfREVWX05VTV07CitzdGF0aWMgdW5zaWduZWQgaW50IGluc191ZGVidWdfZmxhZ1tBVlNfREVWX05VTV07CisjaWZkZWYgREVCVUdfTVVMVElfRlJBTUVfSU5TCitzdGF0aWMgdW5zaWduZWQgaW50IG1heF9ydW5fY291bnRbQVZTX0RFVl9OVU1dOworI2VuZGlmCisvKgorZXJyb3JfaGFuZGxlX3BvbGljeToKKyovCitzdGF0aWMgdW5zaWduZWQgaW50IGVycm9yX2hhbmRsZV9wb2xpY3kgPSAzOworCitzdGF0aWMgdTMyIGFnYWluX3RocmVzaG9sZCA9IDA7IC8qMHg0MDsqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGRlY29kZV90aW1lb3V0X3ZhbCA9IDIwMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCA9IDB4ODAwMDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitmaXJtd2FyZV9zZWwKKyAgICAwOiB1c2UgYXZzcF90cmFucyBsb25nIGNhYmFjIHVjb2RlOworICAgIDE6IG5vdCB1c2UgYXZzcF90cmFucyBsb25nIGNhYmFjIHVjb2RlCisJCWluIHVjb2RlOgorCQkjZGVmaW5lIFVTRV9FWFRfQlVGRkVSX0FTU0lHTk1FTlQKKwkJI3VuZGVmIFVTRV9EWU5BTUlDX0JVRl9OVU0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBmaXJtd2FyZV9zZWw7CitzdGF0aWMgaW50IGRpc2FibGVfbG9uZ2NhYmFjX3RyYW5zID0gMTsKK3N0YXRpYyBpbnQgcHJlX2RlY29kZV9idWZfbGV2ZWwgPSAweDgwMDsKKworCitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2YXZzX3ZmX3BlZWsodm9pZCAqKTsKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZhdnNfdmZfZ2V0KHZvaWQgKik7CitzdGF0aWMgdm9pZCB2YXZzX3ZmX3B1dChzdHJ1Y3QgdmZyYW1lX3MgKiwgdm9pZCAqKTsKK3N0YXRpYyBpbnQgdmF2c192Zl9zdGF0ZXMoc3RydWN0IHZmcmFtZV9zdGF0ZXMgKnN0YXRlcywgdm9pZCAqKTsKK3N0YXRpYyBpbnQgdmF2c19ldmVudF9jYihpbnQgdHlwZSwgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKKworc3RhdGljIGNvbnN0IGNoYXIgdmF2c19kZWNfaWRbXSA9ICJ2YXZzLWRldiI7CisKKyNkZWZpbmUgUFJPVklERVJfTkFNRSAgICJkZWNvZGVyLmF2cyIKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7CitzdGF0aWMgREVGSU5FX01VVEVYKHZhdnNfbXV0ZXgpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHZmcmFtZV9vcGVyYXRpb25zX3MgdmF2c192Zl9wcm92aWRlciA9IHsKKwkucGVlayA9IHZhdnNfdmZfcGVlaywKKwkuZ2V0ID0gdmF2c192Zl9nZXQsCisJLnB1dCA9IHZhdnNfdmZfcHV0LAorCS5ldmVudF9jYiA9IHZhdnNfZXZlbnRfY2IsCisJLnZmX3N0YXRlcyA9IHZhdnNfdmZfc3RhdGVzLAorfTsKKy8qCitzdGF0aWMgdm9pZCAqbW1fYmxrX2hhbmRsZTsKKyovCitzdGF0aWMgc3RydWN0IHZmcmFtZV9wcm92aWRlcl9zIHZhdnNfdmZfcHJvdjsKKworI2RlZmluZSBWRl9CVUZfTlVNX01BWCAxNgorI2lmZGVmIERFQlVHX01VTFRJX0ZSQU1FX0lOUworI2RlZmluZSBXT1JLU1BBQ0VfU0laRQkJKDE2ICogU1pfMU0pCisjZWxzZQorI2RlZmluZSBXT1JLU1BBQ0VfU0laRQkJKDQgKiBTWl8xTSkKKyNlbmRpZgorI2lmZGVmIEFWU1BfTE9OR19DQUJBQworI2RlZmluZSBNQVhfQk1NVV9CVUZGRVJfTlVNCShWRl9CVUZfTlVNX01BWCArIDIpCisjZGVmaW5lIFdPUktTUEFDRV9TSVpFX0EJCShNQVhfQ09ERURfRlJBTUVfU0laRSArIExPQ0FMX0hFQVBfU0laRSkKKyNlbHNlCisjZGVmaW5lIE1BWF9CTU1VX0JVRkZFUl9OVU0JKFZGX0JVRl9OVU1fTUFYICsgMSkKKyNlbmRpZgorCisjZGVmaW5lIFJWX0FJX0JVRkZfU1RBUlRfQUREUgkgMHgwMWEwMDAwMAorI2RlZmluZSBMT05HX0NBQkFDX1JWX0FJX0JVRkZfU1RBUlRfQUREUgkgMHgwMDAwMDAwMAorCisvKiA0IGJ1ZmZlcnMgbm90IGVub3VnaCBmb3IgbXVsdGkgaW5jKi8KK3N0YXRpYyB1MzIgdmZfYnVmX251bSA9IDg7CisvKnN0YXRpYyB1MzIgdmZfYnVmX251bV91c2VkOyovCitzdGF0aWMgdTMyIGNhbnZhc19iYXNlID0gMTI4OworI2lmZGVmIE5WMjEKK3N0YXRpYyBpbnQJY2FudmFzX251bSA9IDI7IC8qTlYyMSovCisjZWxzZQorc3RhdGljIGludAljYW52YXNfbnVtID0gMzsKKyNlbmRpZgorCisjaWYgMAorc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyB2ZnBvb2xbVkZfUE9PTF9TSVpFXTsKKy8qc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyB2ZnBvb2wyW1ZGX1BPT0xfU0laRV07Ki8KK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKmN1cl92ZnBvb2w7CitzdGF0aWMgdW5zaWduZWQgY2hhciByZWNvdmVyX2ZsYWc7CitzdGF0aWMgczMyIHZmYnVmX3VzZVtWRl9CVUZfTlVNX01BWF07CitzdGF0aWMgdTMyIHNhdmVkX3Jlc29sdXRpb247CitzdGF0aWMgdTMyIGZyYW1lX3dpZHRoLCBmcmFtZV9oZWlnaHQsIGZyYW1lX2R1ciwgZnJhbWVfcHJvZzsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCByZWN5Y2xlX3RpbWVyOworc3RhdGljIHUzMiBzdGF0OworI2VuZGlmCitzdGF0aWMgdTMyIGJ1Zl9zaXplID0gMzIgKiAxMDI0ICogMTAyNDsKKyNpZiAwCitzdGF0aWMgdTMyIGJ1Zl9vZmZzZXQ7CitzdGF0aWMgdTMyIGF2aV9mbGFnOworc3RhdGljIHUzMiB2YXZzX3JhdGlvOworc3RhdGljIHUzMiBwaWNfdHlwZTsKKyNlbmRpZgorc3RhdGljIHUzMiBwdHNfYnlfb2Zmc2V0ID0gMTsKKyNpZiAwCitzdGF0aWMgdTMyIHRvdGFsX2ZyYW1lOworc3RhdGljIHUzMiBuZXh0X3B0czsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHRocm93X3BiX2ZsYWc7CisjaWZkZWYgREVCVUdfUFRTCitzdGF0aWMgdTMyIHB0c19oaXQsIHB0c19taXNzZWQsIHB0c19pX2hpdCwgcHRzX2lfbWlzc2VkOworI2VuZGlmCisjZW5kaWYKK3N0YXRpYyB1MzIgcmFkciwgcnZhbDsKK3N0YXRpYyB1MzIgZGJnX2NtZDsKKyNpZiAwCitzdGF0aWMgc3RydWN0IGRlY19zeXNpbmZvIHZhdnNfYW1zdHJlYW1fZGVjX2luZm87CitzdGF0aWMgc3RydWN0IHZkZWNfaW5mbyAqZ3ZzOworc3RhdGljIHUzMiBmcl9oaW50X3N0YXR1czsKK3N0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3Qgbm90aWZ5X3dvcms7CitzdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IHNldF9jbGtfd29yazsKK3N0YXRpYyBib29sIGlzX3Jlc2V0OworI2VuZGlmCisvKnN0YXRpYyBzdHJ1Y3QgdmRlY19zICp2ZGVjOyovCisKKyNpZmRlZiBBVlNQX0xPTkdfQ0FCQUMKK3N0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3QgbG9uZ19jYWJhY193ZF93b3JrOwordm9pZCAqZXNfd3JpdGVfYWRkcl92aXJ0OworZG1hX2FkZHJfdCBlc193cml0ZV9hZGRyX3BoeTsKKwordm9pZCAqYml0c3RyZWFtX3JlYWRfdG1wOworZG1hX2FkZHJfdCBiaXRzdHJlYW1fcmVhZF90bXBfcGh5Owordm9pZCAqYXZzcF9oZWFwX2FkcjsKK3N0YXRpYyB1aW50IGxvbmdfY2FiYWNfYnVzeTsKKyNlbmRpZgorCisjaWYgMAorI2lmZGVmIEVOQUJMRV9VU0VSX0RBVEEKK3N0YXRpYyB2b2lkICp1c2VyX2RhdGFfYnVmZmVyOworc3RhdGljIGRtYV9hZGRyX3QgdXNlcl9kYXRhX2J1ZmZlcl9waHlzOworI2VuZGlmCitzdGF0aWMgREVDTEFSRV9LRklGTyhuZXdmcmFtZV9xLCBzdHJ1Y3QgdmZyYW1lX3MgKiwgVkZfUE9PTF9TSVpFKTsKK3N0YXRpYyBERUNMQVJFX0tGSUZPKGRpc3BsYXlfcSwgc3RydWN0IHZmcmFtZV9zICosIFZGX1BPT0xfU0laRSk7CitzdGF0aWMgREVDTEFSRV9LRklGTyhyZWN5Y2xlX3EsIHN0cnVjdCB2ZnJhbWVfcyAqLCBWRl9QT09MX1NJWkUpOworI2VuZGlmCitzdGF0aWMgaW5saW5lIHUzMiBpbmRleDJjYW52YXModTMyIGluZGV4KQoreworCWNvbnN0IHUzMiBjYW52YXNfdGFiW1ZGX0JVRl9OVU1fTUFYXSA9IHsKKwkJMHgwMTAxMDAsIDB4MDMwMzAyLCAweDA1MDUwNCwgMHgwNzA3MDYsCisJCTB4MDkwOTA4LCAweDBiMGIwYSwgMHgwZDBkMGMsIDB4MGYwZjBlLAorCQkweDExMTExMCwgMHgxMzEzMTIsIDB4MTUxNTE0LCAweDE3MTcxNiwKKwkJMHgxOTE5MTgsIDB4MWIxYjFhLCAweDFkMWQxYywgMHgxZjFmMWUsCisJfTsKKwljb25zdCB1MzIgY2FudmFzX3RhYl8zWzRdID0geworCQkweDAxMDEwMCwgMHgwNDA0MDMsIDB4MDcwNzA2LCAweDBhMGEwOQorCX07CisKKwlpZiAoY2FudmFzX251bSA9PSAyKQorCQlyZXR1cm4gY2FudmFzX3RhYltpbmRleF0gKyAoY2FudmFzX2Jhc2UgPDwgMTYpCisJCSsgKGNhbnZhc19iYXNlIDw8IDgpICsgY2FudmFzX2Jhc2U7CisKKwlyZXR1cm4gY2FudmFzX3RhYl8zW2luZGV4XSArIChjYW52YXNfYmFzZSA8PCAxNikKKwkJKyAoY2FudmFzX2Jhc2UgPDwgOCkgKyBjYW52YXNfYmFzZTsKK30KKworc3RhdGljIGNvbnN0IHUzMiBmcmFtZV9yYXRlX3RhYlsxNl0gPSB7CisJOTYwMDAgLyAzMCwJCS8qIGZvcmJpZGRlbiAqLworCTk2MDAwMDAwIC8gMjM5NzYsCS8qIDI0MDAwLzEwMDEgKDIzLjk2NykgKi8KKwk5NjAwMCAvIDI0LAorCTk2MDAwIC8gMjUsCisJOTYwMDAwMCAvIDI5OTcsCQkvKiAzMDAwMC8xMDAxICgyOS45NykgKi8KKwk5NjAwMCAvIDMwLAorCTk2MDAwIC8gNTAsCisJOTYwMDAwMCAvIDU5OTQsCQkvKiA2MDAwMC8xMDAxICg1OS45NCkgKi8KKwk5NjAwMCAvIDYwLAorCS8qID4gOCByZXNlcnZlZCwgdXNlIDI0ICovCisJOTYwMDAgLyAyNCwgOTYwMDAgLyAyNCwgOTYwMDAgLyAyNCwgOTYwMDAgLyAyNCwKKwk5NjAwMCAvIDI0LCA5NjAwMCAvIDI0LCA5NjAwMCAvIDI0Cit9OworCisjZGVmaW5lIERFQ09ERV9CVUZGRVJfTlVNX01BWCBWRl9CVUZfTlVNX01BWAorI2RlZmluZSBQSUNfUFRTX05VTSA2NAorc3RydWN0IGJ1Zl9wb29sX3MgeworCXVuc2lnbmVkIGRldGFjaGVkOworCXN0cnVjdCB2ZnJhbWVfcyB2ZjsKK307CisKKyNkZWZpbmUgYnVmX29mX3ZmKHZmKSBjb250YWluZXJfb2YodmYsIHN0cnVjdCBidWZfcG9vbF9zLCB2ZikKKworc3RydWN0IHBpY19wdHNfcyB7CisJdTMyIHB0czsKKwl1NjQgcHRzNjQ7CisJdTY0IHRpbWVzdGFtcDsKKwl1bnNpZ25lZCBzaG9ydCBkZWNvZGVfcGljX2NvdW50OworfTsKKworc3RydWN0IHZkZWNfYXZzX2h3X3MgeworCXNwaW5sb2NrX3QgbG9jazsKKwl1bnNpZ25lZCBjaGFyIG1faW5zX2ZsYWc7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2OworCURFQ0xBUkVfS0ZJRk8obmV3ZnJhbWVfcSwgc3RydWN0IHZmcmFtZV9zICosIFZGX1BPT0xfU0laRSk7CisJREVDTEFSRV9LRklGTyhkaXNwbGF5X3EsIHN0cnVjdCB2ZnJhbWVfcyAqLCBWRl9QT09MX1NJWkUpOworCURFQ0xBUkVfS0ZJRk8ocmVjeWNsZV9xLCBzdHJ1Y3QgdmZyYW1lX3MgKiwgVkZfUE9PTF9TSVpFKTsKKwlzdHJ1Y3QgYnVmX3Bvb2xfcyB2ZnBvb2xbVkZfUE9PTF9TSVpFXTsKKwlzMzIgdmZidWZfdXNlW1ZGX0JVRl9OVU1fTUFYXTsKKwl1bnNpZ25lZCBjaGFyIGFnYWluX2ZsYWc7CisJdW5zaWduZWQgY2hhciByZWNvdmVyX2ZsYWc7CisJdTMyIGZyYW1lX3dpZHRoOworCXUzMiBmcmFtZV9oZWlnaHQ7CisJdTMyIGZyYW1lX2R1cjsKKwl1MzIgZnJhbWVfcHJvZzsKKwl1MzIgc2F2ZWRfcmVzb2x1dGlvbjsKKwl1MzIgYXZpX2ZsYWc7CisJdTMyIHZhdnNfcmF0aW87CisJdTMyIHBpY190eXBlOworCisJdTMyIHZmX2J1Zl9udW1fdXNlZDsKKwl1MzIgdG90YWxfZnJhbWU7CisJdTMyIG5leHRfcHRzOworCXVuc2lnbmVkIGNoYXIgdGhyb3dfcGJfZmxhZzsKKwlzdHJ1Y3QgcGljX3B0c19zIHBpY19wdHNbUElDX1BUU19OVU1dOworCWludCBwaWNfcHRzX3dyX3BvczsKKworI2lmZGVmIERFQlVHX1BUUworCXUzMiBwdHNfaGl0OworCXUzMiBwdHNfbWlzc2VkOworCXUzMiBwdHNfaV9oaXQ7CisJdTMyIHB0c19pX21pc3NlZDsKKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9VU0VSX0RBVEEKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdXNlcmRhdGFfcHVzaF93b3JrOworCXZvaWQgKnVzZXJfZGF0YV9idWZmZXI7CisJZG1hX2FkZHJfdCB1c2VyX2RhdGFfYnVmZmVyX3BoeXM7CisjZW5kaWYKKwlkbWFfYWRkcl90IGxtZW1fYWRkcjsKKwl1bG9uZyBsbWVtX3BoeV9hZGRyOworCisJdTMyIGJ1Zl9vZmZzZXQ7CisKKwlzdHJ1Y3QgZGVjX3N5c2luZm8gdmF2c19hbXN0cmVhbV9kZWNfaW5mbzsKKwlzdHJ1Y3QgdmRlY19pbmZvICpndnM7CisJdTMyIGZyX2hpbnRfc3RhdHVzOworCXN0cnVjdCB3b3JrX3N0cnVjdCBzZXRfY2xrX3dvcms7CisJYm9vbCBpc19yZXNldDsKKworCS8qZGVidWcqLworCXUzMiB1Y29kZV9wYXVzZV9wb3M7CisJLyoqLworCXUzMiBkZWNvZGVfcGljX2NvdW50OworCXU4IHJlc2V0X2RlY29kZV9mbGFnOworCXUzMiBkaXNwbGF5X2ZyYW1lX2NvdW50OworCXUzMiBidWZfc3RhdHVzOworCXUzMiBwcmVfcGFyc2VyX3dyX3B0cjsKKwkJLyoKKwkJYnVmZmVyX3N0YXR1cyAmPSB+YnVmX3JlY3ljbGVfc3RhdHVzCisJCSovCisJdTMyIGJ1Zl9yZWN5Y2xlX3N0YXR1czsKKwl1MzIgc2VxaW5mbzsKKwl1MzIgY3R4X3ZhbGlkOworCXUzMiBkZWNfY29udHJvbDsKKwl2b2lkICptbV9ibGtfaGFuZGxlOworCXN0cnVjdCB2ZnJhbWVfY2h1bmtfcyAqY2h1bms7CisJdTMyIHN0YXQ7CisJdTggaW5pdF9mbGFnOworCXVuc2lnbmVkIGxvbmcgYnVmX3N0YXJ0OworCXUzMiBidWZfc2l6ZTsKKworCXUzMiByZWdfc2NyYXRjaF8wOworCXUzMiByZWdfc2NyYXRjaF8xOworCXUzMiByZWdfc2NyYXRjaF8yOworCXUzMiByZWdfc2NyYXRjaF8zOworCXUzMiByZWdfc2NyYXRjaF80OworCXUzMiByZWdfc2NyYXRjaF81OworCXUzMiByZWdfc2NyYXRjaF82OworCXUzMiByZWdfc2NyYXRjaF83OworCXUzMiByZWdfc2NyYXRjaF84OworCXUzMiByZWdfc2NyYXRjaF85OworCXUzMiByZWdfc2NyYXRjaF9BOworCXUzMiByZWdfc2NyYXRjaF9COworCXUzMiByZWdfc2NyYXRjaF9DOworCXUzMiByZWdfc2NyYXRjaF9EOworCXUzMiByZWdfc2NyYXRjaF9FOworCXUzMiByZWdfc2NyYXRjaF9GOworCXUzMiByZWdfc2NyYXRjaF9HOworCXUzMiByZWdfc2NyYXRjaF9IOworCXUzMiByZWdfc2NyYXRjaF9JOworCXUzMiByZWdfbWJfd2lkdGg7CisJdTMyIHJlZ192aWZmX2JpdF9jbnQ7CisJdTMyIHJlZ19jYW52YXNfYWRkcjsKKwl1MzIgcmVnX2Ria3JfY2FudmFzX2FkZHI7CisJdTMyIHJlZ19kYmt3X2NhbnZhc19hZGRyOworCXUzMiByZWdfYW5jMl9jYW52YXNfYWRkcjsKKwl1MzIgcmVnX2FuYzBfY2FudmFzX2FkZHI7CisJdTMyIHJlZ19hbmMxX2NhbnZhc19hZGRyOworCXUzMiByZWdfYW5jM19jYW52YXNfYWRkcjsKKwl1MzIgcmVnX2FuYzRfY2FudmFzX2FkZHI7CisJdTMyIHJlZ19hbmM1X2NhbnZhc19hZGRyOworCXUzMiBzbGljZV92ZXJfcG9zX3BpY190eXBlOworCXUzMiB2YzFfY29udHJvbF9yZWc7CisJdTMyIGF2c19jb19tYl93cl9hZGRyOworCXUzMiBzbGljZV9zdGFydF9ieXRlXzAxOworCXUzMiBzbGljZV9zdGFydF9ieXRlXzIzOworCXUzMiB2Y29wX2N0cmxfcmVnOworCXUzMiBpcWlkY3RfY29udHJvbDsKKwl1MzIgcnZfYWlfbWJfY291bnQ7CisJdTMyIHNsaWNlX3FwOworCXUzMiBkY19zY2FsZXI7CisJdTMyIGF2c3BfaXFfd3FfcGFyYW1fMDE7CisJdTMyIGF2c3BfaXFfd3FfcGFyYW1fMjM7CisJdTMyIGF2c3BfaXFfd3FfcGFyYW1fNDU7CisJdTMyIGF2c19jb19tYl9yZF9hZGRyOworCXUzMiBkYmxrX21iX3dpZF9oZWlnaHQ7CisJdTMyIG1jX3BpY193X2g7CisJdTMyIGF2c19jb19tYl9yd19jdGw7CisJdTMyIHZsZF9kZWNvZGVfY29udHJvbDsKKworCXN0cnVjdCB0aW1lcl9saXN0IGNoZWNrX3RpbWVyOworCXUzMiBkZWNvZGVfdGltZW91dF9jb3VudDsKKwl1bnNpZ25lZCBsb25nIGludCBzdGFydF9wcm9jZXNzX3RpbWU7CisJdTMyIGxhc3RfdmxkX2xldmVsOworCXUzMiBlb3M7CisJdTMyIGNhbnZhc19zcGVjW0RFQ09ERV9CVUZGRVJfTlVNX01BWF07CisJc3RydWN0IGNhbnZhc19jb25maWdfcyBjYW52YXNfY29uZmlnW0RFQ09ERV9CVUZGRVJfTlVNX01BWF1bMl07CisKKwlzMzIgcmVmc1syXTsKKwlpbnQgZGVjX3Jlc3VsdDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCByZWN5Y2xlX3RpbWVyOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXN0cnVjdCB3b3JrX3N0cnVjdCBub3RpZnlfd29yazsKKwlhdG9taWNfdCBlcnJvcl9oYW5kbGVyX3J1bjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZmF0YWxfZXJyb3Jfd2Rfd29yazsKKwl2b2lkICgqdmRlY19jYikoc3RydWN0IHZkZWNfcyAqLCB2b2lkICopOworCXZvaWQgKnZkZWNfY2JfYXJnOworLyogZm9yIGVycm9yIGhhbmRsaW5nICovCisJdTMyIHJ1bl9jb3VudDsKKwl1MzIJbm90X3J1bl9yZWFkeTsKKwl1MzIJaW5wdXRfZW1wdHk7CisJdTMyIHByZXBhcmVfbnVtOworCXUzMiBwdXRfbnVtOworCXUzMiBwZWVrX251bTsKKwl1MzIgZ2V0X251bTsKKwl1MzIgZHJvcF9mcmFtZV9jb3VudDsKKwl1MzIgYnVmZmVyX25vdF9yZWFkeTsKKwlpbnQgZnJhbWVpbmZvX2VuYWJsZTsKKwlzdHJ1Y3QgZmlybXdhcmVfcyAqZnc7CisJdTMyIG9sZF91ZGVidWdfZmxhZzsKKwl1MzIgZGVjb2RlX3N0YXR1c19za2lwX3BpY19kb25lX2ZsYWc7CisJdTMyIGRlY29kZV9kZWNvZGVfY29udF9zdGFydF9jb2RlOworCWludCB2ZGVjX3BnX2VuYWJsZV9mbGFnOworCWNoYXIgdmRlY19uYW1lWzMyXTsKKwljaGFyIHB0c19uYW1lWzMyXTsKKwljaGFyIG5ld19xX25hbWVbMzJdOworCWNoYXIgZGlzcF9xX25hbWVbMzJdOworfTsKKworc3RhdGljIHZvaWQgcmVzZXRfcHJvY2Vzc190aW1lKHN0cnVjdCB2ZGVjX2F2c19od19zICpodyk7CitzdGF0aWMgdm9pZCBzdGFydF9wcm9jZXNzX3RpbWUoc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3KTsKK3N0YXRpYyB2b2lkIHZhdnNfc2F2ZV9yZWdzKHN0cnVjdCB2ZGVjX2F2c19od19zICpodyk7CisKK3N0cnVjdCB2ZGVjX2F2c19od19zICpnaHc7CisKKyNkZWZpbmUgTVVMVElfSU5TVEFOQ0VfUFJPVklERVJfTkFNRSAgICAidmRlYy5hdnMiCisKKyNkZWZpbmUgREVDX1JFU1VMVF9OT05FICAgICAwCisjZGVmaW5lIERFQ19SRVNVTFRfRE9ORSAgICAgMQorI2RlZmluZSBERUNfUkVTVUxUX0FHQUlOICAgIDIKKyNkZWZpbmUgREVDX1JFU1VMVF9FUlJPUiAgICAzCisjZGVmaW5lIERFQ19SRVNVTFRfRk9SQ0VfRVhJVCA0CisjZGVmaW5lIERFQ19SRVNVTFRfRU9TIDUKKyNkZWZpbmUgREVDX1JFU1VMVF9HRVRfREFUQSAgICAgICAgIDYKKyNkZWZpbmUgREVDX1JFU1VMVF9HRVRfREFUQV9SRVRSWSAgIDcKKyNkZWZpbmUgREVDX1JFU1VMVF9VU0VSREFUQSAgICAgICAgIDgKKworI2RlZmluZSBERUNPREVfSUQoaHcpIChody0+bV9pbnNfZmxhZz8gaHdfdG9fdmRlYyhodyktPmlkIDogMCkKKworI2RlZmluZSBQUklOVF9GTEFHX0VSUk9SICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgUFJJTlRfRkxBR19SVU5fRkxPVyAgICAgICAgICAgMFgwMDAxCisjZGVmaW5lIFBSSU5UX0ZMQUdfREVDT0RJTkcgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBQUklOVF9GTEFHX1BUUyAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgUFJJTlRfRkxBR19WRlJBTUVfREVUQUlMCSAgMHgwMDEwCisjZGVmaW5lIFBSSU5UX0ZMQUdfVkxEX0RFVEFJTCAgICAgICAgIDB4MDAyMAorI2RlZmluZSBQUklOVF9GTEFHX0RFQ19ERVRBSUwgICAgICAgICAweDAwNDAKKyNkZWZpbmUgUFJJTlRfRkxBR19CVUZGRVJfREVUQUlMICAgICAgMHgwMDgwCisjZGVmaW5lIFBSSU5UX0ZMQUdfRk9SQ0VfRE9ORSAgICAgICAgIDB4MDEwMAorI2RlZmluZSBQUklOVF9GTEFHX0NPVU5URVIgICAgICAgICAgICAwWDAyMDAKKyNkZWZpbmUgUFJJTlRfRlJBTUVCQVNFX0RBVEEgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFBSSU5UX0ZMQUdfUEFSQV9EQVRBICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBERUJVR19GTEFHX1BSRVBBUkVfTU9SRV9JTlBVVCAweDIwMDAKKyNkZWZpbmUgREVCVUdfRkxBR19QUklOVF9SRUcgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIERFQlVHX0ZMQUdfRElTQUJMRV9USU1FT1VUICAgIDB4MTAwMDAKKyNkZWZpbmUgREVCVUdfV0FJVF9ERUNPREVfRE9ORV9XSEVOX1NUT1AgMHgyMDAwMAorI2RlZmluZSBERUJVR19QSUNfRE9ORV9XSEVOX1VDT0RFX1BBVVNFIDB4NDAwMDAKKworCisjdW5kZWYgREVCVUdfUkVHCisjaWZkZWYgREVCVUdfUkVHCitzdGF0aWMgdm9pZCBXUklURV9WUkVHX0RCRzIodW5zaWduZWQgYWRyLCB1bnNpZ25lZCB2YWwpCit7CisJaWYgKGRlYnVnICYgREVCVUdfRkxBR19QUklOVF9SRUcpCisJCXByX2luZm8oIiVzKCV4LCAleClcbiIsIF9fZnVuY19fLCBhZHIsIHZhbCk7CisJaWYgKGFkciAhPSAwKQorCQlXUklURV9WUkVHKGFkciwgdmFsKTsKK30KKworI3VuZGVmIFdSSVRFX1ZSRUcKKyNkZWZpbmUgV1JJVEVfVlJFRyBXUklURV9WUkVHX0RCRzIKKyNlbmRpZgorCisjdW5kZWYgcHJfaW5mbworI2RlZmluZSBwcl9pbmZvIHByaW50aworc3RhdGljIGludCBkZWJ1Z19wcmludChzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcsCisJaW50IGZsYWcsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworI2RlZmluZSBBVlNfUFJJTlRfQlVGCQkyNTYKKwl1bnNpZ25lZCBjaGFyIGJ1ZltBVlNfUFJJTlRfQlVGXTsKKwlpbnQgbGVuID0gMDsKKwlpbnQgaW5kZXggPSAwOworCWlmIChodykKKwkJaW5kZXggPSBody0+bV9pbnNfZmxhZyA/IERFQ09ERV9JRChodykgOiAwOworCWlmIChodyA9PSBOVUxMIHx8CisJCShmbGFnID09IDApIHx8CisJCSgoZGVidWdfbWFzayAmCisJCSgxIDw8IGluZGV4KSkKKwkJJiYgKGRlYnVnICYgZmxhZykpKSB7CisJCXZhX2xpc3QgYXJnczsKKworCQl2YV9zdGFydChhcmdzLCBmbXQpOworCQlpZiAoaHcpCisJCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIlslZF0iLCBpbmRleCk7CisJCXZzbnByaW50ZihidWYgKyBsZW4sIEFWU19QUklOVF9CVUYgLSBsZW4sIGZtdCwgYXJncyk7CisJCXByX2luZm8oIiVzIiwgYnVmKTsKKwkJdmFfZW5kKGFyZ3MpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWJ1Z19wcmludF9jb250KHN0cnVjdCB2ZGVjX2F2c19od19zICpodywKKwlpbnQgZmxhZywgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdW5zaWduZWQgY2hhciBidWZbQVZTX1BSSU5UX0JVRl07CisJaW50IGxlbiA9IDA7CisJaW50IGluZGV4ID0gMDsKKwlpZiAoaHcpCisJCWluZGV4ID0gaHctPm1faW5zX2ZsYWcgPyBERUNPREVfSUQoaHcpIDogMDsKKwlpZiAoaHcgPT0gTlVMTCB8fAorCQkoZmxhZyA9PSAwKSB8fAorCQkoKGRlYnVnX21hc2sgJgorCQkoMSA8PCBpbmRleCkpCisJCSYmIChkZWJ1ZyAmIGZsYWcpKSkgeworCQl2YV9saXN0IGFyZ3M7CisKKwkJdmFfc3RhcnQoYXJncywgZm10KTsKKwkJdnNucHJpbnRmKGJ1ZiArIGxlbiwgQVZTX1BSSU5UX0JVRiAtIGxlbiwgZm10LCBhcmdzKTsKKwkJcHJfaW5mbygiJXMiLCBidWYpOworCQl2YV9lbmQoYXJncyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhdnNfcHRzX2NoZWNrX2luKHN0cnVjdCB2ZGVjX2F2c19od19zICpodywKKwl1bnNpZ25lZCBzaG9ydCBkZWNvZGVfcGljX2NvdW50LCBzdHJ1Y3QgdmZyYW1lX2NodW5rX3MgKmNodW5rKQoreworCWlmIChjaHVuaykKKwkJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfUFRTLAorCQkJIiVzICVkICh3ciBwb3MgJWQpLCBwdHMgJWQgcHRzNjQgJWxkIHRpbWVzdGFtcCAlbGRcbiIsCisJCQlfX2Z1bmNfXywgZGVjb2RlX3BpY19jb3VudCwgaHctPnBpY19wdHNfd3JfcG9zLAorCQkJY2h1bmstPnB0cywgKHU2NCkoY2h1bmstPnB0czY0KSwgKHU2NCkoY2h1bmstPnRpbWVzdGFtcCkpOworCWVsc2UKKwkJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfUFRTLAorCQkJIiVzICVkLCBjaHVuayBpcyBudWxsXG4iLAorCQkJX19mdW5jX18sIGRlY29kZV9waWNfY291bnQpOworCisJaWYgKGNodW5rKSB7CisJCWh3LT5waWNfcHRzW2h3LT5waWNfcHRzX3dyX3Bvc10ucHRzID0gY2h1bmstPnB0czsKKwkJaHctPnBpY19wdHNbaHctPnBpY19wdHNfd3JfcG9zXS5wdHM2NCA9IGNodW5rLT5wdHM2NDsKKwkJaHctPnBpY19wdHNbaHctPnBpY19wdHNfd3JfcG9zXS50aW1lc3RhbXAgPSBjaHVuay0+dGltZXN0YW1wOworCX0gZWxzZSB7CisJCWh3LT5waWNfcHRzW2h3LT5waWNfcHRzX3dyX3Bvc10ucHRzID0gMDsKKwkJaHctPnBpY19wdHNbaHctPnBpY19wdHNfd3JfcG9zXS5wdHM2NCA9IDA7CisJCWh3LT5waWNfcHRzW2h3LT5waWNfcHRzX3dyX3Bvc10udGltZXN0YW1wID0gMDsKKwl9CisJaHctPnBpY19wdHNbaHctPnBpY19wdHNfd3JfcG9zXS5kZWNvZGVfcGljX2NvdW50CisJCT0gZGVjb2RlX3BpY19jb3VudDsKKwlody0+cGljX3B0c193cl9wb3MrKzsKKwlpZiAoaHctPnBpY19wdHNfd3JfcG9zID49IFBJQ19QVFNfTlVNKQorCQlody0+cGljX3B0c193cl9wb3MgPSAwOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfcHRzX2J1ZihzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcpCit7CisJaW50IGk7CisJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfUFRTLAorCQkJIiVzXG4iLAlfX2Z1bmNfXyk7CisJaHctPnBpY19wdHNfd3JfcG9zID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgUElDX1BUU19OVU07IGkrKykgeworCQlody0+cGljX3B0c1tody0+cGljX3B0c193cl9wb3NdLnB0cyA9IDA7CisJCWh3LT5waWNfcHRzW2h3LT5waWNfcHRzX3dyX3Bvc10ucHRzNjQgPSAwOworCQlody0+cGljX3B0c1tody0+cGljX3B0c193cl9wb3NdLnRpbWVzdGFtcCA9IDA7CisJCWh3LT5waWNfcHRzW2h3LT5waWNfcHRzX3dyX3Bvc10uZGVjb2RlX3BpY19jb3VudCA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IHNldF92ZnJhbWVfcHRzKHN0cnVjdCB2ZGVjX2F2c19od19zICpodywKKwl1bnNpZ25lZCBzaG9ydCBkZWNvZGVfcGljX2NvdW50LCBzdHJ1Y3QgdmZyYW1lX3MgKnZmKQoreworCWludCBpOworCWludCByZXQgPSAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgUElDX1BUU19OVU07IGkrKykgeworCQlpZiAoaHctPnBpY19wdHNbaV0uZGVjb2RlX3BpY19jb3VudCA9PSBkZWNvZGVfcGljX2NvdW50KSB7CisJCQl2Zi0+cHRzID0gaHctPnBpY19wdHNbaV0ucHRzOworCQkJdmYtPnB0c191czY0ID0gaHctPnBpY19wdHNbaV0ucHRzNjQ7CisJCQl2Zi0+dGltZXN0YW1wID0gaHctPnBpY19wdHNbaV0udGltZXN0YW1wOworCQkJcmV0ID0gMDsKKwkJCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX1BUUywKKwkJCQkiJXMgJWQgKHJkIHBvcyAlZCksIHB0cyAlZCBwdHM2NCAlbGQgdGltZXN0YW1wICVsZFxuIiwKKwkJCQlfX2Z1bmNfXywgZGVjb2RlX3BpY19jb3VudCwgaSwKKwkJCQl2Zi0+cHRzLCB2Zi0+cHRzX3VzNjQsIHZmLT50aW1lc3RhbXApOworCisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBhdnNfdmZfbm90aWZ5X3JlY2VpdmVyKHN0cnVjdCB2ZGVjX2F2c19od19zICpodywKKwljb25zdCBjaGFyICpwcm92aWRlcl9uYW1lLCBpbnQgZXZlbnRfdHlwZSwgdm9pZCAqZGF0YSkKK3sKKwlpZiAoaHctPm1faW5zX2ZsYWcpCisJCXZmX25vdGlmeV9yZWNlaXZlcihod190b192ZGVjKGh3KS0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCWV2ZW50X3R5cGUsIGRhdGEpOworCWVsc2UKKwkJdmZfbm90aWZ5X3JlY2VpdmVyKHByb3ZpZGVyX25hbWUsIGV2ZW50X3R5cGUsIGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBzZXRfZnJhbWVfaW5mbyhzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcsIHN0cnVjdCB2ZnJhbWVfcyAqdmYsCisJdW5zaWduZWQgaW50ICpkdXJhdGlvbikKK3sKKwlpbnQgYXIgPSAwOworCisJdW5zaWduZWQgaW50IHBpeGVsX3JhdGlvID0gUkVBRF9WUkVHKEFWU19QSUNfUkFUSU8pOworCWh3LT5wcmVwYXJlX251bSsrOworI2lmbmRlZiBVU0VfQVZTX1NFUV9JTkZPCisJaWYgKGh3LT52YXZzX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoID4gMAorCQkmJiBody0+dmF2c19hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQgPiAwKSB7CisJCXZmLT53aWR0aCA9IGh3LT52YXZzX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoOworCQl2Zi0+aGVpZ2h0ID0gaHctPnZhdnNfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0OworCX0gZWxzZQorI2VuZGlmCisJeworCQl2Zi0+d2lkdGggPSBSRUFEX1ZSRUcoQVZTX1BJQ19XSURUSCk7CisJCXZmLT5oZWlnaHQgPSBSRUFEX1ZSRUcoQVZTX1BJQ19IRUlHSFQpOworCQlody0+ZnJhbWVfd2lkdGggPSB2Zi0+d2lkdGg7CisJCWh3LT5mcmFtZV9oZWlnaHQgPSB2Zi0+aGVpZ2h0OworCQkvKiBwcl9pbmZvKCIlczogKCVkLCVkKVxuIiwgX19mdW5jX18sdmYtPndpZHRoLCB2Zi0+aGVpZ2h0KTsqLworCX0KKworI2lmbmRlZiBVU0VfQVZTX1NFUV9JTkZPCisJaWYgKGh3LT52YXZzX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgPiAwKQorCQkqZHVyYXRpb24gPSBody0+dmF2c19hbXN0cmVhbV9kZWNfaW5mby5yYXRlOworCWVsc2UKKyNlbmRpZgorCXsKKwkJKmR1cmF0aW9uID0gZnJhbWVfcmF0ZV90YWJbUkVBRF9WUkVHKEFWU19GUkFNRV9SQVRFKSAmIDB4Zl07CisJCS8qIHByX2luZm8oIiVzOiBkdXJhdGlvbiA9ICVkXG4iLCBfX2Z1bmNfXywgKmR1cmF0aW9uKTsgKi8KKwkJaHctPmZyYW1lX2R1ciA9ICpkdXJhdGlvbjsKKwkJc2NoZWR1bGVfd29yaygmaHctPm5vdGlmeV93b3JrKTsKKwl9CisKKwlpZiAoaHctPnZhdnNfcmF0aW8gPT0gMCkgeworCQkvKiBhbHdheXMgc3RyZXRjaCB0byAxNjo5ICovCisJCXZmLT5yYXRpb19jb250cm9sIHw9ICgweDkwIDw8CisJCQkJRElTUF9SQVRJT19BU1BFQ1RfUkFUSU9fQklUKTsKKwkJdmYtPnNhcl93aWR0aCA9IDE7CisJCXZmLT5zYXJfaGVpZ2h0ID0gMTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKHBpeGVsX3JhdGlvKSB7CisJCWNhc2UgMToKKwkJCXZmLT5zYXJfd2lkdGggPSAxOworCQkJdmYtPnNhcl9oZWlnaHQgPSAxOworCQkJYXIgPSAodmYtPmhlaWdodCAqIGh3LT52YXZzX3JhdGlvKSAvIHZmLT53aWR0aDsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQl2Zi0+c2FyX3dpZHRoID0gNDsKKwkJCXZmLT5zYXJfaGVpZ2h0ID0gMzsKKwkJCWFyID0gKHZmLT5oZWlnaHQgKiAzICogaHctPnZhdnNfcmF0aW8pIC8gKHZmLT53aWR0aCAqIDQpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXZmLT5zYXJfd2lkdGggPSAxNjsKKwkJCXZmLT5zYXJfaGVpZ2h0ID0gOTsKKwkJCWFyID0gKHZmLT5oZWlnaHQgKiA5ICogaHctPnZhdnNfcmF0aW8pIC8gKHZmLT53aWR0aCAqIDE2KTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQl2Zi0+c2FyX3dpZHRoID0gMjIxOworCQkJdmYtPnNhcl9oZWlnaHQgPSAxMDA7CisJCQlhciA9ICh2Zi0+aGVpZ2h0ICogMTAwICogaHctPnZhdnNfcmF0aW8pIC8gKHZmLT53aWR0aCAqCisJCQkJCTIyMSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXZmLT5zYXJfd2lkdGggPSAxOworCQkJdmYtPnNhcl9oZWlnaHQgPSAxOworCQkJYXIgPSAodmYtPmhlaWdodCAqIGh3LT52YXZzX3JhdGlvKSAvIHZmLT53aWR0aDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJYXIgPSBtaW4oYXIsIERJU1BfUkFUSU9fQVNQRUNUX1JBVElPX01BWCk7CisKKwl2Zi0+cmF0aW9fY29udHJvbCA9IChhciA8PCBESVNQX1JBVElPX0FTUEVDVF9SQVRJT19CSVQpOworCS8qdmYtPnJhdGlvX2NvbnRyb2wgfD0gRElTUF9SQVRJT19GT1JDRUNPTkZJRyB8IERJU1BfUkFUSU9fS0VFUFJBVElPOyAqLworCisJdmYtPmZsYWcgPSAwOworCWJ1Zl9vZl92Zih2ZiktPmRldGFjaGVkID0gMDsKKworfQorCisjaWZkZWYgRU5BQkxFX1VTRVJfREFUQQorCisvKnN0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3QgdXNlcmRhdGFfcHVzaF93b3JrOyovCisvKgorI2RlZmluZSBEVU1QX0xBU1RfUkVQT1JURURfVVNFUl9EQVRBCisqLworc3RhdGljIHZvaWQgdXNlcmRhdGFfcHVzaF9wcm9jZXNzKHN0cnVjdCB2ZGVjX2F2c19od19zICpodykKK3sKKwl1bnNpZ25lZCBpbnQgdXNlcl9kYXRhX2ZsYWdzOworCXVuc2lnbmVkIGludCB1c2VyX2RhdGFfd3A7CisJdW5zaWduZWQgaW50IHVzZXJfZGF0YV9sZW5ndGg7CisJc3RydWN0IHVzZXJkYXRhX3BvY19pbmZvX3QgdXNlcl9kYXRhX3BvYzsKKyNpZmRlZiBEVU1QX0xBU1RfUkVQT1JURURfVVNFUl9EQVRBCisJaW50IHVzZXJfZGF0YV9sZW47CisJaW50IHdwX3N0YXJ0OworCXVuc2lnbmVkIGNoYXIgKnBkYXRhOworCWludCBuTGVmdDsKKyNlbmRpZgorCisJdXNlcl9kYXRhX2ZsYWdzID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfTik7CisJdXNlcl9kYXRhX3dwID0gKHVzZXJfZGF0YV9mbGFncyA+PiAxNikgJiAweGZmZmY7CisJdXNlcl9kYXRhX2xlbmd0aCA9IHVzZXJfZGF0YV9mbGFncyAmIDB4N2ZmZjsKKworI2lmZGVmIERVTVBfTEFTVF9SRVBPUlRFRF9VU0VSX0RBVEEKKwlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQlody0+dXNlcl9kYXRhX2J1ZmZlcl9waHlzLCBVU0VSX0RBVEFfU0laRSwKKwkJCURNQV9GUk9NX0RFVklDRSk7CisKKwlpZiAodXNlcl9kYXRhX2xlbmd0aCAmIDB4MDcpCisJCXVzZXJfZGF0YV9sZW4gPSAodXNlcl9kYXRhX2xlbmd0aCArIDgpICYgMHhGRkZGRkZGODsKKwllbHNlCisJCXVzZXJfZGF0YV9sZW4gPSB1c2VyX2RhdGFfbGVuZ3RoOworCisJaWYgKHVzZXJfZGF0YV93cCA+PSB1c2VyX2RhdGFfbGVuKSB7CisJCXdwX3N0YXJ0ID0gdXNlcl9kYXRhX3dwIC0gdXNlcl9kYXRhX2xlbjsKKworCQlwZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopaHctPnVzZXJfZGF0YV9idWZmZXI7CisJCXBkYXRhICs9IHdwX3N0YXJ0OworCQluTGVmdCA9IHVzZXJfZGF0YV9sZW47CisJCXdoaWxlIChuTGVmdCA+PSA4KSB7CisJCQlwcl9pbmZvKCIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQkJcGRhdGFbMF0sIHBkYXRhWzFdLCBwZGF0YVsyXSwgcGRhdGFbM10sCisJCQkJcGRhdGFbNF0sIHBkYXRhWzVdLCBwZGF0YVs2XSwgcGRhdGFbN10pOworCQkJbkxlZnQgLT0gODsKKwkJCXBkYXRhICs9IDg7CisJCX0KKwl9IGVsc2UgeworCQl3cF9zdGFydCA9IHVzZXJfZGF0YV93cCArCisJCQlVU0VSX0RBVEFfU0laRSAtIHVzZXJfZGF0YV9sZW47CisKKwkJcGRhdGEgPSAodW5zaWduZWQgY2hhciAqKWh3LT51c2VyX2RhdGFfYnVmZmVyOworCQlwZGF0YSArPSB3cF9zdGFydDsKKwkJbkxlZnQgPSBVU0VSX0RBVEFfU0laRSAtIHdwX3N0YXJ0OworCisJCXdoaWxlIChuTGVmdCA+PSA4KSB7CisJCQlwcl9pbmZvKCIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQkJcGRhdGFbMF0sIHBkYXRhWzFdLCBwZGF0YVsyXSwgcGRhdGFbM10sCisJCQkJcGRhdGFbNF0sIHBkYXRhWzVdLCBwZGF0YVs2XSwgcGRhdGFbN10pOworCQkJbkxlZnQgLT0gODsKKwkJCXBkYXRhICs9IDg7CisJCX0KKworCQlwZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopaHctPnVzZXJfZGF0YV9idWZmZXI7CisJCW5MZWZ0ID0gdXNlcl9kYXRhX3dwOworCQl3aGlsZSAobkxlZnQgPj0gOCkgeworCQkJcHJfaW5mbygiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJCXBkYXRhWzBdLCBwZGF0YVsxXSwgcGRhdGFbMl0sIHBkYXRhWzNdLAorCQkJCXBkYXRhWzRdLCBwZGF0YVs1XSwgcGRhdGFbNl0sIHBkYXRhWzddKTsKKwkJCW5MZWZ0IC09IDg7CisJCQlwZGF0YSArPSA4OworCQl9CisJfQorI2VuZGlmCisKKy8qCisJcHJfaW5mbygicG9jaW5mbyAweCV4LCBwb2MgJWQsIHdwIDB4JXgsIGxlbiAlZFxuIiwKKwkJICAgUkVBRF9WUkVHKEFWX1NDUkFUQ0hfTCksIFJFQURfVlJFRyhBVl9TQ1JBVENIX00pLAorCQkgICB1c2VyX2RhdGFfd3AsIHVzZXJfZGF0YV9sZW5ndGgpOworKi8KKwl1c2VyX2RhdGFfcG9jLnBvY19pbmZvID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfTCk7CisJdXNlcl9kYXRhX3BvYy5wb2NfbnVtYmVyID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfTSk7CisKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfTiwgMCk7CisvKgorCXdha2V1cF91c2VyZGF0YV9wb2xsKHVzZXJfZGF0YV9wb2MsIHVzZXJfZGF0YV93cCwKKwkJCQkodW5zaWduZWQgbG9uZylody0+dXNlcl9kYXRhX2J1ZmZlciwKKwkJCQlVU0VSX0RBVEFfU0laRSwgdXNlcl9kYXRhX2xlbmd0aCk7CisqLworfQorCitzdGF0aWMgdm9pZCB1c2VyZGF0YV9wdXNoX2RvX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB2ZGVjX2F2c19od19zICpodyA9CisJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB2ZGVjX2F2c19od19zLCB1c2VyZGF0YV9wdXNoX3dvcmspOworCXVzZXJkYXRhX3B1c2hfcHJvY2Vzcyhodyk7Cit9CisKK3N0YXRpYyB1OCBVc2VyRGF0YUhhbmRsZXIoc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3KQoreworCXVuc2lnbmVkIGludCB1c2VyX2RhdGFfZmxhZ3M7CisKKwl1c2VyX2RhdGFfZmxhZ3MgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9OKTsKKwlpZiAodXNlcl9kYXRhX2ZsYWdzICYgKDEgPDwgMTUpKSB7CS8qIGRhdGEgcmVhZHkgKi8KKwkJaWYgKGh3LT5tX2luc19mbGFnKSB7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfVVNFUkRBVEE7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCXJldHVybiAxOworCQl9IGVsc2UKKwkJCXNjaGVkdWxlX3dvcmsoJmh3LT51c2VyZGF0YV9wdXNoX3dvcmspOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdnNfdXBkYXRlX2d2cyhzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcpCit7CisJaWYgKGh3LT5ndnMtPmZyYW1lX2hlaWdodCAhPSBody0+ZnJhbWVfaGVpZ2h0KSB7CisJCWh3LT5ndnMtPmZyYW1lX3dpZHRoID0gaHctPmZyYW1lX3dpZHRoOworCQlody0+Z3ZzLT5mcmFtZV9oZWlnaHQgPSBody0+ZnJhbWVfaGVpZ2h0OworCX0KKwlpZiAoaHctPmd2cy0+ZnJhbWVfZHVyICE9IGh3LT5mcmFtZV9kdXIpIHsKKwkJaHctPmd2cy0+ZnJhbWVfZHVyID0gaHctPmZyYW1lX2R1cjsKKwkJaWYgKGh3LT5mcmFtZV9kdXIgIT0gMCkKKwkJCWh3LT5ndnMtPmZyYW1lX3JhdGUgPSAoKDk2MDAwICogMTAgLyBody0+ZnJhbWVfZHVyKSAlIDEwKSA8IDUgPworCQkJCQk5NjAwMCAvIGh3LT5mcmFtZV9kdXIgOiAoOTYwMDAgLyBody0+ZnJhbWVfZHVyICsxKTsKKwkJZWxzZQorCQkJaHctPmd2cy0+ZnJhbWVfcmF0ZSA9IC0xOworCX0KKworCWh3LT5ndnMtPnN0YXR1cyA9IGh3LT5zdGF0OworCWh3LT5ndnMtPmVycm9yX2NvdW50ID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfQyk7CisJaHctPmd2cy0+ZHJvcF9mcmFtZV9jb3VudCA9IGh3LT5kcm9wX2ZyYW1lX2NvdW50OworCit9CisKKyNpZmRlZiBIQU5ETEVfQVZTX0lSUQorc3RhdGljIGlycXJldHVybl90IHZhdnNfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKKyNlbHNlCitzdGF0aWMgdm9pZCB2YXZzX2lzcih2b2lkKQorI2VuZGlmCit7CisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfQ0xSX1JFRywgMSk7CisKKwlyZXR1cm4gSVJRX1dBS0VfVEhSRUFEOworfQorLyoKKyAqc3RhdGljIGludCBydW5fZmxhZyA9IDE7CisgKnN0YXRpYyBpbnQgc3RlcF9mbGFnOworICovCitzdGF0aWMgaW50IGVycm9yX3JlY292ZXJ5X21vZGU7ICAgLyowOiBibG9ja3kgIDE6IG1vc2FpYyovCisvKgorICpzdGF0aWMgdWludCBlcnJvcl93YXRjaGRvZ190aHJlc2hvbGQ9MTA7CisgKnN0YXRpYyB1aW50IGVycm9yX3dhdGNoZG9nX2NvdW50OworICpzdGF0aWMgdWludCBlcnJvcl93YXRjaGRvZ19idWZfdGhyZXNob2xkID0gMHg0MDAwMDAwOworICovCisKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZhdnNfdmZfcGVlayh2b2lkICpvcF9hcmcpCit7CisJc3RydWN0IHZmcmFtZV9zICp2ZjsKKwlzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcgPQorCShzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqKW9wX2FyZzsKKwlody0+cGVla19udW0rKzsKKwlpZiAoc3RlcCA9PSAyKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoaHctPnJlY292ZXJfZmxhZykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoa2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKSA+IFZGX1BPT0xfU0laRSkgeworCQlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19SVU5fRkxPVywKKwkJCSJrZmlmbyBsZW46JWQgaW52YWlsZCwgcGVlayBlcnJvclxuIiwKKwkJCWtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoa2ZpZm9fcGVlaygmaHctPmRpc3BsYXlfcSwgJnZmKSkgeworCQlpZiAodmYpIHsKKwkJCWlmIChmb3JjZV9mcHMgJiAweDEwMCkgeworCQkJCXUzMiByYXRlID0gZm9yY2VfZnBzICYgMHhmZjsKKworCQkJCWlmIChyYXRlKQorCQkJCQl2Zi0+ZHVyYXRpb24gPSA5NjAwMC9yYXRlOworCQkJCWVsc2UKKwkJCQkJdmYtPmR1cmF0aW9uID0gMDsKKwkJCX0KKworCQl9CisJCXJldHVybiB2ZjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKKworfQorCitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2YXZzX3ZmX2dldCh2b2lkICpvcF9hcmcpCit7CisJc3RydWN0IHZmcmFtZV9zICp2ZjsKKwlzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcgPQorCShzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqKW9wX2FyZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGh3LT5yZWNvdmVyX2ZsYWcpCisJCXJldHVybiBOVUxMOworCisJaWYgKHN0ZXAgPT0gMikKKwkJcmV0dXJuIE5VTEw7CisJZWxzZSBpZiAoc3RlcCA9PSAxKQorCQlzdGVwID0gMjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CisJaWYgKGtmaWZvX2dldCgmaHctPmRpc3BsYXlfcSwgJnZmKSkgeworCQlpZiAodmYpIHsKKwkJCWh3LT5nZXRfbnVtKys7CisJCQlpZiAoZm9yY2VfZnBzICYgMHgxMDApIHsKKwkJCQl1MzIgcmF0ZSA9IGZvcmNlX2ZwcyAmIDB4ZmY7CisKKwkJCQlpZiAocmF0ZSkKKwkJCQkJdmYtPmR1cmF0aW9uID0gOTYwMDAvcmF0ZTsKKwkJCQllbHNlCisJCQkJCXZmLT5kdXJhdGlvbiA9IDA7CisJCQl9CisKKwkJCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX1ZGUkFNRV9ERVRBSUwsCisJCQkJIiVzLCBpbmRleCA9ICVkLCB3ICVkIGggJWQsIHR5cGUgMHgleCBkZXRhY2hlZCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQl2Zi0+aW5kZXgsCisJCQkJdmYtPndpZHRoLAorCQkJCXZmLT5oZWlnaHQsCisJCQkJdmYtPnR5cGUsCisJCQkJYnVmX29mX3ZmKHZmKS0+ZGV0YWNoZWQpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHZmOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CisJcmV0dXJuIE5VTEw7CisKK30KKworc3RhdGljIHZvaWQgdmF2c192Zl9wdXQoc3RydWN0IHZmcmFtZV9zICp2Ziwgdm9pZCAqb3BfYXJnKQoreworCWludCBpOworCXN0cnVjdCB2ZGVjX2F2c19od19zICpodyA9CisJKHN0cnVjdCB2ZGVjX2F2c19od19zICopb3BfYXJnOworCisJaWYgKHZmKSB7CisJCWh3LT5wdXRfbnVtKys7CisJCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX1ZGUkFNRV9ERVRBSUwsCisJCQkiJXMsIGluZGV4ID0gJWQsIHcgJWQgaCAlZCwgdHlwZSAweCV4IGRldGFjaGVkIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywKKwkJCXZmLT5pbmRleCwKKwkJCXZmLT53aWR0aCwKKwkJCXZmLT5oZWlnaHQsCisJCQl2Zi0+dHlwZSwKKwkJCWJ1Zl9vZl92Zih2ZiktPmRldGFjaGVkKTsKKwl9CisJaWYgKGh3LT5yZWNvdmVyX2ZsYWcpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBWRl9QT09MX1NJWkU7IGkrKykgeworCQlpZiAodmYgPT0gJmh3LT52ZnBvb2xbaV0udmYpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPCBWRl9QT09MX1NJWkUpCisKKwkJa2ZpZm9fcHV0KCZody0+cmVjeWNsZV9xLCAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCit9CisKK3N0YXRpYyBpbnQgdmF2c19ldmVudF9jYihpbnQgdHlwZSwgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZV9kYXRhKQoreworCXN0cnVjdCB2ZGVjX2F2c19od19zICpodyA9IChzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqKXByaXZhdGVfZGF0YTsKKworCWlmICh0eXBlICYgVkZSQU1FX0VWRU5UX1JFQ0VJVkVSX1JFUV9TVEFURSkgeworCQlzdHJ1Y3QgcHJvdmlkZXJfc3RhdGVfcmVxX3MgKnJlcSA9CisJCQkoc3RydWN0IHByb3ZpZGVyX3N0YXRlX3JlcV9zICopZGF0YTsKKwkJaWYgKHJlcS0+cmVxX3R5cGUgPT0gUkVRX1NUQVRFX1NFQ1VSRSkKKwkJCXJlcS0+cmVxX3Jlc3VsdFswXSA9IHZkZWNfc2VjdXJlKGh3X3RvX3ZkZWMoaHcpKTsKKwkJZWxzZQorCQkJcmVxLT5yZXFfcmVzdWx0WzBdID0gMHhmZmZmZmZmZjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2YXZzX2RlY19zdGF0dXMoc3RydWN0IHZkZWNfcyAqdmRlYywgc3RydWN0IHZkZWNfaW5mbyAqdnN0YXR1cykKK3sKKwlzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcgPQorCShzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJLyppZiAoIShody0+c3RhdCAmIFNUQVRfVkRFQ19SVU4pKQorCQlyZXR1cm4gLTE7Ki8KKwlpZiAoIWh3KQorCQlyZXR1cm4gLTE7CisKKwl2c3RhdHVzLT5mcmFtZV93aWR0aCA9IGh3LT5mcmFtZV93aWR0aDsKKwl2c3RhdHVzLT5mcmFtZV9oZWlnaHQgPSBody0+ZnJhbWVfaGVpZ2h0OworCWlmIChody0+ZnJhbWVfZHVyICE9IDApCisJCXZzdGF0dXMtPmZyYW1lX3JhdGUgPSAoKDk2MDAwICogMTAgLyBody0+ZnJhbWVfZHVyKSAlIDEwKSA8IDUgPworCQkJCTk2MDAwIC8gaHctPmZyYW1lX2R1ciA6ICg5NjAwMCAvIGh3LT5mcmFtZV9kdXIgKzEpOworCWVsc2UKKwkJdnN0YXR1cy0+ZnJhbWVfcmF0ZSA9IC0xOworCXZzdGF0dXMtPmVycm9yX2NvdW50ID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfQyk7CisJdnN0YXR1cy0+c3RhdHVzID0gaHctPnN0YXQ7CisJdnN0YXR1cy0+Yml0X3JhdGUgPSBody0+Z3ZzLT5iaXRfcmF0ZTsKKwl2c3RhdHVzLT5mcmFtZV9kdXIgPSBody0+ZnJhbWVfZHVyOworCXZzdGF0dXMtPmZyYW1lX2RhdGEgPSBody0+Z3ZzLT5mcmFtZV9kYXRhOworCXZzdGF0dXMtPnRvdGFsX2RhdGEgPSBody0+Z3ZzLT50b3RhbF9kYXRhOworCXZzdGF0dXMtPmZyYW1lX2NvdW50ID0gaHctPmd2cy0+ZnJhbWVfY291bnQ7CisJdnN0YXR1cy0+ZXJyb3JfZnJhbWVfY291bnQgPSBody0+Z3ZzLT5lcnJvcl9mcmFtZV9jb3VudDsKKwl2c3RhdHVzLT5kcm9wX2ZyYW1lX2NvdW50ID0gaHctPmd2cy0+ZHJvcF9mcmFtZV9jb3VudDsKKwl2c3RhdHVzLT5pX2RlY29kZWRfZnJhbWVzID0gaHctPmd2cy0+aV9kZWNvZGVkX2ZyYW1lczsKKwl2c3RhdHVzLT5pX2xvc3RfZnJhbWVzID0gaHctPmd2cy0+aV9sb3N0X2ZyYW1lczsKKwl2c3RhdHVzLT5pX2NvbmNlYWxlZF9mcmFtZXMgPSBody0+Z3ZzLT5pX2NvbmNlYWxlZF9mcmFtZXM7CisJdnN0YXR1cy0+cF9kZWNvZGVkX2ZyYW1lcyA9IGh3LT5ndnMtPnBfZGVjb2RlZF9mcmFtZXM7CisJdnN0YXR1cy0+cF9sb3N0X2ZyYW1lcyA9IGh3LT5ndnMtPnBfbG9zdF9mcmFtZXM7CisJdnN0YXR1cy0+cF9jb25jZWFsZWRfZnJhbWVzID0gaHctPmd2cy0+cF9jb25jZWFsZWRfZnJhbWVzOworCXZzdGF0dXMtPmJfZGVjb2RlZF9mcmFtZXMgPSBody0+Z3ZzLT5iX2RlY29kZWRfZnJhbWVzOworCXZzdGF0dXMtPmJfbG9zdF9mcmFtZXMgPSBody0+Z3ZzLT5iX2xvc3RfZnJhbWVzOworCXZzdGF0dXMtPmJfY29uY2VhbGVkX2ZyYW1lcyA9IGh3LT5ndnMtPmJfY29uY2VhbGVkX2ZyYW1lczsKKwl2c3RhdHVzLT50b3RhbF9kYXRhID0gaHctPmd2cy0+dG90YWxfZGF0YTsKKwl2c3RhdHVzLT5zYW1wX2NudCA9IGh3LT5ndnMtPnNhbXBfY250OworCXZzdGF0dXMtPm9mZnNldCA9IGh3LT5ndnMtPm9mZnNldDsKKwlzbnByaW50Zih2c3RhdHVzLT52ZGVjX25hbWUsIHNpemVvZih2c3RhdHVzLT52ZGVjX25hbWUpLAorCQkiJXMiLCBEUklWRVJfTkFNRSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2YXZzX3NldF9pc3Jlc2V0KHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBpc3Jlc2V0KQoreworCXN0cnVjdCB2ZGVjX2F2c19od19zICpodyA9CisJKHN0cnVjdCB2ZGVjX2F2c19od19zICopdmRlYy0+cHJpdmF0ZTsKKworCWh3LT5pc19yZXNldCA9IGlzcmVzZXQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmF2c192ZGVjX2luZm9faW5pdChzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcpCit7CisKKwlody0+Z3ZzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZkZWNfaW5mbyksIEdGUF9LRVJORUwpOworCWlmIChOVUxMID09IGh3LT5ndnMpIHsKKwkJcHJfaW5mbygidGhlIHN0cnVjdCBvZiB2ZGVjIHN0YXR1cyBtYWxsb2MgZmFpbGVkLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHZhdnNfY2FudmFzX2luaXQoc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3KQoreworCWludCBpLCByZXQ7CisJdTMyIGNhbnZhc193aWR0aCwgY2FudmFzX2hlaWdodDsKKwl1MzIgZGVjYnVmX3NpemUsIGRlY2J1Zl95X3NpemUsIGRlY2J1Zl91dl9zaXplOworCXVuc2lnbmVkIGxvbmcgYnVmX3N0YXJ0OworCWludCBuZWVkX2FsbG9jX2J1Zl9udW07CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IE5VTEw7CisKKwlpZiAoaHctPm1faW5zX2ZsYWcpCisJCXZkZWMgPSBod190b192ZGVjKGh3KTsKKworCWlmIChidWZfc2l6ZSA8PSAweDAwNDAwMDAwKSB7CisJCS8qIFNEIG9ubHkgKi8KKwkJY2FudmFzX3dpZHRoID0gNzY4OworCQljYW52YXNfaGVpZ2h0ID0gNTc2OworCQlkZWNidWZfeV9zaXplID0gMHg4MDAwMDsKKwkJZGVjYnVmX3V2X3NpemUgPSAweDIwMDAwOworCQlkZWNidWZfc2l6ZSA9IDB4MTAwMDAwOworCX0gZWxzZSB7CisJCS8qIEhEICYgU0QgKi8KKwkJY2FudmFzX3dpZHRoID0gMTkyMDsKKwkJY2FudmFzX2hlaWdodCA9IDEwODg7CisJCWRlY2J1Zl95X3NpemUgPSAweDIwMDAwMDsKKwkJZGVjYnVmX3V2X3NpemUgPSAweDgwMDAwOworCQlkZWNidWZfc2l6ZSA9IDB4MzAwMDAwOworCX0KKworI2lmZGVmIEFWU1BfTE9OR19DQUJBQworCW5lZWRfYWxsb2NfYnVmX251bSA9IGh3LT52Zl9idWZfbnVtX3VzZWQgKyAyOworI2Vsc2UKKwluZWVkX2FsbG9jX2J1Zl9udW0gPSBody0+dmZfYnVmX251bV91c2VkICsgMTsKKyNlbmRpZgorCWZvciAoaSA9IDA7IGkgPCBuZWVkX2FsbG9jX2J1Zl9udW07IGkrKykgeworCisJCWlmIChpID09IChuZWVkX2FsbG9jX2J1Zl9udW0gLSAxKSkKKwkJCWRlY2J1Zl9zaXplID0gV09SS1NQQUNFX1NJWkU7CisjaWZkZWYgQVZTUF9MT05HX0NBQkFDCisJCWVsc2UgaWYgKGkgPT0gKG5lZWRfYWxsb2NfYnVmX251bSAtIDIpKQorCQkJZGVjYnVmX3NpemUgPSBXT1JLU1BBQ0VfU0laRV9BOworI2VuZGlmCisJCXJldCA9IGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeShody0+bW1fYmxrX2hhbmRsZSwgaSwKKwkJCQlkZWNidWZfc2l6ZSwgRFJJVkVSX05BTUUsICZidWZfc3RhcnQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCWlmIChpID09IChuZWVkX2FsbG9jX2J1Zl9udW0gLSAxKSkgeworCQkJaWYgKGZpcm13YXJlX3NlbCA9PSAxKQorCQkJCWh3LT5idWZfb2Zmc2V0ID0gYnVmX3N0YXJ0IC0KKwkJCQkJUlZfQUlfQlVGRl9TVEFSVF9BRERSOworCQkJZWxzZQorCQkJCWh3LT5idWZfb2Zmc2V0ID0gYnVmX3N0YXJ0IC0KKwkJCQkJTE9OR19DQUJBQ19SVl9BSV9CVUZGX1NUQVJUX0FERFI7CisJCQljb250aW51ZTsKKwkJfQorI2lmZGVmIEFWU1BfTE9OR19DQUJBQworCQllbHNlIGlmIChpID09IChuZWVkX2FsbG9jX2J1Zl9udW0gLSAyKSkgeworCQkJYXZzcF9oZWFwX2FkciA9IGNvZGVjX21tX3BoeXNfdG9fdmlydChidWZfc3RhcnQpOworCQkJY29udGludWU7CisJCX0KKyNlbmRpZgorCQlpZiAoaHctPm1faW5zX2ZsYWcpIHsKKwkJCXVuc2lnbmVkIGNhbnZhczsKKworCQkJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCQkJdW5zaWduZWQgdG1wOworCQkJCWlmIChjYW52YXNfdShody0+Y2FudmFzX3NwZWNbaV0pID09IDB4ZmYpIHsKKwkJCQkJdG1wID0KKwkJCQkJCXZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX1ZERUNfMSwgdmRlYy0+aWQpOworCQkJCQlody0+Y2FudmFzX3NwZWNbaV0gJj0gfigweGZmZmYgPDwgOCk7CisJCQkJCWh3LT5jYW52YXNfc3BlY1tpXSB8PSB0bXAgPDwgODsKKwkJCQkJaHctPmNhbnZhc19zcGVjW2ldIHw9IHRtcCA8PCAxNjsKKwkJCQl9CisJCQkJaWYgKGNhbnZhc195KGh3LT5jYW52YXNfc3BlY1tpXSkgPT0gMHhmZikgeworCQkJCQl0bXAgPQorCQkJCQkJdmRlYy0+Z2V0X2NhbnZhc19leChDT1JFX01BU0tfVkRFQ18xLCB2ZGVjLT5pZCk7CisJCQkJCWh3LT5jYW52YXNfc3BlY1tpXSAmPSB+MHhmZjsKKwkJCQkJaHctPmNhbnZhc19zcGVjW2ldIHw9IHRtcDsKKwkJCQl9CisJCQkJY2FudmFzID0gaHctPmNhbnZhc19zcGVjW2ldOworCQkJfSBlbHNlIHsKKwkJCQljYW52YXMgPSB2ZGVjLT5nZXRfY2FudmFzKGksIDIpOworCQkJCWh3LT5jYW52YXNfc3BlY1tpXSA9IGNhbnZhczsKKwkJCX0KKworCQkJaHctPmNhbnZhc19jb25maWdbaV1bMF0ucGh5X2FkZHIgPQorCQkJYnVmX3N0YXJ0OworCQkJaHctPmNhbnZhc19jb25maWdbaV1bMF0ud2lkdGggPQorCQkJY2FudmFzX3dpZHRoOworCQkJaHctPmNhbnZhc19jb25maWdbaV1bMF0uaGVpZ2h0ID0KKwkJCWNhbnZhc19oZWlnaHQ7CisJCQlody0+Y2FudmFzX2NvbmZpZ1tpXVswXS5ibG9ja19tb2RlID0KKwkJCUNBTlZBU19CTEtNT0RFXzMyWDMyOworCisJCQlody0+Y2FudmFzX2NvbmZpZ1tpXVsxXS5waHlfYWRkciA9CisJCQlidWZfc3RhcnQgKyBkZWNidWZfeV9zaXplOworCQkJaHctPmNhbnZhc19jb25maWdbaV1bMV0ud2lkdGggPQorCQkJY2FudmFzX3dpZHRoOworCQkJaHctPmNhbnZhc19jb25maWdbaV1bMV0uaGVpZ2h0ID0KKwkJCWNhbnZhc19oZWlnaHQgLyAyOworCQkJaHctPmNhbnZhc19jb25maWdbaV1bMV0uYmxvY2tfbW9kZSA9CisJCQlDQU5WQVNfQkxLTU9ERV8zMlgzMjsKKworCQl9IGVsc2UgeworI2lmZGVmIE5WMjEKKwkJCWNvbmZpZ19jYXZfbHV0X2V4KGNhbnZhc19iYXNlICsgY2FudmFzX251bSAqIGkgKyAwLAorCQkJCQlidWZfc3RhcnQsCisJCQkJCWNhbnZhc193aWR0aCwgY2FudmFzX2hlaWdodCwKKwkJCQkJQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJCQlDQU5WQVNfQkxLTU9ERV8zMlgzMiwgMCwgVkRFQ18xKTsKKwkJCWNvbmZpZ19jYXZfbHV0X2V4KGNhbnZhc19iYXNlICsgY2FudmFzX251bSAqIGkgKyAxLAorCQkJCQlidWZfc3RhcnQgKworCQkJCQlkZWNidWZfeV9zaXplLCBjYW52YXNfd2lkdGgsCisJCQkJCWNhbnZhc19oZWlnaHQgLyAyLAorCQkJCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCQkJCUNBTlZBU19CTEtNT0RFXzMyWDMyLCAwLCBWREVDXzEpOworI2Vsc2UKKwkJCWNvbmZpZ19jYXZfbHV0X2V4KGNhbnZhc19udW0gKiBpICsgMCwKKwkJCQkJYnVmX3N0YXJ0LAorCQkJCQljYW52YXNfd2lkdGgsIGNhbnZhc19oZWlnaHQsCisJCQkJCUNBTlZBU19BRERSX05PV1JBUCwKKwkJCQkJQ0FOVkFTX0JMS01PREVfMzJYMzIsIDAsIFZERUNfMSk7CisJCQljb25maWdfY2F2X2x1dF9leChjYW52YXNfbnVtICogaSArIDEsCisJCQkJCWJ1Zl9zdGFydCArCisJCQkJCWRlY2J1Zl95X3NpemUsIGNhbnZhc193aWR0aCAvIDIsCisJCQkJCWNhbnZhc19oZWlnaHQgLyAyLAorCQkJCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCQkJCUNBTlZBU19CTEtNT0RFXzMyWDMyLCAwLCBWREVDXzEpOworCQkJY29uZmlnX2Nhdl9sdXRfZXgoY2FudmFzX251bSAqIGkgKyAyLAorCQkJCQlidWZfc3RhcnQgKworCQkJCQlkZWNidWZfeV9zaXplICsgZGVjYnVmX3V2X3NpemUsCisJCQkJCWNhbnZhc193aWR0aCAvIDIsIGNhbnZhc19oZWlnaHQgLyAyLAorCQkJCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCQkJCUNBTlZBU19CTEtNT0RFXzMyWDMyLCAwLCBWREVDXzEpOworI2VuZGlmCisJCQlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19WRlJBTUVfREVUQUlMLAorCQkJCSJjYW52YXMgY29uZmlnICVkLCBhZGRyICVwXG4iLCBpLAorCQkJCQkgICAodm9pZCAqKWJ1Zl9zdGFydCk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZhdnNfcmVjb3ZlcihzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcpCit7CisJdmF2c19jYW52YXNfaW5pdChodyk7CisKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsICgxIDw8IDcpIHwgKDEgPDwgNikgfCAoMSA8PCA0KSk7CisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAwKTsKKworCVJFQURfVlJFRyhET1NfU1dfUkVTRVQwKTsKKworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgKDEgPDwgNykgfCAoMSA8PCA2KSB8ICgxIDw8IDQpKTsKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsIDApOworCisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAoMSA8PCA5KSB8ICgxIDw8IDgpKTsKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsIDApOworCisJaWYgKGZpcm13YXJlX3NlbCA9PSAxKSB7CisJCVdSSVRFX1ZSRUcoUE9XRVJfQ1RMX1ZMRCwgMHgxMCk7CisJCVdSSVRFX1ZSRUdfQklUUyhWTERfTUVNX1ZJRklGT19DT05UUk9MLCAyLAorCQkJTUVNX0ZJRk9fQ05UX0JJVCwgMik7CisJCVdSSVRFX1ZSRUdfQklUUyhWTERfTUVNX1ZJRklGT19DT05UUk9MLCA4LAorCQkJTUVNX0xFVkVMX0NOVF9CSVQsIDYpOworCX0KKworCisJaWYgKGZpcm13YXJlX3NlbCA9PSAwKSB7CisJCS8qIGZpeGVkIGNhbnZhcyBpbmRleCAqLworCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfMCwgY2FudmFzX2Jhc2UpOworCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfMSwgaHctPnZmX2J1Zl9udW1fdXNlZCk7CisJfSBlbHNlIHsKKwkJaW50IGlpOworI2lmbmRlZiBVU0VfRFlOQU1JQ19CVUZfTlVNCisJCWZvciAoaWkgPSAwOyBpaSA8IDQ7IGlpKyspIHsKKwkJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8wICsgaWksCisJCQkJKGNhbnZhc19iYXNlICsgY2FudmFzX251bSAqIGlpKSB8CisJCQkJKChjYW52YXNfYmFzZSArIGNhbnZhc19udW0gKiBpaSArIDEpCisJCQkJCTw8IDgpIHwKKwkJCQkoKGNhbnZhc19iYXNlICsgY2FudmFzX251bSAqIGlpICsgMSkKKwkJCQkJPDwgMTYpCisJCQkpOworCQl9CisjZWxzZQorCQlmb3IgKGlpID0gMDsgaWkgPCBody0+dmZfYnVmX251bV91c2VkOyBpaSArPSAyKSB7CisJCQlXUklURV9WUkVHKGJ1Zl9zcGVjX3JlZ1tpaSA+PiAxXSwKKwkJCQkoY2FudmFzX2Jhc2UgKyBjYW52YXNfbnVtICogaWkpIHwKKwkJCQkoKGNhbnZhc19iYXNlICsgY2FudmFzX251bSAqIGlpICsgMSkKKwkJCQkJPDwgOCkgfAorCQkJCSgoY2FudmFzX2Jhc2UgKyBjYW52YXNfbnVtICogaWkgKyAyKQorCQkJCQk8PCAxNikgfAorCQkJCSgoY2FudmFzX2Jhc2UgKyBjYW52YXNfbnVtICogaWkgKyAzKQorCQkJCQk8PCAyNCkKKwkJCSk7CisJCX0KKyNlbmRpZgorCX0KKworCS8qIG5vdGlmeSB1Y29kZSB0aGUgYnVmZmVyIG9mZnNldCAqLworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9GLCBody0+YnVmX29mZnNldCk7CisKKwkvKiBkaXNhYmxlIFBTQ0FMRSBmb3IgaGFyZHdhcmUgc2hhcmluZyAqLworCVdSSVRFX1ZSRUcoUFNDQUxFX0NUUkwsIDApOworCisjaWZuZGVmIFVTRV9EWU5BTUlDX0JVRl9OVU0KKwlXUklURV9WUkVHKEFWU19TT1NfQ09VTlQsIDApOworI2VuZGlmCisJV1JJVEVfVlJFRyhBVlNfQlVGRkVSSU4sIDApOworCVdSSVRFX1ZSRUcoQVZTX0JVRkZFUk9VVCwgMCk7CisJaWYgKGVycm9yX3JlY292ZXJ5X21vZGUpCisJCVdSSVRFX1ZSRUcoQVZTX0VSUk9SX1JFQ09WRVJZX01PREUsIDApOworCWVsc2UKKwkJV1JJVEVfVlJFRyhBVlNfRVJST1JfUkVDT1ZFUllfTU9ERSwgMSk7CisJLyogY2xlYXIgbWFpbGJveCBpbnRlcnJ1cHQgKi8KKwlXUklURV9WUkVHKEFTU0lTVF9NQk9YMV9DTFJfUkVHLCAxKTsKKworCS8qIGVuYWJsZSBtYWlsYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoQVNTSVNUX01CT1gxX01BU0ssIDEpOworI2lmbmRlZiBVU0VfRFlOQU1JQ19CVUZfTlVNCQkJCS8qIGRlZiBERUJVR19VQ09ERSAqLworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9ELCAwKTsKKyNlbmRpZgorCisjaWZkZWYgTlYyMQorCVNFVF9WUkVHX01BU0soTURFQ19QSUNfRENfQ1RSTCwgMSA8PCAxNyk7CisjZW5kaWYKKwlDTEVBUl9WUkVHX01BU0soTURFQ19QSUNfRENfQ1RSTCwgMSA8PCAxNik7CisKKyNpZmRlZiBQSUNfRENfTkVFRF9DTEVBUgorCUNMRUFSX1ZSRUdfTUFTSyhNREVDX1BJQ19EQ19DVFJMLCAxIDw8IDMxKTsKKyNlbmRpZgorCisjaWZkZWYgQVZTUF9MT05HX0NBQkFDCisJaWYgKGZpcm13YXJlX3NlbCA9PSAwKSB7CisJCVdSSVRFX1ZSRUcoTE9OR19DQUJBQ19ERVNfQUREUiwgZXNfd3JpdGVfYWRkcl9waHkpOworCQlXUklURV9WUkVHKExPTkdfQ0FCQUNfUkVRLCAwKTsKKwkJV1JJVEVfVlJFRyhMT05HX0NBQkFDX1BJQ19TSVpFLCAwKTsKKwkJV1JJVEVfVlJFRyhMT05HX0NBQkFDX1NSQ19BRERSLCAwKTsKKwl9CisjZW5kaWYKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfNSwgMCk7CisKK30KKworI2RlZmluZSBNQllfTUJYICAgICAgICAgICAgICAgICBNQl9NT1RJT05fTU9ERSAvKjB4YzA3Ki8KKyNkZWZpbmUgQVZTX0NPX01CX1dSX0FERFIgICAgICAgIDB4YzM4CisjZGVmaW5lIEFWU19DT19NQl9SV19DVEwgICAgICAgICAweGMzZAorI2RlZmluZSBBVlNfQ09fTUJfUkRfQUREUiAgICAgICAgMHhjMzkKKyNkZWZpbmUgQVZTUF9JUV9XUV9QQVJBTV8wMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MGUxOQorI2RlZmluZSBBVlNQX0lRX1dRX1BBUkFNXzIzICAgICAgICAgICAgICAgICAgICAgICAgMHgwZTFhCisjZGVmaW5lIEFWU1BfSVFfV1FfUEFSQU1fNDUgICAgICAgICAgICAgICAgICAgICAgICAweDBlMWIKKworc3RhdGljIHZvaWQgdmF2c19zYXZlX3JlZ3Moc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3KQoreworCWh3LT5yZWdfc2NyYXRjaF8wID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfMCk7CisJaHctPnJlZ19zY3JhdGNoXzEgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF8xKTsKKwlody0+cmVnX3NjcmF0Y2hfMiA9IFJFQURfVlJFRyhBVl9TQ1JBVENIXzIpOworCWh3LT5yZWdfc2NyYXRjaF8zID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfMyk7CisJaHctPnJlZ19zY3JhdGNoXzQgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF80KTsKKwlody0+cmVnX3NjcmF0Y2hfNSA9IFJFQURfVlJFRyhBVl9TQ1JBVENIXzUpOworCWh3LT5yZWdfc2NyYXRjaF82ID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfNik7CisJaHctPnJlZ19zY3JhdGNoXzcgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF83KTsKKwlody0+cmVnX3NjcmF0Y2hfOCA9IFJFQURfVlJFRyhBVl9TQ1JBVENIXzgpOworCWh3LT5yZWdfc2NyYXRjaF85ID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfOSk7CisJaHctPnJlZ19zY3JhdGNoX0EgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9BKTsKKwlody0+cmVnX3NjcmF0Y2hfQiA9IFJFQURfVlJFRyhBVl9TQ1JBVENIX0IpOworCWh3LT5yZWdfc2NyYXRjaF9DID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfQyk7CisJaHctPnJlZ19zY3JhdGNoX0QgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9EKTsKKwlody0+cmVnX3NjcmF0Y2hfRSA9IFJFQURfVlJFRyhBVl9TQ1JBVENIX0UpOworCWh3LT5yZWdfc2NyYXRjaF9GID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfRik7CisJaHctPnJlZ19zY3JhdGNoX0cgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9HKTsKKwlody0+cmVnX3NjcmF0Y2hfSCA9IFJFQURfVlJFRyhBVl9TQ1JBVENIX0gpOworCWh3LT5yZWdfc2NyYXRjaF9JID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfSSk7CisKKwlody0+cmVnX21iX3dpZHRoID0gUkVBRF9WUkVHKE1CX1dJRFRIKTsKKwlody0+cmVnX3ZpZmZfYml0X2NudCA9IFJFQURfVlJFRyhWSUZGX0JJVF9DTlQpOworCisJaHctPnJlZ19jYW52YXNfYWRkciA9IFJFQURfVlJFRyhSRUNfQ0FOVkFTX0FERFIpOworCWh3LT5yZWdfZGJrcl9jYW52YXNfYWRkciA9IFJFQURfVlJFRyhEQktSX0NBTlZBU19BRERSKTsKKwlody0+cmVnX2Ria3dfY2FudmFzX2FkZHIgPSBSRUFEX1ZSRUcoREJLV19DQU5WQVNfQUREUik7CisJaHctPnJlZ19hbmMyX2NhbnZhc19hZGRyID0gUkVBRF9WUkVHKEFOQzJfQ0FOVkFTX0FERFIpOworCWh3LT5yZWdfYW5jMF9jYW52YXNfYWRkciA9IFJFQURfVlJFRyhBTkMwX0NBTlZBU19BRERSKTsKKwlody0+cmVnX2FuYzFfY2FudmFzX2FkZHIgPSBSRUFEX1ZSRUcoQU5DMV9DQU5WQVNfQUREUik7CisJaHctPnJlZ19hbmMzX2NhbnZhc19hZGRyID0gUkVBRF9WUkVHKEFOQzNfQ0FOVkFTX0FERFIpOworCWh3LT5yZWdfYW5jNF9jYW52YXNfYWRkciA9IFJFQURfVlJFRyhBTkM0X0NBTlZBU19BRERSKTsKKwlody0+cmVnX2FuYzVfY2FudmFzX2FkZHIgPSBSRUFEX1ZSRUcoQU5DNV9DQU5WQVNfQUREUik7CisKKwlody0+c2xpY2VfdmVyX3Bvc19waWNfdHlwZSA9IFJFQURfVlJFRyhTTElDRV9WRVJfUE9TX1BJQ19UWVBFKTsKKworCWh3LT52YzFfY29udHJvbF9yZWcgPSBSRUFEX1ZSRUcoVkMxX0NPTlRST0xfUkVHKTsKKwlody0+YXZzX2NvX21iX3dyX2FkZHIgPSBSRUFEX1ZSRUcoQVZTX0NPX01CX1dSX0FERFIpOworCWh3LT5zbGljZV9zdGFydF9ieXRlXzAxID0gUkVBRF9WUkVHKFNMSUNFX1NUQVJUX0JZVEVfMDEpOworCWh3LT5zbGljZV9zdGFydF9ieXRlXzIzID0gUkVBRF9WUkVHKFNMSUNFX1NUQVJUX0JZVEVfMjMpOworCWh3LT52Y29wX2N0cmxfcmVnID0gUkVBRF9WUkVHKFZDT1BfQ1RSTF9SRUcpOworCWh3LT5pcWlkY3RfY29udHJvbCA9IFJFQURfVlJFRyhJUUlEQ1RfQ09OVFJPTCk7CisJaHctPnJ2X2FpX21iX2NvdW50ID0gUkVBRF9WUkVHKFJWX0FJX01CX0NPVU5UKTsKKwlody0+c2xpY2VfcXAgPSBSRUFEX1ZSRUcoU0xJQ0VfUVApOworCisJaHctPmRjX3NjYWxlciA9IFJFQURfVlJFRyhEQ19TQ0FMRVIpOworCWh3LT5hdnNwX2lxX3dxX3BhcmFtXzAxID0gUkVBRF9WUkVHKEFWU1BfSVFfV1FfUEFSQU1fMDEpOworCWh3LT5hdnNwX2lxX3dxX3BhcmFtXzIzID0gUkVBRF9WUkVHKEFWU1BfSVFfV1FfUEFSQU1fMjMpOworCWh3LT5hdnNwX2lxX3dxX3BhcmFtXzQ1ID0gUkVBRF9WUkVHKEFWU1BfSVFfV1FfUEFSQU1fNDUpOworCWh3LT5hdnNfY29fbWJfcmRfYWRkciA9IFJFQURfVlJFRyhBVlNfQ09fTUJfUkRfQUREUik7CisJaHctPmRibGtfbWJfd2lkX2hlaWdodCA9IFJFQURfVlJFRyhEQkxLX01CX1dJRF9IRUlHSFQpOworCWh3LT5tY19waWNfd19oID0gUkVBRF9WUkVHKE1DX1BJQ19XX0gpOworCWh3LT5hdnNfY29fbWJfcndfY3RsID0gUkVBRF9WUkVHKEFWU19DT19NQl9SV19DVEwpOworCisJaHctPnZsZF9kZWNvZGVfY29udHJvbCA9IFJFQURfVlJFRyhWTERfREVDT0RFX0NPTlRST0wpOworfQorCitzdGF0aWMgdm9pZCB2YXZzX3Jlc3RvcmVfcmVncyhzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcpCit7CisJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfREVDT0RJTkcsCisJCSIlcyBzY3JhdGNoXzggKEFWU19CVUZGRVJJTikgMHgleCwgZGVjb2RlX3BpY19jb3VudCA9ICVkXG4iLAorCQlfX2Z1bmNfXywgaHctPnJlZ19zY3JhdGNoXzgsIGh3LT5kZWNvZGVfcGljX2NvdW50KTsKKworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8wLCBody0+cmVnX3NjcmF0Y2hfMCk7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzEsIGh3LT5yZWdfc2NyYXRjaF8xKTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfMiwgaHctPnJlZ19zY3JhdGNoXzIpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8zLCBody0+cmVnX3NjcmF0Y2hfMyk7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzQsIGh3LT5yZWdfc2NyYXRjaF80KTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfNSwgaHctPnJlZ19zY3JhdGNoXzUpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF82LCBody0+cmVnX3NjcmF0Y2hfNik7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzcsIGh3LT5yZWdfc2NyYXRjaF83KTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfOCwgaHctPnJlZ19zY3JhdGNoXzgpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF85LCBody0+cmVnX3NjcmF0Y2hfOSk7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0EsIGh3LT5yZWdfc2NyYXRjaF9BKTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfQiwgaHctPnJlZ19zY3JhdGNoX0IpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9DLCBody0+cmVnX3NjcmF0Y2hfQyk7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0QsIGh3LT5yZWdfc2NyYXRjaF9EKTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfRSwgaHctPnJlZ19zY3JhdGNoX0UpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9GLCBody0+cmVnX3NjcmF0Y2hfRik7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0csIGh3LT5yZWdfc2NyYXRjaF9HKTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfSCwgaHctPnJlZ19zY3JhdGNoX0gpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9JLCBody0+cmVnX3NjcmF0Y2hfSSk7CisKKwlXUklURV9WUkVHKE1CX1dJRFRILCBody0+cmVnX21iX3dpZHRoKTsKKwlXUklURV9WUkVHKFZJRkZfQklUX0NOVCwgaHctPnJlZ192aWZmX2JpdF9jbnQpOworCisJV1JJVEVfVlJFRyhSRUNfQ0FOVkFTX0FERFIsIGh3LT5yZWdfY2FudmFzX2FkZHIpOworICAgIFdSSVRFX1ZSRUcoREJLUl9DQU5WQVNfQUREUiwgaHctPnJlZ19kYmtyX2NhbnZhc19hZGRyKTsKKyAgICBXUklURV9WUkVHKERCS1dfQ0FOVkFTX0FERFIsIGh3LT5yZWdfZGJrd19jYW52YXNfYWRkcik7CisgICAgV1JJVEVfVlJFRyhBTkMyX0NBTlZBU19BRERSLCBody0+cmVnX2FuYzJfY2FudmFzX2FkZHIpOworICAgIFdSSVRFX1ZSRUcoQU5DMF9DQU5WQVNfQUREUiwgaHctPnJlZ19hbmMwX2NhbnZhc19hZGRyKTsKKyAgICBXUklURV9WUkVHKEFOQzFfQ0FOVkFTX0FERFIsIGh3LT5yZWdfYW5jMV9jYW52YXNfYWRkcik7CisgICAgV1JJVEVfVlJFRyhBTkMzX0NBTlZBU19BRERSLCBody0+cmVnX2FuYzNfY2FudmFzX2FkZHIpOworICAgIFdSSVRFX1ZSRUcoQU5DNF9DQU5WQVNfQUREUiwgaHctPnJlZ19hbmM0X2NhbnZhc19hZGRyKTsKKyAgICBXUklURV9WUkVHKEFOQzVfQ0FOVkFTX0FERFIsIGh3LT5yZWdfYW5jNV9jYW52YXNfYWRkcik7CisKKyAgICBXUklURV9WUkVHKFNMSUNFX1ZFUl9QT1NfUElDX1RZUEUsIGh3LT5zbGljZV92ZXJfcG9zX3BpY190eXBlKTsKKworICAgIFdSSVRFX1ZSRUcoVkMxX0NPTlRST0xfUkVHLCBody0+dmMxX2NvbnRyb2xfcmVnKTsKKyAgICBXUklURV9WUkVHKEFWU19DT19NQl9XUl9BRERSLCBody0+YXZzX2NvX21iX3dyX2FkZHIpOworICAgIFdSSVRFX1ZSRUcoU0xJQ0VfU1RBUlRfQllURV8wMSwgaHctPnNsaWNlX3N0YXJ0X2J5dGVfMDEpOworICAgIFdSSVRFX1ZSRUcoU0xJQ0VfU1RBUlRfQllURV8yMywgaHctPnNsaWNlX3N0YXJ0X2J5dGVfMjMpOworICAgIFdSSVRFX1ZSRUcoVkNPUF9DVFJMX1JFRywgaHctPnZjb3BfY3RybF9yZWcpOworICAgIFdSSVRFX1ZSRUcoSVFJRENUX0NPTlRST0wsIGh3LT5pcWlkY3RfY29udHJvbCk7CisgICAgV1JJVEVfVlJFRyhSVl9BSV9NQl9DT1VOVCwgaHctPnJ2X2FpX21iX2NvdW50KTsKKyAgICBXUklURV9WUkVHKFNMSUNFX1FQLCBody0+c2xpY2VfcXApOworCisgICAgV1JJVEVfVlJFRyhEQ19TQ0FMRVIsIGh3LT5kY19zY2FsZXIpOworICAgIFdSSVRFX1ZSRUcoQVZTUF9JUV9XUV9QQVJBTV8wMSwgaHctPmF2c3BfaXFfd3FfcGFyYW1fMDEpOworICAgIFdSSVRFX1ZSRUcoQVZTUF9JUV9XUV9QQVJBTV8yMywgaHctPmF2c3BfaXFfd3FfcGFyYW1fMjMpOworICAgIFdSSVRFX1ZSRUcoQVZTUF9JUV9XUV9QQVJBTV80NSwgaHctPmF2c3BfaXFfd3FfcGFyYW1fNDUpOworICAgIFdSSVRFX1ZSRUcoQVZTX0NPX01CX1JEX0FERFIsIGh3LT5hdnNfY29fbWJfcmRfYWRkcik7CisgICAgV1JJVEVfVlJFRyhEQkxLX01CX1dJRF9IRUlHSFQsIGh3LT5kYmxrX21iX3dpZF9oZWlnaHQpOworICAgIFdSSVRFX1ZSRUcoTUNfUElDX1dfSCwgaHctPm1jX3BpY193X2gpOworICAgIFdSSVRFX1ZSRUcoQVZTX0NPX01CX1JXX0NUTCwgaHctPmF2c19jb19tYl9yd19jdGwpOworCisgICAgV1JJVEVfVlJFRyhWTERfREVDT0RFX0NPTlRST0wsIGh3LT52bGRfZGVjb2RlX2NvbnRyb2wpOworCit9CisKK3N0YXRpYyBpbnQgdmF2c19wcm90X2luaXQoc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3KQoreworCWludCByID0gMDsKKyNpZiBERUJVR19NVUxUSV9GTEFHID4gMAorCWlmIChody0+ZGVjb2RlX3BpY19jb3VudCA9PSAwKSB7CisjZW5kaWYKKyNpZiAxIC8qIE1FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09ONiAqLworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgKDEgPDwgNykgfCAoMSA8PCA2KSB8ICgxIDw8IDQpKTsKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsIDApOworCisJUkVBRF9WUkVHKERPU19TV19SRVNFVDApOworCisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAoMSA8PCA3KSB8ICgxIDw8IDYpIHwgKDEgPDwgNCkpOworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgMCk7CisKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsICgxIDw8IDkpIHwgKDEgPDwgOCkpOworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgMCk7CisKKyNlbHNlCisJV1JJVEVfUkVTRVRfUkVHKFJFU0VUMF9SRUdJU1RFUiwKKwkJCQkgICBSRVNFVF9JUUlEQ1QgfCBSRVNFVF9NQyB8IFJFU0VUX1ZMRF9QQVJUKTsKKwlSRUFEX1JFU0VUX1JFRyhSRVNFVDBfUkVHSVNURVIpOworCVdSSVRFX1JFU0VUX1JFRyhSRVNFVDBfUkVHSVNURVIsCisJCQkJICAgUkVTRVRfSVFJRENUIHwgUkVTRVRfTUMgfCBSRVNFVF9WTERfUEFSVCk7CisKKwlXUklURV9SRVNFVF9SRUcoUkVTRVQyX1JFR0lTVEVSLCBSRVNFVF9QSUNfREMgfCBSRVNFVF9EQkxLKTsKKyNlbmRpZgorI2lmIERFQlVHX01VTFRJX0ZMQUcgPiAwCisJfQorI2VuZGlmCisJLyoqKioqKioqKioqKioqKioqIHJlc2V0IHZsZCAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJV1JJVEVfVlJFRyhQT1dFUl9DVExfVkxELCAweDEwKTsKKwlXUklURV9WUkVHX0JJVFMoVkxEX01FTV9WSUZJRk9fQ09OVFJPTCwgMiwgTUVNX0ZJRk9fQ05UX0JJVCwgMik7CisJV1JJVEVfVlJFR19CSVRTKFZMRF9NRU1fVklGSUZPX0NPTlRST0wsCTgsIE1FTV9MRVZFTF9DTlRfQklULCA2KTsKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlpZiAoaHctPm1faW5zX2ZsYWcpIHsKKwkJaW50IGk7CisJCWlmIChody0+ZGVjb2RlX3BpY19jb3VudCA9PSAwKSB7CisJCQlyID0gdmF2c19jYW52YXNfaW5pdChodyk7CisjaWZuZGVmIFVTRV9EWU5BTUlDX0JVRl9OVU0KKwkJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfMCArIGksCisJCQkJCWh3LT5jYW52YXNfc3BlY1tpXQorCQkJCSk7CisJCQl9CisjZWxzZQorCQkJZm9yIChpID0gMDsgaSA8IGh3LT52Zl9idWZfbnVtX3VzZWQ7IGkrKykKKwkJCQlXUklURV9WUkVHKGJ1Zl9zcGVjX3JlZ1tpXSwgMCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgaHctPnZmX2J1Zl9udW1fdXNlZDsgaSArPSAyKSB7CisJCQkJV1JJVEVfVlJFRyhidWZfc3BlY19yZWdbaSA+PiAxXSwKKwkJCQkJKGh3LT5jYW52YXNfc3BlY1tpXSAmIDB4ZmZmZikgfAorCQkJCQkoKGh3LT5jYW52YXNfc3BlY1tpICsgMV0gJiAweGZmZmYpCisJCQkJCQk8PCAxNikKKwkJCQkpOworCQkJCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX0RFQ09ESU5HLAorCQkJCQkiJXMgV1JJVEVfVlJFRygweCV4LCAweCV4KVxuIiwKKwkJCQkJX19mdW5jX18sIGJ1Zl9zcGVjX3JlZ1tpID4+IDFdLCBSRUFEX1ZSRUcoYnVmX3NwZWNfcmVnW2kgPj4gMV0pKTsKKwkJCX0KKyNlbmRpZgorCQl9IGVsc2UKKwkJCXZhdnNfcmVzdG9yZV9yZWdzKGh3KTsKKworCQlmb3IgKGkgPSAwOyBpIDwgaHctPnZmX2J1Zl9udW1fdXNlZDsgaSsrKSB7CisJCQljb25maWdfY2F2X2x1dF9leChjYW52YXNfeShody0+Y2FudmFzX3NwZWNbaV0pLAorCQkJCWh3LT5jYW52YXNfY29uZmlnW2ldWzBdLnBoeV9hZGRyLAorCQkJCWh3LT5jYW52YXNfY29uZmlnW2ldWzBdLndpZHRoLAorCQkJCWh3LT5jYW52YXNfY29uZmlnW2ldWzBdLmhlaWdodCwKKwkJCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCQkJaHctPmNhbnZhc19jb25maWdbaV1bMF0uYmxvY2tfbW9kZSwKKwkJCQkwLCBWREVDXzEpOworCisJCQljb25maWdfY2F2X2x1dF9leChjYW52YXNfdShody0+Y2FudmFzX3NwZWNbaV0pLAorCQkJCWh3LT5jYW52YXNfY29uZmlnW2ldWzFdLnBoeV9hZGRyLAorCQkJCWh3LT5jYW52YXNfY29uZmlnW2ldWzFdLndpZHRoLAorCQkJCWh3LT5jYW52YXNfY29uZmlnW2ldWzFdLmhlaWdodCwKKwkJCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCQkJaHctPmNhbnZhc19jb25maWdbaV1bMV0uYmxvY2tfbW9kZSwKKwkJCQkwLCBWREVDXzEpOworCQl9CisJfSBlbHNlIHsKKwkJciA9IHZhdnNfY2FudmFzX2luaXQoaHcpOworI2lmZGVmIE5WMjEKKwkJaWYgKGZpcm13YXJlX3NlbCA9PSAwKSB7CisJCQkvKiBmaXhlZCBjYW52YXMgaW5kZXggKi8KKwkJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8wLCBjYW52YXNfYmFzZSk7CisJCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfMSwgaHctPnZmX2J1Zl9udW1fdXNlZCk7CisJCX0gZWxzZSB7CisJCQlpbnQgaWk7CisjaWZuZGVmIFVTRV9EWU5BTUlDX0JVRl9OVU0KKwkJCWZvciAoaWkgPSAwOyBpaSA8IDQ7IGlpKyspIHsKKwkJCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfMCArIGlpLAorCQkJCQkoY2FudmFzX2Jhc2UgKyBjYW52YXNfbnVtICogaWkpIHwKKwkJCQkJKChjYW52YXNfYmFzZSArIGNhbnZhc19udW0gKiBpaSArIDEpCisJCQkJCQk8PCA4KSB8CisJCQkJCSgoY2FudmFzX2Jhc2UgKyBjYW52YXNfbnVtICogaWkgKyAxKQorCQkJCQkJPDwgMTYpCisJCQkJKTsKKwkJCX0KKyNlbHNlCisJCWZvciAoaWkgPSAwOyBpaSA8IGh3LT52Zl9idWZfbnVtX3VzZWQ7IGlpICs9IDIpIHsKKwkJCVdSSVRFX1ZSRUcoYnVmX3NwZWNfcmVnW2lpID4+IDFdLAorCQkJCShjYW52YXNfYmFzZSArIGNhbnZhc19udW0gKiBpaSkgfAorCQkJCSgoY2FudmFzX2Jhc2UgKyBjYW52YXNfbnVtICogaWkgKyAxKQorCQkJCQk8PCA4KSB8CisJCQkJKChjYW52YXNfYmFzZSArIGNhbnZhc19udW0gKiBpaSArIDIpCisJCQkJCTw8IDE2KSB8CisJCQkJKChjYW52YXNfYmFzZSArIGNhbnZhc19udW0gKiBpaSArIDMpCisJCQkJCTw8IDI0KQorCQkJKTsKKwkJfQorI2VuZGlmCisJCQkvKgorCQkJICpXUklURV9WUkVHKEFWX1NDUkFUQ0hfMCwgMHgwMTAxMDApOworCQkJICpXUklURV9WUkVHKEFWX1NDUkFUQ0hfMSwgMHgwNDA0MDMpOworCQkJICpXUklURV9WUkVHKEFWX1NDUkFUQ0hfMiwgMHgwNzA3MDYpOworCQkJICpXUklURV9WUkVHKEFWX1NDUkFUQ0hfMywgMHgwYTBhMDkpOworCQkJICovCisJCX0KKyNlbHNlCisJCS8qIGluZGV4IHYgPDwgMTYgfCB1IDw8IDggfCB5ICovCisJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8wLCAweDAyMDEwMCk7CisJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8xLCAweDA1MDQwMyk7CisJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8yLCAweDA4MDcwNik7CisJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8zLCAweDBiMGEwOSk7CisjZW5kaWYKKwl9CisJLyogbm90aWZ5IHVjb2RlIHRoZSBidWZmZXIgb2Zmc2V0ICovCisJaWYgKGh3LT5kZWNvZGVfcGljX2NvdW50ID09IDApCisJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9GLCBody0+YnVmX29mZnNldCk7CisKKwkvKiBkaXNhYmxlIFBTQ0FMRSBmb3IgaGFyZHdhcmUgc2hhcmluZyAqLworCVdSSVRFX1ZSRUcoUFNDQUxFX0NUUkwsIDApOworCisJaWYgKGh3LT5kZWNvZGVfcGljX2NvdW50ID09IDApIHsKKyNpZm5kZWYgVVNFX0RZTkFNSUNfQlVGX05VTQorCQlXUklURV9WUkVHKEFWU19TT1NfQ09VTlQsIDApOworI2VuZGlmCisJCVdSSVRFX1ZSRUcoQVZTX0JVRkZFUklOLCAwKTsKKwkJV1JJVEVfVlJFRyhBVlNfQlVGRkVST1VULCAwKTsKKwl9CisJaWYgKGVycm9yX3JlY292ZXJ5X21vZGUpCisJCVdSSVRFX1ZSRUcoQVZTX0VSUk9SX1JFQ09WRVJZX01PREUsIDApOworCWVsc2UKKwkJV1JJVEVfVlJFRyhBVlNfRVJST1JfUkVDT1ZFUllfTU9ERSwgMSk7CisJLyogY2xlYXIgbWFpbGJveCBpbnRlcnJ1cHQgKi8KKwlXUklURV9WUkVHKEFTU0lTVF9NQk9YMV9DTFJfUkVHLCAxKTsKKworCS8qIGVuYWJsZSBtYWlsYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoQVNTSVNUX01CT1gxX01BU0ssIDEpOworI2lmbmRlZiBVU0VfRFlOQU1JQ19CVUZfTlVNCQkJCS8qIGRlZiBERUJVR19VQ09ERSAqLworCWlmIChody0+ZGVjb2RlX3BpY19jb3VudCA9PSAwKQorCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfRCwgMCk7CisjZW5kaWYKKworI2lmZGVmIE5WMjEKKwlTRVRfVlJFR19NQVNLKE1ERUNfUElDX0RDX0NUUkwsIDEgPDwgMTcpOworI2VuZGlmCisJQ0xFQVJfVlJFR19NQVNLKE1ERUNfUElDX0RDX0NUUkwsIDEgPDwgMTYpOworCisjaWZkZWYgUElDX0RDX05FRURfQ0xFQVIKKwlDTEVBUl9WUkVHX01BU0soTURFQ19QSUNfRENfQ1RSTCwgMSA8PCAzMSk7CisjZW5kaWYKKwlpZiAoaHctPm1faW5zX2ZsYWcgJiYgc3RhcnRfZGVjb2RpbmdfZGVsYXkgPiAwKQorCQltc2xlZXAoc3RhcnRfZGVjb2RpbmdfZGVsYXkpOworCisJLy9wcl9pbmZvKCIrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrXG4iKTsKKwkvL3ByX2luZm8oIisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKytcbiIpOworCS8vcHJfaW5mbygiKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrK1xuIik7CisjaWZkZWYgQVZTUF9MT05HX0NBQkFDCisJaWYgKGZpcm13YXJlX3NlbCA9PSAwKSB7CisJCVdSSVRFX1ZSRUcoTE9OR19DQUJBQ19ERVNfQUREUiwgZXNfd3JpdGVfYWRkcl9waHkpOworCQlXUklURV9WUkVHKExPTkdfQ0FCQUNfUkVRLCAwKTsKKwkJV1JJVEVfVlJFRyhMT05HX0NBQkFDX1BJQ19TSVpFLCAwKTsKKwkJV1JJVEVfVlJFRyhMT05HX0NBQkFDX1NSQ19BRERSLCAwKTsKKwl9CisjZW5kaWYKKworI2lmZGVmIEVOQUJMRV9VU0VSX0RBVEEKKwlpZiAoaHctPmRlY29kZV9waWNfY291bnQgPT0gMCkgeworCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfTiwgKHUzMikoaHctPnVzZXJfZGF0YV9idWZmZXJfcGh5cyAtIGh3LT5idWZfb2Zmc2V0KSk7CisJCXByX2RlYnVnKCJBVl9TQ1JBVENIX04gPSAweCV4XG4iLCBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9OKSk7CisJfSBlbHNlCisJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9OLCAwKTsKKyNlbmRpZgorCWlmIChody0+bV9pbnNfZmxhZykgeworCQlpZiAodmRlY19mcmFtZV9iYXNlZChod190b192ZGVjKGh3KSkpCisJCQlXUklURV9WUkVHKERFQ09ERV9NT0RFLCBERUNPREVfTU9ERV9NVUxUSV9GUkFNRUJBU0UpOworCQllbHNlIHsKKwkJCWlmIChody0+ZGVjb2RlX3N0YXR1c19za2lwX3BpY19kb25lX2ZsYWcpIHsKKwkJCQlXUklURV9WUkVHKERFQ09ERV9DRkcsIGh3LT5kZWNvZGVfZGVjb2RlX2NvbnRfc3RhcnRfY29kZSk7CisJCQkJV1JJVEVfVlJFRyhERUNPREVfTU9ERSwgREVDT0RFX01PREVfTVVMVElfU1RSRUFNQkFTRV9DT05UKTsKKwkJCX0gZWxzZQorCQkJCVdSSVRFX1ZSRUcoREVDT0RFX01PREUsIERFQ09ERV9NT0RFX01VTFRJX1NUUkVBTUJBU0UpOworCQl9CisJCVdSSVRFX1ZSRUcoREVDT0RFX0xNRU1fQlVGX0FEUiwgKHUzMilody0+bG1lbV9waHlfYWRkcik7CisJfSBlbHNlCisJCVdSSVRFX1ZSRUcoREVDT0RFX01PREUsIERFQ09ERV9NT0RFX1NJTkdMRSk7CisKKwlpZiAoaW5zX3VkZWJ1Z19mbGFnW0RFQ09ERV9JRChodyldICYmCisJCShpbnNfdWRlYnVnX2ZsYWdbREVDT0RFX0lEKGh3KV0gPj4gMTYpID09IGh3LT5kZWNvZGVfcGljX2NvdW50KSB7CisJCVdSSVRFX1ZSRUcoREVDT0RFX1NUT1BfUE9TLAorCQkJaW5zX3VkZWJ1Z19mbGFnW0RFQ09ERV9JRChodyldICYgMHhmZmZmKTsKKwl9CisJZWxzZQorCQlXUklURV9WUkVHKERFQ09ERV9TVE9QX1BPUywgdWRlYnVnX2ZsYWcpOworCWh3LT5vbGRfdWRlYnVnX2ZsYWcgPSB1ZGVidWdfZmxhZzsKKworCXJldHVybiByOworfQorCisKKyNpZmRlZiBBVlNQX0xPTkdfQ0FCQUMKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGVzX3dyaXRlX2FkZHJbTUFYX0NPREVEX0ZSQU1FX1NJWkVdICBfX2FsaWduZWQoNjQpOworI2VuZGlmCitzdGF0aWMgdm9pZCB2YXZzX2xvY2FsX2luaXQoc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3KQoreworCWludCBpOworCisJaHctPnZmX2J1Zl9udW1fdXNlZCA9IHZmX2J1Zl9udW07CisKKwlody0+dmF2c19yYXRpbyA9IGh3LT52YXZzX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGlvOworCisJaHctPmF2aV9mbGFnID0gKHVuc2lnbmVkIGxvbmcpIGh3LT52YXZzX2Ftc3RyZWFtX2RlY19pbmZvLnBhcmFtOworCisJaHctPmZyYW1lX3dpZHRoID0gaHctPmZyYW1lX2hlaWdodCA9IGh3LT5mcmFtZV9kdXIgPSBody0+ZnJhbWVfcHJvZyA9IDA7CisKKwlody0+dGhyb3dfcGJfZmxhZyA9IDE7CisKKwlody0+dG90YWxfZnJhbWUgPSAwOworCWh3LT5zYXZlZF9yZXNvbHV0aW9uID0gMDsKKwlody0+bmV4dF9wdHMgPSAwOworCisjaWZkZWYgREVCVUdfUFRTCisJaHctPnB0c19oaXQgPSBody0+cHRzX21pc3NlZCA9IGh3LT5wdHNfaV9oaXQgPSBody0+cHRzX2lfbWlzc2VkID0gMDsKKyNlbmRpZgorCUlOSVRfS0ZJRk8oaHctPmRpc3BsYXlfcSk7CisJSU5JVF9LRklGTyhody0+cmVjeWNsZV9xKTsKKwlJTklUX0tGSUZPKGh3LT5uZXdmcmFtZV9xKTsKKworCWZvciAoaSA9IDA7IGkgPCBWRl9QT09MX1NJWkU7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKnZmID0gJmh3LT52ZnBvb2xbaV0udmY7CisKKwkJaHctPnZmcG9vbFtpXS52Zi5pbmRleCA9IGh3LT52Zl9idWZfbnVtX3VzZWQ7CisJCWh3LT52ZnBvb2xbaV0udmYuYnVmV2lkdGggPSAxOTIwOworCQlody0+dmZwb29sW2ldLmRldGFjaGVkID0gMDsKKwkJa2ZpZm9fcHV0KCZody0+bmV3ZnJhbWVfcSwgdmYpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgaHctPnZmX2J1Zl9udW1fdXNlZDsgaSsrKQorCQlody0+dmZidWZfdXNlW2ldID0gMDsKKworCS8qY3VyX3ZmcG9vbCA9IHZmcG9vbDsqLworCisJaWYgKGh3LT5yZWNvdmVyX2ZsYWcgPT0gMSkKKwkJcmV0dXJuOworCisJaWYgKGh3LT5tbV9ibGtfaGFuZGxlKSB7CisJCXByX2luZm8oImRlY29kZXJfYm1tdV9ib3hfZnJlZVxuIik7CisJCWRlY29kZXJfYm1tdV9ib3hfZnJlZShody0+bW1fYmxrX2hhbmRsZSk7CisJCWh3LT5tbV9ibGtfaGFuZGxlID0gTlVMTDsKKwl9CisKKwlody0+bW1fYmxrX2hhbmRsZSA9IGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYm94KAorCQlEUklWRVJfTkFNRSwKKwkJMCwKKwkJTUFYX0JNTVVfQlVGRkVSX05VTSwKKwkJNCArIFBBR0VfU0hJRlQsCisJCUNPREVDX01NX0ZMQUdTX0NNQV9DTEVBUiB8CisJCUNPREVDX01NX0ZMQUdTX0ZPUl9WREVDT0RFUik7CisJaWYgKGh3LT5tbV9ibGtfaGFuZGxlID09IE5VTEwpCisJCXByX2luZm8oIkVycm9yLCBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2JveCBmYWlsXG4iKTsKKworfQorCitzdGF0aWMgaW50IHZhdnNfdmZfc3RhdGVzKHN0cnVjdCB2ZnJhbWVfc3RhdGVzICpzdGF0ZXMsIHZvaWQgKm9wX2FyZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB2ZGVjX2F2c19od19zICpodyA9CisJKHN0cnVjdCB2ZGVjX2F2c19od19zICopb3BfYXJnOworCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCXN0YXRlcy0+dmZfcG9vbF9zaXplID0gVkZfUE9PTF9TSVpFOworCXN0YXRlcy0+YnVmX2ZyZWVfbnVtID0ga2ZpZm9fbGVuKCZody0+bmV3ZnJhbWVfcSk7CisJc3RhdGVzLT5idWZfYXZhaWxfbnVtID0ga2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKTsKKwlzdGF0ZXMtPmJ1Zl9yZWN5Y2xlX251bSA9IGtmaWZvX2xlbigmaHctPnJlY3ljbGVfcSk7CisJaWYgKHN0ZXAgPT0gMikKKwkJc3RhdGVzLT5idWZfYXZhaWxfbnVtID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19QT1NUX1BST0NFU1NfTUFOQUdFUgorc3RhdGljIHZvaWQgdmF2c19wcG1ncl9yZXNldCh2b2lkKQoreworCXZmX25vdGlmeV9yZWNlaXZlcihQUk9WSURFUl9OQU1FLCBWRlJBTUVfRVZFTlRfUFJPVklERVJfUkVTRVQsIE5VTEwpOworCisJdmF2c19sb2NhbF9pbml0KGdodyk7CisKKwlwcl9pbmZvKCJ2YXZzOiB2Zl9wcG1ncl9yZXNldFxuIik7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgdmF2c19sb2NhbF9yZXNldChzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcpCit7CisJbXV0ZXhfbG9jaygmdmF2c19tdXRleCk7CisJaHctPnJlY292ZXJfZmxhZyA9IDE7CisJcHJfaW5mbygiZXJyb3IsIGxvY2FsIHJlc2V0XG4iKTsKKwlhbXZkZWNfc3RvcCgpOworCW1zbGVlcCgxMDApOworCWF2c192Zl9ub3RpZnlfcmVjZWl2ZXIoaHcsIFBST1ZJREVSX05BTUUsIFZGUkFNRV9FVkVOVF9QUk9WSURFUl9SRVNFVCwgTlVMTCk7CisJdmF2c19sb2NhbF9pbml0KGh3KTsKKwl2YXZzX3JlY292ZXIoaHcpOworCisjaWZkZWYgRU5BQkxFX1VTRVJfREFUQQorCXJlc2V0X3VzZXJkYXRhX2ZpZm8oMSk7CisjZW5kaWYKKworCWFtdmRlY19zdGFydCgpOworCWh3LT5yZWNvdmVyX2ZsYWcgPSAwOworI2lmIDAKKwllcnJvcl93YXRjaGRvZ19jb3VudCA9IDA7CisKKwlwcl9pbmZvKCJwYyAleCBzdHJlYW0gYnVmIHdwICV4IHJwICV4IGxldmVsICV4XG4iLAorCQlSRUFEX1ZSRUcoTVBDX0UpLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpKTsKKyNlbmRpZgorCisKKworCW11dGV4X3VubG9jaygmdmF2c19tdXRleCk7Cit9CisKKyNpZiAwCitzdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IGZhdGFsX2Vycm9yX3dkX3dvcms7CitzdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IG5vdGlmeV93b3JrOworc3RhdGljIGF0b21pY190IGVycm9yX2hhbmRsZXJfcnVuID0gQVRPTUlDX0lOSVQoMCk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIHZhdnNfZmF0YWxfZXJyb3JfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3ID0KKwljb250YWluZXJfb2Yod29yaywgc3RydWN0IHZkZWNfYXZzX2h3X3MsIGZhdGFsX2Vycm9yX3dkX3dvcmspOworCWlmIChkZWJ1ZyAmIEFWU19ERUJVR19PTERfRVJST1JfSEFORExFKSB7CisJCW11dGV4X2xvY2soJnZhdnNfbXV0ZXgpOworCQlwcl9pbmZvKCJ2YXZzIGZhdGFsIGVycm9yIHJlc2V0ICFcbiIpOworCQlhbXZkZWNfc3RvcCgpOworI2lmZGVmIENPTkZJR19BTUxPR0lDX1BPU1RfUFJPQ0VTU19NQU5BR0VSCisJCXZhdnNfcHBtZ3JfcmVzZXQoKTsKKyNlbHNlCisJCXZmX2xpZ2h0X3VucmVnX3Byb3ZpZGVyKCZ2YXZzX3ZmX3Byb3YpOworCQl2YXZzX2xvY2FsX2luaXQoaHcpOworCQl2Zl9yZWdfcHJvdmlkZXIoJnZhdnNfdmZfcHJvdik7CisjZW5kaWYKKwkJdmF2c19yZWNvdmVyKGh3KTsKKwkJYW12ZGVjX3N0YXJ0KCk7CisJCW11dGV4X3VubG9jaygmdmF2c19tdXRleCk7CisJfSBlbHNlIHsKKwkJcHJfaW5mbygiYXZzIGZhdGFsX2Vycm9yX2hhbmRsZXJcbiIpOworCQl2YXZzX2xvY2FsX3Jlc2V0KGh3KTsKKwl9CisJYXRvbWljX3NldCgmaHctPmVycm9yX2hhbmRsZXJfcnVuLCAwKTsKK30KKworc3RhdGljIHZvaWQgdmF2c19ub3RpZnlfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3ID0KKwljb250YWluZXJfb2Yod29yaywgc3RydWN0IHZkZWNfYXZzX2h3X3MsIG5vdGlmeV93b3JrKTsKKwlpZiAoaHctPmZyX2hpbnRfc3RhdHVzID09IFZERUNfTkVFRF9ISU5UKSB7CisJCWF2c192Zl9ub3RpZnlfcmVjZWl2ZXIoaHcsIFBST1ZJREVSX05BTUUgLAorCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX0ZSX0hJTlQgLAorCQkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpaHctPmZyYW1lX2R1cikpOworCQlody0+ZnJfaGludF9zdGF0dXMgPSBWREVDX0hJTlRFRDsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBhdnNfc2V0X2NsayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3ID0KKwljb250YWluZXJfb2Yod29yaywgc3RydWN0IHZkZWNfYXZzX2h3X3MsIHNldF9jbGtfd29yayk7CisJaWYgKGh3LT5mcmFtZV9kdXIgPiAwICYmIGh3LT5zYXZlZF9yZXNvbHV0aW9uICE9CisJCWh3LT5mcmFtZV93aWR0aCAqIGh3LT5mcmFtZV9oZWlnaHQgKiAoOTYwMDAgLyBody0+ZnJhbWVfZHVyKSkgeworCQlpbnQgZnBzID0gOTYwMDAgLyBody0+ZnJhbWVfZHVyOworCisJCWh3LT5zYXZlZF9yZXNvbHV0aW9uID0gaHctPmZyYW1lX3dpZHRoICogaHctPmZyYW1lX2hlaWdodCAqIGZwczsKKwkJaWYgKGZpcm13YXJlX3NlbCA9PSAwICYmCisJCQkoZGVidWcgJiBBVlNfREVCVUdfVVNFX0ZVTExfU1BFRUQpKSB7CisJCQl2ZGVjX3NvdXJjZV9jaGFuZ2VkKFZGT1JNQVRfQVZTLAorCQkJCTQwOTYsIDIwNDgsIDYwKTsKKwkJfSBlbHNlIHsKKwkJCXZkZWNfc291cmNlX2NoYW5nZWQoVkZPUk1BVF9BVlMsCisJCQlody0+ZnJhbWVfd2lkdGgsIGh3LT5mcmFtZV9oZWlnaHQsIGZwcyk7CisJCX0KKworCX0KK30KKworI2lmZGVmIERFQlVHX01VTFRJX1dJVEhfQVVUT01PREUKK2ludCBkZWxheV9jb3VudCA9IDA7CisjZW5kaWYKK3N0YXRpYyB2b2lkIHZhdnNfcHV0X3RpbWVyX2Z1bmMoc3RydWN0IHRpbWVyX2xpc3QgKmFyZykKK3sKKwlzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcgPSBjb250YWluZXJfb2YoYXJnLAorCQlzdHJ1Y3QgdmRlY19hdnNfaHdfcywgcmVjeWNsZV90aW1lcik7CisJc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyID0gJmh3LT5yZWN5Y2xlX3RpbWVyOworCisjaWZuZGVmIEhBTkRMRV9BVlNfSVJRCisJdmF2c19pc3IoKTsKKyNlbmRpZgorI2lmZGVmIERFQlVHX01VTFRJX1dJVEhfQVVUT01PREUKKwlpZiAoZGVsYXlfY291bnQgPiAwKSB7CisJCWlmIChkZWxheV9jb3VudCA9PSAxKQorCQkJYW12ZGVjX3N0YXJ0KCk7CisJCWRlbGF5X2NvdW50LS07CisJfQorI2VuZGlmCisJaWYgKFJFQURfVlJFRyhBVlNfU09TX0NPVU5UKSkgeworCQlpZiAoIWVycm9yX3JlY292ZXJ5X21vZGUpIHsKKyNpZiAwCisJCQlpZiAoZGVidWcgJiBBVlNfREVCVUdfT0xEX0VSUk9SX0hBTkRMRSkgeworCQkJCW11dGV4X2xvY2soJnZhdnNfbXV0ZXgpOworCQkJCXByX2luZm8oInZhdnMgZmF0YWwgZXJyb3IgcmVzZXQgIVxuIik7CisJCQkJYW12ZGVjX3N0b3AoKTsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19QT1NUX1BST0NFU1NfTUFOQUdFUgorCQkJCXZhdnNfcHBtZ3JfcmVzZXQoKTsKKyNlbHNlCisJCQkJdmZfbGlnaHRfdW5yZWdfcHJvdmlkZXIoJnZhdnNfdmZfcHJvdik7CisJCQkJdmF2c19sb2NhbF9pbml0KCk7CisJCQkJdmZfcmVnX3Byb3ZpZGVyKCZ2YXZzX3ZmX3Byb3YpOworI2VuZGlmCisJCQkJdmF2c19yZWNvdmVyKCk7CisJCQkJYW12ZGVjX3N0YXJ0KCk7CisJCQkJbXV0ZXhfdW5sb2NrKCZ2YXZzX211dGV4KTsKKwkJCX0gZWxzZSB7CisJCQkJdmF2c19sb2NhbF9yZXNldCgpOworCQkJfQorI2Vsc2UKKwkJCWlmICghYXRvbWljX3JlYWQoJmh3LT5lcnJvcl9oYW5kbGVyX3J1bikpIHsKKwkJCQlhdG9taWNfc2V0KCZody0+ZXJyb3JfaGFuZGxlcl9ydW4sIDEpOworCQkJCXByX2luZm8oIkFWU19TT1NfQ09VTlQgPSAlZFxuIiwKKwkJCQkJUkVBRF9WUkVHKEFWU19TT1NfQ09VTlQpKTsKKwkJCQlwcl9pbmZvKCJXUCA9IDB4JXgsIFJQID0gMHgleCwgTEVWRUwgPSAweCV4LCBBVkFJTCA9IDB4JXgsIENVUl9QVFIgPSAweCV4XG4iLAorCQkJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApLAorCQkJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApLAorCQkJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpLAorCQkJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fQllURVNfQVZBSUwpLAorCQkJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fQ1VSUl9QVFIpKTsKKwkJCQlzY2hlZHVsZV93b3JrKCZody0+ZmF0YWxfZXJyb3Jfd2Rfd29yayk7CisJCQl9CisjZW5kaWYKKwkJfQorCX0KKyNpZiAwCisJaWYgKGxvbmdfY2FiYWNfYnVzeSA9PSAwICYmCisJCWVycm9yX3dhdGNoZG9nX3RocmVzaG9sZCA+IDAgJiYKKwkJa2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKSA9PSAwICYmCisJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCkgPgorCQllcnJvcl93YXRjaGRvZ19idWZfdGhyZXNob2xkKSB7CisJCXByX2luZm8oIm5ld3EgJWQgZGlzcHEgJWQgcmVjeXEgJWRcclxuIiwKKwkJCWtmaWZvX2xlbigmaHctPm5ld2ZyYW1lX3EpLAorCQkJa2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKSwKKwkJCWtmaWZvX2xlbigmaHctPnJlY3ljbGVfcSkpOworCQlwcl9pbmZvKCJwYyAleCBzdHJlYW0gYnVmIHdwICV4IHJwICV4IGxldmVsICV4XG4iLAorCQkJUkVBRF9WUkVHKE1QQ19FKSwKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19XUCksCisJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKSk7CisJCWVycm9yX3dhdGNoZG9nX2NvdW50Kys7CisJCWlmIChlcnJvcl93YXRjaGRvZ19jb3VudCA+PSBlcnJvcl93YXRjaGRvZ190aHJlc2hvbGQpCisJCQl2YXZzX2xvY2FsX3Jlc2V0KCk7CisJfSBlbHNlCisJCWVycm9yX3dhdGNoZG9nX2NvdW50ID0gMDsKKyNlbmRpZgorCWlmIChyYWRyICE9IDApIHsKKwkJaWYgKHJ2YWwgIT0gMCkgeworCQkJV1JJVEVfVlJFRyhyYWRyLCBydmFsKTsKKwkJCXByX2luZm8oIldSSVRFX1ZSRUcoJXgsJXgpXG4iLCByYWRyLCBydmFsKTsKKwkJfSBlbHNlCisJCQlwcl9pbmZvKCJSRUFEX1ZSRUcoJXgpPSV4XG4iLCByYWRyLCBSRUFEX1ZSRUcocmFkcikpOworCQlydmFsID0gMDsKKwkJcmFkciA9IDA7CisJfQorCWlmICgoaHctPnVjb2RlX3BhdXNlX3BvcyAhPSAwKSAmJgorCQkoaHctPnVjb2RlX3BhdXNlX3BvcyAhPSAweGZmZmZmZmZmKSAmJgorCQl1ZGVidWdfcGF1c2VfcG9zICE9IGh3LT51Y29kZV9wYXVzZV9wb3MpIHsKKwkJaHctPnVjb2RlX3BhdXNlX3BvcyA9IDA7CisJCVdSSVRFX1ZSRUcoREVCVUdfUkVHMSwgMCk7CisJfQorCisJaWYgKCFrZmlmb19pc19lbXB0eSgmaHctPnJlY3ljbGVfcSkgJiYgKFJFQURfVlJFRyhBVlNfQlVGRkVSSU4pID09IDApKSB7CisJCXN0cnVjdCB2ZnJhbWVfcyAqdmY7CisKKwkJaWYgKGtmaWZvX2dldCgmaHctPnJlY3ljbGVfcSwgJnZmKSkgeworCQkJaWYgKCh2Zi0+aW5kZXggPCBody0+dmZfYnVmX251bV91c2VkKSAmJgorCQkJICgtLWh3LT52ZmJ1Zl91c2VbdmYtPmluZGV4XSA9PSAwKSkgeworCQkJCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX0RFQ09ESU5HLAorCQkJCQkiJXMgV1JJVEVfVlJFRyhBVlNfQlVGRkVSSU4sIDB4JXgpIGZvciB2ZiBpbmRleCBvZiAlZFxuIiwKKwkJCQkJX19mdW5jX18sCisJCQkJCX4oMSA8PCB2Zi0+aW5kZXgpLCB2Zi0+aW5kZXgpOworCQkJCVdSSVRFX1ZSRUcoQVZTX0JVRkZFUklOLCB+KDEgPDwgdmYtPmluZGV4KSk7CisJCQkJdmYtPmluZGV4ID0gaHctPnZmX2J1Zl9udW1fdXNlZDsKKwkJCX0KKwkJCQlrZmlmb19wdXQoJmh3LT5uZXdmcmFtZV9xLAorCQkJCQkJICAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQl9CisKKwl9CisKKwlzY2hlZHVsZV93b3JrKCZody0+c2V0X2Nsa193b3JrKTsKKworCXRpbWVyLT5leHBpcmVzID0gamlmZmllcyArIFBVVF9JTlRFUlZBTDsKKworCWFkZF90aW1lcih0aW1lcik7Cit9CisKKyNpZmRlZiBBVlNQX0xPTkdfQ0FCQUMKKworc3RhdGljIHZvaWQgbG9uZ19jYWJhY19kb193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcgPSBndzsKKyNpZmRlZiBQRVJGT1JNQU5DRV9ERUJVRworCXByX2luZm8oImVudGVyICVzIGJ1ZiBsZXZlbCAobmV3ICVkLCBkaXNwbGF5ICVkLCByZWN5Y2xlICVkKVxyXG4iLAorCQlfX2Z1bmNfXywKKwkJa2ZpZm9fbGVuKCZody0+bmV3ZnJhbWVfcSksCisJCWtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSksCisJCWtmaWZvX2xlbigmaHctPnJlY3ljbGVfcSkKKwkJKTsKKyNlbmRpZgorCW11dGV4X2xvY2soJnZhdnNfbXV0ZXgpOworCWxvbmdfY2FiYWNfYnVzeSA9IDE7CisJd2hpbGUgKFJFQURfVlJFRyhMT05HX0NBQkFDX1JFUSkpIHsKKwkJaWYgKHByb2Nlc3NfbG9uZ19jYWJhYygpIDwgMCkgeworCQkJc3RhdHVzID0gLTE7CisJCQlicmVhazsKKwkJfQorCX0KKwlsb25nX2NhYmFjX2J1c3kgPSAwOworCW11dGV4X3VubG9jaygmdmF2c19tdXRleCk7CisjaWZkZWYgUEVSRk9STUFOQ0VfREVCVUcKKwlwcl9pbmZvKCJleGl0ICVzIGJ1ZiBsZXZlbCAobmV3ICVkLCBkaXNwbGF5ICVkLCByZWN5Y2xlICVkKVxyXG4iLAorCQlfX2Z1bmNfXywKKwkJa2ZpZm9fbGVuKCZody0+bmV3ZnJhbWVfcSksCisJCWtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSksCisJCWtmaWZvX2xlbigmaHctPnJlY3ljbGVfcSkKKwkJKTsKKyNlbmRpZgorCWlmIChzdGF0dXMgPCAwKSB7CisJCXByX2luZm8oInRyYW5zY29kaW5nIGVycm9yLCBsb2NhbCByZXNldFxyXG4iKTsKKwkJdmF2c19sb2NhbF9yZXNldChodyk7CisJfQorCit9CisjZW5kaWYKKworI2lmZGVmIEFWU1BfTE9OR19DQUJBQworc3RhdGljIHZvaWQgaW5pdF9hdnNwX2xvbmdfY2FiYWNfYnVmKHZvaWQpCit7CisjaWYgMAorCWVzX3dyaXRlX2FkZHJfcGh5ID0gKHVuc2lnbmVkIGxvbmcpY29kZWNfbW1fYWxsb2NfZm9yX2RtYSgKKwkJInZhdnMiLAorCQlQQUdFX0FMSUdOKE1BWF9DT0RFRF9GUkFNRV9TSVpFKS9QQUdFX1NJWkUsCisJCTAsIENPREVDX01NX0ZMQUdTX0RNQV9DUFUpOworCWVzX3dyaXRlX2FkZHJfdmlydCA9IGNvZGVjX21tX3BoeXNfdG9fdmlydChlc193cml0ZV9hZGRyX3BoeSk7CisKKyNlbGlmIDAKKwllc193cml0ZV9hZGRyX3ZpcnQgPQorCQkodm9pZCAqKWRtYV9hbGxvY19jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCSBNQVhfQ09ERURfRlJBTUVfU0laRSwgJmVzX3dyaXRlX2FkZHJfcGh5LAorCQlHRlBfS0VSTkVMKTsKKyNlbHNlCisJLyplc193cml0ZV9hZGRyX3ZpcnQgPSBrbWFsbG9jKE1BWF9DT0RFRF9GUkFNRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwkgKgllc193cml0ZV9hZGRyX3ZpcnQgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwKKwkgKglnZXRfb3JkZXIoTUFYX0NPREVEX0ZSQU1FX1NJWkUpKTsKKwkgKi8KKwllc193cml0ZV9hZGRyX3ZpcnQgPSAmZXNfd3JpdGVfYWRkclswXTsKKwlpZiAoZXNfd3JpdGVfYWRkcl92aXJ0ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFsbG9jIGVzX3dyaXRlX2FkZHJfdmlydCBidWZmZXJcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwllc193cml0ZV9hZGRyX3BoeSA9IGRtYV9tYXBfc2luZ2xlKGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCWVzX3dyaXRlX2FkZHJfdmlydCwKKwkJCU1BWF9DT0RFRF9GUkFNRV9TSVpFLCBETUFfQklESVJFQ1RJT05BTCk7CisJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCWVzX3dyaXRlX2FkZHJfcGh5KSkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gbWFwIGVzX3dyaXRlX2FkZHJfdmlydCBidWZmZXJcbiIsCisJCQlfX2Z1bmNfXyk7CisJCS8qa2ZyZWUoZXNfd3JpdGVfYWRkcl92aXJ0KTsqLworCQllc193cml0ZV9hZGRyX3ZpcnQgPSBOVUxMOworCQlyZXR1cm47CisJfQorI2VuZGlmCisKKworI2lmZGVmIEJJVFNUUkVBTV9SRUFEX1RNUF9OT19DQUNIRQorCWJpdHN0cmVhbV9yZWFkX3RtcCA9CisJCSh2b2lkICopZG1hX2FsbG9jX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCVNWQV9TVFJFQU1fQlVGX1NJWkUsICZiaXRzdHJlYW1fcmVhZF90bXBfcGh5LAorCQkJIEdGUF9LRVJORUwpOworCisjZWxzZQorCisJYml0c3RyZWFtX3JlYWRfdG1wID0ga21hbGxvYyhTVkFfU1RSRUFNX0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKKwkJLypiaXRzdHJlYW1fcmVhZF90bXAgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwKKwkJICpnZXRfb3JkZXIoTUFYX0NPREVEX0ZSQU1FX1NJWkUpKTsKKwkJICovCisJaWYgKGJpdHN0cmVhbV9yZWFkX3RtcCA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvYyBiaXRzdHJlYW1fcmVhZF90bXAgYnVmZmVyXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJYml0c3RyZWFtX3JlYWRfdG1wX3BoeSA9IGRtYV9tYXBfc2luZ2xlKGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCWJpdHN0cmVhbV9yZWFkX3RtcCwKKwkJCVNWQV9TVFJFQU1fQlVGX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCWJpdHN0cmVhbV9yZWFkX3RtcF9waHkpKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBtYXAgcnBtIGJ1ZmZlclxuIiwgX19mdW5jX18pOworCQlrZnJlZShiaXRzdHJlYW1fcmVhZF90bXApOworCQliaXRzdHJlYW1fcmVhZF90bXAgPSBOVUxMOworCQlyZXR1cm47CisJfQorI2VuZGlmCit9CisjZW5kaWYKKworCitzdGF0aWMgczMyIHZhdnNfaW5pdChzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcpCit7CisJaW50IHJldCwgc2l6ZSA9IC0xOworCXN0cnVjdCBmaXJtd2FyZV9zICpmdzsKKwl1MzIgZndfc2l6ZSA9IDB4MTAwMCAqIDE2OworCS8qY2hhciAqYnVmID0gdm1hbGxvYygweDEwMDAgKiAxNik7CisKKwlpZiAoSVNfRVJSX09SX05VTEwoYnVmKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJKi8KKwlmdyA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBmaXJtd2FyZV9zKSArIGZ3X3NpemUpOworCWlmIChJU19FUlJfT1JfTlVMTChmdykpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJfaW5mbygidmF2c19pbml0XG4iKTsKKwkvL2luaXRfdGltZXIoJmh3LT5yZWN5Y2xlX3RpbWVyKTsKKworCS8vaHctPnN0YXQgfD0gU1RBVF9USU1FUl9JTklUOworCisJLy9hbXZkZWNfZW5hYmxlKCk7CisKKwkvL3ZkZWNfZW5hYmxlX0RNQyhOVUxMKTsKKworCXZhdnNfbG9jYWxfaW5pdChodyk7CisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWE0pCisJCXNpemUgPSBnZXRfZmlybXdhcmVfZGF0YShWSURFT19ERUNfQVZTX01VTFRJLCBmdy0+ZGF0YSk7CisJZWxzZSB7CisJCWlmIChmaXJtd2FyZV9zZWwgPT0gMSkKKwkJCXNpemUgPSBnZXRfZmlybXdhcmVfZGF0YShWSURFT19ERUNfQVZTX05PQ0FCQUMsIGZ3LT5kYXRhKTsKKyNpZmRlZiBBVlNQX0xPTkdfQ0FCQUMKKwkJZWxzZSB7CisJCQlpbml0X2F2c3BfbG9uZ19jYWJhY19idWYoKTsKKwkJCXNpemUgPSBnZXRfZmlybXdhcmVfZGF0YShWSURFT19ERUNfQVZTX01VTFRJLCBmdy0+ZGF0YSk7CisJCX0KKyNlbmRpZgorCX0KKworCWlmIChzaXplIDwgMCkgeworCQlhbXZkZWNfZGlzYWJsZSgpOworCQlwcl9lcnIoImdldCBmaXJtd2FyZSBmYWlsLiIpOworCQl2ZnJlZShmdyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlmdy0+bGVuID0gc2l6ZTsKKwlody0+ZncgPSBmdzsKKworCWlmIChody0+bV9pbnNfZmxhZykgeworCQl0aW1lcl9zZXR1cCgmaHctPmNoZWNrX3RpbWVyLCBjaGVja190aW1lcl9mdW5jLCAwKTsKKwkJLy9pbml0X3RpbWVyKCZody0+Y2hlY2tfdGltZXIpOworCQkvL2h3LT5jaGVja190aW1lci5kYXRhID0gKHVsb25nKSBodzsKKwkJLy9ody0+Y2hlY2tfdGltZXIuZnVuY3Rpb24gPSBjaGVja190aW1lcl9mdW5jOworCQlody0+Y2hlY2tfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBDSEVDS19JTlRFUlZBTDsKKworCisJCS8vYWRkX3RpbWVyKCZody0+Y2hlY2tfdGltZXIpOworCQlody0+c3RhdCB8PSBTVEFUX1RJTUVSX0FSTTsKKworCQlJTklUX1dPUksoJmh3LT53b3JrLCB2YXZzX3dvcmspOworCisJCWh3LT5mdyA9IGZ3OworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWE0pCisJCXJldCA9IGFtdmRlY19sb2FkbWNfZXgoVkZPUk1BVF9BVlMsIE5VTEwsIGZ3LT5kYXRhKTsKKwllbHNlIGlmIChmaXJtd2FyZV9zZWwgPT0gMSkKKwkJcmV0ID0gYW12ZGVjX2xvYWRtY19leChWRk9STUFUX0FWUywgImF2c19ub19jYWJhYyIsIGZ3LT5kYXRhKTsKKwllbHNlCisJCXJldCA9IGFtdmRlY19sb2FkbWNfZXgoVkZPUk1BVF9BVlMsIE5VTEwsIGZ3LT5kYXRhKTsKKworCWlmIChyZXQgPCAwKSB7CisJCWFtdmRlY19kaXNhYmxlKCk7CisJCS8qdmZyZWUoYnVmKTsqLworCQlwcl9lcnIoIkFWUzogdGhlICVzIGZ3IGxvYWRpbmcgZmFpbGVkLCBlcnI6ICV4XG4iLAorCQkJdGVlX2VuYWJsZWQoKSA/ICJURUUiIDogImxvY2FsIiwgcmV0KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKnZmcmVlKGJ1Zik7Ki8KKworCWh3LT5zdGF0IHw9IFNUQVRfTUNfTE9BRDsKKworCisJLyogZW5hYmxlIEFNUklTQyBzaWRlIHByb3RvY29sICovCisJcmV0ID0gdmF2c19wcm90X2luaXQoaHcpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisjaWZkZWYgSEFORExFX0FWU19JUlEKKwlpZiAodmRlY19yZXF1ZXN0X2lycShWREVDX0lSUV8xLCB2YXZzX2lzciwKKwkJCSJ2YXZzLWlycSIsICh2b2lkICopaHcpKSB7CisJCWFtdmRlY19kaXNhYmxlKCk7CisJCXByX2luZm8oInZhdnMgaXJxIHJlZ2lzdGVyIGVycm9yLlxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKyNlbmRpZgorCisJaHctPnN0YXQgfD0gU1RBVF9JU1JfUkVHOworCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfUE9TVF9QUk9DRVNTX01BTkFHRVIKKwl2Zl9wcm92aWRlcl9pbml0KCZ2YXZzX3ZmX3Byb3YsIFBST1ZJREVSX05BTUUsICZ2YXZzX3ZmX3Byb3ZpZGVyLCBodyk7CisJdmZfcmVnX3Byb3ZpZGVyKCZ2YXZzX3ZmX3Byb3YpOworCWF2c192Zl9ub3RpZnlfcmVjZWl2ZXIoaHcsIFBST1ZJREVSX05BTUUsIFZGUkFNRV9FVkVOVF9QUk9WSURFUl9TVEFSVCwgTlVMTCk7CisjZWxzZQorCXZmX3Byb3ZpZGVyX2luaXQoJnZhdnNfdmZfcHJvdiwgUFJPVklERVJfTkFNRSwgJnZhdnNfdmZfcHJvdmlkZXIsIGh3KTsKKwl2Zl9yZWdfcHJvdmlkZXIoJnZhdnNfdmZfcHJvdik7CisjZW5kaWYKKworCWlmIChody0+dmF2c19hbXN0cmVhbV9kZWNfaW5mby5yYXRlICE9IDApIHsKKwkJaWYgKCFody0+aXNfcmVzZXQpCisJCQlhdnNfdmZfbm90aWZ5X3JlY2VpdmVyKGh3LCBQUk9WSURFUl9OQU1FLAorCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfRlJfSElOVCwKKwkJCQkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpCisJCQkJCWh3LT52YXZzX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUpKTsKKwkJaHctPmZyX2hpbnRfc3RhdHVzID0gVkRFQ19ISU5URUQ7CisJfSBlbHNlCisJCWh3LT5mcl9oaW50X3N0YXR1cyA9IFZERUNfTkVFRF9ISU5UOworCisJaHctPnN0YXQgfD0gU1RBVF9WRl9IT09LOworCisJdGltZXJfc2V0dXAoJmh3LT5yZWN5Y2xlX3RpbWVyLCB2YXZzX3B1dF90aW1lcl9mdW5jLCAwKTsKKwkvL2h3LT5yZWN5Y2xlX3RpbWVyLmRhdGEgPSAodWxvbmcpKGh3KTsKKwkvL2h3LT5yZWN5Y2xlX3RpbWVyLmZ1bmN0aW9uID0gdmF2c19wdXRfdGltZXJfZnVuYzsKKwlody0+cmVjeWNsZV90aW1lci5leHBpcmVzID0gamlmZmllcyArIFBVVF9JTlRFUlZBTDsKKworCWFkZF90aW1lcigmaHctPnJlY3ljbGVfdGltZXIpOworCisJaHctPnN0YXQgfD0gU1RBVF9USU1FUl9BUk07CisKKyNpZmRlZiBBVlNQX0xPTkdfQ0FCQUMKKwlpZiAoZmlybXdhcmVfc2VsID09IDApCisJCUlOSVRfV09SSygmbG9uZ19jYWJhY193ZF93b3JrLCBsb25nX2NhYmFjX2RvX3dvcmspOworI2VuZGlmCisJdmRlY19zb3VyY2VfY2hhbmdlZChWRk9STUFUX0FWUywKKwkJCQkJMTkyMCwgMTA4MCwgMzApOworI2lmZGVmIERFQlVHX01VTFRJX1dJVEhfQVVUT01PREUKKwlpZiAoc3RhcnRfZGVjb2RpbmdfZGVsYXkgPT0gMCkKKwkJYW12ZGVjX3N0YXJ0KCk7CisJZWxzZQorCQlkZWxheV9jb3VudCA9IHN0YXJ0X2RlY29kaW5nX2RlbGF5LzEwOworI2Vsc2UKKwlhbXZkZWNfc3RhcnQoKTsKKyNlbmRpZgorCWh3LT5zdGF0IHw9IFNUQVRfVkRFQ19SVU47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW12ZGVjX2F2c19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB2ZGVjX3MgKnBkYXRhID0gKihzdHJ1Y3QgdmRlY19zICoqKXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCB2ZGVjX2F2c19od19zICpodyA9IE5VTEw7CisKKwlpZiAocGRhdGEgPT0gTlVMTCkgeworCQlwcl9pbmZvKCJhbXZkZWNfYXZzIG1lbW9yeSByZXNvdXJjZSB1bmRlZmluZWQuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaHcgPSAoc3RydWN0IHZkZWNfYXZzX2h3X3MgKil2emFsbG9jKHNpemVvZihzdHJ1Y3QgdmRlY19hdnNfaHdfcykpOworCWlmIChodyA9PSBOVUxMKSB7CisJCXByX2luZm8oIlxuYW1tdmRlY19hdnMgZGVjb2RlciBkcml2ZXIgYWxsb2MgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXBkYXRhLT5wcml2YXRlID0gaHc7CisJZ2h3ID0gaHc7CisJYXRvbWljX3NldCgmaHctPmVycm9yX2hhbmRsZXJfcnVuLCAwKTsKKwlody0+bV9pbnNfZmxhZyA9IDA7CisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWE0gfHwgZGlzYWJsZV9sb25nY2FiYWNfdHJhbnMpCisJCWZpcm13YXJlX3NlbCA9IDE7CisKKwlpZiAoZmlybXdhcmVfc2VsID09IDEpIHsKKyNpZm5kZWYgVVNFX0RZTkFNSUNfQlVGX05VTQorCQl2Zl9idWZfbnVtID0gNDsKKyNlbmRpZgorCQljYW52YXNfYmFzZSA9IDA7CisJCWNhbnZhc19udW0gPSAzOworCX0gZWxzZSB7CisKKwkJY2FudmFzX2Jhc2UgPSAxMjg7CisJCWNhbnZhc19udW0gPSAyOyAvKk5WMjEqLworCX0KKworCisJaWYgKHBkYXRhLT5zeXNfaW5mbykKKwkJaHctPnZhdnNfYW1zdHJlYW1fZGVjX2luZm8gPSAqcGRhdGEtPnN5c19pbmZvOworCisJcHJfaW5mbygiJXMgKCVkLCVkKSAlZFxuIiwgX19mdW5jX18sIGh3LT52YXZzX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoLAorCQkgICBody0+dmF2c19hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQsIGh3LT52YXZzX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUpOworCisJcGRhdGEtPmRlY19zdGF0dXMgPSB2YXZzX2RlY19zdGF0dXM7CisJcGRhdGEtPnNldF9pc3Jlc2V0ID0gdmF2c19zZXRfaXNyZXNldDsKKwlody0+aXNfcmVzZXQgPSAwOworCisJcGRhdGEtPnVzZXJfZGF0YV9yZWFkID0gTlVMTDsKKwlwZGF0YS0+cmVzZXRfdXNlcmRhdGFfZmlmbyA9IE5VTEw7CisKKwl2YXZzX3ZkZWNfaW5mb19pbml0KGh3KTsKKworI2lmZGVmIEVOQUJMRV9VU0VSX0RBVEEKKwlpZiAoTlVMTCA9PSBody0+dXNlcl9kYXRhX2J1ZmZlcikgeworCQlody0+dXNlcl9kYXRhX2J1ZmZlciA9CisJCQlkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCVVTRVJfREFUQV9TSVpFLAorCQkJCSZody0+dXNlcl9kYXRhX2J1ZmZlcl9waHlzLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFody0+dXNlcl9kYXRhX2J1ZmZlcikgeworCQkJcHJfaW5mbygiJXM6IENhbiBub3QgYWxsb2NhdGUgaHctPnVzZXJfZGF0YV9idWZmZXJcbiIsCisJCQkJICAgX19mdW5jX18pOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJcHJfZGVidWcoImh3LT51c2VyX2RhdGFfYnVmZmVyID0gMHglcCwgaHctPnVzZXJfZGF0YV9idWZmZXJfcGh5cyA9IDB4JXhcbiIsCisJCQlody0+dXNlcl9kYXRhX2J1ZmZlciwgKHUzMilody0+dXNlcl9kYXRhX2J1ZmZlcl9waHlzKTsKKwl9CisjZW5kaWYKKwlJTklUX1dPUksoJmh3LT5zZXRfY2xrX3dvcmssIGF2c19zZXRfY2xrKTsKKwlpZiAodmF2c19pbml0KGh3KSA8IDApIHsKKwkJcHJfaW5mbygiYW12ZGVjX2F2cyBpbml0IGZhaWxlZC5cbiIpOworCQlrZnJlZShody0+Z3ZzKTsKKwkJaHctPmd2cyA9IE5VTEw7CisJCXBkYXRhLT5kZWNfc3RhdHVzID0gTlVMTDsKKwkJaWYgKGh3LT5mdykKKwkJCXZmcmVlKGh3LT5mdyk7CisJCWh3LT5mdyA9IE5VTEw7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkvKnZkZWMgPSBwZGF0YTsqLworCisJSU5JVF9XT1JLKCZody0+ZmF0YWxfZXJyb3Jfd2Rfd29yaywgdmF2c19mYXRhbF9lcnJvcl9oYW5kbGVyKTsKKwlhdG9taWNfc2V0KCZody0+ZXJyb3JfaGFuZGxlcl9ydW4sIDApOworI2lmZGVmIEVOQUJMRV9VU0VSX0RBVEEKKwlJTklUX1dPUksoJmh3LT51c2VyZGF0YV9wdXNoX3dvcmssIHVzZXJkYXRhX3B1c2hfZG9fd29yayk7CisjZW5kaWYKKwlJTklUX1dPUksoJmh3LT5ub3RpZnlfd29yaywgdmF2c19ub3RpZnlfd29yayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbXZkZWNfYXZzX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB2ZGVjX2F2c19od19zICpodyA9IGdodzsKKworCWNhbmNlbF93b3JrX3N5bmMoJmh3LT5mYXRhbF9lcnJvcl93ZF93b3JrKTsKKwlhdG9taWNfc2V0KCZody0+ZXJyb3JfaGFuZGxlcl9ydW4sIDApOworI2lmZGVmIEVOQUJMRV9VU0VSX0RBVEEKKwljYW5jZWxfd29ya19zeW5jKCZody0+dXNlcmRhdGFfcHVzaF93b3JrKTsKKyNlbmRpZgorCWNhbmNlbF93b3JrX3N5bmMoJmh3LT5ub3RpZnlfd29yayk7CisJY2FuY2VsX3dvcmtfc3luYygmaHctPnNldF9jbGtfd29yayk7CisJaWYgKGh3LT5zdGF0ICYgU1RBVF9WREVDX1JVTikgeworCQlhbXZkZWNfc3RvcCgpOworCQlody0+c3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwl9CisKKwlpZiAoaHctPnN0YXQgJiBTVEFUX0lTUl9SRUcpIHsKKwkJdmRlY19mcmVlX2lycShWREVDX0lSUV8xLCAodm9pZCAqKXZhdnNfZGVjX2lkKTsKKwkJaHctPnN0YXQgJj0gflNUQVRfSVNSX1JFRzsKKwl9CisKKwlpZiAoaHctPnN0YXQgJiBTVEFUX1RJTUVSX0FSTSkgeworCQlkZWxfdGltZXJfc3luYygmaHctPnJlY3ljbGVfdGltZXIpOworCQlody0+c3RhdCAmPSB+U1RBVF9USU1FUl9BUk07CisJfQorI2lmZGVmIEFWU1BfTE9OR19DQUJBQworCWlmIChmaXJtd2FyZV9zZWwgPT0gMCkgeworCQltdXRleF9sb2NrKCZ2YXZzX211dGV4KTsKKwkJY2FuY2VsX3dvcmtfc3luYygmbG9uZ19jYWJhY193ZF93b3JrKTsKKwkJbXV0ZXhfdW5sb2NrKCZ2YXZzX211dGV4KTsKKworCQlpZiAoZXNfd3JpdGVfYWRkcl92aXJ0KSB7CisjaWYgMAorCQkJY29kZWNfbW1fZnJlZV9mb3JfZG1hKCJ2YXZzIiwgZXNfd3JpdGVfYWRkcl9waHkpOworI2Vsc2UKKwkJCWRtYV91bm1hcF9zaW5nbGUoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCWVzX3dyaXRlX2FkZHJfcGh5LAorCQkJCU1BWF9DT0RFRF9GUkFNRV9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCQkJLyprZnJlZShlc193cml0ZV9hZGRyX3ZpcnQpOyovCisJCQllc193cml0ZV9hZGRyX3ZpcnQgPSBOVUxMOworI2VuZGlmCisJCX0KKworI2lmZGVmIEJJVFNUUkVBTV9SRUFEX1RNUF9OT19DQUNIRQorCQlpZiAoYml0c3RyZWFtX3JlYWRfdG1wKSB7CisJCQlkbWFfZnJlZV9jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJU1ZBX1NUUkVBTV9CVUZfU0laRSwgYml0c3RyZWFtX3JlYWRfdG1wLAorCQkJCWJpdHN0cmVhbV9yZWFkX3RtcF9waHkpOworCQkJYml0c3RyZWFtX3JlYWRfdG1wID0gTlVMTDsKKwkJfQorI2Vsc2UKKwkJaWYgKGJpdHN0cmVhbV9yZWFkX3RtcCkgeworCQkJZG1hX3VubWFwX3NpbmdsZShhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJYml0c3RyZWFtX3JlYWRfdG1wX3BoeSwKKwkJCQlTVkFfU1RSRUFNX0JVRl9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCQkJa2ZyZWUoYml0c3RyZWFtX3JlYWRfdG1wKTsKKwkJCWJpdHN0cmVhbV9yZWFkX3RtcCA9IE5VTEw7CisJCX0KKyNlbmRpZgorCX0KKyNlbmRpZgorCWlmIChody0+c3RhdCAmIFNUQVRfVkZfSE9PSykgeworCQlpZiAoaHctPmZyX2hpbnRfc3RhdHVzID09IFZERUNfSElOVEVEICYmICFody0+aXNfcmVzZXQpCisJCQlhdnNfdmZfbm90aWZ5X3JlY2VpdmVyKGh3LCBQUk9WSURFUl9OQU1FLAorCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9GUl9FTkRfSElOVCwgTlVMTCk7CisJCWh3LT5mcl9oaW50X3N0YXR1cyA9IFZERUNfTk9fTkVFRF9ISU5UOworCQl2Zl91bnJlZ19wcm92aWRlcigmdmF2c192Zl9wcm92KTsKKwkJaHctPnN0YXQgJj0gflNUQVRfVkZfSE9PSzsKKwl9CisKKyNpZmRlZiBFTkFCTEVfVVNFUl9EQVRBCisJaWYgKGh3LT51c2VyX2RhdGFfYnVmZmVyICE9IE5VTEwpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoCisJCQlhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQlVU0VSX0RBVEFfU0laRSwKKwkJCWh3LT51c2VyX2RhdGFfYnVmZmVyLAorCQkJaHctPnVzZXJfZGF0YV9idWZmZXJfcGh5cyk7CisJCWh3LT51c2VyX2RhdGFfYnVmZmVyID0gTlVMTDsKKwkJaHctPnVzZXJfZGF0YV9idWZmZXJfcGh5cyA9IDA7CisJfQorI2VuZGlmCisKKwlpZiAoaHctPmZ3KSB7CisJCXZmcmVlKGh3LT5mdyk7CisJCWh3LT5mdyA9IE5VTEw7CisJfQorCisJLy9hbXZkZWNfZGlzYWJsZSgpOworCS8vdmRlY19kaXNhYmxlX0RNQyhOVUxMKTsKKworCWh3LT5waWNfdHlwZSA9IDA7CisJaWYgKGh3LT5tbV9ibGtfaGFuZGxlKSB7CisJCWRlY29kZXJfYm1tdV9ib3hfZnJlZShody0+bW1fYmxrX2hhbmRsZSk7CisJCWh3LT5tbV9ibGtfaGFuZGxlID0gTlVMTDsKKwl9CisjaWZkZWYgREVCVUdfUFRTCisJcHJfZGVidWcoInB0cyBoaXQgJWQsIHB0cyBtaXNzZWQgJWQsIGkgaGl0ICVkLCBtaXNzZWQgJWRcbiIsIGh3LT5wdHNfaGl0LAorCQkgICBody0+cHRzX21pc3NlZCwgaHctPnB0c19pX2hpdCwgaHctPnB0c19pX21pc3NlZCk7CisJcHJfZGVidWcoInRvdGFsIGZyYW1lICVkLCBody0+YXZpX2ZsYWcgJWQsIHJhdGUgJWRcbiIsIGh3LT50b3RhbF9mcmFtZSwgaHctPmF2aV9mbGFnLAorCQkgICBody0+dmF2c19hbXN0cmVhbV9kZWNfaW5mby5yYXRlKTsKKyNlbmRpZgorCWtmcmVlKGh3LT5ndnMpOworCWh3LT5ndnMgPSBOVUxMOworCXZmcmVlKGh3KTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgMAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYW12ZGVjX2F2c19kcml2ZXIgPSB7CisJLnByb2JlID0gYW12ZGVjX2F2c19wcm9iZSwKKwkucmVtb3ZlID0gYW12ZGVjX2F2c19yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwl9Cit9OworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHJlY3ljbGVfZnJhbWVzKHN0cnVjdCB2ZGVjX2F2c19od19zICpodyk7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJ1bl9yZWFkeShzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1bnNpZ25lZCBsb25nIG1hc2spCit7CisJc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3ID0KKwkoc3RydWN0IHZkZWNfYXZzX2h3X3MgKil2ZGVjLT5wcml2YXRlOworCWludCByZXQgPSAxOworCXVuc2lnbmVkIGJ1Zl9idXN5X21hc2sgPSAoMSA8PCBody0+dmZfYnVmX251bV91c2VkKSAtIDE7CisjaWZkZWYgREVCVUdfTVVMVElfRlJBTUVfSU5TCisJaWYgKChERUNPREVfSUQoaHcpID09IDApICYmIHJ1bl9jb3VudFswXSA+IHJ1bl9jb3VudFsxXSAmJgorCQlydW5fY291bnRbMV0gPCBtYXhfcnVuX2NvdW50WzFdKQorCQlyZXR1cm4gMDsKKworCWlmICgoREVDT0RFX0lEKGh3KSA9PSAxKSAmJiBydW5fY291bnRbMV0gPj0gcnVuX2NvdW50WzBdICYmCisJCXJ1bl9jb3VudFswXSA8IG1heF9ydW5fY291bnRbMF0pCisJCXJldHVybiAwOworCisJaWYgKG1heF9ydW5fY291bnRbREVDT0RFX0lEKGh3KV0gPiAwICYmCisJCXJ1bl9jb3VudFtERUNPREVfSUQoaHcpXSA+PSBtYXhfcnVuX2NvdW50W0RFQ09ERV9JRChodyldKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCWlmICh2ZGVjX3N0cmVhbV9iYXNlZCh2ZGVjKSAmJiAoaHctPmluaXRfZmxhZyA9PSAwKQorCQkmJiBwcmVfZGVjb2RlX2J1Zl9sZXZlbCAhPSAwKSB7CisJCXUzMiBycCwgd3AsIGxldmVsOworCisJCXJwID0gU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3JwKTsKKwkJd3AgPSBTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApOworCQlpZiAod3AgPCBycCkKKwkJCWxldmVsID0gdmRlYy0+aW5wdXQuc2l6ZSArIHdwIC0gcnA7CisJCWVsc2UKKwkJCWxldmVsID0gd3AgLSBycDsKKworCQlpZiAobGV2ZWwgPCBwcmVfZGVjb2RlX2J1Zl9sZXZlbCkgeworCQkJaHctPm5vdF9ydW5fcmVhZHkrKzsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKGh3LT5yZXNldF9kZWNvZGVfZmxhZyA9PSAwICYmCisJCWh3LT5hZ2Fpbl9mbGFnID09IDAgJiYKKwkJKGh3LT5idWZfc3RhdHVzICYgYnVmX2J1c3lfbWFzaykgPT0gYnVmX2J1c3lfbWFzaykgeworCQlyZWN5Y2xlX2ZyYW1lcyhodyk7CisJCWlmIChody0+YnVmX3JlY3ljbGVfc3RhdHVzID09IDApCisJCQlyZXQgPSAwOworCX0KKworCWlmIChhZ2Fpbl90aHJlc2hvbGQgPiAwICYmCisJCWh3LT5wcmVfcGFyc2VyX3dyX3B0ciAhPSAwICYmCisJCWh3LT5hZ2Fpbl9mbGFnICYmCisJCSghdmRlY19mcmFtZV9iYXNlZCh2ZGVjKSkpIHsKKwkJdTMyIHBhcnNlcl93cl9wdHIgPQorCQkJU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3JwKTsKKwkJaWYgKHBhcnNlcl93cl9wdHIgPj0gaHctPnByZV9wYXJzZXJfd3JfcHRyICYmCisJCQkocGFyc2VyX3dyX3B0ciAtIGh3LT5wcmVfcGFyc2VyX3dyX3B0cikgPAorCQkJYWdhaW5fdGhyZXNob2xkKSB7CisJCQlpbnQgciA9IHZkZWNfc3luY19pbnB1dCh2ZGVjKTsKKwkJCQlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19WRlJBTUVfREVUQUlMLAorCQkJCQkiJXMgYnVmIGxlbHZlbDoleFxuIiwgIF9fZnVuY19fLCByKTsKKwkJCXJldCA9IDA7CisJCX0KKwl9CisKKwlpZiAocmV0KQorCQlody0+bm90X3J1bl9yZWFkeSA9IDA7CisJZWxzZQorCQlody0+bm90X3J1bl9yZWFkeSsrOworCisJaWYgKHJldCAhPSAwKSB7CisJCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkKKwkJCXJldHVybiAodW5zaWduZWQgbG9uZykoQ09SRV9NQVNLX1ZERUNfMSk7CisJCWVsc2UKKwkJCXJldHVybiAodW5zaWduZWQgbG9uZykoQ09SRV9NQVNLX1ZERUNfMSB8IENPUkVfTUFTS19IRVZDKTsKKwl9IGVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZhdnNfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3ID0KKwljb250YWluZXJfb2Yod29yaywgc3RydWN0IHZkZWNfYXZzX2h3X3MsIHdvcmspOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGh3KTsKKwlpZiAoaHctPmRlY19yZXN1bHQgIT0gREVDX1JFU1VMVF9BR0FJTikKKwkJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfUlVOX0ZMT1csCisJImFtbXZkZWNfYXZzOiB2YXZzX3dvcmsscmVzdWx0PSVkLHN0YXR1cz0lZFxuIiwKKwlody0+ZGVjX3Jlc3VsdCwgaHdfdG9fdmRlYyhodyktPm5leHRfc3RhdHVzKTsKKwlody0+YWdhaW5fZmxhZyA9IDA7CisJaWYgKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfVVNFUkRBVEEpIHsKKwkJdXNlcmRhdGFfcHVzaF9wcm9jZXNzKGh3KTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9ET05FKSB7CisKKwkJaWYgKCFody0+Y3R4X3ZhbGlkKQorCQkJaHctPmN0eF92YWxpZCA9IDE7CisjaWZkZWYgREVCVUdfTVVMVElfRlJBTUVfSU5TCisJCQltc2xlZXAoZGVsYXkpOworI2VuZGlmCisJCXZkZWNfdmZyYW1lX2RpcnR5KGh3X3RvX3ZkZWMoaHcpLCBody0+Y2h1bmspOworCX0gZWxzZSBpZiAoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9BR0FJTgorCSYmIChod190b192ZGVjKGh3KS0+bmV4dF9zdGF0dXMgIT0KKwkJVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEKSkgeworCQkvKgorCQkJc3RyZWFtIGJhc2U6IHN0cmVhbSBidWYgZW1wdHkgb3IgdGltZW91dAorCQkJZnJhbWUgYmFzZTogdmRlY19wcmVwYXJlX2lucHV0IGZhaWwKKwkJKi8KKwkJaHctPmFnYWluX2ZsYWcgPSAxOworCQlpZiAoIXZkZWNfaGFzX21vcmVfaW5wdXQoaHdfdG9fdmRlYyhodykpKSB7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRU9TOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQlyZXR1cm47CisJCX0KKwl9ICBlbHNlIGlmIChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0dFVF9EQVRBCisJCSYmIChod190b192ZGVjKGh3KS0+bmV4dF9zdGF0dXMgIT0KKwkJVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEKSkgeworCQlpZiAoIXZkZWNfaGFzX21vcmVfaW5wdXQoaHdfdG9fdmRlYyhodykpKSB7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRU9TOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQlyZXR1cm47CisJCX0KKwkJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfVkxEX0RFVEFJTCwKKwkJIiVzIERFQ19SRVNVTFRfR0VUX0RBVEEgJXggJXggJXhcbiIsCisJCV9fZnVuY19fLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApKTsKKwkJdmRlY192ZnJhbWVfZGlydHkoaHdfdG9fdmRlYyhodyksIGh3LT5jaHVuayk7CisJCXZkZWNfY2xlYW5faW5wdXQoaHdfdG9fdmRlYyhodykpOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0ZPUkNFX0VYSVQpIHsKKwkJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfRVJST1IsCisJCSIlczogZm9yY2UgZXhpdFxuIiwgX19mdW5jX18pOworCQlpZiAoaHctPnN0YXQgJiBTVEFUX0lTUl9SRUcpIHsKKwkJCWFtdmRlY19zdG9wKCk7CisJCQkvKmRpc2FibGUgbWJveCBpbnRlcnJ1cHQgKi8KKwkJCVdSSVRFX1ZSRUcoQVNTSVNUX01CT1gxX01BU0ssIDApOworCQkJdmRlY19mcmVlX2lycShWREVDX0lSUV8xLCAodm9pZCAqKWh3KTsKKwkJCWh3LT5zdGF0ICY9IH5TVEFUX0lTUl9SRUc7CisJCX0KKwl9IGVsc2UgaWYgKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfRU9TKSB7CisJCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX0RFQ09ESU5HLAorCQkJIiVzOiBlbmQgb2Ygc3RyZWFtXG4iLCBfX2Z1bmNfXyk7CisJCWlmIChody0+c3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJCWFtdmRlY19zdG9wKCk7CisJCQlody0+c3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwkJfQorCQlody0+ZW9zID0gMTsKKwkJdmRlY192ZnJhbWVfZGlydHkoaHdfdG9fdmRlYyhodyksIGh3LT5jaHVuayk7CisJCXZkZWNfY2xlYW5faW5wdXQoaHdfdG9fdmRlYyhodykpOworCX0KKwlpZiAoaHctPnN0YXQgJiBTVEFUX1ZERUNfUlVOKSB7CisjaWYgREVCVUdfTVVMVElfRkxBRyA9PSAxCisjZWxzZQorCQlhbXZkZWNfc3RvcCgpOworI2VuZGlmCisJCWh3LT5zdGF0ICY9IH5TVEFUX1ZERUNfUlVOOworCX0KKwkvKndhaXRfdm1tcGVnMTJfc2VhcmNoX2RvbmUoaHcpOyovCisJaWYgKGh3LT5zdGF0ICYgU1RBVF9USU1FUl9BUk0pIHsKKwkJZGVsX3RpbWVyX3N5bmMoJmh3LT5jaGVja190aW1lcik7CisJCWh3LT5zdGF0ICY9IH5TVEFUX1RJTUVSX0FSTTsKKwl9CisJaWYgKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfRE9ORSkKKwkJaHctPmJ1Zl9yZWN5Y2xlX3N0YXR1cyA9IDA7CisJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfUlVOX0ZMT1csICJ3b3JrIGVuZCAlZFxuIiwgaHctPmRlY19yZXN1bHQpOworCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkKKwkJdmRlY19jb3JlX2ZpbmlzaF9ydW4oaHdfdG9fdmRlYyhodyksIENPUkVfTUFTS19WREVDXzEpOworCWVsc2UKKwkJdmRlY19jb3JlX2ZpbmlzaF9ydW4oaHdfdG9fdmRlYyhodyksIENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQyk7CisKKwlpZiAoaHctPnZkZWNfY2IpIHsKKwkJaHctPnZkZWNfY2IoaHdfdG9fdmRlYyhodyksIGh3LT52ZGVjX2NiX2FyZyk7CisJCWRlYnVnX3ByaW50KGh3LCAweDgwMDAwLAorCQkiJXM6XG4iLCBfX2Z1bmNfXyk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHJlc2V0X3Byb2Nlc3NfdGltZShzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcpCit7CisJaWYgKCFody0+bV9pbnNfZmxhZykKKwkJcmV0dXJuOworCWlmIChody0+c3RhcnRfcHJvY2Vzc190aW1lKSB7CisJCXVuc2lnbmVkIHByb2Nlc3NfdGltZSA9CisJCQkxMDAwICogKGppZmZpZXMgLSBody0+c3RhcnRfcHJvY2Vzc190aW1lKSAvIEhaOworCQlody0+c3RhcnRfcHJvY2Vzc190aW1lID0gMDsKKwkJaWYgKHByb2Nlc3NfdGltZSA+IG1heF9wcm9jZXNzX3RpbWVbREVDT0RFX0lEKGh3KV0pCisJCQltYXhfcHJvY2Vzc190aW1lW0RFQ09ERV9JRChodyldID0gcHJvY2Vzc190aW1lOworCX0KK30KK3N0YXRpYyB2b2lkIHN0YXJ0X3Byb2Nlc3NfdGltZShzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcpCit7CisJaHctPmRlY29kZV90aW1lb3V0X2NvdW50ID0gMjsKKwlody0+c3RhcnRfcHJvY2Vzc190aW1lID0gamlmZmllczsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2RlY29kaW5nX2Vycm9yKHN0cnVjdCB2ZGVjX2F2c19od19zICpodykKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB2ZnJhbWVfcyAqdmY7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgVkZfUE9PTF9TSVpFOyBpKyspIHsKKwkJdmYgPSAmaHctPnZmcG9vbFtpXS52ZjsKKwkJaWYgKHZmLT5pbmRleCA8IGh3LT52Zl9idWZfbnVtX3VzZWQpIHsKKwkJCWh3LT52ZnBvb2xbaV0uZGV0YWNoZWQgPSAxOworCQkJaHctPnZmYnVmX3VzZVt2Zi0+aW5kZXhdID0gMDsKKwkJfQorCX0KKwlpZiAoZXJyb3JfaGFuZGxlX3BvbGljeSAmIDB4MikgeworCQl3aGlsZSAoIWtmaWZvX2lzX2VtcHR5KCZody0+ZGlzcGxheV9xKSkgeworCQkJaWYgKGtmaWZvX2dldCgmaHctPmRpc3BsYXlfcSwgJnZmKSkgeworCQkJCWlmIChidWZfb2ZfdmYodmYpLT5kZXRhY2hlZCAhPTApIHsKKwkJCQkJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfREVDT0RJTkcsCisJCQkJCQkiJXMgcmVjeWNsZSAlZCA9PiBuZXdmcmFtZV9xXG4iLAorCQkJCQkJX19mdW5jX18sCisJCQkJCQl2Zi0+aW5kZXgpOworCQkJCQl2Zi0+aW5kZXggPSBody0+dmZfYnVmX251bV91c2VkOworCQkJCQlidWZfb2ZfdmYodmYpLT5kZXRhY2hlZCA9IDA7CisJCQkJCWtmaWZvX3B1dCgmaHctPm5ld2ZyYW1lX3EsCisJCQkJCQkoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQkJCX0KKwkJCX0KKworCQl9CisJfQorCWNsZWFyX3B0c19idWYoaHcpOworCWh3LT5kZWNvZGVfcGljX2NvdW50ID0gMDsKKwlody0+cmVzZXRfZGVjb2RlX2ZsYWcgPSAxOworCWh3LT5wcmVfcGFyc2VyX3dyX3B0ciA9IDA7CisJaHctPmJ1Zl9zdGF0dXMgPSAwOworCWh3LT50aHJvd19wYl9mbGFnID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVvdXRfcHJvY2VzcyhzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcpCit7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaHcpOworCWFtdmRlY19zdG9wKCk7CisJaWYgKGVycm9yX2hhbmRsZV9wb2xpY3kgJiAweDEpIHsKKwkJaGFuZGxlX2RlY29kaW5nX2Vycm9yKGh3KTsKKwl9IGVsc2UgeworCQl2YXZzX3NhdmVfcmVncyhodyk7CisKKwkJLy9pZiAoaHctPmRlY29kZV9waWNfY291bnQgPT0gMCkKKwkJaHctPmRlY29kZV9waWNfY291bnQrKzsKKwkJaWYgKChody0+ZGVjb2RlX3BpY19jb3VudCAmIDB4ZmZmZikgPT0gMCkgeworCQkvKm1ha2UgdWNvZGUgZG8gbm90IGhhbmRsZSBpdCBhcyBmaXJzdCBwaWN0dXJlKi8KKwkJCWh3LT5kZWNvZGVfcGljX2NvdW50Kys7CisJCX0KKwl9CisJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisKKwlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19FUlJPUiwKKwkiJXMgZGVjb2RlciB0aW1lb3V0LCBzdGF0dXM9JWQsIGxldmVsPSVkLCBiaXRfY250PTB4JXhcbiIsCisJX19mdW5jX18sIHZkZWMtPnN0YXR1cywgUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKSwgUkVBRF9WUkVHKFZJRkZfQklUX0NOVCkpOworCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7Cit9CisKKworc3RhdGljIHZvaWQgcmVjeWNsZV9mcmFtZV9idWZmZXJpbihzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcpCit7CisJaWYgKCFrZmlmb19pc19lbXB0eSgmaHctPnJlY3ljbGVfcSkgJiYgKFJFQURfVlJFRyhBVlNfQlVGRkVSSU4pID09IDApKSB7CisJCXN0cnVjdCB2ZnJhbWVfcyAqdmY7CisKKwkJaWYgKGtmaWZvX2dldCgmaHctPnJlY3ljbGVfcSwgJnZmKSkgeworCQkJaWYgKGJ1Zl9vZl92Zih2ZiktPmRldGFjaGVkKSB7CisJCQkJZGVidWdfcHJpbnQoaHcsIDAsCisJCQkJCSIlcyByZWN5Y2xlIGRldGFjaGVkIHZmLCBpbmRleD0lZCBkZXRjaGVkICVkIHVzZWQgJWRcbiIsCisJCQkJCV9fZnVuY19fLCB2Zi0+aW5kZXgsCisJCQkJCWJ1Zl9vZl92Zih2ZiktPmRldGFjaGVkLAorCQkJCQlody0+dmZidWZfdXNlW3ZmLT5pbmRleF0pOworCQkJfQorCQkJaWYgKCh2Zi0+aW5kZXggPCBody0+dmZfYnVmX251bV91c2VkKSAmJgorCQkJCShidWZfb2ZfdmYodmYpLT5kZXRhY2hlZCA9PSAwKSAmJgorCQkJICgtLWh3LT52ZmJ1Zl91c2VbdmYtPmluZGV4XSA9PSAwKSkgeworCQkJCWh3LT5idWZfcmVjeWNsZV9zdGF0dXMgfD0gKDEgPDwgdmYtPmluZGV4KTsKKwkJCQlXUklURV9WUkVHKEFWU19CVUZGRVJJTiwgfigxIDw8IHZmLT5pbmRleCkpOworCQkJCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX0RFQ09ESU5HLAorCQkJCQkiJXMgV1JJVEVfVlJFRyhBVlNfQlVGRkVSSU4sIDB4JXgpIGZvciB2ZiBpbmRleCBvZiAlZCA9PiBidWZfcmVjeWNsZV9zdGF0dXMgMHgleFxuIiwKKwkJCQkJX19mdW5jX18sCisJCQkJCVJFQURfVlJFRyhBVlNfQlVGRkVSSU4pLCB2Zi0+aW5kZXgsCisJCQkJCWh3LT5idWZfcmVjeWNsZV9zdGF0dXMpOworCQkJfQorCQkJdmYtPmluZGV4ID0gaHctPnZmX2J1Zl9udW1fdXNlZDsKKwkJCWJ1Zl9vZl92Zih2ZiktPmRldGFjaGVkID0gMDsKKwkJCWtmaWZvX3B1dCgmaHctPm5ld2ZyYW1lX3EsCisJCQkJCSAgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwkJfQorCisJfQorCit9CisKK3N0YXRpYyB2b2lkIHJlY3ljbGVfZnJhbWVzKHN0cnVjdCB2ZGVjX2F2c19od19zICpodykKK3sKKwl3aGlsZSAoIWtmaWZvX2lzX2VtcHR5KCZody0+cmVjeWNsZV9xKSkgeworCQlzdHJ1Y3QgdmZyYW1lX3MgKnZmOworCisJCWlmIChrZmlmb19nZXQoJmh3LT5yZWN5Y2xlX3EsICZ2ZikpIHsKKwkJCWlmIChidWZfb2ZfdmYodmYpLT5kZXRhY2hlZCkgeworCQkJCWRlYnVnX3ByaW50KGh3LCAwLAorCQkJCQkiJXMgcmVjeWNsZSBkZXRhY2hlZCB2ZiwgaW5kZXg9JWQgZGV0Y2hlZCAlZCB1c2VkICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgdmYtPmluZGV4LAorCQkJCQlidWZfb2ZfdmYodmYpLT5kZXRhY2hlZCwKKwkJCQkJaHctPnZmYnVmX3VzZVt2Zi0+aW5kZXhdKTsKKwkJCX0KKworCisJCQlpZiAoKHZmLT5pbmRleCA8IGh3LT52Zl9idWZfbnVtX3VzZWQpICYmCisJCQkJKGJ1Zl9vZl92Zih2ZiktPmRldGFjaGVkID09IDApICYmCisJCQkgKC0taHctPnZmYnVmX3VzZVt2Zi0+aW5kZXhdID09IDApKSB7CisJCQkJaHctPmJ1Zl9yZWN5Y2xlX3N0YXR1cyB8PSAoMSA8PCB2Zi0+aW5kZXgpOworCQkJCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX0RFQ09ESU5HLAorCQkJCQkiJXMgZm9yIHZmIGluZGV4IG9mICVkID0+IGJ1Zl9yZWN5Y2xlX3N0YXR1cyAweCV4XG4iLAorCQkJCQlfX2Z1bmNfXywKKwkJCQkJdmYtPmluZGV4LAorCQkJCQlody0+YnVmX3JlY3ljbGVfc3RhdHVzKTsKKwkJCX0KKwkJCXZmLT5pbmRleCA9IGh3LT52Zl9idWZfbnVtX3VzZWQ7CisJCQlidWZfb2ZfdmYodmYpLT5kZXRhY2hlZCA9IDA7CisJCQlrZmlmb19wdXQoJmh3LT5uZXdmcmFtZV9xLAorCQkJCShjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCX0KKworCX0KKworfQorCisKK3N0YXRpYyB2b2lkIGNoZWNrX3RpbWVyX2Z1bmMoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworCXN0cnVjdCB2ZGVjX2F2c19od19zICpodyA9IGNvbnRhaW5lcl9vZih0aW1lciwKKwkJc3RydWN0IHZkZWNfYXZzX2h3X3MsIGNoZWNrX3RpbWVyKTsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisJdW5zaWduZWQgaW50IHRpbWVvdXRfdmFsID0gZGVjb2RlX3RpbWVvdXRfdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaHctPm1faW5zX2ZsYWcgJiYKKwkJKGRlYnVnICYKKwkJREVCVUdfV0FJVF9ERUNPREVfRE9ORV9XSEVOX1NUT1ApID09IDAgJiYKKwkJdmRlYy0+bmV4dF9zdGF0dXMgPT0KKwkJVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEKSB7CisJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9GT1JDRV9FWElUOworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJZGVidWdfcHJpbnQoaHcsCisJCQkwLCAidmRlYyByZXF1ZXN0ZWQgdG8gYmUgZGlzY29ubmVjdGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qcmVjeWNsZSovCisJaWYgKCFody0+bV9pbnNfZmxhZykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCQlyZWN5Y2xlX2ZyYW1lX2J1ZmZlcmluKGh3KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOworCX0KKworCWlmIChody0+bV9pbnNfZmxhZykgeworCQlpZiAoKFJFQURfVlJFRyhBVl9TQ1JBVENIXzUpICYgMHhmKSAhPSAwICYmCisJCQkoUkVBRF9WUkVHKEFWX1NDUkFUQ0hfNSkgJiAweGZmMDApICE9IDApeworCQkJLyp1Y29kZSBidWZmZXIgZW1wdHkqLworCQkJaWYgKChrZmlmb19sZW4oJmh3LT5yZWN5Y2xlX3EpID09IDApICYmCisJCQkJKGtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSkgPT0gMCkpIHsKKwkJCQlkZWJ1Z19wcmludChodywKKwkJCQkJMCwgIkFWX1NDUkFUQ0hfNT0weCV4LCByZWNvdmVyIHVjb2RlIGJ1ZmZlcl9zdGF0dXNcbiIsCisJCQkJCVJFQURfVlJFRyhBVl9TQ1JBVENIXzUpKTsKKwkJCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfNSwgMHgxMCk7CisJCQkJLypsZXQgdWNvZGUgdG8gcmVjb3ZlciBidWZmZXJfc3RhdHVzKi8KKwkJCX0KKwkJfQorCX0KKwlpZiAocmFkciAhPSAwKSB7CisJCWlmIChydmFsICE9IDApIHsKKwkJCVdSSVRFX1ZSRUcocmFkciwgcnZhbCk7CisJCQlwcl9pbmZvKCJXUklURV9WUkVHKCV4LCV4KVxuIiwgcmFkciwgcnZhbCk7CisJCX0gZWxzZQorCQkJcHJfaW5mbygiUkVBRF9WUkVHKCV4KT0leFxuIiwgcmFkciwgUkVBRF9WUkVHKHJhZHIpKTsKKwkJcnZhbCA9IDA7CisJCXJhZHIgPSAwOworCX0KKworCWlmICh1ZGVidWdfZmxhZyAhPSBody0+b2xkX3VkZWJ1Z19mbGFnKSB7CisJCVdSSVRFX1ZSRUcoREVDT0RFX1NUT1BfUE9TLCB1ZGVidWdfZmxhZyk7CisJCWh3LT5vbGRfdWRlYnVnX2ZsYWcgPSB1ZGVidWdfZmxhZzsKKwl9CisJaWYgKGRiZ19jbWQgIT0gMCkgeworCQlpZiAoZGJnX2NtZCA9PSAxKSB7CisJCQlpbnQgciA9IHZkZWNfc3luY19pbnB1dCh2ZGVjKTsKKwkJCWRiZ19jbWQgPSAwOworCQkJcHJfaW5mbygKKwkJCQkidmRlY19zeW5jX2lucHV0PT4weCV4LCAobGV2ICV4LCB3cCAleCBycCAleCwgcHJwICV4LCBwd3AgJXgpXG4iLAorCQkJCXIsCisJCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKSwKKwkJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApLAorCQkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCksCisJCQkJU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3JwKSwKKwkJCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApKTsKKwkJfQorCX0KKworCWlmICgoZGVidWcgJiBERUJVR19GTEFHX0RJU0FCTEVfVElNRU9VVCkgPT0gMCAmJgorCQkodGltZW91dF92YWwgPiAwKSAmJgorCQkoaHctPnN0YXJ0X3Byb2Nlc3NfdGltZSA+IDApICYmCisJCSgoMTAwMCAqIChqaWZmaWVzIC0gaHctPnN0YXJ0X3Byb2Nlc3NfdGltZSkgLyBIWikKKwkJCQk+IHRpbWVvdXRfdmFsKSkgeworCQlpZiAoaHctPmxhc3RfdmxkX2xldmVsID09IFJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCkpIHsKKwkJCWlmIChody0+ZGVjb2RlX3RpbWVvdXRfY291bnQgPiAwKQorCQkJCWh3LT5kZWNvZGVfdGltZW91dF9jb3VudC0tOworCQkJaWYgKGh3LT5kZWNvZGVfdGltZW91dF9jb3VudCA9PSAwKQorCQkJCXRpbWVvdXRfcHJvY2Vzcyhodyk7CisJCX0KKwkJaHctPmxhc3RfdmxkX2xldmVsID0gUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKTsKKwl9CisKKwlpZiAoUkVBRF9WUkVHKEFWU19TT1NfQ09VTlQpKSB7CisJCWlmICghZXJyb3JfcmVjb3ZlcnlfbW9kZSkgeworCQkJYW12ZGVjX3N0b3AoKTsKKwkJCWlmIChlcnJvcl9oYW5kbGVfcG9saWN5ICYgMHgxKSB7CisJCQkJaGFuZGxlX2RlY29kaW5nX2Vycm9yKGh3KTsKKwkJCX0gZWxzZSB7CisJCQkJdmF2c19zYXZlX3JlZ3MoaHcpOworCisJCQkJLy9pZiAoaHctPmRlY29kZV9waWNfY291bnQgPT0gMCkKKwkJCQlody0+ZGVjb2RlX3BpY19jb3VudCsrOworCQkJCWlmICgoaHctPmRlY29kZV9waWNfY291bnQgJiAweGZmZmYpID09IDApIHsKKwkJCQkvKm1ha2UgdWNvZGUgZG8gbm90IGhhbmRsZSBpdCBhcyBmaXJzdCBwaWN0dXJlKi8KKwkJCQkJaHctPmRlY29kZV9waWNfY291bnQrKzsKKwkJCQl9CisJCQl9CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKworCQkJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfRVJST1IsCisJCQkiJXMgZGVjb2RlciBlcnJvciwgc3RhdHVzPSVkLCBsZXZlbD0lZCwgQVZTX1NPU19DT1VOVD0weCV4XG4iLAorCQkJX19mdW5jX18sIHZkZWMtPnN0YXR1cywgUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKSwKKwkJCVJFQURfVlJFRyhBVlNfU09TX0NPVU5UKSk7CisJCQlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCX0KKwl9CisKKwlpZiAoKGh3LT51Y29kZV9wYXVzZV9wb3MgIT0gMCkgJiYKKwkJKGh3LT51Y29kZV9wYXVzZV9wb3MgIT0gMHhmZmZmZmZmZikgJiYKKwkJdWRlYnVnX3BhdXNlX3BvcyAhPSBody0+dWNvZGVfcGF1c2VfcG9zKSB7CisJCWh3LT51Y29kZV9wYXVzZV9wb3MgPSAwOworCQlXUklURV9WUkVHKERFQlVHX1JFRzEsIDApOworCX0KKworCWlmICh2ZGVjLT5uZXh0X3N0YXR1cyA9PSBWREVDX1NUQVRVU19ESVNDT05ORUNURUQpIHsKKwkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0ZPUkNFX0VYSVQ7CisJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQlwcl9pbmZvKCJ2ZGVjIHJlcXVlc3RlZCB0byBiZSBkaXNjb25uZWN0ZWRcbiIpOworCQlyZXR1cm47CisJfQorCisJbW9kX3RpbWVyKCZody0+Y2hlY2tfdGltZXIsIGppZmZpZXMgKyBDSEVDS19JTlRFUlZBTCk7Cit9CisKK3N0YXRpYyBpbnQgYXZzX2h3X2N0eF9yZXN0b3JlKHN0cnVjdCB2ZGVjX2F2c19od19zICpodykKK3sKKwkvKmludCByID0gMDsqLworCXZhdnNfcHJvdF9pbml0KGh3KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBnZXRfZGF0YV9jaGVja19zdW0KKwkoc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3LCBpbnQgc2l6ZSkKK3sKKwlpbnQgamo7CisJaW50IHN1bSA9IDA7CisJdTggKmRhdGEgPSBOVUxMOworCisJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCWRhdGEgPSBjb2RlY19tbV92bWFwKGh3LT5jaHVuay0+YmxvY2stPnN0YXJ0ICsKKwkJCWh3LT5jaHVuay0+b2Zmc2V0LCBzaXplKTsKKwllbHNlCisJCWRhdGEgPSAoKHU4ICopaHctPmNodW5rLT5ibG9jay0+c3RhcnRfdmlydCkgKworCQkJaHctPmNodW5rLT5vZmZzZXQ7CisKKwlmb3IgKGpqID0gMDsgamogPCBzaXplOyBqaisrKQorCQlzdW0gKz0gZGF0YVtqal07CisKKwlpZiAoIWh3LT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcihkYXRhKTsKKwlyZXR1cm4gc3VtOworfQorCitzdGF0aWMgdm9pZCBydW4oc3RydWN0IHZkZWNfcyAqdmRlYywgdW5zaWduZWQgbG9uZyBtYXNrLAordm9pZCAoKmNhbGxiYWNrKShzdHJ1Y3QgdmRlY19zICosIHZvaWQgKiksCisJCXZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcgPQorCShzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJaW50IHNhdmVfcmVnOworCWludCBzaXplLCByZXQ7CisJaWYgKCFody0+dmRlY19wZ19lbmFibGVfZmxhZykgeworCQlody0+dmRlY19wZ19lbmFibGVfZmxhZyA9IDE7CisJCWFtdmRlY19lbmFibGUoKTsKKwl9CisJc2F2ZV9yZWcgPSBSRUFEX1ZSRUcoUE9XRVJfQ1RMX1ZMRCk7CisJLyogcmVzZXQgZXZlcnl0aGluZyBleGNlcHQgRE9TX1RPUFsxXSBhbmQgQVBCX0NCVVNbMF0qLworCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX1JVTl9GTE9XLCJydW4gaW5cbiIpOworCWlmICh2ZGVjX3N0cmVhbV9iYXNlZCh2ZGVjKSkgeworCQlody0+cHJlX3BhcnNlcl93cl9wdHIgPQorCQkJU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3dwKTsKKwl9CisjaWYgMQorI2lmIERFQlVHX01VTFRJX0ZMQUcgPiAwCisJaWYgKGh3LT5kZWNvZGVfcGljX2NvdW50ID09IDApIHsKKyNlbmRpZgorCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgMHhmZmZmZmZmMCk7CisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAwKTsKKwlXUklURV9WUkVHKFBPV0VSX0NUTF9WTEQsIHNhdmVfcmVnKTsKKwlody0+cnVuX2NvdW50Kys7CisJcnVuX2NvdW50W0RFQ09ERV9JRChodyldID0gaHctPnJ1bl9jb3VudDsKKwl2ZGVjX3Jlc2V0X2NvcmUodmRlYyk7CisjaWYgREVCVUdfTVVMVElfRkxBRyA+IDAKKwl9CisjZW5kaWYKKyNlbHNlCisJdmRlY19yZXNldF9jb3JlKHZkZWMpOworI2VuZGlmCisJaHctPnZkZWNfY2JfYXJnID0gYXJnOworCWh3LT52ZGVjX2NiID0gY2FsbGJhY2s7CisKKwlzaXplID0gdmRlY19wcmVwYXJlX2lucHV0KHZkZWMsICZody0+Y2h1bmspOworCWlmIChkZWJ1ZyAmIERFQlVHX0ZMQUdfUFJFUEFSRV9NT1JFX0lOUFVUKSB7CisJCWlmIChzaXplIDwgc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCkgeworCQkJLypkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19WTERfREVUQUlMLAorCQkJCSJERUNfUkVTVUxUX0FHQUlOICV4ICV4ICV4XG4iLAorCQkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCksCisJCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1dQKSwKKwkJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApKTsqLworCisJCQlody0+aW5wdXRfZW1wdHkrKzsKKwkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHNpemUgPCAwKSB7CisJCQlody0+aW5wdXRfZW1wdHkrKzsKKwkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJcmV0dXJuOworCQl9CisJfQorCWlmIChpbnB1dF9mcmFtZV9iYXNlZCh2ZGVjKSkgeworCQl1OCAqZGF0YSA9IE5VTEw7CisKKwkJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQlkYXRhID0gY29kZWNfbW1fdm1hcChody0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQkJaHctPmNodW5rLT5vZmZzZXQsIHNpemUpOworCQllbHNlCisJCQlkYXRhID0gKCh1OCAqKWh3LT5jaHVuay0+YmxvY2stPnN0YXJ0X3ZpcnQpICsKKwkJCQlody0+Y2h1bmstPm9mZnNldDsKKworCQlpZiAoZGVidWcgJiBQUklOVF9GTEFHX1JVTl9GTE9XCisJCQkpIHsKKwkJCWRlYnVnX3ByaW50KGh3LCAwLAorCQkJIiVzIGRlY29kZV9waWNfY291bnQgJWQgYnVmX3JlY3ljbGVfc3RhdHVzIDB4JXg6IHNpemUgMHgleCBzdW0gMHgleCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAuLiAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJX19mdW5jX18sIGh3LT5kZWNvZGVfcGljX2NvdW50LAorCQkJaHctPmJ1Zl9yZWN5Y2xlX3N0YXR1cywKKwkJCXNpemUsIGdldF9kYXRhX2NoZWNrX3N1bShodywgc2l6ZSksCisJCQlkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdLCBkYXRhWzNdLAorCQkJZGF0YVs0XSwgZGF0YVs1XSwgZGF0YVtzaXplIC0gNF0sCisJCQlkYXRhW3NpemUgLSAzXSwJZGF0YVtzaXplIC0gMl0sCisJCQlkYXRhW3NpemUgLSAxXSk7CisJCX0KKwkJaWYgKGRlYnVnICYgUFJJTlRfRlJBTUVCQVNFX0RBVEEKKwkJCSkgeworCQkJaW50IGpqOworCisJCQlmb3IgKGpqID0gMDsgamogPCBzaXplOyBqaisrKSB7CisJCQkJaWYgKChqaiAmIDB4ZikgPT0gMCkKKwkJCQkJZGVidWdfcHJpbnQoaHcsCisJCQkJCVBSSU5UX0ZSQU1FQkFTRV9EQVRBLAorCQkJCQkJIiUwNng6IiwgamopOworCQkJCWRlYnVnX3ByaW50KGh3LAorCQkJCVBSSU5UX0ZSQU1FQkFTRV9EQVRBLAorCQkJCQkiJTAyeCAiLCBkYXRhW2pqXSk7CisJCQkJaWYgKCgoamogKyAxKSAmIDB4ZikgPT0gMCkKKwkJCQkJZGVidWdfcHJpbnQoaHcsCisJCQkJCVBSSU5UX0ZSQU1FQkFTRV9EQVRBLAorCQkJCQkJIlxuIik7CisJCQl9CisJCX0KKworCQlpZiAoIWh3LT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIoZGF0YSk7CisJfSBlbHNlCisJCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX1JVTl9GTE9XLAorCQkJIiVzIGRlY29kZV9waWNfY291bnQgJWQgYnVmX3JlY3ljbGVfc3RhdHVzIDB4JXg6ICV4ICV4ICV4ICV4ICV4IHNpemUgMHgleFxuIiwKKwkJCV9fZnVuY19fLAorCQkJaHctPmRlY29kZV9waWNfY291bnQsCisJCQlody0+YnVmX3JlY3ljbGVfc3RhdHVzLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKSwKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19XUCksCisJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApLAorCQkJU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3JwKSwKKwkJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCksCisJCQlzaXplKTsKKworCisJaHctPmlucHV0X2VtcHR5ID0gMDsKKwlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19SVU5fRkxPVywKKwkiJXMsJWQsIHNpemU9JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgc2l6ZSk7CisKKwkvKnZkZWNfZW5hYmxlX2lucHV0KHZkZWMpOworCQluZWVkIHJ1biBhZnRlciBWQzFfQ09OVFJPTF9SRUcgaXMgY29uZmlndXJlZAorCSovCisJaHctPmluaXRfZmxhZyA9IDE7CisKKwlpZiAoaHctPmNodW5rKQorCQlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19SVU5fRkxPVywKKwkJImlucHV0IGNodW5rIG9mZnNldCAlZCwgc2l6ZSAlZFxuIiwKKwkJCWh3LT5jaHVuay0+b2Zmc2V0LCBody0+Y2h1bmstPnNpemUpOworCisJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX05PTkU7CisJLyp2ZGVjLT5tY19sb2FkZWQgPSAwOyovCisJaWYgKHZkZWMtPm1jX2xvYWRlZCkgeworCS8qZmlybXdhcmUgaGF2ZSBsb2FkIGJlZm9yZSwKKwkgIGFuZCBub3QgY2hhbmdlcyB0byBhbm90aGVyLgorCSAgaWdub3JlIHJlbG9hZC4KKwkqLworCX0gZWxzZSB7CisJCXJldCA9IGFtdmRlY192ZGVjX2xvYWRtY19idWZfZXgoVkZPUk1BVF9BVlMsICJhdnNfbXVsdGkiLCB2ZGVjLAorCQkJaHctPmZ3LT5kYXRhLCBody0+ZnctPmxlbik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIlslZF0gJXM6IHRoZSAlcyBmdyBsb2FkaW5nIGZhaWxlZCwgZXJyOiAleFxuIiwgdmRlYy0+aWQsCisJCQkJaHctPmZ3LT5uYW1lLCB0ZWVfZW5hYmxlZCgpID8gIlRFRSIgOiAibG9jYWwiLCByZXQpOworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0ZPUkNFX0VYSVQ7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCXJldHVybjsKKwkJfQorCQl2ZGVjLT5tY19sb2FkZWQgPSAxOworCQl2ZGVjLT5tY190eXBlID0gVkZPUk1BVF9BVlM7CisJfQorCWlmIChhdnNfaHdfY3R4X3Jlc3RvcmUoaHcpIDwgMCkgeworCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRVJST1I7CisJCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX0VSUk9SLAorCQkiYW1tdmRlY19hdnM6IGVycm9yIEhXIGNvbnRleHQgcmVzdG9yZVxuIik7CisJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQlyZXR1cm47CisJfQorCisJLyoKKwkJVGhpcyBjb25maWd1cmVhdGlvbiBvZiBWQzFfQ09OVFJPTF9SRUcgd2lsbAorCQlwb3AgYml0cyAoZXZlbiBubyBkYXRhIGluIHRoZSBzdHJlYW0gYnVmZmVyKSBpZiBpbnB1dCBpcyBlbmFibGVkLAorCQlzbyBpdCBjYW4gb25seSBiZSBjb25maWd1cmVkIGJlZm9yZSB2ZGVjX2VuYWJsZV9pbnB1dCgpIGlzIGNhbGxlZC4KKwkJU28gbW92ZSB0aGlzIGNvZGUgZnJvbSB1Y29kZSB0byBoZXJlCisJKi8KKyNkZWZpbmUgRElTQUJMRV9EQkxLX0hDTUQgICAwCisjZGVmaW5lIERJU0FCTEVfTUNfSENNRCAwCisJV1JJVEVfVlJFRyhWQzFfQ09OVFJPTF9SRUcsIChESVNBQkxFX0RCTEtfSENNRDw8NikgfAorCQkoRElTQUJMRV9NQ19IQ01EPDw1KSB8ICgxIDw8IDcpIHwgKDB4YyA8PDgpIHwgKDE8PDE0KSk7CisJaWYgKHZkZWNfZnJhbWVfYmFzZWQodmRlYykpIHsKKwkJCXNpemUgPSBody0+Y2h1bmstPnNpemUgKworCQkJCShody0+Y2h1bmstPm9mZnNldCAmIChWREVDX0ZJRk9fQUxJR04gLSAxKSk7CisJCX0KKworCisJdmRlY19lbmFibGVfaW5wdXQodmRlYyk7CisJLyoqLworCisJLyp3bWIoKTsqLworCWh3LT5zdGF0IHw9IFNUQVRfTUNfTE9BRDsKKwlody0+bGFzdF92bGRfbGV2ZWwgPSAwOworCisJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfREVDT0RJTkcsCisJCSIlcyBSRUFEX1ZSRUcoQVZTX0JVRkZFUklOKT0weCV4LCByZWN5Y2xlX3EgbnVtICVkXG4iLAorCQlfX2Z1bmNfXywgUkVBRF9WUkVHKEFWU19CVUZGRVJJTiksCisJCWtmaWZvX2xlbigmaHctPnJlY3ljbGVfcSkpOworCisJV1JJVEVfVlJFRyhWSUZGX0JJVF9DTlQsIHNpemUgKiA4KTsKKwlpZiAoaHctPnJlc2V0X2RlY29kZV9mbGFnKQorCQlXUklURV9WUkVHKERFQ09ERV9TVEFUVVMsIDApOworCWVsc2UgeworCQlyZWN5Y2xlX2ZyYW1lcyhodyk7CisJCWF2c19wdHNfY2hlY2tfaW4oaHcsCisJCQlody0+ZGVjb2RlX3BpY19jb3VudCAmIDB4ZmZmZiwKKwkJCWh3LT5jaHVuayk7CisKKwkJV1JJVEVfVlJFRyhERUNPREVfU1RBVFVTLAorCQkJKGh3LT5kZWNvZGVfcGljX2NvdW50ICYgMHhmZmZmKSB8CisJCQkoKH5ody0+YnVmX3JlY3ljbGVfc3RhdHVzKSA8PCAxNikpOworCX0KKworCWh3LT5yZXNldF9kZWNvZGVfZmxhZyA9IDA7CisJLy9ody0+ZGVjb2RlX3N0YXR1c19za2lwX3BpY19kb25lX2ZsYWcgPSAwOworCXN0YXJ0X3Byb2Nlc3NfdGltZShodyk7CisjaWYgREVCVUdfTVVMVElfRkxBRyA9PSAxCisJaWYgKGh3LT5kZWNvZGVfcGljX2NvdW50ID4gMCkKKwkJV1JJVEVfVlJFRyhERUNPREVfU1RBVFVTLCAweGZmKTsKKwllbHNlCisjZW5kaWYKKwlhbXZkZWNfc3RhcnQoKTsKKwlody0+c3RhdCB8PSBTVEFUX1ZERUNfUlVOOworCisJaHctPnN0YXQgfD0gU1RBVF9USU1FUl9BUk07CisKKwltb2RfdGltZXIoJmh3LT5jaGVja190aW1lciwgamlmZmllcyArIENIRUNLX0lOVEVSVkFMKTsKK30KKworc3RhdGljIHZvaWQgcmVzZXQoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKK30KKworc3RhdGljIGlycXJldHVybl90IHZtYXZzX2lzcl90aHJlYWRfZm4oc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGlycSkKK3sKKwkJc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3ID0KKwkJCShzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJCXUzMiByZWc7CisJCXN0cnVjdCB2ZnJhbWVfcyAqdmYgPSBOVUxMOworCQl1MzIgZHVyOworCQl1MzIgcmVwZWF0X2NvdW50OworCQl1MzIgcGljdHVyZV90eXBlOworCQl1MzIgYnVmZmVyX2luZGV4OworCQl1MzIgZnJhbWVfc2l6ZTsKKwkJYm9vbCBmb3JjZV9pbnRlcmxhY2VkX2ZyYW1lID0gZmFsc2U7CisJCXVuc2lnbmVkIGludCBwdHMsIHB0c192YWxpZCA9IDAsIG9mZnNldCA9IDA7CisJCXU2NCBwdHNfdXM2NDsKKwkJdTMyIGRlYnVnX3RhZzsKKwkJdTMyIGJ1ZmZlcl9zdGF0dXNfZGVidWc7CisJCS8vc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX2F2c19od19zICopZGV2X2lkOworCisJCS8qaWYgKGRlYnVnICYgQVZTX0RFQlVHX1VDT0RFKSB7CisJCQlpZiAoUkVBRF9WUkVHKEFWX1NDUkFUQ0hfRSkgIT0gMCkgeworCQkJCXByX2luZm8oImRiZyV4OiAleFxuIiwgUkVBRF9WUkVHKEFWX1NDUkFUQ0hfRSksCisJCQkJCSAgIFJFQURfVlJFRyhBVl9TQ1JBVENIX0QpKTsKKwkJCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfRSwgMCk7CisJCQl9CisJCX0qLworCisJCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX1JVTl9GTE9XLCAiUkVBRF9WUkVHKEFWU19CVUZGRVJPVVQpIDB4JXgsIFJFQURfVlJFRyhERUNPREVfU1RBVFVTKSAweCV4IFJFQURfVlJFRyhBVl9TQ1JBVENIX04pIDB4JXgsIFJFQURfVlJFRyhERUJVR19SRUcxKSAweCV4XG4iLAorCQkJCVJFQURfVlJFRyhBVlNfQlVGRkVST1VUKSxSRUFEX1ZSRUcoREVDT0RFX1NUQVRVUyksIFJFQURfVlJFRyhBVl9TQ1JBVENIX04pLCBSRUFEX1ZSRUcoREVCVUdfUkVHMSkpOworCisJCWRlYnVnX3RhZyA9IFJFQURfVlJFRyhERUJVR19SRUcxKTsKKwkJYnVmZmVyX3N0YXR1c19kZWJ1ZyA9IGRlYnVnX3RhZyA+PiAxNjsKKwkJZGVidWdfdGFnICY9IDB4ZmZmZjsKKwkJLyogaWYgKGRlYnVnX3RhZyAmIDB4MTAwMDApIHsKKwkJCWludCBpOworCQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoCisJCQkJYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCWh3LT5sbWVtX3BoeV9hZGRyLAorCQkJCUxNRU1fQlVGX1NJWkUsCisJCQkJRE1BX0ZST01fREVWSUNFKTsKKworCQkJZGVidWdfcHJpbnQoaHcsIDAsCisJCQkJIkxNRU08dGFnICV4PjpcbiIsIGRlYnVnX3RhZyk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCAweDQwMDsgaSArPSA0KSB7CisJCQkJaW50IGlpOworCQkJCXVuc2lnbmVkIHNob3J0ICpsbWVtX3B0ciA9IGh3LT5sbWVtX2FkZHI7CisJCQkJaWYgKChpICYgMHhmKSA9PSAwKQorCQkJCQlkZWJ1Z19wcmludF9jb250KGh3LCAwLCAiJTAzeDogIiwgaSk7CisJCQkJZm9yIChpaSA9IDA7IGlpIDwgNDsgaWkrKykgeworCQkJCQlkZWJ1Z19wcmludF9jb250KGh3LCAwLCAiJTA0eCAiLAorCQkJCQkJICAgbG1lbV9wdHJbaSArIDMgLSBpaV0pOworCQkJCX0KKwkJCQlpZiAoKChpICsgaWkpICYgMHhmKSA9PSAwKQorCQkJCQlkZWJ1Z19wcmludF9jb250KGh3LCAwLCAiXG4iKTsKKwkJCX0KKworCQkJaWYgKCgodWRlYnVnX3BhdXNlX3BvcyAmIDB4ZmZmZikKKwkJCQk9PSAoZGVidWdfdGFnICYgMHhmZmZmKSkgJiYKKwkJCQkodWRlYnVnX3BhdXNlX2RlY29kZV9pZHggPT0gMCB8fAorCQkJCXVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4ID09IGh3LT5kZWNvZGVfcGljX2NvdW50KSAmJgorCQkJCSh1ZGVidWdfcGF1c2VfdmFsID09IDAgfHwKKwkJCQl1ZGVidWdfcGF1c2VfdmFsID09IFJFQURfVlJFRyhERUJVR19SRUcyKSkpIHsKKwkJCQl1ZGVidWdfcGF1c2VfcG9zICY9IDB4ZmZmZjsKKwkJCQlody0+dWNvZGVfcGF1c2VfcG9zID0gdWRlYnVnX3BhdXNlX3BvczsKKwkJCX0KKwkJCWVsc2UgaWYgKGRlYnVnX3RhZyAmIDB4MjAwMDApCisJCQkJaHctPnVjb2RlX3BhdXNlX3BvcyA9IDB4ZmZmZmZmZmY7CisJCQlpZiAoaHctPnVjb2RlX3BhdXNlX3BvcykKKwkJCQlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCQkJZWxzZQorCQkJCVdSSVRFX1ZSRUcoREVCVUdfUkVHMSwgMCk7CisJCX0gZWxzZSovIGlmIChkZWJ1Z190YWcgIT0gMCkgeworCQkJZGVidWdfcHJpbnQoaHcsIDEsCisJCQkJImRiZyV4OiAleCBidWZmZXJfc3RhdHVzIDB4JXggbC93L3IgJXggJXggJXggYml0Y250ICV4IEFWQUlMICV4XG4iLAorCQkJCWRlYnVnX3RhZywKKwkJCQlSRUFEX1ZSRUcoREVCVUdfUkVHMiksCisJCQkJYnVmZmVyX3N0YXR1c19kZWJ1ZywKKwkJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpLAorCQkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19XUCksCisJCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSwKKwkJCQlSRUFEX1ZSRUcoVklGRl9CSVRfQ05UKSwKKwkJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fQllURVNfQVZBSUwpKTsKKworCQkJaWYgKCgodWRlYnVnX3BhdXNlX3BvcyAmIDB4ZmZmZikKKwkJCQk9PSAoZGVidWdfdGFnICYgMHhmZmZmKSkgJiYKKwkJCQkodWRlYnVnX3BhdXNlX2RlY29kZV9pZHggPT0gMCB8fAorCQkJCXVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4ID09IGh3LT5kZWNvZGVfcGljX2NvdW50KSAmJgorCQkJCSh1ZGVidWdfcGF1c2VfdmFsID09IDAgfHwKKwkJCQl1ZGVidWdfcGF1c2VfdmFsID09IFJFQURfVlJFRyhERUJVR19SRUcyKSkgJiYKKwkJCQkodWRlYnVnX3BhdXNlX2luc19pZCA9PSAwIHx8CisJCQkJCURFQ09ERV9JRChodykgPT0gKHVkZWJ1Z19wYXVzZV9pbnNfaWQgLTEpKSkgeworCQkJCXVkZWJ1Z19wYXVzZV9wb3MgJj0gMHhmZmZmOworCQkJCWh3LT51Y29kZV9wYXVzZV9wb3MgPSB1ZGVidWdfcGF1c2VfcG9zOworCQkJCWlmIChkZWJ1ZyAmIERFQlVHX1BJQ19ET05FX1dIRU5fVUNPREVfUEFVU0UpIHsKKwkJCQkJaHctPmRlY29kZV9waWNfY291bnQrKzsKKwkJCQkJaWYgKChody0+ZGVjb2RlX3BpY19jb3VudCAmIDB4ZmZmZikgPT0gMCkgeworCQkJCQkJLyptYWtlIHVjb2RlIGRvIG5vdCBoYW5kbGUgaXQgYXMgZmlyc3QgcGljdHVyZSovCisJCQkJCQlody0+ZGVjb2RlX3BpY19jb3VudCsrOworCQkJCQl9CisJCQkJCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisJCQkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworCQkJCQlhbXZkZWNfc3RvcCgpOworCQkJCQl2YXZzX3NhdmVfcmVncyhodyk7CisJCQkJCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX0RFQ09ESU5HLAorCQkJCQkJIiVzIHVjb2RlIHBhdXNlLCBmb3JjZSBkb25lLCBkZWNvZGVfcGljX2NvdW50ID0gJWQsIGJpdF9jbnQ9MHgleFxuIiwKKwkJCQkJCV9fZnVuY19fLAorCQkJCQkJaHctPmRlY29kZV9waWNfY291bnQsCisJCQkJCQlSRUFEX1ZSRUcoVklGRl9CSVRfQ05UKSk7CisJCQkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQkJfQorCQkJfQorCQkJaWYgKGh3LT51Y29kZV9wYXVzZV9wb3MpCisJCQkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwkJCWVsc2UKKwkJCQlXUklURV9WUkVHKERFQlVHX1JFRzEsIDApOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9IGVsc2UgeworCQkJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfREVDT0RJTkcsCisJCQkJIiVzIGRlY29kZV9zdGF0dXMgMHgleCwgYnVmZmVyX3N0YXR1cyAweCV4XG4iLAorCQkJCV9fZnVuY19fLAorCQkJCVJFQURfVlJFRyhERUNPREVfU1RBVFVTKSwKKwkJCQlidWZmZXJfc3RhdHVzX2RlYnVnKTsKKwkJfQorCisjaWZkZWYgQVZTUF9MT05HX0NBQkFDCisJCWlmIChmaXJtd2FyZV9zZWwgPT0gMCAmJiBSRUFEX1ZSRUcoTE9OR19DQUJBQ19SRVEpKSB7CisjaWZkZWYgUEVSRk9STUFOQ0VfREVCVUcKKwkJCXByX2luZm8oIiVzOnNjaGVkdWxlIGxvbmdfY2FiYWNfd2Rfd29ya1xyXG4iLCBfX2Z1bmNfXyk7CisjZW5kaWYKKwkJCXByX2luZm8oInNjaGVkdWxlIGxvbmdfY2FiYWNfd2Rfd29yayBhbmQgcmVxdWVzdGVkIGZyb20gJWRcbiIsCisJCQkJKFJFQURfVlJFRyhMT05HX0NBQkFDX1JFUSkgPj4gOCkmMHhGRik7CisJCQlzY2hlZHVsZV93b3JrKCZsb25nX2NhYmFjX3dkX3dvcmspOworCQl9CisjZW5kaWYKKworI2lmZGVmIEVOQUJMRV9VU0VSX0RBVEEKKwkJaWYgKFVzZXJEYXRhSGFuZGxlcihodykpCisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisjZW5kaWYKKwkJcmVnID0gUkVBRF9WUkVHKEFWU19CVUZGRVJPVVQpOworCQlpZiAocmVnKSB7CisJCQl1bnNpZ25lZCBzaG9ydCBkZWNvZGVfcGljX2NvdW50CisJCQkJPSBSRUFEX1ZSRUcoREVDT0RFX1BJQ19DT1VOVCk7CisJCQlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19ERUNPRElORywgIkFWU19CVUZGRVJPVVQ9MHgleCBkZWNvZGVfcGljX2NvdW50ICVkXG4iLAorCQkJCXJlZywgZGVjb2RlX3BpY19jb3VudCk7CisJCQlpZiAocHRzX2J5X29mZnNldCkgeworCQkJCW9mZnNldCA9IFJFQURfVlJFRyhBVlNfT0ZGU0VUX1JFRyk7CisJCQkJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfREVDT0RJTkcsICJBVlMgT0ZGU0VUPSV4XG4iLCBvZmZzZXQpOworCQkJCWlmICgodmRlYy0+dmJ1Zi5ub19wYXJzZXIgPT0gMCkgfHwgKHZkZWMtPnZidWYudXNlX3B0c3NlcnYpKSB7CisJCQkJCWlmIChwdHNfbG9va3VwX29mZnNldF91czY0KFBUU19UWVBFX1ZJREVPLCBvZmZzZXQsICZwdHMsCisJCQkJCQkmZnJhbWVfc2l6ZSwgMCwgJnB0c191czY0KSA9PSAwKSB7CisJCQkJCQlwdHNfdmFsaWQgPSAxOworI2lmZGVmIERFQlVHX1BUUworCQkJCQkJaHctPnB0c19oaXQrKzsKKyNlbmRpZgorCQkJCQl9IGVsc2UgeworI2lmZGVmIERFQlVHX1BUUworCQkJCQkJaHctPnB0c19taXNzZWQrKzsKKyNlbmRpZgorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlyZXBlYXRfY291bnQgPSBSRUFEX1ZSRUcoQVZTX1JFUEVBVF9DT1VOVCk7CisjaWZkZWYgVVNFX0RZTkFNSUNfQlVGX05VTQorCQkJYnVmZmVyX2luZGV4ID0KKwkJCQkoKHJlZyAmIDB4NykgKworCQkJCSgoKHJlZyA+PiA4KSAmIDB4MykgPDwgMykgLSAxKSAmIDB4MWY7CisjZWxzZQorCQkJaWYgKGZpcm13YXJlX3NlbCA9PSAwKQorCQkJCWJ1ZmZlcl9pbmRleCA9CisJCQkJCSgocmVnICYgMHg3KSArCisJCQkJCSgoKHJlZyA+PiA4KSAmIDB4MykgPDwgMykgLSAxKSAmIDB4MWY7CisJCQllbHNlCisJCQkJYnVmZmVyX2luZGV4ID0KKwkJCQkJKChyZWcgJiAweDcpIC0gMSkgJiAzOworI2VuZGlmCisJCQlwaWN0dXJlX3R5cGUgPSAocmVnID4+IDMpICYgNzsKKyNpZmRlZiBERUJVR19QVFMKKwkJCWlmIChwaWN0dXJlX3R5cGUgPT0gSV9QSUNUVVJFKSB7CisJCQkJLyogcHJfaW5mbygiSSBvZmZzZXQgMHgleCwgcHRzX3ZhbGlkICVkXG4iLAorCQkJCSAqCSBvZmZzZXQsIHB0c192YWxpZCk7CisJCQkJICovCisJCQkJaWYgKCFwdHNfdmFsaWQpCisJCQkJCWh3LT5wdHNfaV9taXNzZWQrKzsKKwkJCQllbHNlCisJCQkJCWh3LT5wdHNfaV9oaXQrKzsKKwkJCX0KKyNlbmRpZgorCisJCQlpZiAoKGRlY19jb250cm9sICYgREVDX0NPTlRST0xfRkxBR19GT1JDRV8yNTAwXzEwODBQX0lOVEVSTEFDRSkKKwkJCQkmJiBody0+ZnJhbWVfd2lkdGggPT0gMTkyMCAmJiBody0+ZnJhbWVfaGVpZ2h0ID09IDEwODApIHsKKwkJCQlmb3JjZV9pbnRlcmxhY2VkX2ZyYW1lID0gdHJ1ZTsKKwkJCX0KKworCQkJaWYgKGh3LT50aHJvd19wYl9mbGFnICYmIHBpY3R1cmVfdHlwZSAhPSBJX1BJQ1RVUkUpIHsKKworCQkJCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX0RFQ09ESU5HLAorCQkJCQkiJXMgV1JJVEVfVlJFRyhBVlNfQlVGRkVSSU4sIDB4JXgpIGZvciB0aHJvd2luZyBwaWN0dXJlIHdpdGggdHlwZSBvZiAlZFxuIiwKKwkJCQkJX19mdW5jX18sCisJCQkJCX4oMSA8PCBidWZmZXJfaW5kZXgpLCBwaWN0dXJlX3R5cGUpOworCisJCQkJV1JJVEVfVlJFRyhBVlNfQlVGRkVSSU4sIH4oMSA8PCBidWZmZXJfaW5kZXgpKTsKKwkJCX0gZWxzZSBpZiAocmVnICYgSU5URVJMQUNFX0ZMQUcgfHwgZm9yY2VfaW50ZXJsYWNlZF9mcmFtZSkgewkvKiBpbnRlcmxhY2UgKi8KKwkJCQlody0+dGhyb3dfcGJfZmxhZyA9IDA7CisKKwkJCQlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19WRlJBTUVfREVUQUlMLAorCQkJCQkiaW50ZXJsYWNlLCBwaWN0dXJlIHR5cGUgJWRcbiIsCisJCQkJCQkgICBwaWN0dXJlX3R5cGUpOworCisJCQkJaWYgKGtmaWZvX2dldCgmaHctPm5ld2ZyYW1lX3EsICZ2ZikgPT0gMCkgeworCQkJCQlwcl9pbmZvCisJCQkJCSgiZmF0YWwgZXJyb3IsIG5vIGF2YWlsYWJsZSBidWZmZXIgc2xvdC4iKTsKKwkJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJCX0KKwkJCQlzZXRfZnJhbWVfaW5mbyhodywgdmYsICZkdXIpOworCQkJCXZmLT5idWZXaWR0aCA9IDE5MjA7CisJCQkJaHctPnBpY190eXBlID0gMjsKKwkJCQlpZiAoKHBpY3R1cmVfdHlwZSA9PSBJX1BJQ1RVUkUpICYmIHB0c192YWxpZCkgeworCQkJCQl2Zi0+cHRzID0gcHRzOworCQkJCQl2Zi0+cHRzX3VzNjQgPSBwdHNfdXM2NDsKKwkJCQkJaWYgKChyZXBlYXRfY291bnQgPiAxKSAmJiBody0+YXZpX2ZsYWcpIHsKKwkJCQkJCS8qIGh3LT5uZXh0X3B0cyA9IHB0cyArCisJCQkJCQkgKgkgKGh3LT52YXZzX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgKgorCQkJCQkJICoJIHJlcGVhdF9jb3VudCA+PiAxKSoxNS8xNjsKKwkJCQkJCSAqLworCQkJCQkJaHctPm5leHRfcHRzID0KKwkJCQkJCQlwdHMgKworCQkJCQkJCShkdXIgKiByZXBlYXRfY291bnQgPj4gMSkgKgorCQkJCQkJCTE1IC8gMTY7CisJCQkJCX0gZWxzZQorCQkJCQkJaHctPm5leHRfcHRzID0gMDsKKwkJCQl9IGVsc2UgeworCQkJCQl2Zi0+cHRzID0gaHctPm5leHRfcHRzOworCQkJCQlpZiAodmYtPnB0cyA9PSAwKSB7CisJCQkJCQl2Zi0+cHRzX3VzNjQgPSAwOworCQkJCQl9CisJCQkJCWlmICgocmVwZWF0X2NvdW50ID4gMSkgJiYgaHctPmF2aV9mbGFnKSB7CisJCQkJCQkvKiB2Zi0+ZHVyYXRpb24gPQorCQkJCQkJICoJIGh3LT52YXZzX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgKgorCQkJCQkJICoJIHJlcGVhdF9jb3VudCA+PiAxOworCQkJCQkJICovCisJCQkJCQl2Zi0+ZHVyYXRpb24gPSBkdXIgKiByZXBlYXRfY291bnQgPj4gMTsKKwkJCQkJCWlmIChody0+bmV4dF9wdHMgIT0gMCkgeworCQkJCQkJCWh3LT5uZXh0X3B0cyArPQorCQkJCQkJCQkoKHZmLT5kdXJhdGlvbikgLQorCQkJCQkJCQkgKCh2Zi0+ZHVyYXRpb24pID4+IDQpKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8qIHZmLT5kdXJhdGlvbiA9CisJCQkJCQkgKgkgaHctPnZhdnNfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSA+PiAxOworCQkJCQkJICovCisJCQkJCQl2Zi0+ZHVyYXRpb24gPSBkdXIgPj4gMTsKKwkJCQkJCWh3LT5uZXh0X3B0cyA9IDA7CisJCQkJCX0KKwkJCQl9CisJCQkJdmYtPnNpZ25hbF90eXBlID0gMDsKKwkJCQl2Zi0+aW5kZXggPSBidWZmZXJfaW5kZXg7CisJCQkJdmYtPmR1cmF0aW9uX3B1bGxkb3duID0gMDsKKwkJCQlpZiAoZm9yY2VfaW50ZXJsYWNlZF9mcmFtZSkgeworCQkJCQl2Zi0+dHlwZSA9IFZJRFRZUEVfSU5URVJMQUNFX1RPUDsKKwkJCQl9ZWxzZXsKKwkJCQkJdmYtPnR5cGUgPQorCQkJCQkocmVnICYgVE9QX0ZJRUxEX0ZJUlNUX0ZMQUcpCisJCQkJCT8gVklEVFlQRV9JTlRFUkxBQ0VfVE9QCisJCQkJCTogVklEVFlQRV9JTlRFUkxBQ0VfQk9UVE9NOworCQkJCQl9CisjaWZkZWYgTlYyMQorCQkJCXZmLT50eXBlIHw9IFZJRFRZUEVfVklVX05WMjE7CisjZW5kaWYKKwkJCQlpZiAoaHctPm1faW5zX2ZsYWcpIHsKKwkJCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0gLTE7CisJCQkJCXZmLT5wbGFuZV9udW0gPSAyOworCisJCQkJCXZmLT5jYW52YXMwX2NvbmZpZ1swXSA9IGh3LT5jYW52YXNfY29uZmlnW2J1ZmZlcl9pbmRleF1bMF07CisJCQkJCXZmLT5jYW52YXMwX2NvbmZpZ1sxXSA9IGh3LT5jYW52YXNfY29uZmlnW2J1ZmZlcl9pbmRleF1bMV07CisKKwkJCQkJdmYtPmNhbnZhczFfY29uZmlnWzBdID0gaHctPmNhbnZhc19jb25maWdbYnVmZmVyX2luZGV4XVswXTsKKwkJCQkJdmYtPmNhbnZhczFfY29uZmlnWzFdID0gaHctPmNhbnZhc19jb25maWdbYnVmZmVyX2luZGV4XVsxXTsKKwkJCQl9IGVsc2UKKwkJCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0KKwkJCQkJCWluZGV4MmNhbnZhcyhidWZmZXJfaW5kZXgpOworCQkJCXZmLT50eXBlX29yaWdpbmFsID0gdmYtPnR5cGU7CisKKwkJCQlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19WRlJBTUVfREVUQUlMLAorCQkJCQkiYnVmZmVyX2luZGV4ICVkLCBjYW52YXMgYWRkciAleFxuIiwKKwkJCQkJCSAgIGJ1ZmZlcl9pbmRleCwgdmYtPmNhbnZhczBBZGRyKTsKKwkJCQl2Zi0+cHRzID0gKHB0c192YWxpZCk/cHRzOjA7CisJCQkJLy92Zi0+cHRzX3VzNjQgPSAocHRzX3ZhbGlkKSA/IHB0c191czY0IDogMDsKKwkJCQlody0+dmZidWZfdXNlW2J1ZmZlcl9pbmRleF0rKzsKKwkJCQl2Zi0+bWVtX2hhbmRsZSA9CisJCQkJCWRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJCQlody0+bW1fYmxrX2hhbmRsZSwKKwkJCQkJCWJ1ZmZlcl9pbmRleCk7CisKKwkJCQlpZiAoaHctPm1faW5zX2ZsYWcgJiYgdmRlY19mcmFtZV9iYXNlZChod190b192ZGVjKGh3KSkpCisJCQkJCXNldF92ZnJhbWVfcHRzKGh3LCBkZWNvZGVfcGljX2NvdW50LCB2Zik7CisKKwkJCQlpZiAodmRlY19zdHJlYW1fYmFzZWQodmRlYykgJiYgKCF2ZGVjLT52YnVmLnVzZV9wdHNzZXJ2KSkgeworCQkJCQl2Zi0+cHRzX3VzNjQgPQorCQkJCQkJKCgodTY0KXZmLT5kdXJhdGlvbiA8PCAzMikgJiAweGZmZmZmZmZmMDAwMDAwMDApIHwgb2Zmc2V0OworCQkJCQl2Zi0+cHRzID0gMDsKKwkJCQl9CisKKwkJCQlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19QVFMsCisJCQkJCSJpbnRlcmxhY2UxIHZmLT5wdHMgPSAlZCwgdmYtPnB0c191czY0ID0gJWxsZCwgcHRzX3ZhbGlkID0gJWRcbiIsIHZmLT5wdHMsIHZmLT5wdHNfdXM2NCwgcHRzX3ZhbGlkKTsKKwkJCQl2ZGVjX3ZmcmFtZV9yZWFkeSh2ZGVjLCB2Zik7CisJCQkJa2ZpZm9fcHV0KCZody0+ZGlzcGxheV9xLCAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQkJCUFUUkFDRV9DT1VOVEVSKGh3LT5wdHNfbmFtZSwgdmYtPnB0cyk7CisJCQkJYXZzX3ZmX25vdGlmeV9yZWNlaXZlcihodywgUFJPVklERVJfTkFNRSwKKwkJCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9WRlJBTUVfUkVBRFksCisJCQkJCQlOVUxMKTsKKworCQkJCWlmIChrZmlmb19nZXQoJmh3LT5uZXdmcmFtZV9xLCAmdmYpID09IDApIHsKKwkJCQkJcHJfaW5mbygiZmF0YWwgZXJyb3IsIG5vIGF2YWlsYWJsZSBidWZmZXIgc2xvdC4iKTsKKwkJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJCQkJCX0KKwkJCQlzZXRfZnJhbWVfaW5mbyhodywgdmYsICZkdXIpOworCQkJCXZmLT5idWZXaWR0aCA9IDE5MjA7CisJCQkJaWYgKGZvcmNlX2ludGVybGFjZWRfZnJhbWUpCisJCQkJCXZmLT5wdHMgPSAwOworCQkJCWVsc2UKKwkJCQl2Zi0+cHRzID0gaHctPm5leHRfcHRzOworCisJCQkJaWYgKHZmLT5wdHMgPT0gMCkgeworCQkJCQl2Zi0+cHRzX3VzNjQgPSAwOworCQkJCX0KKworCQkJCWlmICgocmVwZWF0X2NvdW50ID4gMSkgJiYgaHctPmF2aV9mbGFnKSB7CisJCQkJCS8qIHZmLT5kdXJhdGlvbiA9IGh3LT52YXZzX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgKgorCQkJCQkgKgkgcmVwZWF0X2NvdW50ID4+IDE7CisJCQkJCSAqLworCQkJCQl2Zi0+ZHVyYXRpb24gPSBkdXIgKiByZXBlYXRfY291bnQgPj4gMTsKKwkJCQkJaWYgKGh3LT5uZXh0X3B0cyAhPSAwKSB7CisJCQkJCQlody0+bmV4dF9wdHMgKz0KKwkJCQkJCQkoKHZmLT5kdXJhdGlvbikgLQorCQkJCQkJCSAoKHZmLT5kdXJhdGlvbikgPj4gNCkpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogdmYtPmR1cmF0aW9uID0gaHctPnZhdnNfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZQorCQkJCQkgKgkgPj4gMTsKKwkJCQkJICovCisJCQkJCXZmLT5kdXJhdGlvbiA9IGR1ciA+PiAxOworCQkJCQlody0+bmV4dF9wdHMgPSAwOworCQkJCX0KKwkJCQl2Zi0+c2lnbmFsX3R5cGUgPSAwOworCQkJCXZmLT5pbmRleCA9IGJ1ZmZlcl9pbmRleDsKKwkJCQl2Zi0+ZHVyYXRpb25fcHVsbGRvd24gPSAwOworCQkJCWlmIChmb3JjZV9pbnRlcmxhY2VkX2ZyYW1lKSB7CisJCQkJCXZmLT50eXBlID0gVklEVFlQRV9JTlRFUkxBQ0VfQk9UVE9NOworCQkJCX0gZWxzZSB7CisJCQkJCQkJdmYtPnR5cGUgPQorCQkJCQkJCShyZWcgJiBUT1BfRklFTERfRklSU1RfRkxBRykgPworCQkJCQkJCVZJRFRZUEVfSU5URVJMQUNFX0JPVFRPTSA6CisJCQkJCQkJVklEVFlQRV9JTlRFUkxBQ0VfVE9QOworCQkJCQkJfQorI2lmZGVmIE5WMjEKKwkJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX1ZJVV9OVjIxOworI2VuZGlmCisJCQkJaWYgKGh3LT5tX2luc19mbGFnKSB7CisJCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IC0xOworCQkJCQl2Zi0+cGxhbmVfbnVtID0gMjsKKworCQkJCQl2Zi0+Y2FudmFzMF9jb25maWdbMF0gPSBody0+Y2FudmFzX2NvbmZpZ1tidWZmZXJfaW5kZXhdWzBdOworCQkJCQl2Zi0+Y2FudmFzMF9jb25maWdbMV0gPSBody0+Y2FudmFzX2NvbmZpZ1tidWZmZXJfaW5kZXhdWzFdOworCisJCQkJCXZmLT5jYW52YXMxX2NvbmZpZ1swXSA9IGh3LT5jYW52YXNfY29uZmlnW2J1ZmZlcl9pbmRleF1bMF07CisJCQkJCXZmLT5jYW52YXMxX2NvbmZpZ1sxXSA9IGh3LT5jYW52YXNfY29uZmlnW2J1ZmZlcl9pbmRleF1bMV07CisJCQkJfSBlbHNlCisJCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9CisJCQkJCQlpbmRleDJjYW52YXMoYnVmZmVyX2luZGV4KTsKKwkJCQl2Zi0+dHlwZV9vcmlnaW5hbCA9IHZmLT50eXBlOworCQkJCXZmLT5wdHNfdXM2NCA9IDA7CisJCQkJaHctPnZmYnVmX3VzZVtidWZmZXJfaW5kZXhdKys7CisJCQkJdmYtPm1lbV9oYW5kbGUgPQorCQkJCQlkZWNvZGVyX2JtbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCQkJaHctPm1tX2Jsa19oYW5kbGUsCisJCQkJCQlidWZmZXJfaW5kZXgpOworCisJCQkJaWYgKGh3LT5tX2luc19mbGFnICYmIHZkZWNfZnJhbWVfYmFzZWQoaHdfdG9fdmRlYyhodykpKQorCQkJCQlzZXRfdmZyYW1lX3B0cyhodywgZGVjb2RlX3BpY19jb3VudCwgdmYpOworCisJCQkJaWYgKHZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpICYmICghdmRlYy0+dmJ1Zi51c2VfcHRzc2VydikpIHsKKwkJCQkJdmYtPnB0c191czY0ID0gKHU2NCktMTsKKwkJCQkJdmYtPnB0cyA9IDA7CisJCQkJfQorCQkJCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX1BUUywKKwkJCQkJImludGVybGFjZTIgdmYtPnB0cyA9ICVkLCB2Zi0+cHRzX3VzNjQgPSAlbGxkLCBwdHNfdmFsaWQgPSAlZFxuIiwgdmYtPnB0cywgdmYtPnB0c191czY0LCBwdHNfdmFsaWQpOworCQkJCXZkZWNfdmZyYW1lX3JlYWR5KHZkZWMsIHZmKTsKKwkJCQlrZmlmb19wdXQoJmh3LT5kaXNwbGF5X3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCQkJQVRSQUNFX0NPVU5URVIoaHctPnB0c19uYW1lLCB2Zi0+cHRzKTsKKwkJCQlhdnNfdmZfbm90aWZ5X3JlY2VpdmVyKGh3LCBQUk9WSURFUl9OQU1FLAorCQkJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1ZGUkFNRV9SRUFEWSwKKwkJCQkJCU5VTEwpOworCQkJCWh3LT50b3RhbF9mcmFtZSsrOworCQkJfSBlbHNlIHsJLyogcHJvZ3Jlc3NpdmUgKi8KKwkJCQlody0+dGhyb3dfcGJfZmxhZyA9IDA7CisKKwkJCQlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19WRlJBTUVfREVUQUlMLAorCQkJCQkicHJvZ3Jlc3NpdmUgcGljdHVyZSB0eXBlICVkXG4iLAorCQkJCQkJICAgcGljdHVyZV90eXBlKTsKKwkJCQlpZiAoa2ZpZm9fZ2V0KCZody0+bmV3ZnJhbWVfcSwgJnZmKSA9PSAwKSB7CisJCQkJCXByX2luZm8KKwkJCQkJKCJmYXRhbCBlcnJvciwgbm8gYXZhaWxhYmxlIGJ1ZmZlciBzbG90LiIpOworCQkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQkJfQorCQkJCXNldF9mcmFtZV9pbmZvKGh3LCB2ZiwgJmR1cik7CisJCQkJdmYtPmJ1ZldpZHRoID0gMTkyMDsKKwkJCQlody0+cGljX3R5cGUgPSAxOworCisJCQkJaWYgKChwaWN0dXJlX3R5cGUgPT0gSV9QSUNUVVJFKSAmJiBwdHNfdmFsaWQpIHsKKwkJCQkJdmYtPnB0cyA9IHB0czsKKwkJCQkJaWYgKChyZXBlYXRfY291bnQgPiAxKSAmJiBody0+YXZpX2ZsYWcpIHsKKwkJCQkJCS8qIGh3LT5uZXh0X3B0cyA9IHB0cyArCisJCQkJCQkgKgkgKGh3LT52YXZzX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgKgorCQkJCQkJICoJIHJlcGVhdF9jb3VudCkqMTUvMTY7CisJCQkJCQkgKi8KKwkJCQkJCWh3LT5uZXh0X3B0cyA9CisJCQkJCQkJcHRzICsKKwkJCQkJCQkoZHVyICogcmVwZWF0X2NvdW50KSAqIDE1IC8gMTY7CisJCQkJCX0gZWxzZQorCQkJCQkJaHctPm5leHRfcHRzID0gMDsKKwkJCQl9IGVsc2UgeworCQkJCQl2Zi0+cHRzID0gaHctPm5leHRfcHRzOworCQkJCQlpZiAodmYtPnB0cyA9PSAwKSB7CisJCQkJCQl2Zi0+cHRzX3VzNjQgPSAwOworCQkJCQl9CisJCQkJCWlmICgocmVwZWF0X2NvdW50ID4gMSkgJiYgaHctPmF2aV9mbGFnKSB7CisJCQkJCQkvKiB2Zi0+ZHVyYXRpb24gPQorCQkJCQkJICoJIGh3LT52YXZzX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgKgorCQkJCQkJICoJIHJlcGVhdF9jb3VudDsKKwkJCQkJCSAqLworCQkJCQkJdmYtPmR1cmF0aW9uID0gZHVyICogcmVwZWF0X2NvdW50OworCQkJCQkJaWYgKGh3LT5uZXh0X3B0cyAhPSAwKSB7CisJCQkJCQkJaHctPm5leHRfcHRzICs9CisJCQkJCQkJCSgodmYtPmR1cmF0aW9uKSAtCisJCQkJCQkJCSAoKHZmLT5kdXJhdGlvbikgPj4gNCkpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJLyogdmYtPmR1cmF0aW9uID0KKwkJCQkJCSAqCSBody0+dmF2c19hbXN0cmVhbV9kZWNfaW5mby5yYXRlOworCQkJCQkJICovCisJCQkJCQl2Zi0+ZHVyYXRpb24gPSBkdXI7CisJCQkJCQlody0+bmV4dF9wdHMgPSAwOworCQkJCQl9CisJCQkJfQorCQkJCXZmLT5zaWduYWxfdHlwZSA9IDA7CisJCQkJdmYtPmluZGV4ID0gYnVmZmVyX2luZGV4OworCQkJCXZmLT5kdXJhdGlvbl9wdWxsZG93biA9IDA7CisJCQkJdmYtPnR5cGUgPSBWSURUWVBFX1BST0dSRVNTSVZFIHwgVklEVFlQRV9WSVVfRklFTEQ7CisjaWZkZWYgTlYyMQorCQkJCXZmLT50eXBlIHw9IFZJRFRZUEVfVklVX05WMjE7CisjZW5kaWYKKwkJCQlpZiAoaHctPm1faW5zX2ZsYWcpIHsKKwkJCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0gLTE7CisJCQkJCXZmLT5wbGFuZV9udW0gPSAyOworCisJCQkJCXZmLT5jYW52YXMwX2NvbmZpZ1swXSA9IGh3LT5jYW52YXNfY29uZmlnW2J1ZmZlcl9pbmRleF1bMF07CisJCQkJCXZmLT5jYW52YXMwX2NvbmZpZ1sxXSA9IGh3LT5jYW52YXNfY29uZmlnW2J1ZmZlcl9pbmRleF1bMV07CisKKwkJCQkJdmYtPmNhbnZhczFfY29uZmlnWzBdID0gaHctPmNhbnZhc19jb25maWdbYnVmZmVyX2luZGV4XVswXTsKKwkJCQkJdmYtPmNhbnZhczFfY29uZmlnWzFdID0gaHctPmNhbnZhc19jb25maWdbYnVmZmVyX2luZGV4XVsxXTsKKwkJCQl9IGVsc2UKKwkJCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0KKwkJCQkJCWluZGV4MmNhbnZhcyhidWZmZXJfaW5kZXgpOworCQkJCXZmLT50eXBlX29yaWdpbmFsID0gdmYtPnR5cGU7CisKKwkJCQl2Zi0+cHRzID0gKHB0c192YWxpZCk/cHRzOjA7CisJCQkJLy92Zi0+cHRzX3VzNjQgPSAocHRzX3ZhbGlkKSA/IHB0c191czY0IDogMDsKKwkJCQlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19WRlJBTUVfREVUQUlMLAorCQkJCQkiYnVmZmVyX2luZGV4ICVkLCBjYW52YXMgYWRkciAleFxuIiwKKwkJCQkJCSAgIGJ1ZmZlcl9pbmRleCwgdmYtPmNhbnZhczBBZGRyKTsKKwkJCQlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19QVFMsCisJCQkJCSJwcm9ncmVzc2l2ZSB2Zi0+cHRzID0gJWQsIHZmLT5wdHNfdXM2NCA9ICVsbGQsIHB0c192YWxpZCA9ICVkXG4iLCB2Zi0+cHRzLCB2Zi0+cHRzX3VzNjQsIHB0c192YWxpZCk7CisJCQkJaHctPnZmYnVmX3VzZVtidWZmZXJfaW5kZXhdKys7CisJCQkJdmYtPm1lbV9oYW5kbGUgPQorCQkJCQlkZWNvZGVyX2JtbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCQkJaHctPm1tX2Jsa19oYW5kbGUsCisJCQkJCQlidWZmZXJfaW5kZXgpOworCisJCQkJaWYgKGh3LT5tX2luc19mbGFnICYmIHZkZWNfZnJhbWVfYmFzZWQoaHdfdG9fdmRlYyhodykpKQorCQkJCQlzZXRfdmZyYW1lX3B0cyhodywgZGVjb2RlX3BpY19jb3VudCwgdmYpOworCisJCQkJaWYgKHZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpICYmICghdmRlYy0+dmJ1Zi51c2VfcHRzc2VydikpIHsKKwkJCQkJdmYtPnB0c191czY0ID0KKwkJCQkJCSgoKHU2NCl2Zi0+ZHVyYXRpb24gPDwgMzIpICYgMHhmZmZmZmZmZjAwMDAwMDAwKSB8IG9mZnNldDsKKwkJCQkJdmYtPnB0cyA9IDA7CisJCQkJfQorCQkJCWRlY29kZXJfZG9fZnJhbWVfY2hlY2soaHdfdG9fdmRlYyhodyksIHZmKTsKKwkJCQl2ZGVjX3ZmcmFtZV9yZWFkeSh2ZGVjLCB2Zik7CisJCQkJa2ZpZm9fcHV0KCZody0+ZGlzcGxheV9xLCAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQkJCUFUUkFDRV9DT1VOVEVSKGh3LT5wdHNfbmFtZSwgdmYtPnB0cyk7CisJCQkJQVRSQUNFX0NPVU5URVIoaHctPm5ld19xX25hbWUsIGtmaWZvX2xlbigmaHctPm5ld2ZyYW1lX3EpKTsKKwkJCQlBVFJBQ0VfQ09VTlRFUihody0+ZGlzcF9xX25hbWUsIGtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSkpOworCQkJCWF2c192Zl9ub3RpZnlfcmVjZWl2ZXIoaHcsIFBST1ZJREVSX05BTUUsCisJCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfVkZSQU1FX1JFQURZLAorCQkJCQkJTlVMTCk7CisJCQkJaHctPnRvdGFsX2ZyYW1lKys7CisJCQl9CisKKwkJCS8qY291bnQgaW5mbyovCisJCQl2ZGVjX2NvdW50X2luZm8oaHctPmd2cywgMCwgb2Zmc2V0KTsKKwkJCWlmIChvZmZzZXQpIHsKKwkJCQlpZiAocGljdHVyZV90eXBlID09IElfUElDVFVSRSkgeworCQkJCQlody0+Z3ZzLT5pX2RlY29kZWRfZnJhbWVzKys7CisJCQkJfSBlbHNlIGlmIChwaWN0dXJlX3R5cGUgPT0gUF9QSUNUVVJFKSB7CisJCQkJCWh3LT5ndnMtPnBfZGVjb2RlZF9mcmFtZXMrKzsKKwkJCQl9IGVsc2UgaWYgKHBpY3R1cmVfdHlwZSA9PSBCX1BJQ1RVUkUpIHsKKwkJCQkJaHctPmd2cy0+Yl9kZWNvZGVkX2ZyYW1lcysrOworCQkJCX0KKwkJCX0KKwkJCWF2c191cGRhdGVfZ3ZzKGh3KTsKKwkJCXZkZWNfZmlsbF92ZGVjX2ZyYW1lKGh3X3RvX3ZkZWMoaHcpLCBOVUxMLCBody0+Z3ZzLCB2ZiwgMCk7CisKKwkJCS8qIHByX2luZm8oIlBpY1R5cGUgPSAlZCwgUFRTID0gMHgleFxuIiwKKwkJCSAqCSBwaWN0dXJlX3R5cGUsIHZmLT5wdHMpOworCQkJICovCisJCQlXUklURV9WUkVHKEFWU19CVUZGRVJPVVQsIDApOworCQl9CisJCS8vV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfQ0xSX1JFRywgMSk7CisKKworCQlpZiAoaHctPm1faW5zX2ZsYWcpIHsKKwkJCXUzMiBzdGF0dXNfcmVnID0gUkVBRF9WUkVHKERFQ09ERV9TVEFUVVMpOworCQkJdTMyIGRlY29kZV9zdGF0dXMgPSBzdGF0dXNfcmVnICYgMHhmZjsKKwkJCWlmIChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0RPTkUgfHwKKwkJCQlody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0FHQUlOKSB7CisJCQkJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfREVDT0RJTkcsCisJCQkJCSIlcyAhISEgUkVBRF9WUkVHKERFQ09ERV9TVEFUVVMpID0gMHgleCwgZGVjb2RlX3N0YXR1cyAweCV4LCBidWZfc3RhdHVzIDB4JXgsIGRlY19yZXN1bHQgPSAweCV4LCBkZWNvZGVfcGljX2NvdW50ID0gJWQgYml0X2NudD0weCV4XG4iLAorCQkJCQlfX2Z1bmNfXywgc3RhdHVzX3JlZywgZGVjb2RlX3N0YXR1cywKKwkJCQkJaHctPmJ1Zl9zdGF0dXMsCisJCQkJCWh3LT5kZWNfcmVzdWx0LCBody0+ZGVjb2RlX3BpY19jb3VudCwKKwkJCQkJUkVBRF9WUkVHKFZJRkZfQklUX0NOVCkpOworCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCX0gZWxzZSBpZiAoZGVjb2RlX3N0YXR1cyA9PSBERUNPREVfU1RBVFVTX1BJQ19ET05FIHx8CisJCQkJZGVjb2RlX3N0YXR1cyA9PSBERUNPREVfU1RBVFVTX1NLSVBfUElDX0RPTkUpIHsKKwkJCQlody0+YnVmX3N0YXR1cyA9IChzdGF0dXNfcmVnID4+IDE2KSAmIDB4ZmZmZjsKKwkJCQlpZiAoZGVjb2RlX3N0YXR1cyA9PSBERUNPREVfU1RBVFVTX1NLSVBfUElDX0RPTkUpIHsKKwkJCQkJaHctPmRlY29kZV9zdGF0dXNfc2tpcF9waWNfZG9uZV9mbGFnID0gMTsKKwkJCQkJaHctPmRlY29kZV9kZWNvZGVfY29udF9zdGFydF9jb2RlID0gKHN0YXR1c19yZWcgPj4gOCkgJiAweGZmOworCQkJCX0gZWxzZQorCQkJCQlody0+ZGVjb2RlX3N0YXR1c19za2lwX3BpY19kb25lX2ZsYWcgPSAwOworCQkJCWh3LT5kZWNvZGVfcGljX2NvdW50Kys7CisJCQkJaWYgKChody0+ZGVjb2RlX3BpY19jb3VudCAmIDB4ZmZmZikgPT0gMCkgeworCQkJCQkvKm1ha2UgdWNvZGUgZG8gbm90IGhhbmRsZSBpdCBhcyBmaXJzdCBwaWN0dXJlKi8KKwkJCQkJaHctPmRlY29kZV9waWNfY291bnQrKzsKKwkJCQl9CisJCQkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwkJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKyNpZiBERUJVR19NVUxUSV9GTEFHID09IDEKKwkJCQlXUklURV9WUkVHKERFQ09ERV9TVEFUVVMsIDApOworI2Vsc2UKKwkJCQlhbXZkZWNfc3RvcCgpOworI2VuZGlmCisJCQkJdmF2c19zYXZlX3JlZ3MoaHcpOworCQkJCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX0RFQ09ESU5HLAorCQkJCQkiJXMgJXMsIFJFQURfVlJFRyhERUNPREVfU1RBVFVTKSA9IDB4JXgsIGRlY29kZV9zdGF0dXMgMHgleCwgYnVmX3N0YXR1cyAweCV4LCBkZWNfcmVzdWx0ID0gMHgleCwgZGVjb2RlX3BpY19jb3VudCA9ICVkLCBiaXRfY250PTB4JXhcbiIsCisJCQkJCV9fZnVuY19fLAorCQkJCQkoZGVjb2RlX3N0YXR1cyA9PSBERUNPREVfU1RBVFVTX1BJQ19ET05FKSA/CisJCQkJCSJERUNPREVfU1RBVFVTX1BJQ19ET05FIiA6ICJERUNPREVfU1RBVFVTX1NLSVBfUElDX0RPTkUiLAorCQkJCQlzdGF0dXNfcmVnLCBkZWNvZGVfc3RhdHVzLAorCQkJCQlody0+YnVmX3N0YXR1cywKKwkJCQkJaHctPmRlY19yZXN1bHQsIGh3LT5kZWNvZGVfcGljX2NvdW50LAorCQkJCQlSRUFEX1ZSRUcoVklGRl9CSVRfQ05UKSk7CisJCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJfSBlbHNlIGlmIChkZWNvZGVfc3RhdHVzID09IERFQ09ERV9TVEFUVVNfREVDT0RFX0JVRl9FTVBUWSB8fAorCQkJCWRlY29kZV9zdGF0dXMgPT0gREVDT0RFX1NUQVRVU19TRUFSQ0hfQlVGX0VNUFRZKSB7CisJCQkJaHctPmJ1Zl9zdGF0dXMgPSAoc3RhdHVzX3JlZyA+PiAxNikgJiAweGZmZmY7CisJCQkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKyNpZiBERUJVR19NVUxUSV9GTEFHID09IDEKKwkJCQlXUklURV9WUkVHKERFQ09ERV9TVEFUVVMsIDApOworI2Vsc2UKKwkJCQlhbXZkZWNfc3RvcCgpOworI2VuZGlmCisJCQkJaWYgKHZkZWNfZnJhbWVfYmFzZWQoaHdfdG9fdmRlYyhodykpKSB7CisJCQkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworCQkJCQkvL2lmIChody0+ZGVjb2RlX3BpY19jb3VudCA9PSAwKSB7CisJCQkJCQlody0+ZGVjb2RlX3BpY19jb3VudCsrOworCQkJCQkvL30KKwkJCQkJaWYgKChody0+ZGVjb2RlX3BpY19jb3VudCAmIDB4ZmZmZikgPT0gMCkgeworCQkJCQkvKm1ha2UgdWNvZGUgZG8gbm90IGhhbmRsZSBpdCBhcyBmaXJzdCBwaWN0dXJlKi8KKwkJCQkJCWh3LT5kZWNvZGVfcGljX2NvdW50Kys7CisJCQkJCX0KKwkJCQkJdmF2c19zYXZlX3JlZ3MoaHcpOworCQkJCX0gZWxzZQorCQkJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfQUdBSU47CisKKwkJCQlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19ERUNPRElORywKKwkJCQkJIiVzIEJVRl9FTVBUWSwgUkVBRF9WUkVHKERFQ09ERV9TVEFUVVMpID0gMHgleCwgZGVjb2RlX3N0YXR1cyAweCV4LCBidWZfc3RhdHVzIDB4JXgsIHNjcmF0Y2hfOCAoQVZTX0JVRkZFUklOKSAweCV4LCBkZWNfcmVzdWx0ID0gMHgleCwgZGVjb2RlX3BpY19jb3VudCA9ICVkLCBiaXRfY250PTB4JXgsIGh3LT5kZWNvZGVfc3RhdHVzX3NraXBfcGljX2RvbmVfZmxhZyA9ICVkLCBody0+ZGVjb2RlX2RlY29kZV9jb250X3N0YXJ0X2NvZGUgPSAweCV4XG4iLAorCQkJCQlfX2Z1bmNfXywgc3RhdHVzX3JlZywgZGVjb2RlX3N0YXR1cywKKwkJCQkJaHctPmJ1Zl9zdGF0dXMsCisJCQkJCWh3LT5yZWdfc2NyYXRjaF84LAorCQkJCQlody0+ZGVjX3Jlc3VsdCwgaHctPmRlY29kZV9waWNfY291bnQsCisJCQkJCVJFQURfVlJFRyhWSUZGX0JJVF9DTlQpLCBody0+ZGVjb2RlX3N0YXR1c19za2lwX3BpY19kb25lX2ZsYWcsIGh3LT5kZWNvZGVfZGVjb2RlX2NvbnRfc3RhcnRfY29kZSk7CisJCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJfQorCQl9CisKKworI2lmZGVmIEhBTkRMRV9BVlNfSVJRCisJCXJldHVybiBJUlFfSEFORExFRDsKKyNlbHNlCisJCXJldHVybjsKKyNlbmRpZgorfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgdm1hdnNfaXNyKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBpcnEpCit7CisKKwlXUklURV9WUkVHKEFTU0lTVF9NQk9YMV9DTFJfUkVHLCAxKTsKKworCXJldHVybiBJUlFfV0FLRV9USFJFQUQ7CisJLy9yZXR1cm4gdmF2c19pc3IoMCwgaHcpOworCit9CisKK3N0YXRpYyB2b2lkIHZtYXZzX2R1bXBfc3RhdGUoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcgPQorCShzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJaW50IGk7CisJZGVidWdfcHJpbnQoaHcsIDAsCisJCSI9PT09PT0gJXNcbiIsIF9fZnVuY19fKTsKKworCWRlYnVnX3ByaW50KGh3LCAwLAorCQkid2lkdGgvaGVpZ2h0ICglZC8lZCksIGR1ciAlZFxuIiwKKwkJaHctPmZyYW1lX3dpZHRoLAorCQlody0+ZnJhbWVfaGVpZ2h0LAorCQlody0+ZnJhbWVfZHVyCisJCSk7CisKKwlkZWJ1Z19wcmludChodywgMCwKKwkJImlzX2ZyYW1lYmFzZSglZCksIGRlY29kZV9zdGF0dXMgMHgleCwgYnVmX3N0YXR1cyAweCV4LCBidWZfcmVjeWNsZV9zdGF0dXMgMHgleCwgdGhyb3cgJWQsIGVvcyAlZCwgc3RhdGUgMHgleCwgZGVjX3Jlc3VsdCAweCV4IGRlY19mcm0gJWQgZGlzcF9mcm0gJWQgcnVuICVkIG5vdF9ydW5fcmVhZHkgJWQgaW5wdXRfZW1wdHkgJWRcbiIsCisJCXZkZWNfZnJhbWVfYmFzZWQodmRlYyksCisJCVJFQURfVlJFRyhERUNPREVfU1RBVFVTKSAmIDB4ZmYsCisJCWh3LT5idWZfc3RhdHVzLAorCQlody0+YnVmX3JlY3ljbGVfc3RhdHVzLAorCQlody0+dGhyb3dfcGJfZmxhZywKKwkJaHctPmVvcywKKwkJaHctPnN0YXQsCisJCWh3LT5kZWNfcmVzdWx0LAorCQlody0+ZGVjb2RlX3BpY19jb3VudCwKKwkJaHctPmRpc3BsYXlfZnJhbWVfY291bnQsCisJCWh3LT5ydW5fY291bnQsCisJCWh3LT5ub3RfcnVuX3JlYWR5LAorCQlody0+aW5wdXRfZW1wdHkKKwkJKTsKKworCWlmICh2Zl9nZXRfcmVjZWl2ZXIodmRlYy0+dmZfcHJvdmlkZXJfbmFtZSkpIHsKKwkJZW51bSByZWNldml2ZXJfc3RhcnRfZSBzdGF0ZSA9CisJCXZmX25vdGlmeV9yZWNlaXZlcih2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1FVUkVZX1NUQVRFLAorCQkJTlVMTCk7CisJCWRlYnVnX3ByaW50KGh3LCAwLAorCQkJIlxucmVjZWl2ZXIoJXMpIHN0YXRlICVkXG4iLAorCQkJdmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCXN0YXRlKTsKKwl9CisKKwlkZWJ1Z19wcmludChodywgMCwKKwkiJXMsIG5ld3EoJWQvJWQpLCBkaXNwcSglZC8lZClyZWN5Y2xlcSglZC8lZCkgZHJvcCAlZCB2ZiBwZWVrICVkLCBwcmVwYXJlL2dldC9wdXQgKCVkLyVkLyVkKVxuIiwKKwlfX2Z1bmNfXywKKwlrZmlmb19sZW4oJmh3LT5uZXdmcmFtZV9xKSwKKwlWRl9QT09MX1NJWkUsCisJa2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKSwKKwlWRl9QT09MX1NJWkUsCisJa2ZpZm9fbGVuKCZody0+cmVjeWNsZV9xKSwKKwlWRl9QT09MX1NJWkUsCisJaHctPmRyb3BfZnJhbWVfY291bnQsCisJaHctPnBlZWtfbnVtLAorCWh3LT5wcmVwYXJlX251bSwKKwlody0+Z2V0X251bSwKKwlody0+cHV0X251bQorCSk7CisKKwlkZWJ1Z19wcmludChodywgMCwgInZmYnVmX3VzZTpcbiIpOworCWZvciAoaSA9IDA7IGkgPCBody0+dmZfYnVmX251bV91c2VkOyBpKyspCisJCWRlYnVnX3ByaW50KGh3LCAwLCAiJWQ6IHZmX2J1Zl91c2UgJWRcbiIsCisJCQlpLCBody0+dmZidWZfdXNlW2ldKTsKKworCWRlYnVnX3ByaW50KGh3LCAwLAorCQkiREVDT0RFX1NUQVRVUz0weCV4XG4iLAorCQlSRUFEX1ZSRUcoREVDT0RFX1NUQVRVUykpOworCWRlYnVnX3ByaW50KGh3LCAwLAorCQkiTVBDX0U9MHgleFxuIiwKKwkJUkVBRF9WUkVHKE1QQ19FKSk7CisJZGVidWdfcHJpbnQoaHcsIDAsCisJCSJERUNPREVfTU9ERT0weCV4XG4iLAorCQlSRUFEX1ZSRUcoREVDT0RFX01PREUpKTsKKwlkZWJ1Z19wcmludChodywgMCwKKwkJIndhaXRfYnVmX3N0YXR1cywgQVZfU0NSQVRDSF81PTB4JXhcbiIsCisJCVJFQURfVlJFRyhBVl9TQ1JBVENIXzUpKTsKKwlkZWJ1Z19wcmludChodywgMCwKKwkJIk1CWV9NQlg9MHgleFxuIiwKKwkJUkVBRF9WUkVHKE1CWV9NQlgpKTsKKwlkZWJ1Z19wcmludChodywgMCwKKwkJIlZJRkZfQklUX0NOVD0weCV4XG4iLAorCQlSRUFEX1ZSRUcoVklGRl9CSVRfQ05UKSk7CisJZGVidWdfcHJpbnQoaHcsIDAsCisJCSJWTERfTUVNX1ZJRklGT19MRVZFTD0weCV4XG4iLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpKTsKKwlkZWJ1Z19wcmludChodywgMCwKKwkJIlZMRF9NRU1fVklGSUZPX1dQPTB4JXhcbiIsCisJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19XUCkpOworCWRlYnVnX3ByaW50KGh3LCAwLAorCQkiVkxEX01FTV9WSUZJRk9fUlA9MHgleFxuIiwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSk7CisJZGVidWdfcHJpbnQoaHcsIDAsCisJCSJQQVJTRVJfVklERU9fUlA9MHgleFxuIiwKKwkJU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3JwKSk7CisJZGVidWdfcHJpbnQoaHcsIDAsCisJCSJQQVJTRVJfVklERU9fV1A9MHgleFxuIiwKKwkJU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3dwKSk7CisKKwlpZiAodmRlY19mcmFtZV9iYXNlZCh2ZGVjKSAmJgorCQkoZGVidWcgJglQUklOVF9GUkFNRUJBU0VfREFUQSkKKwkJKSB7CisJCWludCBqajsKKwkJaWYgKGh3LT5jaHVuayAmJiBody0+Y2h1bmstPmJsb2NrICYmCisJCQlody0+Y2h1bmstPnNpemUgPiAwKSB7CisJCQl1OCAqZGF0YSA9IE5VTEw7CisKKwkJCWlmICghaHctPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQkJCWRhdGEgPSBjb2RlY19tbV92bWFwKGh3LT5jaHVuay0+YmxvY2stPnN0YXJ0ICsKKwkJCQkJaHctPmNodW5rLT5vZmZzZXQsIGh3LT5jaHVuay0+c2l6ZSk7CisJCQllbHNlCisJCQkJZGF0YSA9ICgodTggKilody0+Y2h1bmstPmJsb2NrLT5zdGFydF92aXJ0KQorCQkJCQkrIGh3LT5jaHVuay0+b2Zmc2V0OworCisJCQlkZWJ1Z19wcmludChodywgMCwKKwkJCQkiZnJhbWUgZGF0YSBzaXplIDB4JXhcbiIsCisJCQkJaHctPmNodW5rLT5zaXplKTsKKwkJCWZvciAoamogPSAwOyBqaiA8IGh3LT5jaHVuay0+c2l6ZTsgamorKykgeworCQkJCWlmICgoamogJiAweGYpID09IDApCisJCQkJCWRlYnVnX3ByaW50KGh3LAorCQkJCQlQUklOVF9GUkFNRUJBU0VfREFUQSwKKwkJCQkJCSIlMDZ4OiIsIGpqKTsKKwkJCQlkZWJ1Z19wcmludF9jb250KGh3LAorCQkJCVBSSU5UX0ZSQU1FQkFTRV9EQVRBLAorCQkJCQkiJTAyeCAiLCBkYXRhW2pqXSk7CisJCQkJaWYgKCgoamogKyAxKSAmIDB4ZikgPT0gMCkKKwkJCQkJZGVidWdfcHJpbnRfY29udChodywKKwkJCQkJUFJJTlRfRlJBTUVCQVNFX0RBVEEsCisJCQkJCQkiXG4iKTsKKwkJCX0KKworCQkJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcihkYXRhKTsKKwkJfQorCX0KKworfQorCisgaW50IGFtbXZkZWNfYXZzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHZkZWNfcyAqcGRhdGEgPSAqKHN0cnVjdCB2ZGVjX3MgKiopcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3ID0gTlVMTDsKKwlpbnQgciA9IDA7CisKKwlpZiAodmRlY19nZXRfZGVidWdfZmxhZ3MoKSAmIDB4OCkKKwkJcmV0dXJuIGFtdmRlY19hdnNfcHJvYmUocGRldik7CisKKwlwcl9pbmZvKCJhbW12ZGVjX2F2cyBwcm9iZSBzdGFydC5cbiIpOworCisJaWYgKHBkYXRhID09IE5VTEwpIHsKKwkJcHJfaW5mbygiYW1tdmRlY19hdnMgcGxhdGZvcm0gZGF0YSB1bmRlZmluZWQuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaHcgPSAoc3RydWN0IHZkZWNfYXZzX2h3X3MgKil2emFsbG9jKHNpemVvZihzdHJ1Y3QgdmRlY19hdnNfaHdfcykpOworCWlmIChodyA9PSBOVUxMKSB7CisJCXByX2luZm8oIlxuYW1tdmRlY19hdnMgZGVjb2RlciBkcml2ZXIgYWxsb2MgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qYXRvbWljX3NldCgmaHctPmVycm9yX2hhbmRsZXJfcnVuLCAwKTsqLworCWh3LT5tX2luc19mbGFnID0gMTsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTSB8fCBkaXNhYmxlX2xvbmdjYWJhY190cmFucykKKwkJZmlybXdhcmVfc2VsID0gMTsKKworCWlmIChmaXJtd2FyZV9zZWwgPT0gMSkgeworI2lmbmRlZiBVU0VfRFlOQU1JQ19CVUZfTlVNCisJCXZmX2J1Zl9udW0gPSA0OworI2VuZGlmCisJCWNhbnZhc19iYXNlID0gMDsKKwkJY2FudmFzX251bSA9IDM7CisJfSBlbHNlIHsKKwkJcHJfaW5mbygiRXJyb3IsIGRvIG5vdCBzdXBwb3J0IGxvbmdjYWJhYyB3b3JrIGFyb3VuZCEhISIpOworCQlyID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjE7CisJfQorCisJaWYgKHBkYXRhLT5zeXNfaW5mbykKKwkJaHctPnZhdnNfYW1zdHJlYW1fZGVjX2luZm8gPSAqcGRhdGEtPnN5c19pbmZvOworCisJaHctPmlzX3Jlc2V0ID0gMDsKKwlwZGF0YS0+dXNlcl9kYXRhX3JlYWQgPSBOVUxMOworCXBkYXRhLT5yZXNldF91c2VyZGF0YV9maWZvID0gTlVMTDsKKworCXBkYXRhLT5wcml2YXRlID0gaHc7CisJcGRhdGEtPmRlY19zdGF0dXMgPSB2YXZzX2RlY19zdGF0dXM7CisJcGRhdGEtPnNldF9pc3Jlc2V0ID0gdmF2c19zZXRfaXNyZXNldDsKKwlwZGF0YS0+cnVuX3JlYWR5ID0gcnVuX3JlYWR5OworCXBkYXRhLT5ydW4gPSBydW47CisJcGRhdGEtPnJlc2V0ID0gcmVzZXQ7CisJcGRhdGEtPmlycV9oYW5kbGVyID0gdm1hdnNfaXNyOworCXBkYXRhLT50aHJlYWRlZF9pcnFfaGFuZGxlciA9IHZtYXZzX2lzcl90aHJlYWRfZm47CisJcGRhdGEtPmR1bXBfc3RhdGUgPSB2bWF2c19kdW1wX3N0YXRlOworCisJc25wcmludGYoaHctPnZkZWNfbmFtZSwgc2l6ZW9mKGh3LT52ZGVjX25hbWUpLAorCQkiYXZzLSVkIiwgcGRldi0+aWQpOworCXNucHJpbnRmKGh3LT5wdHNfbmFtZSwgc2l6ZW9mKGh3LT5wdHNfbmFtZSksCisJCSIlcy1wdHMiLCBody0+dmRlY19uYW1lKTsKKwlzbnByaW50Zihody0+bmV3X3FfbmFtZSwgc2l6ZW9mKGh3LT5uZXdfcV9uYW1lKSwKKwkJIiVzLW5ld2ZyYW1lX3EiLCBody0+dmRlY19uYW1lKTsKKwlzbnByaW50Zihody0+ZGlzcF9xX25hbWUsIHNpemVvZihody0+ZGlzcF9xX25hbWUpLAorCQkiJXMtZGlzcGZyYW1lX3EiLCBody0+dmRlY19uYW1lKTsKKworCXZhdnNfdmRlY19pbmZvX2luaXQoaHcpOworCisjaWZkZWYgRU5BQkxFX1VTRVJfREFUQQorCWlmIChOVUxMID09IGh3LT51c2VyX2RhdGFfYnVmZmVyKSB7CisJCWh3LT51c2VyX2RhdGFfYnVmZmVyID0KKwkJCWRtYV9hbGxvY19jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJVVNFUl9EQVRBX1NJWkUsCisJCQkJJmh3LT51c2VyX2RhdGFfYnVmZmVyX3BoeXMsIEdGUF9LRVJORUwpOworCQlpZiAoIWh3LT51c2VyX2RhdGFfYnVmZmVyKSB7CisJCQlwcl9pbmZvKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBody0+dXNlcl9kYXRhX2J1ZmZlclxuIiwKKwkJCQkgICBfX2Z1bmNfXyk7CisJCQlyID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyb3IyOworCQl9CisJCXByX2RlYnVnKCJody0+dXNlcl9kYXRhX2J1ZmZlciA9IDB4JXAsIGh3LT51c2VyX2RhdGFfYnVmZmVyX3BoeXMgPSAweCV4XG4iLAorCQkJaHctPnVzZXJfZGF0YV9idWZmZXIsICh1MzIpaHctPnVzZXJfZGF0YV9idWZmZXJfcGh5cyk7CisJfQorI2VuZGlmCisJLypody0+bG1lbV9hZGRyID0ga21hbGxvYyhMTUVNX0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoaHctPmxtZW1fYWRkciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvYyBsbWVtIGJ1ZmZlclxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLTE7CisJfQorCWh3LT5sbWVtX3BoeV9hZGRyID0gZG1hX21hcF9zaW5nbGUoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQlody0+bG1lbV9hZGRyLCBMTUVNX0JVRl9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCWlmIChkbWFfbWFwcGluZ19lcnJvcihhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCWh3LT5sbWVtX3BoeV9hZGRyKSkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gbWFwIGxtZW0gYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJCWtmcmVlKGh3LT5sbWVtX2FkZHIpOworCQlody0+bG1lbV9hZGRyID0gTlVMTDsKKwkJcmV0dXJuIC0xOworCX0qLworCS8qSU5JVF9XT1JLKCZody0+c2V0X2Nsa193b3JrLCBhdnNfc2V0X2Nsayk7Ki8KKwlody0+bG1lbV9hZGRyID0gKGRtYV9hZGRyX3QpZG1hX2FsbG9jX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkgICAgICAgICAgICAgICBMTUVNX0JVRl9TSVpFLCAoZG1hX2FkZHJfdCAqKSZody0+bG1lbV9waHlfYWRkciwgR0ZQX0tFUk5FTCk7CisJaWYgKGh3LT5sbWVtX2FkZHIgPT0gMCkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgbG1lbSBidWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJciA9IC0xOworCQlnb3RvIGVycm9yMzsKKwl9CisKKwlpZiAodmF2c19pbml0KGh3KSA8IDApIHsKKwkJcHJfaW5mbygiYW12ZGVjX2F2cyBpbml0IGZhaWxlZC5cbiIpOworCQlyID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcjQ7CisJfQorCisJLypJTklUX1dPUksoJmh3LT5mYXRhbF9lcnJvcl93ZF93b3JrLCB2YXZzX2ZhdGFsX2Vycm9yX2hhbmRsZXIpOworCWF0b21pY19zZXQoJmh3LT5lcnJvcl9oYW5kbGVyX3J1biwgMCk7Ki8KKyNpZiAwCisjaWZkZWYgRU5BQkxFX1VTRVJfREFUQQorCUlOSVRfV09SSygmaHctPnVzZXJkYXRhX3B1c2hfd29yaywgdXNlcmRhdGFfcHVzaF9kb193b3JrKTsKKyNlbmRpZgorI2VuZGlmCisJSU5JVF9XT1JLKCZody0+bm90aWZ5X3dvcmssIHZhdnNfbm90aWZ5X3dvcmspOworCisJaWYgKHBkYXRhLT51c2VfdmZtX3BhdGgpIHsKKwkJc25wcmludGYocGRhdGEtPnZmX3Byb3ZpZGVyX25hbWUsIFZERUNfUFJPVklERVJfTkFNRV9TSVpFLAorCQkJICAgIFZGTV9ERUNfUFJPVklERVJfTkFNRSk7CisJCWh3LT5mcmFtZWluZm9fZW5hYmxlID0gMTsKKwl9CisJZWxzZQorCQlzbnByaW50ZihwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwgVkRFQ19QUk9WSURFUl9OQU1FX1NJWkUsCisJCQlNVUxUSV9JTlNUQU5DRV9QUk9WSURFUl9OQU1FICIuJTAyeCIsIHBkZXYtPmlkICYgMHhmZik7CisJaWYgKHBkYXRhLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IERFQ09ERV9CVUZGRVJfTlVNX01BWDsgaSsrKQorCQkJaHctPmNhbnZhc19zcGVjW2ldID0gMHhmZmZmZmY7CisJfQorCXZmX3Byb3ZpZGVyX2luaXQoJnBkYXRhLT52ZnJhbWVfcHJvdmlkZXIsIHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lLAorCQkmdmF2c192Zl9wcm92aWRlciwgaHcpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGRhdGEpOworCisJaHctPnBsYXRmb3JtX2RldiA9IHBkZXY7CisKKwl2ZGVjX3NldF9wcmVwYXJlX2xldmVsKHBkYXRhLCBzdGFydF9kZWNvZGVfYnVmX2xldmVsKTsKKworCXZkZWNfc2V0X3ZmcmFtZV9jb21tKHBkYXRhLCBEUklWRVJfTkFNRSk7CisKKwlpZiAocGRhdGEtPnBhcmFsbGVsX2RlYyA9PSAxKQorCQl2ZGVjX2NvcmVfcmVxdWVzdChwZGF0YSwgQ09SRV9NQVNLX1ZERUNfMSk7CisJZWxzZSB7CisJCXZkZWNfY29yZV9yZXF1ZXN0KHBkYXRhLCBDT1JFX01BU0tfVkRFQ18xIHwgQ09SRV9NQVNLX0hFVkMKKwkJCQkJfCBDT1JFX01BU0tfQ09NQklORSk7CisJfQorCisJLypJTklUX1dPUksoJmh3LT51c2VyZGF0YV9wdXNoX3dvcmssIHVzZXJkYXRhX3B1c2hfZG9fd29yayk7Ki8KKworCXJldHVybiAwOworCitlcnJvcjQ6CisJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQlMTUVNX0JVRl9TSVpFLCAodm9pZCAqKWh3LT5sbWVtX2FkZHIsCisJCWh3LT5sbWVtX3BoeV9hZGRyKTsKK2Vycm9yMzoKKwlkbWFfZnJlZV9jb2hlcmVudCgKKwkJYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQlVU0VSX0RBVEFfU0laRSwKKwkJaHctPnVzZXJfZGF0YV9idWZmZXIsCisJCWh3LT51c2VyX2RhdGFfYnVmZmVyX3BoeXMpOworZXJyb3IyOgorCWtmcmVlKGh3LT5ndnMpOworCWh3LT5ndnMgPSBOVUxMOworCXBkYXRhLT5kZWNfc3RhdHVzID0gTlVMTDsKK2Vycm9yMToKKwl2ZnJlZShodyk7CisJcmV0dXJuIHI7Cit9CisKKyBpbnQgYW1tdmRlY19hdnNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisKKwlpZiAodmRlY19nZXRfZGVidWdfZmxhZ3MoKSAmIDB4OCkKKwkJcmV0dXJuIGFtdmRlY19hdnNfcmVtb3ZlKHBkZXYpOworCWVsc2UgeworCQlzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcgPQorCQkJKHN0cnVjdCB2ZGVjX2F2c19od19zICopCisJCQkoKChzdHJ1Y3QgdmRlY19zICopKHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpKSktPnByaXZhdGUpOworCQlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisJCWludCBpOworCisJCWlmIChody0+c3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJCWFtdmRlY19zdG9wKCk7CisJCQlody0+c3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwkJfQorCisJCWlmIChody0+c3RhdCAmIFNUQVRfSVNSX1JFRykgeworCQkJdmRlY19mcmVlX2lycShWREVDX0lSUV8xLCAodm9pZCAqKWh3KTsKKwkJCWh3LT5zdGF0ICY9IH5TVEFUX0lTUl9SRUc7CisJCX0KKworCQlpZiAoaHctPnN0YXQgJiBTVEFUX1RJTUVSX0FSTSkgeworCQkJZGVsX3RpbWVyX3N5bmMoJmh3LT5jaGVja190aW1lcik7CisJCQlody0+c3RhdCAmPSB+U1RBVF9USU1FUl9BUk07CisJCX0KKworCQljYW5jZWxfd29ya19zeW5jKCZody0+d29yayk7CisJCWNhbmNlbF93b3JrX3N5bmMoJmh3LT5ub3RpZnlfd29yayk7CisKKwkJaWYgKGh3LT5tbV9ibGtfaGFuZGxlKSB7CisJCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWUoaHctPm1tX2Jsa19oYW5kbGUpOworCQkJaHctPm1tX2Jsa19oYW5kbGUgPSBOVUxMOworCQl9CisJCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkKKwkJCXZkZWNfY29yZV9yZWxlYXNlKGh3X3RvX3ZkZWMoaHcpLCBDT1JFX01BU0tfVkRFQ18xKTsKKwkJZWxzZQorCQkJdmRlY19jb3JlX3JlbGVhc2UoaHdfdG9fdmRlYyhodyksIENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQyk7CisJCXZkZWNfc2V0X3N0YXR1cyhod190b192ZGVjKGh3KSwgVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEKTsKKworCQlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBERUNPREVfQlVGRkVSX05VTV9NQVg7IGkrKykgeworCQkJCXZkZWMtPmZyZWVfY2FudmFzX2V4KGNhbnZhc195KGh3LT5jYW52YXNfc3BlY1tpXSksIHZkZWMtPmlkKTsKKwkJCQl2ZGVjLT5mcmVlX2NhbnZhc19leChjYW52YXNfdShody0+Y2FudmFzX3NwZWNbaV0pLCB2ZGVjLT5pZCk7CisJCQl9CisJCX0KKwkjaWZkZWYgRU5BQkxFX1VTRVJfREFUQQorCQlpZiAoaHctPnVzZXJfZGF0YV9idWZmZXIgIT0gTlVMTCkgeworCQkJZG1hX2ZyZWVfY29oZXJlbnQoCisJCQkJYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCVVTRVJfREFUQV9TSVpFLAorCQkJCWh3LT51c2VyX2RhdGFfYnVmZmVyLAorCQkJCWh3LT51c2VyX2RhdGFfYnVmZmVyX3BoeXMpOworCQkJaHctPnVzZXJfZGF0YV9idWZmZXIgPSBOVUxMOworCQkJaHctPnVzZXJfZGF0YV9idWZmZXJfcGh5cyA9IDA7CisJCX0KKwkjZW5kaWYKKwkJLyppZiAoaHctPmxtZW1fYWRkcikgeworCQkJZG1hX3VubWFwX3NpbmdsZShhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJaHctPmxtZW1fcGh5X2FkZHIsIExNRU1fQlVGX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJCQlrZnJlZShody0+bG1lbV9hZGRyKTsKKwkJCWh3LT5sbWVtX2FkZHIgPSBOVUxMOworCQl9Ki8KKwlpZiAoaHctPmxtZW1fYWRkcikgeworCQlkbWFfZnJlZV9jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJCUxNRU1fQlVGX1NJWkUsICh2b2lkICopaHctPmxtZW1fYWRkciwKKwkJCQkJaHctPmxtZW1fcGh5X2FkZHIpOworCQlody0+bG1lbV9hZGRyID0gMDsKKwl9CisKKwkJaWYgKGh3LT5mdykgeworCQkJdmZyZWUoaHctPmZ3KTsKKwkJCWh3LT5mdyA9IE5VTEw7CisJCX0KKworCQlwcl9pbmZvKCJhbW12ZGVjX2F2cyByZW1vdmVkLlxuIik7CisJCWlmIChody0+Z3ZzKSB7CisJCQlrZnJlZShody0+Z3ZzKTsKKwkJCWh3LT5ndnMgPSBOVUxMOworCQl9CisKKwkJdmZyZWUoaHcpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKKworI2lmZGVmIERFQlVHX01VTFRJX1dJVEhfQVVUT01PREUKK3N0cnVjdCBzdHJlYW1fYnVmX3MgKmdldF92YnVmKHZvaWQpOworczMyIGVzcGFyc2VyX2luaXQoc3RydWN0IHN0cmVhbV9idWZfcyAqYnVmLCBzdHJ1Y3QgdmRlY19zICp2ZGVjKTsKKworCitzdGF0aWMgczMyIHZhdnNfaW5pdDIoc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3KQoreworCWludCAgc2l6ZSA9IC0xOworCXN0cnVjdCBmaXJtd2FyZV9zICpmdzsKKwl1MzIgZndfc2l6ZSA9IDB4MTAwMCAqIDE2OworCisJZncgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgZmlybXdhcmVfcykgKyBmd19zaXplKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZncpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByX2luZm8oInZhdnNfaW5pdFxuIik7CisKKwlhbXZkZWNfZW5hYmxlKCk7CisKKworCXZhdnNfbG9jYWxfaW5pdChodyk7CisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWE0pCisJCXNpemUgPSBnZXRfZmlybXdhcmVfZGF0YShWSURFT19ERUNfQVZTX01VTFRJLCBmdy0+ZGF0YSk7CisJZWxzZSB7CisJCWlmIChmaXJtd2FyZV9zZWwgPT0gMSkKKwkJCXNpemUgPSBnZXRfZmlybXdhcmVfZGF0YShWSURFT19ERUNfQVZTX05PQ0FCQUMsIGZ3LT5kYXRhKTsKKyNpZmRlZiBBVlNQX0xPTkdfQ0FCQUMKKwkJZWxzZSB7CisJCQlpbml0X2F2c3BfbG9uZ19jYWJhY19idWYoKTsKKwkJCXNpemUgPSBnZXRfZmlybXdhcmVfZGF0YShWSURFT19ERUNfQVZTX01VTFRJLCBmdy0+ZGF0YSk7CisJCX0KKyNlbmRpZgorCX0KKworCWlmIChzaXplIDwgMCkgeworCQlhbXZkZWNfZGlzYWJsZSgpOworCQlwcl9lcnIoImdldCBmaXJtd2FyZSBmYWlsLiIpOworCQkvKnZmcmVlKGJ1Zik7Ki8KKwkJcmV0dXJuIC0xOworCX0KKworCWZ3LT5sZW4gPSBzaXplOworCWh3LT5mdyA9IGZ3OworCWlmIChody0+bV9pbnNfZmxhZykgeworCQlpbml0X3RpbWVyKCZody0+Y2hlY2tfdGltZXIpOworCQlody0+Y2hlY2tfdGltZXIuZGF0YSA9ICh1bG9uZykgaHc7CisJCWh3LT5jaGVja190aW1lci5mdW5jdGlvbiA9IGNoZWNrX3RpbWVyX2Z1bmM7CisJCWh3LT5jaGVja190aW1lci5leHBpcmVzID0gamlmZmllcyArIENIRUNLX0lOVEVSVkFMOworCisKKwkJLy9hZGRfdGltZXIoJmh3LT5jaGVja190aW1lcik7CisJCWh3LT5zdGF0IHw9IFNUQVRfVElNRVJfQVJNOworCisJCUlOSVRfV09SSygmaHctPndvcmssIHZhdnNfd29yayk7CisKKwkJaHctPmZ3ID0gZnc7CisJfQorCXJldHVybiAwOworfQorCit1bnNpZ25lZCBpbnQgZGVidWdfZmxhZzI7CitzdGF0aWMgaW50IHZhdnNfcHJvdF9pbml0MihzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcsIHVuc2lnbmVkIGNoYXIgcG9zdF9mbGFnKQoreworCWludCByID0gMDsKKwkvKgorCSAqIDI6IGFzc2lzdAorCSAqIDM6IHZsZF9yZXNldAorCSAqIDQ6IHZsZF9wYXJ0X3Jlc2V0CisJICogNTogdmZpZm8gcmVzZXQKKwkgKiA2OiBpcWlkY3QKKwkgKiA3OiBtYworCSAqIDg6IGRibGsKKwkgKiA5OiBwaWNfZGMKKwkgKiAxMDogcHNjCisJICogMTE6IG1jcHUKKwkgKiAxMjogY2NwdQorCSAqIDEzOiBkZHIKKwkgKiAxNDogYWZpZm8KKwkgKi8KKwl1bnNpZ25lZCBjaGFyIHJ1bl9mbGFnOworI2lmZGVmIE9PTworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgKDEgPDwgNykgfCAoMSA8PCA2KSAvKnwgKDEgPDwgNCkqLyk7CisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAwKTsKKworCVJFQURfVlJFRyhET1NfU1dfUkVTRVQwKTsKKworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgKDEgPDwgNykgfCAoMSA8PCA2KSAvKnwgKDEgPDwgNCkqLyk7CisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAwKTsKKworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgKDEgPDwgOSkgfCAoMSA8PCA4KSk7CisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAwKTsKKyNlbmRpZgorCS8qKioqKioqKioqKioqKioqKiByZXNldCB2bGQgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIE9PTworCVdSSVRFX1ZSRUcoUE9XRVJfQ1RMX1ZMRCwgMHgxMCk7CisJV1JJVEVfVlJFR19CSVRTKFZMRF9NRU1fVklGSUZPX0NPTlRST0wsIDIsIE1FTV9GSUZPX0NOVF9CSVQsIDIpOworCVdSSVRFX1ZSRUdfQklUUyhWTERfTUVNX1ZJRklGT19DT05UUk9MLAk4LCBNRU1fTEVWRUxfQ05UX0JJVCwgNik7CisjZW5kaWYKKyAgIGlmIChzdGFydF9kZWNvZGluZ19kZWxheSAmIDB4ODAwMDApCisJCW1zbGVlcChzdGFydF9kZWNvZGluZ19kZWxheSYweGZmZmYpOworCitpZiAoZGVidWdfZmxhZzIgJiAweDEpCisJcnVuX2ZsYWcgPSBwb3N0X2ZsYWc7CitlbHNlCisJcnVuX2ZsYWcgPSAhcG9zdF9mbGFnOworaWYgKHJ1bl9mbGFnKSB7CisJaWYgKGh3LT5tX2luc19mbGFnKSB7CisJCWludCBpOworCQlpZiAoaHctPmRlY29kZV9waWNfY291bnQgPT0gMCkgeworCQkJciA9IHZhdnNfY2FudmFzX2luaXQoaHcpOworI2lmbmRlZiBVU0VfRFlOQU1JQ19CVUZfTlVNCisJCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzAgKyBpLAorCQkJCQlody0+Y2FudmFzX3NwZWNbaV0KKwkJCQkpOworCQkJfQorI2Vsc2UKKwkJZm9yIChpID0gMDsgaSA8IGh3LT52Zl9idWZfbnVtX3VzZWQ7IGkgKz0gMikgeworCQkJV1JJVEVfVlJFRyhidWZfc3BlY19yZWdbaSA+PiAxXSwKKwkJCQkoaHctPmNhbnZhc19zcGVjW2ldICYgMHhmZmZmKSB8CisJCQkJKChody0+Y2FudmFzX3NwZWNbaSArIDFdICYgMHhmZmZmKQorCQkJCQk8PCAxNikKKwkJCSk7CisJCX0KKyNlbmRpZgorCQl9IGVsc2UKKwkJCXZhdnNfcmVzdG9yZV9yZWdzKGh3KTsKKworCQlmb3IgKGkgPSAwOyBpIDwgaHctPnZmX2J1Zl9udW1fdXNlZDsgaSsrKSB7CisJCQljb25maWdfY2F2X2x1dF9leChjYW52YXNfeShody0+Y2FudmFzX3NwZWNbaV0pLAorCQkJCWh3LT5jYW52YXNfY29uZmlnW2ldWzBdLnBoeV9hZGRyLAorCQkJCWh3LT5jYW52YXNfY29uZmlnW2ldWzBdLndpZHRoLAorCQkJCWh3LT5jYW52YXNfY29uZmlnW2ldWzBdLmhlaWdodCwKKwkJCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCQkJaHctPmNhbnZhc19jb25maWdbaV1bMF0uYmxvY2tfbW9kZSwKKwkJCQkwLCBWREVDXzEpOworCisJCQljb25maWdfY2F2X2x1dF9leChjYW52YXNfdShody0+Y2FudmFzX3NwZWNbaV0pLAorCQkJCWh3LT5jYW52YXNfY29uZmlnW2ldWzFdLnBoeV9hZGRyLAorCQkJCWh3LT5jYW52YXNfY29uZmlnW2ldWzFdLndpZHRoLAorCQkJCWh3LT5jYW52YXNfY29uZmlnW2ldWzFdLmhlaWdodCwKKwkJCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCQkJaHctPmNhbnZhc19jb25maWdbaV1bMV0uYmxvY2tfbW9kZSwKKwkJCQkwLCBWREVDXzEpOworCQl9CisJfQorfQorCitpZiAoZGVidWdfZmxhZzIgJiAweDIpCisJcnVuX2ZsYWcgPSBwb3N0X2ZsYWc7CitlbHNlCisJcnVuX2ZsYWcgPSAhcG9zdF9mbGFnOworaWYgKHJ1bl9mbGFnKSB7CisKKwkvKiBub3RpZnkgdWNvZGUgdGhlIGJ1ZmZlciBvZmZzZXQgKi8KKwlpZiAoaHctPmRlY29kZV9waWNfY291bnQgPT0gMCkKKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0YsIGh3LT5idWZfb2Zmc2V0KTsKKyNpZmRlZiBPT08KKwkvKiBkaXNhYmxlIFBTQ0FMRSBmb3IgaGFyZHdhcmUgc2hhcmluZyAqLworCVdSSVRFX1ZSRUcoUFNDQUxFX0NUUkwsIDApOworI2VuZGlmCisJfQorCWlmIChzdGFydF9kZWNvZGluZ19kZWxheSAmIDB4NDAwMDApCisJCW1zbGVlcChzdGFydF9kZWNvZGluZ19kZWxheSYweGZmZmYpOworCisJaWYgKGRlYnVnX2ZsYWcyICYgMHg0KQorCQlydW5fZmxhZyA9IHBvc3RfZmxhZzsKKwllbHNlCisJCXJ1bl9mbGFnID0gIXBvc3RfZmxhZzsKKwlpZiAocnVuX2ZsYWcpIHsKKwlpZiAoaHctPmRlY29kZV9waWNfY291bnQgPT0gMCkgeworI2lmbmRlZiBVU0VfRFlOQU1JQ19CVUZfTlVNCisJCVdSSVRFX1ZSRUcoQVZTX1NPU19DT1VOVCwgMCk7CisjZW5kaWYKKwkJV1JJVEVfVlJFRyhBVlNfQlVGRkVSSU4sIDApOworCQlXUklURV9WUkVHKEFWU19CVUZGRVJPVVQsIDApOworCX0KKwlpZiAoZXJyb3JfcmVjb3ZlcnlfbW9kZSkKKwkJV1JJVEVfVlJFRyhBVlNfRVJST1JfUkVDT1ZFUllfTU9ERSwgMCk7CisJZWxzZQorCQlXUklURV9WUkVHKEFWU19FUlJPUl9SRUNPVkVSWV9NT0RFLCAxKTsKKwkvKiBjbGVhciBtYWlsYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoQVNTSVNUX01CT1gxX0NMUl9SRUcsIDEpOworCisJLyogZW5hYmxlIG1haWxib3ggaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfTUFTSywgMSk7Cit9CisKK2lmIChkZWJ1Z19mbGFnMiAmIDB4OCkKKwlydW5fZmxhZyA9IHBvc3RfZmxhZzsKK2Vsc2UKKwlydW5fZmxhZyA9ICFwb3N0X2ZsYWc7CitpZiAocnVuX2ZsYWcpIHsKKworI2lmbmRlZiBVU0VfRFlOQU1JQ19CVUZfTlVNCQkJCS8qIGRlZiBERUJVR19VQ09ERSAqLworCWlmIChody0+ZGVjb2RlX3BpY19jb3VudCA9PSAwKQorCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfRCwgMCk7CisjZW5kaWYKKwlpZiAoc3RhcnRfZGVjb2RpbmdfZGVsYXkgJiAweDEwMDAwKQorCQltc2xlZXAoc3RhcnRfZGVjb2RpbmdfZGVsYXkmMHhmZmZmKTsKKyNpZmRlZiBOVjIxCisJU0VUX1ZSRUdfTUFTSyhNREVDX1BJQ19EQ19DVFJMLCAxIDw8IDE3KTsKKyNlbmRpZgorCUNMRUFSX1ZSRUdfTUFTSyhNREVDX1BJQ19EQ19DVFJMLCAxIDw8IDE2KTsKKworCWlmIChzdGFydF9kZWNvZGluZ19kZWxheSAmIDB4MjAwMDApCisJCW1zbGVlcChzdGFydF9kZWNvZGluZ19kZWxheSYweGZmZmYpOworCisKKyNpZmRlZiBQSUNfRENfTkVFRF9DTEVBUgorCUNMRUFSX1ZSRUdfTUFTSyhNREVDX1BJQ19EQ19DVFJMLCAxIDw8IDMxKTsKKyNlbmRpZgorfQoraWYgKGRlYnVnX2ZsYWcyICYgMHgxMCkKKwlydW5fZmxhZyA9IHBvc3RfZmxhZzsKK2Vsc2UKKwlydW5fZmxhZyA9ICFwb3N0X2ZsYWc7CitpZiAocnVuX2ZsYWcpIHsKKyNpZmRlZiBFTkFCTEVfVVNFUl9EQVRBCisJaWYgKGZpcm13YXJlX3NlbCA9PSAwKSB7CisJCXByX2luZm8oIiEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEgZmlybXdhcmVfc2VsIGlzIDBcbiIpOworCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfTiwgKHUzMikoaHctPnVzZXJfZGF0YV9idWZmZXJfcGh5cyAtIGh3LT5idWZfb2Zmc2V0KSk7CisJCXByX2RlYnVnKCJBVl9TQ1JBVENIX04gPSAweCV4XG4iLCBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9OKSk7CisJfQorI2VuZGlmCit9CisKK2lmIChkZWJ1Z19mbGFnMiAmIDB4MjApCisJcnVuX2ZsYWcgPSBwb3N0X2ZsYWc7CitlbHNlCisJcnVuX2ZsYWcgPSAhcG9zdF9mbGFnOworaWYgKHJ1bl9mbGFnKSB7CisJaWYgKGh3LT5tX2luc19mbGFnKSB7CisJCWlmICh2ZGVjX2ZyYW1lX2Jhc2VkKGh3X3RvX3ZkZWMoaHcpKSkKKwkJCVdSSVRFX1ZSRUcoREVDT0RFX01PREUsIERFQ09ERV9NT0RFX01VTFRJX0ZSQU1FQkFTRSk7CisJCWVsc2UKKwkJCVdSSVRFX1ZSRUcoREVDT0RFX01PREUsIERFQ09ERV9NT0RFX01VTFRJX1NUUkVBTUJBU0UpOworCQlXUklURV9WUkVHKERFQ09ERV9MTUVNX0JVRl9BRFIsICh1MzIpaHctPmxtZW1fcGh5X2FkZHIpOworCX0gZWxzZQorCQlXUklURV9WUkVHKERFQ09ERV9NT0RFLCBERUNPREVfTU9ERV9TSU5HTEUpOworCVdSSVRFX1ZSRUcoREVDT0RFX1NUT1BfUE9TLCB1ZGVidWdfZmxhZyk7CisJaHctPm9sZF91ZGVidWdfZmxhZyA9IHVkZWJ1Z19mbGFnOworfQorCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBpbml0X2h3KHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3ID0KKwkoc3RydWN0IHZkZWNfYXZzX2h3X3MgKil2ZGVjLT5wcml2YXRlOworCWludCByZXQ7CisJcHJfaW5mbygiJXMsICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTSkKKwkJcmV0ID0gYW12ZGVjX2xvYWRtY19leChWRk9STUFUX0FWUywgTlVMTCwgaHctPmZ3LT5kYXRhKTsKKwllbHNlIGlmIChmaXJtd2FyZV9zZWwgPT0gMSkKKwkJcmV0ID0gYW12ZGVjX2xvYWRtY19leChWRk9STUFUX0FWUywgImF2c19ub19jYWJhYyIsIGh3LT5mdy0+ZGF0YSk7CisJZWxzZQorCQlyZXQgPSBhbXZkZWNfbG9hZG1jX2V4KFZGT1JNQVRfQVZTLCBOVUxMLCBody0+ZnctPmRhdGEpOworCisJaWYgKHJldCA8IDApIHsKKwkJYW12ZGVjX2Rpc2FibGUoKTsKKwkJLyp2ZnJlZShidWYpOyovCisJCXByX2VycigiQVZTOiB0aGUgJXMgZncgbG9hZGluZyBmYWlsZWQsIGVycjogJXhcbiIsCisJCQl0ZWVfZW5hYmxlZCgpID8gIlRFRSIgOiAibG9jYWwiLCByZXQpOworCX0KKwlwcl9pbmZvKCIlcywgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwkvKnZmcmVlKGJ1Zik7Ki8KKworCWh3LT5zdGF0IHw9IFNUQVRfTUNfTE9BRDsKKworCS8qIGVuYWJsZSBBTVJJU0Mgc2lkZSBwcm90b2NvbCAqLworCXJldCA9IHZhdnNfcHJvdF9pbml0MihodywgMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybjsKKwlwcl9pbmZvKCIlcywgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKK30KKworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBydW5fcmVhZHkyKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgcnVuMihzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1bnNpZ25lZCBsb25nIG1hc2ssCit2b2lkICgqY2FsbGJhY2spKHN0cnVjdCB2ZGVjX3MgKiwgdm9pZCAqKSwKKwkJdm9pZCAqYXJnKQoreworCXN0cnVjdCB2ZGVjX2F2c19od19zICpodyA9CisJKHN0cnVjdCB2ZGVjX2F2c19od19zICopdmRlYy0+cHJpdmF0ZTsKKwlwcl9pbmZvKCIlcywgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwl2YXZzX3Byb3RfaW5pdDIoaHcsIDEpOworCisJdmRlY19zb3VyY2VfY2hhbmdlZChWRk9STUFUX0FWUywKKwkJCQkJMTkyMCwgMTA4MCwgMzApOworCisJYW12ZGVjX3N0YXJ0KCk7CisKKwlody0+c3RhdCB8PSBTVEFUX1ZERUNfUlVOOworCXByX2luZm8oIiVzICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCit9CisKK3N0YXRpYyBpbnQgYW1tdmRlY19hdnNfcHJvYmUyKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHZkZWNfcyAqcGRhdGEgPSAqKHN0cnVjdCB2ZGVjX3MgKiopcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3ID0gTlVMTDsKKworCXByX2luZm8oImFtbXZkZWNfYXZzIHByb2JlIHN0YXJ0LlxuIik7CisKKwlpZiAocGRhdGEgPT0gTlVMTCkgeworCQlwcl9pbmZvKCJhbW12ZGVjX2F2cyBwbGF0Zm9ybSBkYXRhIHVuZGVmaW5lZC5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcHJfaW5mbygiJXMgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlodyA9IChzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqKXZ6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZGVjX2F2c19od19zKSk7CisJaWYgKGh3ID09IE5VTEwpIHsKKwkJcHJfaW5mbygiXG5hbW12ZGVjX2F2cyBkZWNvZGVyIGRyaXZlciBhbGxvYyBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcHJfaW5mbygiJXMgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJLyphdG9taWNfc2V0KCZody0+ZXJyb3JfaGFuZGxlcl9ydW4sIDApOyovCisJaHctPm1faW5zX2ZsYWcgPSAxOworCXByX2luZm8oIiVzICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hNIHx8IGRpc2FibGVfbG9uZ2NhYmFjX3RyYW5zKQorCQlmaXJtd2FyZV9zZWwgPSAxOworCXByX2luZm8oIiVzICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJaWYgKGZpcm13YXJlX3NlbCA9PSAxKSB7CisjaWZuZGVmIFVTRV9EWU5BTUlDX0JVRl9OVU0KKwkJdmZfYnVmX251bSA9IDQ7CisjZW5kaWYKKwkJY2FudmFzX2Jhc2UgPSAwOworCQljYW52YXNfbnVtID0gMzsKKwl9IGVsc2UgeworCQlwcl9pbmZvKCJFcnJvciwgZG8gbm90IHN1cHBvcnQgbG9uZ2NhYmFjIHdvcmsgYXJvdW5kISEhIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlwcl9pbmZvKCIlcyAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCWlmIChwZGF0YS0+c3lzX2luZm8pCisJCWh3LT52YXZzX2Ftc3RyZWFtX2RlY19pbmZvID0gKnBkYXRhLT5zeXNfaW5mbzsKKwlwcl9pbmZvKCIlcyAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCWh3LT5pc19yZXNldCA9IDA7CisJcGRhdGEtPnVzZXJfZGF0YV9yZWFkID0gTlVMTDsKKwlwZGF0YS0+cmVzZXRfdXNlcmRhdGFfZmlmbyA9IE5VTEw7CisKKwlwcl9pbmZvKCIlcyAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCXBkYXRhLT5wcml2YXRlID0gaHc7CisJcGRhdGEtPmRlY19zdGF0dXMgPSB2YXZzX2RlY19zdGF0dXM7CisJcGRhdGEtPnNldF9pc3Jlc2V0ID0gdmF2c19zZXRfaXNyZXNldDsKKwlwZGF0YS0+cnVuX3JlYWR5ID0gcnVuX3JlYWR5MjsKKwlwZGF0YS0+cnVuID0gcnVuMjsKKwlwZGF0YS0+cmVzZXQgPSByZXNldDsKKwlwZGF0YS0+aXJxX2hhbmRsZXIgPSB2bWF2c19pc3I7CisJcGRhdGEtPnRocmVhZGVkX2lycV9oYW5kbGVyID0gdm1hdnNfaXNyX3RocmVhZF9mbjsKKwlwZGF0YS0+ZHVtcF9zdGF0ZSA9IHZtYXZzX2R1bXBfc3RhdGU7CisKKwlwcl9pbmZvKCIlcyAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCXZhdnNfdmRlY19pbmZvX2luaXQoaHcpOworCisJcHJfaW5mbygiJXMgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKyNpZmRlZiBFTkFCTEVfVVNFUl9EQVRBCisJaWYgKE5VTEwgPT0gaHctPnVzZXJfZGF0YV9idWZmZXIpIHsKKwkJaHctPnVzZXJfZGF0YV9idWZmZXIgPQorCQkJZG1hX2FsbG9jX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlVU0VSX0RBVEFfU0laRSwKKwkJCQkmaHctPnVzZXJfZGF0YV9idWZmZXJfcGh5cywgR0ZQX0tFUk5FTCk7CisJCWlmICghaHctPnVzZXJfZGF0YV9idWZmZXIpIHsKKwkJCXByX2luZm8oIiVzOiBDYW4gbm90IGFsbG9jYXRlIGh3LT51c2VyX2RhdGFfYnVmZmVyXG4iLAorCQkJCSAgIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXByX2RlYnVnKCJody0+dXNlcl9kYXRhX2J1ZmZlciA9IDB4JXAsIGh3LT51c2VyX2RhdGFfYnVmZmVyX3BoeXMgPSAweCV4XG4iLAorCQkJaHctPnVzZXJfZGF0YV9idWZmZXIsICh1MzIpaHctPnVzZXJfZGF0YV9idWZmZXJfcGh5cyk7CisJfQorI2VuZGlmCisJaHctPmxtZW1fYWRkciA9IGttYWxsb2MoTE1FTV9CVUZfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKGh3LT5sbWVtX2FkZHIgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgbG1lbSBidWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKwlody0+bG1lbV9waHlfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJaHctPmxtZW1fYWRkciwgTE1FTV9CVUZfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQlody0+bG1lbV9waHlfYWRkcikpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIG1hcCBsbWVtIGJ1ZmZlclxuIiwgX19mdW5jX18pOworCQlrZnJlZShody0+bG1lbV9hZGRyKTsKKwkJaHctPmxtZW1fYWRkciA9IE5VTEw7CisJCXJldHVybiAtMTsKKwl9CisKKwlwcl9pbmZvKCIlcyAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCS8qSU5JVF9XT1JLKCZody0+c2V0X2Nsa193b3JrLCBhdnNfc2V0X2Nsayk7Ki8KKworCXByX2luZm8oIiVzICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJaWYgKHZhdnNfaW5pdDIoaHcpIDwgMCkgeworCQlwcl9pbmZvKCJhbXZkZWNfYXZzIGluaXQgZmFpbGVkLlxuIik7CisJCWtmcmVlKGh3LT5ndnMpOworCQlody0+Z3ZzID0gTlVMTDsKKwkJcGRhdGEtPmRlY19zdGF0dXMgPSBOVUxMOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJLyp2ZGVjID0gcGRhdGE7Ki8KKwlwcl9pbmZvKCIlcywgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKK2lmIChody0+bV9pbnNfZmxhZykgeworCUlOSVRfV09SSygmaHctPm5vdGlmeV93b3JrLCB2YXZzX25vdGlmeV93b3JrKTsKKyNpZiAxCisJaWYgKHBkYXRhLT51c2VfdmZtX3BhdGgpIHsKKwkJc25wcmludGYocGRhdGEtPnZmX3Byb3ZpZGVyX25hbWUsIFZERUNfUFJPVklERVJfTkFNRV9TSVpFLAorCQkJICAgIFZGTV9ERUNfUFJPVklERVJfTkFNRSk7CisJCWh3LT5mcmFtZWluZm9fZW5hYmxlID0gMTsKKwl9CisJZWxzZQorCQlzbnByaW50ZihwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwgVkRFQ19QUk9WSURFUl9OQU1FX1NJWkUsCisJCQlNVUxUSV9JTlNUQU5DRV9QUk9WSURFUl9OQU1FICIuJTAyeCIsIHBkZXYtPmlkICYgMHhmZik7CisJaWYgKHBkYXRhLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IERFQ09ERV9CVUZGRVJfTlVNX01BWDsgaSsrKQorCQkJaHctPmNhbnZhc19zcGVjW2ldID0gMHhmZmZmZmY7CisJfQorCXZmX3Byb3ZpZGVyX2luaXQoJnBkYXRhLT52ZnJhbWVfcHJvdmlkZXIsIHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lLAorCQkmdmF2c192Zl9wcm92aWRlciwgaHcpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGRhdGEpOworCisJaHctPnBsYXRmb3JtX2RldiA9IHBkZXY7CisKKwl2ZGVjX3NldF9wcmVwYXJlX2xldmVsKHBkYXRhLCBzdGFydF9kZWNvZGVfYnVmX2xldmVsKTsKKworCWlmIChwZGF0YS0+cGFyYWxsZWxfZGVjID09IDEpCisJCXZkZWNfY29yZV9yZXF1ZXN0KHBkYXRhLCBDT1JFX01BU0tfVkRFQ18xKTsKKwllbHNlIHsKKwkJdmRlY19jb3JlX3JlcXVlc3QocGRhdGEsIENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQworCQkJCQl8IENPUkVfTUFTS19DT01CSU5FKTsKKwl9CisJcHJfaW5mbygiJXMsICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworI2VuZGlmCit9ZWxzZXsKKwkvKklOSVRfV09SSygmaHctPmZhdGFsX2Vycm9yX3dkX3dvcmssIHZhdnNfZmF0YWxfZXJyb3JfaGFuZGxlcik7CisJYXRvbWljX3NldCgmaHctPmVycm9yX2hhbmRsZXJfcnVuLCAwKTsqLworI2lmZGVmIEVOQUJMRV9VU0VSX0RBVEEKKwlJTklUX1dPUksoJmh3LT51c2VyZGF0YV9wdXNoX3dvcmssIHVzZXJkYXRhX3B1c2hfZG9fd29yayk7CisjZW5kaWYKKwlJTklUX1dPUksoJmh3LT5ub3RpZnlfd29yaywgdmF2c19ub3RpZnlfd29yayk7Cit9CisKKwlpbml0X2h3KHBkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbW12ZGVjX2F2c19yZW1vdmUyKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3ID0gZ2h3OworCisJY2FuY2VsX3dvcmtfc3luYygmaHctPmZhdGFsX2Vycm9yX3dkX3dvcmspOworCWF0b21pY19zZXQoJmh3LT5lcnJvcl9oYW5kbGVyX3J1biwgMCk7CisjaWZkZWYgRU5BQkxFX1VTRVJfREFUQQorCWNhbmNlbF93b3JrX3N5bmMoJmh3LT51c2VyZGF0YV9wdXNoX3dvcmspOworI2VuZGlmCisJY2FuY2VsX3dvcmtfc3luYygmaHctPm5vdGlmeV93b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZody0+c2V0X2Nsa193b3JrKTsKKwlpZiAoaHctPnN0YXQgJiBTVEFUX1ZERUNfUlVOKSB7CisJCWFtdmRlY19zdG9wKCk7CisJCWh3LT5zdGF0ICY9IH5TVEFUX1ZERUNfUlVOOworCX0KKworCWlmIChody0+c3RhdCAmIFNUQVRfSVNSX1JFRykgeworCQl2ZGVjX2ZyZWVfaXJxKFZERUNfSVJRXzEsICh2b2lkICopdmF2c19kZWNfaWQpOworCQlody0+c3RhdCAmPSB+U1RBVF9JU1JfUkVHOworCX0KKworCWlmIChody0+c3RhdCAmIFNUQVRfVElNRVJfQVJNKSB7CisJCWRlbF90aW1lcl9zeW5jKCZody0+cmVjeWNsZV90aW1lcik7CisJCWh3LT5zdGF0ICY9IH5TVEFUX1RJTUVSX0FSTTsKKwl9CisjaWZkZWYgQVZTUF9MT05HX0NBQkFDCisJaWYgKGZpcm13YXJlX3NlbCA9PSAwKSB7CisJCW11dGV4X2xvY2soJnZhdnNfbXV0ZXgpOworCQljYW5jZWxfd29ya19zeW5jKCZsb25nX2NhYmFjX3dkX3dvcmspOworCQltdXRleF91bmxvY2soJnZhdnNfbXV0ZXgpOworCisJCWlmIChlc193cml0ZV9hZGRyX3ZpcnQpIHsKKyNpZiAwCisJCQljb2RlY19tbV9mcmVlX2Zvcl9kbWEoInZhdnMiLCBlc193cml0ZV9hZGRyX3BoeSk7CisjZWxzZQorCQkJZG1hX3VubWFwX3NpbmdsZShhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJZXNfd3JpdGVfYWRkcl9waHksCisJCQkJTUFYX0NPREVEX0ZSQU1FX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJCQkvKmtmcmVlKGVzX3dyaXRlX2FkZHJfdmlydCk7Ki8KKwkJCWVzX3dyaXRlX2FkZHJfdmlydCA9IE5VTEw7CisjZW5kaWYKKwkJfQorCisjaWZkZWYgQklUU1RSRUFNX1JFQURfVE1QX05PX0NBQ0hFCisJCWlmIChiaXRzdHJlYW1fcmVhZF90bXApIHsKKwkJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlTVkFfU1RSRUFNX0JVRl9TSVpFLCBiaXRzdHJlYW1fcmVhZF90bXAsCisJCQkJYml0c3RyZWFtX3JlYWRfdG1wX3BoeSk7CisJCQliaXRzdHJlYW1fcmVhZF90bXAgPSBOVUxMOworCQl9CisjZWxzZQorCQlpZiAoYml0c3RyZWFtX3JlYWRfdG1wKSB7CisJCQlkbWFfdW5tYXBfc2luZ2xlKGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQliaXRzdHJlYW1fcmVhZF90bXBfcGh5LAorCQkJCVNWQV9TVFJFQU1fQlVGX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJCQlrZnJlZShiaXRzdHJlYW1fcmVhZF90bXApOworCQkJYml0c3RyZWFtX3JlYWRfdG1wID0gTlVMTDsKKwkJfQorI2VuZGlmCisJfQorI2VuZGlmCisJaWYgKGh3LT5zdGF0ICYgU1RBVF9WRl9IT09LKSB7CisJCWlmIChody0+ZnJfaGludF9zdGF0dXMgPT0gVkRFQ19ISU5URUQgJiYgIWh3LT5pc19yZXNldCkKKwkJCWF2c192Zl9ub3RpZnlfcmVjZWl2ZXIoaHcsIFBST1ZJREVSX05BTUUsCisJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX0ZSX0VORF9ISU5ULCBOVUxMKTsKKwkJaHctPmZyX2hpbnRfc3RhdHVzID0gVkRFQ19OT19ORUVEX0hJTlQ7CisJCXZmX3VucmVnX3Byb3ZpZGVyKCZ2YXZzX3ZmX3Byb3YpOworCQlody0+c3RhdCAmPSB+U1RBVF9WRl9IT09LOworCX0KKworI2lmZGVmIEVOQUJMRV9VU0VSX0RBVEEKKwlpZiAoaHctPnVzZXJfZGF0YV9idWZmZXIgIT0gTlVMTCkgeworCQlkbWFfZnJlZV9jb2hlcmVudCgKKwkJCWFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCVVTRVJfREFUQV9TSVpFLAorCQkJaHctPnVzZXJfZGF0YV9idWZmZXIsCisJCQlody0+dXNlcl9kYXRhX2J1ZmZlcl9waHlzKTsKKwkJaHctPnVzZXJfZGF0YV9idWZmZXIgPSBOVUxMOworCQlody0+dXNlcl9kYXRhX2J1ZmZlcl9waHlzID0gMDsKKwl9CisjZW5kaWYKKworCWlmIChody0+ZncpIHsKKwkJdmZyZWUoaHctPmZ3KTsKKwkJaHctPmZ3ID0gTlVMTDsKKwl9CisKKwlhbXZkZWNfZGlzYWJsZSgpOworCS8qdmRlY19kaXNhYmxlX0RNQyhOVUxMKTsqLworCisJaHctPnBpY190eXBlID0gMDsKKwlpZiAoaHctPm1tX2Jsa19oYW5kbGUpIHsKKwkJZGVjb2Rlcl9ibW11X2JveF9mcmVlKGh3LT5tbV9ibGtfaGFuZGxlKTsKKwkJaHctPm1tX2Jsa19oYW5kbGUgPSBOVUxMOworCX0KKyNpZmRlZiBERUJVR19QVFMKKwlwcl9kZWJ1ZygicHRzIGhpdCAlZCwgcHRzIG1pc3NlZCAlZCwgaSBoaXQgJWQsIG1pc3NlZCAlZFxuIiwgaHctPnB0c19oaXQsCisJCSAgIGh3LT5wdHNfbWlzc2VkLCBody0+cHRzX2lfaGl0LCBody0+cHRzX2lfbWlzc2VkKTsKKwlwcl9kZWJ1ZygidG90YWwgZnJhbWUgJWQsIGh3LT5hdmlfZmxhZyAlZCwgcmF0ZSAlZFxuIiwgaHctPnRvdGFsX2ZyYW1lLCBody0+YXZpX2ZsYWcsCisJCSAgIGh3LT52YXZzX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUpOworI2VuZGlmCisJa2ZyZWUoaHctPmd2cyk7CisJaHctPmd2cyA9IE5VTEw7CisJdmZyZWUoaHcpOworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFtbXZkZWNfYXZzX2RyaXZlciA9IHsKKyNpZmRlZiBERUJVR19NVUxUSV9XSVRIX0FVVE9NT0RFCisJLnByb2JlID0gYW1tdmRlY19hdnNfcHJvYmUyLAorCS5yZW1vdmUgPSBhbW12ZGVjX2F2c19yZW1vdmUyLAorI2Vsc2UKKwkucHJvYmUgPSBhbW12ZGVjX2F2c19wcm9iZSwKKwkucmVtb3ZlID0gYW1tdmRlY19hdnNfcmVtb3ZlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBhbXZkZWNfc3VzcGVuZCwKKwkucmVzdW1lID0gYW12ZGVjX3Jlc3VtZSwKKyNlbmRpZgorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gTVVMVElfRFJJVkVSX05BTUUsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBjb2RlY19wcm9maWxlX3QgYW1tdmRlY19hdnNfcHJvZmlsZSA9IHsKKwkubmFtZSA9ICJtYXZzIiwKKwkucHJvZmlsZSA9ICIiCit9OworCitzdGF0aWMgc3RydWN0IG1jb25maWcgbWF2c19jb25maWdzW10gPSB7CisJLypNQ19QVTMyKCJzdGF0IiwgJnN0YXQpLAorCU1DX1BVMzIoImRlYnVnX2ZsYWciLCAmZGVidWdfZmxhZyksCisJTUNfUFUzMigiZXJyb3JfcmVjb3ZlcnlfbW9kZSIsICZlcnJvcl9yZWNvdmVyeV9tb2RlKSwKKwlNQ19QVTMyKCJody0+cGljX3R5cGUiLCAmaHctPnBpY190eXBlKSwKKwlNQ19QVTMyKCJyYWRyIiwgJnJhZHIpLAorCU1DX1BVMzIoInZmX2J1Zl9udW0iLCAmdmZfYnVmX251bSksCisJTUNfUFUzMigidmZfYnVmX251bV91c2VkIiwgJnZmX2J1Zl9udW1fdXNlZCksCisJTUNfUFUzMigiY2FudmFzX2Jhc2UiLCAmY2FudmFzX2Jhc2UpLAorCU1DX1BVMzIoImZpcm13YXJlX3NlbCIsICZmaXJtd2FyZV9zZWwpLAorCSovCit9Oworc3RhdGljIHN0cnVjdCBtY29uZmlnX25vZGUgbWF2c19ub2RlOworCisKK3N0YXRpYyBpbnQgX19pbml0IGFtbXZkZWNfYXZzX2RyaXZlcl9pbml0X21vZHVsZSh2b2lkKQoreworCXByX2RlYnVnKCJhbW12ZGVjX2F2cyBtb2R1bGUgaW5pdFxuIik7CisKKwlpZiAocGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhbW12ZGVjX2F2c19kcml2ZXIpKQorCQlwcl9lcnIoImZhaWxlZCB0byByZWdpc3RlciBhbW12ZGVjX2F2cyBkcml2ZXJcbiIpOworI2lmZGVmIERFQlVHX1dJVEhfU0lOR0xFX01PREUKKwlpZiAocGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhbXZkZWNfYXZzX2RyaXZlcikpIHsKKwkJcHJfaW5mbygiZmFpbGVkIHRvIHJlZ2lzdGVyIGFtdmRlY19hdnMgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorI2Vsc2UKKwkvL2FtdmRlY19hdnNfZHJpdmVyID0gYW12ZGVjX2F2c19kcml2ZXI7CisjZW5kaWYKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWEJCKQorCQlhbW12ZGVjX2F2c19wcm9maWxlLnByb2ZpbGUgPSAibWF2cysiOworCisJdmNvZGVjX3Byb2ZpbGVfcmVnaXN0ZXIoJmFtbXZkZWNfYXZzX3Byb2ZpbGUpOworCUlOSVRfUkVHX05PREVfQ09ORklHUygibWVkaWEuZGVjb2RlciIsICZtYXZzX25vZGUsCisJCSJtYXZzIiwgbWF2c19jb25maWdzLCBDT05GSUdfRk9SX1JXKTsKKwl2Y29kZWNfZmVhdHVyZV9yZWdpc3RlcihWRk9STUFUX0FWUywgMCk7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgdm9pZCBfX2V4aXQgYW1tdmRlY19hdnNfZHJpdmVyX3JlbW92ZV9tb2R1bGUodm9pZCkKK3sKKwlwcl9kZWJ1ZygiYW1tdmRlY19hdnMgbW9kdWxlIHJlbW92ZS5cbiIpOworCisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFtbXZkZWNfYXZzX2RyaXZlcik7CisjaWZkZWYgREVCVUdfV0lUSF9TSU5HTEVfTU9ERQorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhbXZkZWNfYXZzX2RyaXZlcik7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorbW9kdWxlX3BhcmFtKHN0YXQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhzdGF0LCAiXG4gYW12ZGVjX2F2cyBzdGF0XG4iKTsKKyovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKm1vZHVsZV9wYXJhbShydW5fZmxhZywgdWludCwgMDY2NCk7CisgKk1PRFVMRV9QQVJNX0RFU0MocnVuX2ZsYWcsICJcbiBydW5fZmxhZ1xuIik7CisgKgorICptb2R1bGVfcGFyYW0oc3RlcF9mbGFnLCB1aW50LCAwNjY0KTsKKyAqTU9EVUxFX1BBUk1fREVTQyhzdGVwX2ZsYWcsICJcbiBzdGVwX2ZsYWdcbiIpOworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworbW9kdWxlX3BhcmFtKHN0ZXAsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhzdGVwLCAiXG4gc3RlcFxuIik7CisKK21vZHVsZV9wYXJhbShkZWJ1ZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiXG4gZGVidWdcbiIpOworCittb2R1bGVfcGFyYW0oZGVidWdfbWFzaywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnX21hc2ssICJcbiBkZWJ1Z19tYXNrXG4iKTsKKworbW9kdWxlX3BhcmFtKGVycm9yX3JlY292ZXJ5X21vZGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhlcnJvcl9yZWNvdmVyeV9tb2RlLCAiXG4gZXJyb3JfcmVjb3ZlcnlfbW9kZVxuIik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqbW9kdWxlX3BhcmFtKGVycm9yX3dhdGNoZG9nX3RocmVzaG9sZCwgdWludCwgMDY2NCk7CisgKk1PRFVMRV9QQVJNX0RFU0MoZXJyb3Jfd2F0Y2hkb2dfdGhyZXNob2xkLCAiXG4gZXJyb3Jfd2F0Y2hkb2dfdGhyZXNob2xkXG4iKTsKKyAqCisgKm1vZHVsZV9wYXJhbShlcnJvcl93YXRjaGRvZ19idWZfdGhyZXNob2xkLCB1aW50LCAwNjY0KTsKKyAqTU9EVUxFX1BBUk1fREVTQyhlcnJvcl93YXRjaGRvZ19idWZfdGhyZXNob2xkLAorICoJCQkiXG4gZXJyb3Jfd2F0Y2hkb2dfYnVmX3RocmVzaG9sZFxuIik7CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisvKgorbW9kdWxlX3BhcmFtKHBpY190eXBlLCB1aW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocGljX3R5cGUsICJcbiBhbWRlY192YXMgcGljdHVyZSB0eXBlXG4iKTsKKyovCittb2R1bGVfcGFyYW0ocmFkciwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJhZHIsICJcbnJhZHJcbiIpOworCittb2R1bGVfcGFyYW0ocnZhbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJ2YWwsICJcbnJ2YWxcbiIpOworCittb2R1bGVfcGFyYW0oZGJnX2NtZCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRiZ19jbWQsICJcbiBkYmdfY21kXG4iKTsKKworbW9kdWxlX3BhcmFtKHZmX2J1Zl9udW0sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh2Zl9idWZfbnVtLCAiXG52Zl9idWZfbnVtXG4iKTsKKworLyoKK21vZHVsZV9wYXJhbSh2Zl9idWZfbnVtX3VzZWQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh2Zl9idWZfbnVtX3VzZWQsICJcbnZmX2J1Zl9udW1fdXNlZFxuIik7CisqLworbW9kdWxlX3BhcmFtKGNhbnZhc19iYXNlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoY2FudmFzX2Jhc2UsICJcbmNhbnZhc19iYXNlXG4iKTsKKworCittb2R1bGVfcGFyYW0oZmlybXdhcmVfc2VsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZmlybXdhcmVfc2VsLCAiXG4gZmlybXdhcmVfc2VsXG4iKTsKKworbW9kdWxlX3BhcmFtKGRpc2FibGVfbG9uZ2NhYmFjX3RyYW5zLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGlzYWJsZV9sb25nY2FiYWNfdHJhbnMsICJcbiBkaXNhYmxlX2xvbmdjYWJhY190cmFuc1xuIik7CisKK21vZHVsZV9wYXJhbShkZWNfY29udHJvbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlY19jb250cm9sLCAiXG4gYW12ZGVjX3ZhdnMgZGVjb2RlciBjb250cm9sXG4iKTsKKworbW9kdWxlX3BhcmFtKHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwsCisJCSJcbiBhdnMgc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbFxuIik7CisKK21vZHVsZV9wYXJhbShkZWNvZGVfdGltZW91dF92YWwsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkZWNvZGVfdGltZW91dF92YWwsCisJIlxuIGF2cyBkZWNvZGVfdGltZW91dF92YWxcbiIpOworCittb2R1bGVfcGFyYW0oZXJyb3JfaGFuZGxlX3BvbGljeSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVycm9yX2hhbmRsZV9wb2xpY3ksCisJIlxuIGF2cyBlcnJvcl9oYW5kbGVfcG9saWN5XG4iKTsKKworbW9kdWxlX3BhcmFtKGFnYWluX3RocmVzaG9sZCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGFnYWluX3RocmVzaG9sZCwgIlxuIGFnYWluX3RocmVzaG9sZFxuIik7CisKK21vZHVsZV9wYXJhbSh1ZGVidWdfZmxhZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHVkZWJ1Z19mbGFnLCAiXG4gYW12ZGVjX2gyNjUgdWRlYnVnX2ZsYWdcbiIpOworCittb2R1bGVfcGFyYW0odWRlYnVnX3BhdXNlX3BvcywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHVkZWJ1Z19wYXVzZV9wb3MsICJcbiB1ZGVidWdfcGF1c2VfcG9zXG4iKTsKKworbW9kdWxlX3BhcmFtKHVkZWJ1Z19wYXVzZV92YWwsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh1ZGVidWdfcGF1c2VfdmFsLCAiXG4gdWRlYnVnX3BhdXNlX3ZhbFxuIik7CisKK21vZHVsZV9wYXJhbSh1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4LCAiXG4gdWRlYnVnX3BhdXNlX2RlY29kZV9pZHhcbiIpOworCittb2R1bGVfcGFyYW0odWRlYnVnX3BhdXNlX2luc19pZCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHVkZWJ1Z19wYXVzZV9pbnNfaWQsICJcbiB1ZGVidWdfcGF1c2VfaW5zX2lkXG4iKTsKKworbW9kdWxlX3BhcmFtKHN0YXJ0X2RlY29kaW5nX2RlbGF5LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3RhcnRfZGVjb2RpbmdfZGVsYXksICJcbiBzdGFydF9kZWNvZGluZ19kZWxheVxuIik7CisKK21vZHVsZV9wYXJhbShwcmVfZGVjb2RlX2J1Zl9sZXZlbCwgaW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocHJlX2RlY29kZV9idWZfbGV2ZWwsCisJCQkJIlxuIGFtbXZkZWNfbWF2cyBwcmVfZGVjb2RlX2J1Zl9sZXZlbFxuIik7CisKKworI2lmZGVmIERFQlVHX01VTFRJX1dJVEhfQVVUT01PREUKK21vZHVsZV9wYXJhbShkZWJ1Z19mbGFnMiwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnX2ZsYWcyLCAiXG4gZGVidWdfZmxhZzJcbiIpOworI2VuZGlmCittb2R1bGVfcGFyYW0oZm9yY2VfZnBzLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2VfZnBzLCAiXG4gZm9yY2VfZnBzXG4iKTsKKworI2lmZGVmIERFQlVHX01VTFRJX0ZSQU1FX0lOUworbW9kdWxlX3BhcmFtKGRlbGF5LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVsYXksICJcbiBkZWxheVxuIik7CisKK21vZHVsZV9wYXJhbV9hcnJheShtYXhfcnVuX2NvdW50LCB1aW50LCAmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCisjZW5kaWYKKworbW9kdWxlX3BhcmFtX2FycmF5KGluc191ZGVidWdfZmxhZywgdWludCwgJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtX2FycmF5KG1heF9wcm9jZXNzX3RpbWUsIHVpbnQsICZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisKK21vZHVsZV9wYXJhbV9hcnJheShydW5fY291bnQsIHVpbnQsICZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisKK21vZHVsZV9wYXJhbV9hcnJheShtYXhfZ2V0X2ZyYW1lX2ludGVydmFsLCB1aW50LAorCSZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisKKworbW9kdWxlX2luaXQoYW1tdmRlY19hdnNfZHJpdmVyX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGFtbXZkZWNfYXZzX2RyaXZlcl9yZW1vdmVfbW9kdWxlKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTUxPR0lDIEFWUyBWaWRlbyBEZWNvZGVyIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiUWkgV2FuZyA8cWkud2FuZ0BhbWxvZ2ljLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9hdnNfbXVsdGkvYXZzX211bHRpLmggYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvYXZzX211bHRpL2F2c19tdWx0aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MjJiNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvYXZzX211bHRpL2F2c19tdWx0aS5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNyBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisqIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyoKKyogRGVzY3JpcHRpb246CisqLworI2lmbmRlZiBBVlNfSF8KKyNkZWZpbmUgQVZTX0hfCisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19BVlNQX0xPTkdfQ0FCQUMKKyNkZWZpbmUgQVZTUF9MT05HX0NBQkFDCisjZW5kaWYKKy8qI2RlZmluZSBCSVRTVFJFQU1fUkVBRF9UTVBfTk9fQ0FDSEUqLworCisjaWZkZWYgQVZTUF9MT05HX0NBQkFDCisjZGVmaW5lIE1BWF9DT0RFRF9GUkFNRV9TSVpFIDE1MDAwMDAgICAgICAgICAvKiE8IGJ5dGVzIGZvciBvbmUgZnJhbWUqLworI2RlZmluZSBMT0NBTF9IRUFQX1NJWkUgICAgKDEwMjQqMTAyNCoxMCkKKy8qCisgKiNkZWZpbmUgTUFYX0NPREVEX0ZSQU1FX1NJWkUgIDI0MDAwMAorICojZGVmaW5lIE1BWF9DT0RFRF9GUkFNRV9TSVpFICA3MDAwMDAKKyAqLworI2RlZmluZSBTVkFfU1RSRUFNX0JVRl9TSVpFIDEwMjQKKworZXh0ZXJuIHZvaWQgKmVzX3dyaXRlX2FkZHJfdmlydDsKK2V4dGVybiBkbWFfYWRkcl90IGVzX3dyaXRlX2FkZHJfcGh5OworCitleHRlcm4gdm9pZCAqYml0c3RyZWFtX3JlYWRfdG1wOworZXh0ZXJuIGRtYV9hZGRyX3QgYml0c3RyZWFtX3JlYWRfdG1wX3BoeTsKK2V4dGVybiB2b2lkICphdnNwX2hlYXBfYWRyOworCitpbnQgYXZzX2dldF9kZWJ1Z19mbGFnKHZvaWQpOworCitpbnQgcHJvY2Vzc19sb25nX2NhYmFjKHZvaWQpOworCisvKiBiaXQgWzZdIC0gc2tpcF9tb2RlX2ZsYWcKKyAqIGJpdCBbNTo0XSAtIHBpY3R1cmVfdHlwZQorICogYml0IFszXSAtIHBpY3R1cmVfc3RydWN0dXJlICgwLUZpZWxkLCAxLUZyYW1lKQorICogYml0IFsyXSAtIGZpeGVkX3BpY3R1cmVfcXAKKyAqIGJpdCBbMV0gLSBwcm9ncmVzc2l2ZV9zZXF1ZW5jZQorICogYml0IFswXSAtIGFjdGl2ZQorICovCisjZGVmaW5lIExPTkdfQ0FCQUNfUkVRICAgICAgICBBVl9TQ1JBVENIX0sKKyNkZWZpbmUgTE9OR19DQUJBQ19TUkNfQUREUiAgIEFWX1NDUkFUQ0hfSAorI2RlZmluZSBMT05HX0NBQkFDX0RFU19BRERSICAgQVZfU0NSQVRDSF9JCisvKiBiaXRbMzE6MTZdIC0gdmVydGljYWxfc2l6ZQorICogYml0WzE1OjBdIC0gaG9yaXpvbnRhbF9zaXplCisgKi8KKyNkZWZpbmUgTE9OR19DQUJBQ19QSUNfU0laRSAgIEFWX1NDUkFUQ0hfSgorCisjZW5kaWYKKworLyoKKyAqI2RlZmluZSBQRVJGT1JNQU5DRV9ERUJVRworICojZGVmaW5lIERVTVBfREVCVUcKKyAqLworI2RlZmluZSBBVlNfREVCVUdfUFJJTlQgICAgICAgICAweDAxCisjZGVmaW5lIEFWU19ERUJVR19PTERfRVJST1JfSEFORExFCTB4MTAKKyNkZWZpbmUgQVZTX0RFQlVHX1VTRV9GVUxMX1NQRUVEIDB4ODAKKyNkZWZpbmUgQUVDX0RVTVAJCQkJMHgxMDAKKyNkZWZpbmUgU1RSRUFNX0lORk9fRFVNUAkJMHgyMDAKKyNkZWZpbmUgU0xJQ0VfSU5GT19EVU1QCQkJMHg0MDAKKyNkZWZpbmUgTUJfSU5GT19EVU1QCQkJMHg4MDAKKyNkZWZpbmUgTUJfTlVNX0RVTVAJCQkJMHgxMDAwCisjZGVmaW5lIEJMT0NLX05VTV9EVU1QCQkJMHgyMDAwCisjZGVmaW5lIENPRUZGX0RVTVAJCQkJMHg0MDAwCisjZGVmaW5lIEVTX0RVTVAJCQkJCTB4ODAwMAorI2RlZmluZSBEUVVBTlRfRFVNUAkJCQkweDEwMDAwCisjZGVmaW5lIFNUUkVBTV9JTkZPX0RVTVBfTU9SRSAgIDB4MjAwMDAKKyNkZWZpbmUgU1RSRUFNX0lORk9fRFVNUF9NT1JFMiAgMHg0MDAwMAorCitleHRlcm4gdm9pZCAqZXNfd3JpdGVfYWRkcl92aXJ0OworZXh0ZXJuIHZvaWQgKmJpdHN0cmVhbV9yZWFkX3RtcDsKK2V4dGVybiBkbWFfYWRkcl90IGJpdHN0cmVhbV9yZWFkX3RtcF9waHk7CitpbnQgcmVhZF9iaXRzdHJlYW0odW5zaWduZWQgY2hhciAqQnVmLCBpbnQgc2l6ZSk7CitpbnQgdV92KGludCBMZW5JbkJpdHMsIGNoYXIgKnRyYWNlc3RyaW5nKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvaDI2NC9NYWtlZmlsZSBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9oMjY0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3Yzg1ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvaDI2NC9NYWtlZmlsZQpAQCAtMCwwICsxLDYgQEAKK29iai0kKENPTkZJR19BTUxPR0lDX01FRElBX1ZERUNfSDI2NCkgKz0gYW12ZGVjX2gyNjQubworYW12ZGVjX2gyNjQtb2JqcyArPSB2aDI2NC5vCisKK29iai0kKENPTkZJR19BTUxPR0lDX01FRElBX1ZERUNfSDI2NF9NVkMpICs9IGFtdmRlY19oMjY0bXZjLm8KK2FtdmRlY19oMjY0bXZjLW9ianMgKz0gdmgyNjRfbXZjLm8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL2gyNjQvdmgyNjQuYyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9oMjY0L3ZoMjY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVmMDU4MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9oMjY0L3ZoMjY0LmMKQEAgLTAsMCArMSw0NTA5IEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL21lZGlhL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvaDI2NC92aDI2NC5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNkZWZpbmUgREVCVUcKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvYW1zdHJlYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2ZyYW1lX3N5bmMvcHRzc2Vydi5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdmZtL3ZmcmFtZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdmZtL3ZmcmFtZV9wcm92aWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdmZtL3ZmcmFtZV9yZWNlaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmZvcm1hdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZnJhbWVfc3luYy90c3luYy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgIi4uLy4uLy4uL3N0cmVhbV9pbnB1dC9hbXBvcnRzL2FtcG9ydHNfcHJpdi5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY2FudmFzL2NhbnZhcy5oPgorI2luY2x1ZGUgIi4uL3V0aWxzL3ZkZWMuaCIKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL3ZkZWNfcmVnLmg+CisjaW5jbHVkZSAiLi4vdXRpbHMvYW12ZGVjLmgiCisjaW5jbHVkZSAidmgyNjQuaCIKKyNpbmNsdWRlICIuLi8uLi8uLi9zdHJlYW1faW5wdXQvYW1wb3J0cy9zdHJlYW1idWYuaCIKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdmlkZW9fc2luay92aWRlby5oPgorLy8jaW5jbHVkZSA8bGludXgvYW1sb2dpYy90ZWUuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L3RlZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZ2UyZC9nZTJkLmg+CisjaW5jbHVkZSAiLi4vdXRpbHMvZGVjb2Rlcl9tbXVfYm94LmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvZGVjb2Rlcl9ibW11X2JveC5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29kZWNfbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvbmZpZ3MuaD4KKyNpbmNsdWRlICIuLi91dGlscy9maXJtd2FyZS5oIgorI2luY2x1ZGUgIi4uLy4uLy4uL2NvbW1vbi9jaGlwcy9kZWNvZGVyX2NwdV92ZXJfaW5mby5oIgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKworI2RlZmluZSBEUklWRVJfTkFNRSAiYW12ZGVjX2gyNjQiCisjZGVmaW5lIE1PRFVMRV9OQU1FICJhbXZkZWNfaDI2NCIKKyNkZWZpbmUgTUVNX05BTUUgImNvZGVjXzI2NCIKKyNkZWZpbmUgSEFORExFX0gyNjRfSVJRCisKKyNpZiAwCisvKiBjdXJyZW50bHksIG9ubHkgaXB0diBzdXBwb3J0cyB0aGlzIGZ1bmN0aW9uKi8KKyNkZWZpbmUgU1VQUE9SVF9CQURfTUFDUk9fQkxPQ0tfUkVEVU5EQU5DWQorI2VuZGlmCisKKy8qICNkZWZpbmUgREVCVUdfUFRTICovCisjaWYgMCAvKiBNRVNPTl9DUFVfVFlQRSA8PSBNRVNPTl9DUFVfVFlQRV9NRVNPTjZUViAqLworI2RlZmluZSBEUk9QX0JfRlJBTUVfRk9SXzEwODBQXzUwXzYwRlBTCisjZW5kaWYKKyNkZWZpbmUgUkFURV9NRUFTVVJFX05VTSA4CisjZGVmaW5lIFJBVEVfQ09SUkVDVElPTl9USFJFU0hPTEQgNQorI2RlZmluZSBSQVRFXzI0X0ZQUyAgNDAwNAkvKiAyMy45NyAqLworI2RlZmluZSBSQVRFXzI1X0ZQUyAgMzg0MAkvKiAyNSAqLworI2RlZmluZSBEVVIyUFRTKHgpICgoeCkqOTAvOTYpCisjZGVmaW5lIFBUUzJEVVIoeCkgKCh4KSo5Ni85MCkKKyNkZWZpbmUgRFVSMlBUU19SRU0oeCkgKHgqOTAgLSBEVVIyUFRTKHgpKjk2KQorI2RlZmluZSBGSVhfRlJBTUVfUkFURV9DSEVDS19JRFJGUkFNRV9OVU0gMgorI2RlZmluZSBWREVDX0NMT0NLX0FESlVTVF9GUkFNRSAzMAorCitzdGF0aWMgaW5saW5lIGJvb2wgY2xvc2VfdG8oaW50IGEsIGludCBiLCBpbnQgbSkKK3sKKwlyZXR1cm4gKGFicyhhIC0gYikgPCBtKSA/IHRydWUgOiBmYWxzZTsKK30KKworc3RhdGljIERFRklORV9NVVRFWCh2aDI2NF9tdXRleCk7CisjZGVmaW5lIERFRl9CVUZfU1RBUlRfQUREUiAgICAgICAgICAgIDB4MTAwMDAwMAorI2RlZmluZSBWX0JVRl9BRERSX09GRlNFVF9ORVcgICAgICAgICAoMHgxZWUwMDApCisjZGVmaW5lIFZfQlVGX0FERFJfT0ZGU0VUICAgICAgICAgICAgICgweDEzZTAwMCkKKworI2RlZmluZSBQSUNfU0lOR0xFX0ZSQU1FICAgICAgICAwCisjZGVmaW5lIFBJQ19UT1BfQk9UX1RPUCAgICAgICAgIDEKKyNkZWZpbmUgUElDX0JPVF9UT1BfQk9UICAgICAgICAgMgorI2RlZmluZSBQSUNfRE9VQkxFX0ZSQU1FICAgICAgICAzCisjZGVmaW5lIFBJQ19UUklQTEVfRlJBTUUgICAgICAgIDQKKyNkZWZpbmUgUElDX1RPUF9CT1QgICAgICAgICAgICAgIDUKKyNkZWZpbmUgUElDX0JPVF9UT1AgICAgICAgICAgICAgIDYKKyNkZWZpbmUgUElDX0lOVkFMSUQgICAgICAgICAgICAgIDcKKworI2RlZmluZSBFWFRFTkRfU0FSICAgICAgICAgICAgICAgICAgICAgIDB4ZmYKKworI2RlZmluZSBWRl9QT09MX1NJWkUgICAgICAgIDY0CisjZGVmaW5lIFZGX0JVRl9OVU0gICAgICAgICAgMjQKKyNkZWZpbmUgV09SS1NQQUNFX0JVRl9OVU0JMgorI2RlZmluZSBQVVRfSU5URVJWQUwgICAgICAgIChIWi8xMDApCisjZGVmaW5lIE5PX0RJU1BfV0RfQ09VTlQgICAgKDMgKiBIWiAvIFBVVF9JTlRFUlZBTCkKKworI2RlZmluZSBTV0lUQ0hJTkdfU1RBVEVfT0ZGICAgICAgIDAKKyNkZWZpbmUgU1dJVENISU5HX1NUQVRFX09OX0NNRDMgICAxCisjZGVmaW5lIFNXSVRDSElOR19TVEFURV9PTl9DTUQxICAgMgorI2RlZmluZSBTV0lUQ0hJTkdfU1RBVEVfT05fQ01EMV9QRU5ESU5HICAgMworCisKKyNkZWZpbmUgREVDX0NPTlRST0xfRkxBR19GT1JDRV8yOTk3XzEwODBQX0lOVEVSTEFDRSAweDAwMDEKKyNkZWZpbmUgREVDX0NPTlRST0xfRkxBR19GT1JDRV8yNTAwXzU3NlBfSU5URVJMQUNFICAweDAwMDIKKyNkZWZpbmUgREVDX0NPTlRST0xfRkxBR19ESVNBQkxFX0ZBU1RfUE9DICAgICAgICAgICAgICAweDAwMDQKKworI2RlZmluZSBJTkNQVFIocCkgcHRyX2F0b21pY193cmFwX2luYygmcCkKKworI2RlZmluZSBTTElDRV9UWVBFX0kgMgorI2RlZmluZSBTTElDRV9UWVBFX1AgNQorI2RlZmluZSBTTElDRV9UWVBFX0IgNgorCitzdHJ1Y3QgYnVmZmVyX3NwZWNfcyB7CisJdW5zaWduZWQgaW50IHlfYWRkcjsKKwl1bnNpZ25lZCBpbnQgdV9hZGRyOworCXVuc2lnbmVkIGludCB2X2FkZHI7CisKKwlpbnQgeV9jYW52YXNfaW5kZXg7CisJaW50IHVfY2FudmFzX2luZGV4OworCWludCB2X2NhbnZhc19pbmRleDsKKworCXVuc2lnbmVkIGludCB5X2NhbnZhc193aWR0aDsKKwl1bnNpZ25lZCBpbnQgdV9jYW52YXNfd2lkdGg7CisJdW5zaWduZWQgaW50IHZfY2FudmFzX3dpZHRoOworCisJdW5zaWduZWQgaW50IHlfY2FudmFzX2hlaWdodDsKKwl1bnNpZ25lZCBpbnQgdV9jYW52YXNfaGVpZ2h0OworCXVuc2lnbmVkIGludCB2X2NhbnZhc19oZWlnaHQ7CisKKwl1bnNpZ25lZCBsb25nIHBoeV9hZGRyOworCWludCBhbGxvY19jb3VudDsKK307CisKKyNkZWZpbmUgc3BlYzJjYW52YXMoeCkgIFwKKwkoKCh4KS0+dl9jYW52YXNfaW5kZXggPDwgMTYpIHwgXAorCSAoKHgpLT51X2NhbnZhc19pbmRleCA8PCA4KSAgfCBcCisJICgoeCktPnlfY2FudmFzX2luZGV4IDw8IDApKQorCitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2aDI2NF92Zl9wZWVrKHZvaWQgKik7CitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2aDI2NF92Zl9nZXQodm9pZCAqKTsKK3N0YXRpYyB2b2lkIHZoMjY0X3ZmX3B1dChzdHJ1Y3QgdmZyYW1lX3MgKiwgdm9pZCAqKTsKK3N0YXRpYyBpbnQgdmgyNjRfdmZfc3RhdGVzKHN0cnVjdCB2ZnJhbWVfc3RhdGVzICpzdGF0ZXMsIHZvaWQgKik7CitzdGF0aWMgaW50IHZoMjY0X2V2ZW50X2NiKGludCB0eXBlLCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlX2RhdGEpOworCitzdGF0aWMgdm9pZCB2aDI2NF9wcm90X2luaXQodm9pZCk7CitzdGF0aWMgaW50IHZoMjY0X2xvY2FsX2luaXQodm9pZCk7CitzdGF0aWMgdm9pZCB2aDI2NF9wdXRfdGltZXJfZnVuYyhzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpOworc3RhdGljIHZvaWQgc3RyZWFtX3N3aXRjaGluZ19kb25lKHZvaWQpOworCitzdGF0aWMgY29uc3QgY2hhciB2aDI2NF9kZWNfaWRbXSA9ICJ2aDI2NC1kZXYiOworCisjZGVmaW5lIFBST1ZJREVSX05BTUUgICAiZGVjb2Rlci5oMjY0IgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHZmcmFtZV9vcGVyYXRpb25zX3MgdmgyNjRfdmZfcHJvdmlkZXJfb3BzID0geworCS5wZWVrID0gdmgyNjRfdmZfcGVlaywKKwkuZ2V0ID0gdmgyNjRfdmZfZ2V0LAorCS5wdXQgPSB2aDI2NF92Zl9wdXQsCisJLmV2ZW50X2NiID0gdmgyNjRfZXZlbnRfY2IsCisJLnZmX3N0YXRlcyA9IHZoMjY0X3ZmX3N0YXRlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3Byb3ZpZGVyX3MgdmgyNjRfdmZfcHJvdjsKKy8qVE9ETyBpcnEqLworI2lmIDEKK3N0YXRpYyB1MzIgZnJhbWVfd2lkdGgsIGZyYW1lX2hlaWdodCwgZnJhbWVfZHVyLCBmcmFtZV9wcm9nLCBmcmFtZV9wYWNraW5nX3R5cGUsCisJICAgbGFzdF9kdXJhdGlvbjsKK3N0YXRpYyB1MzIgc2F2ZWRfcmVzb2x1dGlvbjsKK3N0YXRpYyB1MzIgbGFzdF9tYl93aWR0aCwgbGFzdF9tYl9oZWlnaHQ7CisjZWxzZQorc3RhdGljIHUzMiBmcmFtZV9idWZmZXJfc2l6ZTsKK3N0YXRpYyB1MzIgZnJhbWVfd2lkdGgsIGZyYW1lX2hlaWdodCwgZnJhbWVfZHVyLCBmcmFtZV9wcm9nLCBsYXN0X2R1cmF0aW9uOworc3RhdGljIHUzMiBsYXN0X21iX3dpZHRoLCBsYXN0X21iX2hlaWdodDsKK3N0YXRpYyB1MzIgZnJhbWVfcGFja2luZ190eXBlOworI2VuZGlmCitzdGF0aWMgREVDTEFSRV9LRklGTyhuZXdmcmFtZV9xLCBzdHJ1Y3QgdmZyYW1lX3MgKiwgVkZfUE9PTF9TSVpFKTsKK3N0YXRpYyBERUNMQVJFX0tGSUZPKGRpc3BsYXlfcSwgc3RydWN0IHZmcmFtZV9zICosIFZGX1BPT0xfU0laRSk7CitzdGF0aWMgREVDTEFSRV9LRklGTyhyZWN5Y2xlX3EsIHN0cnVjdCB2ZnJhbWVfcyAqLCBWRl9QT09MX1NJWkUpOworc3RhdGljIERFQ0xBUkVfS0ZJRk8oZGVsYXlfZGlzcGxheV9xLCBzdHJ1Y3QgdmZyYW1lX3MgKiwgVkZfUE9PTF9TSVpFKTsKKworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyB2ZnBvb2xbVkZfUE9PTF9TSVpFXTsKK3N0YXRpYyBzMzIgdmZidWZfdXNlW1ZGX0JVRl9OVU1dOworc3RhdGljIHN0cnVjdCBidWZmZXJfc3BlY19zIGJ1ZmZlcl9zcGVjW1ZGX0JVRl9OVU1dOworc3RhdGljIHN0cnVjdCBidWZmZXJfc3BlY19zIGZlbnNlX2J1ZmZlcl9zcGVjWzJdOworLyogZGlzcCBidWYgKyBrZWVwIGJ1ZisgZmVuc2UgYnVmICsgd29ya3NwYWNlICAqLworCisjZGVmaW5lIE1BWF9CTEtfQlVGRkVSUyAoVkZfQlVGX05VTSArIDIgKyBXT1JLU1BBQ0VfQlVGX05VTSkKKyNkZWZpbmUgVkZfQlVGRkVSX0lEWChuKSAoV09SS1NQQUNFX0JVRl9OVU0gICsgbikKKyNkZWZpbmUgRkVOU0VfQlVGRkVSX0lEWChuKSAoV09SS1NQQUNFX0JVRl9OVU0gKyBWRl9CVUZfTlVNICsgbikKKworI2RlZmluZSBVU0VSX0RBVEFfUlVORF9TSVpFCQkoVVNFUl9EQVRBX1NJWkUgKyA0MDk2KQorc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyBmZW5zZV92ZlsyXTsKKworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHJlY3ljbGVfdGltZXI7CitzdGF0aWMgdTMyIHN0YXQ7CitzdGF0aWMgczMyIGJ1Zl9vZmZzZXQ7CitzdGF0aWMgdTMyIHB0c19vdXRzaWRlOworc3RhdGljIHUzMiBzeW5jX291dHNpZGU7CitzdGF0aWMgdTMyIGRlY19jb250cm9sOworc3RhdGljIHUzMiB2aDI2NF9yYXRpbzsKK3N0YXRpYyB1MzIgdmgyNjRfcm90YXRpb247CitzdGF0aWMgdTMyIHVzZV9pZHJfZnJhbWVyYXRlOworc3RhdGljIHUzMiBoaWdoX2JhbmR3aWR0aDsKKworc3RhdGljIHUzMiBzZXFfaW5mbzsKK3N0YXRpYyB1MzIgdGltaW5nX2luZm9fcHJlc2VudF9mbGFnOworc3RhdGljIHUzMiBmaXhlZF9mcmFtZV9yYXRlX2ZsYWc7CitzdGF0aWMgdTMyIGZpeGVkX2ZyYW1lX3JhdGVfY2hlY2tfY291bnQ7CitzdGF0aWMgdTMyIGFzcGVjdF9yYXRpb19pbmZvOworc3RhdGljIHUzMiBudW1fdW5pdHNfaW5fdGljazsKK3N0YXRpYyB1MzIgdGltZV9zY2FsZTsKK3N0YXRpYyB1MzIgaDI2NF9hcjsKK3N0YXRpYyB1MzIgZGVjb2Rlcl9kZWJ1Z19mbGFnOworc3RhdGljIHUzMiBkcGJfc2l6ZV9hZGogPSA2Oworc3RhdGljIHUzMiBmcl9oaW50X3N0YXR1czsKKworI2lmZGVmIERST1BfQl9GUkFNRV9GT1JfMTA4MFBfNTBfNjBGUFMKK3N0YXRpYyB1MzIgbGFzdF9pbnRlcmxhY2VkOworI2VuZGlmCitzdGF0aWMgYm9vbCBpc180azsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGgyNjRfZmlyc3RfcHRzX3JlYWR5Oworc3RhdGljIGJvb2wgaDI2NF9maXJzdF92YWxpZF9wdHNfcmVhZHk7CitzdGF0aWMgdTMyIGgyNjRwdHMxLCBoMjY0cHRzMjsKK3N0YXRpYyB1MzIgaDI2NF9wdHNfY291bnQsIGR1cmF0aW9uX2Zyb21fcHRzX2RvbmUsIGR1cmF0aW9uX29uX2NvcnJlY3Rpbmc7CitzdGF0aWMgdTMyIHZoMjY0X2Vycm9yX2NvdW50Oworc3RhdGljIHUzMiB2aDI2NF9ub19kaXNwX2NvdW50Oworc3RhdGljIHUzMiBmYXRhbF9lcnJvcl9mbGFnOworc3RhdGljIHUzMiBmYXRhbF9lcnJvcl9yZXNldDsKK3N0YXRpYyB1MzIgbWF4X3JlZmVyX2J1ZiA9IDE7CitzdGF0aWMgdTMyIGRlY29kZXJfZm9yY2VfcmVzZXQ7CitzdGF0aWMgdW5zaWduZWQgaW50IG5vX2lkcl9lcnJvcl9jb3VudDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9faWRyX2Vycm9yX21heCA9IDYwOworc3RhdGljIHVuc2lnbmVkIGludCBjYW52YXNfbW9kZTsKKworI2lmZGVmIFNVUFBPUlRfQkFEX01BQ1JPX0JMT0NLX1JFRFVOREFOQ1kKKy8qIDB+MTI4Ki8KK3N0YXRpYyB1MzIgYmFkX2Jsb2NrX3NjYWxlOworI2VuZGlmCitzdGF0aWMgdTMyIGVuYWJsZV91c2VyZGF0YV9kZWJ1ZzsKKworc3RhdGljIHVuc2lnbmVkIGludCBlbmFibGVfc3dpdGNoX2ZlbnNlID0gMTsKKyNkZWZpbmUgRU5fU1dJVENIX0ZFTkNFKCkgKGVuYWJsZV9zd2l0Y2hfZmVuc2UgJiYgIWlzXzRrKQorc3RhdGljIHN0cnVjdCB2ZnJhbWVfcW9zX3Mgc192ZnJhbWVfcW9zOworc3RhdGljIGludCBmcmFtZV9jb3VudDsKKworI2lmIDAKK3N0YXRpYyB1MzIgdmgyNjRfbm9fZGlzcF93ZF9jb3VudDsKKyNlbmRpZgorc3RhdGljIHUzMiB2aDI2NF9ydW5uaW5nOworc3RhdGljIHMzMiB2aDI2NF9zdHJlYW1fc3dpdGNoaW5nX3N0YXRlOworc3RhdGljIHMzMiB2aDI2NF9lb3M7CitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICpwX2xhc3RfdmY7CitzdGF0aWMgczMyIGlwb25seV9lYXJseV9tb2RlOworc3RhdGljIHZvaWQgKm1tX2Jsa19oYW5kbGU7CitzdGF0aWMgaW50IHR2cF9mbGFnOworc3RhdGljIGJvb2wgaXNfcmVzZXQ7CisKKy8qVE9ETyBpcnEqLworI2lmIDEKK3N0YXRpYyB1MzIgbGFzdF9wdHMsIGxhc3RfcHRzX3JlbWFpbmRlcjsKKyNlbHNlCitzdGF0aWMgdTMyIGxhc3RfcHRzOworI2VuZGlmCitzdGF0aWMgYm9vbCBjaGVja19wdHNfZGlzY29udGludWU7CitzdGF0aWMgdTMyIHdhaXRfYnVmZmVyX2NvdW50ZXI7CitzdGF0aWMgdTMyIHZpZGVvX3NpZ25hbF9mcm9tX3Z1aTsKKworc3RhdGljIHVpbnQgZXJyb3JfcmVjb3ZlcnlfbW9kZTsKK3N0YXRpYyB1aW50IGVycm9yX3JlY292ZXJ5X21vZGVfaW4gPSAzOworc3RhdGljIHVpbnQgZXJyb3JfcmVjb3ZlcnlfbW9kZV91c2UgPSAzOworCitzdGF0aWMgdWludCBtYl90b3RhbCA9IDAsIG1iX3dpZHRoID0gMCwgbWJfaGVpZ2h0Oworc3RhdGljIHVpbnQgc2F2ZWRfaWRjX2xldmVsOworI2RlZmluZSBVQ09ERV9JUF9PTkxZIDIKKyNkZWZpbmUgVUNPREVfSVBfT05MWV9QQVJBTSAxCitzdGF0aWMgdWludCB1Y29kZV90eXBlOworCisjaWZkZWYgREVCVUdfUFRTCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwdHNfbWlzc2VkLCBwdHNfaGl0OworI2VuZGlmCitzdGF0aWMgdWludCBkZWJ1Z2Zpcm13YXJlOworCitzdGF0aWMgYXRvbWljX3QgdmgyNjRfYWN0aXZlID0gQVRPTUlDX0lOSVQoMCk7CitzdGF0aWMgaW50IHZoMjY0X3Jlc2V0Oworc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBlcnJvcl93ZF93b3JrOworc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBzdHJlYW1fc3dpdGNoaW5nX3dvcms7CitzdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IHNldF9wYXJhbWV0ZXJfd29yazsKK3N0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3Qgbm90aWZ5X3dvcms7CitzdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IHNldF9jbGtfd29yazsKK3N0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3QgdXNlcmRhdGFfcHVzaF93b3JrOworCitzdHJ1Y3QgaDI2NF9xb3NfZGF0YV9ub2RlX3QgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworCXVpbnQzMl90IGJfb2Zmc2V0OworCWludCBwb2M7CisJLyogcGljdHVyZSBxb3MgaW5mb21hdGlvbiovCisJaW50IG1heF9xcDsKKwlpbnQgYXZnX3FwOworCWludCBtaW5fcXA7CisJaW50IG1heF9za2lwOworCWludCBhdmdfc2tpcDsKKwlpbnQgbWluX3NraXA7CisJaW50IG1heF9tdjsKKwlpbnQgbWluX212OworCWludCBhdmdfbXY7Cit9OworCisvKnFvcyBkYXRhIHJlY29yZHMgbGlzdCB3YWl0aW5nIGZvciBtYXRjaCB3aXRoIHBpY3R1cmUgdGhhdCBiZSBkaXNwbGF5Ki8KK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHBpY3R1cmVfcW9zX2xpc3Q7CisvKmZyZWUgcW9zIGRhdGEgcmVjb3JkcyBsaXN0Ki8KK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfcW9zX25vZGVzX2xpc3Q7CisjZGVmaW5lIE1BWF9GUkVFX1FPU19OT0RFUwkJNjQKK3N0YXRpYyBzdHJ1Y3QgaDI2NF9xb3NfZGF0YV9ub2RlX3QgZnJlZV9ub2Rlc1tNQVhfRlJFRV9RT1NfTk9ERVNdOworc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBxb3Nfd29yazsKK3N0YXRpYyBzdHJ1Y3QgZGVjX3N5c2luZm8gdmgyNjRfYW1zdHJlYW1fZGVjX2luZm87CitzdGF0aWMgZG1hX2FkZHJfdCBtY19kbWFfaGFuZGxlOworc3RhdGljIHZvaWQgKm1jX2NwdV9hZGRyOworc3RhdGljIHUzMiBmaXJzdF9vZmZzZXQ7CitzdGF0aWMgdTMyIGZpcnN0X3B0czsKK3N0YXRpYyB1MzIgZmlyc3RfZnJhbWVfc2l6ZTsKK3N0YXRpYyB1NjQgZmlyc3RfcHRzNjQ7CitzdGF0aWMgYm9vbCBmaXJzdF9wdHNfY2FjaGVkOworc3RhdGljIHZvaWQgKnNlaV9kYXRhX2J1ZmZlcjsKK3N0YXRpYyBkbWFfYWRkcl90IHNlaV9kYXRhX2J1ZmZlcl9waHlzOworc3RhdGljIGludCBjbGtfYWRqX2ZyYW1lX2NvdW50OworCisjZGVmaW5lIE1DX09GRlNFVF9IRUFERVIgICAgMHgwMDAwCisjZGVmaW5lIE1DX09GRlNFVF9EQVRBICAgICAgMHgxMDAwCisjZGVmaW5lIE1DX09GRlNFVF9NTUNPICAgICAgMHgyMDAwCisjZGVmaW5lIE1DX09GRlNFVF9MSVNUICAgICAgMHgzMDAwCisjZGVmaW5lIE1DX09GRlNFVF9TTElDRSAgICAgMHg0MDAwCisKKyNkZWZpbmUgTUNfVE9UQUxfU0laRSAgICAgICAoMjAqU1pfMUspCisjZGVmaW5lIE1DX1NXQVBfU0laRSAgICAgICAgKDQqU1pfMUspCisKKyNkZWZpbmUgTU9ERV9FUlJPUiAwCisjZGVmaW5lIE1PREVfRlVMTCAgMQorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxvY2spOworc3RhdGljIERFRklORV9TUElOTE9DSyhwcmVwYXJlX2xvY2spOworc3RhdGljIERFRklORV9TUElOTE9DSyhyZWN5Y2xlX2xvY2spOworCitzdGF0aWMgYm9vbCBibG9ja19kaXNwbGF5X3E7CitzdGF0aWMgaW50IHZoMjY0X3N0b3AoaW50IG1vZGUpOworc3RhdGljIHMzMiB2aDI2NF9pbml0KHZvaWQpOworCisKKyNkZWZpbmUgREZTX0hJR0hfVEhFQVNIT0xEIDMKKworc3RhdGljIGJvb2wgcHRzX2Rpc2NvbnRpbnVlOworCitzdGF0aWMgc3RydWN0IGdlMmRfY29udGV4dF9zICpnZTJkX3ZpZGVvaDI2NF9jb250ZXh0OworCitzdGF0aWMgc3RydWN0IHZkZWNfaW5mbyAqZ3ZzOworCitzdGF0aWMgc3RydWN0IHZkZWNfcyAqdmRlY19oMjY0OworCitzdGF0aWMgaW50IGdlMmRfdmlkZW9oMjY0dGFza19pbml0KHZvaWQpCit7CisJaWYgKGdlMmRfdmlkZW9oMjY0X2NvbnRleHQgPT0gTlVMTCkKKwkJZ2UyZF92aWRlb2gyNjRfY29udGV4dCA9IGNyZWF0ZV9nZTJkX3dvcmtfcXVldWUoKTsKKworCWlmIChnZTJkX3ZpZGVvaDI2NF9jb250ZXh0ID09IE5VTEwpIHsKKwkJcHJfaW5mbygiY3JlYXRlX2dlMmRfd29ya19xdWV1ZSB2aWRlbyB0YXNrIGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2UyZF92aWRlb2gyNjR0YXNrX3JlbGVhc2Uodm9pZCkKK3sKKwlpZiAoZ2UyZF92aWRlb2gyNjRfY29udGV4dCkgeworCQlkZXN0cm95X2dlMmRfd29ya19xdWV1ZShnZTJkX3ZpZGVvaDI2NF9jb250ZXh0KTsKKwkJZ2UyZF92aWRlb2gyNjRfY29udGV4dCA9IE5VTEw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdlMmRfY2FudmFzX2R1cChzdHJ1Y3QgY2FudmFzX3MgKnNyY3ksIHN0cnVjdCBjYW52YXNfcyAqc3JjdSwKKwkJc3RydWN0IGNhbnZhc19zICpkZXMsIGludCBmb3JtYXQsIHUzMiBzcmNpbmRleCwKKwkJdTMyIGRlc2luZGV4KQoreworCisJc3RydWN0IGNvbmZpZ19wYXJhX2V4X3MgZ2UyZF9jb25maWc7CisJLyogcHJfaW5mbygiWyVzXWgyNjQgQUREUiBzcmN5WzB4JWx4XSBzcmN1WzB4JWx4XSBkZXNbMHglbHhdXG4iLAorCSAqCSAgIF9fZnVuY19fLCBzcmN5LT5hZGRyLCBzcmN1LT5hZGRyLCBkZXMtPmFkZHIpOworCSAqLworCW1lbXNldCgmZ2UyZF9jb25maWcsIDAsIHNpemVvZihzdHJ1Y3QgY29uZmlnX3BhcmFfZXhfcykpOworCisJZ2UyZF9jb25maWcuYWx1X2NvbnN0X2NvbG9yID0gMDsKKwlnZTJkX2NvbmZpZy5iaXRtYXNrX2VuID0gMDsKKwlnZTJkX2NvbmZpZy5zcmMxX2diX2FscGhhID0gMDsKKworCWdlMmRfY29uZmlnLnNyY19wbGFuZXNbMF0uYWRkciA9IHNyY3ktPmFkZHI7CisJZ2UyZF9jb25maWcuc3JjX3BsYW5lc1swXS53ID0gc3JjeS0+d2lkdGg7CisJZ2UyZF9jb25maWcuc3JjX3BsYW5lc1swXS5oID0gc3JjeS0+aGVpZ2h0OworCisJZ2UyZF9jb25maWcuc3JjX3BsYW5lc1sxXS5hZGRyID0gc3JjdS0+YWRkcjsKKwlnZTJkX2NvbmZpZy5zcmNfcGxhbmVzWzFdLncgPSBzcmN1LT53aWR0aDsKKwlnZTJkX2NvbmZpZy5zcmNfcGxhbmVzWzFdLmggPSBzcmN1LT5oZWlnaHQ7CisKKwlnZTJkX2NvbmZpZy5kc3RfcGxhbmVzWzBdLmFkZHIgPSBkZXMtPmFkZHI7CisJZ2UyZF9jb25maWcuZHN0X3BsYW5lc1swXS53ID0gZGVzLT53aWR0aDsKKwlnZTJkX2NvbmZpZy5kc3RfcGxhbmVzWzBdLmggPSBkZXMtPmhlaWdodDsKKworCWdlMmRfY29uZmlnLnNyY19wYXJhLmNhbnZhc19pbmRleCA9IHNyY2luZGV4OworCWdlMmRfY29uZmlnLnNyY19wYXJhLm1lbV90eXBlID0gQ0FOVkFTX1RZUEVfSU5WQUxJRDsKKwlnZTJkX2NvbmZpZy5zcmNfcGFyYS5mb3JtYXQgPSBmb3JtYXQ7CisJZ2UyZF9jb25maWcuc3JjX3BhcmEuZmlsbF9jb2xvcl9lbiA9IDA7CisJZ2UyZF9jb25maWcuc3JjX3BhcmEuZmlsbF9tb2RlID0gMDsKKwlnZTJkX2NvbmZpZy5zcmNfcGFyYS5jb2xvciA9IDA7CisJZ2UyZF9jb25maWcuc3JjX3BhcmEudG9wID0gMDsKKwlnZTJkX2NvbmZpZy5zcmNfcGFyYS5sZWZ0ID0gMDsKKwlnZTJkX2NvbmZpZy5zcmNfcGFyYS53aWR0aCA9IHNyY3ktPndpZHRoOworCWdlMmRfY29uZmlnLnNyY19wYXJhLmhlaWdodCA9IHNyY3ktPmhlaWdodDsKKworCWdlMmRfY29uZmlnLmRzdF9wYXJhLmNhbnZhc19pbmRleCA9IGRlc2luZGV4OworCWdlMmRfY29uZmlnLmRzdF9wYXJhLm1lbV90eXBlID0gQ0FOVkFTX1RZUEVfSU5WQUxJRDsKKwlnZTJkX2NvbmZpZy5kc3RfcGFyYS5mb3JtYXQgPSBmb3JtYXQ7CisJZ2UyZF9jb25maWcuZHN0X3BhcmEuZmlsbF9jb2xvcl9lbiA9IDA7CisJZ2UyZF9jb25maWcuZHN0X3BhcmEuZmlsbF9tb2RlID0gMDsKKwlnZTJkX2NvbmZpZy5kc3RfcGFyYS5jb2xvciA9IDA7CisJZ2UyZF9jb25maWcuZHN0X3BhcmEudG9wID0gMDsKKwlnZTJkX2NvbmZpZy5kc3RfcGFyYS5sZWZ0ID0gMDsKKwlnZTJkX2NvbmZpZy5kc3RfcGFyYS53aWR0aCA9IHNyY3ktPndpZHRoOworCWdlMmRfY29uZmlnLmRzdF9wYXJhLmhlaWdodCA9IHNyY3ktPmhlaWdodDsKKworCWlmIChnZTJkX2NvbnRleHRfY29uZmlnX2V4KGdlMmRfdmlkZW9oMjY0X2NvbnRleHQsICZnZTJkX2NvbmZpZykgPCAwKSB7CisJCXByX2luZm8oImdlMmRfY29udGV4dF9jb25maWdfZXggZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXN0cmV0Y2hibHRfbm9hbHBoYShnZTJkX3ZpZGVvaDI2NF9jb250ZXh0LCAwLCAwLCBzcmN5LT53aWR0aCwKKwkJCXNyY3ktPmhlaWdodCwgMCwgMCwgc3JjeS0+d2lkdGgsIHNyY3ktPmhlaWdodCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmlmb19sZXZlbCh2b2lkKQoreworCXJldHVybiBWRl9QT09MX1NJWkUgLSBrZmlmb19sZW4oJm5ld2ZyYW1lX3EpOworfQorCisKK3ZvaWQgc3BlY19zZXRfY2FudmFzKHN0cnVjdCBidWZmZXJfc3BlY19zICpzcGVjLAorCQl1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQpCit7CisJaW50IGVuZGlhbjsKKworCWVuZGlhbiA9IChjYW52YXNfbW9kZSA9PSBDQU5WQVNfQkxLTU9ERV9MSU5FQVIpPzc6MDsKKwljb25maWdfY2F2X2x1dF9leChzcGVjLT55X2NhbnZhc19pbmRleCwKKwkJCXNwZWMtPnlfYWRkciwKKwkJCXdpZHRoLCBoZWlnaHQsCisJCQlDQU5WQVNfQUREUl9OT1dSQVAsIGNhbnZhc19tb2RlLCBlbmRpYW4sIFZERUNfMSk7CisKKwljb25maWdfY2F2X2x1dF9leChzcGVjLT51X2NhbnZhc19pbmRleCwKKwkJCXNwZWMtPnVfYWRkciwKKwkJCXdpZHRoLCBoZWlnaHQgLyAyLAorCQkJQ0FOVkFTX0FERFJfTk9XUkFQLCBjYW52YXNfbW9kZSwgZW5kaWFuLCBWREVDXzEpOworCit9CisKK3N0YXRpYyB2b2lkIHZoMjY0X25vdGlmeV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlwcl9pbmZvKCJmcmFtZSBkdXJhdGlvbiBjaGFuZ2VkICVkXG4iLCBmcmFtZV9kdXIpOworCXZmX25vdGlmeV9yZWNlaXZlcihQUk9WSURFUl9OQU1FLCBWRlJBTUVfRVZFTlRfUFJPVklERVJfRlJfSElOVCwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpZnJhbWVfZHVyKSk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHByZXBhcmVfZGlzcGxheV9xKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY291bnQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJlcGFyZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoYmxvY2tfZGlzcGxheV9xKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByZXBhcmVfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJlcGFyZV9sb2NrLCBmbGFncyk7CisKKwljb3VudCAgPSAoaW50KVZGX1BPT0xfU0laRSAtCisJCWtmaWZvX2xlbigmZGVsYXlfZGlzcGxheV9xKSAtCisJCWtmaWZvX2xlbigmZGlzcGxheV9xKSAtCisJCWtmaWZvX2xlbigmcmVjeWNsZV9xKSAtCisJCWtmaWZvX2xlbigmbmV3ZnJhbWVfcSk7CisKKwlpZiAoKHZoMjY0X3N0cmVhbV9zd2l0Y2hpbmdfc3RhdGUgIT0gU1dJVENISU5HX1NUQVRFX09GRikKKwkJfHwgIUVOX1NXSVRDSF9GRU5DRSgpKQorCQljb3VudCA9IDA7CisJZWxzZQorCQljb3VudCA9IChjb3VudCA8IDIpID8gMCA6IDI7CisKKwl3aGlsZSAoa2ZpZm9fbGVuKCZkZWxheV9kaXNwbGF5X3EpID4gY291bnQpIHsKKwkJc3RydWN0IHZmcmFtZV9zICp2ZjsKKworCQlpZiAoa2ZpZm9fZ2V0KCZkZWxheV9kaXNwbGF5X3EsICZ2ZikpIHsKKwkJCWtmaWZvX3B1dCgmZGlzcGxheV9xLAorCQkJCShjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCQlBVFJBQ0VfQ09VTlRFUihNT0RVTEVfTkFNRSwgdmYtPnB0cyk7CisJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoUFJPVklERVJfTkFNRSwKKwkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfVkZSQU1FX1JFQURZLCBOVUxMKTsKKwkJfQorCX0KK30KKworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyAqdmgyNjRfdmZfcGVlayh2b2lkICpvcF9hcmcpCit7CisJc3RydWN0IHZmcmFtZV9zICp2ZjsKKworCWlmIChrZmlmb19wZWVrKCZkaXNwbGF5X3EsICZ2ZikpCisJCXJldHVybiB2ZjsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2aDI2NF92Zl9nZXQodm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCB2ZnJhbWVfcyAqdmY7CisKKwlpZiAoa2ZpZm9fZ2V0KCZkaXNwbGF5X3EsICZ2ZikpCisJCXJldHVybiB2ZjsKKworCXJldHVybiBOVUxMOworfQorc3RhdGljIGJvb2wgdmZfdmFsaWRfY2hlY2soc3RydWN0IHZmcmFtZV9zICp2ZikgeworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBWRl9QT09MX1NJWkU7IGkrKykgeworCQlpZiAodmYgPT0gJnZmcG9vbFtpXSkKKwkJCXJldHVybiB0cnVlOworCX0KKwlwcl9pbmZvKCIgaW52YWxpZCB2ZiBiZWVuIHB1dCwgdmYgPSAlcFxuIiwgdmYpOworCWZvciAoaSA9IDA7IGkgPCBWRl9QT09MX1NJWkU7IGkrKykgeworCQlwcl9pbmZvKCJ3d3cgdmFsaWQgdmZbJWRdPSAlcCBcbiIsIGksICZ2ZnBvb2xbaV0pOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIHZoMjY0X3ZmX3B1dChzdHJ1Y3QgdmZyYW1lX3MgKnZmLCB2b2lkICpvcF9hcmcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZyZWN5Y2xlX2xvY2ssIGZsYWdzKTsKKworCWlmICgodmYgIT0gJmZlbnNlX3ZmWzBdKSAmJiAodmYgIT0gJmZlbnNlX3ZmWzFdKSkgeworCQlpZiAodmYgJiYgKHZmX3ZhbGlkX2NoZWNrKHZmKSA9PSB0cnVlKSkKKwkJCWtmaWZvX3B1dCgmcmVjeWNsZV9xLCAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZWN5Y2xlX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCB2aDI2NF9ldmVudF9jYihpbnQgdHlwZSwgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZV9kYXRhKQoreworCWlmICh0eXBlICYgVkZSQU1FX0VWRU5UX1JFQ0VJVkVSX1JFU0VUKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJYW12ZGVjX3N0b3AoKTsKKyNpZm5kZWYgQ09ORklHX0FNTE9HSUNfUE9TVF9QUk9DRVNTX01BTkFHRVIKKwkJdmZfbGlnaHRfdW5yZWdfcHJvdmlkZXIoJnZoMjY0X3ZmX3Byb3YpOworI2VuZGlmCisJCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CisJCXZoMjY0X2xvY2FsX2luaXQoKTsKKwkJdmgyNjRfcHJvdF9pbml0KCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKKyNpZm5kZWYgQ09ORklHX0FNTE9HSUNfUE9TVF9QUk9DRVNTX01BTkFHRVIKKwkJdmZfcmVnX3Byb3ZpZGVyKCZ2aDI2NF92Zl9wcm92KTsKKyNlbmRpZgorCQlhbXZkZWNfc3RhcnQoKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmgyNjRfdmZfc3RhdGVzKHN0cnVjdCB2ZnJhbWVfc3RhdGVzICpzdGF0ZXMsIHZvaWQgKm9wX2FyZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKKworCXN0YXRlcy0+dmZfcG9vbF9zaXplID0gVkZfUE9PTF9TSVpFOworCXN0YXRlcy0+YnVmX2ZyZWVfbnVtID0ga2ZpZm9fbGVuKCZuZXdmcmFtZV9xKTsKKwlzdGF0ZXMtPmJ1Zl9hdmFpbF9udW0gPSBrZmlmb19sZW4oJmRpc3BsYXlfcSkgKworCQkJCWtmaWZvX2xlbigmZGVsYXlfZGlzcGxheV9xKTsKKwlzdGF0ZXMtPmJ1Zl9yZWN5Y2xlX251bSA9IGtmaWZvX2xlbigmcmVjeWNsZV9xKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisjaWYgMAorc3RhdGljIHR2aW5fdHJhbnNfZm10X3QgY29udmVydF8zZF9mb3JtYXQodTMyIHR5cGUpCit7CisJY29uc3QgdHZpbl90cmFuc19mbXRfdCBjb252X3RhYltdID0geworCQkwLAkJLyogY2hlY2tlcmJvYXJkICovCisJCTAsCQkvKiBjb2x1bW4gYWx0ZXJuYXRpb24gKi8KKwkJVFZJTl9URk1UXzNEX0xBLAkvKiByb3cgYWx0ZXJuYXRpb24gKi8KKwkJVFZJTl9URk1UXzNEX0xSSF9PTEVSLAkvKiBzaWRlIGJ5IHNpZGUgKi8KKwkJVFZJTl9URk1UXzNEX0ZBCS8qIHRvcCBib3R0b20gKi8KKwl9OworCisJcmV0dXJuICh0eXBlIDw9IDQpID8gY29udl90YWJbdHlwZV0gOiAwOworfQorI2VuZGlmCisKKworCisjZGVmaW5lIERVTVBfQ0NfQVNfQVNDSUkKKworI2lmZGVmIERVTVBfQ0NfQVNfQVNDSUkKK3N0YXRpYyBpbnQgdmJpX3RvX2FzY2lpKGludCBjKQoreworCWlmIChjIDwgMCkKKwkJcmV0dXJuICc/JzsKKworCWMgJj0gMHg3RjsKKworCWlmIChjIDwgMHgyMCB8fCBjID49IDB4N0YpCisJCXJldHVybiAnLic7CisKKwlyZXR1cm4gYzsKK30KKworc3RhdGljIHZvaWQgZHVtcF9jY19hc2NpaShjb25zdCB1aW50OF90ICpidWYsIHVuc2lnbmVkIGludCB2cHRzLCBpbnQgcG9jKQoreworCWludCBjY19mbGFnOworCWludCBjY19jb3VudDsKKwlpbnQgaTsKKwlpbnQgc3pBc2NpaVszMl07CisJaW50IGluZGV4ID0gMDsKKworCWNjX2ZsYWcgPSBidWZbMV0gJiAweDQwOworCWlmICghY2NfZmxhZykgeworCQlwcl9pbmZvKCIjIyMgY2NfZmxhZyBpcyBpbnZhbGlkXG4iKTsKKwkJcmV0dXJuOworCX0KKwljY19jb3VudCA9IGJ1ZlsxXSAmIDB4MWY7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2NfY291bnQ7ICsraSkgeworCQl1bnNpZ25lZCBpbnQgYjA7CisJCXVuc2lnbmVkIGludCBjY192YWxpZDsKKwkJdW5zaWduZWQgaW50IGNjX3R5cGU7CisJCXVuc2lnbmVkIGNoYXIgY2NfZGF0YTE7CisJCXVuc2lnbmVkIGNoYXIgY2NfZGF0YTI7CisKKwkJYjAgPSBidWZbMyArIGkgKiAzXTsKKwkJY2NfdmFsaWQgPSBiMCAmIDQ7CisJCWNjX3R5cGUgPSBiMCAmIDM7CisJCWNjX2RhdGExID0gYnVmWzQgKyBpICogM107CisJCWNjX2RhdGEyID0gYnVmWzUgKyBpICogM107CisKKworCQlpZiAoY2NfdHlwZSA9PSAwKSB7CisJCQkvKiBOVFNDIHBhaXIsIExpbmUgMjEgKi8KKwkJCXN6QXNjaWlbaW5kZXgrK10gPSB2YmlfdG9fYXNjaWkoY2NfZGF0YTEpOworCQkJc3pBc2NpaVtpbmRleCsrXSA9IHZiaV90b19hc2NpaShjY19kYXRhMik7CisJCQlpZiAoKCFjY192YWxpZCkgfHwgKGkgPj0gMykpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaW5kZXggPiAwICYmIGluZGV4IDw9IDgpIHsKKwkJY2hhciBwcl9idWZbMTI4XTsKKwkJaW50IGxlbjsKKworCQlzcHJpbnRmKHByX2J1ZiwgInB1c2ggdnB0czoweCV4LCBwb2M6JWQgOiIsIHZwdHMsIHBvYyk7CisJCWxlbiA9IHN0cmxlbihwcl9idWYpOworCQlmb3IgKGk9MDtpPGluZGV4O2krKykKKwkJCXNwcmludGYocHJfYnVmICsgbGVuICsgaSoyLCAiJWMgIiwgc3pBc2NpaVtpXSk7CisJCXByX2luZm8oIiVzXG4iLCBwcl9idWYpOworCX0KKworfQorI2VuZGlmCisKKy8qCisjZGVmaW5lIERVTVBfVVNFUl9EQVRBX0hFWAorKi8KKyNpZmRlZiBEVU1QX1VTRVJfREFUQV9IRVgKK3N0YXRpYyB2b2lkIHByaW50X2RhdGEodW5zaWduZWQgY2hhciAqcGRhdGEsIGludCBsZW4pCit7CisJaW50IG5MZWZ0OworCWNoYXIgYnVmWzEyOF07CisKKwluTGVmdCA9IGxlbjsKKwl3aGlsZSAobkxlZnQgPj0gMTYpIHsKKwkJaW50IGk7CisKKwkJZm9yIChpPTA7aTwxNjtpKyspCisJCQlzcHJpbnRmKGJ1ZitpKjMsICIlMDJ4ICIsIHBkYXRhW2ldKTsKKworCQlwcl9pbmZvKCIlc1xuIiwgYnVmKTsKKwkJbkxlZnQgLT0gMTY7CisJCXBkYXRhICs9IDE2OworCX0KKworCXdoaWxlIChuTGVmdCA+PSA4KSB7CisJCWludCBpOworCQlmb3IgKGk9MDtpPG5MZWZ0O2krKykKKwkJCXNwcmludGYoYnVmK2kqMywgIiUwMnggIiwgcGRhdGFbaV0pOworCisJCXByX2luZm8oIiVzXG4iLCBidWYpOworCQluTGVmdCAtPSA4OworCQlwZGF0YSArPSA4OworCX0KK30KKyNlbmRpZgorCisKKworc3RhdGljIHZvaWQgYW1sX3N3YXBfZGF0YSh1aW50OF90ICp1c2VyX2RhdGEsIGludCB1ZF9zaXplKQoreworCWludCBzd2FwX2Jsb2NrcywgaSwgaiwgaywgbTsKKwl1bnNpZ25lZCBjaGFyIGNfdGVtcDsKKworCS8qIHN3YXAgYnl0ZSBvcmRlciAqLworCXN3YXBfYmxvY2tzID0gdWRfc2l6ZSAvIDg7CisJZm9yIChpID0gMDsgaSA8IHN3YXBfYmxvY2tzOyBpKyspIHsKKwkJaiA9IGkgKiA4OworCQlrID0gaiArIDc7CisJCWZvciAobSA9IDA7IG0gPCA0OyBtKyspIHsKKwkJCWNfdGVtcCA9IHVzZXJfZGF0YVtqXTsKKwkJCXVzZXJfZGF0YVtqKytdID0gdXNlcl9kYXRhW2tdOworCQkJdXNlcl9kYXRhW2stLV0gPSBjX3RlbXA7CisJCX0KKwl9Cit9CisKKworc3RhdGljIHZvaWQgdWRyX2R1bXBfZGF0YSh1bnNpZ25lZCBpbnQgdXNlcl9kYXRhX3dwLAorCQkJCQkJdW5zaWduZWQgaW50IHVzZXJfZGF0YV9sZW5ndGgsCisJCQkJCQl1bnNpZ25lZCBpbnQgcHRzLAorCQkJCQkJaW50IHBvYykKK3sKKwl1bnNpZ25lZCBjaGFyICpwZGF0YTsKKwlpbnQgdXNlcl9kYXRhX2xlbjsKKwlpbnQgd3Bfc3RhcnQ7CisJaW50IG5MZWZ0OworCXVuc2lnbmVkIGNoYXIgc3pCdWZbMjU2XTsKKwlpbnQgbk9mZnNldDsKKworCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCXNlaV9kYXRhX2J1ZmZlcl9waHlzLCBVU0VSX0RBVEFfU0laRSwKKwkJCURNQV9GUk9NX0RFVklDRSk7CisKKwlpZiAodXNlcl9kYXRhX2xlbmd0aCAmIDB4MDcpCisJCXVzZXJfZGF0YV9sZW4gPSAodXNlcl9kYXRhX2xlbmd0aCArIDgpICYgMHhGRkZGRkZGODsKKwllbHNlCisJCXVzZXJfZGF0YV9sZW4gPSB1c2VyX2RhdGFfbGVuZ3RoOworCisJaWYgKHVzZXJfZGF0YV93cCA+PSB1c2VyX2RhdGFfbGVuKSB7CisJCXdwX3N0YXJ0ID0gdXNlcl9kYXRhX3dwIC0gdXNlcl9kYXRhX2xlbjsKKworCQlwZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopc2VpX2RhdGFfYnVmZmVyOworCQlwZGF0YSArPSB3cF9zdGFydDsKKwkJbkxlZnQgPSB1c2VyX2RhdGFfbGVuOworCisJCW1lbXNldChzekJ1ZiwgMCwgMjU2KTsKKwkJbWVtY3B5KHN6QnVmLCBwZGF0YSwgdXNlcl9kYXRhX2xlbik7CisJfSBlbHNlIHsKKwkJd3Bfc3RhcnQgPSB1c2VyX2RhdGFfd3AgKworCQkJVVNFUl9EQVRBX1NJWkUgLSB1c2VyX2RhdGFfbGVuOworCisJCXBkYXRhID0gKHVuc2lnbmVkIGNoYXIgKilzZWlfZGF0YV9idWZmZXI7CisJCXBkYXRhICs9IHdwX3N0YXJ0OworCQluTGVmdCA9IFVTRVJfREFUQV9TSVpFIC0gd3Bfc3RhcnQ7CisKKwkJbWVtc2V0KHN6QnVmLCAwLCAyNTYpOworCQltZW1jcHkoc3pCdWYsIHBkYXRhLCBuTGVmdCk7CisJCW5PZmZzZXQgPSBuTGVmdDsKKworCQlwZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopc2VpX2RhdGFfYnVmZmVyOworCQluTGVmdCA9IHVzZXJfZGF0YV93cDsKKwkJbWVtY3B5KHN6QnVmK25PZmZzZXQsIHBkYXRhLCBuTGVmdCk7CisJfQorCisJYW1sX3N3YXBfZGF0YShzekJ1ZiwgdXNlcl9kYXRhX2xlbik7CisKKyNpZmRlZiBEVU1QX1VTRVJfREFUQV9IRVgKKwlwcmludF9kYXRhKHN6QnVmLCB1c2VyX2RhdGFfbGVuKTsKKyNlbmRpZgorCisjaWZkZWYgRFVNUF9DQ19BU19BU0NJSQorCWR1bXBfY2NfYXNjaWkoc3pCdWYrNywgcHRzLCBwb2MpOworI2VuZGlmCit9CisKKworc3RydWN0IHZoMjY0X3VzZXJkYXRhX3JlY29yZWRfdCB7CisJc3RydWN0IHVzZXJkYXRhX21ldGFfaW5mb190IG1ldGFfaW5mbzsKKwl1MzIgcmVjX3N0YXJ0OworCXUzMiByZWNfbGVuOworfTsKKworI2RlZmluZSBVU0VSREFUQV9GSUZPX05VTSAgICAyNTYKKworc3RydWN0IHZoMjY0X3VzZXJkYXRhX2luZm9fdCB7CisJc3RydWN0IHZoMjY0X3VzZXJkYXRhX3JlY29yZWRfdCByZWNvcmRzW1VTRVJEQVRBX0ZJRk9fTlVNXTsKKwl1OCAqZGF0YV9idWY7CisJdTggKmRhdGFfYnVmX2VuZDsKKwl1MzIgYnVmX2xlbjsKKwl1MzIgcmVhZF9pbmRleDsKKwl1MzIgd3JpdGVfaW5kZXg7CisJdTMyIGxhc3Rfd3A7Cit9OworCitzdGF0aWMgc3RydWN0IHZoMjY0X3VzZXJkYXRhX2luZm9fdCAqcF91c2VyZGF0YV9tZ3I7CisKK3N0YXRpYyBERUZJTkVfTVVURVgodXNlcmRhdGFfbXV0ZXgpOworCisKK3ZvaWQgdmgyNjRfY3JhdGVfdXNlcmRhdGFfbWFuYWdlcih1OCAqdXNlcmRhdGFfYnVmLCBpbnQgYnVmX2xlbikKK3sKKwlwX3VzZXJkYXRhX21nciA9IChzdHJ1Y3QgdmgyNjRfdXNlcmRhdGFfaW5mb190ICopCisJCXZtYWxsb2Moc2l6ZW9mKHN0cnVjdCB2aDI2NF91c2VyZGF0YV9pbmZvX3QpKTsKKwlpZiAocF91c2VyZGF0YV9tZ3IpIHsKKwkJbWVtc2V0KHBfdXNlcmRhdGFfbWdyLCAwLAorCQkJc2l6ZW9mKHN0cnVjdCB2aDI2NF91c2VyZGF0YV9pbmZvX3QpKTsKKwkJcF91c2VyZGF0YV9tZ3ItPmRhdGFfYnVmID0gdXNlcmRhdGFfYnVmOworCQlwX3VzZXJkYXRhX21nci0+YnVmX2xlbiA9IGJ1Zl9sZW47CisJCXBfdXNlcmRhdGFfbWdyLT5kYXRhX2J1Zl9lbmQgPSB1c2VyZGF0YV9idWYgKyBidWZfbGVuOworCX0KK30KKwordm9pZCB2aDI2NF9kZXN0cm95X3VzZXJkYXRhX21hbmFnZXIodm9pZCkKK3sKKwlpZiAocF91c2VyZGF0YV9tZ3IpIHsKKwkJdmZyZWUocF91c2VyZGF0YV9tZ3IpOworCQlwX3VzZXJkYXRhX21nciA9IE5VTEw7CisJfQorfQorCisvKgorI2RlZmluZSBEVU1QX1VTRVJfREFUQQorKi8KKyNpZmRlZiBEVU1QX1VTRVJfREFUQQorCisjZGVmaW5lIE1BWF9VU0VSX0RBVEFfU0laRQkJMzE0NTcyOAorc3RhdGljIHZvaWQgKnVzZXJfZGF0YV9idWY7CitzdGF0aWMgdW5zaWduZWQgY2hhciAqcGJ1Zl9zdGFydDsKK3N0YXRpYyBpbnQgdG90YWxfbGVuOworc3RhdGljIGludCBic2tpcDsKK3N0YXRpYyBpbnQgbl91c2VyZGF0YV9pZDsKKworCitzdGF0aWMgdm9pZCBwcmludF9tZW1fZGF0YSh1bnNpZ25lZCBjaGFyICpwZGF0YSwKKwkJCQkJCWludCBsZW4sCisJCQkJCQl1bnNpZ25lZCBpbnQgZmxhZywKKwkJCQkJCXVuc2lnbmVkIGludCBkdXJhdGlvbiwKKwkJCQkJCXVuc2lnbmVkIGludCB2cHRzLAorCQkJCQkJdW5zaWduZWQgaW50IHZwdHNfdmFsaWQsCisJCQkJCQlpbnQgcmVjX2lkKQoreworCWludCBuTGVmdDsKKworCW5MZWZ0ID0gbGVuOworI2lmIDAKKwlwcl9pbmZvKCIlZCBsZW4gPSAlZCwgZmxhZyA9ICVkLCBkdXJhdGlvbiA9ICVkLCB2cHRzID0gMHgleCwgdnB0c192YWxpZCA9ICVkXG4iLAorCQkJCXJlY19pZCwJbGVuLCBmbGFnLAorCQkJCWR1cmF0aW9uLCB2cHRzLCB2cHRzX3ZhbGlkKTsKKyNlbmRpZgorCXByX2luZm8oIiVkIGxlbiA9ICVkLCBmbGFnID0gJWQsIHZwdHMgPSAweCV4XG4iLAorCQkJCXJlY19pZCwJbGVuLCBmbGFnLCB2cHRzKTsKKworCisJd2hpbGUgKG5MZWZ0ID49IDE2KSB7CisJCXByX2luZm8oIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQlwZGF0YVswXSwgcGRhdGFbMV0sIHBkYXRhWzJdLCBwZGF0YVszXSwKKwkJCXBkYXRhWzRdLCBwZGF0YVs1XSwgcGRhdGFbNl0sIHBkYXRhWzddLAorCQkJcGRhdGFbOF0sIHBkYXRhWzldLCBwZGF0YVsxMF0sIHBkYXRhWzExXSwKKwkJCXBkYXRhWzEyXSwgcGRhdGFbMTNdLCBwZGF0YVsxNF0sIHBkYXRhWzE1XSk7CisJCW5MZWZ0IC09IDE2OworCQlwZGF0YSArPSAxNjsKKwl9CisKKworCXdoaWxlIChuTGVmdCA+IDApIHsKKwkJcHJfaW5mbygiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJcGRhdGFbMF0sIHBkYXRhWzFdLCBwZGF0YVsyXSwgcGRhdGFbM10sCisJCQlwZGF0YVs0XSwgcGRhdGFbNV0sIHBkYXRhWzZdLCBwZGF0YVs3XSk7CisJCW5MZWZ0IC09IDg7CisJCXBkYXRhICs9IDg7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGR1bXBfZGF0YSh1OCAqcGRhdGEsCisJCQkJCQl1bnNpZ25lZCBpbnQgdXNlcl9kYXRhX2xlbmd0aCwKKwkJCQkJCXVuc2lnbmVkIGludCBmbGFnLAorCQkJCQkJdW5zaWduZWQgaW50IGR1cmF0aW9uLAorCQkJCQkJdW5zaWduZWQgaW50IHZwdHMsCisJCQkJCQl1bnNpZ25lZCBpbnQgdnB0c192YWxpZCwKKwkJCQkJCWludCByZWNfaWQpCit7CisJdW5zaWduZWQgY2hhciBzekJ1ZlsyNTZdOworCisKKwltZW1zZXQoc3pCdWYsIDAsIDI1Nik7CisJbWVtY3B5KHN6QnVmLCBwZGF0YSwgdXNlcl9kYXRhX2xlbmd0aCk7CisvKgorCWFtbF9zd2FwX2RhdGEoc3pCdWYsIHVzZXJfZGF0YV9sZW5ndGgpOworKi8KKworCXByaW50X21lbV9kYXRhKHN6QnVmLCB1c2VyX2RhdGFfbGVuZ3RoLAorCQkJCWZsYWcsIGR1cmF0aW9uLCB2cHRzLAorCQkJCXZwdHNfdmFsaWQsIHJlY19pZCk7CisKKyNpZmRlZiBERUJVR19DQ19EVU1QX0FTQ0lJCisJZHVtcF9jY19hc2NpaShzekJ1Zis3KTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBwdXNoX3RvX2J1Zih1OCAqcGRhdGEsIGludCBsZW4sIHN0cnVjdCB1c2VyZGF0YV9tZXRhX2luZm9fdCAqcG1ldGEpCit7CisJdTMyICpwTGVuOworCWludCBpbmZvX2NudDsKKwl1OCAqcGJ1Zl9lbmQ7CisKKwlpZiAoIXVzZXJfZGF0YV9idWYpCisJCXJldHVybjsKKworCWlmIChic2tpcCkgeworCQlwcl9pbmZvKCJvdmVyIHNpemUsIHNraXBcbiIpOworCQlyZXR1cm47CisJfQorCWluZm9fY250ID0gMDsKKwlwTGVuID0gKHUzMiAqKXBidWZfc3RhcnQ7CisKKwkqcExlbiA9IGxlbjsKKwlwYnVmX3N0YXJ0ICs9IHNpemVvZih1MzIpOworCWluZm9fY250Kys7CisJcExlbisrOworCisJKnBMZW4gPSBwbWV0YS0+ZHVyYXRpb247CisJcGJ1Zl9zdGFydCArPSBzaXplb2YodTMyKTsKKwlpbmZvX2NudCsrOworCXBMZW4rKzsKKworCSpwTGVuID0gcG1ldGEtPmZsYWdzOworCXBidWZfc3RhcnQgKz0gc2l6ZW9mKHUzMik7CisJaW5mb19jbnQrKzsKKwlwTGVuKys7CisKKwkqcExlbiA9IHBtZXRhLT52cHRzOworCXBidWZfc3RhcnQgKz0gc2l6ZW9mKHUzMik7CisJaW5mb19jbnQrKzsKKwlwTGVuKys7CisKKwkqcExlbiA9IHBtZXRhLT52cHRzX3ZhbGlkOworCXBidWZfc3RhcnQgKz0gc2l6ZW9mKHUzMik7CisJaW5mb19jbnQrKzsKKwlwTGVuKys7CisKKworCSpwTGVuID0gbl91c2VyZGF0YV9pZDsKKwlwYnVmX3N0YXJ0ICs9IHNpemVvZih1MzIpOworCWluZm9fY250Kys7CisJcExlbisrOworCisKKworCXBidWZfZW5kID0gKHU4ICopc2VpX2RhdGFfYnVmZmVyICsgVVNFUl9EQVRBX1NJWkU7CisJaWYgKHBkYXRhICsgbGVuID4gcGJ1Zl9lbmQpIHsKKwkJaW50IGZpcnN0X3NlY3Rpb25fbGVuOworCisJCWZpcnN0X3NlY3Rpb25fbGVuID0gcGJ1Zl9lbmQgLSBwZGF0YTsKKwkJbWVtY3B5KHBidWZfc3RhcnQsIHBkYXRhLCBmaXJzdF9zZWN0aW9uX2xlbik7CisJCXBkYXRhID0gKHU4ICopc2VpX2RhdGFfYnVmZmVyOworCQlwYnVmX3N0YXJ0ICs9IGZpcnN0X3NlY3Rpb25fbGVuOworCQltZW1jcHkocGJ1Zl9zdGFydCwgcGRhdGEsIGxlbiAtIGZpcnN0X3NlY3Rpb25fbGVuKTsKKwkJcGJ1Zl9zdGFydCArPSBsZW4gLSBmaXJzdF9zZWN0aW9uX2xlbjsKKwl9IGVsc2UgeworCQltZW1jcHkocGJ1Zl9zdGFydCwgcGRhdGEsIGxlbik7CisJCXBidWZfc3RhcnQgKz0gbGVuOworCX0KKworCXRvdGFsX2xlbiArPSBsZW4gKyBpbmZvX2NudCAqIHNpemVvZih1MzIpOworCWlmICh0b3RhbF9sZW4gPj0gTUFYX1VTRVJfREFUQV9TSVpFLTQwOTYpCisJCWJza2lwID0gMTsKK30KKworCitzdGF0aWMgdm9pZCBkdW1wX3VzZXJkYXRhX2luZm8oCisJCQkJCXZvaWQgKnB1c2VyX2RhdGEsCisJCQkJCWludCBsZW4sCisJCQkJCXN0cnVjdCB1c2VyZGF0YV9tZXRhX2luZm9fdCAqcG1ldGEpCit7CisJdTggKnBzdGFydDsKKworCXBzdGFydCA9ICh1OCAqKXB1c2VyX2RhdGE7CisKKworCXB1c2hfdG9fYnVmKHBzdGFydCwgbGVuLCBwbWV0YSk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfdXNlcl9kYXRhX2J1Zih2b2lkKQoreworCXU4ICpwYnVmOworCWludCBsZW47CisJdW5zaWduZWQgaW50IGZsYWc7CisJdW5zaWduZWQgaW50IGR1cmF0aW9uOworCXVuc2lnbmVkIGludCB2cHRzOworCXVuc2lnbmVkIGludCB2cHRzX3ZhbGlkOworCWludCByZWNfaWQ7CisKKwlwcl9pbmZvKCJzaG93IHVzZXIgZGF0YSBidWZcbiIpOworCXBidWYgPSB1c2VyX2RhdGFfYnVmOworCisJd2hpbGUgKHBidWYgPCBwYnVmX3N0YXJ0KSB7CisJCXUzMiAqcExlbjsKKworCQlwTGVuID0gKHUzMiAqKXBidWY7CisKKwkJbGVuID0gKnBMZW47CisJCXBMZW4rKzsKKwkJcGJ1ZiArPSBzaXplb2YodTMyKTsKKworCQlkdXJhdGlvbiA9ICpwTGVuOworCQlwTGVuKys7CisJCXBidWYgKz0gc2l6ZW9mKHUzMik7CisKKwkJZmxhZyA9ICpwTGVuOworCQlwTGVuKys7CisJCXBidWYgKz0gc2l6ZW9mKHUzMik7CisKKwkJdnB0cyA9ICpwTGVuOworCQlwTGVuKys7CisJCXBidWYgKz0gc2l6ZW9mKHUzMik7CisKKwkJdnB0c192YWxpZCA9ICpwTGVuOworCQlwTGVuKys7CisJCXBidWYgKz0gc2l6ZW9mKHUzMik7CisKKwkJcmVjX2lkID0gKnBMZW47CisJCXBMZW4rKzsKKwkJcGJ1ZiArPSBzaXplb2YodTMyKTsKKworCQlkdW1wX2RhdGEocGJ1ZiwgbGVuLCBmbGFnLCBkdXJhdGlvbiwgdnB0cywgdnB0c192YWxpZCwgcmVjX2lkKTsKKwkJcGJ1ZiArPSBsZW47CisJCW1zbGVlcCgzMCk7CisJfQorfQorCitzdGF0aWMgaW50IHZoMjY0X2luaXRfdXNlcmRhdGFfZHVtcCh2b2lkKQoreworCXVzZXJfZGF0YV9idWYgPSBrbWFsbG9jKE1BWF9VU0VSX0RBVEFfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVzZXJfZGF0YV9idWYpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZoMjY0X2R1bXBfdXNlcmRhdGEodm9pZCkKK3sKKwlpZiAodXNlcl9kYXRhX2J1ZikgeworCQlzaG93X3VzZXJfZGF0YV9idWYoKTsKKwkJa2ZyZWUodXNlcl9kYXRhX2J1Zik7CisJCXVzZXJfZGF0YV9idWYgPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgdmgyNjRfcmVzZXRfdXNlcl9kYXRhX2J1Zih2b2lkKQoreworCXRvdGFsX2xlbiA9IDA7CisJcGJ1Zl9zdGFydCA9IHVzZXJfZGF0YV9idWY7CisJYnNraXAgPSAwOworCW5fdXNlcmRhdGFfaWQgPSAwOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHZoMjY0X2FkZF91c2VyZGF0YShzdHJ1Y3QgdXNlcmRhdGFfbWV0YV9pbmZvX3QgbWV0YV9pbmZvLCBpbnQgd3ApCit7CisJc3RydWN0IHZoMjY0X3VzZXJkYXRhX3JlY29yZWRfdCAqcF91c2VyZGF0YV9yZWM7CisJaW50IGRhdGFfbGVuZ3RoOworCisJbXV0ZXhfbG9jaygmdXNlcmRhdGFfbXV0ZXgpOworCisJaWYgKHBfdXNlcmRhdGFfbWdyKSB7CisJCWlmICh3cCA+IHBfdXNlcmRhdGFfbWdyLT5sYXN0X3dwKQorCQkJZGF0YV9sZW5ndGggPSB3cCAtIHBfdXNlcmRhdGFfbWdyLT5sYXN0X3dwOworCQllbHNlCisJCQlkYXRhX2xlbmd0aCA9IHdwICsgcF91c2VyZGF0YV9tZ3ItPmJ1Zl9sZW4gLQorCQkJCXBfdXNlcmRhdGFfbWdyLT5sYXN0X3dwOworCisJCWlmIChkYXRhX2xlbmd0aCAmIDB4NykKKwkJCWRhdGFfbGVuZ3RoID0gKCgoZGF0YV9sZW5ndGggKyA4KSA+PiAzKSA8PCAzKTsKKyNpZiAwCisJCXByX2luZm8oIndha2V1cF9wdXNoOiByaTolZCwgd2k6JWQsIGRhdGFfbGVuOiVkLCBsYXN0X3dwOiVkLCB3cDolZCwgaWQgPSAlZFxuIiwKKwkJCXBfdXNlcmRhdGFfbWdyLT5yZWFkX2luZGV4LAorCQkJcF91c2VyZGF0YV9tZ3ItPndyaXRlX2luZGV4LAorCQkJZGF0YV9sZW5ndGgsCisJCQlwX3VzZXJkYXRhX21nci0+bGFzdF93cCwKKwkJCXdwLAorCQkJbl91c2VyZGF0YV9pZCk7CisjZW5kaWYKKwkJcF91c2VyZGF0YV9yZWMgPSBwX3VzZXJkYXRhX21nci0+cmVjb3JkcyArCisJCQlwX3VzZXJkYXRhX21nci0+d3JpdGVfaW5kZXg7CisJCXBfdXNlcmRhdGFfcmVjLT5tZXRhX2luZm8gPSBtZXRhX2luZm87CisJCXBfdXNlcmRhdGFfcmVjLT5yZWNfc3RhcnQgPSBwX3VzZXJkYXRhX21nci0+bGFzdF93cDsKKwkJcF91c2VyZGF0YV9yZWMtPnJlY19sZW4gPSBkYXRhX2xlbmd0aDsKKwkJcF91c2VyZGF0YV9tZ3ItPmxhc3Rfd3AgPSB3cDsKKworI2lmZGVmIERVTVBfVVNFUl9EQVRBCisJCWR1bXBfdXNlcmRhdGFfaW5mbyhwX3VzZXJkYXRhX21nci0+ZGF0YV9idWYgKworCQkJcF91c2VyZGF0YV9yZWMtPnJlY19zdGFydCwKKwkJCWRhdGFfbGVuZ3RoLAorCQkJJm1ldGFfaW5mbyk7CisJCW5fdXNlcmRhdGFfaWQrKzsKKyNlbmRpZgorCisJCXBfdXNlcmRhdGFfbWdyLT53cml0ZV9pbmRleCsrOworCQlpZiAocF91c2VyZGF0YV9tZ3ItPndyaXRlX2luZGV4ID49IFVTRVJEQVRBX0ZJRk9fTlVNKQorCQkJcF91c2VyZGF0YV9tZ3ItPndyaXRlX2luZGV4ID0gMDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ1c2VyZGF0YV9tdXRleCk7CisKKwl2ZGVjX3dha2V1cF91c2VyZGF0YV9wb2xsKHZkZWNfaDI2NCk7Cit9CisKK3N0YXRpYyBpbnQgdmgyNjRfdXNlcl9kYXRhX3JlYWQoc3RydWN0IHZkZWNfcyAqdmRlYywKKwkJCQlzdHJ1Y3QgdXNlcmRhdGFfcGFyYW1fdCAqcHVzZXJkYXRhX3BhcmEpCit7CisJaW50IHJlY19yaSwgcmVjX3dpOworCWludCByZWNfbGVuOworCXU4ICpyZWNfZGF0YV9zdGFydDsKKwl1OCAqcGRlc3RfYnVmOworCXN0cnVjdCB2aDI2NF91c2VyZGF0YV9yZWNvcmVkX3QgKnBfdXNlcmRhdGFfcmVjOworCXUzMiBkYXRhX3NpemU7CisJdTMyIHJlczsKKwlpbnQgY29weV9vayA9IDE7CisKKworCXBkZXN0X2J1ZiA9IHB1c2VyZGF0YV9wYXJhLT5wYnVmX2FkZHI7CisKKworCW11dGV4X2xvY2soJnVzZXJkYXRhX211dGV4KTsKKworCWlmICghcF91c2VyZGF0YV9tZ3IpIHsKKwkJbXV0ZXhfdW5sb2NrKCZ1c2VyZGF0YV9tdXRleCk7CisJCXJldHVybiAwOworCX0KKy8qCisJcHJfaW5mbygicmkgPSAlZCwgd2kgPSAlZFxuIiwKKwkJcF91c2VyZGF0YV9tZ3ItPnJlYWRfaW5kZXgsCisJCXBfdXNlcmRhdGFfbWdyLT53cml0ZV9pbmRleCk7CisqLworCXJlY19yaSA9IHBfdXNlcmRhdGFfbWdyLT5yZWFkX2luZGV4OworCXJlY193aSA9IHBfdXNlcmRhdGFfbWdyLT53cml0ZV9pbmRleDsKKworCWlmIChyZWNfcmkgPT0gcmVjX3dpKSB7CisJCW11dGV4X3VubG9jaygmdXNlcmRhdGFfbXV0ZXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwX3VzZXJkYXRhX3JlYyA9IHBfdXNlcmRhdGFfbWdyLT5yZWNvcmRzICsgcmVjX3JpOworCisJcmVjX2xlbiA9IHBfdXNlcmRhdGFfcmVjLT5yZWNfbGVuOworCXJlY19kYXRhX3N0YXJ0ID0gcF91c2VyZGF0YV9yZWMtPnJlY19zdGFydCArIHBfdXNlcmRhdGFfbWdyLT5kYXRhX2J1ZjsKKy8qCisJcHJfaW5mbygicmVjX2xlbjolZCwgcmVjX3N0YXJ0OiVkLCBidWZfbGVuOiVkXG4iLAorCQlwX3VzZXJkYXRhX3JlYy0+cmVjX2xlbiwKKwkJcF91c2VyZGF0YV9yZWMtPnJlY19zdGFydCwKKwkJcHVzZXJkYXRhX3BhcmEtPmJ1Zl9sZW4pOworKi8KKwlpZiAocmVjX2xlbiA8PSBwdXNlcmRhdGFfcGFyYS0+YnVmX2xlbikgeworCQkvKiBkdmIgdXNlciBkYXRhIGJ1ZmZlciBpcyBlbm91Z2h0IHRvIGNvcHkgdGhlIHdob2xlIHJlY29yZWQuICovCisJCWRhdGFfc2l6ZSA9IHJlY19sZW47CisJCWlmIChyZWNfZGF0YV9zdGFydCArIGRhdGFfc2l6ZQorCQkJPiBwX3VzZXJkYXRhX21nci0+ZGF0YV9idWZfZW5kKSB7CisJCQlpbnQgZmlyc3Rfc2VjdGlvbl9sZW47CisKKwkJCWZpcnN0X3NlY3Rpb25fbGVuID0gcF91c2VyZGF0YV9tZ3ItPmJ1Zl9sZW4gLQorCQkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfc3RhcnQ7CisJCQlyZXMgPSAodTMyKWNvcHlfdG9fdXNlcigodm9pZCAqKXBkZXN0X2J1ZiwKKwkJCQkJCQkodm9pZCAqKXJlY19kYXRhX3N0YXJ0LAorCQkJCQkJCWZpcnN0X3NlY3Rpb25fbGVuKTsKKwkJCWlmIChyZXMpIHsKKwkJCQlwcl9pbmZvKCJwMSByZWFkIG5vdCBlbmQgcmVzPSVkLCByZXF1ZXN0PSVkXG4iLAorCQkJCQlyZXMsIGZpcnN0X3NlY3Rpb25fbGVuKTsKKwkJCQljb3B5X29rID0gMDsKKworCQkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfbGVuIC09CisJCQkJCWZpcnN0X3NlY3Rpb25fbGVuIC0gcmVzOworCQkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfc3RhcnQgKz0KKwkJCQkJZmlyc3Rfc2VjdGlvbl9sZW4gLSByZXM7CisJCQkJcHVzZXJkYXRhX3BhcmEtPmRhdGFfc2l6ZSA9CisJCQkJCWZpcnN0X3NlY3Rpb25fbGVuIC0gcmVzOworCQkJfSBlbHNlIHsKKwkJCQlyZXMgPSAodTMyKWNvcHlfdG9fdXNlcigKKwkJCQkJKHZvaWQgKikocGRlc3RfYnVmK2ZpcnN0X3NlY3Rpb25fbGVuKSwKKwkJCQkJKHZvaWQgKilwX3VzZXJkYXRhX21nci0+ZGF0YV9idWYsCisJCQkJCWRhdGFfc2l6ZSAtIGZpcnN0X3NlY3Rpb25fbGVuKTsKKwkJCQlpZiAocmVzKSB7CisJCQkJCXByX2luZm8oInAyIHJlYWQgbm90IGVuZCByZXM9JWQsIHJlcXVlc3Q9JWRcbiIsCisJCQkJCQlyZXMsIGRhdGFfc2l6ZSk7CisJCQkJCWNvcHlfb2sgPSAwOworCQkJCX0KKwkJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX2xlbiAtPQorCQkJCQlkYXRhX3NpemUgLSByZXM7CisJCQkJcF91c2VyZGF0YV9yZWMtPnJlY19zdGFydCA9CisJCQkJCWRhdGFfc2l6ZSAtIGZpcnN0X3NlY3Rpb25fbGVuIC0gcmVzOworCQkJCXB1c2VyZGF0YV9wYXJhLT5kYXRhX3NpemUgPQorCQkJCQlkYXRhX3NpemUgLSByZXM7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXMgPSAodTMyKWNvcHlfdG9fdXNlcigodm9pZCAqKXBkZXN0X2J1ZiwKKwkJCQkJCSh2b2lkICopcmVjX2RhdGFfc3RhcnQsCisJCQkJCQlkYXRhX3NpemUpOworCQkJaWYgKHJlcykgeworCQkJCXByX2luZm8oInAzIHJlYWQgbm90IGVuZCByZXM9JWQsIHJlcXVlc3Q9JWRcbiIsCisJCQkJCXJlcywgZGF0YV9zaXplKTsKKwkJCQljb3B5X29rID0gMDsKKwkJCX0KKwkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfbGVuIC09IGRhdGFfc2l6ZSAtIHJlczsKKwkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfc3RhcnQgKz0gZGF0YV9zaXplIC0gcmVzOworCQkJcHVzZXJkYXRhX3BhcmEtPmRhdGFfc2l6ZSA9IGRhdGFfc2l6ZSAtIHJlczsKKwkJfQorCisJCWlmIChjb3B5X29rKSB7CisJCQlwX3VzZXJkYXRhX21nci0+cmVhZF9pbmRleCsrOworCQkJaWYgKHBfdXNlcmRhdGFfbWdyLT5yZWFkX2luZGV4ID49IFVTRVJEQVRBX0ZJRk9fTlVNKQorCQkJCXBfdXNlcmRhdGFfbWdyLT5yZWFkX2luZGV4ID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIGR2YiB1c2VyIGRhdGEgYnVmZmVyIGlzIG5vdCBlbm91Z2h0CisJCXRvIGNvcHkgdGhlIHdob2xlIHJlY29yZWQuICovCisJCWRhdGFfc2l6ZSA9IHB1c2VyZGF0YV9wYXJhLT5idWZfbGVuOworCQlpZiAocmVjX2RhdGFfc3RhcnQgKyBkYXRhX3NpemUKKwkJCT4gcF91c2VyZGF0YV9tZ3ItPmRhdGFfYnVmX2VuZCkgeworCQkJaW50IGZpcnN0X3NlY3Rpb25fbGVuOworCisJCQlmaXJzdF9zZWN0aW9uX2xlbiA9IHBfdXNlcmRhdGFfbWdyLT5idWZfbGVuCisJCQkJCQktIHBfdXNlcmRhdGFfcmVjLT5yZWNfc3RhcnQ7CisJCQlyZXMgPSAodTMyKWNvcHlfdG9fdXNlcigodm9pZCAqKXBkZXN0X2J1ZiwKKwkJCQkJCSh2b2lkICopcmVjX2RhdGFfc3RhcnQsCisJCQkJCQlmaXJzdF9zZWN0aW9uX2xlbik7CisJCQlpZiAocmVzKSB7CisJCQkJcHJfaW5mbygicDQgcmVhZCBub3QgZW5kIHJlcz0lZCwgcmVxdWVzdD0lZFxuIiwKKwkJCQkJcmVzLCBmaXJzdF9zZWN0aW9uX2xlbik7CisJCQkJY29weV9vayA9IDA7CisJCQkJcF91c2VyZGF0YV9yZWMtPnJlY19sZW4gLT0KKwkJCQkJZmlyc3Rfc2VjdGlvbl9sZW4gLSByZXM7CisJCQkJcF91c2VyZGF0YV9yZWMtPnJlY19zdGFydCArPQorCQkJCQlmaXJzdF9zZWN0aW9uX2xlbiAtIHJlczsKKwkJCQlwdXNlcmRhdGFfcGFyYS0+ZGF0YV9zaXplID0KKwkJCQkJZmlyc3Rfc2VjdGlvbl9sZW4gLSByZXM7CisJCQl9IGVsc2UgeworCQkJCS8qIGZpcnN0IHNlY3RvbiBjb3B5IGlzIG9rKi8KKwkJCQlyZXMgPSAodTMyKWNvcHlfdG9fdXNlcigKKwkJCQkJKHZvaWQgKikocGRlc3RfYnVmK2ZpcnN0X3NlY3Rpb25fbGVuKSwKKwkJCQkJKHZvaWQgKilwX3VzZXJkYXRhX21nci0+ZGF0YV9idWYsCisJCQkJCWRhdGFfc2l6ZSAtIGZpcnN0X3NlY3Rpb25fbGVuKTsKKwkJCQlpZiAocmVzKSB7CisJCQkJCXByX2luZm8oInA1IHJlYWQgbm90IGVuZCByZXM9JWQsIHJlcXVlc3Q9JWRcbiIsCisJCQkJCQlyZXMsCisJCQkJCQlkYXRhX3NpemUgLSBmaXJzdF9zZWN0aW9uX2xlbik7CisJCQkJCWNvcHlfb2sgPSAwOworCQkJCX0KKworCQkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfbGVuIC09IGRhdGFfc2l6ZSAtIHJlczsKKwkJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX3N0YXJ0ID0KKwkJCQkJZGF0YV9zaXplIC0gZmlyc3Rfc2VjdGlvbl9sZW4gLSByZXM7CisJCQkJcHVzZXJkYXRhX3BhcmEtPmRhdGFfc2l6ZSA9IGRhdGFfc2l6ZSAtIHJlczsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJlcyA9ICh1MzIpY29weV90b191c2VyKCh2b2lkICopcGRlc3RfYnVmLAorCQkJCQkJCSh2b2lkICopcmVjX2RhdGFfc3RhcnQsCisJCQkJCQkJZGF0YV9zaXplKTsKKwkJCWlmIChyZXMpIHsKKwkJCQlwcl9pbmZvKCJwNiByZWFkIG5vdCBlbmQgcmVzPSVkLCByZXF1ZXN0PSVkXG4iLAorCQkJCQlyZXMsIGRhdGFfc2l6ZSk7CisJCQkJY29weV9vayA9IDA7CisJCQl9CisKKwkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfbGVuIC09IGRhdGFfc2l6ZSAtIHJlczsKKwkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfc3RhcnQgKz0gZGF0YV9zaXplIC0gcmVzOworCQkJcHVzZXJkYXRhX3BhcmEtPmRhdGFfc2l6ZSA9IGRhdGFfc2l6ZSAtIHJlczsKKwkJfQorCisJCWlmIChjb3B5X29rKSB7CisJCQlwX3VzZXJkYXRhX21nci0+cmVhZF9pbmRleCsrOworCQkJaWYgKHBfdXNlcmRhdGFfbWdyLT5yZWFkX2luZGV4CisJCQkJPj0gVVNFUkRBVEFfRklGT19OVU0pCisJCQkJcF91c2VyZGF0YV9tZ3ItPnJlYWRfaW5kZXggPSAwOworCQl9CisKKwl9CisJcHVzZXJkYXRhX3BhcmEtPm1ldGFfaW5mbyA9IHBfdXNlcmRhdGFfcmVjLT5tZXRhX2luZm87CisKKwlpZiAocF91c2VyZGF0YV9tZ3ItPnJlYWRfaW5kZXggPD0gcF91c2VyZGF0YV9tZ3ItPndyaXRlX2luZGV4KQorCQlwdXNlcmRhdGFfcGFyYS0+bWV0YV9pbmZvLnJlY29yZHNfaW5fcXVlID0KKwkJCXBfdXNlcmRhdGFfbWdyLT53cml0ZV9pbmRleCAtCisJCQlwX3VzZXJkYXRhX21nci0+cmVhZF9pbmRleDsKKwllbHNlCisJCXB1c2VyZGF0YV9wYXJhLT5tZXRhX2luZm8ucmVjb3Jkc19pbl9xdWUgPQorCQkJcF91c2VyZGF0YV9tZ3ItPndyaXRlX2luZGV4ICsKKwkJCVVTRVJEQVRBX0ZJRk9fTlVNIC0KKwkJCXBfdXNlcmRhdGFfbWdyLT5yZWFkX2luZGV4OworCisJcHVzZXJkYXRhX3BhcmEtPnZlcnNpb24gPSAoMDw8MjR8MDw8MTZ8MDw8OHwxKTsKKworCW11dGV4X3VubG9jaygmdXNlcmRhdGFfbXV0ZXgpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHZoMjY0X3dha2V1cF91c2VyZGF0YV9wb2xsKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJYW1zdHJlYW1fd2FrZXVwX3VzZXJkYXRhX3BvbGwodmRlYyk7Cit9CisKK3N0YXRpYyB2b2lkIHZoMjY0X3Jlc2V0X3VzZXJkYXRhX2ZpZm8oc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGJJbml0KQoreworCW11dGV4X2xvY2soJnVzZXJkYXRhX211dGV4KTsKKworCWlmIChwX3VzZXJkYXRhX21ncikgeworCQlwcl9pbmZvKCJoMjY0X3Jlc2V0X3VzZXJkYXRhX2ZpZm86IGJJbml0OiAlZCwgcmk6ICVkLCB3aTogJWRcbiIsCisJCQliSW5pdCwgcF91c2VyZGF0YV9tZ3ItPnJlYWRfaW5kZXgsCisJCQlwX3VzZXJkYXRhX21nci0+d3JpdGVfaW5kZXgpOworCQlwX3VzZXJkYXRhX21nci0+cmVhZF9pbmRleCA9IDA7CisJCXBfdXNlcmRhdGFfbWdyLT53cml0ZV9pbmRleCA9IDA7CisKKwkJaWYgKGJJbml0KQorCQkJcF91c2VyZGF0YV9tZ3ItPmxhc3Rfd3AgPSAwOworCX0KKworCW11dGV4X3VubG9jaygmdXNlcmRhdGFfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBoMjY0X3Jlc2V0X3Fvc19tZ3Iodm9pZCkKK3sKKwlpbnQgaTsKKworCXByX2luZm8oImgyNjRfcmVzZXRfcW9zX21nclxuIik7CisKKwlJTklUX0xJU1RfSEVBRCgmZnJlZV9xb3Nfbm9kZXNfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJnBpY3R1cmVfcW9zX2xpc3QpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9GUkVFX1FPU19OT0RFUzsgaSsrKSB7CisJCWZyZWVfbm9kZXNbaV0uYl9vZmZzZXQgPSAweEZGRkZGRkZGOworCisJCWxpc3RfYWRkX3RhaWwoJmZyZWVfbm9kZXNbaV0ubGlzdCwKKwkJCQkmZnJlZV9xb3Nfbm9kZXNfbGlzdCk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGxvYWRfcW9zX2RhdGEoaW50IHBpY19udW1iZXIsIHVpbnQzMl90IGJfb2Zmc2V0KQoreworCXVpbnQzMl90IGJsazg4X3lfY291bnQ7CisJdWludDMyX3QgYmxrODhfY19jb3VudDsKKwl1aW50MzJfdCBibGsyMl9tdl9jb3VudDsKKwl1aW50MzJfdCByZGF0YTMyOworCWludDMyX3QgbXZfaGk7CisJaW50MzJfdCBtdl9sbzsKKwl1aW50MzJfdCByZGF0YTMyX2w7CisJdWludDMyX3QgbXZ4X0wwX2hpOworCXVpbnQzMl90IG12eV9MMF9oaTsKKwl1aW50MzJfdCBtdnhfTDFfaGk7CisJdWludDMyX3QgbXZ5X0wxX2hpOworCWludDY0X3QgdmFsdWU7CisJdWludDY0X3QgdGVtcF92YWx1ZTsKKy8qCisjZGVmaW5lIERFQlVHX1FPUworKi8KKyNkZWZpbmUgU1VQUE9SVF9OT0RFCisKKyNpZmRlZiBTVVBQT1JUX05PREUKKwlzdHJ1Y3QgaDI2NF9xb3NfZGF0YV9ub2RlX3QgKm5vZGU7CisJc3RydWN0IGgyNjRfcW9zX2RhdGFfbm9kZV90ICp0bXA7CisJaW50IGJGb3VuZE5vZGUgPSAwOworCisJbm9kZSA9IE5VTEw7CisJaWYgKCFsaXN0X2VtcHR5KCZwaWN0dXJlX3Fvc19saXN0KSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobm9kZSwgdG1wLCAmcGljdHVyZV9xb3NfbGlzdCwgbGlzdCkgeworCQkJaWYgKG5vZGUtPmJfb2Zmc2V0ID09IGJfb2Zmc2V0KSB7CisJCQkJYkZvdW5kTm9kZSA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJLyoKKwlwcl9pbmZvKCJiRm91bmROb2RlID0gJWQsIG5vZGU6MHglcFxuIiwgYkZvdW5kTm9kZSwgbm9kZSk7CisJKi8KKwlpZiAoIWJGb3VuZE5vZGUpIHsKKwkJaWYgKCFsaXN0X2VtcHR5KCZmcmVlX3Fvc19ub2Rlc19saXN0KSkgeworCQkJbm9kZSA9IGxpc3RfZW50cnkoCisJCQkJCWZyZWVfcW9zX25vZGVzX2xpc3QubmV4dCwKKwkJCQkJc3RydWN0IGgyNjRfcW9zX2RhdGFfbm9kZV90LAorCQkJCQlsaXN0KTsKKwkJCS8qCisJCQlwcl9pbmZvKCJnZXQgYSBub2RlOjB4JXBcbiIsIG5vZGUpOworCQkJKi8KKwkJfSBlbHNlIHsKKwkJCXByX2luZm8oInRoZXJlIGlzIG5vIHFvcyBkYXRhIG5vZGUgYXZhaWJsZVxuIik7CisKKwkJCXJldHVybjsKKwkJfQorCX0KKworCW5vZGUtPmJfb2Zmc2V0ID0gYl9vZmZzZXQ7CisJbm9kZS0+cG9jID0gcGljX251bWJlcjsKKworCW5vZGUtPm1heF9tdiA9IDA7CisJbm9kZS0+YXZnX212ID0gMDsKKwlub2RlLT5taW5fbXYgPSAwOworCisJbm9kZS0+bWF4X3NraXAgPSAwOworCW5vZGUtPmF2Z19za2lwID0gMDsKKwlub2RlLT5taW5fc2tpcCA9IDA7CisKKwlub2RlLT5tYXhfcXAgPSAwOworCW5vZGUtPmF2Z19xcCA9IDA7CisJbm9kZS0+bWluX3FwID0gMDsKKyNlbmRpZgorCisKKworCisKKworCS8qIHNldCByZF9pZHggdG8gMCAqLworCVdSSVRFX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9DVFJMLCAwKTsKKwlibGs4OF95X2NvdW50ID0gUkVBRF9WUkVHKFZERUNfUElDX1FVQUxJVFlfREFUQSk7CisJaWYgKGJsazg4X3lfY291bnQgPT0gMCkgeworI2lmZGVmIERFQlVHX1FPUworCQlwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gTk8gRGF0YSB5ZXQuXG4iLAorCQkJcGljX251bWJlcik7CisjZW5kaWYKKwkJLyogcmVzZXQgYWxsIGNvdW50cyAqLworCQlXUklURV9WUkVHKFZERUNfUElDX1FVQUxJVFlfQ1RSTCwgKDE8PDgpKTsKKworI2lmZGVmIFNVUFBPUlRfTk9ERQorCQlsaXN0X21vdmUoJm5vZGUtPmxpc3QsICZwaWN0dXJlX3Fvc19saXN0KTsKKyNlbmRpZgorCQlyZXR1cm47CisJfQorCS8qIHFwX3lfc3VtICovCisJcmRhdGEzMiA9IFJFQURfVlJFRyhWREVDX1BJQ19RVUFMSVRZX0RBVEEpOworI2lmZGVmIERFQlVHX1FPUworCXByX2luZm8oIiBbUGljdHVyZSAlZCBRdWFsaXR5XSBZIFFQIEFWRyA6ICVkICglZC8lZClcbiIsCisJCXBpY19udW1iZXIsIHJkYXRhMzIvYmxrODhfeV9jb3VudCwKKwkJcmRhdGEzMiwgYmxrODhfeV9jb3VudCk7CisjZW5kaWYKKyNpZmRlZiBTVVBQT1JUX05PREUKKwlub2RlLT5hdmdfcXAgPSByZGF0YTMyL2Jsazg4X3lfY291bnQ7CisjZW5kaWYKKworCS8qIGludHJhX3lfY291bnQgKi8KKwlyZGF0YTMyID0gUkVBRF9WUkVHKFZERUNfUElDX1FVQUxJVFlfREFUQSk7CisjaWZkZWYgREVCVUdfUU9TCisJcHJfaW5mbygiIFtQaWN0dXJlICVkIFF1YWxpdHldIFkgaW50cmEgcmF0ZSA6ICVkJWMgKCVkKVxuIiwKKwkJcGljX251bWJlciwgcmRhdGEzMioxMDAvYmxrODhfeV9jb3VudCwKKwkJJyUnLCByZGF0YTMyKTsKKyNlbmRpZgorCS8qIHNraXBwZWRfeV9jb3VudCAqLworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9EQVRBKTsKKyNpZmRlZiBERUJVR19RT1MKKwlwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gWSBza2lwcGVkIHJhdGUgOiAlZCVjICglZClcbiIsCisJCXBpY19udW1iZXIsIHJkYXRhMzIqMTAwL2Jsazg4X3lfY291bnQsCisJCSclJywgcmRhdGEzMik7CisjZW5kaWYKKyNpZmRlZiBTVVBQT1JUX05PREUKKwlub2RlLT5hdmdfc2tpcCA9IHJkYXRhMzIqMTAwL2Jsazg4X3lfY291bnQ7CisjZW5kaWYKKwkvKiBjb2VmZl9ub25femVyb195X2NvdW50ICovCisJcmRhdGEzMiA9IFJFQURfVlJFRyhWREVDX1BJQ19RVUFMSVRZX0RBVEEpOworI2lmZGVmIERFQlVHX1FPUworCXByX2luZm8oIiBbUGljdHVyZSAlZCBRdWFsaXR5XSBZIFpFUk9fQ29lZmYgcmF0ZSA6ICVkJWMgKCVkKVxuIiwKKwkJcGljX251bWJlciwgKDEwMCAtIHJkYXRhMzIqMTAwLyhibGs4OF95X2NvdW50KjEpKSwKKwkJJyUnLCByZGF0YTMyKTsKKyNlbmRpZgorCS8qIGJsazY2X2NfY291bnQgKi8KKwlibGs4OF9jX2NvdW50ID0gUkVBRF9WUkVHKFZERUNfUElDX1FVQUxJVFlfREFUQSk7CisJaWYgKGJsazg4X2NfY291bnQgPT0gMCkgeworI2lmZGVmIERFQlVHX1FPUworCQlwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gTk8gRGF0YSB5ZXQuXG4iLAorCQkJcGljX251bWJlcik7CisjZW5kaWYKKwkJLyogcmVzZXQgYWxsIGNvdW50cyAqLworCQlXUklURV9WUkVHKFZERUNfUElDX1FVQUxJVFlfQ1RSTCwgKDE8PDgpKTsKKworI2lmZGVmIFNVUFBPUlRfTk9ERQorCQlsaXN0X21vdmUoJm5vZGUtPmxpc3QsICZwaWN0dXJlX3Fvc19saXN0KTsKKyNlbmRpZgorCQlyZXR1cm47CisJfQorCS8qIHFwX2Nfc3VtICovCisJcmRhdGEzMiA9IFJFQURfVlJFRyhWREVDX1BJQ19RVUFMSVRZX0RBVEEpOworI2lmZGVmIERFQlVHX1FPUworCXByX2luZm8oIiBbUGljdHVyZSAlZCBRdWFsaXR5XSBDIFFQIEFWRyA6ICVkICglZC8lZClcbiIsCisJCXBpY19udW1iZXIsIHJkYXRhMzIvYmxrODhfY19jb3VudCwKKwkJcmRhdGEzMiwgYmxrODhfY19jb3VudCk7CisjZW5kaWYKKwkvKiBpbnRyYV9jX2NvdW50ICovCisJcmRhdGEzMiA9IFJFQURfVlJFRyhWREVDX1BJQ19RVUFMSVRZX0RBVEEpOworI2lmZGVmIERFQlVHX1FPUworCXByX2luZm8oIiBbUGljdHVyZSAlZCBRdWFsaXR5XSBDIGludHJhIHJhdGUgOiAlZCVjICglZClcbiIsCisJCXBpY19udW1iZXIsIHJkYXRhMzIqMTAwL2Jsazg4X2NfY291bnQsCisJCSclJywgcmRhdGEzMik7CisjZW5kaWYKKwkvKiBza2lwcGVkX2N1X2NfY291bnQgKi8KKwlyZGF0YTMyID0gUkVBRF9WUkVHKFZERUNfUElDX1FVQUxJVFlfREFUQSk7CisjaWZkZWYgREVCVUdfUU9TCisJcHJfaW5mbygiIFtQaWN0dXJlICVkIFF1YWxpdHldIEMgc2tpcHBlZCByYXRlIDogJWQlYyAoJWQpXG4iLAorCQlwaWNfbnVtYmVyLCByZGF0YTMyKjEwMC9ibGs4OF9jX2NvdW50LAorCQknJScsIHJkYXRhMzIpOworI2VuZGlmCisJLyogY29lZmZfbm9uX3plcm9fY19jb3VudCAqLworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9EQVRBKTsKKyNpZmRlZiBERUJVR19RT1MKKwlwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gQyBaRVJPX0NvZWZmIHJhdGUgOiAlZCVjICglZClcbiIsCisJCXBpY19udW1iZXIsICgxMDAgLSByZGF0YTMyKjEwMC8oYmxrODhfY19jb3VudCoxKSksCisJCSclJywgcmRhdGEzMik7CisjZW5kaWYKKworCS8qIDEnaDAsIHFwX2NfbWF4WzY6MF0sIDEnaDAsIHFwX2NfbWluWzY6MF0sCisJMSdoMCwgcXBfeV9tYXhbNjowXSwgMSdoMCwgcXBfeV9taW5bNjowXSAqLworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9EQVRBKTsKKyNpZmRlZiBERUJVR19RT1MKKwlwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gWSBRUCBtaW4gOiAlZFxuIiwKKwkJcGljX251bWJlciwgKHJkYXRhMzI+PjApJjB4ZmYpOworI2VuZGlmCisjaWZkZWYgU1VQUE9SVF9OT0RFCisJbm9kZS0+bWluX3FwID0gKHJkYXRhMzI+PjApJjB4ZmY7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX1FPUworCXByX2luZm8oIiBbUGljdHVyZSAlZCBRdWFsaXR5XSBZIFFQIG1heCA6ICVkXG4iLAorCQlwaWNfbnVtYmVyLCAocmRhdGEzMj4+OCkmMHhmZik7CisjZW5kaWYKKyNpZmRlZiBTVVBQT1JUX05PREUKKwlub2RlLT5tYXhfcXAgPSAocmRhdGEzMj4+OCkmMHhmZjsKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfUU9TCisJcHJfaW5mbygiIFtQaWN0dXJlICVkIFF1YWxpdHldIEMgUVAgbWluIDogJWRcbiIsCisJCXBpY19udW1iZXIsIChyZGF0YTMyPj4xNikmMHhmZik7CisJcHJfaW5mbygiIFtQaWN0dXJlICVkIFF1YWxpdHldIEMgUVAgbWF4IDogJWRcbiIsCisJCXBpY19udW1iZXIsIChyZGF0YTMyPj4yNCkmMHhmZik7CisjZW5kaWYKKworCS8qIGJsazIyX212X2NvdW50ICovCisJYmxrMjJfbXZfY291bnQgPSBSRUFEX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9EQVRBKTsKKwlpZiAoYmxrMjJfbXZfY291bnQgPT0gMCkgeworI2lmZGVmIERFQlVHX1FPUworCQlwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gTk8gTVYgRGF0YSB5ZXQuXG4iLAorCQkJcGljX251bWJlcik7CisjZW5kaWYKKwkJLyogcmVzZXQgYWxsIGNvdW50cyAqLworCQlXUklURV9WUkVHKFZERUNfUElDX1FVQUxJVFlfQ1RSTCwgKDE8PDgpKTsKKyNpZmRlZiBTVVBQT1JUX05PREUKKwkJbGlzdF9tb3ZlKCZub2RlLT5saXN0LCAmcGljdHVyZV9xb3NfbGlzdCk7CisjZW5kaWYKKwkJcmV0dXJuOworCX0KKwkvKiBtdnlfTDFfY291bnRbMzk6MzJdLCBtdnhfTDFfY291bnRbMzk6MzJdLAorCW12eV9MMF9jb3VudFszOTozMl0sIG12eF9MMF9jb3VudFszOTozMl0gKi8KKwlyZGF0YTMyID0gUkVBRF9WUkVHKFZERUNfUElDX1FVQUxJVFlfREFUQSk7CisJLyogc2hvdWxkIGFsbCBiZSAweDAwIG9yIDB4ZmYgKi8KKyNpZmRlZiBERUJVR19RT1MKKwlwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVYgQVZHIEhpZ2ggQml0czogMHglWFxuIiwKKwkJcGljX251bWJlciwgcmRhdGEzMik7CisjZW5kaWYKKwltdnhfTDBfaGkgPSAoKHJkYXRhMzI+PjApJjB4ZmYpOworCW12eV9MMF9oaSA9ICgocmRhdGEzMj4+OCkmMHhmZik7CisJbXZ4X0wxX2hpID0gKChyZGF0YTMyPj4xNikmMHhmZik7CisJbXZ5X0wxX2hpID0gKChyZGF0YTMyPj4yNCkmMHhmZik7CisKKwkvKiBtdnhfTDBfY291bnRbMzE6MF0gKi8KKwlyZGF0YTMyX2wgPSBSRUFEX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9EQVRBKTsKKwl0ZW1wX3ZhbHVlID0gbXZ4X0wwX2hpOworCXRlbXBfdmFsdWUgPSAodGVtcF92YWx1ZSA8PCAzMikgfCByZGF0YTMyX2w7CisKKwlpZiAobXZ4X0wwX2hpICYgMHg4MCkKKwkJdmFsdWUgPSAweEZGRkZGRkYwMDAwMDAwMDAgfCB0ZW1wX3ZhbHVlOworCWVsc2UKKwkJdmFsdWUgPSB0ZW1wX3ZhbHVlOworCXZhbHVlID0gZGl2X3M2NCh2YWx1ZSwgYmxrMjJfbXZfY291bnQpOworI2lmZGVmIERFQlVHX1FPUworCXByX2luZm8oIiBbUGljdHVyZSAlZCBRdWFsaXR5XSBNVlhfTDAgQVZHIDogJWQgKCVsbGQvJWQpXG4iLAorCQlwaWNfbnVtYmVyLCAoaW50KSh2YWx1ZSksCisJCXZhbHVlLCBibGsyMl9tdl9jb3VudCk7CisjZW5kaWYKKyNpZmRlZiBTVVBQT1JUX05PREUKKwlub2RlLT5hdmdfbXYgPSB2YWx1ZTsKKyNlbmRpZgorCisJLyogbXZ5X0wwX2NvdW50WzMxOjBdICovCisJcmRhdGEzMl9sID0gUkVBRF9WUkVHKFZERUNfUElDX1FVQUxJVFlfREFUQSk7CisJdGVtcF92YWx1ZSA9IG12eV9MMF9oaTsKKwl0ZW1wX3ZhbHVlID0gKHRlbXBfdmFsdWUgPDwgMzIpIHwgcmRhdGEzMl9sOworCisJaWYgKG12eV9MMF9oaSAmIDB4ODApCisJCXZhbHVlID0gMHhGRkZGRkZGMDAwMDAwMDAwIHwgdGVtcF92YWx1ZTsKKwllbHNlCisJCXZhbHVlID0gdGVtcF92YWx1ZTsKKyNpZmRlZiBERUJVR19RT1MKKwlwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZZX0wwIEFWRyA6ICVkICglbGxkLyVkKVxuIiwKKwkJcGljX251bWJlciwgcmRhdGEzMl9sL2JsazIyX212X2NvdW50LAorCQl2YWx1ZSwgYmxrMjJfbXZfY291bnQpOworI2VuZGlmCisKKwkvKiBtdnhfTDFfY291bnRbMzE6MF0gKi8KKwlyZGF0YTMyX2wgPSBSRUFEX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9EQVRBKTsKKwl0ZW1wX3ZhbHVlID0gbXZ4X0wxX2hpOworCXRlbXBfdmFsdWUgPSAodGVtcF92YWx1ZSA8PCAzMikgfCByZGF0YTMyX2w7CisJaWYgKG12eF9MMV9oaSAmIDB4ODApCisJCXZhbHVlID0gMHhGRkZGRkZGMDAwMDAwMDAwIHwgdGVtcF92YWx1ZTsKKwllbHNlCisJCXZhbHVlID0gdGVtcF92YWx1ZTsKKyNpZmRlZiBERUJVR19RT1MKKwlwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZYX0wxIEFWRyA6ICVkICglbGxkLyVkKVxuIiwKKwkJcGljX251bWJlciwgcmRhdGEzMl9sL2JsazIyX212X2NvdW50LAorCQl2YWx1ZSwgYmxrMjJfbXZfY291bnQpOworI2VuZGlmCisKKwkvKiBtdnlfTDFfY291bnRbMzE6MF0gKi8KKwlyZGF0YTMyX2wgPSBSRUFEX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9EQVRBKTsKKwl0ZW1wX3ZhbHVlID0gbXZ5X0wxX2hpOworCXRlbXBfdmFsdWUgPSAodGVtcF92YWx1ZSA8PCAzMikgfCByZGF0YTMyX2w7CisJaWYgKG12eV9MMV9oaSAmIDB4ODApCisJCXZhbHVlID0gMHhGRkZGRkZGMDAwMDAwMDAwIHwgdGVtcF92YWx1ZTsKKwllbHNlCisJCXZhbHVlID0gdGVtcF92YWx1ZTsKKyNpZmRlZiBERUJVR19RT1MKKwlwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZZX0wxIEFWRyA6ICVkICglbGxkLyVkKVxuIiwKKwkJcGljX251bWJlciwgcmRhdGEzMl9sL2JsazIyX212X2NvdW50LAorCQl2YWx1ZSwgYmxrMjJfbXZfY291bnQpOworI2VuZGlmCisKKwkvKiB7bXZ4X0wwX21heCwgbXZ4X0wwX21pbn0gLy8gZm9ybWF0IDoge3NpZ24sIGFic1sxNDowXX0gICovCisJcmRhdGEzMiA9IFJFQURfVlJFRyhWREVDX1BJQ19RVUFMSVRZX0RBVEEpOworCW12X2hpID0gKHJkYXRhMzI+PjE2KSYweGZmZmY7CisJaWYgKG12X2hpICYgMHg4MDAwKQorCQltdl9oaSA9IDB4ODAwMCAtIG12X2hpOworI2lmZGVmIERFQlVHX1FPUworCXByX2luZm8oIiBbUGljdHVyZSAlZCBRdWFsaXR5XSBNVlhfTDAgTUFYIDogJWRcbiIsCisJCXBpY19udW1iZXIsIG12X2hpKTsKKyNlbmRpZgorI2lmZGVmIFNVUFBPUlRfTk9ERQorCW5vZGUtPm1heF9tdiA9IG12X2hpOworI2VuZGlmCisKKwltdl9sbyA9IChyZGF0YTMyPj4wKSYweGZmZmY7CisJaWYgKG12X2xvICYgMHg4MDAwKQorCQltdl9sbyA9IDB4ODAwMCAtIG12X2xvOworI2lmZGVmIERFQlVHX1FPUworCXByX2luZm8oIiBbUGljdHVyZSAlZCBRdWFsaXR5XSBNVlhfTDAgTUlOIDogJWRcbiIsCisJCXBpY19udW1iZXIsIG12X2xvKTsKKyNlbmRpZgorI2lmZGVmIFNVUFBPUlRfTk9ERQorCW5vZGUtPm1pbl9tdiA9IG12X2xvOworI2VuZGlmCisKKyNpZmRlZiBERUJVR19RT1MKKwkvKiB7bXZ5X0wwX21heCwgbXZ5X0wwX21pbn0gKi8KKwlyZGF0YTMyID0gUkVBRF9WUkVHKFZERUNfUElDX1FVQUxJVFlfREFUQSk7CisJbXZfaGkgPSAocmRhdGEzMj4+MTYpJjB4ZmZmZjsKKwlpZiAobXZfaGkgJiAweDgwMDApCisJCW12X2hpID0gMHg4MDAwIC0gbXZfaGk7CisJcHJfaW5mbygiIFtQaWN0dXJlICVkIFF1YWxpdHldIE1WWV9MMCBNQVggOiAlZFxuIiwKKwkJcGljX251bWJlciwgbXZfaGkpOworCisKKwltdl9sbyA9IChyZGF0YTMyPj4wKSYweGZmZmY7CisJaWYgKG12X2xvICYgMHg4MDAwKQorCQltdl9sbyA9IDB4ODAwMCAtIG12X2xvOworCisJcHJfaW5mbygiIFtQaWN0dXJlICVkIFF1YWxpdHldIE1WWV9MMCBNSU4gOiAlZFxuIiwKKwkJcGljX251bWJlciwgbXZfbG8pOworCisKKwkvKiB7bXZ4X0wxX21heCwgbXZ4X0wxX21pbn0gKi8KKwlyZGF0YTMyID0gUkVBRF9WUkVHKFZERUNfUElDX1FVQUxJVFlfREFUQSk7CisJbXZfaGkgPSAocmRhdGEzMj4+MTYpJjB4ZmZmZjsKKwlpZiAobXZfaGkgJiAweDgwMDApCisJCW12X2hpID0gMHg4MDAwIC0gbXZfaGk7CisKKwlwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZYX0wxIE1BWCA6ICVkXG4iLAorCQlwaWNfbnVtYmVyLCBtdl9oaSk7CisKKworCW12X2xvID0gKHJkYXRhMzI+PjApJjB4ZmZmZjsKKwlpZiAobXZfbG8gJiAweDgwMDApCisJCW12X2xvID0gMHg4MDAwIC0gbXZfbG87CisKKwlwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZYX0wxIE1JTiA6ICVkXG4iLAorCQlwaWNfbnVtYmVyLCBtdl9sbyk7CisKKworCS8qIHttdnlfTDFfbWF4LCBtdnlfTDFfbWlufSAqLworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9EQVRBKTsKKwltdl9oaSA9IChyZGF0YTMyPj4xNikmMHhmZmZmOworCWlmIChtdl9oaSAmIDB4ODAwMCkKKwkJbXZfaGkgPSAweDgwMDAgLSBtdl9oaTsKKworCXByX2luZm8oIiBbUGljdHVyZSAlZCBRdWFsaXR5XSBNVllfTDEgTUFYIDogJWRcbiIsCisJCXBpY19udW1iZXIsIG12X2hpKTsKKworCW12X2xvID0gKHJkYXRhMzI+PjApJjB4ZmZmZjsKKwlpZiAobXZfbG8gJiAweDgwMDApCisJCW12X2xvID0gMHg4MDAwIC0gbXZfbG87CisKKwlwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZZX0wxIE1JTiA6ICVkXG4iLAorCQlwaWNfbnVtYmVyLCBtdl9sbyk7CisjZW5kaWYKKworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9DVFJMKTsKKyNpZmRlZiBERUJVR19RT1MKKwlwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gQWZ0ZXIgUmVhZCA6IFZERUNfUElDX1FVQUxJVFlfQ1RSTCA6IDB4JXhcbiIsCisJCXBpY19udW1iZXIsIHJkYXRhMzIpOworI2VuZGlmCisJLyogcmVzZXQgYWxsIGNvdW50cyAqLworCVdSSVRFX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9DVFJMLCAoMTw8OCkpOworI2lmZGVmIFNVUFBPUlRfTk9ERQorCWxpc3RfbW92ZSgmbm9kZS0+bGlzdCwgJnBpY3R1cmVfcW9zX2xpc3QpOworI2VuZGlmCit9CisKK3ZvaWQgc2VhcmNoX3Fvc19ub2RlKHN0cnVjdCB2ZnJhbWVfcW9zX3MgKnBpY3R1cmVfcW9zLCB1aW50MzJfdCBiX29mZnNldCkKK3sKKwlzdHJ1Y3QgaDI2NF9xb3NfZGF0YV9ub2RlX3QgKm5vZGU7CisJc3RydWN0IGgyNjRfcW9zX2RhdGFfbm9kZV90ICp0bXA7CisKKwlpZiAoIWxpc3RfZW1wdHkoJnBpY3R1cmVfcW9zX2xpc3QpKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShub2RlLCB0bXAsICZwaWN0dXJlX3Fvc19saXN0LCBsaXN0KSB7CisJCQlpZiAobm9kZS0+Yl9vZmZzZXQgPT0gYl9vZmZzZXQpIHsKKworCQkJCXBpY3R1cmVfcW9zLT5hdmdfbXYgPSBub2RlLT5hdmdfbXY7CisJCQkJcGljdHVyZV9xb3MtPm1pbl9tdiA9IG5vZGUtPm1pbl9tdjsKKwkJCQlwaWN0dXJlX3Fvcy0+bWF4X212ID0gbm9kZS0+bWF4X212OworCisJCQkJcGljdHVyZV9xb3MtPmF2Z19za2lwID0gbm9kZS0+YXZnX3NraXA7CisJCQkJcGljdHVyZV9xb3MtPm1pbl9za2lwID0gbm9kZS0+bWluX3NraXA7CisJCQkJcGljdHVyZV9xb3MtPm1heF9za2lwID0gbm9kZS0+bWF4X3NraXA7CisKKwkJCQlwaWN0dXJlX3Fvcy0+YXZnX3FwID0gbm9kZS0+YXZnX3FwOworCQkJCXBpY3R1cmVfcW9zLT5taW5fcXAgPSBub2RlLT5taW5fcXA7CisJCQkJcGljdHVyZV9xb3MtPm1heF9xcCA9IG5vZGUtPm1heF9xcDsKKworI2lmIDAKKwkJCQlwcl9pbmZvKCJQT0M6JWQsIG12OiBtYXg6JWQsICBhdmc6JWQsIG1pbjolZFxuIgorCQkJCQkicXA6IG1heDolZCwgIGF2ZzolZCwgbWluOiVkXG4iCisJCQkJCSJza2lwOiBtYXg6JWQsICBhdmc6JWQsIG1pbjolZFxuIiwKKwkJCQkJbm9kZS0+cG9jLAorCQkJCQlwaWN0dXJlX3Fvcy0+bWF4X212LAorCQkJCQlwaWN0dXJlX3Fvcy0+YXZnX212LAorCQkJCQlwaWN0dXJlX3Fvcy0+bWluX212LAorCQkJCQlwaWN0dXJlX3Fvcy0+bWF4X3FwLAorCQkJCQlwaWN0dXJlX3Fvcy0+YXZnX3FwLAorCQkJCQlwaWN0dXJlX3Fvcy0+bWluX3FwLAorCQkJCQlwaWN0dXJlX3Fvcy0+bWF4X3NraXAsCisJCQkJCXBpY3R1cmVfcW9zLT5hdmdfc2tpcCwKKwkJCQkJcGljdHVyZV9xb3MtPm1pbl9za2lwKTsKKyNlbmRpZgorCQkJCW5vZGUtPmJfb2Zmc2V0ID0gMHhGRkZGRkZGRjsKKwkJCQlsaXN0X21vdmUoJm5vZGUtPmxpc3QsICZmcmVlX3Fvc19ub2Rlc19saXN0KTsKKworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBxb3NfZG9fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJdWludDMyX3QgcG9jOworCXVpbnQzMl90IGJPZmZzZXQ7CisKKworCXBvYyA9IFJFQURfVlJFRyhBVl9TQ1JBVENIX00pOworCWJPZmZzZXQgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9MKTsKKy8qCisJcHJfaW5mbygicG9jOiVkLCBiT2Zmc2V0OjB4JXhcbiIsIHBvYywgYk9mZnNldCk7CisqLworCWxvYWRfcW9zX2RhdGEocG9jLCBiT2Zmc2V0KTsKKworCisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzAsIDApOworfQorCitzdGF0aWMgdm9pZCB1c2VyZGF0YV9wdXNoX2RvX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXVuc2lnbmVkIGludCBzZWlfaXR1MzVfZmxhZ3M7CisJdW5zaWduZWQgaW50IHNlaV9pdHUzNV93cDsKKwl1bnNpZ25lZCBpbnQgc2VpX2l0dTM1X2RhdGFfbGVuZ3RoOworCisJc3RydWN0IHVzZXJkYXRhX21ldGFfaW5mb190IG1ldGFfaW5mbzsKKwl1MzIgb2Zmc2V0LCBwdHM7CisJdTY0IHB0c191czY0ID0gMDsKKwl1MzIgc2xpY2VfdHlwZTsKKwl1MzIgcmVnOworCXUzMiBwb2NfbnVtYmVyOworCXUzMiBwaWN0dXJlX3N0cnVjdDsKKworCW1lbXNldCgmbWV0YV9pbmZvLCAwLCBzaXplb2YobWV0YV9pbmZvKSk7CisKKwltZXRhX2luZm8uZHVyYXRpb24gPSBmcmFtZV9kdXI7CisKKwlyZWcgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9NKTsKKwlwb2NfbnVtYmVyID0gcmVnICYgMHg3RkZGRkZGOworCWlmICgocG9jX251bWJlciA+PiAxNikgPT0gMHg3RkYpCisJCXBvY19udW1iZXIgPSAocmVnICYgMHg3RkZGRkZGKSAtIDB4ODAwMDAwMDsKKworCXNsaWNlX3R5cGUgPSAocmVnID4+IDI5KSAmIDB4NzsKKwlzd2l0Y2ggKHNsaWNlX3R5cGUpIHsKKwljYXNlIFNMSUNFX1RZUEVfSToKKwkJCW1ldGFfaW5mby5mbGFncyB8PSAxPDw3OworCQkJYnJlYWs7CisJY2FzZSBTTElDRV9UWVBFX1A6CisJCQltZXRhX2luZm8uZmxhZ3MgfD0gMzw8NzsKKwkJCWJyZWFrOworCWNhc2UgU0xJQ0VfVFlQRV9COgorCQkJbWV0YV9pbmZvLmZsYWdzIHw9IDI8PDc7CisJCQlicmVhazsKKwl9CisJbWV0YV9pbmZvLnBvY19udW1iZXIgPSBwb2NfbnVtYmVyOworCXBpY3R1cmVfc3RydWN0ID0gKHJlZyA+PiAyNykgJiAweDM7CisKKwltZXRhX2luZm8uZmxhZ3MgfD0gKFZGT1JNQVRfSDI2NCA8PCAzKSB8IChwaWN0dXJlX3N0cnVjdCA8PCAxMik7CisKKworCW9mZnNldCA9IFJFQURfVlJFRyhBVl9TQ1JBVENIX0wpOworCisJaWYgKHB0c19waWNrb3V0X29mZnNldF91czY0CisJCQkgKFBUU19UWVBFX1ZJREVPLCBvZmZzZXQsICZwdHMsIDAsICZwdHNfdXM2NCkgIT0gMCkgeworCQlwcl9pbmZvKCJwdHMgcGljayBvdXRmYWlsZWQsIG9mZnNldDoweCV4XG4iLCBvZmZzZXQpOworCQlwdHMgPSAtMTsKKwkJbWV0YV9pbmZvLnZwdHNfdmFsaWQgPSAwOworCX0gZWxzZQorCQltZXRhX2luZm8udnB0c192YWxpZCA9IDE7CisJbWV0YV9pbmZvLnZwdHMgPSBwdHM7CisvKgorCXByX2luZm8oIm9mZnNldDoweCV4LCB2cHRzOjB4JXgsIHNsaWNlOiVkLCBwb2M6JWRcbiIsCisJCW9mZnNldCwgcHRzLCBzbGljZV90eXBlLAorCQlwb2NfbnVtYmVyKTsKKyovCisJc2VpX2l0dTM1X2ZsYWdzID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfSik7CisJc2VpX2l0dTM1X3dwID0gKHNlaV9pdHUzNV9mbGFncyA+PiAxNikgJiAweGZmZmY7CisJc2VpX2l0dTM1X2RhdGFfbGVuZ3RoID0gc2VpX2l0dTM1X2ZsYWdzICYgMHg3ZmZmOworCisJaWYgKGVuYWJsZV91c2VyZGF0YV9kZWJ1ZykKKwkJdWRyX2R1bXBfZGF0YShzZWlfaXR1MzVfd3AsCisJCQlzZWlfaXR1MzVfZGF0YV9sZW5ndGgsCisJCQlwdHMsIHBvY19udW1iZXIpOworCisKKwl2aDI2NF9hZGRfdXNlcmRhdGEobWV0YV9pbmZvLCBzZWlfaXR1MzVfd3ApOworCisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0osIDApOworfQorCisKK3N0YXRpYyB2b2lkIHNldF9mcmFtZV9pbmZvKHN0cnVjdCB2ZnJhbWVfcyAqdmYpCit7CisJdmYtPndpZHRoID0gZnJhbWVfd2lkdGg7CisJdmYtPmhlaWdodCA9IGZyYW1lX2hlaWdodDsKKwl2Zi0+ZHVyYXRpb24gPSBmcmFtZV9kdXI7CisJdmYtPnJhdGlvX2NvbnRyb2wgPQorCQkobWluKGgyNjRfYXIsICh1MzIpIERJU1BfUkFUSU9fQVNQRUNUX1JBVElPX01BWCkpIDw8CisJCURJU1BfUkFUSU9fQVNQRUNUX1JBVElPX0JJVDsKKwl2Zi0+b3JpZW50YXRpb24gPSB2aDI2NF9yb3RhdGlvbjsKKwl2Zi0+ZmxhZyA9IDA7CisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19QT1NUX1BST0NFU1NfTUFOQUdFUl8zRF9QUk9DRVNTCisJdmYtPnRyYW5zX2ZtdCA9IDA7CisJaWYgKCh2Zi0+dHJhbnNfZm10ID09IFRWSU5fVEZNVF8zRF9MUkYpIHx8CisJCSh2Zi0+dHJhbnNfZm10ID09IFRWSU5fVEZNVF8zRF9MQSkpIHsKKwkJdmYtPmxlZnRfZXllLnN0YXJ0X3ggPSAwOworCQl2Zi0+bGVmdF9leWUuc3RhcnRfeSA9IDA7CisJCXZmLT5sZWZ0X2V5ZS53aWR0aCA9IGZyYW1lX3dpZHRoIC8gMjsKKwkJdmYtPmxlZnRfZXllLmhlaWdodCA9IGZyYW1lX2hlaWdodDsKKworCQl2Zi0+cmlnaHRfZXllLnN0YXJ0X3ggPSAwOworCQl2Zi0+cmlnaHRfZXllLnN0YXJ0X3kgPSAwOworCQl2Zi0+cmlnaHRfZXllLndpZHRoID0gZnJhbWVfd2lkdGggLyAyOworCQl2Zi0+cmlnaHRfZXllLmhlaWdodCA9IGZyYW1lX2hlaWdodDsKKwl9IGVsc2UgaWYgKCh2Zi0+dHJhbnNfZm10ID09IFRWSU5fVEZNVF8zRF9MUkhfT0xFUikgfHwKKwkJCSAgICh2Zi0+dHJhbnNfZm10ID09IFRWSU5fVEZNVF8zRF9UQikpIHsKKwkJdmYtPmxlZnRfZXllLnN0YXJ0X3ggPSAwOworCQl2Zi0+bGVmdF9leWUuc3RhcnRfeSA9IDA7CisJCXZmLT5sZWZ0X2V5ZS53aWR0aCA9IGZyYW1lX3dpZHRoIC8gMjsKKwkJdmYtPmxlZnRfZXllLmhlaWdodCA9IGZyYW1lX2hlaWdodDsKKworCQl2Zi0+cmlnaHRfZXllLnN0YXJ0X3ggPSAwOworCQl2Zi0+cmlnaHRfZXllLnN0YXJ0X3kgPSAwOworCQl2Zi0+cmlnaHRfZXllLndpZHRoID0gZnJhbWVfd2lkdGggLyAyOworCQl2Zi0+cmlnaHRfZXllLmhlaWdodCA9IGZyYW1lX2hlaWdodDsKKwl9CisjZW5kaWYKKworfQorCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfUE9TVF9QUk9DRVNTX01BTkFHRVIKK3N0YXRpYyB2b2lkIHZoMjY0X3BwbWdyX3Jlc2V0KHZvaWQpCit7CisJdmZfbm90aWZ5X3JlY2VpdmVyKFBST1ZJREVSX05BTUUsIFZGUkFNRV9FVkVOVF9QUk9WSURFUl9SRVNFVCwgTlVMTCk7CisKKwl2aDI2NF9sb2NhbF9pbml0KCk7CisKKwlwcl9pbmZvKCJ2aDI2NGRlYzogdmZfcHBtZ3JfcmVzZXRcbiIpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZ2V0X21heF9kcGJfc2l6ZShpbnQgbGV2ZWxfaWRjLCBpbnQgbWJfd2lkdGgsIGludCBtYl9oZWlnaHQpCit7CisJaW50IHNpemUsIHI7CisKKwlzd2l0Y2ggKGxldmVsX2lkYykgeworCWNhc2UgMTA6CisJCXIgPSAxNDg1OworCQlicmVhazsKKwljYXNlIDExOgorCQlyID0gMzM3NTsKKwkJYnJlYWs7CisJY2FzZSAxMjoKKwljYXNlIDEzOgorCWNhc2UgMjA6CisJCXIgPSA4OTEwOworCQlicmVhazsKKwljYXNlIDIxOgorCQlyID0gMTc4MjA7CisJCWJyZWFrOworCWNhc2UgMjI6CisJY2FzZSAzMDoKKwkJciA9IDMwMzc1OworCQlicmVhazsKKwljYXNlIDMxOgorCQlyID0gNjc1MDA7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCXIgPSA3NjgwMDsKKwkJYnJlYWs7CisJY2FzZSA0MDoKKwljYXNlIDQxOgorCWNhc2UgNDI6CisJCXIgPSAxMjI4ODA7CisJCWJyZWFrOworCWNhc2UgNTA6CisJCXIgPSA0MTQwMDA7CisJCWJyZWFrOworCWNhc2UgNTE6CisJY2FzZSA1MjoKKwkJciA9IDY5MTIwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJCX0KKwkJc2l6ZSA9IChtYl93aWR0aCAqIG1iX2hlaWdodCArCisJCQkJKG1iX3dpZHRoICogbWJfaGVpZ2h0IC8gMikpICogMjU2ICogMTA7CisJCXIgPSAociAqIDEwMjQgKyBzaXplLTEpIC8gc2l6ZTsKKwkJciA9IG1pbihyLCAxNik7CisJCS8qcHJfaW5mbygibWF4X2RwYiAlZCBzaXplOiVkXG4iLCByLCBzaXplKTsqLworCQlyZXR1cm4gcjsKK30KK3N0YXRpYyB2b2lkIHZoMjY0X3NldF9wYXJhbXMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWludCBhc3BlY3RfcmF0aW9faW5mb19wcmVzZW50X2ZsYWcsIGFzcGVjdF9yYXRpb19pZGM7CisJaW50IG1heF9kcGJfc2l6ZSwgYWN0dWFsX2RwYl9zaXplLCBtYXhfcmVmZXJlbmNlX3NpemU7CisJaW50IGksIG1iX212X2J5dGUsIHJldDsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJdW5zaWduZWQgaW50IHBvc3RfY2FudmFzLCBidWZfc2l6ZSwgZW5kaWFuOworCXVuc2lnbmVkIGludCBmcmFtZV9tYnNfb25seV9mbGFnOworCXVuc2lnbmVkIGludCBjaHJvbWFfZm9ybWF0X2lkYywgY2hyb21hNDQ0LCB2aWRlb19zaWduYWw7CisJdW5zaWduZWQgaW50IGNyb3BfaW5mb3IsIGNyb3BfYm90dG9tLCBjcm9wX3JpZ2h0LCBsZXZlbF9pZGM7CisJaWYgKCFhdG9taWNfcmVhZCgmdmgyNjRfYWN0aXZlKSkKKwkJcmV0dXJuOworCW11dGV4X2xvY2soJnZoMjY0X211dGV4KTsKKwlpZiAodmgyNjRfc3RyZWFtX3N3aXRjaGluZ19zdGF0ZSA9PSBTV0lUQ0hJTkdfU1RBVEVfT05fQ01EMSkKKwkJdmgyNjRfc3RyZWFtX3N3aXRjaGluZ19zdGF0ZSA9IFNXSVRDSElOR19TVEFURV9PTl9DTUQxX1BFTkRJTkc7CisJcG9zdF9jYW52YXMgPSBnZXRfcG9zdF9jYW52YXMoKTsKKwljbGtfYWRqX2ZyYW1lX2NvdW50ID0gMDsKKwkvKiBzZXQgdG8gbWF4IGRlY29kZXIgY2xvY2sgcmF0ZSBhdCB0aGUgYmVnaW5uaW5nICovCisKKwlpZiAodmRlY19pc19zdXBwb3J0XzRrKCkpCisJCXZkZWNfc291cmNlX2NoYW5nZWQoVkZPUk1BVF9IMjY0LCAzODQwLCAyMTYwLCA2MCk7CisJZWxzZQorCQl2ZGVjX3NvdXJjZV9jaGFuZ2VkKFZGT1JNQVRfSDI2NCwgMTkyMCwgMTA4MCwgMjkpOworCisJdGltaW5nX2luZm9fcHJlc2VudF9mbGFnID0gMDsKKwltYl93aWR0aCA9IFJFQURfVlJFRyhBVl9TQ1JBVENIXzEpOworCXNlcV9pbmZvID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfMik7CisJYXNwZWN0X3JhdGlvX2luZm8gPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF8zKTsKKwludW1fdW5pdHNfaW5fdGljayA9IFJFQURfVlJFRyhBVl9TQ1JBVENIXzQpOworCXRpbWVfc2NhbGUgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF81KTsKKwlsZXZlbF9pZGMgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9BKTsKKwlpZiAobGV2ZWxfaWRjID4gMCkKKwkJc2F2ZWRfaWRjX2xldmVsID0gbGV2ZWxfaWRjOworCWVsc2UgaWYgKHNhdmVkX2lkY19sZXZlbCA+IDApCisJCWxldmVsX2lkYyA9IHNhdmVkX2lkY19sZXZlbDsKKwl2aWRlb19zaWduYWwgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9IKTsKKwl2aWRlb19zaWduYWxfZnJvbV92dWkgPQorCQkJCSgodmlkZW9fc2lnbmFsICYgMHhmZmZmKSA8PCA4KSB8CisJCQkJKCh2aWRlb19zaWduYWwgJiAweGZmMDAwMCkgPj4gMTYpIHwKKwkJCQkoKHZpZGVvX3NpZ25hbCAmIDB4M2YwMDAwMDApKTsKKy8qCisgKglwcl9pbmZvKCJ2aWRlb19zaWduYWxfdHlwZV9wcmVzZW50X2ZsYWcgMHgleFxuIiwKKyAqCQkJCSh2aWRlb19zaWduYWxfZnJvbV92dWkgPj4gMjkpICYgMSk7CisgKglwcl9pbmZvKCJ2aWRlb19mb3JtYXQgIDB4JXhcbiIsCisgKgkJCQkodmlkZW9fc2lnbmFsX2Zyb21fdnVpID4+IDI2KSAmIDcpOworICoJcHJfaW5mbygidmlkZW9fZnVsbF9yYW5nZV9mbGFnICAweCV4XG4iLAorICoJCQkJKHZpZGVvX3NpZ25hbF9mcm9tX3Z1aSA+PiAyNSkgJiAxKTsKKyAqCXByX2luZm8oImNvbG9yX2Rlc2NyaXB0aW9uX3ByZXNlbnRfZmxhZyAgMHgleFxuIiwKKyAqCQkJCSh2aWRlb19zaWduYWxfZnJvbV92dWkgPj4gMjQpICYgMSk7CisgKglwcl9pbmZvKCJjb2xvcl9wcmltYXJpZXMJMHgleFxuIiwKKyAqCQkJCSh2aWRlb19zaWduYWxfZnJvbV92dWkgPj4gMTYpICYgMHhmZik7CisgKglwcl9pbmZvKCJ0cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpYwkweCV4XG4iLAorICoJCQkJKHZpZGVvX3NpZ25hbF9mcm9tX3Z1aSA+PiA4KSAmIDB4ZmYpOworICoJcHJfaW5mbygibWF0cml4X2NvZWZmaWNpZW50CTB4JXhcbiIsCisgKgkJCQl2aWRlb19zaWduYWxfZnJvbV92dWkgICYgMHhmZik7CisgKi8KKworCW1iX3RvdGFsID0gKG1iX3dpZHRoID4+IDgpICYgMHhmZmZmOworCW1heF9yZWZlcmVuY2Vfc2l6ZSA9IChtYl93aWR0aCA+PiAyNCkgJiAweDdmOworCW1iX212X2J5dGUgPSAobWJfd2lkdGggJiAweDgwMDAwMDAwKSA/IDI0IDogOTY7CisJaWYgKHVjb2RlX3R5cGUgPT0gVUNPREVfSVBfT05MWV9QQVJBTSkKKwkJbWJfbXZfYnl0ZSA9IDk2OworCW1iX3dpZHRoID0gbWJfd2lkdGggJiAweGZmOworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYVFZCQikgeworCQlpZiAoIW1iX3dpZHRoICYmIG1iX3RvdGFsKQorCQkJbWJfd2lkdGggPSAyNTY7CisJfQorCWlmIChtYl93aWR0aCkKKwkJbWJfaGVpZ2h0ID0gbWJfdG90YWwgLyBtYl93aWR0aDsKKwlsYXN0X2R1cmF0aW9uID0gMDsKKwkvKiBBVl9TQ1JBVENIXzIKKwkgKiAgYml0IDE1OiBmcmFtZV9tYnNfb25seV9mbGFnCisJICogIGJpdCAxMy0xNDogY2hyb21hX2Zvcm1hdF9pZGMKKwkgKi8KKwlmcmFtZV9tYnNfb25seV9mbGFnID0gKHNlcV9pbmZvID4+IDE1KSAmIDB4MDE7CisJY2hyb21hX2Zvcm1hdF9pZGMgPSAoc2VxX2luZm8gPj4gMTMpICYgMHgwMzsKKwljaHJvbWE0NDQgPSAoY2hyb21hX2Zvcm1hdF9pZGMgPT0gMykgPyAxIDogMDsKKworCS8qIEBBVl9TQ1JBVENIXzYuMzEtMTYgPSAgKGxlZnQgIDw8IDggfCByaWdodCApIDw8IDEKKwkgKiAgIEBBVl9TQ1JBVENIXzYuMTUtMCAgID0gICh0b3AgPDwgOCAgfCBib3R0b20gKSA8PAorCSAqICgyIC0gZnJhbWVfbWJzX29ubHlfZmxhZykKKwkgKi8KKwljcm9wX2luZm9yID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfNik7CisJY3JvcF9ib3R0b20gPSAoY3JvcF9pbmZvciAmIDB4ZmYpID4+ICgyIC0gZnJhbWVfbWJzX29ubHlfZmxhZyk7CisJY3JvcF9yaWdodCA9ICgoY3JvcF9pbmZvciA+PiAxNikgJiAweGZmKSA+PiAoMiAtIGZyYW1lX21ic19vbmx5X2ZsYWcpOworCisJLyogaWYgd2lkdGggb3IgaGVpZ2h0IGZyb20gb3V0c2lkZSBpcyBub3QgZXF1YWwgdG8gbWIsIHRoZW4gdXNlIG1iICovCisJLyogYWRkOiBmb3Igc2Vla2luZyBzdHJlYW0gd2l0aCBvdGhlciByZXNvbHV0aW9uICovCisJaWYgKChsYXN0X21iX3dpZHRoICYmIChsYXN0X21iX3dpZHRoICE9IG1iX3dpZHRoKSkKKwkJfHwgKG1iX3dpZHRoICE9ICgoZnJhbWVfd2lkdGggKyAxNSkgPj4gNCkpKQorCQlmcmFtZV93aWR0aCA9IDA7CisJaWYgKChsYXN0X21iX2hlaWdodCAmJiAobGFzdF9tYl9oZWlnaHQgIT0gbWJfaGVpZ2h0KSkKKwkJfHwgKG1iX2hlaWdodCAhPSAoKGZyYW1lX2hlaWdodCArIDE1KSA+PiA0KSkpCisJCWZyYW1lX2hlaWdodCA9IDA7CisJbGFzdF9tYl93aWR0aCA9IG1iX3dpZHRoOworCWxhc3RfbWJfaGVpZ2h0ID0gbWJfaGVpZ2h0OworCisJaWYgKChmcmFtZV93aWR0aCA9PSAwKSB8fCAoZnJhbWVfaGVpZ2h0ID09IDApIHx8IGNyb3BfaW5mb3IpIHsKKwkJZnJhbWVfd2lkdGggPSBtYl93aWR0aCA8PCA0OworCQlmcmFtZV9oZWlnaHQgPSBtYl9oZWlnaHQgPDwgNDsKKwkJaWYgKGZyYW1lX21ic19vbmx5X2ZsYWcpIHsKKwkJCWZyYW1lX2hlaWdodCA9CisJCQkJZnJhbWVfaGVpZ2h0IC0gKDIgPj4gY2hyb21hNDQ0KSAqCisJCQkJbWluKGNyb3BfYm90dG9tLAorCQkJCQkodW5zaWduZWQgaW50KSgoOCA8PCBjaHJvbWE0NDQpIC0gMSkpOworCQkJZnJhbWVfd2lkdGggPQorCQkJCWZyYW1lX3dpZHRoIC0gKDIgPj4gY2hyb21hNDQ0KSAqIG1pbihjcm9wX3JpZ2h0LAorCQkJCQkJKHVuc2lnbmVkCisJCQkJCQkgaW50KSgoOCA8PCBjaHJvbWE0NDQpIC0gMSkpOworCQl9IGVsc2UgeworCQkJZnJhbWVfaGVpZ2h0ID0KKwkJCQlmcmFtZV9oZWlnaHQgLSAoNCA+PiBjaHJvbWE0NDQpICoKKwkJCQltaW4oY3JvcF9ib3R0b20sCisJCQkJCSh1bnNpZ25lZCBpbnQpKCg4IDw8IGNocm9tYTQ0NCkKKwkJCQkJCQkgIC0gMSkpOworCQkJZnJhbWVfd2lkdGggPQorCQkJCWZyYW1lX3dpZHRoIC0gKDQgPj4gY2hyb21hNDQ0KSAqIG1pbihjcm9wX3JpZ2h0LAorCQkJCQkJKHVuc2lnbmVkCisJCQkJCQkgaW50KSgoOCA8PAorCQkJCQkJCSAgIGNocm9tYTQ0NCkKKwkJCQkJCQkgIC0gMSkpOworCQl9CisjaWYgMAorCQlwcl9pbmZvCisJCSgiZnJhbWVfbWJzX29ubHlfZmxhZyAlZCwgY3JvcF9ib3R0b20gJWQsICBmcmFtZV9oZWlnaHQgJWQsICIsCisJCSBmcmFtZV9tYnNfb25seV9mbGFnLCBjcm9wX2JvdHRvbSwgZnJhbWVfaGVpZ2h0KTsKKwkJcHJfaW5mbworCQkoIm1iX2hlaWdodCAlZCxjcm9wX3JpZ2h0ICVkLCBmcmFtZV93aWR0aCAlZCwgbWJfd2lkdGggJWRcbiIsCisJCSBtYl9oZWlnaHQsIGNyb3BfcmlnaHQsIGZyYW1lX3dpZHRoLCBtYl93aWR0aCk7CisjZW5kaWYKKwkJaWYgKGZyYW1lX2hlaWdodCA9PSAxMDg4KQorCQkJZnJhbWVfaGVpZ2h0ID0gMTA4MDsKKwl9CisKKwltYl93aWR0aCA9IChtYl93aWR0aCArIDMpICYgMHhmZmZmZmZmYzsKKwltYl9oZWlnaHQgPSAobWJfaGVpZ2h0ICsgMykgJiAweGZmZmZmZmZjOworCW1iX3RvdGFsID0gbWJfd2lkdGggKiBtYl9oZWlnaHQ7CisKKwkgLyptYXhfcmVmZXJlbmNlX3NpemUgPD0gbWF4X2RwYl9zaXplIDw9IGFjdHVhbF9kcGJfc2l6ZSovCisJIGlzXzRrID0gKG1iX3RvdGFsID4gODE2MCkgPyB0cnVlOmZhbHNlOworCisKKwltYXhfZHBiX3NpemUgPSBnZXRfbWF4X2RwYl9zaXplKGxldmVsX2lkYywgbWJfd2lkdGgsIG1iX2hlaWdodCk7CisJaWYgKG1heF9kcGJfc2l6ZSA8IG1heF9yZWZlcmVuY2Vfc2l6ZSkKKwkJbWF4X2RwYl9zaXplID0gbWF4X3JlZmVyZW5jZV9zaXplOworCWlmIChtYXhfZHBiX3NpemUgPiAxNQorCQkmJiBnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYVFZCQgorCQkmJiAoY29kZWNfbW1fZ2V0X3RvdGFsX3NpemUoKSA8IDgwICogU1pfMU0pKSB7CisJCQkJYWN0dWFsX2RwYl9zaXplCisJCQkJPSBtYXhfcmVmZXJlbmNlX3NpemUgKyBkcGJfc2l6ZV9hZGo7CisJCQlpZiAoYWN0dWFsX2RwYl9zaXplID4gVkZfQlVGX05VTSkKKwkJCQlhY3R1YWxfZHBiX3NpemUgPSBWRl9CVUZfTlVNOworCX0gZWxzZSB7CisJCWFjdHVhbF9kcGJfc2l6ZSA9IG1heF9kcGJfc2l6ZSArIGRwYl9zaXplX2FkajsKKwkJYWN0dWFsX2RwYl9zaXplID0gbWluKGFjdHVhbF9kcGJfc2l6ZSwgVkZfQlVGX05VTSk7CisJfQorCW1heF9yZWZlcmVuY2Vfc2l6ZSsrOworCXByX2luZm8oImFjdHVhbF9kcGJfc2l6ZSAlZCBtYXhfZHBiX3NpemUgJWQgbWF4X3JlZiAlZFxuIiwKKwkJCQlhY3R1YWxfZHBiX3NpemUsIG1heF9kcGJfc2l6ZSwKKwkJCQltYXhfcmVmZXJlbmNlX3NpemUpOworCWJ1Zl9zaXplID0gbWJfdG90YWwgKiBtYl9tdl9ieXRlICogbWF4X3JlZmVyZW5jZV9zaXplOworCisJcmV0ID0gZGVjb2Rlcl9ibW11X2JveF9hbGxvY19idWZfcGh5KG1tX2Jsa19oYW5kbGUsIDEsCisJCWJ1Zl9zaXplLCBEUklWRVJfTkFNRSwgJmFkZHIpOworCisJaWYgKHJldCA8IDApIHsKKwkJZmF0YWxfZXJyb3JfZmxhZyA9CisJCQlERUNPREVSX0ZBVEFMX0VSUk9SX05PX01FTTsKKwkJdmgyNjRfcnVubmluZyA9IDA7CisJCW11dGV4X3VubG9jaygmdmgyNjRfbXV0ZXgpOworCQlyZXR1cm47CisJfQorCisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzEsIGFkZHIpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8zLCBwb3N0X2NhbnZhcyk7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzQsIGFkZHIgKyBidWZfc2l6ZSk7CisKKwlpZiAoIShSRUFEX1ZSRUcoQVZfU0NSQVRDSF9GKSAmIDB4MSkpIHsKKwkJZm9yIChpID0gMDsgaSA8IGFjdHVhbF9kcGJfc2l6ZTsgaSsrKSB7CisjaWZkZWYgRE9VQkxFX1dSSVRFCisJCQkJaW50IHBhZ2VfY291bnQgPQorCQkJCVBBR0VfQUxJR04oKG1iX3RvdGFsIDw8IDgpICsgKG1iX3RvdGFsCisJCQkJCQk8PCA3KSArCShtYl90b3RhbCA8PCA2KSArCisJCQkJCQkobWJfdG90YWwgPDwgNSkpIC8gUEFHRV9TSVpFOworI2Vsc2UKKwkJCQlpbnQgcGFnZV9jb3VudCA9CisJCQkJCVBBR0VfQUxJR04oKG1iX3RvdGFsIDw8IDgpICsKKwkJCQkJCShtYl90b3RhbCA8PCA3KSkgLyBQQUdFX1NJWkU7CisjZW5kaWYKKworCQkJcmV0ID0gZGVjb2Rlcl9ibW11X2JveF9hbGxvY19idWZfcGh5KG1tX2Jsa19oYW5kbGUsCisJCQkJVkZfQlVGRkVSX0lEWChpKSwKKwkJCQlwYWdlX2NvdW50IDw8IFBBR0VfU0hJRlQsCisJCQkJRFJJVkVSX05BTUUsICZidWZmZXJfc3BlY1tpXS5waHlfYWRkcik7CisKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJYnVmZmVyX3NwZWNbaV0uYWxsb2NfY291bnQgPSAwOworCQkJCWZhdGFsX2Vycm9yX2ZsYWcgPQorCQkJCURFQ09ERVJfRkFUQUxfRVJST1JfTk9fTUVNOworCQkJCXZoMjY0X3J1bm5pbmcgPSAwOworCQkJCW11dGV4X3VubG9jaygmdmgyNjRfbXV0ZXgpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJYWRkciA9IGJ1ZmZlcl9zcGVjW2ldLnBoeV9hZGRyOworCQkJYnVmZmVyX3NwZWNbaV0uYWxsb2NfY291bnQgPSBwYWdlX2NvdW50OworCisJCQlpZiAoaSA8PSAyMSkgeworCQkJCWJ1ZmZlcl9zcGVjW2ldLnlfYWRkciA9IGFkZHI7CisJCQkJYWRkciArPSBtYl90b3RhbCA8PCA4OworCQkJCWJ1ZmZlcl9zcGVjW2ldLnVfYWRkciA9IGFkZHI7CisJCQkJYnVmZmVyX3NwZWNbaV0udl9hZGRyID0gYWRkcjsKKwkJCQlhZGRyICs9IG1iX3RvdGFsIDw8IDc7CisJCQkJdmZidWZfdXNlW2ldID0gMDsKKworCQkJCWJ1ZmZlcl9zcGVjW2ldLnlfY2FudmFzX2luZGV4ID0gMTI4ICsgaSAqIDI7CisJCQkJYnVmZmVyX3NwZWNbaV0udV9jYW52YXNfaW5kZXggPSAxMjggKyBpICogMiArIDE7CisJCQkJYnVmZmVyX3NwZWNbaV0udl9jYW52YXNfaW5kZXggPSAxMjggKyBpICogMiArIDE7CisKKwkJCQlidWZmZXJfc3BlY1tpXS55X2NhbnZhc193aWR0aCA9IG1iX3dpZHRoIDw8IDQ7CisJCQkJYnVmZmVyX3NwZWNbaV0ueV9jYW52YXNfaGVpZ2h0ID0gbWJfaGVpZ2h0IDw8IDQ7CisJCQkJYnVmZmVyX3NwZWNbaV0udV9jYW52YXNfd2lkdGggPSBtYl93aWR0aCA8PCA0OworCQkJCWJ1ZmZlcl9zcGVjW2ldLnVfY2FudmFzX2hlaWdodCA9IG1iX2hlaWdodCA8PCA0OworCQkJCWJ1ZmZlcl9zcGVjW2ldLnZfY2FudmFzX3dpZHRoID0gbWJfd2lkdGggPDwgNDsKKwkJCQlidWZmZXJfc3BlY1tpXS52X2NhbnZhc19oZWlnaHQgPSBtYl9oZWlnaHQgPDwgNDsKKworCQkJCWVuZGlhbiA9IChjYW52YXNfbW9kZSA9PSBDQU5WQVNfQkxLTU9ERV9MSU5FQVIpPzc6MDsKKwkJCQljb25maWdfY2F2X2x1dF9leCgxMjggKyBpICogMiwKKwkJCQkJCWJ1ZmZlcl9zcGVjW2ldLnlfYWRkciwKKwkJCQkJCW1iX3dpZHRoIDw8IDQsIG1iX2hlaWdodCA8PCA0LAorCQkJCQkJQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJCQkJY2FudmFzX21vZGUsIGVuZGlhbiwgVkRFQ18xKTsKKwkJCQljb25maWdfY2F2X2x1dF9leCgxMjggKyBpICogMiArIDEsCisJCQkJCQlidWZmZXJfc3BlY1tpXS51X2FkZHIsCisJCQkJCQltYl93aWR0aCA8PCA0LCBtYl9oZWlnaHQgPDwgMywKKwkJCQkJCUNBTlZBU19BRERSX05PV1JBUCwKKwkJCQkJCWNhbnZhc19tb2RlLCBlbmRpYW4sIFZERUNfMSk7CisJCQkJV1JJVEVfVlJFRyhBTkMwX0NBTlZBU19BRERSICsgaSwKKwkJCQkJCXNwZWMyY2FudmFzKCZidWZmZXJfc3BlY1tpXSkpOworCQkJCX0gZWxzZSB7CisJCQkJYnVmZmVyX3NwZWNbaV0ueV9jYW52YXNfaW5kZXggPQorCQkJCQkyICogKGkgLSAyMSkgKyA0OworCQkJCWJ1ZmZlcl9zcGVjW2ldLnlfYWRkciA9IGFkZHI7CisJCQkJYWRkciArPSBtYl90b3RhbCA8PCA4OworCQkJCWJ1ZmZlcl9zcGVjW2ldLnVfY2FudmFzX2luZGV4ID0KKwkJCQkJMiAqIChpIC0gMjEpICsgNTsKKwkJCQlidWZmZXJfc3BlY1tpXS52X2NhbnZhc19pbmRleCA9CisJCQkJCTIgKiAoaSAtIDIxKSArIDU7CisJCQkJYnVmZmVyX3NwZWNbaV0udV9hZGRyID0gYWRkcjsKKwkJCQlhZGRyICs9IG1iX3RvdGFsIDw8IDc7CisJCQkJdmZidWZfdXNlW2ldID0gMDsKKworCQkJCWJ1ZmZlcl9zcGVjW2ldLnlfY2FudmFzX3dpZHRoID0gbWJfd2lkdGggPDwgNDsKKwkJCQlidWZmZXJfc3BlY1tpXS55X2NhbnZhc19oZWlnaHQgPSBtYl9oZWlnaHQgPDwgNDsKKwkJCQlidWZmZXJfc3BlY1tpXS51X2NhbnZhc193aWR0aCA9IG1iX3dpZHRoIDw8IDQ7CisJCQkJYnVmZmVyX3NwZWNbaV0udV9jYW52YXNfaGVpZ2h0ID0gbWJfaGVpZ2h0IDw8IDQ7CisJCQkJYnVmZmVyX3NwZWNbaV0udl9jYW52YXNfd2lkdGggPSBtYl93aWR0aCA8PCA0OworCQkJCWJ1ZmZlcl9zcGVjW2ldLnZfY2FudmFzX2hlaWdodCA9IG1iX2hlaWdodCA8PCA0OworCisJCQkJc3BlY19zZXRfY2FudmFzKCZidWZmZXJfc3BlY1tpXQorCQkJCQksIG1iX3dpZHRoIDw8IDQsIG1iX2hlaWdodCA8PCA0KTsKKwkJCQlXUklURV9WUkVHKEFOQzBfQ0FOVkFTX0FERFIgKyBpCisJCQkJCSwgc3BlYzJjYW52YXMoJmJ1ZmZlcl9zcGVjW2ldKSk7CisJCQl9CisJCX0KKwkJfSBlbHNlIHsKKwkJCWZhdGFsX2Vycm9yX2ZsYWcgPQorCQkJCQlERUNPREVSX0ZBVEFMX0VSUk9SX05PX01FTTsKKwkJCXZoMjY0X3J1bm5pbmcgPSAwOworCQkJbXV0ZXhfdW5sb2NrKCZ2aDI2NF9tdXRleCk7CisJCQlwcl9lcnIoIm5ldmVyIGJlIGhlcmUhIVxuIik7CisJCQlyZXR1cm47CisJCX0KKworCXRpbWluZ19pbmZvX3ByZXNlbnRfZmxhZyA9IHNlcV9pbmZvICYgMHgyOworCWZpeGVkX2ZyYW1lX3JhdGVfZmxhZyA9IDA7CisJYXNwZWN0X3JhdGlvX2luZm9fcHJlc2VudF9mbGFnID0gc2VxX2luZm8gJiAweDE7CisJYXNwZWN0X3JhdGlvX2lkYyA9IChzZXFfaW5mbyA+PiAxNikgJiAweGZmOworCisJaWYgKHRpbWluZ19pbmZvX3ByZXNlbnRfZmxhZykgeworCQlmaXhlZF9mcmFtZV9yYXRlX2ZsYWcgPSBzZXFfaW5mbyAmIDB4NDA7CisKKwkJaWYgKCgobnVtX3VuaXRzX2luX3RpY2sgKiAxMjApID49IHRpbWVfc2NhbGUKKwkJCSAmJiAoKCFzeW5jX291dHNpZGUpIHx8ICghZnJhbWVfZHVyKSkpICYmCisJCQkJbnVtX3VuaXRzX2luX3RpY2sKKwkJCSYmIHRpbWVfc2NhbGUpIHsKKwkJCWlmICh1c2VfaWRyX2ZyYW1lcmF0ZSB8fCAhZnJhbWVfZHVyCisJCQkJfHwgIWR1cmF0aW9uX2Zyb21fcHRzX2RvbmUgfHwgdmgyNjRfcnVubmluZykgeworCQkJCXUzMiBmcmFtZV9kdXJfZXMgPQorCQkJCQlkaXZfdTY0KDk2MDAwVUxMICogMiAqCisJCQkJCQkJbnVtX3VuaXRzX2luX3RpY2ssCisJCQkJCQkJdGltZV9zY2FsZSk7CisKKwkJCQkvKiBoYWNrIHRvIGF2b2lkIHVzZSBFUyBmcmFtZSBkdXJhdGlvbgorCQkJCSAqICAgd2hlbiBpdCdzIGhhbGYgb2YgdGhlIHJhdGUgZnJvbQorCQkJCSAqICBzeXN0ZW0gaW5mbworCQkJCSAqLworCQkJCS8qIHNvbWV0aW1lcyB0aGUgZW5jb2RlciBpcyBnaXZlbiBhIHdyb25nCisJCQkJICogZnJhbWUgcmF0ZSBidXQgdGhlIHN5c3RlbSBzaWRlIGluZm9ybWF0aW9uCisJCQkJICppcyBtb3JlIHJlbGlhYmxlCisJCQkJICovCisJCQkJaWYgKChmcmFtZV9kdXIgKiAyKSAhPSBmcmFtZV9kdXJfZXMpIHsKKwkJCQkJZnJhbWVfZHVyID0gZnJhbWVfZHVyX2VzOworCQkJCQlpZiAoZnJfaGludF9zdGF0dXMgPT0gVkRFQ19ORUVEX0hJTlQpIHsKKwkJCQkJCXNjaGVkdWxlX3dvcmsoJm5vdGlmeV93b3JrKTsKKwkJCQkJCWZyX2hpbnRfc3RhdHVzID0gVkRFQ19ISU5URUQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UKKwkJcHJfaW5mbygiSC4yNjQ6IHRpbWluZ19pbmZvIG5vdCBwcmVzZW50XG4iKTsKKworCWlmIChhc3BlY3RfcmF0aW9faW5mb19wcmVzZW50X2ZsYWcpIHsKKwkJaWYgKGFzcGVjdF9yYXRpb19pZGMgPT0gRVhURU5EX1NBUikgeworCQkJaDI2NF9hciA9CisJCQkJZGl2X3U2NCgyNTZVTEwgKiAoYXNwZWN0X3JhdGlvX2luZm8gPj4gMTYpICoKKwkJCQkJCWZyYW1lX2hlaWdodCwKKwkJCQkJCShhc3BlY3RfcmF0aW9faW5mbyAmIDB4ZmZmZikgKgorCQkJCQkJZnJhbWVfd2lkdGgpOworCQl9IGVsc2UgeworCQkJLyogcHJfaW5mbygidjI2NGRlYzogYXNwZWN0X3JhdGlvX2lkYyA9ICVkXG4iLAorCQkJICogIGFzcGVjdF9yYXRpb19pZGMpOworCQkJICovCisKKwkJCXN3aXRjaCAoYXNwZWN0X3JhdGlvX2lkYykgeworCQkJY2FzZSAxOgorCQkJCWgyNjRfYXIgPSAweDEwMCAqIGZyYW1lX2hlaWdodCAvIGZyYW1lX3dpZHRoOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCWgyNjRfYXIgPSAweDEwMCAqIGZyYW1lX2hlaWdodCAqIDExIC8KKwkJCQkJKGZyYW1lX3dpZHRoICogMTIpOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCWgyNjRfYXIgPSAweDEwMCAqIGZyYW1lX2hlaWdodCAqIDExIC8KKwkJCQkJKGZyYW1lX3dpZHRoICogMTApOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCWgyNjRfYXIgPSAweDEwMCAqIGZyYW1lX2hlaWdodCAqIDExIC8KKwkJCQkJKGZyYW1lX3dpZHRoICogMTYpOworCQkJCWJyZWFrOworCQkJY2FzZSA1OgorCQkJCWgyNjRfYXIgPSAweDEwMCAqIGZyYW1lX2hlaWdodCAqIDMzIC8KKwkJCQkJKGZyYW1lX3dpZHRoICogNDApOworCQkJCWJyZWFrOworCQkJY2FzZSA2OgorCQkJCWgyNjRfYXIgPSAweDEwMCAqIGZyYW1lX2hlaWdodCAqIDExIC8KKwkJCQkJKGZyYW1lX3dpZHRoICogMjQpOworCQkJCWJyZWFrOworCQkJY2FzZSA3OgorCQkJCWgyNjRfYXIgPSAweDEwMCAqIGZyYW1lX2hlaWdodCAqIDExIC8KKwkJCQkJKGZyYW1lX3dpZHRoICogMjApOworCQkJCWJyZWFrOworCQkJY2FzZSA4OgorCQkJCWgyNjRfYXIgPSAweDEwMCAqIGZyYW1lX2hlaWdodCAqIDExIC8KKwkJCQkJKGZyYW1lX3dpZHRoICogMzIpOworCQkJCWJyZWFrOworCQkJY2FzZSA5OgorCQkJCWgyNjRfYXIgPSAweDEwMCAqIGZyYW1lX2hlaWdodCAqIDMzIC8KKwkJCQkJKGZyYW1lX3dpZHRoICogODApOworCQkJCWJyZWFrOworCQkJY2FzZSAxMDoKKwkJCQloMjY0X2FyID0gMHgxMDAgKiBmcmFtZV9oZWlnaHQgKiAxMSAvCisJCQkJCShmcmFtZV93aWR0aCAqIDE4KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTE6CisJCQkJaDI2NF9hciA9IDB4MTAwICogZnJhbWVfaGVpZ2h0ICogMTEgLworCQkJCQkoZnJhbWVfd2lkdGggKiAxNSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDEyOgorCQkJCWgyNjRfYXIgPSAweDEwMCAqIGZyYW1lX2hlaWdodCAqIDMzIC8KKwkJCQkJKGZyYW1lX3dpZHRoICogNjQpOworCQkJCWJyZWFrOworCQkJY2FzZSAxMzoKKwkJCQloMjY0X2FyID0gMHgxMDAgKiBmcmFtZV9oZWlnaHQgKiA5OSAvCisJCQkJCShmcmFtZV93aWR0aCAqIDE2MCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDE0OgorCQkJCWgyNjRfYXIgPSAweDEwMCAqIGZyYW1lX2hlaWdodCAqIDMgLworCQkJCQkoZnJhbWVfd2lkdGggKiA0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTU6CisJCQkJaDI2NF9hciA9IDB4MTAwICogZnJhbWVfaGVpZ2h0ICogMiAvCisJCQkJCShmcmFtZV93aWR0aCAqIDMpOworCQkJCWJyZWFrOworCQkJY2FzZSAxNjoKKwkJCQloMjY0X2FyID0gMHgxMDAgKiBmcmFtZV9oZWlnaHQgKiAxIC8KKwkJCQkJKGZyYW1lX3dpZHRoICogMik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWlmICh2aDI2NF9yYXRpbyA+PiAxNikgeworCQkJCQloMjY0X2FyID0gKGZyYW1lX2hlaWdodCAqCisJCQkJCQkJKHZoMjY0X3JhdGlvICYgMHhmZmZmKSAqCisJCQkJCQkJMHgxMDAgKworCQkJCQkJCSgodmgyNjRfcmF0aW8gPj4gMTYpICoKKwkJCQkJCQkgZnJhbWVfd2lkdGggLyAyKSkgLworCQkJCQkJKCh2aDI2NF9yYXRpbyA+PiAxNikgKgorCQkJCQkJIGZyYW1lX3dpZHRoKTsKKwkJCQl9IGVsc2UgeworCQkJCQloMjY0X2FyID0gZnJhbWVfaGVpZ2h0ICogMHgxMDAgLworCQkJCQkJZnJhbWVfd2lkdGg7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcHJfaW5mbygidjI2NGRlYzogYXNwZWN0X3JhdGlvIG5vdCBhdmFpbGFibGUgZnJvbSBzb3VyY2VcbiIpOworCQlpZiAodmgyNjRfcmF0aW8gPj4gMTYpIHsKKwkJCS8qIGhpZ2ggMTYgYml0IGlzIHdpZHRoLCBsb3cgMTYgYml0IGlzIGhlaWdodCAqLworCQkJaDI2NF9hciA9CisJCQkJKCh2aDI2NF9yYXRpbyAmIDB4ZmZmZikgKiBmcmFtZV9oZWlnaHQgKiAweDEwMCArCisJCQkJICh2aDI2NF9yYXRpbyA+PiAxNikgKiBmcmFtZV93aWR0aCAvIDIpIC8KKwkJCQkoKHZoMjY0X3JhdGlvID4+IDE2KSAqIGZyYW1lX3dpZHRoKTsKKwkJfSBlbHNlCisJCQloMjY0X2FyID0gZnJhbWVfaGVpZ2h0ICogMHgxMDAgLyBmcmFtZV93aWR0aDsKKwl9CisKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfMCwKKwkJCShtYXhfcmVmZXJlbmNlX3NpemUgPDwgMjQpIHwgKGFjdHVhbF9kcGJfc2l6ZSA8PCAxNikgfAorCQkJKG1heF9kcGJfc2l6ZSA8PCA4KSk7CisJaWYgKHZoMjY0X3N0cmVhbV9zd2l0Y2hpbmdfc3RhdGUgIT0gU1dJVENISU5HX1NUQVRFX09GRikgeworCQl2aDI2NF9zdHJlYW1fc3dpdGNoaW5nX3N0YXRlID0gU1dJVENISU5HX1NUQVRFX09GRjsKKwkJcHJfaW5mbygiTGVhdmluZyBzd2l0Y2hpbmcgbW9kZS5cbiIpOworCX0KKwltdXRleF91bmxvY2soJnZoMjY0X211dGV4KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBwdHNfaW5jX2J5X2R1cmF0aW9uKAorCQl1bnNpZ25lZCBpbnQgKm5ld19wdHMsIHVuc2lnbmVkIGludCAqbmV3X3B0c19yZW0pCit7CisJdW5zaWduZWQgaW50IHIsIHJlbTsKKworCXIgPSBsYXN0X3B0cyArIERVUjJQVFMoZnJhbWVfZHVyKTsKKwlyZW0gPSBsYXN0X3B0c19yZW1haW5kZXIgKyBEVVIyUFRTX1JFTShmcmFtZV9kdXIpOworCisJaWYgKHJlbSA+PSA5NikgeworCQlyKys7CisJCXJlbSAtPSA5NjsKKwl9CisKKwlpZiAobmV3X3B0cykKKwkJKm5ld19wdHMgPSByOworCWlmIChuZXdfcHRzX3JlbSkKKwkJKm5ld19wdHNfcmVtID0gcmVtOworCisJcmV0dXJuIHI7Cit9CitzdGF0aWMgaW5saW5lIGJvb2wgdmgyNjRfaXNyX3BhcnNlcihzdHJ1Y3QgdmZyYW1lX3MgKnZmLAorCQl1bnNpZ25lZCBpbnQgIHB0c192YWxpZCwgdW5zaWduZWQgaW50IGJ1ZmZlcl9pbmRleCwKKwkJdW5zaWduZWQgaW50IHB0cykKK3sKKwl1bnNpZ25lZCBpbnQgcHRzX2R1cmF0aW9uID0gMDsKKworCWlmIChoMjY0X2ZpcnN0X3B0c19yZWFkeSA9PSAwKSB7CisJCWlmIChwdHNfdmFsaWQgPT0gMCkgeworCQkJdmZidWZfdXNlW2J1ZmZlcl9pbmRleF0rKzsKKwkJCXZmLT5pbmRleCA9IGJ1ZmZlcl9pbmRleDsKKwkJCWtmaWZvX3B1dCgmcmVjeWNsZV9xLAorCQkJCQkoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaDI2NHB0czEgPSBwdHM7CisJCWgyNjRfcHRzX2NvdW50ID0gMDsKKwkJaDI2NF9maXJzdF9wdHNfcmVhZHkgPSAxOworCX0gZWxzZSB7CisJCWlmIChwdHMgPCBoMjY0cHRzMSkgeworCQkJaWYgKGgyNjRfcHRzX2NvdW50ID4gMjQpIHsKKwkJCQlwcl9pbmZvKCJpbnZhbGlkIGgyNjRwdHMxLCByZXNldFxuIik7CisJCQkJaDI2NHB0czEgPSBwdHM7CisJCQkJaDI2NF9wdHNfY291bnQgPSAwOworCQkJfQorCQl9CisJCWlmIChwdHNfdmFsaWQgJiYgKHB0cyA+IGgyNjRwdHMxKSAmJiAoaDI2NF9wdHNfY291bnQgPiAyNCkKKwkJCQkmJiAoZHVyYXRpb25fZnJvbV9wdHNfZG9uZSA9PSAwKSkgeworCQkJdW5zaWduZWQgaW50CisJCQkJb2xkX2R1cmF0aW9uID0gZnJhbWVfZHVyOworCQkJaDI2NHB0czIgPSBwdHM7CisKKwkJCXB0c19kdXJhdGlvbiA9IChoMjY0cHRzMiAtIGgyNjRwdHMxKSAqIDE2IC8KKwkJCQkoaDI2NF9wdHNfY291bnQgKiAxNSk7CisKKwkJCWlmICgocHRzX2R1cmF0aW9uICE9IGZyYW1lX2R1cikKKwkJCQkJJiYgKCFwdHNfb3V0c2lkZSkpIHsKKwkJCQlpZiAodXNlX2lkcl9mcmFtZXJhdGUpIHsKKwkJCQkJYm9vbCBwdHNfY18yNCA9IGNsb3NlX3RvKHB0c19kdXJhdGlvbiwKKwkJCQkJCVJBVEVfMjRfRlBTLAorCQkJCQkJUkFURV9DT1JSRUNUSU9OX1RIUkVTSE9MRCk7CisJCQkJCWJvb2wgZnJtX2NfMjUgPSBjbG9zZV90byhmcmFtZV9kdXIsCisJCQkJCQlSQVRFXzI1X0ZQUywKKwkJCQkJCVJBVEVfQ09SUkVDVElPTl9USFJFU0hPTEQpOworCQkJCQlib29sIHB0c19jXzI1ID0gY2xvc2VfdG8ocHRzX2R1cmF0aW9uLAorCQkJCQkJICBSQVRFXzI1X0ZQUywKKwkJCQkJCSAgUkFURV9DT1JSRUNUSU9OX1RIUkVTSE9MRCk7CisJCQkJCWJvb2wgZnJtX2NfMjQgPSBjbG9zZV90byhmcmFtZV9kdXIsCisJCQkJCQkgIFJBVEVfMjRfRlBTLAorCQkJCQkJICBSQVRFX0NPUlJFQ1RJT05fVEhSRVNIT0xEKTsKKwkJCQkJaWYgKChwdHNfY18yNCAmJiBmcm1fY18yNSkKKwkJCQkJCXx8IChwdHNfY18yNSAmJiBmcm1fY18yNCkpIHsKKwkJCQkJCXByX2luZm8KKwkJCQkJCSgiSC4yNjQ6Q29ycmVjdCBmcmFtZSBkdXIgIik7CisJCQkJCQlwcl9pbmZvCisJCQkJCQkoIiBmcm9tICVkIHRvIGR1cmF0aW9uIGJhc2VkICIsCisJCQkJCQkJIGZyYW1lX2R1cik7CisJCQkJCQlwcl9pbmZvCisJCQkJCQkoIm9uIFBUUyAlZCAtLS1cbiIsCisJCQkJCQkJIHB0c19kdXJhdGlvbik7CisJCQkJCQlmcmFtZV9kdXIgPSBwdHNfZHVyYXRpb247CisJCQkJCQlkdXJhdGlvbl9mcm9tX3B0c19kb25lID0gMTsKKwkJCQkJfSBlbHNlIGlmICgoKGZyYW1lX2R1ciA8IDk2MDAwIC8gMjQwKQorCQkJCQkJJiYgKHB0c19kdXJhdGlvbiA+IDk2MDAwIC8gMjQwKSkKKwkJCQkJCXx8ICghZHVyYXRpb25fb25fY29ycmVjdGluZyAmJgorCQkJCQkJIWZybV9jXzI1ICYmICFmcm1fY18yNCkpIHsKKwkJCQkJCS8qIGZmdDogaWYgdGhlIGZyYW1lIHJhdGUgaXMKKwkJCQkJCSAqICBub3QgcmVndWxhciwgdXNlIHRoZQorCQkJCQkJICogY2FsY3VsYXRlIHJhdGUgaW5zdGVhZG9mLgorCQkJCQkJICovCisJCQkJCQlwcl9pbmZvCisJCQkJCQkoIkguMjY0OkNvcnJlY3QgZnJhbWUgZHVyICIpOworCQkJCQkJcHJfaW5mbworCQkJCQkJKCIgZnJvbSAlZCB0byBkdXJhdGlvbiBiYXNlZCAiLAorCQkJCQkJCSBmcmFtZV9kdXIpOworCQkJCQkJcHJfaW5mbworCQkJCQkJKCJvbiBQVFMgJWQgLS0tXG4iLAorCQkJCQkJCSBwdHNfZHVyYXRpb24pOworCQkJCQkJZnJhbWVfZHVyID0gcHRzX2R1cmF0aW9uOworCQkJCQkJZHVyYXRpb25fb25fY29ycmVjdGluZyA9IDE7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoY2xvc2VfdG8ocHRzX2R1cmF0aW9uLAorCQkJCQkJCWZyYW1lX2R1ciwgMjAwMCkpIHsKKwkJCQkJCWZyYW1lX2R1ciA9IHB0c19kdXJhdGlvbjsKKwkJCQkJCXByX2luZm8KKwkJCQkJCSgidXNlZCBjYWxjdWxhdGUgZnJhbWUgcmF0ZSwiKTsKKwkJCQkJCXByX2luZm8oIm9uIGR1cmF0aW9uID0lZFxuIiwKKwkJCQkJCQkgZnJhbWVfZHVyKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXByX2luZm8KKwkJCQkJCSgiZG9uJ3QgdXNlIGNhbGN1bGF0ZSBmcmFtZSAiKTsKKwkJCQkJCXByX2luZm8KKwkJCQkJCSgicmF0ZSBwdHNfZHVyYXRpb24gPSVkXG4iLAorCQkJCQkJCSBwdHNfZHVyYXRpb24pOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZiAoZHVyYXRpb25fZnJvbV9wdHNfZG9uZSA9PSAwKSB7CisJCQkJaWYgKGNsb3NlX3RvCisJCQkJCQkocHRzX2R1cmF0aW9uLAorCQkJCQkJIG9sZF9kdXJhdGlvbiwKKwkJCQkJCSBSQVRFX0NPUlJFQ1RJT05fVEhSRVNIT0xEKSkgeworCQkJCQlwcl9pbmZvCisJCQkJCSgiZmluaXNoZWQgY29ycmVjdCBmcmFtZSBkdXIiKTsKKwkJCQkJcHJfaW5mbworCQkJCQkoIiBuZXc9JWQsb2xkX2R1cmF0aW9uPSVkLGNudD0lZFxuIiwKKwkJCQkJCSBwdHNfZHVyYXRpb24sCisJCQkJCQkgb2xkX2R1cmF0aW9uLAorCQkJCQkJIGgyNjRfcHRzX2NvdW50KTsKKwkJCQkJZHVyYXRpb25fZnJvbV9wdHNfZG9uZSA9IDE7CisJCQkJfSBlbHNlIHsJLypub3QgdGhlIHNhbWUscmVkbyBpdC4gKi8KKwkJCQkJaWYgKCFjbG9zZV90byhwdHNfZHVyYXRpb24sCisJCQkJCQkgb2xkX2R1cmF0aW9uLCAxMDAwKSAmJgorCQkJCQkJIWNsb3NlX3RvKHB0c19kdXJhdGlvbiwKKwkJCQkJCWZyYW1lX2R1ciwgMTAwMCkgJiYKKwkJCQkJCWNsb3NlX3RvKHB0c19kdXJhdGlvbiwKKwkJCQkJCWxhc3RfZHVyYXRpb24sIDIwMCkpIHsKKwkJCQkJCS8qIHlhbmdsZTogZnJhbWVfZHVyIG11c3QKKwkJCQkJCSAqICB3cm9uZyxyZWNvdmVyIGl0LgorCQkJCQkJICovCisJCQkJCQlmcmFtZV9kdXIgPSBwdHNfZHVyYXRpb247CisJCQkJCX0KKworCQkJCQlwcl9pbmZvCisJCQkJCSgicmVzdGFydCBjb3JyZWN0IGZyYW1lIGR1cmF0aW9uICIpOworCQkJCQlwcl9pbmZvCisJCQkJCSgibmV3PSVkLG9sZF9kdXJhdGlvbj0lZCxjbnQ9JWRcbiIsCisJCQkJCQkgcHRzX2R1cmF0aW9uLAorCQkJCQkJIG9sZF9kdXJhdGlvbiwKKwkJCQkJCSBoMjY0X3B0c19jb3VudCk7CisJCQkJCWgyNjRwdHMxID0gaDI2NHB0czI7CisJCQkJCWgyNjRfcHRzX2NvdW50ID0gMDsKKwkJCQkJZHVyYXRpb25fZnJvbV9wdHNfZG9uZSA9IDA7CisJCQl9CisJCX0KKwkJICAgIGxhc3RfZHVyYXRpb24gPSBwdHNfZHVyYXRpb247CisJCX0KKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoMjY0X3VwZGF0ZV9ndnModm9pZCkKK3sKKwl1MzIgcmF0aW9fY29udHJvbDsKKwl1MzIgYXI7CisKKwlpZiAoZ3ZzLT5mcmFtZV9oZWlnaHQgIT0gZnJhbWVfaGVpZ2h0KSB7CisJCWd2cy0+ZnJhbWVfd2lkdGggPSBmcmFtZV93aWR0aDsKKwkJZ3ZzLT5mcmFtZV9oZWlnaHQgPSBmcmFtZV9oZWlnaHQ7CisJfQorCWlmIChndnMtPmZyYW1lX2R1ciAhPSBmcmFtZV9kdXIpIHsKKwkJZ3ZzLT5mcmFtZV9kdXIgPSBmcmFtZV9kdXI7CisJCWlmIChmcmFtZV9kdXIgIT0gMCkKKwkJCWd2cy0+ZnJhbWVfcmF0ZSA9IDk2MDAwIC8gZnJhbWVfZHVyOworCQllbHNlCisJCQlndnMtPmZyYW1lX3JhdGUgPSAtMTsKKwl9CisJZ3ZzLT5lcnJvcl9jb3VudCA9IFJFQURfVlJFRyhBVl9TQ1JBVENIX0QpOworCWd2cy0+c3RhdHVzID0gc3RhdDsKKwlpZiAoZmF0YWxfZXJyb3JfcmVzZXQpCisJCWd2cy0+c3RhdHVzIHw9IGZhdGFsX2Vycm9yX2ZsYWc7CisJYXIgPSBtaW5fdCh1MzIsCisJCQloMjY0X2FyLAorCQkJRElTUF9SQVRJT19BU1BFQ1RfUkFUSU9fTUFYKTsKKwlyYXRpb19jb250cm9sID0KKwkJYXIgPDwgRElTUF9SQVRJT19BU1BFQ1RfUkFUSU9fQklUOworCWd2cy0+cmF0aW9fY29udHJvbCA9IHJhdGlvX2NvbnRyb2w7Cit9CisKKyNpZmRlZiBIQU5ETEVfSDI2NF9JUlEKK3N0YXRpYyBpcnFyZXR1cm5fdCB2aDI2NF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorI2Vsc2UKK3N0YXRpYyB2b2lkIHZoMjY0X2lzcih2b2lkKQorI2VuZGlmCit7CisJdW5zaWduZWQgaW50IGJ1ZmZlcl9pbmRleDsKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmOworCXVuc2lnbmVkIGludCBjcHVfY21kOworCXVuc2lnbmVkIGludCBwdHMsIHB0c19sb29rdXBfc2F2ZSwgcHRzX3ZhbGlkX3NhdmUsIHB0c192YWxpZCA9IDA7CisJdW5zaWduZWQgaW50IHB0c191czY0X3ZhbGlkID0gMDsKKwl1bnNpZ25lZCBpbnQgIGZyYW1lc2l6ZTsKKwl1NjQgcHRzX3VzNjQ7CisJYm9vbCBmb3JjZV9pbnRlcmxhY2VkX2ZyYW1lID0gZmFsc2U7CisJdW5zaWduZWQgaW50IHNlaV9pdHUzNV9mbGFnczsKKworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaWRyX251bSA9CisJCUZJWF9GUkFNRV9SQVRFX0NIRUNLX0lEUkZSQU1FX05VTTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGZsZ18xMDgwX2l0bCA9CisJCURFQ19DT05UUk9MX0ZMQUdfRk9SQ0VfMjk5N18xMDgwUF9JTlRFUkxBQ0U7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBmbGdfNTc2X2l0bCA9CisJCURFQ19DT05UUk9MX0ZMQUdfRk9SQ0VfMjUwMF81NzZQX0lOVEVSTEFDRTsKKworCVdSSVRFX1ZSRUcoQVNTSVNUX01CT1gxX0NMUl9SRUcsIDEpOworCisJaWYgKDAgPT0gKHN0YXQgJiBTVEFUX1ZERUNfUlVOKSkgeworCQlwcl9pbmZvKCJkZWNvZGVyIGlzIG5vdCBydW5uaW5nXG4iKTsKKyNpZmRlZiBIQU5ETEVfSDI2NF9JUlEKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworI2Vsc2UKKwkJcmV0dXJuOworI2VuZGlmCisJfQorCisJY3B1X2NtZCA9IFJFQURfVlJFRyhBVl9TQ1JBVENIXzApOworCisjaWZkZWYgRFJPUF9CX0ZSQU1FX0ZPUl8xMDgwUF81MF82MEZQUworCWlmICgoZnJhbWVfZHVyIDwgMjAwNCkgJiYKKwkJKGZyYW1lX3dpZHRoID49IDE0MDApICYmCisJCShmcmFtZV9oZWlnaHQgPj0gMTAwMCkgJiYgKGxhc3RfaW50ZXJsYWNlZCA9PSAwKSkKKwkJU0VUX1ZSRUdfTUFTSyhBVl9TQ1JBVENIX0YsIDB4OCk7CisjZW5kaWYKKwlpZiAoKGRlY29kZXJfZm9yY2VfcmVzZXQgPT0gMSkKKwkJCXx8ICgoZXJyb3JfcmVjb3ZlcnlfbW9kZSAhPSAxKQorCQkJJiYgKG5vX2lkcl9lcnJvcl9jb3VudCA+PSBub19pZHJfZXJyb3JfbWF4KQorCQkJJiYgKHVjb2RlX3R5cGUgIT0gVUNPREVfSVBfT05MWV9QQVJBTSkpKSB7CisJCXZoMjY0X3J1bm5pbmcgPSAwOworCQlwcl9pbmZvKCJmb3JjZSByZXNldCBkZWNvZGVyICAlZCEhIVxuIiwgbm9faWRyX2Vycm9yX2NvdW50KTsKKwkJc2NoZWR1bGVfd29yaygmZXJyb3Jfd2Rfd29yayk7CisJCWRlY29kZXJfZm9yY2VfcmVzZXQgPSAwOworCQlub19pZHJfZXJyb3JfY291bnQgPSAwOworCX0gZWxzZSBpZiAoKGNwdV9jbWQgJiAweGZmKSA9PSAxKSB7CisJCWlmICh1bmxpa2VseQorCQkJKHZoMjY0X3J1bm5pbmcKKwkJCSAmJiAoa2ZpZm9fbGVuKCZuZXdmcmFtZV9xKSAhPSBWRl9QT09MX1NJWkUpKSkgeworCQkJLyogYSBjbWQgMSBzZW50IGR1cmluZyBkZWNvZGluZyB3L28gZ2V0dGluZyBhIGNtZCAzLiAqLworCQkJLyogc2hvdWxkIG5vdCBoYXBwZW4gYnV0IHRoZSBvcmlnaW5hbCBjb2RlIGhhcyBzdWNoCisJCQkgKiAgY2FzZSwgZG8gdGhlIHNhbWUgcHJvY2VzcworCQkJICovCisJCQlpZiAoKFJFQURfVlJFRyhBVl9TQ1JBVENIXzEpICYgMHhmZikKKwkJCQk9PSAxKSB7LyppbnZhbGlkIG1iX3dpZHRoKi8KKwkJCQl2aDI2NF9ydW5uaW5nID0gMDsKKwkJCQlmYXRhbF9lcnJvcl9mbGFnID0gREVDT0RFUl9GQVRBTF9FUlJPUl9VTktOT1dOOworCQkJLyogdGhpcyBpcyBmYXRhbCBlcnJvciwgbmVlZCByZXN0YXJ0ICovCisJCQkJcHJfaW5mbygiY21kIDEgZmF0YWwgZXJyb3IgaGFwcGVuZWRcbiIpOworCQkJCXNjaGVkdWxlX3dvcmsoJmVycm9yX3dkX3dvcmspOworCQkJfSBlbHNlIHsKKwkJCXZoMjY0X3N0cmVhbV9zd2l0Y2hpbmdfc3RhdGUgPSBTV0lUQ0hJTkdfU1RBVEVfT05fQ01EMTsKKwkJCXByX2luZm8oIkVudGVyIHN3aXRjaGluZyBtb2RlIGNtZDEuXG4iKTsKKwkJCXNjaGVkdWxlX3dvcmsoJnN0cmVhbV9zd2l0Y2hpbmdfd29yayk7CisJCQl9CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKwkJcHJfaW5mbygiRW50ZXIgc2V0IHBhcmFtZXRlciBjbWQxLlxuIik7CisJCXNjaGVkdWxlX3dvcmsoJnNldF9wYXJhbWV0ZXJfd29yayk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9IGVsc2UgaWYgKChjcHVfY21kICYgMHhmZikgPT0gMikgeworCQlpbnQgZnJhbWVfbWJfb25seSwgcGljX3N0cnVjdF9wcmVzZW50LCBwaWNfc3RydWN0LCBwcm9nX2ZyYW1lLAorCQkJcG9jX3NlbCwgaWRyX2ZsYWcsIGVvcywgZXJyb3I7CisJCWludCBpLCBzdGF0dXMsIG51bV9mcmFtZSwgYl9vZmZzZXQ7CisJCWludCBjdXJyZW50X2Vycm9yX2NvdW50LCBzbGljZV90eXBlOworCisJCXZoMjY0X3J1bm5pbmcgPSAxOworCQl2aDI2NF9ub19kaXNwX2NvdW50ID0gMDsKKwkJbnVtX2ZyYW1lID0gKGNwdV9jbWQgPj4gOCkgJiAweGZmOworCQlmcmFtZV9tYl9vbmx5ID0gc2VxX2luZm8gJiAweDgwMDA7CisJCXBpY19zdHJ1Y3RfcHJlc2VudCA9IHNlcV9pbmZvICYgMHgxMDsKKworCQljdXJyZW50X2Vycm9yX2NvdW50ID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfRCk7CisJCWlmICh2aDI2NF9lcnJvcl9jb3VudCAhPSBjdXJyZW50X2Vycm9yX2NvdW50KSB7CisJCQkvKiBwcl9pbmZvKCJkZWNvZGVyIGVycm9yIGhhcHBlbmVkLCBjb3VudCAlZFxuIiwKKwkJCSAqICAgY3VycmVudF9lcnJvcl9jb3VudCk7CisJCQkgKi8KKwkJCXZoMjY0X2Vycm9yX2NvdW50ID0gY3VycmVudF9lcnJvcl9jb3VudDsKKwkJfQorCisJCWZvciAoaSA9IDA7IChpIDwgbnVtX2ZyYW1lKSAmJiAoIXZoMjY0X2Vvcyk7IGkrKykgeworCQkJc3RhdHVzID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfMSArIGkpOworCQkJYnVmZmVyX2luZGV4ID0gc3RhdHVzICYgMHgxZjsKKwkJCWVycm9yID0gc3RhdHVzICYgMHgyMDA7CisJCQlzbGljZV90eXBlID0gKFJFQURfVlJFRyhBVl9TQ1JBVENIX0gpID4+IChpICogNCkpICYgMHhmOworCisJCQlpZiAoKGVycm9yX3JlY292ZXJ5X21vZGVfdXNlICYgMikgJiYgZXJyb3IpCisJCQkJY2hlY2tfcHRzX2Rpc2NvbnRpbnVlID0gdHJ1ZTsKKwkJCWlmICh1Y29kZV90eXBlID09IFVDT0RFX0lQX09OTFlfUEFSQU0KKwkJCQkmJiBpcG9ubHlfZWFybHlfbW9kZSkKKwkJCQljb250aW51ZTsKKwkJCWlmICgocF9sYXN0X3ZmICE9IE5VTEwpCisJCQkJJiYgKHBfbGFzdF92Zi0+aW5kZXggPT0gYnVmZmVyX2luZGV4KSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGJ1ZmZlcl9pbmRleCA+PSBWRl9CVUZfTlVNKQorCQkJCWNvbnRpbnVlOworCisJCQlwaWNfc3RydWN0ID0gKHN0YXR1cyA+PiA1KSAmIDB4NzsKKwkJCXByb2dfZnJhbWUgPSBzdGF0dXMgJiAweDEwMDsKKwkJCXBvY19zZWwgPSBzdGF0dXMgJiAweDIwMDsKKwkJCWlkcl9mbGFnID0gc3RhdHVzICYgMHg0MDA7CisJCQlmcmFtZV9wYWNraW5nX3R5cGUgPSAoc3RhdHVzID4+IDEyKSAmIDB4NzsKKwkJCWVvcyA9IChzdGF0dXMgPj4gMTUpICYgMTsKKworCQkJaWYgKGVvcykKKwkJCQl2aDI2NF9lb3MgPSAxOworCisJCQliX29mZnNldCA9IChzdGF0dXMgPj4gMTYpICYgMHhmZmZmOworCisJCQlpZiAoZXJyb3IpCisJCQkJbm9faWRyX2Vycm9yX2NvdW50Kys7CisJCQlpZiAoaWRyX2ZsYWcgfHwKKwkJCQkoIWVycm9yICYmIChzbGljZV90eXBlICE9IFNMSUNFX1RZUEVfSSkpKQorCQkJCW5vX2lkcl9lcnJvcl9jb3VudCA9IDA7CisKKwkJCWlmIChkZWNvZGVyX2RlYnVnX2ZsYWcpIHsKKwkJCQlwcl9pbmZvCisJCQkJKCJzbGljZV90eXBlICV4IGlkciAleCBlcnJvciAleCBjb3VudCAlZCIsCisJCQkJCXNsaWNlX3R5cGUsIGlkcl9mbGFnLCBlcnJvciwKKwkJCQkJbm9faWRyX2Vycm9yX2NvdW50KTsKKwkJCQlwcl9pbmZvKCIgcHJvZyAleCBwaWNfc3RydWN0ICV4IG9mZnNldCAleFxuIiwKKwkJCQlwcm9nX2ZyYW1lLCBwaWNfc3RydWN0LAliX29mZnNldCk7CisJCQl9CisjaWZkZWYgRFJPUF9CX0ZSQU1FX0ZPUl8xMDgwUF81MF82MEZQUworCQkJbGFzdF9pbnRlcmxhY2VkID0gcHJvZ19mcmFtZSA/IDAgOiAxOworI2VuZGlmCisJCQlpZiAoa2ZpZm9fZ2V0KCZuZXdmcmFtZV9xLCAmdmYpID09IDApIHsKKwkJCQlwcl9pbmZvCisJCQkJKCJmYXRhbCBlcnJvciwgbm8gYXZhaWxhYmxlIGJ1ZmZlciBzbG90LiIpOworCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCX0KKworCQkJaWYgKGNsa19hZGpfZnJhbWVfY291bnQgPCAoVkRFQ19DTE9DS19BREpVU1RfRlJBTUUgKyAxKSkKKwkJCQljbGtfYWRqX2ZyYW1lX2NvdW50Kys7CisKKwkJCXNldF9mcmFtZV9pbmZvKHZmKTsKKworCQkJc3dpdGNoIChpKSB7CisJCQljYXNlIDA6CisJCQkJYl9vZmZzZXQgfD0KKwkJCQkJKFJFQURfVlJFRyhBVl9TQ1JBVENIX0EpICYgMHhmZmZmKQorCQkJCQk8PCAxNjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQliX29mZnNldCB8PQorCQkJCQlSRUFEX1ZSRUcoQVZfU0NSQVRDSF9BKSAmIDB4ZmZmZjAwMDA7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJYl9vZmZzZXQgfD0KKwkJCQkJKFJFQURfVlJFRyhBVl9TQ1JBVENIX0IpICYgMHhmZmZmKQorCQkJCQk8PCAxNjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQliX29mZnNldCB8PQorCQkJCQlSRUFEX1ZSRUcoQVZfU0NSQVRDSF9CKSAmIDB4ZmZmZjAwMDA7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJYl9vZmZzZXQgfD0KKwkJCQkJKFJFQURfVlJFRyhBVl9TQ1JBVENIX0MpICYgMHhmZmZmKQorCQkJCQk8PCAxNjsKKwkJCQlicmVhazsKKwkJCWNhc2UgNToKKwkJCQliX29mZnNldCB8PQorCQkJCQlSRUFEX1ZSRUcoQVZfU0NSQVRDSF9DKSAmIDB4ZmZmZjAwMDA7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoZXJyb3IpCisJCQkJZ3ZzLT5kcm9wX2ZyYW1lX2NvdW50Kys7CisKKwkJCS8qIGFkZCA2NGJpdCBwdHMgdXMgOyAqLworCQkJaWYgKHVubGlrZWx5CisJCQkJKChiX29mZnNldCA9PSBmaXJzdF9vZmZzZXQpCisJCQkJICYmIChmaXJzdF9wdHNfY2FjaGVkKSkpIHsKKwkJCQlwdHMgPSBmaXJzdF9wdHM7CisJCQkJcHRzX3VzNjQgPSBmaXJzdF9wdHM2NDsKKwkJCQlmcmFtZXNpemUgPSBmaXJzdF9mcmFtZV9zaXplOworCQkJCWZpcnN0X3B0c19jYWNoZWQgPSBmYWxzZTsKKwkJCQlwdHNfdmFsaWQgPSAxOworCQkJCXB0c191czY0X3ZhbGlkID0gMTsKKyNpZmRlZiBERUJVR19QVFMKKwkJCQlwdHNfaGl0Kys7CisjZW5kaWYKKwkJCX0gZWxzZSBpZiAocHRzX2xvb2t1cF9vZmZzZXRfdXM2NAorCQkJCQkoUFRTX1RZUEVfVklERU8sIGJfb2Zmc2V0LCAmcHRzLAorCQkJCQkmZnJhbWVzaXplLCAwLCAmcHRzX3VzNjQpID09IDApIHsKKwkJCQlwdHNfdmFsaWQgPSAxOworCQkJCXB0c191czY0X3ZhbGlkID0gMTsKKyNpZmRlZiBERUJVR19QVFMKKwkJCQlwdHNfaGl0Kys7CisjZW5kaWYKKwkJCX0gZWxzZSB7CisJCQkJcHRzX3ZhbGlkID0gMDsKKwkJCQlwdHNfdXM2NF92YWxpZCA9IDA7CisJCQkJZnJhbWVzaXplID0gMDsKKyNpZmRlZiBERUJVR19QVFMKKwkJCQlwdHNfbWlzc2VkKys7CisjZW5kaWYKKwkJCX0KKworCQkJaWYgKGlkcl9mbGFnKQorCQkJCXNfdmZyYW1lX3Fvcy50eXBlID0gNDsKKwkJCWVsc2UgaWYgKHNsaWNlX3R5cGUgPT0gU0xJQ0VfVFlQRV9JKQorCQkJCXNfdmZyYW1lX3Fvcy50eXBlID0gMTsKKwkJCWVsc2UgaWYgKHNsaWNlX3R5cGUgPT0gU0xJQ0VfVFlQRV9QKQorCQkJCXNfdmZyYW1lX3Fvcy50eXBlID0gMjsKKwkJCWVsc2UgaWYgKHNsaWNlX3R5cGUgPT0gU0xJQ0VfVFlQRV9CIHx8IHNsaWNlX3R5cGUgPT0gOCkKKwkJCQlzX3ZmcmFtZV9xb3MudHlwZSA9IDM7CisKKwkJCXNfdmZyYW1lX3Fvcy5zaXplID0gZnJhbWVzaXplOworCisJCQlpZiAocHRzX3ZhbGlkKQorCQkJCXNfdmZyYW1lX3Fvcy5wdHMgPSBwdHM7CisJCQllbHNlCisJCQkJc192ZnJhbWVfcW9zLnB0cyA9IGxhc3RfcHRzICsgRFVSMlBUUyhmcmFtZV9kdXIpOworI2lmbmRlZiBFTkFCTEVfU0VJX0lUVV9UMzUKKwkJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPCBBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQSkgeworCQkJCXUzMiByZWdfZGF0YTsKKwkJCQlpZiAoaSkgeworCQkJCQlyZWdfZGF0YSA9IFJFQURfVlJFRyhBVl9TQ1JBVENIX04pOworCQkJCQlzX3ZmcmFtZV9xb3MubWF4X212CisJCQkJCQk9IChyZWdfZGF0YSA+PiAxNikgJiAweGZmZmY7CisJCQkJCXNfdmZyYW1lX3Fvcy5hdmdfbXYKKwkJCQkJCT0gKHJlZ19kYXRhID4+IDgpICYgMHhmZjsKKwkJCQkJc192ZnJhbWVfcW9zLm1pbl9tdgorCQkJCQkJPSAgcmVnX2RhdGEgJiAweGZmOworCQkJCQlyZWdfZGF0YSA9IFJFQURfVlJFRyhBVl9TQ1JBVENIX0wpOworCQkJCQlzX3ZmcmFtZV9xb3MubWF4X3FwCisJCQkJCQk9IChyZWdfZGF0YSA+PiAxNikgJiAweGZmOworCQkJCQlzX3ZmcmFtZV9xb3MuYXZnX3FwCisJCQkJCQk9IChyZWdfZGF0YSA+PiA4KSAmIDB4ZmY7CisJCQkJCXNfdmZyYW1lX3Fvcy5taW5fcXAKKwkJCQkJCT0gIHJlZ19kYXRhICYgMHhmZjsKKwkJCQkJcmVnX2RhdGEgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9NKTsKKwkJCQkJc192ZnJhbWVfcW9zLm1heF9za2lwCisJCQkJCQk9IChyZWdfZGF0YSA+PiAxNikgJiAweGZmOworCQkJCQlzX3ZmcmFtZV9xb3MuYXZnX3NraXAKKwkJCQkJCT0gKHJlZ19kYXRhID4+IDgpICYgMHhmZjsKKwkJCQkJc192ZnJhbWVfcW9zLm1pbl9za2lwCisJCQkJCQk9ICByZWdfZGF0YSAmIDB4ZmY7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmVnX2RhdGEgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9KKTsKKwkJCQkJc192ZnJhbWVfcW9zLm1heF9tdgorCQkJCQkJPSAocmVnX2RhdGEgPj4gMTYpICYgMHhmZmZmOworCQkJCQlzX3ZmcmFtZV9xb3MuYXZnX212CisJCQkJCQk9IChyZWdfZGF0YSA+PiA4KSAmIDB4ZmY7CisJCQkJCXNfdmZyYW1lX3Fvcy5taW5fbXYKKwkJCQkJCT0gIHJlZ19kYXRhICYgMHhmZjsKKwkJCQkJcmVnX2RhdGEgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9JKTsKKwkJCQkJc192ZnJhbWVfcW9zLm1heF9xcAorCQkJCQkJPSAocmVnX2RhdGEgPj4gMTYpICYgMHhmZjsKKwkJCQkJc192ZnJhbWVfcW9zLmF2Z19xcAorCQkJCQkJPSAocmVnX2RhdGEgPj4gOCkgJiAweGZmOworCQkJCQlzX3ZmcmFtZV9xb3MubWluX3FwCisJCQkJCQk9ICByZWdfZGF0YSAmIDB4ZmY7CisJCQkJCXJlZ19kYXRhID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfSyk7CisJCQkJCXNfdmZyYW1lX3Fvcy5tYXhfc2tpcAorCQkJCQkJPSAocmVnX2RhdGEgPj4gMTYpICYgMHhmZjsKKwkJCQkJc192ZnJhbWVfcW9zLmF2Z19za2lwCisJCQkJCQk9IChyZWdfZGF0YSA+PiA4KSAmIDB4ZmY7CisJCQkJCXNfdmZyYW1lX3Fvcy5taW5fc2tpcAorCQkJCQkJPSAgcmVnX2RhdGEgJiAweGZmOworCQkJCX0KKwkJCQlpZiAoZGVjb2Rlcl9kZWJ1Z19mbGFnJjB4MikgeworCQkJCQlwcl9pbmZvKCJtYXhfbXYgJWQgICAgYXZnX212ICVkICBtaW5fbXYgJWQgc2xpY2VfdHlwZSAlZCBvZmZzZXQgJXggICBpID0gICVkXG4iLAorCQkJCQkJc192ZnJhbWVfcW9zLm1heF9tdiwKKwkJCQkJCXNfdmZyYW1lX3Fvcy5hdmdfbXYsCisJCQkJCQlzX3ZmcmFtZV9xb3MubWluX212LAorCQkJCQkJc2xpY2VfdHlwZSwKKwkJCQkJCWJfb2Zmc2V0LAorCQkJCQkJaSk7CisJCQkJCXByX2luZm8oIm1heF9xcCAlZCAgICBhdmdfcXAgJWQgIG1pbl9xcCAlZFxuIiwKKwkJCQkJCXNfdmZyYW1lX3Fvcy5tYXhfcXAsCisJCQkJCQlzX3ZmcmFtZV9xb3MuYXZnX3FwLAorCQkJCQkJc192ZnJhbWVfcW9zLm1pbl9xcCk7CisJCQkJCXByX2luZm8oIm1heF9za2lwICVkICBhdmdfc2tpcCAlZCAgbWluX3NraXAgJWRcbiIsCisJCQkJCQlzX3ZmcmFtZV9xb3MubWF4X3NraXAsCisJCQkJCQlzX3ZmcmFtZV9xb3MuYXZnX3NraXAsCisJCQkJCQlzX3ZmcmFtZV9xb3MubWluX3NraXApOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCXNlYXJjaF9xb3Nfbm9kZSgmc192ZnJhbWVfcW9zLCBiX29mZnNldCk7CisjZW5kaWYKKwkJCWZyYW1lX2NvdW50Kys7CisKKwkJCXNfdmZyYW1lX3Fvcy5udW0gPSBmcmFtZV9jb3VudDsKKwkJCS8vdmRlY19maWxsX2ZyYW1lX2luZm8oJnNfdmZyYW1lX3FvcywgMSk7CisKKwkJCS8qIG9uIHNlY29uZCBJRFIgZnJhbWUsY2hlY2sgdGhlIGRpZmYgYmV0d2VlbiBwdHMKKwkJCSAqICBjb21wdXRlIGZyb20gZHVyYXRpb24gYW5kIHB0cyBmcm9tIGxvb2t1cCAsCisJCQkgKiBpZiBsYXJnZSB0aGFuIGZyYW1lX2R1cix3ZSB0aGluayBpdCBpcyB1bmNvcnJlY3QuCisJCQkgKi8KKwkJCXB0c19sb29rdXBfc2F2ZSA9IHB0czsKKwkJCXB0c192YWxpZF9zYXZlID0gcHRzX3ZhbGlkOworCQkJaWYgKGZpeGVkX2ZyYW1lX3JhdGVfZmxhZworCQkJCSYmIChmaXhlZF9mcmFtZV9yYXRlX2NoZWNrX2NvdW50IDw9CisJCQkJCWlkcl9udW0pKSB7CisJCQkJaWYgKGlkcl9mbGFnICYmIHB0c192YWxpZCkgeworCQkJCQlmaXhlZF9mcmFtZV9yYXRlX2NoZWNrX2NvdW50Kys7CisJCQkJCS8qIHByX2luZm8oImRpZmY6JWRcbiIsCisJCQkJCSAqICAgbGFzdF9wdHMgLSBwdHNfbG9va3VwX3NhdmUpOworCQkJCQkgKi8KKwkJCQkJaWYgKChmaXhlZF9mcmFtZV9yYXRlX2NoZWNrX2NvdW50ID09CisJCQkJCQlpZHJfbnVtKSAmJgorCQkJCQkJKGFicyhwdHMgLSAobGFzdF9wdHMgKworCQkJCQkJCSBEVVIyUFRTKGZyYW1lX2R1cikpKSA+CisJCQkJCQkJIERVUjJQVFMoZnJhbWVfZHVyKSkpIHsKKwkJCQkJCWZpeGVkX2ZyYW1lX3JhdGVfZmxhZyA9IDA7CisJCQkJCQlwcl9pbmZvKCJwdHMgc3luYyBtb2RlIHBsYXlcbiIpOworCQkJCQl9CisKKwkJCQkJaWYgKGZpeGVkX2ZyYW1lX3JhdGVfZmxhZworCQkJCQkJJiYgKGZpeGVkX2ZyYW1lX3JhdGVfY2hlY2tfY291bnQKKwkJCQkJCQk+IGlkcl9udW0pKSB7CisJCQkJCQlwcl9pbmZvCisJCQkJCQkoImZpeF9mcmFtZV9yYXRlIG1vZGUgcGxheVxuIik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWlmIChSRUFEX1ZSRUcoQVZfU0NSQVRDSF9GKSAmIDIpIHsKKwkJCQkvKiBmb3IgSSBvbmx5IG1vZGUsIGlnbm9yZSB0aGUgUFRTIGluZm9ybWF0aW9uCisJCQkJICogICBhbmQgb25seSB1c2VzIGZyYW1lIGR1cmF0aW9uIGZvciBlYWNoIEkKKwkJCQkgKiAgZnJhbWUgZGVjb2RlZAorCQkJCSAqLworCQkJCWlmIChwX2xhc3RfdmYpCisJCQkJCXB0c192YWxpZCA9IDA7CisJCQkJLyogYWxzbyBza2lwIGZyYW1lIGR1cmF0aW9uIGNhbGN1bGF0aW9uCisJCQkJICogIGJhc2VkIG9uIFBUUworCQkJCSAqLworCQkJCWR1cmF0aW9uX2Zyb21fcHRzX2RvbmUgPSAxOworCQkJCS8qIGFuZCBhZGQgYSBkZWZhdWx0IGR1cmF0aW9uIGZvciAxLzMwIHNlY29uZAorCQkJCSAqICBpZiB0aGVyZSBpcyBubyB2YWxpZCBmcmFtZQorCQkJCSAqIGR1cmF0aW9uIGF2YWlsYWJsZQorCQkJCSAqLworCQkJCWlmIChmcmFtZV9kdXIgPT0gMCkKKwkJCQkJZnJhbWVfZHVyID0gOTYwMDAgLyAzMDsKKwkJCX0KKworCQkJaWYgKHN5bmNfb3V0c2lkZSA9PSAwKSB7CisJCQkJaWYgKCF2aDI2NF9pc3JfcGFyc2VyKHZmLAorCQkJCQkJcHRzX3ZhbGlkLCBidWZmZXJfaW5kZXgsIHB0cykpCisJCQkJCWNvbnRpbnVlOworCisJCQkJaDI2NF9wdHNfY291bnQrKzsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCFpZHJfZmxhZykKKwkJCQkJcHRzX3ZhbGlkID0gMDsKKwkJCX0KKworCQkJaWYgKHB0c192YWxpZCAmJiAhcHRzX2Rpc2NvbnRpbnVlKSB7CisJCQkJcHRzX2Rpc2NvbnRpbnVlID0KKwkJCQkJKGFicyhsYXN0X3B0cyAtIHB0cykgPj0KKwkJCQkJIHRzeW5jX3ZwdHNfZGlzY29udGludWl0eV9tYXJnaW4oKSk7CisJCQl9CisJCQkvKiBpZiB1c2VfaWRyX2ZyYW1lcmF0ZSBvciBmaXhlZCBmcmFtZSByYXRlLCBvbmx5CisJCQkgKiAgdXNlIFBUUyBmb3IgSURSIGZyYW1lcyBleGNlcHQgZm9yIHB0cyBkaXNjb250aW51ZQorCQkJICovCisJCQlpZiAodGltaW5nX2luZm9fcHJlc2VudF9mbGFnICYmCisJCQkJZnJhbWVfZHVyICYmCisJCQkJKHVzZV9pZHJfZnJhbWVyYXRlIHx8CisJCQkJIChmaXhlZF9mcmFtZV9yYXRlX2ZsYWcgIT0gMCkpCisJCQkJJiYgcHRzX3ZhbGlkICYmIGgyNjRfZmlyc3RfdmFsaWRfcHRzX3JlYWR5CisJCQkJJiYgKCFwdHNfZGlzY29udGludWUpKSB7CisJCQkJcHRzX3ZhbGlkID0KKwkJCQkJKHNsaWNlX3R5cGUgPT0gU0xJQ0VfVFlQRV9JKSA/IDEgOiAwOworCQkJfQorCisJCQlpZiAoIWgyNjRfZmlyc3RfdmFsaWRfcHRzX3JlYWR5ICYmIHB0c192YWxpZCkgeworCQkJCWgyNjRfZmlyc3RfdmFsaWRfcHRzX3JlYWR5ID0gdHJ1ZTsKKwkJCQlsYXN0X3B0cyA9IHB0cyAtIERVUjJQVFMoZnJhbWVfZHVyKTsKKwkJCQlsYXN0X3B0c19yZW1haW5kZXIgPSAwOworCQkJfQorCQkJLyogY2FsY3VsYXRlIFBUUyBvZiBuZXh0IGZyYW1lIGFuZCBzbW9vdGgKKwkJCSAqICBQVFMgZm9yIGZpeGVkIHJhdGUgc291cmNlCisJCQkgKi8KKwkJCWlmIChwdHNfdmFsaWQpIHsKKwkJCQlpZiAoKGZpeGVkX2ZyYW1lX3JhdGVfZmxhZykgJiYKKwkJCQkJKCFwdHNfZGlzY29udGludWUpICYmCisJCQkJCShhYnMocHRzX2luY19ieV9kdXJhdGlvbihOVUxMLCBOVUxMKQorCQkJCQkgICAgIC0gcHRzKQorCQkJCQkgPCBEVVIyUFRTKGZyYW1lX2R1cikpKSB7CisJCQkJCXB0cyA9IHB0c19pbmNfYnlfZHVyYXRpb24oJnB0cywKKwkJCQkJCQkmbGFzdF9wdHNfcmVtYWluZGVyKTsKKwkJCQl9IGVsc2UKKwkJCQkJbGFzdF9wdHNfcmVtYWluZGVyID0gMDsKKworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZml4ZWRfZnJhbWVfcmF0ZV9mbGFnICYmICFwdHNfZGlzY29udGludWUgJiYKKwkJCQkoZml4ZWRfZnJhbWVfcmF0ZV9jaGVja19jb3VudCA+IGlkcl9udW0pICYmCisJCQkJcHRzX3ZhbGlkX3NhdmUgJiYgKHN5bmNfb3V0c2lkZSA9PSAwKSAmJgorCQkJCShhYnMocHRzX2luY19ieV9kdXJhdGlvbihOVUxMLCBOVUxMKSAtIHB0cykKKwkJCQkgPiBEVVIyUFRTKGZyYW1lX2R1cikpKSB7CisJCQkJCWR1cmF0aW9uX2Zyb21fcHRzX2RvbmUgPSAwOworCQkJCQlwcl9pbmZvKCJyZWNhbGMgZnJhbWVfZHVyXG4iKTsKKwkJCQl9IGVsc2UKKwkJCQkJcHRzID0gcHRzX2luY19ieV9kdXJhdGlvbigmcHRzLAorCQkJCQkJJmxhc3RfcHRzX3JlbWFpbmRlcik7CisJCQkJcHRzX3ZhbGlkID0gMTsKKwkJCX0KKworCQkJaWYgKChkZWNfY29udHJvbCAmCisJCQkJIGZsZ18xMDgwX2l0bCkKKwkJCQkmJiAoZnJhbWVfd2lkdGggPT0gMTkyMCkKKwkJCQkmJiAoZnJhbWVfaGVpZ2h0ID49IDEwODApCisJCQkJJiYgKHZmLT5kdXJhdGlvbiA9PSAzMjAzKSkKKwkJCQlmb3JjZV9pbnRlcmxhY2VkX2ZyYW1lID0gdHJ1ZTsKKwkJCWVsc2UgaWYgKChkZWNfY29udHJvbCAmCisJCQkJCSAgZmxnXzU3Nl9pdGwpCisJCQkJCSAmJiAoZnJhbWVfd2lkdGggPT0gNzIwKQorCQkJCQkgJiYgKGZyYW1lX2hlaWdodCA9PSA1NzYpCisJCQkJCSAmJiAodmYtPmR1cmF0aW9uID09IDM4NDApKQorCQkJCWZvcmNlX2ludGVybGFjZWRfZnJhbWUgPSB0cnVlOworCisJCQkvKiBmb3IgZnJhbWVzIHdpdGggUFRTLCBjaGVjayBpZiB0aGVyZSBpcyBQVFMKKwkJCSAqICBkaXNjb250aW51ZSBiYXNlZCBvbiBwcmV2aW91cyBmcmFtZXMKKwkJCSAqIChpbmNsdWRpbmcgZXJyb3IgZnJhbWVzKSwKKwkJCSAqIGZvcmNlIG5vIFZQVFMgZGlzY29udGludWUgcmVwb3J0aW5nIGlmIHdlIHNhdworCQkJICplcnJvcnMgZWFybGllciBidXQgb25seSBvbmNlLgorCQkJICovCisKKwkJCS8qY291bnQgaW5mbyovCisJCQloMjY0X3VwZGF0ZV9ndnMoKTsKKwkJCXZkZWNfY291bnRfaW5mbyhndnMsIGVycm9yLCBiX29mZnNldCk7CisJCQl2ZGVjX2ZpbGxfdmRlY19mcmFtZSh2ZGVjX2gyNjQsICZzX3ZmcmFtZV9xb3MsIGd2cywgdmYsIDApOworCisJCQlpZiAoKHB0c192YWxpZCkgJiYgKGNoZWNrX3B0c19kaXNjb250aW51ZSkKKwkJCQkJJiYgKCFlcnJvcikpIHsKKwkJCQlpZiAocHRzX2Rpc2NvbnRpbnVlKSB7CisJCQkJCXZmLT5mbGFnID0gMDsKKwkJCQkJY2hlY2tfcHRzX2Rpc2NvbnRpbnVlID0gZmFsc2U7CisJCQkJfSBlbHNlIGlmICgocHRzIC0gbGFzdF9wdHMpIDwgOTAwMDApIHsKKwkJCQkJdmYtPmZsYWcgPSBWRlJBTUVfRkxBR19OT19ESVNDT05USU5VRTsKKwkJCQkJY2hlY2tfcHRzX2Rpc2NvbnRpbnVlID0gZmFsc2U7CisJCQkJfQorCQkJfQorCisJCQlsYXN0X3B0cyA9IHB0czsKKworCQkJaWYgKGZpeGVkX2ZyYW1lX3JhdGVfZmxhZworCQkJCSYmIChmaXhlZF9mcmFtZV9yYXRlX2NoZWNrX2NvdW50IDw9CisJCQkJCWlkcl9udW0pCisJCQkJJiYgKHN5bmNfb3V0c2lkZSA9PSAwKQorCQkJCSYmIHB0c192YWxpZF9zYXZlKQorCQkJCXB0cyA9IHB0c19sb29rdXBfc2F2ZTsKKworCQkJaWYgKHBpY19zdHJ1Y3RfcHJlc2VudCkgeworCQkJCWlmICgocGljX3N0cnVjdCA9PSBQSUNfVE9QX0JPVCkKKwkJCQkJfHwgKHBpY19zdHJ1Y3QgPT0gUElDX0JPVF9UT1ApKQorCQkJCQlwcm9nX2ZyYW1lID0gMDsKKwkJCX0KKworCQkJaWYgKCghZm9yY2VfaW50ZXJsYWNlZF9mcmFtZSkKKwkJCQkmJiAocHJvZ19mcmFtZQorCQkJCQl8fCAocGljX3N0cnVjdF9wcmVzZW50CisJCQkJCQkmJiBwaWNfc3RydWN0CisJCQkJCQk8PSBQSUNfVFJJUExFX0ZSQU1FKSkpIHsKKwkJCQlpZiAocGljX3N0cnVjdF9wcmVzZW50KSB7CisJCQkJCWlmIChwaWNfc3RydWN0ID09IFBJQ19UT1BfQk9UX1RPUAorCQkJCQkJfHwgcGljX3N0cnVjdAorCQkJCQkJPT0gUElDX0JPVF9UT1BfQk9UKSB7CisJCQkJCQl2Zi0+ZHVyYXRpb24gKz0KKwkJCQkJCQl2Zi0+ZHVyYXRpb24gPj4gMTsKKwkJCQkJfSBlbHNlIGlmIChwaWNfc3RydWN0ID09CisJCQkJCQkJICAgUElDX0RPVUJMRV9GUkFNRSkKKwkJCQkJCXZmLT5kdXJhdGlvbiArPSB2Zi0+ZHVyYXRpb247CisJCQkJCWVsc2UgaWYgKHBpY19zdHJ1Y3QgPT0KKwkJCQkJCQkgUElDX1RSSVBMRV9GUkFNRSkgeworCQkJCQkJdmYtPmR1cmF0aW9uICs9CisJCQkJCQkJdmYtPmR1cmF0aW9uIDw8IDE7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlsYXN0X3B0cyA9CisJCQkJCWxhc3RfcHRzICsgRFVSMlBUUyh2Zi0+ZHVyYXRpb24gLQorCQkJCQkJCWZyYW1lX2R1cik7CisKKwkJCQl2Zi0+aW5kZXggPSBidWZmZXJfaW5kZXg7CisJCQkJdmYtPnR5cGUgPQorCQkJCQlWSURUWVBFX1BST0dSRVNTSVZFIHwKKwkJCQkJVklEVFlQRV9WSVVfRklFTEQgfAorCQkJCQlWSURUWVBFX1ZJVV9OVjIxOworCQkJCXZmLT5kdXJhdGlvbl9wdWxsZG93biA9IDA7CisJCQkJdmYtPnNpZ25hbF90eXBlID0gdmlkZW9fc2lnbmFsX2Zyb21fdnVpOworCQkJCXZmLT5pbmRleCA9IGJ1ZmZlcl9pbmRleDsKKwkJCQl2Zi0+cHRzID0gKHB0c192YWxpZCkgPyBwdHMgOiAwOworCQkJCWlmIChwdHNfdXM2NF92YWxpZCA9PSAxKQorCQkJCQl2Zi0+cHRzX3VzNjQgPSBwdHNfdXM2NDsKKwkJCQllbHNlCisJCQkJdmYtPnB0c191czY0ID0gZGl2NjRfdTY0KCgodTY0KXZmLT5wdHMpKjEwMCwgOSk7CisJCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0KKwkJCQkJc3BlYzJjYW52YXMoJmJ1ZmZlcl9zcGVjW2J1ZmZlcl9pbmRleF0pOworCQkJCXZmLT50eXBlX29yaWdpbmFsID0gdmYtPnR5cGU7CisJCQkJdmZidWZfdXNlW2J1ZmZlcl9pbmRleF0rKzsKKwkJCQl2Zi0+bWVtX2hhbmRsZSA9CisJCQkJCWRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJCQltbV9ibGtfaGFuZGxlLAorCQkJCQkJVkZfQlVGRkVSX0lEWChidWZmZXJfaW5kZXgpKTsKKwkJCQlkZWNvZGVyX2RvX2ZyYW1lX2NoZWNrKE5VTEwsIHZmKTsKKwkJCQlpZiAoKGVycm9yX3JlY292ZXJ5X21vZGVfdXNlICYgMikgJiYgZXJyb3IpIHsKKwkJCQkJa2ZpZm9fcHV0KCZyZWN5Y2xlX3EsCisJCQkJCQkoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQkJCX0gZWxzZSB7CisJCQkJCXBfbGFzdF92ZiA9IHZmOworCQkJCQlwdHNfZGlzY29udGludWUgPSBmYWxzZTsKKwkJCQkJa2ZpZm9fcHV0KCZkZWxheV9kaXNwbGF5X3EsCisJCQkJCQkgIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAocGljX3N0cnVjdF9wcmVzZW50CisJCQkJCSYmIHBpY19zdHJ1Y3QgPT0gUElDX1RPUF9CT1QpCisJCQkJCXZmLT50eXBlID0gVklEVFlQRV9JTlRFUkxBQ0VfVE9QOworCQkJCWVsc2UgaWYgKHBpY19zdHJ1Y3RfcHJlc2VudAorCQkJCQkJICYmIHBpY19zdHJ1Y3QgPT0gUElDX0JPVF9UT1ApCisJCQkJCXZmLT50eXBlID0gVklEVFlQRV9JTlRFUkxBQ0VfQk9UVE9NOworCQkJCWVsc2UgeworCQkJCQl2Zi0+dHlwZSA9CisJCQkJCQlwb2Nfc2VsID8KKwkJCQkJCVZJRFRZUEVfSU5URVJMQUNFX0JPVFRPTSA6CisJCQkJCQlWSURUWVBFX0lOVEVSTEFDRV9UT1A7CisJCQkJfQorCQkJCXZmLT50eXBlIHw9IFZJRFRZUEVfVklVX05WMjE7CisJCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9JTlRFUkxBQ0VfRklSU1Q7CisKKwkJCQloaWdoX2JhbmR3aWR0aCB8PQorCQkJCSgoY29kZWNfbW1fZ2V0X3RvdGFsX3NpemUoKSA8IDgwICogU1pfMU0pCisJCQkJJiAoKFJFQURfVlJFRyhBVl9TQ1JBVENIX04pICYgMHhmKSA9PSAzKQorCQkJCSYgKChmcmFtZV93aWR0aCAqIGZyYW1lX2hlaWdodCkgPj0gMTkyMCoxMDgwKSk7CisJCQkJaWYgKGhpZ2hfYmFuZHdpZHRoKQorCQkJCQl2Zi0+ZmxhZyB8PSBWRlJBTUVfRkxBR19ISUdIX0JBTkRXSURUSDsKKworCQkJCXZmLT5kdXJhdGlvbiA+Pj0gMTsKKwkJCQl2Zi0+ZHVyYXRpb25fcHVsbGRvd24gPSAwOworCQkJCXZmLT5zaWduYWxfdHlwZSA9IHZpZGVvX3NpZ25hbF9mcm9tX3Z1aTsKKwkJCQl2Zi0+aW5kZXggPSBidWZmZXJfaW5kZXg7CisJCQkJdmYtPnB0cyA9IChwdHNfdmFsaWQpID8gcHRzIDogMDsKKwkJCQlpZiAocHRzX3VzNjRfdmFsaWQgPT0gMSkKKwkJCQkJdmYtPnB0c191czY0ID0gcHRzX3VzNjQ7CisJCQkJZWxzZQorCQkJCXZmLT5wdHNfdXM2NCA9IGRpdjY0X3U2NCgoKHU2NCl2Zi0+cHRzKSoxMDAsIDkpOworCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9CisJCQkJCXNwZWMyY2FudmFzKCZidWZmZXJfc3BlY1tidWZmZXJfaW5kZXhdKTsKKwkJCQl2Zi0+dHlwZV9vcmlnaW5hbCA9IHZmLT50eXBlOworCQkJCXZmYnVmX3VzZVtidWZmZXJfaW5kZXhdKys7CisJCQkJdmYtPnJlYWR5X2ppZmZpZXM2NCA9IGppZmZpZXNfNjQ7CisJCQkJdmYtPm1lbV9oYW5kbGUgPQorCQkJCQlkZWNvZGVyX2JtbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCQkJbW1fYmxrX2hhbmRsZSwKKwkJCQkJCVZGX0JVRkZFUl9JRFgoYnVmZmVyX2luZGV4KSk7CisJCQkJZGVjb2Rlcl9kb19mcmFtZV9jaGVjayhOVUxMLCB2Zik7CisJCQkJaWYgKChlcnJvcl9yZWNvdmVyeV9tb2RlX3VzZSAmIDIpICYmIGVycm9yKSB7CisJCQkJCWtmaWZvX3B1dCgmcmVjeWNsZV9xLAorCQkJCQkJKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwkJCQkJY29udGludWU7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHRzX2Rpc2NvbnRpbnVlID0gZmFsc2U7CisJCQkJCWtmaWZvX3B1dCgmZGVsYXlfZGlzcGxheV9xLAorCQkJCQkJKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwkJCQl9CisKKwkJCQlpZiAoUkVBRF9WUkVHKEFWX1NDUkFUQ0hfRikgJiAyKQorCQkJCQljb250aW51ZTsKKworCQkJCWlmIChrZmlmb19nZXQoJm5ld2ZyYW1lX3EsICZ2ZikgPT0gMCkgeworCQkJCQlwcl9pbmZvCisJCQkJCSgiZmF0YWwgZXJyb3IsIG5vIGF2YWlsIGJ1ZmZlciBzbG90LiIpOworCQkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQkJfQorCisJCQkJc2V0X2ZyYW1lX2luZm8odmYpOworCisJCQkJaWYgKHBpY19zdHJ1Y3RfcHJlc2VudAorCQkJCQkmJiBwaWNfc3RydWN0ID09IFBJQ19UT1BfQk9UKQorCQkJCQl2Zi0+dHlwZSA9IFZJRFRZUEVfSU5URVJMQUNFX0JPVFRPTTsKKwkJCQllbHNlIGlmIChwaWNfc3RydWN0X3ByZXNlbnQKKwkJCQkJCSAmJiBwaWNfc3RydWN0ID09IFBJQ19CT1RfVE9QKQorCQkJCQl2Zi0+dHlwZSA9IFZJRFRZUEVfSU5URVJMQUNFX1RPUDsKKwkJCQllbHNlIHsKKwkJCQkJdmYtPnR5cGUgPQorCQkJCQkJcG9jX3NlbCA/CisJCQkJCQlWSURUWVBFX0lOVEVSTEFDRV9UT1AgOgorCQkJCQkJVklEVFlQRV9JTlRFUkxBQ0VfQk9UVE9NOworCQkJCX0KKworCQkJCXZmLT50eXBlIHw9IFZJRFRZUEVfVklVX05WMjE7CisJCQkJdmYtPmR1cmF0aW9uID4+PSAxOworCQkJCXZmLT5kdXJhdGlvbl9wdWxsZG93biA9IDA7CisJCQkJdmYtPnNpZ25hbF90eXBlID0gdmlkZW9fc2lnbmFsX2Zyb21fdnVpOworCQkJCXZmLT5pbmRleCA9IGJ1ZmZlcl9pbmRleDsKKwkJCQl2Zi0+cHRzID0gMDsKKwkJCQl2Zi0+cHRzX3VzNjQgPSAwOworCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9CisJCQkJCXNwZWMyY2FudmFzKCZidWZmZXJfc3BlY1tidWZmZXJfaW5kZXhdKTsKKwkJCQl2Zi0+dHlwZV9vcmlnaW5hbCA9IHZmLT50eXBlOworCQkJCXZmYnVmX3VzZVtidWZmZXJfaW5kZXhdKys7CisJCQkJaWYgKGhpZ2hfYmFuZHdpZHRoKQorCQkJCQl2Zi0+ZmxhZyB8PSBWRlJBTUVfRkxBR19ISUdIX0JBTkRXSURUSDsKKworCQkJCXBfbGFzdF92ZiA9IHZmOworCQkJCXZmLT5yZWFkeV9qaWZmaWVzNjQgPSBqaWZmaWVzXzY0OworCQkJCXZmLT5tZW1faGFuZGxlID0KKwkJCQkJZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCQkJCW1tX2Jsa19oYW5kbGUsCisJCQkJCQlWRl9CVUZGRVJfSURYKGJ1ZmZlcl9pbmRleCkpOworCQkJCWtmaWZvX3B1dCgmZGVsYXlfZGlzcGxheV9xLAorCQkJCQkJKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwkJCX0KKwkJfQorCisJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8wLCAwKTsKKwl9IGVsc2UgaWYgKChjcHVfY21kICYgMHhmZikgPT0gMykgeworCQl2aDI2NF9ydW5uaW5nID0gMTsKKwkJdmgyNjRfc3RyZWFtX3N3aXRjaGluZ19zdGF0ZSA9IFNXSVRDSElOR19TVEFURV9PTl9DTUQzOworCisJCXByX2luZm8oIkVudGVyIHN3aXRjaGluZyBtb2RlIGNtZDMuXG4iKTsKKwkJc2NoZWR1bGVfd29yaygmc3RyZWFtX3N3aXRjaGluZ193b3JrKTsKKworCX0gZWxzZSBpZiAoKGNwdV9jbWQgJiAweGZmKSA9PSA0KSB7CisJCXZoMjY0X3J1bm5pbmcgPSAxOworCQkvKiByZXNlcnZlZCBmb3Igc2xpY2UgZ3JvdXAgKi8KKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzAsIDApOworCX0gZWxzZSBpZiAoKGNwdV9jbWQgJiAweGZmKSA9PSA1KSB7CisJCXZoMjY0X3J1bm5pbmcgPSAxOworCQkvKiByZXNlcnZlZCBmb3Igc2xpY2UgZ3JvdXAgKi8KKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzAsIDApOworCX0gZWxzZSBpZiAoKGNwdV9jbWQgJiAweGZmKSA9PSA2KSB7CisJCXZoMjY0X3J1bm5pbmcgPSAwOworCQlmYXRhbF9lcnJvcl9mbGFnID0gREVDT0RFUl9GQVRBTF9FUlJPUl9VTktOT1dOOworCQkvKiB0aGlzIGlzIGZhdGFsIGVycm9yLCBuZWVkIHJlc3RhcnQgKi8KKwkJcHJfaW5mbygiZmF0YWwgZXJyb3IgaGFwcGVuZFxuIik7CisJCWFtdmRlY19zdG9wKCk7CisJCWlmICghZmF0YWxfZXJyb3JfcmVzZXQpCisJCQlzY2hlZHVsZV93b3JrKCZlcnJvcl93ZF93b3JrKTsKKwl9IGVsc2UgaWYgKChjcHVfY21kICYgMHhmZikgPT0gNykgeworCQl2aDI2NF9ydW5uaW5nID0gMDsKKwkJZnJhbWVfd2lkdGggPSAoUkVBRF9WUkVHKEFWX1NDUkFUQ0hfMSkgKyAxKSAqIDE2OworCQlwcl9pbmZvKCJPdmVyIGRlY29kZXIgc3VwcG9ydGVkIHNpemUsIHdpZHRoID0gJWRcbiIsCisJCQkgICBmcmFtZV93aWR0aCk7CisJCWZhdGFsX2Vycm9yX2ZsYWcgPSBERUNPREVSX0ZBVEFMX0VSUk9SX1NJWkVfT1ZFUkZMT1c7CisJfSBlbHNlIGlmICgoY3B1X2NtZCAmIDB4ZmYpID09IDgpIHsKKwkJdmgyNjRfcnVubmluZyA9IDA7CisJCWZyYW1lX2hlaWdodCA9IChSRUFEX1ZSRUcoQVZfU0NSQVRDSF8xKSArIDEpICogMTY7CisJCXByX2luZm8oIk92ZXIgZGVjb2RlciBzdXBwb3J0ZWQgc2l6ZSwgaGVpZ2h0ID0gJWRcbiIsCisJCQkgICBmcmFtZV9oZWlnaHQpOworCQlmYXRhbF9lcnJvcl9mbGFnID0gREVDT0RFUl9GQVRBTF9FUlJPUl9TSVpFX09WRVJGTE9XOworCX0gZWxzZSBpZiAoKGNwdV9jbWQgJiAweGZmKSA9PSA5KSB7CisJCWZpcnN0X29mZnNldCA9IFJFQURfVlJFRyhBVl9TQ1JBVENIXzEpOworCQlpZiAocHRzX2xvb2t1cF9vZmZzZXRfdXM2NAorCQkJKFBUU19UWVBFX1ZJREVPLCBmaXJzdF9vZmZzZXQsICZmaXJzdF9wdHMsCisJCQkmZmlyc3RfZnJhbWVfc2l6ZSwgMCwKKwkJCSAmZmlyc3RfcHRzNjQpID09IDApCisJCQlmaXJzdF9wdHNfY2FjaGVkID0gdHJ1ZTsKKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzAsIDApOworCX0gZWxzZSBpZiAoKGNwdV9jbWQgJiAweGZmKSA9PSAweGEpIHsKKwkJaW50IGJfb2Zmc2V0OworCQl1bnNpZ25lZCBpbnQgZnJhbWVfc2l6ZTsKKworCQliX29mZnNldCA9IFJFQURfVlJFRyhBVl9TQ1JBVENIXzIpOworCQlidWZmZXJfaW5kZXggPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF8xKTsKKwkJLypwcl9pbmZvKCJpcG9ubHkgb3V0cHV0ICVkICBiX29mZnNldCAleFxuIiwKKwkJICoJYnVmZmVyX2luZGV4LGJfb2Zmc2V0KTsKKwkJICovCisJCWlmIChrZmlmb19nZXQoJm5ld2ZyYW1lX3EsICZ2ZikgPT0gMCkgeworCQkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzAsIDApOworCQkJcHJfaW5mbworCQkJKCJmYXRhbCBlcnJvciwgbm8gYXZhaWxhYmxlIGJ1ZmZlciBzbG90LiIpOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisJCWlmIChwdHNfbG9va3VwX29mZnNldF91czY0IChQVFNfVFlQRV9WSURFTywgYl9vZmZzZXQsCisJCQkJJnB0cywgJmZyYW1lX3NpemUsCisJCQkJMCwgJnB0c191czY0KSAhPSAwKQorCQkJdmYtPnB0c191czY0ID0gdmYtPnB0cyA9IDA7CisJCWVsc2UgeworCQkJdmYtPnB0c191czY0ID0gcHRzX3VzNjQ7CisJCQl2Zi0+cHRzID0gcHRzOworCQl9CisJCXNldF9mcmFtZV9pbmZvKHZmKTsKKwkJdmYtPnR5cGUgPSBWSURUWVBFX1BST0dSRVNTSVZFIHwKKwkJCQlWSURUWVBFX1ZJVV9GSUVMRCB8CisJCQkJVklEVFlQRV9WSVVfTlYyMTsKKwkJdmYtPmR1cmF0aW9uX3B1bGxkb3duID0gMDsKKwkJdmYtPnNpZ25hbF90eXBlID0gdmlkZW9fc2lnbmFsX2Zyb21fdnVpOworCQl2Zi0+aW5kZXggPSBidWZmZXJfaW5kZXg7CisJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9CisJCQkJc3BlYzJjYW52YXMoJmJ1ZmZlcl9zcGVjW2J1ZmZlcl9pbmRleF0pOworCQl2Zi0+dHlwZV9vcmlnaW5hbCA9IHZmLT50eXBlOworCQl2Zi0+bWVtX2hhbmRsZSA9IGRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQltbV9ibGtfaGFuZGxlLAorCQkJCQlWRl9CVUZGRVJfSURYKGJ1ZmZlcl9pbmRleCkpOworCQl2ZmJ1Zl91c2VbYnVmZmVyX2luZGV4XSsrOworCQlwX2xhc3RfdmYgPSB2ZjsKKwkJcHRzX2Rpc2NvbnRpbnVlID0gZmFsc2U7CisJCWlwb25seV9lYXJseV9tb2RlID0gMTsKKwkJZGVjb2Rlcl9kb19mcmFtZV9jaGVjayhOVUxMLCB2Zik7CisJCWtmaWZvX3B1dCgmZGVsYXlfZGlzcGxheV9xLAorCQkJKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzAsIDApOworCX0gZWxzZSBpZiAoKGNwdV9jbWQgJiAweGZmKSA9PSAweEIpIHsKKwkJc2NoZWR1bGVfd29yaygmcW9zX3dvcmspOworCX0KKworCXNlaV9pdHUzNV9mbGFncyA9IFJFQURfVlJFRyhBVl9TQ1JBVENIX0opOworCWlmIChzZWlfaXR1MzVfZmxhZ3MgJiAoMSA8PCAxNSkpIHsJLyogZGF0YSByZWFkeSAqLworI2lmZGVmIEVOQUJMRV9TRUlfSVRVX1QzNQorCQlzY2hlZHVsZV93b3JrKCZ1c2VyZGF0YV9wdXNoX3dvcmspOworI2Vsc2UKKwkJLyogbmVjZXNzYXJ5IGlmIGVuYWJsZWQgaXR1X3QzNSBpbiB1Y29kZSovCisJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9KLCAwKTsKKyNlbmRpZgorCX0KKworI2lmZGVmIEhBTkRMRV9IMjY0X0lSUQorCXJldHVybiBJUlFfSEFORExFRDsKKyNlbHNlCisJcmV0dXJuOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHZoMjY0X3NldF9jbGsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCQlpbnQgZnBzID0gOTYwMDAgLyBmcmFtZV9kdXI7CisKKwkJaWYgKGZyYW1lX2R1ciA8IDEwKSAvKmR1ciBpcyB0b28gc21hbGwgLHRoaW5rIGl0IGVycm9ycyBmcHMqLworCQkJZnBzID0gNjA7CisJCXNhdmVkX3Jlc29sdXRpb24gPSBmcmFtZV93aWR0aCAqIGZyYW1lX2hlaWdodCAqIGZwczsKKwkJdmRlY19zb3VyY2VfY2hhbmdlZChWRk9STUFUX0gyNjQsCisJCQlmcmFtZV93aWR0aCwgZnJhbWVfaGVpZ2h0LCBmcHMpOworfQorCitzdGF0aWMgdm9pZCB2aDI2NF9wdXRfdGltZXJfZnVuYyhzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpCit7CisJdW5zaWduZWQgaW50IHdhaXRfYnVmZmVyX3N0YXR1czsKKwl1bnNpZ25lZCBpbnQgd2FpdF9pX3Bhc3NfZnJhbWVzOworCXVuc2lnbmVkIGludCByZWdfdmFsOworCisJZW51bSByZWNldml2ZXJfc3RhcnRfZSBzdGF0ZSA9IFJFQ0VJVkVSX0lOQUNUSVZFOworCisJaWYgKHZoMjY0X3Jlc2V0KSB7CisJCXByX2luZm8oIm9wZXJhdGlvbiBmb3JiaWRkZW4gaW4gdGltZXIgIVxuIik7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlwcmVwYXJlX2Rpc3BsYXlfcSgpOworCisJaWYgKHZmX2dldF9yZWNlaXZlcihQUk9WSURFUl9OQU1FKSkgeworCQlzdGF0ZSA9CisJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoUFJPVklERVJfTkFNRSwKKwkJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1FVUkVZX1NUQVRFLAorCQkJCQlOVUxMKTsKKwkJaWYgKChzdGF0ZSA9PSBSRUNFSVZFUl9TVEFURV9OVUxMKQorCQkJfHwgKHN0YXRlID09IFJFQ0VJVkVSX1NUQVRFX05PTkUpKSB7CisJCQkvKiByZWNlaXZlciBoYXMgbm8gZXZlbnRfY2Igb3IgcmVjZWl2ZXIncworCQkJICogIGV2ZW50X2NiIGRvZXMgbm90IHByb2Nlc3MgdGhpcyBldmVudAorCQkJICovCisJCQlzdGF0ZSA9IFJFQ0VJVkVSX0lOQUNUSVZFOworCQl9CisJfSBlbHNlCisJCXN0YXRlID0gUkVDRUlWRVJfSU5BQ1RJVkU7CisjaWZuZGVmIEhBTkRMRV9IMjY0X0lSUQorCXZoMjY0X2lzcigpOworI2VuZGlmCisKKwlpZiAodmgyNjRfc3RyZWFtX3N3aXRjaGluZ19zdGF0ZSAhPSBTV0lUQ0hJTkdfU1RBVEVfT0ZGKQorCQl3YWl0X2J1ZmZlcl9jb3VudGVyID0gMDsKKwllbHNlIHsKKwkJcmVnX3ZhbCA9IFJFQURfVlJFRyhBVl9TQ1JBVENIXzkpOworCQl3YWl0X2J1ZmZlcl9zdGF0dXMgPSByZWdfdmFsICYgKDEgPDwgMzEpOworCQl3YWl0X2lfcGFzc19mcmFtZXMgPSByZWdfdmFsICYgMHhmZjsKKwkJaWYgKHdhaXRfYnVmZmVyX3N0YXR1cykgeworCQkJaWYgKGtmaWZvX2lzX2VtcHR5KCZkaXNwbGF5X3EpICYmCisJCQkJa2ZpZm9faXNfZW1wdHkoJmRlbGF5X2Rpc3BsYXlfcSkgJiYKKwkJCQlrZmlmb19pc19lbXB0eSgmcmVjeWNsZV9xKSAmJgorCQkJCShzdGF0ZSA9PSBSRUNFSVZFUl9JTkFDVElWRSkpIHsKKwkJCQlwcl9pbmZvKCIkJCQkZGVjb2RlciBpcyB3YWl0aW5nIGZvciBidWZmZXJcbiIpOworCQkJCWlmICgrK3dhaXRfYnVmZmVyX2NvdW50ZXIgPiA0KSB7CisJCQkJCWFtdmRlY19zdG9wKCk7CisJCQkJCXNjaGVkdWxlX3dvcmsoJmVycm9yX3dkX3dvcmspOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCXdhaXRfYnVmZmVyX2NvdW50ZXIgPSAwOworCQl9IGVsc2UgaWYgKHdhaXRfaV9wYXNzX2ZyYW1lcyA+IDEwMDApIHsKKwkJCXByX2luZm8oImkgcGFzc2VkIGZyYW1lcyA+IDEwMDBcbiIpOworCQkJYW12ZGVjX3N0b3AoKTsKKwkJCXNjaGVkdWxlX3dvcmsoJmVycm9yX3dkX3dvcmspOworCQl9CisJfQorCisjaWYgMAorCWlmICghd2FpdF9idWZmZXJfc3RhdHVzKSB7CisJCWlmICh2aDI2NF9ub19kaXNwX2NvdW50KysgPiBOT19ESVNQX1dEX0NPVU5UKSB7CisJCQlwcl9pbmZvKCIkJCRkZWNvZGVyIGRpZCBub3Qgc2VuZCBmcmFtZSBvdXRcbiIpOworCQkJYW12ZGVjX3N0b3AoKTsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19QT1NUX1BST0NFU1NfTUFOQUdFUgorCQkJdmgyNjRfcHBtZ3JfcmVzZXQoKTsKKyNlbHNlCisJCQl2Zl9saWdodF91bnJlZ19wcm92aWRlcihQUk9WSURFUl9OQU1FKTsKKwkJCXZoMjY0X2xvY2FsX2luaXQoKTsKKwkJCXZmX3JlZ19wcm92aWRlcih2aDI2NF92Zl9wcm92KTsKKyNlbmRpZgorCQkJdmgyNjRfcHJvdF9pbml0KCk7CisJCQlhbXZkZWNfc3RhcnQoKTsKKworCQkJdmgyNjRfbm9fZGlzcF9jb3VudCA9IDA7CisJCQl2aDI2NF9ub19kaXNwX3dkX2NvdW50Kys7CisJCX0KKwl9CisjZW5kaWYKKworCXdoaWxlICgha2ZpZm9faXNfZW1wdHkoJnJlY3ljbGVfcSkgJiYKKwkJICAgKChSRUFEX1ZSRUcoQVZfU0NSQVRDSF83KSA9PSAwKQorCQkJfHwgKFJFQURfVlJFRyhBVl9TQ1JBVENIXzgpID09IDApKQorCQkgICAmJiAodmgyNjRfc3RyZWFtX3N3aXRjaGluZ19zdGF0ZSA9PSBTV0lUQ0hJTkdfU1RBVEVfT0ZGKSkgeworCQlzdHJ1Y3QgdmZyYW1lX3MgKnZmOworCisJCWlmIChrZmlmb19nZXQoJnJlY3ljbGVfcSwgJnZmKSkgeworCQkJaWYgKHZmLT5pbmRleCA8IFZGX0JVRl9OVU0pIHsKKwkJCQlpZiAoLS12ZmJ1Zl91c2VbdmYtPmluZGV4XSA9PSAwKSB7CisJCQkJCWlmIChSRUFEX1ZSRUcoQVZfU0NSQVRDSF83KSA9PSAwKSB7CisJCQkJCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfNywKKwkJCQkJCQkJdmYtPmluZGV4ICsgMSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfOCwKKwkJCQkJCQkJdmYtPmluZGV4ICsgMSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQl2Zi0+aW5kZXggPSBWRl9CVUZfTlVNOworCQkJCWtmaWZvX3B1dCgmbmV3ZnJhbWVfcSwKKwkJCQkJCShjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCQl9CisJCX0KKwl9CisKKwlpZiAodmgyNjRfc3RyZWFtX3N3aXRjaGluZ19zdGF0ZSAhPSBTV0lUQ0hJTkdfU1RBVEVfT0ZGKSB7CisJCXdoaWxlICgha2ZpZm9faXNfZW1wdHkoJnJlY3ljbGVfcSkpIHsKKwkJCXN0cnVjdCB2ZnJhbWVfcyAqdmY7CisKKwkJCWlmIChrZmlmb19nZXQoJnJlY3ljbGVfcSwgJnZmKSkgeworCQkJCWlmICh2Zi0+aW5kZXggPCBWRl9CVUZfTlVNKSB7CisJCQkJCXZmLT5pbmRleCA9IFZGX0JVRl9OVU07CisJCQkJCWtmaWZvX3B1dCgmbmV3ZnJhbWVfcSwKKwkJCQkJCShjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCQkJfQorCQkJfQorCQl9CisKKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzcsIDApOworCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfOCwgMCk7CisKKwkJaWYgKGtmaWZvX2xlbigmbmV3ZnJhbWVfcSkgPT0gVkZfUE9PTF9TSVpFKQorCQkJc3RyZWFtX3N3aXRjaGluZ19kb25lKCk7CisJfQorCisJaWYgKHVjb2RlX3R5cGUgIT0gVUNPREVfSVBfT05MWV9QQVJBTSAmJgorCQkoY2xrX2Fkal9mcmFtZV9jb3VudCA+IFZERUNfQ0xPQ0tfQURKVVNUX0ZSQU1FKSAmJgorCQlmcmFtZV9kdXIgPiAwICYmIHNhdmVkX3Jlc29sdXRpb24gIT0KKwkJZnJhbWVfd2lkdGggKiBmcmFtZV9oZWlnaHQgKiAoOTYwMDAgLyBmcmFtZV9kdXIpKQorCQlzY2hlZHVsZV93b3JrKCZzZXRfY2xrX3dvcmspOworCitleGl0OgorCXRpbWVyLT5leHBpcmVzID0gamlmZmllcyArIFBVVF9JTlRFUlZBTDsKKworCWFkZF90aW1lcih0aW1lcik7Cit9CisKK2ludCB2aDI2NF9kZWNfc3RhdHVzKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHN0cnVjdCB2ZGVjX2luZm8gKnZzdGF0dXMpCit7CisJdTMyIHJhdGlvX2NvbnRyb2w7CisJdTMyIGFyOworCisJaWYgKCEoc3RhdCAmIFNUQVRfVkRFQ19SVU4pKQorCQlyZXR1cm4gLTE7CisKKwl2c3RhdHVzLT5mcmFtZV93aWR0aCA9IGZyYW1lX3dpZHRoOworCXZzdGF0dXMtPmZyYW1lX2hlaWdodCA9IGZyYW1lX2hlaWdodDsKKwlpZiAoZnJhbWVfZHVyICE9IDApCisJCXZzdGF0dXMtPmZyYW1lX3JhdGUgPSA5NjAwMCAvIGZyYW1lX2R1cjsKKwllbHNlCisJCXZzdGF0dXMtPmZyYW1lX3JhdGUgPSAtMTsKKwl2c3RhdHVzLT5lcnJvcl9jb3VudCA9IFJFQURfVlJFRyhBVl9TQ1JBVENIX0QpOworCXZzdGF0dXMtPnN0YXR1cyA9IHN0YXQ7CisJaWYgKGZhdGFsX2Vycm9yX3Jlc2V0KQorCQl2c3RhdHVzLT5zdGF0dXMgfD0gZmF0YWxfZXJyb3JfZmxhZzsKKwl2c3RhdHVzLT5iaXRfcmF0ZSA9IGd2cy0+Yml0X3JhdGU7CisJdnN0YXR1cy0+ZnJhbWVfZHVyID0gZnJhbWVfZHVyOworCXZzdGF0dXMtPmZyYW1lX2RhdGEgPSBndnMtPmZyYW1lX2RhdGE7CisJdnN0YXR1cy0+dG90YWxfZGF0YSA9IGd2cy0+dG90YWxfZGF0YTsKKwl2c3RhdHVzLT5mcmFtZV9jb3VudCA9IGd2cy0+ZnJhbWVfY291bnQ7CisJdnN0YXR1cy0+ZXJyb3JfZnJhbWVfY291bnQgPSBndnMtPmVycm9yX2ZyYW1lX2NvdW50OworCXZzdGF0dXMtPmRyb3BfZnJhbWVfY291bnQgPSBndnMtPmRyb3BfZnJhbWVfY291bnQ7CisJdnN0YXR1cy0+dG90YWxfZGF0YSA9IGd2cy0+dG90YWxfZGF0YTsKKwl2c3RhdHVzLT5zYW1wX2NudCA9IGd2cy0+c2FtcF9jbnQ7CisJdnN0YXR1cy0+b2Zmc2V0ID0gZ3ZzLT5vZmZzZXQ7CisJYXIgPSBtaW5fdCh1MzIsCisJCQloMjY0X2FyLAorCQkJRElTUF9SQVRJT19BU1BFQ1RfUkFUSU9fTUFYKTsKKwlyYXRpb19jb250cm9sID0KKwkJYXIgPDwgRElTUF9SQVRJT19BU1BFQ1RfUkFUSU9fQklUOworCXZzdGF0dXMtPnJhdGlvX2NvbnRyb2wgPSByYXRpb19jb250cm9sOworCisJc25wcmludGYodnN0YXR1cy0+dmRlY19uYW1lLCBzaXplb2YodnN0YXR1cy0+dmRlY19uYW1lKSwKKwkJIiVzIiwgRFJJVkVSX05BTUUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmgyNjRfdmRlY19pbmZvX2luaXQodm9pZCkKK3sKKwlndnMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdmRlY19pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKE5VTEwgPT0gZ3ZzKSB7CisJCXByX2luZm8oInRoZSBzdHJ1Y3Qgb2YgdmRlYyBzdGF0dXMgbWFsbG9jIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCB2aDI2NF9zZXRfdHJpY2ttb2RlKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHVuc2lnbmVkIGxvbmcgdHJpY2ttb2RlKQoreworCWlmICh0cmlja21vZGUgPT0gVFJJQ0tNT0RFX0kpIHsKKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0YsCisJCQkJICAgKFJFQURfVlJFRyhBVl9TQ1JBVENIX0YpICYgMHhmZmZmZmZmYykgfCAyKTsKKwkJdHJpY2ttb2RlX2kgPSAxOworCX0gZWxzZSBpZiAodHJpY2ttb2RlID09IFRSSUNLTU9ERV9OT05FKSB7CisJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9GLCBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9GKSAmIDB4ZmZmZmZmZmMpOworCQl0cmlja21vZGVfaSA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCB2aDI2NF9zZXRfaXNyZXNldChzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgaXNyZXNldCkKK3sKKwlpc19yZXNldCA9IGlzcmVzZXQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZoMjY0X3Byb3RfaW5pdCh2b2lkKQoreworCXVsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgSFo7CisKKwl3aGlsZSAoUkVBRF9WUkVHKERDQUNfRE1BX0NUUkwpICYgMHg4MDAwKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQlwcl9pbmZvKCIlcyBEQ0FDX0RNQV9DVFJMIHRpbWUgb3V0XG4iLCBfX2Z1bmNfXyk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXRpbWVvdXQgPSBqaWZmaWVzICsgSFo7CisJd2hpbGUgKFJFQURfVlJFRyhMTUVNX0RNQV9DVFJMKSAmIDB4ODAwMCkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJcHJfaW5mbygiJXMgTE1FTV9ETUFfQ1RSTCB0aW1lIG91dFxuIiwgX19mdW5jX18pOworCQkJYnJlYWs7CisJCX0KKwl9CisKKyNpZiAxCQkJCS8qIE1FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09ONiAqLworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgKDEgPDwgNykgfCAoMSA8PCA2KSB8ICgxIDw8IDQpKTsKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsIDApOworCisJUkVBRF9WUkVHKERPU19TV19SRVNFVDApOworCVJFQURfVlJFRyhET1NfU1dfUkVTRVQwKTsKKwlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMCk7CisKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsICgxIDw8IDcpIHwgKDEgPDwgNikgfCAoMSA8PCA0KSk7CisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAwKTsKKworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgKDEgPDwgOSkgfCAoMSA8PCA4KSk7CisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAwKTsKKworCVJFQURfVlJFRyhET1NfU1dfUkVTRVQwKTsKKwlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMCk7CisJUkVBRF9WUkVHKERPU19TV19SRVNFVDApOworCisjZWxzZQorCVdSSVRFX1JFU0VUX1JFRyhSRVNFVDBfUkVHSVNURVIsCisJCQkJICAgUkVTRVRfSVFJRENUIHwgUkVTRVRfTUMgfCBSRVNFVF9WTERfUEFSVCk7CisJUkVBRF9SRVNFVF9SRUcoUkVTRVQwX1JFR0lTVEVSKTsKKwlXUklURV9SRVNFVF9SRUcoUkVTRVQwX1JFR0lTVEVSLAorCQkJCSAgIFJFU0VUX0lRSURDVCB8IFJFU0VUX01DIHwgUkVTRVRfVkxEX1BBUlQpOworCisJV1JJVEVfUkVTRVRfUkVHKFJFU0VUMl9SRUdJU1RFUiwgUkVTRVRfUElDX0RDIHwgUkVTRVRfREJMSyk7CisjZW5kaWYKKworCVdSSVRFX1ZSRUcoUE9XRVJfQ1RMX1ZMRCwKKwkJCSAgIFJFQURfVlJFRyhQT1dFUl9DVExfVkxEKSB8CisJCQkgICAoMCA8PCAxMCkgfCAoMSA8PCA5KSB8ICgxIDw8IDYpKTsKKworCS8qIGRpc2FibGUgUFNDQUxFIGZvciBoYXJkd2FyZSBzaGFyaW5nICovCisJV1JJVEVfVlJFRyhQU0NBTEVfQ1RSTCwgMCk7CisKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfMCwgMCk7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzEsIGJ1Zl9vZmZzZXQpOworCWlmICghdGVlX2VuYWJsZWQoKSkKKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0csIG1jX2RtYV9oYW5kbGUpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF83LCAwKTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfOCwgMCk7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzksIDApOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9OLCAwKTsKKworI2lmZGVmIFNVUFBPUlRfQkFEX01BQ1JPX0JMT0NLX1JFRFVOREFOQ1kKKwlpZiAoYmFkX2Jsb2NrX3NjYWxlID4gMTI4KQorCQliYWRfYmxvY2tfc2NhbGUgPSAxMjg7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0EsIGJhZF9ibG9ja19zY2FsZSk7CisjZW5kaWYKKworCWVycm9yX3JlY292ZXJ5X21vZGVfdXNlID0KKwkJKGVycm9yX3JlY292ZXJ5X21vZGUgIT0KKwkJIDApID8gZXJyb3JfcmVjb3ZlcnlfbW9kZSA6IGVycm9yX3JlY292ZXJ5X21vZGVfaW47CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0YsCisJCQkgICAoUkVBRF9WUkVHKEFWX1NDUkFUQ0hfRikgJiAweGZmZmZmZmMzKSB8CisJCQkgICAoUkVBRF9WUkVHKEFWX1NDUkFUQ0hfRikgJiAweGZmZmZmZjQzKSB8CisJCQkgICAoKGVycm9yX3JlY292ZXJ5X21vZGVfdXNlICYgMHgxKSA8PCA0KSk7CisJaWYgKGRlY19jb250cm9sICYgREVDX0NPTlRST0xfRkxBR19ESVNBQkxFX0ZBU1RfUE9DKQorCQlTRVRfVlJFR19NQVNLKEFWX1NDUkFUQ0hfRiwgMSA8PCA3KTsKKwkvKiBjbGVhciBtYWlsYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoQVNTSVNUX01CT1gxX0NMUl9SRUcsIDEpOworCisJLyogZW5hYmxlIG1haWxib3ggaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfTUFTSywgMSk7CisKKwlTRVRfVlJFR19NQVNLKE1ERUNfUElDX0RDX0NUUkwsIDEgPDwgMTcpOworCWlmICh1Y29kZV90eXBlID09IFVDT0RFX0lQX09OTFlfUEFSQU0pCisJCVNFVF9WUkVHX01BU0soQVZfU0NSQVRDSF9GLCAxIDw8IDYpOworCWVsc2UKKwkJQ0xFQVJfVlJFR19NQVNLKEFWX1NDUkFUQ0hfRiwgMSA8PCA2KTsKKworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9JLCAodTMyKShzZWlfZGF0YV9idWZmZXJfcGh5cyAtIGJ1Zl9vZmZzZXQpKTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfSiwgMCk7CisJLyogI2lmIE1FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09OOCAqLworCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9NOCkgJiYgIWlzX21lc29uX210dmRfY3B1KCkpIHsKKwkJLyogcHJfaW5mbygidmgyNjQgbWVzb244IHByb3QgaW5pdFxuIik7ICovCisJCVdSSVRFX1ZSRUcoTURFQ19QSUNfRENfVEhSRVNILCAweDQwNDAzOGFhKTsKKwl9CisJLyogI2VuZGlmICovCit9CisKK3N0YXRpYyBpbnQgdmgyNjRfbG9jYWxfaW5pdCh2b2lkKQoreworCWludCBpLCByZXQ7CisJdTMyIHNpemU7CisJdW5zaWduZWQgbG9uZyBidWZfc3RhcnQ7CisJdmgyNjRfcmF0aW8gPSB2aDI2NF9hbXN0cmVhbV9kZWNfaW5mby5yYXRpbzsKKwkvKiB2aDI2NF9yYXRpbyA9IDB4MTAwOyAqLworCisJdmgyNjRfcm90YXRpb24gPSAoKCh1bnNpZ25lZCBsb25nKSB2aDI2NF9hbXN0cmVhbV9kZWNfaW5mby5wYXJhbSkKKwkJCQk+PiAxNikgJiAweGZmZmY7CisKKwlmcmFtZV9wcm9nID0gMDsKKwlmcmFtZV93aWR0aCA9IHZoMjY0X2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoOworCWZyYW1lX2hlaWdodCA9IHZoMjY0X2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodDsKKwlmcmFtZV9kdXIgPSB2aDI2NF9hbXN0cmVhbV9kZWNfaW5mby5yYXRlOworCXB0c19vdXRzaWRlID0gKCh1bnNpZ25lZCBsb25nKSB2aDI2NF9hbXN0cmVhbV9kZWNfaW5mby5wYXJhbSkgJiAweDAxOworCXN5bmNfb3V0c2lkZSA9ICgodW5zaWduZWQgbG9uZykgdmgyNjRfYW1zdHJlYW1fZGVjX2luZm8ucGFyYW0gJiAweDAyKQorCQkJPj4gMTsKKwl1c2VfaWRyX2ZyYW1lcmF0ZSA9ICgodW5zaWduZWQgbG9uZykgdmgyNjRfYW1zdHJlYW1fZGVjX2luZm8ucGFyYW0KKwkJCQkmIDB4MDQpID4+IDI7CisJbWF4X3JlZmVyX2J1ZiA9ICEoKCh1bnNpZ25lZCBsb25nKSB2aDI2NF9hbXN0cmVhbV9kZWNfaW5mby5wYXJhbQorCQkJCSYgMHgxMCkgPj4gNCk7CisJaWYgKCF2aDI2NF9yZXNldCkgeworCQlpZiAobW1fYmxrX2hhbmRsZSkgeworCQkJZGVjb2Rlcl9ibW11X2JveF9mcmVlKG1tX2Jsa19oYW5kbGUpOworCQkJbW1fYmxrX2hhbmRsZSA9IE5VTEw7CisJCX0KKworCQltbV9ibGtfaGFuZGxlID0gZGVjb2Rlcl9ibW11X2JveF9hbGxvY19ib3goCisJCQlEUklWRVJfTkFNRSwKKwkJCTAsCisJCQlNQVhfQkxLX0JVRkZFUlMsCisJCQk0ICsgUEFHRV9TSElGVCwKKwkJCUNPREVDX01NX0ZMQUdTX0NNQV9DTEVBUiB8CisJCQlDT0RFQ19NTV9GTEFHU19GT1JfVkRFQ09ERVIgfAorCQkJdHZwX2ZsYWcpOworCX0KKwlwcl9pbmZvCisJKCJIMjY0IHN5c2luZm86ICVkeCVkIGR1cmF0aW9uPSVkLCBwdHNfb3V0c2lkZT0lZCBcbiIsCisJIGZyYW1lX3dpZHRoLCBmcmFtZV9oZWlnaHQsIGZyYW1lX2R1ciwgcHRzX291dHNpZGUpOworCXByX2RlYnVnKCJzeW5jX291dHNpZGU9JWQsIHVzZV9pZHJfZnJhbWVyYXRlPSVkXG4iLAorCSBzeW5jX291dHNpZGUsIHVzZV9pZHJfZnJhbWVyYXRlKTsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYVFZCQikKKwkJc2l6ZSA9IFZfQlVGX0FERFJfT0ZGU0VUX05FVzsKKwllbHNlCisJCXNpemUgPSBWX0JVRl9BRERSX09GRlNFVDsKKworCXJldCA9IGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeShtbV9ibGtfaGFuZGxlLCAwLAorCQlzaXplLCBEUklWRVJfTkFNRSwgJmJ1Zl9zdGFydCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlidWZfb2Zmc2V0ID0gYnVmX3N0YXJ0IC0gREVGX0JVRl9TVEFSVF9BRERSOworCisJaWYgKCh1bnNpZ25lZCBsb25nKSB2aDI2NF9hbXN0cmVhbV9kZWNfaW5mby5wYXJhbSAmIDB4MDgpCisJCXVjb2RlX3R5cGUgPSBVQ09ERV9JUF9PTkxZX1BBUkFNOworCWVsc2UKKwkJdWNvZGVfdHlwZSA9IDA7CisKKwlpZiAoKHVuc2lnbmVkIGxvbmcpIHZoMjY0X2Ftc3RyZWFtX2RlY19pbmZvLnBhcmFtICYgMHgyMCkKKwkJZXJyb3JfcmVjb3ZlcnlfbW9kZV9pbiA9IDE7CisJZWxzZQorCQllcnJvcl9yZWNvdmVyeV9tb2RlX2luID0gMzsKKworCWlmICghdmgyNjRfcnVubmluZykgeworCQlsYXN0X21iX3dpZHRoID0gMDsKKwkJbGFzdF9tYl9oZWlnaHQgPSAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBWRl9CVUZfTlVNOyBpKyspCisJCXZmYnVmX3VzZVtpXSA9IDA7CisKKwlJTklUX0tGSUZPKGRpc3BsYXlfcSk7CisJSU5JVF9LRklGTyhkZWxheV9kaXNwbGF5X3EpOworCUlOSVRfS0ZJRk8ocmVjeWNsZV9xKTsKKwlJTklUX0tGSUZPKG5ld2ZyYW1lX3EpOworCisJZm9yIChpID0gMDsgaSA8IFZGX1BPT0xfU0laRTsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqdmYgPSAmdmZwb29sW2ldOworCisJCXZmcG9vbFtpXS5pbmRleCA9IFZGX0JVRl9OVU07CisJCXZmcG9vbFtpXS5idWZXaWR0aCA9IDE5MjA7CisJCWtmaWZvX3B1dCgmbmV3ZnJhbWVfcSwgdmYpOworCX0KKworI2lmZGVmIERST1BfQl9GUkFNRV9GT1JfMTA4MFBfNTBfNjBGUFMKKwlsYXN0X2ludGVybGFjZWQgPSAxOworI2VuZGlmCisJaDI2NF9maXJzdF9wdHNfcmVhZHkgPSAwOworCWgyNjRfZmlyc3RfdmFsaWRfcHRzX3JlYWR5ID0gZmFsc2U7CisJaDI2NHB0czEgPSAwOworCWgyNjRwdHMyID0gMDsKKwloMjY0X3B0c19jb3VudCA9IDA7CisJZHVyYXRpb25fZnJvbV9wdHNfZG9uZSA9IDA7CisJdmgyNjRfZXJyb3JfY291bnQgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9EKTsKKworCXBfbGFzdF92ZiA9IE5VTEw7CisJY2hlY2tfcHRzX2Rpc2NvbnRpbnVlID0gZmFsc2U7CisJbGFzdF9wdHMgPSAwOworCXdhaXRfYnVmZmVyX2NvdW50ZXIgPSAwOworCXZoMjY0X25vX2Rpc3BfY291bnQgPSAwOworCWZhdGFsX2Vycm9yX2ZsYWcgPSAwOworCWhpZ2hfYmFuZHdpZHRoID0gMDsKKwl2aDI2NF9zdHJlYW1fc3dpdGNoaW5nX3N0YXRlID0gU1dJVENISU5HX1NUQVRFX09GRjsKKyNpZmRlZiBERUJVR19QVFMKKwlwdHNfbWlzc2VkID0gMDsKKwlwdHNfaGl0ID0gMDsKKyNlbmRpZgorCXB0c19kaXNjb250aW51ZSA9IGZhbHNlOworCW5vX2lkcl9lcnJvcl9jb3VudCA9IDA7CisKKwl2aDI2NF9yZXNldF91c2VyZGF0YV9maWZvKHZkZWNfaDI2NCwgMSk7CisJaDI2NF9yZXNldF9xb3NfbWdyKCk7CisKKwlpZiAoZW5hYmxlX3N3aXRjaF9mZW5zZSkgeworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmZW5zZV9idWZmZXJfc3BlYyk7IGkrKykgeworCQkJc3RydWN0IGJ1ZmZlcl9zcGVjX3MgKnMgPSAmZmVuc2VfYnVmZmVyX3NwZWNbaV07CisJCQlzLT5hbGxvY19jb3VudCA9IDMgKiBTWl8xTSAvIFBBR0VfU0laRTsKKwkJCXJldCA9IGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeShtbV9ibGtfaGFuZGxlLAorCQkJCUZFTlNFX0JVRkZFUl9JRFgoaSksCisJCQkJMyAqIFNaXzFNLCBEUklWRVJfTkFNRSwgJnMtPnBoeV9hZGRyKTsKKworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlmYXRhbF9lcnJvcl9mbGFnID0KKwkJCQlERUNPREVSX0ZBVEFMX0VSUk9SX05PX01FTTsKKwkJCQl2aDI2NF9ydW5uaW5nID0gMDsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQkJcy0+eV9jYW52YXNfaW5kZXggPSAyICogaTsKKwkJCXMtPnVfY2FudmFzX2luZGV4ID0gMiAqIGkgKyAxOworCQkJcy0+dl9jYW52YXNfaW5kZXggPSAyICogaSArIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzMzIgdmgyNjRfaW5pdCh2b2lkKQoreworCWludCByZXQgPSAwOworCWludCB0cmlja21vZGVfZmZmYiA9IDA7CisJaW50IGZpcm13YXJlbG9hZGVkID0gMDsKKworCS8qIHByX2luZm8oIlxudmgyNjRfaW5pdFxuIik7ICovCisJdGltZXJfc2V0dXAoJnJlY3ljbGVfdGltZXIsIHZoMjY0X3B1dF90aW1lcl9mdW5jLCAwKTsKKworCXN0YXQgfD0gU1RBVF9USU1FUl9JTklUOworCisJdmgyNjRfcnVubmluZyA9IDA7LyogaW5pdCBoZXJlIHRvIHJlc2V0IGxhc3RfbWJfd2lkdGgmbGFzdF9tYl9oZWlnaHQgKi8KKwl2aDI2NF9lb3MgPSAwOworCWR1cmF0aW9uX29uX2NvcnJlY3RpbmcgPSAwOworCWZpcnN0X3B0cyA9IDA7CisJZmlyc3RfcHRzNjQgPSAwOworCWZpcnN0X29mZnNldCA9IDA7CisJZmlyc3RfcHRzX2NhY2hlZCA9IGZhbHNlOworCWZpeGVkX2ZyYW1lX3JhdGVfY2hlY2tfY291bnQgPSAwOworCWZyX2hpbnRfc3RhdHVzID0gVkRFQ19OT19ORUVEX0hJTlQ7CisJc2F2ZWRfcmVzb2x1dGlvbiA9IDA7CisJaXBvbmx5X2Vhcmx5X21vZGUgPSAwOworCXNhdmVkX2lkY19sZXZlbCA9IDA7CisKKwlmcmFtZV9jb3VudCA9IDA7CisJbWVtc2V0KCZzX3ZmcmFtZV9xb3MsIDAsIHNpemVvZihzX3ZmcmFtZV9xb3MpKTsKKwkvKmluaXQgdmRlYyBzdGF0dXMqLworCXJldCA9IHZoMjY0X3ZkZWNfaW5mb19pbml0KCk7CisJaWYgKDAgIT0gcmV0KQorCQlyZXR1cm4gLXJldDsKKworCXJldCA9IHZoMjY0X2xvY2FsX2luaXQoKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlxdWVyeV92aWRlb19zdGF0dXMoMCwgJnRyaWNrbW9kZV9mZmZiKTsKKworCWFtdmRlY19lbmFibGUoKTsKKwlpZiAoIWZpcm13YXJlbG9hZGVkICYmIHRlZV9lbmFibGVkKCkpIHsKKwkJcmV0ID0gYW12ZGVjX2xvYWRtY19leChWRk9STUFUX0gyNjQsIE5VTEwsIE5VTEwpOworCQlpZiAocmV0IDwgMCkgeworCQkJYW12ZGVjX2Rpc2FibGUoKTsKKwkJCXByX2VycigiSDI2NDogdGhlICVzIGZ3IGxvYWRpbmcgZmFpbGVkLCBlcnI6ICV4XG4iLAorCQkJCXRlZV9lbmFibGVkKCkgPyAiVEVFIiA6ICJsb2NhbCIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfSBlbHNlIHsKKwkvKiAtLSB1Y29kZSBsb2FkaW5nIChhbXJpc2MgYW5kIHN3YXAgY29kZSkgKi8KKwltY19jcHVfYWRkciA9CisJCWRtYV9hbGxvY19jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksIE1DX1RPVEFMX1NJWkUsCisJCQkJJm1jX2RtYV9oYW5kbGUsIEdGUF9LRVJORUwpOworCWlmICghbWNfY3B1X2FkZHIpIHsKKwkJYW12ZGVjX2Rpc2FibGUoKTsKKwkJZGVsX3RpbWVyX3N5bmMoJnJlY3ljbGVfdGltZXIpOworCQlwcl9lcnIoInZoMjY0X2luaXQ6IENhbiBub3QgYWxsb2NhdGUgbWMgbWVtb3J5LlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXByX2RlYnVnKCIyNjQgdWNvZGUgc3dhcCBhcmVhOiBwaHlhZGRyICVwLCBjcHUgdmFkZHIgJXBcbiIsCisJCSh2b2lkICopbWNfZG1hX2hhbmRsZSwgbWNfY3B1X2FkZHIpOworCWlmIChkZWJ1Z2Zpcm13YXJlKSB7CisJCWludCByMCwgcjEsIHIyLCByMywgcjQsIHI1OworCQljaGFyIGZpcm13YXJlbmFtZVszMl07CisKKwkJcHJfZGVidWcoInN0YXJ0IGxvYWQgZGVidWcgJWQgZmlybXdhcmUgLi4uXG4iLCBkZWJ1Z2Zpcm13YXJlKTsKKworCQlzbnByaW50ZihmaXJtd2FyZW5hbWUsIDMyLCAiJXMlZCIsICJ2aDI2NF9tYyIsIGRlYnVnZmlybXdhcmUpOworCQlyMCA9IGFtdmRlY19sb2FkbWNfZXgoVkZPUk1BVF9IMjY0LCBmaXJtd2FyZW5hbWUsIE5VTEwpOworCisjZGVmaW5lIERFQlVHR0VUX0ZXKHQsIG5hbWUsIGJ1Ziwgc2l6ZSwgcmV0KVwKKwkJZG8ge1wKKwkJCXNucHJpbnRmKGZpcm13YXJlbmFtZSwgMzIsICIlcyVkIiwgbmFtZSxcCisJCQkJZGVidWdmaXJtd2FyZSk7XAorCQkJcmV0ID0gZ2V0X2RlY29kZXJfZmlybXdhcmVfZGF0YSh0LFwKKwkJCQlmaXJtd2FyZW5hbWUsIGJ1Ziwgc2l6ZSk7XAorCQl9IHdoaWxlICgwKQorCQkvKm1lbWNweSgodTggKikgbWNfY3B1X2FkZHIgKyBNQ19PRkZTRVRfSEVBREVSLCB2aDI2NF9oZWFkZXJfbWMsCisJCSAqTUNfU1dBUF9TSVpFKTsKKwkJICovCisJCURFQlVHR0VUX0ZXKFZGT1JNQVRfSDI2NCwgInZoMjY0X2hlYWRlcl9tYyIsCisJCQkodTggKikgbWNfY3B1X2FkZHIgKyBNQ19PRkZTRVRfSEVBREVSLAorCQkJTUNfU1dBUF9TSVpFLCByMSk7CisKKwkJLyptZW1jcHkoKHU4ICopIG1jX2NwdV9hZGRyICsgTUNfT0ZGU0VUX0RBVEEsIHZoMjY0X2RhdGFfbWMsCisJCSAqTUNfU1dBUF9TSVpFKTsKKwkJICovCisJCURFQlVHR0VUX0ZXKFZGT1JNQVRfSDI2NCwgInZoMjY0X2RhdGFfbWMiLAorCQkJKHU4ICopIG1jX2NwdV9hZGRyICsgTUNfT0ZGU0VUX0RBVEEsIE1DX1NXQVBfU0laRSwgcjIpOworCQkvKm1lbWNweSgodTggKikgbWNfY3B1X2FkZHIgKyBNQ19PRkZTRVRfTU1DTywgdmgyNjRfbW1jb19tYywKKwkJICpNQ19TV0FQX1NJWkUpOworCQkgKi8KKwkJREVCVUdHRVRfRlcoVkZPUk1BVF9IMjY0LCAidmgyNjRfbW1jb19tYyIsCisJCQkodTggKikgbWNfY3B1X2FkZHIgKyBNQ19PRkZTRVRfTU1DTywgTUNfU1dBUF9TSVpFLCByMyk7CisJCS8qbWVtY3B5KCh1OCAqKSBtY19jcHVfYWRkciArIE1DX09GRlNFVF9MSVNULCB2aDI2NF9saXN0X21jLAorCQkgKk1DX1NXQVBfU0laRSk7CisJCSAqLworCQlERUJVR0dFVF9GVyhWRk9STUFUX0gyNjQsICJ2aDI2NF9saXN0X21jIiwKKwkJCSh1OCAqKSBtY19jcHVfYWRkciArIE1DX09GRlNFVF9MSVNULCBNQ19TV0FQX1NJWkUsIHI0KTsKKwkJLyptZW1jcHkoKHU4ICopIG1jX2NwdV9hZGRyICsgTUNfT0ZGU0VUX1NMSUNFLCB2aDI2NF9zbGljZV9tYywKKwkJICpNQ19TV0FQX1NJWkUpOworCQkgKi8KKwkJREVCVUdHRVRfRlcoVkZPUk1BVF9IMjY0LCAidmgyNjRfc2xpY2VfbWMiLAorCQkJKHU4ICopIG1jX2NwdV9hZGRyICsgTUNfT0ZGU0VUX1NMSUNFLCBNQ19TV0FQX1NJWkUsIHI1KTsKKworCQlpZiAocjAgPCAwIHx8IHIxIDwgMCB8fCByMiA8IDAgfHwgcjMgPCAwIHx8IHI0IDwgMCB8fCByNSA8IDApIHsKKwkJCXByX2VycigiMjY0IGxvYWQgZGVidWdmaXJtd2FyZSBlcnIgJWQsJWQsJWQsJWQsJWQsJWRcbiIsCisJCQlyMCwgcjEsIHIyLCByMywgcjQsIHI1KTsKKwkJCWFtdmRlY19kaXNhYmxlKCk7CisJCQlpZiAobWNfY3B1X2FkZHIpIHsKKwkJCQlkbWFfZnJlZV9jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJCU1DX1RPVEFMX1NJWkUsIG1jX2NwdV9hZGRyLAorCQkJCQltY19kbWFfaGFuZGxlKTsKKwkJCQltY19jcHVfYWRkciA9IE5VTEw7CisJCQl9CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCWZpcm13YXJlbG9hZGVkID0gMTsKKwl9IGVsc2UgeworCQlpbnQgcmV0ID0gLTE7CisJCWNoYXIgKmJ1ZiA9IHZtYWxsb2MoMHgxMDAwICogMTYpOworCisJCWlmIChJU19FUlJfT1JfTlVMTChidWYpKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJaWYgKGdldF9maXJtd2FyZV9kYXRhKFZJREVPX0RFQ19IMjY0LCBidWYpIDwgMCkgeworCQkJcHJfZXJyKCJnZXQgZmlybXdhcmUgZmFpbC4iKTsKKwkJCXZmcmVlKGJ1Zik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlyZXQgPSBhbXZkZWNfbG9hZG1jX2V4KFZGT1JNQVRfSDI2NCwgTlVMTCwgYnVmKTsKKwkJbWVtY3B5KCh1OCAqKSBtY19jcHVfYWRkciArIE1DX09GRlNFVF9IRUFERVIsCisJCQlidWYgKyAweDQwMDAsIE1DX1NXQVBfU0laRSk7CisJCW1lbWNweSgodTggKikgbWNfY3B1X2FkZHIgKyBNQ19PRkZTRVRfREFUQSwKKwkJCWJ1ZiArIDB4MjAwMCwgTUNfU1dBUF9TSVpFKTsKKwkJbWVtY3B5KCh1OCAqKSBtY19jcHVfYWRkciArIE1DX09GRlNFVF9NTUNPLAorCQkJYnVmICsgMHg2MDAwLCBNQ19TV0FQX1NJWkUpOworCQltZW1jcHkoKHU4ICopIG1jX2NwdV9hZGRyICsgTUNfT0ZGU0VUX0xJU1QsCisJCQlidWYgKyAweDMwMDAsIE1DX1NXQVBfU0laRSk7CisJCW1lbWNweSgodTggKikgbWNfY3B1X2FkZHIgKyBNQ19PRkZTRVRfU0xJQ0UsCisJCQlidWYgKyAweDUwMDAsIE1DX1NXQVBfU0laRSk7CisKKwkJdmZyZWUoYnVmKTsKKworCQlpZiAocmV0IDwgMCkgeworCQkJYW12ZGVjX2Rpc2FibGUoKTsKKwkJCWlmIChtY19jcHVfYWRkcikgeworCQkJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQkJTUNfVE9UQUxfU0laRSwgbWNfY3B1X2FkZHIsCisJCQkJCW1jX2RtYV9oYW5kbGUpOworCQkJCW1jX2NwdV9hZGRyID0gTlVMTDsKKwkJCX0KKwkJCXByX2VycigiSDI2NDogdGhlICVzIGZ3IGxvYWRpbmcgZmFpbGVkLCBlcnI6ICV4XG4iLAorCQkJCXRlZV9lbmFibGVkKCkgPyAiVEVFIiA6ICJsb2NhbCIsIHJldCk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfQorCX0KKworCXN0YXQgfD0gU1RBVF9NQ19MT0FEOworCisJLyogZW5hYmxlIEFNUklTQyBzaWRlIHByb3RvY29sICovCisJdmgyNjRfcHJvdF9pbml0KCk7CisKKyNpZmRlZiBIQU5ETEVfSDI2NF9JUlEKKwkvKlRPRE8gaXJxICovCisKKwlpZiAodmRlY19yZXF1ZXN0X2lycShWREVDX0lSUV8xLCB2aDI2NF9pc3IsCisJCQkidmgyNjQtaXJxIiwgKHZvaWQgKil2aDI2NF9kZWNfaWQpKSB7CisJCXByX2VycigidmgyNjQgaXJxIHJlZ2lzdGVyIGVycm9yLlxuIik7CisJCWFtdmRlY19kaXNhYmxlKCk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKyNlbmRpZgorCisJc3RhdCB8PSBTVEFUX0lTUl9SRUc7CisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19QT1NUX1BST0NFU1NfTUFOQUdFUgorCXZmX3Byb3ZpZGVyX2luaXQoJnZoMjY0X3ZmX3Byb3YsIFBST1ZJREVSX05BTUUsICZ2aDI2NF92Zl9wcm92aWRlcl9vcHMsCisJCQkJCSBOVUxMKTsKKwl2Zl9yZWdfcHJvdmlkZXIoJnZoMjY0X3ZmX3Byb3YpOworCXZmX25vdGlmeV9yZWNlaXZlcihQUk9WSURFUl9OQU1FLCBWRlJBTUVfRVZFTlRfUFJPVklERVJfU1RBUlQsIE5VTEwpOworI2Vsc2UKKwl2Zl9wcm92aWRlcl9pbml0KCZ2aDI2NF92Zl9wcm92LCBQUk9WSURFUl9OQU1FLCAmdmgyNjRfdmZfcHJvdmlkZXJfb3BzLAorCQkJCQkgTlVMTCk7CisJdmZfcmVnX3Byb3ZpZGVyKCZ2aDI2NF92Zl9wcm92KTsKKyNlbmRpZgorCisJaWYgKGZyYW1lX2R1ciAhPSAwKSB7CisJCWlmICghaXNfcmVzZXQpIHsKKwkJCXZmX25vdGlmeV9yZWNlaXZlcihQUk9WSURFUl9OQU1FLAorCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfRlJfSElOVCwKKwkJCQkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpZnJhbWVfZHVyKSk7CisJCQlmcl9oaW50X3N0YXR1cyA9IFZERUNfSElOVEVEOworCQl9CisJfSBlbHNlCisJCWZyX2hpbnRfc3RhdHVzID0gVkRFQ19ORUVEX0hJTlQ7CisKKwlzdGF0IHw9IFNUQVRfVkZfSE9PSzsKKworCXJlY3ljbGVfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBQVVRfSU5URVJWQUw7CisJYWRkX3RpbWVyKCZyZWN5Y2xlX3RpbWVyKTsKKworCXN0YXQgfD0gU1RBVF9USU1FUl9BUk07CisKKwl2aDI2NF9zdHJlYW1fc3dpdGNoaW5nX3N0YXRlID0gU1dJVENISU5HX1NUQVRFX09GRjsKKworCXN0YXQgfD0gU1RBVF9WREVDX1JVTjsKKwl3bWIoKTsJCQkvKiBFbnN1cmUgZmV0Y2hidWYgIGNvbnRlbnRzIHZpc2libGUgKi8KKworCS8qIC0tIHN0YXJ0IGRlY29kZXIgKi8KKwlhbXZkZWNfc3RhcnQoKTsKKworCWluaXRfdXNlcmRhdGFfZmlmbygpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmgyNjRfc3RvcChpbnQgbW9kZSkKK3sKKworCisJaWYgKHN0YXQgJiBTVEFUX1ZERUNfUlVOKSB7CisJCWFtdmRlY19zdG9wKCk7CisJCXN0YXQgJj0gflNUQVRfVkRFQ19SVU47CisJfQorCisJaWYgKHN0YXQgJiBTVEFUX0lTUl9SRUcpIHsKKwkJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfTUFTSywgMCk7CisJCS8qVE9ETyBpcnEgKi8KKworCQl2ZGVjX2ZyZWVfaXJxKFZERUNfSVJRXzEsICh2b2lkICopdmgyNjRfZGVjX2lkKTsKKworCQlzdGF0ICY9IH5TVEFUX0lTUl9SRUc7CisJfQorCisJaWYgKHN0YXQgJiBTVEFUX1RJTUVSX0FSTSkgeworCQlkZWxfdGltZXJfc3luYygmcmVjeWNsZV90aW1lcik7CisJCXN0YXQgJj0gflNUQVRfVElNRVJfQVJNOworCX0KKworCWlmIChzdGF0ICYgU1RBVF9WRl9IT09LKSB7CisJCWlmIChtb2RlID09IE1PREVfRlVMTCkgeworCQkJaWYgKGZyX2hpbnRfc3RhdHVzID09IFZERUNfSElOVEVEKQorCQkJCXZmX25vdGlmeV9yZWNlaXZlcihQUk9WSURFUl9OQU1FLAorCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfRlJfRU5EX0hJTlQsCisJCQkJCU5VTEwpOworCQkJZnJfaGludF9zdGF0dXMgPSBWREVDX05PX05FRURfSElOVDsKKwkJfQorCisJCXZmX3VucmVnX3Byb3ZpZGVyKCZ2aDI2NF92Zl9wcm92KTsKKwkJc3RhdCAmPSB+U1RBVF9WRl9IT09LOworCX0KKworCWlmIChzdGF0ICYgU1RBVF9NQ19MT0FEKSB7CisJCWlmIChtY19jcHVfYWRkciAhPSBOVUxMKSB7CisJCQlkbWFfZnJlZV9jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJCU1DX1RPVEFMX1NJWkUsIG1jX2NwdV9hZGRyLAorCQkJCQltY19kbWFfaGFuZGxlKTsKKwkJCW1jX2NwdV9hZGRyID0gTlVMTDsKKwkJfQorCX0KKwlpZiAoc2VpX2RhdGFfYnVmZmVyICE9IE5VTEwpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoCisJCQlhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQlVU0VSX0RBVEFfUlVORF9TSVpFLAorCQkJc2VpX2RhdGFfYnVmZmVyLAorCQkJc2VpX2RhdGFfYnVmZmVyX3BoeXMpOworCQlzZWlfZGF0YV9idWZmZXIgPSBOVUxMOworCQlzZWlfZGF0YV9idWZmZXJfcGh5cyA9IDA7CisJfQorCWFtdmRlY19kaXNhYmxlKCk7CisJaWYgKG1tX2Jsa19oYW5kbGUpIHsKKwkJZGVjb2Rlcl9ibW11X2JveF9mcmVlKG1tX2Jsa19oYW5kbGUpOworCQltbV9ibGtfaGFuZGxlID0gTlVMTDsKKwl9CisJbWVtc2V0KCZmZW5zZV9idWZmZXJfc3BlYywgMCwgc2l6ZW9mKGZlbnNlX2J1ZmZlcl9zcGVjKSk7CisJbWVtc2V0KCZidWZmZXJfc3BlYywgMCwgc2l6ZW9mKGJ1ZmZlcl9zcGVjKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHdhaXRfdmgyNjRfc2VhcmNoX2RvbmUodm9pZCkKK3sKKwl1MzIgdmxkX3JwID0gUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKTsKKwlpbnQgY291bnQgPSAwOworCWRvIHsKKwkJdXNsZWVwX3JhbmdlKDEwMCwgNTAwKTsKKwkJaWYgKHZsZF9ycCA9PSBSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApKQorCQkJYnJlYWs7CisJCWlmIChjb3VudCA+IDIwMDApIHsKKwkJCXByX2luZm8oIiVzLCB0aW1lb3V0ICBjb3VudCAlZCB2bGRfcnAgMHgleCBWTERfTUVNX1ZJRklGT19SUCAweCV4XG4iLAorCQkJCQlfX2Z1bmNfXywgY291bnQsIHZsZF9ycCwgUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSk7CisJCQlicmVhazsKKwkJfSBlbHNlCisJCQl2bGRfcnAgPSBSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApOworCQljb3VudCsrOworCX0gd2hpbGUgKDEpOworfQorCisKK3N0YXRpYyB2b2lkIGVycm9yX2RvX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCisJLyoKKwkgKiB3ZSBuZWVkIHRvIGxvY2sgdmgyNjRfc3RvcC92aDI2NF9pbml0LgorCSAqIGJlY2F1c2Ugd2Ugd2lsbCBjYWxsIGFtdmRlY19oMjY0X3JlbW92ZSBvbiB0aGlzIHN0ZXA7CisJICogdGhlbiB3ZSBtYXkgY2FsbCBtb3JlIHRoYW4gb25jZSBvbgorCSAqIGZyZWVfaXJxL2RlbHRpbWVyLy4uYW5kIHNvbWUgb3RoZXIuCisJICovCisJaWYgKGF0b21pY19yZWFkKCZ2aDI2NF9hY3RpdmUpKSB7CisJCWFtdmRlY19zdG9wKCk7CisJCWRvIHsKKwkJCW1zbGVlcCg1MCk7CisJCX0gd2hpbGUgKHZoMjY0X3N0cmVhbV9zd2l0Y2hpbmdfc3RhdGUgIT0gU1dJVENISU5HX1NUQVRFX09GRik7CisJCXdhaXRfdmgyNjRfc2VhcmNoX2RvbmUoKTsKKwkJdmgyNjRfcmVzZXQgID0gMTsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19QT1NUX1BST0NFU1NfTUFOQUdFUgorCQl2aDI2NF9wcG1ncl9yZXNldCgpOworI2Vsc2UKKwkJdmZfbGlnaHRfdW5yZWdfcHJvdmlkZXIoJnZoMjY0X3ZmX3Byb3YpOworCisJCXZoMjY0X2xvY2FsX2luaXQoKTsKKworCQl2Zl9yZWdfcHJvdmlkZXIoJnZoMjY0X3ZmX3Byb3YpOworI2VuZGlmCisJCXZoMjY0X3Byb3RfaW5pdCgpOworCQlhbXZkZWNfc3RhcnQoKTsKKwkJdmgyNjRfcmVzZXQgID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN0cmVhbV9zd2l0Y2hpbmdfZG9uZSh2b2lkKQoreworCWludCBzdGF0ZSA9IHZoMjY0X3N0cmVhbV9zd2l0Y2hpbmdfc3RhdGU7CisKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfNywgMCk7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzgsIDApOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF85LCAwKTsKKworCWlmIChzdGF0ZSA9PSBTV0lUQ0hJTkdfU1RBVEVfT05fQ01EMSkgeworCQlwcl9pbmZvKCJFbnRlciBzZXQgcGFyYW1ldGVyIGNtZDEgc3dpdGNoaW5nX3N0YXRlICV4LlxuIiwKKwkJCQkJdmgyNjRfc3RyZWFtX3N3aXRjaGluZ19zdGF0ZSk7CisJCXNjaGVkdWxlX3dvcmsoJnNldF9wYXJhbWV0ZXJfd29yayk7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKHN0YXRlID09IFNXSVRDSElOR19TVEFURV9PTl9DTUQxX1BFTkRJTkcpCisJCXJldHVybjsKKworCXZoMjY0X3N0cmVhbV9zd2l0Y2hpbmdfc3RhdGUgPSBTV0lUQ0hJTkdfU1RBVEVfT0ZGOworCisJd21iKCk7CQkJLyogRW5zdXJlIGZldGNoYnVmICBjb250ZW50cyB2aXNpYmxlICovCisKKwlpZiAoc3RhdGUgPT0gU1dJVENISU5HX1NUQVRFX09OX0NNRDMpCisJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8wLCAwKTsKKworCXByX2luZm8oIkxlYXZpbmcgc3dpdGNoaW5nIG1vZGUuXG4iKTsKK30KKworLyogY29uc3RydXQgYSBuZXcgZnJhbWUgYXMgYSBjb3B5IG9mIGxhc3QgZnJhbWUgc28gZnJhbWUgcmVjZWl2ZXIgY2FuCisgKiByZWxlYXNlIGFsbCBidWZmZXIgcmVzb3VyY2VzIHRvIGRlY29kZXIuCisgKi8KK3N0YXRpYyB2b2lkIHN0cmVhbV9zd2l0Y2hpbmdfZG8oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWludCBtYl90b3RhbF9udW0sIG1iX3dpZHRoX251bSwgbWJfaGVpZ2h0X251bSwgaSA9IDA7CisJc3RydWN0IHZmcmFtZV9zICp2ZiA9IE5VTEw7CisJdTMyIHlfaW5kZXgsIHVfaW5kZXgsIHNyY19pbmRleCwgZGVzX2luZGV4LCB5X2Rlc2luZGV4LCB1X2Rlc2luZGV4OworCXN0cnVjdCBjYW52YXNfcyBjc3ksIGNzdSwgY3lkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYm9vbCBkZWxheSA9IHRydWU7CisKKwlpZiAoIWF0b21pY19yZWFkKCZ2aDI2NF9hY3RpdmUpKQorCQlyZXR1cm47CisKKwlpZiAodmgyNjRfc3RyZWFtX3N3aXRjaGluZ19zdGF0ZSA9PSBTV0lUQ0hJTkdfU1RBVEVfT0ZGKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJlcGFyZV9sb2NrLCBmbGFncyk7CisKKwlibG9ja19kaXNwbGF5X3EgPSB0cnVlOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJlcGFyZV9sb2NrLCBmbGFncyk7CisKKwltYl90b3RhbF9udW0gPSBtYl90b3RhbDsKKwltYl93aWR0aF9udW0gPSBtYl93aWR0aDsKKwltYl9oZWlnaHRfbnVtID0gbWJfaGVpZ2h0OworCisJd2hpbGUgKGlzXzRrIHx8IGtmaWZvX2xlbigmZGVsYXlfZGlzcGxheV9xKSA+IDIpIHsKKwkJaWYgKGtmaWZvX2dldCgmZGVsYXlfZGlzcGxheV9xLCAmdmYpKSB7CisJCQlrZmlmb19wdXQoJmRpc3BsYXlfcSwKKwkJCQkoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQkJQVRSQUNFX0NPVU5URVIoTU9EVUxFX05BTUUsIHZmLT5wdHMpOworCQkJdmZfbm90aWZ5X3JlY2VpdmVyKFBST1ZJREVSX05BTUUsCisJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1ZGUkFNRV9SRUFEWSwgTlVMTCk7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfQorCisJaWYgKCFrZmlmb19nZXQoJmRlbGF5X2Rpc3BsYXlfcSwgJnZmKSkgeworCQl2ZiA9IHBfbGFzdF92ZjsKKwkJZGVsYXkgPSBmYWxzZTsKKwl9CisKKwl3aGlsZSAodmYpIHsKKwkJaW50IGJ1ZmZlcl9pbmRleDsKKworCQlidWZmZXJfaW5kZXggPSB2Zi0+aW5kZXggJiAweGZmOworCisJCS8qIGNvbnN0cnVjdCBhIGNsb25lIG9mIHRoZSBmcmFtZSBmcm9tIGxhc3QgZnJhbWUgKi8KKworI2lmIDAKKworCQlwcl9pbmZvKCJzcmMgeWFkZHJbMHgleF0gaW5kZXhbJWRdIHdpZHRoWyVkXSBoZWlndGhbJWRdXG4iLAorCQkJYnVmZmVyX3NwZWNbYnVmZmVyX2luZGV4XS55X2FkZHIsCisJCQlidWZmZXJfc3BlY1tidWZmZXJfaW5kZXhdLnlfY2FudmFzX2luZGV4LAorCQkJYnVmZmVyX3NwZWNbYnVmZmVyX2luZGV4XS55X2NhbnZhc193aWR0aCwKKwkJCWJ1ZmZlcl9zcGVjW2J1ZmZlcl9pbmRleF0ueV9jYW52YXNfaGVpZ2h0KTsKKworCQlwcl9pbmZvKCJzcmMgdWFkZHJbMHgleF0gaW5kZXhbJWRdIHdpZHRoWyVkXSBoZWlndGhbJWRdXG4iLAorCQkJYnVmZmVyX3NwZWNbYnVmZmVyX2luZGV4XS51X2FkZHIsCisJCQlidWZmZXJfc3BlY1tidWZmZXJfaW5kZXhdLnVfY2FudmFzX2luZGV4LAorCQkJYnVmZmVyX3NwZWNbYnVmZmVyX2luZGV4XS51X2NhbnZhc193aWR0aCwKKwkJCWJ1ZmZlcl9zcGVjW2J1ZmZlcl9pbmRleF0udV9jYW52YXNfaGVpZ2h0KTsKKyNlbmRpZgorCQlpZiAoRU5fU1dJVENIX0ZFTkNFKCkpIHsKKwkJCXlfaW5kZXggPSBidWZmZXJfc3BlY1tidWZmZXJfaW5kZXhdLnlfY2FudmFzX2luZGV4OworCQkJdV9pbmRleCA9IGJ1ZmZlcl9zcGVjW2J1ZmZlcl9pbmRleF0udV9jYW52YXNfaW5kZXg7CisKKwkJCWNhbnZhc19yZWFkKHlfaW5kZXgsICZjc3kpOworCQkJY2FudmFzX3JlYWQodV9pbmRleCwgJmNzdSk7CisKKwkJCWNvbmZpZ19jYXZfbHV0X2V4KGZlbnNlX2J1ZmZlcl9zcGVjW2ldLnlfY2FudmFzX2luZGV4LAorCQkJCWZlbnNlX2J1ZmZlcl9zcGVjW2ldLnBoeV9hZGRyLAorCQkJCW1iX3dpZHRoX251bSA8PCA0LCBtYl9oZWlnaHRfbnVtIDw8IDQsCisJCQkJQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJCUNBTlZBU19CTEtNT0RFX0xJTkVBUiwgMCwgVkRFQ18xKTsKKwkJCWNvbmZpZ19jYXZfbHV0X2V4KGZlbnNlX2J1ZmZlcl9zcGVjW2ldLnVfY2FudmFzX2luZGV4LAorCQkJCWZlbnNlX2J1ZmZlcl9zcGVjW2ldLnBoeV9hZGRyICsKKwkJCQkobWJfdG90YWxfbnVtIDw8IDgpLAorCQkJCW1iX3dpZHRoX251bSA8PCA0LCBtYl9oZWlnaHRfbnVtIDw8IDMsCisJCQkJQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJCUNBTlZBU19CTEtNT0RFX0xJTkVBUiwgMCwgVkRFQ18xKTsKKworCQkJeV9kZXNpbmRleCA9IGZlbnNlX2J1ZmZlcl9zcGVjW2ldLnlfY2FudmFzX2luZGV4OworCQkJdV9kZXNpbmRleCA9IGZlbnNlX2J1ZmZlcl9zcGVjW2ldLnVfY2FudmFzX2luZGV4OworCisJCQljYW52YXNfcmVhZCh5X2Rlc2luZGV4LCAmY3lkKTsKKworCQkJc3JjX2luZGV4ID0gKCh5X2luZGV4ICYgMHhmZikgfAorCQkJCSgodV9pbmRleCA8PCA4KSAmIDB4MDAwMGZmMDApKTsKKwkJCWRlc19pbmRleCA9ICgoeV9kZXNpbmRleCAmIDB4ZmYpIHwKKwkJCQkoKHVfZGVzaW5kZXggPDwgOCkgJiAweDAwMDBmZjAwKSk7CisKKwkJCWdlMmRfY2FudmFzX2R1cCgmY3N5LCAmY3N1LCAmY3lkLAorCQkJCUdFMkRfRk9STUFUX00yNF9OVjIxLAorCQkJCXNyY19pbmRleCwKKwkJCQlkZXNfaW5kZXgpOworCQl9CisJCXZmLT5tZW1faGFuZGxlID0gZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCW1tX2Jsa19oYW5kbGUsCisJCQlGRU5TRV9CVUZGRVJfSURYKGkpKTsKKwkJZmVuc2VfdmZbaV0gPSAqdmY7CisJCWZlbnNlX3ZmW2ldLmluZGV4ID0gLTE7CisKKwkJaWYgKEVOX1NXSVRDSF9GRU5DRSgpKQorCQkJZmVuc2VfdmZbaV0uY2FudmFzMEFkZHIgPQorCQkJCXNwZWMyY2FudmFzKCZmZW5zZV9idWZmZXJfc3BlY1tpXSk7CisJCWVsc2UKKwkJCWZlbnNlX3ZmW2ldLmZsYWcgfD0gVkZSQU1FX0ZMQUdfU1dJVENISU5HX0ZFTlNFOworCisJCS8qIHNlbmQgY2xvbmUgdG8gcmVjZWl2ZXIgKi8KKwkJa2ZpZm9fcHV0KCZkaXNwbGF5X3EsCisJCQkoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopJmZlbnNlX3ZmW2ldKTsKKwkJQVRSQUNFX0NPVU5URVIoTU9EVUxFX05BTUUsIGZlbnNlX3ZmW2ldLnB0cyk7CisJCS8qIGVhcmx5IHJlY3ljbGUgZnJhbWVzIGZvciBsYXN0IHNlc3Npb24gKi8KKwkJaWYgKGRlbGF5KQorCQkJdmgyNjRfdmZfcHV0KHZmLCBOVUxMKTsKKworCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoUFJPVklERVJfTkFNRSwKKwkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9WRlJBTUVfUkVBRFksIE5VTEwpOworCisJCWkrKzsKKworCQlpZiAoIWtmaWZvX2dldCgmZGVsYXlfZGlzcGxheV9xLCAmdmYpKQorCQkJYnJlYWs7CisJfQorCisJYmxvY2tfZGlzcGxheV9xID0gZmFsc2U7CisKKwlwcl9pbmZvKCJTd2l0Y2hpbmcgZmVuc2UgZnJhbWUgcG9zdFxuIik7Cit9CisKK3N0YXRpYyBpbnQgYW12ZGVjX2gyNjRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdmRlY19zICpwZGF0YSA9ICooc3RydWN0IHZkZWNfcyAqKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCW11dGV4X2xvY2soJnZoMjY0X211dGV4KTsKKworCWlmIChwZGF0YSA9PSBOVUxMKSB7CisJCXByX2luZm8oIlxuYW12ZGVjX2gyNjQgbWVtb3J5IHJlc291cmNlIHVuZGVmaW5lZC5cbiIpOworCQltdXRleF91bmxvY2soJnZoMjY0X211dGV4KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWNhbnZhc19tb2RlID0gcGRhdGEtPmNhbnZhc19tb2RlOworCXR2cF9mbGFnID0gdmRlY19zZWN1cmUocGRhdGEpID8gQ09ERUNfTU1fRkxBR1NfVFZQIDogMDsKKwlpZiAocGRhdGEtPnN5c19pbmZvKQorCQl2aDI2NF9hbXN0cmVhbV9kZWNfaW5mbyA9ICpwZGF0YS0+c3lzX2luZm87CisJaWYgKHNlaV9kYXRhX2J1ZmZlciA9PSBOVUxMKSB7CisJCXNlaV9kYXRhX2J1ZmZlciA9CisJCQlkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCVVTRVJfREFUQV9SVU5EX1NJWkUsCisJCQkJJnNlaV9kYXRhX2J1ZmZlcl9waHlzLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFzZWlfZGF0YV9idWZmZXIpIHsKKwkJCXByX2luZm8oIiVzOiBDYW4gbm90IGFsbG9jYXRlIHNlaV9kYXRhX2J1ZmZlclxuIiwKKwkJCQkgICBfX2Z1bmNfXyk7CisJCQltdXRleF91bmxvY2soJnZoMjY0X211dGV4KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCS8qIHByX2luZm8oImJ1ZmZlciAweCV4LCBwaHlzIDB4JXgsIHJlbWFwIDB4JXhcbiIsCisJCSAqICAgc2VpX2RhdGFfYnVmZmVyLCBzZWlfZGF0YV9idWZmZXJfcGh5cywKKwkJICogKHUzMilzZWlfZGF0YV9idWZmZXJfcmVtYXApOworCQkgKi8KKwl9CisJcGRhdGEtPmRlY19zdGF0dXMgPSB2aDI2NF9kZWNfc3RhdHVzOworCXBkYXRhLT5zZXRfdHJpY2ttb2RlID0gdmgyNjRfc2V0X3RyaWNrbW9kZTsKKwlwZGF0YS0+c2V0X2lzcmVzZXQgPSB2aDI2NF9zZXRfaXNyZXNldDsKKworCXBkYXRhLT51c2VyX2RhdGFfcmVhZCA9IHZoMjY0X3VzZXJfZGF0YV9yZWFkOworCXBkYXRhLT5yZXNldF91c2VyZGF0YV9maWZvID0gdmgyNjRfcmVzZXRfdXNlcmRhdGFfZmlmbzsKKwlwZGF0YS0+d2FrZXVwX3VzZXJkYXRhX3BvbGwgPSB2aDI2NF93YWtldXBfdXNlcmRhdGFfcG9sbDsKKworCWlzX3Jlc2V0ID0gMDsKKwljbGtfYWRqX2ZyYW1lX2NvdW50ID0gMDsKKwlpZiAodmgyNjRfaW5pdCgpIDwgMCkgeworCQlwcl9pbmZvKCJcbmFtdmRlY19oMjY0IGluaXQgZmFpbGVkLlxuIik7CisJCWtmcmVlKGd2cyk7CisJCWd2cyA9IE5VTEw7CisJCXBkYXRhLT5kZWNfc3RhdHVzID0gTlVMTDsKKwkJbXV0ZXhfdW5sb2NrKCZ2aDI2NF9tdXRleCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwl2ZGVjX2gyNjQgPSBwZGF0YTsKKwl2aDI2NF9jcmF0ZV91c2VyZGF0YV9tYW5hZ2VyKHNlaV9kYXRhX2J1ZmZlciwgVVNFUl9EQVRBX1NJWkUpOworCXZoMjY0X3Jlc2V0X3VzZXJkYXRhX2ZpZm8odmRlY19oMjY0LCAxKTsKKworI2lmZGVmIERVTVBfVVNFUl9EQVRBCisJdmgyNjRfaW5pdF91c2VyZGF0YV9kdW1wKCk7CisJdmgyNjRfcmVzZXRfdXNlcl9kYXRhX2J1ZigpOworI2VuZGlmCisKKwlJTklUX1dPUksoJmVycm9yX3dkX3dvcmssIGVycm9yX2RvX3dvcmspOworCUlOSVRfV09SSygmc3RyZWFtX3N3aXRjaGluZ193b3JrLCBzdHJlYW1fc3dpdGNoaW5nX2RvKTsKKwlJTklUX1dPUksoJnNldF9wYXJhbWV0ZXJfd29yaywgdmgyNjRfc2V0X3BhcmFtcyk7CisJSU5JVF9XT1JLKCZub3RpZnlfd29yaywgdmgyNjRfbm90aWZ5X3dvcmspOworCUlOSVRfV09SSygmc2V0X2Nsa193b3JrLCB2aDI2NF9zZXRfY2xrKTsKKwlJTklUX1dPUksoJnVzZXJkYXRhX3B1c2hfd29yaywgdXNlcmRhdGFfcHVzaF9kb193b3JrKTsKKwlJTklUX1dPUksoJnFvc193b3JrLCBxb3NfZG9fd29yayk7CisKKwlhdG9taWNfc2V0KCZ2aDI2NF9hY3RpdmUsIDEpOworCisJbXV0ZXhfdW5sb2NrKCZ2aDI2NF9tdXRleCk7CisJdmRlY19zZXRfdmZyYW1lX2NvbW0ocGRhdGEsIERSSVZFUl9OQU1FKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtdmRlY19oMjY0X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWF0b21pY19zZXQoJnZoMjY0X2FjdGl2ZSwgMCk7CisJY2FuY2VsX3dvcmtfc3luYygmc2V0X3BhcmFtZXRlcl93b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZlcnJvcl93ZF93b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZzdHJlYW1fc3dpdGNoaW5nX3dvcmspOworCWNhbmNlbF93b3JrX3N5bmMoJm5vdGlmeV93b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZ1c2VyZGF0YV9wdXNoX3dvcmspOworCWNhbmNlbF93b3JrX3N5bmMoJnFvc193b3JrKTsKKworCisJdmgyNjRfc3RvcChNT0RFX0ZVTEwpOworCXdhaXRfdmgyNjRfc2VhcmNoX2RvbmUoKTsKKwl2ZGVjX3NvdXJjZV9jaGFuZ2VkKFZGT1JNQVRfSDI2NCwgMCwgMCwgMCk7CisjaWZkZWYgRFVNUF9VU0VSX0RBVEEKKwl2aDI2NF9kdW1wX3VzZXJkYXRhKCk7CisjZW5kaWYKKwl2aDI2NF9kZXN0cm95X3VzZXJkYXRhX21hbmFnZXIoKTsKKwlhdG9taWNfc2V0KCZ2aDI2NF9hY3RpdmUsIDApOworI2lmZGVmIERFQlVHX1BUUworCXByX2luZm8KKwkoInB0cyBtaXNzZWQgJWxkLCBwdHMgaGl0ICVsZCwgcHRzX291dHNpZGUgJWQsIGR1cmF0aW9uICVkLCAiLAorCSBwdHNfbWlzc2VkLCBwdHNfaGl0LCBwdHNfb3V0c2lkZSwgZnJhbWVfZHVyKTsKKwlwcl9pbmZvKCJzeW5jX291dHNpZGUgJWQsIHVzZV9pZHJfZnJhbWVyYXRlICVkXG4iLAorCQkJc3luY19vdXRzaWRlLCB1c2VfaWRyX2ZyYW1lcmF0ZSk7CisjZW5kaWYKKwlrZnJlZShndnMpOworCWd2cyA9IE5VTEw7CisJY2FuY2VsX3dvcmtfc3luYygmc2V0X2Nsa193b3JrKTsKKwltdXRleF91bmxvY2soJnZoMjY0X211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFtdmRlY19oMjY0X2RyaXZlciA9IHsKKwkucHJvYmUgPSBhbXZkZWNfaDI2NF9wcm9iZSwKKwkucmVtb3ZlID0gYW12ZGVjX2gyNjRfcmVtb3ZlLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kID0gYW12ZGVjX3N1c3BlbmQsCisJLnJlc3VtZSA9IGFtdmRlY19yZXN1bWUsCisjZW5kaWYKKwkuZHJpdmVyID0geworCQkubmFtZSA9IERSSVZFUl9OQU1FLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY29kZWNfcHJvZmlsZV90IGFtdmRlY19oMjY0X3Byb2ZpbGUgPSB7CisJLm5hbWUgPSAiaDI2NCIsCisJLnByb2ZpbGUgPSAiIgorfTsKKworCitzdGF0aWMgc3RydWN0IG1jb25maWcgaDI2NF9jb25maWdzW10gPSB7CisJTUNfUFUzMigic3RhdCIsICZzdGF0KSwKKwlNQ19QVTMyKCJlcnJvcl9yZWNvdmVyeV9tb2RlIiwgJmVycm9yX3JlY292ZXJ5X21vZGUpLAorCU1DX1BVMzIoInN5bmNfb3V0c2lkZSIsICZzeW5jX291dHNpZGUpLAorCU1DX1BVMzIoImRlY19jb250cm9sIiwgJmRlY19jb250cm9sKSwKKwlNQ19QVTMyKCJmYXRhbF9lcnJvcl9yZXNldCIsICZmYXRhbF9lcnJvcl9yZXNldCksCisJTUNfUFUzMigibWF4X3JlZmVyX2J1ZiIsICZtYXhfcmVmZXJfYnVmKSwKKwlNQ19QVTMyKCJ1Y29kZV90eXBlIiwgJnVjb2RlX3R5cGUpLAorCU1DX1BVMzIoImRlYnVnZmlybXdhcmUiLCAmZGVidWdmaXJtd2FyZSksCisJTUNfUFUzMigiZml4ZWRfZnJhbWVfcmF0ZV9mbGFnIiwgJmZpeGVkX2ZyYW1lX3JhdGVfZmxhZyksCisJTUNfUFUzMigiZGVjb2Rlcl9kZWJ1Z19mbGFnIiwgJmRlY29kZXJfZGVidWdfZmxhZyksCisJTUNfUFUzMigiZHBiX3NpemVfYWRqIiwgJmRwYl9zaXplX2FkaiksCisJTUNfUFUzMigiZGVjb2Rlcl9mb3JjZV9yZXNldCIsICZkZWNvZGVyX2ZvcmNlX3Jlc2V0KSwKKwlNQ19QVTMyKCJub19pZHJfZXJyb3JfbWF4IiwgJm5vX2lkcl9lcnJvcl9tYXgpLAorCU1DX1BVMzIoImVuYWJsZV9zd2l0Y2hfZmVuc2UiLCAmZW5hYmxlX3N3aXRjaF9mZW5zZSksCit9Oworc3RhdGljIHN0cnVjdCBtY29uZmlnX25vZGUgaDI2NF9ub2RlOworCisKK3N0YXRpYyBpbnQgX19pbml0IGFtdmRlY19oMjY0X2RyaXZlcl9pbml0X21vZHVsZSh2b2lkKQoreworCXByX2RlYnVnKCJhbXZkZWNfaDI2NCBtb2R1bGUgaW5pdFxuIik7CisKKwlnZTJkX3ZpZGVvaDI2NHRhc2tfaW5pdCgpOworCisJaWYgKHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYW12ZGVjX2gyNjRfZHJpdmVyKSkgeworCQlwcl9lcnIoImZhaWxlZCB0byByZWdpc3RlciBhbXZkZWNfaDI2NCBkcml2ZXJcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hUVkJCCisJCSYmIChjb2RlY19tbV9nZXRfdG90YWxfc2l6ZSgpID4gODAgKiBTWl8xTSkgJiYKKwkJZ2V0X2NwdV9tYWpvcl9pZCgpICE9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNUQpIHsKKwkJYW12ZGVjX2gyNjRfcHJvZmlsZS5wcm9maWxlID0gIjRrIjsKKwl9CisJdmNvZGVjX3Byb2ZpbGVfcmVnaXN0ZXIoJmFtdmRlY19oMjY0X3Byb2ZpbGUpOworCUlOSVRfUkVHX05PREVfQ09ORklHUygibWVkaWEuZGVjb2RlciIsICZoMjY0X25vZGUsCisJCSJoMjY0IiwgaDI2NF9jb25maWdzLCBDT05GSUdfRk9SX1JXKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFtdmRlY19oMjY0X2RyaXZlcl9yZW1vdmVfbW9kdWxlKHZvaWQpCit7CisJcHJfZGVidWcoImFtdmRlY19oMjY0IG1vZHVsZSByZW1vdmUuXG4iKTsKKworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhbXZkZWNfaDI2NF9kcml2ZXIpOworCisJZ2UyZF92aWRlb2gyNjR0YXNrX3JlbGVhc2UoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK21vZHVsZV9wYXJhbShzdGF0LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3RhdCwgIlxuIGFtdmRlY19oMjY0IHN0YXRcbiIpOworbW9kdWxlX3BhcmFtKGVycm9yX3JlY292ZXJ5X21vZGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhlcnJvcl9yZWNvdmVyeV9tb2RlLCAiXG4gYW12ZGVjX2gyNjQgZXJyb3JfcmVjb3ZlcnlfbW9kZVxuIik7Cittb2R1bGVfcGFyYW0oc3luY19vdXRzaWRlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3luY19vdXRzaWRlLCAiXG4gYW12ZGVjX2gyNjQgc3luY19vdXRzaWRlXG4iKTsKK21vZHVsZV9wYXJhbShkZWNfY29udHJvbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlY19jb250cm9sLCAiXG4gYW12ZGVjX2gyNjQgZGVjb2RlciBjb250cm9sXG4iKTsKK21vZHVsZV9wYXJhbShmcmFtZV9jb3VudCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZyYW1lX2NvdW50LAorCQkiXG4gYW12ZGVjX2gyNjQgZGVjb2RlZCB0b3RhbCBjb3VudFxuIik7Cittb2R1bGVfcGFyYW0oZmF0YWxfZXJyb3JfcmVzZXQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmYXRhbF9lcnJvcl9yZXNldCwKKwkJIlxuIGFtdmRlY19oMjY0IGRlY29kZXIgcmVzZXQgd2hlbiBmYXRhbCBlcnJvciBoYXBwZW5zXG4iKTsKK21vZHVsZV9wYXJhbShtYXhfcmVmZXJfYnVmLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X3JlZmVyX2J1ZiwKKwkJIlxuIGFtdmRlY19oMjY0IGRlYyBidWZmZXJpbmcgb3Igbm90IGZvciByZWZlcmVuY2UgZnJhbWVcbiIpOworbW9kdWxlX3BhcmFtKHVjb2RlX3R5cGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh1Y29kZV90eXBlLAorCQkiXG4gYW12ZGVjX2gyNjQgZGVjIGJ1ZmZlcmluZyBvciBub3QgZm9yIHJlZmVyZW5jZSBmcmFtZVxuIik7Cittb2R1bGVfcGFyYW0oZGVidWdmaXJtd2FyZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnZmlybXdhcmUsICJcbiBhbXZkZWNfaDI2NCBkZWJ1ZyBsb2FkIGZpcm13YXJlXG4iKTsKK21vZHVsZV9wYXJhbShmaXhlZF9mcmFtZV9yYXRlX2ZsYWcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmaXhlZF9mcmFtZV9yYXRlX2ZsYWcsCisJCQkJICJcbiBhbXZkZWNfaDI2NCBmaXhlZF9mcmFtZV9yYXRlX2ZsYWdcbiIpOworbW9kdWxlX3BhcmFtKGRlY29kZXJfZGVidWdfZmxhZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlY29kZXJfZGVidWdfZmxhZywKKwkJCQkgIlxuIGFtdmRlY19oMjY0IGRlY29kZXJfZGVidWdfZmxhZ1xuIik7CisKK21vZHVsZV9wYXJhbShkcGJfc2l6ZV9hZGosIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkcGJfc2l6ZV9hZGosCisJCQkJICJcbiBhbXZkZWNfaDI2NCBkcGJfc2l6ZV9hZGpcbiIpOworCisKK21vZHVsZV9wYXJhbShkZWNvZGVyX2ZvcmNlX3Jlc2V0LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVjb2Rlcl9mb3JjZV9yZXNldCwKKwkJIlxuIGFtdmRlY19oMjY0IGRlY29kZXIgZm9yY2UgcmVzZXRcbiIpOworbW9kdWxlX3BhcmFtKG5vX2lkcl9lcnJvcl9tYXgsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhub19pZHJfZXJyb3JfbWF4LAorCQkiXG4gcHJpbnQgbm9faWRyX2Vycm9yX21heFxuIik7Cittb2R1bGVfcGFyYW0oZW5hYmxlX3N3aXRjaF9mZW5zZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZV9zd2l0Y2hfZmVuc2UsCisJCSJcbiBlbmFibGUgc3dpdGNoIGZlbnNlXG4iKTsKKworI2lmZGVmIFNVUFBPUlRfQkFEX01BQ1JPX0JMT0NLX1JFRFVOREFOQ1kKK21vZHVsZV9wYXJhbShiYWRfYmxvY2tfc2NhbGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhiYWRfYmxvY2tfc2NhbGUsCisJCQkJIlxuIHByaW50IGJhZF9ibG9ja19zY2FsZVxuIik7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKGVuYWJsZV91c2VyZGF0YV9kZWJ1ZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZV91c2VyZGF0YV9kZWJ1ZywKKwkJIlxuIGVuYWJsZV91c2VyZGF0YV9kZWJ1Z1xuIik7CisKKworbW9kdWxlX2luaXQoYW12ZGVjX2gyNjRfZHJpdmVyX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGFtdmRlY19oMjY0X2RyaXZlcl9yZW1vdmVfbW9kdWxlKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTUxPR0lDIEgyNjQgVmlkZW8gRGVjb2RlciBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkNoZW4gWmhhbmcgPGNoZW4uemhhbmdAYW1sb2dpYy5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvaDI2NC92aDI2NC5oIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL2gyNjQvdmgyNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzhlNGFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL2gyNjQvdmgyNjQuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL21lZGlhL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvaDI2NC92aDI2NC5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgVkgyNjRfSAorI2RlZmluZSBWSDI2NF9ICisKK2V4dGVybiBpbnQgcXVlcnlfdmlkZW9fc3RhdHVzKGludCB0eXBlLCBpbnQgKnZhbHVlKTsKKworLyogZXh0ZXJuIHMzMiB2aDI2NF9pbml0KHZvaWQpOyAqLworCitleHRlcm4gczMyIHZoMjY0X3JlbGVhc2Uodm9pZCk7CisKKyNlbmRpZiAvKiBWTVBFRzRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL2gyNjQvdmgyNjRfbXZjLmMgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvaDI2NC92aDI2NF9tdmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODI3ZTM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL2gyNjQvdmgyNjRfbXZjLmMKQEAgLTAsMCArMSwxOTE4IEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL2FtcG9ydHMvdmgyNjRtdmMuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy9hbXN0cmVhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZnJhbWVfc3luYy9wdHNzZXJ2Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jYW52YXMvY2FudmFzLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3Byb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3JlY2VpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy92Zm9ybWF0Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy92ZGVjX3JlZy5oPgorI2luY2x1ZGUgIi4uLy4uLy4uL3N0cmVhbV9pbnB1dC9hbXBvcnRzL2FtcG9ydHNfcHJpdi5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL3ZkZWMuaCIKKyNpbmNsdWRlICIuLi91dGlscy9hbXZkZWMuaCIKKyNpbmNsdWRlICIuLi91dGlscy9kZWNvZGVyX21tdV9ib3guaCIKKyNpbmNsdWRlICIuLi91dGlscy9kZWNvZGVyX2JtbXVfYm94LmgiCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jb2RlY19tbS9jb2RlY19tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29uZmlncy5oPgorI2luY2x1ZGUgIi4uL3V0aWxzL2Zpcm13YXJlLmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvY29uZmlnX3BhcnNlci5oIgorI2luY2x1ZGUgIi4uLy4uLy4uL2NvbW1vbi9jaGlwcy9kZWNvZGVyX2NwdV92ZXJfaW5mby5oIgorCisjZGVmaW5lIFRJTUVfVEFTS19QUklOVF9FTkFCTEUgIDB4MTAwCisjZGVmaW5lIFBVVF9QUklOVF9FTkFCTEUgICAgMHgyMDAKKworI2RlZmluZSBEUklWRVJfTkFNRSAiYW12ZGVjX2gyNjRtdmMiCisjZGVmaW5lIE1PRFVMRV9OQU1FICJhbXZkZWNfaDI2NG12YyIKKworI2RlZmluZSBIQU5ETEVfaDI2NG12Y19JUlEKKworI2RlZmluZSBERUJVR19QVFMKKyNkZWZpbmUgREVCVUdfU0tJUAorCisjZGVmaW5lIFBVVF9JTlRFUlZBTCAgICAgICAgKEhaLzEwMCkKKworI2RlZmluZSBTVEFUX1RJTUVSX0lOSVQgICAgIDB4MDEKKyNkZWZpbmUgU1RBVF9NQ19MT0FEICAgICAgICAweDAyCisjZGVmaW5lIFNUQVRfSVNSX1JFRyAgICAgICAgMHgwNAorI2RlZmluZSBTVEFUX1ZGX0hPT0sgICAgICAgIDB4MDgKKyNkZWZpbmUgU1RBVF9USU1FUl9BUk0gICAgICAweDEwCisjZGVmaW5lIFNUQVRfVkRFQ19SVU4gICAgICAgMHgyMAorCisjZGVmaW5lIERST1BQSU5HX1RIUkVBRF9IT0xEICAgIDQKKyNkZWZpbmUgRFJPUFBJTkdfRklSU1RfV0FJVCAgICAgMTYKKyNkZWZpbmUgRElTUExBWV9JTlZBTElEX1BPUyAgICAtNjU1MzYKKworI2RlZmluZSBJTklUX0RST1BfRlJBTUVfQ05UICAgIDgKKworc3RhdGljIGludCB2aDI2NG12Y192Zl9zdGF0ZXMoc3RydWN0IHZmcmFtZV9zdGF0ZXMgKnN0YXRlcywgdm9pZCAqKTsKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZoMjY0bXZjX3ZmX3BlZWsodm9pZCAqKTsKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZoMjY0bXZjX3ZmX2dldCh2b2lkICopOworc3RhdGljIHZvaWQgdmgyNjRtdmNfdmZfcHV0KHN0cnVjdCB2ZnJhbWVfcyAqLCB2b2lkICopOworc3RhdGljIGludCB2aDI2NG12Y19ldmVudF9jYihpbnQgdHlwZSwgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKKworc3RhdGljIHZvaWQgdmgyNjRtdmNfcHJvdF9pbml0KHZvaWQpOworc3RhdGljIGludCB2aDI2NG12Y19sb2NhbF9pbml0KHZvaWQpOworc3RhdGljIHZvaWQgdmgyNjRtdmNfcHV0X3RpbWVyX2Z1bmMoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKTsKKworc3RhdGljIGNvbnN0IGNoYXIgdmgyNjRtdmNfZGVjX2lkW10gPSAidmgyNjRtdmMtZGV2IjsKKworI2RlZmluZSBQUk9WSURFUl9OQU1FICAgImRlY29kZXIuaDI2NG12YyIKKworc3RhdGljIHN0cnVjdCB2ZGVjX2luZm8gKmd2czsKK3N0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3QgYWxsb2Nfd29yazsKK3N0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc2V0X2Nsa193b3JrOworCitzdGF0aWMgREVGSU5FX01VVEVYKHZoMjY0X212Y19tdXRleCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmZyYW1lX29wZXJhdGlvbnNfcyB2aDI2NG12Y192Zl9wcm92aWRlciA9IHsKKwkucGVlayA9IHZoMjY0bXZjX3ZmX3BlZWssCisJLmdldCA9IHZoMjY0bXZjX3ZmX2dldCwKKwkucHV0ID0gdmgyNjRtdmNfdmZfcHV0LAorCS5ldmVudF9jYiA9IHZoMjY0bXZjX2V2ZW50X2NiLAorCS52Zl9zdGF0ZXMgPSB2aDI2NG12Y192Zl9zdGF0ZXMsCit9OworCitzdGF0aWMgc3RydWN0IHZmcmFtZV9wcm92aWRlcl9zIHZoMjY0bXZjX3ZmX3Byb3Y7CisKK3N0YXRpYyBzdHJ1Y3QgdmRlY19zICp2ZGVjID0gTlVMTDsKK3N0YXRpYyB1MzIgZnJhbWVfd2lkdGgsIGZyYW1lX2hlaWdodCwgZnJhbWVfZHVyOworc3RhdGljIHUzMiBzYXZlZF9yZXNvbHV0aW9uOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHJlY3ljbGVfdGltZXI7CitzdGF0aWMgdTMyIHN0YXQ7CitzdGF0aWMgdTMyIHB0c19vdXRzaWRlOworc3RhdGljIHUzMiBzeW5jX291dHNpZGU7CitzdGF0aWMgdTMyIHZoMjY0bXZjX3JhdGlvOworc3RhdGljIHUzMiBoMjY0bXZjX2FyOworc3RhdGljIHUzMiBub19kcm9wcGluZ19jbnQ7CitzdGF0aWMgczMyIGluaXRfZHJvcF9jbnQ7CitzcGlubG9ja190IG12Y19ycF9sb2NrOworCisjaWZkZWYgREVCVUdfU0tJUAorc3RhdGljIHVuc2lnbmVkIGxvbmcgdmlld190b3RhbCwgdmlld19kcm9wcGVkOworI2VuZGlmCisKKyNpZmRlZiBERUJVR19QVFMKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHB0c19taXNzZWQsIHB0c19oaXQ7CisjZW5kaWYKKworc3RhdGljIGF0b21pY190IHZoMjY0bXZjX2FjdGl2ZSA9IEFUT01JQ19JTklUKDApOworc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBlcnJvcl93ZF93b3JrOworCitzdGF0aWMgc3RydWN0IGRlY19zeXNpbmZvIHZoMjY0bXZjX2Ftc3RyZWFtX2RlY19pbmZvOworc3RhdGljIGRtYV9hZGRyX3QgbWNfZG1hX2hhbmRsZTsKK3N0YXRpYyB2b2lkICptY19jcHVfYWRkcjsKKworc3RhdGljIERFRklORV9TUElOTE9DSyhsb2NrKTsKKworc3RhdGljIGludCB2aDI2NG12Y19zdG9wKHZvaWQpOworc3RhdGljIHMzMiB2aDI2NG12Y19pbml0KHZvaWQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIG5ldworICoqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyogYml0WzM6MF0gY29tbWFuZCA6ICovCisvKiAwIC0gY29tbWFuZCBmaW5pc2hlZCAqLworLyogKERBVEEwIC0ge2xldmVsX2lkY19tbWNvLCBtYXhfcmVmZXJlbmNlX2ZyYW1lX251bSwgd2lkdGgsIGhlaWdodH0gKi8KKy8qIDEgLSBhbGxvYyB2aWV3XzAgZGlzcGxheV9idWZmZXIgYW5kIHJlZmVyZW5jZV9kYXRhX2FyZWEgKi8KKy8qIDIgLSBhbGxvYyB2aWV3XzEgZGlzcGxheV9idWZmZXIgYW5kIHJlZmVyZW5jZV9kYXRhX2FyZWEgKi8KKyNkZWZpbmUgTUFJTEJPWF9DT01NQU5EICAgICAgICAgQVZfU0NSQVRDSF8wCisjZGVmaW5lIE1BSUxCT1hfREFUQV8wICAgICAgICAgIEFWX1NDUkFUQ0hfMQorI2RlZmluZSBNQUlMQk9YX0RBVEFfMSAgICAgICAgICBBVl9TQ1JBVENIXzIKKyNkZWZpbmUgTUFJTEJPWF9EQVRBXzIgICAgICAgICAgQVZfU0NSQVRDSF8zCisjZGVmaW5lIENBTlZBU19TVEFSVCAgICAgICAgICAgIEFWX1NDUkFUQ0hfNgorI2RlZmluZSBCVUZGRVJfUkVDWUNMRSAgICAgICAgICBBVl9TQ1JBVENIXzcKKyNkZWZpbmUgRFJPUF9DT05UUk9MICAgICAgICAgICAgQVZfU0NSQVRDSF84CisjZGVmaW5lIFBJQ1RVUkVfQ09VTlQgICAgICAgICAgIEFWX1NDUkFUQ0hfOQorI2RlZmluZSBERUNPREVfU1RBVFVTICAgICAgICAgICBBVl9TQ1JBVENIX0EKKyNkZWZpbmUgU1BTX1NUQVRVUyAgICAgICAgICAgICAgQVZfU0NSQVRDSF9CCisjZGVmaW5lIFBQU19TVEFUVVMgICAgICAgICAgICAgIEFWX1NDUkFUQ0hfQworI2RlZmluZSBTSU1fUkVTRVJWX0QgICAgICAgICAgICBBVl9TQ1JBVENIX0QKKyNkZWZpbmUgV09SS1NQQUNFX1NUQVJUICAgICAgICAgQVZfU0NSQVRDSF9FCisjZGVmaW5lIFNJTV9SRVNFUlZfRiAgICAgICAgICAgIEFWX1NDUkFUQ0hfRgorI2RlZmluZSBERUNPREVfRVJST1JfQ05UICAgICAgICBBVl9TQ1JBVENIX0cKKyNkZWZpbmUgQ1VSUkVOVF9VQ09ERSAgICAgICAgICAgQVZfU0NSQVRDSF9ICisjZGVmaW5lIENVUlJFTlRfU1BTX1BQUyAgICAgICAgIEFWX1NDUkFUQ0hfSS8qIGJpdFsxNTo5XS1TUFMsIGJpdFs4OjBdLVBQUyAqLworI2RlZmluZSBERUNPREVfU0tJUF9QSUNUVVJFICAgICBBVl9TQ1JBVENIX0oKKyNkZWZpbmUgVUNPREVfU1RBUlRfQUREUiAgICAgICAgQVZfU0NSQVRDSF9LCisjZGVmaW5lIFNJTV9SRVNFUlZfTCAgICAgICAgICAgIEFWX1NDUkFUQ0hfTAorI2RlZmluZSBSRUZfU1RBUlRfVklFV18wICAgICAgICBBVl9TQ1JBVENIX00KKyNkZWZpbmUgUkVGX1NUQVJUX1ZJRVdfMSAgICAgICAgQVZfU0NSQVRDSF9OCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE1haWxib3ggY29tbWFuZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBDTURfRklOSVNIRUQgICAgICAgICAgICAgICAwCisjZGVmaW5lIENNRF9BTExPQ19WSUVXXzAgICAgICAgICAgIDEKKyNkZWZpbmUgQ01EX0FMTE9DX1ZJRVdfMSAgICAgICAgICAgMgorI2RlZmluZSBDTURfRlJBTUVfRElTUExBWSAgICAgICAgICAzCisjZGVmaW5lIENNRF9GQVRBTF9FUlJPUiAgICAgICAgICAgIDQKKworI2RlZmluZSBDQU5WQVNfSU5ERVhfU1RBUlQgICAgICAgMHg3OAorLyogL0FNVkRFQ19IMjY0TVZDX0NBTlZBU19JTkRFWCAqLworCisjZGVmaW5lIE1DX1RPVEFMX1NJWkUgICAgICAgICgyOCpTWl8xSykKKyNkZWZpbmUgTUNfU1dBUF9TSVpFICAgICAgICAgKDQqU1pfMUspCisKK3Vuc2lnbmVkIGludCBERUNPREVfQlVGRkVSX1NUQVJUID0gMHgwMDIwMDAwMDsKK3Vuc2lnbmVkIGludCBERUNPREVfQlVGRkVSX0VORCA9IDB4MDUwMDAwMDA7CisKKy8qICNkZWZpbmUgRElTUExBWV9CVUZGRVJfTlVNICAgICAgICAgNCAqLworc3RhdGljIHVuc2lnbmVkIGludCBkeW5hbWljX2J1Zl9udW1fbWFyZ2luID0gODsKKworI2RlZmluZSBERUNPREVfQlVGRkVSX05VTV9NQVggICAgMTYKKyNkZWZpbmUgTUFYX0JNTVVfQlVGRkVSX05VTQkoREVDT0RFX0JVRkZFUl9OVU1fTUFYICsgZHluYW1pY19idWZfbnVtX21hcmdpbikKKyNkZWZpbmUgVE9UQUxfQk1NVV9CVUZGX05VTSAgICAgKE1BWF9CTU1VX0JVRkZFUl9OVU0gKiAyICsgMykKKyNkZWZpbmUgVkZfQlVGRkVSX0lEWChuKSAoMiAgKyBuKQorCisjZGVmaW5lIERFQ09ERVJfV09SS19TUEFDRV9TSVpFIDB4YTAwMDAKKworCitzdGF0aWMgdW5zaWduZWQgaW50IEFOQ19DQU5WQVNfQUREUjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW5kZXg7CitzdGF0aWMgdW5zaWduZWQgbG9uZyByZWZfc3RhcnRfYWRkclsyXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X2RlY19mcmFtZV9idWZmZXJpbmdbMl07CitzdGF0aWMgdW5zaWduZWQgaW50IHRvdGFsX2RlY19mcmFtZV9idWZmZXJpbmdbMl07CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZHBiX3NpemUsIHJlZl9zaXplOworCitzdGF0aWMgaW50IGRpc3BsYXlfYnVmZl9pZDsKK3N0YXRpYyBpbnQgZGlzcGxheV92aWV3X2lkOworc3RhdGljIGludCBkaXNwbGF5X1BPQzsKK3N0YXRpYyBpbnQgc3RyZWFtX29mZnNldDsKKworI2RlZmluZSB2aWRlb19kb21haW5fYWRkcihhZHIpIChhZHImMHg3ZmZmZmZmZikKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdvcmtfc3BhY2VfYWRyOworCitzdHJ1Y3QgYnVmZmVyX3NwZWNfcyB7CisJdW5zaWduZWQgaW50IHlfYWRkcjsKKwl1bnNpZ25lZCBpbnQgdV9hZGRyOworCXVuc2lnbmVkIGludCB2X2FkZHI7CisKKwlpbnQgeV9jYW52YXNfaW5kZXg7CisJaW50IHVfY2FudmFzX2luZGV4OworCWludCB2X2NhbnZhc19pbmRleDsKKworCXN0cnVjdCBwYWdlICphbGxvY19wYWdlczsKKwl1bnNpZ25lZCBsb25nIHBoeV9hZGRyOworCWludCBhbGxvY19jb3VudDsKK307CisvKgorc3RhdGljIHN0cnVjdCBidWZmZXJfc3BlY19zIGJ1ZmZlcl9zcGVjMFtNQVhfQk1NVV9CVUZGRVJfTlVNXTsKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX3NwZWNfcyBidWZmZXJfc3BlYzFbTUFYX0JNTVVfQlVGRkVSX05VTV07CisqLworc3RhdGljIHN0cnVjdCBidWZmZXJfc3BlY19zICpidWZmZXJfc3BlYzA7CitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9zcGVjX3MgKmJ1ZmZlcl9zcGVjMTsKK3N0YXRpYyB2b2lkICptbV9ibGtfaGFuZGxlOworCisvKgorICogICAgZGJnX21vZGU6CisgKiAgICBiaXQgMDogMSwgcHJpbnQgZGVidWcgaW5mb3JtYXRpb24KKyAqICAgIGJpdCA0OiAxLCByZWN5Y2xlIGJ1ZmZlciB3aXRob3V0IGRpc3BsYXlpbmc7CisgKiAgICBiaXQgNTogMSwgYnVmZmVyIHNpbmdsZSBmcmFtZSBzdGVwICwgc2V0IGRiZ19jbWQgdG8gMSB0byBzdGVwCisgKgorICovCitzdGF0aWMgaW50IGRiZ19tb2RlOworc3RhdGljIGludCBkYmdfY21kOworc3RhdGljIGludCB2aWV3X21vZGUgPQorCTM7CS8qIDAsIGxlZnQ7IDEgLHJpZ2h0IDsgMiwgbGVmdDwtPnJpZ2h0IDMsIHJpZ2h0PC0+bGVmdCAqLworc3RhdGljIGludCBkcm9wX3JhdGUgPSAyOworc3RhdGljIGludCBkcm9wX3RocmVhZF9ob2xkOworLyoqLworCitzdHJ1Y3QgbXZjX2J1Zl9zIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHZmcmFtZV9zIHZmcmFtZTsKKwlpbnQgZGlzcGxheV9QT0M7CisJaW50IHZpZXcwX2J1ZmZfaWQ7CisJaW50IHZpZXcxX2J1ZmZfaWQ7CisJaW50IHZpZXcwX2Ryb3A7CisJaW50IHZpZXcxX2Ryb3A7CisJaW50IHN0cmVhbV9vZmZzZXQ7CisJdW5zaWduZWQgaW50IHB0czsKK30gLyptdmNfYnVmX3QgKi87CisKKyNkZWZpbmUgc3BlYzJjYW52YXMoeCkgIFwKKwkoKCh4KS0+dl9jYW52YXNfaW5kZXggPDwgMTYpIHwgXAorCSAoKHgpLT51X2NhbnZhc19pbmRleCA8PCA4KSAgfCBcCisJICgoeCktPnlfY2FudmFzX2luZGV4IDw8IDApKQorCisjZGVmaW5lIHRvX212Y2J1Zih2ZikgICBcCisJY29udGFpbmVyX29mKHZmLCBzdHJ1Y3QgbXZjX2J1Zl9zLCB2ZnJhbWUpCisKK3N0YXRpYyBpbnQgdmZfYnVmX2luaXRfZmxhZzsKKworc3RhdGljIHZvaWQgaW5pdF92Zl9idWYodm9pZCkKK3sKKworCXZmX2J1Zl9pbml0X2ZsYWcgPSAxOworfQorCitzdGF0aWMgdm9pZCB1bmluaXRfdmZfYnVmKHZvaWQpCit7CisKK30KKworLyogI2RlZmluZSBRVUVVRV9TVVBQT1JUICovCisKK3N0cnVjdCBtdmNfaW5mb19zIHsKKwlpbnQgdmlldzBfYnVmX2lkOworCWludCB2aWV3MV9idWZfaWQ7CisJaW50IHZpZXcwX2Ryb3A7CisJaW50IHZpZXcxX2Ryb3A7CisJaW50IGRpc3BsYXlfcG9zOworCWludCB1c2VkOworCWludCBzbG90OworCXVuc2lnbmVkIGludCBzdHJlYW1fb2Zmc2V0OworfTsKKworI2RlZmluZSBWRl9QT09MX1NJWkUgICAgICAgIDIwCitzdGF0aWMgc3RydWN0IHZmcmFtZV9zIHZmcG9vbFtWRl9QT09MX1NJWkVdOworc3RhdGljIHN0cnVjdCBtdmNfaW5mb19zIHZmcG9vbF9pZHhbVkZfUE9PTF9TSVpFXTsKK3N0YXRpYyBzMzIgdmlldzBfdmZidWZfdXNlW0RFQ09ERV9CVUZGRVJfTlVNX01BWF07CitzdGF0aWMgczMyIHZpZXcxX3ZmYnVmX3VzZVtERUNPREVfQlVGRkVSX05VTV9NQVhdOworCitzdGF0aWMgczMyIGZpbGxfcHRyLCBnZXRfcHRyLCBwdXR0aW5nX3B0ciwgcHV0X3B0cjsKK3N0YXRpYyBzMzIgZGlydHlfZnJhbWVfbnVtOworc3RhdGljIHMzMiBlbmFibGVfcmVjeWNsZTsKKworc3RhdGljIHMzMiBpbml0X2Ryb3BfZnJhbWVfaWRbSU5JVF9EUk9QX0ZSQU1FX0NOVF07CisjZGVmaW5lIElOQ1BUUihwKSBwdHJfYXRvbWljX3dyYXBfaW5jKCZwKQorc3RhdGljIGlubGluZSB2b2lkIHB0cl9hdG9taWNfd3JhcF9pbmModTMyICpwdHIpCit7CisJdTMyIGkgPSAqcHRyOworCisJaSsrOworCisJaWYgKGkgPj0gVkZfUE9PTF9TSVpFKQorCQlpID0gMDsKKworCSpwdHIgPSBpOworfQorCitzdGF0aWMgdm9pZCBzZXRfZnJhbWVfaW5mbyhzdHJ1Y3QgdmZyYW1lX3MgKnZmKQoreworCXVuc2lnbmVkIGludCBhciA9IDA7CisKKwl2Zi0+d2lkdGggPSBmcmFtZV93aWR0aDsKKwl2Zi0+aGVpZ2h0ID0gZnJhbWVfaGVpZ2h0OworCXZmLT5kdXJhdGlvbiA9IGZyYW1lX2R1cjsKKwl2Zi0+ZHVyYXRpb25fcHVsbGRvd24gPSAwOworCisJaWYgKHZoMjY0bXZjX3JhdGlvID09IDApIHsKKwkJLyogYWx3YXlzIHN0cmV0Y2ggdG8gMTY6OSAqLworCQl2Zi0+cmF0aW9fY29udHJvbCB8PSAoMHg5MCA8PAorCQkJCURJU1BfUkFUSU9fQVNQRUNUX1JBVElPX0JJVCk7CisJCXZmLT5zYXJfaGVpZ2h0ID0gMTsKKwkJdmYtPnNhcl93aWR0aCA9IDE7CisJfSBlbHNlIHsKKwkJLyogaDI2NG12Y19hciA9ICgoZmxvYXQpZnJhbWVfaGVpZ2h0L2ZyYW1lX3dpZHRoKQorCQkgKmN1c3RvbWVyX3JhdGlvOworCQkgKi8KKwkJc3dpdGNoIChoMjY0bXZjX2FyKSB7CisJCWNhc2UgMToKKwkJCWFyID0gMHgzZmY7CisJCQl2Zi0+c2FyX2hlaWdodCA9IDE7CisJCQl2Zi0+c2FyX3dpZHRoID0gMTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlhciA9IDB4M2ZmOworCQkJdmYtPnNhcl9oZWlnaHQgPSAxMTsKKwkJCXZmLT5zYXJfd2lkdGggPSAxMjsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlhciA9IDB4M2ZmOworCQkJdmYtPnNhcl9oZWlnaHQgPSAxMTsKKwkJCXZmLT5zYXJfd2lkdGggPSAxMDsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlhciA9IDB4M2ZmOworCQkJdmYtPnNhcl9oZWlnaHQgPSAxMTsKKwkJCXZmLT5zYXJfd2lkdGggPSAxNjsKKwkJCWJyZWFrOworCQljYXNlIDU6CisJCQlhciA9IDB4M2ZmOworCQkJdmYtPnNhcl9oZWlnaHQgPSAzMzsKKwkJCXZmLT5zYXJfd2lkdGggPSA0MDsKKwkJCWJyZWFrOworCQljYXNlIDY6CisJCQlhciA9IDB4M2ZmOworCQkJdmYtPnNhcl9oZWlnaHQgPSAxMTsKKwkJCXZmLT5zYXJfd2lkdGggPSAyNDsKKwkJCWJyZWFrOworCQljYXNlIDc6CisJCQlhciA9IDB4M2ZmOworCQkJdmYtPnNhcl9oZWlnaHQgPSAxMTsKKwkJCXZmLT5zYXJfd2lkdGggPSAyMDsKKwkJCWJyZWFrOworCQljYXNlIDg6CisJCQlhciA9IDB4M2ZmOworCQkJdmYtPnNhcl9oZWlnaHQgPSAxMTsKKwkJCXZmLT5zYXJfd2lkdGggPSAzMjsKKwkJCWJyZWFrOworCQljYXNlIDk6CisJCQlhciA9IDB4M2ZmOworCQkJdmYtPnNhcl9oZWlnaHQgPSAzMzsKKwkJCXZmLT5zYXJfd2lkdGggPSA4MDsKKwkJCWJyZWFrOworCQljYXNlIDEwOgorCQkJYXIgPSAweDNmZjsKKwkJCXZmLT5zYXJfaGVpZ2h0ID0gMTE7CisJCQl2Zi0+c2FyX3dpZHRoID0gMTg7CisJCQlicmVhazsKKwkJY2FzZSAxMToKKwkJCWFyID0gMHgzZmY7CisJCQl2Zi0+c2FyX2hlaWdodCA9IDExOworCQkJdmYtPnNhcl93aWR0aCA9IDE1OworCQkJYnJlYWs7CisJCWNhc2UgMTI6CisJCQlhciA9IDB4M2ZmOworCQkJdmYtPnNhcl9oZWlnaHQgPSAzMzsKKwkJCXZmLT5zYXJfd2lkdGggPSA2NDsKKwkJCWJyZWFrOworCQljYXNlIDEzOgorCQkJYXIgPSAweDNmZjsKKwkJCXZmLT5zYXJfaGVpZ2h0ID0gOTk7CisJCQl2Zi0+c2FyX3dpZHRoID0gMTYwOworCQkJYnJlYWs7CisJCWNhc2UgMTQ6CisJCQlhciA9IDB4M2ZmOworCQkJdmYtPnNhcl9oZWlnaHQgPSAzOworCQkJdmYtPnNhcl93aWR0aCA9IDQ7CisJCQlicmVhazsKKwkJY2FzZSAxNToKKwkJCWFyID0gMHgzZmY7CisJCQl2Zi0+c2FyX2hlaWdodCA9IDI7CisJCQl2Zi0+c2FyX3dpZHRoID0gMzsKKwkJCWJyZWFrOworCQljYXNlIDE2OgorCQkJYXIgPSAweDNmZjsKKwkJCXZmLT5zYXJfaGVpZ2h0ID0gMTsKKwkJCXZmLT5zYXJfd2lkdGggPSAyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlhciA9IDB4M2ZmOworCQkJdmYtPnNhcl9oZWlnaHQgPSAxOworCQkJdmYtPnNhcl93aWR0aCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwlhciA9ICBtaW5fdCh1MzIsIGFyLCBESVNQX1JBVElPX0FTUEVDVF9SQVRJT19NQVgpOworCisJdmYtPnJhdGlvX2NvbnRyb2wgPSAoYXIgPDwgRElTUF9SQVRJT19BU1BFQ1RfUkFUSU9fQklUKTsKK30KKworc3RhdGljIGludCB2aDI2NG12Y192Zl9zdGF0ZXMoc3RydWN0IHZmcmFtZV9zdGF0ZXMgKnN0YXRlcywgdm9pZCAqb3BfYXJnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCXN0YXRlcy0+dmZfcG9vbF9zaXplID0gVkZfUE9PTF9TSVpFOworCisJaSA9IHB1dF9wdHIgLSBmaWxsX3B0cjsKKwlpZiAoaSA8IDApCisJCWkgKz0gVkZfUE9PTF9TSVpFOworCXN0YXRlcy0+YnVmX2ZyZWVfbnVtID0gaTsKKworCWkgPSBwdXR0aW5nX3B0ciAtIHB1dF9wdHI7CisJaWYgKGkgPCAwKQorCQlpICs9IFZGX1BPT0xfU0laRTsKKwlzdGF0ZXMtPmJ1Zl9yZWN5Y2xlX251bSA9IGk7CisKKwlpID0gZmlsbF9wdHIgLSBnZXRfcHRyOworCWlmIChpIDwgMCkKKwkJaSArPSBWRl9QT09MX1NJWkU7CisJc3RhdGVzLT5idWZfYXZhaWxfbnVtID0gaTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzZW5kX2Ryb3BfY21kKHZvaWQpCit7CisJaW50IHJlYWR5X2NudCA9IDA7CisJaW50IHRlbXBfZ2V0X3B0ciA9IGdldF9wdHI7CisJaW50IHRlbXBfZmlsbF9wdHIgPSBmaWxsX3B0cjsKKworCXdoaWxlICh0ZW1wX2dldF9wdHIgIT0gdGVtcF9maWxsX3B0cikgeworCQlpZiAoKHZmcG9vbF9pZHhbdGVtcF9nZXRfcHRyXS52aWV3MF9idWZfaWQgPj0gMCkKKwkJCSYmICh2ZnBvb2xfaWR4W3RlbXBfZ2V0X3B0cl0udmlldzFfYnVmX2lkID49IDApCisJCQkmJiAodmZwb29sX2lkeFt0ZW1wX2dldF9wdHJdLnZpZXcwX2Ryb3AgPT0gMCkKKwkJCSYmICh2ZnBvb2xfaWR4W3RlbXBfZ2V0X3B0cl0udmlldzFfZHJvcCA9PSAwKSkKKwkJCXJlYWR5X2NudCsrOworCQlJTkNQVFIodGVtcF9nZXRfcHRyKTsKKwl9CisJaWYgKGRiZ19tb2RlICYgMHg0MCkgeworCQlwcl9pbmZvKCJyZWFkeV9jbnQgaXMgJWQgOyBub19kcm9wcGluZ19jbnQgaXMgJWRcbiIsIHJlYWR5X2NudCwKKwkJCSAgIG5vX2Ryb3BwaW5nX2NudCk7CisJfQorCWlmICgobm9fZHJvcHBpbmdfY250ID49IERST1BQSU5HX0ZJUlNUX1dBSVQpCisJCSYmIChyZWFkeV9jbnQgPCBkcm9wX3RocmVhZF9ob2xkKSkKKwkJV1JJVEVfVlJFRyhEUk9QX0NPTlRST0wsICgxIDw8IDMxKSB8IChkcm9wX3JhdGUpKTsKKwllbHNlCisJCVdSSVRFX1ZSRUcoRFJPUF9DT05UUk9MLCAwKTsKK30KKworI2lmIDAKK2ludCBnZXRfdmFsaWRfZnJhbWUodm9pZCkKK3sKKwlpbnQgcmVhZHlfY250ID0gMDsKKwlpbnQgdGVtcF9nZXRfcHRyID0gZ2V0X3B0cjsKKwlpbnQgdGVtcF9maWxsX3B0ciA9IGZpbGxfcHRyOworCisJd2hpbGUgKHRlbXBfZ2V0X3B0ciAhPSB0ZW1wX2ZpbGxfcHRyKSB7CisJCWlmICgodmZwb29sX2lkeFt0ZW1wX2dldF9wdHJdLnZpZXcwX2J1Zl9pZCA+PSAwKQorCQkJJiYgKHZmcG9vbF9pZHhbdGVtcF9nZXRfcHRyXS52aWV3MV9idWZfaWQgPj0gMCkKKwkJCSYmICh2ZnBvb2xfaWR4W3RlbXBfZ2V0X3B0cl0udmlldzBfZHJvcCA9PSAwKQorCQkJJiYgKHZmcG9vbF9pZHhbdGVtcF9nZXRfcHRyXS52aWV3MV9kcm9wID09IDApKQorCQkJcmVhZHlfY250Kys7CisJCUlOQ1BUUih0ZW1wX2dldF9wdHIpOworCX0KKwlyZXR1cm4gcmVhZHlfY250OworfQorI2VuZGlmCitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2aDI2NG12Y192Zl9wZWVrKHZvaWQgKm9wX2FyZykKK3sKKworCWlmIChnZXRfcHRyID09IGZpbGxfcHRyKQorCQlyZXR1cm4gTlVMTDsKKwlzZW5kX2Ryb3BfY21kKCk7CisJcmV0dXJuICZ2ZnBvb2xbZ2V0X3B0cl07CisKK30KKworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyAqdmgyNjRtdmNfdmZfZ2V0KHZvaWQgKm9wX2FyZykKK3sKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmOworCWludCB2aWV3MF9idWZfaWQ7CisJaW50IHZpZXcxX2J1Zl9pZDsKKwlzdHJ1Y3QgYnVmZmVyX3NwZWNfcyAqYnVmX3NwZWNfMCwgKmJ1Zl9zcGVjXzE7CisKKwlpZiAoZ2V0X3B0ciA9PSBmaWxsX3B0cikKKwkJcmV0dXJuIE5VTEw7CisKKwl2aWV3MF9idWZfaWQgPSB2ZnBvb2xfaWR4W2dldF9wdHJdLnZpZXcwX2J1Zl9pZDsKKwl2aWV3MV9idWZfaWQgPSB2ZnBvb2xfaWR4W2dldF9wdHJdLnZpZXcxX2J1Zl9pZDsKKwl2ZiA9ICZ2ZnBvb2xbZ2V0X3B0cl07CisKKwlpZiAoKHZpZXcwX2J1Zl9pZCA+PSAwKSAmJiAodmlldzFfYnVmX2lkID49IDApKSB7CisJCWlmICh2aWV3X21vZGUgPT0gMCB8fCB2aWV3X21vZGUgPT0gMSkgeworCQkJdmYtPnR5cGUgPSBWSURUWVBFX1BST0dSRVNTSVZFIHwgVklEVFlQRV9WSVVfRklFTEQ7CisKKwkJCWJ1Zl9zcGVjXzAgPSAodmlld19tb2RlID09IDApID8gKCZidWZmZXJfc3BlYzBbdmlldzBfYnVmX2lkXSkgOgorCQkJCQkoJmJ1ZmZlcl9zcGVjMVt2aWV3MV9idWZfaWRdKTsKKwkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IHNwZWMyY2FudmFzKGJ1Zl9zcGVjXzApOworCisJCQlpZiAoaXNfc3VwcG9ydF92ZGVjX2NhbnZhcygpKSB7CisJCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0gLTE7CisJCQkJdmYtPmNhbnZhczBfY29uZmlnWzBdLmJsb2NrX21vZGUgPSBDQU5WQVNfQkxLTU9ERV8zMlgzMjsKKwkJCQl2Zi0+Y2FudmFzMF9jb25maWdbMF0ucGh5X2FkZHIgPSBidWZfc3BlY18wLT55X2FkZHI7CisJCQkJdmYtPmNhbnZhczBfY29uZmlnWzBdLndpZHRoID0gdmRlY19jYXZfZ2V0X3dpZHRoKGJ1Zl9zcGVjXzAtPnlfY2FudmFzX2luZGV4KTsKKwkJCQl2Zi0+Y2FudmFzMF9jb25maWdbMF0uaGVpZ2h0ID0gdmRlY19jYXZfZ2V0X2hlaWdodChidWZfc3BlY18wLT55X2NhbnZhc19pbmRleCk7CisJCQkJdmYtPmNhbnZhczBfY29uZmlnWzFdLmJsb2NrX21vZGUgPSBDQU5WQVNfQkxLTU9ERV8zMlgzMjsKKwkJCQl2Zi0+Y2FudmFzMF9jb25maWdbMV0ucGh5X2FkZHIgPSBidWZfc3BlY18wLT51X2FkZHI7CisJCQkJdmYtPmNhbnZhczBfY29uZmlnWzFdLndpZHRoID0gdmRlY19jYXZfZ2V0X3dpZHRoKGJ1Zl9zcGVjXzAtPnVfY2FudmFzX2luZGV4KTsKKwkJCQl2Zi0+Y2FudmFzMF9jb25maWdbMV0uaGVpZ2h0ID0gdmRlY19jYXZfZ2V0X2hlaWdodChidWZfc3BlY18wLT51X2NhbnZhc19pbmRleCk7CisJCQkJdmYtPmNhbnZhczBfY29uZmlnWzJdLmJsb2NrX21vZGUgPSBDQU5WQVNfQkxLTU9ERV8zMlgzMjsKKwkJCQl2Zi0+Y2FudmFzMF9jb25maWdbMl0ucGh5X2FkZHIgPSBidWZfc3BlY18wLT52X2FkZHI7CisJCQkJdmYtPmNhbnZhczBfY29uZmlnWzJdLndpZHRoID0gdmRlY19jYXZfZ2V0X3dpZHRoKGJ1Zl9zcGVjXzAtPnZfY2FudmFzX2luZGV4KTsKKwkJCQl2Zi0+Y2FudmFzMF9jb25maWdbMl0uaGVpZ2h0ID0gdmRlY19jYXZfZ2V0X2hlaWdodChidWZfc3BlY18wLT52X2NhbnZhc19pbmRleCk7CisJCQkJdmYtPnBsYW5lX251bSA9IDM7CisJCQl9CisJCX0gZWxzZSB7CisJCQl2Zi0+dHlwZSA9IFZJRFRZUEVfUFJPR1JFU1NJVkUgfCBWSURUWVBFX01WQzsKKworCQkJdmYtPmxlZnRfZXllLnN0YXJ0X3ggPSAwOworCQkJdmYtPmxlZnRfZXllLnN0YXJ0X3kgPSAwOworCQkJdmYtPmxlZnRfZXllLndpZHRoID0gdmYtPndpZHRoOworCQkJdmYtPmxlZnRfZXllLmhlaWdodCA9IHZmLT5oZWlnaHQ7CisJCQl2Zi0+cmlnaHRfZXllLnN0YXJ0X3ggPSAwOworCQkJdmYtPnJpZ2h0X2V5ZS5zdGFydF95ID0gMDsKKwkJCXZmLT5yaWdodF9leWUud2lkdGggPSB2Zi0+d2lkdGg7CisJCQl2Zi0+cmlnaHRfZXllLmhlaWdodCA9IHZmLT5oZWlnaHQ7CisJCQkvL3ZmLT50cmFuc19mbXQgPSBUVklOX1RGTVRfM0RfVEI7CisKKwkJCWlmICh2aWV3X21vZGUgPT0gMikgeworCQkJCWJ1Zl9zcGVjXzAgPSAmYnVmZmVyX3NwZWMxW3ZpZXcxX2J1Zl9pZF07CisJCQkJYnVmX3NwZWNfMSA9ICZidWZmZXJfc3BlYzBbdmlldzBfYnVmX2lkXTsKKwkJCX0gZWxzZSB7CisJCQkJYnVmX3NwZWNfMCA9ICZidWZmZXJfc3BlYzBbdmlldzBfYnVmX2lkXTsKKwkJCQlidWZfc3BlY18xID0gJmJ1ZmZlcl9zcGVjMVt2aWV3MV9idWZfaWRdOworCQkJfQorCQkJaWYgKGlzX3N1cHBvcnRfdmRlY19jYW52YXMoKSkgeworCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IC0xOworCQkJCXZmLT5jYW52YXMwX2NvbmZpZ1swXS5ibG9ja19tb2RlID0gQ0FOVkFTX0JMS01PREVfMzJYMzI7CisJCQkJdmYtPmNhbnZhczBfY29uZmlnWzBdLnBoeV9hZGRyID0gYnVmX3NwZWNfMC0+eV9hZGRyOworCQkJCXZmLT5jYW52YXMwX2NvbmZpZ1swXS53aWR0aCA9IHZkZWNfY2F2X2dldF93aWR0aChidWZfc3BlY18wLT55X2NhbnZhc19pbmRleCk7CisJCQkJdmYtPmNhbnZhczBfY29uZmlnWzBdLmhlaWdodCA9IHZkZWNfY2F2X2dldF9oZWlnaHQoYnVmX3NwZWNfMC0+eV9jYW52YXNfaW5kZXgpOworCQkJCXZmLT5jYW52YXMwX2NvbmZpZ1sxXS5ibG9ja19tb2RlID0gQ0FOVkFTX0JMS01PREVfMzJYMzI7CisJCQkJdmYtPmNhbnZhczBfY29uZmlnWzFdLnBoeV9hZGRyID0gYnVmX3NwZWNfMC0+dV9hZGRyOworCQkJCXZmLT5jYW52YXMwX2NvbmZpZ1sxXS53aWR0aCA9IHZkZWNfY2F2X2dldF93aWR0aChidWZfc3BlY18wLT51X2NhbnZhc19pbmRleCk7CisJCQkJdmYtPmNhbnZhczBfY29uZmlnWzFdLmhlaWdodCA9IHZkZWNfY2F2X2dldF9oZWlnaHQoYnVmX3NwZWNfMC0+dV9jYW52YXNfaW5kZXgpOworCQkJCXZmLT5jYW52YXMwX2NvbmZpZ1syXS5ibG9ja19tb2RlID0gQ0FOVkFTX0JMS01PREVfMzJYMzI7CisJCQkJdmYtPmNhbnZhczBfY29uZmlnWzJdLnBoeV9hZGRyID0gYnVmX3NwZWNfMC0+dl9hZGRyOworCQkJCXZmLT5jYW52YXMwX2NvbmZpZ1syXS53aWR0aCA9IHZkZWNfY2F2X2dldF93aWR0aChidWZfc3BlY18wLT52X2NhbnZhc19pbmRleCk7CisJCQkJdmYtPmNhbnZhczBfY29uZmlnWzJdLmhlaWdodCA9IHZkZWNfY2F2X2dldF9oZWlnaHQoYnVmX3NwZWNfMC0+dl9jYW52YXNfaW5kZXgpOworCisJCQkJdmYtPmNhbnZhczFfY29uZmlnWzBdLmJsb2NrX21vZGUgPSBDQU5WQVNfQkxLTU9ERV8zMlgzMjsKKwkJCQl2Zi0+Y2FudmFzMV9jb25maWdbMF0ucGh5X2FkZHIgPSBidWZfc3BlY18xLT55X2FkZHI7CisJCQkJdmYtPmNhbnZhczFfY29uZmlnWzBdLndpZHRoID0gdmRlY19jYXZfZ2V0X3dpZHRoKGJ1Zl9zcGVjXzEtPnlfY2FudmFzX2luZGV4KTsKKwkJCQl2Zi0+Y2FudmFzMV9jb25maWdbMF0uaGVpZ2h0ID0gdmRlY19jYXZfZ2V0X2hlaWdodChidWZfc3BlY18xLT55X2NhbnZhc19pbmRleCk7CisJCQkJdmYtPmNhbnZhczFfY29uZmlnWzFdLmJsb2NrX21vZGUgPSBDQU5WQVNfQkxLTU9ERV8zMlgzMjsKKwkJCQl2Zi0+Y2FudmFzMV9jb25maWdbMV0ucGh5X2FkZHIgPSBidWZfc3BlY18xLT51X2FkZHI7CisJCQkJdmYtPmNhbnZhczFfY29uZmlnWzFdLndpZHRoID0gdmRlY19jYXZfZ2V0X3dpZHRoKGJ1Zl9zcGVjXzEtPnVfY2FudmFzX2luZGV4KTsKKwkJCQl2Zi0+Y2FudmFzMV9jb25maWdbMV0uaGVpZ2h0ID0gdmRlY19jYXZfZ2V0X2hlaWdodChidWZfc3BlY18xLT51X2NhbnZhc19pbmRleCk7CisJCQkJdmYtPmNhbnZhczFfY29uZmlnWzJdLmJsb2NrX21vZGUgPSBDQU5WQVNfQkxLTU9ERV8zMlgzMjsKKwkJCQl2Zi0+Y2FudmFzMV9jb25maWdbMl0ucGh5X2FkZHIgPSBidWZfc3BlY18xLT52X2FkZHI7CisJCQkJdmYtPmNhbnZhczFfY29uZmlnWzJdLndpZHRoID0gdmRlY19jYXZfZ2V0X3dpZHRoKGJ1Zl9zcGVjXzEtPnZfY2FudmFzX2luZGV4KTsKKwkJCQl2Zi0+Y2FudmFzMV9jb25maWdbMl0uaGVpZ2h0ID0gdmRlY19jYXZfZ2V0X2hlaWdodChidWZfc3BlY18xLT52X2NhbnZhc19pbmRleCk7CisJCQkJdmYtPnBsYW5lX251bSA9IDM7CisJCQl9IGVsc2UgeworCQkJCXZmLT5jYW52YXMwQWRkciA9IHNwZWMyY2FudmFzKGJ1Zl9zcGVjXzApOworCQkJCXZmLT5jYW52YXMxQWRkciA9IHNwZWMyY2FudmFzKGJ1Zl9zcGVjXzEpOworCQkJfQorCQl9CisJfQorCisJdmYtPnR5cGVfb3JpZ2luYWwgPSB2Zi0+dHlwZTsKKwlpZiAoKCh2ZnBvb2xfaWR4W2dldF9wdHJdLnZpZXcwX2Ryb3AgIT0gMCkKKwkJIHx8ICh2ZnBvb2xfaWR4W2dldF9wdHJdLnZpZXcxX2Ryb3AgIT0gMCkpCisJCSYmICgobm9fZHJvcHBpbmdfY250ID49IERST1BQSU5HX0ZJUlNUX1dBSVQpKSkKKwkJdmYtPmZyYW1lX2RpcnR5ID0gMTsKKwllbHNlCisJCXZmLT5mcmFtZV9kaXJ0eSA9IDA7CisKKwlJTkNQVFIoZ2V0X3B0cik7CisKKwlpZiAoZnJhbWVfd2lkdGggPT0gMCkKKwkJZnJhbWVfd2lkdGggPSB2aDI2NG12Y19hbXN0cmVhbV9kZWNfaW5mby53aWR0aDsKKwlpZiAoZnJhbWVfaGVpZ2h0ID09IDApCisJCWZyYW1lX2hlaWdodCA9IHZoMjY0bXZjX2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodDsKKworCXZmLT53aWR0aCA9IGZyYW1lX3dpZHRoOworCXZmLT5oZWlnaHQgPSBmcmFtZV9oZWlnaHQ7CisKKwlpZiAoKG5vX2Ryb3BwaW5nX2NudCA8IERST1BQSU5HX0ZJUlNUX1dBSVQpICYmICh2Zi0+ZnJhbWVfZGlydHkgPT0gMCkpCisJCW5vX2Ryb3BwaW5nX2NudCsrOworCXJldHVybiB2ZjsKKworfQorCitzdGF0aWMgdm9pZCB2aDI2NG12Y192Zl9wdXQoc3RydWN0IHZmcmFtZV9zICp2Ziwgdm9pZCAqb3BfYXJnKQoreworCisJaWYgKHZmX2J1Zl9pbml0X2ZsYWcgPT0gMCkKKwkJcmV0dXJuOworCWlmICh2Zi0+ZnJhbWVfZGlydHkpIHsKKworCQl2Zi0+ZnJhbWVfZGlydHkgPSAwOworCQlkaXJ0eV9mcmFtZV9udW0rKzsKKwkJZW5hYmxlX3JlY3ljbGUgPSAwOworCQlpZiAoZGJnX21vZGUgJiBQVVRfUFJJTlRfRU5BQkxFKSB7CisJCQlwcl9pbmZvKCJpbnZhbGlkOiBkaXJ0eV9mcmFtZV9udW0gaXMgISEhICVkXG4iLAorCQkJCSAgIGRpcnR5X2ZyYW1lX251bSk7CisJCX0KKwl9IGVsc2UgeworCQlJTkNQVFIocHV0dGluZ19wdHIpOworCQl3aGlsZSAoZGlydHlfZnJhbWVfbnVtID4gMCkgeworCQkJSU5DUFRSKHB1dHRpbmdfcHRyKTsKKwkJCWRpcnR5X2ZyYW1lX251bS0tOworCQl9CisJCWVuYWJsZV9yZWN5Y2xlID0gMTsKKwkJaWYgKGRiZ19tb2RlICYgUFVUX1BSSU5UX0VOQUJMRSkgeworCQkJcHJfaW5mbygidmFsaWQ6IGRpcnR5X2ZyYW1lX251bSBpcyBAQEAgJWRcbiIsCisJCQkJICAgZGlydHlfZnJhbWVfbnVtKTsKKwkJfQorCQkvKiBzZW5kX2Ryb3BfY21kKCk7ICovCisJfQorCit9CisKK3N0YXRpYyBpbnQgdmgyNjRtdmNfZXZlbnRfY2IoaW50IHR5cGUsIHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGVfZGF0YSkKK3sKKwlpZiAodHlwZSAmIFZGUkFNRV9FVkVOVF9SRUNFSVZFUl9SRVNFVCkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCWFtdmRlY19zdG9wKCk7CisjaWZuZGVmIENPTkZJR19BTUxPR0lDX1BPU1RfUFJPQ0VTU19NQU5BR0VSCisJCXZmX2xpZ2h0X3VucmVnX3Byb3ZpZGVyKCZ2aDI2NG12Y192Zl9wcm92KTsKKyNlbmRpZgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCQl2aDI2NG12Y19sb2NhbF9pbml0KCk7CisJCXZoMjY0bXZjX3Byb3RfaW5pdCgpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CisjaWZuZGVmIENPTkZJR19BTUxPR0lDX1BPU1RfUFJPQ0VTU19NQU5BR0VSCisJCXZmX3JlZ19wcm92aWRlcigmdmgyNjRtdmNfdmZfcHJvdik7CisjZW5kaWYKKwkJYW12ZGVjX3N0YXJ0KCk7CisJfQorCXJldHVybiAwOworfQorCisvKiovCitzdGF0aWMgbG9uZyBpbml0X2NhbnZhcyhpbnQgdmlld19pbmRleCwgaW50IHJlZmJ1Zl9zaXplLCBsb25nIGRwYl9zaXplLAorCQlpbnQgZHBiX251bWJlciwJaW50IG1iX3dpZHRoLCBpbnQgbWJfaGVpZ2h0LAorCQlzdHJ1Y3QgYnVmZmVyX3NwZWNfcyAqYnVmZmVyX3NwZWMpCit7CisKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJaW50IGksIGosIGJtbXVfaW5kZXg7CisJaW50IG1iX3RvdGFsLCByZXQgPSAtMTsKKwkvKiBjYXZfY29uIGNhbnZhczsgKi8KKwltYl90b3RhbCA9IG1iX3dpZHRoICogbWJfaGVpZ2h0OworCW11dGV4X2xvY2soJnZoMjY0X212Y19tdXRleCk7CisKKwlmb3IgKGogPSAwOyBqIDwgKGRwYl9udW1iZXIgKyAxKTsgaisrKSB7CisJCWludCBwYWdlX2NvdW50OworCQlpZiAoaiA9PSAwKSB7CisJCQlpZiAoIXZpZXdfaW5kZXgpCisJCQkJYm1tdV9pbmRleCA9IDE7CisJCQllbHNlCisJCQkJYm1tdV9pbmRleCA9ICBkcGJfbnVtYmVyICsgMjsKKworCQkJcmV0ID0gZGVjb2Rlcl9ibW11X2JveF9hbGxvY19idWZfcGh5KG1tX2Jsa19oYW5kbGUsCisJCQkJYm1tdV9pbmRleCwgcmVmYnVmX3NpemUsIERSSVZFUl9OQU1FLAorCQkJCSZyZWZfc3RhcnRfYWRkclt2aWV3X2luZGV4XSk7CisKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJbXV0ZXhfdW5sb2NrKCZ2aDI2NF9tdmNfbXV0ZXgpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisKKwkJCWNvbnRpbnVlOworCQl9CisJCSAvKiBjYW52YXMgYnVmICovCisJCVdSSVRFX1ZSRUcoQU5DX0NBTlZBU19BRERSLAorCQkJCWluZGV4IHwgKChpbmRleCArIDEpIDw8IDgpIHwKKwkJCQkoKGluZGV4ICsgMikgPDwgMTYpKTsKKwkJQU5DX0NBTlZBU19BRERSKys7CisKKwkJCWkgPSBqIC0gMTsKKwkJaWYgKCF2aWV3X2luZGV4KQorCQkJYm1tdV9pbmRleCA9IFZGX0JVRkZFUl9JRFgoaSk7CisJCWVsc2UKKwkJCWJtbXVfaW5kZXgJPSBWRl9CVUZGRVJfSURYKGkpICsgZHBiX251bWJlciArIDE7CisjaWZkZWYgRE9VQkxFX1dSSVRFCisJCSBwYWdlX2NvdW50ID0gUEFHRV9BTElHTigobWJfdG90YWwgPDwgOCkgKyAobWJfdG90YWwgPDwgNykgKworCQkJCShtYl90b3RhbCA8PCA2KSArIChtYl90b3RhbCA8PCA1KSkgLyBQQUdFX1NJWkU7CisjZWxzZQorCQkgcGFnZV9jb3VudCA9IFBBR0VfQUxJR04oKG1iX3RvdGFsIDw8IDgpICsKKwkJCQkobWJfdG90YWwgPDwgNykpIC8gUEFHRV9TSVpFOworI2VuZGlmCisKKwkJcmV0ID0gZGVjb2Rlcl9ibW11X2JveF9hbGxvY19idWZfcGh5KG1tX2Jsa19oYW5kbGUsCisJCQlibW11X2luZGV4LCBwYWdlX2NvdW50IDw8IFBBR0VfU0hJRlQsCisJCQlEUklWRVJfTkFNRSwgJmJ1ZmZlcl9zcGVjW2ldLnBoeV9hZGRyKTsKKworCQlpZiAocmV0IDwgMCkgeworCQkJYnVmZmVyX3NwZWNbaV0uYWxsb2NfY291bnQgPSAwOworCQkJbXV0ZXhfdW5sb2NrKCZ2aDI2NF9tdmNfbXV0ZXgpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWFkZHIgPSBidWZmZXJfc3BlY1tpXS5waHlfYWRkcjsKKwkJYnVmZmVyX3NwZWNbaV0uYWxsb2NfY291bnQgPSBwYWdlX2NvdW50OworCQlidWZmZXJfc3BlY1tpXS55X2FkZHIgPSBhZGRyOworCQlidWZmZXJfc3BlY1tpXS55X2NhbnZhc19pbmRleCA9IGluZGV4OworCQljb25maWdfY2F2X2x1dF9leChpbmRleCwgYWRkciwKKwkJCW1iX3dpZHRoIDw8IDQsIG1iX2hlaWdodCA8PCA0LAorCQkJQ0FOVkFTX0FERFJfTk9XUkFQLCBDQU5WQVNfQkxLTU9ERV8zMlgzMiwgMCwgVkRFQ18xKTsKKworCQlhZGRyICs9IG1iX3RvdGFsIDw8IDg7CisJCWluZGV4Kys7CisJCWJ1ZmZlcl9zcGVjW2ldLnVfYWRkciA9IGFkZHI7CisJCWJ1ZmZlcl9zcGVjW2ldLnVfY2FudmFzX2luZGV4ID0gaW5kZXg7CisJCWNvbmZpZ19jYXZfbHV0X2V4KGluZGV4LCBhZGRyLCBtYl93aWR0aCA8PCAzLCBtYl9oZWlnaHQgPDwgMywKKwkJCQlDQU5WQVNfQUREUl9OT1dSQVAsIENBTlZBU19CTEtNT0RFXzMyWDMyLCAwLCBWREVDXzEpOworCisJCWFkZHIgKz0gbWJfdG90YWwgPDwgNjsKKwkJaW5kZXgrKzsKKwkJYnVmZmVyX3NwZWNbaV0udl9hZGRyID0gYWRkcjsKKwkJYnVmZmVyX3NwZWNbaV0udl9jYW52YXNfaW5kZXggPSBpbmRleDsKKwkJY29uZmlnX2Nhdl9sdXRfZXgoaW5kZXgsIGFkZHIsIG1iX3dpZHRoIDw8IDMsIG1iX2hlaWdodCA8PCAzLAorCQkJCUNBTlZBU19BRERSX05PV1JBUCwgQ0FOVkFTX0JMS01PREVfMzJYMzIsIDAsIFZERUNfMSk7CisKKwkJaW5kZXgrKzsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ2aDI2NF9tdmNfbXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9tYXhfZGVjX2ZyYW1lX2J1Zl9zaXplKGludCBsZXZlbF9pZGMsCisJCWludCBtYXhfcmVmZXJlbmNlX2ZyYW1lX251bSwgaW50IG1iX3dpZHRoLAorCQlpbnQgbWJfaGVpZ2h0KQoreworCWludCBwaWNfc2l6ZSA9IG1iX3dpZHRoICogbWJfaGVpZ2h0ICogMzg0OworCisJaW50IHNpemUgPSAwOworCisJc3dpdGNoIChsZXZlbF9pZGMpIHsKKwljYXNlIDk6CisJCXNpemUgPSAxNTIwNjQ7CisJCWJyZWFrOworCWNhc2UgMTA6CisJCXNpemUgPSAxNTIwNjQ7CisJCWJyZWFrOworCWNhc2UgMTE6CisJCXNpemUgPSAzNDU2MDA7CisJCWJyZWFrOworCWNhc2UgMTI6CisJCXNpemUgPSA5MTIzODQ7CisJCWJyZWFrOworCWNhc2UgMTM6CisJCXNpemUgPSA5MTIzODQ7CisJCWJyZWFrOworCWNhc2UgMjA6CisJCXNpemUgPSA5MTIzODQ7CisJCWJyZWFrOworCWNhc2UgMjE6CisJCXNpemUgPSAxODI0NzY4OworCQlicmVhazsKKwljYXNlIDIyOgorCQlzaXplID0gMzExMDQwMDsKKwkJYnJlYWs7CisJY2FzZSAzMDoKKwkJc2l6ZSA9IDMxMTA0MDA7CisJCWJyZWFrOworCWNhc2UgMzE6CisJCXNpemUgPSA2OTEyMDAwOworCQlicmVhazsKKwljYXNlIDMyOgorCQlzaXplID0gNzg2NDMyMDsKKwkJYnJlYWs7CisJY2FzZSA0MDoKKwkJc2l6ZSA9IDEyNTgyOTEyOworCQlicmVhazsKKwljYXNlIDQxOgorCQlzaXplID0gMTI1ODI5MTI7CisJCWJyZWFrOworCWNhc2UgNDI6CisJCXNpemUgPSAxMzM2OTM0NDsKKwkJYnJlYWs7CisJY2FzZSA1MDoKKwkJc2l6ZSA9IDQyMzkzNjAwOworCQlicmVhazsKKwljYXNlIDUxOgorCQlzaXplID0gNzA3Nzg4ODA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXNpemUgLz0gcGljX3NpemU7CisJc2l6ZSA9IHNpemUgKyAxOwkvKiBGb3IgTVZDIG5lZWQgb25yIG1vcmUgYnVmZmVyICovCisJaWYgKG1heF9yZWZlcmVuY2VfZnJhbWVfbnVtID4gc2l6ZSkKKwkJc2l6ZSA9IG1heF9yZWZlcmVuY2VfZnJhbWVfbnVtOworCWlmIChzaXplID4gREVDT0RFX0JVRkZFUl9OVU1fTUFYKQorCQlzaXplID0gREVDT0RFX0JVRkZFUl9OVU1fTUFYOworCisJcmV0dXJuIHNpemU7Cit9CisKK2ludCBjaGVja19pbl9saXN0KGludCBwb3MsIGludCAqc2xvdCkKK3sKKwlpbnQgaTsKKwlpbnQgcmV0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBWRl9QT09MX1NJWkU7IGkrKykgeworCQlpZiAoKHZmcG9vbF9pZHhbaV0uZGlzcGxheV9wb3MgPT0gcG9zKQorCQkJJiYgKHZmcG9vbF9pZHhbaV0udXNlZCA9PSAwKSkgeworCQkJcmV0ID0gMTsKKwkJCSpzbG90ID0gdmZwb29sX2lkeFtpXS5zbG90OworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZG9fYWxsb2Nfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJaW50IGxldmVsX2lkYywgbWF4X3JlZmVyZW5jZV9mcmFtZV9udW0sIG1iX3dpZHRoLCBtYl9oZWlnaHQ7CisJaW50IHJlZmJ1Zl9zaXplOworCWludCByZXQgPSBSRUFEX1ZSRUcoTUFJTEJPWF9DT01NQU5EKTsKKworCXN3aXRjaCAocmV0ICYgMHhmZikgeworCWNhc2UgQ01EX0FMTE9DX1ZJRVdfMDoKKwkJaWYgKGRiZ19tb2RlICYgMHgxKSB7CisJCQlwcl9pbmZvCisJCQkoIlN0YXJ0IEgyNjQgZGlzcGxheSBidWZmZXIgZm9yIHZpZXcgMFxuIik7CisJCX0KKworCQlyZXQgPSBSRUFEX1ZSRUcoTUFJTEJPWF9EQVRBXzApOworCQlsZXZlbF9pZGMgPSAocmV0ID4+IDI0KSAmIDB4ZmY7CisJCW1heF9yZWZlcmVuY2VfZnJhbWVfbnVtID0gKHJldCA+PiAxNikgJiAweGZmOworCQltYl93aWR0aCA9IChyZXQgPj4gOCkgJiAweGZmOworCQltYl9oZWlnaHQgPSAocmV0ID4+IDApICYgMHhmZjsKKwkJbWF4X2RlY19mcmFtZV9idWZmZXJpbmdbMF0gPQorCQkJZ2V0X21heF9kZWNfZnJhbWVfYnVmX3NpemUobGV2ZWxfaWRjLAorCQkJCQltYXhfcmVmZXJlbmNlX2ZyYW1lX251bSwKKwkJCQkJbWJfd2lkdGgsIG1iX2hlaWdodCk7CisKKwkJdG90YWxfZGVjX2ZyYW1lX2J1ZmZlcmluZ1swXSA9CisJCQltYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZ1swXSArIGR5bmFtaWNfYnVmX251bV9tYXJnaW47CisKKwkJbWJfd2lkdGggPSAobWJfd2lkdGggKyAzKSAmIDB4ZmZmZmZmZmM7CisJCW1iX2hlaWdodCA9IChtYl9oZWlnaHQgKyAzKSAmIDB4ZmZmZmZmZmM7CisKKwkJZHBiX3NpemUgPSBtYl93aWR0aCAqIG1iX2hlaWdodCAqIDM4NDsKKwkJcmVmX3NpemUgPSBtYl93aWR0aCAqIG1iX2hlaWdodCAqIDk2OworCisJCWlmIChkYmdfbW9kZSAmIDB4MSkgeworCQkJcHJfaW5mbygiZHBiX3NpemU6IDB4JXhcbiIsIGRwYl9zaXplKTsKKwkJCXByX2luZm8oInJlZl9zaXplOiAweCV4XG4iLCByZWZfc2l6ZSk7CisJCQlwcl9pbmZvKCJ0b3RhbF9kZWNfZnJhbWVfYnVmZmVyaW5nWzBdIDogMHgleFxuIiwKKwkJCQkgICB0b3RhbF9kZWNfZnJhbWVfYnVmZmVyaW5nWzBdKTsKKwkJCXByX2luZm8oIm1heF9yZWZlcmVuY2VfZnJhbWVfbnVtOiAweCV4XG4iLAorCQkJCSAgIG1heF9yZWZlcmVuY2VfZnJhbWVfbnVtKTsKKwkJfQorCQlyZWZidWZfc2l6ZQorCQkJPSByZWZfc2l6ZSAqIChtYXhfcmVmZXJlbmNlX2ZyYW1lX251bSArIDEpICogMjsKKworCQlpZiAoaXNfc3VwcG9ydF92ZGVjX2NhbnZhcygpKQorCQkJaW5kZXggPSAwOworCQllbHNlCisJCQlpbmRleCA9IENBTlZBU19JTkRFWF9TVEFSVDsKKwkJQU5DX0NBTlZBU19BRERSID0gQU5DMF9DQU5WQVNfQUREUjsKKworCQlyZXQgPQorCQkJaW5pdF9jYW52YXMoMCwgcmVmYnVmX3NpemUsIGRwYl9zaXplLAorCQkJCXRvdGFsX2RlY19mcmFtZV9idWZmZXJpbmdbMF0sIG1iX3dpZHRoLAorCQkJCW1iX2hlaWdodCwgYnVmZmVyX3NwZWMwKTsKKworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfaW5mbygiIFVuLWV4cGVjdGVkIG1lbW9yeSBhbGxvYyBwcm9ibGVtXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCVdSSVRFX1ZSRUcoUkVGX1NUQVJUX1ZJRVdfMCwKKwkJCQkgICB2aWRlb19kb21haW5fYWRkcihyZWZfc3RhcnRfYWRkclswXSkpOworCQlXUklURV9WUkVHKE1BSUxCT1hfREFUQV8wLAorCQkJICAgKG1heF9kZWNfZnJhbWVfYnVmZmVyaW5nWzBdIDw8IDgpIHwKKwkJCSAgICh0b3RhbF9kZWNfZnJhbWVfYnVmZmVyaW5nWzBdIDw8IDApKTsKKwkJV1JJVEVfVlJFRyhNQUlMQk9YX0RBVEFfMSwgcmVmX3NpemUpOworCQlXUklURV9WUkVHKE1BSUxCT1hfQ09NTUFORCwgQ01EX0ZJTklTSEVEKTsKKworCQlpZiAoZGJnX21vZGUgJiAweDEpIHsKKwkJCXByX2luZm8KKwkJCSgiRW5kIEgyNjQgZGlzcGxheSBidWZmZXIgZm9yIHZpZXcgMFxuIik7CisJCX0KKwkJaWYgKGZyYW1lX3dpZHRoID09IDApIHsKKwkJCWlmICh2aDI2NG12Y19hbXN0cmVhbV9kZWNfaW5mby53aWR0aCkKKwkJCQlmcmFtZV93aWR0aCA9IHZoMjY0bXZjX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoOworCQkJZWxzZQorCQkJCWZyYW1lX3dpZHRoID0gbWJfd2lkdGggPDwgNDsKKwkJfQorCQlpZiAoZnJhbWVfaGVpZ2h0ID09IDApIHsKKwkJCWZyYW1lX2hlaWdodCA9IG1iX2hlaWdodCA8PCA0OworCQkJaWYgKGZyYW1lX2hlaWdodCA9PSAxMDg4KQorCQkJCWZyYW1lX2hlaWdodCA9IDEwODA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDTURfQUxMT0NfVklFV18xOgorCQlpZiAoZGJnX21vZGUgJiAweDEpIHsKKwkJCXByX2luZm8KKwkJCSgiU3RhcnQgSDI2NCBkaXNwbGF5IGJ1ZmZlciBmb3IgdmlldyAxXG4iKTsKKwkJfQorCisJCXJldCA9IFJFQURfVlJFRyhNQUlMQk9YX0RBVEFfMCk7CisJCWxldmVsX2lkYyA9IChyZXQgPj4gMjQpICYgMHhmZjsKKwkJbWF4X3JlZmVyZW5jZV9mcmFtZV9udW0gPSAocmV0ID4+IDE2KSAmIDB4ZmY7CisJCW1iX3dpZHRoID0gKHJldCA+PiA4KSAmIDB4ZmY7CisJCW1iX2hlaWdodCA9IChyZXQgPj4gMCkgJiAweGZmOworCQltYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZ1sxXSA9CisJCQlnZXRfbWF4X2RlY19mcmFtZV9idWZfc2l6ZShsZXZlbF9pZGMsCisJCQkJCW1heF9yZWZlcmVuY2VfZnJhbWVfbnVtLAorCQkJCQltYl93aWR0aCwgbWJfaGVpZ2h0KTsKKwkJaWYgKG1heF9kZWNfZnJhbWVfYnVmZmVyaW5nWzFdICE9IG1heF9kZWNfZnJhbWVfYnVmZmVyaW5nWzBdKSB7CisJCQlwcl9pbmZvCisJCQkoIiBXYXJuaW5nOiB2aWV3MC8xIG1heF9kZWNfZnJhbWVfYnVmZmVyaW5nICIpOworCQkJcHJfaW5mbygiZGlmZmVyZW50IDogMHgleC8weCV4LCBVc2UgVmlldzBcbiIsCisJCQkgbWF4X2RlY19mcmFtZV9idWZmZXJpbmdbMF0sCisJCQkgbWF4X2RlY19mcmFtZV9idWZmZXJpbmdbMV0pOworCQkJbWF4X2RlY19mcmFtZV9idWZmZXJpbmdbMV0gPSBtYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZ1swXTsKKwkJfQorCisJCXRvdGFsX2RlY19mcmFtZV9idWZmZXJpbmdbMV0gPQorCQkJbWF4X2RlY19mcmFtZV9idWZmZXJpbmdbMV0gKyBkeW5hbWljX2J1Zl9udW1fbWFyZ2luOworCisJCW1iX3dpZHRoID0gKG1iX3dpZHRoICsgMykgJiAweGZmZmZmZmZjOworCQltYl9oZWlnaHQgPSAobWJfaGVpZ2h0ICsgMykgJiAweGZmZmZmZmZjOworCisJCWRwYl9zaXplID0gbWJfd2lkdGggKiBtYl9oZWlnaHQgKiAzODQ7CisJCXJlZl9zaXplID0gbWJfd2lkdGggKiBtYl9oZWlnaHQgKiA5NjsKKwkJcmVmYnVmX3NpemUgPSByZWZfc2l6ZSAqIChtYXhfcmVmZXJlbmNlX2ZyYW1lX251bSArIDEpICogMjsKKwkJaWYgKGRiZ19tb2RlICYgMHgxKSB7CisJCQlwcl9pbmZvKCJkcGJfc2l6ZTogMHgleFxuIiwgZHBiX3NpemUpOworCQkJcHJfaW5mbygicmVmX3NpemU6IDB4JXhcbiIsIHJlZl9zaXplKTsKKwkJCXByX2luZm8oInRvdGFsX2RlY19mcmFtZV9idWZmZXJpbmdbMV0gOiAweCV4XG4iLAorCQkJCSAgIHRvdGFsX2RlY19mcmFtZV9idWZmZXJpbmdbMV0pOworCQkJcHJfaW5mbygibWF4X3JlZmVyZW5jZV9mcmFtZV9udW06IDB4JXhcbiIsCisJCQkJICAgbWF4X3JlZmVyZW5jZV9mcmFtZV9udW0pOworCQl9CisKKwkJaWYgKGlzX3N1cHBvcnRfdmRlY19jYW52YXMoKSkKKwkJCWluZGV4ID0gdG90YWxfZGVjX2ZyYW1lX2J1ZmZlcmluZ1swXSAqIDM7CisJCWVsc2UKKwkJCWluZGV4ID0gQ0FOVkFTX0lOREVYX1NUQVJUICsgdG90YWxfZGVjX2ZyYW1lX2J1ZmZlcmluZ1swXSAqIDM7CisJCUFOQ19DQU5WQVNfQUREUiA9CisJCQlBTkMwX0NBTlZBU19BRERSICsgdG90YWxfZGVjX2ZyYW1lX2J1ZmZlcmluZ1swXTsKKworCQlyZXQgPSBpbml0X2NhbnZhcygxLCByZWZidWZfc2l6ZSwgZHBiX3NpemUsCisJCQkJdG90YWxfZGVjX2ZyYW1lX2J1ZmZlcmluZ1sxXSwgbWJfd2lkdGgsCisJCQkJbWJfaGVpZ2h0LCBidWZmZXJfc3BlYzEpOworCisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9pbmZvKCIgVW4tZXhwZWN0ZWQgbWVtb3J5IGFsbG9jIHByb2JsZW1cbiIpOworCQkJcmV0dXJuOworCQl9CisKKwkJV1JJVEVfVlJFRyhSRUZfU1RBUlRfVklFV18xLAorCQkJCSAgIHZpZGVvX2RvbWFpbl9hZGRyKHJlZl9zdGFydF9hZGRyWzFdKSk7CisJCVdSSVRFX1ZSRUcoTUFJTEJPWF9EQVRBXzAsCisJCQkgICAobWF4X2RlY19mcmFtZV9idWZmZXJpbmdbMV0gPDwgOCkgfAorCQkJICAgKHRvdGFsX2RlY19mcmFtZV9idWZmZXJpbmdbMV0gPDwgMCkpOworCQlXUklURV9WUkVHKE1BSUxCT1hfREFUQV8xLCByZWZfc2l6ZSk7CisJCVdSSVRFX1ZSRUcoTUFJTEJPWF9DT01NQU5ELCBDTURfRklOSVNIRUQpOworCisJCWlmIChkYmdfbW9kZSAmIDB4MSkgeworCQkJcHJfaW5mbworCQkJKCJFbmQgSDI2NCBidWZmZXIgYWxsb2NhdGlvbiBmb3IgdmlldyAxXG4iKTsKKwkJfQorCQlpZiAoZnJhbWVfd2lkdGggPT0gMCkgeworCQkJaWYgKHZoMjY0bXZjX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoKQorCQkJCWZyYW1lX3dpZHRoID0gdmgyNjRtdmNfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGg7CisJCQllbHNlCisJCQkJZnJhbWVfd2lkdGggPSBtYl93aWR0aCA8PCA0OworCQl9CisJCWlmIChmcmFtZV9oZWlnaHQgPT0gMCkgeworCQkJZnJhbWVfaGVpZ2h0ID0gbWJfaGVpZ2h0IDw8IDQ7CisJCQlpZiAoZnJhbWVfaGVpZ2h0ID09IDEwODgpCisJCQkJZnJhbWVfaGVpZ2h0ID0gMTA4MDsKKwkJfQorCWJyZWFrOworCX0KKworfQorCitzdGF0aWMgdm9pZCBtdmNfc2V0X3JwKHZvaWQpIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm12Y19ycF9sb2NrLCBmbGFncyk7CisJU1RCVUZfV1JJVEUoJnZkZWMtPnZidWYsIHNldF9ycCwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXZjX3JwX2xvY2ssIGZsYWdzKTsKK30KKworI2lmZGVmIEhBTkRMRV9oMjY0bXZjX0lSUQorc3RhdGljIGlycXJldHVybl90IHZoMjY0bXZjX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCisjZWxzZQorc3RhdGljIHZvaWQgdmgyNjRtdmNfaXNyKHZvaWQpCisjZW5kaWYKK3sKKwlpbnQgZHJvcF9zdGF0dXM7CisJc3RydWN0IHZmcmFtZV9zICp2ZjsKKwl1bnNpZ25lZCBpbnQgcHRzLCBwdHNfdmFsaWQgPSAwOworCXU2NCBwdHNfdXM2NDsKKwl1MzIgZnJhbWVfc2l6ZTsKKwlpbnQgcmV0ID0gUkVBRF9WUkVHKE1BSUxCT1hfQ09NTUFORCk7CisKKwltdmNfc2V0X3JwKCk7CisKKwkvKiBwcl9pbmZvKCJ2aDI2NG12Y19pc3IsIGNtZCA9JXhcbiIsIHJldCk7ICovCisJc3dpdGNoIChyZXQgJiAweGZmKSB7CisJY2FzZSBDTURfQUxMT0NfVklFV18wOgorCWNhc2UgQ01EX0FMTE9DX1ZJRVdfMToKKwkJc2NoZWR1bGVfd29yaygmYWxsb2Nfd29yayk7CisJCWJyZWFrOworCWNhc2UgQ01EX0ZSQU1FX0RJU1BMQVk6CisJCXJldCA9IFJFQURfVlJFRyhNQUlMQk9YX0RBVEFfMCk7CisJCWRpc3BsYXlfYnVmZl9pZCA9IChyZXQgPj4gMCkgJiAweDNmOworCQlkaXNwbGF5X3ZpZXdfaWQgPSAocmV0ID4+IDYpICYgMHgzOworCQlkcm9wX3N0YXR1cyA9IChyZXQgPj4gOCkgJiAweDE7CisJCWRpc3BsYXlfUE9DID0gUkVBRF9WUkVHKE1BSUxCT1hfREFUQV8xKTsKKwkJc3RyZWFtX29mZnNldCA9IFJFQURfVlJFRyhNQUlMQk9YX0RBVEFfMik7CisJCS8qIGlmIChkaXNwbGF5X3ZpZXdfaWQgPT0gMCkgKi8KKwkJV1JJVEVfVlJFRyhNQUlMQk9YX0NPTU1BTkQsIENNRF9GSU5JU0hFRCk7CisKKyNpZmRlZiBERUJVR19TS0lQCisJCXZpZXdfdG90YWwrKzsKKwkJaWYgKGRyb3Bfc3RhdHVzKQorCQkJdmlld19kcm9wcGVkKys7CisjZW5kaWYKKwkJaWYgKGRiZ19tb2RlICYgMHgxKSB7CisJCQlwcl9pbmZvCisJCQkoIiBIMjY0IGRpc3BsYXkgZnJhbWUgcmVhZHkgLSBWaWV3IDogJXgsIEJ1ZmZlciA6ICV4XG4iLAorCQkJIGRpc3BsYXlfdmlld19pZCwgZGlzcGxheV9idWZmX2lkKTsKKwkJCXByX2luZm8KKwkJCSgiIEgyNjQgZGlzcGxheSBmcmFtZSBQT0MgLS0gQnVmZmVyIDogJXgsIFBPQyA6ICV4XG4iLAorCQkJIGRpc3BsYXlfYnVmZl9pZCwgZGlzcGxheV9QT0MpOworCQkJcHJfaW5mbygiSDI2NCBkaXNwbGF5IGZyYW1lIHJlYWR5XG4iKTsKKwkJfQorCQlpZiAoZGJnX21vZGUgJiAweDEwKSB7CisJCQlpZiAoKGRiZ19tb2RlICYgMHgyMCkgPT0gMCkgeworCQkJCXdoaWxlIChSRUFEX1ZSRUcoQlVGRkVSX1JFQ1lDTEUpICE9IDApCisJCQkJCTsKKwkJCQlXUklURV9WUkVHKEJVRkZFUl9SRUNZQ0xFLAorCQkJCQkJICAgKGRpc3BsYXlfdmlld19pZCA8PCA4KSB8CisJCQkJCQkgICAoZGlzcGxheV9idWZmX2lkICsgMSkpOworCQkJCWRpc3BsYXlfYnVmZl9pZCA9IC0xOworCQkJCWRpc3BsYXlfdmlld19pZCA9IC0xOworCQkJCWRpc3BsYXlfUE9DID0gLTE7CisJCQl9CisJCX0gZWxzZSB7CisJCQl1bnNpZ25lZCBjaGFyIGluX2xpc3RfZmxhZyA9IDA7CisKKwkJCWludCBzbG90ID0gMDsKKworCQkJaW5fbGlzdF9mbGFnID0gY2hlY2tfaW5fbGlzdChkaXNwbGF5X1BPQywgJnNsb3QpOworCisJCQlpZiAoKGRiZ19tb2RlICYgMHg0MCkgJiYgKGRyb3Bfc3RhdHVzKSkgeworCQkJCXByX2luZm8KKwkJCQkoImRyb3Bfc3RhdHVzOiVkdmlld19pZD0lZCxidWZmX2lkPSVkLCIsCisJCQkJIGRyb3Bfc3RhdHVzLCBkaXNwbGF5X3ZpZXdfaWQsIGRpc3BsYXlfYnVmZl9pZCk7CisJCQkJIHByX2luZm8KKwkJCQkoIm9mZnNldD0lZCwgZGlzcGxheV9QT0MgPSAlZCxmaWxsX3B0cj0weCV4XG4iLAorCQkJCSBzdHJlYW1fb2Zmc2V0LCBkaXNwbGF5X1BPQywgZmlsbF9wdHIpOworCQkJfQorCisJCQlpZiAoKGluX2xpc3RfZmxhZykgJiYgKHN0cmVhbV9vZmZzZXQgIT0gMCkpIHsKKwkJCQlwcl9pbmZvCisJCQkJKCJlcnJvciBjYXNlICxkaXNwbGF5X1BPQyBpcyAlZCwgc2xvdCBpcyAlZFxuIiwKKwkJCQkgZGlzcGxheV9QT0MsIHNsb3QpOworCQkJCWluX2xpc3RfZmxhZyA9IDA7CisJCQl9CisJCQlpZiAoIWluX2xpc3RfZmxhZykgeworCQkJCWlmIChkaXNwbGF5X3ZpZXdfaWQgPT0gMCkgeworCQkJCQl2ZnBvb2xfaWR4W2ZpbGxfcHRyXS52aWV3MF9idWZfaWQgPQorCQkJCQkJZGlzcGxheV9idWZmX2lkOworCQkJCQl2aWV3MF92ZmJ1Zl91c2VbZGlzcGxheV9idWZmX2lkXSsrOworCQkJCQl2ZnBvb2xfaWR4W2ZpbGxfcHRyXS5zdHJlYW1fb2Zmc2V0ID0KKwkJCQkJCXN0cmVhbV9vZmZzZXQ7CisJCQkJCXZmcG9vbF9pZHhbZmlsbF9wdHJdLnZpZXcwX2Ryb3AgPQorCQkJCQkJZHJvcF9zdGF0dXM7CisJCQkJfQorCQkJCWlmIChkaXNwbGF5X3ZpZXdfaWQgPT0gMSkgeworCQkJCQl2ZnBvb2xfaWR4W2ZpbGxfcHRyXS52aWV3MV9idWZfaWQgPQorCQkJCQkJZGlzcGxheV9idWZmX2lkOworCQkJCQl2ZnBvb2xfaWR4W2ZpbGxfcHRyXS52aWV3MV9kcm9wID0KKwkJCQkJCWRyb3Bfc3RhdHVzOworCQkJCQl2aWV3MV92ZmJ1Zl91c2VbZGlzcGxheV9idWZmX2lkXSsrOworCQkJCX0KKwkJCQl2ZnBvb2xfaWR4W2ZpbGxfcHRyXS5zbG90ID0gZmlsbF9wdHI7CisJCQkJdmZwb29sX2lkeFtmaWxsX3B0cl0uZGlzcGxheV9wb3MgPSBkaXNwbGF5X1BPQzsKKworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZGlzcGxheV92aWV3X2lkID09IDApIHsKKwkJCQkJdmZwb29sX2lkeFtzbG90XS52aWV3MF9idWZfaWQgPQorCQkJCQkJZGlzcGxheV9idWZmX2lkOworCQkJCQl2aWV3MF92ZmJ1Zl91c2VbZGlzcGxheV9idWZmX2lkXSsrOworCQkJCQl2ZnBvb2xfaWR4W3Nsb3RdLnN0cmVhbV9vZmZzZXQgPQorCQkJCQkJc3RyZWFtX29mZnNldDsKKwkJCQkJdmZwb29sX2lkeFtzbG90XS52aWV3MF9kcm9wID0KKwkJCQkJCWRyb3Bfc3RhdHVzOworCisJCQkJfQorCQkJCWlmIChkaXNwbGF5X3ZpZXdfaWQgPT0gMSkgeworCQkJCQl2ZnBvb2xfaWR4W3Nsb3RdLnZpZXcxX2J1Zl9pZCA9CisJCQkJCQlkaXNwbGF5X2J1ZmZfaWQ7CisJCQkJCXZpZXcxX3ZmYnVmX3VzZVtkaXNwbGF5X2J1ZmZfaWRdKys7CisJCQkJCXZmcG9vbF9pZHhbc2xvdF0udmlldzFfZHJvcCA9CisJCQkJCQlkcm9wX3N0YXR1czsKKwkJCQl9CisJCQkJdmYgPSAmdmZwb29sW3Nsb3RdOworCisJCQkJaWYgKGRpc3BsYXlfdmlld19pZCA9PSAwKSB7CisJCQkJCXZmLT5tZW1faGFuZGxlID0KKwkJCQkJZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCQkJCW1tX2Jsa19oYW5kbGUsCisJCQkJCQlWRl9CVUZGRVJfSURYKGRpc3BsYXlfYnVmZl9pZCkpOworCisJCQkJfSBlbHNlIGlmIChkaXNwbGF5X3ZpZXdfaWQgPT0gMSkgeworCQkJCQl2Zi0+bWVtX2hlYWRfaGFuZGxlID0KKwkJCQkJZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCQkJCW1tX2Jsa19oYW5kbGUsCisJCQkJCQlWRl9CVUZGRVJfSURYKGRpc3BsYXlfYnVmZl9pZCkpOworCisJCQkJCXZmLT5tZW1faGFuZGxlID0KKwkJCQkJZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCQkJCW1tX2Jsa19oYW5kbGUsCisJCQkJCQlWRl9CVUZGRVJfSURYKGRpc3BsYXlfYnVmZl9pZCkKKwkJCQkJCSsgdG90YWxfZGVjX2ZyYW1lX2J1ZmZlcmluZ1swXQorCQkJCQkJKyAxKTsKKwkJCQl9CisKKworCisJCQkJaWYgKHZmcG9vbF9pZHhbc2xvdF0uc3RyZWFtX29mZnNldCA9PSAwKSB7CisJCQkJCXByX2luZm8KKwkJCQkJKCJlcnJvciBjYXNlLCBpbnZhbGlkIHN0cmVhbSBvZmZzZXRcbiIpOworCQkJCX0KKwkJCQlpZiAocHRzX2xvb2t1cF9vZmZzZXRfdXM2NAorCQkJCQkoUFRTX1RZUEVfVklERU8sCisJCQkJCSB2ZnBvb2xfaWR4W3Nsb3RdLnN0cmVhbV9vZmZzZXQsICZwdHMsCisJCQkJCSAmZnJhbWVfc2l6ZSwKKwkJCQkJIDB4MTAwMDAsICZwdHNfdXM2NCkgPT0gMCkKKwkJCQkJcHRzX3ZhbGlkID0gMTsKKwkJCQllbHNlCisJCQkJCXB0c192YWxpZCA9IDA7CisJCQkJdmYtPnB0cyA9IChwdHNfdmFsaWQpID8gcHRzIDogMDsKKwkJCQl2Zi0+cHRzX3VzNjQgPSAocHRzX3ZhbGlkKSA/IHB0c191czY0IDogMDsKKwkJCQkvKiB2Zi0+cHRzID0gIHZmLT5wdHNfdXM2NCA/IHZmLT5wdHNfdXM2NAorCQkJCSAqICAgOiB2Zi0+cHRzIDsKKwkJCQkgKi8KKwkJCQkvKiB2Zi0+cHRzID0gIHZmLT5wdHNfdXM2NDsgKi8KKwkJCQlpZiAoZGJnX21vZGUgJiAweDgwKQorCQkJCQlwcl9pbmZvKCJ2Zi0+cHRzOiVkXG4iLCB2Zi0+cHRzKTsKKwkJCQl2ZnBvb2xfaWR4W3Nsb3RdLnVzZWQgPSAxOworCQkJCUlOQ1BUUihmaWxsX3B0cik7CisJCQkJc2V0X2ZyYW1lX2luZm8odmYpOworCisJCQkJZ3ZzLT5mcmFtZV9kdXIgPSBmcmFtZV9kdXI7CisJCQkJdmRlY19jb3VudF9pbmZvKGd2cywgMCwKKwkJCQkJCXZmcG9vbF9pZHhbc2xvdF0uc3RyZWFtX29mZnNldCk7CisKKwkJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoUFJPVklERVJfTkFNRSwKKwkJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1ZGUkFNRV9SRUFEWSwKKwkJCQkJTlVMTCk7CisKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIENNRF9GQVRBTF9FUlJPUjoKKwkJcHJfaW5mbygiZmF0YWwgZXJyb3IgISEhXG4iKTsKKwkJc2NoZWR1bGVfd29yaygmZXJyb3Jfd2Rfd29yayk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKyNpZmRlZiBIQU5ETEVfaDI2NG12Y19JUlEKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CisjZWxzZQorCXJldHVybjsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCB2aDI2NF9tdmNfc2V0X2NsayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJaWYgKGZyYW1lX2R1ciA+IDAgJiYgc2F2ZWRfcmVzb2x1dGlvbiAhPQorCQlmcmFtZV93aWR0aCAqIGZyYW1lX2hlaWdodCAqICg5NjAwMCAvIGZyYW1lX2R1cikpIHsKKwkJaW50IGZwcyA9IDk2MDAwIC8gZnJhbWVfZHVyOworCisJCXNhdmVkX3Jlc29sdXRpb24gPSBmcmFtZV93aWR0aCAqIGZyYW1lX2hlaWdodCAqIGZwczsKKwkJdmRlY19zb3VyY2VfY2hhbmdlZChWRk9STUFUX0gyNjRNVkMsCisJCQlmcmFtZV93aWR0aCwgZnJhbWVfaGVpZ2h0LCBmcHMgKiAyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHZoMjY0bXZjX3B1dF90aW1lcl9mdW5jKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKK3sKKwlpbnQgdmFsaWRfZnJhbWUgPSAwOworCisJbXZjX3NldF9ycCgpOworCisJaWYgKGVuYWJsZV9yZWN5Y2xlID09IDApIHsKKwkJaWYgKGRiZ19tb2RlICYgVElNRV9UQVNLX1BSSU5UX0VOQUJMRSkgeworCQkJLyogdmFsaWRfZnJhbWUgPSBnZXRfdmFsaWRfZnJhbWUoKTsgKi8KKwkJCXByX2luZm8oImRpcnR5X2ZyYW1lX251bSBpcyAlZCAsIHZhbGlkIGZyYW1lIGlzICVkXG4iLAorCQkJCSAgIGRpcnR5X2ZyYW1lX251bSwgdmFsaWRfZnJhbWUpOworCisJCX0KKwkJLyogZ290byBSRVNUQVJUOyAqLworCX0KKworCXdoaWxlICgocHV0dGluZ19wdHIgIT0gcHV0X3B0cikgJiYgKFJFQURfVlJFRyhCVUZGRVJfUkVDWUNMRSkgPT0gMCkpIHsKKwkJaW50IHZpZXcwX2J1Zl9pZCA9IHZmcG9vbF9pZHhbcHV0X3B0cl0udmlldzBfYnVmX2lkOworCQlpbnQgdmlldzFfYnVmX2lkID0gdmZwb29sX2lkeFtwdXRfcHRyXS52aWV3MV9idWZfaWQ7CisKKwkJaWYgKCh2aWV3MF9idWZfaWQgPj0gMCkgJiYKKwkJCQkodmlldzBfdmZidWZfdXNlW3ZpZXcwX2J1Zl9pZF0gPT0gMSkpIHsKKwkJCWlmIChkYmdfbW9kZSAmIDB4MTAwKSB7CisJCQkJcHJfaW5mbworCQkJCSgicm91bmQgMDogcHV0X3B0ciBpcyAlZCA7dmlldzBfYnVmX2lkIGlzICVkXG4iLAorCQkJCSBwdXRfcHRyLCB2aWV3MF9idWZfaWQpOworCQkJfQorCQkJV1JJVEVfVlJFRyhCVUZGRVJfUkVDWUNMRSwKKwkJCQkJICAgKDAgPDwgOCkgfCAodmlldzBfYnVmX2lkICsgMSkpOworCQkJdmlldzBfdmZidWZfdXNlW3ZpZXcwX2J1Zl9pZF0gPSAwOworCQkJdmZwb29sX2lkeFtwdXRfcHRyXS52aWV3MF9idWZfaWQgPSAtMTsKKwkJCXZmcG9vbF9pZHhbcHV0X3B0cl0udmlldzBfZHJvcCA9IDA7CisJCX0gZWxzZSBpZiAoKHZpZXcxX2J1Zl9pZCA+PSAwKQorCQkJCSAgICYmICh2aWV3MV92ZmJ1Zl91c2VbdmlldzFfYnVmX2lkXSA9PSAxKSkgeworCQkJaWYgKGRiZ19tb2RlICYgMHgxMDApIHsKKwkJCQlwcl9pbmZvCisJCQkJKCJyb3VuZCAxOiBwdXRfcHRyIGlzICVkIDt2aWV3MV9idWZfaWQgJWQ9PVxuIiwKKwkJCQkgcHV0X3B0ciwgdmlldzFfYnVmX2lkKTsKKwkJCX0KKwkJCVdSSVRFX1ZSRUcoQlVGRkVSX1JFQ1lDTEUsCisJCQkJCSAgICgxIDw8IDgpIHwgKHZpZXcxX2J1Zl9pZCArIDEpKTsKKwkJCXZpZXcxX3ZmYnVmX3VzZVt2aWV3MV9idWZfaWRdID0gMDsKKwkJCXZmcG9vbF9pZHhbcHV0X3B0cl0uZGlzcGxheV9wb3MgPSBESVNQTEFZX0lOVkFMSURfUE9TOworCQkJdmZwb29sX2lkeFtwdXRfcHRyXS52aWV3MV9idWZfaWQgPSAtMTsKKwkJCXZmcG9vbF9pZHhbcHV0X3B0cl0udmlldzFfZHJvcCA9IDA7CisJCQl2ZnBvb2xfaWR4W3B1dF9wdHJdLnVzZWQgPSAwOworCQkJSU5DUFRSKHB1dF9wdHIpOworCQl9CisJfQorCisJc2NoZWR1bGVfd29yaygmc2V0X2Nsa193b3JrKTsKKworCS8qIFJFU1RBUlQ6ICovCisJdGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgUFVUX0lOVEVSVkFMOworCisJYWRkX3RpbWVyKHRpbWVyKTsKK30KKworaW50IHZoMjY0bXZjX2RlY19zdGF0dXMoc3RydWN0IHZkZWNfcyAqdmRlYywgc3RydWN0IHZkZWNfaW5mbyAqdnN0YXR1cykKK3sKKwl2c3RhdHVzLT5mcmFtZV93aWR0aCA9IGZyYW1lX3dpZHRoOworCXZzdGF0dXMtPmZyYW1lX2hlaWdodCA9IGZyYW1lX2hlaWdodDsKKwlpZiAoZnJhbWVfZHVyICE9IDApCisJCXZzdGF0dXMtPmZyYW1lX3JhdGUgPSA5NjAwMCAvIGZyYW1lX2R1cjsKKwllbHNlCisJCXZzdGF0dXMtPmZyYW1lX3JhdGUgPSAtMTsKKwl2c3RhdHVzLT5lcnJvcl9jb3VudCA9IFJFQURfVlJFRyhBVl9TQ1JBVENIX0QpOworCXZzdGF0dXMtPnN0YXR1cyA9IHN0YXQ7CisJdnN0YXR1cy0+Yml0X3JhdGUgPSBndnMtPmJpdF9yYXRlOworCXZzdGF0dXMtPmZyYW1lX2R1ciA9IGZyYW1lX2R1cjsKKwl2c3RhdHVzLT5mcmFtZV9kYXRhID0gZ3ZzLT5mcmFtZV9kYXRhOworCXZzdGF0dXMtPnRvdGFsX2RhdGEgPSBndnMtPnRvdGFsX2RhdGE7CisJdnN0YXR1cy0+ZnJhbWVfY291bnQgPSBndnMtPmZyYW1lX2NvdW50OworCXZzdGF0dXMtPmVycm9yX2ZyYW1lX2NvdW50ID0gZ3ZzLT5lcnJvcl9mcmFtZV9jb3VudDsKKwl2c3RhdHVzLT5kcm9wX2ZyYW1lX2NvdW50ID0gZ3ZzLT5kcm9wX2ZyYW1lX2NvdW50OworCXZzdGF0dXMtPnRvdGFsX2RhdGEgPSBndnMtPnRvdGFsX2RhdGE7CisJdnN0YXR1cy0+c2FtcF9jbnQgPSBndnMtPnNhbXBfY250OworCXZzdGF0dXMtPm9mZnNldCA9IGd2cy0+b2Zmc2V0OworCXNucHJpbnRmKHZzdGF0dXMtPnZkZWNfbmFtZSwgc2l6ZW9mKHZzdGF0dXMtPnZkZWNfbmFtZSksCisJCSIlcyIsIERSSVZFUl9OQU1FKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZoMjY0bXZjX3ZkZWNfaW5mb19pbml0KHZvaWQpCit7CisJZ3ZzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZkZWNfaW5mbyksIEdGUF9LRVJORUwpOworCWlmIChOVUxMID09IGd2cykgeworCQlwcl9pbmZvKCJ0aGUgc3RydWN0IG9mIHZkZWMgc3RhdHVzIG1hbGxvYyBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworfQorCitpbnQgdmgyNjRtdmNfc2V0X3RyaWNrbW9kZShzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1bnNpZ25lZCBsb25nIHRyaWNrbW9kZSkKK3sKKwlpZiAodHJpY2ttb2RlID09IFRSSUNLTU9ERV9JKSB7CisJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9GLAorCQkJCSAgIChSRUFEX1ZSRUcoQVZfU0NSQVRDSF9GKSAmIDB4ZmZmZmZmZmMpIHwgMik7CisJCXRyaWNrbW9kZV9pID0gMTsKKwl9IGVsc2UgaWYgKHRyaWNrbW9kZSA9PSBUUklDS01PREVfTk9ORSkgeworCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfRiwgUkVBRF9WUkVHKEFWX1NDUkFUQ0hfRikgJiAweGZmZmZmZmZjKTsKKwkJdHJpY2ttb2RlX2kgPSAwOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBIMjY0X0RFQ09ERV9JTklUKHZvaWQpCit7CisJaW50IGk7CisKKwlpID0gUkVBRF9WUkVHKERFQ09ERV9TS0lQX1BJQ1RVUkUpOworCisjaWYgMQkJCQkvKiAvTUVTT05fQ1BVX1RZUEUgPj0gTUVTT05fQ1BVX1RZUEVfTUVTT042ICovCisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAoMSA8PCA3KSB8ICgxIDw8IDYpIHwgKDEgPDwgNCkpOworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgMCk7CisKKwlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMCk7CisJUkVBRF9WUkVHKERPU19TV19SRVNFVDApOworCVJFQURfVlJFRyhET1NfU1dfUkVTRVQwKTsKKworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgKDEgPDwgNykgfCAoMSA8PCA2KSB8ICgxIDw8IDQpKTsKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsIDApOworCisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAoMSA8PCA5KSB8ICgxIDw8IDgpKTsKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsIDApOworCisJUkVBRF9WUkVHKERPU19TV19SRVNFVDApOworCVJFQURfVlJFRyhET1NfU1dfUkVTRVQwKTsKKwlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMCk7CisKKyNlbHNlCisJV1JJVEVfUkVTRVRfUkVHKFJFU0VUMF9SRUdJU1RFUiwKKwkJCQkgICBSRVNFVF9JUUlEQ1QgfCBSRVNFVF9NQyB8IFJFU0VUX1ZMRF9QQVJUKTsKKwlSRUFEX1JFU0VUX1JFRyhSRVNFVDBfUkVHSVNURVIpOworCVdSSVRFX1JFU0VUX1JFRyhSRVNFVDBfUkVHSVNURVIsCisJCQkJICAgUkVTRVRfSVFJRENUIHwgUkVTRVRfTUMgfCBSRVNFVF9WTERfUEFSVCk7CisJV1JJVEVfUkVTRVRfUkVHKFJFU0VUMl9SRUdJU1RFUiwgUkVTRVRfUElDX0RDIHwgUkVTRVRfREJMSyk7CisjZW5kaWYKKworCS8qIFdhaXQgZm9yIHNvbWUgdGltZSBmb3IgUkVTRVQgKi8KKwlSRUFEX1ZSRUcoREVDT0RFX1NLSVBfUElDVFVSRSk7CisJUkVBRF9WUkVHKERFQ09ERV9TS0lQX1BJQ1RVUkUpOworCisJV1JJVEVfVlJFRyhERUNPREVfU0tJUF9QSUNUVVJFLCBpKTsKKworCS8qIGZpbGxfd2VpZ2h0X3ByZWQgKi8KKwlXUklURV9WUkVHKE1DX01QT1JUX0NUUkwsIDB4MDMwMCk7CisJZm9yIChpID0gMDsgaSA8IDE5MjsgaSsrKQorCQlXUklURV9WUkVHKE1DX01QT1JUX0RBVCwgMHgxMDApOworCVdSSVRFX1ZSRUcoTUNfTVBPUlRfQ1RSTCwgMCk7CisKKwlXUklURV9WUkVHKE1CX1dJRFRILCAweGZmKTsJLyogaW52YWxpZCBtYl93aWR0aCAqLworCisJLyogc2V0IHNsaWNlIHN0YXJ0IHRvIDB4MDAwMDAwIG9yIDB4MDAwMDAxIGZvciBjaGVjayBtb3JlX3Jic3BfZGF0YSAqLworCVdSSVRFX1ZSRUcoU0xJQ0VfU1RBUlRfQllURV8wMSwgMHgwMDAwMDAwMCk7CisJV1JJVEVfVlJFRyhTTElDRV9TVEFSVF9CWVRFXzIzLCAweDAxMDEwMDAwKTsKKwkvKiBzZXQgdG8gbXBlZzIgdG8gZW5hYmxlIG1pc21hdGNoIGxvZ2ljICovCisJV1JJVEVfVlJFRyhNUEVHMV8yX1JFRywgMSk7CisJLyogZGlzYWJsZSBDT0VGX0dUXzY0ICwgZXJyb3JfbTRfdGFibGUgYW5kIHZvZmZfcndfZXJyICovCisJV1JJVEVfVlJFRyhWTERfRVJST1JfTUFTSywgMHgxMDExKTsKKworCS8qIENvbmZpZyBNQ1BVIEFtcmlzYyBpbnRlcnJ1cHQgKi8KKwlXUklURV9WUkVHKEFTU0lTVF9BTVIxX0lOVDAsIDB4MSk7CS8qIHZpdV92c3luY19pbnQgKi8KKwlXUklURV9WUkVHKEFTU0lTVF9BTVIxX0lOVDEsIDB4NSk7CS8qIG1ib3hfaXNyICovCisJV1JJVEVfVlJFRyhBU1NJU1RfQU1SMV9JTlQyLCAweDgpOwkvKiB2bGRfaXNyICovCisJV1JJVEVfVlJFRyhBU1NJU1RfQU1SMV9JTlQzLCAweDE1KTsJLyogdmlmaWZvX2VtcHR5ICovCisJV1JJVEVfVlJFRyhBU1NJU1RfQU1SMV9JTlQ0LCAweGQpOwkvKiBydl9haV9tYl9maW5pc2hlZF9pbnQgKi8KKwlXUklURV9WUkVHKEFTU0lTVF9BTVIxX0lOVDcsIDB4MTQpOwkvKiBkY2FjX2RtYV9kb25lICovCisKKwkvKiBDb25maWcgTUNQVSBBbXJpc2MgaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhBU1NJU1RfQU1SMV9JTlQ1LCAweDkpOwkvKiBNQ1BVIGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoQVNTSVNUX0FNUjFfSU5UNiwgMHgxNyk7CS8qIENDUFUgaW50ZXJydXB0ICovCisKKwlXUklURV9WUkVHKENQQ19QLCAweGMwMCk7CS8qIENDUFUgQ29kZSB3aWxsIHN0YXJ0IGZyb20gMHhjMDAgKi8KKwlXUklURV9WUkVHKENJTlRfVkVDX0JBU0UsICgweGMyMCA+PiA1KSk7CisjaWYgMAorCVdSSVRFX1ZSRUcoUE9XRVJfQ1RMX1ZMRCwKKwkJCVJFQURfVlJFRyhQT1dFUl9DVExfVkxEKSB8ICgwIDw8IDEwKSB8CisJCQkoMSA8PCA5KSB8ICgxIDw8IDYpKTsKKyNlbHNlCisJV1JJVEVfVlJFRyhQT1dFUl9DVExfVkxELCAoKDEgPDwgMTApIHwJLyogZGlzYWJsZSBjYWJhY19zdGVwXzIgKi8KKwkJCQkoMSA8PCA5KSB8CS8qIHZpZmZfZHJvcF9mbGFnX2VuICovCisJCQkJKDEgPDwgNikJLyogaDI2NF8wMDAwMDNfZW4gKi8KKwkJCQkJCQkgICkKKwkJCSAgKTsKKyNlbmRpZgorCVdSSVRFX1ZSRUcoTTRfQ09OVFJPTF9SRUcsICgxIDw8IDEzKSk7CS8qIEgyNjRfREVDT0RFX0lORk8gLSBoMjY0X2VuICovCisKKwlpZiAoaXNfc3VwcG9ydF92ZGVjX2NhbnZhcygpKQorCQlXUklURV9WUkVHKENBTlZBU19TVEFSVCwgMCk7CisJZWxzZQorCQlXUklURV9WUkVHKENBTlZBU19TVEFSVCwgQ0FOVkFTX0lOREVYX1NUQVJUKTsKKyNpZiAxCisJLyogU3RhcnQgQWRkcmVzcyBvZiBXb3Jrc3BhY2UgKFVDT0RFLCB0ZW1wX2RhdGEuLi4pICovCisJV1JJVEVfVlJFRyhXT1JLU1BBQ0VfU1RBUlQsCisJCQkgICB2aWRlb19kb21haW5fYWRkcih3b3JrX3NwYWNlX2FkcikpOworI2Vsc2UKKwkvKiBTdGFydCBBZGRyZXNzIG9mIFdvcmtzcGFjZSAoVUNPREUsIHRlbXBfZGF0YS4uLikgKi8KKwlXUklURV9WUkVHKFdPUktTUEFDRV9TVEFSVCwKKwkJCTB4MDUwMDAwMDApOworI2VuZGlmCisJLyogQ2xlYXIgYWxsIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgYXZhaWxhYmxlICovCisJV1JJVEVfVlJFRyhTUFNfU1RBVFVTLCAwKTsKKwkvKiBDbGVhciBhbGwgcGljdHVyZSBwYXJhbWV0ZXIgc2V0IGF2YWlsYWJsZSAqLworCVdSSVRFX1ZSRUcoUFBTX1NUQVRVUywgMCk7CisJLyogU2V0IGN1cnJlbnQgbWljcm9jb2RlIHRvIE5VTEwgKi8KKwlXUklURV9WUkVHKENVUlJFTlRfVUNPREUsIDB4ZmYpOworCS8qIFNldCBjdXJyZW50IFNQUy9QUFMgdG8gTlVMTCAqLworCVdSSVRFX1ZSRUcoQ1VSUkVOVF9TUFNfUFBTLCAweGZmZmYpOworCS8qIFNldCBkZWNvZGUgc3RhdHVzIHRvIERFQ09ERV9TVEFSVF9IRUFERVIgKi8KKwlXUklURV9WUkVHKERFQ09ERV9TVEFUVVMsIDEpOworfQorCitzdGF0aWMgdm9pZCB2aDI2NG12Y19wcm90X2luaXQodm9pZCkKK3sKKwl3aGlsZSAoUkVBRF9WUkVHKERDQUNfRE1BX0NUUkwpICYgMHg4MDAwKQorCQk7CisJd2hpbGUgKFJFQURfVlJFRyhMTUVNX0RNQV9DVFJMKSAmIDB4ODAwMCkKKwkJOwkJLyogcmVnIGFkZHJlc3MgaXMgMHgzNTAgKi8KKwkvKiBjbGVhciBtYWlsYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoQVNTSVNUX01CT1gxX0NMUl9SRUcsIDEpOworCisJLyogZW5hYmxlIG1haWxib3ggaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfTUFTSywgMSk7CisKKwkvKiBkaXNhYmxlIFBTQ0FMRSBmb3IgaGFyZHdhcmUgc2hhcmluZyAqLworCVdSSVRFX1ZSRUcoUFNDQUxFX0NUUkwsIDApOworCisJSDI2NF9ERUNPREVfSU5JVCgpOworCisjaWYgMQkJCQkvKiAvTUVTT05fQ1BVX1RZUEUgPj0gTUVTT05fQ1BVX1RZUEVfTUVTT042ICovCisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAoMSA8PCAxMSkpOworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgMCk7CisKKwlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMCk7CisJUkVBRF9WUkVHKERPU19TV19SRVNFVDApOworCVJFQURfVlJFRyhET1NfU1dfUkVTRVQwKTsKKworI2Vsc2UKKwlXUklURV9SRVNFVF9SRUcoUkVTRVQwX1JFR0lTVEVSLCAweDgwKTsJLyogUkVTRVQgTUNQVSAqLworI2VuZGlmCisKKwlXUklURV9WUkVHKE1BSUxCT1hfQ09NTUFORCwgMCk7CisJV1JJVEVfVlJFRyhCVUZGRVJfUkVDWUNMRSwgMCk7CisJV1JJVEVfVlJFRyhEUk9QX0NPTlRST0wsIDApOworCUNMRUFSX1ZSRUdfTUFTSyhNREVDX1BJQ19EQ19DVFJMLCAxIDw8IDE3KTsKKworCUNMRUFSX1ZSRUdfTUFTSyhNREVDX1BJQ19EQ19DVFJMLCAxIDw8IDE2KTsKKworI2lmIDEJCQkJLyogL01FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09OOCAqLworCVdSSVRFX1ZSRUcoTURFQ19QSUNfRENfVEhSRVNILCAweDQwNDAzOGFhKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IHZoMjY0bXZjX2xvY2FsX2luaXQodm9pZCkKK3sKKwlpbnQgaSwgc2l6ZSwgcmV0OworCWRpc3BsYXlfYnVmZl9pZCA9IC0xOworCWRpc3BsYXlfdmlld19pZCA9IC0xOworCWRpc3BsYXlfUE9DID0gLTE7CisJbm9fZHJvcHBpbmdfY250ID0gMDsKKwlpbml0X2Ryb3BfY250ID0gSU5JVF9EUk9QX0ZSQU1FX0NOVDsKKworCWZvciAoaSA9IDA7IGkgPCBJTklUX0RST1BfRlJBTUVfQ05UOyBpKyspCisJCWluaXRfZHJvcF9mcmFtZV9pZFtpXSA9IDA7CisKKyNpZmRlZiBERUJVR19QVFMKKwlwdHNfbWlzc2VkID0gMDsKKwlwdHNfaGl0ID0gMDsKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfU0tJUAorCXZpZXdfdG90YWwgPSAwOworCXZpZXdfZHJvcHBlZCA9IDA7CisjZW5kaWYKKworCS8qIHZoMjY0bXZjX3JhdGlvID0gdmgyNjRtdmNfYW1zdHJlYW1fZGVjX2luZm8ucmF0aW87ICovCisJdmgyNjRtdmNfcmF0aW8gPSAweDEwMDsKKworCS8qIGZyYW1lX3dpZHRoID0gdmgyNjRtdmNfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGg7ICovCisJLyogZnJhbWVfaGVpZ2h0ID0gdmgyNjRtdmNfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0OyAqLworCWZyYW1lX2R1ciA9IHZoMjY0bXZjX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGU7CisJaWYgKGZyYW1lX2R1ciA9PSAwKQorCQlmcmFtZV9kdXIgPSA5NjAwMCAvIDI0OworCisJcHRzX291dHNpZGUgPSAoKHVuc2lnbmVkIGxvbmcpIHZoMjY0bXZjX2Ftc3RyZWFtX2RlY19pbmZvLnBhcmFtKSAmIDB4MDE7CisJc3luY19vdXRzaWRlID0gKCh1bnNpZ25lZCBsb25nKSB2aDI2NG12Y19hbXN0cmVhbV9kZWNfaW5mby5wYXJhbSAmIDB4MDIpCisJCQk+PiAxOworCUlOSVRfV09SSygmYWxsb2Nfd29yaywgZG9fYWxsb2Nfd29yayk7CisKKwltYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZ1swXSA9IC0xOworCW1heF9kZWNfZnJhbWVfYnVmZmVyaW5nWzFdID0gLTE7CisJZmlsbF9wdHIgPSBnZXRfcHRyID0gcHV0X3B0ciA9IHB1dHRpbmdfcHRyID0gMDsKKwlkaXJ0eV9mcmFtZV9udW0gPSAwOworCWZvciAoaSA9IDA7IGkgPCBERUNPREVfQlVGRkVSX05VTV9NQVg7IGkrKykgeworCQl2aWV3MF92ZmJ1Zl91c2VbaV0gPSAwOworCQl2aWV3MV92ZmJ1Zl91c2VbaV0gPSAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBWRl9QT09MX1NJWkU7IGkrKykgeworCQl2ZnBvb2xfaWR4W2ldLmRpc3BsYXlfcG9zID0gLTE7CisJCXZmcG9vbF9pZHhbaV0udmlldzBfYnVmX2lkID0gRElTUExBWV9JTlZBTElEX1BPUzsKKwkJdmZwb29sX2lkeFtpXS52aWV3MV9idWZfaWQgPSAtMTsKKwkJdmZwb29sX2lkeFtpXS52aWV3MF9kcm9wID0gMDsKKwkJdmZwb29sX2lkeFtpXS52aWV3MV9kcm9wID0gMDsKKwkJdmZwb29sX2lkeFtpXS51c2VkID0gMDsKKwl9CisJZm9yIChpID0gMDsgaSA8IFZGX1BPT0xfU0laRTsgaSsrKSB7CisJCW1lbXNldCgmdmZwb29sW2ldLCAwLCBzaXplb2Yoc3RydWN0IHZmcmFtZV9zKSk7CisJCXZmcG9vbFtpXS5pbmRleCA9IGk7CisJfQorCWluaXRfdmZfYnVmKCk7CisKKwlpZiAobW1fYmxrX2hhbmRsZSkgeworCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWUobW1fYmxrX2hhbmRsZSk7CisJCW1tX2Jsa19oYW5kbGUgPSBOVUxMOworCX0KKworCW1tX2Jsa19oYW5kbGUgPSBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2JveCgKKwkJRFJJVkVSX05BTUUsCisJCTAsCisJCVRPVEFMX0JNTVVfQlVGRl9OVU0sCisJCTQgKyBQQUdFX1NISUZULAorCQlDT0RFQ19NTV9GTEFHU19DTUFfQ0xFQVIgfAorCQlDT0RFQ19NTV9GTEFHU19GT1JfVkRFQ09ERVIpOworCisJc2l6ZSA9IERFQ09ERVJfV09SS19TUEFDRV9TSVpFOworCXJldCA9IGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeShtbV9ibGtfaGFuZGxlLCAwLAorCQlzaXplLCBEUklWRVJfTkFNRSwgJndvcmtfc3BhY2VfYWRyKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzMzIgdmgyNjRtdmNfaW5pdCh2b2lkKQoreworCWludCByZXQgPSAtMTsKKwljaGFyICpidWYgPSB2bWFsbG9jKDB4MTAwMCAqIDE2KTsKKworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcl9pbmZvKCJcbnZoMjY0bXZjX2luaXRcbiIpOworCXRpbWVyX3NldHVwKCZyZWN5Y2xlX3RpbWVyLCB2aDI2NG12Y19wdXRfdGltZXJfZnVuYywgMCk7CisKKwlzdGF0IHw9IFNUQVRfVElNRVJfSU5JVDsKKworCXJldCA9IHZoMjY0bXZjX3ZkZWNfaW5mb19pbml0KCk7CisJaWYgKDAgIT0gcmV0KSB7CisJCXZmcmVlKGJ1Zik7CisJCXJldHVybiAtcmV0OworCX0KKworCXJldCA9IHZoMjY0bXZjX2xvY2FsX2luaXQoKTsKKwlpZiAocmV0IDwgMCkgeworCQl2ZnJlZShidWYpOworCQlyZXR1cm4gcmV0OworCX0KKworCWFtdmRlY19lbmFibGUoKTsKKworCWlmICh0ZWVfZW5hYmxlZCgpKSB7CisJCXJldCA9IGFtdmRlY19sb2FkbWNfZXgoVkZPUk1BVF9IMjY0TVZDLCBOVUxMLCBidWYpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCWFtdmRlY19kaXNhYmxlKCk7CisJCQl2ZnJlZShidWYpOworCQkJcHJfZXJyKCJIMjY0X01WQzogdGhlICVzIGZ3IGxvYWRpbmcgZmFpbGVkLCBlcnI6ICV4XG4iLAorCQkJCXRlZV9lbmFibGVkKCkgPyAiVEVFIiA6ICJsb2NhbCIsIHJldCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9IGVsc2UgeworCQkvKiAtLSB1Y29kZSBsb2FkaW5nIChhbXJpc2MgYW5kIHN3YXAgY29kZSkgKi8KKwkJbWNfY3B1X2FkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJTUNfVE9UQUxfU0laRSwgJm1jX2RtYV9oYW5kbGUsIEdGUF9LRVJORUwpOworCQlpZiAoIW1jX2NwdV9hZGRyKSB7CisJCQlhbXZkZWNfZGlzYWJsZSgpOworCQkJdmZyZWUoYnVmKTsKKwkJCXByX2VycigidmgyNjRfbXZjIGluaXQ6IENhbiBub3QgYWxsb2NhdGUgbWMgbWVtb3J5LlxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCVdSSVRFX1ZSRUcoVUNPREVfU1RBUlRfQUREUiwgbWNfZG1hX2hhbmRsZSk7CisKKwkJaWYgKGdldF9maXJtd2FyZV9kYXRhKFZJREVPX0RFQ19IMjY0X01WQywgYnVmKSA8IDApIHsKKwkJCXByX2VycigiZ2V0IGZpcm13YXJlIGZhaWwuIik7CisJCQl2ZnJlZShidWYpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJcmV0ID0gYW12ZGVjX2xvYWRtY19leChWRk9STUFUX0gyNjRNVkMsIE5VTEwsIGJ1Zik7CisKKwkJLypoZWFkZXIqLworCQltZW1jcHkoKHU4ICopIG1jX2NwdV9hZGRyLCBidWYgKyAweDEwMDAsIDB4MTAwMCk7CisJCS8qbW1jbyovCisJCW1lbWNweSgodTggKikgbWNfY3B1X2FkZHIgKyAweDEwMDAsIGJ1ZiArIDB4MjAwMCwgMHgyMDAwKTsKKwkJLypzbGljZSovCisJCW1lbWNweSgodTggKikgbWNfY3B1X2FkZHIgKyAweDMwMDAsIGJ1ZiArIDB4NDAwMCwgMHgzMDAwKTsKKworCQlpZiAocmV0IDwgMCkgeworCQkJYW12ZGVjX2Rpc2FibGUoKTsKKworCQkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCQlNQ19UT1RBTF9TSVpFLAorCQkJCQltY19jcHVfYWRkciwgbWNfZG1hX2hhbmRsZSk7CisJCQltY19jcHVfYWRkciA9IE5VTEw7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfQorCXZmcmVlKGJ1Zik7CisKKwlzdGF0IHw9IFNUQVRfTUNfTE9BRDsKKworCS8qIGVuYWJsZSBBTVJJU0Mgc2lkZSBwcm90b2NvbCAqLworCXZoMjY0bXZjX3Byb3RfaW5pdCgpOworCisjaWZkZWYgSEFORExFX2gyNjRtdmNfSVJRCisJaWYgKHZkZWNfcmVxdWVzdF9pcnEoVkRFQ19JUlFfMSwgdmgyNjRtdmNfaXNyLAorCQkJInZoMjY0bXZjLWlycSIsICh2b2lkICopdmgyNjRtdmNfZGVjX2lkKSkgeworCQlwcl9pbmZvKCJ2aDI2NG12YyBpcnEgcmVnaXN0ZXIgZXJyb3IuXG4iKTsKKwkJYW12ZGVjX2Rpc2FibGUoKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorI2VuZGlmCisKKwlzdGF0IHw9IFNUQVRfSVNSX1JFRzsKKworCXZmX3Byb3ZpZGVyX2luaXQoJnZoMjY0bXZjX3ZmX3Byb3YsIFBST1ZJREVSX05BTUUsCisJCQkJCSAmdmgyNjRtdmNfdmZfcHJvdmlkZXIsIE5VTEwpOworCXZmX3JlZ19wcm92aWRlcigmdmgyNjRtdmNfdmZfcHJvdik7CisJdmZfbm90aWZ5X3JlY2VpdmVyKFBST1ZJREVSX05BTUUsIFZGUkFNRV9FVkVOVF9QUk9WSURFUl9TVEFSVCwgTlVMTCk7CisKKwlzdGF0IHw9IFNUQVRfVkZfSE9PSzsKKworCXJlY3ljbGVfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBQVVRfSU5URVJWQUw7CisJYWRkX3RpbWVyKCZyZWN5Y2xlX3RpbWVyKTsKKworCXN0YXQgfD0gU1RBVF9USU1FUl9BUk07CisKKwlhbXZkZWNfc3RhcnQoKTsKKworCXN0YXQgfD0gU1RBVF9WREVDX1JVTjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZoMjY0bXZjX3N0b3Aodm9pZCkKK3sKKwlpZiAoc3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJYW12ZGVjX3N0b3AoKTsKKwkJc3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwl9CisKKwlpZiAoc3RhdCAmIFNUQVRfSVNSX1JFRykgeworCQlXUklURV9WUkVHKEFTU0lTVF9NQk9YMV9NQVNLLCAwKTsKKyNpZmRlZiBIQU5ETEVfaDI2NG12Y19JUlEKKwkJdmRlY19mcmVlX2lycShWREVDX0lSUV8xLCAodm9pZCAqKXZoMjY0bXZjX2RlY19pZCk7CisjZW5kaWYKKwkJc3RhdCAmPSB+U1RBVF9JU1JfUkVHOworCX0KKworCWlmIChzdGF0ICYgU1RBVF9USU1FUl9BUk0pIHsKKwkJZGVsX3RpbWVyX3N5bmMoJnJlY3ljbGVfdGltZXIpOworCQlzdGF0ICY9IH5TVEFUX1RJTUVSX0FSTTsKKwl9CisKKwlpZiAoc3RhdCAmIFNUQVRfVkZfSE9PSykgeworCQl1bG9uZyBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CisJCXZmX3VucmVnX3Byb3ZpZGVyKCZ2aDI2NG12Y192Zl9wcm92KTsKKwkJc3RhdCAmPSB+U1RBVF9WRl9IT09LOworCX0KKworCWlmIChzdGF0ICYgU1RBVF9NQ19MT0FEKSB7CisJCWlmIChtY19jcHVfYWRkciAhPSBOVUxMKSB7CisJCQlkbWFfZnJlZV9jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJTUNfVE9UQUxfU0laRSwgbWNfY3B1X2FkZHIsIG1jX2RtYV9oYW5kbGUpOworCQkJbWNfY3B1X2FkZHIgPSBOVUxMOworCQl9CisKKwkJc3RhdCAmPSB+U1RBVF9NQ19MT0FEOworCX0KKworCWFtdmRlY19kaXNhYmxlKCk7CisKKwlpZiAobW1fYmxrX2hhbmRsZSkgeworCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWUobW1fYmxrX2hhbmRsZSk7CisJCW1tX2Jsa19oYW5kbGUgPSBOVUxMOworCX0KKwl1bmluaXRfdmZfYnVmKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVycm9yX2RvX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWlmIChhdG9taWNfcmVhZCgmdmgyNjRtdmNfYWN0aXZlKSkgeworCQl2aDI2NG12Y19zdG9wKCk7CisJCXZoMjY0bXZjX2luaXQoKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYW12ZGVjX2gyNjRtdmNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdmRlY19zICpwZGF0YSA9ICooc3RydWN0IHZkZWNfcyAqKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpbnQgY29uZmlnX3ZhbCA9IDA7CisKKwlwcl9pbmZvKCJhbXZkZWNfaDI2NG12YyBwcm9iZSBzdGFydC5cbiIpOworCW11dGV4X2xvY2soJnZoMjY0X212Y19tdXRleCk7CisKKyNpZiAwCisJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIW1lbSkgeworCQlwcl9pbmZvKCJcbmFtdmRlY19oMjY0bXZjIG1lbW9yeSByZXNvdXJjZSB1bmRlZmluZWQuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorI2VuZGlmCisKKwlpZiAocGRhdGEgPT0gTlVMTCkgeworCQltdXRleF91bmxvY2soJnZoMjY0X212Y19tdXRleCk7CisJCXByX2luZm8oIlxuYW12ZGVjX2gyNjRtdmMgbWVtb3J5IHJlc291cmNlIHVuZGVmaW5lZC5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAocGRhdGEtPnN5c19pbmZvKQorCQl2aDI2NG12Y19hbXN0cmVhbV9kZWNfaW5mbyA9ICpwZGF0YS0+c3lzX2luZm87CisKKwlpZiAocGRhdGEtPmNvbmZpZ19sZW4pIHsKKwkJcHJfaW5mbygicGRhdGEtPmNvbmZpZzogJXNcbiIsIHBkYXRhLT5jb25maWcpOworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgInBhcm1fdjRsX2J1ZmZlcl9tYXJnaW4iLAorCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlkeW5hbWljX2J1Zl9udW1fbWFyZ2luID0gY29uZmlnX3ZhbDsKKwl9CisKKwlwZGF0YS0+ZGVjX3N0YXR1cyA9IHZoMjY0bXZjX2RlY19zdGF0dXM7CisJLyogcGRhdGEtPnNldF90cmlja21vZGUgPSB2aDI2NG12Y19zZXRfdHJpY2ttb2RlOyAqLworCisJYnVmZmVyX3NwZWMwID0gKHN0cnVjdCBidWZmZXJfc3BlY19zICopdnphbGxvYygKKwkJc2l6ZW9mKHN0cnVjdCBidWZmZXJfc3BlY19zKSAqIE1BWF9CTU1VX0JVRkZFUl9OVU0gKiAyKTsKKwlpZiAoTlVMTCA9PSBidWZmZXJfc3BlYzApCisJCXJldHVybiAtRU5PTUVNOworCWJ1ZmZlcl9zcGVjMSA9ICZidWZmZXJfc3BlYzBbTUFYX0JNTVVfQlVGRkVSX05VTV07CisKKwlpZiAodmgyNjRtdmNfaW5pdCgpIDwgMCkgeworCQlwcl9pbmZvKCJcbmFtdmRlY19oMjY0bXZjIGluaXQgZmFpbGVkLlxuIik7CisJCWtmcmVlKGd2cyk7CisJCWd2cyA9IE5VTEw7CisJCXZmcmVlKGJ1ZmZlcl9zcGVjMCk7CisJCWJ1ZmZlcl9zcGVjMCA9IE5VTEw7CisJCW11dGV4X3VubG9jaygmdmgyNjRfbXZjX211dGV4KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJSU5JVF9XT1JLKCZlcnJvcl93ZF93b3JrLCBlcnJvcl9kb193b3JrKTsKKwlJTklUX1dPUksoJnNldF9jbGtfd29yaywgdmgyNjRfbXZjX3NldF9jbGspOworCXNwaW5fbG9ja19pbml0KCZtdmNfcnBfbG9jayk7CisKKwl2ZGVjID0gcGRhdGE7CisKKwlhdG9taWNfc2V0KCZ2aDI2NG12Y19hY3RpdmUsIDEpOworCisJbXV0ZXhfdW5sb2NrKCZ2aDI2NF9tdmNfbXV0ZXgpOworCisJcHJfaW5mbygiYW12ZGVjX2gyNjRtdmMgcHJvYmUgZW5kLlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbXZkZWNfaDI2NG12Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlwcl9pbmZvKCJhbXZkZWNfaDI2NG12Y19yZW1vdmVcbiIpOworCWNhbmNlbF93b3JrX3N5bmMoJmFsbG9jX3dvcmspOworCWNhbmNlbF93b3JrX3N5bmMoJmVycm9yX3dkX3dvcmspOworCWNhbmNlbF93b3JrX3N5bmMoJnNldF9jbGtfd29yayk7CisJdmgyNjRtdmNfc3RvcCgpOworCWZyYW1lX3dpZHRoID0gMDsKKwlmcmFtZV9oZWlnaHQgPSAwOworCXZkZWNfc291cmNlX2NoYW5nZWQoVkZPUk1BVF9IMjY0TVZDLCAwLCAwLCAwKTsKKwlhdG9taWNfc2V0KCZ2aDI2NG12Y19hY3RpdmUsIDApOworCisjaWZkZWYgREVCVUdfUFRTCisJcHJfaW5mbworCSgicHRzIG1pc3NlZCAlbGQsIHB0cyBoaXQgJWxkLCBwdHNfb3V0c2lkZSAlZCwgIiwKKwkgcHRzX21pc3NlZCwgcHRzX2hpdCwgcHRzX291dHNpZGUpOworCSBwcl9pbmZvKCJkdXJhdGlvbiAlZCwgc3luY19vdXRzaWRlICVkXG4iLAorCSBmcmFtZV9kdXIsIHN5bmNfb3V0c2lkZSk7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX1NLSVAKKwlwcl9pbmZvKCJ2aWV3X3RvdGFsID0gJWxkLCBkcm9wcGVkICVsZFxuIiwgdmlld190b3RhbCwgdmlld19kcm9wcGVkKTsKKyNlbmRpZgorCXZmcmVlKGJ1ZmZlcl9zcGVjMCk7CisJYnVmZmVyX3NwZWMwID0gTlVMTDsKKwlrZnJlZShndnMpOworCWd2cyA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFtdmRlY19oMjY0bXZjX2RyaXZlciA9IHsKKwkucHJvYmUgPSBhbXZkZWNfaDI2NG12Y19wcm9iZSwKKwkucmVtb3ZlID0gYW12ZGVjX2gyNjRtdmNfcmVtb3ZlLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kID0gYW12ZGVjX3N1c3BlbmQsCisJLnJlc3VtZSA9IGFtdmRlY19yZXN1bWUsCisjZW5kaWYKKwkuZHJpdmVyID0geworCQkubmFtZSA9IERSSVZFUl9OQU1FLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY29kZWNfcHJvZmlsZV90IGFtdmRlY19obXZjX3Byb2ZpbGUgPSB7CisJLm5hbWUgPSAiaG12YyIsCisJLnByb2ZpbGUgPSAiIgorfTsKK3N0YXRpYyBzdHJ1Y3QgY29kZWNfcHJvZmlsZV90IGFtdmRlY19obXZjX3Byb2ZpbGVfc2luZ2xlOworCitzdGF0aWMgc3RydWN0IG1jb25maWcgaDI2NG12Y19jb25maWdzW10gPSB7CisJTUNfUFUzMigic3RhdCIsICZzdGF0KSwKKwlNQ19QVTMyKCJkYmdfbW9kZSIsICZkYmdfbW9kZSksCisJTUNfUFUzMigidmlld19tb2RlIiwgJnZpZXdfbW9kZSksCisJTUNfUFUzMigiZGJnX2NtZCIsICZkYmdfY21kKSwKKwlNQ19QVTMyKCJkcm9wX3JhdGUiLCAmZHJvcF9yYXRlKSwKKwlNQ19QVTMyKCJkcm9wX3RocmVhZF9ob2xkIiwgJmRyb3BfdGhyZWFkX2hvbGQpLAorfTsKK3N0YXRpYyBzdHJ1Y3QgbWNvbmZpZ19ub2RlIGgyNjRtdmNfbm9kZTsKKworc3RhdGljIGludCBfX2luaXQgYW12ZGVjX2gyNjRtdmNfZHJpdmVyX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcHJfZGVidWcoImFtdmRlY19oMjY0bXZjIG1vZHVsZSBpbml0XG4iKTsKKworCWlmIChwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFtdmRlY19oMjY0bXZjX2RyaXZlcikpIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gcmVnaXN0ZXIgYW12ZGVjX2gyNjRtdmMgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJdmNvZGVjX3Byb2ZpbGVfcmVnaXN0ZXIoJmFtdmRlY19obXZjX3Byb2ZpbGUpOworCWFtdmRlY19obXZjX3Byb2ZpbGVfc2luZ2xlID0gYW12ZGVjX2htdmNfcHJvZmlsZTsKKwlhbXZkZWNfaG12Y19wcm9maWxlX3NpbmdsZS5uYW1lID0gImgyNjRtdmMiOworCXZjb2RlY19wcm9maWxlX3JlZ2lzdGVyKCZhbXZkZWNfaG12Y19wcm9maWxlX3NpbmdsZSk7CisJSU5JVF9SRUdfTk9ERV9DT05GSUdTKCJtZWRpYS5kZWNvZGVyIiwgJmgyNjRtdmNfbm9kZSwKKwkJImgyNjRtdmMiLCBoMjY0bXZjX2NvbmZpZ3MsIENPTkZJR19GT1JfUlcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYW12ZGVjX2gyNjRtdmNfZHJpdmVyX3JlbW92ZV9tb2R1bGUodm9pZCkKK3sKKwlwcl9kZWJ1ZygiYW12ZGVjX2gyNjRtdmMgbW9kdWxlIHJlbW92ZS5cbiIpOworCisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFtdmRlY19oMjY0bXZjX2RyaXZlcik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCittb2R1bGVfcGFyYW0oc3RhdCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHN0YXQsICJcbiBhbXZkZWNfaDI2NG12YyBzdGF0XG4iKTsKKworbW9kdWxlX3BhcmFtKGRiZ19tb2RlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGJnX21vZGUsICJcbiBhbXZkZWNfaDI2NG12YyBkYmcgbW9kZVxuIik7CisKK21vZHVsZV9wYXJhbShkeW5hbWljX2J1Zl9udW1fbWFyZ2luLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZHluYW1pY19idWZfbnVtX21hcmdpbiwgIlxuIGFtdmRlY19oMjY0bXZjIGR5bmFtaWNfYnVmX251bV9tYXJnaW5cbiIpOworCittb2R1bGVfcGFyYW0odmlld19tb2RlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Modmlld19tb2RlLCAiXG4gYW12ZGVjX2gyNjRtdmMgdmlldyBtb2RlXG4iKTsKKworbW9kdWxlX3BhcmFtKGRiZ19jbWQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkYmdfY21kLCAiXG4gYW12ZGVjX2gyNjRtdmMgY21kIG1vZGVcbiIpOworCittb2R1bGVfcGFyYW0oZHJvcF9yYXRlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZHJvcF9yYXRlLCAiXG4gYW12ZGVjX2gyNjRtdmMgZHJvcCByYXRlXG4iKTsKKworbW9kdWxlX3BhcmFtKGRyb3BfdGhyZWFkX2hvbGQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkcm9wX3RocmVhZF9ob2xkLCAiXG4gYW12ZGVjX2gyNjRtdmMgZHJvcCB0aHJlYWQgaG9sZFxuIik7Cittb2R1bGVfaW5pdChhbXZkZWNfaDI2NG12Y19kcml2ZXJfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoYW12ZGVjX2gyNjRtdmNfZHJpdmVyX3JlbW92ZV9tb2R1bGUpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFNTE9HSUMgaDI2NG12YyBWaWRlbyBEZWNvZGVyIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQ2hlbiBaaGFuZyA8Y2hlbi56aGFuZ0BhbWxvZ2ljLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9oMjY0X211bHRpL01ha2VmaWxlIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL2gyNjRfbXVsdGkvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFkZmI2YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9oMjY0X211bHRpL01ha2VmaWxlCkBAIC0wLDAgKzEsMiBAQAorb2JqLSQoQ09ORklHX0FNTE9HSUNfTUVESUFfVkRFQ19IMjY0X01VTFRJKSArPSBhbXZkZWNfbWgyNjQubworYW12ZGVjX21oMjY0LW9ianMgKz0gdm1oMjY0Lm8gaDI2NF9kcGIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL2gyNjRfbXVsdGkvaDI2NF9kcGIuYyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9oMjY0X211bHRpL2gyNjRfZHBiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJkOTYxMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9oMjY0X211bHRpL2gyNjRfZHBiLmMKQEAgLTAsMCArMSw2MDA4IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorKiBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqCisqIERlc2NyaXB0aW9uOgorKi8KKyNkZWZpbmUgREVCVUcKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL3ZkZWNfcmVnLmg+CisjaW5jbHVkZSAiLi4vdXRpbHMvdmRlYy5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2FtdmRlYy5oIgorCisjaW5jbHVkZSAiaDI2NF9kcGIuaCIKKworI2RlZmluZSBGUkFNRV9OVU1fTUFYX1NJWkUgMHgxMDAwMAorCisjdW5kZWYgcHJfaW5mbworI2RlZmluZSBwcl9pbmZvIHByaW50aworaW50IGRwYl9wcmludChpbnQgaW5kZXgsIGludCBkZWJ1Z19mbGFnLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwlpZiAoKChoMjY0X2RlYnVnX2ZsYWcgJiBkZWJ1Z19mbGFnKSAmJgorCQkoKDEgPDwgaW5kZXgpICYgaDI2NF9kZWJ1Z19tYXNrKSkKKwkJfHwgKGRlYnVnX2ZsYWcgPT0gUFJJTlRfRkxBR19FUlJPUikpIHsKKwkJdW5zaWduZWQgY2hhciAqYnVmID0ga3phbGxvYyg1MTIsIEdGUF9BVE9NSUMpOworCQlpbnQgbGVuID0gMDsKKwkJdmFfbGlzdCBhcmdzOworCisJCWlmICghYnVmKQorCQkJcmV0dXJuIDA7CisKKwkJdmFfc3RhcnQoYXJncywgZm10KTsKKwkJbGVuID0gc3ByaW50ZihidWYsICIlZDogIiwgaW5kZXgpOworCQl2c25wcmludGYoYnVmICsgbGVuLCA1MTItbGVuLCBmbXQsIGFyZ3MpOworCQlwcl9kZWJ1ZygiJXMiLCBidWYpOworCQl2YV9lbmQoYXJncyk7CisJCWtmcmVlKGJ1Zik7CisJfQorCXJldHVybiAwOworfQorCitpbnQgZHBiX3ByaW50X2NvbnQoaW50IGluZGV4LCBpbnQgZGVidWdfZmxhZywgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJaWYgKCgoaDI2NF9kZWJ1Z19mbGFnICYgZGVidWdfZmxhZykgJiYKKwkJKCgxIDw8IGluZGV4KSAmIGgyNjRfZGVidWdfbWFzaykpCisJCXx8IChkZWJ1Z19mbGFnID09IFBSSU5UX0ZMQUdfRVJST1IpKSB7CisJCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IGt6YWxsb2MoNTEyLCBHRlBfQVRPTUlDKTsKKwkJaW50IGxlbiA9IDA7CisJCXZhX2xpc3QgYXJnczsKKworCQlpZiAoIWJ1ZikKKwkJCXJldHVybiAwOworCisJCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJCXZzbnByaW50ZihidWYgKyBsZW4sIDUxMi1sZW4sIGZtdCwgYXJncyk7CisJCXByX2luZm8oIiVzIiwgYnVmKTsKKwkJdmFfZW5kKGFyZ3MpOworCQlrZnJlZShidWYpOworCX0KKwlyZXR1cm4gMDsKK30KKwordW5zaWduZWQgY2hhciBkcGJfaXNfZGVidWcoaW50IGluZGV4LCBpbnQgZGVidWdfZmxhZykKK3sKKwlpZiAoKChoMjY0X2RlYnVnX2ZsYWcgJiBkZWJ1Z19mbGFnKSAmJgorCQkoKDEgPDwgaW5kZXgpICYgaDI2NF9kZWJ1Z19tYXNrKSkKKwkJfHwgKGRlYnVnX2ZsYWcgPT0gUFJJTlRfRkxBR19FUlJPUikpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisjZGVmaW5lIENIRUNLX1ZBTElEKGxpc3Rfc2l6ZSwgbWFyaykge1wKKwlpZiAobGlzdF9zaXplID4gTUFYX0xJU1RfU0laRSB8fCBsaXN0X3NpemUgPCAwKSB7IFwKKwkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRVJST1IsIFwKKwkJIiVzKCVkKTogbGlzdFhzaXplWyVkXSAlZCBpcyBsYXJnZXIgdGhhbiBtYXggc2l6ZVxyXG4iLFwKKwkJX19mdW5jX18sIF9fTElORV9fLCBtYXJrLCBsaXN0X3NpemUpO1wKKwkJbGlzdF9zaXplID0gMDsgXAorCQlwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyA9IF9fTElORV9fO1wKKwl9IFwKKwl9CisKK3N0YXRpYyBzdHJ1Y3QgRGVjUmVmUGljTWFya2luZ19zCisJZHVtbXlfZGVjX3JlZl9waWNfbWFya2luZ19idWZmZXIKKwlbREVDX1JFRl9QSUNfTUFSS0lOR19CVUZGRVJfTlVNX01BWF07CitzdGF0aWMgc3RydWN0IFN0b3JhYmxlUGljdHVyZSBkdW1teV9waWM7CitzdGF0aWMgc3RydWN0IEZyYW1lU3RvcmUgZHVtbXlfZnM7CitzdGF0aWMgc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqZ2V0X25ld19waWMoCisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIsCisJZW51bSBQaWN0dXJlU3RydWN0dXJlIHN0cnVjdHVyZSwgdW5zaWduZWQgY2hhciBpc19vdXRwdXQpOworCisKK3N0YXRpYyB2b2lkIGluaXRfZHVtbXlfZnModm9pZCkKK3sKKwlkdW1teV9mcy5mcmFtZSA9ICZkdW1teV9waWM7CisJZHVtbXlfZnMudG9wX2ZpZWxkID0gJmR1bW15X3BpYzsKKwlkdW1teV9mcy5ib3R0b21fZmllbGQgPSAmZHVtbXlfcGljOworCisJZHVtbXlfcGljLnRvcF9maWVsZCA9ICZkdW1teV9waWM7CisJZHVtbXlfcGljLmJvdHRvbV9maWVsZCA9ICZkdW1teV9waWM7CisJZHVtbXlfcGljLmZyYW1lID0gJmR1bW15X3BpYzsKKworCWR1bW15X3BpYy5kZWNfcmVmX3BpY19tYXJraW5nX2J1ZmZlciA9CisJCSZkdW1teV9kZWNfcmVmX3BpY19tYXJraW5nX2J1ZmZlclswXTsKK30KKworZW51bSB7CisJTElTVF8wID0gMCwKKwlMSVNUXzEgPSAxLAorCUJJX1BSRUQgPSAyLAorCUJJX1BSRURfTDAgPSAzLAorCUJJX1BSRURfTDEgPSA0Cit9OworCit2b2lkIHJlZl9waWNfbGlzdF9yZW9yZGVyaW5nKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLAorCQkJCXN0cnVjdCBTbGljZSAqY3VyclNsaWNlKQoreworCS8qIHN0cnVjdCBWaWRlb1BhcmFtZXRlcnMgKnBfVmlkID0gY3VyclNsaWNlLT5wX1ZpZDsKKwkgKiAgIGJ5dGUgZFBfbnIgPSBhc3NpZ25TRTJwYXJ0aXRpb25bY3VyclNsaWNlLT5kcF9tb2RlXVtTRV9IRUFERVJdOworCSAqICAgRGF0YVBhcnRpdGlvbiAqcGFydGl0aW9uID0gJihjdXJyU2xpY2UtPnBhcnRBcnJbZFBfbnJdKTsKKwkgKiAgIEJpdHN0cmVhbSAqY3VyclN0cmVhbSA9IHBhcnRpdGlvbi0+Yml0c3RyZWFtOworCSAqLworCWludCBpLCBqLCB2YWw7CisJdW5zaWduZWQgc2hvcnQgKnJlb3JkZXJfY21kID0KKwkJJnBfSDI2NF9EcGItPmRwYl9wYXJhbS5tbWNvLmwwX3Jlb3JkZXJfY21kWzBdOworCS8qIGFsbG9jX3JlZl9waWNfbGlzdF9yZW9yZGVyaW5nX2J1ZmZlcihjdXJyU2xpY2UpOyAqLworCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCSIlc1xuIiwgX19mdW5jX18pOworCWlmIChjdXJyU2xpY2UtPnNsaWNlX3R5cGUgIT0gSV9TTElDRSAmJgorCQljdXJyU2xpY2UtPnNsaWNlX3R5cGUgIT0gU0lfU0xJQ0UpIHsKKwkJLyogdmFsID0gY3VyclNsaWNlLT5yZWZfcGljX2xpc3RfcmVvcmRlcmluZ19mbGFnW0xJU1RfMF0gPQorCQkgKglyZWFkX3VfMSAoIlNIOiByZWZfcGljX2xpc3RfcmVvcmRlcmluZ19mbGFnX2wwIiwKKwkJICoJCWN1cnJTdHJlYW0sICZwX0RlYy0+VXNlZEJpdHMpOworCQkgKi8KKwkJaWYgKHJlb3JkZXJfY21kWzBdICE9IDMpIHsKKwkJCXZhbCA9IGN1cnJTbGljZS0+CisJCQkJcmVmX3BpY19saXN0X3Jlb3JkZXJpbmdfZmxhZ1tMSVNUXzBdID0gMTsKKwkJfSBlbHNlIHsKKwkJCXZhbCA9IGN1cnJTbGljZS0+CisJCQkJcmVmX3BpY19saXN0X3Jlb3JkZXJpbmdfZmxhZ1tMSVNUXzBdID0gMDsKKwkJfQorCQlpZiAodmFsKSB7CisJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJIiVzLCByZWZfcGljX2xpc3RfcmVvcmRlcmluZ19mbGFnW0xJU1RfMF0gaXMgMVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisKKwkJCWogPSAwOworCQkJaSA9IDA7CisJCQlkbyB7CisJCQkJdmFsID0gY3VyclNsaWNlLT4KKwkJCQltb2RpZmljYXRpb25fb2ZfcGljX251bXNfaWRjW0xJU1RfMF1baV0gPQorCQkJCQkgICAgICByZW9yZGVyX2NtZFtqKytdOworCQkJCS8qIHJlYWRfdWVfdigKKwkJCQkgKgkiU0g6IG1vZGlmaWNhdGlvbl9vZl9waWNfbnVtc19pZGNfbDAiLAorCQkJCSAqCWN1cnJTdHJlYW0sICZwX0RlYy0+VXNlZEJpdHMpOworCQkJCSAqLworCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJCSIlZCglZCk6dmFsICV4XG4iLCBpLCBqLCB2YWwpOworCQkJCWlmIChqID49IDY2KSB7CisJCQkJCWN1cnJTbGljZS0+CisJCQkJCXJlZl9waWNfbGlzdF9yZW9yZGVyaW5nX2ZsYWdbTElTVF8wXSA9CisJCQkJCTA7IC8qIGJ5IHJhaW4gKi8KKwkJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCQlQUklOVF9GTEFHX0VSUk9SLAorCQkJCQkJIiVzIGVycm9yXG4iLCBfX2Z1bmNfXyk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAodmFsID09IDAgfHwgdmFsID09IDEpIHsKKwkJCQkJY3VyclNsaWNlLT4KKwkJCQkJYWJzX2RpZmZfcGljX251bV9taW51czFbTElTVF8wXVtpXSA9CisJCQkJCXJlb3JkZXJfY21kW2orK107CisJCQkJCS8qIHJlYWRfdWVfdigiU0g6ICIKKwkJCQkJICoiYWJzX2RpZmZfcGljX251bV9taW51czFfbDAiLAorCQkJCQkgKmN1cnJTdHJlYW0sICZwX0RlYy0+VXNlZEJpdHMpOworCQkJCQkgKi8KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAodmFsID09IDIpIHsKKwkJCQkJCWN1cnJTbGljZS0+CisJCQkJCQlsb25nX3Rlcm1fcGljX2lkeFtMSVNUXzBdW2ldID0KKwkJCQkJCXJlb3JkZXJfY21kW2orK107CisJCQkJCQkvKiByZWFkX3VlX3YoCisJCQkJCQkgKiJTSDogbG9uZ190ZXJtX3BpY19pZHhfbDAiLAorCQkJCQkJICpjdXJyU3RyZWFtLAorCQkJCQkJIComcF9EZWMtPlVzZWRCaXRzKTsKKwkJCQkJCSAqLworCQkJCQl9CisJCQkJfQorCQkJCWkrKzsKKwkJCQkvKiBhc3NlcnQgKGk+Y3VyclNsaWNlLT4KKwkJCQkgKgludW1fcmVmX2lkeF9hY3RpdmVbTElTVF8wXSk7CisJCQkJICovCisJCQkJaWYgKAorCisvKgorICoJCQkJICAgICBpPmN1cnJTbGljZS0+bnVtX3JlZl9pZHhfYWN0aXZlW0xJU1RfMF0gfHwKKyAqLworCQkJCQlpID49IFJFT1JERVJJTkdfQ09NTUFORF9NQVhfU0laRSkgeworCQkJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkJCSIlcyBlcnJvciAlZCAlZFxuIiwKKwkJCQkJCV9fZnVuY19fLCBpLAorCQkJCQkJY3VyclNsaWNlLT4KKwkJCQkJCW51bV9yZWZfaWR4X2FjdGl2ZVtMSVNUXzBdKTsKKwkJCQkJY3VyclNsaWNlLT4KKwkJCQkJcmVmX3BpY19saXN0X3Jlb3JkZXJpbmdfZmxhZ1tMSVNUXzBdID0KKwkJCQkJMDsgLyogYnkgcmFpbiAqLworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKGogPj0gNjYpIHsKKwkJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCQlQUklOVF9GTEFHX0VSUk9SLCAiJXMgZXJyb3JcbiIsCisJCQkJCQlfX2Z1bmNfXyk7CisJCQkJCWN1cnJTbGljZS0+CisJCQkJCXJlZl9waWNfbGlzdF9yZW9yZGVyaW5nX2ZsYWdbTElTVF8wXSA9CisJCQkJCTA7IC8qIGJ5IHJhaW4gKi8KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQl9IHdoaWxlICh2YWwgIT0gMyk7CisJCX0KKwl9CisKKwlpZiAoY3VyclNsaWNlLT5zbGljZV90eXBlID09IEJfU0xJQ0UpIHsKKwkJcmVvcmRlcl9jbWQgPSAmcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLm1tY28ubDFfcmVvcmRlcl9jbWRbMF07CisJCS8qIHZhbCA9IGN1cnJTbGljZS0+cmVmX3BpY19saXN0X3Jlb3JkZXJpbmdfZmxhZ1tMSVNUXzFdCisJCSAqPSByZWFkX3VfMSAoIlNIOiByZWZfcGljX2xpc3RfcmVvcmRlcmluZ19mbGFnX2wxIiwKKwkJICpjdXJyU3RyZWFtLAorCQkgKiZwX0RlYy0+VXNlZEJpdHMpOworCQkgKi8KKworCQlpZiAocmVvcmRlcl9jbWRbMF0gIT0gMykgeworCQkJdmFsID0KKwkJCWN1cnJTbGljZS0+cmVmX3BpY19saXN0X3Jlb3JkZXJpbmdfZmxhZ1tMSVNUXzFdID0gMTsKKwkJfSBlbHNlIHsKKwkJCXZhbCA9CisJCQljdXJyU2xpY2UtPnJlZl9waWNfbGlzdF9yZW9yZGVyaW5nX2ZsYWdbTElTVF8xXSA9IDA7CisJCX0KKworCQlpZiAodmFsKSB7CisJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJIiVzLCByZWZfcGljX2xpc3RfcmVvcmRlcmluZ19mbGFnW0xJU1RfMV0gaXMgMVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisKKwkJCWogPSAwOworCQkJaSA9IDA7CisJCQlkbyB7CisJCQkJdmFsID0gY3VyclNsaWNlLT4KKwkJCQltb2RpZmljYXRpb25fb2ZfcGljX251bXNfaWRjW0xJU1RfMV1baV0gPQorCQkJCXJlb3JkZXJfY21kW2orK107CisJCQkJLyogcmVhZF91ZV92KAorCQkJCSAqIlNIOiBtb2RpZmljYXRpb25fb2ZfcGljX251bXNfaWRjX2wxIiwKKwkJCQkgKmN1cnJTdHJlYW0sCisJCQkJIComcF9EZWMtPlVzZWRCaXRzKTsKKwkJCQkgKi8KKwkJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJCQkiJWQoJWQpOnZhbCAleFxuIiwKKwkJCQkJaSwgaiwgdmFsKTsKKwkJCQlpZiAoaiA+PSA2NikgeworCQkJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQkJCVBSSU5UX0ZMQUdfRVJST1IsICIlcyBlcnJvclxuIiwKKwkJCQkJCV9fZnVuY19fKTsKKwkJCQkJY3VyclNsaWNlLT4KKwkJCQkJcmVmX3BpY19saXN0X3Jlb3JkZXJpbmdfZmxhZ1tMSVNUXzFdID0KKwkJCQkJMDsgIC8qIGJ5IHJhaW4gKi8KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmICh2YWwgPT0gMCB8fCB2YWwgPT0gMSkgeworCQkJCQljdXJyU2xpY2UtPgorCQkJCQlhYnNfZGlmZl9waWNfbnVtX21pbnVzMVtMSVNUXzFdW2ldID0KKwkJCQkJCXJlb3JkZXJfY21kW2orK107CisJCQkJCS8qIHJlYWRfdWVfdigKKwkJCQkJICoiU0g6IGFic19kaWZmX3BpY19udW1fbWludXMxX2wxIiwKKwkJCQkJICpjdXJyU3RyZWFtLCAmcF9EZWMtPlVzZWRCaXRzKTsKKwkJCQkJICovCisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHZhbCA9PSAyKSB7CisJCQkJCQljdXJyU2xpY2UtPgorCQkJCQkJbG9uZ190ZXJtX3BpY19pZHhbTElTVF8xXVtpXSA9CisJCQkJCQlyZW9yZGVyX2NtZFtqKytdOworCQkJCQkJLyogcmVhZF91ZV92KAorCQkJCQkJICoiU0g6IGxvbmdfdGVybV9waWNfaWR4X2wxIiwKKwkJCQkJCSAqY3VyclN0cmVhbSwKKwkJCQkJCSAqJnBfRGVjLT5Vc2VkQml0cyk7CisJCQkJCQkgKi8KKwkJCQkJfQorCQkJCX0KKwkJCQlpKys7CisJCQkJLyogYXNzZXJ0KGk+Y3VyclNsaWNlLT4KKwkJCQkgKgludW1fcmVmX2lkeF9hY3RpdmVbTElTVF8xXSk7CisJCQkJICovCisJCQkJaWYgKAorCQkJCS8qaT5jdXJyU2xpY2UtPm51bV9yZWZfaWR4X2FjdGl2ZVtMSVNUXzFdIHx8ICovCisJCQkJCWkgPj0gUkVPUkRFUklOR19DT01NQU5EX01BWF9TSVpFKSB7CisJCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJCQkJIiVzIGVycm9yICVkICVkXG4iLAorCQkJCQkJX19mdW5jX18sIGksCisJCQkJCQljdXJyU2xpY2UtPgorCQkJCQkJbnVtX3JlZl9pZHhfYWN0aXZlW0xJU1RfMF0pOworCQkJCQljdXJyU2xpY2UtPgorCQkJCQlyZWZfcGljX2xpc3RfcmVvcmRlcmluZ19mbGFnW0xJU1RfMV0gPQorCQkJCQkwOyAgLyogYnkgcmFpbiAqLworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKGogPj0gNjYpIHsKKwkJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCQlQUklOVF9GTEFHX0VSUk9SLAorCQkJCQkJIiVzIGVycm9yXG4iLCBfX2Z1bmNfXyk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gd2hpbGUgKHZhbCAhPSAzKTsKKwkJfQorCX0KKworCS8qIHNldCByZWZlcmVuY2UgaW5kZXggb2YgcmVkdW5kYW50IHNsaWNlcy4gKi8KKwkvKgorCSAqaWYgKGN1cnJTbGljZS0+cmVkdW5kYW50X3BpY19jbnQgJiYKKwkgKihjdXJyU2xpY2UtPnNsaWNlX3R5cGUgIT0gSV9TTElDRSkpCisJICp7CisJICogIGN1cnJTbGljZS0+cmVkdW5kYW50X3NsaWNlX3JlZl9pZHggPQorCSAqCWN1cnJTbGljZS0+YWJzX2RpZmZfcGljX251bV9taW51czFbTElTVF8wXVswXSArIDE7CisJICp9CisJICovCit9CisKK3ZvaWQgc2xpY2VfcHJlcGFyZShzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiwKKwkJc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYiwKKwkJc3RydWN0IFZpZGVvUGFyYW1ldGVycyAqcF9WaWQsCisJCXN0cnVjdCBTUFNQYXJhbWV0ZXJzICpzcHMsIHN0cnVjdCBTbGljZSAqcFNsaWNlKQoreworCWludCBpLCBqOworCS8qIHBfVmlkLT5hY3RpdmVfc3BzID0gc3BzOyAqLworCXVuc2lnbmVkIHNob3J0ICptbWNvX2NtZCA9ICZwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubW1jby5tbWNvX2NtZFswXTsKKwkvKiBmb3IgZGVjb2RlX3BvYyAqLworCXNwcy0+cGljX29yZGVyX2NudF90eXBlID0KKwkJcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtQSUNfT1JERVJfQ05UX1RZUEVdOworCXNwcy0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ID0KKwkJcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtMT0cyX01BWF9QSUNfT1JERVJfQ05UX0xTQl0gLSA0OworCXNwcy0+bnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSA9CisJCXBfSDI2NF9EcGItPgorCQlkcGJfcGFyYW0ubC5kYXRhW05VTV9SRUZfRlJBTUVTX0lOX1BJQ19PUkRFUl9DTlRfQ1lDTEVdOworCWZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKwkJc3BzLT5vZmZzZXRfZm9yX3JlZl9mcmFtZVtpXSA9CisJCQkoc2hvcnQpIHBfSDI2NF9EcGItPgorCQkJZHBiX3BhcmFtLm1tY28ub2Zmc2V0X2Zvcl9yZWZfZnJhbWVfYmFzZVtpXTsKKwlzcHMtPm9mZnNldF9mb3Jfbm9uX3JlZl9waWMgPQorCQkoc2hvcnQpIHBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbT0ZGU0VUX0ZPUl9OT05fUkVGX1BJQ107CisJc3BzLT5vZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQgPQorCQkoc2hvcnQpIHBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGEKKwkJW09GRlNFVF9GT1JfVE9QX1RPX0JPVFRPTV9GSUVMRF07CisKKwlwU2xpY2UtPmZyYW1lX251bSA9IHBfSDI2NF9EcGItPmRwYl9wYXJhbS5kcGIuZnJhbWVfbnVtOworCXBTbGljZS0+aWRyX2ZsYWcgPQorCQkocF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmRwYi5OQUxfaW5mb19tbWNvICYgMHgxZikKKwkJPT0gNSA/IDEgOiAwOworCXBTbGljZS0+bmFsX3JlZmVyZW5jZV9pZGMgPQorCQkocF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmRwYi5OQUxfaW5mb19tbWNvID4+IDUpCisJCSYgMHgzOworCXBTbGljZS0+cGljX29yZGVyX2NudF9sc2IgPQorCQlwX0gyNjRfRHBiLT5kcGJfcGFyYW0uZHBiLnBpY19vcmRlcl9jbnRfbHNiOworCXBTbGljZS0+ZmllbGRfcGljX2ZsYWcgPSAwOworCXBTbGljZS0+Ym90dG9tX2ZpZWxkX2ZsYWcgPSAwOworCXBTbGljZS0+ZGVsdGFfcGljX29yZGVyX2NudF9ib3R0b20gPSB2YWwoCisJCXBfSDI2NF9EcGItPmRwYl9wYXJhbS5kcGIuZGVsdGFfcGljX29yZGVyX2NudF9ib3R0b20pOworCXBTbGljZS0+ZGVsdGFfcGljX29yZGVyX2NudFswXSA9IHZhbCgKKwkJcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmRwYi5kZWx0YV9waWNfb3JkZXJfY250XzApOworCXBTbGljZS0+ZGVsdGFfcGljX29yZGVyX2NudFsxXSA9IHZhbCgKKwkJcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmRwYi5kZWx0YV9waWNfb3JkZXJfY250XzEpOworCisJcF9WaWQtPmxhc3RfaGFzX21tY29fNSA9IDA7CisJLyogbGFzdCBtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbiBpcyA1ICovCisJcF9WaWQtPmxhc3RfcGljX2JvdHRvbV9maWVsZCA9IDA7CisJcF9WaWQtPm1heF9mcmFtZV9udW0gPSAxIDw8CisJKHBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbTE9HMl9NQVhfRlJBTUVfTlVNXSk7CisKKwkvKiovCisJcFNsaWNlLT5zdHJ1Y3R1cmUgPSAocF9IMjY0X0RwYi0+CisJCWRwYl9wYXJhbS5sLmRhdGFbTkVXX1BJQ1RVUkVfU1RSVUNUVVJFXSA9PSAzKSA/CisJCUZSQU1FIDogcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtORVdfUElDVFVSRV9TVFJVQ1RVUkVdOworCWlmIChwU2xpY2UtPnN0cnVjdHVyZSA9PSBGUkFNRSkgeworCQlwU2xpY2UtPmZpZWxkX3BpY19mbGFnID0gMDsKKwkJcFNsaWNlLT5ib3R0b21fZmllbGRfZmxhZyA9IDA7CisJfSBlbHNlIHsKKwkJcFNsaWNlLT5maWVsZF9waWNfZmxhZyA9IDE7CisJCWlmIChwU2xpY2UtPnN0cnVjdHVyZSA9PSBUT1BfRklFTEQpCisJCQlwU2xpY2UtPmJvdHRvbV9maWVsZF9mbGFnID0gMDsKKwkJZWxzZQorCQkJcFNsaWNlLT5ib3R0b21fZmllbGRfZmxhZyA9IDE7CisJfQorCXBTbGljZS0+cGljX3N0cnVjdCA9IHBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbUElDVFVSRV9TVFJVQ1RdOworCisJc3BzLT5udW1fcmVmX2ZyYW1lcyA9IHBfSDI2NF9EcGItPgorCQlkcGJfcGFyYW0ubC5kYXRhW01BWF9SRUZFUkVOQ0VfRlJBTUVfTlVNXTsKKwlzcHMtPnByb2ZpbGVfaWRjID0KKwkJIChwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW1BST0ZJTEVfSURDX01NQ09dID4+IDgpICYgMHhmZjsKKwkvKnNwcy0+bWF4X2RwYl9zaXplID0gcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtNQVhfRFBCX1NJWkVdOyovCisJaWYgKHBTbGljZS0+aWRyX2ZsYWcpIHsKKwkJcFNsaWNlLT5sb25nX3Rlcm1fcmVmZXJlbmNlX2ZsYWcgPSBtbWNvX2NtZFswXSAmIDE7CisJCXBTbGljZS0+bm9fb3V0cHV0X29mX3ByaW9yX3BpY3NfZmxhZyA9IChtbWNvX2NtZFswXSA+PiAxKSAmIDE7CisJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCSJJRFI6IGxvbmdfdGVybV9yZWZlcmVuY2VfZmxhZyAlZCBub19vdXRwdXRfb2ZfcHJpb3JfcGljc19mbGFnICVkXHJcbiIsCisJCXBTbGljZS0+bG9uZ190ZXJtX3JlZmVyZW5jZV9mbGFnLAorCQlwU2xpY2UtPm5vX291dHB1dF9vZl9wcmlvcl9waWNzX2ZsYWcpOworCisJCXBfSDI2NF9EcGItPmxvbmdfdGVybV9yZWZlcmVuY2VfZmxhZyA9IHBTbGljZS0+bG9uZ190ZXJtX3JlZmVyZW5jZV9mbGFnOworCisJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCSJpZHIgc2V0IHByZV9mcmFtZV9udW0oJWQpIHRvIGZyYW1lX251bSAoJWQpXG4iLAorCQlwX1ZpZC0+cHJlX2ZyYW1lX251bSwgcFNsaWNlLT5mcmFtZV9udW0pOworCisJCXBfVmlkLT5wcmVfZnJhbWVfbnVtID0gcFNsaWNlLT5mcmFtZV9udW07CisJfSBlbHNlIGlmIChwX0gyNjRfRHBiLT5tRFBCLmZpcnN0X3BpY19kb25lID09IDApIHsKKwkJLyogYnkgcmFpbgorCQkgaGFuZGxlIHRoZSBjYXNlIHdoZW4gZmlyc3Qgc2xpY2UgaXMgSSBpbnN0ZWFkIG9mIElEUgorCQkqLworCQlwX1ZpZC0+cHJlX2ZyYW1lX251bSA9IHBTbGljZS0+ZnJhbWVfbnVtOworCX0KKwkvKiBwU2xpY2UtPmFkYXB0aXZlX3JlZl9waWNfYnVmZmVyaW5nX2ZsYWc7ICovCisJc3BzLT5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ID0KKwkJcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtMT0cyX01BWF9GUkFNRV9OVU1dIC0gNDsKKwlzcHMtPmZyYW1lX251bV9nYXBfYWxsb3dlZCA9IHBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbRlJBTUVfTlVNX0dBUF9BTExPV0VEXTsKKworCXBfVmlkLT5ub25fY29uZm9ybWluZ19zdHJlYW0gPQorCQlwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW05PTl9DT05GT1JNSU5HX1NUUkVBTV07CisJcF9WaWQtPnJlY292ZXJ5X3BvaW50ID0KKwkJcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtSRUNPVkVSWV9QT0lOVF07CisJc3dpdGNoIChwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW1NMSUNFX1RZUEVdKSB7CisJY2FzZSBJX1NsaWNlOgorCQlwU2xpY2UtPnNsaWNlX3R5cGUgPSBJX1NMSUNFOworCQlicmVhazsKKwljYXNlIFBfU2xpY2U6CisJCXBTbGljZS0+c2xpY2VfdHlwZSA9IFBfU0xJQ0U7CisJCWJyZWFrOworCWNhc2UgQl9TbGljZToKKwkJcFNsaWNlLT5zbGljZV90eXBlID0gQl9TTElDRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcFNsaWNlLT5zbGljZV90eXBlID0gTlVNX1NMSUNFX1RZUEVTOworCQlicmVhazsKKwl9CisKKwlwU2xpY2UtPm51bV9yZWZfaWR4X2FjdGl2ZVtMSVNUXzBdID0KKwkJcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmRwYi5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxICsKKwkJMTsKKwkvKiBwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW1BQU19OVU1fUkVGX0lEWF9MMF9BQ1RJVkVfTUlOVVMxXTsgKi8KKwlwU2xpY2UtPm51bV9yZWZfaWR4X2FjdGl2ZVtMSVNUXzFdID0KKwkJcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmRwYi5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxICsKKwkJMTsKKwkvKiBwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW1BQU19OVU1fUkVGX0lEWF9MMV9BQ1RJVkVfTUlOVVMxXTsgKi8KKworCXBTbGljZS0+cF9WaWQgPSBwX1ZpZDsKKwlwU2xpY2UtPnBfRHBiID0gcF9EcGI7CisJLyoKKwlwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX3NpemUgPQorCQlwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW0ZSQU1FX1NJWkVfSU5fTUJdICogOTY7Ki8KKwlwU2xpY2UtPmZpcnN0X21iX2luX3NsaWNlID0KKwkJcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtGSVJTVF9NQl9JTl9TTElDRV07CisJcFNsaWNlLT5tb2RlXzh4OF9mbGFncyA9IHBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbTU9ERV84WDhfRkxBR1NdOworCXBTbGljZS0+cGljdHVyZV9zdHJ1Y3R1cmVfbW1jbyA9CisJCXBfSDI2NF9EcGItPmRwYl9wYXJhbS5kcGIucGljdHVyZV9zdHJ1Y3R1cmVfbW1jbzsKKwlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCSIlcyBzbGljZV90eXBlIGlzICVkLCBudW1fcmVmX2lkeF9hY3RpdmVbMCwxXT0lZCwlZCBuYWxfcmVmZXJlbmNlX2lkYyAlZCBwaWMgc3RydWN0IDB4JXgobW1jbyBzdHJ1IDB4JXgpXG4iLAorCQkgIF9fZnVuY19fLCBwU2xpY2UtPnNsaWNlX3R5cGUsCisJCSAgcFNsaWNlLT5udW1fcmVmX2lkeF9hY3RpdmVbTElTVF8wXSwKKwkJICBwU2xpY2UtPm51bV9yZWZfaWR4X2FjdGl2ZVtMSVNUXzFdLAorCQkgIHBTbGljZS0+bmFsX3JlZmVyZW5jZV9pZGMsCisJCSAgcFNsaWNlLT5zdHJ1Y3R1cmUsCisJCSAgcFNsaWNlLT5waWN0dXJlX3N0cnVjdHVyZV9tbWNvKTsKKyNpZmRlZiBFUlJPUl9DSEVDSworCWlmIChwU2xpY2UtPm51bV9yZWZfaWR4X2FjdGl2ZVtMSVNUXzBdID49IE1BWF9MSVNUX1NJWkUpIHsKKwkJcFNsaWNlLT5udW1fcmVmX2lkeF9hY3RpdmVbTElTVF8wXSA9IE1BWF9MSVNUX1NJWkUgLSAxOworCQlwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyA9IF9fTElORV9fOworCX0KKwlpZiAocFNsaWNlLT5udW1fcmVmX2lkeF9hY3RpdmVbTElTVF8xXSA+PSBNQVhfTElTVF9TSVpFKSB7CisJCXBTbGljZS0+bnVtX3JlZl9pZHhfYWN0aXZlW0xJU1RfMV0gPSBNQVhfTElTVF9TSVpFIC0gMTsKKwkJcF9IMjY0X0RwYi0+ZHBiX2Vycm9yX2ZsYWcgPSBfX0xJTkVfXzsKKwl9CisjZW5kaWYKKworI2lmIDEKKwkvKiBkZWNfcmVmX3BpY19tYXJraW5nX2J1ZmZlciAqLworCXBTbGljZS0+YWRhcHRpdmVfcmVmX3BpY19idWZmZXJpbmdfZmxhZyA9IDA7CisJaWYgKHBTbGljZS0+bmFsX3JlZmVyZW5jZV9pZGMpIHsKKwkJZm9yIChpID0gMCwgaiA9IDA7IGkgPCA0NDsgaisrKSB7CisJCQl1bnNpZ25lZCBzaG9ydCB2YWw7CisJCQlzdHJ1Y3QgRGVjUmVmUGljTWFya2luZ19zICp0bXBfZHJwbSA9CisJCQkJJnBTbGljZS0+ZGVjX3JlZl9waWNfbWFya2luZ19idWZmZXJbal07CisJCQltZW1zZXQodG1wX2RycG0sIDAsIHNpemVvZihzdHJ1Y3QgRGVjUmVmUGljTWFya2luZ19zKSk7CisJCQl2YWwgPSB0bXBfZHJwbS0+CisJCQkJbWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24gPQorCQkJCQltbWNvX2NtZFtpKytdOworCQkJdG1wX2RycG0tPk5leHQgPSBOVUxMOworCQkJaWYgKGogPiAwKSB7CisJCQkJcFNsaWNlLT4KKwkJCQlkZWNfcmVmX3BpY19tYXJraW5nX2J1ZmZlcltqIC0gMV0uTmV4dCA9CisJCQkJCXRtcF9kcnBtOworCQkJfQorCQkJaWYgKHZhbCA9PSAwIHx8IGkgPj0gNDQpCisJCQkJYnJlYWs7CisJCQlwU2xpY2UtPmFkYXB0aXZlX3JlZl9waWNfYnVmZmVyaW5nX2ZsYWcgPSAxOworCQkJaWYgKCh2YWwgPT0gMSkgfHwgKHZhbCA9PSAzKSkgeworCQkJCXRtcF9kcnBtLT5kaWZmZXJlbmNlX29mX3BpY19udW1zX21pbnVzMSA9CisJCQkJCW1tY29fY21kW2krK107CisJCQl9CisJCQlpZiAodmFsID09IDIpCisJCQkJdG1wX2RycG0tPmxvbmdfdGVybV9waWNfbnVtID0gbW1jb19jbWRbaSsrXTsKKwkJCWlmIChpID49IDQ0KQorCQkJCWJyZWFrOworCQkJaWYgKCh2YWwgPT0gMykgfHwgKHZhbCA9PSA2KSkKKwkJCQl0bXBfZHJwbS0+bG9uZ190ZXJtX2ZyYW1lX2lkeCA9IG1tY29fY21kW2krK107CisJCQlpZiAodmFsID09IDQpIHsKKwkJCQl0bXBfZHJwbS0+bWF4X2xvbmdfdGVybV9mcmFtZV9pZHhfcGx1czEgPQorCQkJCQltbWNvX2NtZFtpKytdOworCQkJfQorCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJCSJkZWNfcmVmX3BpY19tYXJraW5nX2J1ZmZlclslZF06b3BlcmF0aW9uICV4IGRpZmZfcGljX21pbnVzMSAleCBsb25nX3BpY19udW0gJXggbG9uZ19mcmFtZV9pZHggJXggbWF4X2xvbmdfZnJhbWVfaWR4X3BsdXMxICV4XG4iLAorCQkJCWosCisJCQkJdG1wX2RycG0tPm1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uLAorCQkJCXRtcF9kcnBtLT5kaWZmZXJlbmNlX29mX3BpY19udW1zX21pbnVzMSwKKwkJCQl0bXBfZHJwbS0+bG9uZ190ZXJtX3BpY19udW0sCisJCQkJdG1wX2RycG0tPmxvbmdfdGVybV9mcmFtZV9pZHgsCisJCQkJdG1wX2RycG0tPm1heF9sb25nX3Rlcm1fZnJhbWVfaWR4X3BsdXMxKTsKKwkJfQorCX0KKworCXJlZl9waWNfbGlzdF9yZW9yZGVyaW5nKHBfSDI2NF9EcGIsIHBTbGljZSk7CisjZW5kaWYKKworCS8qVlVJKi8KKwlwX0gyNjRfRHBiLT52dWlfc3RhdHVzID0gcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtWVUlfU1RBVFVTXTsKKwlwX0gyNjRfRHBiLT5hc3BlY3RfcmF0aW9faWRjID0KKwkJcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtBU1BFQ1RfUkFUSU9fSURDXTsKKwlwX0gyNjRfRHBiLT5hc3BlY3RfcmF0aW9fc2FyX3dpZHRoID0KKwkJcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtBU1BFQ1RfUkFUSU9fU0FSX1dJRFRIXTsKKwlwX0gyNjRfRHBiLT5hc3BlY3RfcmF0aW9fc2FyX2hlaWdodCA9CisJCXBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbQVNQRUNUX1JBVElPX1NBUl9IRUlHSFRdOworCisJcF9IMjY0X0RwYi0+Zml4ZWRfZnJhbWVfcmF0ZV9mbGFnID0gcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVsKKwkJRklYRURfRlJBTUVfUkFURV9GTEFHXTsKKwlwX0gyNjRfRHBiLT5udW1fdW5pdHNfaW5fdGljayA9CisJCXBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbTlVNX1VOSVRTX0lOX1RJQ0tdOworCXBfSDI2NF9EcGItPnRpbWVfc2NhbGUgPSBwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW1RJTUVfU0NBTEVdIHwKKwkJKHBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbVElNRV9TQ0FMRSArIDFdIDw8IDE2KTsKKworCXBfSDI2NF9EcGItPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnID0KKwkJKHBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbU1BTX0ZMQUdTMl0gPj4gMykgJiAweDE7CisJcF9IMjY0X0RwYi0+bnVtX3Jlb3JkZXJfZnJhbWVzID0KKwkJcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtOVU1fUkVPUkRFUl9GUkFNRVNdOworCXBfSDI2NF9EcGItPm1heF9kZWNfZnJhbWVfYnVmZmVyaW5nID0KKwkJcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtNQVhfQlVGRkVSX0ZSQU1FXTsKKworCS8qKi8KKwlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkiJXMgcmV0dXJuXG4iLCBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9wb2Moc3RydWN0IFZpZGVvUGFyYW1ldGVycyAqcF9WaWQsIHN0cnVjdCBTbGljZSAqcFNsaWNlKQoreworCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gY29udGFpbmVyX29mKHBfVmlkLAorCQkJCQlzdHJ1Y3QgaDI2NF9kcGJfc3RydSwgbVZpZGVvKTsKKwlzdHJ1Y3QgU1BTUGFyYW1ldGVycyAqYWN0aXZlX3NwcyA9IHBfVmlkLT5hY3RpdmVfc3BzOworCWludCBpOworCS8qIGZvciBQT0MgbW9kZSAwOiAqLworCXVuc2lnbmVkIGludCBNYXhQaWNPcmRlckNudExzYiA9ICgxIDw8CisJCShhY3RpdmVfc3BzLT5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgKyA0KSk7CisKKwlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJUFJJTlRfRkxBR19ERUJVR19QT0MsCisJCSIlczpwaWNfb3JkZXJfY250X3R5cGUgJWQsIGlkcl9mbGFnICVkIGxhc3RfaGFzX21tY29fNSAlZCBsYXN0X3BpY19ib3R0b21fZmllbGQgJWQgcGljX29yZGVyX2NudF9sc2IgJWQgUHJldlBpY09yZGVyQ250THNiICVkXHJcbiIsCisJCV9fZnVuY19fLAorCQlhY3RpdmVfc3BzLT5waWNfb3JkZXJfY250X3R5cGUsCisJCXBTbGljZS0+aWRyX2ZsYWcsCisJCXBfVmlkLT5sYXN0X2hhc19tbWNvXzUsCisJCXBfVmlkLT5sYXN0X3BpY19ib3R0b21fZmllbGQsCisJCXBTbGljZS0+cGljX29yZGVyX2NudF9sc2IsCisJCXBfVmlkLT5QcmV2UGljT3JkZXJDbnRMc2IKKwkpOworCisJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfREVCVUdfUE9DLAorCSIlczpmaWVsZF9waWNfZmxhZyAlZCwgYm90dG9tX2ZpZWxkX2ZsYWcgJWQgZnJhbWVfbnVtICVkIFByZXZpb3VzRnJhbWVOdW0gJWQgUHJldmlvdXNGcmFtZU51bU9mZnNldCAlZCBheF9mcmFtZV9udW0gJWQgbnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSAlZCBvZmZzZXRfZm9yX25vbl9yZWZfcGljICVkXHJcbiIsCisJCV9fZnVuY19fLAorCQlwU2xpY2UtPmZpZWxkX3BpY19mbGFnLAorCQlwU2xpY2UtPmJvdHRvbV9maWVsZF9mbGFnLAorCQlwU2xpY2UtPmZyYW1lX251bSwKKwkJcF9WaWQtPlByZXZpb3VzRnJhbWVOdW0sCisJCXBfVmlkLT5QcmV2aW91c0ZyYW1lTnVtT2Zmc2V0LAorCQlwX1ZpZC0+bWF4X2ZyYW1lX251bSwKKwkJYWN0aXZlX3Nwcy0+bnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSwKKwkJYWN0aXZlX3Nwcy0+b2Zmc2V0X2Zvcl9ub25fcmVmX3BpYworCSk7CisKKwlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19ERUJVR19QT0MsCisJIiVzOiBkZWx0YV9waWNfb3JkZXJfY250ICVkICVkIG5hbF9yZWZlcmVuY2VfaWRjICVkXHJcbiIsCisJX19mdW5jX18sCisJcFNsaWNlLT5kZWx0YV9waWNfb3JkZXJfY250WzBdLCBwU2xpY2UtPmRlbHRhX3BpY19vcmRlcl9jbnRbMV0sCisJcFNsaWNlLT5uYWxfcmVmZXJlbmNlX2lkYworCSk7CisKKworCXN3aXRjaCAoYWN0aXZlX3Nwcy0+cGljX29yZGVyX2NudF90eXBlKSB7CisJY2FzZSAwOiAvKiBQT0MgTU9ERSAwICovCisJCS8qIDFzdCAqLworCQlpZiAocFNsaWNlLT5pZHJfZmxhZykgeworCQkJcF9WaWQtPlByZXZQaWNPcmRlckNudE1zYiA9IDA7CisJCQlwX1ZpZC0+UHJldlBpY09yZGVyQ250THNiID0gMDsKKwkJfSBlbHNlIHsKKwkJCWlmIChwX1ZpZC0+bGFzdF9oYXNfbW1jb181KSB7CisJCQkJaWYgKHBfVmlkLT5sYXN0X3BpY19ib3R0b21fZmllbGQpIHsKKwkJCQkJcF9WaWQtPlByZXZQaWNPcmRlckNudE1zYiA9IDA7CisJCQkJCXBfVmlkLT5QcmV2UGljT3JkZXJDbnRMc2IgPSAwOworCQkJCX0gZWxzZSB7CisJCQkJCXBfVmlkLT5QcmV2UGljT3JkZXJDbnRNc2IgPSAwOworCQkJCQlwX1ZpZC0+UHJldlBpY09yZGVyQ250THNiID0KKwkJCQkJCXBTbGljZS0+dG9wcG9jOworCQkJCX0KKwkJCX0KKwkJfQorCQkvKiBDYWxjdWxhdGUgdGhlIE1TQnMgb2YgY3VycmVudCBwaWN0dXJlICovCisJCWlmIChwU2xpY2UtPnBpY19vcmRlcl9jbnRfbHNiIDwgcF9WaWQtPlByZXZQaWNPcmRlckNudExzYiAmJgorCQkgICAgKHBfVmlkLT5QcmV2UGljT3JkZXJDbnRMc2IgLSBwU2xpY2UtPnBpY19vcmRlcl9jbnRfbHNiKSA+PQorCQkgICAgKE1heFBpY09yZGVyQ250THNiIC8gMikpCisJCQlwU2xpY2UtPlBpY09yZGVyQ250TXNiID0gcF9WaWQtPlByZXZQaWNPcmRlckNudE1zYiArCisJCQkJCU1heFBpY09yZGVyQ250THNiOworCQllbHNlIGlmIChwU2xpY2UtPnBpY19vcmRlcl9jbnRfbHNiID4KKwkJCQlwX1ZpZC0+UHJldlBpY09yZGVyQ250THNiICYmCisJCQkgKHBTbGljZS0+cGljX29yZGVyX2NudF9sc2IgLQorCQkJCXBfVmlkLT5QcmV2UGljT3JkZXJDbnRMc2IpICA+CisJCQkJIChNYXhQaWNPcmRlckNudExzYiAvIDIpKQorCQkJcFNsaWNlLT5QaWNPcmRlckNudE1zYiA9IHBfVmlkLT5QcmV2UGljT3JkZXJDbnRNc2IgLQorCQkJCQlNYXhQaWNPcmRlckNudExzYjsKKwkJZWxzZQorCQkJcFNsaWNlLT5QaWNPcmRlckNudE1zYiA9IHBfVmlkLT5QcmV2UGljT3JkZXJDbnRNc2I7CisKKwkJLyogMm5kICovCisJCWlmIChwU2xpY2UtPmZpZWxkX3BpY19mbGFnID09IDApIHsKKwkJCS8qIGZyYW1lIHBpeCAqLworCQkJcFNsaWNlLT50b3Bwb2MgPSBwU2xpY2UtPlBpY09yZGVyQ250TXNiICsKKwkJCQkJcFNsaWNlLT5waWNfb3JkZXJfY250X2xzYjsKKwkJCXBTbGljZS0+Ym90dG9tcG9jID0gcFNsaWNlLT50b3Bwb2MgKworCQkJCQlwU2xpY2UtPmRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tOworCQkJcFNsaWNlLT5UaGlzUE9DID0gcFNsaWNlLT5mcmFtZXBvYyA9CisJCQkJKHBTbGljZS0+dG9wcG9jIDwgcFNsaWNlLT5ib3R0b21wb2MpID8KKwkJCQkgcFNsaWNlLT50b3Bwb2MgOiBwU2xpY2UtPmJvdHRvbXBvYzsKKwkJCQkJLyogUE9DMjAwMzAxICovCisJCX0gZWxzZSBpZiAocFNsaWNlLT5ib3R0b21fZmllbGRfZmxhZyA9PSAwKSB7CisJCQkvKiB0b3AgZmllbGQgKi8KKwkJCXBTbGljZS0+VGhpc1BPQyA9IHBTbGljZS0+dG9wcG9jID0KKwkJCQlwU2xpY2UtPlBpY09yZGVyQ250TXNiICsKKwkJCQlwU2xpY2UtPnBpY19vcmRlcl9jbnRfbHNiOworCQl9IGVsc2UgeworCQkJLyogYm90dG9tIGZpZWxkICovCisJCQlwU2xpY2UtPlRoaXNQT0MgPSBwU2xpY2UtPmJvdHRvbXBvYyA9CisJCQkJcFNsaWNlLT5QaWNPcmRlckNudE1zYiArCisJCQkJcFNsaWNlLT5waWNfb3JkZXJfY250X2xzYjsKKwkJfQorCQlwU2xpY2UtPmZyYW1lcG9jID0gcFNsaWNlLT5UaGlzUE9DOworCisJCXBfVmlkLT5UaGlzUE9DID0gcFNsaWNlLT5UaGlzUE9DOworCisJCS8qIGlmICggcFNsaWNlLT5mcmFtZV9udW0gIT0gcF9WaWQtPlByZXZpb3VzRnJhbWVOdW0pCisJCSAqCVNlZW1zIHJlZHVuZGFudAorCQkgKi8KKwkJcF9WaWQtPlByZXZpb3VzRnJhbWVOdW0gPSBwU2xpY2UtPmZyYW1lX251bTsKKworCQlpZiAocFNsaWNlLT5uYWxfcmVmZXJlbmNlX2lkYykgeworCQkJcF9WaWQtPlByZXZQaWNPcmRlckNudExzYiA9IHBTbGljZS0+cGljX29yZGVyX2NudF9sc2I7CisJCQlwX1ZpZC0+UHJldlBpY09yZGVyQ250TXNiID0gcFNsaWNlLT5QaWNPcmRlckNudE1zYjsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSAxOiAvKiBQT0MgTU9ERSAxICovCisJCS8qIDFzdCAqLworCQlpZiAocFNsaWNlLT5pZHJfZmxhZykgeworCQkJcF9WaWQtPkZyYW1lTnVtT2Zmc2V0ID0gMDsgICAvKiBmaXJzdCBwaXggb2YgSURSR09QICovCisJCQlpZiAocFNsaWNlLT5mcmFtZV9udW0pCisJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkJImZyYW1lX251bSBub3QgZXF1YWwgdG8gemVybyBpbiBJRFIgcGljdHVyZSAlZCIsCisJCQkJCS0xMDIwKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChwX1ZpZC0+bGFzdF9oYXNfbW1jb181KSB7CisJCQkJcF9WaWQtPlByZXZpb3VzRnJhbWVOdW1PZmZzZXQgPSAwOworCQkJCXBfVmlkLT5QcmV2aW91c0ZyYW1lTnVtID0gMDsKKwkJCX0KKwkJCWlmIChwU2xpY2UtPmZyYW1lX251bSA8IHBfVmlkLT5QcmV2aW91c0ZyYW1lTnVtKSB7CisJCQkJLyogbm90IGZpcnN0IHBpeCBvZiBJRFJHT1AgKi8KKwkJCQlwX1ZpZC0+RnJhbWVOdW1PZmZzZXQgPQorCQkJCQlwX1ZpZC0+UHJldmlvdXNGcmFtZU51bU9mZnNldCArCisJCQkJCQlwX1ZpZC0+bWF4X2ZyYW1lX251bTsKKwkJCX0gZWxzZSB7CisJCQkJcF9WaWQtPkZyYW1lTnVtT2Zmc2V0ID0KKwkJCQkJcF9WaWQtPlByZXZpb3VzRnJhbWVOdW1PZmZzZXQ7CisJCQl9CisJCX0KKworCQkvKiAybmQgKi8KKwkJaWYgKGFjdGl2ZV9zcHMtPm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUpCisJCQlwU2xpY2UtPkFic0ZyYW1lTnVtID0KKwkJCQlwX1ZpZC0+RnJhbWVOdW1PZmZzZXQgKyBwU2xpY2UtPmZyYW1lX251bTsKKwkJZWxzZQorCQkJcFNsaWNlLT5BYnNGcmFtZU51bSA9IDA7CisJCWlmICgoIXBTbGljZS0+bmFsX3JlZmVyZW5jZV9pZGMpICYmIHBTbGljZS0+QWJzRnJhbWVOdW0gPiAwKQorCQkJcFNsaWNlLT5BYnNGcmFtZU51bS0tOworCisJCS8qIDNyZCAqLworCQlwX1ZpZC0+RXhwZWN0ZWREZWx0YVBlclBpY09yZGVyQ250Q3ljbGUgPSAwOworCisJCWlmIChhY3RpdmVfc3BzLT5udW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlKQorCQkJZm9yIChpID0gMDsgaSA8IChpbnQpIGFjdGl2ZV9zcHMtPgorCQkJCW51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGU7IGkrKykgeworCQkJCXBfVmlkLT5FeHBlY3RlZERlbHRhUGVyUGljT3JkZXJDbnRDeWNsZSArPQorCQkJCQlhY3RpdmVfc3BzLT5vZmZzZXRfZm9yX3JlZl9mcmFtZVtpXTsKKwkJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQkJUFJJTlRfRkxBR19ERUJVR19QT0MsCisJCQkJCSIlczogb2Zmc2V0X2Zvcl9yZWZfZnJhbWUgJWRcclxuIiwKKwkJCQkJX19mdW5jX18sCisJCQkJCWFjdGl2ZV9zcHMtPgorCQkJCQlvZmZzZXRfZm9yX3JlZl9mcmFtZVtpXSk7CisJCQl9CisKKwkJaWYgKHBTbGljZS0+QWJzRnJhbWVOdW0pIHsKKwkJCXBfVmlkLT5QaWNPcmRlckNudEN5Y2xlQ250ID0KKwkJCQkocFNsaWNlLT5BYnNGcmFtZU51bSAtIDEpIC8KKwkJCQlhY3RpdmVfc3BzLT4KKwkJCQludW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOworCQkJcF9WaWQtPkZyYW1lTnVtSW5QaWNPcmRlckNudEN5Y2xlID0KKwkJCQkocFNsaWNlLT5BYnNGcmFtZU51bSAtIDEpICUKKwkJCQlhY3RpdmVfc3BzLT4KKwkJCQludW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOworCQkJcF9WaWQtPkV4cGVjdGVkUGljT3JkZXJDbnQgPQorCQkJCXBfVmlkLT5QaWNPcmRlckNudEN5Y2xlQ250ICoKKwkJCQlwX1ZpZC0+RXhwZWN0ZWREZWx0YVBlclBpY09yZGVyQ250Q3ljbGU7CisJCQlmb3IgKGkgPSAwOyBpIDw9IChpbnQpcF9WaWQtPgorCQkJCUZyYW1lTnVtSW5QaWNPcmRlckNudEN5Y2xlOyBpKyspIHsKKwkJCQlwX1ZpZC0+RXhwZWN0ZWRQaWNPcmRlckNudCArPQorCQkJCQlhY3RpdmVfc3BzLT5vZmZzZXRfZm9yX3JlZl9mcmFtZVtpXTsKKwkJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQkJUFJJTlRfRkxBR19ERUJVR19QT0MsCisJCQkJCSIlczogb2Zmc2V0X2Zvcl9yZWZfZnJhbWUgJWRcclxuIiwKKwkJCQkJX19mdW5jX18sCisJCQkJCWFjdGl2ZV9zcHMtPgorCQkJCQlvZmZzZXRfZm9yX3JlZl9mcmFtZVtpXSk7CisJCQl9CisJCX0gZWxzZQorCQkJcF9WaWQtPkV4cGVjdGVkUGljT3JkZXJDbnQgPSAwOworCisJCWlmICghcFNsaWNlLT5uYWxfcmVmZXJlbmNlX2lkYykKKwkJCXBfVmlkLT5FeHBlY3RlZFBpY09yZGVyQ250ICs9CisJCQkJYWN0aXZlX3Nwcy0+b2Zmc2V0X2Zvcl9ub25fcmVmX3BpYzsKKworCQlpZiAocFNsaWNlLT5maWVsZF9waWNfZmxhZyA9PSAwKSB7CisJCQkvKiBmcmFtZSBwaXggKi8KKwkJCXBTbGljZS0+dG9wcG9jID0gcF9WaWQtPkV4cGVjdGVkUGljT3JkZXJDbnQgKworCQkJCXBTbGljZS0+ZGVsdGFfcGljX29yZGVyX2NudFswXTsKKwkJCXBTbGljZS0+Ym90dG9tcG9jID0gcFNsaWNlLT50b3Bwb2MgKworCQkJCWFjdGl2ZV9zcHMtPm9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZCArCisJCQkJcFNsaWNlLT5kZWx0YV9waWNfb3JkZXJfY250WzFdOworCQkJcFNsaWNlLT5UaGlzUE9DID0gcFNsaWNlLT5mcmFtZXBvYyA9CisJCQkJKHBTbGljZS0+dG9wcG9jIDwgcFNsaWNlLT5ib3R0b21wb2MpID8KKwkJCQlwU2xpY2UtPnRvcHBvYyA6IHBTbGljZS0+Ym90dG9tcG9jOworCQkJCS8qIFBPQzIwMDMwMSAqLworCQl9IGVsc2UgaWYgKHBTbGljZS0+Ym90dG9tX2ZpZWxkX2ZsYWcgPT0gMCkgeworCQkJLyogdG9wIGZpZWxkICovCisJCQlwU2xpY2UtPlRoaXNQT0MgPSBwU2xpY2UtPnRvcHBvYyA9CisJCQkJcF9WaWQtPkV4cGVjdGVkUGljT3JkZXJDbnQgKworCQkJCXBTbGljZS0+ZGVsdGFfcGljX29yZGVyX2NudFswXTsKKwkJfSBlbHNlIHsKKwkJCS8qIGJvdHRvbSBmaWVsZCAqLworCQkJcFNsaWNlLT5UaGlzUE9DID0gcFNsaWNlLT5ib3R0b21wb2MgPQorCQkJCXBfVmlkLT5FeHBlY3RlZFBpY09yZGVyQ250ICsKKwkJCQlhY3RpdmVfc3BzLT5vZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQgKworCQkJCXBTbGljZS0+ZGVsdGFfcGljX29yZGVyX2NudFswXTsKKwkJfQorCQlwU2xpY2UtPmZyYW1lcG9jID0gcFNsaWNlLT5UaGlzUE9DOworCisJCXBfVmlkLT5QcmV2aW91c0ZyYW1lTnVtID0gcFNsaWNlLT5mcmFtZV9udW07CisJCXBfVmlkLT5QcmV2aW91c0ZyYW1lTnVtT2Zmc2V0ID0gcF9WaWQtPkZyYW1lTnVtT2Zmc2V0OworCisJCWJyZWFrOworCisKKwljYXNlIDI6IC8qIFBPQyBNT0RFIDIgKi8KKwkJaWYgKHBTbGljZS0+aWRyX2ZsYWcpIHsgLyogSURSIHBpY3R1cmUgKi8KKwkJCXBfVmlkLT5GcmFtZU51bU9mZnNldCA9IDA7ICAgLyogZmlyc3QgcGl4IG9mIElEUkdPUCAqLworCQkJcFNsaWNlLT5UaGlzUE9DID0gcFNsaWNlLT5mcmFtZXBvYyA9IHBTbGljZS0+dG9wcG9jID0KKwkJCQlwU2xpY2UtPmJvdHRvbXBvYyA9IDA7CisJCQlpZiAocFNsaWNlLT5mcmFtZV9udW0pCisJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkJImZyYW1lX251bSBub3QgZXF1YWwgdG8gemVybyBpbiBJRFIgcGljdHVyZSAlZCIsCisJCQkJCS0xMDIwKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChwX1ZpZC0+bGFzdF9oYXNfbW1jb181KSB7CisJCQkJcF9WaWQtPlByZXZpb3VzRnJhbWVOdW0gPSAwOworCQkJCXBfVmlkLT5QcmV2aW91c0ZyYW1lTnVtT2Zmc2V0ID0gMDsKKwkJCX0KKwkJCWlmIChwU2xpY2UtPmZyYW1lX251bSA8IHBfVmlkLT5QcmV2aW91c0ZyYW1lTnVtKQorCQkJCXBfVmlkLT5GcmFtZU51bU9mZnNldCA9CisJCQkJCXBfVmlkLT5QcmV2aW91c0ZyYW1lTnVtT2Zmc2V0ICsKKwkJCQkJcF9WaWQtPm1heF9mcmFtZV9udW07CisJCQllbHNlCisJCQkJcF9WaWQtPkZyYW1lTnVtT2Zmc2V0ID0KKwkJCQkJcF9WaWQtPlByZXZpb3VzRnJhbWVOdW1PZmZzZXQ7CisKKwkJCXBTbGljZS0+QWJzRnJhbWVOdW0gPSBwX1ZpZC0+RnJhbWVOdW1PZmZzZXQgKworCQkJCXBTbGljZS0+ZnJhbWVfbnVtOworCQkJaWYgKCFwU2xpY2UtPm5hbF9yZWZlcmVuY2VfaWRjKQorCQkJCXBTbGljZS0+VGhpc1BPQyA9CisJCQkJCSgyICogcFNsaWNlLT5BYnNGcmFtZU51bSAtIDEpOworCQkJZWxzZQorCQkJCXBTbGljZS0+VGhpc1BPQyA9ICgyICogcFNsaWNlLT5BYnNGcmFtZU51bSk7CisKKwkJCWlmIChwU2xpY2UtPmZpZWxkX3BpY19mbGFnID09IDApCisJCQkJcFNsaWNlLT50b3Bwb2MgPSBwU2xpY2UtPmJvdHRvbXBvYyA9CisJCQkJCXBTbGljZS0+ZnJhbWVwb2MgPSBwU2xpY2UtPlRoaXNQT0M7CisJCQllbHNlIGlmIChwU2xpY2UtPmJvdHRvbV9maWVsZF9mbGFnID09IDApCisJCQkJcFNsaWNlLT50b3Bwb2MgPSBwU2xpY2UtPmZyYW1lcG9jID0KKwkJCQlwU2xpY2UtPlRoaXNQT0M7CisJCQllbHNlCisJCQkJcFNsaWNlLT5ib3R0b21wb2MgPSBwU2xpY2UtPmZyYW1lcG9jID0KKwkJCQlwU2xpY2UtPlRoaXNQT0M7CisJCX0KKworCQlwX1ZpZC0+UHJldmlvdXNGcmFtZU51bSA9IHBTbGljZS0+ZnJhbWVfbnVtOworCQlwX1ZpZC0+UHJldmlvdXNGcmFtZU51bU9mZnNldCA9IHBfVmlkLT5GcmFtZU51bU9mZnNldDsKKwkJYnJlYWs7CisKKworCWRlZmF1bHQ6CisJCS8qIGVycm9yIG11c3Qgb2NjdXJzICovCisJCS8qIGFzc2VydCggMT09MCApOyAqLworCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgZmlsbF9mcmFtZV9udW1fZ2FwKHN0cnVjdCBWaWRlb1BhcmFtZXRlcnMgKnBfVmlkLCBzdHJ1Y3QgU2xpY2UgKmN1cnJTbGljZSkKK3sKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9CisJCWNvbnRhaW5lcl9vZihwX1ZpZCwgc3RydWN0IGgyNjRfZHBiX3N0cnUsIG1WaWRlbyk7CisJc3RydWN0IFNQU1BhcmFtZXRlcnMgKmFjdGl2ZV9zcHMgPSBwX1ZpZC0+YWN0aXZlX3NwczsKKwlpbnQgQ3VyckZyYW1lTnVtOworCWludCBVbnVzZWRTaG9ydFRlcm1GcmFtZU51bTsKKwlzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpwaWN0dXJlID0gTlVMTDsKKwlpbnQgdG1wMSA9IGN1cnJTbGljZS0+ZGVsdGFfcGljX29yZGVyX2NudFswXTsKKwlpbnQgdG1wMiA9IGN1cnJTbGljZS0+ZGVsdGFfcGljX29yZGVyX2NudFsxXTsKKwlpbnQgcmV0OworCisJY3VyclNsaWNlLT5kZWx0YV9waWNfb3JkZXJfY250WzBdID0KKwkJY3VyclNsaWNlLT5kZWx0YV9waWNfb3JkZXJfY250WzFdID0gMDsKKworCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCSJBIGdhcCBpbiBmcmFtZSBudW1iZXIgaXMgZm91bmQsIHRyeSB0byBmaWxsIGl0LihwcmVfZnJhbWVfbnVtICVkLCBtYXhfZnJhbWVfbnVtICVkXG4iLAorCQlwX1ZpZC0+cHJlX2ZyYW1lX251bSwgcF9WaWQtPm1heF9mcmFtZV9udW0KKwkpOworCisJVW51c2VkU2hvcnRUZXJtRnJhbWVOdW0gPSAocF9WaWQtPnByZV9mcmFtZV9udW0gKyAxKQorCQklIHBfVmlkLT5tYXhfZnJhbWVfbnVtOworCUN1cnJGcmFtZU51bSA9IGN1cnJTbGljZS0+ZnJhbWVfbnVtOyAvKnBfVmlkLT5mcmFtZV9udW07Ki8KKworCXdoaWxlIChDdXJyRnJhbWVOdW0gIT0gVW51c2VkU2hvcnRUZXJtRnJhbWVOdW0pIHsKKwkJLypwcl9lcnIoIkN1cnJGcmFtZU51bSA9ICVkLCBVbnVzZWRTaG9ydFRlcm1GcmFtZU51bSA9ICVkXG4iLCBDdXJyRnJhbWVOdW0sIFVudXNlZFNob3J0VGVybUZyYW1lTnVtKTsqLworCQkvKnBpY3R1cmUgPSBhbGxvY19zdG9yYWJsZV9waWN0dXJlCisJCSAqKHBfVmlkLCBGUkFNRSwgcF9WaWQtPndpZHRoLAorCQkgKnBfVmlkLT5oZWlnaHQsCisJCSAqcF9WaWQtPndpZHRoX2NyLAorCQkgKnBfVmlkLT5oZWlnaHRfY3IsIDEpOworCQkgKi8KKwkJcGljdHVyZSA9IGdldF9uZXdfcGljKHBfSDI2NF9EcGIsCisJCQlwX0gyNjRfRHBiLT5tU2xpY2Uuc3RydWN0dXJlLAorCQkvKnBfVmlkLT53aWR0aCwgcF9WaWQtPmhlaWdodCwKKwkJICpwX1ZpZC0+d2lkdGhfY3IsCisJCXBfVmlkLT5oZWlnaHRfY3IsKi8gMSk7CisKKwkJaWYgKHBpY3R1cmUgPT0gTlVMTCkgeworCQkJc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYiA9ICZwX0gyNjRfRHBiLT5tRFBCOworCisJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQlQUklOVF9GTEFHX0VSUk9SLAorCQkJCSIlcyBFcnJvcjogZ2V0X25ld19waWMgcmV0dXJuIE5VTExcclxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQkvKmgyNjRfZGVidWdfZmxhZyB8PSBQUklOVF9GTEFHX0RVTVBfRFBCOyovCisJCQlkdW1wX2RwYihwX0RwYiwgMCk7CisJCQlyZXR1cm47CisJCX0KKworCQlwaWN0dXJlLT5jb2xvY2F0ZWRfYnVmX2luZGV4ID0gLTE7CisJCXBpY3R1cmUtPmJ1Zl9zcGVjX251bSA9IC0xOworCQlwaWN0dXJlLT5idWZfc3BlY19pc19hbGxvY2VkID0gMDsKKworCQlwaWN0dXJlLT5jb2RlZF9mcmFtZSA9IDE7CisJCXBpY3R1cmUtPnBpY19udW0gPSBVbnVzZWRTaG9ydFRlcm1GcmFtZU51bTsKKwkJcGljdHVyZS0+ZnJhbWVfbnVtID0gVW51c2VkU2hvcnRUZXJtRnJhbWVOdW07CisJCXBpY3R1cmUtPm5vbl9leGlzdGluZyA9IDE7CisJCXBpY3R1cmUtPmlzX291dHB1dCA9IDE7CisJCXBpY3R1cmUtPnVzZWRfZm9yX3JlZmVyZW5jZSA9IDE7CisJCXBpY3R1cmUtPmFkYXB0aXZlX3JlZl9waWNfYnVmZmVyaW5nX2ZsYWcgPSAwOworCQkjaWYgKE1WQ19FWFRFTlNJT05fRU5BQkxFKQorCQlwaWN0dXJlLT52aWV3X2lkID0gY3VyclNsaWNlLT52aWV3X2lkOworCQkjZW5kaWYKKworCQljdXJyU2xpY2UtPmZyYW1lX251bSA9IFVudXNlZFNob3J0VGVybUZyYW1lTnVtOworCQlpZiAoYWN0aXZlX3Nwcy0+cGljX29yZGVyX2NudF90eXBlICE9IDApIHsKKwkJCS8qZGVjb2RlX3BvYyhwX1ZpZCwgcF9WaWQtPnBwU2xpY2VMaXN0WzBdKTsqLworCQkJZGVjb2RlX3BvYygmcF9IMjY0X0RwYi0+bVZpZGVvLCAmcF9IMjY0X0RwYi0+bVNsaWNlKTsKKwkJfQorCQlwaWN0dXJlLT50b3BfcG9jICAgID0gY3VyclNsaWNlLT50b3Bwb2M7CisJCXBpY3R1cmUtPmJvdHRvbV9wb2MgPSBjdXJyU2xpY2UtPmJvdHRvbXBvYzsKKwkJcGljdHVyZS0+ZnJhbWVfcG9jICA9IGN1cnJTbGljZS0+ZnJhbWVwb2M7CisJCXBpY3R1cmUtPnBvYyAgICAgICAgPSBjdXJyU2xpY2UtPmZyYW1lcG9jOworCisJCXJldCA9IHN0b3JlX3BpY3R1cmVfaW5fZHBiKHBfSDI2NF9EcGIsIHBpY3R1cmUsIDApOworCQlpZiAocmV0ID09IC0xKSB7CisJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQlQUklOVF9GTEFHX0VSUk9SLAorCQkJCSIlcyBFcnJvcjogc3RvcmVfcGljdHVyZV9pbl9kcGIgZmFpbGVkLCBicmVha1xuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZWxlYXNlX3BpY3R1cmUocF9IMjY0X0RwYiwgcGljdHVyZSk7CisJCQlidWZtZ3JfZm9yY2VfcmVjb3ZlcihwX0gyNjRfRHBiKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIGlmIChyZXQgPT0gLTIpCisJCQlyZWxlYXNlX3BpY3R1cmUocF9IMjY0X0RwYiwgcGljdHVyZSk7CisKKwkJcGljdHVyZSA9IE5VTEw7CisJCXBfVmlkLT5wcmVfZnJhbWVfbnVtID0gVW51c2VkU2hvcnRUZXJtRnJhbWVOdW07CisJCVVudXNlZFNob3J0VGVybUZyYW1lTnVtID0KKwkJCShVbnVzZWRTaG9ydFRlcm1GcmFtZU51bSArIDEpICUKKwkJCXBfVmlkLT5tYXhfZnJhbWVfbnVtOworCX0KKwljdXJyU2xpY2UtPmRlbHRhX3BpY19vcmRlcl9jbnRbMF0gPSB0bXAxOworCWN1cnJTbGljZS0+ZGVsdGFfcGljX29yZGVyX2NudFsxXSA9IHRtcDI7CisJY3VyclNsaWNlLT5mcmFtZV9udW0gPSBDdXJyRnJhbWVOdW07Cit9CisKK3ZvaWQgZHBiX2luaXRfZ2xvYmFsKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLAorCWludCBpZCwgaW50IGFjdHVhbF9kcGJfc2l6ZSwgaW50IG1heF9yZWZlcmVuY2Vfc2l6ZSkKK3sKKwlpbnQgaTsKKworCWluaXRfZHVtbXlfZnMoKTsKKworCW1lbXNldCgmcF9IMjY0X0RwYi0+bURQQiwgMCwgc2l6ZW9mKHN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlcikpOworCisJbWVtc2V0KCZwX0gyNjRfRHBiLT5tU2xpY2UsIDAsIHNpemVvZihzdHJ1Y3QgU2xpY2UpKTsKKwltZW1zZXQoJnBfSDI2NF9EcGItPm1WaWRlbywgMCwgc2l6ZW9mKHN0cnVjdCBWaWRlb1BhcmFtZXRlcnMpKTsKKwltZW1zZXQoJnBfSDI2NF9EcGItPm1TUFMsIDAsIHNpemVvZihzdHJ1Y3QgU1BTUGFyYW1ldGVycykpOworCisJZm9yIChpID0gMDsgaSA8IERQQl9TSVpFX01BWDsgaSsrKSB7CisJCW1lbXNldCgmKHBfSDI2NF9EcGItPm1GcmFtZVN0b3JlW2ldKSwgMCwKKwkJCXNpemVvZihzdHJ1Y3QgRnJhbWVTdG9yZSkpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBNQVhfUElDX0JVRl9OVU07IGkrKykgeworCQltZW1zZXQoJihwX0gyNjRfRHBiLT5tX1BJQ1tpXSksIDAsCisJCQlzaXplb2Yoc3RydWN0IFN0b3JhYmxlUGljdHVyZSkpOworCQlwX0gyNjRfRHBiLT5tX1BJQ1tpXS5pbmRleCA9IGk7CisJfQorCXBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXggPSBpZDsKKworICAgIC8qIG1ha2Ugc3VyZSBkcGJfaW5pdF9nbG9iYWwKKyAgICAgKmNhbiBiZSBjYWxsZWQgZHVyaW5nIGRlY29kaW5nCisgICAgICooaW4gREVDT0RFX1NUQVRFX0lETEUgb3IgREVDT0RFX1NUQVRFX1JFQURZIHN0YXRlKQorICAgICAqLworCXBfSDI2NF9EcGItPm1EUEIuc2l6ZSA9IGFjdHVhbF9kcGJfc2l6ZTsKKwlwX0gyNjRfRHBiLT5tYXhfcmVmZXJlbmNlX3NpemUgPSBtYXhfcmVmZXJlbmNlX3NpemU7CisJcF9IMjY0X0RwYi0+cG9jX2V2ZW5fb2RkX2ZsYWcgPSAwOworfQorCitzdGF0aWMgdm9pZCBpbml0X3BpY3R1cmUoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIsCisJCQkgc3RydWN0IFNsaWNlICpjdXJyU2xpY2UsCisJCQkgc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqZGVjX3BpY3R1cmUpCit7CisJLyogc3RydWN0IFZpZGVvUGFyYW1ldGVycyAqcF9WaWQgPSAmKHBfSDI2NF9EcGItPm1WaWRlbyk7ICovCisJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJICAiJXMgZGVjX3BpY3R1cmUgJXBcbiIsIF9fZnVuY19fLCBkZWNfcGljdHVyZSk7CisJZGVjX3BpY3R1cmUtPnRvcF9wb2MgPSBjdXJyU2xpY2UtPnRvcHBvYzsKKwlkZWNfcGljdHVyZS0+Ym90dG9tX3BvYyA9IGN1cnJTbGljZS0+Ym90dG9tcG9jOworCWRlY19waWN0dXJlLT5mcmFtZV9wb2MgPSBjdXJyU2xpY2UtPmZyYW1lcG9jOworCXN3aXRjaCAoY3VyclNsaWNlLT5zdHJ1Y3R1cmUpIHsKKwljYXNlIFRPUF9GSUVMRDogeworCQlkZWNfcGljdHVyZS0+cG9jID0gY3VyclNsaWNlLT50b3Bwb2M7CisJCS8qIHBfVmlkLT5udW1iZXIgKj0gMjsgKi8KKwkJYnJlYWs7CisJfQorCWNhc2UgQk9UVE9NX0ZJRUxEOiB7CisJCWRlY19waWN0dXJlLT5wb2MgPSBjdXJyU2xpY2UtPmJvdHRvbXBvYzsKKwkJLyogcF9WaWQtPm51bWJlciA9IHBfVmlkLT5udW1iZXIgKiAyICsgMTsgKi8KKwkJYnJlYWs7CisJfQorCWNhc2UgRlJBTUU6IHsKKwkJZGVjX3BpY3R1cmUtPnBvYyA9IGN1cnJTbGljZS0+ZnJhbWVwb2M7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJICAicF9WaWQtPnN0cnVjdHVyZSBub3QgaW5pdGlhbGl6ZWQgJWRcbiIsIDIzNSk7CisJfQorCisJLyogZGVjX3BpY3R1cmUtPnNsaWNlX3R5cGUgPSBwX1ZpZC0+dHlwZTsgKi8KKwlkZWNfcGljdHVyZS0+dXNlZF9mb3JfcmVmZXJlbmNlID0gKGN1cnJTbGljZS0+bmFsX3JlZmVyZW5jZV9pZGMgIT0gMCk7CisJZGVjX3BpY3R1cmUtPmlkcl9mbGFnID0gY3VyclNsaWNlLT5pZHJfZmxhZzsKKwlkZWNfcGljdHVyZS0+bm9fb3V0cHV0X29mX3ByaW9yX3BpY3NfZmxhZyA9CisJCWN1cnJTbGljZS0+bm9fb3V0cHV0X29mX3ByaW9yX3BpY3NfZmxhZzsKKwlkZWNfcGljdHVyZS0+bG9uZ190ZXJtX3JlZmVyZW5jZV9mbGFnID0KKwkJY3VyclNsaWNlLT5sb25nX3Rlcm1fcmVmZXJlbmNlX2ZsYWc7CisjaWYgMQorCWRlY19waWN0dXJlLT5hZGFwdGl2ZV9yZWZfcGljX2J1ZmZlcmluZ19mbGFnID0KKwkJY3VyclNsaWNlLT5hZGFwdGl2ZV9yZWZfcGljX2J1ZmZlcmluZ19mbGFnOworCWRlY19waWN0dXJlLT5kZWNfcmVmX3BpY19tYXJraW5nX2J1ZmZlciA9CisJCSZjdXJyU2xpY2UtPmRlY19yZWZfcGljX21hcmtpbmdfYnVmZmVyWzBdOworI2VuZGlmCisJLyogY3VyclNsaWNlLT5kZWNfcmVmX3BpY19tYXJraW5nX2J1ZmZlciAgID0gTlVMTDsgKi8KKworCS8qIGRlY19waWN0dXJlLT5tYl9hZmZfZnJhbWVfZmxhZyA9IGN1cnJTbGljZS0+bWJfYWZmX2ZyYW1lX2ZsYWc7ICovCisJLyogZGVjX3BpY3R1cmUtPlBpY1dpZHRoSW5NYnMgICAgID0gcF9WaWQtPlBpY1dpZHRoSW5NYnM7ICovCisKKwkvKiBwX1ZpZC0+Z2V0X21iX2Jsb2NrX3BvcyA9CisJICoJZGVjX3BpY3R1cmUtPm1iX2FmZl9mcmFtZV9mbGFnID8gZ2V0X21iX2Jsb2NrX3Bvc19tYmFmZiA6CisJICoJZ2V0X21iX2Jsb2NrX3Bvc19ub3JtYWw7CisJICovCisJLyogcF9WaWQtPmdldE5laWdoYm91ciAgICAgPQorCSAqCWRlY19waWN0dXJlLT5tYl9hZmZfZnJhbWVfZmxhZyA/IGdldEFmZk5laWdoYm91ciA6CisJICoJZ2V0Tm9uQWZmTmVpZ2hib3VyOworCSAqLworCisJZGVjX3BpY3R1cmUtPnBpY19udW0gICA9IGN1cnJTbGljZS0+ZnJhbWVfbnVtOworCWRlY19waWN0dXJlLT5mcmFtZV9udW0gPSBjdXJyU2xpY2UtPmZyYW1lX251bTsKKworCS8qIGRlY19waWN0dXJlLT5yZWNvdmVyeV9mcmFtZSA9CisJICoJKHVuc2lnbmVkIGludCkgKChpbnQpIGN1cnJTbGljZS0+ZnJhbWVfbnVtID09CisJICoJcF9WaWQtPnJlY292ZXJ5X2ZyYW1lX251bSk7CisJICovCisKKwlkZWNfcGljdHVyZS0+Y29kZWRfZnJhbWUgPSAoY3VyclNsaWNlLT5zdHJ1Y3R1cmUgPT0gRlJBTUUpOworCisJLyogZGVjX3BpY3R1cmUtPmNocm9tYV9mb3JtYXRfaWRjID0gYWN0aXZlX3Nwcy0+Y2hyb21hX2Zvcm1hdF9pZGM7ICovCisKKwkvKiBkZWNfcGljdHVyZS0+ZnJhbWVfbWJzX29ubHlfZmxhZyA9CisJICoJYWN0aXZlX3Nwcy0+ZnJhbWVfbWJzX29ubHlfZmxhZzsKKwkgKi8KKwkvKiBkZWNfcGljdHVyZS0+ZnJhbWVfY3JvcHBpbmdfZmxhZyA9CisJICoJYWN0aXZlX3Nwcy0+ZnJhbWVfY3JvcHBpbmdfZmxhZzsKKwkgKi8KKworCWlmICgoY3VyclNsaWNlLT5waWN0dXJlX3N0cnVjdHVyZV9tbWNvICYgMHgzKSA9PSAzKSB7CisJCWRlY19waWN0dXJlLT5tYl9hZmZfZnJhbWVfZmxhZyA9IDE7CisJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkiJXMsIHBpY3R1cmVfc3RydWN0dXJlX21tY28gaXMgJXgsIHNldCBtYl9hZmZfZnJhbWVfZmxhZyB0byAxXG4iLAorCQkJX19mdW5jX18sCisJCQljdXJyU2xpY2UtPnBpY3R1cmVfc3RydWN0dXJlX21tY28pOworCX0KKworCWlmIChjdXJyU2xpY2UtPnBpY19zdHJ1Y3QgPCBQSUNfSU5WQUxJRCkgeworCQlkZWNfcGljdHVyZS0+cGljX3N0cnVjdCA9IGN1cnJTbGljZS0+cGljX3N0cnVjdDsKKwl9IGVsc2UgeworCQlkZWNfcGljdHVyZS0+cGljX3N0cnVjdCA9IFBJQ19JTlZBTElEOworCX0KKworCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkgICIlcyBwaWNfc3RydWN0ID0gJWRcbiIsIF9fZnVuY19fLCBkZWNfcGljdHVyZS0+cGljX3N0cnVjdCk7Cit9CisKK3ZvaWQgZHVtcF9waWMoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIpCit7CisJaW50IGlpOworCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnBpYzsKKwlmb3IgKGlpID0gMDsgaWkgPCBNQVhfUElDX0JVRl9OVU07IGlpKyspIHsKKwkJcGljID0gJihwX0gyNjRfRHBiLT5tX1BJQ1tpaV0pOworCQlpZiAocGljLT5pc191c2VkKSB7CisJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgMCwKKwkJCQkicGljKCVkLCVkKSBwb2MgJWQgaXNfdXNlZCAlZCBidWZzcGVjICVkIGNvbGJ1ZiAlZCBmb3JfcmVmICVkIGxvbmdfdGVybSAlZCBwcmVfb3V0ICVkIG91dHB1dCAlZCBub25leGlzdCAlZCBkYXRhX2ZsYWcgMHgleFxuIiwKKwkJCQlpaSwgcGljLT5pbmRleCwKKwkJCQlwaWMtPnBvYywKKwkJCQlwaWMtPmlzX3VzZWQsCisJCQkJcGljLT5idWZfc3BlY19udW0sCisJCQkJcGljLT5jb2xvY2F0ZWRfYnVmX2luZGV4LAorCQkJCXBpYy0+dXNlZF9mb3JfcmVmZXJlbmNlLAorCQkJCXBpYy0+aXNfbG9uZ190ZXJtLAorCQkJCXBpYy0+cHJlX291dHB1dCwKKwkJCQlwaWMtPmlzX291dHB1dCwKKwkJCQlwaWMtPm5vbl9leGlzdGluZywKKwkJCQlwaWMtPmRhdGFfZmxhZyk7CisJCX0KKwl9Cit9CisKKy8qCitzdGF0aWMgdm9pZCBpc19waWNfdXNlZF9ieV9kcGIoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIsCisJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqcGljKQoreworCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIgPSAmcF9IMjY0X0RwYi0+bURQQjsKKwl1bnNpZ25lZCBpOworCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+dXNlZF9zaXplOyBpKyspIHsKKwkJaWYgKHBfRHBiLT5mc1tpXS0+dG9wX2ZpZWxkID09IHBpYyB8fAorCQkJcF9EcGItPmZzW2ldLT5ib3R0b21fZmllbGQgPT0gcGljIHx8CisJCQlwX0RwYi0+ZnNbaV0tPmZyYW1lID09IHBpYworCQkJKQorCQkJYnJlYWs7CisJfQorCWlmIChpIDwgcF9EcGItPnVzZWRfc2l6ZSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisqLworCitzdGF0aWMgc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqZ2V0X25ld19waWMoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIsCisJCWVudW0gUGljdHVyZVN0cnVjdHVyZSBzdHJ1Y3R1cmUsIHVuc2lnbmVkIGNoYXIgaXNfb3V0cHV0KQoreworCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnMgPSBOVUxMOworCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnBpYzsKKwlzdHJ1Y3QgVmlkZW9QYXJhbWV0ZXJzICpwX1ZpZCA9ICYocF9IMjY0X0RwYi0+bVZpZGVvKTsKKwkvKiByZWN5Y2xlIHVuLXVzZWQgcGljICovCisJaW50IGlpID0gMDsKKworCWZvciAoaWkgPSAwOyBpaSA8IE1BWF9QSUNfQlVGX05VTTsgaWkrKykgeworCQlwaWMgPSAmKHBfSDI2NF9EcGItPm1fUElDW2lpXSk7CisJCWlmIChwaWMtPmlzX3VzZWQgPT0gMCkgeworCQkJcGljLT5pc191c2VkID0gMTsKKwkJCXMgPSBwaWM7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChzKSB7CisJCXMtPmJ1Zl9zcGVjX2lzX2FsbG9jZWQgPSAwOworCQlzLT5waWNfbnVtICAgPSAwOworCQlzLT5mcmFtZV9udW0gPSAwOworCQlzLT5sb25nX3Rlcm1fZnJhbWVfaWR4ID0gMDsKKwkJcy0+bG9uZ190ZXJtX3BpY19udW0gICA9IDA7CisJCXMtPnVzZWRfZm9yX3JlZmVyZW5jZSAgPSAwOworCQlzLT5pc19sb25nX3Rlcm0gICAgICAgID0gMDsKKwkJcy0+bm9uX2V4aXN0aW5nICAgICAgICA9IDA7CisJCXMtPmlzX291dHB1dCAgICAgICAgICAgPSAwOworCQlzLT5wcmVfb3V0cHV0ICAgICAgICAgID0gMDsKKwkJcy0+bWF4X3NsaWNlX2lkICAgICAgICA9IDA7CisJCXMtPmRhdGFfZmxhZyAmPSB+KEVSUk9SX0ZMQUcgfCBOT0RJU1BfRkxBRyk7CisjaWYgKE1WQ19FWFRFTlNJT05fRU5BQkxFKQorCQlzLT52aWV3X2lkID0gLTE7CisjZW5kaWYKKworCQlzLT5zdHJ1Y3R1cmUgPSBzdHJ1Y3R1cmU7CisKKyNpZiAwCisJCXMtPnNpemVfeCA9IHNpemVfeDsKKwkJcy0+c2l6ZV95ID0gc2l6ZV95OworCQlzLT5zaXplX3hfY3IgPSBzaXplX3hfY3I7CisJCXMtPnNpemVfeV9jciA9IHNpemVfeV9jcjsKKwkJcy0+c2l6ZV94X20xID0gc2l6ZV94IC0gMTsKKwkJcy0+c2l6ZV95X20xID0gc2l6ZV95IC0gMTsKKwkJcy0+c2l6ZV94X2NyX20xID0gc2l6ZV94X2NyIC0gMTsKKwkJcy0+c2l6ZV95X2NyX20xID0gc2l6ZV95X2NyIC0gMTsKKworCQlzLT50b3BfZmllbGQgICAgPSBwX1ZpZC0+bm9fcmVmZXJlbmNlX3BpY3R1cmU7CisJCXMtPmJvdHRvbV9maWVsZCA9IHBfVmlkLT5ub19yZWZlcmVuY2VfcGljdHVyZTsKKwkJcy0+ZnJhbWUgICAgICAgID0gcF9WaWQtPm5vX3JlZmVyZW5jZV9waWN0dXJlOworI2VuZGlmCisJCS8qIHMtPmRlY19yZWZfcGljX21hcmtpbmdfYnVmZmVyID0gTlVMTDsgKi8KKworCQlzLT5jb2RlZF9mcmFtZSAgPSAwOworCQlzLT5tYl9hZmZfZnJhbWVfZmxhZyAgPSAwOworCisJCXMtPnRvcF9wb2MgPSBzLT5ib3R0b21fcG9jID0gcy0+cG9jID0gMDsKKwkJcy0+c2VpSGFzVG9uZV9tYXBwaW5nID0gMDsKKwkJcy0+ZnJhbWVfbWJzX29ubHlfZmxhZyA9IHBfVmlkLT5hY3RpdmVfc3BzLT5mcmFtZV9tYnNfb25seV9mbGFnOworCisJCWlmICghcF9WaWQtPmFjdGl2ZV9zcHMtPmZyYW1lX21ic19vbmx5X2ZsYWcgJiYKKwkJCXN0cnVjdHVyZSAhPSBGUkFNRSkgeworCQkJaW50IGksIGo7CisKKwkJCWZvciAoaiA9IDA7IGogPCBNQVhfTlVNX1NMSUNFUzsgaisrKSB7CisJCQkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJCQkvKiBzLT5saXN0WFtqXVtpXSA9CisJCQkJCSAqY2FsbG9jKE1BWF9MSVNUX1NJWkUsCisJCQkJCSAqc2l6ZW9mIChzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICopKTsKKwkJCQkJICorMSBmb3IgcmVvcmRlcmluZyAgID8/PworCisJCQkJCSAqaWYgKE5VTEwgPT0gcy0+bGlzdFhbal1baV0pCisJCQkJCSAqbm9fbWVtX2V4aXQoImFsbG9jX3N0b3JhYmxlX3BpY3R1cmU6CisJCQkJCSAqcy0+bGlzdFhbaV0iKTsKKwkJCQkJICovCisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlCisJCXBfSDI2NF9EcGItPmJ1Zl9hbGxvY19mYWlsID0gMTsKKwlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJIiVzICVwXG4iLCBfX2Z1bmNfXywgcyk7CisJcmV0dXJuIHM7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcGljdHVyZShzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiwKKwkJCSBzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpwaWMpCit7CisJaWYgKHBpYyA9PSBOVUxMIHx8IHBpYy0+aW5kZXggPCAwIHx8CisJCXBpYy0+aW5kZXggPj0gTUFYX1BJQ19CVUZfTlVNKQorCQlyZXR1cm47CisJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSIlcyAlcCAlZFxuIiwgX19mdW5jX18sIHBpYywgcGljLT5pbmRleCk7CisJLyogYXNzZXJ0KHBpYy0+aW5kZXg8TUFYX1BJQ19CVUZfTlVNKTsgKi8KKwlwX0gyNjRfRHBiLT5tX1BJQ1twaWMtPmluZGV4XS5pc191c2VkID0gMDsKK30KKworc3RhdGljIHZvaWQgZ2VuX2ZpZWxkX3JlZl9pZHMoc3RydWN0IFZpZGVvUGFyYW1ldGVycyAqcF9WaWQsCisJCQkgICAgICBzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpwKQoreworCWludCBpLCBqOworCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gY29udGFpbmVyX29mKHBfVmlkLAorCQkJCQlzdHJ1Y3QgaDI2NF9kcGJfc3RydSwgbVZpZGVvKTsKKwkvKiAhIEdlbmVyYXRlIEZyYW1lIHBhcmFtZXRlcnMgZnJvbSBmaWVsZCBpbmZvcm1hdGlvbi4gKi8KKwlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJCQkiJXNcbiIsIF9fZnVuY19fKTsKKworCS8qIGNvcHkgdGhlIGxpc3Q7ICovCisJZm9yIChqID0gMDsgaiA8IHBfVmlkLT5pU2xpY2VOdW1PZkN1cnJQaWM7IGorKykgeworCQlpZiAocC0+bGlzdFhbal1bTElTVF8wXSkgeworCQkJcC0+bGlzdFhzaXplW2pdW0xJU1RfMF0gPQorCQkJCXBfVmlkLT5wcFNsaWNlTGlzdFtqXS0+bGlzdFhzaXplW0xJU1RfMF07CisJCQlmb3IgKGkgPSAwOyBpIDwgcC0+bGlzdFhzaXplW2pdW0xJU1RfMF07IGkrKykKKwkJCQlwLT5saXN0WFtqXVtMSVNUXzBdW2ldID0KKwkJCQlwX1ZpZC0+cHBTbGljZUxpc3Rbal0tPmxpc3RYW0xJU1RfMF1baV07CisJCX0KKwkJaWYgKHAtPmxpc3RYW2pdW0xJU1RfMV0pIHsKKwkJCXAtPmxpc3RYc2l6ZVtqXVtMSVNUXzFdID0KKwkJCQlwX1ZpZC0+cHBTbGljZUxpc3Rbal0tPmxpc3RYc2l6ZVtMSVNUXzFdOworCQkJZm9yIChpID0gMDsgaSA8IHAtPmxpc3RYc2l6ZVtqXVtMSVNUXzFdOyBpKyspCisJCQkJcC0+bGlzdFhbal1bTElTVF8xXVtpXSA9CisJCQkJcF9WaWQtPnBwU2xpY2VMaXN0W2pdLT5saXN0WFtMSVNUXzFdW2ldOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBpbml0X2RwYihzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiwgaW50IHR5cGUpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IFZpZGVvUGFyYW1ldGVycyAqcF9WaWQgID0gJnBfSDI2NF9EcGItPm1WaWRlbzsKKwlzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiID0gJnBfSDI2NF9EcGItPm1EUEI7CisJc3RydWN0IFNQU1BhcmFtZXRlcnMgKmFjdGl2ZV9zcHMgPSAmcF9IMjY0X0RwYi0+bVNQUzsKKworCXBfVmlkLT5hY3RpdmVfc3BzID0gYWN0aXZlX3NwczsKKwlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkiJXNcbiIsIF9fZnVuY19fKTsKKworCXBfRHBiLT5wX1ZpZCA9IHBfVmlkOworCWlmIChwX0RwYi0+aW5pdF9kb25lKSB7CisJCS8qIGZyZWVfZHBiKHBfRHBiKTsgKi8KKwkJaWYgKHBfVmlkLT5ub19yZWZlcmVuY2VfcGljdHVyZSkgeworCQkJZnJlZV9waWN0dXJlKHBfSDI2NF9EcGIsIHBfVmlkLT5ub19yZWZlcmVuY2VfcGljdHVyZSk7CisJCQlwX1ZpZC0+bm9fcmVmZXJlbmNlX3BpY3R1cmUgPSBOVUxMOworCQl9CisJCXBfRHBiLT5pbml0X2RvbmUgPSAwOworCX0KKworCS8qIHBfRHBiLT5zaXplID0gMTA7IC8vYWN0aXZlX3Nwcy0+bWF4X2RwYl9zaXplOyAvLzE2OworCSAqICAgZ2V0RHBiU2l6ZShwX1ZpZCwgYWN0aXZlX3NwcykgKworCSAqCXBfVmlkLT5wX0lucC0+ZHBiX3BsdXNbdHlwZT09Mj8gMTogMF07CisJICogICBwX0RwYi0+c2l6ZSA9IGFjdGl2ZV9zcHMtPm1heF9kcGJfc2l6ZTsgLy8xNjsKKwkgKiAgIGdldERwYlNpemUocF9WaWQsIGFjdGl2ZV9zcHMpICsKKwkgKglwX1ZpZC0+cF9JbnAtPmRwYl9wbHVzW3R5cGU9PTI/IDE6IDBdOworCSAqICAgcF9EcGItPnNpemUgaW5pdGlhbHppZSBpbiB2aDI2NC5jCisJICovCisJcF9EcGItPm51bV9yZWZfZnJhbWVzID0gYWN0aXZlX3Nwcy0+bnVtX3JlZl9mcmFtZXM7CisJLyogcF9EcGItPm51bV9yZWZfZnJhbWVzIGluaXRpYWx6aWUgaW4gdmgyNjQuYyAqLworCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCSAgIiVzIGRwYl9zaXplIGlzICVkICBudW1fcmVmX2ZyYW1lcyA9ICVkICglZClcbiIsCisJCSAgX19mdW5jX18sIHBfRHBiLT5zaXplLAorCQkgIHBfRHBiLT5udW1fcmVmX2ZyYW1lcywKKwkJICBhY3RpdmVfc3BzLT5udW1fcmVmX2ZyYW1lcyk7CisJaWYgKGFjdGl2ZV9zcHMtPm51bV9yZWZfZnJhbWVzID09IDB4ZmZmZikgeworCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgMCwKKwkJICAiISEhV2FybmluZywgbnVtX3JlZl9mcmFtZXMgPSAlZCBpcyBpbnZhbGlkXG4iLAorCQkgIGFjdGl2ZV9zcHMtPm51bV9yZWZfZnJhbWVzKTsKKwl9CisKKyNpZiAwCisJLyogPz8/ICovCisjaWYgKE1WQ19FWFRFTlNJT05fRU5BQkxFKQorCWlmICgodW5zaWduZWQgaW50KWFjdGl2ZV9zcHMtPm1heF9kZWNfZnJhbWVfYnVmZmVyaW5nIDwKKwkgICAgYWN0aXZlX3Nwcy0+bnVtX3JlZl9mcmFtZXMpIHsKKyNlbHNlCisJaWYgKHBfRHBiLT5zaXplIDwgYWN0aXZlX3Nwcy0+bnVtX3JlZl9mcmFtZXMpIHsKKyNlbmRpZgorCQllcnJvcigKKwkJIkRQQiBzaXplIGF0IHNwZWNpZmllZCBsZXZlbCBpcyBzbWFsbGVyIHRoYW4gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgcmVmZXJlbmNlIGZyYW1lcy4gVGhpcyBpcyBub3QgYWxsb3dlZC5cbiIsCisJCTEwMDApOworCX0KKyNlbmRpZgorCisJcF9EcGItPnVzZWRfc2l6ZSA9IDA7CisJcF9EcGItPmxhc3RfcGljdHVyZSA9IE5VTEw7CisKKwlwX0RwYi0+cmVmX2ZyYW1lc19pbl9idWZmZXIgPSAwOworCXBfRHBiLT5sdHJlZl9mcmFtZXNfaW5fYnVmZmVyID0gMDsKKworI2lmIDAKKwlwX0RwYi0+ZnMgPSBjYWxsb2MocF9EcGItPnNpemUsIHNpemVvZihzdHJ1Y3QgRnJhbWVTdG9yZSAqKSk7CisJaWYgKE5VTEwgPT0gcF9EcGItPmZzKQorCQlub19tZW1fZXhpdCgiaW5pdF9kcGI6IHBfRHBiLT5mcyIpOworCisJcF9EcGItPmZzX3JlZiA9IGNhbGxvYyhwX0RwYi0+c2l6ZSwgc2l6ZW9mKHN0cnVjdCBGcmFtZVN0b3JlICopKTsKKwlpZiAoTlVMTCA9PSBwX0RwYi0+ZnNfcmVmKQorCQlub19tZW1fZXhpdCgiaW5pdF9kcGI6IHBfRHBiLT5mc19yZWYiKTsKKworCXBfRHBiLT5mc19sdHJlZiA9IGNhbGxvYyhwX0RwYi0+c2l6ZSwgc2l6ZW9mKHN0cnVjdCBGcmFtZVN0b3JlICopKTsKKwlpZiAoTlVMTCA9PSBwX0RwYi0+ZnNfbHRyZWYpCisJCW5vX21lbV9leGl0KCJpbml0X2RwYjogcF9EcGItPmZzX2x0cmVmIik7CisjZW5kaWYKKworI2lmIChNVkNfRVhURU5TSU9OX0VOQUJMRSkKKwlwX0RwYi0+ZnNfaWxyZWYgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBGcmFtZVN0b3JlICopKTsKKwlpZiAoTlVMTCA9PSBwX0RwYi0+ZnNfaWxyZWYpCisJCW5vX21lbV9leGl0KCJpbml0X2RwYjogcF9EcGItPmZzX2lscmVmIik7CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+c2l6ZTsgaSsrKSB7CisJCXBfRHBiLT5mc1tpXSA9ICYocF9IMjY0X0RwYi0+bUZyYW1lU3RvcmVbaV0pOworCQkvKiBhbGxvY19mcmFtZV9zdG9yZSgpOyAqLworCQlwX0RwYi0+ZnNbaV0tPmluZGV4ICAgICAgID0gaTsKKwkJcF9EcGItPmZzX3JlZltpXSAgID0gTlVMTDsKKwkJcF9EcGItPmZzX2x0cmVmW2ldID0gTlVMTDsKKwkJcF9EcGItPmZzW2ldLT5sYXllcl9pZCA9IDA7IC8qIE1WQ19JTklUX1ZJRVdfSUQ7ICovCisjaWYgKE1WQ19FWFRFTlNJT05fRU5BQkxFKQorCQlwX0RwYi0+ZnNbaV0tPnZpZXdfaWQgPSBNVkNfSU5JVF9WSUVXX0lEOworCQlwX0RwYi0+ZnNbaV0tPmludGVyX3ZpZXdfZmxhZ1swXSA9CisJCQlwX0RwYi0+ZnNbaV0tPmludGVyX3ZpZXdfZmxhZ1sxXSA9IDA7CisJCXBfRHBiLT5mc1tpXS0+YW5jaG9yX3BpY19mbGFnWzBdID0KKwkJCXBfRHBiLT5mc1tpXS0+YW5jaG9yX3BpY19mbGFnWzFdID0gMDsKKyNlbmRpZgorCX0KKyNpZiAoTVZDX0VYVEVOU0lPTl9FTkFCTEUpCisJaWYgKHR5cGUgPT0gMikgeworCQlwX0RwYi0+ZnNfaWxyZWZbMF0gPSBhbGxvY19mcmFtZV9zdG9yZSgpOworCQkvKiBUaGVzZSBtYXkgbmVlZCBzb21lIGNsZWFudXBzICovCisJCXBfRHBiLT5mc19pbHJlZlswXS0+dmlld19pZCA9IE1WQ19JTklUX1ZJRVdfSUQ7CisJCXBfRHBiLT5mc19pbHJlZlswXS0+aW50ZXJfdmlld19mbGFnWzBdID0KKwkJCXBfRHBiLT5mc19pbHJlZlswXS0+aW50ZXJfdmlld19mbGFnWzFdID0gMDsKKwkJcF9EcGItPmZzX2lscmVmWzBdLT5hbmNob3JfcGljX2ZsYWdbMF0gPQorCQkJcF9EcGItPmZzX2lscmVmWzBdLT5hbmNob3JfcGljX2ZsYWdbMV0gPSAwOworCQkvKiBnaXZlbiB0aGF0IHRoaXMgaXMgaW4gYSBkaWZmZXJlbnQgYnVmZmVyLAorCQkgKglkbyB3ZSBldmVuIG5lZWQgcHJvY19mbGFnIGFueW1vcmU/CisJCSAqLworCX0gZWxzZQorCQlwX0RwYi0+ZnNfaWxyZWZbMF0gPSBOVUxMOworI2VuZGlmCisKKwkvKgorCSAqZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkgKnsKKwkgKmN1cnJTbGljZS0+bGlzdFhbaV0gPQorCSAqCWNhbGxvYyhNQVhfTElTVF9TSVpFLCBzaXplb2YgKHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKikpOworCSAqCSsxIGZvciByZW9yZGVyaW5nCisJICppZiAoTlVMTCA9PSBjdXJyU2xpY2UtPmxpc3RYW2ldKQorCSAqbm9fbWVtX2V4aXQoImluaXRfZHBiOiBjdXJyU2xpY2UtPmxpc3RYW2ldIik7CisJICp9CisJICovCisJLyogYWxsb2NhdGUgYSBkdW1teSBzdG9yYWJsZSBwaWN0dXJlICovCisJaWYgKCFwX1ZpZC0+bm9fcmVmZXJlbmNlX3BpY3R1cmUpIHsKKwkJcF9WaWQtPm5vX3JlZmVyZW5jZV9waWN0dXJlID0gZ2V0X25ld19waWMocF9IMjY0X0RwYiwKKwkJCQkJICAgICAgRlJBTUUsCisJCS8qcF9WaWQtPndpZHRoLCBwX1ZpZC0+aGVpZ2h0LAorCQkgKnBfVmlkLT53aWR0aF9jciwgcF9WaWQtPmhlaWdodF9jciwKKwkJICovCisJCTEpOworCQlwX1ZpZC0+bm9fcmVmZXJlbmNlX3BpY3R1cmUtPnRvcF9maWVsZCA9CisJCQlwX1ZpZC0+bm9fcmVmZXJlbmNlX3BpY3R1cmU7CisJCXBfVmlkLT5ub19yZWZlcmVuY2VfcGljdHVyZS0+Ym90dG9tX2ZpZWxkID0KKwkJCXBfVmlkLT5ub19yZWZlcmVuY2VfcGljdHVyZTsKKwkJcF9WaWQtPm5vX3JlZmVyZW5jZV9waWN0dXJlLT5mcmFtZSA9CisJCQlwX1ZpZC0+bm9fcmVmZXJlbmNlX3BpY3R1cmU7CisJfQorCXBfRHBiLT5sYXN0X291dHB1dF9wb2MgPSBJTlRfTUlOOworCisjaWYgKE1WQ19FWFRFTlNJT05fRU5BQkxFKQorCXBfRHBiLT5sYXN0X291dHB1dF92aWV3X2lkID0gLTE7CisjZW5kaWYKKworCXBfVmlkLT5sYXN0X2hhc19tbWNvXzUgPSAwOworCisJaW5pdF9jb2xvY2F0ZV9idWYocF9IMjY0X0RwYiwgcF9IMjY0X0RwYi0+bWF4X3JlZmVyZW5jZV9zaXplKTsKKworCXBfRHBiLT5pbml0X2RvbmUgPSAxOworCisjaWYgMAorLyogPz8/ICovCisJLyogcGljdHVyZSBlcnJvciBjb25jZWFsbWVudCAqLworCWlmIChwX1ZpZC0+Y29uY2VhbF9tb2RlICE9IDAgJiYgIXBfVmlkLT5sYXN0X291dF9mcykKKwkJcF9WaWQtPmxhc3Rfb3V0X2ZzID0gYWxsb2NfZnJhbWVfc3RvcmUoKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBkcGJfc3BsaXRfZmllbGQoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIsCisJCQkgICAgc3RydWN0IEZyYW1lU3RvcmUgKmZzKQoreworCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKmZzX3RvcCA9IE5VTEwsICpmc19idG0gPSBOVUxMOworCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKmZyYW1lID0gZnMtPmZyYW1lOworCisJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJIiVzICVwICVwXG4iLCBfX2Z1bmNfXywgZnMsIGZyYW1lKTsKKworCWZzLT5wb2MgPSBmcmFtZS0+cG9jOworCisJaWYgKCFmcmFtZS0+ZnJhbWVfbWJzX29ubHlfZmxhZykgeworCQlmc190b3AgPSBmcy0+dG9wX2ZpZWxkID0gZ2V0X25ld19waWMocF9IMjY0X0RwYiwKKwkJCVRPUF9GSUVMRCwKKwkJCS8qIGZyYW1lLT5zaXplX3gsIGZyYW1lLT5zaXplX3ksCisJCQkgKmZyYW1lLT5zaXplX3hfY3IsIGZyYW1lLT5zaXplX3lfY3IsCisJCQkgKi8KKwkJCTEpOworCQlmc19idG0gPSBmcy0+Ym90dG9tX2ZpZWxkID0gZ2V0X25ld19waWMocF9IMjY0X0RwYiwKKwkJCUJPVFRPTV9GSUVMRCwKKwkJCS8qZnJhbWUtPnNpemVfeCwgZnJhbWUtPnNpemVfeSwKKwkJCSAqZnJhbWUtPnNpemVfeF9jciwgZnJhbWUtPnNpemVfeV9jciwKKwkJCSAqLworCQkJMSk7CisJCWlmIChmc190b3AgPT0gTlVMTCB8fCBmc19idG0gPT0gTlVMTCkKKwkJCXJldHVybjsKKyNpZiAxCisvKiByYWluICovCisJCWZzX3RvcC0+YnVmX3NwZWNfbnVtID0gZnJhbWUtPmJ1Zl9zcGVjX251bTsKKwkJZnNfYnRtLT5idWZfc3BlY19udW0gPSBmcmFtZS0+YnVmX3NwZWNfbnVtOworCisJCWZzX3RvcC0+Y29sb2NhdGVkX2J1Zl9pbmRleCA9IGZyYW1lLT5jb2xvY2F0ZWRfYnVmX2luZGV4OworCQlmc19idG0tPmNvbG9jYXRlZF9idWZfaW5kZXggPSBmcmFtZS0+Y29sb2NhdGVkX2J1Zl9pbmRleDsKKworCQlmc190b3AtPmRhdGFfZmxhZyA9IGZyYW1lLT5kYXRhX2ZsYWc7CisJCWZzX2J0bS0+ZGF0YV9mbGFnID0gZnJhbWUtPmRhdGFfZmxhZzsKKyNlbmRpZgorCQlmc190b3AtPnBvYyA9IGZyYW1lLT50b3BfcG9jOworCQlmc19idG0tPnBvYyA9IGZyYW1lLT5ib3R0b21fcG9jOworCisjaWYgKE1WQ19FWFRFTlNJT05fRU5BQkxFKQorCQlmc190b3AtPnZpZXdfaWQgPSBmcmFtZS0+dmlld19pZDsKKwkJZnNfYnRtLT52aWV3X2lkID0gZnJhbWUtPnZpZXdfaWQ7CisjZW5kaWYKKworCQlmc190b3AtPmZyYW1lX3BvYyA9ICBmcmFtZS0+ZnJhbWVfcG9jOworCisJCWZzX3RvcC0+Ym90dG9tX3BvYyA9IGZzX2J0bS0+Ym90dG9tX3BvYyA9ICBmcmFtZS0+Ym90dG9tX3BvYzsKKwkJZnNfdG9wLT50b3BfcG9jICAgID0gZnNfYnRtLT50b3BfcG9jICAgID0gIGZyYW1lLT50b3BfcG9jOworCQlmc19idG0tPmZyYW1lX3BvYyAgPSBmcmFtZS0+ZnJhbWVfcG9jOworCisJCWZzX3RvcC0+dXNlZF9mb3JfcmVmZXJlbmNlID0gZnNfYnRtLT51c2VkX2Zvcl9yZWZlcmVuY2UKKwkJCQkJICAgICA9IGZyYW1lLT51c2VkX2Zvcl9yZWZlcmVuY2U7CisJCWZzX3RvcC0+aXNfbG9uZ190ZXJtID0gZnNfYnRtLT5pc19sb25nX3Rlcm0KKwkJCQkgICAgICAgPSBmcmFtZS0+aXNfbG9uZ190ZXJtOworCQlmcy0+bG9uZ190ZXJtX2ZyYW1lX2lkeCA9IGZzX3RvcC0+bG9uZ190ZXJtX2ZyYW1lX2lkeAorCQkJCQkgID0gZnNfYnRtLT5sb25nX3Rlcm1fZnJhbWVfaWR4CisJCQkJCSAgICA9IGZyYW1lLT5sb25nX3Rlcm1fZnJhbWVfaWR4OworCisJCWZzX3RvcC0+Y29kZWRfZnJhbWUgPSBmc19idG0tPmNvZGVkX2ZyYW1lID0gMTsKKwkJZnNfdG9wLT5tYl9hZmZfZnJhbWVfZmxhZyA9IGZzX2J0bS0+bWJfYWZmX2ZyYW1lX2ZsYWcKKwkJCQkJICAgID0gZnJhbWUtPm1iX2FmZl9mcmFtZV9mbGFnOworCisJCWZyYW1lLT50b3BfZmllbGQgICAgPSBmc190b3A7CisJCWZyYW1lLT5ib3R0b21fZmllbGQgPSBmc19idG07CisJCWZyYW1lLT5mcmFtZSAgICAgICAgID0gZnJhbWU7CisJCWZzX3RvcC0+Ym90dG9tX2ZpZWxkID0gZnNfYnRtOworCQlmc190b3AtPmZyYW1lICAgICAgICA9IGZyYW1lOworCQlmc190b3AtPnRvcF9maWVsZCA9IGZzX3RvcDsKKwkJZnNfYnRtLT50b3BfZmllbGQgPSBmc190b3A7CisJCWZzX2J0bS0+ZnJhbWUgICAgID0gZnJhbWU7CisJCWZzX2J0bS0+Ym90dG9tX2ZpZWxkID0gZnNfYnRtOworCisjaWYgKE1WQ19FWFRFTlNJT05fRU5BQkxFKQorCQlmc190b3AtPnZpZXdfaWQgPSBmc19idG0tPnZpZXdfaWQgPSBmcy0+dmlld19pZDsKKwkJZnNfdG9wLT5pbnRlcl92aWV3X2ZsYWcgPSBmcy0+aW50ZXJfdmlld19mbGFnWzBdOworCQlmc19idG0tPmludGVyX3ZpZXdfZmxhZyA9IGZzLT5pbnRlcl92aWV3X2ZsYWdbMV07CisjZW5kaWYKKworCQlmc190b3AtPmNocm9tYV9mb3JtYXRfaWRjID0gZnNfYnRtLT5jaHJvbWFfZm9ybWF0X2lkYyA9CisJCQkJCQkgICAgZnJhbWUtPmNocm9tYV9mb3JtYXRfaWRjOworCQlmc190b3AtPmlDb2RpbmdUeXBlID0gZnNfYnRtLT5pQ29kaW5nVHlwZSA9IGZyYW1lLT5pQ29kaW5nVHlwZTsKKwl9IGVsc2UgeworCQlmcy0+dG9wX2ZpZWxkICAgICAgID0gTlVMTDsKKwkJZnMtPmJvdHRvbV9maWVsZCAgICA9IE5VTEw7CisJCWZyYW1lLT50b3BfZmllbGQgICAgPSBOVUxMOworCQlmcmFtZS0+Ym90dG9tX2ZpZWxkID0gTlVMTDsKKwkJZnJhbWUtPmZyYW1lID0gZnJhbWU7CisJfQorCit9CisKKworc3RhdGljIHZvaWQgZHBiX2NvbWJpbmVfZmllbGQoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIsCisJCQkgICAgICBzdHJ1Y3QgRnJhbWVTdG9yZSAqZnMpCit7CisKKwlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoIWZzLT5mcmFtZSkgeworCQlmcy0+ZnJhbWUgPSBnZXRfbmV3X3BpYyhwX0gyNjRfRHBiLAorCQkJRlJBTUUsCisJCQkvKiBmcy0+dG9wX2ZpZWxkLT5zaXplX3gsIGZzLT50b3BfZmllbGQtPnNpemVfeSoyLAorCQkJICpmcy0+dG9wX2ZpZWxkLT5zaXplX3hfY3IsIGZzLT50b3BfZmllbGQtPnNpemVfeV9jcioyLAorCQkJICovCisJCQkxKTsKKwl9CisJaWYgKCFmcy0+ZnJhbWUpCisJCXJldHVybjsKKyNpZiAxCisvKiByYWluICovCisJZnMtPmZyYW1lLT5idWZfc3BlY19udW0gPSBmcy0+dG9wX2ZpZWxkLT5idWZfc3BlY19udW07CisJZnMtPmZyYW1lLT5jb2xvY2F0ZWRfYnVmX2luZGV4ID0gZnMtPnRvcF9maWVsZC0+Y29sb2NhdGVkX2J1Zl9pbmRleDsKKwlmcy0+ZnJhbWUtPmRhdGFfZmxhZyA9IGZzLT50b3BfZmllbGQtPmRhdGFfZmxhZzsKKwlmcy0+ZnJhbWUtPnNsaWNlX3R5cGUgPSBmcy0+dG9wX2ZpZWxkLT5zbGljZV90eXBlOworCWlmIChmcy0+Ym90dG9tX2ZpZWxkKQorCQlmcy0+ZnJhbWUtPmRhdGFfZmxhZyB8PSAoZnMtPmJvdHRvbV9maWVsZC0+ZGF0YV9mbGFnICYgMHhmMCk7CisjZW5kaWYKKworCWlmIChmcy0+Ym90dG9tX2ZpZWxkKSB7CisJCWZzLT5wb2MgPSBmcy0+ZnJhbWUtPnBvYyA9IGZzLT5mcmFtZS0+ZnJhbWVfcG9jID0gaW1pbigKKwkJCQlmcy0+dG9wX2ZpZWxkLT5wb2MsIGZzLT5ib3R0b21fZmllbGQtPnBvYyk7CisKKwkJZnMtPmJvdHRvbV9maWVsZC0+ZnJhbWVfcG9jID0gZnMtPnRvcF9maWVsZC0+ZnJhbWVfcG9jID0gZnMtPmZyYW1lLT5wb2M7CisKKwkJZnMtPmJvdHRvbV9maWVsZC0+dG9wX3BvYyA9IGZzLT5mcmFtZS0+dG9wX3BvYyA9IGZzLT50b3BfZmllbGQtPnBvYzsKKwkJZnMtPnRvcF9maWVsZC0+Ym90dG9tX3BvYyA9IGZzLT5mcmFtZS0+Ym90dG9tX3BvYyA9CisJCQkJZnMtPmJvdHRvbV9maWVsZC0+cG9jOworCisJCWZzLT5mcmFtZS0+dXNlZF9mb3JfcmVmZXJlbmNlID0gKGZzLT50b3BfZmllbGQtPnVzZWRfZm9yX3JlZmVyZW5jZSAmJgorCQkJCQkJIGZzLT5ib3R0b21fZmllbGQtPnVzZWRfZm9yX3JlZmVyZW5jZSk7CisJCWZzLT5mcmFtZS0+aXNfbG9uZ190ZXJtID0gKGZzLT50b3BfZmllbGQtPmlzX2xvbmdfdGVybSAmJgorCQkJCQkgICBmcy0+Ym90dG9tX2ZpZWxkLT5pc19sb25nX3Rlcm0pOworCX0KKworCWlmIChmcy0+ZnJhbWUtPmlzX2xvbmdfdGVybSkKKwkJZnMtPmZyYW1lLT5sb25nX3Rlcm1fZnJhbWVfaWR4ID0gZnMtPmxvbmdfdGVybV9mcmFtZV9pZHg7CisKKwlmcy0+ZnJhbWUtPnRvcF9maWVsZCAgICA9IGZzLT50b3BfZmllbGQ7CisJaWYgKGZzLT5ib3R0b21fZmllbGQpCisJCWZzLT5mcmFtZS0+Ym90dG9tX2ZpZWxkID0gZnMtPmJvdHRvbV9maWVsZDsKKwlmcy0+ZnJhbWUtPmZyYW1lID0gZnMtPmZyYW1lOworCisJZnMtPmZyYW1lLT5jb2RlZF9mcmFtZSA9IDA7CisKKwlmcy0+ZnJhbWUtPmNocm9tYV9mb3JtYXRfaWRjID0gZnMtPnRvcF9maWVsZC0+Y2hyb21hX2Zvcm1hdF9pZGM7CisJZnMtPmZyYW1lLT5mcmFtZV9jcm9wcGluZ19mbGFnID0gZnMtPnRvcF9maWVsZC0+ZnJhbWVfY3JvcHBpbmdfZmxhZzsKKwlpZiAoZnMtPmZyYW1lLT5mcmFtZV9jcm9wcGluZ19mbGFnKSB7CisJCWZzLT5mcmFtZS0+ZnJhbWVfY3JvcF90b3Bfb2Zmc2V0ID0KKwkJCWZzLT50b3BfZmllbGQtPmZyYW1lX2Nyb3BfdG9wX29mZnNldDsKKwkJZnMtPmZyYW1lLT5mcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQgPQorCQkJZnMtPnRvcF9maWVsZC0+ZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0OworCQlmcy0+ZnJhbWUtPmZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQgPQorCQkJZnMtPnRvcF9maWVsZC0+ZnJhbWVfY3JvcF9sZWZ0X29mZnNldDsKKwkJZnMtPmZyYW1lLT5mcmFtZV9jcm9wX3JpZ2h0X29mZnNldCA9CisJCQlmcy0+dG9wX2ZpZWxkLT5mcmFtZV9jcm9wX3JpZ2h0X29mZnNldDsKKwl9CisJaWYgKGZzLT5ib3R0b21fZmllbGQpIHsKKwkJZnMtPnRvcF9maWVsZC0+ZnJhbWUgPSBmcy0+Ym90dG9tX2ZpZWxkLT5mcmFtZSA9IGZzLT5mcmFtZTsKKwkJZnMtPnRvcF9maWVsZC0+dG9wX2ZpZWxkID0gZnMtPnRvcF9maWVsZDsKKwkJZnMtPnRvcF9maWVsZC0+Ym90dG9tX2ZpZWxkID0gZnMtPmJvdHRvbV9maWVsZDsKKwkJZnMtPmJvdHRvbV9maWVsZC0+dG9wX2ZpZWxkID0gZnMtPnRvcF9maWVsZDsKKwkJZnMtPmJvdHRvbV9maWVsZC0+Ym90dG9tX2ZpZWxkID0gZnMtPmJvdHRvbV9maWVsZDsKKwl9CisKKwkvKiovCisjaWYgKE1WQ19FWFRFTlNJT05fRU5BQkxFKQorCWZzLT5mcmFtZS0+dmlld19pZCA9IGZzLT52aWV3X2lkOworI2VuZGlmCisJZnMtPmZyYW1lLT5pQ29kaW5nVHlwZSA9IGZzLT50b3BfZmllbGQtPmlDb2RpbmdUeXBlOworCWlmIChmcy0+Ym90dG9tX2ZpZWxkICYmIGZzLT50b3BfZmllbGQtPnBvYyA8IGZzLT5ib3R0b21fZmllbGQtPnBvYykgeworCQlmcy0+cHRzID0gZnMtPnRvcF9maWVsZC0+cHRzOworCQlmcy0+cHRzNjQgPSBmcy0+dG9wX2ZpZWxkLT5wdHM2NDsKKwkJLypTV1BMLTcxMDUgZml4ICovCisJCWlmICgoZnMtPmZyYW1lLT5zbGljZV90eXBlID09IEJfU0xJQ0UpCisJCQkmJiAoIWZzLT5ib3R0b21fZmllbGQtPnB0cykgJiYoIWZzLT5ib3R0b21fZmllbGQtPnB0czY0KSkgeworCQkJZnMtPnB0cyA9ICAwOworCQkJZnMtPnB0czY0ID0gMDsKKwkJfQorCQlmcy0+b2Zmc2V0X2RlbGltaXRlciA9IGZzLT50b3BfZmllbGQtPm9mZnNldF9kZWxpbWl0ZXI7CisJCWZzLT5kZWNvZGVkX2ZyYW1lX3NpemUgPSBmcy0+dG9wX2ZpZWxkLT5waWNfc2l6ZSArIGZzLT5ib3R0b21fZmllbGQtPnBpY19zaXplOworCX0gZWxzZSBpZiAoZnMtPmJvdHRvbV9maWVsZCkgeworCQlmcy0+cHRzID0gZnMtPmJvdHRvbV9maWVsZC0+cHRzOworCQlmcy0+cHRzNjQgPSBmcy0+Ym90dG9tX2ZpZWxkLT5wdHM2NDsKKwkJZnMtPm9mZnNldF9kZWxpbWl0ZXIgPSBmcy0+Ym90dG9tX2ZpZWxkLT5vZmZzZXRfZGVsaW1pdGVyOworCQlmcy0+ZGVjb2RlZF9mcmFtZV9zaXplID0gZnMtPnRvcF9maWVsZC0+cGljX3NpemUgKyBmcy0+Ym90dG9tX2ZpZWxkLT5waWNfc2l6ZTsKKwl9CisJLyogRklFTERfQ09ESU5HIDsqLworfQorCitzdGF0aWMgdm9pZCBjYWxjdWxhdGVfZnJhbWVfbm8oc3RydWN0IFZpZGVvUGFyYW1ldGVycyAqcF9WaWQsCisJCQkgICAgICAgc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqcCkKK3sKKyNpZiAwCisvKiA/Pz8gKi8KKwlJbnB1dFBhcmFtZXRlcnMgKnBfSW5wID0gcF9WaWQtPnBfSW5wOworCS8qIGNhbGN1bGF0ZSBmcmFtZSBudW1iZXIgKi8KKwlpbnQgcHNuclBPQyA9IHBfVmlkLT5hY3RpdmVfc3BzLT5tYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnID8KKwkJcC0+cG9jIC8gKHBfSW5wLT5wb2Nfc2NhbGUpIDogcC0+cG9jIC8gKHBfSW5wLT5wb2Nfc2NhbGUpOworCisJaWYgKHBzbnJQT0MgPT0gMCkgeyAvKiAmJiBwX1ZpZC0+cHNucl9udW1iZXIpICovCisJCXBfVmlkLT5pZHJfcHNucl9udW1iZXIgPQorCQlwX1ZpZC0+Z19uRnJhbWUgKiBwX1ZpZC0+cmVmX3BvY19nYXAgLyAocF9JbnAtPnBvY19zY2FsZSk7CisJfQorCXBfVmlkLT5wc25yX251bWJlciA9IGltYXgocF9WaWQtPnBzbnJfbnVtYmVyLAorCQlwX1ZpZC0+aWRyX3BzbnJfbnVtYmVyICsgcHNuclBPQyk7CisKKwlwX1ZpZC0+ZnJhbWVfbm8gPSBwX1ZpZC0+aWRyX3BzbnJfbnVtYmVyICsgcHNuclBPQzsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBpbnNlcnRfcGljdHVyZV9pbl9kcGIoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIsCisJCQkJICBzdHJ1Y3QgRnJhbWVTdG9yZSAqZnMsCisJCQkJICBzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpwLAorCQkJCSAgdW5zaWduZWQgY2hhciBkYXRhX2ZsYWcpCit7CisJc3RydWN0IHZkZWNfZnJhbWVzX3MgKm12ZnJtID0gcF9IMjY0X0RwYi0+dmRlYy0+bXZmcm07CisJc3RydWN0IFZpZGVvUGFyYW1ldGVycyAqcF9WaWQgPSAmcF9IMjY0X0RwYi0+bVZpZGVvOworCS8qIElucHV0UGFyYW1ldGVycyAqcF9JbnAgPSBwX1ZpZC0+cF9JbnA7CisJICogICBkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCSAqCSJpbnNlcnQgKCVzKSBwaWMgd2l0aCBmcmFtZV9udW0gIyVkLCBwb2MgJWRcbiIsCisJICoJKHAtPnN0cnVjdHVyZSA9PSBGUkFNRSk/IkZSQU1FIjoKKwkgKgkocC0+c3RydWN0dXJlID09IFRPUF9GSUVMRCk/IlRPUF9GSUVMRCI6CisJICoJIkJPVFRPTV9GSUVMRCIsIHAtPnBpY19udW0sIHAtPnBvYyk7CisJICogICBhc3NlcnQgKHAhPU5VTEwpOworCSAqICAgYXNzZXJ0IChmcyE9TlVMTCk7CisJICovCisJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJIiVzICVwICVwXG4iLCBfX2Z1bmNfXywgZnMsIHApOworCXBfSDI2NF9EcGItPmRwYl9mcmFtZV9jb3VudCsrOworCWZzLT5kcGJfZnJhbWVfY291bnQgPSBwX0gyNjRfRHBiLT5kcGJfZnJhbWVfY291bnQ7CisjaWYgMQorLyogcmFpbiAqLworLyogcC0+YnVmX3NwZWNfbnVtID0gZnMtPmluZGV4OyAqLworCXAtPmRhdGFfZmxhZyA9IGRhdGFfZmxhZzsKKwlmcy0+ZGF0YV9mbGFnIHw9IGRhdGFfZmxhZzsKKwlmcy0+YnVmX3NwZWNfbnVtID0gcC0+YnVmX3NwZWNfbnVtOworCWZzLT5jb2xvY2F0ZWRfYnVmX2luZGV4ID0gcC0+Y29sb2NhdGVkX2J1Zl9pbmRleDsKKyNlbmRpZgorCXAtPnNsaWNlX3R5cGUgPSBwX0gyNjRfRHBiLT5tU2xpY2Uuc2xpY2VfdHlwZTsKKwlzd2l0Y2ggKHAtPnN0cnVjdHVyZSkgeworCWNhc2UgRlJBTUU6CisJCWZzLT5mcmFtZSA9IHA7CisJCWZzLT5pc191c2VkID0gMzsKKwkJZnMtPnNsaWNlX3R5cGUgPSBwLT5zbGljZV90eXBlOworCQlmcy0+ZnJhbWVfc2l6ZSA9IHAtPmZyYW1lX3NpemU7CisJCWZzLT5vZmZzZXRfZGVsaW1pdGVyID0gcC0+b2Zmc2V0X2RlbGltaXRlcjsKKwkJZnMtPmRlY29kZWRfZnJhbWVfc2l6ZSA9IHAtPnBpY19zaXplOworCQlpZiAocC0+dXNlZF9mb3JfcmVmZXJlbmNlKSB7CisJCQlmcy0+aXNfcmVmZXJlbmNlID0gMzsKKwkJCWZzLT5pc19vcmlnX3JlZmVyZW5jZSA9IDM7CisJCQlpZiAocC0+aXNfbG9uZ190ZXJtKSB7CisJCQkJZnMtPmlzX2xvbmdfdGVybSA9IDM7CisJCQkJZnMtPmxvbmdfdGVybV9mcmFtZV9pZHggPQorCQkJCQlwLT5sb25nX3Rlcm1fZnJhbWVfaWR4OworCQkJfQorCQl9CisJCWZzLT5wdHMgPSBwLT5wdHM7CisJCWZzLT5wdHM2NCA9IHAtPnB0czY0OworCQlmcy0+bGF5ZXJfaWQgPSBwLT5sYXllcl9pZDsKKyNpZiAoTVZDX0VYVEVOU0lPTl9FTkFCTEUpCisJCWZzLT52aWV3X2lkID0gcC0+dmlld19pZDsKKwkJZnMtPmludGVyX3ZpZXdfZmxhZ1swXSA9IGZzLT5pbnRlcl92aWV3X2ZsYWdbMV0gPQorCQkJcC0+aW50ZXJfdmlld19mbGFnOworCQlmcy0+YW5jaG9yX3BpY19mbGFnWzBdID0gZnMtPmFuY2hvcl9waWNfZmxhZ1sxXSA9CisJCQlwLT5hbmNob3JfcGljX2ZsYWc7CisjZW5kaWYKKwkJLyogZ2VuZXJhdGUgZmllbGQgdmlld3MgKi8KKwkJLyogcmV0dXJuOyAqLworCQlkcGJfc3BsaXRfZmllbGQocF9IMjY0X0RwYiwgZnMpOworCQkvKiByZXR1cm47ICovCisJCWJyZWFrOworCWNhc2UgVE9QX0ZJRUxEOgorCQlmcy0+dG9wX2ZpZWxkID0gcDsKKwkJZnMtPmlzX3VzZWQgfD0gMTsKKwkJZnMtPmxheWVyX2lkID0gcC0+bGF5ZXJfaWQ7CisJCWlmIChmcy0+ZnJhbWVfc2l6ZSA9PSAwKSB7CisJCQlmcy0+c2xpY2VfdHlwZSA9IHAtPnNsaWNlX3R5cGU7CisvLwkJCWZzLT5wdHMgPSBwLT5wdHM7CisvLwkJCWZzLT5wdHM2NCA9IHAtPnB0czY0OworCQl9CisJCWZzLT5mcmFtZV9zaXplICs9IHAtPmZyYW1lX3NpemU7CisjaWYgKE1WQ19FWFRFTlNJT05fRU5BQkxFKQorCQlmcy0+dmlld19pZCA9IHAtPnZpZXdfaWQ7CisJCWZzLT5pbnRlcl92aWV3X2ZsYWdbMF0gPSBwLT5pbnRlcl92aWV3X2ZsYWc7CisJCWZzLT5hbmNob3JfcGljX2ZsYWdbMF0gPSBwLT5hbmNob3JfcGljX2ZsYWc7CisjZW5kaWYKKwkJaWYgKHAtPnVzZWRfZm9yX3JlZmVyZW5jZSkgeworCQkJZnMtPmlzX3JlZmVyZW5jZSB8PSAxOworCQkJZnMtPmlzX29yaWdfcmVmZXJlbmNlIHw9IDE7CisJCQlpZiAocC0+aXNfbG9uZ190ZXJtKSB7CisJCQkJZnMtPmlzX2xvbmdfdGVybSB8PSAxOworCQkJCWZzLT5sb25nX3Rlcm1fZnJhbWVfaWR4ID0KKwkJCQkJcC0+bG9uZ190ZXJtX2ZyYW1lX2lkeDsKKwkJCX0KKwkJfQorCQlpZiAoZnMtPmlzX3VzZWQgPT0gMykgeworCQkJLyogZ2VuZXJhdGUgZnJhbWUgdmlldyAqLworCQkJZHBiX2NvbWJpbmVfZmllbGQocF9IMjY0X0RwYiwgZnMpOworCQl9IGVsc2UgeworCQkJZnMtPnBvYyA9IHAtPnBvYzsKKwkJfQorCQlnZW5fZmllbGRfcmVmX2lkcyhwX1ZpZCwgcCk7CisJCWJyZWFrOworCWNhc2UgQk9UVE9NX0ZJRUxEOgorCQlmcy0+Ym90dG9tX2ZpZWxkID0gcDsKKwkJZnMtPmlzX3VzZWQgfD0gMjsKKwkJZnMtPmxheWVyX2lkID0gcC0+bGF5ZXJfaWQ7CisJCWlmIChmcy0+ZnJhbWVfc2l6ZSA9PSAwKSB7CisJCQlmcy0+c2xpY2VfdHlwZSA9IHAtPnNsaWNlX3R5cGU7CisvLwkJCWZzLT5wdHMgPSBwLT5wdHM7CisvLwkJCWZzLT5wdHM2NCA9IHAtPnB0czY0OworCQl9CisJCWZzLT5mcmFtZV9zaXplICs9IHAtPmZyYW1lX3NpemU7CisjaWYgKE1WQ19FWFRFTlNJT05fRU5BQkxFKQorCQlmcy0+dmlld19pZCA9IHAtPnZpZXdfaWQ7CisJCWZzLT5pbnRlcl92aWV3X2ZsYWdbMV0gPSBwLT5pbnRlcl92aWV3X2ZsYWc7CisJCWZzLT5hbmNob3JfcGljX2ZsYWdbMV0gPSBwLT5hbmNob3JfcGljX2ZsYWc7CisjZW5kaWYKKwkJaWYgKHAtPnVzZWRfZm9yX3JlZmVyZW5jZSkgeworCQkJZnMtPmlzX3JlZmVyZW5jZSB8PSAyOworCQkJZnMtPmlzX29yaWdfcmVmZXJlbmNlIHw9IDI7CisJCQlpZiAocC0+aXNfbG9uZ190ZXJtKSB7CisJCQkJZnMtPmlzX2xvbmdfdGVybSB8PSAyOworCQkJCWZzLT5sb25nX3Rlcm1fZnJhbWVfaWR4ID0KKwkJCQkJcC0+bG9uZ190ZXJtX2ZyYW1lX2lkeDsKKwkJCX0KKwkJfQorCQlpZiAoZnMtPmlzX3VzZWQgPT0gMykgeworCQkJLyogZ2VuZXJhdGUgZnJhbWUgdmlldyAqLworCQkJZHBiX2NvbWJpbmVfZmllbGQocF9IMjY0X0RwYiwgZnMpOworCQl9IGVsc2UgeworCQkJZnMtPnBvYyA9IHAtPnBvYzsKKwkJfQorCQlnZW5fZmllbGRfcmVmX2lkcyhwX1ZpZCwgcCk7CisJCWJyZWFrOworCX0KKwlmcy0+ZnJhbWVfbnVtID0gcC0+cGljX251bTsKKwlmcy0+cmVjb3ZlcnlfZnJhbWUgPSBwLT5yZWNvdmVyeV9mcmFtZTsKKworCWZzLT5pc19vdXRwdXQgPSBwLT5pc19vdXRwdXQ7CisJZnMtPnByZV9vdXRwdXQgPSBwLT5wcmVfb3V0cHV0OworCisJLyogcGljdHVyZSBxb3MgaW5mb21hdGlvbiovCisJZnMtPm1heF9tdiA9IHAtPm1heF9tdjsKKwlmcy0+YXZnX212ID0gcC0+YXZnX212OworCWZzLT5taW5fbXYgPSBwLT5taW5fbXY7CisKKwlmcy0+bWF4X3FwID0gcC0+bWF4X3FwOworCWZzLT5hdmdfcXAgPSBwLT5hdmdfcXA7CisJZnMtPm1pbl9xcCA9IHAtPm1pbl9xcDsKKworCWZzLT5tYXhfc2tpcCA9IHAtPm1heF9za2lwOworCWZzLT5hdmdfc2tpcCA9IHAtPmF2Z19za2lwOworCWZzLT5taW5fc2tpcCA9IHAtPm1pbl9za2lwOworCisJaWYgKGZzLT5pc191c2VkID09IDMpIHsKKwkJY2FsY3VsYXRlX2ZyYW1lX25vKHBfVmlkLCBwKTsKKyNpZiAwCisvKiA/Pz8gKi8KKwlpZiAoLTEgIT0gcF9WaWQtPnBfcmVmICYmICFwX0lucC0+c2lsZW50KQorCQlmaW5kX3NucihwX1ZpZCwgZnMtPmZyYW1lLCAmcF9WaWQtPnBfcmVmKTsKKyNlbmRpZgorCS8vZnMtPnB0cyA9IHAtPnB0czsKKwkvL2ZzLT5wdHM2NCA9IHAtPnB0czY0OworCX0KKwlmcy0+dGltZXN0YW1wID0gcC0+dGltZXN0YW1wOworCWlmIChtdmZybSkgeworCQlmcy0+ZnJhbWVfc2l6ZTIgPSBtdmZybS0+ZnJhbWVfc2l6ZTsKKwkJZnMtPmh3X2RlY29kZV90aW1lID0gbXZmcm0tPmh3X2RlY29kZV90aW1lOworCX0KK30KKwordm9pZCByZXNldF9mcmFtZV9zdG9yZShzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiwKKwkJCSAgICAgIHN0cnVjdCBGcmFtZVN0b3JlICpmKQoreworCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCSIlc1xuIiwgX19mdW5jX18pOworCisJaWYgKGYpIHsKKwkJaWYgKGYtPmZyYW1lKSB7CisJCQlmcmVlX3BpY3R1cmUocF9IMjY0X0RwYiwgZi0+ZnJhbWUpOworCQkJZi0+ZnJhbWUgPSBOVUxMOworCQl9CisJCWlmIChmLT50b3BfZmllbGQpIHsKKwkJCWZyZWVfcGljdHVyZShwX0gyNjRfRHBiLCBmLT50b3BfZmllbGQpOworCQkJZi0+dG9wX2ZpZWxkID0gTlVMTDsKKwkJfQorCQlpZiAoZi0+Ym90dG9tX2ZpZWxkKSB7CisJCQlmcmVlX3BpY3R1cmUocF9IMjY0X0RwYiwgZi0+Ym90dG9tX2ZpZWxkKTsKKwkJCWYtPmJvdHRvbV9maWVsZCA9IE5VTEw7CisJCX0KKworCQkvKiovCisJCWYtPmlzX3VzZWQgICAgICA9IDA7CisJCWYtPmlzX3JlZmVyZW5jZSA9IDA7CisJCWYtPmlzX2xvbmdfdGVybSA9IDA7CisJCWYtPmlzX29yaWdfcmVmZXJlbmNlID0gMDsKKworCQlmLT5pc19vdXRwdXQgPSAwOworCQlmLT5wcmVfb3V0cHV0ID0gMDsKKwkJZi0+c2hvd19mcmFtZSAgID0gZmFsc2U7CisKKwkJZi0+ZnJhbWUgICAgICAgID0gTlVMTDsKKwkJZi0+dG9wX2ZpZWxkICAgID0gTlVMTDsKKwkJZi0+Ym90dG9tX2ZpZWxkID0gTlVMTDsKKworCQkvKiBmcmVlKGYpOyAqLworCX0KK30KKwordm9pZCB1bm1hcmtfZm9yX3JlZmVyZW5jZShzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiLAorCQkJCSBzdHJ1Y3QgRnJhbWVTdG9yZSAqZnMpCit7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSBjb250YWluZXJfb2YocF9EcGIsCisJCQkJc3RydWN0IGgyNjRfZHBiX3N0cnUsIG1EUEIpOworCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCSIlcyAlcCAlcCAlcCAlcFxuIiwgX19mdW5jX18sCisJCWZzLCBmcy0+ZnJhbWUsIGZzLT50b3BfZmllbGQsIGZzLT5ib3R0b21fZmllbGQpOworCS8qIHJldHVybjsgKi8KKwlpZiAoZnMtPmlzX3VzZWQgJiAxKSB7CisJCWlmIChmcy0+dG9wX2ZpZWxkKQorCQkJZnMtPnRvcF9maWVsZC0+dXNlZF9mb3JfcmVmZXJlbmNlID0gMDsKKwl9CisJaWYgKGZzLT5pc191c2VkICYgMikgeworCQlpZiAoZnMtPmJvdHRvbV9maWVsZCkKKwkJCWZzLT5ib3R0b21fZmllbGQtPnVzZWRfZm9yX3JlZmVyZW5jZSA9IDA7CisJfQorCWlmIChmcy0+aXNfdXNlZCA9PSAzKSB7CisJCWlmIChmcy0+dG9wX2ZpZWxkICYmIGZzLT5ib3R0b21fZmllbGQpIHsKKwkJCWZzLT50b3BfZmllbGQtPnVzZWRfZm9yX3JlZmVyZW5jZSA9IDA7CisJCQlmcy0+Ym90dG9tX2ZpZWxkLT51c2VkX2Zvcl9yZWZlcmVuY2UgPSAwOworCQl9CisJCWZzLT5mcmFtZS0+dXNlZF9mb3JfcmVmZXJlbmNlID0gMDsKKwl9CisKKwlmcy0+aXNfcmVmZXJlbmNlID0gMDsKKworfQorCitzdGF0aWMgdm9pZCB1bm1hcmtfZm9yX2xvbmdfdGVybV9yZWZlcmVuY2Uoc3RydWN0IEZyYW1lU3RvcmUgKmZzKQoreworCWlmIChmcy0+aXNfdXNlZCAmIDEpIHsKKwkJaWYgKGZzLT50b3BfZmllbGQpIHsKKwkJCWZzLT50b3BfZmllbGQtPnVzZWRfZm9yX3JlZmVyZW5jZSA9IDA7CisJCQlmcy0+dG9wX2ZpZWxkLT5pc19sb25nX3Rlcm0gPSAwOworCQl9CisJfQorCWlmIChmcy0+aXNfdXNlZCAmIDIpIHsKKwkJaWYgKGZzLT5ib3R0b21fZmllbGQpIHsKKwkJCWZzLT5ib3R0b21fZmllbGQtPnVzZWRfZm9yX3JlZmVyZW5jZSA9IDA7CisJCQlmcy0+Ym90dG9tX2ZpZWxkLT5pc19sb25nX3Rlcm0gPSAwOworCQl9CisJfQorCWlmIChmcy0+aXNfdXNlZCA9PSAzKSB7CisJCWlmIChmcy0+dG9wX2ZpZWxkICYmIGZzLT5ib3R0b21fZmllbGQpIHsKKwkJCWZzLT50b3BfZmllbGQtPnVzZWRfZm9yX3JlZmVyZW5jZSA9IDA7CisJCQlmcy0+dG9wX2ZpZWxkLT5pc19sb25nX3Rlcm0gPSAwOworCQkJZnMtPmJvdHRvbV9maWVsZC0+dXNlZF9mb3JfcmVmZXJlbmNlID0gMDsKKwkJCWZzLT5ib3R0b21fZmllbGQtPmlzX2xvbmdfdGVybSA9IDA7CisJCX0KKwkJZnMtPmZyYW1lLT51c2VkX2Zvcl9yZWZlcmVuY2UgPSAwOworCQlmcy0+ZnJhbWUtPmlzX2xvbmdfdGVybSA9IDA7CisJfQorCisJZnMtPmlzX3JlZmVyZW5jZSA9IDA7CisJZnMtPmlzX2xvbmdfdGVybSA9IDA7Cit9CisKK2ludCBnZXRfbG9uZ190ZXJtX2ZsYWdfYnlfYnVmX3NwZWNfbnVtKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLAorCWludCBidWZfc3BlY19udW0pCit7CisJc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYiA9ICZwX0gyNjRfRHBiLT5tRFBCOworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IHBfRHBiLT51c2VkX3NpemU7IGkrKykgeworCQlpZiAocF9EcGItPmZzW2ldLT5idWZfc3BlY19udW0gPT0gYnVmX3NwZWNfbnVtKQorCQkJcmV0dXJuIHBfRHBiLT5mc1tpXS0+aXNfbG9uZ190ZXJtOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9waWNfbnVtKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBTbGljZSAqY3VyclNsaWNlID0gJnBfSDI2NF9EcGItPm1TbGljZTsKKwlzdHJ1Y3QgVmlkZW9QYXJhbWV0ZXJzICpwX1ZpZCA9IGN1cnJTbGljZS0+cF9WaWQ7CisJc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYiA9IGN1cnJTbGljZS0+cF9EcGI7CisJc3RydWN0IFNQU1BhcmFtZXRlcnMgKmFjdGl2ZV9zcHMgPSBwX1ZpZC0+YWN0aXZlX3NwczsKKwlpbnQgYWRkX3RvcCA9IDAsIGFkZF9ib3R0b20gPSAwOworCWludCBtYXhfZnJhbWVfbnVtID0gMSA8PCAoYWN0aXZlX3Nwcy0+bG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCArIDQpOworCisJaWYgKGN1cnJTbGljZS0+c3RydWN0dXJlID09IEZSQU1FKSB7CisJCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+cmVmX2ZyYW1lc19pbl9idWZmZXI7IGkrKykgeworI2lmZGVmIEVSUk9SX0NIRUNLCisJCQlpZiAocF9EcGItPmZzX3JlZltpXSA9PSBOVUxMIHx8CisJCQkJcF9EcGItPmZzX3JlZltpXS0+ZnJhbWUgPT0gTlVMTCkgeworCQkJCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnID0gX19MSU5FX187CisJCQkJY29udGludWU7CisJCQl9CisjZW5kaWYKKwkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldLT5pc191c2VkID09IDMpIHsKKwkJCQlpZiAoKHBfRHBiLT5mc19yZWZbaV0tPmZyYW1lLT4KKwkJCQkJdXNlZF9mb3JfcmVmZXJlbmNlKSAmJgorCQkJCSAgICAoIXBfRHBiLT5mc19yZWZbaV0tPmZyYW1lLT4KKwkJCQkJaXNfbG9uZ190ZXJtKSkgeworCQkJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+ZnJhbWVfbnVtID4KKwkJCQkJCWN1cnJTbGljZS0+ZnJhbWVfbnVtKSB7CisJCQkJCQlwX0RwYi0+ZnNfcmVmW2ldLT4KKwkJCQkJCWZyYW1lX251bV93cmFwID0KKwkJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmZyYW1lX251bQorCQkJCQkJCS0gbWF4X2ZyYW1lX251bTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXBfRHBiLT5mc19yZWZbaV0tPgorCQkJCQkJZnJhbWVfbnVtX3dyYXAgPQorCQkJCQkJcF9EcGItPmZzX3JlZltpXS0+ZnJhbWVfbnVtOworCQkJCQl9CisJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmZyYW1lLT5waWNfbnVtID0KKwkJCQkJcF9EcGItPmZzX3JlZltpXS0+ZnJhbWVfbnVtX3dyYXA7CisJCQkJfQorCQkJfQorCQl9CisJCS8qIHVwZGF0ZSBsb25nX3Rlcm1fcGljX251bSAqLworCQlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPmx0cmVmX2ZyYW1lc19pbl9idWZmZXI7IGkrKykgeworI2lmZGVmIEVSUk9SX0NIRUNLCisJCQlpZiAocF9EcGItPmZzX2x0cmVmW2ldID09IE5VTEwgfHwKKwkJCQlwX0RwYi0+ZnNfbHRyZWZbaV0tPmZyYW1lID09IE5VTEwpIHsKKwkJCQlwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyA9IF9fTElORV9fOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmCisJCQlpZiAocF9EcGItPmZzX2x0cmVmW2ldLT5pc191c2VkID09IDMpIHsKKwkJCQlpZiAocF9EcGItPmZzX2x0cmVmW2ldLT5mcmFtZS0+aXNfbG9uZ190ZXJtKSB7CisJCQkJCXBfRHBiLT5mc19sdHJlZltpXS0+ZnJhbWUtPgorCQkJCQkJbG9uZ190ZXJtX3BpY19udW0gPQorCQkJCQkJcF9EcGItPmZzX2x0cmVmW2ldLT5mcmFtZS0+CisJCQkJCQkJbG9uZ190ZXJtX2ZyYW1lX2lkeDsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAoY3VyclNsaWNlLT5zdHJ1Y3R1cmUgPT0gVE9QX0ZJRUxEKSB7CisJCQlhZGRfdG9wICAgID0gMTsKKwkJCWFkZF9ib3R0b20gPSAwOworCQl9IGVsc2UgeworCQkJYWRkX3RvcCAgICA9IDA7CisJCQlhZGRfYm90dG9tID0gMTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+cmVmX2ZyYW1lc19pbl9idWZmZXI7IGkrKykgeworI2lmZGVmIEVSUk9SX0NIRUNLCisJCQlpZiAocF9EcGItPmZzX3JlZltpXSA9PSBOVUxMKSB7CisJCQkJcF9IMjY0X0RwYi0+ZHBiX2Vycm9yX2ZsYWcgPSBfX0xJTkVfXzsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNlbmRpZgorCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0tPmlzX3JlZmVyZW5jZSkgeworCQkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZV9udW0gPiBjdXJyU2xpY2UtPgorCQkJCQlmcmFtZV9udW0pIHsKKwkJCQkJcF9EcGItPmZzX3JlZltpXS0+ZnJhbWVfbnVtX3dyYXAgPQorCQkJCQlwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZV9udW0gLQorCQkJCQltYXhfZnJhbWVfbnVtOworCQkJCX0gZWxzZSB7CisJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmZyYW1lX251bV93cmFwID0KKwkJCQkJcF9EcGItPmZzX3JlZltpXS0+ZnJhbWVfbnVtOworCQkJCX0KKwkJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+aXNfcmVmZXJlbmNlICYgMSkgeworI2lmZGVmIEVSUk9SX0NIRUNLCisJCQkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldLT50b3BfZmllbGQKKwkJCQkJCT09IE5VTEwpIHsKKwkJCQkJCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnID0KKwkJCQkJCQlfX0xJTkVfXzsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisjZW5kaWYKKwkJCQkJcF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkLT4KKwkJCQkJcGljX251bSA9ICgyICogcF9EcGItPmZzX3JlZltpXS0+CisJCQkJCQlmcmFtZV9udW1fd3JhcCkgKyBhZGRfdG9wOworCQkJCX0KKwkJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+aXNfcmVmZXJlbmNlICYgMikgeworI2lmZGVmIEVSUk9SX0NIRUNLCisJCQkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldLT5ib3R0b21fZmllbGQKKwkJCQkJCT09IE5VTEwpIHsKKwkJCQkJCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnID0KKwkJCQkJCQlfX0xJTkVfXzsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisjZW5kaWYKKwkJCQkJcF9EcGItPmZzX3JlZltpXS0+Ym90dG9tX2ZpZWxkLT4KKwkJCQkJcGljX251bSA9ICgyICogcF9EcGItPmZzX3JlZltpXS0+CisJCQkJCQlmcmFtZV9udW1fd3JhcCkgKyBhZGRfYm90dG9tOworCQkJCX0KKwkJCX0KKwkJfQorCQkvKiB1cGRhdGUgbG9uZ190ZXJtX3BpY19udW0gKi8KKwkJZm9yIChpID0gMDsgaSA8IHBfRHBiLT5sdHJlZl9mcmFtZXNfaW5fYnVmZmVyOyBpKyspIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJaWYgKHBfRHBiLT5mc19sdHJlZltpXSA9PSBOVUxMKSB7CisJCQkJcF9IMjY0X0RwYi0+ZHBiX2Vycm9yX2ZsYWcgPSBfX0xJTkVfXzsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNlbmRpZgorCQkJaWYgKHBfRHBiLT5mc19sdHJlZltpXS0+aXNfbG9uZ190ZXJtICYgMSkgeworI2lmZGVmIEVSUk9SX0NIRUNLCisJCQkJaWYgKHBfRHBiLT5mc19sdHJlZltpXS0+dG9wX2ZpZWxkID09IE5VTEwpIHsKKwkJCQkJcF9IMjY0X0RwYi0+ZHBiX2Vycm9yX2ZsYWcgPSBfX0xJTkVfXzsKKwkJCQkJY29udGludWU7CisJCQkJfQorI2VuZGlmCisJCQkJcF9EcGItPmZzX2x0cmVmW2ldLT50b3BfZmllbGQtPgorCQkJCQlsb25nX3Rlcm1fcGljX251bSA9IDIgKgorCQkJCQlwX0RwYi0+ZnNfbHRyZWZbaV0tPnRvcF9maWVsZC0+CisJCQkJCWxvbmdfdGVybV9mcmFtZV9pZHggKyBhZGRfdG9wOworCQkJfQorCQkJaWYgKHBfRHBiLT5mc19sdHJlZltpXS0+aXNfbG9uZ190ZXJtICYgMikgeworI2lmZGVmIEVSUk9SX0NIRUNLCisJCQkJaWYgKHBfRHBiLT5mc19sdHJlZltpXS0+Ym90dG9tX2ZpZWxkID09IE5VTEwpIHsKKwkJCQkJcF9IMjY0X0RwYi0+ZHBiX2Vycm9yX2ZsYWcgPSBfX0xJTkVfXzsKKwkJCQkJY29udGludWU7CisJCQkJfQorI2VuZGlmCisJCQkJcF9EcGItPmZzX2x0cmVmW2ldLT5ib3R0b21fZmllbGQtPgorCQkJCQlsb25nX3Rlcm1fcGljX251bSA9IDIgKgorCQkJCQlwX0RwYi0+ZnNfbHRyZWZbaV0tPmJvdHRvbV9maWVsZC0+CisJCQkJCWxvbmdfdGVybV9mcmFtZV9pZHggKyBhZGRfYm90dG9tOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCByZW1vdmVfZnJhbWVfZnJvbV9kcGIoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIsIGludCBwb3MpCit7CisJc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYiA9ICZwX0gyNjRfRHBiLT5tRFBCOworCXN0cnVjdCBGcmFtZVN0b3JlICpmcyA9IHBfRHBiLT5mc1twb3NdOworCXN0cnVjdCBGcmFtZVN0b3JlICp0bXA7CisJdW5zaWduZWQgaW50IGk7CisKKwlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkiJXMgcG9zICVkICVwXG4iLCBfX2Z1bmNfXywgcG9zLCBmcyk7CisKKwkvKiBkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCSAqCSJyZW1vdmUgZnJhbWUgd2l0aCBmcmFtZV9udW0gIyVkXG4iLCBmcy0+ZnJhbWVfbnVtKTsKKwkgKi8KKwlzd2l0Y2ggKGZzLT5pc191c2VkKSB7CisJY2FzZSAzOgorCQlmcmVlX3BpY3R1cmUocF9IMjY0X0RwYiwgZnMtPmZyYW1lKTsKKwkJZnJlZV9waWN0dXJlKHBfSDI2NF9EcGIsIGZzLT50b3BfZmllbGQpOworCQlmcmVlX3BpY3R1cmUocF9IMjY0X0RwYiwgZnMtPmJvdHRvbV9maWVsZCk7CisJCWZzLT5mcmFtZSA9IE5VTEw7CisJCWZzLT50b3BfZmllbGQgPSBOVUxMOworCQlmcy0+Ym90dG9tX2ZpZWxkID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlmcmVlX3BpY3R1cmUocF9IMjY0X0RwYiwgZnMtPmJvdHRvbV9maWVsZCk7CisJCWZzLT5ib3R0b21fZmllbGQgPSBOVUxMOworCQlicmVhazsKKwljYXNlIDE6CisJCWZyZWVfcGljdHVyZShwX0gyNjRfRHBiLCBmcy0+dG9wX2ZpZWxkKTsKKwkJZnMtPnRvcF9maWVsZCA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgMDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSAgImludmFsaWQgZnJhbWUgc3RvcmUgdHlwZSAleCIsIDUwMCk7CisJfQorCWZzLT5kYXRhX2ZsYWcgPSAwOworCWZzLT5pc191c2VkID0gMDsKKwlmcy0+aXNfbG9uZ190ZXJtID0gMDsKKwlmcy0+aXNfcmVmZXJlbmNlID0gMDsKKwlmcy0+aXNfb3JpZ19yZWZlcmVuY2UgPSAwOworCWZzLT5mcmFtZV9zaXplID0gMDsKKwkvKiBtb3ZlIGVtcHR5IGZyYW1lc3RvcmUgdG8gZW5kIG9mIGJ1ZmZlciAqLworCXRtcCA9IHBfRHBiLT5mc1twb3NdOworCisJZm9yIChpID0gcG9zOyBpIDwgcF9EcGItPnVzZWRfc2l6ZSAtIDE7IGkrKykKKwkJcF9EcGItPmZzW2ldID0gcF9EcGItPmZzW2kgKyAxXTsKKwlwX0RwYi0+ZnNbcF9EcGItPnVzZWRfc2l6ZSAtIDFdID0gdG1wOworCisJaWYgKHBfRHBiLT51c2VkX3NpemUpCisJCXBfRHBiLT51c2VkX3NpemUtLTsKK30KKworaW50IGlzX3VzZWRfZm9yX3JlZmVyZW5jZShzdHJ1Y3QgRnJhbWVTdG9yZSAqZnMpCit7CisJaWYgKGZzLT5pc19yZWZlcmVuY2UpCisJCXJldHVybiAxOworCisJaWYgKGZzLT5pc191c2VkID09IDMpIHsgLyogZnJhbWUgKi8KKwkJaWYgKGZzLT5mcmFtZS0+dXNlZF9mb3JfcmVmZXJlbmNlKQorCQkJcmV0dXJuIDE7CisJfQorCisJaWYgKGZzLT5pc191c2VkICYgMSkgeyAvKiB0b3AgZmllbGQgKi8KKwkJaWYgKGZzLT50b3BfZmllbGQpIHsKKwkJCWlmIChmcy0+dG9wX2ZpZWxkLT51c2VkX2Zvcl9yZWZlcmVuY2UpCisJCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlpZiAoZnMtPmlzX3VzZWQgJiAyKSB7IC8qIGJvdHRvbSBmaWVsZCAqLworCQlpZiAoZnMtPmJvdHRvbV9maWVsZCkgeworCQkJaWYgKGZzLT5ib3R0b21fZmllbGQtPnVzZWRfZm9yX3JlZmVyZW5jZSkKKwkJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZW1vdmVfdW51c2VkX2ZyYW1lX2Zyb21fZHBiKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIgPSAmcF9IMjY0X0RwYi0+bURQQjsKKwkvKiBjaGVjayBmb3IgZnJhbWVzIHRoYXQgd2VyZSBhbHJlYWR5IG91dHB1dCBhbmQgbm8gbG9uZ2VyCisJICoJdXNlZCBmb3IgcmVmZXJlbmNlCisJICovCisJZm9yIChpID0gMDsgaSA8IHBfRHBiLT51c2VkX3NpemU7IGkrKykgeworCQlpZiAoKCFpc191c2VkX2Zvcl9yZWZlcmVuY2UocF9EcGItPmZzW2ldKSkgJiYKKwkJICAgIChwX0RwYi0+ZnNbaV0tPmNvbG9jYXRlZF9idWZfaW5kZXggPj0gMCkpIHsKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJInJlbGVhc2VfY29sb2NhdGVfYnVmWyVkXSBmb3IgZnNbJWRdXG4iLAorCQkJcF9EcGItPmZzW2ldLT5jb2xvY2F0ZWRfYnVmX2luZGV4LCBpKTsKKworCQkJcmVsZWFzZV9jb2xvY2F0ZV9idWYocF9IMjY0X0RwYiwKKwkJCQlwX0RwYi0+ZnNbaV0tPmNvbG9jYXRlZF9idWZfaW5kZXgpOyAvKiByYWluICovCisJCQlwX0RwYi0+ZnNbaV0tPmNvbG9jYXRlZF9idWZfaW5kZXggPSAtMTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+dXNlZF9zaXplOyBpKyspIHsKKwkJaWYgKHBfRHBiLT5mc1tpXS0+aXNfb3V0cHV0ICYmCisJCQkoIWlzX3VzZWRfZm9yX3JlZmVyZW5jZShwX0RwYi0+ZnNbaV0pKSkgeworCQkJcmVsZWFzZV9idWZfc3BlY19udW0ocF9IMjY0X0RwYi0+dmRlYywKKwkJCQlwX0RwYi0+ZnNbaV0tPmJ1Zl9zcGVjX251bSk7CisJCQlwX0RwYi0+ZnNbaV0tPmJ1Zl9zcGVjX251bSA9IC0xOworCQkJcmVtb3ZlX2ZyYW1lX2Zyb21fZHBiKHBfSDI2NF9EcGIsIGkpOworCisJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsICIlc1slZF1cbiIsCisJCQkJX19mdW5jX18sIGkpOworCisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1bm1hcmtfb25lX2Vycm9yX291dF9mcmFtZShzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYikKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBpOworCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIgPSAmcF9IMjY0X0RwYi0+bURQQjsKKworCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+dXNlZF9zaXplOyBpKyspIHsKKwkJaWYgKHBfRHBiLT5mc1tpXS0+aXNfb3V0cHV0ICYmCisJCQkoKHBfRHBiLT5mc1tpXS0+ZGF0YV9mbGFnICYgRVJST1JfRkxBRykgfHwKKwkJCShwX0RwYi0+ZnNbaV0tPmRhdGFfZmxhZyAmIE5VTExfRkxBRykpCisJCQkpIHsKKwkJCXVubWFya19mb3JfcmVmZXJlbmNlKHBfRHBiLCBwX0RwYi0+ZnNbaV0pOworCisJCQlyZXQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB1bm1hcmtfb25lX291dF9mcmFtZShzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYikKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBpOworCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIgPSAmcF9IMjY0X0RwYi0+bURQQjsKKworCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+dXNlZF9zaXplOyBpKyspIHsKKwkJaWYgKHBfRHBiLT5mc1tpXS0+aXNfb3V0cHV0KSB7CisJCQl1bm1hcmtfZm9yX3JlZmVyZW5jZShwX0RwYiwgcF9EcGItPmZzW2ldKTsKKworCQkJcmV0ID0gMTsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorLyoKKwlmb3JjZV9mbGFnLAorCQkxLCByZW1vdmUgb25lIGVycm9yIGJ1ZiAoaXNfb3V0IGlzIDEpIGlmIHRoZXJlIGlzIG5vIHVuLXVzZWQgYnVmCisJCTIsIHJlbW92ZSBvbmUgYnVmIChpc19vdXQgaXMgMSkgaWYgdGhlcmUgaXMgbm8gdW4tdXNlZCBidWYKKyovCit2b2lkIGJ1Zm1ncl9oMjY0X3JlbW92ZV91bnVzZWRfZnJhbWUoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIsCisJdTggZm9yY2VfZmxhZykKK3sKKwlzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiID0gJnBfSDI2NF9EcGItPm1EUEI7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgY2hhciByZW1vdmVkX2ZsYWcgPSAwOworCWRvIHsKKwkJcmV0ID0gcmVtb3ZlX3VudXNlZF9mcmFtZV9mcm9tX2RwYihwX0gyNjRfRHBiKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJcmVtb3ZlZF9mbGFnID0gMTsKKwl9IHdoaWxlIChyZXQgIT0gMCk7CisJaWYgKHJlbW92ZWRfZmxhZykgeworCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwgIiVzXHJcbiIsIF9fZnVuY19fKTsKKwkJZHVtcF9kcGIocF9EcGIsIDApOworCX0gZWxzZSBpZiAoZm9yY2VfZmxhZyA9PSAyKSB7CisJCWlmICh1bm1hcmtfb25lX291dF9mcmFtZShwX0gyNjRfRHBiKSkgeworCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJMCwgIiVzLCBXYXJubmluZywgZm9yY2UgdW5tYXJrIG9uZSBmcmFtZVxyXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXVwZGF0ZV9yZWZfbGlzdChwX0RwYik7CisJCQlyZW1vdmVfdW51c2VkX2ZyYW1lX2Zyb21fZHBiKHBfSDI2NF9EcGIpOworCQkJZHVtcF9kcGIocF9EcGIsIDApOworCQl9CisJfSBlbHNlIGlmIChmb3JjZV9mbGFnID09IDEpIHsKKwkJaWYgKHVubWFya19vbmVfZXJyb3Jfb3V0X2ZyYW1lKHBfSDI2NF9EcGIpKSB7CisJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQkwLCAiJXMsIHVubWFyayBlcnJvciBmcmFtZVxyXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXVwZGF0ZV9yZWZfbGlzdChwX0RwYik7CisJCQlyZW1vdmVfdW51c2VkX2ZyYW1lX2Zyb21fZHBiKHBfSDI2NF9EcGIpOworCQkJZHVtcF9kcGIocF9EcGIsIDApOworCQl9CisJfQorfQorCisjaWZkZWYgT1VUUFVUX0JVRkZFUl9JTl9DCitpbnQgaXNfdGhlcmVfdW51c2VkX2ZyYW1lX2Zyb21fZHBiKHN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBjaGVjayBmb3IgZnJhbWVzIHRoYXQgd2VyZSBhbHJlYWR5IG91dHB1dCBhbmQgbm8gbG9uZ2VyCisJICogdXNlZCBmb3IgcmVmZXJlbmNlCisJICovCisJZm9yIChpID0gMDsgaSA8IHBfRHBiLT51c2VkX3NpemU7IGkrKykgeworCQlpZiAocF9EcGItPmZzW2ldLT5pc19vdXRwdXQgJiYKKwkJCSghaXNfdXNlZF9mb3JfcmVmZXJlbmNlKHBfRHBiLT5mc1tpXSkpKSB7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBnZXRfc21hbGxlc3RfcG9jKHN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIsIGludCAqcG9jLAorCQkJICAgICBpbnQgKnBvcykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gY29udGFpbmVyX29mKHBfRHBiLAorCQkJCXN0cnVjdCBoMjY0X2RwYl9zdHJ1LCBtRFBCKTsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjPSAoc3RydWN0IHZkZWNfcyAqKXBfSDI2NF9EcGItPnZkZWM7CisJdm9pZCAqcCA9IHZoMjY0X2dldF9idWZzcGVjX2xvY2sodmRlYyk7CisJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJaWYgKHBfRHBiLT51c2VkX3NpemUgPCAxKSB7CisJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkgICJDYW5ub3QgZGV0ZXJtaW5lIHNtYWxsZXN0IFBPQywgRFBCIGVtcHR5LiAlZFxuIiwKKwkJCSAxNTApOworCX0KKworCSpwb3MgPSAtMTsKKwkqcG9jID0gSU5UX01BWDsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm47CisJc3Bpbl9sb2NrX2lycXNhdmUocCwgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+dXNlZF9zaXplOyBpKyspIHsKKyNpZmRlZiBPVVRQVVRfQlVGRkVSX0lOX0MKKwkJLyogcmFpbiAqLworCQlpZiAoKCpwb2MgPiBwX0RwYi0+ZnNbaV0tPnBvYykgJiYKKwkJCSghcF9EcGItPmZzW2ldLT5pc19vdXRwdXQpICYmCisJCQkoIXBfRHBiLT5mc1tpXS0+cHJlX291dHB1dCkpIHsKKyNlbHNlCisJCWlmICgoKnBvYyA+IHBfRHBiLT5mc1tpXS0+cG9jKSAmJiAoIXBfRHBiLT5mc1tpXS0+aXNfb3V0cHV0KSkgeworI2VuZGlmCisJCQkqcG9jID0gcF9EcGItPmZzW2ldLT5wb2M7CisJCQkqcG9zID0gaTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHAsIGZsYWdzKTsKK30KKworaW50IG91dHB1dF9mcmFtZXMoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIsIHVuc2lnbmVkIGNoYXIgZmx1c2hfZmxhZykKK3sKKwlpbnQgcG9jLCBwb3M7CisJc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYiA9ICZwX0gyNjRfRHBiLT5tRFBCOworCWludCBpOworCWludCBub25lX2Rpc3BsYXllZF9udW0gPSAwOworCXVuc2lnbmVkIGNoYXIgZmFzdF9vdXRwdXRfZmxhZyA9IDA7CisJaWYgKCFmbHVzaF9mbGFnKSB7CisJCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+dXNlZF9zaXplOyBpKyspIHsKKwkJCWlmICgoIXBfRHBiLT5mc1tpXS0+aXNfb3V0cHV0KSAmJgorCQkJCSghcF9EcGItPmZzW2ldLT5wcmVfb3V0cHV0KSAmJigocF9EcGItPmZzW2ldLT5pc191c2VkID09IDMKKwkJCQl8fHBfRHBiLT5mc1tpXS0+ZGF0YV9mbGFnICYgRVJST1JfRkxBRyApKSkgIHsKKwkJCQlub25lX2Rpc3BsYXllZF9udW0rKzsKKwkJCQlpZiAoKHBfSDI2NF9EcGItPmZpcnN0X2luc2VydF9mcmFtZSA9PSBGaXJzdEluc2VydEZybV9JRExFIHx8CisJCQkJCXBfSDI2NF9EcGItPmZpcnN0X2luc2VydF9mcmFtZSA9PSBGaXJzdEluc2VydEZybV9SRVNFVCkKKwkJCQkJJiYgIChwX0RwYi0+ZnNbaV0tPmlzX3VzZWQgPT0gMykKKwkJCQkJJiYgKHBfRHBiLT5sYXN0X291dHB1dF9wb2MgPT0gSU5UX01JTikpIHsKKwkJCQkJaWYgKHBfSDI2NF9EcGItPmZpcnN0X2luc2VydF9mcmFtZSA9PSBGaXJzdEluc2VydEZybV9JRExFKQorCQkJCQkJZmFzdF9vdXRwdXRfZmxhZyA9IDE7CisJCQkJCXBfSDI2NF9EcGItPmZpcnN0X2luc2VydF9mcmFtZSA9IEZpcnN0SW5zZXJ0RnJtX09VVDsKKwkJCQkJcF9IMjY0X0RwYi0+Zmlyc3Rfb3V0cHV0X3BvYyA9IHBfRHBiLT5mc1tpXS0+cG9jOworCQkJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJCQkJIiVzIGZpcnN0IGluc2VydCBmcmFtZSBpICVkICBwb2MgJWQgZnJhbWVfbnVtICV4XG4iLAorCQkJCQkJX19mdW5jX18sIGksIHBfRHBiLT5mc1tpXS0+cG9jLCAgcF9EcGItPmZzW2ldLT5mcmFtZV9udW0pOworCQkJCX0KKworCQkJCS8qY2hlY2sgcG9jIGV2ZW4vb2RkKi8KKwkJCQlpZiAocF9IMjY0X0RwYi0+cG9jX2V2ZW5fb2RkX2ZsYWcgPT0gMCAmJgorCQkJCQlwX0gyNjRfRHBiLT5kZWNvZGVfcGljX2NvdW50ID49IDMpCisJCQkJCXBfSDI2NF9EcGItPnBvY19ldmVuX29kZF9mbGFnID0gMjsKKwkJCQlpZiAocF9EcGItPmZzW2ldLT5wb2MgJiAweDEpCisJCQkJCXBfSDI2NF9EcGItPnBvY19ldmVuX29kZF9mbGFnID0gMTsKKwkJCQkvKiovCisKKwkJCQlpZiAoKHBfSDI2NF9EcGItPmZhc3Rfb3V0cHV0X2VuYWJsZSAmIDB4MSkgJiYKKwkJCQkJKHBfRHBiLT5mc1tpXS0+ZGF0YV9mbGFnICYgSURSX0ZMQUcpKQorCQkJCQlmYXN0X291dHB1dF9mbGFnID0gMTsKKwkJCQlpZiAoKHBfSDI2NF9EcGItPmZhc3Rfb3V0cHV0X2VuYWJsZSAmIDB4MikgJiYKKwkJCQkJKChwX0RwYi0+ZnNbaV0tPnBvYyAtCisJCQkJCQlwX0RwYi0+bGFzdF9vdXRwdXRfcG9jKQorCQkJCQk9PSAxKSkKKwkJCQkJZmFzdF9vdXRwdXRfZmxhZyA9IDE7CisJCQkJaWYgKChwX0gyNjRfRHBiLT5mYXN0X291dHB1dF9lbmFibGUgJiAweDQpICYmCisJCQkJCShwX0gyNjRfRHBiLT5wb2NfZXZlbl9vZGRfZmxhZyA9PSAyKSAmJgorCQkJCQkgKHBfRHBiLT5mc1tpXS0+aXNfdXNlZCA9PSAzKSAmJgorCQkJCQkoKHBfRHBiLT5mc1tpXS0+cG9jIC0KKwkJCQkJCXBfRHBiLT5sYXN0X291dHB1dF9wb2MpCisJCQkJCT09IDIpKQorCQkJCQlmYXN0X291dHB1dF9mbGFnID0gMTsKKwkJCX0KKwkJfQorCQlpZiAoZmFzdF9vdXRwdXRfZmxhZykKKwkJCTsKKwkJZWxzZSBpZiAobm9uZV9kaXNwbGF5ZWRfbnVtIDwKKwkJCXBfSDI2NF9EcGItPnJlb3JkZXJfb3V0cHV0KQorCQkJcmV0dXJuIDA7CisJfQorCisJZ2V0X3NtYWxsZXN0X3BvYyhwX0RwYiwgJnBvYywgJnBvcyk7CisKKwlpZiAocG9zID09IC0xKQorCQlyZXR1cm4gMDsKKyNpZiAwCisJaWYgKGlzX3VzZWRfZm9yX3JlZmVyZW5jZShwX0RwYi0+ZnNbcG9zXSkpCisJCXJldHVybiAwOworI2VuZGlmCisJaWYgKHBfSDI2NF9EcGItPmZpcnN0X2luc2VydF9mcmFtZSA9PSBGaXJzdEluc2VydEZybV9PVVQpIHsKKwkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSIlcyBwb3MgJWQgcG9zLT5wb2MgJWQgIGZpcnN0X291dHB1dF9wb2MgJWQgXG4iLAorCQkJX19mdW5jX18sIHBvcywgcF9EcGItPmZzW3Bvc10tPnBvYywgcF9IMjY0X0RwYi0+Zmlyc3Rfb3V0cHV0X3BvYyk7CisKKwkJaWYgKHBfRHBiLT5mc1twb3NdLT5wb2MgPCBwX0gyNjRfRHBiLT5maXJzdF9vdXRwdXRfcG9jKQorCQkJcF9EcGItPmZzW3Bvc10tPmRhdGFfZmxhZyB8PSBOT0RJU1BfRkxBRzsKKwkJZWxzZSBpZiAocF9EcGItPmxhc3Rfb3V0cHV0X3BvYyAhPSBJTlRfTUlOKQorCQkJcF9IMjY0X0RwYi0+Zmlyc3RfaW5zZXJ0X2ZyYW1lID0gRmlyc3RJbnNlcnRGcm1fU0tJUERPTkU7CisKKwkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSIlcyBmaXJzdF9pbnNlcnRfZnJhbWUgJWQgXG4iLCBfX2Z1bmNfXywgcF9IMjY0X0RwYi0+Zmlyc3RfaW5zZXJ0X2ZyYW1lKTsKKwl9CisJaWYgKHByZXBhcmVfZGlzcGxheV9idWYocF9IMjY0X0RwYi0+dmRlYywgcF9EcGItPmZzW3Bvc10pID49IDApIHsKKwkJaWYgKCFwX0gyNjRfRHBiLT53aXRob3V0X2Rpc3BsYXlfbW9kZSAmJgorCQkJCXBfRHBiLT5mc1twb3NdLT5zaG93X2ZyYW1lICE9IGZhbHNlKQorCQkJcF9EcGItPmZzW3Bvc10tPnByZV9vdXRwdXQgPSAxOworCX0gZWxzZSB7CisJCWlmIChoMjY0X2RlYnVnX2ZsYWcgJiBQUklOVF9GTEFHX0RQQl9ERVRBSUwpIHsKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCAwLAorCQkJIiVzWyVkXSBwb2M6JWQgbGFzdF9vdXRwdXRfcG9jOiVkIHBvY19ldmVuX29kZF9mbGFnOiVkXG4iLAorCQkJX19mdW5jX18sIHBvcywgcG9jLAorCQkJcF9EcGItPmxhc3Rfb3V0cHV0X3BvYywKKwkJCXBfSDI2NF9EcGItPnBvY19ldmVuX29kZF9mbGFnKTsKKwkJCWR1bXBfZHBiKHBfRHBiLCAxKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJIiVzWyVkXSBwb2MgJWQgbGFzdF9vdXRwdXRfcG9jICVkIHBvY19ldmVuX29kZF9mbGFnICVkXG4iLAorCQlfX2Z1bmNfXywgcG9zLCBwb2MsCisJCXBfRHBiLT5sYXN0X291dHB1dF9wb2MsCisJCXBfSDI2NF9EcGItPnBvY19ldmVuX29kZF9mbGFnKTsKKworCXBfRHBiLT5sYXN0X291dHB1dF9wb2MgPSBwb2M7CisJcmV0dXJuIDE7CisKK30KKworCit2b2lkIGZsdXNoX2RwYihzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYikKK3sKKwkvKiBzdHJ1Y3QgVmlkZW9QYXJhbWV0ZXJzICpwX1ZpZCA9IHBfRHBiLT5wX1ZpZDsgKi8KKwlzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiID0gJnBfSDI2NF9EcGItPm1EUEI7CisJdW5zaWduZWQgaW50IGk7CisKKwlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkiJXNcbiIsIF9fZnVuY19fKTsKKworCS8qIGRpYWdub3N0aWNzICovCisJLyogZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJICpQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJICoiRmx1c2ggcmVtYWluaW5nIGZyYW1lcyBmcm9tIHRoZSBkcGIuIgorCSAqInBfRHBiLT5zaXplID0gJWQsIHBfRHBiLT51c2VkX3NpemUgPSAlZFxuIiwKKwkgKnBfRHBiLT5zaXplLCBwX0RwYi0+dXNlZF9zaXplKTsKKwkgKi8KKworCWlmICghcF9EcGItPmluaXRfZG9uZSkKKwkJcmV0dXJuOworLyogIGlmKHBfVmlkLT5jb25jZWFsX21vZGUgPT0gMCkgKi8KKyNpZiAwCisvKiA/Pz8gKi8KKwlpZiAocF9WaWQtPmNvbmNlYWxfbW9kZSAhPSAwKQorCQljb25jZWFsX25vbl9yZWZfcGljcyhwX0RwYiwgMCk7CisjZW5kaWYKKwkvKiBtYXJrIGFsbCBmcmFtZXMgdW51c2VkICovCisJZm9yIChpID0gMDsgaSA8IHBfRHBiLT51c2VkX3NpemU7IGkrKykgeworI2lmIE1WQ19FWFRFTlNJT05fRU5BQkxFCisJCWFzc2VydChwX0RwYi0+ZnNbaV0tPnZpZXdfaWQgPT0gcF9EcGItPmxheWVyX2lkKTsKKyNlbmRpZgorCQl1bm1hcmtfZm9yX3JlZmVyZW5jZShwX0RwYiwgcF9EcGItPmZzW2ldKTsKKworCX0KKworCXdoaWxlIChyZW1vdmVfdW51c2VkX2ZyYW1lX2Zyb21fZHBiKHBfSDI2NF9EcGIpKQorCQk7CisKKwkvKiBvdXRwdXQgZnJhbWVzIGluIFBPQyBvcmRlciAqLworCXdoaWxlIChvdXRwdXRfZnJhbWVzKHBfSDI2NF9EcGIsIDEpKQorCQk7CisKKworCXBfRHBiLT5sYXN0X291dHB1dF9wb2MgPSBJTlRfTUlOOworfQorCitzdGF0aWMgaW50IGlzX3Nob3J0X3Rlcm1fcmVmZXJlbmNlKHN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIsCisJCQkJICAgc3RydWN0IEZyYW1lU3RvcmUgKmZzKQoreworCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gY29udGFpbmVyX29mKHBfRHBiLAorCQkJc3RydWN0IGgyNjRfZHBiX3N0cnUsIG1EUEIpOworCWlmIChmcy0+aXNfdXNlZCA9PSAzKSB7IC8qIGZyYW1lICovCisJCWlmICgoZnMtPmZyYW1lLT51c2VkX2Zvcl9yZWZlcmVuY2UpICYmCisJCQkoIWZzLT5mcmFtZS0+aXNfbG9uZ190ZXJtKSkgeworCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLCAiW1slcyAxXV0iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJaWYgKGZzLT5pc191c2VkICYgMSkgeyAvKiB0b3AgZmllbGQgKi8KKwkJaWYgKGZzLT50b3BfZmllbGQpIHsKKwkJCWlmICgoZnMtPnRvcF9maWVsZC0+dXNlZF9mb3JfcmVmZXJlbmNlKSAmJgorCQkJCSghZnMtPnRvcF9maWVsZC0+aXNfbG9uZ190ZXJtKSkgeworCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwgIltbJXMgMl1dIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoZnMtPmlzX3VzZWQgJiAyKSB7IC8qIGJvdHRvbSBmaWVsZCAqLworCQlpZiAoZnMtPmJvdHRvbV9maWVsZCkgeworCQkJaWYgKChmcy0+Ym90dG9tX2ZpZWxkLT51c2VkX2Zvcl9yZWZlcmVuY2UpICYmCisJCQkgICAgKCFmcy0+Ym90dG9tX2ZpZWxkLT5pc19sb25nX3Rlcm0pKSB7CisJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLCAiW1slcyAzXV0iLAorCQkJCV9fZnVuY19fKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc19sb25nX3Rlcm1fcmVmZXJlbmNlKHN0cnVjdCBGcmFtZVN0b3JlICpmcykKK3sKKworCWlmIChmcy0+aXNfdXNlZCA9PSAzKSB7IC8qIGZyYW1lICovCisJCWlmICgoZnMtPmZyYW1lLT51c2VkX2Zvcl9yZWZlcmVuY2UpICYmCisJCQkoZnMtPmZyYW1lLT5pc19sb25nX3Rlcm0pKSB7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCWlmIChmcy0+aXNfdXNlZCAmIDEpIHsgLyogdG9wIGZpZWxkICovCisJCWlmIChmcy0+dG9wX2ZpZWxkKSB7CisJCQlpZiAoKGZzLT50b3BfZmllbGQtPnVzZWRfZm9yX3JlZmVyZW5jZSkgJiYKKwkJCQkoZnMtPnRvcF9maWVsZC0+aXNfbG9uZ190ZXJtKSkgeworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCisJaWYgKGZzLT5pc191c2VkICYgMikgeyAvKiBib3R0b20gZmllbGQgKi8KKwkJaWYgKGZzLT5ib3R0b21fZmllbGQpIHsKKwkJCWlmICgoZnMtPmJvdHRvbV9maWVsZC0+dXNlZF9mb3JfcmVmZXJlbmNlKSAmJgorCQkJICAgIChmcy0+Ym90dG9tX2ZpZWxkLT5pc19sb25nX3Rlcm0pKSB7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgdXBkYXRlX3JlZl9saXN0KHN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIpCit7CisJdW5zaWduZWQgaW50IGksIGo7CisKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9IGNvbnRhaW5lcl9vZihwX0RwYiwKKwkJc3RydWN0IGgyNjRfZHBiX3N0cnUsIG1EUEIpOworCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCSIlcyAoJWQsICVkKVxuIiwgX19mdW5jX18sIHBfRHBiLT5zaXplLCBwX0RwYi0+dXNlZF9zaXplKTsKKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IHBfRHBiLT51c2VkX3NpemU7IGkrKykgeworI2lmIDEKKwkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSAgImZzWyVkXTogZnMgJXAgZnJhbWUgJXAgaXNfcmVmZXJlbmNlICVkICVkICVkXG4iLAorCQkJICBpLCBwX0RwYi0+ZnNbaV0sIHBfRHBiLT5mc1tpXS0+ZnJhbWUsCisJCQkgIHBfRHBiLT5mc1tpXS0+ZnJhbWUgIT0gTlVMTCA/CisJCQkgIHBfRHBiLT5mc1tpXS0+ZnJhbWUtPnVzZWRfZm9yX3JlZmVyZW5jZSA6IDAsCisJCQkgIHBfRHBiLT5mc1tpXS0+dG9wX2ZpZWxkICE9IE5VTEwgPworCQkJICBwX0RwYi0+ZnNbaV0tPnRvcF9maWVsZC0+dXNlZF9mb3JfcmVmZXJlbmNlIDoKKwkJCSAgMCwKKwkJCSAgcF9EcGItPmZzW2ldLT5ib3R0b21fZmllbGQgIT0gTlVMTCA/CisJCQkgIHBfRHBiLT5mc1tpXS0+Ym90dG9tX2ZpZWxkLT51c2VkX2Zvcl9yZWZlcmVuY2UgOiAwKTsKKyNlbmRpZgorCQlpZiAoaXNfc2hvcnRfdGVybV9yZWZlcmVuY2UocF9EcGIsIHBfRHBiLT5mc1tpXSkpIHsKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSJmc19yZWZbJWRdPWZzWyVkXTogZnMgJXBcbiIsIGosIGksIHBfRHBiLT5mc1tpXSk7CisJCQlwX0RwYi0+ZnNfcmVmW2orK10gPSBwX0RwYi0+ZnNbaV07CisJCX0KKwl9CisKKwlwX0RwYi0+cmVmX2ZyYW1lc19pbl9idWZmZXIgPSBqOworCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCSIlcyBkcGIgc2l6ZSBpcyAlZCwgJWRcbiIsIF9fZnVuY19fLCBwX0RwYi0+c2l6ZSwgaik7CisJd2hpbGUgKGogPCBwX0RwYi0+c2l6ZSkgeworCQkvKiBkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkgKiJmc19yZWZbJWRdPW51bGxcbiIsIGopOworCQkgKi8KKwkJcF9EcGItPmZzX3JlZltqKytdID0gTlVMTDsKKwl9CisjaWZkZWYgRVJST1JfQ0hFQ0sKKwlmb3IgKGkgPSAwOyBpIDwgRFBCX1NJWkVfTUFYOyBpKyspIHsKKwkJaWYgKHBfRHBiLT5mc19yZWZbaV0gPT0gTlVMTCkKKwkJCXBfRHBiLT5mc19yZWZbaV0gPSAmZHVtbXlfZnM7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9sdHJlZl9saXN0KHN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIpCit7CisJdW5zaWduZWQgaW50IGksIGo7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSBjb250YWluZXJfb2YocF9EcGIsCisJCXN0cnVjdCBoMjY0X2RwYl9zdHJ1LCBtRFBCKTsKKworCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCSIlc1xuIiwgX19mdW5jX18pOworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgcF9EcGItPnVzZWRfc2l6ZTsgaSsrKSB7CisJCWlmIChpc19sb25nX3Rlcm1fcmVmZXJlbmNlKHBfRHBiLT5mc1tpXSkpCisJCQlwX0RwYi0+ZnNfbHRyZWZbaisrXSA9IHBfRHBiLT5mc1tpXTsKKwl9CisKKwlwX0RwYi0+bHRyZWZfZnJhbWVzX2luX2J1ZmZlciA9IGo7CisKKwl3aGlsZSAoaiA8IHBfRHBiLT5zaXplKQorCQlwX0RwYi0+ZnNfbHRyZWZbaisrXSA9IE5VTEw7CisjaWZkZWYgRVJST1JfQ0hFQ0sKKwlmb3IgKGkgPSAwOyBpIDwgRFBCX1NJWkVfTUFYOyBpKyspIHsKKwkJaWYgKHBfRHBiLT5mc19sdHJlZltpXSA9PSBOVUxMKQorCQkJcF9EcGItPmZzX2x0cmVmW2ldID0gJmR1bW15X2ZzOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBpZHJfbWVtb3J5X21hbmFnZW1lbnQoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIsCisJCQkJICBzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpwKQoreworCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIgPSAmcF9IMjY0X0RwYi0+bURQQjsKKworCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJIiVzIHJlZl9mcmFtZXNfaW5fYnVmZmVyICVkIGx0cmVmX2ZyYW1lc19pbl9idWZmZXIgJWRcbiIsCisJX19mdW5jX18sIHBfRHBiLT5yZWZfZnJhbWVzX2luX2J1ZmZlciwKKwlwX0RwYi0+bHRyZWZfZnJhbWVzX2luX2J1ZmZlcik7CisKKworCWlmIChwLT5ub19vdXRwdXRfb2ZfcHJpb3JfcGljc19mbGFnKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnVzZWRfc2l6ZTsgaSsrKSB7CisJCQl1bm1hcmtfZm9yX3JlZmVyZW5jZShwX0RwYiwgcF9EcGItPmZzW2ldKTsKKwkJCWlmIChwX0RwYi0+ZnNbaV0tPmlzX2xvbmdfdGVybSkKKwkJCQl1bm1hcmtfZm9yX2xvbmdfdGVybV9yZWZlcmVuY2UocF9EcGItPmZzW2ldKTsKKwkJCWlmICghcF9EcGItPmZzW2ldLT5pc19vdXRwdXQgJiYgIXBfRHBiLT5mc1tpXS0+cHJlX291dHB1dCkKKwkJCQlzZXRfZnJhbWVfb3V0cHV0X2ZsYWcocF9IMjY0X0RwYiwgaSk7CisJCX0KKyNpZiAwCisJCS8qPz8/Ki8KKwkJLyogZnJlZSBhbGwgc3RvcmVkIHBpY3R1cmVzICovCisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+dXNlZF9zaXplOyBpKyspIHsKKwkJCS8qIHJlc2V0IGFsbCByZWZlcmVuY2Ugc2V0dGluZ3MKKwkJCSAqIGZyZWVfZnJhbWVfc3RvcmUocF9EcGItPmZzW2ldKTsKKwkJCSAqIHBfRHBiLT5mc1tpXSA9IGFsbG9jX2ZyYW1lX3N0b3JlKCk7CisJCQkgKi8KKwkJCXJlc2V0X2ZyYW1lX3N0b3JlKHBfSDI2NF9EcGIsIHBfRHBiLT5mc1tpXSk7IC8qID8/PyAqLworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+cmVmX2ZyYW1lc19pbl9idWZmZXI7IGkrKykKKwkJCXBfRHBiLT5mc19yZWZbaV0gPSBOVUxMOworCQlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPmx0cmVmX2ZyYW1lc19pbl9idWZmZXI7IGkrKykKKwkJCXBfRHBiLT5mc19sdHJlZltpXSA9IE5VTEw7CisJCXBfRHBiLT51c2VkX3NpemUgPSAwOworI2VuZGlmCisJfSBlbHNlIHsKKwkJZmx1c2hfZHBiKHBfSDI2NF9EcGIpOworCX0KKwlwX0RwYi0+bGFzdF9waWN0dXJlID0gTlVMTDsKKworCXVwZGF0ZV9yZWZfbGlzdChwX0RwYik7CisJdXBkYXRlX2x0cmVmX2xpc3QocF9EcGIpOworCXBfRHBiLT5sYXN0X291dHB1dF9wb2MgPSBJTlRfTUlOOworCisJaWYgKHAtPmxvbmdfdGVybV9yZWZlcmVuY2VfZmxhZykgeworCQlwX0RwYi0+bWF4X2xvbmdfdGVybV9waWNfaWR4ID0gMDsKKwkJcC0+aXNfbG9uZ190ZXJtICAgICAgICAgICA9IDE7CisJCXAtPmxvbmdfdGVybV9mcmFtZV9pZHggICAgPSAwOworCX0gZWxzZSB7CisJCXBfRHBiLT5tYXhfbG9uZ190ZXJtX3BpY19pZHggPSAtMTsKKwkJcC0+aXNfbG9uZ190ZXJtICAgICAgICAgICA9IDA7CisJfQorCisjaWYgKE1WQ19FWFRFTlNJT05fRU5BQkxFKQorCXBfRHBiLT5sYXN0X291dHB1dF92aWV3X2lkID0gLTE7CisjZW5kaWYKKworfQorCitzdGF0aWMgdm9pZCBzbGlkaW5nX3dpbmRvd19tZW1vcnlfbWFuYWdlbWVudCgKKwkJc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYiwKKwkJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqcCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9IGNvbnRhaW5lcl9vZihwX0RwYiwKKwkJc3RydWN0IGgyNjRfZHBiX3N0cnUsIG1EUEIpOworCXVuc2lnbmVkIGNoYXIgc2xpZGVfZmxhZyA9IDA7CisJdW5zaWduZWQgaW50IHNsaWRpbmdfbWFyZ2luID0gaW1heCgKKwkJMSwgcF9EcGItPm51bV9yZWZfZnJhbWVzKSAtIHBfRHBiLT5sdHJlZl9mcmFtZXNfaW5fYnVmZmVyOworCS8qIGFzc2VydCAoIXAtPmlkcl9mbGFnKTsgKi8KKwlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCSIlcyByZWZfZnJhbWVzX2luX2J1ZmZlciAlZCBsdHJlZl9mcmFtZXNfaW5fYnVmZmVyICVkXG4iLAorCV9fZnVuY19fLCBwX0RwYi0+cmVmX2ZyYW1lc19pbl9idWZmZXIsCisJcF9EcGItPmx0cmVmX2ZyYW1lc19pbl9idWZmZXIpOworCS8qIGlmIHRoaXMgaXMgYSByZWZlcmVuY2UgcGljIHdpdGggc2xpZGluZyB3aW5kb3csCisJICAgdW5tYXJrIGZpcnN0IHJlZiBmcmFtZSAqLworCWlmIChwX0RwYi0+cmVmX2ZyYW1lc19pbl9idWZmZXIgPT0gc2xpZGluZ19tYXJnaW4pCisJCXNsaWRlX2ZsYWcgPSAxOworCS8qZWxzZSBpZiAoKGgyNjRfZXJyb3JfcHJvY19wb2xpY3kgJiAweDgpICYmCisJCShwX0RwYi0+cmVmX2ZyYW1lc19pbl9idWZmZXIgPiBzbGlkaW5nX21hcmdpbikpCisJCXNsaWRlX2ZsYWcgPSAxOyovCisKKwlpZiAoc2xpZGVfZmxhZykgeworCQlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnVzZWRfc2l6ZTsgaSsrKSB7CisJCQlpZiAocF9EcGItPmZzW2ldLT5pc19yZWZlcmVuY2UgJiYKKwkJCQkoIShwX0RwYi0+ZnNbaV0tPmlzX2xvbmdfdGVybSkpKSB7CisJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLCAidW5tYXJrICVkXG4iLCBpKTsKKwkJCQl1bm1hcmtfZm9yX3JlZmVyZW5jZShwX0RwYiwgcF9EcGItPmZzW2ldKTsKKwkJCQl1cGRhdGVfcmVmX2xpc3QocF9EcGIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcC0+aXNfbG9uZ190ZXJtID0gMDsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfbnVtX3JlZihzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiKQoreworCWlmICgoaW50KShwX0RwYi0+bHRyZWZfZnJhbWVzX2luX2J1ZmZlciArCisJCQlwX0RwYi0+cmVmX2ZyYW1lc19pbl9idWZmZXIpID4KKwkJCWltYXgoMSwgcF9EcGItPm51bV9yZWZfZnJhbWVzKSkgeworCQlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9IGNvbnRhaW5lcl9vZihwX0RwYiwKKwkJCQkJIHN0cnVjdCBoMjY0X2RwYl9zdHJ1LCBtRFBCKTsKKwkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSAgIk1heC4gbnVtYmVyIG9mIHJlZmVyZW5jZSBmcmFtZXMgZXhjZWVkZWQuIEludmFsaWQgc3RyZWFtLiBsdCAlZCByZWYgJWQgbXVtX3JlZiAlZFxuIiwKKwkJCSAgcF9EcGItPmx0cmVmX2ZyYW1lc19pbl9idWZmZXIsCisJCQkgIHBfRHBiLT5yZWZfZnJhbWVzX2luX2J1ZmZlciwKKwkJCSAgcF9EcGItPm51bV9yZWZfZnJhbWVzKTsKKwl9Cit9CisKK3ZvaWQgZHVtcF9kcGIoc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYiwgdTggZm9yY2UpCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgY2hhciAqYnVmID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgYnVmX3NpemUgPSA1MTIsIGxlbiA9IDA7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPQorCQljb250YWluZXJfb2YocF9EcGIsIHN0cnVjdCBoMjY0X2RwYl9zdHJ1LCBtRFBCKTsKKworI2RlZmluZSBEUEJfU1RSQ0FUKGFyZ3MuLi4pICBkbyB7CVwKKwkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwJXAorCQkJYnVmX3NpemUgLSBsZW4sICMjYXJncyk7XAorCX0gd2hpbGUgKDApCisKKwlpZiAoKGgyNjRfZGVidWdfZmxhZyAmIFBSSU5UX0ZMQUdfRFVNUF9EUEIpID09IDAgJiYKKwkJZm9yY2UgPT0gMCkKKwkJcmV0dXJuOworCisJYnVmID0ga3phbGxvYyhidWZfc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnVzZWRfc2l6ZTsgaSsrKSB7CisJCWxlbiA9IDA7CisJCW1lbXNldChidWYsIDAsIGJ1Zl9zaXplKTsKKwkJRFBCX1NUUkNBVCgiZm49JWQgIGlzX3VzZWQgJWQgIiwKKwkJCXBfRHBiLT5mc1tpXS0+ZnJhbWVfbnVtLAorCQkJcF9EcGItPmZzW2ldLT5pc191c2VkKTsKKworCQlpZiAocF9EcGItPmZzW2ldLT5pc191c2VkICYgMSkgeworCQkJaWYgKHBfRHBiLT5mc1tpXS0+dG9wX2ZpZWxkKQorCQkJCURQQl9TVFJDQVQoIlQ6IHBvYz0lZCAgcGljX251bT0lZCAiLAorCQkJCXBfRHBiLT5mc1tpXS0+dG9wX2ZpZWxkLT5wb2MsCisJCQkJcF9EcGItPmZzW2ldLT50b3BfZmllbGQtPnBpY19udW0pOworCQkJZWxzZQorCQkJCURQQl9TVFJDQVQoIlQ6IHBvYz0lZCAgIiwKKwkJCQlwX0RwYi0+ZnNbaV0tPmZyYW1lLT50b3BfcG9jKTsKKwkJfQorCQlpZiAocF9EcGItPmZzW2ldLT5pc191c2VkICYgMikgeworCQkJaWYgKHBfRHBiLT5mc1tpXS0+Ym90dG9tX2ZpZWxkKQorCQkJCURQQl9TVFJDQVQoIkI6IHBvYz0lZCAgcGljX251bT0lZCAiLAorCQkJCXBfRHBiLT5mc1tpXS0+Ym90dG9tX2ZpZWxkLT5wb2MsCisJCQkJcF9EcGItPmZzW2ldLT5ib3R0b21fZmllbGQtPnBpY19udW0pOworCQkJZWxzZQorCQkJCURQQl9TVFJDQVQoIkI6IHBvYz0lZCAgIiwKKwkJCQlwX0RwYi0+ZnNbaV0tPmZyYW1lLT5ib3R0b21fcG9jKTsKKwkJfQorCQlpZiAocF9EcGItPmZzW2ldLT5pc191c2VkID09IDMpIHsKKwkJCWlmIChwX0RwYi0+ZnNbaV0tPmZyYW1lICE9IE5VTEwpCisJCQkJRFBCX1NUUkNBVCgiRjogcG9jPSVkIHBpY19udW09JWQgIiwKKwkJCQlwX0RwYi0+ZnNbaV0tPmZyYW1lLT5wb2MsCisJCQkJcF9EcGItPmZzW2ldLT5mcmFtZS0+cGljX251bSk7CisJCQllbHNlCisJCQkJRFBCX1NUUkNBVCgiZnNbJWRdIGZyYW1lIGlzIG51bGwgIiwgaSk7CisJCX0KKwkJRFBCX1NUUkNBVCgiRzogcG9jPSVkKSAgIiwgcF9EcGItPmZzW2ldLT5wb2MpOworCQlpZiAocF9EcGItPmZzW2ldLT5pc19yZWZlcmVuY2UpCisJCQlEUEJfU1RSQ0FUKCJyZWYgKCVkKSAiLCBwX0RwYi0+ZnNbaV0tPmlzX3JlZmVyZW5jZSk7CisJCWlmIChwX0RwYi0+ZnNbaV0tPmlzX2xvbmdfdGVybSkKKwkJCURQQl9TVFJDQVQoImx0X3JlZiAoJWQpICIsIHBfRHBiLT5mc1tpXS0+aXNfcmVmZXJlbmNlKTsKKwkJaWYgKHBfRHBiLT5mc1tpXS0+aXNfb3V0cHV0KQorCQkJRFBCX1NUUkNBVCgib3V0KGRpc3BsYXllZCkgICIpOworCQlpZiAocF9EcGItPmZzW2ldLT5wcmVfb3V0cHV0KQorCQkJRFBCX1NUUkNBVCgicHJlX291dHB1dChpbiBkaXNwcSBvciBkaXNwbGF5aW5nKSAgIik7CisJCWlmIChwX0RwYi0+ZnNbaV0tPmlzX3VzZWQgPT0gMykgeworCQkJaWYgKHBfRHBiLT5mc1tpXS0+ZnJhbWUgIT0gTlVMTCAmJiBwX0RwYi0+ZnNbaV0tPmZyYW1lLT5ub25fZXhpc3RpbmcpCisJCQkJRFBCX1NUUkNBVCgibm9uX2V4aXN0aW5nICAiKTsKKwkJCWVsc2UKKwkJCQlEUEJfU1RSQ0FUKCJmc1slZF0gZnJhbWUgaXMgbnVsbCAiLCBpKTsKKwkJfQorCQlEUEJfU1RSQ0FUKCJkcGJfZnJhbWVfY291bnQgJWQgICIsCisJCQlwX0RwYi0+ZnNbaV0tPmRwYl9mcmFtZV9jb3VudCk7CisKKyNpZiAoTVZDX0VYVEVOU0lPTl9FTkFCTEUpCisJCWlmIChwX0RwYi0+ZnNbaV0tPmlzX3JlZmVyZW5jZSkKKwkJCURQQl9TVFJDQVQoInZpZXdfaWQgKCVkKSAiLCBwX0RwYi0+ZnNbaV0tPnZpZXdfaWQpOworI2VuZGlmCisJCWlmIChwX0RwYi0+ZnNbaV0tPmRhdGFfZmxhZykgeworCQkJRFBCX1NUUkNBVCgiZGF0YV9mbGFnKDB4JXgpIiwKKwkJCXBfRHBiLT5mc1tpXS0+ZGF0YV9mbGFnKTsKKwkJfQorCQlEUEJfU1RSQ0FUKCIgYnVmc3BlYyAlZFxuIiwKKwkJCXBfRHBiLT5mc1tpXS0+YnVmX3NwZWNfbnVtKTsKKwkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIDAsICIlcyIsIGJ1Zik7CisJfQorCisJa2ZyZWUoYnVmKTsKK30KKworLyohCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBcYnJpZWYKKyAqICAgIGFkYXB0aXZlIG1lbW9yeSBtYW5hZ2VtZW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK3N0YXRpYyBpbnQgZ2V0X3BpY19udW1feChzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpwLAorCQkJIGludCBkaWZmZXJlbmNlX29mX3BpY19udW1zX21pbnVzMSkKK3sKKwlpbnQgY3VyclBpY051bTsKKworCWlmIChwLT5zdHJ1Y3R1cmUgPT0gRlJBTUUpCisJCWN1cnJQaWNOdW0gPSBwLT5mcmFtZV9udW07CisJZWxzZQorCQljdXJyUGljTnVtID0gMiAqIHAtPmZyYW1lX251bSArIDE7CisKKwlyZXR1cm4gY3VyclBpY051bSAtIChkaWZmZXJlbmNlX29mX3BpY19udW1zX21pbnVzMSArIDEpOworfQorCisvKiEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFxicmllZgorICogICAgQWRhcHRpdmUgTWVtb3J5IE1hbmFnZW1lbnQ6IE1hcmsgc2hvcnQgdGVybSBwaWN0dXJlIHVudXNlZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGF0aWMgdm9pZCBtbV91bm1hcmtfc2hvcnRfdGVybV9mb3JfcmVmZXJlbmNlKHN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlcgorCQkqcF9EcGIsIHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnAsCisJCWludCBkaWZmZXJlbmNlX29mX3BpY19udW1zX21pbnVzMSkKK3sKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9CisJCWNvbnRhaW5lcl9vZihwX0RwYiwgc3RydWN0IGgyNjRfZHBiX3N0cnUsIG1EUEIpOworCWludCBwaWNOdW1YOworCisJdW5zaWduZWQgaW50IGk7CisKKwlwaWNOdW1YID0gZ2V0X3BpY19udW1feChwLCBkaWZmZXJlbmNlX29mX3BpY19udW1zX21pbnVzMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnJlZl9mcmFtZXNfaW5fYnVmZmVyOyBpKyspIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQlpZiAocF9EcGItPmZzX3JlZltpXSA9PSBOVUxMKSB7CisJCQlwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyA9IF9fTElORV9fOworCQkJY29udGludWU7CisJCX0KKyNlbmRpZgorCQlpZiAocC0+c3RydWN0dXJlID09IEZSQU1FKSB7CisJCQlpZiAoKHBfRHBiLT5mc19yZWZbaV0tPmlzX3JlZmVyZW5jZSA9PSAzKSAmJgorCQkJICAgIChwX0RwYi0+ZnNfcmVmW2ldLT5pc19sb25nX3Rlcm0gPT0gMCkpIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZSA9PSBOVUxMKSB7CisJCQkJCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnID0gX19MSU5FX187CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKyNlbmRpZgorCQkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZS0+cGljX251bSA9PQorCQkJCQlwaWNOdW1YKSB7CisJCQkJCXVubWFya19mb3JfcmVmZXJlbmNlKHBfRHBiLAorCQkJCQkJcF9EcGItPmZzX3JlZltpXSk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoKHBfRHBiLT5mc19yZWZbaV0tPmlzX3JlZmVyZW5jZSAmIDEpICYmCisJCQkgICAgKCEocF9EcGItPmZzX3JlZltpXS0+aXNfbG9uZ190ZXJtICYgMSkpKSB7CisjaWZkZWYgRVJST1JfQ0hFQ0sKKwkJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkID09IE5VTEwpIHsKKwkJCQkJcF9IMjY0X0RwYi0+ZHBiX2Vycm9yX2ZsYWcgPSBfX0xJTkVfXzsKKwkJCQkJY29udGludWU7CisJCQkJfQorI2VuZGlmCisJCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0tPnRvcF9maWVsZC0+cGljX251bSA9PQorCQkJCQlwaWNOdW1YKSB7CisJCQkJCXBfRHBiLT5mc19yZWZbaV0tPgorCQkJCQl0b3BfZmllbGQtPnVzZWRfZm9yX3JlZmVyZW5jZSA9IDA7CisJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmlzX3JlZmVyZW5jZSAmPSAyOworCQkJCQlpZiAoKHBfRHBiLT5mc19yZWZbaV0tPmlzX3VzZWQgPT0gMykKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJCQkJJiYgcF9EcGItPmZzX3JlZltpXS0+ZnJhbWUKKyNlbmRpZgorCQkJCQkpIHsKKwkJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmZyYW1lLT4KKwkJCQkJCQl1c2VkX2Zvcl9yZWZlcmVuY2UgPSAwOworCQkJCQl9CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQlpZiAoKHBfRHBiLT5mc19yZWZbaV0tPmlzX3JlZmVyZW5jZSAmIDIpICYmCisJCQkgICAgKCEocF9EcGItPmZzX3JlZltpXS0+aXNfbG9uZ190ZXJtICYgMikpKSB7CisjaWZkZWYgRVJST1JfQ0hFQ0sKKwkJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+Ym90dG9tX2ZpZWxkID09IE5VTEwpIHsKKwkJCQkJcF9IMjY0X0RwYi0+ZHBiX2Vycm9yX2ZsYWcgPSBfX0xJTkVfXzsKKwkJCQkJY29udGludWU7CisJCQkJfQorI2VuZGlmCisJCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0tPmJvdHRvbV9maWVsZC0+cGljX251bSA9PQorCQkJCQlwaWNOdW1YKSB7CisJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmJvdHRvbV9maWVsZC0+CisJCQkJCXVzZWRfZm9yX3JlZmVyZW5jZSA9IDA7CisJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmlzX3JlZmVyZW5jZSAmPSAxOworCQkJCQlpZiAoKHBfRHBiLT5mc19yZWZbaV0tPmlzX3VzZWQgPT0gMykKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJCQkJJiYgcF9EcGItPmZzX3JlZltpXS0+ZnJhbWUKKyNlbmRpZgorCQkJCQkJKSB7CisJCQkJCQlwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZS0+CisJCQkJCQl1c2VkX2Zvcl9yZWZlcmVuY2UgPSAwOworCQkJCQl9CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKKy8qIQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogXGJyaWVmCisgKiAgICBBZGFwdGl2ZSBNZW1vcnkgTWFuYWdlbWVudDogTWFyayBsb25nIHRlcm0gcGljdHVyZSB1bnVzZWQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworc3RhdGljIHZvaWQgbW1fdW5tYXJrX2xvbmdfdGVybV9mb3JfcmVmZXJlbmNlKHN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlcgorCQkqcF9EcGIsIHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnAsIGludCBsb25nX3Rlcm1fcGljX251bSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+bHRyZWZfZnJhbWVzX2luX2J1ZmZlcjsgaSsrKSB7CisJCWlmIChwLT5zdHJ1Y3R1cmUgPT0gRlJBTUUpIHsKKwkJCWlmICgocF9EcGItPmZzX2x0cmVmW2ldLT5pc19yZWZlcmVuY2UgPT0gMykgJiYKKwkJCSAgICAocF9EcGItPmZzX2x0cmVmW2ldLT5pc19sb25nX3Rlcm0gPT0gMykpIHsKKwkJCQlpZiAocF9EcGItPmZzX2x0cmVmW2ldLT5mcmFtZS0+CisJCQkJCWxvbmdfdGVybV9waWNfbnVtID09CisJCQkJCWxvbmdfdGVybV9waWNfbnVtKSB7CisJCQkJCXVubWFya19mb3JfbG9uZ190ZXJtX3JlZmVyZW5jZSgKKwkJCQkJCXBfRHBiLT5mc19sdHJlZltpXSk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKChwX0RwYi0+ZnNfbHRyZWZbaV0tPmlzX3JlZmVyZW5jZSAmIDEpICYmCisJCQkgICAgKChwX0RwYi0+ZnNfbHRyZWZbaV0tPmlzX2xvbmdfdGVybSAmIDEpKSkgeworCQkJCWlmIChwX0RwYi0+ZnNfbHRyZWZbaV0tPnRvcF9maWVsZC0+CisJCQkJCWxvbmdfdGVybV9waWNfbnVtID09CisJCQkJCWxvbmdfdGVybV9waWNfbnVtKSB7CisJCQkJCXBfRHBiLT5mc19sdHJlZltpXS0+dG9wX2ZpZWxkLT4KKwkJCQkJCXVzZWRfZm9yX3JlZmVyZW5jZSA9IDA7CisJCQkJCXBfRHBiLT5mc19sdHJlZltpXS0+dG9wX2ZpZWxkLT4KKwkJCQkJCWlzX2xvbmdfdGVybSA9IDA7CisJCQkJCXBfRHBiLT5mc19sdHJlZltpXS0+aXNfcmVmZXJlbmNlICY9IDI7CisJCQkJCXBfRHBiLT5mc19sdHJlZltpXS0+aXNfbG9uZ190ZXJtICY9IDI7CisJCQkJCWlmIChwX0RwYi0+ZnNfbHRyZWZbaV0tPmlzX3VzZWQgPT0gMykgeworCQkJCQkJcF9EcGItPmZzX2x0cmVmW2ldLT5mcmFtZS0+CisJCQkJCQkJdXNlZF9mb3JfcmVmZXJlbmNlID0gMDsKKwkJCQkJCXBfRHBiLT5mc19sdHJlZltpXS0+ZnJhbWUtPgorCQkJCQkJCWlzX2xvbmdfdGVybSA9IDA7CisJCQkJCX0KKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJCWlmICgocF9EcGItPmZzX2x0cmVmW2ldLT5pc19yZWZlcmVuY2UgJiAyKSAmJgorCQkJICAgICgocF9EcGItPmZzX2x0cmVmW2ldLT5pc19sb25nX3Rlcm0gJiAyKSkpIHsKKwkJCQlpZiAocF9EcGItPmZzX2x0cmVmW2ldLT5ib3R0b21fZmllbGQtPgorCQkJCQlsb25nX3Rlcm1fcGljX251bSA9PQorCQkJCQlsb25nX3Rlcm1fcGljX251bSkgeworCQkJCQlwX0RwYi0+ZnNfbHRyZWZbaV0tPmJvdHRvbV9maWVsZC0+CisJCQkJCQl1c2VkX2Zvcl9yZWZlcmVuY2UgPSAwOworCQkJCQlwX0RwYi0+ZnNfbHRyZWZbaV0tPmJvdHRvbV9maWVsZC0+CisJCQkJCQlpc19sb25nX3Rlcm0gPSAwOworCQkJCQlwX0RwYi0+ZnNfbHRyZWZbaV0tPmlzX3JlZmVyZW5jZSAmPSAxOworCQkJCQlwX0RwYi0+ZnNfbHRyZWZbaV0tPmlzX2xvbmdfdGVybSAmPSAxOworCQkJCQlpZiAocF9EcGItPmZzX2x0cmVmW2ldLT5pc191c2VkID09IDMpIHsKKwkJCQkJCXBfRHBiLT5mc19sdHJlZltpXS0+ZnJhbWUtPgorCQkJCQkJCXVzZWRfZm9yX3JlZmVyZW5jZSA9IDA7CisJCQkJCQlwX0RwYi0+ZnNfbHRyZWZbaV0tPmZyYW1lLT4KKwkJCQkJCQlpc19sb25nX3Rlcm0gPSAwOworCQkJCQl9CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKKworLyohCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBcYnJpZWYKKyAqICAgIE1hcmsgYSBsb25nLXRlcm0gcmVmZXJlbmNlIGZyYW1lIG9yIGNvbXBsZW1lbnRhcnkKKyAqICAgIGZpZWxkIHBhaXIgdW51c2VkIGZvciByZWZlcmVtY2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworc3RhdGljIHZvaWQgdW5tYXJrX2xvbmdfdGVybV9mcmFtZV9mb3JfcmVmZXJlbmNlX2J5X2ZyYW1lX2lkeCgKKwlzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiLCBpbnQgbG9uZ190ZXJtX2ZyYW1lX2lkeCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+bHRyZWZfZnJhbWVzX2luX2J1ZmZlcjsgaSsrKSB7CisJCWlmIChwX0RwYi0+ZnNfbHRyZWZbaV0tPmxvbmdfdGVybV9mcmFtZV9pZHggPT0KKwkJCWxvbmdfdGVybV9mcmFtZV9pZHgpCisJCQl1bm1hcmtfZm9yX2xvbmdfdGVybV9yZWZlcmVuY2UocF9EcGItPmZzX2x0cmVmW2ldKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgdW5tYXJrMShzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiLAorCXVuc2lnbmVkIGludCBjdXJyX2ZyYW1lX251bSwgaW50IGkpCit7CisJaWYgKHBfRHBiLT5sYXN0X3BpY3R1cmUpIHsKKwkJLyppZiAoKHBfRHBiLT5sYXN0X3BpY3R1cmUgIT0gcF9EcGItPmZzX2x0cmVmW2ldKSB8fAorCQkJcF9EcGItPmxhc3RfcGljdHVyZS0+ZnJhbWVfbnVtICE9IGN1cnJfZnJhbWVfbnVtKSB7Ki8KKwkJCXVubWFya19mb3JfbG9uZ190ZXJtX3JlZmVyZW5jZShwX0RwYi0+ZnNfbHRyZWZbaV0pOworCQkvKn0gZWxzZSB7CisJCQl1bm1hcmtfZm9yX2xvbmdfdGVybV9yZWZlcmVuY2UocF9EcGItPmZzX2x0cmVmW2ldKTsKKwkJfSovCisJfQorfQorCitzdGF0aWMgdm9pZCB1bm1hcmsyKHN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIsCisJaW50IGN1cnJfcGljX251bSwgaW50IGkpCit7CisJaWYgKChwX0RwYi0+ZnNfbHRyZWZbaV0tPmZyYW1lX251bSkgIT0KKwkJKHVuc2lnbmVkIGludCkoY3Vycl9waWNfbnVtID4+IDEpKQorCQl1bm1hcmtfZm9yX2xvbmdfdGVybV9yZWZlcmVuY2UocF9EcGItPmZzX2x0cmVmW2ldKTsKK30KKworc3RhdGljIHZvaWQgdW5tYXJrM190b3Aoc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYiwKKwl1bnNpZ25lZCBpbnQgY3Vycl9mcmFtZV9udW0sIGludCBjdXJyX3BpY19udW0sIGludCBtYXJrX2N1cnJlbnQsIGludCBpKQoreworCWlmIChwX0RwYi0+ZnNfbHRyZWZbaV0tPmlzX2xvbmdfdGVybSA9PSAzKSB7CisJCXVubWFya19mb3JfbG9uZ190ZXJtX3JlZmVyZW5jZShwX0RwYi0+ZnNfbHRyZWZbaV0pOworCX0gZWxzZSB7CisJCWlmIChwX0RwYi0+ZnNfbHRyZWZbaV0tPmlzX2xvbmdfdGVybSA9PSAxKSB7CisJCQl1bm1hcmtfZm9yX2xvbmdfdGVybV9yZWZlcmVuY2UocF9EcGItPmZzX2x0cmVmW2ldKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChtYXJrX2N1cnJlbnQpCisJCQkJdW5tYXJrMShwX0RwYiwgY3Vycl9mcmFtZV9udW0sIGkpOworCQkJZWxzZQorCQkJCXVubWFyazIocF9EcGIsIGN1cnJfcGljX251bSwgaSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVubWFyazNfYm90dG9tKHN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIsCisJdW5zaWduZWQgaW50IGN1cnJfZnJhbWVfbnVtLCBpbnQgY3Vycl9waWNfbnVtLCBpbnQgbWFya19jdXJyZW50LCBpbnQgaSkKK3sKKwlpZiAocF9EcGItPmZzX2x0cmVmW2ldLT5pc19sb25nX3Rlcm0gPT0gMikgeworCQl1bm1hcmtfZm9yX2xvbmdfdGVybV9yZWZlcmVuY2UocF9EcGItPmZzX2x0cmVmW2ldKTsKKwl9IGVsc2UgeworCQlpZiAobWFya19jdXJyZW50KQorCQkJdW5tYXJrMShwX0RwYiwgY3Vycl9mcmFtZV9udW0sIGkpOworCQllbHNlCisJCQl1bm1hcmsyKHBfRHBiLCBjdXJyX3BpY19udW0sIGkpOworCX0KK30KKworc3RhdGljIHZvaWQgdW5tYXJrX2xvbmdfdGVybV9maWVsZF9mb3JfcmVmZXJlbmNlX2J5X2ZyYW1lX2lkeCgKKwlzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiLCBlbnVtIFBpY3R1cmVTdHJ1Y3R1cmUgc3RydWN0dXJlLAorCWludCBsb25nX3Rlcm1fZnJhbWVfaWR4LCBpbnQgbWFya19jdXJyZW50LCB1bnNpZ25lZCBpbnQgY3Vycl9mcmFtZV9udW0sCisJaW50IGN1cnJfcGljX251bSkKK3sKKwlzdHJ1Y3QgVmlkZW9QYXJhbWV0ZXJzICpwX1ZpZCA9IHBfRHBiLT5wX1ZpZDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIGFzc2VydChzdHJ1Y3R1cmUhPUZSQU1FKTsgKi8KKwlpZiAoY3Vycl9waWNfbnVtIDwgMCkKKwkJY3Vycl9waWNfbnVtICs9ICgyICogcF9WaWQtPm1heF9mcmFtZV9udW0pOworCisJZm9yIChpID0gMDsgaSA8IHBfRHBiLT5sdHJlZl9mcmFtZXNfaW5fYnVmZmVyOyBpKyspIHsKKwkJaWYgKHBfRHBiLT5mc19sdHJlZltpXS0+bG9uZ190ZXJtX2ZyYW1lX2lkeCA9PQorCQkJbG9uZ190ZXJtX2ZyYW1lX2lkeCkgeworCQkJaWYgKHN0cnVjdHVyZSA9PSBUT1BfRklFTEQpCisJCQkJdW5tYXJrM190b3AocF9EcGIsIGN1cnJfZnJhbWVfbnVtLAorCQkJCQljdXJyX3BpY19udW0sIG1hcmtfY3VycmVudCwgaSk7CisKKwkJCWlmIChzdHJ1Y3R1cmUgPT0gQk9UVE9NX0ZJRUxEKQorCQkJCXVubWFyazNfYm90dG9tKHBfRHBiLCBjdXJyX2ZyYW1lX251bSwKKwkJCQkJY3Vycl9waWNfbnVtLCBtYXJrX2N1cnJlbnQsIGkpOworCQl9CisJfQorfQorCisvKiEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFxicmllZgorICogICAgbWFyayBhIHBpY3R1cmUgYXMgbG9uZy10ZXJtIHJlZmVyZW5jZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGF0aWMgdm9pZCBtYXJrX3BpY19sb25nX3Rlcm0oc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYiwKKwkJCSAgICAgICBzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpwLAorCQkJICAgICAgIGludCBsb25nX3Rlcm1fZnJhbWVfaWR4LCBpbnQgcGljTnVtWCkKK3sKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9IGNvbnRhaW5lcl9vZihwX0RwYiwKKwkJCQlzdHJ1Y3QgaDI2NF9kcGJfc3RydSwgbURQQik7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGFkZF90b3AsIGFkZF9ib3R0b207CisKKwlpZiAocC0+c3RydWN0dXJlID09IEZSQU1FKSB7CisJCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+cmVmX2ZyYW1lc19pbl9idWZmZXI7IGkrKykgeworI2lmZGVmIEVSUk9SX0NIRUNLCisJCQlpZiAocF9EcGItPmZzX3JlZltpXSA9PSBOVUxMKSB7CisJCQkJcF9IMjY0X0RwYi0+ZHBiX2Vycm9yX2ZsYWcgPSBfX0xJTkVfXzsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNlbmRpZgorCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0tPmlzX3JlZmVyZW5jZSA9PSAzKSB7CisjaWZkZWYgRVJST1JfQ0hFQ0sKKwkJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+ZnJhbWUgPT0gTlVMTCkgeworCQkJCQlwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyA9IF9fTElORV9fOworCQkJCQljb250aW51ZTsKKwkJCQl9CisjZW5kaWYKKwkJCQlpZiAoKCFwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZS0+CisJCQkJCWlzX2xvbmdfdGVybSkgJiYKKwkJCQkgICAgKHBfRHBiLT5mc19yZWZbaV0tPmZyYW1lLT5waWNfbnVtID09CisJCQkJCXBpY051bVgpKSB7CisJCQkJCXBfRHBiLT5mc19yZWZbaV0tPgorCQkJCQkJbG9uZ190ZXJtX2ZyYW1lX2lkeCA9CisJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmZyYW1lLT4KKwkJCQkJCWxvbmdfdGVybV9mcmFtZV9pZHggPQorCQkJCQkJbG9uZ190ZXJtX2ZyYW1lX2lkeDsKKwkJCQkJcF9EcGItPmZzX3JlZltpXS0+ZnJhbWUtPgorCQkJCQkJbG9uZ190ZXJtX3BpY19udW0gPQorCQkJCQkJbG9uZ190ZXJtX2ZyYW1lX2lkeDsKKwkJCQkJcF9EcGItPmZzX3JlZltpXS0+ZnJhbWUtPgorCQkJCQkJaXNfbG9uZ190ZXJtID0gMTsKKworCQkJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkICYmCisJCQkJCSAgICBwX0RwYi0+ZnNfcmVmW2ldLT5ib3R0b21fZmllbGQpIHsKKwkJCQkJCXBfRHBiLT5mc19yZWZbaV0tPnRvcF9maWVsZC0+CisJCQkJCQlsb25nX3Rlcm1fZnJhbWVfaWR4ID0KKwkJCQkJCQlwX0RwYi0+ZnNfcmVmW2ldLT4KKwkJCQkJCQlib3R0b21fZmllbGQtPgorCQkJCQkJCWxvbmdfdGVybV9mcmFtZV9pZHggPQorCQkJCQkJCWxvbmdfdGVybV9mcmFtZV9pZHg7CisJCQkJCQlwX0RwYi0+ZnNfcmVmW2ldLT50b3BfZmllbGQtPgorCQkJCQkJCWxvbmdfdGVybV9waWNfbnVtID0KKwkJCQkJCQlsb25nX3Rlcm1fZnJhbWVfaWR4OworCQkJCQkJcF9EcGItPmZzX3JlZltpXS0+CisJCQkJCQkJYm90dG9tX2ZpZWxkLT4KKwkJCQkJCQlsb25nX3Rlcm1fcGljX251bSA9CisJCQkJCQkJbG9uZ190ZXJtX2ZyYW1lX2lkeDsKKworCQkJCQkJcF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkLT4KKwkJCQkJCQlpc19sb25nX3Rlcm0gPQorCQkJCQkJCXBfRHBiLT5mc19yZWZbaV0tPgorCQkJCQkJCWJvdHRvbV9maWVsZC0+CisJCQkJCQkJaXNfbG9uZ190ZXJtCisJCQkJCQkJPSAxOworCisJCQkJCX0KKwkJCQkJcF9EcGItPmZzX3JlZltpXS0+aXNfbG9uZ190ZXJtID0gMzsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJICAiV2FybmluZzogcmVmZXJlbmNlIGZyYW1lIGZvciBsb25nIHRlcm0gbWFya2luZyBub3QgZm91bmRcbiIpOworCX0gZWxzZSB7CisJCWlmIChwLT5zdHJ1Y3R1cmUgPT0gVE9QX0ZJRUxEKSB7CisJCQlhZGRfdG9wICAgID0gMTsKKwkJCWFkZF9ib3R0b20gPSAwOworCQl9IGVsc2UgeworCQkJYWRkX3RvcCAgICA9IDA7CisJCQlhZGRfYm90dG9tID0gMTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnJlZl9mcmFtZXNfaW5fYnVmZmVyOyBpKyspIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0gPT0gTlVMTCkgeworCQkJCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnID0gX19MSU5FX187CisJCQkJY29udGludWU7CisJCQl9CisjZW5kaWYKKwkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldLT5pc19yZWZlcmVuY2UgJiAxKSB7CisjaWZkZWYgRVJST1JfQ0hFQ0sKKwkJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkID09IE5VTEwpIHsKKwkJCQkJcF9IMjY0X0RwYi0+ZHBiX2Vycm9yX2ZsYWcgPSBfX0xJTkVfXzsKKwkJCQkJY29udGludWU7CisJCQkJfQorI2VuZGlmCisJCQkJaWYgKCghcF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkLT4KKwkJCQkJaXNfbG9uZ190ZXJtKSAmJgorCQkJCSAgICAocF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkLT5waWNfbnVtID09CisJCQkJCXBpY051bVgpKSB7CisJCQkJCWlmICgocF9EcGItPmZzX3JlZltpXS0+CisJCQkJCQlpc19sb25nX3Rlcm0pICYmCisJCQkJCSAgICAocF9EcGItPmZzX3JlZltpXS0+CisJCQkJCQlsb25nX3Rlcm1fZnJhbWVfaWR4ICE9CisJCQkJCQlsb25nX3Rlcm1fZnJhbWVfaWR4KSkgeworCQkJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPgorCQkJCQkJZGVjb2Rlcl9pbmRleCwKKwkJCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkJCSJXYXJuaW5nOiBhc3NpZ25pbmcgbG9uZ190ZXJtX2ZyYW1lX2lkeCBkaWZmZXJlbnQgZnJvbSBvdGhlciBmaWVsZFxuIik7CisJCQkJCX0KKworCQkJCQlwX0RwYi0+ZnNfcmVmW2ldLT4KKwkJCQkJCWxvbmdfdGVybV9mcmFtZV9pZHggPQorCQkJCQkJcF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkLT4KKwkJCQkJCWxvbmdfdGVybV9mcmFtZV9pZHgKKwkJCQkJCT0gbG9uZ190ZXJtX2ZyYW1lX2lkeDsKKwkJCQkJcF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkLT4KKwkJCQkJCWxvbmdfdGVybV9waWNfbnVtID0KKwkJCQkJCTIgKiBsb25nX3Rlcm1fZnJhbWVfaWR4ICsKKwkJCQkJCWFkZF90b3A7CisJCQkJCXBfRHBiLT5mc19yZWZbaV0tPnRvcF9maWVsZC0+CisJCQkJCQlpc19sb25nX3Rlcm0gPSAxOworCQkJCQlwX0RwYi0+ZnNfcmVmW2ldLT5pc19sb25nX3Rlcm0gfD0gMTsKKwkJCQkJaWYgKChwX0RwYi0+ZnNfcmVmW2ldLT5pc19sb25nX3Rlcm0KKwkJCQkJCT09IDMpCisjaWZkZWYgRVJST1JfQ0hFQ0sKKwkJCQkJCSYmIHBfRHBiLT5mc19yZWZbaV0tPmZyYW1lCisjZW5kaWYKKwkJCQkJCSkgeworCQkJCQkJcF9EcGItPmZzX3JlZltpXS0+ZnJhbWUtPgorCQkJCQkJCWlzX2xvbmdfdGVybSA9IDE7CisJCQkJCQlwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZS0+CisJCQkJCQkJbG9uZ190ZXJtX2ZyYW1lX2lkeCA9CisJCQkJCQkJcF9EcGItPmZzX3JlZltpXS0+CisJCQkJCQkJZnJhbWUtPgorCQkJCQkJCWxvbmdfdGVybV9waWNfbnVtID0KKwkJCQkJCQlsb25nX3Rlcm1fZnJhbWVfaWR4OworCQkJCQl9CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+aXNfcmVmZXJlbmNlICYgMikgeworI2lmZGVmIEVSUk9SX0NIRUNLCisJCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0tPmJvdHRvbV9maWVsZCA9PSBOVUxMKSB7CisJCQkJCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnID0gX19MSU5FX187CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKyNlbmRpZgorCQkJCWlmICgoIXBfRHBiLT5mc19yZWZbaV0tPmJvdHRvbV9maWVsZC0+CisJCQkJCWlzX2xvbmdfdGVybSkgJiYKKwkJCQkgICAgKHBfRHBiLT5mc19yZWZbaV0tPmJvdHRvbV9maWVsZC0+cGljX251bQorCQkJCQk9PSBwaWNOdW1YKSkgeworCQkJCQlpZiAoKHBfRHBiLT5mc19yZWZbaV0tPgorCQkJCQkJaXNfbG9uZ190ZXJtKSAmJgorCQkJCQkgICAgKHBfRHBiLT5mc19yZWZbaV0tPgorCQkJCQkJbG9uZ190ZXJtX2ZyYW1lX2lkeCAhPQorCQkJCQkJbG9uZ190ZXJtX2ZyYW1lX2lkeCkpIHsKKwkJCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT4KKwkJCQkJCWRlY29kZXJfaW5kZXgsCisJCQkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJCQkiV2FybmluZzogYXNzaWduaW5nIGxvbmdfdGVybV9mcmFtZV9pZHggZGlmZmVyZW50IGZyb20gb3RoZXIgZmllbGRcbiIpOworCQkJCQl9CisKKwkJCQkJcF9EcGItPmZzX3JlZltpXS0+CisJCQkJCQlsb25nX3Rlcm1fZnJhbWVfaWR4ID0KKwkJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmJvdHRvbV9maWVsZAorCQkJCQkJLT5sb25nX3Rlcm1fZnJhbWVfaWR4CisJCQkJCQk9IGxvbmdfdGVybV9mcmFtZV9pZHg7CisJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmJvdHRvbV9maWVsZC0+CisJCQkJCQlsb25nX3Rlcm1fcGljX251bSA9IDIgKgorCQkJCQkJbG9uZ190ZXJtX2ZyYW1lX2lkeCArCisJCQkJCQlhZGRfYm90dG9tOworCQkJCQlwX0RwYi0+ZnNfcmVmW2ldLT5ib3R0b21fZmllbGQtPgorCQkJCQkJaXNfbG9uZ190ZXJtID0gMTsKKwkJCQkJcF9EcGItPmZzX3JlZltpXS0+aXNfbG9uZ190ZXJtIHw9IDI7CisJCQkJCWlmICgocF9EcGItPmZzX3JlZltpXS0+CisJCQkJCQlpc19sb25nX3Rlcm0gPT0gMykKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJCQkJJiYgcF9EcGItPmZzX3JlZltpXS0+ZnJhbWUKKyNlbmRpZgorCQkJCQkJKSB7CisJCQkJCQlwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZS0+CisJCQkJCQkJaXNfbG9uZ190ZXJtID0gMTsKKwkJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmZyYW1lLT4KKwkJCQkJCQlsb25nX3Rlcm1fZnJhbWVfaWR4ID0KKwkJCQkJCQlwX0RwYi0+ZnNfcmVmW2ldLT4KKwkJCQkJCQlmcmFtZS0+CisJCQkJCQkJbG9uZ190ZXJtX3BpY19udW0gPQorCQkJCQkJCWxvbmdfdGVybV9mcmFtZV9pZHg7CisJCQkJCX0KKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJICAiV2FybmluZzogcmVmZXJlbmNlIGZpZWxkIGZvciBsb25nIHRlcm0gbWFya2luZyBub3QgZm91bmRcbiIpOworCX0KK30KKworCisvKiEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFxicmllZgorICogICAgQXNzaWduIGEgbG9uZyB0ZXJtIGZyYW1lIGluZGV4IHRvIGEgc2hvcnQgdGVybSBwaWN0dXJlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyB2b2lkIG1tX2Fzc2lnbl9sb25nX3Rlcm1fZnJhbWVfaWR4KHN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIsCisJCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnAsIGludCBkaWZmZXJlbmNlX29mX3BpY19udW1zX21pbnVzMSwKKwkJaW50IGxvbmdfdGVybV9mcmFtZV9pZHgpCit7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSBjb250YWluZXJfb2YocF9EcGIsCisJCQlzdHJ1Y3QgaDI2NF9kcGJfc3RydSwgbURQQik7CisJaW50IHBpY051bVggPSBnZXRfcGljX251bV94KHAsIGRpZmZlcmVuY2Vfb2ZfcGljX251bXNfbWludXMxKTsKKworCS8qIHJlbW92ZSBmcmFtZXMvZmllbGRzIHdpdGggc2FtZSBsb25nX3Rlcm1fZnJhbWVfaWR4ICovCisJaWYgKHAtPnN0cnVjdHVyZSA9PSBGUkFNRSkgeworCQl1bm1hcmtfbG9uZ190ZXJtX2ZyYW1lX2Zvcl9yZWZlcmVuY2VfYnlfZnJhbWVfaWR4KHBfRHBiLAorCQkJCWxvbmdfdGVybV9mcmFtZV9pZHgpOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGludCBpOworCQllbnVtIFBpY3R1cmVTdHJ1Y3R1cmUgc3RydWN0dXJlID0gRlJBTUU7CisKKwkJZm9yIChpID0gMDsgaSA8IHBfRHBiLT5yZWZfZnJhbWVzX2luX2J1ZmZlcjsgaSsrKSB7CisjaWZkZWYgRVJST1JfQ0hFQ0sKKwkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldID09IE5VTEwpIHsKKwkJCQlwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyA9IF9fTElORV9fOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmCisJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+aXNfcmVmZXJlbmNlICYgMSkgeworI2lmZGVmIEVSUk9SX0NIRUNLCisJCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0tPnRvcF9maWVsZCA9PSBOVUxMKSB7CisJCQkJCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnID0gX19MSU5FX187CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKyNlbmRpZgorCQkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldLT50b3BfZmllbGQtPgorCQkJCQlwaWNfbnVtID09IHBpY051bVgpIHsKKwkJCQkJc3RydWN0dXJlID0gVE9QX0ZJRUxEOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+aXNfcmVmZXJlbmNlICYgMikgeworI2lmZGVmIEVSUk9SX0NIRUNLCisJCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0tPmJvdHRvbV9maWVsZCA9PSBOVUxMKSB7CisJCQkJCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnID0gX19MSU5FX187CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKyNlbmRpZgorCQkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldLT5ib3R0b21fZmllbGQtPgorCQkJCQlwaWNfbnVtID09IHBpY051bVgpIHsKKwkJCQkJc3RydWN0dXJlID0gQk9UVE9NX0ZJRUxEOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHN0cnVjdHVyZSA9PSBGUkFNRSkgeworCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJICBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJICAiZmllbGQgZm9yIGxvbmcgdGVybSBtYXJraW5nIG5vdCBmb3VuZCAlZCIsCisJCQkJICAyMDApOworCQl9CisKKwkJdW5tYXJrX2xvbmdfdGVybV9maWVsZF9mb3JfcmVmZXJlbmNlX2J5X2ZyYW1lX2lkeChwX0RwYiwKKwkJCQlzdHJ1Y3R1cmUsCisJCQkJbG9uZ190ZXJtX2ZyYW1lX2lkeCwgMCwgMCwgcGljTnVtWCk7CisJfQorCisJbWFya19waWNfbG9uZ190ZXJtKHBfRHBiLCBwLCBsb25nX3Rlcm1fZnJhbWVfaWR4LCBwaWNOdW1YKTsKK30KKworLyohCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBcYnJpZWYKKyAqICAgIFNldCBuZXcgbWF4IGxvbmdfdGVybV9mcmFtZV9pZHgKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworc3RhdGljIHZvaWQgbW1fdXBkYXRlX21heF9sb25nX3Rlcm1fZnJhbWVfaWR4KHN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlcgorCQkqcF9EcGIsIGludCBtYXhfbG9uZ190ZXJtX2ZyYW1lX2lkeF9wbHVzMSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCXBfRHBiLT5tYXhfbG9uZ190ZXJtX3BpY19pZHggPSBtYXhfbG9uZ190ZXJtX2ZyYW1lX2lkeF9wbHVzMSAtIDE7CisKKwkvKiBjaGVjayBmb3IgaW52YWxpZCBmcmFtZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPmx0cmVmX2ZyYW1lc19pbl9idWZmZXI7IGkrKykgeworCQlpZiAocF9EcGItPmZzX2x0cmVmW2ldLT5sb25nX3Rlcm1fZnJhbWVfaWR4ID4KKwkJCXBfRHBiLT5tYXhfbG9uZ190ZXJtX3BpY19pZHgpIHsKKwkJCXVubWFya19mb3JfbG9uZ190ZXJtX3JlZmVyZW5jZShwX0RwYi0+ZnNfbHRyZWZbaV0pOworCQl9CisJfQorfQorCisKKy8qIQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogXGJyaWVmCisgKiAgICBNYXJrIGFsbCBsb25nIHRlcm0gcmVmZXJlbmNlIHBpY3R1cmVzIHVudXNlZCBmb3IgcmVmZXJlbmNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyB2b2lkIG1tX3VubWFya19hbGxfbG9uZ190ZXJtX2Zvcl9yZWZlcmVuY2Uoc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyCisJCSpwX0RwYikKK3sKKwltbV91cGRhdGVfbWF4X2xvbmdfdGVybV9mcmFtZV9pZHgocF9EcGIsIDApOworfQorCisvKiEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFxicmllZgorICogICAgTWFyayBhbGwgc2hvcnQgdGVybSByZWZlcmVuY2UgcGljdHVyZXMgdW51c2VkIGZvciByZWZlcmVuY2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworc3RhdGljIHZvaWQgbW1fdW5tYXJrX2FsbF9zaG9ydF90ZXJtX2Zvcl9yZWZlcmVuY2Uoc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyCisJCSpwX0RwYikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+cmVmX2ZyYW1lc19pbl9idWZmZXI7IGkrKykKKwkJdW5tYXJrX2Zvcl9yZWZlcmVuY2UocF9EcGIsIHBfRHBiLT5mc19yZWZbaV0pOworCXVwZGF0ZV9yZWZfbGlzdChwX0RwYik7Cit9CisKKworLyohCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBcYnJpZWYKKyAqICAgIE1hcmsgdGhlIGN1cnJlbnQgcGljdHVyZSB1c2VkIGZvciBsb25nIHRlcm0gcmVmZXJlbmNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyB2b2lkIG1tX21hcmtfY3VycmVudF9waWN0dXJlX2xvbmdfdGVybShzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIKKwkJKnBfRHBiLCBzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpwLCBpbnQgbG9uZ190ZXJtX2ZyYW1lX2lkeCkKK3sKKwkvKiByZW1vdmUgbG9uZyB0ZXJtIHBpY3R1cmVzIHdpdGggc2FtZSBsb25nX3Rlcm1fZnJhbWVfaWR4ICovCisJaWYgKHAtPnN0cnVjdHVyZSA9PSBGUkFNRSkgeworCQl1bm1hcmtfbG9uZ190ZXJtX2ZyYW1lX2Zvcl9yZWZlcmVuY2VfYnlfZnJhbWVfaWR4KHBfRHBiLAorCQkJCWxvbmdfdGVybV9mcmFtZV9pZHgpOworCX0gZWxzZSB7CisJCXVubWFya19sb25nX3Rlcm1fZmllbGRfZm9yX3JlZmVyZW5jZV9ieV9mcmFtZV9pZHgocF9EcGIsCisJCQkJcC0+c3RydWN0dXJlLCBsb25nX3Rlcm1fZnJhbWVfaWR4LAorCQkJCTEsIHAtPnBpY19udW0sIDApOworCX0KKworCXAtPmlzX2xvbmdfdGVybSA9IDE7CisJcC0+bG9uZ190ZXJtX2ZyYW1lX2lkeCA9IGxvbmdfdGVybV9mcmFtZV9pZHg7Cit9CisKK3N0YXRpYyB2b2lkIGFkYXB0aXZlX21lbW9yeV9tYW5hZ2VtZW50KHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLAorCQkJCSAgICAgICBzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpwKQoreworCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIgPSAmcF9IMjY0X0RwYi0+bURQQjsKKwlzdHJ1Y3QgRGVjUmVmUGljTWFya2luZ19zICp0bXBfZHJwbTsKKwlzdHJ1Y3QgVmlkZW9QYXJhbWV0ZXJzICpwX1ZpZCA9IHBfRHBiLT5wX1ZpZDsKKworCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJIiVzXG4iLCBfX2Z1bmNfXyk7CisJcF9WaWQtPmxhc3RfaGFzX21tY29fNSA9IDA7CisKKwkvKiBhc3NlcnQgKCFwLT5pZHJfZmxhZyk7ICovCisJLyogYXNzZXJ0IChwLT5hZGFwdGl2ZV9yZWZfcGljX2J1ZmZlcmluZ19mbGFnKTsgKi8KKworCXdoaWxlIChwLT5kZWNfcmVmX3BpY19tYXJraW5nX2J1ZmZlcikgeworCQl0bXBfZHJwbSA9IHAtPmRlY19yZWZfcGljX21hcmtpbmdfYnVmZmVyOworCQlzd2l0Y2ggKHRtcF9kcnBtLT5tZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbikgeworCQljYXNlIDA6CisJCQlpZiAodG1wX2RycG0tPk5leHQgIT0gTlVMTCkKKwkJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQkJUFJJTlRfRkxBR19FUlJPUiwKKwkJCQkJImVycm9yLCBtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbiA9IDAgbm90IGxhc3Qgb3BlcmF0aW9uIGluIGJ1ZmZlclxuIik7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJbW1fdW5tYXJrX3Nob3J0X3Rlcm1fZm9yX3JlZmVyZW5jZShwX0RwYiwgcCwKKwkJCQl0bXBfZHJwbS0+ZGlmZmVyZW5jZV9vZl9waWNfbnVtc19taW51czEpOworCQkJdXBkYXRlX3JlZl9saXN0KHBfRHBiKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQltbV91bm1hcmtfbG9uZ190ZXJtX2Zvcl9yZWZlcmVuY2UocF9EcGIsIHAsCisJCQkJdG1wX2RycG0tPmxvbmdfdGVybV9waWNfbnVtKTsKKwkJCXVwZGF0ZV9sdHJlZl9saXN0KHBfRHBiKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQltbV9hc3NpZ25fbG9uZ190ZXJtX2ZyYW1lX2lkeChwX0RwYiwgcCwKKwkJCQl0bXBfZHJwbS0+ZGlmZmVyZW5jZV9vZl9waWNfbnVtc19taW51czEsCisJCQkJdG1wX2RycG0tPmxvbmdfdGVybV9mcmFtZV9pZHgpOworCQkJdXBkYXRlX3JlZl9saXN0KHBfRHBiKTsKKwkJCXVwZGF0ZV9sdHJlZl9saXN0KHBfRHBiKTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQltbV91cGRhdGVfbWF4X2xvbmdfdGVybV9mcmFtZV9pZHgocF9EcGIsCisJCQkJdG1wX2RycG0tPm1heF9sb25nX3Rlcm1fZnJhbWVfaWR4X3BsdXMxKTsKKwkJCXVwZGF0ZV9sdHJlZl9saXN0KHBfRHBiKTsKKwkJCWJyZWFrOworCQljYXNlIDU6CisJCQltbV91bm1hcmtfYWxsX3Nob3J0X3Rlcm1fZm9yX3JlZmVyZW5jZShwX0RwYik7CisJCQltbV91bm1hcmtfYWxsX2xvbmdfdGVybV9mb3JfcmVmZXJlbmNlKHBfRHBiKTsKKwkJCXBfVmlkLT5sYXN0X2hhc19tbWNvXzUgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgNjoKKwkJCW1tX21hcmtfY3VycmVudF9waWN0dXJlX2xvbmdfdGVybShwX0RwYiwgcCwKKwkJCQl0bXBfZHJwbS0+bG9uZ190ZXJtX2ZyYW1lX2lkeCk7CisJCQljaGVja19udW1fcmVmKHBfRHBiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJUFJJTlRfRkxBR19FUlJPUiwKKwkJCQkiZXJyb3IsIGludmFsaWQgbWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24gaW4gYnVmZmVyXG4iKTsKKwkJfQorCQlwLT5kZWNfcmVmX3BpY19tYXJraW5nX2J1ZmZlciA9IHRtcF9kcnBtLT5OZXh0OworCQkvKiBmcmVlICh0bXBfZHJwbSk7ICovCisJfQorCWlmIChwX1ZpZC0+bGFzdF9oYXNfbW1jb181KSB7CisJCXAtPnBpY19udW0gPSBwLT5mcmFtZV9udW0gPSAwOworCisJCXN3aXRjaCAocC0+c3RydWN0dXJlKSB7CisJCWNhc2UgVE9QX0ZJRUxEOiB7CisJCQkvKiBwLT5wb2MgPSBwLT50b3BfcG9jID0gcF9WaWQtPnRvcHBvYyA9MDsgKi8KKwkJCXAtPnBvYyA9IHAtPnRvcF9wb2MgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBCT1RUT01fRklFTEQ6IHsKKwkJCS8qIHAtPnBvYyA9IHAtPmJvdHRvbV9wb2MgPSBwX1ZpZC0+Ym90dG9tcG9jID0gMDsgKi8KKwkJCXAtPnBvYyA9IHAtPmJvdHRvbV9wb2MgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBGUkFNRTogeworCQkJcC0+dG9wX3BvYyAgICAtPSBwLT5wb2M7CisJCQlwLT5ib3R0b21fcG9jIC09IHAtPnBvYzsKKworCQkJLyogcF9WaWQtPnRvcHBvYyA9IHAtPnRvcF9wb2M7ICovCisJCQkvKiBwX1ZpZC0+Ym90dG9tcG9jID0gcC0+Ym90dG9tX3BvYzsgKi8KKworCQkJcC0+cG9jID0gaW1pbihwLT50b3BfcG9jLCBwLT5ib3R0b21fcG9jKTsKKwkJCS8qIHBfVmlkLT5mcmFtZXBvYyA9IHAtPnBvYzsgKi8KKwkJCWJyZWFrOworCQl9CisJCX0KKwkJLyogY3VyclNsaWNlLT5UaGlzUE9DID0gcC0+cG9jOyAqLworI2lmIChNVkNfRVhURU5TSU9OX0VOQUJMRSkKKwkJaWYgKHAtPnZpZXdfaWQgPT0gMCkgeworCQkJZmx1c2hfZHBiKHBfVmlkLT5wX0RwYl9sYXllclswXSk7CisJCQlmbHVzaF9kcGIocF9WaWQtPnBfRHBiX2xheWVyWzFdKTsKKwkJfSBlbHNlIHsKKwkJCWZsdXNoX2RwYihwX0RwYik7CisJCX0KKyNlbHNlCisJCWZsdXNoX2RwYihwX0gyNjRfRHBiKTsKKyNlbmRpZgorCX0KK30KKworCitpbnQgc3RvcmVfcGljdHVyZV9pbl9kcGIoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIsCisJCQkgIHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnAsCisJCQkgIHVuc2lnbmVkIGNoYXIgZGF0YV9mbGFnKQoreworCS8qIHN0cnVjdCBWaWRlb1BhcmFtZXRlcnMgKnBfVmlkID0gcF9EcGItPnBfVmlkOyAqLworCXN0cnVjdCBWaWRlb1BhcmFtZXRlcnMgKnBfVmlkID0gJnBfSDI2NF9EcGItPm1WaWRlbzsKKwlzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiID0gJnBfSDI2NF9EcGItPm1EUEI7CisJdW5zaWduZWQgaW50IGksIGZyYW1lX291dHNpZGVfY291bnQgPSAwOworI2lmIDAKKwlpbnQgcG9jLCBwb3M7CisjZW5kaWYKKwlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkiJXMgcF9WaWQgJXBcbiIsIF9fZnVuY19fLCBwX1ZpZCk7CisKKwkvKiBwaWN0dXJlIGVycm9yIGNvbmNlYWxtZW50ICovCisKKwkvKiBkaWFnbm9zdGljcyAqLworCS8qIGRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJICoJIlN0b3JpbmcgKCVzKSBub24tcmVmIHBpYyB3aXRoIGZyYW1lX251bSAjJWRcbiIsCisJICoJKHAtPnR5cGUgPT0gRlJBTUUpPyJGUkFNRSI6KHAtPnR5cGUgPT0gVE9QX0ZJRUxEKT8KKwkgKgkiVE9QX0ZJRUxEIjoiQk9UVE9NX0ZJRUxEIiwgcC0+cGljX251bSk7CisJICovCisJLyogaWYgZnJhbWUsIGNoZWNrIGZvciBuZXcgc3RvcmUsICovCisJLyogYXNzZXJ0IChwIT1OVUxMKTsgKi8KKworCXBfVmlkLT5sYXN0X2hhc19tbWNvXzUgPSAwOworCXBfVmlkLT5sYXN0X3BpY19ib3R0b21fZmllbGQgPSAocC0+c3RydWN0dXJlID09IEJPVFRPTV9GSUVMRCk7CisJaWYgKHAtPmlkcl9mbGFnKSB7CisJCWlkcl9tZW1vcnlfbWFuYWdlbWVudChwX0gyNjRfRHBiLCBwKTsKKwkJaWYgKHBfSDI2NF9EcGItPmZpcnN0X2luc2VydF9mcmFtZSA9PSBGaXJzdEluc2VydEZybV9PVVQpCisJCQlwX0gyNjRfRHBiLT5maXJzdF9pbnNlcnRfZnJhbWUgPSBGaXJzdEluc2VydEZybV9TS0lQRE9ORTsKKyNpZiAwCisvKiA/Pz8gKi8KKwkJLyogcGljdHVyZSBlcnJvciBjb25jZWFsbWVudCAqLworCQltZW1zZXQocF9WaWQtPnBvY3NfaW5fZHBiLCAwLCBzaXplb2YoaW50KSAqIDEwMCk7CisjZW5kaWYKKwl9IGVsc2UgeworI2lmIDEKKy8qID8/PyAqLworCQkvKiBhZGFwdGl2ZSBtZW1vcnkgbWFuYWdlbWVudCAqLworCQlpZiAocC0+dXNlZF9mb3JfcmVmZXJlbmNlICYmCisJCQkocC0+YWRhcHRpdmVfcmVmX3BpY19idWZmZXJpbmdfZmxhZykpCisJCQlhZGFwdGl2ZV9tZW1vcnlfbWFuYWdlbWVudChwX0gyNjRfRHBiLCBwKTsKKyNlbmRpZgorCX0KKworCWlmICgocC0+c3RydWN0dXJlID09IFRPUF9GSUVMRCkgfHwgKHAtPnN0cnVjdHVyZSA9PSBCT1RUT01fRklFTEQpKSB7CisJCS8qIGNoZWNrIGZvciBmcmFtZSBzdG9yZSB3aXRoIHNhbWUgcGljX251bWJlciAqLworCQlpZiAocF9EcGItPmxhc3RfcGljdHVyZSkgeworCQkJaWYgKChpbnQpcF9EcGItPmxhc3RfcGljdHVyZS0+ZnJhbWVfbnVtID09CisJCQkJcC0+cGljX251bSkgeworCQkJCWlmICgoKHAtPnN0cnVjdHVyZSA9PSBUT1BfRklFTEQpICYmCisJCQkJICAgIChwX0RwYi0+bGFzdF9waWN0dXJlLT5pc191c2VkID09IDIpKSB8fAorCQkJCSAgICAoKHAtPnN0cnVjdHVyZSA9PSBCT1RUT01fRklFTEQpICYmCisJCQkJICAgIChwX0RwYi0+bGFzdF9waWN0dXJlLT5pc191c2VkID09IDEpKSkgeworCQkJCQlpZiAoKHAtPnVzZWRfZm9yX3JlZmVyZW5jZSAmJgorCQkJCQkgICAgKHBfRHBiLT5sYXN0X3BpY3R1cmUtPgorCQkJCQkJaXNfb3JpZ19yZWZlcmVuY2UgIT0gMCkpIHx8CisJCQkJCSAgICAoIXAtPnVzZWRfZm9yX3JlZmVyZW5jZSAmJgorCQkJCQkJKHBfRHBiLT5sYXN0X3BpY3R1cmUtPgorCQkJCQkJaXNfb3JpZ19yZWZlcmVuY2UgPT0gMCkpKSB7CisJCQkJCQlpbnNlcnRfcGljdHVyZV9pbl9kcGIoCisJCQkJCQkJcF9IMjY0X0RwYiwKKwkJCQkJCQlwX0RwYi0+bGFzdF9waWN0dXJlLAorCQkJCQkJCXAsIGRhdGFfZmxhZyk7CisJCQkJCQl1cGRhdGVfcmVmX2xpc3QocF9EcGIpOworCQkJCQkJdXBkYXRlX2x0cmVmX2xpc3QocF9EcGIpOworCQkJCQkJZHVtcF9kcGIocF9EcGIsIDApOworCQkJCQkJcF9EcGItPmxhc3RfcGljdHVyZSA9IE5VTEw7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkvKiB0aGlzIGlzIGEgZnJhbWUgb3IgYSBmaWVsZCB3aGljaCBoYXMgbm8gc3RvcmVkCisJICogY29tcGxlbWVudGFyeSBmaWVsZAorCSAqLworCisJLyogc2xpZGluZyB3aW5kb3csIGlmIG5lY2Vzc2FyeSAqLworCWlmICgoIXAtPmlkcl9mbGFnKSAmJiAocC0+dXNlZF9mb3JfcmVmZXJlbmNlICYmCisJCQkgICAgICAgKCFwLT5hZGFwdGl2ZV9yZWZfcGljX2J1ZmZlcmluZ19mbGFnKSkpIHsKKwkJc2xpZGluZ193aW5kb3dfbWVtb3J5X21hbmFnZW1lbnQocF9EcGIsIHApOworCX0KKworCS8qIHBpY3R1cmUgZXJyb3IgY29uY2VhbG1lbnQgKi8KKwlpZiAocF9WaWQtPmNvbmNlYWxfbW9kZSAhPSAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+c2l6ZTsgaSsrKQorCQkJaWYgKHBfRHBiLT5mc1tpXS0+aXNfcmVmZXJlbmNlKQorCQkJCXBfRHBiLT5mc1tpXS0+Y29uY2VhbG1lbnRfcmVmZXJlbmNlID0gMTsKKwl9CisKKwl3aGlsZSAocmVtb3ZlX3VudXNlZF9mcmFtZV9mcm9tX2RwYihwX0gyNjRfRHBiKSkKKwkJOworCisJd2hpbGUgKG91dHB1dF9mcmFtZXMocF9IMjY0X0RwYiwgMCkpCisJCTsKKworCS8qIGNoZWNrIGZvciBkdXBsaWNhdGUgZnJhbWUgbnVtYmVyIGluIHNob3J0IHRlcm0gcmVmZXJlbmNlIGJ1ZmZlciAqLworCWlmICgocC0+dXNlZF9mb3JfcmVmZXJlbmNlKSAmJiAoIXAtPmlzX2xvbmdfdGVybSkpIHsKKwkJZm9yIChpID0gMDsgaSA8IHBfRHBiLT5yZWZfZnJhbWVzX2luX2J1ZmZlcjsgaSsrKSB7CisjaWZkZWYgRVJST1JfQ0hFQ0sKKwkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldID09IE5VTEwpCisJCQkJY29udGludWU7CisjZW5kaWYKKwkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZV9udW0gPT0gcC0+ZnJhbWVfbnVtKSB7CisJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCSAgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJCQkgICJkdXBsaWNhdGUgZnJhbWVfbnVtIGluIHNob3J0LXRlcm0gcmVmZXJlbmNlIHBpY3R1cmUgYnVmZmVyICVkXG4iLAorCQkJCQkgICA1MDApOworCQkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldLT5kcGJfZnJhbWVfY291bnQgPT0gcF9IMjY0X0RwYi0+ZHBiX2ZyYW1lX2NvdW50KSB7CisJCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQkJCSAgMCwgImR1cGxpY2F0ZSBmcmFtZSwgbm8gaW5zZXJ0IHRvIGRwYlxuIik7CisJCQkJCXJldHVybiAtMjsKKwkJCQl9IGVsc2UgeworCQkJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQkJCSAgMCwgImR1cGxpY2F0ZSBmcmFtZV9udW0gcmVsZWFzZSBkZWZvcmUgcmVmXG4iKTsKKwkJCQkJdW5tYXJrX2Zvcl9yZWZlcmVuY2UocF9EcGIsIHBfRHBiLT5mc19yZWZbaV0pOworCQkJCQl1cGRhdGVfcmVmX2xpc3QocF9EcGIpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkvKiBzdG9yZSBhdCBlbmQgb2YgYnVmZmVyICovCisKKwlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkgICIlcyBwX0RwYi0+dXNlZF9zaXplICVkXG4iLCBfX2Z1bmNfXywgcF9EcGItPnVzZWRfc2l6ZSk7CisJaWYgKHBfRHBiLT51c2VkX3NpemUgPj0gcF9EcGItPnNpemUpIHsKKwkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQlQUklOVF9GTEFHX0VSUk9SLAorCQkJIiVzIEVycm9yOiB1c2VkX3NpemQgJWQgaXMgbGFyZ2UgdGhhbiBkcGIgc2l6ZVxyXG4iLAorCQkJX19mdW5jX18sIHBfRHBiLT51c2VkX3NpemUpOworCQkvKmgyNjRfZGVidWdfZmxhZyB8PSBQUklOVF9GTEFHX0RVTVBfRFBCOyovCisJCWR1bXBfZHBiKHBfRHBiLCAwKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWluc2VydF9waWN0dXJlX2luX2RwYihwX0gyNjRfRHBiLCBwX0RwYi0+ZnNbcF9EcGItPnVzZWRfc2l6ZV0sCisJCXAsIGRhdGFfZmxhZyk7CisKKwkvKiBwaWN0dXJlIGVycm9yIGNvbmNlYWxtZW50ICovCisJaWYgKHAtPmlkcl9mbGFnKQorCQlwX1ZpZC0+ZWFybGllcl9taXNzaW5nX3BvYyA9IDA7CisKKwlpZiAocC0+c3RydWN0dXJlICE9IEZSQU1FKQorCQlwX0RwYi0+bGFzdF9waWN0dXJlID0gcF9EcGItPmZzW3BfRHBiLT51c2VkX3NpemVdOworCWVsc2UKKwkJcF9EcGItPmxhc3RfcGljdHVyZSA9IE5VTEw7CisKKwlwX0RwYi0+dXNlZF9zaXplKys7CisjaWYgMAorLyogPz8/ICovCisJaWYgKHBfVmlkLT5jb25jZWFsX21vZGUgIT0gMCkKKwkJcF9WaWQtPnBvY3NfaW5fZHBiW3BfRHBiLT51c2VkX3NpemUgLSAxXSA9IHAtPnBvYzsKKyNlbmRpZgorCXVwZGF0ZV9yZWZfbGlzdChwX0RwYik7CisJdXBkYXRlX2x0cmVmX2xpc3QocF9EcGIpOworCisJY2hlY2tfbnVtX3JlZihwX0RwYik7CisJZm9yIChpID0gMDsgaSA8IHBfRHBiLT51c2VkX3NpemU7IGkrKykgeworCQlpZiAocF9EcGItPmZzW2ldLT5wcmVfb3V0cHV0KQorCQkJZnJhbWVfb3V0c2lkZV9jb3VudCsrOworCX0KKworCWlmIChwX0gyNjRfRHBiLT5mYXN0X291dHB1dF9lbmFibGUgPT0gSDI2NF9PVVRQVVRfTU9ERV9GQVNUKQorCQlpID0gMTsKKwllbHNlCisJCWkgPSAwOworCisJaWYgKGkgfHwgKHBfSDI2NF9EcGItPmZpcnN0X2luc2VydF9mcmFtZSA8IEZpcnN0SW5zZXJ0RnJtX1NLSVBET05FKSkgeworCQl3aGlsZSAob3V0cHV0X2ZyYW1lcyhwX0gyNjRfRHBiLCBpKSkKKwkJCTsKKwl9CisKKwlkdW1wX2RwYihwX0RwYiwgMCk7CisJcF9EcGItPmZpcnN0X3BpY19kb25lID0gMTsgLypieSByYWluKi8KKworCXJldHVybiAwOworfQorCit2b2lkIGJ1Zm1ncl9wb3N0KHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiKQoreworCS8qVmlkZW9QYXJhbWV0ZXJzICpwX1ZpZCA9IHBfRHBiLT5wX1ZpZDsqLworCXN0cnVjdCBWaWRlb1BhcmFtZXRlcnMgKnBfVmlkID0gJnBfSDI2NF9EcGItPm1WaWRlbzsKKworCWlmIChwX1ZpZC0+bGFzdF9oYXNfbW1jb181KQorCQlwX1ZpZC0+cHJlX2ZyYW1lX251bSA9IDA7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgSW5pdGlhbGl6ZSByZWZlcmVuY2UgbGlzdHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKyNkZWZpbmUgX19DT01QQVJFKGNvbnRleHQsIHAxLCBwMikgY29tcChwMSwgcDIpCisjZGVmaW5lIF9fU0hPUlRTT1JUKGxvLCBoaSwgd2lkdGgsIGNvbXAsIGNvbnRleHQpIFwKKwlzaG9ydHNvcnQobG8sIGhpLCB3aWR0aCwgY29tcCkKKyNkZWZpbmUgQ1VUT0ZGIDggICAgICAgICAgICAvKiB0ZXN0aW5nIHNob3dzIHRoYXQgdGhpcyBpcyBnb29kIHZhbHVlICovCisjZGVmaW5lIFNUS1NJWiAoOCpzaXplb2Yodm9pZCAqKSAtIDIpCisKKyN1bmRlZiBzd2FwCitzdGF0aWMgdm9pZCBzd2FwKAorCWNoYXIgKmEsCisJY2hhciAqYiwKKwlzaXplX3Qgd2lkdGgKKykKK3sKKwljaGFyIHRtcDsKKworCWlmIChhICE9IGIpCisJCS8qIERvIHRoZSBzd2FwIG9uZSBjaGFyYWN0ZXIgYXQgYSB0aW1lIHRvIGF2b2lkIHBvdGVudGlhbAorCQkgKiAgIGFsaWdubWVudCBwcm9ibGVtcy4KKwkJICovCisJCXdoaWxlICh3aWR0aC0tKSB7CisJCQl0bXAgPSAqYTsKKwkJCSphKysgPSAqYjsKKwkJCSpiKysgPSB0bXA7CisJCX0KK30KKworc3RhdGljIHZvaWQgc2hvcnRzb3J0KAorCWNoYXIgKmxvLAorCWNoYXIgKmhpLAorCXNpemVfdCB3aWR0aCwKKwlpbnQgKCpjb21wKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikKKykKK3sKKwljaGFyICpwLCAqbWF4OworCisJLyogTm90ZTogaW4gYXNzZXJ0aW9ucyBiZWxvdywgaSBhbmQgaiBhcmUgYWx3YXkgaW5zaWRlIG9yaWdpbmFsCisJICogICBib3VuZCBvZiBhcnJheSB0byBzb3J0LgorCSAqLworCisJd2hpbGUgKGhpID4gbG8pIHsKKwkJLyogQVtpXSA8PSBBW2pdIGZvciBpIDw9IGosIGogPiBoaSAqLworCQltYXggPSBsbzsKKwkJZm9yIChwID0gbG8gKyB3aWR0aDsgcCA8PSBoaTsgcCArPSB3aWR0aCkgeworCQkJLyogQVtpXSA8PSBBW21heF0gZm9yIGxvIDw9IGkgPCBwICovCisJCQlpZiAoX19DT01QQVJFKGNvbnRleHQsIHAsIG1heCkgPiAwKQorCQkJCW1heCA9IHA7CisJCQkvKiBBW2ldIDw9IEFbbWF4XSBmb3IgbG8gPD0gaSA8PSBwICovCisJCX0KKworCQkvKiBBW2ldIDw9IEFbbWF4XSBmb3IgbG8gPD0gaSA8PSBoaSAqLworCisJCXN3YXAobWF4LCBoaSwgd2lkdGgpOworCisJCS8qIEFbaV0gPD0gQVtoaV0gZm9yIGkgPD0gaGksIHNvIEFbaV0gPD0gQVtqXSBmb3IgaSA8PSBqLAorCQkgKiAgIGogPj0gaGkKKwkJICovCisKKwkJaGkgLT0gd2lkdGg7CisKKwkJLyogQVtpXSA8PSBBW2pdIGZvciBpIDw9IGosIGogPiBoaSwgbG9vcCB0b3AgY29uZGl0aW9uCisJCSAqICAgZXN0YWJsaXNoZWQKKwkJICovCisJfQorCS8qIEFbaV0gPD0gQVtqXSBmb3IgaSA8PSBqLCBqID4gbG8sIHdoaWNoIGltcGxpZXMgQVtpXSA8PSBBW2pdCisJICogICBmb3IgaSA8IGosIHNvIGFycmF5IGlzIHNvcnRlZAorCSAqLworfQorCitzdGF0aWMgdm9pZCBxc29ydCgKKwl2b2lkICpiYXNlLAorCXNpemVfdCBudW0sCisJc2l6ZV90IHdpZHRoLAorCWludCAoKmNvbXApKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKQorKQoreworCWNoYXIgKmxvLCAqaGk7ICAgICAgICAgICAgICAvKiBlbmRzIG9mIHN1Yi1hcnJheSBjdXJyZW50bHkgc29ydGluZyAqLworCWNoYXIgKm1pZDsgICAgICAgICAgICAgICAgICAvKiBwb2ludHMgdG8gbWlkZGxlIG9mIHN1YmFycmF5ICovCisJY2hhciAqbG9ndXksICpoaWd1eTsgICAgICAgIC8qIHRyYXZlbGluZyBwb2ludGVycyBmb3IgcGFydGl0aW9uIHN0ZXAgKi8KKwlzaXplX3Qgc2l6ZTsgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiB0aGUgc3ViLWFycmF5ICovCisJY2hhciAqbG9zdGtbU1RLU0laXSwgKmhpc3RrW1NUS1NJWl07CisJaW50IHN0a3B0cjsKKworLyogIHN0YWNrIGZvciBzYXZpbmcgc3ViLWFycmF5IHRvIGJlCisgKgkJCQkJcHJvY2Vzc2VkCisgKi8KKyNpZiAwCisJLyogdmFsaWRhdGlvbiBzZWN0aW9uICovCisJX1ZBTElEQVRFX1JFVFVSTl9WT0lEKGJhc2UgIT0gTlVMTCB8fCBudW0gPT0gMCwgRUlOVkFMKTsKKwlfVkFMSURBVEVfUkVUVVJOX1ZPSUQod2lkdGggPiAwLCBFSU5WQUwpOworCV9WQUxJREFURV9SRVRVUk5fVk9JRChjb21wICE9IE5VTEwsIEVJTlZBTCk7CisjZW5kaWYKKwlpZiAobnVtIDwgMikKKwkJcmV0dXJuOyAgICAgICAgICAgICAgICAgLyogbm90aGluZyB0byBkbyAqLworCisJc3RrcHRyID0gMDsgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgc3RhY2sgKi8KKworCWxvID0gKGNoYXIgKiliYXNlOworCWhpID0gKGNoYXIgKiliYXNlICsgd2lkdGggKiAobnVtIC0gMSk7ICAgICAgLyogaW5pdGlhbGl6ZSBsaW1pdHMgKi8KKworCS8qIHRoaXMgZW50cnkgcG9pbnQgaXMgZm9yIHBzZXVkby1yZWN1cnNpb24gY2FsbGluZzogc2V0dGluZworCSAqIGxvIGFuZCBoaSBhbmQganVtcGluZyB0byBoZXJlIGlzIGxpa2UgcmVjdXJzaW9uLCBidXQgc3RrcHRyIGlzCisJICogcHJlc2VydmVkLCBsb2NhbHMgYXJlbid0LCBzbyB3ZSBwcmVzZXJ2ZSBzdHVmZiBvbiB0aGUgc3RhY2sKKwkgKi8KK3JlY3Vyc2U6CisKKwlzaXplID0gKGhpIC0gbG8pIC8gd2lkdGggKyAxOyAgICAgICAgLyogbnVtYmVyIG9mIGVsJ3MgdG8gc29ydCAqLworCisJLyogYmVsb3cgYSBjZXJ0YWluIHNpemUsIGl0IGlzIGZhc3RlciB0byB1c2UgYSBPKG5eMikgc29ydGluZyBtZXRob2QgKi8KKwlpZiAoc2l6ZSA8PSBDVVRPRkYpIHsKKwkJX19TSE9SVFNPUlQobG8sIGhpLCB3aWR0aCwgY29tcCwgY29udGV4dCk7CisJfSBlbHNlIHsKKwkJLyogRmlyc3Qgd2UgcGljayBhIHBhcnRpdGlvbmluZyBlbGVtZW50LiAgVGhlIGVmZmljaWVuY3kgb2YKKwkJICogdGhlIGFsZ29yaXRobSBkZW1hbmRzIHRoYXQgd2UgZmluZCBvbmUgdGhhdCBpcyBhcHByb3hpbWF0ZWx5CisJCSAqIHRoZSBtZWRpYW4gb2YgdGhlIHZhbHVlcywgYnV0IGFsc28gdGhhdCB3ZSBzZWxlY3Qgb25lIGZhc3QuCisJCSAqIFdlIGNob29zZSB0aGUgbWVkaWFuIG9mIHRoZSBmaXJzdCwgbWlkZGxlLCBhbmQgbGFzdAorCQkgKiBlbGVtZW50cywgdG8gYXZvaWQgYmFkIHBlcmZvcm1hbmNlIGluIHRoZSBmYWNlIG9mIGFscmVhZHkKKwkJICogc29ydGVkIGRhdGEsIG9yIGRhdGEgdGhhdCBpcyBtYWRlIHVwIG9mIG11bHRpcGxlIHNvcnRlZAorCQkgKiBydW5zIGFwcGVuZGVkIHRvZ2V0aGVyLiAgVGVzdGluZyBzaG93cyB0aGF0IGEKKwkJICogbWVkaWFuLW9mLXRocmVlIGFsZ29yaXRobSBwcm92aWRlcyBiZXR0ZXIgcGVyZm9ybWFuY2UgdGhhbgorCQkgKiBzaW1wbHkgcGlja2luZyB0aGUgbWlkZGxlIGVsZW1lbnQgZm9yIHRoZSBsYXR0ZXIgY2FzZS4KKwkJICovCisKKwkJbWlkID0gbG8gKyAoc2l6ZSAvIDIpICogd2lkdGg7ICAgICAgLyogZmluZCBtaWRkbGUgZWxlbWVudCAqLworCisJCS8qIFNvcnQgdGhlIGZpcnN0LCBtaWRkbGUsIGxhc3QgZWxlbWVudHMgaW50byBvcmRlciAqLworCQlpZiAoX19DT01QQVJFKGNvbnRleHQsIGxvLCBtaWQpID4gMCkKKwkJCXN3YXAobG8sIG1pZCwgd2lkdGgpOworCQlpZiAoX19DT01QQVJFKGNvbnRleHQsIGxvLCBoaSkgPiAwKQorCQkJc3dhcChsbywgaGksIHdpZHRoKTsKKwkJaWYgKF9fQ09NUEFSRShjb250ZXh0LCBtaWQsIGhpKSA+IDApCisJCQlzd2FwKG1pZCwgaGksIHdpZHRoKTsKKworCQkvKiBXZSBub3cgd2lzaCB0byBwYXJ0aXRpb24gdGhlIGFycmF5IGludG8gdGhyZWUgcGllY2VzLCBvbmUKKwkJICogY29uc2lzdGluZyBvZiBlbGVtZW50cyA8PSBwYXJ0aXRpb24gZWxlbWVudCwgb25lIG9mIGVsZW1lbnRzCisJCSAqIGVxdWFsIHRvIHRoZSBwYXJ0aXRpb24gZWxlbWVudCwgYW5kIG9uZSBvZiBlbGVtZW50cyA+IHRoYW4KKwkJICogaXQuIFRoaXMgaXMgZG9uZSBiZWxvdzsgY29tbWVudHMgaW5kaWNhdGUgY29uZGl0aW9ucworCQkgKiBlc3RhYmxpc2hlZCBhdCBldmVyeSBzdGVwLgorCQkgKi8KKworCQlsb2d1eSA9IGxvOworCQloaWd1eSA9IGhpOworCisJCS8qIE5vdGUgdGhhdCBoaWd1eSBkZWNyZWFzZXMgYW5kIGxvZ3V5IGluY3JlYXNlcyBvbiBldmVyeQorCQkgKiAgIGl0ZXJhdGlvbiwgc28gbG9vcCBtdXN0IHRlcm1pbmF0ZS4KKwkJICovCisJCWZvciAoOzspIHsKKwkJCS8qIGxvIDw9IGxvZ3V5IDwgaGksIGxvIDwgaGlndXkgPD0gaGksCisJCQkgKiAgIEFbaV0gPD0gQVttaWRdIGZvciBsbyA8PSBpIDw9IGxvZ3V5LAorCQkJICogICBBW2ldID4gQVttaWRdIGZvciBoaWd1eSA8PSBpIDwgaGksCisJCQkgKiAgIEFbaGldID49IEFbbWlkXQorCQkJICovCisKKwkJCS8qIFRoZSBkb3VibGVkIGxvb3AgaXMgdG8gYXZvaWQgY2FsbGluZyBjb21wKG1pZCxtaWQpLAorCQkJICogICBzaW5jZSBzb21lIGV4aXN0aW5nIGNvbXBhcmlzb24gZnVuY3MgZG9uJ3Qgd29yaworCQkJICogICB3aGVuIHBhc3NlZCB0aGUgc2FtZSB2YWx1ZSBmb3IgYm90aCBwb2ludGVycy4KKwkJCSAqLworCisJCQlpZiAobWlkID4gbG9ndXkpIHsKKwkJCQlkbyAgeworCQkJCQlsb2d1eSArPSB3aWR0aDsKKwkJCQl9IHdoaWxlIChsb2d1eSA8IG1pZCAmJgorCQkJCQlfX0NPTVBBUkUoY29udGV4dCwgbG9ndXksIG1pZCkgPD0gMCk7CisJCQl9CisJCQlpZiAobWlkIDw9IGxvZ3V5KSB7CisJCQkJZG8gIHsKKwkJCQkJbG9ndXkgKz0gd2lkdGg7CisJCQkJfSB3aGlsZSAobG9ndXkgPD0gaGkgJiYKKwkJCQkJX19DT01QQVJFKGNvbnRleHQsIGxvZ3V5LCBtaWQpIDw9IDApOworCQkJfQorCisJCQkvKiBsbyA8IGxvZ3V5IDw9IGhpKzEsIEFbaV0gPD0gQVttaWRdIGZvcgorCQkJICogICBsbyA8PSBpIDwgbG9ndXksCisJCQkgKiAgIGVpdGhlciBsb2d1eSA+IGhpIG9yIEFbbG9ndXldID4gQVttaWRdCisJCQkgKi8KKworCQkJZG8gIHsKKwkJCQloaWd1eSAtPSB3aWR0aDsKKwkJCX0gd2hpbGUgKGhpZ3V5ID4gbWlkICYmCisJCQkJCV9fQ09NUEFSRShjb250ZXh0LCBoaWd1eSwgbWlkKSA+IDApOworCisJCQkvKiBsbyA8PSBoaWd1eSA8IGhpLCBBW2ldID4gQVttaWRdIGZvciBoaWd1eSA8IGkgPCBoaSwKKwkJCSAqICAgZWl0aGVyIGhpZ3V5ID09IGxvIG9yIEFbaGlndXldIDw9IEFbbWlkXQorCQkJICovCisKKwkJCWlmIChoaWd1eSA8IGxvZ3V5KQorCQkJCWJyZWFrOworCisJCQkvKiBpZiBsb2d1eSA+IGhpIG9yIGhpZ3V5ID09IGxvLCB0aGVuIHdlIHdvdWxkIGhhdmUKKwkJCSAqICAgZXhpdGVkLCBzbyBBW2xvZ3V5XSA+IEFbbWlkXSwgQVtoaWd1eV0gPD0gQVttaWRdLAorCQkJICogICBsb2d1eSA8PSBoaSwgaGlndXkgPiBsbworCQkJICovCisKKwkJCXN3YXAobG9ndXksIGhpZ3V5LCB3aWR0aCk7CisKKwkJCS8qIElmIHRoZSBwYXJ0aXRpb24gZWxlbWVudCB3YXMgbW92ZWQsIGZvbGxvdyBpdC4KKwkJCSAqICAgT25seSBuZWVkIHRvIGNoZWNrIGZvciBtaWQgPT0gaGlndXksIHNpbmNlIGJlZm9yZQorCQkJICogICB0aGUgc3dhcCwgQVtsb2d1eV0gPiBBW21pZF0gaW1wbGllcyBsb2d1eSAhPSBtaWQuCisJCQkgKi8KKworCQkJaWYgKG1pZCA9PSBoaWd1eSkKKwkJCQltaWQgPSBsb2d1eTsKKworCQkJLyogQVtsb2d1eV0gPD0gQVttaWRdLCBBW2hpZ3V5XSA+IEFbbWlkXTsgc28gY29uZGl0aW9uCisJCQkgKiAgIGF0IHRvcCBvZiBsb29wIGlzIHJlLWVzdGFibGlzaGVkCisJCQkgKi8KKwkJfQorCisJCS8qICAgICBBW2ldIDw9IEFbbWlkXSBmb3IgbG8gPD0gaSA8IGxvZ3V5LAorCQkgKiAgICAgICBBW2ldID4gQVttaWRdIGZvciBoaWd1eSA8IGkgPCBoaSwKKwkJICogICAgICAgQVtoaV0gPj0gQVttaWRdCisJCSAqICAgICAgIGhpZ3V5IDwgbG9ndXkKKwkJICogICBpbXBseWluZzoKKwkJICogICAgICAgaGlndXkgPT0gbG9ndXktMQorCQkgKiAgICAgICBvciBoaWd1eSA9PSBoaSAtIDEsIGxvZ3V5ID09IGhpICsgMSwgQVtoaV0gPT0gQVttaWRdCisJCSAqLworCisJCS8qIEZpbmQgYWRqYWNlbnQgZWxlbWVudHMgZXF1YWwgdG8gdGhlIHBhcnRpdGlvbiBlbGVtZW50LiAgVGhlCisJCSAqICAgZG91YmxlZCBsb29wIGlzIHRvIGF2b2lkIGNhbGxpbmcgY29tcChtaWQsbWlkKSwgc2luY2Ugc29tZQorCQkgKiAgIGV4aXN0aW5nIGNvbXBhcmlzb24gZnVuY3MgZG9uJ3Qgd29yayB3aGVuIHBhc3NlZCB0aGUgc2FtZQorCQkgKiAgIHZhbHVlIGZvciBib3RoIHBvaW50ZXJzLgorCQkgKi8KKworCQloaWd1eSArPSB3aWR0aDsKKwkJaWYgKG1pZCA8IGhpZ3V5KSB7CisJCQlkbyAgeworCQkJCWhpZ3V5IC09IHdpZHRoOworCQkJfSB3aGlsZSAoaGlndXkgPiBtaWQgJiYKKwkJCQlfX0NPTVBBUkUoY29udGV4dCwgaGlndXksIG1pZCkgPT0gMCk7CisJCX0KKwkJaWYgKG1pZCA+PSBoaWd1eSkgeworCQkJZG8gIHsKKwkJCQloaWd1eSAtPSB3aWR0aDsKKwkJCX0gd2hpbGUgKGhpZ3V5ID4gbG8gJiYKKwkJCQlfX0NPTVBBUkUoY29udGV4dCwgaGlndXksIG1pZCkgPT0gMCk7CisJCX0KKworCQkvKiBPSywgbm93IHdlIGhhdmUgdGhlIGZvbGxvd2luZzoKKwkJICogICAgICBoaWd1eSA8IGxvZ3V5CisJCSAqICAgICAgbG8gPD0gaGlndXkgPD0gaGkKKwkJICogICAgICBBW2ldICA8PSBBW21pZF0gZm9yIGxvIDw9IGkgPD0gaGlndXkKKwkJICogICAgICBBW2ldICA9PSBBW21pZF0gZm9yIGhpZ3V5IDwgaSA8IGxvZ3V5CisJCSAqICAgICAgQVtpXSAgPiAgQVttaWRdIGZvciBsb2d1eSA8PSBpIDwgaGkKKwkJICogICAgICBBW2hpXSA+PSBBW21pZF0KKwkJICovCisKKwkJLyogV2UndmUgZmluaXNoZWQgdGhlIHBhcnRpdGlvbiwgbm93IHdlIHdhbnQgdG8gc29ydCB0aGUKKwkJICogICBzdWJhcnJheXMgW2xvLCBoaWd1eV0gYW5kIFtsb2d1eSwgaGldLgorCQkgKiAgIFdlIGRvIHRoZSBzbWFsbGVyIG9uZSBmaXJzdCB0byBtaW5pbWl6ZSBzdGFjayB1c2FnZS4KKwkJICogICBXZSBvbmx5IHNvcnQgYXJyYXlzIG9mIGxlbmd0aCAyIG9yIG1vcmUuCisJCSAqLworCisJCWlmIChoaWd1eSAtIGxvID49IGhpIC0gbG9ndXkpIHsKKwkJCWlmIChsbyA8IGhpZ3V5KSB7CisJCQkJbG9zdGtbc3RrcHRyXSA9IGxvOworCQkJCWhpc3RrW3N0a3B0cl0gPSBoaWd1eTsKKwkJCQkrK3N0a3B0cjsKKwkJCX0gICAgICAgICAgICAgICAgICAgIC8qIHNhdmUgYmlnIHJlY3Vyc2lvbiBmb3IgbGF0ZXIgKi8KKworCQkJaWYgKGxvZ3V5IDwgaGkpIHsKKwkJCQlsbyA9IGxvZ3V5OworCQkJCWdvdG8gcmVjdXJzZTsgICAgICAgICAgLyogZG8gc21hbGwgcmVjdXJzaW9uICovCisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAobG9ndXkgPCBoaSkgeworCQkJCWxvc3RrW3N0a3B0cl0gPSBsb2d1eTsKKwkJCQloaXN0a1tzdGtwdHJdID0gaGk7CisJCQkJKytzdGtwdHI7ICAgIC8qIHNhdmUgYmlnIHJlY3Vyc2lvbiBmb3IgbGF0ZXIgKi8KKwkJCX0KKworCQkJaWYgKGxvIDwgaGlndXkpIHsKKwkJCQloaSA9IGhpZ3V5OworCQkJCWdvdG8gcmVjdXJzZTsgICAgICAgICAgLyogZG8gc21hbGwgcmVjdXJzaW9uICovCisJCQl9CisJCX0KKwl9CisKKwkvKiBXZSBoYXZlIHNvcnRlZCB0aGUgYXJyYXksIGV4Y2VwdCBmb3IgYW55IHBlbmRpbmcgc29ydHMgb24gdGhlIHN0YWNrLgorCSAqICAgQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSwgYW5kIGRvIHRoZW0uCisJICovCisKKwktLXN0a3B0cjsKKwlpZiAoc3RrcHRyID49IDApIHsKKwkJbG8gPSBsb3N0a1tzdGtwdHJdOworCQloaSA9IGhpc3RrW3N0a3B0cl07CisJCWdvdG8gcmVjdXJzZTsgICAgICAgICAgIC8qIHBvcCBzdWJhcnJheSBmcm9tIHN0YWNrICovCisJfSBlbHNlCisJCXJldHVybjsgICAgICAgICAgICAgICAgIC8qIGFsbCBzdWJhcnJheXMgZG9uZSAqLworfQorCisvKiEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFxicmllZgorICogICAgY29tcGFyZXMgdHdvIHN0b3JlZCBwaWN0dXJlcyBieSBwaWN0dXJlIG51bWJlciBmb3IgcXNvcnQgaW4KKyAqICAgIGRlc2NlbmRpbmcgb3JkZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNvbXBhcmVfcGljX2J5X3BpY19udW1fZGVzYyhjb25zdCB2b2lkICphcmcxLAorCQljb25zdCB2b2lkICphcmcyKQoreworCWludCBwaWNfbnVtMSA9ICgqKHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKiopYXJnMSktPnBpY19udW07CisJaW50IHBpY19udW0yID0gKCooc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqKilhcmcyKS0+cGljX251bTsKKworCWlmIChwaWNfbnVtMSA8IHBpY19udW0yKQorCQlyZXR1cm4gMTsKKwlpZiAocGljX251bTEgPiBwaWNfbnVtMikKKwkJcmV0dXJuIC0xOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qIQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogXGJyaWVmCisgKiAgICBjb21wYXJlcyB0d28gc3RvcmVkIHBpY3R1cmVzIGJ5IHBpY3R1cmUgbnVtYmVyIGZvciBxc29ydCBpbgorICogICAgZGVzY2VuZGluZyBvcmRlcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworc3RhdGljIGlubGluZSBpbnQgY29tcGFyZV9waWNfYnlfbHRfcGljX251bV9hc2MoY29uc3Qgdm9pZCAqYXJnMSwKKwkJY29uc3Qgdm9pZCAqYXJnMikKK3sKKwlpbnQgbG9uZ190ZXJtX3BpY19udW0xID0KKwkJKCooc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqKilhcmcxKS0+bG9uZ190ZXJtX3BpY19udW07CisJaW50IGxvbmdfdGVybV9waWNfbnVtMiA9CisJCSgqKHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKiopYXJnMiktPmxvbmdfdGVybV9waWNfbnVtOworCisJaWYgKGxvbmdfdGVybV9waWNfbnVtMSA8IGxvbmdfdGVybV9waWNfbnVtMikKKwkJcmV0dXJuIC0xOworCWlmIChsb25nX3Rlcm1fcGljX251bTEgPiBsb25nX3Rlcm1fcGljX251bTIpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qIQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogXGJyaWVmCisgKiAgICBjb21wYXJlcyB0d28gZnJhbWUgc3RvcmVzIGJ5IHBpY19udW0gZm9yIHFzb3J0IGluIGRlc2NlbmRpbmcgb3JkZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNvbXBhcmVfZnNfYnlfZnJhbWVfbnVtX2Rlc2MoY29uc3Qgdm9pZCAqYXJnMSwKKwkJY29uc3Qgdm9pZCAqYXJnMikKK3sKKwlpbnQgZnJhbWVfbnVtX3dyYXAxID0gKCooc3RydWN0IEZyYW1lU3RvcmUgKiopYXJnMSktPmZyYW1lX251bV93cmFwOworCWludCBmcmFtZV9udW1fd3JhcDIgPSAoKihzdHJ1Y3QgRnJhbWVTdG9yZSAqKilhcmcyKS0+ZnJhbWVfbnVtX3dyYXA7CisKKwlpZiAoZnJhbWVfbnVtX3dyYXAxIDwgZnJhbWVfbnVtX3dyYXAyKQorCQlyZXR1cm4gMTsKKwlpZiAoZnJhbWVfbnVtX3dyYXAxID4gZnJhbWVfbnVtX3dyYXAyKQorCQlyZXR1cm4gLTE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworCisvKiEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFxicmllZgorICogICAgY29tcGFyZXMgdHdvIGZyYW1lIHN0b3JlcyBieSBsdF9waWNfbnVtIGZvciBxc29ydCBpbiBkZXNjZW5kaW5nIG9yZGVyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGF0aWMgaW5saW5lIGludCBjb21wYXJlX2ZzX2J5X2x0X3BpY19pZHhfYXNjKGNvbnN0IHZvaWQgKmFyZzEsCisJCWNvbnN0IHZvaWQgKmFyZzIpCit7CisJaW50IGxvbmdfdGVybV9mcmFtZV9pZHgxID0KKwkJKCooc3RydWN0IEZyYW1lU3RvcmUgKiopYXJnMSktPmxvbmdfdGVybV9mcmFtZV9pZHg7CisJaW50IGxvbmdfdGVybV9mcmFtZV9pZHgyID0KKwkJKCooc3RydWN0IEZyYW1lU3RvcmUgKiopYXJnMiktPmxvbmdfdGVybV9mcmFtZV9pZHg7CisKKwlpZiAobG9uZ190ZXJtX2ZyYW1lX2lkeDEgPCBsb25nX3Rlcm1fZnJhbWVfaWR4MikKKwkJcmV0dXJuIC0xOworCWVsc2UgaWYgKGxvbmdfdGVybV9mcmFtZV9pZHgxID4gbG9uZ190ZXJtX2ZyYW1lX2lkeDIpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKworLyohCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBcYnJpZWYKKyAqICAgIGNvbXBhcmVzIHR3byBzdG9yZWQgcGljdHVyZXMgYnkgcG9jIGZvciBxc29ydCBpbiBhc2NlbmRpbmcgb3JkZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNvbXBhcmVfcGljX2J5X3BvY19hc2MoY29uc3Qgdm9pZCAqYXJnMSwgY29uc3Qgdm9pZCAqYXJnMikKK3sKKwlpbnQgcG9jMSA9ICgqKHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKiopYXJnMSktPnBvYzsKKwlpbnQgcG9jMiA9ICgqKHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKiopYXJnMiktPnBvYzsKKworCWlmIChwb2MxIDwgcG9jMikKKwkJcmV0dXJuIC0xOworCWVsc2UgaWYgKHBvYzEgPiBwb2MyKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCisKKy8qIQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogXGJyaWVmCisgKiAgICBjb21wYXJlcyB0d28gc3RvcmVkIHBpY3R1cmVzIGJ5IHBvYyBmb3IgcXNvcnQgaW4gZGVzY2VuZGluZyBvcmRlcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworc3RhdGljIGlubGluZSBpbnQgY29tcGFyZV9waWNfYnlfcG9jX2Rlc2MoY29uc3Qgdm9pZCAqYXJnMSwgY29uc3Qgdm9pZCAqYXJnMikKK3sKKwlpbnQgcG9jMSA9ICgqKHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKiopYXJnMSktPnBvYzsKKwlpbnQgcG9jMiA9ICgqKHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKiopYXJnMiktPnBvYzsKKworCWlmIChwb2MxIDwgcG9jMikKKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAocG9jMSA+IHBvYzIpCisJCXJldHVybiAtMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCisKKy8qIQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogXGJyaWVmCisgKiAgICBjb21wYXJlcyB0d28gZnJhbWUgc3RvcmVzIGJ5IHBvYyBmb3IgcXNvcnQgaW4gYXNjZW5kaW5nIG9yZGVyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGF0aWMgaW5saW5lIGludCBjb21wYXJlX2ZzX2J5X3BvY19hc2MoY29uc3Qgdm9pZCAqYXJnMSwgY29uc3Qgdm9pZCAqYXJnMikKK3sKKwlpbnQgcG9jMSA9ICgqKHN0cnVjdCBGcmFtZVN0b3JlICoqKWFyZzEpLT5wb2M7CisJaW50IHBvYzIgPSAoKihzdHJ1Y3QgRnJhbWVTdG9yZSAqKilhcmcyKS0+cG9jOworCisJaWYgKHBvYzEgPCBwb2MyKQorCQlyZXR1cm4gLTE7CisJZWxzZSBpZiAocG9jMSA+IHBvYzIpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKworLyohCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBcYnJpZWYKKyAqICAgIGNvbXBhcmVzIHR3byBmcmFtZSBzdG9yZXMgYnkgcG9jIGZvciBxc29ydCBpbiBkZXNjZW5kaW5nIG9yZGVyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGF0aWMgaW5saW5lIGludCBjb21wYXJlX2ZzX2J5X3BvY19kZXNjKGNvbnN0IHZvaWQgKmFyZzEsIGNvbnN0IHZvaWQgKmFyZzIpCit7CisJaW50IHBvYzEgPSAoKihzdHJ1Y3QgRnJhbWVTdG9yZSAqKilhcmcxKS0+cG9jOworCWludCBwb2MyID0gKCooc3RydWN0IEZyYW1lU3RvcmUgKiopYXJnMiktPnBvYzsKKworCWlmIChwb2MxIDwgcG9jMikKKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAocG9jMSA+IHBvYzIpCisJCXJldHVybiAtMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKiEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFxicmllZgorICogICAgcmV0dXJucyB0cnVlLCBpZiBwaWN0dXJlIGlzIHNob3J0IHRlcm0gcmVmZXJlbmNlIHBpY3R1cmUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzX3Nob3J0X3JlZihzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpzKQoreworI2lmZGVmIEVSUk9SX0NIRUNLCisJcmV0dXJuIChzICYmCisJCShzLT51c2VkX2Zvcl9yZWZlcmVuY2UpICYmICghKHMtPmlzX2xvbmdfdGVybSkpKTsKKyNlbHNlCisJcmV0dXJuIChzLT51c2VkX2Zvcl9yZWZlcmVuY2UpICYmICghKHMtPmlzX2xvbmdfdGVybSkpOworI2VuZGlmCit9CisKKworLyohCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBcYnJpZWYKKyAqICAgIHJldHVybnMgdHJ1ZSwgaWYgcGljdHVyZSBpcyBsb25nIHRlcm0gcmVmZXJlbmNlIHBpY3R1cmUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzX2xvbmdfcmVmKHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnMpCit7CisjaWZkZWYgRVJST1JfQ0hFQ0sKKwlyZXR1cm4gKHMgJiYKKwkJcy0+dXNlZF9mb3JfcmVmZXJlbmNlKSAmJiAocy0+aXNfbG9uZ190ZXJtKTsKKyNlbHNlCisJcmV0dXJuIChzLT51c2VkX2Zvcl9yZWZlcmVuY2UpICYmIChzLT5pc19sb25nX3Rlcm0pOworI2VuZGlmCit9CisKKy8qIQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogXGJyaWVmCisgKiAgICBJbml0aWFsaXplIHJlZmVyZW5jZSBsaXN0cyBmb3IgYSBQIFNsaWNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisvKiEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFxicmllZgorICogICAgR2VuZXJhdGVzIGEgYWx0ZXJuYXRpbmcgZmllbGQgbGlzdCBmcm9tIGEgZ2l2ZW4gRnJhbWVTdG9yZSBsaXN0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGF0aWMgdm9pZCBnZW5fcGljX2xpc3RfZnJvbV9mcmFtZV9saXN0KGVudW0gUGljdHVyZVN0cnVjdHVyZSBjdXJyU3RydWN0dXJlLAorCQlzdHJ1Y3QgRnJhbWVTdG9yZSAqKmZzX2xpc3QsIGludCBsaXN0X2lkeCwKKwkJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqKmxpc3QsCisJCWNoYXIgKmxpc3Rfc2l6ZSwgaW50IGxvbmdfdGVybSkKK3sKKwlpbnQgdG9wX2lkeCA9IDA7CisJaW50IGJvdF9pZHggPSAwOworCisJaW50ICgqaXNfcmVmKShzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpzKSA9IChsb25nX3Rlcm0pID8gaXNfbG9uZ19yZWYgOgorCQkJaXNfc2hvcnRfcmVmOworCisKKwlpZiAoY3VyclN0cnVjdHVyZSA9PSBUT1BfRklFTEQpIHsKKwkJd2hpbGUgKCh0b3BfaWR4IDwgbGlzdF9pZHgpIHx8IChib3RfaWR4IDwgbGlzdF9pZHgpKSB7CisJCQlmb3IgKDsgdG9wX2lkeCA8IGxpc3RfaWR4OyB0b3BfaWR4KyspIHsKKwkJCQlpZiAoZnNfbGlzdFt0b3BfaWR4XS0+aXNfdXNlZCAmIDEpIHsKKwkJCQkJaWYgKGlzX3JlZihmc19saXN0W3RvcF9pZHhdLT4KKwkJCQkJCXRvcF9maWVsZCkpIHsKKwkJCQkJCS8qIHNob3J0IHRlcm0gcmVmIHBpYyAqLworCQkJCQkJbGlzdFsoc2hvcnQpICpsaXN0X3NpemVdID0KKwkJCQkJCWZzX2xpc3RbdG9wX2lkeF0tPnRvcF9maWVsZDsKKwkJCQkJCSgqbGlzdF9zaXplKSsrOworCQkJCQkJdG9wX2lkeCsrOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlmb3IgKDsgYm90X2lkeCA8IGxpc3RfaWR4OyBib3RfaWR4KyspIHsKKwkJCQlpZiAoZnNfbGlzdFtib3RfaWR4XS0+aXNfdXNlZCAmIDIpIHsKKwkJCQkJaWYgKGlzX3JlZihmc19saXN0W2JvdF9pZHhdLT4KKwkJCQkJCWJvdHRvbV9maWVsZCkpIHsKKwkJCQkJCS8qIHNob3J0IHRlcm0gcmVmIHBpYyAqLworCQkJCQkJbGlzdFsoc2hvcnQpICpsaXN0X3NpemVdID0KKwkJCQkJCWZzX2xpc3RbYm90X2lkeF0tPmJvdHRvbV9maWVsZDsKKwkJCQkJCSgqbGlzdF9zaXplKSsrOworCQkJCQkJYm90X2lkeCsrOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYgKGN1cnJTdHJ1Y3R1cmUgPT0gQk9UVE9NX0ZJRUxEKSB7CisJCXdoaWxlICgodG9wX2lkeCA8IGxpc3RfaWR4KSB8fCAoYm90X2lkeCA8IGxpc3RfaWR4KSkgeworCQkJZm9yICg7IGJvdF9pZHggPCBsaXN0X2lkeDsgYm90X2lkeCsrKSB7CisJCQkJaWYgKGZzX2xpc3RbYm90X2lkeF0tPmlzX3VzZWQgJiAyKSB7CisJCQkJCWlmIChpc19yZWYoZnNfbGlzdFtib3RfaWR4XS0+CisJCQkJCQlib3R0b21fZmllbGQpKSB7CisJCQkJCQkvKiBzaG9ydCB0ZXJtIHJlZiBwaWMgKi8KKwkJCQkJCWxpc3RbKHNob3J0KSAqbGlzdF9zaXplXSA9CisJCQkJCQlmc19saXN0W2JvdF9pZHhdLT5ib3R0b21fZmllbGQ7CisJCQkJCQkoKmxpc3Rfc2l6ZSkrKzsKKwkJCQkJCWJvdF9pZHgrKzsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZm9yICg7IHRvcF9pZHggPCBsaXN0X2lkeDsgdG9wX2lkeCsrKSB7CisJCQkJaWYgKGZzX2xpc3RbdG9wX2lkeF0tPmlzX3VzZWQgJiAxKSB7CisJCQkJCWlmIChpc19yZWYoZnNfbGlzdFt0b3BfaWR4XS0+CisJCQkJCQl0b3BfZmllbGQpKSB7CisJCQkJCQkvKiBzaG9ydCB0ZXJtIHJlZiBwaWMgKi8KKwkJCQkJCWxpc3RbKHNob3J0KSAqbGlzdF9zaXplXSA9CisJCQkJCQlmc19saXN0W3RvcF9pZHhdLT50b3BfZmllbGQ7CisJCQkJCQkoKmxpc3Rfc2l6ZSkrKzsKKwkJCQkJCXRvcF9pZHgrKzsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBpbml0X2xpc3RzX3Bfc2xpY2Uoc3RydWN0IFNsaWNlICpjdXJyU2xpY2UpCit7CisJc3RydWN0IFZpZGVvUGFyYW1ldGVycyAqcF9WaWQgPSBjdXJyU2xpY2UtPnBfVmlkOworCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIgPSBjdXJyU2xpY2UtPnBfRHBiOworCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gY29udGFpbmVyX29mKHBfRHBiLAorCQkJCXN0cnVjdCBoMjY0X2RwYl9zdHJ1LCBtRFBCKTsKKworCXVuc2lnbmVkIGludCBpOworCisJaW50IGxpc3QwaWR4ID0gMDsKKwlpbnQgbGlzdGx0aWR4ID0gMDsKKworCXN0cnVjdCBGcmFtZVN0b3JlICoqZnNfbGlzdDA7CisJc3RydWN0IEZyYW1lU3RvcmUgKipmc19saXN0bHQ7CisKKyNpZiAoTVZDX0VYVEVOU0lPTl9FTkFCTEUpCisJY3VyclNsaWNlLT5saXN0aW50ZXJ2aWV3aWR4MCA9IDA7CisJY3VyclNsaWNlLT5saXN0aW50ZXJ2aWV3aWR4MSA9IDA7CisjZW5kaWYKKworCWlmIChjdXJyU2xpY2UtPnN0cnVjdHVyZSA9PSBGUkFNRSkgeworCQlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnJlZl9mcmFtZXNfaW5fYnVmZmVyOyBpKyspIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0gPT0gTlVMTCB8fAorCQkJCXBfRHBiLT5mc19yZWZbaV0tPmZyYW1lID09IE5VTEwpIHsKKwkJCQlwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyA9IF9fTElORV9fOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmCisJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+aXNfdXNlZCA9PSAzKSB7CisJCQkJaWYgKChwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZS0+CisJCQkJCXVzZWRfZm9yX3JlZmVyZW5jZSkgJiYKKwkJCQkgICAgKCFwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZS0+CisJCQkJCWlzX2xvbmdfdGVybSkpIHsKKwkJCQkJY3VyclNsaWNlLT5saXN0WFswXVtsaXN0MGlkeCsrXSA9CisJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmZyYW1lOworCQkJCX0KKwkJCX0KKwkJfQorCQkvKiBvcmRlciBsaXN0IDAgYnkgUGljTnVtICovCisJCXFzb3J0KCh2b2lkICopY3VyclNsaWNlLT5saXN0WFswXSwgbGlzdDBpZHgsCisJCQlzaXplb2Yoc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqKSwKKwkJCWNvbXBhcmVfcGljX2J5X3BpY19udW1fZGVzYyk7CisJCWN1cnJTbGljZS0+bGlzdFhzaXplWzBdID0gKGNoYXIpIGxpc3QwaWR4OworCQlDSEVDS19WQUxJRChjdXJyU2xpY2UtPmxpc3RYc2l6ZVswXSwgMCk7CisJCWlmIChoMjY0X2RlYnVnX2ZsYWcgJiBQUklOVF9GTEFHX0RQQl9ERVRBSUwpIHsKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkgICJsaXN0WFswXSAoUGljTnVtKTogIik7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGlzdDBpZHg7IGkrKykgeworCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsICIlZCAgIiwKKwkJCQkJY3VyclNsaWNlLT5saXN0WFswXVtpXS0+cGljX251bSk7CisJCQl9CisJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsICJcbiIpOworCQl9CisJCS8qIGxvbmcgdGVybSBoYW5kbGluZyAqLworCQlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPmx0cmVmX2ZyYW1lc19pbl9idWZmZXI7IGkrKykgeworCQkJaWYgKHBfRHBiLT5mc19sdHJlZltpXS0+aXNfdXNlZCA9PSAzKSB7CisJCQkJaWYgKHBfRHBiLT5mc19sdHJlZltpXS0+ZnJhbWUtPmlzX2xvbmdfdGVybSkgeworCQkJCQljdXJyU2xpY2UtPmxpc3RYWzBdW2xpc3QwaWR4KytdID0KKwkJCQkJCXBfRHBiLT5mc19sdHJlZltpXS0+ZnJhbWU7CisJCQkJfQorCQkJfQorCQl9CisJCXFzb3J0KCh2b2lkICopJmN1cnJTbGljZS0+bGlzdFhbMF1bCisJCQkoc2hvcnQpIGN1cnJTbGljZS0+bGlzdFhzaXplWzBdXSwKKwkJCWxpc3QwaWR4IC0gY3VyclNsaWNlLT5saXN0WHNpemVbMF0sCisJCQlzaXplb2Yoc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqKSwKKwkJCWNvbXBhcmVfcGljX2J5X2x0X3BpY19udW1fYXNjKTsKKwkJY3VyclNsaWNlLT5saXN0WHNpemVbMF0gPSAoY2hhcikgbGlzdDBpZHg7CisJCUNIRUNLX1ZBTElEKGN1cnJTbGljZS0+bGlzdFhzaXplWzBdLCAwKTsKKwl9IGVsc2UgeworI2lmIDAKKwkJZnNfbGlzdDAgPSBjYWxsb2MocF9EcGItPnNpemUsIHNpemVvZihzdHJ1Y3QgRnJhbWVTdG9yZSAqKSk7CisJCWlmIChmc19saXN0MCA9PSBOVUxMKQorCQkJbm9fbWVtX2V4aXQoImluaXRfbGlzdHM6IGZzX2xpc3QwIik7CisJCWZzX2xpc3RsdCA9IGNhbGxvYyhwX0RwYi0+c2l6ZSwgc2l6ZW9mKHN0cnVjdCBGcmFtZVN0b3JlICopKTsKKwkJaWYgKGZzX2xpc3RsdCA9PSBOVUxMKQorCQkJbm9fbWVtX2V4aXQoImluaXRfbGlzdHM6IGZzX2xpc3RsdCIpOworI2Vsc2UKKwkJZnNfbGlzdDAgPSAmKHBfRHBiLT5mc19saXN0MFswXSk7CisJCWZzX2xpc3RsdCA9ICYocF9EcGItPmZzX2xpc3RsdFswXSk7CisjZW5kaWYKKwkJZm9yIChpID0gMDsgaSA8IHBfRHBiLT5yZWZfZnJhbWVzX2luX2J1ZmZlcjsgaSsrKSB7CisjaWZkZWYgRVJST1JfQ0hFQ0sKKwkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldID09IE5VTEwpIHsKKwkJCQlwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyA9IF9fTElORV9fOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmCisJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+aXNfcmVmZXJlbmNlKQorCQkJCWZzX2xpc3QwW2xpc3QwaWR4KytdID0gcF9EcGItPmZzX3JlZltpXTsKKwkJfQorCisJCXFzb3J0KCh2b2lkICopZnNfbGlzdDAsIGxpc3QwaWR4LCBzaXplb2Yoc3RydWN0IEZyYW1lU3RvcmUgKiksCisJCSAgICAgIGNvbXBhcmVfZnNfYnlfZnJhbWVfbnVtX2Rlc2MpOworCisJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkgICJmc19saXN0MCAoRnJhbWVOdW0pOiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IGxpc3QwaWR4OyBpKyspIHsKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCSAgUFJJTlRfRkxBR19EUEJfREVUQUlMLCAiJWQgICIsCisJCQkJICBmc19saXN0MFtpXS0+ZnJhbWVfbnVtX3dyYXApOworCQl9CisJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkgICJcbiIpOworCisJCWN1cnJTbGljZS0+bGlzdFhzaXplWzBdID0gMDsKKwkJZ2VuX3BpY19saXN0X2Zyb21fZnJhbWVfbGlzdChjdXJyU2xpY2UtPnN0cnVjdHVyZSwgZnNfbGlzdDAsCisJCQkJCQlsaXN0MGlkeCwgY3VyclNsaWNlLT5saXN0WFswXSwKKwkJCQkJCSZjdXJyU2xpY2UtPmxpc3RYc2l6ZVswXSwgMCk7CisKKwkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSAgImxpc3RYWzBdIChQaWNOdW0pOiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IGN1cnJTbGljZS0+bGlzdFhzaXplWzBdOyBpKyspIHsKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwgIiVkICAiLAorCQkJCWN1cnJTbGljZS0+bGlzdFhbMF1baV0tPnBpY19udW0pOworCQl9CisJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkgICJcbiIpOworCisJCS8qIGxvbmcgdGVybSBoYW5kbGluZyAqLworCQlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPmx0cmVmX2ZyYW1lc19pbl9idWZmZXI7IGkrKykKKwkJCWZzX2xpc3RsdFtsaXN0bHRpZHgrK10gPSBwX0RwYi0+ZnNfbHRyZWZbaV07CisKKwkJcXNvcnQoKHZvaWQgKilmc19saXN0bHQsIGxpc3RsdGlkeCwgc2l6ZW9mKHN0cnVjdCBGcmFtZVN0b3JlICopLAorCQkgICAgICBjb21wYXJlX2ZzX2J5X2x0X3BpY19pZHhfYXNjKTsKKworCQlnZW5fcGljX2xpc3RfZnJvbV9mcmFtZV9saXN0KGN1cnJTbGljZS0+c3RydWN0dXJlLCBmc19saXN0bHQsCisJCQkJCWxpc3RsdGlkeCwgY3VyclNsaWNlLT5saXN0WFswXSwKKwkJCQkJJmN1cnJTbGljZS0+bGlzdFhzaXplWzBdLCAxKTsKKworCQkvKiBmcmVlKGZzX2xpc3QwKTsgKi8KKwkJLyogZnJlZShmc19saXN0bHQpOyAqLworCX0KKwljdXJyU2xpY2UtPmxpc3RYc2l6ZVsxXSA9IDA7CisKKworCS8qIHNldCBtYXggc2l6ZSAqLworCWN1cnJTbGljZS0+bGlzdFhzaXplWzBdID0gKGNoYXIpIGltaW4oY3VyclNsaWNlLT5saXN0WHNpemVbMF0sCisJCQljdXJyU2xpY2UtPm51bV9yZWZfaWR4X2FjdGl2ZVtMSVNUXzBdKTsKKwljdXJyU2xpY2UtPmxpc3RYc2l6ZVsxXSA9IChjaGFyKSBpbWluKGN1cnJTbGljZS0+bGlzdFhzaXplWzFdLAorCQkJY3VyclNsaWNlLT5udW1fcmVmX2lkeF9hY3RpdmVbTElTVF8xXSk7CisJQ0hFQ0tfVkFMSUQoY3VyclNsaWNlLT5saXN0WHNpemVbMF0sIDApOworCUNIRUNLX1ZBTElEKGN1cnJTbGljZS0+bGlzdFhzaXplWzFdLCAxKTsKKworCS8qIHNldCB0aGUgdW51c2VkIGxpc3QgZW50cmllcyB0byBOVUxMICovCisJZm9yIChpID0gY3VyclNsaWNlLT5saXN0WHNpemVbMF07IGkgPCAoTUFYX0xJU1RfU0laRSk7IGkrKykKKwkJY3VyclNsaWNlLT5saXN0WFswXVtpXSA9IHBfVmlkLT5ub19yZWZlcmVuY2VfcGljdHVyZTsKKwlmb3IgKGkgPSBjdXJyU2xpY2UtPmxpc3RYc2l6ZVsxXTsgaSA8IChNQVhfTElTVF9TSVpFKTsgaSsrKQorCQljdXJyU2xpY2UtPmxpc3RYWzFdW2ldID0gcF9WaWQtPm5vX3JlZmVyZW5jZV9waWN0dXJlOworCisjaWYgUFJJTlRSRUZMSVNUCisjaWYgKE1WQ19FWFRFTlNJT05fRU5BQkxFKQorCS8qIHByaW50IG91dCBmb3IgaDI2NF9kZWJ1Z19mbGFnIHB1cnBvc2UgKi8KKwlpZiAoKHBfVmlkLT5wcm9maWxlX2lkYyA9PSBNVkNfSElHSCB8fAorCQlwX1ZpZC0+cHJvZmlsZV9pZGMgPT0gU1RFUkVPX0hJR0gpICYmCisJICAgIGN1cnJTbGljZS0+Y3VycmVudF9zbGljZV9uciA9PSAwKSB7CisJCWlmIChjdXJyU2xpY2UtPmxpc3RYc2l6ZVswXSA+IDApIHsKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwgIlxuIik7CisJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJICAiICoqIChDdXJWaWV3SUQ6JWQgJWQpICVzIFJlZiBQaWMgTGlzdCAwICoqKipcbiIsCisJCQkJY3VyclNsaWNlLT52aWV3X2lkLAorCQkJCWN1cnJTbGljZS0+VGhpc1BPQywKKwkJCQljdXJyU2xpY2UtPnN0cnVjdHVyZSA9PSBGUkFNRSA/ICJGUk0iIDoKKwkJCQkgIChjdXJyU2xpY2UtPnN0cnVjdHVyZSA9PSBUT1BfRklFTEQgPworCQkJCQkiVE9QIiA6ICJCT1QiKSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgKHVuc2lnbmVkIGludCkoY3VyclNsaWNlLT4KKwkJCQlsaXN0WHNpemVbMF0pOyBpKyspIHsgLyogcmVmIGxpc3QgMCAqLworCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkiICAgJTJkIC0+IFBPQzogJTRkIFBpY051bTogJTRkIFZpZXdJRDogJWRcbiIsCisJCQkJaSwKKwkJCQljdXJyU2xpY2UtPmxpc3RYWzBdW2ldLT5wb2MsCisJCQkJY3VyclNsaWNlLT5saXN0WFswXVtpXS0+cGljX251bSwKKwkJCQljdXJyU2xpY2UtPmxpc3RYWzBdW2ldLT52aWV3X2lkKTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorI2VuZGlmCit9CisKKworLyohCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBcYnJpZWYKKyAqICAgIEluaXRpYWxpemUgcmVmZXJlbmNlIGxpc3RzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGF0aWMgdm9pZCBpbml0X21iYWZmX2xpc3RzKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLAorCQkJICAgICBzdHJ1Y3QgU2xpY2UgKmN1cnJTbGljZSkKK3sKKwl1bnNpZ25lZCBpbnQgajsKKwlpbnQgaTsKKwlzdHJ1Y3QgVmlkZW9QYXJhbWV0ZXJzICpwX1ZpZCA9ICZwX0gyNjRfRHBiLT5tVmlkZW87CisJZm9yIChpID0gMjsgaSA8IDY7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgTUFYX0xJU1RfU0laRTsgaisrKQorCQkJY3VyclNsaWNlLT5saXN0WFtpXVtqXSA9IHBfVmlkLT5ub19yZWZlcmVuY2VfcGljdHVyZTsKKwkJY3VyclNsaWNlLT5saXN0WHNpemVbaV0gPSAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBjdXJyU2xpY2UtPmxpc3RYc2l6ZVswXTsgaSsrKSB7CisjaWZkZWYgRVJST1JfQ0hFQ0sKKwkJaWYgKGN1cnJTbGljZS0+bGlzdFhbMF1baV0gPT0gTlVMTCkgeworCQkJcF9IMjY0X0RwYi0+ZHBiX2Vycm9yX2ZsYWcgPSBfX0xJTkVfXzsKKwkJCXByX2luZm8oCisJCQkiZXJyb3IgY3VyclNsaWNlLT5saXN0WFswXVslZF0gaXMgTlVMTFxyXG4iLCBpKTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKwkJY3VyclNsaWNlLT5saXN0WFsyXVsyICogaV0gPQorCQkJY3VyclNsaWNlLT5saXN0WFswXVtpXS0+dG9wX2ZpZWxkOworCQljdXJyU2xpY2UtPmxpc3RYWzJdWzIgKiBpICsgMV0gPQorCQkJY3VyclNsaWNlLT5saXN0WFswXVtpXS0+Ym90dG9tX2ZpZWxkOworCQljdXJyU2xpY2UtPmxpc3RYWzRdWzIgKiBpXSA9CisJCQljdXJyU2xpY2UtPmxpc3RYWzBdW2ldLT5ib3R0b21fZmllbGQ7CisJCWN1cnJTbGljZS0+bGlzdFhbNF1bMiAqIGkgKyAxXSA9CisJCQljdXJyU2xpY2UtPmxpc3RYWzBdW2ldLT50b3BfZmllbGQ7CisJfQorCWN1cnJTbGljZS0+bGlzdFhzaXplWzJdID0gY3VyclNsaWNlLT5saXN0WHNpemVbNF0gPQorCQljdXJyU2xpY2UtPmxpc3RYc2l6ZVswXSAqIDI7CisKKwlmb3IgKGkgPSAwOyBpIDwgY3VyclNsaWNlLT5saXN0WHNpemVbMV07IGkrKykgeworI2lmZGVmIEVSUk9SX0NIRUNLCisJCWlmIChjdXJyU2xpY2UtPmxpc3RYWzFdW2ldID09IE5VTEwpIHsKKwkJCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnID0gX19MSU5FX187CisJCQlwcl9pbmZvKAorCQkJImVycm9yIGN1cnJTbGljZS0+bGlzdFhbMV1bJWRdIGlzIE5VTExcclxuIiwgaSk7CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisJCWN1cnJTbGljZS0+bGlzdFhbM11bMiAqIGldID0KKwkJCWN1cnJTbGljZS0+bGlzdFhbMV1baV0tPnRvcF9maWVsZDsKKwkJY3VyclNsaWNlLT5saXN0WFszXVsyICogaSArIDFdID0KKwkJCWN1cnJTbGljZS0+bGlzdFhbMV1baV0tPmJvdHRvbV9maWVsZDsKKwkJY3VyclNsaWNlLT5saXN0WFs1XVsyICogaV0gPQorCQkJY3VyclNsaWNlLT5saXN0WFsxXVtpXS0+Ym90dG9tX2ZpZWxkOworCQljdXJyU2xpY2UtPmxpc3RYWzVdWzIgKiBpICsgMV0gPQorCQkJY3VyclNsaWNlLT5saXN0WFsxXVtpXS0+dG9wX2ZpZWxkOworCX0KKwljdXJyU2xpY2UtPmxpc3RYc2l6ZVszXSA9IGN1cnJTbGljZS0+bGlzdFhzaXplWzVdID0KKwkJY3VyclNsaWNlLT5saXN0WHNpemVbMV0gKiAyOworfQorCisKKworc3RhdGljIHZvaWQgaW5pdF9saXN0c19pX3NsaWNlKHN0cnVjdCBTbGljZSAqY3VyclNsaWNlKQoreworCisjaWYgKE1WQ19FWFRFTlNJT05fRU5BQkxFKQorCWN1cnJTbGljZS0+bGlzdGludGVydmlld2lkeDAgPSAwOworCWN1cnJTbGljZS0+bGlzdGludGVydmlld2lkeDEgPSAwOworI2VuZGlmCisKKwljdXJyU2xpY2UtPmxpc3RYc2l6ZVswXSA9IDA7CisJY3VyclNsaWNlLT5saXN0WHNpemVbMV0gPSAwOworfQorCitzdGF0aWMgdm9pZCBpbml0X2xpc3RzX2Jfc2xpY2Uoc3RydWN0IFNsaWNlICpjdXJyU2xpY2UpCit7CisJc3RydWN0IFZpZGVvUGFyYW1ldGVycyAqcF9WaWQgPSBjdXJyU2xpY2UtPnBfVmlkOworCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIgPSBjdXJyU2xpY2UtPnBfRHBiOworCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gY29udGFpbmVyX29mKHBfRHBiLAorCQlzdHJ1Y3QgaDI2NF9kcGJfc3RydSwgbURQQik7CisKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgajsKKworCWludCBsaXN0MGlkeCA9IDA7CisJaW50IGxpc3QwaWR4XzEgPSAwOworCWludCBsaXN0bHRpZHggPSAwOworCisJc3RydWN0IEZyYW1lU3RvcmUgKipmc19saXN0MDsKKwlzdHJ1Y3QgRnJhbWVTdG9yZSAqKmZzX2xpc3QxOworCXN0cnVjdCBGcmFtZVN0b3JlICoqZnNfbGlzdGx0OworCisjaWYgKE1WQ19FWFRFTlNJT05fRU5BQkxFKQorCWN1cnJTbGljZS0+bGlzdGludGVydmlld2lkeDAgPSAwOworCWN1cnJTbGljZS0+bGlzdGludGVydmlld2lkeDEgPSAwOworI2VuZGlmCisKKwl7CisJCS8qIEItU2xpY2UgKi8KKwkJaWYgKGN1cnJTbGljZS0+c3RydWN0dXJlID09IEZSQU1FKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnJlZl9mcmFtZXNfaW5fYnVmZmVyOyBpKyspIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldID09IE5VTEwgfHwKKwkJCQkJcF9EcGItPmZzX3JlZltpXS0+ZnJhbWUgPT0gTlVMTCkgeworCQkJCQlwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyA9IF9fTElORV9fOworCQkJCQljb250aW51ZTsKKwkJCQl9CisjZW5kaWYKKwkJCQlpZiAoKHBfRHBiLT5mc19yZWZbaV0tPmlzX3VzZWQgPT0gMykgJiYKKwkJCQkJKChwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZS0+CisJCQkJCXVzZWRfZm9yX3JlZmVyZW5jZSkgJiYKKwkJCQkJKCFwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZS0+CisJCQkJCWlzX2xvbmdfdGVybSkpICYmCisJCQkJCShjdXJyU2xpY2UtPmZyYW1lcG9jID49CisJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmZyYW1lLT5wb2MpKSB7CisJCQkJCS8qICFLUyB1c2UgPj0gZm9yIGVycm9yCisJCQkJCSAqCWNvbmNlYWxtZW50CisJCQkJCSAqLworCQkJCQljdXJyU2xpY2UtPmxpc3RYWzBdW2xpc3QwaWR4KytdID0KKwkJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmZyYW1lOworCQkJCX0KKwkJCX0KKwkJCXFzb3J0KCh2b2lkICopY3VyclNsaWNlLT5saXN0WFswXSwgbGlzdDBpZHgsCisJCQkJc2l6ZW9mKHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKiksCisJCQkJY29tcGFyZV9waWNfYnlfcG9jX2Rlc2MpOworCisJCQkvKiBnZXQgdGhlIGJhY2t3YXJkIHJlZmVyZW5jZSBwaWN0dXJlCisJCQkgKiAgIChQT0M+Y3VycmVudCBQT0MpIGluIGxpc3QwOworCQkJICovCisJCQlsaXN0MGlkeF8xID0gbGlzdDBpZHg7CisJCQlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnJlZl9mcmFtZXNfaW5fYnVmZmVyOyBpKyspIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldID09IE5VTEwgfHwKKwkJCQkJcF9EcGItPmZzX3JlZltpXS0+ZnJhbWUgPT0gTlVMTCkgeworCQkJCQlwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyA9IF9fTElORV9fOworCQkJCQljb250aW51ZTsKKwkJCQl9CisjZW5kaWYKKwkJCQlpZiAoKHBfRHBiLT5mc19yZWZbaV0tPmlzX3VzZWQgPT0gMykgJiYKKwkJCQkJKChwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZS0+CisJCQkJCXVzZWRfZm9yX3JlZmVyZW5jZSkgJiYKKwkJCQkJKCFwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZS0+CisJCQkJCWlzX2xvbmdfdGVybSkpICYmCisJCQkJCShjdXJyU2xpY2UtPmZyYW1lcG9jIDwKKwkJCQkJcF9EcGItPmZzX3JlZltpXS0+ZnJhbWUtPnBvYykpIHsKKwkJCQkJY3VyclNsaWNlLT4KKwkJCQkJbGlzdFhbMF1bbGlzdDBpZHgrK10gPQorCQkJCQkJcF9EcGItPmZzX3JlZltpXS0+ZnJhbWU7CisJCQkJfQorCQkJfQorCQkJcXNvcnQoKHZvaWQgKikmY3VyclNsaWNlLT5saXN0WFswXVtsaXN0MGlkeF8xXSwKKwkJCQlsaXN0MGlkeCAtIGxpc3QwaWR4XzEsCisJCQkJc2l6ZW9mKHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKiksCisJCQkJY29tcGFyZV9waWNfYnlfcG9jX2FzYyk7CisKKwkJCWZvciAoaiA9IDA7IGogPCBsaXN0MGlkeF8xOyBqKyspIHsKKwkJCQljdXJyU2xpY2UtPgorCQkJCWxpc3RYWzFdW2xpc3QwaWR4IC0gbGlzdDBpZHhfMSArIGpdID0KKwkJCQkJY3VyclNsaWNlLT5saXN0WFswXVtqXTsKKwkJCX0KKwkJCWZvciAoaiA9IGxpc3QwaWR4XzE7IGogPCBsaXN0MGlkeDsgaisrKSB7CisJCQkJY3VyclNsaWNlLT5saXN0WFsxXVtqIC0gbGlzdDBpZHhfMV0gPQorCQkJCQljdXJyU2xpY2UtPmxpc3RYWzBdW2pdOworCQkJfQorCisJCQljdXJyU2xpY2UtPmxpc3RYc2l6ZVswXSA9IGN1cnJTbGljZS0+bGlzdFhzaXplWzFdID0KKwkJCQkoY2hhcikgbGlzdDBpZHg7CisJCQlDSEVDS19WQUxJRChjdXJyU2xpY2UtPmxpc3RYc2l6ZVswXSwgMCk7CisJCQlDSEVDS19WQUxJRChjdXJyU2xpY2UtPmxpc3RYc2l6ZVsxXSwgMSk7CisKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkibGlzdFhbMF0gKFBpY051bSk6ICIpOworCQkJZm9yIChpID0gMDsgaSA8IGN1cnJTbGljZS0+bGlzdFhzaXplWzBdOyBpKyspIHsKKwkJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsICIlZCAgIiwKKwkJCQljdXJyU2xpY2UtPmxpc3RYWzBdW2ldLT5waWNfbnVtKTsKKwkJCX0KKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwgIlxuIik7CisJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJImxpc3RYWzFdIChQaWNOdW0pOiAiKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBjdXJyU2xpY2UtPmxpc3RYc2l6ZVsxXTsgaSsrKSB7CisJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwgIiVkICAiLAorCQkJCQljdXJyU2xpY2UtPmxpc3RYWzFdW2ldLT5waWNfbnVtKTsKKwkJCX0KKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwgIlxuIik7CisJCQkvKiBkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCSAqCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSAqCSJjdXJyU2xpY2UtPmxpc3RYWzBdIGN1cnJQb2M9JWQgKFBvYyk6ICIsCisJCQkgKglwX1ZpZC0+ZnJhbWVwb2MpOworCQkJICogICBmb3IgKGk9MDsgaTxjdXJyU2xpY2UtPmxpc3RYc2l6ZVswXTsgaSsrKSB7CisJCQkgKglkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCSAqCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkgKgkJIiVkICAiLCBjdXJyU2xpY2UtPmxpc3RYWzBdW2ldLT5wb2MpOworCQkJICogICB9CisJCQkgKiAgIGRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJICoJUFJJTlRfRkxBR19EUEJfREVUQUlMLCAiXG4iKTsKKwkJCSAqICAgZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkgKglQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkgKgkiY3VyclNsaWNlLT5saXN0WFsxXSBjdXJyUG9jPSVkIChQb2MpOiAiLAorCQkJICoJcF9WaWQtPmZyYW1lcG9jKTsKKwkJCSAqICAgZm9yIChpPTA7IGk8Y3VyclNsaWNlLT5saXN0WHNpemVbMV07IGkrKykgeworCQkJICoJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkgKglQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkgKgkiJWQgICIsCisJCQkgKgljdXJyU2xpY2UtPmxpc3RYWzFdW2ldLT5wb2MpOworCQkJICogICB9CisJCQkgKiAgIGRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJICoJUFJJTlRfRkxBR19EUEJfREVUQUlMLCAiXG4iKTsKKwkJCSAqLworCisJCQkvKiBsb25nIHRlcm0gaGFuZGxpbmcgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+bHRyZWZfZnJhbWVzX2luX2J1ZmZlcjsgaSsrKSB7CisJCQkJaWYgKHBfRHBiLT5mc19sdHJlZltpXS0+aXNfdXNlZCA9PSAzKSB7CisJCQkJCWlmIChwX0RwYi0+ZnNfbHRyZWZbaV0tPmZyYW1lLT4KKwkJCQkJCWlzX2xvbmdfdGVybSkgeworCQkJCQkJY3VyclNsaWNlLT4KKwkJCQkJCWxpc3RYWzBdW2xpc3QwaWR4XSA9CisJCQkJCQlwX0RwYi0+ZnNfbHRyZWZbaV0tPmZyYW1lOworCQkJCQkJY3VyclNsaWNlLT4KKwkJCQkJCWxpc3RYWzFdW2xpc3QwaWR4KytdID0KKwkJCQkJCXBfRHBiLT5mc19sdHJlZltpXS0+ZnJhbWU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlxc29ydCgodm9pZCAqKSZjdXJyU2xpY2UtPgorCQkJCWxpc3RYWzBdWyhzaG9ydCkgY3VyclNsaWNlLT5saXN0WHNpemVbMF1dLAorCQkJCWxpc3QwaWR4IC0gY3VyclNsaWNlLT5saXN0WHNpemVbMF0sCisJCQkJc2l6ZW9mKHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKiksCisJCQkJY29tcGFyZV9waWNfYnlfbHRfcGljX251bV9hc2MpOworCQkJcXNvcnQoKHZvaWQgKikmY3VyclNsaWNlLT4KKwkJCQlsaXN0WFsxXVsoc2hvcnQpIGN1cnJTbGljZS0+bGlzdFhzaXplWzBdXSwKKwkJCQlsaXN0MGlkeCAtIGN1cnJTbGljZS0+bGlzdFhzaXplWzBdLAorCQkJCXNpemVvZihzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICopLAorCQkJCWNvbXBhcmVfcGljX2J5X2x0X3BpY19udW1fYXNjKTsKKwkJCWN1cnJTbGljZS0+bGlzdFhzaXplWzBdID0gY3VyclNsaWNlLT5saXN0WHNpemVbMV0gPQorCQkJCShjaGFyKSBsaXN0MGlkeDsKKwkJCUNIRUNLX1ZBTElEKGN1cnJTbGljZS0+bGlzdFhzaXplWzBdLCAwKTsKKwkJCUNIRUNLX1ZBTElEKGN1cnJTbGljZS0+bGlzdFhzaXplWzFdLCAxKTsKKwkJfSBlbHNlIHsKKyNpZiAwCisJCQlmc19saXN0MCA9IGNhbGxvYyhwX0RwYi0+c2l6ZSwKKwkJCQlzaXplb2Yoc3RydWN0IEZyYW1lU3RvcmUgKikpOworCQkJaWYgKGZzX2xpc3QwID09IE5VTEwpCisJCQkJbm9fbWVtX2V4aXQoImluaXRfbGlzdHM6IGZzX2xpc3QwIik7CisJCQlmc19saXN0MSA9IGNhbGxvYyhwX0RwYi0+c2l6ZSwKKwkJCQlzaXplb2Yoc3RydWN0IEZyYW1lU3RvcmUgKikpOworCQkJaWYgKGZzX2xpc3QxID09IE5VTEwpCisJCQkJbm9fbWVtX2V4aXQoImluaXRfbGlzdHM6IGZzX2xpc3QxIik7CisJCQlmc19saXN0bHQgPSBjYWxsb2MocF9EcGItPnNpemUsCisJCQkJc2l6ZW9mKHN0cnVjdCBGcmFtZVN0b3JlICopKTsKKwkJCWlmIChmc19saXN0bHQgPT0gTlVMTCkKKwkJCQlub19tZW1fZXhpdCgiaW5pdF9saXN0czogZnNfbGlzdGx0Iik7CisjZWxzZQorCQkJZnNfbGlzdDAgPSAmKHBfRHBiLT5mc19saXN0MFswXSk7CisJCQlmc19saXN0MSA9ICYocF9EcGItPmZzX2xpc3QxWzBdKTsKKwkJCWZzX2xpc3RsdCA9ICYocF9EcGItPmZzX2xpc3RsdFswXSk7CisKKyNlbmRpZgorCQkJY3VyclNsaWNlLT5saXN0WHNpemVbMF0gPSAwOworCQkJY3VyclNsaWNlLT5saXN0WHNpemVbMV0gPSAxOworCisJCQlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnJlZl9mcmFtZXNfaW5fYnVmZmVyOyBpKyspIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldID09IE5VTEwpIHsKKwkJCQkJcF9IMjY0X0RwYi0+ZHBiX2Vycm9yX2ZsYWcgPSBfX0xJTkVfXzsKKwkJCQkJY29udGludWU7CisJCQkJfQorI2VuZGlmCisJCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0tPmlzX3VzZWQpIHsKKwkJCQkJaWYgKGN1cnJTbGljZS0+VGhpc1BPQyA+PQorCQkJCQkJcF9EcGItPmZzX3JlZltpXS0+cG9jKSB7CisJCQkJCQlmc19saXN0MFtsaXN0MGlkeCsrXSA9CisJCQkJCQkJcF9EcGItPmZzX3JlZltpXTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXFzb3J0KCh2b2lkICopZnNfbGlzdDAsIGxpc3QwaWR4LAorCQkJCXNpemVvZihzdHJ1Y3QgRnJhbWVTdG9yZSAqKSwKKwkJCQljb21wYXJlX2ZzX2J5X3BvY19kZXNjKTsKKwkJCWxpc3QwaWR4XzEgPSBsaXN0MGlkeDsKKwkJCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+cmVmX2ZyYW1lc19pbl9idWZmZXI7IGkrKykgeworI2lmZGVmIEVSUk9SX0NIRUNLCisJCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0gPT0gTlVMTCkgeworCQkJCQlwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyA9IF9fTElORV9fOworCQkJCQljb250aW51ZTsKKwkJCQl9CisjZW5kaWYKKwkJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+aXNfdXNlZCkgeworCQkJCQlpZiAoY3VyclNsaWNlLT5UaGlzUE9DIDwKKwkJCQkJCXBfRHBiLT5mc19yZWZbaV0tPnBvYykgeworCQkJCQkJZnNfbGlzdDBbbGlzdDBpZHgrK10gPQorCQkJCQkJCXBfRHBiLT5mc19yZWZbaV07CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlxc29ydCgodm9pZCAqKSZmc19saXN0MFtsaXN0MGlkeF8xXSwKKwkJCQlsaXN0MGlkeCAtIGxpc3QwaWR4XzEsCisJCQkJc2l6ZW9mKHN0cnVjdCBGcmFtZVN0b3JlICopLAorCQkJCWNvbXBhcmVfZnNfYnlfcG9jX2FzYyk7CisKKwkJCWZvciAoaiA9IDA7IGogPCBsaXN0MGlkeF8xOyBqKyspIHsKKwkJCQlmc19saXN0MVtsaXN0MGlkeCAtIGxpc3QwaWR4XzEgKyBqXSA9CisJCQkJZnNfbGlzdDBbal07CisJCQl9CisJCQlmb3IgKGogPSBsaXN0MGlkeF8xOyBqIDwgbGlzdDBpZHg7IGorKykKKwkJCQlmc19saXN0MVtqIC0gbGlzdDBpZHhfMV0gPSBmc19saXN0MFtqXTsKKworCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJCSJmc19saXN0MCBjdXJyUG9jPSVkIChQb2MpOiAiLAorCQkJCWN1cnJTbGljZS0+VGhpc1BPQyk7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGlzdDBpZHg7IGkrKykgeworCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwgIiVkICAiLAorCQkJCWZzX2xpc3QwW2ldLT5wb2MpOworCQkJfQorCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLCAiXG4iKTsKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkiZnNfbGlzdDEgY3VyclBvYz0lZCAoUG9jKTogIiwKKwkJCQljdXJyU2xpY2UtPlRoaXNQT0MpOworCQkJZm9yIChpID0gMDsgaSA8IGxpc3QwaWR4OyBpKyspIHsKKwkJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLCAiJWQgICIsCisJCQkJCWZzX2xpc3QxW2ldLT5wb2MpOworCQkJfQorCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwgIlxuIik7CisKKwkJCWN1cnJTbGljZS0+bGlzdFhzaXplWzBdID0gMDsKKwkJCWN1cnJTbGljZS0+bGlzdFhzaXplWzFdID0gMDsKKwkJCWdlbl9waWNfbGlzdF9mcm9tX2ZyYW1lX2xpc3QoY3VyclNsaWNlLT5zdHJ1Y3R1cmUsCisJCQkJCQlmc19saXN0MCwgbGlzdDBpZHgsCisJCQkJCQljdXJyU2xpY2UtPmxpc3RYWzBdLAorCQkJCQkJJmN1cnJTbGljZS0+bGlzdFhzaXplWzBdLCAwKTsKKwkJCWdlbl9waWNfbGlzdF9mcm9tX2ZyYW1lX2xpc3QoY3VyclNsaWNlLT5zdHJ1Y3R1cmUsCisJCQkJCQlmc19saXN0MSwgbGlzdDBpZHgsCisJCQkJCQljdXJyU2xpY2UtPmxpc3RYWzFdLAorCQkJCQkJJmN1cnJTbGljZS0+bGlzdFhzaXplWzFdLCAwKTsKKworCQkJLyogZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkgKglQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkgKgkiY3VyclNsaWNlLT5saXN0WFswXSBjdXJyUG9jPSVkIChQb2MpOiAiLAorCQkJICoJcF9WaWQtPmZyYW1lcG9jKTsKKwkJCSAqICBmb3IgKGk9MDsgaTxjdXJyU2xpY2UtPmxpc3RYc2l6ZVswXTsgaSsrKSB7CisJCQkgKglkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCSAqCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwgIiVkICAiLAorCQkJICoJY3VyclNsaWNlLT5saXN0WFswXVtpXS0+cG9jKTsKKwkJCSAqICB9CisJCQkgKiAgZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkgKglQUklOVF9GTEFHX0RQQl9ERVRBSUwsICJcbiIpOworCQkJICovCisJCQkvKiBkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCSAqCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSAqCSJjdXJyU2xpY2UtPmxpc3RYWzFdIGN1cnJQb2M9JWQgKFBvYyk6ICIsCisJCQkgKglwX1ZpZC0+ZnJhbWVwb2MpOworCQkJICogIGZvciAoaT0wOyBpPGN1cnJTbGljZS0+bGlzdFhzaXplWzFdOyBpKyspIHsKKwkJCSAqCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJICoJUFJJTlRfRkxBR19EUEJfREVUQUlMLCAiJWQgICIsCisJCQkgKgljdXJyU2xpY2UtPmxpc3RYWzFdW2ldLT5wb2MpOworCQkJICogIH0KKwkJCSAqICBkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCSAqCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSAqCSJcbiIpOworCQkJICovCisKKwkJCS8qIGxvbmcgdGVybSBoYW5kbGluZyAqLworCQkJZm9yIChpID0gMDsgaSA8IHBfRHBiLT5sdHJlZl9mcmFtZXNfaW5fYnVmZmVyOyBpKyspCisJCQkJZnNfbGlzdGx0W2xpc3RsdGlkeCsrXSA9IHBfRHBiLT5mc19sdHJlZltpXTsKKworCQkJcXNvcnQoKHZvaWQgKilmc19saXN0bHQsIGxpc3RsdGlkeCwKKwkJCQlzaXplb2Yoc3RydWN0IEZyYW1lU3RvcmUgKiksCisJCQkJY29tcGFyZV9mc19ieV9sdF9waWNfaWR4X2FzYyk7CisKKwkJCWdlbl9waWNfbGlzdF9mcm9tX2ZyYW1lX2xpc3QoY3VyclNsaWNlLT5zdHJ1Y3R1cmUsCisJCQkJZnNfbGlzdGx0LCBsaXN0bHRpZHgsCisJCQkJY3VyclNsaWNlLT5saXN0WFswXSwKKwkJCQkmY3VyclNsaWNlLT5saXN0WHNpemVbMF0sIDEpOworCQkJZ2VuX3BpY19saXN0X2Zyb21fZnJhbWVfbGlzdChjdXJyU2xpY2UtPnN0cnVjdHVyZSwKKwkJCQlmc19saXN0bHQsIGxpc3RsdGlkeCwKKwkJCQljdXJyU2xpY2UtPmxpc3RYWzFdLAorCQkJCSZjdXJyU2xpY2UtPmxpc3RYc2l6ZVsxXSwgMSk7CisKKwkJCS8qIGZyZWUoZnNfbGlzdDApOyAqLworCQkJLyogZnJlZShmc19saXN0MSk7ICovCisJCQkvKiBmcmVlKGZzX2xpc3RsdCk7ICovCisJCX0KKwl9CisKKwlpZiAoKGN1cnJTbGljZS0+bGlzdFhzaXplWzBdID09IGN1cnJTbGljZS0+bGlzdFhzaXplWzFdKSAmJgorCSAgICAoY3VyclNsaWNlLT5saXN0WHNpemVbMF0gPiAxKSkgeworCQkvKiBjaGVjayBpZiBsaXN0cyBhcmUgaWRlbnRpY2FsLAorCQkgKmlmIHllcyBzd2FwIGZpcnN0IHR3byBlbGVtZW50cyBvZiBjdXJyU2xpY2UtPmxpc3RYWzFdCisJCSAqLworCQlpbnQgZGlmZiA9IDA7CisKKwkJZm9yIChqID0gMDsgaiA8IGN1cnJTbGljZS0+bGlzdFhzaXplWzBdOyBqKyspIHsKKwkJCWlmIChjdXJyU2xpY2UtPmxpc3RYWzBdW2pdICE9CisJCQkJY3VyclNsaWNlLT5saXN0WFsxXVtqXSkgeworCQkJCWRpZmYgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghZGlmZikgeworCQkJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqdG1wX3MgPQorCQkJCWN1cnJTbGljZS0+bGlzdFhbMV1bMF07CisJCQljdXJyU2xpY2UtPmxpc3RYWzFdWzBdID0gY3VyclNsaWNlLT5saXN0WFsxXVsxXTsKKwkJCWN1cnJTbGljZS0+bGlzdFhbMV1bMV0gPSB0bXBfczsKKwkJfQorCX0KKworCS8qIHNldCBtYXggc2l6ZSAqLworCWN1cnJTbGljZS0+bGlzdFhzaXplWzBdID0gKGNoYXIpIGltaW4oY3VyclNsaWNlLT5saXN0WHNpemVbMF0sCisJCWN1cnJTbGljZS0+bnVtX3JlZl9pZHhfYWN0aXZlW0xJU1RfMF0pOworCWN1cnJTbGljZS0+bGlzdFhzaXplWzFdID0gKGNoYXIpIGltaW4oY3VyclNsaWNlLT5saXN0WHNpemVbMV0sCisJCWN1cnJTbGljZS0+bnVtX3JlZl9pZHhfYWN0aXZlW0xJU1RfMV0pOworCUNIRUNLX1ZBTElEKGN1cnJTbGljZS0+bGlzdFhzaXplWzBdLCAwKTsKKwlDSEVDS19WQUxJRChjdXJyU2xpY2UtPmxpc3RYc2l6ZVsxXSwgMSk7CisKKwkvKiBzZXQgdGhlIHVudXNlZCBsaXN0IGVudHJpZXMgdG8gTlVMTCAqLworCWZvciAoaSA9IGN1cnJTbGljZS0+bGlzdFhzaXplWzBdOyBpIDwgKE1BWF9MSVNUX1NJWkUpOyBpKyspCisJCWN1cnJTbGljZS0+bGlzdFhbMF1baV0gPSBwX1ZpZC0+bm9fcmVmZXJlbmNlX3BpY3R1cmU7CisJZm9yIChpID0gY3VyclNsaWNlLT5saXN0WHNpemVbMV07IGkgPCAoTUFYX0xJU1RfU0laRSk7IGkrKykKKwkJY3VyclNsaWNlLT5saXN0WFsxXVtpXSA9IHBfVmlkLT5ub19yZWZlcmVuY2VfcGljdHVyZTsKKworI2lmIFBSSU5UUkVGTElTVAorI2lmIChNVkNfRVhURU5TSU9OX0VOQUJMRSkKKwkvKiBwcmludCBvdXQgZm9yIGgyNjRfZGVidWdfZmxhZyBwdXJwb3NlICovCisJaWYgKChwX1ZpZC0+cHJvZmlsZV9pZGMgPT0gTVZDX0hJR0ggfHwKKwkgICAgcF9WaWQtPnByb2ZpbGVfaWRjID09IFNURVJFT19ISUdIKSAmJgorCSAgICBjdXJyU2xpY2UtPmN1cnJlbnRfc2xpY2VfbnIgPT0gMCkgeworCQlpZiAoKGN1cnJTbGljZS0+bGlzdFhzaXplWzBdID4gMCkgfHwKKwkJICAgIChjdXJyU2xpY2UtPmxpc3RYc2l6ZVsxXSA+IDApKQorCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLCAiXG4iKTsKKwkJaWYgKGN1cnJTbGljZS0+bGlzdFhzaXplWzBdID4gMCkgeworCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJCSIgKiogKEN1clZpZXdJRDolZCAlZCkgJXMgUmVmIFBpYyBMaXN0IDAgKioqKlxuIiwKKwkJCQljdXJyU2xpY2UtPnZpZXdfaWQsCisJCQkJY3VyclNsaWNlLT5UaGlzUE9DLAorCQkJCWN1cnJTbGljZS0+c3RydWN0dXJlID09IEZSQU1FID8gIkZSTSIgOgorCQkJCShjdXJyU2xpY2UtPnN0cnVjdHVyZSA9PSBUT1BfRklFTEQgPworCQkJCSJUT1AiIDogIkJPVCIpKTsKKwkJCWZvciAoaSA9IDA7IGkgPCAodW5zaWduZWQgaW50KShjdXJyU2xpY2UtPgorCQkJCWxpc3RYc2l6ZVswXSk7IGkrKykgeyAvKiByZWYgbGlzdCAwICovCisJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkJIiAgICUyZCAtPiBQT0M6ICU0ZCBQaWNOdW06ICU0ZCBWaWV3SUQ6ICVkXG4iLAorCQkJCQlpLAorCQkJCQljdXJyU2xpY2UtPmxpc3RYWzBdW2ldLT5wb2MsCisJCQkJCWN1cnJTbGljZS0+bGlzdFhbMF1baV0tPnBpY19udW0sCisJCQkJCWN1cnJTbGljZS0+bGlzdFhbMF1baV0tPnZpZXdfaWQpOworCQkJfQorCQl9CisJCWlmIChjdXJyU2xpY2UtPmxpc3RYc2l6ZVsxXSA+IDApIHsKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkiICoqIChDdXJWaWV3SUQ6JWQgJWQpICVzIFJlZiBQaWMgTGlzdCAxICoqKipcbiIsCisJCQkJY3VyclNsaWNlLT52aWV3X2lkLAorCQkJCWN1cnJTbGljZS0+VGhpc1BPQywKKwkJCQljdXJyU2xpY2UtPnN0cnVjdHVyZSA9PSBGUkFNRSA/ICJGUk0iIDoKKwkJCQkoY3VyclNsaWNlLT5zdHJ1Y3R1cmUgPT0gVE9QX0ZJRUxEID8gIlRPUCIgOgorCQkJCSJCT1QiKSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgKHVuc2lnbmVkIGludCkoY3VyclNsaWNlLT4KKwkJCQlsaXN0WHNpemVbMV0pOyBpKyspIHsgLyogcmVmIGxpc3QgMSAqLworCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJCSIgICAlMmQgLT4gUE9DOiAlNGQgUGljTnVtOiAlNGQJVmlld0lEOiAlZFxuIiwKKwkJCQkJaSwKKwkJCQkJY3VyclNsaWNlLT5saXN0WFsxXVtpXS0+cG9jLAorCQkJCQljdXJyU2xpY2UtPmxpc3RYWzFdW2ldLT5waWNfbnVtLAorCQkJCQljdXJyU2xpY2UtPmxpc3RYWzFdW2ldLT52aWV3X2lkKTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorI2VuZGlmCit9CisKK3N0YXRpYyBzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpnZXRfc2hvcnRfdGVybV9waWMoc3RydWN0IFNsaWNlICpjdXJyU2xpY2UsCisJCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIsIGludCBwaWNOdW0pCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSBjb250YWluZXJfb2YocF9EcGIsCisJCXN0cnVjdCBoMjY0X2RwYl9zdHJ1LCBtRFBCKTsKKwlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnJlZl9mcmFtZXNfaW5fYnVmZmVyOyBpKyspIHsKKwkJaWYgKGN1cnJTbGljZS0+c3RydWN0dXJlID09IEZSQU1FKSB7CisjaWZkZWYgRVJST1JfQ0hFQ0sKKwkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldID09IE5VTEwpIHsKKwkJCQlwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyA9IF9fTElORV9fOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmCisJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+aXNfcmVmZXJlbmNlID09IDMpIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZSA9PSBOVUxMKSB7CisJCQkJCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnID0gX19MSU5FX187CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKyNlbmRpZgorCQkJCWlmICgoIXBfRHBiLT5mc19yZWZbaV0tPmZyYW1lLT4KKwkJCQkJaXNfbG9uZ190ZXJtKSAmJgorCQkJCSAgICAocF9EcGItPmZzX3JlZltpXS0+ZnJhbWUtPgorCQkJCQlwaWNfbnVtID09IHBpY051bSkpCisJCQkJCXJldHVybiBwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZTsKKwkJCX0KKwkJfSBlbHNlIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0gPT0gTlVMTCkgeworCQkJCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnID0gX19MSU5FX187CisJCQkJY29udGludWU7CisJCQl9CisjZW5kaWYKKwkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldLT5pc19yZWZlcmVuY2UgJiAxKSB7CisjaWZkZWYgRVJST1JfQ0hFQ0sKKwkJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkID09IE5VTEwpIHsKKwkJCQkJcF9IMjY0X0RwYi0+ZHBiX2Vycm9yX2ZsYWcgPSBfX0xJTkVfXzsKKwkJCQkJY29udGludWU7CisJCQkJfQorI2VuZGlmCisJCQkJaWYgKCghcF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkLT4KKwkJCQkJaXNfbG9uZ190ZXJtKSAmJgorCQkJCSAgICAocF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkLT4KKwkJCQkJcGljX251bSA9PSBwaWNOdW0pKQorCQkJCQlyZXR1cm4gcF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkOworCQkJfQorCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0tPmlzX3JlZmVyZW5jZSAmIDIpIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldLT5ib3R0b21fZmllbGQgPT0gTlVMTCkgeworCQkJCQlwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyA9IF9fTElORV9fOworCQkJCQljb250aW51ZTsKKwkJCQl9CisjZW5kaWYKKwkJCQlpZiAoKCFwX0RwYi0+ZnNfcmVmW2ldLT5ib3R0b21fZmllbGQtPgorCQkJCQlpc19sb25nX3Rlcm0pICYmCisJCQkJICAgIChwX0RwYi0+ZnNfcmVmW2ldLT5ib3R0b21fZmllbGQtPgorCQkJCQlwaWNfbnVtID09IHBpY051bSkpCisJCQkJCXJldHVybiBwX0RwYi0+ZnNfcmVmW2ldLT5ib3R0b21fZmllbGQ7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gY3VyclNsaWNlLT5wX1ZpZC0+bm9fcmVmZXJlbmNlX3BpY3R1cmU7Cit9CisKKworc3RhdGljIHZvaWQgcmVvcmRlcl9zaG9ydF90ZXJtKHN0cnVjdCBTbGljZSAqY3VyclNsaWNlLCBpbnQgY3VyX2xpc3QsCisJCQkJaW50IG51bV9yZWZfaWR4X2xYX2FjdGl2ZV9taW51czEsCisJCQkJaW50IHBpY051bUxYLCBpbnQgKnJlZklkeExYKQoreworCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gY29udGFpbmVyX29mKGN1cnJTbGljZS0+cF9WaWQsCisJCQkJCXN0cnVjdCBoMjY0X2RwYl9zdHJ1LCBtVmlkZW8pOworCisJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqKlJlZlBpY0xpc3RYID0gY3VyclNsaWNlLT5saXN0WFtjdXJfbGlzdF07CisJaW50IGNJZHgsIG5JZHg7CisKKwlzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpwaWNMWDsKKworCXBpY0xYID0gZ2V0X3Nob3J0X3Rlcm1fcGljKGN1cnJTbGljZSwgY3VyclNsaWNlLT5wX0RwYiwgcGljTnVtTFgpOworCisJZm9yIChjSWR4ID0gbnVtX3JlZl9pZHhfbFhfYWN0aXZlX21pbnVzMSArIDE7IGNJZHggPiAqcmVmSWR4TFg7CisJCWNJZHgtLSkgeworCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJIiVzOiBSZWZQaWNMaXN0WFsgJWQgXSA9IFJlZlBpY0xpc3RYWyAlZCBdXG4iLAorCQkJX19mdW5jX18sIGNJZHgsIGNJZHggLSAxKTsKKwkJUmVmUGljTGlzdFhbY0lkeF0gPSBSZWZQaWNMaXN0WFtjSWR4IC0gMV07CisJfQorCisJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJIiVzOiBSZWZQaWNMaXN0WFsgJWQgXSA9IHBpYyAleCAoJWQpXG4iLCBfX2Z1bmNfXywKKwkJKnJlZklkeExYLCBwaWNMWCwgcGljTnVtTFgpOworCisJUmVmUGljTGlzdFhbKCpyZWZJZHhMWCkrK10gPSBwaWNMWDsKKworCW5JZHggPSAqcmVmSWR4TFg7CisKKwlmb3IgKGNJZHggPSAqcmVmSWR4TFg7IGNJZHggPD0gbnVtX3JlZl9pZHhfbFhfYWN0aXZlX21pbnVzMSArIDE7CisJCWNJZHgrKykgeworCQlpZiAoUmVmUGljTGlzdFhbY0lkeF0pCisJCQlpZiAoKFJlZlBpY0xpc3RYW2NJZHhdLT5pc19sb25nX3Rlcm0pIHx8CisJCQkgICAgKFJlZlBpY0xpc3RYW2NJZHhdLT5waWNfbnVtICE9IHBpY051bUxYKSkgeworCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJCSIlczogUmVmUGljTGlzdFhbICVkIF0gPSBSZWZQaWNMaXN0WFsgJWQgXVxuIiwKKwkJCQkJX19mdW5jX18sIG5JZHgsIGNJZHgpOworCQkJCVJlZlBpY0xpc3RYW25JZHgrK10gPSBSZWZQaWNMaXN0WFtjSWR4XTsKKwkJCX0KKwl9Cit9CisKKworc3RhdGljIHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKmdldF9sb25nX3Rlcm1fcGljKHN0cnVjdCBTbGljZSAqY3VyclNsaWNlLAorCQlzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiLCBpbnQgTG9uZ3Rlcm1QaWNOdW0pCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPmx0cmVmX2ZyYW1lc19pbl9idWZmZXI7IGkrKykgeworCQlpZiAoY3VyclNsaWNlLT5zdHJ1Y3R1cmUgPT0gRlJBTUUpIHsKKwkJCWlmIChwX0RwYi0+ZnNfbHRyZWZbaV0tPmlzX3JlZmVyZW5jZSA9PSAzKQorCQkJCWlmICgocF9EcGItPmZzX2x0cmVmW2ldLT5mcmFtZSkgJiYKKwkJCQkJKHBfRHBiLT5mc19sdHJlZltpXS0+ZnJhbWUtPgorCQkJCQlpc19sb25nX3Rlcm0pICYmCisJCQkJICAgIChwX0RwYi0+ZnNfbHRyZWZbaV0tPmZyYW1lLT4KKwkJCQkJbG9uZ190ZXJtX3BpY19udW0gPT0KKwkJCQkJTG9uZ3Rlcm1QaWNOdW0pKQorCQkJCQlyZXR1cm4gcF9EcGItPmZzX2x0cmVmW2ldLT5mcmFtZTsKKwkJfSBlbHNlIHsKKwkJCWlmIChwX0RwYi0+ZnNfbHRyZWZbaV0tPmlzX3JlZmVyZW5jZSAmIDEpCisJCQkJaWYgKChwX0RwYi0+ZnNfbHRyZWZbaV0tPnRvcF9maWVsZCkgJiYKKwkJCQkJKHBfRHBiLT5mc19sdHJlZltpXS0+dG9wX2ZpZWxkLT4KKwkJCQkJaXNfbG9uZ190ZXJtKSAmJgorCQkJCSAgICAocF9EcGItPmZzX2x0cmVmW2ldLT50b3BfZmllbGQtPgorCQkJCQlsb25nX3Rlcm1fcGljX251bSA9PSBMb25ndGVybVBpY051bSkpCisJCQkJCXJldHVybiBwX0RwYi0+ZnNfbHRyZWZbaV0tPnRvcF9maWVsZDsKKworCQkJaWYgKHBfRHBiLT5mc19sdHJlZltpXS0+aXNfcmVmZXJlbmNlICYgMikKKwkJCQlpZiAoKHBfRHBiLT5mc19sdHJlZltpXS0+Ym90dG9tX2ZpZWxkKSAmJgorCQkJCQkocF9EcGItPmZzX2x0cmVmW2ldLT5ib3R0b21fZmllbGQtPgorCQkJCQlpc19sb25nX3Rlcm0pICYmCisJCQkJICAgIChwX0RwYi0+ZnNfbHRyZWZbaV0tPmJvdHRvbV9maWVsZC0+CisJCQkJCWxvbmdfdGVybV9waWNfbnVtID09CisJCQkJCUxvbmd0ZXJtUGljTnVtKSkKKwkJCQkJcmV0dXJuIHBfRHBiLT5mc19sdHJlZltpXS0+CisJCQkJCQlib3R0b21fZmllbGQ7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogXGJyaWVmCisgKiAgICBSZW9yZGVyaW5nIHByb2Nlc3MgZm9yIGxvbmctdGVybSByZWZlcmVuY2UgcGljdHVyZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyB2b2lkIHJlb3JkZXJfbG9uZ190ZXJtKHN0cnVjdCBTbGljZSAqY3VyclNsaWNlLAorCQkJCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKipSZWZQaWNMaXN0WCwKKwkJCQlpbnQgbnVtX3JlZl9pZHhfbFhfYWN0aXZlX21pbnVzMSwKKwkJCSAgICAgIGludCBMb25nVGVybVBpY051bSwgaW50ICpyZWZJZHhMWCkKK3sKKwlpbnQgY0lkeCwgbklkeDsKKworCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnBpY0xYOworCisJcGljTFggPSBnZXRfbG9uZ190ZXJtX3BpYyhjdXJyU2xpY2UsIGN1cnJTbGljZS0+cF9EcGIsIExvbmdUZXJtUGljTnVtKTsKKworCWZvciAoY0lkeCA9IG51bV9yZWZfaWR4X2xYX2FjdGl2ZV9taW51czEgKyAxOyBjSWR4ID4gKnJlZklkeExYOyBjSWR4LS0pCisJCVJlZlBpY0xpc3RYW2NJZHhdID0gUmVmUGljTGlzdFhbY0lkeCAtIDFdOworCisJUmVmUGljTGlzdFhbKCpyZWZJZHhMWCkrK10gPSBwaWNMWDsKKworCW5JZHggPSAqcmVmSWR4TFg7CisKKwlmb3IgKGNJZHggPSAqcmVmSWR4TFg7IGNJZHggPD0gbnVtX3JlZl9pZHhfbFhfYWN0aXZlX21pbnVzMSArIDE7CisJCWNJZHgrKykgeworCQlpZiAoUmVmUGljTGlzdFhbY0lkeF0pIHsKKwkJCWlmICgoIVJlZlBpY0xpc3RYW2NJZHhdLT5pc19sb25nX3Rlcm0pIHx8CisJCQkgICAgKFJlZlBpY0xpc3RYW2NJZHhdLT5sb25nX3Rlcm1fcGljX251bSAhPQorCQkJCUxvbmdUZXJtUGljTnVtKSkKKwkJCQlSZWZQaWNMaXN0WFtuSWR4KytdID0gUmVmUGljTGlzdFhbY0lkeF07CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlb3JkZXJfcmVmX3BpY19saXN0KHN0cnVjdCBTbGljZSAqY3VyclNsaWNlLCBpbnQgY3VyX2xpc3QpCit7CisJaW50ICptb2RpZmljYXRpb25fb2ZfcGljX251bXNfaWRjID0KKwkJY3VyclNsaWNlLT5tb2RpZmljYXRpb25fb2ZfcGljX251bXNfaWRjW2N1cl9saXN0XTsKKwlpbnQgKmFic19kaWZmX3BpY19udW1fbWludXMxID0KKwkJY3VyclNsaWNlLT5hYnNfZGlmZl9waWNfbnVtX21pbnVzMVtjdXJfbGlzdF07CisJaW50ICpsb25nX3Rlcm1fcGljX2lkeCA9IGN1cnJTbGljZS0+bG9uZ190ZXJtX3BpY19pZHhbY3VyX2xpc3RdOworCWludCBudW1fcmVmX2lkeF9sWF9hY3RpdmVfbWludXMxID0KKwkJY3VyclNsaWNlLT5udW1fcmVmX2lkeF9hY3RpdmVbY3VyX2xpc3RdIC0gMTsKKworCXN0cnVjdCBWaWRlb1BhcmFtZXRlcnMgKnBfVmlkID0gY3VyclNsaWNlLT5wX1ZpZDsKKwlpbnQgaTsKKworCWludCBtYXhQaWNOdW0sIGN1cnJQaWNOdW0sIHBpY051bUxYTm9XcmFwLCBwaWNOdW1MWFByZWQsIHBpY051bUxYOworCWludCByZWZJZHhMWCA9IDA7CisKKwlpZiAoY3VyclNsaWNlLT5zdHJ1Y3R1cmUgPT0gRlJBTUUpIHsKKwkJbWF4UGljTnVtICA9IHBfVmlkLT5tYXhfZnJhbWVfbnVtOworCQljdXJyUGljTnVtID0gY3VyclNsaWNlLT5mcmFtZV9udW07CisJfSBlbHNlIHsKKwkJbWF4UGljTnVtICA9IDIgKiBwX1ZpZC0+bWF4X2ZyYW1lX251bTsKKwkJY3VyclBpY051bSA9IDIgKiBjdXJyU2xpY2UtPmZyYW1lX251bSArIDE7CisJfQorCisJcGljTnVtTFhQcmVkID0gY3VyclBpY051bTsKKworCWZvciAoaSA9IDA7ICBpIDwgUkVPUkRFUklOR19DT01NQU5EX01BWF9TSVpFICYmCisJCW1vZGlmaWNhdGlvbl9vZl9waWNfbnVtc19pZGNbaV0gIT0gMzsgaSsrKSB7CisJCWlmIChtb2RpZmljYXRpb25fb2ZfcGljX251bXNfaWRjW2ldID4gMykgeworCQkJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPQorCQkJY29udGFpbmVyX29mKHBfVmlkLCBzdHJ1Y3QgaDI2NF9kcGJfc3RydSwgbVZpZGVvKTsKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRVJST1IsCisJCQkJImVycm9yLCBJbnZhbGlkIG1vZGlmaWNhdGlvbl9vZl9waWNfbnVtc19pZGMgY29tbWFuZFxuIik7CisJCQkvKmgyNjRfZGVidWdfZmxhZyA9IDB4MWY7Ki8KKwkJCWJyZWFrOworCQl9CisJCWlmIChtb2RpZmljYXRpb25fb2ZfcGljX251bXNfaWRjW2ldIDwgMikgeworCQkJaWYgKG1vZGlmaWNhdGlvbl9vZl9waWNfbnVtc19pZGNbaV0gPT0gMCkgeworCQkJCWlmIChwaWNOdW1MWFByZWQgLSAoYWJzX2RpZmZfcGljX251bV9taW51czFbaV0KKwkJCQkJKyAxKSA8IDApCisJCQkJCXBpY051bUxYTm9XcmFwID0gcGljTnVtTFhQcmVkIC0KKwkJCQkJKGFic19kaWZmX3BpY19udW1fbWludXMxW2ldICsgMSkgKworCQkJCQltYXhQaWNOdW07CisJCQkJZWxzZQorCQkJCQlwaWNOdW1MWE5vV3JhcCA9IHBpY051bUxYUHJlZCAtCisJCQkJCShhYnNfZGlmZl9waWNfbnVtX21pbnVzMVtpXSArIDEpOworCQkJfSBlbHNlIHsgLyogKG1vZGlmaWNhdGlvbl9vZl9waWNfbnVtc19pZGNbaV0gPT0gMSkgKi8KKwkJCQlpZiAocGljTnVtTFhQcmVkICsgKGFic19kaWZmX3BpY19udW1fbWludXMxW2ldCisJCQkJCSsgMSkgID49ICBtYXhQaWNOdW0pCisJCQkJCXBpY051bUxYTm9XcmFwID0gcGljTnVtTFhQcmVkICsKKwkJCQkJKGFic19kaWZmX3BpY19udW1fbWludXMxW2ldICsgMSkgLQorCQkJCQltYXhQaWNOdW07CisJCQkJZWxzZQorCQkJCQlwaWNOdW1MWE5vV3JhcCA9IHBpY051bUxYUHJlZCArCisJCQkJCShhYnNfZGlmZl9waWNfbnVtX21pbnVzMVtpXSArIDEpOworCQkJfQorCQkJcGljTnVtTFhQcmVkID0gcGljTnVtTFhOb1dyYXA7CisKKwkJCWlmIChwaWNOdW1MWE5vV3JhcCA+IGN1cnJQaWNOdW0pCisJCQkJcGljTnVtTFggPSBwaWNOdW1MWE5vV3JhcCAtIG1heFBpY051bTsKKwkJCWVsc2UKKwkJCQlwaWNOdW1MWCA9IHBpY051bUxYTm9XcmFwOworCisjaWYgKE1WQ19FWFRFTlNJT05fRU5BQkxFKQorCQkJcmVvcmRlcl9zaG9ydF90ZXJtKGN1cnJTbGljZSwgY3VyX2xpc3QsCisJCQkJCW51bV9yZWZfaWR4X2xYX2FjdGl2ZV9taW51czEsIHBpY051bUxYLAorCQkJCQkmcmVmSWR4TFgsIC0xKTsKKyNlbHNlCisJCQlyZW9yZGVyX3Nob3J0X3Rlcm0oY3VyclNsaWNlLCBjdXJfbGlzdCwKKwkJCQkJbnVtX3JlZl9pZHhfbFhfYWN0aXZlX21pbnVzMSwgcGljTnVtTFgsCisJCQkJCSZyZWZJZHhMWCk7CisjZW5kaWYKKwkJfSBlbHNlIHsgLyogKG1vZGlmaWNhdGlvbl9vZl9waWNfbnVtc19pZGNbaV0gPT0gMikgKi8KKyNpZiAoTVZDX0VYVEVOU0lPTl9FTkFCTEUpCisJCQlyZW9yZGVyX2xvbmdfdGVybShjdXJyU2xpY2UsIGN1cnJTbGljZS0+bGlzdFhbY3VyX2xpc3RdLAorCQkJCQludW1fcmVmX2lkeF9sWF9hY3RpdmVfbWludXMxLAorCQkJCQlsb25nX3Rlcm1fcGljX2lkeFtpXSwgJnJlZklkeExYLCAtMSk7CisjZWxzZQorCQkJcmVvcmRlcl9sb25nX3Rlcm0oY3VyclNsaWNlLCBjdXJyU2xpY2UtPmxpc3RYW2N1cl9saXN0XSwKKwkJCQkJbnVtX3JlZl9pZHhfbFhfYWN0aXZlX21pbnVzMSwKKwkJCQkJbG9uZ190ZXJtX3BpY19pZHhbaV0sICZyZWZJZHhMWCk7CisjZW5kaWYKKwkJfQorCisJfQorCS8qIHRoYXQncyBhIGRlZmluaXRpb24gKi8KKwljdXJyU2xpY2UtPmxpc3RYc2l6ZVtjdXJfbGlzdF0gPQorCQkoY2hhcikobnVtX3JlZl9pZHhfbFhfYWN0aXZlX21pbnVzMSArIDEpOworfQorCitzdGF0aWMgdm9pZCByZW9yZGVyX2xpc3RzKHN0cnVjdCBTbGljZSAqY3VyclNsaWNlKQoreworCXN0cnVjdCBWaWRlb1BhcmFtZXRlcnMgKnBfVmlkID0gY3VyclNsaWNlLT5wX1ZpZDsKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9IGNvbnRhaW5lcl9vZihwX1ZpZCwKKwkJc3RydWN0IGgyNjRfZHBiX3N0cnUsIG1WaWRlbyk7CisJaW50IGk7CisKKwlpZiAoKGN1cnJTbGljZS0+c2xpY2VfdHlwZSAhPSBJX1NMSUNFKSAmJgorCQkoY3VyclNsaWNlLT5zbGljZV90eXBlICE9IFNJX1NMSUNFKSkgeworCQlpZiAoY3VyclNsaWNlLT5yZWZfcGljX2xpc3RfcmVvcmRlcmluZ19mbGFnW0xJU1RfMF0pCisJCQlyZW9yZGVyX3JlZl9waWNfbGlzdChjdXJyU2xpY2UsIExJU1RfMCk7CisJCWlmIChwX1ZpZC0+bm9fcmVmZXJlbmNlX3BpY3R1cmUgPT0KKwkJICAgIGN1cnJTbGljZS0+CisJCQlsaXN0WFswXVtjdXJyU2xpY2UtPm51bV9yZWZfaWR4X2FjdGl2ZVtMSVNUXzBdIC0gMV0pIHsKKwkJCWlmIChwX1ZpZC0+bm9uX2NvbmZvcm1pbmdfc3RyZWFtKQorCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJCSJSZWZQaWNMaXN0MFsgJWQgXSBpcyBlcXVhbCB0byAnbm8gcmVmZXJlbmNlIHBpY3R1cmUnXG4iLAorCQkJCQljdXJyU2xpY2UtPgorCQkJCQludW1fcmVmX2lkeF9hY3RpdmVbTElTVF8wXSAtIDEpOworCQkJZWxzZQorCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJCSJSZWZQaWNMaXN0MCBbIG51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgXSBpcyBlcXVhbCB0byAnbm8gcmVmZXJlbmNlIHBpY3R1cmUnLCBpbnZhbGlkIGJpdHN0cmVhbSAlZFxuIiwKKwkJCQkJNTAwKTsKKwkJfQorCQkvKiB0aGF0J3MgYSBkZWZpbml0aW9uICovCisJCWN1cnJTbGljZS0+bGlzdFhzaXplWzBdID0KKwkJCShjaGFyKSBpbWluKGN1cnJTbGljZS0+bGlzdFhzaXplWzBdLAorCQkJY3VyclNsaWNlLT5udW1fcmVmX2lkeF9hY3RpdmVbTElTVF8wXSk7CisJCUNIRUNLX1ZBTElEKGN1cnJTbGljZS0+bGlzdFhzaXplWzBdLCAwKTsKKwkJaWYgKGgyNjRfZGVidWdfZmxhZyAmIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCkgeworCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJCSJsaXN0WFswXSByZW9yZGVyIChQaWNOdW0pOiAiKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBjdXJyU2xpY2UtPmxpc3RYc2l6ZVswXTsgaSsrKSB7CisJCQkJZHBiX3ByaW50X2NvbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLCAiJWQgICIsCisJCQkJCWN1cnJTbGljZS0+bGlzdFhbMF1baV0tPnBpY19udW0pOworCQkJfQorCQkJZHBiX3ByaW50X2NvbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsICJcbiIpOworCQl9CisJfQorCisJaWYgKGN1cnJTbGljZS0+c2xpY2VfdHlwZSA9PSBCX1NMSUNFKSB7CisJCWlmIChjdXJyU2xpY2UtPnJlZl9waWNfbGlzdF9yZW9yZGVyaW5nX2ZsYWdbTElTVF8xXSkKKwkJCXJlb3JkZXJfcmVmX3BpY19saXN0KGN1cnJTbGljZSwgTElTVF8xKTsKKwkJaWYgKHBfVmlkLT5ub19yZWZlcmVuY2VfcGljdHVyZSA9PQorCQkgICAgY3VyclNsaWNlLT5saXN0WFsxXVtjdXJyU2xpY2UtPgorCQkJbnVtX3JlZl9pZHhfYWN0aXZlW0xJU1RfMV0gLSAxXSkgeworCQkJaWYgKHBfVmlkLT5ub25fY29uZm9ybWluZ19zdHJlYW0pCisJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkJIlJlZlBpY0xpc3QxWyAlZCBdIGlzIGVxdWFsIHRvICdubyByZWZlcmVuY2UgcGljdHVyZSdcbiIsCisJCQkJCWN1cnJTbGljZS0+CisJCQkJCW51bV9yZWZfaWR4X2FjdGl2ZVtMSVNUXzFdIC0gMSk7CisJCQllbHNlCisJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkJIlJlZlBpY0xpc3QxIFsgbnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSBdIGlzIGVxdWFsIHRvICdubyByZWZlcmVuY2UgcGljdHVyZScsIGludmFsaWQgYml0c3RyZWFtICVkXG4iLAorCQkJCQk1MDApOworCQl9CisJCS8qIHRoYXQncyBhIGRlZmluaXRpb24gKi8KKwkJY3VyclNsaWNlLT5saXN0WHNpemVbMV0gPQorCQkJKGNoYXIpY3VyclNsaWNlLT5udW1fcmVmX2lkeF9hY3RpdmVbTElTVF8xXTsKKwkJaWYgKGgyNjRfZGVidWdfZmxhZyAmIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCkgeworCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJICAibGlzdFhbMV0gcmVvcmRlciAoUGljTnVtKTogIik7CisJCQlmb3IgKGkgPSAwOyBpIDwgY3VyclNsaWNlLT5saXN0WHNpemVbMV07IGkrKykgeworCQkJCWlmIChjdXJyU2xpY2UtPmxpc3RYWzFdW2ldKQorCQkJCQlkcGJfcHJpbnRfY29udChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLCAiJWQgICIsCisJCQkJCQljdXJyU2xpY2UtPmxpc3RYWzFdW2ldLT5waWNfbnVtKTsKKwkJCX0KKwkJCWRwYl9wcmludF9jb250KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLCAiXG4iKTsKKwkJfQorCX0KKworCS8qIGZyZWVfcmVmX3BpY19saXN0X3Jlb3JkZXJpbmdfYnVmZmVyKGN1cnJTbGljZSk7ICovCisKKwlpZiAoY3VyclNsaWNlLT5zbGljZV90eXBlID09IFBfU0xJQ0UpIHsKKyNpZiBQUklOVFJFRkxJU1QKKwkJdW5zaWduZWQgaW50IGk7CisjaWYgKE1WQ19FWFRFTlNJT05fRU5BQkxFKQorCQkvKiBwcmludCBvdXQgZm9yIGgyNjRfZGVidWdfZmxhZyBwdXJwb3NlICovCisJCWlmICgocF9WaWQtPnByb2ZpbGVfaWRjID09IE1WQ19ISUdIIHx8CisJCQlwX1ZpZC0+cHJvZmlsZV9pZGMgPT0gU1RFUkVPX0hJR0gpICYmCisJCQljdXJyU2xpY2UtPmN1cnJlbnRfc2xpY2VfbnIgPT0gMCkgeworCQkJaWYgKGN1cnJTbGljZS0+bGlzdFhzaXplWzBdID4gMAorCQkJCSYmIChoMjY0X2RlYnVnX2ZsYWcgJiBQUklOVF9GTEFHX0RQQl9ERVRBSUwpKSB7CisJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwgIlxuIik7CisJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkJICAiICoqIChGaW5hbFZpZXdJRDolZCkgJXMgUmVmIFBpYyBMaXN0IDAgKioqKlxuIiwKKwkJCQkJY3VyclNsaWNlLT52aWV3X2lkLAorCQkJCQljdXJyU2xpY2UtPnN0cnVjdHVyZSA9PSBGUkFNRSA/CisJCQkJCSJGUk0iIDoKKwkJCQkJKGN1cnJTbGljZS0+c3RydWN0dXJlID09IFRPUF9GSUVMRCA/CisJCQkJCSJUT1AiIDogIkJPVCIpKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgKHVuc2lnbmVkIGludCkoY3VyclNsaWNlLT4KKwkJCQkJbGlzdFhzaXplWzBdKTsgaSsrKSB7IC8qIHJlZiBsaXN0IDAgKi8KKwkJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJCQkiICAgJTJkIC0+IFBPQzogJTRkIFBpY051bTogJTRkIFZpZXdJRDogJWRcbiIsCisJCQkJCQlpLAorCQkJCQkJY3VyclNsaWNlLT5saXN0WFswXVtpXS0+cG9jLAorCQkJCQkJY3VyclNsaWNlLT5saXN0WFswXVtpXS0+CisJCQkJCQkJcGljX251bSwKKwkJCQkJCWN1cnJTbGljZS0+bGlzdFhbMF1baV0tPgorCQkJCQkJCXZpZXdfaWQpOworCQkJCX0KKwkJCX0KKwkJfQorI2VuZGlmCisjZW5kaWYKKwl9IGVsc2UgaWYgKGN1cnJTbGljZS0+c2xpY2VfdHlwZSA9PSBCX1NMSUNFKSB7CisjaWYgUFJJTlRSRUZMSVNUCisJCXVuc2lnbmVkIGludCBpOworI2lmIChNVkNfRVhURU5TSU9OX0VOQUJMRSkKKwkJLyogcHJpbnQgb3V0IGZvciBoMjY0X2RlYnVnX2ZsYWcgcHVycG9zZSAqLworCQlpZiAoKHBfVmlkLT5wcm9maWxlX2lkYyA9PSBNVkNfSElHSCB8fAorCQkJcF9WaWQtPnByb2ZpbGVfaWRjID09IFNURVJFT19ISUdIKSAmJgorCQkgICAgY3VyclNsaWNlLT5jdXJyZW50X3NsaWNlX25yID09IDApIHsKKwkJCWlmICgoY3VyclNsaWNlLT5saXN0WHNpemVbMF0gPiAwKSB8fAorCQkJCShjdXJyU2xpY2UtPmxpc3RYc2l6ZVsxXSA+IDApKQorCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsICJcbiIpOworCQkJaWYgKGN1cnJTbGljZS0+bGlzdFhzaXplWzBdID4gMAorCQkJCSYmIChoMjY0X2RlYnVnX2ZsYWcgJiBQUklOVF9GTEFHX0RQQl9ERVRBSUwpKSB7CisJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkJIiAqKiAoRmluYWxWaWV3SUQ6JWQpICVzIFJlZiBQaWMgTGlzdCAwICoqKipcbiIsCisJCQkJCWN1cnJTbGljZS0+dmlld19pZCwKKwkJCQkJY3VyclNsaWNlLT5zdHJ1Y3R1cmUgPT0gRlJBTUUgPworCQkJCQkiRlJNIiA6CisJCQkJCShjdXJyU2xpY2UtPnN0cnVjdHVyZSA9PSBUT1BfRklFTEQgPworCQkJCQkiVE9QIiA6ICJCT1QiKSk7CisJCQkJZm9yIChpID0gMDsgaSA8ICh1bnNpZ25lZCBpbnQpKGN1cnJTbGljZS0+CisJCQkJCWxpc3RYc2l6ZVswXSk7IGkrKykgeyAvKiByZWYgbGlzdCAwICovCisJCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJCQkJIiAgICUyZCAtPiBQT0M6ICU0ZCBQaWNOdW06ICU0ZCBWaWV3SUQ6ICVkXG4iLAorCQkJCQkJaSwKKwkJCQkJCWN1cnJTbGljZS0+bGlzdFhbMF1baV0tPnBvYywKKwkJCQkJCWN1cnJTbGljZS0+bGlzdFhbMF1baV0tPgorCQkJCQkJCXBpY19udW0sCisJCQkJCQljdXJyU2xpY2UtPmxpc3RYWzBdW2ldLT4KKwkJCQkJCQl2aWV3X2lkKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoY3VyclNsaWNlLT5saXN0WHNpemVbMV0gPiAwCisJCQkJICYmIChoMjY0X2RlYnVnX2ZsYWcgJiBQUklOVF9GTEFHX0RQQl9ERVRBSUwpKSB7CisJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkJIiAqKiAoRmluYWxWaWV3SUQ6JWQpICVzIFJlZiBQaWMgTGlzdCAxICoqKipcbiIsCisJCQkJCWN1cnJTbGljZS0+dmlld19pZCwKKwkJCQkJY3VyclNsaWNlLT5zdHJ1Y3R1cmUgPT0gRlJBTUUgPworCQkJCQkiRlJNIiA6CisJCQkJCShjdXJyU2xpY2UtPnN0cnVjdHVyZSA9PSBUT1BfRklFTEQgPworCQkJCQkiVE9QIiA6ICJCT1QiKSk7CisJCQkJZm9yIChpID0gMDsgaSA8ICh1bnNpZ25lZCBpbnQpKGN1cnJTbGljZS0+CisJCQkJCWxpc3RYc2l6ZVsxXSk7IGkrKykgeyAvKiByZWYgbGlzdCAxICovCisJCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJCQkJIiAgICUyZCAtPiBQT0M6ICU0ZCBQaWNOdW06ICU0ZCBWaWV3SUQ6ICVkXG4iLAorCQkJCQkJaSwKKwkJCQkJCWN1cnJTbGljZS0+bGlzdFhbMV1baV0tPnBvYywKKwkJCQkJCWN1cnJTbGljZS0+bGlzdFhbMV1baV0tPgorCQkJCQkJCXBpY19udW0sCisJCQkJCQljdXJyU2xpY2UtPmxpc3RYWzFdW2ldLT4KKwkJCQkJCQl2aWV3X2lkKTsKKwkJCQl9CisJCQl9CisJCX0KKyNlbmRpZgorCisjZW5kaWYKKwl9Cit9CisKK3ZvaWQgaW5pdF9jb2xvY2F0ZV9idWYoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIsIGludCBjb3VudCkKK3sKKwlwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX21hcCA9IDA7CisJcF9IMjY0X0RwYi0+Y29sb2NhdGVkX2J1Zl9jb3VudCA9IGNvdW50OworfQorCitpbnQgYWxsb2NhdGVfY29sb2NhdGVfYnVmKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHBfSDI2NF9EcGItPmNvbG9jYXRlZF9idWZfY291bnQ7IGkrKykgeworCQlpZiAoKChwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX21hcCA+PiBpKSAmIDB4MSkgPT0gMCkgeworCQkJcF9IMjY0X0RwYi0+Y29sb2NhdGVkX2J1Zl9tYXAgfD0gKDEgPDwgaSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaSA9PSBwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX2NvdW50KSB7CisJCWkgPSAtMTsKKwkJcF9IMjY0X0RwYi0+YnVmX2FsbG9jX2ZhaWwgPSAxOworCX0KKwlyZXR1cm4gaTsKK30KKworaW50IHJlbGVhc2VfY29sb2NhdGVfYnVmKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLCBpbnQgaW5kZXgpCit7CisJaWYgKGluZGV4ID49IDApIHsKKwkJaWYgKGluZGV4ID49IHBfSDI2NF9EcGItPmNvbG9jYXRlZF9idWZfY291bnQpIHsKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0VSUk9SLAorCQkJCSIlcyBlcnJvciwgaW5kZXggJWQgaXMgYmlnZ2VyIHRoYW4gYnVmIGNvdW50ICVkXG4iLAorCQkJCV9fZnVuY19fLCBpbmRleCwKKwkJCQlwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX2NvdW50KTsKKwkJfSBlbHNlIHsKKwkJCWlmICgoKHBfSDI2NF9EcGItPmNvbG9jYXRlZF9idWZfbWFwID4+CisJCQkJaW5kZXgpICYgMHgxKSA9PSAweDEpIHsKKwkJCQlwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX21hcCAmPQorCQkJCQkofigxIDw8IGluZGV4KSk7CisJCQl9IGVsc2UgeworCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQlQUklOVF9GTEFHX0VSUk9SLAorCQkJCQkiJXMgZXJyb3IsIGluZGV4ICVkIGlzIG5vdCBhbGxvY2F0ZWRcbiIsCisJCQkJCV9fZnVuY19fLCBpbmRleCk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2V0X2ZyYW1lX291dHB1dF9mbGFnKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLCBpbnQgaW5kZXgpCit7CisJc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYiA9ICZwX0gyNjRfRHBiLT5tRFBCOworCisJcF9IMjY0X0RwYi0+bUZyYW1lU3RvcmVbaW5kZXhdLmlzX291dHB1dCA9IDE7CisJcF9IMjY0X0RwYi0+bUZyYW1lU3RvcmVbaW5kZXhdLnByZV9vdXRwdXQgPSAwOworCXBfSDI2NF9EcGItPm1GcmFtZVN0b3JlW2luZGV4XS5zaG93X2ZyYW1lID0gZmFsc2U7CisJZHVtcF9kcGIocF9EcGIsIDApOworfQorCisjaWYgMAordm9pZCBpbml0X29sZF9zbGljZShPbGRTbGljZVBhcmFtcyAqcF9vbGRfc2xpY2UpCit7CisJcF9vbGRfc2xpY2UtPmZpZWxkX3BpY19mbGFnID0gMDsKKwlwX29sZF9zbGljZS0+cHBzX2lkICAgICAgICAgPSBJTlRfTUFYOworCXBfb2xkX3NsaWNlLT5mcmFtZV9udW0gICAgICA9IElOVF9NQVg7CisJcF9vbGRfc2xpY2UtPm5hbF9yZWZfaWRjICAgID0gSU5UX01BWDsKKwlwX29sZF9zbGljZS0+aWRyX2ZsYWcgICAgICAgPSAwOworCisJcF9vbGRfc2xpY2UtPnBpY19vZGVyX2NudF9sc2IgICAgICAgICAgPSBVSU5UX01BWDsKKwlwX29sZF9zbGljZS0+ZGVsdGFfcGljX29kZXJfY250X2JvdHRvbSA9IElOVF9NQVg7CisKKwlwX29sZF9zbGljZS0+ZGVsdGFfcGljX29yZGVyX2NudFswXSA9IElOVF9NQVg7CisJcF9vbGRfc2xpY2UtPmRlbHRhX3BpY19vcmRlcl9jbnRbMV0gPSBJTlRfTUFYOworfQorCisKK3ZvaWQgY29weV9zbGljZV9pbmZvKHN0cnVjdCBTbGljZSAqY3VyclNsaWNlLCBPbGRTbGljZVBhcmFtcyAqcF9vbGRfc2xpY2UpCit7CisJc3RydWN0IFZpZGVvUGFyYW1ldGVycyAqcF9WaWQgPSBjdXJyU2xpY2UtPnBfVmlkOworCisJcF9vbGRfc2xpY2UtPnBwc19pZCAgICAgICAgID0gY3VyclNsaWNlLT5waWNfcGFyYW1ldGVyX3NldF9pZDsKKwlwX29sZF9zbGljZS0+ZnJhbWVfbnVtICAgICAgPSBjdXJyU2xpY2UtPmZyYW1lX251bTsKKwkvKiBwX1ZpZC0+ZnJhbWVfbnVtOyAqLworCXBfb2xkX3NsaWNlLT5maWVsZF9waWNfZmxhZyA9CisJCWN1cnJTbGljZS0+ZmllbGRfcGljX2ZsYWc7CisJLyogcF9WaWQtPmZpZWxkX3BpY19mbGFnOyAqLworCisJaWYgKGN1cnJTbGljZS0+ZmllbGRfcGljX2ZsYWcpCisJCXBfb2xkX3NsaWNlLT5ib3R0b21fZmllbGRfZmxhZyA9IGN1cnJTbGljZS0+Ym90dG9tX2ZpZWxkX2ZsYWc7CisKKwlwX29sZF9zbGljZS0+bmFsX3JlZl9pZGMgPSBjdXJyU2xpY2UtPm5hbF9yZWZlcmVuY2VfaWRjOworCXBfb2xkX3NsaWNlLT5pZHJfZmxhZyAgICA9IChieXRlKSBjdXJyU2xpY2UtPmlkcl9mbGFnOworCisJaWYgKGN1cnJTbGljZS0+aWRyX2ZsYWcpCisJCXBfb2xkX3NsaWNlLT5pZHJfcGljX2lkID0gY3VyclNsaWNlLT5pZHJfcGljX2lkOworCisJaWYgKHBfVmlkLT5hY3RpdmVfc3BzLT5waWNfb3JkZXJfY250X3R5cGUgPT0gMCkgeworCQlwX29sZF9zbGljZS0+cGljX29kZXJfY250X2xzYiA9CisJCQljdXJyU2xpY2UtPnBpY19vcmRlcl9jbnRfbHNiOworCQlwX29sZF9zbGljZS0+ZGVsdGFfcGljX29kZXJfY250X2JvdHRvbSA9CisJCQljdXJyU2xpY2UtPmRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tOworCX0KKworCWlmIChwX1ZpZC0+YWN0aXZlX3Nwcy0+cGljX29yZGVyX2NudF90eXBlID09IDEpIHsKKwkJcF9vbGRfc2xpY2UtPmRlbHRhX3BpY19vcmRlcl9jbnRbMF0gPQorCQkJY3VyclNsaWNlLT5kZWx0YV9waWNfb3JkZXJfY250WzBdOworCQlwX29sZF9zbGljZS0+ZGVsdGFfcGljX29yZGVyX2NudFsxXSA9CisJCQljdXJyU2xpY2UtPmRlbHRhX3BpY19vcmRlcl9jbnRbMV07CisJfQorI2lmIChNVkNfRVhURU5TSU9OX0VOQUJMRSkKKwlwX29sZF9zbGljZS0+dmlld19pZCA9IGN1cnJTbGljZS0+dmlld19pZDsKKwlwX29sZF9zbGljZS0+aW50ZXJfdmlld19mbGFnID0gY3VyclNsaWNlLT5pbnRlcl92aWV3X2ZsYWc7CisJcF9vbGRfc2xpY2UtPmFuY2hvcl9waWNfZmxhZyA9IGN1cnJTbGljZS0+YW5jaG9yX3BpY19mbGFnOworI2VuZGlmCisJcF9vbGRfc2xpY2UtPmxheWVyX2lkID0gY3VyclNsaWNlLT5sYXllcl9pZDsKK30KKworaW50IGlzX25ld19waWN0dXJlKFN0b3JhYmxlUGljdHVyZSAqZGVjX3BpY3R1cmUsIHN0cnVjdCBTbGljZSAqY3VyclNsaWNlLAorCQkgICBPbGRTbGljZVBhcmFtcyAqcF9vbGRfc2xpY2UpCit7CisJc3RydWN0IFZpZGVvUGFyYW1ldGVycyAqcF9WaWQgPSBjdXJyU2xpY2UtPnBfVmlkOworCisJaW50IHJlc3VsdCA9IDA7CisKKwlyZXN1bHQgfD0gKGRlY19waWN0dXJlID09IE5VTEwpOworCisJcmVzdWx0IHw9IChwX29sZF9zbGljZS0+cHBzX2lkICE9IGN1cnJTbGljZS0+cGljX3BhcmFtZXRlcl9zZXRfaWQpOworCisJcmVzdWx0IHw9IChwX29sZF9zbGljZS0+ZnJhbWVfbnVtICE9IGN1cnJTbGljZS0+ZnJhbWVfbnVtKTsKKworCXJlc3VsdCB8PSAocF9vbGRfc2xpY2UtPmZpZWxkX3BpY19mbGFnICE9IGN1cnJTbGljZS0+ZmllbGRfcGljX2ZsYWcpOworCisJaWYgKGN1cnJTbGljZS0+ZmllbGRfcGljX2ZsYWcgJiYgcF9vbGRfc2xpY2UtPmZpZWxkX3BpY19mbGFnKSB7CisJCXJlc3VsdCB8PSAocF9vbGRfc2xpY2UtPmJvdHRvbV9maWVsZF9mbGFnICE9CisJCQkJY3VyclNsaWNlLT5ib3R0b21fZmllbGRfZmxhZyk7CisJfQorCisJcmVzdWx0IHw9IChwX29sZF9zbGljZS0+bmFsX3JlZl9pZGMgIT0KKwkJCWN1cnJTbGljZS0+bmFsX3JlZmVyZW5jZV9pZGMpICYmCisJCSAgKChwX29sZF9zbGljZS0+bmFsX3JlZl9pZGMgPT0gMCkgfHwKKwkJCShjdXJyU2xpY2UtPm5hbF9yZWZlcmVuY2VfaWRjID09IDApKTsKKwlyZXN1bHQgfD0gKHBfb2xkX3NsaWNlLT5pZHJfZmxhZyAgICAhPSBjdXJyU2xpY2UtPmlkcl9mbGFnKTsKKworCWlmIChjdXJyU2xpY2UtPmlkcl9mbGFnICYmIHBfb2xkX3NsaWNlLT5pZHJfZmxhZykKKwkJcmVzdWx0IHw9IChwX29sZF9zbGljZS0+aWRyX3BpY19pZCAhPSBjdXJyU2xpY2UtPmlkcl9waWNfaWQpOworCisJaWYgKHBfVmlkLT5hY3RpdmVfc3BzLT5waWNfb3JkZXJfY250X3R5cGUgPT0gMCkgeworCQlyZXN1bHQgfD0gKHBfb2xkX3NsaWNlLT5waWNfb2Rlcl9jbnRfbHNiICE9CisJCQkgICBjdXJyU2xpY2UtPnBpY19vcmRlcl9jbnRfbHNiKTsKKwkJaWYgKHBfVmlkLT5hY3RpdmVfcHBzLT4KKwkJCWJvdHRvbV9maWVsZF9waWNfb3JkZXJfaW5fZnJhbWVfcHJlc2VudF9mbGFnICA9PSAgMSAmJgorCQkgICAgIWN1cnJTbGljZS0+ZmllbGRfcGljX2ZsYWcpIHsKKwkJCXJlc3VsdCB8PSAocF9vbGRfc2xpY2UtPmRlbHRhX3BpY19vZGVyX2NudF9ib3R0b20gIT0KKwkJCQkgICBjdXJyU2xpY2UtPmRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tKTsKKwkJfQorCX0KKworCWlmIChwX1ZpZC0+YWN0aXZlX3Nwcy0+cGljX29yZGVyX2NudF90eXBlID09IDEpIHsKKwkJaWYgKCFwX1ZpZC0+YWN0aXZlX3Nwcy0+ZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcpIHsKKwkJCXJlc3VsdCB8PSAocF9vbGRfc2xpY2UtPmRlbHRhX3BpY19vcmRlcl9jbnRbMF0gIT0KKwkJCQkgICBjdXJyU2xpY2UtPmRlbHRhX3BpY19vcmRlcl9jbnRbMF0pOworCQkJaWYgKHBfVmlkLT5hY3RpdmVfcHBzLT4KKwkJCWJvdHRvbV9maWVsZF9waWNfb3JkZXJfaW5fZnJhbWVfcHJlc2VudF9mbGFnICA9PSAgMSAmJgorCQkJICAgICFjdXJyU2xpY2UtPmZpZWxkX3BpY19mbGFnKSB7CisJCQkJcmVzdWx0IHw9IChwX29sZF9zbGljZS0+CisJCQkJCWRlbHRhX3BpY19vcmRlcl9jbnRbMV0gIT0KKwkJCQkJY3VyclNsaWNlLT5kZWx0YV9waWNfb3JkZXJfY250WzFdKTsKKwkJCX0KKwkJfQorCX0KKworI2lmIChNVkNfRVhURU5TSU9OX0VOQUJMRSkKKwlyZXN1bHQgfD0gKGN1cnJTbGljZS0+dmlld19pZCAhPSBwX29sZF9zbGljZS0+dmlld19pZCk7CisJcmVzdWx0IHw9IChjdXJyU2xpY2UtPmludGVyX3ZpZXdfZmxhZyAhPSBwX29sZF9zbGljZS0+aW50ZXJfdmlld19mbGFnKTsKKwlyZXN1bHQgfD0gKGN1cnJTbGljZS0+YW5jaG9yX3BpY19mbGFnICE9IHBfb2xkX3NsaWNlLT5hbmNob3JfcGljX2ZsYWcpOworI2VuZGlmCisJcmVzdWx0IHw9IChjdXJyU2xpY2UtPmxheWVyX2lkICE9IHBfb2xkX3NsaWNlLT5sYXllcl9pZCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKyNlbHNlCitpbnQgaXNfbmV3X3BpY3R1cmUoc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqZGVjX3BpY3R1cmUsCisJCSAgIHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLAorCQkgICBzdHJ1Y3QgT2xkU2xpY2VQYXJhbXMgKnBfb2xkX3NsaWNlKQoreworCWludCByZXQgPSAwOworCisJaWYgKHBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbRklSU1RfTUJfSU5fU0xJQ0VdID09IDApCisJCXJldCA9IDE7CisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmCisKKy8qCisqIHJlbGVhc2UgYnVmc3BlYyBhbmQgcGljIGZvciBwaWN0dXJlIG5vdCBpbiBkcGIgYnVmCisqLworaW50IHJlbGVhc2VfcGljdHVyZShzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiwKKwkJICAgc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqcGljKQoreworCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIgPSAmcF9IMjY0X0RwYi0+bURQQjsKKworCWlmIChwX0RwYi0+bGFzdF9waWN0dXJlID09IE5VTEwpIHsKKwkJaWYgKHBpYy0+Y29sb2NhdGVkX2J1Zl9pbmRleCA+PSAwKSB7CisJCQlyZWxlYXNlX2NvbG9jYXRlX2J1ZihwX0gyNjRfRHBiLAorCQkJcGljLT5jb2xvY2F0ZWRfYnVmX2luZGV4KTsKKwkJCXBpYy0+Y29sb2NhdGVkX2J1Zl9pbmRleCA9IC0xOworCQl9CisJCXJlbGVhc2VfYnVmX3NwZWNfbnVtKHBfSDI2NF9EcGItPnZkZWMsIHBpYy0+YnVmX3NwZWNfbnVtKTsKKwl9IGVsc2UgeworCQlpZiAocGljLT5idWZfc3BlY19pc19hbGxvY2VkID09IDEpCisJCQlyZWxlYXNlX2J1Zl9zcGVjX251bShwX0gyNjRfRHBiLT52ZGVjLAorCQkJCXBpYy0+YnVmX3NwZWNfbnVtKTsKKwl9CisKKwlmcmVlX3BpY3R1cmUocF9IMjY0X0RwYiwgcGljKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIEVSUk9SX0hBTkRMRV9URVNUCisvKgorKiAgcmVtb3ZlIGFsbCBwaWN0dXJlcyBpbiBkcGIgYW5kIHJlbGVhc2UgYnVmc3BlYy9waWMgb2YgdGhlbQorKi8KK3ZvaWQgcmVtb3ZlX2RwYl9waWN0dXJlcyhzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYikKK3sKKwkvKiBzdHJ1Y3QgVmlkZW9QYXJhbWV0ZXJzICpwX1ZpZCA9IHBfRHBiLT5wX1ZpZDsgKi8KKwlzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiID0gJnBfSDI2NF9EcGItPm1EUEI7CisJc3RydWN0IFNsaWNlICpjdXJyU2xpY2UgPSAmcF9IMjY0X0RwYi0+bVNsaWNlOworCXVuc2lnbmVkICBpLCBqOworCisJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoIXBfRHBiLT5pbml0X2RvbmUpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+dXNlZF9zaXplOyBpKyspIHsKKwkJaWYgKHBfRHBiLT5mc1tpXS0+Y29sb2NhdGVkX2J1Zl9pbmRleCA+PSAwKSB7CisJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSJyZWxlYXNlX2NvbG9jYXRlX2J1ZlslZF0gZm9yIGZzWyVkXVxuIiwKKwkJCXBfRHBiLT5mc1tpXS0+Y29sb2NhdGVkX2J1Zl9pbmRleCwgaSk7CisKKwkJCXJlbGVhc2VfY29sb2NhdGVfYnVmKHBfSDI2NF9EcGIsCisJCQkJcF9EcGItPmZzW2ldLT5jb2xvY2F0ZWRfYnVmX2luZGV4KTsgLyogcmFpbiAqLworCQkJcF9EcGItPmZzW2ldLT5jb2xvY2F0ZWRfYnVmX2luZGV4ID0gLTE7CisJCX0KKwkJaWYgKCFwX0RwYi0+ZnNbaV0tPnByZV9vdXRwdXQpIHsKKwkJCXJlbGVhc2VfYnVmX3NwZWNfbnVtKHBfSDI2NF9EcGItPnZkZWMsCisJCQkJcF9EcGItPmZzW2ldLT5idWZfc3BlY19udW0pOworCQkJcF9EcGItPmZzW2ldLT5idWZfc3BlY19udW0gPSAtMTsKKwkJfQorCQlyZW1vdmVfZnJhbWVfZnJvbV9kcGIocF9IMjY0X0RwYiwgaSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHBfRHBiLT51c2VkX3NpemU7IGkrKykgeworCQlwX0RwYi0+ZnNfcmVmW2ldID0gTlVMTDsKKwkJcF9EcGItPmZzX2x0cmVmW2ldID0gTlVMTDsKKwkJcF9EcGItPmZzX2xpc3QwW2ldID0gTlVMTDsKKwkJcF9EcGItPmZzX2xpc3QxW2ldID0gTlVMTDsKKwkJcF9EcGItPmZzX2xpc3RsdFtpXSA9IE5VTEw7CisJfQorCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJY3VyclNsaWNlLT5saXN0WHNpemVbaV0gPSAwOworCQlmb3IgKGogPSAwOyBqIDwgKE1BWF9MSVNUX1NJWkUgKiAyKTsgaisrKQorCQkJY3VyclNsaWNlLT5saXN0WFtpXVtqXSA9IE5VTEw7CisJfQorCXBfRHBiLT5yZWZfZnJhbWVzX2luX2J1ZmZlciA9IDA7CisJcF9EcGItPmx0cmVmX2ZyYW1lc19pbl9idWZmZXIgPSAwOworCXBfRHBiLT5sYXN0X291dHB1dF9wb2MgPSBJTlRfTUlOOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGNoZWNrX2ZyYW1lX3N0b3JlX3NhbWVfcGljX251bShzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiLAorCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnAsIHN0cnVjdCBTbGljZSAqY3VyclNsaWNlKQoreworCWlmIChwX0RwYi0+bGFzdF9waWN0dXJlKSB7CisJCWlmICgoaW50KXBfRHBiLT5sYXN0X3BpY3R1cmUtPmZyYW1lX251bSA9PSBwLT5waWNfbnVtKSB7CisJCQlpZiAoKChwLT5zdHJ1Y3R1cmUgPT0gVE9QX0ZJRUxEKSAmJgorCQkJCShwX0RwYi0+bGFzdF9waWN0dXJlLT5pc191c2VkID09IDIpKSB8fAorCQkJICAgICgocC0+c3RydWN0dXJlID09IEJPVFRPTV9GSUVMRCkgJiYKKwkJCQkocF9EcGItPmxhc3RfcGljdHVyZS0+aXNfdXNlZCA9PSAxKSkpIHsKKwkJCQlpZiAoKHAtPnVzZWRfZm9yX3JlZmVyZW5jZSAmJgorCQkJCQkocF9EcGItPmxhc3RfcGljdHVyZS0+CisJCQkJCWlzX29yaWdfcmVmZXJlbmNlICE9IDApKSB8fAorCQkJCSAgICAoIXAtPnVzZWRfZm9yX3JlZmVyZW5jZSAmJgorCQkJCQkocF9EcGItPmxhc3RfcGljdHVyZS0+CisJCQkJCWlzX29yaWdfcmVmZXJlbmNlID09IDApKSkgeworCQkJCQlwLT5idWZfc3BlY19udW0gPQorCQkJCQkJcF9EcGItPmxhc3RfcGljdHVyZS0+CisJCQkJCQlidWZfc3BlY19udW07CisJCQkJCXAtPmJ1Zl9zcGVjX2lzX2FsbG9jZWQgPSAwOworCQkJCQlwLT5jb2xvY2F0ZWRfYnVmX2luZGV4ID0gcF9EcGItPgorCQkJCQkJbGFzdF9waWN0dXJlLT4KKwkJCQkJCWNvbG9jYXRlZF9idWZfaW5kZXg7CisJCQkJCWlmIChjdXJyU2xpY2UtPnN0cnVjdHVyZSA9PQorCQkJCQkJVE9QX0ZJRUxEKSB7CisJCQkJCQlwLT5ib3R0b21fcG9jID0KKwkJCQkJCQlwX0RwYi0+bGFzdF9waWN0dXJlLT4KKwkJCQkJCQlib3R0b21fZmllbGQtPnBvYzsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXAtPnRvcF9wb2MgPQorCQkJCQkJCXBfRHBiLT5sYXN0X3BpY3R1cmUtPgorCQkJCQkJCXRvcF9maWVsZC0+cG9jOworCQkJCQl9CisJCQkJCXAtPmZyYW1lX3BvYyA9IGltaW4ocC0+Ym90dG9tX3BvYywKKwkJCQkJCXAtPnRvcF9wb2MpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworaW50IGgyNjRfc2xpY2VfaGVhZGVyX3Byb2Nlc3Moc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIsIGludCAqZnJhbWVfbnVtX2dhcCkKK3sKKworCWludCBuZXdfcGljX2ZsYWcgPSAwOworCXN0cnVjdCBTbGljZSAqY3VyclNsaWNlID0gJnBfSDI2NF9EcGItPm1TbGljZTsKKwlzdHJ1Y3QgVmlkZW9QYXJhbWV0ZXJzICpwX1ZpZCA9ICZwX0gyNjRfRHBiLT5tVmlkZW87CisJc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYiA9CisJCQkJJnBfSDI2NF9EcGItPm1EUEI7CisjaWYgMAorCW5ld19waWNfZmxhZyA9IGlzX25ld19waWN0dXJlKHBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZSwKKwkJCQkgICAgICBwX0gyNjRfRHBiLAorCQkJCSAgICAgICZwX0gyNjRfRHBiLT5tVmlkZW8ub2xkX3NsaWNlKTsKKworCWlmIChuZXdfcGljX2ZsYWcpIHsgLyogbmV3IHBpY3R1cmUgKi8KKwkJaWYgKHBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZSkgeworCQkJc3RvcmVfcGljdHVyZV9pbl9kcGIocF9IMjY0X0RwYiwKKwkJCQlwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUpOworCQkJLyogZHVtcF9kcGIoJnBfSDI2NF9EcGItPm1EUEIpOyAqLworCQl9CisJfQorI2Vsc2UKKwluZXdfcGljX2ZsYWcgPSAocF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlID09IE5VTEwpOworI2VuZGlmCisJcF9IMjY0X0RwYi0+YnVmX2FsbG9jX2ZhaWwgPSAwOworCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnID0gMDsKKwlzbGljZV9wcmVwYXJlKHBfSDI2NF9EcGIsICZwX0gyNjRfRHBiLT5tRFBCLCAmcF9IMjY0X0RwYi0+bVZpZGVvLAorCQkgICAgICAmcF9IMjY0X0RwYi0+bVNQUywgJnBfSDI2NF9EcGItPm1TbGljZSk7CisKKwlpZiAocF9EcGItPm51bV9yZWZfZnJhbWVzICE9IHBfSDI2NF9EcGItPm1TUFMubnVtX3JlZl9mcmFtZXMpIHsKKwkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIDAsCisJCSJudW1fcmVmX2ZyYW1lcyBjaGFuZ2UgZnJvbSAlZCB0byAlZFxyXG4iLAorCQkJcF9EcGItPm51bV9yZWZfZnJhbWVzLCBwX0gyNjRfRHBiLT5tU1BTLm51bV9yZWZfZnJhbWVzKTsKKwkJcF9EcGItPm51bV9yZWZfZnJhbWVzID0gcF9IMjY0X0RwYi0+bVNQUy5udW1fcmVmX2ZyYW1lczsKKwl9CisJLyogaWYgKHBfVmlkLT5hY3RpdmVfc3BzICE9IHNwcykgeyAqLworCWlmIChwX0gyNjRfRHBiLT5tRFBCLmluaXRfZG9uZSA9PSAwKSB7CisJCS8qaW5pdF9nbG9iYWxfYnVmZmVycyhwX1ZpZCwgMCk7CisJCSAqCQkgKiogKiAqaWYgKCFwX1ZpZC0+bm9fb3V0cHV0X29mX3ByaW9yX3BpY3NfZmxhZykKKwkJICoqICogKnsKKwkJICoqICogKiAgICBmbHVzaF9kcGIocF9WaWQtPnBfRHBiX2xheWVyWzBdKTsKKwkJICoqICogKn0KKwkJICoqICogKmluaXRfZHBiKHBfVmlkLCBwX1ZpZC0+cF9EcGJfbGF5ZXJbMF0sIDApOworCQkgKi8KKwkJaW5pdF9kcGIocF9IMjY0X0RwYiwgMCk7CisJfQorCisKKwlpZiAobmV3X3BpY19mbGFnKSB7IC8qIG5ldyBwaWN0dXJlICovCisJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCSJjaGVjayBmcmFtZV9udW0gZ2FwOiBjdXIgZnJhbWVfbnVtICVkIHByZV9mcmFtZV9udW0gJWQgbWF4X2ZybWFlX251bSAlZFxyXG4iLAorCQljdXJyU2xpY2UtPmZyYW1lX251bSwKKwkJcF9WaWQtPnByZV9mcmFtZV9udW0sCisJCXBfVmlkLT5tYXhfZnJhbWVfbnVtKTsKKwkJaWYgKHBfVmlkLT5yZWNvdmVyeV9wb2ludCA9PSAwICYmCisJCQlwX1ZpZC0+bWF4X2ZyYW1lX251bSA8PSBGUkFNRV9OVU1fTUFYX1NJWkUgJiYKKwkJCWN1cnJTbGljZS0+ZnJhbWVfbnVtICE9IHBfVmlkLT5wcmVfZnJhbWVfbnVtICYmCisJCQljdXJyU2xpY2UtPmZyYW1lX251bSAhPQorCQkJKHBfVmlkLT5wcmVfZnJhbWVfbnVtICsgMSkgJSBwX1ZpZC0+bWF4X2ZyYW1lX251bSkgeworCQkJc3RydWN0IFNQU1BhcmFtZXRlcnMgKmFjdGl2ZV9zcHMgPSBwX1ZpZC0+YWN0aXZlX3NwczsKKwkJCS8qaWYgKGFjdGl2ZV9zcHMtPgorCQkJICpnYXBzX2luX2ZyYW1lX251bV92YWx1ZV9hbGxvd2VkX2ZsYWcKKwkJCSAqPT0gMCkgeworCQkJICogIGVycm9yKCJBbiB1bmludGVudGlvbmFsCisJCQkgKiAgbG9zcyBvZiBwaWN0dXJlcyBvY2N1cnMhIEV4aXRcbiIsCisJCQkgKiAgMTAwKTsKKwkJCSAqfQorCQkJICppZiAocF9WaWQtPmNvbmNlYWxfbW9kZSA9PSAwKQorCQkJICovCisJCQkgaWYgKGFjdGl2ZV9zcHMtPmZyYW1lX251bV9nYXBfYWxsb3dlZCkKKwkJCQlmaWxsX2ZyYW1lX251bV9nYXAocF9WaWQsIGN1cnJTbGljZSk7CisJCQkqZnJhbWVfbnVtX2dhcCA9IDE7CisJCX0KKworCQlpZiAoY3VyclNsaWNlLT5uYWxfcmVmZXJlbmNlX2lkYykgeworCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJIm5hbF9yZWZlcmVuY2VfaWRjIG5vdCAwLCBzZXQgcHJlX2ZyYW1lX251bSglZCkgdG8gZnJhbWVfbnVtICglZClcbiIsCisJCQlwX1ZpZC0+cHJlX2ZyYW1lX251bSwgY3VyclNsaWNlLT5mcmFtZV9udW0pOworCQkJcF9WaWQtPnByZV9mcmFtZV9udW0gPSBjdXJyU2xpY2UtPmZyYW1lX251bTsKKwkJfQorCisJCWRlY29kZV9wb2MoJnBfSDI2NF9EcGItPm1WaWRlbywgJnBfSDI2NF9EcGItPm1TbGljZSk7CisJCXBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZSA9IGdldF9uZXdfcGljKHBfSDI2NF9EcGIsCisJCQkJCQkgcF9IMjY0X0RwYi0+bVNsaWNlLnN0cnVjdHVyZSwKKwkJCQkJCS8qcF9WaWQtPndpZHRoLCBwX1ZpZC0+aGVpZ2h0LAorCQkJCQkJICogIHBfVmlkLT53aWR0aF9jciwKKwkJCQkJCSAqICBwX1ZpZC0+aGVpZ2h0X2NyLAorCQkJCQkJICovCisJCQkJCQkgMSk7CisJCWlmIChwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUpIHsKKwkJCXUzMiBvZmZzZXRfbG8sIG9mZnNldF9oaTsKKwkJCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIgPQorCQkJCSZwX0gyNjRfRHBiLT5tRFBCOworCQkJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqcCA9CisJCQkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlOworCQkJaW5pdF9waWN0dXJlKHBfSDI2NF9EcGIsICZwX0gyNjRfRHBiLT5tU2xpY2UsCisJCQkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlKTsKKyNpZiAxCisJCQkvKiByYWluICovCisJCQlvZmZzZXRfbG8gID0KKwkJCXBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbT0ZGU0VUX0RFTElNSVRFUl9MT107CisJCQlvZmZzZXRfaGkgID0KKwkJCXBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbT0ZGU0VUX0RFTElNSVRFUl9ISV07CisJCQlwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPm9mZnNldF9kZWxpbWl0ZXIgPQorCQkJCShvZmZzZXRfbG8JfCBvZmZzZXRfaGkgPDwgMTYpOworCQkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlLT5idWZfc3BlY19udW0gID0gLTE7CisJCQlwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPgorCQkJCWNvbG9jYXRlZF9idWZfaW5kZXggPSAtMTsKKwkJCXVwZGF0ZV9waWNfbnVtKHBfSDI2NF9EcGIpOworCisJCQlpZiAoKGN1cnJTbGljZS0+c3RydWN0dXJlID09IFRPUF9GSUVMRCkgfHwKKwkJCSAgICAoY3VyclNsaWNlLT5zdHJ1Y3R1cmUgPT0gQk9UVE9NX0ZJRUxEKSkgeworCQkJCS8qIGNoZWNrIGZvciBmcmFtZSBzdG9yZSB3aXRoIHNhbWUKKwkJCQkgKiAgIHBpY19udW1iZXIKKwkJCQkgKi8KKwkJCQljaGVja19mcmFtZV9zdG9yZV9zYW1lX3BpY19udW0ocF9EcGIsIHAsCisJCQkJCWN1cnJTbGljZSk7CisJCQl9CisKKwkJCWlmIChwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPmJ1Zl9zcGVjX251bSA9PQorCQkJCS0xKSB7CisJCQkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlLT5idWZfc3BlY19udW0gPQorCQkJCQlnZXRfZnJlZV9idWZfaWR4KHBfSDI2NF9EcGItPnZkZWMpOworCQkJCWlmIChwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPmJ1Zl9zcGVjX251bQorCQkJCQk8IDApIHsKKwkJCQkJcF9IMjY0X0RwYi0+YnVmX2FsbG9jX2ZhaWwgPSAxOworCQkJCQlwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPgorCQkJCQkJYnVmX3NwZWNfaXNfYWxsb2NlZCA9IDA7CisJCQkJfSBlbHNlCisJCQkJCXBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZS0+CisJCQkJCQlidWZfc3BlY19pc19hbGxvY2VkID0gMTsKKworCQkJCWlmIChwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPgorCQkJCQl1c2VkX2Zvcl9yZWZlcmVuY2UpIHsKKwkJCQkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlLT4KKwkJCQkJCWNvbG9jYXRlZF9idWZfaW5kZXggPQorCQkJCQkJYWxsb2NhdGVfY29sb2NhdGVfYnVmKAorCQkJCQkJCXBfSDI2NF9EcGIpOworCQkJCX0KKwkJCX0KKyNlbmRpZgorCQkJaWYgKHBvc3RfcGljdHVyZV9lYXJseShwX0gyNjRfRHBiLT52ZGVjLAorCQkJCXBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZS0+YnVmX3NwZWNfbnVtKSkKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKworCisJaWYgKHBfSDI2NF9EcGItPm1TbGljZS5zbGljZV90eXBlID09IFBfU0xJQ0UpCisJCWluaXRfbGlzdHNfcF9zbGljZSgmcF9IMjY0X0RwYi0+bVNsaWNlKTsKKwllbHNlIGlmIChwX0gyNjRfRHBiLT5tU2xpY2Uuc2xpY2VfdHlwZSA9PSBCX1NMSUNFKQorCQlpbml0X2xpc3RzX2Jfc2xpY2UoJnBfSDI2NF9EcGItPm1TbGljZSk7CisJZWxzZQorCQlpbml0X2xpc3RzX2lfc2xpY2UoJnBfSDI2NF9EcGItPm1TbGljZSk7CisKKwlyZW9yZGVyX2xpc3RzKCZwX0gyNjRfRHBiLT5tU2xpY2UpOworCisJaWYgKHBfSDI2NF9EcGItPm1TbGljZS5zdHJ1Y3R1cmUgPT0gRlJBTUUpCisJCWluaXRfbWJhZmZfbGlzdHMocF9IMjY0X0RwYiwgJnBfSDI2NF9EcGItPm1TbGljZSk7CisKKwlpZiAobmV3X3BpY19mbGFnKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitlbnVtIFBpY3R1cmVTdHJ1Y3R1cmUgZ2V0X2N1cl9zbGljZV9waWN0dXJlX3N0cnVjdCgKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYikKK3sKKwlzdHJ1Y3QgU2xpY2UgKmN1cnJTbGljZSA9ICZwX0gyNjRfRHBiLT5tU2xpY2U7CisJcmV0dXJuIGN1cnJTbGljZS0+c3RydWN0dXJlOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBpc19waWNfaW5fZHBiKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLAorCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnBpYykKK3sKKwl1bnNpZ25lZCBjaGFyIHJldCA9IDA7CisJaW50IGk7CisJc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYiA9CisJCQkJJnBfSDI2NF9EcGItPm1EUEI7CisJZm9yIChpID0gMDsgaSA8IHBfRHBiLT51c2VkX3NpemU7IGkrKykgeworCQlpZiAocF9EcGItPmZzW2ldLT50b3BfZmllbGQgPT0gcGljIHx8CisJCQlwX0RwYi0+ZnNbaV0tPmJvdHRvbV9maWVsZCA9PSBwaWMgfHwKKwkJCXBfRHBiLT5mc1tpXS0+ZnJhbWUgPT0gcGljKSB7CisJCQlyZXQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworaW50IGRwYl9jaGVja19yZWZfbGlzdF9lcnJvcigKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYikKK3sKKwlpbnQgaTsKKwkvKmludCBqOyovCisJc3RydWN0IFNsaWNlICpjdXJyU2xpY2UgPSAmcF9IMjY0X0RwYi0+bVNsaWNlOworCS8qIGluIGZpcnN0IG91dHB1dCwgaWdub3JlIHJlZiBjaGVjayAqLworCWlmICgocF9IMjY0X0RwYi0+Zmlyc3RfaW5zZXJ0X2ZyYW1lID09IEZpcnN0SW5zZXJ0RnJtX09VVCkgJiYKKwkJKHBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZSkgJiYKKwkJcF9IMjY0X0RwYi0+Zmlyc3Rfb3V0cHV0X3BvYyA+IHBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZS0+cG9jKSB7CisKKwkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSJwX0gyNjRfRHBiLT5maXJzdF9vdXRwdXRfcG9jICVkLCBwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPnBvYyAlZFxuIiwKKwkJCXBfSDI2NF9EcGItPmZpcnN0X291dHB1dF9wb2MsIHBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZS0+cG9jKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICgoY3VyclNsaWNlLT5zbGljZV90eXBlICE9IElfU0xJQ0UpICYmCisJCShjdXJyU2xpY2UtPnNsaWNlX3R5cGUgIT0gU0lfU0xJQ0UpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBjdXJyU2xpY2UtPmxpc3RYc2l6ZVswXTsgaSsrKSB7CisJCQkvKmZvciAoaiA9IGkgKyAxOyBqIDwgY3VyclNsaWNlLT5saXN0WHNpemVbMF07IGorKykgeworCQkJCWlmKGN1cnJTbGljZS0+bGlzdFhbMF1baV0tPnBpY19udW0gPT0KKwkJCQkJY3VyclNsaWNlLT5saXN0WFswXVtqXS0+cGljX251bSkKKwkJCQkJcmV0dXJuIDE7CisJCQl9Ki8KKwkJCWlmIChjdXJyU2xpY2UtPmxpc3RYWzBdW2ldID09IE5VTEwpCisJCQkJcmV0dXJuIDU7CisJCQlpZiAoIWlzX3BpY19pbl9kcGIocF9IMjY0X0RwYiwKKwkJCQljdXJyU2xpY2UtPmxpc3RYWzBdW2ldKSkKKwkJCQlyZXR1cm4gMTsKKwkJCWlmIChjdXJyU2xpY2UtPmxpc3RYWzBdW2ldLT5mcmFtZSAmJgorCQkJCWN1cnJTbGljZS0+bGlzdFhbMF1baV0tPmZyYW1lLT5ub25fZXhpc3RpbmcpCisJCQkJcmV0dXJuIDM7CisJCX0KKwl9CisKKwlpZiAoY3VyclNsaWNlLT5zbGljZV90eXBlID09IEJfU0xJQ0UpIHsKKwkJZm9yIChpID0gMDsgaSA8IGN1cnJTbGljZS0+bGlzdFhzaXplWzFdOyBpKyspIHsKKwkJCS8qZm9yIChqID0gaSArIDE7IGogPCBjdXJyU2xpY2UtPmxpc3RYc2l6ZVsxXTsgaisrKSB7CisJCQkJaWYoY3VyclNsaWNlLT5saXN0WFsxXVtpXS0+cGljX251bSA9PQorCQkJCQljdXJyU2xpY2UtPmxpc3RYWzFdW2pdLT5waWNfbnVtKQorCQkJCQlyZXR1cm4gMjsKKwkJCX0KKwkJCWZvciAoaiA9IDA7IGogPCBjdXJyU2xpY2UtPmxpc3RYc2l6ZVswXTsgaisrKSB7CisJCQkJaWYoY3VyclNsaWNlLT5saXN0WFsxXVtpXS0+cGljX251bSA9PQorCQkJCQljdXJyU2xpY2UtPmxpc3RYWzBdW2pdLT5waWNfbnVtKQorCQkJCQlyZXR1cm4gMzsKKwkJCX0qLworCQkJaWYgKGN1cnJTbGljZS0+bGlzdFhbMV1baV0gPT0gTlVMTCkKKwkJCQlyZXR1cm4gNjsKKwkJCWlmICghaXNfcGljX2luX2RwYihwX0gyNjRfRHBiLAorCQkJCWN1cnJTbGljZS0+bGlzdFhbMV1baV0pKQorCQkJCXJldHVybiAyOworCQkJaWYgKGN1cnJTbGljZS0+bGlzdFhbMV1baV0tPmZyYW1lICYmCisJCQkJY3VyclNsaWNlLT5saXN0WFsxXVtpXS0+ZnJhbWUtPm5vbl9leGlzdGluZykKKwkJCQlyZXR1cm4gNDsKKyNpZiAwCisJCQlpZiAoY3VyclNsaWNlLT5saXN0WHNpemVbMF0gPT0gMSAmJgorCQkJCWN1cnJTbGljZS0+bGlzdFhzaXplWzFdID09IDEgJiYKKwkJCQljdXJyU2xpY2UtPmxpc3RYWzFdWzBdID09CisJCQkJY3VyclNsaWNlLT5saXN0WFswXVswXSkKKwkJCQlyZXR1cm4gMzsKKyNlbmRpZgorCQl9CisJfQorCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvaDI2NF9tdWx0aS9oMjY0X2RwYi5oIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL2gyNjRfbXVsdGkvaDI2NF9kcGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjNlOGJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL2gyNjRfbXVsdGkvaDI2NF9kcGIuaApAQCAtMCwwICsxLDEwMDUgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNyBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisqIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyoKKyogRGVzY3JpcHRpb246CisqLworI2lmbmRlZiBIMjY0X0RQQl9IXworI2RlZmluZSBIMjY0X0RQQl9IXworCisjZGVmaW5lIEVSUk9SX0NIRUNLCisKKyNkZWZpbmUgT1VUUFVUX0JVRkZFUl9JTl9DCisKKyNkZWZpbmUgUFJJTlRfRkxBR19FUlJPUiAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMgICAgICAgIDBYMDAwMQorI2RlZmluZSBQUklOVF9GTEFHX1VDT0RFX0VWVCAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgUFJJTlRfRkxBR19NTVVfREVUQUlMCQkweDAwMDQKKyNkZWZpbmUgUFJJTlRfRkxBR19FUlJPUkZMQUdfREJHCTB4MDAwOAorI2RlZmluZSBQUklOVF9GTEFHX0RQQl9ERVRBSUwgICAgICAgICAweDAwMTAKKyNkZWZpbmUgUFJJTlRfRkxBR19ERUNfREVUQUlMICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwgICAgICAgIDB4MDA0MAorI2RlZmluZSBQUklOVF9GTEFHX0RVTVBfRFBCICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgUFJJTlRfRlJBTUVCQVNFX0RBVEEgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFBSSU5UX0ZMQUdfREVCVUdfUE9DICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBSUklOVF9GTEFHX1JQTSAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgREVCVUdfRElTQUJMRV9SVU5SRUFEWV9STUJVRiAgMHgwODAwCisjZGVmaW5lIFBSSU5UX0ZMQUdfRFVNUF9CVUZTUEVDICAgICAgIDB4MTAwMAorI2RlZmluZSBQUklOVF9GTEFHX0ZDQ19TVEFUVVMgICAgICAgICAweDIwMDAKKyNkZWZpbmUgUFJJTlRfRkxBR19TRUlfREVUQUlMICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFBSSU5UX0ZMQUdfVjRMX0RFVEFJTCAgICAgICAgIDB4ODAwMAorI2RlZmluZSBESVNBQkxFX0VSUk9SX0hBTkRMRSAgICAgICAgICAweDEwMDAwCisjZGVmaW5lIERFQlVHX0RVTVBfU1RBVCAgICAgICAgICAgICAgIDB4ODAwMDAKKyNkZWZpbmUgREVCVUdfVElNRU9VVF9ERUNfU1RBVCAgICAgICAgMHg4MDAwMDAKKworLypzZXR0aW5nIGNhbnZhcyBtb2RlIGFuZCBlbmRpYW4uCisgIGlmIHRoaXMgZmxhZyBpcyBzZXQsIHZhbHVlIG9mIGNhbnZhcyBtb2RlCisgIHdpbGwgYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBvZiBtZW1fbWFwX21vZGUuCisgIGVuZGlhbiB3aWxsIGJlIGZvcmNlZCBzZXQgdG8gMCBpbgorICBDQU5WQVNfQkxLTU9ERV9MSU5FQVIgbW9kZS4KKyAgb3RoZXJ3aXNlIHBpY3R1cmUgd2lsbCBkaXNwbGF5IGFibm9ybWFsLgorICBpZiB0aGlzIGZsYWcgaXMgbm90IHNldCwgdmFsdWUgb2YgY2FudmFzIG1vZGUKKyAgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSB1c2VyIHNwZWFjZSBjb25maWcuCisgIGVuZGlhbiB3aWxsIGJlIHNldCA3IGluIENBTlZBU19CTEtNT0RFX0xJTkVBUiBtb2RlLgorKi8KKyNkZWZpbmUgSUdOT1JFX1BBUkFNX0ZST01fQ09ORklHICAgICAgMHg4MDAwMDAwCisKKyNkZWZpbmUgTVZDX0VYVEVOU0lPTl9FTkFCTEUgMAorI2RlZmluZSBQUklOVFJFRkxJU1QgIDAKKworI2RlZmluZSBNQVhfTElTVF9TSVpFIDMzCisKKyNkZWZpbmUgSDI2NF9PVVRQVVRfTU9ERV9OT1JNQUwgMHg0CisjZGVmaW5lIEgyNjRfT1VUUFVUX01PREVfRkFTVCAgIDB4OAorCisvLyNkZWZpbmUgRkFMU0UgMAorCisjZGVmaW5lIEgyNjRfU0xJQ0VfSEVBRF9ET05FICAgICAgICAgMHgwMQorI2RlZmluZSBIMjY0X1BJQ19EQVRBX0RPTkUgICAgICAgICAgMHgwMgorLyojZGVmaW5lIEgyNjRfU1BTX0RPTkUgICAgICAgICAgICAgICAweDAzKi8KKy8qI2RlZmluZSBIMjY0X1BQU19ET05FICAgICAgICAgICAgICAgMHgwNCovCisvKiNkZWZpbmUgSDI2NF9TTElDRV9EQVRBX0RPTkUgICAgICAgIDB4MDUqLworLyojZGVmaW5lIEgyNjRfREFUQV9FTkQgICAgICAgICAgICAgICAweDA2Ki8KKworI2RlZmluZSBIMjY0X0NPTkZJR19SRVFVRVNUICAgICAgICAgMHgxMQorI2RlZmluZSBIMjY0X0RBVEFfUkVRVUVTVCAgICAgICAgICAgMHgxMgorI2RlZmluZSBIMjY0X1dSUlNQX1JFUVVFU1QgICAgICAgICAgMHgxMworI2RlZmluZSBIMjY0X1dSUlNQX0RPTkUgICAgICAgICAgICAgMHgxNAorCisjZGVmaW5lIEgyNjRfREVDT0RFX0JVRkVNUFRZICAgICAgICAweDIwCisjZGVmaW5lIEgyNjRfREVDT0RFX1RJTUVPVVQgICAgICAgICAweDIxCisjZGVmaW5lIEgyNjRfU0VBUkNIX0JVRkVNUFRZICAgICAgICAweDIyCisjZGVmaW5lIEgyNjRfREVDT0RFX09WRVJfU0laRSAgICAgICAweDIzCisKKyNkZWZpbmUgVklERU9fU0lHTkFMX0xPVwkJCQkJCTB4MjYKKyNkZWZpbmUgVklERU9fU0lHTkFMX0hJR0hUCQkJCQkJMHgyNworCisKKyNkZWZpbmUgSDI2NF9GSU5EX05FWFRfUElDX05BTCAgICAgICAgICAgICAgMHg1MAorI2RlZmluZSBIMjY0X0ZJTkRfTkVYVF9EVkVMX05BTCAgICAgICAgICAgICAweDUxCisjZGVmaW5lIEgyNjRfQVVYX0RBVEFfUkVBRFkJCQkJCTB4NTIKKworI2RlZmluZSBIMjY0X1NFSV9EQVRBX1JFQURZCQkJCQkweDUzCisjZGVmaW5lIEgyNjRfU0VJX0RBVEFfRE9ORQkJCQkJMHg1NAorCisgICAgLyogMHg4eCwgc2VhcmNoIHN0YXRlKi8KKyNkZWZpbmUgSDI2NF9TVEFURV9TRUFSQ0hfQUZURVJfU1BTICAweDgwCisjZGVmaW5lIEgyNjRfU1RBVEVfU0VBUkNIX0FGVEVSX1BQUyAgMHg4MQorI2RlZmluZSBIMjY0X1NUQVRFX1BBUlNFX1NMSUNFX0hFQUQgIDB4ODIKKyNkZWZpbmUgSDI2NF9TVEFURV9TRUFSQ0hfSEVBRCAgICAgICAweDgzCisgIC8qKi8KKyNkZWZpbmUgSDI2NF9BQ1RJT05fU0VBUkNIX0hFQUQgICAgIDB4ZjAKKyNkZWZpbmUgSDI2NF9BQ1RJT05fREVDT0RFX1NMSUNFICAgIDB4ZjEKKyNkZWZpbmUgSDI2NF9BQ1RJT05fQ09ORklHX0RPTkUgICAgIDB4ZjIKKyNkZWZpbmUgSDI2NF9BQ1RJT05fREVDT0RFX05FV1BJQyAgIDB4ZjMKKyNkZWZpbmUgSDI2NF9BQ1RJT05fREVDT0RFX1NUQVJUICAgIDB4ZmYKKworI2RlZmluZSBSUE1fQkVHSU4JCQkweDAKKyNkZWZpbmUgUlBNX0VORAkJCQkweDQwMAorCisjZGVmaW5lIHZhbChzKSAoc1swXXwoc1sxXTw8MTYpKQorCisjZGVmaW5lIEZSQU1FX0lOX0RQQgkyNAorI2RlZmluZSBEUEJfT0ZGU0VUCQkweDEwMAorI2RlZmluZSBNTUNPX09GRlNFVAkJMHgyMDAKK3VuaW9uIHBhcmFtIHsKKyNpZiAwCisjZGVmaW5lIEhfVElNRV9TVEFNUF9TVEFSVAkwWDAwCisjZGVmaW5lIEhfVElNRV9TVEFNUF9FTkQJMFgxNworI2RlZmluZSBQVFNfWkVST18wCQkwWDE4CisjZGVmaW5lIFBUU19aRVJPXzEJCTBYMTkKKyNlbmRpZgorI2RlZmluZSBGSVhFRF9GUkFNRV9SQVRFX0ZMQUcgICAgICAgICAgICAgICAgICAgMFgyMQorCisjZGVmaW5lIE9GRlNFVF9ERUxJTUlURVJfTE8gICAgICAgICAgICAgICAgICAgICAweDJmCisjZGVmaW5lIE9GRlNFVF9ERUxJTUlURVJfSEkgICAgICAgICAgICAgICAgICAgICAweDMwCisKKworI2RlZmluZSBTTElDRV9JUE9OTFlfQlJFQUsJCQkJCQkwWDVDCisjZGVmaW5lIFBSRVZfTUFYX1JFRkVSRU5DRV9GUkFNRV9OVU0JCQkJCTBYNUQKKyNkZWZpbmUgRU9TCQkJCQkJCQkwWDVFCisjZGVmaW5lIEZSQU1FX1BBQ0tJTkdfVFlQRQkJCQkJCTBYNUYKKyNkZWZpbmUgT0xEX1BPQ19QQVJfMQkJCQkJCQkwWDYwCisjZGVmaW5lIE9MRF9QT0NfUEFSXzIJCQkJCQkJMFg2MQorI2RlZmluZSBQUkVWX01CWAkJCQkJCQkwWDYyCisjZGVmaW5lIFBSRVZfTUJZCQkJCQkJCTBYNjMKKyNkZWZpbmUgRVJST1JfU0tJUF9NQl9OVU0JCQkJCQkwWDY0CisjZGVmaW5lIEVSUk9SX01CX1NUQVRVUwkJCQkJCQkwWDY1CisjZGVmaW5lIEwwX1BJQzBfU1RBVFVTCQkJCQkJCTBYNjYKKyNkZWZpbmUgVElNRU9VVF9DT1VOVEVSCQkJCQkJCTBYNjcKKyNkZWZpbmUgQlVGRkVSX1NJWkUJCQkJCQkJMFg2OAorI2RlZmluZSBCVUZGRVJfU0laRV9ISQkJCQkJCQkwWDY5CisjZGVmaW5lIENST1BQSU5HX0xFRlRfUklHSFQJCQkJCQkwWDZBCisjZGVmaW5lIENST1BQSU5HX1RPUF9CT1RUT00JCQkJCQkwWDZCCisjaWYgMQorIC8qIHNwc19mbGFnczI6CisgKmJpdCAzLCBiaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZworICpiaXQgMiwgcGljX3N0cnVjdF9wcmVzZW50X2ZsYWcKKyAqYml0IDEsIHZjbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcKKyAqYml0IDAsIG5hbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcKKyAqLworI2RlZmluZSBTUFNfRkxBR1MyCQkJCQkJMHg2YworI2RlZmluZSBOVU1fUkVPUkRFUl9GUkFNRVMJCQkJMHg2ZAorI2Vsc2UKKyNkZWZpbmUgUE9DX1NFTEVDVF9ORUVEX1NXQVAJCQkJCQkwWDZDCisjZGVmaW5lIFBPQ19TRUxFQ1RfU1dBUAkJCQkJCQkwWDZECisjZW5kaWYKKyNkZWZpbmUgTUFYX0JVRkZFUl9GUkFNRQkJCQkJCTBYNkUKKworI2RlZmluZSBOT05fQ09ORk9STUlOR19TVFJFQU0JCQkJCQkwWDcwCisjZGVmaW5lIFJFQ09WRVJZX1BPSU5UCQkJCQkJCTBYNzEKKyNkZWZpbmUgUE9TVF9DQU5WQVMJCQkJCQkJMFg3MgorI2RlZmluZSBQT1NUX0NBTlZBU19ICQkJCQkJCTBYNzMKKyNkZWZpbmUgU0tJUF9QSUNfQ09VTlQJCQkJCQkJMFg3NAorI2RlZmluZSBUQVJHRVRfTlVNX1NDQUxJTkdfTElTVAkJCQkJCTBYNzUKKyNkZWZpbmUgRkZfUE9TVF9PTkVfRlJBTUUJCQkJCQkwWDc2CisjZGVmaW5lIFBSRVZJT1VTX0JJVF9DTlQJCQkJCQkwWDc3CisjZGVmaW5lIE1CX05PVF9TSElGVF9DT1VOVAkJCQkJCTBYNzgKKyNkZWZpbmUgUElDX1NUQVRVUwkJCQkJCQkwWDc5CisjZGVmaW5lIEZSQU1FX0NPVU5URVIJCQkJCQkJMFg3QQorI2RlZmluZSBORVdfU0xJQ0VfVFlQRQkJCQkJCQkwWDdCCisjZGVmaW5lIE5FV19QSUNUVVJFX1NUUlVDVFVSRQkJCQkJCTBYN0MKKyNkZWZpbmUgTkVXX0ZSQU1FX05VTQkJCQkJCQkwWDdECisjZGVmaW5lIE5FV19JRFJfUElDX0lECQkJCQkJCTBYN0UKKyNkZWZpbmUgSURSX1BJQ19JRAkJCQkJCQkwWDdGCisKKy8qIGgyNjQgTE9DQUwgKi8KKyNkZWZpbmUgTkFMX1VOSVRfVFlQRQkJCQkJCQkwWDgwCisjZGVmaW5lIE5BTF9SRUZfSURDCQkJCQkJCTBYODEKKyNkZWZpbmUgU0xJQ0VfVFlQRQkJCQkJCQkwWDgyCisjZGVmaW5lIExPRzJfTUFYX0ZSQU1FX05VTQkJCQkJCTBYODMKKyNkZWZpbmUgRlJBTUVfTUJTX09OTFlfRkxBRwkJCQkJCTBYODQKKyNkZWZpbmUgUElDX09SREVSX0NOVF9UWVBFCQkJCQkJMFg4NQorI2RlZmluZSBMT0cyX01BWF9QSUNfT1JERVJfQ05UX0xTQgkJCQkJMFg4NgorI2RlZmluZSBQSUNfT1JERVJfUFJFU0VOVF9GTEFHCQkJCQkJMFg4NworI2RlZmluZSBSRURVTkRBTlRfUElDX0NOVF9QUkVTRU5UX0ZMQUcJCQkJCTBYODgKKyNkZWZpbmUgUElDX0lOSVRfUVBfTUlOVVMyNgkJCQkJCTBYODkKKyNkZWZpbmUgREVCTE9DS0lOR19GSUxURVJfQ09OVFJPTF9QUkVTRU5UX0ZMQUcJCQkJMFg4QQorI2RlZmluZSBOVU1fU0xJQ0VfR1JPVVBTX01JTlVTMQkJCQkJCTBYOEIKKyNkZWZpbmUgTU9ERV84WDhfRkxBR1MJCQkJCQkJMFg4QworI2RlZmluZSBFTlRST1BZX0NPRElOR19NT0RFX0ZMQUcJCQkJCTBYOEQKKyNkZWZpbmUgU0xJQ0VfUVVBTlQJCQkJCQkJMFg4RQorI2RlZmluZSBUT1RBTF9NQl9IRUlHSFQJCQkJCQkJMFg4RgorI2RlZmluZSBQSUNUVVJFX1NUUlVDVFVSRQkJCQkJCTBYOTAKKyNkZWZpbmUgVE9QX0lOVFJBX1RZUEUJCQkJCQkJMFg5MQorI2RlZmluZSBSVl9BSV9TVEFUVVMJCQkJCQkJMFg5MgorI2RlZmluZSBBSV9SRUFEX1NUQVJUCQkJCQkJCTBYOTMKKyNkZWZpbmUgQUlfV1JJVEVfU1RBUlQJCQkJCQkJMFg5NAorI2RlZmluZSBBSV9DVVJfQlVGRkVSCQkJCQkJCTBYOTUKKyNkZWZpbmUgQUlfRE1BX0JVRkZFUgkJCQkJCQkwWDk2CisjZGVmaW5lIEFJX1JFQURfT0ZGU0VUCQkJCQkJCTBYOTcKKyNkZWZpbmUgQUlfV1JJVEVfT0ZGU0VUCQkJCQkJCTBYOTgKKyNkZWZpbmUgQUlfV1JJVEVfT0ZGU0VUX1NBVkUJCQkJCQkwWDk5CisjZGVmaW5lIFJWX0FJX0JVRkZfU1RBUlQJCQkJCQkwWDlBCisjZGVmaW5lIElfUElDX01CX0NPVU5UCQkJCQkJCTBYOUIKKyNkZWZpbmUgQUlfV1JfRENBQ19ETUFfQ1RSTAkJCQkJCTBYOUMKKyNkZWZpbmUgU0xJQ0VfTUJfQ09VTlQJCQkJCQkJMFg5RAorI2RlZmluZSBQSUNUWVBFCQkJCQkJCQkwWDlFCisjZGVmaW5lIFNMSUNFX0dST1VQX01BUF9UWVBFCQkJCQkJMFg5RgorI2RlZmluZSBNQl9UWVBFCQkJCQkJCQkwWEEwCisjZGVmaW5lIE1CX0FGRl9BRERFRF9ETUEJCQkJCQkwWEExCisjZGVmaW5lIFBSRVZJT1VTX01CX1RZUEUJCQkJCQkwWEEyCisjZGVmaW5lIFdFSUdIVEVEX1BSRURfRkxBRwkJCQkJCTBYQTMKKyNkZWZpbmUgV0VJR0hURURfQklQUkVEX0lEQwkJCQkJCTBYQTQKKy8qIGJpdCAzOjIgLSBQSUNUVVJFX1NUUlVDVFVSRQorICogYml0IDEgLSBNQl9BREFQVElWRV9GUkFNRV9GSUVMRF9GTEFHCisgKiBiaXQgMCAtIEZSQU1FX01CU19PTkxZX0ZMQUcKKyAqLworI2RlZmluZSBNQkZGX0lORk8JCQkJCQkJMFhBNQorI2RlZmluZSBUT1BfSU5UUkFfVFlQRV9UT1AJCQkJCQkwWEE2CisKKyNkZWZpbmUgUlZfQUlfQlVGRl9JTkMJCQkJCQkJMHhhNworCisjZGVmaW5lIERFRkFVTFRfTUJfSU5GT19MTwkJCQkJCTB4YTgKKworLyogMCAtLSBubyBuZWVkIHRvIHJlYWQKKyAqIDEgLS0gbmVlZCB0byB3YWl0IExlZnQKKyAqIDIgLS0gbmVlZCB0byByZWFkIEludHJhCisgKiAzIC0tIG5lZWQgdG8gcmVhZCBiYWNrIE1WCisgKi8KKyNkZWZpbmUgTkVFRF9SRUFEX1RPUF9JTkZPCQkJCQkJMHhhOQorLyogMCAtLSBpZGxlCisgKiAxIC0tIHdhaXQgTGVmdAorICogMiAtLSByZWFkaW5nIHRvcCBJbnRyYQorICogMyAtLSByZWFkaW5nIGJhY2sgTVYKKyAqLworI2RlZmluZSBSRUFEX1RPUF9JTkZPX1NUQVRFCQkJCQkJMHhhYQorI2RlZmluZSBEQ0FDX01CWAkJCQkJCQkweGFiCisjZGVmaW5lIFRPUF9NQl9JTkZPX09GRlNFVAkJCQkJCTB4YWMKKyNkZWZpbmUgVE9QX01CX0lORk9fUkRfSURYCQkJCQkJMHhhZAorI2RlZmluZSBUT1BfTUJfSU5GT19XUl9JRFgJCQkJCQkweGFlCisKKyNkZWZpbmUgVkxEX05PX1dBSVQgICAgIDAKKyNkZWZpbmUgVkxEX1dBSVRfQlVGRkVSIDEKKyNkZWZpbmUgVkxEX1dBSVRfSE9TVCAgIDIKKyNkZWZpbmUgVkxEX1dBSVRfR0FQCTMKKworI2RlZmluZSBWTERfV0FJVElORwkJCQkJCQkweGFmCisKKyNkZWZpbmUgTUJfWF9OVU0JCQkJCQkJMHhiMAorLyogI2RlZmluZSBNQl9XSURUSAkJCQkJCQkweGIxICovCisjZGVmaW5lIE1CX0hFSUdIVAkJCQkJCQkweGIyCisjZGVmaW5lIE1CWAkJCQkJCQkJMHhiMworI2RlZmluZSBUT1RBTF9NQlkJCQkJCQkJMHhiNAorI2RlZmluZSBJTlRSX01TS19TQVZFCQkJCQkJCTB4YjUKKworLyogI2RlZmluZSBoYXNfdGltZV9zdGFtcAkJCQkJCTB4YjYgKi8KKyNkZWZpbmUgTkVFRF9ESVNBQkxFX1BQRQkJCQkJCTB4YjYKKyNkZWZpbmUgSVNfTkVXX1BJQ1RVUkUJCQkJCQkJMFhCNworI2RlZmluZSBQUkVWX05BTF9SRUZfSURDCQkJCQkJMFhCOAorI2RlZmluZSBQUkVWX05BTF9VTklUX1RZUEUJCQkJCQkwWEI5CisjZGVmaW5lIEZSQU1FX01CX0NPVU5UCQkJCQkJCTBYQkEKKyNkZWZpbmUgU0xJQ0VfR1JPVVBfVUNPREUJCQkJCQkwWEJCCisjZGVmaW5lIFNMSUNFX0dST1VQX0NIQU5HRV9SQVRFCQkJCQkJMFhCQworI2RlZmluZSBTTElDRV9HUk9VUF9DSEFOR0VfQ1lDTEVfTEVOCQkJCQkwWEJECisjZGVmaW5lIERFTEFZX0xFTkdUSAkJCQkJCQkwWEJFCisjZGVmaW5lIFBJQ1RVUkVfU1RSVUNUCQkJCQkJCTBYQkYKKy8qICNkZWZpbmUgcHJlX3BpY3R1cmVfc3RydWN0CQkJCQkJMHhjMCAqLworI2RlZmluZSBEQ0FDX1BSRVZJT1VTX01CX1RZUEUJCQkJCQkweGMxCisKKyNkZWZpbmUgVElNRV9TVEFNUAkJCQkJCQkwWEMyCisjZGVmaW5lIEhfVElNRV9TVEFNUAkJCQkJCQkwWEMzCisjZGVmaW5lIFZQVFNfTUFQX0FERFIJCQkJCQkJMFhDNAorI2RlZmluZSBIX1ZQVFNfTUFQX0FERFIJCQkJCQkJMFhDNQorCisvKiNkZWZpbmUgTUFYX0RQQl9TSVpFCQkJCQkJCTBYQzYqLworI2RlZmluZSBQSUNfSU5TRVJUX0ZMQUcJCQkJCQkJMFhDNworCisjZGVmaW5lIFRJTUVfU1RBTVBfU1RBUlQJCQkJCQkwWEM4CisjZGVmaW5lIFRJTUVfU1RBTVBfRU5ECQkJCQkJCTBYREYKKworI2RlZmluZSBPRkZTRVRfRk9SX05PTl9SRUZfUElDCQkJCQkJMFhFMAorI2RlZmluZSBPRkZTRVRfRk9SX1RPUF9UT19CT1RUT01fRklFTEQJCQkJCTBYRTIKKyNkZWZpbmUgTUFYX1JFRkVSRU5DRV9GUkFNRV9OVU0JCQkJCQkwWEU0CisjZGVmaW5lIEZSQU1FX05VTV9HQVBfQUxMT1dFRAkJCQkJCTBYRTUKKyNkZWZpbmUgTlVNX1JFRl9GUkFNRVNfSU5fUElDX09SREVSX0NOVF9DWUNMRQkJCQkwWEU2CisjZGVmaW5lIFBST0ZJTEVfSURDX01NQ08JCQkJCQkwWEU3CisjZGVmaW5lIExFVkVMX0lEQ19NTUNPCQkJCQkJCTBYRTgKKyNkZWZpbmUgRlJBTUVfU0laRV9JTl9NQgkJCQkJCTBYRTkKKyNkZWZpbmUgREVMVEFfUElDX09SREVSX0FMV0FZU19aRVJPX0ZMQUcJCQkJMFhFQQorI2RlZmluZSBQUFNfTlVNX1JFRl9JRFhfTDBfQUNUSVZFX01JTlVTMQkJCQkwWEVCCisjZGVmaW5lIFBQU19OVU1fUkVGX0lEWF9MMV9BQ1RJVkVfTUlOVVMxCQkJCTBYRUMKKyNkZWZpbmUgQ1VSUkVOVF9TUFNfSUQJCQkJCQkJMFhFRAorI2RlZmluZSBDVVJSRU5UX1BQU19JRAkJCQkJCQkwWEVFCisvKiBiaXQgMCAtIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgbWF5IGNoYW5nZQorICogYml0IDEgLSBwaWN0dXJlIHBhcmFtZXRlciBzZXQgbWF5IGNoYW5nZQorICogYml0IDIgLSBuZXcgZHBiIGp1c3QgaW5pdGVkCisgKiBiaXQgMyAtIElEUiBwaWN0dXJlIG5vdCBkZWNvZGVkIHlldAorICogYml0IDU6NCAtIDA6IG1iIGxldmVsIGNvZGUgbG9hZGVkIDE6IHBpY3R1cmUKKyAqIGxldmVsIGNvZGUgbG9hZGVkIDI6IHNsaWNlIGxldmVsIGNvZGUgbG9hZGVkCisgKi8KKyNkZWZpbmUgREVDT0RFX1NUQVRVUwkJCQkJCQkwWEVGCisjZGVmaW5lIEZJUlNUX01CX0lOX1NMSUNFCQkJCQkJMFhGMAorI2RlZmluZSBQUkVWX01CX1dJRFRICQkJCQkJCTBYRjEKKyNkZWZpbmUgUFJFVl9GUkFNRV9TSVpFX0lOX01CCQkJCQkJMFhGMgorLyojZGVmaW5lIE1BWF9SRUZFUkVOQ0VfRlJBTUVfTlVNX0lOX01FTQkJMFhGMyovCisvKiBiaXQgMCAtIGFzcGVjdF9yYXRpb19pbmZvX3ByZXNlbnRfZmxhZworICogYml0IDEgLSB0aW1pbmdfaW5mb19wcmVzZW50X2ZsYWcKKyAqIGJpdCAyIC0gbmFsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZworICogYml0IDMgLSB2Y2xfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnCisgKiBiaXQgNCAtIHBpY19zdHJ1Y3RfcHJlc2VudF9mbGFnCisgKiBiaXQgNSAtIGJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnCisgKi8KKyNkZWZpbmUgVlVJX1NUQVRVUwkJCQkJCQkwWEY0CisjZGVmaW5lIEFTUEVDVF9SQVRJT19JREMJCQkJCQkwWEY1CisjZGVmaW5lIEFTUEVDVF9SQVRJT19TQVJfV0lEVEgJCQkJCQkwWEY2CisjZGVmaW5lIEFTUEVDVF9SQVRJT19TQVJfSEVJR0hUCQkJCQkJMFhGNworI2RlZmluZSBOVU1fVU5JVFNfSU5fVElDSwkJCQkJCTBYRjgKKyNkZWZpbmUgVElNRV9TQ0FMRQkJCQkJCQkwWEZBCisjZGVmaW5lIENVUlJFTlRfUElDX0lORk8JCQkJCQkwWEZDCisjZGVmaW5lIERQQl9CVUZGRVJfSU5GTwkJCQkJCQkwWEZECisjZGVmaW5lCVJFRkVSRU5DRV9QT09MX0lORk8JCQkJCQkwWEZFCisjZGVmaW5lIFJFRkVSRU5DRV9MSVNUX0lORk8JCQkJCQkwWEZGCisJc3RydWN0eworCQl1bnNpZ25lZCBzaG9ydCBkYXRhW1JQTV9FTkQtUlBNX0JFR0lOXTsKKwl9IGw7CisJc3RydWN0eworCQl1bnNpZ25lZCBzaG9ydCBkdW1wW0RQQl9PRkZTRVRdOworCQl1bnNpZ25lZCBzaG9ydCBkcGJfYmFzZVtGUkFNRV9JTl9EUEI8PDNdOworCisJCXVuc2lnbmVkIHNob3J0IGRwYl9tYXhfYnVmZmVyX2ZyYW1lOworCQl1bnNpZ25lZCBzaG9ydCBhY3R1YWxfZHBiX3NpemU7CisKKwkJdW5zaWduZWQgc2hvcnQgY29sb2NhdGVkX2J1Zl9zdGF0dXM7CisKKwkJdW5zaWduZWQgc2hvcnQgbnVtX2ZvcndhcmRfc2hvcnRfdGVybV9yZWZlcmVuY2VfcGljOworCQl1bnNpZ25lZCBzaG9ydCBudW1fc2hvcnRfdGVybV9yZWZlcmVuY2VfcGljOworCQl1bnNpZ25lZCBzaG9ydCBudW1fcmVmZXJlbmNlX3BpYzsKKworCQl1bnNpZ25lZCBzaG9ydCBjdXJyZW50X2RwYl9pbmRleDsKKwkJdW5zaWduZWQgc2hvcnQgY3VycmVudF9kZWNvZGVkX2ZyYW1lX251bTsKKwkJdW5zaWduZWQgc2hvcnQgY3VycmVudF9yZWZlcmVuY2VfZnJhbWVfbnVtOworCisJCXVuc2lnbmVkIHNob3J0IGwwX3NpemU7CisJCXVuc2lnbmVkIHNob3J0IGwxX3NpemU7CisKKwkJLyogWzY6NV0gOiBuYWxfcmVmX2lkYyAqLworCQkvKiBbNDowXSA6IG5hbF91bml0X3R5cGUgKi8KKwkJdW5zaWduZWQgc2hvcnQgTkFMX2luZm9fbW1jbzsKKworCQkvKiBbMTowXSA6IDAwIC0gdG9wIGZpZWxkLCAwMSAtIGJvdHRvbSBmaWVsZCwKKwkJICogICAxMCAtIGZyYW1lLCAxMSAtIG1iYWZmIGZyYW1lCisJCSAqLworCQl1bnNpZ25lZCBzaG9ydCBwaWN0dXJlX3N0cnVjdHVyZV9tbWNvOworCisJCXVuc2lnbmVkIHNob3J0IGZyYW1lX251bTsKKwkJdW5zaWduZWQgc2hvcnQgcGljX29yZGVyX2NudF9sc2I7CisKKwkJdW5zaWduZWQgc2hvcnQgbnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMTsKKwkJdW5zaWduZWQgc2hvcnQgbnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMTsKKworCQl1bnNpZ25lZCBzaG9ydCBQcmV2UGljT3JkZXJDbnRMc2I7CisJCXVuc2lnbmVkIHNob3J0IFByZXZpb3VzRnJhbWVOdW07CisKKwkJLyogMzIgYml0cyB2YXJpYWJsZXMgKi8KKwkJdW5zaWduZWQgc2hvcnQgZGVsdGFfcGljX29yZGVyX2NudF9ib3R0b21bMl07CisJCXVuc2lnbmVkIHNob3J0CWRlbHRhX3BpY19vcmRlcl9jbnRfMFsyXTsKKwkJdW5zaWduZWQgc2hvcnQgZGVsdGFfcGljX29yZGVyX2NudF8xWzJdOworCisJCXVuc2lnbmVkIHNob3J0IFByZXZQaWNPcmRlckNudE1zYlsyXTsKKwkJdW5zaWduZWQgc2hvcnQgUHJldkZyYW1lTnVtT2Zmc2V0WzJdOworCisJCXVuc2lnbmVkIHNob3J0IGZyYW1lX3BpY19vcmRlcl9jbnRbMl07CisJCXVuc2lnbmVkIHNob3J0IHRvcF9maWVsZF9waWNfb3JkZXJfY250WzJdOworCQl1bnNpZ25lZCBzaG9ydCBib3R0b21fZmllbGRfcGljX29yZGVyX2NudFsyXTsKKworCQl1bnNpZ25lZCBzaG9ydCBjb2xvY2F0ZWRfbXZfYWRkcl9zdGFydFsyXTsKKwkJdW5zaWduZWQgc2hvcnQgY29sb2NhdGVkX212X2FkZHJfZW5kWzJdOworCQl1bnNpZ25lZCBzaG9ydCBjb2xvY2F0ZWRfbXZfd3JfYWRkclsyXTsKKworCQl1bnNpZ25lZCBzaG9ydCBmcmFtZV9jcm9wX2xlZnRfb2Zmc2V0OworCQl1bnNpZ25lZCBzaG9ydCBmcmFtZV9jcm9wX3JpZ2h0X29mZnNldDsKKwkJdW5zaWduZWQgc2hvcnQgZnJhbWVfY3JvcF90b3Bfb2Zmc2V0OworCQl1bnNpZ25lZCBzaG9ydCBmcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQ7CisJCXVuc2lnbmVkIHNob3J0IGNocm9tYV9mb3JtYXRfaWRjOworCX0gZHBiOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIHNob3J0IGR1bXBbTU1DT19PRkZTRVRdOworCisJCS8qIGFycmF5IGJhc2UgYWRkcmVzcyBmb3Igb2Zmc2V0X2Zvcl9yZWZfZnJhbWUgKi8KKwkJdW5zaWduZWQgc2hvcnQgb2Zmc2V0X2Zvcl9yZWZfZnJhbWVfYmFzZVsxMjhdOworCisJCS8qIDAgLSBJbmRleCBpbiBEUEIKKwkJICogMSAtIFBpY3R1cmUgRmxhZworCQkgKiAgWyAgICAyXSA6IDAgLSBzaG9ydCB0ZXJtIHJlZmVyZW5jZSwKKwkJICogICAgICAgICAgICAxIC0gbG9uZyB0ZXJtIHJlZmVyZW5jZQorCQkgKiAgWyAgICAxXSA6IGJvdHRvbSBmaWVsZAorCQkgKiAgWyAgICAwXSA6IHRvcCBmaWVsZAorCQkgKiAyIC0gUGljdHVyZSBOdW1iZXIgKHNob3J0IHRlcm0gb3IgbG9uZyB0ZXJtKSBsb3cgMTYgYml0cworCQkgKiAzIC0gUGljdHVyZSBOdW1iZXIgKHNob3J0IHRlcm0gb3IgbG9uZyB0ZXJtKSBoaWdoIDE2IGJpdHMKKwkJICovCisJCXVuc2lnbmVkIHNob3J0CXJlZmVyZW5jZV9iYXNlWzEyOF07CisKKwkJLyogY29tbWFuZCBhbmQgcGFyYW1ldGVyLCB1bnRpbCBjb21tYW5kIGlzIDMgKi8KKwkJdW5zaWduZWQgc2hvcnQgbDBfcmVvcmRlcl9jbWRbNjZdOworCQl1bnNpZ25lZCBzaG9ydCBsMV9yZW9yZGVyX2NtZFs2Nl07CisKKwkJLyogY29tbWFuZCBhbmQgcGFyYW1ldGVyLCB1bnRpbCBjb21tYW5kIGlzIDAgKi8KKwkJdW5zaWduZWQgc2hvcnQgbW1jb19jbWRbNDRdOworCisJCXVuc2lnbmVkIHNob3J0IGwwX2Jhc2VbNDBdOworCQl1bnNpZ25lZCBzaG9ydCBsMV9iYXNlWzQwXTsKKwl9IG1tY287CisJc3RydWN0IHsKKwkJLyogZnJvbSB1Y29kZSBsbWVtLCBkbyBub3QgY2hhbmdlIHRoaXMgc3RydWN0ICovCisJfSBwOworfTsKKworCitzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlOworc3RydWN0IFZpZGVvUGFyYW1ldGVyczsKK3N0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlcjsKKworLyogTmV3IGVudW0gZm9yIGZpZWxkIHByb2Nlc3NpbmcgKi8KK2VudW0gUGljdHVyZVN0cnVjdHVyZSB7CisJRlJBTUUsCisJVE9QX0ZJRUxELAorCUJPVFRPTV9GSUVMRAorfTsKKwordHlwZWRlZiBlbnVtIHsKKwlQSUNfU0lOR0xFX0ZSQU1FID0gMCwKKwlQSUNfVE9QLAorCVBJQ19CT1QsCisJUElDX1RPUF9CT1QsCisJUElDX0JPVF9UT1AsCisJUElDX1RPUF9CT1RfVE9QID0gNSwKKwlQSUNfQk9UX1RPUF9CT1QsCisJUElDX0RPVUJMRV9GUkFNRSwKKwlQSUNfVFJJUExFX0ZSQU1FLAorCVBJQ19JTlZBTElELAorfSBQaWNTdHJ1Y3RfRTsKKworI2RlZmluZSBJX1NsaWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUF9TbGljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIEJfU2xpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBQX1NsaWNlXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQl9TbGljZV8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElfU2xpY2VfNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNworCitlbnVtIFNsaWNlVHlwZSB7CisJUF9TTElDRSA9IDAsCisJQl9TTElDRSA9IDEsCisJSV9TTElDRSA9IDIsCisJU1BfU0xJQ0UgPSAzLAorCVNJX1NMSUNFID0gNCwKKwlOVU1fU0xJQ0VfVFlQRVMgPSA1Cit9OworCitlbnVtIFByb2ZpbGVJREMgeworCUZSRVhUX0NBVkxDNDQ0ID0gNDQsICAgLyohPCBZVVYgNDo0OjQvMTQgIkNBVkxDIDQ6NDo0IiovCisJQkFTRUxJTkUgICAgICAgPSA2NiwgICAvKiE8IFlVViA0OjI6MC84ICAiQmFzZWxpbmUiKi8KKwlNQUlOICAgICAgICAgICA9IDc3LCAgIC8qITwgWVVWIDQ6MjowLzggICJNYWluIiovCisJRVhURU5ERUQgICAgICAgPSA4OCwgICAvKiE8IFlVViA0OjI6MC84ICAiRXh0ZW5kZWQiKi8KKwlGUkVYVF9IUCAgICAgICA9IDEwMCwgIC8qITwgWVVWIDQ6MjowLzggICJIaWdoIiovCisJRlJFWFRfSGkxMFAgICAgPSAxMTAsICAvKiE8IFlVViA0OjI6MC8xMCAiSGlnaCAxMCIqLworCUZSRVhUX0hpNDIyICAgID0gMTIyLCAgLyohPCBZVVYgNDoyOjIvMTAgIkhpZ2ggNDoyOjIiKi8KKwlGUkVYVF9IaTQ0NCAgICA9IDI0NCwgIC8qITwgWVVWIDQ6NDo0LzE0ICJIaWdoIDQ6NDo0IiovCisJTVZDX0hJR0ggICAgICAgPSAxMTgsICAvKiE8IFlVViA0OjI6MC84ICAiTXVsdGl2aWV3IEhpZ2giKi8KKwlTVEVSRU9fSElHSCAgICA9IDEyOCAgIC8qITwgWVVWIDQ6MjowLzggICJTdGVyZW8gSGlnaCIqLworfTsKKworZW51bSBGaXJzdEluc2VydEZybV9TdGF0ZSB7CisJRmlyc3RJbnNlcnRGcm1fSURMRSA9IDAsCisJRmlyc3RJbnNlcnRGcm1fT1VUID0gMSwKKwlGaXJzdEluc2VydEZybV9SRVNFVCA9IDIsCisJRmlyc3RJbnNlcnRGcm1fU0tJUERPTkUgPSAzLAorfTsKKworCitzdHJ1Y3QgU1BTUGFyYW1ldGVycyB7CisJdW5zaWduZWQgaW50IHByb2ZpbGVfaWRjOworCXVuc2lnbmVkIGludCBsZXZlbF9pZGM7CisJaW50IHBpY19vcmRlcl9jbnRfdHlwZTsKKwlpbnQgbG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0OworCWludCBudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOworCXNob3J0IG9mZnNldF9mb3JfcmVmX2ZyYW1lWzEyOF07CisJc2hvcnQgb2Zmc2V0X2Zvcl9ub25fcmVmX3BpYzsKKwlzaG9ydCBvZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQ7CisKKwkvKiovCisJaW50IGZyYW1lX21ic19vbmx5X2ZsYWc7CisJaW50IG51bV9yZWZfZnJhbWVzOworCWludCBtYXhfZHBiX3NpemU7CisJaW50IGxvZzJfbWF4X2ZyYW1lX251bV9taW51czQ7CisJaW50IGZyYW1lX251bV9nYXBfYWxsb3dlZDsKK307CisKKyNkZWZpbmUgREVDX1JFRl9QSUNfTUFSS0lOR19CVUZGRVJfTlVNX01BWCAgIDQ1CitzdHJ1Y3QgRGVjUmVmUGljTWFya2luZ19zIHsKKwlpbnQgbWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb247CisJaW50IGRpZmZlcmVuY2Vfb2ZfcGljX251bXNfbWludXMxOworCWludCBsb25nX3Rlcm1fcGljX251bTsKKwlpbnQgbG9uZ190ZXJtX2ZyYW1lX2lkeDsKKwlpbnQgbWF4X2xvbmdfdGVybV9mcmFtZV9pZHhfcGx1czE7CisJc3RydWN0IERlY1JlZlBpY01hcmtpbmdfcyAqTmV4dDsKK307CisKKyNkZWZpbmUgUkVPUkRFUklOR19DT01NQU5EX01BWF9TSVpFICAgIDMzCitzdHJ1Y3QgU2xpY2UgeworCWludCBmaXJzdF9tYl9pbl9zbGljZTsKKwlpbnQgbW9kZV84eDhfZmxhZ3M7CisJaW50IHBpY3R1cmVfc3RydWN0dXJlX21tY287CisKKwlpbnQgZnJhbWVfbnVtOworCWludCBpZHJfZmxhZzsKKwlpbnQgdG9wcG9jOworCWludCBib3R0b21wb2M7CisJaW50IGZyYW1lcG9jOworCWludCBwaWNfb3JkZXJfY250X2xzYjsKKwlpbnQgUGljT3JkZXJDbnRNc2I7CisJdW5zaWduZWQgY2hhciBmaWVsZF9waWNfZmxhZzsKKwl1bnNpZ25lZCBjaGFyIGJvdHRvbV9maWVsZF9mbGFnOworCWludCBUaGlzUE9DOworCWludCBuYWxfcmVmZXJlbmNlX2lkYzsKKwlpbnQgQWJzRnJhbWVOdW07CisJaW50IGRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tOworCWludCBkZWx0YV9waWNfb3JkZXJfY250WzJdOworCisJLyoqLworCWNoYXIgbGlzdFhzaXplWzZdOworCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKmxpc3RYWzZdW01BWF9MSVNUX1NJWkUgKiAyXTsKKworCS8qKi8KKwllbnVtIFBpY3R1cmVTdHJ1Y3R1cmUgc3RydWN0dXJlOworCWludCBsb25nX3Rlcm1fcmVmZXJlbmNlX2ZsYWc7CisJaW50IG5vX291dHB1dF9vZl9wcmlvcl9waWNzX2ZsYWc7CisJaW50IGFkYXB0aXZlX3JlZl9waWNfYnVmZmVyaW5nX2ZsYWc7CisKKwlzdHJ1Y3QgVmlkZW9QYXJhbWV0ZXJzICpwX1ZpZDsKKwlzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiOworCWludCBudW1fcmVmX2lkeF9hY3RpdmVbMl07ICAgIC8qIG51bWJlciBvZiBhdmFpbGFibGUgbGlzdCByZWZlcmVuY2VzICovCisKKwkvKm1vZGlmaWNhdGlvbiovCisJaW50IHNsaWNlX3R5cGU7ICAgIC8qIHNsaWNlIHR5cGUgKi8KKwlpbnQgcmVmX3BpY19saXN0X3Jlb3JkZXJpbmdfZmxhZ1syXTsKKwlpbnQgbW9kaWZpY2F0aW9uX29mX3BpY19udW1zX2lkY1syXVtSRU9SREVSSU5HX0NPTU1BTkRfTUFYX1NJWkVdOworCWludCBhYnNfZGlmZl9waWNfbnVtX21pbnVzMVsyXVtSRU9SREVSSU5HX0NPTU1BTkRfTUFYX1NJWkVdOworCWludCBsb25nX3Rlcm1fcGljX2lkeFsyXVtSRU9SREVSSU5HX0NPTU1BTkRfTUFYX1NJWkVdOworCS8qKi8KKwl1bnNpZ25lZCBjaGFyIGRlY19yZWZfcGljX21hcmtpbmdfYnVmZmVyX3ZhbGlkOworCXN0cnVjdCBEZWNSZWZQaWNNYXJraW5nX3MKKwkJZGVjX3JlZl9waWNfbWFya2luZ19idWZmZXJbREVDX1JFRl9QSUNfTUFSS0lOR19CVUZGRVJfTlVNX01BWF07CisJaW50IHBpY19zdHJ1Y3Q7Cit9OworCitzdHJ1Y3QgT2xkU2xpY2VQYXJhbXMgeworCXVuc2lnbmVkIGludCBmaWVsZF9waWNfZmxhZzsKKwl1bnNpZ25lZCBpbnQgZnJhbWVfbnVtOworCWludCAgICAgIG5hbF9yZWZfaWRjOworCXVuc2lnbmVkIGludCBwaWNfb2Rlcl9jbnRfbHNiOworCWludCAgICAgIGRlbHRhX3BpY19vZGVyX2NudF9ib3R0b207CisJaW50ICAgICAgZGVsdGFfcGljX29yZGVyX2NudFsyXTsKKwl1bnNpZ25lZCBjaGFyICAgICBib3R0b21fZmllbGRfZmxhZzsKKwl1bnNpZ25lZCBjaGFyICAgICBpZHJfZmxhZzsKKwlpbnQgICAgICBpZHJfcGljX2lkOworCWludCAgICAgIHBwc19pZDsKKyNpZiAoTVZDX0VYVEVOU0lPTl9FTkFCTEUpCisJaW50ICAgICAgdmlld19pZDsKKwlpbnQgICAgICBpbnRlcl92aWV3X2ZsYWc7CisJaW50ICAgICAgYW5jaG9yX3BpY19mbGFnOworI2VuZGlmCisJaW50ICAgICAgbGF5ZXJfaWQ7Cit9OworCitzdHJ1Y3QgVmlkZW9QYXJhbWV0ZXJzIHsKKwlpbnQgUHJldlBpY09yZGVyQ250TXNiOworCWludCBQcmV2UGljT3JkZXJDbnRMc2I7CisJdW5zaWduZWQgY2hhciBsYXN0X2hhc19tbWNvXzU7CisJdW5zaWduZWQgY2hhciBsYXN0X3BpY19ib3R0b21fZmllbGQ7CisJaW50IFRoaXNQT0M7CisJaW50IFByZXZpb3VzRnJhbWVOdW07CisJaW50IEZyYW1lTnVtT2Zmc2V0OworCWludCBQcmV2aW91c0ZyYW1lTnVtT2Zmc2V0OworCWludCBtYXhfZnJhbWVfbnVtOworCXVuc2lnbmVkIGludCBwcmVfZnJhbWVfbnVtOworCWludCBFeHBlY3RlZERlbHRhUGVyUGljT3JkZXJDbnRDeWNsZTsKKwlpbnQgUGljT3JkZXJDbnRDeWNsZUNudDsKKwlpbnQgRnJhbWVOdW1JblBpY09yZGVyQ250Q3ljbGU7CisJaW50IEV4cGVjdGVkUGljT3JkZXJDbnQ7CisKKwkvKiovCisJc3RydWN0IFNQU1BhcmFtZXRlcnMgKmFjdGl2ZV9zcHM7CisJc3RydWN0IFNsaWNlICoqcHBTbGljZUxpc3Q7CisJaW50IGlTbGljZU51bU9mQ3VyclBpYzsKKwlpbnQgY29uY2VhbF9tb2RlOworCWludCBlYXJsaWVyX21pc3NpbmdfcG9jOworCWludCBwb2NzX2luX2RwYlsxMDBdOworCisJc3RydWN0IE9sZFNsaWNlUGFyYW1zIG9sZF9zbGljZTsKKwkvKiovCisJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqZGVjX3BpY3R1cmU7CisJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqbm9fcmVmZXJlbmNlX3BpY3R1cmU7CisKKwkvKm1vZGlmaWNhdGlvbiovCisJaW50IG5vbl9jb25mb3JtaW5nX3N0cmVhbTsKKwlpbnQgcmVjb3ZlcnlfcG9pbnQ7Cit9OworCitzdGF0aWMgaW5saW5lIGludCBpbWluKGludCBhLCBpbnQgYikKK3sKKwlyZXR1cm4gKChhKSA8IChiKSkgPyAoYSkgOiAoYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGltYXgoaW50IGEsIGludCBiKQoreworCXJldHVybiAoKGEpID4gKGIpKSA/IChhKSA6IChiKTsKK30KKworI2RlZmluZSBNQVhfUElDX0JVRl9OVU0gMTI4CisjZGVmaW5lIE1BWF9OVU1fU0xJQ0VTIDUwCisKK3N0cnVjdCBTdG9yYWJsZVBpY3R1cmUgeworLyoqLworCWludCB3aWR0aDsKKwlpbnQgaGVpZ2h0OworCisJaW50IHlfY2FudmFzX2luZGV4OworCWludCB1X2NhbnZhc19pbmRleDsKKwlpbnQgdl9jYW52YXNfaW5kZXg7CisvKiovCisJaW50IGluZGV4OworCXVuc2lnbmVkIGNoYXIgaXNfdXNlZDsKKworCWVudW0gUGljdHVyZVN0cnVjdHVyZSBzdHJ1Y3R1cmU7CisKKwlpbnQgICAgICAgICBwb2M7CisJaW50ICAgICAgICAgdG9wX3BvYzsKKwlpbnQgICAgICAgICBib3R0b21fcG9jOworCWludCAgICAgICAgIGZyYW1lX3BvYzsKKwl1bnNpZ25lZCBpbnQgIGZyYW1lX251bTsKKwl1bnNpZ25lZCBpbnQgIHJlY292ZXJ5X2ZyYW1lOworCisJaW50ICAgICAgICAgcGljX251bTsKKwlpbnQgICAgICAgICBidWZfc3BlY19udW07CisJaW50ICAgICAgICAgYnVmX3NwZWNfaXNfYWxsb2NlZDsKKwlpbnQgICAgICAgICBjb2xvY2F0ZWRfYnVmX2luZGV4OworCWludCAgICAgICAgIGxvbmdfdGVybV9waWNfbnVtOworCWludCAgICAgICAgIGxvbmdfdGVybV9mcmFtZV9pZHg7CisKKwl1bnNpZ25lZCBjaGFyICBpc19sb25nX3Rlcm07CisJaW50ICAgICAgICAgdXNlZF9mb3JfcmVmZXJlbmNlOworCWludCAgICAgICAgIGlzX291dHB1dDsKKyNpZiAxCisJLyogcmFpbiAqLworCWludCAgICAgICAgIHByZV9vdXRwdXQ7CisjZW5kaWYKKwlpbnQgICAgICAgICBub25fZXhpc3Rpbmc7CisJaW50ICAgICAgICAgc2VwYXJhdGVfY29sb3VyX3BsYW5lX2ZsYWc7CisKKwlzaG9ydCAgICAgICBtYXhfc2xpY2VfaWQ7CisKKwlpbnQgICAgICAgICBzaXplX3gsIHNpemVfeSwgc2l6ZV94X2NyLCBzaXplX3lfY3I7CisJaW50ICAgICAgICAgc2l6ZV94X20xLCBzaXplX3lfbTEsIHNpemVfeF9jcl9tMSwgc2l6ZV95X2NyX20xOworCWludCAgICAgICAgIGNvZGVkX2ZyYW1lOworCWludCAgICAgICAgIG1iX2FmZl9mcmFtZV9mbGFnOworCXVuc2lnbmVkIGludCBQaWNXaWR0aEluTWJzOworCXVuc2lnbmVkIGludCBQaWNTaXplSW5NYnM7CisJaW50ICAgICAgICAgaUx1bWFQYWRZLCBpTHVtYVBhZFg7CisJaW50ICAgICAgICAgaUNocm9tYVBhZFksIGlDaHJvbWFQYWRYOworCisJLyogZm9yIG1iIGFmZiwgaWYgZnJhbWUgZm9yIHJlZmVyZW5jaW5nIHRoZSB0b3AgZmllbGQgKi8KKwlzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICp0b3BfZmllbGQ7CisJLyogZm9yIG1iIGFmZiwgaWYgZnJhbWUgZm9yIHJlZmVyZW5jaW5nIHRoZSBib3R0b20gZmllbGQgKi8KKwlzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpib3R0b21fZmllbGQ7CisJLyogZm9yIG1iIGFmZiwgaWYgZmllbGQgZm9yIHJlZmVyZW5jaW5nIHRoZSBjb21iaW5lZCBmcmFtZSAqLworCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKmZyYW1lOworCisJaW50ICAgICAgICAgc2xpY2VfdHlwZTsKKwlpbnQgICAgICAgICBpZHJfZmxhZzsKKwlpbnQgICAgICAgICBub19vdXRwdXRfb2ZfcHJpb3JfcGljc19mbGFnOworCWludCAgICAgICAgIGxvbmdfdGVybV9yZWZlcmVuY2VfZmxhZzsKKwlpbnQgICAgICAgICBhZGFwdGl2ZV9yZWZfcGljX2J1ZmZlcmluZ19mbGFnOworCisJaW50ICAgICAgICAgY2hyb21hX2Zvcm1hdF9pZGM7CisJaW50ICAgICAgICAgZnJhbWVfbWJzX29ubHlfZmxhZzsKKwlpbnQgICAgICAgICBmcmFtZV9jcm9wcGluZ19mbGFnOworCWludCAgICAgICAgIGZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQ7CisJaW50ICAgICAgICAgZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQ7CisJaW50ICAgICAgICAgZnJhbWVfY3JvcF90b3Bfb2Zmc2V0OworCWludCAgICAgICAgIGZyYW1lX2Nyb3BfYm90dG9tX29mZnNldDsKKwlpbnQgICAgICAgICBxcDsKKwlpbnQgICAgICAgICBjaHJvbWFfcXBfb2Zmc2V0WzJdOworCWludCAgICAgICAgIHNsaWNlX3FwX2RlbHRhOworCS8qIHN0b3JlcyB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgY29udHJvbCBvcGVyYXRpb25zICovCisJc3RydWN0IERlY1JlZlBpY01hcmtpbmdfcyAqZGVjX3JlZl9waWNfbWFya2luZ19idWZmZXI7CisKKwkvKiBwaWN0dXJlIGVycm9yIGNvbmNlYWxtZW50ICovCisJLyppbmRpY2F0ZXMgaWYgdGhpcyBpcyBhIGNvbmNlYWxlZCBwaWN0dXJlICovCisJaW50ICAgICAgICAgY29uY2VhbGVkX3BpYzsKKworCS8qIHZhcmlhYmxlcyBmb3IgdG9uZSBtYXBwaW5nICovCisJaW50ICAgICAgICAgc2VpSGFzVG9uZV9tYXBwaW5nOworCWludCAgICAgICAgIHRvbmVfbWFwcGluZ19tb2RlbF9pZDsKKwlpbnQgICAgICAgICB0b25lbWFwcGVkX2JpdF9kZXB0aDsKKwkvKiBpbWdwZWwqICAgICB0b25lX21hcHBpbmdfbHV0OyB0b25lIG1hcHBpbmcgbG9vayB1cCB0YWJsZSAqLworCisJaW50ICAgICAgICAgcHJvY19mbGFnOworI2lmIChNVkNfRVhURU5TSU9OX0VOQUJMRSkKKwlpbnQgICAgICAgICB2aWV3X2lkOworCWludCAgICAgICAgIGludGVyX3ZpZXdfZmxhZzsKKwlpbnQgICAgICAgICBhbmNob3JfcGljX2ZsYWc7CisjZW5kaWYKKwlpbnQgICAgICAgICBpTHVtYVN0cmlkZTsKKwlpbnQgICAgICAgICBpQ2hyb21hU3RyaWRlOworCWludCAgICAgICAgIGlMdW1hRXhwYW5kZWRIZWlnaHQ7CisJaW50ICAgICAgICAgaUNocm9tYUV4cGFuZGVkSGVpZ2h0OworCS8qIGltZ3BlbCAqKmN1cl9pbWdZOyBmb3IgbW9yZSBlZmZpY2llbnQgZ2V0X2Jsb2NrX2x1bWEgKi8KKwlpbnQgbm9fcmVmOworCWludCBpQ29kaW5nVHlwZTsKKworCWNoYXIgbGlzdFhzaXplW01BWF9OVU1fU0xJQ0VTXVsyXTsKKwlzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICoqbGlzdFhbTUFYX05VTV9TTElDRVNdWzJdOworCWludCAgICAgICAgIGxheWVyX2lkOworCXUzMiAJICAgICAgIG9mZnNldF9kZWxpbWl0ZXI7CisJdTMyICAgICAgICAgcHRzOworCXU2NCAgICAgICAgIHB0czY0OworCXU2NCAgICAgICAgIHRpbWVzdGFtcDsKKwl1bnNpZ25lZCBjaGFyIGRhdGFfZmxhZzsKKwlpbnQgcGljX3N0cnVjdDsKKworCS8qIHBpY3R1cmUgcW9zIGluZm9tYXRpb24qLworCWludCBmcmFtZV9zaXplOworCWludCBtYXhfcXA7CisJaW50IGF2Z19xcDsKKwlpbnQgbWluX3FwOworCWludCBtYXhfc2tpcDsKKwlpbnQgYXZnX3NraXA7CisJaW50IG1pbl9za2lwOworCWludCBtYXhfbXY7CisJaW50IG1pbl9tdjsKKwlpbnQgYXZnX212OworCXUzMiBwaWNfc2l6ZTsKK307CisKK3N0cnVjdCBGcmFtZVN0b3JlIHsKKwkvKiByYWluICovCisJaW50ICAgICAgYnVmX3NwZWNfbnVtOworCS8qIHJhaW4gKi8KKwlpbnQgICAgICBjb2xvY2F0ZWRfYnVmX2luZGV4OworCisJLyogMD1lbXB0eTsgMT10b3A7IDI9Ym90dG9tOyAzPWJvdGggZmllbGRzIChvciBmcmFtZSkgKi8KKwlpbnQgICAgICAgaXNfdXNlZDsKKwkvKiAwPW5vdCB1c2VkIGZvciByZWY7IDE9dG9wIHVzZWQ7IDI9Ym90dG9tIHVzZWQ7CisJICogMz1ib3RoIGZpZWxkcyAob3IgZnJhbWUpIHVzZWQKKwkgKi8KKwlpbnQgICAgICAgaXNfcmVmZXJlbmNlOworCS8qIDA9bm90IHVzZWQgZm9yIHJlZjsgMT10b3AgdXNlZDsgMj1ib3R0b20gdXNlZDsKKwkgKiAzPWJvdGggZmllbGRzIChvciBmcmFtZSkgdXNlZAorCSAqLworCWludCAgICAgICBpc19sb25nX3Rlcm07CisJLyogb3JpZ2luYWwgbWFya2luZyBieSBuYWxfcmVmX2lkYzogMD1ub3QgdXNlZCBmb3IgcmVmOyAxPXRvcCB1c2VkOworCSAqIDI9Ym90dG9tIHVzZWQ7IDM9Ym90aCBmaWVsZHMgKG9yIGZyYW1lKSB1c2VkCisJICovCisJaW50ICAgICAgIGlzX29yaWdfcmVmZXJlbmNlOworCisJaW50ICAgICAgIGlzX25vbl9leGlzdGVudDsKKworCXVuc2lnbmVkIGludCBmcmFtZV9udW07CisJdW5zaWduZWQgaW50IHJlY292ZXJ5X2ZyYW1lOworCisJaW50ICAgICAgIGZyYW1lX251bV93cmFwOworCWludCAgICAgICBsb25nX3Rlcm1fZnJhbWVfaWR4OworCWludCAgICAgICBpc19vdXRwdXQ7CisjaWYgMQorCS8qIHJhaW4gKi8KKwlpbnQgICAgICAgICBwcmVfb3V0cHV0OworCS8qIGluZGV4IGluIGdGcmFtZVN0b3JlICovCisJaW50ICAgICAgIGluZGV4OworI2RlZmluZSBJX0ZMQUcJCQkweDAxCisjZGVmaW5lIElEUl9GTEFHCQkweDAyCisjZGVmaW5lIEVSUk9SX0ZMQUcJCTB4MTAKKyNkZWZpbmUgTlVMTF9GTEFHCQkweDIwCisjZGVmaW5lIE5PRElTUF9GTEFHCQkweDgwCisJdW5zaWduZWQgY2hhciBkYXRhX2ZsYWc7CisjZW5kaWYKKwlpbnQgICAgICAgcG9jOworCisJLyogcGljdHVyZSBlcnJvciBjb25jZWFsbWVudCAqLworCWludCBjb25jZWFsbWVudF9yZWZlcmVuY2U7CisKKwlzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpmcmFtZTsKKwlzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICp0b3BfZmllbGQ7CisJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqYm90dG9tX2ZpZWxkOworCisjaWYgKE1WQ19FWFRFTlNJT05fRU5BQkxFKQorCWludCAgICAgICB2aWV3X2lkOworCWludCAgICAgICBpbnRlcl92aWV3X2ZsYWdbMl07CisJaW50ICAgICAgIGFuY2hvcl9waWNfZmxhZ1syXTsKKyNlbmRpZgorCWludCAgICAgICBsYXllcl9pZDsKKwl1MzIgCSAgb2Zmc2V0X2RlbGltaXRlcjsKKwl1MzIgICAgICAgcHRzOworCXU2NCAgICAgICBwdHM2NDsKKwl1NjQgICAgICAgdGltZXN0YW1wOworCisKKwkvKiBwaWN0dXJlIHFvcyBpbmZvbWF0aW9uKi8KKwlpbnQgc2xpY2VfdHlwZTsKKwlpbnQgZnJhbWVfc2l6ZTsKKworCWludCBtYXhfcXA7CisJaW50IGF2Z19xcDsKKwlpbnQgbWluX3FwOworCWludCBtYXhfc2tpcDsKKwlpbnQgYXZnX3NraXA7CisJaW50IG1pbl9za2lwOworCWludCBtYXhfbXY7CisJaW50IG1pbl9tdjsKKwlpbnQgYXZnX212OworCWludCBkcGJfZnJhbWVfY291bnQ7CisJdTMyIGh3X2RlY29kZV90aW1lOworCXUzMiBmcmFtZV9zaXplMjsgLy8gRm9yIHJlY29yZGluZyB0aGUgY2h1bmstPnNpemUgaW4gZnJhbWUgbW9kZQorCWJvb2wgc2hvd19mcmFtZTsKKwlzdHJ1Y3QgZG1hX2ZlbmNlICpmZW5jZTsKKwl1MzIgZGVjb2RlZF9mcmFtZV9zaXplOworfTsKKworLyogI2RlZmluZSBEUEJfU0laRV9NQVggICAgIDE2ICovCisjZGVmaW5lIERQQl9TSVpFX01BWCAgICAgMzIKK3N0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciB7CisJc3RydWN0IFZpZGVvUGFyYW1ldGVycyAqcF9WaWQ7CisJLyogSW5wdXRQYXJhbWV0ZXJzICpwX0lucDsgPz8/ICovCisJc3RydWN0IEZyYW1lU3RvcmUgICpmc1tEUEJfU0laRV9NQVhdOworCXN0cnVjdCBGcmFtZVN0b3JlICAqZnNfcmVmW0RQQl9TSVpFX01BWF07CisJc3RydWN0IEZyYW1lU3RvcmUgICpmc19sdHJlZltEUEJfU0laRV9NQVhdOworCS8qIGludGVyLWxheWVyIHJlZmVyZW5jZSAoZm9yIG11bHRpLWxheWVyZWQgY29kZWNzKSAqLworCXN0cnVjdCBGcmFtZVN0b3JlICAqZnNfaWxyZWZbRFBCX1NJWkVfTUFYXTsKKwkvKiovCisJc3RydWN0IEZyYW1lU3RvcmUgKmZzX2xpc3QwW0RQQl9TSVpFX01BWF07CisJc3RydWN0IEZyYW1lU3RvcmUgKmZzX2xpc3QxW0RQQl9TSVpFX01BWF07CisJc3RydWN0IEZyYW1lU3RvcmUgKmZzX2xpc3RsdFtEUEJfU0laRV9NQVhdOworCisJLyoqLworCXVuc2lnbmVkIGludCBzaXplOworCXVuc2lnbmVkIGludCB1c2VkX3NpemU7CisJdW5zaWduZWQgaW50IHJlZl9mcmFtZXNfaW5fYnVmZmVyOworCXVuc2lnbmVkIGludCBsdHJlZl9mcmFtZXNfaW5fYnVmZmVyOworCWludCAgICAgICAgICAgbGFzdF9vdXRwdXRfcG9jOworI2lmIChNVkNfRVhURU5TSU9OX0VOQUJMRSkKKwlpbnQgICAgICAgICAgIGxhc3Rfb3V0cHV0X3ZpZXdfaWQ7CisjZW5kaWYKKwlpbnQgICAgICAgICAgIG1heF9sb25nX3Rlcm1fcGljX2lkeDsKKworCisJaW50ICAgICAgICAgICBpbml0X2RvbmU7CisJaW50ICAgICAgICAgICBmaXJzdF9waWNfZG9uZTsgLypieSByYWluKi8KKwlpbnQgICAgICAgICAgIG51bV9yZWZfZnJhbWVzOworCisJc3RydWN0IEZyYW1lU3RvcmUgICAqbGFzdF9waWN0dXJlOworCXVuc2lnbmVkIGludCB1c2VkX3NpemVfaWw7CisJaW50ICAgICAgICAgIGxheWVyX2lkOworCisJLyogRFBCIHJlbGF0ZWQgZnVuY3Rpb247ICovCit9OworCitzdHJ1Y3QgaDI2NF9kcGJfc3RydSB7CisJc3RydWN0IHZkZWNfcyAqdmRlYzsKKwlpbnQgZGVjb2Rlcl9pbmRleDsKKworCXVuaW9uIHBhcmFtIGRwYl9wYXJhbTsKKworCWludCBkZWNvZGVfaWR4OworCWludCBidWZfbnVtOworCWludCBjdXJyX1BPQzsKKwlpbnQgcmVvcmRlcl9waWNfbnVtOworCXVuc2lnbmVkIGludCBkZWNfZHBiX3NpemU7CisJdTggZmFzdF9vdXRwdXRfZW5hYmxlOworCQkvKnBvY19ldmVuX2ZsYWc6CisJCSAwLCBpbml0OyAxLCBvZGQ7IDIsIGV2ZW4qLworCXU4IHBvY19ldmVuX29kZF9mbGFnOworCXUzMiBkZWNvZGVfcGljX2NvdW50OworCS8qKi8KKwl1bnNpZ25lZCBpbnQgbWF4X3JlZmVyZW5jZV9zaXplOworCisJdW5zaWduZWQgaW50IGNvbG9jYXRlZF9idWZfbWFwOworCXVuc2lnbmVkIGludCBjb2xvY2F0ZWRfYnVmX2NvdW50OworCXVuc2lnbmVkIGludCBjb2xvY2F0ZWRfbXZfYWRkcl9zdGFydDsKKwl1bnNpZ25lZCBpbnQgY29sb2NhdGVkX212X2FkZHJfZW5kOworCXVuc2lnbmVkIGludCBjb2xvY2F0ZWRfYnVmX3NpemU7CisKKwlzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgbURQQjsKKwlzdHJ1Y3QgU2xpY2UgbVNsaWNlOworCXN0cnVjdCBWaWRlb1BhcmFtZXRlcnMgbVZpZGVvOworCXN0cnVjdCBTUFNQYXJhbWV0ZXJzIG1TUFM7CisKKwlzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlIG1fUElDW01BWF9QSUNfQlVGX05VTV07CisJc3RydWN0IEZyYW1lU3RvcmUgbUZyYW1lU3RvcmVbRFBCX1NJWkVfTUFYXTsKKworCS8qdnVpKi8KKwl1bnNpZ25lZCBpbnQgdnVpX3N0YXR1czsKKwl1bnNpZ25lZCBpbnQgbnVtX3VuaXRzX2luX3RpY2s7CisJdW5zaWduZWQgaW50IHRpbWVfc2NhbGU7CisJdW5zaWduZWQgaW50IGZpeGVkX2ZyYW1lX3JhdGVfZmxhZzsKKwl1bnNpZ25lZCBpbnQgYXNwZWN0X3JhdGlvX2lkYzsKKwl1bnNpZ25lZCBpbnQgYXNwZWN0X3JhdGlvX3Nhcl93aWR0aDsKKwl1bnNpZ25lZCBpbnQgYXNwZWN0X3JhdGlvX3Nhcl9oZWlnaHQ7CisJdTggYml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWc7CisJdTE2IG51bV9yZW9yZGVyX2ZyYW1lczsKKwl1MTYgbWF4X2RlY19mcmFtZV9idWZmZXJpbmc7CisKKwl1bnNpZ25lZCBpbnQgZnJhbWVfY3JvcF9sZWZ0X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQ7CisJdW5zaWduZWQgaW50IGZyYW1lX2Nyb3BfdG9wX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0OworCXVuc2lnbmVkIGludCBjaHJvbWFfZm9ybWF0X2lkYzsKKworCXVuc2lnbmVkIGludCBkZWNfZHBiX3N0YXR1czsKKwl1bnNpZ25lZCBpbnQgbGFzdF9kcGJfc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgYnVmX2FsbG9jX2ZhaWw7CisJdW5zaWduZWQgaW50IGRwYl9lcnJvcl9mbGFnOworCXVuc2lnbmVkIGludCByZW9yZGVyX291dHB1dDsKKwl1bnNpZ25lZCBpbnQgZmlyc3RfaW5zZXJ0X2ZyYW1lOworCWludCBmaXJzdF9vdXRwdXRfcG9jOworCWludCBkcGJfZnJhbWVfY291bnQ7CisJdTMyIHdpdGhvdXRfZGlzcGxheV9tb2RlOworCWludCBsb25nX3Rlcm1fcmVmZXJlbmNlX2ZsYWc7Cit9OworCisKK2V4dGVybiB1bnNpZ25lZCBpbnQgaDI2NF9kZWJ1Z19mbGFnOworZXh0ZXJuIHVuc2lnbmVkIGludCBoMjY0X2RlYnVnX21hc2s7CisKK2ludCBkcGJfcHJpbnQoaW50IGluZGV4dCwgaW50IGRlYnVnX2ZsYWcsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKworaW50IGRwYl9wcmludF9jb250KGludCBpbmRleCwgaW50IGRlYnVnX2ZsYWcsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKwordW5zaWduZWQgY2hhciBkcGJfaXNfZGVidWcoaW50IGluZGV4LCBpbnQgZGVidWdfZmxhZyk7CisKK2ludCBwcmVwYXJlX2Rpc3BsYXlfYnVmKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHN0cnVjdCBGcmFtZVN0b3JlICpmcmFtZSk7CisKK2ludCByZWxlYXNlX2J1Zl9zcGVjX251bShzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgYnVmX3NwZWNfbnVtKTsKKwordm9pZCBzZXRfZnJhbWVfb3V0cHV0X2ZsYWcoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIsIGludCBpbmRleCk7CisKK2ludCBpc190aGVyZV91bnVzZWRfZnJhbWVfZnJvbV9kcGIoc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYik7CisKK2ludCBoMjY0X3NsaWNlX2hlYWRlcl9wcm9jZXNzKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLCBpbnQgKmZyYW1lX251bV9nYXApOworCit2b2lkIGRwYl9pbml0X2dsb2JhbChzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiwKKwlpbnQgaWQsIGludCBhY3R1YWxfZHBiX3NpemUsIGludCBtYXhfcmVmZXJlbmNlX3NpemUpOworCit2b2lkIGluaXRfY29sb2NhdGVfYnVmKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLCBpbnQgY291bnQpOworCitpbnQgcmVsZWFzZV9jb2xvY2F0ZV9idWYoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIsIGludCBpbmRleCk7CisKK2ludCBnZXRfZnJlZV9idWZfaWR4KHN0cnVjdCB2ZGVjX3MgKnZkZWMpOworCitpbnQgc3RvcmVfcGljdHVyZV9pbl9kcGIoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIsCisJCQlzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpwLCB1bnNpZ25lZCBjaGFyIGRhdGFfZmxhZyk7CisKK2ludCByZWxlYXNlX3BpY3R1cmUoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIsCisJCQlzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpwaWMpOworCit2b2lkIHJlbW92ZV9kcGJfcGljdHVyZXMoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIpOworCit2b2lkIGJ1Zm1ncl9wb3N0KHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiKTsKKwordm9pZCBidWZtZ3JfZm9yY2VfcmVjb3ZlcihzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYik7CisKK2ludCBnZXRfbG9uZ190ZXJtX2ZsYWdfYnlfYnVmX3NwZWNfbnVtKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLAorCWludCBidWZfc3BlY19udW0pOworCit2b2lkIGJ1Zm1ncl9oMjY0X3JlbW92ZV91bnVzZWRfZnJhbWUoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIsCisJdTggZm9yY2VfZmxhZyk7CisKK3ZvaWQgZmx1c2hfZHBiKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiKTsKKwordm9pZCBwcmludF9waWNfaW5mbyhpbnQgZGVjaW5kZXgsIGNvbnN0IGNoYXIgKmluZm8sCisJCQlzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpwaWMsCisJCQlpbnQgc2xpY2VfdHlwZSk7Cit2b2lkIGR1bXBfZHBiKHN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIsIHU4IGZvcmNlKTsKKwordm9pZCBkdW1wX3BpYyhzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYik7CisKK3ZvaWQgKiB2aDI2NF9nZXRfYnVmc3BlY19sb2NrKHN0cnVjdCB2ZGVjX3MgKnZkZWMpOworCitlbnVtIFBpY3R1cmVTdHJ1Y3R1cmUgZ2V0X2N1cl9zbGljZV9waWN0dXJlX3N0cnVjdCgKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYik7CisKK2ludCBkcGJfY2hlY2tfcmVmX2xpc3RfZXJyb3IoCisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIpOworCit2b2lkIHVubWFya19mb3JfcmVmZXJlbmNlKHN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIsCisJc3RydWN0IEZyYW1lU3RvcmUgKmZzKTsKKwordm9pZCB1cGRhdGVfcmVmX2xpc3Qoc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYik7CisKK2ludCBwb3N0X3BpY3R1cmVfZWFybHkoc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGluZGV4KTsKKworaW50IGlzX3VzZWRfZm9yX3JlZmVyZW5jZShzdHJ1Y3QgRnJhbWVTdG9yZSAqZnMpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9oMjY0X211bHRpL3ZtaDI2NC5jIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL2gyNjRfbXVsdGkvdm1oMjY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkzMmM5MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9oMjY0X211bHRpL3ZtaDI2NC5jCkBAIC0wLDAgKzEsMTEyNzIgQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvYW1wb3J0cy92aDI2NC5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisjZGVmaW5lIERFQlVHCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL2Ftc3RyZWFtLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9mcmFtZV9zeW5jL3B0c3NlcnYuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NhbnZhcy9jYW52YXMuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWVfcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWVfcmVjZWl2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL3Zmb3JtYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2ZyYW1lX3N5bmMvdHN5bmMuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1jb250aWd1b3VzLmg+CisjaW5jbHVkZSAiLi4vLi4vLi4vc3RyZWFtX2lucHV0L2FtcG9ydHMvYW1wb3J0c19wcml2LmgiCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jb2RlY19tbS9jb2RlY19tbS5oPgorI2luY2x1ZGUgIi4uL3V0aWxzL3ZkZWNfaW5wdXQuaCIKKy8vI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvdGVlLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC90ZWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC9jbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmRlY19yZWcuaD4KKyNpbmNsdWRlICIuLi91dGlscy92ZGVjLmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvYW12ZGVjLmgiCisjaW5jbHVkZSAiLi4vaDI2NC92aDI2NC5oIgorI2luY2x1ZGUgIi4uLy4uLy4uL3N0cmVhbV9pbnB1dC9hbXBvcnRzL3N0cmVhbWJ1Zi5oIgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jb2RlY19tbS9jb25maWdzLmg+CisjaW5jbHVkZSAiLi4vdXRpbHMvZGVjb2Rlcl9tbXVfYm94LmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvZGVjb2Rlcl9ibW11X2JveC5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2Zpcm13YXJlLmgiCisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgIi4uL3V0aWxzL2NvbmZpZ19wYXJzZXIuaCIKKyNpbmNsdWRlICIuLi8uLi8uLi9jb21tb24vY2hpcHMvZGVjb2Rlcl9jcHVfdmVyX2luZm8uaCIKKyNpbmNsdWRlICIuLi91dGlscy92ZGVjX3Y0bDJfYnVmZmVyX29wcy5oIgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1tZW0ybWVtLmg+CisjaW5jbHVkZSAiLi4vdXRpbHMvdmRlY19mZWF0dXJlLmgiCisKKworI2RlZmluZSBERVRFQ1RfV1JPTkdfTVVMVElfU0xJQ0UKKworLyoKK3RvIGVuYWJsZSBEViBvZiBmcmFtZSBtb2RlCisjZGVmaW5lIERPTEJZX01FVEFfU1VQUE9SVCBpbiB1Y29kZQorKi8KKworI3VuZGVmIHByX2luZm8KKyNkZWZpbmUgcHJfaW5mbyBwcmludGsKKyNkZWZpbmUgVkRFQ19EVworI2RlZmluZSBERUJVR19VQ09ERQorI2RlZmluZSBNRU1fTkFNRSAiY29kZWNfbTI2NCIKKyNkZWZpbmUgTVVMVElfSU5TVEFOQ0VfRlJBTUVXT1JLCisvKiAjZGVmaW5lIE9ORV9DT0xPQ0FURV9CVUZfUEVSX0RFQ09ERV9CVUYgKi8KKyNpbmNsdWRlICJoMjY0X2RwYi5oIgorLyogI2RlZmluZSBTRU5EX1BBUkFNX1dJVEhfUkVHICovCisKKyNkZWZpbmUgRFJJVkVSX05BTUUgImFtbXZkZWNfaDI2NCIKKyNkZWZpbmUgRFJJVkVSX0hFQURFUl9OQU1FICJhbW12ZGVjX2gyNjRfaGVhZGVyIgorCisjZGVmaW5lIENIRUNLX0lOVEVSVkFMICAgICAgICAoSFovMTAwKQorCisjZGVmaW5lIFNFSV9EQVRBX1NJWkUJCQkoOCoxMDI0KQorI2RlZmluZSBTRUlfSVRVX0RBVEFfU0laRQkJKDQqMTAyNCkKKworI2RlZmluZSBSQVRFX01FQVNVUkVfTlVNIDgKKyNkZWZpbmUgUkFURV9DT1JSRUNUSU9OX1RIUkVTSE9MRCA1CisjZGVmaW5lIFJBVEVfMjM5N19GUFMgIDQwMDQgICAvKiAyMy45NyAqLworI2RlZmluZSBSQVRFXzI1X0ZQUyAgMzg0MCAgIC8qIDI1ICovCisjZGVmaW5lIFJBVEVfMjk5N19GUFMgIDMyMDMgICAvKiAyOS45NyAqLworI2RlZmluZSBEVVIyUFRTKHgpICgoeCkqOTAvOTYpCisjZGVmaW5lIFBUUzJEVVIoeCkgKCh4KSo5Ni85MCkKKyNkZWZpbmUgRFVSMlBUU19SRU0oeCkgKHgqOTAgLSBEVVIyUFRTKHgpKjk2KQorI2RlZmluZSBGSVhfRlJBTUVfUkFURV9DSEVDS19JRlJBTUVfTlVNIDIKKworI2RlZmluZSBGSVhfRlJBTUVfUkFURV9PRkYgICAgICAgICAgICAgICAgMAorI2RlZmluZSBGSVhfRlJBTUVfUkFURV9PTiAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBGSVhfRlJBTUVfUkFURV9TTU9PVEhfQ0hFQ0tJTkcgICAgMgorCisjZGVmaW5lIERFQ19DT05UUk9MX0ZMQUdfRk9SQ0VfMjk5N18xMDgwUF9JTlRFUkxBQ0UgMHgwMDAxCisjZGVmaW5lIERFQ19DT05UUk9MX0ZMQUdfRk9SQ0VfMjUwMF81NzZQX0lOVEVSTEFDRSAgMHgwMDAyCisjZGVmaW5lIERFQ19DT05UUk9MX0ZMQUdfRk9SQ0VfUkFURV8yMzk3X0ZQU19GSVhfRlJBTUVfUkFURSAgMHgwMDEwCisjZGVmaW5lIERFQ19DT05UUk9MX0ZMQUdfRk9SQ0VfUkFURV8yOTk3X0ZQU19GSVhfRlJBTUVfUkFURSAgMHgwMDIwCisKKyNkZWZpbmUgREVDT0RFX0lEKGh3KSAoaHdfdG9fdmRlYyhodyktPmlkKQorCisjZGVmaW5lIFJBVEVfTUVBU1VSRV9OVU0gOAorI2RlZmluZSBSQVRFX0NPUlJFQ1RJT05fVEhSRVNIT0xEIDUKKyNkZWZpbmUgUkFURV8yNF9GUFMgIDQwMDQJLyogMjMuOTcgKi8KKyNkZWZpbmUgUkFURV8yNV9GUFMgIDM4NDAJLyogMjUgKi8KKyNkZWZpbmUgRFVSMlBUUyh4KSAoKHgpKjkwLzk2KQorI2RlZmluZSBQVFMyRFVSKHgpICgoeCkqOTYvOTApCisjZGVmaW5lIERVUjJQVFNfUkVNKHgpICh4KjkwIC0gRFVSMlBUUyh4KSo5NikKKyNkZWZpbmUgRklYX0ZSQU1FX1JBVEVfQ0hFQ0tfSURSRlJBTUVfTlVNIDIKKworI2RlZmluZSBBTElHTl9XSURUSCh4KSAoQUxJR04oKHgpLCA2NCkpCisjZGVmaW5lIEFMSUdOX0hFSUdIVCh4KSAoQUxJR04oKHgpLCAzMikpCisKKyNkZWZpbmUgSDI2NF9ERVZfTlVNICAgICAgICA5CisKKyNkZWZpbmUgQ09OU1RSQUlOX01BWF9CVUZfTlVNCisKKyNkZWZpbmUgSDI2NF9NTVUKKyNkZWZpbmUgVklERU9fU0lHTkFMX1RZUEVfQVZBSUxBQkxFX01BU0sJMHgyMDAwMDAwMAorI2RlZmluZSBJTlZBTElEX0lEWCAtMSAgLyogSW52YWxpZCBidWZmZXIgaW5kZXguKi8KKworc3RhdGljIGludCBtbXVfZW5hYmxlOworLyptbXUgZG8gbm90IHN1cHBvcnQgbWJhZmYqLworc3RhdGljIGludCBmb3JjZV9lbmFibGVfbW11ID0gMDsKK3Vuc2lnbmVkIGludCBoMjY0X2RlYnVnX2ZsYWc7IC8qIDB4YTAwMDAwMDA7ICovCit1bnNpZ25lZCBpbnQgaDI2NF9kZWJ1Z19tYXNrID0gMHhmZjsKKwkvKgorCSAqaDI2NF9kZWJ1Z19jbWQ6CisJICoJMHgxeHgsIGZvcmNlIGRlY29kZXIgaWQgb2YgeHggdG8gYmUgZGlzY29ubmVjdGVkCisJICovCit1bnNpZ25lZCBpbnQgaDI2NF9kZWJ1Z19jbWQ7CisKK3N0YXRpYyBpbnQgcmVmX2JfZnJhbWVfZXJyb3JfbWF4X2NvdW50ID0gNTA7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVjX2NvbnRyb2wgPQorCURFQ19DT05UUk9MX0ZMQUdfRk9SQ0VfMjk5N18xMDgwUF9JTlRFUkxBQ0UgfAorCURFQ19DT05UUk9MX0ZMQUdfRk9SQ0VfMjUwMF81NzZQX0lOVEVSTEFDRTsKKworc3RhdGljIHVuc2lnbmVkIGludCBmb3JjZV9yYXRlX3N0cmVhbWJhc2U7CitzdGF0aWMgdW5zaWduZWQgaW50IGZvcmNlX3JhdGVfZnJhbWViYXNlOworc3RhdGljIHVuc2lnbmVkIGludCBmb3JjZV9kaXNwX2J1ZnNwZWNfbnVtOworc3RhdGljIHVuc2lnbmVkIGludCBmaXhlZF9mcmFtZV9yYXRlX21vZGU7CitzdGF0aWMgdW5zaWduZWQgaW50IGVycm9yX3JlY292ZXJ5X21vZGVfaW47CitzdGF0aWMgaW50IHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwgPSAweDQwMDA7CitzdGF0aWMgaW50IHByZV9kZWNvZGVfYnVmX2xldmVsID0gMHgxMDAwOworc3RhdGljIGludCBzdHJlYW1fbW9kZV9zdGFydF9udW0gPSA0Oworc3RhdGljIGludCBkaXJ0eV9hZ2Fpbl90aHJlc2hvbGQgPSAxMDA7CitzdGF0aWMgdW5zaWduZWQgaW50IGNvbG9jYXRlX29sZF9jYWw7CisKKworc3RhdGljIGludCBjaGVja19kaXJ0eV9kYXRhKHN0cnVjdCB2ZGVjX3MgKnZkZWMpOworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisvKnRvIG1ha2UgcmVvcmRlciBzaXplIGRpZmZlcmVuY2Ugb2YgYmwgYW5kIGVsIG5vdCB0b28gYmlnKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmVvcmRlcl9kcGJfc2l6ZV9tYXJnaW5fZHYgPSAxNjsKKyNlbmRpZgorc3RhdGljIHVuc2lnbmVkIGludCByZW9yZGVyX2RwYl9zaXplX21hcmdpbiA9IDY7CitzdGF0aWMgdW5zaWduZWQgaW50IHJlZmVyZW5jZV9idWZfbWFyZ2luID0gNDsKKworI2lmZGVmIENPTlNUUkFJTl9NQVhfQlVGX05VTQorc3RhdGljIHUzMiBydW5fcmVhZHlfbWF4X3ZmX29ubHlfbnVtOworc3RhdGljIHUzMiBydW5fcmVhZHlfZGlzcGxheV9xX251bTsKKwkvKjA6IG5vdCBjaGVjaworCSAgMHhmZjogbURQQi5zaXplCisJICAqLworc3RhdGljIHUzMiBydW5fcmVhZHlfbWF4X2J1Zl9udW0gPSAweGZmOworI2VuZGlmCisKK3N0YXRpYyB1MzIgcnVuX3JlYWR5X21pbl9idWZfbnVtID0gMjsKKworI2RlZmluZSBWREVDX0FTU0lTVF9DQU5WQVNfQkxLMzIJCTB4NQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X2FsbG9jX2J1Zl9jb3VudDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVjb2RlX3RpbWVvdXRfdmFsID0gMTAwOworc3RhdGljIHVuc2lnbmVkIGludCBlcnJvcmRhdGFfdGltZW91dF92YWwgPSA1MDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X2RhdGFfdGltZW91dF92YWwgPSAyMDAwOworI2lmIDEKKy8qIEgyNjRfREFUQV9SRVFVRVNUIGRvZXMgbm90IHdvcmssIGRpc2FibGUgaXQsCitkZWNvZGUgaGFzIGVycm9yIGZvciBkYXRhIGluIG5vbmUgY29udGludW91cyBhZGRyZXNzCisqLworc3RhdGljIHVuc2lnbmVkIGludCBmcmFtZV9tYXhfZGF0YV9wYWNrZXQ7CisjZWxzZQorc3RhdGljIHVuc2lnbmVkIGludCBmcmFtZV9tYXhfZGF0YV9wYWNrZXQgPSA4OworI2VuZGlmCitzdGF0aWMgdW5zaWduZWQgaW50IHJhZHI7CitzdGF0aWMgdW5zaWduZWQgaW50IHJ2YWw7CitzdGF0aWMgdTMyIGVuZGlhbiA9IDB4ZmYwOworCisvKgorCXVkZWJ1Z19mbGFnOgorCWJpdCAwLCBlbmFibGUgdWNvZGUgcHJpbnQKKwliaXQgMSwgZW5hYmxlIHVjb2RlIGRldGFpbCBwcmludAorCWJpdCAzLCBkaXNhYmxlIHVjb2RlIHdhdGNoZG9nCisJYml0IFszMToxNl0gbm90IDAsIHBvcyB0byBkdW1wIGxtZW0KKwkJYml0IDIsIHBvcCBiaXRzIHRvIGxtZW0KKwkJYml0IFsxMTo4XSwgcHJlLXBvcCBiaXRzIGZvciBhbGlnbm1lbnQgKHdoZW4gYml0IDIgaXMgMSkKKyovCitzdGF0aWMgdTMyIHVkZWJ1Z19mbGFnOworLyoKKwl3aGVuIHVkZWJ1Z19mbGFnWzE6MF0gaXMgbm90IDAKKwl1ZGVidWdfcGF1c2VfcG9zIG5vdCAwLAorCQlwYXVzZSBwb3NpdGlvbgorKi8KK3N0YXRpYyB1MzIgdWRlYnVnX3BhdXNlX3BvczsKKy8qCisJd2hlbiB1ZGVidWdfZmxhZ1sxOjBdIGlzIG5vdCAwCisJYW5kIHVkZWJ1Z19wYXVzZV9wb3MgaXMgbm90IDAsCisJCXBhdXNlIG9ubHkgd2hlbiBERUJVR19SRUcyIGlzIGVxdWFsIHRvIHRoaXMgdmFsCisqLworc3RhdGljIHUzMiB1ZGVidWdfcGF1c2VfdmFsOworCitzdGF0aWMgdTMyIHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4OworCitzdGF0aWMgdW5zaWduZWQgaW50IGRpc3BfdmZyYW1lX3ZhbHZlX2xldmVsOworCitzdGF0aWMgdW5zaWduZWQgaW50IG1heF9kZWNvZGVfaW5zdGFuY2VfbnVtID0gSDI2NF9ERVZfTlVNOworc3RhdGljIHVuc2lnbmVkIGludCBkZWNvZGVfZnJhbWVfY291bnRbSDI2NF9ERVZfTlVNXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGlzcGxheV9mcmFtZV9jb3VudFtIMjY0X0RFVl9OVU1dOworc3RhdGljIHVuc2lnbmVkIGludCBtYXhfcHJvY2Vzc190aW1lW0gyNjRfREVWX05VTV07CitzdGF0aWMgdW5zaWduZWQgaW50IG1heF9nZXRfZnJhbWVfaW50ZXJ2YWxbSDI2NF9ERVZfTlVNXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnVuX2NvdW50W0gyNjRfREVWX05VTV07CitzdGF0aWMgdW5zaWduZWQgaW50IGlucHV0X2VtcHR5W0gyNjRfREVWX05VTV07CitzdGF0aWMgdW5zaWduZWQgaW50IG5vdF9ydW5fcmVhZHlbSDI2NF9ERVZfTlVNXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmVmX2ZyYW1lX21hcmtfZmxhZ1tIMjY0X0RFVl9OVU1dID0KK3sxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxfTsKKworI2RlZmluZSBWREVDX0NMT0NLX0FESlVTVF9GUkFNRSAzMAorc3RhdGljIHVuc2lnbmVkIGludCBjbGtfYWRqX2ZyYW1lX2NvdW50OworCisvKgorICpiaXRbMzowXTogMCwgcnVuIDsgMSwgcGF1c2U7IDMsIHN0ZXAKKyAqYml0WzRdOiAxLCBzY2hlZHVsZSBydW4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBzdGVwW0gyNjRfREVWX05VTV07CisKKyNkZWZpbmUgQVVYX0JVRl9BTElHTihhZHIpICgoYWRyICsgMHhmKSAmICh+MHhmKSkKK3N0YXRpYyB1MzIgcHJlZml4X2F1eF9idWZfc2l6ZSA9ICgxNiAqIDEwMjQpOworc3RhdGljIHUzMiBzdWZmaXhfYXV4X2J1Zl9zaXplOworCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KK3N0YXRpYyB1MzIgZHZfdG9nZ2xlX3Byb3ZfbmFtZTsKKworc3RhdGljIHUzMiBkb2xieV9tZXRhX3dpdGhfZWw7CisjZW5kaWYKKworLyoKKwliaXRbOF0KKwkJMDogdXNlIHN5c19pbmZvW2JpdCAzXQorCQlub3QgMDp1c2UgaV9vbmx5X2ZsYWdbNzowXQorCQkJYml0Wzc6MF06CisJCQkJYml0IDAsIDE6IG9ubHkgZGlzcGxheSBJIHBpY3R1cmU7CisJCQkJYml0IDEsIDE6IG9ubHkgZGVjb2RlIEkgcGljdHVyZTsKKyovCitzdGF0aWMgdW5zaWduZWQgaW50IGlfb25seV9mbGFnOworCisvKgorCWVycm9yX3Byb2NfcG9saWN5OgorCWJpdFswXSBzZW5kX2Vycm9yX2ZyYW1lX2ZsYWc7CisJCSh2YWxpZCB3aGVuIGJpdFszMV0gaXMgMSwgb3RoZXJ3aXNlIHVzZSBzeXNpbmZvKQorCWJpdFsxXSBkbyBub3QgZGVjb2RlIGlmIGNvbmZpZ19kZWNvZGVfYnVmKCkgZmFpbAorCWJpdFsyXSBmb3JjZSByZWxlYXNlIGJ1ZiBpZiBpbiBkZWFkbG9jaworCWJpdFszXSBmb3JjZSBzbGlkaW5nIHdpbmRvdyByZWZfZnJhbWVzX2luX2J1ZmZlciA+IG51bV9yZWZfZnJhbWVzCisJYml0WzRdIGNoZWNrIGluYWN0aXZlIG9mIHJlY2VpdmVyCisJYml0WzVdIHJlc2V0IGJ1ZmZtZ3IgaWYgaW4gZGVhZGxvY2sKKwliaXRbNl0gcmVzZXQgYnVmZm1nciBpZiBidWZzcGVjLCBjb2xsb2NhdGUgYnVmLCBwaWMgYWxsb2MgZmFpbAorCWJpdFs3XSByZXNldCBidWZmbWdyIGlmIGRwYiBlcnJvcgorCisJYml0WzhdIGNoZWNrIHRvdGFsIG1ieC9tYnkgb2YgZGVjb2RlZCBmcmFtZQorCWJpdFs5XSBjaGVjayBFUlJPUl9TVEFUVVNfUkVHCisJYml0WzEwXSBjaGVjayByZWZlcmVuY2UgbGlzdAorCWJpdFsxMV0gbWFyayBlcnJvciBpZiBkcGIgZXJyb3IKKwliaXRbMTJdIGlfb25seSB3aGVuIGVycm9yIGhhcHBlbgorCWJpdFsxM10gMDogbWFyayBlcnJvciBhY2NvcmRpbmcgdG8gbGFzdCBwaWMsIDE6IGlnbm9yZSBtYXJrIGVycm9yCisJYml0WzE0XSAwOiByZXN1bHQgZG9uZSB3aGVuIHRpbWVvdXQgZnJvbSB1Y29kZS4gMTogcmVzZXQgYnVmbWdyIHdoZW4gdGltZW91dC4KKwliaXRbMTVdIDE6IGRwYl9mcmFtZV9jb3VudCBJZiB0aGUgZHBiX2ZyYW1lX2NvdW50IGRpZmZlcmVuY2UgaXMgbGFyZ2UsIGl0IG1vdmVzIG91dCBvZiB0aGUgRFBCIGJ1ZmZlci4KKwliaXRbMTZdIDE6IGNoZWNrIHNsaWNlIGhlYWRlciBudW1iZXIuCisJYml0WzE3XSAxOiBJZiB0aGUgZGVjb2RlZCBNYiBjb3VudCBpcyBpbnN1ZmZpY2llbnQgYnV0IGdyZWF0ZXIgdGhhbiB0aGUgdGhyZXNob2xkLCBpdCBpcyBjb25zaWRlcmVkIHRoZSBjb3JyZWN0IGZyYW1lLgorCWJpdFsxOF0gMTogdGltZSBvdXQgc3RhdHVzLCBzdG9yZSBwaWMgdG8gZHBiIGJ1ZmZlci4KKwliaXRbMTldIDE6IElmIGEgbG90IGIgZnJhbWVzIGFyZSB3cm9uZyBjb25zZWN1dGl2ZWx5LCB0aGUgRFBCIHF1ZXVlIHJlc2V0LgorCWJpdFsyMF0gMTogZml4ZWQgc29tZSBlcnJvciBzdHJlYW0gd2lsbCBsZWFkIHRvIHRoZSBkaWZmdXNpb24gb2YgdGhlIGVycm9yLCByZXN1bHRpbmcgcGxheWJhY2sgc3R1Y2suCisJYml0WzIxXSAxOiBmaXhlZCBEVkIgbG9vcCBwbGF5YmFjayBjYXVzZSBqZXR0ZXIgaXNzdWUuCisJYml0WzIyXSAxOiBJbiBzdHJlYW1pbmcgbW9kZSwgc3VwcG9ydCBmb3IgZGlzY2FyZGluZyBkYXRhLgorCWJpdFsyM10gMDogc2V0IGVycm9yIGZsYWcgb24gZnJhbWUgbnVtYmVyIGdhcCBlcnJvciBhbmQgZHJvcCBpdCwgMTogaWdub3JlIGVycm9yLgorKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXJyb3JfcHJvY19wb2xpY3kgPSAweDdmQ2ZiNjsgLyoweDFmMTQqLworCisKKy8qCisJZXJyb3Jfc2tpcF9jb3VudDoKKwliaXRbMTE6MF0gZXJyb3Igc2tpcCBmcmFtZSBjb3VudAorCWJpdFsxNToxMl0gZXJyb3Igc2tpcCBpIHBpY3R1cmUgY291bnQKKyovCitzdGF0aWMgdW5zaWduZWQgaW50IGVycm9yX3NraXBfY291bnQgPSAoMHgyIDw8IDEyKSB8IDB4NDA7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZm9yY2Vfc2xpZGluZ19tYXJnaW47CisvKgorCWJpdFsxOjBdOgorCTAsIHN0YXJ0IHBsYXlpbmcgZnJvbSBhbnkgZnJhbWUKKwkxLCBzdGFydCBwbGF5aW5nIGZyb20gSSBmcmFtZQorCQliaXRbMTU6OF06IHRoZSBjb3VudCBvZiBza2lwIGZyYW1lcyBhZnRlciBmaXJzdCBJCisJMiwgc3RhcnQgcGxheWluZyBmcm9tIHNlY29uZCBJIGZyYW1lIChkZWNvZGUgZnJvbSB0aGUgZmlyc3QgSSkKKwkJYml0WzE1OjhdOiB0aGUgbWF4IGNvdW50IG9mIHNraXAgZnJhbWVzIGFmdGVyIGZpcnN0IEkKKwkzLCBzdGFydCBwbGF5aW5nIGZyb20gSURSCisqLworc3RhdGljIHVuc2lnbmVkIGludCBmaXJzdF9pX3BvbGljeSA9IDE7CisKKy8qCisJZmFzdF9vdXRwdXRfZW5hYmxlOgorCWJpdCBbMF0sIG91dHB1dCBmcmFtZSBpZiB0aGVyZSBpcyBJRFIgaW4gbGlzdAorCWJpdCBbMV0sIG91dHB1dCBmcmFtZSBpZiB0aGUgY3VycmVudCBwb2MgaXMgMSBiaWcgdGhhbiB0aGUgcHJldmlvdXMgcG9jCisJYml0IFsyXSwgaWYgZXZlbiBwb2Mgb25seSwgb3V0cHV0IGZyYW1lIGlmdGhlIGN1dXJlbnQgcG9jCisJCQlpcyAyIGJpZyB0aGFuIHRoZSBwcmV2aW91cyBwb2MKKwliaXQgWzNdLCAgaXAgb25seQorKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZmFzdF9vdXRwdXRfZW5hYmxlID0gSDI2NF9PVVRQVVRfTU9ERV9OT1JNQUw7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZW5hYmxlX2l0dV90MzUgPSAxOworCitzdGF0aWMgdW5zaWduZWQgaW50IGZybWJhc2VfY29udF9iaXRsZXZlbCA9IDB4NDA7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZnJtYmFzZV9jb250X2JpdGxldmVsMiA9IDB4MTsKKworc3RhdGljIHVuc2lnbmVkIGludCBjaGVja19zbGljZV9udW0gPSAzMDsKKworc3RhdGljIHVuc2lnbmVkIGludCBtYl9jb3VudF90aHJlc2hvbGQgPSA1OyAvKnBlcmNlbnRhZ2UqLworCisjZGVmaW5lIE1IMjY0X1VTRVJEQVRBX0VOQUJMRQorCisvKiBET1VCTEVfV1JJVEVfTU9ERSBpcyBlbmFibGVkIG9ubHkgd2hlbiBOVjIxIDggYml0IG91dHB1dCBpcyBuZWVkZWQgKi8KKy8qIGhldmMtPmRvdWJsZV93cml0ZV9tb2RlOgorCTAsIG5vIGRvdWJsZSB3cml0ZQorCTEsIDE6MSByYXRpbworCTIsICgxLzQpOigxLzQpIHJhdGlvCisJMywgKDEvNCk6KDEvNCkgcmF0aW8sIHdpdGggYm90aCBjb21wcmVzc2VkIGZyYW1lIGluY2x1ZGVkCisJNCwgKDEvMik6KDEvMikgcmF0aW8KKwkweDEwLCBkb3VibGUgd3JpdGUgb25seQorCTB4MTAwMDA6IHZkZWMgZHcgaG9yaXpvdGFsIDEvMgorCTB4MjAwMDA6IHZkZWMgZHcgaG9yaXpvdGFsL3ZlcnRpY2FsICAxLzIKKyovCitzdGF0aWMgdTMyIGRvdWJsZV93cml0ZV9tb2RlOworc3RhdGljIHUzMiB3aXRob3V0X2Rpc3BsYXlfbW9kZTsKKworc3RhdGljIGludCBsb29wX3BsYXliYWNrX3BvY190aHJlc2hvbGQgPSA0MDA7CitzdGF0aWMgaW50IHBvY190aHJlc2hvbGQgPSA1MDsKKworc3RhdGljIHUzMiBsb29rdXBfY2hlY2tfY29udXQgPSAzMDsKKworCisvKgorICpbMzowXSAwOiBkZWZhdWx0IHVzZSBjb25maWcgZnJvbSBvbXguCisgKiAgICAgIDE6IGZvcmNlIGVuYWJsZSBmZW5jZS4KKyAqICAgICAgMjogZGlzYWJsZSBmZW5jZS4KKyAqWzc6NF0gMDogZmVuY2UgdXNlIGZvciBkcml2ZXIuCisgKiAgICAgIDE6IGZlbmNlIGZkIHVzZSBmb3IgYXBwLgorICovCitzdGF0aWMgdTMyIGZvcmNlX2NvbmZpZ19mZW5jZTsKKworI2RlZmluZSBJU19WREVDX0RXKGh3KSAgKGh3LT5kb3VibGVfd3JpdGVfbW9kZSA+PiAxNiAmIDB4ZikKKworc3RhdGljIHZvaWQgdm1oMjY0X2R1bXBfc3RhdGUoc3RydWN0IHZkZWNfcyAqdmRlYyk7CisKKyNkZWZpbmUgaXNfaW5fcGFyc2luZ19zdGF0ZShzdGF0dXMpIFwKKwkJKChzdGF0dXMgPT0gSDI2NF9BQ1RJT05fU0VBUkNIX0hFQUQpIHx8IFwKKwkJCSgoc3RhdHVzICYgMHhmMCkgPT0gMHg4MCkpCisKKyNkZWZpbmUgaXNfaW50ZXJsYWNlKGZyYW1lKQlcCisJCQkoKGZyYW1lLT5mcmFtZSAmJlwKKwkJCWZyYW1lLT50b3BfZmllbGQgJiZcCisJCQlmcmFtZS0+Ym90dG9tX2ZpZWxkICYmXAorCQkJKCFmcmFtZS0+ZnJhbWUtPmNvZGVkX2ZyYW1lKSkgfHwgXAorCQkJKGZyYW1lLT5mcmFtZSAmJiBcCisJCQkgZnJhbWUtPmZyYW1lLT5jb2RlZF9mcmFtZSAmJiBcCisJCQkgKCFmcmFtZS0+ZnJhbWUtPmZyYW1lX21ic19vbmx5X2ZsYWcpICYmIFwKKwkJCSBmcmFtZS0+ZnJhbWUtPnN0cnVjdHVyZSA9PSBGUkFNRSkpCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBjbG9zZV90byhpbnQgYSwgaW50IGIsIGludCBtKQoreworCXJldHVybiAoYWJzKGEgLSBiKSA8IG0pID8gdHJ1ZSA6IGZhbHNlOworfQorCisjaWYgMAorI2RlZmluZSBoMjY0X2FsbG9jX2h3X3N0cnUoZGV2LCBzaXplLCBvcHQpIGRldm1fa3phbGxvYyhkZXYsIHNpemUsIG9wdCkKKyNkZWZpbmUgaDI2NF9mcmVlX2h3X3N0cnUoZGV2LCBodykgZGV2bV9rZnJlZShkZXYsIGh3KQorI2Vsc2UKKyNkZWZpbmUgaDI2NF9hbGxvY19od19zdHJ1KGRldiwgc2l6ZSwgb3B0KSB2emFsbG9jKHNpemUpCisjZGVmaW5lIGgyNjRfZnJlZV9od19zdHJ1KGRldiwgaHcpIHZmcmVlKGh3KQorI2VuZGlmCisKKy8qICNpZiBNRVNPTl9DUFVfVFlQRSA+PSBNRVNPTl9DUFVfVFlQRV9NRVNPTjYgKi8KKyNkZWZpbmUgTlYyMQorLyogI2VuZGlmICovCisKKy8qIDEyTSBmb3IgTDQxICovCisjZGVmaW5lIE1BWF9EUEJfQlVGRl9TSVpFICAgICAgICgxMioxMDI0KjEwMjQpCisjZGVmaW5lIERFRkFVTFRfTUVNX1NJWkUgICAgICAgICgzMioxMDI0KjEwMjQpCisjZGVmaW5lIEFWSUxfRFBCX0JVRkZfU0laRSAgICAgIDB4MDFlYzIwMDAKKworI2RlZmluZSBERUZfQlVGX1NUQVJUX0FERFIJCQkweDAwMDAwMDAwCisjZGVmaW5lIG1lbV9zcHNfYmFzZQkJCQkweDAxYzNjMDAKKyNkZWZpbmUgbWVtX3Bwc19iYXNlCQkJCTB4MDFjYmMwMAorLyojZGVmaW5lIFZfQlVGX0FERFJfT0ZGU0VUICAgICAgICAgICAgICgweDEzZTAwMCkqLwordTMyIFZfQlVGX0FERFJfT0ZGU0VUID0gMHgyMDAwMDA7CisjZGVmaW5lIERDQUNfUkVBRF9NQVJHSU4JKDY0ICogMTAyNCkKKworCisjZGVmaW5lIEVYVEVORF9TQVIgICAgICAgICAgICAgICAgICAgICAgMHhmZgorI2RlZmluZSBCVUZTUEVDX1BPT0xfU0laRQkJNjQKKyNkZWZpbmUgVkZfUE9PTF9TSVpFICAgICAgICA2NAorI2RlZmluZSBWRl9QT09MX05VTQkJCTIKKyNkZWZpbmUgTUFYX1ZGX0JVRl9OVU0gICAgICAgICAgMjcKKyNkZWZpbmUgQk1NVV9NQVhfQlVGRkVSUwkoQlVGU1BFQ19QT09MX1NJWkUgKyAzKQorI2RlZmluZSBCTU1VX1JFRl9JRFgJKEJVRlNQRUNfUE9PTF9TSVpFKQorI2RlZmluZSBCTU1VX0RQQl9JRFgJKEJVRlNQRUNfUE9PTF9TSVpFICsgMSkKKyNkZWZpbmUgQk1NVV9FWFRJRl9JRFgJKEJVRlNQRUNfUE9PTF9TSVpFICsgMikKKyNkZWZpbmUgRVhUSUZfQlVGX1NJWkUgICAoMHgxMDAwMCAqIDIpCisKKyNkZWZpbmUgSEVBREVSX0JVRkZFUl9JRFgobikgKG4pCisjZGVmaW5lIFZGX0JVRkZFUl9JRFgobikJKG4pCisKKworI2RlZmluZSBQVVRfSU5URVJWQUwgICAgICAgIChIWi8xMDApCisjZGVmaW5lIE5PX0RJU1BfV0RfQ09VTlQgICAgKDMgKiBIWiAvIFBVVF9JTlRFUlZBTCkKKworI2RlZmluZSBNTVVfTUFYX0JVRkZFUlMJQlVGU1BFQ19QT09MX1NJWkUKKyNkZWZpbmUgU1dJVENISU5HX1NUQVRFX09GRiAgICAgICAwCisjZGVmaW5lIFNXSVRDSElOR19TVEFURV9PTl9DTUQzICAgMQorI2RlZmluZSBTV0lUQ0hJTkdfU1RBVEVfT05fQ01EMSAgIDIKKworCisKKyNkZWZpbmUgSU5DUFRSKHApIHB0cl9hdG9taWNfd3JhcF9pbmMoJnApCisKKyNkZWZpbmUgU0xJQ0VfVFlQRV9JIDIKKyNkZWZpbmUgU0xJQ0VfVFlQRV9QIDUKKyNkZWZpbmUgU0xJQ0VfVFlQRV9CIDYKKworc3RydWN0IGJ1ZmZlcl9zcGVjX3MgeworCS8qCisJdXNlZDoKKwktMSwgbm9uZSBhbGxvY2F0ZWQKKwkwLCBhbGxvY2F0ZWQsIGZyZWUKKwkxLCB1c2VkIGJ5IGRwYgorCTIsIGluIGRpc3AgcXVldWU7CisJMywgaW4gZGlzcCBxdWV1ZSwgaXNvbGF0ZWQsCisJCWRvIG5vdCB1c2UgZm9yIGRwYiB3aGVuIHZmX3B1dDsKKwk0LCB0byByZWxlYXNlCisJNSwgaW4gZGlzcCBxdWV1ZSwgaXNvbGF0ZWQgKGJ1dCBub3QgdG8gcmVsZWFzZSkKKwkJZG8gbm90IHVzZSBmb3IgZHBiIHdoZW4gdmZfcHV0OworCSovCisJdW5zaWduZWQgaW50IHVzZWQ7CisJdW5zaWduZWQgaW50IGluZm8wOworCXVuc2lnbmVkIGludCBpbmZvMTsKKwl1bnNpZ25lZCBpbnQgaW5mbzI7CisJdW5zaWduZWQgaW50IHlfYWRkcjsKKwl1bnNpZ25lZCBpbnQgdV9hZGRyOworCXVuc2lnbmVkIGludCB2X2FkZHI7CisKKwlpbnQgeV9jYW52YXNfaW5kZXg7CisJaW50IHVfY2FudmFzX2luZGV4OworCWludCB2X2NhbnZhc19pbmRleDsKKworI2lmZGVmIFZERUNfRFcKKwl1bnNpZ25lZCBpbnQgdmRlY19kd195X2FkZHI7CisJdW5zaWduZWQgaW50IHZkZWNfZHdfdV9hZGRyOworCXVuc2lnbmVkIGludCB2ZGVjX2R3X3ZfYWRkcjsKKworCWludCB2ZGVjX2R3X3lfY2FudmFzX2luZGV4OworCWludCB2ZGVjX2R3X3VfY2FudmFzX2luZGV4OworCWludCB2ZGVjX2R3X3ZfY2FudmFzX2luZGV4OworI2lmZGVmIE5WMjEKKwlzdHJ1Y3QgY2FudmFzX2NvbmZpZ19zIHZkZWNfZHdfY2FudmFzX2NvbmZpZ1syXTsKKyNlbHNlCisJc3RydWN0IGNhbnZhc19jb25maWdfcyB2ZGVjX2R3X2NhbnZhc19jb25maWdbM107CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgTlYyMQorCXN0cnVjdCBjYW52YXNfY29uZmlnX3MgY2FudmFzX2NvbmZpZ1syXTsKKyNlbHNlCisJc3RydWN0IGNhbnZhc19jb25maWdfcyBjYW52YXNfY29uZmlnWzNdOworI2VuZGlmCisJdW5zaWduZWQgbG9uZyBjbWFfYWxsb2NfYWRkcjsKKwl1bnNpZ25lZCBpbnQgYnVmX2FkcjsKKyNpZmRlZglIMjY0X01NVQorCXVuc2lnbmVkIGxvbmcgYWxsb2NfaGVhZGVyX2FkZHI7CisjZW5kaWYKKwljaGFyICphdXhfZGF0YV9idWY7CisJaW50IGF1eF9kYXRhX3NpemU7CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwl1bnNpZ25lZCBjaGFyIGR2X2VuaGFuY2VfZXhpc3Q7CisjZW5kaWYKKwlpbnQgY2FudmFzX3BvczsKKwlpbnQgdmZfcmVmOworCS8qdW5zaWduZWQgaW50IGNvbXBfYm9keV9zaXplOyovCisJdW5zaWduZWQgaW50IGR3X3lfYWRyOworCXVuc2lnbmVkIGludCBkd191X3ZfYWRyOworCWludCBmc19pZHg7Cit9OworCisjZGVmaW5lIEFVWF9EQVRBX1NJWkUocGljKSAoaHctPmJ1ZmZlcl9zcGVjW3BpYy0+YnVmX3NwZWNfbnVtXS5hdXhfZGF0YV9zaXplKQorI2RlZmluZSBBVVhfREFUQV9CVUYocGljKSAoaHctPmJ1ZmZlcl9zcGVjW3BpYy0+YnVmX3NwZWNfbnVtXS5hdXhfZGF0YV9idWYpCisjZGVmaW5lIERFTF9FWElTVChoLCBwKSAoaC0+YnVmZmVyX3NwZWNbcC0+YnVmX3NwZWNfbnVtXS5kdl9lbmhhbmNlX2V4aXN0KQorCisKKyNkZWZpbmUgdmRlY19kd19zcGVjMmNhbnZhcyh4KSAgXAorCSgoKHgpLT52ZGVjX2R3X3ZfY2FudmFzX2luZGV4IDw8IDE2KSB8IFwKKwkgKCh4KS0+dmRlY19kd191X2NhbnZhc19pbmRleCA8PCA4KSAgfCBcCisJICgoeCktPnZkZWNfZHdfeV9jYW52YXNfaW5kZXggPDwgMCkpCisKKworI2RlZmluZSBzcGVjMmNhbnZhcyh4KSAgXAorCSgoKHgpLT52X2NhbnZhc19pbmRleCA8PCAxNikgfCBcCisJICgoeCktPnVfY2FudmFzX2luZGV4IDw8IDgpICB8IFwKKwkgKCh4KS0+eV9jYW52YXNfaW5kZXggPDwgMCkpCisKKyNkZWZpbmUgRlJBTUVfSU5ERVgodmZfaW5kZXgpICh2Zl9pbmRleCAmIDB4ZmYpCisjZGVmaW5lIEJVRlNQRUNfSU5ERVgodmZfaW5kZXgpICgodmZfaW5kZXggPj4gOCkgJiAweGZmKQorI2RlZmluZSBWRl9JTkRFWChmcm1faWR4LCBidWZzcGVjX2lkeCkgKGZybV9pZHggfCAoYnVmc3BlY19pZHggPDwgOCkpCisKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZoMjY0X3ZmX3BlZWsodm9pZCAqKTsKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZoMjY0X3ZmX2dldCh2b2lkICopOworc3RhdGljIHZvaWQgdmgyNjRfdmZfcHV0KHN0cnVjdCB2ZnJhbWVfcyAqLCB2b2lkICopOworc3RhdGljIGludCB2aDI2NF92Zl9zdGF0ZXMoc3RydWN0IHZmcmFtZV9zdGF0ZXMgKnN0YXRlcywgdm9pZCAqKTsKK3N0YXRpYyBpbnQgdmgyNjRfZXZlbnRfY2IoaW50IHR5cGUsIHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGVfZGF0YSk7CitzdGF0aWMgdm9pZCB2aDI2NF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgdm9pZCB2aDI2NF90aW1lb3V0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3N0YXRpYyB2b2lkIHZoMjY0X25vdGlmeV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisjaWZkZWYgTUgyNjRfVVNFUkRBVEFfRU5BQkxFCitzdGF0aWMgdm9pZCB1c2VyX2RhdGFfcmVhZHlfbm90aWZ5X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3N0YXRpYyB2b2lkIHZtaDI2NF93YWtldXBfdXNlcmRhdGFfcG9sbChzdHJ1Y3QgdmRlY19zICp2ZGVjKTsKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciB2aDI2NF9kZWNfaWRbXSA9ICJ2aDI2NC1kZXYiOworCisjZGVmaW5lIFBST1ZJREVSX05BTUUgInZkZWMuaDI2NCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2ZnJhbWVfb3BlcmF0aW9uc19zIHZmX3Byb3ZpZGVyX29wcyA9IHsKKwkucGVlayA9IHZoMjY0X3ZmX3BlZWssCisJLmdldCA9IHZoMjY0X3ZmX2dldCwKKwkucHV0ID0gdmgyNjRfdmZfcHV0LAorCS5ldmVudF9jYiA9IHZoMjY0X2V2ZW50X2NiLAorCS52Zl9zdGF0ZXMgPSB2aDI2NF92Zl9zdGF0ZXMsCit9OworCisjZGVmaW5lIERFQ19SRVNVTFRfTk9ORSAgICAgICAgICAgICAwCisjZGVmaW5lIERFQ19SRVNVTFRfRE9ORSAgICAgICAgICAgICAxCisjZGVmaW5lIERFQ19SRVNVTFRfQUdBSU4gICAgICAgICAgICAyCisjZGVmaW5lIERFQ19SRVNVTFRfQ09ORklHX1BBUkFNICAgICAzCisjZGVmaW5lIERFQ19SRVNVTFRfR0VUX0RBVEEgICAgICAgICA0CisjZGVmaW5lIERFQ19SRVNVTFRfR0VUX0RBVEFfUkVUUlkgICA1CisjZGVmaW5lIERFQ19SRVNVTFRfRVJST1IgICAgICAgICAgICA2CisjZGVmaW5lIERFQ19SRVNVTFRfRU9TICAgICAgICAgICAgICA3CisjZGVmaW5lIERFQ19SRVNVTFRfRk9SQ0VfRVhJVCAgICAgICA4CisjZGVmaW5lIERFQ19SRVNVTFRfVElNRU9VVAkJCTkKKworCisvKgorICpzdGF0aWMgY29uc3QgY2hhciAqZGVjX3Jlc3VsdF9zdHJbXSA9IHsKKyAqICAgICJERUNfUkVTVUxUX05PTkUgICAgICAgICIsCisgKiAgICAiREVDX1JFU1VMVF9ET05FICAgICAgICAiLAorICogICAgIkRFQ19SRVNVTFRfQUdBSU4gICAgICAgIiwKKyAqICAgICJERUNfUkVTVUxUX0NPTkZJR19QQVJBTSIsCisgKiAgICAiREVDX1JFU1VMVF9HRVRfREFUQSAgICAiLAorICogICAgIkRFQ19SRVNVTFRfR0VUX0RBX1JFVFJZIiwKKyAqICAgICJERUNfUkVTVUxUX0VSUk9SICAgICAgICIsCisgKn07CisgKi8KKworI2RlZmluZSBVQ09ERV9JUF9PTkxZIDIKKyNkZWZpbmUgVUNPREVfSVBfT05MWV9QQVJBTSAxCisKKyNkZWZpbmUgTUNfT0ZGU0VUX0hFQURFUiAgICAweDAwMDAKKyNkZWZpbmUgTUNfT0ZGU0VUX0RBVEEgICAgICAweDEwMDAKKyNkZWZpbmUgTUNfT0ZGU0VUX01NQ08gICAgICAweDIwMDAKKyNkZWZpbmUgTUNfT0ZGU0VUX0xJU1QgICAgICAweDMwMDAKKyNkZWZpbmUgTUNfT0ZGU0VUX1NMSUNFICAgICAweDQwMDAKKyNkZWZpbmUgTUNfT0ZGU0VUX01BSU4gICAgICAweDUwMDAKKworI2RlZmluZSBNQ19UT1RBTF9TSVpFICAgICAgICgoMjArMTYpKlNaXzFLKQorI2RlZmluZSBNQ19TV0FQX1NJWkUgICAgICAgICg0KlNaXzFLKQorI2RlZmluZSBNT0RFX0VSUk9SIDAKKyNkZWZpbmUgTU9ERV9GVUxMICAxCisKKyNkZWZpbmUgREZTX0hJR0hfVEhFQVNIT0xEIDMKKworI2RlZmluZSBJTklUX0ZMQUdfUkVHICAgICAgIEFWX1NDUkFUQ0hfMgorI2RlZmluZSBIRUFEX1BBRElOR19SRUcgICAgIEFWX1NDUkFUQ0hfMworI2RlZmluZSBVQ09ERV9XQVRDSERPR19SRUcgICBBVl9TQ1JBVENIXzcKKyNkZWZpbmUgTE1FTV9EVU1QX0FEUiAgICAgICBBVl9TQ1JBVENIX0wKKyNkZWZpbmUgREVCVUdfUkVHMSAgICAgICAgICBBVl9TQ1JBVENIX00KKyNkZWZpbmUgREVCVUdfUkVHMiAgICAgICAgICBBVl9TQ1JBVENIX04KKyNkZWZpbmUgRlJBTUVfQ09VTlRFUl9SRUcgICAgICAgQVZfU0NSQVRDSF9JCisjZGVmaW5lIFJQTV9DTURfUkVHICAgICAgICAgIEFWX1NDUkFUQ0hfQQorI2RlZmluZSBIMjY0X0RFQ09ERV9TSVpFCUFWX1NDUkFUQ0hfRQorI2RlZmluZSBIMjY0X0RFQ09ERV9NT0RFICAgIEFWX1NDUkFUQ0hfNAorI2RlZmluZSBIMjY0X0RFQ09ERV9TRVFJTkZPCUFWX1NDUkFUQ0hfNQorI2RlZmluZSBIMjY0X0FVWF9BRFIgICAgICAgICAgICBBVl9TQ1JBVENIX0MKKyNkZWZpbmUgSDI2NF9BVVhfREFUQV9TSVpFICAgICAgQVZfU0NSQVRDSF9ICisKKyNkZWZpbmUgSDI2NF9ERUNPREVfSU5GTyAgICAgICAgICBNNF9DT05UUk9MX1JFRyAvKiAweGMyOSAqLworI2RlZmluZSBEUEJfU1RBVFVTX1JFRyAgICAgICBBVl9TQ1JBVENIX0oKKyNkZWZpbmUgRVJST1JfU1RBVFVTX1JFRwlBVl9TQ1JBVENIXzkKKwkvKgorCU5BTF9TRUFSQ0hfQ1RMOiBiaXQgMCwgZW5hYmxlIGl0dV90MzUKKwlOQUxfU0VBUkNIX0NUTDogYml0IDEsIGVuYWJsZSBtbXUKKwlOQUxfU0VBUkNIX0NUTDogYml0IDIsIGRldGVjdCBmcmFtZV9tYnNfb25seV9mbGFnIHdoZXRoZXIgc3dpdGNoIHJlc29sdXRpb24KKwlOQUxfU0VBUkNIX0NUTDogYml0IDE1LGJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnCisJKi8KKyNkZWZpbmUgTkFMX1NFQVJDSF9DVEwJCUFWX1NDUkFUQ0hfOQorI2RlZmluZSBNQllfTUJYICAgICAgICAgICAgICAgICBNQl9NT1RJT05fTU9ERSAvKjB4YzA3Ki8KKworI2RlZmluZSBERUNPREVfTU9ERV9TSU5HTEUJCQkJCTB4MAorI2RlZmluZSBERUNPREVfTU9ERV9NVUxUSV9GUkFNRUJBU0UJCQkweDEKKyNkZWZpbmUgREVDT0RFX01PREVfTVVMVElfU1RSRUFNQkFTRQkJMHgyCisjZGVmaW5lIERFQ09ERV9NT0RFX01VTFRJX0RWQkFMCQkJCTB4MworI2RlZmluZSBERUNPREVfTU9ERV9NVUxUSV9EVkVOTAkJCQkweDQKK3N0YXRpYyBERUZJTkVfTVVURVgodm1oMjY0X211dGV4KTsKKworI2lmZGVmIE1IMjY0X1VTRVJEQVRBX0VOQUJMRQorCitzdHJ1Y3QgbWgyNjRfdXNlcmRhdGFfcmVjb3JkX3QgeworCXN0cnVjdCB1c2VyZGF0YV9tZXRhX2luZm9fdCBtZXRhX2luZm87CisJdTMyIHJlY19zdGFydDsKKwl1MzIgcmVjX2xlbjsKK307CisKK3N0cnVjdCBtaDI2NF91ZF9yZWNvcmRfd2FpdF9ub2RlX3QgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgbWgyNjRfdXNlcmRhdGFfcmVjb3JkX3QgdWRfcmVjb3JkOworfTsKKyNkZWZpbmUgVVNFUkRBVEFfRklGT19OVU0gICAgMjU2CisjZGVmaW5lIE1BWF9GUkVFX1VTRVJEQVRBX05PREVTCQk1CisKK3N0cnVjdCBtaDI2NF91c2VyZGF0YV9pbmZvX3QgeworCXN0cnVjdCBtaDI2NF91c2VyZGF0YV9yZWNvcmRfdCByZWNvcmRzW1VTRVJEQVRBX0ZJRk9fTlVNXTsKKwl1OCAqZGF0YV9idWY7CisJdTggKmRhdGFfYnVmX2VuZDsKKwl1MzIgYnVmX2xlbjsKKwl1MzIgcmVhZF9pbmRleDsKKwl1MzIgd3JpdGVfaW5kZXg7CisJdTMyIGxhc3Rfd3A7Cit9OworCisKKyNlbmRpZgorCitzdHJ1Y3QgbWgyNjRfZmVuY2VfdmZfdCB7CisJdTMyIHVzZWRfc2l6ZTsKKwlzdHJ1Y3QgdmZyYW1lX3MgKmZlbmNlX3ZmW1ZGX1BPT0xfU0laRV07Cit9OworCitzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgeworCXNwaW5sb2NrX3QgbG9jazsKKwlzcGlubG9ja190IGJ1ZnNwZWNfbG9jazsKKwlpbnQgaWQ7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2OworCXVuc2lnbmVkIGxvbmcgY21hX2FsbG9jX2FkZHI7CisJLyogc3RydWN0IHBhZ2UgKmNvbGxvY2F0ZV9jbWFfYWxsb2NfcGFnZXM7ICovCisJdW5zaWduZWQgbG9uZyBjb2xsb2NhdGVfY21hX2FsbG9jX2FkZHI7CisKKwl1MzIgcHJlZml4X2F1eF9zaXplOworCXUzMiBzdWZmaXhfYXV4X3NpemU7CisJdm9pZCAqYXV4X2FkZHI7CisJZG1hX2FkZHJfdCBhdXhfcGh5X2FkZHI7CisKKwkvKiBidWZmZXIgZm9yIHN0b3JlIGFsbCBzZWkgZGF0YSAqLworCXZvaWQgKnNlaV9kYXRhX2J1ZjsKKwl1MzIJc2VpX2RhdGFfbGVuOworCisJLyogYnVmZmVyIGZvciBzdG9yaW5nIG9uZSBpdHUzNSByZWNvcmVkICovCisJdm9pZCAqc2VpX2l0dV9kYXRhX2J1ZjsKKwl1MzIgc2VpX2l0dV9kYXRhX2xlbjsKKworCS8qIHJlY3ljbGUgYnVmZmVyIGZvciB1c2VyIGRhdGEgc3RvcmluZyBhbGwgaXR1MzUgcmVjb3JkcyAqLworCXZvaWQgKnNlaV91c2VyX2RhdGFfYnVmZmVyOworCXUzMiBzZWlfdXNlcl9kYXRhX3dwOworI2lmZGVmIE1IMjY0X1VTRVJEQVRBX0VOQUJMRQorCXN0cnVjdCB3b3JrX3N0cnVjdCB1c2VyX2RhdGFfcmVhZHlfd29yazsKKyNlbmRpZgorCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKmxhc3RfZGVjX3BpY3R1cmU7CisKKwl1bG9uZyBsbWVtX3BoeV9hZGRyOworCWRtYV9hZGRyX3QgbG1lbV9hZGRyOworCisJdm9pZCAqYm1tdV9ib3g7CisjaWZkZWYgSDI2NF9NTVUKKwl2b2lkICptbXVfYm94OworCXZvaWQgKmZyYW1lX21tdV9tYXBfYWRkcjsKKwlkbWFfYWRkcl90IGZyYW1lX21tdV9tYXBfcGh5X2FkZHI7CisJdTMyCSBoZXZjX2N1cl9idWZfaWR4OworCXUzMiBsb3NsZXNzX2NvbXBfYm9keV9zaXplOworCXUzMiBsb3NsZXNzX2NvbXBfYm9keV9zaXplX3NhbzsKKwl1MzIgbG9zbGVzc19jb21wX2hlYWRlcl9zaXplOworCXUzMiBtY19idWZmZXJfc2l6ZV91X3Y7CisJdTMyIG1jX2J1ZmZlcl9zaXplX3Vfdl9oOworCXUzMiAgaXNfaWRyX2ZyYW1lOworCXUzMiAgaXNfbmV3X3BpYzsKKwl1MzIgIGZyYW1lX2RvbmU7CisJdTMyICBmcmFtZV9idXN5OworCXVuc2lnbmVkIGxvbmcgZXh0aWZfYWRkcjsKKwlpbnQgZG91YmxlX3dyaXRlX21vZGU7CisJaW50IG1tdV9lbmFibGU7CisjZW5kaWYKKworCURFQ0xBUkVfS0ZJRk8obmV3ZnJhbWVfcSwgc3RydWN0IHZmcmFtZV9zICosIFZGX1BPT0xfU0laRSk7CisJREVDTEFSRV9LRklGTyhkaXNwbGF5X3EsIHN0cnVjdCB2ZnJhbWVfcyAqLCBWRl9QT09MX1NJWkUpOworCisJaW50IGN1cl9wb29sOworCXN0cnVjdCB2ZnJhbWVfcyB2ZnBvb2xbVkZfUE9PTF9OVU1dW1ZGX1BPT0xfU0laRV07CisJc3RydWN0IGJ1ZmZlcl9zcGVjX3MgYnVmZmVyX3NwZWNbQlVGU1BFQ19QT09MX1NJWkVdOworCXN0cnVjdCB2ZnJhbWVfcyBzd2l0Y2hpbmdfZmVuc2VfdmY7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgZHBiOworCXU4IGluaXRfZmxhZzsKKwl1OCBmaXJzdF9zY19jaGVja2VkOworCXU4IGhhc19pX2ZyYW1lOworCXU4IGNvbmZpZ19idWZtZ3JfZG9uZTsKKwl1MzIgbWF4X3JlZmVyZW5jZV9zaXplOworCXUzMiBkZWNvZGVfcGljX2NvdW50OworCXUzMiByZWZsaXN0X2Vycm9yX2NvdW50OworCWludCBzdGFydF9zZWFyY2hfcG9zOworCXUzMiByZWdfaXFpZGN0X2NvbnRyb2w7CisJYm9vbCByZWdfaXFpZGN0X2NvbnRyb2xfaW5pdF9mbGFnOworCXUzMiByZWdfdmNvcF9jdHJsX3JlZzsKKwl1MzIgcmVnX3J2X2FpX21iX2NvdW50OworCXUzMiB2bGRfZGVjX2NvbnRyb2w7CisJc3RydWN0IHZmcmFtZV9zIHZmcmFtZV9kdW1teTsKKworCXVuc2lnbmVkIGNoYXIgYnVmZmVyX2VtcHR5X2ZsYWc7CisKKwl1MzIgZnJhbWVfd2lkdGg7CisJdTMyIGZyYW1lX2hlaWdodDsKKwl1MzIgZnJhbWVfZHVyOworCXUzMiBmcmFtZV9wcm9nOworCXUzMiBmcmFtZV9wYWNraW5nX3R5cGU7CisKKwlzdHJ1Y3QgdmZyYW1lX2NodW5rX3MgKmNodW5rOworCisJdTMyIHN0YXQ7CisJdW5zaWduZWQgbG9uZyBidWZfc3RhcnQ7CisJdTMyIGJ1Zl9vZmZzZXQ7CisJdTMyIGJ1Zl9zaXplOworCS8qIHUzMiB1Y29kZV9tYXBfc3RhcnQ7ICovCisJdTMyIHB0c19vdXRzaWRlOworCXUzMiBzeW5jX291dHNpZGU7CisJdTMyIHZoMjY0X3JhdGlvOworCXUzMiB2aDI2NF9yb3RhdGlvbjsKKwl1MzIgdXNlX2lkcl9mcmFtZXJhdGU7CisKKwl1MzIgc2VxX2luZm87CisJdTMyIHNlcV9pbmZvMjsKKwl1MzIgdmlkZW9fc2lnbmFsX2Zyb21fdnVpOyAvKnRvIGRvIC4uICovCisJdTMyIHRpbWluZ19pbmZvX3ByZXNlbnRfZmxhZzsKKwl1MzIgZml4ZWRfZnJhbWVfcmF0ZV9mbGFnOworCXUzMiBiaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZzsKKwl1MzIgbnVtX3Jlb3JkZXJfZnJhbWVzOworCXUzMiBtYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZzsKKwl1MzIgaWZyYW1lX2NvdW50OworCXUzMiBhc3BlY3RfcmF0aW9faW5mbzsKKwl1MzIgbnVtX3VuaXRzX2luX3RpY2s7CisJdTMyIHRpbWVfc2NhbGU7CisJdTMyIGgyNjRfYXI7CisJYm9vbCBoMjY0X2ZpcnN0X3ZhbGlkX3B0c19yZWFkeTsKKwl1MzIgaDI2NHB0czE7CisJdTMyIGgyNjRwdHMyOworCXUzMiBwdHNfZHVyYXRpb247CisJdTMyIGgyNjRfcHRzX2NvdW50OworCXUzMiBkdXJhdGlvbl9mcm9tX3B0c19kb25lOworCXUzMiBwdHNfdW5zdGFibGU7CisJdTMyIHVuc3RhYmxlX3B0czsKKwl1MzIgbGFzdF9jaGVja291dF9wdHM7CisJdTMyIG1heF9yZWZlcl9idWY7CisKKwlzMzIgdmgyNjRfc3RyZWFtX3N3aXRjaGluZ19zdGF0ZTsKKwlzdHJ1Y3QgdmZyYW1lX3MgKnBfbGFzdF92ZjsKKwl1MzIgbGFzdF9wdHM7CisJdTMyIGxhc3RfcHRzX3JlbWFpbmRlcjsKKwl1MzIgbGFzdF9kdXJhdGlvbjsKKwl1MzIgbGFzdF9tYl93aWR0aCwgbGFzdF9tYl9oZWlnaHQ7CisJYm9vbCBjaGVja19wdHNfZGlzY29udGludWU7CisJYm9vbCBwdHNfZGlzY29udGludWU7CisJdTMyIHdhaXRfYnVmZmVyX2NvdW50ZXI7CisJdTMyIGZpcnN0X29mZnNldDsKKwl1MzIgZmlyc3RfcHRzOworCXU2NCBmaXJzdF9wdHM2NDsKKwlib29sIGZpcnN0X3B0c19jYWNoZWQ7CisJdTY0IGxhc3RfcHRzNjQ7CisjaWYgMAorCXZvaWQgKnNlaV9kYXRhX2J1ZmZlcjsKKwlkbWFfYWRkcl90IHNlaV9kYXRhX2J1ZmZlcl9waHlzOworI2VuZGlmCisKKwl1aW50IGVycm9yX3JlY292ZXJ5X21vZGU7CisJdWludCBtYl90b3RhbDsKKwl1aW50IG1iX3dpZHRoOworCXVpbnQgbWJfaGVpZ2h0OworCisJdWludCBpX29ubHk7CisJaW50IHNraXBfZnJhbWVfY291bnQ7CisJYm9vbCBub19wb2NfcmVvcmRlcl9mbGFnOworCWJvb2wgc2VuZF9lcnJvcl9mcmFtZV9mbGFnOworCWRtYV9hZGRyX3QgbWNfZG1hX2hhbmRsZTsKKwl2b2lkICptY19jcHVfYWRkcjsKKwlpbnQgdmgyNjRfcmVzZXQ7CisKKwlhdG9taWNfdCB2aDI2NF9hY3RpdmU7CisKKwlzdHJ1Y3QgZGVjX3N5c2luZm8gdmgyNjRfYW1zdHJlYW1fZGVjX2luZm87CisKKwlpbnQgZGVjX3Jlc3VsdDsKKwl1MzIgdGltZW91dF9wcm9jZXNzaW5nOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXN0cnVjdCB3b3JrX3N0cnVjdCBub3RpZnlfd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdGltZW91dF93b3JrOworCXZvaWQgKCp2ZGVjX2NiKShzdHJ1Y3QgdmRlY19zICosIHZvaWQgKik7CisJdm9pZCAqdmRlY19jYl9hcmc7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCBjaGVja190aW1lcjsKKworCS8qKi8KKwl1bnNpZ25lZCBpbnQgbGFzdF9mcmFtZV90aW1lOworCXUzMiB2Zl9wcmVfY291bnQ7CisJYXRvbWljX3QgdmZfZ2V0X2NvdW50OworCWF0b21pY190IHZmX3B1dF9jb3VudDsKKworCS8qIHRpbWVvdXQgaGFuZGxlICovCisJdW5zaWduZWQgbG9uZyBpbnQgc3RhcnRfcHJvY2Vzc190aW1lOworCXVuc2lnbmVkIGludCBsYXN0X21ieV9tYng7CisJdW5zaWduZWQgaW50IGxhc3RfdmxkX2xldmVsOworCXVuc2lnbmVkIGludCBkZWNvZGVfdGltZW91dF9jb3VudDsKKwl1bnNpZ25lZCBpbnQgdGltZW91dF9udW07CisJdW5zaWduZWQgaW50IHNlYXJjaF9kYXRhZW1wdHlfbnVtOworCXVuc2lnbmVkIGludCBkZWNvZGVfdGltZW91dF9udW07CisJdW5zaWduZWQgaW50IGRlY29kZV9kYXRhZW1wdHlfbnVtOworCXVuc2lnbmVkIGludCBidWZmZXJfZW1wdHlfcmVjb3Zlcl9udW07CisKKwl1bnNpZ25lZCBnZXRfZGF0YV9jb3VudDsKKwl1bnNpZ25lZCBnZXRfZGF0YV9zdGFydF90aW1lOworCS8qKi8KKworCS8qbG9nKi8KKwl1bnNpZ25lZCBpbnQgcGFja2V0X3dyaXRlX3N1Y2Nlc3NfY291bnQ7CisJdW5zaWduZWQgaW50IHBhY2tldF93cml0ZV9FQUdBSU5fY291bnQ7CisJdW5zaWduZWQgaW50IHBhY2tldF93cml0ZV9FTk9NRU1fY291bnQ7CisJdW5zaWduZWQgaW50IHBhY2tldF93cml0ZV9FRkFVTFRfY291bnQ7CisJdW5zaWduZWQgaW50IHRvdGFsX3JlYWRfc2l6ZV9wcmU7CisJdW5zaWduZWQgaW50IHRvdGFsX3JlYWRfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZnJhbWVfY291bnRfcHJlOworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJdTggc3dpdGNoX2R2bGF5ZXJfZmxhZzsKKwl1OCBnb3RfdmFsaWRfbmFsOworI2VuZGlmCisJdTggZW9zOworCXU4IGRhdGFfZmxhZzsKKwl1MzIgbm9fZXJyb3JfY291bnQ7CisJdTMyIG5vX2Vycm9yX2lfY291bnQ7CisJLyoKKwlOT0RJU1BfRkxBRworCSovCisJdTggZGVjX2ZsYWc7CisKKwl1MzIgdWNvZGVfcGF1c2VfcG9zOworCisJdTggcmVzZXRfYnVmbWdyX2ZsYWc7CisJdTMyIHJlc2V0X2J1Zm1ncl9jb3VudDsKKwl1bG9uZyB0aW1lb3V0OworCXUzMiB0aW1lb3V0X2ZsYWc7CisJdTMyIGNmZ19wYXJhbTE7CisJdTMyIGNmZ19wYXJhbTI7CisJdTMyIGNmZ19wYXJhbTM7CisJdTMyIGNmZ19wYXJhbTQ7CisJaW50IHZhbHZlX2NvdW50OworCXU4IG5leHRfYWdhaW5fZmxhZzsKKwl1MzIgcHJlX3BhcnNlcl93cl9wdHI7CisJc3RydWN0IGZpcm13YXJlX3MgKmZ3OworCXN0cnVjdCBmaXJtd2FyZV9zICpmd19tbXU7CisjaWZkZWYgTUgyNjRfVVNFUkRBVEFfRU5BQkxFCisJLyp1c2VyIGRhdGEqLworCXN0cnVjdCBtdXRleCB1c2VyZGF0YV9tdXRleDsKKwlzdHJ1Y3QgbWgyNjRfdXNlcmRhdGFfaW5mb190IHVzZXJkYXRhX2luZm87CisJc3RydWN0IG1oMjY0X3VzZXJkYXRhX3JlY29yZF90IHVkX3JlY29yZDsKKwlpbnQgd2FpdF9mb3JfdWRyX3NlbmQ7CisjZW5kaWYKKwl1MzIgbm9fbWVtX2NvdW50OworCXUzMiBjYW52YXNfbW9kZTsKKwlib29sIGlzX3VzZWRfdjRsOworCXZvaWQgKnY0bDJfY3R4OworCWJvb2wgdjRsX3BhcmFtc19wYXJzZWQ7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9xOworCXUzMiByZWdfZ19zdGF0dXM7CisJc3RydWN0IG11dGV4IGNodW5rc19tdXRleDsKKwlpbnQgbmVlZF9jYWNoZV9zaXplOworCXU2NCBzY19zdGFydF90aW1lOworCXU4IGZybWJhc2VfY29udF9mbGFnOworCXN0cnVjdCB2ZnJhbWVfcW9zX3MgdmZyYW1lX3FvczsKKwlpbnQgZnJhbWVpbmZvX2VuYWJsZTsKKwlib29sIGZpcnN0X2hlYWRfY2hlY2tfZmxhZzsKKwl1bnNpZ25lZCBpbnQgaGVpZ2h0X2FzcGVjdF9yYXRpbzsKKwl1bnNpZ25lZCBpbnQgd2lkdGhfYXNwZWN0X3JhdGlvOworCXVuc2lnbmVkIGludCBmaXJzdF9pX3BvbGljeTsKKwl1MzIgcmVvcmRlcl9kcGJfc2l6ZV9tYXJnaW47CisJYm9vbCB3YWl0X3Jlc2V0X2RvbmVfZmxhZzsKKyNpZmRlZiBERVRFQ1RfV1JPTkdfTVVMVElfU0xJQ0UKKwl1bnNpZ25lZCBpbnQgbXVsdGlfc2xpY2VfcGljX2NoZWNrX2NvdW50OworCQkJLyogbXVsdGlfc2xpY2VfcGljX2ZsYWc6CisJCQkJMCwgdW5rbm93bjsKKwkJCQkxLCBzaW5nbGUgc2xpY2U7CisJCQkJMiwgbXVsdGkgc2xpY2UKKwkJCSovCisJdW5zaWduZWQgaW50IG11bHRpX3NsaWNlX3BpY19mbGFnOworCXVuc2lnbmVkIGludCBwaWN0dXJlX3NsaWNlX2NvdW50OworCXVuc2lnbmVkIGludCBjdXJfcGljdHVyZV9zbGljZV9jb3VudDsKKwl1bnNpZ25lZCBjaGFyIGZvcmNlX3NsaWNlX2FzX3BpY3R1cmVfZmxhZzsKKwl1bnNpZ25lZCBpbnQgbGFzdF9waWN0dXJlX3NsaWNlX2NvdW50OworCXVuc2lnbmVkIGludCBmaXJzdF9wcmVfZnJhbWVfbnVtOworI2VuZGlmCisJdTMyIHJlc19jaF9mbGFnOworCXUzMiBiX2ZyYW1lX2Vycm9yX2NvdW50OworCXN0cnVjdCB2ZGVjX2luZm8gZ3ZzOworCXUzMiBrcGlfZmlyc3RfaV9jb21taW5nOworCXUzMiBrcGlfZmlyc3RfaV9kZWNvZGVkOworCWludCBzaWRlYmluZF90eXBlOworCWludCBzaWRlYmluZF9jaGFubmVsX2lkOworCXUzMiBsb3dfbGF0ZW5jeV9tb2RlOworCWludCBpcF9maWVsZF9lcnJvcl9jb3VudDsKKwlpbnQgYnVmZmVyX3dyYXBbQlVGU1BFQ19QT09MX1NJWkVdOworCWludCBsb29wX2ZsYWc7CisJaW50IGxvb3BfbGFzdF9wb2M7CisJYm9vbCBlbmFibGVfZmVuY2U7CisJaW50IGZlbmNlX3VzYWdlOworCWJvb2wgZGlzY2FyZF9kdl9kYXRhOworCXUzMiBtZXRhZGF0YV9jb25maWdfZmxhZzsKKwlpbnQgdmRlY19wZ19lbmFibGVfZmxhZzsKKwl1MzIgc2F2ZV9yZWdfZjsKKwl1MzIgc3RhcnRfYml0X2NudDsKKwl1MzIgcmlnaHRfZnJhbWVfY291bnQ7CisJdTMyIHdyb25nX2ZyYW1lX2NvdW50OworCXUzMiBlcnJvcl9mcmFtZV93aWR0aDsKKwl1MzIgZXJyb3JfZnJhbWVfaGVpZ2h0OworCXVsb25nIGZiX3Rva2VuOworCWludCBkZWNfYWdhaW5fY250OworCXN0cnVjdCBtaDI2NF9mZW5jZV92Zl90IGZlbmNlX3ZmX3M7CisJc3RydWN0IG11dGV4IGZlbmNlX211dGV4OworCXUzMiBub19kZWNvZGVyX2J1ZmZlcl9mbGFnOworCXUzMiB2aWRlb19zaWduYWxfdHlwZTsKKwlzdHJ1Y3QgdHJhY2VfZGVjb2Rlcl9uYW1lIHRyYWNlOworCWludCBjc2RfY2hhbmdlX2ZsYWc7Cit9OworCitzdGF0aWMgdTMyIGFnYWluX3RocmVzaG9sZDsKKworc3RhdGljIHZvaWQgdGltZW91dF9wcm9jZXNzKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcpOworc3RhdGljIHZvaWQgZHVtcF9idWZzcGVjKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcsCisJY29uc3QgY2hhciAqY2FsbGVyKTsKK3N0YXRpYyB2b2lkIGgyNjRfcmVjb25maWcoc3RydWN0IHZkZWNfaDI2NF9od19zICpodyk7CitzdGF0aWMgdm9pZCBoMjY0X3Jlc2V0X2J1Zm1ncihzdHJ1Y3QgdmRlY19zICp2ZGVjKTsKK3N0YXRpYyB2b2lkIHZoMjY0X2xvY2FsX2luaXQoc3RydWN0IHZkZWNfaDI2NF9od19zICpodywgYm9vbCBpc19yZXNldCk7CitzdGF0aWMgaW50IHZoMjY0X2h3X2N0eF9yZXN0b3JlKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcpOworc3RhdGljIGludCB2aDI2NF9zdG9wKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcpOworc3RhdGljIHMzMiB2aDI2NF9pbml0KHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcpOworc3RhdGljIHZvaWQgc2V0X2ZyYW1lX2luZm8oc3RydWN0IHZkZWNfaDI2NF9od19zICpodywgc3RydWN0IHZmcmFtZV9zICp2ZiwKKwkJCXUzMiBpbmRleCk7CitzdGF0aWMgdm9pZCByZWxlYXNlX2F1eF9kYXRhKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcsCisJaW50IGJ1Zl9zcGVjX251bSk7CisjaWZkZWYgRVJST1JfSEFORExFX1RFU1QKK3N0YXRpYyB2b2lkIGgyNjRfY2xlYXJfZHBiKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcpOworI2VuZGlmCisKKyNkZWZpbmUJCUgyNjVfUFVUX1NBT180S19TRVQJCQkweDAzCisjZGVmaW5lCQlIMjY1X0FCT1JUX1NBT180S19TRVQJCQkweDA0CisjZGVmaW5lCQlIMjY1X0FCT1JUX1NBT180S19TRVRfRE9ORQkJMHgwNQorCisjZGVmaW5lCQlTWVNfQ09NTUFORAkJCUhFVkNfQVNTSVNUX1NDUkFUQ0hfMAorI2RlZmluZQkJSDI2NV9DSEVDS19BWElfSU5GT19CQVNFCUhFVkNfQVNTSVNUX1NDUkFUQ0hfOAorI2RlZmluZQkJSDI2NV9TQU9fNEtfU0VUX0JBU0UJSEVWQ19BU1NJU1RfU0NSQVRDSF85CisjZGVmaW5lCQlIMjY1X1NBT180S19TRVRfQ09VTlQJSEVWQ19BU1NJU1RfU0NSQVRDSF9BCisjZGVmaW5lCQlIRVZDRF9NUFBfQU5DMkFYSV9UQkxfREFUQQkJMHgzNDY0CisKKworI2RlZmluZQkJSEVWQ19DTV9IRUFERVJfU1RBUlRfQUREUgkJMHgzNjI4CisjZGVmaW5lCQlIRVZDX0NNX0JPRFlfU1RBUlRfQUREUgkJCTB4MzYyNgorI2RlZmluZQkJSEVWQ19DTV9CT0RZX0xFTkdUSAkJCTB4MzYyNworI2RlZmluZQkJSEVWQ19DTV9IRUFERVJfTEVOR1RICQkJMHgzNjI5CisjZGVmaW5lCQlIRVZDX0NNX0hFQURFUl9PRkZTRVQJCQkweDM2MmIKKyNkZWZpbmUJCUhFVkNfU0FPX0NUUkw5CQkJCTB4MzYyZAorI2RlZmluZQkJSEVWQ0RfTVBQX0RFQ09NUF9DVEwzCQkJMHgzNGM0CisjZGVmaW5lCQlIRVZDRF9NUFBfVkRFQ19NQ1JfQ1RMCQkJMHgzNGM4CisjZGVmaW5lICAgICAgICAgICBIRVZDX0RCTEtfQ0ZHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNTBiCisjZGVmaW5lCQlIRVZDX0FTU0lTVF9NTVVfTUFQX0FERFIJMHgzMDA5CisKKyNkZWZpbmUgSDI2NV9EV19OT19TQ0FMRQorI2RlZmluZSBIMjY1X01FTV9NQVBfTU9ERSAwICAvKjA6bGluZWFyIDE6MzJ4MzIgMjo2NHgzMiovCisjZGVmaW5lIEgyNjVfTE9TTEVTU19DT01QUkVTU19NT0RFCisjZGVmaW5lIE1BWF9GUkFNRV80S19OVU0gMHgxMjAwCisjZGVmaW5lIEZSQU1FX01NVV9NQVBfU0laRSAgKE1BWF9GUkFNRV80S19OVU0gKiA0KQorCisvKiAwOmxpbmVhciAxOjMyeDMyIDI6NjR4MzIgOyBtOGJhYnkgdGVzdDE5MDIgKi8KK3N0YXRpYyB1MzIgbWVtX21hcF9tb2RlID0gSDI2NV9NRU1fTUFQX01PREU7CisKKyNkZWZpbmUgTUFYX1NJWkVfNEsgKDQwOTYgKiAyMzA0KQorI2RlZmluZSBNQVhfU0laRV8ySyAoMTkyMCAqIDEwODgpCisKK3N0YXRpYyBpbnQgaXNfb3ZlcnNpemUoaW50IHcsIGludCBoKQoreworCWludCBtYXggPSBNQVhfU0laRV80SzsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1RCkKKwkJbWF4ID0gTUFYX1NJWkVfMks7CisKKwlpZiAodyA8IDAgfHwgaCA8IDApCisJCXJldHVybiB0cnVlOworCisJaWYgKGggIT0gMCAmJiAodyA+IG1heCAvIGgpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgdm1oMjY0X3VkY19maWxsX3ZwdHMoc3RydWN0IHZkZWNfaDI2NF9od19zICpodywKKwkJCQkJCWludCBmcmFtZV90eXBlLAorCQkJCQkJdTMyIHZwdHMsCisJCQkJCQl1MzIgdnB0c192YWxpZCk7CitzdGF0aWMgaW50ICBjb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemUoaW50IHdpZHRoLAorCQkJCWludCBoZWlnaHQsIGludCBiaXRfZGVwdGhfMTApOworc3RhdGljIGludCAgY29tcHV0ZV9sb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworc3RhdGljIGludCBoZXZjX2FsbG9jX21tdShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LCBpbnQgcGljX2lkeCwKKwkJaW50IHBpY193aWR0aCwgaW50IHBpY19oZWlnaHQsIHUxNiBiaXRfZGVwdGgsCisJCXVuc2lnbmVkIGludCAqbW11X2luZGV4X2FkcikgeworCWludCBjdXJfYnVmX2lkeDsKKwlpbnQgYml0X2RlcHRoXzEwID0gKGJpdF9kZXB0aCAhPSAweDAwKTsKKwlpbnQgcGljdHVyZV9zaXplOworCXUzMiBjdXJfbW11XzRrX251bWJlcjsKKworCVdSSVRFX1ZSRUcoQ1VSUl9DQU5WQVNfQ1RSTCwgcGljX2lkeDw8MjQpOworCWN1cl9idWZfaWR4ID0gUkVBRF9WUkVHKENVUlJfQ0FOVkFTX0NUUkwpJjB4ZmY7CisJcGljdHVyZV9zaXplID0gY29tcHV0ZV9sb3NsZXNzX2NvbXBfYm9keV9zaXplKHBpY193aWR0aCwKKwkJCQkJcGljX2hlaWdodCwgYml0X2RlcHRoXzEwKTsKKwljdXJfbW11XzRrX251bWJlciA9ICgocGljdHVyZV9zaXplKygxPDwxMiktMSkgPj4gMTIpOworCWRwYl9wcmludChERUNPREVfSUQoaHcpLAorCQlQUklOVF9GTEFHX01NVV9ERVRBSUwsCisJCSJhbGxvY19tbXUgbmV3X2ZiX2lkeCAlZCBwaWN0dXJlX3NpemUgJWQgY3VyX21tdV80a19udW1iZXIgJWRcbiIsCisJCWN1cl9idWZfaWR4LCBwaWN0dXJlX3NpemUsIGN1cl9tbXVfNGtfbnVtYmVyKTsKKworCWlmIChjdXJfbW11XzRrX251bWJlciA+IE1BWF9GUkFNRV80S19OVU0pIHsKKwkJcHJfZXJyKCJoZXZjX2FsbG9jX21tdSBjdXJfbW11XzRrX251bWJlciAlZCB1bnN1cHBvcnRcbiIsCisJCWN1cl9tbXVfNGtfbnVtYmVyKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiBkZWNvZGVyX21tdV9ib3hfYWxsb2NfaWR4KAorCQlody0+bW11X2JveCwKKwkJY3VyX2J1Zl9pZHgsCisJCWN1cl9tbXVfNGtfbnVtYmVyLAorCQltbXVfaW5kZXhfYWRyKTsKK30KKworc3RhdGljIGludCAgY29tcHV0ZV9sb3NsZXNzX2NvbXBfYm9keV9zaXplKGludCB3aWR0aCwKKwkJCQkJaW50IGhlaWdodCwgaW50IGJpdF9kZXB0aF8xMCkKK3sKKwlpbnQgICAgd2lkdGhfeDY0OworCWludCAgICBoZWlnaHRfeDMyOworCWludCAgICBic2l6ZTsKKworCXdpZHRoX3g2NCA9IHdpZHRoICsgNjM7CisJd2lkdGhfeDY0ID4+PSA2OworCisJaGVpZ2h0X3gzMiA9IGhlaWdodCArIDMxOworCWhlaWdodF94MzIgPj49IDU7CisKKyNpZmRlZiBIMjY0X01NVQorCWJzaXplID0gKGJpdF9kZXB0aF8xMCA/IDQwOTYgOiAzMjY0KSAqIHdpZHRoX3g2NCpoZWlnaHRfeDMyOworI2Vsc2UKKwlic2l6ZSA9IChiaXRfZGVwdGhfMTAgPyA0MDk2IDogMzA3MikgKiB3aWR0aF94NjQqaGVpZ2h0X3gzMjsKKyNlbmRpZgorCXJldHVybiBic2l6ZTsKK30KKworc3RhdGljIGludCAgY29tcHV0ZV9sb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworCWludAl3aWR0aF94NjQ7CisJaW50CXdpZHRoX3gxMjg7CisJaW50ICAgIGhlaWdodF94NjQ7CisJaW50CWhzaXplOworCisJd2lkdGhfeDY0ID0gd2lkdGggKyA2MzsKKwl3aWR0aF94NjQgPj49IDY7CisKKwl3aWR0aF94MTI4ID0gd2lkdGggKyAxMjc7CisJd2lkdGhfeDEyOCA+Pj0gNzsKKworCWhlaWdodF94NjQgPSBoZWlnaHQgKyA2MzsKKwloZWlnaHRfeDY0ID4+PSA2OworCisjaWZkZWYJSDI2NF9NTVUKKwloc2l6ZSA9IDEyOCp3aWR0aF94NjQqaGVpZ2h0X3g2NDsKKyNlbHNlCisJaHNpemUgPSAzMip3aWR0aF94MTI4KmhlaWdodF94NjQ7CisjZW5kaWYKKwlyZXR1cm4gIGhzaXplOworfQorCitzdGF0aWMgaW50IGdldF9kd19zaXplKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcsIHUzMiAqcGR3X2J1ZmZlcl9zaXplX3Vfdl9oKQoreworCWludCBwaWNfd2lkdGgsIHBpY19oZWlnaHQ7CisJaW50IGxjdV9zaXplID0gMTY7CisJaW50IGR3X2J1Zl9zaXplOworCXUzMiBkd19idWZmZXJfc2l6ZV91X3Y7CisJdTMyIGR3X2J1ZmZlcl9zaXplX3Vfdl9oOworCWludCBkd19tb2RlID0gIGh3LT5kb3VibGVfd3JpdGVfbW9kZTsKKworCXBpY193aWR0aCA9IGh3LT5mcmFtZV93aWR0aDsKKwlwaWNfaGVpZ2h0ID0gaHctPmZyYW1lX2hlaWdodDsKKworCWlmIChkd19tb2RlKSB7CisJCWludCBwaWNfd2lkdGhfZHcgPSBwaWNfd2lkdGggLworCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhody0+ZG91YmxlX3dyaXRlX21vZGUpOworCQlpbnQgcGljX2hlaWdodF9kdyA9IHBpY19oZWlnaHQgLworCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhody0+ZG91YmxlX3dyaXRlX21vZGUpOworCisJCWludCBwaWNfd2lkdGhfbGN1X2R3ID0gKHBpY193aWR0aF9kdyAlIGxjdV9zaXplKSA/CisJCQlwaWNfd2lkdGhfZHcgLyBsY3Vfc2l6ZSArIDEgOgorCQkJcGljX3dpZHRoX2R3IC8gbGN1X3NpemU7CisJCWludCBwaWNfaGVpZ2h0X2xjdV9kdyA9IChwaWNfaGVpZ2h0X2R3ICUgbGN1X3NpemUpID8KKwkJCXBpY19oZWlnaHRfZHcgLyBsY3Vfc2l6ZSArIDEgOgorCQkJcGljX2hlaWdodF9kdyAvIGxjdV9zaXplOworCQlpbnQgbGN1X3RvdGFsX2R3ID0gcGljX3dpZHRoX2xjdV9kdyAqIHBpY19oZWlnaHRfbGN1X2R3OworCisKKwkJZHdfYnVmZmVyX3NpemVfdV92ID0gbGN1X3RvdGFsX2R3ICogbGN1X3NpemUgKiBsY3Vfc2l6ZSAvIDI7CisJCWR3X2J1ZmZlcl9zaXplX3Vfdl9oID0gKGR3X2J1ZmZlcl9zaXplX3VfdiArIDB4ZmZmZikgPj4gMTY7CisJCQkvKjY0ayBhbGlnbm1lbnQqLworCQlkd19idWZfc2l6ZSA9ICgoZHdfYnVmZmVyX3NpemVfdV92X2ggPDwgMTYpICogMyk7CisJCSpwZHdfYnVmZmVyX3NpemVfdV92X2ggPSBkd19idWZmZXJfc2l6ZV91X3ZfaDsKKwl9IGVsc2UgeworCQkqcGR3X2J1ZmZlcl9zaXplX3Vfdl9oID0gMDsKKwkJZHdfYnVmX3NpemUgPSAwOworCX0KKworCXJldHVybiBkd19idWZfc2l6ZTsKK30KKworCitzdGF0aWMgdm9pZCBoZXZjX21jcl9jb25maWdfY2FudjJheGl0Ymwoc3RydWN0IHZkZWNfaDI2NF9od19zICpodywgaW50IHJlc3RvcmUpCit7CisJaW50IGksIHNpemU7CisJdTMyICAgY2FudmFzX2FkZHI7CisJdW5zaWduZWQgbG9uZyBtYWRkcjsKKwlpbnQgICAgIG51bV9idWZmID0gaHctPmRwYi5tRFBCLnNpemU7CisJaW50IGR3X3NpemUgPSAwOworCXUzMiBkd19idWZmZXJfc2l6ZV91X3ZfaDsKKwl1MzIgYmxrbW9kZSA9IGh3LT5jYW52YXNfbW9kZTsKKwlpbnQgZHdfbW9kZSA9ICBody0+ZG91YmxlX3dyaXRlX21vZGU7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaHcpOworCisJY2FudmFzX2FkZHIgPSBBTkMwX0NBTlZBU19BRERSOworCWZvciAoaSA9IDA7IGkgPCBudW1fYnVmZjsgaSsrKQorCQlXUklURV9WUkVHKChjYW52YXNfYWRkciArIGkpLCBpIHwgKGkgPDwgOCkgfCAoaSA8PCAxNikpOworCisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DMkFYSV9UQkxfQ09ORl9BRERSLCAoMHgxIDw8IDEpIHwgKDB4MSA8PCAyKSk7CisJc2l6ZSA9IGh3LT5sb3NsZXNzX2NvbXBfYm9keV9zaXplICsgaHctPmxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZTsKKworCisJZHdfc2l6ZSA9IGdldF9kd19zaXplKGh3LCAmZHdfYnVmZmVyX3NpemVfdV92X2gpOworCXNpemUgKz0gZHdfc2l6ZTsKKwlpZiAoc2l6ZSA+IDApCisJCXNpemUgKz0gMHgxMDAwMDsKKworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX01NVV9ERVRBSUwsCisJCSJkd19idWZmZXJfc2l6ZV91X3ZfaCA9ICVkLCBkd19zaXplID0gMHgleCwgc2l6ZSA9IDB4JXhcbiIsCisJCWR3X2J1ZmZlcl9zaXplX3Vfdl9oLCBkd19zaXplLCBzaXplKTsKKworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX01NVV9ERVRBSUwsCisJCSJib2R5X3NpemUgPSAlZCwgaGVhZGVyX3NpemUgPSAlZCwgYm9keV9zaXplX3NhbyA9ICVkXG4iLAorCQkJCWh3LT5sb3NsZXNzX2NvbXBfYm9keV9zaXplLAorCQkJCWh3LT5sb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUsCisJCQkJaHctPmxvc2xlc3NfY29tcF9ib2R5X3NpemVfc2FvKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fYnVmZjsgaSsrKSB7CisJCWlmICghcmVzdG9yZSkgeworCQkJaWYgKGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeShody0+Ym1tdV9ib3gsCisJCQkJSEVBREVSX0JVRkZFUl9JRFgoaSksIHNpemUsCisJCQkJRFJJVkVSX0hFQURFUl9OQU1FLCAmbWFkZHIpIDwgMCkgeworCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJCQkiJXMgbWFsbG9jIGNvbXByZXNzIGhlYWRlciBmYWlsZWQgJWRcbiIsCisJCQkJCURSSVZFUl9IRUFERVJfTkFNRSwgaSk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaWYgKGh3LT5lbmFibGVfZmVuY2UpIHsKKwkJCQl2ZGVjX2ZlbmNlX2J1ZmZlcl9jb3VudF9pbmNyZWFzZSgodWxvbmcpdmRlYy0+c3luYyk7CisJCQkJSU5JVF9MSVNUX0hFQUQoJnZkZWMtPnN5bmMtPnJlbGVhc2VfY2FsbGJhY2tbSEVBREVSX0JVRkZFUl9JRFgoaSldLm5vZGUpOworCQkJCWRlY29kZXJfYm1tdV9ib3hfYWRkX2NhbGxiYWNrX2Z1bmMoaHctPmJtbXVfYm94LCBIRUFERVJfQlVGRkVSX0lEWChpKSwgKHZvaWQgKikmdmRlYy0+c3luYy0+cmVsZWFzZV9jYWxsYmFja1tpXSk7CisJCQl9CisJCX0gZWxzZQorCQkJbWFkZHIgPSBody0+YnVmZmVyX3NwZWNbaV0uYWxsb2NfaGVhZGVyX2FkZHI7CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0RBVEEsICBtYWRkciA+PiA1KTsKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLmFsbG9jX2hlYWRlcl9hZGRyID0gbWFkZHI7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX01NVV9ERVRBSUwsCisJCQkiJXMgOiBjYW52YXM6ICVkICBheGlhZGRyOiV4IHNpemUgMHgleFxuIiwKKwkJCV9fZnVuY19fLCBpLCAodTMyKW1hZGRyLCBzaXplKTsKKworCQlpZiAoZHdfbW9kZSkgeworCQkJdTMyIGFkZHI7CisJCQlpbnQgY2FudmFzX3c7CisJCQlpbnQgY2FudmFzX2g7CisKKwkJCWNhbnZhc193ID0gaHctPmZyYW1lX3dpZHRoIC8KKwkJCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKGh3LT5kb3VibGVfd3JpdGVfbW9kZSk7CisJCQljYW52YXNfaCA9IGh3LT5mcmFtZV9oZWlnaHQgLworCQkJCWdldF9kb3VibGVfd3JpdGVfcmF0aW8oaHctPmRvdWJsZV93cml0ZV9tb2RlKTsKKworCQkJaWYgKGh3LT5jYW52YXNfbW9kZSA9PSAwKQorCQkJCWNhbnZhc193ID0gQUxJR04oY2FudmFzX3csIDMyKTsKKwkJCWVsc2UKKwkJCQljYW52YXNfdyA9IEFMSUdOKGNhbnZhc193LCA2NCk7CisJCQljYW52YXNfaCA9IEFMSUdOKGNhbnZhc19oLCAzMik7CisKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS5kd195X2FkciA9CisJCQkJbWFkZHIgKyBody0+bG9zbGVzc19jb21wX2hlYWRlcl9zaXplOworCisJCQlody0+YnVmZmVyX3NwZWNbaV0uZHdfeV9hZHIgPQorCQkJCSgoaHctPmJ1ZmZlcl9zcGVjW2ldLmR3X3lfYWRyICsgMHhmZmZmKSA+PiAxNikKKwkJCQkJPDwgMTY7CisJCQlody0+YnVmZmVyX3NwZWNbaV0uZHdfdV92X2FkciA9CisJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLmR3X3lfYWRyCisJCQkJKyAoZHdfYnVmZmVyX3NpemVfdV92X2ggPDwgMTYpICogMjsKKworCisJCQlody0+YnVmZmVyX3NwZWNbaV0uYnVmX2FkcgorCQkJCT0gaHctPmJ1ZmZlcl9zcGVjW2ldLmR3X3lfYWRyOworCQkJYWRkciA9IGh3LT5idWZmZXJfc3BlY1tpXS5idWZfYWRyOworCisKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX01NVV9ERVRBSUwsCisJCQkJImR3X3lfYWRyID0gMHgleCwgZHdfdV92X2FkciA9IDB4JXgsIHlfYWRkciA9IDB4JXgsIHVfYWRkciA9IDB4JXgsIHZfYWRkciA9IDB4JXgsIHdpZHRoID0gJWQsIGhlaWdodCA9ICVkXG4iLAorCQkJCWh3LT5idWZmZXJfc3BlY1tpXS5kd195X2FkciwKKwkJCQlody0+YnVmZmVyX3NwZWNbaV0uZHdfdV92X2FkciwKKwkJCQlody0+YnVmZmVyX3NwZWNbaV0ueV9hZGRyLAorCQkJCWh3LT5idWZmZXJfc3BlY1tpXS51X2FkZHIsCisJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZfYWRkciwKKwkJCQljYW52YXNfdywKKwkJCQljYW52YXNfaCk7CisKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfY29uZmlnWzBdLnBoeV9hZGRyID0KKwkJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLmR3X3lfYWRyOworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMF0ud2lkdGggPSBjYW52YXNfdzsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfY29uZmlnWzBdLmhlaWdodCA9IGNhbnZhc19oOworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMF0uYmxvY2tfbW9kZSA9CisJCQkJYmxrbW9kZTsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfY29uZmlnWzBdLmVuZGlhbiA9IDc7CisKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfY29uZmlnWzFdLnBoeV9hZGRyID0KKwkJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLmR3X3Vfdl9hZHI7CisJCQlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1sxXS53aWR0aCA9IGNhbnZhc193OworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMV0uaGVpZ2h0ID0gY2FudmFzX2g7CisJCQlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1sxXS5ibG9ja19tb2RlID0KKwkJCQlibGttb2RlOworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMV0uZW5kaWFuID0gNzsKKwkJfQorCX0KKwlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9DT05GX0FERFIsIDB4MSk7CisKKwlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0FDQ0NPTkZJR19BRERSLCAoMCA8PCA4KSB8ICgwPDwxKSB8IDEpOworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUiwgMCk7CisJcmV0dXJuOworfQorc3RhdGljIHZvaWQgICAgaGV2Y19tY3JfY29uZmlnX21jX3JlZihzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3KQoreworCXUzMiBpOworCXUzMiByZWZfY2FudjsKKwlzdHJ1Y3QgU2xpY2UgKnBTbGljZSA9ICYoaHctPmRwYi5tU2xpY2UpOworCS8qUkVGTElTVFswXSovCisJZm9yIChpID0gMDsgaSA8ICh1bnNpZ25lZCBpbnQpKHBTbGljZS0+bGlzdFhzaXplWzBdKTsgaSsrKSB7CisJCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnJlZiA9IHBTbGljZS0+bGlzdFhbMF1baV07CisJCWlmIChyZWYgPT0gTlVMTCkKKwkJCXJldHVybjsKKwkJV1JJVEVfVlJFRyhDVVJSX0NBTlZBU19DVFJMLCByZWYtPmJ1Zl9zcGVjX251bTw8MjQpOworCQlyZWZfY2FudiA9IFJFQURfVlJFRyhDVVJSX0NBTlZBU19DVFJMKSYweGZmZmZmZjsKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwKKwkJCQkJKHJlZi0+YnVmX3NwZWNfbnVtICYgMHgzZikgPDwgOCk7CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSLCByZWZfY2Fudik7CisJfQorCS8qUkVGTElTVFsxXSovCisJZm9yIChpID0gMDsgaSA8ICh1bnNpZ25lZCBpbnQpKHBTbGljZS0+bGlzdFhzaXplWzFdKTsgaSsrKSB7CisJCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnJlZiA9IHBTbGljZS0+bGlzdFhbMV1baV07CisJCWlmIChyZWYgPT0gTlVMTCkKKwkJCXJldHVybjsKKwkJV1JJVEVfVlJFRyhDVVJSX0NBTlZBU19DVFJMLCByZWYtPmJ1Zl9zcGVjX251bTw8MjQpOworCQlyZWZfY2FudiA9IFJFQURfVlJFRyhDVVJSX0NBTlZBU19DVFJMKSYweGZmZmZmZjsKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwKKwkJCQkJKHJlZi0+YnVmX3NwZWNfbnVtICYgMHgzZikgPDwgOCk7CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSLCByZWZfY2Fudik7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgICBoZXZjX21jcl9jb25maWdfbWNyY2Moc3RydWN0IHZkZWNfaDI2NF9od19zICpodykKK3sKKwl1MzIgcmRhdGEzMjsKKwl1MzIgcmRhdGEzMl8yOworCXUzMiBzbGljZV90eXBlOworCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnJlZjsKKwlzdHJ1Y3QgU2xpY2UgKnBTbGljZTsKKwlzbGljZV90eXBlID0gaHctPmRwYi5tU2xpY2Uuc2xpY2VfdHlwZTsKKwlwU2xpY2UgPSAmKGh3LT5kcGIubVNsaWNlKTsKKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDEsIDB4Mik7CisJaWYgKHNsaWNlX3R5cGUgPT0gSV9TTElDRSkgeworCQlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDEsIDB4MCk7CisJCXJldHVybjsKKwl9CisJaWYgKHNsaWNlX3R5cGUgPT0gQl9TTElDRSkgeworCQlyZWYgPSBwU2xpY2UtPmxpc3RYWzBdWzBdOworCQlpZiAocmVmID09IE5VTEwpCisJCQlyZXR1cm47CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfQUNDQ09ORklHX0FERFIsCisJCQkJKChyZWYtPmJ1Zl9zcGVjX251bSAmIDB4M2YpIDw8IDgpKTsKKwkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIpOworCQlyZGF0YTMyID0gcmRhdGEzMiAmIDB4ZmZmZjsKKwkJcmRhdGEzMiA9IHJkYXRhMzIgfCAocmRhdGEzMiA8PCAxNik7CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMiwgcmRhdGEzMik7CisKKwkJcmVmID0gcFNsaWNlLT5saXN0WFsxXVswXTsKKwkJaWYgKHJlZiA9PSBOVUxMKQorCQkJcmV0dXJuOworCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0FDQ0NPTkZJR19BRERSLAorCQkJKChyZWYtPmJ1Zl9zcGVjX251bSAmIDB4M2YpIDw8IDgpKTsKKwkJcmRhdGEzMl8yID0gUkVBRF9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUik7CisJCXJkYXRhMzJfMiA9IHJkYXRhMzJfMiAmIDB4ZmZmZjsKKwkJcmRhdGEzMl8yID0gcmRhdGEzMl8yIHwgKHJkYXRhMzJfMiA8PCAxNik7CisJCWlmIChyZGF0YTMyID09IHJkYXRhMzJfMikgeworCQkJcmVmID0gcFNsaWNlLT5saXN0WFsxXVsxXTsKKwkJCWlmIChyZWYgPT0gTlVMTCkKKwkJCQlyZXR1cm47CisJCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0FDQ0NPTkZJR19BRERSLAorCQkJCSgocmVmLT5idWZfc3BlY19udW0gJiAweDNmKSA8PCA4KSk7CisJCQlyZGF0YTMyXzIgPSBSRUFEX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSKTsKKwkJCXJkYXRhMzJfMiA9IHJkYXRhMzJfMiAmIDB4ZmZmZjsKKwkJCXJkYXRhMzJfMiA9IHJkYXRhMzJfMiB8IChyZGF0YTMyXzIgPDwgMTYpOworCQl9CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMywgcmRhdGEzMl8yKTsKKwl9IGVsc2UgeyAvKlAtUElDKi8KKwkJcmVmID0gcFNsaWNlLT5saXN0WFswXVswXTsKKwkJaWYgKHJlZiA9PSBOVUxMKQorCQkJcmV0dXJuOworCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0FDQ0NPTkZJR19BRERSLAorCQkJCSgocmVmLT5idWZfc3BlY19udW0gJiAweDNmKSA8PCA4KSk7CisJCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSKTsKKwkJcmRhdGEzMiA9IHJkYXRhMzIgJiAweGZmZmY7CisJCXJkYXRhMzIgPSByZGF0YTMyIHwgKHJkYXRhMzIgPDwgMTYpOworCQlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDIsIHJkYXRhMzIpOworCisJCXJlZiA9IHBTbGljZS0+bGlzdFhbMF1bMV07CisJCWlmIChyZWYgPT0gTlVMTCkKKwkJCXJldHVybjsKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwKKwkJCQkoKHJlZi0+YnVmX3NwZWNfbnVtICYgMHgzZikgPDwgOCkpOworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUik7CisJCXJkYXRhMzIgPSByZGF0YTMyICYgMHhmZmZmOworCQlyZGF0YTMyID0gcmRhdGEzMiB8IChyZGF0YTMyIDw8IDE2KTsKKwkJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwzLCByZGF0YTMyKTsKKwl9CisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwxLCAweGZmMCk7CisJcmV0dXJuOworfQorCisKK3N0YXRpYyB2b2lkICBoZXZjX21jcl9zYW9fZ2xvYmFsX2h3X2luaXQoc3RydWN0IHZkZWNfaDI2NF9od19zICpodywKKwkJdTMyIHdpZHRoLCB1MzIgaGVpZ2h0KSB7CisJdTMyIGRhdGEzMjsKKwl1MzIgbGN1X3hfbnVtLCBsY3VfeV9udW07CisJdTMyIGxjdV90b3RhbDsKKwl1MzIgbWNfYnVmZmVyX3NpemVfdV92OworCXUzMiBtY19idWZmZXJfc2l6ZV91X3ZfaDsKKwlpbnQgIGR3X21vZGUgPSBody0+ZG91YmxlX3dyaXRlX21vZGU7CisKKwkvKmxjdV94X251bSA9ICh3aWR0aCArIDE1KSA+PiA0OyovCisJLy8gd2lkdGggbmVlZCB0byBiZSByb3VuZCB0byA2NCBwaXhlbCAtLSBjYXNlMDI2MCAxLzEwLzIwMjAKKwlsY3VfeF9udW0gPSAoKCh3aWR0aCArIDYzKSA+PiA2KSA8PCAyKTsKKwlsY3VfeV9udW0gPSAoaGVpZ2h0ICsgMTUpID4+IDQ7CisJbGN1X3RvdGFsID0gbGN1X3hfbnVtICogbGN1X3lfbnVtOworCisJaHctPm1jX2J1ZmZlcl9zaXplX3VfdiA9IG1jX2J1ZmZlcl9zaXplX3VfdiA9IGxjdV90b3RhbCoxNioxNi8yOworCWh3LT5tY19idWZmZXJfc2l6ZV91X3ZfaCA9CisJCW1jX2J1ZmZlcl9zaXplX3Vfdl9oID0gKG1jX2J1ZmZlcl9zaXplX3VfdiArIDB4ZmZmZik+PjE2OworCisJaHctPmxvc2xlc3NfY29tcF9ib2R5X3NpemUgPSAwOworCisJaHctPmxvc2xlc3NfY29tcF9ib2R5X3NpemVfc2FvID0KKwkJCWNvbXB1dGVfbG9zbGVzc19jb21wX2JvZHlfc2l6ZSh3aWR0aCwgaGVpZ2h0LCAwKTsKKwlody0+bG9zbGVzc19jb21wX2hlYWRlcl9zaXplID0KKwkJCWNvbXB1dGVfbG9zbGVzc19jb21wX2hlYWRlcl9zaXplKHdpZHRoLCBoZWlnaHQpOworCisJV1JJVEVfVlJFRyhIRVZDRF9JUFBfVE9QX0NOVEwsIDB4MSk7IC8qc3cgcmVzZXQgaXBwMTBiX3RvcCovCisJV1JJVEVfVlJFRyhIRVZDRF9JUFBfVE9QX0NOVEwsIDB4MCk7IC8qc3cgcmVzZXQgaXBwMTBiX3RvcCovCisKKwkvKiBzZXR1cCBsY3Vfc2l6ZSA9IDE2Ki8KKwlXUklURV9WUkVHKEhFVkNEX0lQUF9UT1BfTENVQ09ORklHLCAxNik7IC8qc2V0IGxjdSBzaXplID0gMTYqLworCS8qcGljX3dpZHRoL3BpY19oZWlnaHQqLworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX1RPUF9GUk1DT05GSUcsCisJCShoZWlnaHQgJiAweGZmZmYpIDw8IDE2IHwgKHdpZHRoICYgMHhmZmZmKSk7CisJLyogYml0ZGVwdGhfbHVtYSA9IDgqLworCS8qIGJpdGRlcHRoX2Nocm9tYSA9IDgqLworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX0JJVERFUFRIX0NPTkZJRywgMHgwKTsvKnNldCBiaXQtZGVwdGggOCAqLworCisjaWZkZWYJSDI2NV9MT1NMRVNTX0NPTVBSRVNTX01PREUKKwlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMSwgKDB4MSA8PCA0KSk7CisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDIsIDB4MCk7CisjZWxzZQorCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLCAweDEgPDwgMzEpOworI2VuZGlmCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNEX0lQUF9BWElJRl9DT05GSUcpOworCWRhdGEzMiAmPSAofjB4MzApOworCWRhdGEzMiB8PSAoaHctPmNhbnZhc19tb2RlIDw8IDQpOworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX0FYSUlGX0NPTkZJRywgZGF0YTMyKTsKKworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwzLAorCQkJKDB4ODAgPDwgMjApIHwgKDB4ODAgPDwgMTApIHwgKDB4ZmYpKTsKKworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX1ZERUNfTUNSX0NUTCwgMHgxIHwgKDB4MSA8PCA0KSk7CisKKwkvKmNvbWZpZyB2ZGVjOmgyNjQ6bWRlYyB0byB1c2UgaGV2YyBtY3IvbWNyY2MvZGVjb21wKi8KKwlXUklURV9WUkVHKE1ERUNfUElDX0RDX01VWF9DVFJMLAorCQkJUkVBRF9WUkVHKE1ERUNfUElDX0RDX01VWF9DVFJMKSB8IDB4MSA8PCAzMSk7CisJLyogaXBwX2VuYWJsZSovCisJV1JJVEVfVlJFRyhIRVZDRF9JUFBfVE9QX0NOVEwsIDB4MSA8PCAxKTsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpIHsKKwkJICBXUklURV9WUkVHKEhFVkNfREJMS19DRkcxLCAweDIpOyAvLyBzZXQgY3R1c2l6ZT09MTYKKwkJICBXUklURV9WUkVHKEhFVkNfREJMS19DRkcyLCAoKGhlaWdodCAmIDB4ZmZmZik8PDE2KSB8ICh3aWR0aCAmIDB4ZmZmZikpOworCQkgIGlmIChkd19tb2RlICYgMHgxMCkKKwkJCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGR0IsIDB4NDA0MDU2MDMpOworCQkgIGVsc2UgaWYgKGR3X21vZGUpCisJCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkdCLCAweDQwNDA1NzAzKTsKKwkJICBlbHNlCisJCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkdCLCAweDQwNDA1NTAzKTsKKwl9CisKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDApOworCWRhdGEzMiAmPSAofjB4Zik7CisJZGF0YTMyIHw9IDB4NDsKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkwwLCBkYXRhMzIpOworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fUElDX1NJWkUsIChoZWlnaHQgJiAweGZmZmYpIDw8IDE2IHwKKwkJCSh3aWR0aCAmIDB4ZmZmZikpOworCWRhdGEzMiAgPSAoKGxjdV94X251bS0xKSB8IChsY3VfeV9udW0tMSkgPDwgMTYpOworCisJV1JJVEVfVlJFRyhIRVZDX1NBT19QSUNfU0laRV9MQ1UsIGRhdGEzMik7CisJZGF0YTMyICA9ICAobGN1X3hfbnVtICB8IGxjdV95X251bSA8PCAxNik7CisJV1JJVEVfVlJFRyhIRVZDX1NBT19USUxFX1NJWkVfTENVLCBkYXRhMzIpOworCWRhdGEzMiA9IChtY19idWZmZXJfc2l6ZV91X3ZfaCA8PCAxNikgPDwgMTsKKwlXUklURV9WUkVHKEhFVkNfU0FPX1lfTEVOR1RILCBkYXRhMzIpOworCWRhdGEzMiA9IChtY19idWZmZXJfc2l6ZV91X3ZfaCA8PCAxNik7CisJV1JJVEVfVlJFRyhIRVZDX1NBT19DX0xFTkdUSCwgZGF0YTMyKTsKKworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMMSk7CisJZGF0YTMyICY9ICh+MHgzMDAwKTsKKwlkYXRhMzIgJj0gKH4weGZmMCk7CisJZGF0YTMyIHw9IGVuZGlhbjsJLyogQmlnLUVuZGlhbiBwZXIgNjQtYml0ICovCisKKwlpZiAoaHctPm1tdV9lbmFibGUgJiYgKGR3X21vZGUgJiAweDEwKSkKKwkJZGF0YTMyIHw9ICgoaHctPmNhbnZhc19tb2RlIDw8IDEyKSB8MSk7CisJZWxzZSBpZiAoaHctPm1tdV9lbmFibGUgJiYgZHdfbW9kZSkKKwkJZGF0YTMyIHw9ICgoaHctPmNhbnZhc19tb2RlIDw8IDEyKSk7CisJZWxzZQorCQlkYXRhMzIgfD0gKChody0+Y2FudmFzX21vZGUgPDwgMTIpfDIpOworCisJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMMSwgZGF0YTMyKTsKKworI2lmZGVmCUgyNjVfRFdfTk9fU0NBTEUKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw1LCBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDUpICYgfigweGZmIDw8IDE2KSk7CisJaWYgKGh3LT5tbXVfZW5hYmxlICYmIGR3X21vZGUpIHsKKwkJZGF0YTMyID0JUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkw1KTsKKwkJZGF0YTMyICY9ICh+KDB4ZmYgPDwgMTYpKTsKKwkJaWYgKGR3X21vZGUgPT0gMiB8fAorCQkJZHdfbW9kZSA9PSAzKQorCQkJZGF0YTMyIHw9ICgweGZmPDwxNik7CisJCWVsc2UgaWYgKGR3X21vZGUgPT0gNCkKKwkJCWRhdGEzMiB8PSAoMHgzMzw8MTYpOworCQlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw1LCBkYXRhMzIpOworCX0KKworCisjZW5kaWYKKworCisjaWZkZWYJSDI2NV9MT1NMRVNTX0NPTVBSRVNTX01PREUKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDUpOworCWRhdGEzMiB8PSAoMTw8OSk7IC8qOC1iaXQgc21lbS1tb2RlKi8KKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw1LCBkYXRhMzIpOworCisJV1JJVEVfVlJFRyhIRVZDX0NNX0JPRFlfTEVOR1RILCBody0+bG9zbGVzc19jb21wX2JvZHlfc2l6ZV9zYW8pOworCVdSSVRFX1ZSRUcoSEVWQ19DTV9IRUFERVJfT0ZGU0VULCBody0+bG9zbGVzc19jb21wX2JvZHlfc2l6ZSk7CisJV1JJVEVfVlJFRyhIRVZDX0NNX0hFQURFUl9MRU5HVEgsIGh3LT5sb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUpOworI2VuZGlmCisKKyNpZmRlZglIMjY1X0xPU0xFU1NfQ09NUFJFU1NfTU9ERQorCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDksIFJFQURfVlJFRyhIRVZDX1NBT19DVFJMOSkgfCAoMHgxIDw8IDEpKTsKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw1LCBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDUpIHwgKDB4MSA8PCAxMCkpOworI2VuZGlmCisKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw5LCBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDkpIHwgMHgxIDw8IDcpOworCisJbWVtc2V0KGh3LT5mcmFtZV9tbXVfbWFwX2FkZHIsIDAsIEZSQU1FX01NVV9NQVBfU0laRSk7CisKKwlXUklURV9WUkVHKE1ERUNfRVhUSUZfQ0ZHMCwgaHctPmV4dGlmX2FkZHIpOworCVdSSVRFX1ZSRUcoTURFQ19FWFRJRl9DRkcxLCAweDgwMDAwMDAwKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkICBoZXZjX3Nhb19zZXRfc2xpY2VfdHlwZShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LAorCQl1MzIgaXNfbmV3X3BpYywgdTMyIGlzX2lkcikKK3sKKwlody0+aXNfbmV3X3BpYyA9IGlzX25ld19waWM7CisJaHctPmlzX2lkcl9mcmFtZSA9IGlzX2lkcjsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkICBoZXZjX3Nhb19zZXRfcGljX2J1ZmZlcihzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LAorCQkJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqcGljKSB7CisJdTMyIG1jX3lfYWRyOworCXUzMiBtY191X3ZfYWRyOworCXUzMiBkd195X2FkcjsKKwl1MzIgZHdfdV92X2FkcjsKKwl1MzIgY2FudmFzX2FkZHI7CisJaW50IHJldDsKKwlpbnQgIGR3X21vZGUgPSBody0+ZG91YmxlX3dyaXRlX21vZGU7CisJaWYgKGh3LT5pc19uZXdfcGljICE9IDEpCisJCXJldHVybjsKKworCWlmIChody0+aXNfaWRyX2ZyYW1lKSB7CisJCS8qIFdpbGxpYW0gVEJEICovCisJCW1lbXNldChody0+ZnJhbWVfbW11X21hcF9hZGRyLCAwLCBGUkFNRV9NTVVfTUFQX1NJWkUpOworCX0KKworCVdSSVRFX1ZSRUcoQ1VSUl9DQU5WQVNfQ1RSTCwgcGljLT5idWZfc3BlY19udW0gPDwgMjQpOworCWNhbnZhc19hZGRyID0gUkVBRF9WUkVHKENVUlJfQ0FOVkFTX0NUUkwpJjB4ZmZmZmZmOworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0NPTkZfQUREUiwgKDB4MCA8PCAxKSB8CisJCQkoMHgwIDw8IDIpIHwgKChjYW52YXNfYWRkciAmIDB4ZmYpIDw8IDgpKTsKKwltY195X2FkciA9IFJFQURfVlJFRyhIRVZDRF9NUFBfQU5DMkFYSV9UQkxfREFUQSkgPDwgNTsKKwlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9DT05GX0FERFIsICgweDAgPDwgMSkgfAorCQkJKDB4MCA8PCAyKSB8ICgoKGNhbnZhc19hZGRyID4+IDgpICYgMHhmZikgPDwgOCkpOworCW1jX3Vfdl9hZHIgPSBSRUFEX1ZSRUcoSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0RBVEEpIDw8IDU7CisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DMkFYSV9UQkxfQ09ORl9BRERSLCAweDEpOworCisKKwlpZiAoZHdfbW9kZSkgeworCQlkd195X2FkciA9IGh3LT5idWZmZXJfc3BlY1twaWMtPmJ1Zl9zcGVjX251bV0uZHdfeV9hZHI7CisJCWR3X3Vfdl9hZHIgPSBody0+YnVmZmVyX3NwZWNbcGljLT5idWZfc3BlY19udW1dLmR3X3Vfdl9hZHI7CisJfSBlbHNlIHsKKwkJZHdfeV9hZHIgPSAwOworCQlkd191X3ZfYWRyID0gMDsKKwl9CisjaWZkZWYJSDI2NV9MT1NMRVNTX0NPTVBSRVNTX01PREUKKwlpZiAoZHdfbW9kZSkKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19ZX1NUQVJUX0FERFIsIGR3X3lfYWRyKTsKKwlXUklURV9WUkVHKEhFVkNfQ01fQk9EWV9TVEFSVF9BRERSLCBtY195X2Fkcik7CisjaWZkZWYJSDI2NF9NTVUKKwlXUklURV9WUkVHKEhFVkNfQ01fSEVBREVSX1NUQVJUX0FERFIsIG1jX3lfYWRyKTsKKyNlbHNlCisJV1JJVEVfVlJFRyhIRVZDX0NNX0hFQURFUl9TVEFSVF9BRERSLAorCQkJKG1jX3lfYWRyICsgaHctPmxvc2xlc3NfY29tcF9ib2R5X3NpemUpKTsKKyNlbmRpZgorI2Vsc2UKKwlXUklURV9WUkVHKEhFVkNfU0FPX1lfU1RBUlRfQUREUiwgbWNfeV9hZHIpOworI2VuZGlmCisKKyNpZm5kZWYgSDI2NV9MT1NMRVNTX0NPTVBSRVNTX01PREUKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NfU1RBUlRfQUREUiwgbWNfdV92X2Fkcik7CisjZWxzZQorCWlmIChkd19tb2RlKQorCQlXUklURV9WUkVHKEhFVkNfU0FPX0NfU1RBUlRfQUREUiwgZHdfdV92X2Fkcik7CisjZW5kaWYKKworI2lmbmRlZiBMT1NMRVNTX0NPTVBSRVNTX01PREUKKwlpZiAoZHdfbW9kZSkgeworCQlXUklURV9WUkVHKEhFVkNfU0FPX1lfV1BUUiwgbWNfeV9hZHIpOworCQlXUklURV9WUkVHKEhFVkNfU0FPX0NfV1BUUiwgbWNfdV92X2Fkcik7CisJfQorI2Vsc2UKKwlXUklURV9WUkVHKEhFVkNfU0FPX1lfV1BUUiwgZHdfeV9hZHIpOworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ19XUFRSLCBkd191X3ZfYWRyKTsKKyNlbmRpZgorCisJcmV0ID0gaGV2Y19hbGxvY19tbXUoaHcsIHBpYy0+YnVmX3NwZWNfbnVtLAorCQkJKGh3LT5tYl93aWR0aCA8PCA0KSwgKGh3LT5tYl9oZWlnaHQgPDwgNCksIDB4MCwKKwkJCWh3LT5mcmFtZV9tbXVfbWFwX2FkZHIpOworCWlmIChyZXQgIT0gMCkgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJUFJJTlRfRkxBR19NTVVfREVUQUlMLCAiY2FuJ3QgYWxsb2MgbmVlZCBtbXUxLGlkeCAlZCByZXQgPSVkXG4iLAorCQlwaWMtPmJ1Zl9zcGVjX251bSwKKwkJcmV0KTsKKwkJcmV0dXJuOworCX0KKworCS8qUmVzZXQgU0FPICsgRW5hYmxlIFNBTyBzbGljZV9zdGFydCovCisJaWYgKGh3LT5tbXVfZW5hYmxlICAmJiBnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpCisJCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGRzAsIDB4MSk7IC8vIHJlc2V0IGJ1ZmZlcjMyeDQgaW4gbHBmIGZvciBldmVyeSBwaWN0dXJlCisJV1JJVEVfVlJFRyhIRVZDX1NBT19JTlRfU1RBVFVTLAorCQkJUkVBRF9WUkVHKEhFVkNfU0FPX0lOVF9TVEFUVVMpIHwgMHgxIDw8IDI4KTsKKwlXUklURV9WUkVHKEhFVkNfU0FPX0lOVF9TVEFUVVMsCisJCQlSRUFEX1ZSRUcoSEVWQ19TQU9fSU5UX1NUQVRVUykgfCAweDEgPDwgMzEpOworCS8qcHJfaW5mbygiaGV2Y19zYW9fc2V0X3BpY19idWZmZXI6bWNfeV9hZHI6ICV4XG4iLCBtY195X2Fkcik7Ki8KKwkvKlNlbmQgY29vbW1hbmQgdG8gaGV2Yy1jb2RlIHRvIHN1cHBseSA0ayBidWZmZXJzIHRvIHNhbyovCisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpIHsKKwkJV1JJVEVfVlJFRyhIMjY1X1NBT180S19TRVRfQkFTRSwgKHUzMilody0+ZnJhbWVfbW11X21hcF9waHlfYWRkcik7CisJCVdSSVRFX1ZSRUcoSDI2NV9TQU9fNEtfU0VUX0NPVU5ULCBNQVhfRlJBTUVfNEtfTlVNKTsKKwl9IGVsc2UKKwkJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9NTVVfTUFQX0FERFIsICh1MzIpaHctPmZyYW1lX21tdV9tYXBfcGh5X2FkZHIpOworCVdSSVRFX1ZSRUcoU1lTX0NPTU1BTkQsIEgyNjVfUFVUX1NBT180S19TRVQpOworCWh3LT5mcmFtZV9idXN5ID0gMTsKKwlyZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQgIGhldmNfc2V0X3VudXNlZF80a19idWZmX2lkeChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LAorCQl1MzIgYnVmX3NwZWNfbnVtKSB7CisJV1JJVEVfVlJFRyhDVVJSX0NBTlZBU19DVFJMLCBidWZfc3BlY19udW08PDI0KTsKKwlody0+aGV2Y19jdXJfYnVmX2lkeCA9IFJFQURfVlJFRyhDVVJSX0NBTlZBU19DVFJMKSYweGZmOworCWRwYl9wcmludChERUNPREVfSUQoaHcpLAorCQlQUklOVF9GTEFHX01NVV9ERVRBSUwsICIgJXMgIGN1cl9idWZfaWR4ICVkICBidWZfc3BlY19udW0gJWRcbiIsCisJCV9fZnVuY19fLCBody0+aGV2Y19jdXJfYnVmX2lkeCwgYnVmX3NwZWNfbnVtKTsKKwlyZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQgIGhldmNfc2V0X2ZyYW1lX2RvbmUoc3RydWN0IHZkZWNfaDI2NF9od19zICpodykKK3sKKwl1bG9uZyB0aW1lb3V0ID0gamlmZmllcyArIEhaOworCWRwYl9wcmludChERUNPREVfSUQoaHcpLAorCQlQUklOVF9GTEFHX01NVV9ERVRBSUwsICJoZXZjX2ZyYW1lX2RvbmUuLi5zZXRcbiIpOworCXdoaWxlICgoUkVBRF9WUkVHKEhFVkNfU0FPX0lOVF9TVEFUVVMpICYgMHgxKSA9PSAwKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCVBSSU5UX0ZMQUdfTU1VX0RFVEFJTCwgIiAlcy4udGltZW91dCFcbiIsIF9fZnVuY19fKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXRpbWVvdXQgPSBqaWZmaWVzICsgSFo7CisJd2hpbGUgKFJFQURfVlJFRyhIRVZDX0NNX0NPUkVfU1RBVFVTKSAmIDB4MSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQlQUklOVF9GTEFHX01NVV9ERVRBSUwsICIgJXMgY21fY29yZS4udGltZW91dCFcbiIsIF9fZnVuY19fKTsKKwkJCWJyZWFrOworCQl9CisJfQorCVdSSVRFX1ZSRUcoSEVWQ19TQU9fSU5UX1NUQVRVUywgMHgxKTsKKwlody0+ZnJhbWVfZG9uZSA9IDE7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX2N1cl9kZWNvZGluZ19idWYoc3RydWN0IHZkZWNfaDI2NF9od19zICpodykKK3sKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9ICZody0+ZHBiOworCWlmIChwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUpIHsKKwkJcmVsZWFzZV9waWN0dXJlKHBfSDI2NF9EcGIsCisJCQlwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUpOworCQlwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPmRhdGFfZmxhZyAmPSB+RVJST1JfRkxBRzsKKwkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlID0gTlVMTDsKKwkJaWYgKGh3LT5tbXVfZW5hYmxlKQorCQkJaGV2Y19zZXRfZnJhbWVfZG9uZShodyk7CisJfQorfQorCitzdGF0aWMgdm9pZCAgaGV2Y19zYW9fd2FpdF9kb25lKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcpCit7CisJdWxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBIWjsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJUFJJTlRfRkxBR19NTVVfREVUQUlMLCAiaGV2Y19zYW9fd2FpdF9kb25lLi4uc3RhcnRcbiIpOworCXdoaWxlICgoUkVBRF9WUkVHKEhFVkNfU0FPX0lOVF9TVEFUVVMpID4+IDMxKSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQlQUklOVF9GTEFHX01NVV9ERVRBSUwsCisJCQkiaGV2Y19zYW9fd2FpdF9kb25lLi4ud2FpdCB0aW1lb3V0IVxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKwl0aW1lb3V0ID0gamlmZmllcyArIEhaOworCWlmICgoaHctPmZyYW1lX2J1c3kgPT0gMSkgJiYgKGh3LT5mcmFtZV9kb25lID09IDEpICkgeworCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgIEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKSB7CisJCVdSSVRFX1ZSRUcoU1lTX0NPTU1BTkQsIEgyNjVfQUJPUlRfU0FPXzRLX1NFVCk7CisJCQl3aGlsZSAoKFJFQURfVlJFRyhTWVNfQ09NTUFORCkgJiAweGZmKSAhPQorCQkJCQlIMjY1X0FCT1JUX1NBT180S19TRVRfRE9ORSkgeworCQkJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJCQlQUklOVF9GTEFHX01NVV9ERVRBSUwsCisJCQkJCQkid2FpdCBoMjY1X2Fib3J0X3Nhb180a19zZXRfZG9uZSB0aW1lb3V0IVxuIik7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJfQorCQl9CisJCWFtaGV2Y19zdG9wKCk7CisJCWh3LT5mcmFtZV9idXN5ID0gMDsKKwkJaHctPmZyYW1lX2RvbmUgPSAwOworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCVBSSU5UX0ZMQUdfTU1VX0RFVEFJTCwKKwkJCSJzYW8gd2FpdCBkb25lICxoZXZjIHN0b3AhXG4iKTsKKwl9CisJcmV0dXJuOworfQorc3RhdGljIHZvaWQgYnVmX3NwZWNfaW5pdChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LCBib29sIGJ1ZmZlcl9yZXNldF9mbGFnKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5idWZzcGVjX2xvY2ssIGZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBWRl9QT09MX1NJWkU7IGkrKykgeworCQlzdHJ1Y3QgdmZyYW1lX3MgKnZmID0gJmh3LT52ZnBvb2xbaHctPmN1cl9wb29sXVtpXTsKKwkJdTMyIHJlZl9pZHggPSBCVUZTUEVDX0lOREVYKHZmLT5pbmRleCk7CisJCWlmICgodmYtPmluZGV4ICE9IC0xKSAmJgorCQkJKGh3LT5idWZmZXJfc3BlY1tyZWZfaWR4XS52Zl9yZWYgPT0gMCkgJiYKKwkJCShody0+YnVmZmVyX3NwZWNbcmVmX2lkeF0udXNlZCAhPSAtMSkpIHsKKwkJCXZmLT5pbmRleCA9IC0xOworCQl9CisJfQorCisJaHctPmN1cl9wb29sKys7CisJaWYgKGh3LT5jdXJfcG9vbCA+PSBWRl9QT09MX05VTSkKKwkJaHctPmN1cl9wb29sID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBWRl9QT09MX1NJWkU7IGkrKykgeworCQlzdHJ1Y3QgdmZyYW1lX3MgKnZmID0gJmh3LT52ZnBvb2xbaHctPmN1cl9wb29sXVtpXTsKKwkJdTMyIHJlZl9pZHggPSBCVUZTUEVDX0lOREVYKHZmLT5pbmRleCk7CisJCWlmICgodmYtPmluZGV4ICE9IC0xKSAmJgorCQkJKGh3LT5idWZmZXJfc3BlY1tyZWZfaWR4XS52Zl9yZWYgPT0gMCkgJiYKKwkJCShody0+YnVmZmVyX3NwZWNbcmVmX2lkeF0udXNlZCAhPSAtMSkpIHsKKwkJCXZmLT5pbmRleCA9IC0xOworCQl9CisJfQorCS8qIGJ1ZmZlcnMgYXJlIGFsbG9jZWQgd2hlbiBlcnJvciByZXNldCwgdjRsIG11c3QgZmluZCBidWZmZXIgYnkgYnVmZmVyX3dyYXBbXSAqLworCWlmIChody0+cmVzZXRfYnVmbWdyX2ZsYWcgJiYgYnVmZmVyX3Jlc2V0X2ZsYWcpIHsKKwkJZm9yIChpID0gMDsgaSA8IEJVRlNQRUNfUE9PTF9TSVpFOyBpKyspIHsKKwkJCWlmIChody0+YnVmZmVyX3NwZWNbaV0udXNlZCA9PSAxIHx8IGh3LT5idWZmZXJfc3BlY1tpXS51c2VkID09IDIpCisJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnVzZWQgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IEJVRlNQRUNfUE9PTF9TSVpFOyBpKyspIHsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS51c2VkID0gLTE7CisJCQlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX3BvcyA9IC0xOworCQkJaHctPmJ1ZmZlcl93cmFwW2ldID0gLTE7CisJCX0KKwl9CisKKwlpZiAoZHBiX2lzX2RlYnVnKERFQ09ERV9JRChodyksCisJCVBSSU5UX0ZMQUdfRFVNUF9CVUZTUEVDKSkKKwkJZHVtcF9idWZzcGVjKGh3LCBfX2Z1bmNfXyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmJ1ZnNwZWNfbG9jaywgZmxhZ3MpOworfQorCisKKy8qaXMgYWN0aXZlIGluIGJ1ZiBtYW5hZ2VtZW50ICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBpc19idWZfc3BlY19pbl91c2Uoc3RydWN0IHZkZWNfaDI2NF9od19zICpodywKKwlpbnQgYnVmX3NwZWNfbnVtKQoreworCXVuc2lnbmVkIGNoYXIgcmV0ID0gMDsKKwlpZiAoaHctPmJ1ZmZlcl9zcGVjW2J1Zl9zcGVjX251bV0udXNlZCA9PSAxIHx8CisJCWh3LT5idWZmZXJfc3BlY1tidWZfc3BlY19udW1dLnVzZWQgPT0gMiB8fAorCQlody0+YnVmZmVyX3NwZWNbYnVmX3NwZWNfbnVtXS51c2VkID09IDMgfHwKKwkJaHctPmJ1ZmZlcl9zcGVjW2J1Zl9zcGVjX251bV0udXNlZCA9PSA1KQorCQlyZXQgPSAxOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGlzX2J1Zl9zcGVjX2luX2Rpc3BfcShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LAorCWludCBidWZfc3BlY19udW0pCit7CisJdW5zaWduZWQgY2hhciByZXQgPSAwOworCWlmIChody0+YnVmZmVyX3NwZWNbYnVmX3NwZWNfbnVtXS51c2VkID09IDIgfHwKKwkJaHctPmJ1ZmZlcl9zcGVjW2J1Zl9zcGVjX251bV0udXNlZCA9PSAzIHx8CisJCWh3LT5idWZmZXJfc3BlY1tidWZfc3BlY19udW1dLnVzZWQgPT0gNSkKKwkJcmV0ID0gMTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFsbG9jX29uZV9idWZfc3BlYyhzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LCBpbnQgaSkKK3sKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisJaWYgKGh3LT5tbXVfZW5hYmxlKSB7CisJCWlmIChody0+YnVmZmVyX3NwZWNbaV0uYWxsb2NfaGVhZGVyX2FkZHIpCisJCQlyZXR1cm4gMDsKKwkJZWxzZQorCQkJcmV0dXJuIC0xOworCX0gZWxzZSB7CisKKwkJaW50IGJ1Zl9zaXplID0gKGh3LT5tYl90b3RhbCA8PCA4KSArIChody0+bWJfdG90YWwgPDwgNyk7CisJCWludCBhZGRyOworI2lmZGVmIFZERUNfRFcKKwkJaW50IG9yaWdfYnVmX3NpemU7CisJCW9yaWdfYnVmX3NpemUgPSBidWZfc2l6ZTsKKwkJaWYgKElTX1ZERUNfRFcoaHcpID09IDEpCisJCQlidWZfc2l6ZSArPSAoaHctPm1iX3RvdGFsIDw8IDcpICsgKGh3LT5tYl90b3RhbCA8PCA2KTsKKwkJZWxzZSBpZiAoSVNfVkRFQ19EVyhodykgPT0gMikKKwkJCWJ1Zl9zaXplICs9IChody0+bWJfdG90YWwgPDwgNikgKyAoaHctPm1iX3RvdGFsIDw8IDUpOworCQllbHNlIGlmIChJU19WREVDX0RXKGh3KSA9PSA0KQorCQkJYnVmX3NpemUgKz0gKGh3LT5tYl90b3RhbCA8PCA0KSArIChody0+bWJfdG90YWwgPDwgMyk7CisJCWVsc2UgaWYgKElTX1ZERUNfRFcoaHcpID09IDgpCisJCQlidWZfc2l6ZSArPSAoaHctPm1iX3RvdGFsIDw8IDIpICsgKGh3LT5tYl90b3RhbCA8PCAxKTsKKwkJaWYgKElTX1ZERUNfRFcoaHcpKSB7CisJCQl1MzIgYWxpZ25fc2l6ZTsKKwkJCS8qIGFkZCBhbGlnbiBwYWRkaW5nIHNpemUgZm9yIGJsazY0eDMyOiAobWJfdzw8NCkqMzIsIChtYl9oPDw0KSo2NCAqLworCQkJYWxpZ25fc2l6ZSA9ICgoaHctPm1iX3dpZHRoIDw8IDkpICsgKGh3LT5tYl9oZWlnaHQgPDwgMTApKSAvIElTX1ZERUNfRFcoaHcpOworCQkJLyogZG91YmxlIGFsaWduIHBhZGRpbmcgc2l6ZSBmb3IgdXYqLworCQkJYWxpZ25fc2l6ZSA8PD0gMTsKKwkJCWJ1Zl9zaXplICs9IGFsaWduX3NpemUgKyBQQUdFX1NJWkU7CisJCX0KKyNlbmRpZgorCQlpZiAoaHctPmJ1ZmZlcl9zcGVjW2ldLmNtYV9hbGxvY19hZGRyKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeShody0+Ym1tdV9ib3gsIGksCisJCQlQQUdFX0FMSUdOKGJ1Zl9zaXplKSwgRFJJVkVSX05BTUUsCisJCQkmaHctPmJ1ZmZlcl9zcGVjW2ldLmNtYV9hbGxvY19hZGRyKSA8IDApIHsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS5jbWFfYWxsb2NfYWRkciA9IDA7CisJCQlpZiAoaHctPm5vX21lbV9jb3VudCsrID4gMykgeworCQkJCWh3LT5zdGF0IHw9IERFQ09ERVJfRkFUQUxfRVJST1JfTk9fTUVNOworCQkJCWh3LT5yZXNldF9idWZtZ3JfZmxhZyA9IDE7CisJCQl9CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSIlcywgZmFpbCB0byBhbGxvYyBidWYgZm9yIGJ1ZnNwZWMlZCwgdHJ5IGxhdGVyXG4iLAorCQkJCQlfX2Z1bmNfXywgaQorCQkJKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHsKKwkJCWlmIChody0+ZW5hYmxlX2ZlbmNlKSB7CisJCQkJdmRlY19mZW5jZV9idWZmZXJfY291bnRfaW5jcmVhc2UoKHVsb25nKXZkZWMtPnN5bmMpOworCQkJCUlOSVRfTElTVF9IRUFEKCZ2ZGVjLT5zeW5jLT5yZWxlYXNlX2NhbGxiYWNrW2ldLm5vZGUpOworCQkJCWRlY29kZXJfYm1tdV9ib3hfYWRkX2NhbGxiYWNrX2Z1bmMoaHctPmJtbXVfYm94LCBpLCAodm9pZCAqKSZ2ZGVjLT5zeW5jLT5yZWxlYXNlX2NhbGxiYWNrW2ldKTsKKwkJCX0KKwkJCWh3LT5ub19tZW1fY291bnQgPSAwOworCQkJaHctPnN0YXQgJj0gfkRFQ09ERVJfRkFUQUxfRVJST1JfTk9fTUVNOworCQl9CisJCWlmICghdmRlY19zZWN1cmUodmRlYykpIHsKKwkJCS8qaW5pdCBpbnRlcm5hbCBidWYqLworCQkJY2hhciAqdG1wYnVmID0gKGNoYXIgKiljb2RlY19tbV9waHlzX3RvX3ZpcnQoaHctPmJ1ZmZlcl9zcGVjW2ldLmNtYV9hbGxvY19hZGRyKTsKKwkJCWlmICh0bXBidWYpIHsKKwkJCQltZW1zZXQodG1wYnVmLCAwLCBQQUdFX0FMSUdOKGJ1Zl9zaXplKSk7CisJCQkJY29kZWNfbW1fZG1hX2ZsdXNoKHRtcGJ1ZiwKKwkJCQkJICAgUEFHRV9BTElHTihidWZfc2l6ZSksCisJCQkJCSAgIERNQV9UT19ERVZJQ0UpOworCQkJfSBlbHNlIHsKKwkJCQl0bXBidWYgPSBjb2RlY19tbV92bWFwKGh3LT5idWZmZXJfc3BlY1tpXS5jbWFfYWxsb2NfYWRkciwgUEFHRV9BTElHTihidWZfc2l6ZSkpOworCQkJCWlmICh0bXBidWYpIHsKKwkJCQkJbWVtc2V0KHRtcGJ1ZiwgMCwgUEFHRV9BTElHTihidWZfc2l6ZSkpOworCQkJCQljb2RlY19tbV9kbWFfZmx1c2godG1wYnVmLAorCQkJCQkJICAgUEFHRV9BTElHTihidWZfc2l6ZSksCisJCQkJCQkgICBETUFfVE9fREVWSUNFKTsKKwkJCQkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcih0bXBidWYpOworCQkJCX0KKwkJCX0KKwkJfQorCQlody0+YnVmZmVyX3NwZWNbaV0uYnVmX2FkciA9CisJCWh3LT5idWZmZXJfc3BlY1tpXS5jbWFfYWxsb2NfYWRkcjsKKwkJYWRkciA9IGh3LT5idWZmZXJfc3BlY1tpXS5idWZfYWRyOworCisKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLnlfYWRkciA9IGFkZHI7CisJCWFkZHIgKz0gaHctPm1iX3RvdGFsIDw8IDg7CisJCWh3LT5idWZmZXJfc3BlY1tpXS51X2FkZHIgPSBhZGRyOworCQlody0+YnVmZmVyX3NwZWNbaV0udl9hZGRyID0gYWRkcjsKKwkJYWRkciArPSBody0+bWJfdG90YWwgPDwgNzsKKworCQlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1swXS5waHlfYWRkciA9CisJCQlody0+YnVmZmVyX3NwZWNbaV0ueV9hZGRyOworCQlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1swXS53aWR0aCA9CisJCQlody0+bWJfd2lkdGggPDwgNDsKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMF0uaGVpZ2h0ID0KKwkJCWh3LT5tYl9oZWlnaHQgPDwgNDsKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMF0uYmxvY2tfbW9kZSA9CisJCQlody0+Y2FudmFzX21vZGU7CisKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMV0ucGh5X2FkZHIgPQorCQkJCWh3LT5idWZmZXJfc3BlY1tpXS51X2FkZHI7CisJCWh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfY29uZmlnWzFdLndpZHRoID0KKwkJCQlody0+bWJfd2lkdGggPDwgNDsKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMV0uaGVpZ2h0ID0KKwkJCQlody0+bWJfaGVpZ2h0IDw8IDM7CisJCWh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfY29uZmlnWzFdLmJsb2NrX21vZGUgPQorCQkJCWh3LT5jYW52YXNfbW9kZTsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCSIlcywgYWxsb2MgYnVmIGZvciBidWZzcGVjJWRcbiIsCisJCQkJX19mdW5jX18sIGkpOworI2lmZGVmICBWREVDX0RXCisJCWlmICghSVNfVkRFQ19EVyhodykpCisJCQlyZXR1cm4gMDsKKwkJZWxzZSB7CisJCQlpbnQgd19zaGlmdCA9IDMsIGhfc2hpZnQgPSAzOworCisJCQlpZiAoSVNfVkRFQ19EVyhodykgPT0gMSkgeworCQkJCXdfc2hpZnQgPSAzOworCQkJCWhfc2hpZnQgPSA0OworCQkJfSBlbHNlIGlmIChJU19WREVDX0RXKGh3KSA9PSAyKSB7CisJCQkJd19zaGlmdCA9IDM7CisJCQkJaF9zaGlmdCA9IDM7CisJCQl9IGVsc2UgaWYgKElTX1ZERUNfRFcoaHcpID09IDQpIHsKKwkJCQl3X3NoaWZ0ID0gMjsKKwkJCQloX3NoaWZ0ID0gMjsKKwkJCX0gZWxzZSBpZiAoSVNfVkRFQ19EVyhodykgPT0gOCkgeworCQkJCXdfc2hpZnQgPSAxOworCQkJCWhfc2hpZnQgPSAxOworCQkJfQorCisJCQlhZGRyID0gaHctPmJ1ZmZlcl9zcGVjW2ldLmNtYV9hbGxvY19hZGRyICsgUEFHRV9BTElHTihvcmlnX2J1Zl9zaXplKTsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X3lfYWRkciA9IGFkZHI7CisJCQlhZGRyICs9IEFMSUdOX1dJRFRIKGh3LT5tYl93aWR0aCA8PCB3X3NoaWZ0KSAqIEFMSUdOX0hFSUdIVChody0+bWJfaGVpZ2h0IDw8IGhfc2hpZnQpOworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfdV9hZGRyID0gYWRkcjsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X3ZfYWRkciA9IGFkZHI7CisJCQlhZGRyICs9IGh3LT5tYl90b3RhbCA8PCAod19zaGlmdCArIGhfc2hpZnQgLSAxKTsKKworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfY2FudmFzX2NvbmZpZ1swXS5waHlfYWRkciA9CisJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfeV9hZGRyOworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfY2FudmFzX2NvbmZpZ1swXS53aWR0aCA9CisJCQkJQUxJR05fV0lEVEgoaHctPm1iX3dpZHRoIDw8IHdfc2hpZnQpOworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfY2FudmFzX2NvbmZpZ1swXS5oZWlnaHQgPQorCQkJCUFMSUdOX0hFSUdIVChody0+bWJfaGVpZ2h0IDw8IGhfc2hpZnQpOworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfY2FudmFzX2NvbmZpZ1swXS5ibG9ja19tb2RlID0KKwkJCQlody0+Y2FudmFzX21vZGU7CisKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X2NhbnZhc19jb25maWdbMV0ucGh5X2FkZHIgPQorCQkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X3VfYWRkcjsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X2NhbnZhc19jb25maWdbMV0ud2lkdGggPQorCQkJCUFMSUdOX1dJRFRIKGh3LT5tYl93aWR0aCA8PCB3X3NoaWZ0KTsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X2NhbnZhc19jb25maWdbMV0uaGVpZ2h0ID0KKwkJCQlBTElHTl9IRUlHSFQoaHctPm1iX2hlaWdodCA8PCAoaF9zaGlmdCAtIDEpKTsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X2NhbnZhc19jb25maWdbMV0uYmxvY2tfbW9kZSA9CisJCQkJaHctPmNhbnZhc19tb2RlOworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkiJXMsIHZkZWNfZHc6IGFsbG9jIGJ1ZiBmb3IgYnVmc3BlYyVkIGJsa21vZCAlZFxuIiwKKwkJCQkJX19mdW5jX18sIGksIGh3LT5jYW52YXNfbW9kZSk7CisJCX0KKyNlbmRpZgorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbGxvY19vbmVfYnVmX3NwZWNfZnJvbV9xdWV1ZShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LCBpbnQgaWR4KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gTlVMTDsKKwlzdHJ1Y3QgYnVmZmVyX3NwZWNfcyAqYnMgPSAmaHctPmJ1ZmZlcl9zcGVjW2lkeF07CisJc3RydWN0IGNhbnZhc19jb25maWdfcyAqeV9jYW52YXNfY2ZnID0gTlVMTDsKKwlzdHJ1Y3QgY2FudmFzX2NvbmZpZ19zICpjX2NhbnZhc19jZmcgPSBOVUxMOworCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9IE5VTEw7CisJdW5zaWduZWQgaW50IHlfYWRkciA9IDAsIGNfYWRkciA9IDA7CisKKwlpZiAoSVNfRVJSX09SX05VTEwoaHctPnY0bDJfY3R4KSkgeworCQlwcl9lcnIoInRoZSB2NGwgY29udGV4dCBoYXMgZXJyLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoYnMtPmNtYV9hbGxvY19hZGRyKQorCQlyZXR1cm4gMDsKKworCWN0eCA9IChzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KTsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WNExfREVUQUlMLAorCQkiWyVkXSAlcygpLCB0cnkgYWxsb2MgZnJvbSB2NGwgcXVldWUgYnVmIHNpemU6ICVkXG4iLAorCQljdHgtPmlkLCBfX2Z1bmNfXywKKwkJKGh3LT5tYl90b3RhbCA8PCA4KSArIChody0+bWJfdG90YWwgPDwgNykpOworCisJcmV0ID0gY3R4LT5mYl9vcHMuYWxsb2MoJmN0eC0+ZmJfb3BzLCBody0+ZmJfdG9rZW4sICZmYiwgQU1MX0ZCX1JFUV9ERUMpOworCWlmIChyZXQgPCAwKSB7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1Y0TF9ERVRBSUwsCisJCQkiWyVkXSBnZXQgZmIgZmFpbC5cbiIsIGN0eC0+aWQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWJzLT5jbWFfYWxsb2NfYWRkciA9ICh1bnNpZ25lZCBsb25nKWZiOworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1Y0TF9ERVRBSUwsCisJCSJbJWRdICVzKCksIGNtYSBhbGxvYyBhZGRyOiAweCV4LCBvdXQgJWQgZGVjICVkXG4iLAorCQljdHgtPmlkLCBfX2Z1bmNfXywgYnMtPmNtYV9hbGxvY19hZGRyLAorCQljdHgtPmNhcF9wb29sLm91dCwgY3R4LT5jYXBfcG9vbC5kZWMpOworCisJaWYgKGZiLT5udW1fcGxhbmVzID09IDEpIHsKKwkJeV9hZGRyID0gZmItPm0ubWVtWzBdLmFkZHI7CisJCWNfYWRkciA9IGZiLT5tLm1lbVswXS5hZGRyICsgZmItPm0ubWVtWzBdLm9mZnNldDsKKwkJZmItPm0ubWVtWzBdLmJ5dGVzX3VzZWQgPSBmYi0+bS5tZW1bMF0uc2l6ZTsKKwl9IGVsc2UgaWYgKGZiLT5udW1fcGxhbmVzID09IDIpIHsKKwkJeV9hZGRyID0gZmItPm0ubWVtWzBdLmFkZHI7CisJCWNfYWRkciA9IGZiLT5tLm1lbVsxXS5hZGRyOworCQlmYi0+bS5tZW1bMF0uYnl0ZXNfdXNlZCA9IGZiLT5tLm1lbVswXS5zaXplOworCQlmYi0+bS5tZW1bMV0uYnl0ZXNfdXNlZCA9IGZiLT5tLm1lbVsxXS5zaXplOworCX0KKworCWZiLT5zdGF0dXMJPSBGQl9TVF9ERUNPREVSOworCisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVjRMX0RFVEFJTCwKKwkJIlslZF0gJXMoKSwgeV9hZGRyOiAleCwgc2l6ZTogJXVcbiIsCisJCWN0eC0+aWQsIF9fZnVuY19fLCB5X2FkZHIsIGZiLT5tLm1lbVswXS5zaXplKTsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WNExfREVUQUlMLAorCQkiWyVkXSAlcygpLCBjX2FkZHI6ICV4LCBzaXplOiAldVxuIiwKKwkJY3R4LT5pZCwgX19mdW5jX18sIGNfYWRkciwgZmItPm0ubWVtWzFdLnNpemUpOworCisJYnMtPnlfYWRkciA9IHlfYWRkcjsKKwlicy0+dV9hZGRyID0gY19hZGRyOworCWJzLT52X2FkZHIgPSBjX2FkZHI7CisKKwl5X2NhbnZhc19jZmcgPSAmYnMtPmNhbnZhc19jb25maWdbMF07CisJY19jYW52YXNfY2ZnID0gJmJzLT5jYW52YXNfY29uZmlnWzFdOworCisJeV9jYW52YXNfY2ZnLT5waHlfYWRkcgk9IHlfYWRkcjsKKwl5X2NhbnZhc19jZmctPndpZHRoCT0gaHctPm1iX3dpZHRoIDw8IDQ7CisJeV9jYW52YXNfY2ZnLT5oZWlnaHQJPSBody0+bWJfaGVpZ2h0IDw8IDQ7CisJeV9jYW52YXNfY2ZnLT5ibG9ja19tb2RlID0gaHctPmNhbnZhc19tb2RlOworCS8vZmItPm0ubWVtWzBdLmJ5dGVzX3VzZWQgPSB5X2NhbnZhc19jZmctPndpZHRoICogeV9jYW52YXNfY2ZnLT5oZWlnaHQ7CisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVjRMX0RFVEFJTCwKKwkJIlslZF0gJXMoKSwgeV93OiAlZCwgeV9oOiAlZFxuIiwgY3R4LT5pZCwgX19mdW5jX18sCisJCXlfY2FudmFzX2NmZy0+d2lkdGgseV9jYW52YXNfY2ZnLT5oZWlnaHQpOworCisJY19jYW52YXNfY2ZnLT5waHlfYWRkcgk9IGNfYWRkcjsKKwljX2NhbnZhc19jZmctPndpZHRoCT0gaHctPm1iX3dpZHRoIDw8IDQ7CisJY19jYW52YXNfY2ZnLT5oZWlnaHQJPSBody0+bWJfaGVpZ2h0IDw8IDM7CisJY19jYW52YXNfY2ZnLT5ibG9ja19tb2RlID0gaHctPmNhbnZhc19tb2RlOworCS8vZmItPm0ubWVtWzFdLmJ5dGVzX3VzZWQgPSBjX2NhbnZhc19jZmctPndpZHRoICogY19jYW52YXNfY2ZnLT5oZWlnaHQ7CisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVjRMX0RFVEFJTCwKKwkJIlslZF0gJXMoKSwgY193OiAlZCwgY19oOiAlZFxuIiwgY3R4LT5pZCwgX19mdW5jX18sCisJCWNfY2FudmFzX2NmZy0+d2lkdGgsIGNfY2FudmFzX2NmZy0+aGVpZ2h0KTsKKworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1Y0TF9ERVRBSUwsCisJCSJbJWRdICVzKCksIGFsbG9jIGJ1ZiBmb3IgYnVmc3BlYyVkXG4iLCBjdHgtPmlkLCBfX2Z1bmNfXywgaWR4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19kZWNvZGVfY2FudmFzKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcsIGludCBpKQoreworCWludCBibGttb2RlID0gaHctPmNhbnZhc19tb2RlOworCWludCBlbmRpYW4gPSAwOworCisJaWYgKGJsa21vZGUgPT0gQ0FOVkFTX0JMS01PREVfTElORUFSKSB7CisJCWlmICgoaDI2NF9kZWJ1Z19mbGFnICYgSUdOT1JFX1BBUkFNX0ZST01fQ09ORklHKSA9PSAwKQorCQkJZW5kaWFuID0gNzsKKwkJZWxzZQorCQkJZW5kaWFuID0gMDsKKwl9CisKKwlpZiAoaHctPmlzX3VzZWRfdjRsKQorCQllbmRpYW4gPSA3OworCisJY29uZmlnX2Nhdl9sdXRfZXgoaHctPmJ1ZmZlcl9zcGVjW2ldLgorCQl5X2NhbnZhc19pbmRleCwKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLnlfYWRkciwKKwkJaHctPm1iX3dpZHRoIDw8IDQsCisJCWh3LT5tYl9oZWlnaHQgPDwgNCwKKwkJQ0FOVkFTX0FERFJfTk9XUkFQLAorCQlibGttb2RlLAorCQllbmRpYW4sCisJCVZERUNfMSk7CisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKSB7CisJCVdSSVRFX1ZSRUcoVkRFQ19BU1NJU1RfQ0FOVkFTX0JMSzMyLAorCQkJCSgxIDw8IDExKSB8IC8qIGNhbnZhc19ibGszMl93ciAqLworCQkJCShibGttb2RlIDw8IDEwKSB8IC8qIGNhbnZhc19ibGszMiovCisJCQkJICgxIDw8IDgpIHwgLyogY2FudmFzX2luZGV4X3dyKi8KKwkJCQkoaHctPmJ1ZmZlcl9zcGVjW2ldLnlfY2FudmFzX2luZGV4IDw8IDApIC8qIGNhbnZhcyBpbmRleCovCisJCQkJKTsKKwl9CisKKwljb25maWdfY2F2X2x1dF9leChody0+YnVmZmVyX3NwZWNbaV0uCisJCXVfY2FudmFzX2luZGV4LAorCQlody0+YnVmZmVyX3NwZWNbaV0udV9hZGRyLAorCQlody0+bWJfd2lkdGggPDwgNCwKKwkJaHctPm1iX2hlaWdodCA8PCAzLAorCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCWJsa21vZGUsCisJCWVuZGlhbiwKKwkJVkRFQ18xKTsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpIHsKKwkJV1JJVEVfVlJFRyhWREVDX0FTU0lTVF9DQU5WQVNfQkxLMzIsCisJCQkJKDEgPDwgMTEpIHwKKwkJCQkoYmxrbW9kZSA8PCAxMCkgfAorCQkJCSAoMSA8PCA4KSB8CisJCQkJKGh3LT5idWZmZXJfc3BlY1tpXS51X2NhbnZhc19pbmRleCA8PCAwKSk7CisJfQorCisJV1JJVEVfVlJFRyhBTkMwX0NBTlZBU19BRERSICsgaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19wb3MsCisJCXNwZWMyY2FudmFzKCZody0+YnVmZmVyX3NwZWNbaV0pKTsKKworCisjaWZkZWYgIFZERUNfRFcKKwlpZiAoIUlTX1ZERUNfRFcoaHcpKQorCQlyZXR1cm47CisJZWxzZSB7CisJCWNvbmZpZ19jYXZfbHV0X2V4KGh3LT5idWZmZXJfc3BlY1tpXS4KKwkJCXZkZWNfZHdfeV9jYW52YXNfaW5kZXgsCisJCQlody0+YnVmZmVyX3NwZWNbaV0udmRlY19kd19jYW52YXNfY29uZmlnWzBdLnBoeV9hZGRyLAorCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfY2FudmFzX2NvbmZpZ1swXS53aWR0aCwKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X2NhbnZhc19jb25maWdbMF0uaGVpZ2h0LAorCQkJQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJYmxrbW9kZSwKKwkJCWVuZGlhbiwKKwkJCVZERUNfMSk7CisJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpIHsKKwkJCVdSSVRFX1ZSRUcoVkRFQ19BU1NJU1RfQ0FOVkFTX0JMSzMyLAorCQkJCSgxIDw8IDExKSB8CisJCQkJKGJsa21vZGUgPDwgMTApIHwKKwkJCQkoMSA8PCA4KSB8CisJCQkJKGh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X3lfY2FudmFzX2luZGV4IDw8IDApKTsKKwkJfQorCisJCWNvbmZpZ19jYXZfbHV0X2V4KGh3LT5idWZmZXJfc3BlY1tpXS4KKwkJCXZkZWNfZHdfdV9jYW52YXNfaW5kZXgsCisJCQlody0+YnVmZmVyX3NwZWNbaV0udmRlY19kd19jYW52YXNfY29uZmlnWzFdLnBoeV9hZGRyLAorCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfY2FudmFzX2NvbmZpZ1sxXS53aWR0aCwKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X2NhbnZhc19jb25maWdbMV0uaGVpZ2h0LAorCQkJQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJYmxrbW9kZSwKKwkJCWVuZGlhbiwKKwkJCVZERUNfMSk7CisJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpIHsKKwkJCVdSSVRFX1ZSRUcoVkRFQ19BU1NJU1RfQ0FOVkFTX0JMSzMyLAorCQkJCSgxIDw8IDExKSB8CisJCQkJKGJsa21vZGUgPDwgMTApIHwKKwkJCQkoMSA8PCA4KSB8CisJCQkJKGh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X3VfY2FudmFzX2luZGV4IDw8IDApKTsKKwkJfQorCX0KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBjb25maWdfZGVjb2RlX2NhbnZhc19leChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LCBpbnQgaSkKK3sKKwl1MzIgYmxrbW9kZSA9IGh3LT5jYW52YXNfbW9kZTsKKwlpbnQgY2FudmFzX3c7CisJaW50IGNhbnZhc19oOworCisJY2FudmFzX3cgPSBody0+ZnJhbWVfd2lkdGggLworCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKGh3LT5kb3VibGVfd3JpdGVfbW9kZSk7CisJY2FudmFzX2ggPSBody0+ZnJhbWVfaGVpZ2h0IC8KKwkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhody0+ZG91YmxlX3dyaXRlX21vZGUpOworCisJaWYgKGh3LT5jYW52YXNfbW9kZSA9PSAwKQorCQljYW52YXNfdyA9IEFMSUdOKGNhbnZhc193LCAzMik7CisJZWxzZQorCQljYW52YXNfdyA9IEFMSUdOKGNhbnZhc193LCA2NCk7CisJY2FudmFzX2ggPSBBTElHTihjYW52YXNfaCwgMzIpOworCisJY29uZmlnX2Nhdl9sdXRfZXgoaHctPmJ1ZmZlcl9zcGVjW2ldLgorCQl5X2NhbnZhc19pbmRleCwKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLmR3X3lfYWRyLAorCQljYW52YXNfdywKKwkJY2FudmFzX2gsCisJCUNBTlZBU19BRERSX05PV1JBUCwKKwkJYmxrbW9kZSwKKwkJNywKKwkJVkRFQ19IRVZDKTsKKworCWNvbmZpZ19jYXZfbHV0X2V4KGh3LT5idWZmZXJfc3BlY1tpXS4KKwkJdV9jYW52YXNfaW5kZXgsCisJCWh3LT5idWZmZXJfc3BlY1tpXS5kd191X3ZfYWRyLAorCQljYW52YXNfdywKKwkJY2FudmFzX2gsCisJCUNBTlZBU19BRERSX05PV1JBUCwKKwkJYmxrbW9kZSwKKwkJNywKKwkJVkRFQ19IRVZDKTsKK30KKworc3RhdGljIGludCB2NGxfZ2V0X2ZyZWVfYnVmZmVyX3NwZWMoc3RydWN0IHZkZWNfaDI2NF9od19zICpodykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBCVUZTUEVDX1BPT0xfU0laRTsgaSsrKSB7CisJCWlmIChody0+YnVmZmVyX3NwZWNbaV0uY21hX2FsbG9jX2FkZHIgPT0gMCkKKwkJCXJldHVybiBpOworCX0KKworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCB2NGxfZmluZF9idWZmZXJfc3BlY19pZHgoc3RydWN0IHZkZWNfaDI2NF9od19zICpodywgdW5zaWduZWQgaW50IHY0bF9pbmR4KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEJVRlNQRUNfUE9PTF9TSVpFOyBpKyspIHsKKwkJaWYgKGh3LT5idWZmZXJfd3JhcFtpXSA9PSB2NGxfaW5keCkKKwkJCXJldHVybiBpOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgdjRsX2dldF9mcmVlX2J1Zl9pZHgoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICogdjRsID0gaHctPnY0bDJfY3R4OworCXN0cnVjdCB2NGxfYnVmZl9wb29sICpwb29sID0gJnY0bC0+Y2FwX3Bvb2w7CisJc3RydWN0IGJ1ZmZlcl9zcGVjX3MgKnBpYyA9IE5VTEw7CisJaW50IGksIHJ0LCBpZHggPSBJTlZBTElEX0lEWDsKKwl1bG9uZyBmbGFnczsKKwl1MzIgc3RhdGUgPSAwLCBpbmRleDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZody0+YnVmc3BlY19sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IHBvb2wtPmluOyArK2kpIHsKKwkJc3RhdGUgPSAocG9vbC0+c2VxW2ldID4+IDE2KTsKKwkJaW5kZXggPSAocG9vbC0+c2VxW2ldICYgMHhmZmZmKTsKKworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgVjRMX0NBUF9CVUZGX0lOX0RFQzoKKwkJCXJ0ID0gdjRsX2ZpbmRfYnVmZmVyX3NwZWNfaWR4KGh3LCBpbmRleCk7CisJCQlpZiAocnQgPj0gMCkgeworCQkJCXBpYyA9ICZody0+YnVmZmVyX3NwZWNbcnRdOworCQkJCWlmICgocGljLT52Zl9yZWYgPT0gMCkgJiYKKwkJCQkJKHBpYy0+dXNlZCA9PSAwKSAmJgorCQkJCQlwaWMtPmNtYV9hbGxvY19hZGRyKSB7CisJCQkJCWlkeCA9IHJ0OworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFY0TF9DQVBfQlVGRl9JTl9NMk06CisJCQlydCA9IHY0bF9nZXRfZnJlZV9idWZmZXJfc3BlYyhodyk7CisJCQlpZiAocnQgPj0gMCkgeworCQkJCXBpYyA9ICZody0+YnVmZmVyX3NwZWNbcnRdOworCQkJCWlmICghYWxsb2Nfb25lX2J1Zl9zcGVjX2Zyb21fcXVldWUoaHcsIHJ0KSkgeworCQkJCQlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmI7CisJCQkJCWNvbmZpZ19kZWNvZGVfY2FudmFzKGh3LCBydCk7CisJCQkJCWZiID0gKHN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICopcGljLT5jbWFfYWxsb2NfYWRkcjsKKwkJCQkJaHctPmJ1ZmZlcl93cmFwW3J0XSA9IGZiLT5idWZfaWR4OworCQkJCQlpZHggPSBydDsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGlkeCAhPSBJTlZBTElEX0lEWCkgeworCQkJcGljLT51c2VkID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5idWZzcGVjX2xvY2ssIGZsYWdzKTsKKworCWlmIChpZHggPCAwKSB7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLCAiJXMgZmFpbCwgc3RhdGUgJWRcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJCWZvciAoaSA9IDA7IGkgPCBCVUZTUEVDX1BPT0xfU0laRTsgaSsrKSB7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwgIiVzLCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgaHctPmJ1ZmZlcl93cmFwW2ldKTsKKwkJfQorCQl2bWgyNjRfZHVtcF9zdGF0ZSh2ZGVjKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPQorCQkJKHN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICopcGljLT5jbWFfYWxsb2NfYWRkcjsKKworCQlmYi0+c3RhdHVzID0gRkJfU1RfREVDT0RFUjsKKwl9CisKKwlyZXR1cm4gaWR4OworfQorCitpbnQgZ2V0X2ZyZWVfYnVmX2lkeChzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgYWRkciwgZmxhZ3M7CisJaW50IGluZGV4ID0gLTE7CisJc3RydWN0IHZkZWNfaDI2NF9od19zICpodyA9IChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKil2ZGVjLT5wcml2YXRlOworCWludCBidWZfdG90YWwgPSBCVUZTUEVDX1BPT0xfU0laRTsKKworCWlmIChody0+aXNfdXNlZF92NGwpCisJCXJldHVybiB2NGxfZ2V0X2ZyZWVfYnVmX2lkeCh2ZGVjKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZody0+YnVmc3BlY19sb2NrLCBmbGFncyk7CisJLypody0+c3RhcnRfc2VhcmNoX3BvcyA9IDA7Ki8KKwlmb3IgKGkgPSBody0+c3RhcnRfc2VhcmNoX3BvczsgaSA8IGJ1Zl90b3RhbDsgaSsrKSB7CisJCWlmIChody0+bW11X2VuYWJsZSkKKwkJCWFkZHIgPSBody0+YnVmZmVyX3NwZWNbaV0uYWxsb2NfaGVhZGVyX2FkZHI7CisJCWVsc2UKKwkJCWFkZHIgPSBody0+YnVmZmVyX3NwZWNbaV0uY21hX2FsbG9jX2FkZHI7CisKKwkJaWYgKGh3LT5idWZmZXJfc3BlY1tpXS52Zl9yZWYgPT0gMCAmJgorCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnVzZWQgPT0gMCAmJiBhZGRyKSB7CisJCQlody0+YnVmZmVyX3NwZWNbaV0udXNlZCA9IDE7CisJCQlody0+c3RhcnRfc2VhcmNoX3BvcyA9IGkrMTsKKwkJCWluZGV4ID0gaTsKKwkJCWh3LT5idWZmZXJfd3JhcFtpXSA9IGluZGV4OworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGluZGV4IDwgMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgaHctPnN0YXJ0X3NlYXJjaF9wb3M7IGkrKykgeworCQkJaWYgKGh3LT5tbXVfZW5hYmxlKQorCQkJCWFkZHIgPSBody0+YnVmZmVyX3NwZWNbaV0uYWxsb2NfaGVhZGVyX2FkZHI7CisJCQllbHNlCisJCQkJYWRkciA9IGh3LT5idWZmZXJfc3BlY1tpXS5jbWFfYWxsb2NfYWRkcjsKKworCQkJaWYgKGh3LT5idWZmZXJfc3BlY1tpXS52Zl9yZWYgPT0gMCAmJgorCQkJCWh3LT5idWZmZXJfc3BlY1tpXS51c2VkID09IDAgJiYgYWRkcikgeworCQkJCWh3LT5idWZmZXJfc3BlY1tpXS51c2VkID0gMTsKKwkJCQlody0+c3RhcnRfc2VhcmNoX3BvcyA9IGkrMTsKKwkJCQlpbmRleCA9IGk7CisJCQkJaHctPmJ1ZmZlcl93cmFwW2ldID0gaW5kZXg7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+YnVmc3BlY19sb2NrLCBmbGFncyk7CisJaWYgKGh3LT5zdGFydF9zZWFyY2hfcG9zID49IGJ1Zl90b3RhbCkKKwkJaHctPnN0YXJ0X3NlYXJjaF9wb3MgPSAwOworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkiJXMsIGJ1Zl9zcGVjX251bSAlZFxuIiwgX19mdW5jX18sIGluZGV4KTsKKworCWlmIChpbmRleCA8IDApIHsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRVJST1IsCisJCQkiJXMgZmFpbFxuIiwgX19mdW5jX18pOworCQl2bWgyNjRfZHVtcF9zdGF0ZSh2ZGVjKTsKKwl9CisKKwlpZiAoZHBiX2lzX2RlYnVnKERFQ09ERV9JRChodyksCisJCVBSSU5UX0ZMQUdfRFVNUF9CVUZTUEVDKSkKKwkJZHVtcF9idWZzcGVjKGh3LCBfX2Z1bmNfXyk7CisJcmV0dXJuIGluZGV4OworfQorCitpbnQgcmVsZWFzZV9idWZfc3BlY19udW0oc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGJ1Zl9zcGVjX251bSkKK3sKKwkvKnUzMiBjdXJfYnVmX2lkeDsqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHZkZWNfaDI2NF9od19zICpodyA9IChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKil2ZGVjLT5wcml2YXRlOworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX01NVV9ERVRBSUwsCisJCSIlcyBidWZfc3BlY19udW0gJWQgdXNlZCAlZFxuIiwKKwkJX19mdW5jX18sIGJ1Zl9zcGVjX251bSwKKwkJYnVmX3NwZWNfbnVtID4gMCA/IGh3LT5idWZmZXJfc3BlY1tidWZfc3BlY19udW1dLnVzZWQgOiAwKTsKKwlpZiAoYnVmX3NwZWNfbnVtID49IDAgJiYKKwkJYnVmX3NwZWNfbnVtIDwgQlVGU1BFQ19QT09MX1NJWkUKKwkJKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZody0+YnVmc3BlY19sb2NrLCBmbGFncyk7CisJCWh3LT5idWZmZXJfc3BlY1tidWZfc3BlY19udW1dLnVzZWQgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+YnVmc3BlY19sb2NrLCBmbGFncyk7CisJCWlmIChody0+bW11X2VuYWJsZSkgeworCQkJLypXUklURV9WUkVHKENVUlJfQ0FOVkFTX0NUUkwsIGJ1Zl9zcGVjX251bTw8MjQpOworCQkJY3VyX2J1Zl9pZHggPSBSRUFEX1ZSRUcoQ1VSUl9DQU5WQVNfQ1RSTCk7CisJCQljdXJfYnVmX2lkeCA9IGN1cl9idWZfaWR4JjB4ZmY7Ki8KKwkJCWRlY29kZXJfbW11X2JveF9mcmVlX2lkeChody0+bW11X2JveCwgYnVmX3NwZWNfbnVtKTsKKwkJfQorCQlyZWxlYXNlX2F1eF9kYXRhKGh3LCBidWZfc3BlY19udW0pOworCX0KKwlpZiAoZHBiX2lzX2RlYnVnKERFQ09ERV9JRChodyksCisJCVBSSU5UX0ZMQUdfRFVNUF9CVUZTUEVDKSkKKwkJZHVtcF9idWZzcGVjKGh3LCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19idWZfc3BlY3Moc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlpbnQgaSwgajsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcgPSAoc3RydWN0IHZkZWNfaDI2NF9od19zICopdmRlYy0+cHJpdmF0ZTsKKwlpbnQgbW9kZSA9IElTX1ZERUNfRFcoaHcpID8gMiA6IDE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmJ1ZnNwZWNfbG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDAsIGogPSAwOworCQlqIDwgaHctPmRwYi5tRFBCLnNpemUKKwkJJiYgaSA8IEJVRlNQRUNfUE9PTF9TSVpFOworCQlpKyspIHsKKwkJaW50IGNhbnZhczsKKwkJaWYgKGh3LT5idWZmZXJfc3BlY1tpXS51c2VkICE9IC0xKQorCQkJY29udGludWU7CisJCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQkJaWYgKGh3LT5idWZmZXJfc3BlY1tpXS55X2NhbnZhc19pbmRleCA9PSAtMSkKKwkJCQlody0+YnVmZmVyX3NwZWNbaV0ueV9jYW52YXNfaW5kZXggPSB2ZGVjLT5nZXRfY2FudmFzX2V4KENPUkVfTUFTS19WREVDXzEsIHZkZWMtPmlkKTsKKwkJCWlmIChody0+YnVmZmVyX3NwZWNbaV0udV9jYW52YXNfaW5kZXggPT0gLTEpIHsKKwkJCQlody0+YnVmZmVyX3NwZWNbaV0udV9jYW52YXNfaW5kZXggPSB2ZGVjLT5nZXRfY2FudmFzX2V4KENPUkVfTUFTS19WREVDXzEsIHZkZWMtPmlkKTsKKwkJCQlody0+YnVmZmVyX3NwZWNbaV0udl9jYW52YXNfaW5kZXggPSBody0+YnVmZmVyX3NwZWNbaV0udV9jYW52YXNfaW5kZXg7CisJCQl9CisjaWZkZWYgVkRFQ19EVworCQkJaWYgKElTX1ZERUNfRFcoaHcpKSB7CisJCQkJaWYgKGh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X3lfY2FudmFzX2luZGV4ID09IC0xKQorCQkJCQlody0+YnVmZmVyX3NwZWNbaV0udmRlY19kd195X2NhbnZhc19pbmRleCA9CisJCQkJCQl2ZGVjLT5nZXRfY2FudmFzX2V4KENPUkVfTUFTS19WREVDXzEsIHZkZWMtPmlkKTsKKwkJCQlpZiAoaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfdV9jYW52YXNfaW5kZXggPT0gLTEpIHsKKwkJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfdV9jYW52YXNfaW5kZXggPQorCQkJCQkJdmRlYy0+Z2V0X2NhbnZhc19leChDT1JFX01BU0tfVkRFQ18xLCB2ZGVjLT5pZCk7CisJCQkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X3ZfY2FudmFzX2luZGV4ID0KKwkJCQkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X3VfY2FudmFzX2luZGV4OworCQkJCX0KKwkJCX0KKyNlbmRpZgorCQl9IGVsc2UgeworCQkJY2FudmFzID0gdmRlYy0+Z2V0X2NhbnZhcyhqICogbW9kZSwgMik7CisJCQlody0+YnVmZmVyX3NwZWNbaV0ueV9jYW52YXNfaW5kZXggPSBjYW52YXNfeShjYW52YXMpOworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnVfY2FudmFzX2luZGV4ID0gY2FudmFzX3UoY2FudmFzKTsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS52X2NhbnZhc19pbmRleCA9IGNhbnZhc192KGNhbnZhcyk7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJCQkiY29uZmlnIGNhbnZhcyAoJWQpICV4IGZvciBidWZzcGVjICVkXHJcbiIsCisJCQkJaiwgY2FudmFzLCBpKTsKKyNpZmRlZiBWREVDX0RXCisJCSAgaWYgKElTX1ZERUNfRFcoaHcpKSB7CisJCQljYW52YXMgPSB2ZGVjLT5nZXRfY2FudmFzKGogKiBtb2RlICsgMSwgMik7CisJCQlody0+YnVmZmVyX3NwZWNbaV0udmRlY19kd195X2NhbnZhc19pbmRleCA9IGNhbnZhc195KGNhbnZhcyk7CisJCQlody0+YnVmZmVyX3NwZWNbaV0udmRlY19kd191X2NhbnZhc19pbmRleCA9IGNhbnZhc191KGNhbnZhcyk7CisJCQlody0+YnVmZmVyX3NwZWNbaV0udmRlY19kd192X2NhbnZhc19pbmRleCA9IGNhbnZhc192KGNhbnZhcyk7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJInZkZWNfZHc6IGNvbmZpZyBjYW52YXMgKCVkKSAleCBmb3IgYnVmc3BlYyAlZFxyXG4iLAorCQkJCWosIGNhbnZhcywgaSk7CisJCSAgfQorI2VuZGlmCisJCX0KKworCQlody0+YnVmZmVyX3NwZWNbaV0udXNlZCA9IDA7CisJCWh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfcG9zID0gajsKKworCisJCWorKzsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmJ1ZnNwZWNfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBjb25maWdfYnVmX3NwZWNzX2V4KHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJaW50IGksIGo7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJaW50IG1vZGUgPSBJU19WREVDX0RXKGh3KSA/IDIgOiAxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5idWZzcGVjX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwLCBqID0gMDsKKwkJaiA8IGh3LT5kcGIubURQQi5zaXplCisJCSYmIGkgPCBCVUZTUEVDX1BPT0xfU0laRTsKKwkJaSsrKSB7CisJCWludCBjYW52YXMgPSAwOworCQlpZiAoaHctPmJ1ZmZlcl9zcGVjW2ldLnVzZWQgIT0gLTEpCisJCQljb250aW51ZTsKKwkJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCQlpZiAoaHctPmJ1ZmZlcl9zcGVjW2ldLnlfY2FudmFzX2luZGV4ID09IC0xKQorCQkJCWh3LT5idWZmZXJfc3BlY1tpXS55X2NhbnZhc19pbmRleCA9IHZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX1ZERUNfMSwgdmRlYy0+aWQpOworCQkJaWYgKGh3LT5idWZmZXJfc3BlY1tpXS51X2NhbnZhc19pbmRleCA9PSAtMSkgeworCQkJCWh3LT5idWZmZXJfc3BlY1tpXS51X2NhbnZhc19pbmRleCA9IHZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX1ZERUNfMSwgdmRlYy0+aWQpOworCQkJCWh3LT5idWZmZXJfc3BlY1tpXS52X2NhbnZhc19pbmRleCA9IGh3LT5idWZmZXJfc3BlY1tpXS51X2NhbnZhc19pbmRleDsKKwkJCX0KKyNpZmRlZiBWREVDX0RXCisJCQlpZiAoSVNfVkRFQ19EVyhodykpIHsKKwkJCQlpZiAoaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfeV9jYW52YXNfaW5kZXggPT0gLTEpCisJCQkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X3lfY2FudmFzX2luZGV4ID0KKwkJCQkJCXZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX1ZERUNfMSwgdmRlYy0+aWQpOworCQkJCWlmIChody0+YnVmZmVyX3NwZWNbaV0udmRlY19kd191X2NhbnZhc19pbmRleCA9PSAtMSkgeworCQkJCQlody0+YnVmZmVyX3NwZWNbaV0udmRlY19kd191X2NhbnZhc19pbmRleCA9CisJCQkJCQl2ZGVjLT5nZXRfY2FudmFzX2V4KENPUkVfTUFTS19WREVDXzEsIHZkZWMtPmlkKTsKKwkJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfdl9jYW52YXNfaW5kZXggPQorCQkJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfdV9jYW52YXNfaW5kZXg7CisJCQkJfQorCQkJfQorI2VuZGlmCisJCX0gZWxzZSB7CisJCQljYW52YXMgPSB2ZGVjLT5nZXRfY2FudmFzKGoqIG1vZGUsIDIpOworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnlfY2FudmFzX2luZGV4ID0gY2FudmFzX3koY2FudmFzKTsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS51X2NhbnZhc19pbmRleCA9IGNhbnZhc191KGNhbnZhcyk7CisJCQlody0+YnVmZmVyX3NwZWNbaV0udl9jYW52YXNfaW5kZXggPSBjYW52YXNfdihjYW52YXMpOworCisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJCQkiY29uZmlnIGNhbnZhcyAoJWQpICV4IGZvciBidWZzcGVjICVkXHJcbiIsCisJCQkJaiwgY2FudmFzLCBpKTsKKyNpZmRlZiBWREVDX0RXCisJCQlpZiAoSVNfVkRFQ19EVyhodykpIHsKKwkJCQljYW52YXMgPSB2ZGVjLT5nZXRfY2FudmFzKGoqbW9kZSArIDEsIDIpOworCQkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X3lfY2FudmFzX2luZGV4ID0gY2FudmFzX3koY2FudmFzKTsKKwkJCQlody0+YnVmZmVyX3NwZWNbaV0udmRlY19kd191X2NhbnZhc19pbmRleCA9IGNhbnZhc191KGNhbnZhcyk7CisJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfdl9jYW52YXNfaW5kZXggPSBjYW52YXNfdihjYW52YXMpOworCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLAorCQkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJCSJ2ZGVjX2R3OiBjb25maWcgY2FudmFzICglZCkgJXggZm9yIGJ1ZnNwZWMgJWRcclxuIiwKKwkJCQkJaiwgY2FudmFzLCBpKTsKKwkJCX0KKyNlbmRpZgorCQl9CisKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLnVzZWQgPSAwOworCQlody0+YnVmZmVyX3NwZWNbaV0uYWxsb2NfaGVhZGVyX2FkZHIgPSAwOworCQlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX3BvcyA9IGo7CisKKwkJaisrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+YnVmc3BlY19sb2NrLCBmbGFncyk7Cit9CisKKworc3RhdGljIHZvaWQgZGVhbGxvY19idWZfc3BlY3Moc3RydWN0IHZkZWNfaDI2NF9od19zICpodywKKwl1bnNpZ25lZCBjaGFyIHJlbGVhc2VfYWxsKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBkZWFsbG9jX2ZsYWcgPSAwOworCWZvciAoaSA9IDA7IGkgPCBCVUZTUEVDX1BPT0xfU0laRTsgaSsrKSB7CisJCWlmIChody0+YnVmZmVyX3NwZWNbaV0udXNlZCA9PSA0IHx8CisJCQlyZWxlYXNlX2FsbCkgeworCQkJZGVhbGxvY19mbGFnID0gMTsKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkiJXMgYnVmX3NwZWNfbnVtICVkXG4iLAorCQkJCV9fZnVuY19fLCBpCisJCQkJKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlCisJCQkJKCZody0+YnVmc3BlY19sb2NrLCBmbGFncyk7CisJCQlody0+YnVmZmVyX3NwZWNbaV0udXNlZCA9IC0xOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZQorCQkJCSgmaHctPmJ1ZnNwZWNfbG9jaywgZmxhZ3MpOworCQkJcmVsZWFzZV9hdXhfZGF0YShodywgaSk7CisKKwkJCWlmICghaHctPm1tdV9lbmFibGUpIHsKKwkJCQlpZiAoaHctPmJ1ZmZlcl9zcGVjW2ldLmNtYV9hbGxvY19hZGRyKSB7CisJCQkJCWlmICghaHctPmlzX3VzZWRfdjRsKSB7CisJCQkJCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWVfaWR4KAorCQkJCQkJCWh3LT5ibW11X2JveCwKKwkJCQkJCQlpKTsKKwkJCQkJfQorCQkJCQlzcGluX2xvY2tfaXJxc2F2ZQorCQkJCQkJKCZody0+YnVmc3BlY19sb2NrLCBmbGFncyk7CisJCQkJCWh3LT5idWZmZXJfc3BlY1tpXS5jbWFfYWxsb2NfYWRkciA9IDA7CisJCQkJCWh3LT5idWZmZXJfc3BlY1tpXS5idWZfYWRyID0gMDsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZQorCQkJCQkJKCZody0+YnVmc3BlY19sb2NrLCBmbGFncyk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoaHctPmJ1ZmZlcl9zcGVjW2ldLmFsbG9jX2hlYWRlcl9hZGRyKSB7CisJCQkJCWRlY29kZXJfbW11X2JveF9mcmVlX2lkeCgKKwkJCQkJCWh3LT5tbXVfYm94LAorCQkJCQkJaSk7CisJCQkJCXNwaW5fbG9ja19pcnFzYXZlCisJCQkJCQkoJmh3LT5idWZzcGVjX2xvY2ssIGZsYWdzKTsKKwkJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLgorCQkJCQkJYWxsb2NfaGVhZGVyX2FkZHIgPSAwOworCQkJCQlody0+YnVmZmVyX3NwZWNbaV0uYnVmX2FkciA9IDA7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUKKwkJCQkJCSgmaHctPmJ1ZnNwZWNfbG9jaywgZmxhZ3MpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZiAoZGVhbGxvY19mbGFnICYmCisJCWRwYl9pc19kZWJ1ZyhERUNPREVfSUQoaHcpLAorCQlQUklOVF9GTEFHX0RVTVBfQlVGU1BFQykpCisJCWR1bXBfYnVmc3BlYyhodywgX19mdW5jX18pOworCXJldHVybjsKK30KKwordW5zaWduZWQgY2hhciBoYXZlX2ZyZWVfYnVmX3NwZWMoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJc3RydWN0IHZkZWNfaDI2NF9od19zICpodyA9IChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKil2ZGVjLT5wcml2YXRlOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqIGN0eCA9IGh3LT52NGwyX2N0eDsKKwlpbnQgY2FudmFzX3Bvc19taW4gPSBCVUZTUEVDX1BPT0xfU0laRTsKKwlpbnQgaW5kZXggPSAtMTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgYWxsb2NhdGVkX2NvdW50ID0gMDsKKworCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJc3RydWN0IGgyNjRfZHBiX3N0cnUgKmRwYiA9ICZody0+ZHBiOworCisJCS8qIHRyaWdnZXIgdG8gcGFyc2UgaGVhZCBkYXRhLiAqLworCQlpZiAoIWh3LT52NGxfcGFyYW1zX3BhcnNlZCkKKwkJCXJldHVybiAxOworCisJCWlmIChkcGItPm1EUEIudXNlZF9zaXplID49IGRwYi0+bURQQi5zaXplIC0gMSkKKwkJCXJldHVybiAwOworCisJCWZvciAoaSA9IDA7IGkgPCBody0+ZHBiLm1EUEIuc2l6ZTsgaSsrKSB7CisJCQlpZiAoaHctPmJ1ZmZlcl9zcGVjW2ldLnVzZWQgPT0gMCAmJgorCQkJCWh3LT5idWZmZXJfc3BlY1tpXS52Zl9yZWYgPT0gMCAmJgorCQkJCWh3LT5idWZmZXJfc3BlY1tpXS5jbWFfYWxsb2NfYWRkcikgeworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisKKwkJaWYgKGN0eC0+Y2FwX3Bvb2wuZGVjIDwgaHctPmRwYi5tRFBCLnNpemUpIHsKKwkJCWlmICh2NGwyX20ybV9udW1fZHN0X2J1ZnNfcmVhZHkoY3R4LT5tMm1fY3R4KSA+PQorCQkJCXJ1bl9yZWFkeV9taW5fYnVmX251bSkgeworCQkJCWlmIChjdHgtPmZiX29wcy5xdWVyeSgmY3R4LT5mYl9vcHMsICZody0+ZmJfdG9rZW4pKQorCQkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBCVUZTUEVDX1BPT0xfU0laRTsgaSsrKSB7CisJCWlmIChody0+bW11X2VuYWJsZSkKKwkJCWFkZHIgPSBody0+YnVmZmVyX3NwZWNbaV0uYWxsb2NfaGVhZGVyX2FkZHI7CisJCWVsc2UKKwkJCWFkZHIgPSBody0+YnVmZmVyX3NwZWNbaV0uY21hX2FsbG9jX2FkZHI7CisJCWlmIChody0+YnVmZmVyX3NwZWNbaV0udXNlZCA9PSAwICYmCisJCQlody0+YnVmZmVyX3NwZWNbaV0udmZfcmVmID09IDApIHsKKworCQkJaWYgKGFkZHIpCisJCQkJcmV0dXJuIDE7CisJCQlpZiAoaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19wb3MgPCBjYW52YXNfcG9zX21pbikgeworCQkJCWNhbnZhc19wb3NfbWluID0gaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19wb3M7CisJCQkJaW5kZXggPSBpOworCQkJfQorCQl9CisJCWlmIChhZGRyKQorCQkJYWxsb2NhdGVkX2NvdW50Kys7CisJfQorCWlmIChpbmRleCA+PSAwKSB7CisJCW11dGV4X2xvY2soJnZtaDI2NF9tdXRleCk7CisJCWRlYWxsb2NfYnVmX3NwZWNzKGh3LCAwKTsKKwkJaWYgKG1heF9hbGxvY19idWZfY291bnQgPT0gMCB8fAorCQkJYWxsb2NhdGVkX2NvdW50IDwgbWF4X2FsbG9jX2J1Zl9jb3VudCkgeworCQkJaWYgKGFsbG9jX29uZV9idWZfc3BlYyhodywgaW5kZXgpID49IDApCisJCQkJcmV0ID0gMTsKKwkJfQorCQltdXRleF91bmxvY2soJnZtaDI2NF9tdXRleCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnZXRfYnVmX3NwZWNfYnlfY2FudmFzX3BvcyhzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LAorCWludCBjYW52YXNfcG9zKQoreworCWludCBpOworCWludCBqID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgQlVGU1BFQ19QT09MX1NJWkU7IGkrKykgeworCQlpZiAoaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19wb3MgPj0gMCkgeworCQkJaWYgKGogPT0gY2FudmFzX3BvcykKKwkJCQlyZXR1cm4gaTsKKwkJCWorKzsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CitzdGF0aWMgdm9pZCB1cGRhdGVfdmZfbWVtaGFuZGxlKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcsCisJc3RydWN0IHZmcmFtZV9zICp2ZiwgaW50IGluZGV4KQoreworCWlmIChpbmRleCA8IDApIHsKKwkJdmYtPm1lbV9oYW5kbGUgPSBOVUxMOworCQl2Zi0+bWVtX2hlYWRfaGFuZGxlID0gTlVMTDsKKwl9IGVsc2UgaWYgKHZmLT50eXBlICYgVklEVFlQRV9TQ0FUVEVSKSB7CisJCXZmLT5tZW1faGFuZGxlID0KKwkJCWRlY29kZXJfbW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCQlody0+bW11X2JveCwgaW5kZXgpOworCQl2Zi0+bWVtX2hlYWRfaGFuZGxlID0KKwkJCWRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJaHctPmJtbXVfYm94LCBIRUFERVJfQlVGRkVSX0lEWChpbmRleCkpOworCX0gZWxzZSB7CisJCXZmLT5tZW1faGFuZGxlID0KKwkJCWRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJaHctPmJtbXVfYm94LCBWRl9CVUZGRVJfSURYKGluZGV4KSk7CisJLyoJdmYtPm1lbV9oZWFkX2hhbmRsZSA9CisJCQlkZWNvZGVyX2JtbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCWh3LT5ibW11X2JveCwgSEVBREVSX0JVRkZFUl9JRFgoaW5kZXgpKTsqLworCX0KKwlyZXR1cm47Cit9CitzdGF0aWMgaW50IGNoZWNrX2ZvcmNlX2ludGVybGFjZShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LAorCXN0cnVjdCBGcmFtZVN0b3JlICpmcmFtZSkKK3sKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9ICZody0+ZHBiOworCWludCBiRm9yY2VJbnRlcmxhY2UgPSAwOworCS8qIG5vIGRpIGluIHNlY3VyZSBtb2RlLCBkaXNhYmxlIGZvcmNlIGRpICovCisJaWYgKHZkZWNfc2VjdXJlKGh3X3RvX3ZkZWMoaHcpKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoaHctPmlfb25seSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKGRlY19jb250cm9sICYgREVDX0NPTlRST0xfRkxBR19GT1JDRV8yOTk3XzEwODBQX0lOVEVSTEFDRSkKKwkJJiYgaHctPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnCisJCSYmIChody0+ZnJhbWVfd2lkdGggPT0gMTkyMCkKKwkJJiYgKGh3LT5mcmFtZV9oZWlnaHQgPj0gMTA4MCkgLyogRm9yIGJlaW5nIGNvbXBhdGlibGUgd2l0aCBhIGZha2UgcHJvZ3Jlc3NpdmUgc3RyZWFtIHdoaWNoIGlzIGludGVybGFjZWQgYWN0dWFsbHkqLworCQkmJiAoaHctPmZyYW1lX2R1ciA9PSAzMjAzIHx8IChody0+ZnJhbWVfZHVyID09IDM4NDAgJiYgcF9IMjY0X0RwYi0+bVNQUy5wcm9maWxlX2lkYyA9PSAxMDAgJiYKKwkJcF9IMjY0X0RwYi0+bVNQUy5sZXZlbF9pZGMgPT0gNDApKSkgeworCQliRm9yY2VJbnRlcmxhY2UgPSAxOworCX0gZWxzZSBpZiAoKGRlY19jb250cm9sICYgREVDX0NPTlRST0xfRkxBR19GT1JDRV8yNTAwXzU3NlBfSU5URVJMQUNFKQorCQkJICYmIChody0+ZnJhbWVfd2lkdGggPT0gNzIwKQorCQkJICYmIChody0+ZnJhbWVfaGVpZ2h0ID09IDU3NikKKwkJCSAmJiAoaHctPmZyYW1lX2R1ciA9PSAzODQwKSkgeworCQliRm9yY2VJbnRlcmxhY2UgPSAxOworCX0KKworCXJldHVybiBiRm9yY2VJbnRlcmxhY2U7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfZnJhbWVfaW5mbyhzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LCBzdHJ1Y3QgRnJhbWVTdG9yZSAqZnJhbWUpCit7CisJc3RydWN0IHZmcmFtZV9xb3NfcyAqdmZyYW1lX3FvcyA9ICZody0+dmZyYW1lX3FvczsKKworCWlmIChmcmFtZS0+c2xpY2VfdHlwZSA9PSBJX1NMSUNFKQorCQl2ZnJhbWVfcW9zLT50eXBlID0gMTsKKwllbHNlIGlmIChmcmFtZS0+c2xpY2VfdHlwZSA9PSBQX1NMSUNFKQorCQl2ZnJhbWVfcW9zLT50eXBlID0gMjsKKwllbHNlIGlmIChmcmFtZS0+c2xpY2VfdHlwZSA9PSBCX1NMSUNFKQorCQl2ZnJhbWVfcW9zLT50eXBlID0gMzsKKworCWlmIChpbnB1dF9mcmFtZV9iYXNlZChod190b192ZGVjKGh3KSkpCisJCXZmcmFtZV9xb3MtPnNpemUgPSBmcmFtZS0+ZnJhbWVfc2l6ZTI7CisJZWxzZQorCQl2ZnJhbWVfcW9zLT5zaXplID0gZnJhbWUtPmZyYW1lX3NpemU7CisJdmZyYW1lX3Fvcy0+cHRzID0gZnJhbWUtPnB0czY0OworCisJdmZyYW1lX3Fvcy0+bWF4X212ID0gZnJhbWUtPm1heF9tdjsKKwl2ZnJhbWVfcW9zLT5hdmdfbXYgPSBmcmFtZS0+YXZnX212OworCXZmcmFtZV9xb3MtPm1pbl9tdiA9IGZyYW1lLT5taW5fbXY7CisvKgorCXByX2luZm8oIm12OiBtYXg6JWQsICBhdmc6JWQsIG1pbjolZFxuIiwKKwkJdmZyYW1lX3Fvcy0+bWF4X212LAorCQl2ZnJhbWVfcW9zLT5hdmdfbXYsCisJCXZmcmFtZV9xb3MtPm1pbl9tdik7CisqLworCisJdmZyYW1lX3Fvcy0+bWF4X3FwID0gZnJhbWUtPm1heF9xcDsKKwl2ZnJhbWVfcW9zLT5hdmdfcXAgPSBmcmFtZS0+YXZnX3FwOworCXZmcmFtZV9xb3MtPm1pbl9xcCA9IGZyYW1lLT5taW5fcXA7CisvKgorCXByX2luZm8oInFwOiBtYXg6JWQsICBhdmc6JWQsIG1pbjolZFxuIiwKKwkJdmZyYW1lX3Fvcy0+bWF4X3FwLAorCQl2ZnJhbWVfcW9zLT5hdmdfcXAsCisJCXZmcmFtZV9xb3MtPm1pbl9xcCk7CisqLworCisJdmZyYW1lX3Fvcy0+bWF4X3NraXAgPSBmcmFtZS0+bWF4X3NraXA7CisJdmZyYW1lX3Fvcy0+YXZnX3NraXAgPSBmcmFtZS0+YXZnX3NraXA7CisJdmZyYW1lX3Fvcy0+bWluX3NraXAgPSBmcmFtZS0+bWluX3NraXA7CisvKgorCXByX2luZm8oInNraXA6IG1heDolZCwgIGF2ZzolZCwgbWluOiVkXG4iLAorCQl2ZnJhbWVfcW9zLT5tYXhfc2tpcCwKKwkJdmZyYW1lX3Fvcy0+YXZnX3NraXAsCisJCXZmcmFtZV9xb3MtPm1pbl9za2lwKTsKKyovCisJdmZyYW1lX3Fvcy0+bnVtKys7Cit9CisKK3N0YXRpYyBpbnQgaXNfaWZyYW1lKHN0cnVjdCBGcmFtZVN0b3JlICpmcmFtZSkgeworCisJaWYgKGZyYW1lLT5mcmFtZSAmJiBmcmFtZS0+ZnJhbWUtPnNsaWNlX3R5cGUgPT0gSV9TTElDRSkgeworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG9zdF9wcmVwYXJlX3Byb2Nlc3Moc3RydWN0IHZkZWNfcyAqdmRlYywgc3RydWN0IEZyYW1lU3RvcmUgKmZyYW1lKQoreworCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcgPSAoc3RydWN0IHZkZWNfaDI2NF9od19zICopdmRlYy0+cHJpdmF0ZTsKKwlpbnQgYnVmZmVyX2luZGV4ID0gZnJhbWUtPmJ1Zl9zcGVjX251bTsKKworCWlmIChidWZmZXJfaW5kZXggPCAwIHx8IGJ1ZmZlcl9pbmRleCA+PSBCVUZTUEVDX1BPT0xfU0laRSkgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSIlcywgYnVmZmVyX2luZGV4IDB4JXggaXMgYmV5b25kIHJhbmdlXG4iLAorCQkJX19mdW5jX18sIGJ1ZmZlcl9pbmRleCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoZm9yY2VfZGlzcF9idWZzcGVjX251bSAmIDB4MTAwKSB7CisJCS8qcmVjeWNsZSBkaXJlY3RseSovCisJCWlmIChody0+YnVmZmVyX3NwZWNbZnJhbWUtPmJ1Zl9zcGVjX251bV0udXNlZCAhPSAzICYmCisJCQlody0+YnVmZmVyX3NwZWNbZnJhbWUtPmJ1Zl9zcGVjX251bV0udXNlZCAhPSA1KQorCQkJc2V0X2ZyYW1lX291dHB1dF9mbGFnKCZody0+ZHBiLCBmcmFtZS0+aW5kZXgpOworCisJCS8qbWFrZSBwcmVfb3V0cHV0IG5vdCBzZXQqLworCQlyZXR1cm4gLTE7CisJfQorCWlmIChlcnJvcl9wcm9jX3BvbGljeSAmIDB4MTAwMCkgeworCQlpbnQgZXJyb3Jfc2tpcF9pX2NvdW50ID0gKGVycm9yX3NraXBfY291bnQgPj4gMTIpICYgMHhmOworCQlpbnQgZXJyb3Jfc2tpcF9mcmFtZV9jb3VudCA9IGVycm9yX3NraXBfY291bnQgJiAweGZmZjsKKwkJaWYgKCgoaHctPm5vX2Vycm9yX2NvdW50IDwgZXJyb3Jfc2tpcF9mcmFtZV9jb3VudCkKKwkJCSYmIChlcnJvcl9za2lwX2lfY291bnQgPT0gMCB8fAorCQkJaHctPm5vX2Vycm9yX2lfY291bnQgPCBlcnJvcl9za2lwX2lfY291bnQpKQorCQkJJiYgKCEoZnJhbWUtPmRhdGFfZmxhZyAmIElfRkxBRykpKQorCQkJZnJhbWUtPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOworCX0KKworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0VSUk9SRkxBR19EQkcsCisJCSIlcywgYnVmZmVyX2luZGV4IDB4JXggIGZyYW1lX2Vycm9yICV4ICBwb2MgJWQgaHcgZXJyb3IgJXggZXJyb3JfcHJvY19wb2xpY3kgJXhcbiIsCisJCV9fZnVuY19fLCBidWZmZXJfaW5kZXgsCisJCWZyYW1lLT5kYXRhX2ZsYWcgJiBFUlJPUl9GTEFHLAorCQlmcmFtZS0+cG9jLCBody0+ZGF0YV9mbGFnICYgRVJST1JfRkxBRywKKwkJZXJyb3JfcHJvY19wb2xpY3kpOworCisJaWYgKGZyYW1lLT5mcmFtZSA9PSBOVUxMICYmCisJCQkoKGZyYW1lLT5pc191c2VkID09IDEgJiYgZnJhbWUtPnRvcF9maWVsZCkKKwkJCXx8IChmcmFtZS0+aXNfdXNlZCA9PSAyICYmIGZyYW1lLT5ib3R0b21fZmllbGQpKSkgeworCQkJaWYgKGh3LT5pX29ubHkpIHsKKwkJCQlpZiAoZnJhbWUtPmlzX3VzZWQgPT0gMSkKKwkJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkJCQkiJXMgICBObyBib3R0b21fZmllbGQgISEgIGZyYW1lX251bSAlZCAgdXNlZCAlZFxuIiwKKwkJCQkJCV9fZnVuY19fLCBmcmFtZS0+ZnJhbWVfbnVtLCBmcmFtZS0+aXNfdXNlZCk7CisJCQkJaWYgKGZyYW1lLT5pc191c2VkID09IDIpCisJCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJCQkJIiVzICAgTm8gdG9wX2ZpZWxkICEhICBmcmFtZV9udW0gJWQgIHVzZWQgJWRcbiIsCisJCQkJCQlfX2Z1bmNfXywgZnJhbWUtPmZyYW1lX251bSwgZnJhbWUtPmlzX3VzZWQpOworCQkJfQorCQkJZWxzZSB7CisJCQkJZnJhbWUtPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOworCQkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19FUlJPUkZMQUdfREJHLAorCQkJCQkiJXMgRXJyb3IgIGZyYW1lX251bSAlZCAgdXNlZCAlZFxuIiwKKwkJCQkJX19mdW5jX18sIGZyYW1lLT5mcmFtZV9udW0sIGZyYW1lLT5pc191c2VkKTsKKwkJCX0KKwl9CisJaWYgKHZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpICYmICEoZnJhbWUtPmRhdGFfZmxhZyAmIE5PRElTUF9GTEFHKSkgeworCQlpZiAoKHZkZWMtPnZidWYubm9fcGFyc2VyID09IDApIHx8ICh2ZGVjLT52YnVmLnVzZV9wdHNzZXJ2KSkgeworCQkJaWYgKChwdHNfbG9va3VwX29mZnNldF91czY0KFBUU19UWVBFX1ZJREVPLAorCQkJCWZyYW1lLT5vZmZzZXRfZGVsaW1pdGVyLCAmZnJhbWUtPnB0cywgJmZyYW1lLT5mcmFtZV9zaXplLAorCQkJCTAsICZmcmFtZS0+cHRzNjQpID09IDApKSB7CisJCQkJaWYgKChsb29rdXBfY2hlY2tfY29udXQgJiYgKGh3LT52Zl9wcmVfY291bnQgPiBsb29rdXBfY2hlY2tfY29udXQpICYmCisJCQkJCShody0+d3JvbmdfZnJhbWVfY291bnQgPiBody0+cmlnaHRfZnJhbWVfY291bnQpKSAmJgorCQkJCQkoKGZyYW1lLT5kZWNvZGVkX2ZyYW1lX3NpemUgKiAyIDwgZnJhbWUtPmZyYW1lX3NpemUpKSkgeworCQkJCQkvKnJlc29sdmUgbWFueSBmcmFtZSBvbmx5IG9uZSBjaGVjayBpbiBwdHMsIGNhdXNlIHBsYXliYWNrIHVuc21vb3RoIGlzc3VlKi8KKwkJCQkJZnJhbWUtPnB0czY0ID0gaHctPmxhc3RfcHRzNjQgK0RVUjJQVFMoaHctPmZyYW1lX2R1cikgOworCQkJCQlmcmFtZS0+cHRzID0gaHctPmxhc3RfcHRzICsgRFVSMlBUUyhody0+ZnJhbWVfZHVyKTsKKwkJCQl9CisJCQkJaHctPnJpZ2h0X2ZyYW1lX2NvdW50Kys7CisJCQl9IGVsc2UgeworCQkJCWZyYW1lLT5wdHM2NCA9IGh3LT5sYXN0X3B0czY0ICtEVVIyUFRTKGh3LT5mcmFtZV9kdXIpIDsKKwkJCQlmcmFtZS0+cHRzID0gaHctPmxhc3RfcHRzICsgRFVSMlBUUyhody0+ZnJhbWVfZHVyKTsKKwkJCQlody0+d3JvbmdfZnJhbWVfY291bnQrKzsKKwkJCX0KKwkJfQorCisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkiJXMgZXJyb3I9IDB4JXggcG9jID0gJWQgIG9mZnNldD0gMHgleCBwdHM9IDB4JXggbGFzdF9wdHMgPTB4JXggIHB0czY0ID0gJWxsZCAgbGFzdF9wdHM2ND0gJWxsZCAgZHVyYXRpb24gPSAlZFxuIiwKKwkJX19mdW5jX18sIChmcmFtZS0+ZGF0YV9mbGFnICYgRVJST1JfRkxBRyksIGZyYW1lLT5wb2MsCisJCWZyYW1lLT5vZmZzZXRfZGVsaW1pdGVyLCBmcmFtZS0+cHRzLGh3LT5sYXN0X3B0cywKKwkJZnJhbWUtPnB0czY0LCBody0+bGFzdF9wdHM2NCwgaHctPmZyYW1lX2R1cik7CisJCWh3LT5sYXN0X3B0czY0ID0gZnJhbWUtPnB0czY0OworCQlody0+bGFzdF9wdHMgPSBmcmFtZS0+cHRzOworCX0KKworCS8qIFNXUEwtMTg5NzMgOTYwMDAvMTU9NjQwMCwgbGVzcyB0aGFuIDE1ZnBzIGNoZWNrICovCisJaWYgKCghaHctPmR1cmF0aW9uX2Zyb21fcHRzX2RvbmUpICYmIChody0+ZnJhbWVfZHVyID4gNjQwMFVMTCkpIHsKKwkJaWYgKChjaGVja19mb3JjZV9pbnRlcmxhY2UoaHcsIGZyYW1lKSkgJiYKKwkJCShmcmFtZS0+c2xpY2VfdHlwZSA9PSBJX1NMSUNFKSAmJgorCQkJKGh3LT5wdHNfb3V0c2lkZSkpIHsKKwkJCWlmICgoIWh3LT5oMjY0X3B0c19jb3VudCkgfHwgKCFody0+aDI2NHB0czEpKSB7CisJCQkJaHctPmgyNjRwdHMxID0gZnJhbWUtPnB0czsKKwkJCQlody0+aDI2NF9wdHNfY291bnQgPSAwOworCQkJfSBlbHNlIGlmIChmcmFtZS0+cHRzID4gaHctPmgyNjRwdHMxKSB7CisJCQkJdTMyIGNhbGNfZHVyID0KKwkJCQkJUFRTMkRVUihmcmFtZS0+cHRzIC0gaHctPmgyNjRwdHMxKTsKKwkJCQljYWxjX2R1ciA9ICgoY2FsY19kdXIvaHctPmgyNjRfcHRzX2NvdW50KSA8PCAxKTsKKwkJCQlpZiAoaHctPmZyYW1lX2R1ciA8IChjYWxjX2R1ciArIDIwMCkgJiYKKwkJCQkJaHctPmZyYW1lX2R1ciA+IChjYWxjX2R1ciAtIDIwMCkpIHsKKwkJCQkJaHctPmZyYW1lX2R1ciA+Pj0gMTsKKwkJCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+bm90aWZ5X3dvcmspOworCQkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCQkJCSJjb3JyZWN0IGZyYW1lX2R1ciAlZCwgY2FsY19kdXIgJWQsIGNvdW50ICVkXG4iLAorCQkJCQkJaHctPmZyYW1lX2R1ciwgKGNhbGNfZHVyID4+IDEpLCBody0+aDI2NF9wdHNfY291bnQpOworCQkJCQlody0+ZHVyYXRpb25fZnJvbV9wdHNfZG9uZSA9IDE7CisJCQkJCWh3LT5oMjY0X3B0c19jb3VudCA9IDA7CisJCQkJfQorCQkJfQorCQl9CisJCWh3LT5oMjY0X3B0c19jb3VudCsrOworCX0KKworCWlmIChmcmFtZS0+ZGF0YV9mbGFnICYgRVJST1JfRkxBRykgeworCQl2ZGVjX2NvdW50X2luZm8oJmh3LT5ndnMsIDEsIDApOworCQlpZiAoZnJhbWUtPnNsaWNlX3R5cGUgPT0gSV9TTElDRSkgeworCQkJaHctPmd2cy5pX2NvbmNlYWxlZF9mcmFtZXMrKzsKKwkJfSBlbHNlIGlmIChmcmFtZS0+c2xpY2VfdHlwZSA9PSBQX1NMSUNFKSB7CisJCQlody0+Z3ZzLnBfY29uY2VhbGVkX2ZyYW1lcysrOworCQl9IGVsc2UgaWYgKGZyYW1lLT5zbGljZV90eXBlID09IEJfU0xJQ0UpIHsKKwkJCWh3LT5ndnMuYl9jb25jZWFsZWRfZnJhbWVzKys7CisJCX0KKwkJaWYgKCFody0+c2VuZF9lcnJvcl9mcmFtZV9mbGFnKSB7CisJCQlody0+Z3ZzLmRyb3BfZnJhbWVfY291bnQrKzsKKwkJCWlmIChmcmFtZS0+c2xpY2VfdHlwZSA9PSBJX1NMSUNFKSB7CisJCQkJaHctPmd2cy5pX2xvc3RfZnJhbWVzKys7CisJCQl9IGVsc2UgaWYgKGZyYW1lLT5zbGljZV90eXBlID09IFBfU0xJQ0UpIHsKKwkJCQlody0+Z3ZzLnBfbG9zdF9mcmFtZXMrKzsKKwkJCX0gZWxzZSBpZiAoZnJhbWUtPnNsaWNlX3R5cGUgPT0gQl9TTElDRSkgeworCQkJCWh3LT5ndnMuYl9sb3N0X2ZyYW1lcysrOworCQkJfQorCQl9CisKKwl9CisKKwlpZiAoKCFody0+ZW5hYmxlX2ZlbmNlKSAmJgorCQkoKGZyYW1lLT5kYXRhX2ZsYWcgJiBOT0RJU1BfRkxBRykgfHwKKwkJKGZyYW1lLT5kYXRhX2ZsYWcgJiBOVUxMX0ZMQUcpIHx8CisJCSgoIWh3LT5zZW5kX2Vycm9yX2ZyYW1lX2ZsYWcpICYmCisJCShmcmFtZS0+ZGF0YV9mbGFnICYgRVJST1JfRkxBRykpIHx8CisJCSgoaHctPmlfb25seSAmIDB4MSkgJiYKKwkJKCEoZnJhbWUtPmRhdGFfZmxhZyAmIElfRkxBRykpKSkpIHsKKwkJZnJhbWUtPnNob3dfZnJhbWUgPSBmYWxzZTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRwYl9pc19kZWJ1ZyhERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RQQl9ERVRBSUwpKSB7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJIiVzLCBmc1slZF0gcG9jICVkLCBidWZfc3BlY19udW0gJWRcbiIsCisJCQlfX2Z1bmNfXywgZnJhbWUtPmluZGV4LCBmcmFtZS0+cG9jLAorCQkJZnJhbWUtPmJ1Zl9zcGVjX251bSk7CisJCXByaW50X3BpY19pbmZvKERFQ09ERV9JRChodyksICJwcmVkaXNfZnJtIiwKKwkJCWZyYW1lLT5mcmFtZSwgLTEpOworCQlwcmludF9waWNfaW5mbyhERUNPREVfSUQoaHcpLCAicHJlZGlzX3RvcCIsCisJCQlmcmFtZS0+dG9wX2ZpZWxkLCAtMSk7CisJCXByaW50X3BpY19pbmZvKERFQ09ERV9JRChodyksICJwcmVkaXNfYm90IiwKKwkJCWZyYW1lLT5ib3R0b21fZmllbGQsIC0xKTsKKwl9CisKKwlmcmFtZS0+c2hvd19mcmFtZSA9IHRydWU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwb3N0X3ZpZGVvX2ZyYW1lKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHN0cnVjdCBGcmFtZVN0b3JlICpmcmFtZSkKK3sKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJc3RydWN0IHZmcmFtZV9zICp2ZiA9IE5VTEw7CisJaW50IGJ1ZmZlcl9pbmRleCA9IGZyYW1lLT5idWZfc3BlY19udW07CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICogdjRsMl9jdHggPSBody0+djRsMl9jdHg7CisJc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKmZiID0gTlVMTDsKKwl1bG9uZyBudl9vcmRlciA9IFZJRFRZUEVfVklVX05WMjE7CisJaW50IGJGb3JjZUludGVybGFjZSA9IDA7CisJaW50IHZmX2NvdW50ID0gMTsKKwlpbnQgaTsKKworCS8qIHN3YXAgdXYgKi8KKwlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCWlmICgodjRsMl9jdHgtPmNhcF9waXhfZm10ID09IFY0TDJfUElYX0ZNVF9OVjEyKSB8fAorCQkJKHY0bDJfY3R4LT5jYXBfcGl4X2ZtdCA9PSBWNEwyX1BJWF9GTVRfTlYxMk0pKQorCQkJbnZfb3JkZXIgPSBWSURUWVBFX1ZJVV9OVjEyOworCX0KKworCWlmICghaXNfaW50ZXJsYWNlKGZyYW1lKSkKKwkJdmZfY291bnQgPSAxOworCWVsc2UKKwkJdmZfY291bnQgPSAyOworCisJYkZvcmNlSW50ZXJsYWNlID0gY2hlY2tfZm9yY2VfaW50ZXJsYWNlKGh3LCBmcmFtZSk7CisJaWYgKGJGb3JjZUludGVybGFjZSkKKwkJdmZfY291bnQgPSAyOworCisJaWYgKCFody0+ZW5hYmxlX2ZlbmNlKQorCQlody0+YnVmZmVyX3NwZWNbYnVmZmVyX2luZGV4XS52Zl9yZWYgPSAwOworCWZpbGxfZnJhbWVfaW5mbyhodywgZnJhbWUpOworCisJaWYgKChody0+aXNfdXNlZF92NGwpICYmCisJCSh2ZGVjLT5wcm9nX29ubHkpKQorCQl2Zl9jb3VudCA9IDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmZfY291bnQ7IGkrKykgeworCQlpZiAoa2ZpZm9fZ2V0KCZody0+bmV3ZnJhbWVfcSwgJnZmKSA9PSAwIHx8CisJCQl2ZiA9PSBOVUxMKSB7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19FUlJPUiwKKwkJCQkiJXMgZmF0YWwgZXJyb3IsIG5vIGF2YWlsYWJsZSBidWZmZXIgc2xvdC5cbiIsCisJCQkJX19mdW5jX18pOworCQkJcmV0dXJuIC0xOworCQl9CisJCXZmLT5kdXJhdGlvbl9wdWxsZG93biA9IDA7CisJCWlmICghKGlzX2lmcmFtZShmcmFtZSkpICYmIGh3LT51bnN0YWJsZV9wdHMpIHsKKwkJCXZmLT5wdHMgPSAwOworCQkJdmYtPnB0c191czY0ID0gMDsKKwkJCXZmLT50aW1lc3RhbXAgPSAwOworCQkJdmYtPmluZGV4ID0gVkZfSU5ERVgoZnJhbWUtPmluZGV4LCBidWZmZXJfaW5kZXgpOworCQl9IGVsc2UgeworCQkJdmYtPnB0cyA9IGZyYW1lLT5wdHM7CisJCQl2Zi0+cHRzX3VzNjQgPSBmcmFtZS0+cHRzNjQ7CisJCQl2Zi0+dGltZXN0YW1wID0gZnJhbWUtPnRpbWVzdGFtcDsKKwkJCXZmLT5pbmRleCA9IFZGX0lOREVYKGZyYW1lLT5pbmRleCwgYnVmZmVyX2luZGV4KTsKKwkJfQorCisJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCXZmLT52NGxfbWVtX2hhbmRsZQorCQkJCT0gaHctPmJ1ZmZlcl9zcGVjW2J1ZmZlcl9pbmRleF0uY21hX2FsbG9jX2FkZHI7CisJCQlmYiA9IChzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqKXZmLT52NGxfbWVtX2hhbmRsZTsKKwkJfQorCisJCWlmIChody0+ZW5hYmxlX2ZlbmNlKSB7CisJCQkvKiBmaWxsIGZlbmNlIGluZm9ybWF0aW9uLiAqLworCQkJaWYgKGh3LT5mZW5jZV91c2FnZSA9PSBGRU5DRV9VU0VfRk9SX0RSSVZFUikKKwkJCQl2Zi0+ZmVuY2UJPSBmcmFtZS0+ZmVuY2U7CisJCX0KKworCQlpZiAoaHctPm1tdV9lbmFibGUpIHsKKwkJCWlmIChody0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDEwKSB7CisJCQkJLyogZG91YmxlIHdyaXRlIG9ubHkgKi8KKwkJCQl2Zi0+Y29tcEJvZHlBZGRyID0gMDsKKwkJCQl2Zi0+Y29tcEhlYWRBZGRyID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJLypoZWFkIGFkciovCisJCQkJdmYtPmNvbXBIZWFkQWRkciA9CisJCQkJaHctPmJ1ZmZlcl9zcGVjW2J1ZmZlcl9pbmRleF0uYWxsb2NfaGVhZGVyX2FkZHI7CisJCQkJLypib2R5IGFkciovCisJCQkJdmYtPmNvbXBCb2R5QWRkciA9IDA7CisJCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0gMDsKKwkJCX0KKworCQkJdmYtPnR5cGUgPSBWSURUWVBFX1NDQVRURVI7CisKKwkJCWlmIChody0+ZG91YmxlX3dyaXRlX21vZGUpIHsKKwkJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX1BST0dSRVNTSVZFCisJCQkJCXwgVklEVFlQRV9WSVVfRklFTEQ7CisJCQkJdmYtPnR5cGUgfD0gbnZfb3JkZXI7CisJCQkJaWYgKGh3LT5kb3VibGVfd3JpdGVfbW9kZSA9PSAzKQorCQkJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX0NPTVBSRVNTOworCisJCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0gLTE7CisJCQkJdmYtPnBsYW5lX251bSA9IDI7CisJCQkJdmYtPmNhbnZhczBfY29uZmlnWzBdID0KKwkJCQkJaHctPmJ1ZmZlcl9zcGVjW2J1ZmZlcl9pbmRleF0uCisJCQkJCQljYW52YXNfY29uZmlnWzBdOworCQkJCXZmLT5jYW52YXMwX2NvbmZpZ1sxXSA9CisJCQkJCWh3LT5idWZmZXJfc3BlY1tidWZmZXJfaW5kZXhdLgorCQkJCQkJY2FudmFzX2NvbmZpZ1sxXTsKKworCQkJCXZmLT5jYW52YXMxX2NvbmZpZ1swXSA9CisJCQkJCWh3LT5idWZmZXJfc3BlY1tidWZmZXJfaW5kZXhdLgorCQkJCQkJY2FudmFzX2NvbmZpZ1swXTsKKwkJCQl2Zi0+Y2FudmFzMV9jb25maWdbMV0gPQorCQkJCQlody0+YnVmZmVyX3NwZWNbYnVmZmVyX2luZGV4XS4KKwkJCQkJCWNhbnZhc19jb25maWdbMV07CisKKwkJCX0gZWxzZSB7CisJCQkJdmYtPnR5cGUgfD0KKwkJCQkJVklEVFlQRV9DT01QUkVTUyB8IFZJRFRZUEVfVklVX0ZJRUxEOworCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IDA7CisJCQl9CisKKwkJCXZmLT5iaXRkZXB0aCA9CisJCQkJQklUREVQVEhfWTggfCBCSVRERVBUSF9VOCB8IEJJVERFUFRIX1Y4OworCisJCQl2Zi0+Y29tcFdpZHRoID0gaHctPmZyYW1lX3dpZHRoOworCQkJdmYtPmNvbXBIZWlnaHQgPSBody0+ZnJhbWVfaGVpZ2h0OworCQl9IGVsc2UgeworCQkJdmYtPnR5cGUgPSBWSURUWVBFX1BST0dSRVNTSVZFIHwgVklEVFlQRV9WSVVfRklFTEQgfAorCQkJCW52X29yZGVyOworCisJCQl2Zi0+Y2FudmFzMEFkZHIgPSB2Zi0+Y2FudmFzMUFkZHIgPQorCQkJc3BlYzJjYW52YXMoJmh3LT5idWZmZXJfc3BlY1tidWZmZXJfaW5kZXhdKTsKKyNpZmRlZiBWREVDX0RXCisJCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3KSB7CisJCQkJaWYgKElTX1ZERUNfRFcoaHcpKQorCQkJCQl2Zi0+Y2FudmFzMEFkZHIgPSB2Zi0+Y2FudmFzMUFkZHIgPQorCQkJCQkJdmRlY19kd19zcGVjMmNhbnZhcygmaHctPmJ1ZmZlcl9zcGVjW2J1ZmZlcl9pbmRleF0pOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoSVNfVkRFQ19EVyhodykpCisJCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IC0xOworCQkJfQorI2VuZGlmCisKKwkJfQorCQlzZXRfZnJhbWVfaW5mbyhodywgdmYsIGJ1ZmZlcl9pbmRleCk7CisJCWlmIChody0+ZGlzY2FyZF9kdl9kYXRhKSB7CisJCQl2Zi0+ZGlzY2FyZF9kdl9kYXRhID0gdHJ1ZTsKKwkJfQorCisJCWlmIChody0+bW11X2VuYWJsZSAmJiBody0+ZG91YmxlX3dyaXRlX21vZGUpIHsKKwkJCXZmLT53aWR0aCA9IGh3LT5mcmFtZV93aWR0aCAvCisJCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhody0+ZG91YmxlX3dyaXRlX21vZGUpOworCQkJdmYtPmhlaWdodCA9IGh3LT5mcmFtZV9oZWlnaHQgLworCQkJCWdldF9kb3VibGVfd3JpdGVfcmF0aW8oaHctPmRvdWJsZV93cml0ZV9tb2RlKTsKKwkJfQorCisJCWlmIChmcmFtZS0+c2xpY2VfdHlwZSA9PSBJX1NMSUNFKSB7CisJCQl2Zi0+ZnJhbWVfdHlwZSB8PSBWNEwyX0JVRl9GTEFHX0tFWUZSQU1FOworCQl9IGVsc2UgaWYgKGZyYW1lLT5zbGljZV90eXBlID09IFBfU0xJQ0UpIHsKKwkJCXZmLT5mcmFtZV90eXBlIHw9IFY0TDJfQlVGX0ZMQUdfUEZSQU1FOworCQl9IGVsc2UgaWYgKGZyYW1lLT5zbGljZV90eXBlID09IEJfU0xJQ0UpIHsKKwkJCXZmLT5mcmFtZV90eXBlIHw9IFY0TDJfQlVGX0ZMQUdfQkZSQU1FOworCQl9CisKKwkJdmYtPmZsYWcgPSAwOworCQlpZiAoZnJhbWUtPmRhdGFfZmxhZyAmIElfRkxBRykKKwkJCXZmLT5mbGFnIHw9IFZGUkFNRV9GTEFHX1NZTkNGUkFNRTsKKwkJaWYgKGZyYW1lLT5kYXRhX2ZsYWcgJiBFUlJPUl9GTEFHKQorCQkJdmYtPmZsYWcgfD0gVkZSQU1FX0ZMQUdfRVJST1JfUkVDT1ZFUlk7CisJCXVwZGF0ZV92Zl9tZW1oYW5kbGUoaHcsIHZmLCBidWZmZXJfaW5kZXgpOworCisJCWlmICghaHctPmVuYWJsZV9mZW5jZSkgeworCQkJaHctPmJ1ZmZlcl9zcGVjW2J1ZmZlcl9pbmRleF0udXNlZCA9IDI7CisJCQlody0+YnVmZmVyX3NwZWNbYnVmZmVyX2luZGV4XS52Zl9yZWYrKzsKKwkJfQorCisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkiJXMgJWQgZnJhbWUgPSAlcCB0b3BfZmllbGQgPSAlcCBib3R0b21fZmllbGQgPSAlcFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBmcmFtZS0+ZnJhbWUsCisJCQlmcmFtZS0+dG9wX2ZpZWxkLCBmcmFtZS0+Ym90dG9tX2ZpZWxkKTsKKworCQlpZiAoZnJhbWUtPmZyYW1lICE9IE5VTEwpIHsKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJIiVzICVkIGNvZGVkX2ZyYW1lID0gJWQgZnJhbWVfbWJzX29ubHlfZmxhZyA9ICVkIHN0cnVjdHVyZSA9ICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkJZnJhbWUtPmZyYW1lLT5jb2RlZF9mcmFtZSwgZnJhbWUtPmZyYW1lLT5mcmFtZV9tYnNfb25seV9mbGFnLCBmcmFtZS0+ZnJhbWUtPnN0cnVjdHVyZSk7CisJCX0KKworCQlpZiAoYkZvcmNlSW50ZXJsYWNlIHx8IGlzX2ludGVybGFjZShmcmFtZSkpIHsKKwkJCXZmLT50eXBlID0KKwkJCQlWSURUWVBFX0lOVEVSTEFDRV9GSVJTVCB8CisJCQkJbnZfb3JkZXI7CisKKwkJCWlmIChmcmFtZS0+ZnJhbWUgIT0gTlVMTCAmJgorCQkJCShmcmFtZS0+ZnJhbWUtPnBpY19zdHJ1Y3QgPT0gUElDX1RPUF9CT1QgfHwKKwkJCQlmcmFtZS0+ZnJhbWUtPnBpY19zdHJ1Y3QgPT0gUElDX0JPVF9UT1ApICYmCisJCQkJZnJhbWUtPmZyYW1lLT5jb2RlZF9mcmFtZSkgeworCQkJCWlmIChmcmFtZS0+ZnJhbWUgIT0gTlVMTCAmJiBmcmFtZS0+ZnJhbWUtPnBpY19zdHJ1Y3QgPT0gUElDX1RPUF9CT1QpIHsKKwkJCQl2Zi0+dHlwZSB8PSAoaSA9PSAwID8KKwkJCQkJVklEVFlQRV9JTlRFUkxBQ0VfVE9QIDoKKwkJCQkJVklEVFlQRV9JTlRFUkxBQ0VfQk9UVE9NKTsKKwkJCQl9IGVsc2UgaWYgKGZyYW1lLT5mcmFtZSAhPSBOVUxMICYmIGZyYW1lLT5mcmFtZS0+cGljX3N0cnVjdCA9PSBQSUNfQk9UX1RPUCkgeworCQkJCQl2Zi0+dHlwZSB8PSAoaSA9PSAwID8KKwkJCQkJVklEVFlQRV9JTlRFUkxBQ0VfQk9UVE9NIDoKKwkJCQkJVklEVFlQRV9JTlRFUkxBQ0VfVE9QKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGZyYW1lLT50b3BfZmllbGQgIT0gTlVMTCAmJiBmcmFtZS0+Ym90dG9tX2ZpZWxkICE9IE5VTEwpIHsvKnRvcCBmaXJzdCovCisJCQkJaWYgKGZyYW1lLT50b3BfZmllbGQtPnBvYyA8PSBmcmFtZS0+Ym90dG9tX2ZpZWxkLT5wb2MpCisJCQkJCXZmLT50eXBlIHw9IChpID09IDAgPworCQkJCQkJVklEVFlQRV9JTlRFUkxBQ0VfVE9QIDoKKwkJCQkJCVZJRFRZUEVfSU5URVJMQUNFX0JPVFRPTSk7CisJCQkJZWxzZQorCQkJCQl2Zi0+dHlwZSB8PSAoaSA9PSAwID8KKwkJCQkJCVZJRFRZUEVfSU5URVJMQUNFX0JPVFRPTSA6CisJCQkJCQlWSURUWVBFX0lOVEVSTEFDRV9UT1ApOworCQkJfSBlbHNlIHsKKwkJCQl2Zi0+dHlwZSB8PSAoaSA9PSAwID8KKwkJCQkJVklEVFlQRV9JTlRFUkxBQ0VfVE9QIDoKKwkJCQkJVklEVFlQRV9JTlRFUkxBQ0VfQk9UVE9NKTsKKwkJCX0KKwkJCXZmLT5kdXJhdGlvbiA9IHZmLT5kdXJhdGlvbi8yOworCQkJaWYgKGkgPT0gMSkgeworCQkJCXZmLT5wdHMgPSAwOworCQkJCXZmLT5wdHNfdXM2NCA9IDA7CisJCQl9CisKKwkJCWlmIChmcmFtZS0+ZnJhbWUpIHsKKwkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJCQkiJXMgJWQgdHlwZSA9IDB4JXggcGljX3N0cnVjdCA9ICVkIHB0cyA9IDB4JXggcHRzX3VzNjQgPSAweCVsbHggYkZvcmNlSW50ZXJsYWNlID0gJWRcbiIsCisJCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgdmYtPnR5cGUsIGZyYW1lLT5mcmFtZS0+cGljX3N0cnVjdCwKKwkJCQkJdmYtPnB0cywgdmYtPnB0c191czY0LCBiRm9yY2VJbnRlcmxhY2UpOworCQkJfQorCQl9CisKKwkJaWYgKGh3LT5pX29ubHkpIHsKKwkJCWlmICh2Zl9jb3VudCA9PSAxICYmIGZyYW1lLT5pc191c2VkID09IDEgJiYgZnJhbWUtPnRvcF9maWVsZAorCQkJCSYmIGZyYW1lLT5ib3R0b21fZmllbGQgPT0gTlVMTCAmJiBmcmFtZS0+ZnJhbWUgPT0gTlVMTCkgeworCQkJCXZmLT50eXBlID0KKwkJCQkJVklEVFlQRV9JTlRFUkxBQ0VfRklSU1QgfAorCQkJCQludl9vcmRlcjsKKwkJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX0lOVEVSTEFDRV9UT1A7CisJCQkJdmYtPmR1cmF0aW9uID0gdmYtPmR1cmF0aW9uLzI7CisJCQl9CisKKwkJCWlmICh2Zl9jb3VudCA9PSAxICYmIGZyYW1lLT5pc191c2VkID09IDIgJiYgZnJhbWUtPmJvdHRvbV9maWVsZAorCQkJCSYmIGZyYW1lLT50b3BfZmllbGQgPT0gTlVMTCAmJiBmcmFtZS0+ZnJhbWUgPT0gTlVMTCkgeworCQkJCXZmLT50eXBlID0KKwkJCQkJVklEVFlQRV9JTlRFUkxBQ0VfRklSU1QgfAorCQkJCQludl9vcmRlcjsKKwkJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX0lOVEVSTEFDRV9CT1RUT007CisJCQkJdmYtPmR1cmF0aW9uID0gdmYtPmR1cmF0aW9uLzI7CisJCQl9CisJCX0KKworCQkvKnZmLT5yYXRpb19jb250cm9sIHw9ICgweDNGRiA8PCBESVNQX1JBVElPX0FTUEVDVF9SQVRJT19CSVQpOyovCisJCXZmLT5zYXJfd2lkdGggPSBody0+d2lkdGhfYXNwZWN0X3JhdGlvOworCQl2Zi0+c2FyX2hlaWdodCA9IGh3LT5oZWlnaHRfYXNwZWN0X3JhdGlvOworCQlpZiAoIXZkZWMtPnZidWYudXNlX3B0c3NlcnYgJiYgdmRlY19zdHJlYW1fYmFzZWQodmRlYykpIHsKKwkJCS8qIG9mZnNldCBmb3IgdHNwbGF5ZXIgcHRzIGxvb2t1cCAqLworCQkJaWYgKGkgPT0gMCkgeworCQkJCXZmLT5wdHNfdXM2NCA9CisJCQkJCSgoKHU2NCl2Zi0+ZHVyYXRpb24gPDwgMzIpICYKKwkJCQkJMHhmZmZmZmZmZjAwMDAwMDAwKSB8IGZyYW1lLT5vZmZzZXRfZGVsaW1pdGVyOworCQkJCXZmLT5wdHMgPSAwOworCQkJfSBlbHNlIHsKKwkJCQl2Zi0+cHRzX3VzNjQgPSAodTY0KS0xOworCQkJCXZmLT5wdHMgPSAwOworCQkJfQorCQl9CisKKwkJaHctPnZmX3ByZV9jb3VudCsrOworCQl2ZGVjX3ZmcmFtZV9yZWFkeShod190b192ZGVjKGh3KSwgdmYpOworCQlpZiAoIWZyYW1lLT5zaG93X2ZyYW1lKSB7CisJCQl2aDI2NF92Zl9wdXQodmYsIHZkZWMpOworCQkJYXRvbWljX2FkZCgxLCAmaHctPnZmX2dldF9jb3VudCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChpID09IDApIHsKKwkJCXN0cnVjdCB2ZGVjX3MgKnB2ZGVjOworCQkJc3RydWN0IHZkZWNfaW5mbyB2czsKKworCQkJcHZkZWMgPSBod190b192ZGVjKGh3KTsKKwkJCW1lbXNldCgmdnMsIDAsIHNpemVvZihzdHJ1Y3QgdmRlY19pbmZvKSk7CisJCQlwdmRlYy0+ZGVjX3N0YXR1cyhwdmRlYywgJnZzKTsKKwkJCWRlY29kZXJfZG9fZnJhbWVfY2hlY2socHZkZWMsIHZmKTsKKwkJCXZkZWNfZmlsbF92ZGVjX2ZyYW1lKHB2ZGVjLCAmaHctPnZmcmFtZV9xb3MsICZ2cywgdmYsIGZyYW1lLT5od19kZWNvZGVfdGltZSk7CisKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkiWyVzOiVkXSBpX2RlY29kZWRfZnJhbWUgPSAlZCBwX2RlY29kZWRfZnJhbWUgPSAlZCBiX2RlY29kZWRfZnJhbWUgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyx2cy5pX2RlY29kZWRfZnJhbWVzLHZzLnBfZGVjb2RlZF9mcmFtZXMsdnMuYl9kZWNvZGVkX2ZyYW1lcyk7CisJCX0KKworCQlrZmlmb19wdXQoJmh3LT5kaXNwbGF5X3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5wdHNfbmFtZSwgdmYtPnB0cyk7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kaXNwX3FfbmFtZSwga2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKSk7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5uZXdfcV9uYW1lLCBrZmlmb19sZW4oJmh3LT5uZXdmcmFtZV9xKSk7CisJCWh3LT52Zl9wcmVfY291bnQrKzsKKwkJdmRlYy0+dmRlY19mcHNfZGV0ZWModmRlYy0+aWQpOworI2lmZGVmIEFVWF9EQVRBX0NSQworCQlkZWNvZGVyX2RvX2F1eF9kYXRhX2NoZWNrKHZkZWMsIGh3LT5idWZmZXJfc3BlY1tidWZmZXJfaW5kZXhdLmF1eF9kYXRhX2J1ZiwKKwkJCWh3LT5idWZmZXJfc3BlY1tidWZmZXJfaW5kZXhdLmF1eF9kYXRhX3NpemUpOworI2VuZGlmCisKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfU0VJX0RFVEFJTCwgImF1eF9kYXRhX3NpemU6ICVkLCBzaWduYWxfdHlwZTogMHgleFxuIiwKKwkJCWh3LT5idWZmZXJfc3BlY1tidWZmZXJfaW5kZXhdLmF1eF9kYXRhX3NpemUsIGh3LT52aWRlb19zaWduYWxfdHlwZSk7CisKKwkJaWYgKGRwYl9pc19kZWJ1ZyhERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1NFSV9ERVRBSUwpKSB7CisJCQlpbnQgaSA9IDA7CisJCQlQUl9JTklUKDEyOCk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBody0+YnVmZmVyX3NwZWNbYnVmZmVyX2luZGV4XS5hdXhfZGF0YV9zaXplOyBpKyspIHsKKwkJCQlQUl9GSUxMKCIlMDJ4ICIsIGh3LT5idWZmZXJfc3BlY1tidWZmZXJfaW5kZXhdLmF1eF9kYXRhX2J1ZltpXSk7CisJCQkJaWYgKCgoaSArIDEpICYgMHhmKSA9PSAwKQorCQkJCQlQUl9JTkZPKGh3LT5pZCk7CisJCQl9CisJCQlQUl9JTkZPKGh3LT5pZCk7CisJCX0KKworCQlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCQl1cGRhdGVfdmZyYW1lX3NyY19mbXQodmYsCisJCQkJaHctPmJ1ZmZlcl9zcGVjW2J1ZmZlcl9pbmRleF0uYXV4X2RhdGFfYnVmLAorCQkJCWh3LT5idWZmZXJfc3BlY1tidWZmZXJfaW5kZXhdLmF1eF9kYXRhX3NpemUsCisJCQkJZmFsc2UsIHZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsIE5VTEwpOworCQl9CisKKwkJaWYgKHdpdGhvdXRfZGlzcGxheV9tb2RlID09IDApIHsKKwkJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCQlpZiAodjRsMl9jdHgtPmlzX3N0cmVhbV9vZmYpIHsKKwkJCQkJdmgyNjRfdmZfcHV0KHZoMjY0X3ZmX2dldCh2ZGVjKSwgdmRlYyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZmItPnRhc2stPnN1Ym1pdChmYi0+dGFzaywgVEFTS19UWVBFX0RFQyk7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJdmZfbm90aWZ5X3JlY2VpdmVyKHZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9WRlJBTUVfUkVBRFksIE5VTEwpOworCQl9IGVsc2UKKwkJCXZoMjY0X3ZmX3B1dCh2aDI2NF92Zl9nZXQodmRlYyksIHZkZWMpOworCX0KKwlpZiAoZHBiX2lzX2RlYnVnKERFQ09ERV9JRChodyksCisJCVBSSU5UX0ZMQUdfRFVNUF9CVUZTUEVDKSkKKwkJZHVtcF9idWZzcGVjKGh3LCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHBvc3RfcGljdHVyZV9lYXJseShzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgaW5kZXgpCit7CisJc3RydWN0IHZkZWNfaDI2NF9od19zICpodyA9IChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKil2ZGVjLT5wcml2YXRlOworCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpkcGJfc3RydSA9ICZody0+ZHBiOworCXN0cnVjdCBGcmFtZVN0b3JlIGZzOworCXUzMiBvZmZzZXRfbG8sIG9mZnNldF9oaTsKKworCWlmICghaHctPmVuYWJsZV9mZW5jZSkKKwkJcmV0dXJuIDA7CisKKwkvKiBjcmVhdGUgZmVuY2UgZm9yIGVhY2ggYnVmZmVycy4gKi8KKwlpZiAodmRlY190aW1lbGluZV9jcmVhdGVfZmVuY2UodmRlYy0+c3luYykpCisJCXJldHVybiAtMTsKKworCW1lbXNldCgmZnMsIDAsIHNpemVvZihmcykpOworCisJZnMuYnVmX3NwZWNfbnVtCQk9IGluZGV4OworCWZzLmZlbmNlCQk9IHZkZWMtPnN5bmMtPmZlbmNlOworCWZzLnNsaWNlX3R5cGUJCT0gZHBiX3N0cnUtPm1TbGljZS5zbGljZV90eXBlOworCWZzLmRwYl9mcmFtZV9jb3VudAk9IGRwYl9zdHJ1LT5kcGJfZnJhbWVfY291bnQ7CisKKwlvZmZzZXRfbG8gPSBkcGJfc3RydS0+ZHBiX3BhcmFtLmwuZGF0YVtPRkZTRVRfREVMSU1JVEVSX0xPXTsKKwlvZmZzZXRfaGkgPSBkcGJfc3RydS0+ZHBiX3BhcmFtLmwuZGF0YVtPRkZTRVRfREVMSU1JVEVSX0hJXTsKKwlmcy5vZmZzZXRfZGVsaW1pdGVyCT0gKG9mZnNldF9sbyB8IG9mZnNldF9oaSA8PCAxNik7CisKKwlpZiAoaHctPmNodW5rKSB7CisJCWZzLnB0cwkJPSBody0+Y2h1bmstPnB0czsKKwkJZnMucHRzNjQJPSBody0+Y2h1bmstPnB0czY0OworCQlmcy50aW1lc3RhbXAJPSBody0+Y2h1bmstPnRpbWVzdGFtcDsKKwl9CisJZnMuc2hvd19mcmFtZSA9IHRydWU7CisJcG9zdF92aWRlb19mcmFtZSh2ZGVjLCAmZnMpOworCisJZGlzcGxheV9mcmFtZV9jb3VudFtERUNPREVfSUQoaHcpXSsrOworCXJldHVybiAwOworfQorCitpbnQgcHJlcGFyZV9kaXNwbGF5X2J1ZihzdHJ1Y3QgdmRlY19zICp2ZGVjLCBzdHJ1Y3QgRnJhbWVTdG9yZSAqZnJhbWUpCit7CisJc3RydWN0IHZkZWNfaDI2NF9od19zICpodyA9CisJCShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKil2ZGVjLT5wcml2YXRlOworCisJaWYgKGh3LT5lbmFibGVfZmVuY2UpIHsKKwkJaW50IGksIGosIHVzZWRfc2l6ZSwgcmV0OworCQlpbnQgc2lnbmVkX2NvdW50ID0gMDsKKwkJc3RydWN0IHZmcmFtZV9zICpzaWduZWRfZmVuY2VbVkZfUE9PTF9TSVpFXTsKKworCQlwb3N0X3ByZXBhcmVfcHJvY2Vzcyh2ZGVjLCBmcmFtZSk7CisKKwkJaWYgKCFmcmFtZS0+c2hvd19mcmFtZSkKKwkJCXByX2luZm8oImRvIG5vdCBkaXNwbGF5LlxuIik7CisKKwkJaHctPmJ1ZmZlcl9zcGVjW2ZyYW1lLT5idWZfc3BlY19udW1dLnVzZWQgPSAyOworCQlody0+YnVmZmVyX3NwZWNbZnJhbWUtPmJ1Zl9zcGVjX251bV0udmZfcmVmID0gMTsKKwkJaHctPmJ1ZmZlcl9zcGVjW2ZyYW1lLT5idWZfc3BlY19udW1dLmZzX2lkeCA9IGZyYW1lLT5pbmRleDsKKworCQkvKiBub3RpZnkgc2lnbmFsIHRvIHdha2UgdXAgd3Egb2YgZmVuY2UuICovCisJCXZkZWNfdGltZWxpbmVfaW5jcmVhc2UodmRlYy0+c3luYywgMSk7CisKKwkJbXV0ZXhfbG9jaygmaHctPmZlbmNlX211dGV4KTsKKwkJdXNlZF9zaXplID0gaHctPmZlbmNlX3ZmX3MudXNlZF9zaXplOworCQlpZiAodXNlZF9zaXplKSB7CisJCQlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IFZGX1BPT0xfU0laRSAmJiBqIDwgdXNlZF9zaXplOyBpKyspIHsKKwkJCQlpZiAoaHctPmZlbmNlX3ZmX3MuZmVuY2VfdmZbaV0gIT0gTlVMTCkgeworCQkJCQlyZXQgPSBkbWFfZmVuY2VfZ2V0X3N0YXR1cyhody0+ZmVuY2VfdmZfcy5mZW5jZV92ZltpXS0+ZmVuY2UpOworCQkJCQlpZiAocmV0ID09IDEpIHsKKwkJCQkJCXNpZ25lZF9mZW5jZVtzaWduZWRfY291bnRdID0gaHctPmZlbmNlX3ZmX3MuZmVuY2VfdmZbaV07CisJCQkJCQlody0+ZmVuY2VfdmZfcy5mZW5jZV92ZltpXSA9IE5VTEw7CisJCQkJCQlody0+ZmVuY2VfdmZfcy51c2VkX3NpemUtLTsKKwkJCQkJCXNpZ25lZF9jb3VudCsrOworCQkJCQl9CisJCQkJCWorKzsKKwkJCQl9CisJCQl9CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZody0+ZmVuY2VfbXV0ZXgpOworCQlpZiAoc2lnbmVkX2NvdW50ICE9IDApIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBzaWduZWRfY291bnQ7IGkrKykKKwkJCQl2aDI2NF92Zl9wdXQoc2lnbmVkX2ZlbmNlW2ldLCB2ZGVjKTsKKwkJfQorCisJCXJldHVybiAwOworCX0KKworCWlmIChwb3N0X3ByZXBhcmVfcHJvY2Vzcyh2ZGVjLCBmcmFtZSkpCisJCXJldHVybiAtMTsKKworCWlmIChwb3N0X3ZpZGVvX2ZyYW1lKHZkZWMsIGZyYW1lKSkKKwkJcmV0dXJuIC0xOworCisJZGlzcGxheV9mcmFtZV9jb3VudFtERUNPREVfSUQoaHcpXSsrOworCXJldHVybiAwOworfQorCitpbnQgbm90aWZ5X3Y0bF9lb3Moc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPSAoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisJc3RydWN0IHZmcmFtZV9zICp2ZiA9ICZody0+dmZyYW1lX2R1bW15OworCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9IE5VTEw7CisJaW50IGluZGV4ID0gSU5WQUxJRF9JRFg7CisJdWxvbmcgZXhwaXJlczsKKworCWlmIChody0+ZW9zKSB7CisJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCWV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMDAwKTsKKwkJCXdoaWxlIChJTlZBTElEX0lEWCA9PSAoaW5kZXggPSB2NGxfZ2V0X2ZyZWVfYnVmX2lkeCh2ZGVjKSkpIHsKKwkJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBleHBpcmVzKSB8fAorCQkJCQl2NGwyX20ybV9udW1fZHN0X2J1ZnNfcmVhZHkoY3R4LT5tMm1fY3R4KSkKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChpbmRleCA9PSBJTlZBTElEX0lEWCkgeworCQkJCWN0eC0+ZmJfb3BzLnF1ZXJ5KCZjdHgtPmZiX29wcywgJmh3LT5mYl90b2tlbik7CisJCQkJaWYgKGN0eC0+ZmJfb3BzLmFsbG9jKCZjdHgtPmZiX29wcywgaHctPmZiX3Rva2VuLCAmZmIsIEFNTF9GQl9SRVFfREVDKSA8IDApIHsKKwkJCQkJcHJfZXJyKCJbJWRdIEVPUyBnZXQgZnJlZSBidWZmIGZhaWwuXG4iLCBjdHgtPmlkKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXZmLT50eXBlCQl8PSBWSURUWVBFX1Y0TF9FT1M7CisJCXZmLT50aW1lc3RhbXAJCT0gVUxPTkdfTUFYOworCQl2Zi0+ZmxhZwkJPSBWRlJBTUVfRkxBR19FTVBUWV9GUkFNRV9WNEw7CisJCXZmLT52NGxfbWVtX2hhbmRsZQk9IChpbmRleCA9PSBJTlZBTElEX0lEWCkgPyAodWxvbmcpZmIgOgorCQkJCQlody0+YnVmZmVyX3NwZWNbaW5kZXhdLmNtYV9hbGxvY19hZGRyOworCQlmYiA9IChzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqKXZmLT52NGxfbWVtX2hhbmRsZTsKKworCQl2ZGVjX3ZmcmFtZV9yZWFkeSh2ZGVjLCB2Zik7CisJCWtmaWZvX3B1dCgmaHctPmRpc3BsYXlfcSwgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKworCQlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UucHRzX25hbWUsIHZmLT5wdHMpOworCisJCWlmIChody0+aXNfdXNlZF92NGwpCisJCQlmYi0+dGFzay0+c3VibWl0KGZiLT50YXNrLCBUQVNLX1RZUEVfREVDKTsKKwkJZWxzZQorCQkJdmZfbm90aWZ5X3JlY2VpdmVyKHZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1ZGUkFNRV9SRUFEWSwgTlVMTCk7CisKKwkJcHJfaW5mbygiWyVkXSBIMjY0IEVPUyBub3RpZnkuXG4iLCAoaHctPmlzX3VzZWRfdjRsKT9jdHgtPmlkOnZkZWMtPmlkKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKgorICogSGFyZHdhcmUgY29uZmlnCisgKi8KK2NoYXIgKnNsaWNlX3R5cGVfbmFtZVtdID0geworCSJQX1NMSUNFICIsCisJIkJfU0xJQ0UgIiwKKwkiSV9TTElDRSAiLAorCSJTUF9TTElDRSIsCisJIlNJX1NMSUNFIiwKK307CisKK2NoYXIgKnBpY3R1cmVfc3RydWN0dXJlX25hbWVbXSA9IHsKKwkiRlJBTUUiLAorCSJUT1BfRklFTEQiLAorCSJCT1RUT01fRklFTEQiCit9OworCit2b2lkIHByaW50X3BpY19pbmZvKGludCBkZWNpbmRleCwgY29uc3QgY2hhciAqaW5mbywKKwkJCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnBpYywKKwkJCWludCBzbGljZV90eXBlKQoreworCWlmIChwaWMpCisJCWRwYl9wcmludChkZWNpbmRleCwgUFJJTlRfRkxBR19ERUNfREVUQUlMLAorCQkiJXM6ICVzIChvcmlnaW5hbCAlcyksICVzLCBtYl9hZmZfZnJhbWVfZmxhZyAlZCAgcG9jICVkLCBwaWNfbnVtICVkLCBidWZfc3BlY19udW0gJWQgZGF0YV9mbGFnIDB4JXhcbiIsCisJCWluZm8sCisJCXBpY3R1cmVfc3RydWN0dXJlX25hbWVbcGljLT5zdHJ1Y3R1cmVdLAorCQlwaWMtPmNvZGVkX2ZyYW1lID8gIkZyYW1lIiA6ICJGaWVsZCIsCisJCShzbGljZV90eXBlIDwgMCB8fAorCQlzbGljZV90eXBlID49IChzaXplb2Yoc2xpY2VfdHlwZV9uYW1lKSAvIHNpemVvZihzbGljZV90eXBlX25hbWVbMF0pKSkgPyAiIiA6IHNsaWNlX3R5cGVfbmFtZVtzbGljZV90eXBlXSwKKwkJcGljLT5tYl9hZmZfZnJhbWVfZmxhZywKKwkJcGljLT5wb2MsCisJCXBpYy0+cGljX251bSwKKwkJcGljLT5idWZfc3BlY19udW0sCisJCXBpYy0+ZGF0YV9mbGFnKTsKK30KKworc3RhdGljIHZvaWQgcmVzZXRfcHJvY2Vzc190aW1lKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcpCit7CisJaWYgKGh3LT5zdGFydF9wcm9jZXNzX3RpbWUpIHsKKwkJdW5zaWduZWQgcHJvY2Vzc190aW1lID0KKwkJCTEwMDAgKiAoamlmZmllcyAtIGh3LT5zdGFydF9wcm9jZXNzX3RpbWUpIC8gSFo7CisJCWh3LT5zdGFydF9wcm9jZXNzX3RpbWUgPSAwOworCQlpZiAocHJvY2Vzc190aW1lID4gbWF4X3Byb2Nlc3NfdGltZVtERUNPREVfSUQoaHcpXSkKKwkJCW1heF9wcm9jZXNzX3RpbWVbREVDT0RFX0lEKGh3KV0gPSBwcm9jZXNzX3RpbWU7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdGFydF9wcm9jZXNzX3RpbWUoc3RydWN0IHZkZWNfaDI2NF9od19zICpodykKK3sKKwlody0+ZGVjb2RlX3RpbWVvdXRfY291bnQgPSAxMDsKKwlody0+c3RhcnRfcHJvY2Vzc190aW1lID0gamlmZmllczsKK30KKworc3RhdGljIHZvaWQgY29uZmlnX2F1eF9idWYoc3RydWN0IHZkZWNfaDI2NF9od19zICpodykKK3sKKwlXUklURV9WUkVHKEgyNjRfQVVYX0FEUiwgaHctPmF1eF9waHlfYWRkcik7CisJV1JJVEVfVlJFRyhIMjY0X0FVWF9EQVRBX1NJWkUsCisJCSgoaHctPnByZWZpeF9hdXhfc2l6ZSA+PiA0KSA8PCAxNikgfAorCQkoaHctPnN1ZmZpeF9hdXhfc2l6ZSA+PiA0KQorCQkpOworfQorCisvKgorKiBkdl9tZXRhX2ZsYWc6IDEsIGRvbGJ5IG1ldGEgb25seTsgMiwgbm90IGluY2x1ZGUgZG9sYnkgbWV0YQorKi8KK3N0YXRpYyB2b2lkIHNldF9hdXhfZGF0YShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LAorCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnBpYywgdW5zaWduZWQgY2hhciBzdWZmaXhfZmxhZywKKwl1bnNpZ25lZCBjaGFyIGR2X21ldGFfZmxhZywgc3RydWN0IHZkZWNfaDI2NF9od19zICpod19iKQoreworCWludCBpOworCXVuc2lnbmVkIHNob3J0ICphdXhfYWRyOworCXVuc2lnbmVkIHNpemVfcmVnX3ZhbCA9CisJCVJFQURfVlJFRyhIMjY0X0FVWF9EQVRBX1NJWkUpOworCXVuc2lnbmVkIGF1eF9jb3VudCA9IDA7CisJaW50IGF1eF9zaXplID0gMDsKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3X2J1ZiA9IGh3X2IgPyBod19iIDogaHc7CisJaWYgKHBpYyA9PSBOVUxMIHx8IHBpYy0+YnVmX3NwZWNfbnVtIDwgMCB8fCBwaWMtPmJ1Zl9zcGVjX251bSA+PSBCVUZTUEVDX1BPT0xfU0laRQorCQl8fCAoIWlzX2J1Zl9zcGVjX2luX3VzZShodywgcGljLT5idWZfc3BlY19udW0pKSkKKwkJcmV0dXJuOworCisJaWYgKHN1ZmZpeF9mbGFnKSB7CisJCWF1eF9hZHIgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCShod19idWYtPmF1eF9hZGRyICsKKwkJCWh3X2J1Zi0+cHJlZml4X2F1eF9zaXplKTsKKwkJYXV4X2NvdW50ID0KKwkJKChzaXplX3JlZ192YWwgJiAweGZmZmYpIDw8IDQpCisJCQk+PiAxOworCQlhdXhfc2l6ZSA9CisJCQlod19idWYtPnN1ZmZpeF9hdXhfc2l6ZTsKKwl9IGVsc2UgeworCQlhdXhfYWRyID0KKwkJKHVuc2lnbmVkIHNob3J0ICopaHdfYnVmLT5hdXhfYWRkcjsKKwkJYXV4X2NvdW50ID0KKwkJKChzaXplX3JlZ192YWwgPj4gMTYpIDw8IDQpCisJCQk+PiAxOworCQlhdXhfc2l6ZSA9CisJCQlod19idWYtPnByZWZpeF9hdXhfc2l6ZTsKKwl9CisJaWYgKGRwYl9pc19kZWJ1ZyhERUNPREVfSUQoaHcpLAorCQkgUFJJTlRfRkxBR19TRUlfREVUQUlMKSkgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSIlczpwb2MgJWQgb2xkIHNpemUgJWQgY291bnQgJWQsc3VmICVkIGR2X2ZsYWcgJWRcclxuIiwKKwkJCV9fZnVuY19fLCBwaWMtPnBvYywgQVVYX0RBVEFfU0laRShwaWMpLAorCQkJYXV4X2NvdW50LCBzdWZmaXhfZmxhZywgZHZfbWV0YV9mbGFnKTsKKwl9CisJaWYgKGF1eF9zaXplID4gMCAmJiBhdXhfY291bnQgPiAwKSB7CisJCWludCBoZWFkc19zaXplID0gMDsKKwkJaW50IG5ld19zaXplOworCQljaGFyICpuZXdfYnVmOworCQlmb3IgKGkgPSAwOyBpIDwgYXV4X2NvdW50OyBpKyspIHsKKwkJCXVuc2lnbmVkIGNoYXIgdGFnID0gYXV4X2FkcltpXSA+PiA4OworCQkJaWYgKHRhZyAhPSAwICYmIHRhZyAhPSAweGZmKSB7CisJCQkJaWYgKGR2X21ldGFfZmxhZyA9PSAwKQorCQkJCQloZWFkc19zaXplICs9IDg7CisJCQkJZWxzZSBpZiAoZHZfbWV0YV9mbGFnID09IDEgJiYgdGFnID09IDB4MSkKKwkJCQkJaGVhZHNfc2l6ZSArPSA4OworCQkJCWVsc2UgaWYgKGR2X21ldGFfZmxhZyA9PSAyICYmIHRhZyAhPSAweDEpCisJCQkJCWhlYWRzX3NpemUgKz0gODsKKwkJCX0KKwkJfQorCQluZXdfc2l6ZSA9IEFVWF9EQVRBX1NJWkUocGljKSArIGF1eF9jb3VudCArIGhlYWRzX3NpemU7CisJCW5ld19idWYgPSBrcmVhbGxvYyhBVVhfREFUQV9CVUYocGljKSwKKwkJCW5ld19zaXplLAorCQkJR0ZQX0tFUk5FTCk7CisJCWlmIChuZXdfYnVmKSB7CisJCQl1bnNpZ25lZCBjaGFyIHZhbGlkX3RhZyA9IDA7CisJCQl1bnNpZ25lZCBjaGFyICpoID0KKwkJCQluZXdfYnVmICsKKwkJCQlBVVhfREFUQV9TSVpFKHBpYyk7CisJCQl1bnNpZ25lZCBjaGFyICpwID0gaCArIDg7CisJCQlpbnQgbGVuID0gMDsKKwkJCWludCBwYWRkaW5nX2xlbiA9IDA7CisJCQlBVVhfREFUQV9CVUYocGljKSA9IG5ld19idWY7CisJCQlmb3IgKGkgPSAwOyBpIDwgYXV4X2NvdW50OyBpICs9IDQpIHsKKwkJCQlpbnQgaWk7CisJCQkJdW5zaWduZWQgY2hhciB0YWcgPSBhdXhfYWRyW2kgKyAzXSA+PiA4OworCQkJCWlmICh0YWcgIT0gMCAmJiB0YWcgIT0gMHhmZikgeworCQkJCQlpZiAoZHZfbWV0YV9mbGFnID09IDApCisJCQkJCQl2YWxpZF90YWcgPSAxOworCQkJCQllbHNlIGlmIChkdl9tZXRhX2ZsYWcgPT0gMQorCQkJCQkJJiYgdGFnID09IDB4MSkKKwkJCQkJCXZhbGlkX3RhZyA9IDE7CisJCQkJCWVsc2UgaWYgKGR2X21ldGFfZmxhZyA9PSAyCisJCQkJCQkmJiB0YWcgIT0gMHgxKQorCQkJCQkJdmFsaWRfdGFnID0gMTsKKwkJCQkJZWxzZQorCQkJCQkJdmFsaWRfdGFnID0gMDsKKwkJCQkJaWYgKHZhbGlkX3RhZyAmJiBsZW4gPiAwKSB7CisJCQkJCQlBVVhfREFUQV9TSVpFKHBpYykgKz0KKwkJCQkJCShsZW4gKyA4KTsKKwkJCQkJCWhbMF0gPQorCQkJCQkJKGxlbiA+PiAyNCkgJiAweGZmOworCQkJCQkJaFsxXSA9CisJCQkJCQkobGVuID4+IDE2KSAmIDB4ZmY7CisJCQkJCQloWzJdID0KKwkJCQkJCShsZW4gPj4gOCkgJiAweGZmOworCQkJCQkJaFszXSA9CisJCQkJCQkobGVuID4+IDApICYgMHhmZjsKKwkJCQkJCWhbNl0gPQorCQkJCQkJKHBhZGRpbmdfbGVuID4+IDgpCisJCQkJCQkmIDB4ZmY7CisJCQkJCQloWzddID0KKwkJCQkJCShwYWRkaW5nX2xlbikgJiAweGZmOworCQkJCQkJaCArPSAobGVuICsgOCk7CisJCQkJCQlwICs9IDg7CisJCQkJCQlsZW4gPSAwOworCQkJCQkJcGFkZGluZ19sZW4gPSAwOworCQkJCQl9CisJCQkJCWlmICh2YWxpZF90YWcpIHsKKwkJCQkJCWhbNF0gPSB0YWc7CisJCQkJCQloWzVdID0gMDsKKwkJCQkJCWhbNl0gPSAwOworCQkJCQkJaFs3XSA9IDA7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKHZhbGlkX3RhZykgeworCQkJCQlmb3IgKGlpID0gMDsgaWkgPCA0OyBpaSsrKSB7CisJCQkJCQl1bnNpZ25lZCBzaG9ydCBhYSA9CisJCQkJCQkJYXV4X2FkcltpICsgMworCQkJCQkJCS0gaWldOworCQkJCQkJKnAgPSBhYSAmIDB4ZmY7CisJCQkJCQlwKys7CisJCQkJCQlsZW4rKzsKKwkJCQkJCS8qaWYgKChhYSA+PiA4KSA9PSAweGZmKQorCQkJCQkJCXBhZGRpbmdfbGVuKys7Ki8KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChsZW4gPiAwKSB7CisJCQkJQVVYX0RBVEFfU0laRShwaWMpICs9IChsZW4gKyA4KTsKKwkJCQloWzBdID0gKGxlbiA+PiAyNCkgJiAweGZmOworCQkJCWhbMV0gPSAobGVuID4+IDE2KSAmIDB4ZmY7CisJCQkJaFsyXSA9IChsZW4gPj4gOCkgJiAweGZmOworCQkJCWhbM10gPSAobGVuID4+IDApICYgMHhmZjsKKwkJCQloWzZdID0gKHBhZGRpbmdfbGVuID4+IDgpICYgMHhmZjsKKwkJCQloWzddID0gKHBhZGRpbmdfbGVuKSAmIDB4ZmY7CisJCQl9CisJCQlpZiAoZHBiX2lzX2RlYnVnKERFQ09ERV9JRChodyksCisJCQkJUFJJTlRfRkxBR19TRUlfREVUQUlMKSkgeworCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJCQkiYXV4OiAoc2l6ZSAlZCkgc3VmZml4X2ZsYWcgJWRcbiIsCisJCQkJCUFVWF9EQVRBX1NJWkUocGljKSwgc3VmZml4X2ZsYWcpOworCQkJCWZvciAoaSA9IDA7IGkgPCBBVVhfREFUQV9TSVpFKHBpYyk7IGkrKykgeworCQkJCQlkcGJfcHJpbnRfY29udChERUNPREVfSUQoaHcpLCAwLAorCQkJCQkJIiUwMnggIiwgQVVYX0RBVEFfQlVGKHBpYylbaV0pOworCQkJCQlpZiAoKChpICsgMSkgJiAweGYpID09IDApCisJCQkJCQlkcGJfcHJpbnRfY29udCgKKwkJCQkJCURFQ09ERV9JRChodyksCisJCQkJCQkJMCwgIlxuIik7CisJCQkJfQorCQkJCWRwYl9wcmludF9jb250KERFQ09ERV9JRChodyksCisJCQkJCTAsICJcbiIpOworCQkJfQorCisJCX0KKwl9CisKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9hdXhfZGF0YShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LAorCWludCBidWZfc3BlY19udW0pCit7CisJa2ZyZWUoaHctPmJ1ZmZlcl9zcGVjW2J1Zl9zcGVjX251bV0uYXV4X2RhdGFfYnVmKTsKKwlody0+YnVmZmVyX3NwZWNbYnVmX3NwZWNfbnVtXS5hdXhfZGF0YV9idWYgPSBOVUxMOworCWh3LT5idWZmZXJfc3BlY1tidWZfc3BlY19udW1dLmF1eF9kYXRhX3NpemUgPSAwOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2F1eF9idWYoc3RydWN0IHZkZWNfaDI2NF9od19zICpodykKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBzaG9ydCAqYXV4X2FkciA9CisJCSh1bnNpZ25lZCBzaG9ydCAqKQorCQlody0+YXV4X2FkZHI7CisJdW5zaWduZWQgYXV4X3NpemUgPQorCQkoUkVBRF9WUkVHKEgyNjRfQVVYX0RBVEFfU0laRSkKKwkJPj4gMTYpIDw8IDQ7CisKKwlpZiAoaHctPnByZWZpeF9hdXhfc2l6ZSA+IDApIHsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQkwLAorCQkJInByZWZpeCBhdXg6IChzaXplICVkKVxuIiwKKwkJCWF1eF9zaXplKTsKKwkJZm9yIChpID0gMDsgaSA8CisJCShhdXhfc2l6ZSA+PiAxKTsgaSsrKSB7CisJCQlkcGJfcHJpbnRfY29udChERUNPREVfSUQoaHcpLAorCQkJCTAsCisJCQkJIiUwNHggIiwKKwkJCQkqKGF1eF9hZHIgKyBpKSk7CisJCQlpZiAoKChpICsgMSkgJiAweGYpCisJCQkJPT0gMCkKKwkJCQlkcGJfcHJpbnRfY29udCgKKwkJCQlERUNPREVfSUQoaHcpLAorCQkJCTAsICJcbiIpOworCQl9CisJfQorCWlmIChody0+c3VmZml4X2F1eF9zaXplID4gMCkgeworCQlhdXhfYWRyID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkoaHctPmF1eF9hZGRyICsKKwkJCWh3LT5wcmVmaXhfYXV4X3NpemUpOworCQlhdXhfc2l6ZSA9CisJCShSRUFEX1ZSRUcoSDI2NF9BVVhfREFUQV9TSVpFKSAmIDB4ZmZmZikKKwkJCTw8IDQ7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLAorCQkJMCwKKwkJCSJzdWZmaXggYXV4OiAoc2l6ZSAlZClcbiIsCisJCQlhdXhfc2l6ZSk7CisJCWZvciAoaSA9IDA7IGkgPAorCQkoYXV4X3NpemUgPj4gMSk7IGkrKykgeworCQkJZHBiX3ByaW50X2NvbnQoREVDT0RFX0lEKGh3KSwKKwkJCQkwLAorCQkJCSIlMDR4ICIsICooYXV4X2FkciArIGkpKTsKKwkJCWlmICgoKGkgKyAxKSAmIDB4ZikgPT0gMCkKKwkJCQlkcGJfcHJpbnRfY29udChERUNPREVfSUQoaHcpLAorCQkJCTAsICJcbiIpOworCQl9CisJfQorfQorCisjaWZkZWYgVkRFQ19EVworCitzdHJ1Y3QgdmRlY19kd19wYXJhbV9zZXR7CisJY2hhciBkd194X3Nocmlua18xc3Q7CisJY2hhciBkd194X3Nocmlua18ybmQ7CisJY2hhciBkd194X3Nocmlua18zcmQ7CisJY2hhciBkd195X3Nocmlua18xc3Q7CisJY2hhciBkd195X3Nocmlua18ybmQ7CisJY2hhciBkd195X3Nocmlua18zcmQ7CisJY2hhciBkd19tZXJnZV84dG8xNjsKKwljaGFyIGR3X21lcmdlXzE2dG8zMjsKKwljaGFyIGR3X2RtYV9ibGtfbW9kZTsKKwljaGFyIGR3X2J3c2F2ZV9tb2RlOworfTsKKy8vI2RlZmluZSBGT1JfTFBERFI0X0VGRklDSUVOQ1kKKworc3RhdGljIHZvaWQgaDI2NF92ZGVjX2R3X2NmZyhzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LCBpbnQgY2FudmFzX3BvcykKK3sKKwl1MzIgZGF0YTMyID0gMCwgc3RyaWRlID0gMDsKKwlzdHJ1Y3QgdmRlY19kd19wYXJhbV9zZXQgKnAgPSBOVUxMOworCXN0cnVjdCB2ZGVjX2R3X3BhcmFtX3NldCBkd19wYXJhbV9zZXRfcG9vbFtdID0geworCQkvKngxLCB4MiwgeDMsIHkxLCB5MiwgeTMsIG04dDYsIG0xNnRvMzIgKi8KKwkJLy97MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMX0sCS8qIDEvMSwgMS8xICovCisJCXsxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxfSwJCS8qIDEvMiwgMS8xICovCisJCXsxLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAxfSwJCS8qIDEvMiwgMS8yICovCisJCS8vezEsIDAsIDAsIDEsIDEsIDAsIDAsIDAsIDAsIDF9LAkvKiAxLzQsIDEvMiAqLworCQl7MiwgMCwgMSwgMSwgMywgMCwgMCwgMSwgMCwgMX0sCQkvKiAxLzQsIDEvNCAqLworCQkvL3sxLCAxLCAxLCAwLCAxLCAxLCAxLCAxLCAwLCAxfSwJLyo+IDEwODBwIDEvOCwgMS80ICovCisJCXsxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAxfSwJCS8qPiAxMDgwcCAxLzgsIDEvOCAqLworCX07CisKKwlpZiAoSVNfVkRFQ19EVyhodykpCisJCXAgPSAmZHdfcGFyYW1fc2V0X3Bvb2xbX19mZnMoSVNfVkRFQ19EVyhodykpXTsKKwllbHNlCisJCXJldHVybjsKKworCVdSSVRFX1ZSRUcoTURFQ19ET1VCTEVXX0NGRzMsCisJCWh3LT5idWZmZXJfc3BlY1tjYW52YXNfcG9zXS52ZGVjX2R3X3lfYWRkcik7IC8vIGx1bWEgc3RhcnQgYWRkcmVzcworCVdSSVRFX1ZSRUcoTURFQ19ET1VCTEVXX0NGRzQsCisJCWh3LT5idWZmZXJfc3BlY1tjYW52YXNfcG9zXS52ZGVjX2R3X3VfYWRkcik7IC8vIGNocm9tYSBzdGFydCBhZGRyZXNzCisKKwlzdHJpZGUgPSBBTElHTl9XSURUSCgoaHctPm1iX3dpZHRoIDw8IDQpIC8gKElTX1ZERUNfRFcoaHcpKSk7CisJaWYgKChJU19WREVDX0RXKGh3KSkgPT0gMSkJLy93aWR0aCAxLzIKKwkJc3RyaWRlID4+PSAxOworCWRhdGEzMiA9IChzdHJpZGUgPDwgMTYpIHwgc3RyaWRlOworCVdSSVRFX1ZSRUcoTURFQ19ET1VCTEVXX0NGRzUsIGRhdGEzMik7IC8vIGNocm9tYSBzdHJpZGUgfCBsdW1hIHN0cmlkZQorCisJZGF0YTMyID0gMDsKKwlwLT5kd19kbWFfYmxrX21vZGUgPSBody0+Y2FudmFzX21vZGU7CisJZGF0YTMyIHw9ICgocC0+ZHdfeF9zaHJpbmtfMXN0IDw8IDAgKSB8ICAgICAvLyAxc3QgZG93bi1zY2FsZSBob3Jpem9udGFsLCAwMDpuby1zY2FsZSAwMToxLzJhdmcgMTA6bGVmdCAxMTpyaWdodAorCQkocC0+ZHdfeV9zaHJpbmtfMXN0IDw8IDIgKSB8ICAgICAvLyAxc3QgZG93bi1zY2FsZSB2ZXJ0aWNhbCwgICAwMDpuby1zY2FsZSAwMToxLzJhdmcgMTA6dXAgICAxMTpkb3duCisJCShwLT5kd194X3Nocmlua18ybmQgPDwgNCApIHwgICAgIC8vIDJuZCBkb3duLXNjYWxlIGhvcml6b250YWwsIDAwOm5vLXNjYWxlIDAxOjEvMmF2ZyAxMDpsZWZ0IDExOnJpZ2h0CisJCShwLT5kd195X3Nocmlua18ybmQgPDwgNiApIHwgICAgIC8vIDJuZCBkb3duLXNjYWxlIHZlcnRpY2FsLCAgIDAwOm5vLXNjYWxlIDAxOjEvMmF2ZyAxMDp1cCAgIDExOmRvd24KKwkJKHAtPmR3X3hfc2hyaW5rXzNyZCA8PCA4ICkgfCAgICAgLy8gM3JkIGRvd24tc2NhbGUgaG9yaXpvbnRhbCwgMDA6bm8tc2NhbGUgMDE6MS8yYXZnIDEwOmxlZnQgMTE6cmlnaHQKKwkJKHAtPmR3X3lfc2hyaW5rXzNyZCA8PCAxMCkgfCAgICAgLy8gM3JkIGRvd24tc2NhbGUgdmVydGljYWwsICAgMDA6bm8tc2NhbGUgMDE6MS8yYXZnIDEwOnVwICAgMTE6ZG93bgorCQkocC0+ZHdfbWVyZ2VfOHRvMTYgPDwgMTIgKSB8ICAgICAvLyAgOC0+MTYgaG9yaXpvbnRhbCBibG9jayBtZXJnZSBmb3IgYmV0dGVyIGRkciBlZmZpY2llbmN5CisJCShwLT5kd19tZXJnZV8xNnRvMzIgPDwgMTMpIHwgICAgIC8vIDE2LT4zMiBob3Jpem9udGFsIGJsb2NrIG1lcmdlIGZvciBiZXR0ZXIgZGRyIGVmZmljaWVuY3kKKwkJKHAtPmR3X2RtYV9ibGtfbW9kZSA8PCAxNCkgfCAgICAgLy8gRE1BIGJsb2NrIG1vZGUsIDA6bGluZWFyIDE6MzJ4MzIgMjo2NHgzMgorI2lmZGVmIEZPUl9MUEREUjRfRUZGSUNJRU5DWQorCQkoMSA8PCAxOSkgfAorI2VuZGlmCisJCShwLT5kd19id3NhdmVfbW9kZSA8PCAyMikpOyAgICAgIC8vIFNhdmUgbGluZSBidWZmZXJzIHRvIHNhdmUgYmFuZCB3aWR0aAorCVdSSVRFX1ZSRUcoTURFQ19ET1VCTEVXX0NGRzEsIGRhdGEzMik7IC8vIGFkZCBzb21lIHNwZWNpYWwgdGVzdHMgaGVyZQorCisJZGF0YTMyID0gMDsKKwlkYXRhMzIgfD0gKDEgPDwgMCkgfCAoMCA8PCAyNyk7CisJV1JJVEVfVlJFRyhNREVDX0RPVUJMRVdfQ0ZHMCwgZGF0YTMyKTsgLy8gRG91YmxlIFdyaXRlIEVuYWJsZSB8IHNvdXJjZSBmcm9tIGRibGsKKworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RFQ19ERVRBSUwsCisJCSJ2ZGVjX2RvdWJsZV93cml0ZSBtb2RlICVkXG4iLAorCQlJU19WREVDX0RXKGh3KSk7CisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCwKKwkJInBhcmFtIHslZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkfVxuIiwKKwkJcC0+ZHdfeF9zaHJpbmtfMXN0LAorCQlwLT5kd195X3Nocmlua18xc3QsCisJCXAtPmR3X3hfc2hyaW5rXzJuZCwKKwkJcC0+ZHdfeV9zaHJpbmtfMm5kLAorCQlwLT5kd194X3Nocmlua18zcmQsCisJCXAtPmR3X3lfc2hyaW5rXzNyZCwKKwkJcC0+ZHdfbWVyZ2VfOHRvMTYsCisJCXAtPmR3X21lcmdlXzE2dG8zMiwKKwkJcC0+ZHdfZG1hX2Jsa19tb2RlKTsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19ERUNfREVUQUlMLAorCQkiY2ZnMCwxLDMsNCw1ID0geyV4LCAleCwgJXgsICV4LCAleH1cbiIsCisJCVJFQURfVlJFRyhNREVDX0RPVUJMRVdfQ0ZHMCksCisJCVJFQURfVlJFRyhNREVDX0RPVUJMRVdfQ0ZHMSksCisJCVJFQURfVlJFRyhNREVDX0RPVUJMRVdfQ0ZHMyksCisJCVJFQURfVlJFRyhNREVDX0RPVUJMRVdfQ0ZHNCksCisJCVJFQURfVlJFRyhNREVDX0RPVUJMRVdfQ0ZHNSkpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGNvbmZpZ19kZWNvZGVfbW9kZShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3KQoreworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaHcpOworI2VuZGlmCisJaWYgKGlucHV0X2ZyYW1lX2Jhc2VkKGh3X3RvX3ZkZWMoaHcpKSkKKwkJV1JJVEVfVlJFRyhIMjY0X0RFQ09ERV9NT0RFLAorCQkJREVDT0RFX01PREVfTVVMVElfRlJBTUVCQVNFKTsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCWVsc2UgaWYgKHZkZWMtPnNsYXZlKQorCQlXUklURV9WUkVHKEgyNjRfREVDT0RFX01PREUsCisJCQkoaHctPmdvdF92YWxpZF9uYWwgPDwgOCkgfAorCQkJREVDT0RFX01PREVfTVVMVElfRFZCQUwpOworCWVsc2UgaWYgKHZkZWMtPm1hc3RlcikKKwkJV1JJVEVfVlJFRyhIMjY0X0RFQ09ERV9NT0RFLAorCQkJKGh3LT5nb3RfdmFsaWRfbmFsIDw8IDgpIHwKKwkJCURFQ09ERV9NT0RFX01VTFRJX0RWRU5MKTsKKyNlbmRpZgorCWVsc2UKKwkJV1JJVEVfVlJFRyhIMjY0X0RFQ09ERV9NT0RFLAorCQkJREVDT0RFX01PREVfTVVMVElfU1RSRUFNQkFTRSk7CisJV1JJVEVfVlJFRyhIMjY0X0RFQ09ERV9TRVFJTkZPLAorCQlody0+c2VxX2luZm8yKTsKKwlXUklURV9WUkVHKEhFQURfUEFESU5HX1JFRywgMCk7CisKKwlpZiAoaHctPmluaXRfZmxhZyA9PSAwKQorCQlXUklURV9WUkVHKElOSVRfRkxBR19SRUcsIDApOworCWVsc2UKKwkJV1JJVEVfVlJFRyhJTklUX0ZMQUdfUkVHLCAxKTsKK30KKworaW50IGNvbmZpZ19kZWNvZGVfYnVmKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcsIHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnBpYykKK3sKKwkvKiBzdGF0aWMgaW50IGNvdW50ID0gMDsgKi8KKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9ICZody0+ZHBiOworCXN0cnVjdCBTbGljZSAqcFNsaWNlID0gJihwX0gyNjRfRHBiLT5tU2xpY2UpOworCXVuc2lnbmVkIGludCBjb2xvY2F0ZV9hZHJfb2Zmc2V0OworCXVuc2lnbmVkIGludCB2YWw7CisJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqbGFzdF9waWMgPSBody0+bGFzdF9kZWNfcGljdHVyZTsKKworI2lmZGVmIE9ORV9DT0xPQ0FURV9CVUZfUEVSX0RFQ09ERV9CVUYKKwlpbnQgY29sb2NhdGVfYnVmX2luZGV4OworI2VuZGlmCisjZGVmaW5lIEgyNjRfQlVGRkVSX0lORk9fSU5ERVggICAgUE1WM19YIC8qIDB4YzI0ICovCisjZGVmaW5lIEgyNjRfQlVGRkVSX0lORk9fREFUQSAgIFBNVjJfWCAgLyogMHhjMjIgKi8KKyNkZWZpbmUgSDI2NF9DVVJSRU5UX1BPQ19JRFhfUkVTRVQgTEFTVF9TTElDRV9NVl9BRERSIC8qIDB4YzMwICovCisjZGVmaW5lIEgyNjRfQ1VSUkVOVF9QT0MgICAgICAgICAgTEFTVF9NVlkgLyogMHhjMzIgc2hhcmVkIHdpdGggY29uY2VhbCBNViAqLworCisjZGVmaW5lIEgyNjRfQ09fTUJfV1JfQUREUiAgICAgICAgVkxEX0MzOCAvKiAweGMzOCAqLworLyogYml0IDMxOjMwIC0tIEwxWzBdIHBpY3R1cmUgY29kaW5nIHN0cnVjdHVyZSwKKyAqCTAwIC0gdG9wIGZpZWxkLAkwMSAtIGJvdHRvbSBmaWVsZCwKKyAqCTEwIC0gZnJhbWUsIDExIC0gbWJhZmYgZnJhbWUKKyAqICAgYml0IDI5IC0gTDFbMF0gdG9wL2JvdCBmb3IgQiBmaWVsZCBwY2l0dXJlICwgMCAtIHRvcCwgMSAtIGJvdAorICogICBiaXQgMjg6MCBoMjY0X2NvX21iX21lbV9yZF9hZGRyWzMxOjNdCisgKgktLSBvbmx5IHVzZWQgZm9yIEIgUGljdHVyZSBEaXJlY3QgbW9kZSBbMjowXSB3aWxsIHNldCB0byAzJ2IwMDAKKyAqLworI2RlZmluZSBIMjY0X0NPX01CX1JEX0FERFIgICAgICAgIFZMRF9DMzkgLyogMHhjMzkgKi8KKworLyogYml0IDE1IC0tIGZsdXNoIGNvX21iX2RhdGEgdG8gRERSIC0tIFctT25seQorICogICBiaXQgMTQgLS0gaDI2NF9jb19tYl9tZW1fd3JfYWRkciB3cml0ZSBFbmFibGUgLS0gVy1Pbmx5CisgKiAgIGJpdCAxMyAtLSBoMjY0X2NvX21iX2luZm9fd3JfcHRyIHdyaXRlIEVuYWJsZSAtLSBXLU9ubHkKKyAqICAgYml0IDkgLS0gc29mdF9yZXNldCAtLSBXLU9ubHkKKyAqICAgYml0IDggLS0gdXBnZW50CisgKiAgIGJpdCA3OjIgLS0gaDI2NF9jb19tYl9tZW1fd3JfYWRkcgorICogICBiaXQgMTowIC0tIGgyNjRfY29fbWJfaW5mb193cl9wdHIKKyAqLworI2RlZmluZSBIMjY0X0NPX01CX1JXX0NUTCAgICAgICAgIFZMRF9DM0QgLyogMHhjM2QgKi8KKyNkZWZpbmUgRENBQ19ERFJfQllURTY0X0NUTCAgICAgICAgICAgICAgICAgICAweDBlMWQKKwl1bnNpZ25lZCBsb25nIGNhbnZhc19hZHI7CisJdW5zaWduZWQgaW50IHJlZl9yZWdfdmFsOworCXVuc2lnbmVkIGludCBvbmVfcmVmX2NmZyA9IDA7CisJaW50IGgyNjRfYnVmZmVyX2luZm9fZGF0YV93cml0ZV9jb3VudDsKKwlpbnQgaSwgajsKKwl1bnNpZ25lZCBpbnQgY29sb2NhdGVfd3JfYWRyOworCXVuc2lnbmVkIGludCBjb2xvY2F0ZV9yZF9hZHI7CisJdW5zaWduZWQgY2hhciB1c2VfZGlyZWN0Xzh4ODsKKwlpbnQgY2FudmFzX3BvczsKKwljYW52YXNfcG9zID0gaHctPmJ1ZmZlcl9zcGVjW3BpYy0+YnVmX3NwZWNfbnVtXS5jYW52YXNfcG9zOworCVdSSVRFX1ZSRUcoSDI2NF9DVVJSRU5UX1BPQ19JRFhfUkVTRVQsIDApOworCVdSSVRFX1ZSRUcoSDI2NF9DVVJSRU5UX1BPQywgcGljLT5mcmFtZV9wb2MpOworCVdSSVRFX1ZSRUcoSDI2NF9DVVJSRU5UX1BPQywgcGljLT50b3BfcG9jKTsKKwlXUklURV9WUkVHKEgyNjRfQ1VSUkVOVF9QT0MsIHBpYy0+Ym90dG9tX3BvYyk7CisKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19ERUNfREVUQUlMLAorCQkiJXM6IHBpY19udW0gaXMgJWQsIHBvYyBpcyAlZCAoJWQsICVkLCAlZCksIGJ1Zl9zcGVjX251bSAlZCBjYW52YXNfcG9zICVkXG4iLAorCQlfX2Z1bmNfXywgcGljLT5waWNfbnVtLCBwaWMtPnBvYywgcGljLT5mcmFtZV9wb2MsCisJCXBpYy0+dG9wX3BvYywgcGljLT5ib3R0b21fcG9jLCBwaWMtPmJ1Zl9zcGVjX251bSwKKwkJY2FudmFzX3Bvcyk7CisJcHJpbnRfcGljX2luZm8oREVDT0RFX0lEKGh3KSwgImN1ciIsIHBpYywgcFNsaWNlLT5zbGljZV90eXBlKTsKKworI2lmZGVmIFZERUNfRFcKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3KSB7CisJCWlmIChJU19WREVDX0RXKGh3KSAmJiBwaWMtPm1iX2FmZl9mcmFtZV9mbGFnKQorCQkJV1JJVEVfVlJFRyhNREVDX0RPVUJMRVdfQ0ZHMCwKKwkJCQkoUkVBRF9WUkVHKE1ERUNfRE9VQkxFV19DRkcwKSAmICh+KDEgPDwgMzApKSkpOworCX0KKyNlbmRpZgorCVdSSVRFX1ZSRUcoQ1VSUl9DQU5WQVNfQ1RSTCwgY2FudmFzX3BvcyA8PCAyNCk7CisJY2FudmFzX2FkciA9IFJFQURfVlJFRyhDVVJSX0NBTlZBU19DVFJMKSAmIDB4ZmZmZmZmOworCisJaWYgKCFody0+bW11X2VuYWJsZSkgeworCQlXUklURV9WUkVHKFJFQ19DQU5WQVNfQUREUiwgY2FudmFzX2Fkcik7CisJCVdSSVRFX1ZSRUcoREJLUl9DQU5WQVNfQUREUiwgY2FudmFzX2Fkcik7CisJCVdSSVRFX1ZSRUcoREJLV19DQU5WQVNfQUREUiwgY2FudmFzX2Fkcik7CisjaWZkZWYgVkRFQ19EVworCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3KSB7CisJCQlXUklURV9WUkVHKE1ERUNfRE9VQkxFV19DRkcxLAorCQkJCShody0+YnVmZmVyX3NwZWNbY2FudmFzX3Bvc10udmRlY19kd195X2NhbnZhc19pbmRleCB8CisJCQkJKGh3LT5idWZmZXJfc3BlY1tjYW52YXNfcG9zXS52ZGVjX2R3X3VfY2FudmFzX2luZGV4IDw8IDgpKSk7CisJCX0gZWxzZSB7CisJCQkJaDI2NF92ZGVjX2R3X2NmZyhodywgY2FudmFzX3Bvcyk7CisJCX0KKyNlbmRpZgorCX0gZWxzZQorCQloZXZjX3Nhb19zZXRfcGljX2J1ZmZlcihodywgcGljKTsKKworCWlmIChwaWMtPm1iX2FmZl9mcmFtZV9mbGFnKQorCQlody0+YnVmZmVyX3NwZWNbcGljLT5idWZfc3BlY19udW1dLmluZm8wID0gMHhmNGMwOworCWVsc2UgaWYgKHBpYy0+c3RydWN0dXJlID09IFRPUF9GSUVMRCkKKwkJaHctPmJ1ZmZlcl9zcGVjW3BpYy0+YnVmX3NwZWNfbnVtXS5pbmZvMCA9IDB4ZjQwMDsKKwllbHNlIGlmIChwaWMtPnN0cnVjdHVyZSA9PSBCT1RUT01fRklFTEQpCisJCWh3LT5idWZmZXJfc3BlY1twaWMtPmJ1Zl9zcGVjX251bV0uaW5mbzAgPSAweGY0NDA7CisJZWxzZQorCQlody0+YnVmZmVyX3NwZWNbcGljLT5idWZfc3BlY19udW1dLmluZm8wID0gMHhmNDgwOworCisJaWYgKHBpYy0+Ym90dG9tX3BvYyA8IHBpYy0+dG9wX3BvYykKKwkJaHctPmJ1ZmZlcl9zcGVjW3BpYy0+YnVmX3NwZWNfbnVtXS5pbmZvMCB8PSAweDEwMDsKKworCWh3LT5idWZmZXJfc3BlY1twaWMtPmJ1Zl9zcGVjX251bV0uaW5mbzEgPSBwaWMtPnRvcF9wb2M7CisJaHctPmJ1ZmZlcl9zcGVjW3BpYy0+YnVmX3NwZWNfbnVtXS5pbmZvMiA9IHBpYy0+Ym90dG9tX3BvYzsKKwlXUklURV9WUkVHKEgyNjRfQlVGRkVSX0lORk9fSU5ERVgsIDE2KTsKKworCWZvciAoaiA9IDA7IGogPCBody0+ZHBiLm1EUEIuc2l6ZTsgaisrKSB7CisJCWludCBsb25nX3Rlcm1fZmxhZzsKKwkJaSA9IGdldF9idWZfc3BlY19ieV9jYW52YXNfcG9zKGh3LCBqKTsKKwkJaWYgKGkgPCAwKQorCQkJYnJlYWs7CisJCWxvbmdfdGVybV9mbGFnID0KKwkJCWdldF9sb25nX3Rlcm1fZmxhZ19ieV9idWZfc3BlY19udW0ocF9IMjY0X0RwYiwgaSk7CisJCWlmIChsb25nX3Rlcm1fZmxhZyA+IDApIHsKKwkJCWlmIChsb25nX3Rlcm1fZmxhZyAmIDB4MSkKKwkJCQlody0+YnVmZmVyX3NwZWNbaV0uaW5mbzAgfD0gKDEgPDwgNCk7CisJCQllbHNlCisJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLmluZm8wICY9IH4oMSA8PCA0KTsKKworCQkJaWYgKGxvbmdfdGVybV9mbGFnICYgMHgyKQorCQkJCWh3LT5idWZmZXJfc3BlY1tpXS5pbmZvMCB8PSAoMSA8PCA1KTsKKwkJCWVsc2UKKwkJCQlody0+YnVmZmVyX3NwZWNbaV0uaW5mbzAgJj0gfigxIDw8IDUpOworCQl9CisKKwkJaWYgKGkgPT0gcGljLT5idWZfc3BlY19udW0pCisJCQlXUklURV9WUkVHKEgyNjRfQlVGRkVSX0lORk9fREFUQSwKKwkJCQlody0+YnVmZmVyX3NwZWNbaV0uaW5mbzAgfCAweGYpOworCQllbHNlCisJCQlXUklURV9WUkVHKEgyNjRfQlVGRkVSX0lORk9fREFUQSwKKwkJCQlody0+YnVmZmVyX3NwZWNbaV0uaW5mbzApOworCQlXUklURV9WUkVHKEgyNjRfQlVGRkVSX0lORk9fREFUQSwgaHctPmJ1ZmZlcl9zcGVjW2ldLmluZm8xKTsKKwkJV1JJVEVfVlJFRyhIMjY0X0JVRkZFUl9JTkZPX0RBVEEsIGh3LT5idWZmZXJfc3BlY1tpXS5pbmZvMik7CisJfQorCisJLyogY29uZmlnIHJlZmVyZW5jZSBidWZmZXIgKi8KKwlpZiAoaHctPm1tdV9lbmFibGUpIHsKKwkJaGV2Y19tY3JfY29uZmlnX21jX3JlZihodyk7CisJCWhldmNfbWNyX2NvbmZpZ19tY3JjYyhodyk7CisJfQorCisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCwKKwkJImxpc3QwIHNpemUgJWRcbiIsIHBTbGljZS0+bGlzdFhzaXplWzBdKTsKKwlXUklURV9WUkVHKEgyNjRfQlVGRkVSX0lORk9fSU5ERVgsIDApOworCXJlZl9yZWdfdmFsID0gMDsKKwlqID0gMDsKKwloMjY0X2J1ZmZlcl9pbmZvX2RhdGFfd3JpdGVfY291bnQgPSAwOworCisJLy9kaXNhYmxlIHRoaXMgcmVhZCBjYWNoZSB3aGVuIGZyYW1lIHdpZHRoIDw9IDY0ICg0TUJzKQorCS8vSVFJRENUX0NPTlRST0wsIGJpdFsxNl0gZGNhY19kbWFfcmVhZF9jYWNoZV9kaXNhYmxlCisJaWYgKGh3LT5mcmFtZV93aWR0aCA8PSA2NCkgeworCQlTRVRfVlJFR19NQVNLKElRSURDVF9DT05UUk9MLCgxIDw8IDE2KSk7CisJCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKSkKKwkJCS8vIERpc2FibGUgRERSX0JZVEU2NF9DQUNIRQorCQkJV1JJVEVfVlJFRyhEQ0FDX0REUl9CWVRFNjRfQ1RMLAorCQkJKFJFQURfVlJFRyhEQ0FDX0REUl9CWVRFNjRfQ1RMKSAmICh+MHhmKSkgfCAweGEpOworCX0KKwllbHNlCisJCUNMRUFSX1ZSRUdfTUFTSyhJUUlEQ1RfQ09OVFJPTCwoMSA8PCAxNikpOworCisJaWYgKGxhc3RfcGljKQorCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19FUlJPUkZMQUdfREJHLAorCQkJCSJsYXN0X3BpYy0+ZGF0YV9mbGFnICV4ICAgc2xpY2VfdHlwZSAleCBsYXN0X3BpYy0+c2xpY2VfdHlwZSAleFxuIiwKKwkJCQlsYXN0X3BpYy0+ZGF0YV9mbGFnLCBwU2xpY2UtPnNsaWNlX3R5cGUsIGxhc3RfcGljLT5zbGljZV90eXBlKTsKKwlpZiAoIWh3LT5pX29ubHkgJiYgIShlcnJvcl9wcm9jX3BvbGljeSAmIDB4MjAwMCkgJiYKKwkJbGFzdF9waWMgJiYgKGxhc3RfcGljLT5kYXRhX2ZsYWcgJiBFUlJPUl9GTEFHKQorCQkmJiAoIShsYXN0X3BpYy0+c2xpY2VfdHlwZSA9PSBCX1NMSUNFKSkKKwkJJiYgKCEocFNsaWNlLT5zbGljZV90eXBlID09IElfU0xJQ0UpKSkgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19FUlJPUkZMQUdfREJHLAorCQkJCSAgIm5vIGkvaWRyIGVycm9yIG1hcmtcbiIpOworCQlody0+ZGF0YV9mbGFnIHw9IEVSUk9SX0ZMQUc7CisJCXBpYy0+ZGF0YV9mbGFnIHw9IEVSUk9SX0ZMQUc7CisJfQorCisJZm9yIChpID0gMDsgaSA8ICh1bnNpZ25lZCBpbnQpKHBTbGljZS0+bGlzdFhzaXplWzBdKTsgaSsrKSB7CisJCS8qcmVmIGxpc3QgMCAqLworCQlzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpyZWYgPSBwU2xpY2UtPmxpc3RYWzBdW2ldOworCQl1bnNpZ25lZCBpbnQgY2ZnOworCQkvKiBiaXRbNjo1XSAtIGZyYW1lL2ZpZWxkIGluZm8sCisJCSAqIDAxIC0gdG9wLCAxMCAtIGJvdHRvbSwgMTEgLSBmcmFtZQorCQkgKi8KKwkjaWZkZWYgRVJST1JfQ0hFQ0sKKwkJaWYgKHJlZiA9PSBOVUxMKSB7CisJCQlody0+ZGF0YV9mbGFnIHw9IEVSUk9SX0ZMQUc7CisJCQlwaWMtPmRhdGFfZmxhZyAgfD0gRVJST1JfRkxBRzsKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0VSUk9SRkxBR19EQkcsICIgcmVmIGxpc3QwIE5VTExcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmICgocmVmLT5kYXRhX2ZsYWcgJiBFUlJPUl9GTEFHKSAmJiByZWZfZnJhbWVfbWFya19mbGFnW0RFQ09ERV9JRChodyldKSB7CisJCQlody0+ZGF0YV9mbGFnIHw9IEVSUk9SX0ZMQUc7CisJCQlwaWMtPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRVJST1JGTEFHX0RCRywgIiByZWYgZXJyb3IgbWFyazEgXG4iKTsKKwkJfQorCisJCWlmIChlcnJvcl9wcm9jX3BvbGljeSAmIDB4ODAwMDApIHsKKwkJCWlmIChyZWZfYl9mcmFtZV9lcnJvcl9tYXhfY291bnQgJiYKKwkJCQlyZWYtPnNsaWNlX3R5cGUgPT0gQl9TTElDRSkgeworCQkJCWlmIChyZWYtPmRhdGFfZmxhZyAmIEVSUk9SX0ZMQUcpCisJCQkJCWh3LT5iX2ZyYW1lX2Vycm9yX2NvdW50Kys7CisJCQkJZWxzZQorCQkJCQlody0+Yl9mcmFtZV9lcnJvcl9jb3VudCA9IDA7CisJCQkJaWYgKGh3LT5iX2ZyYW1lX2Vycm9yX2NvdW50ID4gcmVmX2JfZnJhbWVfZXJyb3JfbWF4X2NvdW50KSB7CisJCQkJCWh3LT5iX2ZyYW1lX2Vycm9yX2NvdW50ID0gMDsKKwkJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkJCQkiZXJyb3IgJWQgQiBmcmFtZSwgcmVzZXQgZHBiIGJ1ZmZlclxuIiwKKwkJCQkJCXJlZl9iX2ZyYW1lX2Vycm9yX21heF9jb3VudCk7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAocmVmLT5kYXRhX2ZsYWcgJiBOVUxMX0ZMQUcpCisJCQlody0+ZGF0YV9mbGFnIHw9IE5VTExfRkxBRzsKKyNlbmRpZgorCQljYW52YXNfcG9zID0gaHctPmJ1ZmZlcl9zcGVjW3JlZi0+YnVmX3NwZWNfbnVtXS5jYW52YXNfcG9zOworCisJCWlmIChyZWYtPnN0cnVjdHVyZSA9PSBUT1BfRklFTEQpCisJCQljZmcgPSAweDE7CisJCWVsc2UgaWYgKHJlZi0+c3RydWN0dXJlID09IEJPVFRPTV9GSUVMRCkKKwkJCWNmZyA9IDB4MjsKKwkJZWxzZSAvKiBGUkFNRSAqLworCQkJY2ZnID0gMHgzOworCisJCW9uZV9yZWZfY2ZnID0gKGNhbnZhc19wb3MgJiAweDFmKSB8IChjZmcgPDwgNSk7CisJCXJlZl9yZWdfdmFsIDw8PSA4OworCQlyZWZfcmVnX3ZhbCB8PSBvbmVfcmVmX2NmZzsKKwkJaisrOworCisJCWlmIChqID09IDQpIHsKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RFQ19ERVRBSUwsCisJCQkJIkgyNjRfQlVGRkVSX0lORk9fREFUQTogJXhcbiIsIHJlZl9yZWdfdmFsKTsKKwkJCVdSSVRFX1ZSRUcoSDI2NF9CVUZGRVJfSU5GT19EQVRBLCByZWZfcmVnX3ZhbCk7CisJCQloMjY0X2J1ZmZlcl9pbmZvX2RhdGFfd3JpdGVfY291bnQrKzsKKwkJCWogPSAwOworCQl9CisJCXByaW50X3BpY19pbmZvKERFQ09ERV9JRChodyksICJsaXN0MCIsCisJCQlwU2xpY2UtPmxpc3RYWzBdW2ldLCAtMSk7CisJfQorCWlmIChqICE9IDApIHsKKwkJd2hpbGUgKGogIT0gNCkgeworCQkJcmVmX3JlZ192YWwgPDw9IDg7CisJCQlyZWZfcmVnX3ZhbCB8PSBvbmVfcmVmX2NmZzsKKwkJCWorKzsKKwkJfQorCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19ERUNfREVUQUlMLAorCQkJIkgyNjRfQlVGRkVSX0lORk9fREFUQTogJXhcbiIsCisJCQkJCXJlZl9yZWdfdmFsKTsKKwkJV1JJVEVfVlJFRyhIMjY0X0JVRkZFUl9JTkZPX0RBVEEsIHJlZl9yZWdfdmFsKTsKKwkJaDI2NF9idWZmZXJfaW5mb19kYXRhX3dyaXRlX2NvdW50Kys7CisJfQorCXJlZl9yZWdfdmFsID0gKG9uZV9yZWZfY2ZnIDw8IDI0KSB8IChvbmVfcmVmX2NmZzw8MTYpIHwKKwkJCQkob25lX3JlZl9jZmcgPDwgOCkgfCBvbmVfcmVmX2NmZzsKKwlmb3IgKGkgPSBoMjY0X2J1ZmZlcl9pbmZvX2RhdGFfd3JpdGVfY291bnQ7IGkgPCA4OyBpKyspCisJCVdSSVRFX1ZSRUcoSDI2NF9CVUZGRVJfSU5GT19EQVRBLCByZWZfcmVnX3ZhbCk7CisKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19ERUNfREVUQUlMLAorCQkibGlzdDEgc2l6ZSAlZFxuIiwgcFNsaWNlLT5saXN0WHNpemVbMV0pOworCVdSSVRFX1ZSRUcoSDI2NF9CVUZGRVJfSU5GT19JTkRFWCwgOCk7CisJcmVmX3JlZ192YWwgPSAwOworCWogPSAwOworCisJZm9yIChpID0gMDsgaSA8ICh1bnNpZ25lZCBpbnQpKHBTbGljZS0+bGlzdFhzaXplWzFdKTsgaSsrKSB7CisJCS8qIHJlZiBsaXN0IDAgKi8KKwkJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqcmVmID0gcFNsaWNlLT5saXN0WFsxXVtpXTsKKwkJdW5zaWduZWQgaW50IGNmZzsKKwkJLyogYml0WzY6NV0gLSBmcmFtZS9maWVsZCBpbmZvLAorCQkgKiAwMSAtIHRvcCwgMTAgLSBib3R0b20sIDExIC0gZnJhbWUKKwkJICovCisKKwkjaWZkZWYgRVJST1JfQ0hFQ0sKKwkJaWYgKHJlZiA9PSBOVUxMKSB7CisJCQlody0+ZGF0YV9mbGFnIHw9IEVSUk9SX0ZMQUc7CisJCQlwaWMtPmRhdGFfZmxhZyAgfD0gRVJST1JfRkxBRzsKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0VSUk9SRkxBR19EQkcsICIgcmVmIGVycm9yIGxpc3QxIE5VTExcbiIpOworCQkJcmV0dXJuIC0yOworCQl9CisJCWlmICgocmVmLT5kYXRhX2ZsYWcgJiBFUlJPUl9GTEFHKSAmJiAocmVmX2ZyYW1lX21hcmtfZmxhZ1tERUNPREVfSUQoaHcpXSkpIHsKKwkJCXBpYy0+ZGF0YV9mbGFnICB8PSBFUlJPUl9GTEFHOworCQkJaHctPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRVJST1JGTEFHX0RCRywgIiByZWYgZXJyb3IgbWFyazJcbiIpOworCQl9CisJCWlmIChyZWYtPmRhdGFfZmxhZyAmIE5VTExfRkxBRykKKwkJCWh3LT5kYXRhX2ZsYWcgfD0gTlVMTF9GTEFHOworI2VuZGlmCisJCWNhbnZhc19wb3MgPSBody0+YnVmZmVyX3NwZWNbcmVmLT5idWZfc3BlY19udW1dLmNhbnZhc19wb3M7CisJCWlmIChyZWYtPnN0cnVjdHVyZSA9PSBUT1BfRklFTEQpCisJCQljZmcgPSAweDE7CisJCWVsc2UgaWYgKHJlZi0+c3RydWN0dXJlID09IEJPVFRPTV9GSUVMRCkKKwkJCWNmZyA9IDB4MjsKKwkJZWxzZSAvKiBGUkFNRSAqLworCQkJY2ZnID0gMHgzOworCQlvbmVfcmVmX2NmZyA9IChjYW52YXNfcG9zICYgMHgxZikgfCAoY2ZnIDw8IDUpOworCQlyZWZfcmVnX3ZhbCA8PD0gODsKKwkJcmVmX3JlZ192YWwgfD0gb25lX3JlZl9jZmc7CisJCWorKzsKKworCQlpZiAoaiA9PSA0KSB7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19ERUNfREVUQUlMLAorCQkJCSJIMjY0X0JVRkZFUl9JTkZPX0RBVEE6ICV4XG4iLAorCQkJCXJlZl9yZWdfdmFsKTsKKwkJCVdSSVRFX1ZSRUcoSDI2NF9CVUZGRVJfSU5GT19EQVRBLCByZWZfcmVnX3ZhbCk7CisJCQlqID0gMDsKKwkJfQorCQlwcmludF9waWNfaW5mbyhERUNPREVfSUQoaHcpLCAibGlzdDEiLAorCQkJcFNsaWNlLT5saXN0WFsxXVtpXSwgLTEpOworCX0KKwlpZiAoaiAhPSAwKSB7CisJCXdoaWxlIChqICE9IDQpIHsKKwkJCXJlZl9yZWdfdmFsIDw8PSA4OworCQkJcmVmX3JlZ192YWwgfD0gb25lX3JlZl9jZmc7CisJCQlqKys7CisJCX0KKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCwKKwkJIkgyNjRfQlVGRkVSX0lORk9fREFUQTogJXhcbiIsIHJlZl9yZWdfdmFsKTsKKwkJV1JJVEVfVlJFRyhIMjY0X0JVRkZFUl9JTkZPX0RBVEEsIHJlZl9yZWdfdmFsKTsKKwl9CisKKwkvKiBjb25maWd1cmUgY28tbG9jYXRlIGJ1ZmZlciAqLworCXdoaWxlICgoUkVBRF9WUkVHKEgyNjRfQ09fTUJfUldfQ1RMKSA+PiAxMSkgJiAweDEpCisJCTsKKwlpZiAoKHBTbGljZS0+bW9kZV84eDhfZmxhZ3MgJiAweDQpICYmCisJCShwU2xpY2UtPm1vZGVfOHg4X2ZsYWdzICYgMHgyKSkKKwkJdXNlX2RpcmVjdF84eDggPSAxOworCWVsc2UKKwkJdXNlX2RpcmVjdF84eDggPSAwOworCisjaWZuZGVmIE9ORV9DT0xPQ0FURV9CVUZfUEVSX0RFQ09ERV9CVUYKKwljb2xvY2F0ZV9hZHJfb2Zmc2V0ID0KKwkJKChwaWMtPnN0cnVjdHVyZSA9PSBGUkFNRSAmJiBwaWMtPm1iX2FmZl9mcmFtZV9mbGFnID09IDApCisJCSA/IDEgOiAyKSAqIDk2OworCWlmICh1c2VfZGlyZWN0Xzh4OCkKKwkJY29sb2NhdGVfYWRyX29mZnNldCA+Pj0gMjsKKworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RFQ19ERVRBSUwsCisJCSJjb2xvY2F0ZSBidWYgc2l6ZSBvZiBlYWNoIG1iIDB4JXggZmlyc3RfbWJfaW5fc2xpY2UgMHgleCBjb2xvY2F0ZV9hZHJfb2Zmc2V0IDB4JXhcclxuIiwKKwkJY29sb2NhdGVfYWRyX29mZnNldCwgcFNsaWNlLT5maXJzdF9tYl9pbl9zbGljZSwKKwkJY29sb2NhdGVfYWRyX29mZnNldCAqIHBTbGljZS0+Zmlyc3RfbWJfaW5fc2xpY2UpOworCisJY29sb2NhdGVfYWRyX29mZnNldCAqPSBwU2xpY2UtPmZpcnN0X21iX2luX3NsaWNlOworCisJaWYgKChwaWMtPmNvbG9jYXRlZF9idWZfaW5kZXggPj0gMCkgJiYKKwkJKHBpYy0+Y29sb2NhdGVkX2J1Zl9pbmRleCA8IHBfSDI2NF9EcGItPmNvbG9jYXRlZF9idWZfY291bnQpKSB7CisJCWNvbG9jYXRlX3dyX2FkciA9IHBfSDI2NF9EcGItPmNvbG9jYXRlZF9tdl9hZGRyX3N0YXJ0ICsKKwkJCSgocF9IMjY0X0RwYi0+Y29sb2NhdGVkX2J1Zl9zaXplICoKKwkJCXBpYy0+Y29sb2NhdGVkX2J1Zl9pbmRleCkKKwkJCT4+ICh1c2VfZGlyZWN0Xzh4OCA/IDIgOiAwKSk7CisJCWlmICgoY29sb2NhdGVfd3JfYWRyICsgcF9IMjY0X0RwYi0+Y29sb2NhdGVkX2J1Zl9zaXplKSA+CisJCQlwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfbXZfYWRkcl9lbmQpIHsKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0VSUk9SLAorCQkJCSJFcnJvciwgY29sb2NhdGUgYnVmIGlzIG5vdCBlbm91Z2gsIGluZGV4IGlzICVkXG4iLAorCQkJcGljLT5jb2xvY2F0ZWRfYnVmX2luZGV4KTsKKwkJCXJldCA9IC0zOworCQl9CisJCXZhbCA9IGNvbG9jYXRlX3dyX2FkciArIGNvbG9jYXRlX2Fkcl9vZmZzZXQ7CisJCVdSSVRFX1ZSRUcoSDI2NF9DT19NQl9XUl9BRERSLCB2YWwpOworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19ERUNfREVUQUlMLAorCQkJIldSSVRFX1ZSRUcoSDI2NF9DT19NQl9XUl9BRERSKSA9ICV4LCBmaXJzdF9tYl9pbl9zbGljZSAleCBwaWNfc3RydWN0dXJlICV4ICBjb2xvY2F0ZV9hZHJfb2Zmc2V0ICV4IG1vZGVfOHg4X2ZsYWdzICV4IGNvbG9jYXRlZF9idWZfc2l6ZSAleFxuIiwKKwkJCXZhbCwgcFNsaWNlLT5maXJzdF9tYl9pbl9zbGljZSwgcGljLT5zdHJ1Y3R1cmUsCisJCQljb2xvY2F0ZV9hZHJfb2Zmc2V0LCBwU2xpY2UtPm1vZGVfOHg4X2ZsYWdzLAorCQkJcF9IMjY0X0RwYi0+Y29sb2NhdGVkX2J1Zl9zaXplKTsKKwl9IGVsc2UgeworCQlXUklURV9WUkVHKEgyNjRfQ09fTUJfV1JfQUREUiwgMHhmZmZmZmZmZik7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RFQ19ERVRBSUwsCisJCQkiV1JJVEVfVlJFRyhIMjY0X0NPX01CX1dSX0FERFIpID0gMHhmZmZmZmZmZlxuIik7CisJfQorI2Vsc2UKKwljb2xvY2F0ZV9idWZfaW5kZXggPSBody0+YnVmZmVyX3NwZWNbcGljLT5idWZfc3BlY19udW1dLmNhbnZhc19wb3M7CisJY29sb2NhdGVfYWRyX29mZnNldCA9CisJKChwaWMtPnN0cnVjdHVyZSA9PSBGUkFNRSAmJiBwaWMtPm1iX2FmZl9mcmFtZV9mbGFnID09IDApID8gMSA6IDIpICogOTY7CisJaWYgKHVzZV9kaXJlY3RfOHg4KQorCQljb2xvY2F0ZV9hZHJfb2Zmc2V0ID4+PSAyOworCisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCwKKwkJImNvbG9jYXRlIGJ1ZiBzaXplIG9mIGVhY2ggbWIgMHgleCBmaXJzdF9tYl9pbl9zbGljZSAweCV4IGNvbG9jYXRlX2Fkcl9vZmZzZXQgMHgleFxyXG4iLAorCQljb2xvY2F0ZV9hZHJfb2Zmc2V0LCBwU2xpY2UtPmZpcnN0X21iX2luX3NsaWNlLAorCQljb2xvY2F0ZV9hZHJfb2Zmc2V0ICogcFNsaWNlLT5maXJzdF9tYl9pbl9zbGljZSk7CisKKwljb2xvY2F0ZV9hZHJfb2Zmc2V0ICo9IHBTbGljZS0+Zmlyc3RfbWJfaW5fc2xpY2U7CisKKwljb2xvY2F0ZV93cl9hZHIgPSBwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfbXZfYWRkcl9zdGFydCArCisJCSgocF9IMjY0X0RwYi0+Y29sb2NhdGVkX2J1Zl9zaXplICogY29sb2NhdGVfYnVmX2luZGV4KSA+PgorCQkJKHVzZV9kaXJlY3RfOHg4ID8gMiA6IDApKTsKKworCWlmICgoY29sb2NhdGVfd3JfYWRyICsgcF9IMjY0X0RwYi0+Y29sb2NhdGVkX2J1Zl9zaXplKSA+CisJCXBfSDI2NF9EcGItPmNvbG9jYXRlZF9tdl9hZGRyX2VuZCkgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19FUlJPUiwKKwkJIkVycm9yLCBjb2xvY2F0ZSBidWYgaXMgbm90IGVub3VnaCwgY29sIGJ1ZiBpbmRleCBpcyAlZFxuIiwKKwkJCQljb2xvY2F0ZV9idWZfaW5kZXgpOworCQlyZXQgPSAtNDsKKwl9CisJdmFsID0gY29sb2NhdGVfd3JfYWRyICsgY29sb2NhdGVfYWRyX29mZnNldDsKKwlXUklURV9WUkVHKEgyNjRfQ09fTUJfV1JfQUREUiwgdmFsKTsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19ERUNfREVUQUlMLAorCQkiV1JJVEVfVlJFRyhIMjY0X0NPX01CX1dSX0FERFIpID0gJXgsIGZpcnN0X21iX2luX3NsaWNlICV4IHBpY19zdHJ1Y3R1cmUgJXggY29sb2NhdGVfYWRyX29mZnNldCAleCBtb2RlXzh4OF9mbGFncyAleCBjb2xvY2F0ZWRfYnVmX3NpemUgJXhcbiIsCisJCXZhbCwgcFNsaWNlLT5maXJzdF9tYl9pbl9zbGljZSwgcGljLT5zdHJ1Y3R1cmUsCisJCWNvbG9jYXRlX2Fkcl9vZmZzZXQsIHBTbGljZS0+bW9kZV84eDhfZmxhZ3MsCisJCXBfSDI2NF9EcGItPmNvbG9jYXRlZF9idWZfc2l6ZSk7CisjZW5kaWYKKwlpZiAocFNsaWNlLT5saXN0WHNpemVbMV0gPiAwKSB7CisJCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKmNvbG9jYXRlX3BpYyA9IHBTbGljZS0+bGlzdFhbMV1bMF07CisJCS8qIEgyNjRfQ09fTUJfUkRfQUREUltiaXQgMzE6MzBdLAorCQkgKiBvcmlnaW5hbCBwaWN0dXJlIHN0cnVjdHVyZSBvZiBMMVswXSwKKwkJICogMDAgLSB0b3AgZmllbGQsIDAxIC0gYm90dG9tIGZpZWxkLAorCQkgKiAxMCAtIGZyYW1lLCAxMSAtIG1iYWZmIGZyYW1lCisJCSAqLworCQlpbnQgbDEwX3N0cnVjdHVyZSwgY3VyX3N0cnVjdHVyZTsKKwkJaW50IGN1cl9jb2xvY2F0ZV9yZWZfdHlwZTsKKwkJLyogSDI2NF9DT19NQl9SRF9BRERSW2JpdCAyOV0sIHRvcC9ib3QgZm9yIEIgZmllbGQgcGNpdHVyZSwKKwkJICogMCAtIHRvcCwgMSAtIGJvdAorCQkgKi8KKwkJdW5zaWduZWQgaW50IHZhbDsKKwkJdW5zaWduZWQgaW50IGNvbG9jYXRlX3JkX2Fkcl9vZmZzZXQ7CisJCXVuc2lnbmVkIGludCBtYnlfbWJ4OworCQl1bnNpZ25lZCBpbnQgbWJ5LCBtYng7CisKKyNpZmRlZiBFUlJPUl9DSEVDSworCQlpZiAoY29sb2NhdGVfcGljID09IE5VTEwpIHsKKwkJCWh3LT5kYXRhX2ZsYWcgfD0gRVJST1JfRkxBRzsKKwkJCXBpYy0+ZGF0YV9mbGFnIHw9IEVSUk9SX0ZMQUc7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19FUlJPUkZMQUdfREJHLCAiIGNvbG9jYXRlIGVycm9yIHBpYyBOVUxMXG4iKTsKKwkJCXJldHVybiAtNTsKKwkJfQorCQlpZiAoY29sb2NhdGVfcGljLT5kYXRhX2ZsYWcgJiBFUlJPUl9GTEFHKSB7CisJCQlwaWMtPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOworCQkJaHctPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRVJST1JGTEFHX0RCRywgIiBjb2xvY2FyZSByZWYgZXJyb3IgbWFya1xuIik7CisJCQl9CisJCWlmIChjb2xvY2F0ZV9waWMtPmRhdGFfZmxhZyAmIE5VTExfRkxBRykKKwkJCWh3LT5kYXRhX2ZsYWcgfD0gTlVMTF9GTEFHOworI2VuZGlmCisKKwkJaWYgKGNvbG9jYXRlX3BpYy0+bWJfYWZmX2ZyYW1lX2ZsYWcpCisJCQlsMTBfc3RydWN0dXJlID0gMzsKKwkJZWxzZSB7CisJCQlpZiAoY29sb2NhdGVfcGljLT5jb2RlZF9mcmFtZSkKKwkJCQlsMTBfc3RydWN0dXJlID0gMjsKKwkJCWVsc2UKKwkJCQlsMTBfc3RydWN0dXJlID0JKGNvbG9jYXRlX3BpYy0+c3RydWN0dXJlID09CisJCQkJCUJPVFRPTV9GSUVMRCkgPwkxIDogMDsKKwkJfQorCisJCS8vQUxMRUdST19GSVgsIHBvcnRlZCBmcm9tIHNpbmdsZSBtb2RlIHVjb2RlCisJCW1ieV9tYnggPSBSRUFEX1ZSRUcoTUJZX01CWCk7CisJCW1ieSA9IHBTbGljZS0+Zmlyc3RfbWJfaW5fc2xpY2UgLyBody0+bWJfd2lkdGg7CisJCW1ieCA9IHBTbGljZS0+Zmlyc3RfbWJfaW5fc2xpY2UgJSBody0+bWJfd2lkdGg7CisJCWlmIChwaWMtPm1iX2FmZl9mcmFtZV9mbGFnKQorCQkJY3VyX3N0cnVjdHVyZSA9IDM7CisJCWVsc2UgeworCQkJaWYgKHBpYy0+Y29kZWRfZnJhbWUpCisJCQkJY3VyX3N0cnVjdHVyZSA9IDI7CisJCQllbHNlCisJCQkJY3VyX3N0cnVjdHVyZSA9CShwaWMtPnN0cnVjdHVyZSA9PQorCQkJCQlCT1RUT01fRklFTEQpID8JMSA6IDA7CisJCX0KKwkJaWYgKGN1cl9zdHJ1Y3R1cmUgPCAyKSB7CisJCQkvL2N1cnJlbnRfZmllbGRfc3RydWN0dXJlCisJCQlpZiAobDEwX3N0cnVjdHVyZSAhPSAyKSB7CisJCQkJY29sb2NhdGVfcmRfYWRyX29mZnNldCA9IHBTbGljZS0+Zmlyc3RfbWJfaW5fc2xpY2UgKiAyOworCQkJfSBlbHNlIHsKKwkJCQkvLyBmaWVsZF9yZWZfZnJvbV9mcmFtZSBjb19tdl9yZF9hZGRyIDoKKwkJCQkvLyBtYnkqMiptYl93aWR0aCArIG1ieAorCQkJCWNvbG9jYXRlX3JkX2Fkcl9vZmZzZXQgPSBtYnkgKiAyICogaHctPm1iX3dpZHRoICsgbWJ4OworCQkJfQorCisJCX0gZWxzZSB7CisJCQkvL2N1cnJlbnRfZnJhbWVfc3RydWN0dXJlCisJCQlpZiAobDEwX3N0cnVjdHVyZSA8IDIpIHsKKwkJCQkvL2NhbGN1bGF0ZV9jb19tdl9vZmZzZXRfZnJhbWVfcmVmX2ZpZWxkOgorCQkJCS8vIGZyYW1lX3JlZl9mcm9tX2ZpZWxkIGNvX212X3JkX2FkZHIgOgorCQkJCS8vIChtYnkvMiptYl93aWR0aCttYngpKjIKKwkJCQljb2xvY2F0ZV9yZF9hZHJfb2Zmc2V0ID0gKChtYnkgLyAyKSAqIGh3LT5tYl93aWR0aCArIG1ieCkgKiAyOworCQkJfSBlbHNlIGlmIChjdXJfc3RydWN0dXJlID09IDIpIHsKKwkJCQljb2xvY2F0ZV9yZF9hZHJfb2Zmc2V0ID0gcFNsaWNlLT5maXJzdF9tYl9pbl9zbGljZTsKKwkJCX0gZWxzZSB7CisJCQkJLy9tYmFmZiBmcmFtZSBjYXNlMTE5NgorCQkJCWNvbG9jYXRlX3JkX2Fkcl9vZmZzZXQgPSBwU2xpY2UtPmZpcnN0X21iX2luX3NsaWNlICogMjsKKwkJCX0KKworCQl9CisKKwkJY29sb2NhdGVfcmRfYWRyX29mZnNldCAqPSA5NjsKKwkJaWYgKHVzZV9kaXJlY3RfOHg4KQorCQkJY29sb2NhdGVfcmRfYWRyX29mZnNldCA+Pj0gMjsKKworCQlpZiAoY29sb2NhdGVfb2xkX2NhbCkKKwkJCWNvbG9jYXRlX3JkX2Fkcl9vZmZzZXQgPSBjb2xvY2F0ZV9hZHJfb2Zmc2V0OworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19ERUNfREVUQUlMLAorCQkJImZpcnN0X21iX2luX3NsaWNlIDB4JXggMHgleCAweCV4IChNQllfTUJYIHJlZyAweCV4KSB1c2VfZGlyZWN0Xzh4OCAlZCBjdXIgJWQgKG1iX2FmZl9mcmFtZV9mbGFnICVkLCBjb2RlZF9mcmFtZSAlZCBzdHJ1Y3R1cmUgJWQpIGNvbCAlZCAobWJfYWZmX2ZyYW1lX2ZsYWcgJWQsIGNvZGVkX2ZyYW1lICVkIHN0cnVjdHVyZSAlZCkgb2Zmc2V0IDB4JXggcmRvZmZzZXQgMHgleFxuIiwKKwkJCQlwU2xpY2UtPmZpcnN0X21iX2luX3NsaWNlLCBtYnksIG1ieCwgbWJ5X21ieCwgdXNlX2RpcmVjdF84eDgsCisJCQkJY3VyX3N0cnVjdHVyZSwgcGljLT5tYl9hZmZfZnJhbWVfZmxhZywgcGljLT5jb2RlZF9mcmFtZSwgcGljLT5zdHJ1Y3R1cmUsCisJCQkJbDEwX3N0cnVjdHVyZSwgY29sb2NhdGVfcGljLT5tYl9hZmZfZnJhbWVfZmxhZywgY29sb2NhdGVfcGljLT5jb2RlZF9mcmFtZSwgY29sb2NhdGVfcGljLT5zdHJ1Y3R1cmUsCisJCQkJY29sb2NhdGVfYWRyX29mZnNldCwKKwkJCQljb2xvY2F0ZV9yZF9hZHJfb2Zmc2V0KTsKKworI2lmIDAKKwkJLypjYXNlMDAxNiwgcDE2LAorCQkgKmN1cl9jb2xvY2F0ZV9yZWZfdHlwZSBzaG91bGQgYmUgY29uZmlndXJlZCBiYXNlIG9uIGN1cnJlbnQgcGljCisJCSAqLworCQlpZiAocGljLT5zdHJ1Y3R1cmUgPT0gRlJBTUUgJiYKKwkJCXBpYy0+bWJfYWZmX2ZyYW1lX2ZsYWcpCisJCQljdXJfY29sb2NhdGVfcmVmX3R5cGUgPSAwOworCQllbHNlIGlmIChwaWMtPnN0cnVjdHVyZSA9PSBCT1RUT01fRklFTEQpCisJCQljdXJfY29sb2NhdGVfcmVmX3R5cGUgPSAxOworCQllbHNlCisJCQljdXJfY29sb2NhdGVfcmVmX3R5cGUgPSAwOworI2Vsc2UKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCwKKwkJCSIgQ1VSIFRNUCBERUJVRyA6IG1iX2FmZl9mcmFtZV9mbGFnIDogJWQsIHN0cnVjdHVyZSA6ICVkIGNvZGVkX2ZyYW1lICVkXG4iLAorCQkJcGljLT5tYl9hZmZfZnJhbWVfZmxhZywKKwkJCXBpYy0+c3RydWN0dXJlLAorCQkJcGljLT5jb2RlZF9mcmFtZSk7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RFQ19ERVRBSUwsCisJCQkiIENPTCBUTVAgREVCVUcgOiBtYl9hZmZfZnJhbWVfZmxhZyA6ICVkLCBzdHJ1Y3R1cmUgOiAlZCBjb2RlZF9mcmFtZSAlZFxuIiwKKwkJCWNvbG9jYXRlX3BpYy0+bWJfYWZmX2ZyYW1lX2ZsYWcsCisJCQkJY29sb2NhdGVfcGljLT5zdHJ1Y3R1cmUsCisJCQkJY29sb2NhdGVfcGljLT5jb2RlZF9mcmFtZSk7CisJCWlmIChwaWMtPnN0cnVjdHVyZSA9PSBGUkFNRSAgfHwgcGljLT5tYl9hZmZfZnJhbWVfZmxhZykgeworCQkJY3VyX2NvbG9jYXRlX3JlZl90eXBlID0KKwkJCQkoYWJzKHBpYy0+cG9jIC0gY29sb2NhdGVfcGljLT50b3BfcG9jKQorCQkJCTwgYWJzKHBpYy0+cG9jIC0KKwkJCQljb2xvY2F0ZV9waWMtPmJvdHRvbV9wb2MpKSA/IDAgOiAxOworCQl9IGVsc2UKKwkJCWN1cl9jb2xvY2F0ZV9yZWZfdHlwZSA9CisJCQkJKGNvbG9jYXRlX3BpYy0+c3RydWN0dXJlCisJCQkJCT09IEJPVFRPTV9GSUVMRCkgPyAxIDogMDsKKyNlbmRpZgorCisjaWZuZGVmIE9ORV9DT0xPQ0FURV9CVUZfUEVSX0RFQ09ERV9CVUYKKwkJaWYgKChjb2xvY2F0ZV9waWMtPmNvbG9jYXRlZF9idWZfaW5kZXggPj0gMCkgJiYKKwkJCShjb2xvY2F0ZV9waWMtPmNvbG9jYXRlZF9idWZfaW5kZXggPAorCQkJCXBfSDI2NF9EcGItPmNvbG9jYXRlZF9idWZfY291bnQpKSB7CisJCQljb2xvY2F0ZV9yZF9hZHIgPSBwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfbXZfYWRkcl9zdGFydCArCisJCQkJKChwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX3NpemUgKgorCQkJCWNvbG9jYXRlX3BpYy0+Y29sb2NhdGVkX2J1Zl9pbmRleCkKKwkJCQk+PiAodXNlX2RpcmVjdF84eDggPyAyIDogMCkpOworCQkJaWYgKChjb2xvY2F0ZV9yZF9hZHIgKyBwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX3NpemUpID4KKwkJCQlwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfbXZfYWRkcl9lbmQpIHsKKwkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCQkJUFJJTlRfRkxBR19FUlJPUiwKKwkJCQkiRXJyb3IsIGNvbG9jYXRlIGJ1ZiBpcyBub3QgZW5vdWdoLCBpbmRleCBpcyAlZFxuIiwKKwkJCQkJY29sb2NhdGVfcGljLT5jb2xvY2F0ZWRfYnVmX2luZGV4KTsKKwkJCQlyZXQgPSAtNjsKKwkJCX0KKwkJCS8qIGJpdCAzMTozMCAtLSBMMVswXSBwaWN0dXJlIGNvZGluZyBzdHJ1Y3R1cmUsCisJCQkgKiAwMCAtIHRvcCBmaWVsZCwgMDEgLSBib3R0b20gZmllbGQsCisJCQkgKiAxMCAtIGZyYW1lLCAxMSAtIG1iYWZmIGZyYW1lCisJCQkgKiBiaXQgMjkgLSBMMVswXSB0b3AvYm90IGZvciBCIGZpZWxkIHBjaXR1cmUsCisJCQkgKiAwIC0gdG9wLCAxIC0gYm90CisJCQkgKiBiaXQgMjg6MCBoMjY0X2NvX21iX21lbV9yZF9hZGRyWzMxOjNdCisJCQkgKiAtLSBvbmx5IHVzZWQgZm9yIEIgUGljdHVyZSBEaXJlY3QgbW9kZQorCQkJICogWzI6MF0gd2lsbCBzZXQgdG8gMydiMDAwCisJCQkgKi8KKwkJCS8qICNkZWZpbmUgSDI2NF9DT19NQl9SRF9BRERSICAgICAgICBWTERfQzM5IDB4YzM5ICovCisJCQl2YWwgPSAoKGNvbG9jYXRlX3JkX2Fkcitjb2xvY2F0ZV9yZF9hZHJfb2Zmc2V0KSA+PiAzKSB8CisJCQkJKGwxMF9zdHJ1Y3R1cmUgPDwgMzApIHwKKwkJCQkoY3VyX2NvbG9jYXRlX3JlZl90eXBlIDw8IDI5KTsKKwkJCVdSSVRFX1ZSRUcoSDI2NF9DT19NQl9SRF9BRERSLCB2YWwpOworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCwKKwkJCQkiY28gaWR4ICVkLCBXUklURV9WUkVHKEgyNjRfQ09fTUJfUkRfQUREUikgPSAleCwgYWRkciAleCBMMSgwKSBwaWNfc3RydWN0dXJlICVkIG1iYWZmICVkXG4iLAorCQkJCWNvbG9jYXRlX3BpYy0+Y29sb2NhdGVkX2J1Zl9pbmRleCwKKwkJCQl2YWwsIGNvbG9jYXRlX3JkX2FkciArIGNvbG9jYXRlX3JkX2Fkcl9vZmZzZXQsCisJCQkJY29sb2NhdGVfcGljLT5zdHJ1Y3R1cmUsCisJCQkJY29sb2NhdGVfcGljLT5tYl9hZmZfZnJhbWVfZmxhZyk7CisJCX0gZWxzZSB7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19FUlJPUiwKKwkJCSJFcnJvciwgcmVmZXJlbmNlIHBpYyBoYXMgbm8gY29sb2NhdGVkIGJ1ZlxuIik7CisJCQlyZXQgPSAtNzsKKwkJfQorI2Vsc2UKKwkJY29sb2NhdGVfYnVmX2luZGV4ID0KKwkJCWh3LT5idWZmZXJfc3BlY1tjb2xvY2F0ZV9waWMtPmJ1Zl9zcGVjX251bV0uY2FudmFzX3BvczsKKwkJY29sb2NhdGVfcmRfYWRyID0gcF9IMjY0X0RwYi0+Y29sb2NhdGVkX212X2FkZHJfc3RhcnQgKworCQkJKChwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX3NpemUgKgorCQkJCWNvbG9jYXRlX2J1Zl9pbmRleCkKKwkJCQk+PiAodXNlX2RpcmVjdF84eDggPyAyIDogMCkpOworCQlpZiAoKGNvbG9jYXRlX3JkX2FkciArIHBfSDI2NF9EcGItPmNvbG9jYXRlZF9idWZfc2l6ZSkgPgorCQkJcF9IMjY0X0RwYi0+Y29sb2NhdGVkX212X2FkZHJfZW5kKSB7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19FUlJPUiwKKwkJCQkiRXJyb3IsIGNvbG9jYXRlIGJ1ZiBpcyBub3QgZW5vdWdoLCBjb2wgYnVmIGluZGV4IGlzICVkXG4iLAorCQkJCWNvbG9jYXRlX2J1Zl9pbmRleCk7CisJCQlyZXQgPSAtODsKKwkJfQorCQkvKiBiaXQgMzE6MzAgLS0gTDFbMF0gcGljdHVyZSBjb2Rpbmcgc3RydWN0dXJlLAorCQkgKiAwMCAtIHRvcCBmaWVsZCwgMDEgLSBib3R0b20gZmllbGQsCisJCSAqIDEwIC0gZnJhbWUsIDExIC0gbWJhZmYgZnJhbWUKKwkJICogYml0IDI5IC0gTDFbMF0gdG9wL2JvdCBmb3IgQiBmaWVsZCBwY2l0dXJlLAorCQkgKiAwIC0gdG9wLCAxIC0gYm90CisJCSAqIGJpdCAyODowIGgyNjRfY29fbWJfbWVtX3JkX2FkZHJbMzE6M10KKwkJICogLS0gb25seSB1c2VkIGZvciBCIFBpY3R1cmUgRGlyZWN0IG1vZGUKKwkJICogWzI6MF0gd2lsbCBzZXQgdG8gMydiMDAwCisJCSAqLworCQkvKiAjZGVmaW5lIEgyNjRfQ09fTUJfUkRfQUREUiAgICAgICAgVkxEX0MzOSAweGMzOSAqLworCQl2YWwgPSAoKGNvbG9jYXRlX3JkX2Fkcitjb2xvY2F0ZV9yZF9hZHJfb2Zmc2V0KT4+MykgfAorCQkJKGwxMF9zdHJ1Y3R1cmUgPDwgMzApIHwgKGN1cl9jb2xvY2F0ZV9yZWZfdHlwZSA8PCAyOSk7CisJCVdSSVRFX1ZSRUcoSDI2NF9DT19NQl9SRF9BRERSLCB2YWwpOworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19ERUNfREVUQUlMLAorCQkJIldSSVRFX1ZSRUcoSDI2NF9DT19NQl9SRF9BRERSKSA9ICV4LCBMMSgwKSBwaWNfc3RydWN0dXJlICVkIG1iYWZmICVkXG4iLAorCQkJdmFsLCBjb2xvY2F0ZV9waWMtPnN0cnVjdHVyZSwKKwkJCWNvbG9jYXRlX3BpYy0+bWJfYWZmX2ZyYW1lX2ZsYWcpOworI2VuZGlmCisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmgyNjRfdmZfc3RhdGVzKHN0cnVjdCB2ZnJhbWVfc3RhdGVzICpzdGF0ZXMsIHZvaWQgKm9wX2FyZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBvcF9hcmc7CisJc3RydWN0IHZkZWNfaDI2NF9od19zICpodyA9IChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKil2ZGVjLT5wcml2YXRlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5sb2NrLCBmbGFncyk7CisKKwlzdGF0ZXMtPnZmX3Bvb2xfc2l6ZSA9IFZGX1BPT0xfU0laRTsKKwlzdGF0ZXMtPmJ1Zl9mcmVlX251bSA9IGtmaWZvX2xlbigmaHctPm5ld2ZyYW1lX3EpOworCXN0YXRlcy0+YnVmX2F2YWlsX251bSA9IGtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZoMjY0X3ZmX3BlZWsodm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCB2ZnJhbWVfcyAqdmZbMl0gPSB7MCwgMH07CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IG9wX2FyZzsKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisKKwlpZiAoIWh3KQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChmb3JjZV9kaXNwX2J1ZnNwZWNfbnVtICYgMHgxMDApIHsKKwkJaWYgKGZvcmNlX2Rpc3BfYnVmc3BlY19udW0gJiAweDIwMCkKKwkJCXJldHVybiBOVUxMOworCQlyZXR1cm4gJmh3LT52ZnJhbWVfZHVtbXk7CisJfQorCisJaWYgKGtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSkgPiBWRl9QT09MX1NJWkUpIHsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkia2ZpZm8gbGVuOiVkIGludmFpbGQsIHBlZWsgZXJyb3JcbiIsCisJCQlrZmlmb19sZW4oJmh3LT5kaXNwbGF5X3EpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGtmaWZvX291dF9wZWVrKCZody0+ZGlzcGxheV9xLCAodm9pZCAqKSZ2ZiwgMikpIHsKKwkJaWYgKHZmWzFdKSB7CisJCQl2ZlswXS0+bmV4dF92Zl9wdHNfdmFsaWQgPSB0cnVlOworCQkJdmZbMF0tPm5leHRfdmZfcHRzID0gdmZbMV0tPnB0czsKKwkJfSBlbHNlCisJCQl2ZlswXS0+bmV4dF92Zl9wdHNfdmFsaWQgPSBmYWxzZTsKKwkJcmV0dXJuIHZmWzBdOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2aDI2NF92Zl9nZXQodm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCB2ZnJhbWVfcyAqdmY7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IG9wX2FyZzsKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICogdjRsMl9jdHggPSBody0+djRsMl9jdHg7CisJdWxvbmcgbnZfb3JkZXIgPSBWSURUWVBFX1ZJVV9OVjIxOworCisJaWYgKCFodykKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBzd2FwIHV2ICovCisJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQlpZiAoKHY0bDJfY3R4LT5jYXBfcGl4X2ZtdCA9PSBWNEwyX1BJWF9GTVRfTlYxMikgfHwKKwkJCSh2NGwyX2N0eC0+Y2FwX3BpeF9mbXQgPT0gVjRMMl9QSVhfRk1UX05WMTJNKSkKKwkJCW52X29yZGVyID0gVklEVFlQRV9WSVVfTlYxMjsKKwl9CisKKwlpZiAoZm9yY2VfZGlzcF9idWZzcGVjX251bSAmIDB4MTAwKSB7CisJCWludCBidWZmZXJfaW5kZXggPSBmb3JjZV9kaXNwX2J1ZnNwZWNfbnVtICYgMHhmZjsKKwkJaWYgKGZvcmNlX2Rpc3BfYnVmc3BlY19udW0gJiAweDIwMCkKKwkJCXJldHVybiBOVUxMOworCisJCXZmID0gJmh3LT52ZnJhbWVfZHVtbXk7CisJCXZmLT5kdXJhdGlvbl9wdWxsZG93biA9IDA7CisJCXZmLT5wdHMgPSAwOworCQl2Zi0+cHRzX3VzNjQgPSAwOworCQlzZXRfZnJhbWVfaW5mbyhodywgdmYsIGJ1ZmZlcl9pbmRleCk7CisJCXZmLT5mbGFnID0gMDsKKwkJaWYgKGh3LT5tbXVfZW5hYmxlKSB7CisJCQlpZiAoaHctPmRvdWJsZV93cml0ZV9tb2RlICYgMHgxMCkgeworCQkJCS8qIGRvdWJsZSB3cml0ZSBvbmx5ICovCisJCQkJdmYtPmNvbXBCb2R5QWRkciA9IDA7CisJCQkJdmYtPmNvbXBIZWFkQWRkciA9IDA7CisJCQl9IGVsc2UgeworCQkJCS8qaGVhZCBhZHIqLworCQkJCXZmLT5jb21wSGVhZEFkZHIgPQorCQkJCWh3LT5idWZmZXJfc3BlY1tidWZmZXJfaW5kZXhdLmFsbG9jX2hlYWRlcl9hZGRyOworCQkJCS8qYm9keSBhZHIqLworCQkJCXZmLT5jb21wQm9keUFkZHIgPSAwOworCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IDA7CisJCQl9CisKKwkJCXZmLT50eXBlID0gVklEVFlQRV9TQ0FUVEVSOworCisJCQlpZiAoaHctPmRvdWJsZV93cml0ZV9tb2RlKSB7CisJCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9QUk9HUkVTU0lWRQorCQkJCQl8IFZJRFRZUEVfVklVX0ZJRUxEOworCQkJCXZmLT50eXBlIHw9IG52X29yZGVyOworCQkJCWlmIChody0+ZG91YmxlX3dyaXRlX21vZGUgPT0gMykKKwkJCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9DT01QUkVTUzsKKworCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IC0xOworCQkJCXZmLT5wbGFuZV9udW0gPSAyOworCQkJCXZmLT5jYW52YXMwX2NvbmZpZ1swXSA9CisJCQkJCWh3LT5idWZmZXJfc3BlY1tidWZmZXJfaW5kZXhdLgorCQkJCQkJY2FudmFzX2NvbmZpZ1swXTsKKwkJCQl2Zi0+Y2FudmFzMF9jb25maWdbMV0gPQorCQkJCQlody0+YnVmZmVyX3NwZWNbYnVmZmVyX2luZGV4XS4KKwkJCQkJCWNhbnZhc19jb25maWdbMV07CisKKwkJCQl2Zi0+Y2FudmFzMV9jb25maWdbMF0gPQorCQkJCQlody0+YnVmZmVyX3NwZWNbYnVmZmVyX2luZGV4XS4KKwkJCQkJCWNhbnZhc19jb25maWdbMF07CisJCQkJdmYtPmNhbnZhczFfY29uZmlnWzFdID0KKwkJCQkJaHctPmJ1ZmZlcl9zcGVjW2J1ZmZlcl9pbmRleF0uCisJCQkJCQljYW52YXNfY29uZmlnWzFdOworCQkJfSBlbHNlIHsKKwkJCQl2Zi0+dHlwZSB8PQorCQkJCQlWSURUWVBFX0NPTVBSRVNTIHwgVklEVFlQRV9WSVVfRklFTEQ7CisJCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0gMDsKKwkJCX0KKwkJCXZmLT5iaXRkZXB0aCA9CisJCQkJQklUREVQVEhfWTggfCBCSVRERVBUSF9VOCB8IEJJVERFUFRIX1Y4OworCisJCQl2Zi0+Y29tcFdpZHRoID0gaHctPmZyYW1lX3dpZHRoOworCQkJdmYtPmNvbXBIZWlnaHQgPSBody0+ZnJhbWVfaGVpZ2h0OworCisJCQlpZiAoaHctPmRvdWJsZV93cml0ZV9tb2RlKSB7CisJCQkJdmYtPndpZHRoID0gaHctPmZyYW1lX3dpZHRoIC8KKwkJCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhody0+ZG91YmxlX3dyaXRlX21vZGUpOworCQkJCXZmLT5oZWlnaHQgPSBody0+ZnJhbWVfaGVpZ2h0IC8KKwkJCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhody0+ZG91YmxlX3dyaXRlX21vZGUpOworCQkJfQorCQl9IGVsc2UgeworCQkJdmYtPnR5cGUgPSBWSURUWVBFX1BST0dSRVNTSVZFIHwgVklEVFlQRV9WSVVfRklFTEQgfAorCQkJCW52X29yZGVyOworCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0KKwkJCXNwZWMyY2FudmFzKCZody0+YnVmZmVyX3NwZWNbYnVmZmVyX2luZGV4XSk7CisJCX0KKworCQkvKnZmLT5tZW1faGFuZGxlID0gZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCWh3LT5ibW11X2JveCwgYnVmZmVyX2luZGV4KTsqLworCQl1cGRhdGVfdmZfbWVtaGFuZGxlKGh3LCB2ZiwgYnVmZmVyX2luZGV4KTsKKwkJZm9yY2VfZGlzcF9idWZzcGVjX251bSB8PSAweDIwMDsKKwkJcmV0dXJuIHZmOworCX0KKworCWlmIChrZmlmb19nZXQoJmh3LT5kaXNwbGF5X3EsICZ2ZikpIHsKKwkJaW50IHRpbWUgPSBqaWZmaWVzOworCQl1bnNpZ25lZCBpbnQgZnJhbWVfaW50ZXJ2YWwgPQorCQkJMTAwMCoodGltZSAtIGh3LT5sYXN0X2ZyYW1lX3RpbWUpL0haOworCQlzdHJ1Y3QgdmZyYW1lX3MgKm5leHRfdmYgPSBOVUxMOworCQlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGlzcF9xX25hbWUsIGtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSkpOworCQlpZiAoZHBiX2lzX2RlYnVnKERFQ09ERV9JRChodyksCisJCQlQUklOVF9GTEFHX1ZERUNfREVUQUlMKSkgeworCQkJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSAmaHctPmRwYjsKKwkJCWludCBmcmFtZV9pbmRleCA9IEZSQU1FX0lOREVYKHZmLT5pbmRleCk7CisJCQlpZiAoZnJhbWVfaW5kZXggPCAwIHx8CisJCQkJCWZyYW1lX2luZGV4ID49IERQQl9TSVpFX01BWCkgeworCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJCQkJIiVzIHZmIGluZGV4IDB4JXggZXJyb3JcclxuIiwKKwkJCQkJCV9fZnVuY19fLCB2Zi0+aW5kZXgpOworCQkJfSBlbHNlIHsKKwkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WREVDX0RFVEFJTCwKKwkJCQkiJXMgYnVmX3NwZWNfbnVtICVkIHZmICVwIHBvYyAlZCBkdXIgJWQgcHRzICVkIGludGVydmFsICVkbXMsIHRzOiAlbGxkXG4iLAorCQkJCV9fZnVuY19fLCBCVUZTUEVDX0lOREVYKHZmLT5pbmRleCksIHZmLAorCQkJCXBfSDI2NF9EcGItPm1GcmFtZVN0b3JlW2ZyYW1lX2luZGV4XS5wb2MsCisJCQkJdmYtPmR1cmF0aW9uLCB2Zi0+cHRzLCBmcmFtZV9pbnRlcnZhbCwgdmYtPnRpbWVzdGFtcCk7CisJCQl9CisJCX0KKwkJaWYgKGh3LT5sYXN0X2ZyYW1lX3RpbWUgPiAwKSB7CisJCQlpZiAoZnJhbWVfaW50ZXJ2YWwgPgorCQkJCW1heF9nZXRfZnJhbWVfaW50ZXJ2YWxbREVDT0RFX0lEKGh3KV0pCisJCQkJbWF4X2dldF9mcmFtZV9pbnRlcnZhbFtERUNPREVfSUQoaHcpXQorCQkJCT0gZnJhbWVfaW50ZXJ2YWw7CisJCX0KKwkJaHctPmxhc3RfZnJhbWVfdGltZSA9IHRpbWU7CisJCXZmLT5pbmRleF9kaXNwID0gYXRvbWljX3JlYWQoJmh3LT52Zl9nZXRfY291bnQpOworCQlhdG9taWNfYWRkKDEsICZody0+dmZfZ2V0X2NvdW50KTsKKwkJaWYgKGtmaWZvX3BlZWsoJmh3LT5kaXNwbGF5X3EsICZuZXh0X3ZmKSAmJiBuZXh0X3ZmKSB7CisJCQl2Zi0+bmV4dF92Zl9wdHNfdmFsaWQgPSB0cnVlOworCQkJdmYtPm5leHRfdmZfcHRzID0gbmV4dF92Zi0+cHRzOworCQl9IGVsc2UKKwkJCXZmLT5uZXh0X3ZmX3B0c192YWxpZCA9IGZhbHNlOworCisJCXJldHVybiB2ZjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGJvb2wgdmZfdmFsaWRfY2hlY2soc3RydWN0IHZmcmFtZV9zICp2Ziwgc3RydWN0IHZkZWNfaDI2NF9od19zICpodykgeworCWludCBpLGo7CisJaWYgKGh3LT5pc191c2VkX3Y0bCkKKwkJcmV0dXJuIHRydWU7CisJZm9yIChpID0gMDsgaSA8IFZGX1BPT0xfU0laRTsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBWRl9QT09MX05VTTsgaiArKykgeworCQkJaWYgKHZmID09ICYoaHctPnZmcG9vbFtqXVtpXSkgfHwgdmYgPT0gJmh3LT52ZnJhbWVfZHVtbXkpCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsICIgaW52YWxpZCB2ZiBiZWVuIHB1dCwgdmYgPSAlcFxuIiwgdmYpOworCWZvciAoaSA9IDA7IGkgPCBWRl9QT09MX1NJWkU7IGkrKykgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJImR1bXAgdmYgWyVkXT0gJXBcbiIsICBpLCAmKGh3LT52ZnBvb2xbaHctPmN1cl9wb29sXVtpXSkpOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIHZoMjY0X3ZmX3B1dChzdHJ1Y3QgdmZyYW1lX3MgKnZmLCB2b2lkICpvcF9hcmcpCit7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IG9wX2FyZzsKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgYnVmX3NwZWNfbnVtOworCWludCBmcmFtZV9pbmRleDsKKworCWlmICh2ZiA9PSAoJmh3LT52ZnJhbWVfZHVtbXkpKQorCQlyZXR1cm47CisKKwlpZiAoIXZmKQorCQlyZXR1cm47CisKKwlpZiAodmYtPmluZGV4ID09IC0xKSB7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJIldhcm5pbmc6ICVzIHZmICVwIGludmFsaWQgaW5kZXhcclxuIiwKKwkJCV9fZnVuY19fLCB2Zik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaHctPmVuYWJsZV9mZW5jZSAmJiB2Zi0+ZmVuY2UpIHsKKwkJaW50IHJldCwgaTsKKworCQltdXRleF9sb2NrKCZody0+ZmVuY2VfbXV0ZXgpOworCQlyZXQgPSBkbWFfZmVuY2VfZ2V0X3N0YXR1cyh2Zi0+ZmVuY2UpOworCQlpZiAocmV0ID09IDApIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBWRl9QT09MX1NJWkU7IGkrKykgeworCQkJCWlmIChody0+ZmVuY2VfdmZfcy5mZW5jZV92ZltpXSA9PSBOVUxMKSB7CisJCQkJCWh3LT5mZW5jZV92Zl9zLmZlbmNlX3ZmW2ldID0gdmY7CisJCQkJCWh3LT5mZW5jZV92Zl9zLnVzZWRfc2l6ZSsrOworCQkJCQltdXRleF91bmxvY2soJmh3LT5mZW5jZV9tdXRleCk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZody0+ZmVuY2VfbXV0ZXgpOworCX0KKworCWJ1Zl9zcGVjX251bSA9IEJVRlNQRUNfSU5ERVgodmYtPmluZGV4KTsKKwlpZiAoaHctPmVuYWJsZV9mZW5jZSkKKwkJZnJhbWVfaW5kZXggPSBody0+YnVmZmVyX3NwZWNbYnVmX3NwZWNfbnVtXS5mc19pZHg7CisJZWxzZQorCQlmcmFtZV9pbmRleCA9IEZSQU1FX0lOREVYKHZmLT5pbmRleCk7CisKKwlpZiAoZnJhbWVfaW5kZXggPCAwIHx8CisJCWZyYW1lX2luZGV4ID49IERQQl9TSVpFX01BWCB8fAorCQlidWZfc3BlY19udW0gPCAwIHx8CisJCWJ1Zl9zcGVjX251bSA+PSBCVUZTUEVDX1BPT0xfU0laRSkgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSIlcyB2ZiBpbmRleCAweCV4IGVycm9yXHJcbiIsCisJCQlfX2Z1bmNfXywgdmYtPmluZGV4KTsKKwkJcmV0dXJuOworCX0KKwkJLypnZXRfYnVmX3NwZWNfaWR4X2J5X2NhbnZhc19jb25maWcoaHcsCisJCQkmdmYtPmNhbnZhczBfY29uZmlnWzBdKTsqLworCisJaWYgKGh3LT5lbmFibGVfZmVuY2UgJiYgdmYtPmZlbmNlKSB7CisJCXZkZWNfZmVuY2VfcHV0KHZmLT5mZW5jZSk7CisJCXZmLT5mZW5jZSA9IE5VTEw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5idWZzcGVjX2xvY2ssIGZsYWdzKTsKKwlpZiAoaHctPmJ1ZmZlcl9zcGVjW2J1Zl9zcGVjX251bV0udXNlZCA9PSAyKSB7CisJCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gJmh3LT5kcGI7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkiJXMgJXAgdG8gZnNbJWRdLCBwb2MgJWQgYnVmX3NwZWNfbnVtICVkIHVzZWQgJWQgdmZfcmVmICVkXG4iLAorCQlfX2Z1bmNfXywgdmYsIGZyYW1lX2luZGV4LAorCQlwX0gyNjRfRHBiLT5tRnJhbWVTdG9yZVtmcmFtZV9pbmRleF0ucG9jLAorCQlidWZfc3BlY19udW0sCisJCWh3LT5idWZmZXJfc3BlY1tidWZfc3BlY19udW1dLnVzZWQsCisJCWh3LT5idWZmZXJfc3BlY1tidWZfc3BlY19udW1dLnZmX3JlZik7CisJCWh3LT5idWZmZXJfc3BlY1tidWZfc3BlY19udW1dLnZmX3JlZi0tOworCQlpZiAoaHctPmJ1ZmZlcl9zcGVjW2J1Zl9zcGVjX251bV0udmZfcmVmIDw9IDApCisJCQlzZXRfZnJhbWVfb3V0cHV0X2ZsYWcoJmh3LT5kcGIsIGZyYW1lX2luZGV4KTsKKwl9IGVsc2UgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJIiVzICVwIGlzb2xhdGVkIHZmLCBidWZfc3BlY19udW0gJWQgdXNlZCAlZCB2Zl9yZWYgJWRcbiIsCisJCV9fZnVuY19fLCB2ZiwgYnVmX3NwZWNfbnVtLAorCQlody0+YnVmZmVyX3NwZWNbYnVmX3NwZWNfbnVtXS51c2VkLAorCQlody0+YnVmZmVyX3NwZWNbYnVmX3NwZWNfbnVtXS52Zl9yZWYpOworCQlody0+YnVmZmVyX3NwZWNbYnVmX3NwZWNfbnVtXS52Zl9yZWYtLTsKKwkJaWYgKGh3LT5idWZmZXJfc3BlY1tidWZfc3BlY19udW1dLnZmX3JlZiA8PSAwKSB7CisJCQlpZiAoaHctPmJ1ZmZlcl9zcGVjW2J1Zl9zcGVjX251bV0udXNlZCA9PSAzKQorCQkJCWh3LT5idWZmZXJfc3BlY1tidWZfc3BlY19udW1dLnVzZWQgPSA0OworCQkJZWxzZSBpZiAoaHctPmJ1ZmZlcl9zcGVjW2J1Zl9zcGVjX251bV0udXNlZCA9PSA1KQorCQkJCWh3LT5idWZmZXJfc3BlY1tidWZfc3BlY19udW1dLnVzZWQgPSAwOworCQl9CisJCWlmIChkcGJfaXNfZGVidWcoREVDT0RFX0lEKGh3KSwKKwkJCVBSSU5UX0ZMQUdfRFVNUF9CVUZTUEVDKSkKKwkJCWR1bXBfYnVmc3BlYyhodywgX19mdW5jX18pOworCisJfQorCisJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQlzdHJ1Y3QgYnVmZmVyX3NwZWNfcyAqcGljID0gJmh3LT5idWZmZXJfc3BlY1tidWZfc3BlY19udW1dOworCisJCWlmICh2Zi0+djRsX21lbV9oYW5kbGUgIT0gcGljLT5jbWFfYWxsb2NfYWRkcikKKwkJCXBpYy0+Y21hX2FsbG9jX2FkZHIgPSB2Zi0+djRsX21lbV9oYW5kbGU7CisJfQorCisJYXRvbWljX2FkZCgxLCAmaHctPnZmX3B1dF9jb3VudCk7CisJaWYgKHZmICYmICh2Zl92YWxpZF9jaGVjayh2ZiwgaHcpID09IHRydWUpKSB7CisJCWtmaWZvX3B1dCgmaHctPm5ld2ZyYW1lX3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5uZXdfcV9uYW1lLCBrZmlmb19sZW4oJmh3LT5uZXdmcmFtZV9xKSk7CisJfQorCisjZGVmaW5lIEFTU0lTVF9NQk9YMV9JUlFfUkVHICAgIFZERUNfQVNTSVNUX01CT1gxX0lSUV9SRUcKKwlpZiAoaHctPmJ1ZmZlcl9lbXB0eV9mbGFnKQorCQlXUklURV9WUkVHKEFTU0lTVF9NQk9YMV9JUlFfUkVHLCAweDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5idWZzcGVjX2xvY2ssIGZsYWdzKTsKK30KKwordm9pZCAqIHZoMjY0X2dldF9idWZzcGVjX2xvY2soc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJaWYgKGh3KQorCQlyZXR1cm4gKCZody0+YnVmc3BlY19sb2NrKTsKKwllbHNlCisJCXJldHVybiBOVUxMOworfQorc3RhdGljIGludCB2aDI2NF9ldmVudF9jYihpbnQgdHlwZSwgdm9pZCAqZGF0YSwgdm9pZCAqb3BfYXJnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IG9wX2FyZzsKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisKKwlpZiAodHlwZSAmIFZGUkFNRV9FVkVOVF9SRUNFSVZFUl9HRVRfQVVYX0RBVEEpIHsKKwkJc3RydWN0IHByb3ZpZGVyX2F1eF9yZXFfcyAqcmVxID0KKwkJCShzdHJ1Y3QgcHJvdmlkZXJfYXV4X3JlcV9zICopZGF0YTsKKwkJaW50IGJ1Zl9zcGVjX251bTsKKworCQlpZiAoIXJlcS0+dmYpIHsKKwkJCXJlcS0+YXV4X3NpemUgPSBhdG9taWNfcmVhZCgmaHctPnZmX3B1dF9jb3VudCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlidWZfc3BlY19udW0gPSBCVUZTUEVDX0lOREVYKHJlcS0+dmYtPmluZGV4KTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5sb2NrLCBmbGFncyk7CisJCXJlcS0+YXV4X2J1ZiA9IE5VTEw7CisJCXJlcS0+YXV4X3NpemUgPSAwOworCQlpZiAoYnVmX3NwZWNfbnVtID49IDAgJiYKKwkJCWJ1Zl9zcGVjX251bSA8IEJVRlNQRUNfUE9PTF9TSVpFICYmCisJCQlpc19idWZfc3BlY19pbl9kaXNwX3EoaHcsIGJ1Zl9zcGVjX251bSkKKwkJCSkgeworCQkJcmVxLT5hdXhfYnVmID0KKwkJCQlody0+YnVmZmVyX3NwZWNbYnVmX3NwZWNfbnVtXS5hdXhfZGF0YV9idWY7CisJCQlyZXEtPmF1eF9zaXplID0KKwkJCQlody0+YnVmZmVyX3NwZWNbYnVmX3NwZWNfbnVtXS5hdXhfZGF0YV9zaXplOworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJCQlyZXEtPmR2X2VuaGFuY2VfZXhpc3QgPQorCQkJCWh3LT5idWZmZXJfc3BlY1tidWZfc3BlY19udW1dLmR2X2VuaGFuY2VfZXhpc3Q7CisjZWxzZQorCQkJcmVxLT5kdl9lbmhhbmNlX2V4aXN0ID0gMDsKKyNlbmRpZgorCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5sb2NrLCBmbGFncyk7CisKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCSIlcyh0eXBlIDB4JXggdmYgYnVmX3NwZWNfbnVtIDB4JXgpPT5zaXplIDB4JXhcbiIsCisJCV9fZnVuY19fLCB0eXBlLCBidWZfc3BlY19udW0sIHJlcS0+YXV4X3NpemUpOworCX0gZWxzZSBpZiAodHlwZSAmIFZGUkFNRV9FVkVOVF9SRUNFSVZFUl9SRVFfU1RBVEUpIHsKKwkJc3RydWN0IHByb3ZpZGVyX3N0YXRlX3JlcV9zICpyZXEgPQorCQkJKHN0cnVjdCBwcm92aWRlcl9zdGF0ZV9yZXFfcyAqKWRhdGE7CisJCWlmIChyZXEtPnJlcV90eXBlID09IFJFUV9TVEFURV9TRUNVUkUpCisJCQlyZXEtPnJlcV9yZXN1bHRbMF0gPSB2ZGVjX3NlY3VyZSh2ZGVjKTsKKwkJZWxzZQorCQkJcmVxLT5yZXFfcmVzdWx0WzBdID0gMHhmZmZmZmZmZjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2V0X2ZyYW1lX2luZm8oc3RydWN0IHZkZWNfaDI2NF9od19zICpodywgc3RydWN0IHZmcmFtZV9zICp2ZiwKKwkJCQl1MzIgaW5kZXgpCit7CisJc3RydWN0IGNhbnZhc19jb25maWdfcyAqcF9jYW52YXNfY29uZmlnOworCWludCBmb3JjZV9yYXRlID0gaW5wdXRfZnJhbWVfYmFzZWQoaHdfdG9fdmRlYyhodykpID8KKwkJZm9yY2VfcmF0ZV9mcmFtZWJhc2UgOiBmb3JjZV9yYXRlX3N0cmVhbWJhc2U7CisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJIiVzICglZCwlZCkgZHVyICVkLCB2ZiAlcCwgaW5kZXggJWRcbiIsIF9fZnVuY19fLAorCQlody0+ZnJhbWVfd2lkdGgsIGh3LT5mcmFtZV9oZWlnaHQsIGh3LT5mcmFtZV9kdXIsIHZmLCBpbmRleCk7CisKKwkvKiBzaWduYWxfdHlwZSAqLworCWlmIChody0+dmlkZW9fc2lnbmFsX2Zyb21fdnVpICYgVklERU9fU0lHTkFMX1RZUEVfQVZBSUxBQkxFX01BU0spIHsKKwkJdmYtPnNpZ25hbF90eXBlID0gaHctPnZpZGVvX3NpZ25hbF9mcm9tX3Z1aTsKKwkJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQkJc3RydWN0IGFtbF92ZGVjX2hkcl9pbmZvcyBoZHI7CisJCQlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShody0+djRsMl9jdHgpOworCisJCQltZW1zZXQoJmhkciwgMCwgc2l6ZW9mKGhkcikpOworCQkJaGRyLnNpZ25hbF90eXBlID0gaHctPnZpZGVvX3NpZ25hbF9mcm9tX3Z1aTsKKwkJCXZkZWNfdjRsX3NldF9oZHJfaW5mb3MoY3R4LCAmaGRyKTsKKwkJfQorCX0gZWxzZQorCQl2Zi0+c2lnbmFsX3R5cGUgPSAwOworCWh3LT52aWRlb19zaWduYWxfdHlwZSA9IHZmLT5zaWduYWxfdHlwZTsKKworCXZmLT53aWR0aCA9IGh3LT5mcmFtZV93aWR0aDsKKwl2Zi0+aGVpZ2h0ID0gaHctPmZyYW1lX2hlaWdodDsKKwlpZiAoZm9yY2VfcmF0ZSkgeworCQlpZiAoZm9yY2VfcmF0ZSA9PSAtMSkKKwkJCXZmLT5kdXJhdGlvbiA9IDA7CisJCWVsc2UKKwkJCXZmLT5kdXJhdGlvbiA9IDk2MDAwL2ZvcmNlX3JhdGU7CisJfSBlbHNlCisJCXZmLT5kdXJhdGlvbiA9IGh3LT5mcmFtZV9kdXI7CisJdmYtPnJhdGlvX2NvbnRyb2wgPQorCQkobWluKGh3LT5oMjY0X2FyLCAodTMyKSBESVNQX1JBVElPX0FTUEVDVF9SQVRJT19NQVgpKSA8PAorCQlESVNQX1JBVElPX0FTUEVDVF9SQVRJT19CSVQ7CisJdmYtPm9yaWVudGF0aW9uID0gaHctPnZoMjY0X3JvdGF0aW9uOworCisJdmYtPnNpZGViaW5kX3R5cGUgPSBody0+c2lkZWJpbmRfdHlwZTsKKwl2Zi0+c2lkZWJpbmRfY2hhbm5lbF9pZCA9IGh3LT5zaWRlYmluZF9jaGFubmVsX2lkOworCisJaWYgKGh3LT5tbXVfZW5hYmxlKQorCQlyZXR1cm47CisKKwl2Zi0+Y2FudmFzMEFkZHIgPSB2Zi0+Y2FudmFzMUFkZHIgPSAtMTsKKyNpZmRlZiBOVjIxCisJdmYtPnBsYW5lX251bSA9IDI7CisjZWxzZQorCXZmLT5wbGFuZV9udW0gPSAzOworI2VuZGlmCisKKwlpZiAoSVNfVkRFQ19EVyhodykpIHsKKwkJaWYgKElTX1ZERUNfRFcoaHcpID09IDEpCisJCQl2Zi0+d2lkdGggPSBody0+ZnJhbWVfd2lkdGggLyAyOworCQllbHNlCisJCQl2Zi0+d2lkdGggPSAoaHctPmZyYW1lX3dpZHRoIC8gSVNfVkRFQ19EVyhodykpOworCQl2Zi0+aGVpZ2h0ID0gKGh3LT5mcmFtZV9oZWlnaHQgLyBJU19WREVDX0RXKGh3KSk7CisJCXBfY2FudmFzX2NvbmZpZyA9ICZody0+YnVmZmVyX3NwZWNbaW5kZXhdLnZkZWNfZHdfY2FudmFzX2NvbmZpZ1swXTsKKwl9IGVsc2UKKwkJcF9jYW52YXNfY29uZmlnID0gJmh3LT5idWZmZXJfc3BlY1tpbmRleF0uY2FudmFzX2NvbmZpZ1swXTsKKworCXZmLT5jYW52YXMwX2NvbmZpZ1swXSA9IHBfY2FudmFzX2NvbmZpZ1swXTsKKwl2Zi0+Y2FudmFzMF9jb25maWdbMV0gPSBwX2NhbnZhc19jb25maWdbMV07CisjaWZuZGVmIE5WMjEKKwl2Zi0+Y2FudmFzMF9jb25maWdbMl0gPSBwX2NhbnZhc19jb25maWdbMl07CisjZW5kaWYKKwl2Zi0+Y2FudmFzMV9jb25maWdbMF0gPSBwX2NhbnZhc19jb25maWdbMF07CisJdmYtPmNhbnZhczFfY29uZmlnWzFdID0gcF9jYW52YXNfY29uZmlnWzFdOworI2lmbmRlZiBOVjIxCisJdmYtPmNhbnZhczFfY29uZmlnWzJdID0gcF9jYW52YXNfY29uZmlnWzJdOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGdldF9waWN0dXJlX3Fvc19pbmZvKHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnBpY3R1cmUpCit7CisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA8IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKSB7CisJCXVuc2lnbmVkIGNoYXIgYVszXTsKKwkJdW5zaWduZWQgY2hhciBpLCBqLCB0OworCQl1bnNpZ25lZCBsb25nICBkYXRhOworCisJCWdldF9yYW5kb21fYnl0ZXMoJmRhdGEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJCWlmIChwaWN0dXJlLT5zbGljZV90eXBlID09IElfU0xJQ0UpCisJCQlkYXRhID0gMDsKKwkJYVswXSA9IGRhdGEgJiAweGZmOworCQlhWzFdID0gKGRhdGEgPj4gOCkgJiAweGZmOworCQlhWzJdID0gKGRhdGEgPj4gMTYpICYgMHhmZjsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJZm9yIChqID0gaSsxOyBqIDwgMzsgaisrKSB7CisJCQkJaWYgKGFbal0gPCBhW2ldKSB7CisJCQkJCXQgPSBhW2pdOworCQkJCQlhW2pdID0gYVtpXTsKKwkJCQkJYVtpXSA9IHQ7CisJCQkJfSBlbHNlIGlmIChhW2pdID09IGFbaV0pIHsKKwkJCQkJYVtpXSsrOworCQkJCQl0ID0gYVtqXTsKKwkJCQkJYVtqXSA9IGFbaV07CisJCQkJCWFbaV0gPSB0OworCQkJCX0KKwkJCX0KKwkJcGljdHVyZS0+bWF4X212ID0gYVsyXTsKKwkJcGljdHVyZS0+YXZnX212ID0gYVsxXTsKKwkJcGljdHVyZS0+bWluX212ID0gYVswXTsKKwkJLyoKKwkJcHJfaW5mbygibXYgZGF0YSAleCAgYVswXT0gJXggYVsxXT0gJXggYVsyXT0gJXhcbiIsCisJCQlkYXRhLCBhWzBdLCBhWzFdLCBhWzJdKTsKKwkJKi8KKworCQlnZXRfcmFuZG9tX2J5dGVzKCZkYXRhLCBzaXplb2YodW5zaWduZWQgbG9uZykpOworCQlhWzBdID0gZGF0YSAmIDB4MWY7CisJCWFbMV0gPSAoZGF0YSA+PiA4KSAmIDB4M2Y7CisJCWFbMl0gPSAoZGF0YSA+PiAxNikgJiAweDdmOworCisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCQlmb3IgKGogPSBpKzE7IGogPCAzOyBqKyspIHsKKwkJCQlpZiAoYVtqXSA8IGFbaV0pIHsKKwkJCQkJdCA9IGFbal07CisJCQkJCWFbal0gPSBhW2ldOworCQkJCQlhW2ldID0gdDsKKwkJCQl9IGVsc2UgaWYgKGFbal0gPT0gYVtpXSkgeworCQkJCQlhW2ldKys7CisJCQkJCXQgPSBhW2pdOworCQkJCQlhW2pdID0gYVtpXTsKKwkJCQkJYVtpXSA9IHQ7CisJCQkJfQorCQkJfQorCQlwaWN0dXJlLT5tYXhfcXAgPSBhWzJdOworCQlwaWN0dXJlLT5hdmdfcXAgPSBhWzFdOworCQlwaWN0dXJlLT5taW5fcXAgPSBhWzBdOworCQkvKgorCQlwcl9pbmZvKCJxcCBkYXRhICV4ICBhWzBdPSAleCBhWzFdPSAleCBhWzJdPSAleFxuIiwKKwkJCWRhdGEsIGFbMF0sIGFbMV0sIGFbMl0pOworCQkqLworCisJCWdldF9yYW5kb21fYnl0ZXMoJmRhdGEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJCWFbMF0gPSBkYXRhICYgMHgxZjsKKwkJYVsxXSA9IChkYXRhID4+IDgpICYgMHgzZjsKKwkJYVsyXSA9IChkYXRhID4+IDE2KSAmIDB4N2Y7CisKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCWZvciAoaiA9IGkrMTsgaiA8IDM7IGorKykgeworCQkJCWlmIChhW2pdIDwgYVtpXSkgeworCQkJCQl0ID0gYVtqXTsKKwkJCQkJYVtqXSA9IGFbaV07CisJCQkJCWFbaV0gPSB0OworCQkJCX0gZWxzZSBpZiAoYVtqXSA9PSBhW2ldKSB7CisJCQkJCWFbaV0rKzsKKwkJCQkJdCA9IGFbal07CisJCQkJCWFbal0gPSBhW2ldOworCQkJCQlhW2ldID0gdDsKKwkJCQl9CisJCQl9CisJCXBpY3R1cmUtPm1heF9za2lwID0gYVsyXTsKKwkJcGljdHVyZS0+YXZnX3NraXAgPSBhWzFdOworCQlwaWN0dXJlLT5taW5fc2tpcCA9IGFbMF07CisKKworCQkvKgorCQlwcl9pbmZvKCJza2lwIGRhdGEgJXggIGFbMF09ICV4IGFbMV09ICV4IGFbMl09ICV4XG4iLAorCQkJZGF0YSxhWzBdLCBhWzFdLCBhWzJdKTsKKwkJKi8KKwl9IGVsc2UgeworCQl1aW50MzJfdCBibGs4OF95X2NvdW50OworCQl1aW50MzJfdCBibGs4OF9jX2NvdW50OworCQl1aW50MzJfdCBibGsyMl9tdl9jb3VudDsKKwkJdWludDMyX3QgcmRhdGEzMjsKKwkJaW50MzJfdCBtdl9oaTsKKwkJaW50MzJfdCBtdl9sbzsKKwkJdWludDMyX3QgcmRhdGEzMl9sOworCQl1aW50MzJfdCBtdnhfTDBfaGk7CisJCXVpbnQzMl90IG12eV9MMF9oaTsKKwkJdWludDMyX3QgbXZ4X0wxX2hpOworCQl1aW50MzJfdCBtdnlfTDFfaGk7CisJCWludDY0X3QgdmFsdWU7CisJCXVpbnQ2NF90IHRlbXBfdmFsdWU7CisvKgorI2RlZmluZSBERUJVR19RT1MKKyovCisjaWZkZWYgREVCVUdfUU9TCisJCWludCBwaWNfbnVtYmVyID0gcGljdHVyZS0+cG9jOworI2VuZGlmCisKKwkJcGljdHVyZS0+bWF4X212ID0gMDsKKwkJcGljdHVyZS0+YXZnX212ID0gMDsKKwkJcGljdHVyZS0+bWluX212ID0gMDsKKworCQlwaWN0dXJlLT5tYXhfc2tpcCA9IDA7CisJCXBpY3R1cmUtPmF2Z19za2lwID0gMDsKKwkJcGljdHVyZS0+bWluX3NraXAgPSAwOworCisJCXBpY3R1cmUtPm1heF9xcCA9IDA7CisJCXBpY3R1cmUtPmF2Z19xcCA9IDA7CisJCXBpY3R1cmUtPm1pbl9xcCA9IDA7CisKKworCisKKworCQkvKiBzZXQgcmRfaWR4IHRvIDAgKi8KKwkgICAgV1JJVEVfVlJFRyhWREVDX1BJQ19RVUFMSVRZX0NUUkwsIDApOworCSAgICBibGs4OF95X2NvdW50ID0gUkVBRF9WUkVHKFZERUNfUElDX1FVQUxJVFlfREFUQSk7CisJICAgIGlmIChibGs4OF95X2NvdW50ID09IDApIHsKKyNpZmRlZiBERUJVR19RT1MKKwkJCXByX2luZm8oIiBbUGljdHVyZSAlZCBRdWFsaXR5XSBOTyBEYXRhIHlldC5cbiIsCisJCQkJcGljX251bWJlcik7CisjZW5kaWYKKwkJCS8qIHJlc2V0IGFsbCBjb3VudHMgKi8KKwkJCVdSSVRFX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9DVFJMLCAoMTw8OCkpOworCQkJcmV0dXJuOworCSAgICB9CisJCS8qIHFwX3lfc3VtICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9EQVRBKTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgcHJfaW5mbygiIFtQaWN0dXJlICVkIFF1YWxpdHldIFkgUVAgQVZHIDogJWQgKCVkLyVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzIvYmxrODhfeV9jb3VudCwKKwkJCXJkYXRhMzIsIGJsazg4X3lfY291bnQpOworI2VuZGlmCisJCXBpY3R1cmUtPmF2Z19xcCA9IHJkYXRhMzIvYmxrODhfeV9jb3VudDsKKwkJLyogaW50cmFfeV9jb3VudCAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKFZERUNfUElDX1FVQUxJVFlfREFUQSk7CisjaWZkZWYgREVCVUdfUU9TCisJICAgIHByX2luZm8oIiBbUGljdHVyZSAlZCBRdWFsaXR5XSBZIGludHJhIHJhdGUgOiAlZCVjICglZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyKjEwMC9ibGs4OF95X2NvdW50LAorCQkJJyUnLCByZGF0YTMyKTsKKyNlbmRpZgorCQkvKiBza2lwcGVkX3lfY291bnQgKi8KKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhWREVDX1BJQ19RVUFMSVRZX0RBVEEpOworI2lmZGVmIERFQlVHX1FPUworCSAgICBwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gWSBza2lwcGVkIHJhdGUgOiAlZCVjICglZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyKjEwMC9ibGs4OF95X2NvdW50LAorCQkJJyUnLCByZGF0YTMyKTsKKyNlbmRpZgorCQlwaWN0dXJlLT5hdmdfc2tpcCA9IHJkYXRhMzIqMTAwL2Jsazg4X3lfY291bnQ7CisJCS8qIGNvZWZmX25vbl96ZXJvX3lfY291bnQgKi8KKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhWREVDX1BJQ19RVUFMSVRZX0RBVEEpOworI2lmZGVmIERFQlVHX1FPUworCSAgICBwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gWSBaRVJPX0NvZWZmIHJhdGUgOiAlZCVjICglZClcbiIsCisJCQlwaWNfbnVtYmVyLCAoMTAwIC0gcmRhdGEzMioxMDAvKGJsazg4X3lfY291bnQqMSkpLAorCQkJJyUnLCByZGF0YTMyKTsKKyNlbmRpZgorCQkvKiBibGs2Nl9jX2NvdW50ICovCisJICAgIGJsazg4X2NfY291bnQgPSBSRUFEX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkgICAgaWYgKGJsazg4X2NfY291bnQgPT0gMCkgeworI2lmZGVmIERFQlVHX1FPUworCQkJcHJfaW5mbygiIFtQaWN0dXJlICVkIFF1YWxpdHldIE5PIERhdGEgeWV0LlxuIiwKKwkJCQlwaWNfbnVtYmVyKTsKKyNlbmRpZgorCQkJLyogcmVzZXQgYWxsIGNvdW50cyAqLworCQkJV1JJVEVfVlJFRyhWREVDX1BJQ19RVUFMSVRZX0NUUkwsICgxPDw4KSk7CisJCQlyZXR1cm47CisJICAgIH0KKwkJLyogcXBfY19zdW0gKi8KKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhWREVDX1BJQ19RVUFMSVRZX0RBVEEpOworI2lmZGVmIERFQlVHX1FPUworCSAgICBwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gQyBRUCBBVkcgOiAlZCAoJWQvJWQpXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMi9ibGs4OF9jX2NvdW50LAorCQkJcmRhdGEzMiwgYmxrODhfY19jb3VudCk7CisjZW5kaWYKKwkJLyogaW50cmFfY19jb3VudCAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKFZERUNfUElDX1FVQUxJVFlfREFUQSk7CisjaWZkZWYgREVCVUdfUU9TCisJICAgIHByX2luZm8oIiBbUGljdHVyZSAlZCBRdWFsaXR5XSBDIGludHJhIHJhdGUgOiAlZCVjICglZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyKjEwMC9ibGs4OF9jX2NvdW50LAorCQkJJyUnLCByZGF0YTMyKTsKKyNlbmRpZgorCQkvKiBza2lwcGVkX2N1X2NfY291bnQgKi8KKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhWREVDX1BJQ19RVUFMSVRZX0RBVEEpOworI2lmZGVmIERFQlVHX1FPUworCSAgICBwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gQyBza2lwcGVkIHJhdGUgOiAlZCVjICglZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyKjEwMC9ibGs4OF9jX2NvdW50LAorCQkJJyUnLCByZGF0YTMyKTsKKyNlbmRpZgorCQkvKiBjb2VmZl9ub25femVyb19jX2NvdW50ICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9EQVRBKTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgcHJfaW5mbygiIFtQaWN0dXJlICVkIFF1YWxpdHldIEMgWkVST19Db2VmZiByYXRlIDogJWQlYyAoJWQpXG4iLAorCQkJcGljX251bWJlciwgKDEwMCAtIHJkYXRhMzIqMTAwLyhibGs4OF9jX2NvdW50KjEpKSwKKwkJCSclJywgcmRhdGEzMik7CisjZW5kaWYKKworCQkvKiAxJ2gwLCBxcF9jX21heFs2OjBdLCAxJ2gwLCBxcF9jX21pbls2OjBdLAorCQkxJ2gwLCBxcF95X21heFs2OjBdLCAxJ2gwLCBxcF95X21pbls2OjBdICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9EQVRBKTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgcHJfaW5mbygiIFtQaWN0dXJlICVkIFF1YWxpdHldIFkgUVAgbWluIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCAocmRhdGEzMj4+MCkmMHhmZik7CisjZW5kaWYKKwkJcGljdHVyZS0+bWluX3FwID0gKHJkYXRhMzI+PjApJjB4ZmY7CisKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgcHJfaW5mbygiIFtQaWN0dXJlICVkIFF1YWxpdHldIFkgUVAgbWF4IDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCAocmRhdGEzMj4+OCkmMHhmZik7CisjZW5kaWYKKwkJcGljdHVyZS0+bWF4X3FwID0gKHJkYXRhMzI+PjgpJjB4ZmY7CisKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgcHJfaW5mbygiIFtQaWN0dXJlICVkIFF1YWxpdHldIEMgUVAgbWluIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCAocmRhdGEzMj4+MTYpJjB4ZmYpOworCSAgICBwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gQyBRUCBtYXggOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIChyZGF0YTMyPj4yNCkmMHhmZik7CisjZW5kaWYKKworCQkvKiBibGsyMl9tdl9jb3VudCAqLworCSAgICBibGsyMl9tdl9jb3VudCA9IFJFQURfVlJFRyhWREVDX1BJQ19RVUFMSVRZX0RBVEEpOworCSAgICBpZiAoYmxrMjJfbXZfY291bnQgPT0gMCkgeworI2lmZGVmIERFQlVHX1FPUworCQkJcHJfaW5mbygiIFtQaWN0dXJlICVkIFF1YWxpdHldIE5PIE1WIERhdGEgeWV0LlxuIiwKKwkJCQlwaWNfbnVtYmVyKTsKKyNlbmRpZgorCQkJLyogcmVzZXQgYWxsIGNvdW50cyAqLworCQkJV1JJVEVfVlJFRyhWREVDX1BJQ19RVUFMSVRZX0NUUkwsICgxPDw4KSk7CisJCQlyZXR1cm47CisJICAgIH0KKwkJLyogbXZ5X0wxX2NvdW50WzM5OjMyXSwgbXZ4X0wxX2NvdW50WzM5OjMyXSwKKwkJbXZ5X0wwX2NvdW50WzM5OjMyXSwgbXZ4X0wwX2NvdW50WzM5OjMyXSAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKFZERUNfUElDX1FVQUxJVFlfREFUQSk7CisJICAgIC8qIHNob3VsZCBhbGwgYmUgMHgwMCBvciAweGZmICovCisjaWZkZWYgREVCVUdfUU9TCisJICAgIHByX2luZm8oIiBbUGljdHVyZSAlZCBRdWFsaXR5XSBNViBBVkcgSGlnaCBCaXRzOiAweCVYXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMik7CisjZW5kaWYKKwkgICAgbXZ4X0wwX2hpID0gKChyZGF0YTMyPj4wKSYweGZmKTsKKwkgICAgbXZ5X0wwX2hpID0gKChyZGF0YTMyPj44KSYweGZmKTsKKwkgICAgbXZ4X0wxX2hpID0gKChyZGF0YTMyPj4xNikmMHhmZik7CisJICAgIG12eV9MMV9oaSA9ICgocmRhdGEzMj4+MjQpJjB4ZmYpOworCisJCS8qIG12eF9MMF9jb3VudFszMTowXSAqLworCSAgICByZGF0YTMyX2wgPSBSRUFEX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkJdGVtcF92YWx1ZSA9IG12eF9MMF9oaTsKKwkJdGVtcF92YWx1ZSA9ICh0ZW1wX3ZhbHVlIDw8IDMyKSB8IHJkYXRhMzJfbDsKKworCQlpZiAobXZ4X0wwX2hpICYgMHg4MCkKKwkJCXZhbHVlID0gMHhGRkZGRkZGMDAwMDAwMDAwIHwgdGVtcF92YWx1ZTsKKwkJZWxzZQorCQkJdmFsdWUgPSB0ZW1wX3ZhbHVlOworCQl2YWx1ZSA9IGRpdl9zNjQodmFsdWUsIGJsazIyX212X2NvdW50KTsKKyNpZmRlZiBERUJVR19RT1MKKwkJcHJfaW5mbygiIFtQaWN0dXJlICVkIFF1YWxpdHldIE1WWF9MMCBBVkcgOiAlZCAoJWxsZC8lZClcbiIsCisJCQlwaWNfbnVtYmVyLCAoaW50KSh2YWx1ZSksCisJCQl2YWx1ZSwgYmxrMjJfbXZfY291bnQpOworI2VuZGlmCisJCXBpY3R1cmUtPmF2Z19tdiA9IHZhbHVlOworCisJCS8qIG12eV9MMF9jb3VudFszMTowXSAqLworCSAgICByZGF0YTMyX2wgPSBSRUFEX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkJdGVtcF92YWx1ZSA9IG12eV9MMF9oaTsKKwkJdGVtcF92YWx1ZSA9ICh0ZW1wX3ZhbHVlIDw8IDMyKSB8IHJkYXRhMzJfbDsKKworCQlpZiAobXZ5X0wwX2hpICYgMHg4MCkKKwkJCXZhbHVlID0gMHhGRkZGRkZGMDAwMDAwMDAwIHwgdGVtcF92YWx1ZTsKKwkJZWxzZQorCQkJdmFsdWUgPSB0ZW1wX3ZhbHVlOworI2lmZGVmIERFQlVHX1FPUworCSAgICBwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZZX0wwIEFWRyA6ICVkICglbGxkLyVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzJfbC9ibGsyMl9tdl9jb3VudCwKKwkJCXZhbHVlLCBibGsyMl9tdl9jb3VudCk7CisjZW5kaWYKKworCQkvKiBtdnhfTDFfY291bnRbMzE6MF0gKi8KKwkgICAgcmRhdGEzMl9sID0gUkVBRF9WUkVHKFZERUNfUElDX1FVQUxJVFlfREFUQSk7CisJCXRlbXBfdmFsdWUgPSBtdnhfTDFfaGk7CisJCXRlbXBfdmFsdWUgPSAodGVtcF92YWx1ZSA8PCAzMikgfCByZGF0YTMyX2w7CisJCWlmIChtdnhfTDFfaGkgJiAweDgwKQorCQkJdmFsdWUgPSAweEZGRkZGRkYwMDAwMDAwMDAgfCB0ZW1wX3ZhbHVlOworCQllbHNlCisJCQl2YWx1ZSA9IHRlbXBfdmFsdWU7CisjaWZkZWYgREVCVUdfUU9TCisJICAgIHByX2luZm8oIiBbUGljdHVyZSAlZCBRdWFsaXR5XSBNVlhfTDEgQVZHIDogJWQgKCVsbGQvJWQpXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMl9sL2JsazIyX212X2NvdW50LAorCQkJdmFsdWUsIGJsazIyX212X2NvdW50KTsKKyNlbmRpZgorCisJCS8qIG12eV9MMV9jb3VudFszMTowXSAqLworCSAgICByZGF0YTMyX2wgPSBSRUFEX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkJdGVtcF92YWx1ZSA9IG12eV9MMV9oaTsKKwkJdGVtcF92YWx1ZSA9ICh0ZW1wX3ZhbHVlIDw8IDMyKSB8IHJkYXRhMzJfbDsKKwkJaWYgKG12eV9MMV9oaSAmIDB4ODApCisJCQl2YWx1ZSA9IDB4RkZGRkZGRjAwMDAwMDAwMCB8IHRlbXBfdmFsdWU7CisJCWVsc2UKKwkJCXZhbHVlID0gdGVtcF92YWx1ZTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgcHJfaW5mbygiIFtQaWN0dXJlICVkIFF1YWxpdHldIE1WWV9MMSBBVkcgOiAlZCAoJWxsZC8lZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyX2wvYmxrMjJfbXZfY291bnQsCisJCQl2YWx1ZSwgYmxrMjJfbXZfY291bnQpOworI2VuZGlmCisKKwkJLyoge212eF9MMF9tYXgsIG12eF9MMF9taW59IC8vIGZvcm1hdCA6IHtzaWduLCBhYnNbMTQ6MF19ICAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKFZERUNfUElDX1FVQUxJVFlfREFUQSk7CisJICAgIG12X2hpID0gKHJkYXRhMzI+PjE2KSYweGZmZmY7CisJICAgIGlmIChtdl9oaSAmIDB4ODAwMCkKKwkJCW12X2hpID0gMHg4MDAwIC0gbXZfaGk7CisjaWZkZWYgREVCVUdfUU9TCisJICAgIHByX2luZm8oIiBbUGljdHVyZSAlZCBRdWFsaXR5XSBNVlhfTDAgTUFYIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9oaSk7CisjZW5kaWYKKwkJcGljdHVyZS0+bWF4X212ID0gbXZfaGk7CisKKwkgICAgbXZfbG8gPSAocmRhdGEzMj4+MCkmMHhmZmZmOworCSAgICBpZiAobXZfbG8gJiAweDgwMDApCisJCQltdl9sbyA9IDB4ODAwMCAtIG12X2xvOworI2lmZGVmIERFQlVHX1FPUworCSAgICBwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZYX0wwIE1JTiA6ICVkXG4iLAorCQkJcGljX251bWJlciwgbXZfbG8pOworI2VuZGlmCisJCXBpY3R1cmUtPm1pbl9tdiA9IG12X2xvOworCisjaWZkZWYgREVCVUdfUU9TCisJCS8qIHttdnlfTDBfbWF4LCBtdnlfTDBfbWlufSAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKFZERUNfUElDX1FVQUxJVFlfREFUQSk7CisJICAgIG12X2hpID0gKHJkYXRhMzI+PjE2KSYweGZmZmY7CisJICAgIGlmIChtdl9oaSAmIDB4ODAwMCkKKwkJCW12X2hpID0gMHg4MDAwIC0gbXZfaGk7CisJICAgIHByX2luZm8oIiBbUGljdHVyZSAlZCBRdWFsaXR5XSBNVllfTDAgTUFYIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9oaSk7CisKKworCSAgICBtdl9sbyA9IChyZGF0YTMyPj4wKSYweGZmZmY7CisJICAgIGlmIChtdl9sbyAmIDB4ODAwMCkKKwkJCW12X2xvID0gMHg4MDAwIC0gbXZfbG87CisKKwkgICAgcHJfaW5mbygiIFtQaWN0dXJlICVkIFF1YWxpdHldIE1WWV9MMCBNSU4gOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIG12X2xvKTsKKworCisJCS8qIHttdnhfTDFfbWF4LCBtdnhfTDFfbWlufSAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKFZERUNfUElDX1FVQUxJVFlfREFUQSk7CisJICAgIG12X2hpID0gKHJkYXRhMzI+PjE2KSYweGZmZmY7CisJICAgIGlmIChtdl9oaSAmIDB4ODAwMCkKKwkJCW12X2hpID0gMHg4MDAwIC0gbXZfaGk7CisKKwkgICAgcHJfaW5mbygiIFtQaWN0dXJlICVkIFF1YWxpdHldIE1WWF9MMSBNQVggOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIG12X2hpKTsKKworCisJICAgIG12X2xvID0gKHJkYXRhMzI+PjApJjB4ZmZmZjsKKwkgICAgaWYgKG12X2xvICYgMHg4MDAwKQorCQkJbXZfbG8gPSAweDgwMDAgLSBtdl9sbzsKKworCSAgICBwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZYX0wxIE1JTiA6ICVkXG4iLAorCQkJcGljX251bWJlciwgbXZfbG8pOworCisKKwkJLyoge212eV9MMV9tYXgsIG12eV9MMV9taW59ICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkgICAgbXZfaGkgPSAocmRhdGEzMj4+MTYpJjB4ZmZmZjsKKwkgICAgaWYgKG12X2hpICYgMHg4MDAwKQorCQkJbXZfaGkgPSAweDgwMDAgLSBtdl9oaTsKKworCSAgICBwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZZX0wxIE1BWCA6ICVkXG4iLAorCQkJcGljX251bWJlciwgbXZfaGkpOworCisJICAgIG12X2xvID0gKHJkYXRhMzI+PjApJjB4ZmZmZjsKKwkgICAgaWYgKG12X2xvICYgMHg4MDAwKQorCQkJbXZfbG8gPSAweDgwMDAgLSBtdl9sbzsKKworCSAgICBwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZZX0wxIE1JTiA6ICVkXG4iLAorCQkJcGljX251bWJlciwgbXZfbG8pOworI2VuZGlmCisKKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhWREVDX1BJQ19RVUFMSVRZX0NUUkwpOworI2lmZGVmIERFQlVHX1FPUworCSAgICBwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gQWZ0ZXIgUmVhZCA6IFZERUNfUElDX1FVQUxJVFlfQ1RSTCA6IDB4JXhcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyKTsKKyNlbmRpZgorCQkvKiByZXNldCBhbGwgY291bnRzICovCisJICAgIFdSSVRFX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9DVFJMLCAoMTw8OCkpOworCX0KK30KKworc3RhdGljIGludCBnZXRfZGVjX2RwYl9zaXplKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcsIGludCBtYl93aWR0aCwKKwkJaW50IG1iX2hlaWdodCkKK3sKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9ICZody0+ZHBiOworCWludCBwaWNfc2l6ZSA9IG1iX3dpZHRoICogbWJfaGVpZ2h0ICogMzg0OworCWludCBzaXplID0gMCwgc2l6ZV92dWk7CisJaW50IGxldmVsX2lkYyA9IHBfSDI2NF9EcGItPm1TUFMubGV2ZWxfaWRjOworCisJc3dpdGNoIChsZXZlbF9pZGMpIHsKKwljYXNlIDk6CisJCXNpemUgPSAxNTIwNjQ7CisJCWJyZWFrOworCWNhc2UgMTA6CisJCXNpemUgPSAxNTIwNjQ7CisJCWJyZWFrOworCWNhc2UgMTE6CisJCXNpemUgPSAzNDU2MDA7CisJCWJyZWFrOworCWNhc2UgMTI6CisJCXNpemUgPSA5MTIzODQ7CisJCWJyZWFrOworCWNhc2UgMTM6CisJCXNpemUgPSA5MTIzODQ7CisJCWJyZWFrOworCWNhc2UgMjA6CisJCXNpemUgPSA5MTIzODQ7CisJCWJyZWFrOworCWNhc2UgMjE6CisJCXNpemUgPSAxODI0NzY4OworCQlicmVhazsKKwljYXNlIDIyOgorCQlzaXplID0gMzExMDQwMDsKKwkJYnJlYWs7CisJY2FzZSAzMDoKKwkJc2l6ZSA9IDMxMTA0MDA7CisJCWJyZWFrOworCWNhc2UgMzE6CisJCXNpemUgPSA2OTEyMDAwOworCQlicmVhazsKKwljYXNlIDMyOgorCQlzaXplID0gNzg2NDMyMDsKKwkJYnJlYWs7CisJY2FzZSA0MDoKKwkJc2l6ZSA9IDEyNTgyOTEyOworCQlicmVhazsKKwljYXNlIDQxOgorCQlzaXplID0gMTI1ODI5MTI7CisJCWJyZWFrOworCWNhc2UgNDI6CisJCXNpemUgPSAxMzM2OTM0NDsKKwkJYnJlYWs7CisJY2FzZSA1MDoKKwkJc2l6ZSA9IDQyMzkzNjAwOworCQlicmVhazsKKwljYXNlIDUxOgorCWNhc2UgNTI6CisJZGVmYXVsdDoKKwkJc2l6ZSA9IDcwNzc4ODgwOworCQlicmVhazsKKwl9CisKKwlzaXplIC89IHBpY19zaXplOworCXNpemUgPSBpbWluKHNpemUsIDE2KTsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCQkibGV2ZWxfaWRjID0gJWQgcGljX3NpemUgPSAlZCBzaXplID0gJWRcbiIsCisJCQkJbGV2ZWxfaWRjLCBwaWNfc2l6ZSwgc2l6ZSk7CisJaWYgKHBfSDI2NF9EcGItPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnKSB7CisJCWlmICgoaW50KXBfSDI2NF9EcGItPm1heF9kZWNfZnJhbWVfYnVmZmVyaW5nID4gc2l6ZSkgeworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkJIm1heF9kZWNfZnJhbWVfYnVmZmVyaW5nIGxhcmdlciB0aGFuIE1heERwYlNpemUuXG4iKTsKKwkJfQorCQlzaXplX3Z1aSA9IGltYXggKDEsIHBfSDI2NF9EcGItPm1heF9kZWNfZnJhbWVfYnVmZmVyaW5nKTsKKwkJaWYgKHNpemVfdnVpIDwgc2l6ZSkgeworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkJIldhcm5pbmc6IG1heF9kZWNfZnJhbWVfYnVmZmVyaW5nKCVkKSBpcyBsZXNzIHRoYW4gRFBCIHNpemUoJWQpIGNhbGN1bGF0ZWQgZnJvbSBQcm9maWxlL0xldmVsLlxuIiwKKwkJCQlzaXplX3Z1aSwgc2l6ZSk7CisJCX0KKwkJc2l6ZSA9IHNpemVfdnVpOworCX0KKworCXNpemUgKz0gMjsJLyogbmVlZCB0d28gbW9yZSBidWZmZXIgKi8KKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgaW50IGdldF9kZWNfZHBiX3NpemVfYWN0aXZlKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcsIHUzMiBwYXJhbTEpCit7CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisjZW5kaWYKKwlpbnQgbWJfd2lkdGgsIG1iX3RvdGFsOworCWludCBtYl9oZWlnaHQgPSAwOworCWludCBhY3RpdmVfYnVmZmVyX3NwZWNfbnVtLCBkZWNfZHBiX3NpemU7CisJdTMyIHVzZWRfcmVvcmRlcl9kcGJfc2l6ZV9tYXJnaW4KKwkJCT0gaHctPnJlb3JkZXJfZHBiX3NpemVfbWFyZ2luOworCisJbWJfd2lkdGggPSBwYXJhbTEgJiAweGZmOworCW1iX3RvdGFsID0gKHBhcmFtMSA+PiA4KSAmIDB4ZmZmZjsKKwlpZiAoIW1iX3dpZHRoICYmIG1iX3RvdGFsKSAvKmZvciA0azJrKi8KKwkJbWJfd2lkdGggPSAyNTY7CisJaWYgKG1iX3dpZHRoKQorCQltYl9oZWlnaHQgPSBtYl90b3RhbC9tYl93aWR0aDsKKwlpZiAobWJfd2lkdGggPD0gMCB8fCBtYl9oZWlnaHQgPD0gMCB8fAorCQlpc19vdmVyc2l6ZShtYl93aWR0aCA8PCA0LCBtYl9oZWlnaHQgPDwgNCkpIHsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkiISEhd3JvbmcgcGFyYW0xIDB4JXggbWJfd2lkdGgvbWJfaGVpZ2h0ICgweCV4LzB4JXgpICV4XHJcbiIsCisJCQlwYXJhbTEsCisJCQltYl93aWR0aCwKKwkJCW1iX2hlaWdodCk7CisJCWh3LT5lcnJvcl9mcmFtZV93aWR0aCA9IG1iX3dpZHRoIDw8IDQ7CisJCWh3LT5lcnJvcl9mcmFtZV9oZWlnaHQgPSBtYl9oZWlnaHQgPDwgNDsKKwkJcmV0dXJuIC0xOworCX0KKwlody0+ZXJyb3JfZnJhbWVfd2lkdGggPSAwOworCWh3LT5lcnJvcl9mcmFtZV9oZWlnaHQgPSAwOworCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwkJaWYgKHZkZWMtPm1hc3RlciB8fCB2ZGVjLT5zbGF2ZSkKKwkJCXVzZWRfcmVvcmRlcl9kcGJfc2l6ZV9tYXJnaW4gPQorCQkJCXJlb3JkZXJfZHBiX3NpemVfbWFyZ2luX2R2OworI2VuZGlmCisKKwlkZWNfZHBiX3NpemUgPSBnZXRfZGVjX2RwYl9zaXplKGh3ICwgbWJfd2lkdGgsIG1iX2hlaWdodCk7CisKKwlhY3RpdmVfYnVmZmVyX3NwZWNfbnVtID0KKwkJZGVjX2RwYl9zaXplCisJCSsgdXNlZF9yZW9yZGVyX2RwYl9zaXplX21hcmdpbjsKKworCWlmIChhY3RpdmVfYnVmZmVyX3NwZWNfbnVtID4gTUFYX1ZGX0JVRl9OVU0pIHsKKwkJYWN0aXZlX2J1ZmZlcl9zcGVjX251bSA9IE1BWF9WRl9CVUZfTlVNOworCQlkZWNfZHBiX3NpemUgPSBhY3RpdmVfYnVmZmVyX3NwZWNfbnVtCisJCQktIHVzZWRfcmVvcmRlcl9kcGJfc2l6ZV9tYXJnaW47CisJfQorCisJaHctPmRwYi5tRFBCLnNpemUgPSBhY3RpdmVfYnVmZmVyX3NwZWNfbnVtOworCisJaWYgKGh3LT5ub19wb2NfcmVvcmRlcl9mbGFnKQorCQlkZWNfZHBiX3NpemUgPSAxOworCisJcmV0dXJuIGRlY19kcGJfc2l6ZTsKK30KKworc3RhdGljIHZvaWQgdmgyNjRfY29uZmlnX2NhbnZzX2Zvcl9tbXUoc3RydWN0IHZkZWNfaDI2NF9od19zICpodykKK3sKKwlpbnQgaSwgajsKKworCWlmIChody0+ZG91YmxlX3dyaXRlX21vZGUpIHsKKwkJbXV0ZXhfbG9jaygmdm1oMjY0X211dGV4KTsKKwkJaWYgKGh3LT5kZWNvZGVfcGljX2NvdW50ID09IDApIHsKKwkJCWZvciAoaiA9IDA7IGogPCBody0+ZHBiLm1EUEIuc2l6ZTsgaisrKSB7CisJCQkJaSA9IGdldF9idWZfc3BlY19ieV9jYW52YXNfcG9zKGh3LCBqKTsKKwkJCQlpZiAoaSA+PSAwKQorCQkJCQljb25maWdfZGVjb2RlX2NhbnZhc19leChodywgaSk7CisJCQl9CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZ2bWgyNjRfbXV0ZXgpOworCX0KK30KKworc3RhdGljIGludCB2aDI2NF9zZXRfcGFyYW1zKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcsCisJdTMyIHBhcmFtMSwgdTMyIHBhcmFtMiwgdTMyIHBhcmFtMywgdTMyIHBhcmFtNCwgYm9vbCBidWZmZXJfcmVzZXRfZmxhZykKK3sKKwlpbnQgaSwgajsKKwlpbnQgbWJfd2lkdGgsIG1iX3RvdGFsOworCWludCBtYXhfcmVmZXJlbmNlX3NpemUsIGxldmVsX2lkYzsKKwlpbnQgbWJfaGVpZ2h0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCS8qaW50IG1iX212X2J5dGU7Ki8KKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisJdTMyIHNlcV9pbmZvMjsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgYWN0aXZlX2J1ZmZlcl9zcGVjX251bTsKKwl1bnNpZ25lZCBpbnQgYnVmX3NpemU7CisJdW5zaWduZWQgaW50IGZyYW1lX21ic19vbmx5X2ZsYWc7CisJdW5zaWduZWQgaW50IGNocm9tYV9mb3JtYXRfaWRjOworCXVuc2lnbmVkIGludCBjcm9wX2JvdHRvbSwgY3JvcF9yaWdodDsKKwl1bnNpZ25lZCBpbnQgdXNlZF9yZW9yZGVyX2RwYl9zaXplX21hcmdpbgorCQk9IGh3LT5yZW9yZGVyX2RwYl9zaXplX21hcmdpbjsKKwl1OCAqY29sb2NhdGVfdmFkZHIgPSBOVUxMOworCWludCBkZWNfZHBiX3NpemVfY2hhbmdlID0gMDsKKworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJaWYgKHZkZWMtPm1hc3RlciB8fCB2ZGVjLT5zbGF2ZSkKKwkJdXNlZF9yZW9yZGVyX2RwYl9zaXplX21hcmdpbiA9CisJCQlyZW9yZGVyX2RwYl9zaXplX21hcmdpbl9kdjsKKyNlbmRpZgorCXNlcV9pbmZvMiA9IHBhcmFtMTsKKwlody0+c2VxX2luZm8gPSBwYXJhbTI7CisKKwltYl93aWR0aCA9IHNlcV9pbmZvMiAmIDB4ZmY7CisJbWJfdG90YWwgPSAoc2VxX2luZm8yID4+IDgpICYgMHhmZmZmOworCWlmICghbWJfd2lkdGggJiYgbWJfdG90YWwpIC8qZm9yIDRrMmsqLworCQltYl93aWR0aCA9IDI1NjsKKwlpZiAobWJfd2lkdGgpCisJCW1iX2hlaWdodCA9IG1iX3RvdGFsL21iX3dpZHRoOworCWlmIChtYl93aWR0aCA8PSAwIHx8IG1iX2hlaWdodCA8PSAwIHx8CisJCWlzX292ZXJzaXplKG1iX3dpZHRoIDw8IDQsIG1iX2hlaWdodCA8PCA0KSkgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSIhISF3cm9uZyBzZXFfaW5mbzIgMHgleCBtYl93aWR0aC9tYl9oZWlnaHQgKDB4JXgvMHgleCkgJXhcclxuIiwKKwkJCXNlcV9pbmZvMiwKKwkJCW1iX3dpZHRoLAorCQkJbWJfaGVpZ2h0KTsKKwkJCWh3LT5lcnJvcl9mcmFtZV93aWR0aCA9IG1iX3dpZHRoIDw8IDQ7CisJCQlody0+ZXJyb3JfZnJhbWVfaGVpZ2h0ID0gbWJfaGVpZ2h0IDw8IDQ7CisJCXJldHVybiAtMTsKKwl9CisJaHctPmVycm9yX2ZyYW1lX3dpZHRoID0gMDsKKwlody0+ZXJyb3JfZnJhbWVfaGVpZ2h0ID0gMDsKKworCWRlY19kcGJfc2l6ZV9jaGFuZ2UgPSBody0+Y3NkX2NoYW5nZV9mbGFnICYmIChody0+ZHBiLmRlY19kcGJfc2l6ZSAhPSBnZXRfZGVjX2RwYl9zaXplX2FjdGl2ZShodywgcGFyYW0xKSk7CisKKwlpZiAoKChzZXFfaW5mbzIgIT0gMCAmJgorCQlody0+c2VxX2luZm8yICE9IHNlcV9pbmZvMikgfHwgaHctPmNzZF9jaGFuZ2VfZmxhZykgJiYKKwkJaHctPnNlcV9pbmZvMiAhPSAwCisJCSkgeworCQlpZiAoaHctPnNlcV9pbmZvMiAhPSBzZXFfaW5mbzIgfHwgZGVjX2RwYl9zaXplX2NoYW5nZSkgeyAvKnBpY3R1cmUgc2l6ZSBjaGFuZ2VkKi8KKwkJCWgyNjRfcmVjb25maWcoaHcpOworCQl9IGVsc2UgeworCQkJLypzb21ldGluZyBjaGFuZ2VzIGFuZCBub3QgaW5jbHVkaW5nIGRwYl9zaXplLCB3aWR0aCwgaGVpZ2h0LCAuLi4qLworCQkJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSAmaHctPmRwYjsKKwkJCXUzMiByZWdfdmFsID0gcGFyYW00OworCQkJbWF4X3JlZmVyZW5jZV9zaXplID0gKHJlZ192YWwgPj4gOCkgJiAweGZmOworCQkJaHctPmRwYi5yZW9yZGVyX291dHB1dCA9IG1heF9yZWZlcmVuY2Vfc2l6ZTsKKworCQkJaWYgKHBfSDI2NF9EcGItPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnICYmCisJCQkJcF9IMjY0X0RwYi0+bnVtX3Jlb3JkZXJfZnJhbWVzIDw9IHBfSDI2NF9EcGItPm1heF9kZWNfZnJhbWVfYnVmZmVyaW5nICYmCisJCQkJcF9IMjY0X0RwYi0+bnVtX3Jlb3JkZXJfZnJhbWVzID49IDApIHsKKwkJCQlody0+ZHBiLnJlb3JkZXJfb3V0cHV0ID0gaHctPm51bV9yZW9yZGVyX2ZyYW1lcyArIDE7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoaHctPmNvbmZpZ19idWZtZ3JfZG9uZSA9PSAwKSB7CisJCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gJmh3LT5kcGI7CisJCXUzMiByZWdfdmFsOworCQlpbnQgc3ViX3dpZHRoX2MgPSAwLCBzdWJfaGVpZ2h0X2MgPSAwOworCisJCWh3LT5jZmdfcGFyYW0xID0gcGFyYW0xOworCQlody0+Y2ZnX3BhcmFtMiA9IHBhcmFtMjsKKwkJaHctPmNmZ19wYXJhbTMgPSBwYXJhbTM7CisJCWh3LT5jZmdfcGFyYW00ID0gcGFyYW00OworCisJCWh3LT5zZXFfaW5mbzIgPSBzZXFfaW5mbzI7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJIkFWX1NDUkFUQ0hfMSA9ICV4LCBBVl9TQ1JBVENIXzIgJXhcclxuIiwKKwkJCXNlcV9pbmZvMiwgaHctPnNlcV9pbmZvKTsKKworCQlkcGJfaW5pdF9nbG9iYWwoJmh3LT5kcGIsCisJCQlERUNPREVfSUQoaHcpLCAwLCAwKTsKKworCQlwX0gyNjRfRHBiLT5mYXN0X291dHB1dF9lbmFibGUgPSBmYXN0X291dHB1dF9lbmFibGU7CisJCS8qbWJfbXZfYnl0ZSA9IChzZXFfaW5mbzIgJiAweDgwMDAwMDAwKSA/IDI0IDogOTY7Ki8KKwkJaWYgKGh3LT5lbmFibGVfZmVuY2UpCisJCQlwX0gyNjRfRHBiLT5mYXN0X291dHB1dF9lbmFibGUgPSBIMjY0X09VVFBVVF9NT0RFX0ZBU1Q7CisjaWYgMQorCQkvKmNyb3AqLworCQkvKiBBVl9TQ1JBVENIXzIKKwkJICAgYml0IDE1OiBmcmFtZV9tYnNfb25seV9mbGFnCisJCSAgIGJpdCAxMy0xNDogY2hyb21hX2Zvcm1hdF9pZGMgKi8KKwkJZnJhbWVfbWJzX29ubHlfZmxhZyA9IChody0+c2VxX2luZm8gPj4gMTUpICYgMHgwMTsKKwkJaWYgKHBfSDI2NF9EcGItPm1TUFMucHJvZmlsZV9pZGMgIT0gMTAwICYmCisJCQlwX0gyNjRfRHBiLT5tU1BTLnByb2ZpbGVfaWRjICE9IDExMCAmJgorCQkJcF9IMjY0X0RwYi0+bVNQUy5wcm9maWxlX2lkYyAhPSAxMjIgJiYKKwkJCXBfSDI2NF9EcGItPm1TUFMucHJvZmlsZV9pZGMgIT0gMTQ0KSB7CisJCQlwX0gyNjRfRHBiLT5jaHJvbWFfZm9ybWF0X2lkYyA9IDE7CisJCX0KKwkJY2hyb21hX2Zvcm1hdF9pZGMgPSBwX0gyNjRfRHBiLT5jaHJvbWFfZm9ybWF0X2lkYzsKKworCQkvKiBAQVZfU0NSQVRDSF82LjMxLTE2ID0gIChsZWZ0ICA8PCA4IHwgcmlnaHQgKSA8PCAxCisJCSAgIEBBVl9TQ1JBVENIXzYuMTUtMCAgID0gICh0b3AgPDwgOCAgfCBib3R0b20gKSA8PAorCQkgICAoMiAtIGZyYW1lX21ic19vbmx5X2ZsYWcpICovCisKKwkJc3dpdGNoIChjaHJvbWFfZm9ybWF0X2lkYykgeworCQkJY2FzZSAxOgorCQkJCXN1Yl93aWR0aF9jID0gMjsKKwkJCQlzdWJfaGVpZ2h0X2MgPSAyOworCQkJCWJyZWFrOworCisJCQljYXNlIDI6CisJCQkJc3ViX3dpZHRoX2MgPSAyOworCQkJCXN1Yl9oZWlnaHRfYyA9IDE7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMzoKKwkJCQlzdWJfd2lkdGhfYyA9IDE7CisJCQkJc3ViX2hlaWdodF9jID0gMTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChjaHJvbWFfZm9ybWF0X2lkYyA9PSAwKSB7CisJCQljcm9wX3JpZ2h0ID0gcF9IMjY0X0RwYi0+ZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQ7CisJCQljcm9wX2JvdHRvbSA9IHBfSDI2NF9EcGItPmZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCAqCisJCQkJKDIgLSBmcmFtZV9tYnNfb25seV9mbGFnKTsKKwkJfSBlbHNlIHsKKwkJCWNyb3BfcmlnaHQgPSBzdWJfd2lkdGhfYyAqIHBfSDI2NF9EcGItPmZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0OworCQkJY3JvcF9ib3R0b20gPSBzdWJfaGVpZ2h0X2MgKiBwX0gyNjRfRHBiLT5mcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQgKgorCQkJCSgyIC0gZnJhbWVfbWJzX29ubHlfZmxhZyk7CisJCX0KKworCQlwX0gyNjRfRHBiLT5tU1BTLmZyYW1lX21ic19vbmx5X2ZsYWcgPSBmcmFtZV9tYnNfb25seV9mbGFnOworCQlody0+ZnJhbWVfd2lkdGggPSBtYl93aWR0aCA8PCA0OworCQlody0+ZnJhbWVfaGVpZ2h0ID0gbWJfaGVpZ2h0IDw8IDQ7CisKKwkJaHctPmZyYW1lX3dpZHRoID0gaHctPmZyYW1lX3dpZHRoIC0gY3JvcF9yaWdodDsKKwkJaHctPmZyYW1lX2hlaWdodCA9IGh3LT5mcmFtZV9oZWlnaHQgLSBjcm9wX2JvdHRvbTsKKworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSJjaHJvbWFfZm9ybWF0X2lkYyA9ICVkIGZyYW1lX21ic19vbmx5X2ZsYWcgJWQsIGNyb3BfYm90dG9tICVkLCAgZnJhbWVfaGVpZ2h0ICVkLFxuIiwKKwkJCWNocm9tYV9mb3JtYXRfaWRjLCBmcmFtZV9tYnNfb25seV9mbGFnLCBjcm9wX2JvdHRvbSwgaHctPmZyYW1lX2hlaWdodCk7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJIm1iX2hlaWdodCAlZCxjcm9wX3JpZ2h0ICVkLCBmcmFtZV93aWR0aCAlZCwgbWJfd2lkdGggJWRcbiIsCisJCQltYl9oZWlnaHQsIGNyb3BfcmlnaHQsCisJCQlody0+ZnJhbWVfd2lkdGgsIG1iX3dpZHRoKTsKKworCQlpZiAoaHctPmZyYW1lX2hlaWdodCA9PSAxMDg4ICYmIChjcm9wX3JpZ2h0ICE9IDAgfHwgY3JvcF9ib3R0b20gIT0gMCkpCisJCQlody0+ZnJhbWVfaGVpZ2h0ID0gMTA4MDsKKyNlbmRpZgorCQlyZWdfdmFsID0gcGFyYW00OworCQlsZXZlbF9pZGMgPSByZWdfdmFsICYgMHhmZjsKKwkJcF9IMjY0X0RwYi0+bVNQUy5sZXZlbF9pZGMgPSBsZXZlbF9pZGM7CisJCW1heF9yZWZlcmVuY2Vfc2l6ZSA9IChyZWdfdmFsID4+IDgpICYgMHhmZjsKKwkJaHctPmRwYi5yZW9yZGVyX291dHB1dCA9IG1heF9yZWZlcmVuY2Vfc2l6ZTsKKwkJaHctPmRwYi5kZWNfZHBiX3NpemUgPQorCQkJZ2V0X2RlY19kcGJfc2l6ZShodyAsIG1iX3dpZHRoLCBtYl9oZWlnaHQpOworCQlpZiAoIWh3LT5tbXVfZW5hYmxlKSB7CisJCQltYl93aWR0aCA9IChtYl93aWR0aCszKSAmIDB4ZmZmZmZmZmM7CisJCQltYl9oZWlnaHQgPSAobWJfaGVpZ2h0KzMpICYgMHhmZmZmZmZmYzsKKwkJfQorCQltYl90b3RhbCA9IG1iX3dpZHRoICogbWJfaGVpZ2h0OworCQlody0+bWJfd2lkdGggPSBtYl93aWR0aDsKKwkJaHctPm1iX2hlaWdodCA9IG1iX2hlaWdodDsKKwkJaHctPm1iX3RvdGFsID0gbWJfdG90YWw7CisJCWlmIChody0+bW11X2VuYWJsZSkKKwkJCWhldmNfbWNyX3Nhb19nbG9iYWxfaHdfaW5pdChodywKKwkJCQkoaHctPm1iX3dpZHRoIDw8IDQpLCAoaHctPm1iX2hlaWdodCA8PCA0KSk7CisKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkibWIgaGVpZ2h0L3dpZGh0L3RvdGFsOiAleC8leC8leCBsZXZlbF9pZGMgJXggbWF4X3JlZl9udW0gJXhcbiIsCisJCQltYl9oZWlnaHQsIG1iX3dpZHRoLCBtYl90b3RhbCwKKwkJCWxldmVsX2lkYywgbWF4X3JlZmVyZW5jZV9zaXplKTsKKworCQlwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX3NpemUgPSBtYl90b3RhbCAqIDk2OworCisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJInJlc3RyaWN0aW9uX2ZsYWc9JWQsIG1heF9kZWNfZnJhbWVfYnVmZmVyaW5nPSVkLCBkZWNfZHBiX3NpemU9JWQgbnVtX3Jlb3JkZXJfZnJhbWVzICVkIHVzZWRfcmVvcmRlcl9kcGJfc2l6ZV9tYXJnaW4gJWRcbiIsCisJCQlody0+Yml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcsCisJCQlody0+bWF4X2RlY19mcmFtZV9idWZmZXJpbmcsCisJCQlody0+ZHBiLmRlY19kcGJfc2l6ZSwKKwkJCWh3LT5udW1fcmVvcmRlcl9mcmFtZXMsCisJCQl1c2VkX3Jlb3JkZXJfZHBiX3NpemVfbWFyZ2luKTsKKworCQlpZiAocF9IMjY0X0RwYi0+Yml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcgJiYKKwkJCXBfSDI2NF9EcGItPm51bV9yZW9yZGVyX2ZyYW1lcyA8PSBwX0gyNjRfRHBiLT5tYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZyAmJgorCQkJcF9IMjY0X0RwYi0+bnVtX3Jlb3JkZXJfZnJhbWVzID49IDApIHsKKwkJCWh3LT5kcGIucmVvcmRlcl9vdXRwdXQgPSBody0+bnVtX3Jlb3JkZXJfZnJhbWVzICsgMTsKKwkJfQorCisJCWFjdGl2ZV9idWZmZXJfc3BlY19udW0gPQorCQkJaHctPmRwYi5kZWNfZHBiX3NpemUKKwkJCSsgdXNlZF9yZW9yZGVyX2RwYl9zaXplX21hcmdpbjsKKwkJaHctPm1heF9yZWZlcmVuY2Vfc2l6ZSA9CisJCQltYXhfcmVmZXJlbmNlX3NpemUgKyByZWZlcmVuY2VfYnVmX21hcmdpbjsKKworCQlpZiAoYWN0aXZlX2J1ZmZlcl9zcGVjX251bSA+IE1BWF9WRl9CVUZfTlVNKSB7CisJCQlhY3RpdmVfYnVmZmVyX3NwZWNfbnVtID0gTUFYX1ZGX0JVRl9OVU07CisJCQlody0+ZHBiLmRlY19kcGJfc2l6ZSA9IGFjdGl2ZV9idWZmZXJfc3BlY19udW0KKwkJCQktIHVzZWRfcmVvcmRlcl9kcGJfc2l6ZV9tYXJnaW47CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCQkiYWN0aXZlX2J1ZmZlcl9zcGVjX251bSBpcyBsYXJnZXIgdGhhbiBNQVggJWQsIHNldCBkZWNfZHBiX3NpemUgdG8gJWRcbiIsCisJCQkJTUFYX1ZGX0JVRl9OVU0sIGh3LT5kcGIuZGVjX2RwYl9zaXplKTsKKwkJfQorCQlody0+ZHBiLm1EUEIuc2l6ZSA9IGFjdGl2ZV9idWZmZXJfc3BlY19udW07CisJCWlmIChody0+bWF4X3JlZmVyZW5jZV9zaXplID4gTUFYX1ZGX0JVRl9OVU0pCisJCQlody0+bWF4X3JlZmVyZW5jZV9zaXplID0gTUFYX1ZGX0JVRl9OVU07CisJCWh3LT5kcGIubWF4X3JlZmVyZW5jZV9zaXplID0gaHctPm1heF9yZWZlcmVuY2Vfc2l6ZTsKKworCQlpZiAoaHctPm5vX3BvY19yZW9yZGVyX2ZsYWcpCisJCQlody0+ZHBiLmRlY19kcGJfc2l6ZSA9IDE7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJIiVzIGFjdGl2ZV9idWZfc3BlY19udW0gJWQgZGVjX2RwYl9zaXplICVkIGNvbGxvY2F0ZV9idWZfbnVtICVkXHJcbiIsCisJCQlfX2Z1bmNfXywgYWN0aXZlX2J1ZmZlcl9zcGVjX251bSwKKwkJCWh3LT5kcGIuZGVjX2RwYl9zaXplLAorCQkJaHctPm1heF9yZWZlcmVuY2Vfc2l6ZSk7CisKKwkJaWYgKGh3LT5rcGlfZmlyc3RfaV9jb21taW5nID09IDApIHsKKwkJCWh3LT5rcGlfZmlyc3RfaV9jb21taW5nID0gMTsKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1ZERUNfREVUQUlMLAorCQkJCSJbdmRlY19rcGldWyVzXSBGaXJzdCBJIGZyYW1lIGNvbW1pbmcuXG4iLCBfX2Z1bmNfXyk7CisJCX0KKworCQlidWZfc2l6ZSA9IChody0+bWJfdG90YWwgPDwgOCkgKyAoaHctPm1iX3RvdGFsIDw8IDcpOworCisJCW11dGV4X2xvY2soJnZtaDI2NF9tdXRleCk7CisJCWlmICghaHctPm1tdV9lbmFibGUpIHsKKwkJCWlmICghYnVmZmVyX3Jlc2V0X2ZsYWcgfHwgaHctPmlzX3VzZWRfdjRsKQorCQkJCWNvbmZpZ19idWZfc3BlY3ModmRlYyk7CisJCQlpID0gZ2V0X2J1Zl9zcGVjX2J5X2NhbnZhc19wb3MoaHcsIDApOworCisJCQlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCQkJaWYgKGkgIT0gLTEpIHsKKwkJCQkJcHJfaW5mbygidjRsOiBkZWxheSBhbGxvYyB0aGUgYnVmZmVyLlxuIik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoKGkgIT0gLTEpICYmIGFsbG9jX29uZV9idWZfc3BlYyhodywgaSkgPj0gMCkKKwkJCQkJY29uZmlnX2RlY29kZV9jYW52YXMoaHcsIGkpOworCQkJCWVsc2UKKwkJCQkJcmV0ID0gLTE7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoaHctPmRvdWJsZV93cml0ZV9tb2RlKSB7CisJCQkJY29uZmlnX2J1Zl9zcGVjc19leCh2ZGVjKTsKKwkJCX0gZWxzZSB7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5idWZzcGVjX2xvY2ssIGZsYWdzKTsKKwkJCQlmb3IgKGkgPSAwLCBqID0gMDsKKwkJCQkJaiA8IGFjdGl2ZV9idWZmZXJfc3BlY19udW0KKwkJCQkJJiYgaSA8IEJVRlNQRUNfUE9PTF9TSVpFOworCQkJCQlpKyspIHsKKwkJCQkJaWYgKGh3LT5idWZmZXJfc3BlY1tpXS51c2VkICE9IC0xKQorCQkJCQkJY29udGludWU7CisJCQkJCWh3LT5idWZmZXJfc3BlY1tpXS51c2VkID0gMDsKKwkJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLgorCQkJCQkJYWxsb2NfaGVhZGVyX2FkZHIgPSAwOworCQkJCQlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX3BvcyA9IGo7CisJCQkJCWorKzsKKwkJCQl9CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmJ1ZnNwZWNfbG9jaywKKwkJCQkJZmxhZ3MpOworCQkJfQorCQkJaGV2Y19tY3JfY29uZmlnX2NhbnYyYXhpdGJsKGh3LCAwKTsKKwkJfQorCQltdXRleF91bmxvY2soJnZtaDI2NF9tdXRleCk7CisJCWlmIChkcGJfaXNfZGVidWcoREVDT0RFX0lEKGh3KSwKKwkJCVBSSU5UX0ZMQUdfRFVNUF9CVUZTUEVDKSkKKwkJCWR1bXBfYnVmc3BlYyhodywgX19mdW5jX18pOworCisjaWZkZWYgT05FX0NPTE9DQVRFX0JVRl9QRVJfREVDT0RFX0JVRgorCQlidWZfc2l6ZSA9IFBBR0VfQUxJR04oCisJCQlwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX3NpemUgKgorCQkJCQlhY3RpdmVfYnVmZmVyX3NwZWNfbnVtKTsKKyNlbHNlCisJCWJ1Zl9zaXplID0gUEFHRV9BTElHTigKKwkJCXBfSDI2NF9EcGItPmNvbG9jYXRlZF9idWZfc2l6ZSAqCisJCQkJCWh3LT5tYXhfcmVmZXJlbmNlX3NpemUpOworI2VuZGlmCisKKwkJaWYgKGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeShody0+Ym1tdV9ib3gsIEJNTVVfUkVGX0lEWCwKKwkJCWJ1Zl9zaXplLCBEUklWRVJfTkFNRSwKKwkJCSZody0+Y29sbG9jYXRlX2NtYV9hbGxvY19hZGRyKSA8IDApCisJCQlyZXR1cm4gLTE7CisJCWlmICghdmRlY19zZWN1cmUodmRlYykpIHsKKwkJCS8qIGNsZWFyIGZvciBzb21lIG1vc2FpYyBwcm9ibGVtIGFmdGVyIHJlc2V0IGJ1Zm1nciAqLworCQkJY29sb2NhdGVfdmFkZHIgPSBjb2RlY19tbV92bWFwKGh3LT5jb2xsb2NhdGVfY21hX2FsbG9jX2FkZHIsIGJ1Zl9zaXplKTsKKwkJCWlmIChjb2xvY2F0ZV92YWRkciAhPSBOVUxMKSB7CisJCQkJbWVtc2V0KGNvbG9jYXRlX3ZhZGRyLCAwLCBidWZfc2l6ZSk7CisJCQkJY29kZWNfbW1fZG1hX2ZsdXNoKGNvbG9jYXRlX3ZhZGRyLCBidWZfc2l6ZSwgRE1BX1RPX0RFVklDRSk7CisJCQkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcihjb2xvY2F0ZV92YWRkcik7CisJCQl9CisJCX0KKworCQlody0+ZHBiLmNvbG9jYXRlZF9tdl9hZGRyX3N0YXJ0ID0KKwkJCWh3LT5jb2xsb2NhdGVfY21hX2FsbG9jX2FkZHI7CisjaWZkZWYgT05FX0NPTE9DQVRFX0JVRl9QRVJfREVDT0RFX0JVRgorCQlody0+ZHBiLmNvbG9jYXRlZF9tdl9hZGRyX2VuZCAgPQorCQkJaHctPmRwYi5jb2xvY2F0ZWRfbXZfYWRkcl9zdGFydCArCisJCQkocF9IMjY0X0RwYi0+Y29sb2NhdGVkX2J1Zl9zaXplICoKKwkJCWFjdGl2ZV9idWZmZXJfc3BlY19udW0pOworI2Vsc2UKKwkJaHctPmRwYi5jb2xvY2F0ZWRfbXZfYWRkcl9lbmQgID0KKwkJCWh3LT5kcGIuY29sb2NhdGVkX212X2FkZHJfc3RhcnQgKworCQkJKHBfSDI2NF9EcGItPmNvbG9jYXRlZF9idWZfc2l6ZSAqCisJCQlody0+bWF4X3JlZmVyZW5jZV9zaXplKTsKKyNlbmRpZgorCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19ERUNfREVUQUlMLAorCQkJImNhbGxvY2F0ZSBjbWEsICVseCwgJXhcbiIsCisJCQlody0+Y29sbG9jYXRlX2NtYV9hbGxvY19hZGRyLAorCQkJaHctPmRwYi5jb2xvY2F0ZWRfbXZfYWRkcl9zdGFydCk7CisKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCwKKwkJCSJjb2xvY2F0ZWRfbXZfYWRkcl9zdGFydCAleCBjb2xvY2F0ZWRfbXZfYWRkcl9lbmQgJXhcbiIsCisJCQlody0+ZHBiLmNvbG9jYXRlZF9tdl9hZGRyX3N0YXJ0LAorCQkJaHctPmRwYi5jb2xvY2F0ZWRfbXZfYWRkcl9lbmQpOworCQlpZiAoIWh3LT5tbXVfZW5hYmxlKSB7CisJCQltdXRleF9sb2NrKCZ2bWgyNjRfbXV0ZXgpOworCQkJaWYgKHJldCA+PSAwICYmIGh3LT5kZWNvZGVfcGljX2NvdW50ID09IDApIHsKKwkJCQlpbnQgYnVmX2NudDsKKwkJCQkvKiBoMjY0X3JlY29uZmlnOiBhbGxvYyBsYXRlciovCisJCQkJYnVmX2NudCA9IGh3LT5kcGIubURQQi5zaXplOworCisJCQkJZm9yIChqID0gMTsgaiA8IGJ1Zl9jbnQ7IGorKykgeworCQkJCQlpID0gZ2V0X2J1Zl9zcGVjX2J5X2NhbnZhc19wb3MoaHcsIGopOworCisJCQkJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCQkJCXByX2luZm8oInY0bDogZGVsYXkgYWxsb2MgdGhlIGJ1ZmZlci5cbiIpOworCQkJCQkJYnJlYWs7CisJCQkJCX0gZWxzZSBpZiAoYWxsb2Nfb25lX2J1Zl9zcGVjKGh3LCBpKSA8IDApCisJCQkJCQlicmVhazsKKworCQkJCQljb25maWdfZGVjb2RlX2NhbnZhcyhodywgaSk7CisJCQkJfQorCQkJfQorCQkJbXV0ZXhfdW5sb2NrKCZ2bWgyNjRfbXV0ZXgpOworCQl9IGVsc2UgeworCQkJdmgyNjRfY29uZmlnX2NhbnZzX2Zvcl9tbXUoaHcpOworCQl9CisKKwkJaHctPmNvbmZpZ19idWZtZ3JfZG9uZSA9IDE7CisKKwkvKmVuZCBvZiAgY29uZmlnX2J1Zm1ncl9kb25lICovCisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdnVpX2NvbmZpZyhzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3KQoreworCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gJmh3LT5kcGI7CisJaW50IGFzcGVjdF9yYXRpb19pbmZvX3ByZXNlbnRfZmxhZywgYXNwZWN0X3JhdGlvX2lkYzsKKwkvKnRpbWUqLworCWh3LT5udW1fdW5pdHNfaW5fdGljayA9IHBfSDI2NF9EcGItPm51bV91bml0c19pbl90aWNrOworCWh3LT50aW1lX3NjYWxlID0gcF9IMjY0X0RwYi0+dGltZV9zY2FsZTsKKwlody0+dGltaW5nX2luZm9fcHJlc2VudF9mbGFnID0gcF9IMjY0X0RwYi0+dnVpX3N0YXR1cyAmIDB4MjsKKworCWh3LT5iaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZyA9CisJCXBfSDI2NF9EcGItPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnOworCWh3LT5udW1fcmVvcmRlcl9mcmFtZXMgPQorCQlwX0gyNjRfRHBiLT5udW1fcmVvcmRlcl9mcmFtZXM7CisJaHctPm1heF9kZWNfZnJhbWVfYnVmZmVyaW5nID0KKwkJcF9IMjY0X0RwYi0+bWF4X2RlY19mcmFtZV9idWZmZXJpbmc7CisKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkidnVpX2NvbmZpZzogcGRiICVkLCAlZCwgJWRcbiIsCisJCXBfSDI2NF9EcGItPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnLAorCQlwX0gyNjRfRHBiLT5udW1fcmVvcmRlcl9mcmFtZXMsCisJCXBfSDI2NF9EcGItPm1heF9kZWNfZnJhbWVfYnVmZmVyaW5nKTsKKworCWh3LT5maXhlZF9mcmFtZV9yYXRlX2ZsYWcgPSAwOworCWlmIChody0+dGltaW5nX2luZm9fcHJlc2VudF9mbGFnKSB7CisJCWh3LT5maXhlZF9mcmFtZV9yYXRlX2ZsYWcgPQorCQkJcF9IMjY0X0RwYi0+Zml4ZWRfZnJhbWVfcmF0ZV9mbGFnOworCisJCWlmICgoKGh3LT5udW1fdW5pdHNfaW5fdGljayAqIDEyMCkgPj0gaHctPnRpbWVfc2NhbGUgJiYKKwkJCSgoIWh3LT5zeW5jX291dHNpZGUpIHx8CisJCQkJKCFody0+ZnJhbWVfZHVyKSkpCisJCQkmJiBody0+bnVtX3VuaXRzX2luX3RpY2sgJiYgaHctPnRpbWVfc2NhbGUpIHsKKwkJCWlmIChody0+dXNlX2lkcl9mcmFtZXJhdGUgfHwKKwkJCQlody0+Zml4ZWRfZnJhbWVfcmF0ZV9mbGFnIHx8CisJCQkJIWh3LT5mcmFtZV9kdXIgfHwKKwkJCQkhaHctPmR1cmF0aW9uX2Zyb21fcHRzX2RvbmUKKwkJCQkvKnx8IHZoMjY0X3J1bm5pbmcqLykgeworCQkJCXUzMiBmcmFtZV9kdXJfZXMgPQorCQkJCWRpdl91NjQoOTYwMDBVTEwgKiAyICogaHctPm51bV91bml0c19pbl90aWNrLAorCQkJCQlody0+dGltZV9zY2FsZSk7CisJCQkJaWYgKGh3LT5mcmFtZV9kdXIgIT0gZnJhbWVfZHVyX2VzKSB7CisJCQkJCWh3LT5oMjY0X2ZpcnN0X3ZhbGlkX3B0c19yZWFkeSA9IGZhbHNlOworCQkJCQlody0+aDI2NHB0czEgPSAwOworCQkJCQlody0+aDI2NHB0czIgPSAwOworCQkJCQlody0+aDI2NF9wdHNfY291bnQgPSAwOworCQkJCQlody0+ZHVyYXRpb25fZnJvbV9wdHNfZG9uZSA9IDA7CisJCQkJCWZpeGVkX2ZyYW1lX3JhdGVfbW9kZSA9CisJCQkJCQlGSVhfRlJBTUVfUkFURV9PRkY7CisJCQkJCWh3LT5wdHNfZHVyYXRpb24gPSAwOworCQkJCQlody0+ZnJhbWVfZHVyID0gZnJhbWVfZHVyX2VzOworCQkJCQlpZiAoIWh3LT5maXhlZF9mcmFtZV9yYXRlX2ZsYWcgJiYgKHBfSDI2NF9EcGItPm1TUFMucHJvZmlsZV9pZGMgIT0gQkFTRUxJTkUpKSB7CisJCQkJCQlpZiAoZnJhbWVfZHVyX2VzID09IDc2ODApCisJCQkJCQkJaHctPmZyYW1lX2R1ciA9IGZyYW1lX2R1cl9lcyAvMjsKKwkJCQkJfQorCQkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT5ub3RpZnlfd29yayk7CisJCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLAorCQkJCQkJUFJJTlRfRkxBR19ERUNfREVUQUlMLAorCQkJCQkJImZyYW1lX2R1ciAlZCBmcm9tIHRpbWluZ19pbmZvXG4iLAorCQkJCQkJaHctPmZyYW1lX2R1cik7CisJCQkJfQorCisJCQkJLypoYWNrIHRvIGF2b2lkIHVzZSBFUyBmcmFtZSBkdXJhdGlvbiB3aGVuCisJCQkJICppdCdzIGhhbGYgb2YgdGhlIHJhdGUgZnJvbSBzeXN0ZW0gaW5mbworCQkJCSAqIHNvbWV0aW1lcyB0aGUgZW5jb2RlciBpcyBnaXZlbiBhIHdyb25nCisJCQkJICogZnJhbWUgcmF0ZSBidXQgdGhlIHN5c3RlbSBzaWRlIGluZm9ybWF0aW9uCisJCQkJICogaXMgbW9yZSByZWxpYWJsZQorCQkJCSAqaWYgKChmcmFtZV9kdXIgKiAyKSAhPSBmcmFtZV9kdXJfZXMpIHsKKwkJCQkgKiAgICBmcmFtZV9kdXIgPSBmcmFtZV9kdXJfZXM7CisJCQkJICp9CisJCQkJICovCisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19ERUNfREVUQUlMLAorCQkJIkguMjY0OiB0aW1pbmdfaW5mbyBub3QgcHJlc2VudFxuIik7CisJfQorCisJLyphc3BlY3QgcmF0aW8qLworCWFzcGVjdF9yYXRpb19pbmZvX3ByZXNlbnRfZmxhZyA9CisJCXBfSDI2NF9EcGItPnZ1aV9zdGF0dXMgJiAweDE7CisJYXNwZWN0X3JhdGlvX2lkYyA9IHBfSDI2NF9EcGItPmFzcGVjdF9yYXRpb19pZGM7CisKKwlpZiAoYXNwZWN0X3JhdGlvX2luZm9fcHJlc2VudF9mbGFnKSB7CisJCWlmIChhc3BlY3RfcmF0aW9faWRjID09IEVYVEVORF9TQVIpIHsKKwkJCWh3LT5oMjY0X2FyID0gMHgzZmY7CisJCQlody0+aGVpZ2h0X2FzcGVjdF9yYXRpbyA9CisJCQkJcF9IMjY0X0RwYi0+YXNwZWN0X3JhdGlvX3Nhcl9oZWlnaHQ7CisJCQlody0+d2lkdGhfYXNwZWN0X3JhdGlvID0KKwkJCQlwX0gyNjRfRHBiLT5hc3BlY3RfcmF0aW9fc2FyX3dpZHRoOworCQl9IGVsc2UgeworCQkJLyogcHJfaW5mbygidjI2NGRlYzogYXNwZWN0X3JhdGlvX2lkYyA9ICVkXG4iLAorCQkJICAgYXNwZWN0X3JhdGlvX2lkYyk7ICovCisKKwkJCXN3aXRjaCAoYXNwZWN0X3JhdGlvX2lkYykgeworCQkJY2FzZSAxOgorCQkJCWh3LT5oMjY0X2FyID0gMHgzZmY7CisJCQkJaHctPmhlaWdodF9hc3BlY3RfcmF0aW8gPSAxOworCQkJCWh3LT53aWR0aF9hc3BlY3RfcmF0aW8gPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCWh3LT5oMjY0X2FyID0gMHgzZmY7CisJCQkJaHctPmhlaWdodF9hc3BlY3RfcmF0aW8gPSAxMTsKKwkJCQlody0+d2lkdGhfYXNwZWN0X3JhdGlvID0gMTI7CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJaHctPmgyNjRfYXIgPSAweDNmZjsKKwkJCQlody0+aGVpZ2h0X2FzcGVjdF9yYXRpbyA9IDExOworCQkJCWh3LT53aWR0aF9hc3BlY3RfcmF0aW8gPSAxMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQlody0+aDI2NF9hciA9IDB4M2ZmOworCQkJCWh3LT5oZWlnaHRfYXNwZWN0X3JhdGlvID0gMTE7CisJCQkJaHctPndpZHRoX2FzcGVjdF9yYXRpbyA9IDE2OworCQkJCWJyZWFrOworCQkJY2FzZSA1OgorCQkJCWh3LT5oMjY0X2FyID0gMHgzZmY7CisJCQkJaHctPmhlaWdodF9hc3BlY3RfcmF0aW8gPSAzMzsKKwkJCQlody0+d2lkdGhfYXNwZWN0X3JhdGlvID0gNDA7CisJCQkJYnJlYWs7CisJCQljYXNlIDY6CisJCQkJaHctPmgyNjRfYXIgPSAweDNmZjsKKwkJCQlody0+aGVpZ2h0X2FzcGVjdF9yYXRpbyA9IDExOworCQkJCWh3LT53aWR0aF9hc3BlY3RfcmF0aW8gPSAyNDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNzoKKwkJCQlody0+aDI2NF9hciA9IDB4M2ZmOworCQkJCWh3LT5oZWlnaHRfYXNwZWN0X3JhdGlvID0gMTE7CisJCQkJaHctPndpZHRoX2FzcGVjdF9yYXRpbyA9IDIwOworCQkJCWJyZWFrOworCQkJY2FzZSA4OgorCQkJCWh3LT5oMjY0X2FyID0gMHgzZmY7CisJCQkJaHctPmhlaWdodF9hc3BlY3RfcmF0aW8gPSAxMTsKKwkJCQlody0+d2lkdGhfYXNwZWN0X3JhdGlvID0gMzI7CisJCQkJYnJlYWs7CisJCQljYXNlIDk6CisJCQkJaHctPmgyNjRfYXIgPSAweDNmZjsKKwkJCQlody0+aGVpZ2h0X2FzcGVjdF9yYXRpbyA9IDMzOworCQkJCWh3LT53aWR0aF9hc3BlY3RfcmF0aW8gPSA4MDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTA6CisJCQkJaHctPmgyNjRfYXIgPSAweDNmZjsKKwkJCQlody0+aGVpZ2h0X2FzcGVjdF9yYXRpbyA9IDExOworCQkJCWh3LT53aWR0aF9hc3BlY3RfcmF0aW8gPSAxODsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTE6CisJCQkJaHctPmgyNjRfYXIgPSAweDNmZjsKKwkJCQlody0+aGVpZ2h0X2FzcGVjdF9yYXRpbyA9IDExOworCQkJCWh3LT53aWR0aF9hc3BlY3RfcmF0aW8gPSAxNTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTI6CisJCQkJaHctPmgyNjRfYXIgPSAweDNmZjsKKwkJCQlody0+aGVpZ2h0X2FzcGVjdF9yYXRpbyA9IDMzOworCQkJCWh3LT53aWR0aF9hc3BlY3RfcmF0aW8gPSA2NDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTM6CisJCQkJaHctPmgyNjRfYXIgPSAweDNmZjsKKwkJCQlody0+aGVpZ2h0X2FzcGVjdF9yYXRpbyA9IDk5OworCQkJCWh3LT53aWR0aF9hc3BlY3RfcmF0aW8gPSAxNjA7CisJCQkJYnJlYWs7CisJCQljYXNlIDE0OgorCQkJCWh3LT5oMjY0X2FyID0gMHgzZmY7CisJCQkJaHctPmhlaWdodF9hc3BlY3RfcmF0aW8gPSAzOworCQkJCWh3LT53aWR0aF9hc3BlY3RfcmF0aW8gPSA0OworCQkJCWJyZWFrOworCQkJY2FzZSAxNToKKwkJCQlody0+aDI2NF9hciA9IDB4M2ZmOworCQkJCWh3LT5oZWlnaHRfYXNwZWN0X3JhdGlvID0gMjsKKwkJCQlody0+d2lkdGhfYXNwZWN0X3JhdGlvID0gMzsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTY6CisJCQkJaHctPmgyNjRfYXIgPSAweDNmZjsKKwkJCQlody0+aGVpZ2h0X2FzcGVjdF9yYXRpbyA9IDE7CisJCQkJaHctPndpZHRoX2FzcGVjdF9yYXRpbyA9IDI7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWlmIChody0+dmgyNjRfcmF0aW8gPj4gMTYpIHsKKwkJCQkJaHctPmgyNjRfYXIgPSAoaHctPmZyYW1lX2hlaWdodCAqCisJCQkJCQkoaHctPnZoMjY0X3JhdGlvICYgMHhmZmZmKSAqCisJCQkJCQkweDEwMCArCisJCQkJCQkoKGh3LT52aDI2NF9yYXRpbyA+PiAxNikgKgorCQkJCQkJIGh3LT5mcmFtZV93aWR0aCAvIDIpKSAvCisJCQkJCQkoKGh3LT52aDI2NF9yYXRpbyA+PiAxNikgKgorCQkJCQkJIGh3LT5mcmFtZV93aWR0aCk7CisJCQkJCWh3LT5oZWlnaHRfYXNwZWN0X3JhdGlvID0gMTsKKwkJCQkJaHctPndpZHRoX2FzcGVjdF9yYXRpbyA9IDE7CisJCQkJfSBlbHNlIHsKKwkJCQkJaHctPmgyNjRfYXIgPSAweDNmZjsKKwkJCQkJaHctPmhlaWdodF9hc3BlY3RfcmF0aW8gPSAxOworCQkJCQlody0+d2lkdGhfYXNwZWN0X3JhdGlvID0gMTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19ERUNfREVUQUlMLAorCQkJInYyNjRkZWM6IGFzcGVjdF9yYXRpbyBub3QgYXZhaWxhYmxlIGZyb20gc291cmNlXG4iKTsKKwkJaWYgKGh3LT52aDI2NF9yYXRpbyA+PiAxNikgeworCQkJLyogaGlnaCAxNiBiaXQgaXMgd2lkdGgsIGxvdyAxNiBiaXQgaXMgaGVpZ2h0ICovCisJCQlody0+aDI2NF9hciA9CisJCQkJKChody0+dmgyNjRfcmF0aW8gJiAweGZmZmYpICoKKwkJCQkJaHctPmZyYW1lX2hlaWdodCAqIDB4MTAwICsKKwkJCQkgKGh3LT52aDI2NF9yYXRpbyA+PiAxNikgKgorCQkJCSBody0+ZnJhbWVfd2lkdGggLyAyKSAvCisJCQkJKChody0+dmgyNjRfcmF0aW8gPj4gMTYpICoKKwkJCQkJaHctPmZyYW1lX3dpZHRoKTsKKwkJCWh3LT5oZWlnaHRfYXNwZWN0X3JhdGlvID0gMTsKKwkJCWh3LT53aWR0aF9hc3BlY3RfcmF0aW8gPSAxOworCQl9IGVsc2UgeworCQkJaHctPmgyNjRfYXIgPSAweDNmZjsKKwkJCWh3LT5oZWlnaHRfYXNwZWN0X3JhdGlvID0gMTsKKwkJCWh3LT53aWR0aF9hc3BlY3RfcmF0aW8gPSAxOworCQl9CisJfQorCisJaWYgKGh3LT5wdHNfdW5zdGFibGUgJiYgKGh3LT5maXhlZF9mcmFtZV9yYXRlX2ZsYWcgPT0gMCkpIHsKKwkJaWYgKCgoaHctPmZyYW1lX2R1ciA9PSBSQVRFXzIzOTdfRlBTKQorCQkmJiAoZGVjX2NvbnRyb2wKKwkJJiBERUNfQ09OVFJPTF9GTEFHX0ZPUkNFX1JBVEVfMjM5N19GUFNfRklYX0ZSQU1FX1JBVEUpKQorCQkJfHwgKChSQVRFXzI5OTdfRlBTID09CisJCQlody0+ZnJhbWVfZHVyKSAmJgorCQkoZGVjX2NvbnRyb2wgJgorCQkJREVDX0NPTlRST0xfRkxBR19GT1JDRV9SQVRFXzI5OTdfRlBTX0ZJWF9GUkFNRV9SQVRFKSkpIHsKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RFQ19ERVRBSUwsCisJCQkJImZvcmNlIGZpeCBmcmFtZSByYXRlXG4iKTsKKwkJCWh3LT5maXhlZF9mcmFtZV9yYXRlX2ZsYWcgPSAweDQwOworCQl9CisJfQorCisJLyp2aWRlb19zaWduYWxfZnJvbV92dWk6IHRvIGRvIC4uICovCit9CisKK3N0YXRpYyB2b2lkIGJ1Zm1ncl9yZWNvdmVyKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcpCit7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSAmaHctPmRwYjsKKworCWJ1Zm1ncl9oMjY0X3JlbW92ZV91bnVzZWRfZnJhbWUocF9IMjY0X0RwYiwgMik7CisJaWYgKGVycm9yX3Byb2NfcG9saWN5ICYgMHgyMCkgeworCQlpZiAoIWh3LT5pc191c2VkX3Y0bCkKKwkJCWh3LT5yZXNldF9idWZtZ3JfZmxhZyA9IDE7CisJfQorfQorCit2b2lkIGJ1Zm1ncl9mb3JjZV9yZWNvdmVyKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiKQoreworCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcgPQorCQljb250YWluZXJfb2YocF9IMjY0X0RwYiwgc3RydWN0IHZkZWNfaDI2NF9od19zLCBkcGIpOworCisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCSJjYWxsICVzXG4iLCBfX2Z1bmNfXyk7CisKKwlidWZtZ3JfaDI2NF9yZW1vdmVfdW51c2VkX2ZyYW1lKHBfSDI2NF9EcGIsIDIpOworCWh3LT5yZXNldF9idWZtZ3JfZmxhZyA9IDE7Cit9CisKKyNpZmRlZiBDT05TVFJBSU5fTUFYX0JVRl9OVU0KK3N0YXRpYyBpbnQgZ2V0X3ZmX3JlZl9vbmx5X2J1Zl9jb3VudChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3KQoreworCWludCBpOworCWludCBjb3VudCA9IDA7CisJZm9yIChpID0gMDsgaSA8IEJVRlNQRUNfUE9PTF9TSVpFOyBpKyspIHsKKwkJaWYgKGlzX2J1Zl9zcGVjX2luX2Rpc3BfcShodywgaSkgJiYKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS52Zl9yZWYgPiAwKQorCQkJY291bnQrKzsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IGdldF91c2VkX2J1Zl9jb3VudChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3KQoreworCWludCBpOworCWludCBjb3VudCA9IDA7CisJZm9yIChpID0gMDsgaSA8IEJVRlNQRUNfUE9PTF9TSVpFOyBpKyspIHsKKwkJaWYgKGlzX2J1Zl9zcGVjX2luX3VzZShodywgaSkpCisJCQljb3VudCsrOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisjZW5kaWYKKworCitzdGF0aWMgYm9vbCBpc19idWZmZXJfYXZhaWxhYmxlKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJYm9vbCBidWZmZXJfYXZhaWxhYmxlID0gMTsKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqKSh2ZGVjLT5wcml2YXRlKTsKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9ICZody0+ZHBiOworCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIgPSAmcF9IMjY0X0RwYi0+bURQQjsKKwlpbnQgaSwgZnJhbWVfb3V0c2lkZV9jb3VudCA9IDAsIGlubmVyX3NpemUgPSAwOworCWlmICgoa2ZpZm9fbGVuKCZody0+bmV3ZnJhbWVfcSkgPD0gMCkgfHwKKwkgICAgKChody0+Y29uZmlnX2J1Zm1ncl9kb25lKSAmJiAoIWhhdmVfZnJlZV9idWZfc3BlYyh2ZGVjKSkpIHx8CisJICAgICgocF9IMjY0X0RwYi0+bURQQi5pbml0X2RvbmUpICYmCisJICAgICAocF9IMjY0X0RwYi0+bURQQi51c2VkX3NpemUgPj0gKHBfSDI2NF9EcGItPm1EUEIuc2l6ZSAtIDEpKSAmJgorCSAgICAgKGlzX3RoZXJlX3VudXNlZF9mcmFtZV9mcm9tX2RwYigmcF9IMjY0X0RwYi0+bURQQikgPT0gMCkpKSB7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1ZERUNfREVUQUlMLAorCQkiJXMsIGVtcHR5LCBuZXdxKCVkKSwgZnJlZV9zcGVjKCVkKSwgaW5pdGRvbiglZCksIHVzZWRfc2l6ZSglZC8lZCksIHVudXNlZF9mcl9kcGIoJWQpXG4iLAorCQlfX2Z1bmNfXywKKwkJa2ZpZm9fbGVuKCZody0+bmV3ZnJhbWVfcSksCisJCWhhdmVfZnJlZV9idWZfc3BlYyh2ZGVjKSwKKwkJcF9IMjY0X0RwYi0+bURQQi5pbml0X2RvbmUsCisJCXBfSDI2NF9EcGItPm1EUEIudXNlZF9zaXplLCBwX0gyNjRfRHBiLT5tRFBCLnNpemUsCisJCWlzX3RoZXJlX3VudXNlZF9mcmFtZV9mcm9tX2RwYigmcF9IMjY0X0RwYi0+bURQQikKKwkJKTsKKwkJYnVmZmVyX2F2YWlsYWJsZSA9IDA7CisJCWlmIChkcGJfaXNfZGVidWcoREVDT0RFX0lEKGh3KSwKKwkJCURFQlVHX0RJU0FCTEVfUlVOUkVBRFlfUk1CVUYpKQorCQkJcmV0dXJuIGJ1ZmZlcl9hdmFpbGFibGU7CisKKwkJaWYgKChlcnJvcl9wcm9jX3BvbGljeSAmIDB4NCkgJiYKKwkJCShlcnJvcl9wcm9jX3BvbGljeSAmIDB4OCkpIHsKKwkJCWlmICgoa2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKSA8PSAwKSAmJgorCQkJKHBfSDI2NF9EcGItPm1EUEIudXNlZF9zaXplID49CisJCQkJKHBfSDI2NF9EcGItPm1EUEIuc2l6ZSAtIDEpKSAmJgorCQkJCShwX0RwYi0+cmVmX2ZyYW1lc19pbl9idWZmZXIgPgorCQkJCShpbWF4KAorCQkJCTEsIHBfRHBiLT5udW1fcmVmX2ZyYW1lcykKKwkJCQktIHBfRHBiLT5sdHJlZl9mcmFtZXNfaW5fYnVmZmVyICsKKwkJCQlmb3JjZV9zbGlkaW5nX21hcmdpbikpKXsKKwkJCQlidWZtZ3JfcmVjb3Zlcihodyk7CisJCQl9IGVsc2UgeworCQkJCWJ1Zm1ncl9oMjY0X3JlbW92ZV91bnVzZWRfZnJhbWUocF9IMjY0X0RwYiwgMSk7CisJCQl9CisJCX0gZWxzZSBpZiAoKGVycm9yX3Byb2NfcG9saWN5ICYgMHg0KSAmJgorCQkJKGtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSkgPD0gMCkgJiYKKwkJCSgocF9IMjY0X0RwYi0+bURQQi51c2VkX3NpemUgPj0KKwkJCQkocF9IMjY0X0RwYi0+bURQQi5zaXplIC0gMSkpIHx8CisJCQkoIWhhdmVfZnJlZV9idWZfc3BlYyh2ZGVjKSkpKSB7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5idWZzcGVjX2xvY2ssIGZsYWdzKTsKKworCQkJZm9yIChpID0gMDsgaSA8IHBfRHBiLT51c2VkX3NpemU7IGkrKykgeworCQkJCWlmIChwX0RwYi0+ZnNbaV0tPnByZV9vdXRwdXQpCisJCQkJCWZyYW1lX291dHNpZGVfY291bnQrKzsKKwkJCQllbHNlIGlmIChwX0RwYi0+ZnNbaV0tPmlzX291dHB1dCAmJiAhaXNfdXNlZF9mb3JfcmVmZXJlbmNlKHBfRHBiLT5mc1tpXSkpIHsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmJ1ZnNwZWNfbG9jaywgZmxhZ3MpOworCQkJCQlidWZtZ3JfaDI2NF9yZW1vdmVfdW51c2VkX2ZyYW1lKHBfSDI2NF9EcGIsIDApOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+YnVmc3BlY19sb2NrLCBmbGFncyk7CisJCQlpbm5lcl9zaXplID0gcF9EcGItPnNpemUgLSBmcmFtZV9vdXRzaWRlX2NvdW50OworCisJCQlpZiAoaW5uZXJfc2l6ZSA+PSBwX0gyNjRfRHBiLT5kZWNfZHBiX3NpemUpIHsKKwkJCQlpZiAocF9IMjY0X0RwYi0+bURQQi51c2VkX3NpemUgPj0KKwkJCQkJcF9IMjY0X0RwYi0+bURQQi5zaXplKSB7CisJCQkJCWJ1Zm1ncl9yZWNvdmVyKGh3KTsKKwkJCQl9IGVsc2UgaWYgKHBfSDI2NF9EcGItPm1EUEIudXNlZF9zaXplID49CisJCQkJCShwX0gyNjRfRHBiLT5tRFBCLnNpemUgLSAxKSkgeworCQkJCQlpZiAoaW5uZXJfc2l6ZSA+IHBfSDI2NF9EcGItPmRlY19kcGJfc2l6ZSkgeworCQkJCQkJYnVmbWdyX3JlY292ZXIoaHcpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnVmbWdyX2gyNjRfcmVtb3ZlX3VudXNlZF9mcmFtZShwX0gyNjRfRHBiLCAwKTsKKwkJfSBlbHNlIGlmICgoZXJyb3JfcHJvY19wb2xpY3kgJiAweDgpICYmCisJCQkocF9EcGItPnJlZl9mcmFtZXNfaW5fYnVmZmVyID4KKwkJCShpbWF4KAorCQkJMSwgcF9EcGItPm51bV9yZWZfZnJhbWVzKQorCQkJLSBwX0RwYi0+bHRyZWZfZnJhbWVzX2luX2J1ZmZlciArCisJCQlmb3JjZV9zbGlkaW5nX21hcmdpbikpKQorCQkJYnVmbWdyX3JlY292ZXIoaHcpOworCQllbHNlCisJCQlidWZtZ3JfaDI2NF9yZW1vdmVfdW51c2VkX2ZyYW1lKHBfSDI2NF9EcGIsIDEpOworCisJCWlmIChody0+cmVzZXRfYnVmbWdyX2ZsYWcgPT0gMSkKKwkJCWJ1ZmZlcl9hdmFpbGFibGUgPSAxOworCX0KKworCWlmIChody0+aXNfdXNlZF92NGwpCisJCWJ1ZmZlcl9hdmFpbGFibGUgPSBoYXZlX2ZyZWVfYnVmX3NwZWModmRlYyk7CisKKwlyZXR1cm4gYnVmZmVyX2F2YWlsYWJsZTsKK30KKworI2RlZmluZSBBVVhfVEFHX1NFSQkJCQkweDIKKworI2RlZmluZSBTRUlfQlVGRkVSSU5HX1BFUklPRAkwCisjZGVmaW5lIFNFSV9QaWNUaW1pbmcJCQkxCisjZGVmaW5lIFNFSV9VU0VSX0RBVEEJCQk0CisjZGVmaW5lIFNFSV9SRUNPVkVSWV9QT0lOVAkJNgorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOlJlYWRzIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtIGJ1ZmZlcgorICogSW5wdXQ6CisJYnl0ZSBidWZmZXJbXQorCQljb250YWluaW5nIHNlaSBtZXNzYWdlIGRhdGEgYml0cworCWludCB0b3RiaXRvZmZzZXQKKwkJYml0IG9mZnNldCBmcm9tIHN0YXJ0IG9mIHBhcnRpdGlvbgorCWludCBieXRlY291bnQKKwkJdG90YWwgYnl0ZXMgaW4gYml0c3RyZWFtCisJaW50IG51bWJpdHMKKwkJbnVtYmVyIG9mIGJpdHMgdG8gcmVhZAorICogT3V0cHV0OgorCWludCAqaW5mbworICogUmV0dXJuOgorCS0xOiBmYWlsZWQKKwk+IDA6IHRoZSBjb3VudCBvZiBiaXQgcmVhZAorICogQXR0ZW50aW9uOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitzdGF0aWMgaW50IGdldF9iaXRzKHVuc2lnbmVkIGNoYXIgYnVmZmVyW10sCisJCQkJCWludCB0b3RiaXRvZmZzZXQsCisJCQkJCWludCAqaW5mbywKKwkJCQkJaW50IGJ5dGVjb3VudCwKKwkJCQkJaW50IG51bWJpdHMpCit7CisJcmVnaXN0ZXIgaW50IGluZjsKKwlsb25nIGJ5dGVvZmZzZXQ7CisJaW50IGJpdG9mZnNldDsKKworCWludCBiaXRjb3VudGVyID0gbnVtYml0czsKKworCWJ5dGVvZmZzZXQgPSB0b3RiaXRvZmZzZXQgLyA4OworCWJpdG9mZnNldCA9IDcgLSAodG90Yml0b2Zmc2V0ICUgOCk7CisKKwlpbmYgPSAwOworCXdoaWxlIChudW1iaXRzKSB7CisJCWluZiA8PD0gMTsKKwkJaW5mIHw9IChidWZmZXJbYnl0ZW9mZnNldF0gJiAoMHgwMSA8PCBiaXRvZmZzZXQpKSA+PiBiaXRvZmZzZXQ7CisJCW51bWJpdHMtLTsKKwkJYml0b2Zmc2V0LS07CisJCWlmIChiaXRvZmZzZXQgPCAwKSB7CisJCQlieXRlb2Zmc2V0Kys7CisJCQliaXRvZmZzZXQgKz0gODsKKwkJCWlmIChieXRlb2Zmc2V0ID4gYnl0ZWNvdW50KQorCQkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCSppbmZvID0gaW5mOworCisKKwlyZXR1cm4gYml0Y291bnRlcjsKK30KKworc3RhdGljIGludCBwYXJzZV9vbmVfc2VpX3JlY29yZChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LAorCQkJCQkJCXU4ICpzZWlfZGF0YV9idWYsCisJCQkJCQkJdTggKnNlaV9kYXRhX2J1Zl9lbmQpCit7CisJaW50IHBheWxvYWRfdHlwZTsKKwlpbnQgcGF5bG9hZF9zaXplOworCXU4ICpwX3NlaTsKKwlpbnQgdGVtcCA9IDA7CisJaW50IGJpdF9vZmZzZXQ7CisJaW50IHJlYWRfc2l6ZTsKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9ICZody0+ZHBiOworCisJcF9zZWkgPSBzZWlfZGF0YV9idWY7CisJcmVhZF9zaXplID0gMDsKKwlwYXlsb2FkX3R5cGUgPSAwOworCWRvIHsKKwkJaWYgKHBfc2VpID49IHNlaV9kYXRhX2J1Zl9lbmQpCisJCQlyZXR1cm4gcmVhZF9zaXplOworCisJCXBheWxvYWRfdHlwZSArPSAqcF9zZWk7CisJCXJlYWRfc2l6ZSsrOworCX0gd2hpbGUgKCpwX3NlaSsrID09IDI1NSk7CisKKworCXBheWxvYWRfc2l6ZSA9IDA7CisJZG8geworCQlpZiAocF9zZWkgPj0gc2VpX2RhdGFfYnVmX2VuZCkKKwkJCXJldHVybiByZWFkX3NpemU7CisKKwkJcGF5bG9hZF9zaXplICs9ICpwX3NlaTsKKwkJcmVhZF9zaXplKys7CisJfSB3aGlsZSAoKnBfc2VpKysgPT0gMjU1KTsKKworCisJaWYgKHBfc2VpICsgcGF5bG9hZF9zaXplID4gc2VpX2RhdGFfYnVmX2VuZCkgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJIiVzOiBwYXlsb2FkX3R5cGUgPSAlZCwgcGF5bG9hZF9zaXplID0gJWQgaXMgb3ZlclxuIiwKKwkJCV9fZnVuY19fLCBwYXlsb2FkX3R5cGUsIHBheWxvYWRfc2l6ZSk7CisJCXJldHVybiByZWFkX3NpemU7CisJfQorCWJpdF9vZmZzZXQgPSAwOworCisJaWYgKHBheWxvYWRfc2l6ZSA8PSAwKSB7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkiJXMgd2FybmluZzogdGhpcyBpcyBhIG51bGwgc2VpIG1lc3NhZ2UgZm9yIHBheWxvYWRfdHlwZSA9ICVkXG4iLAorCQkJX19mdW5jX18sIHBheWxvYWRfdHlwZSk7CisJCXJldHVybiByZWFkX3NpemU7CisJfQorCXBfSDI2NF9EcGItPnZ1aV9zdGF0dXMgPSBwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW1ZVSV9TVEFUVVNdOworCXN3aXRjaCAocGF5bG9hZF90eXBlKSB7CisJY2FzZSBTRUlfQlVGRkVSSU5HX1BFUklPRDoKKwkJYnJlYWs7CisJY2FzZSBTRUlfUGljVGltaW5nOgorCQlpZiAocF9IMjY0X0RwYi0+dnVpX3N0YXR1cyAmIDB4YykgeworCQkJaW50IGNwYl9yZW1vdmFsX2RlbGF5OworCQkJaW50IGRwYl9vdXRwdXRfZGVsYXk7CisJCQl1MzIgZGVsYXlfbGVuOworCisJCQlkZWxheV9sZW4gPSBwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW0RFTEFZX0xFTkdUSF07CisJCQljcGJfcmVtb3ZhbF9kZWxheQorCQkJCT0gKGRlbGF5X2xlbiAmIDB4MUYpICsgMTsKKwkJCWRwYl9vdXRwdXRfZGVsYXkKKwkJCQk9ICgoZGVsYXlfbGVuID4+IDUpICYgMHgxRikgKyAxOworCisJCQlnZXRfYml0cyhwX3NlaSwgYml0X29mZnNldCwKKwkJCQkmdGVtcCwgcGF5bG9hZF9zaXplLAorCQkJCWRwYl9vdXRwdXRfZGVsYXkrY3BiX3JlbW92YWxfZGVsYXkpOworCQkJYml0X29mZnNldCArPSBkcGJfb3V0cHV0X2RlbGF5K2NwYl9yZW1vdmFsX2RlbGF5OworCQl9CisJCWlmIChwX0gyNjRfRHBiLT52dWlfc3RhdHVzICYgMHgxMCkgeworCQkJZ2V0X2JpdHMocF9zZWksIGJpdF9vZmZzZXQsICZ0ZW1wLCBwYXlsb2FkX3NpemUsIDQpOworCQkJYml0X29mZnNldCArPSA0OworCQkJcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtQSUNUVVJFX1NUUlVDVF0gPSB0ZW1wOworCQl9CisJCWJyZWFrOworCWNhc2UgU0VJX1VTRVJfREFUQToKKwkJaWYgKGVuYWJsZV9pdHVfdDM1KSB7CisJCQlpbnQgaTsKKwkJCWludCBqOworCQkJaW50IGRhdGFfbGVuOworCQkJdTggKnVzZXJfZGF0YV9idWY7CisKKwkJCXVzZXJfZGF0YV9idWYKKwkJCQk9IGh3LT5zZWlfaXR1X2RhdGFfYnVmICsgaHctPnNlaV9pdHVfZGF0YV9sZW47CisJCQkvKiB1c2VyIGRhdGEgbGVuZ3RoIHNob3VsZCBiZSBhbGlnbiB3aXRoIDggYnl0ZXMsCisJCQlpZiBub3QsIHRoZW4gcGFkZGluZyB3aXRoIHplcm8qLworCQkJZm9yIChpID0gMDsgaSA8IHBheWxvYWRfc2l6ZTsgaSArPSA4KSB7CisJCQkJaWYgKGh3LT5zZWlfaXR1X2RhdGFfbGVuICsgaSA+PSBTRUlfSVRVX0RBVEFfU0laRSkKKwkJCQkJYnJlYWs7IC8vIEF2b2lkIG91dC1vZi1ib3VuZCB3cml0aW5nCisJCQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworCQkJCQlpbnQgaW5kZXg7CisKKwkJCQkJaW5kZXggPSBpKzctajsKKwkJCQkJaWYgKGluZGV4ID49IHBheWxvYWRfc2l6ZSkKKwkJCQkJCXVzZXJfZGF0YV9idWZbaStqXSA9IDA7CisJCQkJCWVsc2UKKwkJCQkJCXVzZXJfZGF0YV9idWZbaStqXQorCQkJCQkJCT0gcF9zZWlbaSs3LWpdOworCQkJCX0KKwkJCX0KKworCQkJZGF0YV9sZW4gPSBwYXlsb2FkX3NpemU7CisJCQlpZiAocGF5bG9hZF9zaXplICUgOCkKKwkJCQlkYXRhX2xlbiA9ICgocGF5bG9hZF9zaXplICsgOCkgPj4gMykgPDwgMzsKKworCQkJaHctPnNlaV9pdHVfZGF0YV9sZW4gKz0gZGF0YV9sZW47CisJCQlpZiAoaHctPnNlaV9pdHVfZGF0YV9sZW4gPj0gU0VJX0lUVV9EQVRBX1NJWkUpCisJCQkJaHctPnNlaV9pdHVfZGF0YV9sZW4gPSBTRUlfSVRVX0RBVEFfU0laRTsKKwkJCS8qCisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCQkiJXM6IHVzZXIgZGF0YSwgYW5kIGxlbiA9ICVkOlxuIiwKKwkJCQlfX2Z1bmNfXywgaHctPnNlaV9pdHVfZGF0YV9sZW4pOworCQkJKi8KKwkJfQorCQlicmVhazsKKwljYXNlIFNFSV9SRUNPVkVSWV9QT0lOVDoKKwkJcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtSRUNPVkVSWV9QT0lOVF0gPSAxOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmVhZF9zaXplICsgcGF5bG9hZF9zaXplOworfQorCitzdGF0aWMgdm9pZCBwYXJzZV9zZWlfZGF0YShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LAorCQkJCQkJCXU4ICpzZWlfZGF0YV9idWYsCisJCQkJCQkJaW50IGxlbikKK3sKKwljaGFyICpwX3NlaTsKKwljaGFyICpwX3NlaV9lbmQ7CisJaW50IHBhcnNlZF9zaXplOworCWludCByZWFkX3NpemU7CisKKworCXBfc2VpID0gc2VpX2RhdGFfYnVmOworCXBfc2VpX2VuZCA9IHBfc2VpICsgbGVuOworCXBhcnNlZF9zaXplID0gMDsKKwl3aGlsZSAocGFyc2VkX3NpemUgPCBsZW4pIHsKKwkJcmVhZF9zaXplID0gcGFyc2Vfb25lX3NlaV9yZWNvcmQoaHcsIHBfc2VpLCBwX3NlaV9lbmQpOworCQlwX3NlaSArPSByZWFkX3NpemU7CisJCXBhcnNlZF9zaXplICs9IHJlYWRfc2l6ZTsKKwkJaWYgKCpwX3NlaSA9PSAweDgwKSB7CisJCQlwX3NlaSsrOworCQkJcGFyc2VkX3NpemUrKzsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgY2hlY2tfZGVjb2RlZF9waWNfZXJyb3Ioc3RydWN0IHZkZWNfaDI2NF9od19zICpodykKK3sKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9ICZody0+ZHBiOworCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnAgPSBwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmU7CisJdW5zaWduZWQgbWJ5X21ieCA9IFJFQURfVlJFRyhNQllfTUJYKTsKKwl1bnNpZ25lZCBtYl90b3RhbCA9IChody0+c2VxX2luZm8yID4+IDgpICYgMHhmZmZmOworCXVuc2lnbmVkIG1iX3dpZHRoID0gaHctPnNlcV9pbmZvMiAmIDB4ZmY7CisJdW5zaWduZWQgZGVjb2RlX21iX2NvdW50OworCWlmICghbWJfd2lkdGggJiYgbWJfdG90YWwpIC8qZm9yIDRrMmsqLworCQltYl93aWR0aCA9IDI1NjsKKwlkZWNvZGVfbWJfY291bnQgPSAoKG1ieV9tYnggJiAweGZmKSAqIG1iX3dpZHRoICsKKwkJKCgobWJ5X21ieCA+PiA4KSAmIDB4ZmYpICsgMSkpOworCWlmICgobWJ5X21ieCA9PSAwKSAmJiAocF9IMjY0X0RwYi0+ZGVjX2RwYl9zdGF0dXMgIT0gSDI2NF9TTElDRV9IRUFEX0RPTkUpKSB7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJIm1ieV9tYnggaXMgemVyb1xuIik7CisJCXJldHVybjsKKwl9CisJaWYgKGdldF9jdXJfc2xpY2VfcGljdHVyZV9zdHJ1Y3QocF9IMjY0X0RwYikgIT0gRlJBTUUpCisJCW1iX3RvdGFsIC89IDI7CisKKwlpZiAoKGVycm9yX3Byb2NfcG9saWN5ICYgMHgyMDApICYmCisJCVJFQURfVlJFRyhFUlJPUl9TVEFUVVNfUkVHKSAhPSAwKSB7CisJCXAtPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOworCX0KKworCWlmIChlcnJvcl9wcm9jX3BvbGljeSAmIDB4MTAwICYmICEocC0+ZGF0YV9mbGFnICYgRVJST1JfRkxBRykpIHsKKwkJaWYgKGRlY29kZV9tYl9jb3VudCA8IG1iX3RvdGFsKSB7CisJCQlwLT5kYXRhX2ZsYWcgfD0gRVJST1JfRkxBRzsKKwkJCWlmICgoKGVycm9yX3Byb2NfcG9saWN5ICYgMHgyMDAwMCkgJiYKKwkJCQlkZWNvZGVfbWJfY291bnQgPj0gbWJfdG90YWwgKiAoMTAwIC0gbWJfY291bnRfdGhyZXNob2xkKSAvIDEwMCkpIHsKKwkJCQlwLT5kYXRhX2ZsYWcgJj0gfkVSUk9SX0ZMQUc7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoKGVycm9yX3Byb2NfcG9saWN5ICYgMHgxMDAwMDApICYmCisJCQlody0+bGFzdF9kZWNfcGljdHVyZSAmJgorCQkJCShody0+bGFzdF9kZWNfcGljdHVyZS0+c2xpY2VfdHlwZSA9PSBJX1NMSUNFKSAmJgorCQkJCShody0+ZHBiLm1TbGljZS5zbGljZV90eXBlID09IFBfU0xJQ0UpKSB7CisJCWlmICgocC0+ZGF0YV9mbGFnICYgRVJST1JfRkxBRykgJiYKKwkJCQkoZGVjb2RlX21iX2NvdW50ID49IG1iX3RvdGFsKSkgeworCQkJCWh3LT5pcF9maWVsZF9lcnJvcl9jb3VudCsrOworCQkJCWlmIChody0+aXBfZmllbGRfZXJyb3JfY291bnQgPT0gNCkgeworCQkJCQl1bnNpZ25lZCBpbnQgaTsKKwkJCQkJc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYiA9ICZwX0gyNjRfRHBiLT5tRFBCOworCQkJCQlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnJlZl9mcmFtZXNfaW5fYnVmZmVyOyBpKyspIHsKKwkJCQkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldLT50b3BfZmllbGQpCisJCQkJCQkJcF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkLT5kYXRhX2ZsYWcgJj0gfkVSUk9SX0ZMQUc7CisJCQkJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+Ym90dG9tX2ZpZWxkKQorCQkJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmJvdHRvbV9maWVsZC0+ZGF0YV9mbGFnICY9IH5FUlJPUl9GTEFHOworCQkJCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0tPmZyYW1lKQorCQkJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmZyYW1lLT5kYXRhX2ZsYWcgJj0gfkVSUk9SX0ZMQUc7CisJCQkJCX0KKwkJCQkJaHctPmlwX2ZpZWxkX2Vycm9yX2NvdW50ID0gMDsKKwkJCQkJcC0+ZGF0YV9mbGFnICY9IH5FUlJPUl9GTEFHOworCQkJCQlody0+ZGF0YV9mbGFnICY9IH5FUlJPUl9GTEFHOworCQkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCQkJCSJjbGVhciBhbGwgcmVmIGZyYW1lIGVycm9yIGZsYWdcbiIpOworCQkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChody0+aXBfZmllbGRfZXJyb3JfY291bnQgPiAwKQorCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJCQkiY2xlYXIgZXJyb3IgY291bnQgJWRcbiIsIGh3LT5pcF9maWVsZF9lcnJvcl9jb3VudCk7CisJCQlody0+aXBfZmllbGRfZXJyb3JfY291bnQgPSAwOworCQl9CisJfQorCisJaWYgKHAtPmRhdGFfZmxhZyAmIEVSUk9SX0ZMQUcpIHsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRVJST1JGTEFHX0RCRywKKwkJCSIlczogZGVjb2RlIGVycm9yLCBzZXFfaW5mbzIgMHgleCwgbWJ5X21ieCAweCV4LCBtYl90b3RhbCAlZCBkZWNvZGVkIG1iX2NvdW50ICVkIEVSUk9SX1NUQVRVU19SRUcgMHgleFxuIiwKKwkJCV9fZnVuY19fLAorCQkJaHctPnNlcV9pbmZvMiwKKwkJCW1ieV9tYngsCisJCQltYl90b3RhbCwKKwkJCWRlY29kZV9tYl9jb3VudCwKKwkJCVJFQURfVlJFRyhFUlJPUl9TVEFUVVNfUkVHKQorCQkJKTsKKworCX0KK30KKworc3RhdGljIGludCB2aDI2NF9waWNfZG9uZV9wcm9jKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IHZkZWNfaDI2NF9od19zICpodyA9IChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKikodmRlYy0+cHJpdmF0ZSk7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSAmaHctPmRwYjsKKwlpbnQgcmV0OworCWludCBpOworCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIgPSAmcF9IMjY0X0RwYi0+bURQQjsKKworCWlmICh2ZGVjLT5tdmZybSkKKwkJdmRlYy0+bXZmcm0tPmh3X2RlY29kZV90aW1lID0KKwkJbG9jYWxfY2xvY2soKSAtIHZkZWMtPm12ZnJtLT5od19kZWNvZGVfc3RhcnQ7CisKKwlpZiAoaW5wdXRfZnJhbWVfYmFzZWQodmRlYykgJiYKKwkJCSghKGh3LT5pX29ubHkgJiAweDIpKSAmJgorCQkJZnJtYmFzZV9jb250X2JpdGxldmVsICE9IDAgJiYKKwkJCVJFQURfVlJFRyhWSUZGX0JJVF9DTlQpID4KKwkJCWZybWJhc2VfY29udF9iaXRsZXZlbCkgeworCQkJLypoYW5kbGUgdGhlIGNhc2U6IG11bHRpIHBpY3R1cmVzIGluIG9uZSBwYWNrZXQqLworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkiJXMgSDI2NF9QSUNfREFUQV9ET05FIGRlY29kZSBzbGljZSBjb3VudCAlZCwgY29udGludWUgKGJpdGNudCAweCV4KVxuIiwKKwkJCV9fZnVuY19fLAorCQkJaHctPmRlY29kZV9waWNfY291bnQsCisJCQlSRUFEX1ZSRUcoVklGRl9CSVRfQ05UKSk7CisJCQlody0+ZnJtYmFzZV9jb250X2ZsYWcgPSAxOworCQl9IGVsc2UKKwkJCWh3LT5mcm1iYXNlX2NvbnRfZmxhZyA9IDA7CisKKwkJaWYgKHBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZSkgeworCQkJZ2V0X3BpY3R1cmVfcW9zX2luZm8ocF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlKTsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCQkJREVMX0VYSVNUKGh3LAorCQkJCXBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZSkgPSAwOworCQkJaWYgKHZkZWMtPm1hc3RlcikgeworCQkJCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHdfYmEgPQorCQkJCShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKikKKwkJCQkJdmRlYy0+bWFzdGVyLT5wcml2YXRlOworCQkJCWlmIChod19iYS0+bGFzdF9kZWNfcGljdHVyZSkKKwkJCQkJREVMX0VYSVNUKGh3X2JhLAorCQkJCQkJaHdfYmEtPmxhc3RfZGVjX3BpY3R1cmUpCisJCQkJCQk9IDE7CisJCQl9CisjZW5kaWYKKwkJCW11dGV4X2xvY2soJmh3LT5jaHVua3NfbXV0ZXgpOworCQkJaWYgKGh3LT5jaHVuaykgeworCQkJCXBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZS0+cHRzID0KKwkJCQkJaHctPmNodW5rLT5wdHM7CisJCQkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlLT5wdHM2NCA9CisJCQkJCWh3LT5jaHVuay0+cHRzNjQ7CisJCQkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlLT50aW1lc3RhbXAgPQorCQkJCQlody0+Y2h1bmstPnRpbWVzdGFtcDsKKyNpZmRlZiBNSDI2NF9VU0VSREFUQV9FTkFCTEUKKwkJCQl2bWgyNjRfdWRjX2ZpbGxfdnB0cyhodywKKwkJCQkJcF9IMjY0X0RwYi0+bVNsaWNlLnNsaWNlX3R5cGUsCisJCQkJCWh3LT5jaHVuay0+cHRzLCAxKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwkJCX0gZWxzZSBpZiAodmRlYy0+bWFzdGVyKSB7CisJCQkJLypkdiBlbmhhbmNlIGxheWVyLAorCQkJCWRvIG5vdCBjaGVja291dCBwdHMqLworCQkJCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnBpYyA9CisJCQkJCXBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZTsKKwkJCQlwaWMtPnB0cyA9IDA7CisJCQkJcGljLT5wdHM2NCA9IDA7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCQlzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpwaWMgPQorCQkJCQlwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmU7CisJCQkJdTMyIG9mZnNldCA9IHBpYy0+b2Zmc2V0X2RlbGltaXRlcjsKKwkJCQlwaWMtPnBpY19zaXplID0gKGh3LT5zdGFydF9iaXRfY250IC0gUkVBRF9WUkVHKFZJRkZfQklUX0NOVCkpID4+IDM7CisJCQkJaWYgKHB0c19waWNrb3V0X29mZnNldF91czY0KFBUU19UWVBFX1ZJREVPLAorCQkJCQlvZmZzZXQsICZwaWMtPnB0cywgMCwgJnBpYy0+cHRzNjQpKSB7CisJCQkJCXBpYy0+cHRzID0gMDsKKwkJCQkJcGljLT5wdHM2NCA9IDA7CisjaWZkZWYgTUgyNjRfVVNFUkRBVEFfRU5BQkxFCisJCQkJCXZtaDI2NF91ZGNfZmlsbF92cHRzKGh3LAorCQkJCQkJcF9IMjY0X0RwYi0+bVNsaWNlLnNsaWNlX3R5cGUsCisJCQkJCQlwaWMtPnB0cywgMCk7CisjZW5kaWYKKwkJCQl9IGVsc2UgeworI2lmZGVmIE1IMjY0X1VTRVJEQVRBX0VOQUJMRQorCQkJCQl2bWgyNjRfdWRjX2ZpbGxfdnB0cyhodywKKwkJCQkJCXBfSDI2NF9EcGItPm1TbGljZS5zbGljZV90eXBlLAorCQkJCQkJcGljLT5wdHMsIDEpOworI2VuZGlmCisJCQkJfQorCisJfQorCQkJbXV0ZXhfdW5sb2NrKCZody0+Y2h1bmtzX211dGV4KTsKKworCQkJY2hlY2tfZGVjb2RlZF9waWNfZXJyb3IoaHcpOworI2lmZGVmIEVSUk9SX0hBTkRMRV9URVNUCisJCQlpZiAoKGh3LT5kYXRhX2ZsYWcgJiBFUlJPUl9GTEFHKQorCQkJCSYmIChlcnJvcl9wcm9jX3BvbGljeSAmIDB4ODApKSB7CisJCQkJcmVsZWFzZV9jdXJfZGVjb2RpbmdfYnVmKGh3KTsKKwkJCQloMjY0X2NsZWFyX2RwYihodyk7CisJCQkJaHctPmRlY19mbGFnID0gMDsKKwkJCQlody0+ZGF0YV9mbGFnID0gMDsKKwkJCQlody0+c2tpcF9mcmFtZV9jb3VudCA9IDA7CisJCQkJaHctPmhhc19pX2ZyYW1lID0gMDsKKwkJCQlody0+bm9fZXJyb3JfY291bnQgPSAweGZmZjsKKwkJCQlody0+bm9fZXJyb3JfaV9jb3VudCA9IDB4ZjsKKwkJCX0gZWxzZQorI2VuZGlmCisJCQlpZiAoZXJyb3JfcHJvY19wb2xpY3kgJiAweDIwMDAwMCkgeworCQkJCWlmICghaHctPmxvb3BfZmxhZykgeworCQkJCQlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnVzZWRfc2l6ZTsgaSsrKSB7CisJCQkJCQlpZiAoKHBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZS0+cG9jICsgbG9vcF9wbGF5YmFja19wb2NfdGhyZXNob2xkIDwgcF9EcGItPmZzW2ldLT5wb2MpICYmCisJCQkJCQkJCSFwX0RwYi0+ZnNbaV0tPmlzX291dHB1dCAmJgorCQkJCQkJCQkhcF9EcGItPmZzW2ldLT5wcmVfb3V0cHV0KSB7CisJCQkJCQkJaHctPmxvb3BfZmxhZyA9IDE7CisJCQkJCQkJaHctPmxvb3BfbGFzdF9wb2MgPSBwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPnBvYzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmICgocF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlLT5wb2MgPj0gaHctPmxvb3BfbGFzdF9wb2MgLSBwb2NfdGhyZXNob2xkKSAmJgorCQkJCQkJKHBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZS0+cG9jIDw9IGh3LT5sb29wX2xhc3RfcG9jICsgcG9jX3RocmVzaG9sZCkpIHsKKwkJCQkJCWlmIChody0+bG9vcF9mbGFnID49IDUpIHsKKwkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnVzZWRfc2l6ZTsgaSsrKSB7CisJCQkJCQkJCWlmICgoaHctPmxvb3BfbGFzdF9wb2MgKyBsb29wX3BsYXliYWNrX3BvY190aHJlc2hvbGQgPCBwX0RwYi0+ZnNbaV0tPnBvYykgJiYKKwkJCQkJCQkJCQkhcF9EcGItPmZzW2ldLT5pc19vdXRwdXQgJiYKKwkJCQkJCQkJCQkhcF9EcGItPmZzW2ldLT5wcmVfb3V0cHV0KSB7CisJCQkJCQkJCQlwX0RwYi0+ZnNbaV0tPmlzX291dHB1dCA9IDE7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJaHctPmxvb3BfZmxhZyA9IDA7CisJCQkJCQl9IGVsc2UKKwkJCQkJCQlody0+bG9vcF9mbGFnKys7CisJCQkJCX0gZWxzZQorCQkJCQkJaHctPmxvb3BfZmxhZyA9IDA7CisJCQkJfQorCQkJfQorCQkJCXJldCA9IHN0b3JlX3BpY3R1cmVfaW5fZHBiKHBfSDI2NF9EcGIsCisJCQkJCXBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZSwKKwkJCQkJaHctPmRhdGFfZmxhZyB8IGh3LT5kZWNfZmxhZyB8CisJCQkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlLT5kYXRhX2ZsYWcpOworCisKKworCQkJaWYgKHJldCA9PSAtMSkgeworCQkJCXJlbGVhc2VfY3VyX2RlY29kaW5nX2J1Zihodyk7CisJCQkJYnVmbWdyX2ZvcmNlX3JlY292ZXIocF9IMjY0X0RwYik7CisJCQl9IGVsc2UgaWYgKHJldCA9PSAtMikgeworCQkJCXJlbGVhc2VfY3VyX2RlY29kaW5nX2J1Zihodyk7CisJCQl9IGVsc2UgeworCQkJaWYgKGh3LT5kYXRhX2ZsYWcgJiBFUlJPUl9GTEFHKSB7CisJCQkJaHctPm5vX2Vycm9yX2NvdW50ID0gMDsKKwkJCQlody0+bm9fZXJyb3JfaV9jb3VudCA9IDA7CisJCQl9IGVsc2UgeworCQkJCWh3LT5ub19lcnJvcl9jb3VudCsrOworCQkJCWlmIChody0+ZGF0YV9mbGFnICYgSV9GTEFHKQorCQkJCQlody0+bm9fZXJyb3JfaV9jb3VudCsrOworCQkJfQorCQkJaWYgKGh3LT5tbXVfZW5hYmxlKQorCQkJCWhldmNfc2V0X3VudXNlZF80a19idWZmX2lkeChodywKKwkJCQkJcF9IMjY0X0RwYi0+bVZpZGVvLgorCQkJCQkJZGVjX3BpY3R1cmUtPmJ1Zl9zcGVjX251bSk7CisJCQlidWZtZ3JfcG9zdChwX0gyNjRfRHBiKTsKKwkJCQlody0+bGFzdF9kZWNfcGljdHVyZSA9CisJCQkJCXBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZTsKKwkJCXBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZSA9IE5VTEw7CisJCQkvKiBkdW1wX2RwYigmcF9IMjY0X0RwYi0+bURQQik7ICovCisJCQlody0+aGFzX2lfZnJhbWUgPSAxOworCQkJaWYgKGh3LT5tbXVfZW5hYmxlKQorCQkJCWhldmNfc2V0X2ZyYW1lX2RvbmUoaHcpOworCQkJaHctPmRlY29kZV9waWNfY291bnQrKzsKKwkJCXBfSDI2NF9EcGItPmRlY29kZV9waWNfY291bnQgPSBody0+ZGVjb2RlX3BpY19jb3VudDsKKwkJCWlmIChody0+c2tpcF9mcmFtZV9jb3VudCA+IDApIHsKKwkJCQkvKnNraXAgbiBmcmFtZSBhZnRlciBmaXJzdCBJICovCisJCQkJaHctPnNraXBfZnJhbWVfY291bnQtLTsKKwkJCQlpZiAoaHctPnNraXBfZnJhbWVfY291bnQgPT0gMCkKKwkJCQkJaHctPmRlY19mbGFnICY9ICh+Tk9ESVNQX0ZMQUcpOworCQkJfSBlbHNlIGlmIChody0+c2tpcF9mcmFtZV9jb3VudCA8IC0xKSB7CisJCQkJLypza2lwIG4gZnJhbWUgYWZ0ZXIgZmlyc3QgSSB1bnRpbCBzZWNvbmQgSSAqLworCQkJCWh3LT5za2lwX2ZyYW1lX2NvdW50Kys7CisJCQkJaWYgKGh3LT5za2lwX2ZyYW1lX2NvdW50ID09IC0xKQorCQkJCQlody0+ZGVjX2ZsYWcgJj0gKH5OT0RJU1BfRkxBRyk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgdmgyNjRfaXNyX3RocmVhZF9mbihzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgaXJxKQoreworCWludCBpOworCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcgPSAoc3RydWN0IHZkZWNfaDI2NF9od19zICopKHZkZWMtPnByaXZhdGUpOworCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gJmh3LT5kcGI7CisJdW5zaWduZWQgaW50IGRlY19kcGJfc3RhdHVzID0gcF9IMjY0X0RwYi0+ZGVjX2RwYl9zdGF0dXM7CisJdTMyIGRlYnVnX3RhZzsKKworCWlmIChkZWNfZHBiX3N0YXR1cyA9PSBIMjY0X1NMSUNFX0hFQURfRE9ORSB8fAorCQlwX0gyNjRfRHBiLT5kZWNfZHBiX3N0YXR1cyA9PSBIMjY0X0NPTkZJR19SRVFVRVNUKSB7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9USFJFQURfSEVBRF9TVEFSVCk7CisJfQorCWVsc2UgaWYgKGRlY19kcGJfc3RhdHVzID09IEgyNjRfUElDX0RBVEFfRE9ORSkgeworCQlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9JU1JfVEhSRUFEX1BJQ19ET05FX1NUQVJUKTsKKwl9CisJZWxzZSBpZiAoZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9TRUlfREFUQV9SRUFEWSkKKwkJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX1RIUkVBRF9TRUlfU1RBUlQpOworCWVsc2UgaWYgKGRlY19kcGJfc3RhdHVzID09IEgyNjRfQVVYX0RBVEFfUkVBRFkpCisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9USFJFQURfQVVYX1NUQVJUKTsKKworCWlmIChkZWNfZHBiX3N0YXR1cyA9PSBIMjY0X0NPTkZJR19SRVFVRVNUKSB7CisjaWYgMQorCQl1bnNpZ25lZCBzaG9ydCAqcCA9ICh1bnNpZ25lZCBzaG9ydCAqKWh3LT5sbWVtX2FkZHI7CisJCWZvciAoaSA9IDA7IGkgPCAoUlBNX0VORC1SUE1fQkVHSU4pOyBpICs9IDQpIHsKKwkJCWludCBpaTsKKwkJCWZvciAoaWkgPSAwOyBpaSA8IDQ7IGlpKyspIHsKKwkJCQlwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW2kraWldID0KKwkJCQkJcFtpKzMtaWldOworCQkJCWlmIChkcGJfaXNfZGVidWcoREVDT0RFX0lEKGh3KSwKKwkJCQkJUlJJTlRfRkxBR19SUE0pKSB7CisJCQkJCWlmICgoKGkgKyBpaSkgJiAweGYpID09IDApCisJCQkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCQkJCQkwLCAiJTA0eDoiLAorCQkJCQkJCWkpOworCQkJCQlkcGJfcHJpbnRfY29udChERUNPREVfSUQoaHcpLAorCQkJCQkJMCwgIiUwNHggIiwKKwkJCQkJCXBbaSszLWlpXSk7CisJCQkJCWlmICgoKGkgKyBpaSArIDEpICYgMHhmKSA9PSAwKQorCQkJCQkJZHBiX3ByaW50X2NvbnQoCisJCQkJCQlERUNPREVfSUQoaHcpLAorCQkJCQkJCTAsICJcclxuIik7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChwX0gyNjRfRHBiLT5iaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZyAhPQorCQkJKChwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW1NQU19GTEFHUzJdID4+IDMpICYgMHgxKSkgeworCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkicF9IMjY0X0RwYi0+Yml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcgMHgleCwgbmV3IDB4JXhcbiIsCisJCQkJcF9IMjY0X0RwYi0+Yml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcsICgocF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtTUFNfRkxBR1MyXSA+PiAzKSAmIDB4MSkpOworCQkJaHctPmNzZF9jaGFuZ2VfZmxhZyA9IDE7CisJCX0KKwkJcF9IMjY0X0RwYi0+Yml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcgPQorCQkJKHBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbU1BTX0ZMQUdTMl0gPj4gMykgJiAweDE7CisJCXBfSDI2NF9EcGItPm51bV9yZW9yZGVyX2ZyYW1lcyA9CisJCQlwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW05VTV9SRU9SREVSX0ZSQU1FU107CisJCXBfSDI2NF9EcGItPm1heF9kZWNfZnJhbWVfYnVmZmVyaW5nID0KKwkJCXBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbTUFYX0JVRkZFUl9GUkFNRV07CisKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSJIMjY0X0NPTkZJR19SRVFVRVNUOiBwZGIgJWQsICVkLCAlZFxuIiwKKwkJCXBfSDI2NF9EcGItPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnLAorCQkJcF9IMjY0X0RwYi0+bnVtX3Jlb3JkZXJfZnJhbWVzLAorCQkJcF9IMjY0X0RwYi0+bWF4X2RlY19mcmFtZV9idWZmZXJpbmcpOworCQlody0+Yml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcgPQorCQkJcF9IMjY0X0RwYi0+Yml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWc7CisJCWh3LT5udW1fcmVvcmRlcl9mcmFtZXMgPQorCQkJcF9IMjY0X0RwYi0+bnVtX3Jlb3JkZXJfZnJhbWVzOworCQlody0+bWF4X2RlY19mcmFtZV9idWZmZXJpbmcgPQorCQkJcF9IMjY0X0RwYi0+bWF4X2RlY19mcmFtZV9idWZmZXJpbmc7CisKKwkJLypjcm9wKi8KKwkJcF9IMjY0X0RwYi0+Y2hyb21hX2Zvcm1hdF9pZGMgPSBwX0gyNjRfRHBiLT5kcGJfcGFyYW0uZHBiLmNocm9tYV9mb3JtYXRfaWRjOworCQlwX0gyNjRfRHBiLT5mcmFtZV9jcm9wX2xlZnRfb2Zmc2V0ID0gcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmRwYi5mcmFtZV9jcm9wX2xlZnRfb2Zmc2V0OworCQlwX0gyNjRfRHBiLT5mcmFtZV9jcm9wX3JpZ2h0X29mZnNldCA9IHBfSDI2NF9EcGItPmRwYl9wYXJhbS5kcGIuZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQ7CisJCXBfSDI2NF9EcGItPmZyYW1lX2Nyb3BfdG9wX29mZnNldCA9IHBfSDI2NF9EcGItPmRwYl9wYXJhbS5kcGIuZnJhbWVfY3JvcF90b3Bfb2Zmc2V0OworCQlwX0gyNjRfRHBiLT5mcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQgPSBwX0gyNjRfRHBiLT5kcGJfcGFyYW0uZHBiLmZyYW1lX2Nyb3BfYm90dG9tX29mZnNldDsKKworCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkiJXMgY2hyb21hX2Zvcm1hdF9pZGMgJWQgY3JvcCBvZmZzZXQ6IGxlZnQgJWQgcmlnaHQgJWQgdG9wICVkIGJvdHRvbSAlZFxuIiwKKwkJX19mdW5jX18sIHBfSDI2NF9EcGItPmNocm9tYV9mb3JtYXRfaWRjLAorCQlwX0gyNjRfRHBiLT5mcmFtZV9jcm9wX2xlZnRfb2Zmc2V0LAorCQlwX0gyNjRfRHBiLT5mcmFtZV9jcm9wX3JpZ2h0X29mZnNldCwKKwkJcF9IMjY0X0RwYi0+ZnJhbWVfY3JvcF90b3Bfb2Zmc2V0LAorCQlwX0gyNjRfRHBiLT5mcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQpOworI2VuZGlmCisKKwkJV1JJVEVfVlJFRyhEUEJfU1RBVFVTX1JFRywgSDI2NF9BQ1RJT05fQ09ORklHX0RPTkUpOworCQlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCQlody0+cmVnX2lxaWRjdF9jb250cm9sID0gUkVBRF9WUkVHKElRSURDVF9DT05UUk9MKTsKKwkJaHctPnJlZ19pcWlkY3RfY29udHJvbF9pbml0X2ZsYWcgPSAxOworCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfQ09ORklHX1BBUkFNOworI2lmZGVmIERFVEVDVF9XUk9OR19NVUxUSV9TTElDRQorCQkvKnJlc3RhcnQgY2hlY2sgY291bnQgYW5kIHNldCAndW5rbm93bicqLworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19VQ09ERV9FVlQsCisJCSIlcyBNVUxUSV9TTElDRV9ERVRFQ1QgKGNoZWNrX2NvdW50ICVkIHNsaWNlX2NvdW50ICVkIGN1cl9zbGljZV9jb3VudCAlZCBmbGFnICVkKSwgSDI2NF9DT05GSUdfUkVRVUVTVCA9PiByZXN0YXJ0IGNoZWNrXG4iLAorCQlfX2Z1bmNfXywKKwkJaHctPm11bHRpX3NsaWNlX3BpY19jaGVja19jb3VudCwKKwkJaHctPnBpY3R1cmVfc2xpY2VfY291bnQsCisJCWh3LT5jdXJfcGljdHVyZV9zbGljZV9jb3VudCwKKwkJaHctPm11bHRpX3NsaWNlX3BpY19mbGFnKTsKKworCQlody0+bXVsdGlfc2xpY2VfcGljX2NoZWNrX2NvdW50ID0gMDsKKwkJaHctPm11bHRpX3NsaWNlX3BpY19mbGFnID0gMDsKKwkJaHctPnBpY3R1cmVfc2xpY2VfY291bnQgPSAwOworI2VuZGlmCisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9USFJFQURfSEVBRF9FTkQpOworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwl9IGVsc2UgaWYgKGRlY19kcGJfc3RhdHVzID09IEgyNjRfU0xJQ0VfSEVBRF9ET05FKSB7CisJCXUxNiBkYXRhX2hpZ2h0OworCQl1MTYgZGF0YV9sb3c7CisJCXUzMiB2aWRlb19zaWduYWw7CisKKwkJaW50IHNsaWNlX2hlYWRlcl9wcm9jZXNzX3N0YXR1cyA9IDA7CisJCWludCBJX2ZsYWc7CisJCWludCBmcmFtZV9udW1fZ2FwID0gMDsKKwkJdW5pb24gcGFyYW0gZHBiX3BhcmFtX2JhazsKKwkJLyp1bnNpZ25lZCBjaGFyIGlzX2lkcjsqLworCQl1bnNpZ25lZCBzaG9ydCAqcCA9ICh1bnNpZ25lZCBzaG9ydCAqKWh3LT5sbWVtX2FkZHI7CisJCXVuc2lnbmVkIG1iX3dpZHRoID0gaHctPnNlcV9pbmZvMiAmIDB4ZmY7CisJCXVuc2lnbmVkIHNob3J0IGZpcnN0X21iX2luX3NsaWNlOworCQl1bnNpZ25lZCBpbnQgZGVjb2RlX21iX2NvdW50LCBtYnlfbWJ4OworCQlzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpwaWMgPSBwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmU7CisJCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisJCWh3LT5mcm1iYXNlX2NvbnRfZmxhZyA9IDA7CisKKwkJaWYgKChwaWMgIT0gTlVMTCkgJiYgKHBpYy0+bWJfYWZmX2ZyYW1lX2ZsYWcgPT0gMSkpCisJCQlmaXJzdF9tYl9pbl9zbGljZSA9IHBbRklSU1RfTUJfSU5fU0xJQ0UgKyAzXSAqIDI7CisJCWVsc2UKKwkJCWZpcnN0X21iX2luX3NsaWNlID0gcFtGSVJTVF9NQl9JTl9TTElDRSArIDNdOworCisjaWZkZWYgREVURUNUX1dST05HX01VTFRJX1NMSUNFCisJCWh3LT5jdXJfcGljdHVyZV9zbGljZV9jb3VudCsrOworCisJCWlmICgoZXJyb3JfcHJvY19wb2xpY3kgJiAweDEwMDAwKSAmJgorCQkJKGh3LT5jdXJfcGljdHVyZV9zbGljZV9jb3VudCA+IDEpICYmCisJCQkoZmlyc3RfbWJfaW5fc2xpY2UgPT0gMCkgJiYKKwkJCShody0+bXVsdGlfc2xpY2VfcGljX2ZsYWcgPT0gMCkpCisJCQkJaHctPm11bHRpX3NsaWNlX3BpY19jaGVja19jb3VudCA9IDA7CisKKwkJaWYgKChlcnJvcl9wcm9jX3BvbGljeSAmIDB4MTAwMDApICYmCisJCQkoaHctPmN1cl9waWN0dXJlX3NsaWNlX2NvdW50ID4gMSkgJiYKKwkJCShody0+bXVsdGlfc2xpY2VfcGljX2ZsYWcgPT0gMSkpIHsKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJIiVzIE1VTFRJX1NMSUNFX0RFVEVDVCAoY2hlY2tfY291bnQgJWQgc2xpY2VfY291bnQgJWQgY3VyX3NsaWNlX2NvdW50ICVkIGZsYWcgJWQpLCBXUk9OR19NVUxUSV9TTElDRSBkZXRlY3RlZCwgaW5zZXJ0IHBpY3R1cmVcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWh3LT5tdWx0aV9zbGljZV9waWNfY2hlY2tfY291bnQsCisJCQlody0+cGljdHVyZV9zbGljZV9jb3VudCwKKwkJCWh3LT5jdXJfcGljdHVyZV9zbGljZV9jb3VudCwKKwkJCWh3LT5tdWx0aV9zbGljZV9waWNfZmxhZyk7CisKKwkJCW1ieV9tYnggPSBSRUFEX1ZSRUcoTUJZX01CWCk7CisJCQlkZWNvZGVfbWJfY291bnQgPSAoKG1ieV9tYnggJiAweGZmKSAqIG1iX3dpZHRoICsKKwkJCQkJKCgobWJ5X21ieCA+PiA4KSAmIDB4ZmYpICsgMSkpOworCisJCQlpZiAoZmlyc3RfbWJfaW5fc2xpY2UgPT0gZGVjb2RlX21iX2NvdW50ICYmCisJCQkJZmlyc3RfbWJfaW5fc2xpY2UgIT0gMCkgeworCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJCSIlcyBmaXJzdF9tYl9pbl9zbGljZSA9ICVkIFxuIiwKKwkJCQlfX2Z1bmNfXywgZmlyc3RfbWJfaW5fc2xpY2UpOworCisJCQkJaHctPm11bHRpX3NsaWNlX3BpY19mbGFnID0gMDsKKwkJCQlody0+bXVsdGlfc2xpY2VfcGljX2NoZWNrX2NvdW50ID0gMDsKKwkJCX0gZWxzZSBpZiAoaHctPmN1cl9waWN0dXJlX3NsaWNlX2NvdW50ID4gaHctPmxhc3RfcGljdHVyZV9zbGljZV9jb3VudCkgeworCQkJCXZoMjY0X3BpY19kb25lX3Byb2ModmRlYyk7CisJCQkJLy9pZiAocF9IMjY0X0RwYi0+bURQQi51c2VkX3NpemUgPT0gcF9IMjY0X0RwYi0+bURQQi5zaXplKSB7CisJCQkJaWYgKCFoYXZlX2ZyZWVfYnVmX3NwZWModmRlYykpIHsKKwkJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsICJkcGIgZnVsbCwgd2FpdCBidWZmZXJcbiIpOworCQkJCQlwX0gyNjRfRHBiLT5tVmlkZW8ucHJlX2ZyYW1lX251bSA9IGh3LT5maXJzdF9wcmVfZnJhbWVfbnVtOworCQkJCQlody0+bGFzdF9waWN0dXJlX3NsaWNlX2NvdW50ID0gaHctPmN1cl9waWN0dXJlX3NsaWNlX2NvdW50OworCQkJCQlody0+bm9fZGVjb2Rlcl9idWZmZXJfZmxhZyA9IDE7CisJCQkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKwkJCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQlpZiAocF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlKSB7CisJCQkJCWlmIChwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPmNvbG9jYXRlZF9idWZfaW5kZXggPj0gMCkgeworCQkJCQkJcmVsZWFzZV9jb2xvY2F0ZV9idWYocF9IMjY0X0RwYiwKKwkJCQkJCXBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZS0+Y29sb2NhdGVkX2J1Zl9pbmRleCk7CisJCQkJCQlwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPmNvbG9jYXRlZF9idWZfaW5kZXggPSAtMTsKKwkJCQkJfQorCQkJCX0KKwkJCQlyZWxlYXNlX2N1cl9kZWNvZGluZ19idWYoaHcpOworCQkJfQorCQl9CisjZW5kaWYKKworCQlody0+cmVnX2lxaWRjdF9jb250cm9sID0gUkVBRF9WUkVHKElRSURDVF9DT05UUk9MKTsKKwkJaHctPnJlZ19pcWlkY3RfY29udHJvbF9pbml0X2ZsYWcgPSAxOworCQlody0+cmVnX3Zjb3BfY3RybF9yZWcgPSBSRUFEX1ZSRUcoVkNPUF9DVFJMX1JFRyk7CisJCWh3LT5yZWdfcnZfYWlfbWJfY291bnQgPSBSRUFEX1ZSRUcoUlZfQUlfTUJfQ09VTlQpOworCQlody0+dmxkX2RlY19jb250cm9sID0gUkVBRF9WUkVHKFZMRF9ERUNPREVfQ09OVFJPTCk7CisJCWlmIChpbnB1dF9mcmFtZV9iYXNlZCh2ZGVjKSAmJgorCQkJZnJtYmFzZV9jb250X2JpdGxldmVsMiAhPSAwICYmCisJCQlSRUFEX1ZSRUcoVklGRl9CSVRfQ05UKSA8CisJCQlmcm1iYXNlX2NvbnRfYml0bGV2ZWwyICYmCisJCQlody0+Z2V0X2RhdGFfY291bnQgPj0gMHg3MDAwMDAwMCkgeworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkiJXMgSDI2NF9TTElDRV9IRUFEX0RPTkUgd2l0aCBzbWFsbCBiaXRjbnQgJWQsIGdvdG8gZW1wdHlfcHJvY1xuIiwKKwkJCV9fZnVuY19fLAorCQkJUkVBRF9WUkVHKFZJRkZfQklUX0NOVCkpOworCisJCQlnb3RvIGVtcHR5X3Byb2M7CisJCX0KKworI2lmIDAKKwkJaWYgKHBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZSA9PSBOVUxMKSB7CisJCQlpZiAoIWlzX2J1ZmZlcl9hdmFpbGFibGUodmRlYykpIHsKKwkJCQlody0+YnVmZmVyX2VtcHR5X2ZsYWcgPSAxOworCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLAorCQkJCVBSSU5UX0ZMQUdfVUNPREVfRVZULAorCQkJCSIlcywgYnVmZmVyX2VtcHR5LCBuZXdmcmFtZV9xKCVkKSwgaGF2ZV9mcmVlX2J1Zl9zcGVjKCVkKSwgaW5pdF9kb25lKCVkKSwgdXNlZF9zaXplKCVkLyVkKSwgaXNfdGhlcmVfdW51c2VkX2ZyYW1lX2Zyb21fZHBiKCVkKVxuIiwKKwkJCQkJX19mdW5jX18sCisJCQkJCWtmaWZvX2xlbigmaHctPm5ld2ZyYW1lX3EpLAorCQkJCQloYXZlX2ZyZWVfYnVmX3NwZWModmRlYyksCisJCQkJCXBfSDI2NF9EcGItPm1EUEIuaW5pdF9kb25lLAorCQkJCQlwX0gyNjRfRHBiLT5tRFBCLnVzZWRfc2l6ZSwKKwkJCQkJcF9IMjY0X0RwYi0+bURQQi5zaXplLAorCQkJCQlpc190aGVyZV91bnVzZWRfZnJhbWVfZnJvbV9kcGIoCisJCQkJCQkmcF9IMjY0X0RwYi0+bURQQikpOworCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCX0KKwkJfQorCisJCWh3LT5idWZmZXJfZW1wdHlfZmxhZyA9IDA7CisjZW5kaWYKKyNpZmRlZiBTRU5EX1BBUkFNX1dJVEhfUkVHCisJCWZvciAoaSA9IDA7IGkgPCAoUlBNX0VORC1SUE1fQkVHSU4pOyBpKyspIHsKKwkJCXVuc2lnbmVkIGludCBkYXRhMzI7CisKKwkJCWRvIHsKKwkJCQlkYXRhMzIgPSBSRUFEX1ZSRUcoUlBNX0NNRF9SRUcpOworCQkJCS8qIHByaW50aygiJXhcbiIsIGRhdGEzMik7ICovCisJCQl9IHdoaWxlICgoZGF0YTMyJjB4MTAwMDApID09IDApOworCQkJcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtpXSA9IGRhdGEzMiAmIDB4ZmZmZjsKKwkJCVdSSVRFX1ZSRUcoUlBNX0NNRF9SRUcsIDApOworCQkJLyogcHJpbnRrKCIleDoleFxuIiwgaSxkYXRhMzIpOyAqLworCQl9CisjZWxzZQorCQlkcGJfcGFyYW1fYmFrID0gcF9IMjY0X0RwYi0+ZHBiX3BhcmFtOworCisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfaGVhZGVyX3RpbWVfbmFtZSwgVFJBQ0VfSEVBREVSX1JQTV9TVEFSVCk7CisKKwkJZm9yIChpID0gMDsgaSA8IChSUE1fRU5ELVJQTV9CRUdJTik7IGkgKz0gNCkgeworCQkJaW50IGlpOworCisJCQlmb3IgKGlpID0gMDsgaWkgPCA0OyBpaSsrKSB7CisJCQkJcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtpK2lpXSA9CisJCQkJCXBbaSszLWlpXTsKKwkJCQlpZiAoZHBiX2lzX2RlYnVnKERFQ09ERV9JRChodyksCisJCQkJCVJSSU5UX0ZMQUdfUlBNKSkgeworCQkJCQlpZiAoKChpICsgaWkpICYgMHhmKSA9PSAwKQorCQkJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJCQkJMCwgIiUwNHg6IiwKKwkJCQkJCQlpKTsKKwkJCQkJZHBiX3ByaW50X2NvbnQoREVDT0RFX0lEKGh3KSwKKwkJCQkJCTAsICIlMDR4ICIsCisJCQkJCQlwW2krMy1paV0pOworCQkJCQlpZiAoKChpICsgaWkgKyAxKSAmIDB4ZikgPT0gMCkKKwkJCQkJCWRwYl9wcmludF9jb250KAorCQkJCQkJREVDT0RFX0lEKGh3KSwKKwkJCQkJCQkwLCAiXHJcbiIpOworCQkJCX0KKwkJCX0KKwkJfQorCQlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX2hlYWRlcl90aW1lX25hbWUsIFRSQUNFX0hFQURFUl9SUE1fRU5EKTsKKyNlbmRpZgorI2lmZGVmIERFVEVDVF9XUk9OR19NVUxUSV9TTElDRQorCisJCWlmIChwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUgJiYKKwkJCQlody0+bXVsdGlfc2xpY2VfcGljX2ZsYWcgPT0gMiAmJgorCQkJCShwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW1NMSUNFX1RZUEVdICE9IGRwYl9wYXJhbV9iYWsubC5kYXRhW1NMSUNFX1RZUEVdIHx8CisJCQkJZHBiX3BhcmFtX2Jhay5sLmRhdGFbRklSU1RfTUJfSU5fU0xJQ0VdID4gcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtGSVJTVF9NQl9JTl9TTElDRV0pKSB7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCQkiZGVjb2RlIG5leHQgcGljLCBzYXZlIGJlZm9yZSwgU0xJQ0VfVFlQRSBCQUsgJWQsIFNMSUNFX1RZUEUgJWQsIEZJUlNUX01CX0lOX1NMSUNFIEJBSyAlZCwgRklSU1RfTUJfSU5fU0xJQ0UgJWRcbiIsCisJCQkJCWRwYl9wYXJhbV9iYWsubC5kYXRhW1NMSUNFX1RZUEVdLCBwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW1NMSUNFX1RZUEVdLAorCQkJCQlkcGJfcGFyYW1fYmFrLmwuZGF0YVtGSVJTVF9NQl9JTl9TTElDRV0sIHBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbRklSU1RfTUJfSU5fU0xJQ0VdKTsKKwkJCXZoMjY0X3BpY19kb25lX3Byb2ModmRlYyk7CisJCX0KKyNlbmRpZgorCQlkYXRhX2xvdyA9IHBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbVklERU9fU0lHTkFMX0xPV107CisJCWRhdGFfaGlnaHQgPSBwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW1ZJREVPX1NJR05BTF9ISUdIVF07CisKKwkJdmlkZW9fc2lnbmFsID0gKGRhdGFfaGlnaHQgPDwgMTYpIHwgZGF0YV9sb3c7CisJCWh3LT52aWRlb19zaWduYWxfZnJvbV92dWkgPQorCQkJCQkoKHZpZGVvX3NpZ25hbCAmIDB4ZmZmZikgPDwgOCkgfAorCQkJCQkoKHZpZGVvX3NpZ25hbCAmIDB4ZmYwMDAwKSA+PiAxNikgfAorCQkJCQkoKHZpZGVvX3NpZ25hbCAmIDB4M2YwMDAwMDApKTsKKworCisJCS8qZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJMCwKKwkJCQkidmlkZW9fc2lnbmFsX2Zyb21fdnVpOjB4JXgsICIKKwkJCQkiZGF0YV9sb3c6MHgleCwgZGF0YV9oaWdodDoweCV4XG4iLAorCQkJCWh3LT52aWRlb19zaWduYWxfZnJvbV92dWksCisJCQkJZGF0YV9sb3csCisJCQkJZGF0YV9oaWdodCk7Ki8KKworCQlwYXJzZV9zZWlfZGF0YShodywgaHctPnNlaV9kYXRhX2J1ZiwgaHctPnNlaV9kYXRhX2xlbik7CisKKwkJaWYgKGh3LT5jb25maWdfYnVmbWdyX2RvbmUgPT0gMCkgeworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLAorCQkJCVBSSU5UX0ZMQUdfVUNPREVfRVZULAorCQkJCSJjb25maWdfYnVmbWdyIG5vdCBkb25lLCBkaXNjYXJkIGZyYW1lXG4iKTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfSBlbHNlIGlmICgoaHctPmZpcnN0X2lfcG9saWN5ICYgMHgzKSAhPSAwKSB7CisJCQl1bnNpZ25lZCBjaGFyIGlzX2lfc2xpY2UgPQorCQkJCShwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW1NMSUNFX1RZUEVdCisJCQkJCT09IElfU2xpY2UpCisJCQkJPyAxIDogMDsKKwkJCXVuc2lnbmVkIGNoYXIgaXNfaWRyID0KKwkJCSgocF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmRwYi5OQUxfaW5mb19tbWNvICYgMHgxZikKKwkJCQk9PSA1KTsKKwkJCWlmICgoaHctPmZpcnN0X2lfcG9saWN5ICYgMHgzKSA9PSAweDMpCisJCQkJaXNfaV9zbGljZSA9IGlzX2lkcjsKKwkJCWlmICghaXNfaV9zbGljZSkgeworCQkJCWlmIChody0+aGFzX2lfZnJhbWUgPT0gMCkgeworCQkJCQlhbXZkZWNfc3RvcCgpOworCQkJCQl2ZGVjLT5tY19sb2FkZWQgPSAwOworCQkJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwkJCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLAorCQkJCQkJUFJJTlRfRkxBR19VQ09ERV9FVlQsCisJCQkJCQkiaGFzX2lfZnJhbWUgaXMgMCwgZGlzY2FyZCBub25lIEkoRFIpIGZyYW1lIHNpbGNlX3R5cGUgJWQgaXNfaWRyICVkXG4iLCBwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW1NMSUNFX1RZUEVdLCBpc19pZHIpOworCQkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoaHctPnNraXBfZnJhbWVfY291bnQgPCAwIHx8IGlzX2lkcikgeworCQkJCQkvKiBzZWNvbmQgSSAqLworCQkJCQlody0+ZGVjX2ZsYWcgJj0gKH5OT0RJU1BfRkxBRyk7CisJCQkJCWh3LT5za2lwX2ZyYW1lX2NvdW50ID0gMDsKKwkJCQl9CisJCQkJaWYgKGh3LT5oYXNfaV9mcmFtZSA9PSAwICYmCisJCQkJCSghaXNfaWRyKSkgeworCQkJCQlpbnQgc2tpcF9jb3VudCA9CisJCQkJCQkoaHctPmZpcnN0X2lfcG9saWN5ID4+IDgpICYgMHhmZjsKKwkJCQkJLyogZmlyc3QgSSAobm90IElEUikgKi8KKwkJCQkJaWYgKChody0+Zmlyc3RfaV9wb2xpY3kgJiAweDMpID09IDIpCisJCQkJCQlody0+c2tpcF9mcmFtZV9jb3VudCA9CisJCQkJCQkJLTEgLSBza2lwX2NvdW50OworCQkJCQllbHNlCisJCQkJCQlody0+c2tpcF9mcmFtZV9jb3VudCA9CisJCQkJCQkJc2tpcF9jb3VudDsKKwkJCQkJaWYgKGh3LT5za2lwX2ZyYW1lX2NvdW50ICE9IDApCisJCQkJCQlody0+ZGVjX2ZsYWcgfD0gTk9ESVNQX0ZMQUc7CisJCQkJfQorCQkJfQorCQl9CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1VDT0RFX0VWVCwKKwkJCSJjdXJyZW50IGRwYiBpbmRleCAlZCwgcG9jICVkLCB0b3AvYm90IHBvYyAoJWQsJWQpXG4iLAorCQkJcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmRwYi5jdXJyZW50X2RwYl9pbmRleCwKKwkJCXZhbChwX0gyNjRfRHBiLT5kcGJfcGFyYW0uZHBiLmZyYW1lX3BpY19vcmRlcl9jbnQpLAorCQkJdmFsKHBfSDI2NF9EcGItPmRwYl9wYXJhbS5kcGIudG9wX2ZpZWxkX3BpY19vcmRlcl9jbnQpLAorCQkJdmFsKHBfSDI2NF9EcGItPmRwYl9wYXJhbS5kcGIudG9wX2ZpZWxkX3BpY19vcmRlcl9jbnQpKTsKKwkJSV9mbGFnID0gKHBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbU0xJQ0VfVFlQRV0gPT0gSV9TbGljZSkKKwkJCT8gSV9GTEFHIDogMDsKKworCQlpZiAoKGh3LT5pX29ubHkgJiAweDIpICYmIChJX2ZsYWcgJiBJX0ZMQUcpKQorCQkJZmx1c2hfZHBiKHBfSDI2NF9EcGIpOworCisJCWlmICgoaHctPmlfb25seSAmIDB4MikgJiYgKCEoSV9mbGFnICYgSV9GTEFHKSkgJiYKKwkJCShwX0gyNjRfRHBiLT5tU2xpY2Uuc3RydWN0dXJlID09IEZSQU1FKSkgeworCQkJCWh3LT5kYXRhX2ZsYWcgPSBOVUxMX0ZMQUc7CisJCQkJZ290byBwaWNfZG9uZV9wcm9jOworCQl9CisKKwkJc2xpY2VfaGVhZGVyX3Byb2Nlc3Nfc3RhdHVzID0KKwkJCWgyNjRfc2xpY2VfaGVhZGVyX3Byb2Nlc3MocF9IMjY0X0RwYiwgJmZyYW1lX251bV9nYXApOworCQlpZiAoaHctPm1tdV9lbmFibGUpCisJCQloZXZjX3Nhb19zZXRfc2xpY2VfdHlwZShodywKKwkJCQlzbGljZV9oZWFkZXJfcHJvY2Vzc19zdGF0dXMsCisJCQkJCWh3LT5kcGIubVNsaWNlLmlkcl9mbGFnKTsKKwkJdnVpX2NvbmZpZyhodyk7CisKKwkJaWYgKHBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZSkgeworCQkJaW50IGNmZ19yZXQgPSAwOworCQkJYm9vbCBmaWVsZF9waWNfZmxhZyA9IGZhbHNlOworCQkJdW5zaWduZWQgbWJ5X21ieCA9IFJFQURfVlJFRyhNQllfTUJYKTsKKwkJCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnAgPQorCQkJCXBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZTsKKworCQkJaWYgKHNsaWNlX2hlYWRlcl9wcm9jZXNzX3N0YXR1cyA9PSAxKSB7CisJCQkJaWYgKCFwX0gyNjRfRHBiLT5tU1BTLmZyYW1lX21ic19vbmx5X2ZsYWcpIHsKKwkJCQkJZmllbGRfcGljX2ZsYWcgPQorCQkJCQkJKHBfSDI2NF9EcGItPm1TbGljZS5zdHJ1Y3R1cmUgPT0gVE9QX0ZJRUxEIHx8CisJCQkJCQlwX0gyNjRfRHBiLT5tU2xpY2Uuc3RydWN0dXJlID09IEJPVFRPTV9GSUVMRCkgPworCQkJCQkJdHJ1ZSA6IGZhbHNlOworCQkJCX0KKworCQkJCXZkZWNfc2V0X3Byb2ZpbGVfbGV2ZWwodmRlYywgcF9IMjY0X0RwYi0+bVNQUy5wcm9maWxlX2lkYywKKwkJCQkJcF9IMjY0X0RwYi0+bVNQUy5sZXZlbF9pZGMpOworCisJCQkJaWYgKCFmaWVsZF9waWNfZmxhZyAmJiAoKChwX0gyNjRfRHBiLT5tU1BTLnByb2ZpbGVfaWRjID09IEJBU0VMSU5FKSAmJgorCQkJCQkocF9IMjY0X0RwYi0+ZGVjX2RwYl9zaXplIDwgMikpIHx8CisJCQkJCSgoKHVuc2lnbmVkIGxvbmcpKGh3LT52aDI2NF9hbXN0cmVhbV9kZWNfaW5mbworCQkJCQkJLnBhcmFtKSkgJiAweDgpIHx8IGh3LT5sb3dfbGF0ZW5jeV9tb2RlICYgMHg4KSkgeworCQkJCQlwX0gyNjRfRHBiLT5mYXN0X291dHB1dF9lbmFibGUgPQorCQkJCQlIMjY0X09VVFBVVF9NT0RFX0ZBU1Q7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJcF9IMjY0X0RwYi0+ZmFzdF9vdXRwdXRfZW5hYmxlCisJCQkJCQkJPSBmYXN0X291dHB1dF9lbmFibGU7CisJCQkJaWYgKGh3LT5lbmFibGVfZmVuY2UpCisJCQkJCXBfSDI2NF9EcGItPmZhc3Rfb3V0cHV0X2VuYWJsZSA9IEgyNjRfT1VUUFVUX01PREVfRkFTVDsKKworCQkJCWh3LT5kYXRhX2ZsYWcgPSBJX2ZsYWc7CisJCQkJaWYgKChwX0gyNjRfRHBiLT4KKwkJCQkJZHBiX3BhcmFtLmRwYi5OQUxfaW5mb19tbWNvICYgMHgxZikKKwkJCQkJPT0gNSkKKwkJCQkJaHctPmRhdGFfZmxhZyB8PSBJRFJfRkxBRzsKKwkJCQlpZiAoKHBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbRklSU1RfTUJfSU5fU0xJQ0VdKSAmJiAhbWJ5X21ieCkgeworCQkJCQlwLT5kYXRhX2ZsYWcgfD0gRVJST1JfRkxBRzsKKwkJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJCQlQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJCQkJIm9uZSBzbGljZSBlcnJvciBpbiBtdXVsdGktc2xpY2UgIGZpcnN0X21iIDB4JXggbWJ5X21ieCAweCV4ICBzbGljZV90eXBlICVkXG4iLAorCQkJCQkJcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuCisJCQkJCQlkYXRhW0ZJUlNUX01CX0lOX1NMSUNFXSwKKwkJCQkJCVJFQURfVlJFRyhNQllfTUJYKSwKKwkJCQkJCSBwLT5zbGljZV90eXBlKTsKKwkJCQl9CisJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCQkiPT09PT09PT09PT09PT09PT09PiBmcmFtZSBjb3VudCAlZCB0byBza2lwICVkXG4iLAorCQkJCWh3LT5kZWNvZGVfcGljX2NvdW50KzEsCisJCQkJaHctPnNraXBfZnJhbWVfY291bnQpOworCQkJCX0gZWxzZSBpZiAoZXJyb3JfcHJvY19wb2xpY3kgJiAweDEwMCl7CisJCQkJCXVuc2lnbmVkIGRlY29kZV9tYl9jb3VudCA9CisJCQkJCQkoKG1ieV9tYnggJiAweGZmKSAqIGh3LT5tYl93aWR0aCArCisJCQkJCQkoKChtYnlfbWJ4ID4+IDgpICYgMHhmZikgKyAxKSk7CisJCQkJCWlmIChkZWNvZGVfbWJfY291bnQgPAorCQkJCQkJKChwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW0ZJUlNUX01CX0lOX1NMSUNFXSkgKgorCQkJCQkJKDEgKyBwLT5tYl9hZmZfZnJhbWVfZmxhZykpICYmIGRlY29kZV9tYl9jb3VudCkgeworCQkJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJCQlQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJCQkJIkVycm9yIGRldGVjdCEgZmlyc3RfbWIgMHgleCBtYnlfbWJ4IDB4JXggZGVjb2RlX21iIDB4JXhcbiIsCisJCQkJCQlwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC4KKwkJCQkJCWRhdGFbRklSU1RfTUJfSU5fU0xJQ0VdLAorCQkJCQkJUkVBRF9WUkVHKE1CWV9NQlgpLAorCQkJCQkJZGVjb2RlX21iX2NvdW50KTsKKwkJCQkJCXAtPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOworCQkJCQl9LyogZWxzZSBpZiAoIXBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbRklSU1RfTUJfSU5fU0xJQ0VdICYmIGRlY29kZV9tYl9jb3VudCkgeworCQkJCQkJcC0+ZGF0YV9mbGFnIHw9IEVSUk9SX0ZMQUc7CisJCQkJCQlnb3RvIHBpY19kb25lX3Byb2M7CisJCQkJCX0qLworCQkJCX0KKworCQkJaWYgKCFJX2ZsYWcgJiYgZnJhbWVfbnVtX2dhcCAmJiAhcF9IMjY0X0RwYi0+bG9uZ190ZXJtX3JlZmVyZW5jZV9mbGFnKSB7CisJCQkJaWYgKCEoZXJyb3JfcHJvY19wb2xpY3kgJiAweDgwMDAwMCkpIHsKKwkJCQkJaHctPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOworCQkJCQlwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOworCQkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwgImZyYW1lIG51bWJlciBnYXAgZXJyb3JcbiIpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKChlcnJvcl9wcm9jX3BvbGljeSAmIDB4NDAwKSAmJiAhaHctPmVuYWJsZV9mZW5jZSkgeworCQkJCWludCByZXQgPSBkcGJfY2hlY2tfcmVmX2xpc3RfZXJyb3IocF9IMjY0X0RwYik7CisJCQkJaWYgKHJldCAhPSAwKSB7CisJCQkJCWh3LT5yZWZsaXN0X2Vycm9yX2NvdW50ICsrOworCQkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCQkJCSJyZWZlcmVuY2UgbGlzdCBlcnJvciAlZCBmcmFtZSBjb3VudCAlZCB0byBza2lwICVkIHJlZmxpc3RfZXJyb3JfY291bnQgJWRcbiIsCisJCQkJCQlyZXQsCisJCQkJCQlody0+ZGVjb2RlX3BpY19jb3VudCsxLAorCQkJCQkJaHctPnNraXBfZnJhbWVfY291bnQsCisJCQkJCQlody0+cmVmbGlzdF9lcnJvcl9jb3VudCk7CisKKwkJCQkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlLT5kYXRhX2ZsYWcgPSBOT0RJU1BfRkxBRzsKKwkJCQkJaWYgKCgoZXJyb3JfcHJvY19wb2xpY3kgJiAweDgwKQorCQkJCQkJJiYgKChody0+ZGVjX2ZsYWcgJgorCQkJCQkJCU5PRElTUF9GTEFHKSA9PSAwKSkgfHwoaHctPnJlZmxpc3RfZXJyb3JfY291bnQgPiA1MCkpIHsKKwkJCQkJCWh3LT5yZXNldF9idWZtZ3JfZmxhZyA9IDE7CisJCQkJCQlody0+cmVmbGlzdF9lcnJvcl9jb3VudCA9MDsKKwkJCQkJCWFtdmRlY19zdG9wKCk7CisJCQkJCQl2ZGVjLT5tY19sb2FkZWQgPSAwOworCQkJCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJCQkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCQkJfQorCQkJCX0gZWxzZQorCQkJCQlody0+cmVmbGlzdF9lcnJvcl9jb3VudCA9IDA7CisJCQl9CisJCQlpZiAoKGVycm9yX3Byb2NfcG9saWN5ICYgMHg4MDApICYmICghKGh3LT5pX29ubHkgJiAweDIpKQorCQkJCSYmIHBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnICE9IDApIHsKKwkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCQkJImRwYiBlcnJvciAlZFxuIiwKKwkJCQkJcF9IMjY0X0RwYi0+ZHBiX2Vycm9yX2ZsYWcpOworCQkJCWh3LT5kYXRhX2ZsYWcgfD0gRVJST1JfRkxBRzsKKwkJCQlwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOworCQkJCWlmICgoZXJyb3JfcHJvY19wb2xpY3kgJiAweDgwKSAmJgorCQkJCQkoKGh3LT5kZWNfZmxhZyAmIE5PRElTUF9GTEFHKSA9PSAwKSkgeworCQkJCQlody0+cmVzZXRfYnVmbWdyX2ZsYWcgPSAxOworCQkJCQlhbXZkZWNfc3RvcCgpOworCQkJCQl2ZGVjLT5tY19sb2FkZWQgPSAwOworCQkJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwkJCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCQl9CisJCQl9CisJCQlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX2hlYWRlcl90aW1lX25hbWUsIFRSQUNFX0hFQURFUl9SRUdJU1RFUl9TVEFSVCk7CisJCQljZmdfcmV0ID0gY29uZmlnX2RlY29kZV9idWYoaHcsCisJCQkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlKTsKKwkJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfaGVhZGVyX3RpbWVfbmFtZSwgVFJBQ0VfSEVBREVSX1JFR0lTVEVSX0VORCk7CisJCQlpZiAoY2ZnX3JldCA8IDApIHsKKwkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19FUlJPUiwKKwkJCQkJImNvbmZpZ19kZWNvZGVfYnVmIGZhaWwgKCVkKVxuIiwKKwkJCQkJY2ZnX3JldCk7CisJCQkJaWYgKGVycm9yX3Byb2NfcG9saWN5ICYgMHgyKSB7CisJCQkJCXJlbGVhc2VfY3VyX2RlY29kaW5nX2J1Zihodyk7CisJCQkJCS8qaHctPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOyovCisJCQkJCWh3LT5yZXNldF9idWZtZ3JfZmxhZyA9IDE7CisJCQkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworCQkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJCX0gZWxzZQorCQkJCQlody0+ZGF0YV9mbGFnIHw9IEVSUk9SX0ZMQUc7CisJCQkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlLT5kYXRhX2ZsYWcgfD0gRVJST1JfRkxBRzsKKwkJCX0KKwkJfQorCisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9USFJFQURfSEVBRF9FTkQpOworCisJCWlmIChzbGljZV9oZWFkZXJfcHJvY2Vzc19zdGF0dXMgPT0gMSkKKwkJCVdSSVRFX1ZSRUcoRFBCX1NUQVRVU19SRUcsIEgyNjRfQUNUSU9OX0RFQ09ERV9ORVdQSUMpOworCQllbHNlCisJCQlXUklURV9WUkVHKERQQl9TVEFUVVNfUkVHLCBIMjY0X0FDVElPTl9ERUNPREVfU0xJQ0UpOworCQlody0+bGFzdF9tYnlfbWJ4ID0gMDsKKwkJaHctPmxhc3RfdmxkX2xldmVsID0gMDsKKwkJc3RhcnRfcHJvY2Vzc190aW1lKGh3KTsKKwl9IGVsc2UgaWYgKGRlY19kcGJfc3RhdHVzID09IEgyNjRfUElDX0RBVEFfRE9ORQorCQl8fCgoZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9EQVRBX1JFUVVFU1QpICYmIGlucHV0X2ZyYW1lX2Jhc2VkKHZkZWMpKSkgeworI2lmZGVmIERFVEVDVF9XUk9OR19NVUxUSV9TTElDRQorCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1VDT0RFX0VWVCwKKwkJCQkiJXMgTVVMVElfU0xJQ0VfREVURUNUIChjaGVja19jb3VudCAlZCBzbGljZV9jb3VudCAlZCBjdXJfc2xpY2VfY291bnQgJWQgZmxhZyAlZCksIEgyNjRfUElDX0RBVEFfRE9ORVxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlody0+bXVsdGlfc2xpY2VfcGljX2NoZWNrX2NvdW50LAorCQkJCWh3LT5waWN0dXJlX3NsaWNlX2NvdW50LAorCQkJCWh3LT5jdXJfcGljdHVyZV9zbGljZV9jb3VudCwKKwkJCQlody0+bXVsdGlfc2xpY2VfcGljX2ZsYWcpOworCisJCQkJaWYgKGh3LT5tdWx0aV9zbGljZV9waWNfY2hlY2tfY291bnQgPCBjaGVja19zbGljZV9udW0pIHsKKwkJCQkJaHctPm11bHRpX3NsaWNlX3BpY19jaGVja19jb3VudCsrOworCQkJCQlpZiAoaHctPmN1cl9waWN0dXJlX3NsaWNlX2NvdW50ICE9CisJCQkJCQlody0+cGljdHVyZV9zbGljZV9jb3VudCkgeworCQkJCQkJLypyZXN0YXJ0IGNoZWNrIGNvdW50IGFuZCBzZXQgJ3Vua25vd24nKi8KKwkJCQkJCWh3LT5tdWx0aV9zbGljZV9waWNfY2hlY2tfY291bnQgPSAwOworCQkJCQkJaHctPm11bHRpX3NsaWNlX3BpY19mbGFnID0gMDsKKwkJCQkJfQorCQkJCQlody0+cGljdHVyZV9zbGljZV9jb3VudCA9CisJCQkJCQlody0+Y3VyX3BpY3R1cmVfc2xpY2VfY291bnQ7CisJCQkJfSBlbHNlIGlmIChody0+bXVsdGlfc2xpY2VfcGljX2NoZWNrX2NvdW50ID49IGNoZWNrX3NsaWNlX251bSkgeworCQkJCQlpZiAoaHctPnBpY3R1cmVfc2xpY2VfY291bnQgPiAxKQorCQkJCQkJaHctPm11bHRpX3NsaWNlX3BpY19mbGFnID0gMjsKKwkJCQkJZWxzZQorCQkJCQkJaHctPm11bHRpX3NsaWNlX3BpY19mbGFnID0gMTsKKwkJCQl9CisjZW5kaWYKKworcGljX2RvbmVfcHJvYzoKKwkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwkJaWYgKChkZWNfZHBiX3N0YXR1cyA9PSBIMjY0X1NFQVJDSF9CVUZFTVBUWSkgfHwKKwkJCShkZWNfZHBiX3N0YXR1cyA9PSBIMjY0X0RFQ09ERV9CVUZFTVBUWSkgfHwKKwkJCShkZWNfZHBiX3N0YXR1cyA9PSBIMjY0X0RFQ09ERV9USU1FT1VUKSB8fAorCQkJKChkZWNfZHBiX3N0YXR1cyA9PSBIMjY0X0RBVEFfUkVRVUVTVCkgJiYgaW5wdXRfZnJhbWVfYmFzZWQodmRlYykpKSB7CisJCQlody0+ZGF0YV9mbGFnIHw9IEVSUk9SX0ZMQUc7CisJCQlpZiAoaHctPmRwYi5tVmlkZW8uZGVjX3BpY3R1cmUpCisJCQkJaHctPmRwYi5tVmlkZW8uZGVjX3BpY3R1cmUtPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsCisJCQkJIiVzLCBtYXJrIGVycl9mcmFtZVxuIiwgX19mdW5jX18pOworCQl9CisJCXZoMjY0X3BpY19kb25lX3Byb2ModmRlYyk7CisKKwkJaWYgKGh3LT5mcm1iYXNlX2NvbnRfZmxhZykgeworCQkJLypkbyBub3QgREVDX1JFU1VMVF9HRVRfREFUQSovCisJCQlody0+Z2V0X2RhdGFfY291bnQgPSAweDdmZmZmZmZmOworCQkJV1JJVEVfVlJFRyhEUEJfU1RBVFVTX1JFRywgSDI2NF9BQ1RJT05fU0VBUkNIX0hFQUQpOworCQkJZGVjb2RlX2ZyYW1lX2NvdW50W0RFQ09ERV9JRChodyldKys7CisJCQlpZiAocF9IMjY0X0RwYi0+bVNsaWNlLnNsaWNlX3R5cGUgPT0gSV9TTElDRSkgeworCQkJCWh3LT5ndnMuaV9kZWNvZGVkX2ZyYW1lcysrOworCQkJfSBlbHNlIGlmIChwX0gyNjRfRHBiLT5tU2xpY2Uuc2xpY2VfdHlwZSA9PSBQX1NMSUNFKSB7CisJCQkJaHctPmd2cy5wX2RlY29kZWRfZnJhbWVzKys7CisJCQl9IGVsc2UgaWYgKHBfSDI2NF9EcGItPm1TbGljZS5zbGljZV90eXBlID09IEJfU0xJQ0UpIHsKKwkJCQlody0+Z3ZzLmJfZGVjb2RlZF9mcmFtZXMrKzsKKwkJCX0KKwkJCXN0YXJ0X3Byb2Nlc3NfdGltZShodyk7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKwkJYW12ZGVjX3N0b3AoKTsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkiJXMgJXMgZGVjb2RlIHNsaWNlIGNvdW50ICVkXG4iLAorCQkJX19mdW5jX18sCisJCQkoZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9QSUNfREFUQV9ET05FKSA/CisJCQkiSDI2NF9QSUNfREFUQV9ET05FIiA6CisJCQkoZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9GSU5EX05FWFRfUElDX05BTCkgPworCQkJIkgyNjRfRklORF9ORVhUX1BJQ19OQUwiIDogIkgyNjRfRklORF9ORVhUX0RWRUxfTkFMIiwKKwkJCWh3LT5kZWNvZGVfcGljX2NvdW50KTsKKwkJaWYgKGh3LT5rcGlfZmlyc3RfaV9kZWNvZGVkID09IDApIHsKKwkJCWh3LT5rcGlfZmlyc3RfaV9kZWNvZGVkID0gMTsKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1ZERUNfREVUQUlMLAorCQkJCSJbdmRlY19rcGldWyVzXSBGaXJzdCBJIGZyYW1lIGRlY29kZWQuXG4iLCBfX2Z1bmNfXyk7CisJCX0KKwkJLyogV1JJVEVfVlJFRyhEUEJfU1RBVFVTX1JFRywgSDI2NF9BQ1RJT05fU0VBUkNIX0hFQUQpOyAqLworCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCQlpZiAodmRlYy0+c2xhdmUgJiYKKwkJCWRlY19kcGJfc3RhdHVzID09IEgyNjRfRklORF9ORVhUX0RWRUxfTkFMKSB7CisJCQlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3X2VsID0KKwkJCSAoc3RydWN0IHZkZWNfaDI2NF9od19zICopKHZkZWMtPnNsYXZlLT5wcml2YXRlKTsKKwkJCWh3X2VsLT5nb3RfdmFsaWRfbmFsID0gMDsKKwkJCWh3LT5zd2l0Y2hfZHZsYXllcl9mbGFnID0gMTsKKwkJfSBlbHNlIGlmICh2ZGVjLT5tYXN0ZXIgJiYKKwkJCWRlY19kcGJfc3RhdHVzID09IEgyNjRfRklORF9ORVhUX1BJQ19OQUwpIHsKKwkJCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHdfYmwgPQorCQkJIChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKikodmRlYy0+bWFzdGVyLT5wcml2YXRlKTsKKwkJCWh3X2JsLT5nb3RfdmFsaWRfbmFsID0gMDsKKwkJCWh3LT5zd2l0Y2hfZHZsYXllcl9mbGFnID0gMTsKKwkJfSBlbHNlIHsKKwkJCWh3LT5zd2l0Y2hfZHZsYXllcl9mbGFnID0gMDsKKwkJCWh3LT5nb3RfdmFsaWRfbmFsID0gMTsKKwkJfQorI2VuZGlmCisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9USFJFQURfRUROKTsKKworCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCX0gZWxzZSBpZiAoCisJCQkoZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9GSU5EX05FWFRfUElDX05BTCkgfHwKKwkJCShkZWNfZHBiX3N0YXR1cyA9PSBIMjY0X0ZJTkRfTkVYVF9EVkVMX05BTCkpIHsKKwkJZ290byBwaWNfZG9uZV9wcm9jOworI2VuZGlmCisJfSBlbHNlIGlmIChkZWNfZHBiX3N0YXR1cyA9PSBIMjY0X0FVWF9EQVRBX1JFQURZKSB7CisJCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisJCWlmIChSRUFEX1ZSRUcoSDI2NF9BVVhfREFUQV9TSVpFKSAhPSAwKSB7CisJCQlpZiAoZHBiX2lzX2RlYnVnKERFQ09ERV9JRChodyksCisJCQkJUFJJTlRfRkxBR19TRUlfREVUQUlMKSkKKwkJCQlkdW1wX2F1eF9idWYoaHcpOworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJCQlpZiAodmRlY19mcmFtZV9iYXNlZCh2ZGVjKSkgeworCQkJCWlmIChody0+bGFzdF9kZWNfcGljdHVyZSkKKwkJCQkJc2V0X2F1eF9kYXRhKGh3LAorCQkJCQkJaHctPmxhc3RfZGVjX3BpY3R1cmUsIDAsIDAsIE5VTEwpOworCQkJfSBlbHNlIGlmICh2ZGVjLT5kb2xieV9tZXRhX3dpdGhfZWwgfHwgdmRlYy0+c2xhdmUpIHsKKwkJCQlpZiAoaHctPmxhc3RfZGVjX3BpY3R1cmUpCisJCQkJCXNldF9hdXhfZGF0YShodywgaHctPmxhc3RfZGVjX3BpY3R1cmUsCisJCQkJCQkwLCAwLCBOVUxMKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHZkZWMtPm1hc3RlcikgeworCQkJCQkJc3RydWN0IHZkZWNfaDI2NF9od19zICpod19ibCA9CisJCQkJCQkoc3RydWN0IHZkZWNfaDI2NF9od19zICopCisJCQkJCQkodmRlYy0+bWFzdGVyLT5wcml2YXRlKTsKKwkJCQkJaWYgKGh3X2JsLT5sYXN0X2RlY19waWN0dXJlICE9IE5VTEwpIHsKKwkJCQkJCXNldF9hdXhfZGF0YShod19ibCwKKwkJCQkJCQlod19ibC0+bGFzdF9kZWNfcGljdHVyZSwKKwkJCQkJCQkwLCAxLCBodyk7CisJCQkJCX0KKwkJCQkJc2V0X2F1eF9kYXRhKGh3LAorCQkJCQkJaHctPmxhc3RfZGVjX3BpY3R1cmUsCisJCQkJCQkwLCAyLCBOVUxMKTsKKwkJCQl9CisJCQl9CisjZWxzZQorCQkJaWYgKGh3LT5sYXN0X2RlY19waWN0dXJlKQorCQkJCXNldF9hdXhfZGF0YShodywKKwkJCQkJaHctPmxhc3RfZGVjX3BpY3R1cmUsIDAsIDAsIE5VTEwpOworI2VuZGlmCisJCX0KKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCQlody0+c3dpdGNoX2R2bGF5ZXJfZmxhZyA9IDA7CisJCWh3LT5nb3RfdmFsaWRfbmFsID0gMTsKKyNlbmRpZgorCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCSIlcyBIMjY0X0FVWF9EQVRBX1JFQURZXG4iLCBfX2Z1bmNfXyk7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9USFJFQURfRUROKTsKKwkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCX0gZWxzZSBpZiAoLyooZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9EQVRBX1JFUVVFU1QpIHx8Ki8KKwkJCShkZWNfZHBiX3N0YXR1cyA9PSBIMjY0X1NFQVJDSF9CVUZFTVBUWSkgfHwKKwkJCShkZWNfZHBiX3N0YXR1cyA9PSBIMjY0X0RFQ09ERV9CVUZFTVBUWSkgfHwKKwkJCShkZWNfZHBiX3N0YXR1cyA9PSBIMjY0X0RFQ09ERV9USU1FT1VUKSkgeworZW1wdHlfcHJvYzoKKwkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwkJaWYgKChlcnJvcl9wcm9jX3BvbGljeSAmIDB4NDAwMDApICYmCisJCQkoKGRlY19kcGJfc3RhdHVzID09IEgyNjRfREVDT0RFX1RJTUVPVVQpIHx8CisJCQkoIWh3LT5mcm1iYXNlX2NvbnRfZmxhZyAmJiAoZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9TRUFSQ0hfQlVGRU1QVFkgfHwgZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9ERUNPREVfQlVGRU1QVFkpICYmIGlucHV0X2ZyYW1lX2Jhc2VkKHZkZWMpKSkpCisJCQlnb3RvIHBpY19kb25lX3Byb2M7CisJCWlmICghaHctPmZybWJhc2VfY29udF9mbGFnKQorCQkJcmVsZWFzZV9jdXJfZGVjb2RpbmdfYnVmKGh3KTsKKworCQlpZiAoaW5wdXRfZnJhbWVfYmFzZWQodmRlYykgfHwKKwkJCShSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpID4gMHgyMDApKSB7CisJCQlpZiAoaDI2NF9kZWJ1Z19mbGFnICYKKwkJCQlESVNBQkxFX0VSUk9SX0hBTkRMRSkgeworCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLAorCQkJCVBSSU5UX0ZMQUdfRVJST1IsCisJCQkJCSIlcyBkZWNvZGluZyBlcnJvciwgbGV2ZWwgMHgleFxuIiwKKwkJCQkJX19mdW5jX18sCisJCQkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCkpOworCQkJCWdvdG8gc2VuZF9hZ2FpbjsKKwkJCX0KKwkJCWFtdmRlY19zdG9wKCk7CisJCQl2ZGVjLT5tY19sb2FkZWQgPSAwOworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkJIiVzICVzXG4iLCBfX2Z1bmNfXywKKwkJCQkoZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9TRUFSQ0hfQlVGRU1QVFkpID8KKwkJCQkiSDI2NF9TRUFSQ0hfQlVGRU1QVFkiIDoKKwkJCQkoZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9ERUNPREVfQlVGRU1QVFkpID8KKwkJCQkiSDI2NF9ERUNPREVfQlVGRU1QVFkiIDoKKwkJCQkoZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9ERUNPREVfVElNRU9VVCkgPworCQkJCSJIMjY0X0RFQ09ERV9USU1FT1VUIiA6CisJCQkJIk9USEVSIik7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKworCQkJaWYgKGRlY19kcGJfc3RhdHVzID09IEgyNjRfU0VBUkNIX0JVRkVNUFRZKQorCQkJCWh3LT5zZWFyY2hfZGF0YWVtcHR5X251bSsrOworCQkJZWxzZSBpZiAoZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9ERUNPREVfVElNRU9VVCkgeworCQkJCWh3LT5kZWNvZGVfdGltZW91dF9udW0rKzsKKwkJCQlpZiAoZXJyb3JfcHJvY19wb2xpY3kgJiAweDQwMDApIHsKKwkJCQkJaHctPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOworCQkJCQlpZiAoKHBfSDI2NF9EcGItPmxhc3RfZHBiX3N0YXR1cyA9PSBIMjY0X0RFQ09ERV9USU1FT1VUKSB8fAorCQkJCQkJKHBfSDI2NF9EcGItPmxhc3RfZHBiX3N0YXR1cyA9PSBIMjY0X1BJQ19EQVRBX0RPTkUpIHx8CisJCQkJCQkoKHBfSDI2NF9EcGItPmxhc3RfZHBiX3N0YXR1cyA9PSBIMjY0X1NMSUNFX0hFQURfRE9ORSkgJiYKKwkJCQkJCSAocF9IMjY0X0RwYi0+bVNsaWNlLnNsaWNlX3R5cGUgIT0gQl9TTElDRSkpKSB7CisJCQkJCQkgZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJCQkJUFJJTlRfRkxBR19FUlJPUiwgIiVzIGxhc3QgZHBiIHN0YXR1cyAweCV4IG5lZWQgYnVnbWdyIHJlc2V0IFxuIiwKKwkJCQkJCQlwX0gyNjRfRHBiLT5sYXN0X2RwYl9zdGF0dXMsIF9fZnVuY19fKTsKKwkJCQkJCQlody0+cmVzZXRfYnVmbWdyX2ZsYWcgPSAxOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmIChkZWNfZHBiX3N0YXR1cyA9PSBIMjY0X0RFQ09ERV9CVUZFTVBUWSkKKwkJCQlody0+ZGVjb2RlX2RhdGFlbXB0eV9udW0rKzsKKwkJCWlmICghaHctPmZybWJhc2VfY29udF9mbGFnKQorCQkJCWh3LT5kYXRhX2ZsYWcgfD0gRVJST1JfRkxBRzsKKworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCX0gZWxzZSB7CisJCQkvKiBXUklURV9WUkVHKERQQl9TVEFUVVNfUkVHLCBIMjY0X0FDVElPTl9JTklUKTsgKi8KKyNpZmRlZiBERVRFQ1RfV1JPTkdfTVVMVElfU0xJQ0UKKwkJCWlmIChlcnJvcl9wcm9jX3BvbGljeSAmIDB4MTAwMDApIHsKKwkJCQlwX0gyNjRfRHBiLT5tVmlkZW8ucHJlX2ZyYW1lX251bSA9IGh3LT5maXJzdF9wcmVfZnJhbWVfbnVtOworCQkJfQorCQkJaHctPmxhc3RfcGljdHVyZV9zbGljZV9jb3VudCA9IGh3LT5jdXJfcGljdHVyZV9zbGljZV9jb3VudDsKKyNlbmRpZgorCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkJIiVzIERFQ19SRVNVTFRfQUdBSU5cbiIsIF9fZnVuY19fKTsKK3NlbmRfYWdhaW46CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfQUdBSU47CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJfQorCX0gZWxzZSBpZiAoZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9EQVRBX1JFUVVFU1QpIHsKKwkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwkJaWYgKGlucHV0X2ZyYW1lX2Jhc2VkKHZkZWMpKSB7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCVBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkiJXMgSDI2NF9EQVRBX1JFUVVFU1QgKCVkKVxuIiwKKwkJCV9fZnVuY19fLCBody0+Z2V0X2RhdGFfY291bnQpOworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0dFVF9EQVRBOworCQkJaHctPnJlZ19pcWlkY3RfY29udHJvbCA9IFJFQURfVlJFRyhJUUlEQ1RfQ09OVFJPTCk7CisJCQlody0+cmVnX2lxaWRjdF9jb250cm9sX2luaXRfZmxhZyA9IDE7CisJCQlody0+Z2V0X2RhdGFfc3RhcnRfdGltZSA9IGppZmZpZXM7CisJCQlody0+Z2V0X2RhdGFfY291bnQrKzsKKwkJCWlmIChody0+Z2V0X2RhdGFfY291bnQgPj0gZnJhbWVfbWF4X2RhdGFfcGFja2V0KQorCQkJCWdvdG8gZW1wdHlfcHJvYzsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQl9IGVsc2UKKwkJCWdvdG8gZW1wdHlfcHJvYzsKKwl9IGVsc2UgaWYgKGRlY19kcGJfc3RhdHVzID09IEgyNjRfREVDT0RFX09WRVJfU0laRSkgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSJ2bWgyNjQgZGVjb2RlIG92ZXJzaXplICEhXG4iKTsKKwkJcmVsZWFzZV9jdXJfZGVjb2RpbmdfYnVmKGh3KTsKKwkJaHctPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOworCQlody0+c3RhdCB8PSBERUNPREVSX0ZBVEFMX0VSUk9SX1NJWkVfT1ZFUkZMT1c7CisJCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0gZWxzZSBpZiAoZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9TRUlfREFUQV9SRUFEWSkgeworCQlpbnQgYXV4X2RhdGFfbGVuOworCQlhdXhfZGF0YV9sZW4gPQorCQkJKFJFQURfVlJFRyhIMjY0X0FVWF9EQVRBX1NJWkUpID4+IDE2KSA8PCA0OworCisJCWlmIChhdXhfZGF0YV9sZW4gPiBTRUlfREFUQV9TSVpFKSB7CisJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRVJST1IsCisJCQkJCSJzZWkgZGF0YSBzaXplIG1vcmUgdGhhbiA0SzogJWQsIGRpc2NhcmRlZCBpdFxuIiwKKwkJCQkJaHctPnNlaV9pdHVfZGF0YV9sZW4pOworCQkJCWh3LT5zZWlfaXR1X2RhdGFfbGVuID0gMDsKKwkJfQorCisJCWlmIChhdXhfZGF0YV9sZW4gIT0gMCkgeworCQkJdTggKnRyYW5zX2RhdGFfYnVmOworCQkJdTggKnNlaV9kYXRhX2J1ZjsKKwkJCXU4IHN3YXBfYnl0ZTsKKworI2lmIDAKKwkJCWR1bXBfYXV4X2J1Zihodyk7CisjZW5kaWYKKwkJCXRyYW5zX2RhdGFfYnVmID0gKHU4ICopaHctPmF1eF9hZGRyOworCisJCQlpZiAodHJhbnNfZGF0YV9idWZbN10gPT0gQVVYX1RBR19TRUkpIHsKKwkJCQlpbnQgbGVmdF9sZW47CisKKwkJCQlzZWlfZGF0YV9idWYgPSAodTggKilody0+c2VpX2RhdGFfYnVmCisJCQkJCQkJKyBody0+c2VpX2RhdGFfbGVuOworCQkJCWxlZnRfbGVuID0gU0VJX0RBVEFfU0laRSAtIGh3LT5zZWlfZGF0YV9sZW47CisJCQkJaWYgKGF1eF9kYXRhX2xlbi8yIDw9IGxlZnRfbGVuKSB7CisJCQkJCWZvciAoaSA9IDA7IGkgPCBhdXhfZGF0YV9sZW4vMjsgaSsrKQorCQkJCQkJc2VpX2RhdGFfYnVmW2ldCisJCQkJCQkJPSB0cmFuc19kYXRhX2J1ZltpKjJdOworCisJCQkJCWF1eF9kYXRhX2xlbiA9IGF1eF9kYXRhX2xlbiAvIDI7CisJCQkJCWZvciAoaSA9IDA7IGkgPCBhdXhfZGF0YV9sZW47IGkgPSBpKzQpIHsKKwkJCQkJCXN3YXBfYnl0ZSA9IHNlaV9kYXRhX2J1ZltpXTsKKwkJCQkJCXNlaV9kYXRhX2J1ZltpXQorCQkJCQkJCT0gc2VpX2RhdGFfYnVmW2krM107CisJCQkJCQlzZWlfZGF0YV9idWZbaSszXSA9IHN3YXBfYnl0ZTsKKworCQkJCQkJc3dhcF9ieXRlID0gc2VpX2RhdGFfYnVmW2krMV07CisJCQkJCQlzZWlfZGF0YV9idWZbaSsxXQorCQkJCQkJCT0gc2VpX2RhdGFfYnVmW2krMl07CisJCQkJCQlzZWlfZGF0YV9idWZbaSsyXSA9IHN3YXBfYnl0ZTsKKwkJCQkJfQorCisJCQkJCWZvciAoaSA9IGF1eF9kYXRhX2xlbi0xOyBpID49IDA7IGktLSkKKwkJCQkJCWlmIChzZWlfZGF0YV9idWZbaV0gIT0gMCkKKwkJCQkJCQlicmVhazsKKworCQkJCQlody0+c2VpX2RhdGFfbGVuICs9IGkrMTsKKwkJCQl9IGVsc2UKKwkJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJCQlQUklOVF9GTEFHX0VSUk9SLAorCQkJCQkJInNlaSBkYXRhIHNpemUgJWQgYW5kIG1vcmUgdGhhbiBsZWZ0IHNwYWNlOiAlZCwgZGlzY2FyZGVkIGl0XG4iLAorCQkJCQkJaHctPnNlaV9pdHVfZGF0YV9sZW4sCisJCQkJCQlsZWZ0X2xlbik7CisJCQl9CisJCX0KKwkJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX1RIUkVBRF9FRE4pOworCQlXUklURV9WUkVHKERQQl9TVEFUVVNfUkVHLCBIMjY0X1NFSV9EQVRBX0RPTkUpOworCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKworCS8qIHVjb2RlIGRlYnVnICovCisJZGVidWdfdGFnID0gUkVBRF9WUkVHKERFQlVHX1JFRzEpOworCWlmIChkZWJ1Z190YWcgJiAweDEwMDAwKSB7CisJCXVuc2lnbmVkIHNob3J0ICpwID0gKHVuc2lnbmVkIHNob3J0ICopaHctPmxtZW1fYWRkcjsKKworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSJMTUVNPHRhZyAleD46XG4iLCBkZWJ1Z190YWcpOworCQlmb3IgKGkgPSAwOyBpIDwgMHg0MDA7IGkgKz0gNCkgeworCQkJaW50IGlpOworCQkJaWYgKChpICYgMHhmKSA9PSAwKQorCQkJCWRwYl9wcmludF9jb250KERFQ09ERV9JRChodyksIDAsCisJCQkJCSIlMDN4OiAiLCBpKTsKKwkJCWZvciAoaWkgPSAwOyBpaSA8IDQ7IGlpKyspCisJCQkJZHBiX3ByaW50X2NvbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCQkJIiUwNHggIiwgcFtpKzMtaWldKTsKKwkJCWlmICgoKGkraWkpICYgMHhmKSA9PSAwKQorCQkJCWRwYl9wcmludF9jb250KERFQ09ERV9JRChodyksIDAsCisJCQkJCSJcbiIpOworCQl9CisJCWlmICgoKHVkZWJ1Z19wYXVzZV9wb3MgJiAweGZmZmYpCisJCQk9PSAoZGVidWdfdGFnICYgMHhmZmZmKSkgJiYKKwkJCSh1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeCA9PSAwIHx8CisJCQl1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeCA9PQorCQkJaHctPmRlY29kZV9waWNfY291bnQpICYmCisJCQkodWRlYnVnX3BhdXNlX3ZhbCA9PSAwIHx8CisJCQl1ZGVidWdfcGF1c2VfdmFsID09IFJFQURfVlJFRyhERUJVR19SRUcyKSkpIHsKKwkJCXVkZWJ1Z19wYXVzZV9wb3MgJj0gMHhmZmZmOworCQkJaHctPnVjb2RlX3BhdXNlX3BvcyA9IHVkZWJ1Z19wYXVzZV9wb3M7CisJCX0KKwkJZWxzZSBpZiAoZGVidWdfdGFnICYgMHgyMDAwMCkKKwkJCWh3LT51Y29kZV9wYXVzZV9wb3MgPSAweGZmZmZmZmZmOworCQlpZiAoaHctPnVjb2RlX3BhdXNlX3BvcykKKwkJCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisJCWVsc2UKKwkJCVdSSVRFX1ZSRUcoREVCVUdfUkVHMSwgMCk7CisJfSBlbHNlIGlmIChkZWJ1Z190YWcgIT0gMCkgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19VQ09ERV9FVlQsCisJCQkiZGJnJXg6ICV4XG4iLCBkZWJ1Z190YWcsCisJCQlSRUFEX1ZSRUcoREVCVUdfUkVHMikpOworCQlpZiAoKCh1ZGVidWdfcGF1c2VfcG9zICYgMHhmZmZmKQorCQkJPT0gKGRlYnVnX3RhZyAmIDB4ZmZmZikpICYmCisJCQkodWRlYnVnX3BhdXNlX2RlY29kZV9pZHggPT0gMCB8fAorCQkJdWRlYnVnX3BhdXNlX2RlY29kZV9pZHggPT0KKwkJCWh3LT5kZWNvZGVfcGljX2NvdW50KSAmJgorCQkJKHVkZWJ1Z19wYXVzZV92YWwgPT0gMCB8fAorCQkJdWRlYnVnX3BhdXNlX3ZhbCA9PSBSRUFEX1ZSRUcoREVCVUdfUkVHMikpKSB7CisJCQl1ZGVidWdfcGF1c2VfcG9zICY9IDB4ZmZmZjsKKwkJCWh3LT51Y29kZV9wYXVzZV9wb3MgPSB1ZGVidWdfcGF1c2VfcG9zOworCQl9CisJCWlmIChody0+dWNvZGVfcGF1c2VfcG9zKQorCQkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwkJZWxzZQorCQkJV1JJVEVfVlJFRyhERUJVR19SRUcxLCAwKTsKKwl9CisJLyoqLworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IHZoMjY0X2lzcihzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgaXJxKQoreworCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcgPSAoc3RydWN0IHZkZWNfaDI2NF9od19zICopKHZkZWMtPnByaXZhdGUpOworCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gJmh3LT5kcGI7CisKKworCVdSSVRFX1ZSRUcoQVNTSVNUX01CT1gxX0NMUl9SRUcsIDEpOworCisJaWYgKCFodykKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJaWYgKGh3LT5lb3MpCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCXBfSDI2NF9EcGItPnZkZWMgPSB2ZGVjOworCXBfSDI2NF9EcGItPmRlY19kcGJfc3RhdHVzID0gUkVBRF9WUkVHKERQQl9TVEFUVVNfUkVHKTsKKwlpZiAocF9IMjY0X0RwYi0+ZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9TTElDRV9IRUFEX0RPTkUgfHwKKwkJcF9IMjY0X0RwYi0+ZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9DT05GSUdfUkVRVUVTVCkgeworCQlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9JU1JfSEVBRF9ET05FKTsKKwl9CisJZWxzZSBpZiAocF9IMjY0X0RwYi0+ZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9QSUNfREFUQV9ET05FKSB7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9QSUNfRE9ORSk7CisJfQorCWVsc2UgaWYgKHBfSDI2NF9EcGItPmRlY19kcGJfc3RhdHVzID09IEgyNjRfU0VJX0RBVEFfUkVBRFkpCisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9TRUlfRE9ORSk7CisJZWxzZSBpZiAocF9IMjY0X0RwYi0+ZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9BVVhfREFUQV9SRUFEWSkKKwkJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX0FVWF9ET05FKTsKKworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1VDT0RFX0VWVCwKKwkJCSIlcyBEUEJfU1RBVFVTX1JFRzogMHgleCwgcnVuKCVkKSBsYXN0X3N0YXRlICgleCkgRVJST1JfU1RBVFVTX1JFRyAweCV4LCBzYiAoMHgleCAweCV4IDB4JXgpIGJpdGNudCAweCV4IG1ieV9tYnggMHgleFxuIiwKKwkJCV9fZnVuY19fLAorCQkJcF9IMjY0X0RwYi0+ZGVjX2RwYl9zdGF0dXMsCisJCQlydW5fY291bnRbREVDT0RFX0lEKGh3KV0sCisJCQlody0+ZGVjX3Jlc3VsdCwKKwkJCVJFQURfVlJFRyhFUlJPUl9TVEFUVVNfUkVHKSwKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCksCisJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSwKKwkJCVJFQURfVlJFRyhWSUZGX0JJVF9DTlQpLAorCQkJUkVBRF9WUkVHKE1CWV9NQlgpKTsKKworCWlmIChwX0gyNjRfRHBiLT5kZWNfZHBiX3N0YXR1cyA9PSBIMjY0X1dSUlNQX1JFUVVFU1QpIHsKKwkJaWYgKGh3LT5tbXVfZW5hYmxlKQorCQkJaGV2Y19zYW9fd2FpdF9kb25lKGh3KTsKKwkJV1JJVEVfVlJFRyhEUEJfU1RBVFVTX1JFRywgSDI2NF9XUlJTUF9ET05FKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9JU1JfRU5EKTsKKwlyZXR1cm4gSVJRX1dBS0VfVEhSRUFEOworCit9CisKK3N0YXRpYyB2b2lkIHRpbWVvdXRfcHJvY2VzcyhzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3KQoreworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGh3KTsKKworCS8qCisJICogSW4gdGhpcyB2ZXJ5IHRpbWVvdXQgcG9pbnQsdGhlIHZoMjY0X3dvcmsgYXJyaXZlcywKKwkgKiBvciBpbiBzb21lIGNhc2VzIHRoZSBzeXN0ZW0gYmVjb21lIHNsb3csICB0aGVuIGNvbWUKKwkgKiB0aGlzIHNlY29uZCB0aW1lb3V0LiBJbiBib3RoIGNhc2VzIHdlIHJldHVybi4KKwkgKi8KKwlpZiAod29ya19wZW5kaW5nKCZody0+d29yaykgfHwKKwkgICAgd29ya19idXN5KCZody0+d29yaykgfHwKKwkgICAgd29ya19idXN5KCZody0+dGltZW91dF93b3JrKSB8fAorCSAgICB3b3JrX3BlbmRpbmcoJmh3LT50aW1lb3V0X3dvcmspKSB7CisJCXByX2VycigiJXMgaDI2NFslZF0gd29yayBwZW5kaW5nLCBkbyBub3RoaW5nLlxuIixfX2Z1bmNfXywgdmRlYy0+aWQpOworCQlyZXR1cm47CisJfQorCWh3LT50aW1lb3V0X251bSsrOworCWFtdmRlY19zdG9wKCk7CisJdmRlYy0+bWNfbG9hZGVkID0gMDsKKwlpZiAoaHctPm1tdV9lbmFibGUpIHsKKwkJaGV2Y19zZXRfZnJhbWVfZG9uZShodyk7CisJCWhldmNfc2FvX3dhaXRfZG9uZShodyk7CisJfQorCWRwYl9wcmludChERUNPREVfSUQoaHcpLAorCQlQUklOVF9GTEFHX0VSUk9SLCAiJXMgZGVjb2RlciB0aW1lb3V0LCBEUEJfU1RBVFVTX1JFRyAweCV4XG4iLCBfX2Z1bmNfXywgUkVBRF9WUkVHKERQQl9TVEFUVVNfUkVHKSk7CisJcmVsZWFzZV9jdXJfZGVjb2RpbmdfYnVmKGh3KTsKKwlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfVElNRU9VVDsKKwlody0+ZGF0YV9mbGFnIHw9IEVSUk9SX0ZMQUc7CisKKwlpZiAod29ya19wZW5kaW5nKCZody0+d29yaykpCisJCXJldHVybjsKKwl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT50aW1lb3V0X3dvcmspOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2J1ZnNwZWMoc3RydWN0IHZkZWNfaDI2NF9od19zICpodywKKwljb25zdCBjaGFyICpjYWxsZXIpCit7CisJaW50IGk7CisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSIlcyBpbiAlczpcbiIsIF9fZnVuY19fLCBjYWxsZXIpOworCWZvciAoaSA9IDA7IGkgPCBCVUZTUEVDX1BPT0xfU0laRTsgaSsrKSB7CisJCWlmIChody0+YnVmZmVyX3NwZWNbaV0udXNlZCA9PSAtMSkKKwkJCWNvbnRpbnVlOworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSJidWZzcGVjICglZCk6IHVzZWQgJWQgYWRyIDB4JXgoJWx4KSBjYW52YXMoJWQpIHZmX3JlZiglZCkgIiwKKwkJCWksIGh3LT5idWZmZXJfc3BlY1tpXS51c2VkLAorCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLmJ1Zl9hZHIsCisJCQlody0+YnVmZmVyX3NwZWNbaV0uY21hX2FsbG9jX2FkZHIsCisJCQlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX3BvcywKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS52Zl9yZWYKKwkJCSk7CisjaWZkZWYgQ09ORklHX0FNX1ZERUNfRFYKKwkJZHBiX3ByaW50X2NvbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSJkdl9lbF9leGlzdCAlZCIsCisJCQlody0+YnVmZmVyX3NwZWNbaV0uZHZfZW5oYW5jZV9leGlzdAorCQkpOworI2VuZGlmCisJCWRwYl9wcmludF9jb250KERFQ09ERV9JRChodyksIDAsICJcbiIpOworCX0KKworfQorCitzdGF0aWMgdm9pZCB2bWgyNjRfZHVtcF9zdGF0ZShzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcgPQorCQkoc3RydWN0IHZkZWNfaDI2NF9od19zICopKHZkZWMtPnByaXZhdGUpOworCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gJmh3LT5kcGI7CisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSI9PT09PT0gJXNcbiIsIF9fZnVuY19fKTsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIndpZHRoL2hlaWdodCAoJWQvJWQpLCBudW1fcmVvcmRlcl9mcmFtZXMgJWQgZGVjX2RwYl9zaXplICVkIGRwYiBzaXplKGJ1ZnNwZWMgY291bnQpICVkIG1heF9yZWZlcmVuY2Vfc2l6ZShjb2xsb2NhdGUgY291bnQpICVkIGlfb25seSAlZCB2aWRlb19zaWduYWxfdHlwZSAweCV4IHNlbmRfZXJyICVkIFxuIiwKKwkJaHctPmZyYW1lX3dpZHRoLAorCQlody0+ZnJhbWVfaGVpZ2h0LAorCQlody0+bnVtX3Jlb3JkZXJfZnJhbWVzLAorCQlody0+ZHBiLmRlY19kcGJfc2l6ZSwKKwkJaHctPmRwYi5tRFBCLnNpemUsCisJCWh3LT5tYXhfcmVmZXJlbmNlX3NpemUsCisJCWh3LT5pX29ubHksCisJCWh3LT52aWRlb19zaWduYWxfdHlwZSwKKwkJaHctPnNlbmRfZXJyb3JfZnJhbWVfZmxhZworCQkpOworCisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSJpc19mcmFtZWJhc2UoJWQpLCBlb3MgJWQsIHN0YXRlIDB4JXgsIGRlY19yZXN1bHQgMHgleCBkZWNfZnJtICVkIGRpc3BfZnJtICVkIHJ1biAlZCBub3RfcnVuX3JlYWR5ICVkIGlucHV0X2VtcHR5ICVkIGJ1Zm1ncl9yZXNldF9jbnQgJWQgZXJyb3JfZnJhbWVfY291bnQgPSAlZCwgZHJvcF9mcmFtZV9jb3VudCA9ICVkXG4iLAorCQlpbnB1dF9mcmFtZV9iYXNlZCh2ZGVjKSwKKwkJaHctPmVvcywKKwkJaHctPnN0YXQsCisJCWh3LT5kZWNfcmVzdWx0LAorCQlkZWNvZGVfZnJhbWVfY291bnRbREVDT0RFX0lEKGh3KV0sCisJCWRpc3BsYXlfZnJhbWVfY291bnRbREVDT0RFX0lEKGh3KV0sCisJCXJ1bl9jb3VudFtERUNPREVfSUQoaHcpXSwKKwkJbm90X3J1bl9yZWFkeVtERUNPREVfSUQoaHcpXSwKKwkJaW5wdXRfZW1wdHlbREVDT0RFX0lEKGh3KV0sCisJCWh3LT5yZXNldF9idWZtZ3JfY291bnQsCisJCWh3LT5ndnMuZXJyb3JfZnJhbWVfY291bnQsCisJCWh3LT5ndnMuZHJvcF9mcmFtZV9jb3VudAorCQkpOworCisjaWZkZWYgREVURUNUX1dST05HX01VTFRJX1NMSUNFCisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiTVVMVElfU0xJQ0VfREVURUNUIChjaGVja19jb3VudCAlZCBzbGljZV9jb3VudCAlZCBjdXJfc2xpY2VfY291bnQgJWQgZmxhZyAlZClcbiIsCisJCWh3LT5tdWx0aV9zbGljZV9waWNfY2hlY2tfY291bnQsCisJCWh3LT5waWN0dXJlX3NsaWNlX2NvdW50LAorCQlody0+Y3VyX3BpY3R1cmVfc2xpY2VfY291bnQsCisJCWh3LT5tdWx0aV9zbGljZV9waWNfZmxhZyk7CisjZW5kaWYKKwlpZiAoIWh3LT5pc191c2VkX3Y0bCAmJiB2Zl9nZXRfcmVjZWl2ZXIodmRlYy0+dmZfcHJvdmlkZXJfbmFtZSkpIHsKKwkJZW51bSByZWNldml2ZXJfc3RhcnRfZSBzdGF0ZSA9CisJCXZmX25vdGlmeV9yZWNlaXZlcih2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1FVUkVZX1NUQVRFLAorCQkJTlVMTCk7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJIlxucmVjZWl2ZXIoJXMpIHN0YXRlICVkXG4iLAorCQkJdmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCXN0YXRlKTsKKwl9CisKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkiJXMsIG5ld3EoJWQvJWQpLCBkaXNwcSglZC8lZCkgdmYgcHJlcGFyZS9nZXQvcHV0ICglZC8lZC8lZCksIGZyZWVfc3BlYyglZCksIGluaXRkb24oJWQpLCB1c2VkX3NpemUoJWQvJWQpLCB1bnVzZWRfZnJfZHBiKCVkKSAgZmFzdF9vdXRwdXRfZW5hYmxlICV4IFxuIiwKKwlfX2Z1bmNfXywKKwlrZmlmb19sZW4oJmh3LT5uZXdmcmFtZV9xKSwKKwlWRl9QT09MX1NJWkUsCisJa2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKSwKKwlWRl9QT09MX1NJWkUsCisJaHctPnZmX3ByZV9jb3VudCwKKwlody0+dmZfZ2V0X2NvdW50LAorCWh3LT52Zl9wdXRfY291bnQsCisJaGF2ZV9mcmVlX2J1Zl9zcGVjKHZkZWMpLAorCXBfSDI2NF9EcGItPm1EUEIuaW5pdF9kb25lLAorCXBfSDI2NF9EcGItPm1EUEIudXNlZF9zaXplLCBwX0gyNjRfRHBiLT5tRFBCLnNpemUsCisJaXNfdGhlcmVfdW51c2VkX2ZyYW1lX2Zyb21fZHBiKCZwX0gyNjRfRHBiLT5tRFBCKSwKKwlwX0gyNjRfRHBiLT5mYXN0X291dHB1dF9lbmFibGUKKwkpOworCisJZHVtcF9kcGIoJnBfSDI2NF9EcGItPm1EUEIsIDEpOworCWR1bXBfcGljKHBfSDI2NF9EcGIpOworCWR1bXBfYnVmc3BlYyhodywgX19mdW5jX18pOworCisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSJEUEJfU1RBVFVTX1JFRz0weCV4XG4iLAorCQlSRUFEX1ZSRUcoRFBCX1NUQVRVU19SRUcpKTsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIk1QQ19FPTB4JXhcbiIsCisJCVJFQURfVlJFRyhNUENfRSkpOworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiSDI2NF9ERUNPREVfTU9ERT0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSDI2NF9ERUNPREVfTU9ERSkpOworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiTUJZX01CWD0weCV4XG4iLAorCQlSRUFEX1ZSRUcoTUJZX01CWCkpOworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiSDI2NF9ERUNPREVfU0laRT0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSDI2NF9ERUNPREVfU0laRSkpOworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiVklGRl9CSVRfQ05UPTB4JXhcbiIsCisJCVJFQURfVlJFRyhWSUZGX0JJVF9DTlQpKTsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIlZMRF9NRU1fVklGSUZPX0xFVkVMPTB4JXhcbiIsCisJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCkpOworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiVkxEX01FTV9WSUZJRk9fV1A9MHgleFxuIiwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1dQKSk7CisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSJWTERfTUVNX1ZJRklGT19SUD0weCV4XG4iLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApKTsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIlBBUlNFUl9WSURFT19SUD0weCV4XG4iLAorCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfcnApKTsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIlBBUlNFUl9WSURFT19XUD0weCV4XG4iLAorCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApKTsKKworCWlmIChpbnB1dF9mcmFtZV9iYXNlZCh2ZGVjKSAmJgorCQlkcGJfaXNfZGVidWcoREVDT0RFX0lEKGh3KSwKKwkJUFJJTlRfRlJBTUVCQVNFX0RBVEEpCisJCSkgeworCQlpbnQgamo7CisJCWlmIChody0+Y2h1bmsgJiYgaHctPmNodW5rLT5ibG9jayAmJgorCQkJaHctPmNodW5rLT5zaXplID4gMCkgeworCQkJdTggKmRhdGEgPSBOVUxMOworCisJCQlpZiAoIWh3LT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJCQlkYXRhID0gY29kZWNfbW1fdm1hcChody0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQkJCWh3LT5jaHVuay0+b2Zmc2V0LCBody0+Y2h1bmstPnNpemUpOworCQkJZWxzZQorCQkJCWRhdGEgPSAoKHU4ICopaHctPmNodW5rLT5ibG9jay0+c3RhcnRfdmlydCkKKwkJCQkJKyBody0+Y2h1bmstPm9mZnNldDsKKworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkJImZyYW1lIGRhdGEgc2l6ZSAweCV4XG4iLAorCQkJCWh3LT5jaHVuay0+c2l6ZSk7CisJCQlmb3IgKGpqID0gMDsgamogPCBody0+Y2h1bmstPnNpemU7IGpqKyspIHsKKwkJCQlpZiAoKGpqICYgMHhmKSA9PSAwKQorCQkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCQkJUFJJTlRfRlJBTUVCQVNFX0RBVEEsCisJCQkJCQkiJTA2eDoiLCBqaik7CisJCQkJZHBiX3ByaW50X2NvbnQoREVDT0RFX0lEKGh3KSwKKwkJCQlQUklOVF9GUkFNRUJBU0VfREFUQSwKKwkJCQkJIiUwMnggIiwgZGF0YVtqal0pOworCQkJCWlmICgoKGpqICsgMSkgJiAweGYpID09IDApCisJCQkJCWRwYl9wcmludF9jb250KERFQ09ERV9JRChodyksCisJCQkJCVBSSU5UX0ZSQU1FQkFTRV9EQVRBLAorCQkJCQkJIlxuIik7CisJCQl9CisKKwkJCWlmICghaHctPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQkJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIoZGF0YSk7CisJCX0KKwl9Cit9CisKKworc3RhdGljIHZvaWQgY2hlY2tfdGltZXJfZnVuYyhzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpCit7CisJc3RydWN0IHZkZWNfaDI2NF9od19zICpodyA9IGNvbnRhaW5lcl9vZih0aW1lciwKKwkJc3RydWN0IHZkZWNfaDI2NF9od19zLCBjaGVja190aW1lcik7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaHcpOworCWludCBlcnJvcl9za2lwX2ZyYW1lX2NvdW50ID0gZXJyb3Jfc2tpcF9jb3VudCAmIDB4ZmZmOworCXVuc2lnbmVkIGludCB0aW1lb3V0X3ZhbCA9IGRlY29kZV90aW1lb3V0X3ZhbDsKKwlpZiAodGltZW91dF92YWwgIT0gMCAmJgorCQlody0+bm9fZXJyb3JfY291bnQgPCBlcnJvcl9za2lwX2ZyYW1lX2NvdW50KQorCQl0aW1lb3V0X3ZhbCA9IGVycm9yZGF0YV90aW1lb3V0X3ZhbDsKKwlpZiAoKGgyNjRfZGVidWdfY21kICYgMHgxMDApICE9IDAgJiYKKwkJREVDT0RFX0lEKGh3KSA9PSAoaDI2NF9kZWJ1Z19jbWQgJiAweGZmKSkgeworCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCXByX2luZm8oInZkZWMgJWQgaXMgZm9yY2VkIHRvIGJlIGRpc2Nvbm5lY3RlZFxuIiwKKwkJCWgyNjRfZGVidWdfY21kICYgMHhmZik7CisJCWgyNjRfZGVidWdfY21kID0gMDsKKwkJcmV0dXJuOworCX0KKwlpZiAoKGgyNjRfZGVidWdfY21kICYgMHgyMDApICE9IDAgJiYKKwkJREVDT0RFX0lEKGh3KSA9PSAoaDI2NF9kZWJ1Z19jbWQgJiAweGZmKSkgeworCQlwcl9kZWJ1ZygidmRlYyAlZCBpcyBmb3JjZWQgdG8gcmVzZXQgYnVmbWdyXG4iLAorCQkJaDI2NF9kZWJ1Z19jbWQgJiAweGZmKTsKKwkJaHctPnJlc2V0X2J1Zm1ncl9mbGFnID0gMTsKKwkJaDI2NF9kZWJ1Z19jbWQgPSAwOworCQlyZXR1cm47CisJfQorCisJaWYgKHZkZWMtPm5leHRfc3RhdHVzID09IFZERUNfU1RBVFVTX0RJU0NPTk5FQ1RFRCAmJgorCQkJIWh3LT5pc191c2VkX3Y0bCkgeworCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRk9SQ0VfRVhJVDsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCXByX2RlYnVnKCJ2ZGVjIHJlcXVlc3RlZCB0byBiZSBkaXNjb25uZWN0ZWRcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKHJhZHIgIT0gMCkgeworCQlpZiAocnZhbCAhPSAwKSB7CisJCQlXUklURV9WUkVHKHJhZHIsIHJ2YWwpOworCQkJcHJfaW5mbygiV1JJVEVfVlJFRygleCwleClcbiIsIHJhZHIsIHJ2YWwpOworCQl9IGVsc2UKKwkJCXByX2luZm8oIlJFQURfVlJFRygleCk9JXhcbiIsIHJhZHIsIFJFQURfVlJFRyhyYWRyKSk7CisJCXJ2YWwgPSAwOworCQlyYWRyID0gMDsKKwl9CisKKwlpZiAoKChoMjY0X2RlYnVnX2ZsYWcgJiBESVNBQkxFX0VSUk9SX0hBTkRMRSkgPT0gMCkgJiYKKwkJKHRpbWVvdXRfdmFsID4gMCkgJiYKKwkJKGh3LT5zdGFydF9wcm9jZXNzX3RpbWUgPiAwKSAmJgorCQkoKDEwMDAgKiAoamlmZmllcyAtIGh3LT5zdGFydF9wcm9jZXNzX3RpbWUpIC8gSFopCisJCQk+IHRpbWVvdXRfdmFsKQorCSkgeworCQl1MzIgZHBiX3N0YXR1cyA9IFJFQURfVlJFRyhEUEJfU1RBVFVTX1JFRyk7CisJCXUzMiBtYnlfbWJ4ID0gUkVBRF9WUkVHKE1CWV9NQlgpOworCQlpZiAoKGRwYl9zdGF0dXMgPT0gSDI2NF9BQ1RJT05fREVDT0RFX05FV1BJQykgfHwKKwkJCShkcGJfc3RhdHVzID09IEgyNjRfQUNUSU9OX0RFQ09ERV9TTElDRSkgfHwKKwkJCShkcGJfc3RhdHVzID09IEgyNjRfU0VJX0RBVEFfRE9ORSkgfHwKKwkJCShkcGJfc3RhdHVzID09IEgyNjRfU1RBVEVfU0VBUkNIX0hFQUQpIHx8CisJCQkoZHBiX3N0YXR1cyA9PSBIMjY0X1NMSUNFX0hFQURfRE9ORSkgfHwKKwkJCShkcGJfc3RhdHVzID09IEgyNjRfU0VJX0RBVEFfUkVBRFkpKSB7CisJCQlpZiAoaDI2NF9kZWJ1Z19mbGFnICYgREVCVUdfVElNRU9VVF9ERUNfU1RBVCkKKwkJCQlwcl9kZWJ1ZygiJXMgZHBiX3N0YXR1cyA9IDB4JXggbGFzdF9tYnlfbWJ4ID0gJXUgbWJ5X21ieCA9ICV1XG4iLAorCQkJCV9fZnVuY19fLCBkcGJfc3RhdHVzLCBody0+bGFzdF9tYnlfbWJ4LCBtYnlfbWJ4KTsKKworCQkJaWYgKGh3LT5sYXN0X21ieV9tYnggPT0gbWJ5X21ieCkgeworCQkJCWlmIChody0+ZGVjb2RlX3RpbWVvdXRfY291bnQgPiAwKQorCQkJCQlody0+ZGVjb2RlX3RpbWVvdXRfY291bnQtLTsKKwkJCQlpZiAoaHctPmRlY29kZV90aW1lb3V0X2NvdW50ID09IDApCisJCQkJeworCQkJCQlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCQkJCQl0aW1lb3V0X3Byb2Nlc3MoaHcpOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCXN0YXJ0X3Byb2Nlc3NfdGltZShodyk7CisJCX0gZWxzZSBpZiAoaXNfaW5fcGFyc2luZ19zdGF0ZShkcGJfc3RhdHVzKSkgeworCQkJaWYgKGh3LT5sYXN0X3ZsZF9sZXZlbCA9PQorCQkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCkpIHsKKwkJCQlpZiAoaHctPmRlY29kZV90aW1lb3V0X2NvdW50ID4gMCkKKwkJCQkJaHctPmRlY29kZV90aW1lb3V0X2NvdW50LS07CisJCQkJaWYgKGh3LT5kZWNvZGVfdGltZW91dF9jb3VudCA9PSAwKQorCQkJCXsKKwkJCQkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwkJCQkJdGltZW91dF9wcm9jZXNzKGh3KTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaHctPmxhc3RfdmxkX2xldmVsID0KKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCk7CisJCWh3LT5sYXN0X21ieV9tYnggPSBtYnlfbWJ4OworCX0KKworCWlmICgoaHctPnVjb2RlX3BhdXNlX3BvcyAhPSAwKSAmJgorCQkoaHctPnVjb2RlX3BhdXNlX3BvcyAhPSAweGZmZmZmZmZmKSAmJgorCQl1ZGVidWdfcGF1c2VfcG9zICE9IGh3LT51Y29kZV9wYXVzZV9wb3MpIHsKKwkJaHctPnVjb2RlX3BhdXNlX3BvcyA9IDA7CisJCVdSSVRFX1ZSRUcoREVCVUdfUkVHMSwgMCk7CisJfQorCisJbW9kX3RpbWVyKCZody0+Y2hlY2tfdGltZXIsIGppZmZpZXMgKyBDSEVDS19JTlRFUlZBTCk7Cit9CisKK3N0YXRpYyBpbnQgZGVjX3N0YXR1cyhzdHJ1Y3QgdmRlY19zICp2ZGVjLCBzdHJ1Y3QgdmRlY19pbmZvICp2c3RhdHVzKQoreworCXUzMiBhciwgYXJfdG1wOworCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcgPSAoc3RydWN0IHZkZWNfaDI2NF9od19zICopdmRlYy0+cHJpdmF0ZTsKKworCWlmICghaHcpCisJCXJldHVybiAtMTsKKworCXZzdGF0dXMtPmZyYW1lX3dpZHRoID0gaHctPmZyYW1lX3dpZHRoOworCXZzdGF0dXMtPmZyYW1lX2hlaWdodCA9IGh3LT5mcmFtZV9oZWlnaHQ7CisJaWYgKGh3LT5lcnJvcl9mcmFtZV93aWR0aCAmJgorCQlody0+ZXJyb3JfZnJhbWVfaGVpZ2h0KSB7CisJCXZzdGF0dXMtPmZyYW1lX3dpZHRoID0gaHctPmVycm9yX2ZyYW1lX3dpZHRoOworCQl2c3RhdHVzLT5mcmFtZV9oZWlnaHQgPSBody0+ZXJyb3JfZnJhbWVfaGVpZ2h0OworCX0KKwlpZiAoaHctPmZyYW1lX2R1ciAhPSAwKSB7CisJCXZzdGF0dXMtPmZyYW1lX2R1ciA9IGh3LT5mcmFtZV9kdXI7CisJCXZzdGF0dXMtPmZyYW1lX3JhdGUgPSAoKDk2MDAwICogMTAgLyBody0+ZnJhbWVfZHVyKSAlIDEwKSA8IDUgPworCQkgICAgICAgICAgICAgICAgICAgIDk2MDAwIC8gaHctPmZyYW1lX2R1ciA6ICg5NjAwMCAvIGh3LT5mcmFtZV9kdXIgKzEpOworCX0KKwllbHNlCisJCXZzdGF0dXMtPmZyYW1lX3JhdGUgPSAtMTsKKwl2c3RhdHVzLT5lcnJvcl9jb3VudCA9IGh3LT5ndnMuZXJyb3JfZnJhbWVfY291bnQ7CisJdnN0YXR1cy0+c3RhdHVzID0gaHctPnN0YXQ7CisJaWYgKGh3LT5oMjY0X2FyID09IDB4M2ZmKQorCQlhcl90bXAgPSAoMHgxMDAgKgorCQkJaHctPmZyYW1lX2hlaWdodCAqIGh3LT5oZWlnaHRfYXNwZWN0X3JhdGlvKSAvCisJCQkoaHctPmZyYW1lX3dpZHRoICogaHctPndpZHRoX2FzcGVjdF9yYXRpbyk7CisJZWxzZQorCQlhcl90bXAgPSBody0+aDI2NF9hcjsKKwlhciA9IG1pbl90KHUzMiwKKwkJCWFyX3RtcCwKKwkJCURJU1BfUkFUSU9fQVNQRUNUX1JBVElPX01BWCk7CisJdnN0YXR1cy0+cmF0aW9fY29udHJvbCA9CisJCWFyIDw8IERJU1BfUkFUSU9fQVNQRUNUX1JBVElPX0JJVDsKKworCXZzdGF0dXMtPmVycm9yX2ZyYW1lX2NvdW50ID0gaHctPmd2cy5lcnJvcl9mcmFtZV9jb3VudDsKKwl2c3RhdHVzLT5kcm9wX2ZyYW1lX2NvdW50ID0gaHctPmd2cy5kcm9wX2ZyYW1lX2NvdW50OworCXZzdGF0dXMtPmZyYW1lX2NvdW50ID0gZGVjb2RlX2ZyYW1lX2NvdW50W0RFQ09ERV9JRChodyldOworCXZzdGF0dXMtPmlfZGVjb2RlZF9mcmFtZXMgPSBody0+Z3ZzLmlfZGVjb2RlZF9mcmFtZXM7CisJdnN0YXR1cy0+aV9sb3N0X2ZyYW1lcyA9IGh3LT5ndnMuaV9sb3N0X2ZyYW1lczsKKwl2c3RhdHVzLT5pX2NvbmNlYWxlZF9mcmFtZXMgPSBody0+Z3ZzLmlfY29uY2VhbGVkX2ZyYW1lczsKKwl2c3RhdHVzLT5wX2RlY29kZWRfZnJhbWVzID0gaHctPmd2cy5wX2RlY29kZWRfZnJhbWVzOworCXZzdGF0dXMtPnBfbG9zdF9mcmFtZXMgPSBody0+Z3ZzLnBfbG9zdF9mcmFtZXM7CisJdnN0YXR1cy0+cF9jb25jZWFsZWRfZnJhbWVzID0gaHctPmd2cy5wX2NvbmNlYWxlZF9mcmFtZXM7CisJdnN0YXR1cy0+Yl9kZWNvZGVkX2ZyYW1lcyA9IGh3LT5ndnMuYl9kZWNvZGVkX2ZyYW1lczsKKwl2c3RhdHVzLT5iX2xvc3RfZnJhbWVzID0gaHctPmd2cy5iX2xvc3RfZnJhbWVzOworCXZzdGF0dXMtPmJfY29uY2VhbGVkX2ZyYW1lcyA9IGh3LT5ndnMuYl9jb25jZWFsZWRfZnJhbWVzOworCXNucHJpbnRmKHZzdGF0dXMtPnZkZWNfbmFtZSwgc2l6ZW9mKHZzdGF0dXMtPnZkZWNfbmFtZSksCisJCSIlcy0lMDJkIiwgRFJJVkVSX05BTUUsIGh3LT5pZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aDI2NF9od19jdHhfcmVzdG9yZShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3KQoreworCWludCBpLCBqOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqIHY0bDJfY3R4ID0gaHctPnY0bDJfY3R4OworCisJaHctPmZybWJhc2VfY29udF9mbGFnID0gMDsKKwkvKiBpZiAoaHctPmluaXRfZmxhZyA9PSAwKSB7ICovCisJaWYgKGgyNjRfZGVidWdfZmxhZyAmIDB4NDAwMDAwMDApIHsKKwkJLyogaWYgKDEpICovCisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkiJXMsIHJlc2V0IHJlZ2lzdGVyXG4iLCBfX2Z1bmNfXyk7CisKKwkJd2hpbGUgKFJFQURfVlJFRyhEQ0FDX0RNQV9DVFJMKSAmIDB4ODAwMCkKKwkJCTsKKwkJd2hpbGUgKFJFQURfVlJFRyhMTUVNX0RNQV9DVFJMKSAmIDB4ODAwMCkKKwkJCTsgICAgLyogcmVnIGFkZHJlc3MgaXMgMHgzNTAgKi8KKworI2lmIDEgLyogTUVTT05fQ1BVX1RZUEUgPj0gTUVTT05fQ1BVX1RZUEVfTUVTT042ICovCisJCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgKDE8PDcpIHwgKDE8PDYpIHwgKDE8PDQpKTsKKwkJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAwKTsKKworCQlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMCk7CisJCVJFQURfVlJFRyhET1NfU1dfUkVTRVQwKTsKKwkJUkVBRF9WUkVHKERPU19TV19SRVNFVDApOworCisJCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgKDE8PDcpIHwgKDE8PDYpIHwgKDE8PDQpKTsKKwkJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAwKTsKKworCQlXUklURV9WUkVHKERPU19TV19SRVNFVDAsICgxPDw5KSB8ICgxPDw4KSk7CisJCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgMCk7CisKKwkJUkVBRF9WUkVHKERPU19TV19SRVNFVDApOworCQlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMCk7CisJCVJFQURfVlJFRyhET1NfU1dfUkVTRVQwKTsKKworI2Vsc2UKKwkJV1JJVEVfUkVTRVRfUkVHKFJFU0VUMF9SRUdJU1RFUiwKKwkJCVJFU0VUX0lRSURDVCB8IFJFU0VUX01DIHwgUkVTRVRfVkxEX1BBUlQpOworCQlSRUFEX1JFU0VUX1JFRyhSRVNFVDBfUkVHSVNURVIpOworCQkJV1JJVEVfUkVTRVRfUkVHKFJFU0VUMF9SRUdJU1RFUiwKKwkJCVJFU0VUX0lRSURDVCB8IFJFU0VUX01DIHwgUkVTRVRfVkxEX1BBUlQpOworCisJCVdSSVRFX1JFU0VUX1JFRyhSRVNFVDJfUkVHSVNURVIsIFJFU0VUX1BJQ19EQyB8IFJFU0VUX0RCTEspOworI2VuZGlmCisJCVdSSVRFX1ZSRUcoUE9XRVJfQ1RMX1ZMRCwKKwkJCVJFQURfVlJFRyhQT1dFUl9DVExfVkxEKSB8ICgwIDw8IDEwKSB8CisJCQkJKDEgPDwgOSkgfCAoMSA8PCA2KSk7CisJfSBlbHNlIHsKKwkJLyogV1JJVEVfVlJFRyhQT1dFUl9DVExfVkxELAorCQkgKglSRUFEX1ZSRUcoUE9XRVJfQ1RMX1ZMRCkgfCAoMCA8PCAxMCkgfCAoMSA8PCA5KSApOworCQkgKi8KKwkJV1JJVEVfVlJFRyhQT1dFUl9DVExfVkxELAorCQkJUkVBRF9WUkVHKFBPV0VSX0NUTF9WTEQpIHwKKwkJCQkoMCA8PCAxMCkgfCAoMSA8PCA5KSB8ICgxIDw8IDYpKTsKKwl9CisJLyogZGlzYWJsZSBQU0NBTEUgZm9yIGhhcmR3YXJlIHNoYXJpbmcgKi8KKwlXUklURV9WUkVHKFBTQ0FMRV9DVFJMLCAwKTsKKworCS8qIGNsZWFyIG1haWxib3ggaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfQ0xSX1JFRywgMSk7CisKKwkvKiBlbmFibGUgbWFpbGJveCBpbnRlcnJ1cHQgKi8KKwlXUklURV9WUkVHKEFTU0lTVF9NQk9YMV9NQVNLLCAxKTsKKworI2lmZGVmIE5WMjEKKwlTRVRfVlJFR19NQVNLKE1ERUNfUElDX0RDX0NUUkwsIDE8PDE3KTsKKyNlbmRpZgorCisJLyogY2Jjcl9tZXJnZV9zd2FwX2VuICovCisJaWYgKGh3LT5pc191c2VkX3Y0bAorCQkmJiAodjRsMl9jdHgtPnFfZGF0YVtBTUxfUV9EQVRBX0RTVF0uZm10LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX05WMjEKKwkJfHwgdjRsMl9jdHgtPnFfZGF0YVtBTUxfUV9EQVRBX0RTVF0uZm10LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX05WMjFNKSkKKwkJU0VUX1ZSRUdfTUFTSyhNREVDX1BJQ19EQ19DVFJMLCAxIDw8IDE2KTsKKwllbHNlCisJCUNMRUFSX1ZSRUdfTUFTSyhNREVDX1BJQ19EQ19DVFJMLCAxIDw8IDE2KTsKKworCVNFVF9WUkVHX01BU0soTURFQ19QSUNfRENfQ1RSTCwgMHhiZiA8PCAyNCk7CisJQ0xFQVJfVlJFR19NQVNLKE1ERUNfUElDX0RDX0NUUkwsIDB4YmYgPDwgMjQpOworCisJQ0xFQVJfVlJFR19NQVNLKE1ERUNfUElDX0RDX0NUUkwsIDEgPDwgMzEpOworCWlmIChody0+bW11X2VuYWJsZSkgeworCQlTRVRfVlJFR19NQVNLKE1ERUNfUElDX0RDX01VWF9DVFJMLCAxPDwzMSk7CisJCS8qIHN3IHJlc2V0IHRvIGV4dGlmIGhhcmR3YXJlICovCisJCVNFVF9WUkVHX01BU0soTURFQ19FWFRJRl9DRkcxLCAxPDwzMCk7CisJCUNMRUFSX1ZSRUdfTUFTSyhNREVDX0VYVElGX0NGRzEsIDE8PDMwKTsKKwl9IGVsc2UgeworCQlDTEVBUl9WUkVHX01BU0soTURFQ19QSUNfRENfTVVYX0NUUkwsIDEgPDwgMzEpOworCQlXUklURV9WUkVHKE1ERUNfRVhUSUZfQ0ZHMSwgMCk7CisJfQorCisKKyNpZiAxIC8qICNpZiBNRVNPTl9DUFVfVFlQRSA+PSBNRVNPTl9DUFVfVFlQRV9NRVNPTjggKi8KKwkvKiBwcl9pbmZvKCJ2aDI2NCBtZXNvbjggcHJvdCBpbml0XG4iKTsgKi8KKwlXUklURV9WUkVHKE1ERUNfUElDX0RDX1RIUkVTSCwgMHg0MDQwMzhhYSk7CisjZW5kaWYKKworI2lmZGVmIFZERUNfRFcKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3KSB7CisJCWlmIChJU19WREVDX0RXKGh3KSkgeworCQkJdTMyIGRhdGEgPSAoKDEgICA8PCAzMCkgfCgxICAgPDwgIDApIHwoMSAgIDw8ICA4KSk7CisKKwkJCWlmIChJU19WREVDX0RXKGh3KSA9PSAyKQorCQkJCWRhdGEgfD0gKDEgICA8PCAgOSk7CisJCQlXUklURV9WUkVHKE1ERUNfRE9VQkxFV19DRkcwLCBkYXRhKTsgLyogRG91YmxlIFdyaXRlIEVuYWJsZSovCisJCX0KKwl9CisjZW5kaWYKKwlpZiAoaHctPmRwYi5tRFBCLnNpemUgPiAwKSB7CisJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF83LCAoaHctPm1heF9yZWZlcmVuY2Vfc2l6ZSA8PCAyNCkgfAorCQkJKGh3LT5kcGIubURQQi5zaXplIDw8IDE2KSB8CisJCQkoaHctPmRwYi5tRFBCLnNpemUgPDwgOCkpOworCisJCWZvciAoaiA9IDA7IGogPCBody0+ZHBiLm1EUEIuc2l6ZTsgaisrKSB7CisJCQlpID0gZ2V0X2J1Zl9zcGVjX2J5X2NhbnZhc19wb3MoaHcsIGopOworCQkJaWYgKGkgPCAwKQorCQkJCWJyZWFrOworCisJCQlpZiAoIWh3LT5tbXVfZW5hYmxlICYmCisJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNtYV9hbGxvY19hZGRyKQorCQkJCWNvbmZpZ19kZWNvZGVfY2FudmFzKGh3LCBpKTsKKwkJCWlmIChody0+bW11X2VuYWJsZSAmJiBody0+ZG91YmxlX3dyaXRlX21vZGUpCisJCQkJY29uZmlnX2RlY29kZV9jYW52YXNfZXgoaHcsIGkpOworCQl9CisJfSBlbHNlIHsKKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzAsIDApOworCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfOSwgMCk7CisJfQorCisJaWYgKGh3LT5pbml0X2ZsYWcgPT0gMCkKKwkJV1JJVEVfVlJFRyhEUEJfU1RBVFVTX1JFRywgMCk7CisJZWxzZQorCQlXUklURV9WUkVHKERQQl9TVEFUVVNfUkVHLCBIMjY0X0FDVElPTl9ERUNPREVfU1RBUlQpOworCisJV1JJVEVfVlJFRyhGUkFNRV9DT1VOVEVSX1JFRywgaHctPmRlY29kZV9waWNfY291bnQpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF84LCBody0+YnVmX29mZnNldCk7CisJaWYgKCF0ZWVfZW5hYmxlZCgpKQorCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfRywgaHctPm1jX2RtYV9oYW5kbGUpOworCisJLyogaHctPmVycm9yX3JlY292ZXJ5X21vZGUgPSAoZXJyb3JfcmVjb3ZlcnlfbW9kZSAhPSAwKSA/CisJICoJZXJyb3JfcmVjb3ZlcnlfbW9kZSA6IGVycm9yX3JlY292ZXJ5X21vZGVfaW47CisJICovCisJLyogV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0YsCisJICoJKFJFQURfVlJFRyhBVl9TQ1JBVENIX0YpICYgMHhmZmZmZmZjMykgKTsKKwkgKi8KKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfRiwgKGh3LT5zYXZlX3JlZ19mICYgMHhmZmZmZmZjMykgfAorCQkoKGVycm9yX3JlY292ZXJ5X21vZGVfaW4gJiAweDEpIDw8IDQpKTsKKwkvKmlmIChody0+dWNvZGVfdHlwZSA9PSBVQ09ERV9JUF9PTkxZX1BBUkFNKQorCQlTRVRfVlJFR19NQVNLKEFWX1NDUkFUQ0hfRiwgMSA8PCA2KTsKKwllbHNlKi8KKwkJQ0xFQVJfVlJFR19NQVNLKEFWX1NDUkFUQ0hfRiwgMSA8PCA2KTsKKworCVdSSVRFX1ZSRUcoTE1FTV9EVU1QX0FEUiwgKHUzMilody0+bG1lbV9waHlfYWRkcik7CisjaWYgMSAvKiAjaWYgTUVTT05fQ1BVX1RZUEUgPj0gTUVTT05fQ1BVX1RZUEVfTUVTT044ICovCisJV1JJVEVfVlJFRyhNREVDX1BJQ19EQ19USFJFU0gsIDB4NDA0MDM4YWEpOworI2VuZGlmCisKKwlXUklURV9WUkVHKERFQlVHX1JFRzEsIDApOworCVdSSVRFX1ZSRUcoREVCVUdfUkVHMiwgMCk7CisKKwkvKkJlY2F1c2UgQ1NEIGRhdGEgaXMgbm90IGZvdW5kIGF0IHBsYXliYWNrIHN0YXJ0LAorCSAgdGhlIElRSURDVF9DT05UUk9MIHJlZ2lzdGVyIGlzIG5vdCBzYXZlZCwKKwkgIHRoZSBpbml0aWFsaXplZCB2YWx1ZSAweDIwMCBvZiBJUUlEQ1RfQ09OVFJPTCBpcyBzZXQqLworCWlmIChody0+aW5pdF9mbGFnICYmIChody0+cmVnX2lxaWRjdF9jb250cm9sX2luaXRfZmxhZyA9PSAwKSkKKwkJV1JJVEVfVlJFRyhJUUlEQ1RfQ09OVFJPTCwgMHgyMDApOworCisJaWYgKGh3LT5yZWdfaXFpZGN0X2NvbnRyb2wpCisJCVdSSVRFX1ZSRUcoSVFJRENUX0NPTlRST0wsIGh3LT5yZWdfaXFpZGN0X2NvbnRyb2wpOworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RFQ19ERVRBSUwsCisJCSJJUUlEQ1RfQ09OVFJPTCA9IDB4JXhcbiIsIFJFQURfVlJFRyhJUUlEQ1RfQ09OVFJPTCkpOworCisJaWYgKGh3LT5yZWdfdmNvcF9jdHJsX3JlZykKKwkJV1JJVEVfVlJFRyhWQ09QX0NUUkxfUkVHLCBody0+cmVnX3Zjb3BfY3RybF9yZWcpOworCWlmIChody0+dmxkX2RlY19jb250cm9sKQorCQlXUklURV9WUkVHKFZMRF9ERUNPREVfQ09OVFJPTCwgaHctPnZsZF9kZWNfY29udHJvbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm1oMjY0X3NldF90cmlja21vZGUoc3RydWN0IHZkZWNfcyAqdmRlYywgdW5zaWduZWQgbG9uZyB0cmlja21vZGUpCit7CisJc3RydWN0IHZkZWNfaDI2NF9od19zICpodyA9CisJCShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKil2ZGVjLT5wcml2YXRlOworCWlmIChpX29ubHlfZmxhZyAmIDB4MTAwKQorCQlyZXR1cm4gMDsKKwlpZiAodHJpY2ttb2RlID09IFRSSUNLTU9ERV9JKQorCQlody0+aV9vbmx5ID0gMHgzOworCWVsc2UgaWYgKHRyaWNrbW9kZSA9PSBUUklDS01PREVfTk9ORSkKKwkJaHctPmlfb25seSA9IDB4MDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYW12ZGVjX2VuYWJsZV9mbGFnOworc3RhdGljIHZvaWQgdmgyNjRfbG9jYWxfaW5pdChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LCBib29sIGlzX3Jlc2V0KQoreworCWludCBpOworCWh3LT5pbml0X2ZsYWcgPSAwOworCWh3LT5maXJzdF9zY19jaGVja2VkPSAwOworCWh3LT5lb3MgPSAwOworCWh3LT52YWx2ZV9jb3VudCA9IDA7CisJaHctPmNvbmZpZ19idWZtZ3JfZG9uZSA9IDA7CisJaHctPnN0YXJ0X3Byb2Nlc3NfdGltZSA9IDA7CisJaHctPmhhc19pX2ZyYW1lID0gMDsKKwlody0+bm9fZXJyb3JfY291bnQgPSAweGZmZjsKKwlody0+bm9fZXJyb3JfaV9jb3VudCA9IDB4ZjsKKworCWh3LT5kZWNfZmxhZyA9IDA7CisJaHctPmRhdGFfZmxhZyA9IDA7CisJaHctPnNraXBfZnJhbWVfY291bnQgPSAwOworCWh3LT5yZWdfaXFpZGN0X2NvbnRyb2wgPSAwOworCWh3LT5yZWdfaXFpZGN0X2NvbnRyb2xfaW5pdF9mbGFnID0gMDsKKwlody0+cmVnX3Zjb3BfY3RybF9yZWcgPSAwOworCWh3LT5yZWdfcnZfYWlfbWJfY291bnQgPSAwOworCWh3LT52bGRfZGVjX2NvbnRyb2wgPSAwOworCWh3LT5kZWNvZGVfdGltZW91dF9jb3VudCA9IDA7CisJaHctPm5vX21lbV9jb3VudCA9IDA7CisJaHctPmRlY19hZ2Fpbl9jbnQgPSAwOworCWh3LT52aDI2NF9yYXRpbyA9IGh3LT52aDI2NF9hbXN0cmVhbV9kZWNfaW5mby5yYXRpbzsKKwkvKiB2aDI2NF9yYXRpbyA9IDB4MTAwOyAqLworCisJaHctPnZoMjY0X3JvdGF0aW9uID0gKCgodW5zaWduZWQgbG9uZykKKwkJCWh3LT52aDI2NF9hbXN0cmVhbV9kZWNfaW5mby5wYXJhbSkgPj4gMTYpICYgMHhmZmZmOworCisJaHctPmZyYW1lX3Byb2cgPSAwOworCWh3LT5mcmFtZV93aWR0aCA9IGh3LT52aDI2NF9hbXN0cmVhbV9kZWNfaW5mby53aWR0aDsKKwlody0+ZnJhbWVfaGVpZ2h0ID0gaHctPnZoMjY0X2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodDsKKwlody0+ZnJhbWVfZHVyID0gaHctPnZoMjY0X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGU7CisJaHctPnB0c19vdXRzaWRlID0gKCh1bnNpZ25lZCBsb25nKQorCQkJaHctPnZoMjY0X2Ftc3RyZWFtX2RlY19pbmZvLnBhcmFtKSAmIDB4MDE7CisJaHctPnN5bmNfb3V0c2lkZSA9ICgodW5zaWduZWQgbG9uZykKKwkJCWh3LT52aDI2NF9hbXN0cmVhbV9kZWNfaW5mby5wYXJhbSAmIDB4MDIpID4+IDE7CisJaHctPnVzZV9pZHJfZnJhbWVyYXRlID0gKCh1bnNpZ25lZCBsb25nKQorCQkJaHctPnZoMjY0X2Ftc3RyZWFtX2RlY19pbmZvLnBhcmFtICYgMHgwNCkgPj4gMjsKKwlody0+bWF4X3JlZmVyX2J1ZiA9ICEoKCh1bnNpZ25lZCBsb25nKQorCQkJaHctPnZoMjY0X2Ftc3RyZWFtX2RlY19pbmZvLnBhcmFtICYgMHgxMCkgPj4gNCk7CisJaWYgKGh3LT5mcmFtZV9kdXIgPCA5NjAwMC85NjApIHsKKwkJLyptb3JlIHRoYW4gOTYwZnBzLGl0IHNob3VsZCBub3QgYmUgYSBjb3JyZWN0IHZhbHVlLAorCQkgKmdpdmUgZGVmYXVsdCAzMGZwcworCQkgKi8KKwkJaHctPmZyYW1lX2R1ciA9IDk2MDAwLzMwOworCX0KKworCWh3LT51bnN0YWJsZV9wdHMgPSAoKCh1bnNpZ25lZCBsb25nKSBody0+dmgyNjRfYW1zdHJlYW1fZGVjX2luZm8ucGFyYW0gJiAweDQwKSA+PiA2KTsKKworCWh3LT5maXJzdF9pX3BvbGljeSA9IGZpcnN0X2lfcG9saWN5OworCisJcHJfaW5mbygiSDI2NCBzeXNpbmZvOiAlZHglZCBkdXJhdGlvbj0lZCwgcHRzX291dHNpZGU9JWRcbiIsCisJCWh3LT5mcmFtZV93aWR0aCwgaHctPmZyYW1lX2hlaWdodCwgaHctPmZyYW1lX2R1ciwgaHctPnB0c19vdXRzaWRlKTsKKwlwcl9kZWJ1Zygic3luY19vdXRzaWRlPSVkLCB1c2VfaWRyX2ZyYW1lcmF0ZT0lZCwgaXNfdXNlZF92NGw6ICVkXG4iLAorCQlody0+c3luY19vdXRzaWRlLCBody0+dXNlX2lkcl9mcmFtZXJhdGUsIGh3LT5pc191c2VkX3Y0bCk7CisKKwlpZiAoaV9vbmx5X2ZsYWcgJiAweDEwMCkKKwkJaHctPmlfb25seSA9IGlfb25seV9mbGFnICYgMHhmZjsKKwlpZiAoaHctPmlfb25seSkKKwkJaHctPmRwYi5maXJzdF9pbnNlcnRfZnJhbWUgPSBGaXJzdEluc2VydEZybV9TS0lQRE9ORTsKKworCWlmICgodW5zaWduZWQgbG9uZykgaHctPnZoMjY0X2Ftc3RyZWFtX2RlY19pbmZvLnBhcmFtCisJCSYgMHgwOCkKKwkJaHctPm5vX3BvY19yZW9yZGVyX2ZsYWcgPSAxOworCisJZXJyb3JfcmVjb3ZlcnlfbW9kZV9pbiA9IDE7IC8qdWNvZGUgY29udHJvbD8qLworCWlmIChlcnJvcl9wcm9jX3BvbGljeSAmIDB4ODAwMDAwMDApCisJCWh3LT5zZW5kX2Vycm9yX2ZyYW1lX2ZsYWcgPSBlcnJvcl9wcm9jX3BvbGljeSAmIDB4MTsKKwllbHNlIGlmICgodW5zaWduZWQgbG9uZykgaHctPnZoMjY0X2Ftc3RyZWFtX2RlY19pbmZvLnBhcmFtICYgMHgyMCkKKwkJaHctPnNlbmRfZXJyb3JfZnJhbWVfZmxhZyA9IDA7IC8qRG9uJ3QgZGlzcGxheSBtYXJrIGVyciBmcmFtZXMqLworCisJaWYgKCFpc19yZXNldCkgeworCQlJTklUX0tGSUZPKGh3LT5kaXNwbGF5X3EpOworCQlJTklUX0tGSUZPKGh3LT5uZXdmcmFtZV9xKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgVkZfUE9PTF9TSVpFOyBpKyspIHsKKwkJCWNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqdmYgPSAmKGh3LT52ZnBvb2xbaHctPmN1cl9wb29sXVtpXSk7CisJCQlody0+dmZwb29sW2h3LT5jdXJfcG9vbF1baV0uaW5kZXggPSAtMTsgLyogVkZfQlVGX05VTTsgKi8KKwkJCWh3LT52ZnBvb2xbaHctPmN1cl9wb29sXVtpXS5idWZXaWR0aCA9IDE5MjA7CisJCQlrZmlmb19wdXQoJmh3LT5uZXdmcmFtZV9xLCB2Zik7CisJCX0KKwl9CisKKwlody0+ZHVyYXRpb25fZnJvbV9wdHNfZG9uZSA9IDA7CisKKwlody0+cF9sYXN0X3ZmID0gTlVMTDsKKwlody0+dmgyNjRfc3RyZWFtX3N3aXRjaGluZ19zdGF0ZSA9IFNXSVRDSElOR19TVEFURV9PRkY7CisJaHctPmhldmNfY3VyX2J1Zl9pZHggPSAweGZmZmY7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZody0+d2FpdF9xKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHMzMiB2aDI2NF9pbml0KHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcpCit7CisJaW50IHNpemUgPSAtMTsKKwlpbnQgZndfc2l6ZSA9IDB4MTAwMCAqIDE2OworCWludCBmd19tbXVfc2l6ZSA9IDB4MTAwMCAqIDE2OworCXN0cnVjdCBmaXJtd2FyZV9zICpmdyA9IE5VTEwsICpmd19tbXUgPSBOVUxMOworCisJLyogaW50IHRyaWNrbW9kZV9mZmZiID0gMDsgKi8KKworCS8qIHByX2luZm8oIlxudmgyNjRfaW5pdFxuIik7ICovCisJLyogaW5pdF90aW1lcigmaHctPnJlY3ljbGVfdGltZXIpOyAqLworCisJLyogdGltZXIgaW5pdCAqLworCXRpbWVyX3NldHVwKCZody0+Y2hlY2tfdGltZXIsIGNoZWNrX3RpbWVyX2Z1bmMsIDApOworCWh3LT5jaGVja190aW1lci5leHBpcmVzID0gamlmZmllcyArIENIRUNLX0lOVEVSVkFMOworCisJLyogYWRkX3RpbWVyKCZody0+Y2hlY2tfdGltZXIpOyAqLworCWh3LT5zdGF0IHw9IFNUQVRfVElNRVJfQVJNOworCWh3LT5zdGF0IHw9IFNUQVRfSVNSX1JFRzsKKworCW11dGV4X2luaXQoJmh3LT5jaHVua3NfbXV0ZXgpOworCXZoMjY0X2xvY2FsX2luaXQoaHcsIGZhbHNlKTsKKwlJTklUX1dPUksoJmh3LT53b3JrLCB2aDI2NF93b3JrKTsKKwlJTklUX1dPUksoJmh3LT5ub3RpZnlfd29yaywgdmgyNjRfbm90aWZ5X3dvcmspOworCUlOSVRfV09SSygmaHctPnRpbWVvdXRfd29yaywgdmgyNjRfdGltZW91dF93b3JrKTsKKyNpZmRlZiBNSDI2NF9VU0VSREFUQV9FTkFCTEUKKwlJTklUX1dPUksoJmh3LT51c2VyX2RhdGFfcmVhZHlfd29yaywgdXNlcl9kYXRhX3JlYWR5X25vdGlmeV93b3JrKTsKKyNlbmRpZgorCisJLyppZiAoIWFtdmRlY19lbmFibGVfZmxhZykgeworCQlhbXZkZWNfZW5hYmxlX2ZsYWcgPSB0cnVlOworCQlhbXZkZWNfZW5hYmxlKCk7CisJCWlmIChody0+bW11X2VuYWJsZSkKKwkJCWFtaGV2Y19lbmFibGUoKTsKKwl9Ki8KKwlpZiAoaHctPm1tdV9lbmFibGUpIHsKKworCQlody0+ZnJhbWVfbW11X21hcF9hZGRyID0KKwkJCQlkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCUZSQU1FX01NVV9NQVBfU0laRSwKKwkJCQkmaHctPmZyYW1lX21tdV9tYXBfcGh5X2FkZHIsIEdGUF9LRVJORUwpOworCQlpZiAoaHctPmZyYW1lX21tdV9tYXBfYWRkciA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgY291bnRfYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCWZ3ID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IGZpcm13YXJlX3MpICsgZndfc2l6ZSk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGZ3KSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzaXplID0gZ2V0X2Zpcm13YXJlX2RhdGEoVklERU9fREVDX0gyNjRfTVVMVEksIGZ3LT5kYXRhKTsKKwlpZiAoc2l6ZSA8IDApIHsKKwkJcHJfZXJyKCJnZXQgZmlybXdhcmUgZmFpbC5cbiIpOworCQl2ZnJlZShmdyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlmdy0+bGVuID0gc2l6ZTsKKwlody0+ZncgPSBmdzsKKworCWlmIChody0+bW11X2VuYWJsZSkgeworCQlmd19tbXUgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgZmlybXdhcmVfcykgKyBmd19tbXVfc2l6ZSk7CisJCWlmIChJU19FUlJfT1JfTlVMTChmd19tbXUpKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJc2l6ZSA9IGdldF9maXJtd2FyZV9kYXRhKFZJREVPX0RFQ19IMjY0X01VTFRJX01NVSwgZndfbW11LT5kYXRhKTsKKwkJaWYgKHNpemUgPCAwKSB7CisJCQlwcl9lcnIoImdldCBtbXUgZncgZmFpbC5cbiIpOworCQkJdmZyZWUoZndfbW11KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWZ3X21tdS0+bGVuID0gc2l6ZTsKKwkJaHctPmZ3X21tdSA9IGZ3X21tdTsKKwl9CisKKwlpZiAoIXRlZV9lbmFibGVkKCkpIHsKKwkJLyogLS0gdWNvZGUgbG9hZGluZyAoYW1yaXNjIGFuZCBzd2FwIGNvZGUpICovCisJCWh3LT5tY19jcHVfYWRkciA9CisJCQlkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLCBNQ19UT1RBTF9TSVpFLAorCQkJCQkmaHctPm1jX2RtYV9oYW5kbGUsIEdGUF9LRVJORUwpOworCQlpZiAoIWh3LT5tY19jcHVfYWRkcikgeworCQkJYW12ZGVjX2VuYWJsZV9mbGFnID0gZmFsc2U7CisJCQlhbXZkZWNfZGlzYWJsZSgpOworCQkJaHctPnZkZWNfcGdfZW5hYmxlX2ZsYWcgPSAwOworCQkJaWYgKGh3LT5tbXVfZW5hYmxlKQorCQkJCWFtaGV2Y19kaXNhYmxlKCk7CisJCQlwcl9pbmZvKCJ2aDI2NF9pbml0OiBDYW4gbm90IGFsbG9jYXRlIG1jIG1lbW9yeS5cbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQkvKnByX2luZm8oIjI2NCB1Y29kZSBzd2FwIGFyZWE6IHBoeWFkZHIgJXAsIGNwdSB2YWRkciAlcFxuIiwKKwkJCSh2b2lkICopaHctPm1jX2RtYV9oYW5kbGUsIGh3LT5tY19jcHVfYWRkcik7CisJCSovCisKKwkJLypyZXQgPSBhbXZkZWNfbG9hZG1jX2V4KFZGT1JNQVRfSDI2NCwgTlVMTCwgYnVmKTsqLworCisJCS8qaGVhZGVyKi8KKwkJbWVtY3B5KCh1OCAqKSBody0+bWNfY3B1X2FkZHIgKyBNQ19PRkZTRVRfSEVBREVSLAorCQkJZnctPmRhdGEgKyAweDQwMDAsIE1DX1NXQVBfU0laRSk7CisJCS8qZGF0YSovCisJCW1lbWNweSgodTggKikgaHctPm1jX2NwdV9hZGRyICsgTUNfT0ZGU0VUX0RBVEEsCisJCQlmdy0+ZGF0YSArIDB4MjAwMCwgTUNfU1dBUF9TSVpFKTsKKwkJLyptbWNvKi8KKwkJbWVtY3B5KCh1OCAqKSBody0+bWNfY3B1X2FkZHIgKyBNQ19PRkZTRVRfTU1DTywKKwkJCWZ3LT5kYXRhICsgMHg2MDAwLCBNQ19TV0FQX1NJWkUpOworCQkvKmxpc3QqLworCQltZW1jcHkoKHU4ICopIGh3LT5tY19jcHVfYWRkciArIE1DX09GRlNFVF9MSVNULAorCQkJZnctPmRhdGEgKyAweDMwMDAsIE1DX1NXQVBfU0laRSk7CisJCS8qc2xpY2UqLworCQltZW1jcHkoKHU4ICopIGh3LT5tY19jcHVfYWRkciArIE1DX09GRlNFVF9TTElDRSwKKwkJCWZ3LT5kYXRhICsgMHg1MDAwLCBNQ19TV0FQX1NJWkUpOworCQkvKm1haW4qLworCQltZW1jcHkoKHU4ICopIGh3LT5tY19jcHVfYWRkciArIE1DX09GRlNFVF9NQUlOLAorCQkJZnctPmRhdGEsIDB4MjAwMCk7CisJCS8qZGF0YSovCisJCW1lbWNweSgodTggKikgaHctPm1jX2NwdV9hZGRyICsgTUNfT0ZGU0VUX01BSU4gKyAweDIwMDAsCisJCQlmdy0+ZGF0YSArIDB4MjAwMCwgMHgxMDAwKTsKKwkJLypzbGljZSovCisJCW1lbWNweSgodTggKikgaHctPm1jX2NwdV9hZGRyICsgTUNfT0ZGU0VUX01BSU4gKyAweDMwMDAsCisJCQlmdy0+ZGF0YSArIDB4NTAwMCwgMHgxMDAwKTsKKwl9CisKKyNpZiAxIC8qICNpZmRlZiAgQlVGRkVSX01HUl9JTl9DICovCisJaHctPmxtZW1fYWRkciA9IChkbWFfYWRkcl90KWRtYV9hbGxvY19jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQlQQUdFX1NJWkUsIChkbWFfYWRkcl90ICopJmh3LT5sbWVtX3BoeV9hZGRyLCBHRlBfS0VSTkVMKTsKKworCWlmIChody0+bG1lbV9hZGRyID09IDApIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFsbG9jIGxtZW0gYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtMTsKKwl9CisJcHJfZGVidWcoIiVzLCBwaHlfYWRkcj0lbHggdmFkZHI9JXBcbiIsCisJCV9fZnVuY19fLCBody0+bG1lbV9waHlfYWRkciwgKHZvaWQgKilody0+bG1lbV9hZGRyKTsKKworCWlmIChwcmVmaXhfYXV4X2J1Zl9zaXplID4gMCB8fAorCQlzdWZmaXhfYXV4X2J1Zl9zaXplID4gMCkgeworCQl1MzIgYXV4X2J1Zl9zaXplOworCQlody0+cHJlZml4X2F1eF9zaXplID0gQVVYX0JVRl9BTElHTihwcmVmaXhfYXV4X2J1Zl9zaXplKTsKKwkJaHctPnN1ZmZpeF9hdXhfc2l6ZSA9IEFVWF9CVUZfQUxJR04oc3VmZml4X2F1eF9idWZfc2l6ZSk7CisJCWF1eF9idWZfc2l6ZSA9IGh3LT5wcmVmaXhfYXV4X3NpemUgKyBody0+c3VmZml4X2F1eF9zaXplOworCQlody0+YXV4X2FkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCQkJICBhdXhfYnVmX3NpemUsICZody0+YXV4X3BoeV9hZGRyLAorCQkJCQkJICBHRlBfS0VSTkVMKTsKKwkJaWYgKGh3LT5hdXhfYWRkciA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgcnBtIGJ1ZmZlclxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaHctPnNlaV9kYXRhX2J1ZiA9IGttYWxsb2MoU0VJX0RBVEFfU0laRSwgR0ZQX0tFUk5FTCk7CisJCWlmIChody0+c2VpX2RhdGFfYnVmID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvYyBzZWkgaXR1IGRhdGEgYnVmZmVyXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlody0+c2VpX2l0dV9kYXRhX2J1ZiA9IGttYWxsb2MoU0VJX0lUVV9EQVRBX1NJWkUsIEdGUF9LRVJORUwpOworCQlpZiAoaHctPnNlaV9pdHVfZGF0YV9idWYgPT0gTlVMTCkgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFsbG9jIHNlaSBpdHUgZGF0YSBidWZmZXJcbiIsCisJCQkJX19mdW5jX18pOworCQkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCWh3LT5wcmVmaXhfYXV4X3NpemUgKyBody0+c3VmZml4X2F1eF9zaXplLCBody0+YXV4X2FkZHIsCisJCQkJaHctPmF1eF9waHlfYWRkcik7CisJCQlody0+YXV4X2FkZHIgPSBOVUxMOworCQkJa2ZyZWUoaHctPnNlaV9kYXRhX2J1Zik7CisJCQlody0+c2VpX2RhdGFfYnVmID0gTlVMTDsKKworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaWYgKE5VTEwgPT0gaHctPnNlaV91c2VyX2RhdGFfYnVmZmVyKSB7CisJCQlody0+c2VpX3VzZXJfZGF0YV9idWZmZXIgPSBrbWFsbG9jKFVTRVJfREFUQV9TSVpFLAorCQkJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCWlmICghaHctPnNlaV91c2VyX2RhdGFfYnVmZmVyKSB7CisJCQkJcHJfaW5mbygiJXM6IENhbiBub3QgYWxsb2NhdGUgc2VpX2RhdGFfYnVmZmVyXG4iLAorCQkJCQkgICBfX2Z1bmNfXyk7CisJCQkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCQlody0+cHJlZml4X2F1eF9zaXplICsgaHctPnN1ZmZpeF9hdXhfc2l6ZSwgaHctPmF1eF9hZGRyLAorCQkJCQlody0+YXV4X3BoeV9hZGRyKTsKKwkJCQlody0+YXV4X2FkZHIgPSBOVUxMOworCQkJCWtmcmVlKGh3LT5zZWlfZGF0YV9idWYpOworCQkJCWh3LT5zZWlfZGF0YV9idWYgPSBOVUxMOworCQkJCWtmcmVlKGh3LT5zZWlfaXR1X2RhdGFfYnVmKTsKKwkJCQlody0+c2VpX2l0dV9kYXRhX2J1ZiA9IE5VTEw7CisKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlody0+c2VpX3VzZXJfZGF0YV93cCA9IDA7CisJCX0KKwl9CisvKiBCVUZGRVJfTUdSX0lOX0MgKi8KKyNlbmRpZgorCWh3LT5zdGF0IHw9IFNUQVRfTUNfTE9BRDsKKworCS8qIGFkZCBtZW1vcnkgYmFycmllciAqLworCXdtYigpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmgyNjRfc3RvcChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3KQoreworCWlmIChody0+c3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJYW12ZGVjX3N0b3AoKTsKKwkJaHctPnN0YXQgJj0gflNUQVRfVkRFQ19SVU47CisJfQorI2lmZGVmIFZERUNfRFcKKwlXUklURV9WUkVHKE1ERUNfRE9VQkxFV19DRkcwLCAwKTsKKwlXUklURV9WUkVHKE1ERUNfRE9VQkxFV19DRkcxLCAwKTsKKyNlbmRpZgorI2lmZGVmIE1IMjY0X1VTRVJEQVRBX0VOQUJMRQorCWNhbmNlbF93b3JrX3N5bmMoJmh3LT51c2VyX2RhdGFfcmVhZHlfd29yayk7CisjZW5kaWYKKwljYW5jZWxfd29ya19zeW5jKCZody0+bm90aWZ5X3dvcmspOworCWNhbmNlbF93b3JrX3N5bmMoJmh3LT50aW1lb3V0X3dvcmspOworCWNhbmNlbF93b3JrX3N5bmMoJmh3LT53b3JrKTsKKworCWlmIChody0+c3RhdCAmIFNUQVRfTUNfTE9BRCkgeworCQlpZiAoaHctPm1jX2NwdV9hZGRyICE9IE5VTEwpIHsKKwkJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQkJTUNfVE9UQUxfU0laRSwgaHctPm1jX2NwdV9hZGRyLAorCQkJCQlody0+bWNfZG1hX2hhbmRsZSk7CisJCQlody0+bWNfY3B1X2FkZHIgPSBOVUxMOworCQl9CisJCWlmIChody0+ZnJhbWVfbW11X21hcF9hZGRyICE9IE5VTEwpIHsKKwkJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlGUkFNRV9NTVVfTUFQX1NJWkUsIGh3LT5mcmFtZV9tbXVfbWFwX2FkZHIsCisJCQkJCWh3LT5mcmFtZV9tbXVfbWFwX3BoeV9hZGRyKTsKKwkJCWh3LT5mcmFtZV9tbXVfbWFwX2FkZHIgPSBOVUxMOworCQl9CisKKwl9CisJaWYgKGh3LT5zdGF0ICYgU1RBVF9JU1JfUkVHKSB7CisJCXZkZWNfZnJlZV9pcnEoVkRFQ19JUlFfMSwgKHZvaWQgKilodyk7CisJCWh3LT5zdGF0ICY9IH5TVEFUX0lTUl9SRUc7CisJfQorCWlmIChody0+bG1lbV9hZGRyKSB7CisJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCVBBR0VfU0laRSwgKHZvaWQgKilody0+bG1lbV9hZGRyLAorCQkJaHctPmxtZW1fcGh5X2FkZHIpOworCQlody0+bG1lbV9hZGRyID0gMDsKKwl9CisKKwlpZiAoaHctPmF1eF9hZGRyKSB7CisJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCWh3LT5wcmVmaXhfYXV4X3NpemUgKyBody0+c3VmZml4X2F1eF9zaXplLCBody0+YXV4X2FkZHIsCisJCQlody0+YXV4X3BoeV9hZGRyKTsKKwkJaHctPmF1eF9hZGRyID0gTlVMTDsKKwl9CisJaWYgKGh3LT5zZWlfZGF0YV9idWYgIT0gTlVMTCkgeworCQlrZnJlZShody0+c2VpX2RhdGFfYnVmKTsKKwkJaHctPnNlaV9kYXRhX2J1ZiA9IE5VTEw7CisJfQorCWlmIChody0+c2VpX2l0dV9kYXRhX2J1ZiAhPSBOVUxMKSB7CisJCWtmcmVlKGh3LT5zZWlfaXR1X2RhdGFfYnVmKTsKKwkJaHctPnNlaV9pdHVfZGF0YV9idWYgPSBOVUxMOworCX0KKwlpZiAoaHctPnNlaV91c2VyX2RhdGFfYnVmZmVyICE9IE5VTEwpIHsKKwkJa2ZyZWUoaHctPnNlaV91c2VyX2RhdGFfYnVmZmVyKTsKKwkJaHctPnNlaV91c2VyX2RhdGFfYnVmZmVyID0gTlVMTDsKKwl9CisJLyogYW12ZGVjX2Rpc2FibGUoKTsgKi8KKworCXZmcmVlKGh3LT5mdyk7CisJaHctPmZ3ID0gTlVMTDsKKworCWlmIChody0+bW11X2VuYWJsZSkgeworCQl2ZnJlZShody0+ZndfbW11KTsKKwkJaHctPmZ3X21tdSA9IE5VTEw7CisJfQorCisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSIlc1xuIiwKKwkJX19mdW5jX18pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3YWl0X3ZtaDI2NF9zZWFyY2hfZG9uZShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3KQoreworCXUzMiB2bGRfcnAgPSBSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApOworCWludCBjb3VudCA9IDA7CisJZG8geworCQl1c2xlZXBfcmFuZ2UoMTAwLCA1MDApOworCQlpZiAodmxkX3JwID09IFJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCkpCisJCQlicmVhazsKKwkJaWYgKGNvdW50ID4gMjAwMCkgeworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQlQUklOVF9GTEFHX0VSUk9SLCAiJXMgdGltZW91dCBjb3VudCAlZCB2bGRfcnAgMHgleCBWTERfTUVNX1ZJRklGT19SUCAweCV4XG4iLAorCQkJIF9fZnVuY19fLCBjb3VudCwgdmxkX3JwLCBSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApKTsKKwkJCWJyZWFrOworCQl9IGVsc2UKKwkJCXZsZF9ycCA9IFJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCk7CisJCWNvdW50Kys7CisJfSB3aGlsZSAoMSk7Cit9CisKK3N0YXRpYyB2b2lkIHZoMjY0X25vdGlmeV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0gY29udGFpbmVyX29mKHdvcmssCisJCQkJCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcywgbm90aWZ5X3dvcmspOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGh3KTsKKworCWlmIChody0+aXNfdXNlZF92NGwpCisJCXJldHVybjsKKworCWlmICh2ZGVjLT5mcl9oaW50X3N0YXRlID09IFZERUNfTkVFRF9ISU5UKSB7CisJCXZmX25vdGlmeV9yZWNlaXZlcih2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9GUl9ISU5ULAorCQkJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKWh3LT5mcmFtZV9kdXIpKTsKKwkJdmRlYy0+ZnJfaGludF9zdGF0ZSA9IFZERUNfSElOVEVEOworCX0KKworCXJldHVybjsKK30KKworI2lmZGVmIE1IMjY0X1VTRVJEQVRBX0VOQUJMRQorc3RhdGljIHZvaWQgdm1oMjY0X3Jlc2V0X3Vkcl9tZ3Ioc3RydWN0IHZkZWNfaDI2NF9od19zICpodykKK3sKKwlody0+d2FpdF9mb3JfdWRyX3NlbmQgPSAwOworCWh3LT5zZWlfaXR1X2RhdGFfbGVuID0gMDsKKwltZW1zZXQoJmh3LT51ZF9yZWNvcmQsIDAsIHNpemVvZihody0+dWRfcmVjb3JkKSk7Cit9CisKK3N0YXRpYyB2b2lkIHZtaDI2NF9jcmF0ZV91c2VyZGF0YV9tYW5hZ2VyKAorCQkJCQkJc3RydWN0IHZkZWNfaDI2NF9od19zICpodywKKwkJCQkJCXU4ICp1c2VyZGF0YV9idWYsCisJCQkJCQlpbnQgYnVmX2xlbikKK3sKKwlpZiAoaHcpIHsKKworCisJCW11dGV4X2luaXQoJmh3LT51c2VyZGF0YV9tdXRleCk7CisKKwkJbWVtc2V0KCZody0+dXNlcmRhdGFfaW5mbywgMCwKKwkJCXNpemVvZihzdHJ1Y3QgbWgyNjRfdXNlcmRhdGFfaW5mb190KSk7CisJCWh3LT51c2VyZGF0YV9pbmZvLmRhdGFfYnVmID0gdXNlcmRhdGFfYnVmOworCQlody0+dXNlcmRhdGFfaW5mby5idWZfbGVuID0gYnVmX2xlbjsKKwkJaHctPnVzZXJkYXRhX2luZm8uZGF0YV9idWZfZW5kID0gdXNlcmRhdGFfYnVmICsgYnVmX2xlbjsKKworCQl2bWgyNjRfcmVzZXRfdWRyX21ncihodyk7CisKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHZtaDI2NF9kZXN0cm95X3VzZXJkYXRhX21hbmFnZXIoc3RydWN0IHZkZWNfaDI2NF9od19zICpodykKK3sKKwlpZiAoaHcpCisJCW1lbXNldCgmaHctPnVzZXJkYXRhX2luZm8sCisJCQkJMCwKKwkJCQlzaXplb2Yoc3RydWN0IG1oMjY0X3VzZXJkYXRhX2luZm9fdCkpOworfQorCisvKgorI2RlZmluZSBEVU1QX1VTRVJEQVRBX1JFQ09SRAorKi8KKyNpZmRlZiBEVU1QX1VTRVJEQVRBX1JFQ09SRAorCisjZGVmaW5lIE1BWF9VU0VSX0RBVEFfU0laRQkJMzE0NTcyOAorc3RhdGljIHZvaWQgKnVzZXJfZGF0YV9idWY7CitzdGF0aWMgdW5zaWduZWQgY2hhciAqcGJ1Zl9zdGFydDsKK3N0YXRpYyBpbnQgdG90YWxfbGVuOworc3RhdGljIGludCBic2tpcDsKK3N0YXRpYyBpbnQgbl91c2VyZGF0YV9pZDsKKworc3RhdGljIHZvaWQgcHJpbnRfZGF0YSh1bnNpZ25lZCBjaGFyICpwZGF0YSwKKwkJCQkJCWludCBsZW4sCisJCQkJCQl1bnNpZ25lZCBpbnQgcG9jX251bWJlciwKKwkJCQkJCXVuc2lnbmVkIGludCBmbGFnLAorCQkJCQkJdW5zaWduZWQgaW50IGR1cmF0aW9uLAorCQkJCQkJdW5zaWduZWQgaW50IHZwdHMsCisJCQkJCQl1bnNpZ25lZCBpbnQgdnB0c192YWxpZCwKKwkJCQkJCWludCByZWNfaWQpCit7CisJaW50IG5MZWZ0OworCisJbkxlZnQgPSBsZW47CisjaWYgMAorCXByX2luZm8oIiVkIGxlbjolZCwgZmxhZzolZCwgZHVyOiVkLCB2cHRzOjB4JXgsIHZhbGlkOiVkLCBwb2M6JWRcbiIsCisJCQkJcmVjX2lkLAlsZW4sIGZsYWcsCisJCQkJZHVyYXRpb24sIHZwdHMsIHZwdHNfdmFsaWQsIHBvY19udW1iZXIpOworI2VuZGlmCisJcHJfaW5mbygiJWQgbGVuID0gJWQsIGZsYWcgPSAlZCwgdnB0cyA9IDB4JXhcbiIsCisJCQkJcmVjX2lkLAlsZW4sIGZsYWcsIHZwdHMpOworCisJaWYgKGxlbiA9PSA5NikgeworCQlpbnQgaTsKKwkJbkxlZnQgPSA3MjsKKwkJd2hpbGUgKG5MZWZ0ID49IDE2KSB7CisJCQlwcl9pbmZvKCIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJCXBkYXRhWzBdLCBwZGF0YVsxXSwgcGRhdGFbMl0sIHBkYXRhWzNdLAorCQkJCXBkYXRhWzRdLCBwZGF0YVs1XSwgcGRhdGFbNl0sIHBkYXRhWzddLAorCQkJCXBkYXRhWzhdLCBwZGF0YVs5XSwgcGRhdGFbMTBdLCBwZGF0YVsxMV0sCisJCQkJcGRhdGFbMTJdLCBwZGF0YVsxM10sIHBkYXRhWzE0XSwgcGRhdGFbMTVdKTsKKwkJCW5MZWZ0IC09IDE2OworCQkJcGRhdGEgKz0gMTY7CisJCX0KKworCisJCXdoaWxlIChuTGVmdCA+IDApIHsKKwkJCXByX2luZm8oIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCQlwZGF0YVswXSwgcGRhdGFbMV0sIHBkYXRhWzJdLCBwZGF0YVszXSwKKwkJCQlwZGF0YVs0XSwgcGRhdGFbNV0sIHBkYXRhWzZdLCBwZGF0YVs3XSk7CisJCQluTGVmdCAtPSA4OworCQkJcGRhdGEgKz0gODsKKwkJfQorCisJCWkgPSAwOworCQluTGVmdCA9IDk2LTcyOworCQl3aGlsZSAoaSA8IG5MZWZ0KSB7CisJCQlpZiAocGRhdGFbMF0gIT0gMCkgeworCQkJCXByX2luZm8oInNvbWUgZGF0YSBlcnJvclxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwZGF0YSsrOworCQkJaSsrOworCQl9CisJfSBlbHNlIHsKKwkJd2hpbGUgKG5MZWZ0ID49IDE2KSB7CisJCQlwcl9pbmZvKCIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJCXBkYXRhWzBdLCBwZGF0YVsxXSwgcGRhdGFbMl0sIHBkYXRhWzNdLAorCQkJCXBkYXRhWzRdLCBwZGF0YVs1XSwgcGRhdGFbNl0sIHBkYXRhWzddLAorCQkJCXBkYXRhWzhdLCBwZGF0YVs5XSwgcGRhdGFbMTBdLCBwZGF0YVsxMV0sCisJCQkJcGRhdGFbMTJdLCBwZGF0YVsxM10sIHBkYXRhWzE0XSwgcGRhdGFbMTVdKTsKKwkJCW5MZWZ0IC09IDE2OworCQkJcGRhdGEgKz0gMTY7CisJCX0KKworCisJCXdoaWxlIChuTGVmdCA+IDApIHsKKwkJCXByX2luZm8oIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCQlwZGF0YVswXSwgcGRhdGFbMV0sIHBkYXRhWzJdLCBwZGF0YVszXSwKKwkJCQlwZGF0YVs0XSwgcGRhdGFbNV0sIHBkYXRhWzZdLCBwZGF0YVs3XSk7CisJCQluTGVmdCAtPSA4OworCQkJcGRhdGEgKz0gODsKKwkJfQorCisJfQorfQorCitzdGF0aWMgdm9pZCBwdXNoX3RvX2J1ZihzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LAorCQkJCQl1OCAqcGRhdGEsCisJCQkJCWludCBsZW4sCisJCQkJCXN0cnVjdCB1c2VyZGF0YV9tZXRhX2luZm9fdCAqcG1ldGEpOworCitzdGF0aWMgdm9pZCBkdW1wX3VzZXJkYXRhX3JlY29yZChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LAorCQkJCQlzdHJ1Y3QgbWgyNjRfdXNlcmRhdGFfcmVjb3JkX3QgKnJlY29yZCkKK3sKKwlpZiAocmVjb3JkICYmIGh3KSB7CisJCXU4ICpwZGF0YTsKKworCQlwZGF0YSA9IGh3LT51c2VyZGF0YV9pbmZvLmRhdGFfYnVmICsgcmVjb3JkLT5yZWNfc3RhcnQ7CisvKgorCQlwcmludF9kYXRhKHBkYXRhLAorCQkJcmVjb3JkLT5yZWNfbGVuLAorCQkJcmVjb3JkLT5tZXRhX2luZm8uZmxhZ3MsCisJCQlyZWNvcmQtPm1ldGFfaW5mby5kdXJhdGlvbiwKKwkJCXJlY29yZC0+bWV0YV9pbmZvLnZwdHMsCisJCQlyZWNvcmQtPm1ldGFfaW5mby52cHRzX3ZhbGlkLAorCQkJbl9yZWNvcmRfaWQpOworKi8KKwkJcHVzaF90b19idWYoaHcsIHBkYXRhLCByZWNvcmQtPnJlY19sZW4sICAmcmVjb3JkLT5tZXRhX2luZm8pOworCQluX3VzZXJkYXRhX2lkKys7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHB1c2hfdG9fYnVmKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcsCisJCQkJCXU4ICpwZGF0YSwgaW50IGxlbiwKKwkJCQkJc3RydWN0IHVzZXJkYXRhX21ldGFfaW5mb190ICpwbWV0YSkKK3sKKwl1MzIgKnBMZW47CisJaW50IGluZm9fY250OworCXU4ICpwYnVmX2VuZDsKKworCWlmICghdXNlcl9kYXRhX2J1ZikKKwkJcmV0dXJuOworCisJaWYgKGJza2lwKSB7CisJCXByX2luZm8oIm92ZXIgc2l6ZSwgc2tpcFxuIik7CisJCXJldHVybjsKKwl9CisJaW5mb19jbnQgPSAwOworCXBMZW4gPSAodTMyICopcGJ1Zl9zdGFydDsKKworCSpwTGVuID0gbGVuOworCXBidWZfc3RhcnQgKz0gc2l6ZW9mKHUzMik7CisJaW5mb19jbnQrKzsKKwlwTGVuKys7CisKKwkqcExlbiA9IHBtZXRhLT5wb2NfbnVtYmVyOworCXBidWZfc3RhcnQgKz0gc2l6ZW9mKHUzMik7CisJaW5mb19jbnQrKzsKKwlwTGVuKys7CisKKwkqcExlbiA9IHBtZXRhLT5kdXJhdGlvbjsKKwlwYnVmX3N0YXJ0ICs9IHNpemVvZih1MzIpOworCWluZm9fY250Kys7CisJcExlbisrOworCisJKnBMZW4gPSBwbWV0YS0+ZmxhZ3M7CisJcGJ1Zl9zdGFydCArPSBzaXplb2YodTMyKTsKKwlpbmZvX2NudCsrOworCXBMZW4rKzsKKworCSpwTGVuID0gcG1ldGEtPnZwdHM7CisJcGJ1Zl9zdGFydCArPSBzaXplb2YodTMyKTsKKwlpbmZvX2NudCsrOworCXBMZW4rKzsKKworCSpwTGVuID0gcG1ldGEtPnZwdHNfdmFsaWQ7CisJcGJ1Zl9zdGFydCArPSBzaXplb2YodTMyKTsKKwlpbmZvX2NudCsrOworCXBMZW4rKzsKKworCisJKnBMZW4gPSBuX3VzZXJkYXRhX2lkOworCXBidWZfc3RhcnQgKz0gc2l6ZW9mKHUzMik7CisJaW5mb19jbnQrKzsKKwlwTGVuKys7CisKKworCisJcGJ1Zl9lbmQgPSAodTggKilody0+c2VpX3VzZXJfZGF0YV9idWZmZXIgKyBVU0VSX0RBVEFfU0laRTsKKwlpZiAocGRhdGEgKyBsZW4gPiBwYnVmX2VuZCkgeworCQlpbnQgZmlyc3Rfc2VjdGlvbl9sZW47CisKKwkJZmlyc3Rfc2VjdGlvbl9sZW4gPSBwYnVmX2VuZCAtIHBkYXRhOworCQltZW1jcHkocGJ1Zl9zdGFydCwgcGRhdGEsIGZpcnN0X3NlY3Rpb25fbGVuKTsKKwkJcGRhdGEgPSAodTggKilody0+c2VpX3VzZXJfZGF0YV9idWZmZXI7CisJCXBidWZfc3RhcnQgKz0gZmlyc3Rfc2VjdGlvbl9sZW47CisJCW1lbWNweShwYnVmX3N0YXJ0LCBwZGF0YSwgbGVuIC0gZmlyc3Rfc2VjdGlvbl9sZW4pOworCQlwYnVmX3N0YXJ0ICs9IGxlbiAtIGZpcnN0X3NlY3Rpb25fbGVuOworCX0gZWxzZSB7CisJCW1lbWNweShwYnVmX3N0YXJ0LCBwZGF0YSwgbGVuKTsKKwkJcGJ1Zl9zdGFydCArPSBsZW47CisJfQorCisJdG90YWxfbGVuICs9IGxlbiArIGluZm9fY250ICogc2l6ZW9mKHUzMik7CisJaWYgKHRvdGFsX2xlbiA+PSBNQVhfVVNFUl9EQVRBX1NJWkUtNDA5NikKKwkJYnNraXAgPSAxOworfQorCitzdGF0aWMgdm9pZCBzaG93X3VzZXJfZGF0YV9idWYodm9pZCkKK3sKKwl1OCAqcGJ1ZjsKKwlpbnQgbGVuOworCXVuc2lnbmVkIGludCBmbGFnOworCXVuc2lnbmVkIGludCBkdXJhdGlvbjsKKwl1bnNpZ25lZCBpbnQgdnB0czsKKwl1bnNpZ25lZCBpbnQgdnB0c192YWxpZDsKKwl1bnNpZ25lZCBpbnQgcG9jX251bWJlcjsKKwlpbnQgcmVjX2lkOworCisJcHJfaW5mbygic2hvdyB1c2VyIGRhdGEgYnVmXG4iKTsKKwlwYnVmID0gdXNlcl9kYXRhX2J1ZjsKKworCXdoaWxlIChwYnVmIDwgcGJ1Zl9zdGFydCkgeworCQl1MzIgKnBMZW47CisKKwkJcExlbiA9ICh1MzIgKilwYnVmOworCisJCWxlbiA9ICpwTGVuOworCQlwTGVuKys7CisJCXBidWYgKz0gc2l6ZW9mKHUzMik7CisKKwkJcG9jX251bWJlciA9ICpwTGVuOworCQlwTGVuKys7CisJCXBidWYgKz0gc2l6ZW9mKHUzMik7CisKKwkJZHVyYXRpb24gPSAqcExlbjsKKwkJcExlbisrOworCQlwYnVmICs9IHNpemVvZih1MzIpOworCisJCWZsYWcgPSAqcExlbjsKKwkJcExlbisrOworCQlwYnVmICs9IHNpemVvZih1MzIpOworCisJCXZwdHMgPSAqcExlbjsKKwkJcExlbisrOworCQlwYnVmICs9IHNpemVvZih1MzIpOworCisJCXZwdHNfdmFsaWQgPSAqcExlbjsKKwkJcExlbisrOworCQlwYnVmICs9IHNpemVvZih1MzIpOworCisJCXJlY19pZCA9ICpwTGVuOworCQlwTGVuKys7CisJCXBidWYgKz0gc2l6ZW9mKHUzMik7CisKKwkJcHJpbnRfZGF0YShwYnVmLCBsZW4sIHBvY19udW1iZXIsIGZsYWcsCisJCQlkdXJhdGlvbiwgdnB0cywKKwkJCXZwdHNfdmFsaWQsIHJlY19pZCk7CisJCXBidWYgKz0gbGVuOworCQltc2xlZXAoMzApOworCX0KK30KKworc3RhdGljIGludCB2bWgyNjRfaW5pdF91c2VyZGF0YV9kdW1wKHZvaWQpCit7CisJdXNlcl9kYXRhX2J1ZiA9IGttYWxsb2MoTUFYX1VTRVJfREFUQV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAodXNlcl9kYXRhX2J1ZikKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdm1oMjY0X2R1bXBfdXNlcmRhdGEodm9pZCkKK3sKKwlpZiAodXNlcl9kYXRhX2J1ZikgeworCQlzaG93X3VzZXJfZGF0YV9idWYoKTsKKwkJa2ZyZWUodXNlcl9kYXRhX2J1Zik7CisJCXVzZXJfZGF0YV9idWYgPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgdm1oMjY0X3Jlc2V0X3VzZXJfZGF0YV9idWYodm9pZCkKK3sKKwl0b3RhbF9sZW4gPSAwOworCXBidWZfc3RhcnQgPSB1c2VyX2RhdGFfYnVmOworCWJza2lwID0gMDsKKwluX3VzZXJkYXRhX2lkID0gMDsKK30KKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkIHZtaDI2NF91ZGNfZmlsbF92cHRzKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcsCisJCQkJCQlpbnQgZnJhbWVfdHlwZSwKKwkJCQkJCXUzMiB2cHRzLAorCQkJCQkJdTMyIHZwdHNfdmFsaWQpCit7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSAmaHctPmRwYjsKKworCXVuc2lnbmVkIGNoYXIgKnBkYXRhOworCXU4ICpwbWF4X3NlaV9kYXRhX2J1ZmZlcjsKKwl1OCAqc2VpX2RhdGFfYnVmOworCWludCBpOworCWludCB3cDsKKwlpbnQgZGF0YV9sZW5ndGg7CisJc3RydWN0IG1oMjY0X3VzZXJkYXRhX3JlY29yZF90ICpwX3VzZXJkYXRhX3JlYzsKKworCisjaWZkZWYgTUgyNjRfVVNFUkRBVEFfRU5BQkxFCisJc3RydWN0IHVzZXJkYXRhX21ldGFfaW5mb190IG1ldGFfaW5mbzsKKwltZW1zZXQoJm1ldGFfaW5mbywgMCwgc2l6ZW9mKG1ldGFfaW5mbykpOworI2VuZGlmCisKKwlpZiAoaHctPnNlaV9pdHVfZGF0YV9sZW4gPD0gMCkKKwkJcmV0dXJuOworCisJcGRhdGEgPSAodTggKilody0+c2VpX3VzZXJfZGF0YV9idWZmZXIgKyBody0+c2VpX3VzZXJfZGF0YV93cDsKKwlwbWF4X3NlaV9kYXRhX2J1ZmZlciA9ICh1OCAqKWh3LT5zZWlfdXNlcl9kYXRhX2J1ZmZlciArIFVTRVJfREFUQV9TSVpFOworCXNlaV9kYXRhX2J1ZiA9ICh1OCAqKWh3LT5zZWlfaXR1X2RhdGFfYnVmOworCWZvciAoaSA9IDA7IGkgPCBody0+c2VpX2l0dV9kYXRhX2xlbjsgaSsrKSB7CisJCSpwZGF0YSsrID0gc2VpX2RhdGFfYnVmW2ldOworCQlpZiAocGRhdGEgPj0gcG1heF9zZWlfZGF0YV9idWZmZXIpCisJCQlwZGF0YSA9ICh1OCAqKWh3LT5zZWlfdXNlcl9kYXRhX2J1ZmZlcjsKKwl9CisKKwlody0+c2VpX3VzZXJfZGF0YV93cCA9IChody0+c2VpX3VzZXJfZGF0YV93cAorCQkrIGh3LT5zZWlfaXR1X2RhdGFfbGVuKSAlIFVTRVJfREFUQV9TSVpFOworCWh3LT5zZWlfaXR1X2RhdGFfbGVuID0gMDsKKworI2lmZGVmIE1IMjY0X1VTRVJEQVRBX0VOQUJMRQorCW1ldGFfaW5mby5kdXJhdGlvbiA9IGh3LT5mcmFtZV9kdXI7CisJbWV0YV9pbmZvLmZsYWdzIHw9IChWRk9STUFUX0gyNjQgPDwgMyk7CisKKwltZXRhX2luZm8udnB0cyA9IHZwdHM7CisJbWV0YV9pbmZvLnZwdHNfdmFsaWQgPSB2cHRzX3ZhbGlkOworCW1ldGFfaW5mby5wb2NfbnVtYmVyID0KKwkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlLT5wb2M7CisKKworCXdwID0gaHctPnNlaV91c2VyX2RhdGFfd3A7CisKKwlpZiAoaHctPnNlaV91c2VyX2RhdGFfd3AgPiBody0+dXNlcmRhdGFfaW5mby5sYXN0X3dwKQorCQlkYXRhX2xlbmd0aCA9IHdwIC0gaHctPnVzZXJkYXRhX2luZm8ubGFzdF93cDsKKwllbHNlCisJCWRhdGFfbGVuZ3RoID0gd3AgKyBody0+dXNlcmRhdGFfaW5mby5idWZfbGVuCisJCQktIGh3LT51c2VyZGF0YV9pbmZvLmxhc3Rfd3A7CisKKwlpZiAoZGF0YV9sZW5ndGggJiAweDcpCisJCWRhdGFfbGVuZ3RoID0gKCgoZGF0YV9sZW5ndGggKyA4KSA+PiAzKSA8PCAzKTsKKworCXBfdXNlcmRhdGFfcmVjID0gJmh3LT51ZF9yZWNvcmQ7CisJcF91c2VyZGF0YV9yZWMtPm1ldGFfaW5mbyA9IG1ldGFfaW5mbzsKKwlwX3VzZXJkYXRhX3JlYy0+cmVjX3N0YXJ0ID0gaHctPnVzZXJkYXRhX2luZm8ubGFzdF93cDsKKwlwX3VzZXJkYXRhX3JlYy0+cmVjX2xlbiA9IGRhdGFfbGVuZ3RoOworCWh3LT51c2VyZGF0YV9pbmZvLmxhc3Rfd3AgPSB3cDsKKworCXBfdXNlcmRhdGFfcmVjLT5tZXRhX2luZm8uZmxhZ3MgfD0KKwkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlLT5waWNfc3RydWN0IDw8IDEyOworCisJaHctPndhaXRfZm9yX3Vkcl9zZW5kID0gMTsKKwl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT51c2VyX2RhdGFfcmVhZHlfd29yayk7CisjZW5kaWYKK30KKworCitzdGF0aWMgdm9pZCB1c2VyX2RhdGFfcmVhZHlfbm90aWZ5X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcgPSBjb250YWluZXJfb2Yod29yaywKKwkJc3RydWN0IHZkZWNfaDI2NF9od19zLCB1c2VyX2RhdGFfcmVhZHlfd29yayk7CisKKworCW11dGV4X2xvY2soJmh3LT51c2VyZGF0YV9tdXRleCk7CisKKwlody0+dXNlcmRhdGFfaW5mby5yZWNvcmRzW2h3LT51c2VyZGF0YV9pbmZvLndyaXRlX2luZGV4XQorCQk9IGh3LT51ZF9yZWNvcmQ7CisJaHctPnVzZXJkYXRhX2luZm8ud3JpdGVfaW5kZXgrKzsKKwlpZiAoaHctPnVzZXJkYXRhX2luZm8ud3JpdGVfaW5kZXggPj0gVVNFUkRBVEFfRklGT19OVU0pCisJCWh3LT51c2VyZGF0YV9pbmZvLndyaXRlX2luZGV4ID0gMDsKKworCW11dGV4X3VubG9jaygmaHctPnVzZXJkYXRhX211dGV4KTsKKworI2lmZGVmIERVTVBfVVNFUkRBVEFfUkVDT1JECisJZHVtcF91c2VyZGF0YV9yZWNvcmQoaHcsICZody0+dWRfcmVjb3JkKTsKKyNlbmRpZgorCXZkZWNfd2FrZXVwX3VzZXJkYXRhX3BvbGwoaHdfdG9fdmRlYyhodykpOworCisJaHctPndhaXRfZm9yX3Vkcl9zZW5kID0gMDsKK30KKworc3RhdGljIGludCB2bWgyNjRfdXNlcl9kYXRhX3JlYWQoc3RydWN0IHZkZWNfcyAqdmRlYywKKwlzdHJ1Y3QgdXNlcmRhdGFfcGFyYW1fdCAqcHVzZXJkYXRhX3BhcmEpCit7CisJc3RydWN0IHZkZWNfaDI2NF9od19zICpodyA9IE5VTEw7CisJaW50IHJlY19yaSwgcmVjX3dpOworCWludCByZWNfbGVuOworCXU4ICpyZWNfZGF0YV9zdGFydDsKKwl1OCAqcGRlc3RfYnVmOworCXN0cnVjdCBtaDI2NF91c2VyZGF0YV9yZWNvcmRfdCAqcF91c2VyZGF0YV9yZWM7CisJdTMyIGRhdGFfc2l6ZTsKKwl1MzIgcmVzOworCWludCBjb3B5X29rID0gMTsKKworCWh3ID0gKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisKKwlwZGVzdF9idWYgPSBwdXNlcmRhdGFfcGFyYS0+cGJ1Zl9hZGRyOworCisJbXV0ZXhfbG9jaygmaHctPnVzZXJkYXRhX211dGV4KTsKKworLyoKKwlwcl9pbmZvKCJyaSA9ICVkLCB3aSA9ICVkXG4iLAorCQlsZ19wX21wZWcxMl91c2VyZGF0YV9pbmZvLT5yZWFkX2luZGV4LAorCQlsZ19wX21wZWcxMl91c2VyZGF0YV9pbmZvLT53cml0ZV9pbmRleCk7CisqLworCXJlY19yaSA9IGh3LT51c2VyZGF0YV9pbmZvLnJlYWRfaW5kZXg7CisJcmVjX3dpID0gaHctPnVzZXJkYXRhX2luZm8ud3JpdGVfaW5kZXg7CisKKwlpZiAocmVjX3JpID09IHJlY193aSkgeworCQltdXRleF91bmxvY2soJmh3LT51c2VyZGF0YV9tdXRleCk7CisJCXJldHVybiAwOworCX0KKworCXBfdXNlcmRhdGFfcmVjID0gaHctPnVzZXJkYXRhX2luZm8ucmVjb3JkcyArIHJlY19yaTsKKworCXJlY19sZW4gPSBwX3VzZXJkYXRhX3JlYy0+cmVjX2xlbjsKKwlyZWNfZGF0YV9zdGFydCA9IHBfdXNlcmRhdGFfcmVjLT5yZWNfc3RhcnQgKyBody0+dXNlcmRhdGFfaW5mby5kYXRhX2J1ZjsKKy8qCisJcHJfaW5mbygicmVjX2xlbjolZCwgcmVjX3N0YXJ0OiVkLCBidWZfbGVuOiVkXG4iLAorCQlwX3VzZXJkYXRhX3JlYy0+cmVjX2xlbiwKKwkJcF91c2VyZGF0YV9yZWMtPnJlY19zdGFydCwKKwkJcHVzZXJkYXRhX3BhcmEtPmJ1Zl9sZW4pOworKi8KKwlpZiAocmVjX2xlbiA8PSBwdXNlcmRhdGFfcGFyYS0+YnVmX2xlbikgeworCQkvKiBkdmIgdXNlciBkYXRhIGJ1ZmZlciBpcyBlbm91Z2h0IHRvCisJCWNvcHkgdGhlIHdob2xlIHJlY29yZWQuICovCisJCWRhdGFfc2l6ZSA9IHJlY19sZW47CisJCWlmIChyZWNfZGF0YV9zdGFydCArIGRhdGFfc2l6ZQorCQkJPiBody0+dXNlcmRhdGFfaW5mby5kYXRhX2J1Zl9lbmQpIHsKKwkJCWludCBmaXJzdF9zZWN0aW9uX2xlbjsKKworCQkJZmlyc3Rfc2VjdGlvbl9sZW4gPSBody0+dXNlcmRhdGFfaW5mby5idWZfbGVuIC0KKwkJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX3N0YXJ0OworCQkJcmVzID0gKHUzMiljb3B5X3RvX3VzZXIoKHZvaWQgKilwZGVzdF9idWYsCisJCQkJCQkJKHZvaWQgKilyZWNfZGF0YV9zdGFydCwKKwkJCQkJCQlmaXJzdF9zZWN0aW9uX2xlbik7CisJCQlpZiAocmVzKSB7CisJCQkJcHJfaW5mbygicDEgcmVhZCBub3QgZW5kIHJlcz0lZCwgcmVxdWVzdD0lZFxuIiwKKwkJCQkJcmVzLCBmaXJzdF9zZWN0aW9uX2xlbik7CisJCQkJY29weV9vayA9IDA7CisKKwkJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX2xlbiAtPQorCQkJCQlmaXJzdF9zZWN0aW9uX2xlbiAtIHJlczsKKwkJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX3N0YXJ0ICs9CisJCQkJCWZpcnN0X3NlY3Rpb25fbGVuIC0gcmVzOworCQkJCXB1c2VyZGF0YV9wYXJhLT5kYXRhX3NpemUgPQorCQkJCQlmaXJzdF9zZWN0aW9uX2xlbiAtIHJlczsKKwkJCX0gZWxzZSB7CisJCQkJcmVzID0gKHUzMiljb3B5X3RvX3VzZXIoCisJCQkJCSh2b2lkICopKHBkZXN0X2J1ZitmaXJzdF9zZWN0aW9uX2xlbiksCisJCQkJCSh2b2lkICopaHctPnVzZXJkYXRhX2luZm8uZGF0YV9idWYsCisJCQkJCWRhdGFfc2l6ZSAtIGZpcnN0X3NlY3Rpb25fbGVuKTsKKwkJCQlpZiAocmVzKSB7CisJCQkJCXByX2luZm8oInAyIHJlYWQgbm90IGVuZCByZXM9JWQsIHJlcXVlc3Q9JWRcbiIsCisJCQkJCQlyZXMsIGRhdGFfc2l6ZSk7CisJCQkJCWNvcHlfb2sgPSAwOworCQkJCX0KKwkJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX2xlbiAtPQorCQkJCQlkYXRhX3NpemUgLSByZXM7CisJCQkJcF91c2VyZGF0YV9yZWMtPnJlY19zdGFydCA9CisJCQkJCWRhdGFfc2l6ZSAtIGZpcnN0X3NlY3Rpb25fbGVuIC0gcmVzOworCQkJCXB1c2VyZGF0YV9wYXJhLT5kYXRhX3NpemUgPQorCQkJCQlkYXRhX3NpemUgLSByZXM7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXMgPSAodTMyKWNvcHlfdG9fdXNlcigodm9pZCAqKXBkZXN0X2J1ZiwKKwkJCQkJCQkodm9pZCAqKXJlY19kYXRhX3N0YXJ0LAorCQkJCQkJCWRhdGFfc2l6ZSk7CisJCQlpZiAocmVzKSB7CisJCQkJcHJfaW5mbygicDMgcmVhZCBub3QgZW5kIHJlcz0lZCwgcmVxdWVzdD0lZFxuIiwKKwkJCQkJcmVzLCBkYXRhX3NpemUpOworCQkJCWNvcHlfb2sgPSAwOworCQkJfQorCQkJcF91c2VyZGF0YV9yZWMtPnJlY19sZW4gLT0gZGF0YV9zaXplIC0gcmVzOworCQkJcF91c2VyZGF0YV9yZWMtPnJlY19zdGFydCArPSBkYXRhX3NpemUgLSByZXM7CisJCQlwdXNlcmRhdGFfcGFyYS0+ZGF0YV9zaXplID0gZGF0YV9zaXplIC0gcmVzOworCQl9CisKKwkJaWYgKGNvcHlfb2spIHsKKwkJCWh3LT51c2VyZGF0YV9pbmZvLnJlYWRfaW5kZXgrKzsKKwkJCWlmIChody0+dXNlcmRhdGFfaW5mby5yZWFkX2luZGV4ID49IFVTRVJEQVRBX0ZJRk9fTlVNKQorCQkJCWh3LT51c2VyZGF0YV9pbmZvLnJlYWRfaW5kZXggPSAwOworCQl9CisJfSBlbHNlIHsKKwkJLyogZHZiIHVzZXIgZGF0YSBidWZmZXIgaXMgbm90IGVub3VnaHQKKwkJdG8gY29weSB0aGUgd2hvbGUgcmVjb3JlZC4gKi8KKwkJZGF0YV9zaXplID0gcHVzZXJkYXRhX3BhcmEtPmJ1Zl9sZW47CisJCWlmIChyZWNfZGF0YV9zdGFydCArIGRhdGFfc2l6ZQorCQkJPiBody0+dXNlcmRhdGFfaW5mby5kYXRhX2J1Zl9lbmQpIHsKKwkJCWludCBmaXJzdF9zZWN0aW9uX2xlbjsKKworCQkJZmlyc3Rfc2VjdGlvbl9sZW4gPSBody0+dXNlcmRhdGFfaW5mby5idWZfbGVuIC0KKwkJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX3N0YXJ0OworCQkJcmVzID0gKHUzMiljb3B5X3RvX3VzZXIoKHZvaWQgKilwZGVzdF9idWYsCisJCQkJCQkodm9pZCAqKXJlY19kYXRhX3N0YXJ0LAorCQkJCQkJZmlyc3Rfc2VjdGlvbl9sZW4pOworCQkJaWYgKHJlcykgeworCQkJCXByX2luZm8oInA0IHJlYWQgbm90IGVuZCByZXM9JWQsIHJlcXVlc3Q9JWRcbiIsCisJCQkJCXJlcywgZmlyc3Rfc2VjdGlvbl9sZW4pOworCQkJCWNvcHlfb2sgPSAwOworCQkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfbGVuIC09CisJCQkJCWZpcnN0X3NlY3Rpb25fbGVuIC0gcmVzOworCQkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfc3RhcnQgKz0KKwkJCQkJZmlyc3Rfc2VjdGlvbl9sZW4gLSByZXM7CisJCQkJcHVzZXJkYXRhX3BhcmEtPmRhdGFfc2l6ZSA9CisJCQkJCWZpcnN0X3NlY3Rpb25fbGVuIC0gcmVzOworCQkJfSBlbHNlIHsKKwkJCQkvKiBmaXJzdCBzZWN0b24gY29weSBpcyBvayovCisJCQkJcmVzID0gKHUzMiljb3B5X3RvX3VzZXIoCisJCQkJCSh2b2lkICopKHBkZXN0X2J1ZitmaXJzdF9zZWN0aW9uX2xlbiksCisJCQkJCSh2b2lkICopaHctPnVzZXJkYXRhX2luZm8uZGF0YV9idWYsCisJCQkJCWRhdGFfc2l6ZSAtIGZpcnN0X3NlY3Rpb25fbGVuKTsKKwkJCQlpZiAocmVzKSB7CisJCQkJCXByX2luZm8oInA1IHJlYWQgbm90IGVuZCByZXM9JWQsIHJlcXVlc3Q9JWRcbiIsCisJCQkJCQlyZXMsCisJCQkJCQlkYXRhX3NpemUgLSBmaXJzdF9zZWN0aW9uX2xlbik7CisJCQkJCWNvcHlfb2sgPSAwOworCQkJCX0KKworCQkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfbGVuIC09CisJCQkJCWRhdGFfc2l6ZSAtIHJlczsKKwkJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX3N0YXJ0ID0KKwkJCQkJZGF0YV9zaXplIC0gZmlyc3Rfc2VjdGlvbl9sZW4gLSByZXM7CisJCQkJcHVzZXJkYXRhX3BhcmEtPmRhdGFfc2l6ZSA9CisJCQkJCWRhdGFfc2l6ZSAtIHJlczsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJlcyA9ICh1MzIpY29weV90b191c2VyKCh2b2lkICopcGRlc3RfYnVmLAorCQkJCQkJCSh2b2lkICopcmVjX2RhdGFfc3RhcnQsCisJCQkJCQkJZGF0YV9zaXplKTsKKwkJCWlmIChyZXMpIHsKKwkJCQlwcl9pbmZvKCJwNiByZWFkIG5vdCBlbmQgcmVzPSVkLCByZXF1ZXN0PSVkXG4iLAorCQkJCQlyZXMsIGRhdGFfc2l6ZSk7CisJCQkJY29weV9vayA9IDA7CisJCQl9CisKKwkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfbGVuIC09IGRhdGFfc2l6ZSAtIHJlczsKKwkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfc3RhcnQgKz0gZGF0YV9zaXplIC0gcmVzOworCQkJcHVzZXJkYXRhX3BhcmEtPmRhdGFfc2l6ZSA9IGRhdGFfc2l6ZSAtIHJlczsKKwkJfQorCisJCWlmIChjb3B5X29rKSB7CisJCQlody0+dXNlcmRhdGFfaW5mby5yZWFkX2luZGV4Kys7CisJCQlpZiAoaHctPnVzZXJkYXRhX2luZm8ucmVhZF9pbmRleCA+PSBVU0VSREFUQV9GSUZPX05VTSkKKwkJCQlody0+dXNlcmRhdGFfaW5mby5yZWFkX2luZGV4ID0gMDsKKwkJfQorCisJfQorCXB1c2VyZGF0YV9wYXJhLT5tZXRhX2luZm8gPSBwX3VzZXJkYXRhX3JlYy0+bWV0YV9pbmZvOworCisJaWYgKGh3LT51c2VyZGF0YV9pbmZvLnJlYWRfaW5kZXggPD0gaHctPnVzZXJkYXRhX2luZm8ud3JpdGVfaW5kZXgpCisJCXB1c2VyZGF0YV9wYXJhLT5tZXRhX2luZm8ucmVjb3Jkc19pbl9xdWUgPQorCQkJaHctPnVzZXJkYXRhX2luZm8ud3JpdGVfaW5kZXggLQorCQkJaHctPnVzZXJkYXRhX2luZm8ucmVhZF9pbmRleDsKKwllbHNlCisJCXB1c2VyZGF0YV9wYXJhLT5tZXRhX2luZm8ucmVjb3Jkc19pbl9xdWUgPQorCQkJaHctPnVzZXJkYXRhX2luZm8ud3JpdGVfaW5kZXggKworCQkJVVNFUkRBVEFfRklGT19OVU0gLQorCQkJaHctPnVzZXJkYXRhX2luZm8ucmVhZF9pbmRleDsKKworCXB1c2VyZGF0YV9wYXJhLT52ZXJzaW9uID0gKDA8PDI0fDA8PDE2fDA8PDh8MSk7CisKKwltdXRleF91bmxvY2soJmh3LT51c2VyZGF0YV9tdXRleCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgdm1oMjY0X3Jlc2V0X3VzZXJkYXRhX2ZpZm8oc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGJJbml0KQoreworCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcgPSBOVUxMOworCisJaHcgPSAoc3RydWN0IHZkZWNfaDI2NF9od19zICopdmRlYy0+cHJpdmF0ZTsKKworCWlmIChodykgeworCQltdXRleF9sb2NrKCZody0+dXNlcmRhdGFfbXV0ZXgpOworCQlwcl9pbmZvKCJ2bWgyNjRfcmVzZXRfdXNlcmRhdGFfZmlmbzogYkluaXQ6ICVkLCByaTogJWQsIHdpOiAlZFxuIiwKKwkJCWJJbml0LAorCQkJaHctPnVzZXJkYXRhX2luZm8ucmVhZF9pbmRleCwKKwkJCWh3LT51c2VyZGF0YV9pbmZvLndyaXRlX2luZGV4KTsKKwkJaHctPnVzZXJkYXRhX2luZm8ucmVhZF9pbmRleCA9IDA7CisJCWh3LT51c2VyZGF0YV9pbmZvLndyaXRlX2luZGV4ID0gMDsKKworCQlpZiAoYkluaXQpCisJCQlody0+dXNlcmRhdGFfaW5mby5sYXN0X3dwID0gMDsKKwkJbXV0ZXhfdW5sb2NrKCZody0+dXNlcmRhdGFfbXV0ZXgpOworCX0KK30KKworc3RhdGljIHZvaWQgdm1oMjY0X3dha2V1cF91c2VyZGF0YV9wb2xsKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJYW1zdHJlYW1fd2FrZXVwX3VzZXJkYXRhX3BvbGwodmRlYyk7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgaW50IHZtaDI2NF9nZXRfcHNfaW5mbyhzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LAorCXUzMiBwYXJhbTEsIHUzMiBwYXJhbTIsIHUzMiBwYXJhbTMsIHUzMiBwYXJhbTQsCisJc3RydWN0IGFtbF92ZGVjX3BzX2luZm9zICpwcykKK3sKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGh3KTsKKyNlbmRpZgorCWludCBtYl93aWR0aCwgbWJfdG90YWw7CisJaW50IG1iX2hlaWdodCA9IDA7CisJaW50IGFjdGl2ZV9idWZmZXJfc3BlY19udW0sIGRlY19kcGJfc2l6ZTsKKwlpbnQgbWF4X3JlZmVyZW5jZV9zaXplICxsZXZlbF9pZGM7CisJdTMyIGZyYW1lX21ic19vbmx5X2ZsYWc7CisJdTMyIGNocm9tYV9mb3JtYXRfaWRjOworCXUzMiBjcm9wX2JvdHRvbSwgY3JvcF9yaWdodDsKKwlpbnQgc3ViX3dpZHRoX2MgPSAwLCBzdWJfaGVpZ2h0X2MgPSAwOworCXUzMiBmcmFtZV93aWR0aCwgZnJhbWVfaGVpZ2h0OworCXUzMiB1c2VkX3Jlb3JkZXJfZHBiX3NpemVfbWFyZ2luCisJCT0gaHctPnJlb3JkZXJfZHBiX3NpemVfbWFyZ2luOworCisJbGV2ZWxfaWRjID0gcGFyYW00ICYgMHhmZjsKKwltYXhfcmVmZXJlbmNlX3NpemUgPSAocGFyYW00ID4+IDgpICYgMHhmZjsKKworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJaWYgKHZkZWMtPm1hc3RlciB8fCB2ZGVjLT5zbGF2ZSkKKwkJdXNlZF9yZW9yZGVyX2RwYl9zaXplX21hcmdpbiA9CisJCQlyZW9yZGVyX2RwYl9zaXplX21hcmdpbl9kdjsKKyNlbmRpZgorCW1iX3dpZHRoID0gcGFyYW0xICYgMHhmZjsKKwltYl90b3RhbCA9IChwYXJhbTEgPj4gOCkgJiAweGZmZmY7CisJaWYgKCFtYl93aWR0aCAmJiBtYl90b3RhbCkgLypmb3IgNGsyayovCisJCW1iX3dpZHRoID0gMjU2OworCWlmIChtYl93aWR0aCkKKwkJbWJfaGVpZ2h0ID0gbWJfdG90YWwvbWJfd2lkdGg7CisJaWYgKG1iX3dpZHRoIDw9IDAgfHwgbWJfaGVpZ2h0IDw9IDAgfHwKKwkJaXNfb3ZlcnNpemUobWJfd2lkdGggPDwgNCwgbWJfaGVpZ2h0IDw8IDQpKSB7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJIiEhIXdyb25nIHBhcmFtMSAweCV4IG1iX3dpZHRoL21iX2hlaWdodCAoMHgleC8weCV4KSAleFxyXG4iLAorCQkJcGFyYW0xLAorCQkJbWJfd2lkdGgsCisJCQltYl9oZWlnaHQpOworCQlody0+ZXJyb3JfZnJhbWVfd2lkdGggPSBtYl93aWR0aCA8PCA0OworCQlody0+ZXJyb3JfZnJhbWVfaGVpZ2h0ID0gbWJfaGVpZ2h0IDw8IDQ7CisJCXJldHVybiAtMTsKKwl9CisJaHctPmVycm9yX2ZyYW1lX3dpZHRoID0gMDsKKwlody0+ZXJyb3JfZnJhbWVfaGVpZ2h0ID0gMDsKKworCWRlY19kcGJfc2l6ZSA9IGdldF9kZWNfZHBiX3NpemUoaHcgLCBtYl93aWR0aCwgbWJfaGVpZ2h0KTsKKworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkicmVzdHJpY3Rpb25fZmxhZz0lZCwgbWF4X2RlY19mcmFtZV9idWZmZXJpbmc9JWQsIGRlY19kcGJfc2l6ZT0lZCBudW1fcmVvcmRlcl9mcmFtZXMgJWQgdXNlZF9yZW9yZGVyX2RwYl9zaXplX21hcmdpbiAlZFxuIiwKKwkJaHctPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnLAorCQlody0+bWF4X2RlY19mcmFtZV9idWZmZXJpbmcsCisJCWRlY19kcGJfc2l6ZSwKKwkJaHctPm51bV9yZW9yZGVyX2ZyYW1lcywKKwkJdXNlZF9yZW9yZGVyX2RwYl9zaXplX21hcmdpbik7CisKKwlhY3RpdmVfYnVmZmVyX3NwZWNfbnVtID0KKwkJZGVjX2RwYl9zaXplCisJCSsgdXNlZF9yZW9yZGVyX2RwYl9zaXplX21hcmdpbjsKKworCWlmIChhY3RpdmVfYnVmZmVyX3NwZWNfbnVtID4gTUFYX1ZGX0JVRl9OVU0pIHsKKwkJYWN0aXZlX2J1ZmZlcl9zcGVjX251bSA9IE1BWF9WRl9CVUZfTlVNOworCQlkZWNfZHBiX3NpemUgPSBhY3RpdmVfYnVmZmVyX3NwZWNfbnVtCisJCQktIHVzZWRfcmVvcmRlcl9kcGJfc2l6ZV9tYXJnaW47CisJfQorCisJaHctPmRwYi5tRFBCLnNpemUgPSBhY3RpdmVfYnVmZmVyX3NwZWNfbnVtOworCisJaWYgKGh3LT5ub19wb2NfcmVvcmRlcl9mbGFnKQorCQlkZWNfZHBiX3NpemUgPSAxOworCisJLyoKKwkgKiBjcm9wCisJICogQVZfU0NSQVRDSF8yCisJICogYml0IDE1OiBmcmFtZV9tYnNfb25seV9mbGFnCisJICogYml0IDEzLTE0OiBjaHJvbWFfZm9ybWF0X2lkYworCSAqLworCWh3LT5zZXFfaW5mbyA9IHBhcmFtMjsKKwlmcmFtZV9tYnNfb25seV9mbGFnID0gKGh3LT5zZXFfaW5mbyA+PiAxNSkgJiAweDAxOworCWlmIChody0+ZHBiLm1TUFMucHJvZmlsZV9pZGMgIT0gMTAwICYmCisJCWh3LT5kcGIubVNQUy5wcm9maWxlX2lkYyAhPSAxMTAgJiYKKwkJaHctPmRwYi5tU1BTLnByb2ZpbGVfaWRjICE9IDEyMiAmJgorCQlody0+ZHBiLm1TUFMucHJvZmlsZV9pZGMgIT0gMTQ0KSB7CisJCWh3LT5kcGIuY2hyb21hX2Zvcm1hdF9pZGMgPSAxOworCX0KKwljaHJvbWFfZm9ybWF0X2lkYyA9IGh3LT5kcGIuY2hyb21hX2Zvcm1hdF9pZGM7CisKKwkvKgorCSAqIEFWX1NDUkFUQ0hfNiBiaXQgMzEtMTYgPSAgKGxlZnQgIDw8IDggfCByaWdodCApIDw8IDEKKwkgKiBBVl9TQ1JBVENIXzYgYml0IDE1LTAgPSAgKHRvcCA8PCA4ICB8IGJvdHRvbSApIDw8CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICgyIC0gZnJhbWVfbWJzX29ubHlfZmxhZykKKwkgKi8KKwlzd2l0Y2ggKGNocm9tYV9mb3JtYXRfaWRjKSB7CisJCWNhc2UgMToKKwkJCXN1Yl93aWR0aF9jID0gMjsKKwkJCXN1Yl9oZWlnaHRfYyA9IDI7CisJCQlicmVhazsKKworCQljYXNlIDI6CisJCQlzdWJfd2lkdGhfYyA9IDI7CisJCQlzdWJfaGVpZ2h0X2MgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSAzOgorCQkJc3ViX3dpZHRoX2MgPSAxOworCQkJc3ViX2hlaWdodF9jID0gMTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisKKwlpZiAoY2hyb21hX2Zvcm1hdF9pZGMgPT0gMCkgeworCQljcm9wX3JpZ2h0ID0gaHctPmRwYi5mcmFtZV9jcm9wX3JpZ2h0X29mZnNldDsKKwkJY3JvcF9ib3R0b20gPSBody0+ZHBiLmZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCAqCisJCQkoMiAtIGZyYW1lX21ic19vbmx5X2ZsYWcpOworCX0gZWxzZSB7CisJCWNyb3BfcmlnaHQgPSBzdWJfd2lkdGhfYyAqIGh3LT5kcGIuZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQ7CisJCWNyb3BfYm90dG9tID0gc3ViX2hlaWdodF9jICogaHctPmRwYi5mcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQgKgorCQkJKDIgLSBmcmFtZV9tYnNfb25seV9mbGFnKTsKKwl9CisKKwlmcmFtZV93aWR0aCA9IG1iX3dpZHRoIDw8IDQ7CisJZnJhbWVfaGVpZ2h0ID0gbWJfaGVpZ2h0IDw8IDQ7CisKKwlmcmFtZV93aWR0aCA9IGZyYW1lX3dpZHRoIC0gY3JvcF9yaWdodDsKKwlmcmFtZV9oZWlnaHQgPSBmcmFtZV9oZWlnaHQgLSBjcm9wX2JvdHRvbTsKKworCXBzLT5wcm9maWxlIAkJPSBsZXZlbF9pZGM7CisJcHMtPnJlZl9mcmFtZXMgCQk9IG1heF9yZWZlcmVuY2Vfc2l6ZTsKKwlwcy0+bWJfd2lkdGggCQk9IG1iX3dpZHRoOworCXBzLT5tYl9oZWlnaHQgCQk9IG1iX2hlaWdodDsKKwlwcy0+dmlzaWJsZV93aWR0aAk9IGZyYW1lX3dpZHRoOworCXBzLT52aXNpYmxlX2hlaWdodAk9IGZyYW1lX2hlaWdodDsKKwlwcy0+Y29kZWRfd2lkdGgJCT0gQUxJR04obWJfd2lkdGggPDwgNCwgNjQpOworCXBzLT5jb2RlZF9oZWlnaHQJPSBBTElHTihtYl9oZWlnaHQgPDwgNCwgNjQpOworCXBzLT5kcGJfZnJhbWVzCQk9IGRlY19kcGJfc2l6ZSArIDE7IC8qICsxIGZvciB0d28gZnJhbWVzIGluIG9uZSBwYWNrZXQgKi8KKwlwcy0+ZHBiX3NpemUJCT0gYWN0aXZlX2J1ZmZlcl9zcGVjX251bTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHY0bF9yZXNfY2hhbmdlKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcsCisJCQkgIHUzMiBwYXJhbTEsIHUzMiBwYXJhbTIsCisJCQkgIHUzMiBwYXJhbTMsIHUzMiBwYXJhbTQpCit7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSAmaHctPmRwYjsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgZGVjX2RwYl9zaXplX2NoYW5nZSA9IGh3LT5jc2RfY2hhbmdlX2ZsYWcgJiYgKGh3LT5kcGIuZGVjX2RwYl9zaXplICE9IGdldF9kZWNfZHBiX3NpemVfYWN0aXZlKGh3LCBwYXJhbTEpKTsKKworCWlmIChjdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSAmJgorCQkJaHctPnJlc19jaF9mbGFnID09IDApIHsKKwkJaWYgKCgocGFyYW0xICE9IDAgJiYKKwkJCWh3LT5zZXFfaW5mbzIgIT0gcGFyYW0xKSB8fCBody0+Y3NkX2NoYW5nZV9mbGFnKSAmJgorCQkJaHctPnNlcV9pbmZvMiAhPSAwKSB7CisJCQlpZiAoaHctPnNlcV9pbmZvMiAhPSBwYXJhbTEgfHwgZGVjX2RwYl9zaXplX2NoYW5nZSkgeyAvKnBpY3R1cmUgc2l6ZSBjaGFuZ2VkKi8KKwkJCQlzdHJ1Y3QgYW1sX3ZkZWNfcHNfaW5mb3MgcHM7CisJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCwKKwkJCQkJImgyNjQgcmVzX2NoYW5nZVxuIik7CisJCQkJaWYgKHZtaDI2NF9nZXRfcHNfaW5mbyhodywgcGFyYW0xLAorCQkJCQlwYXJhbTIsIHBhcmFtMywgcGFyYW00LCAmcHMpIDwgMCkgeworCQkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCQkJCSJzZXQgcGFyYW1ldGVycyBlcnJvclxuIik7CisJCQkJfQorCQkJCWh3LT52NGxfcGFyYW1zX3BhcnNlZCA9IGZhbHNlOworCQkJCXZkZWNfdjRsX3NldF9wc19pbmZvcyhjdHgsICZwcyk7CisJCQkJdmRlY192NGxfcmVzX2NoX2V2ZW50KGN0eCk7CisJCQkJaHctPnJlc19jaF9mbGFnID0gMTsKKwkJCQljdHgtPnY0bF9yZXNvbHV0aW9uX2NoYW5nZSA9IDE7CisJCQkJYW12ZGVjX3N0b3AoKTsKKwkJCQlpZiAoaHctPm1tdV9lbmFibGUpCisJCQkJCWFtaGV2Y19zdG9wKCk7CisJCQkJaHctPmVvcyA9IDE7CisJCQkJZmx1c2hfZHBiKHBfSDI2NF9EcGIpOworCQkJCS8vZGVsX3RpbWVyX3N5bmMoJmh3LT5jaGVja190aW1lcik7CisJCQkJbm90aWZ5X3Y0bF9lb3MoaHdfdG9fdmRlYyhodykpOworCQkJCXJldCA9IDE7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworCit9CisKK3N0YXRpYyBpbnQgY2hlY2tfZGlydHlfZGF0YShzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcgPQorCQkoc3RydWN0IHZkZWNfaDI2NF9od19zICopKHZkZWMtPnByaXZhdGUpOworCXUzMiB3cCwgcnAsIGxldmVsOworCisJcnAgPSBTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfcnApOworCXdwID0gU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3dwKTsKKworCWlmICh3cCA+IHJwKQorCQlsZXZlbCA9IHdwIC0gcnA7CisJZWxzZQorCQlsZXZlbCA9IHdwICsgdmRlYy0+aW5wdXQuc2l6ZSAtIHJwIDsKKworCWlmIChsZXZlbCA+ICh2ZGVjLT5pbnB1dC5zaXplIC8gMikpCisJCWh3LT5kZWNfYWdhaW5fY250Kys7CisKKwlpZiAoaHctPmRlY19hZ2Fpbl9jbnQgPiBkaXJ0eV9hZ2Fpbl90aHJlc2hvbGQpIHsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsICJoMjY0IGRhdGEgc2tpcHBlZCAleFxuIiwgbGV2ZWwpOworCQlody0+ZGVjX2FnYWluX2NudCA9IDA7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdmgyNjRfd29ya19pbXBsZW1lbnQoc3RydWN0IHZkZWNfaDI2NF9od19zICpodywKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgZnJvbSkKK3sKKwkvKiBmaW5pc2hlZCBkZWNvZGluZyBvbmUgZnJhbWUgb3IgZXJyb3IsCisJICogbm90aWZ5IHZkZWMgY29yZSB0byBzd2l0Y2ggY29udGV4dAorCSAqLworCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gJmh3LT5kcGI7CisKKwlpZiAoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9ET05FKSB7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX1dPUktFUl9TVEFSVCk7CisJfSBlbHNlIGlmIChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0FHQUlOKQorCQlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9XT1JLRVJfQUdBSU4pOworCisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsCisJCSIlcyBkZWNfcmVzdWx0ICVkICV4ICV4ICV4XG4iLAorCQlfX2Z1bmNfXywKKwkJaHctPmRlY19yZXN1bHQsCisJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCksCisJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19XUCksCisJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCkpOworCQlpZiAoIWh3LT5tbXVfZW5hYmxlKSB7CisJCQltdXRleF9sb2NrKCZ2bWgyNjRfbXV0ZXgpOworCQkJZGVhbGxvY19idWZfc3BlY3MoaHcsIDApOworCQkJbXV0ZXhfdW5sb2NrKCZ2bWgyNjRfbXV0ZXgpOworCQl9CisJaHctPnNhdmVfcmVnX2YgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9GKTsKKwlody0+ZHBiLmxhc3RfZHBiX3N0YXR1cyA9IGh3LT5kcGIuZGVjX2RwYl9zdGF0dXM7CisJaWYgKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfQ09ORklHX1BBUkFNKSB7CisJCXUzMiBwYXJhbTEgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF8xKTsKKwkJdTMyIHBhcmFtMiA9IFJFQURfVlJFRyhBVl9TQ1JBVENIXzIpOworCQl1MzIgcGFyYW0zID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfNik7CisJCXUzMiBwYXJhbTQgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9CKTsKKwkJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KTsKKworCQlpZiAoaHctPmlzX3VzZWRfdjRsICYmCisJCQljdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSkgeworCQkJaWYgKCF2NGxfcmVzX2NoYW5nZShodywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00KSkgeworCQkJCWlmICghaHctPnY0bF9wYXJhbXNfcGFyc2VkKSB7CisJCQkJCXN0cnVjdCBhbWxfdmRlY19wc19pbmZvcyBwczsKKwkJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJCQlQUklOVF9GTEFHX0RFQ19ERVRBSUwsCisJCQkJCQkiaDI2NCBwYXJzZXJlZCBjc2QgZGF0YVxuIik7CisJCQkJCWlmICh2bWgyNjRfZ2V0X3BzX2luZm8oaHcsCisJCQkJCQlwYXJhbTEsIHBhcmFtMiwKKwkJCQkJCXBhcmFtMywgcGFyYW00LCAmcHMpIDwgMCkgeworCQkJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkJCQkJInNldCBwYXJhbWV0ZXJzIGVycm9yXG4iKTsKKwkJCQkJfQorCQkJCQlody0+djRsX3BhcmFtc19wYXJzZWQgPSB0cnVlOworCQkJCQl2ZGVjX3Y0bF9zZXRfcHNfaW5mb3MoY3R4LCAmcHMpOworCisJCQkJCWFtdmRlY19zdG9wKCk7CisJCQkJCWlmIChody0+bW11X2VuYWJsZSkKKwkJCQkJCWFtaGV2Y19zdG9wKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHZoMjY0X3NldF9wYXJhbXMoaHcsIHBhcmFtMSwKKwkJCQkJcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgZmFsc2UpIDwgMCkgeworCQkJCQkJaHctPmluaXRfZmxhZyA9IDA7CisJCQkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwgInNldCBwYXJhbWV0ZXJzIGVycm9yLCBpbml0X2ZsYWc6ICV1XG4iLAorCQkJCQkJCWh3LT5pbml0X2ZsYWcpOworCQkJCQl9CisKKwkJCQkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzAsIChody0+bWF4X3JlZmVyZW5jZV9zaXplPDwyNCkgfAorCQkJCQkJKGh3LT5kcGIubURQQi5zaXplPDwxNikgfAorCQkJCQkJKGh3LT5kcGIubURQQi5zaXplPDw4KSk7CisJCQkJCWh3LT5yZXNfY2hfZmxhZyA9IDA7CisJCQkJCXN0YXJ0X3Byb2Nlc3NfdGltZShodyk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAodmgyNjRfc2V0X3BhcmFtcyhodywgcGFyYW0xLAorCQkJCXBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIGZhbHNlKSA8IDApIHsKKwkJCQlody0+aW5pdF9mbGFnID0gMDsKKwkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwgInNldCBwYXJhbWV0ZXJzIGVycm9yLCBpbml0X2ZsYWc6ICV1XG4iLAorCQkJCQlody0+aW5pdF9mbGFnKTsKKwkJCX0KKworCQkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzAsIChody0+bWF4X3JlZmVyZW5jZV9zaXplPDwyNCkgfAorCQkJCShody0+ZHBiLm1EUEIuc2l6ZTw8MTYpIHwKKwkJCQkoaHctPmRwYi5tRFBCLnNpemU8PDgpKTsKKwkJCXN0YXJ0X3Byb2Nlc3NfdGltZShodyk7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UKKwlpZiAoKChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0dFVF9EQVRBKSB8fAorCQkoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9HRVRfREFUQV9SRVRSWSkpCisJCSYmIChod190b192ZGVjKGh3KS0+bmV4dF9zdGF0dXMgIT0KKwkJVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEKSkgeworCQlpZiAoIXZkZWNfaGFzX21vcmVfaW5wdXQodmRlYykpIHsKKwkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9FT1M7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0dFVF9EQVRBKSB7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCQkiJXMgREVDX1JFU1VMVF9HRVRfREFUQSAleCAleCAleFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpLAorCQkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19XUCksCisJCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSk7CisJCQltdXRleF9sb2NrKCZody0+Y2h1bmtzX211dGV4KTsKKwkJCXZkZWNfdmZyYW1lX2RpcnR5KHZkZWMsIGh3LT5jaHVuayk7CisJCQlody0+Y2h1bmsgPSBOVUxMOworCQkJbXV0ZXhfdW5sb2NrKCZody0+Y2h1bmtzX211dGV4KTsKKwkJCXZkZWNfY2xlYW5faW5wdXQodmRlYyk7CisJCX0KKwkJaWYgKChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0dFVF9EQVRBX1JFVFJZKSAmJgorCQkJKCgxMDAwICogKGppZmZpZXMgLSBody0+Z2V0X2RhdGFfc3RhcnRfdGltZSkgLyBIWikKKwkJCT4gZ2V0X2RhdGFfdGltZW91dF92YWwpKSB7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCQkiJXMgREVDX1JFU1VMVF9HRVRfREFUQV9SRVRSWSB0aW1lb3V0XG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCWdvdG8gcmVzdWx0X2RvbmU7CisJCX0KKwkJaWYgKGlzX2J1ZmZlcl9hdmFpbGFibGUodmRlYykpIHsKKwkJCWludCByOworCQkJaW50IGRlY29kZV9zaXplOworCQkJciA9IHZkZWNfcHJlcGFyZV9pbnB1dCh2ZGVjLCAmaHctPmNodW5rKTsKKwkJCWlmIChyIDwgMCAmJiAoaHdfdG9fdmRlYyhodyktPm5leHRfc3RhdHVzICE9CisJCQkJCQlWREVDX1NUQVRVU19ESVNDT05ORUNURUQpKSB7CisJCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0dFVF9EQVRBX1JFVFJZOworCisJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJCVBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsCisJCQkJCSJ2ZGVjX3ByZXBhcmVfaW5wdXQ6IEluc3VmZmljaWVudCBkYXRhXG4iKTsKKwkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfTk9ORTsKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJCSIlczogY2h1bmsgc2l6ZSAweCV4XG4iLAorCQkJCV9fZnVuY19fLCBody0+Y2h1bmstPnNpemUpOworCisJCQlpZiAoZHBiX2lzX2RlYnVnKERFQ09ERV9JRChodyksCisJCQkJUFJJTlRfRlJBTUVCQVNFX0RBVEEpKSB7CisJCQkJaW50IGpqOworCQkJCXU4ICpkYXRhID0gTlVMTDsKKworCQkJCWlmICghaHctPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQkJCQlkYXRhID0gY29kZWNfbW1fdm1hcCgKKwkJCQkJCWh3LT5jaHVuay0+YmxvY2stPnN0YXJ0ICsKKwkJCQkJCWh3LT5jaHVuay0+b2Zmc2V0LCByKTsKKwkJCQllbHNlCisJCQkJCWRhdGEgPSAoKHU4ICopCisJCQkJCQlody0+Y2h1bmstPmJsb2NrLT5zdGFydF92aXJ0KQorCQkJCQkJKyBody0+Y2h1bmstPm9mZnNldDsKKworCQkJCWZvciAoamogPSAwOyBqaiA8IHI7IGpqKyspIHsKKwkJCQkJaWYgKChqaiAmIDB4ZikgPT0gMCkKKwkJCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLAorCQkJCQkJUFJJTlRfRlJBTUVCQVNFX0RBVEEsCisJCQkJCQkJIiUwNng6IiwgamopOworCQkJCQlkcGJfcHJpbnRfY29udChERUNPREVfSUQoaHcpLAorCQkJCQlQUklOVF9GUkFNRUJBU0VfREFUQSwKKwkJCQkJCSIlMDJ4ICIsIGRhdGFbampdKTsKKwkJCQkJaWYgKCgoamogKyAxKSAmIDB4ZikgPT0gMCkKKwkJCQkJCWRwYl9wcmludF9jb250KERFQ09ERV9JRChodyksCisJCQkJCQlQUklOVF9GUkFNRUJBU0VfREFUQSwKKwkJCQkJCQkiXG4iKTsKKwkJCQl9CisKKwkJCQlpZiAoIWh3LT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJCQkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcihkYXRhKTsKKwkJCX0KKwkJCVdSSVRFX1ZSRUcoUE9XRVJfQ1RMX1ZMRCwKKwkJCQlSRUFEX1ZSRUcoUE9XRVJfQ1RMX1ZMRCkgfAorCQkJCQkoMCA8PCAxMCkgfCAoMSA8PCA5KSB8ICgxIDw8IDYpKTsKKwkJCVdSSVRFX1ZSRUcoSDI2NF9ERUNPREVfSU5GTywgKDE8PDEzKSk7CisJCQlkZWNvZGVfc2l6ZSA9IGh3LT5jaHVuay0+c2l6ZSArCisJCQkJKGh3LT5jaHVuay0+b2Zmc2V0ICYgKFZERUNfRklGT19BTElHTiAtIDEpKTsKKwkJCVdSSVRFX1ZSRUcoSDI2NF9ERUNPREVfU0laRSwgZGVjb2RlX3NpemUpOworCQkJV1JJVEVfVlJFRyhWSUZGX0JJVF9DTlQsIGRlY29kZV9zaXplICogOCk7CisJCQl2ZGVjX2VuYWJsZV9pbnB1dCh2ZGVjKTsKKworCQkJV1JJVEVfVlJFRyhEUEJfU1RBVFVTX1JFRywgSDI2NF9BQ1RJT05fU0VBUkNIX0hFQUQpOworCQkJc3RhcnRfcHJvY2Vzc190aW1lKGh3KTsKKwkJfSBlbHNleworCQkJaWYgKGh3X3RvX3ZkZWMoaHcpLT5uZXh0X3N0YXR1cworCQkJCSE9CVZERUNfU1RBVFVTX0RJU0NPTk5FQ1RFRCkgeworCQkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9HRVRfREFUQV9SRVRSWTsKKwkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCX0KKwkJfQorCQlyZXR1cm47CisJfSBlbHNlIGlmIChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0RPTkUgfHwKKwkJCQkJaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9USU1FT1VUKSB7CisJCS8qIGlmICghaHctPmN0eF92YWxpZCkKKwkJCWh3LT5jdHhfdmFsaWQgPSAxOyAqLworCQlody0+ZGVjX2FnYWluX2NudCA9IDA7CisJCWlmICgoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9USU1FT1VUKSAmJgorCQkJCSFody0+aV9vbmx5ICYmIChlcnJvcl9wcm9jX3BvbGljeSAmIDB4MikpIHsKKwkJCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gJmh3LT5kcGI7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCQkiJXMsIGRlY29kZSB0aW1lb3V0IGZsdXNoIGRwYlxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlmbHVzaF9kcGIocF9IMjY0X0RwYik7CisJCX0KK3Jlc3VsdF9kb25lOgorCQl7CisJCQlpZiAoZXJyb3JfcHJvY19wb2xpY3kgJiAweDgwMDApIHsKKwkJCQlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9ICZody0+ZHBiOworCQkJCWludCBpOworCQkJCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIgPSAmcF9IMjY0X0RwYi0+bURQQjsKKworCQkJCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+dXNlZF9zaXplOyBpKyspIHsKKwkJCQkJaW50IGlfZmxhZyA9IHBfRHBiLT5mc1tpXS0+Ym90dG9tX2ZpZWxkIHx8IHBfRHBiLT5mc1tpXS0+dG9wX2ZpZWxkOworCQkJCQlpbnQgdGhyZXNob2xkID0gKGlfZmxhZyB8fCAoaHctPm1heF9yZWZlcmVuY2Vfc2l6ZSA+PSAxMikpID8gKCg1MCArIHBfRHBiLT51c2VkX3NpemUpICogMikgIDogNTAgKyBwX0RwYi0+dXNlZF9zaXplOworCQkJCQlpZiAoKHBfRHBiLT5mc1tpXS0+ZHBiX2ZyYW1lX2NvdW50ICsgdGhyZXNob2xkCisJCQkJCQkJPCBwX0gyNjRfRHBiLT5kcGJfZnJhbWVfY291bnQpICYmCisJCQkJCQlwX0RwYi0+ZnNbaV0tPmlzX3JlZmVyZW5jZSAmJgorCQkJCQkJIXBfRHBiLT5mc1tpXS0+aXNfbG9uZ190ZXJtICYmCisJCQkJCQlwX0RwYi0+ZnNbaV0tPmlzX291dHB1dCkgeworCQkJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJCQkJMCwKKwkJCQkJCQkidW5tYXJrIHJlZmVyZW5jZSBkcGJfZnJhbWVfY291bnQgZGlmZnJlbmNlIGxhcmdlIGluIGRwYlxuIik7CisJCQkJCQl1bm1hcmtfZm9yX3JlZmVyZW5jZShwX0RwYiwgcF9EcGItPmZzW2ldKTsKKwkJCQkJCXVwZGF0ZV9yZWZfbGlzdChwX0RwYik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJCWlmIChody0+bW11X2VuYWJsZQorCQkJCSYmIGh3LT5mcmFtZV9idXN5ICYmIGh3LT5mcmFtZV9kb25lKSB7CisJCQkJbG9uZyB1c2VkXzRrX251bTsKKwkJCQloZXZjX3Nhb193YWl0X2RvbmUoaHcpOworCQkJCWlmIChody0+aGV2Y19jdXJfYnVmX2lkeCAhPSAweGZmZmYpIHsKKwkJCQkJdXNlZF80a19udW0gPQorCQkJCQkoUkVBRF9WUkVHKEhFVkNfU0FPX01NVV9TVEFUVVMpID4+IDE2KTsKKwkJCQlpZiAodXNlZF80a19udW0gPj0gMCkKKwkJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJCVBSSU5UX0ZMQUdfTU1VX0RFVEFJTCwKKwkJCQkJInJlbGVhc2UgdW51c2VkIGJ1ZiAsIHVzZWRfNGtfbnVtICVsZCBpbmRleCAlZFxuIiwKKwkJCQkJdXNlZF80a19udW0sIGh3LT5oZXZjX2N1cl9idWZfaWR4KTsKKwkJCQloZXZjX21tdV9kbWFfY2hlY2soaHdfdG9fdmRlYyhodykpOworCQkJCWRlY29kZXJfbW11X2JveF9mcmVlX2lkeF90YWlsKAorCQkJCQlody0+bW11X2JveCwKKwkJCQkJaHctPmhldmNfY3VyX2J1Zl9pZHgsCisJCQkJCXVzZWRfNGtfbnVtKTsKKwkJCQkJaHctPmhldmNfY3VyX2J1Zl9pZHggPSAweGZmZmY7CisJCQkJfQorCQkJfQorCQlkZWNvZGVfZnJhbWVfY291bnRbREVDT0RFX0lEKGh3KV0rKzsKKwkJaWYgKGh3LT5kcGIubVNsaWNlLnNsaWNlX3R5cGUgPT0gSV9TTElDRSkgeworCQkJaHctPmd2cy5pX2RlY29kZWRfZnJhbWVzKys7CisJCX0gZWxzZSBpZiAoaHctPmRwYi5tU2xpY2Uuc2xpY2VfdHlwZSA9PSBQX1NMSUNFKSB7CisJCQlody0+Z3ZzLnBfZGVjb2RlZF9mcmFtZXMrKzsKKwkJfSBlbHNlIGlmIChody0+ZHBiLm1TbGljZS5zbGljZV90eXBlID09IEJfU0xJQ0UpIHsKKwkJCWh3LT5ndnMuYl9kZWNvZGVkX2ZyYW1lcysrOworCQl9CisJCWFtdmRlY19zdG9wKCk7CisKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkiJXMgZGVjX3Jlc3VsdCAlZCAleCAleCAleFxuIiwKKwkJCV9fZnVuY19fLAorCQkJaHctPmRlY19yZXN1bHQsCisJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1dQKSwKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCkpOworCQltdXRleF9sb2NrKCZody0+Y2h1bmtzX211dGV4KTsKKwkJdmRlY192ZnJhbWVfZGlydHkoaHdfdG9fdmRlYyhodyksIGh3LT5jaHVuayk7CisJCWh3LT5jaHVuayA9IE5VTEw7CisJCW11dGV4X3VubG9jaygmaHctPmNodW5rc19tdXRleCk7CisJfSBlbHNlIGlmIChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0FHQUlOKSB7CisJCS8qCisJCQlzdHJlYW0gYmFzZTogc3RyZWFtIGJ1ZiBlbXB0eSBvciB0aW1lb3V0CisJCQlmcmFtZSBiYXNlOiB2ZGVjX3ByZXBhcmVfaW5wdXQgZmFpbAorCQkqLworCQlpZiAoIXZkZWNfaGFzX21vcmVfaW5wdXQodmRlYykgJiYgKGh3X3RvX3ZkZWMoaHcpLT5uZXh0X3N0YXR1cyAhPQorCQkJVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEKSAmJiAoaHctPm5vX2RlY29kZXJfYnVmZmVyX2ZsYWcgPT0gMCkpIHsKKwkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9FT1M7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmICgodmRlY19zdHJlYW1fYmFzZWQodmRlYykpICYmCisJCQkoZXJyb3JfcHJvY19wb2xpY3kgJiAweDQwMDAwMCkgJiYKKwkJCWNoZWNrX2RpcnR5X2RhdGEodmRlYykpIHsKKwkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQlyZXR1cm47CisJCX0KKwkJaHctPm5vX2RlY29kZXJfYnVmZmVyX2ZsYWcgPSAwOworCQlody0+bmV4dF9hZ2Fpbl9mbGFnID0gMTsKKwl9IGVsc2UgaWYgKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfRU9TKSB7CisJCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gJmh3LT5kcGI7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJIiVzOiBlbmQgb2Ygc3RyZWFtXG4iLAorCQkJX19mdW5jX18pOworCQlhbXZkZWNfc3RvcCgpOworCQlpZiAoaHctPm1tdV9lbmFibGUpCisJCQlhbWhldmNfc3RvcCgpOworCQlody0+ZW9zID0gMTsKKwkJZmx1c2hfZHBiKHBfSDI2NF9EcGIpOworCQlub3RpZnlfdjRsX2Vvcyhod190b192ZGVjKGh3KSk7CisJCW11dGV4X2xvY2soJmh3LT5jaHVua3NfbXV0ZXgpOworCQl2ZGVjX3ZmcmFtZV9kaXJ0eShod190b192ZGVjKGh3KSwgaHctPmNodW5rKTsKKwkJaHctPmNodW5rID0gTlVMTDsKKwkJbXV0ZXhfdW5sb2NrKCZody0+Y2h1bmtzX211dGV4KTsKKwkJdmRlY19jbGVhbl9pbnB1dCh2ZGVjKTsKKwl9IGVsc2UgaWYgKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfRk9SQ0VfRVhJVCkgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCSIlczogZm9yY2UgZXhpdFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJYW12ZGVjX3N0b3AoKTsKKwkJaWYgKGh3LT5tbXVfZW5hYmxlKQorCQkJYW1oZXZjX3N0b3AoKTsKKwkJaWYgKGh3LT5zdGF0ICYgU1RBVF9JU1JfUkVHKSB7CisJCQl2ZGVjX2ZyZWVfaXJxKFZERUNfSVJRXzEsICh2b2lkICopaHcpOworCQkJaHctPnN0YXQgJj0gflNUQVRfSVNSX1JFRzsKKwkJfQorCX0KKworCWlmIChwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUpIHsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkiJXMsIHJlbGVhc2UgZGVjb2RlZCBwaWN0dXJlXG4iLCBfX2Z1bmNfXyk7CisJCXJlbGVhc2VfY3VyX2RlY29kaW5nX2J1Zihodyk7CisJfQorCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfTUFTSywgMCk7CisJZGVsX3RpbWVyX3N5bmMoJmh3LT5jaGVja190aW1lcik7CisJaHctPnN0YXQgJj0gflNUQVRfVElNRVJfQVJNOworI2lmZGVmIERFVEVDVF9XUk9OR19NVUxUSV9TTElDRQorCWlmIChody0+ZGVjX3Jlc3VsdCAhPSBERUNfUkVTVUxUX0FHQUlOKQorCQlody0+bGFzdF9waWN0dXJlX3NsaWNlX2NvdW50ID0gMDsKKyNlbmRpZgorCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfd29ya190aW1lX25hbWUsIFRSQUNFX1dPUktfV0FJVF9TRUFSQ0hfRE9ORV9TVEFSVCk7CisJd2FpdF92bWgyNjRfc2VhcmNoX2RvbmUoaHcpOworCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfd29ya190aW1lX25hbWUsIFRSQUNFX1dPUktfV0FJVF9TRUFSQ0hfRE9ORV9FTkQpOworCS8qIG1hcmsgaXRzZWxmIGhhcyBhbGwgSFcgcmVzb3VyY2UgcmVsZWFzZWQgYW5kIGlucHV0IHJlbGVhc2VkICovCisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCWlmIChody0+c3dpdGNoX2R2bGF5ZXJfZmxhZykgeworCQlpZiAodmRlYy0+c2xhdmUpCisJCQl2ZGVjX3NldF9uZXh0X3NjaGVkKHZkZWMsIHZkZWMtPnNsYXZlKTsKKwkJZWxzZSBpZiAodmRlYy0+bWFzdGVyKQorCQkJdmRlY19zZXRfbmV4dF9zY2hlZCh2ZGVjLCB2ZGVjLT5tYXN0ZXIpOworCX0gZWxzZSBpZiAodmRlYy0+c2xhdmUgfHwgdmRlYy0+bWFzdGVyKQorCQl2ZGVjX3NldF9uZXh0X3NjaGVkKHZkZWMsIHZkZWMpOworI2VuZGlmCisKKwlpZiAoZnJvbSA9PSAxKSB7CisJCS8qIFRoaXMgaXMgYSB0aW1lb3V0IHdvcmsgKi8KKwkJaWYgKHdvcmtfcGVuZGluZygmaHctPndvcmspKSB7CisJCQkvKgorCQkJICogVGhlIHZoMjY0X3dvcmsgYXJyaXZlcyBhdCB0aGUgbGFzdCBzZWNvbmQsCisJCQkgKiBnaXZlIGl0IGEgY2hhbmNlIHRvIGhhbmRsZSB0aGUgc2NlbmFyaW8uCisJCQkgKi8KKwkJCXJldHVybjsKKwkJfQorCX0KKwlpZiAoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9ET05FKSB7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX1dPUktFUl9FTkQpOworCX0KKworCS8qIG1hcmsgaXRzZWxmIGhhcyBhbGwgSFcgcmVzb3VyY2UgcmVsZWFzZWQgYW5kIGlucHV0IHJlbGVhc2VkICovCisJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCWlmIChody0+bW11X2VuYWJsZSA9PSAwKQorCQkJdmRlY19jb3JlX2ZpbmlzaF9ydW4odmRlYywgQ09SRV9NQVNLX1ZERUNfMSk7CisJCWVsc2UKKwkJCXZkZWNfY29yZV9maW5pc2hfcnVuKHZkZWMsIENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQyk7CisJfSBlbHNlCisJCXZkZWNfY29yZV9maW5pc2hfcnVuKHZkZWMsIENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQyk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmh3LT53YWl0X3EpOworCisJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisKKwkJaWYgKGN0eC0+cGFyYW1fc2V0c19mcm9tX3Vjb2RlICYmCisJCQkhaHctPnY0bF9wYXJhbXNfcGFyc2VkKQorCQkJdmRlY192NGxfd3JpdGVfZnJhbWVfc3luYyhjdHgpOworCX0KKworCWlmIChody0+dmRlY19jYikKKwkJaHctPnZkZWNfY2IoaHdfdG9fdmRlYyhodyksIGh3LT52ZGVjX2NiX2FyZyk7Cit9CisKKworc3RhdGljIHZvaWQgdmgyNjRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHZkZWNfaDI2NF9od19zICpodyA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MsIHdvcmspOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGh3KTsKKworCXZoMjY0X3dvcmtfaW1wbGVtZW50KGh3LCB2ZGVjLCAwKTsKK30KKworCitzdGF0aWMgdm9pZCB2aDI2NF90aW1lb3V0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcgPSBjb250YWluZXJfb2Yod29yaywKKwkJc3RydWN0IHZkZWNfaDI2NF9od19zLCB0aW1lb3V0X3dvcmspOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGh3KTsKKworCWlmICh3b3JrX3BlbmRpbmcoJmh3LT53b3JrKSkKKwkJcmV0dXJuOworCisJaHctPnRpbWVvdXRfcHJvY2Vzc2luZyA9IDE7CisJdmgyNjRfd29ya19pbXBsZW1lbnQoaHcsIHZkZWMsIDEpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBydW5fcmVhZHkoc3RydWN0IHZkZWNfcyAqdmRlYywgdW5zaWduZWQgbG9uZyBtYXNrKQoreworCWJvb2wgcmV0ID0gMDsKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0KKwkJKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJaW50IHR2cCA9IHZkZWNfc2VjdXJlKGh3X3RvX3ZkZWMoaHcpKSA/CisJCUNPREVDX01NX0ZMQUdTX1RWUCA6IDA7CisKKwlpZiAoaHctPnRpbWVvdXRfcHJvY2Vzc2luZyAmJgorCSAgICAod29ya19wZW5kaW5nKCZody0+d29yaykgfHwgd29ya19idXN5KCZody0+d29yaykgfHwKKwkgICAgd29ya19wZW5kaW5nKCZody0+dGltZW91dF93b3JrKSB8fCB3b3JrX2J1c3koJmh3LT50aW1lb3V0X3dvcmspKSkgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WREVDX0RFVEFJTCwKKwkJCSAgImgyNjQgd29yayBwZW5kaW5nLCBub3QgcmVhZHkgZm9yIHJ1bi5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaHctPnRpbWVvdXRfcHJvY2Vzc2luZyA9IDA7CisJaWYgKCFody0+Zmlyc3Rfc2NfY2hlY2tlZCAmJiBody0+bW11X2VuYWJsZSkgeworCQlpbnQgc2l6ZSA9IGRlY29kZXJfbW11X2JveF9zY19jaGVjayhody0+bW11X2JveCwgdHZwKTsKKwkJaHctPmZpcnN0X3NjX2NoZWNrZWQgPTE7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJInZtaDI2NCBjYWNoZWQ9JWQgIG5lZWRfc2l6ZT0lZCBzcGVlZD0gJWQgbXNcbiIsCisJCQlzaXplLCAoaHctPm5lZWRfY2FjaGVfc2l6ZSA+PiBQQUdFX1NISUZUKSwKKwkJCShpbnQpKGdldF9qaWZmaWVzXzY0KCkgLSBody0+c2Nfc3RhcnRfdGltZSkgKiAxMDAwL0haKTsKKwl9CisKKwlpZiAodmRlY19zdHJlYW1fYmFzZWQodmRlYykgJiYgKGh3LT5pbml0X2ZsYWcgPT0gMCkKKwkJJiYgcHJlX2RlY29kZV9idWZfbGV2ZWwgIT0gMCkgeworCQl1MzIgcnAsIHdwLCBsZXZlbDsKKworCQlycCA9IFNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF9ycCk7CisJCXdwID0gU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3dwKTsKKwkJaWYgKHdwIDwgcnApCisJCQlsZXZlbCA9IHZkZWMtPmlucHV0LnNpemUgKyB3cCAtIHJwOworCQllbHNlCisJCQlsZXZlbCA9IHdwIC0gcnA7CisKKwkJaWYgKGxldmVsIDwgcHJlX2RlY29kZV9idWZfbGV2ZWwpCisJCQlyZXR1cm4gMDsKKwl9CisKKyNpZm5kZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwlpZiAodmRlYy0+bWFzdGVyKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCWlmIChody0+ZW9zKQorCQlyZXR1cm4gMDsKKworCWlmIChody0+c3RhdCAmIERFQ09ERVJfRkFUQUxfRVJST1JfTk9fTUVNKQorCQlyZXR1cm4gMDsKKworCWlmIChkaXNwX3ZmcmFtZV92YWx2ZV9sZXZlbCAmJgorCQlrZmlmb19sZW4oJmh3LT5kaXNwbGF5X3EpID49CisJCWRpc3BfdmZyYW1lX3ZhbHZlX2xldmVsKSB7CisJCWh3LT52YWx2ZV9jb3VudC0tOworCQlpZiAoaHctPnZhbHZlX2NvdW50IDw9IDApCisJCQlody0+dmFsdmVfY291bnQgPSAyOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9CisJaWYgKGh3LT5uZXh0X2FnYWluX2ZsYWcgJiYKKwkJKCF2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpKSkgeworCQl1MzIgcGFyc2VyX3dyX3B0ciA9IFNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCk7CisJCWlmIChwYXJzZXJfd3JfcHRyID49IGh3LT5wcmVfcGFyc2VyX3dyX3B0ciAmJgorCQkJKHBhcnNlcl93cl9wdHIgLSBody0+cHJlX3BhcnNlcl93cl9wdHIpIDwKKwkJCWFnYWluX3RocmVzaG9sZCkgeworCQkJaW50IHIgPSB2ZGVjX3N5bmNfaW5wdXQodmRlYyk7CisJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsCisJCQkJCSIlcyBidWYgbGVsdmVsOiV4XG4iLCAgX19mdW5jX18sIHIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAoaDI2NF9kZWJ1Z19mbGFnICYgMHgyMDAwMDAwMCkgeworCQkvKiBwcl9pbmZvKCIlcywgYVxuIiwgX19mdW5jX18pOyAqLworCQlyZXQgPSAxOworCX0gZWxzZQorCQlyZXQgPSBpc19idWZmZXJfYXZhaWxhYmxlKHZkZWMpOworCisjaWZkZWYgQ09OU1RSQUlOX01BWF9CVUZfTlVNCisJaWYgKHJldCAmJiAoaHctPmRwYi5tRFBCLnNpemUgPiAwKSkgeyAvKm1ha2Ugc3VyZSBpbml0aWxpemVkKi8KKwkJaWYgKHJ1bl9yZWFkeV9tYXhfdmZfb25seV9udW0gPiAwICYmCisJCQlnZXRfdmZfcmVmX29ubHlfYnVmX2NvdW50KGh3KSA+PQorCQkJcnVuX3JlYWR5X21heF92Zl9vbmx5X251bQorCQkJKQorCQkJcmV0ID0gMDsKKwkJaWYgKHJ1bl9yZWFkeV9kaXNwbGF5X3FfbnVtID4gMCAmJgorCQkJa2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKSA+PQorCQkJcnVuX3JlYWR5X2Rpc3BsYXlfcV9udW0pCisJCQlyZXQgPSAwOworCQkvKmF2b2lkIG1vcmUgYnVmZmVycyBjb25zdW1lZCB3aGVuCisJCXN3aXRjaGluZyByZXNvbHV0aW9uKi8KKwkJaWYgKHJ1bl9yZWFkeV9tYXhfYnVmX251bSA9PSAweGZmICYmCisJCQlnZXRfdXNlZF9idWZfY291bnQoaHcpID4KKwkJCWh3LT5kcGIubURQQi5zaXplKQorCQkJcmV0ID0gMDsKKwkJZWxzZSBpZiAocnVuX3JlYWR5X21heF9idWZfbnVtICYmCisJCQlnZXRfdXNlZF9idWZfY291bnQoaHcpID49CisJCQlydW5fcmVhZHlfbWF4X2J1Zl9udW0pCisJCQlyZXQgPSAwOworCQlpZiAocmV0ID09IDApCisJCQlidWZtZ3JfaDI2NF9yZW1vdmVfdW51c2VkX2ZyYW1lKCZody0+ZHBiLCAwKTsKKwl9CisjZW5kaWYKKwlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KTsKKworCQlpZiAoY3R4LT5wYXJhbV9zZXRzX2Zyb21fdWNvZGUpIHsKKwkJCWlmIChody0+djRsX3BhcmFtc19wYXJzZWQpIHsKKwkJCQlpZiAoY3R4LT5jYXBfcG9vbC5kZWMgPCBody0+ZHBiLm1EUEIuc2l6ZSkgeworCQkJCQlpZiAoaXNfYnVmZmVyX2F2YWlsYWJsZSh2ZGVjKSkKKwkJCQkJCXJldCA9IDE7CisJCQkJCWVsc2UKKwkJCQkJCXJldCA9IDA7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoY3R4LT52NGxfcmVzb2x1dGlvbl9jaGFuZ2UpCisJCQkJCXJldCA9IDA7CisJCQl9CisJCX0gZWxzZSBpZiAoIWN0eC0+djRsX2NvZGVjX2RwYl9yZWFkeSkgeworCQkJaWYgKHY0bDJfbTJtX251bV9kc3RfYnVmc19yZWFkeShjdHgtPm0ybV9jdHgpIDwKKwkJCQlydW5fcmVhZHlfbWluX2J1Zl9udW0pCisJCQkJcmV0ID0gMDsKKwkJfQorCX0KKworCWlmIChyZXQpCisJCW5vdF9ydW5fcmVhZHlbREVDT0RFX0lEKGh3KV0gPSAwOworCWVsc2UKKwkJbm90X3J1bl9yZWFkeVtERUNPREVfSUQoaHcpXSsrOworCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQlpZiAoaHctPm1tdV9lbmFibGUgPT0gMCkKKwkJCXJldHVybiByZXQgPyAoQ09SRV9NQVNLX1ZERUNfMSkgOiAwOworCQllbHNlCisJCQlyZXR1cm4gcmV0ID8gKENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQykgOiAwOworCX0gZWxzZQorCQlyZXR1cm4gcmV0ID8gKENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQykgOiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBnZXRfZGF0YV9jaGVja19zdW0KKwkoc3RydWN0IHZkZWNfaDI2NF9od19zICpodywgaW50IHNpemUpCit7CisJaW50IGpqOworCWludCBzdW0gPSAwOworCXU4ICpkYXRhID0gTlVMTDsKKworCWlmICghaHctPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQlkYXRhID0gY29kZWNfbW1fdm1hcChody0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQlody0+Y2h1bmstPm9mZnNldCwgc2l6ZSk7CisJZWxzZQorCQlkYXRhID0gKCh1OCAqKWh3LT5jaHVuay0+YmxvY2stPnN0YXJ0X3ZpcnQpCisJCQkrIGh3LT5jaHVuay0+b2Zmc2V0OworCisJZm9yIChqaiA9IDA7IGpqIDwgc2l6ZTsgamorKykKKwkJc3VtICs9IGRhdGFbampdOworCisJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIoZGF0YSk7CisJcmV0dXJuIHN1bTsKK30KKworc3RhdGljIHZvaWQgcnVuKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHVuc2lnbmVkIGxvbmcgbWFzaywKKwl2b2lkICgqY2FsbGJhY2spKHN0cnVjdCB2ZGVjX3MgKiwgdm9pZCAqKSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcgPQorCQkoc3RydWN0IHZkZWNfaDI2NF9od19zICopdmRlYy0+cHJpdmF0ZTsKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9ICZody0+ZHBiOworCWludCBzaXplLCByZXQgPSAtMTsKKwlpZiAoIWh3LT52ZGVjX3BnX2VuYWJsZV9mbGFnKSB7CisJCWh3LT52ZGVjX3BnX2VuYWJsZV9mbGFnID0gMTsKKwkJYW12ZGVjX2VuYWJsZSgpOworCQlpZiAoaHctPm1tdV9lbmFibGUpCisJCQlhbWhldmNfZW5hYmxlKCk7CisJfQorCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX1JVTl9TVEFSVCk7CisKKwlydW5fY291bnRbREVDT0RFX0lEKGh3KV0rKzsKKwl2ZGVjX3Jlc2V0X2NvcmUodmRlYyk7CisJaWYgKGh3LT5tbXVfZW5hYmxlKQorCQloZXZjX3Jlc2V0X2NvcmUodmRlYyk7CisJaHctPnZkZWNfY2JfYXJnID0gYXJnOworCWh3LT52ZGVjX2NiID0gY2FsbGJhY2s7CisKKyNpZmRlZiBERVRFQ1RfV1JPTkdfTVVMVElfU0xJQ0UKKwlody0+Y3VyX3BpY3R1cmVfc2xpY2VfY291bnQgPSAwOworI2VuZGlmCisKKwlpZiAoa2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKSA+IFZGX1BPT0xfU0laRSkgeworCQlody0+cmVzZXRfYnVmbWdyX2ZsYWcgPSAxOworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSJrZmlmbyBsZW46JWQgaW52YWlsZCwgbmVlZCBidWZtZ3IgcmVzZXRcbiIsCisJCQlrZmlmb19sZW4oJmh3LT5kaXNwbGF5X3EpKTsKKwl9CisKKwlpZiAodmRlY19zdHJlYW1fYmFzZWQodmRlYykpIHsKKwkJaHctPnByZV9wYXJzZXJfd3JfcHRyID0KKwkJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCk7CisJCWh3LT5uZXh0X2FnYWluX2ZsYWcgPSAwOworCX0KKworCWlmIChody0+cmVzZXRfYnVmbWdyX2ZsYWcgfHwKKwkJKChlcnJvcl9wcm9jX3BvbGljeSAmIDB4NDApICYmCisJCXBfSDI2NF9EcGItPmJ1Zl9hbGxvY19mYWlsKSkgeworCQloMjY0X3Jlc2V0X2J1Zm1ncih2ZGVjKTsKKwkJLy9mbGFnIG11c3QgY2xlYXIgYWZ0ZXIgcmVzZXQgZm9yIHY0bCBidWZfc3BlY19pbml0IHVzZQorCQlody0+cmVzZXRfYnVmbWdyX2ZsYWcgPSAwOworCX0KKworCWlmIChoMjY0X2RlYnVnX2NtZCAmIDB4ZjAwMCkgeworCQlpZiAoKChoMjY0X2RlYnVnX2NtZCA+PiAxMikgJiAweGYpCisJCQk9PSAoREVDT0RFX0lEKGh3KSArIDEpKSB7CisJCQloMjY0X3JlY29uZmlnKGh3KTsKKwkJCWgyNjRfZGVidWdfY21kICY9ICh+MHhmMDAwKTsKKwkJfQorCX0KKwkvKiBody0+Y2h1bmsgPSB2ZGVjX3ByZXBhcmVfaW5wdXQodmRlYyk7ICovCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwlpZiAodmRlYy0+c2xhdmUgfHwgdmRlYy0+bWFzdGVyKQorCQl2ZGVjX3NldF9mbGFnKHZkZWMsIFZERUNfRkxBR19TRUxGX0lOUFVUX0NPTlRFWFQpOworI2VuZGlmCisJc2l6ZSA9IHZkZWNfcHJlcGFyZV9pbnB1dCh2ZGVjLCAmaHctPmNodW5rKTsKKwlpZiAoKHNpemUgPCAwKSB8fAorCQkoaW5wdXRfZnJhbWVfYmFzZWQodmRlYykgJiYgaHctPmNodW5rID09IE5VTEwpKSB7CisJCWlucHV0X2VtcHR5W0RFQ09ERV9JRChodyldKys7CisJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WREVDX0RFVEFJTCwKKwkJCSJ2ZGVjX3ByZXBhcmVfaW5wdXQ6IEluc3VmZmljaWVudCBkYXRhXG4iKTsKKworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJcmV0dXJuOworCX0KKwlpbnB1dF9lbXB0eVtERUNPREVfSUQoaHcpXSA9IDA7CisKKwlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfTk9ORTsKKwlody0+Z2V0X2RhdGFfY291bnQgPSAwOworCWh3LT5jc2RfY2hhbmdlX2ZsYWcgPSAwOworI2lmIDAKKwlwcl9pbmZvKCJWTERfTUVNX1ZJRklGT19MRVZFTCA9IDB4JXgsIHJwID0gMHgleCwgd3AgPSAweCV4XG4iLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApKTsKKyNlbmRpZgorCisJaWYgKGlucHV0X2ZyYW1lX2Jhc2VkKHZkZWMpICYmICF2ZGVjX3NlY3VyZSh2ZGVjKSkgeworCQl1OCAqZGF0YSA9IE5VTEw7CisKKwkJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQlkYXRhID0gY29kZWNfbW1fdm1hcChody0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQkJaHctPmNodW5rLT5vZmZzZXQsIHNpemUpOworCQllbHNlCisJCQlkYXRhID0gKCh1OCAqKWh3LT5jaHVuay0+YmxvY2stPnN0YXJ0X3ZpcnQpCisJCQkJKyBody0+Y2h1bmstPm9mZnNldDsKKworCQlpZiAoZHBiX2lzX2RlYnVnKERFQ09ERV9JRChodyksCisJCQlQUklOVF9GTEFHX1ZERUNfU1RBVFVTKQorCQkJKSB7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSIlczogc2l6ZSAweCV4IHN1bSAweCV4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IC4uICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQlfX2Z1bmNfXywgc2l6ZSwgZ2V0X2RhdGFfY2hlY2tfc3VtKGh3LCBzaXplKSwKKwkJCWRhdGFbMF0sIGRhdGFbMV0sIGRhdGFbMl0sIGRhdGFbM10sCisJCQlkYXRhWzRdLCBkYXRhWzVdLCBkYXRhW3NpemUgLSA0XSwKKwkJCWRhdGFbc2l6ZSAtIDNdLAlkYXRhW3NpemUgLSAyXSwKKwkJCWRhdGFbc2l6ZSAtIDFdKTsKKwkJfQorCQlpZiAoZHBiX2lzX2RlYnVnKERFQ09ERV9JRChodyksCisJCQlQUklOVF9GUkFNRUJBU0VfREFUQSkKKwkJCSkgeworCQkJaW50IGpqOworCisJCQlmb3IgKGpqID0gMDsgamogPCBzaXplOyBqaisrKSB7CisJCQkJaWYgKChqaiAmIDB4ZikgPT0gMCkKKwkJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJCVBSSU5UX0ZSQU1FQkFTRV9EQVRBLAorCQkJCQkJIiUwNng6IiwgamopOworCQkJCWRwYl9wcmludF9jb250KERFQ09ERV9JRChodyksCisJCQkJUFJJTlRfRlJBTUVCQVNFX0RBVEEsCisJCQkJCSIlMDJ4ICIsIGRhdGFbampdKTsKKwkJCQlpZiAoKChqaiArIDEpICYgMHhmKSA9PSAwKQorCQkJCQlkcGJfcHJpbnRfY29udChERUNPREVfSUQoaHcpLAorCQkJCQlQUklOVF9GUkFNRUJBU0VfREFUQSwKKwkJCQkJCSJcbiIpOworCQkJfQorCQl9CisKKwkJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQljb2RlY19tbV91bm1hcF9waHlhZGRyKGRhdGEpOworCX0gZWxzZQorCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCSIlczogJXggJXggJXggJXggJXggc2l6ZSAweCV4XG4iLAorCQkJX19mdW5jX18sCisJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1dQKSwKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCksCisJCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfcnApLAorCQkJU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3dwKSwKKwkJCXNpemUpOworCisJc3RhcnRfcHJvY2Vzc190aW1lKGh3KTsKKwlpZiAodmRlYy0+bWNfbG9hZGVkKSB7CisJCQkvKmZpcm13YXJlIGhhdmUgbG9hZCBiZWZvcmUsCisJCQkgIGFuZCBub3QgY2hhbmdlcyB0byBhbm90aGVyLgorCQkJICBpZ25vcmUgcmVsb2FkLgorCQkJKi8KKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0csIGh3LT5yZWdfZ19zdGF0dXMpOworCX0gZWxzZSB7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfcnVuX3RpbWVfbmFtZSwgVFJBQ0VfUlVOX0xPQURJTkdfRldfU1RBUlQpOworCQlyZXQgPSBhbXZkZWNfdmRlY19sb2FkbWNfZXgoVkZPUk1BVF9IMjY0LCAibWgyNjQiLCB2ZGVjLCBody0+ZnctPmRhdGEpOworCQlpZiAocmV0IDwgMCkgeworCQkJYW12ZGVjX2VuYWJsZV9mbGFnID0gZmFsc2U7CisJCQlhbXZkZWNfZGlzYWJsZSgpOworCQkJaHctPnZkZWNfcGdfZW5hYmxlX2ZsYWcgPSAwOworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRVJST1IsCisJCQkJIk1IMjY0IHRoZSAlcyBmdyBsb2FkaW5nIGZhaWxlZCwgZXJyOiAleFxuIiwKKwkJCQl0ZWVfZW5hYmxlZCgpID8gIlRFRSIgOiAibG9jYWwiLCByZXQpOworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0ZPUkNFX0VYSVQ7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCXJldHVybjsKKwkJfQorCQl2ZGVjLT5tY190eXBlICA9IFZGT1JNQVRfSDI2NDsKKwkJaHctPnJlZ19nX3N0YXR1cyA9IFJFQURfVlJFRyhBVl9TQ1JBVENIX0cpOworCQlpZiAoaHctPm1tdV9lbmFibGUpIHsKKwkJCXJldCA9IGFtaGV2Y19sb2FkbWNfZXgoVkZPUk1BVF9IMjY0LCAibWgyNjRfbW11IiwKKwkJCQlody0+ZndfbW11LT5kYXRhKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJYW12ZGVjX2VuYWJsZV9mbGFnID0gZmFsc2U7CisJCQkJYW1oZXZjX2Rpc2FibGUoKTsKKwkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19FUlJPUiwKKwkJCQkJIk1IMjY0X01NVSB0aGUgJXMgZncgbG9hZGluZyBmYWlsZWQsIGVycjogJXhcbiIsCisJCQkJCXRlZV9lbmFibGVkKCkgPyAiVEVFIiA6ICJsb2NhbCIsIHJldCk7CisJCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0ZPUkNFX0VYSVQ7CisJCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJdmRlYy0+bWNfdHlwZSA9ICgoMSA8PCAxNikgfCBWRk9STUFUX0gyNjQpOworCQl9CisJCXZkZWMtPm1jX2xvYWRlZCA9IDA7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfcnVuX3RpbWVfbmFtZSwgVFJBQ0VfUlVOX0xPQURJTkdfRldfRU5EKTsKKwl9CisJdm1oMjY0X3Jlc2V0X3Vkcl9tZ3IoaHcpOworCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfcnVuX3RpbWVfbmFtZSwgVFJBQ0VfUlVOX0xPQURJTkdfUkVTVE9SRV9TVEFSVCk7CisJaWYgKHZoMjY0X2h3X2N0eF9yZXN0b3JlKGh3KSA8IDApIHsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCXJldHVybjsKKwl9CisJaWYgKGVycm9yX3Byb2NfcG9saWN5ICYgMHgxMDAwMCkgeworCQlody0+Zmlyc3RfcHJlX2ZyYW1lX251bSA9IHBfSDI2NF9EcGItPm1WaWRlby5wcmVfZnJhbWVfbnVtOworCX0KKwlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX3J1bl90aW1lX25hbWUsIFRSQUNFX1JVTl9MT0FESU5HX1JFU1RPUkVfRU5EKTsKKwlpZiAoaW5wdXRfZnJhbWVfYmFzZWQodmRlYykpIHsKKwkJaW50IGRlY29kZV9zaXplID0gMDsKKworCQlkZWNvZGVfc2l6ZSA9IGh3LT5jaHVuay0+c2l6ZSArCisJCQkoaHctPmNodW5rLT5vZmZzZXQgJiAoVkRFQ19GSUZPX0FMSUdOIC0gMSkpOworCQlXUklURV9WUkVHKEgyNjRfREVDT0RFX0lORk8sICgxPDwxMykpOworCQlXUklURV9WUkVHKEgyNjRfREVDT0RFX1NJWkUsIGRlY29kZV9zaXplKTsKKwkJV1JJVEVfVlJFRyhWSUZGX0JJVF9DTlQsIGRlY29kZV9zaXplICogOCk7CisJCWlmICh2ZGVjLT5tdmZybSkKKwkJCXZkZWMtPm12ZnJtLT5mcmFtZV9zaXplID0gaHctPmNodW5rLT5zaXplOworCX0gZWxzZSB7CisJCWlmIChzaXplIDw9IDApCisJCQlzaXplID0gMHg3ZmZmZmZmZjsgLyplcnJvciBoYXBwZW4qLworCQlXUklURV9WUkVHKEgyNjRfREVDT0RFX0lORk8sICgxPDwxMykpOworCQlXUklURV9WUkVHKEgyNjRfREVDT0RFX1NJWkUsIHNpemUpOworCQlXUklURV9WUkVHKFZJRkZfQklUX0NOVCwgc2l6ZSAqIDgpOworCQlody0+c3RhcnRfYml0X2NudCA9IHNpemUgKiA4OworCX0KKwljb25maWdfYXV4X2J1Zihodyk7CisJY29uZmlnX2RlY29kZV9tb2RlKGh3KTsKKwl2ZGVjX2VuYWJsZV9pbnB1dCh2ZGVjKTsKKwlXUklURV9WUkVHKE5BTF9TRUFSQ0hfQ1RMLCAwKTsKKwlody0+c2VpX2RhdGFfbGVuID0gMDsKKwlpZiAoZW5hYmxlX2l0dV90MzUpCisJCVdSSVRFX1ZSRUcoTkFMX1NFQVJDSF9DVEwsIFJFQURfVlJFRyhOQUxfU0VBUkNIX0NUTCkgfCAweDEpOworCWlmICghaHctPmluaXRfZmxhZykgeworCQlpZiAoaHctPm1tdV9lbmFibGUpCisJCQlXUklURV9WUkVHKE5BTF9TRUFSQ0hfQ1RMLAorCQkJCQlSRUFEX1ZSRUcoTkFMX1NFQVJDSF9DVEwpIHwgMHgyKTsKKwkJZWxzZQorCQkJV1JJVEVfVlJFRyhOQUxfU0VBUkNIX0NUTCwKKwkJCQkJUkVBRF9WUkVHKE5BTF9TRUFSQ0hfQ1RMKSAmICh+MHgyKSk7CisJfQorCVdSSVRFX1ZSRUcoTkFMX1NFQVJDSF9DVEwsIFJFQURfVlJFRyhOQUxfU0VBUkNIX0NUTCkgfCAoMSA8PCAyKSB8IChody0+Yml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcgPDwgMTUpKTsKKworCWlmICh1ZGVidWdfZmxhZykKKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0ssIHVkZWJ1Z19mbGFnKTsKKwlody0+c3RhdCB8PSBTVEFUX1RJTUVSX0FSTTsKKwltb2RfdGltZXIoJmh3LT5jaGVja190aW1lciwgamlmZmllcyArIENIRUNLX0lOVEVSVkFMKTsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpIHsKKworCQlpZiAoaHctPm1tdV9lbmFibGUpCisJCQlTRVRfVlJFR19NQVNLKFZERUNfQVNTSVNUX01NQ19DVFJMMSwgMSA8PCAzKTsKKwkJZWxzZQorCQkJQ0xFQVJfVlJFR19NQVNLKFZERUNfQVNTSVNUX01NQ19DVFJMMSwgMSA8PCAzKTsKKwl9CisJaWYgKHZkZWMtPm12ZnJtKQorCQl2ZGVjLT5tdmZybS0+aHdfZGVjb2RlX3N0YXJ0ID0gbG9jYWxfY2xvY2soKTsKKwlhbXZkZWNfc3RhcnQoKTsKKwlpZiAoaHctPm1tdV9lbmFibGUgLyomJiAhaHctPmZyYW1lX2J1c3kgJiYgIWh3LT5mcmFtZV9kb25lKi8pIHsKKwkJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9TQ1JBVENIXzAsIDB4MCk7CisJCWFtaGV2Y19zdGFydCgpOworCQlpZiAoaHctPmNvbmZpZ19idWZtZ3JfZG9uZSkgeworCQkJaGV2Y19tY3Jfc2FvX2dsb2JhbF9od19pbml0KGh3LAorCQkJCQkoaHctPm1iX3dpZHRoIDw8IDQpLCAoaHctPm1iX2hlaWdodCA8PCA0KSk7CisJCQloZXZjX21jcl9jb25maWdfY2FudjJheGl0YmwoaHcsIDEpOworCQl9CisJfQorCisJLyogaWYgKGh3LT5pbml0X2ZsYWcpIHsgKi8KKwkJV1JJVEVfVlJFRyhEUEJfU1RBVFVTX1JFRywgSDI2NF9BQ1RJT05fU0VBUkNIX0hFQUQpOworCS8qIH0gKi8KKworCWh3LT5pbml0X2ZsYWcgPSAxOworCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX1JVTl9FTkQpOworfQorCitzdGF0aWMgdm9pZCBjbGVhcl9yZWZlcl9idWZzKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcpCit7CisJaW50IGk7CisJdWxvbmcgZmxhZ3M7CisKKwlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZody0+YnVmc3BlY19sb2NrLCBmbGFncyk7CisJCWZvciAoaSA9IDA7IGkgPCBCVUZTUEVDX1BPT0xfU0laRTsgaSsrKSB7CisJCQlody0+YnVmZmVyX3NwZWNbaV0udXNlZCA9IC0xOworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNtYV9hbGxvY19hZGRyID0gMDsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS5idWZfYWRyID0gMDsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+YnVmc3BlY19sb2NrLCBmbGFncyk7CisJfQorCisJSU5JVF9LRklGTyhody0+ZGlzcGxheV9xKTsKKwlJTklUX0tGSUZPKGh3LT5uZXdmcmFtZV9xKTsKKworCWZvciAoaSA9IDA7IGkgPCBWRl9QT09MX1NJWkU7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKnZmID0gJihody0+dmZwb29sW2h3LT5jdXJfcG9vbF1baV0pOworCQlody0+dmZwb29sW2h3LT5jdXJfcG9vbF1baV0uaW5kZXggPSAtMTsgLyogVkZfQlVGX05VTTsgKi8KKwkJaHctPnZmcG9vbFtody0+Y3VyX3Bvb2xdW2ldLmJ1ZldpZHRoID0gMTkyMDsKKwkJa2ZpZm9fcHV0KCZody0+bmV3ZnJhbWVfcSwgdmYpOworCX0KK30KKworc3RhdGljIHZvaWQgcmVzZXQoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0KKwkJKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisKKwlwcl9pbmZvKCJ2bWgyNjQgcmVzZXRcbiIpOworCisJY2FuY2VsX3dvcmtfc3luYygmaHctPndvcmspOworCWNhbmNlbF93b3JrX3N5bmMoJmh3LT5ub3RpZnlfd29yayk7CisJaWYgKGh3LT5zdGF0ICYgU1RBVF9WREVDX1JVTikgeworCQlhbXZkZWNfc3RvcCgpOworCQlpZiAoaHctPm1tdV9lbmFibGUpCisJCQlhbWhldmNfc3RvcCgpOworCQlody0+c3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwl9CisKKwlpZiAoaHctPnN0YXQgJiBTVEFUX1RJTUVSX0FSTSkgeworCQlkZWxfdGltZXJfc3luYygmaHctPmNoZWNrX3RpbWVyKTsKKwkJaHctPnN0YXQgJj0gflNUQVRfVElNRVJfQVJNOworCX0KKwlody0+ZW9zID0gMDsKKwlody0+ZGVjb2RlX3BpY19jb3VudCA9IDA7CisKKwlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCWgyNjRfcmVzZXRfYnVmbWdyKHZkZWMpOworCWNsZWFyX3JlZmVyX2J1ZnMoaHcpOworCisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsICIlc1xuIiwgX19mdW5jX18pOworfQorCitzdGF0aWMgdm9pZCBoMjY0X3JlY29uZmlnKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9ICZody0+ZHBiOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGh3KTsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkiJXNcbiIsIF9fZnVuY19fKTsKKwkvKiBhZnRlciBjYWxsaW5nIGZsdXNoX2RwYigpIGFuZCBidWZtZ3JfaDI2NF9yZW1vdmVfdW51c2VkX2ZyYW1lKCksCisJCWFsbCBidWZmZXJzIGFyZSBpbiBkaXNwbGF5IHF1ZXVlICh1c2VkID09IDIpLAorCQkJb3IgZnJlZSAodXNlZCA9PSAwKQorCSovCisJaWYgKGRwYl9pc19kZWJ1ZyhERUNPREVfSUQoaHcpLAorCQlQUklOVF9GTEFHX0RVTVBfQlVGU1BFQykpCisJCWR1bXBfYnVmc3BlYyhodywgInByZSBoMjY0X3JlY29uZmlnIik7CisKKwlmbHVzaF9kcGIocF9IMjY0X0RwYik7CisJYnVmbWdyX2gyNjRfcmVtb3ZlX3VudXNlZF9mcmFtZShwX0gyNjRfRHBiLCAwKTsKKworCWlmIChody0+Y29sbG9jYXRlX2NtYV9hbGxvY19hZGRyKSB7CisJCWRlY29kZXJfYm1tdV9ib3hfZnJlZV9pZHgoCisJCQlody0+Ym1tdV9ib3gsCisJCQlCTU1VX1JFRl9JRFgpOworCQlody0+Y29sbG9jYXRlX2NtYV9hbGxvY19hZGRyID0gMDsKKwkJaHctPmRwYi5jb2xvY2F0ZWRfbXZfYWRkcl9zdGFydCA9IDA7CisJCWh3LT5kcGIuY29sb2NhdGVkX212X2FkZHJfZW5kID0gMDsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5idWZzcGVjX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgQlVGU1BFQ19QT09MX1NJWkU7IGkrKykgeworCQlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJCXZkZWMtPmZyZWVfY2FudmFzX2V4KGh3LT5idWZmZXJfc3BlY1tpXS55X2NhbnZhc19pbmRleCwgdmRlYy0+aWQpOworCQkJdmRlYy0+ZnJlZV9jYW52YXNfZXgoaHctPmJ1ZmZlcl9zcGVjW2ldLnVfY2FudmFzX2luZGV4LCB2ZGVjLT5pZCk7CisJCQl2ZGVjLT5mcmVlX2NhbnZhc19leChody0+YnVmZmVyX3NwZWNbaV0udl9jYW52YXNfaW5kZXgsIHZkZWMtPmlkKTsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS55X2NhbnZhc19pbmRleCA9IC0xOworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnVfY2FudmFzX2luZGV4ID0gLTE7CisJCQlody0+YnVmZmVyX3NwZWNbaV0udl9jYW52YXNfaW5kZXggPSAtMTsKKyNpZmRlZiBWREVDX0RXCisJCQlpZiAoSVNfVkRFQ19EVyhodykpIHsKKwkJCQl2ZGVjLT5mcmVlX2NhbnZhc19leChody0+YnVmZmVyX3NwZWNbaV0udmRlY19kd195X2NhbnZhc19pbmRleCwgdmRlYy0+aWQpOworCQkJCXZkZWMtPmZyZWVfY2FudmFzX2V4KGh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X3VfY2FudmFzX2luZGV4LCB2ZGVjLT5pZCk7CisJCQkJdmRlYy0+ZnJlZV9jYW52YXNfZXgoaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfdl9jYW52YXNfaW5kZXgsIHZkZWMtPmlkKTsKKwkJCQlody0+YnVmZmVyX3NwZWNbaV0udmRlY19kd195X2NhbnZhc19pbmRleCA9IC0xOworCQkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X3VfY2FudmFzX2luZGV4ID0gLTE7CisJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfdl9jYW52YXNfaW5kZXggPSAtMTsKKyNlbmRpZgorCQkJfQorCQl9CisJCS8qbWFrZSBzdXJlIGJ1ZmZlcnMgbm90IHB1dCBiYWNrIHRvIGJ1Zm1nciB3aGVuCisJCQl2Zl9wdXQgaXMgY2FsbGVkKi8KKwkJaWYgKGh3LT5idWZmZXJfc3BlY1tpXS51c2VkID09IDIpCisJCQlody0+YnVmZmVyX3NwZWNbaV0udXNlZCA9IDM7CisKKwkJLyogcmVhZHkgdG8gcmVsZWFzZSAiZnJlZSBidWZmZXJzIgorCQkqLworCQlpZiAoaHctPmJ1ZmZlcl9zcGVjW2ldLnVzZWQgPT0gMCkKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS51c2VkID0gNDsKKworCQlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX3BvcyA9IC0xOworCisJCWlmIChody0+YnVmZmVyX3NwZWNbaV0udXNlZCA9PSA0ICYmCisJCQlody0+YnVmZmVyX3NwZWNbaV0udmZfcmVmICE9IDAgJiYKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS5jbWFfYWxsb2NfYWRkcikgeworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnVzZWQgPSAzOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5idWZzcGVjX2xvY2ssIGZsYWdzKTsKKwlody0+aGFzX2lfZnJhbWUgPSAwOworCWh3LT5jb25maWdfYnVmbWdyX2RvbmUgPSAwOworCisJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQltdXRleF9sb2NrKCZ2bWgyNjRfbXV0ZXgpOworCQlkZWFsbG9jX2J1Zl9zcGVjcyhodywgMSk7CisJCW11dGV4X3VubG9jaygmdm1oMjY0X211dGV4KTsKKwl9CisKKwlpZiAoZHBiX2lzX2RlYnVnKERFQ09ERV9JRChodyksCisJCVBSSU5UX0ZMQUdfRFVNUF9CVUZTUEVDKSkKKwkJZHVtcF9idWZzcGVjKGh3LCAiYWZ0ZXIgaDI2NF9yZWNvbmZpZyIpOworfQorCisjaWZkZWYgRVJST1JfSEFORExFX1RFU1QKK3N0YXRpYyB2b2lkIGgyNjRfY2xlYXJfZHBiKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcpCit7CisJaW50IGk7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSAmaHctPmRwYjsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJIiVzXG4iLCBfX2Z1bmNfXyk7CisJcmVtb3ZlX2RwYl9waWN0dXJlcyhwX0gyNjRfRHBiKTsKKwlmb3IgKGkgPSAwOyBpIDwgQlVGU1BFQ19QT09MX1NJWkU7IGkrKykgeworCQkvKm1ha2Ugc3VyZSBidWZmZXJzIG5vdCBwdXQgYmFjayB0byBidWZtZ3Igd2hlbgorCQkJdmZfcHV0IGlzIGNhbGxlZCovCisJCWlmIChody0+YnVmZmVyX3NwZWNbaV0udXNlZCA9PSAyKQorCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnVzZWQgPSA1OworCX0KKworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGgyNjRfcmVzZXRfYnVmbWdyKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJdWxvbmcgdGltZW91dDsKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSAmaHctPmRwYjsKKyNpZiAwCisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSAmaHctPmRwYjsKKwlpbnQgYWN0dWFsX2RwYl9zaXplLCBtYXhfcmVmZXJlbmNlX3NpemU7CisJaW50IHJlb3JkZXJfcGljX251bTsKKwl1bnNpZ25lZCBpbnQgY29sb2NhdGVkX2J1Zl9zaXplOworCXVuc2lnbmVkIGludCBjb2xvY2F0ZWRfbXZfYWRkcl9zdGFydDsKKwl1bnNpZ25lZCBpbnQgY29sb2NhdGVkX212X2FkZHJfZW5kOworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCSIlc1xuIiwgX19mdW5jX18pOworCisJZm9yIChpID0gMDsgaSA8IFZGX1BPT0xfU0laRTsgaSsrKQorCQlody0+dmZwb29sW2h3LT5jdXJfcG9vbF1baV0uaW5kZXggPSAtMTsgLyogVkZfQlVGX05VTTsgKi8KKworCWFjdHVhbF9kcGJfc2l6ZSA9IHBfSDI2NF9EcGItPm1EUEIuc2l6ZTsKKwltYXhfcmVmZXJlbmNlX3NpemUgPSBwX0gyNjRfRHBiLT5tYXhfcmVmZXJlbmNlX3NpemU7CisJcmVvcmRlcl9waWNfbnVtID0gcF9IMjY0X0RwYi0+cmVvcmRlcl9waWNfbnVtOworCisJY29sb2NhdGVkX2J1Zl9zaXplID0gcF9IMjY0X0RwYi0+Y29sb2NhdGVkX2J1Zl9zaXplOworCWNvbG9jYXRlZF9tdl9hZGRyX3N0YXJ0ID0gcF9IMjY0X0RwYi0+Y29sb2NhdGVkX212X2FkZHJfc3RhcnQ7CisJY29sb2NhdGVkX212X2FkZHJfZW5kICA9IHBfSDI2NF9EcGItPmNvbG9jYXRlZF9tdl9hZGRyX2VuZDsKKworCWh3LT5jdXJfcG9vbCsrOworCWlmIChody0+Y3VyX3Bvb2wgPj0gVkZfUE9PTF9OVU0pCisJCWh3LT5jdXJfcG9vbCA9IDA7CisKKwlJTklUX0tGSUZPKGh3LT5kaXNwbGF5X3EpOworCUlOSVRfS0ZJRk8oaHctPm5ld2ZyYW1lX3EpOworCisJZm9yIChpID0gMDsgaSA8IFZGX1BPT0xfU0laRTsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqdmYgPSAmKGh3LT52ZnBvb2xbaHctPmN1cl9wb29sXVtpXSk7CisJCWh3LT52ZnBvb2xbaHctPmN1cl9wb29sXVtpXS5pbmRleCA9IC0xOyAvKiBWRl9CVUZfTlVNOyAqLworCQlody0+dmZwb29sW2h3LT5jdXJfcG9vbF1baV0uYnVmV2lkdGggPSAxOTIwOworCQlrZmlmb19wdXQoJmh3LT5uZXdmcmFtZV9xLCB2Zik7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEJVRlNQRUNfUE9PTF9TSVpFOyBpKyspCisJCWh3LT5idWZmZXJfc3BlY1tpXS51c2VkID0gMDsKKworCWRwYl9pbml0X2dsb2JhbCgmaHctPmRwYiwKKwkJREVDT0RFX0lEKGh3KSwgMCwgMCk7CisJcF9IMjY0X0RwYi0+bURQQi5zaXplID0gYWN0dWFsX2RwYl9zaXplOworCXBfSDI2NF9EcGItPm1heF9yZWZlcmVuY2Vfc2l6ZSA9IG1heF9yZWZlcmVuY2Vfc2l6ZTsKKwlwX0gyNjRfRHBiLT5yZW9yZGVyX3BpY19udW0gPSByZW9yZGVyX3BpY19udW07CisKKwlwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX3NpemUgPSBjb2xvY2F0ZWRfYnVmX3NpemU7CisJcF9IMjY0X0RwYi0+Y29sb2NhdGVkX212X2FkZHJfc3RhcnQgPSBjb2xvY2F0ZWRfbXZfYWRkcl9zdGFydDsKKwlwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfbXZfYWRkcl9lbmQgID0gY29sb2NhdGVkX212X2FkZHJfZW5kOworCisJcF9IMjY0X0RwYi0+ZmFzdF9vdXRwdXRfZW5hYmxlID0gZmFzdF9vdXRwdXRfZW5hYmxlOworCWh3LT5oYXNfaV9mcmFtZSA9IDA7CisjZWxzZQorCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCSIlcyBmcmFtZSBjb3VudCAlZCB0byBza2lwICVkXG5cbiIsCisJX19mdW5jX18sIGh3LT5kZWNvZGVfcGljX2NvdW50KzEsCisJaHctPnNraXBfZnJhbWVfY291bnQpOworCisJZmx1c2hfZHBiKCZody0+ZHBiKTsKKworCWlmICghaHctPmlzX3VzZWRfdjRsKSB7CisJCXRpbWVvdXQgPSBqaWZmaWVzICsgSFo7CisJCXdoaWxlIChrZmlmb19sZW4oJmh3LT5kaXNwbGF5X3EpID4gMCkgeworCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCisJCQkJYnJlYWs7CisJCQlzY2hlZHVsZSgpOworCQl9CisJfQorCisJYnVmX3NwZWNfaW5pdChodywgdHJ1ZSk7CisKKwl2aDI2NF9sb2NhbF9pbml0KGh3LCB0cnVlKTsKKwkvKmh3LT5kZWNvZGVfcGljX2NvdW50ID0gMDsKKwlody0+c2VxX2luZm8yID0gMDsqLworCisJaWYgKHZoMjY0X3NldF9wYXJhbXMoaHcsCisJCWh3LT5jZmdfcGFyYW0xLAorCQlody0+Y2ZnX3BhcmFtMiwKKwkJaHctPmNmZ19wYXJhbTMsCisJCWh3LT5jZmdfcGFyYW00LCB0cnVlKSA8IDApCisJCWh3LT5zdGF0IHw9IERFQ09ERVJfRkFUQUxfRVJST1JfU0laRV9PVkVSRkxPVzsKKwllbHNlCisJCWh3LT5zdGF0ICY9ICh+REVDT0RFUl9GQVRBTF9FUlJPUl9TSVpFX09WRVJGTE9XKTsKKworCS8qZHJvcCAzIGZyYW1lcyBhZnRlciByZXNldCBidWZtZ3IgaWYgYml0MCBpcyBzZXQgMSAqLworCWlmIChmaXJzdF9pX3BvbGljeSAmIDB4MDEpCisJCWh3LT5maXJzdF9pX3BvbGljeSA9ICgzIDw8IDgpIHwgZmlyc3RfaV9wb2xpY3k7CisKKwlwX0gyNjRfRHBiLT5maXJzdF9pbnNlcnRfZnJhbWUgPSBGaXJzdEluc2VydEZybV9SRVNFVDsKKworCWlmIChody0+c3RhdCAmIERFQ09ERVJfRkFUQUxfRVJST1JfU0laRV9PVkVSRkxPVykKKwkJaHctPmluaXRfZmxhZyA9IDA7CisJZWxzZQorCQlody0+aW5pdF9mbGFnID0gMTsKKworCWh3LT5yZXNldF9idWZtZ3JfY291bnQrKzsKKyNlbmRpZgorfQorCitpbnQgYW1tdmRlY19oMjY0X21tdV9pbml0KHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcpCit7CisJaW50IHJldCA9IC0xOworCWludCB0dnBfZmxhZyA9IHZkZWNfc2VjdXJlKGh3X3RvX3ZkZWMoaHcpKSA/CisJCUNPREVDX01NX0ZMQUdTX1RWUCA6IDA7CisJaW50IGJ1Zl9zaXplID0gNjQ7CisKKwlwcl9kZWJ1ZygiYW1tdmRlY19oMjY0X21tdV9pbml0IHR2cCA9IDB4JXggbW11X2VuYWJsZSAlZFxuIiwKKwkJCXR2cF9mbGFnLCBody0+bW11X2VuYWJsZSk7CisJaHctPm5lZWRfY2FjaGVfc2l6ZSA9IGJ1Zl9zaXplICogU1pfMU07CisJaHctPnNjX3N0YXJ0X3RpbWUgPSBnZXRfamlmZmllc182NCgpOworCWlmIChody0+bW11X2VuYWJsZSAmJiAhaHctPm1tdV9ib3gpIHsKKwkJaHctPm1tdV9ib3ggPSBkZWNvZGVyX21tdV9ib3hfYWxsb2NfYm94KERSSVZFUl9OQU1FLAorCQkJCWh3LT5pZCwKKwkJCQlNTVVfTUFYX0JVRkZFUlMsCisJCQkJaHctPm5lZWRfY2FjaGVfc2l6ZSwKKwkJCQl0dnBfZmxhZyk7CisJCWlmICghaHctPm1tdV9ib3gpIHsKKwkJCXByX2VycigiaDI2NCA0ayBhbGxvYyBtbXUgYm94IGZhaWxlZCEhXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlyZXQgPSAwOworCX0KKwlpZiAoIWh3LT5ibW11X2JveCkgeworCQlody0+Ym1tdV9ib3ggPSBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2JveCgKKwkJCURSSVZFUl9OQU1FLAorCQkJaHctPmlkLAorCQkJQk1NVV9NQVhfQlVGRkVSUywKKwkJCTQgKyBQQUdFX1NISUZULAorCQkJQ09ERUNfTU1fRkxBR1NfQ01BX0NMRUFSIHwKKwkJCUNPREVDX01NX0ZMQUdTX0ZPUl9WREVDT0RFUiB8CisJCQl0dnBfZmxhZyk7CisJCWlmIChody0+Ym1tdV9ib3gpCisJCQlyZXQgPSAwOworCX0KKwlyZXR1cm4gcmV0OworfQoraW50IGFtbXZkZWNfaDI2NF9tbXVfcmVsZWFzZShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3KQoreworCWlmIChody0+bW11X2JveCkgeworCQlkZWNvZGVyX21tdV9ib3hfZnJlZShody0+bW11X2JveCk7CisJCWh3LT5tbXVfYm94ID0gTlVMTDsKKwl9CisJaWYgKGh3LT5ibW11X2JveCkgeworCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWUoaHctPmJtbXVfYm94KTsKKwkJaHctPmJtbXVfYm94ID0gTlVMTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1tdmRlY19oMjY0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHZkZWNfcyAqcGRhdGEgPSAqKHN0cnVjdCB2ZGVjX3MgKiopcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHZkZWNfaDI2NF9od19zICpodyA9IE5VTEw7CisJY2hhciAqdG1wYnVmOworCWludCBjb25maWdfdmFsOworCWlmIChwZGF0YSA9PSBOVUxMKSB7CisJCXByX2luZm8oIlxuYW1tdmRlY19oMjY0IG1lbW9yeSByZXNvdXJjZSB1bmRlZmluZWQuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaHcgPSAoc3RydWN0IHZkZWNfaDI2NF9od19zICopaDI2NF9hbGxvY19od19zdHJ1KCZwZGV2LT5kZXYsCisJCXNpemVvZihzdHJ1Y3QgdmRlY19oMjY0X2h3X3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoaHcgPT0gTlVMTCkgeworCQlwcl9pbmZvKCJcbmFtbXZkZWNfaDI2NCBkZXZpY2UgZGF0YSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlody0+aWQgPSBwZGV2LT5pZDsKKwlody0+cGxhdGZvcm1fZGV2ID0gcGRldjsKKworCXNucHJpbnRmKGh3LT50cmFjZS52ZGVjX25hbWUsIHNpemVvZihody0+dHJhY2UudmRlY19uYW1lKSwKKwkJImgyNjQtJWQiLCBody0+aWQpOworCXNucHJpbnRmKGh3LT50cmFjZS5wdHNfbmFtZSwgc2l6ZW9mKGh3LT50cmFjZS5wdHNfbmFtZSksCisJCSIlcy1wdHMiLCBody0+dHJhY2UudmRlY19uYW1lKTsKKwlzbnByaW50Zihody0+dHJhY2UubmV3X3FfbmFtZSwgc2l6ZW9mKGh3LT50cmFjZS5uZXdfcV9uYW1lKSwKKwkJIiVzLW5ld2ZyYW1lX3EiLCBody0+dHJhY2UudmRlY19uYW1lKTsKKwlzbnByaW50Zihody0+dHJhY2UuZGlzcF9xX25hbWUsIHNpemVvZihody0+dHJhY2UuZGlzcF9xX25hbWUpLAorCQkiJXMtZGlzcGZyYW1lX3EiLCBody0+dHJhY2UudmRlY19uYW1lKTsKKwlzbnByaW50Zihody0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgc2l6ZW9mKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lKSwKKwkJImRlY29kZXJfdGltZSVkIiwgcGRldi0+aWQpOworCXNucHJpbnRmKGh3LT50cmFjZS5kZWNvZGVfcnVuX3RpbWVfbmFtZSwgc2l6ZW9mKGh3LT50cmFjZS5kZWNvZGVfcnVuX3RpbWVfbmFtZSksCisJCSJkZWNvZGVyX3J1bl90aW1lJWQiLCBwZGV2LT5pZCk7CisJc25wcmludGYoaHctPnRyYWNlLmRlY29kZV9oZWFkZXJfdGltZV9uYW1lLCBzaXplb2YoaHctPnRyYWNlLmRlY29kZV9oZWFkZXJfdGltZV9uYW1lKSwKKwkJImRlY29kZXJfaGVhZGVyX3RpbWUlZCIsIHBkZXYtPmlkKTsKKwlzbnByaW50Zihody0+dHJhY2UuZGVjb2RlX3dvcmtfdGltZV9uYW1lLCBzaXplb2YoaHctPnRyYWNlLmRlY29kZV93b3JrX3RpbWVfbmFtZSksCisJCSJkZWNvZGVyX3dvcmtfdGltZSVkIiwgcGRldi0+aWQpOworCisJLyogdGhlIGN0eCBmcm9tIHY0bDIgZHJpdmVyLiAqLworCWh3LT52NGwyX2N0eCA9IHBkYXRhLT5wcml2YXRlOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGRhdGEpOworCisJaHctPm1tdV9lbmFibGUgPSAwOworCWh3LT5maXJzdF9oZWFkX2NoZWNrX2ZsYWcgPSAwOworCisJaWYgKHBkYXRhLT5zeXNfaW5mbykKKwkJaHctPnZoMjY0X2Ftc3RyZWFtX2RlY19pbmZvID0gKnBkYXRhLT5zeXNfaW5mbzsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1KQorCQlmb3JjZV9lbmFibGVfbW11ID0gMTsKKworCWlmIChmb3JjZV9lbmFibGVfbW11ICYmIHBkYXRhLT5zeXNfaW5mbyAmJgorCQkgICAgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVFhMWCkgJiYKKwkJICAgIChnZXRfY3B1X21ham9yX2lkKCkgIT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTFgpICYmCisJCQkocGRhdGEtPnN5c19pbmZvLT5oZWlnaHQgKiBwZGF0YS0+c3lzX2luZm8tPndpZHRoCisJCQk+IDE5MjAgKiAxMDg4KSkKKwkJCWh3LT5tbXVfZW5hYmxlID0gMTsKKworCWlmIChody0+bW11X2VuYWJsZSAmJgorCQkocGRhdGEtPmZyYW1lX2Jhc2VfdmlkZW9fcGF0aCA9PSBGUkFNRV9CQVNFX1BBVEhfSU9OVklERU8pKSB7CisJCWh3LT5tbXVfZW5hYmxlID0gMDsKKwkJcHJfaW5mbygiaW9udmlkZW8gbmVlZHMgZGlzYWJsZSBtbXUsIHBhdGg9ICVkIFxuIiwKKwkJCQlwZGF0YS0+ZnJhbWVfYmFzZV92aWRlb19wYXRoKTsKKwl9CisKKwlpZiAoYW1tdmRlY19oMjY0X21tdV9pbml0KGh3KSkgeworCQloMjY0X2ZyZWVfaHdfc3RydSgmcGRldi0+ZGV2LCAodm9pZCAqKWh3KTsKKwkJcHJfaW5mbygiXG5hbW12ZGVjX2gyNjQgbW11IGFsbG9jIGZhaWxlZCFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAocGRhdGEtPmNvbmZpZ19sZW4pIHsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsICJwZGF0YS0+Y29uZmlnPSVzXG4iLCBwZGF0YS0+Y29uZmlnKTsKKwkJLyp1c2UgcHRyIGNvbmZpZyBmb3IgZG91YmVsX3dyaXRlX21vZGUsIGV0YyovCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLAorCQkJIm1oMjY0X2RvdWJsZV93cml0ZV9tb2RlIiwgJmNvbmZpZ192YWwpID09IDApCisJCQlody0+ZG91YmxlX3dyaXRlX21vZGUgPSBjb25maWdfdmFsOworCQllbHNlCisJCQlody0+ZG91YmxlX3dyaXRlX21vZGUgPSBkb3VibGVfd3JpdGVfbW9kZTsKKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywKKwkJCSJwYXJtX3Y0bF9jb2RlY19lbmFibGUiLAorCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+aXNfdXNlZF92NGwgPSBjb25maWdfdmFsOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLAorCQkJInBhcm1fdjRsX2J1ZmZlcl9tYXJnaW4iLAorCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+cmVvcmRlcl9kcGJfc2l6ZV9tYXJnaW4gPSBjb25maWdfdmFsOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLAorCQkJInBhcm1fdjRsX2NhbnZhc19tZW1fbW9kZSIsCisJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWh3LT5jYW52YXNfbW9kZSA9IGNvbmZpZ192YWw7CisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLAorCQkJInBhcm1fdjRsX2xvd19sYXRlbmN5X21vZGUiLAorCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+bG93X2xhdGVuY3lfbW9kZSA9IGNvbmZpZ192YWwgPyAweDg6MDsKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJzaWRlYmluZF90eXBlIiwKKwkJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWh3LT5zaWRlYmluZF90eXBlID0gY29uZmlnX3ZhbDsKKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgInNpZGViaW5kX2NoYW5uZWxfaWQiLAorCQkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJaHctPnNpZGViaW5kX2NoYW5uZWxfaWQgPSBjb25maWdfdmFsOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLAorCQkJInBhcm1fZW5hYmxlX2ZlbmNlIiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJaHctPmVuYWJsZV9mZW5jZSA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV9mZW5jZV91c2FnZSIsCisJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWh3LT5mZW5jZV91c2FnZSA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkibmVnYXRpdmVfZHYiLAorCQkJJmNvbmZpZ192YWwpID09IDApIHsKKwkJCWh3LT5kaXNjYXJkX2R2X2RhdGEgPSBjb25maWdfdmFsOworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsICJkaXNjYXJkIGR2IGRhdGFcbiIpOworCQl9CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV92NGxfbWV0YWRhdGFfY29uZmlnX2ZsYWciLAorCQkJJmNvbmZpZ192YWwpID09IDApIHsKKwkJCWh3LT5tZXRhZGF0YV9jb25maWdfZmxhZyA9IGNvbmZpZ192YWw7CisJCQlody0+ZGlzY2FyZF9kdl9kYXRhID0gaHctPm1ldGFkYXRhX2NvbmZpZ19mbGFnICYgVkRFQ19DRkdfRkxBR19EVl9ORUdBVElWRTsKKwkJCWlmIChody0+ZGlzY2FyZF9kdl9kYXRhKQorCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLCAiZGlzY2FyZCBkdiBkYXRhXG4iKTsKKwkJfQorCisJfSBlbHNlCisJCWh3LT5kb3VibGVfd3JpdGVfbW9kZSA9IGRvdWJsZV93cml0ZV9tb2RlOworCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDUpCisJCWh3LT5kb3VibGVfd3JpdGVfbW9kZSA9IDM7CisKKwlpZiAoZm9yY2VfY29uZmlnX2ZlbmNlKSB7CisJCWh3LT5lbmFibGVfZmVuY2UgPSB0cnVlOworCQlody0+ZmVuY2VfdXNhZ2UgPSAoZm9yY2VfY29uZmlnX2ZlbmNlID4+IDQpICYgMHhmOworCQlpZiAoZm9yY2VfY29uZmlnX2ZlbmNlICYgMHgyKQorCQkJaHctPmVuYWJsZV9mZW5jZSA9IGZhbHNlOworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSJlbmFibGUgZmVuY2U6ICVkLCBmZW5jZSB1c2FnZTogJWRcbiIsCisJCQlody0+ZW5hYmxlX2ZlbmNlLCBody0+ZmVuY2VfdXNhZ2UpOworCX0KKworCWlmICghaHctPmlzX3VzZWRfdjRsKSB7CisJCWh3LT5yZW9yZGVyX2RwYl9zaXplX21hcmdpbiA9IHJlb3JkZXJfZHBiX3NpemVfbWFyZ2luOworCQlody0+Y2FudmFzX21vZGUgPSBtZW1fbWFwX21vZGU7CisKKwkJaWYgKChoMjY0X2RlYnVnX2ZsYWcgJiBJR05PUkVfUEFSQU1fRlJPTV9DT05GSUcpID09IDApCisJCQlody0+Y2FudmFzX21vZGUgPSBwZGF0YS0+Y2FudmFzX21vZGU7CisJfQorCisJaWYgKGh3LT5tbXVfZW5hYmxlKSB7CisJCQlody0+Y2FudmFzX21vZGUgPSBDQU5WQVNfQkxLTU9ERV9MSU5FQVI7CisJCQlody0+ZG91YmxlX3dyaXRlX21vZGUgJj0gMHhmZmZmOworCX0KKworCWlmIChwZGF0YS0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBCVUZTUEVDX1BPT0xfU0laRTsgaSsrKSB7CisJCQlody0+YnVmZmVyX3NwZWNbaV0ueV9jYW52YXNfaW5kZXggPSAtMTsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS51X2NhbnZhc19pbmRleCA9IC0xOworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZfY2FudmFzX2luZGV4ID0gLTE7CisjaWZkZWYgVkRFQ19EVworCQkJaWYgKElTX1ZERUNfRFcoaHcpKSB7CisJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfeV9jYW52YXNfaW5kZXggPSAtMTsKKwkJCQlody0+YnVmZmVyX3NwZWNbaV0udmRlY19kd191X2NhbnZhc19pbmRleCA9IC0xOworCQkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X3ZfY2FudmFzX2luZGV4ID0gLTE7CisJCQl9CisjZW5kaWYKKwkJfQorCX0KKworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiJXMgbW11X2VuYWJsZSAlZCBkb3VibGVfd3JpdGVfbW9kZSAweCV4XG4iLAorCQlfX2Z1bmNfXywgaHctPm1tdV9lbmFibGUsIGh3LT5kb3VibGVfd3JpdGVfbW9kZSk7CisKKwlwZGF0YS0+cHJpdmF0ZSA9IGh3OworCXBkYXRhLT5kZWNfc3RhdHVzID0gZGVjX3N0YXR1czsKKwlwZGF0YS0+c2V0X3RyaWNrbW9kZSA9IHZtaDI2NF9zZXRfdHJpY2ttb2RlOworCXBkYXRhLT5ydW5fcmVhZHkgPSBydW5fcmVhZHk7CisJcGRhdGEtPnJ1biA9IHJ1bjsKKwlwZGF0YS0+cmVzZXQgPSByZXNldDsKKwlwZGF0YS0+aXJxX2hhbmRsZXIgPSB2aDI2NF9pc3I7CisJcGRhdGEtPnRocmVhZGVkX2lycV9oYW5kbGVyID0gdmgyNjRfaXNyX3RocmVhZF9mbjsKKwlwZGF0YS0+ZHVtcF9zdGF0ZSA9IHZtaDI2NF9kdW1wX3N0YXRlOworCisjaWZkZWYgTUgyNjRfVVNFUkRBVEFfRU5BQkxFCisJcGRhdGEtPndha2V1cF91c2VyZGF0YV9wb2xsID0gdm1oMjY0X3dha2V1cF91c2VyZGF0YV9wb2xsOworCXBkYXRhLT51c2VyX2RhdGFfcmVhZCA9IHZtaDI2NF91c2VyX2RhdGFfcmVhZDsKKwlwZGF0YS0+cmVzZXRfdXNlcmRhdGFfZmlmbyA9IHZtaDI2NF9yZXNldF91c2VyZGF0YV9maWZvOworI2Vsc2UKKwlwZGF0YS0+d2FrZXVwX3VzZXJkYXRhX3BvbGwgPSBOVUxMOworCXBkYXRhLT51c2VyX2RhdGFfcmVhZCA9IE5VTEw7CisJcGRhdGEtPnJlc2V0X3VzZXJkYXRhX2ZpZm8gPSBOVUxMOworI2VuZGlmCisJaWYgKHBkYXRhLT51c2VfdmZtX3BhdGgpIHsKKwkJc25wcmludGYocGRhdGEtPnZmX3Byb3ZpZGVyX25hbWUsIFZERUNfUFJPVklERVJfTkFNRV9TSVpFLAorCQkJVkZNX0RFQ19QUk9WSURFUl9OQU1FKTsKKwkJaHctPmZyYW1laW5mb19lbmFibGUgPSAxOworCX0KKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCWVsc2UgaWYgKHZkZWNfZHVhbChwZGF0YSkpIHsKKwkJaWYgKCFwZGF0YS0+aXNfc3RyZWFtX21vZGVfZHZfbXVsdGkpIHsKKwkJCWlmIChkdl90b2dnbGVfcHJvdl9uYW1lKSAvKmRlYnVnIHB1cnBvc2UqLworCQkJCXNucHJpbnRmKHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJCVZERUNfUFJPVklERVJfTkFNRV9TSVpFLAorCQkJCQkocGRhdGEtPm1hc3RlcikgPyBWRk1fREVDX0RWQkxfUFJPVklERVJfTkFNRSA6CisJCQkJCVZGTV9ERUNfRFZFTF9QUk9WSURFUl9OQU1FKTsKKwkJCWVsc2UKKwkJCQlzbnByaW50ZihwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCQlWREVDX1BST1ZJREVSX05BTUVfU0laRSwKKwkJCQkJKHBkYXRhLT5tYXN0ZXIpID8gVkZNX0RFQ19EVkVMX1BST1ZJREVSX05BTUUgOgorCQkJCQlWRk1fREVDX0RWQkxfUFJPVklERVJfTkFNRSk7CisJCX0gZWxzZSB7CisJCQlpZiAoZHZfdG9nZ2xlX3Byb3ZfbmFtZSkgLypkZWJ1ZyBwdXJwb3NlKi8KKwkJCQlzbnByaW50ZihwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCQlWREVDX1BST1ZJREVSX05BTUVfU0laRSwKKwkJCQkJKHBkYXRhLT5tYXN0ZXIpID8gVkZNX0RFQ19EVkJMX1BST1ZJREVSX05BTUUyIDoKKwkJCQkJVkZNX0RFQ19EVkVMX1BST1ZJREVSX05BTUUyKTsKKwkJCWVsc2UKKwkJCQlzbnByaW50ZihwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCQlWREVDX1BST1ZJREVSX05BTUVfU0laRSwKKwkJCQkJKHBkYXRhLT5tYXN0ZXIpID8gVkZNX0RFQ19EVkVMX1BST1ZJREVSX05BTUUyIDoKKwkJCQkJVkZNX0RFQ19EVkJMX1BST1ZJREVSX05BTUUyKTsKKwkJfQorCX0KKyNlbmRpZgorCWVsc2UKKwkJc25wcmludGYocGRhdGEtPnZmX3Byb3ZpZGVyX25hbWUsIFZERUNfUFJPVklERVJfTkFNRV9TSVpFLAorCQkJUFJPVklERVJfTkFNRSAiLiUwMngiLCBwZGV2LT5pZCAmIDB4ZmYpOworCisJaWYgKCFody0+aXNfdXNlZF92NGwpCisJCXZmX3Byb3ZpZGVyX2luaXQoJnBkYXRhLT52ZnJhbWVfcHJvdmlkZXIsIHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJJnZmX3Byb3ZpZGVyX29wcywgcGRhdGEpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGRhdGEpOworCisJYnVmX3NwZWNfaW5pdChodywgZmFsc2UpOworCisJaHctPnBsYXRmb3JtX2RldiA9IHBkZXY7CisKKyNpZmRlZiBEVU1QX1VTRVJEQVRBX1JFQ09SRAorCXZtaDI2NF9pbml0X3VzZXJkYXRhX2R1bXAoKTsKKwl2bWgyNjRfcmVzZXRfdXNlcl9kYXRhX2J1ZigpOworI2VuZGlmCisJaWYgKGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeShody0+Ym1tdV9ib3gsIEJNTVVfRFBCX0lEWCwKKwkJVl9CVUZfQUREUl9PRkZTRVQsIERSSVZFUl9OQU1FLCAmaHctPmNtYV9hbGxvY19hZGRyKSA8IDApIHsKKwkJaDI2NF9mcmVlX2h3X3N0cnUoJnBkZXYtPmRldiwgKHZvaWQgKilodyk7CisJCXBkYXRhLT5kZWNfc3RhdHVzID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaHctPmJ1Zl9vZmZzZXQgPSBody0+Y21hX2FsbG9jX2FkZHIgLSBERUZfQlVGX1NUQVJUX0FERFIgKworCQkJRENBQ19SRUFEX01BUkdJTjsKKwlpZiAoaHctPm1tdV9lbmFibGUpIHsKKwkJdTMyIGV4dGlmX3NpemUgPSBFWFRJRl9CVUZfU0laRTsKKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSAgQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpCisJCQlleHRpZl9zaXplIDw8PSAxOworCQlpZiAoZGVjb2Rlcl9ibW11X2JveF9hbGxvY19idWZfcGh5KGh3LT5ibW11X2JveCwgQk1NVV9FWFRJRl9JRFgsCisJCQlleHRpZl9zaXplLCBEUklWRVJfTkFNRSwgJmh3LT5leHRpZl9hZGRyKSA8IDApIHsKKwkJCWgyNjRfZnJlZV9od19zdHJ1KCZwZGV2LT5kZXYsICh2b2lkICopaHcpOworCQkJcGRhdGEtPmRlY19zdGF0dXMgPSBOVUxMOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisJaWYgKCF2ZGVjX3NlY3VyZShwZGF0YSkpIHsKKyNpZiAxCisJCS8qaW5pdCBpbnRlcm5hbCBidWYqLworCQl0bXBidWYgPSAoY2hhciAqKWNvZGVjX21tX3BoeXNfdG9fdmlydChody0+Y21hX2FsbG9jX2FkZHIpOworCQlpZiAodG1wYnVmKSB7CisJCQltZW1zZXQodG1wYnVmLCAwLCBWX0JVRl9BRERSX09GRlNFVCk7CisJCQljb2RlY19tbV9kbWFfZmx1c2godG1wYnVmLAorCQkJCVZfQlVGX0FERFJfT0ZGU0VULAorCQkJCURNQV9UT19ERVZJQ0UpOworCQl9IGVsc2UgeworCQkJdG1wYnVmID0gY29kZWNfbW1fdm1hcChody0+Y21hX2FsbG9jX2FkZHIsCisJCQkJVl9CVUZfQUREUl9PRkZTRVQpOworCQkJaWYgKHRtcGJ1ZikgeworCQkJCW1lbXNldCh0bXBidWYsIDAsIFZfQlVGX0FERFJfT0ZGU0VUKTsKKwkJCQljb2RlY19tbV9kbWFfZmx1c2godG1wYnVmLAorCQkJCQlWX0JVRl9BRERSX09GRlNFVCwKKwkJCQkJRE1BX1RPX0RFVklDRSk7CisJCQkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcih0bXBidWYpOworCQkJfQorCQl9CisjZWxzZQorCQkvKmluaXQgc3BzL3BwcyBpbnRlcm5hbCBidWYgNjRrKi8KKwkJdG1wYnVmID0gKGNoYXIgKiljb2RlY19tbV9waHlzX3RvX3ZpcnQoaHctPmNtYV9hbGxvY19hZGRyCisJCQkrIChtZW1fc3BzX2Jhc2UgLSBERUZfQlVGX1NUQVJUX0FERFIpKTsKKwkJbWVtc2V0KHRtcGJ1ZiwgMCwgMHgxMDAwMCk7CisJCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCWh3LT5jbWFfYWxsb2NfYWRkciArCisJCQkobWVtX3Nwc19iYXNlIC0gREVGX0JVRl9TVEFSVF9BRERSKSwKKwkJCTB4MTAwMDAsIERNQV9UT19ERVZJQ0UpOworI2VuZGlmCisJfQorCS8qKi8KKworI2lmIDAKKwlpZiAoTlVMTCA9PSBody0+c2VpX2RhdGFfYnVmZmVyKSB7CisJCWh3LT5zZWlfZGF0YV9idWZmZXIgPQorCQkJZG1hX2FsbG9jX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlVU0VSX0RBVEFfU0laRSwKKwkJCQkmaHctPnNlaV9kYXRhX2J1ZmZlcl9waHlzLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFody0+c2VpX2RhdGFfYnVmZmVyKSB7CisJCQlwcl9pbmZvKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBzZWlfZGF0YV9idWZmZXJcbiIsCisJCQkJICAgX19mdW5jX18pOworCQkJYW1tdmRlY19oMjY0X21tdV9yZWxlYXNlKGh3KTsKKwkJCWgyNjRfZnJlZV9od19zdHJ1KCZwZGV2LT5kZXYsICh2b2lkICopaHcpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJLyogcHJfaW5mbygiYnVmZmVyIDB4JXgsIHBoeXMgMHgleCwgcmVtYXAgMHgleFxuIiwKKwkJICAgc2VpX2RhdGFfYnVmZmVyLCBzZWlfZGF0YV9idWZmZXJfcGh5cywKKwkJICAgKHUzMilzZWlfZGF0YV9idWZmZXJfcmVtYXApOyAqLworCX0KKyNlbmRpZgorCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLCAiYW1tdmRlY19oMjY0IG1lbS1hZGRyPSVseCxidWZmX29mZnNldD0leCxidWZfc3RhcnQ9JWx4XG4iLAorCQlwZGF0YS0+bWVtX3N0YXJ0LCBody0+YnVmX29mZnNldCwgaHctPmNtYV9hbGxvY19hZGRyKTsKKworCXZkZWNfc291cmNlX2NoYW5nZWQoVkZPUk1BVF9IMjY0LCAzODQwLCAyMTYwLCA2MCk7CisKKwlpZiAoaHctPm1tdV9lbmFibGUpCisJCWhldmNfc291cmNlX2NoYW5nZWQoVkZPUk1BVF9IRVZDLCAzODQwLCAyMTYwLCA2MCk7CisKKwlpZiAodmgyNjRfaW5pdChodykgPCAwKSB7CisJCXByX2luZm8oIlxuYW1tdmRlY19oMjY0IGluaXQgZmFpbGVkLlxuIik7CisJCWFtbXZkZWNfaDI2NF9tbXVfcmVsZWFzZShodyk7CisJCWgyNjRfZnJlZV9od19zdHJ1KCZwZGV2LT5kZXYsICh2b2lkICopaHcpOworCQlwZGF0YS0+ZGVjX3N0YXR1cyA9IE5VTEw7CisJCXJldHVybiAtRU5PREVWOworCX0KKyNpZmRlZiBNSDI2NF9VU0VSREFUQV9FTkFCTEUKKwl2bWgyNjRfY3JhdGVfdXNlcmRhdGFfbWFuYWdlcihodywKKwkJCWh3LT5zZWlfdXNlcl9kYXRhX2J1ZmZlciwKKwkJCVVTRVJfREFUQV9TSVpFKTsKKyNlbmRpZgorCisjaWZkZWYgQVVYX0RBVEFfQ1JDCisJdmRlY19hdXhfZGF0YV9jaGVja19pbml0KHBkYXRhKTsKKyNlbmRpZgorCisJdmRlY19zZXRfcHJlcGFyZV9sZXZlbChwZGF0YSwgc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCk7CisJaWYgKHBkYXRhLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQlpZiAoaHctPm1tdV9lbmFibGUgPT0gMCkKKwkJCXZkZWNfY29yZV9yZXF1ZXN0KHBkYXRhLCBDT1JFX01BU0tfVkRFQ18xKTsKKwkJZWxzZSB7CisJCQl2ZGVjX2NvcmVfcmVxdWVzdChwZGF0YSwgQ09SRV9NQVNLX1ZERUNfMSB8IENPUkVfTUFTS19IRVZDCisJCQkJfCBDT1JFX01BU0tfQ09NQklORSk7CisJCX0KKwl9IGVsc2UKKwkJdmRlY19jb3JlX3JlcXVlc3QocGRhdGEsIENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQworCQkJCXwgQ09SRV9NQVNLX0NPTUJJTkUpOworCisJYXRvbWljX3NldCgmaHctPnZoMjY0X2FjdGl2ZSwgMSk7CisJdmRlY19zZXRfdmZyYW1lX2NvbW0ocGRhdGEsIERSSVZFUl9OQU1FKTsKKwlkaXNwbGF5X2ZyYW1lX2NvdW50W0RFQ09ERV9JRChodyldID0gMDsKKwlkZWNvZGVfZnJhbWVfY291bnRbREVDT0RFX0lEKGh3KV0gPSAwOworCWh3LT5kcGIud2l0aG91dF9kaXNwbGF5X21vZGUgPSB3aXRob3V0X2Rpc3BsYXlfbW9kZTsKKwltdXRleF9pbml0KCZody0+ZmVuY2VfbXV0ZXgpOworCWlmIChody0+ZW5hYmxlX2ZlbmNlKSB7CisJCXBkYXRhLT5zeW5jID0gdmRlY19zeW5jX2dldCgpOworCQlpZiAoIXBkYXRhLT5zeW5jKSB7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwgImFsbG9jIGZlbmNlIHRpbWVsaW5lIGVycm9yXG4iKTsKKwkJCWFtbXZkZWNfaDI2NF9tbXVfcmVsZWFzZShodyk7CisJCQloMjY0X2ZyZWVfaHdfc3RydSgmcGRldi0+ZGV2LCAodm9pZCAqKWh3KTsKKwkJCXBkYXRhLT5kZWNfc3RhdHVzID0gTlVMTDsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCXBkYXRhLT5zeW5jLT51c2FnZSA9IGh3LT5mZW5jZV91c2FnZTsKKwkJLyogY3JlYXQgdGltZWxpbmUuICovCisJCXZkZWNfdGltZWxpbmVfY3JlYXRlKHBkYXRhLT5zeW5jLCBEUklWRVJfTkFNRSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZkZWNfZmVuY2VfcmVsZWFzZShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LAorCQkJICAgICAgIHN0cnVjdCB2ZGVjX3N5bmMgKnN5bmMpCit7CisJdWxvbmcgZXhwaXJlczsKKworCS8qIGNsZWFyIGRpc3BsYXkgcG9vbC4gKi8KKwljbGVhcl9yZWZlcl9idWZzKGh3KTsKKworCS8qIG5vdGlmeSBzaWduYWwgdG8gd2FrZSB1cCBhbGwgZmVuY2VzLiAqLworCXZkZWNfdGltZWxpbmVfaW5jcmVhc2Uoc3luYywgVkZfUE9PTF9TSVpFKTsKKworCWV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMDAwKTsKKwl3aGlsZSAoIWNoZWNrX29ianNfYWxsX3NpZ25hbGVkKHN5bmMpKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGV4cGlyZXMpKSB7CisJCQlwcl9lcnIoIndhaXQgZmVuY2Ugc2lnbmFsZWQgdGltZW91dC5cbiIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlwcl9pbmZvKCJmZW5jZSBzdGFydCByZWxlYXNlXG4iKTsKKworCS8qIGRlY3JlYXNlcyByZWZjbnQgb2YgdGltZWxpbmUuICovCisJdmRlY190aW1lbGluZV9wdXQoc3luYyk7Cit9CisKK3N0YXRpYyBpbnQgYW1tdmRlY19oMjY0X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcgPQorCQkoc3RydWN0IHZkZWNfaDI2NF9od19zICopCisJCSgoKHN0cnVjdCB2ZGVjX3MgKikocGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldikpKS0+cHJpdmF0ZSk7CisJaW50IGk7CisKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisKKwlpZiAodmRlYy0+bmV4dF9zdGF0dXMgPT0gVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVECisJCQkJJiYgKHZkZWMtPnN0YXR1cyA9PSBWREVDX1NUQVRVU19BQ1RJVkUpKSB7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCQkiJXMgIGZvcmNlIGV4aXQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRk9SQ0VfRVhJVDsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaHctPndhaXRfcSwKKwkJCQkodmRlYy0+c3RhdHVzID09IFZERUNfU1RBVFVTX0NPTk5FQ1RFRCksCisJCQkJbXNlY3NfdG9famlmZmllcygxMDAwKSk7ICAvKiB3YWl0IGZvciB3b3JrIGRvbmUgKi8KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQlVGU1BFQ19QT09MX1NJWkU7IGkrKykKKwkJcmVsZWFzZV9hdXhfZGF0YShodywgaSk7CisKKwlhdG9taWNfc2V0KCZody0+dmgyNjRfYWN0aXZlLCAwKTsKKworCWlmIChody0+c3RhdCAmIFNUQVRfVElNRVJfQVJNKSB7CisJCWRlbF90aW1lcl9zeW5jKCZody0+Y2hlY2tfdGltZXIpOworCQlody0+c3RhdCAmPSB+U1RBVF9USU1FUl9BUk07CisJfQorCisJdmgyNjRfc3RvcChodyk7CisjaWZkZWYgTUgyNjRfVVNFUkRBVEFfRU5BQkxFCisjaWZkZWYgRFVNUF9VU0VSREFUQV9SRUNPUkQKKwl2bWgyNjRfZHVtcF91c2VyZGF0YSgpOworI2VuZGlmCisJdm1oMjY0X2Rlc3Ryb3lfdXNlcmRhdGFfbWFuYWdlcihodyk7CisjZW5kaWYKKwkvKiB2ZGVjX3NvdXJjZV9jaGFuZ2VkKFZGT1JNQVRfSDI2NCwgMCwgMCwgMCk7ICovCisKKyNpZmRlZiBBVVhfREFUQV9DUkMKKwl2ZGVjX2F1eF9kYXRhX2NoZWNrX2V4aXQodmRlYyk7CisjZW5kaWYKKworCWF0b21pY19zZXQoJmh3LT52aDI2NF9hY3RpdmUsIDApOworCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQlpZiAoaHctPm1tdV9lbmFibGUgPT0gMCkKKwkJCXZkZWNfY29yZV9yZWxlYXNlKHZkZWMsIENPUkVfTUFTS19WREVDXzEpOworCQllbHNlCisJCQl2ZGVjX2NvcmVfcmVsZWFzZSh2ZGVjLCBDT1JFX01BU0tfVkRFQ18xIHwgQ09SRV9NQVNLX0hFVkMgfAorCQkJCUNPUkVfTUFTS19DT01CSU5FKTsKKwl9IGVsc2UKKwkJdmRlY19jb3JlX3JlbGVhc2UoaHdfdG9fdmRlYyhodyksIENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQyk7CisKKwl2ZGVjX3NldF9zdGF0dXMoaHdfdG9fdmRlYyhodyksIFZERUNfU1RBVFVTX0RJU0NPTk5FQ1RFRCk7CisJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCWZvciAoaSA9IDA7IGkgPCBCVUZTUEVDX1BPT0xfU0laRTsgaSsrKSB7CisJCQl2ZGVjLT5mcmVlX2NhbnZhc19leChody0+YnVmZmVyX3NwZWNbaV0ueV9jYW52YXNfaW5kZXgsIHZkZWMtPmlkKTsKKwkJCXZkZWMtPmZyZWVfY2FudmFzX2V4KGh3LT5idWZmZXJfc3BlY1tpXS51X2NhbnZhc19pbmRleCwgdmRlYy0+aWQpOworCQkJdmRlYy0+ZnJlZV9jYW52YXNfZXgoaHctPmJ1ZmZlcl9zcGVjW2ldLnZfY2FudmFzX2luZGV4LCB2ZGVjLT5pZCk7CisJCQlpZiAoSVNfVkRFQ19EVyhodykpIHsKKwkJCQl2ZGVjLT5mcmVlX2NhbnZhc19leChody0+YnVmZmVyX3NwZWNbaV0udmRlY19kd195X2NhbnZhc19pbmRleCwgdmRlYy0+aWQpOworCQkJCXZkZWMtPmZyZWVfY2FudmFzX2V4KGh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X3VfY2FudmFzX2luZGV4LCB2ZGVjLT5pZCk7CisJCQkJdmRlYy0+ZnJlZV9jYW52YXNfZXgoaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfdl9jYW52YXNfaW5kZXgsIHZkZWMtPmlkKTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChody0+ZW5hYmxlX2ZlbmNlKQorCQl2ZGVjX2ZlbmNlX3JlbGVhc2UoaHcsIHZkZWMtPnN5bmMpOworCisJYW1tdmRlY19oMjY0X21tdV9yZWxlYXNlKGh3KTsKKwloMjY0X2ZyZWVfaHdfc3RydSgmcGRldi0+ZGV2LCAodm9pZCAqKWh3KTsKKwljbGtfYWRqX2ZyYW1lX2NvdW50ID0gMDsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYW1tdmRlY19oMjY0X2RyaXZlciA9IHsKKwkucHJvYmUgPSBhbW12ZGVjX2gyNjRfcHJvYmUsCisJLnJlbW92ZSA9IGFtbXZkZWNfaDI2NF9yZW1vdmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBhbXZkZWNfc3VzcGVuZCwKKwkucmVzdW1lID0gYW12ZGVjX3Jlc3VtZSwKKyNlbmRpZgorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJJVkVSX05BTUUsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBjb2RlY19wcm9maWxlX3QgYW1tdmRlY19oMjY0X3Byb2ZpbGUgPSB7CisJLm5hbWUgPSAibWgyNjQiLAorCS5wcm9maWxlID0gIiIKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWNvbmZpZyBobTI2NF9jb25maWdzW10gPSB7CisJTUNfUFUzMigiaDI2NF9kZWJ1Z19mbGFnIiwgJmgyNjRfZGVidWdfZmxhZyksCisJTUNfUEkzMigic3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCIsICZzdGFydF9kZWNvZGVfYnVmX2xldmVsKSwKKwlNQ19QVTMyKCJmaXhlZF9mcmFtZV9yYXRlX21vZGUiLCAmZml4ZWRfZnJhbWVfcmF0ZV9tb2RlKSwKKwlNQ19QVTMyKCJkZWNvZGVfdGltZW91dF92YWwiLCAmZGVjb2RlX3RpbWVvdXRfdmFsKSwKKwlNQ19QVTMyKCJyZW9yZGVyX2RwYl9zaXplX21hcmdpbiIsICZyZW9yZGVyX2RwYl9zaXplX21hcmdpbiksCisJTUNfUFUzMigicmVmZXJlbmNlX2J1Zl9tYXJnaW4iLCAmcmVmZXJlbmNlX2J1Zl9tYXJnaW4pLAorCU1DX1BVMzIoInJhZHIiLCAmcmFkciksCisJTUNfUFUzMigicnZhbCIsICZydmFsKSwKKwlNQ19QVTMyKCJoMjY0X2RlYnVnX21hc2siLCAmaDI2NF9kZWJ1Z19tYXNrKSwKKwlNQ19QVTMyKCJoMjY0X2RlYnVnX2NtZCIsICZoMjY0X2RlYnVnX2NtZCksCisJTUNfUEkzMigiZm9yY2VfcmF0ZV9zdHJlYW1iYXNlIiwgJmZvcmNlX3JhdGVfc3RyZWFtYmFzZSksCisJTUNfUEkzMigiZGVjX2NvbnRyb2wiLCAmZGVjX2NvbnRyb2wpLAorCU1DX1BJMzIoImZvcmNlX3JhdGVfZnJhbWViYXNlIiwgJmZvcmNlX3JhdGVfZnJhbWViYXNlKSwKKwlNQ19QSTMyKCJmb3JjZV9kaXNwX2J1ZnNwZWNfbnVtIiwgJmZvcmNlX2Rpc3BfYnVmc3BlY19udW0pLAorCU1DX1BVMzIoInByZWZpeF9hdXhfYnVmX3NpemUiLCAmcHJlZml4X2F1eF9idWZfc2l6ZSksCisJTUNfUFUzMigic3VmZml4X2F1eF9idWZfc2l6ZSIsICZzdWZmaXhfYXV4X2J1Zl9zaXplKSwKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCU1DX1BVMzIoInJlb3JkZXJfZHBiX3NpemVfbWFyZ2luX2R2IiwgJnJlb3JkZXJfZHBiX3NpemVfbWFyZ2luX2R2KSwKKwlNQ19QVTMyKCJkdl90b2dnbGVfcHJvdl9uYW1lIiwgJmR2X3RvZ2dsZV9wcm92X25hbWUpLAorCU1DX1BVMzIoImRvbGJ5X21ldGFfd2l0aF9lbCIsICZkb2xieV9tZXRhX3dpdGhfZWwpLAorI2VuZGlmCisJTUNfUFUzMigiaV9vbmx5X2ZsYWciLCAmaV9vbmx5X2ZsYWcpLAorCU1DX1BVMzIoImZvcmNlX3JhdGVfc3RyZWFtYmFzZSIsICZmb3JjZV9yYXRlX3N0cmVhbWJhc2UpLAorfTsKK3N0YXRpYyBzdHJ1Y3QgbWNvbmZpZ19ub2RlIGhtMjY0X25vZGU7CisKKworc3RhdGljIGludCBfX2luaXQgYW1tdmRlY19oMjY0X2RyaXZlcl9pbml0X21vZHVsZSh2b2lkKQoreworCisJcHJfaW5mbygiYW1tdmRlY19oMjY0IG1vZHVsZSBpbml0XG4iKTsKKwlpZiAocGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhbW12ZGVjX2gyNjRfZHJpdmVyKSkgeworCQlwcl9pbmZvKCJmYWlsZWQgdG8gcmVnaXN0ZXIgYW1tdmRlY19oMjY0IGRyaXZlclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICh2ZGVjX2lzX3N1cHBvcnRfNGsoKSkgeworCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UWExYKSB7CisJCQlhbW12ZGVjX2gyNjRfcHJvZmlsZS5wcm9maWxlID0KKwkJCQkJIjRrLCBkd3JpdGUsIGNvbXByZXNzZWQsIGZyYW1lX2R2LCBmZW5jZSwgdjRsIjsKKwkJfSBlbHNlIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYVFZCQikgeworCQkJYW1tdmRlY19oMjY0X3Byb2ZpbGUucHJvZmlsZSA9ICI0aywgZnJhbWVfZHYsIGZlbmNlLCB2NGwiOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDVEIHx8IGlzX2NwdV9zNF9zODA1eDIoKSkgeworCQkJYW1tdmRlY19oMjY0X3Byb2ZpbGUucHJvZmlsZSA9CisJCQkJCQkiZHdyaXRlLCBjb21wcmVzc2VkLCBmcmFtZV9kdiwgdjRsIjsKKwkJfSBlbHNlIHsKKwkJCWFtbXZkZWNfaDI2NF9wcm9maWxlLnByb2ZpbGUgPQorCQkJCSAgICAgICAgImR3cml0ZSwgY29tcHJlc3NlZCwgdjRsIjsKKwkJfQorCX0KKworCXZjb2RlY19wcm9maWxlX3JlZ2lzdGVyKCZhbW12ZGVjX2gyNjRfcHJvZmlsZSk7CisJSU5JVF9SRUdfTk9ERV9DT05GSUdTKCJtZWRpYS5kZWNvZGVyIiwgJmhtMjY0X25vZGUsCisJIm1oMjY0IiwgaG0yNjRfY29uZmlncywgQ09ORklHX0ZPUl9SVyk7CisKKwl2Y29kZWNfZmVhdHVyZV9yZWdpc3RlcihWRk9STUFUX0gyNjQsIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYW1tdmRlY19oMjY0X2RyaXZlcl9yZW1vdmVfbW9kdWxlKHZvaWQpCit7CisJcHJfaW5mbygiYW1tdmRlY19oMjY0IG1vZHVsZSByZW1vdmUuXG4iKTsKKworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhbW12ZGVjX2gyNjRfZHJpdmVyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCittb2R1bGVfcGFyYW0oaDI2NF9kZWJ1Z19mbGFnLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoaDI2NF9kZWJ1Z19mbGFnLCAiXG4gYW1tdmRlY19oMjY0IGgyNjRfZGVidWdfZmxhZ1xuIik7CisKK21vZHVsZV9wYXJhbShzdGFydF9kZWNvZGVfYnVmX2xldmVsLCBpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhzdGFydF9kZWNvZGVfYnVmX2xldmVsLAorCQkiXG4gYW1tdmRlY19oMjY0IHN0YXJ0X2RlY29kZV9idWZfbGV2ZWxcbiIpOworCittb2R1bGVfcGFyYW0ocHJlX2RlY29kZV9idWZfbGV2ZWwsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHByZV9kZWNvZGVfYnVmX2xldmVsLCAiXG4gYW1tdmRlY19oMjY0IHByZV9kZWNvZGVfYnVmX2xldmVsXG4iKTsKKworbW9kdWxlX3BhcmFtKGZpeGVkX2ZyYW1lX3JhdGVfbW9kZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZpeGVkX2ZyYW1lX3JhdGVfbW9kZSwgIlxuYW12ZGVjX2gyNjQgZml4ZWRfZnJhbWVfcmF0ZV9tb2RlXG4iKTsKKworbW9kdWxlX3BhcmFtKGRlY29kZV90aW1lb3V0X3ZhbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlY29kZV90aW1lb3V0X3ZhbCwgIlxuIGFtdmRlY19oMjY0IGRlY29kZV90aW1lb3V0X3ZhbFxuIik7CisKK21vZHVsZV9wYXJhbShlcnJvcmRhdGFfdGltZW91dF92YWwsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhlcnJvcmRhdGFfdGltZW91dF92YWwsICJcbiBhbXZkZWNfaDI2NCBlcnJvcmRhdGFfdGltZW91dF92YWxcbiIpOworCittb2R1bGVfcGFyYW0oZ2V0X2RhdGFfdGltZW91dF92YWwsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhnZXRfZGF0YV90aW1lb3V0X3ZhbCwgIlxuIGFtdmRlY19oMjY0IGdldF9kYXRhX3RpbWVvdXRfdmFsXG4iKTsKKworbW9kdWxlX3BhcmFtKGZyYW1lX21heF9kYXRhX3BhY2tldCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZyYW1lX21heF9kYXRhX3BhY2tldCwgIlxuIGFtdmRlY19oMjY0IGZyYW1lX21heF9kYXRhX3BhY2tldFxuIik7CisKK21vZHVsZV9wYXJhbShyZW9yZGVyX2RwYl9zaXplX21hcmdpbiwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJlb3JkZXJfZHBiX3NpemVfbWFyZ2luLCAiXG4gYW1tdmRlY19oMjY0IHJlb3JkZXJfZHBiX3NpemVfbWFyZ2luXG4iKTsKKworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCittb2R1bGVfcGFyYW0ocmVvcmRlcl9kcGJfc2l6ZV9tYXJnaW5fZHYsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhyZW9yZGVyX2RwYl9zaXplX21hcmdpbl9kdiwKKwkiXG4gYW1tdmRlY19oMjY0IHJlb3JkZXJfZHBiX3NpemVfbWFyZ2luX2R2XG4iKTsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0ocmVmZXJlbmNlX2J1Zl9tYXJnaW4sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhyZWZlcmVuY2VfYnVmX21hcmdpbiwgIlxuIGFtbXZkZWNfaDI2NCByZWZlcmVuY2VfYnVmX21hcmdpblxuIik7CisKKyNpZmRlZiBDT05TVFJBSU5fTUFYX0JVRl9OVU0KK21vZHVsZV9wYXJhbShydW5fcmVhZHlfbWF4X3ZmX29ubHlfbnVtLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocnVuX3JlYWR5X21heF92Zl9vbmx5X251bSwgIlxuIHJ1bl9yZWFkeV9tYXhfdmZfb25seV9udW1cbiIpOworCittb2R1bGVfcGFyYW0ocnVuX3JlYWR5X2Rpc3BsYXlfcV9udW0sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhydW5fcmVhZHlfZGlzcGxheV9xX251bSwgIlxuIHJ1bl9yZWFkeV9kaXNwbGF5X3FfbnVtXG4iKTsKKworbW9kdWxlX3BhcmFtKHJ1bl9yZWFkeV9tYXhfYnVmX251bSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJ1bl9yZWFkeV9tYXhfYnVmX251bSwgIlxuIHJ1bl9yZWFkeV9tYXhfYnVmX251bVxuIik7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKHJhZHIsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhyYWRyLCAiXG5yYWRyXG4iKTsKKworbW9kdWxlX3BhcmFtKHJ2YWwsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhydmFsLCAiXG5ydmFsXG4iKTsKKworbW9kdWxlX3BhcmFtKGgyNjRfZGVidWdfbWFzaywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGgyNjRfZGVidWdfbWFzaywgIlxuIGFtdmRlY19oMjY0IGgyNjRfZGVidWdfbWFza1xuIik7CisKK21vZHVsZV9wYXJhbShoMjY0X2RlYnVnX2NtZCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGgyNjRfZGVidWdfY21kLCAiXG4gYW12ZGVjX2gyNjQgaDI2NF9kZWJ1Z19jbWRcbiIpOworCittb2R1bGVfcGFyYW0oZm9yY2VfcmF0ZV9zdHJlYW1iYXNlLCBpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9yYXRlX3N0cmVhbWJhc2UsICJcbiBhbXZkZWNfaDI2NCBmb3JjZV9yYXRlX3N0cmVhbWJhc2VcbiIpOworCittb2R1bGVfcGFyYW0oZGVjX2NvbnRyb2wsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlY19jb250cm9sLCAiXG4gYW12ZGVjX2gyNjQgZGVjX2NvbnRyb2xcbiIpOworCittb2R1bGVfcGFyYW0oZm9yY2VfcmF0ZV9mcmFtZWJhc2UsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX3JhdGVfZnJhbWViYXNlLCAiXG4gYW12ZGVjX2gyNjQgZm9yY2VfcmF0ZV9mcmFtZWJhc2VcbiIpOworCittb2R1bGVfcGFyYW0oZm9yY2VfZGlzcF9idWZzcGVjX251bSwgaW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2VfZGlzcF9idWZzcGVjX251bSwgIlxuIGFtdmRlY19oMjY0IGZvcmNlX2Rpc3BfYnVmc3BlY19udW1cbiIpOworCittb2R1bGVfcGFyYW0oVl9CVUZfQUREUl9PRkZTRVQsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKFZfQlVGX0FERFJfT0ZGU0VULCAiXG4gYW12ZGVjX2gyNjQgVl9CVUZfQUREUl9PRkZTRVRcbiIpOworCittb2R1bGVfcGFyYW0ocHJlZml4X2F1eF9idWZfc2l6ZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHByZWZpeF9hdXhfYnVmX3NpemUsICJcbiBwcmVmaXhfYXV4X2J1Zl9zaXplXG4iKTsKKworbW9kdWxlX3BhcmFtKHN1ZmZpeF9hdXhfYnVmX3NpemUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhzdWZmaXhfYXV4X2J1Zl9zaXplLCAiXG4gc3VmZml4X2F1eF9idWZfc2l6ZVxuIik7CisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorbW9kdWxlX3BhcmFtKGR2X3RvZ2dsZV9wcm92X25hbWUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkdl90b2dnbGVfcHJvdl9uYW1lLCAiXG4gZHZfdG9nZ2xlX3Byb3ZfbmFtZVxuIik7CisKK21vZHVsZV9wYXJhbShkb2xieV9tZXRhX3dpdGhfZWwsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkb2xieV9tZXRhX3dpdGhfZWwsICJcbiBkb2xieV9tZXRhX3dpdGhfZWxcbiIpOworCisjZW5kaWYKKworbW9kdWxlX3BhcmFtKGZhc3Rfb3V0cHV0X2VuYWJsZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZhc3Rfb3V0cHV0X2VuYWJsZSwgIlxuIGFtdmRlY19oMjY0IGZhc3Rfb3V0cHV0X2VuYWJsZVxuIik7CisKK21vZHVsZV9wYXJhbShlcnJvcl9wcm9jX3BvbGljeSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVycm9yX3Byb2NfcG9saWN5LCAiXG4gYW12ZGVjX2gyNjQgZXJyb3JfcHJvY19wb2xpY3lcbiIpOworCittb2R1bGVfcGFyYW0oZXJyb3Jfc2tpcF9jb3VudCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVycm9yX3NraXBfY291bnQsICJcbiBhbXZkZWNfaDI2NCBlcnJvcl9za2lwX2NvdW50XG4iKTsKKworbW9kdWxlX3BhcmFtKGZvcmNlX3NsaWRpbmdfbWFyZ2luLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2Vfc2xpZGluZ19tYXJnaW4sICJcbiBhbXZkZWNfaDI2NCBmb3JjZV9zbGlkaW5nX21hcmdpblxuIik7CisKK21vZHVsZV9wYXJhbShpX29ubHlfZmxhZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlfb25seV9mbGFnLCAiXG4gYW12ZGVjX2gyNjQgaV9vbmx5X2ZsYWdcbiIpOworCittb2R1bGVfcGFyYW0oZmlyc3RfaV9wb2xpY3ksIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmaXJzdF9pX3BvbGljeSwgIlxuIGFtdmRlY19oMjY0IGZpcnN0X2lfcG9saWN5XG4iKTsKKworbW9kdWxlX3BhcmFtKGZybWJhc2VfY29udF9iaXRsZXZlbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZybWJhc2VfY29udF9iaXRsZXZlbCwKKwkiXG4gYW12ZGVjX2gyNjQgZnJtYmFzZV9jb250X2JpdGxldmVsXG4iKTsKKworbW9kdWxlX3BhcmFtKGZybWJhc2VfY29udF9iaXRsZXZlbDIsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmcm1iYXNlX2NvbnRfYml0bGV2ZWwyLAorCSJcbiBhbXZkZWNfaDI2NCBmcm1iYXNlX2NvbnRfYml0bGV2ZWxcbiIpOworCittb2R1bGVfcGFyYW0odWRlYnVnX2ZsYWcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh1ZGVidWdfZmxhZywgIlxuIGFtdmRlY19taDI2NCB1ZGVidWdfZmxhZ1xuIik7CisKK21vZHVsZV9wYXJhbSh1ZGVidWdfcGF1c2VfcG9zLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModWRlYnVnX3BhdXNlX3BvcywgIlxuIHVkZWJ1Z19wYXVzZV9wb3NcbiIpOworCittb2R1bGVfcGFyYW0odWRlYnVnX3BhdXNlX3ZhbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHVkZWJ1Z19wYXVzZV92YWwsICJcbiB1ZGVidWdfcGF1c2VfdmFsXG4iKTsKKworbW9kdWxlX3BhcmFtKHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModWRlYnVnX3BhdXNlX2RlY29kZV9pZHgsICJcbiB1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeFxuIik7CisKK21vZHVsZV9wYXJhbShtYXhfYWxsb2NfYnVmX2NvdW50LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2FsbG9jX2J1Zl9jb3VudCwgIlxuIGFtdmRlY19oMjY0IG1heF9hbGxvY19idWZfY291bnRcbiIpOworCittb2R1bGVfcGFyYW0oZW5hYmxlX2l0dV90MzUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhlbmFibGVfaXR1X3QzNSwgIlxuIGFtdmRlY19oMjY0IGVuYWJsZV9pdHVfdDM1XG4iKTsKKworbW9kdWxlX3BhcmFtKGVuZGlhbiwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuZGlhbiwgIlxucnZhbFxuIik7CisKK21vZHVsZV9wYXJhbShtbXVfZW5hYmxlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobW11X2VuYWJsZSwgIlxuIG1tdV9lbmFibGVcbiIpOworCittb2R1bGVfcGFyYW0oZm9yY2VfZW5hYmxlX21tdSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2VuYWJsZV9tbXUsICJcbiBmb3JjZV9lbmFibGVfbW11XG4iKTsKKworbW9kdWxlX3BhcmFtKGFnYWluX3RocmVzaG9sZCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGFnYWluX3RocmVzaG9sZCwgIlxuIGFnYWluX3RocmVzaG9sZFxuIik7CisKK21vZHVsZV9wYXJhbShzdHJlYW1fbW9kZV9zdGFydF9udW0sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhzdHJlYW1fbW9kZV9zdGFydF9udW0sICJcbiBzdHJlYW1fbW9kZV9zdGFydF9udW1cbiIpOworCittb2R1bGVfcGFyYW0oY29sb2NhdGVfb2xkX2NhbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNvbG9jYXRlX29sZF9jYWwsICJcbiBhbXZkZWNfbWgyNjQgY29sb2NhdGVfb2xkX2NhbFxuIik7CisKKy8qCittb2R1bGVfcGFyYW0odHJpZ2dlcl90YXNrLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModHJpZ2dlcl90YXNrLCAiXG4gYW12ZGVjX2gyNjQgdHJpZ2dlcl90YXNrXG4iKTsKKyovCittb2R1bGVfcGFyYW1fYXJyYXkoZGVjb2RlX2ZyYW1lX2NvdW50LCB1aW50LCAmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCittb2R1bGVfcGFyYW1fYXJyYXkoZGlzcGxheV9mcmFtZV9jb3VudCwgdWludCwgJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtX2FycmF5KG1heF9wcm9jZXNzX3RpbWUsIHVpbnQsICZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisKK21vZHVsZV9wYXJhbV9hcnJheShydW5fY291bnQsIHVpbnQsCisJJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtX2FycmF5KG5vdF9ydW5fcmVhZHksIHVpbnQsCisJJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGlucHV0X2VtcHR5LCB1aW50LAorCSZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisKK21vZHVsZV9wYXJhbV9hcnJheShtYXhfZ2V0X2ZyYW1lX2ludGVydmFsLCB1aW50LAorCSZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisKK21vZHVsZV9wYXJhbV9hcnJheShzdGVwLCB1aW50LCAmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCittb2R1bGVfcGFyYW1fYXJyYXkocmVmX2ZyYW1lX21hcmtfZmxhZywgdWludCwgJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtKGRpc3BfdmZyYW1lX3ZhbHZlX2xldmVsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGlzcF92ZnJhbWVfdmFsdmVfbGV2ZWwsICJcbiBkaXNwX3ZmcmFtZV92YWx2ZV9sZXZlbFxuIik7CisKK21vZHVsZV9wYXJhbShkb3VibGVfd3JpdGVfbW9kZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRvdWJsZV93cml0ZV9tb2RlLCAiXG4gZG91YmxlX3dyaXRlX21vZGVcbiIpOworCittb2R1bGVfcGFyYW0obWVtX21hcF9tb2RlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobWVtX21hcF9tb2RlLCAiXG4gbWVtX21hcF9tb2RlXG4iKTsKKworbW9kdWxlX3BhcmFtKHdpdGhvdXRfZGlzcGxheV9tb2RlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Mod2l0aG91dF9kaXNwbGF5X21vZGUsICJcbiB3aXRob3V0X2Rpc3BsYXlfbW9kZVxuIik7CisKK21vZHVsZV9wYXJhbShjaGVja19zbGljZV9udW0sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhjaGVja19zbGljZV9udW0sICJcbiBjaGVja19zbGljZV9udW1cbiIpOworCittb2R1bGVfcGFyYW0obWJfY291bnRfdGhyZXNob2xkLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobWJfY291bnRfdGhyZXNob2xkLCAiXG4gbWJfY291bnRfdGhyZXNob2xkXG4iKTsKKworbW9kdWxlX3BhcmFtKGxvb3BfcGxheWJhY2tfcG9jX3RocmVzaG9sZCwgaW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobG9vcF9wbGF5YmFja19wb2NfdGhyZXNob2xkLCAiXG4gbG9vcF9wbGF5YmFja19wb2NfdGhyZXNob2xkXG4iKTsKKworbW9kdWxlX3BhcmFtKHBvY190aHJlc2hvbGQsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBvY190aHJlc2hvbGQsICJcbiBwb2NfdGhyZXNob2xkXG4iKTsKKworbW9kdWxlX3BhcmFtKGZvcmNlX2NvbmZpZ19mZW5jZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2NvbmZpZ19mZW5jZSwgIlxuIGZvcmNlIGVuYWJsZSBmZW5jZVxuIik7CisKK21vZHVsZV9wYXJhbShkaXJ0eV9hZ2Fpbl90aHJlc2hvbGQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkaXJ0eV9hZ2Fpbl90aHJlc2hvbGQsICJcbiBhbXZkZWNfaDI2NCBkaXJ0eV9hZ2Fpbl90aHJlc2hvbGRcbiIpOworCittb2R1bGVfaW5pdChhbW12ZGVjX2gyNjRfZHJpdmVyX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGFtbXZkZWNfaDI2NF9kcml2ZXJfcmVtb3ZlX21vZHVsZSk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQU1MT0dJQyBIMjY0IFZpZGVvIERlY29kZXIgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvaDI2NS9NYWtlZmlsZSBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9oMjY1L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YjhiODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvaDI2NS9NYWtlZmlsZQpAQCAtMCwwICsxLDIgQEAKK29iai0kKENPTkZJR19BTUxPR0lDX01FRElBX1ZERUNfSDI2NSkgKz0gYW12ZGVjX2gyNjUubworYW12ZGVjX2gyNjUtb2JqcyArPSB2aDI2NS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvaDI2NS92aDI2NS5jIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL2gyNjUvdmgyNjUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTk0NWNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL2gyNjUvdmgyNjUuYwpAQCAtMCwwICsxLDE2MjI3IEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL2FtcG9ydHMvdmgyNjUuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2RlZmluZSBERUJVRworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy9hbXN0cmVhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmZvcm1hdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZnJhbWVfc3luYy9wdHNzZXJ2Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jYW52YXMvY2FudmFzLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3Byb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3JlY2VpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtY29udGlndW91cy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisvLyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL3RlZS5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvdGVlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQvY2xvY2suaD4KKyNpbmNsdWRlICIuLi8uLi8uLi9zdHJlYW1faW5wdXQvYW1wb3J0cy9hbXBvcnRzX3ByaXYuaCIKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvZGVjX21tLmg+CisjaW5jbHVkZSAiLi4vdXRpbHMvZGVjb2Rlcl9tbXVfYm94LmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvZGVjb2Rlcl9ibW11X2JveC5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2NvbmZpZ19wYXJzZXIuaCIKKyNpbmNsdWRlICIuLi91dGlscy9maXJtd2FyZS5oIgorI2luY2x1ZGUgIi4uLy4uLy4uL2NvbW1vbi9jaGlwcy9kZWNvZGVyX2NwdV92ZXJfaW5mby5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL3ZkZWNfdjRsMl9idWZmZXJfb3BzLmgiCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1tZW0ybWVtLmg+CisKKy8qCit0byBlbmFibGUgRFYgb2YgZnJhbWUgbW9kZQorI2RlZmluZSBET0xCWV9NRVRBX1NVUFBPUlQgaW4gdWNvZGUKKyovCisKKyNkZWZpbmUgSEVWQ184S19MRlRPRkZTRVRfRklYCisjZGVmaW5lIFNVUFBPUlRfTE9OR19URVJNX1JQUworCisvLyNkZWZpbmUgQ09fTVZfQ09NUFJFU1MKKworI2RlZmluZSBDT05TVFJBSU5fTUFYX0JVRl9OVU0KKworI2RlZmluZSBTV0FQX0hFVkNfVUNPREUKKyNkZWZpbmUgREVUUkVGSUxMX0VOQUJMRQorCisjZGVmaW5lIEFHQUlOX0hBU19USFJFU0hPTEQKKy8qI2RlZmluZSBURVNUX05PX0JVRiovCisjZGVmaW5lIEhFVkNfUElDX1NUUlVDVF9TVVBQT1JUCisjZGVmaW5lIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKyNkZWZpbmUgVVNFX1VOSU5JVF9TRU1BCisKKwkJCS8qIC5idWZfc2l6ZSA9IDB4MTAwMDAwKjE2LAorCQkJLy80azJrICwgMHgxMDAwMDAgcGVyIGJ1ZmZlciAqLworCQkJLyogNDA5NngyMzA0ICwgMHgxMjAwMDAgcGVyIGJ1ZmZlciAqLworI2RlZmluZSBNUFJFRF84S19NVl9CVUZfU0laRQkJKDB4MTIwMDAwKjQpCisjZGVmaW5lIE1QUkVEXzRLX01WX0JVRl9TSVpFCQkoMHgxMjAwMDApCisjZGVmaW5lIE1QUkVEX01WX0JVRl9TSVpFCQkoMHgzZmMwMCkKKworI2RlZmluZSBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfMTA4MFAgIDB4MTAwMDAKKyNkZWZpbmUgTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFXzRLICAweDQ4MDAwCisjZGVmaW5lIE1NVV9DT01QUkVTU19IRUFERVJfU0laRV84SyAgMHgxMjAwMDAKKyNkZWZpbmUgREJfTlVNIDIwCisKKyNkZWZpbmUgTUFYX0ZSQU1FXzRLX05VTSAweDEyMDAKKyNkZWZpbmUgTUFYX0ZSQU1FXzhLX05VTSAoKE1BWF9GUkFNRV80S19OVU0pICogNCkKKworLy8jZGVmaW5lIEZSQU1FX01NVV9NQVBfU0laRSAgKE1BWF9GUkFNRV80S19OVU0gKiA0KQorI2RlZmluZSBIMjY1X01NVV9NQVBfQlVGRkVSICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfNworCisjZGVmaW5lIEhFVkNfQVNTSVNUX01NVV9NQVBfQUREUiAgICAgICAgICAgICAgICAgICAweDMwMDkKKworI2RlZmluZSBIRVZDX0NNX0hFQURFUl9TVEFSVF9BRERSICAgICAgICAgICAgICAgICAgMHgzNjI4CisjZGVmaW5lIEhFVkNfQ01fSEVBREVSX1NUQVJUX0FERFIyICAgICAgICAgICAgICAgICAweDM2NGEKKyNkZWZpbmUgSEVWQ19TQU9fTU1VX1ZIMV9BRERSICAgICAgICAgICAgICAgICAgICAgIDB4MzYzYgorI2RlZmluZSBIRVZDX1NBT19NTVVfVkgwX0FERFIgICAgICAgICAgICAgICAgICAgICAgMHgzNjNhCisjZGVmaW5lIEhFVkNfU0FPX01NVV9WSDBfQUREUjIgICAgICAgICAgICAgICAgICAgICAweDM2NGQKKyNkZWZpbmUgSEVWQ19TQU9fTU1VX1ZIMV9BRERSMiAgICAgICAgICAgICAgICAgICAgIDB4MzY0ZQorCisjZGVmaW5lIEhFVkNfU0FPX01NVV9ETUFfQ1RSTDIgICAgICAgICAgICAgICAgICAgICAweDM2NGMKKyNkZWZpbmUgSEVWQ19TQU9fTU1VX1NUQVRVUzIgICAgICAgICAgICAgICAgICAgICAgIDB4MzY1MAorI2RlZmluZSBIRVZDX0RXX1ZIMF9BREREUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNjVlCisjZGVmaW5lIEhFVkNfRFdfVkgxX0FERERSICAgICAgICAgICAgICAgICAgICAgICAgICAweDM2NWYKKworI2RlZmluZSBIRVZDX0RCTEtfQ0ZHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNTBiCisjZGVmaW5lIEhFVkNEX01QUF9ERUNPTVBfQVhJVVJHX0NUTCAgICAgICAgICAgICAgICAweDM0YzcKKyNkZWZpbmUgU1dBUF9IRVZDX09GRlNFVCAoMyAqIDB4MTAwMCkKKworI2RlZmluZSBNRU1fTkFNRSAiY29kZWNfMjY1IgorLyogI2luY2x1ZGUgPG1hY2gvYW1fcmVncy5oPiAqLworI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmRlY19yZWcuaD4KKworI2luY2x1ZGUgIi4uL3V0aWxzL3ZkZWMuaCIKKyNpbmNsdWRlICIuLi91dGlscy9hbXZkZWMuaCIKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZpZGVvX3NpbmsvdmlkZW8uaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvbmZpZ3MuaD4KKyNpbmNsdWRlICIuLi91dGlscy92ZGVjX2ZlYXR1cmUuaCIKKworI2RlZmluZSBTRU5EX0xNRU1fV0lUSF9SUE0KKyNkZWZpbmUgU1VQUE9SVF8xMEJJVAorI2RlZmluZSBIMjY1XzEwQl9NTVVfRFcKKy8qICNkZWZpbmUgRVJST1JfSEFORExFX0RFQlVHICovCisKKyNpZm5kZWYgU1RBVF9LVEhSRUFECisjZGVmaW5lIFNUQVRfS1RIUkVBRCAweDQwCisjZW5kaWYKKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKyNkZWZpbmUgTUFYX0RFQ09ERV9JTlNUQU5DRV9OVU0gICAgIDkKKyNkZWZpbmUgTVVMVElfRFJJVkVSX05BTUUgImFtbXZkZWNfaDI2NSIKKyNlbmRpZgorI2RlZmluZSBEUklWRVJfTkFNRSAiYW12ZGVjX2gyNjUiCisjZGVmaW5lIERSSVZFUl9IRUFERVJfTkFNRSAiYW12ZGVjX2gyNjVfaGVhZGVyIgorCisjZGVmaW5lIFBVVF9JTlRFUlZBTCAgICAgICAgKEhaLzEwMCkKKyNkZWZpbmUgRVJST1JfU1lTVEVNX1JFU0VUX0NPVU5UICAgMjAwCisKKyNkZWZpbmUgUFRTX05PUk1BTCAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBUU19OT05FX1JFRl9VU0VfRFVSQVRJT04gMQorCisjZGVmaW5lIFBUU19NT0RFX1NXSVRDSElOR19USFJFU0hPTEQgICAgICAgICAgIDMKKyNkZWZpbmUgUFRTX01PREVfU1dJVENISU5HX1JFQ09WRVJZX1RIUkVBU0hPTEQgMworCisjZGVmaW5lIERVUjJQVFMoeCkgKCh4KSo5MC85NikKKworI2RlZmluZSBNQVhfU0laRV84SyAoODE5MiAqIDQ2MDgpCisjZGVmaW5lIE1BWF9TSVpFXzRLICg0MDk2ICogMjMwNCkKKyNkZWZpbmUgTUFYX1NJWkVfMksgKDE5MjAgKiAxMDg4KQorCisjZGVmaW5lIElTXzhLX1NJWkUodywgaCkgICgoKHcpICogKGgpKSA+IE1BWF9TSVpFXzRLKQorI2RlZmluZSBJU180S19TSVpFKHcsIGgpICAoKCh3KSAqIChoKSkgPiAoMTkyMCoxMDg4KSkKKworI2RlZmluZSBTRUlfVXNlckRhdGFJVFVfVF9UMzUJNAorI2RlZmluZSBJTlZBTElEX0lEWCAtMSAgLyogSW52YWxpZCBidWZmZXIgaW5kZXguKi8KKworc3RhdGljIHN0cnVjdCBzZW1hcGhvcmUgaDI2NV9zZW1hOworCitzdHJ1Y3QgaGV2Y19zdGF0ZV9zOworc3RhdGljIGludCBoZXZjX3ByaW50KHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsCisJaW50IGRlYnVnX2ZsYWcsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK3N0YXRpYyBpbnQgaGV2Y19wcmludF9jb250KHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsCisJaW50IGRlYnVnX2ZsYWcsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK3N0YXRpYyBpbnQgdmgyNjVfdmZfc3RhdGVzKHN0cnVjdCB2ZnJhbWVfc3RhdGVzICpzdGF0ZXMsIHZvaWQgKik7CitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2aDI2NV92Zl9wZWVrKHZvaWQgKik7CitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2aDI2NV92Zl9nZXQodm9pZCAqKTsKK3N0YXRpYyB2b2lkIHZoMjY1X3ZmX3B1dChzdHJ1Y3QgdmZyYW1lX3MgKiwgdm9pZCAqKTsKK3N0YXRpYyBpbnQgdmgyNjVfZXZlbnRfY2IoaW50IHR5cGUsIHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGVfZGF0YSk7CisKK3N0YXRpYyBpbnQgdmgyNjVfc3RvcChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKTsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCitzdGF0aWMgaW50IHZtaDI2NV9zdG9wKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpOworc3RhdGljIHMzMiB2aDI2NV9pbml0KHN0cnVjdCB2ZGVjX3MgKnZkZWMpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcnVuX3JlYWR5KHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHVuc2lnbmVkIGxvbmcgbWFzayk7CitzdGF0aWMgdm9pZCByZXNldF9wcm9jZXNzX3RpbWUoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Yyk7CitzdGF0aWMgdm9pZCBzdGFydF9wcm9jZXNzX3RpbWUoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Yyk7CitzdGF0aWMgdm9pZCByZXN0YXJ0X3Byb2Nlc3NfdGltZShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKTsKK3N0YXRpYyB2b2lkIHRpbWVvdXRfcHJvY2VzcyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKTsKKyNlbHNlCitzdGF0aWMgczMyIHZoMjY1X2luaXQoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Yyk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIHZoMjY1X3Byb3RfaW5pdChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKTsKK3N0YXRpYyBpbnQgdmgyNjVfbG9jYWxfaW5pdChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKTsKK3N0YXRpYyB2b2lkIHZoMjY1X2NoZWNrX3RpbWVyX2Z1bmMoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKTsKK3N0YXRpYyB2b2lkIGNvbmZpZ19kZWNvZGVfbW9kZShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKTsKK3N0YXRpYyBpbnQgY2hlY2tfZGF0YV9zaXplKHN0cnVjdCB2ZGVjX3MgKnZkZWMpOworCisKK3N0YXRpYyBjb25zdCBjaGFyIHZoMjY1X2RlY19pZFtdID0gInZoMjY1LWRldiI7CisKKyNkZWZpbmUgUFJPVklERVJfTkFNRSAgICJkZWNvZGVyLmgyNjUiCisjZGVmaW5lIE1VTFRJX0lOU1RBTkNFX1BST1ZJREVSX05BTUUgICAgInZkZWMuaDI2NSIKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2ZnJhbWVfb3BlcmF0aW9uc19zIHZoMjY1X3ZmX3Byb3ZpZGVyID0geworCS5wZWVrID0gdmgyNjVfdmZfcGVlaywKKwkuZ2V0ID0gdmgyNjVfdmZfZ2V0LAorCS5wdXQgPSB2aDI2NV92Zl9wdXQsCisJLmV2ZW50X2NiID0gdmgyNjVfZXZlbnRfY2IsCisJLnZmX3N0YXRlcyA9IHZoMjY1X3ZmX3N0YXRlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3Byb3ZpZGVyX3MgdmgyNjVfdmZfcHJvdjsKKworc3RhdGljIHUzMiBiaXRfZGVwdGhfbHVtYTsKK3N0YXRpYyB1MzIgYml0X2RlcHRoX2Nocm9tYTsKK3N0YXRpYyB1MzIgdmlkZW9fc2lnbmFsX3R5cGU7CitzdGF0aWMgaW50IHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwgPSAweDgwMDA7CitzdGF0aWMgdW5zaWduZWQgaW50IGRlY29kZV90aW1lb3V0X3ZhbCA9IDIwMDsKKworc3RhdGljIHUzMiBydW5fcmVhZHlfbWluX2J1Zl9udW0gPSAyOworc3RhdGljIHUzMiBkaXNhYmxlX2lwX21vZGU7CitzdGF0aWMgdTMyIHByaW50X2xjdV9lcnJvciA9IDE7CisvKmRhdGFfcmVzZW5kX3BvbGljeToKKwliaXQgMCwgc3RyZWFtIGJhc2UgcmVzZW5kIGRhdGEgd2hlbiBkZWNvZGluZyBidWYgZW1wdHkKKyovCitzdGF0aWMgdTMyIGRhdGFfcmVzZW5kX3BvbGljeSA9IDE7CitzdGF0aWMgaW50IHBvY19udW1fbWFyZ2luID0gMTAwMDsKK3N0YXRpYyBpbnQgcG9jX2Vycm9yX2xpbWl0ID0gMzA7CisKK3N0YXRpYyB1MzIgZGlydHlfYWdhaW5fdGhyZXNob2xkID0gMTAwOworc3RhdGljIHUzMiBkaXJ0eV9idWZmZXJzaXplX3RocmVzaG9sZCA9IDB4ODAwMDAwOworCisKKyNkZWZpbmUgVklERU9fU0lHTkFMX1RZUEVfQVZBSUxBQkxFX01BU0sJMHgyMDAwMDAwMAorLyoKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmlkZW9fZm9ybWF0X25hbWVzW10gPSB7CisJImNvbXBvbmVudCIsICJQQUwiLCAiTlRTQyIsICJTRUNBTSIsCisJIk1BQyIsICJ1bnNwZWNpZmllZCIsICJ1bnNwZWNpZmllZCIsICJ1bnNwZWNpZmllZCIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY29sb3JfcHJpbWFyaWVzX25hbWVzW10gPSB7CisJInVua25vd24iLCAiYnQ3MDkiLCAidW5kZWYiLCAidW5rbm93biIsCisJImJ0NDcwbSIsICJidDQ3MGJnIiwgInNtcHRlMTcwbSIsICJzbXB0ZTI0MG0iLAorCSJmaWxtIiwgImJ0MjAyMCIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzX25hbWVzW10gPSB7CisJInVua25vd24iLCAiYnQ3MDkiLCAidW5kZWYiLCAidW5rbm93biIsCisJImJ0NDcwbSIsICJidDQ3MGJnIiwgInNtcHRlMTcwbSIsICJzbXB0ZTI0MG0iLAorCSJsaW5lYXIiLCAibG9nMTAwIiwgImxvZzMxNiIsICJpZWM2MTk2Ni0yLTQiLAorCSJidDEzNjFlIiwgImllYzYxOTY2LTItMSIsICJidDIwMjAtMTAiLCAiYnQyMDIwLTEyIiwKKwkic21wdGUtc3QtMjA4NCIsICJzbXB0ZS1zdC00MjgiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1hdHJpeF9jb2VmZnNfbmFtZXNbXSA9IHsKKwkiR0JSIiwgImJ0NzA5IiwgInVuZGVmIiwgInVua25vd24iLAorCSJmY2MiLCAiYnQ0NzBiZyIsICJzbXB0ZTE3MG0iLCAic21wdGUyNDBtIiwKKwkiWUNnQ28iLCAiYnQyMDIwbmMiLCAiYnQyMDIwYyIKK307CisqLworI2lmZGVmIFNVUFBPUlRfMTBCSVQKKyNkZWZpbmUgSEVWQ19DTV9CT0RZX1NUQVJUX0FERFIgICAgICAgICAgICAgICAgICAgIDB4MzYyNgorI2RlZmluZSBIRVZDX0NNX0JPRFlfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgMHgzNjI3CisjZGVmaW5lIEhFVkNfQ01fSEVBREVSX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgICAweDM2MjkKKyNkZWZpbmUgSEVWQ19DTV9IRUFERVJfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgIDB4MzYyYgorI2RlZmluZSBIRVZDX1NBT19DVFJMOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNjJkCisKKyNkZWZpbmUgSEVWQ19DTV9CT0RZX0xFTkdUSDIgICAgICAgICAgICAgICAgICAgICAgIDB4MzY2MworI2RlZmluZSBIRVZDX0NNX0hFQURFUl9PRkZTRVQyICAgICAgICAgICAgICAgICAgICAgMHgzNjY0CisjZGVmaW5lIEhFVkNfQ01fSEVBREVSX0xFTkdUSDIgICAgICAgICAgICAgICAgICAgICAweDM2NjUKKworI2RlZmluZSBMT1NMRVNTX0NPTVBSRVNTX01PREUKKy8qIERPVUJMRV9XUklURV9NT0RFIGlzIGVuYWJsZWQgb25seSB3aGVuIE5WMjEgOCBiaXQgb3V0cHV0IGlzIG5lZWRlZCAqLworLyogZG91YmxlX3dyaXRlX21vZGU6CisgKgkwLCBubyBkb3VibGUgd3JpdGU7CisgKgkxLCAxOjEgcmF0aW87CisgKgkyLCAoMS80KTooMS80KSByYXRpbzsKKyAqCTMsICgxLzQpOigxLzQpIHJhdGlvLCB3aXRoIGJvdGggY29tcHJlc3NlZCBmcmFtZSBpbmNsdWRlZAorICoJNCwgKDEvMik6KDEvMikgcmF0aW87CisgKgk1LCAoMS8yKTooMS8yKSByYXRpbywgd2l0aCBib3RoIGNvbXByZXNzZWQgZnJhbWUgaW5jbHVkZWQKKyAqCTgsICgxLzgpOigxLzgpIHJhdGlvLCAgZnJvbSB0NworICoJMHgxMCwgZG91YmxlIHdyaXRlIG9ubHkKKyAqCTB4MTAwLCBpZiA+IDEwODBwLHVzZSBtb2RlIDQsZWxzZSB1c2UgbW9kZSAxOworICoJMHgyMDAsIGlmID4gMTA4MHAsdXNlIG1vZGUgMixlbHNlIHVzZSBtb2RlIDE7CisgKgkweDMwMCwgaWYgPiA3MjBwLCB1c2UgbW9kZSA0LCBlbHNlIHVzZSBtb2RlIDE7CisgKgkweDEwMDAsaWYgPiAxMDgwcCx1c2UgbW9kZSAzLCBlbHNlIGlmID4gOTYwKjU0MCwgdXNlIG1vZGUgNCwgZWxzZSB1c2UgbW9kZSAxOworICovCitzdGF0aWMgdTMyIGRvdWJsZV93cml0ZV9tb2RlOworCisvKiNkZWZpbmUgREVDT01QX0hFQURSX1NVUkdFTlQqLworCitzdGF0aWMgdTMyIG1lbV9tYXBfbW9kZTsgLyogMDpsaW5lYXIgMTozMngzMiAyOjY0eDMyIDsgbThiYWJ5IHRlc3QxOTAyICovCitzdGF0aWMgdTMyIGVuYWJsZV9tZW1fc2F2aW5nID0gMTsKK3N0YXRpYyB1MzIgd29ya2Fyb3VuZF9lbmFibGU7CitzdGF0aWMgdTMyIGZvcmNlX3dfaDsKKyNlbmRpZgorc3RhdGljIHUzMiBmb3JjZV9mcHM7CitzdGF0aWMgdTMyIHB0c191bnN0YWJsZTsKKyNkZWZpbmUgSDI2NV9ERUJVR19CVUZNR1IgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBIMjY1X0RFQlVHX0JVRk1HUl9NT1JFICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEgyNjVfREVCVUdfREVUQUlMICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgSDI2NV9ERUJVR19SRUcgICAgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBIMjY1X0RFQlVHX01BTl9TRUFSQ0hfTkFMICAgICAgICAgICAweDEwCisjZGVmaW5lIEgyNjVfREVCVUdfTUFOX1NLSVBfTkFMICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgSDI2NV9ERUJVR19ESVNQTEFZX0NVUl9GUkFNRSAgICAgICAgMHg0MAorI2RlZmluZSBIMjY1X0RFQlVHX0ZPUkNFX0NMSyAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIEgyNjVfREVCVUdfU0VORF9QQVJBTV9XSVRIX1JFRyAgICAgIDB4MTAwCisjZGVmaW5lIEgyNjVfREVCVUdfTk9fRElTUExBWSAgICAgICAgICAgICAgIDB4MjAwCisjZGVmaW5lIEgyNjVfREVCVUdfRElTQ0FSRF9OQUwgICAgICAgICAgICAgIDB4NDAwCisjZGVmaW5lIEgyNjVfREVCVUdfT1VUX1BUUyAgICAgICAgICAgICAgICAgIDB4ODAwCisjZGVmaW5lIEgyNjVfREVCVUdfRFVNUF9QSUNfTElTVCAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBIMjY1X0RFQlVHX1BSSU5UX1NFSQkJICAgICAgICAweDIwMDAKKyNkZWZpbmUgSDI2NV9ERUJVR19QSUNfU1RSVUNUCQkJCTB4NDAwMAorI2RlZmluZSBIMjY1X0RFQlVHX0hBU19BVVhfSU5fU0xJQ0UJCQkweDgwMDAKKyNkZWZpbmUgSDI2NV9ERUJVR19ESVNfTE9DX0VSUk9SX1BST0MgICAgICAgMHgxMDAwMAorI2RlZmluZSBIMjY1X0RFQlVHX0RJU19TWVNfRVJST1JfUFJPQyAgICAgICAweDIwMDAwCisjZGVmaW5lIEgyNjVfTk9fQ0hBTkdfREVCVUdfRkxBR19JTl9DT0RFICAgIDB4NDAwMDAKKyNkZWZpbmUgSDI2NV9ERUJVR19UUklHX1NMSUNFX1NFR01FTlRfUFJPQyAgMHg4MDAwMAorI2RlZmluZSBIMjY1X0RFQlVHX0hXX1JFU0VUICAgICAgICAgICAgICAgICAweDEwMDAwMAorI2RlZmluZSBIMjY1X0NGR19DQU5WQVNfSU5fREVDT0RFICAgICAgICAgICAweDIwMDAwMAorI2RlZmluZSBIMjY1X0RFQlVHX0RWICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMAorI2RlZmluZSBIMjY1X0RFQlVHX05PX0VPU19TRUFSQ0hfRE9ORSAgICAgICAweDgwMDAwMAorI2RlZmluZSBIMjY1X0RFQlVHX05PVF9VU0VfTEFTVF9ESVNQQlVGICAgICAweDEwMDAwMDAKKyNkZWZpbmUgSDI2NV9ERUJVR19JR05PUkVfQ09ORk9STUFOQ0VfV0lORE9XCTB4MjAwMDAwMAorI2RlZmluZSBIMjY1X0RFQlVHX1dBSVRfREVDT0RFX0RPTkVfV0hFTl9TVE9QICAgMHg0MDAwMDAwCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorI2RlZmluZSBQUklOVF9GTEFHX0VSUk9SCQkweDAKKyNkZWZpbmUgSUdOT1JFX1BBUkFNX0ZST01fQ09ORklHCTB4MDgwMDAwMDAKKyNkZWZpbmUgUFJJTlRfRlJBTUVCQVNFX0RBVEEJCTB4MTAwMDAwMDAKKyNkZWZpbmUgUFJJTlRfRkxBR19WREVDX1NUQVRVUwkJMHgyMDAwMDAwMAorI2RlZmluZSBQUklOVF9GTEFHX1ZERUNfREVUQUlMCQkweDQwMDAwMDAwCisjZGVmaW5lIFBSSU5UX0ZMQUdfVjRMX0RFVEFJTAkJMHg4MDAwMDAwMAorI2VuZGlmCisKKyNkZWZpbmUgQlVGX1BPT0xfU0laRQkzMgorI2RlZmluZSBNQVhfQlVGX05VTSAyNAorI2RlZmluZSBNQVhfUkVGX1BJQ19OVU0gMjQKKyNkZWZpbmUgTUFYX1JFRl9BQ1RJVkUgIDE2CisKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisjZGVmaW5lIEJNTVVfTUFYX0JVRkZFUlMgKEJVRl9QT09MX1NJWkUgKyAxKQorI2RlZmluZSBWRl9CVUZGRVJfSURYKG4pCShuKQorI2RlZmluZSBCTU1VX1dPUktTUEFDRV9JRAkoQlVGX1BPT0xfU0laRSkKKyNlbHNlCisjZGVmaW5lIEJNTVVfTUFYX0JVRkZFUlMgKEJVRl9QT09MX1NJWkUgKyAxICsgTUFYX1JFRl9QSUNfTlVNKQorI2RlZmluZSBWRl9CVUZGRVJfSURYKG4pCShuKQorI2RlZmluZSBCTU1VX1dPUktTUEFDRV9JRAkoQlVGX1BPT0xfU0laRSkKKyNkZWZpbmUgTVZfQlVGRkVSX0lEWChuKSAoQlVGX1BPT0xfU0laRSArIDEgKyBuKQorI2VuZGlmCisKKyNkZWZpbmUgSEVWQ19NVl9JTkZPICAgMHgzMTBkCisjZGVmaW5lIEhFVkNfUVBfSU5GTyAgIDB4MzEzNworI2RlZmluZSBIRVZDX1NLSVBfSU5GTyAweDMxMzYKKworY29uc3QgdTMyIGgyNjVfdmVyc2lvbiA9IDIwMTYwMjEwMTsKK3N0YXRpYyB1MzIgZGVidWdfbWFzayA9IDB4ZmZmZmZmZmY7CitzdGF0aWMgdTMyIGxvZ19tYXNrOworc3RhdGljIHUzMiBkZWJ1ZzsKK3N0YXRpYyB1MzIgcmFkcjsKK3N0YXRpYyB1MzIgcnZhbDsKK3N0YXRpYyB1MzIgZGJnX2NtZDsKK3N0YXRpYyB1MzIgZHVtcF9uYWw7CitzdGF0aWMgdTMyIGRiZ19za2lwX2RlY29kZV9pbmRleDsKKy8qCisgKiBiaXQgMH4zLCBmb3IgSEVWQ0RfSVBQX0FYSUlGX0NPTkZJRyBlbmRpYW4gY29uZmlnCisgKiBiaXQgOH4yMywgZm9yIEhFVkNfU0FPX0NUUkwxIGVuZGlhbiBjb25maWcKKyAqLworc3RhdGljIHUzMiBlbmRpYW47CisjZGVmaW5lIEhFVkNfQ09ORklHX0JJR19FTkRJQU4gICAgICgoMHg4ODAgPDwgOCkgfCAweDgpCisjZGVmaW5lIEhFVkNfQ09ORklHX0xJVFRMRV9FTkRJQU4gICgoMHhmZjAgPDwgOCkgfCAweGYpCisKKyNpZmRlZiBFUlJPUl9IQU5ETEVfREVCVUcKK3N0YXRpYyB1MzIgZGJnX25hbF9za2lwX2ZsYWc7CisJCS8qIGJpdFswXSwgc2tpcCB2cHM7IGJpdFsxXSwgc2tpcCBzcHM7IGJpdFsyXSwgc2tpcCBwcHMgKi8KK3N0YXRpYyB1MzIgZGJnX25hbF9za2lwX2NvdW50OworI2VuZGlmCisvKmZvciBkZWJ1ZyovCitzdGF0aWMgdTMyIGZvcmNlX2J1ZnNwZWM7CisKKy8qCisJdWRlYnVnX2ZsYWc6CisJYml0IDAsIGVuYWJsZSB1Y29kZSBwcmludAorCWJpdCAxLCBlbmFibGUgdWNvZGUgZGV0YWlsIHByaW50CisJYml0IFszMToxNl0gbm90IDAsIHBvcyB0byBkdW1wIGxtZW0KKwkJYml0IDIsIHBvcCBiaXRzIHRvIGxtZW0KKwkJYml0IFsxMTo4XSwgcHJlLXBvcCBiaXRzIGZvciBhbGlnbm1lbnQgKHdoZW4gYml0IDIgaXMgMSkKKyovCitzdGF0aWMgdTMyIHVkZWJ1Z19mbGFnOworLyoKKwl3aGVuIHVkZWJ1Z19mbGFnWzE6MF0gaXMgbm90IDAKKwl1ZGVidWdfcGF1c2VfcG9zIG5vdCAwLAorCQlwYXVzZSBwb3NpdGlvbgorKi8KK3N0YXRpYyB1MzIgdWRlYnVnX3BhdXNlX3BvczsKKy8qCisJd2hlbiB1ZGVidWdfZmxhZ1sxOjBdIGlzIG5vdCAwCisJYW5kIHVkZWJ1Z19wYXVzZV9wb3MgaXMgbm90IDAsCisJCXBhdXNlIG9ubHkgd2hlbiBERUJVR19SRUcyIGlzIGVxdWFsIHRvIHRoaXMgdmFsCisqLworc3RhdGljIHUzMiB1ZGVidWdfcGF1c2VfdmFsOworCitzdGF0aWMgdTMyIHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4OworCitzdGF0aWMgdTMyIGRlY29kZV9waWNfYmVnaW47CitzdGF0aWMgdWludCBzbGljZV9wYXJzZV9iZWdpbjsKK3N0YXRpYyB1MzIgc3RlcDsKK3N0YXRpYyBib29sIGlzX3Jlc2V0OworCisjaWZkZWYgQ09OU1RSQUlOX01BWF9CVUZfTlVNCitzdGF0aWMgdTMyIHJ1bl9yZWFkeV9tYXhfdmZfb25seV9udW07CitzdGF0aWMgdTMyIHJ1bl9yZWFkeV9kaXNwbGF5X3FfbnVtOworCS8qMDogbm90IGNoZWNrCisJICAweGZmOiB3b3JrX3BpY19udW0KKwkgICovCitzdGF0aWMgdTMyIHJ1bl9yZWFkeV9tYXhfYnVmX251bSA9IDB4ZmY7CisjZW5kaWYKKworc3RhdGljIHUzMiBkeW5hbWljX2J1Zl9udW1fbWFyZ2luID0gNzsKK3N0YXRpYyB1MzIgYnVmX2FsbG9jX3dpZHRoOworc3RhdGljIHUzMiBidWZfYWxsb2NfaGVpZ2h0OworCitzdGF0aWMgdTMyIG1heF9idWZfbnVtID0gMTY7CitzdGF0aWMgdTMyIGJ1Zl9hbGxvY19zaXplOworLypzdGF0aWMgdTMyIHJlX2NvbmZpZ19waWNfZmxhZzsqLworLyoKKyAqYml0WzBdOiAwLAorICpiaXRbMV06IDAsIGFsd2F5cyByZWxlYXNlIGNtYSBidWZmZXIgd2hlbiBzdG9wCisgKmJpdFsxXTogMSwgbmV2ZXIgcmVsZWFzZSBjbWEgYnVmZmVyIHdoZW4gc3RvcAorICpiaXRbMF06IDEsIHdoZW4gc3RvcCwgcmVsZWFzZSBjbWEgYnVmZmVyIGlmIGJsYWNrb3V0IGlzIDE7CisgKmRvIG5vdCByZWxlYXNlIGNtYSBidWZmZXIgaXMgYmxhY2tvdXQgaXMgbm90IDEKKyAqCisgKmJpdFsyXTogMCwgd2hlbiBzdGFydCBkZWNvZGluZywgY2hlY2sgY3VycmVudCBkaXNwbGF5ZWQgYnVmZmVyCisgKgkgKG9ubHkgZm9yIGJ1ZmZlciBkZWNvZGVkIGJ5IGgyNjUpIGlmIGJsYWNrb3V0IGlzIDAKKyAqCSAxLCBkbyBub3QgY2hlY2sgY3VycmVudCBkaXNwbGF5ZWQgYnVmZmVyCisgKgorICpiaXRbM106IDEsIGlmIGJsYWNrb3V0IGlzIG5vdCAxLCBkbyBub3QgcmVsZWFzZSBjdXJyZW50CisgKgkJCWRpc3BsYXllZCBjbWEgYnVmZmVyIGFsd2F5cy4KKyAqLworLyogc2V0IHRvIDEgZm9yIGZhc3QgcGxheTsKKyAqCXNldCB0byA4IGZvciBvdGhlciBjYXNlIG9mICJrZWVwIGxhc3QgZnJhbWUiCisgKi8KK3N0YXRpYyB1MzIgYnVmZmVyX21vZGUgPSAxOworCisvKiBidWZmZXJfbW9kZV9kYmc6IGRlYnVnIG9ubHkqLworc3RhdGljIHUzMiBidWZmZXJfbW9kZV9kYmcgPSAweGZmZmYwMDAwOworLyoqLworLyoKKyAqYml0WzE6MF1QQl9za2lwX21vZGU6IDAsIHN0YXJ0IGRlY29kaW5nIGF0IGJlZ2luOworICoxLCBzdGFydCBkZWNvZGluZyBhZnRlciBmaXJzdCBJOworICoyLCBvbmx5IGRlY29kZSBhbmQgZGlzcGxheSBub25lIGVycm9yIHBpY3R1cmU7CisgKjMsIHN0YXJ0IGRlY29kaW5nIGFuZCBkaXNwbGF5IGFmdGVyIElEUixldGMKKyAqYml0WzMxOjE2XSBQQl9za2lwX2NvdW50X2FmdGVyX2RlY29kaW5nIChkZWNvZGluZyBidXQgbm90IGRpc3BsYXkpLAorICpvbmx5IGZvciBtb2RlIDAgYW5kIDEuCisgKi8KK3N0YXRpYyB1MzIgbmFsX3NraXBfcG9saWN5ID0gMjsKKworLyoKKyAqYml0IDAsIDE6IG9ubHkgZGlzcGxheSBJIHBpY3R1cmU7CisgKmJpdCAxLCAxOiBvbmx5IGRlY29kZSBJIHBpY3R1cmU7CisgKi8KK3N0YXRpYyB1MzIgaV9vbmx5X2ZsYWc7CitzdGF0aWMgdTMyIHNraXBfbmFsX2NvdW50ID0gNTAwOworLyoKK2JpdCAwLCBmYXN0IG91dHB1dCBmaXJzdCBJIHBpY3R1cmUKKyovCitzdGF0aWMgdTMyIGZhc3Rfb3V0cHV0X2VuYWJsZSA9IDE7CisKK3N0YXRpYyB1MzIgZnJtYmFzZV9jb250X2JpdGxldmVsID0gMHg2MDsKKworLyoKK3VzZV9jbWE6IDEsIHVzZSBib3RoIHJlc2VydmVyIG1lbW9yeSBhbmQgY21hIGZvciBidWZmZXJzCisyLCBvbmx5IHVzZSBjbWEgZm9yIGJ1ZmZlcnMKKyovCitzdGF0aWMgdTMyIHVzZV9jbWEgPSAyOworCisjZGVmaW5lIEFVWF9CVUZfQUxJR04oYWRyKSAoKGFkciArIDB4ZikgJiAofjB4ZikpCisvKgorc3RhdGljIHUzMiBwcmVmaXhfYXV4X2J1Zl9zaXplID0gKDE2ICogMTAyNCk7CitzdGF0aWMgdTMyIHN1ZmZpeF9hdXhfYnVmX3NpemU7CisqLworc3RhdGljIHUzMiBwcmVmaXhfYXV4X2J1Zl9zaXplID0gKDEyICogMTAyNCk7CitzdGF0aWMgdTMyIHN1ZmZpeF9hdXhfYnVmX3NpemUgPSAoMTIgKiAxMDI0KTsKKworc3RhdGljIHUzMiBtYXhfZGVjb2RpbmdfdGltZTsKKy8qCisgKmVycm9yIGhhbmRsaW5nCisgKi8KKy8qZXJyb3JfaGFuZGxlX3BvbGljeToKKyAqYml0IDA6IDAsIGF1dG8gc2tpcCBlcnJvcl9za2lwX25hbF9jb3VudCBuYWxzIGJlZm9yZSBlcnJvciByZWNvdmVyeTsKKyAqMSwgc2tpcCBlcnJvcl9za2lwX25hbF9jb3VudCBuYWxzIGJlZm9yZSBlcnJvciByZWNvdmVyeTsKKyAqYml0IDEgKHZhbGlkIG9ubHkgd2hlbiBiaXQwID09IDEpOgorICoxLCB3YWl0IHZwcy9zcHMvcHBzIGFmdGVyIGVycm9yIHJlY292ZXJ5OworICpiaXQgMiAodmFsaWQgb25seSB3aGVuIGJpdDAgPT0gMCk6CisgKjAsIGF1dG8gc2VhcmNoIGFmdGVyIGVycm9yIHJlY292ZXJ5IChoZXZjX3JlY292ZXIoKSBjYWxsZWQpOworICoxLCBtYW51YWwgc2VhcmNoIGFmdGVyIGVycm9yIHJlY292ZXJ5CisgKihjaGFuZ2UgdG8gYXV0byBzZWFyY2ggYWZ0ZXIgZ2V0IElEUjogV1JJVEVfVlJFRyhOQUxfU0VBUkNIX0NUTCwgMHgyKSkKKyAqCisgKmJpdCA0OiAwLCBzZXQgZXJyb3JfbWFyayBhZnRlciByZXNldC9yZWNvdmVyCisgKgkxLCBkbyBub3Qgc2V0IGVycm9yX21hcmsgYWZ0ZXIgcmVzZXQvcmVjb3ZlcgorICoKKyAqYml0IDU6IDAsIGNoZWNrIHRvdGFsIGxjdSBmb3IgZXZlcnkgcGljdHVyZQorICoJMSwgZG8gbm90IGNoZWNrIHRvdGFsIGxjdQorICoKKyAqYml0IDY6IDAsIGRvIG5vdCBjaGVjayBoZWFkIGVycm9yCisgKgkxLCBjaGVjayBoZWFkIGVycm9yCisgKgorICpiaXQgNzogMCwgYWxsb3cgdG8gcHJpbnQgb3ZlciBkZWNvZGUKKyAqICAgICAgIDEsIE5PVCBhbGxvdyB0byBwcmludCBvdmVyIGRlY29kZQorICoKKyAqYml0IDg6IDAsIHVzZSBpbnRlcmxhY2UgcG9saWN5CisgKiAgICAgICAxLCBOT1QgdXNlIGludGVybGFjZSBwb2xpY3kKKyAqYml0IDk6IDAsIGRpc2NhcmQgZGlydHkgZGF0YSBvbiBwbGF5YmFjayBzdGFydAorICogICAgICAgMSwgZG8gbm90IGRpc2NhcmQgZGlydHkgZGF0YSBvbiBwbGF5YmFjayBzdGFydAorICpiaXQgMTA6MCwgd2hlbiB1Y29kZSBhbHdheXMgcmV0dXJucyBhZ2FpbiwgaXQgc3VwcG9ydHMgZGlzY2FyZGluZyBkYXRhCisgKgkJIDEsIFdoZW4gdWNvZGUgYWx3YXlzIHJldHVybnMgYWdhaW4sIGl0IGRvZXMgbm90IHN1cHBvcnQgZGlzY2FyZGluZyBkYXRhCisgKi8KKworc3RhdGljIHUzMiBlcnJvcl9oYW5kbGVfcG9saWN5Oworc3RhdGljIHUzMiBlcnJvcl9za2lwX25hbF9jb3VudCA9IDY7CitzdGF0aWMgdTMyIGVycm9yX2hhbmRsZV90aHJlc2hvbGQgPSAzMDsKK3N0YXRpYyB1MzIgZXJyb3JfaGFuZGxlX25hbF9za2lwX3RocmVzaG9sZCA9IDEwOworc3RhdGljIHUzMiBlcnJvcl9oYW5kbGVfc3lzdGVtX3RocmVzaG9sZCA9IDMwOworc3RhdGljIHUzMiBpbnRlcmxhY2VfZW5hYmxlID0gMTsKK3N0YXRpYyB1MzIgZnJfaGludF9zdGF0dXM7CisKKwkvKgorCSAqcGFyc2VyX3NlaV9lbmFibGU6CisJICogIGJpdCAwLCBzZWk7CisJICogIGJpdCAxLCBzZWlfc3VmZml4IChmaWxsIGF1eCBidWYpCisJICogIGJpdCAyLCBmaWxsIHNlaSB0byBhdXggYnVmICh3aGVuIGJpdCAwIGlzIDEpCisJICogIGJpdCA4LCBkZWJ1ZyBmbGFnCisJICovCitzdGF0aWMgdTMyIHBhcnNlcl9zZWlfZW5hYmxlOworc3RhdGljIHUzMiBwYXJzZXJfZG9sYnlfdmlzaW9uX2VuYWJsZSA9IDE7CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KK3N0YXRpYyB1MzIgZG9sYnlfbWV0YV93aXRoX2VsOworc3RhdGljIHUzMiBkb2xieV9lbF9mbHVzaF90aCA9IDI7CisjZW5kaWYKKy8qIHRoaXMgaXMgb25seSBmb3IgaDI2NSBtbXUgZW5hYmxlICovCisKK3N0YXRpYyB1MzIgbW11X2VuYWJsZSA9IDE7CitzdGF0aWMgdTMyIG1tdV9lbmFibGVfZm9yY2U7CitzdGF0aWMgdTMyIHdvcmtfYnVmX3NpemU7CitzdGF0aWMgdW5zaWduZWQgaW50IGZvcmNlX2Rpc3BfcGljX2luZGV4Oworc3RhdGljIHVuc2lnbmVkIGludCBkaXNwX3ZmcmFtZV92YWx2ZV9sZXZlbDsKK3N0YXRpYyBpbnQgcHJlX2RlY29kZV9idWZfbGV2ZWwgPSAweDEwMDA7CitzdGF0aWMgdW5zaWduZWQgaW50IHBpY19saXN0X2RlYnVnOworI2lmZGVmIEhFVkNfOEtfTEZUT0ZGU0VUX0ZJWAorCS8qIHBlcmZvcm1hbmNlX3Byb2ZpbGU6IGJpdCAwLCBtdWx0aSBzbGljZSBpbiB1Y29kZQorCSovCitzdGF0aWMgdW5zaWduZWQgaW50IHBlcmZvcm1hbmNlX3Byb2ZpbGUgPSAxOworI2VuZGlmCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorc3RhdGljIHVuc2lnbmVkIGludCBtYXhfZGVjb2RlX2luc3RhbmNlX251bQorCQkJCT0gTUFYX0RFQ09ERV9JTlNUQU5DRV9OVU07CitzdGF0aWMgdW5zaWduZWQgaW50IGRlY29kZV9mcmFtZV9jb3VudFtNQVhfREVDT0RFX0lOU1RBTkNFX05VTV07CitzdGF0aWMgdW5zaWduZWQgaW50IGRpc3BsYXlfZnJhbWVfY291bnRbTUFYX0RFQ09ERV9JTlNUQU5DRV9OVU1dOworc3RhdGljIHVuc2lnbmVkIGludCBtYXhfcHJvY2Vzc190aW1lW01BWF9ERUNPREVfSU5TVEFOQ0VfTlVNXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X2dldF9mcmFtZV9pbnRlcnZhbFtNQVhfREVDT0RFX0lOU1RBTkNFX05VTV07CitzdGF0aWMgdW5zaWduZWQgaW50IHJ1bl9jb3VudFtNQVhfREVDT0RFX0lOU1RBTkNFX05VTV07CitzdGF0aWMgdW5zaWduZWQgaW50IGlucHV0X2VtcHR5W01BWF9ERUNPREVfSU5TVEFOQ0VfTlVNXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm90X3J1bl9yZWFkeVtNQVhfREVDT0RFX0lOU1RBTkNFX05VTV07CitzdGF0aWMgdW5zaWduZWQgaW50IHJlZl9mcmFtZV9tYXJrX2ZsYWdbTUFYX0RFQ09ERV9JTlNUQU5DRV9OVU1dID0KK3sxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxfTsKKworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX01VTFRJX0RFQworc3RhdGljIHVuc2lnbmVkIGNoYXIgZ2V0X2lkeChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KK3N0YXRpYyB1MzIgZHZfdG9nZ2xlX3Byb3ZfbmFtZTsKKworc3RhdGljIHUzMiBkdl9kZWJ1ZzsKKworc3RhdGljIHUzMiBmb3JjZV9ieXBhc3NfZHZlbmw7CisjZW5kaWYKKyNlbmRpZgorCisvKgorICpbMzowXSAwOiBkZWZhdWx0IHVzZSBjb25maWcgZnJvbSBvbXguCisgKiAgICAgIDE6IGZvcmNlIGVuYWJsZSBmZW5jZS4KKyAqICAgICAgMjogZGlzYWJsZSBmZW5jZS4KKyAqWzc6NF0gMDogZmVuY2UgdXNlIGZvciBkcml2ZXIuCisgKiAgICAgIDE6IGZlbmNlIGZkIHVzZSBmb3IgYXBwLgorICovCitzdGF0aWMgdTMyIGZvcmNlX2NvbmZpZ19mZW5jZTsKKworLyoKKyAqVGhlIHBhcmFtZXRlciBzcHNfbWF4X2RlY19waWNfYnVmZmVyaW5nX21pbnVzMV8wKzEKKyAqaW4gU1BTIGlzIHRoZSBtaW5pbXVtIERQQiBzaXplIHJlcXVpcmVkIGZvciBzdHJlYW0KKyAqKG5vdGU6IHRoaXMgcGFyYW1ldGVyIGRvZXMgbm90IGluY2x1ZGUgdGhlIGZyYW1lCisgKmN1cnJlbnRseSBiZWluZyBkZWNvZGVkKSArMSAoZGVjb2RpbmcgdGhlIGN1cnJlbnQKKyAqZnJhbWUpICsxIChkZWNvZGluZyB0aGUgY3VycmVudCBmcmFtZSB3aWxsIG9ubHkKKyAqdXBkYXRlIHJlZnJlbmNlIGZyYW1lIGluZm9ybWF0aW9uLCBzdWNoIGFzIHJlZmVyZW5jZQorICpyZWxhdGlvbiwgd2hlbiB0aGUgbmV4dCBmcmFtZSBpcyBkZWNvZGVkKQorICovCitzdGF0aWMgdTMyIGRldGVjdF9zdHVja19idWZmZXJfbWFyZ2luID0gMzsKKworCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfTVVMVElfREVDCisjZGVmaW5lIGdldF9kYmdfZmxhZyhoZXZjKSAoKGRlYnVnX21hc2sgJiAoMSA8PCBoZXZjLT5pbmRleCkpID8gZGVidWcgOiAwKQorI2RlZmluZSBnZXRfZGJnX2ZsYWcyKGhldmMpICgoZGVidWdfbWFzayAmICgxIDw8IGdldF9pZHgoaGV2YykpKSA/IGRlYnVnIDogMCkKKyNkZWZpbmUgaXNfbG9nX2VuYWJsZShoZXZjKSAoKGxvZ19tYXNrICYgKDEgPDwgaGV2Yy0+aW5kZXgpKSA/IDEgOiAwKQorI2Vsc2UKKyNkZWZpbmUgZ2V0X2RiZ19mbGFnKGhldmMpIGRlYnVnCisjZGVmaW5lIGdldF9kYmdfZmxhZzIoaGV2YykgZGVidWcKKyNkZWZpbmUgaXNfbG9nX2VuYWJsZShoZXZjKSAobG9nX21hc2sgPyAxIDogMCkKKyNkZWZpbmUgZ2V0X3ZhbGlkX2RvdWJsZV93cml0ZV9tb2RlKGhldmMpIGRvdWJsZV93cml0ZV9tb2RlCisjZGVmaW5lIGdldF9idWZfYWxsb2Nfd2lkdGgoaGV2YykgYnVmX2FsbG9jX3dpZHRoCisjZGVmaW5lIGdldF9idWZfYWxsb2NfaGVpZ2h0KGhldmMpIGJ1Zl9hbGxvY19oZWlnaHQKKyNkZWZpbmUgZ2V0X2R5bmFtaWNfYnVmX251bV9tYXJnaW4oaGV2YykgZHluYW1pY19idWZfbnVtX21hcmdpbgorI2VuZGlmCisjZGVmaW5lIGdldF9idWZmZXJfbW9kZShoZXZjKSBidWZmZXJfbW9kZQorCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7CitzdHJ1Y3QgdGFza19zdHJ1Y3QgKmgyNjVfdGFzayA9IE5VTEw7CisjdW5kZWYgREVCVUdfUkVHCisjaWZkZWYgREVCVUdfUkVHCit2b2lkIFdSSVRFX1ZSRUdfREJHKHVuc2lnbmVkIGFkciwgdW5zaWduZWQgdmFsKQoreworCWlmIChkZWJ1ZyAmIEgyNjVfREVCVUdfUkVHKQorCQlwcl9pbmZvKCIlcygleCwgJXgpXG4iLCBfX2Z1bmNfXywgYWRyLCB2YWwpOworCVdSSVRFX1ZSRUcoYWRyLCB2YWwpOworfQorCisjdW5kZWYgV1JJVEVfVlJFRworI2RlZmluZSBXUklURV9WUkVHIFdSSVRFX1ZSRUdfREJHCisjZW5kaWYKK2V4dGVybiB1MzIgdHJpY2ttb2RlX2k7CisKK3N0YXRpYyBERUZJTkVfTVVURVgodmgyNjVfbXV0ZXgpOworCitzdGF0aWMgREVGSU5FX01VVEVYKHZoMjY1X2xvZ19tdXRleCk7CisKKy8vc3RhdGljIHN0cnVjdCB2ZGVjX2luZm8gKmd2czsKKworc3RhdGljIHUzMiB3aXRob3V0X2Rpc3BsYXlfbW9kZTsKKworc3RhdGljIHUzMiBtdl9idWZfZHluYW1pY19hbGxvYzsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICpoMjY1IGJ1ZmZlciBtYW5hZ2VtZW50IGluY2x1ZGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2VudW0gTmFsVW5pdFR5cGUgeworCU5BTF9VTklUX0NPREVEX1NMSUNFX1RSQUlMX04gPSAwLAkvKiAwICovCisJTkFMX1VOSVRfQ09ERURfU0xJQ0VfVFJBSUxfUiwJLyogMSAqLworCisJTkFMX1VOSVRfQ09ERURfU0xJQ0VfVFNBX04sCS8qIDIgKi8KKwkvKiBDdXJyZW50IG5hbWUgaW4gdGhlIHNwZWM6IFRTQV9SICovCisJTkFMX1VOSVRfQ09ERURfU0xJQ0VfVExBLAkvKiAzICovCisKKwlOQUxfVU5JVF9DT0RFRF9TTElDRV9TVFNBX04sCS8qIDQgKi8KKwlOQUxfVU5JVF9DT0RFRF9TTElDRV9TVFNBX1IsCS8qIDUgKi8KKworCU5BTF9VTklUX0NPREVEX1NMSUNFX1JBRExfTiwJLyogNiAqLworCS8qIEN1cnJlbnQgbmFtZSBpbiB0aGUgc3BlYzogUkFETF9SICovCisJTkFMX1VOSVRfQ09ERURfU0xJQ0VfRExQLAkvKiA3ICovCisKKwlOQUxfVU5JVF9DT0RFRF9TTElDRV9SQVNMX04sCS8qIDggKi8KKwkvKiBDdXJyZW50IG5hbWUgaW4gdGhlIHNwZWM6IFJBU0xfUiAqLworCU5BTF9VTklUX0NPREVEX1NMSUNFX1RGRCwJLyogOSAqLworCisJTkFMX1VOSVRfUkVTRVJWRURfMTAsCisJTkFMX1VOSVRfUkVTRVJWRURfMTEsCisJTkFMX1VOSVRfUkVTRVJWRURfMTIsCisJTkFMX1VOSVRfUkVTRVJWRURfMTMsCisJTkFMX1VOSVRfUkVTRVJWRURfMTQsCisJTkFMX1VOSVRfUkVTRVJWRURfMTUsCisKKwkvKiBDdXJyZW50IG5hbWUgaW4gdGhlIHNwZWM6IEJMQV9XX0xQICovCisJTkFMX1VOSVRfQ09ERURfU0xJQ0VfQkxBLAkvKiAxNiAqLworCS8qIEN1cnJlbnQgbmFtZSBpbiB0aGUgc3BlYzogQkxBX1dfRExQICovCisJTkFMX1VOSVRfQ09ERURfU0xJQ0VfQkxBTlQsCS8qIDE3ICovCisJTkFMX1VOSVRfQ09ERURfU0xJQ0VfQkxBX05fTFAsCS8qIDE4ICovCisJLyogQ3VycmVudCBuYW1lIGluIHRoZSBzcGVjOiBJRFJfV19ETFAgKi8KKwlOQUxfVU5JVF9DT0RFRF9TTElDRV9JRFIsCS8qIDE5ICovCisJTkFMX1VOSVRfQ09ERURfU0xJQ0VfSURSX05fTFAsCS8qIDIwICovCisJTkFMX1VOSVRfQ09ERURfU0xJQ0VfQ1JBLAkvKiAyMSAqLworCU5BTF9VTklUX1JFU0VSVkVEXzIyLAorCU5BTF9VTklUX1JFU0VSVkVEXzIzLAorCisJTkFMX1VOSVRfUkVTRVJWRURfMjQsCisJTkFMX1VOSVRfUkVTRVJWRURfMjUsCisJTkFMX1VOSVRfUkVTRVJWRURfMjYsCisJTkFMX1VOSVRfUkVTRVJWRURfMjcsCisJTkFMX1VOSVRfUkVTRVJWRURfMjgsCisJTkFMX1VOSVRfUkVTRVJWRURfMjksCisJTkFMX1VOSVRfUkVTRVJWRURfMzAsCisJTkFMX1VOSVRfUkVTRVJWRURfMzEsCisKKwlOQUxfVU5JVF9WUFMsCQkvKiAzMiAqLworCU5BTF9VTklUX1NQUywJCS8qIDMzICovCisJTkFMX1VOSVRfUFBTLAkJLyogMzQgKi8KKwlOQUxfVU5JVF9BQ0NFU1NfVU5JVF9ERUxJTUlURVIsCS8qIDM1ICovCisJTkFMX1VOSVRfRU9TLAkJLyogMzYgKi8KKwlOQUxfVU5JVF9FT0IsCQkvKiAzNyAqLworCU5BTF9VTklUX0ZJTExFUl9EQVRBLAkvKiAzOCAqLworCU5BTF9VTklUX1NFSSwJCS8qIDM5IFByZWZpeCBTRUkgKi8KKwlOQUxfVU5JVF9TRUlfU1VGRklYLAkvKiA0MCBTdWZmaXggU0VJICovCisJTkFMX1VOSVRfUkVTRVJWRURfNDEsCisJTkFMX1VOSVRfUkVTRVJWRURfNDIsCisJTkFMX1VOSVRfUkVTRVJWRURfNDMsCisJTkFMX1VOSVRfUkVTRVJWRURfNDQsCisJTkFMX1VOSVRfUkVTRVJWRURfNDUsCisJTkFMX1VOSVRfUkVTRVJWRURfNDYsCisJTkFMX1VOSVRfUkVTRVJWRURfNDcsCisJTkFMX1VOSVRfVU5TUEVDSUZJRURfNDgsCisJTkFMX1VOSVRfVU5TUEVDSUZJRURfNDksCisJTkFMX1VOSVRfVU5TUEVDSUZJRURfNTAsCisJTkFMX1VOSVRfVU5TUEVDSUZJRURfNTEsCisJTkFMX1VOSVRfVU5TUEVDSUZJRURfNTIsCisJTkFMX1VOSVRfVU5TUEVDSUZJRURfNTMsCisJTkFMX1VOSVRfVU5TUEVDSUZJRURfNTQsCisJTkFMX1VOSVRfVU5TUEVDSUZJRURfNTUsCisJTkFMX1VOSVRfVU5TUEVDSUZJRURfNTYsCisJTkFMX1VOSVRfVU5TUEVDSUZJRURfNTcsCisJTkFMX1VOSVRfVU5TUEVDSUZJRURfNTgsCisJTkFMX1VOSVRfVU5TUEVDSUZJRURfNTksCisJTkFMX1VOSVRfVU5TUEVDSUZJRURfNjAsCisJTkFMX1VOSVRfVU5TUEVDSUZJRURfNjEsCisJTkFMX1VOSVRfVU5TUEVDSUZJRURfNjIsCisJTkFMX1VOSVRfVU5TUEVDSUZJRURfNjMsCisJTkFMX1VOSVRfSU5WQUxJRCwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogQW1yaXNjIFNvZnR3YXJlIEludGVycnVwdCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIEFNUklTQ19TVFJFQU1fRU1QVFlfUkVRIDB4MDEKKyNkZWZpbmUgQU1SSVNDX1BBUlNFUl9SRVEgICAgICAgMHgwMgorI2RlZmluZSBBTVJJU0NfTUFJTl9SRVEgICAgICAgICAweDA0CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogSEVWQ19ERUNfU1RBVFVTIGRlZmluZSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIEhFVkNfREVDX0lETEUgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgSEVWQ19OQUxfVU5JVF9WUFMgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBIRVZDX05BTF9VTklUX1NQUyAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lIEhFVkNfTkFMX1VOSVRfUFBTICAgICAgICAgICAgICAgICAgICAweDMKKyNkZWZpbmUgSEVWQ19OQUxfVU5JVF9DT0RFRF9TTElDRV9TRUdNRU5UICAgIDB4NAorI2RlZmluZSBIRVZDX0NPREVEX1NMSUNFX1NFR01FTlRfREFUICAgICAgICAgMHg1CisjZGVmaW5lIEhFVkNfU0xJQ0VfREVDT0RJTkcgICAgICAgICAgICAgICAgICAweDYKKyNkZWZpbmUgSEVWQ19OQUxfVU5JVF9TRUkgICAgICAgICAgICAgICAgICAgIDB4NworI2RlZmluZSBIRVZDX1NMSUNFX1NFR01FTlRfRE9ORSAgICAgICAgICAgICAgMHg4CisjZGVmaW5lIEhFVkNfTkFMX1NFQVJDSF9ET05FICAgICAgICAgICAgICAgICAweDkKKyNkZWZpbmUgSEVWQ19ERUNQSUNfREFUQV9ET05FICAgICAgICAgICAgICAgIDB4YQorI2RlZmluZSBIRVZDX0RFQ1BJQ19EQVRBX0VSUk9SICAgICAgICAgICAgICAgMHhiCisjZGVmaW5lIEhFVkNfU0VJX0RBVCAgICAgICAgICAgICAgICAgICAgICAgICAweGMKKyNkZWZpbmUgSEVWQ19TRUlfREFUX0RPTkUgICAgICAgICAgICAgICAgICAgIDB4ZAorI2RlZmluZSBIRVZDX05BTF9ERUNPREVfRE9ORQkJCQkweGUKKyNkZWZpbmUgSEVWQ19PVkVSX0RFQ09ERQkJCQkJMHhmCisKKyNkZWZpbmUgSEVWQ19EQVRBX1JFUVVFU1QgICAgICAgICAgIDB4MTIKKworI2RlZmluZSBIRVZDX0RFQ09ERV9CVUZFTVBUWSAgICAgICAgMHgyMAorI2RlZmluZSBIRVZDX0RFQ09ERV9USU1FT1VUICAgICAgICAgMHgyMQorI2RlZmluZSBIRVZDX1NFQVJDSF9CVUZFTVBUWSAgICAgICAgMHgyMgorI2RlZmluZSBIRVZDX0RFQ09ERV9PVkVSX1NJWkUgICAgICAgMHgyMworI2RlZmluZSBIRVZDX0RFQ09ERV9CVUZFTVBUWTIgICAgICAgMHgyNAorI2RlZmluZSBIRVZDX0ZJTkRfTkVYVF9QSUNfTkFMCQkJCTB4NTAKKyNkZWZpbmUgSEVWQ19GSU5EX05FWFRfRFZFTF9OQUwJCQkJMHg1MQorCisjZGVmaW5lIEhFVkNfRFVNUF9MTUVNCQkJCTB4MzAKKworI2RlZmluZSBIRVZDXzRrMmtfNjBIWl9OT1RfU1VQUE9SVAkweDgwCisjZGVmaW5lIEhFVkNfRElTQ0FSRF9OQUwgICAgICAgICAweGYwCisjZGVmaW5lIEhFVkNfQUNUSU9OX0RFQ19DT05UICAgICAweGZkCisjZGVmaW5lIEhFVkNfQUNUSU9OX0VSUk9SICAgICAgICAweGZlCisjZGVmaW5lIEhFVkNfQUNUSU9OX0RPTkUgICAgICAgICAweGZmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogSW5jbHVkZSAicGFyc2VyX2NtZC5oIiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFBBUlNFUl9DTURfU0tJUF9DRkdfMCAweDAwMDAwOTBiCisKKyNkZWZpbmUgUEFSU0VSX0NNRF9TS0lQX0NGR18xIDB4MWIxNDE0MGYKKworI2RlZmluZSBQQVJTRVJfQ01EX1NLSVBfQ0ZHXzIgMHgwMDFiMTkxMAorCisjZGVmaW5lIFBBUlNFUl9DTURfTlVNQkVSIDM3CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqaDI2NSBidWZmZXIgbWFuYWdlbWVudAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworLyogI2RlZmluZSBCVUZGRVJfTUdSX09OTFkgKi8KKy8qICNkZWZpbmUgQ09ORklHX0hFVkNfQ0xLX0ZPUkNFRF9PTiAqLworLyogI2RlZmluZSBFTkFCTEVfU1dBUF9URVNUICovCisjZGVmaW5lICAgTUNSQ0NfRU5BQkxFCisjZGVmaW5lIElOVkFMSURfUE9DIDB4ODAwMDAwMDAKKworI2RlZmluZSBIRVZDX0RFQ19TVEFUVVNfUkVHICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfMAorI2RlZmluZSBIRVZDX1JQTV9CVUZGRVIgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfMQorI2RlZmluZSBIRVZDX1NIT1JUX1RFUk1fUlBTICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfMgorI2RlZmluZSBIRVZDX1ZQU19CVUZGRVIgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfMworI2RlZmluZSBIRVZDX1NQU19CVUZGRVIgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfNAorI2RlZmluZSBIRVZDX1BQU19CVUZGRVIgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfNQorI2RlZmluZSBIRVZDX1NBT19VUCAgICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfNgorI2RlZmluZSBIRVZDX1NUUkVBTV9TV0FQX0JVRkZFUiAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfNworI2RlZmluZSBIRVZDX1NUUkVBTV9TV0FQX0JVRkZFUjIgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfOAorI2RlZmluZSBIRVZDX3Nhb19tZW1fdW5pdCAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfOQorI2RlZmluZSBIRVZDX1NBT19BQlYgICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfQQorI2RlZmluZSBIRVZDX3Nhb192Yl9zaXplICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfQgorI2RlZmluZSBIRVZDX1NBT19WQiAgICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfQworI2RlZmluZSBIRVZDX1NDQUxFTFVUICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfRAorI2RlZmluZSBIRVZDX1dBSVRfRkxBRyAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfRQorI2RlZmluZSBSUE1fQ01EX1JFRyAgICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfRgorI2RlZmluZSBMTUVNX0RVTVBfQURSICAgICAgICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0YKKyNpZmRlZiBFTkFCTEVfU1dBUF9URVNUCisjZGVmaW5lIEhFVkNfU1RSRUFNX1NXQVBfVEVTVCAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9MCisjZW5kaWYKKworLyojZGVmaW5lIEhFVkNfREVDT0RFX1BJQ19CRUdJTl9SRUcgSEVWQ19BU1NJU1RfU0NSQVRDSF9NKi8KKy8qI2RlZmluZSBIRVZDX0RFQ09ERV9QSUNfTlVNX1JFRyAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfTiovCisjZGVmaW5lIEhFVkNfREVDT0RFX1NJWkUJCUhFVkNfQVNTSVNUX1NDUkFUQ0hfTgorCS8qZG8gbm90IGRlZmluZSBFTkFCTEVfU1dBUF9URVNUKi8KKyNkZWZpbmUgSEVWQ19BVVhfQURSCQkJSEVWQ19BU1NJU1RfU0NSQVRDSF9MCisjZGVmaW5lIEhFVkNfQVVYX0RBVEFfU0laRQkJSEVWQ19BU1NJU1RfU0NSQVRDSF9NCisKKyNkZWZpbmUgREVCVUdfUkVHMSAgICAgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9HCisjZGVmaW5lIERFQlVHX1JFRzIgICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfSAorLyoKKyAqdWNvZGUgcGFyc2VyL3NlYXJjaCBjb250cm9sCisgKmJpdCAwOiAgMCwgaGVhZGVyIGF1dG8gcGFyc2U7IDEsIGhlYWRlciBtYW51YWwgcGFyc2UKKyAqYml0IDE6ICAwLCBhdXRvIHNraXAgZm9yIG5vbmVzZWFtbGVzcyBzdHJlYW07IDEsIG5vIHNraXAKKyAqYml0IFszOjJdOiB2YWxpZCB3aGVuIGJpdDE9PTA7CisgKjAsIGF1dG8gc2tpcCBuYWwgYmVmb3JlIGZpcnN0IHZwcy9zcHMvcHBzL2lkcjsKKyAqMSwgYXV0byBza2lwIG5hbCBiZWZvcmUgZmlyc3QgdnBzL3Nwcy9wcHMKKyAqMiwgYXV0byBza2lwIG5hbCBiZWZvcmUgZmlyc3QgIHZwcy9zcHMvcHBzLAorICoJYW5kIG5vdCBkZWNvZGUgdW50aWwgdGhlIGZpcnN0IEkgc2xpY2UgKHdpdGggc2xpY2UgYWRkcmVzcyBvZiAwKQorICoKKyAqMywgYXV0byBza2lwIGJlZm9yZSBmaXJzdCBJIHNsaWNlIChuYWxfdHlwZSA+PTE2ICYmIG5hbF90eXBlPD0yMSkKKyAqYml0IFsxNTo0XSBuYWwgc2tpcCBjb3VudCAodmFsaWQgd2hlbiBiaXQwID09IDEgKG1hbnVhbCBtb2RlKSApCisgKmJpdCBbMTZdOiBmb3IgTkFMX1VOSVRfRU9TIHdoZW4gYml0MCBpcyAwOgorICoJMCwgc2VuZCBTRUFSQ0hfRE9ORSB0byBhcm0gOyAgMSwgZG8gbm90IHNlbmQgU0VBUkNIX0RPTkUgdG8gYXJtCisgKmJpdCBbMTddOiBmb3IgTkFMX1NFSSB3aGVuIGJpdDAgaXMgMDoKKyAqCTAsIGRvIG5vdCBwYXJzZS9mZXRjaCBTRUkgaW4gdWNvZGU7CisgKgkxLCBwYXJzZS9mZXRjaCBTRUkgaW4gdWNvZGUKKyAqYml0IFsxOF06IGZvciBOQUxfU0VJX1NVRkZJWCB3aGVuIGJpdDAgaXMgMDoKKyAqCTAsIGRvIG5vdCBmZXRjaCBOQUxfU0VJX1NVRkZJWCB0byBhdXggYnVmOworICoJMSwgZmV0Y2ggTkFMX1NFTF9TVUZGSVggZGF0YSB0byBhdXggYnVmCisgKmJpdCBbMTldOgorICoJMCwgcGFyc2UgTkFMX1NFSSBpbiB1Y29kZQorICoJMSwgZmV0Y2ggTkFMX1NFSSB0byBhdXggYnVmCisgKmJpdCBbMjBdOiBmb3IgRE9MQllfVklTSU9OX01FVEEKKyAqCTAsIGRvIG5vdCBmZXRjaCBET0xCWV9WSVNJT05fTUVUQSB0byBhdXggYnVmCisgKgkxLCBmZXRjaCBET0xCWV9WSVNJT05fTUVUQSB0byBhdXggYnVmCisgKi8KKyNkZWZpbmUgTkFMX1NFQVJDSF9DVEwgICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0kKKwkvKnJlYWQgb25seSovCisjZGVmaW5lIENVUl9OQUxfVU5JVF9UWVBFICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfSgorCS8qCisJWzE1IDogOF0gcnBzX3NldF9pZAorCVs3IDogMF0gc3RhcnRfZGVjb2RpbmdfZmxhZworCSovCisjZGVmaW5lIEhFVkNfREVDT0RFX0lORk8gICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF8xCisJLypzZXQgYmVmb3JlIHN0YXJ0IGRlY29kZXIqLworI2RlZmluZSBIRVZDX0RFQ09ERV9NT0RFCQlIRVZDX0FTU0lTVF9TQ1JBVENIX0oKKyNkZWZpbmUgSEVWQ19ERUNPREVfTU9ERTIJCUhFVkNfQVNTSVNUX1NDUkFUQ0hfSAorI2RlZmluZSBERUNPREVfU1RPUF9QT1MgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0sKKworI2RlZmluZSBERUNPREVfTU9ERV9TSU5HTEUJCQkJCTB4MAorI2RlZmluZSBERUNPREVfTU9ERV9NVUxUSV9GUkFNRUJBU0UJCQkweDEKKyNkZWZpbmUgREVDT0RFX01PREVfTVVMVElfU1RSRUFNQkFTRQkJMHgyCisjZGVmaW5lIERFQ09ERV9NT0RFX01VTFRJX0RWQkFMCQkJCTB4MworI2RlZmluZSBERUNPREVfTU9ERV9NVUxUSV9EVkVOTAkJCQkweDQKKworI2RlZmluZSBNQVhfSU5UIDB4N0ZGRkZGRkYKKworI2RlZmluZSBSUE1fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAKKyNkZWZpbmUgbW9kaWZpY2F0aW9uX2xpc3RfY3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ4CisjZGVmaW5lIFJQTV9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4MAorI2lmZGVmIFNVUFBPUlRfTE9OR19URVJNX1JQUworLyoKKyAgKi8KKyNkZWZpbmUgUlBTX0VORCAgMHg4MDAwCisjZGVmaW5lIFJQU19MVF9CSVQgCQkxNAorI2RlZmluZSBSUFNfVVNFRF9CSVQgICAgICAgIDEzCisjZGVmaW5lIFJQU19TSUdOX0JJVCAgICAgICAgMTIKKyNlbHNlCisjZGVmaW5lIFJQU19FTkQJCTB4ODAwMAorI2RlZmluZSBSUFNfVVNFRF9CSVQgICAgICAgIDE0CisjZGVmaW5lIFJQU19TSUdOX0JJVCAgICAgICAgMTMKKyNlbmRpZgorLyogTUlTQ19GTEFHMCAqLworI2RlZmluZSBQQ01fTE9PUF9GSUxURVJfRElTQUJMRURfRkxBR19CSVQgICAgICAgMAorI2RlZmluZSBQQ01fRU5BQkxFX0ZMQUdfQklUICAgICAgICAgICAgIDEKKyNkZWZpbmUgTE9PUF9GSUxFUl9BQ1JPU1NfVElMRVNfRU5BQkxFRF9GTEFHX0JJVCAgICAyCisjZGVmaW5lIFBQU19MT09QX0ZJTFRFUl9BQ1JPU1NfU0xJQ0VTX0VOQUJMRURfRkxBR19CSVQgIDMKKyNkZWZpbmUgREVCTE9DS0lOR19GSUxURVJfT1ZFUlJJREVfRU5BQkxFRF9GTEFHX0JJVCA0CisjZGVmaW5lIFBQU19ERUJMT0NLSU5HX0ZJTFRFUl9ESVNBQkxFRF9GTEFHX0JJVCAgICAgNQorI2RlZmluZSBERUJMT0NLSU5HX0ZJTFRFUl9PVkVSUklERV9GTEFHX0JJVCAgICAgNgorI2RlZmluZSBTTElDRV9ERUJMT0NLSU5HX0ZJTFRFUl9ESVNBQkxFRF9GTEFHX0JJVCAgIDcKKyNkZWZpbmUgU0xJQ0VfU0FPX0xVTUFfRkxBR19CSVQgICAgICAgICAgICAgOAorI2RlZmluZSBTTElDRV9TQU9fQ0hST01BX0ZMQUdfQklUICAgICAgICAgICA5CisjZGVmaW5lIFNMSUNFX0xPT1BfRklMVEVSX0FDUk9TU19TTElDRVNfRU5BQkxFRF9GTEFHX0JJVCAxMAorCit1bmlvbiBwYXJhbV91IHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBzaG9ydCBkYXRhW1JQTV9FTkQgLSBSUE1fQkVHSU5dOworCX0gbDsKKwlzdHJ1Y3QgeworCQkvKiBmcm9tIHVjb2RlIGxtZW0sIGRvIG5vdCBjaGFuZ2UgdGhpcyBzdHJ1Y3QgKi8KKwkJdW5zaWduZWQgc2hvcnQgQ1VSX1JQU1sweDEwXTsKKwkJdW5zaWduZWQgc2hvcnQgbnVtX3JlZl9pZHhfbDBfYWN0aXZlOworCQl1bnNpZ25lZCBzaG9ydCBudW1fcmVmX2lkeF9sMV9hY3RpdmU7CisJCXVuc2lnbmVkIHNob3J0IHNsaWNlX3R5cGU7CisJCXVuc2lnbmVkIHNob3J0IHNsaWNlX3RlbXBvcmFsX212cF9lbmFibGVfZmxhZzsKKwkJdW5zaWduZWQgc2hvcnQgZGVwZW5kZW50X3NsaWNlX3NlZ21lbnRfZmxhZzsKKwkJdW5zaWduZWQgc2hvcnQgc2xpY2Vfc2VnbWVudF9hZGRyZXNzOworCQl1bnNpZ25lZCBzaG9ydCBudW1fdGl0bGVfcm93c19taW51czE7CisJCXVuc2lnbmVkIHNob3J0IHBpY193aWR0aF9pbl9sdW1hX3NhbXBsZXM7CisJCXVuc2lnbmVkIHNob3J0IHBpY19oZWlnaHRfaW5fbHVtYV9zYW1wbGVzOworCQl1bnNpZ25lZCBzaG9ydCBsb2cyX21pbl9jb2RpbmdfYmxvY2tfc2l6ZV9taW51czM7CisJCXVuc2lnbmVkIHNob3J0IGxvZzJfZGlmZl9tYXhfbWluX2NvZGluZ19ibG9ja19zaXplOworCQl1bnNpZ25lZCBzaG9ydCBsb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQ7CisJCXVuc2lnbmVkIHNob3J0IFBPQ2xzYjsKKwkJdW5zaWduZWQgc2hvcnQgY29sbG9jYXRlZF9mcm9tX2wwX2ZsYWc7CisJCXVuc2lnbmVkIHNob3J0IGNvbGxvY2F0ZWRfcmVmX2lkeDsKKwkJdW5zaWduZWQgc2hvcnQgbG9nMl9wYXJhbGxlbF9tZXJnZV9sZXZlbDsKKwkJdW5zaWduZWQgc2hvcnQgZml2ZV9taW51c19tYXhfbnVtX21lcmdlX2NhbmQ7CisJCXVuc2lnbmVkIHNob3J0IHNwc19udW1fcmVvcmRlcl9waWNzXzA7CisJCXVuc2lnbmVkIHNob3J0IG1vZGlmaWNhdGlvbl9mbGFnOworCQl1bnNpZ25lZCBzaG9ydCB0aWxlc19lbmFibGVkX2ZsYWc7CisJCXVuc2lnbmVkIHNob3J0IG51bV90aWxlX2NvbHVtbnNfbWludXMxOworCQl1bnNpZ25lZCBzaG9ydCBudW1fdGlsZV9yb3dzX21pbnVzMTsKKwkJdW5zaWduZWQgc2hvcnQgdGlsZV93aWR0aFsxMl07CisJCXVuc2lnbmVkIHNob3J0IHRpbGVfaGVpZ2h0WzhdOworCQl1bnNpZ25lZCBzaG9ydCBtaXNjX2ZsYWcwOworCQl1bnNpZ25lZCBzaG9ydCBwcHNfYmV0YV9vZmZzZXRfZGl2MjsKKwkJdW5zaWduZWQgc2hvcnQgcHBzX3RjX29mZnNldF9kaXYyOworCQl1bnNpZ25lZCBzaG9ydCBzbGljZV9iZXRhX29mZnNldF9kaXYyOworCQl1bnNpZ25lZCBzaG9ydCBzbGljZV90Y19vZmZzZXRfZGl2MjsKKwkJdW5zaWduZWQgc2hvcnQgcHBzX2NiX3FwX29mZnNldDsKKwkJdW5zaWduZWQgc2hvcnQgcHBzX2NyX3FwX29mZnNldDsKKwkJdW5zaWduZWQgc2hvcnQgZmlyc3Rfc2xpY2Vfc2VnbWVudF9pbl9waWNfZmxhZzsKKwkJdW5zaWduZWQgc2hvcnQgbV90ZW1wb3JhbElkOworCQl1bnNpZ25lZCBzaG9ydCBtX25hbFVuaXRUeXBlOworCisJCXVuc2lnbmVkIHNob3J0IHZ1aV9udW1fdW5pdHNfaW5fdGlja19oaTsKKwkJdW5zaWduZWQgc2hvcnQgdnVpX251bV91bml0c19pbl90aWNrX2xvOworCQl1bnNpZ25lZCBzaG9ydCB2dWlfdGltZV9zY2FsZV9oaTsKKwkJdW5zaWduZWQgc2hvcnQgdnVpX3RpbWVfc2NhbGVfbG87CisJCXVuc2lnbmVkIHNob3J0IGJpdF9kZXB0aDsKKwkJdW5zaWduZWQgc2hvcnQgcHJvZmlsZV9ldGM7CisJCXVuc2lnbmVkIHNob3J0IHNlaV9mcmFtZV9maWVsZF9pbmZvOworCQl1bnNpZ25lZCBzaG9ydCB2aWRlb19zaWduYWxfdHlwZTsKKwkJdW5zaWduZWQgc2hvcnQgbW9kaWZpY2F0aW9uX2xpc3RbMHgyMF07CisJCXVuc2lnbmVkIHNob3J0IGNvbmZvcm1hbmNlX3dpbmRvd19mbGFnOworCQl1bnNpZ25lZCBzaG9ydCBjb25mX3dpbl9sZWZ0X29mZnNldDsKKwkJdW5zaWduZWQgc2hvcnQgY29uZl93aW5fcmlnaHRfb2Zmc2V0OworCQl1bnNpZ25lZCBzaG9ydCBjb25mX3dpbl90b3Bfb2Zmc2V0OworCQl1bnNpZ25lZCBzaG9ydCBjb25mX3dpbl9ib3R0b21fb2Zmc2V0OworCQl1bnNpZ25lZCBzaG9ydCBjaHJvbWFfZm9ybWF0X2lkYzsKKwkJdW5zaWduZWQgc2hvcnQgY29sb3JfZGVzY3JpcHRpb247CisJCXVuc2lnbmVkIHNob3J0IGFzcGVjdF9yYXRpb19pZGM7CisJCXVuc2lnbmVkIHNob3J0IHNhcl93aWR0aDsKKwkJdW5zaWduZWQgc2hvcnQgc2FyX2hlaWdodDsKKwkJdW5zaWduZWQgc2hvcnQgc3BzX21heF9kZWNfcGljX2J1ZmZlcmluZ19taW51czFfMDsKKwl9IHA7Cit9OworCisjZGVmaW5lIFJQTV9CVUZfU0laRSAoMHg4MCoyKQorLyogbm9uIG1tdSBtb2RlIGxtZW0gc2l6ZSA6IDB4NDAwLCBtbXUgbW9kZSA6IDB4NTAwKi8KKyNkZWZpbmUgTE1FTV9CVUZfU0laRSAoMHg1MDAgKiAyKQorCitzdHJ1Y3QgYnVmZl9zIHsKKwl1MzIgYnVmX3N0YXJ0OworCXUzMiBidWZfc2l6ZTsKKwl1MzIgYnVmX2VuZDsKK307CisKK3N0cnVjdCBCdWZmSW5mb19zIHsKKwl1MzIgbWF4X3dpZHRoOworCXUzMiBtYXhfaGVpZ2h0OworCXVuc2lnbmVkIGludCBzdGFydF9hZHI7CisJdW5zaWduZWQgaW50IGVuZF9hZHI7CisJc3RydWN0IGJ1ZmZfcyBpcHA7CisJc3RydWN0IGJ1ZmZfcyBzYW9fYWJ2OworCXN0cnVjdCBidWZmX3Mgc2FvX3ZiOworCXN0cnVjdCBidWZmX3Mgc2hvcnRfdGVybV9ycHM7CisJc3RydWN0IGJ1ZmZfcyB2cHM7CisJc3RydWN0IGJ1ZmZfcyBzcHM7CisJc3RydWN0IGJ1ZmZfcyBwcHM7CisJc3RydWN0IGJ1ZmZfcyBzYW9fdXA7CisJc3RydWN0IGJ1ZmZfcyBzd2FwX2J1ZjsKKwlzdHJ1Y3QgYnVmZl9zIHN3YXBfYnVmMjsKKwlzdHJ1Y3QgYnVmZl9zIHNjYWxlbHV0OworCXN0cnVjdCBidWZmX3MgZGJsa19wYXJhOworCXN0cnVjdCBidWZmX3MgZGJsa19kYXRhOworCXN0cnVjdCBidWZmX3MgZGJsa19kYXRhMjsKKwlzdHJ1Y3QgYnVmZl9zIG1tdV92Ymg7CisJc3RydWN0IGJ1ZmZfcyBjbV9oZWFkZXI7CisjaWZkZWYgSDI2NV8xMEJfTU1VX0RXCisJc3RydWN0IGJ1ZmZfcyBtbXVfdmJoX2R3OworCXN0cnVjdCBidWZmX3MgY21faGVhZGVyX2R3OworI2VuZGlmCisJc3RydWN0IGJ1ZmZfcyBtcHJlZF9hYm92ZTsKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJc3RydWN0IGJ1ZmZfcyBtcHJlZF9tdjsKKyNlbmRpZgorCXN0cnVjdCBidWZmX3MgcnBtOworCXN0cnVjdCBidWZmX3MgbG1lbTsKK307CisKKy8vI2RlZmluZSBWQkhfQlVGX1NJWkUgKDIgKiAxNiAqIDIzMDQpCisvLyNkZWZpbmUgVkJIX0JVRl9DT1VOVCA0CisKKy8qbW11X3ZiaCBidWYgaXMgdXNlZCBieSBIRVZDX1NBT19NTVVfVkgwX0FERFIsIEhFVkNfU0FPX01NVV9WSDFfQUREUiovCisjZGVmaW5lIFZCSF9CVUZfU0laRV8xMDgwUCAweDMwMDAKKyNkZWZpbmUgVkJIX0JVRl9TSVpFXzRLIDB4NTAwMAorI2RlZmluZSBWQkhfQlVGX1NJWkVfOEsgMHhhMDAwCisjZGVmaW5lIFZCSF9CVUZfU0laRShidWZzcGVjKSAoYnVmc3BlYy0+bW11X3ZiaC5idWZfc2l6ZSAvIDIpCisJLyptbXVfdmJoX2R3IGJ1ZiBpcyB1c2VkIGJ5IEhFVkNfU0FPX01NVV9WSDBfQUREUjIsSEVWQ19TQU9fTU1VX1ZIMV9BRERSMiwKKwkJSEVWQ19EV19WSDBfQURERFIsIEhFVkNfRFdfVkgxX0FERERSKi8KKyNkZWZpbmUgRFdfVkJIX0JVRl9TSVpFXzEwODBQIChWQkhfQlVGX1NJWkVfMTA4MFAgKiAyKQorI2RlZmluZSBEV19WQkhfQlVGX1NJWkVfNEsgKFZCSF9CVUZfU0laRV80SyAqIDIpCisjZGVmaW5lIERXX1ZCSF9CVUZfU0laRV84SyAoVkJIX0JVRl9TSVpFXzhLICogMikKKyNkZWZpbmUgRFdfVkJIX0JVRl9TSVpFKGJ1ZnNwZWMpIChidWZzcGVjLT5tbXVfdmJoX2R3LmJ1Zl9zaXplIC8gNCkKKworLyogbmVjZXNzYXJ5IDRLIHBhZ2Ugc2l6ZSBhbGlnbiBmb3IgdDcvdDMgZGVjb2RlciBhbmQgYWZ0ZXIgKi8KKyNkZWZpbmUgV09SS0JVRl9BTElHTihhZGRyKSAoQUxJR04oYWRkciwgUEFHRV9TSVpFKSkKKworI2RlZmluZSBXT1JLX0JVRl9TUEVDX05VTSA2CitzdGF0aWMgc3RydWN0IEJ1ZmZJbmZvX3MgYW12aDI2NV93b3JrYnVmZl9zcGVjW1dPUktfQlVGX1NQRUNfTlVNXSA9IHsKKwl7CisJCS8qIDhNIGJ5dGVzICovCisJCS5tYXhfd2lkdGggPSAxOTIwLAorCQkubWF4X2hlaWdodCA9IDEwODgsCisJCS5pcHAgPSB7CisJCQkvKiBJUFAgd29yayBzcGFjZSBjYWxjdWxhdGlvbiA6CisJCQkgKiAgIDQwOTYgKiAoWStDYkNyK0ZsYWdzKSA9IDEyaywgcm91bmQgdG8gMTZrCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4NDAwMCwKKwkJfSwKKwkJLnNhb19hYnYgPSB7CisJCQkuYnVmX3NpemUgPSAweDMwMDAwLAorCQl9LAorCQkuc2FvX3ZiID0geworCQkJLmJ1Zl9zaXplID0gMHgzMDAwMCwKKwkJfSwKKwkJLnNob3J0X3Rlcm1fcnBzID0geworCQkJLyogU0hPUlRfVEVSTV9SUFMgLSBNYXggNjQgc2V0LCAxNiBlbnRyeSBldmVyeSBzZXQsCisJCQkgKiAgIHRvdGFsIDY0eDE2eDIgPSAyMDQ4IGJ5dGVzICgweDgwMCkKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS52cHMgPSB7CisJCQkvKiBWUFMgU1RPUkUgQVJFQSAtIE1heCAxNiBWUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsCisJCQkgKiAgIHRvdGFsIDB4MDgwMCBieXRlcworCQkJICovCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNwcyA9IHsKKwkJCS8qIFNQUyBTVE9SRSBBUkVBIC0gTWF4IDE2IFNQUywgZWFjaCBoYXMgMHg4MCBieXRlcywKKwkJCSAqICAgdG90YWwgMHgwODAwIGJ5dGVzCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkucHBzID0geworCQkJLyogUFBTIFNUT1JFIEFSRUEgLSBNYXggNjQgUFBTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLAorCQkJICogICB0b3RhbCAweDIwMDAgYnl0ZXMKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHgyMDAwLAorCQl9LAorCQkuc2FvX3VwID0geworCQkJLyogU0FPIFVQIFNUT1JFIEFSRUEgLSBNYXggNjQwKDEwMjQwLzE2KSBMQ1UsCisJCQkgKiAgIGVhY2ggaGFzIDE2IGJ5dGVzIHRvdGFsIDB4MjgwMCBieXRlcworCQkJICovCisJCQkuYnVmX3NpemUgPSAweDI4MDAsCisJCX0sCisJCS5zd2FwX2J1ZiA9IHsKKwkJCS8qIDI1NmN5Y2xleDY0Yml0ID0gMksgYnl0ZXMgMHg4MDAKKwkJCSAqICAgKG9ubHkgMTQ0IGN5Y2xlcyB2YWxpZCkKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zd2FwX2J1ZjIgPSB7CisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNjYWxlbHV0ID0geworCQkJLyogc3VwcG9ydCB1cCB0byAzMiBTQ0FMRUxVVCAxMDI0eDMyID0KKwkJCSAqICAgMzJLYnl0ZXMgKDB4ODAwMCkKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAwLAorCQl9LAorCQkuZGJsa19wYXJhID0geworI2lmZGVmIFNVUFBPUlRfMTBCSVQKKwkJCS5idWZfc2l6ZSA9IDB4NDAwMDAsCisjZWxzZQorCQkJLyogREJMSyAtPiBNYXggMjU2KDQwOTYvMTYpIExDVSwgZWFjaCBwYXJhCisJCQkgKjUxMmJ5dGVzKHRvdGFsOjB4MjAwMDApLCBkYXRhIDEwMjRieXRlcyh0b3RhbDoweDQwMDAwKQorCQkJICovCisJCQkuYnVmX3NpemUgPSAweDIwMDAwLAorI2VuZGlmCisJCX0sCisJCS5kYmxrX2RhdGEgPSB7CisJCQkuYnVmX3NpemUgPSAweDQwMDAwLAorCQl9LAorCQkuZGJsa19kYXRhMiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4ODAwMDAgKiAyLAorCQl9LCAvKmRibGsgZGF0YSBmb3IgYWRhcHRlciovCisJCS5tbXVfdmJoID0geworCQkJLmJ1Zl9zaXplID0gMHg1MDAwLCAvKjIqMTYqMjMwNC80LCA0SyovCisJCX0sCisjaWYgMAorCQkuY21faGVhZGVyID0gey8qIDB4NDQwMDAgPSAoKDEwODgqMioxMDI0KjQpLzMyLzQpKigzMi84KSovCisJCQkuYnVmX3NpemUgPSBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkUgKgorCQkJKE1BWF9SRUZfUElDX05VTSArIDEpLAorCQl9LAorI2VuZGlmCisJCS5tcHJlZF9hYm92ZSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4ODAwMCwKKwkJfSwKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJCS5tcHJlZF9tdiA9IHsvKiAxMDgwcCwgMHg0MDAwMCBwZXIgYnVmZmVyICovCisJCQkuYnVmX3NpemUgPSAweDQwMDAwICogTUFYX1JFRl9QSUNfTlVNLAorCQl9LAorI2VuZGlmCisJCS5ycG0gPSB7CisJCQkuYnVmX3NpemUgPSBSUE1fQlVGX1NJWkUsCisJCX0sCisJCS5sbWVtID0geworCQkJLmJ1Zl9zaXplID0gMHg1MDAgKiAyLAorCQl9CisJfSwKKwl7CisJCS5tYXhfd2lkdGggPSA0MDk2LAorCQkubWF4X2hlaWdodCA9IDIwNDgsCisJCS5pcHAgPSB7CisJCQkvKiBJUFAgd29yayBzcGFjZSBjYWxjdWxhdGlvbiA6CisJCQkgKiAgIDQwOTYgKiAoWStDYkNyK0ZsYWdzKSA9IDEyaywgcm91bmQgdG8gMTZrCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4MWUwMCwKKwkJfSwKKwkJLnNhb19hYnYgPSB7CisJCQkuYnVmX3NpemUgPSAwLCAvLzB4MzAwMDAsCisJCX0sCisJCS5zYW9fdmIgPSB7CisJCQkuYnVmX3NpemUgPSAwLCAvLzB4MzAwMDAsCisJCX0sCisJCS5zaG9ydF90ZXJtX3JwcyA9IHsKKwkJCS8qIFNIT1JUX1RFUk1fUlBTIC0gTWF4IDY0IHNldCwgMTYgZW50cnkgZXZlcnkgc2V0LAorCQkJICogICB0b3RhbCA2NHgxNngyID0gMjA0OCBieXRlcyAoMHg4MDApCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkudnBzID0geworCQkJLyogVlBTIFNUT1JFIEFSRUEgLSBNYXggMTYgVlBTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLAorCQkJICogICB0b3RhbCAweDA4MDAgYnl0ZXMKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zcHMgPSB7CisJCQkvKiBTUFMgU1RPUkUgQVJFQSAtIE1heCAxNiBTUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsCisJCQkgKiAgIHRvdGFsIDB4MDgwMCBieXRlcworCQkJICovCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnBwcyA9IHsKKwkJCS8qIFBQUyBTVE9SRSBBUkVBIC0gTWF4IDY0IFBQUywgZWFjaCBoYXMgMHg4MCBieXRlcywKKwkJCSAqICAgdG90YWwgMHgyMDAwIGJ5dGVzCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4MjAwMCwKKwkJfSwKKwkJLnNhb191cCA9IHsKKwkJCS8qIFNBTyBVUCBTVE9SRSBBUkVBIC0gTWF4IDY0MCgxMDI0MC8xNikgTENVLAorCQkJICogICBlYWNoIGhhcyAxNiBieXRlcyB0b3RhbCAweDI4MDAgYnl0ZXMKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHgyODAwLAorCQl9LAorCQkuc3dhcF9idWYgPSB7CisJCQkvKiAyNTZjeWNsZXg2NGJpdCA9IDJLIGJ5dGVzIDB4ODAwCisJCQkgKiAgIChvbmx5IDE0NCBjeWNsZXMgdmFsaWQpCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc3dhcF9idWYyID0geworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zY2FsZWx1dCA9IHsKKwkJCS8qIHN1cHBvcnQgdXAgdG8gMzIgU0NBTEVMVVQgMTAyNHgzMiA9IDMyS2J5dGVzCisJCQkgKiAgICgweDgwMDApCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwMCwKKwkJfSwKKwkJLmRibGtfcGFyYSA9IHsKKwkJCS8qIERCTEsgLT4gTWF4IDI1Nig0MDk2LzE2KSBMQ1UsIGVhY2ggcGFyYQorCQkJICogICA1MTJieXRlcyh0b3RhbDoweDIwMDAwKSwKKwkJCSAqICAgZGF0YSAxMDI0Ynl0ZXModG90YWw6MHg0MDAwMCkKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHgyMDAwMCwKKwkJfSwKKwkJLmRibGtfZGF0YSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4ODAwMDAsCisJCX0sCisJCS5kYmxrX2RhdGEyID0geworCQkJLmJ1Zl9zaXplID0gMHg4MDAwMCwKKwkJfSwgLypkYmxrIGRhdGEgZm9yIGFkYXB0ZXIqLworCQkubW11X3ZiaCA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4NTAwMCwgLyoyKjE2KjIzMDQvNCwgNEsqLworCQl9LAorI2lmIDAKKwkJLmNtX2hlYWRlciA9IHsvKjB4NDQwMDAgPSAoKDEwODgqMioxMDI0KjQpLzMyLzQpKigzMi84KSovCisJCQkuYnVmX3NpemUgPSBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkUgKgorCQkJKE1BWF9SRUZfUElDX05VTSArIDEpLAorCQl9LAorI2VuZGlmCisJCS5tcHJlZF9hYm92ZSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4ODAwMCwKKwkJfSwKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJCS5tcHJlZF9tdiA9IHsKKwkJCS8qIC5idWZfc2l6ZSA9IDB4MTAwMDAwKjE2LAorCQkJLy80azJrICwgMHgxMDAwMDAgcGVyIGJ1ZmZlciAqLworCQkJLyogNDA5NngyMzA0ICwgMHgxMjAwMDAgcGVyIGJ1ZmZlciAqLworCQkJLmJ1Zl9zaXplID0gTVBSRURfNEtfTVZfQlVGX1NJWkUgKiBNQVhfUkVGX1BJQ19OVU0sCisJCX0sCisjZW5kaWYKKwkJLnJwbSA9IHsKKwkJCS5idWZfc2l6ZSA9IFJQTV9CVUZfU0laRSwKKwkJfSwKKwkJLmxtZW0gPSB7CisJCQkuYnVmX3NpemUgPSAweDUwMCAqIDIsCisJCX0KKwl9LAorCisJeworCQkubWF4X3dpZHRoID0gNDA5NioyLAorCQkubWF4X2hlaWdodCA9IDIwNDgqMiwKKwkJLmlwcCA9IHsKKwkJCS8vIElQUCB3b3JrIHNwYWNlIGNhbGN1bGF0aW9uIDogNDA5NiAqIChZK0NiQ3IrRmxhZ3MpID0gMTJrLCByb3VuZCB0byAxNmsKKwkJCS5idWZfc2l6ZSA9IDB4NDAwMCoyLAorCQl9LAorCQkuc2FvX2FidiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MzAwMDAqMiwKKwkJfSwKKwkJLnNhb192YiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MzAwMDAqMiwKKwkJfSwKKwkJLnNob3J0X3Rlcm1fcnBzID0geworCQkJLy8gU0hPUlRfVEVSTV9SUFMgLSBNYXggNjQgc2V0LCAxNiBlbnRyeSBldmVyeSBzZXQsIHRvdGFsIDY0eDE2eDIgPSAyMDQ4IGJ5dGVzICgweDgwMCkKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkudnBzID0geworCQkJLy8gVlBTIFNUT1JFIEFSRUEgLSBNYXggMTYgVlBTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLCB0b3RhbCAweDA4MDAgYnl0ZXMKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc3BzID0geworCQkJLy8gU1BTIFNUT1JFIEFSRUEgLSBNYXggMTYgU1BTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLCB0b3RhbCAweDA4MDAgYnl0ZXMKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkucHBzID0geworCQkJLy8gUFBTIFNUT1JFIEFSRUEgLSBNYXggNjQgUFBTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLCB0b3RhbCAweDIwMDAgYnl0ZXMKKwkJCS5idWZfc2l6ZSA9IDB4MjAwMCwKKwkJfSwKKwkJLnNhb191cCA9IHsKKwkJCS8vIFNBTyBVUCBTVE9SRSBBUkVBIC0gTWF4IDY0MCgxMDI0MC8xNikgTENVLCBlYWNoIGhhcyAxNiBieXRlcyB0b3RhbCAweDI4MDAgYnl0ZXMKKwkJCS5idWZfc2l6ZSA9IDB4MjgwMCoyLAorCQl9LAorCQkuc3dhcF9idWYgPSB7CisJCQkvLyAyNTZjeWNsZXg2NGJpdCA9IDJLIGJ5dGVzIDB4ODAwIChvbmx5IDE0NCBjeWNsZXMgdmFsaWQpCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnN3YXBfYnVmMiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc2NhbGVsdXQgPSB7CisJCQkvLyBzdXBwb3J0IHVwIHRvIDMyIFNDQUxFTFVUIDEwMjR4MzIgPSAzMktieXRlcyAoMHg4MDAwKQorCQkJLmJ1Zl9zaXplID0gMHg4MDAwKjIsCisJCX0sCisJCS5kYmxrX3BhcmEgID0gey5idWZfc2l6ZSA9IDB4NDAwMDAqMiwgfSwgLy8gZGJsayBwYXJhbWV0ZXIKKwkJLmRibGtfZGF0YSAgPSB7LmJ1Zl9zaXplID0gMHg4MDAwMCoyLCB9LCAvLyBkYmxrIGRhdGEgZm9yIGxlZnQvdG9wCisJCS5kYmxrX2RhdGEyID0gey5idWZfc2l6ZSA9IDB4ODAwMDAqMiwgfSwgLy8gZGJsayBkYXRhIGZvciBhZGFwdGVyCisJCS5tbXVfdmJoID0geworCQkJLmJ1Zl9zaXplID0gMHg1MDAwKjIsIC8vMioxNioyMzA0LzQsIDRLCisJCX0sCisjaWYgMAorCQkuY21faGVhZGVyID0geworCQkJLmJ1Zl9zaXplID0gTU1VX0NPTVBSRVNTXzhLX0hFQURFUl9TSVpFICoKKwkJCQlNQVhfUkVGX1BJQ19OVU0sIAkvLyAweDQ0MDAwID0gKCgxMDg4KjIqMTAyNCo0KS8zMi80KSooMzIvOCkKKwkJfSwKKyNlbmRpZgorCQkubXByZWRfYWJvdmUgPSB7CisJCQkuYnVmX3NpemUgPSAweDgwMDAqMiwKKwkJfSwKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJCS5tcHJlZF9tdiA9IHsKKwkJCS5idWZfc2l6ZSA9IE1QUkVEXzhLX01WX0JVRl9TSVpFICogTUFYX1JFRl9QSUNfTlVNLCAvLzRrMmsgLCAweDEyMDAwMCBwZXIgYnVmZmVyCisJCX0sCisjZW5kaWYKKwkJLnJwbSA9IHsKKwkJCS5idWZfc2l6ZSA9IFJQTV9CVUZfU0laRSwKKwkJfSwKKwkJLmxtZW0gPSB7CisJCQkuYnVmX3NpemUgPSAweDUwMCAqIDIsCisJCX0sCisJfSwKKwl7CisJCS8qIDhNIGJ5dGVzICovCisJCS5tYXhfd2lkdGggPSAxOTIwLAorCQkubWF4X2hlaWdodCA9IDEwODgsCisJCS5pcHAgPSB7LypjaGVja2VkKi8KKwkJCS8qIElQUCB3b3JrIHNwYWNlIGNhbGN1bGF0aW9uIDoKKwkJCSAqICAgNDA5NiAqIChZK0NiQ3IrRmxhZ3MpID0gMTJrLCByb3VuZCB0byAxNmsKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHgxZTAwLAorCQl9LAorCQkuc2FvX2FidiA9IHsKKwkJCS5idWZfc2l6ZSA9IDAsIC8vMHgzMDAwMCwKKwkJfSwKKwkJLnNhb192YiA9IHsKKwkJCS5idWZfc2l6ZSA9IDAsIC8vMHgzMDAwMCwKKwkJfSwKKwkJLnNob3J0X3Rlcm1fcnBzID0gey8qY2hlY2tlZCovCisJCQkvKiBTSE9SVF9URVJNX1JQUyAtIE1heCA2NCBzZXQsIDE2IGVudHJ5IGV2ZXJ5IHNldCwKKwkJCSAqICAgdG90YWwgNjR4MTZ4MiA9IDIwNDggYnl0ZXMgKDB4ODAwKQorCQkJICovCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnZwcyA9IHsvKmNoZWNrZWQqLworCQkJLyogVlBTIFNUT1JFIEFSRUEgLSBNYXggMTYgVlBTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLAorCQkJICogICB0b3RhbCAweDA4MDAgYnl0ZXMKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zcHMgPSB7LypjaGVja2VkKi8KKwkJCS8qIFNQUyBTVE9SRSBBUkVBIC0gTWF4IDE2IFNQUywgZWFjaCBoYXMgMHg4MCBieXRlcywKKwkJCSAqICAgdG90YWwgMHgwODAwIGJ5dGVzCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkucHBzID0gey8qY2hlY2tlZCovCisJCQkvKiBQUFMgU1RPUkUgQVJFQSAtIE1heCA2NCBQUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsCisJCQkgKiAgIHRvdGFsIDB4MjAwMCBieXRlcworCQkJICovCisJCQkuYnVmX3NpemUgPSAweDIwMDAsCisJCX0sCisJCS5zYW9fdXAgPSB7CisJCQkvKiBTQU8gVVAgU1RPUkUgQVJFQSAtIE1heCA2NDAoMTAyNDAvMTYpIExDVSwKKwkJCSAqICAgZWFjaCBoYXMgMTYgYnl0ZXMgdG90YWwgMHgyODAwIGJ5dGVzCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDAsIC8vMHgyODAwLAorCQl9LAorCQkuc3dhcF9idWYgPSB7LypjaGVja2VkKi8KKwkJCS8qIDI1NmN5Y2xleDY0Yml0ID0gMksgYnl0ZXMgMHg4MDAKKwkJCSAqICAgKG9ubHkgMTQ0IGN5Y2xlcyB2YWxpZCkKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zd2FwX2J1ZjIgPSB7LypjaGVja2VkKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc2NhbGVsdXQgPSB7LypjaGVja2VkKi8KKwkJCS8qIHN1cHBvcnQgdXAgdG8gMzIgU0NBTEVMVVQgMTAyNHgzMiA9CisJCQkgKiAgIDMyS2J5dGVzICgweDgwMDApCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwMCwKKwkJfSwKKwkJLmRibGtfcGFyYSAgPSB7LmJ1Zl9zaXplID0gMHgxNDUwMCwgfSwgLy8gZGJsayBwYXJhbWV0ZXIKKwkJLmRibGtfZGF0YSAgPSB7LmJ1Zl9zaXplID0gMHg2MjgwMCwgfSwgLy8gZGJsayBkYXRhIGZvciBsZWZ0L3RvcAorCQkuZGJsa19kYXRhMiA9IHsuYnVmX3NpemUgPSAweDIyODAwLCB9LCAvLyBkYmxrIGRhdGEgZm9yIGFkYXB0ZXIKKwkJLm1tdV92YmggPSB7LypjaGVja2VkKi8KKwkJCS5idWZfc2l6ZSA9IFZCSF9CVUZfU0laRV8xMDgwUCwgLyoyKjE2KjIzMDQvNCwgNEsqLworCQl9LAorI2lmIDAKKwkJLmNtX2hlYWRlciA9IHsvKmNoZWNrZWQqLy8qIDB4NDQwMDAgPSAoKDEwODgqMioxMDI0KjQpLzMyLzQpKigzMi84KSovCisJCQkuYnVmX3NpemUgPSBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfMTA4MFAgKgorCQkJKE1BWF9SRUZfUElDX05VTSArIDEpLAorCQl9LAorI2VuZGlmCisjaWZkZWYgSDI2NV8xMEJfTU1VX0RXCisJCS5tbXVfdmJoX2R3ID0gey8qY2hlY2tlZCovCisJCQkuYnVmX3NpemUgPSBEV19WQkhfQlVGX1NJWkVfMTA4MFAsIC8vVkJIX0JVRl9TSVpFICogVkJIX0JVRl9DT1VOVCwgLy8yKjE2KjIzMDQvNCwgNEsKKwkJfSwKKyNpZmRlZiBVU0VfRklYRURfTU1VX0RXX0hFQURFUgorCQkuY21faGVhZGVyX2R3ID0gey8qY2hlY2tlZCovCisJCQkuYnVmX3NpemUgPSBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfMTA4MFAgKiBEQl9OVU0sIC8vIDB4NDQwMDAgPSAoKDEwODgqMioxMDI0KjQpLzMyLzQpKigzMi84KQorCQl9LAorI2VuZGlmCisjZW5kaWYKKwkJLm1wcmVkX2Fib3ZlID0gey8qY2hlY2tlZCovCisJCQkuYnVmX3NpemUgPSAweDFlMDAsCisJCX0sCisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCQkubXByZWRfbXYgPSB7LypjaGVja2VkKi8vKiAxMDgwcCwgMHg0MDAwMCBwZXIgYnVmZmVyICovCisJCQkuYnVmX3NpemUgPSBNUFJFRF9NVl9CVUZfU0laRSAqIE1BWF9SRUZfUElDX05VTSwKKwkJfSwKKyNlbmRpZgorCQkucnBtID0gey8qY2hlY2tlZCovCisJCQkuYnVmX3NpemUgPSBSUE1fQlVGX1NJWkUsCisJCX0sCisJCS5sbWVtID0gey8qY2hlY2tlZCovCisJCQkuYnVmX3NpemUgPSAweDUwMCAqIDIsCisJCX0KKwl9LAorCXsKKwkJLm1heF93aWR0aCA9IDQwOTYsCisJCS5tYXhfaGVpZ2h0ID0gMjA0OCwKKwkJLmlwcCA9IHsKKwkJCS8qIElQUCB3b3JrIHNwYWNlIGNhbGN1bGF0aW9uIDoKKwkJCSAqICAgNDA5NiAqIChZK0NiQ3IrRmxhZ3MpID0gMTJrLCByb3VuZCB0byAxNmsKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg0MDAwLAorCQl9LAorCQkuc2FvX2FidiA9IHsKKwkJCS5idWZfc2l6ZSA9IDAsIC8vMHgzMDAwMCwKKwkJfSwKKwkJLnNhb192YiA9IHsKKwkJCS5idWZfc2l6ZSA9IDAsIC8vMHgzMDAwMCwKKwkJfSwKKwkJLnNob3J0X3Rlcm1fcnBzID0geworCQkJLyogU0hPUlRfVEVSTV9SUFMgLSBNYXggNjQgc2V0LCAxNiBlbnRyeSBldmVyeSBzZXQsCisJCQkgKiAgIHRvdGFsIDY0eDE2eDIgPSAyMDQ4IGJ5dGVzICgweDgwMCkKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS52cHMgPSB7CisJCQkvKiBWUFMgU1RPUkUgQVJFQSAtIE1heCAxNiBWUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsCisJCQkgKiAgIHRvdGFsIDB4MDgwMCBieXRlcworCQkJICovCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNwcyA9IHsKKwkJCS8qIFNQUyBTVE9SRSBBUkVBIC0gTWF4IDE2IFNQUywgZWFjaCBoYXMgMHg4MCBieXRlcywKKwkJCSAqICAgdG90YWwgMHgwODAwIGJ5dGVzCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkucHBzID0geworCQkJLyogUFBTIFNUT1JFIEFSRUEgLSBNYXggNjQgUFBTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLAorCQkJICogICB0b3RhbCAweDIwMDAgYnl0ZXMKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHgyMDAwLAorCQl9LAorCQkuc2FvX3VwID0geworCQkJLyogU0FPIFVQIFNUT1JFIEFSRUEgLSBNYXggNjQwKDEwMjQwLzE2KSBMQ1UsCisJCQkgKiAgIGVhY2ggaGFzIDE2IGJ5dGVzIHRvdGFsIDB4MjgwMCBieXRlcworCQkJICovCisJCQkuYnVmX3NpemUgPSAwLCAvLzB4MjgwMCwKKwkJfSwKKwkJLnN3YXBfYnVmID0geworCQkJLyogMjU2Y3ljbGV4NjRiaXQgPSAySyBieXRlcyAweDgwMAorCQkJICogICAob25seSAxNDQgY3ljbGVzIHZhbGlkKQorCQkJICovCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnN3YXBfYnVmMiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc2NhbGVsdXQgPSB7CisJCQkvKiBzdXBwb3J0IHVwIHRvIDMyIFNDQUxFTFVUIDEwMjR4MzIgPSAzMktieXRlcworCQkJICogICAoMHg4MDAwKQorCQkJICovCisJCQkuYnVmX3NpemUgPSAweDgwMDAsCisJCX0sCisJCS5kYmxrX3BhcmEgID0gey5idWZfc2l6ZSA9IDB4MTkxMDAsIH0sIC8vIGRibGsgcGFyYW1ldGVyCisJCS5kYmxrX2RhdGEgID0gey5idWZfc2l6ZSA9IDB4ODg4MDAsIH0sIC8vIGRibGsgZGF0YSBmb3IgbGVmdC90b3AKKwkJLmRibGtfZGF0YTIgPSB7LmJ1Zl9zaXplID0gMHg0ODgwMCwgfSwgLy8gZGJsayBkYXRhIGZvciBhZGFwdGVyCisJCS5tbXVfdmJoID0geworCQkJLmJ1Zl9zaXplID0gVkJIX0JVRl9TSVpFXzRLLCAvKjIqMTYqMjMwNC80LCA0SyovCisJCX0sCisjaWYgMAorCQkuY21faGVhZGVyID0gey8qMHg0NDAwMCA9ICgoMTA4OCoyKjEwMjQqNCkvMzIvNCkqKDMyLzgpKi8KKwkJCS5idWZfc2l6ZSA9IE1NVV9DT01QUkVTU19IRUFERVJfU0laRV80SyAqCisJCQkoTUFYX1JFRl9QSUNfTlVNICsgMSksCisJCX0sCisjZW5kaWYKKyNpZmRlZiBIMjY1XzEwQl9NTVVfRFcKKwkJLm1tdV92YmhfZHcgPSB7CisJCQkuYnVmX3NpemUgPSBEV19WQkhfQlVGX1NJWkVfNEssIC8vVkJIX0JVRl9TSVpFICogVkJIX0JVRl9DT1VOVCwgLy8yKjE2Kihtb3JlIHRoYW4gMjMwNCkvNCwgNEsKKwkJfSwKKyNpZmRlZiBVU0VfRklYRURfTU1VX0RXX0hFQURFUgorCQkuY21faGVhZGVyX2R3ID0geworCQkJLmJ1Zl9zaXplID0gTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFXzRLICogREJfTlVNLCAvLyAweDQ0MDAwID0gKCgxMDg4KjIqMTAyNCo0KS8zMi80KSooMzIvOCkKKwkJfSwKKyNlbmRpZgorI2VuZGlmCisJCS5tcHJlZF9hYm92ZSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4NDAwMCwKKwkJfSwKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJCS5tcHJlZF9tdiA9IHsKKwkJCS8qIC5idWZfc2l6ZSA9IDB4MTAwMDAwKjE2LAorCQkJLy80azJrICwgMHgxMDAwMDAgcGVyIGJ1ZmZlciAqLworCQkJLyogNDA5NngyMzA0ICwgMHgxMjAwMDAgcGVyIGJ1ZmZlciAqLworCQkJLmJ1Zl9zaXplID0gTVBSRURfNEtfTVZfQlVGX1NJWkUgKiBNQVhfUkVGX1BJQ19OVU0sCisJCX0sCisjZW5kaWYKKwkJLnJwbSA9IHsKKwkJCS5idWZfc2l6ZSA9IFJQTV9CVUZfU0laRSwKKwkJfSwKKwkJLmxtZW0gPSB7CisJCQkuYnVmX3NpemUgPSAweDUwMCAqIDIsCisJCX0KKwl9LAorCisJeworCQkubWF4X3dpZHRoID0gNDA5NioyLAorCQkubWF4X2hlaWdodCA9IDIwNDgqMiwKKwkJLmlwcCA9IHsKKwkJCS8vIElQUCB3b3JrIHNwYWNlIGNhbGN1bGF0aW9uIDogNDA5NiAqIChZK0NiQ3IrRmxhZ3MpID0gMTJrLCByb3VuZCB0byAxNmsKKwkJCS5idWZfc2l6ZSA9IDB4NDAwMCoyLAorCQl9LAorCQkuc2FvX2FidiA9IHsKKwkJCS5idWZfc2l6ZSA9IDAsIC8vMHgzMDAwMCoyLAorCQl9LAorCQkuc2FvX3ZiID0geworCQkJLmJ1Zl9zaXplID0gMCwgLy8weDMwMDAwKjIsCisJCX0sCisJCS5zaG9ydF90ZXJtX3JwcyA9IHsKKwkJCS8vIFNIT1JUX1RFUk1fUlBTIC0gTWF4IDY0IHNldCwgMTYgZW50cnkgZXZlcnkgc2V0LCB0b3RhbCA2NHgxNngyID0gMjA0OCBieXRlcyAoMHg4MDApCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnZwcyA9IHsKKwkJCS8vIFZQUyBTVE9SRSBBUkVBIC0gTWF4IDE2IFZQUywgZWFjaCBoYXMgMHg4MCBieXRlcywgdG90YWwgMHgwODAwIGJ5dGVzCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNwcyA9IHsKKwkJCS8vIFNQUyBTVE9SRSBBUkVBIC0gTWF4IDE2IFNQUywgZWFjaCBoYXMgMHg4MCBieXRlcywgdG90YWwgMHgwODAwIGJ5dGVzCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnBwcyA9IHsKKwkJCS8vIFBQUyBTVE9SRSBBUkVBIC0gTWF4IDY0IFBQUywgZWFjaCBoYXMgMHg4MCBieXRlcywgdG90YWwgMHgyMDAwIGJ5dGVzCisJCQkuYnVmX3NpemUgPSAweDIwMDAsCisJCX0sCisJCS5zYW9fdXAgPSB7CisJCQkvLyBTQU8gVVAgU1RPUkUgQVJFQSAtIE1heCA2NDAoMTAyNDAvMTYpIExDVSwgZWFjaCBoYXMgMTYgYnl0ZXMgdG90YWwgMHgyODAwIGJ5dGVzCisJCQkuYnVmX3NpemUgPSAwLCAvLzB4MjgwMCoyLAorCQl9LAorCQkuc3dhcF9idWYgPSB7CisJCQkvLyAyNTZjeWNsZXg2NGJpdCA9IDJLIGJ5dGVzIDB4ODAwIChvbmx5IDE0NCBjeWNsZXMgdmFsaWQpCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnN3YXBfYnVmMiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc2NhbGVsdXQgPSB7CisJCQkvLyBzdXBwb3J0IHVwIHRvIDMyIFNDQUxFTFVUIDEwMjR4MzIgPSAzMktieXRlcyAoMHg4MDAwKQorCQkJLmJ1Zl9zaXplID0gMHg4MDAwLCAvLzB4ODAwMCoyLAorCQl9LAorCQkuZGJsa19wYXJhICA9IHsuYnVmX3NpemUgPSAweDMyMTAwLCB9LCAvLyBkYmxrIHBhcmFtZXRlcgorCQkuZGJsa19kYXRhICA9IHsuYnVmX3NpemUgPSAweDExMDgwMCwgfSwgLy8gZGJsayBkYXRhIGZvciBsZWZ0L3RvcAorCQkuZGJsa19kYXRhMiA9IHsuYnVmX3NpemUgPSAweDkwODAwLCB9LCAvLyBkYmxrIGRhdGEgZm9yIGFkYXB0ZXIKKwkJLm1tdV92YmggPSB7CisJCQkuYnVmX3NpemUgPSBWQkhfQlVGX1NJWkVfOEssIC8vMioxNioyMzA0LzQsIDRLCisJCX0sCisjaWYgMAorCQkuY21faGVhZGVyID0geworCQkJLmJ1Zl9zaXplID0gTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFXzhLICoKKwkJCQlNQVhfUkVGX1BJQ19OVU0sIAkvLyAweDQ0MDAwID0gKCgxMDg4KjIqMTAyNCo0KS8zMi80KSooMzIvOCkKKwkJfSwKKyNlbmRpZgorI2lmZGVmIEgyNjVfMTBCX01NVV9EVworCQkubW11X3ZiaF9kdyA9IHsKKwkJCS5idWZfc2l6ZSA9IERXX1ZCSF9CVUZfU0laRV84SywgLy9WQkhfQlVGX1NJWkUgKiBWQkhfQlVGX0NPVU5ULCAvLzIqMTYqMjMwNC80LCA0SworCQl9LAorI2lmZGVmIFVTRV9GSVhFRF9NTVVfRFdfSEVBREVSCisJCS5jbV9oZWFkZXJfZHcgPSB7CisJCQkuYnVmX3NpemUgPSBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfOEsgKiBEQl9OVU0sIC8vIDB4NDQwMDAgPSAoKDEwODgqMioxMDI0KjQpLzMyLzQpKigzMi84KQorCQl9LAorI2VuZGlmCisjZW5kaWYKKwkJLm1wcmVkX2Fib3ZlID0geworCQkJLmJ1Zl9zaXplID0gMHg4MDAwLAorCQl9LAorI2lmZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwkJLm1wcmVkX212ID0geworCQkJLmJ1Zl9zaXplID0gTVBSRURfOEtfTVZfQlVGX1NJWkUgKiBNQVhfUkVGX1BJQ19OVU0sIC8vNGsyayAsIDB4MTIwMDAwIHBlciBidWZmZXIKKwkJfSwKKyNlbmRpZgorCQkucnBtID0geworCQkJLmJ1Zl9zaXplID0gUlBNX0JVRl9TSVpFLAorCQl9LAorCQkubG1lbSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4NTAwICogMiwKKwkJfSwKKwl9Cit9OworCitzdGF0aWMgdm9pZCBpbml0X2J1ZmZfc3BlYyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCXN0cnVjdCBCdWZmSW5mb19zICpidWZfc3BlYykKK3sKKwlidWZfc3BlYy0+aXBwLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnN0YXJ0X2Fkcik7CisJYnVmX3NwZWMtPnNhb19hYnYuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+aXBwLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5pcHAuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5zYW9fdmIuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c2FvX2Fidi5idWZfc3RhcnQgKyBidWZfc3BlYy0+c2FvX2Fidi5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPnNob3J0X3Rlcm1fcnBzLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnNhb192Yi5idWZfc3RhcnQgKyBidWZfc3BlYy0+c2FvX3ZiLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+dnBzLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnNob3J0X3Rlcm1fcnBzLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5zaG9ydF90ZXJtX3Jwcy5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPnNwcy5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT52cHMuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnZwcy5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPnBwcy5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5zcHMuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnNwcy5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPnNhb191cC5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5wcHMuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnBwcy5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPnN3YXBfYnVmLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnNhb191cC5idWZfc3RhcnQgKyBidWZfc3BlYy0+c2FvX3VwLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+c3dhcF9idWYyLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnN3YXBfYnVmLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5zd2FwX2J1Zi5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPnNjYWxlbHV0LmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnN3YXBfYnVmMi5idWZfc3RhcnQgKyBidWZfc3BlYy0+c3dhcF9idWYyLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnNjYWxlbHV0LmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5zY2FsZWx1dC5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPmRibGtfZGF0YS5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5kYmxrX3BhcmEuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPmRibGtfZGF0YTIuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+ZGJsa19kYXRhLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5kYmxrX2RhdGEuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5tbXVfdmJoLmJ1Zl9zdGFydCAgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5kYmxrX2RhdGEyLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5kYmxrX2RhdGEyLmJ1Zl9zaXplKTsKKyNpZmRlZiBIMjY1XzEwQl9NTVVfRFcKKwlidWZfc3BlYy0+bW11X3ZiaF9kdy5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5tbXVfdmJoLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5tbXVfdmJoLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+Y21faGVhZGVyX2R3LmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPm1tdV92YmhfZHcuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPm1tdV92YmhfZHcuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5tcHJlZF9hYm92ZS5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5jbV9oZWFkZXJfZHcuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPmNtX2hlYWRlcl9kdy5idWZfc2l6ZSk7CisjZWxzZQorCWJ1Zl9zcGVjLT5tcHJlZF9hYm92ZS5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5tbXVfdmJoLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5tbXVfdmJoLmJ1Zl9zaXplKTsKKyNlbmRpZgorI2lmZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwlidWZfc3BlYy0+bXByZWRfbXYuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+bXByZWRfYWJvdmUuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPm1wcmVkX2Fib3ZlLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+cnBtLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPm1wcmVkX212LmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5tcHJlZF9tdi5idWZfc2l6ZSk7CisjZWxzZQorCWJ1Zl9zcGVjLT5ycG0uYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+bXByZWRfYWJvdmUuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPm1wcmVkX2Fib3ZlLmJ1Zl9zaXplKTsKKyNlbmRpZgorCWJ1Zl9zcGVjLT5sbWVtLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnJwbS5idWZfc3RhcnQgKyBidWZfc3BlYy0+cnBtLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+ZW5kX2FkciA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPmxtZW0uYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPmxtZW0uYnVmX3NpemUpOworCisJaWYgKGhldmMgJiYgZ2V0X2RiZ19mbGFnMihoZXZjKSkgeworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiJXMgd29ya3NwYWNlICgleCAleCkgc2l6ZSA9ICV4XG4iLCBfX2Z1bmNfXywKKwkJCWJ1Zl9zcGVjLT5zdGFydF9hZHIsIGJ1Zl9zcGVjLT5lbmRfYWRyLAorCQkJYnVmX3NwZWMtPmVuZF9hZHIgLSBidWZfc3BlYy0+c3RhcnRfYWRyKTsKKworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiaXBwLmJ1Zl9zdGFydCAgICAgICAgICAgICA6JXhcbiIsCisJCQlidWZfc3BlYy0+aXBwLmJ1Zl9zdGFydCk7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJzYW9fYWJ2LmJ1Zl9zdGFydCAgICAgICAgICA6JXhcbiIsCisJCQlidWZfc3BlYy0+c2FvX2Fidi5idWZfc3RhcnQpOworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkic2FvX3ZiLmJ1Zl9zdGFydCAgICAgICAgICA6JXhcbiIsCisJCQlidWZfc3BlYy0+c2FvX3ZiLmJ1Zl9zdGFydCk7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJzaG9ydF90ZXJtX3Jwcy5idWZfc3RhcnQgIDoleFxuIiwKKwkJCWJ1Zl9zcGVjLT5zaG9ydF90ZXJtX3Jwcy5idWZfc3RhcnQpOworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkidnBzLmJ1Zl9zdGFydCAgICAgICAgICAgICA6JXhcbiIsCisJCQlidWZfc3BlYy0+dnBzLmJ1Zl9zdGFydCk7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJzcHMuYnVmX3N0YXJ0ICAgICAgICAgICAgIDoleFxuIiwKKwkJCWJ1Zl9zcGVjLT5zcHMuYnVmX3N0YXJ0KTsKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJInBwcy5idWZfc3RhcnQgICAgICAgICAgICAgOiV4XG4iLAorCQkJYnVmX3NwZWMtPnBwcy5idWZfc3RhcnQpOworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkic2FvX3VwLmJ1Zl9zdGFydCAgICAgICAgICA6JXhcbiIsCisJCQlidWZfc3BlYy0+c2FvX3VwLmJ1Zl9zdGFydCk7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJzd2FwX2J1Zi5idWZfc3RhcnQgICAgICAgIDoleFxuIiwKKwkJCWJ1Zl9zcGVjLT5zd2FwX2J1Zi5idWZfc3RhcnQpOworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkic3dhcF9idWYyLmJ1Zl9zdGFydCAgICAgICA6JXhcbiIsCisJCQlidWZfc3BlYy0+c3dhcF9idWYyLmJ1Zl9zdGFydCk7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJzY2FsZWx1dC5idWZfc3RhcnQgICAgICAgIDoleFxuIiwKKwkJCWJ1Zl9zcGVjLT5zY2FsZWx1dC5idWZfc3RhcnQpOworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiZGJsa19wYXJhLmJ1Zl9zdGFydCAgICAgICA6JXhcbiIsCisJCQlidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zdGFydCk7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJkYmxrX2RhdGEuYnVmX3N0YXJ0ICAgICAgIDoleFxuIiwKKwkJCWJ1Zl9zcGVjLT5kYmxrX2RhdGEuYnVmX3N0YXJ0KTsKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJImRibGtfZGF0YTIuYnVmX3N0YXJ0ICAgICAgIDoleFxuIiwKKwkJCWJ1Zl9zcGVjLT5kYmxrX2RhdGEyLmJ1Zl9zdGFydCk7CisjaWZkZWYgSDI2NV8xMEJfTU1VX0RXCisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJtbXVfdmJoX2R3LmJ1Zl9zdGFydCAgICAgICA6JXhcbiIsCisJCQlidWZfc3BlYy0+bW11X3ZiaF9kdy5idWZfc3RhcnQpOworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiY21faGVhZGVyX2R3LmJ1Zl9zdGFydCAgICAgOiV4XG4iLAorCQkJYnVmX3NwZWMtPmNtX2hlYWRlcl9kdy5idWZfc3RhcnQpOworI2VuZGlmCisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJtcHJlZF9hYm92ZS5idWZfc3RhcnQgICAgIDoleFxuIiwKKwkJCWJ1Zl9zcGVjLT5tcHJlZF9hYm92ZS5idWZfc3RhcnQpOworI2lmZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJIm1wcmVkX212LmJ1Zl9zdGFydCAgICAgICAgOiV4XG4iLAorCQkJICBidWZfc3BlYy0+bXByZWRfbXYuYnVmX3N0YXJ0KTsKKyNlbmRpZgorCQlpZiAoKGdldF9kYmdfZmxhZzIoaGV2YykKKwkJCSYKKwkJCUgyNjVfREVCVUdfU0VORF9QQVJBTV9XSVRIX1JFRykKKwkJCT09IDApIHsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkicnBtLmJ1Zl9zdGFydCAgICAgICAgICAgICA6JXhcbiIsCisJCQkJICAgYnVmX3NwZWMtPnJwbS5idWZfc3RhcnQpOworCQl9CisJfQorCit9CisKK2VudW0gU2xpY2VUeXBlIHsKKwlCX1NMSUNFLAorCVBfU0xJQ0UsCisJSV9TTElDRQorfTsKKworLypVU0VfQlVGX0JMT0NLKi8KK3N0cnVjdCBCVUZfcyB7CisJdWxvbmcJc3RhcnRfYWRyOworCXUzMglzaXplOworCXUzMglsdW1hX3NpemU7CisJdWxvbmcJaGVhZGVyX2FkZHI7CisJdTMyIAloZWFkZXJfc2l6ZTsKKwlpbnQJdXNlZF9mbGFnOworCXVsb25nCXY0bF9yZWZfYnVmX2FkZHI7CisJdWxvbmcJY2hyb21hX2FkZHI7CisJdTMyCWNocm9tYV9zaXplOworfSAvKkJVRl90ICovOworCisvKiBsZXZlbCA2LCA2LjEgbWF4aW11bSBzbGljZSBudW1iZXIgaXMgODAwOyBvdGhlciBpcyAyMDAgKi8KKyNkZWZpbmUgTUFYX1NMSUNFX05VTSA4MDAKK3N0cnVjdCBQSUNfcyB7CisJaW50IGluZGV4OworCWludCBzY2F0dGVyX2FsbG9jOworCWludCBCVUZfaW5kZXg7CisJaW50IG12X2J1Zl9pbmRleDsKKwlpbnQgUE9DOworCWludCBkZWNvZGVfaWR4OworCWludCBzbGljZV90eXBlOworCWludCBSZWZOdW1fTDA7CisJaW50IFJlZk51bV9MMTsKKwlpbnQgbnVtX3Jlb3JkZXJfcGljOworCWludCBzdHJlYW1fb2Zmc2V0OworCXVuc2lnbmVkIGNoYXIgcmVmZXJlbmNlZDsKKwl1bnNpZ25lZCBjaGFyIG91dHB1dF9tYXJrOworCXVuc2lnbmVkIGNoYXIgcmVjb25fbWFyazsKKwl1bnNpZ25lZCBjaGFyIG91dHB1dF9yZWFkeTsKKwl1bnNpZ25lZCBjaGFyIGVycm9yX21hcms7CisJLy9kaXNfbWFyayA9IDA6ZGlzY2FyZCBtYXJrLGRpc19tYXJrID0gMTpubyBkaXNjYXJkIG1hcmsKKwl1bnNpZ25lZCBjaGFyIGRpc19tYXJrOworCS8qKi8gaW50IHNsaWNlX2lkeDsKKwlpbnQgbV9haVJlZlBPQ0xpc3QwW01BWF9TTElDRV9OVU1dWzE2XTsKKwlpbnQgbV9haVJlZlBPQ0xpc3QxW01BWF9TTElDRV9OVU1dWzE2XTsKKyNpZmRlZiBTVVBQT1JUX0xPTkdfVEVSTV9SUFMKKwl1bnNpZ25lZCBjaGFyIGxvbmdfdGVybV9yZWY7CisJdW5zaWduZWQgY2hhciBtX2FpUmVmTFRmbGdMaXN0MFtNQVhfU0xJQ0VfTlVNXVsxNl07CisJdW5zaWduZWQgY2hhciBtX2FpUmVmTFRmbGdMaXN0MVtNQVhfU0xJQ0VfTlVNXVsxNl07CisjZW5kaWYKKwkvKmJ1ZmZlciAqLworCXVuc2lnbmVkIGludCBoZWFkZXJfYWRyOworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJdW5zaWduZWQgY2hhciBkdl9lbmhhbmNlX2V4aXN0OworI2VuZGlmCisJY2hhciAqYXV4X2RhdGFfYnVmOworCWludCBhdXhfZGF0YV9zaXplOworCXVuc2lnbmVkIGxvbmcgY21hX2FsbG9jX2FkZHI7CisJc3RydWN0IHBhZ2UgKmFsbG9jX3BhZ2VzOworCXVuc2lnbmVkIGludCBtcHJlZF9tdl93cl9zdGFydF9hZGRyOworCWludCBtdl9zaXplOworCXVuc2lnbmVkIGludCBtY195X2FkcjsKKwl1bnNpZ25lZCBpbnQgbWNfdV92X2FkcjsKKyNpZmRlZiBTVVBQT1JUXzEwQklUCisJLyp1bnNpZ25lZCBpbnQgY29tcF9ib2R5X3NpemU7Ki8KKwl1bnNpZ25lZCBpbnQgZHdfeV9hZHI7CisJdW5zaWduZWQgaW50IGR3X3Vfdl9hZHI7CisjZW5kaWYKKwl1MzIJbHVtYV9zaXplOworCXUzMgljaHJvbWFfc2l6ZTsKKworCWludCBtY19jYW52YXNfeTsKKwlpbnQgbWNfY2FudmFzX3VfdjsKKwlpbnQgd2lkdGg7CisJaW50IGhlaWdodDsKKworCWludCB5X2NhbnZhc19pbmRleDsKKwlpbnQgdXZfY2FudmFzX2luZGV4OworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlzdHJ1Y3QgY2FudmFzX2NvbmZpZ19zIGNhbnZhc19jb25maWdbMl07CisjZW5kaWYKKyNpZmRlZiBTVVBQT1JUXzEwQklUCisJaW50IG1lbV9zYXZpbmdfbW9kZTsKKwl1MzIgYml0X2RlcHRoX2x1bWE7CisJdTMyIGJpdF9kZXB0aF9jaHJvbWE7CisjZW5kaWYKKyNpZmRlZiBMT1NMRVNTX0NPTVBSRVNTX01PREUKKwl1bnNpZ25lZCBpbnQgbG9zbGVzc19jb21wX2JvZHlfc2l6ZTsKKyNlbmRpZgorI2lmZGVmIEgyNjVfMTBCX01NVV9EVworCXUzMiBoZWFkZXJfZHdfYWRyOworI2VuZGlmCisJdW5zaWduZWQgY2hhciBwaWNfc3RydWN0OworCWludCB2Zl9yZWY7CisKKwl1MzIgcHRzOworCXU2NCBwdHM2NDsKKwl1NjQgdGltZXN0YW1wOworCisJdTMyIGFzcGVjdF9yYXRpb19pZGM7CisJdTMyIHNhcl93aWR0aDsKKwl1MzIgc2FyX2hlaWdodDsKKwl1MzIgZG91YmxlX3dyaXRlX21vZGU7CisJdTMyIHZpZGVvX3NpZ25hbF90eXBlOworCXVuc2lnbmVkIHNob3J0IGNvbmZvcm1hbmNlX3dpbmRvd19mbGFnOworCXVuc2lnbmVkIHNob3J0IGNvbmZfd2luX2xlZnRfb2Zmc2V0OworCXVuc2lnbmVkIHNob3J0IGNvbmZfd2luX3JpZ2h0X29mZnNldDsKKwl1bnNpZ25lZCBzaG9ydCBjb25mX3dpbl90b3Bfb2Zmc2V0OworCXVuc2lnbmVkIHNob3J0IGNvbmZfd2luX2JvdHRvbV9vZmZzZXQ7CisJdW5zaWduZWQgc2hvcnQgY2hyb21hX2Zvcm1hdF9pZGM7CisKKwkvKiBwaWN0dXJlIHFvcyBpbmZvbWF0aW9uKi8KKwlpbnQgbWF4X3FwOworCWludCBhdmdfcXA7CisJaW50IG1pbl9xcDsKKwlpbnQgbWF4X3NraXA7CisJaW50IGF2Z19za2lwOworCWludCBtaW5fc2tpcDsKKwlpbnQgbWF4X212OworCWludCBtaW5fbXY7CisJaW50IGF2Z19tdjsKKworCXUzMiBod19kZWNvZGVfdGltZTsKKwl1MzIgZnJhbWVfc2l6ZTsgLy8gRm9yIGZyYW1lIGJhc2UgbW9kZQorCWJvb2wgaXBfbW9kZTsKKwl1MzIgaGRyMTBwX2RhdGFfc2l6ZTsKKwljaGFyICpoZHIxMHBfZGF0YV9idWY7CisJc3RydWN0IGRtYV9mZW5jZSAqZmVuY2U7CisJYm9vbCBzaG93X2ZyYW1lOworfSAvKlBJQ190ICovOworCisjZGVmaW5lIE1BWF9USUxFX0NPTF9OVU0gICAgMTAKKyNkZWZpbmUgTUFYX1RJTEVfUk9XX05VTSAgIDIwCitzdHJ1Y3QgdGlsZV9zIHsKKwlpbnQgd2lkdGg7CisJaW50IGhlaWdodDsKKwlpbnQgc3RhcnRfY3VfeDsKKwlpbnQgc3RhcnRfY3VfeTsKKworCXVuc2lnbmVkIGludCBzYW9fdmJfc3RhcnRfYWRkcjsKKwl1bnNpZ25lZCBpbnQgc2FvX2Fidl9zdGFydF9hZGRyOworfTsKKworI2RlZmluZSBTRUlfTUFTVEVSX0RJU1BMQVlfQ09MT1JfTUFTSyAweDAwMDAwMDAxCisjZGVmaW5lIFNFSV9DT05URU5UX0xJR0hUX0xFVkVMX01BU0sgIDB4MDAwMDAwMDIKKyNkZWZpbmUgU0VJX0hEUjEwUExVU19NQVNLCQkJICAweDAwMDAwMDA0CisjZGVmaW5lIFNFSV9IRFJfQ1VWQV9NQVNLCSAgICAgIDB4MDAwMDAwMDgKKworCisjZGVmaW5lIFZGX1BPT0xfU0laRSAgICAgICAgMzIKKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKyNkZWZpbmUgREVDX1JFU1VMVF9OT05FICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVDX1JFU1VMVF9ET05FICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVDX1JFU1VMVF9BR0FJTiAgICAgICAgICAgIDIKKyNkZWZpbmUgREVDX1JFU1VMVF9DT05GSUdfUEFSQU0gICAgIDMKKyNkZWZpbmUgREVDX1JFU1VMVF9FUlJPUiAgICAgICAgICAgIDQKKyNkZWZpbmUgREVDX0lOSVRfUElDTElTVAkJCTUKKyNkZWZpbmUgREVDX1VOSU5JVF9QSUNMSVNUCQkJNgorI2RlZmluZSBERUNfUkVTVUxUX0dFVF9EQVRBICAgICAgICAgNworI2RlZmluZSBERUNfUkVTVUxUX0dFVF9EQVRBX1JFVFJZICAgOAorI2RlZmluZSBERUNfUkVTVUxUX0VPUyAgICAgICAgICAgICAgOQorI2RlZmluZSBERUNfUkVTVUxUX0ZPUkNFX0VYSVQgICAgICAgMTAKKyNkZWZpbmUgREVDX1JFU1VMVF9GUkVFX0NBTlZBUyAgICAgIDExCisKKworc3RhdGljIHZvaWQgdmgyNjVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworc3RhdGljIHZvaWQgdmgyNjVfdGltZW91dF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgdm9pZCB2aDI2NV9ub3RpZnlfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworCisjZW5kaWYKKworc3RydWN0IGRlYnVnX2xvZ19zIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdWludDhfdCBkYXRhOyAvKndpbGwgYWxsb2MgbW9yZSBzaXplKi8KK307CisKK3N0cnVjdCBtaDI2NV9mZW5jZV92Zl90IHsKKwl1MzIgdXNlZF9zaXplOworCXN0cnVjdCB2ZnJhbWVfcyAqZmVuY2VfdmZbVkZfUE9PTF9TSVpFXTsKK307CisKK3N0cnVjdCBoZXZjX3N0YXRlX3MgeworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXY7CisJdm9pZCAoKnZkZWNfY2IpKHN0cnVjdCB2ZGVjX3MgKiwgdm9pZCAqKTsKKwl2b2lkICp2ZGVjX2NiX2FyZzsKKwlzdHJ1Y3QgdmZyYW1lX2NodW5rX3MgKmNodW5rOworCWludCBkZWNfcmVzdWx0OworCXUzMiB0aW1lb3V0X3Byb2Nlc3Npbmc7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3RydWN0IHdvcmtfc3RydWN0IHRpbWVvdXRfd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgbm90aWZ5X3dvcms7CisJc3RydWN0IHdvcmtfc3RydWN0IHNldF9jbGtfd29yazsKKwkvKiB0aW1lb3V0IGhhbmRsZSAqLworCXVuc2lnbmVkIGxvbmcgaW50IHN0YXJ0X3Byb2Nlc3NfdGltZTsKKwl1bnNpZ25lZCBpbnQgbGFzdF9sY3VfaWR4OworCXVuc2lnbmVkIGludCBkZWNvZGVfdGltZW91dF9jb3VudDsKKwl1bnNpZ25lZCBpbnQgdGltZW91dF9udW07CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwl1bnNpZ25lZCBjaGFyIHN3aXRjaF9kdmxheWVyX2ZsYWc7CisJdW5zaWduZWQgY2hhciBub19zd2l0Y2hfZHZsYXllcl9jb3VudDsKKwl1bnNpZ25lZCBjaGFyIGJ5cGFzc19kdmVubF9lbmFibGU7CisJdW5zaWduZWQgY2hhciBieXBhc3NfZHZlbmw7CisjZW5kaWYKKwl1bnNpZ25lZCBjaGFyIHN0YXJ0X3BhcnNlcl90eXBlOworCS8qc3RhcnRfZGVjb2RpbmdfZmxhZzoKKwl2cHMvcHBzL3Nwcy9pZHIgaW5mbyBmcm9tIHVjb2RlKi8KKwl1bnNpZ25lZCBjaGFyIHN0YXJ0X2RlY29kaW5nX2ZsYWc7CisJdW5zaWduZWQgY2hhciBycHNfc2V0X2lkOworCXVuc2lnbmVkIGNoYXIgZW9zOworCWludCBwaWNfZGVjb2RlZF9sY3VfaWR4OworCXU4IG92ZXJfZGVjb2RlOworCXU4IGVtcHR5X2ZsYWc7CisjZW5kaWYKKwlzdHJ1Y3QgdmZyYW1lX3MgdmZyYW1lX2R1bW15OworCWNoYXIgKnByb3ZpZGVyX25hbWU7CisJaW50IGluZGV4OworCXN0cnVjdCBkZXZpY2UgKmNtYV9kZXY7CisJdW5zaWduZWQgY2hhciBtX2luc19mbGFnOworCXVuc2lnbmVkIGNoYXIgZG9sYnlfZW5oYW5jZV9mbGFnOworCXVuc2lnbmVkIGxvbmcgYnVmX3N0YXJ0OworCXUzMiBidWZfc2l6ZTsKKwl1MzIgbXZfYnVmX3NpemU7CisKKwlzdHJ1Y3QgQnVmZkluZm9fcyB3b3JrX3NwYWNlX2J1Zl9zdG9yZTsKKwlzdHJ1Y3QgQnVmZkluZm9fcyAqd29ya19zcGFjZV9idWY7CisKKwl1OCBhdXhfZGF0YV9kaXJ0eTsKKwl1MzIgcHJlZml4X2F1eF9zaXplOworCXUzMiBzdWZmaXhfYXV4X3NpemU7CisJdm9pZCAqYXV4X2FkZHI7CisJdm9pZCAqcnBtX2FkZHI7CisJdm9pZCAqbG1lbV9hZGRyOworCWRtYV9hZGRyX3QgYXV4X3BoeV9hZGRyOworCWRtYV9hZGRyX3QgcnBtX3BoeV9hZGRyOworCWRtYV9hZGRyX3QgbG1lbV9waHlfYWRkcjsKKworCXVuc2lnbmVkIGludCBwaWNfbGlzdF9pbml0X2ZsYWc7CisJdW5zaWduZWQgaW50IHVzZV9jbWFfZmxhZzsKKworCXVuc2lnbmVkIHNob3J0ICpycG1fcHRyOworCXVuc2lnbmVkIHNob3J0ICpsbWVtX3B0cjsKKwl1bnNpZ25lZCBzaG9ydCAqZGVidWdfcHRyOworCWludCBkZWJ1Z19wdHJfc2l6ZTsKKwlpbnQgcGljX3c7CisJaW50IHBpY19oOworCWludCBsY3VfeF9udW07CisJaW50IGxjdV95X251bTsKKwlpbnQgbGN1X3RvdGFsOworCWludCBsY3Vfc2l6ZTsKKwlpbnQgbGN1X3NpemVfbG9nMjsKKwlpbnQgbGN1X3hfbnVtX3ByZTsKKwlpbnQgbGN1X3lfbnVtX3ByZTsKKwlpbnQgZmlyc3RfcGljX2FmdGVyX3JlY292ZXI7CisKKwlpbnQgbnVtX3RpbGVfY29sOworCWludCBudW1fdGlsZV9yb3c7CisJaW50IHRpbGVfZW5hYmxlZDsKKwlpbnQgdGlsZV94OworCWludCB0aWxlX3k7CisJaW50IHRpbGVfeV94OworCWludCB0aWxlX3N0YXJ0X2xjdV94OworCWludCB0aWxlX3N0YXJ0X2xjdV95OworCWludCB0aWxlX3dpZHRoX2xjdTsKKwlpbnQgdGlsZV9oZWlnaHRfbGN1OworCisJaW50IHNsaWNlX3R5cGU7CisJdW5zaWduZWQgaW50IHNsaWNlX2FkZHI7CisJdW5zaWduZWQgaW50IHNsaWNlX3NlZ21lbnRfYWRkcjsKKworCXVuc2lnbmVkIGNoYXIgaW50ZXJsYWNlX2ZsYWc7CisJdW5zaWduZWQgY2hhciBjdXJyX3BpY19zdHJ1Y3Q7CisJdW5zaWduZWQgY2hhciBmcmFtZV9maWVsZF9pbmZvX3ByZXNlbnRfZmxhZzsKKworCXVuc2lnbmVkIHNob3J0IHNwc19udW1fcmVvcmRlcl9waWNzXzA7CisJdW5zaWduZWQgc2hvcnQgbWlzY19mbGFnMDsKKwlpbnQgbV90ZW1wb3JhbElkOworCWludCBtX25hbFVuaXRUeXBlOworCWludCBUTVZQRmxhZzsKKwlpbnQgaXNOZXh0U2xpY2VTZWdtZW50OworCWludCBMRENGbGFnOworCWludCBtX3BvY1JhbmRvbUFjY2VzczsKKwlpbnQgcGxldmVsOworCWludCBNYXhOdW1NZXJnZUNhbmQ7CisKKwlpbnQgbmV3X3BpYzsKKwlpbnQgbmV3X3RpbGU7CisJaW50IGN1cnJfUE9DOworCWludCBpUHJldlBPQzsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJaW50IGRlY29kZWRfcG9jOworCXN0cnVjdCBQSUNfcyAqZGVjb2RpbmdfcGljOworI2VuZGlmCisJaW50IGlQcmV2VGlkMFBPQzsKKwlpbnQgbGlzdF9ubzsKKwlpbnQgUmVmTnVtX0wwOworCWludCBSZWZOdW1fTDE7CisJaW50IENvbEZyb21MMEZsYWc7CisJaW50IExvbmdUZXJtX0N1cnI7CisJaW50IExvbmdUZXJtX0NvbDsKKwlpbnQgQ29sX1BPQzsKKwlpbnQgTG9uZ1Rlcm1fUmVmOworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlpbnQgbV9wb2NSYW5kb21BY2Nlc3NfYmFrOworCWludCBjdXJyX1BPQ19iYWs7CisJaW50IGlQcmV2UE9DX2JhazsKKwlpbnQgaVByZXZUaWQwUE9DX2JhazsKKwl1bnNpZ25lZCBjaGFyIHN0YXJ0X3BhcnNlcl90eXBlX2JhazsKKwl1bnNpZ25lZCBjaGFyIHN0YXJ0X2RlY29kaW5nX2ZsYWdfYmFrOworCXVuc2lnbmVkIGNoYXIgcnBzX3NldF9pZF9iYWs7CisJaW50IHBpY19kZWNvZGVkX2xjdV9pZHhfYmFrOworCWludCBkZWNvZGVfaWR4X2JhazsKKyNlbmRpZgorCXN0cnVjdCBQSUNfcyAqY3VyX3BpYzsKKwlzdHJ1Y3QgUElDX3MgKmNvbF9waWM7CisJaW50IHNraXBfZmxhZzsKKwlpbnQgZGVjb2RlX2lkeDsKKwlpbnQgc2xpY2VfaWR4OworCXVuc2lnbmVkIGNoYXIgaGF2ZV92cHM7CisJdW5zaWduZWQgY2hhciBoYXZlX3NwczsKKwl1bnNpZ25lZCBjaGFyIGhhdmVfcHBzOworCXVuc2lnbmVkIGNoYXIgaGF2ZV92YWxpZF9zdGFydF9zbGljZTsKKwl1bnNpZ25lZCBjaGFyIHdhaXRfYnVmOworCXVuc2lnbmVkIGNoYXIgZXJyb3JfZmxhZzsKKwl1bnNpZ25lZCBpbnQgZXJyb3Jfc2tpcF9uYWxfY291bnQ7CisJbG9uZyB1c2VkXzRrX251bTsKKworCXVuc2lnbmVkIGNoYXIKKwlpZ25vcmVfYnVmbWdyX2Vycm9yOwkvKiBiaXQgMCwgZm9yIGRlY29kaW5nOworCQkJYml0IDEsIGZvciBkaXNwbGF5aW5nCisJCQliaXQgMSBtdXN0IGJlIHNldCBpZiBiaXQgMCBpcyAxKi8KKwlpbnQgUEJfc2tpcF9tb2RlOworCWludCBQQl9za2lwX2NvdW50X2FmdGVyX2RlY29kaW5nOworI2lmZGVmIFNVUFBPUlRfMTBCSVQKKwlpbnQgbWVtX3NhdmluZ19tb2RlOworI2VuZGlmCisjaWZkZWYgTE9TTEVTU19DT01QUkVTU19NT0RFCisJdW5zaWduZWQgaW50IGxvc2xlc3NfY29tcF9ib2R5X3NpemU7CisjZW5kaWYKKwlpbnQgcHRzX21vZGU7CisJaW50IGxhc3RfbG9va3VwX3B0czsKKwlpbnQgbGFzdF9wdHM7CisJdTY0IGxhc3RfbG9va3VwX3B0c191czY0OworCXU2NCBsYXN0X3B0c191czY0OworCXUzMiBzaGlmdF9ieXRlX2NvdW50X2xvOworCXUzMiBzaGlmdF9ieXRlX2NvdW50X2hpOworCWludCBwdHNfbW9kZV9zd2l0Y2hpbmdfY291bnQ7CisJaW50IHB0c19tb2RlX3JlY292ZXJ5X2NvdW50OworCisJaW50IHBpY19udW07CisKKwkvKiovCisJdW5pb24gcGFyYW1fdSBwYXJhbTsKKworCXN0cnVjdCB0aWxlX3MgbV90aWxlW01BWF9USUxFX1JPV19OVU1dW01BWF9USUxFX0NPTF9OVU1dOworCisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJc3RydWN0IEJVRl9zIG1fQlVGW0JVRl9QT09MX1NJWkVdOworCXN0cnVjdCBCVUZfcyBtX212X0JVRltNQVhfUkVGX1BJQ19OVU1dOworCXN0cnVjdCBQSUNfcyAqbV9QSUNbTUFYX1JFRl9QSUNfTlVNXTsKKworCURFQ0xBUkVfS0ZJRk8obmV3ZnJhbWVfcSwgc3RydWN0IHZmcmFtZV9zICosIFZGX1BPT0xfU0laRSk7CisJREVDTEFSRV9LRklGTyhkaXNwbGF5X3EsIHN0cnVjdCB2ZnJhbWVfcyAqLCBWRl9QT09MX1NJWkUpOworCURFQ0xBUkVfS0ZJRk8ocGVuZGluZ19xLCBzdHJ1Y3QgdmZyYW1lX3MgKiwgVkZfUE9PTF9TSVpFKTsKKwlzdHJ1Y3QgdmZyYW1lX3MgdmZwb29sW1ZGX1BPT0xfU0laRV07CisKKwl1MzIgc3RhdDsKKwl1MzIgZnJhbWVfd2lkdGg7CisJdTMyIGZyYW1lX2hlaWdodDsKKwl1MzIgZnJhbWVfZHVyOworCXUzMiBmcmFtZV9hcjsKKwl1MzIgYml0X2RlcHRoX2x1bWE7CisJdTMyIGJpdF9kZXB0aF9jaHJvbWE7CisJdTMyIHZpZGVvX3NpZ25hbF90eXBlOworCXUzMiB2aWRlb19zaWduYWxfdHlwZV9kZWJ1ZzsKKwl1MzIgc2F2ZWRfcmVzb2x1dGlvbjsKKwlib29sIGdldF9mcmFtZV9kdXI7CisJdTMyIGVycm9yX3dhdGNoZG9nX2NvdW50OworCXUzMiBlcnJvcl9za2lwX25hbF93dF9jbnQ7CisJdTMyIGVycm9yX3N5c3RlbV93YXRjaGRvZ19jb3VudDsKKworI2lmZGVmIERFQlVHX1BUUworCXVuc2lnbmVkIGxvbmcgcHRzX21pc3NlZDsKKwl1bnNpZ25lZCBsb25nIHB0c19oaXQ7CisjZW5kaWYKKwlzdHJ1Y3QgZGVjX3N5c2luZm8gdmgyNjVfYW1zdHJlYW1fZGVjX2luZm87CisJdW5zaWduZWQgY2hhciBpbml0X2ZsYWc7CisJdW5zaWduZWQgY2hhciBmaXJzdF9zY19jaGVja2VkOworCXVuc2lnbmVkIGNoYXIgdW5pbml0X2xpc3Q7CisJdTMyIHN0YXJ0X2RlY29kaW5nX3RpbWU7CisKKwlpbnQgc2hvd19mcmFtZV9udW07CisjaWZkZWYgVVNFX1VOSU5JVF9TRU1BCisJc3RydWN0IHNlbWFwaG9yZSBoMjY1X3VuaW5pdF9kb25lX3NlbWE7CisjZW5kaWYKKwlpbnQgZmF0YWxfZXJyb3I7CisKKworCXUzMiBzZWlfcHJlc2VudF9mbGFnOworCXZvaWQgKmZyYW1lX21tdV9tYXBfYWRkcjsKKwlkbWFfYWRkcl90IGZyYW1lX21tdV9tYXBfcGh5X2FkZHI7CisJdW5zaWduZWQgaW50IG1tdV9tY19idWZfc3RhcnQ7CisJdW5zaWduZWQgaW50IG1tdV9tY19idWZfZW5kOworCXVuc2lnbmVkIGludCBtbXVfbWNfc3RhcnRfNGtfYWRyOworCXZvaWQgKm1tdV9ib3g7CisJdm9pZCAqYm1tdV9ib3g7CisJaW50IG1tdV9lbmFibGU7CisjaWZkZWYgSDI2NV8xMEJfTU1VX0RXCisJdm9pZCAqZnJhbWVfZHdfbW11X21hcF9hZGRyOworCWRtYV9hZGRyX3QgZnJhbWVfZHdfbW11X21hcF9waHlfYWRkcjsKKwl2b2lkICptbXVfYm94X2R3OworCWludCBkd19tbXVfZW5hYmxlOworI2VuZGlmCisKKwl1bnNpZ25lZCBpbnQgZGVjX3N0YXR1czsKKworCS8qIGRhdGEgZm9yIFNFSV9NQVNURVJfRElTUExBWV9DT0xPUiAqLworCXVuc2lnbmVkIGludCBwcmltYXJpZXNbM11bMl07CisJdW5zaWduZWQgaW50IHdoaXRlX3BvaW50WzJdOworCXVuc2lnbmVkIGludCBsdW1pbmFuY2VbMl07CisJLyogZGF0YSBmb3IgU0VJX0NPTlRFTlRfTElHSFRfTEVWRUwgKi8KKwl1bnNpZ25lZCBpbnQgY29udGVudF9saWdodF9sZXZlbFsyXTsKKworCXN0cnVjdCBQSUNfcyAqcHJlX3RvcF9waWM7CisJc3RydWN0IFBJQ19zICpwcmVfYm90X3BpYzsKKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlpbnQgZG91YmxlX3dyaXRlX21vZGU7CisJaW50IGR5bmFtaWNfYnVmX251bV9tYXJnaW47CisJaW50IHN0YXJ0X2FjdGlvbjsKKwlpbnQgc2F2ZV9idWZmZXJfbW9kZTsKKyNlbmRpZgorCXUzMiBpX29ubHk7CisJc3RydWN0IGxpc3RfaGVhZCBsb2dfbGlzdDsKKwl1MzIgdWNvZGVfcGF1c2VfcG9zOworCXUzMiBzdGFydF9zaGlmdF9ieXRlczsKKworCXUzMiB2Zl9wcmVfY291bnQ7CisJYXRvbWljX3QgdmZfZ2V0X2NvdW50OworCWF0b21pY190IHZmX3B1dF9jb3VudDsKKyNpZmRlZiBTV0FQX0hFVkNfVUNPREUKKwlkbWFfYWRkcl90IG1jX2RtYV9oYW5kbGU7CisJdm9pZCAqbWNfY3B1X2FkZHI7CisJaW50IHN3YXBfc2l6ZTsKKwl1bG9uZyBzd2FwX2FkZHI7CisjZW5kaWYKKyNpZmRlZiBERVRSRUZJTExfRU5BQkxFCisJZG1hX2FkZHJfdCBkZXRidWZfYWRyOworCXUxNiAqZGV0YnVmX2Fkcl92aXJ0OworCXU4IGRlbHJlZmlsbF9jaGVjazsKKyNlbmRpZgorCXU4IGhlYWRfZXJyb3JfZmxhZzsKKwlpbnQgdmFsdmVfY291bnQ7CisJc3RydWN0IGZpcm13YXJlX3MgKmZ3OworCWludCBtYXhfcGljX3c7CisJaW50IG1heF9waWNfaDsKKyNpZmRlZiBBR0FJTl9IQVNfVEhSRVNIT0xECisJdTggbmV4dF9hZ2Fpbl9mbGFnOworCXUzMiBwcmVfcGFyc2VyX3dyX3B0cjsKKyNlbmRpZgorCXUzMiByYXRpb19jb250cm9sOworCXUzMiBmaXJzdF9waWNfZmxhZzsKKwl1MzIgZGVjb2RlX3NpemU7CisJc3RydWN0IG11dGV4IGNodW5rc19tdXRleDsKKwlpbnQgbmVlZF9jYWNoZV9zaXplOworCXU2NCBzY19zdGFydF90aW1lOworCXUzMiBza2lwX25hbF9jb3VudDsKKwlib29sIGlzX3N3YXA7CisJYm9vbCBpc180azsKKworCWludCBmcmFtZWluZm9fZW5hYmxlOworCXN0cnVjdCB2ZnJhbWVfcW9zX3MgdmZyYW1lX3FvczsKKwlib29sIGlzX3VzZWRfdjRsOworCXZvaWQgKnY0bDJfY3R4OworCWJvb2wgdjRsX3BhcmFtc19wYXJzZWQ7CisJdTMyIG1lbV9tYXBfbW9kZTsKKwl1MzIgcGVyZm9ybWFuY2VfcHJvZmlsZTsKKwlzdHJ1Y3QgdmRlY19pbmZvICpndnM7CisJYm9vbCBpcF9tb2RlOworCXUzMiBrcGlfZmlyc3RfaV9jb21taW5nOworCXUzMiBrcGlfZmlyc3RfaV9kZWNvZGVkOworCWludCBzaWRlYmluZF90eXBlOworCWludCBzaWRlYmluZF9jaGFubmVsX2lkOworCXUzMiBwcmVfcGFyc2VyX3ZpZGVvX3JwOworCXUzMiBwcmVfcGFyc2VyX3ZpZGVvX3dwOworCWJvb2wgZHZfZHVhbGxheWVyOworCXUzMiBwb2NfZXJyb3JfY291bnQ7CisJdTMyIHRpbWVvdXRfZmxhZzsKKwl1bG9uZyB0aW1lb3V0OworCWJvb2wgZGlzY2FyZF9kdl9kYXRhOworCWJvb2wgZW5hYmxlX2ZlbmNlOworCWludCBmZW5jZV91c2FnZTsKKwlpbnQgYnVmZmVyX3dyYXBbTUFYX1JFRl9QSUNfTlVNXTsKKwlpbnQgbG93X2xhdGVuY3lfZmxhZzsKKwl1MzIgbWV0YWRhdGFfY29uZmlnX2ZsYWc7CisJaW50IGxhc3Rfd2lkdGg7CisJaW50IGxhc3RfaGVpZ2h0OworCWludCB1c2VkX2J1Zl9udW07CisJdTMyIGRpcnR5X3NoaWZ0X2ZsYWc7CisJdTMyIGVuZGlhbjsKKwl1bG9uZyBmYl90b2tlbjsKKwlpbnQgZGVjX2FnYWluX2NudDsKKwlzdHJ1Y3QgbWgyNjVfZmVuY2VfdmZfdCBmZW5jZV92Zl9zOworCXN0cnVjdCBtdXRleCBmZW5jZV9tdXRleDsKKwlkbWFfYWRkcl90IHJkbWFfcGh5X2FkcjsKKwl1bnNpZ25lZCAqcmRtYV9hZHI7CisJc3RydWN0IHRyYWNlX2RlY29kZXJfbmFtZSB0cmFjZTsKK30gLypoZXZjX3N0cnVfdCAqLzsKKworI2lmZGVmIEFHQUlOX0hBU19USFJFU0hPTEQKK3N0YXRpYyB1MzIgYWdhaW5fdGhyZXNob2xkOworI2VuZGlmCisjaWZkZWYgU0VORF9MTUVNX1dJVEhfUlBNCisjZGVmaW5lIGdldF9sbWVtX3BhcmFtcyhoZXZjLCBsYWRyKSBcCisJaGV2Yy0+bG1lbV9wdHJbbGFkciAtIChsYWRyICYgMHgzKSArIDMgLSAobGFkciAmIDB4MyldCisKKworc3RhdGljIGludCBnZXRfZnJhbWVfbW11X21hcF9zaXplKHZvaWQpCit7CisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKQorCQlyZXR1cm4gKE1BWF9GUkFNRV84S19OVU0gKiA0KTsKKworCXJldHVybiAoTUFYX0ZSQU1FXzRLX05VTSAqIDQpOworfQorCitzdGF0aWMgaW50IGlzX292ZXJzaXplKGludCB3LCBpbnQgaCkKK3sKKwlpbnQgbWF4ID0gKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKT8KKwkJTUFYX1NJWkVfOEsgOiBNQVhfU0laRV80SzsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1RCkKKwkJbWF4ID0gTUFYX1NJWkVfMks7CisKKwlpZiAodyA8IDAgfHwgaCA8IDApCisJCXJldHVybiB0cnVlOworCisJaWYgKGggIT0gMCAmJiAodyA+IG1heCAvIGgpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworaW50IGlzX292ZXJzaXplX2V4KGludCB3LCBpbnQgaCkKK3sKKwlpbnQgbWF4ID0gKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKSA/CisJCU1BWF9TSVpFXzhLIDogTUFYX1NJWkVfNEs7CisKKwlpZiAodyA9PSAwIHx8IGggPT0gMCkKKwkJcmV0dXJuIHRydWU7CisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKSB7CisJCWlmICh3ID4gODE5MiB8fCBoID4gNDYwOCkKKwkJCXJldHVybiB0cnVlOworCX0gZWxzZSB7CisJCWlmICh3ID4gNDA5NiB8fCBoID4gMjMwNCkKKwkJCXJldHVybiB0cnVlOworCX0KKworCWlmICh3IDwgMCB8fCBoIDwgMCkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoaCAhPSAwICYmICh3ID4gbWF4IC8gaCkpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCisKK3ZvaWQgY2hlY2tfaGVhZF9lcnJvcihzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworI2RlZmluZSBwY21fZW5hYmxlZF9mbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwCisjZGVmaW5lIHBjbV9zYW1wbGVfYml0X2RlcHRoX2x1bWEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDEKKyNkZWZpbmUgcGNtX3NhbXBsZV9iaXRfZGVwdGhfY2hyb21hICAgICAgICAgICAgICAgICAgICAgICAweDA0MgorCWhldmMtPmhlYWRfZXJyb3JfZmxhZyA9IDA7CisJaWYgKChlcnJvcl9oYW5kbGVfcG9saWN5ICYgMHg0MCkgPT0gMCkKKwkJcmV0dXJuOworCWlmIChnZXRfbG1lbV9wYXJhbXMoaGV2YywgcGNtX2VuYWJsZWRfZmxhZykpIHsKKwkJdWludDE2X3QgcGNtX2RlcHRoX2x1bWEgPSBnZXRfbG1lbV9wYXJhbXMoCisJCQloZXZjLCBwY21fc2FtcGxlX2JpdF9kZXB0aF9sdW1hKTsKKwkJdWludDE2X3QgcGNtX3NhbXBsZV9jaHJvbWEgPSBnZXRfbG1lbV9wYXJhbXMoCisJCQloZXZjLCBwY21fc2FtcGxlX2JpdF9kZXB0aF9jaHJvbWEpOworCQlpZiAocGNtX2RlcHRoX2x1bWEgPgorCQkJaGV2Yy0+Yml0X2RlcHRoX2x1bWEgfHwKKwkJCXBjbV9zYW1wbGVfY2hyb21hID4KKwkJCWhldmMtPmJpdF9kZXB0aF9jaHJvbWEpIHsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJlcnJvciwgcGNtIGJpdCBkZXB0aCAlZCwgJWQgaXMgZ3JlYXRlciB0aGFuIG5vcm1hbCBiaXQgZGVwdGggJWQsICVkXG4iLAorCQkJcGNtX2RlcHRoX2x1bWEsCisJCQlwY21fc2FtcGxlX2Nocm9tYSwKKwkJCWhldmMtPmJpdF9kZXB0aF9sdW1hLAorCQkJaGV2Yy0+Yml0X2RlcHRoX2Nocm9tYSk7CisJCQloZXZjLT5oZWFkX2Vycm9yX2ZsYWcgPSAxOworCQl9CisJfQorfQorI2VuZGlmCisKKyNpZmRlZiBTVVBQT1JUXzEwQklUCisvKiBMb3NsZXNzIGNvbXByZXNzaW9uIGJvZHkgYnVmZmVyIHNpemUgNEsgcGVyIDY0eDMyIChqdCkgKi8KK3N0YXRpYyBpbnQgY29tcHV0ZV9sb3NsZXNzX2NvbXBfYm9keV9zaXplKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsCisJaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbWVtX3NhdmluZ19tb2RlKQoreworCWludCB3aWR0aF94NjQ7CisJaW50ICAgICBoZWlnaHRfeDMyOworCWludCAgICAgYnNpemU7CisKKwl3aWR0aF94NjQgPSB3aWR0aCArIDYzOworCXdpZHRoX3g2NCA+Pj0gNjsKKworCWhlaWdodF94MzIgPSBoZWlnaHQgKyAzMTsKKwloZWlnaHRfeDMyID4+PSA1OworCWlmIChtZW1fc2F2aW5nX21vZGUgPT0gMSAmJiBoZXZjLT5tbXVfZW5hYmxlKQorCQlic2l6ZSA9IDMyMDAgKiB3aWR0aF94NjQgKiBoZWlnaHRfeDMyOworCWVsc2UgaWYgKG1lbV9zYXZpbmdfbW9kZSA9PSAxKQorCQlic2l6ZSA9IDMwNzIgKiB3aWR0aF94NjQgKiBoZWlnaHRfeDMyOworCWVsc2UKKwkJYnNpemUgPSA0MDk2ICogd2lkdGhfeDY0ICogaGVpZ2h0X3gzMjsKKworCXJldHVybiAgYnNpemU7Cit9CisKKy8qIExvc2xlc3MgY29tcHJlc3Npb24gaGVhZGVyIGJ1ZmZlciBzaXplIDMyYnl0ZXMgcGVyIDEyOHg2NCAoanQpICovCitzdGF0aWMgaW50IGNvbXB1dGVfbG9zbGVzc19jb21wX2hlYWRlcl9zaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKwlpbnQgICAgIHdpZHRoX3gxMjg7CisJaW50ICAgICBoZWlnaHRfeDY0OworCWludCAgICAgaHNpemU7CisKKwl3aWR0aF94MTI4ID0gd2lkdGggKyAxMjc7CisJd2lkdGhfeDEyOCA+Pj0gNzsKKworCWhlaWdodF94NjQgPSBoZWlnaHQgKyA2MzsKKwloZWlnaHRfeDY0ID4+PSA2OworCisJaHNpemUgPSAzMip3aWR0aF94MTI4KmhlaWdodF94NjQ7CisKKwlyZXR1cm4gIGhzaXplOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgYWRkX2xvZyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCWNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworI2RlZmluZSBIRVZDX0xPR19CVUYJCTE5NgorCXN0cnVjdCBkZWJ1Z19sb2dfcyAqbG9nX2l0ZW07CisJdW5zaWduZWQgY2hhciBidWZbSEVWQ19MT0dfQlVGXTsKKwlpbnQgbGVuID0gMDsKKwl2YV9saXN0IGFyZ3M7CisJbXV0ZXhfbG9jaygmdmgyNjVfbG9nX211dGV4KTsKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWxlbiA9IHNwcmludGYoYnVmLCAiPCVsZD4gICA8JTA1ZD4gIiwKKwkJamlmZmllcywgaGV2Yy0+ZGVjb2RlX2lkeCk7CisJbGVuICs9IHZzbnByaW50ZihidWYgKyBsZW4sCisJCUhFVkNfTE9HX0JVRiAtIGxlbiwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJbG9nX2l0ZW0gPSBrbWFsbG9jKAorCQlzaXplb2Yoc3RydWN0IGRlYnVnX2xvZ19zKSArIGxlbiwKKwkJR0ZQX0tFUk5FTCk7CisJaWYgKGxvZ19pdGVtKSB7CisJCUlOSVRfTElTVF9IRUFEKCZsb2dfaXRlbS0+bGlzdCk7CisJCXN0cmNweSgmbG9nX2l0ZW0tPmRhdGEsIGJ1Zik7CisJCWxpc3RfYWRkX3RhaWwoJmxvZ19pdGVtLT5saXN0LAorCQkJJmhldmMtPmxvZ19saXN0KTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ2aDI2NV9sb2dfbXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2xvZyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWludCBpID0gMDsKKwlzdHJ1Y3QgZGVidWdfbG9nX3MgKmxvZ19pdGVtLCAqdG1wOworCW11dGV4X2xvY2soJnZoMjY1X2xvZ19tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxvZ19pdGVtLCB0bXAsICZoZXZjLT5sb2dfbGlzdCwgbGlzdCkgeworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiW0xPRyUwNGRdJXNcbiIsCisJCQlpKyssCisJCQkmbG9nX2l0ZW0tPmRhdGEpOworCQlsaXN0X2RlbCgmbG9nX2l0ZW0tPmxpc3QpOworCQlrZnJlZShsb2dfaXRlbSk7CisJfQorCW11dGV4X3VubG9jaygmdmgyNjVfbG9nX211dGV4KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgaXNfc2tpcF9kZWNvZGluZyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCQlzdHJ1Y3QgUElDX3MgKnBpYykKK3sKKwlpZiAocGljLT5lcnJvcl9tYXJrCisJCSYmICgoaGV2Yy0+aWdub3JlX2J1Zm1ncl9lcnJvciAmIDB4MSkgPT0gMCkpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9waWNfcG9jKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsCisJCXVuc2lnbmVkIGludCBpZHgpCit7CisJaWYgKGlkeCAhPSAweGZmCisJCSYmIGlkeCA8IE1BWF9SRUZfUElDX05VTQorCQkmJiBoZXZjLT5tX1BJQ1tpZHhdKQorCQlyZXR1cm4gaGV2Yy0+bV9QSUNbaWR4XS0+UE9DOworCXJldHVybiBJTlZBTElEX1BPQzsKK30KKworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX01VTFRJX0RFQworc3RhdGljIGludCBnZXRfdmFsaWRfZG91YmxlX3dyaXRlX21vZGUoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwl1MzIgZHcgPSAoaGV2Yy0+bV9pbnNfZmxhZyAmJgorCQkoKGRvdWJsZV93cml0ZV9tb2RlICYgMHg4MDAwMDAwMCkgPT0gMCkpID8KKwkJaGV2Yy0+ZG91YmxlX3dyaXRlX21vZGUgOgorCQkoZG91YmxlX3dyaXRlX21vZGUgJiAweDdmZmZmZmZmKTsKKwlpZiAoZHcgJiAweDIwKSB7CisJCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX1QzKQorCQkJJiYgKChkdyAmIDB4ZikgPT0gMiB8fCAoZHcgJiAweGYpID09IDMpKSB7CisJCQlwcl9pbmZvKCJNTVUgZG91ZWJsZSB3cml0ZSAxOjQgbm90IHN1cHBvcnRlZCAhISFcbiIpOworCQkJZHcgPSAwOworCQl9CisJfQorCXJldHVybiBkdzsKK30KKworc3RhdGljIGludCBnZXRfZHluYW1pY19idWZfbnVtX21hcmdpbihzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCXJldHVybiAoaGV2Yy0+bV9pbnNfZmxhZyAmJgorCQkoKGR5bmFtaWNfYnVmX251bV9tYXJnaW4gJiAweDgwMDAwMDAwKSA9PSAwKSkgPworCQloZXZjLT5keW5hbWljX2J1Zl9udW1fbWFyZ2luIDoKKwkJKGR5bmFtaWNfYnVmX251bV9tYXJnaW4gJiAweDdmZmZmZmZmKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGdldF9kb3VibGVfd3JpdGVfbW9kZShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCXUzMiB2YWxpZF9kd19tb2RlID0gZ2V0X3ZhbGlkX2RvdWJsZV93cml0ZV9tb2RlKGhldmMpOworCWludCB3ID0gaGV2Yy0+cGljX3c7CisJaW50IGggPSBoZXZjLT5waWNfaDsKKwl1MzIgZHcgPSAweDE7IC8qMToxKi8KKworCWlmIChoZXZjLT5pc191c2VkX3Y0bCkgeworCQl1bnNpZ25lZCBpbnQgb3V0OworCisJCXZkZWNfdjRsX2dldF9kd19tb2RlKGhldmMtPnY0bDJfY3R4LCAmb3V0KTsKKwkJZHcgPSBvdXQ7CisJCXJldHVybiBkdzsKKwl9CisKKwlzd2l0Y2ggKHZhbGlkX2R3X21vZGUpIHsKKwljYXNlIDB4MTAwOgorCQlpZiAodyA+IDE5MjAgJiYgaCA+IDEwODgpCisJCQlkdyA9IDB4NDsgLyoxOjIqLworCQlicmVhazsKKwljYXNlIDB4MjAwOgorCQlpZiAodyA+IDE5MjAgJiYgaCA+IDEwODgpCisJCQlkdyA9IDB4MjsgLyoxOjQqLworCQlicmVhazsKKwljYXNlIDB4MzAwOgorCQlpZiAodyA+IDEyODAgJiYgaCA+IDcyMCkKKwkJCWR3ID0gMHg0OyAvKjE6MiovCisJCWJyZWFrOworCWNhc2UgMHgxMDAwOgorCQlpZiAodyAqIGggPiAxOTIwICogMTA4MCkKKwkJCWR3ID0gMzsKKwkJZWxzZSBpZiAodyAqIGggPiA5NjAgKiA1NDApCisJCQlkdyA9IDU7CisJCWVsc2UKKwkJCWR3ID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZHcgPSB2YWxpZF9kd19tb2RlOworCQlicmVhazsKKwl9CisJcmV0dXJuIGR3OworfQorCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfTVVMVElfREVDCitzdGF0aWMgdW5zaWduZWQgY2hhciBnZXRfaWR4KHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJcmV0dXJuIGhldmMtPmluZGV4OworfQorI2VuZGlmCisKKyN1bmRlZiBwcl9pbmZvCisjZGVmaW5lIHByX2luZm8gcHJpbnRrCitzdGF0aWMgaW50IGhldmNfcHJpbnQoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwlpbnQgZmxhZywgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisjZGVmaW5lIEhFVkNfUFJJTlRfQlVGCQk1MTIKKwl1bnNpZ25lZCBjaGFyIGJ1ZltIRVZDX1BSSU5UX0JVRl07CisJaW50IGxlbiA9IDA7CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfTVVMVElfREVDCisJaWYgKGhldmMgPT0gTlVMTCB8fAorCQkoZmxhZyA9PSAwKSB8fAorCQkoKGRlYnVnX21hc2sgJgorCQkoMSA8PCBoZXZjLT5pbmRleCkpCisJCSYmIChkZWJ1ZyAmIGZsYWcpKSkgeworI2VuZGlmCisJCXZhX2xpc3QgYXJnczsKKworCQl2YV9zdGFydChhcmdzLCBmbXQpOworCQlpZiAoaGV2YykKKwkJCWxlbiA9IHNwcmludGYoYnVmLCAiWyVkXSIsIGhldmMtPmluZGV4KTsKKwkJdnNucHJpbnRmKGJ1ZiArIGxlbiwgSEVWQ19QUklOVF9CVUYgLSBsZW4sIGZtdCwgYXJncyk7CisJCXByX2RlYnVnKCIlcyIsIGJ1Zik7CisJCXZhX2VuZChhcmdzKTsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9NVUxUSV9ERUMKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZXZjX3ByaW50X2NvbnQoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwlpbnQgZmxhZywgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdW5zaWduZWQgY2hhciBidWZbSEVWQ19QUklOVF9CVUZdOworCWludCBsZW4gPSAwOworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX01VTFRJX0RFQworCWlmIChoZXZjID09IE5VTEwgfHwKKwkJKGZsYWcgPT0gMCkgfHwKKwkJKChkZWJ1Z19tYXNrICYKKwkJKDEgPDwgaGV2Yy0+aW5kZXgpKQorCQkmJiAoZGVidWcgJiBmbGFnKSkpIHsKKyNlbmRpZgorCQl2YV9saXN0IGFyZ3M7CisKKwkJdmFfc3RhcnQoYXJncywgZm10KTsKKwkJdnNucHJpbnRmKGJ1ZiArIGxlbiwgSEVWQ19QUklOVF9CVUYgLSBsZW4sIGZtdCwgYXJncyk7CisJCXByX2luZm8oIiVzIiwgYnVmKTsKKwkJdmFfZW5kKGFyZ3MpOworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX01VTFRJX0RFQworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwdXRfbXZfYnVmKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsCisJc3RydWN0IFBJQ19zICpwaWMpOworCitzdGF0aWMgdm9pZCB1cGRhdGVfdmZfbWVtaGFuZGxlKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsCisJc3RydWN0IHZmcmFtZV9zICp2Ziwgc3RydWN0IFBJQ19zICpwaWMpOworCitzdGF0aWMgdm9pZCBzZXRfY2FudmFzKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsIHN0cnVjdCBQSUNfcyAqcGljKTsKKworc3RhdGljIHZvaWQgcmVsZWFzZV9hdXhfZGF0YShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCXN0cnVjdCBQSUNfcyAqcGljKTsKK3N0YXRpYyB2b2lkIHJlbGVhc2VfcGljX21tdV9idWYoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Yywgc3RydWN0IFBJQ19zICpwaWMpOworCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorc3RhdGljIHZvaWQgYmFja3VwX2RlY29kZV9zdGF0ZShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWhldmMtPm1fcG9jUmFuZG9tQWNjZXNzX2JhayA9IGhldmMtPm1fcG9jUmFuZG9tQWNjZXNzOworCWhldmMtPmN1cnJfUE9DX2JhayA9IGhldmMtPmN1cnJfUE9DOworCWhldmMtPmlQcmV2UE9DX2JhayA9IGhldmMtPmlQcmV2UE9DOworCWhldmMtPmlQcmV2VGlkMFBPQ19iYWsgPSBoZXZjLT5pUHJldlRpZDBQT0M7CisJaGV2Yy0+c3RhcnRfcGFyc2VyX3R5cGVfYmFrID0gaGV2Yy0+c3RhcnRfcGFyc2VyX3R5cGU7CisJaGV2Yy0+c3RhcnRfZGVjb2RpbmdfZmxhZ19iYWsgPSBoZXZjLT5zdGFydF9kZWNvZGluZ19mbGFnOworCWhldmMtPnJwc19zZXRfaWRfYmFrID0gaGV2Yy0+cnBzX3NldF9pZDsKKwloZXZjLT5waWNfZGVjb2RlZF9sY3VfaWR4X2JhayA9IGhldmMtPnBpY19kZWNvZGVkX2xjdV9pZHg7CisJaGV2Yy0+ZGVjb2RlX2lkeF9iYWsgPSBoZXZjLT5kZWNvZGVfaWR4OworCit9CisKK3N0YXRpYyB2b2lkIHJlc3RvcmVfZGVjb2RlX3N0YXRlKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaGV2Yyk7CisJaWYgKCF2ZGVjX2hhc19tb3JlX2lucHV0KHZkZWMpKSB7CisJCWhldmMtPnBpY19kZWNvZGVkX2xjdV9pZHggPQorCQkJUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0xDVV9TVEFSVCkKKwkJCSYgMHhmZmZmZmY7CisJCXJldHVybjsKKwl9CisJaGV2Y19wcmludChoZXZjLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkiJXM6IGRpc2NhcmQgcGljIGluZGV4IDB4JXhcbiIsCisJCV9fZnVuY19fLCBoZXZjLT5kZWNvZGluZ19waWMgPworCQloZXZjLT5kZWNvZGluZ19waWMtPmluZGV4IDogMHhmZik7CisJaWYgKGhldmMtPmRlY29kaW5nX3BpYykgeworCQloZXZjLT5kZWNvZGluZ19waWMtPmVycm9yX21hcmsgPSAwOworCQloZXZjLT5kZWNvZGluZ19waWMtPm91dHB1dF9yZWFkeSA9IDA7CisJCWhldmMtPmRlY29kaW5nX3BpYy0+c2hvd19mcmFtZSA9IGZhbHNlOworCQloZXZjLT5kZWNvZGluZ19waWMtPm91dHB1dF9tYXJrID0gMDsKKwkJaGV2Yy0+ZGVjb2RpbmdfcGljLT5yZWZlcmVuY2VkID0gMDsKKwkJaGV2Yy0+ZGVjb2RpbmdfcGljLT5QT0MgPSBJTlZBTElEX1BPQzsKKwkJcHV0X212X2J1ZihoZXZjLCBoZXZjLT5kZWNvZGluZ19waWMpOworCQlyZWxlYXNlX2F1eF9kYXRhKGhldmMsIGhldmMtPmRlY29kaW5nX3BpYyk7CisJCWhldmMtPmRlY29kaW5nX3BpYyA9IE5VTEw7CisJfQorCS8qaWYgKHZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpICYmCisJCShoZXZjLT5kZWNvZGVfaWR4IC0gaGV2Yy0+ZGVjb2RlX2lkeF9iYWsgPiAxKSkgeworCQlpbnQgaTsKKwkJaGV2Y19wcmludChoZXZjLCAwLCAiZGVjb2RlX2lkeCAlZCwgZGVjb2RlX2lkeF9iYWsgJWRcbiIsCisJCQkJCQkJCWhldmMtPmRlY29kZV9pZHgsIGhldmMtPmRlY29kZV9pZHhfYmFrKTsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9SRUZfUElDX05VTTsgaSsrKSB7CisJCQlzdHJ1Y3QgUElDX3MgKnBpYzsKKwkJCXBpYyA9IGhldmMtPm1fUElDW2ldOworCQkJaWYgKHBpYyA9PSBOVUxMIHx8CisJCQkJKHBpYy0+aW5kZXggPT0gLTEpIHx8CisJCQkJKHBpYy0+QlVGX2luZGV4ID09IC0xKSB8fAorCQkJCShwaWMtPlBPQyA9PSBJTlZBTElEX1BPQykpCisJCQkJY29udGludWU7CisJCQlpZiAoKHBpYy0+ZGVjb2RlX2lkeCA+PSBoZXZjLT5kZWNvZGVfaWR4X2JhaykgJiYKKwkJCQkJcGljLT5kZWNvZGVfaWR4ICE9IChoZXZjLT5kZWNvZGVfaWR4IC0gMSkpIHsKKwkJCQkJaGV2Y19wcmludChoZXZjLCAwLCAicmVsZWFzZSBlcnJvciBidWZmZXJcbiIpOworCQkJCQlwaWMtPmVycm9yX21hcmsgPSAwOworCQkJCQlwaWMtPm91dHB1dF9yZWFkeSA9IDA7CisJCQkJCXBpYy0+c2hvd19mcmFtZSA9IGZhbHNlOworCQkJCQlwaWMtPm91dHB1dF9tYXJrID0gMDsKKwkJCQkJcGljLT5yZWZlcmVuY2VkID0gMDsKKwkJCQkJcGljLT5QT0MgPSBJTlZBTElEX1BPQzsKKwkJCQkJcHV0X212X2J1ZihoZXZjLCBwaWMpOworCQkJCQlyZWxlYXNlX2F1eF9kYXRhKGhldmMsIHBpYyk7CisJCQl9CisJCX0KKwl9Ki8KKwloZXZjLT5kZWNvZGVfaWR4ID0gaGV2Yy0+ZGVjb2RlX2lkeF9iYWs7CisJaGV2Yy0+bV9wb2NSYW5kb21BY2Nlc3MgPSBoZXZjLT5tX3BvY1JhbmRvbUFjY2Vzc19iYWs7CisJaGV2Yy0+Y3Vycl9QT0MgPSBoZXZjLT5jdXJyX1BPQ19iYWs7CisJaGV2Yy0+aVByZXZQT0MgPSBoZXZjLT5pUHJldlBPQ19iYWs7CisJaGV2Yy0+aVByZXZUaWQwUE9DID0gaGV2Yy0+aVByZXZUaWQwUE9DX2JhazsKKwloZXZjLT5zdGFydF9wYXJzZXJfdHlwZSA9IGhldmMtPnN0YXJ0X3BhcnNlcl90eXBlX2JhazsKKwloZXZjLT5zdGFydF9kZWNvZGluZ19mbGFnID0gaGV2Yy0+c3RhcnRfZGVjb2RpbmdfZmxhZ19iYWs7CisJaGV2Yy0+cnBzX3NldF9pZCA9IGhldmMtPnJwc19zZXRfaWRfYmFrOworCWhldmMtPnBpY19kZWNvZGVkX2xjdV9pZHggPSBoZXZjLT5waWNfZGVjb2RlZF9sY3VfaWR4X2JhazsKKworCWlmIChoZXZjLT5waWNfbGlzdF9pbml0X2ZsYWcgPT0gMSkKKwkJaGV2Yy0+cGljX2xpc3RfaW5pdF9mbGFnID0gMDsKKwkvKmlmIChoZXZjLT5kZWNvZGVfaWR4ID09IDApCisJCWhldmMtPnN0YXJ0X2RlY29kaW5nX2ZsYWcgPSAwOyovCisKKwloZXZjLT5zbGljZV9pZHggPSAwOworCWhldmMtPnVzZWRfNGtfbnVtID0gLTE7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgaGV2Y19pbml0X3N0cnUoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwkJc3RydWN0IEJ1ZmZJbmZvX3MgKmJ1Zl9zcGVjX2kpCit7CisJaW50IGk7CisJSU5JVF9MSVNUX0hFQUQoJmhldmMtPmxvZ19saXN0KTsKKwloZXZjLT53b3JrX3NwYWNlX2J1ZiA9IGJ1Zl9zcGVjX2k7CisJaGV2Yy0+cHJlZml4X2F1eF9zaXplID0gMDsKKwloZXZjLT5zdWZmaXhfYXV4X3NpemUgPSAwOworCWhldmMtPmF1eF9hZGRyID0gTlVMTDsKKwloZXZjLT5ycG1fYWRkciA9IE5VTEw7CisJaGV2Yy0+bG1lbV9hZGRyID0gTlVMTDsKKworCWhldmMtPmN1cnJfUE9DID0gSU5WQUxJRF9QT0M7CisKKwloZXZjLT5waWNfbGlzdF9pbml0X2ZsYWcgPSAwOworCWhldmMtPnVzZV9jbWFfZmxhZyA9IDA7CisJaGV2Yy0+ZGVjb2RlX2lkeCA9IDA7CisJaGV2Yy0+c2xpY2VfaWR4ID0gMDsKKwloZXZjLT5uZXdfcGljID0gMDsKKwloZXZjLT5uZXdfdGlsZSA9IDA7CisJaGV2Yy0+aVByZXZQT0MgPSAwOworCWhldmMtPmxpc3Rfbm8gPSAwOworCS8qIGludCBtX3VpTWF4Q1VXaWR0aCA9IDE8PDc7ICovCisJLyogaW50IG1fdWlNYXhDVUhlaWdodCA9IDE8PDc7ICovCisJaGV2Yy0+bV9wb2NSYW5kb21BY2Nlc3MgPSBNQVhfSU5UOworCWhldmMtPnRpbGVfZW5hYmxlZCA9IDA7CisJaGV2Yy0+dGlsZV94ID0gMDsKKwloZXZjLT50aWxlX3kgPSAwOworCWhldmMtPmlQcmV2VGlkMFBPQyA9IDA7CisJaGV2Yy0+c2xpY2VfYWRkciA9IDA7CisJaGV2Yy0+c2xpY2Vfc2VnbWVudF9hZGRyID0gMDsKKwloZXZjLT5za2lwX2ZsYWcgPSAwOworCWhldmMtPm1pc2NfZmxhZzAgPSAwOworCisJaGV2Yy0+Y3VyX3BpYyA9IE5VTEw7CisJaGV2Yy0+Y29sX3BpYyA9IE5VTEw7CisJaGV2Yy0+d2FpdF9idWYgPSAwOworCWhldmMtPmVycm9yX2ZsYWcgPSAwOworCWhldmMtPmhlYWRfZXJyb3JfZmxhZyA9IDA7CisJaGV2Yy0+ZXJyb3Jfc2tpcF9uYWxfY291bnQgPSAwOworCWhldmMtPmhhdmVfdnBzID0gMDsKKwloZXZjLT5oYXZlX3NwcyA9IDA7CisJaGV2Yy0+aGF2ZV9wcHMgPSAwOworCWhldmMtPmhhdmVfdmFsaWRfc3RhcnRfc2xpY2UgPSAwOworCisJaGV2Yy0+cHRzX21vZGUgPSBQVFNfTk9STUFMOworCWhldmMtPmxhc3RfcHRzID0gMDsKKwloZXZjLT5sYXN0X2xvb2t1cF9wdHMgPSAwOworCWhldmMtPmxhc3RfcHRzX3VzNjQgPSAwOworCWhldmMtPmxhc3RfbG9va3VwX3B0c191czY0ID0gMDsKKwloZXZjLT5wdHNfbW9kZV9zd2l0Y2hpbmdfY291bnQgPSAwOworCWhldmMtPnB0c19tb2RlX3JlY292ZXJ5X2NvdW50ID0gMDsKKworCWhldmMtPlBCX3NraXBfbW9kZSA9IG5hbF9za2lwX3BvbGljeSAmIDB4MzsKKwloZXZjLT5QQl9za2lwX2NvdW50X2FmdGVyX2RlY29kaW5nID0gKG5hbF9za2lwX3BvbGljeSA+PiAxNikgJiAweGZmZmY7CisJaWYgKGhldmMtPlBCX3NraXBfbW9kZSA9PSAwKQorCQloZXZjLT5pZ25vcmVfYnVmbWdyX2Vycm9yID0gMHgxOworCWVsc2UKKwkJaGV2Yy0+aWdub3JlX2J1Zm1ncl9lcnJvciA9IDB4MDsKKworCWlmIChoZXZjLT5pc191c2VkX3Y0bCkgeworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9QSUNfTlVNOyBpKyspIHsKKwkJCWlmIChoZXZjLT5tX1BJQ1tpXSAhPSBOVUxMKSB7CisJCQkJbWVtc2V0KGhldmMtPm1fUElDW2ldLCAwICxzaXplb2Yoc3RydWN0IFBJQ19zKSk7CisJCQkJaGV2Yy0+bV9QSUNbaV0tPmluZGV4ID0gaTsKKwkJCX0KKwkJfQorCX0KKworCWhldmMtPnBpY19udW0gPSAwOworCWhldmMtPmxjdV94X251bV9wcmUgPSAwOworCWhldmMtPmxjdV95X251bV9wcmUgPSAwOworCWhldmMtPmZpcnN0X3BpY19hZnRlcl9yZWNvdmVyID0gMDsKKworCWhldmMtPnByZV90b3BfcGljID0gTlVMTDsKKwloZXZjLT5wcmVfYm90X3BpYyA9IE5VTEw7CisKKwloZXZjLT5zZWlfcHJlc2VudF9mbGFnID0gMDsKKwloZXZjLT52YWx2ZV9jb3VudCA9IDA7CisJaGV2Yy0+Zmlyc3RfcGljX2ZsYWcgPSAwOworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwloZXZjLT5kZWNvZGVkX3BvYyA9IElOVkFMSURfUE9DOworCWhldmMtPnN0YXJ0X3Byb2Nlc3NfdGltZSA9IDA7CisJaGV2Yy0+bGFzdF9sY3VfaWR4ID0gMDsKKwloZXZjLT5kZWNvZGVfdGltZW91dF9jb3VudCA9IDA7CisJaGV2Yy0+dGltZW91dF9udW0gPSAwOworCWhldmMtPmVvcyA9IDA7CisJaGV2Yy0+cGljX2RlY29kZWRfbGN1X2lkeCA9IC0xOworCWhldmMtPm92ZXJfZGVjb2RlID0gMDsKKwloZXZjLT51c2VkXzRrX251bSA9IC0xOworCWhldmMtPnN0YXJ0X2RlY29kaW5nX2ZsYWcgPSAwOworCWhldmMtPnJwc19zZXRfaWQgPSAwOworCWJhY2t1cF9kZWNvZGVfc3RhdGUoaGV2Yyk7CisjZW5kaWYKKyNpZmRlZiBERVRSRUZJTExfRU5BQkxFCisJaGV2Yy0+ZGV0YnVmX2FkciA9IDA7CisJaGV2Yy0+ZGV0YnVmX2Fkcl92aXJ0ID0gTlVMTDsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IHBvc3RfcGljdHVyZV9lYXJseShzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgaW5kZXgpOworc3RhdGljIGludCBwcmVwYXJlX2Rpc3BsYXlfYnVmKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHN0cnVjdCBQSUNfcyAqcGljKTsKK3N0YXRpYyBpbnQgSDI2NV9hbGxvY19tbXUoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwkJCXN0cnVjdCBQSUNfcyAqbmV3X3BpYywJdW5zaWduZWQgc2hvcnQgYml0X2RlcHRoLAorCQkJdW5zaWduZWQgaW50ICptbXVfaW5kZXhfYWRyKTsKKyNpZmRlZiBIMjY1XzEwQl9NTVVfRFcKK3N0YXRpYyBpbnQgSDI2NV9hbGxvY19tbXVfZHcoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Yywgc3RydWN0IFBJQ19zICpuZXdfcGljLAorCQl1bnNpZ25lZCBzaG9ydCBiaXRfZGVwdGgsIHVuc2lnbmVkIGludCAqbW11X2luZGV4X2Fkcik7CisjZW5kaWYKKworI2lmZGVmIERFVFJFRklMTF9FTkFCTEUKKyNkZWZpbmUgREVUUkVGSUxMX0JVRl9TSVpFICg0ICogMHg0MDAwKQorI2RlZmluZSBIRVZDX1NBT19EQkdfTU9ERTAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNjFlCisjZGVmaW5lIEhFVkNfU0FPX0RCR19NT0RFMSAgICAgICAgICAgICAgICAgICAgICAgICAweDM2MWYKKyNkZWZpbmUgSEVWQ19TQU9fQ1RSTDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzYyZQorI2RlZmluZSBIRVZDX1NBT19DVFJMMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNjJmCitzdGF0aWMgaW50IGluaXRfZGV0cmVmaWxsX2J1ZihzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWlmIChoZXZjLT5kZXRidWZfYWRyX3ZpcnQpCisJCXJldHVybiAwOworCisJaGV2Yy0+ZGV0YnVmX2Fkcl92aXJ0ID0KKwkJKHZvaWQgKilkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJREVUUkVGSUxMX0JVRl9TSVpFLCAmaGV2Yy0+ZGV0YnVmX2FkciwKKwkJCUdGUF9LRVJORUwpOworCisJaWYgKGhldmMtPmRldGJ1Zl9hZHJfdmlydCA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvYyBFVFJFRklMTF9CVUZcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdW5pbml0X2RldHJlZmlsbF9idWYoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwlpZiAoaGV2Yy0+ZGV0YnVmX2Fkcl92aXJ0KSB7CisJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCURFVFJFRklMTF9CVUZfU0laRSwgaGV2Yy0+ZGV0YnVmX2Fkcl92aXJ0LAorCQkJaGV2Yy0+ZGV0YnVmX2Fkcik7CisKKwkJaGV2Yy0+ZGV0YnVmX2Fkcl92aXJ0ID0gTlVMTDsKKwkJaGV2Yy0+ZGV0YnVmX2FkciA9IDA7CisJfQorfQorCisvKgorICogY29udmVydCB1bmNvbXByZXNzZWQgZnJhbWUgYnVmZmVyIGRhdGEgZnJvbS90byBkZHIKKyAqLworc3RhdGljIHZvaWQgY29udlVuYzh4NGJsayh1aW50MTZfdCogYmxrOHg0THVtYSwKKwl1aW50MTZfdCogYmxrOHg0Q2IsIHVpbnQxNl90KiBibGs4eDRDciwgdWludDE2X3QqIGNtQm9keUJ1ZiwgaW50MzJfdCBkaXJlY3Rpb24pCit7CisJaWYgKGRpcmVjdGlvbiA9PSAwKSB7CisJCWJsazh4NEx1bWFbMyArIDAgKiA4XSA9ICgoY21Cb2R5QnVmWzBdID4+IDApKSAmIDB4M2ZmOworCQlibGs4eDRMdW1hWzMgKyAxICogOF0gPSAoKGNtQm9keUJ1ZlsxXSA8PCA2KQorCQkJfCAoY21Cb2R5QnVmWzBdID4+IDEwKSkgJiAweDNmZjsKKwkJYmxrOHg0THVtYVszICsgMiAqIDhdID0gKChjbUJvZHlCdWZbMV0gPj4gNCkpICYgMHgzZmY7CisJCWJsazh4NEx1bWFbMyArIDMgKiA4XSA9ICgoY21Cb2R5QnVmWzJdIDw8IDIpCisJCQl8IChjbUJvZHlCdWZbMV0gPj4gMTQpKSAmIDB4M2ZmOworCQlibGs4eDRMdW1hWzcgKyAwICogOF0gPSAoKGNtQm9keUJ1ZlszXSA8PCA4KQorCQkJfCAoY21Cb2R5QnVmWzJdID4+IDgpKSAmIDB4M2ZmOworCQlibGs4eDRMdW1hWzcgKyAxICogOF0gPSAoKGNtQm9keUJ1ZlszXSA+PiAyKSkgJiAweDNmZjsKKwkJYmxrOHg0THVtYVs3ICsgMiAqIDhdID0gKChjbUJvZHlCdWZbNF0gPDwgNCkKKwkJCXwgKGNtQm9keUJ1ZlszXSA+PiAxMikpICYgMHgzZmY7CisJCWJsazh4NEx1bWFbNyArIDMgKiA4XSA9ICgoY21Cb2R5QnVmWzRdID4+IDYpKSAmIDB4M2ZmOworCQlibGs4eDRDYiAgWzAgKyAwICogNF0gPSAoKGNtQm9keUJ1Zls1XSA+PiAwKSkgJiAweDNmZjsKKwkJYmxrOHg0Q3IgIFswICsgMCAqIDRdID0gKChjbUJvZHlCdWZbNl0JPDwgNikKKwkJCXwgKGNtQm9keUJ1Zls1XSA+PiAxMCkpICYgMHgzZmY7CisJCWJsazh4NENiICBbMCArIDEgKiA0XSA9ICgoY21Cb2R5QnVmWzZdID4+IDQpKSAmIDB4M2ZmOworCQlibGs4eDRDciAgWzAgKyAxICogNF0gPSAoKGNtQm9keUJ1Zls3XSA8PCAyKQorCQkJfCAoY21Cb2R5QnVmWzZdID4+IDE0KSkgJiAweDNmZjsKKworCQlibGs4eDRMdW1hWzAgKyAwICogOF0gPSAoKGNtQm9keUJ1ZlswICsgOF0gPj4gMCkpICYgMHgzZmY7CisJCWJsazh4NEx1bWFbMSArIDAgKiA4XSA9ICgoY21Cb2R5QnVmWzEgKyA4XSA8PCA2KSB8CisJCQkoY21Cb2R5QnVmWzAgKyA4XSA+PiAxMCkpICYgMHgzZmY7CisJCWJsazh4NEx1bWFbMiArIDAgKiA4XSA9ICgoY21Cb2R5QnVmWzEgKyA4XSA+PiA0KSkgJiAweDNmZjsKKwkJYmxrOHg0THVtYVswICsgMSAqIDhdID0gKChjbUJvZHlCdWZbMiArIDhdIDw8IDIpIHwKKwkJCShjbUJvZHlCdWZbMSArIDhdID4+IDE0KSkgJiAweDNmZjsKKwkJYmxrOHg0THVtYVsxICsgMSAqIDhdID0gKChjbUJvZHlCdWZbMyArIDhdIDw8IDgpIHwKKwkJCShjbUJvZHlCdWZbMiArIDhdID4+IDgpKSAmIDB4M2ZmOworCQlibGs4eDRMdW1hWzIgKyAxICogOF0gPSAoKGNtQm9keUJ1ZlszICsgOF0gPj4gMikpICYgMHgzZmY7CisJCWJsazh4NEx1bWFbMCArIDIgKiA4XSA9ICgoY21Cb2R5QnVmWzQgKyA4XSA8PCA0KSB8CisJCQkoY21Cb2R5QnVmWzMgKyA4XSA+PiAxMikpICYgMHgzZmY7CisJCWJsazh4NEx1bWFbMSArIDIgKiA4XSA9ICgoY21Cb2R5QnVmWzQgKyA4XSA+PiA2KSkgJiAweDNmZjsKKwkJYmxrOHg0THVtYVsyICsgMiAqIDhdID0gKChjbUJvZHlCdWZbNSArIDhdID4+IDApKSAmIDB4M2ZmOworCQlibGs4eDRMdW1hWzAgKyAzICogOF0gPSAoKGNtQm9keUJ1Zls2ICsgOF0gPDwgNikgfAorCQkJKGNtQm9keUJ1Zls1ICsgOF0gPj4gMTApKSAmIDB4M2ZmOworCQlibGs4eDRMdW1hWzEgKyAzICogOF0gPSAoKGNtQm9keUJ1Zls2ICsgOF0gPj4gNCkpICYgMHgzZmY7CisJCWJsazh4NEx1bWFbMiArIDMgKiA4XSA9ICgoY21Cb2R5QnVmWzcgKyA4XSA8PCAyKSB8CisJCQkoY21Cb2R5QnVmWzYgKyA4XSA+PiAxNCkpICYgMHgzZmY7CisKKwkJYmxrOHg0THVtYVs0ICsgMCAqIDhdID0gKChjbUJvZHlCdWZbMCArIDE2XSA+PiAwKSkgJiAweDNmZjsKKwkJYmxrOHg0THVtYVs1ICsgMCAqIDhdID0gKChjbUJvZHlCdWZbMSArIDE2XSA8PCA2KSB8CisJCQkoY21Cb2R5QnVmWzAgKyAxNl0gPj4gMTApKSAmIDB4M2ZmOworCQlibGs4eDRMdW1hWzYgKyAwICogOF0gPSAoKGNtQm9keUJ1ZlsxICsgMTZdID4+IDQpKSAmIDB4M2ZmOworCQlibGs4eDRMdW1hWzQgKyAxICogOF0gPSAoKGNtQm9keUJ1ZlsyICsgMTZdIDw8IDIpIHwKKwkJCShjbUJvZHlCdWZbMSArIDE2XSA+PiAxNCkpICYgMHgzZmY7CisJCWJsazh4NEx1bWFbNSArIDEgKiA4XSA9ICgoY21Cb2R5QnVmWzMgKyAxNl0gPDwgOCkgfAorCQkJKGNtQm9keUJ1ZlsyICsgMTZdID4+IDgpKSAmIDB4M2ZmOworCQlibGs4eDRMdW1hWzYgKyAxICogOF0gPSAoKGNtQm9keUJ1ZlszICsgMTZdID4+IDIpKSAmIDB4M2ZmOworCQlibGs4eDRMdW1hWzQgKyAyICogOF0gPSAoKGNtQm9keUJ1Zls0ICsgMTZdIDw8IDQpIHwKKwkJCShjbUJvZHlCdWZbMyArIDE2XSA+PiAxMikpICYgMHgzZmY7CisJCWJsazh4NEx1bWFbNSArIDIgKiA4XSA9ICgoY21Cb2R5QnVmWzQgKyAxNl0gPj4gNikpICYgMHgzZmY7CisJCWJsazh4NEx1bWFbNiArIDIgKiA4XSA9ICgoY21Cb2R5QnVmWzUgKyAxNl0gPj4gMCkpICYgMHgzZmY7CisJCWJsazh4NEx1bWFbNCArIDMgKiA4XSA9ICgoY21Cb2R5QnVmWzYgKyAxNl0gPDwgNikgfAorCQkJKGNtQm9keUJ1Zls1ICsgMTZdID4+IDEwKSkgJiAweDNmZjsKKwkJYmxrOHg0THVtYVs1ICsgMyAqIDhdID0gKChjbUJvZHlCdWZbNiArIDE2XSA+PiA0KSkgJiAweDNmZjsKKwkJYmxrOHg0THVtYVs2ICsgMyAqIDhdID0gKChjbUJvZHlCdWZbNyArIDE2XSA8PCAyKSB8CisJCQkoY21Cb2R5QnVmWzYgKyAxNl0gPj4gMTQpKSAmIDB4M2ZmOworCisJCWJsazh4NENiWzEgKyAwICogNF0gPSAoKGNtQm9keUJ1ZlswICsgMjRdID4+IDApKSAmIDB4M2ZmOworCQlibGs4eDRDclsxICsgMCAqIDRdID0gKChjbUJvZHlCdWZbMSArIDI0XSA8PCA2KSB8CisJCQkoY21Cb2R5QnVmWzAgKyAyNF0gPj4gMTApKSAmIDB4M2ZmOworCQlibGs4eDRDYlsyICsgMCAqIDRdID0gKChjbUJvZHlCdWZbMSArIDI0XSA+PiA0KSkgJiAweDNmZjsKKwkJYmxrOHg0Q3JbMiArIDAgKiA0XSA9ICgoY21Cb2R5QnVmWzIgKyAyNF0gPDwgMikgfAorCQkJKGNtQm9keUJ1ZlsxICsgMjRdID4+IDE0KSkgJiAweDNmZjsKKwkJYmxrOHg0Q2JbMyArIDAgKiA0XSA9ICgoY21Cb2R5QnVmWzMgKyAyNF0gPDwgOCkgfAorCQkJKGNtQm9keUJ1ZlsyICsgMjRdID4+IDgpKSAmIDB4M2ZmOworCQlibGs4eDRDclszICsgMCAqIDRdID0gKChjbUJvZHlCdWZbMyArIDI0XSA+PiAyKSkgJiAweDNmZjsKKwkJYmxrOHg0Q2JbMSArIDEgKiA0XSA9ICgoY21Cb2R5QnVmWzQgKyAyNF0gPDwgNCkgfAorCQkJKGNtQm9keUJ1ZlszICsgMjRdID4+IDEyKSkgJiAweDNmZjsKKwkJYmxrOHg0Q3JbMSArIDEgKiA0XSA9ICgoY21Cb2R5QnVmWzQgKyAyNF0gPj4gNikpICYgMHgzZmY7CisJCWJsazh4NENiWzIgKyAxICogNF0gPSAoKGNtQm9keUJ1Zls1ICsgMjRdID4+IDApKSAmIDB4M2ZmOworCQlibGs4eDRDclsyICsgMSAqIDRdID0gKChjbUJvZHlCdWZbNiArIDI0XSA8PCA2KSB8CisJCQkoY21Cb2R5QnVmWzUgKyAyNF0gPj4gMTApKSAmIDB4M2ZmOworCQlibGs4eDRDYlszICsgMSAqIDRdID0gKChjbUJvZHlCdWZbNiArIDI0XSA+PiA0KSkgJiAweDNmZjsKKwkJYmxrOHg0Q3JbMyArIDEgKiA0XSA9ICgoY21Cb2R5QnVmWzcgKyAyNF0gPDwgMikgfAorCQkJKGNtQm9keUJ1Zls2ICsgMjRdID4+IDE0KSkgJiAweDNmZjsKKwl9IGVsc2UgeworCQljbUJvZHlCdWZbMCArIDggKiAwXSA9IChibGs4eDRMdW1hWzMgKyAxICogOF0gPDwgMTApIHwKKwkJCWJsazh4NEx1bWFbMyArIDAgKiA4XTsKKwkJY21Cb2R5QnVmWzEgKyA4ICogMF0gPSAoYmxrOHg0THVtYVszICsgMyAqIDhdIDw8IDE0KSB8CisJCQkoYmxrOHg0THVtYVszICsgMiAqIDhdIDw8IDQpIHwgKGJsazh4NEx1bWFbMyArIDEgKiA4XSA+PiA2KTsKKwkJY21Cb2R5QnVmWzIgKyA4ICogMF0gPSAoYmxrOHg0THVtYVs3ICsgMCAqIDhdIDw8IDgpIHwKKwkJCShibGs4eDRMdW1hWzMgKyAzICogOF0gPj4gMik7CisJCWNtQm9keUJ1ZlszICsgOCAqIDBdID0gKGJsazh4NEx1bWFbNyArIDIgKiA4XSA8PCAxMikgfAorCQkJKGJsazh4NEx1bWFbNyArIDEgKiA4XSA8PCAyKSB8IChibGs4eDRMdW1hWzcgKyAwICogOF0gPj44KTsKKwkJY21Cb2R5QnVmWzQgKyA4ICogMF0gPSAoYmxrOHg0THVtYVs3ICsgMyAqIDhdIDw8IDYpIHwKKwkJCShibGs4eDRMdW1hWzcgKyAyICogOF0gPj40KTsKKwkJY21Cb2R5QnVmWzUgKyA4ICogMF0gPSAoYmxrOHg0Q3JbMCArIDAgKiA0XSA8PCAxMCkgfAorCQkJYmxrOHg0Q2JbMCArIDAgKiA0XTsKKwkJY21Cb2R5QnVmWzYgKyA4ICogMF0gPSAoYmxrOHg0Q3JbMCArIDEgKiA0XSA8PCAxNCkgfAorCQkJKGJsazh4NENiWzAgKyAxICogNF0gPDwgNCkgICB8IChibGs4eDRDclswICsgMCAqIDRdID4+IDYpOworCQljbUJvZHlCdWZbNyArIDggKiAwXSA9ICgwPDwgOCkgfCAoYmxrOHg0Q3JbMCArIDEgKiA0XSA+PiAyKTsKKworCQljbUJvZHlCdWZbMCArIDggKiAxXSA9IChibGs4eDRMdW1hWzEgKyAwICogOF0gPDwgMTApIHwKKwkJCWJsazh4NEx1bWFbMCArIDAgKiA4XTsKKwkJY21Cb2R5QnVmWzEgKyA4ICogMV0gPSAoYmxrOHg0THVtYVswICsgMSAqIDhdIDw8IDE0KSB8CisJCQkoYmxrOHg0THVtYVsyICsgMCAqIDhdIDw8IDQpIHwgKGJsazh4NEx1bWFbMSArIDAgKiA4XSA+PiA2KTsKKwkJY21Cb2R5QnVmWzIgKyA4ICogMV0gPSAoYmxrOHg0THVtYVsxICsgMSAqIDhdIDw8IDgpIHwKKwkJCShibGs4eDRMdW1hWzAgKyAxICogOF0gPj4gMik7CisJCWNtQm9keUJ1ZlszICsgOCAqIDFdID0gKGJsazh4NEx1bWFbMCArIDIgKiA4XSA8PCAxMikgfAorCQkJKGJsazh4NEx1bWFbMiArIDEgKiA4XSA8PCAyKSB8IChibGs4eDRMdW1hWzEgKyAxICogOF0gPj44KTsKKwkJY21Cb2R5QnVmWzQgKyA4ICogMV0gPSAoYmxrOHg0THVtYVsxICsgMiAqIDhdIDw8IDYpIHwKKwkJCShibGs4eDRMdW1hWzAgKyAyICogOF0gPj40KTsKKwkJY21Cb2R5QnVmWzUgKyA4ICogMV0gPSAoYmxrOHg0THVtYVswICsgMyAqIDhdIDw8IDEwKSB8CisJCQlibGs4eDRMdW1hWzIgKyAyICogOF07CisJCWNtQm9keUJ1Zls2ICsgOCAqIDFdID0gKGJsazh4NEx1bWFbMiArIDMgKiA4XSA8PCAxNCkgfAorCQkJKGJsazh4NEx1bWFbMSArIDMgKiA4XSA8PCA0KSB8IChibGs4eDRMdW1hWzAgKyAzICogOF0gPj4gNik7CisJCWNtQm9keUJ1Zls3ICsgOCAqIDFdID0gKDA8PCA4KSB8IChibGs4eDRMdW1hWzIgKyAzICogOF0gPj4gMik7CisKKwkJY21Cb2R5QnVmWzAgKyA4ICogMl0gPSAoYmxrOHg0THVtYVs1ICsgMCAqIDhdIDw8IDEwKSB8CisJCQlibGs4eDRMdW1hWzQgKyAwICogOF07CisJCWNtQm9keUJ1ZlsxICsgOCAqIDJdID0gKGJsazh4NEx1bWFbNCArIDEgKiA4XSA8PCAxNCkgfAorCQkJKGJsazh4NEx1bWFbNiArIDAgKiA4XSA8PCA0KSB8IChibGs4eDRMdW1hWzUgKyAwICogOF0gPj4gNik7CisJCWNtQm9keUJ1ZlsyICsgOCAqIDJdID0gKGJsazh4NEx1bWFbNSArIDEgKiA4XSA8PCA4KSB8CisJCQkoYmxrOHg0THVtYVs0ICsgMSAqIDhdID4+IDIpOworCQljbUJvZHlCdWZbMyArIDggKiAyXSA9IChibGs4eDRMdW1hWzQgKyAyICogOF0gPDwgMTIpIHwKKwkJCShibGs4eDRMdW1hWzYgKyAxICogOF0gPDwgMikgfCAoYmxrOHg0THVtYVs1ICsgMSAqIDhdID4+OCk7CisJCWNtQm9keUJ1Zls0ICsgOCAqIDJdID0gKGJsazh4NEx1bWFbNSArIDIgKiA4XSA8PCA2KSB8CisJCQkoYmxrOHg0THVtYVs0ICsgMiAqIDhdID4+NCk7CisJCWNtQm9keUJ1Zls1ICsgOCAqIDJdID0gKGJsazh4NEx1bWFbNCArIDMgKiA4XSA8PCAxMCkgfAorCQkJYmxrOHg0THVtYVs2ICsgMiAqIDhdOworCQljbUJvZHlCdWZbNiArIDggKiAyXSA9IChibGs4eDRMdW1hWzYgKyAzICogOF0gPDwgMTQpIHwKKwkJCShibGs4eDRMdW1hWzUgKyAzICogOF0gPDwgNCkgfCAoYmxrOHg0THVtYVs0ICsgMyAqIDhdID4+IDYpOworCQljbUJvZHlCdWZbNyArIDggKiAyXSA9ICgwPDwgOCkgfCAoYmxrOHg0THVtYVs2ICsgMyAqIDhdID4+IDIpOworCisJCWNtQm9keUJ1ZlswICsgOCAqIDNdID0gKGJsazh4NENyWzEgKyAwICogNF0gPDwgMTApIHwKKwkJCWJsazh4NENiWzEgKyAwICogNF07CisJCWNtQm9keUJ1ZlsxICsgOCAqIDNdID0gKGJsazh4NENyWzIgKyAwICogNF0gPDwgMTQpIHwKKwkJCShibGs4eDRDYlsyICsgMCAqIDRdIDw8IDQpIHwgKGJsazh4NENyWzEgKyAwICogNF0gPj4gNik7CisJCWNtQm9keUJ1ZlsyICsgOCAqIDNdID0gKGJsazh4NENiWzMgKyAwICogNF0gPDwgOCkgfAorCQkJKGJsazh4NENyWzIgKyAwICogNF0gPj4gMik7CisJCWNtQm9keUJ1ZlszICsgOCAqIDNdID0gKGJsazh4NENiWzEgKyAxICogNF0gPDwgMTIpIHwKKwkJCShibGs4eDRDclszICsgMCAqIDRdIDw8IDIpIHwgKGJsazh4NENiWzMgKyAwICogNF0gPj44KTsKKwkJY21Cb2R5QnVmWzQgKyA4ICogM10gPSAoYmxrOHg0Q3JbMSArIDEgKiA0XSA8PCA2KSB8CisJCQkoYmxrOHg0Q2JbMSArIDEgKiA0XSA+PjQpOworCQljbUJvZHlCdWZbNSArIDggKiAzXSA9IChibGs4eDRDclsyICsgMSAqIDRdIDw8IDEwKSB8CisJCQlibGs4eDRDYlsyICsgMSAqIDRdOworCQljbUJvZHlCdWZbNiArIDggKiAzXSA9IChibGs4eDRDclszICsgMSAqIDRdIDw8IDE0KSB8CisJCQkoYmxrOHg0Q2JbMyArIDEgKiA0XSA8PCA0KSB8IChibGs4eDRDclsyICsgMSAqIDRdID4+IDYpOworCQljbUJvZHlCdWZbNyArIDggKiAzXSA9ICgwIDw8IDgpIHwgKGJsazh4NENyWzMgKyAxICogNF0gPj4gMik7CisJfQorfQorCitzdGF0aWMgdm9pZCBjb3JyUmVmaWxsV2l0aEFtcmlzYyAoCisJc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwl1aW50MzJfdCAgY21IZWFkZXJCYXNlQWRkciwKKwl1aW50MzJfdCAgcGljV2lkdGgsCisJdWludDMyX3QgIGN0dVBvc2l0aW9uKQoreworCWludDMyX3QgaTsKKwl1aW50MTZfdCBjdHV4ID0gKGN0dVBvc2l0aW9uPj4xNikgJiAweGZmZmY7CisJdWludDE2X3QgY3R1eSA9IChjdHVQb3NpdGlvbj4+IDApICYgMHhmZmZmOworCWludDMyX3QgYWJvdmVDdHVBdmFpbGFibGUgPSAoY3R1eSkgPyAxIDogMDsKKworCXVpbnQxNl90ICpjbUJvZHlCdWYgPSBOVUxMOworCisJdWludDMyX3QgcGljX3dpZHRoX3g2NF9wcmUgPSBwaWNXaWR0aCArIDB4M2Y7CisJdWludDMyX3QgcGljX3dpZHRoX3g2NCA9IHBpY193aWR0aF94NjRfcHJlID4+IDY7CisJdWludDMyX3Qgc3RyaWRlNjR4NjQgPSBwaWNfd2lkdGhfeDY0ICogMTI4OworCXVpbnQzMl90IGFkZHJfb2Zmc2V0NjR4NjRfYWJ2ID0gc3RyaWRlNjR4NjQgKgorCQkoYWJvdmVDdHVBdmFpbGFibGUgPyBjdHV5IC0gMSA6IGN0dXkpICsgMTI4ICogY3R1eDsKKwl1aW50MzJfdCBhZGRyX29mZnNldDY0eDY0X2N1ciA9IHN0cmlkZTY0eDY0KmN0dXkgKyAxMjggKiBjdHV4OworCXVpbnQzMl90IGNtSGVhZGVyQWRkckFidiA9IGNtSGVhZGVyQmFzZUFkZHIgKyBhZGRyX29mZnNldDY0eDY0X2FidjsKKwl1aW50MzJfdCBjbUhlYWRlckFkZHJDdXIgPSBjbUhlYWRlckJhc2VBZGRyICsgYWRkcl9vZmZzZXQ2NHg2NF9jdXI7CisJdW5zaWduZWQgaW50IHRtcERhdGEzMjsKKworCXVpbnQxNl90IGJsa0J1ZjBZWzMyXTsKKwl1aW50MTZfdCBibGtCdWYwQ2JbOF07CisJdWludDE2X3QgYmxrQnVmMENyWzhdOworCXVpbnQxNl90IGJsa0J1ZjFZWzMyXTsKKwl1aW50MTZfdCBibGtCdWYxQ2JbOF07CisJdWludDE2X3QgYmxrQnVmMUNyWzhdOworCWludDMyX3QgIGJsa0J1ZkNudCA9IDA7CisKKwlpbnQzMl90IGJsa0lkeDsKKworCWNtQm9keUJ1ZiA9IHZ6YWxsb2Moc2l6ZW9mKHVpbnQxNl90KSAqIDMyICogMTgpOworCWlmICghY21Cb2R5QnVmKQorCQlyZXR1cm47CisKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkwxMCwgY21IZWFkZXJBZGRyQWJ2KTsKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkwxMSwgY21IZWFkZXJBZGRyQ3VyKTsKKwlXUklURV9WUkVHKEhFVkNfU0FPX0RCR19NT0RFMCwgaGV2Yy0+ZGV0YnVmX2Fkcik7CisJV1JJVEVfVlJFRyhIRVZDX1NBT19EQkdfTU9ERTEsIDIpOworCisJZm9yIChpID0gMDsgaSA8IDMyICogMTg7IGkrKykKKwkJY21Cb2R5QnVmW2ldID0gMDsKKworCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19CVUZNR1JfTU9SRSwKKwkJIiVzLCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlkbyB7CisJCXRtcERhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19EQkdfTU9ERTEpOworCX0gd2hpbGUgKHRtcERhdGEzMik7CisJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX0JVRk1HUl9NT1JFLAorCQkiJXMsICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX0RFVEFJTCwKKwkJImNtQm9keUJ1ZiBmcm9tIGRldGJ1ZjpcbiIpOworCWZvciAoaSA9IDA7IGkgPCAzMiAqIDE4OyBpKyspIHsKKwkJY21Cb2R5QnVmW2ldID0gaGV2Yy0+ZGV0YnVmX2Fkcl92aXJ0W2ldOworCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYKKwkJCQlIMjY1X0RFQlVHX0RFVEFJTCkgeworCQkJaWYgKChpICYgMHhmKSA9PSAwKQorCQkJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLCAiXG4iKTsKKwkJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLCAiJTAyeCAiLCBjbUJvZHlCdWZbaV0pOworCQl9CisJfQorCWhldmNfcHJpbnRfY29udChoZXZjLCBIMjY1X0RFQlVHX0RFVEFJTCwgIlxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJYmxrQnVmMFlbaV0gPSAwOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWJsa0J1ZjBDYltpXSA9IDA7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJYmxrQnVmMENyW2ldID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJYmxrQnVmMVlbaV0gPSAwOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWJsa0J1ZjFDYltpXSA9IDA7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJYmxrQnVmMUNyW2ldID0gMDsKKworCWZvciAoYmxrSWR4ID0gMDsgYmxrSWR4IDwgMTg7IGJsa0lkeCsrKSB7CisJCWludDMyX3QgICBpbkFib3ZlQ3R1ID0gKGJsa0lkeDwyKSA/IDEgOiAwOworCQlpbnQzMl90ICAgcmVzdG9yZUVuYWJsZSA9IChibGtJZHg+MCkgPyAxIDogMDsKKwkJdWludDE2X3QqIGJsa1kgPSAoYmxrQnVmQ250PT0wKSA/IGJsa0J1ZjBZIDogYmxrQnVmMVkgOworCQl1aW50MTZfdCogYmxrQ2IgPSAoYmxrQnVmQ250PT0wKSA/IGJsa0J1ZjBDYiA6IGJsa0J1ZjFDYjsKKwkJdWludDE2X3QqIGJsa0NyID0gKGJsa0J1ZkNudD09MCkgPyBibGtCdWYwQ3IgOiBibGtCdWYxQ3I7CisJCXVpbnQxNl90KiBjbUJvZHlCdWZOb3cgPSBjbUJvZHlCdWYgKyAoYmxrSWR4ICogMzIpOworCisJCWlmICghYWJvdmVDdHVBdmFpbGFibGUgJiYgaW5BYm92ZUN0dSkKKwkJCWNvbnRpbnVlOworCisJCS8qIGRldFJlZmlsbEJ1ZiAtLT4gOHg0YmxvY2sqLworCQljb252VW5jOHg0YmxrKGJsa1ksIGJsa0NiLCBibGtDciwgY21Cb2R5QnVmTm93LCAwKTsKKworCQlpZiAocmVzdG9yZUVuYWJsZSkgeworCQkJYmxrWVszICsgMCAqIDhdID0gYmxrWVsyICsgMCAqIDhdICsgMjsKKwkJCWJsa1lbNCArIDAgKiA4XSA9IGJsa1lbMSArIDAgKiA4XSArIDM7CisJCQlibGtZWzUgKyAwICogOF0gPSBibGtZWzAgKyAwICogOF0gKyAxOworCQkJYmxrWVs2ICsgMCAqIDhdID0gYmxrWVswICsgMCAqIDhdICsgMjsKKwkJCWJsa1lbNyArIDAgKiA4XSA9IGJsa1lbMSArIDAgKiA4XSArIDI7CisJCQlibGtZWzMgKyAxICogOF0gPSBibGtZWzIgKyAxICogOF0gKyAxOworCQkJYmxrWVs0ICsgMSAqIDhdID0gYmxrWVsxICsgMSAqIDhdICsgMjsKKwkJCWJsa1lbNSArIDEgKiA4XSA9IGJsa1lbMCArIDEgKiA4XSArIDI7CisJCQlibGtZWzYgKyAxICogOF0gPSBibGtZWzAgKyAxICogOF0gKyAyOworCQkJYmxrWVs3ICsgMSAqIDhdID0gYmxrWVsxICsgMSAqIDhdICsgMzsKKwkJCWJsa1lbMyArIDIgKiA4XSA9IGJsa1lbMiArIDIgKiA4XSArIDM7CisJCQlibGtZWzQgKyAyICogOF0gPSBibGtZWzEgKyAyICogOF0gKyAxOworCQkJYmxrWVs1ICsgMiAqIDhdID0gYmxrWVswICsgMiAqIDhdICsgMzsKKwkJCWJsa1lbNiArIDIgKiA4XSA9IGJsa1lbMCArIDIgKiA4XSArIDM7CisJCQlibGtZWzcgKyAyICogOF0gPSBibGtZWzEgKyAyICogOF0gKyAzOworCQkJYmxrWVszICsgMyAqIDhdID0gYmxrWVsyICsgMyAqIDhdICsgMDsKKwkJCWJsa1lbNCArIDMgKiA4XSA9IGJsa1lbMSArIDMgKiA4XSArIDA7CisJCQlibGtZWzUgKyAzICogOF0gPSBibGtZWzAgKyAzICogOF0gKyAxOworCQkJYmxrWVs2ICsgMyAqIDhdID0gYmxrWVswICsgMyAqIDhdICsgMjsKKwkJCWJsa1lbNyArIDMgKiA4XSA9IGJsa1lbMSArIDMgKiA4XSArIDE7CisJCQlibGtDYlsxICsgMCAqIDRdID0gYmxrQ2JbMCArIDAgKiA0XTsKKwkJCWJsa0NiWzIgKyAwICogNF0gPSBibGtDYlswICsgMCAqIDRdOworCQkJYmxrQ2JbMyArIDAgKiA0XSA9IGJsa0NiWzAgKyAwICogNF07CisJCQlibGtDYlsxICsgMSAqIDRdID0gYmxrQ2JbMCArIDEgKiA0XTsKKwkJCWJsa0NiWzIgKyAxICogNF0gPSBibGtDYlswICsgMSAqIDRdOworCQkJYmxrQ2JbMyArIDEgKiA0XSA9IGJsa0NiWzAgKyAxICogNF07CisJCQlibGtDclsxICsgMCAqIDRdID0gYmxrQ3JbMCArIDAgKiA0XTsKKwkJCWJsa0NyWzIgKyAwICogNF0gPSBibGtDclswICsgMCAqIDRdOworCQkJYmxrQ3JbMyArIDAgKiA0XSA9IGJsa0NyWzAgKyAwICogNF07CisJCQlibGtDclsxICsgMSAqIDRdID0gYmxrQ3JbMCArIDEgKiA0XTsKKwkJCWJsa0NyWzIgKyAxICogNF0gPSBibGtDclswICsgMSAqIDRdOworCQkJYmxrQ3JbMyArIDEgKiA0XSA9IGJsa0NyWzAgKyAxICogNF07CisKKwkJCS8qU3RvcmUgZGF0YSBiYWNrIHRvIEREUiovCisJCQljb252VW5jOHg0YmxrKGJsa1ksIGJsa0NiLCBibGtDciwgY21Cb2R5QnVmTm93LCAxKTsKKwkJfQorCisJCWJsa0J1ZkNudCA9IChibGtCdWZDbnQ9PTEpID8gMCA6IGJsa0J1ZkNudCArIDE7CisJfQorCisJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX0RFVEFJTCwKKwkJImNtQm9keUJ1ZiB0byBkZXRidWY6XG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzIgKiAxODsgaSsrKSB7CisJCWhldmMtPmRldGJ1Zl9hZHJfdmlydFtpXSA9IGNtQm9keUJ1ZltpXTsKKwkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmCisJCQkJSDI2NV9ERUJVR19ERVRBSUwpIHsKKwkJCWlmICgoaSAmIDB4ZikgPT0gMCkKKwkJCQloZXZjX3ByaW50X2NvbnQoaGV2YywgMCwgIlxuIik7CisJCQloZXZjX3ByaW50X2NvbnQoaGV2YywgMCwgIiUwMnggIiwgY21Cb2R5QnVmW2ldKTsKKwkJfQorCX0KKwloZXZjX3ByaW50X2NvbnQoaGV2YywgSDI2NV9ERUJVR19ERVRBSUwsICJcbiIpOworCisJV1JJVEVfVlJFRyhIRVZDX1NBT19EQkdfTU9ERTEsIDMpOworCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19CVUZNR1JfTU9SRSwKKwkJIiVzLCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlkbyB7CisJCXRtcERhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19EQkdfTU9ERTEpOworCX0gd2hpbGUgKHRtcERhdGEzMik7CisJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX0JVRk1HUl9NT1JFLAorCQkiJXMsICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXZmcmVlKGNtQm9keUJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIGRlbHJlZmlsbChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCS8qCisJICogY29yclJlZmlsbAorCSAqLworCS8qSEVWQ19TQU9fREJHX01PREUwOiBwaWNHbG9iYWxWYXJpYWJsZQorCVszMTozMF1lcnJvciBudW1iZXIKKwlbMjk6MjBdZXJyb3IyKFs5OjdddGlsZXhbNjowXWN0dXkpCisJWzE5OjEwXWVycm9yMSBbOTowXWVycm9yMCovCisJdWludDMyX3QgZGV0UmVzdWx0ID0gUkVBRF9WUkVHKEhFVkNfQVNTSVNUX1NDUkFUQ0hfMyk7CisJdWludDMyX3QgZXJyb3JJZHg7CisJdWludDMyX3QgZXJyb3JOdW0gPSAoZGV0UmVzdWx0Pj4zMCk7CisKKwlpZiAoZGV0UmVzdWx0KSB7CisJCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19CVUZNR1IsCisJCQkiW2NvcnJSZWZpbGxXaXRoQW1yaXNjXSBkZXRSZXN1bHQ9JTA4eFxuIiwgZGV0UmVzdWx0KTsKKwkJZm9yIChlcnJvcklkeCA9IDA7IGVycm9ySWR4IDwgZXJyb3JOdW07IGVycm9ySWR4KyspIHsKKwkJCXVpbnQzMl90IGVycm9yUG9zID0gZXJyb3JJZHggKiAxMDsKKwkJCXVpbnQzMl90IGVycm9yUmVzdWx0ID0gKGRldFJlc3VsdCA+PiBlcnJvclBvcykgJiAweDNmZjsKKwkJCXVpbnQzMl90IHRpbGV4ID0gKGVycm9yUmVzdWx0ID4+IDcpIC0gMTsKKwkJCXVpbnQxNl90IGN0dXggPSBoZXZjLT5tX3RpbGVbMF1bdGlsZXhdLnN0YXJ0X2N1X3gKKwkJCQkrIGhldmMtPm1fdGlsZVswXVt0aWxleF0ud2lkdGggLSAxOworCQkJdWludDE2X3QgY3R1eSA9ICh1aW50MTZfdCkoZXJyb3JSZXN1bHQgJiAweDdmKTsKKwkJCXVpbnQzMl90IGN0dVBvc2l0aW9uID0gKGN0dXg8PCAxNikgKyBjdHV5OworCQkJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX0JVRk1HUiwKKwkJCQkiSWR4OiVkIHRpbGV4OiVkIGN0dSglZCgweCV4KSwgJWQoMHgleCkpXG4iLAorCQkJCWVycm9ySWR4LHRpbGV4LGN0dXgsY3R1eCwgY3R1eSxjdHV5KTsKKwkJCWNvcnJSZWZpbGxXaXRoQW1yaXNjKAorCQkJCWhldmMsCisJCQkJKHVpbnQzMl90KWhldmMtPmN1cl9waWMtPmhlYWRlcl9hZHIsCisJCQkJaGV2Yy0+cGljX3csCisJCQkJY3R1UG9zaXRpb24pOworCQl9CisKKwkJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9TQ1JBVENIXzMsIDApOyAvKmNsZWFyIHN0YXR1cyovCisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fREJHX01PREUwLCAwKTsKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19EQkdfTU9ERTEsIDEpOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBnZXRfcnBtX3BhcmFtKHVuaW9uIHBhcmFtX3UgKnBhcmFtcykKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgZGF0YTMyOworCisJZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7CisJCWRvIHsKKwkJCWRhdGEzMiA9IFJFQURfVlJFRyhSUE1fQ01EX1JFRyk7CisJCQkvKiBoZXZjX3ByaW50KGhldmMsIDAsICIleFxuIiwgZGF0YTMyKTsgKi8KKwkJfSB3aGlsZSAoKGRhdGEzMiAmIDB4MTAwMDApID09IDApOworCQlwYXJhbXMtPmwuZGF0YVtpXSA9IGRhdGEzMiAmIDB4ZmZmZjsKKwkJLyogaGV2Y19wcmludChoZXZjLCAwLCAiJXhcbiIsIGRhdGEzMik7ICovCisJCVdSSVRFX1ZSRUcoUlBNX0NNRF9SRUcsIDApOworCX0KK30KKworc3RhdGljIGludCBnZXRfZnJlZV9idWZfaWR4KHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJaW50IGluZGV4ID0gSU5WQUxJRF9JRFg7CisJc3RydWN0IFBJQ19zICpwaWM7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaGV2Yy0+dXNlZF9idWZfbnVtOyBpKyspIHsKKwkJcGljID0gaGV2Yy0+bV9QSUNbaV07CisJCWlmICgocGljID09IE5VTEwpIHx8CisJCQkocGljLT5pbmRleCA9PSAtMSkgfHwKKwkJCShwaWMtPkJVRl9pbmRleCA9PSAtMSkpCisJCQljb250aW51ZTsKKworCQlpZiAoKHBpYy0+b3V0cHV0X21hcmsgPT0gMCkgJiYKKwkJCShwaWMtPnJlZmVyZW5jZWQgPT0gMCkgJiYKKwkJCShwaWMtPm91dHB1dF9yZWFkeSA9PSAwKSAmJgorCQkJKHBpYy0+dmZfcmVmID09IDApICYmCisJCQkocGljLT5jbWFfYWxsb2NfYWRkcikpIHsKKwkJCXBpYy0+b3V0cHV0X3JlYWR5ID0gMTsKKwkJCWluZGV4ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGluZGV4OworfQorCitzdGF0aWMgc3RydWN0IFBJQ19zICpnZXRfcGljX2J5X1BPQyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLCBpbnQgUE9DKQoreworCWludCBpOworCXN0cnVjdCBQSUNfcyAqcGljOworCXN0cnVjdCBQSUNfcyAqcmV0X3BpYyA9IE5VTEw7CisJaWYgKFBPQyA9PSBJTlZBTElEX1BPQykKKwkJcmV0dXJuIE5VTEw7CisJZm9yIChpID0gMDsgaSA8IE1BWF9SRUZfUElDX05VTTsgaSsrKSB7CisJCXBpYyA9IGhldmMtPm1fUElDW2ldOworCQlpZiAocGljID09IE5VTEwgfHwgcGljLT5pbmRleCA9PSAtMSB8fAorCQkJcGljLT5CVUZfaW5kZXggPT0gLTEpCisJCQljb250aW51ZTsKKwkJaWYgKHBpYy0+UE9DID09IFBPQykgeworCQkJaWYgKHJldF9waWMgPT0gTlVMTCkKKwkJCQlyZXRfcGljID0gcGljOworCQkJZWxzZSB7CisJCQkJaWYgKHBpYy0+ZGVjb2RlX2lkeCA+IHJldF9waWMtPmRlY29kZV9pZHgpCisJCQkJCXJldF9waWMgPSBwaWM7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHJldF9waWM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgUElDX3MgKmdldF9yZWZfcGljX2J5X1BPQyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLCBpbnQgUE9DKQoreworCWludCBpOworCXN0cnVjdCBQSUNfcyAqcGljOworCXN0cnVjdCBQSUNfcyAqcmV0X3BpYyA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9QSUNfTlVNOyBpKyspIHsKKwkJcGljID0gaGV2Yy0+bV9QSUNbaV07CisJCWlmIChwaWMgPT0gTlVMTCB8fCBwaWMtPmluZGV4ID09IC0xIHx8CisJCQlwaWMtPkJVRl9pbmRleCA9PSAtMSkKKwkJCWNvbnRpbnVlOworCQkvKkFkZCB3aWR0aCBhbmQgaGVpZ2h0IG9mIHJlZiBwaWN0dXJlIGRldGVjdGlvbiwKKwkJCXJlc29sdmVkIGluY29ycmVjdGx5IHJlZmVyZW5jZWQgZnJhbWUuKi8KKwkJaWYgKChwaWMtPlBPQyA9PSBQT0MpICYmIChwaWMtPnJlZmVyZW5jZWQpICYmCisJCQkoaGV2Yy0+cGljX3cgPT0gcGljLT53aWR0aCkgJiYKKwkJCShoZXZjLT5waWNfaCA9PSBwaWMtPmhlaWdodCkpIHsKKwkJCWlmIChyZXRfcGljID09IE5VTEwpCisJCQkJcmV0X3BpYyA9IHBpYzsKKwkJCWVsc2UgeworCQkJCWlmIChwaWMtPmRlY29kZV9pZHggPiByZXRfcGljLT5kZWNvZGVfaWR4KQorCQkJCQlyZXRfcGljID0gcGljOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHJldF9waWM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbG9nMmkodW5zaWduZWQgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgcmV0ID0gLTE7CisKKwl3aGlsZSAodmFsICE9IDApIHsKKwkJdmFsID4+PSAxOworCQlyZXQrKzsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpbml0X2J1Zl9zcGVjKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpOworCisKK3N0YXRpYyB2b2lkIHVuaW5pdF9tbXVfYnVmZmVycyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWlmIChoZXZjLT5tbXVfYm94KSB7CisJCWRlY29kZXJfbW11X2JveF9mcmVlKGhldmMtPm1tdV9ib3gpOworCQloZXZjLT5tbXVfYm94ID0gTlVMTDsKKwl9CisjaWZkZWYgSDI2NV8xMEJfTU1VX0RXCisJaWYgKGhldmMtPm1tdV9ib3hfZHcpIHsKKwkJZGVjb2Rlcl9tbXVfYm94X2ZyZWUoaGV2Yy0+bW11X2JveF9kdyk7CisJCWhldmMtPm1tdV9ib3hfZHcgPSBOVUxMOworCX0KKyNlbmRpZgorCWlmIChoZXZjLT5ibW11X2JveCkgeworCQkvKiByZWxlYXNlIHdvcmtzcGFjZSAqLworCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWVfaWR4KGhldmMtPmJtbXVfYm94LAorCQkJQk1NVV9XT1JLU1BBQ0VfSUQpOworCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWUoaGV2Yy0+Ym1tdV9ib3gpOworCQloZXZjLT5ibW11X2JveCA9IE5VTEw7CisJfQorfQorCisvKiByZXR1cm4gaW4gTUIgKi8KK3N0YXRpYyBpbnQgaGV2Y19tYXhfbW11X2J1Zl9zaXplKGludCBtYXhfdywgaW50IG1heF9oKQoreworCWludCBidWZfc2l6ZSA9IDY0OworCisJaWYgKChtYXhfdyAqIG1heF9oKSA+IDAgJiYKKwkJKG1heF93ICogbWF4X2gpIDw9IDE5MjAqMTA4OCkgeworCQlidWZfc2l6ZSA9IDI0OworCX0KKwlyZXR1cm4gYnVmX3NpemU7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9tbXVfYnVmZmVycyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLCBpbnQgYm1tdV9mbGFnKQoreworCWludCB0dnBfZmxhZyA9IHZkZWNfc2VjdXJlKGh3X3RvX3ZkZWMoaGV2YykpID8KKwkJQ09ERUNfTU1fRkxBR1NfVFZQIDogMDsKKwlpbnQgYnVmX3NpemUgPSBoZXZjX21heF9tbXVfYnVmX3NpemUoaGV2Yy0+bWF4X3BpY193LAorCQkJaGV2Yy0+bWF4X3BpY19oKTsKKworCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykpIHsKKwkJaGV2Y19wcmludChoZXZjLCAwLCAiJXMgbWF4X3cgJWQgbWF4X2ggJWRcbiIsCisJCQlfX2Z1bmNfXywgaGV2Yy0+bWF4X3BpY193LCBoZXZjLT5tYXhfcGljX2gpOworCX0KKworCWhldmMtPm5lZWRfY2FjaGVfc2l6ZSA9IGJ1Zl9zaXplICogU1pfMU07CisJaGV2Yy0+c2Nfc3RhcnRfdGltZSA9IGdldF9qaWZmaWVzXzY0KCk7CisJaWYgKGhldmMtPm1tdV9lbmFibGUgJiYgIWhldmMtPmlzX3VzZWRfdjRsKSB7CisJCWhldmMtPm1tdV9ib3ggPSBkZWNvZGVyX21tdV9ib3hfYWxsb2NfYm94KERSSVZFUl9OQU1FLAorCQkJaGV2Yy0+aW5kZXgsCisJCQlNQVhfUkVGX1BJQ19OVU0sCisJCQlidWZfc2l6ZSAqIFNaXzFNLAorCQkJdHZwX2ZsYWcKKwkJCSk7CisJCWlmICghaGV2Yy0+bW11X2JveCkgeworCQkJcHJfZXJyKCJoMjY1IGFsbG9jIG1tdSBib3ggZmFpbGVkISFcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisjaWZkZWYgSDI2NV8xMEJfTU1VX0RXCisJCWlmIChoZXZjLT5kd19tbXVfZW5hYmxlKSB7CisJCQloZXZjLT5tbXVfYm94X2R3ID0gZGVjb2Rlcl9tbXVfYm94X2FsbG9jX2JveChEUklWRVJfTkFNRSwKKwkJCQloZXZjLT5pbmRleCwKKwkJCQlNQVhfUkVGX1BJQ19OVU0sCisJCQkJYnVmX3NpemUgKiBTWl8xTSwKKwkJCQl0dnBfZmxhZworCQkJCSk7CisJCQlpZiAoIWhldmMtPm1tdV9ib3hfZHcpCisJCQkJZ290byBkd19tbXVfYm94X2ZhaWxlZDsKKwkJfQorI2VuZGlmCisJfQorCWlmIChibW11X2ZsYWcpCisJCXJldHVybiAwOworCisJaGV2Yy0+Ym1tdV9ib3ggPSBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2JveChEUklWRVJfTkFNRSwKKwkJCWhldmMtPmluZGV4LAorCQkJQk1NVV9NQVhfQlVGRkVSUywKKwkJCTQgKyBQQUdFX1NISUZULAorCQkJQ09ERUNfTU1fRkxBR1NfQ01BX0NMRUFSIHwKKwkJCUNPREVDX01NX0ZMQUdTX0ZPUl9WREVDT0RFUiB8CisJCQl0dnBfZmxhZyk7CisJaWYgKCFoZXZjLT5ibW11X2JveCkKKwkJZ290byBibW11X2JveF9mYWlsZWQ7CisKKwlyZXR1cm4gMDsKK2JtbXVfYm94X2ZhaWxlZDoKKyNpZmRlZiBIMjY1XzEwQl9NTVVfRFcKKwlpZiAoaGV2Yy0+bW11X2JveF9kdykKKwkJZGVjb2Rlcl9tbXVfYm94X2ZyZWUoaGV2Yy0+bW11X2JveF9kdyk7CisJaGV2Yy0+bW11X2JveF9kdyA9IE5VTEw7Citkd19tbXVfYm94X2ZhaWxlZDoKKyNlbmRpZgorCWlmIChoZXZjLT5tbXVfYm94KSB7CisJCWRlY29kZXJfbW11X2JveF9mcmVlKGhldmMtPm1tdV9ib3gpOworCX0KKwloZXZjLT5tbXVfYm94ID0gTlVMTDsKKwlwcl9lcnIoImgyNjUgJXMgZmFpbGVkISFcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0cnVjdCBidWZfc3RydV9zCit7CisJaW50IGxjdV90b3RhbDsKKwlpbnQgbWNfYnVmZmVyX3NpemVfaDsKKwlpbnQgbWNfYnVmZmVyX3NpemVfdV92X2g7Cit9OworCisjaWZuZGVmIE1WX1VTRV9GSVhFRF9CVUYKK3N0YXRpYyB2b2lkIGRlYWxsb2NfbXZfYnVmcyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVGX1BJQ19OVU07IGkrKykgeworCQlpZiAoaGV2Yy0+bV9tdl9CVUZbaV0uc3RhcnRfYWRyKSB7CisJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1IpCisJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSJkZWFsbG9jIG12IGJ1ZiglZCkgYWRyIDB4JXAgc2l6ZSAweCV4IHVzZWRfZmxhZyAlZFxuIiwKKwkJCQlpLCBoZXZjLT5tX212X0JVRltpXS5zdGFydF9hZHIsCisJCQkJaGV2Yy0+bV9tdl9CVUZbaV0uc2l6ZSwKKwkJCQloZXZjLT5tX212X0JVRltpXS51c2VkX2ZsYWcpOworCQkJZGVjb2Rlcl9ibW11X2JveF9mcmVlX2lkeCgKKwkJCQloZXZjLT5ibW11X2JveCwKKwkJCQlNVl9CVUZGRVJfSURYKGkpKTsKKwkJCWhldmMtPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciA9IDA7CisJCQloZXZjLT5tX212X0JVRltpXS5zaXplID0gMDsKKwkJCWhldmMtPm1fbXZfQlVGW2ldLnVzZWRfZmxhZyA9IDA7CisJCX0KKwl9CisJZm9yIChpID0gMDsgaSA8IE1BWF9SRUZfUElDX05VTTsgaSsrKSB7CisJCWlmIChoZXZjLT5tX1BJQ1tpXSAhPSBOVUxMKQorCQkJaGV2Yy0+bV9QSUNbaV0tPm12X2J1Zl9pbmRleCA9IC0xOworCX0KK30KKworc3RhdGljIGludCBhbGxvY19tdl9idWYoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywgaW50IGkpCit7CisJaW50IHJldCA9IDA7CisJLypnZXRfY21hX2FsbG9jX3JlZigpOyovIC8qREVCVUdfVE1QKi8KKwlpZiAoZGVjb2Rlcl9ibW11X2JveF9hbGxvY19idWZfcGh5CisJCShoZXZjLT5ibW11X2JveCwKKwkJTVZfQlVGRkVSX0lEWChpKSwgaGV2Yy0+bXZfYnVmX3NpemUsCisJCURSSVZFUl9OQU1FLAorCQkmaGV2Yy0+bV9tdl9CVUZbaV0uc3RhcnRfYWRyKSA8IDApIHsKKwkJaGV2Yy0+bV9tdl9CVUZbaV0uc3RhcnRfYWRyID0gMDsKKwkJcmV0ID0gLTE7CisJfSBlbHNlIHsKKwkJaGV2Yy0+bV9tdl9CVUZbaV0uc2l6ZSA9IGhldmMtPm12X2J1Zl9zaXplOworCQloZXZjLT5tX212X0JVRltpXS51c2VkX2ZsYWcgPSAwOworCQlyZXQgPSAwOworCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1IpIHsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJNViBCdWZmZXIgJWQ6IHN0YXJ0X2FkciAlcCBzaXplICV4XG4iLAorCQkJaSwKKwkJCSh2b2lkICopaGV2Yy0+bV9tdl9CVUZbaV0uc3RhcnRfYWRyLAorCQkJaGV2Yy0+bV9tdl9CVUZbaV0uc2l6ZSk7CisJCX0KKwkJaWYgKCF2ZGVjX3NlY3VyZShod190b192ZGVjKGhldmMpKSAmJiAoaGV2Yy0+bV9tdl9CVUZbaV0uc3RhcnRfYWRyKSkgeworCQkJdm9pZCAqbWVtX3N0YXJ0X3ZpcnQ7CisJCQltZW1fc3RhcnRfdmlydCA9CisJCQkJCWNvZGVjX21tX3BoeXNfdG9fdmlydChoZXZjLT5tX212X0JVRltpXS5zdGFydF9hZHIpOworCQkJaWYgKG1lbV9zdGFydF92aXJ0KSB7CisJCQkJCW1lbXNldChtZW1fc3RhcnRfdmlydCwgMCwgaGV2Yy0+bV9tdl9CVUZbaV0uc2l6ZSk7CisJCQkJCWNvZGVjX21tX2RtYV9mbHVzaChtZW1fc3RhcnRfdmlydCwKKwkJCQkJCQloZXZjLT5tX212X0JVRltpXS5zaXplLCBETUFfVE9fREVWSUNFKTsKKwkJCX0gZWxzZSB7CisJCQkJCW1lbV9zdGFydF92aXJ0ID0gY29kZWNfbW1fdm1hcCgKKwkJCQkJCQloZXZjLT5tX212X0JVRltpXS5zdGFydF9hZHIsCisJCQkJCQkJaGV2Yy0+bV9tdl9CVUZbaV0uc2l6ZSk7CisJCQkJCWlmIChtZW1fc3RhcnRfdmlydCkgeworCQkJCQkJCW1lbXNldChtZW1fc3RhcnRfdmlydCwgMCwgaGV2Yy0+bV9tdl9CVUZbaV0uc2l6ZSk7CisJCQkJCQkJY29kZWNfbW1fZG1hX2ZsdXNoKG1lbV9zdGFydF92aXJ0LAorCQkJCQkJCQkJaGV2Yy0+bV9tdl9CVUZbaV0uc2l6ZSwKKwkJCQkJCQkJCURNQV9UT19ERVZJQ0UpOworCQkJCQkJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIobWVtX3N0YXJ0X3ZpcnQpOworCQkJCQl9IGVsc2UgeworCQkJCQkJCS8qbm90IHZpcnQgZm9yIHR2cCBwbGF5aW5nLAorCQkJCQkJCW1heSBuZWVkIGNsZWFyIG9uIHVjb2RlLiovCisJCQkJCQkJcHJfZXJyKCJyZWYgJXMJbWVtX3N0YXJ0X3ZpcnQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkvKnB1dF9jbWFfYWxsb2NfcmVmKCk7Ki8gLypERUJVR19UTVAqLworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBnZXRfbXZfYnVmKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsIHN0cnVjdCBQSUNfcyAqcGljKQoreworI2lmZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwlpZiAocGljICYmIHBpYy0+aW5kZXggPj0gMCkgeworCQlpbnQgbXZfc2l6ZTsKKwkJaWYgKElTXzhLX1NJWkUocGljLT53aWR0aCwgcGljLT5oZWlnaHQpKQorCQkJbXZfc2l6ZSA9IE1QUkVEXzhLX01WX0JVRl9TSVpFOworCQllbHNlIGlmIChJU180S19TSVpFKHBpYy0+d2lkdGgsIHBpYy0+aGVpZ2h0KSkKKwkJCW12X3NpemUgPSBNUFJFRF80S19NVl9CVUZfU0laRTsgLyoweDEyMDAwMCovCisJCWVsc2UKKwkJCW12X3NpemUgPSBNUFJFRF9NVl9CVUZfU0laRTsKKworCQlwaWMtPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIgPQorCQkJaGV2Yy0+d29ya19zcGFjZV9idWYtPm1wcmVkX212LmJ1Zl9zdGFydAorCQkJKyAocGljLT5pbmRleCAqIG12X3NpemUpOworCQlwaWMtPm12X3NpemUgPSBtdl9zaXplOworCX0KKwlyZXR1cm4gMDsKKyNlbHNlCisJaW50IGk7CisJaW50IHJldCA9IC0xOworCWludCBuZXdfc2l6ZTsKKwlpZiAobXZfYnVmX2R5bmFtaWNfYWxsb2MpIHsKKwkJaW50IE1WX01FTV9VTklUID0KKwkJCWhldmMtPmxjdV9zaXplX2xvZzIgPT0gNiA/IDB4MjAwIDogaGV2Yy0+bGN1X3NpemVfbG9nMiA9PQorCQkJNSA/IDB4ODAgOiAweDIwOworCQlpbnQgZXh0ZW5kZWRfcGljX3dpZHRoID0gKHBpYy0+d2lkdGggKyBoZXZjLT5sY3Vfc2l6ZSAtMSkKKwkJCQkmICh+KGhldmMtPmxjdV9zaXplIC0gMSkpOworCQlpbnQgZXh0ZW5kZWRfcGljX2hlaWdodCA9IChwaWMtPmhlaWdodCArIGhldmMtPmxjdV9zaXplIC0xKQorCQkJCSYgKH4oaGV2Yy0+bGN1X3NpemUgLSAxKSk7CisJCWludCBsY3VfeF9udW0gPSBleHRlbmRlZF9waWNfd2lkdGggLyBoZXZjLT5sY3Vfc2l6ZTsKKwkJaW50IGxjdV95X251bSA9IGV4dGVuZGVkX3BpY19oZWlnaHQgLyBoZXZjLT5sY3Vfc2l6ZTsKKwkJbmV3X3NpemUgPSAgbGN1X3hfbnVtICogbGN1X3lfbnVtICogTVZfTUVNX1VOSVQ7CisJCWhldmMtPm12X2J1Zl9zaXplID0gKG5ld19zaXplICsgMHhmZmZmKSAmICh+MHhmZmZmKTsKKwl9IGVsc2UgeworCQlpZiAoSVNfOEtfU0laRShwaWMtPndpZHRoLCBwaWMtPmhlaWdodCkpCisJCQluZXdfc2l6ZSA9IE1QUkVEXzhLX01WX0JVRl9TSVpFOworCQllbHNlIGlmIChJU180S19TSVpFKHBpYy0+d2lkdGgsIHBpYy0+aGVpZ2h0KSkKKwkJCW5ld19zaXplID0gTVBSRURfNEtfTVZfQlVGX1NJWkU7IC8qMHgxMjAwMDAqLworCQllbHNlCisJCQluZXdfc2l6ZSA9IE1QUkVEX01WX0JVRl9TSVpFOworCisJCWlmIChuZXdfc2l6ZSAhPSBoZXZjLT5tdl9idWZfc2l6ZSkgeworCQkJZGVhbGxvY19tdl9idWZzKGhldmMpOworCQkJaGV2Yy0+bXZfYnVmX3NpemUgPSBuZXdfc2l6ZTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9QSUNfTlVNOyBpKyspIHsKKwkJCWlmIChoZXZjLT5tX212X0JVRltpXS5zdGFydF9hZHIgJiYKKwkJCQloZXZjLT5tX212X0JVRltpXS51c2VkX2ZsYWcgPT0gMCkgeworCQkJCWhldmMtPm1fbXZfQlVGW2ldLnVzZWRfZmxhZyA9IDE7CisJCQkJcmV0ID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlpZiAocmV0IDwgMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9QSUNfTlVNOyBpKyspIHsKKwkJCWlmIChoZXZjLT5tX212X0JVRltpXS5zdGFydF9hZHIgPT0gMCkgeworCQkJCWlmIChhbGxvY19tdl9idWYoaGV2YywgaSkgPj0gMCkgeworCQkJCQloZXZjLT5tX212X0JVRltpXS51c2VkX2ZsYWcgPSAxOworCQkJCQlyZXQgPSBpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmIChyZXQgPj0gMCkgeworCQlwaWMtPm12X2J1Zl9pbmRleCA9IHJldDsKKwkJcGljLT5tdl9zaXplID0gaGV2Yy0+bV9tdl9CVUZbcmV0XS5zaXplOworCQlwaWMtPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIgPQorCQkJKGhldmMtPm1fbXZfQlVGW3JldF0uc3RhcnRfYWRyICsgMHhmZmZmKSAmCisJCQkofjB4ZmZmZik7CisJCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19CVUZNR1JfTU9SRSwKKwkJIiVzID0+ICVkICgweCV4KSBzaXplIDB4JXhcbiIsCisJCV9fZnVuY19fLCByZXQsCisJCXBpYy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkciwKKwkJcGljLT5tdl9zaXplKTsKKworCX0gZWxzZSB7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJIiVzOiBFcnJvciwgbXYgYnVmIGlzIG5vdCBlbm91Z2hcbiIsCisJCV9fZnVuY19fKTsKKwl9CisJcmV0dXJuIHJldDsKKworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHB1dF9tdl9idWYoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwlzdHJ1Y3QgUElDX3MgKnBpYykKK3sKKyNpZm5kZWYgTVZfVVNFX0ZJWEVEX0JVRgorCWludCBpID0gcGljLT5tdl9idWZfaW5kZXg7CisJaWYgKGkgPCAwIHx8IGkgPj0gTUFYX1JFRl9QSUNfTlVNKSB7CisJCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19CVUZNR1JfTU9SRSwKKwkJIiVzOiBpbmRleCAlZCBiZXlvbmQgcmFuZ2VcbiIsCisJCV9fZnVuY19fLCBpKTsKKwkJcmV0dXJuOworCX0KKwlpZiAobXZfYnVmX2R5bmFtaWNfYWxsb2MpIHsKKwkJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX0JVRk1HUl9NT1JFLAorCQkiJXMoJWQpXG4iLAorCQlfX2Z1bmNfXywgaSk7CisKKwkJZGVjb2Rlcl9ibW11X2JveF9mcmVlX2lkeCgKKwkJCWhldmMtPmJtbXVfYm94LAorCQkJTVZfQlVGRkVSX0lEWChpKSk7CisJCWhldmMtPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciA9IDA7CisJCWhldmMtPm1fbXZfQlVGW2ldLnNpemUgPSAwOworCQloZXZjLT5tX212X0JVRltpXS51c2VkX2ZsYWcgPSAwOworCQlwaWMtPm12X2J1Zl9pbmRleCA9IC0xOworCQlyZXR1cm47CisJfQorCisJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX0JVRk1HUl9NT1JFLAorCSIlcyglZCk6IHVzZWRfZmxhZyglZClcbiIsCisJX19mdW5jX18sIGksCisJaGV2Yy0+bV9tdl9CVUZbaV0udXNlZF9mbGFnKTsKKworCWlmIChoZXZjLT5tX212X0JVRltpXS5zdGFydF9hZHIgJiYKKwkJaGV2Yy0+bV9tdl9CVUZbaV0udXNlZF9mbGFnKQorCQloZXZjLT5tX212X0JVRltpXS51c2VkX2ZsYWcgPSAwOworCXBpYy0+bXZfYnVmX2luZGV4ID0gLTE7CisjZW5kaWYKK30KKworc3RhdGljIGludCBoZXZjX2dldF9oZWFkZXJfc2l6ZShpbnQgdywgaW50IGgpCit7CisJaWYgKChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkgJiYKKwkJCShJU184S19TSVpFKHcsIGgpKSkKKwkJcmV0dXJuIE1NVV9DT01QUkVTU19IRUFERVJfU0laRV84SzsKKwllbHNlIGlmIChJU180S19TSVpFKHcsIGgpKQorCQlyZXR1cm4gTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFXzRLOworCWVsc2UKKwkJcmV0dXJuIE1NVV9DT01QUkVTU19IRUFERVJfU0laRV8xMDgwUDsKK30KKworc3RhdGljIGludCBjYWxfY3VycmVudF9idWZfc2l6ZShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCXN0cnVjdCBidWZfc3RydV9zICpidWZfc3RydSkKK3sKKwlpbnQgYnVmX3NpemU7CisJaW50IHBpY193aWR0aCA9IGhldmMtPnBpY193OworCWludCBwaWNfaGVpZ2h0ID0gaGV2Yy0+cGljX2g7CisJaW50IGxjdV9zaXplID0gaGV2Yy0+bGN1X3NpemU7CisJaW50IHBpY193aWR0aF9sY3UgPSAocGljX3dpZHRoICUgbGN1X3NpemUpID8gcGljX3dpZHRoIC8gbGN1X3NpemUgKworCQkJCSAxIDogcGljX3dpZHRoIC8gbGN1X3NpemU7CisJaW50IHBpY19oZWlnaHRfbGN1ID0gKHBpY19oZWlnaHQgJSBsY3Vfc2l6ZSkgPyBwaWNfaGVpZ2h0IC8gbGN1X3NpemUgKworCQkJCSAxIDogcGljX2hlaWdodCAvIGxjdV9zaXplOworCS8qU1VQUE9SVF8xMEJJVCovCisJaW50IGxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSA9IGNvbXB1dGVfbG9zbGVzc19jb21wX2hlYWRlcl9zaXplCisJCShwaWNfd2lkdGgsIHBpY19oZWlnaHQpOworCQkvKmFsd2F5cyBhbGxvYyBidWYgZm9yIDEwYml0Ki8KKwlpbnQgbG9zbGVzc19jb21wX2JvZHlfc2l6ZSA9IGNvbXB1dGVfbG9zbGVzc19jb21wX2JvZHlfc2l6ZQorCQkoaGV2YywgcGljX3dpZHRoLCBwaWNfaGVpZ2h0LCAwKTsKKwlpbnQgbWNfYnVmZmVyX3NpemUgPSBsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUKKwkJKyBsb3NsZXNzX2NvbXBfYm9keV9zaXplOworCWludCBtY19idWZmZXJfc2l6ZV9oID0gKG1jX2J1ZmZlcl9zaXplICsgMHhmZmZmKSA+PiAxNjsKKwlpbnQgbWNfYnVmZmVyX3NpemVfdV92X2ggPSAwOworCisJaW50IGR3X21vZGUgPSBnZXRfZG91YmxlX3dyaXRlX21vZGUoaGV2Yyk7CisKKwlpZiAoaGV2Yy0+bW11X2VuYWJsZSkKKwkJYnVmX3NpemUgPSBoZXZjX2dldF9oZWFkZXJfc2l6ZShoZXZjLT5waWNfdywgaGV2Yy0+cGljX2gpOworCWVsc2UKKwkJYnVmX3NpemUgPSAwOworI2lmZGVmIEgyNjVfMTBCX01NVV9EVworCWlmIChoZXZjLT5kd19tbXVfZW5hYmxlKSB7CisJCWJ1Zl9zaXplID0gKChidWZfc2l6ZSArIDB4ZmZmZikgPj4gMTYpIDw8IDE2OworCQlidWZfc2l6ZSA8PD0gMTsKKwl9CisjZW5kaWYKKwlpZiAoZHdfbW9kZSAmJiAoKGR3X21vZGUgJiAweDIwKSA9PSAwKSkgeworCQlpbnQgcGljX3dpZHRoX2R3ID0gcGljX3dpZHRoIC8KKwkJCWdldF9kb3VibGVfd3JpdGVfcmF0aW8oZHdfbW9kZSk7CisJCWludCBwaWNfaGVpZ2h0X2R3ID0gcGljX2hlaWdodCAvCisJCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKGR3X21vZGUpOworCisJCWludCBwaWNfd2lkdGhfbGN1X2R3ID0gKHBpY193aWR0aF9kdyAlIGxjdV9zaXplKSA/CisJCQlwaWNfd2lkdGhfZHcgLyBsY3Vfc2l6ZSArIDEgOgorCQkJcGljX3dpZHRoX2R3IC8gbGN1X3NpemU7CisJCWludCBwaWNfaGVpZ2h0X2xjdV9kdyA9IChwaWNfaGVpZ2h0X2R3ICUgbGN1X3NpemUpID8KKwkJCXBpY19oZWlnaHRfZHcgLyBsY3Vfc2l6ZSArIDEgOgorCQkJcGljX2hlaWdodF9kdyAvIGxjdV9zaXplOworCQlpbnQgbGN1X3RvdGFsX2R3ID0gcGljX3dpZHRoX2xjdV9kdyAqIHBpY19oZWlnaHRfbGN1X2R3OworCisJCWludCBtY19idWZmZXJfc2l6ZV91X3YgPSBsY3VfdG90YWxfZHcgKiBsY3Vfc2l6ZSAqIGxjdV9zaXplIC8gMjsKKwkJbWNfYnVmZmVyX3NpemVfdV92X2ggPSAobWNfYnVmZmVyX3NpemVfdV92ICsgMHhmZmZmKSA+PiAxNjsKKwkJCS8qNjRrIGFsaWdubWVudCovCisJCWJ1Zl9zaXplICs9ICgobWNfYnVmZmVyX3NpemVfdV92X2ggPDwgMTYpICogMyk7CisJfQorCisJaWYgKCghaGV2Yy0+bW11X2VuYWJsZSkgJiYKKwkJKChkd19tb2RlICYgMHgxMCkgPT0gMCkpIHsKKwkJLyogdXNlIGNvbXByZXNzIG1vZGUgd2l0aG91dCBtbXUsCisJCW5lZWQgYnVmIGZvciBjb21wcmVzcyBkZWNvZGluZyovCisJCWJ1Zl9zaXplICs9IChtY19idWZmZXJfc2l6ZV9oIDw8IDE2KTsKKwl9CisKKwkvKmluIGNhc2Ugc3RhcnQgYWRyIGlzIG5vdCA2NGsgYWxpZ25tZW50Ki8KKwlpZiAoYnVmX3NpemUgPiAwKQorCQlidWZfc2l6ZSArPSAweDEwMDAwOworCisJaWYgKGJ1Zl9zdHJ1KSB7CisJCWJ1Zl9zdHJ1LT5sY3VfdG90YWwgPSBwaWNfd2lkdGhfbGN1ICogcGljX2hlaWdodF9sY3U7CisJCWJ1Zl9zdHJ1LT5tY19idWZmZXJfc2l6ZV9oID0gbWNfYnVmZmVyX3NpemVfaDsKKwkJYnVmX3N0cnUtPm1jX2J1ZmZlcl9zaXplX3Vfdl9oID0gbWNfYnVmZmVyX3NpemVfdV92X2g7CisJfQorCisJaGV2Y19wcmludChoZXZjLCBQUklOVF9GTEFHX1Y0TF9ERVRBSUwsInBpYyB3aWR0aDogJWQsIHBpYyBoZWlnaHQ6ICVkLCBoZWFkcjogJWQsIGJvZHk6ICVkLCBzaXplIGg6ICVkLCBzaXplIHV2aDogJWQsIGJ1ZiBzaXplOiAleFxuIiwKKwkJcGljX3dpZHRoLCBwaWNfaGVpZ2h0LCBsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUsCisJCWxvc2xlc3NfY29tcF9ib2R5X3NpemUsIG1jX2J1ZmZlcl9zaXplX2gsCisJCW1jX2J1ZmZlcl9zaXplX3Vfdl9oLCBidWZfc2l6ZSk7CisKKwlyZXR1cm4gYnVmX3NpemU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZXJuYWxfY29tcF9idWYqIHY0bGZiX3RvX2ljb21wX2J1ZigKKwkJc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwkJc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKmZiKQoreworCXN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1ZiAqYW1sX2ZiID0gTlVMTDsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKiB2NGwyX2N0eCA9IGhldmMtPnY0bDJfY3R4OworCisJYW1sX2ZiID0gY29udGFpbmVyX29mKGZiLCBzdHJ1Y3QgYW1sX3ZpZGVvX2RlY19idWYsIGZyYW1lX2J1ZmZlcik7CisJcmV0dXJuICZ2NGwyX2N0eC0+Y29tcF9idWZzW2FtbF9mYi0+aW50ZXJuYWxfaW5kZXhdOworfQorCitzdGF0aWMgc3RydWN0IGludGVybmFsX2NvbXBfYnVmKiBpbmRleF90b19pY29tcF9idWYoCisJCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgYW1sX3ZpZGVvX2RlY19idWYgKmFtbF9mYiA9IE5VTEw7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICogdjRsMl9jdHggPSBoZXZjLT52NGwyX2N0eDsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPSBOVUxMOworCisJZmIgPSAoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKikKKwkJaGV2Yy0+bV9CVUZbaW5kZXhdLnY0bF9yZWZfYnVmX2FkZHI7CisJYW1sX2ZiID0gY29udGFpbmVyX29mKGZiLCBzdHJ1Y3QgYW1sX3ZpZGVvX2RlY19idWYsIGZyYW1lX2J1ZmZlcik7CisJcmV0dXJuICZ2NGwyX2N0eC0+Y29tcF9idWZzW2FtbF9mYi0+aW50ZXJuYWxfaW5kZXhdOworfQorCitzdGF0aWMgaW50IHY0bF9hbGxvY19idWYoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Yywgc3RydWN0IFBJQ19zICpwaWMpCit7CisJaW50IHJldCA9IC0xOworCWludCBpID0gcGljLT5pbmRleDsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IChzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKiloZXZjLT52NGwyX2N0eDsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPSBOVUxMOworCisJcmV0ID0gY3R4LT5mYl9vcHMuYWxsb2MoJmN0eC0+ZmJfb3BzLCBoZXZjLT5mYl90b2tlbiwgJmZiLCBBTUxfRkJfUkVRX0RFQyk7CisJaWYgKHJldCA8IDApIHsKKwkJaGV2Y19wcmludChoZXZjLCAwLCAiWyVkXSBIMjY1IGdldCBidWZmZXIgZmFpbC5cbiIsIGN0eC0+aWQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWZiLT5zdGF0dXMJPSBGQl9TVF9ERUNPREVSOworCisJaWYgKGhldmMtPm1tdV9lbmFibGUpIHsKKwkJc3RydWN0IGludGVybmFsX2NvbXBfYnVmICppYnVmID0gdjRsZmJfdG9faWNvbXBfYnVmKGhldmMsIGZiKTsKKwkJaGV2Yy0+bV9CVUZbaV0uaGVhZGVyX2FkZHIgPSBpYnVmLT5oZWFkZXJfYWRkcjsKKwl9CisKKwloZXZjLT5tX0JVRltpXS51c2VkX2ZsYWcJPSAwOworCWhldmMtPm1fQlVGW2ldLnY0bF9yZWZfYnVmX2FkZHIJPSAodWxvbmcpZmI7CisJcGljLT5jbWFfYWxsb2NfYWRkcgkJPSBoZXZjLT5tX0JVRltpXS52NGxfcmVmX2J1Zl9hZGRyOworCWlmIChmYi0+bnVtX3BsYW5lcyA9PSAxKSB7CisJCWhldmMtPm1fQlVGW2ldLnN0YXJ0X2FkciA9IGZiLT5tLm1lbVswXS5hZGRyOworCQloZXZjLT5tX0JVRltpXS5sdW1hX3NpemUgPSBmYi0+bS5tZW1bMF0ub2Zmc2V0OworCQloZXZjLT5tX0JVRltpXS5zaXplID0gZmItPm0ubWVtWzBdLnNpemU7CisJCWZiLT5tLm1lbVswXS5ieXRlc191c2VkID0gZmItPm0ubWVtWzBdLnNpemU7CisJCXBpYy0+ZHdfeV9hZHIgPSBoZXZjLT5tX0JVRltpXS5zdGFydF9hZHI7CisJCXBpYy0+ZHdfdV92X2FkciA9IHBpYy0+ZHdfeV9hZHIgKyBoZXZjLT5tX0JVRltpXS5sdW1hX3NpemU7CisJCXBpYy0+bHVtYV9zaXplID0gZmItPm0ubWVtWzBdLm9mZnNldDsKKwkJcGljLT5jaHJvbWFfc2l6ZSA9IGZiLT5tLm1lbVswXS5zaXplIC0gZmItPm0ubWVtWzBdLm9mZnNldDsKKwl9IGVsc2UgaWYgKGZiLT5udW1fcGxhbmVzID09IDIpIHsKKwkJaGV2Yy0+bV9CVUZbaV0uc3RhcnRfYWRyID0gZmItPm0ubWVtWzBdLmFkZHI7CisJCWhldmMtPm1fQlVGW2ldLmx1bWFfc2l6ZSA9IGZiLT5tLm1lbVswXS5zaXplOworCQloZXZjLT5tX0JVRltpXS5jaHJvbWFfYWRkciA9IGZiLT5tLm1lbVsxXS5hZGRyOworCQloZXZjLT5tX0JVRltpXS5jaHJvbWFfc2l6ZSA9IGZiLT5tLm1lbVsxXS5zaXplOworCQloZXZjLT5tX0JVRltpXS5zaXplID0gZmItPm0ubWVtWzBdLnNpemUgKyBmYi0+bS5tZW1bMV0uc2l6ZTsKKwkJZmItPm0ubWVtWzBdLmJ5dGVzX3VzZWQgPSBmYi0+bS5tZW1bMF0uc2l6ZTsKKwkJZmItPm0ubWVtWzFdLmJ5dGVzX3VzZWQgPSBmYi0+bS5tZW1bMV0uc2l6ZTsKKwkJcGljLT5kd195X2FkciA9IGhldmMtPm1fQlVGW2ldLnN0YXJ0X2FkcjsKKwkJcGljLT5kd191X3ZfYWRyID0gaGV2Yy0+bV9CVUZbaV0uY2hyb21hX2FkZHI7CisJCXBpYy0+bHVtYV9zaXplID0gZmItPm0ubWVtWzBdLnNpemU7CisJCXBpYy0+Y2hyb21hX3NpemUgPSBmYi0+bS5tZW1bMV0uc2l6ZTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFsbG9jX2J1ZihzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWludCBpOworCWludCByZXQgPSAtMTsKKwlpbnQgYnVmX3NpemUgPSBjYWxfY3VycmVudF9idWZfc2l6ZShoZXZjLCBOVUxMKTsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhoZXZjKTsKKworCWlmIChoZXZjLT5mYXRhbF9lcnJvciAmIERFQ09ERVJfRkFUQUxfRVJST1JfTk9fTUVNKQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IEJVRl9QT09MX1NJWkU7IGkrKykgeworCQlpZiAoaGV2Yy0+bV9CVUZbaV0uc3RhcnRfYWRyID09IDApCisJCQlicmVhazsKKwl9CisJaWYgKGkgPCBCVUZfUE9PTF9TSVpFKSB7CisJCWlmIChidWZfc2l6ZSA+IDApIHsKKwkJCXJldCA9IGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeQorCQkJCShoZXZjLT5ibW11X2JveCwKKwkJCQlWRl9CVUZGRVJfSURYKGkpLCBidWZfc2l6ZSwKKwkJCQlEUklWRVJfTkFNRSwKKwkJCQkmaGV2Yy0+bV9CVUZbaV0uc3RhcnRfYWRyKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJaGV2Yy0+bV9CVUZbaV0uc3RhcnRfYWRyID0gMDsKKwkJCQlpZiAoaSA8PSA4KSB7CisJCQkJCWhldmMtPmZhdGFsX2Vycm9yIHw9CisJCQkJCQlERUNPREVSX0ZBVEFMX0VSUk9SX05PX01FTTsKKwkJCQkJaGV2Y19wcmludChoZXZjLCBQUklOVF9GTEFHX0VSUk9SLAorCQkJCQkJIiVzWyVkXSwgc2l6ZTogJWQsIG5vIG1lbSBmYXRhbCBlcnJcbiIsCisJCQkJCQlfX2Z1bmNfXywgaSwgYnVmX3NpemUpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHJldCA+PSAwKSB7CisJCQkJaWYgKGhldmMtPmVuYWJsZV9mZW5jZSkgeworCQkJCQl2ZGVjX2ZlbmNlX2J1ZmZlcl9jb3VudF9pbmNyZWFzZSgodWxvbmcpdmRlYy0+c3luYyk7CisJCQkJCUlOSVRfTElTVF9IRUFEKCZ2ZGVjLT5zeW5jLT5yZWxlYXNlX2NhbGxiYWNrW1ZGX0JVRkZFUl9JRFgoaSldLm5vZGUpOworCQkJCQlkZWNvZGVyX2JtbXVfYm94X2FkZF9jYWxsYmFja19mdW5jKGhldmMtPmJtbXVfYm94LCBWRl9CVUZGRVJfSURYKGkpLCAodm9pZCAqKSZ2ZGVjLT5zeW5jLT5yZWxlYXNlX2NhbGxiYWNrW1ZGX0JVRkZFUl9JRFgoaSldKTsKKwkJCQl9CisJCQkJaGV2Yy0+bV9CVUZbaV0uc2l6ZSA9IGJ1Zl9zaXplOworCQkJCWhldmMtPm1fQlVGW2ldLnVzZWRfZmxhZyA9IDA7CisJCQkJcmV0ID0gMDsKKworCQkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikgeworCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCSJCdWZmZXIgJWQ6IHN0YXJ0X2FkciAlcCBzaXplICV4XG4iLAorCQkJCQlpLAorCQkJCQkodm9pZCAqKWhldmMtPm1fQlVGW2ldLnN0YXJ0X2FkciwKKwkJCQkJaGV2Yy0+bV9CVUZbaV0uc2l6ZSk7CisJCQkJfQorCQkJCS8qZmx1c2ggdGhlIGJ1ZmZlciBtYWtlIHN1cmUgbm8gY2FjaGUgZGlydHkqLworCQkJCWlmICghdmRlY19zZWN1cmUoaHdfdG9fdmRlYyhoZXZjKSkgJiYgKGhldmMtPm1fQlVGW2ldLnN0YXJ0X2FkcikpIHsKKwkJCQkJdm9pZCAqbWVtX3N0YXJ0X3ZpcnQ7CisJCQkJCW1lbV9zdGFydF92aXJ0ID0KKwkJCQkJY29kZWNfbW1fcGh5c190b192aXJ0KGhldmMtPm1fQlVGW2ldLnN0YXJ0X2Fkcik7CisJCQkJCWlmIChtZW1fc3RhcnRfdmlydCkgeworCQkJCQkJbWVtc2V0KG1lbV9zdGFydF92aXJ0LCAwLCBoZXZjLT5tX0JVRltpXS5zaXplKTsKKwkJCQkJCWNvZGVjX21tX2RtYV9mbHVzaChtZW1fc3RhcnRfdmlydCwKKwkJCQkJCWhldmMtPm1fQlVGW2ldLnNpemUsIERNQV9UT19ERVZJQ0UpOworCQkJCQl9IGVsc2UgeworCQkJCQkJY29kZWNfbW1fbWVtc2V0KGhldmMtPm1fQlVGW2ldLnN0YXJ0X2FkciwKKwkJCQkJCQkwLCBoZXZjLT5tX0JVRltpXS5zaXplKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCS8qcHV0X2NtYV9hbGxvY19yZWYoKTsqLyAvKkRFQlVHX1RNUCovCisJCX0gZWxzZQorCQkJcmV0ID0gMDsKKwl9CisKKwlpZiAocmV0ID49IDApIHsKKwkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKSB7CisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiYWxsb2MgYnVmKCVkKSBmb3IgJWQvJWQgc2l6ZSAweCV4KSA9PiAlcFxuIiwKKwkJCWksIGhldmMtPnBpY193LCBoZXZjLT5waWNfaCwKKwkJCWJ1Zl9zaXplLAorCQkJaGV2Yy0+bV9CVUZbaV0uc3RhcnRfYWRyKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikgeworCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJImFsbG9jIGJ1ZiglZCkgZm9yICVkLyVkIHNpemUgMHgleCkgPT4gRmFpbCEhIVxuIiwKKwkJCWksIGhldmMtPnBpY193LCBoZXZjLT5waWNfaCwKKwkJCWJ1Zl9zaXplKTsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzZXRfYnVmX3VudXNlZChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLCBpbnQgaSkKK3sKKwlpZiAoaSA+PSAwICYmIGkgPCBCVUZfUE9PTF9TSVpFKQorCQloZXZjLT5tX0JVRltpXS51c2VkX2ZsYWcgPSAwOworfQorCitzdGF0aWMgdm9pZCBkZWFsbG9jX3VudXNlZF9idWYoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQlVGX1BPT0xfU0laRTsgaSsrKSB7CisJCWlmIChoZXZjLT5tX0JVRltpXS5zdGFydF9hZHIgJiYKKwkJCWhldmMtPm1fQlVGW2ldLnVzZWRfZmxhZyA9PSAwKSB7CisJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1IpIHsKKwkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCSJkZWFsbG9jIGJ1ZiglZCkgYWRyIDB4JXAgc2l6ZSAweCV4XG4iLAorCQkJCQlpLCBoZXZjLT5tX0JVRltpXS5zdGFydF9hZHIsCisJCQkJCWhldmMtPm1fQlVGW2ldLnNpemUpOworCQkJfQorCQkJaWYgKCFoZXZjLT5pc191c2VkX3Y0bCkKKwkJCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWVfaWR4KAorCQkJCQloZXZjLT5ibW11X2JveCwKKwkJCQkJVkZfQlVGRkVSX0lEWChpKSk7CisJCQloZXZjLT5tX0JVRltpXS5zdGFydF9hZHIgPSAwOworCQkJaGV2Yy0+bV9CVUZbaV0uaGVhZGVyX2FkZHIgPSAwOworCQkJaGV2Yy0+bV9CVUZbaV0uc2l6ZSA9IDA7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRlYWxsb2NfcGljX2J1ZihzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCXN0cnVjdCBQSUNfcyAqcGljKQoreworCWludCBpID0gcGljLT5CVUZfaW5kZXg7CisJcGljLT5CVUZfaW5kZXggPSAtMTsKKwlpZiAoaSA+PSAwICYmCisJCWkgPCBCVUZfUE9PTF9TSVpFICYmCisJCWhldmMtPm1fQlVGW2ldLnN0YXJ0X2FkcikgeworCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1IpIHsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkiZGVhbGxvYyBidWYoJWQpIGFkciAweCVwIHNpemUgMHgleFxuIiwKKwkJCQlpLCBoZXZjLT5tX0JVRltpXS5zdGFydF9hZHIsCisJCQkJaGV2Yy0+bV9CVUZbaV0uc2l6ZSk7CisJCX0KKworCQlpZiAoIWhldmMtPmlzX3VzZWRfdjRsKQorCQkJZGVjb2Rlcl9ibW11X2JveF9mcmVlX2lkeCgKKwkJCQloZXZjLT5ibW11X2JveCwKKwkJCQlWRl9CVUZGRVJfSURYKGkpKTsKKwkJaGV2Yy0+bV9CVUZbaV0udXNlZF9mbGFnID0gMDsKKwkJaGV2Yy0+bV9CVUZbaV0uc3RhcnRfYWRyID0gMDsKKwkJaGV2Yy0+bV9CVUZbaV0uaGVhZGVyX2FkZHIgPSAwOworCQloZXZjLT5tX0JVRltpXS5zaXplID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3dvcmtfcGljX251bShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWludCB1c2VkX2J1Zl9udW0gPSAwOworCWludCBzcHNfcGljX2J1Zl9kaWZmID0gMDsKKworCWlmIChnZXRfZHluYW1pY19idWZfbnVtX21hcmdpbihoZXZjKSA+IDApIHsKKwkJaWYgKCghaGV2Yy0+c3BzX251bV9yZW9yZGVyX3BpY3NfMCkgJiYKKwkJCShoZXZjLT5wYXJhbS5wLnNwc19tYXhfZGVjX3BpY19idWZmZXJpbmdfbWludXMxXzApKSB7CisJCQkvKiB0aGUgcmFuZ2Ugb2Ygc3BzX251bV9yZW9yZGVyX3BpY3NfMCBpcyBpbgorCQkJICBbMCwgc3BzX21heF9kZWNfcGljX2J1ZmZlcmluZ19taW51czFfMF0gKi8KKwkJCXVzZWRfYnVmX251bSA9IGdldF9keW5hbWljX2J1Zl9udW1fbWFyZ2luKGhldmMpICsKKwkJCQloZXZjLT5wYXJhbS5wLnNwc19tYXhfZGVjX3BpY19idWZmZXJpbmdfbWludXMxXzA7CisJCX0gZWxzZQorCQkJdXNlZF9idWZfbnVtID0gaGV2Yy0+c3BzX251bV9yZW9yZGVyX3BpY3NfMAorCQkJCSsgZ2V0X2R5bmFtaWNfYnVmX251bV9tYXJnaW4oaGV2Yyk7CisKKwkJc3BzX3BpY19idWZfZGlmZiA9IGhldmMtPnBhcmFtLnAuc3BzX21heF9kZWNfcGljX2J1ZmZlcmluZ19taW51czFfMAorCQkJCQktIGhldmMtPnNwc19udW1fcmVvcmRlcl9waWNzXzA7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQkvKgorCQluZWVkIG9uZSBtb3JlIGZvciBtdWx0aSBpbnN0YW5jZSwgYXMKKwkJYXBwbHlfcmVmX3BpY19zZXQoKSBoYXMgbm8gY2hhbmNoIHRvIHJ1biB0bworCQl0byBjbGVhciByZWZlcmVuY2VkIGZsYWcgaW4gc29tZSBjYXNlCisJCSovCisJCWlmIChoZXZjLT5tX2luc19mbGFnKQorCQkJdXNlZF9idWZfbnVtKys7CisjZW5kaWYKKwl9IGVsc2UKKwkJdXNlZF9idWZfbnVtID0gbWF4X2J1Zl9udW07CisKKwlpZiAoaGV2Yy0+c2F2ZV9idWZmZXJfbW9kZSkKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkic2F2ZSBidWYgX21vZGUgOiBkeW5hbWljX2J1Zl9udW1fbWFyZ2luICVkIC0tLS0+ICVkIFxuIiwKKwkJCQlkeW5hbWljX2J1Zl9udW1fbWFyZ2luLCAgaGV2Yy0+ZHluYW1pY19idWZfbnVtX21hcmdpbik7CisKKwlpZiAoc3BzX3BpY19idWZfZGlmZiA+PSAzKQorCQl1c2VkX2J1Zl9udW0gKz0gc3BzX3BpY19idWZfZGlmZjsKKworCWlmIChoZXZjLT5pc191c2VkX3Y0bCkgeworCQkvKiBmb3IgZW9zIGFkZCBtb3JlIGJ1ZmZlciB0byBmbHVzaC4qLworCQl1c2VkX2J1Zl9udW0rKzsKKwl9CisKKwlpZiAodXNlZF9idWZfbnVtID4gTUFYX0JVRl9OVU0pCisJCXVzZWRfYnVmX251bSA9IE1BWF9CVUZfTlVNOworCXJldHVybiB1c2VkX2J1Zl9udW07Cit9CisKK3N0YXRpYyBpbnQgdjRsX3BhcnNlcl93b3JrX3BpY19udW0oc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwlpbnQgdXNlZF9idWZfbnVtID0gMDsKKwlpbnQgc3BzX3BpY19idWZfZGlmZiA9IDA7CisJcHJfZGVidWcoIm1hcmdpbiA9ICVkLCBzcHNfbWF4X2RlY19waWNfYnVmZmVyaW5nX21pbnVzMV8wID0gJWQsICBzcHNfbnVtX3Jlb3JkZXJfcGljc18wID0gJWRcbiIsCisJCWdldF9keW5hbWljX2J1Zl9udW1fbWFyZ2luKGhldmMpLAorCQloZXZjLT5wYXJhbS5wLnNwc19tYXhfZGVjX3BpY19idWZmZXJpbmdfbWludXMxXzAsCisJCWhldmMtPnBhcmFtLnAuc3BzX251bV9yZW9yZGVyX3BpY3NfMCk7CisJaWYgKGdldF9keW5hbWljX2J1Zl9udW1fbWFyZ2luKGhldmMpID4gMCkgeworCQlpZiAoKCFoZXZjLT5wYXJhbS5wLnNwc19udW1fcmVvcmRlcl9waWNzXzApICYmCisJCQkoaGV2Yy0+cGFyYW0ucC5zcHNfbWF4X2RlY19waWNfYnVmZmVyaW5nX21pbnVzMV8wKSkgeworCQkJLyogdGhlIHJhbmdlIG9mIHNwc19udW1fcmVvcmRlcl9waWNzXzAgaXMgaW4KKwkJCVswLCBzcHNfbWF4X2RlY19waWNfYnVmZmVyaW5nX21pbnVzMV8wXSAqLworCQkJdXNlZF9idWZfbnVtID0gZ2V0X2R5bmFtaWNfYnVmX251bV9tYXJnaW4oaGV2YykgKworCQkJCQkJaGV2Yy0+cGFyYW0ucC5zcHNfbWF4X2RlY19waWNfYnVmZmVyaW5nX21pbnVzMV8wOworCQl9IGVsc2UKKwkJCXVzZWRfYnVmX251bSA9IGhldmMtPnBhcmFtLnAuc3BzX251bV9yZW9yZGVyX3BpY3NfMAorCQkJCQkJKyBnZXRfZHluYW1pY19idWZfbnVtX21hcmdpbihoZXZjKTsKKworCQlzcHNfcGljX2J1Zl9kaWZmID0gaGV2Yy0+cGFyYW0ucC5zcHNfbWF4X2RlY19waWNfYnVmZmVyaW5nX21pbnVzMV8wCisJCQkJCQktIGhldmMtPnBhcmFtLnAuc3BzX251bV9yZW9yZGVyX3BpY3NfMDsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCS8qCisJCW5lZWQgb25lIG1vcmUgZm9yIG11bHRpIGluc3RhbmNlLCBhcworCQlhcHBseV9yZWZfcGljX3NldCgpIGhhcyBubyBjaGFuY2ggdG8gcnVuIHRvCisJCXRvIGNsZWFyIHJlZmVyZW5jZWQgZmxhZyBpbiBzb21lIGNhc2UKKwkJKi8KKwkJaWYgKGhldmMtPm1faW5zX2ZsYWcpCisJCQl1c2VkX2J1Zl9udW0rKzsKKyNlbmRpZgorCX0gZWxzZQorCQl1c2VkX2J1Zl9udW0gPSBtYXhfYnVmX251bTsKKworCWlmIChoZXZjLT5zYXZlX2J1ZmZlcl9tb2RlKQorCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkic2F2ZSBidWYgX21vZGUgOiBkeW5hbWljX2J1Zl9udW1fbWFyZ2luICVkIC0tLS0+ICVkIFxuIiwKKwkJCWR5bmFtaWNfYnVmX251bV9tYXJnaW4sICBoZXZjLT5keW5hbWljX2J1Zl9udW1fbWFyZ2luKTsKKworCWlmIChzcHNfcGljX2J1Zl9kaWZmID49IDMpCisJCXVzZWRfYnVmX251bSArPSBzcHNfcGljX2J1Zl9kaWZmOworCisJLyogZm9yIGVvcyBhZGQgbW9yZSBidWZmZXIgdG8gZmx1c2guKi8KKwl1c2VkX2J1Zl9udW0rKzsKKworCWlmICh1c2VkX2J1Zl9udW0gPiBNQVhfQlVGX05VTSkKKwkJdXNlZF9idWZfbnVtID0gTUFYX0JVRl9OVU07CisJcmV0dXJuIHVzZWRfYnVmX251bTsKK30KKworCitzdGF0aWMgaW50IGdldF9hbGxvY19waWNfY291bnQoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwlpbnQgYWxsb2NfcGljX2NvdW50ID0gMDsKKwlpbnQgaTsKKwlzdHJ1Y3QgUElDX3MgKnBpYzsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9QSUNfTlVNOyBpKyspIHsKKwkJcGljID0gaGV2Yy0+bV9QSUNbaV07CisJCWlmIChwaWMgJiYgcGljLT5pbmRleCA+PSAwKQorCQkJYWxsb2NfcGljX2NvdW50Kys7CisJfQorCXJldHVybiBhbGxvY19waWNfY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgdjRsX2NvbmZpZ19waWMoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Yywgc3RydWN0IFBJQ19zICpwaWMpCit7CisJaW50IGkgPSBwaWMtPmluZGV4OworCWludCBkd19tb2RlID0gZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGhldmMpOworCisJaWYgKGhldmMtPm1tdV9lbmFibGUpCisJCXBpYy0+aGVhZGVyX2FkciA9IGhldmMtPm1fQlVGW2ldLmhlYWRlcl9hZGRyOworCisJcGljLT5CVUZfaW5kZXgJCT0gaTsKKwlwaWMtPlBPQwkJPSBJTlZBTElEX1BPQzsKKwlwaWMtPm1jX2NhbnZhc195CT0gcGljLT5pbmRleDsKKwlwaWMtPm1jX2NhbnZhc191X3YJPSBwaWMtPmluZGV4OworCisJaWYgKGR3X21vZGUgJiAweDEwKSB7CisJCXBpYy0+bWNfY2FudmFzX3kgPSAocGljLT5pbmRleCA8PCAxKTsKKwkJcGljLT5tY19jYW52YXNfdV92ID0gKHBpYy0+aW5kZXggPDwgMSkgKyAxOworCQlwaWMtPm1jX3lfYWRyID0gcGljLT5kd195X2FkcjsKKwkJcGljLT5tY191X3ZfYWRyID0gcGljLT5kd191X3ZfYWRyOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19waWMoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Yywgc3RydWN0IFBJQ19zICpwaWMpCit7CisJaW50IHJldCA9IC0xOworCWludCBpOworCS8qaW50IGxjdV9zaXplX2xvZzIgPSBoZXZjLT5sY3Vfc2l6ZV9sb2cyOworCWludCBNVl9NRU1fVU5JVD1sY3Vfc2l6ZV9sb2cyPT0KKwkJNiA/IDB4MTAwIDogbGN1X3NpemVfbG9nMj09NSA/IDB4NDAgOiAweDEwOyovCisJLyppbnQgTVZfTUVNX1VOSVQgPSBsY3Vfc2l6ZV9sb2cyID09IDYgPyAweDIwMCA6IGxjdV9zaXplX2xvZzIgPT0KKwkJCQkJIDUgPyAweDgwIDogMHgyMDsKKwlpbnQgbXByZWRfbXZfZW5kID0gaGV2Yy0+d29ya19zcGFjZV9idWYtPm1wcmVkX212LmJ1Zl9zdGFydCArCisJCQkJIGhldmMtPndvcmtfc3BhY2VfYnVmLT5tcHJlZF9tdi5idWZfc2l6ZTsqLworCXVuc2lnbmVkIGludCB5X2FkciA9IDA7CisJc3RydWN0IGJ1Zl9zdHJ1X3MgYnVmX3N0cnU7CisJaW50IGJ1Zl9zaXplID0gY2FsX2N1cnJlbnRfYnVmX3NpemUoaGV2YywgJmJ1Zl9zdHJ1KTsKKwlpbnQgZHdfbW9kZSA9IGdldF9kb3VibGVfd3JpdGVfbW9kZShoZXZjKTsKKworCWZvciAoaSA9IDA7IGkgPCBCVUZfUE9PTF9TSVpFOyBpKyspIHsKKwkJaWYgKGhldmMtPm1fQlVGW2ldLnN0YXJ0X2FkciAhPSAwICYmCisJCQloZXZjLT5tX0JVRltpXS51c2VkX2ZsYWcgPT0gMCAmJgorCQkJYnVmX3NpemUgPD0gaGV2Yy0+bV9CVUZbaV0uc2l6ZSkgeworCQkJaGV2Yy0+bV9CVUZbaV0udXNlZF9mbGFnID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGkgPj0gQlVGX1BPT0xfU0laRSkKKwkJcmV0dXJuIC0xOworCisJaWYgKGhldmMtPm1tdV9lbmFibGUpIHsKKwkJcGljLT5oZWFkZXJfYWRyID0gaGV2Yy0+bV9CVUZbaV0uc3RhcnRfYWRyOworCQl5X2FkciA9IGhldmMtPm1fQlVGW2ldLnN0YXJ0X2FkciArCisJCQloZXZjX2dldF9oZWFkZXJfc2l6ZShoZXZjLT5waWNfdywgaGV2Yy0+cGljX2gpOworCX0gZWxzZQorCQl5X2FkciA9IGhldmMtPm1fQlVGW2ldLnN0YXJ0X2FkcjsKKworCXlfYWRyID0gKCh5X2FkciArIDB4ZmZmZikgPj4gMTYpIDw8IDE2OyAvKjY0ayBhbGlnbm1lbnQqLworCisjaWZkZWYgSDI2NV8xMEJfTU1VX0RXCisJaWYgKGhldmMtPmR3X21tdV9lbmFibGUpIHsKKyNpZmRlZiBVU0VfRklYRURfTU1VX0RXX0hFQURFUgorCQlwaWMtPmhlYWRlcl9kd19hZHIgPSBoZXZjLT53b3JrX3NwYWNlX2J1Zi0+Y21faGVhZGVyX2R3LmJ1Zl9zdGFydCArCisJCQkoaSAqIGhldmNfZ2V0X2hlYWRlcl9zaXplKGhldmMtPnBpY193LCBoZXZjLT5waWNfaCkpOworI2Vsc2UKKwkJcGljLT5oZWFkZXJfZHdfYWRyID0geV9hZHI7CisJCXlfYWRyID0gcGljLT5oZWFkZXJfZHdfYWRyICsKKwkJCWhldmNfZ2V0X2hlYWRlcl9zaXplKGhldmMtPnBpY193LCBoZXZjLT5waWNfaCk7CisjZW5kaWYKKwkJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX0JVRk1HUiwKKwkJCSJNTVUgaGVhZGVyX2R3X2FkciAlZDogJXhcbiIsIHBpYy0+aGVhZGVyX2R3X2Fkcik7CisJfQorI2VuZGlmCisKKwlwaWMtPlBPQyA9IElOVkFMSURfUE9DOworCS8qZW5zdXJlIGdldF9waWNfYnlfUE9DKCkKKwlub3QgZ2V0IHRoZSBidWZmZXIgbm90IGRlY29kZWQqLworCXBpYy0+QlVGX2luZGV4ID0gaTsKKworCWlmICgoIWhldmMtPm1tdV9lbmFibGUpICYmCisJCSgoZHdfbW9kZSAmIDB4MTApID09IDApKSB7CisJCXBpYy0+bWNfeV9hZHIgPSB5X2FkcjsKKwkJeV9hZHIgKz0gKGJ1Zl9zdHJ1Lm1jX2J1ZmZlcl9zaXplX2ggPDwgMTYpOworCX0KKwlwaWMtPm1jX2NhbnZhc195ID0gcGljLT5pbmRleDsKKwlwaWMtPm1jX2NhbnZhc191X3YgPSBwaWMtPmluZGV4OworCWlmIChkd19tb2RlICYgMHgxMCkgeworCQlwaWMtPm1jX3lfYWRyID0geV9hZHI7CisJCXBpYy0+bWNfdV92X2FkciA9IHlfYWRyICsKKwkJCSgoYnVmX3N0cnUubWNfYnVmZmVyX3NpemVfdV92X2ggPDwgMTYpIDw8IDEpOworCQlwaWMtPm1jX2NhbnZhc195ID0gKHBpYy0+aW5kZXggPDwgMSk7CisJCXBpYy0+bWNfY2FudmFzX3VfdiA9IChwaWMtPmluZGV4IDw8IDEpICsgMTsKKworCQlwaWMtPmR3X3lfYWRyID0gcGljLT5tY195X2FkcjsKKwkJcGljLT5kd191X3ZfYWRyID0gcGljLT5tY191X3ZfYWRyOworCX0gZWxzZSBpZiAoZHdfbW9kZSAmJiAoZHdfbW9kZSAmIDB4MjApID09IDApIHsKKwkJcGljLT5kd195X2FkciA9IHlfYWRyOworCQlwaWMtPmR3X3Vfdl9hZHIgPSBwaWMtPmR3X3lfYWRyICsKKwkJCSgoYnVmX3N0cnUubWNfYnVmZmVyX3NpemVfdV92X2ggPDwgMTYpIDw8IDEpOworCX0KKworCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikgeworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCSIlcyBpbmRleCAlZCBCVUZfaW5kZXggJWQgbWNfeV9hZHIgJXhcbiIsCisJCSBfX2Z1bmNfXywgcGljLT5pbmRleCwKKwkJIHBpYy0+QlVGX2luZGV4LCBwaWMtPm1jX3lfYWRyKTsKKwkJaWYgKGhldmMtPm1tdV9lbmFibGUgJiYgZHdfbW9kZSkKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJtbXUgZG91YmxlIHdyaXRlICBhZHIgJWxkXG4iLAorCQkJIHBpYy0+Y21hX2FsbG9jX2FkZHIpOworCX0KKwlyZXQgPSAwOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaW5pdF9waWNfbGlzdChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWludCBpOworCWludCBpbml0X2J1Zl9udW0gPSBnZXRfd29ya19waWNfbnVtKGhldmMpOworCWludCBkd19tb2RlID0gZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGhldmMpOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGhldmMpOworCS8qYWxsb2MgZGVjb2RlciBidWYgd2lsbCBiZSBkZWxheSBpZiB3b3JrIG9uIHY0bC4gKi8KKwlpZiAoIWhldmMtPmlzX3VzZWRfdjRsKSB7CisJCWZvciAoaSA9IDA7IGkgPCBpbml0X2J1Zl9udW07IGkrKykgeworCQkJaWYgKGFsbG9jX2J1ZihoZXZjKSA8IDApIHsKKwkJCQlpZiAoaSA8PSA4KSB7CisJCQkJCS8qaWYgYWxsb2NlZCAoaSsxKT49OQorCQkJCQlkb24ndCBzZW5kIGVycm9ycy4qLworCQkJCQloZXZjLT5mYXRhbF9lcnJvciB8PQorCQkJCQlERUNPREVSX0ZBVEFMX0VSUk9SX05PX01FTTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5pdF9idWZfbnVtOyBpKyspIHsKKwkJc3RydWN0IFBJQ19zICpwaWMgPSBoZXZjLT5tX1BJQ1tpXTsKKworCQlpZiAoIXBpYykgeworCQkJcGljID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IFBJQ19zKSk7CisJCQlpZiAocGljID09IE5VTEwpIHsKKwkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCSIlczogYWxsb2MgcGljICVkIGZhaWwhISFcbiIsCisJCQkJCV9fZnVuY19fLCBpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWhldmMtPm1fUElDW2ldID0gcGljOworCQl9CisJCW1lbXNldChwaWMsIDAsIHNpemVvZihzdHJ1Y3QgUElDX3MpKTsKKworCQlwaWMtPmluZGV4ID0gaTsKKwkJcGljLT5CVUZfaW5kZXggPSAtMTsKKwkJcGljLT5tdl9idWZfaW5kZXggPSAtMTsKKwkJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCQlwaWMtPnlfY2FudmFzX2luZGV4ID0gLTE7CisJCQlwaWMtPnV2X2NhbnZhc19pbmRleCA9IC0xOworCQl9CisKKwkJcGljLT53aWR0aCA9IGhldmMtPnBpY193OworCQlwaWMtPmhlaWdodCA9IGhldmMtPnBpY19oOworCQlwaWMtPmRvdWJsZV93cml0ZV9tb2RlID0gZHdfbW9kZTsKKwkJcGljLT5QT0MgPSBJTlZBTElEX1BPQzsKKworCQkvKmNvbmZpZyBjYW52YXMgd2lsbCBiZSBkZWxheSBpZiB3b3JrIG9uIHY0bC4gKi8KKwkJaWYgKCFoZXZjLT5pc191c2VkX3Y0bCkgeworCQkJaWYgKGNvbmZpZ19waWMoaGV2YywgcGljKSA8IDApIHsKKwkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpKQorCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCQkiQ29uZmlnX3BpYyAlZCBmYWlsXG4iLCBwaWMtPmluZGV4KTsKKwkJCQlwaWMtPmluZGV4ID0gLTE7CisJCQkJaSsrOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAocGljLT5kb3VibGVfd3JpdGVfbW9kZSkKKwkJCQlzZXRfY2FudmFzKGhldmMsIHBpYyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVuaW5pdF9waWNfbGlzdChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGhldmMpOworCWludCBpOworI2lmbmRlZiBNVl9VU0VfRklYRURfQlVGCisJZGVhbGxvY19tdl9idWZzKGhldmMpOworI2VuZGlmCisJZm9yIChpID0gMDsgaSA8IE1BWF9SRUZfUElDX05VTTsgaSsrKSB7CisJCXN0cnVjdCBQSUNfcyAqcGljID0gaGV2Yy0+bV9QSUNbaV07CisKKwkJaWYgKHBpYykgeworCQkJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCQkJdmRlYy0+ZnJlZV9jYW52YXNfZXgocGljLT55X2NhbnZhc19pbmRleCwgdmRlYy0+aWQpOworCQkJCXZkZWMtPmZyZWVfY2FudmFzX2V4KHBpYy0+dXZfY2FudmFzX2luZGV4LCB2ZGVjLT5pZCk7CisJCQl9CisJCQlyZWxlYXNlX2F1eF9kYXRhKGhldmMsIHBpYyk7CisJCQl2ZnJlZShwaWMpOworCQkJaGV2Yy0+bV9QSUNbaV0gPSBOVUxMOworCQl9CisJfQorfQorCisjaWZkZWYgTE9TTEVTU19DT01QUkVTU19NT0RFCitzdGF0aWMgdm9pZCBpbml0X2RlY29kZV9oZWFkX2h3KHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisKKwlzdHJ1Y3QgQnVmZkluZm9fcyAqYnVmX3NwZWMgPSBoZXZjLT53b3JrX3NwYWNlX2J1ZjsKKwl1bnNpZ25lZCBpbnQgZGF0YTMyOworCisJaW50IGxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSA9CisJCWNvbXB1dGVfbG9zbGVzc19jb21wX2hlYWRlcl9zaXplKGhldmMtPnBpY193LAorCQkJIGhldmMtPnBpY19oKTsKKwlpbnQgbG9zbGVzc19jb21wX2JvZHlfc2l6ZSA9IGNvbXB1dGVfbG9zbGVzc19jb21wX2JvZHlfc2l6ZShoZXZjLAorCQloZXZjLT5waWNfdywgaGV2Yy0+cGljX2gsIGhldmMtPm1lbV9zYXZpbmdfbW9kZSk7CisKKwloZXZjLT5sb3NsZXNzX2NvbXBfYm9keV9zaXplID0gbG9zbGVzc19jb21wX2JvZHlfc2l6ZTsKKworCisJaWYgKGhldmMtPm1tdV9lbmFibGUpIHsKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDEsICgweDEgPDwgNCkpOworCQlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMiwgMHgwKTsKKwl9IGVsc2UgeworCWlmIChoZXZjLT5tZW1fc2F2aW5nX21vZGUgPT0gMSkKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDEsCisJCQkoMSA8PCAzKSB8ICgod29ya2Fyb3VuZF9lbmFibGUgJiAyKSA/IDEgOiAwKSk7CisJZWxzZQorCQlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMSwKKwkJCSgod29ya2Fyb3VuZF9lbmFibGUgJiAyKSA/IDEgOiAwKSk7CisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDIsIChsb3NsZXNzX2NvbXBfYm9keV9zaXplID4+IDUpKTsKKwkvKgorCSAqV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDMsKDB4ZmY8PDIwKSB8ICgweGZmPDwxMCkgfCAweGZmKTsKKwkgKgkvLzgtYml0IG1vZGUKKwkgKi8KKwl9CisJV1JJVEVfVlJFRyhIRVZDX0NNX0JPRFlfTEVOR1RILCBsb3NsZXNzX2NvbXBfYm9keV9zaXplKTsKKwlXUklURV9WUkVHKEhFVkNfQ01fSEVBREVSX09GRlNFVCwgbG9zbGVzc19jb21wX2JvZHlfc2l6ZSk7CisJV1JJVEVfVlJFRyhIRVZDX0NNX0hFQURFUl9MRU5HVEgsIGxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSk7CisKKwlpZiAoaGV2Yy0+bW11X2VuYWJsZSkgeworCQlXUklURV9WUkVHKEhFVkNfU0FPX01NVV9WSDBfQUREUiwgYnVmX3NwZWMtPm1tdV92YmguYnVmX3N0YXJ0KTsKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19NTVVfVkgxX0FERFIsCisJCQlidWZfc3BlYy0+bW11X3ZiaC5idWZfc3RhcnQgKworCQkJVkJIX0JVRl9TSVpFKGJ1Zl9zcGVjKSk7CisJCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMOSk7CisJCWRhdGEzMiB8PSAweDE7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDksIGRhdGEzMik7CisKKwkJLyogdXNlIEhFVkNfQ01fSEVBREVSX1NUQVJUX0FERFIgKi8KKwkJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkw1KTsKKwkJZGF0YTMyIHw9ICgxPDwxMCk7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDUsIGRhdGEzMik7CisJfQorI2lmZGVmIEgyNjVfMTBCX01NVV9EVworCWlmIChoZXZjLT5kd19tbXVfZW5hYmxlKSB7CisJCXUzMiBkYXRhX3RtcDsKKwkJZGF0YV90bXAgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDkpOworCQlkYXRhX3RtcCB8PSAoMSA8PCAxMCk7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDksIGRhdGFfdG1wKTsKKworCQlXUklURV9WUkVHKEhFVkNfQ01fQk9EWV9MRU5HVEgyLAorCQkJbG9zbGVzc19jb21wX2JvZHlfc2l6ZSk7CisJCVdSSVRFX1ZSRUcoSEVWQ19DTV9IRUFERVJfT0ZGU0VUMiwKKwkJCWxvc2xlc3NfY29tcF9ib2R5X3NpemUpOworCQlXUklURV9WUkVHKEhFVkNfQ01fSEVBREVSX0xFTkdUSDIsCisJCQlsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUpOworCisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fTU1VX1ZIMF9BRERSMiwKKwkJCWJ1Zl9zcGVjLT5tbXVfdmJoX2R3LmJ1Zl9zdGFydCk7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fTU1VX1ZIMV9BRERSMiwKKwkJCWJ1Zl9zcGVjLT5tbXVfdmJoX2R3LmJ1Zl9zdGFydCArIERXX1ZCSF9CVUZfU0laRShidWZfc3BlYykpOworCQlXUklURV9WUkVHKEhFVkNfRFdfVkgwX0FERERSLAorCQkJYnVmX3NwZWMtPm1tdV92YmhfZHcuYnVmX3N0YXJ0ICsgKDIgKiBEV19WQkhfQlVGX1NJWkUoYnVmX3NwZWMpKSk7CisJCVdSSVRFX1ZSRUcoSEVWQ19EV19WSDFfQURERFIsCisJCQlidWZfc3BlYy0+bW11X3ZiaF9kdy5idWZfc3RhcnQgKyAoMyAqIERXX1ZCSF9CVUZfU0laRShidWZfc3BlYykpKTsKKwkJLyogdXNlIEhFVkNfQ01fSEVBREVSX1NUQVJUX0FERFIgKi8KKwkJZGF0YTMyIHw9ICgxIDw8IDE1KTsKKwl9IGVsc2UKKwkJZGF0YTMyICY9IH4oMSA8PCAxNSk7CisJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMNSwgZGF0YTMyKTsKKyNlbmRpZgorCWlmICghaGV2Yy0+bV9pbnNfZmxhZykKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJIiVzOiAoJWQsICVkKSBib2R5X3NpemUgMHgleCBoZWFkZXJfc2l6ZSAweCV4XG4iLAorCQkJX19mdW5jX18sIGhldmMtPnBpY193LCBoZXZjLT5waWNfaCwKKwkJCWxvc2xlc3NfY29tcF9ib2R5X3NpemUsIGxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSk7CisKK30KKyNlbmRpZgorI2RlZmluZSBIRVZDRF9NUFBfQU5DMkFYSV9UQkxfREFUQSAgICAgICAgICAgICAgICAgMHgzNDY0CisKK3N0YXRpYyB2b2lkIGluaXRfcGljX2xpc3RfaHcoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwlpbnQgaTsKKwlpbnQgY3VyX3BpY19udW0gPSBNQVhfUkVGX1BJQ19OVU07CisJaW50IGR3X21vZGUgPSBnZXRfZG91YmxlX3dyaXRlX21vZGUoaGV2Yyk7CisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hMKQorCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9DT05GX0FERFIsCisJCQkoMHgxIDw8IDEpIHwgKDB4MSA8PCAyKSk7CisJZWxzZQorCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9DT05GX0FERFIsIDB4MCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9QSUNfTlVNOyBpKyspIHsKKwkJaWYgKGhldmMtPm1fUElDW2ldID09IE5VTEwgfHwKKwkJCWhldmMtPm1fUElDW2ldLT5pbmRleCA9PSAtMSkgeworCQkJY3VyX3BpY19udW0gPSBpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hMKSB7CisJCQlpZiAoaGV2Yy0+bW11X2VuYWJsZSAmJiAoKGR3X21vZGUgJiAweDEwKSA9PSAwKSkKKwkJCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9EQVRBLAorCQkJCQloZXZjLT5tX1BJQ1tpXS0+aGVhZGVyX2Fkcj4+NSk7CisJCQllbHNlCisJCQkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DMkFYSV9UQkxfREFUQSwKKwkJCQkJaGV2Yy0+bV9QSUNbaV0tPm1jX3lfYWRyID4+IDUpOworCQl9IGVsc2UKKwkJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0NNRF9BRERSLAorCQkJCWhldmMtPm1fUElDW2ldLT5tY195X2FkciB8CisJCQkJKGhldmMtPm1fUElDW2ldLT5tY19jYW52YXNfeSA8PCA4KSB8IDB4MSk7CisJCWlmIChkd19tb2RlICYgMHgxMCkgeworCQkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hMKSB7CisJCQkJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0RBVEEsCisJCQkJCWhldmMtPm1fUElDW2ldLT5tY191X3ZfYWRyID4+IDUpOworCQkJCX0KKwkJCWVsc2UKKwkJCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9DTURfQUREUiwKKwkJCQkJaGV2Yy0+bV9QSUNbaV0tPm1jX3Vfdl9hZHIgfAorCQkJCQkoaGV2Yy0+bV9QSUNbaV0tPm1jX2NhbnZhc191X3YgPDwgOCkKKwkJCQkJfCAweDEpOworCQl9CisJfQorCWlmIChjdXJfcGljX251bSA9PSAwKQorCQlyZXR1cm47CisKKwlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9DT05GX0FERFIsIDB4MSk7CisKKwkvKiBaZXJvIG91dCBjYW52YXMgcmVnaXN0ZXJzIGluIElQUCAtLSBhdm9pZCBzaW11bGF0aW9uIFggKi8KKwlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0FDQ0NPTkZJR19BRERSLAorCQkJICAgKDAgPDwgOCkgfCAoMCA8PCAxKSB8IDEpOworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUiwgMCk7CisKKyNpZmRlZiBMT1NMRVNTX0NPTVBSRVNTX01PREUKKwlpZiAoKGR3X21vZGUgJiAweDEwKSA9PSAwKQorCQlpbml0X2RlY29kZV9oZWFkX2h3KGhldmMpOworI2VuZGlmCisKK30KKworCitzdGF0aWMgdm9pZCBkdW1wX3BpY19saXN0KHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJaW50IGk7CisJc3RydWN0IFBJQ19zICpwaWM7CisKKwloZXZjX3ByaW50KGhldmMsIDAsCisJCSJwaWNfbGlzdF9pbml0X2ZsYWcgaXMgJWRcclxuIiwgaGV2Yy0+cGljX2xpc3RfaW5pdF9mbGFnKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9QSUNfTlVNOyBpKyspIHsKKwkJcGljID0gaGV2Yy0+bV9QSUNbaV07CisJCWlmIChwaWMgPT0gTlVMTCB8fCBwaWMtPmluZGV4ID09IC0xKQorCQkJY29udGludWU7CisJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLAorCQkiaW5kZXggJWQgYnVmX2lkeCAlZCBtdl9pZHggJWQgZGVjb2RlX2lkeDolZCwJUE9DOiVkLAlyZWZlcmVuY2VkOiVkIChMVCAlZCksCSIsCisJCSBwaWMtPmluZGV4LCBwaWMtPkJVRl9pbmRleCwKKyNpZm5kZWYgTVZfVVNFX0ZJWEVEX0JVRgorCQlwaWMtPm12X2J1Zl9pbmRleCwKKyNlbHNlCisJCSAtMSwKKyNlbmRpZgorCQkgcGljLT5kZWNvZGVfaWR4LCBwaWMtPlBPQywgcGljLT5yZWZlcmVuY2VkCisjaWZkZWYgU1VQUE9SVF9MT05HX1RFUk1fUlBTCisJCSAsIHBpYy0+bG9uZ190ZXJtX3JlZgorI2Vsc2UKKwkJICwgMAorI2VuZGlmCisJCSApOworCQloZXZjX3ByaW50X2NvbnQoaGV2YywgMCwKKwkJCSJudW1fcmVvcmRlcl9waWM6JWQsIG91dHB1dF9tYXJrOiVkLCBlcnJvcl9tYXJrOiVkIHcvaCAlZCwlZCIsCisJCQkJcGljLT5udW1fcmVvcmRlcl9waWMsIHBpYy0+b3V0cHV0X21hcmssIHBpYy0+ZXJyb3JfbWFyaywKKwkJCQlwaWMtPndpZHRoLCBwaWMtPmhlaWdodCk7CisJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLAorCQkJIm91dHB1dF9yZWFkeTolZCwgbXZfd3Jfc3RhcnQgJXggdmZfcmVmICVkXG4iLAorCQkJCXBpYy0+b3V0cHV0X3JlYWR5LCBwaWMtPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIsCisJCQkJcGljLT52Zl9yZWYpOworCX0KK30KKworc3RhdGljIHZvaWQgY2xlYXJfcmVmZXJlbmNlZF9mbGFnKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJaW50IGk7CisJc3RydWN0IFBJQ19zICpwaWM7CisJZm9yIChpID0gMDsgaSA8IE1BWF9SRUZfUElDX05VTTsgaSsrKSB7CisJCXBpYyA9IGhldmMtPm1fUElDW2ldOworCQlpZiAocGljID09IE5VTEwgfHwgcGljLT5pbmRleCA9PSAtMSkKKwkJCWNvbnRpbnVlOworCQlpZiAocGljLT5yZWZlcmVuY2VkKSB7CisJCQlwaWMtPnJlZmVyZW5jZWQgPSAwOworCQkJcHV0X212X2J1ZihoZXZjLCBwaWMpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBjbGVhcl9wb2NfZmxhZyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWludCBpOworCXN0cnVjdCBQSUNfcyAqcGljOworCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVGX1BJQ19OVU07IGkrKykgeworCQlwaWMgPSBoZXZjLT5tX1BJQ1tpXTsKKwkJaWYgKHBpYyA9PSBOVUxMIHx8IHBpYy0+aW5kZXggPT0gLTEpCisJCQljb250aW51ZTsKKwkJcGljLT5QT0MgPSBJTlZBTElEX1BPQzsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgUElDX3MgKm91dHB1dF9waWMoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwkJdW5zaWduZWQgY2hhciBmbHVzaF9mbGFnKQoreworCWludCBudW1fcGljX25vdF95ZXRfZGlzcGxheSA9IDA7CisJaW50IGksIGZpc3J0X3BpY19mbGFnID0gMDsKKwlzdHJ1Y3QgUElDX3MgKnBpYzsKKwlzdHJ1Y3QgUElDX3MgKnBpY19kaXNwbGF5ID0gTlVMTDsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhoZXZjKTsKKworCWlmIChoZXZjLT5pX29ubHkgJiAweDQpIHsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9SRUZfUElDX05VTTsgaSsrKSB7CisJCQlwaWMgPSBoZXZjLT5tX1BJQ1tpXTsKKwkJCWlmIChwaWMgPT0gTlVMTCB8fAorCQkJCShwaWMtPmluZGV4ID09IC0xKSB8fAorCQkJCShwaWMtPkJVRl9pbmRleCA9PSAtMSkgfHwKKwkJCQkocGljLT5QT0MgPT0gSU5WQUxJRF9QT0MpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHBpYy0+b3V0cHV0X21hcmspIHsKKwkJCQlpZiAocGljX2Rpc3BsYXkpIHsKKwkJCQkJaWYgKHBpYy0+ZGVjb2RlX2lkeCA8CisJCQkJCQlwaWNfZGlzcGxheS0+ZGVjb2RlX2lkeCkKKwkJCQkJCXBpY19kaXNwbGF5ID0gcGljOworCisJCQkJfSBlbHNlCisJCQkJCXBpY19kaXNwbGF5ID0gcGljOworCisJCQl9CisJCX0KKwkJaWYgKHBpY19kaXNwbGF5KSB7CisJCQlwaWNfZGlzcGxheS0+b3V0cHV0X21hcmsgPSAwOworCQkJcGljX2Rpc3BsYXktPnJlY29uX21hcmsgPSAwOworCQkJcGljX2Rpc3BsYXktPm91dHB1dF9yZWFkeSA9IDE7CisJCQlwaWNfZGlzcGxheS0+cmVmZXJlbmNlZCA9IDA7CisJCQlwdXRfbXZfYnVmKGhldmMsIHBpY19kaXNwbGF5KTsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVGX1BJQ19OVU07IGkrKykgeworCQkJcGljID0gaGV2Yy0+bV9QSUNbaV07CisJCQlpZiAocGljID09IE5VTEwgfHwKKwkJCQkocGljLT5pbmRleCA9PSAtMSkgfHwKKwkJCQkocGljLT5CVUZfaW5kZXggPT0gLTEpIHx8CisJCQkJKHBpYy0+UE9DID09IElOVkFMSURfUE9DKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChwaWMtPm91dHB1dF9tYXJrKQorCQkJCW51bV9waWNfbm90X3lldF9kaXNwbGF5Kys7CisJCQlpZiAocGljLT5zbGljZV90eXBlID09IDIgJiYKKwkJCQloZXZjLT52Zl9wcmVfY291bnQgPT0gMCAmJgorCQkJCWZhc3Rfb3V0cHV0X2VuYWJsZSAmIDB4MSkgeworCQkJCS8qZmFzdCBvdXRwdXQgZm9yIGZpcnN0IEkgcGljdHVyZSovCisJCQkJcGljLT5udW1fcmVvcmRlcl9waWMgPSAwOworCQkJCWlmICh2ZGVjLT5tYXN0ZXIgfHwgdmRlYy0+c2xhdmUpCisJCQkJCXBpY19kaXNwbGF5ID0gcGljOworCQkJCWZpc3J0X3BpY19mbGFnID0gMTsKKwkJCQloZXZjX3ByaW50KGhldmMsIDAsICJWSDI2NTogb3V0cHV0IGZpcnN0IGZyYW1lXG4iKTsKKwkJCX0KKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVGX1BJQ19OVU07IGkrKykgeworCQkJcGljID0gaGV2Yy0+bV9QSUNbaV07CisJCQlpZiAocGljID09IE5VTEwgfHwKKwkJCQkocGljLT5pbmRleCA9PSAtMSkgfHwKKwkJCQkocGljLT5CVUZfaW5kZXggPT0gLTEpIHx8CisJCQkJKHBpYy0+UE9DID09IElOVkFMSURfUE9DKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChwaWMtPm91dHB1dF9tYXJrKSB7CisJCQkJaWYgKHBpY19kaXNwbGF5KSB7CisJCQkJCWlmIChwaWMtPlBPQyA8IHBpY19kaXNwbGF5LT5QT0MpCisJCQkJCQlwaWNfZGlzcGxheSA9IHBpYzsKKwkJCQkJZWxzZSBpZiAoKHBpYy0+UE9DID09IHBpY19kaXNwbGF5LT5QT0MpCisJCQkJCQkmJiAocGljLT5kZWNvZGVfaWR4IDwKKwkJCQkJCQlwaWNfZGlzcGxheS0+CisJCQkJCQkJZGVjb2RlX2lkeCkpCisJCQkJCQkJCXBpY19kaXNwbGF5CisJCQkJCQkJCT0gcGljOworCQkJCX0gZWxzZQorCQkJCQlwaWNfZGlzcGxheSA9IHBpYzsKKwkJCX0KKwkJfQorI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJCS8qIGR2IHdhaXQgY3VyX3BpYyBhbGwgZGF0YSBnZXQsCisJCXNvbWUgZGF0YSBtYXkgZ2V0IGFmdGVyIHBpY3R1cmUgb3V0cHV0ICovCisJCWlmICgodmRlYy0+bWFzdGVyIHx8IHZkZWMtPnNsYXZlKQorCQkJJiYgKHBpY19kaXNwbGF5ID09IGhldmMtPmN1cl9waWMpICYmCisJCQkoIWZsdXNoX2ZsYWcpICYmCisJCQkoaGV2Yy0+YnlwYXNzX2R2ZW5sICYmICFkb2xieV9tZXRhX3dpdGhfZWwpCisJCQkmJiAoIWZpc3J0X3BpY19mbGFnKSkKKwkJCXBpY19kaXNwbGF5ID0gTlVMTDsKKyNlbmRpZgorCQlpZiAocGljX2Rpc3BsYXkpIHsKKwkJCWlmICgobnVtX3BpY19ub3RfeWV0X2Rpc3BsYXkgPgorCQkJCXBpY19kaXNwbGF5LT5udW1fcmVvcmRlcl9waWMpCisJCQkJfHwgZmx1c2hfZmxhZykgeworCQkJCXBpY19kaXNwbGF5LT5vdXRwdXRfbWFyayA9IDA7CisJCQkJcGljX2Rpc3BsYXktPnJlY29uX21hcmsgPSAwOworCQkJCXBpY19kaXNwbGF5LT5vdXRwdXRfcmVhZHkgPSAxOworCQkJfSBlbHNlIGlmIChudW1fcGljX25vdF95ZXRfZGlzcGxheSA+PQorCQkJCShNQVhfUkVGX1BJQ19OVU0gLSAxKSkgeworCQkJCXBpY19kaXNwbGF5LT5vdXRwdXRfbWFyayA9IDA7CisJCQkJcGljX2Rpc3BsYXktPnJlY29uX21hcmsgPSAwOworCQkJCXBpY19kaXNwbGF5LT5vdXRwdXRfcmVhZHkgPSAxOworCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJIldhcm5pbmcsIG51bV9yZW9yZGVyX3BpYyAlZCBpcyBieWVvbmQgYnVmIG51bVxuIiwKKwkJCQkJcGljX2Rpc3BsYXktPm51bV9yZW9yZGVyX3BpYyk7CisJCQl9IGVsc2UKKwkJCQlwaWNfZGlzcGxheSA9IE5VTEw7CisJCX0KKwl9CisKKwlpZiAocGljX2Rpc3BsYXkgJiYgaGV2Yy0+c3BzX251bV9yZW9yZGVyX3BpY3NfMCAmJgorCQkoaGV2Yy0+dmZfcHJlX2NvdW50ID09IDEpICYmIChoZXZjLT5maXJzdF9waWNfZmxhZyA9PSAxKSkgeworCQlwaWNfZGlzcGxheSA9IE5VTEw7CisJCWhldmMtPmZpcnN0X3BpY19mbGFnID0gMjsKKwl9CisJcmV0dXJuIHBpY19kaXNwbGF5OworfQorCitzdGF0aWMgaW50IGNvbmZpZ19tY19idWZmZXIoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Yywgc3RydWN0IFBJQ19zICpjdXJfcGljKQoreworCWludCBpOworCXN0cnVjdCBQSUNfcyAqcGljOworCisJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKQorCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiY29uZmlnX21jX2J1ZmZlciBlbnRlcmVkIC4uLi4uXG4iKTsKKwlpZiAoY3VyX3BpYy0+c2xpY2VfdHlwZSAhPSAyKSB7CS8qIFAgYW5kIEIgcGljICovCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfQUNDQ09ORklHX0FERFIsCisJCQkJICAgKDAgPDwgOCkgfCAoMCA8PCAxKSB8IDEpOworCQlmb3IgKGkgPSAwOyBpIDwgY3VyX3BpYy0+UmVmTnVtX0wwOyBpKyspIHsKKwkJCXBpYyA9CisJCQkJZ2V0X3JlZl9waWNfYnlfUE9DKGhldmMsCisJCQkJCQljdXJfcGljLT4KKwkJCQkJCW1fYWlSZWZQT0NMaXN0MFtjdXJfcGljLT4KKwkJCQkJCXNsaWNlX2lkeF1baV0pOworCQkJaWYgKHBpYykgeworCQkJCWlmICgocGljLT53aWR0aCAhPSBoZXZjLT5waWNfdykgfHwKKwkJCQkJKHBpYy0+aGVpZ2h0ICE9IGhldmMtPnBpY19oKSkgeworCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCQkiJXM6IFdyb25nIHJlZmVyZW5jZSBwaWMgKHBvYyAlZCkgd2lkdGgvaGVpZ2h0ICVkLyVkXG4iLAorCQkJCQkJX19mdW5jX18sIHBpYy0+UE9DLAorCQkJCQkJcGljLT53aWR0aCwgcGljLT5oZWlnaHQpOworCQkJCQljdXJfcGljLT5lcnJvcl9tYXJrID0gMTsKKwkJCQl9CisJCQkJaWYgKHBpYy0+ZXJyb3JfbWFyayAmJiAocmVmX2ZyYW1lX21hcmtfZmxhZ1toZXZjLT5pbmRleF0pKQorCQkJCQljdXJfcGljLT5lcnJvcl9tYXJrID0gMTsKKwkJCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUiwKKwkJCQkJCShwaWMtPm1jX2NhbnZhc191X3YgPDwgMTYpCisJCQkJCQl8IChwaWMtPm1jX2NhbnZhc191X3YKKwkJCQkJCQk8PCA4KSB8CisJCQkJCQkgICBwaWMtPm1jX2NhbnZhc195KTsKKwkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1IpIHsKKwkJCQkJaGV2Y19wcmludF9jb250KGhldmMsIDAsCisJCQkJCSJyZWZpZCAleCBtY19jYW52YXNfdV92ICV4IiwKKwkJCQkJIGksIHBpYy0+bWNfY2FudmFzX3Vfdik7CisJCQkJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLAorCQkJCQkJIiBtY19jYW52YXNfeSAleFxuIiwKKwkJCQkJIHBpYy0+bWNfY2FudmFzX3kpOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCWN1cl9waWMtPmVycm9yX21hcmsgPSAxOworCisJCQlpZiAocGljID09IE5VTEwgfHwgcGljLT5lcnJvcl9tYXJrKSB7CisJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSJFcnJvciAlcywgJWR0aCBwb2MgKCVkKSAlcyIsCisJCQkJIF9fZnVuY19fLCBpLAorCQkJCSBjdXJfcGljLT5tX2FpUmVmUE9DTGlzdDBbY3VyX3BpYy0+CisJCQkJIHNsaWNlX2lkeF1baV0sCisJCQkJIHBpYyA/ICJoYXMgZXJyb3IiIDoKKwkJCQkgIm5vdCBpbiBsaXN0MCIpOworCQkJfQorCQl9CisJfQorCWlmIChjdXJfcGljLT5zbGljZV90eXBlID09IDApIHsJLyogQiBwaWMgKi8KKwkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKQorCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSJjb25maWdfbWNfYnVmZmVyIFJlZk51bV9MMVxuIik7CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfQUNDQ09ORklHX0FERFIsCisJCQkJICAgKDE2IDw8IDgpIHwgKDAgPDwgMSkgfCAxKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgY3VyX3BpYy0+UmVmTnVtX0wxOyBpKyspIHsKKwkJCXBpYyA9CisJCQkJZ2V0X3JlZl9waWNfYnlfUE9DKGhldmMsCisJCQkJCQljdXJfcGljLT4KKwkJCQkJCW1fYWlSZWZQT0NMaXN0MVtjdXJfcGljLT4KKwkJCQkJCXNsaWNlX2lkeF1baV0pOworCQkJaWYgKHBpYykgeworCQkJCWlmICgocGljLT53aWR0aCAhPSBoZXZjLT5waWNfdykgfHwKKwkJCQkJKHBpYy0+aGVpZ2h0ICE9IGhldmMtPnBpY19oKSkgeworCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCQkiJXM6IFdyb25nIHJlZmVyZW5jZSBwaWMgKHBvYyAlZCkgd2lkdGgvaGVpZ2h0ICVkLyVkXG4iLAorCQkJCQkJX19mdW5jX18sIHBpYy0+UE9DLAorCQkJCQkJcGljLT53aWR0aCwgcGljLT5oZWlnaHQpOworCQkJCQljdXJfcGljLT5lcnJvcl9tYXJrID0gMTsKKwkJCQl9CisKKwkJCQlpZiAocGljLT5lcnJvcl9tYXJrICYmIChyZWZfZnJhbWVfbWFya19mbGFnW2hldmMtPmluZGV4XSkpCisJCQkJCWN1cl9waWMtPmVycm9yX21hcmsgPSAxOworCQkJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSLAorCQkJCQkJICAgKHBpYy0+bWNfY2FudmFzX3VfdiA8PCAxNikKKwkJCQkJCSAgIHwgKHBpYy0+bWNfY2FudmFzX3VfdgorCQkJCQkJCQkgICA8PCA4KSB8CisJCQkJCQkgICBwaWMtPm1jX2NhbnZhc195KTsKKwkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1IpIHsKKwkJCQkJaGV2Y19wcmludF9jb250KGhldmMsIDAsCisJCQkJCSJyZWZpZCAleCBtY19jYW52YXNfdV92ICV4IiwKKwkJCQkJIGksIHBpYy0+bWNfY2FudmFzX3Vfdik7CisJCQkJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLAorCQkJCQkJIiBtY19jYW52YXNfeSAleFxuIiwKKwkJCQkJIHBpYy0+bWNfY2FudmFzX3kpOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCWN1cl9waWMtPmVycm9yX21hcmsgPSAxOworCisJCQlpZiAocGljID09IE5VTEwgfHwgcGljLT5lcnJvcl9tYXJrKSB7CisJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSJFcnJvciAlcywgJWR0aCBwb2MgKCVkKSAlcyIsCisJCQkJIF9fZnVuY19fLCBpLAorCQkJCSBjdXJfcGljLT5tX2FpUmVmUE9DTGlzdDFbY3VyX3BpYy0+CisJCQkJIHNsaWNlX2lkeF1baV0sCisJCQkJIHBpYyA/ICJoYXMgZXJyb3IiIDoKKwkJCQkgIm5vdCBpbiBsaXN0MSIpOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCisjaWZkZWYgU1VQUE9SVF9MT05HX1RFUk1fUlBTCitzdGF0aWMgdW5zaWduZWQgY2hhciBpc19yZWZfbG9uZ190ZXJtKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsIGludCBwb2MpCit7CisJaW50IGlpOworCXN0cnVjdCBQSUNfcyAqcGljOworCWZvciAoaWkgPSAwOyBpaSA8IE1BWF9SRUZfUElDX05VTTsgaWkrKykgeworCQlwaWMgPSBoZXZjLT5tX1BJQ1tpaV07CisJCWlmIChwaWMgPT0gTlVMTCB8fAorCQkJcGljLT5pbmRleCA9PSAtMSB8fAorCQkJcGljLT5CVUZfaW5kZXggPT0gLTEKKwkJCSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChwaWMtPnJlZmVyZW5jZWQgJiYgcGljLT5QT0MgPT0gcG9jCisJCQkmJiBwaWMtPmxvbmdfdGVybV9yZWYpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBhcHBseV9yZWZfcGljX3NldChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLCBpbnQgY3VyX3BvYywKKwkJCQkJCQkgIHVuaW9uIHBhcmFtX3UgKnBhcmFtcykKK3sKKwlpbnQgaWksIGk7CisJaW50IHBvY190bXA7CisJc3RydWN0IFBJQ19zICpwaWM7CisJdW5zaWduZWQgY2hhciBpc19yZWZlcmVuY2VkOworCS8qIGhldmNfcHJpbnQoaGV2YywgMCwKKwkiJXMgY3VyX3BvYyAlZFxuIiwgX19mdW5jX18sIGN1cl9wb2MpOyAqLworCWlmIChwaWNfbGlzdF9kZWJ1ZyAmIDB4MikgeworCQlwcl9lcnIoImN1ciBwb2MgJWRcbiIsIGN1cl9wb2MpOworCX0KKwlmb3IgKGlpID0gMDsgaWkgPCBNQVhfUkVGX1BJQ19OVU07IGlpKyspIHsKKwkJcGljID0gaGV2Yy0+bV9QSUNbaWldOworCQlpZiAocGljID09IE5VTEwgfHwKKwkJCXBpYy0+aW5kZXggPT0gLTEgfHwKKwkJCXBpYy0+QlVGX2luZGV4ID09IC0xCisJCQkpCisJCQljb250aW51ZTsKKworI2lmZGVmIFNVUFBPUlRfTE9OR19URVJNX1JQUworCQlwaWMtPmxvbmdfdGVybV9yZWYgPSAwOworI2VuZGlmCisJCWlmICgocGljLT5yZWZlcmVuY2VkID09IDAgfHwgcGljLT5QT0MgPT0gY3VyX3BvYykpCisJCQljb250aW51ZTsKKwkJaXNfcmVmZXJlbmNlZCA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCWludCBkZWx0OworI2lmZGVmIFNVUFBPUlRfTE9OR19URVJNX1JQUworCQkJaWYgKHBhcmFtcy0+cC5DVVJfUlBTW2ldID09IFJQU19FTkQpCisJCQkJYnJlYWs7CisjZWxzZQorCQkJaWYgKHBhcmFtcy0+cC5DVVJfUlBTW2ldICYgMHg4MDAwKQorCQkJCWJyZWFrOworI2VuZGlmCisJCQlkZWx0ID0KKwkJCQlwYXJhbXMtPnAuQ1VSX1JQU1tpXSAmCisJCQkJKCgxIDw8IChSUFNfVVNFRF9CSVQgLSAxKSkgLSAxKTsKKwkJCWlmIChwYXJhbXMtPnAuQ1VSX1JQU1tpXSAmICgxIDw8IChSUFNfVVNFRF9CSVQgLSAxKSkpIHsKKwkJCQlwb2NfdG1wID0KKwkJCQkJY3VyX3BvYyAtICgoMSA8PCAoUlBTX1VTRURfQklUIC0gMSkpIC0KKwkJCQkJCQkgICBkZWx0KTsKKwkJCX0gZWxzZQorCQkJCXBvY190bXAgPSBjdXJfcG9jICsgZGVsdDsKKwkJCWlmIChwb2NfdG1wID09IHBpYy0+UE9DKSB7CisjaWZkZWYgU1VQUE9SVF9MT05HX1RFUk1fUlBTCisJCQkJaWYgKHBhcmFtcy0+cC5DVVJfUlBTW2ldICYgKDEgPDwgKFJQU19MVF9CSVQpKSkKKwkJCQkJcGljLT5sb25nX3Rlcm1fcmVmID0gMTsKKwkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1JfTU9SRSkKKwkJCQkJaGV2Y19wcmludChoZXZjLCAwLCAiJWQ6IENVUl9SUFMgMHgleCwgTFQgJWRcbiIsCisJCQkJCQlpLCBwYXJhbXMtPnAuQ1VSX1JQU1tpXSwKKwkJCQkJCXBpYy0+bG9uZ190ZXJtX3JlZik7CisjZW5kaWYKKwkJCQlpc19yZWZlcmVuY2VkID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoaXNfcmVmZXJlbmNlZCA9PSAwKSB7CisJCQlwaWMtPnJlZmVyZW5jZWQgPSAwOworCQkJcHV0X212X2J1ZihoZXZjLCBwaWMpOworCQkJLyogaGV2Y19wcmludChoZXZjLCAwLAorCQkJInNldCBwb2MgJWQgcmVmZXJlbmNlIHRvIDBcbiIsIHBpYy0+UE9DKTsgKi8KKwkJCWlmIChwaWNfbGlzdF9kZWJ1ZyAmIDB4MikgeworCQkJCXByX2Vycigic2V0IHBvYyAlZCByZWZlcmVuY2UgdG8gMFxuIiwgcGljLT5QT0MpOworCQkJfQorCQl9CisJfQorCit9CisKK3N0YXRpYyB2b2lkIHNldF9yZWZfcGljX2xpc3Qoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywgdW5pb24gcGFyYW1fdSAqcGFyYW1zKQoreworCXN0cnVjdCBQSUNfcyAqcGljID0gaGV2Yy0+Y3VyX3BpYzsKKwlpbnQgaSwgcklkeDsKKwlpbnQgbnVtX25lZyA9IDA7CisJaW50IG51bV9wb3MgPSAwOworCWludCB0b3RhbF9udW07CisJaW50IG51bV9yZWZfaWR4X2wwX2FjdGl2ZSA9CisJCShwYXJhbXMtPnAubnVtX3JlZl9pZHhfbDBfYWN0aXZlID4KKwkJIE1BWF9SRUZfQUNUSVZFKSA/IE1BWF9SRUZfQUNUSVZFIDoKKwkJcGFyYW1zLT5wLm51bV9yZWZfaWR4X2wwX2FjdGl2ZTsKKwlpbnQgbnVtX3JlZl9pZHhfbDFfYWN0aXZlID0KKwkJKHBhcmFtcy0+cC5udW1fcmVmX2lkeF9sMV9hY3RpdmUgPgorCQkgTUFYX1JFRl9BQ1RJVkUpID8gTUFYX1JFRl9BQ1RJVkUgOgorCQlwYXJhbXMtPnAubnVtX3JlZl9pZHhfbDFfYWN0aXZlOworCisJaW50IFJlZlBpY1NldFN0Q3VycjBbMTZdOworCWludCBSZWZQaWNTZXRTdEN1cnIxWzE2XTsKKyNpZmRlZiBTVVBQT1JUX0xPTkdfVEVSTV9SUFMKKwlpbnQgbnVtX2x0ID0gMDsKKwlpbnQgUmVmUGljU2V0THRDdXJyWzE2XTsKKyNlbmRpZgorCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJUmVmUGljU2V0U3RDdXJyMFtpXSA9IDA7CisJCVJlZlBpY1NldFN0Q3VycjFbaV0gPSAwOworCQlwaWMtPm1fYWlSZWZQT0NMaXN0MFtwaWMtPnNsaWNlX2lkeF1baV0gPSAwOworCQlwaWMtPm1fYWlSZWZQT0NMaXN0MVtwaWMtPnNsaWNlX2lkeF1baV0gPSAwOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworI2lmZGVmIFNVUFBPUlRfTE9OR19URVJNX1JQUworCQlpZiAocGFyYW1zLT5wLkNVUl9SUFNbaV0gPT0gUlBTX0VORCkKKwkJCWJyZWFrOworI2Vsc2UKKwkJaWYgKHBhcmFtcy0+cC5DVVJfUlBTW2ldICYgMHg4MDAwKQorCQkJYnJlYWs7CisjZW5kaWYKKwkJaWYgKChwYXJhbXMtPnAuQ1VSX1JQU1tpXSA+PiBSUFNfVVNFRF9CSVQpICYgMSkgeworCQkJaW50IGRlbHQgPQorCQkJCXBhcmFtcy0+cC5DVVJfUlBTW2ldICYKKwkJCQkoKDEgPDwgKFJQU19VU0VEX0JJVCAtIDEpKSAtIDEpOworCisJCQlpZiAoKHBhcmFtcy0+cC5DVVJfUlBTW2ldID4+IChSUFNfVVNFRF9CSVQgLSAxKSkgJiAxKSB7CisjaWZkZWYgU1VQUE9SVF9MT05HX1RFUk1fUlBTCisJCQkJaWYgKChwYXJhbXMtPnAuQ1VSX1JQU1tpXSA+PiBSUFNfTFRfQklUKSAmIDEpIHsKKwkJCQkJUmVmUGljU2V0THRDdXJyW251bV9sdF0gPQorCQkJCQkJcGljLT5QT0MgLSAoKDEgPDwgKFJQU19VU0VEX0JJVCAtIDEpKSAtCisJCQkJCQkJCQlkZWx0KTsKKwkJCQkJbnVtX2x0Kys7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKyNlbmRpZgorCisJCQkJUmVmUGljU2V0U3RDdXJyMFtudW1fbmVnXSA9CisJCQkJCXBpYy0+UE9DIC0gKCgxIDw8IChSUFNfVVNFRF9CSVQgLSAxKSkgLQorCQkJCQkJCQlkZWx0KTsKKwkJCQkvKiBoZXZjX3ByaW50KGhldmMsIDAsCisJCQkJICoJIlJlZlBpY1NldFN0Q3VycjAgJXggJXggJXhcbiIsCisJCQkJICogICBSZWZQaWNTZXRTdEN1cnIwW251bV9uZWddLCBwaWMtPlBPQywKKwkJCQkgKiAgICgweDgwMC0ocGFyYW1zW2ldJjB4N2ZmKSkpOworCQkJCSAqLworCQkJCW51bV9uZWcrKzsKKwkJCX0gZWxzZSB7CisjaWZkZWYgU1VQUE9SVF9MT05HX1RFUk1fUlBTCisJCQkJaWYgKChwYXJhbXMtPnAuQ1VSX1JQU1tpXSA+PiBSUFNfTFRfQklUKSAmIDEpIHsKKwkJCQkJUmVmUGljU2V0THRDdXJyW251bV9sdF0gPSBwaWMtPlBPQyArIGRlbHQ7CisJCQkJCW51bV9sdCsrOworCQkJCQljb250aW51ZTsKKwkJCQl9CisjZW5kaWYKKwkJCQlSZWZQaWNTZXRTdEN1cnIxW251bV9wb3NdID0gcGljLT5QT0MgKyBkZWx0OworCQkJCS8qIGhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkgKgkiUmVmUGljU2V0U3RDdXJyMSAlZFxuIiwKKwkJCQkgKiAgIFJlZlBpY1NldFN0Q3VycjFbbnVtX3Bvc10pOworCQkJCSAqLworCQkJCW51bV9wb3MrKzsKKwkJCX0KKwkJfQorCX0KKyNpZmRlZiBTVVBQT1JUX0xPTkdfVEVSTV9SUFMKKwl0b3RhbF9udW0gPSBudW1fbmVnICsgbnVtX3BvcyArIG51bV9sdDsKKyNlbHNlCisJdG90YWxfbnVtID0gbnVtX25lZyArIG51bV9wb3M7CisjZW5kaWYKKwlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1IpIHsKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkiJXM6IGN1cnBvYyAlZCBzbGljZV90eXBlICVkLCB0b3RhbCAlZCAiLAorCQkgX19mdW5jX18sIHBpYy0+UE9DLCBwYXJhbXMtPnAuc2xpY2VfdHlwZSwgdG90YWxfbnVtKTsKKyNpZmRlZiBTVVBQT1JUX0xPTkdfVEVSTV9SUFMKKwkJaGV2Y19wcmludF9jb250KGhldmMsIDAsCisJCQkibnVtX25lZyAlZCBudW1fbHQgJWQgbnVtX2xpc3QwICVkIG51bV9saXN0MSAlZFxuIiwKKwkJIG51bV9uZWcsIG51bV9sdCwgbnVtX3JlZl9pZHhfbDBfYWN0aXZlLCBudW1fcmVmX2lkeF9sMV9hY3RpdmUpOworI2Vsc2UKKwkJaGV2Y19wcmludF9jb250KGhldmMsIDAsCisJCQkibnVtX25lZyAlZCBudW1fbGlzdDAgJWQgbnVtX2xpc3QxICVkXG4iLAorCQkgbnVtX25lZywgbnVtX3JlZl9pZHhfbDBfYWN0aXZlLCBudW1fcmVmX2lkeF9sMV9hY3RpdmUpOworI2VuZGlmCisKKwl9CisKKwlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1IpIHsKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkiSEVWQyBTdHJlYW0gYnVmIHN0YXJ0ICIpOworCQloZXZjX3ByaW50X2NvbnQoaGV2YywgMCwKKwkJIiV4IGVuZCAleCB3ciAleCByZCAleCBsZXYgJXggY3RsICV4IGludGN0bCAleFxuIiwKKwkJIFJFQURfVlJFRyhIRVZDX1NUUkVBTV9TVEFSVF9BRERSKSwKKwkJIFJFQURfVlJFRyhIRVZDX1NUUkVBTV9FTkRfQUREUiksCisJCSBSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fV1JfUFRSKSwKKwkJIFJFQURfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIpLAorCQkgUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0xFVkVMKSwKKwkJIFJFQURfVlJFRyhIRVZDX1NUUkVBTV9GSUZPX0NUTCksCisJCSBSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfSU5UX0NPTlRST0wpKTsKKwl9CisKKwlpZiAodG90YWxfbnVtID4gMCkgeworCQlpZiAocGFyYW1zLT5wLm1vZGlmaWNhdGlvbl9mbGFnICYgMHgxKSB7CisJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1IpCisJCQkJaGV2Y19wcmludChoZXZjLCAwLCAicmVmMCBQT0MgKG1vZGlmaWNhdGlvbik6Iik7CisJCQlmb3IgKHJJZHggPSAwOyBySWR4IDwgbnVtX3JlZl9pZHhfbDBfYWN0aXZlOyBySWR4KyspIHsKKwkJCQlpbnQgY0lkeCA9IHBhcmFtcy0+cC5tb2RpZmljYXRpb25fbGlzdFtySWR4XTsKKworCQkJCXBpYy0+bV9haVJlZlBPQ0xpc3QwW3BpYy0+c2xpY2VfaWR4XVtySWR4XSA9CisjaWZkZWYgU1VQUE9SVF9MT05HX1RFUk1fUlBTCisJCQkJCWNJZHggPj0gKG51bV9uZWcgKyBudW1fcG9zKSA/CisJCQkJCQlSZWZQaWNTZXRMdEN1cnJbY0lkeCAtIG51bV9uZWcgLSBudW1fcG9zXSA6CisjZW5kaWYKKwkJCQkJKGNJZHggPj0KKwkJCQkJbnVtX25lZyA/IFJlZlBpY1NldFN0Q3VycjFbY0lkeCAtCisJCQkJCW51bV9uZWddIDoKKwkJCQkJUmVmUGljU2V0U3RDdXJyMFtjSWR4XSk7CisJCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKSB7CisJCQkJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLCAiJWQgIiwKKwkJCQkJCSAgIHBpYy0+bV9haVJlZlBPQ0xpc3QwW3BpYy0+CisJCQkJCQkgICBzbGljZV9pZHhdCisJCQkJCQkgICBbcklkeF0pOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikKKwkJCQloZXZjX3ByaW50KGhldmMsIDAsICJyZWYwIFBPQzoiKTsKKwkJCWZvciAocklkeCA9IDA7IHJJZHggPCBudW1fcmVmX2lkeF9sMF9hY3RpdmU7IHJJZHgrKykgeworCQkJCWludCBjSWR4ID0gcklkeCAlIHRvdGFsX251bTsKKworCQkJCXBpYy0+bV9haVJlZlBPQ0xpc3QwW3BpYy0+c2xpY2VfaWR4XVtySWR4XSA9CisjaWZkZWYgU1VQUE9SVF9MT05HX1RFUk1fUlBTCisJCQkJCWNJZHggPj0gKG51bV9uZWcgKyBudW1fcG9zKSA/CisJCQkJCQlSZWZQaWNTZXRMdEN1cnJbY0lkeCAtIG51bV9uZWcgLSBudW1fcG9zXSA6CisjZW5kaWYKKwkJCQkJKGNJZHggPj0KKwkJCQkJbnVtX25lZyA/IFJlZlBpY1NldFN0Q3VycjFbY0lkeCAtCisJCQkJCW51bV9uZWddIDoKKwkJCQkJUmVmUGljU2V0U3RDdXJyMFtjSWR4XSk7CisJCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKSB7CisJCQkJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLCAiJWQgIiwKKwkJCQkJCSAgIHBpYy0+bV9haVJlZlBPQ0xpc3QwW3BpYy0+CisJCQkJCQkgICBzbGljZV9pZHhdCisJCQkJCQkgICBbcklkeF0pOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1IpCisJCQloZXZjX3ByaW50X2NvbnQoaGV2YywgMCwgIlxuIik7CisJCWlmIChwYXJhbXMtPnAuc2xpY2VfdHlwZSA9PSBCX1NMSUNFKSB7CisJCQlpZiAocGFyYW1zLT5wLm1vZGlmaWNhdGlvbl9mbGFnICYgMHgyKSB7CisJCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKQorCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCQkicmVmMSBQT0MgKG1vZGlmaWNhdGlvbik6Iik7CisJCQkJZm9yIChySWR4ID0gMDsgcklkeCA8IG51bV9yZWZfaWR4X2wxX2FjdGl2ZTsKKwkJCQkJIHJJZHgrKykgeworCQkJCQlpbnQgY0lkeDsKKworCQkJCQlpZiAocGFyYW1zLT5wLm1vZGlmaWNhdGlvbl9mbGFnICYgMHgxKSB7CisJCQkJCQljSWR4ID0KKwkJCQkJCQlwYXJhbXMtPnAuCisJCQkJCQkJbW9kaWZpY2F0aW9uX2xpc3QKKwkJCQkJCQlbbnVtX3JlZl9pZHhfbDBfYWN0aXZlICsKKwkJCQkJCQkgcklkeF07CisJCQkJCX0gZWxzZSB7CisJCQkJCQljSWR4ID0KKwkJCQkJCQlwYXJhbXMtPnAuCisJCQkJCQkJbW9kaWZpY2F0aW9uX2xpc3RbcklkeF07CisJCQkJCX0KKwkJCQkJcGljLT5tX2FpUmVmUE9DTGlzdDFbcGljLT4KKwkJCQkJCXNsaWNlX2lkeF1bcklkeF0gPQorI2lmZGVmIFNVUFBPUlRfTE9OR19URVJNX1JQUworCQkJCQljSWR4ID49IChudW1fbmVnICsgbnVtX3BvcykgPworCQkJCQkJUmVmUGljU2V0THRDdXJyW2NJZHggLSBudW1fbmVnIC0gbnVtX3Bvc10gOgorI2VuZGlmCisJCQkJCQkoY0lkeCA+PQorCQkJCQkJbnVtX3BvcyA/CisJCQkJCQlSZWZQaWNTZXRTdEN1cnIwW2NJZHggLQludW1fcG9zXQorCQkJCQkJOiBSZWZQaWNTZXRTdEN1cnIxW2NJZHhdKTsKKwkJCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmCisJCQkJCQlIMjY1X0RFQlVHX0JVRk1HUikgeworCQkJCQkJaGV2Y19wcmludF9jb250KGhldmMsIDAsICIlZCAiLAorCQkJCQkJCSAgIHBpYy0+CisJCQkJCQkJICAgbV9haVJlZlBPQ0xpc3QxW3BpYy0+CisJCQkJCQkJICAgc2xpY2VfaWR4XQorCQkJCQkJCSAgIFtySWR4XSk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJgorCQkJCQlIMjY1X0RFQlVHX0JVRk1HUikKKwkJCQkJaGV2Y19wcmludChoZXZjLCAwLCAicmVmMSBQT0M6Iik7CisJCQkJZm9yIChySWR4ID0gMDsgcklkeCA8IG51bV9yZWZfaWR4X2wxX2FjdGl2ZTsKKwkJCQkJIHJJZHgrKykgeworCQkJCQlpbnQgY0lkeCA9IHJJZHggJSB0b3RhbF9udW07CisKKwkJCQkJcGljLT5tX2FpUmVmUE9DTGlzdDFbcGljLT4KKwkJCQkJCXNsaWNlX2lkeF1bcklkeF0gPQorI2lmZGVmIFNVUFBPUlRfTE9OR19URVJNX1JQUworCQkJCQljSWR4ID49IChudW1fbmVnICsgbnVtX3BvcykgPworCQkJCQkJUmVmUGljU2V0THRDdXJyW2NJZHggLSBudW1fbmVnIC0gbnVtX3Bvc10gOgorI2VuZGlmCisJCQkJCQkoY0lkeCA+PQorCQkJCQkJbnVtX3BvcyA/CisJCQkJCQlSZWZQaWNTZXRTdEN1cnIwW2NJZHggLQorCQkJCQkJbnVtX3Bvc10KKwkJCQkJCTogUmVmUGljU2V0U3RDdXJyMVtjSWR4XSk7CisJCQkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJgorCQkJCQkJSDI2NV9ERUJVR19CVUZNR1IpIHsKKwkJCQkJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLCAiJWQgIiwKKwkJCQkJCQkgICBwaWMtPgorCQkJCQkJCSAgIG1fYWlSZWZQT0NMaXN0MVtwaWMtPgorCQkJCQkJCSAgIHNsaWNlX2lkeF0KKwkJCQkJCQkgICBbcklkeF0pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKQorCQkJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLCAiXG4iKTsKKwkJfQorCX0KKwkvKnNldCBtX1BJQyAqLworCXBpYy0+c2xpY2VfdHlwZSA9IChwYXJhbXMtPnAuc2xpY2VfdHlwZSA9PSBJX1NMSUNFKSA/IDIgOgorCQkocGFyYW1zLT5wLnNsaWNlX3R5cGUgPT0gUF9TTElDRSkgPyAxIDoKKwkJKHBhcmFtcy0+cC5zbGljZV90eXBlID09IEJfU0xJQ0UpID8gMCA6IDM7CisJcGljLT5SZWZOdW1fTDAgPSBudW1fcmVmX2lkeF9sMF9hY3RpdmU7CisJcGljLT5SZWZOdW1fTDEgPSBudW1fcmVmX2lkeF9sMV9hY3RpdmU7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV90aWxlX2luZm8oc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywgaW50IHBpY193aWR0aF9jdSwKKwkJaW50IHBpY19oZWlnaHRfY3UsIGludCBzYW9fbWVtX3VuaXQsCisJCXVuaW9uIHBhcmFtX3UgKnBhcmFtcykKK3sKKwlpbnQgaSwgajsKKwlpbnQgc3RhcnRfY3VfeCwgc3RhcnRfY3VfeTsKKwlpbnQgc2FvX3ZiX3NpemUgPSAoc2FvX21lbV91bml0ICsgKDIgPDwgNCkpICogcGljX2hlaWdodF9jdTsKKwlpbnQgc2FvX2Fidl9zaXplID0gc2FvX21lbV91bml0ICogcGljX3dpZHRoX2N1OworI2lmZGVmIERFVFJFRklMTF9FTkFCTEUKKwlpZiAoaGV2Yy0+aXNfc3dhcCAmJiBnZXRfY3B1X21ham9yX2lkKCkgPD0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTSkgeworCQlpbnQgdG1wUmVmaWxsTGN1U2l6ZSA9IDEgPDwKKwkJCShwYXJhbXMtPnAubG9nMl9taW5fY29kaW5nX2Jsb2NrX3NpemVfbWludXMzICsKKwkJCTMgKyBwYXJhbXMtPnAubG9nMl9kaWZmX21heF9taW5fY29kaW5nX2Jsb2NrX3NpemUpOworCQloZXZjX3ByaW50KGhldmMsIEgyNjVfREVCVUdfQlVGTUdSX01PUkUsCisJCQkiJXgsICV4LCAleCwgJXhcbiIsCisJCQlwYXJhbXMtPnAuc2xpY2Vfc2VnbWVudF9hZGRyZXNzLAorCQkJcGFyYW1zLT5wLmJpdF9kZXB0aCwKKwkJCXBhcmFtcy0+cC50aWxlc19lbmFibGVkX2ZsYWcsCisJCQl0bXBSZWZpbGxMY3VTaXplKTsKKwkJaWYgKHBhcmFtcy0+cC5zbGljZV9zZWdtZW50X2FkZHJlc3MgPT0gMCAmJgorCQkJcGFyYW1zLT5wLmJpdF9kZXB0aCAhPSAwICYmCisJCQkocGFyYW1zLT5wLnRpbGVzX2VuYWJsZWRfZmxhZyAmIDEpICYmCisJCQl0bXBSZWZpbGxMY3VTaXplID09IDY0KQorCQkJaGV2Yy0+ZGVscmVmaWxsX2NoZWNrID0gMTsKKwkJZWxzZQorCQkJaGV2Yy0+ZGVscmVmaWxsX2NoZWNrID0gMDsKKwl9CisjZW5kaWYKKworCWhldmMtPnRpbGVfZW5hYmxlZCA9IHBhcmFtcy0+cC50aWxlc19lbmFibGVkX2ZsYWcgJiAxOworCWlmIChwYXJhbXMtPnAudGlsZXNfZW5hYmxlZF9mbGFnICYgMSkgeworCQloZXZjLT5udW1fdGlsZV9jb2wgPSBwYXJhbXMtPnAubnVtX3RpbGVfY29sdW1uc19taW51czEgKyAxOworCQloZXZjLT5udW1fdGlsZV9yb3cgPSBwYXJhbXMtPnAubnVtX3RpbGVfcm93c19taW51czEgKyAxOworCisJCWlmIChoZXZjLT5udW1fdGlsZV9yb3cgPiBNQVhfVElMRV9ST1dfTlVNCisJCQl8fCBoZXZjLT5udW1fdGlsZV9yb3cgPD0gMCkgeworCQkJaGV2Yy0+bnVtX3RpbGVfcm93ID0gMTsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkiJXM6IG51bV90aWxlX3Jvd3NfbWludXMxICglZCkgZXJyb3IhIVxuIiwKKwkJCQkgICBfX2Z1bmNfXywgcGFyYW1zLT5wLm51bV90aWxlX3Jvd3NfbWludXMxKTsKKwkJfQorCQlpZiAoaGV2Yy0+bnVtX3RpbGVfY29sID4gTUFYX1RJTEVfQ09MX05VTQorCQkJfHwgaGV2Yy0+bnVtX3RpbGVfY29sIDw9IDApIHsKKwkJCWhldmMtPm51bV90aWxlX2NvbCA9IDE7CisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJIiVzOiBudW1fdGlsZV9jb2x1bW5zX21pbnVzMSAoJWQpIGVycm9yISFcbiIsCisJCQkJICAgX19mdW5jX18sIHBhcmFtcy0+cC5udW1fdGlsZV9jb2x1bW5zX21pbnVzMSk7CisJCX0KKwkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKSB7CisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiJXMgcGljX3dfY3UgJWQgcGljX2hfY3UgJWQgdGlsZV9lbmFibGVkICIsCisJCQkgX19mdW5jX18sIHBpY193aWR0aF9jdSwgcGljX2hlaWdodF9jdSk7CisJCQloZXZjX3ByaW50X2NvbnQoaGV2YywgMCwKKwkJCQkibnVtX3RpbGVfY29sICVkIG51bV90aWxlX3JvdyAlZDpcbiIsCisJCQkgaGV2Yy0+bnVtX3RpbGVfY29sLCBoZXZjLT5udW1fdGlsZV9yb3cpOworCQl9CisKKwkJaWYgKHBhcmFtcy0+cC50aWxlc19lbmFibGVkX2ZsYWcgJiAyKSB7CS8qIHVuaWZvcm0gZmxhZyAqLworCQkJaW50IHcgPSBwaWNfd2lkdGhfY3UgLyBoZXZjLT5udW1fdGlsZV9jb2w7CisJCQlpbnQgaCA9IHBpY19oZWlnaHRfY3UgLyBoZXZjLT5udW1fdGlsZV9yb3c7CisKKwkJCXN0YXJ0X2N1X3kgPSAwOworCQkJZm9yIChpID0gMDsgaSA8IGhldmMtPm51bV90aWxlX3JvdzsgaSsrKSB7CisJCQkJc3RhcnRfY3VfeCA9IDA7CisJCQkJZm9yIChqID0gMDsgaiA8IGhldmMtPm51bV90aWxlX2NvbDsgaisrKSB7CisJCQkJCWlmIChqID09IChoZXZjLT5udW1fdGlsZV9jb2wgLSAxKSkgeworCQkJCQkJaGV2Yy0+bV90aWxlW2ldW2pdLndpZHRoID0KKwkJCQkJCQlwaWNfd2lkdGhfY3UgLQorCQkJCQkJCXN0YXJ0X2N1X3g7CisJCQkJCX0gZWxzZQorCQkJCQkJaGV2Yy0+bV90aWxlW2ldW2pdLndpZHRoID0gdzsKKwkJCQkJaWYgKGkgPT0gKGhldmMtPm51bV90aWxlX3JvdyAtIDEpKSB7CisJCQkJCQloZXZjLT5tX3RpbGVbaV1bal0uaGVpZ2h0ID0KKwkJCQkJCQlwaWNfaGVpZ2h0X2N1IC0KKwkJCQkJCQlzdGFydF9jdV95OworCQkJCQl9IGVsc2UKKwkJCQkJCWhldmMtPm1fdGlsZVtpXVtqXS5oZWlnaHQgPSBoOworCQkJCQloZXZjLT5tX3RpbGVbaV1bal0uc3RhcnRfY3VfeAorCQkJCQkgICAgPSBzdGFydF9jdV94OworCQkJCQloZXZjLT5tX3RpbGVbaV1bal0uc3RhcnRfY3VfeQorCQkJCQkgICAgPSBzdGFydF9jdV95OworCQkJCQloZXZjLT5tX3RpbGVbaV1bal0uc2FvX3ZiX3N0YXJ0X2FkZHIgPQorCQkJCQkJaGV2Yy0+d29ya19zcGFjZV9idWYtPnNhb192Yi4KKwkJCQkJCWJ1Zl9zdGFydCArIGogKiBzYW9fdmJfc2l6ZTsKKwkJCQkJaGV2Yy0+bV90aWxlW2ldW2pdLnNhb19hYnZfc3RhcnRfYWRkciA9CisJCQkJCQloZXZjLT53b3JrX3NwYWNlX2J1Zi0+c2FvX2Fidi4KKwkJCQkJCWJ1Zl9zdGFydCArIGkgKiBzYW9fYWJ2X3NpemU7CisJCQkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJgorCQkJCQkJSDI2NV9ERUJVR19CVUZNR1IpIHsKKwkJCQkJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLAorCQkJCQkJInt5PSVkLCB4PSVkIHcgJWQgaCAlZCAiLAorCQkJCQkJIGksIGosIGhldmMtPm1fdGlsZVtpXVtqXS53aWR0aCwKKwkJCQkJCSBoZXZjLT5tX3RpbGVbaV1bal0uaGVpZ2h0KTsKKwkJCQkJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLAorCQkJCQkJInN0YXJ0X3ggJWQgc3RhcnRfeSAlZCAiLAorCQkJCQkJIGhldmMtPm1fdGlsZVtpXVtqXS5zdGFydF9jdV94LAorCQkJCQkJIGhldmMtPm1fdGlsZVtpXVtqXS5zdGFydF9jdV95KTsKKwkJCQkJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLAorCQkJCQkJInNhb192Yl9zdGFydCAweCV4ICIsCisJCQkJCQkgaGV2Yy0+bV90aWxlW2ldW2pdLgorCQkJCQkJIHNhb192Yl9zdGFydF9hZGRyKTsKKwkJCQkJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLAorCQkJCQkJInNhb19hYnZfc3RhcnQgMHgleH1cbiIsCisJCQkJCQkgaGV2Yy0+bV90aWxlW2ldW2pdLgorCQkJCQkJIHNhb19hYnZfc3RhcnRfYWRkcik7CisJCQkJCX0KKwkJCQkJc3RhcnRfY3VfeCArPSBoZXZjLT5tX3RpbGVbaV1bal0ud2lkdGg7CisKKwkJCQl9CisJCQkJc3RhcnRfY3VfeSArPSBoZXZjLT5tX3RpbGVbaV1bMF0uaGVpZ2h0OworCQkJfQorCQl9IGVsc2UgeworCQkJc3RhcnRfY3VfeSA9IDA7CisJCQlmb3IgKGkgPSAwOyBpIDwgaGV2Yy0+bnVtX3RpbGVfcm93OyBpKyspIHsKKwkJCQlzdGFydF9jdV94ID0gMDsKKwkJCQlmb3IgKGogPSAwOyBqIDwgaGV2Yy0+bnVtX3RpbGVfY29sOyBqKyspIHsKKwkJCQkJaWYgKGogPT0gKGhldmMtPm51bV90aWxlX2NvbCAtIDEpKSB7CisJCQkJCQloZXZjLT5tX3RpbGVbaV1bal0ud2lkdGggPQorCQkJCQkJCXBpY193aWR0aF9jdSAtCisJCQkJCQkJc3RhcnRfY3VfeDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWhldmMtPm1fdGlsZVtpXVtqXS53aWR0aCA9CisJCQkJCQkJcGFyYW1zLT5wLnRpbGVfd2lkdGhbal07CisJCQkJCX0KKwkJCQkJaWYgKGkgPT0gKGhldmMtPm51bV90aWxlX3JvdyAtIDEpKSB7CisJCQkJCQloZXZjLT5tX3RpbGVbaV1bal0uaGVpZ2h0ID0KKwkJCQkJCQlwaWNfaGVpZ2h0X2N1IC0KKwkJCQkJCQlzdGFydF9jdV95OworCQkJCQl9IGVsc2UgeworCQkJCQkJaGV2Yy0+bV90aWxlW2ldW2pdLmhlaWdodCA9CisJCQkJCQkJcGFyYW1zLT4KKwkJCQkJCQlwLnRpbGVfaGVpZ2h0W2ldOworCQkJCQl9CisJCQkJCWhldmMtPm1fdGlsZVtpXVtqXS5zdGFydF9jdV94CisJCQkJCSAgICA9IHN0YXJ0X2N1X3g7CisJCQkJCWhldmMtPm1fdGlsZVtpXVtqXS5zdGFydF9jdV95CisJCQkJCSAgICA9IHN0YXJ0X2N1X3k7CisJCQkJCWhldmMtPm1fdGlsZVtpXVtqXS5zYW9fdmJfc3RhcnRfYWRkciA9CisJCQkJCQloZXZjLT53b3JrX3NwYWNlX2J1Zi0+c2FvX3ZiLgorCQkJCQkJYnVmX3N0YXJ0ICsgaiAqIHNhb192Yl9zaXplOworCQkJCQloZXZjLT5tX3RpbGVbaV1bal0uc2FvX2Fidl9zdGFydF9hZGRyID0KKwkJCQkJCWhldmMtPndvcmtfc3BhY2VfYnVmLT5zYW9fYWJ2LgorCQkJCQkJYnVmX3N0YXJ0ICsgaSAqIHNhb19hYnZfc2l6ZTsKKwkJCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmCisJCQkJCQlIMjY1X0RFQlVHX0JVRk1HUikgeworCQkJCQkJaGV2Y19wcmludF9jb250KGhldmMsIDAsCisJCQkJCQkie3k9JWQsIHg9JWQgdyAlZCBoICVkICIsCisJCQkJCQkgaSwgaiwgaGV2Yy0+bV90aWxlW2ldW2pdLndpZHRoLAorCQkJCQkJIGhldmMtPm1fdGlsZVtpXVtqXS5oZWlnaHQpOworCQkJCQkJaGV2Y19wcmludF9jb250KGhldmMsIDAsCisJCQkJCQkic3RhcnRfeCAlZCBzdGFydF95ICVkICIsCisJCQkJCQkgaGV2Yy0+bV90aWxlW2ldW2pdLnN0YXJ0X2N1X3gsCisJCQkJCQkgaGV2Yy0+bV90aWxlW2ldW2pdLnN0YXJ0X2N1X3kpOworCQkJCQkJaGV2Y19wcmludF9jb250KGhldmMsIDAsCisJCQkJCQkic2FvX3ZiX3N0YXJ0IDB4JXggIiwKKwkJCQkJCSBoZXZjLT5tX3RpbGVbaV1bal0uCisJCQkJCQkgc2FvX3ZiX3N0YXJ0X2FkZHIpOworCQkJCQkJaGV2Y19wcmludF9jb250KGhldmMsIDAsCisJCQkJCQkic2FvX2Fidl9zdGFydCAweCV4fVxuIiwKKwkJCQkJCSBoZXZjLT5tX3RpbGVbaV1bal0uCisJCQkJCQkgc2FvX2Fidl9zdGFydF9hZGRyKTsKKworCQkJCQl9CisJCQkJCXN0YXJ0X2N1X3ggKz0gaGV2Yy0+bV90aWxlW2ldW2pdLndpZHRoOworCQkJCX0KKwkJCQlzdGFydF9jdV95ICs9IGhldmMtPm1fdGlsZVtpXVswXS5oZWlnaHQ7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQloZXZjLT5udW1fdGlsZV9jb2wgPSAxOworCQloZXZjLT5udW1fdGlsZV9yb3cgPSAxOworCQloZXZjLT5tX3RpbGVbMF1bMF0ud2lkdGggPSBwaWNfd2lkdGhfY3U7CisJCWhldmMtPm1fdGlsZVswXVswXS5oZWlnaHQgPSBwaWNfaGVpZ2h0X2N1OworCQloZXZjLT5tX3RpbGVbMF1bMF0uc3RhcnRfY3VfeCA9IDA7CisJCWhldmMtPm1fdGlsZVswXVswXS5zdGFydF9jdV95ID0gMDsKKwkJaGV2Yy0+bV90aWxlWzBdWzBdLnNhb192Yl9zdGFydF9hZGRyID0KKwkJCWhldmMtPndvcmtfc3BhY2VfYnVmLT5zYW9fdmIuYnVmX3N0YXJ0OworCQloZXZjLT5tX3RpbGVbMF1bMF0uc2FvX2Fidl9zdGFydF9hZGRyID0KKwkJCWhldmMtPndvcmtfc3BhY2VfYnVmLT5zYW9fYWJ2LmJ1Zl9zdGFydDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3RpbGVfaW5kZXgoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywgaW50IGN1X2FkciwKKwkJCQkJCSAgaW50IHBpY193aWR0aF9sY3UpCit7CisJaW50IGN1X3g7CisJaW50IGN1X3k7CisJaW50IHRpbGVfeCA9IDA7CisJaW50IHRpbGVfeSA9IDA7CisJaW50IGk7CisKKwlpZiAocGljX3dpZHRoX2xjdSA9PSAwKSB7CisJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykpIHsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSIlcyBFcnJvciwgcGljX3dpZHRoX2xjdSBpcyAwLCBwaWNfdyAlZCwgcGljX2ggJWRcbiIsCisJCQkgX19mdW5jX18sIGhldmMtPnBpY193LCBoZXZjLT5waWNfaCk7CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKwljdV94ID0gY3VfYWRyICUgcGljX3dpZHRoX2xjdTsKKwljdV95ID0gY3VfYWRyIC8gcGljX3dpZHRoX2xjdTsKKwlpZiAoaGV2Yy0+dGlsZV9lbmFibGVkKSB7CisJCWZvciAoaSA9IDA7IGkgPCBoZXZjLT5udW1fdGlsZV9jb2w7IGkrKykgeworCQkJaWYgKGN1X3ggPj0gaGV2Yy0+bV90aWxlWzBdW2ldLnN0YXJ0X2N1X3gpCisJCQkJdGlsZV94ID0gaTsKKwkJCWVsc2UKKwkJCQlicmVhazsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgaGV2Yy0+bnVtX3RpbGVfcm93OyBpKyspIHsKKwkJCWlmIChjdV95ID49IGhldmMtPm1fdGlsZVtpXVswXS5zdGFydF9jdV95KQorCQkJCXRpbGVfeSA9IGk7CisJCQllbHNlCisJCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuICh0aWxlX3gpIHwgKHRpbGVfeSA8PCA4KTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfc2NyYXRjaF9lcnJvcihpbnQgZXJyb3JfbnVtKQoreworI2lmIDAKKwlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpKSB7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJIiBFUlJPUiA6IEhFVkNfQVNTSVNUX1NDUkFUQ0hfVEVTVCBFcnJvciA6ICVkXG4iLAorCQkJICAgZXJyb3JfbnVtKTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgaGV2Y19jb25maWdfd29ya19zcGFjZV9odyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCXN0cnVjdCBCdWZmSW5mb19zICpidWZfc3BlYyA9IGhldmMtPndvcmtfc3BhY2VfYnVmOworCisJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSkKKwkJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX0JVRk1HUl9NT1JFLAorCQkJIiVzICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4XG4iLAorCQkJX19mdW5jX18sCisJCQlidWZfc3BlYy0+aXBwLmJ1Zl9zdGFydCwKKwkJCWJ1Zl9zcGVjLT5zdGFydF9hZHIsCisJCQlidWZfc3BlYy0+c2hvcnRfdGVybV9ycHMuYnVmX3N0YXJ0LAorCQkJYnVmX3NwZWMtPnZwcy5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+c3BzLmJ1Zl9zdGFydCwKKwkJCWJ1Zl9zcGVjLT5wcHMuYnVmX3N0YXJ0LAorCQkJYnVmX3NwZWMtPnNhb191cC5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+c3dhcF9idWYuYnVmX3N0YXJ0LAorCQkJYnVmX3NwZWMtPnN3YXBfYnVmMi5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+c2NhbGVsdXQuYnVmX3N0YXJ0LAorCQkJYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+ZGJsa19kYXRhLmJ1Zl9zdGFydCwKKwkJCWJ1Zl9zcGVjLT5kYmxrX2RhdGEyLmJ1Zl9zdGFydCk7CisJV1JJVEVfVlJFRyhIRVZDRF9JUFBfTElORUJVRkZfQkFTRSwgYnVmX3NwZWMtPmlwcC5idWZfc3RhcnQpOworCWlmICgoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19TRU5EX1BBUkFNX1dJVEhfUkVHKSA9PSAwKQorCQlXUklURV9WUkVHKEhFVkNfUlBNX0JVRkZFUiwgKHUzMiloZXZjLT5ycG1fcGh5X2FkZHIpOworCVdSSVRFX1ZSRUcoSEVWQ19TSE9SVF9URVJNX1JQUywgYnVmX3NwZWMtPnNob3J0X3Rlcm1fcnBzLmJ1Zl9zdGFydCk7CisJV1JJVEVfVlJFRyhIRVZDX1ZQU19CVUZGRVIsIGJ1Zl9zcGVjLT52cHMuYnVmX3N0YXJ0KTsKKwlXUklURV9WUkVHKEhFVkNfU1BTX0JVRkZFUiwgYnVmX3NwZWMtPnNwcy5idWZfc3RhcnQpOworCVdSSVRFX1ZSRUcoSEVWQ19QUFNfQlVGRkVSLCBidWZfc3BlYy0+cHBzLmJ1Zl9zdGFydCk7CisJV1JJVEVfVlJFRyhIRVZDX1NBT19VUCwgYnVmX3NwZWMtPnNhb191cC5idWZfc3RhcnQpOworCWlmIChoZXZjLT5tbXVfZW5hYmxlKSB7CisJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpIHsKKwkJCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTU1VX01BUF9BRERSLCBoZXZjLT5mcmFtZV9tbXVfbWFwX3BoeV9hZGRyKTsKKwkJCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19CVUZNR1JfTU9SRSwKKwkJCQkid3JpdGUgSEVWQ19BU1NJU1RfTU1VX01BUF9BRERSXG4iKTsKKwkJfSBlbHNlCisJCQlXUklURV9WUkVHKEgyNjVfTU1VX01BUF9CVUZGRVIsIGhldmMtPmZyYW1lX21tdV9tYXBfcGh5X2FkZHIpOworCX0gLyplbHNlCisJCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fU1dBUF9CVUZGRVIsCisJCQkJYnVmX3NwZWMtPnN3YXBfYnVmLmJ1Zl9zdGFydCk7CisJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9TV0FQX0JVRkZFUjIsIGJ1Zl9zcGVjLT5zd2FwX2J1ZjIuYnVmX3N0YXJ0KTsqLworCVdSSVRFX1ZSRUcoSEVWQ19TQ0FMRUxVVCwgYnVmX3NwZWMtPnNjYWxlbHV0LmJ1Zl9zdGFydCk7CisjaWZkZWYgSEVWQ184S19MRlRPRkZTRVRfRklYCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKSB7CisJCWlmIChidWZfc3BlYy0+bWF4X3dpZHRoIDw9IDQwOTYgJiYgYnVmX3NwZWMtPm1heF9oZWlnaHQgPD0gMjMwNCkKKwkJCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGRzMsIDB4NDAxMCk7CisJCWVsc2UKKwkJCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGRzMsIDB4ODAyMCk7CisJCS8vV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHMywgMHg4MDgwMjApOyAvKm9mZnNldCBzaG91bGQgeDIgaWYgOGsqLworCQloZXZjX3ByaW50KGhldmMsIEgyNjVfREVCVUdfQlVGTUdSX01PUkUsCisJCQkid3JpdGUgSEVWQ19EQkxLX0NGRzMgdG8gJXhcbiIsIFJFQURfVlJFRyhIRVZDX0RCTEtfQ0ZHMykpOworCX0KKyNlbmRpZgorI2lmZGVmIEgyNjVfMTBCX01NVV9EVworCWlmIChoZXZjLT5kd19tbXVfZW5hYmxlKSB7CisJICAgIC8vV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9NTVVfTUFQX0FERFIyLCBGUkFNRV9NTVVfTUFQX0FERFJfRFcpOworCSAgICBXUklURV9WUkVHKEhFVkNfU0FPX01NVV9ETUFfQ1RSTDIsIGhldmMtPmZyYW1lX2R3X21tdV9tYXBfcGh5X2FkZHIpOworCX0KKyNlbmRpZgorCS8qIGNmZ19wX2FkZHIgKi8KKwlXUklURV9WUkVHKEhFVkNfREJMS19DRkc0LCBidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zdGFydCk7CisJLyogY2ZnX2RfYWRkciAqLworCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGRzUsIGJ1Zl9zcGVjLT5kYmxrX2RhdGEuYnVmX3N0YXJ0KTsKKworCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGR0UsIGJ1Zl9zcGVjLT5kYmxrX2RhdGEyLmJ1Zl9zdGFydCk7CisKKwlXUklURV9WUkVHKExNRU1fRFVNUF9BRFIsICh1MzIpaGV2Yy0+bG1lbV9waHlfYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlcl9jbWRfd3JpdGUodm9pZCkKK3sKKwl1MzIgaTsKKwljb25zdCB1bnNpZ25lZCBzaG9ydCBwYXJzZXJfY21kW1BBUlNFUl9DTURfTlVNQkVSXSA9IHsKKwkJMHgwNDAxLCAweDg0MDEsIDB4MDgwMCwgMHgwNDAyLCAweDkwMDIsIDB4MTQyMywKKwkJMHg4Q0MzLCAweDE0MjMsIDB4ODgwNCwgMHg5ODI1LCAweDA4MDAsIDB4MDRGRSwKKwkJMHg4NDA2LCAweDg0MTEsIDB4MTgwMCwgMHg4NDA4LCAweDg0MDksIDB4OEMyQSwKKwkJMHg5QzJCLCAweDFDMDAsIDB4ODQwRiwgMHg4NDA3LCAweDgwMDAsIDB4ODQwOCwKKwkJMHgyMDAwLCAweEE4MDAsIDB4ODQxMCwgMHgwNERFLCAweDg0MEMsIDB4ODQwRCwKKwkJMHhBQzAwLCAweEEwMDAsIDB4MDhDMCwgMHgwOEUwLCAweEE0MEUsIDB4RkMwMCwKKwkJMHg3QzAwCisJfTsKKwlmb3IgKGkgPSAwOyBpIDwgUEFSU0VSX0NNRF9OVU1CRVI7IGkrKykKKwkJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9DTURfV1JJVEUsIHBhcnNlcl9jbWRbaV0pOworfQorCitzdGF0aWMgdm9pZCBoZXZjX2luaXRfZGVjb2Rlcl9odyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCWludCBkZWNvZGVfcGljX2JlZ2luLCBpbnQgZGVjb2RlX3BpY19udW0pCit7CisJdW5zaWduZWQgaW50IGRhdGEzMjsKKwlpbnQgaTsKKyNpZiAwCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBNRVNPTl9DUFVfTUFKT1JfSURfRzEyQSkgeworCQkvKiBTZXQgTUNSIGZldGNoIHByaW9yaXRpZXMqLworCQlkYXRhMzIgPSAweDEgfCAoMHgxIDw8IDIpIHwgKDB4MSA8PDMpIHwKKwkJCSgyNCA8PCA0KSB8ICgzMiA8PCAxMSkgfCAoMjQgPDwgMTgpIHwgKDMyIDw8IDI1KTsKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0FYSVVSR19DVEwsIGRhdGEzMik7CisJfQorI2VuZGlmCisjaWYgMQorCS8qIG04YmFieSB0ZXN0MTkwMiAqLworCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJIiVzXG4iLCBfX2Z1bmNfXyk7CisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUEFSU0VSX1ZFUlNJT04pOworCWlmIChkYXRhMzIgIT0gMHgwMDAxMDAwMSkgeworCQlwcmludF9zY3JhdGNoX2Vycm9yKDI1KTsKKwkJcmV0dXJuOworCX0KKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX1ZFUlNJT04sIDB4NWE1YTU1YWEpOworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BBUlNFUl9WRVJTSU9OKTsKKwlpZiAoZGF0YTMyICE9IDB4NWE1YTU1YWEpIHsKKwkJcHJpbnRfc2NyYXRjaF9lcnJvcigyNik7CisJCXJldHVybjsKKwl9CisjaWYgMAorCS8qIHRlc3QgUGFyc2VyIFJlc2V0ICovCisJLyogcmVzZXQgaXFpdCB0byBzdGFydCBtZW0gaW5pdCBhZ2FpbiAqLworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMywgKDEgPDwgMTQpIHwKKwkJCSAgICgxIDw8IDMpCS8qIHJlc2V0X3dob2xlIHBhcnNlciAqLworCQkJICApOworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMywgMCk7CS8qIGNsZWFyIHJlc2V0X3dob2xlIHBhcnNlciAqLworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BBUlNFUl9WRVJTSU9OKTsKKwlpZiAoZGF0YTMyICE9IDB4MDAwMTAwMDEpCisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJIlRlc3QgUGFyc2VyIEZhdGFsIEVycm9yXG4iKTsKKyNlbmRpZgorCS8qIHJlc2V0IGlxaXQgdG8gc3RhcnQgbWVtIGluaXQgYWdhaW4gKi8KKwlXUklURV9WUkVHKERPU19TV19SRVNFVDMsICgxIDw8IDE0KQorCQkJICApOworCUNMRUFSX1ZSRUdfTUFTSyhIRVZDX0NBQkFDX0NPTlRST0wsIDEpOworCUNMRUFSX1ZSRUdfTUFTSyhIRVZDX1BBUlNFUl9DT1JFX0NPTlRST0wsIDEpOworCisjZW5kaWYKKwlpZiAoIWhldmMtPm1faW5zX2ZsYWcpIHsKKwkJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0NPTlRST0wpOworCQlkYXRhMzIgPSBkYXRhMzIgfCAoMSA8PCAwKTsgICAgICAvKiBzdHJlYW1fZmV0Y2hfZW5hYmxlICovCisJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpCisJCQlkYXRhMzIgfD0gKDB4ZiA8PCAyNSk7IC8qYXJ3bGVuX2F4aV9tYXgqLworCQlXUklURV9WUkVHKEhFVkNfU1RSRUFNX0NPTlRST0wsIGRhdGEzMik7CisJfQorCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NISUZUX1NUQVJUQ09ERSk7CisJaWYgKGRhdGEzMiAhPSAweDAwMDAwMTAwKSB7CisJCXByaW50X3NjcmF0Y2hfZXJyb3IoMjkpOworCQlyZXR1cm47CisJfQorCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NISUZUX0VNVUxBVEVDT0RFKTsKKwlpZiAoZGF0YTMyICE9IDB4MDAwMDAzMDApIHsKKwkJcHJpbnRfc2NyYXRjaF9lcnJvcigzMCk7CisJCXJldHVybjsKKwl9CisJV1JJVEVfVlJFRyhIRVZDX1NISUZUX1NUQVJUQ09ERSwgMHgxMjM0NTY3OCk7CisJV1JJVEVfVlJFRyhIRVZDX1NISUZUX0VNVUxBVEVDT0RFLCAweDlhYmNkZWYwKTsKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9TVEFSVENPREUpOworCWlmIChkYXRhMzIgIT0gMHgxMjM0NTY3OCkgeworCQlwcmludF9zY3JhdGNoX2Vycm9yKDMxKTsKKwkJcmV0dXJuOworCX0KKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9FTVVMQVRFQ09ERSk7CisJaWYgKGRhdGEzMiAhPSAweDlhYmNkZWYwKSB7CisJCXByaW50X3NjcmF0Y2hfZXJyb3IoMzIpOworCQlyZXR1cm47CisJfQorCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9TVEFSVENPREUsIDB4MDAwMDAxMDApOworCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9FTVVMQVRFQ09ERSwgMHgwMDAwMDMwMCk7CisKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfSU5UX0NPTlRST0wpOworCWRhdGEzMiAmPSAweDAzZmZmZmZmOworCWRhdGEzMiA9IGRhdGEzMiB8ICgzIDw8IDI5KSB8ICgyIDw8IDI2KSB8ICgxIDw8IDI0KQorCQkJIHwJLyogc3RyZWFtX2J1ZmZlcl9lbXB0eV9pbnRfYW1yaXNjX2VuYWJsZSAqLworCQkJICgxIDw8IDIyKSB8CS8qIHN0cmVhbV9maWZvX2VtcHR5X2ludF9hbXJpc2NfZW5hYmxlKi8KKwkJCSAoMSA8PCA3KSB8CS8qIGRlY19kb25lX2ludF9jcHVfZW5hYmxlICovCisJCQkgKDEgPDwgNCkgfAkvKiBzdGFydGNvZGVfZm91bmRfaW50X2NwdV9lbmFibGUgKi8KKwkJCSAoMCA8PCAzKSB8CS8qIHN0YXJ0Y29kZV9mb3VuZF9pbnRfYW1yaXNjX2VuYWJsZSAqLworCQkJICgxIDw8IDApCS8qIHBhcnNlcl9pbnRfZW5hYmxlICovCisJCQkgOworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfSU5UX0NPTlRST0wsIGRhdGEzMik7CisKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9TVEFUVVMpOworCWRhdGEzMiA9IGRhdGEzMiB8ICgxIDw8IDEpIHwJLyogZW11bGF0aW9uX2NoZWNrX29uICovCisJCQkgKDEgPDwgMCkJCS8qIHN0YXJ0Y29kZV9jaGVja19vbiAqLworCQkJIDsKKwlXUklURV9WUkVHKEhFVkNfU0hJRlRfU1RBVFVTLCBkYXRhMzIpOworCisJV1JJVEVfVlJFRyhIRVZDX1NISUZUX0NPTlRST0wsICgzIDw8IDYpIHwvKiBzZnRfdmFsaWRfd3JfcG9zaXRpb24gKi8KKwkJCSAgICgyIDw8IDQpIHwJLyogZW11bGF0ZV9jb2RlX2xlbmd0aF9zdWJfMSAqLworCQkJICAgKDIgPDwgMSkgfAkvKiBzdGFydF9jb2RlX2xlbmd0aF9zdWJfMSAqLworCQkJICAgKDEgPDwgMCkJLyogc3RyZWFtX3NoaWZ0X2VuYWJsZSAqLworCQkJICApOworCisJV1JJVEVfVlJFRyhIRVZDX0NBQkFDX0NPTlRST0wsICgxIDw8IDApCS8qIGNhYmFjX2VuYWJsZSAqLworCQkJICApOworCS8qIGhldmNfcGFyc2VyX2NvcmVfY2xrX2VuICovCisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9DT1JFX0NPTlRST0wsICgxIDw8IDApCisJCQkgICk7CisKKwlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIDApOworCisJLyogSW5pdGlhbCBJUUlUX1NDQUxFTFVUIG1lbW9yeSAtLSBqdXN0IHRvIGF2b2lkIFggaW4gc2ltdWxhdGlvbiAqLworCWlmIChpc19yZG1hX2VuYWJsZSgpKQorCQlyZG1hX2JhY2tfZW5kX3dvcmsoaGV2Yy0+cmRtYV9waHlfYWRyLCBSRE1BX1NJWkUpOworCWVsc2UgeworCQlXUklURV9WUkVHKEhFVkNfSVFJVF9TQ0FMRUxVVF9XUl9BRERSLCAwKTsvKmNmZ19wX2FkZHIqLworCQlmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorCQkJV1JJVEVfVlJFRyhIRVZDX0lRSVRfU0NBTEVMVVRfREFUQSwgMCk7CisJfQorCisjaWZkZWYgRU5BQkxFX1NXQVBfVEVTVAorCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fU1dBUF9URVNULCAxMDApOworI2VuZGlmCisKKwkvKldSSVRFX1ZSRUcoSEVWQ19ERUNPREVfUElDX0JFR0lOX1JFRywgMCk7Ki8KKwkvKldSSVRFX1ZSRUcoSEVWQ19ERUNPREVfUElDX05VTV9SRUcsIDB4ZmZmZmZmZmYpOyovCisJV1JJVEVfVlJFRyhIRVZDX0RFQ09ERV9TSVpFLCAwKTsKKwkvKldSSVRFX1ZSRUcoSEVWQ19ERUNPREVfQ09VTlQsIDApOyovCisJLyogU2VuZCBwYXJzZXJfY21kICovCisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9DTURfV1JJVEUsICgxIDw8IDE2KSB8ICgwIDw8IDApKTsKKworCXBhcnNlcl9jbWRfd3JpdGUoKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfQ01EX1NLSVBfMCwgUEFSU0VSX0NNRF9TS0lQX0NGR18wKTsKKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0NNRF9TS0lQXzEsIFBBUlNFUl9DTURfU0tJUF9DRkdfMSk7CisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9DTURfU0tJUF8yLCBQQVJTRVJfQ01EX1NLSVBfQ0ZHXzIpOworCisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9JRl9DT05UUk9MLAorCQkJICAgLyogKDEgPDwgOCkgfCAvLyBzYW9fc3dfcHJlZF9lbmFibGUgKi8KKwkJCSAgICgxIDw8IDUpIHwJLyogcGFyc2VyX3Nhb19pZl9lbiAqLworCQkJICAgKDEgPDwgMikgfAkvKiBwYXJzZXJfbXByZWRfaWZfZW4gKi8KKwkJCSAgICgxIDw8IDApCS8qIHBhcnNlcl9zY2FsZXJfaWZfZW4gKi8KKwkJCSAgKTsKKworCS8qIENoYW5nZWQgdG8gU3RhcnQgTVBSRUQgaW4gbWljcm9jb2RlICovCisJLyoKKwkgKiAgIGhldmNfcHJpbnQoaGV2YywgMCwgIlt0ZXN0LmNdIFN0YXJ0IE1QUkVEXG4iKTsKKwkgKiAgIFdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9JTlRfU1RBVFVTLAorCSAqICAgKDE8PDMxKQorCSAqICAgKTsKKwkgKi8KKworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX1RPUF9DTlRMLCAoMCA8PCAxKSB8CS8qIGVuYWJsZSBpcHAgKi8KKwkJCSAgICgxIDw8IDApCS8qIHNvZnR3YXJlIHJlc2V0IGlwcCBhbmQgbXBwICovCisJCQkgICk7CisJV1JJVEVfVlJFRyhIRVZDRF9JUFBfVE9QX0NOVEwsICgxIDw8IDEpIHwJLyogZW5hYmxlIGlwcCAqLworCQkJICAgKDAgPDwgMCkJLyogc29mdHdhcmUgcmVzZXQgaXBwIGFuZCBtcHAgKi8KKwkJCSAgKTsKKworCWlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUoaGV2YykgJiAweDEwKQorCQlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMSwKKwkJCTB4MSA8PCAzMSAgLyovRW5hYmxlIE5WMjEgcmVmZXJlbmNlIHJlYWQgbW9kZSBmb3IgTUMqLworCQkJKTsKKworfQorCitzdGF0aWMgdm9pZCBkZWNvZGVyX2h3X3Jlc2V0KHZvaWQpCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IGRhdGEzMjsKKworCS8qIHJlc2V0IGlxaXQgdG8gc3RhcnQgbWVtIGluaXQgYWdhaW4gKi8KKwlXUklURV9WUkVHKERPU19TV19SRVNFVDMsICgxIDw8IDE0KQorCQkJICApOworCUNMRUFSX1ZSRUdfTUFTSyhIRVZDX0NBQkFDX0NPTlRST0wsIDEpOworCUNMRUFSX1ZSRUdfTUFTSyhIRVZDX1BBUlNFUl9DT1JFX0NPTlRST0wsIDEpOworCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0NPTlRST0wpOworCWRhdGEzMiA9IGRhdGEzMiB8ICgxIDw8IDApCS8qIHN0cmVhbV9mZXRjaF9lbmFibGUgKi8KKwkJCSA7CisJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9DT05UUk9MLCBkYXRhMzIpOworCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0hJRlRfU1RBUlRDT0RFKTsKKwlpZiAoZGF0YTMyICE9IDB4MDAwMDAxMDApIHsKKwkJcHJpbnRfc2NyYXRjaF9lcnJvcigyOSk7CisJCXJldHVybjsKKwl9CisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0hJRlRfRU1VTEFURUNPREUpOworCWlmIChkYXRhMzIgIT0gMHgwMDAwMDMwMCkgeworCQlwcmludF9zY3JhdGNoX2Vycm9yKDMwKTsKKwkJcmV0dXJuOworCX0KKwlXUklURV9WUkVHKEhFVkNfU0hJRlRfU1RBUlRDT0RFLCAweDEyMzQ1Njc4KTsKKwlXUklURV9WUkVHKEhFVkNfU0hJRlRfRU1VTEFURUNPREUsIDB4OWFiY2RlZjApOworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NISUZUX1NUQVJUQ09ERSk7CisJaWYgKGRhdGEzMiAhPSAweDEyMzQ1Njc4KSB7CisJCXByaW50X3NjcmF0Y2hfZXJyb3IoMzEpOworCQlyZXR1cm47CisJfQorCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NISUZUX0VNVUxBVEVDT0RFKTsKKwlpZiAoZGF0YTMyICE9IDB4OWFiY2RlZjApIHsKKwkJcHJpbnRfc2NyYXRjaF9lcnJvcigzMik7CisJCXJldHVybjsKKwl9CisJV1JJVEVfVlJFRyhIRVZDX1NISUZUX1NUQVJUQ09ERSwgMHgwMDAwMDEwMCk7CisJV1JJVEVfVlJFRyhIRVZDX1NISUZUX0VNVUxBVEVDT0RFLCAweDAwMDAwMzAwKTsKKworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BBUlNFUl9JTlRfQ09OVFJPTCk7CisJZGF0YTMyICY9IDB4MDNmZmZmZmY7CisJZGF0YTMyID0gZGF0YTMyIHwgKDMgPDwgMjkpIHwgKDIgPDwgMjYpIHwgKDEgPDwgMjQpCisJCQkgfAkvKiBzdHJlYW1fYnVmZmVyX2VtcHR5X2ludF9hbXJpc2NfZW5hYmxlICovCisJCQkgKDEgPDwgMjIpIHwJLypzdHJlYW1fZmlmb19lbXB0eV9pbnRfYW1yaXNjX2VuYWJsZSAqLworCQkJICgxIDw8IDcpIHwJLyogZGVjX2RvbmVfaW50X2NwdV9lbmFibGUgKi8KKwkJCSAoMSA8PCA0KSB8CS8qIHN0YXJ0Y29kZV9mb3VuZF9pbnRfY3B1X2VuYWJsZSAqLworCQkJICgwIDw8IDMpIHwJLyogc3RhcnRjb2RlX2ZvdW5kX2ludF9hbXJpc2NfZW5hYmxlICovCisJCQkgKDEgPDwgMCkJLyogcGFyc2VyX2ludF9lbmFibGUgKi8KKwkJCSA7CisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9JTlRfQ09OVFJPTCwgZGF0YTMyKTsKKworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NISUZUX1NUQVRVUyk7CisJZGF0YTMyID0gZGF0YTMyIHwgKDEgPDwgMSkgfAkvKiBlbXVsYXRpb25fY2hlY2tfb24gKi8KKwkJCSAoMSA8PCAwKQkJLyogc3RhcnRjb2RlX2NoZWNrX29uICovCisJCQkgOworCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9TVEFUVVMsIGRhdGEzMik7CisKKwlXUklURV9WUkVHKEhFVkNfU0hJRlRfQ09OVFJPTCwgKDMgPDwgNikgfC8qIHNmdF92YWxpZF93cl9wb3NpdGlvbiAqLworCQkJICAgKDIgPDwgNCkgfAkvKiBlbXVsYXRlX2NvZGVfbGVuZ3RoX3N1Yl8xICovCisJCQkgICAoMiA8PCAxKSB8CS8qIHN0YXJ0X2NvZGVfbGVuZ3RoX3N1Yl8xICovCisJCQkgICAoMSA8PCAwKQkvKiBzdHJlYW1fc2hpZnRfZW5hYmxlICovCisJCQkgICk7CisKKwlXUklURV9WUkVHKEhFVkNfQ0FCQUNfQ09OVFJPTCwgKDEgPDwgMCkJLyogY2FiYWNfZW5hYmxlICovCisJCQkgICk7CisJLyogaGV2Y19wYXJzZXJfY29yZV9jbGtfZW4gKi8KKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0NPUkVfQ09OVFJPTCwgKDEgPDwgMCkKKwkJCSAgKTsKKworCS8qIEluaXRpYWwgSVFJVF9TQ0FMRUxVVCBtZW1vcnkgLS0ganVzdCB0byBhdm9pZCBYIGluIHNpbXVsYXRpb24gKi8KKwlXUklURV9WUkVHKEhFVkNfSVFJVF9TQ0FMRUxVVF9XUl9BRERSLCAwKTsJLyogY2ZnX3BfYWRkciAqLworCWZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisJCVdSSVRFX1ZSRUcoSEVWQ19JUUlUX1NDQUxFTFVUX0RBVEEsIDApOworCisJLyogU2VuZCBwYXJzZXJfY21kICovCisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9DTURfV1JJVEUsICgxIDw8IDE2KSB8ICgwIDw8IDApKTsKKworCXBhcnNlcl9jbWRfd3JpdGUoKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfQ01EX1NLSVBfMCwgUEFSU0VSX0NNRF9TS0lQX0NGR18wKTsKKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0NNRF9TS0lQXzEsIFBBUlNFUl9DTURfU0tJUF9DRkdfMSk7CisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9DTURfU0tJUF8yLCBQQVJTRVJfQ01EX1NLSVBfQ0ZHXzIpOworCisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9JRl9DT05UUk9MLAorCQkJICAgLyogKDEgPDwgOCkgfCAvLyBzYW9fc3dfcHJlZF9lbmFibGUgKi8KKwkJCSAgICgxIDw8IDUpIHwJLyogcGFyc2VyX3Nhb19pZl9lbiAqLworCQkJICAgKDEgPDwgMikgfAkvKiBwYXJzZXJfbXByZWRfaWZfZW4gKi8KKwkJCSAgICgxIDw8IDApCS8qIHBhcnNlcl9zY2FsZXJfaWZfZW4gKi8KKwkJCSAgKTsKKworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX1RPUF9DTlRMLCAoMCA8PCAxKSB8CS8qIGVuYWJsZSBpcHAgKi8KKwkJCSAgICgxIDw8IDApCS8qIHNvZnR3YXJlIHJlc2V0IGlwcCBhbmQgbXBwICovCisJCQkgICk7CisJV1JJVEVfVlJFRyhIRVZDRF9JUFBfVE9QX0NOVEwsICgxIDw8IDEpIHwJLyogZW5hYmxlIGlwcCAqLworCQkJICAgKDAgPDwgMCkJLyogc29mdHdhcmUgcmVzZXQgaXBwIGFuZCBtcHAgKi8KKwkJCSAgKTsKK30KKworI2lmZGVmIENPTkZJR19IRVZDX0NMS19GT1JDRURfT04KK3N0YXRpYyB2b2lkIGNvbmZpZ19oZXZjX2Nsa19mb3JjZWRfb24odm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgcmRhdGEzMjsKKwkvKiBJUUlUICovCisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX0lRSVRfQ0xLX1JTVF9DVFJMKTsKKwlXUklURV9WUkVHKEhFVkNfSVFJVF9DTEtfUlNUX0NUUkwsIHJkYXRhMzIgfCAoMHgxIDw8IDIpKTsKKworCS8qIERCTEsgKi8KKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfREJMS19DRkcwKTsKKwlXUklURV9WUkVHKEhFVkNfREJMS19DRkcwLCByZGF0YTMyIHwgKDB4MSA8PCAyKSk7CisKKwkvKiBTQU8gKi8KKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkwxKTsKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkwxLCByZGF0YTMyIHwgKDB4MSA8PCAyKSk7CisKKwkvKiBNUFJFRCAqLworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19NUFJFRF9DVFJMMSk7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0NUUkwxLCByZGF0YTMyIHwgKDB4MSA8PCAyNCkpOworCisJLyogUEFSU0VSICovCisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NUUkVBTV9DT05UUk9MKTsKKwlXUklURV9WUkVHKEhFVkNfU1RSRUFNX0NPTlRST0wsIHJkYXRhMzIgfCAoMHgxIDw8IDE1KSk7CisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NISUZUX0NPTlRST0wpOworCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9DT05UUk9MLCByZGF0YTMyIHwgKDB4MSA8PCAxNSkpOworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19DQUJBQ19DT05UUk9MKTsKKwlXUklURV9WUkVHKEhFVkNfQ0FCQUNfQ09OVFJPTCwgcmRhdGEzMiB8ICgweDEgPDwgMTMpKTsKKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0NPUkVfQ09OVFJPTCk7CisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9DT1JFX0NPTlRST0wsIHJkYXRhMzIgfCAoMHgxIDw8IDE1KSk7CisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BBUlNFUl9JTlRfQ09OVFJPTCk7CisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9JTlRfQ09OVFJPTCwgcmRhdGEzMiB8ICgweDEgPDwgMTUpKTsKKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0lGX0NPTlRST0wpOworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfSUZfQ09OVFJPTCwKKwkJCSAgIHJkYXRhMzIgfCAoMHgzIDw8IDUpIHwgKDB4MyA8PCAyKSB8ICgweDMgPDwgMCkpOworCisJLyogSVBQICovCisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDRF9JUFBfRFlOQ0xLR0FURV9DT05GSUcpOworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX0RZTkNMS0dBVEVfQ09ORklHLCByZGF0YTMyIHwgMHhmZmZmZmZmZik7CisKKwkvKiBNQ1JDQyAqLworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMSk7CisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwxLCByZGF0YTMyIHwgKDB4MSA8PCAzKSk7Cit9CisjZW5kaWYKKworI2lmZGVmIE1DUkNDX0VOQUJMRQorc3RhdGljIHZvaWQgY29uZmlnX21jcmNjX2F4aV9odyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLCBpbnQgc2xpY2VfdHlwZSkKK3sKKwl1bnNpZ25lZCBpbnQgcmRhdGEzMjsKKwl1bnNpZ25lZCBpbnQgcmRhdGEzMl8yOworCWludCBsMF9jbnQgPSAwOworCWludCBsMV9jbnQgPSAweDdmZmY7CisKKwlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGhldmMpICYgMHgxMCkgeworCQlsMF9jbnQgPSBoZXZjLT5jdXJfcGljLT5SZWZOdW1fTDA7CisJCWwxX2NudCA9IGhldmMtPmN1cl9waWMtPlJlZk51bV9MMTsKKwl9CisKKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDEsIDB4Mik7CS8qIHJlc2V0IG1jcmNjICovCisKKwlpZiAoc2xpY2VfdHlwZSA9PSAyKSB7CS8qIEktUElDICovCisJCS8qIHJlbW92ZSByZXNldCAtLSBkaXNhYmxlcyBjbG9jayAqLworCQlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDEsIDB4MCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc2xpY2VfdHlwZSA9PSAwKSB7CS8qIEItUElDICovCisJCS8qIFByb2dyYW1tZSBjYW52YXMwICovCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfQUNDQ09ORklHX0FERFIsCisJCQkJICAgKDAgPDwgOCkgfCAoMCA8PCAxKSB8IDApOworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUik7CisJCXJkYXRhMzIgPSByZGF0YTMyICYgMHhmZmZmOworCQlyZGF0YTMyID0gcmRhdGEzMiB8IChyZGF0YTMyIDw8IDE2KTsKKwkJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwyLCByZGF0YTMyKTsKKworCQkvKiBQcm9ncmFtbWUgY2FudmFzMSAqLworCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0FDQ0NPTkZJR19BRERSLAorCQkJCSAgICgxNiA8PCA4KSB8ICgxIDw8IDEpIHwgMCk7CisJCXJkYXRhMzJfMiA9IFJFQURfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIpOworCQlyZGF0YTMyXzIgPSByZGF0YTMyXzIgJiAweGZmZmY7CisJCXJkYXRhMzJfMiA9IHJkYXRhMzJfMiB8IChyZGF0YTMyXzIgPDwgMTYpOworCQlpZiAocmRhdGEzMiA9PSByZGF0YTMyXzIgJiYgbDFfY250ID4gMSkgeworCQkJcmRhdGEzMl8yID0gUkVBRF9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUik7CisJCQlyZGF0YTMyXzIgPSByZGF0YTMyXzIgJiAweGZmZmY7CisJCQlyZGF0YTMyXzIgPSByZGF0YTMyXzIgfCAocmRhdGEzMl8yIDw8IDE2KTsKKwkJfQorCQlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDMsIHJkYXRhMzJfMik7CisJfSBlbHNlIHsJCS8qIFAtUElDICovCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfQUNDQ09ORklHX0FERFIsCisJCQkJICAgKDAgPDwgOCkgfCAoMSA8PCAxKSB8IDApOworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUik7CisJCXJkYXRhMzIgPSByZGF0YTMyICYgMHhmZmZmOworCQlyZGF0YTMyID0gcmRhdGEzMiB8IChyZGF0YTMyIDw8IDE2KTsKKwkJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwyLCByZGF0YTMyKTsKKworCQlpZiAobDBfY250ID09IDEpIHsKKwkJCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMywgcmRhdGEzMik7CisJCX0gZWxzZSB7CisJCQkvKiBQcm9ncmFtbWUgY2FudmFzMSAqLworCQkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIpOworCQkJcmRhdGEzMiA9IHJkYXRhMzIgJiAweGZmZmY7CisJCQlyZGF0YTMyID0gcmRhdGEzMiB8IChyZGF0YTMyIDw8IDE2KTsKKwkJCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMywgcmRhdGEzMik7CisJCX0KKwl9CisJLyogZW5hYmxlIG1jcmNjIHByb2dyZXNzaXZlLW1vZGUgKi8KKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDEsIDB4ZmYwKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBjb25maWdfdGl0bGVfaHcoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywgaW50IHNhb192Yl9zaXplLAorCQkJCQkJCWludCBzYW9fbWVtX3VuaXQpCit7CisJV1JJVEVfVlJFRyhIRVZDX3Nhb19tZW1fdW5pdCwgc2FvX21lbV91bml0KTsKKwlXUklURV9WUkVHKEhFVkNfU0FPX0FCViwgaGV2Yy0+d29ya19zcGFjZV9idWYtPnNhb19hYnYuYnVmX3N0YXJ0KTsKKwlXUklURV9WUkVHKEhFVkNfc2FvX3ZiX3NpemUsIHNhb192Yl9zaXplKTsKKwlXUklURV9WUkVHKEhFVkNfU0FPX1ZCLCBoZXZjLT53b3JrX3NwYWNlX2J1Zi0+c2FvX3ZiLmJ1Zl9zdGFydCk7Cit9CisKK3N0YXRpYyB1MzIgaW5pdF9hdXhfc2l6ZTsKK3N0YXRpYyBpbnQgYXV4X2RhdGFfaXNfYXZhaWJsZShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCXUzMiByZWdfdmFsOworCisJcmVnX3ZhbCA9IFJFQURfVlJFRyhIRVZDX0FVWF9EQVRBX1NJWkUpOworCWlmIChyZWdfdmFsICE9IDAgJiYgcmVnX3ZhbCAhPSBpbml0X2F1eF9zaXplKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjb25maWdfYXV4X2J1ZihzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCVdSSVRFX1ZSRUcoSEVWQ19BVVhfQURSLCBoZXZjLT5hdXhfcGh5X2FkZHIpOworCWluaXRfYXV4X3NpemUgPSAoKGhldmMtPnByZWZpeF9hdXhfc2l6ZSA+PiA0KSA8PCAxNikgfAorCQkoaGV2Yy0+c3VmZml4X2F1eF9zaXplID4+IDQpOworCVdSSVRFX1ZSRUcoSEVWQ19BVVhfREFUQV9TSVpFLCBpbml0X2F1eF9zaXplKTsKK30KKworc3RhdGljIHZvaWQgY29uZmlnX21wcmVkX2h3KHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IGRhdGEzMjsKKwlzdHJ1Y3QgUElDX3MgKmN1cl9waWMgPSBoZXZjLT5jdXJfcGljOworCXN0cnVjdCBQSUNfcyAqY29sX3BpYyA9IGhldmMtPmNvbF9waWM7CisJaW50IEFNVlBfTUFYX05VTV9DQU5EU19NRU0gPSAzOworCWludCBBTVZQX01BWF9OVU1fQ0FORFMgPSAyOworCWludCBOVU1fQ0hST01BX01PREUgPSA1OworCWludCBETV9DSFJPTUFfSURYID0gMzY7CisJaW50IGFib3ZlX3B0cl9jdHJsID0gMDsKKwlpbnQgYnVmZmVyX2xpbmVhciA9IDE7CisJaW50IGN1X3NpemVfbG9nMiA9IDM7CisKKwlpbnQgbXByZWRfbXZfcmRfc3RhcnRfYWRkcjsKKwlpbnQgbXByZWRfY3Vycl9sY3VfeDsKKwlpbnQgbXByZWRfY3Vycl9sY3VfeTsKKwlpbnQgbXByZWRfYWJvdmVfYnVmX3N0YXJ0OworCWludCBtcHJlZF9tdl9yZF9wdHI7CisJaW50IG1wcmVkX212X3JkX3B0cl9wMTsKKwlpbnQgbXByZWRfbXZfcmRfZW5kX2FkZHI7CisJaW50IE1WX01FTV9VTklUOworCWludCBtcHJlZF9tdl93cl9wdHI7CisJaW50ICpyZWZfcG9jX0wwLCAqcmVmX3BvY19MMTsKKworCWludCBhYm92ZV9lbjsKKwlpbnQgbXZfd3JfZW47CisJaW50IG12X3JkX2VuOworCWludCBjb2xfaXNJbnRyYTsKKworCWlmIChoZXZjLT5zbGljZV90eXBlICE9IDIpIHsKKwkJYWJvdmVfZW4gPSAxOworCQltdl93cl9lbiA9IDE7CisJCW12X3JkX2VuID0gMTsKKwkJY29sX2lzSW50cmEgPSAwOworCX0gZWxzZSB7CisJCWFib3ZlX2VuID0gMTsKKwkJbXZfd3JfZW4gPSAxOworCQltdl9yZF9lbiA9IDA7CisJCWNvbF9pc0ludHJhID0gMDsKKwl9CisKKwltcHJlZF9tdl9yZF9zdGFydF9hZGRyID0gY29sX3BpYy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkcjsKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19NUFJFRF9DVVJSX0xDVSk7CisJbXByZWRfY3Vycl9sY3VfeCA9IGRhdGEzMiAmIDB4ZmZmZjsKKwltcHJlZF9jdXJyX2xjdV95ID0gKGRhdGEzMiA+PiAxNikgJiAweGZmZmY7CisKKwlNVl9NRU1fVU5JVCA9CisJCWhldmMtPmxjdV9zaXplX2xvZzIgPT0gNiA/IDB4MjAwIDogaGV2Yy0+bGN1X3NpemVfbG9nMiA9PQorCQk1ID8gMHg4MCA6IDB4MjA7CisJbXByZWRfbXZfcmRfcHRyID0KKwkJbXByZWRfbXZfcmRfc3RhcnRfYWRkciArIChoZXZjLT5zbGljZV9hZGRyICogTVZfTUVNX1VOSVQpOworCisJbXByZWRfbXZfcmRfcHRyX3AxID0gbXByZWRfbXZfcmRfcHRyICsgTVZfTUVNX1VOSVQ7CisJbXByZWRfbXZfcmRfZW5kX2FkZHIgPQorCQltcHJlZF9tdl9yZF9zdGFydF9hZGRyICsKKwkJY29sX3BpYy0+bXZfc2l6ZTsKKwkJLy8oKGhldmMtPmxjdV94X251bSAqIGhldmMtPmxjdV95X251bSkgKiBNVl9NRU1fVU5JVCk7CisKKwltcHJlZF9hYm92ZV9idWZfc3RhcnQgPSBoZXZjLT53b3JrX3NwYWNlX2J1Zi0+bXByZWRfYWJvdmUuYnVmX3N0YXJ0OworCisJbXByZWRfbXZfd3JfcHRyID0KKwkJY3VyX3BpYy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkciArCisJCShoZXZjLT5zbGljZV9hZGRyICogTVZfTUVNX1VOSVQpOworCisJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKSB7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJjdXIgcGljIGluZGV4ICVkICBjb2wgcGljIGluZGV4ICVkXG4iLCBjdXJfcGljLT5pbmRleCwKKwkJCWNvbF9waWMtPmluZGV4KTsKKwl9CisKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfV1JfU1RBUlRfQUREUiwKKwkJCSAgIGN1cl9waWMtPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIpOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9NVl9SRF9TVEFSVF9BRERSLCBtcHJlZF9tdl9yZF9zdGFydF9hZGRyKTsKKworCWRhdGEzMiA9ICgoaGV2Yy0+bGN1X3hfbnVtIC0gaGV2Yy0+dGlsZV93aWR0aF9sY3UpICogTVZfTUVNX1VOSVQpOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9NVl9XUl9ST1dfSlVNUCwgZGF0YTMyKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfUkRfUk9XX0pVTVAsIGRhdGEzMik7CisKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19NUFJFRF9DVFJMMCk7CisJZGF0YTMyID0gKChoZXZjLT5zbGljZV90eXBlICYgMykgfAorCQkJICAoaGV2Yy0+bmV3X3BpYyAmIDEpIDw8IDIgfAorCQkJICAoaGV2Yy0+bmV3X3RpbGUgJiAxKSA8PCAzIHwKKwkJCSAgKGhldmMtPmlzTmV4dFNsaWNlU2VnbWVudCAgJiAxKTw8IDQgfAorCQkJICAoaGV2Yy0+VE1WUEZsYWcgICYgMSk8PCA1IHwKKwkJCSAgKGhldmMtPkxEQ0ZsYWcgJiAxKSA8PCA2IHwKKwkJCSAgKGhldmMtPkNvbEZyb21MMEZsYWcgJiAxKTw8IDcgfAorCQkJICAoYWJvdmVfcHRyX2N0cmwgJiAxKTw8IDggfAorCQkJICAoYWJvdmVfZW4gICYgMSkgPDwgOSB8CisJCQkgIChtdl93cl9lbiAmIDEpIDw8IDEwIHwKKwkJCSAgKG12X3JkX2VuICAmIDEpPDwgMTEgfAorCQkJICAoY29sX2lzSW50cmEgJiAxKTw8IDEyIHwKKwkJCSAgKGJ1ZmZlcl9saW5lYXIgJiAxKTw8IDEzIHwKKwkJCSAgKGhldmMtPkxvbmdUZXJtX0N1cnIgJiAxKSA8PCAxNCB8CisJCQkgIChoZXZjLT5Mb25nVGVybV9Db2wgJiAxKSA8PCAxNSB8CisJCQkgIChoZXZjLT5sY3Vfc2l6ZV9sb2cyICYgMHhmKSA8PCAxNiB8CisJCQkgIChjdV9zaXplX2xvZzIgICYgMHhmKSA8PCAyMCB8IChoZXZjLT5wbGV2ZWwgJiAweDcpIDw8IDI0KTsKKwlkYXRhMzIgJj0gIH4oMTw8IDI4KTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfQ1RSTDAsIGRhdGEzMik7CisKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19NUFJFRF9DVFJMMSk7CisJZGF0YTMyID0gKAorI2lmIDAKKwkJCS8qIG5vIHNldCBpbiBtOGJhYnkgdGVzdDE5MDIgKi8KKwkJCS8qIERvbid0IG92ZXJyaWRlIGNsa19mb3JjZWRfb24gLCAqLworCQkJKGRhdGEzMiAmICgweDEgPDwgMjQpKSB8CisjZW5kaWYKKwkJCQkgaGV2Yy0+TWF4TnVtTWVyZ2VDYW5kIHwKKwkJCQkgQU1WUF9NQVhfTlVNX0NBTkRTIDw8IDQgfAorCQkJCSBBTVZQX01BWF9OVU1fQ0FORFNfTUVNIDw8IDggfAorCQkJCSBOVU1fQ0hST01BX01PREUgPDwgMTIgfCBETV9DSFJPTUFfSURYIDw8IDE2KTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfQ1RSTDEsIGRhdGEzMik7CisKKwlkYXRhMzIgPSAoaGV2Yy0+cGljX3cgfCBoZXZjLT5waWNfaCA8PCAxNik7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX1BJQ19TSVpFLCBkYXRhMzIpOworCisJZGF0YTMyID0gKChoZXZjLT5sY3VfeF9udW0gLSAxKSB8IChoZXZjLT5sY3VfeV9udW0gLSAxKSA8PCAxNik7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX1BJQ19TSVpFX0xDVSwgZGF0YTMyKTsKKworCWRhdGEzMiA9IChoZXZjLT50aWxlX3N0YXJ0X2xjdV94IHwgaGV2Yy0+dGlsZV9zdGFydF9sY3VfeSA8PCAxNik7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX1RJTEVfU1RBUlQsIGRhdGEzMik7CisKKwlkYXRhMzIgPSAoaGV2Yy0+dGlsZV93aWR0aF9sY3UgfCBoZXZjLT50aWxlX2hlaWdodF9sY3UgPDwgMTYpOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9USUxFX1NJWkVfTENVLCBkYXRhMzIpOworCisJZGF0YTMyID0gKGhldmMtPlJlZk51bV9MMCB8IGhldmMtPlJlZk51bV9MMSA8PCA4IHwgMAorCQkJICAvKiBjb2xfUmVmTnVtX0wwPDwxNnwgKi8KKwkJCSAgLyogY29sX1JlZk51bV9MMTw8MjQgKi8KKwkJCSApOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9SRUZfTlVNLCBkYXRhMzIpOworCisjaWZkZWYgU1VQUE9SVF9MT05HX1RFUk1fUlBTCisJZGF0YTMyID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgaGV2Yy0+UmVmTnVtX0wwOyBpKyspIHsKKwkJaWYgKGlzX3JlZl9sb25nX3Rlcm0oaGV2YywKKwkJCWN1cl9waWMtPm1fYWlSZWZQT0NMaXN0MAorCQkJCVtjdXJfcGljLT5zbGljZV9pZHhdW2ldKSkKKwkJCWRhdGEzMiA9IGRhdGEzMiB8ICgxIDw8IGkpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgaGV2Yy0+UmVmTnVtX0wxOyBpKyspIHsKKwkJaWYgKGlzX3JlZl9sb25nX3Rlcm0oaGV2YywKKwkJCWN1cl9waWMtPm1fYWlSZWZQT0NMaXN0MQorCQkJCVtjdXJfcGljLT5zbGljZV9pZHhdW2ldKSkKKwkJCWRhdGEzMiA9IGRhdGEzMiB8ICgxIDw8IChpICsgMTYpKTsKKwl9CisJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKSB7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJMb25nVGVybV9SZWYgMHgleFxuIiwgZGF0YTMyKTsKKwl9CisjZWxzZQorCWRhdGEzMiA9IGhldmMtPkxvbmdUZXJtX1JlZjsKKyNlbmRpZgorCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MVF9SRUYsIGRhdGEzMik7CisKKwlkYXRhMzIgPSAwOworCWZvciAoaSA9IDA7IGkgPCBoZXZjLT5SZWZOdW1fTDA7IGkrKykKKwkJZGF0YTMyID0gZGF0YTMyIHwgKDEgPDwgaSk7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX1JFRl9FTl9MMCwgZGF0YTMyKTsKKworCWRhdGEzMiA9IDA7CisJZm9yIChpID0gMDsgaSA8IGhldmMtPlJlZk51bV9MMTsgaSsrKQorCQlkYXRhMzIgPSBkYXRhMzIgfCAoMSA8PCBpKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfUkVGX0VOX0wxLCBkYXRhMzIpOworCisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0NVUl9QT0MsIGhldmMtPmN1cnJfUE9DKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfQ09MX1BPQywgaGV2Yy0+Q29sX1BPQyk7CisKKwkvKiBiZWxvdyBNUFJFRCBSZWZfUE9DX3h4X0x4IHJlZ2lzdGVycyBtdXN0IGZvbGxvdyBSZWZfUE9DX3h4X0wwIC0+CisJICogICBSZWZfUE9DX3h4X0wxIGluIHBhaXIgd3JpdGUgb3JkZXIhISEKKwkgKi8KKwlyZWZfcG9jX0wwID0gJihjdXJfcGljLT5tX2FpUmVmUE9DTGlzdDBbY3VyX3BpYy0+c2xpY2VfaWR4XVswXSk7CisJcmVmX3BvY19MMSA9ICYoY3VyX3BpYy0+bV9haVJlZlBPQ0xpc3QxW2N1cl9waWMtPnNsaWNlX2lkeF1bMF0pOworCisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wwX1JFRjAwX1BPQywgcmVmX3BvY19MMFswXSk7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wxX1JFRjAwX1BPQywgcmVmX3BvY19MMVswXSk7CisKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDBfUkVGMDFfUE9DLCByZWZfcG9jX0wwWzFdKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDFfUkVGMDFfUE9DLCByZWZfcG9jX0wxWzFdKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMF9SRUYwMl9QT0MsIHJlZl9wb2NfTDBbMl0pOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMV9SRUYwMl9QT0MsIHJlZl9wb2NfTDFbMl0pOworCisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wwX1JFRjAzX1BPQywgcmVmX3BvY19MMFszXSk7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wxX1JFRjAzX1BPQywgcmVmX3BvY19MMVszXSk7CisKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDBfUkVGMDRfUE9DLCByZWZfcG9jX0wwWzRdKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDFfUkVGMDRfUE9DLCByZWZfcG9jX0wxWzRdKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMF9SRUYwNV9QT0MsIHJlZl9wb2NfTDBbNV0pOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMV9SRUYwNV9QT0MsIHJlZl9wb2NfTDFbNV0pOworCisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wwX1JFRjA2X1BPQywgcmVmX3BvY19MMFs2XSk7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wxX1JFRjA2X1BPQywgcmVmX3BvY19MMVs2XSk7CisKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDBfUkVGMDdfUE9DLCByZWZfcG9jX0wwWzddKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDFfUkVGMDdfUE9DLCByZWZfcG9jX0wxWzddKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMF9SRUYwOF9QT0MsIHJlZl9wb2NfTDBbOF0pOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMV9SRUYwOF9QT0MsIHJlZl9wb2NfTDFbOF0pOworCisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wwX1JFRjA5X1BPQywgcmVmX3BvY19MMFs5XSk7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wxX1JFRjA5X1BPQywgcmVmX3BvY19MMVs5XSk7CisKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDBfUkVGMTBfUE9DLCByZWZfcG9jX0wwWzEwXSk7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wxX1JFRjEwX1BPQywgcmVmX3BvY19MMVsxMF0pOworCisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wwX1JFRjExX1BPQywgcmVmX3BvY19MMFsxMV0pOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMV9SRUYxMV9QT0MsIHJlZl9wb2NfTDFbMTFdKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMF9SRUYxMl9QT0MsIHJlZl9wb2NfTDBbMTJdKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDFfUkVGMTJfUE9DLCByZWZfcG9jX0wxWzEyXSk7CisKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDBfUkVGMTNfUE9DLCByZWZfcG9jX0wwWzEzXSk7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wxX1JFRjEzX1BPQywgcmVmX3BvY19MMVsxM10pOworCisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wwX1JFRjE0X1BPQywgcmVmX3BvY19MMFsxNF0pOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMV9SRUYxNF9QT0MsIHJlZl9wb2NfTDFbMTRdKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMF9SRUYxNV9QT0MsIHJlZl9wb2NfTDBbMTVdKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDFfUkVGMTVfUE9DLCByZWZfcG9jX0wxWzE1XSk7CisKKwlpZiAoaGV2Yy0+bmV3X3BpYykgeworCQlXUklURV9WUkVHKEhFVkNfTVBSRURfQUJWX1NUQVJUX0FERFIsIG1wcmVkX2Fib3ZlX2J1Zl9zdGFydCk7CisJCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9NVl9XUFRSLCBtcHJlZF9tdl93cl9wdHIpOworCQkvKiBXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfUlBUUixtcHJlZF9tdl9yZF9wdHIpOyAqLworCQlXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfUlBUUiwgbXByZWRfbXZfcmRfc3RhcnRfYWRkcik7CisJfSBlbHNlIGlmICghaGV2Yy0+aXNOZXh0U2xpY2VTZWdtZW50KSB7CisJCS8qIFdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9NVl9SUFRSLG1wcmVkX212X3JkX3B0cl9wMSk7ICovCisJCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9NVl9SUFRSLCBtcHJlZF9tdl9yZF9wdHIpOworCX0KKworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9NVl9SRF9FTkRfQUREUiwgbXByZWRfbXZfcmRfZW5kX2FkZHIpOworfQorCitzdGF0aWMgdm9pZCBjb25maWdfc2FvX2h3KHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsIHVuaW9uIHBhcmFtX3UgKnBhcmFtcykKK3sKKwl1bnNpZ25lZCBpbnQgZGF0YTMyLCBkYXRhMzJfMjsKKwlpbnQgbWlzY19mbGFnMCA9IGhldmMtPm1pc2NfZmxhZzA7CisJaW50IHNsaWNlX2RlYmxvY2tpbmdfZmlsdGVyX2Rpc2FibGVkX2ZsYWcgPSAwOworCisJaW50IG1jX2J1ZmZlcl9zaXplX3VfdiA9CisJCWhldmMtPmxjdV90b3RhbCAqIGhldmMtPmxjdV9zaXplICogaGV2Yy0+bGN1X3NpemUgLyAyOworCWludCBtY19idWZmZXJfc2l6ZV91X3ZfaCA9IChtY19idWZmZXJfc2l6ZV91X3YgKyAweGZmZmYpID4+IDE2OworCXN0cnVjdCBQSUNfcyAqY3VyX3BpYyA9IGhldmMtPmN1cl9waWM7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICogdjRsMl9jdHggPSBoZXZjLT52NGwyX2N0eDsKKwlpbnQgZHdfbW9kZSA9IGdldF9kb3VibGVfd3JpdGVfbW9kZShoZXZjKTsKKworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMMCk7CisJZGF0YTMyICY9ICh+MHhmKTsKKwlkYXRhMzIgfD0gaGV2Yy0+bGN1X3NpemVfbG9nMjsKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkwwLCBkYXRhMzIpOworCisJZGF0YTMyID0gKGhldmMtPnBpY193IHwgaGV2Yy0+cGljX2ggPDwgMTYpOworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fUElDX1NJWkUsIGRhdGEzMik7CisKKwlkYXRhMzIgPSAoKGhldmMtPmxjdV94X251bSAtIDEpIHwgKGhldmMtPmxjdV95X251bSAtIDEpIDw8IDE2KTsKKwlXUklURV9WUkVHKEhFVkNfU0FPX1BJQ19TSVpFX0xDVSwgZGF0YTMyKTsKKworCWlmIChoZXZjLT5uZXdfcGljKQorCQlXUklURV9WUkVHKEhFVkNfU0FPX1lfU1RBUlRfQUREUiwgMHhmZmZmZmZmZik7CisjaWZkZWYgTE9TTEVTU19DT01QUkVTU19NT0RFCisvKlNVUFBPUlRfMTBCSVQqLworCWlmICgoZHdfbW9kZSAmIDB4MTApID09IDApIHsKKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDcpCisJCQlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkwyNiwgMCk7CisKKwkJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkw1KTsKKwkJZGF0YTMyICY9ICh+KDB4ZmYgPDwgMTYpKTsKKwkJaWYgKCgoZHdfbW9kZSAmIDB4ZikgPT0gOCkgfHwKKwkJCSgoZHdfbW9kZSAmIDB4ZikgPT0gOSkpIHsKKwkJCWRhdGEzMiB8PSAoMHhmZiA8PCAxNik7CisJCQlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw1LCBkYXRhMzIpOworCQkJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMMjYsIDB4Zik7CisJCX0gZWxzZSB7CisJCQlpZiAoKGR3X21vZGUgJiAweGYpID09IDIgfHwKKwkJCQkoZHdfbW9kZSAmIDB4ZikgPT0gMykKKwkJCQlkYXRhMzIgfD0gKDB4ZmY8PDE2KTsKKwkJCWVsc2UgaWYgKChkd19tb2RlICYgMHhmKSA9PSA0IHx8CisJCQkJKGR3X21vZGUgJiAweGYpID09IDUpCisJCQkJZGF0YTMyIHw9ICgweDMzPDwxNik7CisKKwkJCWlmIChoZXZjLT5tZW1fc2F2aW5nX21vZGUgPT0gMSkKKwkJCQlkYXRhMzIgfD0gKDEgPDwgOSk7CisJCQllbHNlCisJCQkJZGF0YTMyICY9IH4oMSA8PCA5KTsKKwkJCWlmICh3b3JrYXJvdW5kX2VuYWJsZSAmIDEpCisJCQkJZGF0YTMyIHw9ICgxIDw8IDcpOworCQkJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMNSwgZGF0YTMyKTsKKwkJfQorCX0KKwlkYXRhMzIgPSBjdXJfcGljLT5tY195X2FkcjsKKwlpZiAoZHdfbW9kZSAmJiAoKGR3X21vZGUgJiAweDIwKSA9PSAwKSkKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19ZX1NUQVJUX0FERFIsIGN1cl9waWMtPmR3X3lfYWRyKTsKKworCWlmICgoZHdfbW9kZSAmIDB4MTApID09IDApCisJCVdSSVRFX1ZSRUcoSEVWQ19DTV9CT0RZX1NUQVJUX0FERFIsIGRhdGEzMik7CisKKwlpZiAoaGV2Yy0+bW11X2VuYWJsZSkKKwkJV1JJVEVfVlJFRyhIRVZDX0NNX0hFQURFUl9TVEFSVF9BRERSLCBjdXJfcGljLT5oZWFkZXJfYWRyKTsKKyNpZmRlZiBIMjY1XzEwQl9NTVVfRFcKKwlpZiAoaGV2Yy0+ZHdfbW11X2VuYWJsZSkgeworCQlXUklURV9WUkVHKEhFVkNfU0FPX1lfU1RBUlRfQUREUiwgMCk7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ19TVEFSVF9BRERSLCAwKTsKKwkJV1JJVEVfVlJFRyhIRVZDX0NNX0hFQURFUl9TVEFSVF9BRERSMiwgY3VyX3BpYy0+aGVhZGVyX2R3X2Fkcik7CisJfQorI2VuZGlmCisjZWxzZQorCWRhdGEzMiA9IGN1cl9waWMtPm1jX3lfYWRyOworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fWV9TVEFSVF9BRERSLCBkYXRhMzIpOworI2VuZGlmCisJZGF0YTMyID0gKG1jX2J1ZmZlcl9zaXplX3Vfdl9oIDw8IDE2KSA8PCAxOworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fWV9MRU5HVEgsIGRhdGEzMik7CisKKyNpZmRlZiBMT1NMRVNTX0NPTVBSRVNTX01PREUKKy8qU1VQUE9SVF8xMEJJVCovCisJaWYgKGR3X21vZGUgJiYgKChkd19tb2RlICYgMHgyMCkgPT0gMCkpCisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ19TVEFSVF9BRERSLCBjdXJfcGljLT5kd191X3ZfYWRyKTsKKyNlbHNlCisJZGF0YTMyID0gY3VyX3BpYy0+bWNfdV92X2FkcjsKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NfU1RBUlRfQUREUiwgZGF0YTMyKTsKKyNlbmRpZgorCWRhdGEzMiA9IChtY19idWZmZXJfc2l6ZV91X3ZfaCA8PCAxNik7CisJV1JJVEVfVlJFRyhIRVZDX1NBT19DX0xFTkdUSCwgZGF0YTMyKTsKKworCWlmIChoZXZjLT5pc191c2VkX3Y0bCkgeworCQlXUklURV9WUkVHKEhFVkNfU0FPX1lfTEVOR1RILCBjdXJfcGljLT5sdW1hX3NpemUpOworCQlXUklURV9WUkVHKEhFVkNfU0FPX0NfTEVOR1RILCBjdXJfcGljLT5jaHJvbWFfc2l6ZSk7CisJCWlmIChkZWJ1ZyAmIFBSSU5UX0ZMQUdfVjRMX0RFVEFJTCkgeworCQkJcHJfaW5mbygiWyVkXSBjb25maWcgcGljLCBpZDogJWQsIFk6KCV4LCAlZCkgQzooJXgsICVkKS5cbiIsCisJCQkJdjRsMl9jdHgtPmlkLCBjdXJfcGljLT5pbmRleCwKKwkJCQljdXJfcGljLT5kd195X2FkciwgY3VyX3BpYy0+bHVtYV9zaXplLAorCQkJCWN1cl9waWMtPmR3X3Vfdl9hZHIsIGN1cl9waWMtPmNocm9tYV9zaXplKTsKKwkJfQorCX0KKworI2lmZGVmIExPU0xFU1NfQ09NUFJFU1NfTU9ERQorLypTVVBQT1JUXzEwQklUKi8KKwlpZiAoZHdfbW9kZSAmJiAoKGR3X21vZGUgJiAweDIwKSA9PSAwKSkgeworCQlXUklURV9WUkVHKEhFVkNfU0FPX1lfV1BUUiwgY3VyX3BpYy0+ZHdfeV9hZHIpOworCQlXUklURV9WUkVHKEhFVkNfU0FPX0NfV1BUUiwgY3VyX3BpYy0+ZHdfdV92X2Fkcik7CisJfQorI2Vsc2UKKwkvKiBtdWx0aSB0aWxlIHRvIGRvLi4uICovCisJZGF0YTMyID0gY3VyX3BpYy0+bWNfeV9hZHI7CisJV1JJVEVfVlJFRyhIRVZDX1NBT19ZX1dQVFIsIGRhdGEzMik7CisKKwlkYXRhMzIgPSBjdXJfcGljLT5tY191X3ZfYWRyOworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ19XUFRSLCBkYXRhMzIpOworI2VuZGlmCisJLyogREJMSyBDT05GSUcgSEVSRSAqLworCWlmIChoZXZjLT5uZXdfcGljKSB7CisJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpIHsKKwkJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkKKwkJCQlkYXRhMzIgPSAoMHhmZiA8PCA4KSB8ICgweDAgIDw8IDApOworCQkJZWxzZQorCQkJCWRhdGEzMiA9ICgweDU3IDw8IDgpIHwgIC8qIDFzdC8ybmQgd3JpdGUgYm90aCBlbmFibGUqLworCQkJCQkoMHgwICA8PCAwKTsgICAvKiBoMjY1IHZpZGVvIGZvcm1hdCovCisKKwkJCWlmIChoZXZjLT5waWNfdyA+PSAxMjgwKQorCQkJCWRhdGEzMiB8PSAoMHgxIDw8IDQpOyAvKmRibGsgcGlwZWxpbmUgbW9kZT0xIGZvciBwZXJmb3JtYW5jZSovCisJCQlkYXRhMzIgJj0gKH4weDMwMCk7IC8qWzhdOmZpcnN0IHdyaXRlIGVuYWJsZSAoY29tcHJlc3MpICBbOV06ZG91YmxlIHdyaXRlIGVuYWJsZSAodW5jb21wcmVzcykqLworCQkJaWYgKGR3X21vZGUgPT0gMCkKKwkJCQlkYXRhMzIgfD0gKDB4MSA8PCA4KTsgLyplbmFibGUgZmlyc3Qgd3JpdGUqLworCQkJZWxzZSBpZiAoZHdfbW9kZSA9PSAweDEwKQorCQkJCWRhdGEzMiB8PSAoMHgxIDw8IDkpOyAvKmRvdWJsZSB3cml0ZSBvbmx5Ki8KKwkJCWVsc2UKKwkJCQlkYXRhMzIgfD0gKCgweDEgPDwgOCkgIHwoMHgxIDw8IDkpKTsKKworCQkJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHQiwgZGF0YTMyKTsKKwkJCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19CVUZNR1JfTU9SRSwKKwkJCQkiW0RCTEsgREVCVUddIEhFVkMxIENGR0IgOiAweCV4XG4iLCBkYXRhMzIpOworCQl9CisJCWRhdGEzMiA9IChoZXZjLT5waWNfdyB8IGhldmMtPnBpY19oIDw8IDE2KTsKKwkJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHMiwgZGF0YTMyKTsKKworCQlpZiAoKG1pc2NfZmxhZzAgPj4gUENNX0VOQUJMRV9GTEFHX0JJVCkgJiAweDEpIHsKKwkJCWRhdGEzMiA9CisJCQkJKChtaXNjX2ZsYWcwID4+CisJCQkJICBQQ01fTE9PUF9GSUxURVJfRElTQUJMRURfRkxBR19CSVQpICYKKwkJCQkgMHgxKSA8PCAzOworCQl9IGVsc2UKKwkJCWRhdGEzMiA9IDA7CisJCWRhdGEzMiB8PQorCQkJKCgocGFyYW1zLT5wLnBwc19jYl9xcF9vZmZzZXQgJiAweDFmKSA8PCA0KSB8CisJCQkgKChwYXJhbXMtPnAucHBzX2NyX3FwX29mZnNldAorCQkJICAgJiAweDFmKSA8PAorCQkJICA5KSk7CisJCWRhdGEzMiB8PQorCQkJKGhldmMtPmxjdV9zaXplID09CisJCQkgNjQpID8gMCA6ICgoaGV2Yy0+bGN1X3NpemUgPT0gMzIpID8gMSA6IDIpOworCQlkYXRhMzIgfD0gKGhldmMtPnBpY193IDw9IDY0KSA/ICgxIDw8IDIwKSA6IDA7CisJCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGRzEsIGRhdGEzMik7CisKKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQSkgeworCQkJLyppZiAoZGVidWcgJiAweDgwKSB7Ki8KKwkJCQlkYXRhMzIgPSAxIDw8IDI4OyAvKiBEZWJ1ZyBvbmx5OiBzdHMxIGNob29zZXMgZGJsa19tYWluKi8KKwkJCQlXUklURV9WUkVHKEhFVkNfREJMS19TVFMxICsgNCwgZGF0YTMyKTsgLyogMHgzNTEwICovCisJCQkJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX0JVRk1HUl9NT1JFLAorCQkJCQkiW0RCTEsgREVCVUddIEhFVkMxIFNUUzEgOiAweCV4XG4iLAorCQkJCQlkYXRhMzIpOworCQkJLyp9Ki8KKwkJfQorCX0KKyNpZiAwCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkwxKTsKKwlkYXRhMzIgJj0gKH4weDMwMDApOworCWRhdGEzMiB8PSAoaGV2Yy0+bWVtX21hcF9tb2RlIDw8CisJCQkxMik7CisKKy8qICBbMTM6MTJdIGF4aV9hZm9ybWF0LAorICoJCQkgICAgICAgMC1MaW5lYXIsIDEtMzJ4MzIsIDItNjR4MzIKKyAqLworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDEsIGRhdGEzMik7CisKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ0RfSVBQX0FYSUlGX0NPTkZJRyk7CisJZGF0YTMyICY9ICh+MHgzMCk7CisJZGF0YTMyIHw9IChoZXZjLT5tZW1fbWFwX21vZGUgPDwKKwkJCSAgIDQpOworCisvKiAgWzU6NF0gICAgLS0gYWRkcmVzc19mb3JtYXQKKyAqCQkJCTAwOmxpbmVhciAwMTozMngzMiAxMDo2NHgzMgorICovCisJV1JJVEVfVlJFRyhIRVZDRF9JUFBfQVhJSUZfQ09ORklHLCBkYXRhMzIpOworI2Vsc2UKKwkvKiBtOGJhYnkgdGVzdDE5MDIgKi8KKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDEpOworCWRhdGEzMiAmPSAofjB4MzAwMCk7CisJLyogWzEzOjEyXSBheGlfYWZvcm1hdCwgMC1MaW5lYXIsIDEtMzJ4MzIsIDItNjR4MzIgKi8KKwlkYXRhMzIgfD0gKGhldmMtPm1lbV9tYXBfbW9kZSA8PCAxMik7CisJZGF0YTMyICY9ICh+MHhmZjApOworI2lmZGVmIEgyNjVfMTBCX01NVV9EVworCWlmIChoZXZjLT5kd19tbXVfZW5hYmxlID09IDApCisJCWRhdGEzMiB8PSAoKGhldmMtPmVuZGlhbiA+PiA4KSAmIDB4ZmZmKTsKKyNlbHNlCisJZGF0YTMyIHw9ICgoaGV2Yy0+ZW5kaWFuID4+IDgpICYgMHhmZmYpOwkvKiBkYXRhMzIgfD0gMHg2NzA7IEJpZy1FbmRpYW4gcGVyIDY0LWJpdCAqLworI2VuZGlmCisJZGF0YTMyICY9ICh+MHgzKTsgLypbMV06ZHdfZGlzYWJsZSBbMF06Y21fZGlzYWJsZSovCisJaWYgKGR3X21vZGUgPT0gMCkKKwkJZGF0YTMyIHw9IDB4MjsgLypkaXNhYmxlIGRvdWJsZSB3cml0ZSovCisJZWxzZSBpZiAoZHdfbW9kZSAmIDB4MTApCisJCWRhdGEzMiB8PSAweDE7IC8qZGlzYWJsZSBjbSovCisJIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpIHsKKwkJCXVuc2lnbmVkIGludCBkYXRhOworCQkJZGF0YSA9ICgweDU3IDw8IDgpIHwgIC8qIDFzdC8ybmQgd3JpdGUgYm90aCBlbmFibGUqLworCQkJCSgweDAgIDw8IDApOyAgIC8qIGgyNjUgdmlkZW8gZm9ybWF0Ki8KKwkJCWlmIChoZXZjLT5waWNfdyA+PSAxMjgwKQorCQkJCWRhdGEgfD0gKDB4MSA8PCA0KTsgLypkYmxrIHBpcGVsaW5lIG1vZGU9MSBmb3IgcGVyZm9ybWFuY2UqLworCQkJZGF0YSAmPSAofjB4MzAwKTsgLypbOF06Zmlyc3Qgd3JpdGUgZW5hYmxlIChjb21wcmVzcykgIFs5XTpkb3VibGUgd3JpdGUgZW5hYmxlICh1bmNvbXByZXNzKSovCisJCQlpZiAoZHdfbW9kZSA9PSAwKQorCQkJCWRhdGEgfD0gKDB4MSA8PCA4KTsgLyplbmFibGUgZmlyc3Qgd3JpdGUqLworCQkJZWxzZSBpZiAoZHdfbW9kZSAmIDB4MTApCisJCQkJZGF0YSB8PSAoMHgxIDw8IDkpOyAvKmRvdWJsZSB3cml0ZSBvbmx5Ki8KKwkJCWVsc2UKKwkJCQlkYXRhIHw9ICgoMHgxIDw8IDgpICB8KDB4MSA8PCA5KSk7CisJCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkdCLCBkYXRhKTsKKwkJCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19CVUZNR1JfTU9SRSwKKwkJCQkiW0RCTEsgREVCVUddIEhFVkMxIENGR0IgOiAweCV4XG4iLCBkYXRhKTsKKwl9CisKKwkvKiBzd2FwIHV2ICovCisJaWYgKGhldmMtPmlzX3VzZWRfdjRsKSB7CisJCWlmICgodjRsMl9jdHgtPmNhcF9waXhfZm10ID09IFY0TDJfUElYX0ZNVF9OVjIxKSB8fAorCQkJKHY0bDJfY3R4LT5jYXBfcGl4X2ZtdCA9PSBWNEwyX1BJWF9GTVRfTlYyMU0pKQorCQkJZGF0YTMyICY9IH4oMSA8PCA4KTsgLyogTlYyMSAqLworCQllbHNlCisJCQlkYXRhMzIgfD0gKDEgPDwgOCk7IC8qIE5WMTIgKi8KKwl9CisJZGF0YTMyICY9ICh+KDMgPDwgMTQpKTsKKwlkYXRhMzIgfD0gKDIgPDwgMTQpOworCS8qCisJKiAgWzMxOjI0XSBhcl9maWZvMV9heGlfdGhyZWQKKwkqICBbMjM6MTZdIGFyX2ZpZm8wX2F4aV90aHJlZAorCSogIFsxNToxNF0gYXhpX2xpbmVhbGlnbiwgMC0xNmJ5dGVzLCAxLTMyYnl0ZXMsIDItNjRieXRlcworCSogIFsxMzoxMl0gYXhpX2Fmb3JtYXQsIDAtTGluZWFyLCAxLTMyeDMyLCAyLTY0eDMyCisJKiAgWzExOjA4XSBheGlfbGVuZGlhbl9DCisJKiAgWzA3OjA0XSBheGlfbGVuZGlhbl9ZCisJKiAgWzNdICAgICByZXNlcnZlZAorCSogIFsyXSAgICAgY2xrX2ZvcmNlb24KKwkqICBbMV0gICAgIGR3X2Rpc2FibGU6ZGlzYWJsZSBkb3VibGUgd3JpdGUgb3V0cHV0CisJKiAgWzBdICAgICBjbV9kaXNhYmxlOmRpc2FibGUgY29tcHJlc3Mgb3V0cHV0CisJKi8KKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkwxLCBkYXRhMzIpOworCWlmIChkd19tb2RlICYgMHgxMCkgeworCQkvKiBbMjM6MjJdIGR3X3YxX2N0cmwKKwkJICpbMjE6MjBdIGR3X3YwX2N0cmwKKwkJICpbMTk6MThdIGR3X2gxX2N0cmwKKwkJICpbMTc6MTZdIGR3X2gwX2N0cmwKKwkJICovCisJCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMNSk7CisJCS8qc2V0IHRoZW0gYWxsIDAgZm9yIEgyNjVfTlYyMSAobm8gZG93bi1zY2FsZSkqLworCQlkYXRhMzIgJj0gfigweGZmIDw8IDE2KTsKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMNSwgZGF0YTMyKTsKKwl9CisKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ0RfSVBQX0FYSUlGX0NPTkZJRyk7CisJZGF0YTMyICY9ICh+MHgzMCk7CisJLyogWzU6NF0gICAgLS0gYWRkcmVzc19mb3JtYXQgMDA6bGluZWFyIDAxOjMyeDMyIDEwOjY0eDMyICovCisJZGF0YTMyIHw9IChoZXZjLT5tZW1fbWFwX21vZGUgPDwgNCk7CisJZGF0YTMyICY9ICh+MHhGKTsKKwlkYXRhMzIgfD0gKGhldmMtPmVuZGlhbiAmIDB4Zik7ICAvKiB2YWxpZCBvbmx5IHdoZW4gZG91YmxlIHdyaXRlIG9ubHkgKi8KKworCS8qIHN3YXAgdXYgKi8KKwlpZiAoaGV2Yy0+aXNfdXNlZF92NGwpIHsKKwkJaWYgKCh2NGwyX2N0eC0+Y2FwX3BpeF9mbXQgPT0gVjRMMl9QSVhfRk1UX05WMjEpIHx8CisJCQkodjRsMl9jdHgtPmNhcF9waXhfZm10ID09IFY0TDJfUElYX0ZNVF9OVjIxTSkpCisJCQlkYXRhMzIgfD0gKDEgPDwgMTIpOyAvKiBOVjIxICovCisJCWVsc2UKKwkJCWRhdGEzMiAmPSB+KDEgPDwgMTIpOyAvKiBOVjEyICovCisJfQorCWRhdGEzMiAmPSAofigzIDw8IDgpKTsKKwlkYXRhMzIgfD0gKDIgPDwgOCk7CisJLyoKKwkqIFszOjBdICAgbGl0dGxlX2VuZGlhbgorCSogWzU6NF0gICBhZGRyZXNzX2Zvcm1hdCAwMDpsaW5lYXIgMDE6MzJ4MzIgMTA6NjR4MzIKKwkqIFs3OjZdICAgcmVzZXJ2ZWQKKwkqIFs5OjhdICAgTGluZWFyX0xpbmVBbGlnbm1lbnQgMDA6MTZieXRlIDAxOjMyYnl0ZSAxMDo2NGJ5dGUKKwkqIFsxMToxMF0gcmVzZXJ2ZWQKKwkqIFsxMl0gICAgQ2JDcl9ieXRlX3N3YXAKKwkqIFszMToxM10gcmVzZXJ2ZWQKKwkqLworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX0FYSUlGX0NPTkZJRywgZGF0YTMyKTsKKyNlbmRpZgorCWRhdGEzMiA9IDA7CisJZGF0YTMyXzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDApOworCWRhdGEzMl8yICY9ICh+MHgzMDApOworCS8qIHNsaWNlX2RlYmxvY2tpbmdfZmlsdGVyX2Rpc2FibGVkX2ZsYWcgPSAwOworCSAqCXVjb2RlIGhhcyBoYW5kbGUgaXQgLCBzbyByZWFkIGl0IGZyb20gdWNvZGUgZGlyZWN0bHkKKwkgKi8KKwlpZiAoaGV2Yy0+dGlsZV9lbmFibGVkKSB7CisJCWRhdGEzMiB8PQorCQkJKChtaXNjX2ZsYWcwID4+CisJCQkgIExPT1BfRklMRVJfQUNST1NTX1RJTEVTX0VOQUJMRURfRkxBR19CSVQpICYKKwkJCSAweDEpIDw8IDA7CisJCWRhdGEzMl8yIHw9CisJCQkoKG1pc2NfZmxhZzAgPj4KKwkJCSAgTE9PUF9GSUxFUl9BQ1JPU1NfVElMRVNfRU5BQkxFRF9GTEFHX0JJVCkgJgorCQkJIDB4MSkgPDwgODsKKwl9CisJc2xpY2VfZGVibG9ja2luZ19maWx0ZXJfZGlzYWJsZWRfZmxhZyA9IChtaXNjX2ZsYWcwID4+CisJCQlTTElDRV9ERUJMT0NLSU5HX0ZJTFRFUl9ESVNBQkxFRF9GTEFHX0JJVCkgJgorCQkweDE7CS8qIHVjb2RlIGhhcyBoYW5kbGUgaXQsc28gcmVhZCBpdCBmcm9tIHVjb2RlIGRpcmVjdGx5ICovCisJaWYgKChtaXNjX2ZsYWcwICYgKDEgPDwgREVCTE9DS0lOR19GSUxURVJfT1ZFUlJJREVfRU5BQkxFRF9GTEFHX0JJVCkpCisJCSYmIChtaXNjX2ZsYWcwICYgKDEgPDwgREVCTE9DS0lOR19GSUxURVJfT1ZFUlJJREVfRkxBR19CSVQpKSkgeworCQkvKiBzbGljZV9kZWJsb2NraW5nX2ZpbHRlcl9kaXNhYmxlZF9mbGFnID0KKwkJICogKG1pc2NfZmxhZzA+PlNMSUNFX0RFQkxPQ0tJTkdfRklMVEVSX0RJU0FCTEVEX0ZMQUdfQklUKSYweDE7CisJCSAqIC8vdWNvZGUgaGFzIGhhbmRsZSBpdCAsIHNvIHJlYWQgaXQgZnJvbSB1Y29kZSBkaXJlY3RseQorCQkgKi8KKwkJZGF0YTMyIHw9IHNsaWNlX2RlYmxvY2tpbmdfZmlsdGVyX2Rpc2FibGVkX2ZsYWcgPDwgMjsKKwkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKQorCQkJaGV2Y19wcmludF9jb250KGhldmMsIDAsCisJCQkiKDEsJXgpIiwgZGF0YTMyKTsKKwkJaWYgKCFzbGljZV9kZWJsb2NraW5nX2ZpbHRlcl9kaXNhYmxlZF9mbGFnKSB7CisJCQlkYXRhMzIgfD0gKHBhcmFtcy0+cC5zbGljZV9iZXRhX29mZnNldF9kaXYyICYgMHhmKSA8PCAzOworCQkJZGF0YTMyIHw9IChwYXJhbXMtPnAuc2xpY2VfdGNfb2Zmc2V0X2RpdjIgJiAweGYpIDw8IDc7CisJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1IpCisJCQkJaGV2Y19wcmludF9jb250KGhldmMsIDAsCisJCQkJIigyLCV4KSIsIGRhdGEzMik7CisJCX0KKwl9IGVsc2UgeworCQlkYXRhMzIgfD0KKwkJCSgobWlzY19mbGFnMCA+PgorCQkJICBQUFNfREVCTE9DS0lOR19GSUxURVJfRElTQUJMRURfRkxBR19CSVQpICYKKwkJCSAweDEpIDw8IDI7CisJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikKKwkJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLAorCQkJIigzLCV4KSIsIGRhdGEzMik7CisJCWlmICgoKG1pc2NfZmxhZzAgPj4gUFBTX0RFQkxPQ0tJTkdfRklMVEVSX0RJU0FCTEVEX0ZMQUdfQklUKSAmCisJCQkgMHgxKSA9PSAwKSB7CisJCQlkYXRhMzIgfD0gKHBhcmFtcy0+cC5wcHNfYmV0YV9vZmZzZXRfZGl2MiAmIDB4ZikgPDwgMzsKKwkJCWRhdGEzMiB8PSAocGFyYW1zLT5wLnBwc190Y19vZmZzZXRfZGl2MiAmIDB4ZikgPDwgNzsKKwkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikKKwkJCQloZXZjX3ByaW50X2NvbnQoaGV2YywgMCwKKwkJCQkiKDQsJXgpIiwgZGF0YTMyKTsKKwkJfQorCX0KKwlpZiAoKG1pc2NfZmxhZzAgJiAoMSA8PCBQUFNfTE9PUF9GSUxURVJfQUNST1NTX1NMSUNFU19FTkFCTEVEX0ZMQUdfQklUKSkKKwkJJiYgKChtaXNjX2ZsYWcwICYgKDEgPDwgU0xJQ0VfU0FPX0xVTUFfRkxBR19CSVQpKQorCQkJfHwgKG1pc2NfZmxhZzAgJiAoMSA8PCBTTElDRV9TQU9fQ0hST01BX0ZMQUdfQklUKSkKKwkJCXx8ICghc2xpY2VfZGVibG9ja2luZ19maWx0ZXJfZGlzYWJsZWRfZmxhZykpKSB7CisJCWRhdGEzMiB8PQorCQkJKChtaXNjX2ZsYWcwID4+CisJCQkgIFNMSUNFX0xPT1BfRklMVEVSX0FDUk9TU19TTElDRVNfRU5BQkxFRF9GTEFHX0JJVCkKKwkJCSAmIDB4MSkJPDwgMTsKKwkJZGF0YTMyXzIgfD0KKwkJCSgobWlzY19mbGFnMCA+PgorCQkJICBTTElDRV9MT09QX0ZJTFRFUl9BQ1JPU1NfU0xJQ0VTX0VOQUJMRURfRkxBR19CSVQpCisJCQkmIDB4MSkgPDwgOTsKKwkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKQorCQkJaGV2Y19wcmludF9jb250KGhldmMsIDAsCisJCQkiKDUsJXgpXG4iLCBkYXRhMzIpOworCX0gZWxzZSB7CisJCWRhdGEzMiB8PQorCQkJKChtaXNjX2ZsYWcwID4+CisJCQkgIFBQU19MT09QX0ZJTFRFUl9BQ1JPU1NfU0xJQ0VTX0VOQUJMRURfRkxBR19CSVQpCisJCQkgJiAweDEpIDw8IDE7CisJCWRhdGEzMl8yIHw9CisJCQkoKG1pc2NfZmxhZzAgPj4KKwkJCSAgUFBTX0xPT1BfRklMVEVSX0FDUk9TU19TTElDRVNfRU5BQkxFRF9GTEFHX0JJVCkKKwkJCSAmIDB4MSkgPDwgOTsKKwkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKQorCQkJaGV2Y19wcmludF9jb250KGhldmMsIDAsCisJCQkiKDYsJXgpXG4iLCBkYXRhMzIpOworCX0KKwlXUklURV9WUkVHKEhFVkNfREJMS19DRkc5LCBkYXRhMzIpOworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDAsIGRhdGEzMl8yKTsKK30KKworI2lmZGVmIFRFU1RfTk9fQlVGCitzdGF0aWMgdW5zaWduZWQgY2hhciB0ZXN0X2ZsYWcgPSAxOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHBpY19saXN0X3Byb2Nlc3Moc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwlpbnQgd29ya19waWNfbnVtID0gZ2V0X3dvcmtfcGljX251bShoZXZjKTsKKwlpbnQgYWxsb2NfcGljX2NvdW50ID0gMDsKKwlpbnQgaTsKKwlzdHJ1Y3QgUElDX3MgKnBpYzsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9QSUNfTlVNOyBpKyspIHsKKwkJcGljID0gaGV2Yy0+bV9QSUNbaV07CisJCWlmIChwaWMgPT0gTlVMTCB8fCBwaWMtPmluZGV4ID09IC0xKQorCQkJY29udGludWU7CisJCWFsbG9jX3BpY19jb3VudCsrOworCQlpZiAocGljLT5vdXRwdXRfbWFyayA9PSAwICYmIHBpYy0+cmVmZXJlbmNlZCA9PSAwCisJCQkmJiBwaWMtPm91dHB1dF9yZWFkeSA9PSAwCisJCQkmJiAocGljLT53aWR0aCAhPSBoZXZjLT5waWNfdyB8fAorCQkJCXBpYy0+aGVpZ2h0ICE9IGhldmMtPnBpY19oKQorCQkJKSB7CisJCQlzZXRfYnVmX3VudXNlZChoZXZjLCBwaWMtPkJVRl9pbmRleCk7CisJCQlwaWMtPkJVRl9pbmRleCA9IC0xOworCQkJaWYgKGFsbG9jX3BpY19jb3VudCA+IHdvcmtfcGljX251bSkgeworCQkJCXBpYy0+d2lkdGggPSAwOworCQkJCXBpYy0+aGVpZ2h0ID0gMDsKKwkJCQlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5kZWNvZGVfaGVhZGVyX21lbW9yeV90aW1lX25hbWUsIFRSQUNFX0hFQURFUl9NRU1PUllfU1RBUlQpOworCQkJCXJlbGVhc2VfcGljX21tdV9idWYoaGV2YywgcGljKTsKKwkJCQlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5kZWNvZGVfaGVhZGVyX21lbW9yeV90aW1lX25hbWUsIFRSQUNFX0hFQURFUl9NRU1PUllfRU5EKTsKKwkJCQlwaWMtPmluZGV4ID0gLTE7CisJCQl9IGVsc2UgeworCQkJCXBpYy0+d2lkdGggPSBoZXZjLT5waWNfdzsKKwkJCQlwaWMtPmhlaWdodCA9IGhldmMtPnBpY19oOworCQkJfQorCQl9CisJfQorCWlmIChhbGxvY19waWNfY291bnQgPCB3b3JrX3BpY19udW0pIHsKKwkJaW50IG5ld19jb3VudCA9IGFsbG9jX3BpY19jb3VudDsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9SRUZfUElDX05VTTsgaSsrKSB7CisJCQlwaWMgPSBoZXZjLT5tX1BJQ1tpXTsKKwkJCWlmIChwaWMgJiYgcGljLT5pbmRleCA9PSAtMSkgeworCQkJCXBpYy0+aW5kZXggPSBpOworCQkJCXBpYy0+QlVGX2luZGV4ID0gLTE7CisJCQkJcGljLT53aWR0aCA9IGhldmMtPnBpY193OworCQkJCXBpYy0+aGVpZ2h0ID0gaGV2Yy0+cGljX2g7CisJCQkJbmV3X2NvdW50Kys7CisJCQkJaWYgKG5ld19jb3VudCA+PQorCQkJCQl3b3JrX3BpY19udW0pCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwl9CisJZGVhbGxvY191bnVzZWRfYnVmKGhldmMpOworCWlmIChnZXRfYWxsb2NfcGljX2NvdW50KGhldmMpCisJCSE9IGFsbG9jX3BpY19jb3VudCkgeworCQloZXZjX3ByaW50X2NvbnQoaGV2YywgMCwKKwkJIiVzOiB3b3JrX3BpY19udW0gaXMgJWQsIENoYW5nZSBhbGxvY19waWNfY291bnQgZnJvbSAlZCB0byAlZFxuIiwKKwkJX19mdW5jX18sCisJCXdvcmtfcGljX251bSwKKwkJYWxsb2NfcGljX2NvdW50LAorCQlnZXRfYWxsb2NfcGljX2NvdW50KGhldmMpKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgUElDX3MgKmdldF9uZXdfcGljKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsCisJCXVuaW9uIHBhcmFtX3UgKnJwbV9wYXJhbSkKK3sKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhoZXZjKTsKKwlzdHJ1Y3QgUElDX3MgKm5ld19waWMgPSBOVUxMOworCXN0cnVjdCBQSUNfcyAqcGljOworCWludCBpOworCWludCByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9QSUNfTlVNOyBpKyspIHsKKwkJcGljID0gaGV2Yy0+bV9QSUNbaV07CisJCWlmIChwaWMgPT0gTlVMTCB8fCBwaWMtPmluZGV4ID09IC0xKQorCQkJY29udGludWU7CisKKwkJaWYgKHBpYy0+b3V0cHV0X21hcmsgPT0gMCAmJiBwaWMtPnJlZmVyZW5jZWQgPT0gMAorCQkJJiYgcGljLT5vdXRwdXRfcmVhZHkgPT0gMAorCQkJJiYgcGljLT53aWR0aCA9PSBoZXZjLT5waWNfdworCQkJJiYgcGljLT5oZWlnaHQgPT0gaGV2Yy0+cGljX2gKKwkJCSYmIHBpYy0+dmZfcmVmID09IDAKKwkJCSkgeworCQkJaWYgKG5ld19waWMpIHsKKwkJCQlpZiAobmV3X3BpYy0+UE9DICE9IElOVkFMSURfUE9DKSB7CisJCQkJCWlmIChwaWMtPlBPQyA9PSBJTlZBTElEX1BPQyB8fAorCQkJCQkJcGljLT5QT0MgPCBuZXdfcGljLT5QT0MpCisJCQkJCQluZXdfcGljID0gcGljOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCW5ld19waWMgPSBwaWM7CisJCX0KKwl9CisKKwlpZiAobmV3X3BpYyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChuZXdfcGljLT5CVUZfaW5kZXggPCAwKSB7CisJCWlmIChhbGxvY19idWYoaGV2YykgPCAwKQorCQkJcmV0dXJuIE5VTEw7CisJCWVsc2UgeworCQkJaWYgKGNvbmZpZ19waWMoaGV2YywgbmV3X3BpYykgPCAwKSB7CisJCQkJZGVhbGxvY19waWNfYnVmKGhldmMsIG5ld19waWMpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisJCW5ld19waWMtPndpZHRoID0gaGV2Yy0+cGljX3c7CisJCW5ld19waWMtPmhlaWdodCA9IGhldmMtPnBpY19oOworCQlzZXRfY2FudmFzKGhldmMsIG5ld19waWMpOworCisJCWluaXRfcGljX2xpc3RfaHcoaGV2Yyk7CisJfQorCisJaWYgKG5ld19waWMpIHsKKwkJbmV3X3BpYy0+ZG91YmxlX3dyaXRlX21vZGUgPQorCQkJZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGhldmMpOworCQlpZiAobmV3X3BpYy0+ZG91YmxlX3dyaXRlX21vZGUpCisJCQlzZXRfY2FudmFzKGhldmMsIG5ld19waWMpOworCisjaWZkZWYgVEVTVF9OT19CVUYKKwkJaWYgKHRlc3RfZmxhZykgeworCQkJdGVzdF9mbGFnID0gMDsKKwkJCXJldHVybiBOVUxMOworCQl9IGVsc2UKKwkJCXRlc3RfZmxhZyA9IDE7CisjZW5kaWYKKwkJaWYgKGdldF9tdl9idWYoaGV2YywgbmV3X3BpYykgPCAwKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJaWYgKGhldmMtPm1tdV9lbmFibGUpIHsKKwkJCXJldCA9IEgyNjVfYWxsb2NfbW11KGhldmMsIG5ld19waWMsCisJCQkJcnBtX3BhcmFtLT5wLmJpdF9kZXB0aCwKKwkJCQloZXZjLT5mcmFtZV9tbXVfbWFwX2FkZHIpOworCQkJaWYgKHJldCAhPSAwKSB7CisJCQkJcHV0X212X2J1ZihoZXZjLCBuZXdfcGljKTsKKwkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJImNhbid0IGFsbG9jIG5lZWQgbW11MSxpZHggJWQgcmV0ID0lZFxuIiwKKwkJCQluZXdfcGljLT5kZWNvZGVfaWR4LAorCQkJCXJldCk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKyNpZmRlZiBIMjY1XzEwQl9NTVVfRFcKKwkJaWYgKGhldmMtPmR3X21tdV9lbmFibGUpIHsKKwkJCXJldCA9IEgyNjVfYWxsb2NfbW11X2R3KGhldmMsIG5ld19waWMsCisJCQkJcnBtX3BhcmFtLT5wLmJpdF9kZXB0aCwKKwkJCQloZXZjLT5mcmFtZV9kd19tbXVfbWFwX2FkZHIpOworCQkJaWYgKHJldCAhPSAwKSB7CisJCQkJcHV0X212X2J1ZihoZXZjLCBuZXdfcGljKTsKKwkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJImNhbid0IGFsbG9jIG5lZWQgbW11X2R3XzEsaWR4ICVkIHJldCA9JWRcbiIsCisJCQkJbmV3X3BpYy0+ZGVjb2RlX2lkeCwKKwkJCQlyZXQpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisjZW5kaWYKKwkJbmV3X3BpYy0+cmVmZXJlbmNlZCA9IDE7CisJCW5ld19waWMtPmRlY29kZV9pZHggPSBoZXZjLT5kZWNvZGVfaWR4OworCQluZXdfcGljLT5zbGljZV9pZHggPSAwOworCQluZXdfcGljLT5yZWZlcmVuY2VkID0gMTsKKwkJbmV3X3BpYy0+b3V0cHV0X21hcmsgPSAwOworCQluZXdfcGljLT5yZWNvbl9tYXJrID0gMDsKKwkJbmV3X3BpYy0+ZXJyb3JfbWFyayA9IDA7CisJCW5ld19waWMtPmRpc19tYXJrID0gMDsKKwkJLyogbmV3X3BpYy0+b3V0cHV0X3JlYWR5ID0gMDsgKi8KKwkJbmV3X3BpYy0+bnVtX3Jlb3JkZXJfcGljID0gcnBtX3BhcmFtLT5wLnNwc19udW1fcmVvcmRlcl9waWNzXzA7CisJCW5ld19waWMtPmlwX21vZGUgPSAoIW5ld19waWMtPm51bV9yZW9yZGVyX3BpYyAmJgorCQkJCQkJCQkhKHZkZWMtPnNsYXZlIHx8IHZkZWMtPm1hc3RlcikgJiYKKwkJCQkJCQkJIWRpc2FibGVfaXBfbW9kZSkgPyB0cnVlIDogZmFsc2U7CisJCW5ld19waWMtPmxvc2xlc3NfY29tcF9ib2R5X3NpemUgPSBoZXZjLT5sb3NsZXNzX2NvbXBfYm9keV9zaXplOworCQluZXdfcGljLT5QT0MgPSBoZXZjLT5jdXJyX1BPQzsKKwkJbmV3X3BpYy0+cGljX3N0cnVjdCA9IGhldmMtPmN1cnJfcGljX3N0cnVjdDsKKwkJaWYgKG5ld19waWMtPmF1eF9kYXRhX2J1ZikKKwkJCXJlbGVhc2VfYXV4X2RhdGEoaGV2YywgbmV3X3BpYyk7CisJCW5ld19waWMtPm1lbV9zYXZpbmdfbW9kZSA9CisJCQloZXZjLT5tZW1fc2F2aW5nX21vZGU7CisJCW5ld19waWMtPmJpdF9kZXB0aF9sdW1hID0KKwkJCWhldmMtPmJpdF9kZXB0aF9sdW1hOworCQluZXdfcGljLT5iaXRfZGVwdGhfY2hyb21hID0KKwkJCWhldmMtPmJpdF9kZXB0aF9jaHJvbWE7CisJCW5ld19waWMtPnZpZGVvX3NpZ25hbF90eXBlID0KKwkJCWhldmMtPnZpZGVvX3NpZ25hbF90eXBlOworCisJCW5ld19waWMtPmNvbmZvcm1hbmNlX3dpbmRvd19mbGFnID0KKwkJCWhldmMtPnBhcmFtLnAuY29uZm9ybWFuY2Vfd2luZG93X2ZsYWc7CisJCW5ld19waWMtPmNvbmZfd2luX2xlZnRfb2Zmc2V0ID0KKwkJCWhldmMtPnBhcmFtLnAuY29uZl93aW5fbGVmdF9vZmZzZXQ7CisJCW5ld19waWMtPmNvbmZfd2luX3JpZ2h0X29mZnNldCA9CisJCQloZXZjLT5wYXJhbS5wLmNvbmZfd2luX3JpZ2h0X29mZnNldDsKKwkJbmV3X3BpYy0+Y29uZl93aW5fdG9wX29mZnNldCA9CisJCQloZXZjLT5wYXJhbS5wLmNvbmZfd2luX3RvcF9vZmZzZXQ7CisJCW5ld19waWMtPmNvbmZfd2luX2JvdHRvbV9vZmZzZXQgPQorCQkJaGV2Yy0+cGFyYW0ucC5jb25mX3dpbl9ib3R0b21fb2Zmc2V0OworCQluZXdfcGljLT5jaHJvbWFfZm9ybWF0X2lkYyA9CisJCQkJaGV2Yy0+cGFyYW0ucC5jaHJvbWFfZm9ybWF0X2lkYzsKKworCQloZXZjX3ByaW50KGhldmMsIEgyNjVfREVCVUdfQlVGTUdSX01PUkUsCisJCQkiJXM6IGluZGV4ICVkLCBidWZfaWR4ICVkLCBkZWNvZGVfaWR4ICVkLCBQT0MgJWRcbiIsCisJCQlfX2Z1bmNfXywgbmV3X3BpYy0+aW5kZXgsCisJCQluZXdfcGljLT5CVUZfaW5kZXgsIG5ld19waWMtPmRlY29kZV9pZHgsCisJCQluZXdfcGljLT5QT0MpOworCisJfQorCWlmIChwaWNfbGlzdF9kZWJ1ZyAmIDB4MSkgeworCQlkdW1wX3BpY19saXN0KGhldmMpOworCQlwcl9lcnIoIlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisJfQorCisJcmV0dXJuIG5ld19waWM7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2ZyZWVfZmJfaWR4KHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9QSUNfTlVNOyArK2kpIHsKKwkJaWYgKGhldmMtPm1fUElDW2ldID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlpZiAoKGhldmMtPm1fUElDW2ldLT5yZWZlcmVuY2VkID09IDApICYmCisJCQkoaGV2Yy0+bV9QSUNbaV0tPnZmX3JlZiA9PSAwKSAmJgorCQkJKCFoZXZjLT5tX1BJQ1tpXS0+Y21hX2FsbG9jX2FkZHIpKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIChoZXZjLT5tX1BJQ1tpXSAmJgorCQkoaSAhPSBNQVhfUkVGX1BJQ19OVU0pKSA/IGkgOiAtMTsKK30KKworc3RhdGljIHN0cnVjdCBQSUNfcyAqdjRsX2dldF9uZXdfcGljKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsCisJCXVuaW9uIHBhcmFtX3UgKnJwbV9wYXJhbSkKK3sKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhoZXZjKTsKKwlpbnQgcmV0OworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqIHY0bCA9IGhldmMtPnY0bDJfY3R4OworCXN0cnVjdCB2NGxfYnVmZl9wb29sICpwb29sID0gJnY0bC0+Y2FwX3Bvb2w7CisJc3RydWN0IFBJQ19zICpuZXdfcGljID0gTlVMTDsKKwlzdHJ1Y3QgUElDX3MgKnBpYyA9IE5VTEw7CisJaW50IGksIGosIGlkeDsKKworCWZvciAoaSA9IDA7IGkgPCBwb29sLT5pbjsgKytpKSB7CisJCXUzMiBzdGF0ZSA9IChwb29sLT5zZXFbaV0gPj4gMTYpOworCQl1MzIgaW5kZXggPSAocG9vbC0+c2VxW2ldICYgMHhmZmZmKTsKKworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgVjRMX0NBUF9CVUZGX0lOX0RFQzoKKwkJCWZvciAoaiA9IDA7IGogPCBNQVhfUkVGX1BJQ19OVU07IGorKykgeworCQkJCXBpYyA9IGhldmMtPm1fUElDW2pdOworCQkJCWlmIChwaWMgPT0gTlVMTCB8fCBwaWMtPmluZGV4ID09IC0xKQorCQkJCQljb250aW51ZTsKKworCQkJCWlmIChwaWMtPm91dHB1dF9tYXJrID09IDAgJiYKKwkJCQkJcGljLT5yZWZlcmVuY2VkID09IDAgJiYKKwkJCQkJcGljLT5vdXRwdXRfcmVhZHkgPT0gMCAmJgorCQkJCQlwaWMtPndpZHRoID09IGhldmMtPnBpY193ICYmCisJCQkJCXBpYy0+aGVpZ2h0ID09IGhldmMtPnBpY19oICYmCisJCQkJCXBpYy0+dmZfcmVmID09IDAgJiYKKwkJCQkJcGljLT5jbWFfYWxsb2NfYWRkcikgeworCQkJCQlpZiAobmV3X3BpYykgeworCQkJCQkJaWYgKG5ld19waWMtPlBPQyAhPSBJTlZBTElEX1BPQykgeworCQkJCQkJCWlmIChwaWMtPlBPQyA9PSBJTlZBTElEX1BPQyB8fAorCQkJCQkJCQlwaWMtPlBPQyA8IG5ld19waWMtPlBPQykKKwkJCQkJCQkJbmV3X3BpYyA9IHBpYzsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlCisJCQkJCQluZXdfcGljID0gcGljOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFY0TF9DQVBfQlVGRl9JTl9NMk06CisJCQlpZHggPSBnZXRfZnJlZV9mYl9pZHgoaGV2Yyk7CisJCQlpZiAoaWR4IDwgMCkKKwkJCQlicmVhazsKKwkJCXBpYyA9IGhldmMtPm1fUElDW2lkeF07CisJCQlwaWMtPndpZHRoID0gaGV2Yy0+cGljX3c7CisJCQlwaWMtPmhlaWdodCA9IGhldmMtPnBpY19oOworCQkJaGV2Yy0+YnVmZmVyX3dyYXBbaWR4XSA9IGluZGV4OworCQkJaWYgKChwaWMtPmluZGV4ICE9IC0xKSAmJgorCQkJCSF2NGxfYWxsb2NfYnVmKGhldmMsIHBpYykpIHsKKwkJCQl2NGxfY29uZmlnX3BpYyhoZXZjLCBwaWMpOworCQkJCWluaXRfcGljX2xpc3RfaHcoaGV2Yyk7CisJCQkJbmV3X3BpYyA9IHBpYzsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJfZXJyKCJ2NGwgYnVmZmVyIHN0YXRlIGVyciAlZC5cbiIsIHN0YXRlKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG5ld19waWMpCisJCQlicmVhazsKKwl9CisKKwlpZiAobmV3X3BpYyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCW5ld19waWMtPmRvdWJsZV93cml0ZV9tb2RlID0gZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGhldmMpOworCWlmIChuZXdfcGljLT5kb3VibGVfd3JpdGVfbW9kZSkKKwkJc2V0X2NhbnZhcyhoZXZjLCBuZXdfcGljKTsKKworCWlmIChnZXRfbXZfYnVmKGhldmMsIG5ld19waWMpIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoaGV2Yy0+bW11X2VuYWJsZSkgeworCQlyZXQgPSBIMjY1X2FsbG9jX21tdShoZXZjLCBuZXdfcGljLAorCQkJcnBtX3BhcmFtLT5wLmJpdF9kZXB0aCwKKwkJCWhldmMtPmZyYW1lX21tdV9tYXBfYWRkcik7CisJCWlmIChyZXQgIT0gMCkgeworCQkJcHV0X212X2J1ZihoZXZjLCBuZXdfcGljKTsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkiY2FuJ3QgYWxsb2MgbmVlZCBtbXUxLGlkeCAlZCByZXQgPSVkXG4iLAorCQkJCW5ld19waWMtPmRlY29kZV9pZHgsIHJldCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCW5ld19waWMtPnJlZmVyZW5jZWQgPSAxOworCW5ld19waWMtPmRlY29kZV9pZHggPSBoZXZjLT5kZWNvZGVfaWR4OworCW5ld19waWMtPnNsaWNlX2lkeCA9IDA7CisJbmV3X3BpYy0+cmVmZXJlbmNlZCA9IDE7CisJbmV3X3BpYy0+b3V0cHV0X21hcmsgPSAwOworCW5ld19waWMtPnJlY29uX21hcmsgPSAwOworCW5ld19waWMtPmVycm9yX21hcmsgPSAwOworCW5ld19waWMtPmRpc19tYXJrID0gMDsKKwkvKiBuZXdfcGljLT5vdXRwdXRfcmVhZHkgPSAwOyAqLworCW5ld19waWMtPm51bV9yZW9yZGVyX3BpYyA9IHJwbV9wYXJhbS0+cC5zcHNfbnVtX3Jlb3JkZXJfcGljc18wOworCW5ld19waWMtPmlwX21vZGUgPSBoZXZjLT5sb3dfbGF0ZW5jeV9mbGFnID8gdHJ1ZSA6CisJCQkoIW5ld19waWMtPm51bV9yZW9yZGVyX3BpYyAmJgorCQkJISh2ZGVjLT5zbGF2ZSB8fCB2ZGVjLT5tYXN0ZXIpICYmCisJCQkhZGlzYWJsZV9pcF9tb2RlKSA/IHRydWUgOiBmYWxzZTsKKwluZXdfcGljLT5sb3NsZXNzX2NvbXBfYm9keV9zaXplID0gaGV2Yy0+bG9zbGVzc19jb21wX2JvZHlfc2l6ZTsKKwluZXdfcGljLT5QT0MgPSBoZXZjLT5jdXJyX1BPQzsKKwluZXdfcGljLT5waWNfc3RydWN0ID0gaGV2Yy0+Y3Vycl9waWNfc3RydWN0OworCisJaWYgKG5ld19waWMtPmF1eF9kYXRhX2J1ZikKKwkJcmVsZWFzZV9hdXhfZGF0YShoZXZjLCBuZXdfcGljKTsKKwluZXdfcGljLT5tZW1fc2F2aW5nX21vZGUgPQorCQloZXZjLT5tZW1fc2F2aW5nX21vZGU7CisJbmV3X3BpYy0+Yml0X2RlcHRoX2x1bWEgPQorCQloZXZjLT5iaXRfZGVwdGhfbHVtYTsKKwluZXdfcGljLT5iaXRfZGVwdGhfY2hyb21hID0KKwkJaGV2Yy0+Yml0X2RlcHRoX2Nocm9tYTsKKwluZXdfcGljLT52aWRlb19zaWduYWxfdHlwZSA9CisJCWhldmMtPnZpZGVvX3NpZ25hbF90eXBlOworCisJbmV3X3BpYy0+Y29uZm9ybWFuY2Vfd2luZG93X2ZsYWcgPQorCQloZXZjLT5wYXJhbS5wLmNvbmZvcm1hbmNlX3dpbmRvd19mbGFnOworCW5ld19waWMtPmNvbmZfd2luX2xlZnRfb2Zmc2V0ID0KKwkJaGV2Yy0+cGFyYW0ucC5jb25mX3dpbl9sZWZ0X29mZnNldDsKKwluZXdfcGljLT5jb25mX3dpbl9yaWdodF9vZmZzZXQgPQorCQloZXZjLT5wYXJhbS5wLmNvbmZfd2luX3JpZ2h0X29mZnNldDsKKwluZXdfcGljLT5jb25mX3dpbl90b3Bfb2Zmc2V0ID0KKwkJaGV2Yy0+cGFyYW0ucC5jb25mX3dpbl90b3Bfb2Zmc2V0OworCW5ld19waWMtPmNvbmZfd2luX2JvdHRvbV9vZmZzZXQgPQorCQloZXZjLT5wYXJhbS5wLmNvbmZfd2luX2JvdHRvbV9vZmZzZXQ7CisJbmV3X3BpYy0+Y2hyb21hX2Zvcm1hdF9pZGMgPQorCQkJaGV2Yy0+cGFyYW0ucC5jaHJvbWFfZm9ybWF0X2lkYzsKKworCWlmIChuZXdfcGljKSB7CisJCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9CisJCQkoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKiluZXdfcGljLT5jbWFfYWxsb2NfYWRkcjsKKworCQlmYi0+c3RhdHVzID0gRkJfU1RfREVDT0RFUjsKKwl9CisKKwloZXZjX3ByaW50KGhldmMsIEgyNjVfREVCVUdfQlVGTUdSLAorCQkiJXM6IGluZGV4ICVkLCBidWZfaWR4ICVkLCBkZWNvZGVfaWR4ICVkLCBQT0MgJWRcbiIsCisJCV9fZnVuY19fLCBuZXdfcGljLT5pbmRleCwKKwkJbmV3X3BpYy0+QlVGX2luZGV4LCBuZXdfcGljLT5kZWNvZGVfaWR4LAorCQluZXdfcGljLT5QT0MpOworCisJcmV0dXJuIG5ld19waWM7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2Rpc3BsYXlfcGljX251bShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWludCBpOworCXN0cnVjdCBQSUNfcyAqcGljOworCWludCBudW0gPSAwOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9SRUZfUElDX05VTTsgaSsrKSB7CisJCXBpYyA9IGhldmMtPm1fUElDW2ldOworCQlpZiAocGljID09IE5VTEwgfHwKKwkJCXBpYy0+aW5kZXggPT0gLTEpCisJCQljb250aW51ZTsKKworCQlpZiAocGljLT5vdXRwdXRfcmVhZHkgPT0gMSkKKwkJCW51bSsrOworCX0KKwlyZXR1cm4gbnVtOworfQorCitzdGF0aWMgdm9pZCBmbHVzaF9vdXRwdXQoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Yywgc3RydWN0IFBJQ19zICpwaWMpCit7CisJc3RydWN0IFBJQ19zICpwaWNfZGlzcGxheTsKKworCWlmIChwaWMpIHsKKwkJLypQQiBza2lwIGNvbnRyb2wgKi8KKwkJaWYgKHBpYy0+ZXJyb3JfbWFyayA9PSAwICYmIGhldmMtPlBCX3NraXBfbW9kZSA9PSAxKSB7CisJCQkvKiBzdGFydCBkZWNvZGluZyBhZnRlciBmaXJzdCBJICovCisJCQloZXZjLT5pZ25vcmVfYnVmbWdyX2Vycm9yIHw9IDB4MTsKKwkJfQorCQlpZiAoaGV2Yy0+aWdub3JlX2J1Zm1ncl9lcnJvciAmIDEpIHsKKwkJCWlmIChoZXZjLT5QQl9za2lwX2NvdW50X2FmdGVyX2RlY29kaW5nID4gMCkKKwkJCQloZXZjLT5QQl9za2lwX2NvdW50X2FmdGVyX2RlY29kaW5nLS07CisJCQllbHNlIHsKKwkJCQkvKiBzdGFydCBkaXNwbGF5aW5nICovCisJCQkJaGV2Yy0+aWdub3JlX2J1Zm1ncl9lcnJvciB8PSAweDI7CisJCQl9CisJCX0KKwkJaWYgKHBpYy0+UE9DICE9IElOVkFMSURfUE9DICYmICFwaWMtPmlwX21vZGUpCisJCQlwaWMtPm91dHB1dF9tYXJrID0gMTsKKwkJcGljLT5yZWNvbl9tYXJrID0gMTsKKwl9CisJZG8geworCQlwaWNfZGlzcGxheSA9IG91dHB1dF9waWMoaGV2YywgMSk7CisKKwkJaWYgKHBpY19kaXNwbGF5KSB7CisJCQlwaWNfZGlzcGxheS0+cmVmZXJlbmNlZCA9IDA7CisJCQlwdXRfbXZfYnVmKGhldmMsIHBpY19kaXNwbGF5KTsKKwkJCWlmICgocGljX2Rpc3BsYXktPmVycm9yX21hcmsKKwkJCQkgJiYgKChoZXZjLT5pZ25vcmVfYnVmbWdyX2Vycm9yICYgMHgyKSA9PSAwKSkKKwkJCQl8fCAoZ2V0X2RiZ19mbGFnKGhldmMpICYKKwkJCQkJSDI2NV9ERUJVR19ESVNQTEFZX0NVUl9GUkFNRSkKKwkJCQl8fCAoZ2V0X2RiZ19mbGFnKGhldmMpICYKKwkJCQkJSDI2NV9ERUJVR19OT19ESVNQTEFZKSkgeworCQkJCXBpY19kaXNwbGF5LT5vdXRwdXRfcmVhZHkgPSAwOworCQkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikgeworCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCSJbQk1dIERpc3BsYXk6IFBPQyAlZCwgIiwKKwkJCQkJIHBpY19kaXNwbGF5LT5QT0MpOworCQkJCQloZXZjX3ByaW50X2NvbnQoaGV2YywgMCwKKwkJCQkJImRlY29kaW5nIGluZGV4ICVkID09PiAiLAorCQkJCQkgcGljX2Rpc3BsYXktPmRlY29kZV9pZHgpOworCQkJCQloZXZjX3ByaW50X2NvbnQoaGV2YywgMCwKKwkJCQkJIkRlYnVnIG1vZGUgb3IgZXJyb3IsIHJlY3ljbGUgaXRcbiIpOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIEhlcmUgdGhlIHBpYy9mcmFtZSBlcnJvcl9tYXJrIGlzIDEsCisJCQkJICogYW5kIGl0IHdvbid0IGJlIGRpc3BsYXllZCwgc28gaW5jcmVhc2UKKwkJCQkgKiB0aGUgZHJvcCBjb3VudAorCQkJCSAqLworCQkJCWhldmMtPmd2cy0+ZHJvcF9mcmFtZV9jb3VudCsrOworCQkJCWlmIChwaWNfZGlzcGxheS0+c2xpY2VfdHlwZSA9PSBJX1NMSUNFKSB7CisJCQkJCWhldmMtPmd2cy0+aV9sb3N0X2ZyYW1lcysrOworCQkJCX0gZWxzZSBpZiAocGljX2Rpc3BsYXktPnNsaWNlX3R5cGUgPT0gUF9TTElDRSkgeworCQkJCQloZXZjLT5ndnMtPnBfbG9zdF9mcmFtZXMrKzsKKwkJCQl9IGVsc2UgaWYgKHBpY19kaXNwbGF5LT5zbGljZV90eXBlID09IEJfU0xJQ0UpIHsKKwkJCQkJaGV2Yy0+Z3ZzLT5iX2xvc3RfZnJhbWVzKys7CisJCQkJfQorCQkJCS8qIGVycm9yIGZyYW1lIGNvdW50IGFsc28gbmVlZCBpbmNyZWFzZSAqLworCQkJCWhldmMtPmd2cy0+ZXJyb3JfZnJhbWVfY291bnQrKzsKKwkJCQlpZiAocGljX2Rpc3BsYXktPnNsaWNlX3R5cGUgPT0gSV9TTElDRSkgeworCQkJCQloZXZjLT5ndnMtPmlfY29uY2VhbGVkX2ZyYW1lcysrOworCQkJCX0gZWxzZSBpZiAocGljX2Rpc3BsYXktPnNsaWNlX3R5cGUgPT0gUF9TTElDRSkgeworCQkJCQloZXZjLT5ndnMtPnBfY29uY2VhbGVkX2ZyYW1lcysrOworCQkJCX0gZWxzZSBpZiAocGljX2Rpc3BsYXktPnNsaWNlX3R5cGUgPT0gQl9TTElDRSkgeworCQkJCQloZXZjLT5ndnMtPmJfY29uY2VhbGVkX2ZyYW1lcysrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGhldmMtPmlfb25seSAmIDB4MQorCQkJCQkmJiBwaWNfZGlzcGxheS0+c2xpY2VfdHlwZSAhPSAyKSB7CisJCQkJCXBpY19kaXNwbGF5LT5vdXRwdXRfcmVhZHkgPSAwOworCQkJCX0gZWxzZSB7CisJCQkJCXByZXBhcmVfZGlzcGxheV9idWYoaHdfdG9fdmRlYyhoZXZjKSwgcGljX2Rpc3BsYXkpOworCQkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpCisJCQkJCQkmIEgyNjVfREVCVUdfQlVGTUdSKSB7CisJCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCQkiW0JNXSBmbHVzaCBEaXNwbGF5OiBQT0MgJWQsICIsCisJCQkJCQkgcGljX2Rpc3BsYXktPlBPQyk7CisJCQkJCQloZXZjX3ByaW50X2NvbnQoaGV2YywgMCwKKwkJCQkJCSJkZWNvZGluZyBpbmRleCAlZFxuIiwKKwkJCQkJCSBwaWNfZGlzcGxheS0+ZGVjb2RlX2lkeCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9IHdoaWxlIChwaWNfZGlzcGxheSk7CisJY2xlYXJfcmVmZXJlbmNlZF9mbGFnKGhldmMpOworfQorCisvKgorKiBkdl9tZXRhX2ZsYWc6IDEsIGRvbGJ5IG1ldGEgb25seTsgMiwgbm90IGluY2x1ZGUgZG9sYnkgbWV0YQorKi8KK3N0YXRpYyB2b2lkIHNldF9hdXhfZGF0YShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCXN0cnVjdCBQSUNfcyAqcGljLCB1bnNpZ25lZCBjaGFyIHN1ZmZpeF9mbGFnLAorCXVuc2lnbmVkIGNoYXIgZHZfbWV0YV9mbGFnKQoreworCWludCBpOworCXVuc2lnbmVkIHNob3J0ICphdXhfYWRyOworCXVuc2lnbmVkIGludCBzaXplX3JlZ192YWwgPQorCQlSRUFEX1ZSRUcoSEVWQ19BVVhfREFUQV9TSVpFKTsKKwl1bnNpZ25lZCBpbnQgYXV4X2NvdW50ID0gMDsKKwlpbnQgYXV4X3NpemUgPSAwOworCWlmIChwaWMgPT0gTlVMTCB8fCAwID09IGF1eF9kYXRhX2lzX2F2YWlibGUoaGV2YykpCisJCXJldHVybjsKKworCWlmIChoZXZjLT5hdXhfZGF0YV9kaXJ0eSB8fAorCQloZXZjLT5tX2luc19mbGFnID09IDApIHsKKworCQloZXZjLT5hdXhfZGF0YV9kaXJ0eSA9IDA7CisJfQorCisJaWYgKHN1ZmZpeF9mbGFnKSB7CisJCWF1eF9hZHIgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCShoZXZjLT5hdXhfYWRkciArCisJCQloZXZjLT5wcmVmaXhfYXV4X3NpemUpOworCQlhdXhfY291bnQgPQorCQkoKHNpemVfcmVnX3ZhbCAmIDB4ZmZmZikgPDwgNCkKKwkJCT4+IDE7CisJCWF1eF9zaXplID0KKwkJCWhldmMtPnN1ZmZpeF9hdXhfc2l6ZTsKKwl9IGVsc2UgeworCQlhdXhfYWRyID0KKwkJKHVuc2lnbmVkIHNob3J0ICopaGV2Yy0+YXV4X2FkZHI7CisJCWF1eF9jb3VudCA9CisJCSgoc2l6ZV9yZWdfdmFsID4+IDE2KSA8PCA0KQorCQkJPj4gMTsKKwkJYXV4X3NpemUgPQorCQkJaGV2Yy0+cHJlZml4X2F1eF9zaXplOworCX0KKwlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19QUklOVF9TRUkpIHsKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJIiVzOnBpYyAweCVwIG9sZCBzaXplICVkIGNvdW50ICVkLHN1ZiAlZCBkdl9mbGFnICVkXHJcbiIsCisJCQlfX2Z1bmNfXywgcGljLCBwaWMtPmF1eF9kYXRhX3NpemUsCisJCQlhdXhfY291bnQsIHN1ZmZpeF9mbGFnLCBkdl9tZXRhX2ZsYWcpOworCX0KKworCWlmIChhdXhfY291bnQgPiBhdXhfc2l6ZSkgeworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiJXM6YXV4X2NvdW50KCVkKSBpcyBvdmVyIHNpemVcbiIsIF9fZnVuY19fLCBhdXhfY291bnQpOworCQlhdXhfY291bnQgPSAwOworCX0KKwlpZiAoYXV4X3NpemUgPiAwICYmIGF1eF9jb3VudCA+IDApIHsKKwkJaW50IGhlYWRzX3NpemUgPSAwOworCQlpbnQgbmV3X3NpemU7CisJCWNoYXIgKm5ld19idWY7CisKKwkJZm9yIChpID0gMDsgaSA8IGF1eF9jb3VudDsgaSsrKSB7CisJCQl1bnNpZ25lZCBjaGFyIHRhZyA9IGF1eF9hZHJbaV0gPj4gODsKKwkJCWlmICh0YWcgIT0gMCAmJiB0YWcgIT0gMHhmZikgeworCQkJCWlmIChkdl9tZXRhX2ZsYWcgPT0gMCkKKwkJCQkJaGVhZHNfc2l6ZSArPSA4OworCQkJCWVsc2UgaWYgKGR2X21ldGFfZmxhZyA9PSAxICYmIHRhZyA9PSAweDEpCisJCQkJCWhlYWRzX3NpemUgKz0gODsKKwkJCQllbHNlIGlmIChkdl9tZXRhX2ZsYWcgPT0gMiAmJiB0YWcgIT0gMHgxKQorCQkJCQloZWFkc19zaXplICs9IDg7CisJCQl9CisJCX0KKwkJbmV3X3NpemUgPSBwaWMtPmF1eF9kYXRhX3NpemUgKyBhdXhfY291bnQgKyBoZWFkc19zaXplOworCQluZXdfYnVmID0gdnphbGxvYyhuZXdfc2l6ZSk7CisJCWlmIChuZXdfYnVmKSB7CisJCQl1bnNpZ25lZCBjaGFyIHZhbGlkX3RhZyA9IDA7CisJCQl1bnNpZ25lZCBjaGFyICpoID0KKwkJCQluZXdfYnVmICsKKwkJCQlwaWMtPmF1eF9kYXRhX3NpemU7CisJCQl1bnNpZ25lZCBjaGFyICpwID0gaCArIDg7CisJCQlpbnQgbGVuID0gMDsKKwkJCWludCBwYWRkaW5nX2xlbiA9IDA7CisKKwkJCWlmIChwaWMtPmF1eF9kYXRhX2J1ZikgeworCQkJCW1lbWNweShuZXdfYnVmLCBwaWMtPmF1eF9kYXRhX2J1ZiwgcGljLT5hdXhfZGF0YV9zaXplKTsKKwkJCQl2ZnJlZShwaWMtPmF1eF9kYXRhX2J1Zik7CisJCQl9CisJCQlwaWMtPmF1eF9kYXRhX2J1ZiA9IG5ld19idWY7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBhdXhfY291bnQ7IGkgKz0gNCkgeworCQkJCWludCBpaTsKKwkJCQl1bnNpZ25lZCBjaGFyIHRhZyA9IGF1eF9hZHJbaSArIDNdID4+IDg7CisJCQkJaWYgKHRhZyAhPSAwICYmIHRhZyAhPSAweGZmKSB7CisJCQkJCWlmIChkdl9tZXRhX2ZsYWcgPT0gMCkKKwkJCQkJCXZhbGlkX3RhZyA9IDE7CisJCQkJCWVsc2UgaWYgKGR2X21ldGFfZmxhZyA9PSAxCisJCQkJCQkmJiB0YWcgPT0gMHgxKQorCQkJCQkJdmFsaWRfdGFnID0gMTsKKwkJCQkJZWxzZSBpZiAoZHZfbWV0YV9mbGFnID09IDIKKwkJCQkJCSYmIHRhZyAhPSAweDEpCisJCQkJCQl2YWxpZF90YWcgPSAxOworCQkJCQllbHNlCisJCQkJCQl2YWxpZF90YWcgPSAwOworCQkJCQlpZiAodmFsaWRfdGFnICYmIGxlbiA+IDApIHsKKwkJCQkJCXBpYy0+YXV4X2RhdGFfc2l6ZSArPQorCQkJCQkJKGxlbiArIDgpOworCQkJCQkJaFswXSA9IChsZW4gPj4gMjQpCisJCQkJCQkmIDB4ZmY7CisJCQkJCQloWzFdID0gKGxlbiA+PiAxNikKKwkJCQkJCSYgMHhmZjsKKwkJCQkJCWhbMl0gPSAobGVuID4+IDgpCisJCQkJCQkmIDB4ZmY7CisJCQkJCQloWzNdID0gKGxlbiA+PiAwKQorCQkJCQkJJiAweGZmOworCQkJCQkJaFs2XSA9CisJCQkJCQkocGFkZGluZ19sZW4gPj4gOCkKKwkJCQkJCSYgMHhmZjsKKwkJCQkJCWhbN10gPSAocGFkZGluZ19sZW4pCisJCQkJCQkmIDB4ZmY7CisJCQkJCQloICs9IChsZW4gKyA4KTsKKwkJCQkJCXAgKz0gODsKKwkJCQkJCWxlbiA9IDA7CisJCQkJCQlwYWRkaW5nX2xlbiA9IDA7CisJCQkJCX0KKwkJCQkJaWYgKHZhbGlkX3RhZykgeworCQkJCQkJaFs0XSA9IHRhZzsKKwkJCQkJCWhbNV0gPSAwOworCQkJCQkJaFs2XSA9IDA7CisJCQkJCQloWzddID0gMDsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAodmFsaWRfdGFnKSB7CisJCQkJCWZvciAoaWkgPSAwOyBpaSA8IDQ7IGlpKyspIHsKKwkJCQkJCXVuc2lnbmVkIHNob3J0IGFhID0KKwkJCQkJCQlhdXhfYWRyW2kgKyAzCisJCQkJCQkJLSBpaV07CisJCQkJCQkqcCA9IGFhICYgMHhmZjsKKwkJCQkJCXArKzsKKwkJCQkJCWxlbisrOworCQkJCQkJLyppZiAoKGFhID4+IDgpID09IDB4ZmYpCisJCQkJCQkJcGFkZGluZ19sZW4rKzsqLworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKGxlbiA+IDApIHsKKwkJCQlwaWMtPmF1eF9kYXRhX3NpemUgKz0gKGxlbiArIDgpOworCQkJCWhbMF0gPSAobGVuID4+IDI0KSAmIDB4ZmY7CisJCQkJaFsxXSA9IChsZW4gPj4gMTYpICYgMHhmZjsKKwkJCQloWzJdID0gKGxlbiA+PiA4KSAmIDB4ZmY7CisJCQkJaFszXSA9IChsZW4gPj4gMCkgJiAweGZmOworCQkJCWhbNl0gPSAocGFkZGluZ19sZW4gPj4gOCkgJiAweGZmOworCQkJCWhbN10gPSAocGFkZGluZ19sZW4pICYgMHhmZjsKKwkJCX0KKwkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX1BSSU5UX1NFSSkgeworCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJImF1eDogKHNpemUgJWQpIHN1ZmZpeF9mbGFnICVkXG4iLAorCQkJCQlwaWMtPmF1eF9kYXRhX3NpemUsIHN1ZmZpeF9mbGFnKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgcGljLT5hdXhfZGF0YV9zaXplOyBpKyspIHsKKwkJCQkJaGV2Y19wcmludF9jb250KGhldmMsIDAsCisJCQkJCQkiJTAyeCAiLCBwaWMtPmF1eF9kYXRhX2J1ZltpXSk7CisJCQkJCWlmICgoKGkgKyAxKSAmIDB4ZikgPT0gMCkKKwkJCQkJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLCAiXG4iKTsKKwkJCQl9CisJCQkJaGV2Y19wcmludF9jb250KGhldmMsIDAsICJcbiIpOworCQkJfQorCisJCX0gZWxzZSB7CisJCQloZXZjX3ByaW50KGhldmMsIDAsICJuZXcgYnVmIGFsbG9jIGZhaWxlZFxuIik7CisJCQlpZiAocGljLT5hdXhfZGF0YV9idWYpCisJCQkJdmZyZWUocGljLT5hdXhfZGF0YV9idWYpOworCQkJcGljLT5hdXhfZGF0YV9idWYgPSBOVUxMOworCQkJcGljLT5hdXhfZGF0YV9zaXplID0gMDsKKwkJfQorCX0KKworfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX2F1eF9kYXRhKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsCisJc3RydWN0IFBJQ19zICpwaWMpCit7CisJaWYgKHBpYy0+YXV4X2RhdGFfYnVmKSB7CisJCXZmcmVlKHBpYy0+YXV4X2RhdGFfYnVmKTsKKwkJaWYgKChydW5fY291bnRbaGV2Yy0+aW5kZXhdICYgNjMpID09IDApCisJCQl2bV91bm1hcF9hbGlhc2VzKCk7CisJfQorCXBpYy0+YXV4X2RhdGFfYnVmID0gTlVMTDsKKwlwaWMtPmF1eF9kYXRhX3NpemUgPSAwOworfQorCitzdGF0aWMgaW50IHJlY3ljbGVfbW11X2J1Zl90YWlsKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsCisJCWJvb2wgY2hlY2tfZG1hKQoreworCWhldmNfcHJpbnQoaGV2YywKKwkJCUgyNjVfREVCVUdfQlVGTUdSX01PUkUsCisJCQkiJXMgcGljIGluZGV4ICVkIHNjYXR0ZXJfYWxsb2MgJWQgcGFnZV9zdGFydCAlZFxuIiwKKwkJCSJkZWNvZGVyX21tdV9ib3hfZnJlZV9pZHhfdGFpbCIsCisJCQloZXZjLT5jdXJfcGljLT5pbmRleCwKKwkJCWhldmMtPmN1cl9waWMtPnNjYXR0ZXJfYWxsb2MsCisJCQloZXZjLT51c2VkXzRrX251bSk7CisJaWYgKGNoZWNrX2RtYSkKKwkJaGV2Y19tbXVfZG1hX2NoZWNrKGh3X3RvX3ZkZWMoaGV2YykpOworCisJaWYgKGhldmMtPmlzX3VzZWRfdjRsKSB7CisJCWludCBpbmRleCA9IGhldmMtPmN1cl9waWMtPkJVRl9pbmRleDsKKwkJc3RydWN0IGludGVybmFsX2NvbXBfYnVmICppYnVmID0KKwkJCWluZGV4X3RvX2ljb21wX2J1ZihoZXZjLCBpbmRleCk7CisKKwkJZGVjb2Rlcl9tbXVfYm94X2ZyZWVfaWR4X3RhaWwoCisJCQkJaWJ1Zi0+bW11X2JveCwKKwkJCQlpYnVmLT5pbmRleCwKKwkJCQloZXZjLT51c2VkXzRrX251bSk7CisJfSBlbHNlIHsKKwkJZGVjb2Rlcl9tbXVfYm94X2ZyZWVfaWR4X3RhaWwoCisJCQkJaGV2Yy0+bW11X2JveCwKKwkJCQloZXZjLT5jdXJfcGljLT5pbmRleCwKKwkJCQloZXZjLT51c2VkXzRrX251bSk7CisJfQorCWhldmMtPmN1cl9waWMtPnNjYXR0ZXJfYWxsb2MgPSAyOworCWhldmMtPnVzZWRfNGtfbnVtID0gLTE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoZXZjX3ByZV9waWMoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwkJCXN0cnVjdCBQSUNfcyAqcGljKQoreworCisJLyogcHJldiBwaWMgKi8KKwkvKmlmIChoZXZjLT5jdXJyX1BPQyAhPSAwKSB7Ki8KKwlpbnQgZGVjb2RlZF9wb2MgPSBoZXZjLT5pUHJldlBPQzsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJaWYgKGhldmMtPm1faW5zX2ZsYWcpIHsKKwkJZGVjb2RlZF9wb2MgPSBoZXZjLT5kZWNvZGVkX3BvYzsKKwkJaGV2Yy0+ZGVjb2RlZF9wb2MgPSBJTlZBTElEX1BPQzsKKwl9CisjZW5kaWYKKwlpZiAoaGV2Yy0+bV9uYWxVbml0VHlwZSAhPSBOQUxfVU5JVF9DT0RFRF9TTElDRV9JRFIKKwkJCSYmIGhldmMtPm1fbmFsVW5pdFR5cGUgIT0KKwkJCU5BTF9VTklUX0NPREVEX1NMSUNFX0lEUl9OX0xQKSB7CisJCXN0cnVjdCBQSUNfcyAqcGljX2Rpc3BsYXk7CisKKwkJcGljID0gZ2V0X3BpY19ieV9QT0MoaGV2YywgZGVjb2RlZF9wb2MpOworCQlpZiAocGljICYmIChwaWMtPlBPQyAhPSBJTlZBTElEX1BPQykpIHsKKwkJCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGhldmMpOworCisJCQkvKlBCIHNraXAgY29udHJvbCAqLworCQkJaWYgKHBpYy0+ZXJyb3JfbWFyayA9PSAwCisJCQkJCSYmIGhldmMtPlBCX3NraXBfbW9kZSA9PSAxKSB7CisJCQkJLyogc3RhcnQgZGVjb2RpbmcgYWZ0ZXIKKwkJCQkgKiAgIGZpcnN0IEkKKwkJCQkgKi8KKwkJCQloZXZjLT5pZ25vcmVfYnVmbWdyX2Vycm9yIHw9IDB4MTsKKwkJCX0KKwkJCWlmIChoZXZjLT5pZ25vcmVfYnVmbWdyX2Vycm9yICYgMSkgeworCQkJCWlmIChoZXZjLT5QQl9za2lwX2NvdW50X2FmdGVyX2RlY29kaW5nID4gMCkgeworCQkJCQloZXZjLT5QQl9za2lwX2NvdW50X2FmdGVyX2RlY29kaW5nLS07CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogc3RhcnQgZGlzcGxheWluZyAqLworCQkJCQloZXZjLT5pZ25vcmVfYnVmbWdyX2Vycm9yIHw9IDB4MjsKKwkJCQl9CisJCQl9CisJCQlpZiAoaGV2Yy0+bW11X2VuYWJsZQorCQkJCSYmICgoaGV2Yy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDEwKSA9PSAwKSkgeworCQkJCWlmICghaGV2Yy0+bV9pbnNfZmxhZykgeworCQkJCQloZXZjLT51c2VkXzRrX251bSA9CisJCQkJCVJFQURfVlJFRyhIRVZDX1NBT19NTVVfU1RBVFVTKSA+PiAxNjsKKworCQkJCQlpZiAoKCFpc19za2lwX2RlY29kaW5nKGhldmMsIHBpYykpICYmCisJCQkJCQkoaGV2Yy0+dXNlZF80a19udW0gPj0gMCkgJiYKKwkJCQkJCShoZXZjLT5jdXJfcGljLT5zY2F0dGVyX2FsbG9jCisJCQkJCQk9PSAxKSkgeworCQkJCQkJCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLmRlY29kZV9oZWFkZXJfbWVtb3J5X3RpbWVfbmFtZSwgVFJBQ0VfSEVBREVSX01FTU9SWV9TVEFSVCk7CisJCQkJCQkJcmVjeWNsZV9tbXVfYnVmX3RhaWwoaGV2YywgdHJ1ZSk7CisJCQkJCQkJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UuZGVjb2RlX2hlYWRlcl9tZW1vcnlfdGltZV9uYW1lLCBUUkFDRV9IRUFERVJfTUVNT1JZX0VORCk7CisJCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKCFwaWMtPmlwX21vZGUpCisJCQkJcGljLT5vdXRwdXRfbWFyayA9IDE7CisJCQlwaWMtPnJlY29uX21hcmsgPSAxOworCQkJcGljLT5kaXNfbWFyayA9IDE7CisJCQlpZiAodmRlYy0+bXZmcm0pIHsKKwkJCQlwaWMtPmZyYW1lX3NpemUgPSB2ZGVjLT5tdmZybS0+ZnJhbWVfc2l6ZTsKKwkJCQlwaWMtPmh3X2RlY29kZV90aW1lID0gKHUzMil2ZGVjLT5tdmZybS0+aHdfZGVjb2RlX3RpbWU7CisJCQl9CisJCX0KKwkJZG8geworCQkJcGljX2Rpc3BsYXkgPSBvdXRwdXRfcGljKGhldmMsIDApOworCisJCQlpZiAocGljX2Rpc3BsYXkpIHsKKwkJCQlpZiAoKHBpY19kaXNwbGF5LT5lcnJvcl9tYXJrICYmCisJCQkJCSgoaGV2Yy0+aWdub3JlX2J1Zm1ncl9lcnJvciAmCisJCQkJCQkJICAweDIpID09IDApKQorCQkJCQl8fCAoZ2V0X2RiZ19mbGFnKGhldmMpICYKKwkJCQkJCUgyNjVfREVCVUdfRElTUExBWV9DVVJfRlJBTUUpCisJCQkJCXx8IChnZXRfZGJnX2ZsYWcoaGV2YykgJgorCQkJCQkJSDI2NV9ERUJVR19OT19ESVNQTEFZKSkgeworCQkJCQlwaWNfZGlzcGxheS0+b3V0cHV0X3JlYWR5ID0gMDsKKwkJCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmCisJCQkJCQlIMjY1X0RFQlVHX0JVRk1HUikgeworCQkJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkJIltCTV0gRGlzcGxheTogUE9DICVkLCAiLAorCQkJCQkJCSBwaWNfZGlzcGxheS0+UE9DKTsKKwkJCQkJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLAorCQkJCQkJImRlY29kaW5nIGluZGV4ICVkID09PiAiLAorCQkJCQkJCSBwaWNfZGlzcGxheS0+CisJCQkJCQkJIGRlY29kZV9pZHgpOworCQkJCQkJaGV2Y19wcmludF9jb250KGhldmMsIDAsCisJCQkJCQkiRGVidWcgb3IgZXJyLHJlY3ljbGUgaXRcbiIpOworCQkJCQl9CisJCQkJCS8qCisJCQkJCSAqIEhlcmUgdGhlIHBpYy9mcmFtZSBlcnJvcl9tYXJrIGlzIDEsCisJCQkJCSAqIGFuZCBpdCB3b24ndCBiZSBkaXNwbGF5ZWQsIHNvIGluY3JlYXNlCisJCQkJCSAqIHRoZSBkcm9wIGNvdW50CisJCQkJCSAqLworCQkJCQloZXZjLT5ndnMtPmRyb3BfZnJhbWVfY291bnQrKzsKKwkJCQkJaWYgKHBpY19kaXNwbGF5LT5zbGljZV90eXBlID09IElfU0xJQ0UpIHsKKwkJCQkJCWhldmMtPmd2cy0+aV9sb3N0X2ZyYW1lcysrOworCQkJCQl9ZWxzZSBpZiAocGljX2Rpc3BsYXktPnNsaWNlX3R5cGUgPT0gUF9TTElDRSkgeworCQkJCQkJaGV2Yy0+Z3ZzLT5wX2xvc3RfZnJhbWVzKys7CisJCQkJCX0gZWxzZSBpZiAocGljX2Rpc3BsYXktPnNsaWNlX3R5cGUgPT0gQl9TTElDRSkgeworCQkJCQkJaGV2Yy0+Z3ZzLT5iX2xvc3RfZnJhbWVzKys7CisJCQkJCX0KKwkJCQkJLyogZXJyb3IgZnJhbWUgY291bnQgYWxzbyBuZWVkIGluY3JlYXNlICovCisJCQkJCWhldmMtPmd2cy0+ZXJyb3JfZnJhbWVfY291bnQrKzsKKwkJCQkJaWYgKHBpY19kaXNwbGF5LT5zbGljZV90eXBlID09IElfU0xJQ0UpIHsKKwkJCQkJCWhldmMtPmd2cy0+aV9jb25jZWFsZWRfZnJhbWVzKys7CisJCQkJCX0gZWxzZSBpZiAocGljX2Rpc3BsYXktPnNsaWNlX3R5cGUgPT0gUF9TTElDRSkgeworCQkJCQkJaGV2Yy0+Z3ZzLT5wX2NvbmNlYWxlZF9mcmFtZXMrKzsKKwkJCQkJfSBlbHNlIGlmIChwaWNfZGlzcGxheS0+c2xpY2VfdHlwZSA9PSBCX1NMSUNFKSB7CisJCQkJCQloZXZjLT5ndnMtPmJfY29uY2VhbGVkX2ZyYW1lcysrOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGhldmMtPmlfb25seSAmIDB4MQorCQkJCQkJJiYgcGljX2Rpc3BsYXktPgorCQkJCQkJc2xpY2VfdHlwZSAhPSAyKSB7CisJCQkJCQlwaWNfZGlzcGxheS0+b3V0cHV0X3JlYWR5ID0gMDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXByZXBhcmVfZGlzcGxheV9idWYKKwkJCQkJCQkoaHdfdG9fdmRlYyhoZXZjKSwKKwkJCQkJCQkgcGljX2Rpc3BsYXkpOworCQkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYKKwkJCQkJCUgyNjVfREVCVUdfQlVGTUdSKSB7CisJCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCQkiW0JNXSBEaXNwbGF5OiBQT0MgJWQsICIsCisJCQkJCQkJIHBpY19kaXNwbGF5LT5QT0MpOworCQkJCQkJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLAorCQkJCQkJCSJkZWNvZGluZyBpbmRleCAlZFxuIiwKKwkJCQkJCQkgcGljX2Rpc3BsYXktPgorCQkJCQkJCSBkZWNvZGVfaWR4KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSB3aGlsZSAocGljX2Rpc3BsYXkpOworCX0gZWxzZSB7CisJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikgeworCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJIltCTV0gY3VycmVudCBwaWMgaXMgSURSLCAiKTsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJjbGVhciByZWZlcmVuY2VkIGZsYWcgb2YgYWxsIGJ1ZmZlcnNcbiIpOworCQl9CisJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUl9NT1JFKQorCQkJZHVtcF9waWNfbGlzdChoZXZjKTsKKwkJaWYgKGhldmMtPnZmX3ByZV9jb3VudCA9PSAxICYmCisJCQkJaGV2Yy0+Zmlyc3RfcGljX2ZsYWcgPT0gMSkgeworCQkJaGV2Yy0+Zmlyc3RfcGljX2ZsYWcgPSAyOworCQkJcGljID0gTlVMTDsKKwkJfQorCQllbHNlCisJCQlwaWMgPSBnZXRfcGljX2J5X1BPQyhoZXZjLCBkZWNvZGVkX3BvYyk7CisKKwkJZmx1c2hfb3V0cHV0KGhldmMsIHBpYyk7CisJfQorCit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3BpY19kZWNvZGVkX2Vycm9yX3ByZShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCWludCBkZWNvZGVkX2xjdSkKK3sKKwlpbnQgY3VycmVudF9sY3VfaWR4ID0gZGVjb2RlZF9sY3U7CisJaWYgKGRlY29kZWRfbGN1IDwgMCkKKwkJcmV0dXJuOworCisJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKSB7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJjdXIgbGN1IGlkeCA9ICVkLCAodG90YWwgJWQpXG4iLAorCQkJY3VycmVudF9sY3VfaWR4LCBoZXZjLT5sY3VfdG90YWwpOworCX0KKwlpZiAoKGVycm9yX2hhbmRsZV9wb2xpY3kgJiAweDIwKSA9PSAwICYmIGhldmMtPmN1cl9waWMgIT0gTlVMTCkgeworCQlpZiAoaGV2Yy0+Zmlyc3RfcGljX2FmdGVyX3JlY292ZXIpIHsKKwkJCWlmIChjdXJyZW50X2xjdV9pZHggIT0KKwkJCSAoKGhldmMtPmxjdV94X251bV9wcmUqaGV2Yy0+bGN1X3lfbnVtX3ByZSkgLSAxKSkKKwkJCQloZXZjLT5jdXJfcGljLT5lcnJvcl9tYXJrID0gMTsKKwkJfSBlbHNlIHsKKwkJCWlmIChoZXZjLT5sY3VfeF9udW1fcHJlICE9IDAKKwkJCSAmJiBoZXZjLT5sY3VfeV9udW1fcHJlICE9IDAKKwkJCSAmJiBjdXJyZW50X2xjdV9pZHggIT0gMAorCQkJICYmIGN1cnJlbnRfbGN1X2lkeCA8CisJCQkgKChoZXZjLT5sY3VfeF9udW1fcHJlKmhldmMtPmxjdV95X251bV9wcmUpIC0gMSkpCisJCQkJaGV2Yy0+Y3VyX3BpYy0+ZXJyb3JfbWFyayA9IDE7CisJCX0KKwkJaWYgKGhldmMtPmN1cl9waWMtPmVycm9yX21hcmspIHsKKwkJCWlmIChwcmludF9sY3VfZXJyb3IpCisJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkiY3VyIGxjdSBpZHggPSAlZCwgKHRvdGFsICVkKSwgc2V0IGVycm9yX21hcmtcbiIsCisJCQkJCWN1cnJlbnRfbGN1X2lkeCwKKwkJCQkJaGV2Yy0+bGN1X3hfbnVtX3ByZSpoZXZjLT5sY3VfeV9udW1fcHJlKTsKKwkJCWlmIChpc19sb2dfZW5hYmxlKGhldmMpKQorCQkJCWFkZF9sb2coaGV2YywKKwkJCQkJImN1ciBsY3UgaWR4ID0gJWQsICh0b3RhbCAlZCksIHNldCBlcnJvcl9tYXJrIiwKKwkJCQkJY3VycmVudF9sY3VfaWR4LAorCQkJCQloZXZjLT5sY3VfeF9udW1fcHJlICoKKwkJCQkJICAgIGhldmMtPmxjdV95X251bV9wcmUpOworCisJCX0KKworCX0KKwlpZiAoaGV2Yy0+Y3VyX3BpYyAmJiBoZXZjLT5oZWFkX2Vycm9yX2ZsYWcpIHsKKwkJaGV2Yy0+Y3VyX3BpYy0+ZXJyb3JfbWFyayA9IDE7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJoZWFkIGhhcyBlcnJvciwgc2V0IGVycm9yX21hcmtcbiIpOworCX0KKworCWlmICgoZXJyb3JfaGFuZGxlX3BvbGljeSAmIDB4ODApID09IDApIHsKKwkJaWYgKGhldmMtPm92ZXJfZGVjb2RlICYmIGhldmMtPmN1cl9waWMpIHsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkib3ZlciBkZWNvZGUsIHNldCBlcnJvcl9tYXJrXG4iKTsKKwkJCWhldmMtPmN1cl9waWMtPmVycm9yX21hcmsgPSAxOworCQl9CisJfQorCisJaGV2Yy0+bGN1X3hfbnVtX3ByZSA9IGhldmMtPmxjdV94X251bTsKKwloZXZjLT5sY3VfeV9udW1fcHJlID0gaGV2Yy0+bGN1X3lfbnVtOworfQorCitzdGF0aWMgdm9pZCBjaGVja19waWNfZGVjb2RlZF9lcnJvcihzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCWludCBkZWNvZGVkX2xjdSkKK3sKKwlpbnQgY3VycmVudF9sY3VfaWR4ID0gZGVjb2RlZF9sY3U7CisJaWYgKGRlY29kZWRfbGN1IDwgMCkKKwkJcmV0dXJuOworCisJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKSB7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJjdXIgbGN1IGlkeCA9ICVkLCAodG90YWwgJWQpXG4iLAorCQkJY3VycmVudF9sY3VfaWR4LCBoZXZjLT5sY3VfdG90YWwpOworCX0KKwlpZiAoKGVycm9yX2hhbmRsZV9wb2xpY3kgJiAweDIwKSA9PSAwICYmIGhldmMtPmN1cl9waWMgIT0gTlVMTCkgeworCQlpZiAoaGV2Yy0+bGN1X3hfbnVtICE9IDAKKwkJICYmIGhldmMtPmxjdV95X251bSAhPSAwCisJCSAmJiBjdXJyZW50X2xjdV9pZHggIT0gMAorCQkgJiYgY3VycmVudF9sY3VfaWR4IDwKKwkJICgoaGV2Yy0+bGN1X3hfbnVtKmhldmMtPmxjdV95X251bSkgLSAxKSkKKwkJCWhldmMtPmN1cl9waWMtPmVycm9yX21hcmsgPSAxOworCisJCWlmIChoZXZjLT5jdXJfcGljLT5lcnJvcl9tYXJrKSB7CisJCQlpZiAocHJpbnRfbGN1X2Vycm9yKQorCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJImN1ciBsY3UgaWR4ID0gJWQsICh0b3RhbCAlZCksIHNldCBlcnJvcl9tYXJrXG4iLAorCQkJCQljdXJyZW50X2xjdV9pZHgsCisJCQkJCWhldmMtPmxjdV94X251bSpoZXZjLT5sY3VfeV9udW0pOworCQkJaWYgKCgoaGV2Yy0+aV9vbmx5ICYgMHg0KSAgPT0gMCkgJiYgaGV2Yy0+Y3VyX3BpYy0+UE9DICYmICggaGV2Yy0+Y3VyX3BpYy0+c2xpY2VfdHlwZSA9PSAwKQorCQkJCQkmJiAoKGhldmMtPmN1cl9waWMtPlBPQyArIE1BWF9CVUZfTlVNKSA8IGhldmMtPmlQcmV2UE9DKSkgeworCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCSJGbHVzaC4uIG51bV9yZW9yZGVyX3BpYyAlZCAgcGljLT5QT0MgJWQgIGhldmMtPmlQcmV2UE9DICVkXG4iLAorCQkJCQloZXZjLT5zcHNfbnVtX3Jlb3JkZXJfcGljc18wLGhldmMtPmN1cl9waWMtPlBPQyAsaGV2Yy0+aVByZXZQT0MpOworCQkJCQlmbHVzaF9vdXRwdXQoaGV2YywgZ2V0X3BpY19ieV9QT0MoaGV2YywgaGV2Yy0+Y3VyX3BpYy0+UE9DICkpOworCQkJfQorCQkJaWYgKGlzX2xvZ19lbmFibGUoaGV2YykpCisJCQkJYWRkX2xvZyhoZXZjLAorCQkJCQkiY3VyIGxjdSBpZHggPSAlZCwgKHRvdGFsICVkKSwgc2V0IGVycm9yX21hcmsiLAorCQkJCQljdXJyZW50X2xjdV9pZHgsCisJCQkJCWhldmMtPmxjdV94X251bSAqCisJCQkJCSAgICBoZXZjLT5sY3VfeV9udW0pOworCisJCX0KKworCX0KKwlpZiAoaGV2Yy0+Y3VyX3BpYyAmJiBoZXZjLT5oZWFkX2Vycm9yX2ZsYWcpIHsKKwkJaGV2Yy0+Y3VyX3BpYy0+ZXJyb3JfbWFyayA9IDE7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJoZWFkIGhhcyBlcnJvciwgc2V0IGVycm9yX21hcmtcbiIpOworCX0KKworCWlmICgoZXJyb3JfaGFuZGxlX3BvbGljeSAmIDB4ODApID09IDApIHsKKwkJaWYgKGhldmMtPm92ZXJfZGVjb2RlICYmIGhldmMtPmN1cl9waWMpIHsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkib3ZlciBkZWNvZGUsIHNldCBlcnJvcl9tYXJrXG4iKTsKKwkJCWhldmMtPmN1cl9waWMtPmVycm9yX21hcmsgPSAxOworCQl9CisJfQorfQorCisvKiBvbmx5IHdoZW4gd2UgZGVjb2RlZCBvbmUgZmllbGQgb3Igb25lIGZyYW1lLAord2UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBnZXQgcW9zIGluZm8qLworc3RhdGljIHZvaWQgZ2V0X3BpY3R1cmVfcW9zX2luZm8oc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwlzdHJ1Y3QgUElDX3MgKnBpY3R1cmUgPSBoZXZjLT5jdXJfcGljOworCisvKgorI2RlZmluZSBERUJVR19RT1MKKyovCisKKwlpZiAoIWhldmMtPmN1cl9waWMpCisJCXJldHVybjsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPCBBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQSkgeworCQl1bnNpZ25lZCBjaGFyIGFbM107CisJCXVuc2lnbmVkIGNoYXIgaSwgaiwgdDsKKwkJdW5zaWduZWQgbG9uZyAgZGF0YTsKKworCQlkYXRhID0gUkVBRF9WUkVHKEhFVkNfTVZfSU5GTyk7CisJCWlmIChwaWN0dXJlLT5zbGljZV90eXBlID09IElfU0xJQ0UpCisJCQlkYXRhID0gMDsKKwkJYVswXSA9IGRhdGEgJiAweGZmOworCQlhWzFdID0gKGRhdGEgPj4gOCkgJiAweGZmOworCQlhWzJdID0gKGRhdGEgPj4gMTYpICYgMHhmZjsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJZm9yIChqID0gaSsxOyBqIDwgMzsgaisrKSB7CisJCQkJaWYgKGFbal0gPCBhW2ldKSB7CisJCQkJCXQgPSBhW2pdOworCQkJCQlhW2pdID0gYVtpXTsKKwkJCQkJYVtpXSA9IHQ7CisJCQkJfSBlbHNlIGlmIChhW2pdID09IGFbaV0pIHsKKwkJCQkJYVtpXSsrOworCQkJCQl0ID0gYVtqXTsKKwkJCQkJYVtqXSA9IGFbaV07CisJCQkJCWFbaV0gPSB0OworCQkJCX0KKwkJCX0KKwkJcGljdHVyZS0+bWF4X212ID0gYVsyXTsKKwkJcGljdHVyZS0+YXZnX212ID0gYVsxXTsKKwkJcGljdHVyZS0+bWluX212ID0gYVswXTsKKyNpZmRlZiBERUJVR19RT1MKKwkJaGV2Y19wcmludChoZXZjLCAwLCAibXYgZGF0YSAleCAgYVswXT0gJXggYVsxXT0gJXggYVsyXT0gJXhcbiIsCisJCQlkYXRhLCBhWzBdLCBhWzFdLCBhWzJdKTsKKyNlbmRpZgorCisJCWRhdGEgPSBSRUFEX1ZSRUcoSEVWQ19RUF9JTkZPKTsKKwkJYVswXSA9IGRhdGEgJiAweDFmOworCQlhWzFdID0gKGRhdGEgPj4gOCkgJiAweDNmOworCQlhWzJdID0gKGRhdGEgPj4gMTYpICYgMHg3ZjsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJZm9yIChqID0gaSsxOyBqIDwgMzsgaisrKSB7CisJCQkJaWYgKGFbal0gPCBhW2ldKSB7CisJCQkJCXQgPSBhW2pdOworCQkJCQlhW2pdID0gYVtpXTsKKwkJCQkJYVtpXSA9IHQ7CisJCQkJfSBlbHNlIGlmIChhW2pdID09IGFbaV0pIHsKKwkJCQkJYVtpXSsrOworCQkJCQl0ID0gYVtqXTsKKwkJCQkJYVtqXSA9IGFbaV07CisJCQkJCWFbaV0gPSB0OworCQkJCX0KKwkJCX0KKwkJcGljdHVyZS0+bWF4X3FwID0gYVsyXTsKKwkJcGljdHVyZS0+YXZnX3FwID0gYVsxXTsKKwkJcGljdHVyZS0+bWluX3FwID0gYVswXTsKKyNpZmRlZiBERUJVR19RT1MKKwkJaGV2Y19wcmludChoZXZjLCAwLCAicXAgZGF0YSAleCAgYVswXT0gJXggYVsxXT0gJXggYVsyXT0gJXhcbiIsCisJCQlkYXRhLCBhWzBdLCBhWzFdLCBhWzJdKTsKKyNlbmRpZgorCisJCWRhdGEgPSBSRUFEX1ZSRUcoSEVWQ19TS0lQX0lORk8pOworCQlhWzBdID0gZGF0YSAmIDB4MWY7CisJCWFbMV0gPSAoZGF0YSA+PiA4KSAmIDB4M2Y7CisJCWFbMl0gPSAoZGF0YSA+PiAxNikgJiAweDdmOworCisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCQlmb3IgKGogPSBpKzE7IGogPCAzOyBqKyspIHsKKwkJCQlpZiAoYVtqXSA8IGFbaV0pIHsKKwkJCQkJdCA9IGFbal07CisJCQkJCWFbal0gPSBhW2ldOworCQkJCQlhW2ldID0gdDsKKwkJCQl9IGVsc2UgaWYgKGFbal0gPT0gYVtpXSkgeworCQkJCQlhW2ldKys7CisJCQkJCXQgPSBhW2pdOworCQkJCQlhW2pdID0gYVtpXTsKKwkJCQkJYVtpXSA9IHQ7CisJCQkJfQorCQkJfQorCQlwaWN0dXJlLT5tYXhfc2tpcCA9IGFbMl07CisJCXBpY3R1cmUtPmF2Z19za2lwID0gYVsxXTsKKwkJcGljdHVyZS0+bWluX3NraXAgPSBhWzBdOworCisjaWZkZWYgREVCVUdfUU9TCisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJza2lwIGRhdGEgJXggIGFbMF09ICV4IGFbMV09ICV4IGFbMl09ICV4XG4iLAorCQkJZGF0YSwgYVswXSwgYVsxXSwgYVsyXSk7CisjZW5kaWYKKwl9IGVsc2UgeworCQl1aW50MzJfdCBibGs4OF95X2NvdW50OworCQl1aW50MzJfdCBibGs4OF9jX2NvdW50OworCQl1aW50MzJfdCBibGsyMl9tdl9jb3VudDsKKwkJdWludDMyX3QgcmRhdGEzMjsKKwkJaW50MzJfdCBtdl9oaTsKKwkJaW50MzJfdCBtdl9sbzsKKwkJdWludDMyX3QgcmRhdGEzMl9sOworCQl1aW50MzJfdCBtdnhfTDBfaGk7CisJCXVpbnQzMl90IG12eV9MMF9oaTsKKwkJdWludDMyX3QgbXZ4X0wxX2hpOworCQl1aW50MzJfdCBtdnlfTDFfaGk7CisJCWludDY0X3QgdmFsdWU7CisJCXVpbnQ2NF90IHRlbXBfdmFsdWU7CisjaWZkZWYgREVCVUdfUU9TCisJCWludCBwaWNfbnVtYmVyID0gcGljdHVyZS0+UE9DOworI2VuZGlmCisKKwkJcGljdHVyZS0+bWF4X212ID0gMDsKKwkJcGljdHVyZS0+YXZnX212ID0gMDsKKwkJcGljdHVyZS0+bWluX212ID0gMDsKKworCQlwaWN0dXJlLT5tYXhfc2tpcCA9IDA7CisJCXBpY3R1cmUtPmF2Z19za2lwID0gMDsKKwkJcGljdHVyZS0+bWluX3NraXAgPSAwOworCisJCXBpY3R1cmUtPm1heF9xcCA9IDA7CisJCXBpY3R1cmUtPmF2Z19xcCA9IDA7CisJCXBpY3R1cmUtPm1pbl9xcCA9IDA7CisKKworCisjaWZkZWYgREVCVUdfUU9TCisJCWhldmNfcHJpbnQoaGV2YywgMCwgInNsaWNlX3R5cGU6JWQsIHBvYzolZFxuIiwKKwkJCXBpY3R1cmUtPnNsaWNlX3R5cGUsCisJCQlwaWN0dXJlLT5QT0MpOworI2VuZGlmCisJCS8qIHNldCByZF9pZHggdG8gMCAqLworCSAgICBXUklURV9WUkVHKEhFVkNfUElDX1FVQUxJVFlfQ1RSTCwgMCk7CisKKwkgICAgYmxrODhfeV9jb3VudCA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCSAgICBpZiAoYmxrODhfeV9jb3VudCA9PSAwKSB7CisjaWZkZWYgREVCVUdfUU9TCisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE5PIERhdGEgeWV0LlxuIiwKKwkJCQlwaWNfbnVtYmVyKTsKKyNlbmRpZgorCQkJLyogcmVzZXQgYWxsIGNvdW50cyAqLworCQkJV1JJVEVfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0NUUkwsICgxPDw4KSk7CisJCQlyZXR1cm47CisJICAgIH0KKwkJLyogcXBfeV9zdW0gKi8KKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworI2lmZGVmIERFQlVHX1FPUworCSAgICBoZXZjX3ByaW50KGhldmMsIDAsCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gWSBRUCBBVkcgOiAlZCAoJWQvJWQpXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMi9ibGs4OF95X2NvdW50LAorCQkJcmRhdGEzMiwgYmxrODhfeV9jb3VudCk7CisjZW5kaWYKKwkJcGljdHVyZS0+YXZnX3FwID0gcmRhdGEzMi9ibGs4OF95X2NvdW50OworCQkvKiBpbnRyYV95X2NvdW50ICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgaGV2Y19wcmludChoZXZjLCAwLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIFkgaW50cmEgcmF0ZSA6ICVkJWMgKCVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzIqMTAwL2Jsazg4X3lfY291bnQsCisJCQknJScsIHJkYXRhMzIpOworI2VuZGlmCisJCS8qIHNraXBwZWRfeV9jb3VudCAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisjaWZkZWYgREVCVUdfUU9TCisJICAgIGhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBZIHNraXBwZWQgcmF0ZSA6ICVkJWMgKCVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzIqMTAwL2Jsazg4X3lfY291bnQsCisJCQknJScsIHJkYXRhMzIpOworI2VuZGlmCisJCXBpY3R1cmUtPmF2Z19za2lwID0gcmRhdGEzMioxMDAvYmxrODhfeV9jb3VudDsKKwkJLyogY29lZmZfbm9uX3plcm9feV9jb3VudCAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisjaWZkZWYgREVCVUdfUU9TCisJICAgIGhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBZIFpFUk9fQ29lZmYgcmF0ZSA6ICVkJWMgKCVkKVxuIiwKKwkJCXBpY19udW1iZXIsICgxMDAgLSByZGF0YTMyKjEwMC8oYmxrODhfeV9jb3VudCoxKSksCisJCQknJScsIHJkYXRhMzIpOworI2VuZGlmCisJCS8qIGJsazY2X2NfY291bnQgKi8KKwkgICAgYmxrODhfY19jb3VudCA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCSAgICBpZiAoYmxrODhfY19jb3VudCA9PSAwKSB7CisjaWZkZWYgREVCVUdfUU9TCisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE5PIERhdGEgeWV0LlxuIiwKKwkJCQlwaWNfbnVtYmVyKTsKKyNlbmRpZgorCQkJLyogcmVzZXQgYWxsIGNvdW50cyAqLworCQkJV1JJVEVfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0NUUkwsICgxPDw4KSk7CisJCQlyZXR1cm47CisJICAgIH0KKwkJLyogcXBfY19zdW0gKi8KKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworI2lmZGVmIERFQlVHX1FPUworCSAgICBoZXZjX3ByaW50KGhldmMsIDAsCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gQyBRUCBBVkcgOiAlZCAoJWQvJWQpXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMi9ibGs4OF9jX2NvdW50LAorCQkJcmRhdGEzMiwgYmxrODhfY19jb3VudCk7CisjZW5kaWYKKwkJLyogaW50cmFfY19jb3VudCAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisjaWZkZWYgREVCVUdfUU9TCisJICAgIGhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBDIGludHJhIHJhdGUgOiAlZCVjICglZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyKjEwMC9ibGs4OF9jX2NvdW50LAorCQkJJyUnLCByZGF0YTMyKTsKKyNlbmRpZgorCQkvKiBza2lwcGVkX2N1X2NfY291bnQgKi8KKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworI2lmZGVmIERFQlVHX1FPUworCSAgICBoZXZjX3ByaW50KGhldmMsIDAsCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gQyBza2lwcGVkIHJhdGUgOiAlZCVjICglZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyKjEwMC9ibGs4OF9jX2NvdW50LAorCQkJJyUnLCByZGF0YTMyKTsKKyNlbmRpZgorCQkvKiBjb2VmZl9ub25femVyb19jX2NvdW50ICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgaGV2Y19wcmludChoZXZjLCAwLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIEMgWkVST19Db2VmZiByYXRlIDogJWQlYyAoJWQpXG4iLAorCQkJcGljX251bWJlciwgKDEwMCAtIHJkYXRhMzIqMTAwLyhibGs4OF9jX2NvdW50KjEpKSwKKwkJCSclJywgcmRhdGEzMik7CisjZW5kaWYKKworCQkvKiAxJ2gwLCBxcF9jX21heFs2OjBdLCAxJ2gwLCBxcF9jX21pbls2OjBdLAorCQkxJ2gwLCBxcF95X21heFs2OjBdLCAxJ2gwLCBxcF95X21pbls2OjBdICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgaGV2Y19wcmludChoZXZjLCAwLCAiW1BpY3R1cmUgJWQgUXVhbGl0eV0gWSBRUCBtaW4gOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIChyZGF0YTMyPj4wKSYweGZmKTsKKyNlbmRpZgorCQlwaWN0dXJlLT5taW5fcXAgPSAocmRhdGEzMj4+MCkmMHhmZjsKKworI2lmZGVmIERFQlVHX1FPUworCSAgICBoZXZjX3ByaW50KGhldmMsIDAsICJbUGljdHVyZSAlZCBRdWFsaXR5XSBZIFFQIG1heCA6ICVkXG4iLAorCQkJcGljX251bWJlciwgKHJkYXRhMzI+PjgpJjB4ZmYpOworI2VuZGlmCisJCXBpY3R1cmUtPm1heF9xcCA9IChyZGF0YTMyPj44KSYweGZmOworCisjaWZkZWYgREVCVUdfUU9TCisJICAgIGhldmNfcHJpbnQoaGV2YywgMCwgIltQaWN0dXJlICVkIFF1YWxpdHldIEMgUVAgbWluIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCAocmRhdGEzMj4+MTYpJjB4ZmYpOworCSAgICBoZXZjX3ByaW50KGhldmMsIDAsICJbUGljdHVyZSAlZCBRdWFsaXR5XSBDIFFQIG1heCA6ICVkXG4iLAorCQkJcGljX251bWJlciwgKHJkYXRhMzI+PjI0KSYweGZmKTsKKyNlbmRpZgorCisJCS8qIGJsazIyX212X2NvdW50ICovCisJICAgIGJsazIyX212X2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJICAgIGlmIChibGsyMl9tdl9jb3VudCA9PSAwKSB7CisjaWZkZWYgREVCVUdfUU9TCisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE5PIE1WIERhdGEgeWV0LlxuIiwKKwkJCQlwaWNfbnVtYmVyKTsKKyNlbmRpZgorCQkJLyogcmVzZXQgYWxsIGNvdW50cyAqLworCQkJV1JJVEVfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0NUUkwsICgxPDw4KSk7CisJCQlyZXR1cm47CisJICAgIH0KKwkJLyogbXZ5X0wxX2NvdW50WzM5OjMyXSwgbXZ4X0wxX2NvdW50WzM5OjMyXSwKKwkJbXZ5X0wwX2NvdW50WzM5OjMyXSwgbXZ4X0wwX2NvdW50WzM5OjMyXSAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJICAgIC8qIHNob3VsZCBhbGwgYmUgMHgwMCBvciAweGZmICovCisjaWZkZWYgREVCVUdfUU9TCisJICAgIGhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNViBBVkcgSGlnaCBCaXRzOiAweCVYXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMik7CisjZW5kaWYKKwkgICAgbXZ4X0wwX2hpID0gKChyZGF0YTMyPj4wKSYweGZmKTsKKwkgICAgbXZ5X0wwX2hpID0gKChyZGF0YTMyPj44KSYweGZmKTsKKwkgICAgbXZ4X0wxX2hpID0gKChyZGF0YTMyPj4xNikmMHhmZik7CisJICAgIG12eV9MMV9oaSA9ICgocmRhdGEzMj4+MjQpJjB4ZmYpOworCisJCS8qIG12eF9MMF9jb3VudFszMTowXSAqLworCSAgICByZGF0YTMyX2wgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkJdGVtcF92YWx1ZSA9IG12eF9MMF9oaTsKKwkJdGVtcF92YWx1ZSA9ICh0ZW1wX3ZhbHVlIDw8IDMyKSB8IHJkYXRhMzJfbDsKKworCQlpZiAobXZ4X0wwX2hpICYgMHg4MCkKKwkJCXZhbHVlID0gMHhGRkZGRkZGMDAwMDAwMDAwIHwgdGVtcF92YWx1ZTsKKwkJZWxzZQorCQkJdmFsdWUgPSB0ZW1wX3ZhbHVlOworCQkgdmFsdWUgPSBkaXZfczY0KHZhbHVlLCBibGsyMl9tdl9jb3VudCk7CisjaWZkZWYgREVCVUdfUU9TCisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVlhfTDAgQVZHIDogJWQgKCVsbGQvJWQpXG4iLAorCQkJcGljX251bWJlciwgKGludCl2YWx1ZSwKKwkJCXZhbHVlLCBibGsyMl9tdl9jb3VudCk7CisjZW5kaWYKKwkJcGljdHVyZS0+YXZnX212ID0gdmFsdWU7CisKKwkJLyogbXZ5X0wwX2NvdW50WzMxOjBdICovCisJICAgIHJkYXRhMzJfbCA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCQl0ZW1wX3ZhbHVlID0gbXZ5X0wwX2hpOworCQl0ZW1wX3ZhbHVlID0gKHRlbXBfdmFsdWUgPDwgMzIpIHwgcmRhdGEzMl9sOworCisJCWlmIChtdnlfTDBfaGkgJiAweDgwKQorCQkJdmFsdWUgPSAweEZGRkZGRkYwMDAwMDAwMDAgfCB0ZW1wX3ZhbHVlOworCQllbHNlCisJCQl2YWx1ZSA9IHRlbXBfdmFsdWU7CisjaWZkZWYgREVCVUdfUU9TCisJICAgIGhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVllfTDAgQVZHIDogJWQgKCVsbGQvJWQpXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMl9sL2JsazIyX212X2NvdW50LAorCQkJdmFsdWUsIGJsazIyX212X2NvdW50KTsKKyNlbmRpZgorCisJCS8qIG12eF9MMV9jb3VudFszMTowXSAqLworCSAgICByZGF0YTMyX2wgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkJdGVtcF92YWx1ZSA9IG12eF9MMV9oaTsKKwkJdGVtcF92YWx1ZSA9ICh0ZW1wX3ZhbHVlIDw8IDMyKSB8IHJkYXRhMzJfbDsKKwkJaWYgKG12eF9MMV9oaSAmIDB4ODApCisJCQl2YWx1ZSA9IDB4RkZGRkZGRjAwMDAwMDAwMCB8IHRlbXBfdmFsdWU7CisJCWVsc2UKKwkJCXZhbHVlID0gdGVtcF92YWx1ZTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgaGV2Y19wcmludChoZXZjLCAwLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWF9MMSBBVkcgOiAlZCAoJWxsZC8lZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyX2wvYmxrMjJfbXZfY291bnQsCisJCQl2YWx1ZSwgYmxrMjJfbXZfY291bnQpOworI2VuZGlmCisKKwkJLyogbXZ5X0wxX2NvdW50WzMxOjBdICovCisJICAgIHJkYXRhMzJfbCA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCQl0ZW1wX3ZhbHVlID0gbXZ5X0wxX2hpOworCQl0ZW1wX3ZhbHVlID0gKHRlbXBfdmFsdWUgPDwgMzIpIHwgcmRhdGEzMl9sOworCQlpZiAobXZ5X0wxX2hpICYgMHg4MCkKKwkJCXZhbHVlID0gMHhGRkZGRkZGMDAwMDAwMDAwIHwgdGVtcF92YWx1ZTsKKwkJZWxzZQorCQkJdmFsdWUgPSB0ZW1wX3ZhbHVlOworI2lmZGVmIERFQlVHX1FPUworCSAgICBoZXZjX3ByaW50KGhldmMsIDAsCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZZX0wxIEFWRyA6ICVkICglbGxkLyVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzJfbC9ibGsyMl9tdl9jb3VudCwKKwkJCXZhbHVlLCBibGsyMl9tdl9jb3VudCk7CisjZW5kaWYKKworCQkvKiB7bXZ4X0wwX21heCwgbXZ4X0wwX21pbn0gLy8gZm9ybWF0IDoge3NpZ24sIGFic1sxNDowXX0gICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkgICAgbXZfaGkgPSAocmRhdGEzMj4+MTYpJjB4ZmZmZjsKKwkgICAgaWYgKG12X2hpICYgMHg4MDAwKQorCQkJbXZfaGkgPSAweDgwMDAgLSBtdl9oaTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgaGV2Y19wcmludChoZXZjLCAwLCAiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZYX0wwIE1BWCA6ICVkXG4iLAorCQkJcGljX251bWJlciwgbXZfaGkpOworI2VuZGlmCisJCXBpY3R1cmUtPm1heF9tdiA9IG12X2hpOworCisJICAgIG12X2xvID0gKHJkYXRhMzI+PjApJjB4ZmZmZjsKKwkgICAgaWYgKG12X2xvICYgMHg4MDAwKQorCQkJbXZfbG8gPSAweDgwMDAgLSBtdl9sbzsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgaGV2Y19wcmludChoZXZjLCAwLCAiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZYX0wwIE1JTiA6ICVkXG4iLAorCQkJcGljX251bWJlciwgbXZfbG8pOworI2VuZGlmCisJCXBpY3R1cmUtPm1pbl9tdiA9IG12X2xvOworCisjaWZkZWYgREVCVUdfUU9TCisJCS8qIHttdnlfTDBfbWF4LCBtdnlfTDBfbWlufSAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJICAgIG12X2hpID0gKHJkYXRhMzI+PjE2KSYweGZmZmY7CisJICAgIGlmIChtdl9oaSAmIDB4ODAwMCkKKwkJCW12X2hpID0gMHg4MDAwIC0gbXZfaGk7CisJICAgIGhldmNfcHJpbnQoaGV2YywgMCwgIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWV9MMCBNQVggOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIG12X2hpKTsKKworCisJICAgIG12X2xvID0gKHJkYXRhMzI+PjApJjB4ZmZmZjsKKwkgICAgaWYgKG12X2xvICYgMHg4MDAwKQorCQkJbXZfbG8gPSAweDgwMDAgLSBtdl9sbzsKKworCSAgICBoZXZjX3ByaW50KGhldmMsIDAsICJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVllfTDAgTUlOIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9sbyk7CisKKworCQkvKiB7bXZ4X0wxX21heCwgbXZ4X0wxX21pbn0gKi8KKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCSAgICBtdl9oaSA9IChyZGF0YTMyPj4xNikmMHhmZmZmOworCSAgICBpZiAobXZfaGkgJiAweDgwMDApCisJCQltdl9oaSA9IDB4ODAwMCAtIG12X2hpOworCisJICAgIGhldmNfcHJpbnQoaGV2YywgMCwgIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWF9MMSBNQVggOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIG12X2hpKTsKKworCisJICAgIG12X2xvID0gKHJkYXRhMzI+PjApJjB4ZmZmZjsKKwkgICAgaWYgKG12X2xvICYgMHg4MDAwKQorCQkJbXZfbG8gPSAweDgwMDAgLSBtdl9sbzsKKworCSAgICBoZXZjX3ByaW50KGhldmMsIDAsICJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVlhfTDEgTUlOIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9sbyk7CisKKworCQkvKiB7bXZ5X0wxX21heCwgbXZ5X0wxX21pbn0gKi8KKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCSAgICBtdl9oaSA9IChyZGF0YTMyPj4xNikmMHhmZmZmOworCSAgICBpZiAobXZfaGkgJiAweDgwMDApCisJCQltdl9oaSA9IDB4ODAwMCAtIG12X2hpOworCisJICAgIGhldmNfcHJpbnQoaGV2YywgMCwgIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWV9MMSBNQVggOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIG12X2hpKTsKKworCSAgICBtdl9sbyA9IChyZGF0YTMyPj4wKSYweGZmZmY7CisJICAgIGlmIChtdl9sbyAmIDB4ODAwMCkKKwkJCW12X2xvID0gMHg4MDAwIC0gbXZfbG87CisKKwkgICAgaGV2Y19wcmludChoZXZjLCAwLCAiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZZX0wxIE1JTiA6ICVkXG4iLAorCQkJcGljX251bWJlciwgbXZfbG8pOworI2VuZGlmCisKKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0NUUkwpOworI2lmZGVmIERFQlVHX1FPUworCSAgICBoZXZjX3ByaW50KGhldmMsIDAsCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gQWZ0ZXIgUmVhZCA6IFZERUNfUElDX1FVQUxJVFlfQ1RSTCA6IDB4JXhcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyKTsKKyNlbmRpZgorCQkvKiByZXNldCBhbGwgY291bnRzICovCisJICAgIFdSSVRFX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9DVFJMLCAoMTw8OCkpOworCX0KK30KKworc3RhdGljIGludCBoZXZjX3NsaWNlX3NlZ21lbnRfaGVhZGVyX3Byb2Nlc3Moc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwkJdW5pb24gcGFyYW1fdSAqcnBtX3BhcmFtLAorCQlpbnQgZGVjb2RlX3BpY19iZWdpbikKK3sKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGhldmMpOworI2VuZGlmCisJaW50IGk7CisJaW50IGxjdV94X251bV9kaXY7CisJaW50IGxjdV95X251bV9kaXY7CisJaW50IENvbF9yZWY7CisJaW50IGRiZ19za2lwX2ZsYWcgPSAwOworCisJaWYgKGhldmMtPndhaXRfYnVmID09IDApIHsKKwkJaGV2Yy0+c3BzX251bV9yZW9yZGVyX3BpY3NfMCA9CisJCQlycG1fcGFyYW0tPnAuc3BzX251bV9yZW9yZGVyX3BpY3NfMDsKKwkJaGV2Yy0+aXBfbW9kZSA9ICghaGV2Yy0+c3BzX251bV9yZW9yZGVyX3BpY3NfMCAmJgorCQkJCQkJCSEodmRlYy0+c2xhdmUgfHwgdmRlYy0+bWFzdGVyKSAmJgorCQkJCQkJCSFkaXNhYmxlX2lwX21vZGUpID8gdHJ1ZSA6IGZhbHNlOworCQloZXZjLT5tX3RlbXBvcmFsSWQgPSBycG1fcGFyYW0tPnAubV90ZW1wb3JhbElkOworCQloZXZjLT5tX25hbFVuaXRUeXBlID0gcnBtX3BhcmFtLT5wLm1fbmFsVW5pdFR5cGU7CisJCWhldmMtPmludGVybGFjZV9mbGFnID0KKwkJCShycG1fcGFyYW0tPnAucHJvZmlsZV9ldGMgPj4gMikgJiAweDE7CisJCWhldmMtPmN1cnJfcGljX3N0cnVjdCA9CisJCQkocnBtX3BhcmFtLT5wLnNlaV9mcmFtZV9maWVsZF9pbmZvID4+IDMpICYgMHhmOworCQloZXZjLT5mcmFtZV9maWVsZF9pbmZvX3ByZXNlbnRfZmxhZyA9CisJCQkocnBtX3BhcmFtLT5wLnNlaV9mcmFtZV9maWVsZF9pbmZvID4+IDgpICYgMHgxOworCisJCWlmIChoZXZjLT5mcmFtZV9maWVsZF9pbmZvX3ByZXNlbnRfZmxhZykgeworCQkJaWYgKGhldmMtPmN1cnJfcGljX3N0cnVjdCA9PSAwCisJCQkJfHwgaGV2Yy0+Y3Vycl9waWNfc3RydWN0ID09IDcKKwkJCQl8fCBoZXZjLT5jdXJyX3BpY19zdHJ1Y3QgPT0gOCkKKwkJCQloZXZjLT5pbnRlcmxhY2VfZmxhZyA9IDA7CisJCX0KKworCQloZXZjX3ByaW50KGhldmMsIEgyNjVfREVCVUdfUElDX1NUUlVDVCwKKwkJCQkiZnJhbWVfZmllbGRfaW5mb19wcmVzZW50X2ZsYWcgPSAlZCBjdXJyX3BpY19zdHJ1Y3QgPSAlZCBpbnRlcmxhY2VfZmxhZyA9ICVkXG4iLAorCQkJCSAgIGhldmMtPmZyYW1lX2ZpZWxkX2luZm9fcHJlc2VudF9mbGFnLAorCQkJCSAgIGhldmMtPmN1cnJfcGljX3N0cnVjdCwKKwkJCQkgICBoZXZjLT5pbnRlcmxhY2VfZmxhZyk7CisKKwkJLyogaWYgKGludGVybGFjZV9lbmFibGUgPT0gMCB8fCBoZXZjLT5tX2luc19mbGFnKSAqLworCQlpZiAoaW50ZXJsYWNlX2VuYWJsZSA9PSAwKQorCQkJaGV2Yy0+aW50ZXJsYWNlX2ZsYWcgPSAwOworCQlpZiAoaW50ZXJsYWNlX2VuYWJsZSAmIDB4MTAwKQorCQkJaGV2Yy0+aW50ZXJsYWNlX2ZsYWcgPSBpbnRlcmxhY2VfZW5hYmxlICYgMHgxOworCQlpZiAoaGV2Yy0+aW50ZXJsYWNlX2ZsYWcgPT0gMCkKKwkJCWhldmMtPmN1cnJfcGljX3N0cnVjdCA9IDA7CisJCS8qIGlmKGhldmMtPm1fbmFsVW5pdFR5cGUgPT0gTkFMX1VOSVRfRU9TKXsgKi8KKwkJLyoKKwkJICpoZXZjLT5tX3BvY1JhbmRvbUFjY2VzcyA9IE1BWF9JTlQ7CisJCSAqCS8vYWRkIHRvIGZpeCBSQVBfQl9Cb3NzZW5fMQorCQkgKi8KKwkJLyogfSAqLworCQloZXZjLT5taXNjX2ZsYWcwID0gcnBtX3BhcmFtLT5wLm1pc2NfZmxhZzA7CisJCWlmIChycG1fcGFyYW0tPnAuZmlyc3Rfc2xpY2Vfc2VnbWVudF9pbl9waWNfZmxhZyA9PSAwKSB7CisJCQloZXZjLT5zbGljZV9zZWdtZW50X2FkZHIgPQorCQkJCXJwbV9wYXJhbS0+cC5zbGljZV9zZWdtZW50X2FkZHJlc3M7CisJCQlpZiAoIXJwbV9wYXJhbS0+cC5kZXBlbmRlbnRfc2xpY2Vfc2VnbWVudF9mbGFnKQorCQkJCWhldmMtPnNsaWNlX2FkZHIgPSBoZXZjLT5zbGljZV9zZWdtZW50X2FkZHI7CisJCX0gZWxzZSB7CisJCQloZXZjLT5zbGljZV9zZWdtZW50X2FkZHIgPSAwOworCQkJaGV2Yy0+c2xpY2VfYWRkciA9IDA7CisJCX0KKworCQloZXZjLT5pUHJldlBPQyA9IGhldmMtPmN1cnJfUE9DOworCQloZXZjLT5zbGljZV90eXBlID0gKHJwbV9wYXJhbS0+cC5zbGljZV90eXBlID09IElfU0xJQ0UpID8gMiA6CisJCQkocnBtX3BhcmFtLT5wLnNsaWNlX3R5cGUgPT0gUF9TTElDRSkgPyAxIDoKKwkJCShycG1fcGFyYW0tPnAuc2xpY2VfdHlwZSA9PSBCX1NMSUNFKSA/IDAgOiAzOworCQkvKiBoZXZjLT5jdXJyX3ByZWRGbGFnX0wwPShoZXZjLT5zbGljZV90eXBlPT0yKSA/IDA6MTsgKi8KKwkJLyogaGV2Yy0+Y3Vycl9wcmVkRmxhZ19MMT0oaGV2Yy0+c2xpY2VfdHlwZT09MCkgPyAxOjA7ICovCisJCWhldmMtPlRNVlBGbGFnID0gcnBtX3BhcmFtLT5wLnNsaWNlX3RlbXBvcmFsX212cF9lbmFibGVfZmxhZzsKKwkJaGV2Yy0+aXNOZXh0U2xpY2VTZWdtZW50ID0KKwkJCXJwbV9wYXJhbS0+cC5kZXBlbmRlbnRfc2xpY2Vfc2VnbWVudF9mbGFnID8gMSA6IDA7CisJCWlmIChpc19vdmVyc2l6ZV9leChycG1fcGFyYW0tPnAucGljX3dpZHRoX2luX2x1bWFfc2FtcGxlcywKKwkJCQlycG1fcGFyYW0tPnAucGljX2hlaWdodF9pbl9sdW1hX3NhbXBsZXMpKSB7CisJCQloZXZjX3ByaW50KGhldmMsIDAsICJvdmVyIHNpemUgOiAldSB4ICV1LlxuIiwKKwkJCQlycG1fcGFyYW0tPnAucGljX3dpZHRoX2luX2x1bWFfc2FtcGxlcywgcnBtX3BhcmFtLT5wLnBpY19oZWlnaHRfaW5fbHVtYV9zYW1wbGVzKTsKKwkJCWlmICgoIWhldmMtPm1faW5zX2ZsYWcpICYmCisJCQkJKChkZWJ1ZyAmCisJCQkJSDI2NV9OT19DSEFOR19ERUJVR19GTEFHX0lOX0NPREUpID09IDApKQorCQkJCWRlYnVnIHw9IChIMjY1X0RFQlVHX0RJU19MT0NfRVJST1JfUFJPQyB8CisJCQkJSDI2NV9ERUJVR19ESVNfU1lTX0VSUk9SX1BST0MpOworCQkJcmV0dXJuIDM7CisJCX0KKworCQlpZiAoaGV2Yy0+cGljX3cgIT0gcnBtX3BhcmFtLT5wLnBpY193aWR0aF9pbl9sdW1hX3NhbXBsZXMKKwkJCXx8IGhldmMtPnBpY19oICE9CisJCQlycG1fcGFyYW0tPnAucGljX2hlaWdodF9pbl9sdW1hX3NhbXBsZXMpIHsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkiUGljIFdpZHRoL0hlaWdodCBDaGFuZ2UgKCVkLCVkKT0+KCVkLCVkKSwgaW50ZXJsYWNlICVkXG4iLAorCQkJCSAgIGhldmMtPnBpY193LCBoZXZjLT5waWNfaCwKKwkJCQkgICBycG1fcGFyYW0tPnAucGljX3dpZHRoX2luX2x1bWFfc2FtcGxlcywKKwkJCQkgICBycG1fcGFyYW0tPnAucGljX2hlaWdodF9pbl9sdW1hX3NhbXBsZXMsCisJCQkJICAgaGV2Yy0+aW50ZXJsYWNlX2ZsYWcpOworCisJCQloZXZjLT5waWNfdyA9IHJwbV9wYXJhbS0+cC5waWNfd2lkdGhfaW5fbHVtYV9zYW1wbGVzOworCQkJaGV2Yy0+cGljX2ggPSBycG1fcGFyYW0tPnAucGljX2hlaWdodF9pbl9sdW1hX3NhbXBsZXM7CisJCQloZXZjLT5mcmFtZV93aWR0aCA9IGhldmMtPnBpY193OworCQkJaGV2Yy0+ZnJhbWVfaGVpZ2h0ID0gaGV2Yy0+cGljX2g7CisjaWZkZWYgTE9TTEVTU19DT01QUkVTU19NT0RFCisJCQlpZiAoLypyZV9jb25maWdfcGljX2ZsYWcgPT0gMCAmJiovCisJCQkJKGdldF9kb3VibGVfd3JpdGVfbW9kZShoZXZjKSAmIDB4MTApID09IDApCisJCQkJaW5pdF9kZWNvZGVfaGVhZF9odyhoZXZjKTsKKyNlbmRpZgorCQl9CisKKwkJaWYgKGhldmMtPmJpdF9kZXB0aF9jaHJvbWEgPiAxMCB8fAorCQkJaGV2Yy0+Yml0X2RlcHRoX2x1bWEgPiAxMCkgeworCQkJaGV2Y19wcmludChoZXZjLCAwLCAidW5zdXBwb3J0IGJpdGRlcHRoIDogJXUsJXVcbiIsCisJCQkJaGV2Yy0+Yml0X2RlcHRoX2Nocm9tYSwKKwkJCQloZXZjLT5iaXRfZGVwdGhfbHVtYSk7CisJCQlpZiAoIWhldmMtPm1faW5zX2ZsYWcpCisJCQkJZGVidWcgfD0gKEgyNjVfREVCVUdfRElTX0xPQ19FUlJPUl9QUk9DIHwKKwkJCQlIMjY1X0RFQlVHX0RJU19TWVNfRVJST1JfUFJPQyk7CisJCQloZXZjLT5mYXRhbF9lcnJvciB8PSBERUNPREVSX0ZBVEFMX0VSUk9SX1NJWkVfT1ZFUkZMT1c7CisJCQlyZXR1cm4gNDsKKwkJfQorCisJCS8qIGl0IHdpbGwgY2F1c2UgZGl2aWRlIDAgZXJyb3IgKi8KKwkJaWYgKGhldmMtPnBpY193ID09IDAgfHwgaGV2Yy0+cGljX2ggPT0gMCkgeworCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSkgeworCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJIkZhdGFsIEVycm9yLCBwaWNfdyA9ICVkLCBwaWNfaCA9ICVkXG4iLAorCQkJCQkgICBoZXZjLT5waWNfdywgaGV2Yy0+cGljX2gpOworCQkJfQorCQkJcmV0dXJuIDM7CisJCX0KKwkJcGljX2xpc3RfcHJvY2VzcyhoZXZjKTsKKworCQloZXZjLT5sY3Vfc2l6ZSA9CisJCQkxIDw8IChycG1fcGFyYW0tPnAubG9nMl9taW5fY29kaW5nX2Jsb2NrX3NpemVfbWludXMzICsKKwkJCQkJMyArIHJwbV9wYXJhbS0+CisJCQkJCXAubG9nMl9kaWZmX21heF9taW5fY29kaW5nX2Jsb2NrX3NpemUpOworCQlpZiAoaGV2Yy0+bGN1X3NpemUgPT0gMCkgeworCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSJFcnJvciwgbGN1X3NpemUgPSAwICglZCwlZClcbiIsCisJCQkJICAgcnBtX3BhcmFtLT5wLgorCQkJCSAgIGxvZzJfbWluX2NvZGluZ19ibG9ja19zaXplX21pbnVzMywKKwkJCQkgICBycG1fcGFyYW0tPnAuCisJCQkJICAgbG9nMl9kaWZmX21heF9taW5fY29kaW5nX2Jsb2NrX3NpemUpOworCQkJcmV0dXJuIDM7CisJCX0KKwkJaGV2Yy0+bGN1X3NpemVfbG9nMiA9IGxvZzJpKGhldmMtPmxjdV9zaXplKTsKKwkJbGN1X3hfbnVtX2RpdiA9IChoZXZjLT5waWNfdyAvIGhldmMtPmxjdV9zaXplKTsKKwkJbGN1X3lfbnVtX2RpdiA9IChoZXZjLT5waWNfaCAvIGhldmMtPmxjdV9zaXplKTsKKwkJaGV2Yy0+bGN1X3hfbnVtID0KKwkJCSgoaGV2Yy0+cGljX3cgJSBoZXZjLT5sY3Vfc2l6ZSkgPT0KKwkJCSAwKSA/IGxjdV94X251bV9kaXYgOiBsY3VfeF9udW1fZGl2ICsgMTsKKwkJaGV2Yy0+bGN1X3lfbnVtID0KKwkJCSgoaGV2Yy0+cGljX2ggJSBoZXZjLT5sY3Vfc2l6ZSkgPT0KKwkJCSAwKSA/IGxjdV95X251bV9kaXYgOiBsY3VfeV9udW1fZGl2ICsgMTsKKwkJaGV2Yy0+bGN1X3RvdGFsID0gaGV2Yy0+bGN1X3hfbnVtICogaGV2Yy0+bGN1X3lfbnVtOworCisJCWlmIChoZXZjLT5tX25hbFVuaXRUeXBlID09IE5BTF9VTklUX0NPREVEX1NMSUNFX0lEUgorCQkJfHwgaGV2Yy0+bV9uYWxVbml0VHlwZSA9PQorCQkJTkFMX1VOSVRfQ09ERURfU0xJQ0VfSURSX05fTFApIHsKKwkJCWhldmMtPmN1cnJfUE9DID0gMDsKKwkJCWlmICgoaGV2Yy0+bV90ZW1wb3JhbElkIC0gMSkgPT0gMCkKKwkJCQloZXZjLT5pUHJldlRpZDBQT0MgPSBoZXZjLT5jdXJyX1BPQzsKKwkJfSBlbHNlIHsKKwkJCWludCBpTWF4UE9DbHNiID0KKwkJCQkxIDw8IChycG1fcGFyYW0tPnAuCisJCQkJbG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICsgNCk7CisJCQlpbnQgaVByZXZQT0Nsc2I7CisJCQlpbnQgaVByZXZQT0Ntc2I7CisJCQlpbnQgaVBPQ21zYjsKKwkJCWludCBpUE9DbHNiID0gcnBtX3BhcmFtLT5wLlBPQ2xzYjsKKworCQkJaWYgKGlNYXhQT0Nsc2IgPT0gMCkgeworCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJImVycm9yIGlNYXhQT0Nsc2IgaXMgMFxuIik7CisJCQkJcmV0dXJuIDM7CisJCQl9CisKKwkJCWlQcmV2UE9DbHNiID0gaGV2Yy0+aVByZXZUaWQwUE9DICUgaU1heFBPQ2xzYjsKKwkJCWlQcmV2UE9DbXNiID0gaGV2Yy0+aVByZXZUaWQwUE9DIC0gaVByZXZQT0Nsc2I7CisKKwkJCWlmICgoaVBPQ2xzYiA8IGlQcmV2UE9DbHNiKQorCQkJCSYmICgoaVByZXZQT0Nsc2IgLSBpUE9DbHNiKSA+PQorCQkJCQkoaU1heFBPQ2xzYiAvIDIpKSkKKwkJCQlpUE9DbXNiID0gaVByZXZQT0Ntc2IgKyBpTWF4UE9DbHNiOworCQkJZWxzZSBpZiAoKGlQT0Nsc2IgPiBpUHJldlBPQ2xzYikKKwkJCQkJICYmICgoaVBPQ2xzYiAtIGlQcmV2UE9DbHNiKSA+CisJCQkJCQkgKGlNYXhQT0Nsc2IgLyAyKSkpCisJCQkJaVBPQ21zYiA9IGlQcmV2UE9DbXNiIC0gaU1heFBPQ2xzYjsKKwkJCWVsc2UKKwkJCQlpUE9DbXNiID0gaVByZXZQT0Ntc2I7CisJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1IpIHsKKwkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJImlQcmVQT0MlZCBpTWF4UE9DbHNiJWQgaVBPQ21zYiVkIGlQT0Nsc2IlZFxuIiwKKwkJCQkgaGV2Yy0+aVByZXZUaWQwUE9DLCBpTWF4UE9DbHNiLCBpUE9DbXNiLAorCQkJCSBpUE9DbHNiKTsKKwkJCX0KKwkJCWlmIChoZXZjLT5tX25hbFVuaXRUeXBlID09IE5BTF9VTklUX0NPREVEX1NMSUNFX0JMQQorCQkJCXx8IGhldmMtPm1fbmFsVW5pdFR5cGUgPT0KKwkJCQlOQUxfVU5JVF9DT0RFRF9TTElDRV9CTEFOVAorCQkJCXx8IGhldmMtPm1fbmFsVW5pdFR5cGUgPT0KKwkJCQlOQUxfVU5JVF9DT0RFRF9TTElDRV9CTEFfTl9MUCkgeworCQkJCS8qIEZvciBCTEEgcGljdHVyZSB0eXBlcywgUE9DbXNiIGlzIHNldCB0byAwLiAqLworCQkJCWlQT0Ntc2IgPSAwOworCQkJfQorCQkJaGV2Yy0+Y3Vycl9QT0MgPSAoaVBPQ21zYiArIGlQT0Nsc2IpOworCQkJaWYgKChoZXZjLT5tX3RlbXBvcmFsSWQgLSAxKSA9PSAwKQorCQkJCWhldmMtPmlQcmV2VGlkMFBPQyA9IGhldmMtPmN1cnJfUE9DOworCQkJZWxzZSB7CisJCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKSB7CisJCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJCSJtX3RlbXBvcmFsSUQgaXMgJWRcbiIsCisJCQkJCQkgICBoZXZjLT5tX3RlbXBvcmFsSWQpOworCQkJCX0KKwkJCX0KKwkJfQorCQloZXZjLT5SZWZOdW1fTDAgPQorCQkJKHJwbV9wYXJhbS0+cC5udW1fcmVmX2lkeF9sMF9hY3RpdmUgPgorCQkJIE1BWF9SRUZfQUNUSVZFKSA/IE1BWF9SRUZfQUNUSVZFIDogcnBtX3BhcmFtLT5wLgorCQkJbnVtX3JlZl9pZHhfbDBfYWN0aXZlOworCQloZXZjLT5SZWZOdW1fTDEgPQorCQkJKHJwbV9wYXJhbS0+cC5udW1fcmVmX2lkeF9sMV9hY3RpdmUgPgorCQkJIE1BWF9SRUZfQUNUSVZFKSA/IE1BWF9SRUZfQUNUSVZFIDogcnBtX3BhcmFtLT5wLgorCQkJbnVtX3JlZl9pZHhfbDFfYWN0aXZlOworCisJCS8qIGlmKGN1cnJfUE9DPT0weDEwKSBkdW1wX2xtZW0oKTsgKi8KKworCQkvKiBza2lwIFJBU0wgcGljdHVyZXMgYWZ0ZXIgQ1JBL0JMQSBwaWN0dXJlcyAqLworCQlpZiAoaGV2Yy0+bV9wb2NSYW5kb21BY2Nlc3MgPT0gTUFYX0lOVCkgey8qIGZpcnN0IHBpY3R1cmUgKi8KKwkJCWlmIChoZXZjLT5tX25hbFVuaXRUeXBlID09IE5BTF9VTklUX0NPREVEX1NMSUNFX0NSQSB8fAorCQkJCWhldmMtPm1fbmFsVW5pdFR5cGUgPT0gTkFMX1VOSVRfQ09ERURfU0xJQ0VfQkxBCisJCQkJfHwgaGV2Yy0+bV9uYWxVbml0VHlwZSA9PQorCQkJCU5BTF9VTklUX0NPREVEX1NMSUNFX0JMQU5UCisJCQkJfHwgaGV2Yy0+bV9uYWxVbml0VHlwZSA9PQorCQkJCU5BTF9VTklUX0NPREVEX1NMSUNFX0JMQV9OX0xQKQorCQkJCWhldmMtPm1fcG9jUmFuZG9tQWNjZXNzID0gaGV2Yy0+Y3Vycl9QT0M7CisJCQllbHNlCisJCQkJaGV2Yy0+bV9wb2NSYW5kb21BY2Nlc3MgPSAtTUFYX0lOVDsKKwkJfSBlbHNlIGlmIChoZXZjLT5tX25hbFVuaXRUeXBlID09IE5BTF9VTklUX0NPREVEX1NMSUNFX0JMQQorCQkJCSAgIHx8IGhldmMtPm1fbmFsVW5pdFR5cGUgPT0KKwkJCQkgICBOQUxfVU5JVF9DT0RFRF9TTElDRV9CTEFOVAorCQkJCSAgIHx8IGhldmMtPm1fbmFsVW5pdFR5cGUgPT0KKwkJCQkgICBOQUxfVU5JVF9DT0RFRF9TTElDRV9CTEFfTl9MUCkKKwkJCWhldmMtPm1fcG9jUmFuZG9tQWNjZXNzID0gaGV2Yy0+Y3Vycl9QT0M7CisJCWVsc2UgaWYgKChoZXZjLT5jdXJyX1BPQyA8IGhldmMtPm1fcG9jUmFuZG9tQWNjZXNzKSAmJgorCQkJCShuYWxfc2tpcF9wb2xpY3kgPj0gMykgJiYKKwkJCQkgKGhldmMtPm1fbmFsVW5pdFR5cGUgPT0KKwkJCQkgIE5BTF9VTklUX0NPREVEX1NMSUNFX1JBU0xfTiB8fAorCQkJCSAgaGV2Yy0+bV9uYWxVbml0VHlwZSA9PQorCQkJCSAgTkFMX1VOSVRfQ09ERURfU0xJQ0VfVEZEKSkgewkvKiBza2lwICovCisJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpKSB7CisJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSJSQVNMIHBpY3R1cmUgd2l0aCBQT0MgJWQgPCAlZCAiLAorCQkJCSBoZXZjLT5jdXJyX1BPQywgaGV2Yy0+bV9wb2NSYW5kb21BY2Nlc3MpOworCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJIlJhbmRvbUFjY2VzcyBwb2ludCBQT0MpLCBza2lwIGl0XG4iKTsKKwkJCX0KKwkJCXJldHVybiAxOworCQkJfQorCisJCVdSSVRFX1ZSRUcoSEVWQ19XQUlUX0ZMQUcsIFJFQURfVlJFRyhIRVZDX1dBSVRfRkxBRykgfCAweDIpOworCQloZXZjLT5za2lwX2ZsYWcgPSAwOworCQkvKiovCisJCS8qIGlmKChpUHJldlBPQyAhPSBjdXJyX1BPQykpeyAqLworCQlpZiAocnBtX3BhcmFtLT5wLnNsaWNlX3NlZ21lbnRfYWRkcmVzcyA9PSAwKSB7CisJCQlzdHJ1Y3QgUElDX3MgKnBpYyA9IE5VTEw7CisKKwkJCWhldmMtPm5ld19waWMgPSAxOworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwkJCWlmICghaGV2Yy0+bV9pbnNfZmxhZykKKyNlbmRpZgorCQkJCWNoZWNrX3BpY19kZWNvZGVkX2Vycm9yX3ByZShoZXZjLAorCQkJCQlSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfTENVX1NUQVJUKQorCQkJCQkmIDB4ZmZmZmZmKTsKKwkJCWlmICh2ZGVjX3N0cmVhbV9iYXNlZCh2ZGVjKSAmJiAoKFJFQURfVlJFRyhIRVZDX1BBUlNFUl9MQ1VfU1RBUlQpICYgMHhmZmZmZmYpICE9IDApKSB7CisJCQkJaWYgKGhldmMtPmN1cl9waWMpCisJCQkJCWhldmMtPmN1cl9waWMtPmVycm9yX21hcmsgPSAxOworCQkJfQorCQkJLyoqLyBpZiAodXNlX2NtYSA9PSAwKSB7CisJCQkJaWYgKGhldmMtPnBpY19saXN0X2luaXRfZmxhZyA9PSAwKSB7CisJCQkJCWluaXRfcGljX2xpc3QoaGV2Yyk7CisJCQkJCWluaXRfcGljX2xpc3RfaHcoaGV2Yyk7CisJCQkJCWluaXRfYnVmX3NwZWMoaGV2Yyk7CisJCQkJCWhldmMtPnBpY19saXN0X2luaXRfZmxhZyA9IDM7CisJCQkJfQorCQkJfQorCQkJaWYgKCFoZXZjLT5tX2luc19mbGFnKSB7CisJCQkJaWYgKGhldmMtPmN1cl9waWMpCisJCQkJCWdldF9waWN0dXJlX3Fvc19pbmZvKGhldmMpOworCQkJfQorCQkJaGV2Yy0+Zmlyc3RfcGljX2FmdGVyX3JlY292ZXIgPSAwOworCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSX01PUkUpCisJCQkJZHVtcF9waWNfbGlzdChoZXZjKTsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCQkJaWYgKHZkZWMtPm1hc3RlcikgeworCQkJCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmNfYmEgPQorCQkJCShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICopCisJCQkJCXZkZWMtPm1hc3Rlci0+cHJpdmF0ZTsKKwkJCQlpZiAoaGV2Y19iYS0+Y3VyX3BpYyAhPSBOVUxMKSB7CisJCQkJCWhldmNfYmEtPmN1cl9waWMtPmR2X2VuaGFuY2VfZXhpc3QgPSAxOworCQkJCQloZXZjX3ByaW50KGhldmMsIEgyNjVfREVCVUdfRFYsCisJCQkJCSJUbyBkZWNvZGUgZWwgKHBvYyAlZCkgPT4gc2V0IGJsIChwb2MgJWQpIGR2X2VuaGFuY2VfZXhpc3QgZmxhZ1xuIiwKKwkJCQkJaGV2Yy0+Y3Vycl9QT0MsIGhldmNfYmEtPmN1cl9waWMtPlBPQyk7CisJCQkJfQorCQkJfQorCQkJaWYgKHZkZWMtPm1hc3RlciA9PSBOVUxMICYmCisJCQkJdmRlYy0+c2xhdmUgPT0gTlVMTCkKKwkJCQlzZXRfYXV4X2RhdGEoaGV2YywKKwkJCQkJaGV2Yy0+Y3VyX3BpYywgMSwgMCk7IC8qc3VmZml4Ki8KKwkJCWlmIChoZXZjLT5ieXBhc3NfZHZlbmwgJiYgIWRvbGJ5X21ldGFfd2l0aF9lbCkKKwkJCQlzZXRfYXV4X2RhdGEoaGV2YywKKwkJCQkJaGV2Yy0+Y3VyX3BpYywgMCwgMSk7IC8qZHYgbWV0YSBvbmx5Ki8KKyNlbHNlCisJCQlzZXRfYXV4X2RhdGEoaGV2YywgaGV2Yy0+Y3VyX3BpYywgMSwgMCk7CisjZW5kaWYKKworCQkJLyogcHJldiBwaWMgKi8KKwkJCWhldmNfcHJlX3BpYyhoZXZjLCBwaWMpOworCQkJLyoKKwkJCSAqdXBkYXRlIHJlZmVyZW5jZWQgb2Ygb2xkIHBpY3R1cmVzCisJCQkgKihjdXJfcGljLT5yZWZlcmVuY2VkIGlzIDEgYW5kIG5vdCB1cGRhdGVkKQorCQkJICovCisJCQlhcHBseV9yZWZfcGljX3NldChoZXZjLCBoZXZjLT5jdXJyX1BPQywKKwkJCQkJCQkgIHJwbV9wYXJhbSk7CisKKwkJCS8qaWYgKGhldmMtPm1tdV9lbmFibGUpCisJCQkJcmVjeWNsZV9tbXVfYnVmcyhoZXZjKTsqLworCisKKwkJCS8qIG5ldyBwaWMgKi8KKwkJCWhldmMtPmN1cl9waWMgPSBoZXZjLT5pc191c2VkX3Y0bCA/CisJCQkJdjRsX2dldF9uZXdfcGljKGhldmMsIHJwbV9wYXJhbSkgOgorCQkJCWdldF9uZXdfcGljKGhldmMsIHJwbV9wYXJhbSk7CisJCQlpZiAoaGV2Yy0+Y3VyX3BpYyA9PSBOVUxMKSB7CisJCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSX01PUkUpCisJCQkJCWR1bXBfcGljX2xpc3QoaGV2Yyk7CisJCQkJaGV2Yy0+d2FpdF9idWYgPSAxOworCQkJCXJldHVybiAtMTsKKwkJCX0KKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCQloZXZjLT5kZWNvZGluZ19waWMgPSBoZXZjLT5jdXJfcGljOworCQkJaWYgKCFoZXZjLT5tX2luc19mbGFnKQorCQkJCWhldmMtPm92ZXJfZGVjb2RlID0gMDsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJCQloZXZjLT5jdXJfcGljLT5kdl9lbmhhbmNlX2V4aXN0ID0gMDsKKwkJCWlmICh2ZGVjLT5zbGF2ZSkKKwkJCQloZXZjX3ByaW50KGhldmMsIEgyNjVfREVCVUdfRFYsCisJCQkJIkNsZWFyIGJsIChwb2MgJWQpIGR2X2VuaGFuY2VfZXhpc3QgZmxhZ1xuIiwKKwkJCQloZXZjLT5jdXJyX1BPQyk7CisJCQlpZiAodmRlYy0+bWFzdGVyID09IE5VTEwgJiYKKwkJCQl2ZGVjLT5zbGF2ZSA9PSBOVUxMKQorCQkJCXNldF9hdXhfZGF0YShoZXZjLAorCQkJCQloZXZjLT5jdXJfcGljLCAwLCAwKTsgLypwcmVmaXgqLworCisJCQlpZiAoaGV2Yy0+YnlwYXNzX2R2ZW5sICYmICFkb2xieV9tZXRhX3dpdGhfZWwpCisJCQkJc2V0X2F1eF9kYXRhKGhldmMsCisJCQkJCWhldmMtPmN1cl9waWMsIDAsIDIpOyAvKnByZSBzZWkgb25seSovCisjZWxzZQorCQkJc2V0X2F1eF9kYXRhKGhldmMsIGhldmMtPmN1cl9waWMsIDAsIDApOworI2VuZGlmCisJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19ESVNQTEFZX0NVUl9GUkFNRSkgeworCQkJCWhldmMtPmN1cl9waWMtPm91dHB1dF9yZWFkeSA9IDE7CisJCQkJaGV2Yy0+Y3VyX3BpYy0+c3RyZWFtX29mZnNldCA9CisJCQkJCVJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpOworCQkJCXByZXBhcmVfZGlzcGxheV9idWYodmRlYywgaGV2Yy0+Y3VyX3BpYyk7CisJCQkJaGV2Yy0+d2FpdF9idWYgPSAyOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0hBU19BVVhfSU5fU0xJQ0UpIHsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCQkJCWlmICh2ZGVjLT5tYXN0ZXIgPT0gTlVMTCAmJgorCQkJCQl2ZGVjLT5zbGF2ZSA9PSBOVUxMKSB7CisJCQkJCXNldF9hdXhfZGF0YShoZXZjLCBoZXZjLT5jdXJfcGljLCAxLCAwKTsKKwkJCQkJc2V0X2F1eF9kYXRhKGhldmMsIGhldmMtPmN1cl9waWMsIDAsIDApOworCQkJCX0KKyNlbHNlCisJCQkJc2V0X2F1eF9kYXRhKGhldmMsIGhldmMtPmN1cl9waWMsIDEsIDApOworCQkJCXNldF9hdXhfZGF0YShoZXZjLCBoZXZjLT5jdXJfcGljLCAwLCAwKTsKKyNlbmRpZgorCQkJfQorCQkJaWYgKGhldmMtPnBpY19saXN0X2luaXRfZmxhZyAhPSAzCisJCQkJfHwgaGV2Yy0+Y3VyX3BpYyA9PSBOVUxMKSB7CisJCQkJLyogbWFrZSBpdCBkZWMgZnJvbSB0aGUgZmlyc3Qgc2xpY2Ugc2VnbWVudCAqLworCQkJCXJldHVybiAzOworCQkJfQorCQkJaGV2Yy0+Y3VyX3BpYy0+c2xpY2VfaWR4Kys7CisJCQloZXZjLT5uZXdfcGljID0gMDsKKwkJfQorCX0gZWxzZSB7CisJaWYgKGhldmMtPndhaXRfYnVmID09IDEpIHsKKwkJCXBpY19saXN0X3Byb2Nlc3MoaGV2Yyk7CisJCQloZXZjLT5jdXJfcGljID0gaGV2Yy0+aXNfdXNlZF92NGwgPworCQkJCXY0bF9nZXRfbmV3X3BpYyhoZXZjLCBycG1fcGFyYW0pIDoKKwkJCQlnZXRfbmV3X3BpYyhoZXZjLCBycG1fcGFyYW0pOworCQkJaWYgKGhldmMtPmN1cl9waWMgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLTE7CisKKwkJCWlmICghaGV2Yy0+bV9pbnNfZmxhZykKKwkJCQloZXZjLT5vdmVyX2RlY29kZSA9IDA7CisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCQkJaGV2Yy0+Y3VyX3BpYy0+ZHZfZW5oYW5jZV9leGlzdCA9IDA7CisJCQlpZiAodmRlYy0+bWFzdGVyID09IE5VTEwgJiYKKwkJCQl2ZGVjLT5zbGF2ZSA9PSBOVUxMKQorCQkJCXNldF9hdXhfZGF0YShoZXZjLCBoZXZjLT5jdXJfcGljLCAwLCAwKTsKKyNlbHNlCisJCQlzZXRfYXV4X2RhdGEoaGV2YywgaGV2Yy0+Y3VyX3BpYywgMCwgMCk7CisjZW5kaWYKKwkJCWhldmMtPndhaXRfYnVmID0gMDsKKwkJfSBlbHNlIGlmIChoZXZjLT53YWl0X2J1ZiA9PQorCQkJCSAgIDIpIHsKKwkJCWlmIChnZXRfZGlzcGxheV9waWNfbnVtKGhldmMpID4KKwkJCQkxKQorCQkJCXJldHVybiAtMTsKKwkJCWhldmMtPndhaXRfYnVmID0gMDsKKwkJfQorCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1JfTU9SRSkKKwkJCWR1bXBfcGljX2xpc3QoaGV2Yyk7CisJfQorCisJaWYgKGhldmMtPm5ld19waWMpIHsKKyNpZiAxCisJCS8qU1VQUE9SVF8xMEJJVCovCisJCWludCBzYW9fbWVtX3VuaXQgPQorCQkJCShoZXZjLT5sY3Vfc2l6ZSA9PSAxNiA/IDkgOgorCQkJCQkJaGV2Yy0+bGN1X3NpemUgPT0KKwkJCQkJCTMyID8gMTQgOiAyNCkgPDwgNDsKKyNlbHNlCisJCWludCBzYW9fbWVtX3VuaXQgPSAoKGhldmMtPmxjdV9zaXplIC8gOCkgKiAyICsgNCkgPDwgNDsKKyNlbmRpZgorCQlpbnQgcGljX2hlaWdodF9jdSA9CisJCQkoaGV2Yy0+cGljX2ggKyBoZXZjLT5sY3Vfc2l6ZSAtIDEpIC8gaGV2Yy0+bGN1X3NpemU7CisJCWludCBwaWNfd2lkdGhfY3UgPQorCQkJKGhldmMtPnBpY193ICsgaGV2Yy0+bGN1X3NpemUgLSAxKSAvIGhldmMtPmxjdV9zaXplOworCQlpbnQgc2FvX3ZiX3NpemUgPSAoc2FvX21lbV91bml0ICsgKDIgPDwgNCkpICogcGljX2hlaWdodF9jdTsKKworCQkvKiBpbnQgc2FvX2Fidl9zaXplID0gc2FvX21lbV91bml0KnBpY193aWR0aF9jdTsgKi8KKwkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKSB7CisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJIj09PiVzIGRlYyBpZHggJWQsIHN0cnVjdCAlZCBpbnRlcmxhY2UgJWQgcGljIGlkeCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQloZXZjLT5kZWNvZGVfaWR4LAorCQkJCWhldmMtPmN1cnJfcGljX3N0cnVjdCwKKwkJCQloZXZjLT5pbnRlcmxhY2VfZmxhZywKKwkJCQloZXZjLT5jdXJfcGljLT5pbmRleCk7CisJCX0KKwkJaWYgKGRiZ19za2lwX2RlY29kZV9pbmRleCAhPSAwICYmCisJCQloZXZjLT5kZWNvZGVfaWR4ID09IGRiZ19za2lwX2RlY29kZV9pbmRleCkKKwkJCWRiZ19za2lwX2ZsYWcgPSAxOworCisJCWhldmMtPmRlY29kZV9pZHgrKzsKKwkJdXBkYXRlX3RpbGVfaW5mbyhoZXZjLCBwaWNfd2lkdGhfY3UsIHBpY19oZWlnaHRfY3UsCisJCQkJCQkgc2FvX21lbV91bml0LCBycG1fcGFyYW0pOworCisJCWNvbmZpZ190aXRsZV9odyhoZXZjLCBzYW9fdmJfc2l6ZSwgc2FvX21lbV91bml0KTsKKwl9CisKKwlpZiAoaGV2Yy0+aVByZXZQT0MgIT0gaGV2Yy0+Y3Vycl9QT0MpIHsKKwkJaGV2Yy0+bmV3X3RpbGUgPSAxOworCQloZXZjLT50aWxlX3ggPSAwOworCQloZXZjLT50aWxlX3kgPSAwOworCQloZXZjLT50aWxlX3lfeCA9IDA7CisJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikgeworCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSJuZXdfdGlsZSAobmV3X3BpYykgdGlsZV94PSVkLCB0aWxlX3k9JWRcbiIsCisJCQkJICAgaGV2Yy0+dGlsZV94LCBoZXZjLT50aWxlX3kpOworCQl9CisJfSBlbHNlIGlmIChoZXZjLT50aWxlX2VuYWJsZWQpIHsKKwkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKSB7CisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJInNsaWNlX3NlZ21lbnRfYWRkcmVzcyBpcyAlZFxuIiwKKwkJCQkgICBycG1fcGFyYW0tPnAuc2xpY2Vfc2VnbWVudF9hZGRyZXNzKTsKKwkJfQorCQloZXZjLT50aWxlX3lfeCA9CisJCQlnZXRfdGlsZV9pbmRleChoZXZjLCBycG1fcGFyYW0tPnAuc2xpY2Vfc2VnbWVudF9hZGRyZXNzLAorCQkJCQkJICAgKGhldmMtPnBpY193ICsKKwkJCQkJCSAgICBoZXZjLT5sY3Vfc2l6ZSAtCisJCQkJCQkJMSkgLyBoZXZjLT5sY3Vfc2l6ZSk7CisJCWlmICgoaGV2Yy0+dGlsZV95X3ggIT0gKGhldmMtPnRpbGVfeCB8IChoZXZjLT50aWxlX3kgPDwgOCkpKQorCQkJJiYgKGhldmMtPnRpbGVfeV94ICE9IC0xKSkgeworCQkJaGV2Yy0+bmV3X3RpbGUgPSAxOworCQkJaGV2Yy0+dGlsZV94ID0gaGV2Yy0+dGlsZV95X3ggJiAweGZmOworCQkJaGV2Yy0+dGlsZV95ID0gKGhldmMtPnRpbGVfeV94ID4+IDgpICYgMHhmZjsKKwkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikgeworCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkibmV3X3RpbGUgc2VnIGFkciAlZCB0aWxlX3g9JWQsIHRpbGVfeT0lZFxuIiwKKwkJCQkgcnBtX3BhcmFtLT5wLnNsaWNlX3NlZ21lbnRfYWRkcmVzcywKKwkJCQkgaGV2Yy0+dGlsZV94LCBoZXZjLT50aWxlX3kpOworCQkJfQorCQl9IGVsc2UKKwkJCWhldmMtPm5ld190aWxlID0gMDsKKwl9IGVsc2UKKwkJaGV2Yy0+bmV3X3RpbGUgPSAwOworCisJaWYgKChoZXZjLT50aWxlX3ggPiAoTUFYX1RJTEVfQ09MX05VTSAtIDEpKQorCXx8IChoZXZjLT50aWxlX3kgPiAoTUFYX1RJTEVfUk9XX05VTSAtIDEpKSkKKwkJaGV2Yy0+bmV3X3RpbGUgPSAwOworCisJaWYgKGhldmMtPm5ld190aWxlKSB7CisJCWhldmMtPnRpbGVfc3RhcnRfbGN1X3ggPQorCQkJaGV2Yy0+bV90aWxlW2hldmMtPnRpbGVfeV1baGV2Yy0+dGlsZV94XS5zdGFydF9jdV94OworCQloZXZjLT50aWxlX3N0YXJ0X2xjdV95ID0KKwkJCWhldmMtPm1fdGlsZVtoZXZjLT50aWxlX3ldW2hldmMtPnRpbGVfeF0uc3RhcnRfY3VfeTsKKwkJaGV2Yy0+dGlsZV93aWR0aF9sY3UgPQorCQkgICAgaGV2Yy0+bV90aWxlW2hldmMtPnRpbGVfeV1baGV2Yy0+dGlsZV94XS53aWR0aDsKKwkJaGV2Yy0+dGlsZV9oZWlnaHRfbGN1ID0KKwkJCWhldmMtPm1fdGlsZVtoZXZjLT50aWxlX3ldW2hldmMtPnRpbGVfeF0uaGVpZ2h0OworCX0KKworCXNldF9yZWZfcGljX2xpc3QoaGV2YywgcnBtX3BhcmFtKTsKKworCUNvbF9yZWYgPSBycG1fcGFyYW0tPnAuY29sbG9jYXRlZF9yZWZfaWR4OworCisJaGV2Yy0+TERDRmxhZyA9IDA7CisJaWYgKHJwbV9wYXJhbS0+cC5zbGljZV90eXBlICE9IElfU0xJQ0UpIHsKKwkJaGV2Yy0+TERDRmxhZyA9IDE7CisJCWZvciAoaSA9IDA7IChpIDwgaGV2Yy0+UmVmTnVtX0wwKSAmJiBoZXZjLT5MRENGbGFnOyBpKyspIHsKKwkJCWlmIChoZXZjLT5jdXJfcGljLT4KKwkJCQltX2FpUmVmUE9DTGlzdDBbaGV2Yy0+Y3VyX3BpYy0+c2xpY2VfaWR4XVtpXSA+CisJCQkJaGV2Yy0+Y3Vycl9QT0MpCisJCQkJaGV2Yy0+TERDRmxhZyA9IDA7CisJCX0KKwkJaWYgKHJwbV9wYXJhbS0+cC5zbGljZV90eXBlID09IEJfU0xJQ0UpIHsKKwkJCWZvciAoaSA9IDA7IChpIDwgaGV2Yy0+UmVmTnVtX0wxKQorCQkJCQkmJiBoZXZjLT5MRENGbGFnOyBpKyspIHsKKwkJCQlpZiAoaGV2Yy0+Y3VyX3BpYy0+CisJCQkJCW1fYWlSZWZQT0NMaXN0MVtoZXZjLT5jdXJfcGljLT4KKwkJCQkJc2xpY2VfaWR4XVtpXSA+CisJCQkJCWhldmMtPmN1cnJfUE9DKQorCQkJCQloZXZjLT5MRENGbGFnID0gMDsKKwkJCX0KKwkJfQorCX0KKworCWhldmMtPkNvbEZyb21MMEZsYWcgPSBycG1fcGFyYW0tPnAuY29sbG9jYXRlZF9mcm9tX2wwX2ZsYWc7CisKKwloZXZjLT5wbGV2ZWwgPQorCQlycG1fcGFyYW0tPnAubG9nMl9wYXJhbGxlbF9tZXJnZV9sZXZlbDsKKwloZXZjLT5NYXhOdW1NZXJnZUNhbmQgPSA1IC0gcnBtX3BhcmFtLT5wLmZpdmVfbWludXNfbWF4X251bV9tZXJnZV9jYW5kOworCisJaGV2Yy0+TG9uZ1Rlcm1fQ3VyciA9IDA7CS8qIHRvIGRvIC4uLiAqLworCWhldmMtPkxvbmdUZXJtX0NvbCA9IDA7CS8qIHRvIGRvIC4uLiAqLworCisJaGV2Yy0+bGlzdF9ubyA9IDA7CisJaWYgKHJwbV9wYXJhbS0+cC5zbGljZV90eXBlID09IEJfU0xJQ0UpCisJCWhldmMtPmxpc3Rfbm8gPSAxIC0gaGV2Yy0+Q29sRnJvbUwwRmxhZzsKKwlpZiAoaGV2Yy0+bGlzdF9ubyA9PSAwKSB7CisJCWlmIChDb2xfcmVmIDwgaGV2Yy0+UmVmTnVtX0wwKSB7CisJCQloZXZjLT5Db2xfUE9DID0KKwkJCQloZXZjLT5jdXJfcGljLT5tX2FpUmVmUE9DTGlzdDBbaGV2Yy0+Y3VyX3BpYy0+CisJCQkJc2xpY2VfaWR4XVtDb2xfcmVmXTsKKwkJfSBlbHNlCisJCQloZXZjLT5Db2xfUE9DID0gSU5WQUxJRF9QT0M7CisJfSBlbHNlIHsKKwkJaWYgKENvbF9yZWYgPCBoZXZjLT5SZWZOdW1fTDEpIHsKKwkJCWhldmMtPkNvbF9QT0MgPQorCQkJCWhldmMtPmN1cl9waWMtPm1fYWlSZWZQT0NMaXN0MVtoZXZjLT5jdXJfcGljLT4KKwkJCQlzbGljZV9pZHhdW0NvbF9yZWZdOworCQl9IGVsc2UKKwkJCWhldmMtPkNvbF9QT0MgPSBJTlZBTElEX1BPQzsKKwl9CisKKwloZXZjLT5Mb25nVGVybV9SZWYgPSAwOwkvKiB0byBkbyAuLi4gKi8KKworCWlmIChoZXZjLT5zbGljZV90eXBlICE9IDIpIHsKKwkJLyogaWYoaGV2Yy0+aV9vbmx5PT0xKXsgKi8KKwkJLyogcmV0dXJuIDB4ZjsgKi8KKwkJLyogfSAqLworCisJCWlmIChoZXZjLT5Db2xfUE9DICE9IElOVkFMSURfUE9DKSB7CisJCQloZXZjLT5jb2xfcGljID0gZ2V0X3JlZl9waWNfYnlfUE9DKGhldmMsIGhldmMtPkNvbF9QT0MpOworCQkJaWYgKGhldmMtPmNvbF9waWMgPT0gTlVMTCkgeworCQkJCWhldmMtPmN1cl9waWMtPmVycm9yX21hcmsgPSAxOworCQkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykpIHsKKwkJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkiV1JPTkcsZmFpbCB0byBnZXQgdGhlIHBpYyBDb2xfUE9DXG4iKTsKKwkJCQl9CisJCQkJaWYgKGlzX2xvZ19lbmFibGUoaGV2YykpCisJCQkJCWFkZF9sb2coaGV2YywKKwkJCQkJIldST05HLGZhaWwgdG8gZ2V0IHRoZSBwaWMgQ29sX1BPQyIpOworCQkJfSBlbHNlIGlmIChoZXZjLT5jb2xfcGljLT5lcnJvcl9tYXJrIHx8IGhldmMtPmNvbF9waWMtPmRpc19tYXJrID09IDApIHsKKwkJCQloZXZjLT5jb2xfcGljLT5lcnJvcl9tYXJrID0gMTsKKwkJCQloZXZjLT5jdXJfcGljLT5lcnJvcl9tYXJrID0gMTsKKwkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpKSB7CisJCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJIldST05HLCBDb2xfUE9DIGVycm9yX21hcmsgaXMgMVxuIik7CisJCQkJfQorCQkJCWlmIChpc19sb2dfZW5hYmxlKGhldmMpKQorCQkJCQlhZGRfbG9nKGhldmMsCisJCQkJCSJXUk9ORywgQ29sX1BPQyBlcnJvcl9tYXJrIGlzIDEiKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKChoZXZjLT5jb2xfcGljLT53aWR0aAorCQkJCQkhPSBoZXZjLT5waWNfdykgfHwKKwkJCQkJKGhldmMtPmNvbF9waWMtPmhlaWdodAorCQkJCQkhPSBoZXZjLT5waWNfaCkpIHsKKwkJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkJIldyb25nIHJlZmVyZW5jZSBwaWMgKHBvYyAlZCkgd2lkdGgvaGVpZ2h0ICVkLyVkXG4iLAorCQkJCQkJaGV2Yy0+Y29sX3BpYy0+UE9DLAorCQkJCQkJaGV2Yy0+Y29sX3BpYy0+d2lkdGgsCisJCQkJCQloZXZjLT5jb2xfcGljLT5oZWlnaHQpOworCQkJCQloZXZjLT5jdXJfcGljLT5lcnJvcl9tYXJrID0gMTsKKwkJCQl9CisKKwkJCX0KKworCQkJaWYgKGhldmMtPmN1cl9waWMtPmVycm9yX21hcmsKKwkJCQkmJiAoKGhldmMtPmlnbm9yZV9idWZtZ3JfZXJyb3IgJiAweDEpID09IDApKSB7CisJCQkJLypjb3VudCBpbmZvKi8KKwkJCQl2ZGVjX2NvdW50X2luZm8oaGV2Yy0+Z3ZzLCBoZXZjLT5jdXJfcGljLT5lcnJvcl9tYXJrLAorCQkJCQloZXZjLT5jdXJfcGljLT5zdHJlYW1fb2Zmc2V0KTsKKwkJCQlpZiAoaGV2Yy0+Y3VyX3BpYy0+c2xpY2VfdHlwZSA9PSBJX1NMSUNFKSB7CisJCQkJCWhldmMtPmd2cy0+aV9kZWNvZGVkX2ZyYW1lcysrOworCQkJCX0gZWxzZSBpZiAoaGV2Yy0+Y3VyX3BpYy0+c2xpY2VfdHlwZSA9PSBQX1NMSUNFKSB7CisJCQkJCWhldmMtPmd2cy0+cF9kZWNvZGVkX2ZyYW1lcysrOworCQkJCX0gZWxzZSBpZiAoaGV2Yy0+Y3VyX3BpYy0+c2xpY2VfdHlwZSA9PSBCX1NMSUNFKSB7CisJCQkJCWhldmMtPmd2cy0+Yl9kZWNvZGVkX2ZyYW1lcysrOworCQkJCX0KKwkJCWlmIChoZXZjLT5jdXJfcGljLT5lcnJvcl9tYXJrKSB7CisJCQkJaWYgKGhldmMtPmN1cl9waWMtPnNsaWNlX3R5cGUgPT0gSV9TTElDRSkgeworCQkJCQloZXZjLT5ndnMtPmlfY29uY2VhbGVkX2ZyYW1lcysrOworCQkJCX0gZWxzZSBpZiAoaGV2Yy0+Y3VyX3BpYy0+c2xpY2VfdHlwZSA9PSBQX1NMSUNFKSB7CisJCQkJCWhldmMtPmd2cy0+cF9jb25jZWFsZWRfZnJhbWVzKys7CisJCQkJfSBlbHNlIGlmIChoZXZjLT5jdXJfcGljLT5zbGljZV90eXBlID09IEJfU0xJQ0UpIHsKKwkJCQkJaGV2Yy0+Z3ZzLT5iX2NvbmNlYWxlZF9mcmFtZXMrKzsKKwkJCQl9CisJCQl9CisJCQlpZiAoaGV2Yy0+UEJfc2tpcF9tb2RlID09IDIpIHsKKwkJCQloZXZjLT5ndnMtPmRyb3BfZnJhbWVfY291bnQrKzsKKwkJCQlpZiAocnBtX3BhcmFtLT5wLnNsaWNlX3R5cGUgPT0gSV9TTElDRSkgeworCQkJCQloZXZjLT5ndnMtPmlfbG9zdF9mcmFtZXMrKzsKKwkJCQl9IGVsc2UgaWYgKHJwbV9wYXJhbS0+cC5zbGljZV90eXBlID09IFBfU0xJQ0UpIHsKKwkJCQkJaGV2Yy0+Z3ZzLT5wX2xvc3RfZnJhbWVzKys7CisJCQkJfSBlbHNlIGlmIChycG1fcGFyYW0tPnAuc2xpY2VfdHlwZSA9PSBCX1NMSUNFKSB7CisJCQkJCWhldmMtPmd2cy0+Yl9sb3N0X2ZyYW1lcysrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCQlpZiAoaXNfc2tpcF9kZWNvZGluZyhoZXZjLAorCQkJCWhldmMtPmN1cl9waWMpKSB7CisJCQkJcmV0dXJuIDI7CisJCQl9CisJCX0gZWxzZQorCQkJaGV2Yy0+Y29sX3BpYyA9IGhldmMtPmN1cl9waWM7CisJfQkJCS8qICAqLworCWlmIChoZXZjLT5jb2xfcGljID09IE5VTEwpCisJCWhldmMtPmNvbF9waWMgPSBoZXZjLT5jdXJfcGljOworI2lmZGVmIEJVRkZFUl9NR1JfT05MWQorCXJldHVybiAweGY7CisjZWxzZQorCWlmICgoZGVjb2RlX3BpY19iZWdpbiA+IDAgJiYgaGV2Yy0+ZGVjb2RlX2lkeCA8PSBkZWNvZGVfcGljX2JlZ2luKQorCQl8fCAoZGJnX3NraXBfZmxhZykpCisJCXJldHVybiAweGY7CisjZW5kaWYKKwlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5kZWNvZGVfaGVhZGVyX21lbW9yeV90aW1lX25hbWUsIFRSQUNFX0hFQURFUl9SRUdJU1RFUl9TVEFSVCk7CisJY29uZmlnX21jX2J1ZmZlcihoZXZjLCBoZXZjLT5jdXJfcGljKTsKKworCWlmIChpc19za2lwX2RlY29kaW5nKGhldmMsCisJCQloZXZjLT5jdXJfcGljKSkgeworCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpKQorCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJIkRpc2NhcmQgdGhpcyBwaWN0dXJlIGluZGV4ICVkXG4iLAorCQkJCQloZXZjLT5jdXJfcGljLT5pbmRleCk7CisJCS8qY291bnQgaW5mbyovCisJCXZkZWNfY291bnRfaW5mbyhoZXZjLT5ndnMsIGhldmMtPmN1cl9waWMtPmVycm9yX21hcmssCisJCQloZXZjLT5jdXJfcGljLT5zdHJlYW1fb2Zmc2V0KTsKKwkJaWYgKGhldmMtPmN1cl9waWMtPnNsaWNlX3R5cGUgPT0gSV9TTElDRSkgeworCQkJaGV2Yy0+Z3ZzLT5pX2RlY29kZWRfZnJhbWVzKys7CisJCX0gZWxzZSBpZiAoaGV2Yy0+Y3VyX3BpYy0+c2xpY2VfdHlwZSA9PSBQX1NMSUNFKSB7CisJCQloZXZjLT5ndnMtPnBfZGVjb2RlZF9mcmFtZXMrKzsKKwkJfSBlbHNlIGlmIChoZXZjLT5jdXJfcGljLT5zbGljZV90eXBlID09IEJfU0xJQ0UpIHsKKwkJCWhldmMtPmd2cy0+Yl9kZWNvZGVkX2ZyYW1lcysrOworCQl9CisJCWlmIChoZXZjLT5jdXJfcGljLT5lcnJvcl9tYXJrKSB7CisJCQlpZiAoaGV2Yy0+Y3VyX3BpYy0+c2xpY2VfdHlwZSA9PSBJX1NMSUNFKSB7CisJCQkJaGV2Yy0+Z3ZzLT5pX2NvbmNlYWxlZF9mcmFtZXMrKzsKKwkJCX0gZWxzZSBpZiAoaGV2Yy0+Y3VyX3BpYy0+c2xpY2VfdHlwZSA9PSBQX1NMSUNFKSB7CisJCQkJaGV2Yy0+Z3ZzLT5wX2NvbmNlYWxlZF9mcmFtZXMrKzsKKwkJCX0gZWxzZSBpZiAoaGV2Yy0+Y3VyX3BpYy0+c2xpY2VfdHlwZSA9PSBCX1NMSUNFKSB7CisJCQkJaGV2Yy0+Z3ZzLT5iX2NvbmNlYWxlZF9mcmFtZXMrKzsKKwkJCX0KKwkJfQorCQlpZiAoaGV2Yy0+UEJfc2tpcF9tb2RlID09IDIpIHsKKwkJCWhldmMtPmd2cy0+ZHJvcF9mcmFtZV9jb3VudCsrOworCQkJaWYgKHJwbV9wYXJhbS0+cC5zbGljZV90eXBlID09IElfU0xJQ0UpIHsKKwkJCQloZXZjLT5ndnMtPmlfbG9zdF9mcmFtZXMrKzsKKwkJCX0gZWxzZSBpZiAocnBtX3BhcmFtLT5wLnNsaWNlX3R5cGUgPT0gUF9TTElDRSkgeworCQkJCWhldmMtPmd2cy0+cF9sb3N0X2ZyYW1lcysrOworCQkJfSBlbHNlIGlmIChycG1fcGFyYW0tPnAuc2xpY2VfdHlwZSA9PSBCX1NMSUNFKSB7CisJCQkJaGV2Yy0+Z3ZzLT5iX2xvc3RfZnJhbWVzKys7CisJCQl9CisJCX0KKwkJcmV0dXJuIDI7CisJfQorI2lmZGVmIE1DUkNDX0VOQUJMRQorCWNvbmZpZ19tY3JjY19heGlfaHcoaGV2YywgaGV2Yy0+Y3VyX3BpYy0+c2xpY2VfdHlwZSk7CisjZW5kaWYKKwlpZiAoIWhldmMtPnRpbGVfd2lkdGhfbGN1IHx8ICFoZXZjLT50aWxlX2hlaWdodF9sY3UpCisJCXJldHVybiAtMTsKKwljb25maWdfbXByZWRfaHcoaGV2Yyk7CisKKwljb25maWdfc2FvX2h3KGhldmMsIHJwbV9wYXJhbSk7CisJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UuZGVjb2RlX2hlYWRlcl9tZW1vcnlfdGltZV9uYW1lLCBUUkFDRV9IRUFERVJfUkVHSVNURVJfRU5EKTsKKwlpZiAoKGhldmMtPnNsaWNlX3R5cGUgIT0gMikgJiYgKGhldmMtPmlfb25seSAmIDB4MikpCisJCXJldHVybiAweGY7CisKKwlpZiAocG9zdF9waWN0dXJlX2Vhcmx5KHZkZWMsIGhldmMtPmN1cl9waWMtPmluZGV4KSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHJldHVybiBwYWdlIG51bWJlciAqLworc3RhdGljIGludCBoZXZjX21tdV9wYWdlX251bShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCQlpbnQgdywgaW50IGgsIGludCBzYXZlX21vZGUpCit7CisJaW50IHBpY3R1cmVfc2l6ZTsKKwlpbnQgcGFnZV9udW07CisJaW50IG1heF9mcmFtZV9udW07CisKKwlwaWN0dXJlX3NpemUgPSBjb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemUoaGV2YywgdywKKwkJCQloLCBzYXZlX21vZGUpOworCXBhZ2VfbnVtID0gKChwaWN0dXJlX3NpemUgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUKTsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkKKwkJbWF4X2ZyYW1lX251bSA9IE1BWF9GUkFNRV84S19OVU07CisJZWxzZQorCQltYXhfZnJhbWVfbnVtID0gTUFYX0ZSQU1FXzRLX05VTTsKKworCWlmIChwYWdlX251bSA+IG1heF9mcmFtZV9udW0pIHsKKwkJaGV2Y19wcmludChoZXZjLCAwLCAib3ZlciBtYXggISEgMHgleCB3aWR0aCAlZCBoZWlnaHQgJWRcbiIsCisJCQlwYWdlX251bSwgdywgaCk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIHBhZ2VfbnVtOworfQorCitzdGF0aWMgaW50IEgyNjVfYWxsb2NfbW11KHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsIHN0cnVjdCBQSUNfcyAqbmV3X3BpYywKKwkJdW5zaWduZWQgc2hvcnQgYml0X2RlcHRoLCB1bnNpZ25lZCBpbnQgKm1tdV9pbmRleF9hZHIpIHsKKwlpbnQgYml0X2RlcHRoXzEwID0gKGJpdF9kZXB0aCAhPSAweDAwKTsKKwlpbnQgY3VyX21tdV80a19udW1iZXI7CisJaW50IHJldDsKKworCWlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUoaGV2YykgPT0gMHgxMCkKKwkJcmV0dXJuIDA7CisKKwljdXJfbW11XzRrX251bWJlciA9IGhldmNfbW11X3BhZ2VfbnVtKGhldmMsIG5ld19waWMtPndpZHRoLAorCQkJbmV3X3BpYy0+aGVpZ2h0LCAhYml0X2RlcHRoXzEwKTsKKwlpZiAoY3VyX21tdV80a19udW1iZXIgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoaGV2Yy0+aXNfdXNlZF92NGwpIHsKKwkJc3RydWN0IGludGVybmFsX2NvbXBfYnVmICppYnVmID0KKwkJCWluZGV4X3RvX2ljb21wX2J1ZihoZXZjLCBuZXdfcGljLT5CVUZfaW5kZXgpOworCisJCXJldCA9IGRlY29kZXJfbW11X2JveF9hbGxvY19pZHgoCisJCQkJaWJ1Zi0+bW11X2JveCwKKwkJCQlpYnVmLT5pbmRleCwKKwkJCQlpYnVmLT5mcmFtZV9idWZmZXJfc2l6ZSwKKwkJCQltbXVfaW5kZXhfYWRyKTsKKwl9IGVsc2UgeworCQlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5kZWNvZGVfaGVhZGVyX21lbW9yeV90aW1lX25hbWUsIFRSQUNFX0hFQURFUl9NRU1PUllfU1RBUlQpOworCQlyZXQgPSBkZWNvZGVyX21tdV9ib3hfYWxsb2NfaWR4KAorCQkJCWhldmMtPm1tdV9ib3gsCisJCQkJbmV3X3BpYy0+aW5kZXgsCisJCQkJY3VyX21tdV80a19udW1iZXIsCisJCQkJbW11X2luZGV4X2Fkcik7CisJCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLmRlY29kZV9oZWFkZXJfbWVtb3J5X3RpbWVfbmFtZSwgVFJBQ0VfSEVBREVSX01FTU9SWV9FTkQpOworCX0KKworCW5ld19waWMtPnNjYXR0ZXJfYWxsb2MgPSAxOworCisJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX0JVRk1HUl9NT1JFLAorCQkiJXMgcGljIGluZGV4ICVkIHBhZ2UgY291bnQoJWQpIHJldCA9JWRcbiIsCisJCV9fZnVuY19fLCBuZXdfcGljLT5pbmRleCwKKwkJY3VyX21tdV80a19udW1iZXIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKyNpZmRlZiBIMjY1XzEwQl9NTVVfRFcKK3N0YXRpYyBpbnQgSDI2NV9hbGxvY19tbXVfZHcoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Yywgc3RydWN0IFBJQ19zICpuZXdfcGljLAorCQl1bnNpZ25lZCBzaG9ydCBiaXRfZGVwdGgsIHVuc2lnbmVkIGludCAqbW11X2luZGV4X2FkcikgeworCWludCBiaXRfZGVwdGhfMTAgPSAoYml0X2RlcHRoICE9IDB4MDApOworCWludCBjdXJfbW11XzRrX251bWJlcjsKKwlpbnQgcmV0OworCisJaWYgKCFoZXZjLT5tbXVfYm94X2R3KSB7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSIlcywgZXJyb3Igbm8gbW11IGJveCBkdyFcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUoaGV2YykgPT0gMHgxMCkKKwkJcmV0dXJuIDA7CisKKwljdXJfbW11XzRrX251bWJlciA9IGhldmNfbW11X3BhZ2VfbnVtKGhldmMsIG5ld19waWMtPndpZHRoLAorCQkJbmV3X3BpYy0+aGVpZ2h0LCAhYml0X2RlcHRoXzEwKTsKKwlpZiAoY3VyX21tdV80a19udW1iZXIgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlyZXQgPSBkZWNvZGVyX21tdV9ib3hfYWxsb2NfaWR4KAorCQkJaGV2Yy0+bW11X2JveF9kdywKKwkJCW5ld19waWMtPmluZGV4LAorCQkJY3VyX21tdV80a19udW1iZXIsCisJCQltbXVfaW5kZXhfYWRyKTsKKworCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19CVUZNR1JfTU9SRSwKKwkJIiVzIHBpYyBpbmRleCAlZCBwYWdlIGNvdW50KCVkKSByZXQgPSVkXG4iLAorCQlfX2Z1bmNfXywgbmV3X3BpYy0+aW5kZXgsCisJCWN1cl9tbXVfNGtfbnVtYmVyLCByZXQpOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgcmVsZWFzZV9waWNfbW11X2J1ZihzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCXN0cnVjdCBQSUNfcyAqcGljKQoreworCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19CVUZNR1JfTU9SRSwKKwkiJXMgcGljIGluZGV4ICVkIHNjYXR0ZXJfYWxsb2MgJWRcbiIsCisJX19mdW5jX18sIHBpYy0+aW5kZXgsCisJcGljLT5zY2F0dGVyX2FsbG9jKTsKKworCWlmIChoZXZjLT5tbXVfZW5hYmxlCisJCSYmICEoaGV2Yy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDEwKQorCQkmJiBwaWMtPnNjYXR0ZXJfYWxsb2MpIHsKKwkJaWYgKCFoZXZjLT5pc191c2VkX3Y0bCkKKwkJCWRlY29kZXJfbW11X2JveF9mcmVlX2lkeChoZXZjLT5tbXVfYm94LCBwaWMtPmluZGV4KTsKKwkJZWxzZSB7CisJCQlzdHJ1Y3QgaW50ZXJuYWxfY29tcF9idWYgKmlidWYgPQorCQkJCWlidWYgPSBpbmRleF90b19pY29tcF9idWYoaGV2YywgcGljLT5CVUZfaW5kZXgpOworCQkJZGVjb2Rlcl9tbXVfYm94X2ZyZWVfaWR4KGlidWYtPm1tdV9ib3gsIGlidWYtPmluZGV4KTsKKwkJfQorCX0KKyNpZmRlZiBIMjY1XzEwQl9NTVVfRFcKKwlpZiAoaGV2Yy0+ZHdfbW11X2VuYWJsZSkKKwkJZGVjb2Rlcl9tbXVfYm94X2ZyZWVfaWR4KGhldmMtPm1tdV9ib3hfZHcsIHBpYy0+aW5kZXgpOworI2VuZGlmCisJcGljLT5zY2F0dGVyX2FsbG9jID0gMDsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICpoMjY1IGJ1ZmZlciBtYW5hZ2VtZW50IGVuZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGF0aWMgc3RydWN0IGhldmNfc3RhdGVfcyAqZ0hldmM7CisKK3N0YXRpYyB2b2lkIGhldmNfbG9jYWxfdW5pbml0KHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJaGV2Yy0+cnBtX3B0ciA9IE5VTEw7CisJaGV2Yy0+bG1lbV9wdHIgPSBOVUxMOworCisjaWZkZWYgU1dBUF9IRVZDX1VDT0RFCisJaWYgKGhldmMtPmlzX3N3YXAgJiYgZ2V0X2NwdV9tYWpvcl9pZCgpIDw9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWE0pIHsKKwkJaWYgKGhldmMtPm1jX2NwdV9hZGRyICE9IE5VTEwpIHsKKwkJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQloZXZjLT5zd2FwX3NpemUsIGhldmMtPm1jX2NwdV9hZGRyLAorCQkJCWhldmMtPm1jX2RtYV9oYW5kbGUpOworCQkJCWhldmMtPm1jX2NwdV9hZGRyID0gTlVMTDsKKwkJfQorCisJfQorI2VuZGlmCisjaWZkZWYgREVUUkVGSUxMX0VOQUJMRQorCWlmIChoZXZjLT5pc19zd2FwICYmIGdldF9jcHVfbWFqb3JfaWQoKSA8PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hNKQorCQl1bmluaXRfZGV0cmVmaWxsX2J1ZihoZXZjKTsKKyNlbmRpZgorCWlmIChoZXZjLT5hdXhfYWRkcikgeworCQlkbWFfZnJlZV9jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJaGV2Yy0+cHJlZml4X2F1eF9zaXplICsgaGV2Yy0+c3VmZml4X2F1eF9zaXplLCBoZXZjLT5hdXhfYWRkciwKKwkJCQkJaGV2Yy0+YXV4X3BoeV9hZGRyKTsKKwkJaGV2Yy0+YXV4X2FkZHIgPSBOVUxMOworCX0KKwlpZiAoaGV2Yy0+cnBtX2FkZHIpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCVJQTV9CVUZfU0laRSwgaGV2Yy0+cnBtX2FkZHIsCisJCQkJCWhldmMtPnJwbV9waHlfYWRkcik7CisJCWhldmMtPnJwbV9hZGRyID0gTlVMTDsKKwl9CisJaWYgKGhldmMtPmxtZW1fYWRkcikgeworCQlkbWFfZnJlZV9jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJUlBNX0JVRl9TSVpFLCBoZXZjLT5sbWVtX2FkZHIsCisJCQkJCWhldmMtPmxtZW1fcGh5X2FkZHIpOworCQloZXZjLT5sbWVtX2FkZHIgPSBOVUxMOworCX0KKworCWlmIChoZXZjLT5tbXVfZW5hYmxlICYmIGhldmMtPmZyYW1lX21tdV9tYXBfYWRkcikgeworCQlpZiAoaGV2Yy0+ZnJhbWVfbW11X21hcF9waHlfYWRkcikKKwkJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlnZXRfZnJhbWVfbW11X21hcF9zaXplKCksIGhldmMtPmZyYW1lX21tdV9tYXBfYWRkciwKKwkJCQkJaGV2Yy0+ZnJhbWVfbW11X21hcF9waHlfYWRkcik7CisKKwkJaGV2Yy0+ZnJhbWVfbW11X21hcF9hZGRyID0gTlVMTDsKKwl9CisjaWZkZWYgSDI2NV8xMEJfTU1VX0RXCisJaWYgKGhldmMtPmR3X21tdV9lbmFibGUgJiYgaGV2Yy0+ZnJhbWVfZHdfbW11X21hcF9hZGRyKSB7CisJCWlmIChoZXZjLT5mcmFtZV9kd19tbXVfbWFwX3BoeV9hZGRyKQorCQkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCWdldF9mcmFtZV9tbXVfbWFwX3NpemUoKSwgaGV2Yy0+ZnJhbWVfZHdfbW11X21hcF9hZGRyLAorCQkJCQloZXZjLT5mcmFtZV9kd19tbXVfbWFwX3BoeV9hZGRyKTsKKworCQloZXZjLT5mcmFtZV9kd19tbXVfbWFwX2FkZHIgPSBOVUxMOworCX0KKyNlbmRpZgorCS8vcHJfZXJyKCJbJXMgbGluZSAlZF0gaGV2Yy0+Z3ZzPTB4JXAgb3BlcmF0aW9uXG4iLF9fZnVuY19fLCBfX0xJTkVfXywgaGV2Yy0+Z3ZzKTsKK30KKworc3RhdGljIGludCBoZXZjX2xvY2FsX2luaXQoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwlpbnQgcmV0ID0gLTE7CisJc3RydWN0IEJ1ZmZJbmZvX3MgKmN1cl9idWZfaW5mbyA9IE5VTEw7CisKKwltZW1zZXQoJmhldmMtPnBhcmFtLCAwLCBzaXplb2YodW5pb24gcGFyYW1fdSkpOworCisJY3VyX2J1Zl9pbmZvID0gJmhldmMtPndvcmtfc3BhY2VfYnVmX3N0b3JlOworCisJaWYgKGZvcmNlX2J1ZnNwZWMpIHsKKwkJbWVtY3B5KGN1cl9idWZfaW5mbywgJmFtdmgyNjVfd29ya2J1ZmZfc3BlY1tmb3JjZV9idWZzcGVjICYgMHhmXSwKKwkJc2l6ZW9mKHN0cnVjdCBCdWZmSW5mb19zKSk7CisJCXByX2luZm8oImZvcmNlIGJ1ZmZlciBzcGVjICVkXG4iLCBmb3JjZV9idWZzcGVjICYgMHhmKTsKKwl9IGVsc2UgeworCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDw9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UTTIgJiYgIWlzX2NwdV90bTJfcmV2YigpKSB7CisJCQlpZiAodmRlY19pc19zdXBwb3J0XzRrKCkpIHsKKwkJCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpCisJCQkJCW1lbWNweShjdXJfYnVmX2luZm8sICZhbXZoMjY1X3dvcmtidWZmX3NwZWNbMl0sCS8qIDRrICovCisJCQkJCXNpemVvZihzdHJ1Y3QgQnVmZkluZm9fcykpOworCQkJCWVsc2UKKwkJCQkJbWVtY3B5KGN1cl9idWZfaW5mbywgJmFtdmgyNjVfd29ya2J1ZmZfc3BlY1sxXSwJLyogNGsgKi8KKwkJCQkJc2l6ZW9mKHN0cnVjdCBCdWZmSW5mb19zKSk7CisJCQl9IGVsc2UgeworCQkJCW1lbWNweShjdXJfYnVmX2luZm8sICZhbXZoMjY1X3dvcmtidWZmX3NwZWNbMF0sCS8qIDEwODBwICovCisJCQkJc2l6ZW9mKHN0cnVjdCBCdWZmSW5mb19zKSk7CisJCQl9CisJCX0gZWxzZSB7IC8vZ2V0X2NwdV9tYWpvcl9pZCgpID4gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RNMiB8fCBpc19jcHVfdG0yX3JldmIoKQorCQkJaWYgKHZkZWNfaXNfc3VwcG9ydF80aygpKSB7CisJCQkJbWVtY3B5KGN1cl9idWZfaW5mbywgJmFtdmgyNjVfd29ya2J1ZmZfc3BlY1s1XSwJLyogNGsgKi8KKwkJCQlzaXplb2Yoc3RydWN0IEJ1ZmZJbmZvX3MpKTsKKwkJCX0gZWxzZSB7CisJCQkJbWVtY3B5KGN1cl9idWZfaW5mbywgJmFtdmgyNjVfd29ya2J1ZmZfc3BlY1szXSwJLyogMTA4MHAgKi8KKwkJCQlzaXplb2Yoc3RydWN0IEJ1ZmZJbmZvX3MpKTsKKwkJCX0KKwkJfQorCX0KKworCWN1cl9idWZfaW5mby0+c3RhcnRfYWRyID0gaGV2Yy0+YnVmX3N0YXJ0OworCWluaXRfYnVmZl9zcGVjKGhldmMsIGN1cl9idWZfaW5mbyk7CisKKwloZXZjX2luaXRfc3RydShoZXZjLCBjdXJfYnVmX2luZm8pOworCisJaGV2Yy0+Yml0X2RlcHRoX2x1bWEgPSA4OworCWhldmMtPmJpdF9kZXB0aF9jaHJvbWEgPSA4OworCWhldmMtPnZpZGVvX3NpZ25hbF90eXBlID0gMDsKKwloZXZjLT52aWRlb19zaWduYWxfdHlwZV9kZWJ1ZyA9IDA7CisJYml0X2RlcHRoX2x1bWEgPSBoZXZjLT5iaXRfZGVwdGhfbHVtYTsKKwliaXRfZGVwdGhfY2hyb21hID0gaGV2Yy0+Yml0X2RlcHRoX2Nocm9tYTsKKwl2aWRlb19zaWduYWxfdHlwZSA9IGhldmMtPnZpZGVvX3NpZ25hbF90eXBlOworCisJaWYgKChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX1NFTkRfUEFSQU1fV0lUSF9SRUcpID09IDApIHsKKwkJaGV2Yy0+cnBtX2FkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCVJQTV9CVUZfU0laRSwgJmhldmMtPnJwbV9waHlfYWRkciwgR0ZQX0tFUk5FTCk7CisJCWlmIChoZXZjLT5ycG1fYWRkciA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgcnBtIGJ1ZmZlclxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC0xOworCQl9CisJCWhldmMtPnJwbV9wdHIgPSBoZXZjLT5ycG1fYWRkcjsKKwl9CisKKwlpZiAocHJlZml4X2F1eF9idWZfc2l6ZSA+IDAgfHwKKwkJc3VmZml4X2F1eF9idWZfc2l6ZSA+IDApIHsKKwkJdTMyIGF1eF9idWZfc2l6ZTsKKworCQloZXZjLT5wcmVmaXhfYXV4X3NpemUgPSBBVVhfQlVGX0FMSUdOKHByZWZpeF9hdXhfYnVmX3NpemUpOworCQloZXZjLT5zdWZmaXhfYXV4X3NpemUgPSBBVVhfQlVGX0FMSUdOKHN1ZmZpeF9hdXhfYnVmX3NpemUpOworCQlhdXhfYnVmX3NpemUgPSBoZXZjLT5wcmVmaXhfYXV4X3NpemUgKyBoZXZjLT5zdWZmaXhfYXV4X3NpemU7CisJCWhldmMtPmF1eF9hZGRyID1kbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCWF1eF9idWZfc2l6ZSwgJmhldmMtPmF1eF9waHlfYWRkciwgR0ZQX0tFUk5FTCk7CisJCWlmIChoZXZjLT5hdXhfYWRkciA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgcnBtIGJ1ZmZlclxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJaGV2Yy0+bG1lbV9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlMTUVNX0JVRl9TSVpFLCAmaGV2Yy0+bG1lbV9waHlfYWRkciwgR0ZQX0tFUk5FTCk7CisJaWYgKGhldmMtPmxtZW1fYWRkciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvYyBsbWVtIGJ1ZmZlclxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLTE7CisJfQorCWhldmMtPmxtZW1fcHRyID0gaGV2Yy0+bG1lbV9hZGRyOworCisJaWYgKGhldmMtPm1tdV9lbmFibGUpIHsKKwkJaGV2Yy0+ZnJhbWVfbW11X21hcF9hZGRyID0KKwkJCQlkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCWdldF9mcmFtZV9tbXVfbWFwX3NpemUoKSwKKwkJCQkmaGV2Yy0+ZnJhbWVfbW11X21hcF9waHlfYWRkciwgR0ZQX0tFUk5FTCk7CisJCWlmIChoZXZjLT5mcmFtZV9tbXVfbWFwX2FkZHIgPT0gTlVMTCkgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFsbG9jIGNvdW50X2J1ZmZlclxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC0xOworCQl9CisJCW1lbXNldChoZXZjLT5mcmFtZV9tbXVfbWFwX2FkZHIsIDAsIGdldF9mcmFtZV9tbXVfbWFwX3NpemUoKSk7CisJfQorI2lmZGVmIEgyNjVfMTBCX01NVV9EVworCWlmIChoZXZjLT5kd19tbXVfZW5hYmxlKSB7CisJCWhldmMtPmZyYW1lX2R3X21tdV9tYXBfYWRkciA9CisJCQkJZG1hX2FsbG9jX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlnZXRfZnJhbWVfbW11X21hcF9zaXplKCksCisJCQkJJmhldmMtPmZyYW1lX2R3X21tdV9tYXBfcGh5X2FkZHIsIEdGUF9LRVJORUwpOworCQlpZiAoaGV2Yy0+ZnJhbWVfZHdfbW11X21hcF9hZGRyID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvYyBjb3VudF9idWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQltZW1zZXQoaGV2Yy0+ZnJhbWVfZHdfbW11X21hcF9hZGRyLCAwLCBnZXRfZnJhbWVfbW11X21hcF9zaXplKCkpOworCX0KKyNlbmRpZgorCXJldCA9IDA7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgTWFpbGJveCBjb21tYW5kCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisjZGVmaW5lIENNRF9GSU5JU0hFRCAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ01EX0FMTE9DX1ZJRVcgICAgICAgICAgICAgMQorI2RlZmluZSBDTURfRlJBTUVfRElTUExBWSAgICAgICAgICAzCisjZGVmaW5lIENNRF9ERUJVRyAgICAgICAgICAgICAgICAgIDEwCisKKworI2RlZmluZSBERUNPREVfQlVGRkVSX05VTV9NQVggICAgMzIKKyNkZWZpbmUgRElTUExBWV9CVUZGRVJfTlVNICAgICAgIDYKKworI2RlZmluZSB2aWRlb19kb21haW5fYWRkcihhZHIpIChhZHImMHg3ZmZmZmZmZikKKyNkZWZpbmUgREVDT0RFUl9XT1JLX1NQQUNFX1NJWkUgMHg4MDAwMDAKKworI2RlZmluZSBzcGVjMmNhbnZhcyh4KSAgXAorCSgoKHgpLT51dl9jYW52YXNfaW5kZXggPDwgMTYpIHwgXAorCSAoKHgpLT51dl9jYW52YXNfaW5kZXggPDwgOCkgIHwgXAorCSAoKHgpLT55X2NhbnZhc19pbmRleCA8PCAwKSkKKworCitzdGF0aWMgdm9pZCBzZXRfY2FudmFzKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsIHN0cnVjdCBQSUNfcyAqcGljKQoreworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGhldmMpOworCWludCBjYW52YXNfdyA9IEFMSUdOKHBpYy0+d2lkdGgsIDY0KS80OworCWludCBjYW52YXNfaCA9IEFMSUdOKHBpYy0+aGVpZ2h0LCAzMikvNDsKKwlpbnQgYmxrbW9kZSA9IGhldmMtPm1lbV9tYXBfbW9kZTsKKworCS8qQ0FOVkFTX0JMS01PREVfNjRYMzIqLworI2lmZGVmIFNVUFBPUlRfMTBCSVQKKwlpZgkocGljLT5kb3VibGVfd3JpdGVfbW9kZSAmJgorCQkoKHBpYy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDIwKSA9PSAwKSkgeworCQljYW52YXNfdyA9IHBpYy0+d2lkdGggLworCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhwaWMtPmRvdWJsZV93cml0ZV9tb2RlICYgMHhmKTsKKwkJY2FudmFzX2ggPSBwaWMtPmhlaWdodCAvCisJCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKHBpYy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweGYpOworCisJCWNhbnZhc193ID0gQUxJR04oY2FudmFzX3csIDY0KTsKKwkJY2FudmFzX2ggPSBBTElHTihjYW52YXNfaCwgMzIpOworCisJCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQkJaWYgKHBpYy0+eV9jYW52YXNfaW5kZXggPT0gLTEpCisJCQkJcGljLT55X2NhbnZhc19pbmRleCA9IHZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX0hFVkMsIHZkZWMtPmlkKTsKKwkJCWlmIChwaWMtPnV2X2NhbnZhc19pbmRleCA9PSAtMSkKKwkJCQlwaWMtPnV2X2NhbnZhc19pbmRleCA9IHZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX0hFVkMsIHZkZWMtPmlkKTsKKwkJfSBlbHNlIHsKKwkJCXBpYy0+eV9jYW52YXNfaW5kZXggPSAxMjggKyBwaWMtPmluZGV4ICogMjsKKwkJCXBpYy0+dXZfY2FudmFzX2luZGV4ID0gMTI4ICsgcGljLT5pbmRleCAqIDIgKyAxOworCQl9CisKKwkJY29uZmlnX2Nhdl9sdXRfZXgocGljLT55X2NhbnZhc19pbmRleCwKKwkJCXBpYy0+ZHdfeV9hZHIsIGNhbnZhc193LCBjYW52YXNfaCwKKwkJCUNBTlZBU19BRERSX05PV1JBUCwgYmxrbW9kZSwgaGV2Yy0+aXNfdXNlZF92NGwgPyAwIDogNywgVkRFQ19IRVZDKTsKKwkJY29uZmlnX2Nhdl9sdXRfZXgocGljLT51dl9jYW52YXNfaW5kZXgsIHBpYy0+ZHdfdV92X2FkciwKKwkJCWNhbnZhc193LCBjYW52YXNfaCwKKwkJCUNBTlZBU19BRERSX05PV1JBUCwgYmxrbW9kZSwgaGV2Yy0+aXNfdXNlZF92NGwgPyAwIDogNywgVkRFQ19IRVZDKTsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCXBpYy0+Y2FudmFzX2NvbmZpZ1swXS5waHlfYWRkciA9CisJCQkJcGljLT5kd195X2FkcjsKKwkJcGljLT5jYW52YXNfY29uZmlnWzBdLndpZHRoID0KKwkJCQljYW52YXNfdzsKKwkJcGljLT5jYW52YXNfY29uZmlnWzBdLmhlaWdodCA9CisJCQkJY2FudmFzX2g7CisJCXBpYy0+Y2FudmFzX2NvbmZpZ1swXS5ibG9ja19tb2RlID0KKwkJCQlibGttb2RlOworCQlwaWMtPmNhbnZhc19jb25maWdbMF0uZW5kaWFuID0gaGV2Yy0+aXNfdXNlZF92NGwgPyAwIDogNzsKKworCQlwaWMtPmNhbnZhc19jb25maWdbMV0ucGh5X2FkZHIgPQorCQkJCXBpYy0+ZHdfdV92X2FkcjsKKwkJcGljLT5jYW52YXNfY29uZmlnWzFdLndpZHRoID0KKwkJCQljYW52YXNfdzsKKwkJcGljLT5jYW52YXNfY29uZmlnWzFdLmhlaWdodCA9CisJCQkJY2FudmFzX2g7CisJCXBpYy0+Y2FudmFzX2NvbmZpZ1sxXS5ibG9ja19tb2RlID0KKwkJCQlibGttb2RlOworCQlwaWMtPmNhbnZhc19jb25maWdbMV0uZW5kaWFuID0gaGV2Yy0+aXNfdXNlZF92NGwgPyAwIDogNzsKKworCQlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5zZXRfY2FudmFzMF9hZGRyLCBwaWMtPmNhbnZhc19jb25maWdbMF0ucGh5X2FkZHIpOworCQloZXZjX3ByaW50KGhldmMsIEgyNjVfREVCVUdfUElDX1NUUlVDVCwiJXMoY2FudmFzMCBhZGRyOjB4JXgpXG4iLAorCQkJX19mdW5jX18sIHBpYy0+Y2FudmFzX2NvbmZpZ1swXS5waHlfYWRkcik7CisjZWxzZQorCQlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5zZXRfY2FudmFzMF9hZGRyLCBzcGVjMmNhbnZhcyhwaWMpKTsKKwkJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX1BJQ19TVFJVQ1QsIiVzKGNhbnZhczAgYWRkcjoweCV4KVxuIiwKKwkJCV9fZnVuY19fLCBzcGVjMmNhbnZhcyhwaWMpKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCWlmICghaGV2Yy0+bW11X2VuYWJsZSkgeworCQkJLyogdG8gY2hhbmdlIGFmdGVyIDEwYml0IFZQVSBpcyByZWFkeSAuLi4gKi8KKwkJCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQkJCWlmIChwaWMtPnlfY2FudmFzX2luZGV4ID09IC0xKQorCQkJCQlwaWMtPnlfY2FudmFzX2luZGV4ID0gdmRlYy0+Z2V0X2NhbnZhc19leChDT1JFX01BU0tfSEVWQywgdmRlYy0+aWQpOworCQkJCXBpYy0+dXZfY2FudmFzX2luZGV4ID0gcGljLT55X2NhbnZhc19pbmRleDsKKwkJCX0gZWxzZSB7CisJCQkJcGljLT55X2NhbnZhc19pbmRleCA9IDEyOCArIHBpYy0+aW5kZXg7CisJCQkJcGljLT51dl9jYW52YXNfaW5kZXggPSAxMjggKyBwaWMtPmluZGV4OworCQkJfQorCisJCQljb25maWdfY2F2X2x1dF9leChwaWMtPnlfY2FudmFzX2luZGV4LAorCQkJCXBpYy0+bWNfeV9hZHIsIGNhbnZhc193LCBjYW52YXNfaCwKKwkJCQlDQU5WQVNfQUREUl9OT1dSQVAsIGJsa21vZGUsIGhldmMtPmlzX3VzZWRfdjRsID8gMCA6IDcsIFZERUNfSEVWQyk7CisJCQljb25maWdfY2F2X2x1dF9leChwaWMtPnV2X2NhbnZhc19pbmRleCwgcGljLT5tY191X3ZfYWRyLAorCQkJCWNhbnZhc193LCBjYW52YXNfaCwKKwkJCQlDQU5WQVNfQUREUl9OT1dSQVAsIGJsa21vZGUsIGhldmMtPmlzX3VzZWRfdjRsID8gMCA6IDcsIFZERUNfSEVWQyk7CisJCX0KKwkJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2Uuc2V0X2NhbnZhczBfYWRkciwgc3BlYzJjYW52YXMocGljKSk7CisJCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19QSUNfU1RSVUNULCIlcyhjYW52YXMwIGFkZHI6MHgleClcbiIsCisJCQlfX2Z1bmNfXywgc3BlYzJjYW52YXMocGljKSk7CisJfQorI2Vsc2UKKwlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJaWYgKHBpYy0+eV9jYW52YXNfaW5kZXggPT0gLTEpCisJCQlwaWMtPnlfY2FudmFzX2luZGV4ID0gdmRlYy0+Z2V0X2NhbnZhc19leChDT1JFX01BU0tfSEVWQywgdmRlYy0+aWQpOworCQlpZiAocGljLT51dl9jYW52YXNfaW5kZXggPT0gLTEpCisJCQlwaWMtPnV2X2NhbnZhc19pbmRleCA9IHZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX0hFVkMsIHZkZWMtPmlkKTsKKwl9IGVsc2UgeworCQlwaWMtPnlfY2FudmFzX2luZGV4ID0gMTI4ICsgcGljLT5pbmRleCAqIDI7CisJCXBpYy0+dXZfY2FudmFzX2luZGV4ID0gMTI4ICsgcGljLT5pbmRleCAqIDIgKyAxOworCX0KKworCisJY29uZmlnX2Nhdl9sdXRfZXgocGljLT55X2NhbnZhc19pbmRleCwgcGljLT5tY195X2FkciwgY2FudmFzX3csIGNhbnZhc19oLAorCQlDQU5WQVNfQUREUl9OT1dSQVAsIGJsa21vZGUsIGhldmMtPmlzX3VzZWRfdjRsID8gMCA6IDcsIFZERUNfSEVWQyk7CisJY29uZmlnX2Nhdl9sdXRfZXgocGljLT51dl9jYW52YXNfaW5kZXgsIHBpYy0+bWNfdV92X2FkciwKKwkJY2FudmFzX3csIGNhbnZhc19oLAorCQlDQU5WQVNfQUREUl9OT1dSQVAsIGJsa21vZGUsIGhldmMtPmlzX3VzZWRfdjRsID8gMCA6IDcsIFZERUNfSEVWQyk7CisKKwlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5zZXRfY2FudmFzMF9hZGRyLCBzcGVjMmNhbnZhcyhwaWMpKTsKKwloZXZjX3ByaW50KGhldmMsIEgyNjVfREVCVUdfUElDX1NUUlVDVCwiJXMoY2FudmFzMCBhZGRyOjB4JXgpXG4iLAorCQlfX2Z1bmNfXywgc3BlYzJjYW52YXMocGljKSk7CisjZW5kaWYKK30KKworc3RhdGljIGludCBpbml0X2J1Zl9zcGVjKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJaW50IHBpY193aWR0aCA9IGhldmMtPnBpY193OworCWludCBwaWNfaGVpZ2h0ID0gaGV2Yy0+cGljX2g7CisKKwkvKiBoZXZjX3ByaW50KGhldmMsIDAsCisJICoiJXMxOiAlZCAlZFxuIiwgX19mdW5jX18sIGhldmMtPnBpY193LCBoZXZjLT5waWNfaCk7CisJICovCisJaGV2Y19wcmludChoZXZjLCAwLAorCQkiJXMyICVkICVkXG4iLCBfX2Z1bmNfXywgcGljX3dpZHRoLCBwaWNfaGVpZ2h0KTsKKwkvKiBwaWNfd2lkdGggPSBoZXZjLT5waWNfdzsgKi8KKwkvKiBwaWNfaGVpZ2h0ID0gaGV2Yy0+cGljX2g7ICovCisKKwlpZiAoaGV2Yy0+ZnJhbWVfd2lkdGggPT0gMCB8fCBoZXZjLT5mcmFtZV9oZWlnaHQgPT0gMCkgeworCQloZXZjLT5mcmFtZV93aWR0aCA9IHBpY193aWR0aDsKKwkJaGV2Yy0+ZnJhbWVfaGVpZ2h0ID0gcGljX2hlaWdodDsKKworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX3NlaShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCXN0cnVjdCBQSUNfcyAqcGljLCBjaGFyICpzZWlfYnVmLCB1aW50MzJfdCBzaXplKQoreworCWNoYXIgKnAgPSBzZWlfYnVmOworCWNoYXIgKnBfc2VpOworCXVpbnQxNl90IGhlYWRlcjsKKwl1aW50MTZfdCBuYWxfdW5pdF90eXBlOworCXVpbnQxNl90IHBheWxvYWRfdHlwZSwgcGF5bG9hZF9zaXplOworCWludCBpLCBqOworCisJaWYgKHNpemUgPCAyKQorCQlyZXR1cm4gMDsKKwloZWFkZXIgPSAqcCsrOworCWhlYWRlciA8PD0gODsKKwloZWFkZXIgKz0gKnArKzsKKwluYWxfdW5pdF90eXBlID0gaGVhZGVyID4+IDk7CisJaWYgKChuYWxfdW5pdF90eXBlICE9IE5BTF9VTklUX1NFSSkKKwkmJiAobmFsX3VuaXRfdHlwZSAhPSBOQUxfVU5JVF9TRUlfU1VGRklYKSkKKwkJcmV0dXJuIDA7CisJd2hpbGUgKHArNCA8PSBzZWlfYnVmK3NpemUpIHsKKwkJcGF5bG9hZF90eXBlID0gKnArKzsKKwkJaWYgKHBheWxvYWRfdHlwZSA9PSAweGZmKSB7CisJCQlwYXlsb2FkX3R5cGUgKz0gKnArKzsKKwkJfQorCQlwYXlsb2FkX3NpemUgPSAqcCsrOworCQlpZiAocGF5bG9hZF9zaXplID09IDB4ZmYpIHsKKwkJCXBheWxvYWRfc2l6ZSArPSAqcCsrOworCQl9CisKKwkJaWYgKHArcGF5bG9hZF9zaXplIDw9IHNlaV9idWYrc2l6ZSkgeworCQkJc3dpdGNoIChwYXlsb2FkX3R5cGUpIHsKKwkJCWNhc2UgU0VJX1BpY1RpbWluZzoKKwkJCQlpZiAoKHBhcnNlcl9zZWlfZW5hYmxlICYgMHg0KSAmJgorCQkJCQloZXZjLT5mcmFtZV9maWVsZF9pbmZvX3ByZXNlbnRfZmxhZykgeworCQkJCQlwX3NlaSA9IHA7CisJCQkJCWhldmMtPmN1cnJfcGljX3N0cnVjdCA9ICgqcF9zZWkgPj4gNCkmMHgwZjsKKwkJCQkJcGljLT5waWNfc3RydWN0ID0gaGV2Yy0+Y3Vycl9waWNfc3RydWN0OworCQkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYKKwkJCQkJCUgyNjVfREVCVUdfUElDX1NUUlVDVCkgeworCQkJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkJInBhcnNlIHJlc3VsdCBwaWNfc3RydWN0ID0gJWRcbiIsCisJCQkJCQloZXZjLT5jdXJyX3BpY19zdHJ1Y3QpOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBTRUlfVXNlckRhdGFJVFVfVF9UMzU6CisJCQkJcF9zZWkgPSBwOworCQkJCWlmIChwX3NlaVswXSA9PSAweEI1CisJCQkJCSYmIHBfc2VpWzFdID09IDB4MDAKKwkJCQkJJiYgcF9zZWlbMl0gPT0gMHgzQworCQkJCQkmJiBwX3NlaVszXSA9PSAweDAwCisJCQkJCSYmIHBfc2VpWzRdID09IDB4MDEKKwkJCQkJJiYgcF9zZWlbNV0gPT0gMHgwNCkgeworCQkJCQljaGFyICpuZXdfYnVmOworCQkJCQloZXZjLT5zZWlfcHJlc2VudF9mbGFnIHw9IFNFSV9IRFIxMFBMVVNfTUFTSzsKKwkJCQkJbmV3X2J1ZiA9IHZ6YWxsb2MocGF5bG9hZF9zaXplKTsKKwkJCQkJaWYgKG5ld19idWYpIHsKKwkJCQkJCW1lbWNweShuZXdfYnVmLCBwX3NlaSwgcGF5bG9hZF9zaXplKTsKKwkJCQkJCXBpYy0+aGRyMTBwX2RhdGFfYnVmID0gbmV3X2J1ZjsKKwkJCQkJCXBpYy0+aGRyMTBwX2RhdGFfc2l6ZSA9IHBheWxvYWRfc2l6ZTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJCQkiJXM6aGRyMTBwIGRhdGEgdnphbGxvYyBzaXplKCVkKSBmYWlsXG4iLAorCQkJCQkJCV9fZnVuY19fLCBwYXlsb2FkX3NpemUpOworCQkJCQkJcGljLT5oZHIxMHBfZGF0YV9idWYgPSBOVUxMOworCQkJCQkJcGljLT5oZHIxMHBfZGF0YV9zaXplID0gMDsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAocF9zZWlbMF0gPT0gMHgyNgorCQkJCQkmJiBwX3NlaVsxXSA9PSAweDAwCisJCQkJCSYmIHBfc2VpWzJdID09IDB4MDQKKwkJCQkJJiYgcF9zZWlbM10gPT0gMHgwMAorCQkJCQkmJiBwX3NlaVs0XSA9PSAweDA1KSB7CisJCQkJCWhldmMtPnNlaV9wcmVzZW50X2ZsYWcgfD0gU0VJX0hEUl9DVVZBX01BU0s7CisKKwkJCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfUFJJTlRfU0VJKSB7CisJCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCQkJImhkciBjdXZhIGRhdGE6IChzaXplICVkKVxuIiwKKwkJCQkJCQlwYXlsb2FkX3NpemUpOworCQkJCQkJZm9yIChpID0gMDsgaSA8IHBheWxvYWRfc2l6ZTsgaSsrKSB7CisJCQkJCQkJaGV2Y19wcmludF9jb250KGhldmMsIDAsCisJCQkJCQkJCSIlMDJ4ICIsIHBfc2VpW2ldKTsKKwkJCQkJCQlpZiAoKChpICsgMSkgJiAweGYpID09IDApCisJCQkJCQkJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLCAiXG4iKTsKKwkJCQkJCX0KKwkJCQkJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLCAiXG4iKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWJyZWFrOworCQkJY2FzZSBTRUlfTWFzdGVyaW5nRGlzcGxheUNvbG9yVm9sdW1lOgorCQkJCS8qaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkic2VpIHR5cGU6IHByaW1hcnkgZGlzcGxheSBjb2xvciB2b2x1bWUgJWQsIHNpemUgJWRcbiIsCisJCQkJCXBheWxvYWRfdHlwZSwKKwkJCQkJcGF5bG9hZF9zaXplKTsqLworCQkJCS8qIG1hc3Rlcl9kaXNwbGF5X2NvbG91ciAqLworCQkJCXBfc2VpID0gcDsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQkJCWZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKwkJCQkJCWhldmMtPnByaW1hcmllc1tpXVtqXQorCQkJCQkJCT0gKCpwX3NlaTw8OCkKKwkJCQkJCQl8ICoocF9zZWkrMSk7CisJCQkJCQlwX3NlaSArPSAyOworCQkJCQl9CisJCQkJfQorCQkJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCQkJaGV2Yy0+d2hpdGVfcG9pbnRbaV0KKwkJCQkJCT0gKCpwX3NlaTw8OCkKKwkJCQkJCXwgKihwX3NlaSsxKTsKKwkJCQkJcF9zZWkgKz0gMjsKKwkJCQl9CisJCQkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJCQloZXZjLT5sdW1pbmFuY2VbaV0KKwkJCQkJCT0gKCpwX3NlaTw8MjQpCisJCQkJCQl8ICgqKHBfc2VpKzEpPDwxNikKKwkJCQkJCXwgKCoocF9zZWkrMik8PDgpCisJCQkJCQl8ICoocF9zZWkrMyk7CisJCQkJCXBfc2VpICs9IDQ7CisJCQkJfQorCQkJCWhldmMtPnNlaV9wcmVzZW50X2ZsYWcgfD0KKwkJCQkJU0VJX01BU1RFUl9ESVNQTEFZX0NPTE9SX01BU0s7CisJCQkJLypmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJCQlmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorCQkJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkJIlx0cHJpbWFyaWVzWyUxZF1bJTFkXSA9ICUwNHhcbiIsCisJCQkJCQlpLCBqLAorCQkJCQkJaGV2Yy0+cHJpbWFyaWVzW2ldW2pdKTsKKwkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCSJcdHdoaXRlX3BvaW50ID0gKCUwNHgsICUwNHgpXG4iLAorCQkJCQloZXZjLT53aGl0ZV9wb2ludFswXSwKKwkJCQkJaGV2Yy0+d2hpdGVfcG9pbnRbMV0pOworCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJIlx0bWF4LG1pbiBsdW1pbmFuY2UgPSAlMDh4LCAlMDh4XG4iLAorCQkJCQloZXZjLT5sdW1pbmFuY2VbMF0sCisJCQkJCWhldmMtPmx1bWluYW5jZVsxXSk7Ki8KKwkJCQlicmVhazsKKwkJCWNhc2UgU0VJX0NvbnRlbnRMaWdodExldmVsOgorCQkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX1BSSU5UX1NFSSkKKwkJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkJInNlaSB0eXBlOiBtYXggY29udGVudCBsaWdodCBsZXZlbCAlZCwgc2l6ZSAlZFxuIiwKKwkJCQkJcGF5bG9hZF90eXBlLCBwYXlsb2FkX3NpemUpOworCQkJCS8qIGNvbnRlbnRfbGlnaHRfbGV2ZWwgKi8KKwkJCQlwX3NlaSA9IHA7CisJCQkJaGV2Yy0+Y29udGVudF9saWdodF9sZXZlbFswXQorCQkJCQk9ICgqcF9zZWk8PDgpIHwgKihwX3NlaSsxKTsKKwkJCQlwX3NlaSArPSAyOworCQkJCWhldmMtPmNvbnRlbnRfbGlnaHRfbGV2ZWxbMV0KKwkJCQkJPSAoKnBfc2VpPDw4KSB8ICoocF9zZWkrMSk7CisJCQkJcF9zZWkgKz0gMjsKKwkJCQloZXZjLT5zZWlfcHJlc2VudF9mbGFnIHw9CisJCQkJCVNFSV9DT05URU5UX0xJR0hUX0xFVkVMX01BU0s7CisJCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfUFJJTlRfU0VJKQorCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCQkiXHRtYXggY2xsID0gJTA0eCwgbWF4X3BhX2NsbCA9ICUwNHhcbiIsCisJCQkJCWhldmMtPmNvbnRlbnRfbGlnaHRfbGV2ZWxbMF0sCisJCQkJCWhldmMtPmNvbnRlbnRfbGlnaHRfbGV2ZWxbMV0pOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlwICs9IHBheWxvYWRfc2l6ZTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCitzdGF0aWMgdW5zaWduZWQgY2FsY19hcih1bnNpZ25lZCBpZGMsIHVuc2lnbmVkIHNhcl93LCB1bnNpZ25lZCBzYXJfaCwKKwkJCXVuc2lnbmVkIHcsIHVuc2lnbmVkIGgpCit7CisJdW5zaWduZWQgYXI7CisKKwlpZiAoaWRjCT09IDI1NSkgeworCQlhciA9IGRpdl91NjQoMjU2VUxMICogc2FyX2ggKiBoLAorCQkJCXNhcl93ICogdyk7CisJfSBlbHNlIHsKKwkJc3dpdGNoIChpZGMpIHsKKwkJY2FzZSAxOgorCQkJYXIgPSAweDEwMCAqIGggLyB3OworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWFyID0gMHgxMDAgKiBoICogMTEgLyAodyAqIDEyKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlhciA9IDB4MTAwICogaCAqIDExIC8gKHcgKiAxMCk7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJYXIgPSAweDEwMCAqIGggKiAxMSAvICh3ICogMTYpOworCQkJYnJlYWs7CisJCWNhc2UgNToKKwkJCWFyID0gMHgxMDAgKiBoICogMzMgLyAodyAqIDQwKTsKKwkJCWJyZWFrOworCQljYXNlIDY6CisJCQlhciA9IDB4MTAwICogaCAqIDExIC8gKHcgKiAyNCk7CisJCQlicmVhazsKKwkJY2FzZSA3OgorCQkJYXIgPSAweDEwMCAqIGggKiAxMSAvICh3ICogMjApOworCQkJYnJlYWs7CisJCWNhc2UgODoKKwkJCWFyID0gMHgxMDAgKiBoICogMTEgLyAodyAqIDMyKTsKKwkJCWJyZWFrOworCQljYXNlIDk6CisJCQlhciA9IDB4MTAwICogaCAqIDMzIC8gKHcgKiA4MCk7CisJCQlicmVhazsKKwkJY2FzZSAxMDoKKwkJCWFyID0gMHgxMDAgKiBoICogMTEgLyAodyAqIDE4KTsKKwkJCWJyZWFrOworCQljYXNlIDExOgorCQkJYXIgPSAweDEwMCAqIGggKiAxMSAvICh3ICogMTUpOworCQkJYnJlYWs7CisJCWNhc2UgMTI6CisJCQlhciA9IDB4MTAwICogaCAqIDMzIC8gKHcgKiA2NCk7CisJCQlicmVhazsKKwkJY2FzZSAxMzoKKwkJCWFyID0gMHgxMDAgKiBoICogOTkgLyAodyAqIDE2MCk7CisJCQlicmVhazsKKwkJY2FzZSAxNDoKKwkJCWFyID0gMHgxMDAgKiBoICogMyAvICh3ICogNCk7CisJCQlicmVhazsKKwkJY2FzZSAxNToKKwkJCWFyID0gMHgxMDAgKiBoICogMiAvICh3ICogMyk7CisJCQlicmVhazsKKwkJY2FzZSAxNjoKKwkJCWFyID0gMHgxMDAgKiBoICogMSAvICh3ICogMik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWFyID0gaCAqIDB4MTAwIC8gdzsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGFyOworfQorKi8KK3N0YXRpYyB2b2lkIHNldF9mcmFtZV9pbmZvKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsIHN0cnVjdCB2ZnJhbWVfcyAqdmYsCisJCQlzdHJ1Y3QgUElDX3MgKnBpYykKK3sKKwl1bnNpZ25lZCBpbnQgYXI7CisJaW50IGksIGo7CisJY2hhciAqcDsKKwl1bnNpZ25lZCBzaXplID0gMDsKKwl1bnNpZ25lZCB0eXBlID0gMDsKKwlzdHJ1Y3QgdmZyYW1lX21hc3Rlcl9kaXNwbGF5X2NvbG91cl9zICp2Zl9kcAorCQk9ICZ2Zi0+cHJvcC5tYXN0ZXJfZGlzcGxheV9jb2xvdXI7CisKKwl2Zi0+d2lkdGggPSBwaWMtPndpZHRoIC8KKwkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhwaWMtPmRvdWJsZV93cml0ZV9tb2RlKTsKKwl2Zi0+aGVpZ2h0ID0gcGljLT5oZWlnaHQgLworCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKHBpYy0+ZG91YmxlX3dyaXRlX21vZGUpOworCisJdmYtPmR1cmF0aW9uID0gaGV2Yy0+ZnJhbWVfZHVyOworCXZmLT5kdXJhdGlvbl9wdWxsZG93biA9IDA7CisJdmYtPmZsYWcgPSAwOworCisJYXIgPSBtaW5fdCh1MzIsIGhldmMtPmZyYW1lX2FyLCBESVNQX1JBVElPX0FTUEVDVF9SQVRJT19NQVgpOworCXZmLT5yYXRpb19jb250cm9sID0gKGFyIDw8IERJU1BfUkFUSU9fQVNQRUNUX1JBVElPX0JJVCk7CisKKy8qCisJaWYgKCgocGljLT5hc3BlY3RfcmF0aW9faWRjID09IDI1NSkgJiYKKwkJcGljLT5zYXJfd2lkdGggJiYKKwkJcGljLT5zYXJfaGVpZ2h0KSB8fAorCQkoKHBpYy0+YXNwZWN0X3JhdGlvX2lkYyAhPSAyNTUpICYmCisJCShwaWMtPndpZHRoKSkpIHsKKwkJYXIgPSBtaW5fdCh1MzIsCisJCQljYWxjX2FyKHBpYy0+YXNwZWN0X3JhdGlvX2lkYywKKwkJCXBpYy0+c2FyX3dpZHRoLAorCQkJcGljLT5zYXJfaGVpZ2h0LAorCQkJcGljLT53aWR0aCwKKwkJCXBpYy0+aGVpZ2h0KSwKKwkJCURJU1BfUkFUSU9fQVNQRUNUX1JBVElPX01BWCk7CisJCXZmLT5yYXRpb19jb250cm9sID0gKGFyIDw8IERJU1BfUkFUSU9fQVNQRUNUX1JBVElPX0JJVCk7CisJCXZmLT5yYXRpb19jb250cm9sIDw8PSBoZXZjLT5pbnRlcmxhY2VfZmxhZzsKKwl9CisqLworCWhldmMtPnJhdGlvX2NvbnRyb2wgPSB2Zi0+cmF0aW9fY29udHJvbDsKKwlpZiAocGljLT5hdXhfZGF0YV9idWYKKwkJJiYgcGljLT5hdXhfZGF0YV9zaXplKSB7CisJCS8qIHBhcnNlciBzZWkgKi8KKwkJcCA9IHBpYy0+YXV4X2RhdGFfYnVmOworCQl3aGlsZSAocCA8IHBpYy0+YXV4X2RhdGFfYnVmCisJCQkrIHBpYy0+YXV4X2RhdGFfc2l6ZSAtIDgpIHsKKwkJCXNpemUgPSAqcCsrOworCQkJc2l6ZSA9IChzaXplIDw8IDgpIHwgKnArKzsKKwkJCXNpemUgPSAoc2l6ZSA8PCA4KSB8ICpwKys7CisJCQlzaXplID0gKHNpemUgPDwgOCkgfCAqcCsrOworCQkJdHlwZSA9ICpwKys7CisJCQl0eXBlID0gKHR5cGUgPDwgOCkgfCAqcCsrOworCQkJdHlwZSA9ICh0eXBlIDw8IDgpIHwgKnArKzsKKwkJCXR5cGUgPSAodHlwZSA8PCA4KSB8ICpwKys7CisJCQlpZiAodHlwZSA9PSAweDAyMDAwMDAwKSB7CisJCQkJLyogaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSJzZWkoJWQpXG4iLCBzaXplKTsgKi8KKwkJCQlwYXJzZV9zZWkoaGV2YywgcGljLCBwLCBzaXplKTsKKwkJCX0KKwkJCXAgKz0gc2l6ZTsKKwkJfQorCX0KKwlpZiAoaGV2Yy0+dmlkZW9fc2lnbmFsX3R5cGUgJiBWSURFT19TSUdOQUxfVFlQRV9BVkFJTEFCTEVfTUFTSykgeworCQl2Zi0+c2lnbmFsX3R5cGUgPSBwaWMtPnZpZGVvX3NpZ25hbF90eXBlOworCQlpZiAoaGV2Yy0+c2VpX3ByZXNlbnRfZmxhZyAmIFNFSV9IRFIxMFBMVVNfTUFTSykgeworCQkJdTMyIGRhdGE7CisJCQlkYXRhID0gdmYtPnNpZ25hbF90eXBlOworCQkJZGF0YSA9IGRhdGEgJiAweEZGRkYwMEZGOworCQkJZGF0YSA9IGRhdGEgfCAoMHgzMDw8OCk7CisJCQl2Zi0+c2lnbmFsX3R5cGUgPSBkYXRhOworCQl9CisKKwkJaWYgKGhldmMtPnNlaV9wcmVzZW50X2ZsYWcgJiBTRUlfSERSX0NVVkFfTUFTSykgeworCQkJdTMyIGRhdGE7CisJCQlkYXRhID0gdmYtPnNpZ25hbF90eXBlOworCQkJZGF0YSA9IGRhdGEgJiAweDdGRkZGRkZGOworCQkJZGF0YSA9IGRhdGEgfCAoMTw8MzEpOworCQkJdmYtPnNpZ25hbF90eXBlID0gZGF0YTsKKwkJfQorCX0KKwllbHNlCisJCXZmLT5zaWduYWxfdHlwZSA9IDA7CisJaGV2Yy0+dmlkZW9fc2lnbmFsX3R5cGVfZGVidWcgPSB2Zi0+c2lnbmFsX3R5cGU7CisKKwkvKiBtYXN0ZXJfZGlzcGxheV9jb2xvdXIgKi8KKwlpZiAoaGV2Yy0+c2VpX3ByZXNlbnRfZmxhZyAmIFNFSV9NQVNURVJfRElTUExBWV9DT0xPUl9NQVNLKSB7CisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCQlmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorCQkJCXZmX2RwLT5wcmltYXJpZXNbaV1bal0gPSBoZXZjLT5wcmltYXJpZXNbaV1bal07CisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCXZmX2RwLT53aGl0ZV9wb2ludFtpXSA9IGhldmMtPndoaXRlX3BvaW50W2ldOworCQkJdmZfZHAtPmx1bWluYW5jZVtpXQorCQkJCT0gaGV2Yy0+bHVtaW5hbmNlW2ldOworCQl9CisJCXZmX2RwLT5wcmVzZW50X2ZsYWcgPSAxOworCX0gZWxzZQorCQl2Zl9kcC0+cHJlc2VudF9mbGFnID0gMDsKKworCS8qIGNvbnRlbnRfbGlnaHRfbGV2ZWwgKi8KKwlpZiAoaGV2Yy0+c2VpX3ByZXNlbnRfZmxhZyAmIFNFSV9DT05URU5UX0xJR0hUX0xFVkVMX01BU0spIHsKKwkJdmZfZHAtPmNvbnRlbnRfbGlnaHRfbGV2ZWwubWF4X2NvbnRlbnQKKwkJCT0gaGV2Yy0+Y29udGVudF9saWdodF9sZXZlbFswXTsKKwkJdmZfZHAtPmNvbnRlbnRfbGlnaHRfbGV2ZWwubWF4X3BpY19hdmVyYWdlCisJCQk9IGhldmMtPmNvbnRlbnRfbGlnaHRfbGV2ZWxbMV07CisJCXZmX2RwLT5jb250ZW50X2xpZ2h0X2xldmVsLnByZXNlbnRfZmxhZyA9IDE7CisJfSBlbHNlCisJCXZmX2RwLT5jb250ZW50X2xpZ2h0X2xldmVsLnByZXNlbnRfZmxhZyA9IDA7CisKKwlpZiAoaGV2Yy0+aXNfdXNlZF92NGwgJiYKKwkJKChoZXZjLT52aWRlb19zaWduYWxfdHlwZSAmIFZJREVPX1NJR05BTF9UWVBFX0FWQUlMQUJMRV9NQVNLKSB8fAorCQkoaGV2Yy0+c2VpX3ByZXNlbnRfZmxhZyAmIFNFSV9IRFIxMFBMVVNfTUFTSykgfHwKKwkJKHZmX2RwLT5wcmVzZW50X2ZsYWcpIHx8CisJCSh2Zl9kcC0+Y29udGVudF9saWdodF9sZXZlbC5wcmVzZW50X2ZsYWcpKSkgeworCQlzdHJ1Y3QgYW1sX3ZkZWNfaGRyX2luZm9zIGhkcjsKKwkJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShoZXZjLT52NGwyX2N0eCk7CisKKwkJbWVtc2V0KCZoZHIsIDAsIHNpemVvZihoZHIpKTsKKwkJaGRyLnNpZ25hbF90eXBlID0gdmYtPnNpZ25hbF90eXBlOworCQloZHIuY29sb3JfcGFybXMgPSAqdmZfZHA7CisJCXZkZWNfdjRsX3NldF9oZHJfaW5mb3MoY3R4LCAmaGRyKTsKKwl9CisKKwlpZiAoKGhldmMtPnNlaV9wcmVzZW50X2ZsYWcgJiBTRUlfSERSMTBQTFVTX01BU0spICYmIChwaWMtPmhkcjEwcF9kYXRhX2J1ZiAhPSBOVUxMKQorCQkmJiAocGljLT5oZHIxMHBfZGF0YV9zaXplICE9IDApKSB7CisJCWlmIChwaWMtPmhkcjEwcF9kYXRhX3NpemUgPD0gMTI4KSB7CisJCQljaGFyICpuZXdfYnVmOworCQkJbmV3X2J1ZiA9IGt6YWxsb2MocGljLT5oZHIxMHBfZGF0YV9zaXplLCBHRlBfQVRPTUlDKTsKKworCQkJaWYgKG5ld19idWYpIHsKKwkJCQltZW1jcHkobmV3X2J1ZiwgcGljLT5oZHIxMHBfZGF0YV9idWYsIHBpYy0+aGRyMTBwX2RhdGFfc2l6ZSk7CisJCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfUFJJTlRfU0VJKSB7CisJCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJCSJoZHIxMHAgZGF0YTogKHNpemUgJWQpXG4iLAorCQkJCQkJcGljLT5oZHIxMHBfZGF0YV9zaXplKTsKKwkJCQkJZm9yIChpID0gMDsgaSA8IHBpYy0+aGRyMTBwX2RhdGFfc2l6ZTsgaSsrKSB7CisJCQkJCQloZXZjX3ByaW50X2NvbnQoaGV2YywgMCwKKwkJCQkJCQkiJTAyeCAiLCBwaWMtPmhkcjEwcF9kYXRhX2J1ZltpXSk7CisJCQkJCQlpZiAoKChpICsgMSkgJiAweGYpID09IDApCisJCQkJCQkJaGV2Y19wcmludF9jb250KGhldmMsIDAsICJcbiIpOworCQkJCQl9CisJCQkJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLCAiXG4iKTsKKwkJCQl9CisKKwkJCQl2Zi0+aGRyMTBwX2RhdGFfc2l6ZSA9IHBpYy0+aGRyMTBwX2RhdGFfc2l6ZTsKKwkJCQl2Zi0+aGRyMTBwX2RhdGFfYnVmID0gbmV3X2J1ZjsKKwkJCX0gZWxzZSB7CisJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkiJXM6aGRyMTBwIGRhdGEgdnphbGxvYyBzaXplKCVkKSBmYWlsXG4iLAorCQkJCQlfX2Z1bmNfXywgcGljLT5oZHIxMHBfZGF0YV9zaXplKTsKKwkJCQl2Zi0+aGRyMTBwX2RhdGFfYnVmID0gTlVMTDsKKwkJCQl2Zi0+aGRyMTBwX2RhdGFfc2l6ZSA9IDA7CisJCQl9CisJCX0KKworCQl2ZnJlZShwaWMtPmhkcjEwcF9kYXRhX2J1Zik7CisJCXBpYy0+aGRyMTBwX2RhdGFfYnVmID0gTlVMTDsKKwkJcGljLT5oZHIxMHBfZGF0YV9zaXplID0gMDsKKwl9CisKKwl2Zi0+c2lkZWJpbmRfdHlwZSA9IGhldmMtPnNpZGViaW5kX3R5cGU7CisJdmYtPnNpZGViaW5kX2NoYW5uZWxfaWQgPSBoZXZjLT5zaWRlYmluZF9jaGFubmVsX2lkOworfQorCitzdGF0aWMgaW50IHZoMjY1X3ZmX3N0YXRlcyhzdHJ1Y3QgdmZyYW1lX3N0YXRlcyAqc3RhdGVzLCB2b2lkICpvcF9hcmcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IG9wX2FyZzsKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjID0gKHN0cnVjdCBoZXZjX3N0YXRlX3MgKil2ZGVjLT5wcml2YXRlOworI2Vsc2UKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjID0gKHN0cnVjdCBoZXZjX3N0YXRlX3MgKilvcF9hcmc7CisjZW5kaWYKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CisKKwlzdGF0ZXMtPnZmX3Bvb2xfc2l6ZSA9IFZGX1BPT0xfU0laRTsKKwlzdGF0ZXMtPmJ1Zl9mcmVlX251bSA9IGtmaWZvX2xlbigmaGV2Yy0+bmV3ZnJhbWVfcSk7CisJc3RhdGVzLT5idWZfYXZhaWxfbnVtID0ga2ZpZm9fbGVuKCZoZXZjLT5kaXNwbGF5X3EpOworCisJaWYgKHN0ZXAgPT0gMikKKwkJc3RhdGVzLT5idWZfYXZhaWxfbnVtID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZoMjY1X3ZmX3BlZWsodm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCB2ZnJhbWVfcyAqdmZbMl0gPSB7MCwgMH07CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBvcF9hcmc7CisJc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YyA9IChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICopdmRlYy0+cHJpdmF0ZTsKKyNlbHNlCisJc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YyA9IChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICopb3BfYXJnOworI2VuZGlmCisKKwlpZiAoc3RlcCA9PSAyKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChmb3JjZV9kaXNwX3BpY19pbmRleCAmIDB4MTAwKSB7CisJCWlmIChmb3JjZV9kaXNwX3BpY19pbmRleCAmIDB4MjAwKQorCQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiAmaGV2Yy0+dmZyYW1lX2R1bW15OworCX0KKworCWlmIChrZmlmb19sZW4oJmhldmMtPmRpc3BsYXlfcSkgPiBWRl9QT09MX1NJWkUpIHsKKwkJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX0JVRk1HUiwKKwkJCSJrZmlmbyBsZW46JWQgaW52YWlsZCwgcGVlayBlcnJvclxuIiwKKwkJCWtmaWZvX2xlbigmaGV2Yy0+ZGlzcGxheV9xKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChrZmlmb19vdXRfcGVlaygmaGV2Yy0+ZGlzcGxheV9xLCAodm9pZCAqKSZ2ZiwgMikpIHsKKwkJaWYgKHZmWzFdKSB7CisJCQl2ZlswXS0+bmV4dF92Zl9wdHNfdmFsaWQgPSB0cnVlOworCQkJdmZbMF0tPm5leHRfdmZfcHRzID0gdmZbMV0tPnB0czsKKwkJfSBlbHNlCisJCQl2ZlswXS0+bmV4dF92Zl9wdHNfdmFsaWQgPSBmYWxzZTsKKwkJcmV0dXJuIHZmWzBdOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2aDI2NV92Zl9nZXQodm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCB2ZnJhbWVfcyAqdmY7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBvcF9hcmc7CisJc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YyA9IChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICopdmRlYy0+cHJpdmF0ZTsKKyNlbHNlCisJc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YyA9IChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICopb3BfYXJnOworI2VuZGlmCisKKwlpZiAoc3RlcCA9PSAyKQorCQlyZXR1cm4gTlVMTDsKKwllbHNlIGlmIChzdGVwID09IDEpCisJCXN0ZXAgPSAyOworCisjaWYgMAorCWlmIChmb3JjZV9kaXNwX3BpY19pbmRleCAmIDB4MTAwKSB7CisJCWludCBidWZmZXJfaW5kZXggPSBmb3JjZV9kaXNwX3BpY19pbmRleCAmIDB4ZmY7CisJCXN0cnVjdCBQSUNfcyAqcGljID0gTlVMTDsKKwkJaWYgKGJ1ZmZlcl9pbmRleCA+PSAwCisJCQkmJiBidWZmZXJfaW5kZXggPCBNQVhfUkVGX1BJQ19OVU0pCisJCQlwaWMgPSBoZXZjLT5tX1BJQ1tidWZmZXJfaW5kZXhdOworCQlpZiAocGljID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKGZvcmNlX2Rpc3BfcGljX2luZGV4ICYgMHgyMDApCisJCQlyZXR1cm4gTlVMTDsKKworCQl2ZiA9ICZoZXZjLT52ZnJhbWVfZHVtbXk7CisJCWlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUoaGV2YykpIHsKKwkJCXZmLT50eXBlID0gVklEVFlQRV9QUk9HUkVTU0lWRSB8IFZJRFRZUEVfVklVX0ZJRUxEIHwKKwkJCQlWSURUWVBFX1ZJVV9OVjIxOworCQkJaWYgKGhldmMtPm1faW5zX2ZsYWcpIHsKKwkJCQl2Zi0+Y2FudmFzMEFkZHIgPSB2Zi0+Y2FudmFzMUFkZHIgPSAtMTsKKwkJCQl2Zi0+cGxhbmVfbnVtID0gMjsKKwkJCQl2Zi0+Y2FudmFzMF9jb25maWdbMF0gPQorCQkJCQlwaWMtPmNhbnZhc19jb25maWdbMF07CisJCQkJdmYtPmNhbnZhczBfY29uZmlnWzFdID0KKwkJCQkJcGljLT5jYW52YXNfY29uZmlnWzFdOworCisJCQkJdmYtPmNhbnZhczFfY29uZmlnWzBdID0KKwkJCQkJcGljLT5jYW52YXNfY29uZmlnWzBdOworCQkJCXZmLT5jYW52YXMxX2NvbmZpZ1sxXSA9CisJCQkJCXBpYy0+Y2FudmFzX2NvbmZpZ1sxXTsKKwkJCX0gZWxzZSB7CisJCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyCisJCQkJPSBzcGVjMmNhbnZhcyhwaWMpOworCQkJfQorCQl9IGVsc2UgeworCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0gMDsKKwkJCXZmLT50eXBlID0gVklEVFlQRV9DT01QUkVTUyB8IFZJRFRZUEVfVklVX0ZJRUxEOworCQkJaWYgKGhldmMtPm1tdV9lbmFibGUpCisJCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9TQ0FUVEVSOworCQl9CisJCXZmLT5jb21wV2lkdGggPSBwaWMtPndpZHRoOworCQl2Zi0+Y29tcEhlaWdodCA9IHBpYy0+aGVpZ2h0OworCQl1cGRhdGVfdmZfbWVtaGFuZGxlKGhldmMsIHZmLCBwaWMpOworCQlzd2l0Y2ggKGhldmMtPmJpdF9kZXB0aF9sdW1hKSB7CisJCWNhc2UgOToKKwkJCXZmLT5iaXRkZXB0aCA9IEJJVERFUFRIX1k5IHwgQklUREVQVEhfVTkgfCBCSVRERVBUSF9WOTsKKwkJCWJyZWFrOworCQljYXNlIDEwOgorCQkJdmYtPmJpdGRlcHRoID0gQklUREVQVEhfWTEwIHwgQklUREVQVEhfVTEwCisJCQkJfCBCSVRERVBUSF9WMTA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXZmLT5iaXRkZXB0aCA9IEJJVERFUFRIX1k4IHwgQklUREVQVEhfVTggfCBCSVRERVBUSF9WODsKKwkJCWJyZWFrOworCQl9CisJCWlmICgodmYtPnR5cGUgJiBWSURUWVBFX0NPTVBSRVNTKSA9PSAwKQorCQkJdmYtPmJpdGRlcHRoID0KKwkJCQlCSVRERVBUSF9ZOCB8IEJJVERFUFRIX1U4IHwgQklUREVQVEhfVjg7CisJCWlmIChoZXZjLT5tZW1fc2F2aW5nX21vZGUgPT0gMSkKKwkJCXZmLT5iaXRkZXB0aCB8PSBCSVRERVBUSF9TQVZJTkdfTU9ERTsKKwkJdmYtPmR1cmF0aW9uX3B1bGxkb3duID0gMDsKKwkJdmYtPnB0cyA9IDA7CisJCXZmLT5wdHNfdXM2NCA9IDA7CisJCXNldF9mcmFtZV9pbmZvKGhldmMsIHZmKTsKKworCQl2Zi0+d2lkdGggPSBwaWMtPndpZHRoIC8KKwkJCWdldF9kb3VibGVfd3JpdGVfcmF0aW8ocGljLT5kb3VibGVfd3JpdGVfbW9kZSk7CisJCXZmLT5oZWlnaHQgPSBwaWMtPmhlaWdodCAvCisJCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKHBpYy0+ZG91YmxlX3dyaXRlX21vZGUpOworCisJCWZvcmNlX2Rpc3BfcGljX2luZGV4IHw9IDB4MjAwOworCQlyZXR1cm4gdmY7CisJfQorI2VuZGlmCisKKwlpZiAoa2ZpZm9fZ2V0KCZoZXZjLT5kaXNwbGF5X3EsICZ2ZikpIHsKKwkJc3RydWN0IHZmcmFtZV9zICpuZXh0X3ZmID0gTlVMTDsKKworCQlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS52Zl9nZXRfbmFtZSwgKGxvbmcpdmYpOworCQlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5kaXNwX3FfbmFtZSwga2ZpZm9fbGVuKCZoZXZjLT5kaXNwbGF5X3EpKTsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLnNldF9jYW52YXMwX2FkZHIsIHZmLT5jYW52YXMwX2NvbmZpZ1swXS5waHlfYWRkcik7CisjZWxzZQorCQlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5nZXRfY2FudmFzMF9hZGRyLCB2Zi0+Y2FudmFzMEFkZHIpOworI2VuZGlmCisKKwkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfUElDX1NUUlVDVCkgeworCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSIlcyh2ZiAweCVwIHR5cGUgJWQgaW5kZXggMHgleCBwb2MgJWQvJWQpIHB0cyglZCwlZCkgZHVyICVkXG4iLAorCQkJCV9fZnVuY19fLCB2ZiwgdmYtPnR5cGUsIHZmLT5pbmRleCwKKwkJCQlnZXRfcGljX3BvYyhoZXZjLCB2Zi0+aW5kZXggJiAweGZmKSwKKwkJCQlnZXRfcGljX3BvYyhoZXZjLCAodmYtPmluZGV4ID4+IDgpICYgMHhmZiksCisJCQkJdmYtPnB0cywgdmYtPnB0c191czY0LAorCQkJCXZmLT5kdXJhdGlvbik7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQkJaGV2Y19wcmludChoZXZjLCAwLCAiZ2V0IGNhbnZhczAgYWRkcjoweCV4XG4iLCB2Zi0+Y2FudmFzMF9jb25maWdbMF0ucGh5X2FkZHIpOworI2Vsc2UKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwgImdldCBjYW52YXMwIGFkZHI6MHgleFxuIiwgdmYtPmNhbnZhczBBZGRyKTsKKyNlbmRpZgorCQl9CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfRFYpIHsKKwkJCXN0cnVjdCBQSUNfcyAqcGljID0gaGV2Yy0+bV9QSUNbdmYtPmluZGV4ICYgMHhmZl07CisJCQloZXZjX3ByaW50KGhldmMsIDAsICJwaWMgMHglcCBhdXggc2l6ZSAlZDpcbiIsCisJCQkJCXBpYywgcGljLT5hdXhfZGF0YV9zaXplKTsKKwkJCWlmIChwaWMtPmF1eF9kYXRhX2J1ZiAmJiBwaWMtPmF1eF9kYXRhX3NpemUgPiAwKSB7CisJCQkJaW50IGk7CisJCQkJZm9yIChpID0gMDsgaSA8IHBpYy0+YXV4X2RhdGFfc2l6ZTsgaSsrKSB7CisJCQkJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLAorCQkJCQkJIiUwMnggIiwgcGljLT5hdXhfZGF0YV9idWZbaV0pOworCQkJCQlpZiAoKChpICsgMSkgJiAweGYpID09IDApCisJCQkJCQloZXZjX3ByaW50X2NvbnQoaGV2YywgMCwgIlxuIik7CisJCQkJfQorCQkJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLCAiXG4iKTsKKwkJCX0KKwkJfQorI2VuZGlmCisJCWhldmMtPnNob3dfZnJhbWVfbnVtKys7CisJCXZmLT5pbmRleF9kaXNwID0gYXRvbWljX3JlYWQoJmhldmMtPnZmX2dldF9jb3VudCk7CisJCWF0b21pY19hZGQoMSwgJmhldmMtPnZmX2dldF9jb3VudCk7CisKKwkJaWYgKGtmaWZvX3BlZWsoJmhldmMtPmRpc3BsYXlfcSwgJm5leHRfdmYpICYmIG5leHRfdmYpIHsKKwkJCXZmLT5uZXh0X3ZmX3B0c192YWxpZCA9IHRydWU7CisJCQl2Zi0+bmV4dF92Zl9wdHMgPSBuZXh0X3ZmLT5wdHM7CisJCX0gZWxzZQorCQkJdmYtPm5leHRfdmZfcHRzX3ZhbGlkID0gZmFsc2U7CisKKwkJcmV0dXJuIHZmOworCX0KKworCXJldHVybiBOVUxMOworfQorc3RhdGljIGJvb2wgdmZfdmFsaWRfY2hlY2soc3RydWN0IHZmcmFtZV9zICp2Ziwgc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykgeworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBWRl9QT09MX1NJWkU7IGkrKykgeworCQlpZiAodmYgPT0gJmhldmMtPnZmcG9vbFtpXSAgfHwgdmYgPT0gJmhldmMtPnZmcmFtZV9kdW1teSkKKwkJCXJldHVybiB0cnVlOworCX0KKwloZXZjX3ByaW50KGhldmMsIDAsIiBoMjY1IGludmFsaWQgdmYgYmVlbiBwdXQsIHZmID0gJXBcbiIsIHZmKTsKKwlmb3IgKGkgPSAwOyBpIDwgVkZfUE9PTF9TSVpFOyBpKyspIHsKKwkJaGV2Y19wcmludChoZXZjLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLCJ2YWxpZCB2ZlslZF09ICVwIFxuIiwgaSwgJmhldmMtPnZmcG9vbFtpXSk7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgdmgyNjVfdmZfcHV0KHN0cnVjdCB2ZnJhbWVfcyAqdmYsIHZvaWQgKm9wX2FyZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gb3BfYXJnOworCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPSAoc3RydWN0IGhldmNfc3RhdGVfcyAqKXZkZWMtPnByaXZhdGU7CisjZWxzZQorCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPSAoc3RydWN0IGhldmNfc3RhdGVfcyAqKW9wX2FyZzsKKyNlbmRpZgorCXVuc2lnbmVkIGNoYXIgaW5kZXhfdG9wOworCXVuc2lnbmVkIGNoYXIgaW5kZXhfYm90OworCisJaWYgKCF2ZikKKwkJcmV0dXJuOworCWlmICh2ZiA9PSAoJmhldmMtPnZmcmFtZV9kdW1teSkpCisJCXJldHVybjsKKwlpZiAodmYgJiYgKHZmX3ZhbGlkX2NoZWNrKHZmLCBoZXZjKSA9PSBmYWxzZSkpCisJCXJldHVybjsKKworCWlmIChoZXZjLT5lbmFibGVfZmVuY2UgJiYgdmYtPmZlbmNlKSB7CisJCWludCByZXQsIGk7CisKKwkJbXV0ZXhfbG9jaygmaGV2Yy0+ZmVuY2VfbXV0ZXgpOworCQlyZXQgPSBkbWFfZmVuY2VfZ2V0X3N0YXR1cyh2Zi0+ZmVuY2UpOworCQlpZiAocmV0ID09IDApIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBWRl9QT09MX1NJWkU7IGkrKykgeworCQkJCWlmIChoZXZjLT5mZW5jZV92Zl9zLmZlbmNlX3ZmW2ldID09IE5VTEwpIHsKKwkJCQkJaGV2Yy0+ZmVuY2VfdmZfcy5mZW5jZV92ZltpXSA9IHZmOworCQkJCQloZXZjLT5mZW5jZV92Zl9zLnVzZWRfc2l6ZSsrOworCQkJCQltdXRleF91bmxvY2soJmhldmMtPmZlbmNlX211dGV4KTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCQltdXRleF91bmxvY2soJmhldmMtPmZlbmNlX211dGV4KTsKKwl9CisKKwlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS52Zl9wdXRfbmFtZSwgKGxvbmcpdmYpOworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5wdXRfY2FudmFzMF9hZGRyLCB2Zi0+Y2FudmFzMF9jb25maWdbMF0ucGh5X2FkZHIpOworI2Vsc2UKKwlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5wdXRfY2FudmFzMF9hZGRyLCB2Zi0+Y2FudmFzMEFkZHIpOworI2VuZGlmCisJaW5kZXhfdG9wID0gdmYtPmluZGV4ICYgMHhmZjsKKwlpbmRleF9ib3QgPSAodmYtPmluZGV4ID4+IDgpICYgMHhmZjsKKwlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19QSUNfU1RSVUNUKQorCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiJXModmYgMHglcCB0eXBlICVkIGluZGV4IDB4JXggcHV0IGNhbnZhczAgYWRkcjoweCV4KVxuIiwKKwkJCV9fZnVuY19fLCB2ZiwgdmYtPnR5cGUsIHZmLT5pbmRleAorI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwkJCSwgdmYtPmNhbnZhczBfY29uZmlnWzBdLnBoeV9hZGRyCisjZWxzZQorCQkJLCB2Zi0+Y2FudmFzMEFkZHIKKyNlbmRpZgorCQkJKTsKKwlhdG9taWNfYWRkKDEsICZoZXZjLT52Zl9wdXRfY291bnQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CisJa2ZpZm9fcHV0KCZoZXZjLT5uZXdmcmFtZV9xLCAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLm5ld19xX25hbWUsIGtmaWZvX2xlbigmaGV2Yy0+bmV3ZnJhbWVfcSkpOworCWlmIChoZXZjLT5lbmFibGVfZmVuY2UgJiYgdmYtPmZlbmNlKSB7CisJCXZkZWNfZmVuY2VfcHV0KHZmLT5mZW5jZSk7CisJCXZmLT5mZW5jZSA9IE5VTEw7CisJfQorCisJaWYgKHZmLT5oZHIxMHBfZGF0YV9idWYpIHsKKwkJa2ZyZWUodmYtPmhkcjEwcF9kYXRhX2J1Zik7CisJCXZmLT5oZHIxMHBfZGF0YV9idWYgPSBOVUxMOworCQl2Zi0+aGRyMTBwX2RhdGFfc2l6ZSA9IDA7CisJfQorCisKKwlpZiAoaW5kZXhfdG9wICE9IDB4ZmYKKwkJJiYgaW5kZXhfdG9wIDwgTUFYX1JFRl9QSUNfTlVNCisJCSYmIGhldmMtPm1fUElDW2luZGV4X3RvcF0pIHsKKwkJaWYgKGhldmMtPm1fUElDW2luZGV4X3RvcF0tPnZmX3JlZiA+IDApIHsKKwkJCWhldmMtPm1fUElDW2luZGV4X3RvcF0tPnZmX3JlZi0tOworCisJCQlpZiAoaGV2Yy0+bV9QSUNbaW5kZXhfdG9wXS0+dmZfcmVmID09IDApIHsKKwkJCQloZXZjLT5tX1BJQ1tpbmRleF90b3BdLT5vdXRwdXRfcmVhZHkgPSAwOworCQkJCWhldmMtPm1fUElDW2luZGV4X3RvcF0tPnNob3dfZnJhbWUgPSBmYWxzZTsKKworCQkJCWlmIChoZXZjLT53YWl0X2J1ZiAhPSAwKQorCQkJCQlXUklURV9WUkVHKEhFVkNfQVNTSVNUX01CT1gwX0lSUV9SRUcsCisJCQkJCQkweDEpOworCQkJfQorCQl9CisJfQorCisJaWYgKGluZGV4X2JvdCAhPSAweGZmCisJCSYmIGluZGV4X2JvdCA8IE1BWF9SRUZfUElDX05VTQorCQkmJiBoZXZjLT5tX1BJQ1tpbmRleF9ib3RdKSB7CisJCWlmIChoZXZjLT5tX1BJQ1tpbmRleF9ib3RdLT52Zl9yZWYgPiAwKSB7CisJCQloZXZjLT5tX1BJQ1tpbmRleF9ib3RdLT52Zl9yZWYtLTsKKworCQkJaWYgKGhldmMtPm1fUElDW2luZGV4X2JvdF0tPnZmX3JlZiA9PSAwKSB7CisJCQkJaGV2Yy0+bV9QSUNbaW5kZXhfYm90XS0+b3V0cHV0X3JlYWR5ID0gMDsKKwkJCQloZXZjLT5tX1BJQ1tpbmRleF9ib3RdLT5zaG93X2ZyYW1lID0gZmFsc2U7CisKKwkJCQlpZiAoaGV2Yy0+d2FpdF9idWYgIT0gMCkKKwkJCQkJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9NQk9YMF9JUlFfUkVHLAorCQkJCQkJMHgxKTsKKwkJCX0KKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgdmgyNjVfZXZlbnRfY2IoaW50IHR5cGUsIHZvaWQgKmRhdGEsIHZvaWQgKm9wX2FyZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gb3BfYXJnOworCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPSAoc3RydWN0IGhldmNfc3RhdGVfcyAqKXZkZWMtPnByaXZhdGU7CisjZWxzZQorCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPSAoc3RydWN0IGhldmNfc3RhdGVfcyAqKW9wX2FyZzsKKyNlbmRpZgorCWlmICh0eXBlICYgVkZSQU1FX0VWRU5UX1JFQ0VJVkVSX1JFU0VUKSB7CisjaWYgMAorCQlhbWhldmNfc3RvcCgpOworI2lmbmRlZiBDT05GSUdfQU1MT0dJQ19QT1NUX1BST0NFU1NfTUFOQUdFUgorCQl2Zl9saWdodF91bnJlZ19wcm92aWRlcigmdmgyNjVfdmZfcHJvdik7CisjZW5kaWYKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhldmMtPmxvY2ssIGZsYWdzKTsKKwkJdmgyNjVfbG9jYWxfaW5pdCgpOworCQl2aDI2NV9wcm90X2luaXQoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGV2Yy0+bG9jaywgZmxhZ3MpOworI2lmbmRlZiBDT05GSUdfQU1MT0dJQ19QT1NUX1BST0NFU1NfTUFOQUdFUgorCQl2Zl9yZWdfcHJvdmlkZXIoJnZoMjY1X3ZmX3Byb3YpOworI2VuZGlmCisJCWFtaGV2Y19zdGFydCgpOworI2VuZGlmCisJfSBlbHNlIGlmICh0eXBlICYgVkZSQU1FX0VWRU5UX1JFQ0VJVkVSX0dFVF9BVVhfREFUQSkgeworCQlzdHJ1Y3QgcHJvdmlkZXJfYXV4X3JlcV9zICpyZXEgPQorCQkJKHN0cnVjdCBwcm92aWRlcl9hdXhfcmVxX3MgKilkYXRhOworCQl1bnNpZ25lZCBjaGFyIGluZGV4OworCisJCWlmICghcmVxLT52ZikgeworCQkJcmVxLT5hdXhfc2l6ZSA9IGF0b21pY19yZWFkKCZoZXZjLT52Zl9wdXRfY291bnQpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKKwkJaW5kZXggPSByZXEtPnZmLT5pbmRleCAmIDB4ZmY7CisJCXJlcS0+YXV4X2J1ZiA9IE5VTEw7CisJCXJlcS0+YXV4X3NpemUgPSAwOworCQlyZXEtPmZvcm1hdCA9IFZGT1JNQVRfSEVWQzsKKwkJaWYgKHJlcS0+Ym90X2ZsYWcpCisJCQlpbmRleCA9IChyZXEtPnZmLT5pbmRleCA+PiA4KSAmIDB4ZmY7CisJCWlmIChpbmRleCAhPSAweGZmCisJCQkmJiBpbmRleCA8IE1BWF9SRUZfUElDX05VTQorCQkJJiYgaGV2Yy0+bV9QSUNbaW5kZXhdKSB7CisJCQlyZXEtPmF1eF9idWYgPSBoZXZjLT5tX1BJQ1tpbmRleF0tPmF1eF9kYXRhX2J1ZjsKKwkJCXJlcS0+YXV4X3NpemUgPSBoZXZjLT5tX1BJQ1tpbmRleF0tPmF1eF9kYXRhX3NpemU7CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwkJCWlmIChoZXZjLT5ieXBhc3NfZHZlbmwgJiYgIWRvbGJ5X21ldGFfd2l0aF9lbCkKKwkJCQlyZXEtPmR2X2VuaGFuY2VfZXhpc3QgPSBmYWxzZTsKKwkJCWVsc2UKKwkJCQlyZXEtPmR2X2VuaGFuY2VfZXhpc3QgPQorCQkJCQloZXZjLT5tX1BJQ1tpbmRleF0tPmR2X2VuaGFuY2VfZXhpc3Q7CisJCQlpZiAodmRlY19mcmFtZV9iYXNlZCh2ZGVjKSAmJiAoaGV2Yy0+ZHZfZHVhbGxheWVyID09IHRydWUpKQorCQkJCXJlcS0+ZHZfZW5oYW5jZV9leGlzdCA9IDE7CisJCQloZXZjX3ByaW50KGhldmMsIEgyNjVfREVCVUdfRFYsCisJCQkicXVlcnkgZHZfZW5oYW5jZV9leGlzdCBmb3IgKHBpYyAweCVwLCB2ZiAweCVwLCBwb2MgJWQgaW5kZXggJWQpIGZsYWcgPT4gJWQsIGF1eCBzaXpkIDB4JXhcbiIsCisJCQloZXZjLT5tX1BJQ1tpbmRleF0sCisJCQlyZXEtPnZmLAorCQkJaGV2Yy0+bV9QSUNbaW5kZXhdLT5QT0MsIGluZGV4LAorCQkJcmVxLT5kdl9lbmhhbmNlX2V4aXN0LCByZXEtPmF1eF9zaXplKTsKKyNlbHNlCisJCQlyZXEtPmR2X2VuaGFuY2VfZXhpc3QgPSAwOworI2VuZGlmCisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOworCisJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX1BJQ19TVFJVQ1QpCisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiJXModHlwZSAweCV4IHZmIGluZGV4IDB4JXgpPT5zaXplIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgdHlwZSwgaW5kZXgsIHJlcS0+YXV4X3NpemUpOworCX0KKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCWVsc2UgaWYgKHR5cGUgJiBWRlJBTUVfRVZFTlRfUkVDRUlWRVJfRE9MQllfQllQQVNTX0VMKSB7CisJCWlmICgoZm9yY2VfYnlwYXNzX2R2ZW5sICYgMHg4MDAwMDAwMCkgPT0gMCkgeworCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJIiVzOiBWRlJBTUVfRVZFTlRfUkVDRUlWRVJfRE9MQllfQllQQVNTX0VMXG4iLAorCQkJX19mdW5jX18pOworCQkJaGV2Yy0+YnlwYXNzX2R2ZW5sX2VuYWJsZSA9IDE7CisJCX0KKwl9CisjZW5kaWYKKwllbHNlIGlmICh0eXBlICYgVkZSQU1FX0VWRU5UX1JFQ0VJVkVSX1JFUV9TVEFURSkgeworCQlzdHJ1Y3QgcHJvdmlkZXJfc3RhdGVfcmVxX3MgKnJlcSA9CisJCQkoc3RydWN0IHByb3ZpZGVyX3N0YXRlX3JlcV9zICopZGF0YTsKKwkJaWYgKHJlcS0+cmVxX3R5cGUgPT0gUkVRX1NUQVRFX1NFQ1VSRSkKKwkJCXJlcS0+cmVxX3Jlc3VsdFswXSA9IHZkZWNfc2VjdXJlKHZkZWMpOworCQllbHNlCisJCQlyZXEtPnJlcV9yZXN1bHRbMF0gPSAweGZmZmZmZmZmOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgSEVWQ19QSUNfU1RSVUNUX1NVUFBPUlQKK3N0YXRpYyBpbnQgcHJvY2Vzc19wZW5kaW5nX3ZmcmFtZShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCXN0cnVjdCBQSUNfcyAqcGFpcl9waWMsIHVuc2lnbmVkIGNoYXIgcGFpcl9mcmFtZV90b3BfZmxhZykKK3sKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmOworCisJaWYgKCFwYWlyX3BpYykKKwkJcmV0dXJuIC0xOworCisJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfUElDX1NUUlVDVCkKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJIiVzOiBwYWlyX3BpYyBpbmRleCAweCV4ICVzXG4iLAorCQkJX19mdW5jX18sIHBhaXJfcGljLT5pbmRleCwKKwkJCXBhaXJfZnJhbWVfdG9wX2ZsYWcgPworCQkJInRvcCIgOiAiYm90Iik7CisKKwlpZiAoa2ZpZm9fbGVuKCZoZXZjLT5wZW5kaW5nX3EpID4gMSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQlpbnQgaW5kZXgxOworCQlpbnQgaW5kZXgyOworCQkvKiBkbyBub3QgcGVuZGluZyBtb3JlIHRoYW4gMSBmcmFtZSAqLworCQlpZiAoa2ZpZm9fZ2V0KCZoZXZjLT5wZW5kaW5nX3EsICZ2ZikgPT0gMCkgeworCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJImZhdGFsIGVycm9yLCBubyBhdmFpbGFibGUgYnVmZmVyIHNsb3QuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfUElDX1NUUlVDVCkKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSIlcyB3YXJuaW5nKDEpLCB2Zj0+ZGlzcGxheV9xOiAoaW5kZXggMHgleCksIHZmIDB4JXB4XG4iLAorCQkJCV9fZnVuY19fLCB2Zi0+aW5kZXgsIHZmKTsKKwkJaWYgKChwYWlyX3BpYy0+ZG91YmxlX3dyaXRlX21vZGUgPT0gMykgJiYKKwkJCQkoIShJU184S19TSVpFKHZmLT53aWR0aCwgdmYtPmhlaWdodCkpKSkgeworCQkJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX0NPTVBSRVNTOworCQkJCQlpZiAoaGV2Yy0+bW11X2VuYWJsZSkKKwkJCQkJCXZmLT50eXBlIHw9IFZJRFRZUEVfU0NBVFRFUjsKKwkJfQorCisJCWhldmMtPnZmX3ByZV9jb3VudCsrOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCQlrZmlmb19wdXQoJmhldmMtPm5ld2ZyYW1lX3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCWluZGV4MSA9IHZmLT5pbmRleCAmIDB4ZmY7CisJCWluZGV4MiA9ICh2Zi0+aW5kZXggPj4gOCkgJiAweGZmOworCQlpZiAoaW5kZXgxID49IE1BWF9SRUZfUElDX05VTSAmJgorCQkJaW5kZXgyID49IE1BWF9SRUZfUElDX05VTSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaWYgKGluZGV4MSA8IE1BWF9SRUZfUElDX05VTSkgeworCQkJaGV2Yy0+bV9QSUNbaW5kZXgxXS0+dmZfcmVmID0gMDsKKwkJCWhldmMtPm1fUElDW2luZGV4MV0tPm91dHB1dF9yZWFkeSA9IDA7CisJCX0KKwkJaWYgKGluZGV4MiA8IE1BWF9SRUZfUElDX05VTSkgeworCQkJaGV2Yy0+bV9QSUNbaW5kZXgyXS0+dmZfcmVmID0gMDsKKwkJCWhldmMtPm1fUElDW2luZGV4Ml0tPm91dHB1dF9yZWFkeSA9IDA7CisJCX0KKworCQlpZiAoaGV2Yy0+d2FpdF9idWYgIT0gMCkKKwkJCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTUJPWDBfSVJRX1JFRywKKwkJCQkweDEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CisKKwkJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UucHRzX25hbWUsIHZmLT5wdHMpOworCX0KKworCWlmIChrZmlmb19wZWVrKCZoZXZjLT5wZW5kaW5nX3EsICZ2ZikpIHsKKwkJaWYgKHBhaXJfcGljID09IE5VTEwgfHwgcGFpcl9waWMtPnZmX3JlZiA8PSAwKSB7CisJCQkvKgorCQkJICppZiBwYWlyX3BpYyBpcyByZWN5Y2xlZCAocGFpcl9waWMtPnZmX3JlZiA8PSAwKSwKKwkJCSAqZG8gbm90IHVzZSBpdAorCQkJICovCisJCQlpZiAoa2ZpZm9fZ2V0KCZoZXZjLT5wZW5kaW5nX3EsICZ2ZikgPT0gMCkgeworCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkiZmF0YWwgZXJyb3IsIG5vIGF2YWlsYWJsZSBidWZmZXIgc2xvdC4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19QSUNfU1RSVUNUKQorCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkiJXMgd2FybmluZygyKSwgdmY9PmRpc3BsYXlfcTogKGluZGV4IDB4JXgpXG4iLAorCQkJCV9fZnVuY19fLCB2Zi0+aW5kZXgpOworCQkJaWYgKHZmKSB7CisJCQkJaWYgKChwYWlyX3BpYy0+ZG91YmxlX3dyaXRlX21vZGUgPT0gMykgJiYKKwkJCQkoIShJU184S19TSVpFKHZmLT53aWR0aCwgdmYtPmhlaWdodCkpKSkgeworCQkJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX0NPTVBSRVNTOworCQkJCQlpZiAoaGV2Yy0+bW11X2VuYWJsZSkKKwkJCQkJCXZmLT50eXBlIHw9IFZJRFRZUEVfU0NBVFRFUjsKKwkJCQl9CisJCQkJaGV2Yy0+dmZfcHJlX2NvdW50Kys7CisJCQkJdmRlY192ZnJhbWVfcmVhZHkoaHdfdG9fdmRlYyhoZXZjKSwgdmYpOworCQkJCWtmaWZvX3B1dCgmaGV2Yy0+ZGlzcGxheV9xLAorCQkJCShjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCQkJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UucHRzX25hbWUsIHZmLT5wdHMpOworCQkJfQorCQl9IGVsc2UgaWYgKCghcGFpcl9mcmFtZV90b3BfZmxhZykgJiYKKwkJCSgoKHZmLT5pbmRleCA+PiA4KSAmIDB4ZmYpID09IDB4ZmYpKSB7CisJCQlpZiAoa2ZpZm9fZ2V0KCZoZXZjLT5wZW5kaW5nX3EsICZ2ZikgPT0gMCkgeworCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkiZmF0YWwgZXJyb3IsIG5vIGF2YWlsYWJsZSBidWZmZXIgc2xvdC4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAodmYpIHsKKwkJCQlpZiAoKHBhaXJfcGljLT5kb3VibGVfd3JpdGVfbW9kZSA9PSAzKSAmJgorCQkJCSghKElTXzhLX1NJWkUodmYtPndpZHRoLCB2Zi0+aGVpZ2h0KSkpKSB7CisJCQkJCXZmLT50eXBlIHw9IFZJRFRZUEVfQ09NUFJFU1M7CisJCQkJCWlmIChoZXZjLT5tbXVfZW5hYmxlKQorCQkJCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9TQ0FUVEVSOworCQkJCX0KKwkJCQl2Zi0+aW5kZXggJj0gMHhmZjsKKwkJCQl2Zi0+aW5kZXggfD0gKHBhaXJfcGljLT5pbmRleCA8PCA4KTsKKwkJCQlwYWlyX3BpYy0+dmZfcmVmKys7CisJCQkJdmRlY192ZnJhbWVfcmVhZHkoaHdfdG9fdmRlYyhoZXZjKSwgdmYpOworCQkJCWtmaWZvX3B1dCgmaGV2Yy0+ZGlzcGxheV9xLAorCQkJCShjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCQkJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UucHRzX25hbWUsIHZmLT5wdHMpOworCQkJCWhldmMtPnZmX3ByZV9jb3VudCsrOworCQkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX1BJQ19TVFJVQ1QpCisJCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJIiVzIHZmID0+IGRpc3BsYXlfcTogKGluZGV4IDB4JXgpXG4iLAorCQkJCQlfX2Z1bmNfXywgdmYtPmluZGV4KTsKKwkJCX0KKwkJfSBlbHNlIGlmIChwYWlyX2ZyYW1lX3RvcF9mbGFnICYmCisJCQkoKHZmLT5pbmRleCAmIDB4ZmYpID09IDB4ZmYpKSB7CisJCQlpZiAoa2ZpZm9fZ2V0KCZoZXZjLT5wZW5kaW5nX3EsICZ2ZikgPT0gMCkgeworCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkiZmF0YWwgZXJyb3IsIG5vIGF2YWlsYWJsZSBidWZmZXIgc2xvdC4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAodmYpIHsKKwkJCQlpZiAoKHBhaXJfcGljLT5kb3VibGVfd3JpdGVfbW9kZSA9PSAzKSAmJgorCQkJCSghKElTXzhLX1NJWkUodmYtPndpZHRoLCB2Zi0+aGVpZ2h0KSkpKSB7CisJCQkJCXZmLT50eXBlIHw9IFZJRFRZUEVfQ09NUFJFU1M7CisJCQkJCWlmIChoZXZjLT5tbXVfZW5hYmxlKQorCQkJCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9TQ0FUVEVSOworCQkJCX0KKwkJCQl2Zi0+aW5kZXggJj0gMHhmZjAwOworCQkJCXZmLT5pbmRleCB8PSBwYWlyX3BpYy0+aW5kZXg7CisJCQkJcGFpcl9waWMtPnZmX3JlZisrOworCQkJCXZkZWNfdmZyYW1lX3JlYWR5KGh3X3RvX3ZkZWMoaGV2YyksIHZmKTsKKwkJCQlrZmlmb19wdXQoJmhldmMtPmRpc3BsYXlfcSwKKwkJCQkoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQkJCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLnB0c19uYW1lLCB2Zi0+cHRzKTsKKwkJCQloZXZjLT52Zl9wcmVfY291bnQrKzsKKwkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19QSUNfU1RSVUNUKQorCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCSIlcyB2ZiA9PiBkaXNwbGF5X3E6IChpbmRleCAweCV4KVxuIiwKKwkJCQkJX19mdW5jX18sIHZmLT5pbmRleCk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKK3N0YXRpYyB2b2lkIHVwZGF0ZV92Zl9tZW1oYW5kbGUoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmLCBzdHJ1Y3QgUElDX3MgKnBpYykKK3sKKwl2Zi0+bWVtX2hhbmRsZSA9IE5VTEw7CisJdmYtPm1lbV9oZWFkX2hhbmRsZSA9IE5VTEw7CisKKwkvKiBrZWVwZXIgbm90IG5lZWRlZCBmb3IgdjRsIHNvbHV0aW9uICovCisJaWYgKGhldmMtPmlzX3VzZWRfdjRsKQorCQlyZXR1cm47CisKKwlpZiAodmYtPnR5cGUgJiBWSURUWVBFX1NDQVRURVIpIHsKKyNpZmRlZiBIMjY1XzEwQl9NTVVfRFcKKwkJaWYgKGhldmMtPmR3X21tdV9lbmFibGUpIHsKKwkJCXZmLT5tZW1faGFuZGxlID0KKwkJCQlkZWNvZGVyX21tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJCWhldmMtPm1tdV9ib3hfZHcsIHBpYy0+aW5kZXgpOworCQkJdmYtPm1lbV9oZWFkX2hhbmRsZSA9CisJCQkJZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCQkJaGV2Yy0+Ym1tdV9ib3gsIFZGX0JVRkZFUl9JRFgocGljLT5CVUZfaW5kZXgpKTsKKwkJfSBlbHNlCisKKyNlbmRpZgorCQl7CisJCQl2Zi0+bWVtX2hhbmRsZSA9CisJCQkJZGVjb2Rlcl9tbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCQloZXZjLT5tbXVfYm94LCBwaWMtPmluZGV4KTsKKwkJCXZmLT5tZW1faGVhZF9oYW5kbGUgPQorCQkJCWRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJCWhldmMtPmJtbXVfYm94LCBWRl9CVUZGRVJfSURYKHBpYy0+QlVGX2luZGV4KSk7CisJCX0KKwl9IGVsc2UgeworCQl2Zi0+bWVtX2hhbmRsZSA9CisJCQlkZWNvZGVyX2JtbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCWhldmMtPmJtbXVfYm94LCBWRl9CVUZGRVJfSURYKHBpYy0+QlVGX2luZGV4KSk7CisJCXZmLT5tZW1faGVhZF9oYW5kbGUgPSBOVUxMOworCQkvKnZmLT5tZW1faGVhZF9oYW5kbGUgPQorCQkJZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCQloZXZjLT5ibW11X2JveCwgVkZfQlVGRkVSX0lEWChCVUZfaW5kZXgpKTsqLworCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfZnJhbWVfaW5mbyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCXN0cnVjdCBQSUNfcyAqcGljLCB1bnNpZ25lZCBpbnQgZnJhbWVzaXplLCB1bnNpZ25lZCBpbnQgcHRzKQoreworCXN0cnVjdCB2ZnJhbWVfcW9zX3MgKnZmcmFtZV9xb3MgPSAmaGV2Yy0+dmZyYW1lX3FvczsKKwlpZiAoaGV2Yy0+bV9uYWxVbml0VHlwZSA9PSBOQUxfVU5JVF9DT0RFRF9TTElDRV9JRFIpCisJCXZmcmFtZV9xb3MtPnR5cGUgPSA0OworCWVsc2UgaWYgKHBpYy0+c2xpY2VfdHlwZSA9PSBJX1NMSUNFKQorCQl2ZnJhbWVfcW9zLT50eXBlID0gMTsKKwllbHNlIGlmIChwaWMtPnNsaWNlX3R5cGUgPT0gUF9TTElDRSkKKwkJdmZyYW1lX3Fvcy0+dHlwZSA9IDI7CisJZWxzZSBpZiAocGljLT5zbGljZV90eXBlID09IEJfU0xJQ0UpCisJCXZmcmFtZV9xb3MtPnR5cGUgPSAzOworLyoKKyNkZWZpbmUgU0hPV19RT1NfSU5GTworKi8KKwlpZiAoaW5wdXRfZnJhbWVfYmFzZWQoaHdfdG9fdmRlYyhoZXZjKSkpCisJCXZmcmFtZV9xb3MtPnNpemUgPSBwaWMtPmZyYW1lX3NpemU7CisJZWxzZQorCQl2ZnJhbWVfcW9zLT5zaXplID0gZnJhbWVzaXplOworCXZmcmFtZV9xb3MtPnB0cyA9IHB0czsKKyNpZmRlZiBTSE9XX1FPU19JTkZPCisJaGV2Y19wcmludChoZXZjLCAwLCAic2xpY2U6JWQsIHBvYzolZFxuIiwgcGljLT5zbGljZV90eXBlLCBwaWMtPlBPQyk7CisjZW5kaWYKKworCisJdmZyYW1lX3Fvcy0+bWF4X212ID0gcGljLT5tYXhfbXY7CisJdmZyYW1lX3Fvcy0+YXZnX212ID0gcGljLT5hdmdfbXY7CisJdmZyYW1lX3Fvcy0+bWluX212ID0gcGljLT5taW5fbXY7CisjaWZkZWYgU0hPV19RT1NfSU5GTworCWhldmNfcHJpbnQoaGV2YywgMCwgIm12OiBtYXg6JWQsICBhdmc6JWQsIG1pbjolZFxuIiwKKwkJCXZmcmFtZV9xb3MtPm1heF9tdiwKKwkJCXZmcmFtZV9xb3MtPmF2Z19tdiwKKwkJCXZmcmFtZV9xb3MtPm1pbl9tdik7CisjZW5kaWYKKworCXZmcmFtZV9xb3MtPm1heF9xcCA9IHBpYy0+bWF4X3FwOworCXZmcmFtZV9xb3MtPmF2Z19xcCA9IHBpYy0+YXZnX3FwOworCXZmcmFtZV9xb3MtPm1pbl9xcCA9IHBpYy0+bWluX3FwOworI2lmZGVmIFNIT1dfUU9TX0lORk8KKwloZXZjX3ByaW50KGhldmMsIDAsICJxcDogbWF4OiVkLCAgYXZnOiVkLCBtaW46JWRcbiIsCisJCQl2ZnJhbWVfcW9zLT5tYXhfcXAsCisJCQl2ZnJhbWVfcW9zLT5hdmdfcXAsCisJCQl2ZnJhbWVfcW9zLT5taW5fcXApOworI2VuZGlmCisKKwl2ZnJhbWVfcW9zLT5tYXhfc2tpcCA9IHBpYy0+bWF4X3NraXA7CisJdmZyYW1lX3Fvcy0+YXZnX3NraXAgPSBwaWMtPmF2Z19za2lwOworCXZmcmFtZV9xb3MtPm1pbl9za2lwID0gcGljLT5taW5fc2tpcDsKKyNpZmRlZiBTSE9XX1FPU19JTkZPCisJaGV2Y19wcmludChoZXZjLCAwLCAic2tpcDogbWF4OiVkLAlhdmc6JWQsIG1pbjolZFxuIiwKKwkJCXZmcmFtZV9xb3MtPm1heF9za2lwLAorCQkJdmZyYW1lX3Fvcy0+YXZnX3NraXAsCisJCQl2ZnJhbWVfcW9zLT5taW5fc2tpcCk7CisjZW5kaWYKKworCXZmcmFtZV9xb3MtPm51bSsrOworCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoZXZjX3VwZGF0ZV9ndnMoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Yywgc3RydWN0IFBJQ19zICpwaWMpCit7CisJaWYgKGhldmMtPmd2cy0+ZnJhbWVfaGVpZ2h0ICE9IHBpYy0+aGVpZ2h0KSB7CisJCWhldmMtPmd2cy0+ZnJhbWVfd2lkdGggPSBwaWMtPndpZHRoOworCQloZXZjLT5ndnMtPmZyYW1lX2hlaWdodCA9IHBpYy0+aGVpZ2h0OworCX0KKwlpZiAoaGV2Yy0+Z3ZzLT5mcmFtZV9kdXIgIT0gaGV2Yy0+ZnJhbWVfZHVyKSB7CisJCWhldmMtPmd2cy0+ZnJhbWVfZHVyID0gaGV2Yy0+ZnJhbWVfZHVyOworCQlpZiAoaGV2Yy0+ZnJhbWVfZHVyICE9IDApCisJCQloZXZjLT5ndnMtPmZyYW1lX3JhdGUgPSAoKDk2MDAwICogMTAgLyBoZXZjLT5mcmFtZV9kdXIpICUgMTApIDwgNSA/CisJCQkJCTk2MDAwIC8gaGV2Yy0+ZnJhbWVfZHVyIDogKDk2MDAwIC8gaGV2Yy0+ZnJhbWVfZHVyICsxKTsKKwkJZWxzZQorCQkJaGV2Yy0+Z3ZzLT5mcmFtZV9yYXRlID0gLTE7CisJfQorCWhldmMtPmd2cy0+ZXJyb3JfY291bnQgPSBoZXZjLT5ndnMtPmVycm9yX2ZyYW1lX2NvdW50OworCWhldmMtPmd2cy0+c3RhdHVzID0gaGV2Yy0+c3RhdCB8IGhldmMtPmZhdGFsX2Vycm9yOworCWlmIChoZXZjLT5ndnMtPnJhdGlvX2NvbnRyb2wgIT0gaGV2Yy0+cmF0aW9fY29udHJvbCkKKwkJaGV2Yy0+Z3ZzLT5yYXRpb19jb250cm9sID0gaGV2Yy0+cmF0aW9fY29udHJvbDsKK30KKworc3RhdGljIHZvaWQgcHV0X3ZmX3RvX2Rpc3BsYXlfcShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLCBzdHJ1Y3QgdmZyYW1lX3MgKnZmKQoreworCWhldmMtPnZmX3ByZV9jb3VudCsrOworCWRlY29kZXJfZG9fZnJhbWVfY2hlY2soaHdfdG9fdmRlYyhoZXZjKSwgdmYpOworCXZkZWNfdmZyYW1lX3JlYWR5KGh3X3RvX3ZkZWMoaGV2YyksIHZmKTsKKwlrZmlmb19wdXQoJmhldmMtPmRpc3BsYXlfcSwgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5wdHNfbmFtZSwgdmYtPnB0cyk7Cit9CisKK3N0YXRpYyBpbnQgcG9zdF9wcmVwYXJlX3Byb2Nlc3Moc3RydWN0IHZkZWNfcyAqdmRlYywgc3RydWN0IFBJQ19zICpmcmFtZSkKK3sKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjID0gKHN0cnVjdCBoZXZjX3N0YXRlX3MgKil2ZGVjLT5wcml2YXRlOworCisJaWYgKGZvcmNlX2Rpc3BfcGljX2luZGV4ICYgMHgxMDApIHsKKwkJLypyZWN5Y2xlIGRpcmVjdGx5Ki8KKwkJZnJhbWUtPm91dHB1dF9yZWFkeSA9IDA7CisJCWZyYW1lLT5zaG93X2ZyYW1lID0gZmFsc2U7CisJCWhldmNfcHJpbnQoaGV2YywgMCwgImRpc2NhcmQgc2hvdyBmcmFtZS5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlmcmFtZS0+c2hvd19mcmFtZSA9IHRydWU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwb3N0X3ZpZGVvX2ZyYW1lKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHN0cnVjdCBQSUNfcyAqcGljKQoreworCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPSAoc3RydWN0IGhldmNfc3RhdGVfcyAqKXZkZWMtPnByaXZhdGU7CisJc3RydWN0IHZmcmFtZV9zICp2ZiA9IE5VTEw7CisJaW50IHN0cmVhbV9vZmZzZXQgPSBwaWMtPnN0cmVhbV9vZmZzZXQ7CisJdW5zaWduZWQgc2hvcnQgc2xpY2VfdHlwZSA9IHBpYy0+c2xpY2VfdHlwZTsKKwl1bG9uZyBudl9vcmRlciA9IFZJRFRZUEVfVklVX05WMjE7CisJdTMyIGZyYW1lX3NpemUgPSAwOworCXN0cnVjdCB2ZGVjX2luZm8gdG1wNHg7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICogdjRsMl9jdHggPSBoZXZjLT52NGwyX2N0eDsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPSBOVUxMOworCWludCBpbmRleDsKKworCS8qIHN3YXAgdXYgKi8KKwlpZiAoaGV2Yy0+aXNfdXNlZF92NGwpIHsKKwkJaWYgKCh2NGwyX2N0eC0+Y2FwX3BpeF9mbXQgPT0gVjRMMl9QSVhfRk1UX05WMTIpIHx8CisJCQkodjRsMl9jdHgtPmNhcF9waXhfZm10ID09IFY0TDJfUElYX0ZNVF9OVjEyTSkpCisJCQludl9vcmRlciA9IFZJRFRZUEVfVklVX05WMTI7CisJfQorCisJaWYgKGtmaWZvX2dldCgmaGV2Yy0+bmV3ZnJhbWVfcSwgJnZmKSA9PSAwKSB7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJmYXRhbCBlcnJvciwgbm8gYXZhaWxhYmxlIGJ1ZmZlciBzbG90LiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHZmKSB7CisJCS8qaGV2Y19wcmludChoZXZjLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJIiVzOiBwaWMgaW5kZXggMHgleFxuIiwKKwkJCV9fZnVuY19fLCBwaWMtPmluZGV4KTsqLworCisJCWlmIChoZXZjLT5pc191c2VkX3Y0bCkgeworCQkJdmYtPnY0bF9tZW1faGFuZGxlCisJCQkJPSBoZXZjLT5tX0JVRltwaWMtPkJVRl9pbmRleF0udjRsX3JlZl9idWZfYWRkcjsKKwkJCWZiID0gKHN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICopdmYtPnY0bF9tZW1faGFuZGxlOworCQkJaWYgKGhldmMtPm1tdV9lbmFibGUpIHsKKwkJCQl2Zi0+bW1fYm94LmJtbXVfYm94CT0gaGV2Yy0+Ym1tdV9ib3g7CisJCQkJdmYtPm1tX2JveC5ibW11X2lkeAk9IFZGX0JVRkZFUl9JRFgoaGV2Yy0+YnVmZmVyX3dyYXBbcGljLT5CVUZfaW5kZXhdKTsKKwkJCQl2Zi0+bW1fYm94Lm1tdV9ib3gJPSBoZXZjLT5tbXVfYm94OworCQkJCXZmLT5tbV9ib3gubW11X2lkeAk9IGhldmMtPmJ1ZmZlcl93cmFwW3BpYy0+QlVGX2luZGV4XTsKKwkJCX0KKwkJfQorCisJCWlmIChoZXZjLT5lbmFibGVfZmVuY2UpIHsKKwkJCS8qIGZpbGwgZmVuY2UgaW5mb3JtYXRpb24uICovCisJCQlpZiAoaGV2Yy0+ZmVuY2VfdXNhZ2UgPT0gRkVOQ0VfVVNFX0ZPUl9EUklWRVIpCisJCQkJdmYtPmZlbmNlCT0gcGljLT5mZW5jZTsKKwkJfQorCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQlpZiAodmRlY19mcmFtZV9iYXNlZCh2ZGVjKSkgeworCQkJdmYtPnB0cyA9IHBpYy0+cHRzOworCQkJdmYtPnB0c191czY0ID0gcGljLT5wdHM2NDsKKwkJCXZmLT50aW1lc3RhbXAgPSBwaWMtPnRpbWVzdGFtcDsKKwkJfQorCQkvKiBpZiAocHRzX2xvb2t1cF9vZmZzZXQoUFRTX1RZUEVfVklERU8sCisJCSAgIHN0cmVhbV9vZmZzZXQsICZ2Zi0+cHRzLCAwKSAhPSAwKSB7ICovCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwkJZWxzZSBpZiAodmRlYy0+bWFzdGVyID09IE5VTEwpIHsKKyNlbHNlCisJCWVsc2UgeworI2VuZGlmCisjZW5kaWYKKwkJCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19PVVRfUFRTLAorCQkJCSJjYWxsIHB0c19sb29rdXBfb2Zmc2V0X3VzNjQoMHgleClcbiIsCisJCQkJc3RyZWFtX29mZnNldCk7CisJCQlpZiAoKHZkZWMtPnZidWYubm9fcGFyc2VyID09IDApIHx8ICh2ZGVjLT52YnVmLnVzZV9wdHNzZXJ2KSkgeworCQkJCWlmIChwdHNfbG9va3VwX29mZnNldF91czY0CisJCQkJCShQVFNfVFlQRV9WSURFTywgc3RyZWFtX29mZnNldCwgJnZmLT5wdHMsCisJCQkJCSZmcmFtZV9zaXplLCAwLAorCQkJCQkgJnZmLT5wdHNfdXM2NCkgIT0gMCkgeworI2lmZGVmIERFQlVHX1BUUworCQkJCQloZXZjLT5wdHNfbWlzc2VkKys7CisjZW5kaWYKKwkJCQkJdmYtPnB0cyA9IDA7CisJCQkJCXZmLT5wdHNfdXM2NCA9IDA7CisJCQkJfSBlbHNlIHsKKyNpZmRlZiBERUJVR19QVFMKKwkJCQkJaGV2Yy0+cHRzX2hpdCsrOworI2VuZGlmCisJCQkJfQorCQkJfQorCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJCX0gZWxzZSB7CisJCQl2Zi0+cHRzID0gMDsKKwkJCXZmLT5wdHNfdXM2NCA9IDA7CisJCX0KKyNlbHNlCisJCX0KKyNlbmRpZgorI2VuZGlmCisJCWlmIChwdHNfdW5zdGFibGUgJiYgKGhldmMtPmZyYW1lX2R1ciA+IDApKQorCQkJaGV2Yy0+cHRzX21vZGUgPSBQVFNfTk9ORV9SRUZfVVNFX0RVUkFUSU9OOworCisJCWZpbGxfZnJhbWVfaW5mbyhoZXZjLCBwaWMsIGZyYW1lX3NpemUsIHZmLT5wdHMpOworCisJCWlmICh2Zi0+cHRzICE9IDApCisJCQloZXZjLT5sYXN0X2xvb2t1cF9wdHMgPSB2Zi0+cHRzOworCisJCWlmICgoaGV2Yy0+cHRzX21vZGUgPT0gUFRTX05PTkVfUkVGX1VTRV9EVVJBVElPTikKKwkJCSYmIChzbGljZV90eXBlICE9IDIpKQorCQkJdmYtPnB0cyA9IGhldmMtPmxhc3RfcHRzICsgRFVSMlBUUyhoZXZjLT5mcmFtZV9kdXIpOworCQloZXZjLT5sYXN0X3B0cyA9IHZmLT5wdHM7CisKKwkJaWYgKHZmLT5wdHNfdXM2NCAhPSAwKQorCQkJaGV2Yy0+bGFzdF9sb29rdXBfcHRzX3VzNjQgPSB2Zi0+cHRzX3VzNjQ7CisKKwkJaWYgKChoZXZjLT5wdHNfbW9kZSA9PSBQVFNfTk9ORV9SRUZfVVNFX0RVUkFUSU9OKQorCQkJJiYgKHNsaWNlX3R5cGUgIT0gMikpIHsKKwkJCXZmLT5wdHNfdXM2NCA9CisJCQkJaGV2Yy0+bGFzdF9wdHNfdXM2NCArCisJCQkJKERVUjJQVFMoaGV2Yy0+ZnJhbWVfZHVyKSAqIDEwMCAvIDkpOworCQl9CisJCWhldmMtPmxhc3RfcHRzX3VzNjQgPSB2Zi0+cHRzX3VzNjQ7CisJCWlmICgoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19PVVRfUFRTKSAhPSAwKSB7CisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiSDI2NSBkZWMgb3V0IHB0czogdmYtPnB0cz0lZCwgdmYtPnB0c191czY0ID0gJWxsZCwgdHM6ICVsbHVcbiIsCisJCQkgdmYtPnB0cywgdmYtPnB0c191czY0LCB2Zi0+dGltZXN0YW1wKTsKKwkJfQorCisJCS8qCisJCSAqdmYtPmluZGV4OgorCQkgKigxKSB2Zi0+dHlwZSBpcyBWSURUWVBFX1BST0dSRVNTSVZFCisJCSAqCWFuZCB2Zi0+Y2FudmFzMEFkZHIgIT0gIHZmLT5jYW52YXMxQWRkciwKKwkJICoJdmYtPmluZGV4Wzc6MF0gaXMgdGhlIGluZGV4IG9mIHRvcCBwaWMKKwkJICoJdmYtPmluZGV4WzE1OjhdIGlzIHRoZSBpbmRleCBvZiBib3QgcGljCisJCSAqKDIpIG90aGVyIGNhc2VzLAorCQkgKglvbmx5IHZmLT5pbmRleFs3OjBdIGlzIHVzZWQKKwkJICoJdmYtPmluZGV4WzE1OjhdID09IDB4ZmYKKwkJICovCisJCXZmLT5pbmRleCA9IDB4ZmYwMCB8IHBpYy0+aW5kZXg7CisjaWYgMQorLypTVVBQT1JUXzEwQklUKi8KKwkJaWYgKHBpYy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDEwKSB7CisJCQkvKiBkb3VibGUgd3JpdGUgb25seSAqLworCQkJdmYtPmNvbXBCb2R5QWRkciA9IDA7CisJCQl2Zi0+Y29tcEhlYWRBZGRyID0gMDsKKyNpZmRlZiBIMjY1XzEwQl9NTVVfRFcKKwkJCXZmLT5kd0JvZHlBZGRyID0gMDsKKwkJCXZmLT5kd0hlYWRBZGRyID0gMDsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJaWYgKGhldmMtPm1tdV9lbmFibGUpIHsKKwkJCQl2Zi0+Y29tcEJvZHlBZGRyID0gMDsKKwkJCQl2Zi0+Y29tcEhlYWRBZGRyID0gcGljLT5oZWFkZXJfYWRyOworI2lmZGVmIEgyNjVfMTBCX01NVV9EVworCQkJCXZmLT5kd0JvZHlBZGRyID0gMDsKKwkJCQl2Zi0+ZHdIZWFkQWRkciA9IDA7CisJCQkJaWYgKHBpYy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDIwKSB7CisJCQkJCXUzMiBtb2RlID0gcGljLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4ZjsKKwkJCQkJaWYgKG1vZGUgPT0gNSB8fCBtb2RlID09IDMpCisJCQkJCQl2Zi0+ZHdIZWFkQWRkciA9IHBpYy0+aGVhZGVyX2R3X2FkcjsKKwkJCQkJZWxzZSBpZiAoKG1vZGUgPT0gMSB8fCBtb2RlID09IDIgfHwgbW9kZSA9PSA0KQorCQkJCQkmJiAoZGVidWcgJiBIMjY1X0RFQlVHX09VVF9QVFMpID09IDApIHsKKwkJCQkJCXZmLT5jb21wSGVhZEFkZHIgPSBwaWMtPmhlYWRlcl9kd19hZHI7CisJCQkJCQlwcl9kZWJ1ZygiVXNlIGR3IG1tdSBmb3IgZGlzcGxheVxuIik7CisJCQkJCX0KKwkJCQl9CisjZW5kaWYKKwkJCX0gZWxzZSB7CisJCQkJdmYtPmNvbXBCb2R5QWRkciA9IHBpYy0+bWNfeV9hZHI7IC8qYm9keSBhZHIqLworCQkJCXZmLT5jb21wSGVhZEFkZHIgPSBwaWMtPm1jX3lfYWRyICsKKwkJCQkJCQlwaWMtPmxvc2xlc3NfY29tcF9ib2R5X3NpemU7CisJCQkJdmYtPm1lbV9oZWFkX2hhbmRsZSA9IE5VTEw7CisJCQl9CisJCQkvKmhlYWQgYWRyKi8KKwkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IDA7CisJCX0KKwkJaWYgKHBpYy0+ZG91YmxlX3dyaXRlX21vZGUgJiYKKwkJCSgocGljLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MjApID09IDApKSB7CisJCQl2Zi0+dHlwZSA9IFZJRFRZUEVfUFJPR1JFU1NJVkUgfCBWSURUWVBFX1ZJVV9GSUVMRDsKKwkJCXZmLT50eXBlIHw9IG52X29yZGVyOworCisJCQlpZiAoKChwaWMtPmRvdWJsZV93cml0ZV9tb2RlID09IDMpIHx8IChwaWMtPmRvdWJsZV93cml0ZV9tb2RlID09IDUpIHx8CisJCQkJKHBpYy0+ZG91YmxlX3dyaXRlX21vZGUgPT0gOSkpICYmCisJCQkJKCEoSVNfOEtfU0laRShwaWMtPndpZHRoLCBwaWMtPmhlaWdodCkpKSkgeworCQkJCXZmLT50eXBlIHw9IFZJRFRZUEVfQ09NUFJFU1M7CisJCQkJaWYgKGhldmMtPm1tdV9lbmFibGUpCisJCQkJCXZmLT50eXBlIHw9IFZJRFRZUEVfU0NBVFRFUjsKKwkJCX0KKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCQlpZiAoaGV2Yy0+bV9pbnNfZmxhZyAmJgorCQkJCShnZXRfZGJnX2ZsYWcoaGV2YykKKwkJCQkmIEgyNjVfQ0ZHX0NBTlZBU19JTl9ERUNPREUpID09IDApIHsKKwkJCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0gLTE7CisJCQkJCXZmLT5wbGFuZV9udW0gPSAyOworCQkJCQl2Zi0+Y2FudmFzMF9jb25maWdbMF0gPQorCQkJCQkJcGljLT5jYW52YXNfY29uZmlnWzBdOworCQkJCQl2Zi0+Y2FudmFzMF9jb25maWdbMV0gPQorCQkJCQkJcGljLT5jYW52YXNfY29uZmlnWzFdOworCisJCQkJCXZmLT5jYW52YXMxX2NvbmZpZ1swXSA9CisJCQkJCQlwaWMtPmNhbnZhc19jb25maWdbMF07CisJCQkJCXZmLT5jYW52YXMxX2NvbmZpZ1sxXSA9CisJCQkJCQlwaWMtPmNhbnZhc19jb25maWdbMV07CisKKwkJCX0gZWxzZQorI2VuZGlmCisJCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyCisJCQkJPSBzcGVjMmNhbnZhcyhwaWMpOworCQl9IGVsc2UgeworCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0gMDsKKwkJCXZmLT50eXBlID0gVklEVFlQRV9DT01QUkVTUyB8IFZJRFRZUEVfVklVX0ZJRUxEOworCQkJaWYgKGhldmMtPm1tdV9lbmFibGUpCisJCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9TQ0FUVEVSOworCQl9CisJCXZmLT5jb21wV2lkdGggPSBwaWMtPndpZHRoOworCQl2Zi0+Y29tcEhlaWdodCA9IHBpYy0+aGVpZ2h0OworCQl1cGRhdGVfdmZfbWVtaGFuZGxlKGhldmMsIHZmLCBwaWMpOworCQlzd2l0Y2ggKHBpYy0+Yml0X2RlcHRoX2x1bWEpIHsKKwkJY2FzZSA5OgorCQkJdmYtPmJpdGRlcHRoID0gQklUREVQVEhfWTk7CisJCQlicmVhazsKKwkJY2FzZSAxMDoKKwkJCXZmLT5iaXRkZXB0aCA9IEJJVERFUFRIX1kxMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdmYtPmJpdGRlcHRoID0gQklUREVQVEhfWTg7CisJCQlicmVhazsKKwkJfQorCQlzd2l0Y2ggKHBpYy0+Yml0X2RlcHRoX2Nocm9tYSkgeworCQljYXNlIDk6CisJCQl2Zi0+Yml0ZGVwdGggfD0gKEJJVERFUFRIX1U5IHwgQklUREVQVEhfVjkpOworCQkJYnJlYWs7CisJCWNhc2UgMTA6CisJCQl2Zi0+Yml0ZGVwdGggfD0gKEJJVERFUFRIX1UxMCB8IEJJVERFUFRIX1YxMCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXZmLT5iaXRkZXB0aCB8PSAoQklUREVQVEhfVTggfCBCSVRERVBUSF9WOCk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKHZmLT50eXBlICYgVklEVFlQRV9DT01QUkVTUykgPT0gMCkKKwkJCXZmLT5iaXRkZXB0aCA9CisJCQkJQklUREVQVEhfWTggfCBCSVRERVBUSF9VOCB8IEJJVERFUFRIX1Y4OworCQlpZiAocGljLT5tZW1fc2F2aW5nX21vZGUgPT0gMSkKKwkJCXZmLT5iaXRkZXB0aCB8PSBCSVRERVBUSF9TQVZJTkdfTU9ERTsKKyNlbHNlCisJCXZmLT50eXBlID0gVklEVFlQRV9QUk9HUkVTU0lWRSB8IFZJRFRZUEVfVklVX0ZJRUxEOworCQl2Zi0+dHlwZSB8PSBudl9vcmRlcjsKKwkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0gc3BlYzJjYW52YXMocGljKTsKKyNlbmRpZgorCQlzZXRfZnJhbWVfaW5mbyhoZXZjLCB2ZiwgcGljKTsKKwkJaWYgKGhldmMtPmRpc2NhcmRfZHZfZGF0YSkgeworCQkJdmYtPmRpc2NhcmRfZHZfZGF0YSA9IHRydWU7CisJCX0KKworCQkvKiBpZigodmYtPndpZHRoIT1waWMtPndpZHRoKXx8KHZmLT5oZWlnaHQhPXBpYy0+aGVpZ2h0KSkgKi8KKwkJLyogaGV2Y19wcmludChoZXZjLCAwLAorCQkJImFhYTogJWQvJWQsICVkLyVkXG4iLAorCQkgICB2Zi0+d2lkdGgsdmYtPmhlaWdodCwgcGljLT53aWR0aCwgcGljLT5oZWlnaHQpOyAqLworCQl2Zi0+d2lkdGggPSBwaWMtPndpZHRoOworCQl2Zi0+aGVpZ2h0ID0gcGljLT5oZWlnaHQ7CisKKwkJaWYgKGZvcmNlX3dfaCAhPSAwKSB7CisJCQl2Zi0+d2lkdGggPSAoZm9yY2Vfd19oID4+IDE2KSAmIDB4ZmZmZjsKKwkJCXZmLT5oZWlnaHQgPSBmb3JjZV93X2ggJiAweGZmZmY7CisJCX0KKwkJaWYgKGZvcmNlX2ZwcyAmIDB4MTAwKSB7CisJCQl1MzIgcmF0ZSA9IGZvcmNlX2ZwcyAmIDB4ZmY7CisKKwkJCWlmIChyYXRlKQorCQkJCXZmLT5kdXJhdGlvbiA9IDk2MDAwL3JhdGU7CisJCQllbHNlCisJCQkJdmYtPmR1cmF0aW9uID0gMDsKKwkJfQorCQlpZiAoZm9yY2VfZnBzICYgMHgyMDApIHsKKwkJCXZmLT5wdHMgPSAwOworCQkJdmYtPnB0c191czY0ID0gMDsKKwkJfQorCQlpZiAoIXZkZWMtPnZidWYudXNlX3B0c3NlcnYgJiYgdmRlY19zdHJlYW1fYmFzZWQodmRlYykpIHsKKwkJCXZmLT5wdHNfdXM2NCA9IHN0cmVhbV9vZmZzZXQ7CisJCQl2Zi0+cHRzID0gMDsKKwkJfQorCQkvKgorCQkgKgkhISEgdG8gZG8gLi4uCisJCSAqCW5lZWQgbW92ZSBiZWxvdyBjb2RlIHRvIGdldF9uZXdfcGljKCksCisJCSAqCWhldmMtPnh4eCBjYW4gb25seSBiZSB1c2VkIGJ5IGN1cnJlbnQgZGVjb2RlZCBwaWMKKwkJICovCisJCWlmIChwaWMtPmNvbmZvcm1hbmNlX3dpbmRvd19mbGFnICYmCisJCQkoZ2V0X2RiZ19mbGFnKGhldmMpICYKKwkJCQlIMjY1X0RFQlVHX0lHTk9SRV9DT05GT1JNQU5DRV9XSU5ET1cpID09IDApIHsKKwkJCXVuc2lnbmVkIGludCBTdWJXaWR0aEMsIFN1YkhlaWdodEM7CisKKwkJCXN3aXRjaCAocGljLT5jaHJvbWFfZm9ybWF0X2lkYykgeworCQkJY2FzZSAxOgorCQkJCVN1YldpZHRoQyA9IDI7CisJCQkJU3ViSGVpZ2h0QyA9IDI7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJU3ViV2lkdGhDID0gMjsKKwkJCQlTdWJIZWlnaHRDID0gMTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJU3ViV2lkdGhDID0gMTsKKwkJCQlTdWJIZWlnaHRDID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCSB2Zi0+d2lkdGggLT0gU3ViV2lkdGhDICoKKwkJCQkocGljLT5jb25mX3dpbl9sZWZ0X29mZnNldCArCisJCQkJcGljLT5jb25mX3dpbl9yaWdodF9vZmZzZXQpOworCQkJIHZmLT5oZWlnaHQgLT0gU3ViSGVpZ2h0QyAqCisJCQkJKHBpYy0+Y29uZl93aW5fdG9wX29mZnNldCArCisJCQkJcGljLT5jb25mX3dpbl9ib3R0b21fb2Zmc2V0KTsKKworCQkJIHZmLT5jb21wV2lkdGggLT0gU3ViV2lkdGhDICoKKwkJCQkocGljLT5jb25mX3dpbl9sZWZ0X29mZnNldCArCisJCQkJcGljLT5jb25mX3dpbl9yaWdodF9vZmZzZXQpOworCQkJIHZmLT5jb21wSGVpZ2h0IC09IFN1YkhlaWdodEMgKgorCQkJCShwaWMtPmNvbmZfd2luX3RvcF9vZmZzZXQgKworCQkJCXBpYy0+Y29uZl93aW5fYm90dG9tX29mZnNldCk7CisKKwkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikKKwkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCSJjb25mb3JtYW5jZV93aW5kb3cgJWQsICVkLCAlZCwgJWQsICVkID0+IGNyb3BwZWQgd2lkdGggJWQsIGhlaWdodCAlZCBjb21fdyAlZCBjb21faCAlZFxuIiwKKwkJCQkJcGljLT5jaHJvbWFfZm9ybWF0X2lkYywKKwkJCQkJcGljLT5jb25mX3dpbl9sZWZ0X29mZnNldCwKKwkJCQkJcGljLT5jb25mX3dpbl9yaWdodF9vZmZzZXQsCisJCQkJCXBpYy0+Y29uZl93aW5fdG9wX29mZnNldCwKKwkJCQkJcGljLT5jb25mX3dpbl9ib3R0b21fb2Zmc2V0LAorCQkJCQl2Zi0+d2lkdGgsIHZmLT5oZWlnaHQsIHZmLT5jb21wV2lkdGgsIHZmLT5jb21wSGVpZ2h0KTsKKwkJfQorCQlpZiAoaGV2Yy0+Y3VyX3BpYyAhPSBOVUxMKSB7CisJCQl2Zi0+c2FyX3dpZHRoID0gaGV2Yy0+Y3VyX3BpYy0+c2FyX3dpZHRoOworCQkJdmYtPnNhcl9oZWlnaHQgPSBoZXZjLT5jdXJfcGljLT5zYXJfaGVpZ2h0OworCQl9CisJCXZmLT53aWR0aCA9IHZmLT53aWR0aCAvCisJCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKHBpYy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweGYpOworCQl2Zi0+aGVpZ2h0ID0gdmYtPmhlaWdodCAvCisJCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKHBpYy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweGYpOworCisjaWZkZWYgSDI2NV8xMEJfTU1VX0RXCisJCWlmICgocGljLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MjApICYmCisJCQkoKHBpYy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweGYpID09IDIgfHwKKwkJCShwaWMtPmRvdWJsZV93cml0ZV9tb2RlICYgMHhmKSA9PSA0KSkgeworCQkJdmYtPmNvbXBXaWR0aCA9IHZmLT53aWR0aDsKKwkJCXZmLT5jb21wSGVpZ2h0ID0gdmYtPmhlaWdodDsKKwkJfQorI2VuZGlmCisJCWlmIChoZXZjLT5pc191c2VkX3Y0bCAmJiB2ZGVjLT5wcm9nX29ubHkpCisJCQlwaWMtPnBpY19zdHJ1Y3QgPSAwOworCisjaWZkZWYgSEVWQ19QSUNfU1RSVUNUX1NVUFBPUlQKKwkJaWYgKHBpYy0+cGljX3N0cnVjdCA9PSAzIHx8IHBpYy0+cGljX3N0cnVjdCA9PSA0KSB7CisJCQlzdHJ1Y3QgdmZyYW1lX3MgKnZmMjsKKworCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfUElDX1NUUlVDVCkKKwkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCSJwaWNfc3RydWN0ID0gJWQgaW5kZXggMHgleFxuIiwKKwkJCQkJcGljLT5waWNfc3RydWN0LAorCQkJCQlwaWMtPmluZGV4KTsKKworCQkJaWYgKGtmaWZvX2dldCgmaGV2Yy0+bmV3ZnJhbWVfcSwgJnZmMikgPT0gMCkgeworCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJImZhdGFsIGVycm9yLCBubyBhdmFpbGFibGUgYnVmZmVyIHNsb3QuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcGljLT52Zl9yZWYgPSAyOworCQkJdmYtPmR1cmF0aW9uID0gdmYtPmR1cmF0aW9uPj4xOworCQkJbWVtY3B5KHZmMiwgdmYsIHNpemVvZihzdHJ1Y3QgdmZyYW1lX3MpKTsKKworCQkJaWYgKHBpYy0+cGljX3N0cnVjdCA9PSAzKSB7CisJCQkJdmYtPnR5cGUgPSBWSURUWVBFX0lOVEVSTEFDRV9UT1AKKwkJCQl8IG52X29yZGVyOworCQkJCXZmMi0+dHlwZSA9IFZJRFRZUEVfSU5URVJMQUNFX0JPVFRPTQorCQkJCXwgbnZfb3JkZXI7CisJCQl9IGVsc2UgeworCQkJCXZmLT50eXBlID0gVklEVFlQRV9JTlRFUkxBQ0VfQk9UVE9NCisJCQkJfCBudl9vcmRlcjsKKwkJCQl2ZjItPnR5cGUgPSBWSURUWVBFX0lOVEVSTEFDRV9UT1AKKwkJCQl8IG52X29yZGVyOworCQkJfQorCQkJaWYgKHBpYy0+c2hvd19mcmFtZSkgeworCQkJCXB1dF92Zl90b19kaXNwbGF5X3EoaGV2YywgdmYpOworCQkJCWhldmMtPnZmX3ByZV9jb3VudCsrOworCQkJCXZkZWNfdmZyYW1lX3JlYWR5KGh3X3RvX3ZkZWMoaGV2YyksIHZmMik7CisJCQkJa2ZpZm9fcHV0KCZoZXZjLT5kaXNwbGF5X3EsCisJCQkJKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmMik7CisJCQkJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UucHRzX25hbWUsIHZmMi0+cHRzKTsKKwkJCX0gZWxzZSB7CisJCQkJdmgyNjVfdmZfcHV0KHZmLCB2ZGVjKTsKKwkJCQl2aDI2NV92Zl9wdXQodmYyLCB2ZGVjKTsKKwkJCQlhdG9taWNfYWRkKDIsICZoZXZjLT52Zl9nZXRfY291bnQpOworCQkJCWhldmMtPnZmX3ByZV9jb3VudCArPSAyOworCQkJCXJldHVybiAwOworCQkJfQorCQl9IGVsc2UgaWYgKHBpYy0+cGljX3N0cnVjdCA9PSA1CisJCQl8fCBwaWMtPnBpY19zdHJ1Y3QgPT0gNikgeworCQkJc3RydWN0IHZmcmFtZV9zICp2ZjIsICp2ZjM7CisKKwkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX1BJQ19TVFJVQ1QpCisJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkicGljX3N0cnVjdCA9ICVkIGluZGV4IDB4JXhcbiIsCisJCQkJCXBpYy0+cGljX3N0cnVjdCwKKwkJCQkJcGljLT5pbmRleCk7CisKKwkJCWlmIChrZmlmb19nZXQoJmhldmMtPm5ld2ZyYW1lX3EsICZ2ZjIpID09IDApIHsKKwkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJImZhdGFsIGVycm9yLCBubyBhdmFpbGFibGUgYnVmZmVyIHNsb3QuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKGtmaWZvX2dldCgmaGV2Yy0+bmV3ZnJhbWVfcSwgJnZmMykgPT0gMCkgeworCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkiZmF0YWwgZXJyb3IsIG5vIGF2YWlsYWJsZSBidWZmZXIgc2xvdC4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwaWMtPnZmX3JlZiA9IDM7CisJCQl2Zi0+ZHVyYXRpb24gPSB2Zi0+ZHVyYXRpb24vMzsKKwkJCW1lbWNweSh2ZjIsIHZmLCBzaXplb2Yoc3RydWN0IHZmcmFtZV9zKSk7CisJCQltZW1jcHkodmYzLCB2Ziwgc2l6ZW9mKHN0cnVjdCB2ZnJhbWVfcykpOworCisJCQlpZiAocGljLT5waWNfc3RydWN0ID09IDUpIHsKKwkJCQl2Zi0+dHlwZSA9IFZJRFRZUEVfSU5URVJMQUNFX1RPUAorCQkJCXwgbnZfb3JkZXI7CisJCQkJdmYyLT50eXBlID0gVklEVFlQRV9JTlRFUkxBQ0VfQk9UVE9NCisJCQkJfCBudl9vcmRlcjsKKwkJCQl2ZjMtPnR5cGUgPSBWSURUWVBFX0lOVEVSTEFDRV9UT1AKKwkJCQl8IG52X29yZGVyOworCQkJfSBlbHNlIHsKKwkJCQl2Zi0+dHlwZSA9IFZJRFRZUEVfSU5URVJMQUNFX0JPVFRPTQorCQkJCXwgbnZfb3JkZXI7CisJCQkJdmYyLT50eXBlID0gVklEVFlQRV9JTlRFUkxBQ0VfVE9QCisJCQkJfCBudl9vcmRlcjsKKwkJCQl2ZjMtPnR5cGUgPSBWSURUWVBFX0lOVEVSTEFDRV9CT1RUT00KKwkJCQl8IG52X29yZGVyOworCQkJfQorCQkJaWYgKHBpYy0+c2hvd19mcmFtZSkgeworCQkJCXB1dF92Zl90b19kaXNwbGF5X3EoaGV2YywgdmYpOworCQkJCWhldmMtPnZmX3ByZV9jb3VudCsrOworCQkJCXZkZWNfdmZyYW1lX3JlYWR5KGh3X3RvX3ZkZWMoaGV2YyksIHZmMik7CisJCQkJa2ZpZm9fcHV0KCZoZXZjLT5kaXNwbGF5X3EsCisJCQkJKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmMik7CisJCQkJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UucHRzX25hbWUsIHZmMi0+cHRzKTsKKwkJCQloZXZjLT52Zl9wcmVfY291bnQrKzsKKwkJCQl2ZGVjX3ZmcmFtZV9yZWFkeShod190b192ZGVjKGhldmMpLCB2ZjMpOworCQkJCWtmaWZvX3B1dCgmaGV2Yy0+ZGlzcGxheV9xLAorCQkJCShjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2ZjMpOworCQkJCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLnB0c19uYW1lLCB2ZjMtPnB0cyk7CisJCQl9IGVsc2UgeworCQkJCXZoMjY1X3ZmX3B1dCh2ZiwgdmRlYyk7CisJCQkJdmgyNjVfdmZfcHV0KHZmMiwgdmRlYyk7CisJCQkJdmgyNjVfdmZfcHV0KHZmMywgdmRlYyk7CisJCQkJYXRvbWljX2FkZCgzLCAmaGV2Yy0+dmZfZ2V0X2NvdW50KTsKKwkJCQloZXZjLT52Zl9wcmVfY291bnQgKz0gMzs7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0gZWxzZSBpZiAocGljLT5waWNfc3RydWN0ID09IDkKKwkJCXx8IHBpYy0+cGljX3N0cnVjdCA9PSAxMCkgeworCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfUElDX1NUUlVDVCkKKwkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCSJwaWNfc3RydWN0ID0gJWQgaW5kZXggMHgleFxuIiwKKwkJCQkJcGljLT5waWNfc3RydWN0LAorCQkJCQlwaWMtPmluZGV4KTsKKworCQkJcGljLT52Zl9yZWYgPSAxOworCQkJLyogcHJvY2VzcyBwcmV2aW91cyBwZW5kaW5nIHZmKi8KKwkJCXByb2Nlc3NfcGVuZGluZ192ZnJhbWUoaGV2YywKKwkJCXBpYywgKHBpYy0+cGljX3N0cnVjdCA9PSA5KSk7CisJCQl2Zi0+aGVpZ2h0IDw8PSAxOworCQkJaWYgKHBpYy0+c2hvd19mcmFtZSkgeworCQkJCWRlY29kZXJfZG9fZnJhbWVfY2hlY2sodmRlYywgdmYpOworCQkJCXZkZWNfdmZyYW1lX3JlYWR5KHZkZWMsIHZmKTsKKwkJCQkvKiBwcm9jZXNzIGN1cnJlbnQgdmYgKi8KKwkJCQlrZmlmb19wdXQoJmhldmMtPnBlbmRpbmdfcSwKKwkJCQkoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQkJCWlmIChwaWMtPnBpY19zdHJ1Y3QgPT0gOSkgeworCQkJCQl2Zi0+dHlwZSA9IFZJRFRZUEVfSU5URVJMQUNFX1RPUAorCQkJCQl8IG52X29yZGVyIHwgVklEVFlQRV9WSVVfRklFTEQ7CisJCQkJCXByb2Nlc3NfcGVuZGluZ192ZnJhbWUoaGV2YywKKwkJCQkJaGV2Yy0+cHJlX2JvdF9waWMsIDApOworCQkJCX0gZWxzZSB7CisJCQkJCXZmLT50eXBlID0gVklEVFlQRV9JTlRFUkxBQ0VfQk9UVE9NIHwKKwkJCQkJbnZfb3JkZXIgfCBWSURUWVBFX1ZJVV9GSUVMRDsKKwkJCQkJdmYtPmluZGV4ID0gKHBpYy0+aW5kZXggPDwgOCkgfCAweGZmOworCQkJCQlwcm9jZXNzX3BlbmRpbmdfdmZyYW1lKGhldmMsCisJCQkJCWhldmMtPnByZV90b3BfcGljLCAxKTsKKwkJCQl9CisKKwkJCQlpZiAoaGV2Yy0+dmZfcHJlX2NvdW50ID09IDApCisJCQkJCWhldmMtPnZmX3ByZV9jb3VudCsrOworCisJCQkJLyoqLworCQkJCWlmIChwaWMtPnBpY19zdHJ1Y3QgPT0gOSkKKwkJCQkJaGV2Yy0+cHJlX3RvcF9waWMgPSBwaWM7CisJCQkJZWxzZQorCQkJCQloZXZjLT5wcmVfYm90X3BpYyA9IHBpYzsKKwkJCX0gZWxzZSB7CisJCQkJdmgyNjVfdmZfcHV0KHZmLCB2ZGVjKTsKKwkJCQlhdG9taWNfYWRkKDEsICZoZXZjLT52Zl9nZXRfY291bnQpOworCQkJCWhldmMtPnZmX3ByZV9jb3VudCsrOworCQkJCXJldHVybiAwOworCQkJfQorCQl9IGVsc2UgaWYgKHBpYy0+cGljX3N0cnVjdCA9PSAxMQorCQkgICAgfHwgcGljLT5waWNfc3RydWN0ID09IDEyKSB7CisJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19QSUNfU1RSVUNUKQorCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkicGljX3N0cnVjdCA9ICVkIGluZGV4IDB4JXhcbiIsCisJCQkJcGljLT5waWNfc3RydWN0LAorCQkJCXBpYy0+aW5kZXgpOworCQkJcGljLT52Zl9yZWYgPSAxOworCQkJLyogcHJvY2VzcyBwcmV2aW91cyBwZW5kaW5nIHZmKi8KKwkJCXByb2Nlc3NfcGVuZGluZ192ZnJhbWUoaGV2YywgcGljLAorCQkJKHBpYy0+cGljX3N0cnVjdCA9PSAxMSkpOworCisJCQkvKiBwdXQgY3VycmVudCBpbnRvIHBlbmRpbmcgcSAqLworCQkJdmYtPmhlaWdodCA8PD0gMTsKKwkJCWlmIChwaWMtPnBpY19zdHJ1Y3QgPT0gMTEpCisJCQkJdmYtPnR5cGUgPSBWSURUWVBFX0lOVEVSTEFDRV9UT1AgfAorCQkJCW52X29yZGVyIHwgVklEVFlQRV9WSVVfRklFTEQ7CisJCQllbHNlIHsKKwkJCQl2Zi0+dHlwZSA9IFZJRFRZUEVfSU5URVJMQUNFX0JPVFRPTSB8CisJCQkJbnZfb3JkZXIgfCBWSURUWVBFX1ZJVV9GSUVMRDsKKwkJCQl2Zi0+aW5kZXggPSAocGljLT5pbmRleCA8PCA4KSB8IDB4ZmY7CisJCQl9CisJCQlpZiAocGljLT5zaG93X2ZyYW1lKSB7CisJCQkJZGVjb2Rlcl9kb19mcmFtZV9jaGVjayh2ZGVjLCB2Zik7CisJCQkJdmRlY192ZnJhbWVfcmVhZHkodmRlYywgdmYpOworCQkJCWtmaWZvX3B1dCgmaGV2Yy0+cGVuZGluZ19xLAorCQkJCShjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCQkJaWYgKGhldmMtPnZmX3ByZV9jb3VudCA9PSAwKQorCQkJCQloZXZjLT52Zl9wcmVfY291bnQrKzsKKworCQkJCS8qKi8KKwkJCQlpZiAocGljLT5waWNfc3RydWN0ID09IDExKQorCQkJCQloZXZjLT5wcmVfdG9wX3BpYyA9IHBpYzsKKwkJCQllbHNlCisJCQkJCWhldmMtPnByZV9ib3RfcGljID0gcGljOworCQkJfSBlbHNlIHsKKwkJCQl2aDI2NV92Zl9wdXQodmYsIHZkZWMpOworCQkJCWF0b21pY19hZGQoMSwgJmhldmMtPnZmX2dldF9jb3VudCk7CisJCQkJaGV2Yy0+dmZfcHJlX2NvdW50Kys7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQlwaWMtPnZmX3JlZiA9IDE7CisKKwkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX1BJQ19TVFJVQ1QpCisJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSJwaWNfc3RydWN0ID0gJWQgaW5kZXggMHgleFxuIiwKKwkJCQlwaWMtPnBpY19zdHJ1Y3QsCisJCQkJcGljLT5pbmRleCk7CisKKwkJCXN3aXRjaCAocGljLT5waWNfc3RydWN0KSB7CisJCQljYXNlIDc6CisJCQkJdmYtPmR1cmF0aW9uIDw8PSAxOworCQkJCWJyZWFrOworCQkJY2FzZSA4OgorCQkJCXZmLT5kdXJhdGlvbiA9IHZmLT5kdXJhdGlvbiAqIDM7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJdmYtPmhlaWdodCA8PD0gMTsKKwkJCQl2Zi0+dHlwZSA9IFZJRFRZUEVfSU5URVJMQUNFX1RPUCB8CisJCQkJbnZfb3JkZXIgfCBWSURUWVBFX1ZJVV9GSUVMRDsKKwkJCQlwcm9jZXNzX3BlbmRpbmdfdmZyYW1lKGhldmMsIHBpYywgMSk7CisJCQkJaGV2Yy0+cHJlX3RvcF9waWMgPSBwaWM7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJdmYtPmhlaWdodCA8PD0gMTsKKwkJCQl2Zi0+dHlwZSA9IFZJRFRZUEVfSU5URVJMQUNFX0JPVFRPTQorCQkJCXwgbnZfb3JkZXIKKwkJCQl8IFZJRFRZUEVfVklVX0ZJRUxEOworCQkJCXByb2Nlc3NfcGVuZGluZ192ZnJhbWUoaGV2YywgcGljLCAwKTsKKwkJCQloZXZjLT5wcmVfYm90X3BpYyA9IHBpYzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChwaWMtPnNob3dfZnJhbWUpIHsKKwkJCQlwdXRfdmZfdG9fZGlzcGxheV9xKGhldmMsIHZmKTsKKwkJCX0gZWxzZSB7CisJCQkJdmgyNjVfdmZfcHV0KHZmLCB2ZGVjKTsKKwkJCQlhdG9taWNfYWRkKDEsICZoZXZjLT52Zl9nZXRfY291bnQpOworCQkJCWhldmMtPnZmX3ByZV9jb3VudCsrOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisjZWxzZQorCQl2Zi0+dHlwZV9vcmlnaW5hbCA9IHZmLT50eXBlOworCQlwaWMtPnZmX3JlZiA9IDE7CisJCXB1dF92Zl90b19kaXNwbGF5X3EoaGV2YywgdmYpOworI2VuZGlmCisJCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLm5ld19xX25hbWUsIGtmaWZvX2xlbigmaGV2Yy0+bmV3ZnJhbWVfcSkpOworCQlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5kaXNwX3FfbmFtZSwga2ZpZm9fbGVuKCZoZXZjLT5kaXNwbGF5X3EpKTsKKwkJLypjb3VudCBpbmZvKi8KKwkJdmRlY19jb3VudF9pbmZvKGhldmMtPmd2cywgMCwgc3RyZWFtX29mZnNldCk7CisJCWlmIChwaWMtPnNsaWNlX3R5cGUgPT0gSV9TTElDRSkgeworCQkJaGV2Yy0+Z3ZzLT5pX2RlY29kZWRfZnJhbWVzKys7CisJCQl2Zi0+ZnJhbWVfdHlwZSB8PSBWNEwyX0JVRl9GTEFHX0tFWUZSQU1FOworCQl9IGVsc2UgaWYgKHBpYy0+c2xpY2VfdHlwZSA9PSBQX1NMSUNFKSB7CisJCQloZXZjLT5ndnMtPnBfZGVjb2RlZF9mcmFtZXMrKzsKKwkJCXZmLT5mcmFtZV90eXBlIHw9IFY0TDJfQlVGX0ZMQUdfUEZSQU1FOworCQl9IGVsc2UgaWYgKHBpYy0+c2xpY2VfdHlwZSA9PSBCX1NMSUNFKSB7CisJCQloZXZjLT5ndnMtPmJfZGVjb2RlZF9mcmFtZXMrKzsKKwkJCXZmLT5mcmFtZV90eXBlIHw9IFY0TDJfQlVGX0ZMQUdfQkZSQU1FOworCQl9CisJCWhldmNfdXBkYXRlX2d2cyhoZXZjLCBwaWMpOworCQltZW1jcHkoJnRtcDR4LCBoZXZjLT5ndnMsIHNpemVvZihzdHJ1Y3QgdmRlY19pbmZvKSk7CisJCXRtcDR4LmJpdF9kZXB0aF9sdW1hID0gcGljLT5iaXRfZGVwdGhfbHVtYTsKKwkJdG1wNHguYml0X2RlcHRoX2Nocm9tYSA9IHBpYy0+Yml0X2RlcHRoX2Nocm9tYTsKKwkJdG1wNHguZG91YmxlX3dyaXRlX21vZGUgPSBwaWMtPmRvdWJsZV93cml0ZV9tb2RlOworCQl2ZGVjX2ZpbGxfdmRlY19mcmFtZSh2ZGVjLCAmaGV2Yy0+dmZyYW1lX3FvcywgJnRtcDR4LCB2ZiwgcGljLT5od19kZWNvZGVfdGltZSk7CisJCXZkZWMtPnZkZWNfZnBzX2RldGVjKHZkZWMtPmlkKTsKKwkJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX0JVRk1HUiwKKwkJCSIlcyh0eXBlICVkIGluZGV4IDB4JXggcG9jICVkLyVkKSBwdHMoJWQsJWQpIGR1ciAlZFxuIiwKKwkJCV9fZnVuY19fLCB2Zi0+dHlwZSwgdmYtPmluZGV4LAorCQkJZ2V0X3BpY19wb2MoaGV2YywgdmYtPmluZGV4ICYgMHhmZiksCisJCQlnZXRfcGljX3BvYyhoZXZjLCAodmYtPmluZGV4ID4+IDgpICYgMHhmZiksCisJCQl2Zi0+cHRzLCB2Zi0+cHRzX3VzNjQsCisJCQl2Zi0+ZHVyYXRpb24pOworCisJCWlmIChwaWMtPnBpY19zdHJ1Y3QgPT0gMTAgfHwgcGljLT5waWNfc3RydWN0ID09IDEyKSB7CisJCQlpbmRleCA9ICh2Zi0+aW5kZXggPj4gOCkgJiAweGZmOworCQl9IGVsc2UgeworCQkJaW5kZXggPSB2Zi0+aW5kZXggJiAweGZmOworCQl9CisKKyNpZmRlZiBBVVhfREFUQV9DUkMKKwkJaWYgKGluZGV4IDw9IE1BWF9SRUZfUElDX05VTSkKKwkJCWRlY29kZXJfZG9fYXV4X2RhdGFfY2hlY2sodmRlYywgaGV2Yy0+bV9QSUNbaW5kZXhdLT5hdXhfZGF0YV9idWYsCisJCQkJaGV2Yy0+bV9QSUNbaW5kZXhdLT5hdXhfZGF0YV9zaXplKTsKKyNlbmRpZgorCisJCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19QUklOVF9TRUksCisJCQkiYXV4X2RhdGFfc2l6ZTolZCwgc2lnbmFsX3R5cGU6ICVkLCBzZWlfcHJlc2VudF9mbGFnOiAlZFxuIiwKKwkJCWhldmMtPm1fUElDW2luZGV4XS0+YXV4X2RhdGFfc2l6ZSwgaGV2Yy0+dmlkZW9fc2lnbmFsX3R5cGUsIGhldmMtPnNlaV9wcmVzZW50X2ZsYWcpOworCisJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX1BSSU5UX1NFSSkgeworCQkJaW50IGkgPSAwOworCQkJUFJfSU5JVCgxMjgpOworCQkJZm9yIChpID0gMDsgaSA8IGhldmMtPm1fUElDW2luZGV4XS0+YXV4X2RhdGFfc2l6ZTsgaSsrKSB7CisJCQkJUFJfRklMTCgiJTAyeCAiLCBoZXZjLT5tX1BJQ1tpbmRleF0tPmF1eF9kYXRhX2J1ZltpXSk7CisJCQkJaWYgKCgoaSArIDEpICYgMHhmKSA9PSAwKQorCQkJCQlQUl9JTkZPKGhldmMtPmluZGV4KTsKKwkJCX0KKwkJCVBSX0lORk8oaGV2Yy0+aW5kZXgpOworCQl9CisKKwkJaWYgKGhldmMtPmlzX3VzZWRfdjRsKQorCQkJdXBkYXRlX3ZmcmFtZV9zcmNfZm10KHZmLAorCQkJCWhldmMtPm1fUElDW2luZGV4XS0+YXV4X2RhdGFfYnVmLAorCQkJCWhldmMtPm1fUElDW2luZGV4XS0+YXV4X2RhdGFfc2l6ZSwKKwkJCQloZXZjLT5kdl9kdWFsbGF5ZXIsIGhldmMtPnByb3ZpZGVyX25hbWUsIE5VTEwpOworCisJCS8qaWYgKHBpYy0+dmZfcmVmID09IGhldmMtPnZmX3ByZV9jb3VudCkgeyovCisJCWlmIChoZXZjLT5rcGlfZmlyc3RfaV9kZWNvZGVkID09IDApIHsKKwkJCWhldmMtPmtwaV9maXJzdF9pX2RlY29kZWQgPSAxOworCQkJcHJfZGVidWcoIlt2ZGVjX2twaV1bJXNdIEZpcnN0IEkgZnJhbWUgZGVjb2RlZC5cbiIsCisJCQkJX19mdW5jX18pOworCQl9CisKKwkJaWYgKHdpdGhvdXRfZGlzcGxheV9tb2RlID09IDApIHsKKwkJCWlmIChoZXZjLT5pc191c2VkX3Y0bCkgeworCQkJCWlmICh2NGwyX2N0eC0+aXNfc3RyZWFtX29mZikgeworCQkJCQl2aDI2NV92Zl9wdXQodmgyNjVfdmZfZ2V0KHZkZWMpLCB2ZGVjKTsKKwkJCQl9IGVsc2UgeworCQkJCQlmYi0+dGFzay0+c3VibWl0KGZiLT50YXNrLCBUQVNLX1RZUEVfREVDKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXZmX25vdGlmeV9yZWNlaXZlcihoZXZjLT5wcm92aWRlcl9uYW1lLAorCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfVkZSQU1FX1JFQURZLCBOVUxMKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCQl2aDI2NV92Zl9wdXQodmgyNjVfdmZfZ2V0KHZkZWMpLCB2ZGVjKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwb3N0X3BpY3R1cmVfZWFybHkoc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGluZGV4KQoreworCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPSAoc3RydWN0IGhldmNfc3RhdGVfcyAqKXZkZWMtPnByaXZhdGU7CisJc3RydWN0IFBJQ19zICpwaWMgPSBoZXZjLT5tX1BJQ1tpbmRleF07CisKKwlpZiAoIWhldmMtPmVuYWJsZV9mZW5jZSkKKwkJcmV0dXJuIDA7CisKKwkvKiBjcmVhdGUgZmVuY2UgZm9yIGVhY2ggYnVmZmVycy4gKi8KKwlpZiAodmRlY190aW1lbGluZV9jcmVhdGVfZmVuY2UodmRlYy0+c3luYykpCisJCXJldHVybiAtMTsKKworCXBpYy0+ZmVuY2UJCT0gdmRlYy0+c3luYy0+ZmVuY2U7CisJcGljLT5zdHJlYW1fb2Zmc2V0CT0gUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCk7CisKKwlpZiAoaGV2Yy0+Y2h1bmspIHsKKwkJcGljLT5wdHMJPSBoZXZjLT5jaHVuay0+cHRzOworCQlwaWMtPnB0czY0CT0gaGV2Yy0+Y2h1bmstPnB0czY0OworCQlwaWMtPnRpbWVzdGFtcAk9IGhldmMtPmNodW5rLT50aW1lc3RhbXA7CisJfQorCXBpYy0+c2hvd19mcmFtZSA9IHRydWU7CisJcG9zdF92aWRlb19mcmFtZSh2ZGVjLCBwaWMpOworCisJZGlzcGxheV9mcmFtZV9jb3VudFtoZXZjLT5pbmRleF0rKzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByZXBhcmVfZGlzcGxheV9idWYoc3RydWN0IHZkZWNfcyAqdmRlYywgc3RydWN0IFBJQ19zICpmcmFtZSkKK3sKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjID0KKwkJKHN0cnVjdCBoZXZjX3N0YXRlX3MgKil2ZGVjLT5wcml2YXRlOworCisJaWYgKGhldmMtPmVuYWJsZV9mZW5jZSkgeworCQlpbnQgaSwgaiwgdXNlZF9zaXplLCByZXQ7CisJCWludCBzaWduZWRfY291bnQgPSAwOworCQlzdHJ1Y3QgdmZyYW1lX3MgKnNpZ25lZF9mZW5jZVtWRl9QT09MX1NJWkVdOworCisJCXBvc3RfcHJlcGFyZV9wcm9jZXNzKHZkZWMsIGZyYW1lKTsKKworCQlpZiAoIWZyYW1lLT5zaG93X2ZyYW1lKQorCQkJcHJfaW5mbygiZG8gbm90IGRpc3BsYXkuXG4iKTsKKworCQloZXZjLT5tX1BJQ1tmcmFtZS0+aW5kZXhdLT52Zl9yZWYgPSAxOworCisJCS8qIG5vdGlmeSBzaWduYWwgdG8gd2FrZSB1cCB3cSBvZiBmZW5jZS4gKi8KKwkJdmRlY190aW1lbGluZV9pbmNyZWFzZSh2ZGVjLT5zeW5jLCAxKTsKKwkJbXV0ZXhfbG9jaygmaGV2Yy0+ZmVuY2VfbXV0ZXgpOworCQl1c2VkX3NpemUgPSBoZXZjLT5mZW5jZV92Zl9zLnVzZWRfc2l6ZTsKKwkJaWYgKHVzZWRfc2l6ZSkgeworCQkJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBWRl9QT09MX1NJWkUgJiYgaiA8IHVzZWRfc2l6ZTsgaSsrKSB7CisJCQkJaWYgKGhldmMtPmZlbmNlX3ZmX3MuZmVuY2VfdmZbaV0gIT0gTlVMTCkgeworCQkJCQlyZXQgPSBkbWFfZmVuY2VfZ2V0X3N0YXR1cyhoZXZjLT5mZW5jZV92Zl9zLmZlbmNlX3ZmW2ldLT5mZW5jZSk7CisJCQkJCWlmIChyZXQgPT0gMSkgeworCQkJCQkJc2lnbmVkX2ZlbmNlW3NpZ25lZF9jb3VudF0gPSBoZXZjLT5mZW5jZV92Zl9zLmZlbmNlX3ZmW2ldOworCQkJCQkJaGV2Yy0+ZmVuY2VfdmZfcy5mZW5jZV92ZltpXSA9IE5VTEw7CisJCQkJCQloZXZjLT5mZW5jZV92Zl9zLnVzZWRfc2l6ZS0tOworCQkJCQkJc2lnbmVkX2NvdW50Kys7CisJCQkJCX0KKwkJCQkJaisrOworCQkJCX0KKwkJCX0KKwkJfQorCQltdXRleF91bmxvY2soJmhldmMtPmZlbmNlX211dGV4KTsKKwkJaWYgKHNpZ25lZF9jb3VudCAhPSAwKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2lnbmVkX2NvdW50OyBpKyspCisJCQkJdmgyNjVfdmZfcHV0KHNpZ25lZF9mZW5jZVtpXSwgdmRlYyk7CisJCX0KKworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocG9zdF9wcmVwYXJlX3Byb2Nlc3ModmRlYywgZnJhbWUpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAocG9zdF92aWRlb19mcmFtZSh2ZGVjLCBmcmFtZSkpCisJCXJldHVybiAtMTsKKworCWRpc3BsYXlfZnJhbWVfY291bnRbaGV2Yy0+aW5kZXhdKys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbm90aWZ5X3Y0bF9lb3Moc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpodyA9IChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICopdmRlYy0+cHJpdmF0ZTsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IChzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KTsKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmID0gJmh3LT52ZnJhbWVfZHVtbXk7CisJc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKmZiID0gTlVMTDsKKwlpbnQgaW5kZXggPSBJTlZBTElEX0lEWDsKKwl1bG9uZyBleHBpcmVzOworCisJaWYgKGh3LT5lb3MpIHsKKwkJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQkJZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDIwMDApOworCQkJd2hpbGUgKElOVkFMSURfSURYID09IChpbmRleCA9IGdldF9mcmVlX2J1Zl9pZHgoaHcpKSkgeworCQkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGV4cGlyZXMpIHx8CisJCQkJCXY0bDJfbTJtX251bV9kc3RfYnVmc19yZWFkeShjdHgtPm0ybV9jdHgpKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKGluZGV4ID09IElOVkFMSURfSURYKSB7CisJCQkJY3R4LT5mYl9vcHMucXVlcnkoJmN0eC0+ZmJfb3BzLCAmaHctPmZiX3Rva2VuKTsKKwkJCQlpZiAoY3R4LT5mYl9vcHMuYWxsb2MoJmN0eC0+ZmJfb3BzLCBody0+ZmJfdG9rZW4sICZmYiwgQU1MX0ZCX1JFUV9ERUMpIDwgMCkgeworCQkJCQlwcl9lcnIoIlslZF0gRU9TIGdldCBmcmVlIGJ1ZmYgZmFpbC5cbiIsIGN0eC0+aWQpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJfQorCQl9CisKKwkJdmYtPnR5cGUJCXw9IFZJRFRZUEVfVjRMX0VPUzsKKwkJdmYtPnRpbWVzdGFtcAkJPSBVTE9OR19NQVg7CisJCXZmLT5mbGFnCQk9IFZGUkFNRV9GTEFHX0VNUFRZX0ZSQU1FX1Y0TDsKKwkJdmYtPnY0bF9tZW1faGFuZGxlCT0gKGluZGV4ID09IElOVkFMSURfSURYKSA/ICh1bG9uZylmYiA6CisJCQkJCWh3LT5tX0JVRltpbmRleF0udjRsX3JlZl9idWZfYWRkcjsKKwkJZmIgPSAoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKil2Zi0+djRsX21lbV9oYW5kbGU7CisKKwkJdmRlY192ZnJhbWVfcmVhZHkodmRlYywgdmYpOworCQlrZmlmb19wdXQoJmh3LT5kaXNwbGF5X3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisKKwkJaWYgKGh3LT5pc191c2VkX3Y0bCkKKwkJCWZiLT50YXNrLT5zdWJtaXQoZmItPnRhc2ssIFRBU0tfVFlQRV9ERUMpOworCQllbHNlCisJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIodmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfVkZSQU1FX1JFQURZLCBOVUxMKTsKKworCQlwcl9pbmZvKCJbJWRdIEgyNjUgRU9TIG5vdGlmeS5cbiIsIChody0+aXNfdXNlZF92NGwpP2N0eC0+aWQ6dmRlYy0+aWQpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX25hbF9zZWkoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwlpbnQgcGF5bG9hZF90eXBlLCBpbnQgcGF5bG9hZF9zaXplKQoreworCXVuc2lnbmVkIHNob3J0IGRhdGE7CisKKwlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19QUklOVF9TRUkpCisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJcdHNlaSBtZXNzYWdlOiBwYXlsb2FkX3R5cGUgPSAweCUwMngsIHBheWxvYWRfc2l6ZSA9IDB4JTAyeFxuIiwKKwkJcGF5bG9hZF90eXBlLCBwYXlsb2FkX3NpemUpOworCisJaWYgKHBheWxvYWRfdHlwZSA9PSAxMzcpIHsKKwkJaW50IGksIGo7CisJCS8qIE1BU1RFUklOR19ESVNQTEFZX0NPTE9VUl9WT0xVTUUgKi8KKwkJaWYgKHBheWxvYWRfc2l6ZSA+PSAyNCkgeworCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfUFJJTlRfU0VJKQorCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJIlx0c2VpIE1BU1RFUklOR19ESVNQTEFZX0NPTE9VUl9WT0xVTUUgYXZhaWxhYmxlXG4iKTsKKwkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCQlmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisJCQkJCWRhdGEgPQorCQkJCQkoUkVBRF9IUkVHKEhFVkNfU0hJRlRFRF9EQVRBKSA+PiAxNik7CisJCQkJCWhldmMtPnByaW1hcmllc1tpXVtqXSA9IGRhdGE7CisJCQkJCVdSSVRFX0hSRUcoSEVWQ19TSElGVF9DT01NQU5ELAorCQkJCQkoMTw8Nyl8MTYpOworCQkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYKKwkJCQkJCUgyNjVfREVCVUdfUFJJTlRfU0VJKQorCQkJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkJCSJcdFx0cHJpbWFyaWVzWyUxZF1bJTFkXSA9ICUwNHhcbiIsCisJCQkJCQlpLCBqLCBoZXZjLT5wcmltYXJpZXNbaV1bal0pOworCQkJCX0KKwkJCX0KKwkJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCQlkYXRhID0gKFJFQURfSFJFRyhIRVZDX1NISUZURURfREFUQSkgPj4gMTYpOworCQkJCWhldmMtPndoaXRlX3BvaW50W2ldID0gZGF0YTsKKwkJCQlXUklURV9IUkVHKEhFVkNfU0hJRlRfQ09NTUFORCwgKDE8PDcpfDE2KTsKKwkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19QUklOVF9TRUkpCisJCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJCSJcdFx0d2hpdGVfcG9pbnRbJTFkXSA9ICUwNHhcbiIsCisJCQkJCWksIGhldmMtPndoaXRlX3BvaW50W2ldKTsKKwkJCX0KKwkJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCQlkYXRhID0gKFJFQURfSFJFRyhIRVZDX1NISUZURURfREFUQSkgPj4gMTYpOworCQkJCWhldmMtPmx1bWluYW5jZVtpXSA9IGRhdGEgPDwgMTY7CisJCQkJV1JJVEVfSFJFRyhIRVZDX1NISUZUX0NPTU1BTkQsCisJCQkJKDE8PDcpfDE2KTsKKwkJCQlkYXRhID0KKwkJCQkoUkVBRF9IUkVHKEhFVkNfU0hJRlRFRF9EQVRBKSA+PiAxNik7CisJCQkJaGV2Yy0+bHVtaW5hbmNlW2ldIHw9IGRhdGE7CisJCQkJV1JJVEVfSFJFRyhIRVZDX1NISUZUX0NPTU1BTkQsCisJCQkJKDE8PDcpfDE2KTsKKwkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYKKwkJCQkJSDI2NV9ERUJVR19QUklOVF9TRUkpCisJCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJCSJcdFx0bHVtaW5hbmNlWyUxZF0gPSAlMDh4XG4iLAorCQkJCQlpLCBoZXZjLT5sdW1pbmFuY2VbaV0pOworCQkJfQorCQkJaGV2Yy0+c2VpX3ByZXNlbnRfZmxhZyB8PSBTRUlfTUFTVEVSX0RJU1BMQVlfQ09MT1JfTUFTSzsKKwkJfQorCQlwYXlsb2FkX3NpemUgLT0gMjQ7CisJCXdoaWxlIChwYXlsb2FkX3NpemUgPiAwKSB7CisJCQlkYXRhID0gKFJFQURfSFJFRyhIRVZDX1NISUZURURfREFUQSkgPj4gMjQpOworCQkJcGF5bG9hZF9zaXplLS07CisJCQlXUklURV9IUkVHKEhFVkNfU0hJRlRfQ09NTUFORCwgKDE8PDcpfDgpOworCQkJaGV2Y19wcmludChoZXZjLCAwLCAiXHRcdHNraXAgYnl0ZSAlMDJ4XG4iLCBkYXRhKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBoZXZjX3JlY292ZXIoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwlpbnQgcmV0ID0gLTE7CisJdTMyIHJlbTsKKwl1NjQgc2hpZnRfYnl0ZV9jb3VudDY0OworCXVuc2lnbmVkIGludCBoZXZjX3NoaWZ0X2J5dGVfY291bnQ7CisJdW5zaWduZWQgaW50IGhldmNfc3RyZWFtX3N0YXJ0X2FkZHI7CisJdW5zaWduZWQgaW50IGhldmNfc3RyZWFtX2VuZF9hZGRyOworCXVuc2lnbmVkIGludCBoZXZjX3N0cmVhbV9yZF9wdHI7CisJdW5zaWduZWQgaW50IGhldmNfc3RyZWFtX3dyX3B0cjsKKwl1bnNpZ25lZCBpbnQgaGV2Y19zdHJlYW1fY29udHJvbDsKKwl1bnNpZ25lZCBpbnQgaGV2Y19zdHJlYW1fZmlmb19jdGw7CisJdW5zaWduZWQgaW50IGhldmNfc3RyZWFtX2J1Zl9zaXplOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGhldmMpOworCisJbXV0ZXhfbG9jaygmdmgyNjVfbXV0ZXgpOworI2lmIDAKKwlmb3IgKGkgPSAwOyBpIDwgKGhldmMtPmRlYnVnX3B0cl9zaXplIC8gMik7IGkgKz0gNCkgeworCQlpbnQgaWk7CisKKwkJZm9yIChpaSA9IDA7IGlpIDwgNDsgaWkrKykKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSIlMDR4ICIsIGhldmMtPmRlYnVnX3B0cltpICsgMyAtIGlpXSk7CisJCWlmICgoKGkgKyBpaSkgJiAweGYpID09IDApCisJCQloZXZjX3ByaW50KGhldmMsIDAsICJcbiIpOworCX0KKyNlbmRpZgorI2RlZmluZSBFU19WSURfTUFOX1JEX1BUUiAgICAgICAgICAgICgxPDwwKQorCWlmICghaGV2Yy0+aW5pdF9mbGFnKSB7CisJCWhldmNfcHJpbnQoaGV2YywgMCwgImgyNjUgaGFzIHN0b3BwZWQsIHJlY292ZXIgcmV0dXJuIVxuIik7CisJCW11dGV4X3VubG9jaygmdmgyNjVfbXV0ZXgpOworCQlyZXR1cm4gcmV0OworCX0KKwlhbWhldmNfc3RvcCgpOworCW1zbGVlcCgyMCk7CisJcmV0ID0gMDsKKwkvKiByZXNldCAqLworCWlmICh2ZGVjX3N0cmVhbV9iYXNlZCh2ZGVjKSkgeworCQlTVEJVRl9XUklURSgmdmRlYy0+dmJ1Ziwgc2V0X3JwLAorCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1JEX1BUUikpOworCisJCWlmICghdmRlYy0+dmJ1Zi5ub19wYXJzZXIpCisJCQlTRVRfUEFSU0VSX1JFR19NQVNLKFBBUlNFUl9FU19DT05UUk9MLAorCQkJCUVTX1ZJRF9NQU5fUkRfUFRSKTsKKwl9CisKKwloZXZjX3N0cmVhbV9zdGFydF9hZGRyID0gUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1NUQVJUX0FERFIpOworCWhldmNfc3RyZWFtX2VuZF9hZGRyID0gUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0VORF9BRERSKTsKKwloZXZjX3N0cmVhbV9yZF9wdHIgPSBSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSKTsKKwloZXZjX3N0cmVhbV93cl9wdHIgPSBSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fV1JfUFRSKTsKKwloZXZjX3N0cmVhbV9jb250cm9sID0gUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0NPTlRST0wpOworCWhldmNfc3RyZWFtX2ZpZm9fY3RsID0gUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0ZJRk9fQ1RMKTsKKwloZXZjX3N0cmVhbV9idWZfc2l6ZSA9IGhldmNfc3RyZWFtX2VuZF9hZGRyIC0gaGV2Y19zdHJlYW1fc3RhcnRfYWRkcjsKKworCS8qIEhFVkMgc3RyZWFtaW5nIGJ1ZmZlciB3aWxsIHJlc2V0IGFuZCByZXN0YXJ0CisJICogICBmcm9tIGN1cnJlbnQgaGV2Y19zdHJlYW1fcmRfcHRyIHBvc2l0aW9uCisJICovCisJLyogY2FsY3VsYXRlIEhFVkNfU0hJRlRfQllURV9DT1VOVCB2YWx1ZSB3aXRoIHRoZSBuZXcgcG9zaXRpb24uICovCisJaGV2Y19zaGlmdF9ieXRlX2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCk7CisJaWYgKChoZXZjLT5zaGlmdF9ieXRlX2NvdW50X2xvICYgKDEgPDwgMzEpKQorCQkmJiAoKGhldmNfc2hpZnRfYnl0ZV9jb3VudCAmICgxIDw8IDMxKSkgPT0gMCkpCisJCWhldmMtPnNoaWZ0X2J5dGVfY291bnRfaGkrKzsKKworCWhldmMtPnNoaWZ0X2J5dGVfY291bnRfbG8gPSBoZXZjX3NoaWZ0X2J5dGVfY291bnQ7CisJc2hpZnRfYnl0ZV9jb3VudDY0ID0gKCh1NjQpKGhldmMtPnNoaWZ0X2J5dGVfY291bnRfaGkpIDw8IDMyKSB8CisJCQkJaGV2Yy0+c2hpZnRfYnl0ZV9jb3VudF9sbzsKKwlkaXZfdTY0X3JlbShzaGlmdF9ieXRlX2NvdW50NjQsIGhldmNfc3RyZWFtX2J1Zl9zaXplLCAmcmVtKTsKKwlzaGlmdF9ieXRlX2NvdW50NjQgLT0gcmVtOworCXNoaWZ0X2J5dGVfY291bnQ2NCArPSBoZXZjX3N0cmVhbV9yZF9wdHIgLSBoZXZjX3N0cmVhbV9zdGFydF9hZGRyOworCisJaWYgKHJlbSA+IChoZXZjX3N0cmVhbV9yZF9wdHIgLSBoZXZjX3N0cmVhbV9zdGFydF9hZGRyKSkKKwkJc2hpZnRfYnl0ZV9jb3VudDY0ICs9IGhldmNfc3RyZWFtX2J1Zl9zaXplOworCisJaGV2Yy0+c2hpZnRfYnl0ZV9jb3VudF9sbyA9ICh1MzIpc2hpZnRfYnl0ZV9jb3VudDY0OworCWhldmMtPnNoaWZ0X2J5dGVfY291bnRfaGkgPSAodTMyKShzaGlmdF9ieXRlX2NvdW50NjQgPj4gMzIpOworCisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQzLAorCQkJICAgLyogKDE8PDIpfCAqLworCQkJICAgKDEgPDwgMykgfCAoMSA8PCA0KSB8ICgxIDw8IDgpIHwKKwkJCSAgICgxIDw8IDExKSB8ICgxIDw8IDEyKSB8ICgxIDw8IDE0KQorCQkJICAgfCAoMSA8PCAxNSkgfCAoMSA8PCAxNykgfCAoMSA8PCAxOCkgfCAoMSA8PCAxOSkpOworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMywgMCk7CisKKwlXUklURV9WUkVHKEhFVkNfU1RSRUFNX1NUQVJUX0FERFIsIGhldmNfc3RyZWFtX3N0YXJ0X2FkZHIpOworCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fRU5EX0FERFIsIGhldmNfc3RyZWFtX2VuZF9hZGRyKTsKKwlXUklURV9WUkVHKEhFVkNfU1RSRUFNX1JEX1BUUiwgaGV2Y19zdHJlYW1fcmRfcHRyKTsKKwlXUklURV9WUkVHKEhFVkNfU1RSRUFNX1dSX1BUUiwgaGV2Y19zdHJlYW1fd3JfcHRyKTsKKwlXUklURV9WUkVHKEhFVkNfU1RSRUFNX0NPTlRST0wsIGhldmNfc3RyZWFtX2NvbnRyb2wpOworCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5ULCBoZXZjLT5zaGlmdF9ieXRlX2NvdW50X2xvKTsKKwlXUklURV9WUkVHKEhFVkNfU1RSRUFNX0ZJRk9fQ1RMLCBoZXZjX3N0cmVhbV9maWZvX2N0bCk7CisKKwloZXZjX2NvbmZpZ193b3JrX3NwYWNlX2h3KGhldmMpOworCWRlY29kZXJfaHdfcmVzZXQoKTsKKworCWhldmMtPmhhdmVfdnBzID0gMDsKKwloZXZjLT5oYXZlX3NwcyA9IDA7CisJaGV2Yy0+aGF2ZV9wcHMgPSAwOworCisJaGV2Yy0+aGF2ZV92YWxpZF9zdGFydF9zbGljZSA9IDA7CisKKwlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGhldmMpICYgMHgxMCkKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDEsCisJCQkweDEgPDwgMzEgIC8qL0VuYWJsZSBOVjIxIHJlZmVyZW5jZSByZWFkIG1vZGUgZm9yIE1DKi8KKwkJCSk7CisKKwlXUklURV9WUkVHKEhFVkNfV0FJVF9GTEFHLCAxKTsKKwkvKiBjbGVhciBtYWlsYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTUJPWDBfQ0xSX1JFRywgMSk7CisJLyogZW5hYmxlIG1haWxib3ggaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9NQk9YMF9NQVNLLCAxKTsKKwkvKiBkaXNhYmxlIFBTQ0FMRSBmb3IgaGFyZHdhcmUgc2hhcmluZyAqLworCVdSSVRFX1ZSRUcoSEVWQ19QU0NBTEVfQ1RSTCwgMCk7CisKKwlDTEVBUl9QQVJTRVJfUkVHX01BU0soUEFSU0VSX0VTX0NPTlRST0wsIEVTX1ZJRF9NQU5fUkRfUFRSKTsKKworCVdSSVRFX1ZSRUcoREVCVUdfUkVHMSwgMHgwKTsKKworCWlmICgoZXJyb3JfaGFuZGxlX3BvbGljeSAmIDEpID09IDApIHsKKwkJaWYgKChlcnJvcl9oYW5kbGVfcG9saWN5ICYgNCkgPT0gMCkgeworCQkJLyogdWNvZGUgYXV0byBtb2RlLCBhbmQgZG8gbm90IGNoZWNrIHZwcy9zcHMvcHBzL2lkciAqLworCQkJV1JJVEVfVlJFRyhOQUxfU0VBUkNIX0NUTCwKKwkJCQkJICAgMHhjKTsKKwkJfSBlbHNlIHsKKwkJCVdSSVRFX1ZSRUcoTkFMX1NFQVJDSF9DVEwsIDB4MSk7LyogbWFudWFsIHBhcnNlciBOQUwgKi8KKwkJfQorCX0gZWxzZSB7CisJCVdSSVRFX1ZSRUcoTkFMX1NFQVJDSF9DVEwsIDB4MSk7LyogbWFudWFsIHBhcnNlciBOQUwgKi8KKwl9CisKKwlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19OT19FT1NfU0VBUkNIX0RPTkUpCisJCVdSSVRFX1ZSRUcoTkFMX1NFQVJDSF9DVEwsIFJFQURfVlJFRyhOQUxfU0VBUkNIX0NUTCkgfCAweDEwMDAwKTsKKwlXUklURV9WUkVHKE5BTF9TRUFSQ0hfQ1RMLAorCQlSRUFEX1ZSRUcoTkFMX1NFQVJDSF9DVEwpCisJCXwgKChwYXJzZXJfc2VpX2VuYWJsZSAmIDB4NykgPDwgMTcpKTsKKy8qI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OKi8KKwlXUklURV9WUkVHKE5BTF9TRUFSQ0hfQ1RMLAorCQlSRUFEX1ZSRUcoTkFMX1NFQVJDSF9DVEwpIHwKKwkJKChwYXJzZXJfZG9sYnlfdmlzaW9uX2VuYWJsZSAmIDB4MSkgPDwgMjApKTsKKy8qI2VuZGlmKi8KKwljb25maWdfZGVjb2RlX21vZGUoaGV2Yyk7CisJV1JJVEVfVlJFRyhERUNPREVfU1RPUF9QT1MsIHVkZWJ1Z19mbGFnKTsKKworCS8qIGlmIChhbWhldmNfbG9hZG1jKHZoMjY1X21jKSA8IDApIHsgKi8KKwkvKiBhbWhldmNfZGlzYWJsZSgpOyAqLworCS8qIHJldHVybiAtRUJVU1k7ICovCisJLyogfSAqLworI2lmIDAKKwlmb3IgKGkgPSAwOyBpIDwgKGhldmMtPmRlYnVnX3B0cl9zaXplIC8gMik7IGkgKz0gNCkgeworCQlpbnQgaWk7CisKKwkJZm9yIChpaSA9IDA7IGlpIDwgNDsgaWkrKykgeworCQkJLyogaGV2Yy0+ZGVidWdfcHRyW2krMy1paV09dHR0Kys7ICovCisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiJTA0eCAiLCBoZXZjLT5kZWJ1Z19wdHJbaSArIDMgLSBpaV0pOworCQl9CisJCWlmICgoKGkgKyBpaSkgJiAweGYpID09IDApCisJCQloZXZjX3ByaW50KGhldmMsIDAsICJcbiIpOworCX0KKyNlbmRpZgorCWluaXRfcGljX2xpc3RfaHcoaGV2Yyk7CisKKwloZXZjX3ByaW50KGhldmMsIDAsICIlcyBIRVZDX1NISUZUX0JZVEVfQ09VTlQ9MHgleFxuIiwgX19mdW5jX18sCisJCSAgIFJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpKTsKKworI2lmZGVmIFNXQVBfSEVWQ19VQ09ERQorCWlmICghdGVlX2VuYWJsZWQoKSAmJiBoZXZjLT5pc19zd2FwICYmCisJCWdldF9jcHVfbWFqb3JfaWQoKSA8PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hNKSB7CisJCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fU1dBUF9CVUZGRVIyLCBoZXZjLT5tY19kbWFfaGFuZGxlKTsKKwkJLypwcl9pbmZvKCJ3cml0ZSBzd2FwIGJ1ZmZlciAleFxuIiwgKHUzMikoaGV2Yy0+bWNfZG1hX2hhbmRsZSkpOyovCisJfQorI2VuZGlmCisJYW1oZXZjX3N0YXJ0KCk7CisKKwkvKiBza2lwLCBzZWFyY2ggbmV4dCBzdGFydCBjb2RlICovCisJV1JJVEVfVlJFRyhIRVZDX1dBSVRfRkxBRywgUkVBRF9WUkVHKEhFVkNfV0FJVF9GTEFHKSAmICh+MHgyKSk7CisJaGV2Yy0+c2tpcF9mbGFnID0gMTsKKyNpZmRlZiBFUlJPUl9IQU5ETEVfREVCVUcKKwlpZiAoZGJnX25hbF9za2lwX2NvdW50ICYgMHgyMDAwMCkgeworCQlkYmdfbmFsX3NraXBfY291bnQgJj0gfjB4MjAwMDA7CisJCW11dGV4X3VubG9jaygmdmgyNjVfbXV0ZXgpOworCQlyZXR1cm4gcmV0OworCX0KKyNlbmRpZgorCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgSEVWQ19BQ1RJT05fRE9ORSk7CisJLyogSW50ZXJydXB0IEFtcmlzYyB0byBleGN1dGUgKi8KKwlXUklURV9WUkVHKEhFVkNfTUNQVV9JTlRSX1JFUSwgQU1SSVNDX01BSU5fUkVRKTsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJaWYgKCFoZXZjLT5tX2luc19mbGFnKQorI2VuZGlmCisJCWhldmMtPmZpcnN0X3BpY19hZnRlcl9yZWNvdmVyID0gMTsKKwltdXRleF91bmxvY2soJnZoMjY1X211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBkdW1wX2F1eF9idWYoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBzaG9ydCAqYXV4X2FkciA9CisJCSh1bnNpZ25lZCBzaG9ydCAqKQorCQloZXZjLT5hdXhfYWRkcjsKKwl1bnNpZ25lZCBpbnQgYXV4X3NpemUgPQorCQkoUkVBRF9WUkVHKEhFVkNfQVVYX0RBVEFfU0laRSkKKwkJPj4gMTYpIDw8IDQ7CisKKwlpZiAoaGV2Yy0+cHJlZml4X2F1eF9zaXplID4gMCkgeworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkicHJlZml4IGF1eDogKHNpemUgJWQpXG4iLAorCQkJYXV4X3NpemUpOworCQlpZiAoYXV4X3NpemUgPiBoZXZjLT5wcmVmaXhfYXV4X3NpemUpIHsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkiJXM6YXV4X3NpemUoJWQpIGlzIG92ZXIgc2l6ZVxuIiwgX19mdW5jX18sIGF1eF9zaXplKTsKKwkJCXJldHVybiA7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8CisJCShhdXhfc2l6ZSA+PiAxKTsgaSsrKSB7CisJCQloZXZjX3ByaW50X2NvbnQoaGV2YywgMCwKKwkJCQkiJTA0eCAiLAorCQkJCSooYXV4X2FkciArIGkpKTsKKwkJCWlmICgoKGkgKyAxKSAmIDB4ZikKKwkJCQk9PSAwKQorCQkJCWhldmNfcHJpbnRfY29udChoZXZjLAorCQkJCTAsICJcbiIpOworCQl9CisJfQorCWlmIChoZXZjLT5zdWZmaXhfYXV4X3NpemUgPiAwKSB7CisJCWF1eF9hZHIgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCShoZXZjLT5hdXhfYWRkciArCisJCQloZXZjLT5wcmVmaXhfYXV4X3NpemUpOworCQlhdXhfc2l6ZSA9CisJCShSRUFEX1ZSRUcoSEVWQ19BVVhfREFUQV9TSVpFKSAmIDB4ZmZmZikKKwkJCTw8IDQ7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJzdWZmaXggYXV4OiAoc2l6ZSAlZClcbiIsCisJCQlhdXhfc2l6ZSk7CisJCWlmIChhdXhfc2l6ZSA+IGhldmMtPnN1ZmZpeF9hdXhfc2l6ZSkgeworCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSIlczphdXhfc2l6ZSglZCkgaXMgb3ZlciBzaXplXG4iLCBfX2Z1bmNfXywgYXV4X3NpemUpOworCQkJcmV0dXJuIDsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwKKwkJKGF1eF9zaXplID4+IDEpOyBpKyspIHsKKwkJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLAorCQkJCSIlMDR4ICIsICooYXV4X2FkciArIGkpKTsKKwkJCWlmICgoKGkgKyAxKSAmIDB4ZikgPT0gMCkKKwkJCQloZXZjX3ByaW50X2NvbnQoaGV2YywgMCwgIlxuIik7CisJCX0KKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorc3RhdGljIHZvaWQgZG9sYnlfZ2V0X21ldGEoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhoZXZjKTsKKworCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJgorCQlIMjY1X0RFQlVHX1BSSU5UX1NFSSkKKwkJZHVtcF9hdXhfYnVmKGhldmMpOworCWlmICh2ZGVjLT5kb2xieV9tZXRhX3dpdGhfZWwgfHwgdmRlYy0+c2xhdmUpIHsKKwkJc2V0X2F1eF9kYXRhKGhldmMsCisJCWhldmMtPmN1cl9waWMsIDAsIDApOworCX0gZWxzZSBpZiAodmRlYy0+bWFzdGVyKSB7CisJCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmNfYmEgPQorCQkoc3RydWN0IGhldmNfc3RhdGVfcyAqKQorCQkJdmRlYy0+bWFzdGVyLT5wcml2YXRlOworCQkvKmRvIG5vdCB1c2UgaGV2Y19iYSovCisJCXNldF9hdXhfZGF0YShoZXZjLAorCQloZXZjX2JhLT5jdXJfcGljLAorCQkJMCwgMSk7CisJCXNldF9hdXhfZGF0YShoZXZjLAorCQloZXZjLT5jdXJfcGljLCAwLCAyKTsKKwl9IGVsc2UgaWYgKHZkZWNfZnJhbWVfYmFzZWQodmRlYykpIHsKKwkJc2V0X2F1eF9kYXRhKGhldmMsCisJCQloZXZjLT5jdXJfcGljLCAxLCAwKTsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgcmVhZF9kZWNvZGVfaW5mbyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCXVpbnQzMl90IGRlY29kZV9pbmZvID0KKwkJUkVBRF9IUkVHKEhFVkNfREVDT0RFX0lORk8pOworCWhldmMtPnN0YXJ0X2RlY29kaW5nX2ZsYWcgfD0KKwkJKGRlY29kZV9pbmZvICYgMHhmZik7CisJaGV2Yy0+cnBzX3NldF9pZCA9IChkZWNvZGVfaW5mbyA+PiA4KSAmIDB4ZmY7Cit9CisKK3N0YXRpYyBpbnQgdmgyNjVfZ2V0X3BzX2luZm8oc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwkJCSAgICAgdW5pb24gcGFyYW1fdSAqcnBtX3BhcmFtLAorCQkJICAgICBzdHJ1Y3QgYW1sX3ZkZWNfcHNfaW5mb3MgKnBzKQoreworCXUzMiB3aWR0aCA9IHJwbV9wYXJhbS0+cC5waWNfd2lkdGhfaW5fbHVtYV9zYW1wbGVzOworCXUzMiBoZWlnaHQgPSBycG1fcGFyYW0tPnAucGljX2hlaWdodF9pbl9sdW1hX3NhbXBsZXM7CisJdTMyIFN1YldpZHRoQywgU3ViSGVpZ2h0QzsKKworCXN3aXRjaCAocnBtX3BhcmFtLT5wLmNocm9tYV9mb3JtYXRfaWRjKSB7CisJY2FzZSAxOgorCQlTdWJXaWR0aEMgPSAyOworCQlTdWJIZWlnaHRDID0gMjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlTdWJXaWR0aEMgPSAyOworCQlTdWJIZWlnaHRDID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJU3ViV2lkdGhDID0gMTsKKwkJU3ViSGVpZ2h0QyA9IDE7CisJCWJyZWFrOworCX0KKworCXdpZHRoIC09IFN1YldpZHRoQyAqCisJCShycG1fcGFyYW0tPnAuY29uZl93aW5fbGVmdF9vZmZzZXQgKworCQlycG1fcGFyYW0tPnAuY29uZl93aW5fcmlnaHRfb2Zmc2V0KTsKKwloZWlnaHQgLT0gU3ViSGVpZ2h0QyAqCisJCShycG1fcGFyYW0tPnAuY29uZl93aW5fdG9wX29mZnNldCArCisJCXJwbV9wYXJhbS0+cC5jb25mX3dpbl9ib3R0b21fb2Zmc2V0KTsKKworCWhldmMtPmxhc3Rfd2lkdGggPSBycG1fcGFyYW0tPnAucGljX3dpZHRoX2luX2x1bWFfc2FtcGxlczsKKwloZXZjLT5sYXN0X2hlaWdodCA9IHJwbV9wYXJhbS0+cC5waWNfaGVpZ2h0X2luX2x1bWFfc2FtcGxlczsKKwloZXZjLT5zcHNfbnVtX3Jlb3JkZXJfcGljc18wID0KKwkJcnBtX3BhcmFtLT5wLnNwc19udW1fcmVvcmRlcl9waWNzXzA7CisJaGV2Yy0+dXNlZF9idWZfbnVtID0gdjRsX3BhcnNlcl93b3JrX3BpY19udW0oaGV2Yyk7CisKKwlwcy0+dmlzaWJsZV93aWR0aCAJPSB3aWR0aDsKKwlwcy0+dmlzaWJsZV9oZWlnaHQgCT0gaGVpZ2h0OworCXBzLT5jb2RlZF93aWR0aCAJPSBBTElHTih3aWR0aCwgNjQpOworCXBzLT5jb2RlZF9oZWlnaHQgCT0gQUxJR04oaGVpZ2h0LCA2NCk7CisJcHMtPmRwYl9zaXplIAkJPSB2NGxfcGFyc2VyX3dvcmtfcGljX251bShoZXZjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnZXRfY29tcF9idWZfaW5mbyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCQlzdHJ1Y3QgdmRlY19jb21wX2J1Zl9pbmZvICppbmZvKQoreworCXUxNiBiaXRfZGVwdGggPSBoZXZjLT5wYXJhbS5wLmJpdF9kZXB0aDsKKwlpbnQgdyA9IGhldmMtPnBhcmFtLnAucGljX3dpZHRoX2luX2x1bWFfc2FtcGxlczsKKwlpbnQgaCA9IGhldmMtPnBhcmFtLnAucGljX2hlaWdodF9pbl9sdW1hX3NhbXBsZXM7CisKKwlpbmZvLT5tYXhfc2l6ZSA9IGhldmNfbWF4X21tdV9idWZfc2l6ZSgKKwkJCWhldmMtPm1heF9waWNfdywKKwkJCWhldmMtPm1heF9waWNfaCk7CisJaW5mby0+aGVhZGVyX3NpemUgPSBoZXZjX2dldF9oZWFkZXJfc2l6ZSh3LGgpOworCWluZm8tPmZyYW1lX2J1ZmZlcl9zaXplID0gaGV2Y19tbXVfcGFnZV9udW0oCisJCQloZXZjLCB3LCBoLAliaXRfZGVwdGggPT0gMCk7CisKKwlwcl9pbmZvKCJoZXZjIGdldCBjb21wIGluZm86ICVkICVkICVkXG4iLAorCQkJaW5mby0+bWF4X3NpemUsIGluZm8tPmhlYWRlcl9zaXplLAorCQkJaW5mby0+ZnJhbWVfYnVmZmVyX3NpemUpOworfQorCitzdGF0aWMgaW50IHY0bF9yZXNfY2hhbmdlKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsIHVuaW9uIHBhcmFtX3UgKnJwbV9wYXJhbSkKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGhldmMtPnY0bDJfY3R4KTsKKwlpbnQgaSwgcmV0ID0gMDsKKworCWlmIChjdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSkgeworCQlzdHJ1Y3QgYW1sX3ZkZWNfcHNfaW5mb3MgcHM7CisJCWludCB3aWR0aCA9IHJwbV9wYXJhbS0+cC5waWNfd2lkdGhfaW5fbHVtYV9zYW1wbGVzOworCQlpbnQgaGVpZ2h0ID0gcnBtX3BhcmFtLT5wLnBpY19oZWlnaHRfaW5fbHVtYV9zYW1wbGVzOworCQlpZiAoKGhldmMtPmxhc3Rfd2lkdGggIT0gMCAmJgorCQkJaGV2Yy0+bGFzdF9oZWlnaHQgIT0gMCkgJiYKKwkJCShoZXZjLT5sYXN0X3dpZHRoICE9IHdpZHRoIHx8CisJCQloZXZjLT5sYXN0X2hlaWdodCAhPSBoZWlnaHQpKSB7CisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJInY0bF9yZXNfY2hhbmdlIFBpYyBXaWR0aC9IZWlnaHQgQ2hhbmdlICglZCwlZCk9PiglZCwlZCksIGludGVybGFjZSAlZFxuIiwKKwkJCQloZXZjLT5sYXN0X3dpZHRoLCBoZXZjLT5sYXN0X2hlaWdodCwKKwkJCQl3aWR0aCwKKwkJCQloZWlnaHQsCisJCQkJaGV2Yy0+aW50ZXJsYWNlX2ZsYWcpOworCisJCQlpZiAoZ2V0X3ZhbGlkX2RvdWJsZV93cml0ZV9tb2RlKGhldmMpICE9IDE2KSB7CisJCQkJc3RydWN0IHZkZWNfY29tcF9idWZfaW5mbyBpbmZvOworCisJCQkJZ2V0X2NvbXBfYnVmX2luZm8oaGV2YywgJmluZm8pOworCQkJCXZkZWNfdjRsX3NldF9jb21wX2J1Zl9pbmZvKGN0eCwgJmluZm8pOworCQkJfQorCisJCQl2aDI2NV9nZXRfcHNfaW5mbyhoZXZjLCAmaGV2Yy0+cGFyYW0sICZwcyk7CisJCQl2ZGVjX3Y0bF9zZXRfcHNfaW5mb3MoY3R4LCAmcHMpOworCQkJdmRlY192NGxfcmVzX2NoX2V2ZW50KGN0eCk7CisJCQloZXZjLT52NGxfcGFyYW1zX3BhcnNlZCA9IGZhbHNlOworCQkJY3R4LT52NGxfcmVzb2x1dGlvbl9jaGFuZ2UgPSAxOworCQkJaGV2Yy0+ZW9zID0gMTsKKworCQkJLyoKKwkJCSAqIG1hcmtzIGZyYW1lIHZhbGlkIG9uIHRoZSBkcGIgaXMgdGhlIG91cHV0IHN0YXRlLAorCQkJICogdGhlbiB2aWEgZmx1c2hfb3V0cHV0IGFsbCBmcmFtZXMgY2FuIGJlIGZsdXNoZWQgb3V0LgorCQkJICovCisJCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9QSUNfTlVNOyArK2kpIHsKKwkJCQlpZiAoKGhldmMtPm1fUElDW2ldID09IE5VTEwpIHx8CisJCQkJCShoZXZjLT5tX1BJQ1tpXS0+aW5kZXggPT0gLTEpIHx8CisJCQkJCShoZXZjLT5tX1BJQ1tpXS0+QlVGX2luZGV4ID09IC0xKSkKKwkJCQkJY29udGludWU7CisKKwkJCQlpZiAoKGhldmMtPm1fUElDW2ldLT5QT0MgIT0gSU5WQUxJRF9QT0MpICYmCisJCQkJCShoZXZjLT5tX1BJQ1tpXS0+b3V0cHV0X3JlYWR5ID09IDApICYmCisJCQkJCWhldmMtPm1fUElDW2ldLT5yZWZlcmVuY2VkICYmCisJCQkJCShoZXZjLT5tX1BJQ1tpXS0+UE9DID49IGhldmMtPmRlY29kZWRfcG9jKSkgeworCQkJCQkJaGV2Yy0+bV9QSUNbaV0tPm91dHB1dF9tYXJrID0gMTsKKwkJCQl9CisJCQl9CisKKwkJCWZsdXNoX291dHB1dChoZXZjLCBOVUxMKTsKKwkJCS8vZGVsX3RpbWVyX3N5bmMoJmhldmMtPnRpbWVyKTsKKwkJCW5vdGlmeV92NGxfZW9zKGh3X3RvX3ZkZWMoaGV2YykpOworCisJCQlyZXQgPSAxOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBoZXZjX3NraXBfbmFsKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJaWYgKChoZXZjLT5waWNfaCA9PSA5NikgJiYgKGhldmMtPnBpY193ICA9PSAxNjApICYmCisJCShnZXRfZG91YmxlX3dyaXRlX21vZGUoaGV2YykgPT0gMHgxMCkpIHsKKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA8PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVFhMWCkgeworCQkJaWYgKGhldmMtPnNraXBfbmFsX2NvdW50IDwgc2tpcF9uYWxfY291bnQpCisJCQkJcmV0dXJuIDE7CisJCX0gZWxzZSB7CisJCQlpZiAoaGV2Yy0+c2tpcF9uYWxfY291bnQgPCAxKQorCQkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhc3BlY3RfcmF0aW9fc2V0KHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJaW50ICBhc3BlY3RfcmF0aW9faWRjID0gaGV2Yy0+cGFyYW0ucC5hc3BlY3RfcmF0aW9faWRjOworCisJc3dpdGNoIChhc3BlY3RfcmF0aW9faWRjKSB7CisJCWNhc2UgMToKKwkJCWhldmMtPmZyYW1lX2FyID0gMHgzZmY7CisJCQloZXZjLT5jdXJfcGljLT5zYXJfaGVpZ2h0ID0gMTsKKwkJCWhldmMtPmN1cl9waWMtPnNhcl93aWR0aCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJaGV2Yy0+ZnJhbWVfYXIgPSAweDNmZjsKKwkJCWhldmMtPmN1cl9waWMtPnNhcl9oZWlnaHQgPSAxMTsKKwkJCWhldmMtPmN1cl9waWMtPnNhcl93aWR0aCA9IDEyOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWhldmMtPmZyYW1lX2FyID0gMHgzZmY7CisJCQloZXZjLT5jdXJfcGljLT5zYXJfaGVpZ2h0ID0gMTE7CisJCQloZXZjLT5jdXJfcGljLT5zYXJfd2lkdGggPSAxMDsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQloZXZjLT5mcmFtZV9hciA9IDB4M2ZmOworCQkJaGV2Yy0+Y3VyX3BpYy0+c2FyX2hlaWdodCA9IDExOworCQkJaGV2Yy0+Y3VyX3BpYy0+c2FyX3dpZHRoID0gMTY7CisJCQlicmVhazsKKwkJY2FzZSA1OgorCQkJaGV2Yy0+ZnJhbWVfYXIgPSAweDNmZjsKKwkJCWhldmMtPmN1cl9waWMtPnNhcl9oZWlnaHQgPSAzMzsKKwkJCWhldmMtPmN1cl9waWMtPnNhcl93aWR0aCA9IDQwOworCQkJYnJlYWs7CisJCWNhc2UgNjoKKwkJCWhldmMtPmZyYW1lX2FyID0gMHgzZmY7CisJCQloZXZjLT5jdXJfcGljLT5zYXJfaGVpZ2h0ID0gMTE7CisJCQloZXZjLT5jdXJfcGljLT5zYXJfd2lkdGggPSAyNDsKKwkJCWJyZWFrOworCQljYXNlIDc6CisJCQloZXZjLT5mcmFtZV9hciA9IDB4M2ZmOworCQkJaGV2Yy0+Y3VyX3BpYy0+c2FyX2hlaWdodCA9IDExOworCQkJaGV2Yy0+Y3VyX3BpYy0+c2FyX3dpZHRoID0gMjA7CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJaGV2Yy0+ZnJhbWVfYXIgPSAweDNmZjsKKwkJCWhldmMtPmN1cl9waWMtPnNhcl9oZWlnaHQgPSAxMTsKKwkJCWhldmMtPmN1cl9waWMtPnNhcl93aWR0aCA9IDMyOworCQkJYnJlYWs7CisJCWNhc2UgOToKKwkJCWhldmMtPmZyYW1lX2FyID0gMHgzZmY7CisJCQloZXZjLT5jdXJfcGljLT5zYXJfaGVpZ2h0ID0gMzM7CisJCQloZXZjLT5jdXJfcGljLT5zYXJfd2lkdGggPSA4MDsKKwkJCWJyZWFrOworCQljYXNlIDEwOgorCQkJaGV2Yy0+ZnJhbWVfYXIgPSAweDNmZjsKKwkJCWhldmMtPmN1cl9waWMtPnNhcl9oZWlnaHQgPSAxMTsKKwkJCWhldmMtPmN1cl9waWMtPnNhcl93aWR0aCA9IDE4OworCQkJYnJlYWs7CisJCWNhc2UgMTE6CisJCQloZXZjLT5mcmFtZV9hciA9IDB4M2ZmOworCQkJaGV2Yy0+Y3VyX3BpYy0+c2FyX2hlaWdodCA9IDExOworCQkJaGV2Yy0+Y3VyX3BpYy0+c2FyX3dpZHRoID0gMTU7CisJCQlicmVhazsKKwkJY2FzZSAxMjoKKwkJCWhldmMtPmZyYW1lX2FyID0gMHgzZmY7CisJCQloZXZjLT5jdXJfcGljLT5zYXJfaGVpZ2h0ID0gMzM7CisJCQloZXZjLT5jdXJfcGljLT5zYXJfd2lkdGggPSA2NDsKKwkJCWJyZWFrOworCQljYXNlIDEzOgorCQkJaGV2Yy0+ZnJhbWVfYXIgPSAweDNmZjsKKwkJCWhldmMtPmN1cl9waWMtPnNhcl9oZWlnaHQgPSA5OTsKKwkJCWhldmMtPmN1cl9waWMtPnNhcl93aWR0aCA9IDE2MDsKKwkJCWJyZWFrOworCQljYXNlIDE0OgorCQkJaGV2Yy0+ZnJhbWVfYXIgPSAweDNmZjsKKwkJCWhldmMtPmN1cl9waWMtPnNhcl9oZWlnaHQgPSAzOworCQkJaGV2Yy0+Y3VyX3BpYy0+c2FyX3dpZHRoID0gNDsKKwkJCWJyZWFrOworCQljYXNlIDE1OgorCQkJaGV2Yy0+ZnJhbWVfYXIgPSAweDNmZjsKKwkJCWhldmMtPmN1cl9waWMtPnNhcl9oZWlnaHQgPSAyOworCQkJaGV2Yy0+Y3VyX3BpYy0+c2FyX3dpZHRoID0gMzsKKwkJCWJyZWFrOworCQljYXNlIDE2OgorCQkJaGV2Yy0+ZnJhbWVfYXIgPSAweDNmZjsKKwkJCWhldmMtPmN1cl9waWMtPnNhcl9oZWlnaHQgPSAxOworCQkJaGV2Yy0+Y3VyX3BpYy0+c2FyX3dpZHRoID0gMjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCisJCQloZXZjLT5mcmFtZV9hciA9IDB4M2ZmOworCQkJaGV2Yy0+Y3VyX3BpYy0+c2FyX2hlaWdodCA9IDE7CisJCQloZXZjLT5jdXJfcGljLT5zYXJfd2lkdGggPSAxOworCQkJYnJlYWs7CisJCX0KKworfQorc3RhdGljIGlycXJldHVybl90IHZoMjY1X2lzcl90aHJlYWRfZm4oaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjID0gKHN0cnVjdCBoZXZjX3N0YXRlX3MgKikgZGF0YTsKKwl1bnNpZ25lZCBpbnQgZGVjX3N0YXR1cyA9IGhldmMtPmRlY19zdGF0dXM7CisJaW50IGksIHJldDsKKworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGhldmMpOworCisJaWYgKGRlY19zdGF0dXMgPT0gSEVWQ19TTElDRV9TRUdNRU5UX0RPTkUpIHsKKwkJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9JU1JfVEhSRUFEX0hFQURfU1RBUlQpOworCX0KKwllbHNlIGlmIChkZWNfc3RhdHVzID09IEhFVkNfREVDUElDX0RBVEFfRE9ORSkgeworCQlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9USFJFQURfUElDX0RPTkVfU1RBUlQpOworCX0KKworCWlmIChoZXZjLT5lb3MpCisJCXJldHVybiBJUlFfSEFORExFRDsKKwlpZiAoCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQkoIWhldmMtPm1faW5zX2ZsYWcpICYmCisjZW5kaWYKKwkJaGV2Yy0+ZXJyb3JfZmxhZyA9PSAxKSB7CisJCWlmICgoZXJyb3JfaGFuZGxlX3BvbGljeSAmIDB4MTApID09IDApIHsKKwkJCWlmIChoZXZjLT5jdXJfcGljKSB7CisJCQkJaW50IGN1cnJlbnRfbGN1X2lkeCA9CisJCQkJCVJFQURfVlJFRyhIRVZDX1BBUlNFUl9MQ1VfU1RBUlQpCisJCQkJCSYgMHhmZmZmZmY7CisJCQkJaWYgKGN1cnJlbnRfbGN1X2lkeCA8CisJCQkJCSgoaGV2Yy0+bGN1X3hfbnVtKmhldmMtPmxjdV95X251bSktMSkpCisJCQkJCWhldmMtPmN1cl9waWMtPmVycm9yX21hcmsgPSAxOworCisJCQl9CisJCX0KKwkJaWYgKChlcnJvcl9oYW5kbGVfcG9saWN5ICYgMSkgPT0gMCkgeworCQkJaGV2Yy0+ZXJyb3Jfc2tpcF9uYWxfY291bnQgPSAxOworCQkJLyogbWFudWFsIHNlYXJjaCBuYWwsIHNraXAgIGVycm9yX3NraXBfbmFsX2NvdW50CisJCQkgKiAgIG9mIG5hbCBhbmQgdHJpZ2dlciB0aGUgSEVWQ19OQUxfU0VBUkNIX0RPTkUgaXJxCisJCQkgKi8KKwkJCVdSSVRFX1ZSRUcoTkFMX1NFQVJDSF9DVEwsCisJCQkJCSAgIChlcnJvcl9za2lwX25hbF9jb3VudCA8PCA0KSB8IDB4MSk7CisJCX0gZWxzZSB7CisJCQloZXZjLT5lcnJvcl9za2lwX25hbF9jb3VudCA9IGVycm9yX3NraXBfbmFsX2NvdW50OworCQkJV1JJVEVfVlJFRyhOQUxfU0VBUkNIX0NUTCwgMHgxKTsvKiBtYW51YWwgcGFyc2VyIE5BTCAqLworCQl9CisJCWlmICgoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19OT19FT1NfU0VBUkNIX0RPTkUpCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwkJCXx8IHZkZWMtPm1hc3RlcgorCQkJfHwgdmRlYy0+c2xhdmUKKyNlbmRpZgorCQkJKSB7CisJCQlXUklURV9WUkVHKE5BTF9TRUFSQ0hfQ1RMLAorCQkJCQkgICBSRUFEX1ZSRUcoTkFMX1NFQVJDSF9DVEwpIHwgMHgxMDAwMCk7CisJCX0KKwkJV1JJVEVfVlJFRyhOQUxfU0VBUkNIX0NUTCwKKwkJCVJFQURfVlJFRyhOQUxfU0VBUkNIX0NUTCkKKwkJCXwgKChwYXJzZXJfc2VpX2VuYWJsZSAmIDB4NykgPDwgMTcpKTsKKy8qI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OKi8KKwkJV1JJVEVfVlJFRyhOQUxfU0VBUkNIX0NUTCwKKwkJCVJFQURfVlJFRyhOQUxfU0VBUkNIX0NUTCkgfAorCQkJKChwYXJzZXJfZG9sYnlfdmlzaW9uX2VuYWJsZSAmIDB4MSkgPDwgMjApKTsKKy8qI2VuZGlmKi8KKwkJY29uZmlnX2RlY29kZV9tb2RlKGhldmMpOworCQkvKiBzZWFyY2ggbmV3IG5hbCAqLworCQlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIEhFVkNfQUNUSU9OX0RPTkUpOworCQkvKiBJbnRlcnJ1cHQgQW1yaXNjIHRvIGV4Y3V0ZSAqLworCQlXUklURV9WUkVHKEhFVkNfTUNQVV9JTlRSX1JFUSwgQU1SSVNDX01BSU5fUkVRKTsKKworCQkvKiBoZXZjX3ByaW50KGhldmMsIDAsCisJCSAqIiVzOiBlcnJvciBoYW5kbGVcbiIsIF9fZnVuY19fKTsKKwkJICovCisJCWhldmMtPmVycm9yX2ZsYWcgPSAyOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfSBlbHNlIGlmICgKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCSghaGV2Yy0+bV9pbnNfZmxhZykgJiYKKyNlbmRpZgorCQloZXZjLT5lcnJvcl9mbGFnID09IDMpIHsKKwkJaGV2Y19wcmludChoZXZjLCAwLCAiZXJyb3JfZmxhZz0zLCBoZXZjX3JlY292ZXJcbiIpOworCQloZXZjX3JlY292ZXIoaGV2Yyk7CisJCWhldmMtPmVycm9yX2ZsYWcgPSAwOworCisJCWlmICgoZXJyb3JfaGFuZGxlX3BvbGljeSAmIDB4MTApID09IDApIHsKKwkJCWlmIChoZXZjLT5jdXJfcGljKSB7CisJCQkJaW50IGN1cnJlbnRfbGN1X2lkeCA9CisJCQkJCVJFQURfVlJFRyhIRVZDX1BBUlNFUl9MQ1VfU1RBUlQpCisJCQkJCSYgMHhmZmZmZmY7CisJCQkJaWYgKGN1cnJlbnRfbGN1X2lkeCA8CisJCQkJCSgoaGV2Yy0+bGN1X3hfbnVtKmhldmMtPmxjdV95X251bSktMSkpCisJCQkJCWhldmMtPmN1cl9waWMtPmVycm9yX21hcmsgPSAxOworCisJCQl9CisJCX0KKwkJaWYgKChlcnJvcl9oYW5kbGVfcG9saWN5ICYgMSkgPT0gMCkgeworCQkJLyogbmVlZCBza2lwIHNvbWUgZGF0YSB3aGVuCisJCQkgKiAgIGVycm9yX2ZsYWcgb2YgMyBpcyB0cmlnZ2VyZWQsCisJCQkgKi8KKwkJCS8qIHRvIGF2b2lkIGhldmNfcmVjb3ZlcigpIGJlaW5nIGNhbGxlZAorCQkJICogICBmb3IgbWFueSB0aW1lcyBhdCB0aGUgc2FtZSBiaXRzdHJlYW0gcG9zaXRpb24KKwkJCSAqLworCQkJaGV2Yy0+ZXJyb3Jfc2tpcF9uYWxfY291bnQgPSAxOworCQkJLyogbWFudWFsIHNlYXJjaCBuYWwsIHNraXAgIGVycm9yX3NraXBfbmFsX2NvdW50CisJCQkgKiAgIG9mIG5hbCBhbmQgdHJpZ2dlciB0aGUgSEVWQ19OQUxfU0VBUkNIX0RPTkUgaXJxCisJCQkgKi8KKwkJCVdSSVRFX1ZSRUcoTkFMX1NFQVJDSF9DVEwsCisJCQkJCSAgIChlcnJvcl9za2lwX25hbF9jb3VudCA8PCA0KSB8IDB4MSk7CisJCX0KKworCQlpZiAoKGVycm9yX2hhbmRsZV9wb2xpY3kgJiAweDIpID09IDApIHsKKwkJCWhldmMtPmhhdmVfdnBzID0gMTsKKwkJCWhldmMtPmhhdmVfc3BzID0gMTsKKwkJCWhldmMtPmhhdmVfcHBzID0gMTsKKwkJfQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCWlmICghaGV2Yy0+bV9pbnNfZmxhZykgeworCQlpID0gUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCk7CisJCWlmICgoaGV2Yy0+c2hpZnRfYnl0ZV9jb3VudF9sbyAmICgxIDw8IDMxKSkKKwkJCSYmICgoaSAmICgxIDw8IDMxKSkgPT0gMCkpCisJCQloZXZjLT5zaGlmdF9ieXRlX2NvdW50X2hpKys7CisJCWhldmMtPnNoaWZ0X2J5dGVfY291bnRfbG8gPSBpOworCX0KKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJbXV0ZXhfbG9jaygmaGV2Yy0+Y2h1bmtzX211dGV4KTsKKwlpZiAoKGRlY19zdGF0dXMgPT0gSEVWQ19ERUNQSUNfREFUQV9ET05FIHx8CisJCWRlY19zdGF0dXMgPT0gSEVWQ19GSU5EX05FWFRfUElDX05BTCB8fAorCQlkZWNfc3RhdHVzID09IEhFVkNfRklORF9ORVhUX0RWRUxfTkFMKQorCQkmJiAoaGV2Yy0+Y2h1bmspKSB7CisJCWhldmMtPmN1cl9waWMtPnB0cyA9IGhldmMtPmNodW5rLT5wdHM7CisJCWhldmMtPmN1cl9waWMtPnB0czY0ID0gaGV2Yy0+Y2h1bmstPnB0czY0OworCQloZXZjLT5jdXJfcGljLT50aW1lc3RhbXAgPSBoZXZjLT5jaHVuay0+dGltZXN0YW1wOworCX0KKwltdXRleF91bmxvY2soJmhldmMtPmNodW5rc19tdXRleCk7CisKKwlpZiAoZGVjX3N0YXR1cyA9PSBIRVZDX0RFQ09ERV9CVUZFTVBUWSB8fAorCQlkZWNfc3RhdHVzID09IEhFVkNfREVDT0RFX0JVRkVNUFRZMikgeworCQlpZiAoaGV2Yy0+bV9pbnNfZmxhZykgeworCQkJcmVhZF9kZWNvZGVfaW5mbyhoZXZjKTsKKwkJCWlmICh2ZGVjX2ZyYW1lX2Jhc2VkKGh3X3RvX3ZkZWMoaGV2YykpKSB7CisJCQkJaGV2Yy0+ZW1wdHlfZmxhZyA9IDE7CisJCQkJLypzdWZmaXggc2VpIG9yIGR2IG1ldGEqLworCQkJCXNldF9hdXhfZGF0YShoZXZjLCBoZXZjLT5jdXJfcGljLCAxLCAwKTsKKwkJCQlnb3RvIHBpY19kb25lOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwkJCQkJdmRlYy0+bWFzdGVyIHx8CisJCQkJCXZkZWMtPnNsYXZlIHx8CisjZW5kaWYKKwkJCQkJKGRhdGFfcmVzZW5kX3BvbGljeSAmIDB4MSkpIHsKKwkJCQkJaGV2Yy0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfQUdBSU47CisJCQkJCWFtaGV2Y19zdG9wKCk7CisJCQkJCXJlc3RvcmVfZGVjb2RlX3N0YXRlKGhldmMpOworCQkJCX0gZWxzZQorCQkJCQloZXZjLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9HRVRfREFUQTsKKwkJCX0KKwkJCXJlc2V0X3Byb2Nlc3NfdGltZShoZXZjKTsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaGV2Yy0+d29yayk7CisJCX0KKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0gZWxzZSBpZiAoKGRlY19zdGF0dXMgPT0gSEVWQ19TRUFSQ0hfQlVGRU1QVFkpIHx8CisJCShkZWNfc3RhdHVzID09IEhFVkNfTkFMX0RFQ09ERV9ET05FKQorCQkpIHsKKwkJaWYgKGhldmMtPm1faW5zX2ZsYWcpIHsKKwkJCXJlYWRfZGVjb2RlX2luZm8oaGV2Yyk7CisJCQlpZiAodmRlY19mcmFtZV9iYXNlZChod190b192ZGVjKGhldmMpKSkgeworCQkJCS8qaGV2Yy0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfR0VUX0RBVEE7Ki8KKwkJCQloZXZjLT5lbXB0eV9mbGFnID0gMTsKKwkJCQkvKnN1ZmZpeCBzZWkgb3IgZHYgbWV0YSovCisJCQkJc2V0X2F1eF9kYXRhKGhldmMsIGhldmMtPmN1cl9waWMsIDEsIDApOworCQkJCWdvdG8gcGljX2RvbmU7CisJCQl9IGVsc2UgeworCQkJCWhldmMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0FHQUlOOworCQkJCWFtaGV2Y19zdG9wKCk7CisJCQkJcmVzdG9yZV9kZWNvZGVfc3RhdGUoaGV2Yyk7CisJCQl9CisKKwkJCXJlc2V0X3Byb2Nlc3NfdGltZShoZXZjKTsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaGV2Yy0+d29yayk7CisJCX0KKworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfSBlbHNlIGlmIChkZWNfc3RhdHVzID09IEhFVkNfREVDUElDX0RBVEFfRE9ORSkgeworCQlpZiAoaGV2Yy0+bV9pbnNfZmxhZykgeworCQkJc3RydWN0IFBJQ19zICpwaWM7CisJCQlzdHJ1Y3QgUElDX3MgKnBpY19kaXNwbGF5OworCQkJaW50IGRlY29kZWRfcG9jOworCisJCQlpZiAodmRlYy0+bXZmcm0pCisJCQkJdmRlYy0+bXZmcm0tPmh3X2RlY29kZV90aW1lID0KKwkJCQlsb2NhbF9jbG9jaygpIC0gdmRlYy0+bXZmcm0tPmh3X2RlY29kZV9zdGFydDsKKyNpZmRlZiBERVRSRUZJTExfRU5BQkxFCisJCQlpZiAoaGV2Yy0+aXNfc3dhcCAmJgorCQkJCWdldF9jcHVfbWFqb3JfaWQoKSA8PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hNKSB7CisJCQkJaWYgKGhldmMtPmRldGJ1Zl9hZHJfdmlydCAmJiBoZXZjLT5kZWxyZWZpbGxfY2hlY2sKKwkJCQkJJiYgUkVBRF9WUkVHKEhFVkNfU0FPX0RCR19NT0RFMCkpCisJCQkJCWhldmMtPmRlbHJlZmlsbF9jaGVjayA9IDI7CisJCQl9CisjZW5kaWYKKwkJCWhldmMtPmVtcHR5X2ZsYWcgPSAwOworcGljX2RvbmU6CisJCQlpZiAodmRlYy0+bWFzdGVyID09IE5VTEwgJiYgdmRlYy0+c2xhdmUgPT0gTlVMTCAmJgorCQkJCWhldmMtPmVtcHR5X2ZsYWcgPT0gMCkgeworCQkJCWhldmMtPm92ZXJfZGVjb2RlID0KKwkJCQkJKFJFQURfVlJFRyhIRVZDX1NISUZUX1NUQVRVUykgPj4gMTUpICYgMHgxOworCQkJCWlmIChoZXZjLT5vdmVyX2RlY29kZSkKKwkJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkJIiEhIU92ZXIgZGVjb2RlICVkXG4iLCBfX0xJTkVfXyk7CisJCQl9CisJCQlpZiAoaW5wdXRfZnJhbWVfYmFzZWQoaHdfdG9fdmRlYyhoZXZjKSkgJiYKKwkJCQlmcm1iYXNlX2NvbnRfYml0bGV2ZWwgIT0gMCAmJgorCQkJCShoZXZjLT5kZWNvZGVfc2l6ZSA+IFJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpKSAmJgorCQkJCShoZXZjLT5kZWNvZGVfc2l6ZSAtIChSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKSkKKwkJCQkgPglmcm1iYXNlX2NvbnRfYml0bGV2ZWwpKSB7CisJCQkJY2hlY2tfcGljX2RlY29kZWRfZXJyb3IoaGV2YywgUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0xDVV9TVEFSVCkgJiAweGZmZmZmZik7CisJCQkJLypoYW5kbGUgdGhlIGNhc2U6IG11bHRpIHBpY3R1cmVzIGluIG9uZSBwYWNrZXQqLworCQkJCWhldmNfcHJpbnQoaGV2YywgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCQkiJXMgIGhhcyBtb3JlIGRhdGEgaW5kZXg9ICVkLCBzaXplPTB4JXggc2hpZnRjbnQ9MHgleClcbiIsCisJCQkJX19mdW5jX18sCisJCQkJaGV2Yy0+ZGVjb2RlX2lkeCwgaGV2Yy0+ZGVjb2RlX3NpemUsCisJCQkJUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCkpOworCQkJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgSEVWQ19BQ1RJT05fRE9ORSk7CisJCQkJc3RhcnRfcHJvY2Vzc190aW1lKGhldmMpOworCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCX0KKworCQkJcmVhZF9kZWNvZGVfaW5mbyhoZXZjKTsKKwkJCWdldF9waWN0dXJlX3Fvc19pbmZvKGhldmMpOworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJCQloZXZjLT5zdGFydF9wYXJzZXJfdHlwZSA9IDA7CisJCQloZXZjLT5zd2l0Y2hfZHZsYXllcl9mbGFnID0gMDsKKyNlbmRpZgorCQkJaGV2Yy0+ZGVjb2RlZF9wb2MgPSBoZXZjLT5jdXJyX1BPQzsKKwkJCWhldmMtPmRlY29kaW5nX3BpYyA9IE5VTEw7CisJCQloZXZjLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworI2lmZGVmIERFVFJFRklMTF9FTkFCTEUKKwkJCWlmIChoZXZjLT5pc19zd2FwICYmCisJCQkJZ2V0X2NwdV9tYWpvcl9pZCgpIDw9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWE0pCisJCQkJaWYgKGhldmMtPmRlbHJlZmlsbF9jaGVjayAhPSAyKQorI2VuZGlmCisKKwkJCWFtaGV2Y19zdG9wKCk7CisKKwkJCXJlc2V0X3Byb2Nlc3NfdGltZShoZXZjKTsKKworCQkJaWYgKCghaW5wdXRfc3RyZWFtX2Jhc2VkKHZkZWMpICYmCisJCQkJCWhldmMtPnZmX3ByZV9jb3VudCA9PSAwKSB8fCBoZXZjLT5pcF9tb2RlKSB7CisJCQkJZGVjb2RlZF9wb2MgPSBoZXZjLT5jdXJyX1BPQzsKKwkJCQlwaWMgPSBnZXRfcGljX2J5X1BPQyhoZXZjLCBkZWNvZGVkX3BvYyk7CisJCQkJaWYgKHBpYyAmJiAocGljLT5QT0MgIT0gSU5WQUxJRF9QT0MpKSB7CisJCQkJCS8qUEIgc2tpcCBjb250cm9sICovCisJCQkJCWlmIChwaWMtPmVycm9yX21hcmsgPT0gMAorCQkJCQkJCSYmIGhldmMtPlBCX3NraXBfbW9kZSA9PSAxKSB7CisJCQkJCQkvKiBzdGFydCBkZWNvZGluZyBhZnRlcgorCQkJCQkJICogICBmaXJzdCBJCisJCQkJCQkgKi8KKwkJCQkJCWhldmMtPmlnbm9yZV9idWZtZ3JfZXJyb3IgfD0gMHgxOworCQkJCQl9CisJCQkJCWlmIChoZXZjLT5pZ25vcmVfYnVmbWdyX2Vycm9yICYgMSkgeworCQkJCQkJaWYgKGhldmMtPlBCX3NraXBfY291bnRfYWZ0ZXJfZGVjb2RpbmcgPiAwKSB7CisJCQkJCQkJaGV2Yy0+UEJfc2tpcF9jb3VudF9hZnRlcl9kZWNvZGluZy0tOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvKiBzdGFydCBkaXNwbGF5aW5nICovCisJCQkJCQkJaGV2Yy0+aWdub3JlX2J1Zm1ncl9lcnJvciB8PSAweDI7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKGhldmMtPm1tdV9lbmFibGUKKwkJCQkJCQkmJiAoKGhldmMtPmRvdWJsZV93cml0ZV9tb2RlICYgMHgxMCkgPT0gMCkpIHsKKwkJCQkJCWlmICghaGV2Yy0+bV9pbnNfZmxhZykgeworCQkJCQkJCWhldmMtPnVzZWRfNGtfbnVtID0KKwkJCQkJCQkJUkVBRF9WUkVHKEhFVkNfU0FPX01NVV9TVEFUVVMpID4+IDE2OworCQkJCQkJCWlmICgoIWlzX3NraXBfZGVjb2RpbmcoaGV2YywgcGljKSkgJiYKKwkJCQkJCQkJKGhldmMtPnVzZWRfNGtfbnVtID49IDApICYmCisJCQkJCQkJCShoZXZjLT5jdXJfcGljLT5zY2F0dGVyX2FsbG9jCisJCQkJCQkJCT09IDEpKQorCQkJCQkJCQlyZWN5Y2xlX21tdV9idWZfdGFpbChoZXZjLCBmYWxzZSk7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlwaWMtPm91dHB1dF9tYXJrID0gMTsKKwkJCQkJcGljLT5yZWNvbl9tYXJrID0gMTsKKwkJCQkJaWYgKHZkZWMtPm12ZnJtKSB7CisJCQkJCQlwaWMtPmZyYW1lX3NpemUgPQorCQkJCQkJCXZkZWMtPm12ZnJtLT5mcmFtZV9zaXplOworCQkJCQkJcGljLT5od19kZWNvZGVfdGltZSA9CisJCQkJCQkodTMyKXZkZWMtPm12ZnJtLT5od19kZWNvZGVfdGltZTsKKwkJCQkJfQorCQkJCX0KKwkJCQkvKkRldGVjdHMgdGhlIGZpcnN0IGZyYW1lIHdoZXRoZXIgaGFzIGFuIG92ZXIgZGVjb2RlIGVycm9yKi8KKwkJCQlpZiAodmRlYy0+bWFzdGVyID09IE5VTEwgJiYgdmRlYy0+c2xhdmUgPT0gTlVMTCAmJgorCQkJCQloZXZjLT5lbXB0eV9mbGFnID09IDApIHsKKwkJCQkJaGV2Yy0+b3Zlcl9kZWNvZGUgPQorCQkJCQkJKFJFQURfVlJFRyhIRVZDX1NISUZUX1NUQVRVUykgPj4gMTUpICYgMHgxOworCQkJCQlpZiAoaGV2Yy0+b3Zlcl9kZWNvZGUpCisJCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCQkJIiEhIU92ZXIgZGVjb2RlICVkXG4iLCBfX0xJTkVfXyk7CisJCQkJfQorCQkJCWNoZWNrX3BpY19kZWNvZGVkX2Vycm9yKGhldmMsCisJCQkJCVJFQURfVlJFRyhIRVZDX1BBUlNFUl9MQ1VfU1RBUlQpICYgMHhmZmZmZmYpOworCQkJCWlmIChoZXZjLT5jdXJfcGljICE9IE5VTEwgJiYKKwkJCQkJKFJFQURfVlJFRyhIRVZDX1BBUlNFUl9MQ1VfU1RBUlQpICYgMHhmZmZmZmYpID09IDAKKwkJCQkJJiYgKGhldmMtPmxjdV94X251bSAqIGhldmMtPmxjdV95X251bSAhPSAxKSkKKwkJCQkJaGV2Yy0+Y3VyX3BpYy0+ZXJyb3JfbWFyayA9IDE7CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KK2ZvcmNlX291dHB1dDoKKyNlbmRpZgorCQkJCXBpY19kaXNwbGF5ID0gb3V0cHV0X3BpYyhoZXZjLCAxKTsKKwkJCQlpZiAocGljX2Rpc3BsYXkpIHsKKwkJCQkJaWYgKChwaWNfZGlzcGxheS0+ZXJyb3JfbWFyayAmJgorCQkJCQkJKChoZXZjLT5pZ25vcmVfYnVmbWdyX2Vycm9yICYKKwkJCQkJCQkJICAweDIpID09IDApKQorCQkJCQkJfHwgKGdldF9kYmdfZmxhZyhoZXZjKSAmCisJCQkJCQkJSDI2NV9ERUJVR19ESVNQTEFZX0NVUl9GUkFNRSkKKwkJCQkJCXx8IChnZXRfZGJnX2ZsYWcoaGV2YykgJgorCQkJCQkJCUgyNjVfREVCVUdfTk9fRElTUExBWSkpIHsKKwkJCQkJCXBpY19kaXNwbGF5LT5vdXRwdXRfcmVhZHkgPSAwOworCQkJCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmCisJCQkJCQkJSDI2NV9ERUJVR19CVUZNR1IpIHsKKwkJCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCQkJIltCTV0gRGlzcGxheTogUE9DICVkLCAiLAorCQkJCQkJCQkgcGljX2Rpc3BsYXktPlBPQyk7CisJCQkJCQkJaGV2Y19wcmludF9jb250KGhldmMsIDAsCisJCQkJCQkJImRlY29kaW5nIGluZGV4ICVkID09PiAiLAorCQkJCQkJCQkgcGljX2Rpc3BsYXktPgorCQkJCQkJCQkgZGVjb2RlX2lkeCk7CisJCQkJCQkJaGV2Y19wcmludF9jb250KGhldmMsIDAsCisJCQkJCQkJIkRlYnVnIG9yIGVycixyZWN5Y2xlIGl0XG4iKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICgocGljX2Rpc3BsYXktPgorCQkJCQkJc2xpY2VfdHlwZSAhPSAyKSAmJiAhcGljX2Rpc3BsYXktPmlwX21vZGUpIHsKKwkJCQkJCXBpY19kaXNwbGF5LT5vdXRwdXRfcmVhZHkgPSAwOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlwcmVwYXJlX2Rpc3BsYXlfYnVmCisJCQkJCQkJCShod190b192ZGVjKGhldmMpLAorCQkJCQkJCQkgcGljX2Rpc3BsYXkpOworCQkJCQkJCWhldmMtPmZpcnN0X3BpY19mbGFnID0gMTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX1RIUkVBRF9FRE4pOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZoZXZjLT53b3JrKTsKKwkJfQorCisJCXJldHVybiBJUlFfSEFORExFRDsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCX0gZWxzZSBpZiAoZGVjX3N0YXR1cyA9PSBIRVZDX0ZJTkRfTkVYVF9QSUNfTkFMIHx8CisJCWRlY19zdGF0dXMgPT0gSEVWQ19GSU5EX05FWFRfRFZFTF9OQUwpIHsKKwkJaWYgKGhldmMtPm1faW5zX2ZsYWcpIHsKKwkJCXVuc2lnbmVkIGNoYXIgbmV4dF9wYXJzZXJfdHlwZSA9CisJCQkJCVJFQURfSFJFRyhDVVJfTkFMX1VOSVRfVFlQRSkgJiAweGZmOworCQkJcmVhZF9kZWNvZGVfaW5mbyhoZXZjKTsKKworCQkJaWYgKHZkZWMtPnNsYXZlICYmCisJCQkJZGVjX3N0YXR1cyA9PSBIRVZDX0ZJTkRfTkVYVF9EVkVMX05BTCkgeworCQkJCS8qY3VyIGlzIGJhc2UsIGZvdW5kIGVuaGFuY2UqLworCQkJCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmNfZWwgPQorCQkJCShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICopCisJCQkJCXZkZWMtPnNsYXZlLT5wcml2YXRlOworCQkJCWhldmMtPnN3aXRjaF9kdmxheWVyX2ZsYWcgPSAxOworCQkJCWhldmMtPm5vX3N3aXRjaF9kdmxheWVyX2NvdW50ID0gMDsKKwkJCQloZXZjX2VsLT5zdGFydF9wYXJzZXJfdHlwZSA9CisJCQkJCW5leHRfcGFyc2VyX3R5cGU7CisJCQkJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX0RWLAorCQkJCQkic3dpdGNoIChwb2MgJWQpIHRvIGVsXG4iLAorCQkJCQloZXZjLT5jdXJfcGljID8KKwkJCQkJaGV2Yy0+Y3VyX3BpYy0+UE9DIDoKKwkJCQkJSU5WQUxJRF9QT0MpOworCQkJfSBlbHNlIGlmICh2ZGVjLT5tYXN0ZXIgJiYKKwkJCQlkZWNfc3RhdHVzID09IEhFVkNfRklORF9ORVhUX1BJQ19OQUwpIHsKKwkJCQkvKmN1ciBpcyBlbmhhbmNlLCBmb3VuZCBiYXNlKi8KKwkJCQlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjX2JhID0KKwkJCQkoc3RydWN0IGhldmNfc3RhdGVfcyAqKQorCQkJCQl2ZGVjLT5tYXN0ZXItPnByaXZhdGU7CisJCQkJaGV2Yy0+c3dpdGNoX2R2bGF5ZXJfZmxhZyA9IDE7CisJCQkJaGV2Yy0+bm9fc3dpdGNoX2R2bGF5ZXJfY291bnQgPSAwOworCQkJCWhldmNfYmEtPnN0YXJ0X3BhcnNlcl90eXBlID0KKwkJCQkJbmV4dF9wYXJzZXJfdHlwZTsKKwkJCQloZXZjX3ByaW50KGhldmMsIEgyNjVfREVCVUdfRFYsCisJCQkJCSJzd2l0Y2ggKHBvYyAlZCkgdG8gYmxcbiIsCisJCQkJCWhldmMtPmN1cl9waWMgPworCQkJCQloZXZjLT5jdXJfcGljLT5QT0MgOgorCQkJCQlJTlZBTElEX1BPQyk7CisJCQl9IGVsc2UgeworCQkJCWhldmMtPnN3aXRjaF9kdmxheWVyX2ZsYWcgPSAwOworCQkJCWhldmMtPnN0YXJ0X3BhcnNlcl90eXBlID0KKwkJCQkJbmV4dF9wYXJzZXJfdHlwZTsKKwkJCQloZXZjLT5ub19zd2l0Y2hfZHZsYXllcl9jb3VudCsrOworCQkJCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19EViwKKwkJCQkJIiVzOiBub19zd2l0Y2hfZHZsYXllcl9jb3VudCA9ICVkXG4iLAorCQkJCQl2ZGVjLT5tYXN0ZXIgPyAiZWwiIDogImJsIiwKKwkJCQkJaGV2Yy0+bm9fc3dpdGNoX2R2bGF5ZXJfY291bnQpOworCQkJCWlmICh2ZGVjLT5zbGF2ZSAmJgorCQkJCQlkb2xieV9lbF9mbHVzaF90aCAhPSAwICYmCisJCQkJCWhldmMtPm5vX3N3aXRjaF9kdmxheWVyX2NvdW50ID4KKwkJCQkJZG9sYnlfZWxfZmx1c2hfdGgpIHsKKwkJCQkJc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Y19lbCA9CisJCQkJCShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICopCisJCQkJCXZkZWMtPnNsYXZlLT5wcml2YXRlOworCQkJCQlzdHJ1Y3QgUElDX3MgKmVsX3BpYzsKKwkJCQkJY2hlY2tfcGljX2RlY29kZWRfZXJyb3IoaGV2Y19lbCwKKwkJCQkJaGV2Y19lbC0+cGljX2RlY29kZWRfbGN1X2lkeCk7CisJCQkJCWVsX3BpYyA9IGdldF9waWNfYnlfUE9DKGhldmNfZWwsCisJCQkJCQloZXZjX2VsLT5jdXJyX1BPQyk7CisJCQkJCWhldmNfZWwtPmN1cnJfUE9DID0gSU5WQUxJRF9QT0M7CisJCQkJCWhldmNfZWwtPm1fcG9jUmFuZG9tQWNjZXNzID0gTUFYX0lOVDsKKwkJCQkJZmx1c2hfb3V0cHV0KGhldmNfZWwsIGVsX3BpYyk7CisJCQkJCWhldmNfZWwtPmRlY29kZWRfcG9jID0gSU5WQUxJRF9QT0M7IC8qCisJCQkJCWFscmVhZHkgY2FsbCBmbHVzaF9vdXRwdXQqLworCQkJCQloZXZjX2VsLT5kZWNvZGluZ19waWMgPSBOVUxMOworCQkJCQloZXZjLT5ub19zd2l0Y2hfZHZsYXllcl9jb3VudCA9IDA7CisJCQkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0RWKQorCQkJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkJIm5vIGVsIGFueW1vcmUsIGZsdXNoX291dHB1dCBlbFxuIik7CisJCQkJfQorCQkJfQorCQkJaGV2Yy0+ZGVjb2RlZF9wb2MgPSBoZXZjLT5jdXJyX1BPQzsKKwkJCWhldmMtPmRlY29kaW5nX3BpYyA9IE5VTEw7CisJCQloZXZjLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworCQkJYW1oZXZjX3N0b3AoKTsKKwkJCXJlc2V0X3Byb2Nlc3NfdGltZShoZXZjKTsKKwkJCWlmIChhdXhfZGF0YV9pc19hdmFpYmxlKGhldmMpKQorCQkJCWRvbGJ5X2dldF9tZXRhKGhldmMpOworCQkJaWYoaGV2Yy0+Y3VyX3BpYyAmJiBoZXZjLT5jdXJfcGljLT5zbGljZV90eXBlID09IDIgJiYKKwkJCQloZXZjLT52Zl9wcmVfY291bnQgPT0gMCkgeworCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJCSJmaXJzdCBzbGljZV90eXBlICV4IG5vX3N3aXRjaF9kdmxheWVyX2NvdW50ICV4XG4iLAorCQkJCQkJaGV2Yy0+Y3VyX3BpYy0+c2xpY2VfdHlwZSwKKwkJCQkJCWhldmMtPm5vX3N3aXRjaF9kdmxheWVyX2NvdW50KTsKKwkJCQlnb3RvICBmb3JjZV9vdXRwdXQ7CisJCQl9CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmhldmMtPndvcmspOworCQl9CisKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworI2VuZGlmCisJfQorCisjZW5kaWYKKworCWlmIChkZWNfc3RhdHVzID09IEhFVkNfU0VJX0RBVCkgeworCQlpZiAoIWhldmMtPm1faW5zX2ZsYWcpIHsKKwkJCWludCBwYXlsb2FkX3R5cGUgPQorCQkJCVJFQURfSFJFRyhDVVJfTkFMX1VOSVRfVFlQRSkgJiAweGZmZmY7CisJCQlpbnQgcGF5bG9hZF9zaXplID0KKwkJCQkoUkVBRF9IUkVHKENVUl9OQUxfVU5JVF9UWVBFKSA+PiAxNikgJiAweGZmZmY7CisJCQkJcHJvY2Vzc19uYWxfc2VpKGhldmMsCisJCQkJCXBheWxvYWRfdHlwZSwgcGF5bG9hZF9zaXplKTsKKwkJfQorCQlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIEhFVkNfU0VJX0RBVF9ET05FKTsKKwl9IGVsc2UgaWYgKGRlY19zdGF0dXMgPT0gSEVWQ19OQUxfU0VBUkNIX0RPTkUpIHsKKwkJaW50IG5hbHR5cGUgPSBSRUFEX0hSRUcoQ1VSX05BTF9VTklUX1RZUEUpOworCQlpbnQgcGFyc2VfdHlwZSA9IEhFVkNfRElTQ0FSRF9OQUw7CisKKwkJaGV2Yy0+ZXJyb3Jfd2F0Y2hkb2dfY291bnQgPSAwOworCQloZXZjLT5lcnJvcl9za2lwX25hbF93dF9jbnQgPSAwOworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwkJaWYgKGhldmMtPm1faW5zX2ZsYWcpCisJCQlyZXNldF9wcm9jZXNzX3RpbWUoaGV2Yyk7CisjZW5kaWYKKwkJaWYgKHNsaWNlX3BhcnNlX2JlZ2luID4gMCAmJgorCQkJZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19ESVNDQVJEX05BTCkgeworCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSJuYWwgdHlwZSAlZCwgZGlzY2FyZCAlZFxuIiwgbmFsdHlwZSwKKwkJCQlzbGljZV9wYXJzZV9iZWdpbik7CisJCQlpZiAobmFsdHlwZSA8PSBOQUxfVU5JVF9DT0RFRF9TTElDRV9DUkEpCisJCQkJc2xpY2VfcGFyc2VfYmVnaW4tLTsKKwkJfQorCQlpZiAobmFsdHlwZSA9PSBOQUxfVU5JVF9FT1MpIHsKKwkJCXN0cnVjdCBQSUNfcyAqcGljOworCQkJYm9vbCBlb3NfaW5faGVhZCA9IGZhbHNlOworCisJCQloZXZjX3ByaW50KGhldmMsIDAsICJnZXQgTkFMX1VOSVRfRU9TLCBmbHVzaCBvdXRwdXRcbiIpOworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJCQlpZiAoKHZkZWNfZHVhbCh2ZGVjKSkgJiYgYXV4X2RhdGFfaXNfYXZhaWJsZShoZXZjKSkgeworCQkJCWlmIChoZXZjLT5kZWNvZGluZ19waWMpCisJCQkJCWRvbGJ5X2dldF9tZXRhKGhldmMpOworCQkJfQorI2VuZGlmCisJCQkvKkRldGVjdHMgZnJhbWUgd2hldGhlciBoYXMgYW4gb3ZlciBkZWNvZGUgZXJyb3IqLworCQkJaWYgKHZkZWMtPm1hc3RlciA9PSBOVUxMICYmIHZkZWMtPnNsYXZlID09IE5VTEwgJiYKKwkJCQkJaGV2Yy0+ZW1wdHlfZmxhZyA9PSAwICYmIGlucHV0X3N0cmVhbV9iYXNlZCh2ZGVjKSkgeworCQkJCQloZXZjLT5vdmVyX2RlY29kZSA9CisJCQkJCQkoUkVBRF9WUkVHKEhFVkNfU0hJRlRfU1RBVFVTKSA+PiAxNSkgJiAweDE7CisJCQkJCWlmIChoZXZjLT5vdmVyX2RlY29kZSkKKwkJCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJCQkiISEhT3ZlciBkZWNvZGUgJWRcbiIsIF9fTElORV9fKTsKKwkJCX0KKwkJCWNoZWNrX3BpY19kZWNvZGVkX2Vycm9yKGhldmMsCisJCQkJaGV2Yy0+cGljX2RlY29kZWRfbGN1X2lkeCk7CisJCQlwaWMgPSBnZXRfcGljX2J5X1BPQyhoZXZjLCBoZXZjLT5jdXJyX1BPQyk7CisJCQloZXZjLT5jdXJyX1BPQyA9IElOVkFMSURfUE9DOworCQkJLyogYWRkIHRvIGZpeCBSQVBfQl9Cb3NzZW5fMSAqLworCQkJaGV2Yy0+bV9wb2NSYW5kb21BY2Nlc3MgPSBNQVhfSU5UOworCQkJZmx1c2hfb3V0cHV0KGhldmMsIHBpYyk7CisJCQljbGVhcl9wb2NfZmxhZyhoZXZjKTsKKwkJCWlmIChpbnB1dF9mcmFtZV9iYXNlZCh2ZGVjKSkgeworCQkJCXUzMiBzaGlmdGJ5dGUgPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKTsKKwkJCQlpZiAoc2hpZnRieXRlIDwgMHg4ICYmIChoZXZjLT5kZWNvZGVfc2l6ZSAtIHNoaWZ0Ynl0ZSkgPiAweDEwMCkgeworCQkJCQloZXZjX3ByaW50KGhldmMsIDAsIiBzaGlmdGJ5dGVzIDB4JXggIGRlY29kZV9zaXplIDB4JXhcbiIsIHNoaWZ0Ynl0ZSwgaGV2Yy0+ZGVjb2RlX3NpemUpOworCQkJCQllb3NfaW5faGVhZCA9IHRydWU7CisJCQkJfQorCQkJfQorCQkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCBIRVZDX0RJU0NBUkRfTkFMKTsKKwkJCS8qIEludGVycnVwdCBBbXJpc2MgdG8gZXhjdXRlICovCisJCQlXUklURV9WUkVHKEhFVkNfTUNQVV9JTlRSX1JFUSwgQU1SSVNDX01BSU5fUkVRKTsKKworCQkJLyogZW9zIGlzIGluIHRoZSBoZWFkIG9mIHRoZSBjaHVuayBhbmQgZm9sbG93ZWQgYnkgc3BzL3Bwcy9JRFIKKwkJCSAgKiBzbyBuZWVkIHRvIGdvIG9uIGRlY29kaW5nCisJCQkgICovCisJCQlpZiAoZW9zX2luX2hlYWQpCisJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQkJaWYgKGhldmMtPm1faW5zX2ZsYWcpIHsKKwkJCQloZXZjLT5kZWNvZGVkX3BvYyA9IElOVkFMSURfUE9DOyAvKgorCQkJCQlhbHJlYWR5IGNhbGwgZmx1c2hfb3V0cHV0Ki8KKwkJCQloZXZjLT5kZWNvZGluZ19waWMgPSBOVUxMOworCQkJCWhldmMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJCQkJYW1oZXZjX3N0b3AoKTsKKworCQkJCXZkZWNfc2NoZWR1bGVfd29yaygmaGV2Yy0+d29yayk7CisJCQl9CisjZW5kaWYKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCisJCWlmICgKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCQkoIWhldmMtPm1faW5zX2ZsYWcpICYmCisjZW5kaWYKKwkJCWhldmMtPmVycm9yX3NraXBfbmFsX2NvdW50ID4gMCkgeworCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSJuYWwgdHlwZSAlZCwgZGlzY2FyZCAlZFxuIiwgbmFsdHlwZSwKKwkJCQloZXZjLT5lcnJvcl9za2lwX25hbF9jb3VudCk7CisJCQloZXZjLT5lcnJvcl9za2lwX25hbF9jb3VudC0tOworCQkJaWYgKGhldmMtPmVycm9yX3NraXBfbmFsX2NvdW50ID09IDApIHsKKwkJCQloZXZjX3JlY292ZXIoaGV2Yyk7CisJCQkJaGV2Yy0+ZXJyb3JfZmxhZyA9IDA7CisJCQkJaWYgKChlcnJvcl9oYW5kbGVfcG9saWN5ICYgMHgyKSA9PSAwKSB7CisJCQkJCWhldmMtPmhhdmVfdnBzID0gMTsKKwkJCQkJaGV2Yy0+aGF2ZV9zcHMgPSAxOworCQkJCQloZXZjLT5oYXZlX3BwcyA9IDE7CisJCQkJfQorCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCX0KKwkJfSBlbHNlIGlmIChuYWx0eXBlID09IE5BTF9VTklUX1ZQUykgeworCQkJCXBhcnNlX3R5cGUgPSBIRVZDX05BTF9VTklUX1ZQUzsKKwkJCQloZXZjLT5oYXZlX3ZwcyA9IDE7CisjaWZkZWYgRVJST1JfSEFORExFX0RFQlVHCisJCQkJaWYgKGRiZ19uYWxfc2tpcF9mbGFnICYgMSkKKwkJCQkJcGFyc2VfdHlwZSA9IEhFVkNfRElTQ0FSRF9OQUw7CisjZW5kaWYKKwkJfSBlbHNlIGlmIChoZXZjLT5oYXZlX3ZwcykgeworCQkJaWYgKG5hbHR5cGUgPT0gTkFMX1VOSVRfU1BTKSB7CisJCQkJcGFyc2VfdHlwZSA9IEhFVkNfTkFMX1VOSVRfU1BTOworCQkJCWhldmMtPmhhdmVfc3BzID0gMTsKKyNpZmRlZiBFUlJPUl9IQU5ETEVfREVCVUcKKwkJCQlpZiAoZGJnX25hbF9za2lwX2ZsYWcgJiAyKQorCQkJCQlwYXJzZV90eXBlID0gSEVWQ19ESVNDQVJEX05BTDsKKyNlbmRpZgorCQkJfSBlbHNlIGlmIChuYWx0eXBlID09IE5BTF9VTklUX1BQUykgeworCQkJCXBhcnNlX3R5cGUgPSBIRVZDX05BTF9VTklUX1BQUzsKKwkJCQloZXZjLT5oYXZlX3BwcyA9IDE7CisjaWZkZWYgRVJST1JfSEFORExFX0RFQlVHCisJCQkJaWYgKGRiZ19uYWxfc2tpcF9mbGFnICYgNCkKKwkJCQkJcGFyc2VfdHlwZSA9IEhFVkNfRElTQ0FSRF9OQUw7CisjZW5kaWYKKwkJCX0gZWxzZSBpZiAoaGV2Yy0+aGF2ZV9zcHMgJiYgaGV2Yy0+aGF2ZV9wcHMpIHsKKwkJCQlpbnQgc2VnID0gSEVWQ19OQUxfVU5JVF9DT0RFRF9TTElDRV9TRUdNRU5UOworCisJCQkJaWYgKChuYWx0eXBlID09IE5BTF9VTklUX0NPREVEX1NMSUNFX0lEUikgfHwKKwkJCQkJKG5hbHR5cGUgPT0KKwkJCQkJTkFMX1VOSVRfQ09ERURfU0xJQ0VfSURSX05fTFApCisJCQkJCXx8IChuYWx0eXBlID09CisJCQkJCQlOQUxfVU5JVF9DT0RFRF9TTElDRV9DUkEpCisJCQkJCXx8IChuYWx0eXBlID09CisJCQkJCQlOQUxfVU5JVF9DT0RFRF9TTElDRV9CTEEpCisJCQkJCXx8IChuYWx0eXBlID09CisJCQkJCQlOQUxfVU5JVF9DT0RFRF9TTElDRV9CTEFOVCkKKwkJCQkJfHwgKG5hbHR5cGUgPT0KKwkJCQkJCU5BTF9VTklUX0NPREVEX1NMSUNFX0JMQV9OX0xQKQorCQkJCSkgeworCQkJCQlpZiAoc2xpY2VfcGFyc2VfYmVnaW4gPiAwKSB7CisJCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCQkiZGlzY2FyZCAlZCwgZm9yIGRlYnVnZ2luZ1xuIiwKKwkJCQkJCSBzbGljZV9wYXJzZV9iZWdpbik7CisJCQkJCQlzbGljZV9wYXJzZV9iZWdpbi0tOworCQkJCQl9IGVsc2UgeworCQkJCQkJcGFyc2VfdHlwZSA9IHNlZzsKKwkJCQkJfQorCQkJCQloZXZjLT5oYXZlX3ZhbGlkX3N0YXJ0X3NsaWNlID0gMTsKKwkJCQl9IGVsc2UgaWYgKG5hbHR5cGUgPD0KKwkJCQkJCU5BTF9VTklUX0NPREVEX1NMSUNFX0NSQQorCQkJCQkJJiYgKGhldmMtPmhhdmVfdmFsaWRfc3RhcnRfc2xpY2UKKwkJCQkJCXx8IChoZXZjLT5QQl9za2lwX21vZGUgIT0gMykpKSB7CisJCQkJCWlmIChzbGljZV9wYXJzZV9iZWdpbiA+IDApIHsKKwkJCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJCSJkaXNjYXJkICVkLCBkZFxuIiwKKwkJCQkJCXNsaWNlX3BhcnNlX2JlZ2luKTsKKwkJCQkJCXNsaWNlX3BhcnNlX2JlZ2luLS07CisJCQkJCX0gZWxzZQorCQkJCQkJcGFyc2VfdHlwZSA9IHNlZzsKKworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoaGV2Yy0+aGF2ZV92cHMgJiYgaGV2Yy0+aGF2ZV9zcHMgJiYgaGV2Yy0+aGF2ZV9wcHMKKwkJCSYmIGhldmMtPmhhdmVfdmFsaWRfc3RhcnRfc2xpY2UgJiYKKwkJCWhldmMtPmVycm9yX2ZsYWcgPT0gMCkgeworCQkJaWYgKChnZXRfZGJnX2ZsYWcoaGV2YykgJgorCQkJCUgyNjVfREVCVUdfTUFOX1NFQVJDSF9OQUwpID09IDAKKwkJCQkvKiAmJiAoIWhldmMtPm1faW5zX2ZsYWcpKi8pIHsKKwkJCQkvKiBhdW90IHBhcnNlciBOQUw7IGRvIG5vdCBjaGVjaworCQkJCSAqdnBzL3Nwcy9wcHMvaWRyCisJCQkJICovCisJCQkJV1JJVEVfVlJFRyhOQUxfU0VBUkNIX0NUTCwgMHgyKTsKKwkJCX0KKworCQkJaWYgKChnZXRfZGJnX2ZsYWcoaGV2YykgJgorCQkJCUgyNjVfREVCVUdfTk9fRU9TX1NFQVJDSF9ET05FKQorI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJCQkJfHwgdmRlYy0+bWFzdGVyCisJCQkJfHwgdmRlYy0+c2xhdmUKKyNlbmRpZgorCQkJCSkgeworCQkJCVdSSVRFX1ZSRUcoTkFMX1NFQVJDSF9DVEwsCisJCQkJCQlSRUFEX1ZSRUcoTkFMX1NFQVJDSF9DVEwpIHwKKwkJCQkJCTB4MTAwMDApOworCQkJfQorCQkJV1JJVEVfVlJFRyhOQUxfU0VBUkNIX0NUTCwKKwkJCQlSRUFEX1ZSRUcoTkFMX1NFQVJDSF9DVEwpCisJCQkJfCAoKHBhcnNlcl9zZWlfZW5hYmxlICYgMHg3KSA8PCAxNykpOworLyojaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04qLworCQkJV1JJVEVfVlJFRyhOQUxfU0VBUkNIX0NUTCwKKwkJCQlSRUFEX1ZSRUcoTkFMX1NFQVJDSF9DVEwpIHwKKwkJCQkoKHBhcnNlcl9kb2xieV92aXNpb25fZW5hYmxlICYgMHgxKSA8PCAyMCkpOworLyojZW5kaWYqLworCQkJY29uZmlnX2RlY29kZV9tb2RlKGhldmMpOworCQl9CisKKwkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKSB7CisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJIm5hbHR5cGUgPSAlZCAgcGFyc2VfdHlwZSAlZFxuICVkICVkICVkICVkXG4iLAorCQkJCW5hbHR5cGUsIHBhcnNlX3R5cGUsIGhldmMtPmhhdmVfdnBzLAorCQkJCWhldmMtPmhhdmVfc3BzLCBoZXZjLT5oYXZlX3BwcywKKwkJCQloZXZjLT5oYXZlX3ZhbGlkX3N0YXJ0X3NsaWNlKTsKKwkJfQorCisJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgcGFyc2VfdHlwZSk7CisJCS8qIEludGVycnVwdCBBbXJpc2MgdG8gZXhjdXRlICovCisJCVdSSVRFX1ZSRUcoSEVWQ19NQ1BVX0lOVFJfUkVRLCBBTVJJU0NfTUFJTl9SRVEpOworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwkJaWYgKGhldmMtPm1faW5zX2ZsYWcpCisJCQlzdGFydF9wcm9jZXNzX3RpbWUoaGV2Yyk7CisjZW5kaWYKKwl9IGVsc2UgaWYgKGRlY19zdGF0dXMgPT0gSEVWQ19TTElDRV9TRUdNRU5UX0RPTkUpIHsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCWlmIChoZXZjLT5tX2luc19mbGFnKSB7CisJCQlyZXNldF9wcm9jZXNzX3RpbWUoaGV2Yyk7CisJCQlyZWFkX2RlY29kZV9pbmZvKGhldmMpOworCisJCX0KKyNlbmRpZgorCQlpZiAoaGV2Yy0+c3RhcnRfZGVjb2RpbmdfdGltZSA+IDApIHsKKwkJCXUzMiBwcm9jZXNzX3RpbWUgPSAxMDAwKgorCQkJCShqaWZmaWVzIC0gaGV2Yy0+c3RhcnRfZGVjb2RpbmdfdGltZSkvSFo7CisJCQlpZiAocHJvY2Vzc190aW1lID4gbWF4X2RlY29kaW5nX3RpbWUpCisJCQkJbWF4X2RlY29kaW5nX3RpbWUgPSBwcm9jZXNzX3RpbWU7CisJCX0KKworCQloZXZjLT5lcnJvcl93YXRjaGRvZ19jb3VudCA9IDA7CisJCWlmIChoZXZjLT5waWNfbGlzdF9pbml0X2ZsYWcgPT0gMikgeworCQkJaGV2Yy0+cGljX2xpc3RfaW5pdF9mbGFnID0gMzsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwgInNldCBwaWNfbGlzdF9pbml0X2ZsYWcgdG8gM1xuIik7CisJCQlpZiAoaGV2Yy0+a3BpX2ZpcnN0X2lfY29tbWluZyA9PSAwKSB7CisJCQkJaGV2Yy0+a3BpX2ZpcnN0X2lfY29tbWluZyA9IDE7CisJCQkJcHJfZGVidWcoIlt2ZGVjX2twaV1bJXNdIEZpcnN0IEkgZnJhbWUgY29taW5nLlxuIiwKKwkJCQkJX19mdW5jX18pOworCQkJfQorCQl9IGVsc2UgaWYgKGhldmMtPndhaXRfYnVmID09IDApIHsKKwkJCXUzMiB2dWlfdGltZV9zY2FsZTsKKwkJCXUzMiB2dWlfbnVtX3VuaXRzX2luX3RpY2s7CisJCQl1bnNpZ25lZCBjaGFyIHJlY29uZmlnX2ZsYWcgPSAwOworCisJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19TRU5EX1BBUkFNX1dJVEhfUkVHKQorCQkJCWdldF9ycG1fcGFyYW0oJmhldmMtPnBhcmFtKTsKKwkJCWVsc2UgeworCQkJCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLmRlY29kZV9oZWFkZXJfbWVtb3J5X3RpbWVfbmFtZSwgVFJBQ0VfSEVBREVSX1JQTV9TVEFSVCk7CisJCQkJZm9yIChpID0gMDsgaSA8IChSUE1fRU5EIC0gUlBNX0JFR0lOKTsgaSArPSA0KSB7CisJCQkJCWludCBpaTsKKworCQkJCQlmb3IgKGlpID0gMDsgaWkgPCA0OyBpaSsrKSB7CisJCQkJCQloZXZjLT5wYXJhbS5sLmRhdGFbaSArIGlpXSA9CisJCQkJCQkJaGV2Yy0+cnBtX3B0cltpICsgMworCQkJCQkJCS0gaWldOworCQkJCQl9CisJCQkJfQorCQkJCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLmRlY29kZV9oZWFkZXJfbWVtb3J5X3RpbWVfbmFtZSwgVFJBQ0VfSEVBREVSX1JQTV9FTkQpOworI2lmZGVmIFNFTkRfTE1FTV9XSVRIX1JQTQorCQkJCWNoZWNrX2hlYWRfZXJyb3IoaGV2Yyk7CisjZW5kaWYKKwkJCX0KKwkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUl9NT1JFKSB7CisJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkicnBtX3BhcmFtOiAoJWQpXG4iLCBoZXZjLT5zbGljZV9pZHgpOworCQkJCWhldmMtPnNsaWNlX2lkeCsrOworCQkJCWZvciAoaSA9IDA7IGkgPCAoUlBNX0VORCAtIFJQTV9CRUdJTik7IGkrKykgeworCQkJCQloZXZjX3ByaW50X2NvbnQoaGV2YywgMCwKKwkJCQkJCSIlMDR4ICIsIGhldmMtPnBhcmFtLmwuZGF0YVtpXSk7CisJCQkJCWlmICgoKGkgKyAxKSAmIDB4ZikgPT0gMCkKKwkJCQkJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLCAiXG4iKTsKKwkJCQl9CisKKwkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCSJ2dWlfdGltaW5nX2luZm86ICV4LCAleCwgJXgsICV4XG4iLAorCQkJCQloZXZjLT5wYXJhbS5wLnZ1aV9udW1fdW5pdHNfaW5fdGlja19oaSwKKwkJCQkJaGV2Yy0+cGFyYW0ucC52dWlfbnVtX3VuaXRzX2luX3RpY2tfbG8sCisJCQkJCWhldmMtPnBhcmFtLnAudnVpX3RpbWVfc2NhbGVfaGksCisJCQkJCWhldmMtPnBhcmFtLnAudnVpX3RpbWVfc2NhbGVfbG8pOworCQkJfQorCisJCQlpZiAoaGV2Yy0+aXNfdXNlZF92NGwpIHsKKwkJCQlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaGV2Yy0+djRsMl9jdHgpOworCQkJCWlmICghdjRsX3Jlc19jaGFuZ2UoaGV2YywgJmhldmMtPnBhcmFtKSkgeworCQkJCQlpZiAoY3R4LT5wYXJhbV9zZXRzX2Zyb21fdWNvZGUgJiYgIWhldmMtPnY0bF9wYXJhbXNfcGFyc2VkKSB7CisJCQkJCQlzdHJ1Y3QgYW1sX3ZkZWNfcHNfaW5mb3MgcHM7CisJCQkJCQlpbnQgd2lkdGggPSBoZXZjLT5wYXJhbS5wLnBpY193aWR0aF9pbl9sdW1hX3NhbXBsZXM7CisJCQkJCQlpbnQgaGVpZ2h0ID0gaGV2Yy0+cGFyYW0ucC5waWNfaGVpZ2h0X2luX2x1bWFfc2FtcGxlczsKKwkJCQkJCWludCBsb2cgPSBoZXZjLT5wYXJhbS5wLmxvZzJfbWluX2NvZGluZ19ibG9ja19zaXplX21pbnVzMzsKKwkJCQkJCWludCBsb2dfcyA9IGhldmMtPnBhcmFtLnAubG9nMl9kaWZmX21heF9taW5fY29kaW5nX2Jsb2NrX3NpemU7CisKKwkJCQkJCWhldmMtPnBpY193ID0gd2lkdGg7CisJCQkJCQloZXZjLT5waWNfaCA9IGhlaWdodDsKKwkJCQkJCWhldmMtPmxjdV9zaXplID0gMSA8PCAobG9nICsgMyArIGxvZ19zKTsKKworCQkJCQkJcHJfZGVidWcoInNldCB1Y29kZSBwYXJzZVxuIik7CisJCQkJCQlpZiAoZ2V0X3ZhbGlkX2RvdWJsZV93cml0ZV9tb2RlKGhldmMpICE9IDE2KSB7CisJCQkJCQkJc3RydWN0IHZkZWNfY29tcF9idWZfaW5mbyBpbmZvOworCisJCQkJCQkJZ2V0X2NvbXBfYnVmX2luZm8oaGV2YywgJmluZm8pOworCQkJCQkJCXZkZWNfdjRsX3NldF9jb21wX2J1Zl9pbmZvKGN0eCwgJmluZm8pOworCQkJCQkJfQorCisJCQkJCQl2aDI2NV9nZXRfcHNfaW5mbyhoZXZjLCAmaGV2Yy0+cGFyYW0sICZwcyk7CisJCQkJCQkvKm5vdGljZSB0aGUgdjRsMiBjb2RlYy4qLworCQkJCQkJdmRlY192NGxfc2V0X3BzX2luZm9zKGN0eCwgJnBzKTsKKwkJCQkJCWhldmMtPnY0bF9wYXJhbXNfcGFyc2VkID0gdHJ1ZTsKKwkJCQkJCWhldmMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0FHQUlOOworCQkJCQkJYW1oZXZjX3N0b3AoKTsKKwkJCQkJCXJlc3RvcmVfZGVjb2RlX3N0YXRlKGhldmMpOworCQkJCQkJcmVzZXRfcHJvY2Vzc190aW1lKGhldmMpOworCQkJCQkJdmRlY19zY2hlZHVsZV93b3JrKCZoZXZjLT53b3JrKTsKKwkJCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCQkJfQorCQkJCX1lbHNlIHsKKwkJCQkJcHJfZGVidWcoInJlc29sdXRpb24gY2hhbmdlXG4iKTsKKwkJCQkJaGV2Yy0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfQUdBSU47CisJCQkJCWFtaGV2Y19zdG9wKCk7CisJCQkJCXJlc3RvcmVfZGVjb2RlX3N0YXRlKGhldmMpOworCQkJCQlyZXNldF9wcm9jZXNzX3RpbWUoaGV2Yyk7CisJCQkJCXZkZWNfc2NoZWR1bGVfd29yaygmaGV2Yy0+d29yayk7CisJCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCQl9CisJCQl9CisKKwkJCWlmICgKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCQkJCXZkZWMtPm1hc3RlciA9PSBOVUxMICYmCisJCQkJdmRlYy0+c2xhdmUgPT0gTlVMTCAmJgorI2VuZGlmCisJCQkJYXV4X2RhdGFfaXNfYXZhaWJsZShoZXZjKQorCQkJCSkgeworCisJCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmCisJCQkJCUgyNjVfREVCVUdfUFJJTlRfU0VJKQorCQkJCQlkdW1wX2F1eF9idWYoaGV2Yyk7CisJCQl9CisKKwkJCXZ1aV90aW1lX3NjYWxlID0KKwkJCQkodTMyKShoZXZjLT5wYXJhbS5wLnZ1aV90aW1lX3NjYWxlX2hpIDw8IDE2KSB8CisJCQkJaGV2Yy0+cGFyYW0ucC52dWlfdGltZV9zY2FsZV9sbzsKKwkJCXZ1aV9udW1fdW5pdHNfaW5fdGljayA9CisJCQkJKHUzMikoaGV2Yy0+cGFyYW0uCisJCQkJcC52dWlfbnVtX3VuaXRzX2luX3RpY2tfaGkgPDwgMTYpIHwKKwkJCQloZXZjLT5wYXJhbS4KKwkJCQlwLnZ1aV9udW1fdW5pdHNfaW5fdGlja19sbzsKKwkJCWlmIChoZXZjLT5iaXRfZGVwdGhfbHVtYSAhPQorCQkJCSgoaGV2Yy0+cGFyYW0ucC5iaXRfZGVwdGggJiAweGYpICsgOCkpIHsKKwkJCQlyZWNvbmZpZ19mbGFnID0gMTsKKwkJCQloZXZjX3ByaW50KGhldmMsIDAsICJCaXQgZGVwdGggbHVtYSA9ICVkXG4iLAorCQkJCQkoaGV2Yy0+cGFyYW0ucC5iaXRfZGVwdGggJiAweGYpICsgOCk7CisJCQl9CisJCQlpZiAoaGV2Yy0+Yml0X2RlcHRoX2Nocm9tYSAhPQorCQkJCSgoKGhldmMtPnBhcmFtLnAuYml0X2RlcHRoID4+IDQpICYgMHhmKSArIDgpKSB7CisJCQkJcmVjb25maWdfZmxhZyA9IDE7CisJCQkJaGV2Y19wcmludChoZXZjLCAwLCAiQml0IGRlcHRoIGNocm9tYSA9ICVkXG4iLAorCQkJCQkoKGhldmMtPnBhcmFtLnAuYml0X2RlcHRoID4+IDQpICYKKwkJCQkJMHhmKSArIDgpOworCQkJfQorCQkJaGV2Yy0+Yml0X2RlcHRoX2x1bWEgPQorCQkJCShoZXZjLT5wYXJhbS5wLmJpdF9kZXB0aCAmIDB4ZikgKyA4OworCQkJaGV2Yy0+Yml0X2RlcHRoX2Nocm9tYSA9CisJCQkJKChoZXZjLT5wYXJhbS5wLmJpdF9kZXB0aCA+PiA0KSAmIDB4ZikgKyA4OworCQkJYml0X2RlcHRoX2x1bWEgPSBoZXZjLT5iaXRfZGVwdGhfbHVtYTsKKwkJCWJpdF9kZXB0aF9jaHJvbWEgPSBoZXZjLT5iaXRfZGVwdGhfY2hyb21hOworI2lmZGVmIFNVUFBPUlRfMTBCSVQKKwkJCWlmIChoZXZjLT5iaXRfZGVwdGhfbHVtYSA9PSA4ICYmCisJCQkJaGV2Yy0+Yml0X2RlcHRoX2Nocm9tYSA9PSA4ICYmCisJCQkJZW5hYmxlX21lbV9zYXZpbmcpCisJCQkJaGV2Yy0+bWVtX3NhdmluZ19tb2RlID0gMTsKKwkJCWVsc2UKKwkJCQloZXZjLT5tZW1fc2F2aW5nX21vZGUgPSAwOworI2VuZGlmCisJCQlpZiAocmVjb25maWdfZmxhZyAmJgorCQkJCShnZXRfZG91YmxlX3dyaXRlX21vZGUoaGV2YykgJiAweDEwKSA9PSAwKQorCQkJCWluaXRfZGVjb2RlX2hlYWRfaHcoaGV2Yyk7CisKKwkJCWlmICgodnVpX3RpbWVfc2NhbGUgIT0gMCkKKwkJCQkmJiAodnVpX251bV91bml0c19pbl90aWNrICE9IDApKSB7CisJCQkJaGV2Yy0+ZnJhbWVfZHVyID0KKwkJCQkJZGl2X3U2NCg5NjAwMFVMTCAqCisJCQkJCQl2dWlfbnVtX3VuaXRzX2luX3RpY2ssCisJCQkJCQl2dWlfdGltZV9zY2FsZSk7CisJCQkJCWlmIChoZXZjLT5nZXRfZnJhbWVfZHVyICE9IHRydWUpCisJCQkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoCisJCQkJCQkmaGV2Yy0+bm90aWZ5X3dvcmspOworCisJCQkJaGV2Yy0+Z2V0X2ZyYW1lX2R1ciA9IHRydWU7CisJCQkJLy9oZXZjLT5ndnMtPmZyYW1lX2R1ciA9IGhldmMtPmZyYW1lX2R1cjsKKwkJCX0KKworCQkJaWYgKGhldmMtPnZpZGVvX3NpZ25hbF90eXBlICE9CisJCQkJKChoZXZjLT5wYXJhbS5wLnZpZGVvX3NpZ25hbF90eXBlIDw8IDE2KQorCQkJCXwgaGV2Yy0+cGFyYW0ucC5jb2xvcl9kZXNjcmlwdGlvbikpIHsKKwkJCQl1MzIgdiA9IGhldmMtPnBhcmFtLnAudmlkZW9fc2lnbmFsX3R5cGU7CisJCQkJdTMyIGMgPSBoZXZjLT5wYXJhbS5wLmNvbG9yX2Rlc2NyaXB0aW9uOworI2lmIDAKKwkJCWlmICh2ICYgMHgyMDAwKSB7CisJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSJ2aWRlb19zaWduYWxfdHlwZSBwcmVzZW50OlxuIik7CisJCQkJaGV2Y19wcmludChoZXZjLCAwLCAiICVzICVzXG4iLAorCQkJCXZpZGVvX2Zvcm1hdF9uYW1lc1sodiA+PiAxMCkgJiA3XSwKKwkJCQkJKCh2ID4+IDkpICYgMSkgPworCQkJCQkiZnVsbF9yYW5nZSIgOiAibGltaXRlZCIpOworCQkJCWlmICh2ICYgMHgxMDApIHsKKwkJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkiIGNvbG9yX2Rlc2NyaXB0aW9uIHByZXNlbnQ6XG4iKTsKKwkJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkiICBjb2xvcl9wcmltYXJpZSA9ICVzXG4iLAorCQkJCQljb2xvcl9wcmltYXJpZXNfbmFtZXMKKwkJCQkJW3YgJiAweGZmXSk7CisJCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJIiAgdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWMgPSAlc1xuIiwKKwkJCQkJdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzX25hbWVzCisJCQkJCVsoYyA+PiA4KSAmIDB4ZmZdKTsKKwkJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkiICBtYXRyaXhfY29lZmZpY2llbnQgPSAlc1xuIiwKKwkJCQkJbWF0cml4X2NvZWZmc19uYW1lc1tjICYgMHhmZl0pOworCQkJCX0KKwkJCX0KKyNlbmRpZgorCQloZXZjLT52aWRlb19zaWduYWxfdHlwZSA9ICh2IDw8IDE2KSB8IGM7CisJCXZpZGVvX3NpZ25hbF90eXBlID0gaGV2Yy0+dmlkZW9fc2lnbmFsX3R5cGU7CisJfQorCisJaWYgKHVzZV9jbWEgJiYKKwkJKGhldmMtPnBhcmFtLnAuc2xpY2Vfc2VnbWVudF9hZGRyZXNzID09IDApCisJCSYmIChoZXZjLT5waWNfbGlzdF9pbml0X2ZsYWcgPT0gMCkpIHsKKwkJaW50IGxvZyA9IGhldmMtPnBhcmFtLnAubG9nMl9taW5fY29kaW5nX2Jsb2NrX3NpemVfbWludXMzOworCQlpbnQgbG9nX3MgPSBoZXZjLT5wYXJhbS5wLmxvZzJfZGlmZl9tYXhfbWluX2NvZGluZ19ibG9ja19zaXplOworCisJCWhldmMtPnBpY193ID0gaGV2Yy0+cGFyYW0ucC5waWNfd2lkdGhfaW5fbHVtYV9zYW1wbGVzOworCQloZXZjLT5waWNfaCA9IGhldmMtPnBhcmFtLnAucGljX2hlaWdodF9pbl9sdW1hX3NhbXBsZXM7CisJCWhldmMtPmxjdV9zaXplID0gMSA8PCAobG9nICsgMyArIGxvZ19zKTsKKwkJaGV2Yy0+bGN1X3NpemVfbG9nMiA9IGxvZzJpKGhldmMtPmxjdV9zaXplKTsKKwkJaWYgKHBlcmZvcm1hbmNlX3Byb2ZpbGUgJiYoICghaXNfb3ZlcnNpemUoaGV2Yy0+cGljX3csIGhldmMtPnBpY19oKSkgJiYgSVNfOEtfU0laRShoZXZjLT5waWNfdyxoZXZjLT5waWNfaCkpKQorCQkJaGV2Yy0+cGVyZm9ybWFuY2VfcHJvZmlsZSA9IDE7CisJCWVsc2UKKwkJCWhldmMtPnBlcmZvcm1hbmNlX3Byb2ZpbGUgPSAwOworCQloZXZjX3ByaW50KGhldmMsIDAsICJoZXZjLT5wZXJmb3JtYW5jZV9wcm9maWxlICVkXG4iLCBoZXZjLT5wZXJmb3JtYW5jZV9wcm9maWxlKTsKKwkJaWYgKGhldmMtPnBpY193ID09IDAgfHwgaGV2Yy0+cGljX2ggPT0gMAorCQkJCQkJfHwgaGV2Yy0+bGN1X3NpemUgPT0gMAorCQkJCQkJfHwgaXNfb3ZlcnNpemUoaGV2Yy0+cGljX3csIGhldmMtPnBpY19oKQorCQkJCQkJfHwgIGhldmNfc2tpcF9uYWwoaGV2YykpIHsKKwkJCS8qIHNraXAgc2VhcmNoIG5leHQgc3RhcnQgY29kZSAqLworCQkJV1JJVEVfVlJFRyhIRVZDX1dBSVRfRkxBRywgUkVBRF9WUkVHKEhFVkNfV0FJVF9GTEFHKQorCQkJCQkJJiAofjB4MikpOworCQkJaWYgICgoaGV2Yy0+cGljX2ggPT0gOTYpICYmIChoZXZjLT5waWNfdyAgPT0gMTYwKSkKKwkJCQloZXZjLT5za2lwX25hbF9jb3VudCsrOworCQkJaGV2Yy0+c2tpcF9mbGFnID0gMTsKKwkJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywJSEVWQ19BQ1RJT05fRE9ORSk7CisJCQkvKiBJbnRlcnJ1cHQgQW1yaXNjIHRvIGV4Y3V0ZSAqLworCQkJV1JJVEVfVlJFRyhIRVZDX01DUFVfSU5UUl9SRVEsCUFNUklTQ19NQUlOX1JFUSk7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQkJaWYgKGhldmMtPm1faW5zX2ZsYWcpCisJCQkJc3RhcnRfcHJvY2Vzc190aW1lKGhldmMpOworI2VuZGlmCisJCX0gZWxzZSB7CisJCQloZXZjLT5zcHNfbnVtX3Jlb3JkZXJfcGljc18wID0KKwkJCWhldmMtPnBhcmFtLnAuc3BzX251bV9yZW9yZGVyX3BpY3NfMDsKKwkJCWhldmMtPmlwX21vZGUgPSBoZXZjLT5sb3dfbGF0ZW5jeV9mbGFnID8gdHJ1ZSA6CisJCQkJCSghaGV2Yy0+c3BzX251bV9yZW9yZGVyX3BpY3NfMCAmJgorCQkJCQkhKHZkZWMtPnNsYXZlIHx8IHZkZWMtPm1hc3RlcikgJiYKKwkJCQkJIWRpc2FibGVfaXBfbW9kZSkgPyB0cnVlIDogZmFsc2U7CisJCQloZXZjLT5waWNfbGlzdF9pbml0X2ZsYWcgPSAxOworCQkJaWYgKCghSVNfNEtfU0laRShoZXZjLT5waWNfdywgaGV2Yy0+cGljX2gpKSAmJgorCQkJCSgoaGV2Yy0+cGFyYW0ucC5wcm9maWxlX2V0YyAmIDB4YykgPT0gMHg0KQorCQkJCSYmIChpbnRlcmxhY2VfZW5hYmxlICE9IDApKSB7CisJCQkJaGV2Yy0+ZG91YmxlX3dyaXRlX21vZGUgPSAxOworCQkJCWhldmMtPm1tdV9lbmFibGUgPSAxOworCQkJCWhldmMtPmludGVybGFjZV9mbGFnID0gMTsKKwkJCQloZXZjLT5mcmFtZV9hciA9IChoZXZjLT5waWNfaCAqIDB4MTAwIC8gaGV2Yy0+cGljX3cpICogMjsKKwkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCSJpbnRlcmxhY2UgKCVkLCAlZCksIHByb2ZpbGVfZXRjICV4LCBhciAweCV4LCBkdyAlZFxuIiwKKwkJCQkJaGV2Yy0+cGljX3csIGhldmMtPnBpY19oLCBoZXZjLT5wYXJhbS5wLnByb2ZpbGVfZXRjLCBoZXZjLT5mcmFtZV9hciwKKwkJCQkJZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGhldmMpKTsKKwkJCQkvKiBXaGVuIGR3IGNoYW5nZWQgZnJvbSAweDEwIHRvIDEsIHRoZSBtbXVfYm94IGlzIE5VTEwgKi8KKwkJCQlpZiAoIWhldmMtPm1tdV9ib3ggJiYgaW5pdF9tbXVfYnVmZmVycyhoZXZjLCAxKSAhPSAwKSB7CisJCQkJCWhldmMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0ZPUkNFX0VYSVQ7CisJCQkJCWhldmMtPmZhdGFsX2Vycm9yIHw9CisJCQkJCQlERUNPREVSX0ZBVEFMX0VSUk9SX05PX01FTTsKKwkJCQkJdmRlY19zY2hlZHVsZV93b3JrKCZoZXZjLT53b3JrKTsKKwkJCQkJaGV2Y19wcmludChoZXZjLAorCQkJCQkJMCwgImNhbiBub3QgYWxsb2MgbW11IGJveCwgZm9yY2UgZXhpdFxuIik7CisJCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCQl9CisJCQkJaWYgKGhldmMtPmZyYW1lX21tdV9tYXBfYWRkciA9PSBOVUxMKSB7CisJCQkJCWhldmMtPmZyYW1lX21tdV9tYXBfYWRkciA9CisJCQkJCQlkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCQkJZ2V0X2ZyYW1lX21tdV9tYXBfc2l6ZSgpLAorCQkJCQkJJmhldmMtPmZyYW1lX21tdV9tYXBfcGh5X2FkZHIsIEdGUF9LRVJORUwpOworCQkJCQlpZiAoaGV2Yy0+ZnJhbWVfbW11X21hcF9hZGRyID09IE5VTEwpIHsKKwkJCQkJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvYyBjb3VudF9idWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCQkJfQorCQkJCQltZW1zZXQoaGV2Yy0+ZnJhbWVfbW11X21hcF9hZGRyLCAwLCBnZXRfZnJhbWVfbW11X21hcF9zaXplKCkpOworCQkJCX0KKwkJCX0KKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCQlpZiAoaGV2Yy0+bV9pbnNfZmxhZykgeworCQkJCXZkZWNfc2NoZWR1bGVfd29yaygmaGV2Yy0+d29yayk7CisJCQl9IGVsc2UKKyNlbmRpZgorCQkJCXVwKCZoMjY1X3NlbWEpOworCQkJaGV2Y19wcmludChoZXZjLCAwLCAic2V0IHBpY19saXN0X2luaXRfZmxhZyAxXG4iKTsKKwkJfQorCQlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9USFJFQURfSEVBRF9FTkQpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCit9CisJcmV0ID0KKwkJaGV2Y19zbGljZV9zZWdtZW50X2hlYWRlcl9wcm9jZXNzKGhldmMsCisJCQkmaGV2Yy0+cGFyYW0sIGRlY29kZV9waWNfYmVnaW4pOworCWlmIChyZXQgPCAwKSB7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQlpZiAoaGV2Yy0+bV9pbnNfZmxhZykgeworCQkJaGV2Yy0+d2FpdF9idWYgPSAwOworCQkJaGV2Yy0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfQUdBSU47CisJCQlhbWhldmNfc3RvcCgpOworCQkJcmVzdG9yZV9kZWNvZGVfc3RhdGUoaGV2Yyk7CisJCQlyZXNldF9wcm9jZXNzX3RpbWUoaGV2Yyk7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmhldmMtPndvcmspOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisjZWxzZQorCQk7CisjZW5kaWYKKwl9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisJCWlmICgoaGV2Yy0+bmV3X3BpYykgJiYgKGhldmMtPmN1cl9waWMpKSB7CisJCQloZXZjLT5jdXJfcGljLT5zdHJlYW1fb2Zmc2V0ID0KKwkJCVJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpOworCQkJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX09VVF9QVFMsCisJCQkJInJlYWQgc3RyZWFtX29mZnNldCA9IDB4JXhcbiIsCisJCQkJaGV2Yy0+Y3VyX3BpYy0+c3RyZWFtX29mZnNldCk7CisJCQloZXZjLT5jdXJfcGljLT5hc3BlY3RfcmF0aW9faWRjID0KKwkJCQloZXZjLT5wYXJhbS5wLmFzcGVjdF9yYXRpb19pZGM7CisJCQloZXZjLT5jdXJfcGljLT5zYXJfd2lkdGggPQorCQkJCWhldmMtPnBhcmFtLnAuc2FyX3dpZHRoOworCQkJaGV2Yy0+Y3VyX3BpYy0+c2FyX2hlaWdodCA9CisJCQkJaGV2Yy0+cGFyYW0ucC5zYXJfaGVpZ2h0OworCQl9CisKKwkJYXNwZWN0X3JhdGlvX3NldChoZXZjKTsKKwkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLAorCQkJSEVWQ19DT0RFRF9TTElDRV9TRUdNRU5UX0RBVCk7CisJCS8qIEludGVycnVwdCBBbXJpc2MgdG8gZXhjdXRlICovCisJCVdSSVRFX1ZSRUcoSEVWQ19NQ1BVX0lOVFJfUkVRLCBBTVJJU0NfTUFJTl9SRVEpOworCisJCWhldmMtPnN0YXJ0X2RlY29kaW5nX3RpbWUgPSBqaWZmaWVzOworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwkJaWYgKGhldmMtPm1faW5zX2ZsYWcpCisJCQlzdGFydF9wcm9jZXNzX3RpbWUoaGV2Yyk7CisjZW5kaWYKKyNpZiAxCisJCS8qdG8gZG8uLi4sIGNvcHkgYXV4IGRhdGEgdG8gaGV2Yy0+Y3VyX3BpYyovCisjZW5kaWYKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJfSBlbHNlIGlmIChoZXZjLT5tX2luc19mbGFnKSB7CisJCWhldmNfcHJpbnQoaGV2YywgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCSIlcywgYnVmbWdyIHJldCAlZCBza2lwLCBERUNfUkVTVUxUX0RPTkVcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJaGV2Yy0+ZGVjb2RlZF9wb2MgPSBJTlZBTElEX1BPQzsKKwkJaGV2Yy0+ZGVjb2RpbmdfcGljID0gTlVMTDsKKwkJaGV2Yy0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwkJYW1oZXZjX3N0b3AoKTsKKwkJcmVzZXRfcHJvY2Vzc190aW1lKGhldmMpOworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmhldmMtPndvcmspOworI2VuZGlmCisJfSBlbHNlIHsKKwkJLyogc2tpcCwgc2VhcmNoIG5leHQgc3RhcnQgY29kZSAqLworCQloZXZjLT5ndnMtPmRyb3BfZnJhbWVfY291bnQrKzsKKwkJaWYgKGhldmMtPmN1cl9waWMtPnNsaWNlX3R5cGUgPT0gSV9TTElDRSkgeworCQkJaGV2Yy0+Z3ZzLT5pX2xvc3RfZnJhbWVzKys7CisJCX0gZWxzZSBpZiAoaGV2Yy0+Y3VyX3BpYy0+c2xpY2VfdHlwZSA9PSBQX1NMSUNFKSB7CisJCQloZXZjLT5ndnMtPmlfbG9zdF9mcmFtZXMrKzsKKwkJfSBlbHNlIGlmIChoZXZjLT5jdXJfcGljLT5zbGljZV90eXBlID09IEJfU0xJQ0UpIHsKKwkJCWhldmMtPmd2cy0+aV9sb3N0X2ZyYW1lcysrOworCQl9CisJCVdSSVRFX1ZSRUcoSEVWQ19XQUlUX0ZMQUcsIFJFQURfVlJFRyhIRVZDX1dBSVRfRkxBRykgJiAofjB4MikpOworCQkJaGV2Yy0+c2tpcF9mbGFnID0gMTsKKwkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLAlIRVZDX0FDVElPTl9ET05FKTsKKwkJLyogSW50ZXJydXB0IEFtcmlzYyB0byBleGN1dGUgKi8KKwkJV1JJVEVfVlJFRyhIRVZDX01DUFVfSU5UUl9SRVEsIEFNUklTQ19NQUlOX1JFUSk7CisJfQorCisJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9JU1JfVEhSRUFEX0hFQURfRU5EKTsKKworCX0gZWxzZSBpZiAoZGVjX3N0YXR1cyA9PSBIRVZDX0RFQ09ERV9PVkVSX1NJWkUpIHsKKwkJaGV2Y19wcmludChoZXZjLCAwICwgImhldmMgIGRlY29kZSBvdmVyc2l6ZSAhIVxuIik7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQlpZiAoIWhldmMtPm1faW5zX2ZsYWcpCisJCQlkZWJ1ZyB8PSAoSDI2NV9ERUJVR19ESVNfTE9DX0VSUk9SX1BST0MgfAorCQkJCUgyNjVfREVCVUdfRElTX1NZU19FUlJPUl9QUk9DKTsKKyNlbmRpZgorCQloZXZjLT5mYXRhbF9lcnJvciB8PSBERUNPREVSX0ZBVEFMX0VSUk9SX1NJWkVfT1ZFUkZMT1c7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgd2FpdF9oZXZjX3NlYXJjaF9kb25lKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJaW50IGNvdW50ID0gMDsKKwlXUklURV9WUkVHKEhFVkNfU0hJRlRfU1RBVFVTLCAwKTsKKwl3aGlsZSAoUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0NPTlRST0wpICYgMHgyKSB7CisJCW1zbGVlcCgyMCk7CisJCWNvdW50Kys7CisJCWlmIChjb3VudCA+IDEwMCkgeworCQkJaGV2Y19wcmludChoZXZjLCAwLCAiJXMgdGltZW91dFxuIiwgX19mdW5jX18pOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CitzdGF0aWMgaXJxcmV0dXJuX3QgdmgyNjVfaXNyKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJaW50IGksIHRlbXA7CisJdW5zaWduZWQgaW50IGRlY19zdGF0dXM7CisJc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YyA9IChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICopZGF0YTsKKwl1MzIgZGVidWdfdGFnOworCWRlY19zdGF0dXMgPSBSRUFEX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRyk7CisKKworCWlmIChkZWNfc3RhdHVzID09IEhFVkNfU0xJQ0VfU0VHTUVOVF9ET05FKSB7CisJCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX0hFQURfRE9ORSk7CisJfQorCWVsc2UgaWYgKGRlY19zdGF0dXMgPT0gSEVWQ19ERUNQSUNfREFUQV9ET05FKSB7CisJCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX1BJQ19ET05FKTsKKwl9CisKKwlpZiAoaGV2Yy0+aW5pdF9mbGFnID09IDApCisJCXJldHVybiBJUlFfSEFORExFRDsKKwloZXZjLT5kZWNfc3RhdHVzID0gZGVjX3N0YXR1czsKKwlpZiAoaXNfbG9nX2VuYWJsZShoZXZjKSkKKwkJYWRkX2xvZyhoZXZjLAorCQkJImlzcjogc3RhdHVzID0gMHgleCBkZWMgaW5mbyAweCV4IGxjdSAweCV4IHNoaWZ0Ynl0ZSAweCV4IHNoaWZ0c3RhdHVzIDB4JXgiLAorCQkJZGVjX3N0YXR1cywgUkVBRF9IUkVHKEhFVkNfREVDT0RFX0lORk8pLAorCQkJUkVBRF9WUkVHKEhFVkNfTVBSRURfQ1VSUl9MQ1UpLAorCQkJUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCksCisJCQlSRUFEX1ZSRUcoSEVWQ19TSElGVF9TVEFUVVMpKTsKKworCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJIjI2NSBpc3IgZGVjIHN0YXR1cyA9IDB4JXggZGVjIGluZm8gMHgleCBzaGlmdGJ5dGUgMHgleCBzaGlmdHN0YXR1cyAweCV4XG4iLAorCQkJZGVjX3N0YXR1cywgUkVBRF9IUkVHKEhFVkNfREVDT0RFX0lORk8pLAorCQkJUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCksCisJCQlSRUFEX1ZSRUcoSEVWQ19TSElGVF9TVEFUVVMpKTsKKworCWRlYnVnX3RhZyA9IFJFQURfSFJFRyhERUJVR19SRUcxKTsKKwlpZiAoZGVidWdfdGFnICYgMHgxMDAwMCkgeworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiTE1FTTx0YWcgJXg+OlxuIiwgUkVBRF9IUkVHKERFQlVHX1JFRzEpKTsKKworCQlpZiAoaGV2Yy0+bW11X2VuYWJsZSkKKwkJCXRlbXAgPSAweDUwMDsKKwkJZWxzZQorCQkJdGVtcCA9IDB4NDAwOworCQlmb3IgKGkgPSAwOyBpIDwgdGVtcDsgaSArPSA0KSB7CisJCQlpbnQgaWk7CisJCQlpZiAoKGkgJiAweGYpID09IDApCisJCQkJaGV2Y19wcmludF9jb250KGhldmMsIDAsICIlMDN4OiAiLCBpKTsKKwkJCWZvciAoaWkgPSAwOyBpaSA8IDQ7IGlpKyspIHsKKwkJCQloZXZjX3ByaW50X2NvbnQoaGV2YywgMCwgIiUwNHggIiwKKwkJCQkJICAgaGV2Yy0+bG1lbV9wdHJbaSArIDMgLSBpaV0pOworCQkJfQorCQkJaWYgKCgoaSArIGlpKSAmIDB4ZikgPT0gMCkKKwkJCQloZXZjX3ByaW50X2NvbnQoaGV2YywgMCwgIlxuIik7CisJCX0KKworCQlpZiAoKCh1ZGVidWdfcGF1c2VfcG9zICYgMHhmZmZmKQorCQkJPT0gKGRlYnVnX3RhZyAmIDB4ZmZmZikpICYmCisJCQkodWRlYnVnX3BhdXNlX2RlY29kZV9pZHggPT0gMCB8fAorCQkJdWRlYnVnX3BhdXNlX2RlY29kZV9pZHggPT0gaGV2Yy0+ZGVjb2RlX2lkeCkgJiYKKwkJCSh1ZGVidWdfcGF1c2VfdmFsID09IDAgfHwKKwkJCXVkZWJ1Z19wYXVzZV92YWwgPT0gUkVBRF9IUkVHKERFQlVHX1JFRzIpKSkgeworCQkJdWRlYnVnX3BhdXNlX3BvcyAmPSAweGZmZmY7CisJCQloZXZjLT51Y29kZV9wYXVzZV9wb3MgPSB1ZGVidWdfcGF1c2VfcG9zOworCQl9CisJCWVsc2UgaWYgKGRlYnVnX3RhZyAmIDB4MjAwMDApCisJCQloZXZjLT51Y29kZV9wYXVzZV9wb3MgPSAweGZmZmZmZmZmOworCQlpZiAoaGV2Yy0+dWNvZGVfcGF1c2VfcG9zKQorCQkJcmVzZXRfcHJvY2Vzc190aW1lKGhldmMpOworCQllbHNlCisJCQlXUklURV9IUkVHKERFQlVHX1JFRzEsIDApOworCX0gZWxzZSBpZiAoZGVidWdfdGFnICE9IDApIHsKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJImRiZyV4OiAleCBsL3cvciAleCAleCAleFxuIiwgUkVBRF9IUkVHKERFQlVHX1JFRzEpLAorCQkJICAgUkVBRF9IUkVHKERFQlVHX1JFRzIpLAorCQkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9MRVZFTCksCisJCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1dSX1BUUiksCisJCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1JEX1BUUikpOworCQlpZiAoKCh1ZGVidWdfcGF1c2VfcG9zICYgMHhmZmZmKQorCQkJPT0gKGRlYnVnX3RhZyAmIDB4ZmZmZikpICYmCisJCQkodWRlYnVnX3BhdXNlX2RlY29kZV9pZHggPT0gMCB8fAorCQkJdWRlYnVnX3BhdXNlX2RlY29kZV9pZHggPT0gaGV2Yy0+ZGVjb2RlX2lkeCkgJiYKKwkJCSh1ZGVidWdfcGF1c2VfdmFsID09IDAgfHwKKwkJCXVkZWJ1Z19wYXVzZV92YWwgPT0gUkVBRF9IUkVHKERFQlVHX1JFRzIpKSkgeworCQkJdWRlYnVnX3BhdXNlX3BvcyAmPSAweGZmZmY7CisJCQloZXZjLT51Y29kZV9wYXVzZV9wb3MgPSB1ZGVidWdfcGF1c2VfcG9zOworCQl9CisJCWlmIChoZXZjLT51Y29kZV9wYXVzZV9wb3MpCisJCQlyZXNldF9wcm9jZXNzX3RpbWUoaGV2Yyk7CisJCWVsc2UKKwkJCVdSSVRFX0hSRUcoREVCVUdfUkVHMSwgMCk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKworCWlmIChoZXZjLT5waWNfbGlzdF9pbml0X2ZsYWcgPT0gMSkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJaWYgKCFoZXZjLT5tX2luc19mbGFnKSB7CisJCWlmIChkZWNfc3RhdHVzID09IEhFVkNfT1ZFUl9ERUNPREUpIHsKKwkJCWhldmMtPm92ZXJfZGVjb2RlID0gMTsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkiaXNyOiBvdmVyIGRlY29kZVxuIiksCisJCQkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCAwKTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCX0KKwlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9FTkQpOworCXJldHVybiBJUlFfV0FLRV9USFJFQUQ7CisKK30KKworc3RhdGljIHZvaWQgdmgyNjVfc2V0X2NsayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YyA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQlzdHJ1Y3QgaGV2Y19zdGF0ZV9zLCBzZXRfY2xrX3dvcmspOworCisJCWludCBmcHMgPSA5NjAwMCAvIGhldmMtPmZyYW1lX2R1cjsKKworCQlpZiAoaGV2Y19zb3VyY2VfY2hhbmdlZChWRk9STUFUX0hFVkMsCisJCQloZXZjLT5mcmFtZV93aWR0aCwgaGV2Yy0+ZnJhbWVfaGVpZ2h0LCBmcHMpID4gMCkKKwkJCWhldmMtPnNhdmVkX3Jlc29sdXRpb24gPSBoZXZjLT5mcmFtZV93aWR0aCAqCisJCQloZXZjLT5mcmFtZV9oZWlnaHQgKiBmcHM7Cit9CisKK3N0YXRpYyB2b2lkIHZoMjY1X2NoZWNrX3RpbWVyX2Z1bmMoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPSBjb250YWluZXJfb2YodGltZXIsCisJCSBzdHJ1Y3QgaGV2Y19zdGF0ZV9zLCB0aW1lcik7CisJdW5zaWduZWQgY2hhciBlbXB0eV9mbGFnOworCXVuc2lnbmVkIGludCBidWZfbGV2ZWw7CisKKwllbnVtIHJlY2V2aXZlcl9zdGFydF9lIHN0YXRlID0gUkVDRUlWRVJfSU5BQ1RJVkU7CisKKwlpZiAoaGV2Yy0+aW5pdF9mbGFnID09IDApIHsKKwkJaWYgKGhldmMtPnN0YXQgJiBTVEFUX1RJTUVSX0FSTSkgeworCQkJbW9kX3RpbWVyKCZoZXZjLT50aW1lciwgamlmZmllcyArIFBVVF9JTlRFUlZBTCk7CisJCX0KKwkJcmV0dXJuOworCX0KKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJaWYgKGhldmMtPm1faW5zX2ZsYWcgJiYKKwkJKGdldF9kYmdfZmxhZyhoZXZjKSAmCisJCUgyNjVfREVCVUdfV0FJVF9ERUNPREVfRE9ORV9XSEVOX1NUT1ApID09IDAgJiYKKwkJaHdfdG9fdmRlYyhoZXZjKS0+bmV4dF9zdGF0dXMgPT0KKwkJVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEICYmCisJCSFoZXZjLT5pc191c2VkX3Y0bCkgeworCQloZXZjLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9GT1JDRV9FWElUOworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmhldmMtPndvcmspOworCQloZXZjX3ByaW50KGhldmMsCisJCQkwLCAidmRlYyByZXF1ZXN0ZWQgdG8gYmUgZGlzY29ubmVjdGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChoZXZjLT5tX2luc19mbGFnKSB7CisJCWlmICgoKGdldF9kYmdfZmxhZyhoZXZjKSAmCisJCQlIMjY1X0RFQlVHX0RJU19MT0NfRVJST1JfUFJPQykgPT0gMCkgJiYKKwkJCShkZWNvZGVfdGltZW91dF92YWwgPiAwKSAmJgorCQkJKGhldmMtPnN0YXJ0X3Byb2Nlc3NfdGltZSA+IDApICYmCisJCQkoKDEwMDAgKiAoamlmZmllcyAtIGhldmMtPnN0YXJ0X3Byb2Nlc3NfdGltZSkgLyBIWikKKwkJCQk+IGRlY29kZV90aW1lb3V0X3ZhbCkKKwkJKSB7CisJCQl1MzIgZGVjX3N0YXR1cyA9IFJFQURfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHKTsKKwkJCWludCBjdXJyZW50X2xjdV9pZHggPQorCQkJCVJFQURfVlJFRyhIRVZDX1BBUlNFUl9MQ1VfU1RBUlQpJjB4ZmZmZmZmOworCQkJaWYgKGRlY19zdGF0dXMgPT0gSEVWQ19DT0RFRF9TTElDRV9TRUdNRU5UX0RBVCkgeworCQkJCWlmIChoZXZjLT5sYXN0X2xjdV9pZHggPT0gY3VycmVudF9sY3VfaWR4KSB7CisJCQkJCWlmIChoZXZjLT5kZWNvZGVfdGltZW91dF9jb3VudCA+IDApCisJCQkJCQloZXZjLT5kZWNvZGVfdGltZW91dF9jb3VudC0tOworCQkJCQlpZiAoaGV2Yy0+ZGVjb2RlX3RpbWVvdXRfY291bnQgPT0gMCkKKwkJCQkJCXRpbWVvdXRfcHJvY2VzcyhoZXZjKTsKKwkJCQl9IGVsc2UKKwkJCQkJcmVzdGFydF9wcm9jZXNzX3RpbWUoaGV2Yyk7CisJCQkJaGV2Yy0+bGFzdF9sY3VfaWR4ID0gY3VycmVudF9sY3VfaWR4OworCQkJfSBlbHNlIHsKKwkJCQloZXZjLT5waWNfZGVjb2RlZF9sY3VfaWR4ID0gY3VycmVudF9sY3VfaWR4OworCQkJCXRpbWVvdXRfcHJvY2VzcyhoZXZjKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisjZW5kaWYKKwlpZiAoaGV2Yy0+bV9pbnNfZmxhZyA9PSAwICYmCisJCXZmX2dldF9yZWNlaXZlcihoZXZjLT5wcm92aWRlcl9uYW1lKSkgeworCQlzdGF0ZSA9CisJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoaGV2Yy0+cHJvdmlkZXJfbmFtZSwKKwkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfUVVSRVlfU1RBVEUsCisJCQkJTlVMTCk7CisJCWlmICgoc3RhdGUgPT0gUkVDRUlWRVJfU1RBVEVfTlVMTCkKKwkJCXx8IChzdGF0ZSA9PSBSRUNFSVZFUl9TVEFURV9OT05FKSkKKwkJCXN0YXRlID0gUkVDRUlWRVJfSU5BQ1RJVkU7CisJfSBlbHNlCisJCXN0YXRlID0gUkVDRUlWRVJfSU5BQ1RJVkU7CisKKwllbXB0eV9mbGFnID0gKFJFQURfVlJFRyhIRVZDX1BBUlNFUl9JTlRfU1RBVFVTKSA+PiA2KSAmIDB4MTsKKwkvKiBlcnJvciB3YXRjaGRvZyAqLworCWlmIChoZXZjLT5tX2luc19mbGFnID09IDAgJiYKKwkJKGVtcHR5X2ZsYWcgPT0gMCkKKwkJJiYgKGhldmMtPnBpY19saXN0X2luaXRfZmxhZyA9PSAwCisJCQl8fCBoZXZjLT5waWNfbGlzdF9pbml0X2ZsYWcKKwkJCT09IDMpKSB7CisJCS8qIGRlY29kZXIgaGFzIGlucHV0ICovCisJCWlmICgoZ2V0X2RiZ19mbGFnKGhldmMpICYKKwkJCUgyNjVfREVCVUdfRElTX0xPQ19FUlJPUl9QUk9DKSA9PSAwKSB7CisKKwkJCWJ1Zl9sZXZlbCA9IFJFQURfVlJFRyhIRVZDX1NUUkVBTV9MRVZFTCk7CisJCQkvKiByZWNlaXZlciBoYXMgbm8gYnVmZmVyIHRvIHJlY3ljbGUgKi8KKwkJCWlmICgoc3RhdGUgPT0gUkVDRUlWRVJfSU5BQ1RJVkUpICYmCisJCQkJKGtmaWZvX2lzX2VtcHR5KCZoZXZjLT5kaXNwbGF5X3EpICYmCisJCQkJIGJ1Zl9sZXZlbCA+IDB4MjAwKQorCQkJICAgKSB7CisJCQkJaWYgKGhldmMtPmVycm9yX2ZsYWcgPT0gMCkgeworCQkJCQloZXZjLT5lcnJvcl93YXRjaGRvZ19jb3VudCsrOworCQkJCQlpZiAoaGV2Yy0+ZXJyb3Jfd2F0Y2hkb2dfY291bnQgPT0KKwkJCQkJCWVycm9yX2hhbmRsZV90aHJlc2hvbGQpIHsKKwkJCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJCSJIMjY1IGRlYyBlcnIgbG9jYWwgcmVzZXQuXG4iKTsKKwkJCQkJCWhldmMtPmVycm9yX2ZsYWcgPSAxOworCQkJCQkJaGV2Yy0+ZXJyb3Jfd2F0Y2hkb2dfY291bnQgPSAwOworCQkJCQkJaGV2Yy0+ZXJyb3Jfc2tpcF9uYWxfd3RfY250ID0gMDsKKwkJCQkJCWhldmMtPgorCQkJCQkJZXJyb3Jfc3lzdGVtX3dhdGNoZG9nX2NvdW50Kys7CisJCQkJCQlXUklURV9WUkVHCisJCQkJCQkoSEVWQ19BU1NJU1RfTUJPWDBfSVJRX1JFRywKKwkJCQkJCSAweDEpOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChoZXZjLT5lcnJvcl9mbGFnID09IDIpIHsKKwkJCQkJaW50IHRoID0KKwkJCQkJCWVycm9yX2hhbmRsZV9uYWxfc2tpcF90aHJlc2hvbGQ7CisJCQkJCWhldmMtPmVycm9yX3NraXBfbmFsX3d0X2NudCsrOworCQkJCQlpZiAoaGV2Yy0+ZXJyb3Jfc2tpcF9uYWxfd3RfY250CisJCQkJCT09IHRoKSB7CisJCQkJCQloZXZjLT5lcnJvcl9mbGFnID0gMzsKKwkJCQkJCWhldmMtPmVycm9yX3dhdGNoZG9nX2NvdW50ID0gMDsKKwkJCQkJCWhldmMtPgorCQkJCQkJZXJyb3Jfc2tpcF9uYWxfd3RfY250ID0JMDsKKwkJCQkJCVdSSVRFX1ZSRUcKKwkJCQkJCShIRVZDX0FTU0lTVF9NQk9YMF9JUlFfUkVHLAorCQkJCQkJIDB4MSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoKGdldF9kYmdfZmxhZyhoZXZjKQorCQkJJiBIMjY1X0RFQlVHX0RJU19TWVNfRVJST1JfUFJPQykgPT0gMCkKKwkJCS8qIHJlY2VpdmVyIGhhcyBubyBidWZmZXIgdG8gcmVjeWNsZSAqLworCQkJaWYgKChzdGF0ZSA9PSBSRUNFSVZFUl9JTkFDVElWRSkgJiYKKwkJCQkoa2ZpZm9faXNfZW1wdHkoJmhldmMtPmRpc3BsYXlfcSkpCisJCQkgICApIHsJLyogbm8gYnVmZmVyIHRvIHJlY3ljbGUgKi8KKwkJCQlpZiAoKGdldF9kYmdfZmxhZyhoZXZjKSAmCisJCQkJCUgyNjVfREVCVUdfRElTX0xPQ19FUlJPUl9QUk9DKSAhPQorCQkJCQkwKQorCQkJCQloZXZjLT5lcnJvcl9zeXN0ZW1fd2F0Y2hkb2dfY291bnQrKzsKKwkJCQlpZiAoaGV2Yy0+ZXJyb3Jfc3lzdGVtX3dhdGNoZG9nX2NvdW50ID09CisJCQkJCWVycm9yX2hhbmRsZV9zeXN0ZW1fdGhyZXNob2xkKSB7CisJCQkJCS8qIGFuZCBpdCBsYXN0cyBmb3IgYSB3aGlsZSAqLworCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCSJIMjY1IGRlYyBmYXRhbCBlcnJvciB3YXRjaGRvZy5cbiIpOworCQkJCQloZXZjLT4KKwkJCQkJZXJyb3Jfc3lzdGVtX3dhdGNoZG9nX2NvdW50ID0gMDsKKwkJCQkJaGV2Yy0+ZmF0YWxfZXJyb3IgfD0gREVDT0RFUl9GQVRBTF9FUlJPUl9VTktOT1dOOworCQkJCX0KKwkJCX0KKwl9IGVsc2UgeworCQloZXZjLT5lcnJvcl93YXRjaGRvZ19jb3VudCA9IDA7CisJCWhldmMtPmVycm9yX3N5c3RlbV93YXRjaGRvZ19jb3VudCA9IDA7CisJfQorI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwl9CisjZW5kaWYKKwlpZiAoKGhldmMtPnVjb2RlX3BhdXNlX3BvcyAhPSAwKSAmJgorCQkoaGV2Yy0+dWNvZGVfcGF1c2VfcG9zICE9IDB4ZmZmZmZmZmYpICYmCisJCXVkZWJ1Z19wYXVzZV9wb3MgIT0gaGV2Yy0+dWNvZGVfcGF1c2VfcG9zKSB7CisJCWhldmMtPnVjb2RlX3BhdXNlX3BvcyA9IDA7CisJCVdSSVRFX0hSRUcoREVCVUdfUkVHMSwgMCk7CisJfQorCisJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfRFVNUF9QSUNfTElTVCkgeworCQlkdW1wX3BpY19saXN0KGhldmMpOworCQlkZWJ1ZyAmPSB+SDI2NV9ERUJVR19EVU1QX1BJQ19MSVNUOworCX0KKwlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19UUklHX1NMSUNFX1NFR01FTlRfUFJPQykgeworCQlXUklURV9WUkVHKEhFVkNfQVNTSVNUX01CT1gwX0lSUV9SRUcsIDB4MSk7CisJCWRlYnVnICY9IH5IMjY1X0RFQlVHX1RSSUdfU0xJQ0VfU0VHTUVOVF9QUk9DOworCX0KKyNpZmRlZiBURVNUX05PX0JVRgorCWlmIChoZXZjLT53YWl0X2J1ZikKKwkJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9NQk9YMF9JUlFfUkVHLCAweDEpOworI2VuZGlmCisJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfSFdfUkVTRVQpIHsKKwkJaGV2Yy0+ZXJyb3Jfc2tpcF9uYWxfY291bnQgPSBlcnJvcl9za2lwX25hbF9jb3VudDsKKwkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCBIRVZDX0FDVElPTl9ET05FKTsKKworCQlkZWJ1ZyAmPSB+SDI2NV9ERUJVR19IV19SRVNFVDsKKwl9CisKKyNpZmRlZiBFUlJPUl9IQU5ETEVfREVCVUcKKwlpZiAoKGRiZ19uYWxfc2tpcF9jb3VudCA+IDApICYmICgoZGJnX25hbF9za2lwX2NvdW50ICYgMHgxMDAwMCkgIT0gMCkpIHsKKwkJaGV2Yy0+ZXJyb3Jfc2tpcF9uYWxfY291bnQgPSBkYmdfbmFsX3NraXBfY291bnQgJiAweGZmZmY7CisJCWRiZ19uYWxfc2tpcF9jb3VudCAmPSB+MHgxMDAwMDsKKwkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCBIRVZDX0FDVElPTl9ET05FKTsKKwl9CisjZW5kaWYKKworCWlmIChyYWRyICE9IDApIHsKKyNpZmRlZiBTVVBQT1JUX0xPTkdfVEVSTV9SUFMKKwkJaWYgKChyYWRyID4+IDI0KSAhPSAwKSB7CisJCQlpbnQgY291bnQgPSByYWRyID4+IDI0OworCQkJaW50IGFkciA9IHJhZHIgJiAweGZmZmZmZjsKKwkJCWludCBpOworCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCQkJcHJfaW5mbygiUkVBRF9WUkVHKCV4KT0leFxuIiwgYWRyK2ksIFJFQURfVlJFRyhhZHIraSkpOworCQl9IGVsc2UKKyNlbmRpZgorCQlpZiAocnZhbCAhPSAwKSB7CisJCQlXUklURV9WUkVHKHJhZHIsIHJ2YWwpOworCQkJcHJfaW5mbygiV1JJVEVfVlJFRygleCwleClcbiIsIHJhZHIsIHJ2YWwpOworCQl9IGVsc2UKKwkJCXByX2luZm8oIlJFQURfVlJFRygleCk9JXhcbiIsIHJhZHIsIFJFQURfVlJFRyhyYWRyKSk7CisJCXJ2YWwgPSAwOworCQlyYWRyID0gMDsKKwl9CisJaWYgKGRiZ19jbWQgIT0gMCkgeworCQlpZiAoZGJnX2NtZCA9PSAxKSB7CisJCQl1MzIgZGlzcF9sYWRkcjsKKworCQkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hCQiAmJgorCQkJCWdldF9kb3VibGVfd3JpdGVfbW9kZShoZXZjKSA9PSAwKSB7CisJCQkJZGlzcF9sYWRkciA9CisJCQkJCVJFQURfVkNCVVNfUkVHKEFGQkNfQk9EWV9CQUREUikgPDwgNDsKKwkJCX0gZWxzZSB7CisJCQkJc3RydWN0IGNhbnZhc19zIGN1cl9jYW52YXM7CisKKwkJCQljYW52YXNfcmVhZCgoUkVBRF9WQ0JVU19SRUcoVkQxX0lGMF9DQU5WQVMwKQorCQkJCQkmIDB4ZmYpLCAmY3VyX2NhbnZhcyk7CisJCQkJZGlzcF9sYWRkciA9IGN1cl9jYW52YXMuYWRkcjsKKwkJCX0KKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkiY3VycmVudCBkaXNwbGF5ZWQgYnVmZmVyIGFkZHJlc3MgJXhcclxuIiwKKwkJCQlkaXNwX2xhZGRyKTsKKwkJfQorCQlkYmdfY21kID0gMDsKKwl9CisJLypkb24ndCBjaGFuZ2VkIGF0IHN0YXJ0LiovCisJaWYgKGhldmMtPm1faW5zX2ZsYWcgPT0gMCAmJgorCQloZXZjLT5nZXRfZnJhbWVfZHVyICYmIGhldmMtPnNob3dfZnJhbWVfbnVtID4gNjAgJiYKKwkJaGV2Yy0+ZnJhbWVfZHVyID4gMCAmJiBoZXZjLT5zYXZlZF9yZXNvbHV0aW9uICE9CisJCWhldmMtPmZyYW1lX3dpZHRoICogaGV2Yy0+ZnJhbWVfaGVpZ2h0ICoKKwkJCSg5NjAwMCAvIGhldmMtPmZyYW1lX2R1cikpCisJCXZkZWNfc2NoZWR1bGVfd29yaygmaGV2Yy0+c2V0X2Nsa193b3JrKTsKKworCW1vZF90aW1lcih0aW1lciwgamlmZmllcyArIFBVVF9JTlRFUlZBTCk7Cit9CisKK3N0YXRpYyBpbnQgaDI2NV90YXNrX2hhbmRsZSh2b2lkICpkYXRhKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPSAoc3RydWN0IGhldmNfc3RhdGVfcyAqKWRhdGE7CisKKwlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC0xMCk7CisJd2hpbGUgKDEpIHsKKwkJaWYgKHVzZV9jbWEgPT0gMCkgeworCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJIkVSUk9SOiB1c2VfY21hIGNhbiBub3QgYmUgY2hhbmdlZCBkeW5hbWljYWxseVxuIik7CisJCX0KKwkJcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZoMjY1X3NlbWEpOworCQlpZiAoKGhldmMtPmluaXRfZmxhZyAhPSAwKSAmJiAoaGV2Yy0+cGljX2xpc3RfaW5pdF9mbGFnID09IDEpKSB7CisJCQlpbml0X3BpY19saXN0KGhldmMpOworCQkJaW5pdF9waWNfbGlzdF9odyhoZXZjKTsKKwkJCWluaXRfYnVmX3NwZWMoaGV2Yyk7CisJCQloZXZjLT5waWNfbGlzdF9pbml0X2ZsYWcgPSAyOworCQkJaGV2Y19wcmludChoZXZjLCAwLCAic2V0IHBpY19saXN0X2luaXRfZmxhZyB0byAyXG4iKTsKKworCQkJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9NQk9YMF9JUlFfUkVHLCAweDEpOworCisJCX0KKworCQlpZiAoaGV2Yy0+dW5pbml0X2xpc3QpIHsKKwkJCS8qVVNFX0JVRl9CTE9DSyovCisJCQl1bmluaXRfcGljX2xpc3QoaGV2Yyk7CisJCQloZXZjX3ByaW50KGhldmMsIDAsICJ1bmluaXQgbGlzdFxuIik7CisJCQloZXZjLT51bmluaXRfbGlzdCA9IDA7CisjaWZkZWYgVVNFX1VOSU5JVF9TRU1BCisJCQlpZiAodXNlX2NtYSkgeworCQkJCXVwKCZoZXZjLT5oMjY1X3VuaW5pdF9kb25lX3NlbWEpOworCQkJCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQkJCQltc2xlZXAoMSk7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCit2b2lkIHZoMjY1X2ZyZWVfY21hYnVmKHZvaWQpCit7CisJc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YyA9IGdIZXZjOworCisJbXV0ZXhfbG9jaygmdmgyNjVfbXV0ZXgpOworCisJaWYgKGhldmMtPmluaXRfZmxhZykgeworCQltdXRleF91bmxvY2soJnZoMjY1X211dGV4KTsKKwkJcmV0dXJuOworCX0KKworCW11dGV4X3VubG9jaygmdmgyNjVfbXV0ZXgpOworfQorCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAoraW50IHZoMjY1X2RlY19zdGF0dXMoc3RydWN0IHZkZWNfcyAqdmRlYywgc3RydWN0IHZkZWNfaW5mbyAqdnN0YXR1cykKKyNlbHNlCitpbnQgdmgyNjVfZGVjX3N0YXR1cyhzdHJ1Y3QgdmRlY19pbmZvICp2c3RhdHVzKQorI2VuZGlmCit7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPQorCQkoc3RydWN0IGhldmNfc3RhdGVfcyAqKXZkZWMtPnByaXZhdGU7CisjZWxzZQorCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPSBnSGV2YzsKKyNlbmRpZgorCWlmICghaGV2YykKKwkJcmV0dXJuIC0xOworCisJdnN0YXR1cy0+ZnJhbWVfd2lkdGggPSBoZXZjLT5waWNfdzsKKwkvKiBmb3IgaGV2YyBpbnRlcmxhY2UgZm9yIGRpc3AgaGVpZ2h0IHgyICovCisJdnN0YXR1cy0+ZnJhbWVfaGVpZ2h0ID0KKwkJKGhldmMtPnBpY19oIDw8IGhldmMtPmludGVybGFjZV9mbGFnKTsKKwlpZiAoaGV2Yy0+ZnJhbWVfZHVyICE9IDApCisJCXZzdGF0dXMtPmZyYW1lX3JhdGUgPSAoKDk2MDAwICogMTAgLyBoZXZjLT5mcmFtZV9kdXIpICUgMTApIDwgNSA/CisJCQkJOTYwMDAgLyBoZXZjLT5mcmFtZV9kdXIgOiAoOTYwMDAgLyBoZXZjLT5mcmFtZV9kdXIgKzEpOworCWVsc2UKKwkJdnN0YXR1cy0+ZnJhbWVfcmF0ZSA9IC0xOworCXZzdGF0dXMtPmVycm9yX2NvdW50ID0gaGV2Yy0+Z3ZzLT5lcnJvcl9mcmFtZV9jb3VudDsKKwl2c3RhdHVzLT5zdGF0dXMgPSBoZXZjLT5zdGF0IHwgaGV2Yy0+ZmF0YWxfZXJyb3I7CisJaWYgKCF2ZGVjX2lzX3N1cHBvcnRfNGsoKSAmJgorCQkoSVNfNEtfU0laRSh2c3RhdHVzLT5mcmFtZV93aWR0aCwgdnN0YXR1cy0+ZnJhbWVfaGVpZ2h0KSkgJiYKKwkJKHZzdGF0dXMtPmZyYW1lX3dpZHRoIDw9IDQwOTYgJiYgdnN0YXR1cy0+ZnJhbWVfaGVpZ2h0IDw9IDIzMDQpKSB7CisJCXZzdGF0dXMtPnN0YXR1cyB8PSBERUNPREVSX0ZBVEFMX0VSUk9SX1NJWkVfT1ZFUkZMT1c7CisJfQorCisJdnN0YXR1cy0+Yml0X3JhdGUgPSBoZXZjLT5ndnMtPmJpdF9yYXRlOworCXZzdGF0dXMtPmZyYW1lX2R1ciA9IGhldmMtPmZyYW1lX2R1cjsKKwlpZiAoaGV2Yy0+Z3ZzKSB7CisJCXZzdGF0dXMtPmJpdF9yYXRlID0gaGV2Yy0+Z3ZzLT5iaXRfcmF0ZTsKKwkJdnN0YXR1cy0+ZnJhbWVfZGF0YSA9IGhldmMtPmd2cy0+ZnJhbWVfZGF0YTsKKwkJdnN0YXR1cy0+dG90YWxfZGF0YSA9IGhldmMtPmd2cy0+dG90YWxfZGF0YTsKKwkJdnN0YXR1cy0+ZnJhbWVfY291bnQgPSBoZXZjLT5ndnMtPmZyYW1lX2NvdW50OworCQl2c3RhdHVzLT5lcnJvcl9mcmFtZV9jb3VudCA9IGhldmMtPmd2cy0+ZXJyb3JfZnJhbWVfY291bnQ7CisJCXZzdGF0dXMtPmRyb3BfZnJhbWVfY291bnQgPSBoZXZjLT5ndnMtPmRyb3BfZnJhbWVfY291bnQ7CisJCXZzdGF0dXMtPmlfZGVjb2RlZF9mcmFtZXMgPSBoZXZjLT5ndnMtPmlfZGVjb2RlZF9mcmFtZXM7CisJCXZzdGF0dXMtPmlfbG9zdF9mcmFtZXMgPSBoZXZjLT5ndnMtPmlfbG9zdF9mcmFtZXM7CisJCXZzdGF0dXMtPmlfY29uY2VhbGVkX2ZyYW1lcyA9IGhldmMtPmd2cy0+aV9jb25jZWFsZWRfZnJhbWVzOworCQl2c3RhdHVzLT5wX2RlY29kZWRfZnJhbWVzID0gaGV2Yy0+Z3ZzLT5wX2RlY29kZWRfZnJhbWVzOworCQl2c3RhdHVzLT5wX2xvc3RfZnJhbWVzID0gaGV2Yy0+Z3ZzLT5wX2xvc3RfZnJhbWVzOworCQl2c3RhdHVzLT5wX2NvbmNlYWxlZF9mcmFtZXMgPSBoZXZjLT5ndnMtPnBfY29uY2VhbGVkX2ZyYW1lczsKKwkJdnN0YXR1cy0+Yl9kZWNvZGVkX2ZyYW1lcyA9IGhldmMtPmd2cy0+Yl9kZWNvZGVkX2ZyYW1lczsKKwkJdnN0YXR1cy0+Yl9sb3N0X2ZyYW1lcyA9IGhldmMtPmd2cy0+Yl9sb3N0X2ZyYW1lczsKKwkJdnN0YXR1cy0+Yl9jb25jZWFsZWRfZnJhbWVzID0gaGV2Yy0+Z3ZzLT5iX2NvbmNlYWxlZF9mcmFtZXM7CisJCXZzdGF0dXMtPnNhbXBfY250ID0gaGV2Yy0+Z3ZzLT5zYW1wX2NudDsKKwkJdnN0YXR1cy0+b2Zmc2V0ID0gaGV2Yy0+Z3ZzLT5vZmZzZXQ7CisJfQorCisJc25wcmludGYodnN0YXR1cy0+dmRlY19uYW1lLCBzaXplb2YodnN0YXR1cy0+dmRlY19uYW1lKSwKKwkJIiVzIiwgRFJJVkVSX05BTUUpOworCXZzdGF0dXMtPnJhdGlvX2NvbnRyb2wgPSBoZXZjLT5yYXRpb19jb250cm9sOworCXJldHVybiAwOworfQorCitpbnQgdmgyNjVfc2V0X2lzcmVzZXQoc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGlzcmVzZXQpCit7CisJaXNfcmVzZXQgPSBpc3Jlc2V0OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZoMjY1X3ZkZWNfaW5mb19pbml0KHN0cnVjdCBoZXZjX3N0YXRlX3MgICpoZXZjKQoreworCWhldmMtPmd2cyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZGVjX2luZm8pLCBHRlBfS0VSTkVMKTsKKwkvL3ByX2VycigiWyVzIGxpbmUgJWRdIGhldmMtPmd2cz0weCVwIG9wZXJhdGlvblxuIixfX2Z1bmNfXywgX19MSU5FX18sIGhldmMtPmd2cyk7CisJaWYgKE5VTEwgPT0gaGV2Yy0+Z3ZzKSB7CisJCXByX2luZm8oInRoZSBzdHJ1Y3Qgb2YgdmRlYyBzdGF0dXMgbWFsbG9jIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJdmRlY19zZXRfdmZyYW1lX2NvbW0oaHdfdG9fdmRlYyhoZXZjKSwgRFJJVkVSX05BTUUpOworCXJldHVybiAwOworfQorCisjaWYgMAorc3RhdGljIHZvaWQgSDI2NV9ERUNPREVfSU5JVCh2b2lkKQoreworCS8qIGVuYWJsZSBoZXZjIGNsb2NrcyAqLworCVdSSVRFX1ZSRUcoRE9TX0dDTEtfRU4zLCAweGZmZmZmZmZmKTsKKwkvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwkvKiBQb3dlciBPTiBIRVZDICovCisJLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisJLyogUG93ZXJ1cCBIRVZDICovCisJV1JJVEVfVlJFRyhQX0FPX1JUSV9HRU5fUFdSX1NMRUVQMCwKKwkJCVJFQURfVlJFRyhQX0FPX1JUSV9HRU5fUFdSX1NMRUVQMCkgJiAofigweDMgPDwgNikpKTsKKwlXUklURV9WUkVHKERPU19NRU1fUERfSEVWQywgMHgwKTsKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDMsIFJFQURfVlJFRyhET1NfU1dfUkVTRVQzKSB8ICgweDNmZmZmIDw8IDIpKTsKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDMsIFJFQURfVlJFRyhET1NfU1dfUkVTRVQzKSAmICh+KDB4M2ZmZmYgPDwgMikpKTsKKwkvKiByZW1vdmUgaXNvbGF0aW9ucyAqLworCVdSSVRFX1ZSRUcoQU9fUlRJX0dFTl9QV1JfSVNPMCwKKwkJCVJFQURfVlJFRyhBT19SVElfR0VOX1BXUl9JU08wKSAmICh+KDB4MyA8PCAxMCkpKTsKKworfQorI2VuZGlmCisKK2ludCB2aDI2NV9zZXRfdHJpY2ttb2RlKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHVuc2lnbmVkIGxvbmcgdHJpY2ttb2RlKQoreworCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPSAoc3RydWN0IGhldmNfc3RhdGVfcyAqKXZkZWMtPnByaXZhdGU7CisJaGV2Y19wcmludChoZXZjLCAwLAkiWyVzICVkXSB0cmlja21vZGU6JWx1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHRyaWNrbW9kZSk7CisKKwlpZiAodHJpY2ttb2RlID09IFRSSUNLTU9ERV9JKSB7CisJCXRyaWNrbW9kZV9pID0gMTsKKwkJaV9vbmx5X2ZsYWcgPSAweDE7CisJfSBlbHNlIGlmICh0cmlja21vZGUgPT0gVFJJQ0tNT0RFX05PTkUpIHsKKwkJdHJpY2ttb2RlX2kgPSAwOworCQlpX29ubHlfZmxhZyA9IDB4MDsKKwl9IGVsc2UgaWYgKHRyaWNrbW9kZSA9PSAweDAyKSB7CisJCXRyaWNrbW9kZV9pID0gMDsKKwkJaV9vbmx5X2ZsYWcgPSAweDAyOworCX0gZWxzZSBpZiAodHJpY2ttb2RlID09IDB4MDMpIHsKKwkJdHJpY2ttb2RlX2kgPSAxOworCQlpX29ubHlfZmxhZyA9IDB4MDM7CisJfSBlbHNlIGlmICh0cmlja21vZGUgPT0gMHgwNykgeworCQl0cmlja21vZGVfaSA9IDE7CisJCWlfb25seV9mbGFnID0gMHgwNzsKKwl9CisJLy9oZXZjX3ByaW50KGhldmMsIDAsICJpX29ubHlfZmxhZzogJWQgdHJpY2ttb2RlX2k6JWRcbiIsIGlfb25seV9mbGFnLCB0cmlja21vZGVfaSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY29uZmlnX2RlY29kZV9tb2RlKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhoZXZjKTsKKyNlbmRpZgorCXVuc2lnbmVkIGRlY29kZV9tb2RlOworI2lmZGVmIEhFVkNfOEtfTEZUT0ZGU0VUX0ZJWAorCWlmIChoZXZjLT5wZXJmb3JtYW5jZV9wcm9maWxlKQorCQlXUklURV9WUkVHKE5BTF9TRUFSQ0hfQ1RMLAorCQkJUkVBRF9WUkVHKE5BTF9TRUFSQ0hfQ1RMKSB8ICgxIDw8IDIxKSk7CisjZW5kaWYKKwlpZiAoIWhldmMtPm1faW5zX2ZsYWcpCisJCWRlY29kZV9tb2RlID0gREVDT0RFX01PREVfU0lOR0xFOworCWVsc2UgaWYgKHZkZWNfZnJhbWVfYmFzZWQoaHdfdG9fdmRlYyhoZXZjKSkpCisJCWRlY29kZV9tb2RlID0KKwkJCURFQ09ERV9NT0RFX01VTFRJX0ZSQU1FQkFTRTsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCWVsc2UgaWYgKHZkZWMtPnNsYXZlKSB7CisJCWlmIChmb3JjZV9ieXBhc3NfZHZlbmwgJiAweDgwMDAwMDAwKQorCQkJaGV2Yy0+YnlwYXNzX2R2ZW5sID0gZm9yY2VfYnlwYXNzX2R2ZW5sICYgMHgxOworCQllbHNlCisJCQloZXZjLT5ieXBhc3NfZHZlbmwgPSBoZXZjLT5ieXBhc3NfZHZlbmxfZW5hYmxlOworCQlpZiAoZG9sYnlfbWV0YV93aXRoX2VsICYmIGhldmMtPmJ5cGFzc19kdmVubCkgeworCQkJaGV2Yy0+YnlwYXNzX2R2ZW5sID0gMDsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkiTk9UIHN1cHBvcnQgYnlwYXNzX2R2ZW5sIHdoZW4gbWV0YV93aXRoX2VsXG4iKTsKKwkJfQorCQlpZiAoaGV2Yy0+YnlwYXNzX2R2ZW5sKQorCQkJZGVjb2RlX21vZGUgPQorCQkJCShoZXZjLT5zdGFydF9wYXJzZXJfdHlwZSA8PCA4KQorCQkJCXwgREVDT0RFX01PREVfTVVMVElfU1RSRUFNQkFTRTsKKwkJZWxzZQorCQkJZGVjb2RlX21vZGUgPQorCQkJCShoZXZjLT5zdGFydF9wYXJzZXJfdHlwZSA8PCA4KQorCQkJCXwgREVDT0RFX01PREVfTVVMVElfRFZCQUw7CisJfSBlbHNlIGlmICh2ZGVjLT5tYXN0ZXIpCisJCWRlY29kZV9tb2RlID0KKwkJCShoZXZjLT5zdGFydF9wYXJzZXJfdHlwZSA8PCA4KQorCQkJfCBERUNPREVfTU9ERV9NVUxUSV9EVkVOTDsKKyNlbmRpZgorCWVsc2UKKwkJZGVjb2RlX21vZGUgPQorCQkJREVDT0RFX01PREVfTVVMVElfU1RSRUFNQkFTRTsKKworCWlmIChoZXZjLT5tX2luc19mbGFnKQorCQlkZWNvZGVfbW9kZSB8PQorCQkJKGhldmMtPnN0YXJ0X2RlY29kaW5nX2ZsYWcgPDwgMTYpOworCS8qIHNldCBNQlgwIGludGVycnVwdCBmbGFnICovCisJZGVjb2RlX21vZGUgfD0gKDB4ODAgPDwgMjQpOworCVdSSVRFX1ZSRUcoSEVWQ19ERUNPREVfTU9ERSwgZGVjb2RlX21vZGUpOworCVdSSVRFX1ZSRUcoSEVWQ19ERUNPREVfTU9ERTIsCisJCWhldmMtPnJwc19zZXRfaWQpOworfQorCitzdGF0aWMgdm9pZCB2aDI2NV9wcm90X2luaXQoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGhldmMpOworI2VuZGlmCisJLyogSDI2NV9ERUNPREVfSU5JVCgpOyAqLworCisJaGV2Y19jb25maWdfd29ya19zcGFjZV9odyhoZXZjKTsKKworCWhldmNfaW5pdF9kZWNvZGVyX2h3KGhldmMsIDAsIDB4ZmZmZmZmZmYpOworCisJV1JJVEVfVlJFRyhIRVZDX1dBSVRfRkxBRywgMSk7CisKKwkvKiBXUklURV9WUkVHKFBfSEVWQ19NUFNSLCAxKTsgKi8KKworCS8qIGNsZWFyIG1haWxib3ggaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9NQk9YMF9DTFJfUkVHLCAxKTsKKworCS8qIGVuYWJsZSBtYWlsYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTUJPWDBfTUFTSywgMSk7CisKKwkvKiBkaXNhYmxlIFBTQ0FMRSBmb3IgaGFyZHdhcmUgc2hhcmluZyAqLworCVdSSVRFX1ZSRUcoSEVWQ19QU0NBTEVfQ1RSTCwgMCk7CisKKwlXUklURV9WUkVHKERFQlVHX1JFRzEsIDB4MCB8IChkdW1wX25hbCA8PCA4KSk7CisKKwlpZiAoKGdldF9kYmdfZmxhZyhoZXZjKSAmCisJCShIMjY1X0RFQlVHX01BTl9TS0lQX05BTCB8CisJCUgyNjVfREVCVUdfTUFOX1NFQVJDSF9OQUwpKQorCQkvKnx8aGV2Yy0+bV9pbnNfZmxhZyovCisJCSkgeworCQlXUklURV9WUkVHKE5BTF9TRUFSQ0hfQ1RMLCAweDEpOwkvKiBtYW51YWwgcGFyc2VyIE5BTCAqLworCX0gZWxzZSB7CisJCS8qIGNoZWNrIHZwcy9zcHMvcHBzL2ktc2xpY2UgaW4gdWNvZGUgKi8KKwkJdW5zaWduZWQgY3RsX3ZhbCA9IDB4ODsKKwkJaWYgKGhldmMtPlBCX3NraXBfbW9kZSA9PSAwKQorCQkJY3RsX3ZhbCA9IDB4NDsJLyogY2hlY2sgdnBzL3Nwcy9wcHMgb25seSBpbiB1Y29kZSAqLworCQllbHNlIGlmIChoZXZjLT5QQl9za2lwX21vZGUgPT0gMykKKwkJCWN0bF92YWwgPSAweDA7CS8qIGNoZWNrIHZwcy9zcHMvcHBzL2lkciBpbiB1Y29kZSAqLworCQkvKmlmICgoKGVycm9yX2hhbmRsZV9wb2xpY3kgJiAweDIwMCkgPT0gMCkgJiYKKwkJCQlpbnB1dF9zdHJlYW1fYmFzZWQodmRlYykpCisJCQljdGxfdmFsID0gMHgxOyovCisJCVdSSVRFX1ZSRUcoTkFMX1NFQVJDSF9DVEwsIGN0bF92YWwpOworCX0KKwlpZiAoKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfTk9fRU9TX1NFQVJDSF9ET05FKQorI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJCXx8IHZkZWMtPm1hc3RlcgorCQl8fCB2ZGVjLT5zbGF2ZQorI2VuZGlmCisJCSkKKwkJV1JJVEVfVlJFRyhOQUxfU0VBUkNIX0NUTCwgUkVBRF9WUkVHKE5BTF9TRUFSQ0hfQ1RMKSB8IDB4MTAwMDApOworCisJV1JJVEVfVlJFRyhOQUxfU0VBUkNIX0NUTCwKKwkJUkVBRF9WUkVHKE5BTF9TRUFSQ0hfQ1RMKQorCQl8ICgocGFyc2VyX3NlaV9lbmFibGUgJiAweDcpIDw8IDE3KSk7CisvKiNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTiovCisJV1JJVEVfVlJFRyhOQUxfU0VBUkNIX0NUTCwKKwkJUkVBRF9WUkVHKE5BTF9TRUFSQ0hfQ1RMKSB8CisJCSgocGFyc2VyX2RvbGJ5X3Zpc2lvbl9lbmFibGUgJiAweDEpIDw8IDIwKSk7CisvKiNlbmRpZiovCisJV1JJVEVfVlJFRyhERUNPREVfU1RPUF9QT1MsIHVkZWJ1Z19mbGFnKTsKKworCWNvbmZpZ19kZWNvZGVfbW9kZShoZXZjKTsKKwljb25maWdfYXV4X2J1ZihoZXZjKTsKKyNpZmRlZiBTV0FQX0hFVkNfVUNPREUKKwlpZiAoIXRlZV9lbmFibGVkKCkgJiYgaGV2Yy0+aXNfc3dhcCAmJgorCQlnZXRfY3B1X21ham9yX2lkKCkgPD0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTSkgeworCQlXUklURV9WUkVHKEhFVkNfU1RSRUFNX1NXQVBfQlVGRkVSMiwgaGV2Yy0+bWNfZG1hX2hhbmRsZSk7CisJCS8qcHJfaW5mbygid3JpdGUgc3dhcCBidWZmZXIgJXhcbiIsICh1MzIpKGhldmMtPm1jX2RtYV9oYW5kbGUpKTsqLworCX0KKyNlbmRpZgorI2lmZGVmIERFVFJFRklMTF9FTkFCTEUKKwlpZiAoaGV2Yy0+aXNfc3dhcCAmJgorCQlnZXRfY3B1X21ham9yX2lkKCkgPD0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTSkgeworCQlXUklURV9WUkVHKEhFVkNfU0FPX0RCR19NT0RFMCwgMCk7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fREJHX01PREUxLCAwKTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIGludCB2aDI2NV9sb2NhbF9pbml0KHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJaW50IGk7CisJaW50IHJldCA9IC0xOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGhldmMpOworCisjaWZkZWYgREVCVUdfUFRTCisJaGV2Yy0+cHRzX21pc3NlZCA9IDA7CisJaGV2Yy0+cHRzX2hpdCA9IDA7CisjZW5kaWYKKwloZXZjLT5zYXZlZF9yZXNvbHV0aW9uID0gMDsKKwloZXZjLT5nZXRfZnJhbWVfZHVyID0gZmFsc2U7CisJaGV2Yy0+ZnJhbWVfd2lkdGggPSBoZXZjLT52aDI2NV9hbXN0cmVhbV9kZWNfaW5mby53aWR0aDsKKwloZXZjLT5mcmFtZV9oZWlnaHQgPSBoZXZjLT52aDI2NV9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQ7CisJaGV2Yy0+ZGVjX2FnYWluX2NudCA9IDA7CisKKwlpZiAoaXNfb3ZlcnNpemUoaGV2Yy0+ZnJhbWVfd2lkdGgsIGhldmMtPmZyYW1lX2hlaWdodCkpIHsKKwkJcHJfaW5mbygib3ZlciBzaXplIDogJXUgeCAldS5cbiIsCisJCQloZXZjLT5mcmFtZV93aWR0aCwgaGV2Yy0+ZnJhbWVfaGVpZ2h0KTsKKwkJaGV2Yy0+ZmF0YWxfZXJyb3IgfD0gREVDT0RFUl9GQVRBTF9FUlJPUl9TSVpFX09WRVJGTE9XOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChoZXZjLT5tYXhfcGljX3cgJiYgaGV2Yy0+bWF4X3BpY19oKSB7CisJCWhldmMtPmlzXzRrID0gIShoZXZjLT5tYXhfcGljX3cgJiYgaGV2Yy0+bWF4X3BpY19oKSB8fAorCQkJKChoZXZjLT5tYXhfcGljX3cgKiBoZXZjLT5tYXhfcGljX2gpID4KKwkJCTE5MjAgKiAxMDg4KSA/IHRydWUgOiBmYWxzZTsKKwl9IGVsc2UgeworCQloZXZjLT5pc180ayA9ICEoaGV2Yy0+ZnJhbWVfd2lkdGggJiYgaGV2Yy0+ZnJhbWVfaGVpZ2h0KSB8fAorCQkJKChoZXZjLT5mcmFtZV93aWR0aCAqIGhldmMtPmZyYW1lX2hlaWdodCkgPgorCQkJMTkyMCAqIDEwODgpID8gdHJ1ZSA6IGZhbHNlOworCX0KKworCWhldmMtPmZyYW1lX2R1ciA9CisJCShoZXZjLT52aDI2NV9hbXN0cmVhbV9kZWNfaW5mby5yYXRlID09CisJCSAwKSA/IDM2MDAgOiBoZXZjLT52aDI2NV9hbXN0cmVhbV9kZWNfaW5mby5yYXRlOworCS8vaGV2Yy0+Z3ZzLT5mcmFtZV9kdXIgPSBoZXZjLT5mcmFtZV9kdXI7CisJaWYgKGhldmMtPmZyYW1lX3dpZHRoICYmIGhldmMtPmZyYW1lX2hlaWdodCkKKwkJaGV2Yy0+ZnJhbWVfYXIgPSBoZXZjLT5mcmFtZV9oZWlnaHQgKiAweDEwMCAvIGhldmMtPmZyYW1lX3dpZHRoOworCisJaWYgKGlfb25seV9mbGFnKQorCQloZXZjLT5pX29ubHkgPSBpX29ubHlfZmxhZyAmIDB4ZmY7CisJZWxzZSBpZiAoKHVuc2lnbmVkIGxvbmcpIGhldmMtPnZoMjY1X2Ftc3RyZWFtX2RlY19pbmZvLnBhcmFtCisJCSYgMHgwOCkKKwkJaGV2Yy0+aV9vbmx5ID0gMHg3OworCWVsc2UKKwkJaGV2Yy0+aV9vbmx5ID0gMHgwOworCWhldmMtPmVycm9yX3dhdGNoZG9nX2NvdW50ID0gMDsKKwloZXZjLT5zZWlfcHJlc2VudF9mbGFnID0gMDsKKwlpZiAodmRlYy0+c3lzX2luZm8pCisJCXB0c191bnN0YWJsZSA9ICgodW5zaWduZWQgbG9uZyl2ZGVjLT5zeXNfaW5mby0+cGFyYW0KKwkJCSYgMHg0MCkgPj4gNjsKKwloZXZjX3ByaW50KGhldmMsIDAsCisJCSJoMjY1OnB0c191bnN0YWJsZT0lZFxuIiwgcHRzX3Vuc3RhYmxlKTsKKy8qCisgKlRPRE86Rk9SIFZFUlNJT04KKyAqLworCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJImgyNjU6IHZlciAoJWQsJWQpIGRlY2luZm86ICVkeCVkIHJhdGU9JWRcbiIsIGgyNjVfdmVyc2lvbiwKKwkJICAgMCwgaGV2Yy0+ZnJhbWVfd2lkdGgsIGhldmMtPmZyYW1lX2hlaWdodCwgaGV2Yy0+ZnJhbWVfZHVyKTsKKworCWlmIChoZXZjLT5mcmFtZV9kdXIgPT0gMCkKKwkJaGV2Yy0+ZnJhbWVfZHVyID0gOTYwMDAgLyAyNDsKKworCUlOSVRfS0ZJRk8oaGV2Yy0+ZGlzcGxheV9xKTsKKwlJTklUX0tGSUZPKGhldmMtPm5ld2ZyYW1lX3EpOworCUlOSVRfS0ZJRk8oaGV2Yy0+cGVuZGluZ19xKTsKKworCWZvciAoaSA9IDA7IGkgPCBWRl9QT09MX1NJWkU7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKnZmID0gJmhldmMtPnZmcG9vbFtpXTsKKworCQloZXZjLT52ZnBvb2xbaV0uaW5kZXggPSAtMTsKKwkJa2ZpZm9fcHV0KCZoZXZjLT5uZXdmcmFtZV9xLCB2Zik7CisJfQorCisKKwlyZXQgPSBoZXZjX2xvY2FsX2luaXQoaGV2Yyk7CisKKwlyZXR1cm4gcmV0OworfQorI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKK3N0YXRpYyBzMzIgdmgyNjVfaW5pdChzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPSAoc3RydWN0IGhldmNfc3RhdGVfcyAqKXZkZWMtPnByaXZhdGU7CisjZWxzZQorc3RhdGljIHMzMiB2aDI2NV9pbml0KHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisKKyNlbmRpZgorCWludCByZXQsIHNpemUgPSAtMTsKKwlpbnQgZndfc2l6ZSA9IDB4MTAwMCAqIDE2OworCXN0cnVjdCBmaXJtd2FyZV9zICpmdyA9IE5VTEw7CisKKwl0aW1lcl9zZXR1cCgmaGV2Yy0+dGltZXIsIHZoMjY1X2NoZWNrX3RpbWVyX2Z1bmMsIDApOworCisJaGV2Yy0+c3RhdCB8PSBTVEFUX1RJTUVSX0lOSVQ7CisKKwlpZiAoaGV2Yy0+bV9pbnNfZmxhZykgeworI2lmZGVmIFVTRV9VTklOSVRfU0VNQQorCQlzZW1hX2luaXQoJmhldmMtPmgyNjVfdW5pbml0X2RvbmVfc2VtYSwgMCk7CisjZW5kaWYKKwkJSU5JVF9XT1JLKCZoZXZjLT53b3JrLCB2aDI2NV93b3JrKTsKKwkJSU5JVF9XT1JLKCZoZXZjLT50aW1lb3V0X3dvcmssIHZoMjY1X3RpbWVvdXRfd29yayk7CisJfQorCisJaWYgKHZoMjY1X2xvY2FsX2luaXQoaGV2YykgPCAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJbXV0ZXhfaW5pdCgmaGV2Yy0+Y2h1bmtzX211dGV4KTsKKwlJTklUX1dPUksoJmhldmMtPm5vdGlmeV93b3JrLCB2aDI2NV9ub3RpZnlfd29yayk7CisJSU5JVF9XT1JLKCZoZXZjLT5zZXRfY2xrX3dvcmssIHZoMjY1X3NldF9jbGspOworCisJZncgPSB2emFsbG9jKHNpemVvZihzdHJ1Y3QgZmlybXdhcmVfcykgKyBmd19zaXplKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZncpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChoZXZjLT5tbXVfZW5hYmxlKSB7CisJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPiBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hNKQorCQkJc2l6ZSA9IGdldF9maXJtd2FyZV9kYXRhKFZJREVPX0RFQ19IRVZDX01NVSwgZnctPmRhdGEpOworCQllbHNlIHsKKwkJCWlmICghaGV2Yy0+aXNfNGspIHsKKwkJCQkvKiBpZiBhbiBvbGRlciB2ZXJzaW9uIG9mIHRoZSBmdyB3YXMgbG9hZGVkLCAqLworCQkJCS8qIG5lZWRzIHRyeSB0byBsb2FkIG5vc3dhcCBmdyBiZWNhdXNlIHRoZSAqLworCQkJCS8qIG9sZCBmdyBwYWNrYWdlIGRvc2Ugbm90IGNvbnRhaW4gdGhlIHN3YXAgZncuKi8KKwkJCQlzaXplID0gZ2V0X2Zpcm13YXJlX2RhdGEoCisJCQkJCVZJREVPX0RFQ19IRVZDX01NVV9TV0FQLCBmdy0+ZGF0YSk7CisJCQkJaWYgKHNpemUgPCAwKQorCQkJCQlzaXplID0gZ2V0X2Zpcm13YXJlX2RhdGEoCisJCQkJCQlWSURFT19ERUNfSEVWQ19NTVUsIGZ3LT5kYXRhKTsKKwkJCQllbHNlIGlmIChzaXplKQorCQkJCQloZXZjLT5pc19zd2FwID0gdHJ1ZTsKKwkJCX0gZWxzZQorCQkJCXNpemUgPSBnZXRfZmlybXdhcmVfZGF0YShWSURFT19ERUNfSEVWQ19NTVUsCisJCQkJCWZ3LT5kYXRhKTsKKwkJfQorCX0gZWxzZQorCQlzaXplID0gZ2V0X2Zpcm13YXJlX2RhdGEoVklERU9fREVDX0hFVkMsIGZ3LT5kYXRhKTsKKworCWlmIChzaXplIDwgMCkgeworCQlwcl9lcnIoImdldCBmaXJtd2FyZSBmYWlsLlxuIik7CisJCXZmcmVlKGZ3KTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZ3LT5sZW4gPSBzaXplOworCisjaWZkZWYgU1dBUF9IRVZDX1VDT0RFCisJaWYgKCF0ZWVfZW5hYmxlZCgpICYmIGhldmMtPmlzX3N3YXAgJiYKKwkJZ2V0X2NwdV9tYWpvcl9pZCgpIDw9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWE0pIHsKKwkJaWYgKGhldmMtPm1tdV9lbmFibGUpIHsKKwkJCWhldmMtPnN3YXBfc2l6ZSA9ICg0ICogKDQgKiBTWl8xSykpOyAvKm1heCA0IHN3YXAgY29kZSwgZWFjaCAweDQwMCovCisJCQloZXZjLT5tY19jcHVfYWRkciA9CisJCQkJZG1hX2FsbG9jX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQkJaGV2Yy0+c3dhcF9zaXplLAorCQkJCQkmaGV2Yy0+bWNfZG1hX2hhbmRsZSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWhldmMtPm1jX2NwdV9hZGRyKSB7CisJCQkJYW1oZXZjX2Rpc2FibGUoKTsKKwkJCQlwcl9pbmZvKCJ2aDI2NSBtbXUgc3dhcCB1Y29kZSBsb2FkZWQgZmFpbC5cbiIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCisJCQltZW1jcHkoKHU4ICopIGhldmMtPm1jX2NwdV9hZGRyLCBmdy0+ZGF0YSArIFNXQVBfSEVWQ19PRkZTRVQsCisJCQkJaGV2Yy0+c3dhcF9zaXplKTsKKworCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSJ2aDI2NSBtbXUgdWNvZGUgc3dhcCBsb2FkZWQgJXhcbiIsCisJCQkJaGV2Yy0+bWNfZG1hX2hhbmRsZSk7CisJCX0KKwl9CisjZW5kaWYKKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlpZiAoaGV2Yy0+bV9pbnNfZmxhZykgeworCQkvL2hldmMtPnRpbWVyLmRhdGEgPSAodWxvbmcpIGhldmM7CisJCS8vaGV2Yy0+dGltZXIuZnVuY3Rpb24gPSB2aDI2NV9jaGVja190aW1lcl9mdW5jOworCQloZXZjLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIFBVVF9JTlRFUlZBTDsKKworCQloZXZjLT5mdyA9IGZ3OworCQloZXZjLT5pbml0X2ZsYWcgPSAxOworCisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCWFtaGV2Y19lbmFibGUoKTsKKworCWlmIChoZXZjLT5tbXVfZW5hYmxlKQorCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID4gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTSkKKwkJCXJldCA9IGFtaGV2Y19sb2FkbWNfZXgoVkZPUk1BVF9IRVZDLCAiaDI2NV9tbXUiLCBmdy0+ZGF0YSk7CisJCWVsc2UgeworCQkJaWYgKCFoZXZjLT5pc180aykgeworCQkJCS8qIGlmIGFuIG9sZGVyIHZlcnNpb24gb2YgdGhlIGZ3IHdhcyBsb2FkZWQsICovCisJCQkJLyogbmVlZHMgdHJ5IHRvIGxvYWQgbm9zd2FwIGZ3IGJlY2F1c2UgdGhlICovCisJCQkJLyogb2xkIGZ3IHBhY2thZ2UgZG9zZSBub3QgY29udGFpbiB0aGUgc3dhcCBmdy4gKi8KKwkJCQlyZXQgPSBhbWhldmNfbG9hZG1jX2V4KFZGT1JNQVRfSEVWQywKKwkJCQkJImhldmNfbW11X3N3YXAiLCBmdy0+ZGF0YSk7CisJCQkJaWYgKHJldCA8IDApCisJCQkJCXJldCA9IGFtaGV2Y19sb2FkbWNfZXgoVkZPUk1BVF9IRVZDLAorCQkJCQkJImgyNjVfbW11IiwgZnctPmRhdGEpOworCQkJCWVsc2UKKwkJCQkJaGV2Yy0+aXNfc3dhcCA9IHRydWU7CisJCQl9IGVsc2UKKwkJCQlyZXQgPSBhbWhldmNfbG9hZG1jX2V4KFZGT1JNQVRfSEVWQywKKwkJCQkJImgyNjVfbW11IiwgZnctPmRhdGEpOworCQl9CisJZWxzZQorCQlyZXQgPSBhbWhldmNfbG9hZG1jX2V4KFZGT1JNQVRfSEVWQywgTlVMTCwgZnctPmRhdGEpOworCisJaWYgKHJldCA8IDApIHsKKwkJYW1oZXZjX2Rpc2FibGUoKTsKKwkJdmZyZWUoZncpOworCQlwcl9lcnIoIkgyNjU6IHRoZSAlcyBmdyBsb2FkaW5nIGZhaWxlZCwgZXJyOiAleFxuIiwKKwkJCXRlZV9lbmFibGVkKCkgPyAiVEVFIiA6ICJsb2NhbCIsIHJldCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJdmZyZWUoZncpOworCisJaGV2Yy0+c3RhdCB8PSBTVEFUX01DX0xPQUQ7CisKKyNpZmRlZiBERVRSRUZJTExfRU5BQkxFCisJaWYgKGhldmMtPmlzX3N3YXAgJiYKKwkJZ2V0X2NwdV9tYWpvcl9pZCgpIDw9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWE0pCisJCWluaXRfZGV0cmVmaWxsX2J1ZihoZXZjKTsKKyNlbmRpZgorCS8qIGVuYWJsZSBBTVJJU0Mgc2lkZSBwcm90b2NvbCAqLworCXZoMjY1X3Byb3RfaW5pdChoZXZjKTsKKworCWlmICh2ZGVjX3JlcXVlc3RfdGhyZWFkZWRfaXJxKFZERUNfSVJRXzAsIHZoMjY1X2lzciwKKwkJCQl2aDI2NV9pc3JfdGhyZWFkX2ZuLAorCQkJCUlSUUZfT05FU0hPVCwvKnJ1biB0aHJlYWQgb24gdGhpcyBpcnEgZGlzYWJsZWQqLworCQkJCSJ2aDI2NS1pcnEiLCAodm9pZCAqKWhldmMpKSB7CisJCWhldmNfcHJpbnQoaGV2YywgMCwgInZoMjY1IGlycSByZWdpc3RlciBlcnJvci5cbiIpOworCQlhbWhldmNfZGlzYWJsZSgpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwloZXZjLT5zdGF0IHw9IFNUQVRfSVNSX1JFRzsKKwloZXZjLT5wcm92aWRlcl9uYW1lID0gUFJPVklERVJfTkFNRTsKKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlpZiAoIWhldmMtPmlzX3VzZWRfdjRsKSB7CisJCXZmX3Byb3ZpZGVyX2luaXQoJnZoMjY1X3ZmX3Byb3YsIGhldmMtPnByb3ZpZGVyX25hbWUsCisJCQkJCSZ2aDI2NV92Zl9wcm92aWRlciwgdmRlYyk7CisJCXZmX3JlZ19wcm92aWRlcigmdmgyNjVfdmZfcHJvdik7CisJCXZmX25vdGlmeV9yZWNlaXZlcihoZXZjLT5wcm92aWRlcl9uYW1lLCBWRlJBTUVfRVZFTlRfUFJPVklERVJfU1RBUlQsCisJCQkJCU5VTEwpOworCQlpZiAoaGV2Yy0+ZnJhbWVfZHVyICE9IDApIHsKKwkJCWlmICghaXNfcmVzZXQpIHsKKwkJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoaGV2Yy0+cHJvdmlkZXJfbmFtZSwKKwkJCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9GUl9ISU5ULAorCQkJCQkJKHZvaWQgKikKKwkJCQkJCSgodW5zaWduZWQgbG9uZyloZXZjLT5mcmFtZV9kdXIpKTsKKwkJCQlmcl9oaW50X3N0YXR1cyA9IFZERUNfSElOVEVEOworCQkJfQorCQl9IGVsc2UKKwkJCWZyX2hpbnRfc3RhdHVzID0gVkRFQ19ORUVEX0hJTlQ7CisJfQorI2Vsc2UKKwl2Zl9wcm92aWRlcl9pbml0KCZ2aDI2NV92Zl9wcm92LCBQUk9WSURFUl9OQU1FLCAmdmgyNjVfdmZfcHJvdmlkZXIsCisJCQkJCSBoZXZjKTsKKwl2Zl9yZWdfcHJvdmlkZXIoJnZoMjY1X3ZmX3Byb3YpOworCXZmX25vdGlmeV9yZWNlaXZlcihQUk9WSURFUl9OQU1FLCBWRlJBTUVfRVZFTlRfUFJPVklERVJfU1RBUlQsIE5VTEwpOworCWlmIChoZXZjLT5mcmFtZV9kdXIgIT0gMCkgeworCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoUFJPVklERVJfTkFNRSwKKwkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfRlJfSElOVCwKKwkJCQkodm9pZCAqKQorCQkJCSgodW5zaWduZWQgbG9uZyloZXZjLT5mcmFtZV9kdXIpKTsKKwkJZnJfaGludF9zdGF0dXMgPSBWREVDX0hJTlRFRDsKKwl9IGVsc2UKKwkJZnJfaGludF9zdGF0dXMgPSBWREVDX05FRURfSElOVDsKKyNlbmRpZgorCWhldmMtPnN0YXQgfD0gU1RBVF9WRl9IT09LOworCisJLy9oZXZjLT50aW1lci5kYXRhID0gKHVsb25nKSBoZXZjOworCS8vaGV2Yy0+dGltZXIuZnVuY3Rpb24gPSB2aDI2NV9jaGVja190aW1lcl9mdW5jOworCWhldmMtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgUFVUX0lOVEVSVkFMOworCisJYWRkX3RpbWVyKCZoZXZjLT50aW1lcik7CisKKwloZXZjLT5zdGF0IHw9IFNUQVRfVElNRVJfQVJNOworCisJaWYgKHVzZV9jbWEpIHsKKyNpZmRlZiBVU0VfVU5JTklUX1NFTUEKKwkJc2VtYV9pbml0KCZoZXZjLT5oMjY1X3VuaW5pdF9kb25lX3NlbWEsIDApOworI2VuZGlmCisJCWlmIChoMjY1X3Rhc2sgPT0gTlVMTCkgeworCQkJc2VtYV9pbml0KCZoMjY1X3NlbWEsIDEpOworCQkJaDI2NV90YXNrID0KKwkJCQlrdGhyZWFkX3J1bihoMjY1X3Rhc2tfaGFuZGxlLCBoZXZjLAorCQkJCQkJImt0aHJlYWRfaDI2NSIpOworCQl9CisJfQorCS8qIGhldmMtPnN0YXQgfD0gU1RBVF9LVEhSRUFEOyAqLworI2lmIDAKKwlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19GT1JDRV9DTEspIHsKKwkJaGV2Y19wcmludChoZXZjLCAwLCAiJXMgZm9yY2UgY2xrXG4iLCBfX2Z1bmNfXyk7CisJCVdSSVRFX1ZSRUcoSEVWQ19JUUlUX0NMS19SU1RfQ1RSTCwKKwkJCQkgICBSRUFEX1ZSRUcoSEVWQ19JUUlUX0NMS19SU1RfQ1RSTCkgfAorCQkJCSAgICgoMSA8PCAyKSB8ICgxIDw8IDEpKSk7CisJCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGRzAsCisJCQkJUkVBRF9WUkVHKEhFVkNfREJMS19DRkcwKSB8ICgoMSA8PCAyKSB8CisJCQkJCSgxIDw8IDEpIHwgMHgzZmZmMDAwMCkpOy8qIDIsMjk6MTYgKi8KKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMMSwgUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkwxKSB8CisJCQkJKDEgPDwgMikpOwkvKiAyICovCisJCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9DVFJMMSwgUkVBRF9WUkVHKEhFVkNfTVBSRURfQ1RSTDEpIHwKKwkJCQkoMSA8PCAyNCkpOwkvKiAyNCAqLworCQlXUklURV9WUkVHKEhFVkNfU1RSRUFNX0NPTlRST0wsCisJCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0NPTlRST0wpIHwKKwkJCQkoMSA8PCAxNSkpOwkvKiAxNSAqLworCQlXUklURV9WUkVHKEhFVkNfQ0FCQUNfQ09OVFJPTCwgUkVBRF9WUkVHKEhFVkNfQ0FCQUNfQ09OVFJPTCkgfAorCQkJCSgxIDw8IDEzKSk7CS8qIDEzICovCisJCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfQ09SRV9DT05UUk9MLAorCQkJCVJFQURfVlJFRyhIRVZDX1BBUlNFUl9DT1JFX0NPTlRST0wpIHwKKwkJCQkoMSA8PCAxNSkpOwkvKiAxNSAqLworCQlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0lOVF9DT05UUk9MLAorCQkJCVJFQURfVlJFRyhIRVZDX1BBUlNFUl9JTlRfQ09OVFJPTCkgfAorCQkJCSgxIDw8IDE1KSk7CS8qIDE1ICovCisJCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfSUZfQ09OVFJPTCwKKwkJCQlSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfSUZfQ09OVFJPTCkgfCAoKDEgPDwgNikgfAorCQkJCQkoMSA8PCAzKSB8ICgxIDw8IDEpKSk7CS8qIDYsIDMsIDEgKi8KKwkJV1JJVEVfVlJFRyhIRVZDRF9JUFBfRFlOQ0xLR0FURV9DT05GSUcsIDB4ZmZmZmZmZmYpOwkvKiAzMTowICovCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMSwgUkVBRF9WUkVHKEhFVkNEX01DUkNDX0NUTDEpIHwKKwkJCQkoMSA8PCAzKSk7CS8qIDMgKi8KKwl9CisjZW5kaWYKKyNpZmRlZiBTV0FQX0hFVkNfVUNPREUKKwlpZiAoIXRlZV9lbmFibGVkKCkgJiYgaGV2Yy0+aXNfc3dhcCAmJgorCQlnZXRfY3B1X21ham9yX2lkKCkgPD0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTSkgeworCQlXUklURV9WUkVHKEhFVkNfU1RSRUFNX1NXQVBfQlVGRkVSMiwgaGV2Yy0+bWNfZG1hX2hhbmRsZSk7CisJCS8qcHJfaW5mbygid3JpdGUgc3dhcCBidWZmZXIgJXhcbiIsICh1MzIpKGhldmMtPm1jX2RtYV9oYW5kbGUpKTsqLworCX0KKyNlbmRpZgorCisjaWZuZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlzZXRfdmRlY19mdW5jKCZ2aDI2NV9kZWNfc3RhdHVzKTsKKyNlbmRpZgorCWFtaGV2Y19zdGFydCgpOworCisJV1JJVEVfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQsIDApOworCisJaGV2Yy0+c3RhdCB8PSBTVEFUX1ZERUNfUlVOOworCWhldmMtPmluaXRfZmxhZyA9IDE7CisJZXJyb3JfaGFuZGxlX3RocmVzaG9sZCA9IDMwOworCS8qIHByX2luZm8oIiVkLCB2aDI2NV9pbml0LCBSUD0weCV4XG4iLAorCSAqICAgX19MSU5FX18sIFJFQURfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIpKTsKKwkgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX2RpcnR5X2RhdGEoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjID0KKwkJKHN0cnVjdCBoZXZjX3N0YXRlX3MgKikodmRlYy0+cHJpdmF0ZSk7CisJc3RydWN0IHZkZWNfaW5wdXRfcyAqaW5wdXQgPSAmdmRlYy0+aW5wdXQ7CisJdTMyIHdwLCBycCwgbGV2ZWw7CisJdTMyIHJwX3NldDsKKworCXJwID0gU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3JwKTsKKwl3cCA9IGhldmMtPnByZV9wYXJzZXJfd3JfcHRyOworCisJaWYgKHdwID4gcnApCisJCWxldmVsID0gd3AgLSBycDsKKwllbHNlCisJCWxldmVsID0gd3AgKyB2ZGVjLT5pbnB1dC5zaXplIC0gcnA7CisKKwlpZiAobGV2ZWwgPiAweDEwMDAwMCkgeworCQl1MzIgc2tpcF9zaXplID0gKChsZXZlbCA+PiAxKSA+PiAxOSkgPDwgMTk7CisJCWlmICghdmRlYy0+aW5wdXQuc3dhcF92YWxpZCkgeworCQkJaGV2Y19wcmludChoZXZjICwgMCwgImgyNjUgc3RhcnQgZGF0YSBkaXNjYXJkIGxldmVsIDB4JXgsIGJ1ZmZlciBsZXZlbCAweCV4LCBSUCAweCV4LCBXUCAweCV4XG4iLAorCQkJCSgobGV2ZWwgPj4gMSkgPj4gMTkpIDw8IDE5LCBsZXZlbCwgcnAsIHdwKTsKKwkJCWlmICh3cCA+PSBycCkgeworCQkJCXJwX3NldCA9IHJwICsgc2tpcF9zaXplOworCQkJfQorCQkJZWxzZSBpZiAoKHJwICsgc2tpcF9zaXplKSA8IChpbnB1dC0+c3RhcnQgKyBpbnB1dC0+c2l6ZSkpIHsKKwkJCQlycF9zZXQgPSBycCArIHNraXBfc2l6ZTsKKwkJCX0gZWxzZSB7CisJCQkJcnBfc2V0ID0gcnAgKyBza2lwX3NpemUgLSBpbnB1dC0+c2l6ZTsKKwkJCX0KKwkJCVNUQlVGX1dSSVRFKCZ2ZGVjLT52YnVmLCBzZXRfcnAsIHJwX3NldCk7CisJCQl2ZGVjLT5kaXNjYXJkX3N0YXJ0X2RhdGFfZmxhZyA9IDE7CisJCQl2ZGVjLT5pbnB1dC5zdHJlYW1fY29va2llICs9IHNraXBfc2l6ZTsKKwkJCWhldmMtPmRpcnR5X3NoaWZ0X2ZsYWcgPSAxOworCQl9CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGVja19kYXRhX3NpemUoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpodyA9CisJCShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICopKHZkZWMtPnByaXZhdGUpOworCXUzMiB3cCwgcnAsIGxldmVsOworCisJcnAgPSBTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfcnApOworCXdwID0gU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3dwKTsKKworCWlmICh3cCA+IHJwKQorCQlsZXZlbCA9IHdwIC0gcnA7CisJZWxzZQorCQlsZXZlbCA9IHdwICsgdmRlYy0+aW5wdXQuc2l6ZSAtIHJwIDsKKworCWlmIChsZXZlbCA+ICh2ZGVjLT5pbnB1dC5zaXplIC8gMikpCisJCWh3LT5kZWNfYWdhaW5fY250Kys7CisKKwlpZiAoaHctPmRlY19hZ2Fpbl9jbnQgPiBkaXJ0eV9hZ2Fpbl90aHJlc2hvbGQpIHsKKwkJaGV2Y19wcmludChodywgMCwgImgyNjUgZGF0YSBza2lwcGVkICV4XG4iLCBsZXZlbCk7CisJCWh3LT5kZWNfYWdhaW5fY250ID0gMDsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZoMjY1X3N0b3Aoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYKKwkJSDI2NV9ERUJVR19XQUlUX0RFQ09ERV9ET05FX1dIRU5fU1RPUCkgeworCQlpbnQgd2FpdF90aW1lb3V0X2NvdW50ID0gMDsKKworCQl3aGlsZSAoUkVBRF9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcpID09CisJCQkgICBIRVZDX0NPREVEX1NMSUNFX1NFR01FTlRfREFUICYmCisJCQkJd2FpdF90aW1lb3V0X2NvdW50IDwgMTApeworCQkJd2FpdF90aW1lb3V0X2NvdW50Kys7CisJCQltc2xlZXAoMjApOworCQl9CisJfQorCWlmIChoZXZjLT5zdGF0ICYgU1RBVF9WREVDX1JVTikgeworCQlhbWhldmNfc3RvcCgpOworCQloZXZjLT5zdGF0ICY9IH5TVEFUX1ZERUNfUlVOOworCX0KKworCWlmIChoZXZjLT5zdGF0ICYgU1RBVF9JU1JfUkVHKSB7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQlpZiAoIWhldmMtPm1faW5zX2ZsYWcpCisjZW5kaWYKKwkJCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTUJPWDBfTUFTSywgMCk7CisJCXZkZWNfZnJlZV9pcnEoVkRFQ19JUlFfMCwgKHZvaWQgKiloZXZjKTsKKwkJaGV2Yy0+c3RhdCAmPSB+U1RBVF9JU1JfUkVHOworCX0KKworCWhldmMtPnN0YXQgJj0gflNUQVRfVElNRVJfSU5JVDsKKwlpZiAoaGV2Yy0+c3RhdCAmIFNUQVRfVElNRVJfQVJNKSB7CisJCWRlbF90aW1lcl9zeW5jKCZoZXZjLT50aW1lcik7CisJCWhldmMtPnN0YXQgJj0gflNUQVRfVElNRVJfQVJNOworCX0KKworCWlmIChoZXZjLT5zdGF0ICYgU1RBVF9WRl9IT09LKSB7CisJCWlmIChmcl9oaW50X3N0YXR1cyA9PSBWREVDX0hJTlRFRCkgeworCQkJdmZfbm90aWZ5X3JlY2VpdmVyKGhldmMtPnByb3ZpZGVyX25hbWUsCisJCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9GUl9FTkRfSElOVCwKKwkJCQkJTlVMTCk7CisJCX0KKwkJZnJfaGludF9zdGF0dXMgPSBWREVDX05PX05FRURfSElOVDsKKwkJdmZfdW5yZWdfcHJvdmlkZXIoJnZoMjY1X3ZmX3Byb3YpOworCQloZXZjLT5zdGF0ICY9IH5TVEFUX1ZGX0hPT0s7CisJfQorCisJaGV2Y19sb2NhbF91bmluaXQoaGV2Yyk7CisKKwlpZiAodXNlX2NtYSkgeworCQloZXZjLT51bmluaXRfbGlzdCA9IDE7CisJCXVwKCZoMjY1X3NlbWEpOworI2lmZGVmIFVTRV9VTklOSVRfU0VNQQorCQlkb3duKCZoZXZjLT5oMjY1X3VuaW5pdF9kb25lX3NlbWEpOworCQlpZiAoIUlTX0VSUihoMjY1X3Rhc2spKSB7CisJCQlrdGhyZWFkX3N0b3AoaDI2NV90YXNrKTsKKwkJCWgyNjVfdGFzayA9IE5VTEw7CisJCX0KKyNlbHNlCisJCXdoaWxlIChoZXZjLT51bmluaXRfbGlzdCkJLyogd2FpdCB1bmluaXQgY29tcGxldGUgKi8KKwkJCW1zbGVlcCgyMCk7CisjZW5kaWYKKworCX0KKwloZXZjLT5pbml0X2ZsYWcgPSAwOworCWhldmMtPmZpcnN0X3NjX2NoZWNrZWQgPSAwOworCWNhbmNlbF93b3JrX3N5bmMoJmhldmMtPm5vdGlmeV93b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZoZXZjLT5zZXRfY2xrX3dvcmspOworCXVuaW5pdF9tbXVfYnVmZmVycyhoZXZjKTsKKwlhbWhldmNfZGlzYWJsZSgpOworCisJLy9wcl9lcnIoIlslcyBsaW5lICVkXSBoZXZjLT5ndnM9MHglcCBvcGVyYXRpb25cbiIsX19mdW5jX18sIF9fTElORV9fLCBoZXZjLT5ndnMpOworCWlmIChoZXZjLT5ndnMpCisJCWtmcmVlKGhldmMtPmd2cyk7CisJaGV2Yy0+Z3ZzID0gTlVMTDsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorc3RhdGljIHZvaWQgcmVzZXRfcHJvY2Vzc190aW1lKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJaWYgKGhldmMtPnN0YXJ0X3Byb2Nlc3NfdGltZSkgeworCQl1bnNpZ25lZCBpbnQgcHJvY2Vzc190aW1lID0KKwkJCTEwMDAgKiAoamlmZmllcyAtIGhldmMtPnN0YXJ0X3Byb2Nlc3NfdGltZSkgLyBIWjsKKwkJaGV2Yy0+c3RhcnRfcHJvY2Vzc190aW1lID0gMDsKKwkJaWYgKHByb2Nlc3NfdGltZSA+IG1heF9wcm9jZXNzX3RpbWVbaGV2Yy0+aW5kZXhdKQorCQkJbWF4X3Byb2Nlc3NfdGltZVtoZXZjLT5pbmRleF0gPSBwcm9jZXNzX3RpbWU7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdGFydF9wcm9jZXNzX3RpbWUoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwloZXZjLT5zdGFydF9wcm9jZXNzX3RpbWUgPSBqaWZmaWVzOworCWhldmMtPmRlY29kZV90aW1lb3V0X2NvdW50ID0gMjsKKwloZXZjLT5sYXN0X2xjdV9pZHggPSAwOworfQorCitzdGF0aWMgdm9pZCByZXN0YXJ0X3Byb2Nlc3NfdGltZShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWhldmMtPnN0YXJ0X3Byb2Nlc3NfdGltZSA9IGppZmZpZXM7CisJaGV2Yy0+ZGVjb2RlX3RpbWVvdXRfY291bnQgPSAyOworfQorCitzdGF0aWMgdm9pZCB0aW1lb3V0X3Byb2Nlc3Moc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwkvKgorCSAqIEluIHRoaXMgdmVyeSB0aW1lb3V0IHBvaW50LHRoZSB2aDI2NV93b3JrIGFycml2ZXMsCisJICogb3IgaW4gc29tZSBjYXNlcyB0aGUgc3lzdGVtIGJlY29tZSBzbG93LCAgdGhlbiBjb21lCisJICogdGhpcyBzZWNvbmQgdGltZW91dC4gSW4gYm90aCBjYXNlcyB3ZSByZXR1cm4uCisJICovCisJaWYgKHdvcmtfcGVuZGluZygmaGV2Yy0+d29yaykgfHwKKwkgICAgd29ya19idXN5KCZoZXZjLT53b3JrKSB8fAorCSAgICB3b3JrX2J1c3koJmhldmMtPnRpbWVvdXRfd29yaykgfHwKKwkgICAgd29ya19wZW5kaW5nKCZoZXZjLT50aW1lb3V0X3dvcmspKSB7CisJCXByX2VycigiJXMgaDI2NVslZF0gd29yayBwZW5kaW5nLCBkbyBub3RoaW5nLlxuIixfX2Z1bmNfXywgaGV2Yy0+aW5kZXgpOworCQlyZXR1cm47CisJfQorCisJaGV2Yy0+dGltZW91dF9udW0rKzsKKwlhbWhldmNfc3RvcCgpOworCXJlYWRfZGVjb2RlX2luZm8oaGV2Yyk7CisKKwloZXZjX3ByaW50KGhldmMsCisJCTAsICIlcyBkZWNvZGVyIHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwljaGVja19waWNfZGVjb2RlZF9lcnJvcihoZXZjLAorCQkJCWhldmMtPnBpY19kZWNvZGVkX2xjdV9pZHgpOworCS8qVGhlIGN1cnJlbnQgZGVjb2RlZCBmcmFtZSBpcyBtYXJrZWQKKwkJZXJyb3Igd2hlbiB0aGUgZGVjb2RlIHRpbWVvdXQqLworCWlmIChoZXZjLT5jdXJfcGljICE9IE5VTEwpCisJCWhldmMtPmN1cl9waWMtPmVycm9yX21hcmsgPSAxOworCWhldmMtPmRlY29kZWRfcG9jID0gaGV2Yy0+Y3Vycl9QT0M7CisJaGV2Yy0+ZGVjb2RpbmdfcGljID0gTlVMTDsKKwloZXZjLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworCXJlc2V0X3Byb2Nlc3NfdGltZShoZXZjKTsKKworCWlmICh3b3JrX3BlbmRpbmcoJmhldmMtPndvcmspKQorCQlyZXR1cm47CisJdmRlY19zY2hlZHVsZV93b3JrKCZoZXZjLT50aW1lb3V0X3dvcmspOworfQorCisjaWZkZWYgQ09OU1RSQUlOX01BWF9CVUZfTlVNCitzdGF0aWMgaW50IGdldF92Zl9yZWZfb25seV9idWZfY291bnQoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwlzdHJ1Y3QgUElDX3MgKnBpYzsKKwlpbnQgaTsKKwlpbnQgY291bnQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVGX1BJQ19OVU07IGkrKykgeworCQlwaWMgPSBoZXZjLT5tX1BJQ1tpXTsKKwkJaWYgKHBpYyA9PSBOVUxMIHx8IHBpYy0+aW5kZXggPT0gLTEpCisJCQljb250aW51ZTsKKwkJaWYgKHBpYy0+b3V0cHV0X21hcmsgPT0gMCAmJiBwaWMtPnJlZmVyZW5jZWQgPT0gMAorCQkJJiYgcGljLT5vdXRwdXRfcmVhZHkgPT0gMSkKKwkJCWNvdW50Kys7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IGdldF91c2VkX2J1Zl9jb3VudChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCXN0cnVjdCBQSUNfcyAqcGljOworCWludCBpOworCWludCBjb3VudCA9IDA7CisJZm9yIChpID0gMDsgaSA8IE1BWF9SRUZfUElDX05VTTsgaSsrKSB7CisJCXBpYyA9IGhldmMtPm1fUElDW2ldOworCQlpZiAocGljID09IE5VTEwgfHwgcGljLT5pbmRleCA9PSAtMSkKKwkJCWNvbnRpbnVlOworCQlpZiAocGljLT5vdXRwdXRfbWFyayAhPSAwIHx8IHBpYy0+cmVmZXJlbmNlZCAhPSAwCisJCQl8fCBwaWMtPm91dHB1dF9yZWFkeSAhPSAwKQorCQkJY291bnQrKzsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisjZW5kaWYKKworc3RhdGljIGJvb2wgaXNfYXZhbGlhYmxlX2J1ZmZlcihzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShoZXZjLT52NGwyX2N0eCk7CisJc3RydWN0IFBJQ19zICpwaWMgPSBOVUxMOworCWludCBpLCBmcmVlX2NvdW50ID0gMDsKKworCWlmIChjdHgtPmNhcF9wb29sLmRlYyA8IGhldmMtPnVzZWRfYnVmX251bSkgeworCQlmcmVlX2NvdW50ID0gdjRsMl9tMm1fbnVtX2RzdF9idWZzX3JlYWR5KGN0eC0+bTJtX2N0eCk7CisJCWlmIChmcmVlX2NvdW50ICYmCisJCQkhY3R4LT5mYl9vcHMucXVlcnkoJmN0eC0+ZmJfb3BzLCAmaGV2Yy0+ZmJfdG9rZW4pKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaGV2Yy0+dXNlZF9idWZfbnVtOyBpKyspIHsKKwkJcGljID0gaGV2Yy0+bV9QSUNbaV07CisJCWlmIChwaWMgPT0gTlVMTCB8fAorCQkJcGljLT5pbmRleCA9PSAtMSB8fAorCQkJcGljLT5CVUZfaW5kZXggPT0gLTEpCisJCQljb250aW51ZTsKKworCQlpZiAocGljLT5vdXRwdXRfbWFyayA9PSAwICYmCisJCQlwaWMtPnJlZmVyZW5jZWQgPT0gMCAmJgorCQkJcGljLT5vdXRwdXRfcmVhZHkgPT0gMCAmJgorCQkJcGljLT5jbWFfYWxsb2NfYWRkcikgeworCQkJZnJlZV9jb3VudCsrOworCQl9CisJfQorCisJcmV0dXJuIGZyZWVfY291bnQgPCBydW5fcmVhZHlfbWluX2J1Zl9udW0gPyAwIDogMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgaXNfbmV3X3BpY19hdmFpbGFibGUoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwlzdHJ1Y3QgUElDX3MgKm5ld19waWMgPSBOVUxMOworCXN0cnVjdCBQSUNfcyAqcGljOworCS8qIHJlY3ljbGUgdW4tdXNlZCBwaWMgKi8KKwlpbnQgaTsKKwlpbnQgcmVmX3BpYyA9IDA7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaGV2Yyk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkvKnJldHVybiAxIGlmIHBpY19saXN0IGlzIG5vdCBpbml0aWFsaXplZCB5ZXQqLworCWlmIChoZXZjLT5waWNfbGlzdF9pbml0X2ZsYWcgIT0gMykKKwkJcmV0dXJuIDE7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9QSUNfTlVNOyBpKyspIHsKKwkJcGljID0gaGV2Yy0+bV9QSUNbaV07CisJCWlmIChwaWMgPT0gTlVMTCB8fCBwaWMtPmluZGV4ID09IC0xKQorCQkJY29udGludWU7CisJCWlmIChwaWMtPnJlZmVyZW5jZWQgPT0gMSkKKwkJCXJlZl9waWMrKzsKKwkJaWYgKHBpYy0+b3V0cHV0X21hcmsgPT0gMCAmJiBwaWMtPnJlZmVyZW5jZWQgPT0gMAorCQkJJiYgcGljLT5vdXRwdXRfcmVhZHkgPT0gMAorCQkJJiYgcGljLT52Zl9yZWYgPT0gMAorCQkJKSB7CisJCQlpZiAobmV3X3BpYykgeworCQkJCWlmIChwaWMtPlBPQyA8IG5ld19waWMtPlBPQykKKwkJCQkJbmV3X3BpYyA9IHBpYzsKKwkJCX0gZWxzZQorCQkJCW5ld19waWMgPSBwaWM7CisJCX0KKwl9CisJaWYgKCFoZXZjLT5pc191c2VkX3Y0bCAmJiBuZXdfcGljID09IE5VTEwpIHsKKwkJZW51bSByZWNldml2ZXJfc3RhcnRfZSBzdGF0ZSA9IFJFQ0VJVkVSX0lOQUNUSVZFOworCQlpZiAodmZfZ2V0X3JlY2VpdmVyKHZkZWMtPnZmX3Byb3ZpZGVyX25hbWUpKSB7CisJCQlzdGF0ZSA9CisJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIodmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfUVVSRVlfU1RBVEUsCisJCQkJTlVMTCk7CisJCQlpZiAoKHN0YXRlID09IFJFQ0VJVkVSX1NUQVRFX05VTEwpCisJCQkJfHwgKHN0YXRlID09IFJFQ0VJVkVSX1NUQVRFX05PTkUpKQorCQkJCXN0YXRlID0gUkVDRUlWRVJfSU5BQ1RJVkU7CisJCX0KKwkJaWYgKHN0YXRlID09IFJFQ0VJVkVSX0lOQUNUSVZFKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9QSUNfTlVNOyBpKyspIHsKKwkJCQlpbnQgcG9jID0gSU5WQUxJRF9QT0M7CisJCQkJcGljID0gaGV2Yy0+bV9QSUNbaV07CisJCQkJaWYgKHBpYyA9PSBOVUxMIHx8IHBpYy0+aW5kZXggPT0gLTEpCisJCQkJCQljb250aW51ZTsKKwkJCQlpZiAoKHBpYy0+cmVmZXJlbmNlZCA9PSAwKSAmJgorCQkJCQkJKHBpYy0+ZXJyb3JfbWFyayA9PSAxKSAmJgorCQkJCQkJKHBpYy0+b3V0cHV0X21hcmsgPT0gMSkpIHsKKwkJCQkJaWYgKHBvYyA9PSBJTlZBTElEX1BPQyB8fCAgKHBpYy0+UE9DIDwgcG9jKSkgeworCQkJCQkJbmV3X3BpYyA9IHBpYzsKKwkJCQkJCXBvYyA9IHBpYy0+UE9DOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkgICAgIGlmIChuZXdfcGljKSAgeworCQkJCW5ld19waWMtPnJlZmVyZW5jZWQgPSAwOworCQkJCW5ld19waWMtPm91dHB1dF9tYXJrID0gMDsKKwkJCQlwdXRfbXZfYnVmKGhldmMsIG5ld19waWMpOworCQkJCWhldmNfcHJpbnQoaGV2YywgMCwgImZvcmNlIHJlbGVhc2UgZXJyb3IgIHBpYyAlZCAgcmVjaWV2ZV9zdGF0ZSAlZCBcbiIsIG5ld19waWMtPlBPQywgc3RhdGUpOworCQkJfSBlbHNlIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9QSUNfTlVNOyBpKyspIHsKKwkJCQkJcGljID0gaGV2Yy0+bV9QSUNbaV07CisJCQkJCWlmIChwaWMgPT0gTlVMTCB8fCBwaWMtPmluZGV4ID09IC0xKQorCQkJCQkJY29udGludWU7CisJCQkJCWlmICgocGljLT5yZWZlcmVuY2VkID09IDEpICYmIChwaWMtPmVycm9yX21hcmsgPT0gMSkpIHsKKwkJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKKwkJCQkJCWZsdXNoX291dHB1dChoZXZjLCBwaWMpOworCQkJCQkJaGV2Y19wcmludChoZXZjLCAwLCAiRFBCIGVycm9yLCBuZWVlZCBmb3JuY2UgZmx1c2ggIHJlY2lldmVfc3RhdGUgJWQgXG4iLCBzdGF0ZSk7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZiAobmV3X3BpYyA9PSBOVUxMKSB7CisJCWludCBkZWNvZGVfY291bnQgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVGX1BJQ19OVU07IGkrKykgeworCQkJcGljID0gaGV2Yy0+bV9QSUNbaV07CisJCQlpZiAocGljID09IE5VTEwgfHwgcGljLT5pbmRleCA9PSAtMSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChwaWMtPm91dHB1dF9yZWFkeSA9PSAwKQorCQkJCWRlY29kZV9jb3VudCsrOworCQl9CisJCWlmIChkZWNvZGVfY291bnQgPj0KKwkJCQloZXZjLT5wYXJhbS5wLnNwc19tYXhfZGVjX3BpY19idWZmZXJpbmdfbWludXMxXzAgKyBkZXRlY3Rfc3R1Y2tfYnVmZmVyX21hcmdpbikgeworCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSX01PUkUpCisJCQkJZHVtcF9waWNfbGlzdChoZXZjKTsKKwkJCWlmICghKGVycm9yX2hhbmRsZV9wb2xpY3kgJiAweDQwMCkpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CisJCQkJZmx1c2hfb3V0cHV0KGhldmMsIE5VTEwpOworCQkJCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19CVUZNR1IsICJmbHVzaCBkcGIsIHJlZl9lcnJvcl9jb3VudCAlZCwgc3BzX21heF9kZWNfcGljX2J1ZmZlcmluZ19taW51czFfMCAlZFxuIiwKKwkJCQkJCWRlY29kZV9jb3VudCwgaGV2Yy0+cGFyYW0ucC5zcHNfbWF4X2RlY19waWNfYnVmZmVyaW5nX21pbnVzMV8wKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CisJcmV0dXJuIChuZXdfcGljICE9IE5VTEwpID8gMSA6IDA7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2J1ZmZlcl9zdGF0dXMoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgUElDX3MgKm5ld19waWMgPSBOVUxMOworCXN0cnVjdCBQSUNfcyAqcGljOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGhldmMpOworCisJZW51bSByZWNldml2ZXJfc3RhcnRfZSBzdGF0ZSA9IFJFQ0VJVkVSX0lOQUNUSVZFOworCisJaWYgKGhldmMtPmlzX3VzZWRfdjRsKQorCQlyZXR1cm47CisKKwlpZiAodmZfZ2V0X3JlY2VpdmVyKHZkZWMtPnZmX3Byb3ZpZGVyX25hbWUpKSB7CisJCXN0YXRlID0KKwkJdmZfbm90aWZ5X3JlY2VpdmVyKHZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfUVVSRVlfU1RBVEUsCisJCQlOVUxMKTsKKwkJaWYgKChzdGF0ZSA9PSBSRUNFSVZFUl9TVEFURV9OVUxMKQorCQkJfHwgKHN0YXRlID09IFJFQ0VJVkVSX1NUQVRFX05PTkUpKQorCQkJc3RhdGUgPSBSRUNFSVZFUl9JTkFDVElWRTsKKwl9CisJaWYgKGhldmMtPnRpbWVvdXRfZmxhZyA9PSBmYWxzZSkKKwkJaGV2Yy0+dGltZW91dCA9IGppZmZpZXMgKyBIWiAvIDI7CisKKwlpZiAoc3RhdGUgPT0gUkVDRUlWRVJfSU5BQ1RJVkUpCisJCWhldmMtPnRpbWVvdXRfZmxhZyA9IHRydWU7CisJZWxzZQorCQloZXZjLT50aW1lb3V0X2ZsYWcgPSBmYWxzZTsKKworCWlmIChzdGF0ZSA9PSBSRUNFSVZFUl9JTkFDVElWRSAmJiBoZXZjLT50aW1lb3V0X2ZsYWcgJiYKKwkJCQl0aW1lX2FmdGVyKGppZmZpZXMsIGhldmMtPnRpbWVvdXQpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVGX1BJQ19OVU07IGkrKykgeworCQkJaW50IHBvYyA9IElOVkFMSURfUE9DOworCQkJcGljID0gaGV2Yy0+bV9QSUNbaV07CisJCQlpZiAocGljID09IE5VTEwgfHwgcGljLT5pbmRleCA9PSAtMSkKKwkJCQkJY29udGludWU7CisJCQlpZiAoKHBpYy0+cmVmZXJlbmNlZCA9PSAwKSAmJgorCQkJCQkocGljLT5lcnJvcl9tYXJrID09IDEpICYmCisJCQkJCShwaWMtPm91dHB1dF9tYXJrID09IDEpKSB7CisJCQkJaWYgKHBvYyA9PSBJTlZBTElEX1BPQyB8fCAgKHBpYy0+UE9DIDwgcG9jKSkgeworCQkJCQluZXdfcGljID0gcGljOworCQkJCQlwb2MgPSBwaWMtPlBPQzsKKwkJCQl9CisJCQl9CisJCX0KKwkgICAgaWYgKG5ld19waWMpICB7CisJCQluZXdfcGljLT5yZWZlcmVuY2VkID0gMDsKKwkJCW5ld19waWMtPm91dHB1dF9tYXJrID0gMDsKKwkJCXB1dF9tdl9idWYoaGV2YywgbmV3X3BpYyk7CisJCQloZXZjX3ByaW50KGhldmMsIDAsICJjaGVja19idWZmZXJfc3RhdHVzIGZvcmNlIHJlbGVhc2UgZXJyb3IgIHBpYyAlZCAgcmVjaWV2ZV9zdGF0ZSAlZCBcbiIsIG5ld19waWMtPlBPQywgc3RhdGUpOworCQl9IGVsc2UgeworCQkJZm9yIChpID0gMDsgaSA8IE1BWF9SRUZfUElDX05VTTsgaSsrKSB7CisJCQkJcGljID0gaGV2Yy0+bV9QSUNbaV07CisJCQkJaWYgKHBpYyA9PSBOVUxMIHx8IHBpYy0+aW5kZXggPT0gLTEpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICgocGljLT5yZWZlcmVuY2VkID09IDEpICYmIChwaWMtPmVycm9yX21hcmsgPT0gMSkpIHsKKwkJCQkJZmx1c2hfb3V0cHV0KGhldmMsIHBpYyk7CisJCQkJCWhldmNfcHJpbnQoaGV2YywgMCwgImNoZWNrX2J1ZmZlcl9zdGF0dXMgRFBCIGVycm9yLCBuZWVlZCBmb3JuY2UgZmx1c2ggIHJlY2lldmVfc3RhdGUgJWQgXG4iLCBzdGF0ZSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworCitzdGF0aWMgaW50IHZtaDI2NV9zdG9wKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJaWYgKGhldmMtPnN0YXQgJiBTVEFUX1RJTUVSX0FSTSkgeworCQlkZWxfdGltZXJfc3luYygmaGV2Yy0+dGltZXIpOworCQloZXZjLT5zdGF0ICY9IH5TVEFUX1RJTUVSX0FSTTsKKwl9CisJaWYgKGhldmMtPnN0YXQgJiBTVEFUX1ZERUNfUlVOKSB7CisJCWFtaGV2Y19zdG9wKCk7CisJCWhldmMtPnN0YXQgJj0gflNUQVRfVkRFQ19SVU47CisJfQorCWlmIChoZXZjLT5zdGF0ICYgU1RBVF9JU1JfUkVHKSB7CisJCXZkZWNfZnJlZV9pcnEoVkRFQ19JUlFfMCwgKHZvaWQgKiloZXZjKTsKKwkJaGV2Yy0+c3RhdCAmPSB+U1RBVF9JU1JfUkVHOworCX0KKworCWlmICghaGV2Yy0+aXNfdXNlZF92NGwgJiYgaGV2Yy0+c3RhdCAmIFNUQVRfVkZfSE9PSykgeworCQlpZiAoZnJfaGludF9zdGF0dXMgPT0gVkRFQ19ISU5URUQpCisJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoaGV2Yy0+cHJvdmlkZXJfbmFtZSwKKwkJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX0ZSX0VORF9ISU5ULAorCQkJCQlOVUxMKTsKKwkJZnJfaGludF9zdGF0dXMgPSBWREVDX05PX05FRURfSElOVDsKKwkJdmZfdW5yZWdfcHJvdmlkZXIoJnZoMjY1X3ZmX3Byb3YpOworCQloZXZjLT5zdGF0ICY9IH5TVEFUX1ZGX0hPT0s7CisJfQorCisJaGV2Y19sb2NhbF91bmluaXQoaGV2Yyk7CisKKwlpZiAoaGV2Yy0+Z3ZzKQorCQlrZnJlZShoZXZjLT5ndnMpOworCWhldmMtPmd2cyA9IE5VTEw7CisKKwlpZiAodXNlX2NtYSkgeworCQloZXZjLT51bmluaXRfbGlzdCA9IDE7CisJCXJlc2V0X3Byb2Nlc3NfdGltZShoZXZjKTsKKwkJaGV2Yy0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRlJFRV9DQU5WQVM7CisJCXZkZWNfc2NoZWR1bGVfd29yaygmaGV2Yy0+d29yayk7CisJCWZsdXNoX3dvcmsoJmhldmMtPndvcmspOworI2lmZGVmIFVTRV9VTklOSVRfU0VNQQorCQlpZiAoaGV2Yy0+aW5pdF9mbGFnKSB7CisJCQlkb3duKCZoZXZjLT5oMjY1X3VuaW5pdF9kb25lX3NlbWEpOworCQl9CisjZWxzZQorCQl3aGlsZSAoaGV2Yy0+dW5pbml0X2xpc3QpCS8qIHdhaXQgdW5pbml0IGNvbXBsZXRlICovCisJCQltc2xlZXAoMjApOworI2VuZGlmCisJfQorCWhldmMtPmluaXRfZmxhZyA9IDA7CisJaGV2Yy0+Zmlyc3Rfc2NfY2hlY2tlZCA9IDA7CisJY2FuY2VsX3dvcmtfc3luYygmaGV2Yy0+bm90aWZ5X3dvcmspOworCWNhbmNlbF93b3JrX3N5bmMoJmhldmMtPnNldF9jbGtfd29yayk7CisJY2FuY2VsX3dvcmtfc3luYygmaGV2Yy0+dGltZW91dF93b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZoZXZjLT53b3JrKTsKKwl1bmluaXRfbW11X2J1ZmZlcnMoaGV2Yyk7CisKKwl2ZnJlZShoZXZjLT5mdyk7CisJaGV2Yy0+ZncgPSBOVUxMOworCisJZHVtcF9sb2coaGV2Yyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGdldF9kYXRhX2NoZWNrX3N1bQorCShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLCBpbnQgc2l6ZSkKK3sKKwlpbnQgamo7CisJaW50IHN1bSA9IDA7CisJdTggKmRhdGEgPSBOVUxMOworCisJaWYgKCFoZXZjLT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJZGF0YSA9IGNvZGVjX21tX3ZtYXAoaGV2Yy0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQloZXZjLT5jaHVuay0+b2Zmc2V0LCBzaXplKTsKKwllbHNlCisJCWRhdGEgPSAoKHU4ICopaGV2Yy0+Y2h1bmstPmJsb2NrLT5zdGFydF92aXJ0KSArCisJCQloZXZjLT5jaHVuay0+b2Zmc2V0OworCisJZm9yIChqaiA9IDA7IGpqIDwgc2l6ZTsgamorKykKKwkJc3VtICs9IGRhdGFbampdOworCisJaGV2Y19wcmludChoZXZjLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkiJXM6IHNpemUgMHgleCBzdW0gMHgleCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAuLiAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQlfX2Z1bmNfXywgc2l6ZSwgc3VtLAorCQlkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdLCBkYXRhWzNdLAorCQlkYXRhWzRdLCBkYXRhWzVdLCBkYXRhW3NpemUgLSA0XSwKKwkJZGF0YVtzaXplIC0gM10sIGRhdGFbc2l6ZSAtIDJdLAorCQlkYXRhW3NpemUgLSAxXSk7CisKKwlpZiAoIWhldmMtPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQljb2RlY19tbV91bm1hcF9waHlhZGRyKGRhdGEpOworCXJldHVybiBzdW07Cit9CisKK3N0YXRpYyB2b2lkIHZoMjY1X25vdGlmeV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjID0KKwkJCQkJCWNvbnRhaW5lcl9vZih3b3JrLAorCQkJCQkJc3RydWN0IGhldmNfc3RhdGVfcywKKwkJCQkJCW5vdGlmeV93b3JrKTsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhoZXZjKTsKKworCWlmIChoZXZjLT5pc191c2VkX3Y0bCkKKwkJcmV0dXJuOworCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCWlmICh2ZGVjLT5mcl9oaW50X3N0YXRlID09IFZERUNfTkVFRF9ISU5UKSB7CisJCXZmX25vdGlmeV9yZWNlaXZlcihoZXZjLT5wcm92aWRlcl9uYW1lLAorCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfRlJfSElOVCwKKwkJCQkJKHZvaWQgKikKKwkJCQkJKCh1bnNpZ25lZCBsb25nKWhldmMtPmZyYW1lX2R1cikpOworCQl2ZGVjLT5mcl9oaW50X3N0YXRlID0gVkRFQ19ISU5URUQ7CisJfSBlbHNlIGlmIChmcl9oaW50X3N0YXR1cyA9PSBWREVDX05FRURfSElOVCkgeworCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoaGV2Yy0+cHJvdmlkZXJfbmFtZSwKKwkJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX0ZSX0hJTlQsCisJCQkJCSh2b2lkICopCisJCQkJCSgodW5zaWduZWQgbG9uZyloZXZjLT5mcmFtZV9kdXIpKTsKKwkJZnJfaGludF9zdGF0dXMgPSBWREVDX0hJTlRFRDsKKwl9CisjZWxzZQorCWlmIChmcl9oaW50X3N0YXR1cyA9PSBWREVDX05FRURfSElOVCkKKwkJdmZfbm90aWZ5X3JlY2VpdmVyKFBST1ZJREVSX05BTUUsCisJCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9GUl9ISU5ULAorCQkJCQkodm9pZCAqKQorCQkJCQkoKHVuc2lnbmVkIGxvbmcpaGV2Yy0+ZnJhbWVfZHVyKSk7CisJCWZyX2hpbnRfc3RhdHVzID0gVkRFQ19ISU5URUQ7CisJfQorI2VuZGlmCisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHZoMjY1X3dvcmtfaW1wbGVtZW50KHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsCisJc3RydWN0IHZkZWNfcyAqdmRlYyxpbnQgZnJvbSkKK3sKKwlpZiAoaGV2Yy0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0RPTkUpIHsKKwkJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9XT1JLRVJfU1RBUlQpOworCX0gZWxzZSBpZiAoaGV2Yy0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0FHQUlOKQorCQlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX1dPUktFUl9BR0FJTik7CisKKwlpZiAoaGV2Yy0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0ZSRUVfQ0FOVkFTKSB7CisJCS8qVVNFX0JVRl9CTE9DSyovCisJCXVuaW5pdF9waWNfbGlzdChoZXZjKTsKKwkJaGV2Yy0+dW5pbml0X2xpc3QgPSAwOworI2lmZGVmIFVTRV9VTklOSVRfU0VNQQorCQl1cCgmaGV2Yy0+aDI2NV91bmluaXRfZG9uZV9zZW1hKTsKKyNlbmRpZgorCQlyZXR1cm47CisJfQorCisJLyogZmluaXNoZWQgZGVjb2Rpbmcgb25lIGZyYW1lIG9yIGVycm9yLAorCSAqIG5vdGlmeSB2ZGVjIGNvcmUgdG8gc3dpdGNoIGNvbnRleHQKKwkgKi8KKwlpZiAoaGV2Yy0+cGljX2xpc3RfaW5pdF9mbGFnID09IDEKKwkJJiYgKGhldmMtPmRlY19yZXN1bHQgIT0gREVDX1JFU1VMVF9GT1JDRV9FWElUKSkgeworCQloZXZjLT5waWNfbGlzdF9pbml0X2ZsYWcgPSAyOworCQlpbml0X3BpY19saXN0KGhldmMpOworCQlpbml0X3BpY19saXN0X2h3KGhldmMpOworCQlpbml0X2J1Zl9zcGVjKGhldmMpOworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkic2V0IHBpY19saXN0X2luaXRfZmxhZyB0byAyXG4iKTsKKworCQlXUklURV9WUkVHKEhFVkNfQVNTSVNUX01CT1gwX0lSUV9SRUcsIDB4MSk7CisJCXJldHVybjsKKwl9CisKKwloZXZjX3ByaW50KGhldmMsIFBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsCisJCSIlcyBkZWNfcmVzdWx0ICVkICV4ICV4ICV4XG4iLAorCQlfX2Z1bmNfXywKKwkJaGV2Yy0+ZGVjX3Jlc3VsdCwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0xFVkVMKSwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1dSX1BUUiksCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIpKTsKKworCWlmICgoKGhldmMtPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9HRVRfREFUQSkgfHwKKwkJKGhldmMtPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9HRVRfREFUQV9SRVRSWSkpCisJCSYmIChod190b192ZGVjKGhldmMpLT5uZXh0X3N0YXR1cyAhPQorCQlWREVDX1NUQVRVU19ESVNDT05ORUNURUQpKSB7CisJCWlmICghdmRlY19oYXNfbW9yZV9pbnB1dCh2ZGVjKSkgeworCQkJaGV2Yy0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRU9TOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZoZXZjLT53b3JrKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIWlucHV0X2ZyYW1lX2Jhc2VkKHZkZWMpKSB7CisJCQlpbnQgciA9IHZkZWNfc3luY19pbnB1dCh2ZGVjKTsKKwkJCWlmIChyID49IDB4MjAwKSB7CisJCQkJV1JJVEVfVlJFRyhIRVZDX0RFQ09ERV9TSVpFLAorCQkJCQlSRUFEX1ZSRUcoSEVWQ19ERUNPREVfU0laRSkgKyByKTsKKworCQkJCWhldmNfcHJpbnQoaGV2YywgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCQkJIiVzIERFQ19SRVNVTFRfR0VUX0RBVEEgJXggJXggJXggbXBjICV4IHNpemUgMHgleFxuIiwKKwkJCQkJX19mdW5jX18sCisJCQkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9MRVZFTCksCisJCQkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9XUl9QVFIpLAorCQkJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSKSwKKwkJCQkJUkVBRF9WUkVHKEhFVkNfTVBDX0UpLCByKTsKKworCQkJCXN0YXJ0X3Byb2Nlc3NfdGltZShoZXZjKTsKKwkJCQlpZiAoUkVBRF9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcpCisJCQkJID09IEhFVkNfREVDT0RFX0JVRkVNUFRZMikKKwkJCQkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLAorCQkJCQkJSEVWQ19BQ1RJT05fRE9ORSk7CisJCQkJZWxzZQorCQkJCQlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsCisJCQkJCQlIRVZDX0FDVElPTl9ERUNfQ09OVCk7CisJCQl9IGVsc2UgeworCQkJCWhldmMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0dFVF9EQVRBX1JFVFJZOworCQkJCXZkZWNfc2NoZWR1bGVfd29yaygmaGV2Yy0+d29yayk7CisJCQl9CisJCQlyZXR1cm47CisJCX0KKworCQkvKmJlbG93IGZvciBmcmFtZV9iYXNlKi8KKwkJaWYgKGhldmMtPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9HRVRfREFUQSkgeworCQkJaGV2Y19wcmludChoZXZjLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJCSIlcyBERUNfUkVTVUxUX0dFVF9EQVRBICV4ICV4ICV4IG1wYyAleFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fTEVWRUwpLAorCQkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9XUl9QVFIpLAorCQkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIpLAorCQkJCVJFQURfVlJFRyhIRVZDX01QQ19FKSk7CisJCQltdXRleF9sb2NrKCZoZXZjLT5jaHVua3NfbXV0ZXgpOworCQkJdmRlY192ZnJhbWVfZGlydHkodmRlYywgaGV2Yy0+Y2h1bmspOworCQkJaGV2Yy0+Y2h1bmsgPSBOVUxMOworCQkJbXV0ZXhfdW5sb2NrKCZoZXZjLT5jaHVua3NfbXV0ZXgpOworCQkJdmRlY19jbGVhbl9pbnB1dCh2ZGVjKTsKKwkJfQorCisJCS8qaWYgKGlzX25ld19waWNfYXZhaWxhYmxlKGhldmMpKSB7Ki8KKwkJaWYgKHJ1bl9yZWFkeSh2ZGVjLCBWREVDX0hFVkMpKSB7CisJCQlpbnQgcjsKKwkJCWludCBkZWNvZGVfc2l6ZTsKKworCQkJciA9IHZkZWNfcHJlcGFyZV9pbnB1dCh2ZGVjLCAmaGV2Yy0+Y2h1bmspOworCQkJaWYgKHIgPCAwKSB7CisJCQkJaGV2Yy0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfR0VUX0RBVEFfUkVUUlk7CisKKwkJCQloZXZjX3ByaW50KGhldmMsCisJCQkJCVBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsCisJCQkJCSJhbXZkZWNfdmgyNjU6IEluc3VmZmljaWVudCBkYXRhXG4iKTsKKworCQkJCXZkZWNfc2NoZWR1bGVfd29yaygmaGV2Yy0+d29yayk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaGV2Yy0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfTk9ORTsKKwkJCWhldmNfcHJpbnQoaGV2YywgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCQkiJXM6IGNodW5rIHNpemUgMHgleCBzdW0gMHgleCBtcGMgJXhcbiIsCisJCQkJX19mdW5jX18sIHIsCisJCQkJKGdldF9kYmdfZmxhZyhoZXZjKSAmIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMpID8KKwkJCQlnZXRfZGF0YV9jaGVja19zdW0oaGV2YywgcikgOiAwLAorCQkJCVJFQURfVlJFRyhIRVZDX01QQ19FKSk7CisKKwkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBQUklOVF9GUkFNRUJBU0VfREFUQSkgeworCQkJCWludCBqajsKKwkJCQl1OCAqZGF0YSA9IE5VTEw7CisKKwkJCQlpZiAoIWhldmMtPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQkJCQlkYXRhID0gY29kZWNfbW1fdm1hcCgKKwkJCQkJCWhldmMtPmNodW5rLT5ibG9jay0+c3RhcnQgKworCQkJCQkJaGV2Yy0+Y2h1bmstPm9mZnNldCwgcik7CisJCQkJZWxzZQorCQkJCQlkYXRhID0gKCh1OCAqKQorCQkJCQkJaGV2Yy0+Y2h1bmstPmJsb2NrLT5zdGFydF92aXJ0KQorCQkJCQkJKyBoZXZjLT5jaHVuay0+b2Zmc2V0OworCisJCQkJZm9yIChqaiA9IDA7IGpqIDwgcjsgamorKykgeworCQkJCQlpZiAoKGpqICYgMHhmKSA9PSAwKQorCQkJCQkJaGV2Y19wcmludChoZXZjLAorCQkJCQkJUFJJTlRfRlJBTUVCQVNFX0RBVEEsCisJCQkJCQkJIiUwNng6IiwgamopOworCQkJCQloZXZjX3ByaW50X2NvbnQoaGV2YywKKwkJCQkJUFJJTlRfRlJBTUVCQVNFX0RBVEEsCisJCQkJCQkiJTAyeCAiLCBkYXRhW2pqXSk7CisJCQkJCWlmICgoKGpqICsgMSkgJiAweGYpID09IDApCisJCQkJCQloZXZjX3ByaW50X2NvbnQoaGV2YywKKwkJCQkJCVBSSU5UX0ZSQU1FQkFTRV9EQVRBLAorCQkJCQkJCSJcbiIpOworCQkJCX0KKworCQkJCWlmICghaGV2Yy0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQkJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIoZGF0YSk7CisJCQl9CisKKwkJCWRlY29kZV9zaXplID0gaGV2Yy0+Y2h1bmstPnNpemUgKworCQkJCShoZXZjLT5jaHVuay0+b2Zmc2V0ICYgKFZERUNfRklGT19BTElHTiAtIDEpKTsKKwkJCVdSSVRFX1ZSRUcoSEVWQ19ERUNPREVfU0laRSwKKwkJCQlSRUFEX1ZSRUcoSEVWQ19ERUNPREVfU0laRSkgKyBkZWNvZGVfc2l6ZSk7CisKKwkJCXZkZWNfZW5hYmxlX2lucHV0KHZkZWMpOworCisJCQloZXZjX3ByaW50KGhldmMsIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkJIiVzOiBtcGMgJXhcbiIsCisJCQkJX19mdW5jX18sIFJFQURfVlJFRyhIRVZDX01QQ19FKSk7CisKKwkJCXN0YXJ0X3Byb2Nlc3NfdGltZShoZXZjKTsKKwkJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgSEVWQ19BQ1RJT05fRE9ORSk7CisJCX0gZWxzZXsKKwkJCWhldmMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0dFVF9EQVRBX1JFVFJZOworCisJCQkvKmhldmNfcHJpbnQoaGV2YywgUFJJTlRfRkxBR19WREVDX0RFVEFJTCwKKwkJCSAqCSJhbXZkZWNfdmgyNjU6IEluc3VmZmljaWVudCBkYXRhXG4iKTsKKwkJCSAqLworCisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmhldmMtPndvcmspOworCQl9CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKGhldmMtPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9ET05FKSB7CisJCS8qIGlmICghaGV2Yy0+Y3R4X3ZhbGlkKQorCQkJaGV2Yy0+Y3R4X3ZhbGlkID0gMTsgKi8KKwkJCWludCBpOworCQloZXZjLT5kZWNfYWdhaW5fY250ID0gMDsKKwkJZGVjb2RlX2ZyYW1lX2NvdW50W2hldmMtPmluZGV4XSsrOworI2lmZGVmIERFVFJFRklMTF9FTkFCTEUKKwlpZiAoaGV2Yy0+aXNfc3dhcCAmJgorCQlnZXRfY3B1X21ham9yX2lkKCkgPD0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTSkgeworCQlpZiAoaGV2Yy0+ZGVscmVmaWxsX2NoZWNrID09IDIpIHsKKwkJCWRlbHJlZmlsbChoZXZjKTsKKwkJCWFtaGV2Y19zdG9wKCk7CisJCX0KKwl9CisjZW5kaWYKKwkJaWYgKGhldmMtPm1tdV9lbmFibGUgJiYgKChoZXZjLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MTApID09IDApKSB7CisJCQloZXZjLT51c2VkXzRrX251bSA9CisJCQkJUkVBRF9WUkVHKEhFVkNfU0FPX01NVV9TVEFUVVMpID4+IDE2OworCQkJaWYgKGhldmMtPnVzZWRfNGtfbnVtID49IDAgJiYKKwkJCQloZXZjLT5jdXJfcGljICYmCisJCQkJaGV2Yy0+Y3VyX3BpYy0+c2NhdHRlcl9hbGxvYworCQkJCT09IDEpCisJCQkJcmVjeWNsZV9tbXVfYnVmX3RhaWwoaGV2YywgaGV2Yy0+bV9pbnNfZmxhZyk7CisJCX0KKwkJaGV2Yy0+cGljX2RlY29kZWRfbGN1X2lkeCA9CisJCQlSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfTENVX1NUQVJUKQorCQkJJiAweGZmZmZmZjsKKworCQlpZiAodmRlYy0+bWFzdGVyID09IE5VTEwgJiYgdmRlYy0+c2xhdmUgPT0gTlVMTCAmJgorCQkJaGV2Yy0+ZW1wdHlfZmxhZyA9PSAwKSB7CisJCQloZXZjLT5vdmVyX2RlY29kZSA9CisJCQkJKFJFQURfVlJFRyhIRVZDX1NISUZUX1NUQVRVUykgPj4gMTUpICYgMHgxOworCQkJaWYgKGhldmMtPm92ZXJfZGVjb2RlKQorCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJIiEhIU92ZXIgZGVjb2RlXG4iKTsKKwkJfQorCisJCWlmIChpc19sb2dfZW5hYmxlKGhldmMpKQorCQkJYWRkX2xvZyhoZXZjLAorCQkJCSIlcyBkZWNfcmVzdWx0ICVkIGxjdSAlZCB1c2VkX21tdSAlZCBzaGlmdGJ5dGUgMHgleCBkZWNieXRlcyAweCV4IiwKKwkJCQlfX2Z1bmNfXywKKwkJCQloZXZjLT5kZWNfcmVzdWx0LAorCQkJCWhldmMtPnBpY19kZWNvZGVkX2xjdV9pZHgsCisJCQkJaGV2Yy0+dXNlZF80a19udW0sCisJCQkJUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCksCisJCQkJUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCkgLQorCQkJCWhldmMtPnN0YXJ0X3NoaWZ0X2J5dGVzCisJCQkJKTsKKworCQloZXZjX3ByaW50KGhldmMsIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkiJXMgZGVjX3Jlc3VsdCAlZCAoJXggJXggJXgpIGxjdSAlZCB1c2VkX21tdSAlZCBzaGlmdGJ5dGUgMHgleCBkZWNieXRlcyAweCV4XG4iLAorCQkJX19mdW5jX18sCisJCQloZXZjLT5kZWNfcmVzdWx0LAorCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0xFVkVMKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9XUl9QVFIpLAorCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1JEX1BUUiksCisJCQloZXZjLT5waWNfZGVjb2RlZF9sY3VfaWR4LAorCQkJaGV2Yy0+dXNlZF80a19udW0sCisJCQlSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpIC0KKwkJCWhldmMtPnN0YXJ0X3NoaWZ0X2J5dGVzCisJCQkpOworCisJCWhldmMtPnVzZWRfNGtfbnVtID0gLTE7CisKKwkJY2hlY2tfcGljX2RlY29kZWRfZXJyb3IoaGV2YywKKwkJCWhldmMtPnBpY19kZWNvZGVkX2xjdV9pZHgpOworCQlpZiAoKGVycm9yX2hhbmRsZV9wb2xpY3kgJiAweDEwMCkgPT0gMCAmJiBoZXZjLT5jdXJfcGljKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9QSUNfTlVNOyBpKyspIHsKKwkJCQlzdHJ1Y3QgUElDX3MgKnBpYzsKKwkJCQlwaWMgPSBoZXZjLT5tX1BJQ1tpXTsKKwkJCQlpZiAoIXBpYyB8fCBwaWMtPmluZGV4ID09IC0xKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoKGhldmMtPmN1cl9waWMtPlBPQyArIHBvY19udW1fbWFyZ2luIDwgcGljLT5QT0MpICYmIChwaWMtPnJlZmVyZW5jZWQgPT0gMCkgJiYKKwkJCQkJKHBpYy0+b3V0cHV0X21hcmsgPT0gMSkgJiYgKHBpYy0+b3V0cHV0X3JlYWR5ID09IDApKSB7CisJCQkJCWhldmMtPnBvY19lcnJvcl9jb3VudCsrOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoaSA9PSBNQVhfUkVGX1BJQ19OVU0pCisJCQkJaGV2Yy0+cG9jX2Vycm9yX2NvdW50ID0gMDsKKwkJCWlmIChoZXZjLT5wb2NfZXJyb3JfY291bnQgPj0gcG9jX2Vycm9yX2xpbWl0KSB7CisJCQkJZm9yIChpID0gMDsgaSA8IE1BWF9SRUZfUElDX05VTTsgaSsrKSB7CisJCQkJCXN0cnVjdCBQSUNfcyAqcGljOworCQkJCQlwaWMgPSBoZXZjLT5tX1BJQ1tpXTsKKwkJCQkJaWYgKCFwaWMgfHwgcGljLT5pbmRleCA9PSAtMSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlpZiAoKGhldmMtPmN1cl9waWMtPlBPQyArIHBvY19udW1fbWFyZ2luIDwgcGljLT5QT0MpICYmIChwaWMtPnJlZmVyZW5jZWQgPT0gMCkgJiYKKwkJCQkJCShwaWMtPm91dHB1dF9tYXJrID09IDEpICYmIChwaWMtPm91dHB1dF9yZWFkeSA9PSAwKSkgeworCQkJCQkJcGljLT5vdXRwdXRfbWFyayA9IDA7CisJCQkJCQloZXZjX3ByaW50KGhldmMsIDAsICJEUEIgcG9jIGVycm9yLCByZW1vdmUgZXJyb3IgZnJhbWVcbiIpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorI2lmIDEKKwkJaWYgKHZkZWMtPnNsYXZlKSB7CisJCQlpZiAoZHZfZGVidWcgJiAweDEpCisJCQkJdmRlY19zZXRfZmxhZyh2ZGVjLT5zbGF2ZSwKKwkJCQkJVkRFQ19GTEFHX1NFTEZfSU5QVVRfQ09OVEVYVCk7CisJCQllbHNlCisJCQkJdmRlY19zZXRfZmxhZyh2ZGVjLT5zbGF2ZSwKKwkJCQkJVkRFQ19GTEFHX09USEVSX0lOUFVUX0NPTlRFWFQpOworCQl9CisjZWxzZQorCQlpZiAodmRlYy0+c2xhdmUpIHsKKwkJCWlmIChub19pbnRlcmxlYXZlZF9lbF9zbGljZSkKKwkJCQl2ZGVjX3NldF9mbGFnKHZkZWMtPnNsYXZlLAorCQkJCVZERUNfRkxBR19JTlBVVF9LRUVQX0NPTlRFWFQpOworCQkJCS8qIHRoaXMgd2lsbCBtb3ZlIHJlYWwgSFcgcG9pbnRlciBmb3IgaW5wdXQgKi8KKwkJCWVsc2UKKwkJCQl2ZGVjX3NldF9mbGFnKHZkZWMtPnNsYXZlLCAwKTsKKwkJCQkvKiB0aGlzIHdpbGwgbm90IG1vdmUgcmVhbCBIVyBwb2ludGVyCisJCQkJICphbmQgU0wgbGF5ZXIgZGVjb2RpbmcKKwkJCQkgKndpbGwgc3RhcnQgZnJvbSBzYW1lIHN0cmVhbSBwb3NpdGlvbgorCQkJCSAqYXMgY3VycmVudCBCTCBkZWNvZGVyCisJCQkJICovCisJCX0KKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwkJaGV2Yy0+c2hpZnRfYnl0ZV9jb3VudF9sbworCQkJPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKTsKKwkJaWYgKHZkZWMtPnNsYXZlKSB7CisJCQkvKmN1ciBpcyBiYXNlLCBmb3VuZCBlbmhhbmNlKi8KKwkJCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmNfZWwgPQorCQkJKHN0cnVjdCBoZXZjX3N0YXRlX3MgKikKKwkJCQl2ZGVjLT5zbGF2ZS0+cHJpdmF0ZTsKKwkJCWlmIChoZXZjX2VsKQorCQkJCWhldmNfZWwtPnNoaWZ0X2J5dGVfY291bnRfbG8gPQorCQkJCWhldmMtPnNoaWZ0X2J5dGVfY291bnRfbG87CisJCX0gZWxzZSBpZiAodmRlYy0+bWFzdGVyKSB7CisJCQkvKmN1ciBpcyBlbmhhbmNlLCBmb3VuZCBiYXNlKi8KKwkJCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmNfYmEgPQorCQkJKHN0cnVjdCBoZXZjX3N0YXRlX3MgKikKKwkJCQl2ZGVjLT5tYXN0ZXItPnByaXZhdGU7CisJCQlpZiAoaGV2Y19iYSkKKwkJCQloZXZjX2JhLT5zaGlmdF9ieXRlX2NvdW50X2xvID0KKwkJCQloZXZjLT5zaGlmdF9ieXRlX2NvdW50X2xvOworCQl9CisjZW5kaWYKKwkJbXV0ZXhfbG9jaygmaGV2Yy0+Y2h1bmtzX211dGV4KTsKKwkJdmRlY192ZnJhbWVfZGlydHkoaHdfdG9fdmRlYyhoZXZjKSwgaGV2Yy0+Y2h1bmspOworCQloZXZjLT5jaHVuayA9IE5VTEw7CisJCW11dGV4X3VubG9jaygmaGV2Yy0+Y2h1bmtzX211dGV4KTsKKwl9IGVsc2UgaWYgKGhldmMtPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9BR0FJTikgeworCQkvKgorCQkJc3RyZWFtIGJhc2U6IHN0cmVhbSBidWYgZW1wdHkgb3IgdGltZW91dAorCQkJZnJhbWUgYmFzZTogdmRlY19wcmVwYXJlX2lucHV0IGZhaWwKKwkJKi8KKwkJaWYgKCF2ZGVjX2hhc19tb3JlX2lucHV0KHZkZWMpKSB7CisJCQloZXZjLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9FT1M7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmhldmMtPndvcmspOworCQkJcmV0dXJuOworCQl9CisjaWZkZWYgQUdBSU5fSEFTX1RIUkVTSE9MRAorCQloZXZjLT5uZXh0X2FnYWluX2ZsYWcgPSAxOworI2VuZGlmCisJCWlmIChpbnB1dF9zdHJlYW1fYmFzZWQodmRlYykpIHsKKwkJCWlmICghKGVycm9yX2hhbmRsZV9wb2xpY3kgJiAweDQwMCkgJiYgY2hlY2tfZGF0YV9zaXplKHZkZWMpKSB7CisJCQkJaGV2Yy0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmhldmMtPndvcmspOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSBpZiAoKCgoZXJyb3JfaGFuZGxlX3BvbGljeSAmIDB4MjAwKSA9PSAwKSAmJgorCQkJCQkJKGhldmMtPnBpY19saXN0X2luaXRfZmxhZyA9PSAwKSkpIHsKKwkJCQljaGVja19kaXJ0eV9kYXRhKHZkZWMpOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChoZXZjLT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfRU9TKSB7CisJCXN0cnVjdCBQSUNfcyAqcGljOworCQloZXZjLT5lb3MgPSAxOworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJCWlmICgodmRlY19kdWFsKHZkZWMpKSAmJiBhdXhfZGF0YV9pc19hdmFpYmxlKGhldmMpKQorCQkJaWYgKGhldmMtPmRlY29kaW5nX3BpYykKKwkJCQlkb2xieV9nZXRfbWV0YShoZXZjKTsKKyNlbmRpZgorCQljaGVja19waWNfZGVjb2RlZF9lcnJvcihoZXZjLAorCQkJaGV2Yy0+cGljX2RlY29kZWRfbGN1X2lkeCk7CisJCXBpYyA9IGdldF9waWNfYnlfUE9DKGhldmMsIGhldmMtPmN1cnJfUE9DKTsKKwkJaGV2Y19wcmludChoZXZjLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJIiVzOiBlbmQgb2Ygc3RyZWFtLCBsYXN0IGRlYyBwb2MgJWQgPT4gMHglcGZcbiIsCisJCQlfX2Z1bmNfXywgaGV2Yy0+Y3Vycl9QT0MsIHBpYyk7CisJCWZsdXNoX291dHB1dChoZXZjLCBwaWMpOworCQkvKiBkdW1teSB2ZiB3aXRoIGVvcyBmbGFnIHRvIGJhY2tlbmQgKi8KKwkJbm90aWZ5X3Y0bF9lb3MoaHdfdG9fdmRlYyhoZXZjKSk7CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwkJaGV2Yy0+c2hpZnRfYnl0ZV9jb3VudF9sbworCQkJPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKTsKKwkJaWYgKHZkZWMtPnNsYXZlKSB7CisJCQkvKmN1ciBpcyBiYXNlLCBmb3VuZCBlbmhhbmNlKi8KKwkJCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmNfZWwgPQorCQkJKHN0cnVjdCBoZXZjX3N0YXRlX3MgKikKKwkJCQl2ZGVjLT5zbGF2ZS0+cHJpdmF0ZTsKKwkJCWlmIChoZXZjX2VsKQorCQkJCWhldmNfZWwtPnNoaWZ0X2J5dGVfY291bnRfbG8gPQorCQkJCWhldmMtPnNoaWZ0X2J5dGVfY291bnRfbG87CisJCX0gZWxzZSBpZiAodmRlYy0+bWFzdGVyKSB7CisJCQkvKmN1ciBpcyBlbmhhbmNlLCBmb3VuZCBiYXNlKi8KKwkJCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmNfYmEgPQorCQkJKHN0cnVjdCBoZXZjX3N0YXRlX3MgKikKKwkJCQl2ZGVjLT5tYXN0ZXItPnByaXZhdGU7CisJCQlpZiAoaGV2Y19iYSkKKwkJCQloZXZjX2JhLT5zaGlmdF9ieXRlX2NvdW50X2xvID0KKwkJCQloZXZjLT5zaGlmdF9ieXRlX2NvdW50X2xvOworCQl9CisjZW5kaWYKKwkJbXV0ZXhfbG9jaygmaGV2Yy0+Y2h1bmtzX211dGV4KTsKKwkJdmRlY192ZnJhbWVfZGlydHkoaHdfdG9fdmRlYyhoZXZjKSwgaGV2Yy0+Y2h1bmspOworCQloZXZjLT5jaHVuayA9IE5VTEw7CisJCW11dGV4X3VubG9jaygmaGV2Yy0+Y2h1bmtzX211dGV4KTsKKwl9IGVsc2UgaWYgKGhldmMtPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9GT1JDRV9FWElUKSB7CisJCWhldmNfcHJpbnQoaGV2YywgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCSIlczogZm9yY2UgZXhpdFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJaWYgKGhldmMtPnN0YXQgJiBTVEFUX1ZERUNfUlVOKSB7CisJCQlhbWhldmNfc3RvcCgpOworCQkJaGV2Yy0+c3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwkJfQorCQlpZiAoaGV2Yy0+c3RhdCAmIFNUQVRfSVNSX1JFRykgeworCQkJCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTUJPWDBfTUFTSywgMCk7CisJCQl2ZGVjX2ZyZWVfaXJxKFZERUNfSVJRXzAsICh2b2lkICopaGV2Yyk7CisJCQloZXZjLT5zdGF0ICY9IH5TVEFUX0lTUl9SRUc7CisJCX0KKwkJaGV2Y19wcmludChoZXZjLCAwLCAiJXM6IGZvcmNlIGV4aXQgZW5kXG4iLAorCQkJX19mdW5jX18pOworCX0KKworCWlmIChoZXZjLT5zdGF0ICYgU1RBVF9WREVDX1JVTikgeworCQlhbWhldmNfc3RvcCgpOworCQloZXZjLT5zdGF0ICY9IH5TVEFUX1ZERUNfUlVOOworCX0KKworCWlmIChoZXZjLT5zdGF0ICYgU1RBVF9USU1FUl9BUk0pIHsKKwkJZGVsX3RpbWVyX3N5bmMoJmhldmMtPnRpbWVyKTsKKwkJaGV2Yy0+c3RhdCAmPSB+U1RBVF9USU1FUl9BUk07CisJfQorCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLmRlY29kZV93b3JrX3RpbWVfbmFtZSwgVFJBQ0VfV09SS19XQUlUX1NFQVJDSF9ET05FX1NUQVJUKTsKKwl3YWl0X2hldmNfc2VhcmNoX2RvbmUoaGV2Yyk7CisJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UuZGVjb2RlX3dvcmtfdGltZV9uYW1lLCBUUkFDRV9XT1JLX1dBSVRfU0VBUkNIX0RPTkVfRU5EKTsKKworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJaWYgKGhldmMtPnN3aXRjaF9kdmxheWVyX2ZsYWcpIHsKKwkJaWYgKHZkZWMtPnNsYXZlKQorCQkJdmRlY19zZXRfbmV4dF9zY2hlZCh2ZGVjLCB2ZGVjLT5zbGF2ZSk7CisJCWVsc2UgaWYgKHZkZWMtPm1hc3RlcikKKwkJCXZkZWNfc2V0X25leHRfc2NoZWQodmRlYywgdmRlYy0+bWFzdGVyKTsKKwl9IGVsc2UgaWYgKHZkZWMtPnNsYXZlIHx8IHZkZWMtPm1hc3RlcikKKwkJdmRlY19zZXRfbmV4dF9zY2hlZCh2ZGVjLCB2ZGVjKTsKKyNlbmRpZgorCisJaWYgKGZyb20gPT0gMSkgeworCQkvKiBUaGlzIGlzIGEgdGltZW91dCB3b3JrICovCisJCWlmICh3b3JrX3BlbmRpbmcoJmhldmMtPndvcmspKSB7CisJCQkvKgorCQkJICogVGhlIHZoMjY1X3dvcmsgYXJyaXZlcyBhdCB0aGUgbGFzdCBzZWNvbmQsCisJCQkgKiBnaXZlIGl0IGEgY2hhbmNlIHRvIGhhbmRsZSB0aGUgc2NlbmFyaW8uCisJCQkgKi8KKwkJCXJldHVybjsKKwkJCS8vY2FuY2VsX3dvcmtfc3luYygmaGV2Yy0+d29yayk7Ly9yZXNlcnZlZCBmb3IgZnV0dXJlIGNvbnNpZHJhaW9uCisJCX0KKwl9CisJaWYgKGhldmMtPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9ET05FKSB7CisJCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfV09SS0VSX0VORCk7CisJfQorCisJLyogbWFyayBpdHNlbGYgaGFzIGFsbCBIVyByZXNvdXJjZSByZWxlYXNlZCBhbmQgaW5wdXQgcmVsZWFzZWQgKi8KKwlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpCisJCXZkZWNfY29yZV9maW5pc2hfcnVuKHZkZWMsIENPUkVfTUFTS19IRVZDKTsKKwllbHNlCisJCXZkZWNfY29yZV9maW5pc2hfcnVuKHZkZWMsIENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQyk7CisKKwlpZiAoaGV2Yy0+aXNfdXNlZF92NGwpIHsKKwkJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShoZXZjLT52NGwyX2N0eCk7CisKKwkJaWYgKGN0eC0+cGFyYW1fc2V0c19mcm9tX3Vjb2RlICYmCisJCQkhaGV2Yy0+djRsX3BhcmFtc19wYXJzZWQpCisJCQl2ZGVjX3Y0bF93cml0ZV9mcmFtZV9zeW5jKGN0eCk7CisJfQorCisJaWYgKGhldmMtPnZkZWNfY2IpCisJCWhldmMtPnZkZWNfY2IoaHdfdG9fdmRlYyhoZXZjKSwgaGV2Yy0+dmRlY19jYl9hcmcpOworfQorCitzdGF0aWMgdm9pZCB2aDI2NV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjID0gY29udGFpbmVyX29mKHdvcmssCisJCQlzdHJ1Y3QgaGV2Y19zdGF0ZV9zLCB3b3JrKTsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhoZXZjKTsKKworCXZoMjY1X3dvcmtfaW1wbGVtZW50KGhldmMsIHZkZWMsIDApOworfQorCitzdGF0aWMgdm9pZCB2aDI2NV90aW1lb3V0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPSBjb250YWluZXJfb2Yod29yaywKKwkJc3RydWN0IGhldmNfc3RhdGVfcywgdGltZW91dF93b3JrKTsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhoZXZjKTsKKworCWlmICh3b3JrX3BlbmRpbmcoJmhldmMtPndvcmspKQorCQlyZXR1cm47CisJaGV2Yy0+dGltZW91dF9wcm9jZXNzaW5nID0gMTsKKwl2aDI2NV93b3JrX2ltcGxlbWVudChoZXZjLCB2ZGVjLCAxKTsKK30KKworCitzdGF0aWMgaW50IHZoMjY1X2h3X2N0eF9yZXN0b3JlKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJLyogbmV3IHRvIGRvIC4uLiAqLworCXZoMjY1X3Byb3RfaW5pdChoZXZjKTsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJ1bl9yZWFkeShzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1bnNpZ25lZCBsb25nIG1hc2spCit7CisJc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YyA9CisJCShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICopdmRlYy0+cHJpdmF0ZTsKKwlpbnQgdHZwID0gdmRlY19zZWN1cmUoaHdfdG9fdmRlYyhoZXZjKSkgPworCQlDT0RFQ19NTV9GTEFHU19UVlAgOiAwOworCWJvb2wgcmV0ID0gMDsKKwlpZiAoc3RlcCA9PSAweDEyKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmIChzdGVwID09IDB4MTEpCisJCXN0ZXAgPSAweDEyOworCisJaWYgKGhldmMtPmZhdGFsX2Vycm9yICYgREVDT0RFUl9GQVRBTF9FUlJPUl9OT19NRU0pCisJCXJldHVybiAwOworCisJaWYgKGhldmMtPmVvcykKKwkJcmV0dXJuIDA7CisJaWYgKGhldmMtPnRpbWVvdXRfcHJvY2Vzc2luZyAmJgorCSAgICAod29ya19wZW5kaW5nKCZoZXZjLT53b3JrKSB8fAorCSAgICB3b3JrX2J1c3koJmhldmMtPndvcmspIHx8CisJICAgIHdvcmtfYnVzeSgmaGV2Yy0+dGltZW91dF93b3JrKSB8fAorCSAgICB3b3JrX3BlbmRpbmcoJmhldmMtPnRpbWVvdXRfd29yaykpKSB7CisJCWhldmNfcHJpbnQoaGV2YywgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCSAgICJoMjY1IHdvcmsgcGVuZGluZyxub3QgcmVhZHkgZm9yIHJ1bi5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaGV2Yy0+dGltZW91dF9wcm9jZXNzaW5nID0gMDsKKwlpZiAoIWhldmMtPmZpcnN0X3NjX2NoZWNrZWQgJiYgaGV2Yy0+bW11X2VuYWJsZSkgeworCQlpbnQgc2l6ZTsKKwkJdm9pZCAqIG1tdV9ib3g7CisKKwkJaWYgKGhldmMtPmlzX3VzZWRfdjRsKSB7CisJCQlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShoZXZjLT52NGwyX2N0eCk7CisJCQltbXVfYm94ID0gY3R4LT5tbXVfYm94OworCQl9IGVsc2UKKwkJCW1tdV9ib3ggPSBoZXZjLT5tbXVfYm94OworCisJCXNpemUgPSBkZWNvZGVyX21tdV9ib3hfc2NfY2hlY2sobW11X2JveCwgdHZwKTsKKwkJaGV2Yy0+Zmlyc3Rfc2NfY2hlY2tlZCA9MTsKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJInZoMjY1IGNhY2hlZD0lZCAgbmVlZF9zaXplPSVkIHNwZWVkPSAlZCBtc1xuIiwKKwkJCXNpemUsIChoZXZjLT5uZWVkX2NhY2hlX3NpemUgPj4gUEFHRV9TSElGVCksCisJCQkoaW50KShnZXRfamlmZmllc182NCgpIC0gaGV2Yy0+c2Nfc3RhcnRfdGltZSkgKiAxMDAwL0haKTsKKwl9CisJaWYgKHZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpICYmIChoZXZjLT5pbml0X2ZsYWcgPT0gMCkKKwkJCSYmIHByZV9kZWNvZGVfYnVmX2xldmVsICE9IDApIHsKKwkJCXUzMiBycCwgd3AsIGxldmVsOworCisJCQlycCA9IFNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF9ycCk7CisJCQl3cCA9IFNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCk7CisJCQlpZiAod3AgPCBycCkKKwkJCQlsZXZlbCA9IHZkZWMtPmlucHV0LnNpemUgKyB3cCAtIHJwOworCQkJZWxzZQorCQkJCWxldmVsID0gd3AgLSBycDsKKworCQkJaWYgKGxldmVsIDwgcHJlX2RlY29kZV9idWZfbGV2ZWwpCisJCQkJcmV0dXJuIDA7CisJfQorCisjaWZkZWYgQUdBSU5fSEFTX1RIUkVTSE9MRAorCWlmIChoZXZjLT5uZXh0X2FnYWluX2ZsYWcgJiYKKwkJKCF2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpKSkgeworCQl1MzIgcGFyc2VyX3dyX3B0ciA9CisJCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApOworCQlpZiAocGFyc2VyX3dyX3B0ciA+PSBoZXZjLT5wcmVfcGFyc2VyX3dyX3B0ciAmJgorCQkJKHBhcnNlcl93cl9wdHIgLSBoZXZjLT5wcmVfcGFyc2VyX3dyX3B0cikgPAorCQkJYWdhaW5fdGhyZXNob2xkKSB7CisJCQlpbnQgciA9IHZkZWNfc3luY19pbnB1dCh2ZGVjKTsKKwkJCWhldmNfcHJpbnQoaGV2YywKKwkJCQlQUklOVF9GTEFHX1ZERUNfREVUQUlMLCAiJXMgYnVmIGxlbHZlbDoleFxuIiwgIF9fZnVuY19fLCByKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorI2VuZGlmCisKKwlpZiAoZGlzcF92ZnJhbWVfdmFsdmVfbGV2ZWwgJiYKKwkJa2ZpZm9fbGVuKCZoZXZjLT5kaXNwbGF5X3EpID49CisJCWRpc3BfdmZyYW1lX3ZhbHZlX2xldmVsKSB7CisJCWhldmMtPnZhbHZlX2NvdW50LS07CisJCWlmIChoZXZjLT52YWx2ZV9jb3VudCA8PSAwKQorCQkJaGV2Yy0+dmFsdmVfY291bnQgPSAyOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXQgPSBpc19uZXdfcGljX2F2YWlsYWJsZShoZXZjKTsKKwlpZiAoIXJldCkgeworCQloZXZjX3ByaW50KGhldmMsCisJCVBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsICIlcz0+JWRcclxuIiwKKwkJX19mdW5jX18sIHJldCk7CisJfQorCisjaWZkZWYgQ09OU1RSQUlOX01BWF9CVUZfTlVNCisJaWYgKGhldmMtPnBpY19saXN0X2luaXRfZmxhZyA9PSAzICYmICFoZXZjLT5pc191c2VkX3Y0bCkgeworCQlpZiAocnVuX3JlYWR5X21heF92Zl9vbmx5X251bSA+IDAgJiYKKwkJCWdldF92Zl9yZWZfb25seV9idWZfY291bnQoaGV2YykgPj0KKwkJCXJ1bl9yZWFkeV9tYXhfdmZfb25seV9udW0KKwkJCSkKKwkJCXJldCA9IDA7CisJCWlmIChydW5fcmVhZHlfZGlzcGxheV9xX251bSA+IDAgJiYKKwkJCWtmaWZvX2xlbigmaGV2Yy0+ZGlzcGxheV9xKSA+PQorCQkJcnVuX3JlYWR5X2Rpc3BsYXlfcV9udW0pCisJCQlyZXQgPSAwOworCisJCS8qYXZvaWQgbW9yZSBidWZmZXJzIGNvbnN1bWVkIHdoZW4KKwkJc3dpdGNoaW5nIHJlc29sdXRpb24qLworCQlpZiAocnVuX3JlYWR5X21heF9idWZfbnVtID09IDB4ZmYgJiYKKwkJCWdldF91c2VkX2J1Zl9jb3VudChoZXZjKSA+PQorCQkJZ2V0X3dvcmtfcGljX251bShoZXZjKSkgeworCQkJY2hlY2tfYnVmZmVyX3N0YXR1cyhoZXZjKTsKKwkJCXJldCA9IDA7CisJCX0KKwkJZWxzZSBpZiAocnVuX3JlYWR5X21heF9idWZfbnVtICYmCisJCQlnZXRfdXNlZF9idWZfY291bnQoaGV2YykgPj0KKwkJCXJ1bl9yZWFkeV9tYXhfYnVmX251bSkKKwkJCXJldCA9IDA7CisJfQorI2VuZGlmCisKKwlpZiAoaGV2Yy0+aXNfdXNlZF92NGwpIHsKKwkJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShoZXZjLT52NGwyX2N0eCk7CisKKwkJaWYgKGN0eC0+cGFyYW1fc2V0c19mcm9tX3Vjb2RlKSB7CisJCQlpZiAoaGV2Yy0+djRsX3BhcmFtc19wYXJzZWQpIHsKKwkJCQlpZiAoY3R4LT5jYXBfcG9vbC5kZWMgPCBoZXZjLT51c2VkX2J1Zl9udW0pIHsKKwkJCQkJaWYgKGlzX2F2YWxpYWJsZV9idWZmZXIoaGV2YykpCisJCQkJCQlyZXQgPSAxOworCQkJCQllbHNlCisJCQkJCQlyZXQgPSAwOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGN0eC0+djRsX3Jlc29sdXRpb25fY2hhbmdlKQorCQkJCQlyZXQgPSAwOworCQkJfQorCQl9IGVsc2UgaWYgKCFjdHgtPnY0bF9jb2RlY19kcGJfcmVhZHkpIHsKKwkJCWlmICh2NGwyX20ybV9udW1fZHN0X2J1ZnNfcmVhZHkoY3R4LT5tMm1fY3R4KSA8CisJCQkJcnVuX3JlYWR5X21pbl9idWZfbnVtKQorCQkJCXJldCA9IDA7CisJCX0KKwl9CisKKwlpZiAocmV0KQorCQlub3RfcnVuX3JlYWR5W2hldmMtPmluZGV4XSA9IDA7CisJZWxzZQorCQlub3RfcnVuX3JlYWR5W2hldmMtPmluZGV4XSsrOworCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkKKwkJcmV0dXJuIHJldCA/IChDT1JFX01BU0tfSEVWQykgOiAwOworCWVsc2UKKwkJcmV0dXJuIHJldCA/IChDT1JFX01BU0tfVkRFQ18xIHwgQ09SRV9NQVNLX0hFVkMpIDogMDsKK30KKworc3RhdGljIHZvaWQgcnVuKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHVuc2lnbmVkIGxvbmcgbWFzaywKKwl2b2lkICgqY2FsbGJhY2spKHN0cnVjdCB2ZGVjX3MgKiwgdm9pZCAqKSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPQorCQkoc3RydWN0IGhldmNfc3RhdGVfcyAqKXZkZWMtPnByaXZhdGU7CisJaW50IHIsIGxvYWRyID0gMDsKKwl1bnNpZ25lZCBjaGFyIGNoZWNrX3N1bSA9IDA7CisKKwlydW5fY291bnRbaGV2Yy0+aW5kZXhdKys7CisJaGV2Yy0+dmRlY19jYl9hcmcgPSBhcmc7CisJaGV2Yy0+dmRlY19jYiA9IGNhbGxiYWNrOworCWhldmMtPmF1eF9kYXRhX2RpcnR5ID0gMTsKKworCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfUlVOX1NUQVJUKTsKKwloZXZjX3Jlc2V0X2NvcmUodmRlYyk7CisKKyNpZmRlZiBBR0FJTl9IQVNfVEhSRVNIT0xECisJaWYgKHZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpKSB7CisJCWhldmMtPnByZV9wYXJzZXJfd3JfcHRyID0KKwkJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCk7CisJCWhldmMtPm5leHRfYWdhaW5fZmxhZyA9IDA7CisJfQorI2VuZGlmCisJciA9IHZkZWNfcHJlcGFyZV9pbnB1dCh2ZGVjLCAmaGV2Yy0+Y2h1bmspOworCWlmIChyIDwgMCkgeworCQlpbnB1dF9lbXB0eVtoZXZjLT5pbmRleF0rKzsKKwkJaGV2Yy0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfQUdBSU47CisJCWhldmNfcHJpbnQoaGV2YywgUFJJTlRfRkxBR19WREVDX0RFVEFJTCwKKwkJCSJhbW12ZGVjX3ZoMjY1OiBJbnN1ZmZpY2llbnQgZGF0YVxuIik7CisKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZoZXZjLT53b3JrKTsKKwkJcmV0dXJuOworCX0KKwlpbnB1dF9lbXB0eVtoZXZjLT5pbmRleF0gPSAwOworCWhldmMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX05PTkU7CisJaWYgKHZkZWNfZnJhbWVfYmFzZWQodmRlYykgJiYKKwkJKChnZXRfZGJnX2ZsYWcoaGV2YykgJiBQUklOVF9GTEFHX1ZERUNfU1RBVFVTKQorCQl8fCBpc19sb2dfZW5hYmxlKGhldmMpKSAmJgorCQkhdmRlY19zZWN1cmUodmRlYykpCisJCWNoZWNrX3N1bSA9IGdldF9kYXRhX2NoZWNrX3N1bShoZXZjLCByKTsKKworCWlmIChpc19sb2dfZW5hYmxlKGhldmMpKQorCQlhZGRfbG9nKGhldmMsCisJCQkiJXM6IHNpemUgMHgleCBzdW0gMHgleCBzaGlmdGJ5dGUgMHgleCIsCisJCQlfX2Z1bmNfXywgciwKKwkJCWNoZWNrX3N1bSwKKwkJCVJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpCisJCQkpOworCWlmICgoaGV2Yy0+ZGlydHlfc2hpZnRfZmxhZyA9PSAxKSAmJiAhKHZkZWMtPmlucHV0LnN3YXBfdmFsaWQpKSB7CisJCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5ULCB2ZGVjLT5pbnB1dC5zdHJlYW1fY29va2llKTsKKwl9CisJaGV2Yy0+c3RhcnRfc2hpZnRfYnl0ZXMgPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKTsKKworCWhldmNfcHJpbnQoaGV2YywgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJIiVzOiBzaXplIDB4JXggc3VtIDB4JXggKCV4ICV4ICV4ICV4ICV4KSBieXRlIGNvdW50ICV4XG4iLAorCQlfX2Z1bmNfXywgciwKKwkJY2hlY2tfc3VtLAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fTEVWRUwpLAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fV1JfUFRSKSwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1JEX1BUUiksCisJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF9ycCksCisJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCksCisJCWhldmMtPnN0YXJ0X3NoaWZ0X2J5dGVzCisJCSk7CisJaWYgKChnZXRfZGJnX2ZsYWcoaGV2YykgJiBQUklOVF9GUkFNRUJBU0VfREFUQSkgJiYKKwkJaW5wdXRfZnJhbWVfYmFzZWQodmRlYykgJiYKKwkJIXZkZWNfc2VjdXJlKHZkZWMpKSB7CisJCWludCBqajsKKwkJdTggKmRhdGEgPSBOVUxMOworCisJCWlmICghaGV2Yy0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQlkYXRhID0gY29kZWNfbW1fdm1hcChoZXZjLT5jaHVuay0+YmxvY2stPnN0YXJ0ICsKKwkJCQloZXZjLT5jaHVuay0+b2Zmc2V0LCByKTsKKwkJZWxzZQorCQkJZGF0YSA9ICgodTggKiloZXZjLT5jaHVuay0+YmxvY2stPnN0YXJ0X3ZpcnQpCisJCQkJKyBoZXZjLT5jaHVuay0+b2Zmc2V0OworCisJCWZvciAoamogPSAwOyBqaiA8IHI7IGpqKyspIHsKKwkJCWlmICgoamogJiAweGYpID09IDApCisJCQkJaGV2Y19wcmludChoZXZjLCBQUklOVF9GUkFNRUJBU0VfREFUQSwKKwkJCQkJIiUwNng6IiwgamopOworCQkJaGV2Y19wcmludF9jb250KGhldmMsIFBSSU5UX0ZSQU1FQkFTRV9EQVRBLAorCQkJCSIlMDJ4ICIsIGRhdGFbampdKTsKKwkJCWlmICgoKGpqICsgMSkgJiAweGYpID09IDApCisJCQkJaGV2Y19wcmludF9jb250KGhldmMsIFBSSU5UX0ZSQU1FQkFTRV9EQVRBLAorCQkJCQkiXG4iKTsKKwkJfQorCisJCWlmICghaGV2Yy0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQljb2RlY19tbV91bm1hcF9waHlhZGRyKGRhdGEpOworCX0KKwlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5kZWNvZGVfcnVuX3RpbWVfbmFtZSwgVFJBQ0VfUlVOX0xPQURJTkdfRldfU1RBUlQpOworCWlmICh2ZGVjLT5tY19sb2FkZWQpIHsKKwkJLypmaXJtd2FyZSBoYXZlIGxvYWQgYmVmb3JlLAorCQkgIGFuZCBub3QgY2hhbmdlcyB0byBhbm90aGVyLgorCQkgIGlnbm9yZSByZWxvYWQuCisJCSovCisJCWlmICh0ZWVfZW5hYmxlZCgpICYmIGhldmMtPmlzX3N3YXAgJiYKKwkJCWdldF9jcHVfbWFqb3JfaWQoKSA8PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hNKQorCQkJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9TV0FQX0JVRkZFUjIsIGhldmMtPnN3YXBfYWRkcik7CisJfSBlbHNlIHsKKwkJaWYgKGhldmMtPm1tdV9lbmFibGUpIHsKKwkJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPiBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hNKQorCQkJCWxvYWRyID0gYW1oZXZjX3ZkZWNfbG9hZG1jX2V4KFZGT1JNQVRfSEVWQywgdmRlYywKKwkJCQkJCSJoMjY1X21tdSIsIGhldmMtPmZ3LT5kYXRhKTsKKwkJCWVsc2UgeworCQkJCWlmICghaGV2Yy0+aXNfNGspIHsKKwkJCQkJLyogaWYgYW4gb2xkZXIgdmVyc2lvbiBvZiB0aGUgZncgd2FzIGxvYWRlZCwgKi8KKwkJCQkJLyogbmVlZHMgdHJ5IHRvIGxvYWQgbm9zd2FwIGZ3IGJlY2F1c2UgdGhlICovCisJCQkJCS8qIG9sZCBmdyBwYWNrYWdlIGRvc2Ugbm90IGNvbnRhaW4gdGhlIHN3YXAgZncuKi8KKwkJCQkJbG9hZHIgPSBhbWhldmNfdmRlY19sb2FkbWNfZXgoCisJCQkJCQlWRk9STUFUX0hFVkMsIHZkZWMsCisJCQkJCQkiaGV2Y19tbXVfc3dhcCIsCisJCQkJCQloZXZjLT5mdy0+ZGF0YSk7CisJCQkJCWlmIChsb2FkciA8IDApCisJCQkJCQlsb2FkciA9IGFtaGV2Y192ZGVjX2xvYWRtY19leCgKKwkJCQkJCQlWRk9STUFUX0hFVkMsIHZkZWMsCisJCQkJCQkJImgyNjVfbW11IiwKKwkJCQkJCQloZXZjLT5mdy0+ZGF0YSk7CisJCQkJCWVsc2UKKwkJCQkJCWhldmMtPmlzX3N3YXAgPSB0cnVlOworCQkJCX0gZWxzZQorCQkJCQlsb2FkciA9IGFtaGV2Y192ZGVjX2xvYWRtY19leCgKKwkJCQkJCVZGT1JNQVRfSEVWQywgdmRlYywKKwkJCQkJCSJoMjY1X21tdSIsIGhldmMtPmZ3LT5kYXRhKTsKKwkJCX0KKwkJfSBlbHNlCisJCQlsb2FkciA9IGFtaGV2Y192ZGVjX2xvYWRtY19leChWRk9STUFUX0hFVkMsIHZkZWMsCisJCQkJCU5VTEwsIGhldmMtPmZ3LT5kYXRhKTsKKworCQlpZiAobG9hZHIgPCAwKSB7CisJCQlhbWhldmNfZGlzYWJsZSgpOworCQkJaGV2Y19wcmludChoZXZjLCAwLCAiSDI2NTogdGhlICVzIGZ3IGxvYWRpbmcgZmFpbGVkLCBlcnI6ICV4XG4iLAorCQkJCXRlZV9lbmFibGVkKCkgPyAiVEVFIiA6ICJsb2NhbCIsIGxvYWRyKTsKKwkJCWhldmMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0ZPUkNFX0VYSVQ7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmhldmMtPndvcmspOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKHRlZV9lbmFibGVkKCkgJiYgaGV2Yy0+aXNfc3dhcCAmJgorCQkJZ2V0X2NwdV9tYWpvcl9pZCgpIDw9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWE0pCisJCQloZXZjLT5zd2FwX2FkZHIgPSBSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fU1dBUF9CVUZGRVIyKTsKKyNpZmRlZiBERVRSRUZJTExfRU5BQkxFCisJCWlmIChoZXZjLT5pc19zd2FwICYmCisJCQlnZXRfY3B1X21ham9yX2lkKCkgPD0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTSkKKwkJCWluaXRfZGV0cmVmaWxsX2J1ZihoZXZjKTsKKyNlbmRpZgorCQl2ZGVjLT5tY19sb2FkZWQgPSAxOworCQl2ZGVjLT5tY190eXBlID0gVkZPUk1BVF9IRVZDOworCX0KKwlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5kZWNvZGVfcnVuX3RpbWVfbmFtZSwgVFJBQ0VfUlVOX0xPQURJTkdfRldfRU5EKTsKKworCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLmRlY29kZV9ydW5fdGltZV9uYW1lLCBUUkFDRV9SVU5fTE9BRElOR19SRVNUT1JFX1NUQVJUKTsKKwlpZiAodmgyNjVfaHdfY3R4X3Jlc3RvcmUoaGV2YykgPCAwKSB7CisJCXZkZWNfc2NoZWR1bGVfd29yaygmaGV2Yy0+d29yayk7CisJCXJldHVybjsKKwl9CisJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UuZGVjb2RlX3J1bl90aW1lX25hbWUsIFRSQUNFX1JVTl9MT0FESU5HX1JFU1RPUkVfRU5EKTsKKwl2ZGVjX2VuYWJsZV9pbnB1dCh2ZGVjKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgSEVWQ19BQ1RJT05fRE9ORSk7CisKKwlpZiAodmRlY19mcmFtZV9iYXNlZCh2ZGVjKSkgeworCQlXUklURV9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCwgMCk7CisJCXIgPSBoZXZjLT5jaHVuay0+c2l6ZSArCisJCQkoaGV2Yy0+Y2h1bmstPm9mZnNldCAmIChWREVDX0ZJRk9fQUxJR04gLSAxKSk7CisJCWhldmMtPmRlY29kZV9zaXplID0gcjsKKwkJaWYgKHZkZWMtPm12ZnJtKQorCQkJdmRlYy0+bXZmcm0tPmZyYW1lX3NpemUgPSBoZXZjLT5jaHVuay0+c2l6ZTsKKwl9CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwllbHNlIHsKKwkJaWYgKHZkZWMtPm1hc3RlciB8fCB2ZGVjLT5zbGF2ZSkKKwkJCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5ULAorCQkJCWhldmMtPnNoaWZ0X2J5dGVfY291bnRfbG8pOworCX0KKyNlbmRpZgorCVdSSVRFX1ZSRUcoSEVWQ19ERUNPREVfU0laRSwgcik7CisJLypXUklURV9WUkVHKEhFVkNfREVDT0RFX0NPVU5ULCBoZXZjLT5kZWNvZGVfaWR4KTsqLworCWhldmMtPmluaXRfZmxhZyA9IDE7CisKKwlpZiAoaGV2Yy0+cGljX2xpc3RfaW5pdF9mbGFnID09IDMpCisJCWluaXRfcGljX2xpc3RfaHcoaGV2Yyk7CisJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSX01PUkUpCisJCWR1bXBfcGljX2xpc3QoaGV2Yyk7CisJYmFja3VwX2RlY29kZV9zdGF0ZShoZXZjKTsKKworCXN0YXJ0X3Byb2Nlc3NfdGltZShoZXZjKTsKKwltb2RfdGltZXIoJmhldmMtPnRpbWVyLCBqaWZmaWVzKTsKKwloZXZjLT5zdGF0IHw9IFNUQVRfVElNRVJfQVJNOworCWhldmMtPnN0YXQgfD0gU1RBVF9JU1JfUkVHOworCWlmICh2ZGVjLT5tdmZybSkKKwkJdmRlYy0+bXZmcm0tPmh3X2RlY29kZV9zdGFydCA9IGxvY2FsX2Nsb2NrKCk7CisJYW1oZXZjX3N0YXJ0KCk7CisJaGV2Yy0+c3RhdCB8PSBTVEFUX1ZERUNfUlVOOworCisJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9SVU5fRU5EKTsKK30KKworc3RhdGljIHZvaWQgYW1sX2ZyZWVfY2FudmFzKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJaW50IGk7CisJc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YyA9CisJCShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICopdmRlYy0+cHJpdmF0ZTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVGX1BJQ19OVU07IGkrKykgeworCQlzdHJ1Y3QgUElDX3MgKnBpYyA9IGhldmMtPm1fUElDW2ldOworCisJCWlmIChwaWMpIHsKKwkJCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQkJCXZkZWMtPmZyZWVfY2FudmFzX2V4KHBpYy0+eV9jYW52YXNfaW5kZXgsIHZkZWMtPmlkKTsKKwkJCQl2ZGVjLT5mcmVlX2NhbnZhc19leChwaWMtPnV2X2NhbnZhc19pbmRleCwgdmRlYy0+aWQpOworCQkJfQorCQl9CisJCWhldmMtPmJ1ZmZlcl93cmFwW2ldID0gaTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0KHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YyA9CisJCShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICopdmRlYy0+cHJpdmF0ZTsKKwlpbnQgaTsKKworCWNhbmNlbF93b3JrX3N5bmMoJmhldmMtPndvcmspOworCWNhbmNlbF93b3JrX3N5bmMoJmhldmMtPm5vdGlmeV93b3JrKTsKKwlpZiAoaGV2Yy0+c3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJYW1oZXZjX3N0b3AoKTsKKwkJaGV2Yy0+c3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwl9CisKKwlpZiAoaGV2Yy0+c3RhdCAmIFNUQVRfVElNRVJfQVJNKSB7CisJCWRlbF90aW1lcl9zeW5jKCZoZXZjLT50aW1lcik7CisJCWhldmMtPnN0YXQgJj0gflNUQVRfVElNRVJfQVJNOworCX0KKwloZXZjLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9OT05FOworCXJlc2V0X3Byb2Nlc3NfdGltZShoZXZjKTsKKwloZXZjLT5waWNfbGlzdF9pbml0X2ZsYWcgPSAwOworCWRlYWxsb2NfbXZfYnVmcyhoZXZjKTsKKwlhbWxfZnJlZV9jYW52YXModmRlYyk7CisJaGV2Y19sb2NhbF91bmluaXQoaGV2Yyk7CisJaWYgKHZoMjY1X2xvY2FsX2luaXQoaGV2YykgPCAwKQorCQlwcl9kZWJ1ZygiICVzIGxvY2FsIGluaXQgZmFpbFxuIiwgX19mdW5jX18pOworCWZvciAoaSA9IDA7IGkgPCBCVUZfUE9PTF9TSVpFOyBpKyspIHsKKwkJaGV2Yy0+bV9CVUZbaV0uc3RhcnRfYWRyID0gMDsKKwl9CisKKwloZXZjX3ByaW50KGhldmMsIFBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsICIlc1xyXG4iLCBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB2aDI2NV9pcnFfY2Ioc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGlycSkKK3sKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjID0KKwkJKHN0cnVjdCBoZXZjX3N0YXRlX3MgKil2ZGVjLT5wcml2YXRlOworCisJcmV0dXJuIHZoMjY1X2lzcigwLCBoZXZjKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHZoMjY1X3RocmVhZGVkX2lycV9jYihzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgaXJxKQoreworCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPQorCQkoc3RydWN0IGhldmNfc3RhdGVfcyAqKXZkZWMtPnByaXZhdGU7CisKKwlyZXR1cm4gdmgyNjVfaXNyX3RocmVhZF9mbigwLCBoZXZjKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGFtdmRlY19oMjY1X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCXN0cnVjdCB2ZGVjX3MgKnBkYXRhID0gKihzdHJ1Y3QgdmRlY19zICoqKXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworI2Vsc2UKKwlzdHJ1Y3QgdmRlY19kZXZfcmVnX3MgKnBkYXRhID0KKwkJKHN0cnVjdCB2ZGVjX2Rldl9yZWdfcyAqKXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworI2VuZGlmCisJY2hhciAqdG1wYnVmOworCWludCByZXQ7CisJc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YzsKKworCWhldmMgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgaGV2Y19zdGF0ZV9zKSk7CisJaWYgKGhldmMgPT0gTlVMTCkgeworCQloZXZjX3ByaW50KGhldmMsIDAsICIlcyB2bWFsbG9jIGhldmMgZmFpbGVkXHJcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWdIZXZjID0gaGV2YzsKKwlpZiAoKGRlYnVnICYgSDI2NV9OT19DSEFOR19ERUJVR19GTEFHX0lOX0NPREUpID09IDApCisJCQlkZWJ1ZyAmPSAofihIMjY1X0RFQlVHX0RJU19MT0NfRVJST1JfUFJPQyB8CisJCQkJCUgyNjVfREVCVUdfRElTX1NZU19FUlJPUl9QUk9DKSk7CisJbWVtc2V0KGhldmMsIDAsIHNpemVvZihzdHJ1Y3QgaGV2Y19zdGF0ZV9zKSk7CisJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSkKKwkJaGV2Y19wcmludChoZXZjLCAwLCAiJXNcclxuIiwgX19mdW5jX18pOworCW11dGV4X2xvY2soJnZoMjY1X211dGV4KTsKKworCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWFRWQkIpICYmCisJCShwYXJzZXJfc2VpX2VuYWJsZSAmIDB4MTAwKSA9PSAwKQorCQlwYXJzZXJfc2VpX2VuYWJsZSA9IDc7IC8qb2xkIDEqLworCWhldmMtPm1faW5zX2ZsYWcgPSAwOworCWhldmMtPmluaXRfZmxhZyA9IDA7CisJaGV2Yy0+Zmlyc3Rfc2NfY2hlY2tlZCA9IDA7CisJaGV2Yy0+dW5pbml0X2xpc3QgPSAwOworCWhldmMtPmZhdGFsX2Vycm9yID0gMDsKKwloZXZjLT5zaG93X2ZyYW1lX251bSA9IDA7CisJaGV2Yy0+ZnJhbWVpbmZvX2VuYWJsZSA9IDE7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCWhldmMtPnBsYXRmb3JtX2RldiA9IHBkZXY7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGRhdGEpOworI2VuZGlmCisKKwlpZiAocGRhdGEgPT0gTlVMTCkgeworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiXG5hbXZkZWNfaDI2NSBtZW1vcnkgcmVzb3VyY2UgdW5kZWZpbmVkLlxuIik7CisJCXZmcmVlKGhldmMpOworCQltdXRleF91bmxvY2soJnZoMjY1X211dGV4KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWlmIChtbXVfZW5hYmxlX2ZvcmNlID09IDApIHsKKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA8IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWEwKKwkJCXx8IGRvdWJsZV93cml0ZV9tb2RlID09IDB4MTApCisJCQloZXZjLT5tbXVfZW5hYmxlID0gMDsKKwkJZWxzZQorCQkJaGV2Yy0+bW11X2VuYWJsZSA9IDE7CisJfQorI2lmZGVmIEgyNjVfMTBCX01NVV9EVworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1RCkgeworCQloZXZjLT5kd19tbXVfZW5hYmxlID0KKwkJCWdldF9kb3VibGVfd3JpdGVfbW9kZShoZXZjKSAmIDB4MjAgPyAxIDogMDsKKwl9IGVsc2UgeworCQloZXZjLT5kd19tbXVfZW5hYmxlID0gMDsKKwl9CisjZW5kaWYKKwlpZiAoaW5pdF9tbXVfYnVmZmVycyhoZXZjLCAwKSkgeworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiXG4gMjY1IG1tdSBpbml0IGZhaWxlZCFcbiIpOworCQl2ZnJlZShoZXZjKTsKKwkJbXV0ZXhfdW5sb2NrKCZ2aDI2NV9tdXRleCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldCA9IGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeShoZXZjLT5ibW11X2JveCwgQk1NVV9XT1JLU1BBQ0VfSUQsCisJCQl3b3JrX2J1Zl9zaXplLCBEUklWRVJfTkFNRSwgJmhldmMtPmJ1Zl9zdGFydCk7CisJaWYgKHJldCA8IDApIHsKKwkJdW5pbml0X21tdV9idWZmZXJzKGhldmMpOworCQl2ZnJlZShoZXZjKTsKKwkJbXV0ZXhfdW5sb2NrKCZ2aDI2NV9tdXRleCk7CisJCXJldHVybiByZXQ7CisJfQorCWhldmMtPmJ1Zl9zaXplID0gd29ya19idWZfc2l6ZTsKKworCisJaWYgKCF2ZGVjX3NlY3VyZShwZGF0YSkpIHsKKwkJCXRtcGJ1ZiA9IChjaGFyICopY29kZWNfbW1fcGh5c190b192aXJ0KGhldmMtPmJ1Zl9zdGFydCk7CisJCQlpZiAodG1wYnVmKSB7CisJCQkJCW1lbXNldCh0bXBidWYsIDAsIHdvcmtfYnVmX3NpemUpOworCQkJCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJCQkJaGV2Yy0+YnVmX3N0YXJ0LAorCQkJCQkJCXdvcmtfYnVmX3NpemUsIERNQV9UT19ERVZJQ0UpOworCQkJfSBlbHNlIHsKKwkJCQkJdG1wYnVmID0gY29kZWNfbW1fdm1hcChoZXZjLT5idWZfc3RhcnQsCisJCQkJCQkJd29ya19idWZfc2l6ZSk7CisJCQkJCWlmICh0bXBidWYpIHsKKwkJCQkJCQltZW1zZXQodG1wYnVmLCAwLCB3b3JrX2J1Zl9zaXplKTsKKwkJCQkJCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSgKKwkJCQkJCQkJCWFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQkJCQkJCWhldmMtPmJ1Zl9zdGFydCwKKwkJCQkJCQkJCXdvcmtfYnVmX3NpemUsCisJCQkJCQkJCQlETUFfVE9fREVWSUNFKTsKKwkJCQkJCQljb2RlY19tbV91bm1hcF9waHlhZGRyKHRtcGJ1Zik7CisJCQkJCX0KKwkJCX0KKwl9CisKKwlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpKSB7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSI9PT1ILjI2NSBkZWNvZGVyIG1lbSByZXNvdXJjZSAweCVseCBzaXplIDB4JXhcbiIsCisJCQloZXZjLT5idWZfc3RhcnQsIGhldmMtPmJ1Zl9zaXplKTsKKwl9CisKKwlpZiAocGRhdGEtPnN5c19pbmZvKQorCQloZXZjLT52aDI2NV9hbXN0cmVhbV9kZWNfaW5mbyA9ICpwZGF0YS0+c3lzX2luZm87CisJZWxzZSB7CisJCWhldmMtPnZoMjY1X2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoID0gMDsKKwkJaGV2Yy0+dmgyNjVfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0ID0gMDsKKwkJaGV2Yy0+dmgyNjVfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSA9IDMwOworCX0KKworCWhldmMtPmVuZGlhbiA9IEhFVkNfQ09ORklHX0xJVFRMRV9FTkRJQU47CisJaWYgKGlzX3N1cHBvcnRfdmRlY19jYW52YXMoKSkKKwkJaGV2Yy0+ZW5kaWFuID0gSEVWQ19DT05GSUdfQklHX0VORElBTjsKKwlpZiAoZW5kaWFuKQorCQloZXZjLT5lbmRpYW4gPSBlbmRpYW47CisKKyNpZm5kZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCWlmIChwZGF0YS0+ZmxhZyAmIERFQ19GTEFHX0hFVkNfV09SS0FST1VORCkgeworCQl3b3JrYXJvdW5kX2VuYWJsZSB8PSAzOworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiYW12ZGVjX2gyNjUgSEVWQ19XT1JLQVJPVU5EIGZsYWcgc2V0LlxuIik7CisJfSBlbHNlCisJCXdvcmthcm91bmRfZW5hYmxlICY9IH4zOworI2VuZGlmCisJaGV2Yy0+Y21hX2RldiA9IHBkYXRhLT5jbWFfZGV2OworCXZoMjY1X3ZkZWNfaW5mb19pbml0KGhldmMpOworCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCXBkYXRhLT5wcml2YXRlID0gaGV2YzsKKwlwZGF0YS0+ZGVjX3N0YXR1cyA9IHZoMjY1X2RlY19zdGF0dXM7CisJcGRhdGEtPnNldF90cmlja21vZGUgPSB2aDI2NV9zZXRfdHJpY2ttb2RlOworCXBkYXRhLT5zZXRfaXNyZXNldCA9IHZoMjY1X3NldF9pc3Jlc2V0OworCWlzX3Jlc2V0ID0gMDsKKwlpZiAodmgyNjVfaW5pdChwZGF0YSkgPCAwKSB7CisjZWxzZQorCWlmICh2aDI2NV9pbml0KGhldmMpIDwgMCkgeworI2VuZGlmCisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJcbmFtdmRlY19oMjY1IGluaXQgZmFpbGVkLlxuIik7CisJCWhldmNfbG9jYWxfdW5pbml0KGhldmMpOworCQlpZiAoaGV2Yy0+Z3ZzKQorCQkJa2ZyZWUoaGV2Yy0+Z3ZzKTsKKwkJaGV2Yy0+Z3ZzID0gTlVMTDsKKwkJdW5pbml0X21tdV9idWZmZXJzKGhldmMpOworCQl2ZnJlZShoZXZjKTsKKwkJcGRhdGEtPmRlY19zdGF0dXMgPSBOVUxMOworCQltdXRleF91bmxvY2soJnZoMjY1X211dGV4KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8qc2V0IHRoZSBtYXggY2xrIGZvciBzbW9vdGggcGxheWluZy4uLiovCisJaGV2Y19zb3VyY2VfY2hhbmdlZChWRk9STUFUX0hFVkMsCisJCQkzODQwLCAyMTYwLCA2MCk7CisJbXV0ZXhfdW5sb2NrKCZ2aDI2NV9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbXZkZWNfaDI2NV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjID0gZ0hldmM7CisKKwlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpKQorCQloZXZjX3ByaW50KGhldmMsIDAsICIlc1xyXG4iLCBfX2Z1bmNfXyk7CisKKwltdXRleF9sb2NrKCZ2aDI2NV9tdXRleCk7CisKKwl2aDI2NV9zdG9wKGhldmMpOworCisJaGV2Y19zb3VyY2VfY2hhbmdlZChWRk9STUFUX0hFVkMsIDAsIDAsIDApOworCisKKyNpZmRlZiBERUJVR19QVFMKKwloZXZjX3ByaW50KGhldmMsIDAsCisJCSJwdHMgbWlzc2VkICVsZCwgcHRzIGhpdCAlbGQsIGR1cmF0aW9uICVkXG4iLAorCQloZXZjLT5wdHNfbWlzc2VkLCBoZXZjLT5wdHNfaGl0LCBoZXZjLT5mcmFtZV9kdXIpOworI2VuZGlmCisKKwl2ZnJlZShoZXZjKTsKKwloZXZjID0gTlVMTDsKKwlnSGV2YyA9IE5VTEw7CisKKwltdXRleF91bmxvY2soJnZoMjY1X211dGV4KTsKKworCXJldHVybiAwOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGgyNjVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJYW1oZXZjX3N1c3BlbmQodG9fcGxhdGZvcm1fZGV2aWNlKGRldiksIGRldi0+cG93ZXIucG93ZXJfc3RhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGgyNjVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlhbWhldmNfcmVzdW1lKHRvX3BsYXRmb3JtX2RldmljZShkZXYpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGgyNjVfcG1fb3BzID0geworCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKGgyNjVfc3VzcGVuZCwgaDI2NV9yZXN1bWUpCit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFtdmRlY19oMjY1X2RyaXZlciA9IHsKKwkucHJvYmUgPSBhbXZkZWNfaDI2NV9wcm9iZSwKKwkucmVtb3ZlID0gYW12ZGVjX2gyNjVfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJJVkVSX05BTUUsCisjaWZkZWYgQ09ORklHX1BNCisJCS5wbSA9ICZoMjY1X3BtX29wcywKKyNlbmRpZgorCX0KK307CisKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCitzdGF0aWMgdm9pZCB2aDI2NV9kdW1wX3N0YXRlKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJaW50IGk7CisJc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YyA9CisJCShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICopdmRlYy0+cHJpdmF0ZTsKKwloZXZjX3ByaW50KGhldmMsIDAsCisJCSI9PT09PT0gJXNcbiIsIF9fZnVuY19fKTsKKworCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJIndpZHRoL2hlaWdodCAoJWQvJWQpLCByZW9yZGVyX3BpY19udW0gJWQgaXBfbW9kZSAlZCBidWYgY291bnQoYnVmc3BlYyBzaXplKSAlZCwgdmlkZW9fc2lnbmFsX3R5cGUgMHgleCwgaXNfc3dhcCAlZCBpX29ubHkgMHgleFxuIiwKKwkJaGV2Yy0+ZnJhbWVfd2lkdGgsCisJCWhldmMtPmZyYW1lX2hlaWdodCwKKwkJaGV2Yy0+c3BzX251bV9yZW9yZGVyX3BpY3NfMCwKKwkJaGV2Yy0+aXBfbW9kZSwKKwkJZ2V0X3dvcmtfcGljX251bShoZXZjKSwKKwkJaGV2Yy0+dmlkZW9fc2lnbmFsX3R5cGVfZGVidWcsCisJCWhldmMtPmlzX3N3YXAsCisJCWhldmMtPmlfb25seQorCQkpOworCisJaGV2Y19wcmludChoZXZjLCAwLAorCQkiaXNfZnJhbWViYXNlKCVkKSwgZW9zICVkLCBkZWNfcmVzdWx0IDB4JXggZGVjX2ZybSAlZCBkaXNwX2ZybSAlZCBydW4gJWQgbm90X3J1bl9yZWFkeSAlZCBpbnB1dF9lbXB0eSAlZFxuIiwKKwkJaW5wdXRfZnJhbWVfYmFzZWQodmRlYyksCisJCWhldmMtPmVvcywKKwkJaGV2Yy0+ZGVjX3Jlc3VsdCwKKwkJZGVjb2RlX2ZyYW1lX2NvdW50W2hldmMtPmluZGV4XSwKKwkJZGlzcGxheV9mcmFtZV9jb3VudFtoZXZjLT5pbmRleF0sCisJCXJ1bl9jb3VudFtoZXZjLT5pbmRleF0sCisJCW5vdF9ydW5fcmVhZHlbaGV2Yy0+aW5kZXhdLAorCQlpbnB1dF9lbXB0eVtoZXZjLT5pbmRleF0KKwkJKTsKKworCWlmIChoZXZjLT5pc191c2VkX3Y0bCAmJiB2Zl9nZXRfcmVjZWl2ZXIodmRlYy0+dmZfcHJvdmlkZXJfbmFtZSkpIHsKKwkJZW51bSByZWNldml2ZXJfc3RhcnRfZSBzdGF0ZSA9CisJCXZmX25vdGlmeV9yZWNlaXZlcih2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1FVUkVZX1NUQVRFLAorCQkJTlVMTCk7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJcbnJlY2VpdmVyKCVzKSBzdGF0ZSAlZFxuIiwKKwkJCXZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQlzdGF0ZSk7CisJfQorCisJaGV2Y19wcmludChoZXZjLCAwLAorCSIlcywgbmV3cSglZC8lZCksIGRpc3BxKCVkLyVkKSwgdmYgcHJlcGFyZS9nZXQvcHV0ICglZC8lZC8lZCksIHBpY19saXN0X2luaXRfZmxhZyglZCksIGlzX25ld19waWNfYXZhaWxhYmxlKCVkKVxuIiwKKwlfX2Z1bmNfXywKKwlrZmlmb19sZW4oJmhldmMtPm5ld2ZyYW1lX3EpLAorCVZGX1BPT0xfU0laRSwKKwlrZmlmb19sZW4oJmhldmMtPmRpc3BsYXlfcSksCisJVkZfUE9PTF9TSVpFLAorCWhldmMtPnZmX3ByZV9jb3VudCwKKwloZXZjLT52Zl9nZXRfY291bnQsCisJaGV2Yy0+dmZfcHV0X2NvdW50LAorCWhldmMtPnBpY19saXN0X2luaXRfZmxhZywKKwlpc19uZXdfcGljX2F2YWlsYWJsZShoZXZjKQorCSk7CisKKwlkdW1wX3BpY19saXN0KGhldmMpOworCisJZm9yIChpID0gMDsgaSA8IEJVRl9QT09MX1NJWkU7IGkrKykgeworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiQnVmKCVkKSBzdGFydF9hZHIgMHgleCBoZWFkZXJfYWRkciAweCV4IHNpemUgMHgleCB1c2VkICVkXG4iLAorCQkJaSwKKwkJCWhldmMtPm1fQlVGW2ldLnN0YXJ0X2FkciwKKwkJCWhldmMtPm1fQlVGW2ldLmhlYWRlcl9hZGRyLAorCQkJaGV2Yy0+bV9CVUZbaV0uc2l6ZSwKKwkJCWhldmMtPm1fQlVGW2ldLnVzZWRfZmxhZyk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE1BWF9SRUZfUElDX05VTTsgaSsrKSB7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJtdl9CdWYoJWQpIHN0YXJ0X2FkciAweCV4IHNpemUgMHgleCB1c2VkICVkXG4iLAorCQkJaSwKKwkJCWhldmMtPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciwKKwkJCWhldmMtPm1fbXZfQlVGW2ldLnNpemUsCisJCQloZXZjLT5tX212X0JVRltpXS51c2VkX2ZsYWcpOworCX0KKworCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJIkhFVkNfREVDX1NUQVRVU19SRUc9MHgleFxuIiwKKwkJUkVBRF9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcpKTsKKwloZXZjX3ByaW50KGhldmMsIDAsCisJCSJIRVZDX01QQ19FPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX01QQ19FKSk7CisJaGV2Y19wcmludChoZXZjLCAwLAorCQkiSEVWQ19ERUNPREVfTU9ERT0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19ERUNPREVfTU9ERSkpOworCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJIkhFVkNfREVDT0RFX01PREUyPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX0RFQ09ERV9NT0RFMikpOworCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJIk5BTF9TRUFSQ0hfQ1RMPTB4JXhcbiIsCisJCVJFQURfVlJFRyhOQUxfU0VBUkNIX0NUTCkpOworCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJIkhFVkNfUEFSU0VSX0xDVV9TVEFSVD0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfTENVX1NUQVJUKSk7CisJaGV2Y19wcmludChoZXZjLCAwLAorCQkiSEVWQ19ERUNPREVfU0laRT0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19ERUNPREVfU0laRSkpOworCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJIkhFVkNfU0hJRlRfQllURV9DT1VOVD0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKSk7CisJaGV2Y19wcmludChoZXZjLCAwLAorCQkiSEVWQ19TVFJFQU1fU1RBUlRfQUREUj0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fU1RBUlRfQUREUikpOworCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJIkhFVkNfU1RSRUFNX0VORF9BRERSPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9FTkRfQUREUikpOworCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJIkhFVkNfU1RSRUFNX0xFVkVMPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9MRVZFTCkpOworCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJIkhFVkNfU1RSRUFNX1dSX1BUUj0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fV1JfUFRSKSk7CisJaGV2Y19wcmludChoZXZjLCAwLAorCQkiSEVWQ19TVFJFQU1fUkRfUFRSPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIpKTsKKwloZXZjX3ByaW50KGhldmMsIDAsCisJCSJQQVJTRVJfVklERU9fUlA9MHgleFxuIiwKKwkJU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3JwKSk7CisJaGV2Y19wcmludChoZXZjLCAwLAorCQkiUEFSU0VSX1ZJREVPX1dQPTB4JXhcbiIsCisJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCkpOworCisJaWYgKGlucHV0X2ZyYW1lX2Jhc2VkKHZkZWMpICYmCisJCShnZXRfZGJnX2ZsYWcoaGV2YykgJiBQUklOVF9GUkFNRUJBU0VfREFUQSkKKwkJKSB7CisJCWludCBqajsKKwkJaWYgKGhldmMtPmNodW5rICYmIGhldmMtPmNodW5rLT5ibG9jayAmJgorCQkJaGV2Yy0+Y2h1bmstPnNpemUgPiAwKSB7CisJCQl1OCAqZGF0YSA9IE5VTEw7CisJCQlpZiAoIWhldmMtPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQkJCWRhdGEgPSBjb2RlY19tbV92bWFwKGhldmMtPmNodW5rLT5ibG9jay0+c3RhcnQgKworCQkJCQloZXZjLT5jaHVuay0+b2Zmc2V0LCBoZXZjLT5jaHVuay0+c2l6ZSk7CisJCQllbHNlCisJCQkJZGF0YSA9ICgodTggKiloZXZjLT5jaHVuay0+YmxvY2stPnN0YXJ0X3ZpcnQpCisJCQkJCSsgaGV2Yy0+Y2h1bmstPm9mZnNldDsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkiZnJhbWUgZGF0YSBzaXplIDB4JXhcbiIsCisJCQkJaGV2Yy0+Y2h1bmstPnNpemUpOworCQkJZm9yIChqaiA9IDA7IGpqIDwgaGV2Yy0+Y2h1bmstPnNpemU7IGpqKyspIHsKKwkJCQlpZiAoKGpqICYgMHhmKSA9PSAwKQorCQkJCQloZXZjX3ByaW50KGhldmMsCisJCQkJCVBSSU5UX0ZSQU1FQkFTRV9EQVRBLAorCQkJCQkJIiUwNng6IiwgamopOworCQkJCWhldmNfcHJpbnRfY29udChoZXZjLAorCQkJCVBSSU5UX0ZSQU1FQkFTRV9EQVRBLAorCQkJCQkiJTAyeCAiLCBkYXRhW2pqXSk7CisJCQkJaWYgKCgoamogKyAxKSAmIDB4ZikgPT0gMCkKKwkJCQkJaGV2Y19wcmludF9jb250KGhldmMsCisJCQkJCVBSSU5UX0ZSQU1FQkFTRV9EQVRBLAorCQkJCQkJIlxuIik7CisJCQl9CisKKwkJCWlmICghaGV2Yy0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcihkYXRhKTsKKwkJfQorCX0KKworfQorCisKK3N0YXRpYyBpbnQgYW1tdmRlY19oMjY1X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisKKwlzdHJ1Y3QgdmRlY19zICpwZGF0YSA9ICooc3RydWN0IHZkZWNfcyAqKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjID0gTlVMTDsKKwlpbnQgcmV0OworCWludCBpOworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX01VTFRJX0RFQworCWludCBjb25maWdfdmFsOworI2VuZGlmCisKKwlpZiAocGRhdGEgPT0gTlVMTCkgeworCQlwcl9pbmZvKCJcbmFtbXZkZWNfaDI2NSBtZW1vcnkgcmVzb3VyY2UgdW5kZWZpbmVkLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCisJaGV2YyA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBoZXZjX3N0YXRlX3MpKTsKKwlpZiAoaGV2YyA9PSBOVUxMKSB7CisJCXByX2luZm8oIlxuYW1tdmRlY19oMjY1IGRldmljZSBkYXRhIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChoZXZjLCAwLCBzaXplb2Yoc3RydWN0IGhldmNfc3RhdGVfcykpOworCisJLyogdGhlIGN0eCBmcm9tIHY0bDIgZHJpdmVyLiAqLworCWhldmMtPnY0bDJfY3R4ID0gcGRhdGEtPnByaXZhdGU7CisKKwlwZGF0YS0+cHJpdmF0ZSA9IGhldmM7CisJcGRhdGEtPmRlY19zdGF0dXMgPSB2aDI2NV9kZWNfc3RhdHVzOworCXBkYXRhLT5zZXRfdHJpY2ttb2RlID0gdmgyNjVfc2V0X3RyaWNrbW9kZTsKKwlwZGF0YS0+cnVuX3JlYWR5ID0gcnVuX3JlYWR5OworCXBkYXRhLT5ydW4gPSBydW47CisJcGRhdGEtPnJlc2V0ID0gcmVzZXQ7CisJcGRhdGEtPmlycV9oYW5kbGVyID0gdmgyNjVfaXJxX2NiOworCXBkYXRhLT50aHJlYWRlZF9pcnFfaGFuZGxlciA9IHZoMjY1X3RocmVhZGVkX2lycV9jYjsKKwlwZGF0YS0+ZHVtcF9zdGF0ZSA9IHZoMjY1X2R1bXBfc3RhdGU7CisKKwloZXZjLT5pbmRleCA9IHBkZXYtPmlkOworCWhldmMtPm1faW5zX2ZsYWcgPSAxOworCisJaWYgKGlzX3JkbWFfZW5hYmxlKCkpIHsKKwkJaGV2Yy0+cmRtYV9hZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLCBSRE1BX1NJWkUsICZoZXZjLT5yZG1hX3BoeV9hZHIsIEdGUF9LRVJORUwpOworCQlmb3IgKGkgPSAwOyBpIDwgU0NBTEVMVVRfREFUQV9XUklURV9OVU07IGkrKykgeworCQkJaGV2Yy0+cmRtYV9hZHJbaSAqIDRdID0gSEVWQ19JUUlUX1NDQUxFTFVUX1dSX0FERFIgJiAweGZmZjsKKwkJCWhldmMtPnJkbWFfYWRyW2kgKiA0ICsgMV0gPSBpOworCQkJaGV2Yy0+cmRtYV9hZHJbaSAqIDQgKyAyXSA9IEhFVkNfSVFJVF9TQ0FMRUxVVF9EQVRBICYgMHhmZmY7CisJCQloZXZjLT5yZG1hX2FkcltpICogNCArIDNdID0gMDsKKwkJCWlmIChpID09IFNDQUxFTFVUX0RBVEFfV1JJVEVfTlVNIC0gMSkgeworCQkJCWhldmMtPnJkbWFfYWRyW2kgKiA0ICsgMl0gPSAoSEVWQ19JUUlUX1NDQUxFTFVUX0RBVEEgJiAweGZmZikgfCAweDIwMDAwOworCQkJfQorCQl9CisJfQorCXNucHJpbnRmKGhldmMtPnRyYWNlLnZkZWNfbmFtZSwgc2l6ZW9mKGhldmMtPnRyYWNlLnZkZWNfbmFtZSksCisJCSJoMjY1LSVkIiwgaGV2Yy0+aW5kZXgpOworCXNucHJpbnRmKGhldmMtPnRyYWNlLnB0c19uYW1lLCBzaXplb2YoaGV2Yy0+dHJhY2UucHRzX25hbWUpLAorCQkiJXMtcHRzIiwgaGV2Yy0+dHJhY2UudmRlY19uYW1lKTsKKwlzbnByaW50ZihoZXZjLT50cmFjZS52Zl9nZXRfbmFtZSwgc2l6ZW9mKGhldmMtPnRyYWNlLnZmX2dldF9uYW1lKSwKKwkJIiVzLXZmX2dldCIsIGhldmMtPnRyYWNlLnZkZWNfbmFtZSk7CisJc25wcmludGYoaGV2Yy0+dHJhY2UudmZfcHV0X25hbWUsIHNpemVvZihoZXZjLT50cmFjZS52Zl9wdXRfbmFtZSksCisJCSIlcy12Zl9wdXQiLCBoZXZjLT50cmFjZS52ZGVjX25hbWUpOworCXNucHJpbnRmKGhldmMtPnRyYWNlLnNldF9jYW52YXMwX2FkZHIsIHNpemVvZihoZXZjLT50cmFjZS5zZXRfY2FudmFzMF9hZGRyKSwKKwkJIiVzLXNldF9jYW52YXMwX2FkZHIiLCBoZXZjLT50cmFjZS52ZGVjX25hbWUpOworCXNucHJpbnRmKGhldmMtPnRyYWNlLmdldF9jYW52YXMwX2FkZHIsIHNpemVvZihoZXZjLT50cmFjZS5nZXRfY2FudmFzMF9hZGRyKSwKKwkJIiVzLWdldF9jYW52YXMwX2FkZHIiLCBoZXZjLT50cmFjZS52ZGVjX25hbWUpOworCXNucHJpbnRmKGhldmMtPnRyYWNlLnB1dF9jYW52YXMwX2FkZHIsIHNpemVvZihoZXZjLT50cmFjZS5wdXRfY2FudmFzMF9hZGRyKSwKKwkJIiVzLXB1dF9jYW52YXMwX2FkZHIiLCBoZXZjLT50cmFjZS52ZGVjX25hbWUpOworCXNucHJpbnRmKGhldmMtPnRyYWNlLm5ld19xX25hbWUsIHNpemVvZihoZXZjLT50cmFjZS5uZXdfcV9uYW1lKSwKKwkJIiVzLW5ld2ZyYW1lX3EiLCBoZXZjLT50cmFjZS52ZGVjX25hbWUpOworCXNucHJpbnRmKGhldmMtPnRyYWNlLmRpc3BfcV9uYW1lLCBzaXplb2YoaGV2Yy0+dHJhY2UuZGlzcF9xX25hbWUpLAorCQkiJXMtZGlzcGZyYW1lX3EiLCBoZXZjLT50cmFjZS52ZGVjX25hbWUpOworCXNucHJpbnRmKGhldmMtPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIHNpemVvZihoZXZjLT50cmFjZS5kZWNvZGVfdGltZV9uYW1lKSwKKwkJImRlY29kZXJfdGltZSVkIiwgcGRldi0+aWQpOworCXNucHJpbnRmKGhldmMtPnRyYWNlLmRlY29kZV9ydW5fdGltZV9uYW1lLCBzaXplb2YoaGV2Yy0+dHJhY2UuZGVjb2RlX3J1bl90aW1lX25hbWUpLAorCQkiZGVjb2Rlcl9ydW5fdGltZSVkIiwgcGRldi0+aWQpOworCXNucHJpbnRmKGhldmMtPnRyYWNlLmRlY29kZV9oZWFkZXJfbWVtb3J5X3RpbWVfbmFtZSwgc2l6ZW9mKGhldmMtPnRyYWNlLmRlY29kZV9oZWFkZXJfbWVtb3J5X3RpbWVfbmFtZSksCisJCSJkZWNvZGVyX2hlYWRlcl90aW1lJWQiLCBwZGV2LT5pZCk7CisJc25wcmludGYoaGV2Yy0+dHJhY2UuZGVjb2RlX3dvcmtfdGltZV9uYW1lLCBzaXplb2YoaGV2Yy0+dHJhY2UuZGVjb2RlX3dvcmtfdGltZV9uYW1lKSwKKwkJImRlY29kZXJfd29ya190aW1lJWQiLCBwZGV2LT5pZCk7CisKKwlpZiAocGRhdGEtPnVzZV92Zm1fcGF0aCkgeworCQlzbnByaW50ZihwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJVkRFQ19QUk9WSURFUl9OQU1FX1NJWkUsCisJCQlWRk1fREVDX1BST1ZJREVSX05BTUUpOworCQloZXZjLT5mcmFtZWluZm9fZW5hYmxlID0gMTsKKwl9CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwllbHNlIGlmICh2ZGVjX2R1YWwocGRhdGEpKSB7CisJCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmNfcGFpciA9IE5VTEw7CisKKwkJaWYgKCFwZGF0YS0+aXNfc3RyZWFtX21vZGVfZHZfbXVsdGkpIHsKKwkJCWlmIChkdl90b2dnbGVfcHJvdl9uYW1lKSAvKmRlYnVnIHB1cnBvc2UqLworCQkJCXNucHJpbnRmKHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJCVZERUNfUFJPVklERVJfTkFNRV9TSVpFLAorCQkJCQkocGRhdGEtPm1hc3RlcikgPyBWRk1fREVDX0RWQkxfUFJPVklERVJfTkFNRSA6CisJCQkJCVZGTV9ERUNfRFZFTF9QUk9WSURFUl9OQU1FKTsKKwkJCWVsc2UKKwkJCQlzbnByaW50ZihwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCQlWREVDX1BST1ZJREVSX05BTUVfU0laRSwKKwkJCQkJKHBkYXRhLT5tYXN0ZXIpID8gVkZNX0RFQ19EVkVMX1BST1ZJREVSX05BTUUgOgorCQkJCQlWRk1fREVDX0RWQkxfUFJPVklERVJfTkFNRSk7CisJCX0gZWxzZSB7CisJCQlpZiAoZHZfdG9nZ2xlX3Byb3ZfbmFtZSkgLypkZWJ1ZyBwdXJwb3NlKi8KKwkJCQlzbnByaW50ZihwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCQlWREVDX1BST1ZJREVSX05BTUVfU0laRSwKKwkJCQkJKHBkYXRhLT5tYXN0ZXIpID8gVkZNX0RFQ19EVkJMX1BST1ZJREVSX05BTUUyIDoKKwkJCQkJVkZNX0RFQ19EVkVMX1BST1ZJREVSX05BTUUyKTsKKwkJCWVsc2UKKwkJCQlzbnByaW50ZihwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCQlWREVDX1BST1ZJREVSX05BTUVfU0laRSwKKwkJCQkJKHBkYXRhLT5tYXN0ZXIpID8gVkZNX0RFQ19EVkVMX1BST1ZJREVSX05BTUUyIDoKKwkJCQkJVkZNX0RFQ19EVkJMX1BST1ZJREVSX05BTUUyKTsKKwkJfQorCisJCWhldmMtPmRvbGJ5X2VuaGFuY2VfZmxhZyA9IHBkYXRhLT5tYXN0ZXIgPyAxIDogMDsKKwkJaWYgKHBkYXRhLT5tYXN0ZXIpCisJCQloZXZjX3BhaXIgPSAoc3RydWN0IGhldmNfc3RhdGVfcyAqKQorCQkJCXBkYXRhLT5tYXN0ZXItPnByaXZhdGU7CisJCWVsc2UgaWYgKHBkYXRhLT5zbGF2ZSkKKwkJCWhldmNfcGFpciA9IChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICopCisJCQkJcGRhdGEtPnNsYXZlLT5wcml2YXRlOworCQlpZiAoaGV2Y19wYWlyKQorCQkJaGV2Yy0+c2hpZnRfYnl0ZV9jb3VudF9sbyA9CisJCQloZXZjX3BhaXItPnNoaWZ0X2J5dGVfY291bnRfbG87CisJfQorI2VuZGlmCisJZWxzZQorCQlzbnByaW50ZihwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwgVkRFQ19QUk9WSURFUl9OQU1FX1NJWkUsCisJCQlNVUxUSV9JTlNUQU5DRV9QUk9WSURFUl9OQU1FICIuJTAyeCIsIHBkZXYtPmlkICYgMHhmZik7CisKKwloZXZjLT5wcm92aWRlcl9uYW1lID0gcGRhdGEtPnZmX3Byb3ZpZGVyX25hbWU7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGRhdGEpOworCisJaGV2Yy0+cGxhdGZvcm1fZGV2ID0gcGRldjsKKworCWlmICgoKGdldF9kYmdfZmxhZyhoZXZjKSAmIElHTk9SRV9QQVJBTV9GUk9NX0NPTkZJRykgPT0gMCkgJiYKKwkJCXBkYXRhLT5jb25maWdfbGVuKSB7CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfTVVMVElfREVDCisJCS8qdXNlIHB0ciBjb25maWcgZm9yIGRvdWJlbF93cml0ZV9tb2RlLCBldGMqLworCQloZXZjX3ByaW50KGhldmMsIDAsICJwZGF0YS0+Y29uZmlnPSVzXG4iLCBwZGF0YS0+Y29uZmlnKTsKKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgImhldmNfZG91YmxlX3dyaXRlX21vZGUiLAorCQkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJaGV2Yy0+ZG91YmxlX3dyaXRlX21vZGUgPSBjb25maWdfdmFsOworCQllbHNlCisJCQloZXZjLT5kb3VibGVfd3JpdGVfbW9kZSA9IGRvdWJsZV93cml0ZV9tb2RlOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAic2F2ZV9idWZmZXJfbW9kZSIsCisJCQkJJmNvbmZpZ192YWwpID09IDApCisJCQloZXZjLT5zYXZlX2J1ZmZlcl9tb2RlID0gY29uZmlnX3ZhbDsKKwkJZWxzZQorCQkJaGV2Yy0+c2F2ZV9idWZmZXJfbW9kZSA9IDA7CisKKwkJLyp1c2UgcHRyIGNvbmZpZyBmb3IgbWF4X3BpY193LCBldGMqLworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgImhldmNfYnVmX3dpZHRoIiwKKwkJCQkmY29uZmlnX3ZhbCkgPT0gMCkgeworCQkJCWhldmMtPm1heF9waWNfdyA9IGNvbmZpZ192YWw7CisJCX0KKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJoZXZjX2J1Zl9oZWlnaHQiLAorCQkJCSZjb25maWdfdmFsKSA9PSAwKSB7CisJCQkJaGV2Yy0+bWF4X3BpY19oID0gY29uZmlnX3ZhbDsKKwkJfQorCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgInNpZGViaW5kX3R5cGUiLAorCQkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJaGV2Yy0+c2lkZWJpbmRfdHlwZSA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJzaWRlYmluZF9jaGFubmVsX2lkIiwKKwkJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWhldmMtPnNpZGViaW5kX2NoYW5uZWxfaWQgPSBjb25maWdfdmFsOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLAorCQkJInBhcm1fdjRsX2NvZGVjX2VuYWJsZSIsCisJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWhldmMtPmlzX3VzZWRfdjRsID0gY29uZmlnX3ZhbDsKKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywKKwkJCSJwYXJtX3Y0bF9idWZmZXJfbWFyZ2luIiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJaGV2Yy0+ZHluYW1pY19idWZfbnVtX21hcmdpbiA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV92NGxfY2FudmFzX21lbV9tb2RlIiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJaGV2Yy0+bWVtX21hcF9tb2RlID0gY29uZmlnX3ZhbDsKKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm5lZ2F0aXZlX2R2IiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKSB7CisJCQloZXZjLT5kaXNjYXJkX2R2X2RhdGEgPSBjb25maWdfdmFsOworCQkJaGV2Y19wcmludChoZXZjLCAwLCAiZGlzY2FyZCBkdiBkYXRhXG4iKTsKKwkJfQorCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAiZHZfZHVhbGxheWVyIiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKSB7CisJCQloZXZjLT5kdl9kdWFsbGF5ZXIgPSBjb25maWdfdmFsOworCQkJaGV2Y19wcmludChoZXZjLCAwLCAiZHYgZHVhbCBsYXllclxuIik7CisJCX0KKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywKKwkJCSJwYXJtX2VuYWJsZV9mZW5jZSIsCisJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWhldmMtPmVuYWJsZV9mZW5jZSA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV9mZW5jZV91c2FnZSIsCisJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWhldmMtPmZlbmNlX3VzYWdlID0gY29uZmlnX3ZhbDsKKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywKKwkJCSJwYXJtX3Y0bF9sb3dfbGF0ZW5jeV9tb2RlIiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJaGV2Yy0+bG93X2xhdGVuY3lfZmxhZyA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV92NGxfbWV0YWRhdGFfY29uZmlnX2ZsYWciLAorCQkJJmNvbmZpZ192YWwpID09IDApIHsKKwkJCWhldmMtPm1ldGFkYXRhX2NvbmZpZ19mbGFnID0gY29uZmlnX3ZhbDsKKwkJCWhldmMtPmRpc2NhcmRfZHZfZGF0YSA9IGhldmMtPm1ldGFkYXRhX2NvbmZpZ19mbGFnICYgVkRFQ19DRkdfRkxBR19EVl9ORUdBVElWRTsKKwkJCWhldmMtPmR2X2R1YWxsYXllciA9IGhldmMtPm1ldGFkYXRhX2NvbmZpZ19mbGFnICYgVkRFQ19DRkdfRkxBR19EVl9UV09MQVJZRVI7CisJCQlpZiAoaGV2Yy0+ZGlzY2FyZF9kdl9kYXRhKQorCQkJCWhldmNfcHJpbnQoaGV2YywgMCwgImRpc2NhcmQgZHYgZGF0YVxuIik7CisJCQlpZiAoaGV2Yy0+ZHZfZHVhbGxheWVyKQorCQkJCWhldmNfcHJpbnQoaGV2YywgMCwgImR2X2R1YWxsYXllclxuIik7CisJCX0KKyNlbmRpZgorCX0gZWxzZSB7CisJCWlmIChwZGF0YS0+c3lzX2luZm8pCisJCQloZXZjLT52aDI2NV9hbXN0cmVhbV9kZWNfaW5mbyA9ICpwZGF0YS0+c3lzX2luZm87CisJCWVsc2UgeworCQkJaGV2Yy0+dmgyNjVfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGggPSAwOworCQkJaGV2Yy0+dmgyNjVfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0ID0gMDsKKwkJCWhldmMtPnZoMjY1X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgPSAzMDsKKwkJfQorCQloZXZjLT5kb3VibGVfd3JpdGVfbW9kZSA9IGRvdWJsZV93cml0ZV9tb2RlOworCX0KKworCisJdmZfcHJvdmlkZXJfaW5pdCgmcGRhdGEtPnZmcmFtZV9wcm92aWRlciwgcGRhdGEtPnZmX3Byb3ZpZGVyX25hbWUsCisJCSZ2aDI2NV92Zl9wcm92aWRlciwgcGRhdGEpOworCisJaWYgKGZvcmNlX2NvbmZpZ19mZW5jZSkgeworCQloZXZjLT5lbmFibGVfZmVuY2UgPSB0cnVlOworCQloZXZjLT5mZW5jZV91c2FnZSA9IChmb3JjZV9jb25maWdfZmVuY2UgPj4gNCkgJiAweGY7CisJCWlmIChmb3JjZV9jb25maWdfZmVuY2UgJiAweDIpCisJCQloZXZjLT5lbmFibGVfZmVuY2UgPSBmYWxzZTsKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJImVuYWJsZSBmZW5jZTogJWQsIGZlbmNlIHVzYWdlOiAlZFxuIiwKKwkJCWhldmMtPmVuYWJsZV9mZW5jZSwgaGV2Yy0+ZmVuY2VfdXNhZ2UpOworCX0KKworCWlmIChoZXZjLT5zYXZlX2J1ZmZlcl9tb2RlICYmIGR5bmFtaWNfYnVmX251bV9tYXJnaW4gPiAyKQorCQloZXZjLT5keW5hbWljX2J1Zl9udW1fbWFyZ2luID0gZHluYW1pY19idWZfbnVtX21hcmdpbiAtMjsKKwllbHNlCisJCWhldmMtPmR5bmFtaWNfYnVmX251bV9tYXJnaW4gPSBkeW5hbWljX2J1Zl9udW1fbWFyZ2luOworCisJaGV2Yy0+bWVtX21hcF9tb2RlID0gbWVtX21hcF9tb2RlOworCisJaGV2Yy0+ZW5kaWFuID0gSEVWQ19DT05GSUdfTElUVExFX0VORElBTjsKKwlpZiAoaXNfc3VwcG9ydF92ZGVjX2NhbnZhcygpKQorCQloZXZjLT5lbmRpYW4gPSBIRVZDX0NPTkZJR19CSUdfRU5ESUFOOworCWlmIChlbmRpYW4pCisJCWhldmMtPmVuZGlhbiA9IGVuZGlhbjsKKworCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNSkgJiYKKwkJCShoZXZjLT5kb3VibGVfd3JpdGVfbW9kZSA9PSAzKSkKKwkJaGV2Yy0+ZG91YmxlX3dyaXRlX21vZGUgPSAweDEwMDA7CisKKwkvKiBnZXQgdmFsaWQgZG91YmxlIHdyaXRlIGZyb20gbm9kZSAqLworCWlmIChkb3VibGVfd3JpdGVfbW9kZSkKKwkJaGV2Yy0+ZG91YmxlX3dyaXRlX21vZGUgPSBnZXRfZG91YmxlX3dyaXRlX21vZGUoaGV2Yyk7CisKKwlpZiAobW11X2VuYWJsZV9mb3JjZSkgeworCQloZXZjLT5tbXVfZW5hYmxlID0gMTsKKwl9IGVsc2UgeworCQlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA8IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWEwpIHx8CisJCQkoaGV2Yy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDEwKSkKKwkJCWhldmMtPm1tdV9lbmFibGUgPSAwOworCQllbHNlCisJCQloZXZjLT5tbXVfZW5hYmxlID0gMTsKKwl9CisjaWZkZWYgSDI2NV8xMEJfTU1VX0RXCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDVEKSB7CisJCWhldmMtPmR3X21tdV9lbmFibGUgPQorCQkJZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGhldmMpICYgMHgyMCA/IDEgOiAwOworCX0gZWxzZSB7CisJCWhldmMtPmR3X21tdV9lbmFibGUgPSAwOworCX0KKyNlbmRpZgorCWlmIChpbml0X21tdV9idWZmZXJzKGhldmMsIDApIDwgMCkgeworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiXG4gMjY1IG1tdSBpbml0IGZhaWxlZCFcbiIpOworCQltdXRleF91bmxvY2soJnZoMjY1X211dGV4KTsKKwkJLyogZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCAodm9pZCAqKWhldmMpOyovCisJCWlmIChoZXZjKQorCQkJdmZyZWUoKHZvaWQgKiloZXZjKTsKKwkJcGRhdGEtPmRlY19zdGF0dXMgPSBOVUxMOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisjaWYgMAorCWhldmMtPmJ1Zl9zdGFydCA9IHBkYXRhLT5tZW1fc3RhcnQ7CisJaGV2Yy0+YnVmX3NpemUgPSBwZGF0YS0+bWVtX2VuZCAtIHBkYXRhLT5tZW1fc3RhcnQgKyAxOworI2Vsc2UKKworCXJldCA9IGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeShoZXZjLT5ibW11X2JveCwKKwkJCUJNTVVfV09SS1NQQUNFX0lELCB3b3JrX2J1Zl9zaXplLAorCQkJRFJJVkVSX05BTUUsICZoZXZjLT5idWZfc3RhcnQpOworCWlmIChyZXQgPCAwKSB7CisJCXVuaW5pdF9tbXVfYnVmZmVycyhoZXZjKTsKKwkJLyogZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCAodm9pZCAqKWhldmMpOyAqLworCQlpZiAoaGV2YykKKwkJCXZmcmVlKCh2b2lkICopaGV2Yyk7CisJCXBkYXRhLT5kZWNfc3RhdHVzID0gTlVMTDsKKwkJbXV0ZXhfdW5sb2NrKCZ2aDI2NV9tdXRleCk7CisJCXJldHVybiByZXQ7CisJfQorCWhldmMtPmJ1Zl9zaXplID0gd29ya19idWZfc2l6ZTsKKyNlbmRpZgorCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWFRWQkIpICYmCisJCShwYXJzZXJfc2VpX2VuYWJsZSAmIDB4MTAwKSA9PSAwKQorCQlwYXJzZXJfc2VpX2VuYWJsZSA9IDc7CisJaGV2Yy0+aW5pdF9mbGFnID0gMDsKKwloZXZjLT5maXJzdF9zY19jaGVja2VkID0gMDsKKwloZXZjLT51bmluaXRfbGlzdCA9IDA7CisJaGV2Yy0+ZmF0YWxfZXJyb3IgPSAwOworCWhldmMtPnNob3dfZnJhbWVfbnVtID0gMDsKKworCS8qCisJICpoZXZjLT5tY19idWZfc3BlYy5idWZfZW5kID0gcGRhdGEtPm1lbV9lbmQgKyAxOworCSAqZm9yIChpID0gMDsgaSA8IFdPUktfQlVGX1NQRUNfTlVNOyBpKyspCisJICoJYW12aDI2NV93b3JrYnVmZl9zcGVjW2ldLnN0YXJ0X2FkciA9IHBkYXRhLT5tZW1fc3RhcnQ7CisJICovCisJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSkgeworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiPT09SC4yNjUgZGVjb2RlciBtZW0gcmVzb3VyY2UgMHglbHggc2l6ZSAweCV4XG4iLAorCQkJICAgaGV2Yy0+YnVmX3N0YXJ0LCBoZXZjLT5idWZfc2l6ZSk7CisJfQorCisJaGV2Y19wcmludChoZXZjLCAwLAorCQkiZHluYW1pY19idWZfbnVtX21hcmdpbj0lZFxuIiwKKwkJaGV2Yy0+ZHluYW1pY19idWZfbnVtX21hcmdpbik7CisJaGV2Y19wcmludChoZXZjLCAwLAorCQkiZG91YmxlX3dyaXRlX21vZGU9JWRcbiIsCisJCWhldmMtPmRvdWJsZV93cml0ZV9tb2RlKTsKKworCWhldmMtPmNtYV9kZXYgPSBwZGF0YS0+Y21hX2RldjsKKwl2aDI2NV92ZGVjX2luZm9faW5pdChoZXZjKTsKKworCWlmICh2aDI2NV9pbml0KHBkYXRhKSA8IDApIHsKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJIlxuYW12ZGVjX2gyNjUgaW5pdCBmYWlsZWQuXG4iKTsKKwkJaGV2Y19sb2NhbF91bmluaXQoaGV2Yyk7CisJCWlmIChoZXZjLT5ndnMpCisJCQlrZnJlZShoZXZjLT5ndnMpOworCQloZXZjLT5ndnMgPSBOVUxMOworCQl1bmluaXRfbW11X2J1ZmZlcnMoaGV2Yyk7CisJCS8qIGRldm1fa2ZyZWUoJnBkZXYtPmRldiwgKHZvaWQgKiloZXZjKTsgKi8KKwkJaWYgKGhldmMpCisJCQl2ZnJlZSgodm9pZCAqKWhldmMpOworCQlwZGF0YS0+ZGVjX3N0YXR1cyA9IE5VTEw7CisJCXJldHVybiAtRU5PREVWOworCX0KKworI2lmZGVmIEFVWF9EQVRBX0NSQworCXZkZWNfYXV4X2RhdGFfY2hlY2tfaW5pdChwZGF0YSk7CisjZW5kaWYKKworCXZkZWNfc2V0X3ByZXBhcmVfbGV2ZWwocGRhdGEsIHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwpOworCisJLypzZXQgdGhlIG1heCBjbGsgZm9yIHNtb290aCBwbGF5aW5nLi4uKi8KKwloZXZjX3NvdXJjZV9jaGFuZ2VkKFZGT1JNQVRfSEVWQywKKwkJCTM4NDAsIDIxNjAsIDYwKTsKKwlpZiAocGRhdGEtPnBhcmFsbGVsX2RlYyA9PSAxKQorCQl2ZGVjX2NvcmVfcmVxdWVzdChwZGF0YSwgQ09SRV9NQVNLX0hFVkMpOworCWVsc2UKKwkJdmRlY19jb3JlX3JlcXVlc3QocGRhdGEsIENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQworCQkJCQl8IENPUkVfTUFTS19DT01CSU5FKTsKKworCW11dGV4X2luaXQoJmhldmMtPmZlbmNlX211dGV4KTsKKwlpZiAoaGV2Yy0+ZW5hYmxlX2ZlbmNlKSB7CisJCXBkYXRhLT5zeW5jID0gdmRlY19zeW5jX2dldCgpOworCQlpZiAoIXBkYXRhLT5zeW5jKSB7CisJCQloZXZjX3ByaW50KGhldmMsIDAsICJhbGxvYyBmZW5jZSB0aW1lbGluZSBlcnJvclxuIik7CisJCQloZXZjX2xvY2FsX3VuaW5pdChoZXZjKTsKKwkJCWlmIChoZXZjLT5ndnMpCisJCQkJa2ZyZWUoaGV2Yy0+Z3ZzKTsKKwkJCWhldmMtPmd2cyA9IE5VTEw7CisJCQl1bmluaXRfbW11X2J1ZmZlcnMoaGV2Yyk7CisJCQkvKiBkZXZtX2tmcmVlKCZwZGV2LT5kZXYsICh2b2lkICopaGV2Yyk7ICovCisJCQlpZiAoaGV2YykKKwkJCQl2ZnJlZSgodm9pZCAqKWhldmMpOworCQkJcGRhdGEtPmRlY19zdGF0dXMgPSBOVUxMOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJcGRhdGEtPnN5bmMtPnVzYWdlID0gaGV2Yy0+ZmVuY2VfdXNhZ2U7CisJCS8qIGNyZWF0IHRpbWVsaW5lLiAqLworCQl2ZGVjX3RpbWVsaW5lX2NyZWF0ZShwZGF0YS0+c3luYywgRFJJVkVSX05BTUUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2ZGVjX2ZlbmNlX3JlbGVhc2Uoc3RydWN0IGhldmNfc3RhdGVfcyAqaHcsCisJCQkgICAgICAgc3RydWN0IHZkZWNfc3luYyAqc3luYykKK3sKKwl1bG9uZyBleHBpcmVzOworCisJLyogbm90aWZ5IHNpZ25hbCB0byB3YWtlIHVwIGFsbCBmZW5jZXMuICovCisJdmRlY190aW1lbGluZV9pbmNyZWFzZShzeW5jLCBWRl9QT09MX1NJWkUpOworCisJZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDIwMDApOworCXdoaWxlICghY2hlY2tfb2Jqc19hbGxfc2lnbmFsZWQoc3luYykpIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZXhwaXJlcykpIHsKKwkJCXByX2Vycigid2FpdCBmZW5jZSBzaWduYWxlZCB0aW1lb3V0LlxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIGRlY3JlYXNlcyByZWZjbnQgb2YgdGltZWxpbmUuICovCisJdmRlY190aW1lbGluZV9wdXQoc3luYyk7Cit9CisKK3N0YXRpYyBpbnQgYW1tdmRlY19oMjY1X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPQorCQkoc3RydWN0IGhldmNfc3RhdGVfcyAqKQorCQkoKChzdHJ1Y3QgdmRlY19zICopKHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpKSktPnByaXZhdGUpOworCXN0cnVjdCB2ZGVjX3MgKnZkZWM7CisKKwlpZiAoaGV2YyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwl2ZGVjID0gaHdfdG9fdmRlYyhoZXZjKTsKKworI2lmZGVmIEFVWF9EQVRBX0NSQworCXZkZWNfYXV4X2RhdGFfY2hlY2tfZXhpdCh2ZGVjKTsKKyNlbmRpZgorCisJLy9wcl9lcnIoIiVzIFtwaWQ9JWQsdGdpZD0lZF1cbiIsIF9fZnVuY19fLCBjdXJyZW50LT5waWQsIGN1cnJlbnQtPnRnaWQpOworCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykpCisJCWhldmNfcHJpbnQoaGV2YywgMCwgIiVzXHJcbiIsIF9fZnVuY19fKTsKKworCXZtaDI2NV9zdG9wKGhldmMpOworCisJLyogdmRlY19zb3VyY2VfY2hhbmdlZChWRk9STUFUX0gyNjQsIDAsIDAsIDApOyAqLworCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkKKwkJdmRlY19jb3JlX3JlbGVhc2UoaHdfdG9fdmRlYyhoZXZjKSwgQ09SRV9NQVNLX0hFVkMpOworCWVsc2UKKwkJdmRlY19jb3JlX3JlbGVhc2UoaHdfdG9fdmRlYyhoZXZjKSwgQ09SRV9NQVNLX0hFVkMpOworCisJdmRlY19zZXRfc3RhdHVzKGh3X3RvX3ZkZWMoaGV2YyksIFZERUNfU1RBVFVTX0RJU0NPTk5FQ1RFRCk7CisKKwlpZiAoaGV2Yy0+ZW5hYmxlX2ZlbmNlKQorCQl2ZGVjX2ZlbmNlX3JlbGVhc2UoaGV2YywgdmRlYy0+c3luYyk7CisJaWYgKGlzX3JkbWFfZW5hYmxlKCkpCisJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwgUkRNQV9TSVpFLCBoZXZjLT5yZG1hX2FkciwgaGV2Yy0+cmRtYV9waHlfYWRyKTsKKwl2ZnJlZSgodm9pZCAqKWhldmMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFtbXZkZWNfaDI2NV9kcml2ZXIgPSB7CisJLnByb2JlID0gYW1tdmRlY19oMjY1X3Byb2JlLAorCS5yZW1vdmUgPSBhbW12ZGVjX2gyNjVfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gTVVMVElfRFJJVkVSX05BTUUsCisjaWZkZWYgQ09ORklHX1BNCisJCS5wbSA9ICZoMjY1X3BtX29wcywKKyNlbmRpZgorCX0KK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBjb2RlY19wcm9maWxlX3QgYW12ZGVjX2gyNjVfcHJvZmlsZSA9IHsKKwkubmFtZSA9ICJoZXZjIiwKKwkucHJvZmlsZSA9ICIiCit9OworCitzdGF0aWMgc3RydWN0IGNvZGVjX3Byb2ZpbGVfdCBhbXZkZWNfaDI2NV9wcm9maWxlX3NpbmdsZSwKKwkJYW12ZGVjX2gyNjVfcHJvZmlsZV9tdWx0OworCitzdGF0aWMgc3RydWN0IG1jb25maWcgaDI2NV9jb25maWdzW10gPSB7CisJTUNfUFUzMigidXNlX2NtYSIsICZ1c2VfY21hKSwKKwlNQ19QVTMyKCJiaXRfZGVwdGhfbHVtYSIsICZiaXRfZGVwdGhfbHVtYSksCisJTUNfUFUzMigiYml0X2RlcHRoX2Nocm9tYSIsICZiaXRfZGVwdGhfY2hyb21hKSwKKwlNQ19QVTMyKCJ2aWRlb19zaWduYWxfdHlwZSIsICZ2aWRlb19zaWduYWxfdHlwZSksCisjaWZkZWYgRVJST1JfSEFORExFX0RFQlVHCisJTUNfUFUzMigiZGJnX25hbF9za2lwX2ZsYWciLCAmZGJnX25hbF9za2lwX2ZsYWcpLAorCU1DX1BVMzIoImRiZ19uYWxfc2tpcF9jb3VudCIsICZkYmdfbmFsX3NraXBfY291bnQpLAorI2VuZGlmCisJTUNfUFUzMigicmFkciIsICZyYWRyKSwKKwlNQ19QVTMyKCJydmFsIiwgJnJ2YWwpLAorCU1DX1BVMzIoImRiZ19jbWQiLCAmZGJnX2NtZCksCisJTUNfUFUzMigiZGJnX3NraXBfZGVjb2RlX2luZGV4IiwgJmRiZ19za2lwX2RlY29kZV9pbmRleCksCisJTUNfUFUzMigiZW5kaWFuIiwgJmVuZGlhbiksCisJTUNfUFUzMigic3RlcCIsICZzdGVwKSwKKwlNQ19QVTMyKCJ1ZGVidWdfZmxhZyIsICZ1ZGVidWdfZmxhZyksCisJTUNfUFUzMigiZGVjb2RlX3BpY19iZWdpbiIsICZkZWNvZGVfcGljX2JlZ2luKSwKKwlNQ19QVTMyKCJzbGljZV9wYXJzZV9iZWdpbiIsICZzbGljZV9wYXJzZV9iZWdpbiksCisJTUNfUFUzMigibmFsX3NraXBfcG9saWN5IiwgJm5hbF9za2lwX3BvbGljeSksCisJTUNfUFUzMigiaV9vbmx5X2ZsYWciLCAmaV9vbmx5X2ZsYWcpLAorCU1DX1BVMzIoImVycm9yX2hhbmRsZV9wb2xpY3kiLCAmZXJyb3JfaGFuZGxlX3BvbGljeSksCisJTUNfUFUzMigiZXJyb3JfaGFuZGxlX3RocmVzaG9sZCIsICZlcnJvcl9oYW5kbGVfdGhyZXNob2xkKSwKKwlNQ19QVTMyKCJlcnJvcl9oYW5kbGVfbmFsX3NraXBfdGhyZXNob2xkIiwKKwkJJmVycm9yX2hhbmRsZV9uYWxfc2tpcF90aHJlc2hvbGQpLAorCU1DX1BVMzIoImVycm9yX2hhbmRsZV9zeXN0ZW1fdGhyZXNob2xkIiwKKwkJJmVycm9yX2hhbmRsZV9zeXN0ZW1fdGhyZXNob2xkKSwKKwlNQ19QVTMyKCJlcnJvcl9za2lwX25hbF9jb3VudCIsICZlcnJvcl9za2lwX25hbF9jb3VudCksCisJTUNfUFUzMigiZGVidWciLCAmZGVidWcpLAorCU1DX1BVMzIoImRlYnVnX21hc2siLCAmZGVidWdfbWFzayksCisJTUNfUFUzMigiYnVmZmVyX21vZGUiLCAmYnVmZmVyX21vZGUpLAorCU1DX1BVMzIoImRvdWJsZV93cml0ZV9tb2RlIiwgJmRvdWJsZV93cml0ZV9tb2RlKSwKKwlNQ19QVTMyKCJidWZfYWxsb2Nfd2lkdGgiLCAmYnVmX2FsbG9jX3dpZHRoKSwKKwlNQ19QVTMyKCJidWZfYWxsb2NfaGVpZ2h0IiwgJmJ1Zl9hbGxvY19oZWlnaHQpLAorCU1DX1BVMzIoImR5bmFtaWNfYnVmX251bV9tYXJnaW4iLCAmZHluYW1pY19idWZfbnVtX21hcmdpbiksCisJTUNfUFUzMigibWF4X2J1Zl9udW0iLCAmbWF4X2J1Zl9udW0pLAorCU1DX1BVMzIoImJ1Zl9hbGxvY19zaXplIiwgJmJ1Zl9hbGxvY19zaXplKSwKKwlNQ19QVTMyKCJidWZmZXJfbW9kZV9kYmciLCAmYnVmZmVyX21vZGVfZGJnKSwKKwlNQ19QVTMyKCJtZW1fbWFwX21vZGUiLCAmbWVtX21hcF9tb2RlKSwKKwlNQ19QVTMyKCJlbmFibGVfbWVtX3NhdmluZyIsICZlbmFibGVfbWVtX3NhdmluZyksCisJTUNfUFUzMigiZm9yY2Vfd19oIiwgJmZvcmNlX3dfaCksCisJTUNfUFUzMigiZm9yY2VfZnBzIiwgJmZvcmNlX2ZwcyksCisJTUNfUFUzMigibWF4X2RlY29kaW5nX3RpbWUiLCAmbWF4X2RlY29kaW5nX3RpbWUpLAorCU1DX1BVMzIoInByZWZpeF9hdXhfYnVmX3NpemUiLCAmcHJlZml4X2F1eF9idWZfc2l6ZSksCisJTUNfUFUzMigic3VmZml4X2F1eF9idWZfc2l6ZSIsICZzdWZmaXhfYXV4X2J1Zl9zaXplKSwKKwlNQ19QVTMyKCJpbnRlcmxhY2VfZW5hYmxlIiwgJmludGVybGFjZV9lbmFibGUpLAorCU1DX1BVMzIoInB0c191bnN0YWJsZSIsICZwdHNfdW5zdGFibGUpLAorCU1DX1BVMzIoInBhcnNlcl9zZWlfZW5hYmxlIiwgJnBhcnNlcl9zZWlfZW5hYmxlKSwKKwlNQ19QVTMyKCJzdGFydF9kZWNvZGVfYnVmX2xldmVsIiwgJnN0YXJ0X2RlY29kZV9idWZfbGV2ZWwpLAorCU1DX1BVMzIoImRlY29kZV90aW1lb3V0X3ZhbCIsICZkZWNvZGVfdGltZW91dF92YWwpLAorCU1DX1BVMzIoInBhcnNlcl9kb2xieV92aXNpb25fZW5hYmxlIiwgJnBhcnNlcl9kb2xieV92aXNpb25fZW5hYmxlKSwKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCU1DX1BVMzIoImR2X3RvZ2dsZV9wcm92X25hbWUiLCAmZHZfdG9nZ2xlX3Byb3ZfbmFtZSksCisJTUNfUFUzMigiZHZfZGVidWciLCAmZHZfZGVidWcpLAorI2VuZGlmCit9Oworc3RhdGljIHN0cnVjdCBtY29uZmlnX25vZGUgZGVjb2Rlcl8yNjVfbm9kZTsKKworc3RhdGljIGludCBfX2luaXQgYW12ZGVjX2gyNjVfZHJpdmVyX2luaXRfbW9kdWxlKHZvaWQpCit7CisJc3RydWN0IEJ1ZmZJbmZvX3MgKnBfYnVmX2luZm87CisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDw9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UTTIgJiYgIWlzX2NwdV90bTJfcmV2YigpKSB7CisJCWlmICh2ZGVjX2lzX3N1cHBvcnRfNGsoKSkgeworCQkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKQorCQkJCXBfYnVmX2luZm8gPSAmYW12aDI2NV93b3JrYnVmZl9zcGVjWzJdOworCQkJZWxzZQorCQkJCXBfYnVmX2luZm8gPSAmYW12aDI2NV93b3JrYnVmZl9zcGVjWzFdOworCQl9IGVsc2UKKwkJCXBfYnVmX2luZm8gPSAmYW12aDI2NV93b3JrYnVmZl9zcGVjWzBdOworCX0gZWxzZSB7IC8vZ2V0X2NwdV9tYWpvcl9pZCgpID4gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RNMiB8fCBpc19jcHVfdG0yX3JldmIoKQorCQlpZiAodmRlY19pc19zdXBwb3J0XzRrKCkpCisJCQlwX2J1Zl9pbmZvID0gJmFtdmgyNjVfd29ya2J1ZmZfc3BlY1s1XTsKKwkJZWxzZQorCQkJcF9idWZfaW5mbyA9ICZhbXZoMjY1X3dvcmtidWZmX3NwZWNbM107CisJfQorCisJaW5pdF9idWZmX3NwZWMoTlVMTCwgcF9idWZfaW5mbyk7CisJd29ya19idWZfc2l6ZSA9CisJCShwX2J1Zl9pbmZvLT5lbmRfYWRyIC0gcF9idWZfaW5mby0+c3RhcnRfYWRyCisJCSArIDB4ZmZmZikgJiAofjB4ZmZmZik7CisKKwlwcl9kZWJ1ZygiYW12ZGVjX2gyNjUgbW9kdWxlIGluaXRcbiIpOworCWVycm9yX2hhbmRsZV9wb2xpY3kgPSAwOworCisjaWZkZWYgRVJST1JfSEFORExFX0RFQlVHCisJZGJnX25hbF9za2lwX2ZsYWcgPSAwOworCWRiZ19uYWxfc2tpcF9jb3VudCA9IDA7CisjZW5kaWYKKwl1ZGVidWdfZmxhZyA9IDA7CisJZGVjb2RlX3BpY19iZWdpbiA9IDA7CisJc2xpY2VfcGFyc2VfYmVnaW4gPSAwOworCXN0ZXAgPSAwOworCWJ1Zl9hbGxvY19zaXplID0gMDsKKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlpZiAocGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhbW12ZGVjX2gyNjVfZHJpdmVyKSkKKwkJcHJfZXJyKCJmYWlsZWQgdG8gcmVnaXN0ZXIgYW1tdmRlY19oMjY1IGRyaXZlclxuIik7CisKKyNlbmRpZgorCWlmIChwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFtdmRlY19oMjY1X2RyaXZlcikpIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gcmVnaXN0ZXIgYW12ZGVjX2gyNjUgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorI2lmIDEvKk1FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09OOCovCisJaWYgKCFoYXNfaGV2Y192ZGVjKCkpIHsKKwkJLyogbm90IHN1cHBvcnQgaGV2YyAqLworCQlhbXZkZWNfaDI2NV9wcm9maWxlLm5hbWUgPSAiaGV2Y191bnN1cHBvcnQiOworCX0KKwlpZiAodmRlY19pc19zdXBwb3J0XzRrKCkpIHsKKwkJaWYgKGlzX21lc29uX204bTJfY3B1KCkpIHsKKwkJCS8qIG04bTIgc3VwcG9ydCA0ayAqLworCQkJYW12ZGVjX2gyNjVfcHJvZmlsZS5wcm9maWxlID0gIjRrIjsKKwkJfSBlbHNlIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkgeworCQkJYW12ZGVjX2gyNjVfcHJvZmlsZS5wcm9maWxlID0KKwkJCQkiOGssIDhiaXQsIDEwYml0LCBkd3JpdGUsIGNvbXByZXNzZWQsIGZyYW1lX2R2LCBmZW5jZSwgdjRsLXV2bSI7CisJCX1lbHNlIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYQkIpIHsKKwkJCWFtdmRlY19oMjY1X3Byb2ZpbGUucHJvZmlsZSA9CisJCQkJIjRrLCA4Yml0LCAxMGJpdCwgZHdyaXRlLCBjb21wcmVzc2VkLCBmcmFtZV9kdiwgZmVuY2UsIHY0bC11dm0iOworCQl9IGVsc2UgaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfTUc5VFYpCisJCQlhbXZkZWNfaDI2NV9wcm9maWxlLnByb2ZpbGUgPSAiNGsiOworCX0gZWxzZSB7CisJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1RCB8fCBpc19jcHVfczRfczgwNXgyKCkpIHsKKwkJCQlhbXZkZWNfaDI2NV9wcm9maWxlLnByb2ZpbGUgPQorCQkJCQkiOGJpdCwgMTBiaXQsIGR3cml0ZSwgY29tcHJlc3NlZCwgZnJhbWVfZHYsIHY0bCI7CisJCX0gZWxzZSB7CisJCQkJYW12ZGVjX2gyNjVfcHJvZmlsZS5wcm9maWxlID0KKwkJCQkJIjhiaXQsIDEwYml0LCBkd3JpdGUsIGNvbXByZXNzZWQsIHY0bCI7CisJCX0KKwl9CisjZW5kaWYKKwlpZiAoY29kZWNfbW1fZ2V0X3RvdGFsX3NpemUoKSA8IDgwICogU1pfMU0pIHsKKwkJcHJfaW5mbygiYW12ZGVjX2gyNjUgZGVmYXVsdCBtbXUgZW5hYmxlZC5cbiIpOworCQltbXVfZW5hYmxlID0gMTsKKwl9CisJdmNvZGVjX3Byb2ZpbGVfcmVnaXN0ZXIoJmFtdmRlY19oMjY1X3Byb2ZpbGUpOworCWFtdmRlY19oMjY1X3Byb2ZpbGVfc2luZ2xlID0gYW12ZGVjX2gyNjVfcHJvZmlsZTsKKwlhbXZkZWNfaDI2NV9wcm9maWxlX3NpbmdsZS5uYW1lID0gImgyNjUiOworCXZjb2RlY19wcm9maWxlX3JlZ2lzdGVyKCZhbXZkZWNfaDI2NV9wcm9maWxlX3NpbmdsZSk7CisJYW12ZGVjX2gyNjVfcHJvZmlsZV9tdWx0ID0gYW12ZGVjX2gyNjVfcHJvZmlsZTsKKwlhbXZkZWNfaDI2NV9wcm9maWxlX211bHQubmFtZSA9ICJtaDI2NSI7CisJdmNvZGVjX3Byb2ZpbGVfcmVnaXN0ZXIoJmFtdmRlY19oMjY1X3Byb2ZpbGVfbXVsdCk7CisJSU5JVF9SRUdfTk9ERV9DT05GSUdTKCJtZWRpYS5kZWNvZGVyIiwgJmRlY29kZXJfMjY1X25vZGUsCisJCSJoMjY1IiwgaDI2NV9jb25maWdzLCBDT05GSUdfRk9SX1JXKTsKKwl2Y29kZWNfZmVhdHVyZV9yZWdpc3RlcihWRk9STUFUX0hFVkMsIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYW12ZGVjX2gyNjVfZHJpdmVyX3JlbW92ZV9tb2R1bGUodm9pZCkKK3sKKwlwcl9kZWJ1ZygiYW12ZGVjX2gyNjUgbW9kdWxlIHJlbW92ZS5cbiIpOworCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhbW12ZGVjX2gyNjVfZHJpdmVyKTsKKyNlbmRpZgorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhbXZkZWNfaDI2NV9kcml2ZXIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKm1vZHVsZV9wYXJhbShzdGF0LCB1aW50LCAwNjY0KTsKKyAqTU9EVUxFX1BBUk1fREVTQyhzdGF0LCAiXG4gYW12ZGVjX2gyNjUgc3RhdFxuIik7CisgKi8KK21vZHVsZV9wYXJhbSh1c2VfY21hLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModXNlX2NtYSwgIlxuIGFtdmRlY19oMjY1IHVzZV9jbWFcbiIpOworCittb2R1bGVfcGFyYW0oYml0X2RlcHRoX2x1bWEsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhiaXRfZGVwdGhfbHVtYSwgIlxuIGFtdmRlY19oMjY1IGJpdF9kZXB0aF9sdW1hXG4iKTsKKworbW9kdWxlX3BhcmFtKGJpdF9kZXB0aF9jaHJvbWEsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhiaXRfZGVwdGhfY2hyb21hLCAiXG4gYW12ZGVjX2gyNjUgYml0X2RlcHRoX2Nocm9tYVxuIik7CisKK21vZHVsZV9wYXJhbSh2aWRlb19zaWduYWxfdHlwZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHZpZGVvX3NpZ25hbF90eXBlLCAiXG4gYW12ZGVjX2gyNjUgdmlkZW9fc2lnbmFsX3R5cGVcbiIpOworCisjaWZkZWYgRVJST1JfSEFORExFX0RFQlVHCittb2R1bGVfcGFyYW0oZGJnX25hbF9za2lwX2ZsYWcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkYmdfbmFsX3NraXBfZmxhZywgIlxuIGFtdmRlY19oMjY1IGRiZ19uYWxfc2tpcF9mbGFnXG4iKTsKKworbW9kdWxlX3BhcmFtKGRiZ19uYWxfc2tpcF9jb3VudCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRiZ19uYWxfc2tpcF9jb3VudCwgIlxuIGFtdmRlY19oMjY1IGRiZ19uYWxfc2tpcF9jb3VudFxuIik7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKHJhZHIsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhyYWRyLCAiXG4gcmFkclxuIik7CisKK21vZHVsZV9wYXJhbShydmFsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocnZhbCwgIlxuIHJ2YWxcbiIpOworCittb2R1bGVfcGFyYW0oZGJnX2NtZCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRiZ19jbWQsICJcbiBkYmdfY21kXG4iKTsKKworbW9kdWxlX3BhcmFtKGR1bXBfbmFsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZHVtcF9uYWwsICJcbiBkdW1wX25hbFxuIik7CisKK21vZHVsZV9wYXJhbShkYmdfc2tpcF9kZWNvZGVfaW5kZXgsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkYmdfc2tpcF9kZWNvZGVfaW5kZXgsICJcbiBkYmdfc2tpcF9kZWNvZGVfaW5kZXhcbiIpOworCittb2R1bGVfcGFyYW0oZW5kaWFuLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5kaWFuLCAiXG4gcnZhbFxuIik7CisKK21vZHVsZV9wYXJhbShzdGVwLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3RlcCwgIlxuIGFtdmRlY19oMjY1IHN0ZXBcbiIpOworCittb2R1bGVfcGFyYW0oZGVjb2RlX3BpY19iZWdpbiwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlY29kZV9waWNfYmVnaW4sICJcbiBhbXZkZWNfaDI2NSBkZWNvZGVfcGljX2JlZ2luXG4iKTsKKworbW9kdWxlX3BhcmFtKHNsaWNlX3BhcnNlX2JlZ2luLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Moc2xpY2VfcGFyc2VfYmVnaW4sICJcbiBhbXZkZWNfaDI2NSBzbGljZV9wYXJzZV9iZWdpblxuIik7CisKK21vZHVsZV9wYXJhbShuYWxfc2tpcF9wb2xpY3ksIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhuYWxfc2tpcF9wb2xpY3ksICJcbiBhbXZkZWNfaDI2NSBuYWxfc2tpcF9wb2xpY3lcbiIpOworCittb2R1bGVfcGFyYW0oaV9vbmx5X2ZsYWcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhpX29ubHlfZmxhZywgIlxuIGFtdmRlY19oMjY1IGlfb25seV9mbGFnXG4iKTsKKworbW9kdWxlX3BhcmFtKGZhc3Rfb3V0cHV0X2VuYWJsZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZhc3Rfb3V0cHV0X2VuYWJsZSwgIlxuIGFtdmRlY19oMjY1IGZhc3Rfb3V0cHV0X2VuYWJsZVxuIik7CisKK21vZHVsZV9wYXJhbShlcnJvcl9oYW5kbGVfcG9saWN5LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZXJyb3JfaGFuZGxlX3BvbGljeSwgIlxuIGFtdmRlY19oMjY1IGVycm9yX2hhbmRsZV9wb2xpY3lcbiIpOworCittb2R1bGVfcGFyYW0oZXJyb3JfaGFuZGxlX3RocmVzaG9sZCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVycm9yX2hhbmRsZV90aHJlc2hvbGQsCisJCSJcbiBhbXZkZWNfaDI2NSBlcnJvcl9oYW5kbGVfdGhyZXNob2xkXG4iKTsKKworbW9kdWxlX3BhcmFtKGVycm9yX2hhbmRsZV9uYWxfc2tpcF90aHJlc2hvbGQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhlcnJvcl9oYW5kbGVfbmFsX3NraXBfdGhyZXNob2xkLAorCQkiXG4gYW12ZGVjX2gyNjUgZXJyb3JfaGFuZGxlX25hbF9za2lwX3RocmVzaG9sZFxuIik7CisKK21vZHVsZV9wYXJhbShlcnJvcl9oYW5kbGVfc3lzdGVtX3RocmVzaG9sZCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVycm9yX2hhbmRsZV9zeXN0ZW1fdGhyZXNob2xkLAorCQkiXG4gYW12ZGVjX2gyNjUgZXJyb3JfaGFuZGxlX3N5c3RlbV90aHJlc2hvbGRcbiIpOworCittb2R1bGVfcGFyYW0oZXJyb3Jfc2tpcF9uYWxfY291bnQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhlcnJvcl9za2lwX25hbF9jb3VudCwKKwkJCQkgIlxuIGFtdmRlY19oMjY1IGVycm9yX3NraXBfbmFsX2NvdW50XG4iKTsKKworbW9kdWxlX3BhcmFtKHNraXBfbmFsX2NvdW50LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Moc2tpcF9uYWxfY291bnQsICJcbiBza2lwX25hbF9jb3VudFxuIik7CisKK21vZHVsZV9wYXJhbShkZWJ1ZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiXG4gYW12ZGVjX2gyNjUgZGVidWdcbiIpOworCittb2R1bGVfcGFyYW0oZGVidWdfbWFzaywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnX21hc2ssICJcbiBhbXZkZWNfaDI2NSBkZWJ1ZyBtYXNrXG4iKTsKKworbW9kdWxlX3BhcmFtKGxvZ19tYXNrLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobG9nX21hc2ssICJcbiBhbXZkZWNfaDI2NSBsb2dfbWFza1xuIik7CisKK21vZHVsZV9wYXJhbShidWZmZXJfbW9kZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGJ1ZmZlcl9tb2RlLCAiXG4gYnVmZmVyX21vZGVcbiIpOworCittb2R1bGVfcGFyYW0oZG91YmxlX3dyaXRlX21vZGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkb3VibGVfd3JpdGVfbW9kZSwgIlxuIGRvdWJsZV93cml0ZV9tb2RlXG4iKTsKKworbW9kdWxlX3BhcmFtKGJ1Zl9hbGxvY193aWR0aCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGJ1Zl9hbGxvY193aWR0aCwgIlxuIGJ1Zl9hbGxvY193aWR0aFxuIik7CisKK21vZHVsZV9wYXJhbShidWZfYWxsb2NfaGVpZ2h0LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoYnVmX2FsbG9jX2hlaWdodCwgIlxuIGJ1Zl9hbGxvY19oZWlnaHRcbiIpOworCittb2R1bGVfcGFyYW0oZHluYW1pY19idWZfbnVtX21hcmdpbiwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGR5bmFtaWNfYnVmX251bV9tYXJnaW4sICJcbiBkeW5hbWljX2J1Zl9udW1fbWFyZ2luXG4iKTsKKworbW9kdWxlX3BhcmFtKG1heF9idWZfbnVtLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2J1Zl9udW0sICJcbiBtYXhfYnVmX251bVxuIik7CisKK21vZHVsZV9wYXJhbShidWZfYWxsb2Nfc2l6ZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGJ1Zl9hbGxvY19zaXplLCAiXG4gYnVmX2FsbG9jX3NpemVcbiIpOworCisjaWZkZWYgQ09OU1RSQUlOX01BWF9CVUZfTlVNCittb2R1bGVfcGFyYW0ocnVuX3JlYWR5X21heF92Zl9vbmx5X251bSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJ1bl9yZWFkeV9tYXhfdmZfb25seV9udW0sICJcbiBydW5fcmVhZHlfbWF4X3ZmX29ubHlfbnVtXG4iKTsKKworbW9kdWxlX3BhcmFtKHJ1bl9yZWFkeV9kaXNwbGF5X3FfbnVtLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocnVuX3JlYWR5X2Rpc3BsYXlfcV9udW0sICJcbiBydW5fcmVhZHlfZGlzcGxheV9xX251bVxuIik7CisKK21vZHVsZV9wYXJhbShydW5fcmVhZHlfbWF4X2J1Zl9udW0sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhydW5fcmVhZHlfbWF4X2J1Zl9udW0sICJcbiBydW5fcmVhZHlfbWF4X2J1Zl9udW1cbiIpOworI2VuZGlmCisKKyNpZiAwCittb2R1bGVfcGFyYW0ocmVfY29uZmlnX3BpY19mbGFnLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocmVfY29uZmlnX3BpY19mbGFnLCAiXG4gcmVfY29uZmlnX3BpY19mbGFnXG4iKTsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0oYnVmZmVyX21vZGVfZGJnLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoYnVmZmVyX21vZGVfZGJnLCAiXG4gYnVmZmVyX21vZGVfZGJnXG4iKTsKKworbW9kdWxlX3BhcmFtKG1lbV9tYXBfbW9kZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG1lbV9tYXBfbW9kZSwgIlxuIG1lbV9tYXBfbW9kZVxuIik7CisKK21vZHVsZV9wYXJhbShlbmFibGVfbWVtX3NhdmluZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZV9tZW1fc2F2aW5nLCAiXG4gZW5hYmxlX21lbV9zYXZpbmdcbiIpOworCittb2R1bGVfcGFyYW0oZm9yY2Vfd19oLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2Vfd19oLCAiXG4gZm9yY2Vfd19oXG4iKTsKKworbW9kdWxlX3BhcmFtKGZvcmNlX2ZwcywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2ZwcywgIlxuIGZvcmNlX2Zwc1xuIik7CisKK21vZHVsZV9wYXJhbShtYXhfZGVjb2RpbmdfdGltZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9kZWNvZGluZ190aW1lLCAiXG4gbWF4X2RlY29kaW5nX3RpbWVcbiIpOworCittb2R1bGVfcGFyYW0ocHJlZml4X2F1eF9idWZfc2l6ZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHByZWZpeF9hdXhfYnVmX3NpemUsICJcbiBwcmVmaXhfYXV4X2J1Zl9zaXplXG4iKTsKKworbW9kdWxlX3BhcmFtKHN1ZmZpeF9hdXhfYnVmX3NpemUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhzdWZmaXhfYXV4X2J1Zl9zaXplLCAiXG4gc3VmZml4X2F1eF9idWZfc2l6ZVxuIik7CisKK21vZHVsZV9wYXJhbShpbnRlcmxhY2VfZW5hYmxlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoaW50ZXJsYWNlX2VuYWJsZSwgIlxuIGludGVybGFjZV9lbmFibGVcbiIpOworbW9kdWxlX3BhcmFtKHB0c191bnN0YWJsZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHB0c191bnN0YWJsZSwgIlxuIGFtdmRlY19oMjY1IHB0c191bnN0YWJsZVxuIik7Cittb2R1bGVfcGFyYW0ocGFyc2VyX3NlaV9lbmFibGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhwYXJzZXJfc2VpX2VuYWJsZSwgIlxuIHBhcnNlcl9zZWlfZW5hYmxlXG4iKTsKKworbW9kdWxlX3BhcmFtKHBhcnNlcl9kb2xieV92aXNpb25fZW5hYmxlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocGFyc2VyX2RvbGJ5X3Zpc2lvbl9lbmFibGUsCisJIlxuIHBhcnNlcl9kb2xieV92aXNpb25fZW5hYmxlXG4iKTsKKworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCittb2R1bGVfcGFyYW0oZG9sYnlfbWV0YV93aXRoX2VsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZG9sYnlfbWV0YV93aXRoX2VsLAorCSJcbiBkb2xieV9tZXRhX3dpdGhfZWxcbiIpOworCittb2R1bGVfcGFyYW0oZG9sYnlfZWxfZmx1c2hfdGgsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkb2xieV9lbF9mbHVzaF90aCwKKwkiXG4gZG9sYnlfZWxfZmx1c2hfdGhcbiIpOworI2VuZGlmCittb2R1bGVfcGFyYW0obW11X2VuYWJsZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG1tdV9lbmFibGUsICJcbiBtbXVfZW5hYmxlXG4iKTsKKworbW9kdWxlX3BhcmFtKG1tdV9lbmFibGVfZm9yY2UsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhtbXVfZW5hYmxlX2ZvcmNlLCAiXG4gbW11X2VuYWJsZV9mb3JjZVxuIik7CisKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCittb2R1bGVfcGFyYW0oc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCwgaW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCwKKwkJIlxuIGgyNjUgc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbFxuIik7CisKK21vZHVsZV9wYXJhbShkZWNvZGVfdGltZW91dF92YWwsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkZWNvZGVfdGltZW91dF92YWwsCisJIlxuIGgyNjUgZGVjb2RlX3RpbWVvdXRfdmFsXG4iKTsKKworbW9kdWxlX3BhcmFtKHByaW50X2xjdV9lcnJvciwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHByaW50X2xjdV9lcnJvciwKKwkiXG4gaDI2NSBwcmludF9sY3VfZXJyb3JcbiIpOworCittb2R1bGVfcGFyYW0oZGF0YV9yZXNlbmRfcG9saWN5LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGF0YV9yZXNlbmRfcG9saWN5LAorCSJcbiBoMjY1IGRhdGFfcmVzZW5kX3BvbGljeVxuIik7CisKK21vZHVsZV9wYXJhbShwb2NfbnVtX21hcmdpbiwgaW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocG9jX251bV9tYXJnaW4sCisJIlxuIGgyNjUgcG9jX251bV9tYXJnaW5cbiIpOworCittb2R1bGVfcGFyYW0ocG9jX2Vycm9yX2xpbWl0LCBpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhwb2NfZXJyb3JfbGltaXQsCisJIlxuIGgyNjUgcG9jX2Vycm9yX2xpbWl0XG4iKTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGRlY29kZV9mcmFtZV9jb3VudCwgdWludCwKKwkmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCittb2R1bGVfcGFyYW1fYXJyYXkoZGlzcGxheV9mcmFtZV9jb3VudCwgdWludCwKKwkmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCittb2R1bGVfcGFyYW1fYXJyYXkobWF4X3Byb2Nlc3NfdGltZSwgdWludCwKKwkmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCittb2R1bGVfcGFyYW1fYXJyYXkobWF4X2dldF9mcmFtZV9pbnRlcnZhbCwKKwl1aW50LCAmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCittb2R1bGVfcGFyYW1fYXJyYXkocnVuX2NvdW50LCB1aW50LAorCSZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisKK21vZHVsZV9wYXJhbV9hcnJheShpbnB1dF9lbXB0eSwgdWludCwKKwkmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCittb2R1bGVfcGFyYW1fYXJyYXkobm90X3J1bl9yZWFkeSwgdWludCwKKwkmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCittb2R1bGVfcGFyYW1fYXJyYXkocmVmX2ZyYW1lX21hcmtfZmxhZywgdWludCwKKwkmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorbW9kdWxlX3BhcmFtKGR2X3RvZ2dsZV9wcm92X25hbWUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkdl90b2dnbGVfcHJvdl9uYW1lLCAiXG4gZHZfdG9nZ2xlX3Byb3ZfbmFtZVxuIik7CisKK21vZHVsZV9wYXJhbShkdl9kZWJ1ZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGR2X2RlYnVnLCAiXG4gZHZfZGVidWdcbiIpOworCittb2R1bGVfcGFyYW0oZm9yY2VfYnlwYXNzX2R2ZW5sLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2VfYnlwYXNzX2R2ZW5sLCAiXG4gZm9yY2VfYnlwYXNzX2R2ZW5sXG4iKTsKKyNlbmRpZgorCisjaWZkZWYgQUdBSU5fSEFTX1RIUkVTSE9MRAorbW9kdWxlX3BhcmFtKGFnYWluX3RocmVzaG9sZCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGFnYWluX3RocmVzaG9sZCwgIlxuIGFnYWluX3RocmVzaG9sZFxuIik7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKGZvcmNlX2Rpc3BfcGljX2luZGV4LCBpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9kaXNwX3BpY19pbmRleCwKKwkiXG4gYW12ZGVjX2gyNjUgZm9yY2VfZGlzcF9waWNfaW5kZXhcbiIpOworCittb2R1bGVfcGFyYW0oZnJtYmFzZV9jb250X2JpdGxldmVsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZnJtYmFzZV9jb250X2JpdGxldmVsLAkiXG4gZnJtYmFzZV9jb250X2JpdGxldmVsXG4iKTsKKworbW9kdWxlX3BhcmFtKGZvcmNlX2J1ZnNwZWMsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9idWZzcGVjLCAiXG4gYW12ZGVjX2gyNjUgZm9yY2VfYnVmc3BlY1xuIik7CisKK21vZHVsZV9wYXJhbSh1ZGVidWdfZmxhZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHVkZWJ1Z19mbGFnLCAiXG4gYW12ZGVjX2gyNjUgdWRlYnVnX2ZsYWdcbiIpOworCittb2R1bGVfcGFyYW0odWRlYnVnX3BhdXNlX3BvcywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHVkZWJ1Z19wYXVzZV9wb3MsICJcbiB1ZGVidWdfcGF1c2VfcG9zXG4iKTsKKworbW9kdWxlX3BhcmFtKHVkZWJ1Z19wYXVzZV92YWwsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh1ZGVidWdfcGF1c2VfdmFsLCAiXG4gdWRlYnVnX3BhdXNlX3ZhbFxuIik7CisKK21vZHVsZV9wYXJhbShwcmVfZGVjb2RlX2J1Zl9sZXZlbCwgaW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocHJlX2RlY29kZV9idWZfbGV2ZWwsICJcbiBhbW12ZGVjX2gyNjQgcHJlX2RlY29kZV9idWZfbGV2ZWxcbiIpOworCittb2R1bGVfcGFyYW0odWRlYnVnX3BhdXNlX2RlY29kZV9pZHgsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeCwgIlxuIHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4XG4iKTsKKworbW9kdWxlX3BhcmFtKGRpc3BfdmZyYW1lX3ZhbHZlX2xldmVsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGlzcF92ZnJhbWVfdmFsdmVfbGV2ZWwsICJcbiBkaXNwX3ZmcmFtZV92YWx2ZV9sZXZlbFxuIik7CisKK21vZHVsZV9wYXJhbShwaWNfbGlzdF9kZWJ1ZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBpY19saXN0X2RlYnVnLCAiXG4gcGljX2xpc3RfZGVidWdcbiIpOworCittb2R1bGVfcGFyYW0od2l0aG91dF9kaXNwbGF5X21vZGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh3aXRob3V0X2Rpc3BsYXlfbW9kZSwgIlxuIGFtdmRlY19oMjY1IHdpdGhvdXRfZGlzcGxheV9tb2RlXG4iKTsKKworI2lmZGVmIEhFVkNfOEtfTEZUT0ZGU0VUX0ZJWAorbW9kdWxlX3BhcmFtKHBlcmZvcm1hbmNlX3Byb2ZpbGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhwZXJmb3JtYW5jZV9wcm9maWxlLCAiXG4gYW12ZGVjX2gyNjUgcGVyZm9ybWFuY2VfcHJvZmlsZVxuIik7CisjZW5kaWYKK21vZHVsZV9wYXJhbShkaXNhYmxlX2lwX21vZGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkaXNhYmxlX2lwX21vZGUsICJcbiBhbXZkZWNfaDI2NSBkaXNhYmxlIGlwX21vZGVcbiIpOworCittb2R1bGVfcGFyYW0oZGlydHlfYWdhaW5fdGhyZXNob2xkLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGlydHlfYWdhaW5fdGhyZXNob2xkLCAiXG4gZGlydHlfYWdhaW5fdGhyZXNob2xkXG4iKTsKKworbW9kdWxlX3BhcmFtKGRpcnR5X2J1ZmZlcnNpemVfdGhyZXNob2xkLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGlydHlfYnVmZmVyc2l6ZV90aHJlc2hvbGQsICJcbiBkaXJ0eV9idWZmZXJzaXplX3RocmVzaG9sZFxuIik7CisKK21vZHVsZV9wYXJhbShmb3JjZV9jb25maWdfZmVuY2UsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9jb25maWdfZmVuY2UsICJcbiBmb3JjZSBlbmFibGUgZmVuY2VcbiIpOworCittb2R1bGVfcGFyYW0obXZfYnVmX2R5bmFtaWNfYWxsb2MsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhtdl9idWZfZHluYW1pY19hbGxvYywgIlxuIG12X2J1Zl9keW5hbWljX2FsbG9jXG4iKTsKKworbW9kdWxlX3BhcmFtKGRldGVjdF9zdHVja19idWZmZXJfbWFyZ2luLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGV0ZWN0X3N0dWNrX2J1ZmZlcl9tYXJnaW4sICJcbiBkZXRlY3Rfc3R1Y2tfYnVmZmVyX21hcmdpblxuIik7CisKK21vZHVsZV9pbml0KGFtdmRlY19oMjY1X2RyaXZlcl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChhbXZkZWNfaDI2NV9kcml2ZXJfcmVtb3ZlX21vZHVsZSk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQU1MT0dJQyBoMjY1IFZpZGVvIERlY29kZXIgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJUaW0gWWFvIDx0aW0ueWFvQGFtbG9naWMuY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL2gyNjUvdmgyNjUuaCBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9oMjY1L3ZoMjY1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFkZTExYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9oMjY1L3ZoMjY1LmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9hbXBvcnRzL3ZoMjY1LmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBWSDI2NV9ICisjZGVmaW5lIFZIMjY1X0gKKworZXh0ZXJuIHUzMiBnZXRfYmxhY2tvdXRfcG9saWN5KHZvaWQpOworCitleHRlcm4gczMyIHZoMjY1X2luaXQodm9pZCk7CisKK2V4dGVybiBzMzIgdmgyNjVfcmVsZWFzZSh2b2lkKTsKKworI2VuZGlmIC8qIFZNUEVHNF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvbWpwZWcvTWFrZWZpbGUgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvbWpwZWcvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI5MTg1NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9tanBlZy9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKK29iai0kKENPTkZJR19BTUxPR0lDX01FRElBX1ZERUNfTUpQRUcpICs9IGFtdmRlY19tanBlZy5vCithbXZkZWNfbWpwZWctb2JqcyArPSB2bWpwZWcubworCitvYmotJChDT05GSUdfQU1MT0dJQ19NRURJQV9WREVDX01KUEVHX01VTFRJKSArPSBhbXZkZWNfbW1qcGVnLm8KK2FtdmRlY19tbWpwZWctb2JqcyArPSB2bWpwZWdfbXVsdGkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL21qcGVnL3ZtanBlZy5jIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL21qcGVnL3ZtanBlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxN2EyYTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvbWpwZWcvdm1qcGVnLmMKQEAgLTAsMCArMSw5NTkgQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvYW1wb3J0cy92bWpwZWcuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2ZyYW1lX3N5bmMvcHRzc2Vydi5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvYW1zdHJlYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NhbnZhcy9jYW52YXMuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWVfcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWVfcmVjZWl2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL3ZkZWNfcmVnLmg+CisjaW5jbHVkZSAiLi4vLi4vLi4vc3RyZWFtX2lucHV0L2FtcG9ydHMvYW1wb3J0c19wcml2LmgiCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9yZWdpc3RlcnMvcmVnaXN0ZXIuaD4KKyNpbmNsdWRlICIuLi91dGlscy9kZWNvZGVyX21tdV9ib3guaCIKKyNpbmNsdWRlICIuLi91dGlscy9kZWNvZGVyX2JtbXVfYm94LmgiCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jb2RlY19tbS9jb2RlY19tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29uZmlncy5oPgorCisjaWZkZWYgQ09ORklHX0FNX1ZERUNfTUpQRUdfTE9HCisjZGVmaW5lIEFNTE9HCisjZGVmaW5lIExPR19MRVZFTF9WQVIgICAgICAgYW1sb2dfbGV2ZWxfdm1qcGVnCisjZGVmaW5lIExPR19NQVNLX1ZBUiAgICAgICAgYW1sb2dfbWFza192bWpwZWcKKyNkZWZpbmUgTE9HX0xFVkVMX0VSUk9SICAgICAwCisjZGVmaW5lIExPR19MRVZFTF9JTkZPICAgICAgMQorI2RlZmluZSBMT0dfTEVWRUxfREVTQyAgIjA6RVJST1IsIDE6SU5GTyIKKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvYW1sb2cuaD4KK01PRFVMRV9BTUxPRyhMT0dfTEVWRUxfRVJST1IsIDAsIExPR19MRVZFTF9ERVNDLCBMT0dfREVGQVVMVF9NQVNLX0RFU0MpOworCisjaW5jbHVkZSAiLi4vdXRpbHMvYW12ZGVjLmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvZmlybXdhcmUuaCIKKworI2RlZmluZSBEUklWRVJfTkFNRSAiYW12ZGVjX21qcGVnIgorI2RlZmluZSBNT0RVTEVfTkFNRSAiYW12ZGVjX21qcGVnIgorCisvKiBwcm90b2NvbCByZWdpc3RlciB1c2FnZQorICogICAgQVZfU0NSQVRDSF8wIC0gQVZfU0NSQVRDSF8xIDogaW5pdGlhbCBkaXNwbGF5IGJ1ZmZlciBmaWZvCisgKiAgICBBVl9TQ1JBVENIXzIgLSBBVl9TQ1JBVENIXzMgOiBkZWNvZGVyIHNldHRpbmdzCisgKiAgICBBVl9TQ1JBVENIXzQgLSBBVl9TQ1JBVENIXzcgOiBkaXNwbGF5IGJ1ZmZlciBzcGVjCisgKiAgICBBVl9TQ1JBVENIXzggLSBBVl9TQ1JBVENIXzkgOiBhbXJpc2MvaG9zdCBkaXNwbGF5IGJ1ZmZlciBtYW5hZ2VtZW50CisgKiAgICBBVl9TQ1JBVENIX2EgICAgICAgICAgICAgICAgOiB0aW1lIHN0YW1wCisgKi8KKworI2RlZmluZSBNUkVHX0RFQ09ERV9QQVJBTSAgIEFWX1NDUkFUQ0hfMgkvKiBiaXQgMC0zOiBwaWNvX2FkZHJfbW9kZSAqLworLyogYml0IDE1LTQ6IHJlZmVyZW5jZSBoZWlnaHQgKi8KKyNkZWZpbmUgTVJFR19UT19BTVJJU0MgICAgICBBVl9TQ1JBVENIXzgKKyNkZWZpbmUgTVJFR19GUk9NX0FNUklTQyAgICBBVl9TQ1JBVENIXzkKKyNkZWZpbmUgTVJFR19GUkFNRV9PRkZTRVQgICBBVl9TQ1JBVENIX0EKKworI2RlZmluZSBQSUNJTkZPX0JVRl9JRFhfTUFTSyAgICAgICAgMHgwMDA3CisjZGVmaW5lIFBJQ0lORk9fQVZJMSAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgUElDSU5GT19JTlRFUkxBQ0UgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBQSUNJTkZPX0lOVEVSTEFDRV9BVkkxX0JPVCAgMHgwMDEwCisjZGVmaW5lIFBJQ0lORk9fSU5URVJMQUNFX0ZJUlNUICAgICAweDAwMTAKKworI2RlZmluZSBWRl9QT09MX1NJWkUgICAgICAgICAgMTYKKyNkZWZpbmUgREVDT0RFX0JVRkZFUl9OVU1fTUFYCQk0CisjZGVmaW5lIE1BWF9CTU1VX0JVRkZFUl9OVU0JCURFQ09ERV9CVUZGRVJfTlVNX01BWAorI2RlZmluZSBQVVRfSU5URVJWQUwgICAgICAgIChIWi8xMDApCisKKyNpZiAxLypNRVNPTl9DUFVfVFlQRSA+PSBNRVNPTl9DUFVfVFlQRV9NRVNPTjYqLworLyogI2RlZmluZSBOVjIxICovCisjZW5kaWYKK3N0YXRpYyBERUZJTkVfTVVURVgodm1qcGVnX211dGV4KTsKKworc3RhdGljIHN0cnVjdCBkZWNfc3lzaW5mbyB2bWpwZWdfYW1zdHJlYW1fZGVjX2luZm87CisKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZtanBlZ192Zl9wZWVrKHZvaWQgKik7CitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2bWpwZWdfdmZfZ2V0KHZvaWQgKik7CitzdGF0aWMgdm9pZCB2bWpwZWdfdmZfcHV0KHN0cnVjdCB2ZnJhbWVfcyAqLCB2b2lkICopOworc3RhdGljIGludCB2bWpwZWdfdmZfc3RhdGVzKHN0cnVjdCB2ZnJhbWVfc3RhdGVzICpzdGF0ZXMsIHZvaWQgKik7CitzdGF0aWMgaW50IHZtanBlZ19ldmVudF9jYihpbnQgdHlwZSwgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKKworc3RhdGljIGludCB2bWpwZWdfcHJvdF9pbml0KHZvaWQpOworc3RhdGljIHZvaWQgdm1qcGVnX2xvY2FsX2luaXQodm9pZCk7CisKK3N0YXRpYyBjb25zdCBjaGFyIHZtanBlZ19kZWNfaWRbXSA9ICJ2bWpwZWctZGV2IjsKK3N0YXRpYyBzdHJ1Y3QgdmRlY19pbmZvICpndnM7CitzdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IHNldF9jbGtfd29yazsKKworI2RlZmluZSBQUk9WSURFUl9OQU1FICAgImRlY29kZXIubWpwZWciCitzdGF0aWMgY29uc3Qgc3RydWN0IHZmcmFtZV9vcGVyYXRpb25zX3Mgdm1qcGVnX3ZmX3Byb3ZpZGVyID0geworCS5wZWVrID0gdm1qcGVnX3ZmX3BlZWssCisJLmdldCA9IHZtanBlZ192Zl9nZXQsCisJLnB1dCA9IHZtanBlZ192Zl9wdXQsCisJLmV2ZW50X2NiID0gdm1qcGVnX2V2ZW50X2NiLAorCS52Zl9zdGF0ZXMgPSB2bWpwZWdfdmZfc3RhdGVzLAorfTsKK3N0YXRpYyB2b2lkICptbV9ibGtfaGFuZGxlOworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcHJvdmlkZXJfcyB2bWpwZWdfdmZfcHJvdjsKKworc3RhdGljIERFQ0xBUkVfS0ZJRk8obmV3ZnJhbWVfcSwgc3RydWN0IHZmcmFtZV9zICosIFZGX1BPT0xfU0laRSk7CitzdGF0aWMgREVDTEFSRV9LRklGTyhkaXNwbGF5X3EsIHN0cnVjdCB2ZnJhbWVfcyAqLCBWRl9QT09MX1NJWkUpOworc3RhdGljIERFQ0xBUkVfS0ZJRk8ocmVjeWNsZV9xLCBzdHJ1Y3QgdmZyYW1lX3MgKiwgVkZfUE9PTF9TSVpFKTsKKworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyB2ZnBvb2xbVkZfUE9PTF9TSVpFXTsKK3N0YXRpYyBzMzIgdmZidWZfdXNlW0RFQ09ERV9CVUZGRVJfTlVNX01BWF07CisKK3N0YXRpYyB1MzIgZnJhbWVfd2lkdGgsIGZyYW1lX2hlaWdodCwgZnJhbWVfZHVyOworc3RhdGljIHUzMiBzYXZlZF9yZXNvbHV0aW9uOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHJlY3ljbGVfdGltZXI7CitzdGF0aWMgdTMyIHN0YXQ7CitzdGF0aWMgdTMyIGJ1Zl9zaXplID0gMzIgKiAxMDI0ICogMTAyNDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7CitzdGF0aWMgYm9vbCBpc19yZXNldDsKKworc3RhdGljIGlubGluZSB1MzIgaW5kZXgyY2FudmFzMCh1MzIgaW5kZXgpCit7CisJY29uc3QgdTMyIGNhbnZhc190YWJbNF0gPSB7CisjaWZkZWYgTlYyMQorCQkweDAxMDEwMCwgMHgwMzAzMDIsIDB4MDUwNTA0LCAweDA3MDcwNgorI2Vsc2UKKwkJMHgwMjAxMDAsIDB4MDUwNDAzLCAweDA4MDcwNiwgMHgwYjBhMDkKKyNlbmRpZgorCX07CisKKwlyZXR1cm4gY2FudmFzX3RhYltpbmRleF07Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGluZGV4MmNhbnZhczEodTMyIGluZGV4KQoreworCWNvbnN0IHUzMiBjYW52YXNfdGFiWzRdID0geworI2lmZGVmIE5WMjEKKwkJMHgwZDBkMGMsIDB4MGYwZjBlLCAweDE3MTcxNiwgMHgxOTE5MTgKKyNlbHNlCisJCTB4MGUwZDBjLCAweDE4MTcxNiwgMHgyMjIxMjAsIDB4MjUyNDIzCisjZW5kaWYKKwl9OworCisJcmV0dXJuIGNhbnZhc190YWJbaW5kZXhdOworfQorCitzdGF0aWMgdm9pZCBzZXRfZnJhbWVfaW5mbyhzdHJ1Y3QgdmZyYW1lX3MgKnZmKQoreworCXZmLT53aWR0aCA9IGZyYW1lX3dpZHRoOworCXZmLT5oZWlnaHQgPSBmcmFtZV9oZWlnaHQ7CisJdmYtPmR1cmF0aW9uID0gZnJhbWVfZHVyOworCXZmLT5yYXRpb19jb250cm9sID0gMDsKKwl2Zi0+ZHVyYXRpb25fcHVsbGRvd24gPSAwOworCXZmLT5mbGFnID0gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IHZtanBlZ19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXUzMiByZWcsIG9mZnNldCwgcHRzLCBwdHNfdmFsaWQgPSAwOworCXN0cnVjdCB2ZnJhbWVfcyAqdmYgPSBOVUxMOworCXU2NCBwdHNfdXM2NDsKKwl1MzIgZnJhbWVfc2l6ZTsKKworCVdSSVRFX1ZSRUcoQVNTSVNUX01CT1gxX0NMUl9SRUcsIDEpOworCisJcmVnID0gUkVBRF9WUkVHKE1SRUdfRlJPTV9BTVJJU0MpOworCisJaWYgKHJlZyAmIFBJQ0lORk9fQlVGX0lEWF9NQVNLKSB7CisJCW9mZnNldCA9IFJFQURfVlJFRyhNUkVHX0ZSQU1FX09GRlNFVCk7CisKKwkJaWYgKHB0c19sb29rdXBfb2Zmc2V0X3VzNjQKKwkJCShQVFNfVFlQRV9WSURFTywgb2Zmc2V0LCAmcHRzLAorCQkJJmZyYW1lX3NpemUsIDAsICZwdHNfdXM2NCkgPT0gMCkKKwkJCXB0c192YWxpZCA9IDE7CisKKwkJaWYgKChyZWcgJiBQSUNJTkZPX0lOVEVSTEFDRSkgPT0gMCkgeworCQkJdTMyIGluZGV4ID0gKChyZWcgJiBQSUNJTkZPX0JVRl9JRFhfTUFTSykgLSAxKSAmIDM7CisKKwkJCWlmIChpbmRleCA+PSBERUNPREVfQlVGRkVSX05VTV9NQVgpIHsKKwkJCQlwcl9lcnIoImZhdGFsIGVycm9yLCBpbnZhbGlkIGJ1ZmZlciBpbmRleC4iKTsKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQl9CisKKwkJCWlmIChrZmlmb19nZXQoJm5ld2ZyYW1lX3EsICZ2ZikgPT0gMCkgeworCQkJCXByX2luZm8oCisJCQkJImZhdGFsIGVycm9yLCBubyBhdmFpbGFibGUgYnVmZmVyIHNsb3QuIik7CisJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJfQorCisJCQlzZXRfZnJhbWVfaW5mbyh2Zik7CisJCQl2Zi0+c2lnbmFsX3R5cGUgPSAwOworCQkJdmYtPmluZGV4ID0gaW5kZXg7CisjaWZkZWYgTlYyMQorCQkJdmYtPnR5cGUgPQorCQkJCVZJRFRZUEVfUFJPR1JFU1NJVkUgfCBWSURUWVBFX1ZJVV9GSUVMRCB8CisJCQkJVklEVFlQRV9WSVVfTlYyMTsKKyNlbHNlCisJCQl2Zi0+dHlwZSA9IFZJRFRZUEVfUFJPR1JFU1NJVkUgfCBWSURUWVBFX1ZJVV9GSUVMRDsKKyNlbmRpZgorCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0KKwkJCQkJaW5kZXgyY2FudmFzMChpbmRleCk7CisJCQl2Zi0+cHRzID0gKHB0c192YWxpZCkgPyBwdHMgOiAwOworCQkJdmYtPnB0c191czY0ID0gKHB0c192YWxpZCkgPyBwdHNfdXM2NCA6IDA7CisJCQl2Zi0+b3JpZW50YXRpb24gPSAwOworCQkJdmYtPnR5cGVfb3JpZ2luYWwgPSB2Zi0+dHlwZTsKKwkJCXZmYnVmX3VzZVtpbmRleF0rKzsKKwkJCXZmLT5tZW1faGFuZGxlID0KKwkJCQlkZWNvZGVyX2JtbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCQltbV9ibGtfaGFuZGxlLAorCQkJCQlpbmRleCk7CisKKwkJCWd2cy0+ZnJhbWVfZHVyID0gZnJhbWVfZHVyOworCQkJdmRlY19jb3VudF9pbmZvKGd2cywgMCwgb2Zmc2V0KTsKKworCQkJa2ZpZm9fcHV0KCZkaXNwbGF5X3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCQlBVFJBQ0VfQ09VTlRFUihNT0RVTEVfTkFNRSwgdmYtPnB0cyk7CisKKwkJCXZmX25vdGlmeV9yZWNlaXZlcihQUk9WSURFUl9OQU1FLAorCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfVkZSQU1FX1JFQURZLAorCQkJCQlOVUxMKTsKKworCQl9IGVsc2UgeworCQkJdTMyIGluZGV4ID0gKChyZWcgJiBQSUNJTkZPX0JVRl9JRFhfTUFTSykgLSAxKSAmIDM7CisKKwkJCWlmIChpbmRleCA+PSBERUNPREVfQlVGRkVSX05VTV9NQVgpIHsKKwkJCQlwcl9pbmZvKCJmYXRhbCBlcnJvciwgaW52YWxpZCBidWZmZXIgaW5kZXguIik7CisJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJfQorCisJCQlpZiAoa2ZpZm9fZ2V0KCZuZXdmcmFtZV9xLCAmdmYpID09IDApIHsKKwkJCQlwcl9pbmZvCisJCQkJKCJmYXRhbCBlcnJvciwgbm8gYXZhaWxhYmxlIGJ1ZmZlciBzbG90LiIpOworCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCX0KKworCQkJc2V0X2ZyYW1lX2luZm8odmYpOworCQkJdmYtPnNpZ25hbF90eXBlID0gMDsKKwkJCXZmLT5pbmRleCA9IGluZGV4OworI2lmIDAKKwkJCWlmIChyZWcgJiBQSUNJTkZPX0FWSTEpIHsKKwkJCQkvKiBBVkkxIGZvcm1hdCAqLworCQkJCWlmIChyZWcgJiBQSUNJTkZPX0lOVEVSTEFDRV9BVkkxX0JPVCkgeworCQkJCQl2Zi0+dHlwZSA9CisJCQkJCQlWSURUWVBFX0lOVEVSTEFDRV9CT1RUT00gfAorCQkJCQkJVklEVFlQRV9JTlRFUkxBQ0VfRklSU1Q7CisJCQkJfSBlbHNlCisJCQkJCXZmLT50eXBlID0gVklEVFlQRV9JTlRFUkxBQ0VfVE9QOworCQkJfSBlbHNlIHsKKwkJCQlpZiAocmVnICYgUElDSU5GT19JTlRFUkxBQ0VfRklSU1QpIHsKKwkJCQkJdmYtPnR5cGUgPQorCQkJCQkJVklEVFlQRV9JTlRFUkxBQ0VfVE9QIHwKKwkJCQkJCVZJRFRZUEVfSU5URVJMQUNFX0ZJUlNUOworCQkJCX0gZWxzZQorCQkJCQl2Zi0+dHlwZSA9IFZJRFRZUEVfSU5URVJMQUNFX0JPVFRPTTsKKwkJCX0KKworCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9WSVVfRklFTEQ7CisjaWZkZWYgTlYyMQorCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9WSVVfTlYyMTsKKyNlbmRpZgorCQkJdmYtPmR1cmF0aW9uID4+PSAxOworCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0KKwkJCQkJaW5kZXgyY2FudmFzMChpbmRleCk7CisJCQl2Zi0+b3JpZW50YXRpb24gPSAwOworCQkJaWYgKCh2Zi0+dHlwZSAmIFZJRFRZUEVfSU5URVJMQUNFX0ZJUlNUKSAmJgorCQkJCShwdHNfdmFsaWQpKQorCQkJCXZmLT5wdHMgPSBwdHM7CisJCQllbHNlCisJCQkJdmYtPnB0cyA9IDA7CisKKwkJCXZmYnVmX3VzZVtpbmRleF0rKzsKKworCQkJa2ZpZm9fcHV0KCZkaXNwbGF5X3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCQlBVFJBQ0VfQ09VTlRFUihNT0RVTEVfTkFNRSwgdmYtPnB0cyk7CisjZWxzZQorCQkJLyogc2VuZCB3aG9sZSBmcmFtZSBieSB3ZWF2aW5nIHRvcCAmIGJvdHRvbSBmaWVsZCAqLworI2lmZGVmIE5WMjEKKwkJCXZmLT50eXBlID0gVklEVFlQRV9QUk9HUkVTU0lWRSB8IFZJRFRZUEVfVklVX05WMjE7CisjZWxzZQorCQkJdmYtPnR5cGUgPSBWSURUWVBFX1BST0dSRVNTSVZFOworI2VuZGlmCisJCQl2Zi0+Y2FudmFzMEFkZHIgPSBpbmRleDJjYW52YXMwKGluZGV4KTsKKwkJCXZmLT5jYW52YXMxQWRkciA9IGluZGV4MmNhbnZhczEoaW5kZXgpOworCQkJdmYtPm9yaWVudGF0aW9uID0gMDsKKwkJCWlmIChwdHNfdmFsaWQpIHsKKwkJCQl2Zi0+cHRzID0gcHRzOworCQkJCXZmLT5wdHNfdXM2NCA9IHB0c191czY0OworCQkJfSBlbHNlIHsKKwkJCQl2Zi0+cHRzID0gMDsKKwkJCQl2Zi0+cHRzX3VzNjQgPSAwOworCQkJfQorCQkJdmYtPnR5cGVfb3JpZ2luYWwgPSB2Zi0+dHlwZTsKKwkJCXZmYnVmX3VzZVtpbmRleF0rKzsKKwkJCXZmLT5tZW1faGFuZGxlID0KKwkJCQlkZWNvZGVyX2JtbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCQltbV9ibGtfaGFuZGxlLAorCQkJCQlpbmRleCk7CisKKwkJCWd2cy0+ZnJhbWVfZHVyID0gZnJhbWVfZHVyOworCQkJdmRlY19jb3VudF9pbmZvKGd2cywgMCwgb2Zmc2V0KTsKKworCQkJa2ZpZm9fcHV0KCZkaXNwbGF5X3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCQlBVFJBQ0VfQ09VTlRFUihNT0RVTEVfTkFNRSwgdmYtPnB0cyk7CisKKwkJCXZmX25vdGlmeV9yZWNlaXZlcihQUk9WSURFUl9OQU1FLAorCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfVkZSQU1FX1JFQURZLAorCQkJCQlOVUxMKTsKKyNlbmRpZgorCQl9CisKKwkJV1JJVEVfVlJFRyhNUkVHX0ZST01fQU1SSVNDLCAwKTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZtanBlZ192Zl9wZWVrKHZvaWQgKm9wX2FyZykKK3sKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmOworCisJaWYgKGtmaWZvX3BlZWsoJmRpc3BsYXlfcSwgJnZmKSkKKwkJcmV0dXJuIHZmOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZtanBlZ192Zl9nZXQodm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCB2ZnJhbWVfcyAqdmY7CisKKwlpZiAoa2ZpZm9fZ2V0KCZkaXNwbGF5X3EsICZ2ZikpCisJCXJldHVybiB2ZjsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCB2bWpwZWdfdmZfcHV0KHN0cnVjdCB2ZnJhbWVfcyAqdmYsIHZvaWQgKm9wX2FyZykKK3sKKwlrZmlmb19wdXQoJnJlY3ljbGVfcSwgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKK30KKworc3RhdGljIGludCB2bWpwZWdfZXZlbnRfY2IoaW50IHR5cGUsIHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGVfZGF0YSkKK3sKKwlpZiAodHlwZSAmIFZGUkFNRV9FVkVOVF9SRUNFSVZFUl9SRVNFVCkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCWFtdmRlY19zdG9wKCk7CisjaWZuZGVmIENPTkZJR19BTUxPR0lDX1BPU1RfUFJPQ0VTU19NQU5BR0VSCisJCXZmX2xpZ2h0X3VucmVnX3Byb3ZpZGVyKCZ2bWpwZWdfdmZfcHJvdik7CisjZW5kaWYKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKKwkJdm1qcGVnX2xvY2FsX2luaXQoKTsKKwkJdm1qcGVnX3Byb3RfaW5pdCgpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CisjaWZuZGVmIENPTkZJR19BTUxPR0lDX1BPU1RfUFJPQ0VTU19NQU5BR0VSCisJCXZmX3JlZ19wcm92aWRlcigmdm1qcGVnX3ZmX3Byb3YpOworI2VuZGlmCisJCWFtdmRlY19zdGFydCgpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bWpwZWdfdmZfc3RhdGVzKHN0cnVjdCB2ZnJhbWVfc3RhdGVzICpzdGF0ZXMsIHZvaWQgKm9wX2FyZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKKworCXN0YXRlcy0+dmZfcG9vbF9zaXplID0gVkZfUE9PTF9TSVpFOworCXN0YXRlcy0+YnVmX2ZyZWVfbnVtID0ga2ZpZm9fbGVuKCZuZXdmcmFtZV9xKTsKKwlzdGF0ZXMtPmJ1Zl9hdmFpbF9udW0gPSBrZmlmb19sZW4oJmRpc3BsYXlfcSk7CisJc3RhdGVzLT5idWZfcmVjeWNsZV9udW0gPSBrZmlmb19sZW4oJnJlY3ljbGVfcSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyB2b2lkIG1qcGVnX3NldF9jbGsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWlmIChmcmFtZV9kdXIgPiAwICYmIHNhdmVkX3Jlc29sdXRpb24gIT0KKwkJZnJhbWVfd2lkdGggKiBmcmFtZV9oZWlnaHQgKiAoOTYwMDAgLyBmcmFtZV9kdXIpKSB7CisJCWludCBmcHMgPSA5NjAwMCAvIGZyYW1lX2R1cjsKKworCQlzYXZlZF9yZXNvbHV0aW9uID0gZnJhbWVfd2lkdGggKiBmcmFtZV9oZWlnaHQgKiBmcHM7CisJCXZkZWNfc291cmNlX2NoYW5nZWQoVkZPUk1BVF9NSlBFRywKKwkJCWZyYW1lX3dpZHRoLCBmcmFtZV9oZWlnaHQsIGZwcyk7CisJfQorfQorCitzdGF0aWMgdm9pZCB2bWpwZWdfcHV0X3RpbWVyX2Z1bmMoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworCXdoaWxlICgha2ZpZm9faXNfZW1wdHkoJnJlY3ljbGVfcSkgJiYKKwkJCShSRUFEX1ZSRUcoTVJFR19UT19BTVJJU0MpID09IDApKSB7CisJCXN0cnVjdCB2ZnJhbWVfcyAqdmY7CisKKwkJaWYgKGtmaWZvX2dldCgmcmVjeWNsZV9xLCAmdmYpKSB7CisJCQlpZiAoKHZmLT5pbmRleCA8IERFQ09ERV9CVUZGRVJfTlVNX01BWCkKKwkJCQkmJiAoLS12ZmJ1Zl91c2VbdmYtPmluZGV4XSA9PSAwKSkgeworCQkJCVdSSVRFX1ZSRUcoTVJFR19UT19BTVJJU0MsIHZmLT5pbmRleCArIDEpOworCQkJCXZmLT5pbmRleCA9IERFQ09ERV9CVUZGRVJfTlVNX01BWDsKKwkJCX0KKworCQkJa2ZpZm9fcHV0KCZuZXdmcmFtZV9xLCAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQl9CisJfQorCisJc2NoZWR1bGVfd29yaygmc2V0X2Nsa193b3JrKTsKKworCXRpbWVyLT5leHBpcmVzID0gamlmZmllcyArIFBVVF9JTlRFUlZBTDsKKworCWFkZF90aW1lcih0aW1lcik7Cit9CisKK2ludCB2bWpwZWdfZGVjX3N0YXR1cyhzdHJ1Y3QgdmRlY19zICp2ZGVjLCBzdHJ1Y3QgdmRlY19pbmZvICp2c3RhdHVzKQoreworCWlmICghKHN0YXQgJiBTVEFUX1ZERUNfUlVOKSkKKwkJcmV0dXJuIC0xOworCisJdnN0YXR1cy0+ZnJhbWVfd2lkdGggPSBmcmFtZV93aWR0aDsKKwl2c3RhdHVzLT5mcmFtZV9oZWlnaHQgPSBmcmFtZV9oZWlnaHQ7CisJaWYgKDAgIT0gZnJhbWVfZHVyKQorCQl2c3RhdHVzLT5mcmFtZV9yYXRlID0gOTYwMDAgLyBmcmFtZV9kdXI7CisJZWxzZQorCQl2c3RhdHVzLT5mcmFtZV9yYXRlID0gOTYwMDA7CisJdnN0YXR1cy0+ZXJyb3JfY291bnQgPSAwOworCXZzdGF0dXMtPnN0YXR1cyA9IHN0YXQ7CisJdnN0YXR1cy0+Yml0X3JhdGUgPSBndnMtPmJpdF9yYXRlOworCXZzdGF0dXMtPmZyYW1lX2R1ciA9IGZyYW1lX2R1cjsKKwl2c3RhdHVzLT5mcmFtZV9kYXRhID0gZ3ZzLT5mcmFtZV9kYXRhOworCXZzdGF0dXMtPnRvdGFsX2RhdGEgPSBndnMtPnRvdGFsX2RhdGE7CisJdnN0YXR1cy0+ZnJhbWVfY291bnQgPSBndnMtPmZyYW1lX2NvdW50OworCXZzdGF0dXMtPmVycm9yX2ZyYW1lX2NvdW50ID0gZ3ZzLT5lcnJvcl9mcmFtZV9jb3VudDsKKwl2c3RhdHVzLT5kcm9wX2ZyYW1lX2NvdW50ID0gZ3ZzLT5kcm9wX2ZyYW1lX2NvdW50OworCXZzdGF0dXMtPnRvdGFsX2RhdGEgPSBndnMtPnRvdGFsX2RhdGE7CisJdnN0YXR1cy0+c2FtcF9jbnQgPSBndnMtPnNhbXBfY250OworCXZzdGF0dXMtPm9mZnNldCA9IGd2cy0+b2Zmc2V0OworCXNucHJpbnRmKHZzdGF0dXMtPnZkZWNfbmFtZSwgc2l6ZW9mKHZzdGF0dXMtPnZkZWNfbmFtZSksCisJCSIlcyIsIERSSVZFUl9OQU1FKTsKKworCXJldHVybiAwOworfQorCitpbnQgdm1qcGVnX3NldF9pc3Jlc2V0KHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBpc3Jlc2V0KQoreworCWlzX3Jlc2V0ID0gaXNyZXNldDsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHZtanBlZ19jYW52YXNfaW5pdCh2b2lkKQoreworCWludCBpLCByZXQ7CisJdTMyIGNhbnZhc193aWR0aCwgY2FudmFzX2hlaWdodDsKKwl1MzIgZGVjYnVmX3NpemUsIGRlY2J1Zl95X3NpemUsIGRlY2J1Zl91dl9zaXplOworCXVuc2lnbmVkIGxvbmcgYnVmX3N0YXJ0OworCisJaWYgKGJ1Zl9zaXplIDw9IDB4MDA0MDAwMDApIHsKKwkJLyogU0Qgb25seSAqLworCQljYW52YXNfd2lkdGggPSA3Njg7CisJCWNhbnZhc19oZWlnaHQgPSA1NzY7CisJCWRlY2J1Zl95X3NpemUgPSAweDgwMDAwOworCQlkZWNidWZfdXZfc2l6ZSA9IDB4MjAwMDA7CisJCWRlY2J1Zl9zaXplID0gMHgxMDAwMDA7CisJfSBlbHNlIHsKKwkJLyogSEQgJiBTRCAqLworCQljYW52YXNfd2lkdGggPSAxOTIwOworCQljYW52YXNfaGVpZ2h0ID0gMTA4ODsKKwkJZGVjYnVmX3lfc2l6ZSA9IDB4MjAwMDAwOworCQlkZWNidWZfdXZfc2l6ZSA9IDB4ODAwMDA7CisJCWRlY2J1Zl9zaXplID0gMHgzMDAwMDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE1BWF9CTU1VX0JVRkZFUl9OVU07IGkrKykgeworCisJCXJldCA9IGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeShtbV9ibGtfaGFuZGxlLCBpLAorCQkJCWRlY2J1Zl9zaXplLCBEUklWRVJfTkFNRSwgJmJ1Zl9zdGFydCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKyNpZmRlZiBOVjIxCisJCWNvbmZpZ19jYXZfbHV0X2V4KGluZGV4MmNhbnZhczAoaSkgJiAweGZmLAorCQkJYnVmX3N0YXJ0LAorCQkJY2FudmFzX3dpZHRoLCBjYW52YXNfaGVpZ2h0LAorCQkJQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJQ0FOVkFTX0JMS01PREVfTElORUFSLCAwLCBWREVDXzEpOworCQljb25maWdfY2F2X2x1dF9leCgoaW5kZXgyY2FudmFzMChpKSA+PiA4KSAmIDB4ZmYsCisJCQlidWZfc3RhcnQgKworCQkJZGVjYnVmX3lfc2l6ZSwgY2FudmFzX3dpZHRoLAorCQkJY2FudmFzX2hlaWdodCAvIDIsIENBTlZBU19BRERSX05PV1JBUCwKKwkJCUNBTlZBU19CTEtNT0RFX0xJTkVBUiwgMCwgVkRFQ18xKTsKKwkJY29uZmlnX2Nhdl9sdXRfZXgoaW5kZXgyY2FudmFzMShpKSAmIDB4ZmYsCisJCQlidWZfc3RhcnQgKworCQkJZGVjYnVmX3NpemUgLyAyLCBjYW52YXNfd2lkdGgsCisJCQljYW52YXNfaGVpZ2h0LCBDQU5WQVNfQUREUl9OT1dSQVAsCisJCQlDQU5WQVNfQkxLTU9ERV9MSU5FQVIsIDAsIFZERUNfMSk7CisJCWNvbmZpZ19jYXZfbHV0X2V4KChpbmRleDJjYW52YXMxKGkpID4+IDgpICYgMHhmZiwKKwkJCWJ1Zl9zdGFydCArCisJCQlkZWNidWZfeV9zaXplICsgZGVjYnVmX3V2X3NpemUgLyAyLAorCQkJY2FudmFzX3dpZHRoLCBjYW52YXNfaGVpZ2h0IC8gMiwKKwkJCUNBTlZBU19BRERSX05PV1JBUCwKKwkJCUNBTlZBU19CTEtNT0RFX0xJTkVBUiwgMCwgVkRFQ18xKTsKKyNlbHNlCisJCWNvbmZpZ19jYXZfbHV0X2V4KGluZGV4MmNhbnZhczAoaSkgJiAweGZmLAorCQkJYnVmX3N0YXJ0LAorCQkJY2FudmFzX3dpZHRoLCBjYW52YXNfaGVpZ2h0LAorCQkJQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJQ0FOVkFTX0JMS01PREVfTElORUFSLCAwLCBWREVDXzEpOworCQljb25maWdfY2F2X2x1dF9leCgoaW5kZXgyY2FudmFzMChpKSA+PiA4KSAmIDB4ZmYsCisJCQlidWZfc3RhcnQgKworCQkJZGVjYnVmX3lfc2l6ZSwgY2FudmFzX3dpZHRoIC8gMiwKKwkJCWNhbnZhc19oZWlnaHQgLyAyLCBDQU5WQVNfQUREUl9OT1dSQVAsCisJCQlDQU5WQVNfQkxLTU9ERV9MSU5FQVIsIDAsIFZERUNfMSk7CisJCWNvbmZpZ19jYXZfbHV0X2V4KChpbmRleDJjYW52YXMwKGkpID4+IDE2KSAmIDB4ZmYsCisJCQlidWZfc3RhcnQgKworCQkJZGVjYnVmX3lfc2l6ZSArIGRlY2J1Zl91dl9zaXplLAorCQkJY2FudmFzX3dpZHRoIC8gMiwgY2FudmFzX2hlaWdodCAvIDIsCisJCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCQlDQU5WQVNfQkxLTU9ERV9MSU5FQVIsIDAsIFZERUNfMSk7CisJCWNvbmZpZ19jYXZfbHV0X2V4KGluZGV4MmNhbnZhczEoaSkgJiAweGZmLAorCQkJYnVmX3N0YXJ0ICsKKwkJCWRlY2J1Zl9zaXplIC8gMiwgY2FudmFzX3dpZHRoLAorCQkJY2FudmFzX2hlaWdodCwgQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJQ0FOVkFTX0JMS01PREVfTElORUFSLCAwLCBWREVDXzEpOworCQljb25maWdfY2F2X2x1dF9leCgoaW5kZXgyY2FudmFzMShpKSA+PiA4KSAmIDB4ZmYsCisJCQlidWZfc3RhcnQgKworCQkJZGVjYnVmX3lfc2l6ZSArIGRlY2J1Zl91dl9zaXplIC8gMiwKKwkJCWNhbnZhc193aWR0aCAvIDIsIGNhbnZhc19oZWlnaHQgLyAyLAorCQkJQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJQ0FOVkFTX0JMS01PREVfTElORUFSLCAwLCBWREVDXzEpOworCQljb25maWdfY2F2X2x1dF9leCgoaW5kZXgyY2FudmFzMShpKSA+PiAxNikgJiAweGZmLAorCQkJYnVmX3N0YXJ0ICsKKwkJCWRlY2J1Zl95X3NpemUgKyBkZWNidWZfdXZfc2l6ZSArCisJCQlkZWNidWZfdXZfc2l6ZSAvIDIsIGNhbnZhc193aWR0aCAvIDIsCisJCQljYW52YXNfaGVpZ2h0IC8gMiwgQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJQ0FOVkFTX0JMS01PREVfTElORUFSLCAwLCBWREVDXzEpOworI2VuZGlmCisKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfc2NhbGVyKHZvaWQpCit7CisJLyogNCBwb2ludCB0cmlhbmdsZSAqLworCWNvbnN0IHVuc2lnbmVkIGludCBmaWx0X2NvZWZbXSA9IHsKKwkJMHgyMDQwMjAwMCwgMHgyMDQwMjAwMCwgMHgxZjNmMjEwMSwgMHgxZjNmMjEwMSwKKwkJMHgxZTNlMjIwMiwgMHgxZTNlMjIwMiwgMHgxZDNkMjMwMywgMHgxZDNkMjMwMywKKwkJMHgxYzNjMjQwNCwgMHgxYzNjMjQwNCwgMHgxYjNiMjUwNSwgMHgxYjNiMjUwNSwKKwkJMHgxYTNhMjYwNiwgMHgxYTNhMjYwNiwgMHgxOTM5MjcwNywgMHgxOTM5MjcwNywKKwkJMHgxODM4MjgwOCwgMHgxODM4MjgwOCwgMHgxNzM3MjkwOSwgMHgxNzM3MjkwOSwKKwkJMHgxNjM2MmEwYSwgMHgxNjM2MmEwYSwgMHgxNTM1MmIwYiwgMHgxNTM1MmIwYiwKKwkJMHgxNDM0MmMwYywgMHgxNDM0MmMwYywgMHgxMzMzMmQwZCwgMHgxMzMzMmQwZCwKKwkJMHgxMjMyMmUwZSwgMHgxMjMyMmUwZSwgMHgxMTMxMmYwZiwgMHgxMTMxMmYwZiwKKwkJMHgxMDMwMzAxMAorCX07CisJaW50IGk7CisKKwkvKiBwc2NhbGUgZW5hYmxlLCBQU0NBTEUgY2J1cyBibWVtIGVuYWJsZSAqLworCVdSSVRFX1ZSRUcoUFNDQUxFX0NUUkwsIDB4YzAwMCk7CisKKwkvKiB3cml0ZSBmaWx0ZXIgY29lZnMgKi8KKwlXUklURV9WUkVHKFBTQ0FMRV9CTUVNX0FERFIsIDApOworCWZvciAoaSA9IDA7IGkgPCAzMzsgaSsrKSB7CisJCVdSSVRFX1ZSRUcoUFNDQUxFX0JNRU1fREFULCAwKTsKKwkJV1JJVEVfVlJFRyhQU0NBTEVfQk1FTV9EQVQsIGZpbHRfY29lZltpXSk7CisJfQorCisJLyogWSBob3Jpem9udGFsIGluaXRpYWwgaW5mbyAqLworCVdSSVRFX1ZSRUcoUFNDQUxFX0JNRU1fQUREUiwgMzcgKiAyKTsKKwkvKiBbMzVdOiBidWYgcmVwZWF0IHBpeDAsCisJICogWzM0OjI5XSA9PiBidWYgcmVjZWl2ZSBudW0sCisJICogWzI4OjE2XSA9PiBidWYgYmxrIHgsCisJICogWzE1OjBdID0+IGJ1ZiBwaGFzZQorCSAqLworCVdSSVRFX1ZSRUcoUFNDQUxFX0JNRU1fREFULCAweDAwMDgpOworCVdSSVRFX1ZSRUcoUFNDQUxFX0JNRU1fREFULCAweDYwMDAwMDAwKTsKKworCS8qIEMgaG9yaXpvbnRhbCBpbml0aWFsIGluZm8gKi8KKwlXUklURV9WUkVHKFBTQ0FMRV9CTUVNX0FERFIsIDQxICogMik7CisJV1JJVEVfVlJFRyhQU0NBTEVfQk1FTV9EQVQsIDB4MDAwOCk7CisJV1JJVEVfVlJFRyhQU0NBTEVfQk1FTV9EQVQsIDB4NjAwMDAwMDApOworCisJLyogWSB2ZXJ0aWNhbCBpbml0aWFsIGluZm8gKi8KKwlXUklURV9WUkVHKFBTQ0FMRV9CTUVNX0FERFIsIDM5ICogMik7CisJV1JJVEVfVlJFRyhQU0NBTEVfQk1FTV9EQVQsIDB4MDAwOCk7CisJV1JJVEVfVlJFRyhQU0NBTEVfQk1FTV9EQVQsIDB4NjAwMDAwMDApOworCisJLyogQyB2ZXJ0aWNhbCBpbml0aWFsIGluZm8gKi8KKwlXUklURV9WUkVHKFBTQ0FMRV9CTUVNX0FERFIsIDQzICogMik7CisJV1JJVEVfVlJFRyhQU0NBTEVfQk1FTV9EQVQsIDB4MDAwOCk7CisJV1JJVEVfVlJFRyhQU0NBTEVfQk1FTV9EQVQsIDB4NjAwMDAwMDApOworCisJLyogWSBob3Jpem9udGFsIHBoYXNlIHN0ZXAgKi8KKwlXUklURV9WUkVHKFBTQ0FMRV9CTUVNX0FERFIsIDM2ICogMiArIDEpOworCS8qIFsxOTowXSA9PiBZIGhvcml6b250YWwgcGhhc2Ugc3RlcCAqLworCVdSSVRFX1ZSRUcoUFNDQUxFX0JNRU1fREFULCAweDEwMDAwKTsKKwkvKiBDIGhvcml6b250YWwgcGhhc2Ugc3RlcCAqLworCVdSSVRFX1ZSRUcoUFNDQUxFX0JNRU1fQUREUiwgNDAgKiAyICsgMSk7CisJLyogWzE5OjBdID0+IEMgaG9yaXpvbnRhbCBwaGFzZSBzdGVwICovCisJV1JJVEVfVlJFRyhQU0NBTEVfQk1FTV9EQVQsIDB4MTAwMDApOworCisJLyogWSB2ZXJ0aWNhbCBwaGFzZSBzdGVwICovCisJV1JJVEVfVlJFRyhQU0NBTEVfQk1FTV9BRERSLCAzOCAqIDIgKyAxKTsKKwkvKiBbMTk6MF0gPT4gWSB2ZXJ0aWNhbCBwaGFzZSBzdGVwICovCisJV1JJVEVfVlJFRyhQU0NBTEVfQk1FTV9EQVQsIDB4MTAwMDApOworCS8qIEMgdmVydGljYWwgcGhhc2Ugc3RlcCAqLworCVdSSVRFX1ZSRUcoUFNDQUxFX0JNRU1fQUREUiwgNDIgKiAyICsgMSk7CisJLyogWzE5OjBdID0+IEMgaG9yaXpvbnRhbCBwaGFzZSBzdGVwICovCisJV1JJVEVfVlJFRyhQU0NBTEVfQk1FTV9EQVQsIDB4MTAwMDApOworCisJLyogcmVzZXQgcHNjYWxlciAqLworI2lmIDEvKk1FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09ONiovCisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAoMSA8PCAxMCkpOworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgMCk7CisjZWxzZQorCVdSSVRFX1JFU0VUX1JFRyhSRVNFVDJfUkVHSVNURVIsIFJFU0VUX1BTQ0FMRSk7CisjZW5kaWYKKwlSRUFEX1JFU0VUX1JFRyhSRVNFVDJfUkVHSVNURVIpOworCVJFQURfUkVTRVRfUkVHKFJFU0VUMl9SRUdJU1RFUik7CisJUkVBRF9SRVNFVF9SRUcoUkVTRVQyX1JFR0lTVEVSKTsKKworCVdSSVRFX1ZSRUcoUFNDQUxFX1JTVCwgMHg3KTsKKwlXUklURV9WUkVHKFBTQ0FMRV9SU1QsIDB4MCk7Cit9CisKK3N0YXRpYyBpbnQgdm1qcGVnX3Byb3RfaW5pdCh2b2lkKQoreworCWludCByOworI2lmIDEvKk1FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09ONiovCisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAoMSA8PCA3KSB8ICgxIDw8IDYpKTsKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsIDApOworI2Vsc2UKKwlXUklURV9SRVNFVF9SRUcoUkVTRVQwX1JFR0lTVEVSLCBSRVNFVF9JUUlEQ1QgfCBSRVNFVF9NQyk7CisjZW5kaWYKKworCXIgPSB2bWpwZWdfY2FudmFzX2luaXQoKTsKKworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8wLCAxMik7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzEsIDB4MDMxYSk7CisjaWZkZWYgTlYyMQorCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF80LCAweDAxMDEwMCk7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzUsIDB4MDMwMzAyKTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfNiwgMHgwNTA1MDQpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF83LCAweDA3MDcwNik7CisjZWxzZQorCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF80LCAweDAyMDEwMCk7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzUsIDB4MDUwNDAzKTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfNiwgMHgwODA3MDYpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF83LCAweDBiMGEwOSk7CisjZW5kaWYKKwlpbml0X3NjYWxlcigpOworCisJLyogY2xlYXIgYnVmZmVyIElOL09VVCByZWdpc3RlcnMgKi8KKwlXUklURV9WUkVHKE1SRUdfVE9fQU1SSVNDLCAwKTsKKwlXUklURV9WUkVHKE1SRUdfRlJPTV9BTVJJU0MsIDApOworCisJV1JJVEVfVlJFRyhNQ1BVX0lOVFJfTVNLLCAweGZmZmYpOworCVdSSVRFX1ZSRUcoTVJFR19ERUNPREVfUEFSQU0sIChmcmFtZV9oZWlnaHQgPDwgNCkgfCAweDgwMDApOworCisJLyogY2xlYXIgbWFpbGJveCBpbnRlcnJ1cHQgKi8KKwlXUklURV9WUkVHKEFTU0lTVF9NQk9YMV9DTFJfUkVHLCAxKTsKKwkvKiBlbmFibGUgbWFpbGJveCBpbnRlcnJ1cHQgKi8KKwlXUklURV9WUkVHKEFTU0lTVF9NQk9YMV9NQVNLLCAxKTsKKwkvKiBzZXQgaW50ZXJydXB0IG1hcHBpbmcgZm9yIHZsZCAqLworCVdSSVRFX1ZSRUcoQVNTSVNUX0FNUjFfSU5UOCwgOCk7CisjaWYgMS8qTUVTT05fQ1BVX1RZUEUgPj0gTUVTT05fQ1BVX1RZUEVfTUVTT042Ki8KKyNpZmRlZiBOVjIxCisJU0VUX1ZSRUdfTUFTSyhNREVDX1BJQ19EQ19DVFJMLCAxIDw8IDE3KTsKKyNlbHNlCisJQ0xFQVJfVlJFR19NQVNLKE1ERUNfUElDX0RDX0NUUkwsIDEgPDwgMTcpOworI2VuZGlmCisjZW5kaWYKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCB2bWpwZWdfdmRlY19pbmZvX2luaXQodm9pZCkKK3sKKwlndnMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdmRlY19pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKE5VTEwgPT0gZ3ZzKSB7CisJCXByX2luZm8oInRoZSBzdHJ1Y3Qgb2YgdmRlYyBzdGF0dXMgbWFsbG9jIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZtanBlZ19sb2NhbF9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwlmcmFtZV93aWR0aCA9IHZtanBlZ19hbXN0cmVhbV9kZWNfaW5mby53aWR0aDsKKwlmcmFtZV9oZWlnaHQgPSB2bWpwZWdfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0OworCWZyYW1lX2R1ciA9IHZtanBlZ19hbXN0cmVhbV9kZWNfaW5mby5yYXRlOworCXNhdmVkX3Jlc29sdXRpb24gPSAwOworCWFtbG9nX2xldmVsKExPR19MRVZFTF9JTkZPLCAibWpwZWdkZWM6IHcoJWQpLCBoKCVkKSwgZHVyKCVkKVxuIiwKKwkJCQlmcmFtZV93aWR0aCwgZnJhbWVfaGVpZ2h0LCBmcmFtZV9kdXIpOworCisJZm9yIChpID0gMDsgaSA8IERFQ09ERV9CVUZGRVJfTlVNX01BWDsgaSsrKQorCQl2ZmJ1Zl91c2VbaV0gPSAwOworCisJSU5JVF9LRklGTyhkaXNwbGF5X3EpOworCUlOSVRfS0ZJRk8ocmVjeWNsZV9xKTsKKwlJTklUX0tGSUZPKG5ld2ZyYW1lX3EpOworCisJZm9yIChpID0gMDsgaSA8IFZGX1BPT0xfU0laRTsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqdmYgPSAmdmZwb29sW2ldOworCisJCXZmcG9vbFtpXS5pbmRleCA9IERFQ09ERV9CVUZGRVJfTlVNX01BWDsKKwkJa2ZpZm9fcHV0KCZuZXdmcmFtZV9xLCB2Zik7CisJfQorCWlmIChtbV9ibGtfaGFuZGxlKSB7CisJCWRlY29kZXJfYm1tdV9ib3hfZnJlZShtbV9ibGtfaGFuZGxlKTsKKwkJbW1fYmxrX2hhbmRsZSA9IE5VTEw7CisJfQorCisJbW1fYmxrX2hhbmRsZSA9IGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYm94KAorCQlEUklWRVJfTkFNRSwKKwkJMCwKKwkJTUFYX0JNTVVfQlVGRkVSX05VTSwKKwkJNCArIFBBR0VfU0hJRlQsCisJCUNPREVDX01NX0ZMQUdTX0NNQV9DTEVBUiB8CisJCUNPREVDX01NX0ZMQUdTX0ZPUl9WREVDT0RFUik7Cit9CisKK3N0YXRpYyBzMzIgdm1qcGVnX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gLTEsIHNpemUgPSAtMTsKKwljaGFyICpidWYgPSB2bWFsbG9jKDB4MTAwMCAqIDE2KTsKKworCWlmIChJU19FUlJfT1JfTlVMTChidWYpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRpbWVyX3NldHVwKCZyZWN5Y2xlX3RpbWVyLCB2bWpwZWdfcHV0X3RpbWVyX2Z1bmMsIDApOworCisJc3RhdCB8PSBTVEFUX1RJTUVSX0lOSVQ7CisKKwlhbXZkZWNfZW5hYmxlKCk7CisKKwl2bWpwZWdfbG9jYWxfaW5pdCgpOworCisJc2l6ZSA9IGdldF9maXJtd2FyZV9kYXRhKFZJREVPX0RFQ19NSlBFRywgYnVmKTsKKwlpZiAoc2l6ZSA8IDApIHsKKwkJYW12ZGVjX2Rpc2FibGUoKTsKKwkJcHJfZXJyKCJnZXQgZmlybXdhcmUgZmFpbC4iKTsKKwkJdmZyZWUoYnVmKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldCA9IGFtdmRlY19sb2FkbWNfZXgoVkZPUk1BVF9NSlBFRywgTlVMTCwgYnVmKTsKKwlpZiAocmV0IDwgMCkgeworCQlhbXZkZWNfZGlzYWJsZSgpOworCQl2ZnJlZShidWYpOworCQlwcl9lcnIoIk1KUEVHOiB0aGUgJXMgZncgbG9hZGluZyBmYWlsZWQsIGVycjogJXhcbiIsCisJCQl0ZWVfZW5hYmxlZCgpID8gIlRFRSIgOiAibG9jYWwiLCByZXQpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXZmcmVlKGJ1Zik7CisKKwlzdGF0IHw9IFNUQVRfTUNfTE9BRDsKKworCS8qIGVuYWJsZSBBTVJJU0Mgc2lkZSBwcm90b2NvbCAqLworCXJldCA9IHZtanBlZ19wcm90X2luaXQoKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHZkZWNfcmVxdWVzdF9pcnEoVkRFQ19JUlFfMSwgdm1qcGVnX2lzciwKKwkJCSJ2bWpwZWctaXJxIiwgKHZvaWQgKil2bWpwZWdfZGVjX2lkKTsKKworCWlmIChyZXQpIHsKKwkJYW12ZGVjX2Rpc2FibGUoKTsKKworCQlhbWxvZ19sZXZlbChMT0dfTEVWRUxfRVJST1IsICJ2bWpwZWcgaXJxIHJlZ2lzdGVyIGVycm9yLlxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXN0YXQgfD0gU1RBVF9JU1JfUkVHOworCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfUE9TVF9QUk9DRVNTX01BTkFHRVIKKwl2Zl9wcm92aWRlcl9pbml0KCZ2bWpwZWdfdmZfcHJvdiwgUFJPVklERVJfTkFNRSwgJnZtanBlZ192Zl9wcm92aWRlciwKKwkJCQkJIE5VTEwpOworCXZmX3JlZ19wcm92aWRlcigmdm1qcGVnX3ZmX3Byb3YpOworCXZmX25vdGlmeV9yZWNlaXZlcihQUk9WSURFUl9OQU1FLCBWRlJBTUVfRVZFTlRfUFJPVklERVJfU1RBUlQsIE5VTEwpOworI2Vsc2UKKwl2Zl9wcm92aWRlcl9pbml0KCZ2bWpwZWdfdmZfcHJvdiwgUFJPVklERVJfTkFNRSwgJnZtanBlZ192Zl9wcm92aWRlciwKKwkJCQkJIE5VTEwpOworCXZmX3JlZ19wcm92aWRlcigmdm1qcGVnX3ZmX3Byb3YpOworI2VuZGlmCisKKwlpZiAoIWlzX3Jlc2V0KQorCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoUFJPVklERVJfTkFNRSwKKwkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfRlJfSElOVCwKKwkJCQkodm9pZCAqKQorCQkJCSgodW5zaWduZWQgbG9uZyl2bWpwZWdfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSkpOworCisJc3RhdCB8PSBTVEFUX1ZGX0hPT0s7CisKKwlyZWN5Y2xlX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgUFVUX0lOVEVSVkFMOworCWFkZF90aW1lcigmcmVjeWNsZV90aW1lcik7CisKKwlzdGF0IHw9IFNUQVRfVElNRVJfQVJNOworCisJYW12ZGVjX3N0YXJ0KCk7CisKKwlzdGF0IHw9IFNUQVRfVkRFQ19SVU47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbXZkZWNfbWpwZWdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdmRlY19zICpwZGF0YSA9ICooc3RydWN0IHZkZWNfcyAqKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCW11dGV4X2xvY2soJnZtanBlZ19tdXRleCk7CisKKwlhbWxvZ19sZXZlbChMT0dfTEVWRUxfSU5GTywgImFtdmRlY19tanBlZyBwcm9iZSBzdGFydC5cbiIpOworCisJSU5JVF9XT1JLKCZzZXRfY2xrX3dvcmssIG1qcGVnX3NldF9jbGspOworCisJaWYgKHBkYXRhID09IE5VTEwpIHsKKwkJYW1sb2dfbGV2ZWwoTE9HX0xFVkVMX0VSUk9SLAorCQkJImFtdmRlY19tanBlZyBtZW1vcnkgcmVzb3VyY2UgdW5kZWZpbmVkLlxuIik7CisJCW11dGV4X3VubG9jaygmdm1qcGVnX211dGV4KTsKKworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAocGRhdGEtPnN5c19pbmZvKQorCQl2bWpwZWdfYW1zdHJlYW1fZGVjX2luZm8gPSAqcGRhdGEtPnN5c19pbmZvOworCisJcGRhdGEtPmRlY19zdGF0dXMgPSB2bWpwZWdfZGVjX3N0YXR1czsKKwlwZGF0YS0+c2V0X2lzcmVzZXQgPSB2bWpwZWdfc2V0X2lzcmVzZXQ7CisJaXNfcmVzZXQgPSAwOworCXZtanBlZ192ZGVjX2luZm9faW5pdCgpOworCisJaWYgKHZtanBlZ19pbml0KCkgPCAwKSB7CisJCWFtbG9nX2xldmVsKExPR19MRVZFTF9FUlJPUiwgImFtdmRlY19tanBlZyBpbml0IGZhaWxlZC5cbiIpOworCQltdXRleF91bmxvY2soJnZtanBlZ19tdXRleCk7CisJCWtmcmVlKGd2cyk7CisJCWd2cyA9IE5VTEw7CisJCXBkYXRhLT5kZWNfc3RhdHVzID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZ2bWpwZWdfbXV0ZXgpOworCisJYW1sb2dfbGV2ZWwoTE9HX0xFVkVMX0lORk8sICJhbXZkZWNfbWpwZWcgcHJvYmUgZW5kLlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbXZkZWNfbWpwZWdfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJbXV0ZXhfbG9jaygmdm1qcGVnX211dGV4KTsKKworCWNhbmNlbF93b3JrX3N5bmMoJnNldF9jbGtfd29yayk7CisKKwlpZiAoc3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJYW12ZGVjX3N0b3AoKTsKKwkJc3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwl9CisKKwlpZiAoc3RhdCAmIFNUQVRfSVNSX1JFRykgeworCQl2ZGVjX2ZyZWVfaXJxKFZERUNfSVJRXzEsICh2b2lkICopdm1qcGVnX2RlY19pZCk7CisJCXN0YXQgJj0gflNUQVRfSVNSX1JFRzsKKwl9CisKKwlpZiAoc3RhdCAmIFNUQVRfVElNRVJfQVJNKSB7CisJCWRlbF90aW1lcl9zeW5jKCZyZWN5Y2xlX3RpbWVyKTsKKwkJc3RhdCAmPSB+U1RBVF9USU1FUl9BUk07CisJfQorCisJaWYgKHN0YXQgJiBTVEFUX1ZGX0hPT0spIHsKKwkJaWYgKCFpc19yZXNldCkKKwkJCXZmX25vdGlmeV9yZWNlaXZlcihQUk9WSURFUl9OQU1FLAorCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfRlJfRU5EX0hJTlQsCisJCQkJCU5VTEwpOworCisJCXZmX3VucmVnX3Byb3ZpZGVyKCZ2bWpwZWdfdmZfcHJvdik7CisJCXN0YXQgJj0gflNUQVRfVkZfSE9PSzsKKwl9CisKKwlhbXZkZWNfZGlzYWJsZSgpOworCisJbXV0ZXhfdW5sb2NrKCZ2bWpwZWdfbXV0ZXgpOworCisJa2ZyZWUoZ3ZzKTsKKwlndnMgPSBOVUxMOworCisJaWYgKG1tX2Jsa19oYW5kbGUpIHsKKwkJZGVjb2Rlcl9ibW11X2JveF9mcmVlKG1tX2Jsa19oYW5kbGUpOworCQltbV9ibGtfaGFuZGxlID0gTlVMTDsKKwl9CisKKwlhbWxvZ19sZXZlbChMT0dfTEVWRUxfSU5GTywgImFtdmRlY19tanBlZyByZW1vdmUuXG4iKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYW12ZGVjX21qcGVnX2RyaXZlciA9IHsKKwkucHJvYmUgPSBhbXZkZWNfbWpwZWdfcHJvYmUsCisJLnJlbW92ZSA9IGFtdmRlY19tanBlZ19yZW1vdmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBhbXZkZWNfc3VzcGVuZCwKKwkucmVzdW1lID0gYW12ZGVjX3Jlc3VtZSwKKyNlbmRpZgorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJJVkVSX05BTUUsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBjb2RlY19wcm9maWxlX3QgYW12ZGVjX21qcGVnX3Byb2ZpbGUgPSB7CisJLm5hbWUgPSAibWpwZWciLAorCS5wcm9maWxlID0gIiIKK307CitzdGF0aWMgc3RydWN0IG1jb25maWcgbWpwZWdfY29uZmlnc1tdID0geworCU1DX1BVMzIoInN0YXQiLCAmc3RhdCksCit9Oworc3RhdGljIHN0cnVjdCBtY29uZmlnX25vZGUgbWpwZWdfbm9kZTsKKworc3RhdGljIGludCBfX2luaXQgYW12ZGVjX21qcGVnX2RyaXZlcl9pbml0X21vZHVsZSh2b2lkKQoreworCWFtbG9nX2xldmVsKExPR19MRVZFTF9JTkZPLCAiYW12ZGVjX21qcGVnIG1vZHVsZSBpbml0XG4iKTsKKworCWlmIChwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFtdmRlY19tanBlZ19kcml2ZXIpKSB7CisJCWFtbG9nX2xldmVsKExPR19MRVZFTF9FUlJPUiwKKwkJCSJmYWlsZWQgdG8gcmVnaXN0ZXIgYW12ZGVjX21qcGVnIGRyaXZlclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwl2Y29kZWNfcHJvZmlsZV9yZWdpc3RlcigmYW12ZGVjX21qcGVnX3Byb2ZpbGUpOworCUlOSVRfUkVHX05PREVfQ09ORklHUygibWVkaWEuZGVjb2RlciIsICZtanBlZ19ub2RlLAorCQkibWpwZWciLCBtanBlZ19jb25maWdzLCBDT05GSUdfRk9SX1JXKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFtdmRlY19tanBlZ19kcml2ZXJfcmVtb3ZlX21vZHVsZSh2b2lkKQoreworCWFtbG9nX2xldmVsKExPR19MRVZFTF9JTkZPLCAiYW12ZGVjX21qcGVnIG1vZHVsZSByZW1vdmUuXG4iKTsKKworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhbXZkZWNfbWpwZWdfZHJpdmVyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK21vZHVsZV9wYXJhbShzdGF0LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3RhdCwgIlxuIGFtdmRlY19tanBlZyBzdGF0XG4iKTsKKworbW9kdWxlX2luaXQoYW12ZGVjX21qcGVnX2RyaXZlcl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChhbXZkZWNfbWpwZWdfZHJpdmVyX3JlbW92ZV9tb2R1bGUpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFNTE9HSUMgTUpNUEVHIFZpZGVvIERlY29kZXIgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJUaW0gWWFvIDx0aW15YW9AYW1sb2dpYy5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvbWpwZWcvdm1qcGVnX211bHRpLmMgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvbWpwZWcvdm1qcGVnX211bHRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkN2RiZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9tanBlZy92bWpwZWdfbXVsdGkuYwpAQCAtMCwwICsxLDE4OTIgQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvYW1wb3J0cy92bWpwZWcuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZnJhbWVfc3luYy9wdHNzZXJ2Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy9hbXN0cmVhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY2FudmFzL2NhbnZhcy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdmZtL3ZmcmFtZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdmZtL3ZmcmFtZV9wcm92aWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdmZtL3ZmcmFtZV9yZWNlaXZlci5oPgorLy8jaW5jbHVkZSA8bGludXgvYW1sb2dpYy90ZWUuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L3RlZS5oPgorCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy92ZGVjX3JlZy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvcmVnaXN0ZXJzL3JlZ2lzdGVyLmg+CisjaW5jbHVkZSAiLi4vLi4vLi4vc3RyZWFtX2lucHV0L2FtcG9ydHMvYW1wb3J0c19wcml2LmgiCisjaW5jbHVkZSAiLi4vLi4vLi4vY29tbW9uL2NoaXBzL2RlY29kZXJfY3B1X3Zlcl9pbmZvLmgiCisKKyNpbmNsdWRlICIuLi91dGlscy92ZGVjX2lucHV0LmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvdmRlYy5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2FtdmRlYy5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2RlY29kZXJfbW11X2JveC5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2RlY29kZXJfYm1tdV9ib3guaCIKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvZGVjX21tLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jb2RlY19tbS9jb25maWdzLmg+CisjaW5jbHVkZSAiLi4vdXRpbHMvZmlybXdhcmUuaCIKKyNpbmNsdWRlICIuLi91dGlscy92ZGVjX3Y0bDJfYnVmZmVyX29wcy5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2NvbmZpZ19wYXJzZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS92NGwyLW1lbTJtZW0uaD4KKyNpbmNsdWRlICIuLi91dGlscy92ZGVjX2ZlYXR1cmUuaCIKKworI2RlZmluZSBNRU1fTkFNRSAiY29kZWNfbW1qcGVnIgorCisjZGVmaW5lIERSSVZFUl9OQU1FICJhbW12ZGVjX21qcGVnIgorI2RlZmluZSBDSEVDS19JTlRFUlZBTCAgICAgICAgKEhaLzEwMCkKKworLyogcHJvdG9jb2wgcmVnaXN0ZXIgdXNhZ2UKKyAqICAgIEFWX1NDUkFUQ0hfNCA6IGRlY29kZSBidWZmZXIgc3BlYworICogICAgQVZfU0NSQVRDSF81IDogZGVjb2RlIGJ1ZmZlciBpbmRleAorICovCisKKyNkZWZpbmUgTVJFR19ERUNPREVfUEFSQU0gICBBVl9TQ1JBVENIXzIJLyogYml0IDAtMzogcGljb19hZGRyX21vZGUgKi8KKy8qIGJpdCAxNS00OiByZWZlcmVuY2UgaGVpZ2h0ICovCisjZGVmaW5lIE1SRUdfVE9fQU1SSVNDICAgICAgQVZfU0NSQVRDSF84CisjZGVmaW5lIE1SRUdfRlJPTV9BTVJJU0MgICAgQVZfU0NSQVRDSF85CisjZGVmaW5lIE1SRUdfRlJBTUVfT0ZGU0VUICAgQVZfU0NSQVRDSF9BCisjZGVmaW5lIERFQ19TVEFUVVNfUkVHICAgICAgQVZfU0NSQVRDSF9GCisjZGVmaW5lIE1SRUdfUElDX1dJRFRIICAgICAgQVZfU0NSQVRDSF9CCisjZGVmaW5lIE1SRUdfUElDX0hFSUdIVCAgICAgQVZfU0NSQVRDSF9DCisjZGVmaW5lIERFQ09ERV9TVE9QX1BPUyAgICAgQVZfU0NSQVRDSF9LCisKKyNkZWZpbmUgUElDSU5GT19CVUZfSURYX01BU0sgICAgICAgIDB4MDAwNworI2RlZmluZSBQSUNJTkZPX0FWSTEgICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFBJQ0lORk9fSU5URVJMQUNFICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgUElDSU5GT19JTlRFUkxBQ0VfQVZJMV9CT1QgIDB4MDAxMAorI2RlZmluZSBQSUNJTkZPX0lOVEVSTEFDRV9GSVJTVCAgICAgMHgwMDEwCisKKyNkZWZpbmUgVkZfUE9PTF9TSVpFICAgICAgICAgIDY0CisjZGVmaW5lIERFQ09ERV9CVUZGRVJfTlVNX01BWAkJMTYKKyNkZWZpbmUgREVDT0RFX0JVRkZFUl9OVU1fREVGCQk0CisjZGVmaW5lIE1BWF9CTU1VX0JVRkZFUl9OVU0JCURFQ09ERV9CVUZGRVJfTlVNX01BWAorCisjZGVmaW5lIERFRkFVTFRfTUVNX1NJWkUJKDMyKlNaXzFNKQorc3RhdGljIGludCBkZWJ1Z19lbmFibGU7CitzdGF0aWMgdTMyIHVkZWJ1Z19mbGFnOworI2RlZmluZSBERUNPREVfSUQoaHcpIChod190b192ZGVjKGh3KS0+aWQpCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmFkcjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnZhbDsKKyNkZWZpbmUgVk1KUEVHX0RFVl9OVU0gICAgICAgIDkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X2RlY29kZV9pbnN0YW5jZV9udW0gPSBWTUpQRUdfREVWX05VTTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X3Byb2Nlc3NfdGltZVtWTUpQRUdfREVWX05VTV07CitzdGF0aWMgdW5zaWduZWQgaW50IGRlY29kZV90aW1lb3V0X3ZhbCA9IDIwMDsKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZtanBlZ192Zl9wZWVrKHZvaWQgKik7CitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2bWpwZWdfdmZfZ2V0KHZvaWQgKik7CitzdGF0aWMgdm9pZCB2bWpwZWdfdmZfcHV0KHN0cnVjdCB2ZnJhbWVfcyAqLCB2b2lkICopOworc3RhdGljIGludCB2bWpwZWdfdmZfc3RhdGVzKHN0cnVjdCB2ZnJhbWVfc3RhdGVzICpzdGF0ZXMsIHZvaWQgKik7CitzdGF0aWMgaW50IHZtanBlZ19ldmVudF9jYihpbnQgdHlwZSwgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKK3N0YXRpYyB2b2lkIHZtanBlZ193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgaW50IG5vdGlmeV92NGxfZW9zKHN0cnVjdCB2ZGVjX3MgKnZkZWMpOworc3RhdGljIGludCBwcmVfZGVjb2RlX2J1Zl9sZXZlbCA9IDB4ODAwOworc3RhdGljIGludCBzdGFydF9kZWNvZGVfYnVmX2xldmVsID0gMHgyMDAwOworc3RhdGljIHUzMiB3aXRob3V0X2Rpc3BsYXlfbW9kZTsKK3N0YXRpYyB1MzIgZHluYW1pY19idWZfbnVtX21hcmdpbjsKK3N0YXRpYyB1MzIgcnVuX3JlYWR5X21pbl9idWZfbnVtID0gMjsKKyN1bmRlZiBwcl9pbmZvCisjZGVmaW5lIHByX2luZm8gcHJpbnRrCit1bnNpZ25lZCBpbnQgbW1qcGVnX2RlYnVnX21hc2sgPSAweGZmOworI2RlZmluZSBQUklOVF9GTEFHX0VSUk9SICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgUFJJTlRfRkxBR19SVU5fRkxPVyAgICAgICAgICAgMFgwMDAxCisjZGVmaW5lIFBSSU5UX0ZMQUdfVElNRUlORk8gICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBQUklOVF9GTEFHX1VDT0RFX0RFVEFJTAkJICAweDAwMDQKKyNkZWZpbmUgUFJJTlRfRkxBR19WTERfREVUQUlMICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCAgICAgICAgIDB4MDAxMAorI2RlZmluZSBQUklOVF9GTEFHX0JVRkZFUl9ERVRBSUwgICAgICAweDAwMjAKKyNkZWZpbmUgUFJJTlRfRkxBR19SRVNUT1JFICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFBSSU5UX0ZSQU1FX05VTSAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBQUklOVF9GTEFHX0ZPUkNFX0RPTkUgICAgICAgICAweDAxMDAKKyNkZWZpbmUgUFJJTlRfRlJBTUVCQVNFX0RBVEEgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFBSSU5UX0ZMQUdfVElNRU9VVF9TVEFUVVMgICAgIDB4MTAwMAorI2RlZmluZSBQUklOVF9GTEFHX1Y0TF9ERVRBSUwgICAgICAgICAweDgwMDAKKyNkZWZpbmUgSUdOT1JFX1BBUkFNX0ZST01fQ09ORklHICAgICAgMHg4MDAwMDAwCisKK2ludCBtbWpwZWdfZGVidWdfcHJpbnQoaW50IGluZGV4LCBpbnQgZGVidWdfZmxhZywgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJaWYgKCgoZGVidWdfZW5hYmxlICYgZGVidWdfZmxhZykgJiYKKwkJKCgxIDw8IGluZGV4KSAmIG1tanBlZ19kZWJ1Z19tYXNrKSkKKwkJfHwgKGRlYnVnX2ZsYWcgPT0gUFJJTlRfRkxBR19FUlJPUikpIHsKKwkJdW5zaWduZWQgY2hhciAqYnVmID0ga3phbGxvYyg1MTIsIEdGUF9BVE9NSUMpOworCQlpbnQgbGVuID0gMDsKKwkJdmFfbGlzdCBhcmdzOworCisJCWlmICghYnVmKQorCQkJcmV0dXJuIDA7CisKKwkJdmFfc3RhcnQoYXJncywgZm10KTsKKwkJbGVuID0gc3ByaW50ZihidWYsICIlZDogIiwgaW5kZXgpOworCQl2c25wcmludGYoYnVmICsgbGVuLCA1MTItbGVuLCBmbXQsIGFyZ3MpOworCQlwcl9pbmZvKCIlcyIsIGJ1Zik7CisJCXZhX2VuZChhcmdzKTsKKwkJa2ZyZWUoYnVmKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIHZtanBlZ19kZWNfaWRbXSA9ICJ2bW1qcGVnLWRldiI7CisKKyNkZWZpbmUgUFJPVklERVJfTkFNRSAgICJ2ZGVjLm1qcGVnIgorc3RhdGljIGNvbnN0IHN0cnVjdCB2ZnJhbWVfb3BlcmF0aW9uc19zIHZmX3Byb3ZpZGVyX29wcyA9IHsKKwkucGVlayA9IHZtanBlZ192Zl9wZWVrLAorCS5nZXQgPSB2bWpwZWdfdmZfZ2V0LAorCS5wdXQgPSB2bWpwZWdfdmZfcHV0LAorCS5ldmVudF9jYiA9IHZtanBlZ19ldmVudF9jYiwKKwkudmZfc3RhdGVzID0gdm1qcGVnX3ZmX3N0YXRlcywKK307CisKKyNkZWZpbmUgREVDX1JFU1VMVF9OT05FICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVDX1JFU1VMVF9ET05FICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVDX1JFU1VMVF9BR0FJTiAgICAgICAgICAgIDIKKyNkZWZpbmUgREVDX1JFU1VMVF9FUlJPUiAgICAgICAgICAgIDMKKyNkZWZpbmUgREVDX1JFU1VMVF9GT1JDRV9FWElUICAgICAgIDQKKyNkZWZpbmUgREVDX1JFU1VMVF9FT1MgICAgICAgICAgICAgIDUKKyNkZWZpbmUgREVDX0RFQ09ERV9USU1FT1VUICAgICAgICAgMHgyMQorCisKK3N0cnVjdCBidWZmZXJfc3BlY19zIHsKKwl1bnNpZ25lZCBpbnQgeV9hZGRyOworCXVuc2lnbmVkIGludCB1X2FkZHI7CisJdW5zaWduZWQgaW50IHZfYWRkcjsKKworCWludCB5X2NhbnZhc19pbmRleDsKKwlpbnQgdV9jYW52YXNfaW5kZXg7CisJaW50IHZfY2FudmFzX2luZGV4OworCisJc3RydWN0IGNhbnZhc19jb25maWdfcyBjYW52YXNfY29uZmlnWzNdOworCXVuc2lnbmVkIGxvbmcgY21hX2FsbG9jX2FkZHI7CisJaW50IGNtYV9hbGxvY19jb3VudDsKKwl1bnNpZ25lZCBpbnQgYnVmX2FkcjsKKwl1bG9uZyB2NGxfcmVmX2J1Zl9hZGRyOworfTsKKworI2RlZmluZSBzcGVjMmNhbnZhcyh4KSAgXAorCSgoKHgpLT52X2NhbnZhc19pbmRleCA8PCAxNikgfCBcCisJICgoeCktPnVfY2FudmFzX2luZGV4IDw8IDgpICB8IFwKKwkgKCh4KS0+eV9jYW52YXNfaW5kZXggPDwgMCkpCisKK3N0cnVjdCB2ZGVjX21qcGVnX2h3X3MgeworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgbXV0ZXggdm1qcGVnX211dGV4OworCisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2OworCURFQ0xBUkVfS0ZJRk8obmV3ZnJhbWVfcSwgc3RydWN0IHZmcmFtZV9zICosIFZGX1BPT0xfU0laRSk7CisJREVDTEFSRV9LRklGTyhkaXNwbGF5X3EsIHN0cnVjdCB2ZnJhbWVfcyAqLCBWRl9QT09MX1NJWkUpOworCisJc3RydWN0IHZmcmFtZV9zIHZmcG9vbFtWRl9QT09MX1NJWkVdOworCXN0cnVjdCBidWZmZXJfc3BlY19zIGJ1ZmZlcl9zcGVjW0RFQ09ERV9CVUZGRVJfTlVNX01BWF07CisJczMyIHZmYnVmX3VzZVtERUNPREVfQlVGRkVSX05VTV9NQVhdOworCisJdTMyIGZyYW1lX3dpZHRoOworCXUzMiBmcmFtZV9oZWlnaHQ7CisJdTMyIGZyYW1lX2R1cjsKKwl1MzIgc2F2ZWRfcmVzb2x1dGlvbjsKKwl1OCBpbml0X2ZsYWc7CisJdTMyIHN0YXQ7CisJdTMyIGRlY19yZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBidWZfc3RhcnQ7CisJdTMyIGJ1Zl9zaXplOworCXZvaWQgKm1tX2Jsa19oYW5kbGU7CisJc3RydWN0IGRlY19zeXNpbmZvIHZtanBlZ19hbXN0cmVhbV9kZWNfaW5mbzsKKworCXN0cnVjdCB2ZnJhbWVfY2h1bmtfcyAqY2h1bms7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJdm9pZCAoKnZkZWNfY2IpKHN0cnVjdCB2ZGVjX3MgKiwgdm9pZCAqKTsKKwl2b2lkICp2ZGVjX2NiX2FyZzsKKwlzdHJ1Y3QgZmlybXdhcmVfcyAqZnc7CisJc3RydWN0IHRpbWVyX2xpc3QgY2hlY2tfdGltZXI7CisJdTMyIGRlY29kZV90aW1lb3V0X2NvdW50OworCXUzMiBzdGFydF9wcm9jZXNzX3RpbWU7CisJdTMyIGxhc3RfdmxkX2xldmVsOworCXU4IGVvczsKKwl1MzIgZnJhbWVfbnVtOworCXUzMiBwdXRfbnVtOworCXUzMiBydW5fY291bnQ7CisJdTMyCW5vdF9ydW5fcmVhZHk7CisJdTMyIGJ1ZmZlcl9ub3RfcmVhZHk7CisJdTMyCWlucHV0X2VtcHR5OworCXUzMiBwZWVrX251bTsKKwl1MzIgZ2V0X251bTsKKwlib29sIGlzX3VzZWRfdjRsOworCXZvaWQgKnY0bDJfY3R4OworCWJvb2wgdjRsX3BhcmFtc19wYXJzZWQ7CisJaW50IGJ1Zl9udW07CisJaW50IGR5bmFtaWNfYnVmX251bV9tYXJnaW47CisJaW50IHNpZGViaW5kX3R5cGU7CisJaW50IHNpZGViaW5kX2NoYW5uZWxfaWQ7CisJdTMyIHJlc19jaF9mbGFnOworCXUzMiBjYW52YXNfbW9kZTsKKwl1MzIgY2FudmFzX2VuZGlhbjsKKwl1bG9uZyBmYl90b2tlbjsKKwljaGFyIHZkZWNfbmFtZVszMl07CisJY2hhciBwdHNfbmFtZVszMl07CisJY2hhciBuZXdfcV9uYW1lWzMyXTsKKwljaGFyIGRpc3BfcV9uYW1lWzMyXTsKK307CisKK3N0YXRpYyB2b2lkIHJlc2V0X3Byb2Nlc3NfdGltZShzdHJ1Y3QgdmRlY19tanBlZ19od19zICpodyk7CitzdGF0aWMgaW50IG5vdGlmeV92NGxfZW9zKHN0cnVjdCB2ZGVjX3MgKnZkZWMpOworCitzdGF0aWMgdm9pZCBzZXRfZnJhbWVfaW5mbyhzdHJ1Y3QgdmRlY19tanBlZ19od19zICpodywgc3RydWN0IHZmcmFtZV9zICp2ZikKK3sKKwl1MzIgdGVtcDsKKwl0ZW1wID0gUkVBRF9WUkVHKE1SRUdfUElDX1dJRFRIKTsKKwlpZiAodGVtcCA+IDE5MjApCisJCXZmLT53aWR0aCA9IGh3LT5mcmFtZV93aWR0aCA9IDE5MjA7CisJZWxzZSBpZiAodGVtcCA+IDApCisJCXZmLT53aWR0aCA9IGh3LT5mcmFtZV93aWR0aCA9IHRlbXA7CisJdGVtcCA9IFJFQURfVlJFRyhNUkVHX1BJQ19IRUlHSFQpOworCWlmICh0ZW1wID4gMTA4OCkKKwkJdmYtPmhlaWdodCA9IGh3LT5mcmFtZV9oZWlnaHQgPSAxMDg4OworCWVsc2UgaWYgKHRlbXAgPiAwKQorCQl2Zi0+aGVpZ2h0ID0gaHctPmZyYW1lX2hlaWdodCA9IHRlbXA7CisJdmYtPmR1cmF0aW9uID0gaHctPmZyYW1lX2R1cjsKKwl2Zi0+cmF0aW9fY29udHJvbCA9IERJU1BfUkFUSU9fQVNQRUNUX1JBVElPX01BWCA8PCBESVNQX1JBVElPX0FTUEVDVF9SQVRJT19CSVQ7CisJdmYtPnNhcl93aWR0aCA9IDE7CisJdmYtPnNhcl9oZWlnaHQgPSAxOworCXZmLT5kdXJhdGlvbl9wdWxsZG93biA9IDA7CisJdmYtPmZsYWcgPSAwOworCisJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0gLTE7CisJdmYtPnBsYW5lX251bSA9IDM7CisKKwl2Zi0+Y2FudmFzMF9jb25maWdbMF0gPSBody0+YnVmZmVyX3NwZWNbdmYtPmluZGV4XS5jYW52YXNfY29uZmlnWzBdOworCXZmLT5jYW52YXMwX2NvbmZpZ1sxXSA9IGh3LT5idWZmZXJfc3BlY1t2Zi0+aW5kZXhdLmNhbnZhc19jb25maWdbMV07CisJdmYtPmNhbnZhczBfY29uZmlnWzJdID0gaHctPmJ1ZmZlcl9zcGVjW3ZmLT5pbmRleF0uY2FudmFzX2NvbmZpZ1syXTsKKworCXZmLT5jYW52YXMxX2NvbmZpZ1swXSA9IGh3LT5idWZmZXJfc3BlY1t2Zi0+aW5kZXhdLmNhbnZhc19jb25maWdbMF07CisJdmYtPmNhbnZhczFfY29uZmlnWzFdID0gaHctPmJ1ZmZlcl9zcGVjW3ZmLT5pbmRleF0uY2FudmFzX2NvbmZpZ1sxXTsKKwl2Zi0+Y2FudmFzMV9jb25maWdbMl0gPSBody0+YnVmZmVyX3NwZWNbdmYtPmluZGV4XS5jYW52YXNfY29uZmlnWzJdOworCisJdmYtPnNpZGViaW5kX3R5cGUgPSBody0+c2lkZWJpbmRfdHlwZTsKKwl2Zi0+c2lkZWJpbmRfY2hhbm5lbF9pZCA9IGh3LT5zaWRlYmluZF9jaGFubmVsX2lkOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgdm1qcGVnX2lzcihzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgaXJxKQoreworCXN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKmh3ID0KKwkJKHN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKikodmRlYy0+cHJpdmF0ZSk7CisKKwlpZiAoIWh3KQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwlpZiAoaHctPmVvcykKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfQ0xSX1JFRywgMSk7CisKKwlyZXR1cm4gSVJRX1dBS0VfVEhSRUFEOworfQorCitzdGF0aWMgaW50IHZtanBlZ19nZXRfcHNfaW5mbyhzdHJ1Y3QgdmRlY19tanBlZ19od19zICpodywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBzdHJ1Y3QgYW1sX3ZkZWNfcHNfaW5mb3MgKnBzKQoreworCXBzLT52aXNpYmxlX3dpZHRoCT0gd2lkdGg7CisJcHMtPnZpc2libGVfaGVpZ2h0CT0gaGVpZ2h0OworCXBzLT5jb2RlZF93aWR0aAkJPSBBTElHTih3aWR0aCwgNjQpOworCXBzLT5jb2RlZF9oZWlnaHQgCT0gQUxJR04oaGVpZ2h0LCA2NCk7CisJcHMtPmRwYl9zaXplIAkJPSBody0+YnVmX251bTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHY0bF9yZXNfY2hhbmdlKHN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKmh3LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShody0+djRsMl9jdHgpOworCWludCByZXQgPSAwOworCisJaWYgKGN0eC0+cGFyYW1fc2V0c19mcm9tX3Vjb2RlICYmCisJCWh3LT5yZXNfY2hfZmxhZyA9PSAwKSB7CisJCXN0cnVjdCBhbWxfdmRlY19wc19pbmZvcyBwczsKKworCQlpZiAoKGh3LT5mcmFtZV93aWR0aCAhPSAwICYmCisJCQlody0+ZnJhbWVfaGVpZ2h0ICE9IDApICYmCisJCQkoaHctPmZyYW1lX3dpZHRoICE9IHdpZHRoIHx8CisJCQlody0+ZnJhbWVfaGVpZ2h0ICE9IGhlaWdodCkpIHsKKwkJCW1tanBlZ19kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJCSJ2NGxfcmVzX2NoYW5nZSBQaWMgV2lkdGgvSGVpZ2h0IENoYW5nZSAoJWQsJWQpPT4oJWQsJWQpXG4iLAorCQkJCWh3LT5mcmFtZV93aWR0aCwgaHctPmZyYW1lX2hlaWdodCwKKwkJCQl3aWR0aCwKKwkJCQloZWlnaHQpOworCQkJdm1qcGVnX2dldF9wc19pbmZvKGh3LCB3aWR0aCwgaGVpZ2h0LCAmcHMpOworCQkJdmRlY192NGxfc2V0X3BzX2luZm9zKGN0eCwgJnBzKTsKKwkJCXZkZWNfdjRsX3Jlc19jaF9ldmVudChjdHgpOworCQkJaHctPnY0bF9wYXJhbXNfcGFyc2VkID0gZmFsc2U7CisJCQlody0+cmVzX2NoX2ZsYWcgPSAxOworCQkJY3R4LT52NGxfcmVzb2x1dGlvbl9jaGFuZ2UgPSAxOworCQkJaHctPmVvcyA9IDE7CisJCQlpZiAoaHctPmlzX3VzZWRfdjRsKQorCQkJCW5vdGlmeV92NGxfZW9zKGh3X3RvX3ZkZWMoaHcpKTsKKworCQkJcmV0ID0gMTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB2bWpwZWdfaXNyX3RocmVhZF9mbihzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgaXJxKQoreworCXN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKikodmRlYy0+cHJpdmF0ZSk7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICogdjRsMl9jdHggPSBody0+djRsMl9jdHg7CisJc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKmZiID0gTlVMTDsKKwl1MzIgcmVnOworCXN0cnVjdCB2ZnJhbWVfcyAqdmYgPSBOVUxMOworCXUzMiBpbmRleCwgb2Zmc2V0ID0gMCwgcHRzOworCXU2NCBwdHNfdXM2NDsKKwl1MzIgZnJhbWVfc2l6ZTsKKworCWlmIChSRUFEX1ZSRUcoQVZfU0NSQVRDSF9EKSAhPSAwICYmCisJCShkZWJ1Z19lbmFibGUgJiBQUklOVF9GTEFHX1VDT0RFX0RFVEFJTCkpIHsKKwkJcHJfaW5mbygiZGJnJXg6ICV4XG4iLCBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9EKSwKKwkJUkVBRF9WUkVHKEFWX1NDUkFUQ0hfRSkpOworCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfRCwgMCk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAoUkVBRF9WUkVHKERFQ19TVEFUVVNfUkVHKSA9PSAxKSB7CisJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCWludCBmcmFtZV93aWR0aCA9IFJFQURfVlJFRyhNUkVHX1BJQ19XSURUSCk7CisJCQlpbnQgZnJhbWVfaGVpZ2h0ID0gUkVBRF9WUkVHKE1SRUdfUElDX0hFSUdIVCk7CisKKwkJCWlmICghdjRsX3Jlc19jaGFuZ2UoaHcsIGZyYW1lX3dpZHRoLCBmcmFtZV9oZWlnaHQpKSB7CisJCQkJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisJCQkJaWYgKGN0eC0+cGFyYW1fc2V0c19mcm9tX3Vjb2RlICYmICFody0+djRsX3BhcmFtc19wYXJzZWQpIHsKKwkJCQkJc3RydWN0IGFtbF92ZGVjX3BzX2luZm9zIHBzOworCisJCQkJCXZtanBlZ19nZXRfcHNfaW5mbyhodywgZnJhbWVfd2lkdGgsIGZyYW1lX2hlaWdodCwgJnBzKTsKKwkJCQkJaHctPnY0bF9wYXJhbXNfcGFyc2VkID0gdHJ1ZTsKKwkJCQkJdmRlY192NGxfc2V0X3BzX2luZm9zKGN0eCwgJnBzKTsKKwkJCQkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwkJCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0FHQUlOOworCQkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCQl9IGVsc2UgeworCQkJCQlXUklURV9WUkVHKERFQ19TVEFUVVNfUkVHLCAwKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisJCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0FHQUlOOworCQkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJfQorCQl9IGVsc2UKKwkJCVdSSVRFX1ZSRUcoREVDX1NUQVRVU19SRUcsIDApOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisKKwlyZWcgPSBSRUFEX1ZSRUcoTVJFR19GUk9NX0FNUklTQyk7CisJaW5kZXggPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF81KSAmIDB4ZmZmZmZmOworCisJaWYgKGluZGV4ID49IGh3LT5idWZfbnVtKSB7CisJCXByX2VycigiZmF0YWwgZXJyb3IsIGludmFsaWQgYnVmZmVyIGluZGV4LiIpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKGtmaWZvX2dldCgmaHctPm5ld2ZyYW1lX3EsICZ2ZikgPT0gMCkgeworCQlwcl9pbmZvKAorCQkiZmF0YWwgZXJyb3IsIG5vIGF2YWlsYWJsZSBidWZmZXIgc2xvdC4iKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJdmYtPnY0bF9tZW1faGFuZGxlCisJCQk9IGh3LT5idWZmZXJfc3BlY1tpbmRleF0udjRsX3JlZl9idWZfYWRkcjsKKwkJZmIgPSAoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKil2Zi0+djRsX21lbV9oYW5kbGU7CisJCW1tanBlZ19kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1Y0TF9ERVRBSUwsCisJCQkiWyVkXSAlcygpLCB2NGwgbWVtIGhhbmRsZTogMHglbHhcbiIsCisJCQkoKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShody0+djRsMl9jdHgpKS0+aWQsCisJCQlfX2Z1bmNfXywgdmYtPnY0bF9tZW1faGFuZGxlKTsKKwl9CisKKwl2Zi0+aW5kZXggPSBpbmRleDsKKwlzZXRfZnJhbWVfaW5mbyhodywgdmYpOworCisJdmYtPnR5cGUgPSBWSURUWVBFX1BST0dSRVNTSVZFIHwgVklEVFlQRV9WSVVfRklFTEQ7CisJLyogdmYtPnB0cyA9IChwdHNfdmFsaWQpID8gcHRzIDogMDsgKi8KKwkvKiB2Zi0+cHRzX3VzNjQgPSAocHRzX3ZhbGlkKSA/IHB0c191czY0IDogMDsgKi8KKworCWlmIChody0+Y2h1bmspIHsKKwkJdmYtPnB0cyA9IGh3LT5jaHVuay0+cHRzOworCQl2Zi0+cHRzX3VzNjQgPSBody0+Y2h1bmstPnB0czY0OworCQl2Zi0+dGltZXN0YW1wID0gaHctPmNodW5rLT50aW1lc3RhbXA7CisJfSBlbHNlIHsKKwkJb2Zmc2V0ID0gUkVBRF9WUkVHKE1SRUdfRlJBTUVfT0ZGU0VUKTsKKwkJaWYgKCh2ZGVjLT52YnVmLm5vX3BhcnNlciA9PSAwKSB8fCAodmRlYy0+dmJ1Zi51c2VfcHRzc2VydikpIHsKKwkJCWlmIChwdHNfbG9va3VwX29mZnNldF91czY0CisJCQkJKFBUU19UWVBFX1ZJREVPLCBvZmZzZXQsICZwdHMsCisJCQkJJmZyYW1lX3NpemUsIDMwMDAsCisJCQkJJnB0c191czY0KSA9PSAwKSB7CisJCQkJdmYtPnB0cyA9IHB0czsKKwkJCQl2Zi0+cHRzX3VzNjQgPSBwdHNfdXM2NDsKKwkJCX0gZWxzZSB7CisJCQkJdmYtPnB0cyA9IDA7CisJCQkJdmYtPnB0c191czY0ID0gMDsKKwkJCX0KKwkJfQorCQlpZiAoIXZkZWMtPnZidWYudXNlX3B0c3NlcnYgJiYgdmRlY19zdHJlYW1fYmFzZWQodmRlYykpIHsKKwkJCXZmLT5wdHNfdXM2NCA9IG9mZnNldDsKKwkJCXZmLT5wdHMgPSAwOworCQl9CisJfQorCXZmLT5vcmllbnRhdGlvbiA9IDA7CisJaHctPnZmYnVmX3VzZVtpbmRleF0rKzsKKworCXZmLT5tZW1faGFuZGxlID0KKwkJZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCWh3LT5tbV9ibGtfaGFuZGxlLCBpbmRleCk7CisJZGVjb2Rlcl9kb19mcmFtZV9jaGVjayh2ZGVjLCB2Zik7CisJdmRlY192ZnJhbWVfcmVhZHkodmRlYywgdmYpOworCWtmaWZvX3B1dCgmaHctPmRpc3BsYXlfcSwgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwlBVFJBQ0VfQ09VTlRFUihody0+cHRzX25hbWUsIHZmLT5wdHMpOworCUFUUkFDRV9DT1VOVEVSKGh3LT5uZXdfcV9uYW1lLCBrZmlmb19sZW4oJmh3LT5uZXdmcmFtZV9xKSk7CisJQVRSQUNFX0NPVU5URVIoaHctPmRpc3BfcV9uYW1lLCBrZmlmb19sZW4oJmh3LT5kaXNwbGF5X3EpKTsKKwlody0+ZnJhbWVfbnVtKys7CisJbW1qcGVnX2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZSQU1FX05VTSwKKwkJIiVzOmZyYW1lIG51bTolZCxwdHM9JWQscHRzNjQ9JWxsZC4gZHVyPSVkXG4iLAorCV9fZnVuY19fLCBody0+ZnJhbWVfbnVtLAorCXZmLT5wdHMsIHZmLT5wdHNfdXM2NCwgdmYtPmR1cmF0aW9uKTsKKwl2ZGVjLT52ZGVjX2Zwc19kZXRlYyh2ZGVjLT5pZCk7CisJaWYgKHdpdGhvdXRfZGlzcGxheV9tb2RlID09IDApIHsKKwkJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQkJaWYgKHY0bDJfY3R4LT5pc19zdHJlYW1fb2ZmKSB7CisJCQkJdm1qcGVnX3ZmX3B1dCh2bWpwZWdfdmZfZ2V0KHZkZWMpLCB2ZGVjKTsKKwkJCX0gZWxzZSB7CisJCQkJZmItPnRhc2stPnN1Ym1pdChmYi0+dGFzaywgVEFTS19UWVBFX0RFQyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIodmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1ZGUkFNRV9SRUFEWSwKKwkJCQkJTlVMTCk7CisJCX0KKwl9IGVsc2UKKwkJdm1qcGVnX3ZmX3B1dCh2bWpwZWdfdmZfZ2V0KHZkZWMpLCB2ZGVjKTsKKworCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworCisJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgdmFsaWRfdmZfY2hlY2soc3RydWN0IHZmcmFtZV9zICp2Ziwgc3RydWN0IHZkZWNfbWpwZWdfaHdfcyAqaHcpCit7CisJaW50IGk7CisKKwlpZiAoIXZmIHx8ICh2Zi0+aW5kZXggPT0gLTEpKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBWRl9QT09MX1NJWkU7IGkrKykgeworCQlpZiAodmYgPT0gJmh3LT52ZnBvb2xbaV0pCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyAqdm1qcGVnX3ZmX3BlZWsodm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCB2ZnJhbWVfcyAqdmY7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IG9wX2FyZzsKKwlzdHJ1Y3QgdmRlY19tanBlZ19od19zICpodyA9IChzdHJ1Y3QgdmRlY19tanBlZ19od19zICopdmRlYy0+cHJpdmF0ZTsKKworCWlmICghaHcpCisJCXJldHVybiBOVUxMOworCWh3LT5wZWVrX251bSsrOworCisJaWYgKGtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSkgPiBWRl9QT09MX1NJWkUpIHsKKwkJbW1qcGVnX2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfUlVOX0ZMT1csCisJCQkia2ZpZm8gbGVuOiVkIGludmFpbGQsIHBlZWsgZXJyb3JcbiIsCisJCQlrZmlmb19sZW4oJmh3LT5kaXNwbGF5X3EpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGtmaWZvX3BlZWsoJmh3LT5kaXNwbGF5X3EsICZ2ZikpCisJCXJldHVybiB2ZjsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2bWpwZWdfdmZfZ2V0KHZvaWQgKm9wX2FyZykKK3sKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBvcF9hcmc7CisJc3RydWN0IHZkZWNfbWpwZWdfaHdfcyAqaHcgPSAoc3RydWN0IHZkZWNfbWpwZWdfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisKKwlpZiAoIWh3KQorCQlyZXR1cm4gTlVMTDsKKwlody0+Z2V0X251bSsrOworCWlmIChrZmlmb19nZXQoJmh3LT5kaXNwbGF5X3EsICZ2ZikpIHsKKwkJQVRSQUNFX0NPVU5URVIoaHctPmRpc3BfcV9uYW1lLCBrZmlmb19sZW4oJmh3LT5kaXNwbGF5X3EpKTsKKwkJcmV0dXJuIHZmOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgdm1qcGVnX3ZmX3B1dChzdHJ1Y3QgdmZyYW1lX3MgKnZmLCB2b2lkICpvcF9hcmcpCit7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IG9wX2FyZzsKKwlzdHJ1Y3QgdmRlY19tanBlZ19od19zICpodyA9IChzdHJ1Y3QgdmRlY19tanBlZ19od19zICopdmRlYy0+cHJpdmF0ZTsKKworCWlmICghdmFsaWRfdmZfY2hlY2sodmYsIGh3KSkgeworCQltbWpwZWdfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19FUlJPUiwKKwkJCSJpbnZhbGlkIHZmOiAlbHhcbiIsICh1bG9uZyl2Zik7CisJCXJldHVybiA7CisJfQorCisJbW1qcGVnX2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZSQU1FX05VTSwKKwkJIiVzOnB1dF9udW06JWRcbiIsIF9fZnVuY19fLCBody0+cHV0X251bSk7CisJaHctPnZmYnVmX3VzZVt2Zi0+aW5kZXhdLS07CisJa2ZpZm9fcHV0KCZody0+bmV3ZnJhbWVfcSwgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwlBVFJBQ0VfQ09VTlRFUihody0+bmV3X3FfbmFtZSwga2ZpZm9fbGVuKCZody0+bmV3ZnJhbWVfcSkpOworCWh3LT5wdXRfbnVtKys7Cit9CisKK3N0YXRpYyBpbnQgdm1qcGVnX2V2ZW50X2NiKGludCB0eXBlLCB2b2lkICpkYXRhLCB2b2lkICpvcF9hcmcpCit7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IG9wX2FyZzsKKworCWlmICh0eXBlICYgVkZSQU1FX0VWRU5UX1JFQ0VJVkVSX1JFUV9TVEFURSkgeworCQlzdHJ1Y3QgcHJvdmlkZXJfc3RhdGVfcmVxX3MgKnJlcSA9CisJCQkoc3RydWN0IHByb3ZpZGVyX3N0YXRlX3JlcV9zICopZGF0YTsKKwkJaWYgKHJlcS0+cmVxX3R5cGUgPT0gUkVRX1NUQVRFX1NFQ1VSRSkKKwkJCXJlcS0+cmVxX3Jlc3VsdFswXSA9IHZkZWNfc2VjdXJlKHZkZWMpOworCQllbHNlCisJCQlyZXEtPnJlcV9yZXN1bHRbMF0gPSAweGZmZmZmZmZmOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZtanBlZ192Zl9zdGF0ZXMoc3RydWN0IHZmcmFtZV9zdGF0ZXMgKnN0YXRlcywgdm9pZCAqb3BfYXJnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IG9wX2FyZzsKKwlzdHJ1Y3QgdmRlY19tanBlZ19od19zICpodyA9IChzdHJ1Y3QgdmRlY19tanBlZ19od19zICopdmRlYy0+cHJpdmF0ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZody0+bG9jaywgZmxhZ3MpOworCisJc3RhdGVzLT52Zl9wb29sX3NpemUgPSBWRl9QT09MX1NJWkU7CisJc3RhdGVzLT5idWZfZnJlZV9udW0gPSBrZmlmb19sZW4oJmh3LT5uZXdmcmFtZV9xKTsKKwlzdGF0ZXMtPmJ1Zl9hdmFpbF9udW0gPSBrZmlmb19sZW4oJmh3LT5kaXNwbGF5X3EpOworCXN0YXRlcy0+YnVmX3JlY3ljbGVfbnVtID0gMDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bWpwZWdfZGVjX3N0YXR1cyhzdHJ1Y3QgdmRlY19zICp2ZGVjLCBzdHJ1Y3QgdmRlY19pbmZvICp2c3RhdHVzKQoreworCXN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKil2ZGVjLT5wcml2YXRlOworCisJaWYgKCFodykKKwkJcmV0dXJuIC0xOworCisJdnN0YXR1cy0+ZnJhbWVfd2lkdGggPSBody0+ZnJhbWVfd2lkdGg7CisJdnN0YXR1cy0+ZnJhbWVfaGVpZ2h0ID0gaHctPmZyYW1lX2hlaWdodDsKKwlpZiAoMCAhPSBody0+ZnJhbWVfZHVyKQorCQl2c3RhdHVzLT5mcmFtZV9yYXRlID0gOTYwMDAgLyBody0+ZnJhbWVfZHVyOworCWVsc2UKKwkJdnN0YXR1cy0+ZnJhbWVfcmF0ZSA9IDk2MDAwOworCXZzdGF0dXMtPmVycm9yX2NvdW50ID0gMDsKKwl2c3RhdHVzLT5zdGF0dXMgPSBody0+c3RhdDsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHZtanBlZ19jYW52YXNfaW5pdChzdHJ1Y3QgdmRlY19tanBlZ19od19zICpodykKK3sKKwlpbnQgaSwgcmV0OworCXUzMiBjYW52YXNfd2lkdGgsIGNhbnZhc19oZWlnaHQ7CisJdTMyIGRlY2J1Zl9zaXplLCBkZWNidWZfeV9zaXplLCBkZWNidWZfdXZfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGJ1Zl9zdGFydCwgYWRkcjsKKwl1MzIgZW5kaWFuOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGh3KTsKKworCWVuZGlhbiA9ICh2ZGVjLT5jYW52YXNfbW9kZSA9PQorCQlDQU5WQVNfQkxLTU9ERV9MSU5FQVIpID8gNyA6IDA7CisJY2FudmFzX3dpZHRoID0gMTkyMDsKKwljYW52YXNfaGVpZ2h0ID0gMTA4ODsKKwlkZWNidWZfeV9zaXplID0gMHgyMDAwMDA7CisJZGVjYnVmX3V2X3NpemUgPSAweDgwMDAwOworCWRlY2J1Zl9zaXplID0gMHgzMDAwMDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgaHctPmJ1Zl9udW07IGkrKykgeworCQlpbnQgY2FudmFzOworCisJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgeworCQkJcmV0ID0gZGVjb2Rlcl9ibW11X2JveF9hbGxvY19idWZfcGh5KGh3LT5tbV9ibGtfaGFuZGxlLCBpLAorCQkJCQlkZWNidWZfc2l6ZSwgRFJJVkVSX05BTUUsICZidWZfc3RhcnQpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlwcl9lcnIoIkNNQSBhbGxvYyBmYWlsZWQhIHNpemUgMHglZCAgaWR4ICVkXG4iLAorCQkJCQlkZWNidWZfc2l6ZSwgaSk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLmJ1Zl9hZHIgPSBidWZfc3RhcnQ7CisJCWFkZHIgPSBody0+YnVmZmVyX3NwZWNbaV0uYnVmX2FkcjsKKworCQlody0+YnVmZmVyX3NwZWNbaV0ueV9hZGRyID0gYWRkcjsKKwkJYWRkciArPSBkZWNidWZfeV9zaXplOworCQlody0+YnVmZmVyX3NwZWNbaV0udV9hZGRyID0gYWRkcjsKKwkJYWRkciArPSBkZWNidWZfdXZfc2l6ZTsKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZfYWRkciA9IGFkZHI7CisKKwkJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCQlpZiAoaHctPmJ1ZmZlcl9zcGVjW2ldLnlfY2FudmFzX2luZGV4ID09IC0xKQorCQkJCWh3LT5idWZmZXJfc3BlY1tpXS55X2NhbnZhc19pbmRleCA9IHZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX1ZERUNfMSwgdmRlYy0+aWQpOworCQkJaWYgKGh3LT5idWZmZXJfc3BlY1tpXS51X2NhbnZhc19pbmRleCA9PSAtMSkKKwkJCQlody0+YnVmZmVyX3NwZWNbaV0udV9jYW52YXNfaW5kZXggPSB2ZGVjLT5nZXRfY2FudmFzX2V4KENPUkVfTUFTS19WREVDXzEsIHZkZWMtPmlkKTsKKwkJCWlmIChody0+YnVmZmVyX3NwZWNbaV0udl9jYW52YXNfaW5kZXggPT0gLTEpCisJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZfY2FudmFzX2luZGV4ID0gdmRlYy0+Z2V0X2NhbnZhc19leChDT1JFX01BU0tfVkRFQ18xLCB2ZGVjLT5pZCk7CisJCX0gZWxzZSB7CisJCQljYW52YXMgPSB2ZGVjLT5nZXRfY2FudmFzKGksIDMpOworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnlfY2FudmFzX2luZGV4ID0gY2FudmFzX3koY2FudmFzKTsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS51X2NhbnZhc19pbmRleCA9IGNhbnZhc191KGNhbnZhcyk7CisJCQlody0+YnVmZmVyX3NwZWNbaV0udl9jYW52YXNfaW5kZXggPSBjYW52YXNfdihjYW52YXMpOworCQl9CisKKwkJY29uZmlnX2Nhdl9sdXRfZXgoaHctPmJ1ZmZlcl9zcGVjW2ldLnlfY2FudmFzX2luZGV4LAorCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnlfYWRkciwKKwkJCWNhbnZhc193aWR0aCwKKwkJCWNhbnZhc19oZWlnaHQsCisJCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCQlDQU5WQVNfQkxLTU9ERV9MSU5FQVIsIGVuZGlhbiwgVkRFQ18xKTsKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMF0ucGh5X2FkZHIgPQorCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnlfYWRkcjsKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMF0ud2lkdGggPQorCQkJY2FudmFzX3dpZHRoOworCQlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1swXS5oZWlnaHQgPQorCQkJY2FudmFzX2hlaWdodDsKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMF0uYmxvY2tfbW9kZSA9CisJCQlDQU5WQVNfQkxLTU9ERV9MSU5FQVI7CisJCWh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfY29uZmlnWzBdLmVuZGlhbiA9CisJCQllbmRpYW47CisKKwkJY29uZmlnX2Nhdl9sdXRfZXgoaHctPmJ1ZmZlcl9zcGVjW2ldLnVfY2FudmFzX2luZGV4LAorCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnVfYWRkciwKKwkJCWNhbnZhc193aWR0aCAvIDIsCisJCQljYW52YXNfaGVpZ2h0IC8gMiwKKwkJCUNBTlZBU19BRERSX05PV1JBUCwKKwkJCUNBTlZBU19CTEtNT0RFX0xJTkVBUiwgZW5kaWFuLCBWREVDXzEpOworCQlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1sxXS5waHlfYWRkciA9CisJCQlody0+YnVmZmVyX3NwZWNbaV0udV9hZGRyOworCQlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1sxXS53aWR0aCA9CisJCQljYW52YXNfd2lkdGggLyAyOworCQlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1sxXS5oZWlnaHQgPQorCQkJY2FudmFzX2hlaWdodCAvIDI7CisJCWh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfY29uZmlnWzFdLmJsb2NrX21vZGUgPQorCQkJQ0FOVkFTX0JMS01PREVfTElORUFSOworCQlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1sxXS5lbmRpYW4gPQorCQkJZW5kaWFuOworCisJCWNvbmZpZ19jYXZfbHV0X2V4KGh3LT5idWZmZXJfc3BlY1tpXS52X2NhbnZhc19pbmRleCwKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS52X2FkZHIsCisJCQljYW52YXNfd2lkdGggLyAyLAorCQkJY2FudmFzX2hlaWdodCAvIDIsCisJCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCQlDQU5WQVNfQkxLTU9ERV9MSU5FQVIsIGVuZGlhbiwgVkRFQ18xKTsKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMl0ucGh5X2FkZHIgPQorCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZfYWRkcjsKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMl0ud2lkdGggPQorCQkJY2FudmFzX3dpZHRoIC8gMjsKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMl0uaGVpZ2h0ID0KKwkJCWNhbnZhc19oZWlnaHQgLyAyOworCQlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1syXS5ibG9ja19tb2RlID0KKwkJCUNBTlZBU19CTEtNT0RFX0xJTkVBUjsKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMl0uZW5kaWFuID0KKwkJCWVuZGlhbjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfc2NhbGVyKHZvaWQpCit7CisJLyogNCBwb2ludCB0cmlhbmdsZSAqLworCWNvbnN0IHVuc2lnbmVkIGludCBmaWx0X2NvZWZbXSA9IHsKKwkJMHgyMDQwMjAwMCwgMHgyMDQwMjAwMCwgMHgxZjNmMjEwMSwgMHgxZjNmMjEwMSwKKwkJMHgxZTNlMjIwMiwgMHgxZTNlMjIwMiwgMHgxZDNkMjMwMywgMHgxZDNkMjMwMywKKwkJMHgxYzNjMjQwNCwgMHgxYzNjMjQwNCwgMHgxYjNiMjUwNSwgMHgxYjNiMjUwNSwKKwkJMHgxYTNhMjYwNiwgMHgxYTNhMjYwNiwgMHgxOTM5MjcwNywgMHgxOTM5MjcwNywKKwkJMHgxODM4MjgwOCwgMHgxODM4MjgwOCwgMHgxNzM3MjkwOSwgMHgxNzM3MjkwOSwKKwkJMHgxNjM2MmEwYSwgMHgxNjM2MmEwYSwgMHgxNTM1MmIwYiwgMHgxNTM1MmIwYiwKKwkJMHgxNDM0MmMwYywgMHgxNDM0MmMwYywgMHgxMzMzMmQwZCwgMHgxMzMzMmQwZCwKKwkJMHgxMjMyMmUwZSwgMHgxMjMyMmUwZSwgMHgxMTMxMmYwZiwgMHgxMTMxMmYwZiwKKwkJMHgxMDMwMzAxMAorCX07CisJaW50IGk7CisKKwkvKiBwc2NhbGUgZW5hYmxlLCBQU0NBTEUgY2J1cyBibWVtIGVuYWJsZSAqLworCVdSSVRFX1ZSRUcoUFNDQUxFX0NUUkwsIDB4YzAwMCk7CisKKwkvKiB3cml0ZSBmaWx0ZXIgY29lZnMgKi8KKwlXUklURV9WUkVHKFBTQ0FMRV9CTUVNX0FERFIsIDApOworCWZvciAoaSA9IDA7IGkgPCAzMzsgaSsrKSB7CisJCVdSSVRFX1ZSRUcoUFNDQUxFX0JNRU1fREFULCAwKTsKKwkJV1JJVEVfVlJFRyhQU0NBTEVfQk1FTV9EQVQsIGZpbHRfY29lZltpXSk7CisJfQorCisJLyogWSBob3Jpem9udGFsIGluaXRpYWwgaW5mbyAqLworCVdSSVRFX1ZSRUcoUFNDQUxFX0JNRU1fQUREUiwgMzcgKiAyKTsKKwkvKiBbMzVdOiBidWYgcmVwZWF0IHBpeDAsCisJICogWzM0OjI5XSA9PiBidWYgcmVjZWl2ZSBudW0sCisJICogWzI4OjE2XSA9PiBidWYgYmxrIHgsCisJICogWzE1OjBdID0+IGJ1ZiBwaGFzZQorCSAqLworCVdSSVRFX1ZSRUcoUFNDQUxFX0JNRU1fREFULCAweDAwMDgpOworCVdSSVRFX1ZSRUcoUFNDQUxFX0JNRU1fREFULCAweDYwMDAwMDAwKTsKKworCS8qIEMgaG9yaXpvbnRhbCBpbml0aWFsIGluZm8gKi8KKwlXUklURV9WUkVHKFBTQ0FMRV9CTUVNX0FERFIsIDQxICogMik7CisJV1JJVEVfVlJFRyhQU0NBTEVfQk1FTV9EQVQsIDB4MDAwOCk7CisJV1JJVEVfVlJFRyhQU0NBTEVfQk1FTV9EQVQsIDB4NjAwMDAwMDApOworCisJLyogWSB2ZXJ0aWNhbCBpbml0aWFsIGluZm8gKi8KKwlXUklURV9WUkVHKFBTQ0FMRV9CTUVNX0FERFIsIDM5ICogMik7CisJV1JJVEVfVlJFRyhQU0NBTEVfQk1FTV9EQVQsIDB4MDAwOCk7CisJV1JJVEVfVlJFRyhQU0NBTEVfQk1FTV9EQVQsIDB4NjAwMDAwMDApOworCisJLyogQyB2ZXJ0aWNhbCBpbml0aWFsIGluZm8gKi8KKwlXUklURV9WUkVHKFBTQ0FMRV9CTUVNX0FERFIsIDQzICogMik7CisJV1JJVEVfVlJFRyhQU0NBTEVfQk1FTV9EQVQsIDB4MDAwOCk7CisJV1JJVEVfVlJFRyhQU0NBTEVfQk1FTV9EQVQsIDB4NjAwMDAwMDApOworCisJLyogWSBob3Jpem9udGFsIHBoYXNlIHN0ZXAgKi8KKwlXUklURV9WUkVHKFBTQ0FMRV9CTUVNX0FERFIsIDM2ICogMiArIDEpOworCS8qIFsxOTowXSA9PiBZIGhvcml6b250YWwgcGhhc2Ugc3RlcCAqLworCVdSSVRFX1ZSRUcoUFNDQUxFX0JNRU1fREFULCAweDEwMDAwKTsKKwkvKiBDIGhvcml6b250YWwgcGhhc2Ugc3RlcCAqLworCVdSSVRFX1ZSRUcoUFNDQUxFX0JNRU1fQUREUiwgNDAgKiAyICsgMSk7CisJLyogWzE5OjBdID0+IEMgaG9yaXpvbnRhbCBwaGFzZSBzdGVwICovCisJV1JJVEVfVlJFRyhQU0NBTEVfQk1FTV9EQVQsIDB4MTAwMDApOworCisJLyogWSB2ZXJ0aWNhbCBwaGFzZSBzdGVwICovCisJV1JJVEVfVlJFRyhQU0NBTEVfQk1FTV9BRERSLCAzOCAqIDIgKyAxKTsKKwkvKiBbMTk6MF0gPT4gWSB2ZXJ0aWNhbCBwaGFzZSBzdGVwICovCisJV1JJVEVfVlJFRyhQU0NBTEVfQk1FTV9EQVQsIDB4MTAwMDApOworCS8qIEMgdmVydGljYWwgcGhhc2Ugc3RlcCAqLworCVdSSVRFX1ZSRUcoUFNDQUxFX0JNRU1fQUREUiwgNDIgKiAyICsgMSk7CisJLyogWzE5OjBdID0+IEMgaG9yaXpvbnRhbCBwaGFzZSBzdGVwICovCisJV1JJVEVfVlJFRyhQU0NBTEVfQk1FTV9EQVQsIDB4MTAwMDApOworCisJLyogcmVzZXQgcHNjYWxlciAqLworI2lmIDEvKk1FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09ONiovCisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAoMSA8PCAxMCkpOworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgMCk7CisjZWxzZQorCVdSSVRFX1JFU0VUX1JFRyhSRVNFVDJfUkVHSVNURVIsIFJFU0VUX1BTQ0FMRSk7CisjZW5kaWYKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NDMikgeworCQlSRUFEX1JFU0VUX1JFRyhSRVNFVDJfUkVHSVNURVIpOworCQlSRUFEX1JFU0VUX1JFRyhSRVNFVDJfUkVHSVNURVIpOworCQlSRUFEX1JFU0VUX1JFRyhSRVNFVDJfUkVHSVNURVIpOworCX0KKwlXUklURV9WUkVHKFBTQ0FMRV9SU1QsIDB4Nyk7CisJV1JJVEVfVlJFRyhQU0NBTEVfUlNULCAweDApOworfQorCitzdGF0aWMgdm9pZCB2bWpwZWdfZHVtcF9zdGF0ZShzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKmh3ID0KKwkJKHN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKikodmRlYy0+cHJpdmF0ZSk7CisJbW1qcGVnX2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSI9PT09PT0gJXNcbiIsIF9fZnVuY19fKTsKKwltbWpwZWdfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIndpZHRoL2hlaWdodCAoJWQvJWQpIGJ1Zl9udW0gJWRcbiIsCisJCWh3LT5mcmFtZV93aWR0aCwKKwkJaHctPmZyYW1lX2hlaWdodCwKKwkJaHctPmJ1Zl9udW0KKwkJKTsKKwltbWpwZWdfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkiaXNfZnJhbWViYXNlKCVkKSwgZW9zICVkLCBzdGF0ZSAweCV4LCBkZWNfcmVzdWx0IDB4JXggZGVjX2ZybSAlZCBwdXRfZnJtICVkIHJ1biAlZCBub3RfcnVuX3JlYWR5ICVkIGlucHV0X2VtcHR5ICVkXG4iLAorCQlpbnB1dF9mcmFtZV9iYXNlZCh2ZGVjKSwKKwkJaHctPmVvcywKKwkJaHctPnN0YXQsCisJCWh3LT5kZWNfcmVzdWx0LAorCQlody0+ZnJhbWVfbnVtLAorCQlody0+cHV0X251bSwKKwkJaHctPnJ1bl9jb3VudCwKKwkJaHctPm5vdF9ydW5fcmVhZHksCisJCWh3LT5pbnB1dF9lbXB0eQorCQkpOworCWlmICghaHctPmlzX3VzZWRfdjRsICYmIHZmX2dldF9yZWNlaXZlcih2ZGVjLT52Zl9wcm92aWRlcl9uYW1lKSkgeworCQllbnVtIHJlY2V2aXZlcl9zdGFydF9lIHN0YXRlID0KKwkJdmZfbm90aWZ5X3JlY2VpdmVyKHZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfUVVSRVlfU1RBVEUsCisJCQlOVUxMKTsKKwkJbW1qcGVnX2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkiXG5yZWNlaXZlciglcykgc3RhdGUgJWRcbiIsCisJCQl2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJc3RhdGUpOworCX0KKwltbWpwZWdfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkiJXMsIG5ld3EoJWQvJWQpLCBkaXNwcSglZC8lZCkgdmYgcGVlay9nZXQvcHV0ICglZC8lZC8lZClcbiIsCisJX19mdW5jX18sCisJa2ZpZm9fbGVuKCZody0+bmV3ZnJhbWVfcSksCisJVkZfUE9PTF9TSVpFLAorCWtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSksCisJVkZfUE9PTF9TSVpFLAorCWh3LT5wZWVrX251bSwKKwlody0+Z2V0X251bSwKKwlody0+cHV0X251bQorCSk7CisJbW1qcGVnX2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSJWSUZGX0JJVF9DTlQ9MHgleFxuIiwKKwkJUkVBRF9WUkVHKFZJRkZfQklUX0NOVCkpOworCW1tanBlZ19kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiVkxEX01FTV9WSUZJRk9fTEVWRUw9MHgleFxuIiwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKSk7CisJbW1qcGVnX2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSJWTERfTUVNX1ZJRklGT19XUD0weCV4XG4iLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApKTsKKwltbWpwZWdfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIlZMRF9NRU1fVklGSUZPX1JQPTB4JXhcbiIsCisJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCkpOworCW1tanBlZ19kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiUEFSU0VSX1ZJREVPX1JQPTB4JXhcbiIsCisJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF9ycCkpOworCW1tanBlZ19kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiUEFSU0VSX1ZJREVPX1dQPTB4JXhcbiIsCisJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCkpOworCWlmIChpbnB1dF9mcmFtZV9iYXNlZCh2ZGVjKSAmJgorCQlkZWJ1Z19lbmFibGUgJiBQUklOVF9GUkFNRUJBU0VfREFUQQorCQkpIHsKKwkJaW50IGpqOworCQlpZiAoaHctPmNodW5rICYmIGh3LT5jaHVuay0+YmxvY2sgJiYKKwkJCWh3LT5jaHVuay0+c2l6ZSA+IDApIHsKKwkJCXU4ICpkYXRhID0gTlVMTDsKKworCQkJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQkJZGF0YSA9IGNvZGVjX21tX3ZtYXAoaHctPmNodW5rLT5ibG9jay0+c3RhcnQgKworCQkJCQlody0+Y2h1bmstPm9mZnNldCwgaHctPmNodW5rLT5zaXplKTsKKwkJCWVsc2UKKwkJCQlkYXRhID0gKCh1OCAqKWh3LT5jaHVuay0+YmxvY2stPnN0YXJ0X3ZpcnQpICsKKwkJCQkJaHctPmNodW5rLT5vZmZzZXQ7CisKKwkJCW1tanBlZ19kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJCSJmcmFtZSBkYXRhIHNpemUgMHgleFxuIiwKKwkJCQlody0+Y2h1bmstPnNpemUpOworCQkJZm9yIChqaiA9IDA7IGpqIDwgaHctPmNodW5rLT5zaXplOyBqaisrKSB7CisJCQkJaWYgKChqaiAmIDB4ZikgPT0gMCkKKwkJCQkJbW1qcGVnX2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJCVBSSU5UX0ZSQU1FQkFTRV9EQVRBLAorCQkJCQkJIiUwNng6IiwgamopOworCQkJCW1tanBlZ19kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLAorCQkJCVBSSU5UX0ZSQU1FQkFTRV9EQVRBLAorCQkJCQkiJTAyeCAiLCBkYXRhW2pqXSk7CisJCQkJaWYgKCgoamogKyAxKSAmIDB4ZikgPT0gMCkKKwkJCQkJbW1qcGVnX2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJCVBSSU5UX0ZSQU1FQkFTRV9EQVRBLAorCQkJCQkJIlxuIik7CisJCQl9CisKKwkJCWlmICghaHctPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQkJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIoZGF0YSk7CisJCX0KKwl9Cit9CitzdGF0aWMgdm9pZCByZXNldF9wcm9jZXNzX3RpbWUoc3RydWN0IHZkZWNfbWpwZWdfaHdfcyAqaHcpCit7CisJaWYgKGh3LT5zdGFydF9wcm9jZXNzX3RpbWUpIHsKKwkJdW5zaWduZWQgcHJvY2Vzc190aW1lID0KKwkJCTEwMDAgKiAoamlmZmllcyAtIGh3LT5zdGFydF9wcm9jZXNzX3RpbWUpIC8gSFo7CisJCWh3LT5zdGFydF9wcm9jZXNzX3RpbWUgPSAwOworCQlpZiAocHJvY2Vzc190aW1lID4gbWF4X3Byb2Nlc3NfdGltZVtERUNPREVfSUQoaHcpXSkKKwkJCW1heF9wcm9jZXNzX3RpbWVbREVDT0RFX0lEKGh3KV0gPSBwcm9jZXNzX3RpbWU7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdGFydF9wcm9jZXNzX3RpbWUoc3RydWN0IHZkZWNfbWpwZWdfaHdfcyAqaHcpCit7CisJaHctPmRlY29kZV90aW1lb3V0X2NvdW50ID0gMjsKKwlody0+c3RhcnRfcHJvY2Vzc190aW1lID0gamlmZmllczsKK30KKworc3RhdGljIHZvaWQgdGltZW91dF9wcm9jZXNzKHN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKmh3KQoreworCWFtdmRlY19zdG9wKCk7CisJbW1qcGVnX2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRVJST1IsCisJCSIlcyBkZWNvZGVyIHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworfQorCitzdGF0aWMgdm9pZCBjaGVja190aW1lcl9mdW5jKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKK3sKKwlzdHJ1Y3QgdmRlY19tanBlZ19od19zICpodyA9IGNvbnRhaW5lcl9vZih0aW1lciwKKwkJc3RydWN0IHZkZWNfbWpwZWdfaHdfcywgY2hlY2tfdGltZXIpOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGh3KTsKKwlpbnQgdGltZW91dF92YWwgPSBkZWNvZGVfdGltZW91dF92YWw7CisKKwltbWpwZWdfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WTERfREVUQUlMLAorCQkiJXM6IHN0YXR1czpuc3RhdHVzPSVkOiVkXG4iLAorCQlfX2Z1bmNfXywgdmRlYy0+c3RhdHVzLCB2ZGVjLT5uZXh0X3N0YXR1cyk7CisJbW1qcGVnX2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkxEX0RFVEFJTCwKKwkJIiVzOiAlZCxidWZ0bD0leDoleDoleDoleFxuIiwKKwkJX19mdW5jX18sIF9fTElORV9fLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fQlVGX0NOVEwpLAorCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApKTsKKworCWlmIChyYWRyICE9IDApIHsKKwkJaWYgKHJ2YWwgIT0gMCkgeworCQkJV1JJVEVfVlJFRyhyYWRyLCBydmFsKTsKKwkJCXByX2luZm8oIldSSVRFX1ZSRUcoJXgsJXgpXG4iLCByYWRyLCBydmFsKTsKKwkJfSBlbHNlCisJCQlwcl9pbmZvKCJSRUFEX1ZSRUcoJXgpPSV4XG4iLCByYWRyLCBSRUFEX1ZSRUcocmFkcikpOworCQlydmFsID0gMDsKKwkJcmFkciA9IDA7CisJfQorCisJaWYgKCgoZGVidWdfZW5hYmxlICYgUFJJTlRfRkxBR19USU1FT1VUX1NUQVRVUykgPT0gMCkgJiYKKwkJKHRpbWVvdXRfdmFsID4gMCkgJiYKKwkJKGh3LT5zdGFydF9wcm9jZXNzX3RpbWUgPiAwKSAmJgorCQkoKDEwMDAgKiAoamlmZmllcyAtIGh3LT5zdGFydF9wcm9jZXNzX3RpbWUpIC8gSFopCisJCQk+IHRpbWVvdXRfdmFsKSkgeworCQlpZiAoaHctPmxhc3RfdmxkX2xldmVsID09IFJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCkpIHsKKwkJCWlmIChody0+ZGVjb2RlX3RpbWVvdXRfY291bnQgPiAwKQorCQkJCWh3LT5kZWNvZGVfdGltZW91dF9jb3VudC0tOworCQkJaWYgKGh3LT5kZWNvZGVfdGltZW91dF9jb3VudCA9PSAwKQorCQkJCXRpbWVvdXRfcHJvY2Vzcyhodyk7CisJCX0KKwkJaHctPmxhc3RfdmxkX2xldmVsID0gUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKTsKKwl9CisKKwlpZiAoUkVBRF9WUkVHKERFQ19TVEFUVVNfUkVHKSA9PSBERUNfREVDT0RFX1RJTUVPVVQpIHsKKwkJcHJfaW5mbygidWNvZGUgREVDX0RFQ09ERV9USU1FT1VUXG4iKTsKKwkJaWYgKGh3LT5kZWNvZGVfdGltZW91dF9jb3VudCA+IDApCisJCQlody0+ZGVjb2RlX3RpbWVvdXRfY291bnQtLTsKKwkJaWYgKGh3LT5kZWNvZGVfdGltZW91dF9jb3VudCA9PSAwKQorCQkJdGltZW91dF9wcm9jZXNzKGh3KTsKKwkJV1JJVEVfVlJFRyhERUNfU1RBVFVTX1JFRywgMCk7CisJfQorCisJaWYgKHZkZWMtPm5leHRfc3RhdHVzID09IFZERUNfU1RBVFVTX0RJU0NPTk5FQ1RFRCkgeworCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRk9SQ0VfRVhJVDsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCXByX2luZm8oInZkZWMgcmVxdWVzdGVkIHRvIGJlIGRpc2Nvbm5lY3RlZFxuIik7CisJCXJldHVybjsKKwl9CisJbW9kX3RpbWVyKCZody0+Y2hlY2tfdGltZXIsIGppZmZpZXMgKyBDSEVDS19JTlRFUlZBTCk7Cit9CisKK3N0YXRpYyBpbnQgdm1qcGVnX3Y0bF9hbGxvY19idWZmX2NvbmZpZ19jYW52YXMoc3RydWN0IHZkZWNfbWpwZWdfaHdfcyAqaHcsIGludCBpKQoreworCWludCByZXQ7CisJdTMyIGNhbnZhczsKKwl1bG9uZyBkZWNidWZfc3RhcnQgPSAwLCBkZWNidWZfdV9zdGFydCA9IDAsIGRlY2J1Zl92X3N0YXJ0ID0gMDsKKwlpbnQgZGVjYnVmX3lfc2l6ZSA9IDAsIGRlY2J1Zl91X3NpemUgPSAwLCBkZWNidWZfdl9zaXplID0gMDsKKwl1MzIgY2FudmFzX3dpZHRoID0gMCwgY2FudmFzX2hlaWdodCA9IDA7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaHcpOworCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9IE5VTEw7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisKKwlpZiAoaHctPmJ1ZmZlcl9zcGVjW2ldLnY0bF9yZWZfYnVmX2FkZHIpIHsKKwkJc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKmZiID0KKwkJCShzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqKQorCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnY0bF9yZWZfYnVmX2FkZHI7CisKKwkJZmItPnN0YXR1cyA9IEZCX1NUX0RFQ09ERVI7CisJCXJldHVybiAwOworCX0KKworCXJldCA9IGN0eC0+ZmJfb3BzLmFsbG9jKCZjdHgtPmZiX29wcywgaHctPmZiX3Rva2VuLCAmZmIsIEFNTF9GQl9SRVFfREVDKTsKKwlpZiAocmV0IDwgMCkgeworCQltbWpwZWdfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSJbJWRdIGdldCBmYiBmYWlsLlxuIiwKKwkJCSgoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopCisJCQkoaHctPnY0bDJfY3R4KSktPmlkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlmYi0+c3RhdHVzCT0gRkJfU1RfREVDT0RFUjsKKworCWlmICghaHctPmZyYW1lX3dpZHRoIHx8ICFody0+ZnJhbWVfaGVpZ2h0KSB7CisJCQlzdHJ1Y3QgdmRlY19waWNfaW5mbyBwaWM7CisJCQl2ZGVjX3Y0bF9nZXRfcGljX2luZm8oY3R4LCAmcGljKTsKKwkJCWh3LT5mcmFtZV93aWR0aCA9IHBpYy52aXNpYmxlX3dpZHRoOworCQkJaHctPmZyYW1lX2hlaWdodCA9IHBpYy52aXNpYmxlX2hlaWdodDsKKwkJCW1tanBlZ19kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJCSJbJWRdIHNldCAlZCB4ICVkIGZyb20gSUYgbGF5ZXJcbiIsIGN0eC0+aWQsCisJCQkJaHctPmZyYW1lX3dpZHRoLCBody0+ZnJhbWVfaGVpZ2h0KTsKKwl9CisKKwlody0+YnVmZmVyX3NwZWNbaV0udjRsX3JlZl9idWZfYWRkciA9ICh1bG9uZylmYjsKKwlpZiAoZmItPm51bV9wbGFuZXMgPT0gMSkgeworCQlkZWNidWZfc3RhcnQJPSBmYi0+bS5tZW1bMF0uYWRkcjsKKwkJZGVjYnVmX3lfc2l6ZQk9IGZiLT5tLm1lbVswXS5vZmZzZXQ7CisJCWRlY2J1Zl91X3N0YXJ0CT0gZGVjYnVmX3N0YXJ0ICsgZGVjYnVmX3lfc2l6ZTsKKwkJZGVjYnVmX3Vfc2l6ZQk9IGRlY2J1Zl95X3NpemUgLyA0OworCQlkZWNidWZfdl9zdGFydAk9IGRlY2J1Zl91X3N0YXJ0ICsgZGVjYnVmX3Vfc2l6ZTsKKwkJZGVjYnVmX3Zfc2l6ZQk9IGRlY2J1Zl91X3NpemU7CisJCWNhbnZhc193aWR0aAk9IEFMSUdOKGh3LT5mcmFtZV93aWR0aCwgNjQpOworCQljYW52YXNfaGVpZ2h0CT0gQUxJR04oaHctPmZyYW1lX2hlaWdodCwgNjQpOworCQlmYi0+bS5tZW1bMF0uYnl0ZXNfdXNlZCA9IGZiLT5tLm1lbVswXS5zaXplOworCX0gZWxzZSBpZiAoZmItPm51bV9wbGFuZXMgPT0gMikgeworCQlkZWNidWZfc3RhcnQJPSBmYi0+bS5tZW1bMF0uYWRkcjsKKwkJZGVjYnVmX3lfc2l6ZQk9IGZiLT5tLm1lbVswXS5zaXplOworCQlkZWNidWZfdV9zdGFydAk9IGZiLT5tLm1lbVsxXS5hZGRyOworCQlkZWNidWZfdV9zaXplCT0gZmItPm0ubWVtWzFdLnNpemUgPj4gMTsKKwkJZGVjYnVmX3Zfc3RhcnQJPSBkZWNidWZfdV9zdGFydCArIGRlY2J1Zl91X3NpemU7CisJCWRlY2J1Zl92X3NpemUJPSBkZWNidWZfdV9zaXplOworCQljYW52YXNfd2lkdGgJPSBBTElHTihody0+ZnJhbWVfd2lkdGgsIDY0KTsKKwkJY2FudmFzX2hlaWdodAk9IEFMSUdOKGh3LT5mcmFtZV9oZWlnaHQsIDY0KTsKKwkJZmItPm0ubWVtWzBdLmJ5dGVzX3VzZWQgPSBmYi0+bS5tZW1bMF0uc2l6ZTsKKwkJZmItPm0ubWVtWzFdLmJ5dGVzX3VzZWQgPSBmYi0+bS5tZW1bMV0uc2l6ZTsKKwl9IGVsc2UgaWYgKGZiLT5udW1fcGxhbmVzID09IDMpIHsKKwkJZGVjYnVmX3N0YXJ0CT0gZmItPm0ubWVtWzBdLmFkZHI7CisJCWRlY2J1Zl95X3NpemUJPSBmYi0+bS5tZW1bMF0uc2l6ZTsKKwkJZGVjYnVmX3Vfc3RhcnQJPSBmYi0+bS5tZW1bMV0uYWRkcjsKKwkJZGVjYnVmX3Vfc2l6ZQk9IGZiLT5tLm1lbVsxXS5zaXplOworCQlkZWNidWZfdl9zdGFydAk9IGZiLT5tLm1lbVsyXS5hZGRyOworCQlkZWNidWZfdl9zaXplCT0gZmItPm0ubWVtWzJdLnNpemU7CisJCWNhbnZhc193aWR0aAk9IEFMSUdOKGh3LT5mcmFtZV93aWR0aCwgNjQpOworCQljYW52YXNfaGVpZ2h0CT0gQUxJR04oaHctPmZyYW1lX2hlaWdodCwgNjQpOworCQlmYi0+bS5tZW1bMF0uYnl0ZXNfdXNlZCA9IGZiLT5tLm1lbVswXS5zaXplOworCQlmYi0+bS5tZW1bMV0uYnl0ZXNfdXNlZCA9IGZiLT5tLm1lbVsxXS5zaXplOworCQlmYi0+bS5tZW1bMl0uYnl0ZXNfdXNlZCA9IGZiLT5tLm1lbVsyXS5zaXplOworCX0KKworCW1tanBlZ19kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1Y0TF9ERVRBSUwsCisJCSJbJWRdIHY0bCByZWYgYnVmIGFkZHI6IDB4JXhcbiIsIGN0eC0+aWQsIGZiKTsKKworCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQlpZiAoaHctPmJ1ZmZlcl9zcGVjW2ldLnlfY2FudmFzX2luZGV4ID09IC0xKQorCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnlfY2FudmFzX2luZGV4ID0KKwkJCXZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX1ZERUNfMSwgdmRlYy0+aWQpOworCQlpZiAoaHctPmJ1ZmZlcl9zcGVjW2ldLnVfY2FudmFzX2luZGV4ID09IC0xKQorCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnVfY2FudmFzX2luZGV4ID0KKwkJCXZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX1ZERUNfMSwgdmRlYy0+aWQpOworCQlpZiAoaHctPmJ1ZmZlcl9zcGVjW2ldLnZfY2FudmFzX2luZGV4ID09IC0xKQorCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZfY2FudmFzX2luZGV4ID0KKwkJCXZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX1ZERUNfMSwgdmRlYy0+aWQpOworCX0gZWxzZSB7CisJCWNhbnZhcyA9IHZkZWMtPmdldF9jYW52YXMoaSwgMyk7CisJCWh3LT5idWZmZXJfc3BlY1tpXS55X2NhbnZhc19pbmRleCA9IGNhbnZhc195KGNhbnZhcyk7CisJCWh3LT5idWZmZXJfc3BlY1tpXS51X2NhbnZhc19pbmRleCA9IGNhbnZhc191KGNhbnZhcyk7CisJCWh3LT5idWZmZXJfc3BlY1tpXS52X2NhbnZhc19pbmRleCA9IGNhbnZhc192KGNhbnZhcyk7CisJfQorCisJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMF0ucGh5X2FkZHIgPQorCQlkZWNidWZfc3RhcnQ7CisJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMF0ud2lkdGggPQorCQljYW52YXNfd2lkdGg7CisJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMF0uaGVpZ2h0ID0KKwkJY2FudmFzX2hlaWdodDsKKwlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1swXS5ibG9ja19tb2RlID0KKwkJaHctPmNhbnZhc19tb2RlOworCWh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfY29uZmlnWzBdLmVuZGlhbiA9CisJCWh3LT5jYW52YXNfZW5kaWFuOworCisJY29uZmlnX2Nhdl9sdXQoaHctPmJ1ZmZlcl9zcGVjW2ldLnlfY2FudmFzX2luZGV4LAorCQkJJmh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfY29uZmlnWzBdLCBWREVDXzEpOworCisJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMV0ucGh5X2FkZHIgPQorCQlkZWNidWZfdV9zdGFydDsKKwlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1sxXS53aWR0aCA9CisJCWNhbnZhc193aWR0aCAvIDI7CisJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMV0uaGVpZ2h0ID0KKwkJY2FudmFzX2hlaWdodCAvIDI7CisJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMV0uYmxvY2tfbW9kZSA9CisJCWh3LT5jYW52YXNfbW9kZTsKKwlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1sxXS5lbmRpYW4gPQorCQlody0+Y2FudmFzX2VuZGlhbjsKKworCWNvbmZpZ19jYXZfbHV0KGh3LT5idWZmZXJfc3BlY1tpXS51X2NhbnZhc19pbmRleCwKKwkJCSZody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1sxXSwgVkRFQ18xKTsKKworCWh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfY29uZmlnWzJdLnBoeV9hZGRyID0KKwkJZGVjYnVmX3Zfc3RhcnQ7CisJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMl0ud2lkdGggPQorCQljYW52YXNfd2lkdGggLyAyOworCWh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfY29uZmlnWzJdLmhlaWdodCA9CisJCWNhbnZhc19oZWlnaHQgLyAyOworCWh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfY29uZmlnWzJdLmJsb2NrX21vZGUgPQorCQlody0+Y2FudmFzX21vZGU7CisJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMl0uZW5kaWFuID0KKwkJaHctPmNhbnZhc19lbmRpYW47CisKKwljb25maWdfY2F2X2x1dChody0+YnVmZmVyX3NwZWNbaV0udl9jYW52YXNfaW5kZXgsCisJCQkmaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMl0sIFZERUNfMSk7CisKKwkvKiBtanBlZyBkZWNvZGVyIGNhbnZhcyBuZWVkIHRvIGJlIHJldmVydCB0byBtYXRjaCBkaXNwbGF5LiAqLworCWh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfY29uZmlnWzBdLmVuZGlhbiA9IGh3LT5jYW52YXNfZW5kaWFuID8gMCA6IDc7CisJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMV0uZW5kaWFuID0gaHctPmNhbnZhc19lbmRpYW4gPyAwIDogNzsKKwlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1syXS5lbmRpYW4gPSBody0+Y2FudmFzX2VuZGlhbiA/IDAgOiA3OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm1qcGVnX2dldF9idWZfbnVtKHN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKmh3KQoreworCWludCBidWZfbnVtID0gREVDT0RFX0JVRkZFUl9OVU1fREVGOworCisJYnVmX251bSArPSBody0+ZHluYW1pY19idWZfbnVtX21hcmdpbjsKKworCWlmIChidWZfbnVtID4gREVDT0RFX0JVRkZFUl9OVU1fTUFYKQorCQlidWZfbnVtID0gREVDT0RFX0JVRkZFUl9OVU1fTUFYOworCisJcmV0dXJuIGJ1Zl9udW07Cit9CisKK3N0YXRpYyBib29sIGlzX2Vub3VnaF9mcmVlX2J1ZmZlcihzdHJ1Y3QgdmRlY19tanBlZ19od19zICpodykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBody0+YnVmX251bTsgaSsrKSB7CisJCWlmIChody0+dmZidWZfdXNlW2ldID09IDApCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gaSA9PSBody0+YnVmX251bSA/IGZhbHNlIDogdHJ1ZTsKK30KKworc3RhdGljIGludCBmaW5kX2ZyZWVfYnVmZmVyKHN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKmh3KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGh3LT5idWZfbnVtOyBpKyspIHsKKwkJaWYgKGh3LT52ZmJ1Zl91c2VbaV0gPT0gMCkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IGh3LT5idWZfbnVtKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KTsKKwkJaWYgKGN0eC0+cGFyYW1fc2V0c19mcm9tX3Vjb2RlICYmICFody0+djRsX3BhcmFtc19wYXJzZWQpIHsKKwkJCS8qcnVuIHRvIHBhcnNlciBjc2QgZGF0YSovCisJCQlpID0gMDsKKwkJfSBlbHNlIHsKKwkJCWlmICghY3R4LT5mYl9vcHMucXVlcnkoJmN0eC0+ZmJfb3BzLCAmaHctPmZiX3Rva2VuKSkKKwkJCQlyZXR1cm4gLTE7CisKKwkJCWlmICh2bWpwZWdfdjRsX2FsbG9jX2J1ZmZfY29uZmlnX2NhbnZhcyhodywgaSkpCisJCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgdm1qcGVnX2h3X2N0eF9yZXN0b3JlKHN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKmh3KQoreworCXN0cnVjdCBidWZmZXJfc3BlY19zICpidWZmX3NwZWM7CisJaW50IGluZGV4LCBpOworCisJaW5kZXggPSBmaW5kX2ZyZWVfYnVmZmVyKGh3KTsKKwlpZiAoaW5kZXggPCAwKQorCQlyZXR1cm4gLTE7CisKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsICgxIDw8IDcpIHwgKDEgPDwgNikpOworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgMCk7CisKKwlpZiAoIWh3LT5pbml0X2ZsYWcpIHsKKwkJdm1qcGVnX2NhbnZhc19pbml0KGh3KTsKKwl9IGVsc2UgeworCQlpZiAoIWh3LT5pc191c2VkX3Y0bCkgeworCQkJZm9yIChpID0gMDsgaSA8IGh3LT5idWZfbnVtOyBpKyspIHsKKwkJCQlidWZmX3NwZWMgPSAmaHctPmJ1ZmZlcl9zcGVjW2ldOworCQkJCWNvbmZpZ19jYXZfbHV0KGJ1ZmZfc3BlYy0+eV9jYW52YXNfaW5kZXgsCisJCQkJCQkJJmJ1ZmZfc3BlYy0+Y2FudmFzX2NvbmZpZ1swXSwgVkRFQ18xKTsKKwkJCQljb25maWdfY2F2X2x1dChidWZmX3NwZWMtPnVfY2FudmFzX2luZGV4LAorCQkJCQkJCSZidWZmX3NwZWMtPmNhbnZhc19jb25maWdbMV0sIFZERUNfMSk7CisJCQkJY29uZmlnX2Nhdl9sdXQoYnVmZl9zcGVjLT52X2NhbnZhc19pbmRleCwKKwkJCQkJCQkmYnVmZl9zcGVjLT5jYW52YXNfY29uZmlnWzJdLCBWREVDXzEpOworCQkJfQorCQl9CisJfQorCisJLyogZmluZCBuZXh0IGRlY29kZSBidWZmZXIgaW5kZXggKi8KKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfNCwgc3BlYzJjYW52YXMoJmh3LT5idWZmZXJfc3BlY1tpbmRleF0pKTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfNSwgaW5kZXggfCAxIDw8IDI0KTsKKwlpbml0X3NjYWxlcigpOworCisJLyogY2xlYXIgYnVmZmVyIElOL09VVCByZWdpc3RlcnMgKi8KKwlXUklURV9WUkVHKE1SRUdfVE9fQU1SSVNDLCAwKTsKKwlXUklURV9WUkVHKE1SRUdfRlJPTV9BTVJJU0MsIDApOworCisJV1JJVEVfVlJFRyhNQ1BVX0lOVFJfTVNLLCAweGZmZmYpOworCVdSSVRFX1ZSRUcoTVJFR19ERUNPREVfUEFSQU0sIChody0+ZnJhbWVfaGVpZ2h0IDw8IDQpIHwgMHg4MDAwKTsKKworCS8qIGNsZWFyIG1haWxib3ggaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfQ0xSX1JFRywgMSk7CisJLyogZW5hYmxlIG1haWxib3ggaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfTUFTSywgMSk7CisJLyogc2V0IGludGVycnVwdCBtYXBwaW5nIGZvciB2bGQgKi8KKwlXUklURV9WUkVHKEFTU0lTVF9BTVIxX0lOVDgsIDgpOworI2lmIDEvKk1FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09ONiovCisJQ0xFQVJfVlJFR19NQVNLKE1ERUNfUElDX0RDX0NUUkwsIDEgPDwgMTcpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzMzIgdm1qcGVnX2luaXQoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlpbnQgaTsKKwlpbnQgc2l6ZSA9IC0xLCBmd19zaXplID0gMHgxMDAwICogMTY7CisJc3RydWN0IGZpcm13YXJlX3MgKmZ3ID0gTlVMTDsKKwlzdHJ1Y3QgdmRlY19tanBlZ19od19zICpodyA9CisJCShzdHJ1Y3QgdmRlY19tanBlZ19od19zICopdmRlYy0+cHJpdmF0ZTsKKworCWZ3ID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IGZpcm13YXJlX3MpICsgZndfc2l6ZSk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGZ3KSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzaXplID0gZ2V0X2Zpcm13YXJlX2RhdGEoVklERU9fREVDX01KUEVHX01VTFRJLCBmdy0+ZGF0YSk7CisJaWYgKHNpemUgPCAwKSB7CisJCXByX2VycigiZ2V0IGZpcm13YXJlIGZhaWwuIik7CisJCXZmcmVlKGZ3KTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZ3LT5sZW4gPSBzaXplOworCWh3LT5mdyA9IGZ3OworCisJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQlody0+ZnJhbWVfd2lkdGggPSAwOworCQlody0+ZnJhbWVfaGVpZ2h0ID0gMDsKKwl9IGVsc2UgeworCQlody0+ZnJhbWVfd2lkdGggPSBody0+dm1qcGVnX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoOworCQlody0+ZnJhbWVfaGVpZ2h0ID0gaHctPnZtanBlZ19hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQ7CisJfQorCWh3LT5mcmFtZV9kdXIgPSAoKGh3LT52bWpwZWdfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSkgPworCWh3LT52bWpwZWdfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSA6IDM4NDApOworCWh3LT5zYXZlZF9yZXNvbHV0aW9uID0gMDsKKwlody0+ZW9zID0gMDsKKwlody0+aW5pdF9mbGFnID0gMDsKKwlody0+ZnJhbWVfbnVtID0gMDsKKwlody0+cHV0X251bSA9IDA7CisJaHctPnJ1bl9jb3VudCA9IDA7CisJaHctPm5vdF9ydW5fcmVhZHkgPSAwOworCWh3LT5pbnB1dF9lbXB0eSA9IDA7CisJaHctPnBlZWtfbnVtID0gMDsKKwlody0+Z2V0X251bSA9IDA7CisJZm9yIChpID0gMDsgaSA8IERFQ09ERV9CVUZGRVJfTlVNX01BWDsgaSsrKQorCQlody0+dmZidWZfdXNlW2ldID0gMDsKKworCUlOSVRfS0ZJRk8oaHctPmRpc3BsYXlfcSk7CisJSU5JVF9LRklGTyhody0+bmV3ZnJhbWVfcSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVkZfUE9PTF9TSVpFOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IHZmcmFtZV9zICp2ZiA9ICZody0+dmZwb29sW2ldOworCisJCWh3LT52ZnBvb2xbaV0uaW5kZXggPSAtMTsKKwkJa2ZpZm9fcHV0KCZody0+bmV3ZnJhbWVfcSwgdmYpOworCX0KKworCWlmIChody0+bW1fYmxrX2hhbmRsZSkgeworCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWUoaHctPm1tX2Jsa19oYW5kbGUpOworCQlody0+bW1fYmxrX2hhbmRsZSA9IE5VTEw7CisJfQorCisJaHctPm1tX2Jsa19oYW5kbGUgPSBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2JveCgKKwkJRFJJVkVSX05BTUUsCisJCTAsCisJCU1BWF9CTU1VX0JVRkZFUl9OVU0sCisJCTQgKyBQQUdFX1NISUZULAorCQlDT0RFQ19NTV9GTEFHU19DTUFfQ0xFQVIgfAorCQlDT0RFQ19NTV9GTEFHU19GT1JfVkRFQ09ERVIpOworCisJdGltZXJfc2V0dXAoJmh3LT5jaGVja190aW1lciwgY2hlY2tfdGltZXJfZnVuYywgMCk7CisJaHctPmNoZWNrX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgQ0hFQ0tfSU5URVJWQUw7CisJLyphZGRfdGltZXIoJmh3LT5jaGVja190aW1lcik7Ki8KKwlody0+c3RhdCB8PSBTVEFUX1RJTUVSX0FSTTsKKwlody0+c3RhdCB8PSBTVEFUX0lTUl9SRUc7CisKKwlXUklURV9WUkVHKERFQ09ERV9TVE9QX1BPUywgdWRlYnVnX2ZsYWcpOworCUlOSVRfV09SSygmaHctPndvcmssIHZtanBlZ193b3JrKTsKKwlwcl9pbmZvKCJ3Omg9JWQ6JWRcbiIsIGh3LT5mcmFtZV93aWR0aCwgaHctPmZyYW1lX2hlaWdodCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJ1bl9yZWFkeShzdHJ1Y3QgdmRlY19zICp2ZGVjLAorCXVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgdmRlY19tanBlZ19od19zICpodyA9CisJCShzdHJ1Y3QgdmRlY19tanBlZ19od19zICopdmRlYy0+cHJpdmF0ZTsKKwlody0+bm90X3J1bl9yZWFkeSsrOworCWlmIChody0+ZW9zKQorCQlyZXR1cm4gMDsKKwlpZiAodmRlY19zdHJlYW1fYmFzZWQodmRlYykgJiYgKGh3LT5pbml0X2ZsYWcgPT0gMCkKKwkJJiYgcHJlX2RlY29kZV9idWZfbGV2ZWwgIT0gMCkgeworCQl1MzIgcnAsIHdwLCBsZXZlbDsKKworCQlycCA9IFNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF9ycCk7CisJCXdwID0gU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3dwKTsKKwkJaWYgKHdwIDwgcnApCisJCQlsZXZlbCA9IHZkZWMtPmlucHV0LnNpemUgKyB3cCAtIHJwOworCQllbHNlCisJCQlsZXZlbCA9IHdwIC0gcnA7CisKKwkJaWYgKGxldmVsIDwgcHJlX2RlY29kZV9idWZfbGV2ZWwpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KTsKKworCQlpZiAoY3R4LT5wYXJhbV9zZXRzX2Zyb21fdWNvZGUpIHsKKwkJCWlmIChody0+djRsX3BhcmFtc19wYXJzZWQpIHsKKwkJCQlpZiAoIWN0eC0+djRsX2NvZGVjX2RwYl9yZWFkeSAmJgorCQkJCQl2NGwyX20ybV9udW1fZHN0X2J1ZnNfcmVhZHkoY3R4LT5tMm1fY3R4KSA8CisJCQkJCXJ1bl9yZWFkeV9taW5fYnVmX251bSkKKwkJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UgeworCQkJCWlmIChjdHgtPnY0bF9yZXNvbHV0aW9uX2NoYW5nZSkKKwkJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0gZWxzZSBpZiAoIWN0eC0+djRsX2NvZGVjX2RwYl9yZWFkeSkgeworCQkJaWYgKHY0bDJfbTJtX251bV9kc3RfYnVmc19yZWFkeShjdHgtPm0ybV9jdHgpIDwKKwkJCQlydW5fcmVhZHlfbWluX2J1Zl9udW0pCisJCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAoIWlzX2Vub3VnaF9mcmVlX2J1ZmZlcihodykpIHsKKwkJaHctPmJ1ZmZlcl9ub3RfcmVhZHkrKzsKKwkJcmV0dXJuIDA7CisJfQorCisJaHctPm5vdF9ydW5fcmVhZHkgPSAwOworCWh3LT5idWZmZXJfbm90X3JlYWR5ID0gMDsKKwlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpCisJCXJldHVybiBDT1JFX01BU0tfVkRFQ18xOworCWVsc2UKKwkJcmV0dXJuIENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQzsKK30KKworc3RhdGljIHZvaWQgcnVuKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHVuc2lnbmVkIGxvbmcgbWFzaywKKwl2b2lkICgqY2FsbGJhY2spKHN0cnVjdCB2ZGVjX3MgKiwgdm9pZCAqKSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKmh3ID0KKwkJKHN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKil2ZGVjLT5wcml2YXRlOworCWludCBpLCByZXQ7CisKKwlody0+dmRlY19jYl9hcmcgPSBhcmc7CisJaHctPnZkZWNfY2IgPSBjYWxsYmFjazsKKworCWh3LT5ydW5fY291bnQrKzsKKwl2ZGVjX3Jlc2V0X2NvcmUodmRlYyk7CisJZm9yIChpID0gMDsgaSA8IGh3LT5idWZfbnVtOyBpKyspIHsKKwkJaWYgKGh3LT52ZmJ1Zl91c2VbaV0gPT0gMCkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IGh3LT5idWZfbnVtKSB7CisJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCXJldHVybjsKKwl9CisKKwlyZXQgPSB2ZGVjX3ByZXBhcmVfaW5wdXQodmRlYywgJmh3LT5jaHVuayk7CisJaWYgKHJldCA8PSAwKSB7CisJCWh3LT5pbnB1dF9lbXB0eSsrOworCQltbWpwZWdfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19SVU5fRkxPVywKKwkJIiVzOiAlZCxyPSVkLGJ1ZnRsPSV4OiV4OiV4XG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCByZXQsCisJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fQlVGX0NOVEwpLAorCQkJU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3JwKSwKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19XUCkpOworCisJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCXJldHVybjsKKwl9CisJaHctPmlucHV0X2VtcHR5ID0gMDsKKwlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfTk9ORTsKKwlpZiAodmRlYy0+bWNfbG9hZGVkKSB7CisJLypmaXJtd2FyZSBoYXZlIGxvYWQgYmVmb3JlLAorCSAgYW5kIG5vdCBjaGFuZ2VzIHRvIGFub3RoZXIuCisJICBpZ25vcmUgcmVsb2FkLgorCSovCisJfSBlbHNlIHsKKwkJcmV0ID0gYW12ZGVjX3ZkZWNfbG9hZG1jX2V4KFZGT1JNQVRfTUpQRUcsICJtbWpwZWciLCB2ZGVjLCBody0+ZnctPmRhdGEpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCJbJWRdIE1NSlBFRzogdGhlICVzIGZ3IGxvYWRpbmcgZmFpbGVkLCBlcnI6ICV4XG4iLAorCQkJCXZkZWMtPmlkLCB0ZWVfZW5hYmxlZCgpID8gIlRFRSIgOiAibG9jYWwiLCByZXQpOworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0ZPUkNFX0VYSVQ7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCXJldHVybjsKKwkJfQorCQl2ZGVjLT5tY19sb2FkZWQgPSAxOworCQl2ZGVjLT5tY190eXBlID0gVkZPUk1BVF9NSlBFRzsKKwl9CisvKglpZiAoYW12ZGVjX3ZkZWNfbG9hZG1jX2J1Zl9leCh2ZGVjLCBody0+ZnctPmRhdGEsIGh3LT5mdy0+bGVuKSA8IDApIHsKKwkJcHJfZXJyKCIlczogRXJyb3IgYW12ZGVjX2xvYWRtYyBmYWlsXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9Ki8KKworCWlmICh2bWpwZWdfaHdfY3R4X3Jlc3RvcmUoaHcpIDwgMCkgeworCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRVJST1I7CisJCW1tanBlZ19kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJImFtdmRlY19tbWpwZWc6IGVycm9yIEhXIGNvbnRleHQgcmVzdG9yZVxuIik7CisJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQlyZXR1cm47CisJfQorI2lmIDAKKwl2ZGVjX2VuYWJsZV9pbnB1dCh2ZGVjKTsKKwltb2RfdGltZXIoJmh3LT5jaGVja190aW1lciwgamlmZmllcyArIENIRUNLX0lOVEVSVkFMKTsKKyNlbmRpZgorCWh3LT5zdGF0IHw9IFNUQVRfTUNfTE9BRDsKKwlzdGFydF9wcm9jZXNzX3RpbWUoaHcpOworCWh3LT5sYXN0X3ZsZF9sZXZlbCA9IDA7CisJbW9kX3RpbWVyKCZody0+Y2hlY2tfdGltZXIsIGppZmZpZXMgKyBDSEVDS19JTlRFUlZBTCk7CisJYW12ZGVjX3N0YXJ0KCk7CisJdmRlY19lbmFibGVfaW5wdXQodmRlYyk7CisJaHctPnN0YXQgfD0gU1RBVF9WREVDX1JVTjsKKwlody0+aW5pdF9mbGFnID0gMTsKKworCW1tanBlZ19kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1JVTl9GTE9XLAorCQkiJXMgKDB4JXggMHgleCAweCV4KSB2bGRjcmwgMHgleCBiaXRjbnQgMHgleCBwb3dlcmN0bCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleFxuIiwKKwkJX19mdW5jX18sCisJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCksCisJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19XUCksCisJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCksCisJCVJFQURfVlJFRyhWTERfREVDT0RFX0NPTlRST0wpLAorCQlSRUFEX1ZSRUcoVklGRl9CSVRfQ05UKSwKKwkJUkVBRF9WUkVHKFBPV0VSX0NUTF9WTEQpLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fU1RBUlRfUFRSKSwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0NVUlJfUFRSKSwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0NPTlRST0wpLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fQlVGX0NOVEwpLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fRU5EX1BUUikpOworfQorc3RhdGljIHZvaWQgd2FpdF92bWpwZWdfc2VhcmNoX2RvbmUoc3RydWN0IHZkZWNfbWpwZWdfaHdfcyAqaHcpCit7CisJdTMyIHZsZF9ycCA9IFJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCk7CisJaW50IGNvdW50ID0gMDsKKworCWRvIHsKKwkJdXNsZWVwX3JhbmdlKDEwMCwgNTAwKTsKKwkJaWYgKHZsZF9ycCA9PSBSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApKQorCQkJYnJlYWs7CisJCWlmIChjb3VudCA+IDEwMDApIHsKKwkJCW1tanBlZ19kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJCQkiJXMsIGNvdW50ICVkICB2bGRfcnAgMHgleCBWTERfTUVNX1ZJRklGT19SUCAweCV4XG4iLAorCQkJCQlfX2Z1bmNfXywgY291bnQsIHZsZF9ycCwgUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSk7CisJCQlicmVhazsKKwkJfSBlbHNlCisJCQl2bGRfcnAgPSBSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApOworCQljb3VudCsrOworCX0gd2hpbGUgKDEpOworfQorCitzdGF0aWMgaW50IG5vdGlmeV92NGxfZW9zKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IHZkZWNfbWpwZWdfaHdfcyAqaHcgPSAoc3RydWN0IHZkZWNfbWpwZWdfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPSAoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisJc3RydWN0IHZmcmFtZV9zICp2ZiA9IE5VTEw7CisJc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKmZiID0gTlVMTDsKKwlpbnQgaW5kZXggPSAtMTsKKworCWlmIChody0+ZW9zKSB7CisJCWlmIChrZmlmb19nZXQoJmh3LT5uZXdmcmFtZV9xLCAmdmYpID09IDAgfHwgdmYgPT0gTlVMTCkgeworCQkJbW1qcGVnX2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRVJST1IsCisJCQkJIiVzIGZhdGFsIGVycm9yLCBubyBhdmFpbGFibGUgYnVmZmVyIHNsb3QuXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCWluZGV4ID0gZmluZF9mcmVlX2J1ZmZlcihodyk7CisJCQlpZiAoaW5kZXggPT0gLTEpIHsKKwkJCQljdHgtPmZiX29wcy5xdWVyeSgmY3R4LT5mYl9vcHMsICZody0+ZmJfdG9rZW4pOworCQkJCWlmIChjdHgtPmZiX29wcy5hbGxvYygmY3R4LT5mYl9vcHMsIGh3LT5mYl90b2tlbiwgJmZiLCBBTUxfRkJfUkVRX0RFQykgPCAwKSB7CisJCQkJCXByX2VycigiWyVkXSBnZXQgZmIgZmFpbC5cbiIsIGN0eC0+aWQpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJfQorCQl9CisKKwkJdmYtPnR5cGUgfD0gVklEVFlQRV9WNExfRU9TOworCQl2Zi0+dGltZXN0YW1wID0gVUxPTkdfTUFYOworCQl2Zi0+djRsX21lbV9oYW5kbGUgPSAoaW5kZXggPT0gLTEpID8gKHVsb25nKWZiIDoKKwkJCWh3LT5idWZmZXJfc3BlY1tpbmRleF0udjRsX3JlZl9idWZfYWRkcjsKKwkJdmYtPmZsYWcgPSBWRlJBTUVfRkxBR19FTVBUWV9GUkFNRV9WNEw7CisJCWZiID0gKHN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICopdmYtPnY0bF9tZW1faGFuZGxlOworCisJCXZkZWNfdmZyYW1lX3JlYWR5KHZkZWMsIHZmKTsKKwkJa2ZpZm9fcHV0KCZody0+ZGlzcGxheV9xLCAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCisJCWlmIChody0+aXNfdXNlZF92NGwpCisJCQlmYi0+dGFzay0+c3VibWl0KGZiLT50YXNrLCBUQVNLX1RZUEVfREVDKTsKKwkJZWxzZQorCQkJdmZfbm90aWZ5X3JlY2VpdmVyKHZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1ZGUkFNRV9SRUFEWSwgTlVMTCk7CisKKwkJcHJfaW5mbygiWyVkXSBtanBlZyBFT1Mgbm90aWZ5LlxuIiwgKGh3LT5pc191c2VkX3Y0bCk/Y3R4LT5pZDp2ZGVjLT5pZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZtanBlZ193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdmRlY19tanBlZ19od19zICpodyA9IGNvbnRhaW5lcl9vZih3b3JrLAorCXN0cnVjdCB2ZGVjX21qcGVnX2h3X3MsIHdvcmspOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGh3KTsKKworCW1tanBlZ19kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0JVRkZFUl9ERVRBSUwsCisJIiVzOiByZXN1bHQ9JWQsbGVuPSVkOiVkXG4iLAorCQkJX19mdW5jX18sIGh3LT5kZWNfcmVzdWx0LAorCQkJa2ZpZm9fbGVuKCZody0+bmV3ZnJhbWVfcSksCisJCQlrZmlmb19sZW4oJmh3LT5kaXNwbGF5X3EpKTsKKwlpZiAoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9ET05FKSB7CisJCXZkZWNfdmZyYW1lX2RpcnR5KGh3X3RvX3ZkZWMoaHcpLCBody0+Y2h1bmspOworCQlody0+Y2h1bmsgPSBOVUxMOworCX0gZWxzZSBpZiAoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9BR0FJTikgeworCQkvKgorCQkJc3RyZWFtIGJhc2U6IHN0cmVhbSBidWYgZW1wdHkgb3IgdGltZW91dAorCQkJZnJhbWUgYmFzZTogdmRlY19wcmVwYXJlX2lucHV0IGZhaWwKKwkJKi8KKwkJaWYgKCF2ZGVjX2hhc19tb3JlX2lucHV0KGh3X3RvX3ZkZWMoaHcpKSkgeworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0VPUzsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJLypwcl9pbmZvKCIlczogcmV0dXJuXG4iLAorCQkJX19mdW5jX18pOyovCisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgaWYgKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfRk9SQ0VfRVhJVCkgeworCQlwcl9pbmZvKCIlczogZm9yY2UgZXhpdFxuIiwgX19mdW5jX18pOworCQlpZiAoaHctPnN0YXQgJiBTVEFUX0lTUl9SRUcpIHsKKwkJCWFtdmRlY19zdG9wKCk7CisJCQl2ZGVjX2ZyZWVfaXJxKFZERUNfSVJRXzEsICh2b2lkICopaHcpOworCQkJaHctPnN0YXQgJj0gflNUQVRfSVNSX1JFRzsKKwkJfQorCX0gZWxzZSBpZiAoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9FT1MpIHsKKwkJcHJfaW5mbygiJXM6IGVuZCBvZiBzdHJlYW1cbiIsIF9fZnVuY19fKTsKKwkJaWYgKGh3LT5zdGF0ICYgU1RBVF9WREVDX1JVTikgeworCQkJYW12ZGVjX3N0b3AoKTsKKwkJCWh3LT5zdGF0ICY9IH5TVEFUX1ZERUNfUlVOOworCQl9CisJCWh3LT5lb3MgPSAxOworCQlub3RpZnlfdjRsX2Vvcyh2ZGVjKTsKKworCQl2ZGVjX3ZmcmFtZV9kaXJ0eShod190b192ZGVjKGh3KSwgaHctPmNodW5rKTsKKwkJaHctPmNodW5rID0gTlVMTDsKKwkJdmRlY19jbGVhbl9pbnB1dChod190b192ZGVjKGh3KSk7CisJfQorCWlmIChody0+c3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJYW12ZGVjX3N0b3AoKTsKKwkJaHctPnN0YXQgJj0gflNUQVRfVkRFQ19SVU47CisJfQorCS8qZGlzYWJsZSBtYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoQVNTSVNUX01CT1gxX01BU0ssIDApOworCXdhaXRfdm1qcGVnX3NlYXJjaF9kb25lKGh3KTsKKworCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShody0+djRsMl9jdHgpOworCisJCWlmIChjdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSAmJgorCQkJIWh3LT52NGxfcGFyYW1zX3BhcnNlZCkKKwkJCXZkZWNfdjRsX3dyaXRlX2ZyYW1lX3N5bmMoY3R4KTsKKwl9CisKKwkvKiBtYXJrIGl0c2VsZiBoYXMgYWxsIEhXIHJlc291cmNlIHJlbGVhc2VkIGFuZCBpbnB1dCByZWxlYXNlZCAqLworCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkKKwkJdmRlY19jb3JlX2ZpbmlzaF9ydW4oaHdfdG9fdmRlYyhodyksIENPUkVfTUFTS19WREVDXzEpOworCWVsc2UgeworCQl2ZGVjX2NvcmVfZmluaXNoX3J1bihod190b192ZGVjKGh3KSwgQ09SRV9NQVNLX1ZERUNfMQorCQkJfCBDT1JFX01BU0tfSEVWQyk7CisJfQorCWRlbF90aW1lcl9zeW5jKCZody0+Y2hlY2tfdGltZXIpOworCWh3LT5zdGF0ICY9IH5TVEFUX1RJTUVSX0FSTTsKKworCWlmIChody0+dmRlY19jYikKKwkJaHctPnZkZWNfY2IoaHdfdG9fdmRlYyhodyksIGh3LT52ZGVjX2NiX2FyZyk7Cit9CisKK3N0YXRpYyBpbnQgdm1qcGVnX3N0b3Aoc3RydWN0IHZkZWNfbWpwZWdfaHdfcyAqaHcpCit7CisJcHJfaW5mbygiJXMgLi4uY291bnQgPSAlZFxuIiwgX19mdW5jX18sIGh3LT5mcmFtZV9udW0pOworCisJaWYgKGh3LT5zdGF0ICYgU1RBVF9WREVDX1JVTikgeworCQlhbXZkZWNfc3RvcCgpOworCQlwcl9pbmZvKCIlcyBhbXZkZWNfc3RvcFxuIiwgX19mdW5jX18pOworCQlody0+c3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwl9CisKKwlpZiAoaHctPnN0YXQgJiBTVEFUX0lTUl9SRUcpIHsKKwkJdmRlY19mcmVlX2lycShWREVDX0lSUV8xLCAodm9pZCAqKWh3KTsKKwkJaHctPnN0YXQgJj0gflNUQVRfSVNSX1JFRzsKKwl9CisKKwlpZiAoaHctPnN0YXQgJiBTVEFUX1RJTUVSX0FSTSkgeworCQlkZWxfdGltZXJfc3luYygmaHctPmNoZWNrX3RpbWVyKTsKKwkJaHctPnN0YXQgJj0gflNUQVRfVElNRVJfQVJNOworCX0KKwljYW5jZWxfd29ya19zeW5jKCZody0+d29yayk7CisJaHctPmluaXRfZmxhZyA9IDA7CisKKwlpZiAoaHctPm1tX2Jsa19oYW5kbGUpIHsKKwkJZGVjb2Rlcl9ibW11X2JveF9mcmVlKGh3LT5tbV9ibGtfaGFuZGxlKTsKKwkJaHctPm1tX2Jsa19oYW5kbGUgPSBOVUxMOworCX0KKworCWlmIChody0+ZncpIHsKKwkJdmZyZWUoaHctPmZ3KTsKKwkJaHctPmZ3ID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbW12ZGVjX21qcGVnX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHZkZWNfcyAqcGRhdGEgPSAqKHN0cnVjdCB2ZGVjX3MgKiopcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHZkZWNfbWpwZWdfaHdfcyAqaHcgPSBOVUxMOworCWludCBjb25maWdfdmFsID0gMDsKKworCWlmIChwZGF0YSA9PSBOVUxMKSB7CisJCXByX2luZm8oImFtbXZkZWNfbWpwZWcgbWVtb3J5IHJlc291cmNlIHVuZGVmaW5lZC5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlodyA9ICB2emFsbG9jKHNpemVvZihzdHJ1Y3QgdmRlY19tanBlZ19od19zKSk7CisJaWYgKGh3ID09IE5VTEwpIHsKKwkJcHJfaW5mbygiXG5hbW12ZGVjX21qcGVnIGRldmljZSBkYXRhIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogdGhlIGN0eCBmcm9tIHY0bDIgZHJpdmVyLiAqLworCWh3LT52NGwyX2N0eCA9IHBkYXRhLT5wcml2YXRlOworCisJcGRhdGEtPnByaXZhdGUgPSBodzsKKwlwZGF0YS0+ZGVjX3N0YXR1cyA9IHZtanBlZ19kZWNfc3RhdHVzOworCisJcGRhdGEtPnJ1biA9IHJ1bjsKKwlwZGF0YS0+cnVuX3JlYWR5ID0gcnVuX3JlYWR5OworCXBkYXRhLT5pcnFfaGFuZGxlciA9IHZtanBlZ19pc3I7CisJcGRhdGEtPnRocmVhZGVkX2lycV9oYW5kbGVyID0gdm1qcGVnX2lzcl90aHJlYWRfZm47CisJcGRhdGEtPmR1bXBfc3RhdGUgPSB2bWpwZWdfZHVtcF9zdGF0ZTsKKworCXNucHJpbnRmKGh3LT52ZGVjX25hbWUsIHNpemVvZihody0+dmRlY19uYW1lKSwKKwkJInZtanBlZy0lZCIsIHBkZXYtPmlkKTsKKwlzbnByaW50Zihody0+cHRzX25hbWUsIHNpemVvZihody0+cHRzX25hbWUpLAorCQkiJXMtcHRzIiwgaHctPnZkZWNfbmFtZSk7CisJc25wcmludGYoaHctPm5ld19xX25hbWUsIHNpemVvZihody0+bmV3X3FfbmFtZSksCisJCSIlcy1uZXdmcmFtZV9xIiwgaHctPnZkZWNfbmFtZSk7CisJc25wcmludGYoaHctPmRpc3BfcV9uYW1lLCBzaXplb2YoaHctPmRpc3BfcV9uYW1lKSwKKwkJIiVzLWRpc3BmcmFtZV9xIiwgaHctPnZkZWNfbmFtZSk7CisKKwlpZiAocGRhdGEtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgREVDT0RFX0JVRkZFUl9OVU1fTUFYOyBpKyspIHsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS55X2NhbnZhc19pbmRleCA9IC0xOworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnVfY2FudmFzX2luZGV4ID0gLTE7CisJCQlody0+YnVmZmVyX3NwZWNbaV0udl9jYW52YXNfaW5kZXggPSAtMTsKKwkJfQorCX0KKworCWlmIChwZGF0YS0+dXNlX3ZmbV9wYXRoKQorCQlzbnByaW50ZihwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwgVkRFQ19QUk9WSURFUl9OQU1FX1NJWkUsCisJCQlWRk1fREVDX1BST1ZJREVSX05BTUUpOworCWVsc2UKKwkJc25wcmludGYocGRhdGEtPnZmX3Byb3ZpZGVyX25hbWUsIFZERUNfUFJPVklERVJfTkFNRV9TSVpFLAorCQkJUFJPVklERVJfTkFNRSAiLiUwMngiLCBwZGV2LT5pZCAmIDB4ZmYpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGRhdGEpOworCWh3LT5wbGF0Zm9ybV9kZXYgPSBwZGV2OworCisJaWYgKCgoZGVidWdfZW5hYmxlICYgSUdOT1JFX1BBUkFNX0ZST01fQ09ORklHKSA9PSAwKSAmJiBwZGF0YS0+Y29uZmlnX2xlbikgeworCQltbWpwZWdfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwgInBkYXRhLT5jb25maWc6ICVzXG4iLCBwZGF0YS0+Y29uZmlnKTsKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJwYXJtX3Y0bF9idWZmZXJfbWFyZ2luIiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJaHctPmR5bmFtaWNfYnVmX251bV9tYXJnaW4gPSBjb25maWdfdmFsOworCQllbHNlCisJCQlody0+ZHluYW1pY19idWZfbnVtX21hcmdpbiA9IGR5bmFtaWNfYnVmX251bV9tYXJnaW47CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV92NGxfY2FudmFzX21lbV9tb2RlIiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJaHctPmNhbnZhc19tb2RlID0gY29uZmlnX3ZhbDsKKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywKKwkJCSJwYXJtX3Y0bF9jYW52YXNfbWVtX2VuZGlhbiIsCisJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWh3LT5jYW52YXNfZW5kaWFuID0gY29uZmlnX3ZhbDsKKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgInNpZGViaW5kX3R5cGUiLAorCQkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJaHctPnNpZGViaW5kX3R5cGUgPSBjb25maWdfdmFsOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAic2lkZWJpbmRfY2hhbm5lbF9pZCIsCisJCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+c2lkZWJpbmRfY2hhbm5lbF9pZCA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV92NGxfY29kZWNfZW5hYmxlIiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJaHctPmlzX3VzZWRfdjRsID0gY29uZmlnX3ZhbDsKKwl9IGVsc2UgeworCQlody0+ZHluYW1pY19idWZfbnVtX21hcmdpbiA9IGR5bmFtaWNfYnVmX251bV9tYXJnaW47CisJfQorCisJaHctPmJ1Zl9udW0gPSB2bWpwZWdfZ2V0X2J1Zl9udW0oaHcpOworCisJaWYgKCFody0+aXNfdXNlZF92NGwpCisJCXZmX3Byb3ZpZGVyX2luaXQoJnBkYXRhLT52ZnJhbWVfcHJvdmlkZXIsIHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJJnZmX3Byb3ZpZGVyX29wcywgcGRhdGEpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGRhdGEpOworCisJaHctPnBsYXRmb3JtX2RldiA9IHBkZXY7CisKKwl2ZGVjX3NvdXJjZV9jaGFuZ2VkKFZGT1JNQVRfTUpQRUcsCisJCQkxOTIwLCAxMDgwLCA2MCk7CisJaWYgKHZtanBlZ19pbml0KHBkYXRhKSA8IDApIHsKKwkJcHJfaW5mbygiYW1tdmRlY19tanBlZyBpbml0IGZhaWxlZC5cbiIpOworCQlpZiAoaHcpIHsKKwkJCXZmcmVlKGh3KTsKKwkJCWh3ID0gTlVMTDsKKwkJfQorCQlwZGF0YS0+ZGVjX3N0YXR1cyA9IE5VTEw7CisJCXJldHVybiAtRU5PREVWOworCX0KKwl2ZGVjX3NldF9wcmVwYXJlX2xldmVsKHBkYXRhLCBzdGFydF9kZWNvZGVfYnVmX2xldmVsKTsKKworCWlmIChwZGF0YS0+cGFyYWxsZWxfZGVjID09IDEpCisJCXZkZWNfY29yZV9yZXF1ZXN0KHBkYXRhLCBDT1JFX01BU0tfVkRFQ18xKTsKKwllbHNlIHsKKwkJdmRlY19jb3JlX3JlcXVlc3QocGRhdGEsIENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQworCQkJCXwgQ09SRV9NQVNLX0NPTUJJTkUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtbXZkZWNfbWpwZWdfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHZkZWNfbWpwZWdfaHdfcyAqaHcgPQorCQkoc3RydWN0IHZkZWNfbWpwZWdfaHdfcyAqKQorCQkoKChzdHJ1Y3QgdmRlY19zICopKHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpKSktPnByaXZhdGUpOworCXN0cnVjdCB2ZGVjX3MgKnZkZWM7CisJaW50IGk7CisKKwlpZiAoIWh3KQorCQlyZXR1cm4gLTE7CisJdmRlYyA9IGh3X3RvX3ZkZWMoaHcpOworCisJdm1qcGVnX3N0b3AoaHcpOworCisJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKQorCQl2ZGVjX2NvcmVfcmVsZWFzZShod190b192ZGVjKGh3KSwgQ09SRV9NQVNLX1ZERUNfMSk7CisJZWxzZQorCQl2ZGVjX2NvcmVfcmVsZWFzZShod190b192ZGVjKGh3KSwgQ09SRV9NQVNLX1ZERUNfMSB8IENPUkVfTUFTS19IRVZDKTsKKwl2ZGVjX3NldF9zdGF0dXMoaHdfdG9fdmRlYyhodyksIFZERUNfU1RBVFVTX0RJU0NPTk5FQ1RFRCk7CisJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCWZvciAoaSA9IDA7IGkgPCBERUNPREVfQlVGRkVSX05VTV9NQVg7IGkrKykgeworCQkJdmRlYy0+ZnJlZV9jYW52YXNfZXgoaHctPmJ1ZmZlcl9zcGVjW2ldLnlfY2FudmFzX2luZGV4LCB2ZGVjLT5pZCk7CisJCQl2ZGVjLT5mcmVlX2NhbnZhc19leChody0+YnVmZmVyX3NwZWNbaV0udV9jYW52YXNfaW5kZXgsIHZkZWMtPmlkKTsKKwkJCXZkZWMtPmZyZWVfY2FudmFzX2V4KGh3LT5idWZmZXJfc3BlY1tpXS52X2NhbnZhc19pbmRleCwgdmRlYy0+aWQpOworCQl9CisJfQorCisJdmZyZWUoaHcpOworCisJcHJfaW5mbygiJXNcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFtbXZkZWNfbWpwZWdfZHJpdmVyID0geworCS5wcm9iZSA9IGFtbXZkZWNfbWpwZWdfcHJvYmUsCisJLnJlbW92ZSA9IGFtbXZkZWNfbWpwZWdfcmVtb3ZlLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kID0gYW12ZGVjX3N1c3BlbmQsCisJLnJlc3VtZSA9IGFtdmRlY19yZXN1bWUsCisjZW5kaWYKKwkuZHJpdmVyID0geworCQkubmFtZSA9IERSSVZFUl9OQU1FLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY29kZWNfcHJvZmlsZV90IGFtbXZkZWNfbWpwZWdfcHJvZmlsZSA9IHsKKwkubmFtZSA9ICJtbWpwZWciLAorCS5wcm9maWxlID0gInY0bCIKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFtbXZkZWNfbWpwZWdfZHJpdmVyX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaWYgKHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYW1tdmRlY19tanBlZ19kcml2ZXIpKSB7CisJCXByX2VycigiZmFpbGVkIHRvIHJlZ2lzdGVyIGFtbXZkZWNfbWpwZWcgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXZjb2RlY19wcm9maWxlX3JlZ2lzdGVyKCZhbW12ZGVjX21qcGVnX3Byb2ZpbGUpOworCXZjb2RlY19mZWF0dXJlX3JlZ2lzdGVyKFZGT1JNQVRfTUpQRUcsIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYW1tdmRlY19tanBlZ19kcml2ZXJfcmVtb3ZlX21vZHVsZSh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhbW12ZGVjX21qcGVnX2RyaXZlcik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworbW9kdWxlX3BhcmFtKGRlYnVnX2VuYWJsZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnX2VuYWJsZSwgIlxuIGRlYnVnIGVuYWJsZVxuIik7Cittb2R1bGVfcGFyYW0ocHJlX2RlY29kZV9idWZfbGV2ZWwsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHByZV9kZWNvZGVfYnVmX2xldmVsLAorCQkiXG4gYW1tdmRlY19oMjY0IHByZV9kZWNvZGVfYnVmX2xldmVsXG4iKTsKK21vZHVsZV9wYXJhbSh1ZGVidWdfZmxhZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHVkZWJ1Z19mbGFnLCAiXG4gYW12ZGVjX21tcGVnMTIgdWRlYnVnX2ZsYWdcbiIpOworCittb2R1bGVfcGFyYW0oZHluYW1pY19idWZfbnVtX21hcmdpbiwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGR5bmFtaWNfYnVmX251bV9tYXJnaW4sICJcbiBkeW5hbWljX2J1Zl9udW1fbWFyZ2luXG4iKTsKKworbW9kdWxlX3BhcmFtKGRlY29kZV90aW1lb3V0X3ZhbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlY29kZV90aW1lb3V0X3ZhbCwgIlxuIGFtbXZkZWNfbWpwZWcgZGVjb2RlX3RpbWVvdXRfdmFsXG4iKTsKKworbW9kdWxlX3BhcmFtX2FycmF5KG1heF9wcm9jZXNzX3RpbWUsIHVpbnQsICZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisKK21vZHVsZV9wYXJhbShyYWRyLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocmFkciwgIlxucmFkclxuIik7CisKK21vZHVsZV9wYXJhbShzdGFydF9kZWNvZGVfYnVmX2xldmVsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCwgIlxuc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbFxuIik7CisKK21vZHVsZV9wYXJhbShydmFsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocnZhbCwgIlxucnZhbFxuIik7CisKK21vZHVsZV9wYXJhbSh3aXRob3V0X2Rpc3BsYXlfbW9kZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHdpdGhvdXRfZGlzcGxheV9tb2RlLCAiXG4gd2l0aG91dF9kaXNwbGF5X21vZGVcbiIpOworCittb2R1bGVfaW5pdChhbW12ZGVjX21qcGVnX2RyaXZlcl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChhbW12ZGVjX21qcGVnX2RyaXZlcl9yZW1vdmVfbW9kdWxlKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTUxPR0lDIE1KTVBFRyBWaWRlbyBEZWNvZGVyIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiVGltIFlhbyA8dGlteWFvQGFtbG9naWMuY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL21wZWcxMi9NYWtlZmlsZSBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9tcGVnMTIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmNzhjNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9tcGVnMTIvTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACitvYmotJChDT05GSUdfQU1MT0dJQ19NRURJQV9WREVDX01QRUcxMikgKz0gYW12ZGVjX21wZWcxMi5vCithbXZkZWNfbXBlZzEyLW9ianMgKz0gdm1wZWcxMi5vCisKK29iai0kKENPTkZJR19BTUxPR0lDX01FRElBX1ZERUNfTVBFRzJfTVVMVEkpICs9IGFtdmRlY19tbXBlZzEyLm8KK2FtdmRlY19tbXBlZzEyLW9ianMgKz0gdm1wZWcxMl9tdWx0aS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvbXBlZzEyL3ZtcGVnMTIuYyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9tcGVnMTIvdm1wZWcxMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MTNhYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvbXBlZzEyL3ZtcGVnMTIuYwpAQCAtMCwwICsxLDIyMjEgQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvYW1wb3J0cy92bXBlZzEyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9mcmFtZV9zeW5jL3B0c3NlcnYuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL2Ftc3RyZWFtLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jYW52YXMvY2FudmFzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3Byb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3JlY2VpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9yZWdpc3RlcnMvY3B1X3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvZGVjX21tLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy92ZGVjX3JlZy5oPgorI2luY2x1ZGUgInZtcGVnMTIuaCIKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3JlZ2lzdGVycy9yZWdpc3Rlci5oPgorI2luY2x1ZGUgIi4uLy4uLy4uL3N0cmVhbV9pbnB1dC9hbXBvcnRzL2FtcG9ydHNfcHJpdi5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2RlY29kZXJfbW11X2JveC5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2RlY29kZXJfYm1tdV9ib3guaCIKKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jb2RlY19tbS9jb25maWdzLmg+CisvLyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL3RlZS5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvdGVlLmg+CisKKworCisjaWZkZWYgQ09ORklHX0FNX1ZERUNfTVBFRzEyX0xPRworI2RlZmluZSBBTUxPRworI2RlZmluZSBMT0dfTEVWRUxfVkFSICAgICAgIGFtbG9nX2xldmVsX3ZtcGVnCisjZGVmaW5lIExPR19NQVNLX1ZBUiAgICAgICAgYW1sb2dfbWFza192bXBlZworI2RlZmluZSBMT0dfTEVWRUxfRVJST1IgICAgIDAKKyNkZWZpbmUgTE9HX0xFVkVMX0lORk8gICAgICAxCisjZGVmaW5lIExPR19MRVZFTF9ERVNDICAiMDpFUlJPUiwgMTpJTkZPIgorI2VuZGlmCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy9hbWxvZy5oPgorTU9EVUxFX0FNTE9HKExPR19MRVZFTF9FUlJPUiwgMCwgTE9HX0xFVkVMX0RFU0MsIExPR19ERUZBVUxUX01BU0tfREVTQyk7CisKKyNpbmNsdWRlICIuLi91dGlscy9hbXZkZWMuaCIKKyNpbmNsdWRlICIuLi91dGlscy92ZGVjLmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvZmlybXdhcmUuaCIKKyNpbmNsdWRlICIuLi8uLi8uLi9jb21tb24vY2hpcHMvZGVjb2Rlcl9jcHVfdmVyX2luZm8uaCIKKworI2RlZmluZSBEUklWRVJfTkFNRSAiYW12ZGVjX21wZWcxMiIKKyNkZWZpbmUgTU9EVUxFX05BTUUgImFtdmRlY19tcGVnMTIiCisKKy8qIHByb3RvY29sIHJlZ2lzdGVycyAqLworI2RlZmluZSBNUkVHX1NFUV9JTkZPICAgICAgIEFWX1NDUkFUQ0hfNAorI2RlZmluZSBNUkVHX1BJQ19JTkZPICAgICAgIEFWX1NDUkFUQ0hfNQorI2RlZmluZSBNUkVHX1BJQ19XSURUSCAgICAgIEFWX1NDUkFUQ0hfNgorI2RlZmluZSBNUkVHX1BJQ19IRUlHSFQgICAgIEFWX1NDUkFUQ0hfNworI2RlZmluZSBNUkVHX0JVRkZFUklOICAgICAgIEFWX1NDUkFUQ0hfOAorI2RlZmluZSBNUkVHX0JVRkZFUk9VVCAgICAgIEFWX1NDUkFUQ0hfOQorCisjZGVmaW5lIE1SRUdfQ01EICAgICAgICAgICAgQVZfU0NSQVRDSF9BCisjZGVmaW5lIE1SRUdfQ09fTVZfU1RBUlQgICAgQVZfU0NSQVRDSF9CCisjZGVmaW5lIE1SRUdfRVJST1JfQ09VTlQgICAgQVZfU0NSQVRDSF9DCisjZGVmaW5lIE1SRUdfRlJBTUVfT0ZGU0VUICAgQVZfU0NSQVRDSF9ECisjZGVmaW5lIE1SRUdfV0FJVF9CVUZGRVIgICAgQVZfU0NSQVRDSF9FCisjZGVmaW5lIE1SRUdfRkFUQUxfRVJST1IgICAgQVZfU0NSQVRDSF9GCisjZGVmaW5lIE1SRUdfRk9SQ0VfSV9SRFkgICAgQVZfU0NSQVRDSF9HCisKKyNkZWZpbmUgUElDSU5GT19FUlJPUiAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIFBJQ0lORk9fVFlQRV9NQVNLICAgMHgwMDAzMDAwMAorI2RlZmluZSBQSUNJTkZPX1RZUEVfSSAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgUElDSU5GT19UWVBFX1AgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIFBJQ0lORk9fVFlQRV9CICAgICAgMHgwMDAyMDAwMAorCisjZGVmaW5lIFBJQ0lORk9fUFJPRyAgICAgICAgMHg4MDAwCisjZGVmaW5lIFBJQ0lORk9fUlBUX0ZJUlNUICAgMHg0MDAwCisjZGVmaW5lIFBJQ0lORk9fVE9QX0ZJUlNUICAgMHgyMDAwCisjZGVmaW5lIFBJQ0lORk9fRlJBTUUgICAgICAgMHgxMDAwCisKKyNkZWZpbmUgU0VRSU5GT19FWFRfQVZBSUxBQkxFICAgMHg4MDAwMDAwMAorI2RlZmluZSBTRVFJTkZPX1BST0cgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIENDQlVGX1NJWkUgICAgICAoNSoxMDI0KQorCisjZGVmaW5lIFZGX1BPT0xfU0laRSAgICAgICAgMzIKKyNkZWZpbmUgREVDT0RFX0JVRkZFUl9OVU1fTUFYIDgKKyNkZWZpbmUgUFVUX0lOVEVSVkFMICAgICAgICAoSFovMTAwKQorI2RlZmluZSBXT1JLU1BBQ0VfU0laRQkJKDIqU1pfNjRLKQorI2RlZmluZSBNQVhfQk1NVV9CVUZGRVJfTlVNIChERUNPREVfQlVGRkVSX05VTV9NQVggKyAxKQorCisKKyNkZWZpbmUgSU5DUFRSKHApIHB0cl9hdG9taWNfd3JhcF9pbmMoJnApCisKKyNkZWZpbmUgREVDX0NPTlRST0xfRkxBR19GT1JDRV8yNTAwXzcyMF81NzZfSU5URVJMQUNFICAweDAwMDIKKyNkZWZpbmUgREVDX0NPTlRST0xfRkxBR19GT1JDRV8zMDAwXzcwNF80ODBfSU5URVJMQUNFICAweDAwMDQKKyNkZWZpbmUgREVDX0NPTlRST0xfRkxBR19GT1JDRV8yNTAwXzcwNF81NzZfSU5URVJMQUNFICAweDAwMDgKKyNkZWZpbmUgREVDX0NPTlRST0xfRkxBR19GT1JDRV8yNTAwXzU0NF81NzZfSU5URVJMQUNFICAweDAwMTAKKyNkZWZpbmUgREVDX0NPTlRST0xfRkxBR19GT1JDRV8yNTAwXzQ4MF81NzZfSU5URVJMQUNFICAweDAwMjAKKyNkZWZpbmUgREVDX0NPTlRST0xfSU5URVJOQUxfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDBmZmYKKyNkZWZpbmUgREVDX0NPTlRST0xfRkxBR19GT1JDRV9TRVFfSU5URVJMQUNFICAgICAgICAgICAweDEwMDAKKworI2RlZmluZSBJTlRFUkxBQ0VfU0VRX0FMV0FZUworCisjaWYgMS8qIE1FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09ONiAqLworI2RlZmluZSBOVjIxCisjZW5kaWYKKworCitlbnVtIHsKKwlGUkFNRV9SRVBFQVRfVE9QLAorCUZSQU1FX1JFUEVBVF9CT1QsCisJRlJBTUVfUkVQRUFUX05PTkUKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZtcGVnX3ZmX3BlZWsodm9pZCAqKTsKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZtcGVnX3ZmX2dldCh2b2lkICopOworc3RhdGljIHZvaWQgdm1wZWdfdmZfcHV0KHN0cnVjdCB2ZnJhbWVfcyAqLCB2b2lkICopOworc3RhdGljIGludCB2bXBlZ192Zl9zdGF0ZXMoc3RydWN0IHZmcmFtZV9zdGF0ZXMgKnN0YXRlcywgdm9pZCAqKTsKK3N0YXRpYyBpbnQgdm1wZWdfZXZlbnRfY2IoaW50IHR5cGUsIHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGVfZGF0YSk7CisKK3N0YXRpYyBpbnQgdm1wZWcxMl9wcm90X2luaXQodm9pZCk7CitzdGF0aWMgdm9pZCB2bXBlZzEyX2xvY2FsX2luaXQodm9pZCk7CisKK3N0YXRpYyBjb25zdCBjaGFyIHZtcGVnMTJfZGVjX2lkW10gPSAidm1wZWcxMi1kZXYiOworI2RlZmluZSBQUk9WSURFUl9OQU1FICAgImRlY29kZXIubXBlZzEyIgorc3RhdGljIGNvbnN0IHN0cnVjdCB2ZnJhbWVfb3BlcmF0aW9uc19zIHZtcGVnX3ZmX3Byb3ZpZGVyID0geworCS5wZWVrID0gdm1wZWdfdmZfcGVlaywKKwkuZ2V0ID0gdm1wZWdfdmZfZ2V0LAorCS5wdXQgPSB2bXBlZ192Zl9wdXQsCisJLmV2ZW50X2NiID0gdm1wZWdfZXZlbnRfY2IsCisJLnZmX3N0YXRlcyA9IHZtcGVnX3ZmX3N0YXRlcywKK307CitzdGF0aWMgdm9pZCAqbW1fYmxrX2hhbmRsZTsKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3Byb3ZpZGVyX3Mgdm1wZWdfdmZfcHJvdjsKK3N0YXRpYyBpbnQgdHZwX2ZsYWc7CisKK3N0YXRpYyBERUNMQVJFX0tGSUZPKG5ld2ZyYW1lX3EsIHN0cnVjdCB2ZnJhbWVfcyAqLCBWRl9QT09MX1NJWkUpOworc3RhdGljIERFQ0xBUkVfS0ZJRk8oZGlzcGxheV9xLCBzdHJ1Y3QgdmZyYW1lX3MgKiwgVkZfUE9PTF9TSVpFKTsKK3N0YXRpYyBERUNMQVJFX0tGSUZPKHJlY3ljbGVfcSwgc3RydWN0IHZmcmFtZV9zICosIFZGX1BPT0xfU0laRSk7CisKK3N0YXRpYyBjb25zdCB1MzIgZnJhbWVfcmF0ZV90YWJbMTZdID0geworCTk2MDAwIC8gMzAsIDk2MDAwMDAwIC8gMjM5NzYsIDk2MDAwIC8gMjQsIDk2MDAwIC8gMjUsCisJOTYwMDAwMCAvIDI5OTcsIDk2MDAwIC8gMzAsIDk2MDAwIC8gNTAsIDk2MDAwMDAgLyA1OTk0LAorCTk2MDAwIC8gNjAsCisJLyogPiA4IHJlc2VydmVkLCB1c2UgMjQgKi8KKwk5NjAwMCAvIDI0LCA5NjAwMCAvIDI0LCA5NjAwMCAvIDI0LCA5NjAwMCAvIDI0LAorCTk2MDAwIC8gMjQsIDk2MDAwIC8gMjQsIDk2MDAwIC8gMjQKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgdmZwb29sW1ZGX1BPT0xfU0laRV07CitzdGF0aWMgc3RydWN0IHZmcmFtZV9zIHZmcG9vbDJbVkZfUE9PTF9TSVpFXTsKK3N0YXRpYyBpbnQgY3VyX3Bvb2xfaWR4Oworc3RhdGljIHMzMiB2ZmJ1Zl91c2VbREVDT0RFX0JVRkZFUl9OVU1fTUFYXTsKK3N0YXRpYyB1MzIgZGVjX2NvbnRyb2w7CitzdGF0aWMgdTMyIGZyYW1lX3dpZHRoLCBmcmFtZV9oZWlnaHQsIGZyYW1lX2R1ciwgZnJhbWVfcHJvZzsKK3N0YXRpYyB1MzIgc2F2ZWRfcmVzb2x1dGlvbjsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCByZWN5Y2xlX3RpbWVyOworc3RhdGljIHUzMiBzdGF0Oworc3RhdGljIHUzMiBidWZfc2l6ZSA9IDMyICogMTAyNCAqIDEwMjQ7CitzdGF0aWMgdTMyIGNjYnVmX3BoeUFkZHJlc3M7CitzdGF0aWMgdm9pZCAqY2NidWZfcGh5QWRkcmVzc192aXJ0Oworc3RhdGljIGludCBjY2J1Zl9waHlBZGRyZXNzX2lzX3JlbWFwZWRfbm9jYWNoZTsKK3N0YXRpYyB1MzIgbGFzdHB0czsKK3N0YXRpYyB1MzIgZnJfaGludF9zdGF0dXM7CitzdGF0aWMgdTMyIGxhc3Rfb2Zmc2V0Oworc3RhdGljIHUzMiByYXRpb19jb250cm9sOworCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7CisKK3N0YXRpYyB1MzIgZnJhbWVfcnB0X3N0YXRlOworCitzdGF0aWMgc3RydWN0IGRlY19zeXNpbmZvIHZtcGVnMTJfYW1zdHJlYW1fZGVjX2luZm87CitzdGF0aWMgc3RydWN0IHZkZWNfaW5mbyAqZ3ZzOworc3RhdGljIHN0cnVjdCB2ZGVjX3MgKnZkZWM7CisKKy8qIGZvciBlcnJvciBoYW5kbGluZyAqLworc3RhdGljIHMzMiBmcmFtZV9mb3JjZV9za2lwX2ZsYWc7CitzdGF0aWMgczMyIGVycm9yX2ZyYW1lX3NraXBfbGV2ZWw7CitzdGF0aWMgczMyIHdhaXRfYnVmZmVyX2NvdW50ZXI7CitzdGF0aWMgdTMyIGZpcnN0X2lfZnJhbWVfcmVhZHk7CitzdGF0aWMgdTMyIGZvcmNlX2ZpcnN0X2lfcmVhZHk7CisKK3N0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3QgdXNlcmRhdGFfcHVzaF93b3JrOworc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBub3RpZnlfd29yazsKK3N0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzZXRfd29yazsKK3N0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc2V0X2Nsa193b3JrOworc3RhdGljIGJvb2wgaXNfcmVzZXQ7CisKK3N0YXRpYyBERUZJTkVfTVVURVgodXNlcmRhdGFfbXV0ZXgpOworCitzdGF0aWMgdm9pZCB2bXBlZzEyX2NyZWF0ZV91c2VyZGF0YV9tYW5hZ2VyKHU4ICp1c2VyZGF0YV9idWYsIGludCBidWZfbGVuKTsKKworc3RydWN0IG1wZWcxMl91c2VyZGF0YV9yZWNvcmVkX3QgeworCXN0cnVjdCB1c2VyZGF0YV9tZXRhX2luZm9fdCBtZXRhX2luZm87CisJdTMyIHJlY19zdGFydDsKKwl1MzIgcmVjX2xlbjsKK307CisKKyNkZWZpbmUgVVNFUkRBVEFfRklGT19OVU0gICAgMjU2CisKK3N0cnVjdCBtcGVnMTJfdXNlcmRhdGFfaW5mb190IHsKKwlzdHJ1Y3QgbXBlZzEyX3VzZXJkYXRhX3JlY29yZWRfdCByZWNvcmRzW1VTRVJEQVRBX0ZJRk9fTlVNXTsKKwl1OCAqZGF0YV9idWY7CisJdTggKmRhdGFfYnVmX2VuZDsKKwl1MzIgYnVmX2xlbjsKKwl1MzIgcmVhZF9pbmRleDsKKwl1MzIgd3JpdGVfaW5kZXg7CisJdTMyIGxhc3Rfd3A7Cit9OworCitzdGF0aWMgc3RydWN0IG1wZWcxMl91c2VyZGF0YV9pbmZvX3QgKnBfdXNlcmRhdGFfbWdyOworCisKK3N0YXRpYyBpbmxpbmUgaW50IHBvb2xfaW5kZXgoc3RydWN0IHZmcmFtZV9zICp2ZikKK3sKKwlpZiAoKHZmID49ICZ2ZnBvb2xbMF0pICYmICh2ZiA8PSAmdmZwb29sW1ZGX1BPT0xfU0laRSAtIDFdKSkKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAoKHZmID49ICZ2ZnBvb2wyWzBdKSAmJiAodmYgPD0gJnZmcG9vbDJbVkZfUE9PTF9TSVpFIC0gMV0pKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSB1MzIgaW5kZXgyY2FudmFzKHUzMiBpbmRleCkKK3sKKwljb25zdCB1MzIgY2FudmFzX3RhYls4XSA9IHsKKyNpZmRlZiBOVjIxCisJCTB4MDEwMTAwLCAweDAzMDMwMiwgMHgwNTA1MDQsIDB4MDcwNzA2LAorCQkweDA5MDkwOCwgMHgwYjBiMGEsIDB4MGQwZDBjLCAweDBmMGYwZQorI2Vsc2UKKwkJMHgwMjAxMDAsIDB4MDUwNDAzLCAweDA4MDcwNiwgMHgwYjBhMDksCisJCTB4MGUwZDBjLCAweDExMTAwZiwgMHgxNDEzMTIsIDB4MTcxNjE1CisjZW5kaWYKKwl9OworCisJcmV0dXJuIGNhbnZhc190YWJbaW5kZXhdOworfQorCitzdGF0aWMgdm9pZCBzZXRfZnJhbWVfaW5mbyhzdHJ1Y3QgdmZyYW1lX3MgKnZmKQoreworCXVuc2lnbmVkIGludCBhcl9iaXRzOworCXUzMiB0ZW1wOworCisjaWZkZWYgQ09ORklHX0FNX1ZERUNfTVBFRzEyX0xPRworCWJvb2wgZmlyc3QgPSAoZnJhbWVfd2lkdGggPT0gMCkgJiYgKGZyYW1lX2hlaWdodCA9PSAwKTsKKyNlbmRpZgorCXRlbXAgPSBSRUFEX1ZSRUcoTVJFR19QSUNfV0lEVEgpOworCWlmICh0ZW1wID4gMTkyMCkKKwkJdmYtPndpZHRoID0gZnJhbWVfd2lkdGggPSAxOTIwOworCWVsc2UKKwkJdmYtPndpZHRoID0gZnJhbWVfd2lkdGggPSB0ZW1wOworCisJdGVtcCA9IFJFQURfVlJFRyhNUkVHX1BJQ19IRUlHSFQpOworCWlmICh0ZW1wID4gMTA4OCkKKwkJdmYtPmhlaWdodCA9IGZyYW1lX2hlaWdodCA9IDEwODg7CisJZWxzZQorCQl2Zi0+aGVpZ2h0ID0gZnJhbWVfaGVpZ2h0ID0gdGVtcDsKKworCXZmLT5mbGFnID0gMDsKKworCWlmIChmcmFtZV9kdXIgPiAwKQorCQl2Zi0+ZHVyYXRpb24gPSBmcmFtZV9kdXI7CisJZWxzZSB7CisJCWludCBpbmRleCA9IChSRUFEX1ZSRUcoTVJFR19TRVFfSU5GTykgPj4gNCkgJiAweGY7CisJCXZmLT5kdXJhdGlvbiA9IGZyYW1lX2R1ciA9IGZyYW1lX3JhdGVfdGFiW2luZGV4XTsKKwkJc2NoZWR1bGVfd29yaygmbm90aWZ5X3dvcmspOworCX0KKworCWd2cy0+ZnJhbWVfZHVyID0gdmYtPmR1cmF0aW9uOworCisJYXJfYml0cyA9IFJFQURfVlJFRyhNUkVHX1NFUV9JTkZPKSAmIDB4ZjsKKworCWlmIChhcl9iaXRzID09IDB4MikKKwkJdmYtPnJhdGlvX2NvbnRyb2wgPSAweGMwIDw8IERJU1BfUkFUSU9fQVNQRUNUX1JBVElPX0JJVDsKKworCWVsc2UgaWYgKGFyX2JpdHMgPT0gMHgzKQorCQl2Zi0+cmF0aW9fY29udHJvbCA9IDB4OTAgPDwgRElTUF9SQVRJT19BU1BFQ1RfUkFUSU9fQklUOworCisJZWxzZSBpZiAoYXJfYml0cyA9PSAweDQpCisJCXZmLT5yYXRpb19jb250cm9sID0gMHg3NCA8PCBESVNQX1JBVElPX0FTUEVDVF9SQVRJT19CSVQ7CisKKwllbHNlCisJCXZmLT5yYXRpb19jb250cm9sID0gMDsKKworCXJhdGlvX2NvbnRyb2wgPSB2Zi0+cmF0aW9fY29udHJvbDsKKworCWFtbG9nX2xldmVsX2lmKGZpcnN0LCBMT0dfTEVWRUxfSU5GTywKKwkJIm1wZWcyZGVjOiB3KCVkKSwgaCglZCksIGR1ciglZCksIGR1ci1FUyglZClcbiIsCisJCWZyYW1lX3dpZHRoLCBmcmFtZV9oZWlnaHQsIGZyYW1lX2R1ciwKKwkJZnJhbWVfcmF0ZV90YWJbKFJFQURfVlJFRyhNUkVHX1NFUV9JTkZPKSA+PiA0KSAmIDB4Zl0pOworfQorCitzdGF0aWMgYm9vbCBlcnJvcl9za2lwKHUzMiBpbmZvLCBzdHJ1Y3QgdmZyYW1lX3MgKnZmKQoreworCWlmIChlcnJvcl9mcmFtZV9za2lwX2xldmVsKSB7CisJCS8qIHNraXAgZXJyb3IgZnJhbWUgKi8KKwkJaWYgKChpbmZvICYgUElDSU5GT19FUlJPUikgfHwgKGZyYW1lX2ZvcmNlX3NraXBfZmxhZykpIHsKKwkJCWlmICgoaW5mbyAmIFBJQ0lORk9fRVJST1IpID09IDApIHsKKwkJCQlpZiAoKGluZm8gJiBQSUNJTkZPX1RZUEVfTUFTSykgPT0KKwkJCQkJUElDSU5GT19UWVBFX0kpCisJCQkJCWZyYW1lX2ZvcmNlX3NraXBfZmxhZyA9IDA7CisJCQl9IGVsc2UgeworCQkJCWlmIChlcnJvcl9mcmFtZV9za2lwX2xldmVsID49IDIpCisJCQkJCWZyYW1lX2ZvcmNlX3NraXBfZmxhZyA9IDE7CisJCQl9CisJCQlpZiAoKGluZm8gJiBQSUNJTkZPX0VSUk9SKSB8fCAoZnJhbWVfZm9yY2Vfc2tpcF9mbGFnKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKworCXJldHVybiBmYWxzZTsKK30KKworCitzdGF0aWMgdm9pZCBhbWxfc3dhcF9kYXRhKHVpbnQ4X3QgKnVzZXJfZGF0YSwgaW50IHVkX3NpemUpCit7CisJaW50IHN3YXBfYmxvY2tzLCBpLCBqLCBrLCBtOworCXVuc2lnbmVkIGNoYXIgY190ZW1wOworCisJLyogc3dhcCBieXRlIG9yZGVyICovCisJc3dhcF9ibG9ja3MgPSB1ZF9zaXplIC8gODsKKwlmb3IgKGkgPSAwOyBpIDwgc3dhcF9ibG9ja3M7IGkrKykgeworCQlqID0gaSAqIDg7CisJCWsgPSBqICsgNzsKKwkJZm9yIChtID0gMDsgbSA8IDQ7IG0rKykgeworCQkJY190ZW1wID0gdXNlcl9kYXRhW2pdOworCQkJdXNlcl9kYXRhW2orK10gPSB1c2VyX2RhdGFba107CisJCQl1c2VyX2RhdGFbay0tXSA9IGNfdGVtcDsKKwkJfQorCX0KK30KKworLyoKKyNkZWZpbmUgRFVNUF9VU0VSX0RBVEEKKyovCisjaWZkZWYgRFVNUF9VU0VSX0RBVEEKK3N0YXRpYyBpbnQgbGFzdF93cDsKKyNkZWZpbmUgRFVNUF9VU0VSX0RBVEFfSEVYCisKKworI2lmZGVmIERVTVBfVVNFUl9EQVRBX0hFWAorc3RhdGljIHZvaWQgcHJpbnRfZGF0YSh1bnNpZ25lZCBjaGFyICpwZGF0YSwKKwkJCQkJCWludCBsZW4sCisJCQkJCQl1bnNpZ25lZCBpbnQgZmxhZywKKwkJCQkJCXVuc2lnbmVkIGludCBkdXJhdGlvbiwKKwkJCQkJCXVuc2lnbmVkIGludCB2cHRzLAorCQkJCQkJdW5zaWduZWQgaW50IHZwdHNfdmFsaWQsCisJCQkJCQlpbnQgcmVjX2lkLAorCQkJCQkJdTMyIHJlZmVyZW5jZSkKK3sKKwlpbnQgbkxlZnQ7CisKKwluTGVmdCA9IGxlbjsKKworCXByX2luZm8oIiVkIGxlbjolZCwgZmxhZzoweCV4LCBkdXI6JWQsIHZwdHM6MHgleCwgdmFsaWQ6JWQsIHJlZmVyOiVkXG4iLAorCQkJCXJlY19pZCwJbGVuLCBmbGFnLAorCQkJCWR1cmF0aW9uLCB2cHRzLCB2cHRzX3ZhbGlkLAorCQkJCXJlZmVyZW5jZSk7CisJd2hpbGUgKG5MZWZ0ID49IDE2KSB7CisJCXByX2luZm8oIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQlwZGF0YVswXSwgcGRhdGFbMV0sIHBkYXRhWzJdLCBwZGF0YVszXSwKKwkJCXBkYXRhWzRdLCBwZGF0YVs1XSwgcGRhdGFbNl0sIHBkYXRhWzddLAorCQkJcGRhdGFbOF0sIHBkYXRhWzldLCBwZGF0YVsxMF0sIHBkYXRhWzExXSwKKwkJCXBkYXRhWzEyXSwgcGRhdGFbMTNdLCBwZGF0YVsxNF0sIHBkYXRhWzE1XSk7CisJCW5MZWZ0IC09IDE2OworCQlwZGF0YSArPSAxNjsKKwl9CisKKworCXdoaWxlIChuTGVmdCA+IDApIHsKKwkJcHJfaW5mbygiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJcGRhdGFbMF0sIHBkYXRhWzFdLCBwZGF0YVsyXSwgcGRhdGFbM10sCisJCQlwZGF0YVs0XSwgcGRhdGFbNV0sIHBkYXRhWzZdLCBwZGF0YVs3XSk7CisJCW5MZWZ0IC09IDg7CisJCXBkYXRhICs9IDg7CisJfQorfQorI2VuZGlmCisKKworI2RlZmluZSBERUJVR19DQ19EVU1QX0FTQ0lJCisKKyNpZmRlZiBERUJVR19DQ19EVU1QX0FTQ0lJCitzdGF0aWMgaW50IHZiaV90b19hc2NpaShpbnQgYykKK3sKKwlpZiAoYyA8IDApCisJCXJldHVybiAnPyc7CisKKwljICY9IDB4N0Y7CisKKwlpZiAoYyA8IDB4MjAgfHwgYyA+PSAweDdGKQorCQlyZXR1cm4gJy4nOworCisJcmV0dXJuIGM7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfY2NfYXNjaWkoY29uc3QgdWludDhfdCAqYnVmLCBpbnQgcG9jKQoreworCWludCBjY19mbGFnOworCWludCBjY19jb3VudDsKKwlpbnQgaTsKKwlpbnQgc3pBc2NpaVszMl07CisJaW50IGluZGV4ID0gMDsKKworCWNjX2ZsYWcgPSBidWZbMV0gJiAweDQwOworCWlmICghY2NfZmxhZykgeworCQlwcl9pbmZvKCIjIyMgY2NfZmxhZyBpcyBpbnZhbGlkXG4iKTsKKwkJcmV0dXJuOworCX0KKwljY19jb3VudCA9IGJ1ZlsxXSAmIDB4MWY7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2NfY291bnQ7ICsraSkgeworCQl1bnNpZ25lZCBpbnQgYjA7CisJCXVuc2lnbmVkIGludCBjY192YWxpZDsKKwkJdW5zaWduZWQgaW50IGNjX3R5cGU7CisJCXVuc2lnbmVkIGNoYXIgY2NfZGF0YTE7CisJCXVuc2lnbmVkIGNoYXIgY2NfZGF0YTI7CisKKwkJYjAgPSBidWZbMyArIGkgKiAzXTsKKwkJY2NfdmFsaWQgPSBiMCAmIDQ7CisJCWNjX3R5cGUgPSBiMCAmIDM7CisJCWNjX2RhdGExID0gYnVmWzQgKyBpICogM107CisJCWNjX2RhdGEyID0gYnVmWzUgKyBpICogM107CisKKworCQlpZiAoY2NfdHlwZSA9PSAwKSB7CisJCQkvKiBOVFNDIHBhaXIsIExpbmUgMjEgKi8KKwkJCXN6QXNjaWlbaW5kZXgrK10gPSB2YmlfdG9fYXNjaWkoY2NfZGF0YTEpOworCQkJc3pBc2NpaVtpbmRleCsrXSA9IHZiaV90b19hc2NpaShjY19kYXRhMik7CisJCQlpZiAoKCFjY192YWxpZCkgfHwgKGkgPj0gMykpCisJCQkJYnJlYWs7CisJCX0KKwl9CisJc3dpdGNoIChpbmRleCkgeworCWNhc2UgODoKKwkJcHJfaW5mbygicHVzaCBwb2M6JWQgOiAlYyAlYyAlYyAlYyAlYyAlYyAlYyAlY1xuIiwKKwkJCXBvYywKKwkJCXN6QXNjaWlbMF0sIHN6QXNjaWlbMV0sIHN6QXNjaWlbMl0sIHN6QXNjaWlbM10sCisJCQlzekFzY2lpWzRdLCBzekFzY2lpWzVdLCBzekFzY2lpWzZdLCBzekFzY2lpWzddKTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQlwcl9pbmZvKCJwdXNoIHBvYzolZCA6ICVjICVjICVjICVjICVjICVjICVjXG4iLAorCQkJcG9jLAorCQkJc3pBc2NpaVswXSwgc3pBc2NpaVsxXSwgc3pBc2NpaVsyXSwgc3pBc2NpaVszXSwKKwkJCXN6QXNjaWlbNF0sIHN6QXNjaWlbNV0sIHN6QXNjaWlbNl0pOworCQlicmVhazsKKwljYXNlIDY6CisJCXByX2luZm8oInB1c2ggcG9jOiVkIDogJWMgJWMgJWMgJWMgJWMgJWNcbiIsIHBvYywKKwkJCXN6QXNjaWlbMF0sIHN6QXNjaWlbMV0sIHN6QXNjaWlbMl0sIHN6QXNjaWlbM10sCisJCQlzekFzY2lpWzRdLCBzekFzY2lpWzVdKTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQlwcl9pbmZvKCJwdXNoIHBvYzolZCA6ICVjICVjICVjICVjICVjXG4iLCBwb2MsCisJCQlzekFzY2lpWzBdLCBzekFzY2lpWzFdLCBzekFzY2lpWzJdLCBzekFzY2lpWzNdLAorCQkJc3pBc2NpaVs0XSk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJcHJfaW5mbygicHVzaCBwb2M6JWQgOiAlYyAlYyAlYyAlY1xuIiwgcG9jLAorCQkJc3pBc2NpaVswXSwgc3pBc2NpaVsxXSwgc3pBc2NpaVsyXSwgc3pBc2NpaVszXSk7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJcHJfaW5mbygicHVzaCBwb2M6JWQgOiAlYyAlYyAlY1xuIiwgcG9jLAorCQkJc3pBc2NpaVswXSwgc3pBc2NpaVsxXSwgc3pBc2NpaVsyXSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcHJfaW5mbygicHVzaCBwb2M6JWQgOiAlYyAlY1xuIiwgcG9jLAorCQkJc3pBc2NpaVswXSwgc3pBc2NpaVsxXSk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJcHJfaW5mbygicHVzaCBwb2M6JWQgOiAlY1xuIiwgcG9jLCBzekFzY2lpWzBdKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfaW5mbygicHVzaCBwb2M6JWQgYW5kIG5vIENDIGRhdGE6IGluZGV4ID0gJWRcbiIsCisJCQlwb2MsIGluZGV4KTsKKwkJYnJlYWs7CisJfQorfQorI2VuZGlmCisKKworc3RhdGljIGludCBpc19hdHNjKHU4ICpwZGF0YSkKK3sKKwlpZiAoKHBkYXRhWzBdID09IDB4NDcpICYmCisJCShwZGF0YVsxXSA9PSAweDQxKSAmJgorCQkocGRhdGFbMl0gPT0gMHgzOSkgJiYKKwkJKHBkYXRhWzNdID09IDB4MzQpKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorLyoKKyNkZWZpbmUgRFVNUF9IRUFEX0lORk9fREFUQQorKi8KK3N0YXRpYyB2b2lkIGR1bXBfZGF0YSh1OCAqcGRhdGEsCisJCQkJCQl1bnNpZ25lZCBpbnQgdXNlcl9kYXRhX2xlbmd0aCwKKwkJCQkJCXVuc2lnbmVkIGludCBmbGFnLAorCQkJCQkJdW5zaWduZWQgaW50IGR1cmF0aW9uLAorCQkJCQkJdW5zaWduZWQgaW50IHZwdHMsCisJCQkJCQl1bnNpZ25lZCBpbnQgdnB0c192YWxpZCwKKwkJCQkJCWludCByZWNfaWQsCisJCQkJCQl1MzIgcmVmZXJlbmNlKQoreworCXVuc2lnbmVkIGNoYXIgc3pCdWZbMjU2XTsKKworCisJbWVtc2V0KHN6QnVmLCAwLCAyNTYpOworCW1lbWNweShzekJ1ZiwgcGRhdGEsIHVzZXJfZGF0YV9sZW5ndGgpOworCisJYW1sX3N3YXBfZGF0YShzekJ1ZiwgdXNlcl9kYXRhX2xlbmd0aCk7CisjaWZkZWYgRFVNUF9VU0VSX0RBVEFfSEVYCisJcHJpbnRfZGF0YShzekJ1ZiwKKwkJCQl1c2VyX2RhdGFfbGVuZ3RoLAorCQkJCWZsYWcsCisJCQkJZHVyYXRpb24sCisJCQkJdnB0cywKKwkJCQl2cHRzX3ZhbGlkLAorCQkJCXJlY19pZCwKKwkJCQlyZWZlcmVuY2UpOworI2VuZGlmCisKKyNpZmRlZiBERUJVR19DQ19EVU1QX0FTQ0lJCisjaWZkZWYgRFVNUF9IRUFEX0lORk9fREFUQQorCWlmIChpc19hdHNjKHN6QnVmKzgpKQorCQlkdW1wX2NjX2FzY2lpKHN6QnVmKzgrNCwgcmVmZXJlbmNlKTsKKyNlbHNlCisJaWYgKGlzX2F0c2Moc3pCdWYpKQorCQlkdW1wX2NjX2FzY2lpKHN6QnVmKzQsIHJlZmVyZW5jZSk7CisjZW5kaWYKKyNlbmRpZgorfQorCisKKworCisjZGVmaW5lIE1BWF9VU0VSX0RBVEFfU0laRQkJMTU3Mjg2NAorc3RhdGljIHZvaWQgKnVzZXJfZGF0YV9idWY7CitzdGF0aWMgdW5zaWduZWQgY2hhciAqcGJ1Zl9zdGFydDsKK3N0YXRpYyBpbnQgdG90YWxfbGVuOworc3RhdGljIGludCBic2tpcDsKK3N0YXRpYyBpbnQgbl91c2VyZGF0YV9pZDsKKworc3RhdGljIHZvaWQgcmVzZXRfdXNlcl9kYXRhX2J1Zih2b2lkKQoreworCXRvdGFsX2xlbiA9IDA7CisJcGJ1Zl9zdGFydCA9IHVzZXJfZGF0YV9idWY7CisJYnNraXAgPSAwOworCW5fdXNlcmRhdGFfaWQgPSAwOworfQorCitzdGF0aWMgdm9pZCBwdXNoX3RvX2J1Zih1OCAqcGRhdGEsIGludCBsZW4sIHN0cnVjdCB1c2VyZGF0YV9tZXRhX2luZm9fdCAqcG1ldGEsCisJdTMyIHJlZmVyZW5jZSkKK3sKKwl1MzIgKnBMZW47CisJaW50IGluZm9fY250OworCXU4ICpwYnVmX2VuZDsKKworCWlmICghdXNlcl9kYXRhX2J1ZikKKwkJcmV0dXJuOworCisJaWYgKGJza2lwKSB7CisJCXByX2luZm8oIm92ZXIgc2l6ZSwgc2tpcFxuIik7CisJCXJldHVybjsKKwl9CisJaW5mb19jbnQgPSAwOworCXBMZW4gPSAodTMyICopcGJ1Zl9zdGFydDsKKworCSpwTGVuID0gbGVuOworCXBidWZfc3RhcnQgKz0gc2l6ZW9mKHUzMik7CisJaW5mb19jbnQrKzsKKwlwTGVuKys7CisKKwkqcExlbiA9IHBtZXRhLT5kdXJhdGlvbjsKKwlwYnVmX3N0YXJ0ICs9IHNpemVvZih1MzIpOworCWluZm9fY250Kys7CisJcExlbisrOworCisJKnBMZW4gPSBwbWV0YS0+ZmxhZ3M7CisJcGJ1Zl9zdGFydCArPSBzaXplb2YodTMyKTsKKwlpbmZvX2NudCsrOworCXBMZW4rKzsKKworCSpwTGVuID0gcG1ldGEtPnZwdHM7CisJcGJ1Zl9zdGFydCArPSBzaXplb2YodTMyKTsKKwlpbmZvX2NudCsrOworCXBMZW4rKzsKKworCSpwTGVuID0gcG1ldGEtPnZwdHNfdmFsaWQ7CisJcGJ1Zl9zdGFydCArPSBzaXplb2YodTMyKTsKKwlpbmZvX2NudCsrOworCXBMZW4rKzsKKworCisJKnBMZW4gPSBuX3VzZXJkYXRhX2lkOworCXBidWZfc3RhcnQgKz0gc2l6ZW9mKHUzMik7CisJaW5mb19jbnQrKzsKKwlwTGVuKys7CisKKwkqcExlbiA9IHJlZmVyZW5jZTsKKwlwYnVmX3N0YXJ0ICs9IHNpemVvZih1MzIpOworCWluZm9fY250Kys7CisJcExlbisrOworCisKKworCXBidWZfZW5kID0gKHU4ICopY2NidWZfcGh5QWRkcmVzc192aXJ0ICsgQ0NCVUZfU0laRTsKKwlpZiAocGRhdGEgKyBsZW4gPiBwYnVmX2VuZCkgeworCQlpbnQgZmlyc3Rfc2VjdGlvbl9sZW47CisKKwkJZmlyc3Rfc2VjdGlvbl9sZW4gPSBwYnVmX2VuZCAtIHBkYXRhOworCQltZW1jcHkocGJ1Zl9zdGFydCwgcGRhdGEsIGZpcnN0X3NlY3Rpb25fbGVuKTsKKwkJcGRhdGEgPSAodTggKiljY2J1Zl9waHlBZGRyZXNzX3ZpcnQ7CisJCXBidWZfc3RhcnQgKz0gZmlyc3Rfc2VjdGlvbl9sZW47CisJCW1lbWNweShwYnVmX3N0YXJ0LCBwZGF0YSwgbGVuIC0gZmlyc3Rfc2VjdGlvbl9sZW4pOworCQlwYnVmX3N0YXJ0ICs9IGxlbiAtIGZpcnN0X3NlY3Rpb25fbGVuOworCX0gZWxzZSB7CisJCW1lbWNweShwYnVmX3N0YXJ0LCBwZGF0YSwgbGVuKTsKKwkJcGJ1Zl9zdGFydCArPSBsZW47CisJfQorCisJdG90YWxfbGVuICs9IGxlbiArIGluZm9fY250ICogc2l6ZW9mKHUzMik7CisJaWYgKHRvdGFsX2xlbiA+PSBNQVhfVVNFUl9EQVRBX1NJWkUtNDA5NikKKwkJYnNraXAgPSAxOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3VzZXJkYXRhX2luZm8odm9pZCAqcHVzZXJfZGF0YSwKKwkJCQkJaW50IGxlbiwKKwkJCQkJc3RydWN0IHVzZXJkYXRhX21ldGFfaW5mb190ICpwbWV0YSwKKwkJCQkJdTMyIHJlZmVyZW5jZSkKK3sKKwl1OCAqcHN0YXJ0OworCisJcHN0YXJ0ID0gKHU4ICopcHVzZXJfZGF0YTsKKworI2lmZGVmCURVTVBfSEVBRF9JTkZPX0RBVEEKKwlwdXNoX3RvX2J1Zihwc3RhcnQsIGxlbiwgcG1ldGEsIHJlZmVyZW5jZSk7CisjZWxzZQorCXB1c2hfdG9fYnVmKHBzdGFydCs4LCBsZW4gLSA4LCBwbWV0YSwgcmVmZXJlbmNlKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBzaG93X3VzZXJfZGF0YV9idWYodm9pZCkKK3sKKwl1OCAqcGJ1ZjsKKwlpbnQgbGVuOworCXVuc2lnbmVkIGludCBmbGFnOworCXVuc2lnbmVkIGludCBkdXJhdGlvbjsKKwl1bnNpZ25lZCBpbnQgdnB0czsKKwl1bnNpZ25lZCBpbnQgdnB0c192YWxpZDsKKwlpbnQgcmVjX2lkOworCXUzMiByZWZlcmVuY2U7CisKKwlwcl9pbmZvKCJzaG93IHVzZXIgZGF0YSBidWZcbiIpOworCXBidWYgPSB1c2VyX2RhdGFfYnVmOworCisJd2hpbGUgKHBidWYgPCBwYnVmX3N0YXJ0KSB7CisJCXUzMiAqcExlbjsKKworCQlwTGVuID0gKHUzMiAqKXBidWY7CisKKwkJbGVuID0gKnBMZW47CisJCXBMZW4rKzsKKwkJcGJ1ZiArPSBzaXplb2YodTMyKTsKKworCQlkdXJhdGlvbiA9ICpwTGVuOworCQlwTGVuKys7CisJCXBidWYgKz0gc2l6ZW9mKHUzMik7CisKKwkJZmxhZyA9ICpwTGVuOworCQlwTGVuKys7CisJCXBidWYgKz0gc2l6ZW9mKHUzMik7CisKKwkJdnB0cyA9ICpwTGVuOworCQlwTGVuKys7CisJCXBidWYgKz0gc2l6ZW9mKHUzMik7CisKKwkJdnB0c192YWxpZCA9ICpwTGVuOworCQlwTGVuKys7CisJCXBidWYgKz0gc2l6ZW9mKHUzMik7CisKKwkJcmVjX2lkID0gKnBMZW47CisJCXBMZW4rKzsKKwkJcGJ1ZiArPSBzaXplb2YodTMyKTsKKworCQlyZWZlcmVuY2UgPSAqcExlbjsKKwkJcExlbisrOworCQlwYnVmICs9IHNpemVvZih1MzIpOworCisKKwkJZHVtcF9kYXRhKHBidWYsIGxlbiwgZmxhZywgZHVyYXRpb24sCisJCQl2cHRzLCB2cHRzX3ZhbGlkLCByZWNfaWQsIHJlZmVyZW5jZSk7CisJCXBidWYgKz0gbGVuOworCQltc2xlZXAoMzApOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB2bXBlZzEyX2FkZF91c2VyZGF0YShzdHJ1Y3QgdXNlcmRhdGFfbWV0YV9pbmZvX3QgbWV0YV9pbmZvLAorCQkJCQkJCQlpbnQgd3AsCisJCQkJCQkJCXUzMiByZWZlcmVuY2UpOworLyoKKyNkZWZpbmUgUFJJTlRfSEVBRF9JTkZPCisqLworc3RhdGljIHZvaWQgdXNlcmRhdGFfcHVzaF9kb193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwl1MzIgcmVnOworCXUzMiBvZmZzZXQsIHB0czsKKwl1NjQgcHRzX3VzNjQgPSAwOworCXU4ICpwZGF0YTsKKwl1OCBoZWFkX2luZm9bOF07CisJc3RydWN0IHVzZXJkYXRhX21ldGFfaW5mb190IG1ldGFfaW5mbzsKKwl1MzIgd3A7CisJdTMyIGluZGV4OworCXUzMiBwaWN0dXJlX3N0cnVjdDsKKwl1MzIgcmVmZXJlbmNlOworCXUzMiBwaWN0dXJlX3R5cGU7CisJdTMyIHRlbXA7CisjaWZkZWYgUFJJTlRfSEVBRF9JTkZPCisJdTggKnB0eXBlX3N0cjsKKyNlbmRpZgorCW1lbXNldCgmbWV0YV9pbmZvLCAwLCBzaXplb2YobWV0YV9pbmZvKSk7CisKKwltZXRhX2luZm8uZHVyYXRpb24gPSBmcmFtZV9kdXI7CisKKwlyZWcgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9NKTsKKwltZXRhX2luZm8uZmxhZ3MgPSAoKHJlZyA+PiAzMCkgPDwgMSk7CisJbWV0YV9pbmZvLmZsYWdzIHw9IChWRk9STUFUX01QRUcxMiA8PCAzKTsKKwkvKiBjaGVjayAgdG9wX2ZpZWxkX2ZpcnN0IGZsYWcgKi8KKwlpZiAoKHJlZyA+PiAyOCkgJiAweDEpIHsKKwkJbWV0YV9pbmZvLmZsYWdzIHw9ICgxIDw8IDEwKTsKKwkJbWV0YV9pbmZvLmZsYWdzIHw9ICgoKHJlZyA+PiAyOSkgJiAweDEpIDw8IDExKTsKKwl9CisKKwlvZmZzZXQgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9OKTsKKwlpZiAob2Zmc2V0ICE9IGxhc3Rfb2Zmc2V0KSB7CisJCW1ldGFfaW5mby5mbGFncyB8PSAxOworCQlsYXN0X29mZnNldCA9IG9mZnNldDsKKwl9CisKKwlpZiAocHRzX3BpY2tvdXRfb2Zmc2V0X3VzNjQKKwkJCSAoUFRTX1RZUEVfVklERU8sIG9mZnNldCwgJnB0cywgMCwgJnB0c191czY0KSAhPSAwKSB7CisJCXByX2luZm8oInBpY2sgb3V0IHB0cyBmYWlsZWQgYnkgb2Zmc2V0ID0gMHgleFxuIiwgb2Zmc2V0KTsKKwkJcHRzID0gLTE7CisJCW1ldGFfaW5mby52cHRzX3ZhbGlkID0gMDsKKwl9IGVsc2UKKwkJbWV0YV9pbmZvLnZwdHNfdmFsaWQgPSAxOworCW1ldGFfaW5mby52cHRzID0gcHRzOworCisJaWYgKCFjY2J1Zl9waHlBZGRyZXNzX2lzX3JlbWFwZWRfbm9jYWNoZSAmJgorCQljY2J1Zl9waHlBZGRyZXNzICYmCisJCWNjYnVmX3BoeUFkZHJlc3NfdmlydCkgeworCQljb2RlY19tbV9kbWFfZmx1c2goCisJCQljY2J1Zl9waHlBZGRyZXNzX3ZpcnQsCisJCQlDQ0JVRl9TSVpFLAorCQkJRE1BX0ZST01fREVWSUNFKTsKKwl9CisKKwltdXRleF9sb2NrKCZ1c2VyZGF0YV9tdXRleCk7CisJaWYgKHBfdXNlcmRhdGFfbWdyICYmIGNjYnVmX3BoeUFkZHJlc3NfdmlydCkgeworCQlpbnQgbmV3X3dwOworCisJCW5ld193cCA9IHJlZyAmIDB4ZmZmZjsKKwkJaWYgKG5ld193cCA8IHBfdXNlcmRhdGFfbWdyLT5sYXN0X3dwKQorCQkJcGRhdGEgPSAodTggKiljY2J1Zl9waHlBZGRyZXNzX3ZpcnQ7CisJCWVsc2UKKwkJCXBkYXRhID0gKHU4ICopY2NidWZfcGh5QWRkcmVzc192aXJ0ICsKKwkJCQkJCXBfdXNlcmRhdGFfbWdyLT5sYXN0X3dwOworCQltZW1jcHkoaGVhZF9pbmZvLCBwZGF0YSwgOCk7CisJfSBlbHNlCisJCW1lbXNldChoZWFkX2luZm8sIDAsIDgpOworCW11dGV4X3VubG9jaygmdXNlcmRhdGFfbXV0ZXgpOworCWFtbF9zd2FwX2RhdGEoaGVhZF9pbmZvLCA4KTsKKworCXdwID0gKGhlYWRfaW5mb1swXSA8PCA4IHwgaGVhZF9pbmZvWzFdKTsKKwlpbmRleCA9IChoZWFkX2luZm9bMl0gPDwgOCB8IGhlYWRfaW5mb1szXSk7CisKKwlwaWN0dXJlX3N0cnVjdCA9IChoZWFkX2luZm9bNl0gPDwgOCB8IGhlYWRfaW5mb1s3XSk7CisJdGVtcCA9IChoZWFkX2luZm9bNF0gPDwgOCB8IGhlYWRfaW5mb1s1XSk7CisJcmVmZXJlbmNlID0gdGVtcCAmIDB4M0ZGOworCXBpY3R1cmVfdHlwZSA9ICh0ZW1wID4+IDEwKSAmIDB4NzsKKworI2lmIDAKKwlwcl9pbmZvKCJpbmRleCA9ICVkLCB3cCA9ICVkLCByZWYgPSAlZCwgdHlwZSA9ICVkLCBzdHJ1Y3QgPSAweCV4LCB2cHRzOjB4JXhcbiIsCisJCWluZGV4LCB3cCwgcmVmZXJlbmNlLAorCQlwaWN0dXJlX3R5cGUsIHBpY3R1cmVfc3RydWN0LCBtZXRhX2luZm8udnB0cyk7CisjZW5kaWYKKwlzd2l0Y2ggKHBpY3R1cmVfdHlwZSkgeworCWNhc2UgMToKKwkJCS8qIHByX2luZm8oIkkgdHlwZSwgcG9zOiVkXG4iLAorCQkJCQkobWV0YV9pbmZvLmZsYWdzPj4xKSYweDMpOyAqLworCQkJbWV0YV9pbmZvLmZsYWdzIHw9ICgxPDw3KTsKKyNpZmRlZiBQUklOVF9IRUFEX0lORk8KKwkJCXB0eXBlX3N0ciA9ICIgSSI7CisjZW5kaWYKKwkJCWJyZWFrOworCWNhc2UgMjoKKwkJCS8qIHByX2luZm8oIlAgdHlwZSwgcG9zOiVkXG4iLAorCQkJCQkobWV0YV9pbmZvLmZsYWdzPj4xKSYweDMpOyAqLworCQkJbWV0YV9pbmZvLmZsYWdzIHw9ICgyPDw3KTsKKyNpZmRlZiBQUklOVF9IRUFEX0lORk8KKwkJCXB0eXBlX3N0ciA9ICIgUCI7CisjZW5kaWYKKwkJCWJyZWFrOworCWNhc2UgMzoKKwkJCS8qIHByX2luZm8oIkIgdHlwZSwgcG9zOiVkXG4iLAorCQkJCQkobWV0YV9pbmZvLmZsYWdzPj4xKSYweDMpOyAqLworCQkJbWV0YV9pbmZvLmZsYWdzIHw9ICgzPDw3KTsKKyNpZmRlZiBQUklOVF9IRUFEX0lORk8KKwkJCXB0eXBlX3N0ciA9ICIgQiI7CisjZW5kaWYKKwkJCWJyZWFrOworCWNhc2UgNDoKKwkJCS8qIHByX2luZm8oIkQgdHlwZSwgcG9zOiVkXG4iLAorCQkJCQkobWV0YV9pbmZvLmZsYWdzPj4xKSYweDMpOyAqLworCQkJbWV0YV9pbmZvLmZsYWdzIHw9ICg0PDw3KTsKKyNpZmRlZiBQUklOVF9IRUFEX0lORk8KKwkJCXB0eXBlX3N0ciA9ICIgRCI7CisjZW5kaWYKKwkJCWJyZWFrOworCWRlZmF1bHQ6CisJCQkvKiBwcl9pbmZvKCJVbmtub3duIHR5cGU6MHgleCwgcG9zOiVkXG4iLAorCQkJCQlwaGVhZGVyLT5waWN0dXJlX2NvZGluZ190eXBlLAorCQkJCQkobWV0YV9pbmZvLmZsYWdzPj4xKSYweDMpOyAqLworI2lmZGVmIFBSSU5UX0hFQURfSU5GTworCQkJcHR5cGVfc3RyID0gIiBVIjsKKyNlbmRpZgorCQkJYnJlYWs7CisJfQorI2lmZGVmIFBSSU5UX0hFQURfSU5GTworCXByX2luZm8oInJlZjolZCwgdHlwZTolcywgZXh0OiVkLCBvZmZzZXQ6MHgleCwgZmlyc3Q6JWQsIGlkOiVkXG4iLAorCQlyZWZlcmVuY2UsIHB0eXBlX3N0ciwKKwkJKHJlZyA+PiAzMCksIG9mZnNldCwKKwkJKHJlZyA+PiAyOCkmMHgzLAorCQluX3VzZXJkYXRhX2lkKTsKKyNlbmRpZgorCXZtcGVnMTJfYWRkX3VzZXJkYXRhKG1ldGFfaW5mbywgcmVnICYgMHhmZmZmLCByZWZlcmVuY2UpOworCisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX00sIDApOworfQorCitzdGF0aWMgdm9pZCB2bXBlZzEyX25vdGlmeV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlwcl9pbmZvKCJmcmFtZSBkdXJhdGlvbiBjaGFuZ2VkICVkXG4iLCBmcmFtZV9kdXIpOworCWlmIChmcl9oaW50X3N0YXR1cyA9PSBWREVDX05FRURfSElOVCkgeworCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoUFJPVklERVJfTkFNRSwKKwkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9GUl9ISU5ULAorCQkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpZnJhbWVfZHVyKSk7CisJCWZyX2hpbnRfc3RhdHVzID0gVkRFQ19ISU5URUQ7CisJfQorCXJldHVybjsKK30KK3N0YXRpYyBpcnFyZXR1cm5fdCB2bXBlZzEyX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJdTMyIHJlZywgaW5mbywgc2VxaW5mbywgb2Zmc2V0LCBwdHMsIHB0c192YWxpZCA9IDA7CisJc3RydWN0IHZmcmFtZV9zICp2ZjsKKwl1NjQgcHRzX3VzNjQgPSAwOworCXUzMiBmcmFtZV9zaXplOworCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfQ0xSX1JFRywgMSk7CisKKwlyZWcgPSBSRUFEX1ZSRUcoTVJFR19CVUZGRVJPVVQpOworCisJaWYgKHJlZykgeworCQlpbmZvID0gUkVBRF9WUkVHKE1SRUdfUElDX0lORk8pOworCQlvZmZzZXQgPSBSRUFEX1ZSRUcoTVJFR19GUkFNRV9PRkZTRVQpOworCQlzZXFpbmZvID0gUkVBRF9WUkVHKE1SRUdfU0VRX0lORk8pOworCisJCWlmICgoZmlyc3RfaV9mcmFtZV9yZWFkeSA9PSAwKSAmJgorCQkJKChpbmZvICYgUElDSU5GT19UWVBFX01BU0spID09IFBJQ0lORk9fVFlQRV9JKSAmJgorCQkJKChpbmZvICYgUElDSU5GT19FUlJPUikgPT0gMCkpCisJCQlmaXJzdF9pX2ZyYW1lX3JlYWR5ID0gMTsKKworCQlpZiAoKHB0c19sb29rdXBfb2Zmc2V0X3VzNjQKKwkJCSAoUFRTX1RZUEVfVklERU8sIG9mZnNldCwgJnB0cywKKwkJCSAmZnJhbWVfc2l6ZSwgMCwgJnB0c191czY0KSA9PSAwKQorCQkJJiYgKCgoaW5mbyAmIFBJQ0lORk9fVFlQRV9NQVNLKSA9PSBQSUNJTkZPX1RZUEVfSSkKKwkJCQl8fCAoKGluZm8gJiBQSUNJTkZPX1RZUEVfTUFTSykgPT0KKwkJCQkJUElDSU5GT19UWVBFX1ApKSkKKwkJCXB0c192YWxpZCA9IDE7CisKKwkJaWYgKHB0c192YWxpZCAmJiBsYXN0cHRzID09IHB0cykKKwkJCXB0c192YWxpZCA9IDA7CisJCWlmIChwdHNfdmFsaWQpCisJCQlsYXN0cHRzID0gcHRzOworCQkvKmlmIChmcmFtZV9wcm9nID09IDApICovCisJCXsKKwkJCWZyYW1lX3Byb2cgPSBpbmZvICYgUElDSU5GT19QUk9HOworCQkJaWYgKChzZXFpbmZvICYgU0VRSU5GT19FWFRfQVZBSUxBQkxFKQorCQkJCSYmICghKHNlcWluZm8gJiBTRVFJTkZPX1BST0cpKSkKKwkJCQlmcmFtZV9wcm9nID0gMDsKKwkJfQorCisJCWlmICgoZGVjX2NvbnRyb2wgJgorCQkJIERFQ19DT05UUk9MX0ZMQUdfRk9SQ0VfMjUwMF83MjBfNTc2X0lOVEVSTEFDRSkKKwkJCSYmIChmcmFtZV93aWR0aCA9PSA3MjAgfHwgZnJhbWVfd2lkdGggPT0gNDgwKQorCQkJJiYgKGZyYW1lX2hlaWdodCA9PSA1NzYpCisJCQkmJiAoZnJhbWVfZHVyID09IDM4NDApKQorCQkJZnJhbWVfcHJvZyA9IDA7CisJCWVsc2UgaWYgKChkZWNfY29udHJvbCAmCisJCQlERUNfQ09OVFJPTF9GTEFHX0ZPUkNFXzMwMDBfNzA0XzQ4MF9JTlRFUkxBQ0UpCisJCQkmJiAoZnJhbWVfd2lkdGggPT0gNzA0KSAmJiAoZnJhbWVfaGVpZ2h0ID09IDQ4MCkKKwkJCSYmIChmcmFtZV9kdXIgPT0gMzIwMCkpCisJCQlmcmFtZV9wcm9nID0gMDsKKwkJZWxzZSBpZiAoKGRlY19jb250cm9sICYKKwkJCURFQ19DT05UUk9MX0ZMQUdfRk9SQ0VfMjUwMF83MDRfNTc2X0lOVEVSTEFDRSkKKwkJCSYmIChmcmFtZV93aWR0aCA9PSA3MDQpICYmIChmcmFtZV9oZWlnaHQgPT0gNTc2KQorCQkJJiYgKGZyYW1lX2R1ciA9PSAzODQwKSkKKwkJCWZyYW1lX3Byb2cgPSAwOworCQllbHNlIGlmICgoZGVjX2NvbnRyb2wgJgorCQkJREVDX0NPTlRST0xfRkxBR19GT1JDRV8yNTAwXzU0NF81NzZfSU5URVJMQUNFKQorCQkJJiYgKGZyYW1lX3dpZHRoID09IDU0NCkgJiYgKGZyYW1lX2hlaWdodCA9PSA1NzYpCisJCQkmJiAoZnJhbWVfZHVyID09IDM4NDApKQorCQkJZnJhbWVfcHJvZyA9IDA7CisJCWVsc2UgaWYgKChkZWNfY29udHJvbCAmCisJCQlERUNfQ09OVFJPTF9GTEFHX0ZPUkNFXzI1MDBfNDgwXzU3Nl9JTlRFUkxBQ0UpCisJCQkmJiAoZnJhbWVfd2lkdGggPT0gNDgwKSAmJiAoZnJhbWVfaGVpZ2h0ID09IDU3NikKKwkJCSYmIChmcmFtZV9kdXIgPT0gMzg0MCkpCisJCQlmcmFtZV9wcm9nID0gMDsKKwkJZWxzZSBpZiAoZGVjX2NvbnRyb2wgJiBERUNfQ09OVFJPTF9GTEFHX0ZPUkNFX1NFUV9JTlRFUkxBQ0UpCisJCQlmcmFtZV9wcm9nID0gMDsKKwkJaWYgKGZyYW1lX3Byb2cgJiBQSUNJTkZPX1BST0cpIHsKKwkJCXUzMiBpbmRleCA9ICgocmVnICYgMHhmKSAtIDEpICYgNzsKKworCQkJc2VxaW5mbyA9IFJFQURfVlJFRyhNUkVHX1NFUV9JTkZPKTsKKworCQkJaWYgKGtmaWZvX2dldCgmbmV3ZnJhbWVfcSwgJnZmKSA9PSAwKSB7CisJCQkJcHJfaW5mbworCQkJCSgiZmF0YWwgZXJyb3IsIG5vIGF2YWlsYWJsZSBidWZmZXIgc2xvdC4iKTsKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQl9CisKKwkJCXNldF9mcmFtZV9pbmZvKHZmKTsKKwkJCS8qcHJfaW5mbygidmlkZW8gc2lnbmFsIHR5cGU6MHgleFxuIiwKKwkJCQlSRUFEX1ZSRUcoQVZfU0NSQVRDSF9IKSk7Ki8KKwkJCXZmLT5zaWduYWxfdHlwZSA9IFJFQURfVlJFRyhBVl9TQ1JBVENIX0gpOworCQkJdmYtPmluZGV4ID0gaW5kZXg7CisjaWZkZWYgTlYyMQorCQkJdmYtPnR5cGUgPQorCQkJCVZJRFRZUEVfUFJPR1JFU1NJVkUgfCBWSURUWVBFX1ZJVV9GSUVMRCB8CisJCQkJVklEVFlQRV9WSVVfTlYyMTsKKyNlbHNlCisJCQl2Zi0+dHlwZSA9IFZJRFRZUEVfUFJPR1JFU1NJVkUgfCBWSURUWVBFX1ZJVV9GSUVMRDsKKyNlbmRpZgorCQkJaWYgKChzZXFpbmZvICYgU0VRSU5GT19FWFRfQVZBSUxBQkxFKQorCQkJCSYmIChzZXFpbmZvICYgU0VRSU5GT19QUk9HKSkgeworCQkJCWlmIChpbmZvICYgUElDSU5GT19SUFRfRklSU1QpIHsKKwkJCQkJaWYgKGluZm8gJiBQSUNJTkZPX1RPUF9GSVJTVCkgeworCQkJCQkJdmYtPmR1cmF0aW9uID0KKwkJCQkJCQl2Zi0+ZHVyYXRpb24gKiAzOworCQkJCQkJLyogcmVwZWF0IHRocmVlIHRpbWVzICovCisJCQkJCX0gZWxzZSB7CisJCQkJCQl2Zi0+ZHVyYXRpb24gPQorCQkJCQkJCXZmLT5kdXJhdGlvbiAqIDI7CisJCQkJCQkvKiByZXBlYXQgdHdvIHRpbWVzICovCisJCQkJCX0KKwkJCQl9CisJCQkJdmYtPmR1cmF0aW9uX3B1bGxkb3duID0gMDsKKwkJCQkJLyogbm8gcHVsbCBkb3duICovCisKKwkJCX0gZWxzZSB7CisJCQkJdmYtPmR1cmF0aW9uX3B1bGxkb3duID0KKwkJCQkJKGluZm8gJiBQSUNJTkZPX1JQVF9GSVJTVCkgPworCQkJCQkJdmYtPmR1cmF0aW9uID4+IDEgOiAwOworCQkJfQorCisJCQkvKmNvdW50IGluZm8qLworCQkJdmRlY19jb3VudF9pbmZvKGd2cywgaW5mbyAmIFBJQ0lORk9fRVJST1IsIG9mZnNldCk7CisKKwkJCXZmLT5kdXJhdGlvbiArPSB2Zi0+ZHVyYXRpb25fcHVsbGRvd247CisJCQl2Zi0+Y2FudmFzMEFkZHIgPSB2Zi0+Y2FudmFzMUFkZHIgPQorCQkJCQkJaW5kZXgyY2FudmFzKGluZGV4KTsKKwkJCXZmLT5vcmllbnRhdGlvbiA9IDA7CisJCQl2Zi0+cHRzID0gKHB0c192YWxpZCkgPyBwdHMgOiAwOworCQkJdmYtPnB0c191czY0ID0gKHB0c192YWxpZCkgPyBwdHNfdXM2NCA6IDA7CisJCQl2Zi0+dHlwZV9vcmlnaW5hbCA9IHZmLT50eXBlOworCisJCQl2ZmJ1Zl91c2VbaW5kZXhdID0gMTsKKworCQkJaWYgKChlcnJvcl9za2lwKGluZm8sIHZmKSkgfHwKKwkJCQkoKGZpcnN0X2lfZnJhbWVfcmVhZHkgPT0gMCkKKwkJCQkgJiYgKChQSUNJTkZPX1RZUEVfTUFTSyAmIGluZm8pICE9CisJCQkJCSBQSUNJTkZPX1RZUEVfSSkpKSB7CisJCQkJZ3ZzLT5kcm9wX2ZyYW1lX2NvdW50Kys7CisJCQkJa2ZpZm9fcHV0KCZyZWN5Y2xlX3EsCisJCQkJCQkgIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCQl9IGVsc2UgeworCQkJCXZmLT5tZW1faGFuZGxlID0KKwkJCQkJZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCQkJCW1tX2Jsa19oYW5kbGUsCisJCQkJCQlpbmRleCk7CisJCQkJa2ZpZm9fcHV0KCZkaXNwbGF5X3EsCisJCQkJCQkgIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCQkJQVRSQUNFX0NPVU5URVIoTU9EVUxFX05BTUUsIHZmLT5wdHMpOworCQkJCXZmX25vdGlmeV9yZWNlaXZlcihQUk9WSURFUl9OQU1FLAorCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfVkZSQU1FX1JFQURZLAorCQkJCQlOVUxMKTsKKwkJCX0KKworCQl9IGVsc2UgeworCQkJdTMyIGluZGV4ID0gKChyZWcgJiAweGYpIC0gMSkgJiA3OworCQkJaW50IGZpcnN0X2ZpZWxkX3R5cGUgPSAoaW5mbyAmIFBJQ0lORk9fVE9QX0ZJUlNUKSA/CisJCQkJCVZJRFRZUEVfSU5URVJMQUNFX1RPUCA6CisJCQkJCVZJRFRZUEVfSU5URVJMQUNFX0JPVFRPTTsKKworI2lmZGVmIElOVEVSTEFDRV9TRVFfQUxXQVlTCisJCQkvKiBvbmNlIGFuIGludGVybGFjZWQgc2VxdWVuY2UgZXhpc3QsCisJCQkgKmFsd2F5cyBmb3JjZSBpbnRlcmxhY2VkIHR5cGUKKwkJCSAqLworCQkJLyogdG8gbWFrZSBESSBlYXN5LiAqLworCQkJZGVjX2NvbnRyb2wgfD0gREVDX0NPTlRST0xfRkxBR19GT1JDRV9TRVFfSU5URVJMQUNFOworI2VuZGlmCisjaWYgMAorCQkJaWYgKGluZm8gJiBQSUNJTkZPX0ZSQU1FKSB7CisJCQkJZnJhbWVfcnB0X3N0YXRlID0KKwkJCQkJKGluZm8gJiBQSUNJTkZPX1RPUF9GSVJTVCkgPworCQkJCQlGUkFNRV9SRVBFQVRfVE9QIDogRlJBTUVfUkVQRUFUX0JPVDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGZyYW1lX3JwdF9zdGF0ZSA9PSBGUkFNRV9SRVBFQVRfVE9QKSB7CisJCQkJCWZpcnN0X2ZpZWxkX3R5cGUgPQorCQkJCQkJVklEVFlQRV9JTlRFUkxBQ0VfVE9QOworCQkJCX0gZWxzZSBpZiAoZnJhbWVfcnB0X3N0YXRlID09CisJCQkJCQlGUkFNRV9SRVBFQVRfQk9UKSB7CisJCQkJCWZpcnN0X2ZpZWxkX3R5cGUgPQorCQkJCQkJVklEVFlQRV9JTlRFUkxBQ0VfQk9UVE9NOworCQkJCX0KKwkJCQlmcmFtZV9ycHRfc3RhdGUgPSBGUkFNRV9SRVBFQVRfTk9ORTsKKwkJCX0KKyNlbHNlCisJCQlmcmFtZV9ycHRfc3RhdGUgPSBGUkFNRV9SRVBFQVRfTk9ORTsKKyNlbmRpZgorCQkJaWYgKGtmaWZvX2dldCgmbmV3ZnJhbWVfcSwgJnZmKSA9PSAwKSB7CisJCQkJcHJfaW5mbworCQkJCSgiZmF0YWwgZXJyb3IsIG5vIGF2YWlsYWJsZSBidWZmZXIgc2xvdC4iKTsKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQl9CisJCQlpZiAoaW5mbyAmIFBJQ0lORk9fUlBUX0ZJUlNUKQorCQkJCXZmYnVmX3VzZVtpbmRleF0gPSAzOworCQkJZWxzZQorCQkJCXZmYnVmX3VzZVtpbmRleF0gPSAyOworCisJCQlzZXRfZnJhbWVfaW5mbyh2Zik7CisJCQl2Zi0+c2lnbmFsX3R5cGUgPSAwOworCQkJdmYtPmluZGV4ID0gaW5kZXg7CisJCQl2Zi0+dHlwZSA9CisJCQkJKGZpcnN0X2ZpZWxkX3R5cGUgPT0gVklEVFlQRV9JTlRFUkxBQ0VfVE9QKSA/CisJCQkJVklEVFlQRV9JTlRFUkxBQ0VfVE9QIDoKKwkJCQlWSURUWVBFX0lOVEVSTEFDRV9CT1RUT007CisjaWZkZWYgTlYyMQorCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9WSVVfTlYyMTsKKyNlbmRpZgorCQkJaWYgKGluZm8gJiBQSUNJTkZPX1JQVF9GSVJTVCkKKwkJCQl2Zi0+ZHVyYXRpb24gLz0gMzsKKwkJCWVsc2UKKwkJCQl2Zi0+ZHVyYXRpb24gPj49IDE7CisJCQl2Zi0+ZHVyYXRpb25fcHVsbGRvd24gPSAoaW5mbyAmIFBJQ0lORk9fUlBUX0ZJUlNUKSA/CisJCQkJCQl2Zi0+ZHVyYXRpb24gPj4gMSA6IDA7CisJCQl2Zi0+ZHVyYXRpb24gKz0gdmYtPmR1cmF0aW9uX3B1bGxkb3duOworCQkJdmYtPm9yaWVudGF0aW9uID0gMDsKKwkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9CisJCQkJCQlpbmRleDJjYW52YXMoaW5kZXgpOworCQkJdmYtPnB0cyA9IChwdHNfdmFsaWQpID8gcHRzIDogMDsKKwkJCXZmLT5wdHNfdXM2NCA9IChwdHNfdmFsaWQpID8gcHRzX3VzNjQgOiAwOworCQkJdmYtPnR5cGVfb3JpZ2luYWwgPSB2Zi0+dHlwZTsKKworCQkJaWYgKChlcnJvcl9za2lwKGluZm8sIHZmKSkgfHwKKwkJCQkoKGZpcnN0X2lfZnJhbWVfcmVhZHkgPT0gMCkKKwkJCQkgJiYgKChQSUNJTkZPX1RZUEVfTUFTSyAmIGluZm8pICE9CisJCQkJCSBQSUNJTkZPX1RZUEVfSSkpKSB7CisJCQkJZ3ZzLT5kcm9wX2ZyYW1lX2NvdW50Kys7CisJCQkJa2ZpZm9fcHV0KCZyZWN5Y2xlX3EsCisJCQkJCQkgIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCQl9IGVsc2UgeworCQkJCXZmLT5tZW1faGFuZGxlID0KKwkJCQkJZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCQkJCW1tX2Jsa19oYW5kbGUsCisJCQkJCQlpbmRleCk7CisJCQkJa2ZpZm9fcHV0KCZkaXNwbGF5X3EsCisJCQkJCQkgIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCQkJQVRSQUNFX0NPVU5URVIoTU9EVUxFX05BTUUsIHZmLT5wdHMpOworCQkJCXZmX25vdGlmeV9yZWNlaXZlcihQUk9WSURFUl9OQU1FLAorCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfVkZSQU1FX1JFQURZLAorCQkJCQlOVUxMKTsKKwkJCX0KKworCQkJaWYgKGtmaWZvX2dldCgmbmV3ZnJhbWVfcSwgJnZmKSA9PSAwKSB7CisJCQkJcHJfaW5mbworCQkJCSgiZmF0YWwgZXJyb3IsIG5vIGF2YWlsYWJsZSBidWZmZXIgc2xvdC4iKTsKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQl9CisKKwkJCXNldF9mcmFtZV9pbmZvKHZmKTsKKwkJCXZmLT5zaWduYWxfdHlwZSA9IDA7CisJCQl2Zi0+aW5kZXggPSBpbmRleDsKKwkJCXZmLT50eXBlID0gKGZpcnN0X2ZpZWxkX3R5cGUgPT0KKwkJCQlWSURUWVBFX0lOVEVSTEFDRV9UT1ApID8KKwkJCQlWSURUWVBFX0lOVEVSTEFDRV9CT1RUT00gOgorCQkJCVZJRFRZUEVfSU5URVJMQUNFX1RPUDsKKyNpZmRlZiBOVjIxCisJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX1ZJVV9OVjIxOworI2VuZGlmCisJCQlpZiAoaW5mbyAmIFBJQ0lORk9fUlBUX0ZJUlNUKQorCQkJCXZmLT5kdXJhdGlvbiAvPSAzOworCQkJZWxzZQorCQkJCXZmLT5kdXJhdGlvbiA+Pj0gMTsKKwkJCXZmLT5kdXJhdGlvbl9wdWxsZG93biA9IChpbmZvICYgUElDSU5GT19SUFRfRklSU1QpID8KKwkJCQkJdmYtPmR1cmF0aW9uID4+IDEgOiAwOworCQkJdmYtPmR1cmF0aW9uICs9IHZmLT5kdXJhdGlvbl9wdWxsZG93bjsKKwkJCXZmLT5vcmllbnRhdGlvbiA9IDA7CisJCQl2Zi0+Y2FudmFzMEFkZHIgPSB2Zi0+Y2FudmFzMUFkZHIgPQorCQkJCQlpbmRleDJjYW52YXMoaW5kZXgpOworCQkJdmYtPnB0cyA9IDA7CisJCQl2Zi0+cHRzX3VzNjQgPSAwOworCQkJdmYtPnR5cGVfb3JpZ2luYWwgPSB2Zi0+dHlwZTsKKworCQkJLypjb3VudCBpbmZvKi8KKwkJCXZkZWNfY291bnRfaW5mbyhndnMsIGluZm8gJiBQSUNJTkZPX0VSUk9SLCBvZmZzZXQpOworCisJCQlpZiAoKGVycm9yX3NraXAoaW5mbywgdmYpKSB8fAorCQkJCSgoZmlyc3RfaV9mcmFtZV9yZWFkeSA9PSAwKQorCQkJCSAmJiAoKFBJQ0lORk9fVFlQRV9NQVNLICYgaW5mbykgIT0KKwkJCQkJUElDSU5GT19UWVBFX0kpKSkgeworCQkJCWd2cy0+ZHJvcF9mcmFtZV9jb3VudCsrOworCQkJCWtmaWZvX3B1dCgmcmVjeWNsZV9xLAorCQkJCQkoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQkJfSBlbHNlIHsKKwkJCQl2Zi0+bWVtX2hhbmRsZSA9CisJCQkJCWRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJCQltbV9ibGtfaGFuZGxlLAorCQkJCQkJaW5kZXgpOworCQkJCWtmaWZvX3B1dCgmZGlzcGxheV9xLAorCQkJCQkoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQkJCUFUUkFDRV9DT1VOVEVSKE1PRFVMRV9OQU1FLCB2Zi0+cHRzKTsKKwkJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoUFJPVklERVJfTkFNRSwKKwkJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1ZGUkFNRV9SRUFEWSwKKwkJCQkJTlVMTCk7CisJCQl9CisKKwkJCWlmIChpbmZvICYgUElDSU5GT19SUFRfRklSU1QpIHsKKwkJCQlpZiAoa2ZpZm9fZ2V0KCZuZXdmcmFtZV9xLCAmdmYpID09IDApIHsKKwkJCQkJcHJfaW5mbygiZXJyb3IsIG5vIGF2YWlsYWJsZSBidWZmZXIgc2xvdC4iKTsKKwkJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJCX0KKworCQkJCXNldF9mcmFtZV9pbmZvKHZmKTsKKworCQkJCXZmLT5pbmRleCA9IGluZGV4OworCQkJCXZmLT50eXBlID0gKGZpcnN0X2ZpZWxkX3R5cGUgPT0KKwkJCQkJCVZJRFRZUEVfSU5URVJMQUNFX1RPUCkgPworCQkJCQkJVklEVFlQRV9JTlRFUkxBQ0VfVE9QIDoKKwkJCQkJCVZJRFRZUEVfSU5URVJMQUNFX0JPVFRPTTsKKyNpZmRlZiBOVjIxCisJCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9WSVVfTlYyMTsKKyNlbmRpZgorCQkJCXZmLT5kdXJhdGlvbiAvPSAzOworCQkJCXZmLT5kdXJhdGlvbl9wdWxsZG93biA9CisJCQkJCShpbmZvICYgUElDSU5GT19SUFRfRklSU1QpID8KKwkJCQkJCXZmLT5kdXJhdGlvbiA+PiAxIDogMDsKKwkJCQl2Zi0+ZHVyYXRpb24gKz0gdmYtPmR1cmF0aW9uX3B1bGxkb3duOworCQkJCXZmLT5vcmllbnRhdGlvbiA9IDA7CisJCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0KKwkJCQkJCQlpbmRleDJjYW52YXMoaW5kZXgpOworCQkJCXZmLT5wdHMgPSAwOworCQkJCXZmLT5wdHNfdXM2NCA9IDA7CisJCQkJaWYgKChlcnJvcl9za2lwKGluZm8sIHZmKSkgfHwKKwkJCQkJKChmaXJzdF9pX2ZyYW1lX3JlYWR5ID09IDApCisJCQkJCQkmJiAoKFBJQ0lORk9fVFlQRV9NQVNLICYgaW5mbykKKwkJCQkJCQkhPSBQSUNJTkZPX1RZUEVfSSkpKSB7CisJCQkJCWtmaWZvX3B1dCgmcmVjeWNsZV9xLAorCQkJCQkoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQkJCX0gZWxzZSB7CisJCQkJCWtmaWZvX3B1dCgmZGlzcGxheV9xLAorCQkJCQkJKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwkJCQkJQVRSQUNFX0NPVU5URVIoTU9EVUxFX05BTUUsIHZmLT5wdHMpOworCQkJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoUFJPVklERVJfTkFNRSwKKwkJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1ZGUkFNRV9SRUFEWSwKKwkJCQkJCU5VTEwpOworCQkJCX0KKwkJCX0KKwkJfQorCQlXUklURV9WUkVHKE1SRUdfQlVGRkVST1VULCAwKTsKKwl9CisKKwlyZWcgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9NKTsKKwlpZiAocmVnICYgKDE8PDE2KSkKKwkJc2NoZWR1bGVfd29yaygmdXNlcmRhdGFfcHVzaF93b3JrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyAqdm1wZWdfdmZfcGVlayh2b2lkICpvcF9hcmcpCit7CisJc3RydWN0IHZmcmFtZV9zICp2ZjsKKworCWlmIChrZmlmb19wZWVrKCZkaXNwbGF5X3EsICZ2ZikpCisJCXJldHVybiB2ZjsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2bXBlZ192Zl9nZXQodm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCB2ZnJhbWVfcyAqdmY7CisKKwlpZiAoa2ZpZm9fZ2V0KCZkaXNwbGF5X3EsICZ2ZikpCisJCXJldHVybiB2ZjsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCB2bXBlZ192Zl9wdXQoc3RydWN0IHZmcmFtZV9zICp2Ziwgdm9pZCAqb3BfYXJnKQoreworCWlmIChwb29sX2luZGV4KHZmKSA9PSBjdXJfcG9vbF9pZHgpCisJCWtmaWZvX3B1dCgmcmVjeWNsZV9xLCAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworfQorCitzdGF0aWMgaW50IHZtcGVnX2V2ZW50X2NiKGludCB0eXBlLCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlX2RhdGEpCit7CisJaWYgKHR5cGUgJiBWRlJBTUVfRVZFTlRfUkVDRUlWRVJfUkVTRVQpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlhbXZkZWNfc3RvcCgpOworI2lmbmRlZiBDT05GSUdfQU1MT0dJQ19QT1NUX1BST0NFU1NfTUFOQUdFUgorCQl2Zl9saWdodF91bnJlZ19wcm92aWRlcigmdm1wZWdfdmZfcHJvdik7CisjZW5kaWYKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKKwkJdm1wZWcxMl9sb2NhbF9pbml0KCk7CisJCXZtcGVnMTJfcHJvdF9pbml0KCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKKyNpZm5kZWYgQ09ORklHX0FNTE9HSUNfUE9TVF9QUk9DRVNTX01BTkFHRVIKKwkJdmZfcmVnX3Byb3ZpZGVyKCZ2bXBlZ192Zl9wcm92KTsKKyNlbmRpZgorCQlhbXZkZWNfc3RhcnQoKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm1wZWdfdmZfc3RhdGVzKHN0cnVjdCB2ZnJhbWVfc3RhdGVzICpzdGF0ZXMsIHZvaWQgKm9wX2FyZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKKworCXN0YXRlcy0+dmZfcG9vbF9zaXplID0gVkZfUE9PTF9TSVpFOworCXN0YXRlcy0+YnVmX2ZyZWVfbnVtID0ga2ZpZm9fbGVuKCZuZXdmcmFtZV9xKTsKKwlzdGF0ZXMtPmJ1Zl9hdmFpbF9udW0gPSBrZmlmb19sZW4oJmRpc3BsYXlfcSk7CisJc3RhdGVzLT5idWZfcmVjeWNsZV9udW0gPSBrZmlmb19sZW4oJnJlY3ljbGVfcSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19BTUxPR0lDX1BPU1RfUFJPQ0VTU19NQU5BR0VSCitzdGF0aWMgdm9pZCB2bXBlZzEyX3BwbWdyX3Jlc2V0KHZvaWQpCit7CisJdmZfbm90aWZ5X3JlY2VpdmVyKFBST1ZJREVSX05BTUUsIFZGUkFNRV9FVkVOVF9QUk9WSURFUl9SRVNFVCwgTlVMTCk7CisKKwl2bXBlZzEyX2xvY2FsX2luaXQoKTsKKworCXByX2luZm8oInZtcGVnMTJkZWM6IHZmX3BwbWdyX3Jlc2V0XG4iKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB2bXBlZzEyX3Jlc2V0X3VzZXJkYXRhX2ZpZm8oc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGJJbml0KTsKK3N0YXRpYyB2b2lkIHZtcGVnMTJfd2FrZXVwX3VzZXJkYXRhX3BvbGwoc3RydWN0IHZkZWNfcyAqdmRlYyk7CisKK3N0YXRpYyB2b2lkIHJlc2V0X2RvX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWFtdmRlY19zdG9wKCk7CisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19QT1NUX1BST0NFU1NfTUFOQUdFUgorCXZtcGVnMTJfcHBtZ3JfcmVzZXQoKTsKKyNlbHNlCisJdmZfbGlnaHRfdW5yZWdfcHJvdmlkZXIoJnZtcGVnX3ZmX3Byb3YpOworCXZtcGVnMTJfbG9jYWxfaW5pdCgpOworCXZmX3JlZ19wcm92aWRlcigmdm1wZWdfdmZfcHJvdik7CisjZW5kaWYKKwl2bXBlZzEyX3Byb3RfaW5pdCgpOworCXZtcGVnMTJfY3JlYXRlX3VzZXJkYXRhX21hbmFnZXIoY2NidWZfcGh5QWRkcmVzc192aXJ0LCBDQ0JVRl9TSVpFKTsKKwl2bXBlZzEyX3Jlc2V0X3VzZXJkYXRhX2ZpZm8odmRlYywgMSk7CisjaWZkZWYgRFVNUF9VU0VSX0RBVEEKKwlsYXN0X3dwID0gMDsKKyNlbmRpZgorCisJYW12ZGVjX3N0YXJ0KCk7Cit9CisKK3N0YXRpYyB2b2lkIHZtcGVnMTJfc2V0X2NsayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJIHsKKwkJaW50IGZwcyA9IDk2MDAwIC8gZnJhbWVfZHVyOworCisJCXNhdmVkX3Jlc29sdXRpb24gPSBmcmFtZV93aWR0aCAqIGZyYW1lX2hlaWdodCAqIGZwczsKKwkJdmRlY19zb3VyY2VfY2hhbmdlZChWRk9STUFUX01QRUcxMiwKKwkJCWZyYW1lX3dpZHRoLCBmcmFtZV9oZWlnaHQsIGZwcyk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHZtcGVnX3B1dF90aW1lcl9mdW5jKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKK3sKKwlpbnQgZmF0YWxfcmVzZXQgPSAwOworCWVudW0gcmVjZXZpdmVyX3N0YXJ0X2Ugc3RhdGUgPSBSRUNFSVZFUl9JTkFDVElWRTsKKworCWlmICh2Zl9nZXRfcmVjZWl2ZXIoUFJPVklERVJfTkFNRSkpIHsKKwkJc3RhdGUgPSB2Zl9ub3RpZnlfcmVjZWl2ZXIoUFJPVklERVJfTkFNRSwKKwkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfUVVSRVlfU1RBVEUsIE5VTEwpOworCQlpZiAoKHN0YXRlID09IFJFQ0VJVkVSX1NUQVRFX05VTEwpCisJCQl8fCAoc3RhdGUgPT0gUkVDRUlWRVJfU1RBVEVfTk9ORSkpIHsKKwkJCS8qIHJlY2VpdmVyIGhhcyBubyBldmVudF9jYiBvcgorCQkJICpyZWNlaXZlcidzIGV2ZW50X2NiIGRvZXMgbm90IHByb2Nlc3MgdGhpcyBldmVudAorCQkJICovCisJCQlzdGF0ZSA9IFJFQ0VJVkVSX0lOQUNUSVZFOworCQl9CisJfSBlbHNlCisJCXN0YXRlID0gUkVDRUlWRVJfSU5BQ1RJVkU7CisKKwlpZiAoUkVBRF9WUkVHKE1SRUdfRkFUQUxfRVJST1IpID09IDEpCisJCWZhdGFsX3Jlc2V0ID0gMTsKKworCWlmICgoUkVBRF9WUkVHKE1SRUdfV0FJVF9CVUZGRVIpICE9IDApICYmCisJCShrZmlmb19pc19lbXB0eSgmcmVjeWNsZV9xKSkgJiYKKwkJKGtmaWZvX2lzX2VtcHR5KCZkaXNwbGF5X3EpKSAmJiAoc3RhdGUgPT0gUkVDRUlWRVJfSU5BQ1RJVkUpKSB7CisJCWlmICgrK3dhaXRfYnVmZmVyX2NvdW50ZXIgPiA0KQorCQkJZmF0YWxfcmVzZXQgPSAxOworCisJfSBlbHNlCisJCXdhaXRfYnVmZmVyX2NvdW50ZXIgPSAwOworCisJaWYgKGZhdGFsX3Jlc2V0ICYmIChrZmlmb19pc19lbXB0eSgmZGlzcGxheV9xKSkpIHsKKwkJcHJfaW5mbygiJCQkJGRlY29kZXIgaXMgd2FpdGluZyBmb3IgYnVmZmVyIG9yIGZhdGFsIHJlc2V0LlxuIik7CisJCXNjaGVkdWxlX3dvcmsoJnJlc2V0X3dvcmspOworCX0KKworCXdoaWxlICgha2ZpZm9faXNfZW1wdHkoJnJlY3ljbGVfcSkgJiYgKFJFQURfVlJFRyhNUkVHX0JVRkZFUklOKSA9PSAwKSkgeworCQlzdHJ1Y3QgdmZyYW1lX3MgKnZmOworCisJCWlmIChrZmlmb19nZXQoJnJlY3ljbGVfcSwgJnZmKSkgeworCQkJaWYgKCh2Zi0+aW5kZXggPCBERUNPREVfQlVGRkVSX05VTV9NQVgpICYmCisJCQkgKC0tdmZidWZfdXNlW3ZmLT5pbmRleF0gPT0gMCkpIHsKKwkJCQlXUklURV9WUkVHKE1SRUdfQlVGRkVSSU4sIHZmLT5pbmRleCArIDEpOworCQkJCXZmLT5pbmRleCA9IERFQ09ERV9CVUZGRVJfTlVNX01BWDsKKwkJCX0KKworCQkJaWYgKHBvb2xfaW5kZXgodmYpID09IGN1cl9wb29sX2lkeCkgeworCQkJCWtmaWZvX3B1dCgmbmV3ZnJhbWVfcSwKKwkJCQkJCSAgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChmcmFtZV9kdXIgPiAwICYmIHNhdmVkX3Jlc29sdXRpb24gIT0KKwkJZnJhbWVfd2lkdGggKiBmcmFtZV9oZWlnaHQgKiAoOTYwMDAgLyBmcmFtZV9kdXIpKQorCQlzY2hlZHVsZV93b3JrKCZzZXRfY2xrX3dvcmspOworCisJdGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgUFVUX0lOVEVSVkFMOworCisJYWRkX3RpbWVyKHRpbWVyKTsKK30KKworaW50IHZtcGVnMTJfZGVjX3N0YXR1cyhzdHJ1Y3QgdmRlY19zICp2ZGVjLCBzdHJ1Y3QgdmRlY19pbmZvICp2c3RhdHVzKQoreworCWlmICghKHN0YXQgJiBTVEFUX1ZERUNfUlVOKSkKKwkJcmV0dXJuIC0xOworCisJdnN0YXR1cy0+ZnJhbWVfd2lkdGggPSBmcmFtZV93aWR0aDsKKwl2c3RhdHVzLT5mcmFtZV9oZWlnaHQgPSBmcmFtZV9oZWlnaHQ7CisJaWYgKGZyYW1lX2R1ciAhPSAwKQorCQl2c3RhdHVzLT5mcmFtZV9yYXRlID0gOTYwMDAgLyBmcmFtZV9kdXI7CisJZWxzZQorCQl2c3RhdHVzLT5mcmFtZV9yYXRlID0gLTE7CisJdnN0YXR1cy0+ZXJyb3JfY291bnQgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9DKTsKKwl2c3RhdHVzLT5zdGF0dXMgPSBzdGF0OworCXZzdGF0dXMtPmJpdF9yYXRlID0gZ3ZzLT5iaXRfcmF0ZTsKKwl2c3RhdHVzLT5mcmFtZV9kdXIgPSBmcmFtZV9kdXI7CisJdnN0YXR1cy0+ZnJhbWVfZGF0YSA9IGd2cy0+ZnJhbWVfZGF0YTsKKwl2c3RhdHVzLT50b3RhbF9kYXRhID0gZ3ZzLT50b3RhbF9kYXRhOworCXZzdGF0dXMtPmZyYW1lX2NvdW50ID0gZ3ZzLT5mcmFtZV9jb3VudDsKKwl2c3RhdHVzLT5lcnJvcl9mcmFtZV9jb3VudCA9IGd2cy0+ZXJyb3JfZnJhbWVfY291bnQ7CisJdnN0YXR1cy0+ZHJvcF9mcmFtZV9jb3VudCA9IGd2cy0+ZHJvcF9mcmFtZV9jb3VudDsKKwl2c3RhdHVzLT50b3RhbF9kYXRhID0gZ3ZzLT50b3RhbF9kYXRhOworCXZzdGF0dXMtPnNhbXBfY250ID0gZ3ZzLT5zYW1wX2NudDsKKwl2c3RhdHVzLT5vZmZzZXQgPSBndnMtPm9mZnNldDsKKwl2c3RhdHVzLT5yYXRpb19jb250cm9sID0gcmF0aW9fY29udHJvbDsKKwlzbnByaW50Zih2c3RhdHVzLT52ZGVjX25hbWUsIHNpemVvZih2c3RhdHVzLT52ZGVjX25hbWUpLAorCQkiJXMiLCBEUklWRVJfTkFNRSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHZtcGVnMTJfc2V0X2lzcmVzZXQoc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGlzcmVzZXQpCit7CisJaXNfcmVzZXQgPSBpc3Jlc2V0OworCXJldHVybiAwOworfQorCisKKworCitzdGF0aWMgdm9pZCB2bXBlZzEyX2NyZWF0ZV91c2VyZGF0YV9tYW5hZ2VyKHU4ICp1c2VyZGF0YV9idWYsIGludCBidWZfbGVuKQoreworCW11dGV4X2xvY2soJnVzZXJkYXRhX211dGV4KTsKKworCXBfdXNlcmRhdGFfbWdyID0gKHN0cnVjdCBtcGVnMTJfdXNlcmRhdGFfaW5mb190ICopCisJCQl2bWFsbG9jKHNpemVvZihzdHJ1Y3QgbXBlZzEyX3VzZXJkYXRhX2luZm9fdCkpOworCWlmIChwX3VzZXJkYXRhX21ncikgeworCQltZW1zZXQocF91c2VyZGF0YV9tZ3IsIDAsCisJCQlzaXplb2Yoc3RydWN0IG1wZWcxMl91c2VyZGF0YV9pbmZvX3QpKTsKKwkJcF91c2VyZGF0YV9tZ3ItPmRhdGFfYnVmID0gdXNlcmRhdGFfYnVmOworCQlwX3VzZXJkYXRhX21nci0+YnVmX2xlbiA9IGJ1Zl9sZW47CisJCXBfdXNlcmRhdGFfbWdyLT5kYXRhX2J1Zl9lbmQgPSB1c2VyZGF0YV9idWYgKyBidWZfbGVuOworCX0KKwltdXRleF91bmxvY2soJnVzZXJkYXRhX211dGV4KTsKK30KKworc3RhdGljIHZvaWQgdm1wZWcxMl9kZXN0cm95X3VzZXJkYXRhX21hbmFnZXIodm9pZCkKK3sKKwltdXRleF9sb2NrKCZ1c2VyZGF0YV9tdXRleCk7CisKKwlpZiAocF91c2VyZGF0YV9tZ3IpIHsKKwkJdmZyZWUocF91c2VyZGF0YV9tZ3IpOworCQlwX3VzZXJkYXRhX21nciA9IE5VTEw7CisJfQorCW11dGV4X3VubG9jaygmdXNlcmRhdGFfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCB2bXBlZzEyX2FkZF91c2VyZGF0YShzdHJ1Y3QgdXNlcmRhdGFfbWV0YV9pbmZvX3QgbWV0YV9pbmZvLAorCQkJCQkJaW50IHdwLAorCQkJCQkJdTMyIHJlZmVyZW5jZSkKK3sKKwlzdHJ1Y3QgbXBlZzEyX3VzZXJkYXRhX3JlY29yZWRfdCAqcF91c2VyZGF0YV9yZWM7CisJaW50IGRhdGFfbGVuZ3RoOworCisJbXV0ZXhfbG9jaygmdXNlcmRhdGFfbXV0ZXgpOworCisJaWYgKHBfdXNlcmRhdGFfbWdyKSB7CisJCWlmICh3cCA+IHBfdXNlcmRhdGFfbWdyLT5sYXN0X3dwKQorCQkJZGF0YV9sZW5ndGggPSB3cCAtIHBfdXNlcmRhdGFfbWdyLT5sYXN0X3dwOworCQllbHNlIHsKKwkJCXBfdXNlcmRhdGFfbWdyLT5sYXN0X3dwID0gMDsKKwkJCWRhdGFfbGVuZ3RoID0gd3AgLSBwX3VzZXJkYXRhX21nci0+bGFzdF93cDsKKwkJfQorCisJCWlmIChkYXRhX2xlbmd0aCAmIDB4NykKKwkJCWRhdGFfbGVuZ3RoID0gKCgoZGF0YV9sZW5ndGggKyA4KSA+PiAzKSA8PCAzKTsKKy8qCitwcl9pbmZvKCJ3YWtldXBfcHVzaDogcmk6JWQsIHdpOiVkLCBkYXRhX2xlbjolZCwgbGFzdF93cDolZCwgd3A6JWQsIGlkID0gJWRcbiIsCisJCQlwX3VzZXJkYXRhX21nci0+cmVhZF9pbmRleCwKKwkJCXBfdXNlcmRhdGFfbWdyLT53cml0ZV9pbmRleCwKKwkJCWRhdGFfbGVuZ3RoLAorCQkJcF91c2VyZGF0YV9tZ3ItPmxhc3Rfd3AsCisJCQl3cCwKKwkJCW5fdXNlcmRhdGFfaWQpOworKi8KKwkJcF91c2VyZGF0YV9yZWMgPSBwX3VzZXJkYXRhX21nci0+cmVjb3JkcworCQkJKyBwX3VzZXJkYXRhX21nci0+d3JpdGVfaW5kZXg7CisJCXBfdXNlcmRhdGFfcmVjLT5tZXRhX2luZm8gPSBtZXRhX2luZm87CisJCXBfdXNlcmRhdGFfcmVjLT5yZWNfc3RhcnQgPSBwX3VzZXJkYXRhX21nci0+bGFzdF93cDsKKwkJcF91c2VyZGF0YV9yZWMtPnJlY19sZW4gPSBkYXRhX2xlbmd0aDsKKwkJcF91c2VyZGF0YV9tZ3ItPmxhc3Rfd3AgPSB3cDsKKworI2lmZGVmIERVTVBfVVNFUl9EQVRBCisJCWR1bXBfdXNlcmRhdGFfaW5mbyhwX3VzZXJkYXRhX21nci0+ZGF0YV9idWYKKwkJCSsgcF91c2VyZGF0YV9yZWMtPnJlY19zdGFydCwKKwkJCWRhdGFfbGVuZ3RoLAorCQkJJm1ldGFfaW5mbywKKwkJCXJlZmVyZW5jZSk7CisJCW5fdXNlcmRhdGFfaWQrKzsKKyNlbmRpZgorCisJCXBfdXNlcmRhdGFfbWdyLT53cml0ZV9pbmRleCsrOworCQlpZiAocF91c2VyZGF0YV9tZ3ItPndyaXRlX2luZGV4ID49IFVTRVJEQVRBX0ZJRk9fTlVNKQorCQkJcF91c2VyZGF0YV9tZ3ItPndyaXRlX2luZGV4ID0gMDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ1c2VyZGF0YV9tdXRleCk7CisKKwl2ZGVjX3dha2V1cF91c2VyZGF0YV9wb2xsKHZkZWMpOworfQorCisKK3N0YXRpYyBpbnQgdm1wZWcxMl91c2VyX2RhdGFfcmVhZChzdHJ1Y3QgdmRlY19zICp2ZGVjLAorCXN0cnVjdCB1c2VyZGF0YV9wYXJhbV90ICpwdXNlcmRhdGFfcGFyYSkKK3sKKwlpbnQgcmVjX3JpLCByZWNfd2k7CisJaW50IHJlY19sZW47CisJdTggKnJlY19kYXRhX3N0YXJ0OworCXU4ICpwZGVzdF9idWY7CisJc3RydWN0IG1wZWcxMl91c2VyZGF0YV9yZWNvcmVkX3QgKnBfdXNlcmRhdGFfcmVjOworCXUzMiBkYXRhX3NpemU7CisJdTMyIHJlczsKKwlpbnQgY29weV9vayA9IDE7CisKKwlwZGVzdF9idWYgPSBwdXNlcmRhdGFfcGFyYS0+cGJ1Zl9hZGRyOworCisJbXV0ZXhfbG9jaygmdXNlcmRhdGFfbXV0ZXgpOworCisJaWYgKCFwX3VzZXJkYXRhX21ncikgeworCQltdXRleF91bmxvY2soJnVzZXJkYXRhX211dGV4KTsKKwkJcmV0dXJuIDA7CisJfQorLyoKKwlwcl9pbmZvKCJyaSA9ICVkLCB3aSA9ICVkXG4iLAorCQlwX3VzZXJkYXRhX21nci0+cmVhZF9pbmRleCwKKwkJcF91c2VyZGF0YV9tZ3ItPndyaXRlX2luZGV4KTsKKyovCisJcmVjX3JpID0gcF91c2VyZGF0YV9tZ3ItPnJlYWRfaW5kZXg7CisJcmVjX3dpID0gcF91c2VyZGF0YV9tZ3ItPndyaXRlX2luZGV4OworCisJaWYgKHJlY19yaSA9PSByZWNfd2kpIHsKKwkJbXV0ZXhfdW5sb2NrKCZ1c2VyZGF0YV9tdXRleCk7CisJCXJldHVybiAwOworCX0KKworCXBfdXNlcmRhdGFfcmVjID0gcF91c2VyZGF0YV9tZ3ItPnJlY29yZHMgKyByZWNfcmk7CisKKwlyZWNfbGVuID0gcF91c2VyZGF0YV9yZWMtPnJlY19sZW47CisJcmVjX2RhdGFfc3RhcnQgPSBwX3VzZXJkYXRhX3JlYy0+cmVjX3N0YXJ0ICsgcF91c2VyZGF0YV9tZ3ItPmRhdGFfYnVmOworLyoKKwlwcl9pbmZvKCJyZWNfbGVuOiVkLCByZWNfc3RhcnQ6JWQsIGJ1Zl9sZW46JWRcbiIsCisJCXBfdXNlcmRhdGFfcmVjLT5yZWNfbGVuLAorCQlwX3VzZXJkYXRhX3JlYy0+cmVjX3N0YXJ0LAorCQlwdXNlcmRhdGFfcGFyYS0+YnVmX2xlbik7CisqLworCWlmIChyZWNfbGVuIDw9IHB1c2VyZGF0YV9wYXJhLT5idWZfbGVuKSB7CisJCS8qIGR2YiB1c2VyIGRhdGEgYnVmZmVyIGlzIGVub3VnaHQgdG8gY29weSB0aGUgd2hvbGUgcmVjb3JlZC4gKi8KKwkJZGF0YV9zaXplID0gcmVjX2xlbjsKKwkJaWYgKHJlY19kYXRhX3N0YXJ0ICsgZGF0YV9zaXplCisJCQk+IHBfdXNlcmRhdGFfbWdyLT5kYXRhX2J1Zl9lbmQpIHsKKwkJCWludCBmaXJzdF9zZWN0aW9uX2xlbjsKKworCQkJZmlyc3Rfc2VjdGlvbl9sZW4gPSBwX3VzZXJkYXRhX21nci0+YnVmX2xlbgorCQkJCS0gcF91c2VyZGF0YV9yZWMtPnJlY19zdGFydDsKKwkJCXJlcyA9ICh1MzIpY29weV90b191c2VyKCh2b2lkICopcGRlc3RfYnVmLAorCQkJCQkJCSh2b2lkICopcmVjX2RhdGFfc3RhcnQsCisJCQkJCQkJZmlyc3Rfc2VjdGlvbl9sZW4pOworCQkJaWYgKHJlcykgeworCQkJCXByX2luZm8oInAxIHJlYWQgbm90IGVuZCByZXM9JWQsIHJlcXVlc3Q9JWRcbiIsCisJCQkJCXJlcywgZmlyc3Rfc2VjdGlvbl9sZW4pOworCQkJCWNvcHlfb2sgPSAwOworCisJCQkJcF91c2VyZGF0YV9yZWMtPnJlY19sZW4gLT0KKwkJCQkJZmlyc3Rfc2VjdGlvbl9sZW4gLSByZXM7CisJCQkJcF91c2VyZGF0YV9yZWMtPnJlY19zdGFydCArPQorCQkJCQlmaXJzdF9zZWN0aW9uX2xlbiAtIHJlczsKKwkJCQlwdXNlcmRhdGFfcGFyYS0+ZGF0YV9zaXplID0KKwkJCQkJZmlyc3Rfc2VjdGlvbl9sZW4gLSByZXM7CisJCQl9IGVsc2UgeworCQkJCXJlcyA9ICh1MzIpY29weV90b191c2VyKAorCQkJCQkodm9pZCAqKShwZGVzdF9idWYrZmlyc3Rfc2VjdGlvbl9sZW4pLAorCQkJCQkodm9pZCAqKXBfdXNlcmRhdGFfbWdyLT5kYXRhX2J1ZiwKKwkJCQkJZGF0YV9zaXplIC0gZmlyc3Rfc2VjdGlvbl9sZW4pOworCQkJCWlmIChyZXMpIHsKKwkJCQkJcHJfaW5mbygicDIgcmVhZCBub3QgZW5kIHJlcz0lZCwgcmVxdWVzdD0lZFxuIiwKKwkJCQkJCXJlcywgZGF0YV9zaXplKTsKKwkJCQkJY29weV9vayA9IDA7CisJCQkJfQorCQkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfbGVuIC09IGRhdGFfc2l6ZSAtIHJlczsKKwkJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX3N0YXJ0ID0KKwkJCQkJZGF0YV9zaXplIC0gZmlyc3Rfc2VjdGlvbl9sZW4gLSByZXM7CisJCQkJcHVzZXJkYXRhX3BhcmEtPmRhdGFfc2l6ZSA9IGRhdGFfc2l6ZSAtIHJlczsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJlcyA9ICh1MzIpY29weV90b191c2VyKCh2b2lkICopcGRlc3RfYnVmLAorCQkJCQkJCSh2b2lkICopcmVjX2RhdGFfc3RhcnQsCisJCQkJCQkJZGF0YV9zaXplKTsKKwkJCWlmIChyZXMpIHsKKwkJCQlwcl9pbmZvKCJwMyByZWFkIG5vdCBlbmQgcmVzPSVkLCByZXF1ZXN0PSVkXG4iLAorCQkJCQlyZXMsIGRhdGFfc2l6ZSk7CisJCQkJY29weV9vayA9IDA7CisJCQl9CisJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX2xlbiAtPSBkYXRhX3NpemUgLSByZXM7CisJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX3N0YXJ0ICs9IGRhdGFfc2l6ZSAtIHJlczsKKwkJCXB1c2VyZGF0YV9wYXJhLT5kYXRhX3NpemUgPSBkYXRhX3NpemUgLSByZXM7CisJCX0KKworCQlpZiAoY29weV9vaykgeworCQkJcF91c2VyZGF0YV9tZ3ItPnJlYWRfaW5kZXgrKzsKKwkJCWlmIChwX3VzZXJkYXRhX21nci0+cmVhZF9pbmRleCA+PSBVU0VSREFUQV9GSUZPX05VTSkKKwkJCQlwX3VzZXJkYXRhX21nci0+cmVhZF9pbmRleCA9IDA7CisJCX0KKwl9IGVsc2UgeworCQkvKiBkdmIgdXNlciBkYXRhIGJ1ZmZlciBpcyBub3QgZW5vdWdodAorCQl0byBjb3B5IHRoZSB3aG9sZSByZWNvcmVkLiAqLworCQlkYXRhX3NpemUgPSBwdXNlcmRhdGFfcGFyYS0+YnVmX2xlbjsKKwkJaWYgKHJlY19kYXRhX3N0YXJ0ICsgZGF0YV9zaXplCisJCQk+IHBfdXNlcmRhdGFfbWdyLT5kYXRhX2J1Zl9lbmQpIHsKKwkJCWludCBmaXJzdF9zZWN0aW9uX2xlbjsKKworCQkJZmlyc3Rfc2VjdGlvbl9sZW4gPSBwX3VzZXJkYXRhX21nci0+YnVmX2xlbgorCQkJCQkJLSBwX3VzZXJkYXRhX3JlYy0+cmVjX3N0YXJ0OworCQkJcmVzID0gKHUzMiljb3B5X3RvX3VzZXIoKHZvaWQgKilwZGVzdF9idWYsCisJCQkJCQkodm9pZCAqKXJlY19kYXRhX3N0YXJ0LAorCQkJCQkJZmlyc3Rfc2VjdGlvbl9sZW4pOworCQkJaWYgKHJlcykgeworCQkJCXByX2luZm8oInA0IHJlYWQgbm90IGVuZCByZXM9JWQsIHJlcXVlc3Q9JWRcbiIsCisJCQkJCXJlcywgZmlyc3Rfc2VjdGlvbl9sZW4pOworCQkJCWNvcHlfb2sgPSAwOworCQkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfbGVuIC09CisJCQkJCWZpcnN0X3NlY3Rpb25fbGVuIC0gcmVzOworCQkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfc3RhcnQgKz0KKwkJCQkJZmlyc3Rfc2VjdGlvbl9sZW4gLSByZXM7CisJCQkJcHVzZXJkYXRhX3BhcmEtPmRhdGFfc2l6ZSA9CisJCQkJCWZpcnN0X3NlY3Rpb25fbGVuIC0gcmVzOworCQkJfSBlbHNlIHsKKwkJCQkvKiBmaXJzdCBzZWN0b24gY29weSBpcyBvayovCisJCQkJcmVzID0gKHUzMiljb3B5X3RvX3VzZXIoCisJCQkJCSh2b2lkICopKHBkZXN0X2J1ZitmaXJzdF9zZWN0aW9uX2xlbiksCisJCQkJCSh2b2lkICopcF91c2VyZGF0YV9tZ3ItPmRhdGFfYnVmLAorCQkJCQlkYXRhX3NpemUgLSBmaXJzdF9zZWN0aW9uX2xlbik7CisJCQkJaWYgKHJlcykgeworCQkJCQlwcl9pbmZvKCJwNSByZWFkIG5vdCBlbmQgcmVzPSVkLCByZXF1ZXN0PSVkXG4iLAorCQkJCQkJcmVzLAorCQkJCQkJZGF0YV9zaXplIC0gZmlyc3Rfc2VjdGlvbl9sZW4pOworCQkJCQljb3B5X29rID0gMDsKKwkJCQl9CisKKwkJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX2xlbiAtPSBkYXRhX3NpemUgLSByZXM7CisJCQkJcF91c2VyZGF0YV9yZWMtPnJlY19zdGFydCA9CisJCQkJCWRhdGFfc2l6ZSAtIGZpcnN0X3NlY3Rpb25fbGVuIC0gcmVzOworCQkJCXB1c2VyZGF0YV9wYXJhLT5kYXRhX3NpemUgPSBkYXRhX3NpemUgLSByZXM7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXMgPSAodTMyKWNvcHlfdG9fdXNlcigodm9pZCAqKXBkZXN0X2J1ZiwKKwkJCQkJCQkodm9pZCAqKXJlY19kYXRhX3N0YXJ0LAorCQkJCQkJCWRhdGFfc2l6ZSk7CisJCQlpZiAocmVzKSB7CisJCQkJcHJfaW5mbygicDYgcmVhZCBub3QgZW5kIHJlcz0lZCwgcmVxdWVzdD0lZFxuIiwKKwkJCQkJcmVzLCBkYXRhX3NpemUpOworCQkJCWNvcHlfb2sgPSAwOworCQkJfQorCisJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX2xlbiAtPSBkYXRhX3NpemUgLSByZXM7CisJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX3N0YXJ0ICs9IGRhdGFfc2l6ZSAtIHJlczsKKwkJCXB1c2VyZGF0YV9wYXJhLT5kYXRhX3NpemUgPSBkYXRhX3NpemUgLSByZXM7CisJCX0KKworCQlpZiAoY29weV9vaykgeworCQkJcF91c2VyZGF0YV9tZ3ItPnJlYWRfaW5kZXgrKzsKKwkJCWlmIChwX3VzZXJkYXRhX21nci0+cmVhZF9pbmRleAorCQkJCT49IFVTRVJEQVRBX0ZJRk9fTlVNKQorCQkJCXBfdXNlcmRhdGFfbWdyLT5yZWFkX2luZGV4ID0gMDsKKwkJfQorCisJfQorCisJcHVzZXJkYXRhX3BhcmEtPm1ldGFfaW5mbyA9IHBfdXNlcmRhdGFfcmVjLT5tZXRhX2luZm87CisKKwlpZiAocF91c2VyZGF0YV9tZ3ItPnJlYWRfaW5kZXggPD0gcF91c2VyZGF0YV9tZ3ItPndyaXRlX2luZGV4KQorCQlwdXNlcmRhdGFfcGFyYS0+bWV0YV9pbmZvLnJlY29yZHNfaW5fcXVlID0KKwkJCXBfdXNlcmRhdGFfbWdyLT53cml0ZV9pbmRleCAtCisJCQlwX3VzZXJkYXRhX21nci0+cmVhZF9pbmRleDsKKwllbHNlCisJCXB1c2VyZGF0YV9wYXJhLT5tZXRhX2luZm8ucmVjb3Jkc19pbl9xdWUgPQorCQkJcF91c2VyZGF0YV9tZ3ItPndyaXRlX2luZGV4ICsKKwkJCVVTRVJEQVRBX0ZJRk9fTlVNIC0KKwkJCXBfdXNlcmRhdGFfbWdyLT5yZWFkX2luZGV4OworCXB1c2VyZGF0YV9wYXJhLT52ZXJzaW9uID0gKDA8PDI0fDA8PDE2fDA8PDh8MSk7CisKKwltdXRleF91bmxvY2soJnVzZXJkYXRhX211dGV4KTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCB2bXBlZzEyX3Jlc2V0X3VzZXJkYXRhX2ZpZm8oc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGJJbml0KQoreworCW11dGV4X2xvY2soJnVzZXJkYXRhX211dGV4KTsKKworCWlmIChwX3VzZXJkYXRhX21ncikgeworCQlwcl9pbmZvKCJ2bXBlZzEyX3Jlc2V0X3VzZXJkYXRhX2ZpZm86IGJJbml0OiAlZCwgcmk6ICVkLCB3aTogJWRcbiIsCisJCQliSW5pdCwgcF91c2VyZGF0YV9tZ3ItPnJlYWRfaW5kZXgsCisJCQlwX3VzZXJkYXRhX21nci0+d3JpdGVfaW5kZXgpOworCQlwX3VzZXJkYXRhX21nci0+cmVhZF9pbmRleCA9IDA7CisJCXBfdXNlcmRhdGFfbWdyLT53cml0ZV9pbmRleCA9IDA7CisKKwkJaWYgKGJJbml0KQorCQkJcF91c2VyZGF0YV9tZ3ItPmxhc3Rfd3AgPSAwOworCX0KKworCW11dGV4X3VubG9jaygmdXNlcmRhdGFfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCB2bXBlZzEyX3dha2V1cF91c2VyZGF0YV9wb2xsKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJYW1zdHJlYW1fd2FrZXVwX3VzZXJkYXRhX3BvbGwodmRlYyk7Cit9CisKK3N0YXRpYyBpbnQgdm1wZWcxMl92ZGVjX2luZm9faW5pdCh2b2lkKQoreworCWd2cyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZGVjX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoTlVMTCA9PSBndnMpIHsKKwkJcHJfaW5mbygidGhlIHN0cnVjdCBvZiB2ZGVjIHN0YXR1cyBtYWxsb2MgZmFpbGVkLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHZtcGVnMTJfY2FudmFzX2luaXQodm9pZCkKK3sKKwlpbnQgaSwgcmV0OworCXUzMiBjYW52YXNfd2lkdGgsIGNhbnZhc19oZWlnaHQ7CisJdTMyIGRlY2J1Zl9zaXplLCBkZWNidWZfeV9zaXplLCBkZWNidWZfdXZfc2l6ZTsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBidWZfc3RhcnQ7CisKKwlpZiAoYnVmX3NpemUgPD0gMHgwMDQwMDAwMCkgeworCQkvKiBTRCBvbmx5ICovCisJCWNhbnZhc193aWR0aCA9IDc2ODsKKwkJY2FudmFzX2hlaWdodCA9IDU3NjsKKwkJZGVjYnVmX3lfc2l6ZSA9IDB4ODAwMDA7CisJCWRlY2J1Zl91dl9zaXplID0gMHgyMDAwMDsKKwkJZGVjYnVmX3NpemUgPSAweDEwMDAwMDsKKwl9IGVsc2UgeworCQkvKiBIRCAmIFNEICovCisJCWNhbnZhc193aWR0aCA9IDE5MjA7CisJCWNhbnZhc19oZWlnaHQgPSAxMDg4OworCQlkZWNidWZfeV9zaXplID0gMHgyMDAwMDA7CisJCWRlY2J1Zl91dl9zaXplID0gMHg4MDAwMDsKKwkJZGVjYnVmX3NpemUgPSAweDMwMDAwMDsKKwl9CisKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQk1NVV9CVUZGRVJfTlVNOyBpKyspIHsKKworCQlpZiAoaSA9PSAoTUFYX0JNTVVfQlVGRkVSX05VTSAtIDEpKSAvKiB3b3Jrc3BhY2UgbWVtICovCisJCQlkZWNidWZfc2l6ZSA9IFdPUktTUEFDRV9TSVpFOworCisJCXJldCA9IGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeShtbV9ibGtfaGFuZGxlLCBpLAorCQkJCWRlY2J1Zl9zaXplLCBEUklWRVJfTkFNRSwgJmJ1Zl9zdGFydCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlpZiAoaSA9PSAoTUFYX0JNTVVfQlVGRkVSX05VTSAtIDEpKSB7CisKKwkJCVdSSVRFX1ZSRUcoTVJFR19DT19NVl9TVEFSVCwgKGJ1Zl9zdGFydCArIENDQlVGX1NJWkUpKTsKKwkJCWlmICghY2NidWZfcGh5QWRkcmVzcykgeworCQkJCWNjYnVmX3BoeUFkZHJlc3MKKwkJCQk9ICh1MzIpYnVmX3N0YXJ0OworCisJCQkJY2NidWZfcGh5QWRkcmVzc192aXJ0CisJCQkJCT0gY29kZWNfbW1fcGh5c190b192aXJ0KAorCQkJCQkJY2NidWZfcGh5QWRkcmVzcyk7CisJCQkJaWYgKCghY2NidWZfcGh5QWRkcmVzc192aXJ0KSAmJiAoIXR2cF9mbGFnKSkgeworCQkJCQljY2J1Zl9waHlBZGRyZXNzX3ZpcnQKKwkJCQkJCT0gY29kZWNfbW1fdm1hcCgKKwkJCQkJCQljY2J1Zl9waHlBZGRyZXNzLAorCQkJCQkJCUNDQlVGX1NJWkUpOworCQkJCQljY2J1Zl9waHlBZGRyZXNzX2lzX3JlbWFwZWRfbm9jYWNoZSA9IDE7CisJCQkJfQorCQkJfQorCisJCX0gZWxzZSB7CisjaWZkZWYgTlYyMQorCQkJY29uZmlnX2Nhdl9sdXRfZXgoMiAqIGkgKyAwLAorCQkJCWJ1Zl9zdGFydCwKKwkJCQljYW52YXNfd2lkdGgsIGNhbnZhc19oZWlnaHQsCisJCQkJQ0FOVkFTX0FERFJfTk9XUkFQLCBDQU5WQVNfQkxLTU9ERV8zMlgzMiwgMCwgVkRFQ18xKTsKKwkJCWNvbmZpZ19jYXZfbHV0X2V4KDIgKiBpICsgMSwKKwkJCQlidWZfc3RhcnQgKworCQkJCWRlY2J1Zl95X3NpemUsIGNhbnZhc193aWR0aCwKKwkJCQljYW52YXNfaGVpZ2h0IC8gMiwgQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJCUNBTlZBU19CTEtNT0RFXzMyWDMyLCAwLCBWREVDXzEpOworI2Vsc2UKKwkJCWNvbmZpZ19jYXZfbHV0X2V4KDMgKiBpICsgMCwKKwkJCQlidWZfc3RhcnQsCisJCQkJY2FudmFzX3dpZHRoLCBjYW52YXNfaGVpZ2h0LAorCQkJCUNBTlZBU19BRERSX05PV1JBUCwgQ0FOVkFTX0JMS01PREVfMzJYMzIsIDAsIFZERUNfMSk7CisJCQljb25maWdfY2F2X2x1dF9leCgzICogaSArIDEsCisJCQkJYnVmX3N0YXJ0ICsKKwkJCQlkZWNidWZfeV9zaXplLCBjYW52YXNfd2lkdGggLyAyLAorCQkJCWNhbnZhc19oZWlnaHQgLyAyLCBDQU5WQVNfQUREUl9OT1dSQVAsCisJCQkJQ0FOVkFTX0JMS01PREVfMzJYMzIsIDAsIFZERUNfMSk7CisJCQljb25maWdfY2F2X2x1dF9leCgzICogaSArIDIsCisJCQkJYnVmX3N0YXJ0ICsKKwkJCQlkZWNidWZfeV9zaXplICsgZGVjYnVmX3V2X3NpemUsCisJCQkJY2FudmFzX3dpZHRoIC8gMiwgY2FudmFzX2hlaWdodCAvIDIsCisJCQkJQ0FOVkFTX0FERFJfTk9XUkFQLCBDQU5WQVNfQkxLTU9ERV8zMlgzMiwgMCwgVkRFQ18xKTsKKyNlbmRpZgorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm1wZWcxMl9wcm90X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX002KSB7CisJCWludCBzYXZlX3JlZyA9IFJFQURfVlJFRyhQT1dFUl9DVExfVkxEKTsKKworCQlXUklURV9WUkVHKERPU19TV19SRVNFVDAsICgxIDw8IDcpIHwgKDEgPDwgNikgfCAoMSA8PCA0KSk7CisJCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgMCk7CisKKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfTTgpIHsKKworCQkJUkVBRF9WUkVHKERPU19TV19SRVNFVDApOworCQkJUkVBRF9WUkVHKERPU19TV19SRVNFVDApOworCQkJUkVBRF9WUkVHKERPU19TV19SRVNFVDApOworCisJCQlXUklURV9WUkVHKERPU19TV19SRVNFVDAsICgxPDw3KSB8ICgxPDw2KSB8ICgxPDw0KSk7CisJCQlXUklURV9WUkVHKERPU19TV19SRVNFVDAsIDApOworCisJCQlXUklURV9WUkVHKERPU19TV19SRVNFVDAsICgxPDw5KSB8ICgxPDw4KSk7CisJCQlXUklURV9WUkVHKERPU19TV19SRVNFVDAsIDApOworCisJCQlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMCk7CisJCQlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMCk7CisJCQlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMCk7CisKKwkJCVdSSVRFX1ZSRUcoTURFQ19TV19SRVNFVCwgKDEgPDwgNykpOworCQkJV1JJVEVfVlJFRyhNREVDX1NXX1JFU0VULCAwKTsKKwkJfQorCisJCVdSSVRFX1ZSRUcoUE9XRVJfQ1RMX1ZMRCwgc2F2ZV9yZWcpOworCisJfSBlbHNlCisJCVdSSVRFX1JFU0VUX1JFRyhSRVNFVDBfUkVHSVNURVIsIFJFU0VUX0lRSURDVCB8IFJFU0VUX01DKTsKKworCXJldCA9IHZtcGVnMTJfY2FudmFzX2luaXQoKTsKKworI2lmZGVmIE5WMjEKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfMCwgMHgwMTAxMDApOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8xLCAweDAzMDMwMik7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzIsIDB4MDUwNTA0KTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfMywgMHgwNzA3MDYpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF80LCAweDA5MDkwOCk7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzUsIDB4MGIwYjBhKTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfNiwgMHgwZDBkMGMpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF83LCAweDBmMGYwZSk7CisjZWxzZQorCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8wLCAweDAyMDEwMCk7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzEsIDB4MDUwNDAzKTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfMiwgMHgwODA3MDYpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8zLCAweDBiMGEwOSk7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzQsIDB4MGUwZDBjKTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfNSwgMHgxMTEwMGYpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF82LCAweDE0MTMxMik7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzcsIDB4MTcxNjE1KTsKKyNlbmRpZgorCisJLyogc2V0IHRvIG1wZWcxIGRlZmF1bHQgKi8KKwlXUklURV9WUkVHKE1QRUcxXzJfUkVHLCAwKTsKKwkvKiBkaXNhYmxlIFBTQ0FMRSBmb3IgaGFyZHdhcmUgc2hhcmluZyAqLworCVdSSVRFX1ZSRUcoUFNDQUxFX0NUUkwsIDApOworCS8qIGZvciBNcGVnMSBkZWZhdWx0IHZhbHVlICovCisJV1JJVEVfVlJFRyhQSUNfSEVBRF9JTkZPLCAweDM4MCk7CisJLyogZGlzYWJsZSBtcGVnNCAqLworCVdSSVRFX1ZSRUcoTTRfQ09OVFJPTF9SRUcsIDApOworCS8qIGNsZWFyIG1haWxib3ggaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfQ0xSX1JFRywgMSk7CisJLyogY2xlYXIgYnVmZmVyIElOL09VVCByZWdpc3RlcnMgKi8KKwlXUklURV9WUkVHKE1SRUdfQlVGRkVSSU4sIDApOworCVdSSVRFX1ZSRUcoTVJFR19CVUZGRVJPVVQsIDApOworCS8qIHNldCByZWZlcmVuY2Ugd2lkdGggYW5kIGhlaWdodCAqLworCWlmICgoZnJhbWVfd2lkdGggIT0gMCkgJiYgKGZyYW1lX2hlaWdodCAhPSAwKSkKKwkJV1JJVEVfVlJFRyhNUkVHX0NNRCwgKGZyYW1lX3dpZHRoIDw8IDE2KSB8IGZyYW1lX2hlaWdodCk7CisJZWxzZQorCQlXUklURV9WUkVHKE1SRUdfQ01ELCAwKTsKKwlXUklURV9WUkVHKE1SRUdfRk9SQ0VfSV9SRFksIChmb3JjZV9maXJzdF9pX3JlYWR5ICYgMHgwMSkpOworCS8qIGNsZWFyIGVycm9yIGNvdW50ICovCisJV1JJVEVfVlJFRyhNUkVHX0VSUk9SX0NPVU5ULCAwKTsKKwlXUklURV9WUkVHKE1SRUdfRkFUQUxfRVJST1IsIDApOworCS8qIGNsZWFyIHdhaXQgYnVmZmVyIHN0YXR1cyAqLworCVdSSVRFX1ZSRUcoTVJFR19XQUlUX0JVRkZFUiwgMCk7CisjaWZkZWYgTlYyMQorCVNFVF9WUkVHX01BU0soTURFQ19QSUNfRENfQ1RSTCwgMSA8PCAxNyk7CisjZW5kaWYKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB2bXBlZzEyX2xvY2FsX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCUlOSVRfS0ZJRk8oZGlzcGxheV9xKTsKKwlJTklUX0tGSUZPKHJlY3ljbGVfcSk7CisJSU5JVF9LRklGTyhuZXdmcmFtZV9xKTsKKworCWN1cl9wb29sX2lkeCBePSAxOworCisJZm9yIChpID0gMDsgaSA8IFZGX1BPT0xfU0laRTsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqdmY7CisKKwkJaWYgKGN1cl9wb29sX2lkeCA9PSAwKSB7CisJCQl2ZiA9ICZ2ZnBvb2xbaV07CisJCQl2ZnBvb2xbaV0uaW5kZXggPSBERUNPREVfQlVGRkVSX05VTV9NQVg7CisJCQl9IGVsc2UgeworCQkJdmYgPSAmdmZwb29sMltpXTsKKwkJCXZmcG9vbDJbaV0uaW5kZXggPSBERUNPREVfQlVGRkVSX05VTV9NQVg7CisJCQl9CisJCWtmaWZvX3B1dCgmbmV3ZnJhbWVfcSwgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgREVDT0RFX0JVRkZFUl9OVU1fTUFYOyBpKyspCisJCXZmYnVmX3VzZVtpXSA9IDA7CisJaWYgKG1tX2Jsa19oYW5kbGUpIHsKKwkJbXV0ZXhfbG9jaygmdXNlcmRhdGFfbXV0ZXgpOworCQlpZiAocF91c2VyZGF0YV9tZ3IpIHsKKwkJCXZmcmVlKHBfdXNlcmRhdGFfbWdyKTsKKwkJCXBfdXNlcmRhdGFfbWdyID0gTlVMTDsKKwkJfQorCQlpZiAoY2NidWZfcGh5QWRkcmVzc19pc19yZW1hcGVkX25vY2FjaGUpCisJCQljb2RlY19tbV91bm1hcF9waHlhZGRyKGNjYnVmX3BoeUFkZHJlc3NfdmlydCk7CisJCWNjYnVmX3BoeUFkZHJlc3NfdmlydCA9IE5VTEw7CisJCWNjYnVmX3BoeUFkZHJlc3MgPSAwOworCQljY2J1Zl9waHlBZGRyZXNzX2lzX3JlbWFwZWRfbm9jYWNoZSA9IDA7CisJCWRlY29kZXJfYm1tdV9ib3hfZnJlZShtbV9ibGtfaGFuZGxlKTsKKwkJbW1fYmxrX2hhbmRsZSA9IE5VTEw7CisJCW11dGV4X3VubG9jaygmdXNlcmRhdGFfbXV0ZXgpOworCX0KKworCQltbV9ibGtfaGFuZGxlID0gZGVjb2Rlcl9ibW11X2JveF9hbGxvY19ib3goCisJCQlEUklWRVJfTkFNRSwKKwkJCTAsCisJCQlNQVhfQk1NVV9CVUZGRVJfTlVNLAorCQkJNCArIFBBR0VfU0hJRlQsCisJCQlDT0RFQ19NTV9GTEFHU19DTUFfQ0xFQVIgfAorCQkJQ09ERUNfTU1fRkxBR1NfRk9SX1ZERUNPREVSIHwKKwkJCXR2cF9mbGFnKTsKKworCisJZnJhbWVfd2lkdGggPSBmcmFtZV9oZWlnaHQgPSBmcmFtZV9kdXIgPSBmcmFtZV9wcm9nID0gMDsKKwlmcmFtZV9mb3JjZV9za2lwX2ZsYWcgPSAwOworCXdhaXRfYnVmZmVyX2NvdW50ZXIgPSAwOworCWZpcnN0X2lfZnJhbWVfcmVhZHkgPSBmb3JjZV9maXJzdF9pX3JlYWR5OworCXNhdmVkX3Jlc29sdXRpb24gPSAwOworCWRlY19jb250cm9sICY9IERFQ19DT05UUk9MX0lOVEVSTkFMX01BU0s7Cit9CisKK3N0YXRpYyBzMzIgdm1wZWcxMl9pbml0KHZvaWQpCit7CisJaW50IHJldCA9IC0xLCBzaXplID0gLTE7CisJY2hhciAqYnVmID0gdm1hbGxvYygweDEwMDAgKiAxNik7CisKKwlpZiAoSVNfRVJSX09SX05VTEwoYnVmKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0aW1lcl9zZXR1cCgmcmVjeWNsZV90aW1lciwgdm1wZWdfcHV0X3RpbWVyX2Z1bmMsIDApOworCisJc3RhdCB8PSBTVEFUX1RJTUVSX0lOSVQ7CisKKwl2bXBlZzEyX2xvY2FsX2luaXQoKTsKKworCWFtdmRlY19lbmFibGUoKTsKKworCXNpemUgPSBnZXRfZmlybXdhcmVfZGF0YShWSURFT19ERUNfTVBFRzEyLCBidWYpOworCWlmIChzaXplIDwgMCkgeworCQlwcl9lcnIoImdldCBmaXJtd2FyZSBmYWlsLiIpOworCQl2ZnJlZShidWYpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0ID0gYW12ZGVjX2xvYWRtY19leChWRk9STUFUX01QRUcxMiwgIm1wZWcxMiIsIGJ1Zik7CisJaWYgKHJldCA8IDApIHsKKwkJYW12ZGVjX2Rpc2FibGUoKTsKKwkJdmZyZWUoYnVmKTsKKwkJcHJfZXJyKCJNUEVHMTI6IHRoZSAlcyBmdyBsb2FkaW5nIGZhaWxlZCwgZXJyOiAleFxuIiwKKwkJCXRlZV9lbmFibGVkKCkgPyAiVEVFIiA6ICJsb2NhbCIsIHJldCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJdmZyZWUoYnVmKTsKKworCXN0YXQgfD0gU1RBVF9NQ19MT0FEOworCisJLyogZW5hYmxlIEFNUklTQyBzaWRlIHByb3RvY29sICovCisJdm1wZWcxMl9wcm90X2luaXQoKTsKKworCXJldCA9IHZkZWNfcmVxdWVzdF9pcnEoVkRFQ19JUlFfMSwgdm1wZWcxMl9pc3IsCisJCSAgICAidm1wZWcxMi1pcnEiLCAodm9pZCAqKXZtcGVnMTJfZGVjX2lkKTsKKworCWlmIChyZXQpIHsKKwkJYW12ZGVjX2Rpc2FibGUoKTsKKwkJYW1sb2dfbGV2ZWwoTE9HX0xFVkVMX0VSUk9SLCAidm1wZWcxMiBpcnEgcmVnaXN0ZXIgZXJyb3IuXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJc3RhdCB8PSBTVEFUX0lTUl9SRUc7CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfUE9TVF9QUk9DRVNTX01BTkFHRVIKKwl2Zl9wcm92aWRlcl9pbml0KCZ2bXBlZ192Zl9wcm92LCBQUk9WSURFUl9OQU1FLCAmdm1wZWdfdmZfcHJvdmlkZXIsCisJCQkJCSBOVUxMKTsKKwl2Zl9yZWdfcHJvdmlkZXIoJnZtcGVnX3ZmX3Byb3YpOworCXZmX25vdGlmeV9yZWNlaXZlcihQUk9WSURFUl9OQU1FLCBWRlJBTUVfRVZFTlRfUFJPVklERVJfU1RBUlQsIE5VTEwpOworI2Vsc2UKKwl2Zl9wcm92aWRlcl9pbml0KCZ2bXBlZ192Zl9wcm92LCBQUk9WSURFUl9OQU1FLCAmdm1wZWdfdmZfcHJvdmlkZXIsCisJCQkJCSBOVUxMKTsKKwl2Zl9yZWdfcHJvdmlkZXIoJnZtcGVnX3ZmX3Byb3YpOworI2VuZGlmCisJaWYgKHZtcGVnMTJfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSAhPSAwKSB7CisJCWlmICghaXNfcmVzZXQpIHsKKwkJCXZmX25vdGlmeV9yZWNlaXZlcihQUk9WSURFUl9OQU1FLAorCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9GUl9ISU5ULAorCQkJCSh2b2lkICopCisJCQkJKCh1bnNpZ25lZCBsb25nKQorCQkJCXZtcGVnMTJfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSkpOworCQkJZnJfaGludF9zdGF0dXMgPSBWREVDX0hJTlRFRDsKKwkJfQorCX0gZWxzZQorCQlmcl9oaW50X3N0YXR1cyA9IFZERUNfTkVFRF9ISU5UOworCisJc3RhdCB8PSBTVEFUX1ZGX0hPT0s7CisKKwlyZWN5Y2xlX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgUFVUX0lOVEVSVkFMOworCWFkZF90aW1lcigmcmVjeWNsZV90aW1lcik7CisKKwlzdGF0IHw9IFNUQVRfVElNRVJfQVJNOworCisJYW12ZGVjX3N0YXJ0KCk7CisKKwlzdGF0IHw9IFNUQVRfVkRFQ19SVU47CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIERVTVBfVVNFUl9EQVRBCitzdGF0aWMgaW50IGFtdmRlY19tcGVnMTJfaW5pdF91c2VyZGF0YV9kdW1wKHZvaWQpCit7CisJdXNlcl9kYXRhX2J1ZiA9IGttYWxsb2MoTUFYX1VTRVJfREFUQV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAodXNlcl9kYXRhX2J1ZikKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGFtdmRlY19tcGVnMTJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdmRlY19zICpwZGF0YSA9ICooc3RydWN0IHZkZWNfcyAqKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWFtbG9nX2xldmVsKExPR19MRVZFTF9JTkZPLCAiYW12ZGVjX21wZWcxMiBwcm9iZSBzdGFydC5cbiIpOworCisJaWYgKHBkYXRhID09IE5VTEwpIHsKKwkJYW1sb2dfbGV2ZWwoTE9HX0xFVkVMX0VSUk9SLAorCQkJImFtdmRlY19tcGVnMTIgcGxhdGZvcm0gZGF0YSB1bmRlZmluZWQuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJdHZwX2ZsYWcgPSB2ZGVjX3NlY3VyZShwZGF0YSkgPyBDT0RFQ19NTV9GTEFHU19UVlAgOiAwOworCWlmIChwZGF0YS0+c3lzX2luZm8pCisJCXZtcGVnMTJfYW1zdHJlYW1fZGVjX2luZm8gPSAqcGRhdGEtPnN5c19pbmZvOworCisJcGRhdGEtPmRlY19zdGF0dXMgPSB2bXBlZzEyX2RlY19zdGF0dXM7CisJcGRhdGEtPnNldF9pc3Jlc2V0ID0gdm1wZWcxMl9zZXRfaXNyZXNldDsKKworCXBkYXRhLT51c2VyX2RhdGFfcmVhZCA9IHZtcGVnMTJfdXNlcl9kYXRhX3JlYWQ7CisJcGRhdGEtPnJlc2V0X3VzZXJkYXRhX2ZpZm8gPSB2bXBlZzEyX3Jlc2V0X3VzZXJkYXRhX2ZpZm87CisJcGRhdGEtPndha2V1cF91c2VyZGF0YV9wb2xsID0gdm1wZWcxMl93YWtldXBfdXNlcmRhdGFfcG9sbDsKKwlpc19yZXNldCA9IDA7CisKKwl2bXBlZzEyX3ZkZWNfaW5mb19pbml0KCk7CisKKwlJTklUX1dPUksoJnNldF9jbGtfd29yaywgdm1wZWcxMl9zZXRfY2xrKTsKKwlpZiAodm1wZWcxMl9pbml0KCkgPCAwKSB7CisJCWFtbG9nX2xldmVsKExPR19MRVZFTF9FUlJPUiwgImFtdmRlY19tcGVnMTIgaW5pdCBmYWlsZWQuXG4iKTsKKwkJa2ZyZWUoZ3ZzKTsKKwkJZ3ZzID0gTlVMTDsKKwkJcGRhdGEtPmRlY19zdGF0dXMgPSBOVUxMOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJdmRlYyA9IHBkYXRhOworI2lmZGVmIERVTVBfVVNFUl9EQVRBCisJYW12ZGVjX21wZWcxMl9pbml0X3VzZXJkYXRhX2R1bXAoKTsKKyNlbmRpZgorCXZtcGVnMTJfY3JlYXRlX3VzZXJkYXRhX21hbmFnZXIoY2NidWZfcGh5QWRkcmVzc192aXJ0LCBDQ0JVRl9TSVpFKTsKKworCUlOSVRfV09SSygmdXNlcmRhdGFfcHVzaF93b3JrLCB1c2VyZGF0YV9wdXNoX2RvX3dvcmspOworCUlOSVRfV09SSygmbm90aWZ5X3dvcmssIHZtcGVnMTJfbm90aWZ5X3dvcmspOworCUlOSVRfV09SSygmcmVzZXRfd29yaywgcmVzZXRfZG9fd29yayk7CisKKworCWxhc3Rfb2Zmc2V0ID0gMHhGRkZGRkZGRjsKKyNpZmRlZiBEVU1QX1VTRVJfREFUQQorCWxhc3Rfd3AgPSAwOworCXJlc2V0X3VzZXJfZGF0YV9idWYoKTsKKyNlbmRpZgorCisJYW1sb2dfbGV2ZWwoTE9HX0xFVkVMX0lORk8sICJhbXZkZWNfbXBlZzEyIHByb2JlIGVuZC5cbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW12ZGVjX21wZWcxMl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwljYW5jZWxfd29ya19zeW5jKCZ1c2VyZGF0YV9wdXNoX3dvcmspOworCWNhbmNlbF93b3JrX3N5bmMoJm5vdGlmeV93b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZyZXNldF93b3JrKTsKKworCWlmIChzdGF0ICYgU1RBVF9WREVDX1JVTikgeworCQlhbXZkZWNfc3RvcCgpOworCQlzdGF0ICY9IH5TVEFUX1ZERUNfUlVOOworCX0KKworCWlmIChzdGF0ICYgU1RBVF9JU1JfUkVHKSB7CisJCXZkZWNfZnJlZV9pcnEoVkRFQ19JUlFfMSwgKHZvaWQgKil2bXBlZzEyX2RlY19pZCk7CisJCXN0YXQgJj0gflNUQVRfSVNSX1JFRzsKKwl9CisKKwlpZiAoc3RhdCAmIFNUQVRfVElNRVJfQVJNKSB7CisJCWRlbF90aW1lcl9zeW5jKCZyZWN5Y2xlX3RpbWVyKTsKKwkJc3RhdCAmPSB+U1RBVF9USU1FUl9BUk07CisJfQorCisJY2FuY2VsX3dvcmtfc3luYygmc2V0X2Nsa193b3JrKTsKKwlpZiAoc3RhdCAmIFNUQVRfVkZfSE9PSykgeworCQlpZiAoZnJfaGludF9zdGF0dXMgPT0gVkRFQ19ISU5URUQpCisJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoUFJPVklERVJfTkFNRSwKKwkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfRlJfRU5EX0hJTlQsIE5VTEwpOworCQlmcl9oaW50X3N0YXR1cyA9IFZERUNfTk9fTkVFRF9ISU5UOworCisJCXZmX3VucmVnX3Byb3ZpZGVyKCZ2bXBlZ192Zl9wcm92KTsKKwkJc3RhdCAmPSB+U1RBVF9WRl9IT09LOworCX0KKworCWFtdmRlY19kaXNhYmxlKCk7CisJaWYgKGNjYnVmX3BoeUFkZHJlc3NfaXNfcmVtYXBlZF9ub2NhY2hlKQorCQljb2RlY19tbV91bm1hcF9waHlhZGRyKGNjYnVmX3BoeUFkZHJlc3NfdmlydCk7CisKKwljY2J1Zl9waHlBZGRyZXNzX3ZpcnQgPSBOVUxMOworCWNjYnVmX3BoeUFkZHJlc3MgPSAwOworCWNjYnVmX3BoeUFkZHJlc3NfaXNfcmVtYXBlZF9ub2NhY2hlID0gMDsKKwl2bXBlZzEyX2Rlc3Ryb3lfdXNlcmRhdGFfbWFuYWdlcigpOworCisJaWYgKG1tX2Jsa19oYW5kbGUpIHsKKwkJZGVjb2Rlcl9ibW11X2JveF9mcmVlKG1tX2Jsa19oYW5kbGUpOworCQltbV9ibGtfaGFuZGxlID0gTlVMTDsKKwl9CisJYW1sb2dfbGV2ZWwoTE9HX0xFVkVMX0lORk8sICJhbXZkZWNfbXBlZzEyIHJlbW92ZS5cbiIpOworCisJa2ZyZWUoZ3ZzKTsKKwlndnMgPSBOVUxMOworCXZkZWMgPSBOVUxMOworCisjaWZkZWYgRFVNUF9VU0VSX0RBVEEKKwlpZiAodXNlcl9kYXRhX2J1ZikgeworCQlzaG93X3VzZXJfZGF0YV9idWYoKTsKKwkJa2ZyZWUodXNlcl9kYXRhX2J1Zik7CisJCXVzZXJfZGF0YV9idWYgPSBOVUxMOworCX0KKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhbXZkZWNfbXBlZzEyX2RyaXZlciA9IHsKKwkucHJvYmUgPSBhbXZkZWNfbXBlZzEyX3Byb2JlLAorCS5yZW1vdmUgPSBhbXZkZWNfbXBlZzEyX3JlbW92ZSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZCA9IGFtdmRlY19zdXNwZW5kLAorCS5yZXN1bWUgPSBhbXZkZWNfcmVzdW1lLAorI2VuZGlmCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGNvZGVjX3Byb2ZpbGVfdCBhbXZkZWNfbXBlZzEyX3Byb2ZpbGUgPSB7CisJLm5hbWUgPSAibXBlZzEyIiwKKwkucHJvZmlsZSA9ICIiCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgbWNvbmZpZyBtcGVnMTJfY29uZmlnc1tdID0geworCU1DX1BVMzIoInN0YXQiLCAmc3RhdCksCisJTUNfUFUzMigiZGVjX2NvbnRyb2wiLCAmZGVjX2NvbnRyb2wpLAorCU1DX1BVMzIoImVycm9yX2ZyYW1lX3NraXBfbGV2ZWwiLCAmZXJyb3JfZnJhbWVfc2tpcF9sZXZlbCksCit9Oworc3RhdGljIHN0cnVjdCBtY29uZmlnX25vZGUgbXBlZzEyX25vZGU7CisKKworc3RhdGljIGludCBfX2luaXQgYW12ZGVjX21wZWcxMl9kcml2ZXJfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlhbWxvZ19sZXZlbChMT0dfTEVWRUxfSU5GTywgImFtdmRlY19tcGVnMTIgbW9kdWxlIGluaXRcbiIpOworCisJaWYgKHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYW12ZGVjX21wZWcxMl9kcml2ZXIpKSB7CisJCWFtbG9nX2xldmVsKExPR19MRVZFTF9FUlJPUiwKKwkJCSJmYWlsZWQgdG8gcmVnaXN0ZXIgYW12ZGVjX21wZWcxMiBkcml2ZXJcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJdmNvZGVjX3Byb2ZpbGVfcmVnaXN0ZXIoJmFtdmRlY19tcGVnMTJfcHJvZmlsZSk7CisJSU5JVF9SRUdfTk9ERV9DT05GSUdTKCJtZWRpYS5kZWNvZGVyIiwgJm1wZWcxMl9ub2RlLAorCQkibXBlZzEyIiwgbXBlZzEyX2NvbmZpZ3MsIENPTkZJR19GT1JfUlcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYW12ZGVjX21wZWcxMl9kcml2ZXJfcmVtb3ZlX21vZHVsZSh2b2lkKQoreworCWFtbG9nX2xldmVsKExPR19MRVZFTF9JTkZPLCAiYW12ZGVjX21wZWcxMiBtb2R1bGUgcmVtb3ZlLlxuIik7CisKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYW12ZGVjX21wZWcxMl9kcml2ZXIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK21vZHVsZV9wYXJhbShkZWNfY29udHJvbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlY19jb250cm9sLCAiXG4gYW12bXBlZzEyIGRlY29kZXIgY29udHJvbFxuIik7Cittb2R1bGVfcGFyYW0oZXJyb3JfZnJhbWVfc2tpcF9sZXZlbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVycm9yX2ZyYW1lX3NraXBfbGV2ZWwsCisJCQkJICJcbiBhbXZkZWNfbXBlZzEyIGVycm9yX2ZyYW1lX3NraXBfbGV2ZWxcbiIpOworbW9kdWxlX3BhcmFtKGZvcmNlX2ZpcnN0X2lfcmVhZHksIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9maXJzdF9pX3JlYWR5LCAiXG4gYW12bXBlZzEyIGZvcmNlX2ZpcnN0X2lfcmVhZHlcbiIpOworCittb2R1bGVfaW5pdChhbXZkZWNfbXBlZzEyX2RyaXZlcl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChhbXZkZWNfbXBlZzEyX2RyaXZlcl9yZW1vdmVfbW9kdWxlKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTUxPR0lDIE1QRUcxLzIgVmlkZW8gRGVjb2RlciBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlRpbSBZYW8gPHRpbXlhb0BhbWxvZ2ljLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9tcGVnMTIvdm1wZWcxMi5oIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL21wZWcxMi92bXBlZzEyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI2YTQxNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9tcGVnMTIvdm1wZWcxMi5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvYW1wb3J0cy92bXBlZzEyLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBWTVBFRzEyX0gKKyNkZWZpbmUgVk1QRUcxMl9ICisKKy8qIC8jaWYgTUVTT05fQ1BVX1RZUEUgPj0gTUVTT05fQ1BVX1RZUEVfTUVTT042ICovCisvKiBUT0RPOiBtb3ZlIHRvIHJlZ2lzdGVyIGhlYWRlcnMgKi8KKyNkZWZpbmUgVlBQX1ZEMV9QT1NUQkxFTkQgICAgICAgICAgICgxIDw8IDEwKQorLyogLyNlbmRpZiAqLworCisjZW5kaWYJCQkJLyogVk1QRUcxMl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvbXBlZzEyL3ZtcGVnMTJfbXVsdGkuYyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9tcGVnMTIvdm1wZWcxMl9tdWx0aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3N2JiN2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvbXBlZzEyL3ZtcGVnMTJfbXVsdGkuYwpAQCAtMCwwICsxLDM5NDEgQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvYW1wb3J0cy92bXBlZzEyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisqLworCisjZGVmaW5lIERFQlVHCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkL2Nsb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9mcmFtZV9zeW5jL3B0c3NlcnYuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL2Ftc3RyZWFtLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jYW52YXMvY2FudmFzLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3Byb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3JlY2VpdmVyLmg+CisvLyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL3RlZS5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvdGVlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL3ZkZWNfcmVnLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9yZWdpc3RlcnMvcmVnaXN0ZXIuaD4KKyNpbmNsdWRlICIuLi8uLi8uLi9zdHJlYW1faW5wdXQvYW1wb3J0cy9hbXBvcnRzX3ByaXYuaCIKKyNpbmNsdWRlICIuLi91dGlscy92ZGVjX2lucHV0LmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvdmRlYy5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2FtdmRlYy5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2RlY29kZXJfbW11X2JveC5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2RlY29kZXJfYm1tdV9ib3guaCIKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvZGVjX21tLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jb2RlY19tbS9jb25maWdzLmg+CisjaW5jbHVkZSAiLi4vdXRpbHMvY29uZmlnX3BhcnNlci5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2Zpcm13YXJlLmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvdmRlY192NGwyX2J1ZmZlcl9vcHMuaCIKKyNpbmNsdWRlICIuLi91dGlscy9jb25maWdfcGFyc2VyLmgiCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1tZW0ybWVtLmg+CisjaW5jbHVkZSAiLi4vdXRpbHMvdmRlY19mZWF0dXJlLmgiCisKKyNkZWZpbmUgTUVNX05BTUUgImNvZGVjX21tcGVnMTIiCisjZGVmaW5lIENIRUNLX0lOVEVSVkFMICAgICAgICAoSFovMTAwKQorCisjZGVmaW5lIERSSVZFUl9OQU1FICJhbW12ZGVjX21wZWcxMiIKKyNkZWZpbmUgTVJFR19SRUYwICAgICAgICBBVl9TQ1JBVENIXzIKKyNkZWZpbmUgTVJFR19SRUYxICAgICAgICBBVl9TQ1JBVENIXzMKKy8qIHByb3RvY29sIHJlZ2lzdGVycyAqLworI2RlZmluZSBNUkVHX1NFUV9JTkZPICAgICAgIEFWX1NDUkFUQ0hfNAorI2RlZmluZSBNUkVHX1BJQ19JTkZPICAgICAgIEFWX1NDUkFUQ0hfNQorI2RlZmluZSBNUkVHX1BJQ19XSURUSCAgICAgIEFWX1NDUkFUQ0hfNgorI2RlZmluZSBNUkVHX1BJQ19IRUlHSFQgICAgIEFWX1NDUkFUQ0hfNworI2RlZmluZSBNUkVHX0lOUFVUICAgICAgICAgIEFWX1NDUkFUQ0hfOCAgLyppbnB1dF90eXBlKi8KKyNkZWZpbmUgTVJFR19CVUZGRVJPVVQgICAgICBBVl9TQ1JBVENIXzkgIC8qRlJPTV9BTVJJU0NfUkVHKi8KKworI2RlZmluZSBNUkVHX0NNRCAgICAgICAgICAgIEFWX1NDUkFUQ0hfQQorI2RlZmluZSBNUkVHX0NPX01WX1NUQVJUICAgIEFWX1NDUkFUQ0hfQgorI2RlZmluZSBNUkVHX0VSUk9SX0NPVU5UICAgIEFWX1NDUkFUQ0hfQworI2RlZmluZSBNUkVHX0ZSQU1FX09GRlNFVCAgIEFWX1NDUkFUQ0hfRAorI2RlZmluZSBNUkVHX1dBSVRfQlVGRkVSICAgIEFWX1NDUkFUQ0hfRQorI2RlZmluZSBNUkVHX0ZBVEFMX0VSUk9SICAgIEFWX1NDUkFUQ0hfRgorCisjZGVmaW5lIE1SRUdfQ0NfQUREUiAgICBBVl9TQ1JBVENIXzAKKyNkZWZpbmUgQVVYX0JVRl9BTElHTihhZHIpICgoYWRyICsgMHhmKSAmICh+MHhmKSkKKworI2RlZmluZSBHRVRfU0xJQ0VfVFlQRSh0eXBlKSAgKCJJUEIjIyJbKCh0eXBlJlBJQ0lORk9fVFlQRV9NQVNLKT4+MTYpJjB4M10pCisjZGVmaW5lIFBJQ0lORk9fRVJST1IgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBQSUNJTkZPX1RZUEVfTUFTSyAgIDB4MDAwMzAwMDAKKyNkZWZpbmUgUElDSU5GT19UWVBFX0kgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIFBJQ0lORk9fVFlQRV9QICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBQSUNJTkZPX1RZUEVfQiAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgUElDSU5GT19QUk9HICAgICAgICAweDgwMDAKKyNkZWZpbmUgUElDSU5GT19SUFRfRklSU1QgICAweDQwMDAKKyNkZWZpbmUgUElDSU5GT19UT1BfRklSU1QgICAweDIwMDAKKyNkZWZpbmUgUElDSU5GT19GUkFNRSAgICAgICAweDEwMDAKKyNkZWZpbmUgVE9QX0ZJRUxEICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIEJPVFRPTV9GSUVMRCAgICAgICAgIDB4MjAwMAorI2RlZmluZSBGUkFNRV9QSUNUVVJFICAgICAgICAweDMwMDAKKyNkZWZpbmUgRlJBTUVfUElDVFVSRV9NQVNLICAgMHgzMDAwCisKKyNkZWZpbmUgU0VRSU5GT19FWFRfQVZBSUxBQkxFICAgMHg4MDAwMDAwMAorI2RlZmluZSBTRVFJTkZPX1BST0cgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIENDQlVGX1NJWkUgICAgICAoNSoxMDI0KQorCisjZGVmaW5lIFZGX1BPT0xfU0laRSAgICAgICAgNjQKKyNkZWZpbmUgREVDT0RFX0JVRkZFUl9OVU1fTUFYIDE2CisjZGVmaW5lIERFQ09ERV9CVUZGRVJfTlVNX0RFRiA4CisjZGVmaW5lIE1BWF9CTU1VX0JVRkZFUl9OVU0gKERFQ09ERV9CVUZGRVJfTlVNX01BWCArIDEpCisKKyNkZWZpbmUgUFVUX0lOVEVSVkFMICAgICAgICAoSFovMTAwKQorI2RlZmluZSBXT1JLU1BBQ0VfU0laRQkJKDQqU1pfNjRLKSAvKnN3YXAmY2NidWYmbWF0aXJ4Jk1WKi8KKyNkZWZpbmUgQ1RYX0xNRU1fU1dBUF9PRkZTRVQgICAgMAorI2RlZmluZSBDVFhfQ0NCVUZfT0ZGU0VUICAgICAgICAweDgwMAorI2RlZmluZSBDVFhfUVVBTlRfTUFUUklYX09GRlNFVCAoQ1RYX0NDQlVGX09GRlNFVCArIDUqMTAyNCkKKyNkZWZpbmUgQ1RYX0NPX01WX09GRlNFVCAgICAgICAgKENUWF9RVUFOVF9NQVRSSVhfT0ZGU0VUICsgMSoxMDI0KQorI2RlZmluZSBDVFhfREVDQlVGX09GRlNFVCAgICAgICAoQ1RYX0NPX01WX09GRlNFVCArIDB4MTEwMDApCisKKyNkZWZpbmUgREVGQVVMVF9NRU1fU0laRQkoMzIqU1pfMU0pCisjZGVmaW5lIElOVkFMSURfSURYIAkJKC0xKSAgLyogSW52YWxpZCBidWZmZXIgaW5kZXguKi8KKworc3RhdGljIHUzMiBidWZfc2l6ZSA9IDMyICogMTAyNCAqIDEwMjQ7CitzdGF0aWMgaW50IHByZV9kZWNvZGVfYnVmX2xldmVsID0gMHg4MDA7CitzdGF0aWMgaW50IHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwgPSAweDQwMDA7CitzdGF0aWMgdTMyIGRlY19jb250cm9sOworc3RhdGljIHUzMiBlcnJvcl9mcmFtZV9za2lwX2xldmVsID0gMTsKK3N0YXRpYyB1MzIgdWRlYnVnX2ZsYWc7CitzdGF0aWMgdW5zaWduZWQgaW50IHJhZHI7CitzdGF0aWMgdW5zaWduZWQgaW50IHJ2YWw7CisKK3N0YXRpYyB1MzIgd2l0aG91dF9kaXNwbGF5X21vZGU7CitzdGF0aWMgdTMyIGR5bmFtaWNfYnVmX251bV9tYXJnaW4gPSAyOworCisjZGVmaW5lIFZNUEVHMTJfREVWX05VTSAgICAgICAgOQorc3RhdGljIHVuc2lnbmVkIGludCBtYXhfZGVjb2RlX2luc3RhbmNlX251bSA9IFZNUEVHMTJfREVWX05VTTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X3Byb2Nlc3NfdGltZVtWTVBFRzEyX0RFVl9OVU1dOworc3RhdGljIHVuc2lnbmVkIGludCBkZWNvZGVfdGltZW91dF92YWwgPSAyMDA7CisjZGVmaW5lIElOQ1BUUihwKSBwdHJfYXRvbWljX3dyYXBfaW5jKCZwKQorCisjZGVmaW5lIERFQ19DT05UUk9MX0ZMQUdfRk9SQ0VfMjUwMF83MjBfNTc2X0lOVEVSTEFDRSAgMHgwMDAyCisjZGVmaW5lIERFQ19DT05UUk9MX0ZMQUdfRk9SQ0VfMzAwMF83MDRfNDgwX0lOVEVSTEFDRSAgMHgwMDA0CisjZGVmaW5lIERFQ19DT05UUk9MX0ZMQUdfRk9SQ0VfMjUwMF83MDRfNTc2X0lOVEVSTEFDRSAgMHgwMDA4CisjZGVmaW5lIERFQ19DT05UUk9MX0ZMQUdfRk9SQ0VfMjUwMF81NDRfNTc2X0lOVEVSTEFDRSAgMHgwMDEwCisjZGVmaW5lIERFQ19DT05UUk9MX0ZMQUdfRk9SQ0VfMjUwMF80ODBfNTc2X0lOVEVSTEFDRSAgMHgwMDIwCisjZGVmaW5lIERFQ19DT05UUk9MX0lOVEVSTkFMX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwZmZmCisjZGVmaW5lIERFQ19DT05UUk9MX0ZMQUdfRk9SQ0VfU0VRX0lOVEVSTEFDRSAgICAgICAgICAgMHgxMDAwCisKKyNkZWZpbmUgSU5URVJMQUNFX1NFUV9BTFdBWVMKKworI2lmIDEvKiBNRVNPTl9DUFVfVFlQRSA+PSBNRVNPTl9DUFVfVFlQRV9NRVNPTjYgKi8KKyNkZWZpbmUgTlYyMQorI2VuZGlmCisKKyNkZWZpbmUgQUdBSU5fSEFTX1RIUkVTSE9MRAorCisjaWZkZWYgQUdBSU5fSEFTX1RIUkVTSE9MRAorc3RhdGljIHUzMiBhZ2Fpbl90aHJlc2hvbGQ7CisjZW5kaWYKKworLyoKKyNkZWZpbmUgRFVNUF9VU0VSX0RBVEEKKyovCisKK2VudW0geworCUZSQU1FX1JFUEVBVF9UT1AsCisJRlJBTUVfUkVQRUFUX0JPVCwKKwlGUkFNRV9SRVBFQVRfTk9ORQorfTsKKworLypTZW5kIGJ5IEFWX1NDUkFUQ0hfOSovCisjZGVmaW5lIE1QRUcxMl9QSUNfRE9ORSAgICAgMQorI2RlZmluZSBNUEVHMTJfREFUQV9FTVBUWSAgIDIKKyNkZWZpbmUgTVBFRzEyX1NFUV9FTkQgICAgICAzCisjZGVmaW5lIE1QRUcxMl9EQVRBX1JFUVVFU1QgNAorCisvKlNlbmQgYnkgQVZfU0NSQVRDSF9HKi8KKyNkZWZpbmUgTVBFRzEyX1Y0TDJfSU5GT19OT1RJRlkgMQorLypTZW5kIGJ5IEFWX1NDUkFUQ0hfSiovCisjZGVmaW5lIE1QRUcxMl9VU0VSREFUQV9ET05FIDB4ODAwMAorCisjZGVmaW5lIERFQ19SRVNVTFRfTk9ORSAgICAgMAorI2RlZmluZSBERUNfUkVTVUxUX0RPTkUgICAgIDEKKyNkZWZpbmUgREVDX1JFU1VMVF9BR0FJTiAgICAyCisjZGVmaW5lIERFQ19SRVNVTFRfRVJST1IgICAgMworI2RlZmluZSBERUNfUkVTVUxUX0ZPUkNFX0VYSVQgNAorI2RlZmluZSBERUNfUkVTVUxUX0VPUyA1CisjZGVmaW5lIERFQ19SRVNVTFRfR0VUX0RBVEEgICAgICAgICA2CisjZGVmaW5lIERFQ19SRVNVTFRfR0VUX0RBVEFfUkVUUlkgICA3CisKKyNkZWZpbmUgREVDX0RFQ09ERV9USU1FT1VUICAgICAgICAgMHgyMQorI2RlZmluZSBERUNPREVfSUQoaHcpIChod190b192ZGVjKGh3KS0+aWQpCisjZGVmaW5lIERFQ09ERV9TVE9QX1BPUyAgICAgICAgIEFWX1NDUkFUQ0hfSworCitzdHJ1Y3QgbW1wZWcyX3VzZXJkYXRhX3JlY29yZF90IHsKKwlzdHJ1Y3QgdXNlcmRhdGFfbWV0YV9pbmZvX3QgbWV0YV9pbmZvOworCXUzMiByZWNfc3RhcnQ7CisJdTMyIHJlY19sZW47Cit9OworCisjZGVmaW5lIFVTRVJEQVRBX0ZJRk9fTlVNICAgIDI1NgorI2RlZmluZSBNQVhfRlJFRV9VU0VSREFUQV9OT0RFUwkJNQorCitzdHJ1Y3QgbW1wZWcyX3VzZXJkYXRhX2luZm9fdCB7CisJc3RydWN0IG1tcGVnMl91c2VyZGF0YV9yZWNvcmRfdCByZWNvcmRzW1VTRVJEQVRBX0ZJRk9fTlVNXTsKKwl1OCAqZGF0YV9idWY7CisJdTggKmRhdGFfYnVmX2VuZDsKKwl1MzIgYnVmX2xlbjsKKwl1MzIgcmVhZF9pbmRleDsKKwl1MzIgd3JpdGVfaW5kZXg7CisJdTMyIGxhc3Rfd3A7Cit9OworI2RlZmluZSBNQVhfVURfUkVDT1JEUwk1CisKK3N0cnVjdCBwaWNfaW5mb190IHsKKwl1MzIgYnVmZmVyX2luZm87CisJdTMyIGluZGV4OworCXUzMiBvZmZzZXQ7CisJdTMyIHdpZHRoOworCXUzMiBoZWlnaHQ7CisJdTMyIHB0czsKKwl1NjQgcHRzNjQ7CisJYm9vbCBwdHNfdmFsaWQ7CisJdWxvbmcgdjRsX3JlZl9idWZfYWRkcjsKKwl1MzIgaHdfZGVjb2RlX3RpbWU7CisJdTMyIGZyYW1lX3NpemU7IC8vIEZvciBmcmFtZSBiYXNlIG1vZGUKKwl1NjQgdGltZXN0YW1wOworfTsKKworc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgeworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXY7CisJREVDTEFSRV9LRklGTyhuZXdmcmFtZV9xLCBzdHJ1Y3QgdmZyYW1lX3MgKiwgVkZfUE9PTF9TSVpFKTsKKwlERUNMQVJFX0tGSUZPKGRpc3BsYXlfcSwgc3RydWN0IHZmcmFtZV9zICosIFZGX1BPT0xfU0laRSk7CisJc3RydWN0IHZmcmFtZV9zIHZmcG9vbFtWRl9QT09MX1NJWkVdOworCXMzMiB2ZmJ1Zl91c2VbREVDT0RFX0JVRkZFUl9OVU1fTUFYXTsKKwlzMzIgcmVmX3VzZVtERUNPREVfQlVGRkVSX05VTV9NQVhdOworCXUzMiBmcmFtZV93aWR0aDsKKwl1MzIgZnJhbWVfaGVpZ2h0OworCXUzMiBmcmFtZV9kdXI7CisJdTMyIGZyYW1lX3Byb2c7CisJdTMyIHNlcWluZm87CisJdTMyIGN0eF92YWxpZDsKKwl1MzIgZGVjX2NvbnRyb2w7CisJdm9pZCAqbW1fYmxrX2hhbmRsZTsKKwlzdHJ1Y3QgdmZyYW1lX2NodW5rX3MgKmNodW5rOworCXUzMiBzdGF0OworCXU4IGluaXRfZmxhZzsKKwl1bnNpZ25lZCBsb25nIGJ1Zl9zdGFydDsKKwl1MzIgYnVmX3NpemU7CisJdTMyIHZtcGVnMTJfcmF0aW87CisJdTY0IHZtcGVnMTJfcmF0aW82NDsKKwl1MzIgcGl4ZWxfcmF0aW87CisJdTMyIHJlZ19waWNfd2lkdGg7CisJdTMyIHJlZ19waWNfaGVpZ2h0OworCXUzMiByZWdfbXBlZzFfMl9yZWc7CisJdTMyIHJlZ19waWNfaGVhZF9pbmZvOworCXUzMiByZWdfZl9jb2RlX3JlZzsKKwl1MzIgcmVnX3NsaWNlX3Zlcl9wb3NfcGljX3R5cGU7CisJdTMyIHJlZ192Y29wX2N0cmxfcmVnOworCXUzMiByZWdfbWJfaW5mbzsKKwl1MzIgcmVnX3NpZ25hbF90eXBlOworCXUzMiBkZWNfbnVtOworCXUzMiBkaXNwX251bTsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBjaGVja190aW1lcjsKKwl1MzIgZGVjb2RlX3RpbWVvdXRfY291bnQ7CisJdW5zaWduZWQgbG9uZyBpbnQgc3RhcnRfcHJvY2Vzc190aW1lOworCXUzMiBsYXN0X3ZsZF9sZXZlbDsKKwl1MzIgZW9zOworCisJc3RydWN0IHBpY19pbmZvX3QgcGljc1tERUNPREVfQlVGRkVSX05VTV9NQVhdOworCXUzMiBjYW52YXNfc3BlY1tERUNPREVfQlVGRkVSX05VTV9NQVhdOworCXU2NCBsYXN0cHRzNjQ7CisJdTMyIGxhc3RfY2h1bmtfcHRzOworCXN0cnVjdCBjYW52YXNfY29uZmlnX3MgY2FudmFzX2NvbmZpZ1tERUNPREVfQlVGRkVSX05VTV9NQVhdWzJdOworCXN0cnVjdCBkZWNfc3lzaW5mbyB2bXBlZzEyX2Ftc3RyZWFtX2RlY19pbmZvOworCisJczMyIHJlZnNbMl07CisJaW50IGRlY19yZXN1bHQ7CisJdTMyIHRpbWVvdXRfcHJvY2Vzc2luZzsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3E7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3RydWN0IHdvcmtfc3RydWN0IHRpbWVvdXRfd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgbm90aWZ5X3dvcms7CisJdm9pZCAoKnZkZWNfY2IpKHN0cnVjdCB2ZGVjX3MgKiwgdm9pZCAqKTsKKwl2b2lkICp2ZGVjX2NiX2FyZzsKKwlkbWFfYWRkcl90IGNjYnVmX3BoeUFkZHJlc3M7CisJdm9pZCAqY2NidWZfcGh5QWRkcmVzc192aXJ0OworCXUzMiBjY19idWZfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGNjYnVmX3BoeUFkZHJlc3NfaXNfcmVtYXBlZF9ub2NhY2hlOworCXUzMiBmcmFtZV9ycHRfc3RhdGU7CisvKiBmb3IgZXJyb3IgaGFuZGxpbmcgKi8KKwlzMzIgZnJhbWVfZm9yY2Vfc2tpcF9mbGFnOworCXMzMiBlcnJvcl9mcmFtZV9za2lwX2xldmVsOworCXMzMiB3YWl0X2J1ZmZlcl9jb3VudGVyOworCXUzMiBmaXJzdF9pX2ZyYW1lX3JlYWR5OworCXUzMiBydW5fY291bnQ7CisJdTMyCW5vdF9ydW5fcmVhZHk7CisJdTMyCWlucHV0X2VtcHR5OworCXUzMiBwdXRfbnVtOworCXUzMiBwZWVrX251bTsKKwl1MzIgZ2V0X251bTsKKwl1MzIgZHJvcF9mcmFtZV9jb3VudDsKKwl1MzIgYnVmZmVyX25vdF9yZWFkeTsKKwl1MzIgcmF0aW9fY29udHJvbDsKKwlpbnQgZnJhbWVpbmZvX2VuYWJsZTsKKwlzdHJ1Y3QgZmlybXdhcmVfcyAqZnc7CisJdTMyIGNhbnZhc19tb2RlOworI2lmZGVmIEFHQUlOX0hBU19USFJFU0hPTEQKKwl1MzIgcHJlX3BhcnNlcl93cl9wdHI7CisJdTggbmV4dF9hZ2Fpbl9mbGFnOworI2VuZGlmCisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdXNlcmRhdGFfcHVzaF93b3JrOworCXN0cnVjdCBtdXRleCB1c2VyZGF0YV9tdXRleDsKKwlzdHJ1Y3QgbW1wZWcyX3VzZXJkYXRhX2luZm9fdCB1c2VyZGF0YV9pbmZvOworCXN0cnVjdCBtbXBlZzJfdXNlcmRhdGFfcmVjb3JkX3QgdWRfcmVjb3JkW01BWF9VRF9SRUNPUkRTXTsKKwlpbnQgY3VyX3VkX2lkeDsKKwl1OCAqdXNlcl9kYXRhX2J1ZmZlcjsKKwlpbnQgd2FpdF9mb3JfdWRyX3NlbmQ7CisJdTMyIHVjb2RlX2NjX2xhc3Rfd3A7CisJdTMyIG5vdGlmeV91Y29kZV9jY19sYXN0X3dwOworCXUzMiBub3RpZnlfZGF0YV9jY19sYXN0X3dwOworCXUzMiB1c2VyZGF0YV93cF9jdHg7CisjaWZkZWYgRFVNUF9VU0VSX0RBVEEKKyNkZWZpbmUgTUFYX1VTRVJfREFUQV9TSVpFCQkxNTcyODY0CisJdm9pZCAqdXNlcl9kYXRhX2R1bXBfYnVmOworCXVuc2lnbmVkIGNoYXIgKnBkdW1wX2J1Zl9jdXJfc3RhcnQ7CisJaW50IHRvdGFsX2xlbjsKKwlpbnQgYnNraXA7CisJaW50IG5fdXNlcmRhdGFfaWQ7CisJdTMyIHJlZmVyZW5jZVtNQVhfVURfUkVDT1JEU107CisjZW5kaWYKKwlpbnQgdHZwX2ZsYWc7CisJYm9vbCBpc191c2VkX3Y0bDsKKwl2b2lkICp2NGwyX2N0eDsKKwlib29sIHY0bF9wYXJhbXNfcGFyc2VkOworCXUzMiBidWZfbnVtOworCXUzMiBkeW5hbWljX2J1Zl9udW1fbWFyZ2luOworCXN0cnVjdCB2ZGVjX2luZm8gZ3ZzOworCXN0cnVjdCB2ZnJhbWVfcW9zX3MgdmZyYW1lX3FvczsKKwl1MzIgcmVzX2NoX2ZsYWc7CisJdTMyIGlfb25seTsKKwl1MzIga3BpX2ZpcnN0X2lfY29tbWluZzsKKwl1MzIga3BpX2ZpcnN0X2lfZGVjb2RlZDsKKwlpbnQgc2lkZWJpbmRfdHlwZTsKKwlpbnQgc2lkZWJpbmRfY2hhbm5lbF9pZDsKKwl1MzIgcHJvZmlsZV9pZGM7CisJdTMyIGxldmVsX2lkYzsKKwlpbnQgZGVjX2FnYWluX2NudDsKKwlpbnQgdmRlY19wZ19lbmFibGVfZmxhZzsKKwl1bG9uZyBmYl90b2tlbjsKKwljaGFyIHZkZWNfbmFtZVszMl07CisJY2hhciBwdHNfbmFtZVszMl07CisJY2hhciBuZXdfcV9uYW1lWzMyXTsKKwljaGFyIGRpc3BfcV9uYW1lWzMyXTsKKwlib29sIHJ1bl9mbGFnOworfTsKKworc3RhdGljIHZvaWQgdm1wZWcxMl9sb2NhbF9pbml0KHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodyk7CitzdGF0aWMgaW50IHZtcGVnMTJfaHdfY3R4X3Jlc3RvcmUoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3KTsKK3N0YXRpYyB2b2lkIHJlc2V0X3Byb2Nlc3NfdGltZShzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcpOworc3RhdGljIGludCB2bXBlZzEyX2NhbnZhc19pbml0KHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodyk7CitzdGF0aWMgdm9pZCBmbHVzaF9vdXRwdXQoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3KTsKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZtcGVnX3ZmX3BlZWsodm9pZCAqKTsKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZtcGVnX3ZmX2dldCh2b2lkICopOworc3RhdGljIHZvaWQgdm1wZWdfdmZfcHV0KHN0cnVjdCB2ZnJhbWVfcyAqLCB2b2lkICopOworc3RhdGljIGludCB2bXBlZ192Zl9zdGF0ZXMoc3RydWN0IHZmcmFtZV9zdGF0ZXMgKnN0YXRlcywgdm9pZCAqKTsKK3N0YXRpYyBpbnQgdm1wZWdfZXZlbnRfY2IoaW50IHR5cGUsIHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGVfZGF0YSk7CitzdGF0aWMgaW50IG5vdGlmeV92NGxfZW9zKHN0cnVjdCB2ZGVjX3MgKnZkZWMpOworc3RhdGljIHZvaWQgc3RhcnRfcHJvY2Vzc190aW1lX3NldChzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcpOworc3RhdGljIGludCBjaGVja19kaXJ0eV9kYXRhKHN0cnVjdCB2ZGVjX3MgKnZkZWMpOworc3RhdGljIGludCBkZWJ1Z19lbmFibGU7CisvKnN0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3QgdXNlcmRhdGFfcHVzaF93b3JrOyovCisjdW5kZWYgcHJfaW5mbworI2RlZmluZSBwcl9pbmZvIHByaW50awordW5zaWduZWQgaW50IG1wZWcxMl9kZWJ1Z19tYXNrID0gMHhmZjsKKy8qc3RhdGljIGludCBjb3VudGVyX21heCA9IDU7Ki8KK3N0YXRpYyB1MzIgcnVuX3JlYWR5X21pbl9idWZfbnVtID0gMjsKK3N0YXRpYyBpbnQgZGlydHlfYWdhaW5fdGhyZXNob2xkID0gMTAwOworc3RhdGljIGludCBlcnJvcl9wcm9jX3BvbGljeSA9IDB4MTsKKworI2RlZmluZSBQUklOVF9GTEFHX0VSUk9SICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgUFJJTlRfRkxBR19SVU5fRkxPVyAgICAgICAgICAgMFgwMDAxCisjZGVmaW5lIFBSSU5UX0ZMQUdfVElNRUlORk8gICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBQUklOVF9GTEFHX1VDT0RFX0RFVEFJTAkJICAweDAwMDQKKyNkZWZpbmUgUFJJTlRfRkxBR19WTERfREVUQUlMICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCAgICAgICAgIDB4MDAxMAorI2RlZmluZSBQUklOVF9GTEFHX0JVRkZFUl9ERVRBSUwgICAgICAweDAwMjAKKyNkZWZpbmUgUFJJTlRfRkxBR19SRVNUT1JFICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFBSSU5UX0ZSQU1FX05VTSAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBQUklOVF9GTEFHX0ZPUkNFX0RPTkUgICAgICAgICAweDAxMDAKKyNkZWZpbmUgUFJJTlRfRkxBR19DT1VOVEVSICAgICAgICAgICAgMFgwMjAwCisjZGVmaW5lIFBSSU5UX0ZSQU1FQkFTRV9EQVRBICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBQUklOVF9GTEFHX1ZERUNfU1RBVFVTICAgICAgICAweDA4MDAKKyNkZWZpbmUgUFJJTlRfRkxBR19QQVJBX0RBVEEgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFBSSU5UX0ZMQUdfVVNFUkRBVEFfREVUQUlMICAgIDB4MjAwMAorI2RlZmluZSBQUklOVF9GTEFHX1RJTUVPVVRfU1RBVFVTICAgICAweDQwMDAKKyNkZWZpbmUgUFJJTlRfRkxBR19WNExfREVUQUlMICAgICAgICAgMHg4MDAwCisjZGVmaW5lIElHTk9SRV9QQVJBTV9GUk9NX0NPTkZJRyAgICAgIDB4ODAwMDAwMAorCisKKworaW50IGRlYnVnX3ByaW50KGludCBpbmRleCwgaW50IGRlYnVnX2ZsYWcsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCWlmICgoKGRlYnVnX2VuYWJsZSAmIGRlYnVnX2ZsYWcpICYmCisJCSgoMSA8PCBpbmRleCkgJiBtcGVnMTJfZGVidWdfbWFzaykpCisJCXx8IChkZWJ1Z19mbGFnID09IFBSSU5UX0ZMQUdfRVJST1IpKSB7CisJCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IGt6YWxsb2MoNTEyLCBHRlBfQVRPTUlDKTsKKwkJaW50IGxlbiA9IDA7CisJCXZhX2xpc3QgYXJnczsKKworCQlpZiAoIWJ1ZikKKwkJCXJldHVybiAwOworCisJCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJCWxlbiA9IHNwcmludGYoYnVmLCAiJWQ6ICIsIGluZGV4KTsKKwkJdnNucHJpbnRmKGJ1ZiArIGxlbiwgNTEyLWxlbiwgZm10LCBhcmdzKTsKKwkJcHJfaW5mbygiJXMiLCBidWYpOworCQl2YV9lbmQoYXJncyk7CisJCWtmcmVlKGJ1Zik7CisJfQorCXJldHVybiAwOworfQorCisKKy8qc3RhdGljIGJvb2wgaXNfcmVzZXQ7Ki8KKyNkZWZpbmUgUFJPVklERVJfTkFNRSAgICJ2ZGVjLm1wZWcxMiIKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmZyYW1lX29wZXJhdGlvbnNfcyB2Zl9wcm92aWRlcl9vcHMgPSB7CisJLnBlZWsgPSB2bXBlZ192Zl9wZWVrLAorCS5nZXQgPSB2bXBlZ192Zl9nZXQsCisJLnB1dCA9IHZtcGVnX3ZmX3B1dCwKKwkuZXZlbnRfY2IgPSB2bXBlZ19ldmVudF9jYiwKKwkudmZfc3RhdGVzID0gdm1wZWdfdmZfc3RhdGVzLAorfTsKKworCitzdGF0aWMgY29uc3QgdTMyIGZyYW1lX3JhdGVfdGFiWzE2XSA9IHsKKwk5NjAwMCAvIDMwLCA5NjAwMDAwMCAvIDIzOTc2LCA5NjAwMCAvIDI0LCA5NjAwMCAvIDI1LAorCTk2MDAwMDAgLyAyOTk3LCA5NjAwMCAvIDMwLCA5NjAwMCAvIDUwLCA5NjAwMDAwIC8gNTk5NCwKKwk5NjAwMCAvIDYwLAorCS8qID4gOCByZXNlcnZlZCwgdXNlIDI0ICovCisJOTYwMDAgLyAyNCwgOTYwMDAgLyAyNCwgOTYwMDAgLyAyNCwgOTYwMDAgLyAyNCwKKwk5NjAwMCAvIDI0LCA5NjAwMCAvIDI0LCA5NjAwMCAvIDI0Cit9OworCitzdGF0aWMgaW50IHZtcGVnMTJfdjRsX2FsbG9jX2J1ZmZfY29uZmlnX2NhbnZhcyhzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcsIGludCBpKQoreworCWludCByZXQ7CisJdTMyIGNhbnZhczsKKwl1bG9uZyBkZWNidWZfc3RhcnQgPSAwLCBkZWNidWZfdXZfc3RhcnQgPSAwOworCWludCBkZWNidWZfeV9zaXplID0gMCwgZGVjYnVmX3V2X3NpemUgPSAwOworCXUzMiBjYW52YXNfd2lkdGggPSAwLCBjYW52YXNfaGVpZ2h0ID0gMDsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisJc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKmZiID0gTlVMTDsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KTsKKworCWlmIChody0+cGljc1tpXS52NGxfcmVmX2J1Zl9hZGRyKSB7CisJCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9CisJCQkoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKikKKwkJCWh3LT5waWNzW2ldLnY0bF9yZWZfYnVmX2FkZHI7CisKKwkJZmItPnN0YXR1cyA9IEZCX1NUX0RFQ09ERVI7CisJCXJldHVybiAwOworCX0KKworCXJldCA9IGN0eC0+ZmJfb3BzLmFsbG9jKCZjdHgtPmZiX29wcywgaHctPmZiX3Rva2VuLCAmZmIsIEFNTF9GQl9SRVFfREVDKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJIlslZF0gZ2V0IGZiIGZhaWwgJWQvJWQuXG4iLAorCQkJY3R4LT5pZCwgaSwgaHctPmJ1Zl9udW0pOworCQlyZXR1cm4gcmV0OworCX0KKworCWZiLT5zdGF0dXMJPSBGQl9TVF9ERUNPREVSOworCisJaWYgKCFody0+ZnJhbWVfd2lkdGggfHwgIWh3LT5mcmFtZV9oZWlnaHQpIHsKKwkJc3RydWN0IHZkZWNfcGljX2luZm8gcGljOworCQl2ZGVjX3Y0bF9nZXRfcGljX2luZm8oY3R4LCAmcGljKTsKKwkJaHctPmZyYW1lX3dpZHRoID0gcGljLnZpc2libGVfd2lkdGg7CisJCWh3LT5mcmFtZV9oZWlnaHQgPSBwaWMudmlzaWJsZV9oZWlnaHQ7CisJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkiWyVkXSBzZXQgJWQgeCAlZCBmcm9tIElGIGxheWVyXG4iLCBjdHgtPmlkLAorCQkJaHctPmZyYW1lX3dpZHRoLCBody0+ZnJhbWVfaGVpZ2h0KTsKKwl9CisKKwlody0+cGljc1tpXS52NGxfcmVmX2J1Zl9hZGRyID0gKHVsb25nKWZiOworCWlmIChmYi0+bnVtX3BsYW5lcyA9PSAxKSB7CisJCWRlY2J1Zl9zdGFydAk9IGZiLT5tLm1lbVswXS5hZGRyOworCQlkZWNidWZfeV9zaXplCT0gZmItPm0ubWVtWzBdLm9mZnNldDsKKwkJZGVjYnVmX3V2X3N0YXJ0CT0gZGVjYnVmX3N0YXJ0ICsgZGVjYnVmX3lfc2l6ZTsKKwkJZGVjYnVmX3V2X3NpemUJPSBkZWNidWZfeV9zaXplIC8gMjsKKwkJY2FudmFzX3dpZHRoCT0gQUxJR04oaHctPmZyYW1lX3dpZHRoLCA2NCk7CisJCWNhbnZhc19oZWlnaHQJPSBBTElHTihody0+ZnJhbWVfaGVpZ2h0LCAzMik7CisJCWZiLT5tLm1lbVswXS5ieXRlc191c2VkID0gZmItPm0ubWVtWzBdLnNpemU7CisJfSBlbHNlIGlmIChmYi0+bnVtX3BsYW5lcyA9PSAyKSB7CisJCWRlY2J1Zl9zdGFydAk9IGZiLT5tLm1lbVswXS5hZGRyOworCQlkZWNidWZfeV9zaXplCT0gZmItPm0ubWVtWzBdLnNpemU7CisJCWRlY2J1Zl91dl9zdGFydAk9IGZiLT5tLm1lbVsxXS5hZGRyOworCQlkZWNidWZfdXZfc2l6ZQk9IGZiLT5tLm1lbVsxXS5zaXplOworCQljYW52YXNfd2lkdGgJPSBBTElHTihody0+ZnJhbWVfd2lkdGgsIDY0KTsKKwkJY2FudmFzX2hlaWdodAk9IEFMSUdOKGh3LT5mcmFtZV9oZWlnaHQsIDMyKTsKKwkJZmItPm0ubWVtWzBdLmJ5dGVzX3VzZWQgPSBkZWNidWZfeV9zaXplOworCQlmYi0+bS5tZW1bMV0uYnl0ZXNfdXNlZCA9IGRlY2J1Zl91dl9zaXplOworCX0KKworCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsICJbJWRdICVzKCksIHY0bCByZWYgYnVmIGFkZHI6IDB4JXhcbiIsCisJCWN0eC0+aWQsIF9fZnVuY19fLCBmYik7CisKKwlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJdTMyIHRtcDsKKwkJaWYgKGNhbnZhc191KGh3LT5jYW52YXNfc3BlY1tpXSkgPT0gMHhmZikgeworCQkJdG1wID0gdmRlYy0+Z2V0X2NhbnZhc19leChDT1JFX01BU0tfVkRFQ18xLCB2ZGVjLT5pZCk7CisJCQlody0+Y2FudmFzX3NwZWNbaV0gJj0gfigweGZmZmYgPDwgOCk7CisJCQlody0+Y2FudmFzX3NwZWNbaV0gfD0gdG1wIDw8IDg7CisJCQlody0+Y2FudmFzX3NwZWNbaV0gfD0gdG1wIDw8IDE2OworCQl9CisJCWlmIChjYW52YXNfeShody0+Y2FudmFzX3NwZWNbaV0pID09IDB4ZmYpIHsKKwkJCXRtcCA9IHZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX1ZERUNfMSwgdmRlYy0+aWQpOworCQkJaHctPmNhbnZhc19zcGVjW2ldICY9IH4weGZmOworCQkJaHctPmNhbnZhc19zcGVjW2ldIHw9IHRtcDsKKwkJfQorCQljYW52YXMgPSBody0+Y2FudmFzX3NwZWNbaV07CisJfSBlbHNlIHsKKwkJY2FudmFzID0gdmRlYy0+Z2V0X2NhbnZhcyhpLCAyKTsKKwkJaHctPmNhbnZhc19zcGVjW2ldID0gY2FudmFzOworCX0KKworCWh3LT5jYW52YXNfY29uZmlnW2ldWzBdLnBoeV9hZGRyCT0gZGVjYnVmX3N0YXJ0OworCWh3LT5jYW52YXNfY29uZmlnW2ldWzBdLndpZHRoCQk9IGNhbnZhc193aWR0aDsKKwlody0+Y2FudmFzX2NvbmZpZ1tpXVswXS5oZWlnaHQJCT0gY2FudmFzX2hlaWdodDsKKwlody0+Y2FudmFzX2NvbmZpZ1tpXVswXS5ibG9ja19tb2RlCT0gaHctPmNhbnZhc19tb2RlOworCWh3LT5jYW52YXNfY29uZmlnW2ldWzBdLmVuZGlhbgkJPQorCQkoaHctPmNhbnZhc19tb2RlID09IENBTlZBU19CTEtNT0RFX0xJTkVBUikgPyA3IDogMDsKKwljb25maWdfY2F2X2x1dChjYW52YXNfeShjYW52YXMpLCAmaHctPmNhbnZhc19jb25maWdbaV1bMF0sIFZERUNfMSk7CisKKwkvKiBtcGVnMiBkZWNvZGVyIGNhbnZhcyBuZWVkIHRvIGJlIHJldmVydCB0byBtYXRjaCBkaXNwbGF5IGNhbnZhcyAqLworCWh3LT5jYW52YXNfY29uZmlnW2ldWzBdLmVuZGlhbiAgICAgICAgICA9CisJCShody0+Y2FudmFzX21vZGUgIT0gQ0FOVkFTX0JMS01PREVfTElORUFSKSA/IDcgOiAwOworCisJaHctPmNhbnZhc19jb25maWdbaV1bMV0ucGh5X2FkZHIJPSBkZWNidWZfdXZfc3RhcnQ7CisJaHctPmNhbnZhc19jb25maWdbaV1bMV0ud2lkdGgJCT0gY2FudmFzX3dpZHRoOworCWh3LT5jYW52YXNfY29uZmlnW2ldWzFdLmhlaWdodAkJPSBjYW52YXNfaGVpZ2h0IC8gMjsKKwlody0+Y2FudmFzX2NvbmZpZ1tpXVsxXS5ibG9ja19tb2RlCT0gaHctPmNhbnZhc19tb2RlOworCWh3LT5jYW52YXNfY29uZmlnW2ldWzFdLmVuZGlhbgkJPQorCQkoaHctPmNhbnZhc19tb2RlID09IENBTlZBU19CTEtNT0RFX0xJTkVBUikgPyA3IDogMDsKKwljb25maWdfY2F2X2x1dChjYW52YXNfdShjYW52YXMpLCAmaHctPmNhbnZhc19jb25maWdbaV1bMV0sIFZERUNfMSk7CisKKwkvKiBtcGVnMiBkZWNvZGVyIGNhbnZhcyBuZWVkIHRvIGJlIHJldmVydCB0byBtYXRjaCBkaXNwbGF5IGNhbnZhcyAqLworCWh3LT5jYW52YXNfY29uZmlnW2ldWzFdLmVuZGlhbiAgICAgICAgICA9CisJCShody0+Y2FudmFzX21vZGUgIT0gQ0FOVkFTX0JMS01PREVfTElORUFSKSA/IDcgOiAwOworCisJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19CVUZGRVJfREVUQUlMLAorCQkiWyVkXSAlcygpLCBjYW52YXM6IDB4JXggbW9kZTogJWQgeTogJXggdXY6ICV4IHc6ICVkIGg6ICVkXG4iLAorCQljdHgtPmlkLCBfX2Z1bmNfXywgY2FudmFzLCBody0+Y2FudmFzX21vZGUsCisJCWRlY2J1Zl9zdGFydCwgZGVjYnVmX3V2X3N0YXJ0LAorCQljYW52YXNfd2lkdGgsIGNhbnZhc19oZWlnaHQpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludCB2bXBlZzEyX2dldF9idWZfbnVtKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodykKK3sKKwl1bnNpZ25lZCBpbnQgYnVmX251bSA9IERFQ09ERV9CVUZGRVJfTlVNX0RFRjsKKworCWJ1Zl9udW0gKz0gaHctPmR5bmFtaWNfYnVmX251bV9tYXJnaW47CisKKwlpZiAoYnVmX251bSA+IERFQ09ERV9CVUZGRVJfTlVNX01BWCkKKwkJYnVmX251bSA9IERFQ09ERV9CVUZGRVJfTlVNX01BWDsKKworCXJldHVybiBidWZfbnVtOworfQorCitzdGF0aWMgYm9vbCBpc19lbm91Z2hfZnJlZV9idWZmZXIoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGh3LT5idWZfbnVtOyBpKyspIHsKKwkJaWYgKChody0+dmZidWZfdXNlW2ldID09IDApICYmIChody0+cmVmX3VzZVtpXSA9PSAwKSkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAoaSA9PSBody0+YnVmX251bSkgPyBmYWxzZSA6IHRydWU7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9mcmVlX2J1ZmZlcihzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaHctPmJ1Zl9udW07IGkrKykgeworCQlpZiAoKGh3LT52ZmJ1Zl91c2VbaV0gPT0gMCkgJiYKKwkJCShody0+cmVmX3VzZVtpXSA9PSAwKSkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IGh3LT5idWZfbnVtKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KTsKKwkJaWYgKGN0eC0+cGFyYW1fc2V0c19mcm9tX3Vjb2RlICYmICFody0+djRsX3BhcmFtc19wYXJzZWQpIHsKKwkJCS8qcnVuIHRvIHBhcnNlciBjc2QgZGF0YSovCisJCQlpID0gMDsKKwkJfSBlbHNlIHsKKwkJCWlmICghY3R4LT5mYl9vcHMucXVlcnkoJmN0eC0+ZmJfb3BzLCAmaHctPmZiX3Rva2VuKSkKKwkJCQlyZXR1cm4gLTE7CisKKwkJCWlmICh2bXBlZzEyX3Y0bF9hbGxvY19idWZmX2NvbmZpZ19jYW52YXMoaHcsIGkpKQorCQkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHUzMiBzcGVjX3RvX2luZGV4KHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodywgdTMyIHNwZWMpCit7CisJdTMyIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaHctPmJ1Zl9udW07IGkrKykgeworCQlpZiAoaHctPmNhbnZhc19zcGVjW2ldID09IHNwZWMpCisJCQlyZXR1cm4gaTsKKwl9CisKKwlyZXR1cm4gaHctPmJ1Zl9udW07Cit9CisKKy8qICtbU0VdW0JVRy0xNDUzNDNdW2h1YW5naGFuZ10gZml4ZWQ6bXBlZzIgZnJhbWUgcW9zIGluZm8gbm90aWZ5ICovCitzdGF0aWMgdm9pZCBmaWxsX2ZyYW1lX2luZm8oc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3LCB1MzIgc2xpY2VfdHlwZSwKKwkJCQkJCQlpbnQgZnJhbWVfc2l6ZSwgdTMyIHB0cykKK3sKKwl1bnNpZ25lZCBjaGFyIGFbM107CisJdW5zaWduZWQgY2hhciBpLCBqLCB0OworCXVuc2lnbmVkIGxvbmcgIGRhdGE7CisJc3RydWN0IHZmcmFtZV9xb3NfcyAqdmZyYW1lX3FvcyA9ICZody0+dmZyYW1lX3FvczsKKworCXZmcmFtZV9xb3MtPnR5cGUgPSAoKHNsaWNlX3R5cGUgJiBQSUNJTkZPX1RZUEVfTUFTSykgPT0KKwkJCQkJCVBJQ0lORk9fVFlQRV9JKSA/IDEgOgorCQkJCQkJKChzbGljZV90eXBlICYKKwkJCQkJCVBJQ0lORk9fVFlQRV9NQVNLKSA9PQorCQkJCQkJUElDSU5GT19UWVBFX1ApID8gMiA6IDM7CisJdmZyYW1lX3Fvcy0+c2l6ZSA9IGZyYW1lX3NpemU7CisJdmZyYW1lX3Fvcy0+cHRzID0gcHRzOworCisJZ2V0X3JhbmRvbV9ieXRlcygmZGF0YSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwlpZiAodmZyYW1lX3Fvcy0+dHlwZSA9PSAxKQorCQlkYXRhID0gMDsKKwlhWzBdID0gZGF0YSAmIDB4ZmY7CisJYVsxXSA9IChkYXRhID4+IDgpICYgMHhmZjsKKwlhWzJdID0gKGRhdGEgPj4gMTYpICYgMHhmZjsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJZm9yIChqID0gaSsxOyBqIDwgMzsgaisrKSB7CisJCQlpZiAoYVtqXSA8IGFbaV0pIHsKKwkJCQl0ID0gYVtqXTsKKwkJCQlhW2pdID0gYVtpXTsKKwkJCQlhW2ldID0gdDsKKwkJCX0gZWxzZSBpZiAoYVtqXSA9PSBhW2ldKSB7CisJCQkJYVtpXSsrOworCQkJCXQgPSBhW2pdOworCQkJCWFbal0gPSBhW2ldOworCQkJCWFbaV0gPSB0OworCQkJfQorCQl9CisJfQorCXZmcmFtZV9xb3MtPm1heF9tdiA9IGFbMl07CisJdmZyYW1lX3Fvcy0+YXZnX212ID0gYVsxXTsKKwl2ZnJhbWVfcW9zLT5taW5fbXYgPSBhWzBdOworCisJZ2V0X3JhbmRvbV9ieXRlcygmZGF0YSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwlhWzBdID0gZGF0YSAmIDB4MWY7CisJYVsxXSA9IChkYXRhID4+IDgpICYgMHgzZjsKKwlhWzJdID0gKGRhdGEgPj4gMTYpICYgMHg3ZjsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJZm9yIChqID0gaSsxOyBqIDwgMzsgaisrKSB7CisJCQlpZiAoYVtqXSA8IGFbaV0pIHsKKwkJCQl0ID0gYVtqXTsKKwkJCQlhW2pdID0gYVtpXTsKKwkJCQlhW2ldID0gdDsKKwkJCX0gZWxzZSBpZiAoYVtqXSA9PSBhW2ldKSB7CisJCQkJYVtpXSsrOworCQkJCXQgPSBhW2pdOworCQkJCWFbal0gPSBhW2ldOworCQkJCWFbaV0gPSB0OworCQkJfQorCQl9CisJfQorCXZmcmFtZV9xb3MtPm1heF9xcCA9IGFbMl07CisJdmZyYW1lX3Fvcy0+YXZnX3FwID0gYVsxXTsKKwl2ZnJhbWVfcW9zLT5taW5fcXAgPSBhWzBdOworCisJZ2V0X3JhbmRvbV9ieXRlcygmZGF0YSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwlhWzBdID0gZGF0YSAmIDB4MWY7CisJYVsxXSA9IChkYXRhID4+IDgpICYgMHgzZjsKKwlhWzJdID0gKGRhdGEgPj4gMTYpICYgMHg3ZjsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJZm9yIChqID0gaSArIDE7IGogPCAzOyBqKyspIHsKKwkJCWlmIChhW2pdIDwgYVtpXSkgeworCQkJCXQgPSBhW2pdOworCQkJCWFbal0gPSBhW2ldOworCQkJCWFbaV0gPSB0OworCQkJfSBlbHNlIGlmIChhW2pdID09IGFbaV0pIHsKKwkJCQlhW2ldKys7CisJCQkJdCA9IGFbal07CisJCQkJYVtqXSA9IGFbaV07CisJCQkJYVtpXSA9IHQ7CisJCQl9CisJCX0KKwl9CisJdmZyYW1lX3Fvcy0+bWF4X3NraXAgPSBhWzJdOworCXZmcmFtZV9xb3MtPmF2Z19za2lwID0gYVsxXTsKKwl2ZnJhbWVfcW9zLT5taW5fc2tpcCA9IGFbMF07CisKKwl2ZnJhbWVfcW9zLT5udW0rKzsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgc2V0X2ZyYW1lX2luZm8oc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3LCBzdHJ1Y3QgdmZyYW1lX3MgKnZmKQoreworCWludCBhciA9IDA7CisJdTMyIGJ1ZmZlcl9pbmRleCA9IHZmLT5pbmRleDsKKwl1bnNpZ25lZCBpbnQgbnVtID0gMDsKKwl1bnNpZ25lZCBpbnQgZGVuID0gMDsKKworCXZmLT53aWR0aCA9IGh3LT5waWNzW2J1ZmZlcl9pbmRleF0ud2lkdGg7CisJdmYtPmhlaWdodCA9IGh3LT5waWNzW2J1ZmZlcl9pbmRleF0uaGVpZ2h0OworCisJaWYgKGh3LT52bXBlZzEyX3JhdGlvNjQgIT0gMCkgeworCQludW0gPSBody0+dm1wZWcxMl9yYXRpbzY0Pj4zMjsKKwkJZGVuID0gaHctPnZtcGVnMTJfcmF0aW82NCAmIDB4ZmZmZmZmZmY7CisJfSBlbHNlIHsKKwkJbnVtID0gaHctPnZtcGVnMTJfcmF0aW8+PjE2OworCQlkZW4gPSBody0+dm1wZWcxMl9yYXRpbyAmIDB4ZmZmZjsKKworCX0KKworCWlmIChody0+ZnJhbWVfZHVyID4gMCkKKwkJdmYtPmR1cmF0aW9uID0gaHctPmZyYW1lX2R1cjsKKwllbHNlIHsKKwkJdmYtPmR1cmF0aW9uID0gaHctPmZyYW1lX2R1ciA9CisJCWZyYW1lX3JhdGVfdGFiWyhSRUFEX1ZSRUcoTVJFR19TRVFfSU5GTykgPj4gNCkgJiAweGZdOworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT5ub3RpZnlfd29yayk7CisJfQorLyoKKwlhcl9iaXRzID0gUkVBRF9WUkVHKE1SRUdfU0VRX0lORk8pICYgMHhmOworCisJaWYgKGFyX2JpdHMgPT0gMHgyKQorCQl2Zi0+cmF0aW9fY29udHJvbCA9IDB4YzAgPDwgRElTUF9SQVRJT19BU1BFQ1RfUkFUSU9fQklUOworCisJZWxzZSBpZiAoYXJfYml0cyA9PSAweDMpCisJCXZmLT5yYXRpb19jb250cm9sID0gMHg5MCA8PCBESVNQX1JBVElPX0FTUEVDVF9SQVRJT19CSVQ7CisKKwllbHNlIGlmIChhcl9iaXRzID09IDB4NCkKKwkJdmYtPnJhdGlvX2NvbnRyb2wgPSAweDc0IDw8IERJU1BfUkFUSU9fQVNQRUNUX1JBVElPX0JJVDsKKwllbHNlCisJCXZmLT5yYXRpb19jb250cm9sID0gMDsKKyovCisKKwlody0+cGl4ZWxfcmF0aW8gPSBSRUFEX1ZSRUcoTVJFR19TRVFfSU5GTykgJiAweGY7OworCisJaWYgKGh3LT52bXBlZzEyX3JhdGlvID09IDApIHsKKwkJLyogYWx3YXlzIHN0cmV0Y2ggdG8gMTY6OSAqLworCQl2Zi0+cmF0aW9fY29udHJvbCB8PSAoMHg5MCA8PAorCQkJCURJU1BfUkFUSU9fQVNQRUNUX1JBVElPX0JJVCk7CisJCXZmLT5zYXJfd2lkdGggPSAxOworCQl2Zi0+c2FyX2hlaWdodCA9IDE7CisJfSBlbHNlIHsKKwkJc3dpdGNoIChody0+cGl4ZWxfcmF0aW8pIHsKKwkJY2FzZSAxOgorCQkJdmYtPnNhcl93aWR0aCA9IDE7CisJCQl2Zi0+c2FyX2hlaWdodCA9IDE7CisJCQlhciA9ICh2Zi0+aGVpZ2h0ICogaHctPnZtcGVnMTJfcmF0aW8pIC8gdmYtPndpZHRoOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXZmLT5zYXJfd2lkdGggPSA0OworCQkJdmYtPnNhcl9oZWlnaHQgPSAzOworCQkJYXIgPSAodmYtPmhlaWdodCAqIDMgKiBody0+dm1wZWcxMl9yYXRpbykgLyAodmYtPndpZHRoICogNCk7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJdmYtPnNhcl93aWR0aCA9IDE2OworCQkJdmYtPnNhcl9oZWlnaHQgPSA5OworCQkJYXIgPSAodmYtPmhlaWdodCAqIDkgKiBody0+dm1wZWcxMl9yYXRpbykgLyAodmYtPndpZHRoICogMTYpOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCXZmLT5zYXJfd2lkdGggPSAyMjE7CisJCQl2Zi0+c2FyX2hlaWdodCA9IDEwMDsKKwkJCWFyID0gKHZmLT5oZWlnaHQgKiAxMDAgKiBody0+dm1wZWcxMl9yYXRpbykgLyAodmYtPndpZHRoICoKKwkJCQkJMjIxKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdmYtPnNhcl93aWR0aCA9IDE7CisJCQl2Zi0+c2FyX2hlaWdodCA9IDE7CisJCQlhciA9ICh2Zi0+aGVpZ2h0ICogaHctPnZtcGVnMTJfcmF0aW8pIC8gdmYtPndpZHRoOworCQkJYnJlYWs7CisJCX0KKwl9CisJYXIgPSBtaW4oYXIsIERJU1BfUkFUSU9fQVNQRUNUX1JBVElPX01BWCk7CisJdmYtPnJhdGlvX2NvbnRyb2wgPSAoYXIgPDwgRElTUF9SQVRJT19BU1BFQ1RfUkFUSU9fQklUKTsKKworCWh3LT5yYXRpb19jb250cm9sID0gdmYtPnJhdGlvX2NvbnRyb2w7CisKKwl2Zi0+Y2FudmFzMEFkZHIgPSB2Zi0+Y2FudmFzMUFkZHIgPSAtMTsKKwl2Zi0+cGxhbmVfbnVtID0gMjsKKworCXZmLT5jYW52YXMwX2NvbmZpZ1swXSA9IGh3LT5jYW52YXNfY29uZmlnW2J1ZmZlcl9pbmRleF1bMF07CisJdmYtPmNhbnZhczBfY29uZmlnWzFdID0gaHctPmNhbnZhc19jb25maWdbYnVmZmVyX2luZGV4XVsxXTsKKworCXZmLT5jYW52YXMxX2NvbmZpZ1swXSA9IGh3LT5jYW52YXNfY29uZmlnW2J1ZmZlcl9pbmRleF1bMF07CisJdmYtPmNhbnZhczFfY29uZmlnWzFdID0gaHctPmNhbnZhc19jb25maWdbYnVmZmVyX2luZGV4XVsxXTsKKworCXZmLT5zaWRlYmluZF90eXBlID0gaHctPnNpZGViaW5kX3R5cGU7CisJdmYtPnNpZGViaW5kX2NoYW5uZWxfaWQgPSBody0+c2lkZWJpbmRfY2hhbm5lbF9pZDsKKworCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfUEFSQV9EQVRBLAorCSJtcGVnMmRlYzogdyglZCksIGgoJWQpLCBkdXIoJWQpLCBkdXItRVMoJWQpXG4iLAorCQlody0+ZnJhbWVfd2lkdGgsIGh3LT5mcmFtZV9oZWlnaHQsIGh3LT5mcmFtZV9kdXIsCisJCWZyYW1lX3JhdGVfdGFiWyhSRUFEX1ZSRUcoTVJFR19TRVFfSU5GTykgPj4gNCkgJiAweGZdKTsKK30KKworc3RhdGljIGJvb2wgZXJyb3Jfc2tpcChzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcsCisJdTMyIGluZm8sIHN0cnVjdCB2ZnJhbWVfcyAqdmYpCit7CisJaWYgKGh3LT5lcnJvcl9mcmFtZV9za2lwX2xldmVsKSB7CisJCS8qIHNraXAgZXJyb3IgZnJhbWUgKi8KKwkJaWYgKChpbmZvICYgUElDSU5GT19FUlJPUikgfHwgKGh3LT5mcmFtZV9mb3JjZV9za2lwX2ZsYWcpKSB7CisJCQlpZiAoKGluZm8gJiBQSUNJTkZPX0VSUk9SKSA9PSAwKSB7CisJCQkJaWYgKChpbmZvICYgUElDSU5GT19UWVBFX01BU0spID09CisJCQkJCVBJQ0lORk9fVFlQRV9JKQorCQkJCQlody0+ZnJhbWVfZm9yY2Vfc2tpcF9mbGFnID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGh3LT5lcnJvcl9mcmFtZV9za2lwX2xldmVsID49IDIpCisJCQkJCWh3LT5mcmFtZV9mb3JjZV9za2lwX2ZsYWcgPSAxOworCQkJfQorCQkJaWYgKChpbmZvICYgUElDSU5GT19FUlJPUikKKwkJCXx8IChody0+ZnJhbWVfZm9yY2Vfc2tpcF9mbGFnKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2bXBlZzEyX3NhdmVfaHdfY29udGV4dChzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcsIHUzMiByZWcpCit7CisJaWYgKHJlZyA9PSAzKSB7CisJCWh3LT5jdHhfdmFsaWQgPSAwOworCQkvL3ByX2luZm8oIiVzLCBody0+dXNlcmRhdGFfd3BfY3R4ICVkXG4iLCBfX2Z1bmNfXywgaHctPnVzZXJkYXRhX3dwX2N0eCk7CisJfSBlbHNlIHsKKwkJaHctPnNlcWluZm8gPSBSRUFEX1ZSRUcoTVJFR19TRVFfSU5GTyk7CisJCWh3LT5yZWdfcGljX3dpZHRoID0gUkVBRF9WUkVHKE1SRUdfUElDX1dJRFRIKTsKKwkJaHctPnJlZ19waWNfaGVpZ2h0ID0gUkVBRF9WUkVHKE1SRUdfUElDX0hFSUdIVCk7CisJCWh3LT5yZWdfbXBlZzFfMl9yZWcgPSBSRUFEX1ZSRUcoTVBFRzFfMl9SRUcpOworCQlody0+cmVnX3BpY19oZWFkX2luZm8gPSBSRUFEX1ZSRUcoUElDX0hFQURfSU5GTyk7CisJCWh3LT5yZWdfZl9jb2RlX3JlZyA9IFJFQURfVlJFRyhGX0NPREVfUkVHKTsKKwkJaHctPnJlZ19zbGljZV92ZXJfcG9zX3BpY190eXBlID0gUkVBRF9WUkVHKFNMSUNFX1ZFUl9QT1NfUElDX1RZUEUpOworCQlody0+cmVnX3Zjb3BfY3RybF9yZWcgPSBSRUFEX1ZSRUcoVkNPUF9DVFJMX1JFRyk7CisJCWh3LT5yZWdfbWJfaW5mbyA9IFJFQURfVlJFRyhNQl9JTkZPKTsKKwkJaHctPnJlZ19zaWduYWxfdHlwZSA9IFJFQURfVlJFRyhBVl9TQ1JBVENIX0gpOworCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1BBUkFfREFUQSwKKwkJCSJzaWduYWxfdHlwZSA9ICV4IiwgaHctPnJlZ19zaWduYWxfdHlwZSk7CisJCWh3LT5jdHhfdmFsaWQgPSAxOworCX0KK30KKworc3RhdGljIHZvaWQgdm1tcGVnMl9yZXNldF91ZHJfbWdyKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodykKK3sKKwlody0+d2FpdF9mb3JfdWRyX3NlbmQgPSAwOworCWh3LT5jdXJfdWRfaWR4ID0gMDsKKwltZW1zZXQoJmh3LT51ZF9yZWNvcmQsIDAsIHNpemVvZihody0+dWRfcmVjb3JkKSk7Cit9CisKK3N0YXRpYyB2b2lkIHZtbXBlZzJfY3JhdGVfdXNlcmRhdGFfbWFuYWdlcigKKwkJCQkJCXN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodywKKwkJCQkJCXU4ICp1c2VyZGF0YV9idWYsCisJCQkJCQlpbnQgYnVmX2xlbikKK3sKKwlpZiAoaHcpIHsKKwkJbXV0ZXhfaW5pdCgmaHctPnVzZXJkYXRhX211dGV4KTsKKworCQltZW1zZXQoJmh3LT51c2VyZGF0YV9pbmZvLCAwLAorCQkJc2l6ZW9mKHN0cnVjdCBtbXBlZzJfdXNlcmRhdGFfaW5mb190KSk7CisJCWh3LT51c2VyZGF0YV9pbmZvLmRhdGFfYnVmID0gdXNlcmRhdGFfYnVmOworCQlody0+dXNlcmRhdGFfaW5mby5idWZfbGVuID0gYnVmX2xlbjsKKwkJaHctPnVzZXJkYXRhX2luZm8uZGF0YV9idWZfZW5kID0gdXNlcmRhdGFfYnVmICsgYnVmX2xlbjsKKwkJaHctPnVzZXJkYXRhX3dwX2N0eCA9IDA7CisKKwkJdm1tcGVnMl9yZXNldF91ZHJfbWdyKGh3KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHZtbXBlZzJfZGVzdHJveV91c2VyZGF0YV9tYW5hZ2VyKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodykKK3sKKwlpZiAoaHcpCisJCW1lbXNldCgmaHctPnVzZXJkYXRhX2luZm8sCisJCQkJMCwKKwkJCQlzaXplb2Yoc3RydWN0IG1tcGVnMl91c2VyZGF0YV9pbmZvX3QpKTsKK30KKworc3RhdGljIHZvaWQgYW1sX3N3YXBfZGF0YSh1aW50OF90ICp1c2VyX2RhdGEsIGludCB1ZF9zaXplKQoreworCWludCBzd2FwX2Jsb2NrcywgaSwgaiwgaywgbTsKKwl1bnNpZ25lZCBjaGFyIGNfdGVtcDsKKworCS8qIHN3YXAgYnl0ZSBvcmRlciAqLworCXN3YXBfYmxvY2tzID0gdWRfc2l6ZSAvIDg7CisJZm9yIChpID0gMDsgaSA8IHN3YXBfYmxvY2tzOyBpKyspIHsKKwkJaiA9IGkgKiA4OworCQlrID0gaiArIDc7CisJCWZvciAobSA9IDA7IG0gPCA0OyBtKyspIHsKKwkJCWNfdGVtcCA9IHVzZXJfZGF0YVtqXTsKKwkJCXVzZXJfZGF0YVtqKytdID0gdXNlcl9kYXRhW2tdOworCQkJdXNlcl9kYXRhW2stLV0gPSBjX3RlbXA7CisJCX0KKwl9Cit9CisKKyNpZmRlZiBEVU1QX1VTRVJfREFUQQorc3RhdGljIHZvaWQgcHVzaF90b19idWYoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3LAorCXU4ICpwZGF0YSwKKwlpbnQgbGVuLAorCXN0cnVjdCB1c2VyZGF0YV9tZXRhX2luZm9fdCAqcG1ldGEsCisJdTMyIHJlZmVyZW5jZSkKK3sKKwl1MzIgKnBMZW47CisJaW50IGluZm9fY250OworCXU4ICpwYnVmX2VuZDsKKworCWlmICghaHctPnVzZXJfZGF0YV9kdW1wX2J1ZikKKwkJcmV0dXJuOworCisJaWYgKGh3LT5ic2tpcCkgeworCQlwcl9pbmZvKCJvdmVyIHNpemUsIHNraXBcbiIpOworCQlyZXR1cm47CisJfQorCWluZm9fY250ID0gMDsKKwlwTGVuID0gKHUzMiAqKWh3LT5wZHVtcF9idWZfY3VyX3N0YXJ0OworCisJKnBMZW4gPSBsZW47CisJaHctPnBkdW1wX2J1Zl9jdXJfc3RhcnQgKz0gc2l6ZW9mKHUzMik7CisJaW5mb19jbnQrKzsKKwlwTGVuKys7CisKKwkqcExlbiA9IHBtZXRhLT5kdXJhdGlvbjsKKwlody0+cGR1bXBfYnVmX2N1cl9zdGFydCArPSBzaXplb2YodTMyKTsKKwlpbmZvX2NudCsrOworCXBMZW4rKzsKKworCSpwTGVuID0gcG1ldGEtPmZsYWdzOworCWh3LT5wZHVtcF9idWZfY3VyX3N0YXJ0ICs9IHNpemVvZih1MzIpOworCWluZm9fY250Kys7CisJcExlbisrOworCisJKnBMZW4gPSBwbWV0YS0+dnB0czsKKwlody0+cGR1bXBfYnVmX2N1cl9zdGFydCArPSBzaXplb2YodTMyKTsKKwlpbmZvX2NudCsrOworCXBMZW4rKzsKKworCSpwTGVuID0gcG1ldGEtPnZwdHNfdmFsaWQ7CisJaHctPnBkdW1wX2J1Zl9jdXJfc3RhcnQgKz0gc2l6ZW9mKHUzMik7CisJaW5mb19jbnQrKzsKKwlwTGVuKys7CisKKworCSpwTGVuID0gaHctPm5fdXNlcmRhdGFfaWQ7CisJaHctPnBkdW1wX2J1Zl9jdXJfc3RhcnQgKz0gc2l6ZW9mKHUzMik7CisJaW5mb19jbnQrKzsKKwlwTGVuKys7CisKKwkqcExlbiA9IHJlZmVyZW5jZTsKKwlody0+cGR1bXBfYnVmX2N1cl9zdGFydCArPSBzaXplb2YodTMyKTsKKwlpbmZvX2NudCsrOworCXBMZW4rKzsKKworCXBidWZfZW5kID0gaHctPnVzZXJkYXRhX2luZm8uZGF0YV9idWZfZW5kOworCWlmIChwZGF0YSArIGxlbiA+IHBidWZfZW5kKSB7CisJCWludCBmaXJzdF9zZWN0aW9uX2xlbjsKKworCQlmaXJzdF9zZWN0aW9uX2xlbiA9IHBidWZfZW5kIC0gcGRhdGE7CisJCW1lbWNweShody0+cGR1bXBfYnVmX2N1cl9zdGFydCwgcGRhdGEsIGZpcnN0X3NlY3Rpb25fbGVuKTsKKwkJcGRhdGEgPSAodTggKilody0+dXNlcmRhdGFfaW5mby5kYXRhX2J1ZjsKKwkJaHctPnBkdW1wX2J1Zl9jdXJfc3RhcnQgKz0gZmlyc3Rfc2VjdGlvbl9sZW47CisJCW1lbWNweShody0+cGR1bXBfYnVmX2N1cl9zdGFydCwgcGRhdGEsIGxlbiAtIGZpcnN0X3NlY3Rpb25fbGVuKTsKKwkJaHctPnBkdW1wX2J1Zl9jdXJfc3RhcnQgKz0gbGVuIC0gZmlyc3Rfc2VjdGlvbl9sZW47CisJfSBlbHNlIHsKKwkJbWVtY3B5KGh3LT5wZHVtcF9idWZfY3VyX3N0YXJ0LCBwZGF0YSwgbGVuKTsKKwkJaHctPnBkdW1wX2J1Zl9jdXJfc3RhcnQgKz0gbGVuOworCX0KKworCWh3LT50b3RhbF9sZW4gKz0gbGVuICsgaW5mb19jbnQgKiBzaXplb2YodTMyKTsKKwlpZiAoaHctPnRvdGFsX2xlbiA+PSBNQVhfVVNFUl9EQVRBX1NJWkUtNDA5NikKKwkJaHctPmJza2lwID0gMTsKK30KKworc3RhdGljIHZvaWQgZHVtcF91c2VyZGF0YV9pbmZvKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodywKKwl2b2lkICpwdXNlcl9kYXRhLAorCWludCBsZW4sCisJc3RydWN0IHVzZXJkYXRhX21ldGFfaW5mb190ICpwbWV0YSwKKwl1MzIgcmVmZXJlbmNlKQoreworCXU4ICpwc3RhcnQ7CisKKwlwc3RhcnQgPSAodTggKilwdXNlcl9kYXRhOworCisjaWZkZWYJRFVNUF9IRUFEX0lORk9fREFUQQorCXB1c2hfdG9fYnVmKGh3LCBwc3RhcnQsIGxlbiwgcG1ldGEsIHJlZmVyZW5jZSk7CisjZWxzZQorCXB1c2hfdG9fYnVmKGh3LCBwc3RhcnQrOCwgbGVuIC0gOCwgcG1ldGEsIHJlZmVyZW5jZSk7CisjZW5kaWYKK30KKworCitzdGF0aWMgdm9pZCBwcmludF9kYXRhKHVuc2lnbmVkIGNoYXIgKnBkYXRhLAorCQkJCQkJaW50IGxlbiwKKwkJCQkJCXVuc2lnbmVkIGludCBmbGFnLAorCQkJCQkJdW5zaWduZWQgaW50IGR1cmF0aW9uLAorCQkJCQkJdW5zaWduZWQgaW50IHZwdHMsCisJCQkJCQl1bnNpZ25lZCBpbnQgdnB0c192YWxpZCwKKwkJCQkJCWludCByZWNfaWQsCisJCQkJCQl1MzIgcmVmZXJlbmNlKQoreworCWludCBuTGVmdDsKKworCW5MZWZ0ID0gbGVuOworCisJcHJfaW5mbygiJWQgbGVuOiVkLCBmbGFnOjB4JXgsIGR1cjolZCwgdnB0czoweCV4LCB2YWxpZDolZCwgcmVmZXI6JWRcbiIsCisJCQkJcmVjX2lkLAlsZW4sIGZsYWcsCisJCQkJZHVyYXRpb24sIHZwdHMsIHZwdHNfdmFsaWQsCisJCQkJcmVmZXJlbmNlKTsKKwl3aGlsZSAobkxlZnQgPj0gMTYpIHsKKwkJcHJfaW5mbygiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCXBkYXRhWzBdLCBwZGF0YVsxXSwgcGRhdGFbMl0sIHBkYXRhWzNdLAorCQkJcGRhdGFbNF0sIHBkYXRhWzVdLCBwZGF0YVs2XSwgcGRhdGFbN10sCisJCQlwZGF0YVs4XSwgcGRhdGFbOV0sIHBkYXRhWzEwXSwgcGRhdGFbMTFdLAorCQkJcGRhdGFbMTJdLCBwZGF0YVsxM10sIHBkYXRhWzE0XSwgcGRhdGFbMTVdKTsKKwkJbkxlZnQgLT0gMTY7CisJCXBkYXRhICs9IDE2OworCX0KKworCisJd2hpbGUgKG5MZWZ0ID4gMCkgeworCQlwcl9pbmZvKCIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQlwZGF0YVswXSwgcGRhdGFbMV0sIHBkYXRhWzJdLCBwZGF0YVszXSwKKwkJCXBkYXRhWzRdLCBwZGF0YVs1XSwgcGRhdGFbNl0sIHBkYXRhWzddKTsKKwkJbkxlZnQgLT0gODsKKwkJcGRhdGEgKz0gODsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfZGF0YSh1OCAqcGRhdGEsCisJCQkJCQl1bnNpZ25lZCBpbnQgdXNlcl9kYXRhX2xlbmd0aCwKKwkJCQkJCXVuc2lnbmVkIGludCBmbGFnLAorCQkJCQkJdW5zaWduZWQgaW50IGR1cmF0aW9uLAorCQkJCQkJdW5zaWduZWQgaW50IHZwdHMsCisJCQkJCQl1bnNpZ25lZCBpbnQgdnB0c192YWxpZCwKKwkJCQkJCWludCByZWNfaWQsCisJCQkJCQl1MzIgcmVmZXJlbmNlKQoreworCXVuc2lnbmVkIGNoYXIgc3pCdWZbMjU2XTsKKworCisJbWVtc2V0KHN6QnVmLCAwLCAyNTYpOworCW1lbWNweShzekJ1ZiwgcGRhdGEsIHVzZXJfZGF0YV9sZW5ndGgpOworCisJYW1sX3N3YXBfZGF0YShzekJ1ZiwgdXNlcl9kYXRhX2xlbmd0aCk7CisKKwlwcmludF9kYXRhKHN6QnVmLAorCQkJCXVzZXJfZGF0YV9sZW5ndGgsCisJCQkJZmxhZywKKwkJCQlkdXJhdGlvbiwKKwkJCQl2cHRzLAorCQkJCXZwdHNfdmFsaWQsCisJCQkJcmVjX2lkLAorCQkJCXJlZmVyZW5jZSk7Cit9CisKKworc3RhdGljIHZvaWQgc2hvd191c2VyX2RhdGFfYnVmKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodykKK3sKKwl1OCAqcGJ1ZjsKKwlpbnQgbGVuOworCXVuc2lnbmVkIGludCBmbGFnOworCXVuc2lnbmVkIGludCBkdXJhdGlvbjsKKwl1bnNpZ25lZCBpbnQgdnB0czsKKwl1bnNpZ25lZCBpbnQgdnB0c192YWxpZDsKKwlpbnQgcmVjX2lkOworCXUzMiByZWZlcmVuY2U7CisKKwlwcl9pbmZvKCJzaG93IHVzZXIgZGF0YSBidWZcbiIpOworCXBidWYgPSBody0+dXNlcl9kYXRhX2R1bXBfYnVmOworCisJd2hpbGUgKHBidWYgPCBody0+cGR1bXBfYnVmX2N1cl9zdGFydCkgeworCQl1MzIgKnBMZW47CisKKwkJcExlbiA9ICh1MzIgKilwYnVmOworCisJCWxlbiA9ICpwTGVuOworCQlwTGVuKys7CisJCXBidWYgKz0gc2l6ZW9mKHUzMik7CisKKwkJZHVyYXRpb24gPSAqcExlbjsKKwkJcExlbisrOworCQlwYnVmICs9IHNpemVvZih1MzIpOworCisJCWZsYWcgPSAqcExlbjsKKwkJcExlbisrOworCQlwYnVmICs9IHNpemVvZih1MzIpOworCisJCXZwdHMgPSAqcExlbjsKKwkJcExlbisrOworCQlwYnVmICs9IHNpemVvZih1MzIpOworCisJCXZwdHNfdmFsaWQgPSAqcExlbjsKKwkJcExlbisrOworCQlwYnVmICs9IHNpemVvZih1MzIpOworCisJCXJlY19pZCA9ICpwTGVuOworCQlwTGVuKys7CisJCXBidWYgKz0gc2l6ZW9mKHUzMik7CisKKwkJcmVmZXJlbmNlID0gKnBMZW47CisJCXBMZW4rKzsKKwkJcGJ1ZiArPSBzaXplb2YodTMyKTsKKworCisJCWR1bXBfZGF0YShwYnVmLCBsZW4sIGZsYWcsIGR1cmF0aW9uLAorCQkJdnB0cywgdnB0c192YWxpZCwgcmVjX2lkLCByZWZlcmVuY2UpOworCQlwYnVmICs9IGxlbjsKKwkJbXNsZWVwKDMwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYW12ZGVjX21tcGVnMTJfaW5pdF91c2VyZGF0YV9kdW1wKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodykKK3sKKwlody0+dXNlcl9kYXRhX2R1bXBfYnVmID0ga21hbGxvYyhNQVhfVVNFUl9EQVRBX1NJWkUsIEdGUF9LRVJORUwpOworCWlmIChody0+dXNlcl9kYXRhX2R1bXBfYnVmKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhbXZkZWNfbW1wZWcxMl91bmluaXRfdXNlcmRhdGFfZHVtcChzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcpCit7CisJaWYgKGh3LT51c2VyX2RhdGFfZHVtcF9idWYpIHsKKwkJc2hvd191c2VyX2RhdGFfYnVmKGh3KTsKKwkJa2ZyZWUoaHctPnVzZXJfZGF0YV9kdW1wX2J1Zik7CisJCWh3LT51c2VyX2RhdGFfZHVtcF9idWYgPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgcmVzZXRfdXNlcl9kYXRhX2J1ZihzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcpCit7CisJaHctPnRvdGFsX2xlbiA9IDA7CisJaHctPnBkdW1wX2J1Zl9jdXJfc3RhcnQgPSBody0+dXNlcl9kYXRhX2R1bXBfYnVmOworCWh3LT5ic2tpcCA9IDA7CisJaHctPm5fdXNlcmRhdGFfaWQgPSAwOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHVzZXJfZGF0YV9yZWFkeV9ub3RpZnkoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3LAorCXUzMiBwdHMsIHUzMiBwdHNfdmFsaWQpCit7CisJc3RydWN0IG1tcGVnMl91c2VyZGF0YV9yZWNvcmRfdCAqcF91c2VyZGF0YV9yZWM7CisJaW50IGk7CisKKwlpZiAoaHctPndhaXRfZm9yX3Vkcl9zZW5kKSB7CisJCWZvciAoaSA9IDA7IGkgPCBody0+Y3VyX3VkX2lkeDsgaSsrKSB7CisJCQltdXRleF9sb2NrKCZody0+dXNlcmRhdGFfbXV0ZXgpOworCisKKwkJCXBfdXNlcmRhdGFfcmVjID0gaHctPnVzZXJkYXRhX2luZm8ucmVjb3JkcworCQkJCSsgaHctPnVzZXJkYXRhX2luZm8ud3JpdGVfaW5kZXg7CisKKwkJCWh3LT51ZF9yZWNvcmRbaV0ubWV0YV9pbmZvLnZwdHNfdmFsaWQgPSBwdHNfdmFsaWQ7CisJCQlody0+dWRfcmVjb3JkW2ldLm1ldGFfaW5mby52cHRzID0gcHRzOworCisJCQkqcF91c2VyZGF0YV9yZWMgPSBody0+dWRfcmVjb3JkW2ldOworI2lmZGVmIERVTVBfVVNFUl9EQVRBCisJCQlkdW1wX3VzZXJkYXRhX2luZm8oaHcsCisJCQkJaHctPnVzZXJkYXRhX2luZm8uZGF0YV9idWYgKyBwX3VzZXJkYXRhX3JlYy0+cmVjX3N0YXJ0LAorCQkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfbGVuLAorCQkJCSZwX3VzZXJkYXRhX3JlYy0+bWV0YV9pbmZvLAorCQkJCWh3LT5yZWZlcmVuY2VbaV0pOworCQkJaHctPm5fdXNlcmRhdGFfaWQrKzsKKyNlbmRpZgorLyoKKwkJCXByX2luZm8oIm5vdGlmeTogcmVjX3N0YXJ0OiVkLCByZWNfbGVuOiVkLCB3aTolZCwgcmVmZXJlbmNlOiVkXG4iLAorCQkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfc3RhcnQsCisJCQkJcF91c2VyZGF0YV9yZWMtPnJlY19sZW4sCisJCQkJaHctPnVzZXJkYXRhX2luZm8ud3JpdGVfaW5kZXgsCisJCQkJaHctPnJlZmVyZW5jZVtpXSk7CisqLworCQkJaHctPnVzZXJkYXRhX2luZm8ud3JpdGVfaW5kZXgrKzsKKwkJCWlmIChody0+dXNlcmRhdGFfaW5mby53cml0ZV9pbmRleCA+PSBVU0VSREFUQV9GSUZPX05VTSkKKwkJCQlody0+dXNlcmRhdGFfaW5mby53cml0ZV9pbmRleCA9IDA7CisKKwkJCW11dGV4X3VubG9jaygmaHctPnVzZXJkYXRhX211dGV4KTsKKworCisJCQl2ZGVjX3dha2V1cF91c2VyZGF0YV9wb2xsKGh3X3RvX3ZkZWMoaHcpKTsKKwkJfQorCQlody0+d2FpdF9mb3JfdWRyX3NlbmQgPSAwOworCQlody0+Y3VyX3VkX2lkeCA9IDA7CisJfQorCWh3LT5ub3RpZnlfdWNvZGVfY2NfbGFzdF93cCA9IGh3LT51Y29kZV9jY19sYXN0X3dwOworCWh3LT5ub3RpZnlfZGF0YV9jY19sYXN0X3dwID0gaHctPnVzZXJkYXRhX2luZm8ubGFzdF93cDsKK30KKworc3RhdGljIGludCB2bW1wZWcyX3VzZXJfZGF0YV9yZWFkKHN0cnVjdCB2ZGVjX3MgKnZkZWMsCisJc3RydWN0IHVzZXJkYXRhX3BhcmFtX3QgKnB1c2VyZGF0YV9wYXJhKQoreworCXN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodyA9IE5VTEw7CisJaW50IHJlY19yaSwgcmVjX3dpOworCWludCByZWNfbGVuOworCXU4ICpyZWNfZGF0YV9zdGFydDsKKwl1OCAqcGRlc3RfYnVmOworCXN0cnVjdCBtbXBlZzJfdXNlcmRhdGFfcmVjb3JkX3QgKnBfdXNlcmRhdGFfcmVjOworCXUzMiBkYXRhX3NpemU7CisJdTMyIHJlczsKKwlpbnQgY29weV9vayA9IDE7CisKKwlodyA9IChzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisKKwlwZGVzdF9idWYgPSBwdXNlcmRhdGFfcGFyYS0+cGJ1Zl9hZGRyOworCisJbXV0ZXhfbG9jaygmaHctPnVzZXJkYXRhX211dGV4KTsKKworLyoKKwlwcl9pbmZvKCJyaSA9ICVkLCB3aSA9ICVkXG4iLAorCQlody0+dXNlcmRhdGFfaW5mby5yZWFkX2luZGV4LAorCQlody0+dXNlcmRhdGFfaW5mby53cml0ZV9pbmRleCk7CisqLworCXJlY19yaSA9IGh3LT51c2VyZGF0YV9pbmZvLnJlYWRfaW5kZXg7CisJcmVjX3dpID0gaHctPnVzZXJkYXRhX2luZm8ud3JpdGVfaW5kZXg7CisKKwlpZiAocmVjX3JpID09IHJlY193aSkgeworCQltdXRleF91bmxvY2soJmh3LT51c2VyZGF0YV9tdXRleCk7CisJCXJldHVybiAwOworCX0KKworCXBfdXNlcmRhdGFfcmVjID0gaHctPnVzZXJkYXRhX2luZm8ucmVjb3JkcyArIHJlY19yaTsKKworCXJlY19sZW4gPSBwX3VzZXJkYXRhX3JlYy0+cmVjX2xlbjsKKwlyZWNfZGF0YV9zdGFydCA9IHBfdXNlcmRhdGFfcmVjLT5yZWNfc3RhcnQgKyBody0+dXNlcmRhdGFfaW5mby5kYXRhX2J1ZjsKKy8qCisJcHJfaW5mbygicmk6JWQsIHdpOiVkLCByZWNfbGVuOiVkLCByZWNfc3RhcnQ6JWQsIGJ1Zl9sZW46JWRcbiIsCisJCXJlY19yaSwgcmVjX3dpLAorCQlwX3VzZXJkYXRhX3JlYy0+cmVjX2xlbiwKKwkJcF91c2VyZGF0YV9yZWMtPnJlY19zdGFydCwKKwkJcHVzZXJkYXRhX3BhcmEtPmJ1Zl9sZW4pOworKi8KKwlpZiAocmVjX2xlbiA8PSBwdXNlcmRhdGFfcGFyYS0+YnVmX2xlbikgeworCQkvKiBkdmIgdXNlciBkYXRhIGJ1ZmZlciBpcyBlbm91Z2h0IHRvCisJCWNvcHkgdGhlIHdob2xlIHJlY29yZWQuICovCisJCWRhdGFfc2l6ZSA9IHJlY19sZW47CisJCWlmIChyZWNfZGF0YV9zdGFydCArIGRhdGFfc2l6ZQorCQkJPiBody0+dXNlcmRhdGFfaW5mby5kYXRhX2J1Zl9lbmQpIHsKKwkJCWludCBmaXJzdF9zZWN0aW9uX2xlbjsKKworCQkJZmlyc3Rfc2VjdGlvbl9sZW4gPSBody0+dXNlcmRhdGFfaW5mby5idWZfbGVuIC0KKwkJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX3N0YXJ0OworCQkJcmVzID0gKHUzMiljb3B5X3RvX3VzZXIoKHZvaWQgKilwZGVzdF9idWYsCisJCQkJCQkJKHZvaWQgKilyZWNfZGF0YV9zdGFydCwKKwkJCQkJCQlmaXJzdF9zZWN0aW9uX2xlbik7CisJCQlpZiAocmVzKSB7CisJCQkJcHJfaW5mbygicDEgcmVhZCBub3QgZW5kIHJlcz0lZCwgcmVxdWVzdD0lZFxuIiwKKwkJCQkJcmVzLCBmaXJzdF9zZWN0aW9uX2xlbik7CisJCQkJY29weV9vayA9IDA7CisKKwkJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX2xlbiAtPQorCQkJCQlmaXJzdF9zZWN0aW9uX2xlbiAtIHJlczsKKwkJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX3N0YXJ0ICs9CisJCQkJCWZpcnN0X3NlY3Rpb25fbGVuIC0gcmVzOworCQkJCXB1c2VyZGF0YV9wYXJhLT5kYXRhX3NpemUgPQorCQkJCQlmaXJzdF9zZWN0aW9uX2xlbiAtIHJlczsKKwkJCX0gZWxzZSB7CisJCQkJcmVzID0gKHUzMiljb3B5X3RvX3VzZXIoCisJCQkJCSh2b2lkICopKHBkZXN0X2J1ZitmaXJzdF9zZWN0aW9uX2xlbiksCisJCQkJCSh2b2lkICopaHctPnVzZXJkYXRhX2luZm8uZGF0YV9idWYsCisJCQkJCWRhdGFfc2l6ZSAtIGZpcnN0X3NlY3Rpb25fbGVuKTsKKwkJCQlpZiAocmVzKSB7CisJCQkJCXByX2luZm8oInAyIHJlYWQgbm90IGVuZCByZXM9JWQsIHJlcXVlc3Q9JWRcbiIsCisJCQkJCQlyZXMsIGRhdGFfc2l6ZSk7CisJCQkJCWNvcHlfb2sgPSAwOworCQkJCX0KKwkJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX2xlbiAtPQorCQkJCQlkYXRhX3NpemUgLSByZXM7CisJCQkJcF91c2VyZGF0YV9yZWMtPnJlY19zdGFydCA9CisJCQkJCWRhdGFfc2l6ZSAtIGZpcnN0X3NlY3Rpb25fbGVuIC0gcmVzOworCQkJCXB1c2VyZGF0YV9wYXJhLT5kYXRhX3NpemUgPQorCQkJCQlkYXRhX3NpemUgLSByZXM7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXMgPSAodTMyKWNvcHlfdG9fdXNlcigodm9pZCAqKXBkZXN0X2J1ZiwKKwkJCQkJCQkodm9pZCAqKXJlY19kYXRhX3N0YXJ0LAorCQkJCQkJCWRhdGFfc2l6ZSk7CisJCQlpZiAocmVzKSB7CisJCQkJcHJfaW5mbygicDMgcmVhZCBub3QgZW5kIHJlcz0lZCwgcmVxdWVzdD0lZFxuIiwKKwkJCQkJcmVzLCBkYXRhX3NpemUpOworCQkJCWNvcHlfb2sgPSAwOworCQkJfQorCQkJcF91c2VyZGF0YV9yZWMtPnJlY19sZW4gLT0gZGF0YV9zaXplIC0gcmVzOworCQkJcF91c2VyZGF0YV9yZWMtPnJlY19zdGFydCArPSBkYXRhX3NpemUgLSByZXM7CisJCQlwdXNlcmRhdGFfcGFyYS0+ZGF0YV9zaXplID0gZGF0YV9zaXplIC0gcmVzOworCQl9CisKKwkJaWYgKGNvcHlfb2spIHsKKwkJCWh3LT51c2VyZGF0YV9pbmZvLnJlYWRfaW5kZXgrKzsKKwkJCWlmIChody0+dXNlcmRhdGFfaW5mby5yZWFkX2luZGV4ID49IFVTRVJEQVRBX0ZJRk9fTlVNKQorCQkJCWh3LT51c2VyZGF0YV9pbmZvLnJlYWRfaW5kZXggPSAwOworCQl9CisJfSBlbHNlIHsKKwkJLyogZHZiIHVzZXIgZGF0YSBidWZmZXIgaXMgbm90IGVub3VnaHQKKwkJdG8gY29weSB0aGUgd2hvbGUgcmVjb3JlZC4gKi8KKwkJZGF0YV9zaXplID0gcHVzZXJkYXRhX3BhcmEtPmJ1Zl9sZW47CisJCWlmIChyZWNfZGF0YV9zdGFydCArIGRhdGFfc2l6ZQorCQkJPiBody0+dXNlcmRhdGFfaW5mby5kYXRhX2J1Zl9lbmQpIHsKKwkJCWludCBmaXJzdF9zZWN0aW9uX2xlbjsKKworCQkJZmlyc3Rfc2VjdGlvbl9sZW4gPSBody0+dXNlcmRhdGFfaW5mby5idWZfbGVuIC0KKwkJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX3N0YXJ0OworCQkJcmVzID0gKHUzMiljb3B5X3RvX3VzZXIoKHZvaWQgKilwZGVzdF9idWYsCisJCQkJCQkodm9pZCAqKXJlY19kYXRhX3N0YXJ0LAorCQkJCQkJZmlyc3Rfc2VjdGlvbl9sZW4pOworCQkJaWYgKHJlcykgeworCQkJCXByX2luZm8oInA0IHJlYWQgbm90IGVuZCByZXM9JWQsIHJlcXVlc3Q9JWRcbiIsCisJCQkJCXJlcywgZmlyc3Rfc2VjdGlvbl9sZW4pOworCQkJCWNvcHlfb2sgPSAwOworCQkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfbGVuIC09CisJCQkJCWZpcnN0X3NlY3Rpb25fbGVuIC0gcmVzOworCQkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfc3RhcnQgKz0KKwkJCQkJZmlyc3Rfc2VjdGlvbl9sZW4gLSByZXM7CisJCQkJcHVzZXJkYXRhX3BhcmEtPmRhdGFfc2l6ZSA9CisJCQkJCWZpcnN0X3NlY3Rpb25fbGVuIC0gcmVzOworCQkJfSBlbHNlIHsKKwkJCQkvKiBmaXJzdCBzZWN0b24gY29weSBpcyBvayovCisJCQkJcmVzID0gKHUzMiljb3B5X3RvX3VzZXIoCisJCQkJCSh2b2lkICopKHBkZXN0X2J1ZitmaXJzdF9zZWN0aW9uX2xlbiksCisJCQkJCSh2b2lkICopaHctPnVzZXJkYXRhX2luZm8uZGF0YV9idWYsCisJCQkJCWRhdGFfc2l6ZSAtIGZpcnN0X3NlY3Rpb25fbGVuKTsKKwkJCQlpZiAocmVzKSB7CisJCQkJCXByX2luZm8oInA1IHJlYWQgbm90IGVuZCByZXM9JWQsIHJlcXVlc3Q9JWRcbiIsCisJCQkJCQlyZXMsCisJCQkJCQlkYXRhX3NpemUgLSBmaXJzdF9zZWN0aW9uX2xlbik7CisJCQkJCWNvcHlfb2sgPSAwOworCQkJCX0KKworCQkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfbGVuIC09CisJCQkJCWRhdGFfc2l6ZSAtIHJlczsKKwkJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX3N0YXJ0ID0KKwkJCQkJZGF0YV9zaXplIC0gZmlyc3Rfc2VjdGlvbl9sZW4gLSByZXM7CisJCQkJcHVzZXJkYXRhX3BhcmEtPmRhdGFfc2l6ZSA9CisJCQkJCWRhdGFfc2l6ZSAtIHJlczsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJlcyA9ICh1MzIpY29weV90b191c2VyKCh2b2lkICopcGRlc3RfYnVmLAorCQkJCQkJCSh2b2lkICopcmVjX2RhdGFfc3RhcnQsCisJCQkJCQkJZGF0YV9zaXplKTsKKwkJCWlmIChyZXMpIHsKKwkJCQlwcl9pbmZvKCJwNiByZWFkIG5vdCBlbmQgcmVzPSVkLCByZXF1ZXN0PSVkXG4iLAorCQkJCQlyZXMsIGRhdGFfc2l6ZSk7CisJCQkJY29weV9vayA9IDA7CisJCQl9CisKKwkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfbGVuIC09IGRhdGFfc2l6ZSAtIHJlczsKKwkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfc3RhcnQgKz0gZGF0YV9zaXplIC0gcmVzOworCQkJcHVzZXJkYXRhX3BhcmEtPmRhdGFfc2l6ZSA9IGRhdGFfc2l6ZSAtIHJlczsKKwkJfQorCisJCWlmIChjb3B5X29rKSB7CisJCQlody0+dXNlcmRhdGFfaW5mby5yZWFkX2luZGV4Kys7CisJCQlpZiAoaHctPnVzZXJkYXRhX2luZm8ucmVhZF9pbmRleCA+PSBVU0VSREFUQV9GSUZPX05VTSkKKwkJCQlody0+dXNlcmRhdGFfaW5mby5yZWFkX2luZGV4ID0gMDsKKwkJfQorCisJfQorCXB1c2VyZGF0YV9wYXJhLT5tZXRhX2luZm8gPSBwX3VzZXJkYXRhX3JlYy0+bWV0YV9pbmZvOworCisJaWYgKGh3LT51c2VyZGF0YV9pbmZvLnJlYWRfaW5kZXggPD0gaHctPnVzZXJkYXRhX2luZm8ud3JpdGVfaW5kZXgpCisJCXB1c2VyZGF0YV9wYXJhLT5tZXRhX2luZm8ucmVjb3Jkc19pbl9xdWUgPQorCQkJaHctPnVzZXJkYXRhX2luZm8ud3JpdGVfaW5kZXggLQorCQkJaHctPnVzZXJkYXRhX2luZm8ucmVhZF9pbmRleDsKKwllbHNlCisJCXB1c2VyZGF0YV9wYXJhLT5tZXRhX2luZm8ucmVjb3Jkc19pbl9xdWUgPQorCQkJaHctPnVzZXJkYXRhX2luZm8ud3JpdGVfaW5kZXggKworCQkJVVNFUkRBVEFfRklGT19OVU0gLQorCQkJaHctPnVzZXJkYXRhX2luZm8ucmVhZF9pbmRleDsKKworCXB1c2VyZGF0YV9wYXJhLT52ZXJzaW9uID0gKDA8PDI0fDA8PDE2fDA8PDh8MSk7CisKKwltdXRleF91bmxvY2soJmh3LT51c2VyZGF0YV9tdXRleCk7CisKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCB2bW1wZWcyX3Jlc2V0X3VzZXJkYXRhX2ZpZm8oc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGJJbml0KQoreworCXN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodyA9IE5VTEw7CisKKwlodyA9IChzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisKKwlpZiAoaHcpIHsKKwkJbXV0ZXhfbG9jaygmaHctPnVzZXJkYXRhX211dGV4KTsKKwkJcHJfaW5mbygibXBlZzJfcmVzZXRfdXNlcmRhdGFfZmlmbzogYkluaXQ6ICVkLCByaTogJWQsIHdpOiAlZFxuIiwKKwkJCWJJbml0LAorCQkJaHctPnVzZXJkYXRhX2luZm8ucmVhZF9pbmRleCwKKwkJCWh3LT51c2VyZGF0YV9pbmZvLndyaXRlX2luZGV4KTsKKwkJaHctPnVzZXJkYXRhX2luZm8ucmVhZF9pbmRleCA9IDA7CisJCWh3LT51c2VyZGF0YV9pbmZvLndyaXRlX2luZGV4ID0gMDsKKworCQlpZiAoYkluaXQpCisJCQlody0+dXNlcmRhdGFfaW5mby5sYXN0X3dwID0gMDsKKwkJbXV0ZXhfdW5sb2NrKCZody0+dXNlcmRhdGFfbXV0ZXgpOworCX0KK30KKworc3RhdGljIHZvaWQgdm1tcGVnMl93YWtldXBfdXNlcmRhdGFfcG9sbChzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCWFtc3RyZWFtX3dha2V1cF91c2VyZGF0YV9wb2xsKHZkZWMpOworfQorCisvKgorI2RlZmluZSBQUklOVF9IRUFEX0lORk8KKyovCitzdGF0aWMgdm9pZCB1c2VyZGF0YV9wdXNoX2RvX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXUzMiByZWc7CisJdTggKnBkYXRhOworCXU4ICpwc3JjX2RhdGE7CisJdTggaGVhZF9pbmZvWzhdOworCXN0cnVjdCB1c2VyZGF0YV9tZXRhX2luZm9fdCBtZXRhX2luZm87CisJdTMyIHdwOworCXUzMiBpbmRleDsKKwl1MzIgcGljdHVyZV9zdHJ1Y3Q7CisJdTMyIHJlZmVyZW5jZTsKKwl1MzIgcGljdHVyZV90eXBlOworCXUzMiB0ZW1wOworCXUzMiBkYXRhX2xlbmd0aDsKKwl1MzIgZGF0YV9zdGFydDsKKwlpbnQgaTsKKwl1MzIgb2Zmc2V0OworCXUzMiBjdXJfd3A7CisjaWZkZWYgUFJJTlRfSEVBRF9JTkZPCisJdTggKnB0eXBlX3N0cjsKKyNlbmRpZgorCXN0cnVjdCBtbXBlZzJfdXNlcmRhdGFfcmVjb3JkX3QgKnBjdXJfdWRfcmVjOworCisJc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3ID0gY29udGFpbmVyX29mKHdvcmssCisJCQkJCXN0cnVjdCB2ZGVjX21wZWcxMl9od19zLCB1c2VyZGF0YV9wdXNoX3dvcmspOworCisJbWVtc2V0KCZtZXRhX2luZm8sIDAsIHNpemVvZihtZXRhX2luZm8pKTsKKworCW1ldGFfaW5mby5kdXJhdGlvbiA9IGh3LT5mcmFtZV9kdXI7CisKKworCXJlZyA9IFJFQURfVlJFRyhBVl9TQ1JBVENIX0opOworCWh3LT51c2VyZGF0YV93cF9jdHggPSByZWcgJiAofigxPDwxNikpOworCW1ldGFfaW5mby5mbGFncyA9ICgocmVnID4+IDMwKSA8PCAxKTsKKwltZXRhX2luZm8uZmxhZ3MgfD0gKFZGT1JNQVRfTVBFRzEyIDw8IDMpOworCS8qIGNoZWNrICB0b3BfZmllbGRfZmlyc3QgZmxhZyAqLworCWlmICgocmVnID4+IDI4KSAmIDB4MSkgeworCQltZXRhX2luZm8uZmxhZ3MgfD0gKDEgPDwgMTApOworCQltZXRhX2luZm8uZmxhZ3MgfD0gKCgocmVnID4+IDI5KSAmIDB4MSkgPDwgMTEpOworCX0KKworCWN1cl93cCA9IHJlZyAmIDB4N2ZmZjsKKwlpZiAoY3VyX3dwID09IGh3LT51Y29kZV9jY19sYXN0X3dwIHx8IChjdXJfd3AgPj0gQVVYX0JVRl9BTElHTihDQ0JVRl9TSVpFKSkpIHsKKwkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSJOdWxsIG9yIE92ZXIgc2l6ZSB1c2VyIGRhdGEgcGFja2FnZTogd3AgPSAlZFxuIiwgY3VyX3dwKTsKKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0osIDApOworCQlyZXR1cm47CisJfQorCisJaWYgKGh3LT5jdXJfdWRfaWR4ID49IE1BWF9VRF9SRUNPUkRTKSB7CisJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCwKKwkJCSJVRCBSZWNvcmRzIG92ZXI6ICVkLCBza2lwIGl0XG4iLCBNQVhfVURfUkVDT1JEUyk7CisJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9KLCAwKTsKKwkJaHctPmN1cl91ZF9pZHggPSAwOworCQlyZXR1cm47CisJfQorCisJaWYgKGN1cl93cCA8IGh3LT51Y29kZV9jY19sYXN0X3dwKQorCQlody0+dWNvZGVfY2NfbGFzdF93cCA9IDA7CisKKwlvZmZzZXQgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9JKTsKKworCWNvZGVjX21tX2RtYV9mbHVzaCgKKwkJaHctPmNjYnVmX3BoeUFkZHJlc3NfdmlydCwKKwkJQ0NCVUZfU0laRSwKKwkJRE1BX0ZST01fREVWSUNFKTsKKworCW11dGV4X2xvY2soJmh3LT51c2VyZGF0YV9tdXRleCk7CisJaWYgKGh3LT5jY2J1Zl9waHlBZGRyZXNzX3ZpcnQpIHsKKwkJcGRhdGEgPSAodTggKilody0+Y2NidWZfcGh5QWRkcmVzc192aXJ0ICsgaHctPnVjb2RlX2NjX2xhc3Rfd3A7CisJCW1lbWNweShoZWFkX2luZm8sIHBkYXRhLCA4KTsKKwl9IGVsc2UKKwkJbWVtc2V0KGhlYWRfaW5mbywgMCwgOCk7CisJbXV0ZXhfdW5sb2NrKCZody0+dXNlcmRhdGFfbXV0ZXgpOworCWFtbF9zd2FwX2RhdGEoaGVhZF9pbmZvLCA4KTsKKworCXdwID0gKGhlYWRfaW5mb1swXSA8PCA4IHwgaGVhZF9pbmZvWzFdKTsKKwlpbmRleCA9IChoZWFkX2luZm9bMl0gPDwgOCB8IGhlYWRfaW5mb1szXSk7CisKKwlwaWN0dXJlX3N0cnVjdCA9IChoZWFkX2luZm9bNl0gPDwgOCB8IGhlYWRfaW5mb1s3XSk7CisJdGVtcCA9IChoZWFkX2luZm9bNF0gPDwgOCB8IGhlYWRfaW5mb1s1XSk7CisJcmVmZXJlbmNlID0gdGVtcCAmIDB4M0ZGOworCXBpY3R1cmVfdHlwZSA9ICh0ZW1wID4+IDEwKSAmIDB4NzsKKworCWlmIChkZWJ1Z19lbmFibGUgJiBQUklOVF9GTEFHX1VTRVJEQVRBX0RFVEFJTCkKKwkJcHJfaW5mbygiaW5kZXg6JWQsIHdwOiVkLCByZWY6JWQsIHR5cGU6JWQsIHN0cnVjdDoweCV4LCB1X2xhc3Rfd3A6MHgleFxuIiwKKwkJCWluZGV4LCB3cCwgcmVmZXJlbmNlLAorCQkJcGljdHVyZV90eXBlLCBwaWN0dXJlX3N0cnVjdCwKKwkJCWh3LT51Y29kZV9jY19sYXN0X3dwKTsKKworCXN3aXRjaCAocGljdHVyZV90eXBlKSB7CisJY2FzZSAxOgorCQkJLyogcHJfaW5mbygiSSB0eXBlLCBwb3M6JWRcbiIsCisJCQkJCShtZXRhX2luZm8uZmxhZ3M+PjEpJjB4Myk7ICovCisJCQltZXRhX2luZm8uZmxhZ3MgfD0gKDE8PDcpOworI2lmZGVmIFBSSU5UX0hFQURfSU5GTworCQkJcHR5cGVfc3RyID0gIiBJIjsKKyNlbmRpZgorCQkJYnJlYWs7CisJY2FzZSAyOgorCQkJLyogcHJfaW5mbygiUCB0eXBlLCBwb3M6JWRcbiIsCisJCQkJCShtZXRhX2luZm8uZmxhZ3M+PjEpJjB4Myk7ICovCisJCQltZXRhX2luZm8uZmxhZ3MgfD0gKDI8PDcpOworI2lmZGVmIFBSSU5UX0hFQURfSU5GTworCQkJcHR5cGVfc3RyID0gIiBQIjsKKyNlbmRpZgorCQkJYnJlYWs7CisJY2FzZSAzOgorCQkJLyogcHJfaW5mbygiQiB0eXBlLCBwb3M6JWRcbiIsCisJCQkJCShtZXRhX2luZm8uZmxhZ3M+PjEpJjB4Myk7ICovCisJCQltZXRhX2luZm8uZmxhZ3MgfD0gKDM8PDcpOworI2lmZGVmIFBSSU5UX0hFQURfSU5GTworCQkJcHR5cGVfc3RyID0gIiBCIjsKKyNlbmRpZgorCQkJYnJlYWs7CisJY2FzZSA0OgorCQkJLyogcHJfaW5mbygiRCB0eXBlLCBwb3M6JWRcbiIsCisJCQkJCShtZXRhX2luZm8uZmxhZ3M+PjEpJjB4Myk7ICovCisJCQltZXRhX2luZm8uZmxhZ3MgfD0gKDQ8PDcpOworI2lmZGVmIFBSSU5UX0hFQURfSU5GTworCQkJcHR5cGVfc3RyID0gIiBEIjsKKyNlbmRpZgorCQkJYnJlYWs7CisJZGVmYXVsdDoKKwkJCS8qIHByX2luZm8oIlVua25vd24gdHlwZToweCV4LCBwb3M6JWRcbiIsCisJCQkJCXBoZWFkZXItPnBpY3R1cmVfY29kaW5nX3R5cGUsCisJCQkJCShtZXRhX2luZm8uZmxhZ3M+PjEpJjB4Myk7ICovCisjaWZkZWYgUFJJTlRfSEVBRF9JTkZPCisJCQlwdHlwZV9zdHIgPSAiIFUiOworI2VuZGlmCisJCQlicmVhazsKKwl9CisjaWZkZWYgUFJJTlRfSEVBRF9JTkZPCisJcHJfaW5mbygicmVmOiVkLCB0eXBlOiVzLCBleHQ6JWQsIGZpcnN0OiVkLCBkYXRhX2xlbmd0aDolZFxuIiwKKwkJcmVmZXJlbmNlLCBwdHlwZV9zdHIsCisJCShyZWcgPj4gMzApLAorCQkocmVnID4+IDI4KSYweDMsCisJCXJlZyAmIDB4ZmZmZik7CisjZW5kaWYKKwlkYXRhX2xlbmd0aCA9IGN1cl93cCAtIGh3LT51Y29kZV9jY19sYXN0X3dwOworCWRhdGFfc3RhcnQgPSByZWcgJiAweGZmZmY7CisJcHNyY19kYXRhID0gKHU4ICopaHctPmNjYnVmX3BoeUFkZHJlc3NfdmlydCArIGh3LT51Y29kZV9jY19sYXN0X3dwOworCisJcGRhdGEgPSBody0+dXNlcmRhdGFfaW5mby5kYXRhX2J1ZiArIGh3LT51c2VyZGF0YV9pbmZvLmxhc3Rfd3A7CisJZm9yIChpID0gMDsgaSA8IGRhdGFfbGVuZ3RoICYmIGh3LT5jY2J1Zl9waHlBZGRyZXNzX3ZpcnQgIT0gTlVMTCAmJiBwc3JjX2RhdGE7IGkrKykgeworCQkqcGRhdGErKyA9ICpwc3JjX2RhdGErKzsKKwkJaWYgKHBkYXRhID49IGh3LT51c2VyZGF0YV9pbmZvLmRhdGFfYnVmX2VuZCkKKwkJCXBkYXRhID0gaHctPnVzZXJkYXRhX2luZm8uZGF0YV9idWY7CisJfQorCisJcGN1cl91ZF9yZWMgPSBody0+dWRfcmVjb3JkICsgaHctPmN1cl91ZF9pZHg7CisKKwlwY3VyX3VkX3JlYy0+bWV0YV9pbmZvID0gbWV0YV9pbmZvOworCXBjdXJfdWRfcmVjLT5yZWNfc3RhcnQgPSBody0+dXNlcmRhdGFfaW5mby5sYXN0X3dwOworCXBjdXJfdWRfcmVjLT5yZWNfbGVuID0gZGF0YV9sZW5ndGg7CisKKwlody0+dXNlcmRhdGFfaW5mby5sYXN0X3dwICs9IGRhdGFfbGVuZ3RoOworCWlmIChody0+dXNlcmRhdGFfaW5mby5sYXN0X3dwID49IFVTRVJfREFUQV9TSVpFKQorCQlody0+dXNlcmRhdGFfaW5mby5sYXN0X3dwICU9IFVTRVJfREFUQV9TSVpFOworCisJaHctPndhaXRfZm9yX3Vkcl9zZW5kID0gMTsKKworCWh3LT51Y29kZV9jY19sYXN0X3dwID0gY3VyX3dwOworCisJaWYgKGRlYnVnX2VuYWJsZSAmIFBSSU5UX0ZMQUdfVVNFUkRBVEFfREVUQUlMKQorCQlwcl9pbmZvKCJjdXJfd3A6JWQsIHJlY19zdGFydDolZCwgcmVjX2xlbjolZFxuIiwKKwkJCWN1cl93cCwKKwkJCXBjdXJfdWRfcmVjLT5yZWNfc3RhcnQsCisJCQlwY3VyX3VkX3JlYy0+cmVjX2xlbik7CisKKyNpZmRlZiBEVU1QX1VTRVJfREFUQQorCWh3LT5yZWZlcmVuY2VbaHctPmN1cl91ZF9pZHhdID0gcmVmZXJlbmNlOworI2VuZGlmCisKKwlody0+Y3VyX3VkX2lkeCsrOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9KLCAwKTsKK30KKworCit2b2lkIHVzZXJkYXRhX3B1c2hlZF9kcm9wKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodykKK3sKKwlody0+dXNlcmRhdGFfaW5mby5sYXN0X3dwID0gaHctPm5vdGlmeV9kYXRhX2NjX2xhc3Rfd3A7CisJaHctPnVjb2RlX2NjX2xhc3Rfd3AgPSBody0+bm90aWZ5X3Vjb2RlX2NjX2xhc3Rfd3A7CisJaHctPmN1cl91ZF9pZHggPSAwOworCWh3LT53YWl0X2Zvcl91ZHJfc2VuZCA9IDA7CisKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgaHdfdXBkYXRlX2d2cyhzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcpCit7CisJaWYgKGh3LT5ndnMuZnJhbWVfaGVpZ2h0ICE9IGh3LT5mcmFtZV9oZWlnaHQpIHsKKwkJaHctPmd2cy5mcmFtZV93aWR0aCA9IGh3LT5mcmFtZV93aWR0aDsKKwkJaHctPmd2cy5mcmFtZV9oZWlnaHQgPSBody0+ZnJhbWVfaGVpZ2h0OworCX0KKwlpZiAoaHctPmd2cy5mcmFtZV9kdXIgIT0gaHctPmZyYW1lX2R1cikgeworCQlody0+Z3ZzLmZyYW1lX2R1ciA9IGh3LT5mcmFtZV9kdXI7CisJCWlmIChody0+ZnJhbWVfZHVyICE9IDApCisJCQlody0+Z3ZzLmZyYW1lX3JhdGUgPSAoKDk2MDAwICogMTAgLyBody0+ZnJhbWVfZHVyKSAlIDEwKSA8IDUgPworCQkJCQk5NjAwMCAvIGh3LT5mcmFtZV9kdXIgOiAoOTYwMDAgLyBody0+ZnJhbWVfZHVyICsxKTsKKwkJZWxzZQorCQkJaHctPmd2cy5mcmFtZV9yYXRlID0gLTE7CisJfQorCWlmIChody0+Z3ZzLnJhdGlvX2NvbnRyb2wgIT0gaHctPnJhdGlvX2NvbnRyb2wpCisJCWh3LT5ndnMucmF0aW9fY29udHJvbCA9IGh3LT5yYXRpb19jb250cm9sOworCisJaHctPmd2cy5zdGF0dXMgPSBody0+c3RhdDsKKwlody0+Z3ZzLmVycm9yX2NvdW50ID0gaHctPmd2cy5lcnJvcl9mcmFtZV9jb3VudDsKKwlody0+Z3ZzLmRyb3BfZnJhbWVfY291bnQgPSBody0+ZHJvcF9mcmFtZV9jb3VudDsKKworfQorCitzdGF0aWMgaW50IHByZXBhcmVfZGlzcGxheV9idWYoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3LAorCXN0cnVjdCBwaWNfaW5mb190ICpwaWMpCit7CisJdTMyIGZpZWxkX251bSA9IDAsIGk7CisJdTMyIGZpcnN0X2ZpZWxkX3R5cGUgPSAwLCB0eXBlID0gMDsKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmID0gTlVMTDsKKwl1MzIgaW5kZXggPSBwaWMtPmluZGV4OworCXUzMiBpbmZvID0gcGljLT5idWZmZXJfaW5mbzsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICogdjRsMl9jdHggPSBody0+djRsMl9jdHg7CisJc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKmZiID0gTlVMTDsKKwl1bG9uZyBudl9vcmRlciA9IFZJRFRZUEVfVklVX05WMjE7CisJYm9vbCBwYl9za2lwID0gZmFsc2U7CisKKwkvKiBzd2FwIHV2ICovCisJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQlpZiAoKHY0bDJfY3R4LT5jYXBfcGl4X2ZtdCA9PSBWNEwyX1BJWF9GTVRfTlYxMikgfHwKKwkJCSh2NGwyX2N0eC0+Y2FwX3BpeF9mbXQgPT0gVjRMMl9QSVhfRk1UX05WMTJNKSkKKwkJCW52X29yZGVyID0gVklEVFlQRV9WSVVfTlYxMjsKKwl9CisKKyNpZmRlZiBOVjIxCisJdHlwZSA9IG52X29yZGVyOworI2VuZGlmCisJaWYgKGh3LT5pX29ubHkpIHsKKwkJcGJfc2tpcCA9IDE7CisJfQorCisJdXNlcl9kYXRhX3JlYWR5X25vdGlmeShodywgcGljLT5wdHMsIHBpYy0+cHRzX3ZhbGlkKTsKKworCWlmIChody0+ZnJhbWVfcHJvZyAmIFBJQ0lORk9fUFJPRykgeworCQlmaWVsZF9udW0gPSAxOworCQl0eXBlIHw9IFZJRFRZUEVfUFJPR1JFU1NJVkUgfCBWSURUWVBFX1ZJVV9GSUVMRCB8IG52X29yZGVyOworCX0gZWxzZSB7CisjaWZkZWYgSU5URVJMQUNFX1NFUV9BTFdBWVMKKwkJLyogb25jZSBhbiBpbnRlcmxhY2Ugc2VxLCBmb3JjZSBpbnRlcmxhY2UsIHRvIG1ha2UgZGkgZWFzeS4gKi8KKwkJaHctPmRlY19jb250cm9sIHw9IERFQ19DT05UUk9MX0ZMQUdfRk9SQ0VfU0VRX0lOVEVSTEFDRTsKKyNlbmRpZgorCQlody0+ZnJhbWVfcnB0X3N0YXRlID0gRlJBTUVfUkVQRUFUX05PTkU7CisKKwkJZmlyc3RfZmllbGRfdHlwZSA9IChpbmZvICYgUElDSU5GT19UT1BfRklSU1QpID8KKwkJCVZJRFRZUEVfSU5URVJMQUNFX1RPUCA6IFZJRFRZUEVfSU5URVJMQUNFX0JPVFRPTTsKKwkJZmllbGRfbnVtID0gKGluZm8gJiBQSUNJTkZPX1JQVF9GSVJTVCkgPyAzIDogMjsKKwl9CisKKwlpZiAoKGh3LT5pc191c2VkX3Y0bCkgJiYKKwkJKHZkZWMtPnByb2dfb25seSkpCisJCWZpZWxkX251bSA9IDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgZmllbGRfbnVtOyBpKyspIHsKKwkJaWYgKGtmaWZvX2dldCgmaHctPm5ld2ZyYW1lX3EsICZ2ZikgPT0gMCkgeworCQkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19FUlJPUiwKKwkJCQkiZmF0YWwgZXJyb3IsIG5vIGF2YWlsYWJsZSBidWZmZXIgc2xvdC4iKTsKKwkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9FUlJPUjsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQkJdmYtPnY0bF9tZW1faGFuZGxlCisJCQkJPSBody0+cGljc1tpbmRleF0udjRsX3JlZl9idWZfYWRkcjsKKwkJCWZiID0gKHN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICopdmYtPnY0bF9tZW1faGFuZGxlOworCQkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WNExfREVUQUlMLAorCQkJCSJbJWRdICVzKCksIHY0bCBtZW0gaGFuZGxlOiAweCVseFxuIiwKKwkJCQkoKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShody0+djRsMl9jdHgpKS0+aWQsCisJCQkJX19mdW5jX18sIHZmLT52NGxfbWVtX2hhbmRsZSk7CisJCX0KKworCQlody0+dmZidWZfdXNlW2luZGV4XSsrOworCQl2Zi0+aW5kZXggPSBpbmRleDsKKwkJc2V0X2ZyYW1lX2luZm8oaHcsIHZmKTsKKwkJaWYgKGZpZWxkX251bSA+IDEpIHsKKwkJCXZmLT5kdXJhdGlvbiA9IHZmLT5kdXJhdGlvbiAvIGZpZWxkX251bTsKKwkJCXZmLT5kdXJhdGlvbl9wdWxsZG93biA9IChmaWVsZF9udW0gPT0gMykgPworCQkJCSh2Zi0+ZHVyYXRpb24gPj4gMSk6MDsKKwkJCWlmIChpID4gMCkKKwkJCQl0eXBlID0gbnZfb3JkZXI7CisJCQlpZiAoaSA9PSAxKSAvKiBzZWNvbmQgZmllbGQqLworCQkJCXR5cGUgfD0gKGZpcnN0X2ZpZWxkX3R5cGUgPT0gVklEVFlQRV9JTlRFUkxBQ0VfVE9QKSA/CisJCQkJCVZJRFRZUEVfSU5URVJMQUNFX0JPVFRPTSA6IFZJRFRZUEVfSU5URVJMQUNFX1RPUDsKKwkJCWVsc2UKKwkJCQl0eXBlIHw9IChmaXJzdF9maWVsZF90eXBlID09IFZJRFRZUEVfSU5URVJMQUNFX1RPUCkgPworCQkJCQlWSURUWVBFX0lOVEVSTEFDRV9UT1AgOiBWSURUWVBFX0lOVEVSTEFDRV9CT1RUT007CisJCX0gZWxzZSB7CisJCQlpZiAoKGh3LT5zZXFpbmZvICYgU0VRSU5GT19FWFRfQVZBSUxBQkxFKSAmJgorCQkJCShody0+c2VxaW5mbyAmIFNFUUlORk9fUFJPRykpIHsKKwkJCQlpZiAoaW5mbyAmIFBJQ0lORk9fUlBUX0ZJUlNUKSB7CisJCQkJCWlmIChpbmZvICYgUElDSU5GT19UT1BfRklSU1QpCisJCQkJCQl2Zi0+ZHVyYXRpb24gKj0gMzsKKwkJCQkJZWxzZQorCQkJCQkJdmYtPmR1cmF0aW9uICo9IDI7CisJCQkJfQorCQkJCXZmLT5kdXJhdGlvbl9wdWxsZG93biA9IDA7CisJCQl9IGVsc2UgeworCQkJCXZmLT5kdXJhdGlvbl9wdWxsZG93biA9CisJCQkJCShpbmZvICYgUElDSU5GT19SUFRfRklSU1QpID8KKwkJCQkJCXZmLT5kdXJhdGlvbiA+PiAxIDogMDsKKwkJCX0KKwkJfQorCQl2Zi0+ZHVyYXRpb24gKz0gdmYtPmR1cmF0aW9uX3B1bGxkb3duOworCQl2Zi0+dHlwZSA9IHR5cGU7CisJCXZmLT5zaWduYWxfdHlwZSA9IGh3LT5yZWdfc2lnbmFsX3R5cGU7CisJCXZmLT5vcmllbnRhdGlvbiA9IDA7CisJCWlmIChpID4gMCkgeworCQkJdmYtPnB0cyA9IDA7CisJCQl2Zi0+cHRzX3VzNjQgPSAwOworCQkJdmYtPnRpbWVzdGFtcCA9IDA7CisJCX0gZWxzZSB7CisJCQl2Zi0+cHRzID0gKHBpYy0+cHRzX3ZhbGlkKSA/IHBpYy0+cHRzIDogMDsKKwkJCXZmLT5wdHNfdXM2NCA9IChwaWMtPnB0c192YWxpZCkgPyBwaWMtPnB0czY0IDogMDsKKwkJCXZmLT50aW1lc3RhbXAgPSBwaWMtPnRpbWVzdGFtcDsKKwkJfQorCQl2Zi0+dHlwZV9vcmlnaW5hbCA9IHZmLT50eXBlOworCisJCWlmICgoZXJyb3Jfc2tpcChodywgcGljLT5idWZmZXJfaW5mbywgdmYpKSB8fAorCQkJKCgoaHctPmZpcnN0X2lfZnJhbWVfcmVhZHkgPT0gMCkgfHwgcGJfc2tpcCkgJiYKKwkJCSgoUElDSU5GT19UWVBFX01BU0sgJiBwaWMtPmJ1ZmZlcl9pbmZvKSAhPQorCQkJIFBJQ0lORk9fVFlQRV9JKSkpIHsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQlody0+ZHJvcF9mcmFtZV9jb3VudCsrOworCQkJaWYgKChpbmZvICYgUElDSU5GT19UWVBFX01BU0spID09IFBJQ0lORk9fVFlQRV9JKSB7CisJCQkJaHctPmd2cy5pX2xvc3RfZnJhbWVzKys7CisJCQl9IGVsc2UgaWYgKChpbmZvICYgUElDSU5GT19UWVBFX01BU0spID09IFBJQ0lORk9fVFlQRV9QKSB7CisJCQkJaHctPmd2cy5wX2xvc3RfZnJhbWVzKys7CisJCQl9IGVsc2UgaWYgKChpbmZvICYgUElDSU5GT19UWVBFX01BU0spID09IFBJQ0lORk9fVFlQRV9CKSB7CisJCQkJaHctPmd2cy5iX2xvc3RfZnJhbWVzKys7CisJCQl9CisJCQkvKiBUaG91Z2ggd2UgZHJvcCBpdCwgaXQgaXMgc3RpbGwgYW4gZXJyb3IgZnJhbWUsIGNvdW50IGl0LgorCQkJICogQmVjYXNlIHdlJ3ZlIGNvdW50ZWQgdGhlIGVycm9yIGZyYW1lIGluIHZkZWNfY291bnRfaW5mbworCQkJICogZnVuY3Rpb24sIGF2b2lkIGNvdW50IGl0IHR3aWNlLgorCQkJICovCisJCWlmICghKGluZm8gJiBQSUNJTkZPX0VSUk9SKSkgeworCQkJaHctPmd2cy5lcnJvcl9mcmFtZV9jb3VudCsrOworCQkJaWYgKChpbmZvICYgUElDSU5GT19UWVBFX01BU0spID09IFBJQ0lORk9fVFlQRV9JKSB7CisJCQkJaHctPmd2cy5pX2NvbmNlYWxlZF9mcmFtZXMrKzsKKwkJCX0gZWxzZSBpZiAoKGluZm8gJiBQSUNJTkZPX1RZUEVfTUFTSykgPT0gUElDSU5GT19UWVBFX1ApIHsKKwkJCQlody0+Z3ZzLnBfY29uY2VhbGVkX2ZyYW1lcysrOworCQkJfSBlbHNlIGlmICgoaW5mbyAmIFBJQ0lORk9fVFlQRV9NQVNLKSA9PSBQSUNJTkZPX1RZUEVfQikgeworCQkJCWh3LT5ndnMuYl9jb25jZWFsZWRfZnJhbWVzKys7CisJCQl9CisJCX0KKwkJCWh3LT52ZmJ1Zl91c2VbaW5kZXhdLS07CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmxvY2ssIGZsYWdzKTsKKwkJCWtmaWZvX3B1dCgmaHctPm5ld2ZyYW1lX3EsCisJCQkJKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5sb2NrLCBmbGFncyk7CisJCX0gZWxzZSB7CisJCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1RJTUVJTkZPLAorCQkJCSIlcywgdmY6ICVseCwgbnVtWyVkXTogJWQoJWMpLCBkdXI6ICVkLCB0eXBlOiAleCwgcHRzOiAlZCglbGxkKVxuIiwKKwkJCQlfX2Z1bmNfXywgKHVsb25nKXZmLCBpLCBody0+ZGlzcF9udW0sIEdFVF9TTElDRV9UWVBFKGluZm8pLAorCQkJCXZmLT5kdXJhdGlvbiwgdmYtPnR5cGUsIHZmLT5wdHMsIHZmLT5wdHNfdXM2NCk7CisJCQlody0+ZGlzcF9udW0rKzsKKwkJCWlmIChpID09IDApIHsKKwkJCQlkZWNvZGVyX2RvX2ZyYW1lX2NoZWNrKHZkZWMsIHZmKTsKKwkJCQlod191cGRhdGVfZ3ZzKGh3KTsKKwkJCQl2ZGVjX2ZpbGxfdmRlY19mcmFtZSh2ZGVjLCAmaHctPnZmcmFtZV9xb3MsCisJCQkJCSZody0+Z3ZzLCB2ZiwgcGljLT5od19kZWNvZGVfdGltZSk7CisJCQl9CisJCQl2ZGVjLT52ZGVjX2Zwc19kZXRlYyh2ZGVjLT5pZCk7CisJCQl2Zi0+bWVtX2hhbmRsZSA9CisJCQkJZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCQlody0+bW1fYmxrX2hhbmRsZSwgaW5kZXgpOworCQkJaWYgKCF2ZGVjLT52YnVmLnVzZV9wdHNzZXJ2ICYmIHZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpKSB7CisJCQkJLyogb2Zmc2V0IGZvciB0c3BsYXllciBwdHMgbG9va3VwICovCisJCQkJaWYgKGkgPT0gMCkgeworCQkJCQl2Zi0+cHRzX3VzNjQgPQorCQkJCQkJKCgodTY0KXZmLT5kdXJhdGlvbiA8PCAzMikgJgorCQkJCQkJMHhmZmZmZmZmZjAwMDAwMDAwKSB8IHBpYy0+b2Zmc2V0OworCQkJCQl2Zi0+cHRzID0gMDsKKwkJCQl9IGVsc2UgeworCQkJCQl2Zi0+cHRzX3VzNjQgPSAodTY0KS0xOworCQkJCQl2Zi0+cHRzID0gMDsKKwkJCQl9CisJCQl9CisJCQl2ZGVjX3ZmcmFtZV9yZWFkeSh2ZGVjLCB2Zik7CisJCQlrZmlmb19wdXQoJmh3LT5kaXNwbGF5X3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCQlBVFJBQ0VfQ09VTlRFUihody0+cHRzX25hbWUsIHZmLT5wdHMpOworCQkJQVRSQUNFX0NPVU5URVIoaHctPm5ld19xX25hbWUsIGtmaWZvX2xlbigmaHctPm5ld2ZyYW1lX3EpKTsKKwkJCUFUUkFDRV9DT1VOVEVSKGh3LT5kaXNwX3FfbmFtZSwga2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKSk7CisJCQkvKiBpZiAoaHctPmRpc3BfbnVtID09IDEpIHsgKi8KKwkJCWlmIChody0+a3BpX2ZpcnN0X2lfZGVjb2RlZCA9PSAwKSB7CisJCQkJaHctPmtwaV9maXJzdF9pX2RlY29kZWQgPSAxOworCQkJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCwKKwkJCQkJIlt2ZGVjX2twaV1bJXNdIEZpcnN0IEkgZnJhbWUgZGVjb2RlZC5cbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCX0KKwkJCWlmICh3aXRob3V0X2Rpc3BsYXlfbW9kZSA9PSAwKSB7CisJCQkJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQkJCQlpZiAodjRsMl9jdHgtPmlzX3N0cmVhbV9vZmYpIHsKKwkJCQkJCXZtcGVnX3ZmX3B1dCh2bXBlZ192Zl9nZXQodmRlYyksIHZkZWMpOworCQkJCQl9IGVsc2UgeworCQkJCQkJZmItPnRhc2stPnN1Ym1pdChmYi0+dGFzaywgVEFTS19UWVBFX0RFQyk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIodmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9WRlJBTUVfUkVBRFksCisJCQkJCQlOVUxMKTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQl2bXBlZ192Zl9wdXQodm1wZWdfdmZfZ2V0KHZkZWMpLCB2ZGVjKTsKKworCisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZvcmNlX2ludGVybGFjZV9jaGVjayhzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcpCit7CisJaWYgKChody0+ZGVjX2NvbnRyb2wgJgorCURFQ19DT05UUk9MX0ZMQUdfRk9SQ0VfMjUwMF83MjBfNTc2X0lOVEVSTEFDRSkgJiYKKwkJKGh3LT5mcmFtZV93aWR0aCA9PSA3MjApICYmCisJCShody0+ZnJhbWVfaGVpZ2h0ID09IDU3NikgJiYKKwkJKGh3LT5mcmFtZV9kdXIgPT0gMzg0MCkpIHsKKwkJaHctPmZyYW1lX3Byb2cgPSAwOworCX0gZWxzZSBpZiAoKGh3LT5kZWNfY29udHJvbAorCSYgREVDX0NPTlRST0xfRkxBR19GT1JDRV8zMDAwXzcwNF80ODBfSU5URVJMQUNFKSAmJgorCQkoaHctPmZyYW1lX3dpZHRoID09IDcwNCkgJiYKKwkJKGh3LT5mcmFtZV9oZWlnaHQgPT0gNDgwKSAmJgorCQkoaHctPmZyYW1lX2R1ciA9PSAzMjAwKSkgeworCQlody0+ZnJhbWVfcHJvZyA9IDA7CisJfSBlbHNlIGlmICgoaHctPmRlY19jb250cm9sCisJJiBERUNfQ09OVFJPTF9GTEFHX0ZPUkNFXzI1MDBfNzA0XzU3Nl9JTlRFUkxBQ0UpICYmCisJCShody0+ZnJhbWVfd2lkdGggPT0gNzA0KSAmJgorCQkoaHctPmZyYW1lX2hlaWdodCA9PSA1NzYpICYmCisJCShody0+ZnJhbWVfZHVyID09IDM4NDApKSB7CisJCWh3LT5mcmFtZV9wcm9nID0gMDsKKwl9IGVsc2UgaWYgKChody0+ZGVjX2NvbnRyb2wKKwkmIERFQ19DT05UUk9MX0ZMQUdfRk9SQ0VfMjUwMF81NDRfNTc2X0lOVEVSTEFDRSkgJiYKKwkJKGh3LT5mcmFtZV93aWR0aCA9PSA1NDQpICYmCisJCShody0+ZnJhbWVfaGVpZ2h0ID09IDU3NikgJiYKKwkJKGh3LT5mcmFtZV9kdXIgPT0gMzg0MCkpIHsKKwkJaHctPmZyYW1lX3Byb2cgPSAwOworCX0gZWxzZSBpZiAoKGh3LT5kZWNfY29udHJvbAorCSYgREVDX0NPTlRST0xfRkxBR19GT1JDRV8yNTAwXzQ4MF81NzZfSU5URVJMQUNFKSAmJgorCQkoaHctPmZyYW1lX3dpZHRoID09IDQ4MCkgJiYKKwkJKGh3LT5mcmFtZV9oZWlnaHQgPT0gNTc2KSAmJgorCQkoaHctPmZyYW1lX2R1ciA9PSAzODQwKSkgeworCQlody0+ZnJhbWVfcHJvZyA9IDA7CisJfSBlbHNlIGlmIChody0+ZGVjX2NvbnRyb2wKKwkmIERFQ19DT05UUk9MX0ZMQUdfRk9SQ0VfU0VRX0lOVEVSTEFDRSkgeworCQlody0+ZnJhbWVfcHJvZyA9IDA7CisJfQorCit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX3JlZmVyZW5jZShzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcsCisJaW50IGluZGV4KQoreworCWh3LT5yZWZfdXNlW2luZGV4XSsrOworCWlmIChody0+cmVmc1sxXSA9PSAtMSkgeworCQlody0+cmVmc1sxXSA9IGluZGV4OworCQkvKgorCQkqIGZpcnN0IHBpYyBuZWVkIG91dHB1dCB0byBzaG93CisJCSogdXNlY250IGRvIG5vdCBkZWNyZWFzZS4KKwkJKi8KKwl9IGVsc2UgaWYgKGh3LT5yZWZzWzBdID09IC0xKSB7CisJCWh3LT5yZWZzWzBdID0gaHctPnJlZnNbMV07CisJCWh3LT5yZWZzWzFdID0gaW5kZXg7CisJCS8qIHNlY29uZCBwaWMgZG8gbm90IG91dHB1dCAqLworCQlpbmRleCA9IGh3LT5idWZfbnVtOworCX0gZWxzZSB7CisJCWh3LT5yZWZfdXNlW2h3LT5yZWZzWzBdXS0tOwkJLy9vbGQgcmVmMCB1bnVuc2VkCisJCWh3LT5yZWZzWzBdID0gaHctPnJlZnNbMV07CisJCWh3LT5yZWZzWzFdID0gaW5kZXg7CisJCWluZGV4ID0gaHctPnJlZnNbMF07CisJfQorCXJldHVybiBpbmRleDsKK30KKworc3RhdGljIGJvb2wgaXNfcmVmX2Vycm9yKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodykKK3sKKwlpZiAoKGh3LT5waWNzW2h3LT5yZWZzWzBdXS5idWZmZXJfaW5mbyAmIFBJQ0lORk9fRVJST1IpIHx8CisJCShody0+cGljc1tody0+cmVmc1sxXV0uYnVmZmVyX2luZm8gJiBQSUNJTkZPX0VSUk9SKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm1wZWcyX2dldF9wc19pbmZvKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBzdHJ1Y3QgYW1sX3ZkZWNfcHNfaW5mb3MgKnBzKQoreworCXBzLT52aXNpYmxlX3dpZHRoCT0gd2lkdGg7CisJcHMtPnZpc2libGVfaGVpZ2h0CT0gaGVpZ2h0OworCXBzLT5jb2RlZF93aWR0aAkJPSBBTElHTih3aWR0aCwgNjQpOworCXBzLT5jb2RlZF9oZWlnaHQgCT0gQUxJR04oaGVpZ2h0LCAzMik7CisJcHMtPmRwYl9zaXplIAkJPSBody0+YnVmX251bTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHY0bF9yZXNfY2hhbmdlKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChjdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSAmJgorCQlody0+cmVzX2NoX2ZsYWcgPT0gMCkgeworCQlzdHJ1Y3QgYW1sX3ZkZWNfcHNfaW5mb3MgcHM7CisKKwkJaWYgKChody0+ZnJhbWVfd2lkdGggIT0gMCAmJgorCQkJaHctPmZyYW1lX2hlaWdodCAhPSAwKSAmJgorCQkJKGh3LT5mcmFtZV93aWR0aCAhPSB3aWR0aCB8fAorCQkJaHctPmZyYW1lX2hlaWdodCAhPSBoZWlnaHQpKSB7CisJCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJCSJ2NGxfcmVzX2NoYW5nZSBQaWMgV2lkdGgvSGVpZ2h0IENoYW5nZSAoJWQsJWQpPT4oJWQsJWQpXG4iLAorCQkJCWh3LT5mcmFtZV93aWR0aCwgaHctPmZyYW1lX2hlaWdodCwKKwkJCQl3aWR0aCwKKwkJCQloZWlnaHQpOworCQkJdm1wZWcyX2dldF9wc19pbmZvKGh3LCB3aWR0aCwgaGVpZ2h0LCAmcHMpOworCQkJdmRlY192NGxfc2V0X3BzX2luZm9zKGN0eCwgJnBzKTsKKwkJCXZkZWNfdjRsX3Jlc19jaF9ldmVudChjdHgpOworCQkJaHctPnY0bF9wYXJhbXNfcGFyc2VkID0gZmFsc2U7CisJCQlody0+cmVzX2NoX2ZsYWcgPSAxOworCQkJY3R4LT52NGxfcmVzb2x1dGlvbl9jaGFuZ2UgPSAxOworCQkJaHctPmVvcyA9IDE7CisJCQlmbHVzaF9vdXRwdXQoaHcpOworCQkJaWYgKGh3LT5pc191c2VkX3Y0bCkKKwkJCQlub3RpZnlfdjRsX2Vvcyhod190b192ZGVjKGh3KSk7CisKKwkJCXJldCA9IDE7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpcnFyZXR1cm5fdCB2bXBlZzEyX2lzcl90aHJlYWRfZm4oc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGlycSkKK3sKKwl1MzIgcmVnLCBpbmRleCwgaW5mbywgc2VxaW5mbywgb2Zmc2V0LCBwdHMsIGZyYW1lX3NpemU9MCwgdG1wOworCXU2NCBwdHNfdXM2NCA9IDA7CisJc3RydWN0IHBpY19pbmZvX3QgKm5ld19waWMsICpkaXNwX3BpYzsKKwlzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcgPQorCQkoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKikodmRlYy0+cHJpdmF0ZSk7CisKKwlpZiAoUkVBRF9WUkVHKEFWX1NDUkFUQ0hfTSkgIT0gMCAmJgorCQkoZGVidWdfZW5hYmxlICYgUFJJTlRfRkxBR19VQ09ERV9ERVRBSUwpKSB7CisKKwkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19ERUNfREVUQUlMLAorCQkJImRiZyAleDogJXgsIGxldmVsICV4LCB3cCAleCwgcnAgJXgsIGNudCAleFxuIiwKKwkJCVJFQURfVlJFRyhBVl9TQ1JBVENIX00pLCBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9OKSwKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCksCisJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSwKKwkJCVJFQURfVlJFRyhWSUZGX0JJVF9DTlQpKTsKKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX00sIDApOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJcmVnID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfRyk7CisJaWYgKHJlZyA9PSAxKSB7CisJCWlmIChody0+a3BpX2ZpcnN0X2lfY29tbWluZyA9PSAwKSB7CisJCQlody0+a3BpX2ZpcnN0X2lfY29tbWluZyA9IDE7CisJCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RFQ19ERVRBSUwsCisJCQkJIlt2ZGVjX2twaV1bJXNdIEZpcnN0IEkgZnJhbWUgY29taW5nLlxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCX0KKwkJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQkJaW50IGZyYW1lX3dpZHRoID0gUkVBRF9WUkVHKE1SRUdfUElDX1dJRFRIKTsKKwkJCWludCBmcmFtZV9oZWlnaHQgPSBSRUFEX1ZSRUcoTVJFR19QSUNfSEVJR0hUKTsKKwkJCWlmICghdjRsX3Jlc19jaGFuZ2UoaHcsIGZyYW1lX3dpZHRoLCBmcmFtZV9oZWlnaHQpKSB7CisJCQkJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisJCQkJaWYgKGN0eC0+cGFyYW1fc2V0c19mcm9tX3Vjb2RlICYmICFody0+djRsX3BhcmFtc19wYXJzZWQpIHsKKwkJCQkJc3RydWN0IGFtbF92ZGVjX3BzX2luZm9zIHBzOworCisJCQkJCXZtcGVnMl9nZXRfcHNfaW5mbyhodywgZnJhbWVfd2lkdGgsIGZyYW1lX2hlaWdodCwgJnBzKTsKKwkJCQkJaHctPnY0bF9wYXJhbXNfcGFyc2VkID0gdHJ1ZTsKKwkJCQkJdmRlY192NGxfc2V0X3BzX2luZm9zKGN0eCwgJnBzKTsKKwkJCQkJdXNlcmRhdGFfcHVzaGVkX2Ryb3AoaHcpOworCQkJCQlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCQkJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfQUdBSU47CisJCQkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJCX0gZWxzZSB7CisJCQkJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9HLCAwKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXVzZXJkYXRhX3B1c2hlZF9kcm9wKGh3KTsKKwkJCQlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCQkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKwkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCX0KKwkJfSBlbHNlCisJCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfRywgMCk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlyZWcgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9KKTsKKwlpZiAocmVnICYgKDE8PDE2KSkgeworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT51c2VyZGF0YV9wdXNoX3dvcmspOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJcmVnID0gUkVBRF9WUkVHKE1SRUdfQlVGRkVST1VUKTsKKwlpZiAocmVnID09IE1QRUcxMl9EQVRBX1JFUVVFU1QpIHsKKwkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19SVU5fRkxPVywKKwkJCSIlczogZGF0YSByZXF1ZXN0LCBiY250PSV4XG4iLAorCQkJX19mdW5jX18sIFJFQURfVlJFRyhWSUZGX0JJVF9DTlQpKTsKKwkJaWYgKHZkZWNfZnJhbWVfYmFzZWQodmRlYykpIHsKKwkJCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfR0VUX0RBVEE7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJfQorCX0gZWxzZSBpZiAocmVnID09IE1QRUcxMl9EQVRBX0VNUFRZKSB7CisJCS8qdGltZW91dCB3aGVuIGRlY29kaW5nIG5leHQgZnJhbWUqLworCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1ZMRF9ERVRBSUwsCisJCQkiJXM6IEluc3VmZmljaWVudCBkYXRhLCBsdmw9JXggY3RybD0leCBiY250PSV4XG4iLAorCQkJX19mdW5jX18sCisJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0NPTlRST0wpLAorCQkJUkVBRF9WUkVHKFZJRkZfQklUX0NOVCkpOworCisJCWlmICh2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpKSB7CisJCQl1c2VyZGF0YV9wdXNoZWRfZHJvcChodyk7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQl9IGVsc2UgeworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0FHQUlOOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQl1c2VyZGF0YV9wdXNoZWRfZHJvcChodyk7CisJCQlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCQl9CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9IGVsc2UgeyAgLyogTVBFRzEyX1BJQ19ET05FLCBNUEVHMTJfU0VRX0VORCAqLworCQlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCisJCWluZm8gPSBSRUFEX1ZSRUcoTVJFR19QSUNfSU5GTyk7CisJCW9mZnNldCA9IFJFQURfVlJFRyhNUkVHX0ZSQU1FX09GRlNFVCk7CisJCWluZGV4ID0gc3BlY190b19pbmRleChodywgUkVBRF9WUkVHKFJFQ19DQU5WQVNfQUREUikpOworCQlzZXFpbmZvID0gUkVBRF9WUkVHKE1SRUdfU0VRX0lORk8pOworCisJCWlmICgoKHNlcWluZm8gPj4gOCkgJiAweGZmKSAmJgorCQkJKChzZXFpbmZvID4+IDEyICYgMHg3KSAhPSBody0+cHJvZmlsZV9pZGMgfHwKKwkJCShzZXFpbmZvID4+IDggJiAweGYpICE9IGh3LT5sZXZlbF9pZGMpKSB7CisJCQlody0+cHJvZmlsZV9pZGMgPSBzZXFpbmZvID4+IDEyICYgMHg3OworCQkJaHctPmxldmVsX2lkYyA9IHNlcWluZm8gPj4gOCAmIDB4ZjsKKwkJCXZkZWNfc2V0X3Byb2ZpbGVfbGV2ZWwodmRlYywgaHctPnByb2ZpbGVfaWRjLCBody0+bGV2ZWxfaWRjKTsKKwkJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCwKKwkJCQkicHJvZmlsZV9pZGM6ICVkICBsZXZlbF9pZGM6ICVkXG4iLAorCQkJCWh3LT5wcm9maWxlX2lkYywgaHctPmxldmVsX2lkYyk7CisJCX0KKworCQlpZiAoKGluZm8gJiBQSUNJTkZPX1BST0cpID09IDAgJiYKKwkJCShpbmZvICYgRlJBTUVfUElDVFVSRV9NQVNLKSAhPSBGUkFNRV9QSUNUVVJFKSB7CisJCQlody0+Zmlyc3RfaV9mcmFtZV9yZWFkeSA9IDE7IC8qIGZvciBmaWVsZCBzdHJ1Y3QgY2FzZSovCisJCX0KKwkJaWYgKGluZGV4ID49IGh3LT5idWZfbnVtKSB7CisJCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0VSUk9SLAorCQkJCSJtbXBlZzEyOiBpbnZhbGlkIGJ1ZiBpbmRleDogJWRcbiIsIGluZGV4KTsKKwkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9FUlJPUjsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisJCWh3LT5kZWNfbnVtKys7CisJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworCQluZXdfcGljID0gJmh3LT5waWNzW2luZGV4XTsKKwkJaWYgKHZkZWMtPm12ZnJtKSB7CisJCQluZXdfcGljLT5mcmFtZV9zaXplID0gdmRlYy0+bXZmcm0tPmZyYW1lX3NpemU7CisJCQluZXdfcGljLT5od19kZWNvZGVfdGltZSA9CisJCQlsb2NhbF9jbG9jaygpIC0gdmRlYy0+bXZmcm0tPmh3X2RlY29kZV9zdGFydDsKKwkJfQorCQl0bXAgPSBSRUFEX1ZSRUcoTVJFR19QSUNfV0lEVEgpOworCQlpZiAoKHRtcCA+IDE5MjApIHx8ICh0bXAgPT0gMCkpIHsKKwkJCW5ld19waWMtPndpZHRoID0gMTkyMDsKKwkJCWh3LT5mcmFtZV93aWR0aCA9IDE5MjA7CisJCX0gZWxzZSB7CisJCQluZXdfcGljLT53aWR0aCA9IHRtcDsKKwkJCWh3LT5mcmFtZV93aWR0aCA9IHRtcDsKKwkJfQorCisJCXRtcCA9IFJFQURfVlJFRyhNUkVHX1BJQ19IRUlHSFQpOworCQlpZiAoKHRtcCA+IDEwODgpIHx8ICh0bXAgPT0gMCkpIHsKKwkJCW5ld19waWMtPmhlaWdodCA9IDEwODg7CisJCQlody0+ZnJhbWVfaGVpZ2h0ID0gMTA4ODsKKwkJfSBlbHNlIHsKKwkJCW5ld19waWMtPmhlaWdodCA9IHRtcDsKKwkJCWh3LT5mcmFtZV9oZWlnaHQgPSB0bXA7CisJCX0KKworCQluZXdfcGljLT5idWZmZXJfaW5mbyA9IGluZm87CisJCW5ld19waWMtPm9mZnNldCA9IG9mZnNldDsKKwkJbmV3X3BpYy0+aW5kZXggPSBpbmRleDsKKwkJaWYgKCgoaW5mbyAmIFBJQ0lORk9fVFlQRV9NQVNLKSA9PSBQSUNJTkZPX1RZUEVfSSkgfHwKKwkJCSgoaW5mbyAmIFBJQ0lORk9fVFlQRV9NQVNLKSA9PSBQSUNJTkZPX1RZUEVfUCkpIHsKKwkJCWlmIChody0+Y2h1bmspIHsKKwkJCQluZXdfcGljLT5wdHNfdmFsaWQgPSBody0+Y2h1bmstPnB0c192YWxpZDsKKwkJCQluZXdfcGljLT5wdHMgPSBody0+Y2h1bmstPnB0czsKKwkJCQluZXdfcGljLT5wdHM2NCA9IGh3LT5jaHVuay0+cHRzNjQ7CisJCQkJbmV3X3BpYy0+dGltZXN0YW1wID0gaHctPmNodW5rLT50aW1lc3RhbXA7CisJCQkJaWYgKGh3LT5sYXN0X2NodW5rX3B0cyA9PSBody0+Y2h1bmstPnB0cykgeworCQkJCQluZXdfcGljLT5wdHNfdmFsaWQgPSAwOworCQkJCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1RJTUVJTkZPLAorCQkJCQkJInB0cyBpbnZhbGlkXG4iKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmICgodmRlYy0+dmJ1Zi5ub19wYXJzZXIgPT0gMCkgfHwgKHZkZWMtPnZidWYudXNlX3B0c3NlcnYpKSB7CisJCQkJCWlmIChwdHNfbG9va3VwX29mZnNldF91czY0KFBUU19UWVBFX1ZJREVPLCBvZmZzZXQsCisJCQkJCQkmcHRzLCAmZnJhbWVfc2l6ZSwgMCwgJnB0c191czY0KSA9PSAwKSB7CisJCQkJCQluZXdfcGljLT5wdHNfdmFsaWQgPSB0cnVlOworCQkJCQkJbmV3X3BpYy0+cHRzID0gcHRzOworCQkJCQkJbmV3X3BpYy0+cHRzNjQgPSBwdHNfdXM2NDsKKwkJCQkJfSBlbHNlCisJCQkJCQluZXdfcGljLT5wdHNfdmFsaWQgPSBmYWxzZTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoaHctPmNodW5rKSB7CisJCQkJaHctPmxhc3RfY2h1bmtfcHRzID0gaHctPmNodW5rLT5wdHM7CisJCQkJbmV3X3BpYy0+dGltZXN0YW1wID0gaHctPmNodW5rLT50aW1lc3RhbXA7CisJCQl9CisJCQluZXdfcGljLT5wdHNfdmFsaWQgPSBmYWxzZTsKKwkJfQorCisJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfUlVOX0ZMT1csCisJCQkibW1wZWcxMjogbmV3X3BpYz0lZCwgaW5kPSVkLCBpbmZvPSV4LCBzZXE9JXgsIG9mZnNldD0lZFxuIiwKKwkJCWh3LT5kZWNfbnVtLCBpbmRleCwgaW5mbywgc2VxaW5mbywgb2Zmc2V0KTsKKworCQlody0+ZnJhbWVfcHJvZyA9IGluZm8gJiBQSUNJTkZPX1BST0c7CisJCWlmICgoc2VxaW5mbyAmIFNFUUlORk9fRVhUX0FWQUlMQUJMRSkgJiYKKwkJCSgoc2VxaW5mbyAmIFNFUUlORk9fUFJPRykgPT0gMCkpCisJCQlody0+ZnJhbWVfcHJvZyA9IDA7CisJCWZvcmNlX2ludGVybGFjZV9jaGVjayhodyk7CisKKwkJaWYgKGlzX3JlZl9lcnJvcihodykpIHsKKwkJCWlmICgoaW5mbyAmIFBJQ0lORk9fVFlQRV9NQVNLKSA9PSBQSUNJTkZPX1RZUEVfQikKKwkJCQluZXdfcGljLT5idWZmZXJfaW5mbyB8PSBQSUNJTkZPX0VSUk9SOworCQl9CisKKwkJaWYgKCgoaW5mbyAmIFBJQ0lORk9fVFlQRV9NQVNLKSA9PSBQSUNJTkZPX1RZUEVfSSkgfHwKKwkJCSgoaW5mbyAmIFBJQ0lORk9fVFlQRV9NQVNLKSA9PSBQSUNJTkZPX1RZUEVfUCkpIHsKKwkJCWluZGV4ID0gdXBkYXRlX3JlZmVyZW5jZShodywgaW5kZXgpOworCQl9IGVsc2UgeworCQkJLyogZHJvcCBiIGZyYW1lIGJlZm9yZSByZWZlcmVuY2UgcGljIHJlYWR5ICovCisJCQlpZiAoaHctPnJlZnNbMF0gPT0gLTEpCisJCQkJaW5kZXggPSBody0+YnVmX251bTsKKwkJfQorCQl2bXBlZzEyX3NhdmVfaHdfY29udGV4dChodywgcmVnKTsKKworCQlpZiAoaW5kZXggPj0gaHctPmJ1Zl9udW0pIHsKKwkJCWlmIChody0+ZGVjX251bSAhPSAyKSB7CisJCQkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCQkibW1wZWcxMjogZHJvcCBwaWMgbnVtICVkLCB0eXBlICVjLCBpbmRleCAlZCwgb2Zmc2V0ICV4XG4iLAorCQkJCWh3LT5kZWNfbnVtLCBHRVRfU0xJQ0VfVFlQRShpbmZvKSwgaW5kZXgsIG9mZnNldCk7CisJCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0VSUk9SOworCQkJfQorCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKworCQlkaXNwX3BpYyA9ICZody0+cGljc1tpbmRleF07CisJCWluZm8gPSBody0+cGljc1tpbmRleF0uYnVmZmVyX2luZm87CisJCWlmIChkaXNwX3BpYy0+cHRzX3ZhbGlkICYmIGh3LT5sYXN0cHRzNjQgPT0gZGlzcF9waWMtPnB0czY0KQorCQkJZGlzcF9waWMtPnB0c192YWxpZCA9IGZhbHNlOworCQlpZiAoZGlzcF9waWMtPnB0c192YWxpZCkKKwkJCWh3LT5sYXN0cHRzNjQgPSBkaXNwX3BpYy0+cHRzNjQ7CisKKwkJaWYgKGlucHV0X2ZyYW1lX2Jhc2VkKGh3X3RvX3ZkZWMoaHcpKSkKKwkJCWZyYW1lX3NpemUgPSBuZXdfcGljLT5mcmFtZV9zaXplOworCisJCWZpbGxfZnJhbWVfaW5mbyhodywgaW5mbywgZnJhbWVfc2l6ZSwgbmV3X3BpYy0+cHRzKTsKKworCQlpZiAoKGh3LT5maXJzdF9pX2ZyYW1lX3JlYWR5ID09IDApICYmCisJCQkoKGluZm8gJiBQSUNJTkZPX1RZUEVfTUFTSykgPT0gUElDSU5GT19UWVBFX0kpICYmCisJCQkoKGluZm8gJiBQSUNJTkZPX0VSUk9SKSA9PSAwKSkgeworCQkJaHctPmZpcnN0X2lfZnJhbWVfcmVhZHkgPSAxOworCQl9CisKKwkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19SVU5fRkxPVywKKwkJCSJtbXBlZzEyOiBkaXNwX3BpYz0lZCglYyksIGluZD0lZCwgb2Zmc3Q9JXgsIHB0cz0oJWQsJWxsZCwlbGx4KSglZClcbiIsCisJCQlody0+ZGlzcF9udW0sIEdFVF9TTElDRV9UWVBFKGluZm8pLCBpbmRleCwgZGlzcF9waWMtPm9mZnNldCwKKwkJCWRpc3BfcGljLT5wdHMsIGRpc3BfcGljLT5wdHM2NCwKKwkJCWRpc3BfcGljLT50aW1lc3RhbXAsIGRpc3BfcGljLT5wdHNfdmFsaWQpOworCisJCXByZXBhcmVfZGlzcGxheV9idWYoaHcsIGRpc3BfcGljKTsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorc3RhdGljIGlycXJldHVybl90IHZtcGVnMTJfaXNyKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBpcnEpCit7CisJdTMyIGluZm8sIG9mZnNldDsKKwlzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcgPQorCShzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqKSh2ZGVjLT5wcml2YXRlKTsKKwlpZiAoaHctPmVvcykKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCWluZm8gPSBSRUFEX1ZSRUcoTVJFR19QSUNfSU5GTyk7CisJb2Zmc2V0ID0gUkVBRF9WUkVHKE1SRUdfRlJBTUVfT0ZGU0VUKTsKKworCXZkZWNfY291bnRfaW5mbygmaHctPmd2cywgaW5mbyAmIFBJQ0lORk9fRVJST1IsIG9mZnNldCk7CisJaWYgKGluZm8gJlBJQ0lORk9fRVJST1IpIHsKKwkJaWYgKChpbmZvICYgUElDSU5GT19UWVBFX01BU0spID09IFBJQ0lORk9fVFlQRV9JKSB7CisJCQlody0+Z3ZzLmlfY29uY2VhbGVkX2ZyYW1lcysrOworCQl9IGVsc2UgaWYgKChpbmZvICYgUElDSU5GT19UWVBFX01BU0spID09IFBJQ0lORk9fVFlQRV9QKSB7CisJCQlody0+Z3ZzLnBfY29uY2VhbGVkX2ZyYW1lcysrOworCQl9IGVsc2UgaWYgKChpbmZvICYgUElDSU5GT19UWVBFX01BU0spID09IFBJQ0lORk9fVFlQRV9CKSB7CisJCQlody0+Z3ZzLmJfY29uY2VhbGVkX2ZyYW1lcysrOworCQl9CisJfQorCWlmIChvZmZzZXQpIHsKKwkJaWYgKChpbmZvICYgUElDSU5GT19UWVBFX01BU0spID09IFBJQ0lORk9fVFlQRV9JKSB7CisJCQlody0+Z3ZzLmlfZGVjb2RlZF9mcmFtZXMrKzsKKwkJfSBlbHNlIGlmICgoaW5mbyAmIFBJQ0lORk9fVFlQRV9NQVNLKSA9PSBQSUNJTkZPX1RZUEVfUCkgeworCQkJaHctPmd2cy5wX2RlY29kZWRfZnJhbWVzKys7CisJCX0gZWxzZSBpZiAoKGluZm8gJiBQSUNJTkZPX1RZUEVfTUFTSykgPT0gUElDSU5GT19UWVBFX0IpIHsKKwkJCWh3LT5ndnMuYl9kZWNvZGVkX2ZyYW1lcysrOworCQl9CisJfQorCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfQ0xSX1JFRywgMSk7CisKKwlyZXR1cm4gSVJRX1dBS0VfVEhSRUFEOworfQorCitzdGF0aWMgdm9pZCB2bXBlZzEyX25vdGlmeV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcgPSBjb250YWluZXJfb2Yod29yaywKKwkJCQkJc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MsIG5vdGlmeV93b3JrKTsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisKKwlpZiAoIWh3LT5pc191c2VkX3Y0bCAmJiB2ZGVjLT5mcl9oaW50X3N0YXRlID09IFZERUNfTkVFRF9ISU5UKSB7CisJCXZmX25vdGlmeV9yZWNlaXZlcih2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9GUl9ISU5ULAorCQkJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKWh3LT5mcmFtZV9kdXIpKTsKKwkJdmRlYy0+ZnJfaGludF9zdGF0ZSA9IFZERUNfSElOVEVEOworCX0KK30KKworc3RhdGljIHZvaWQgd2FpdF92bW1wZWcxMl9zZWFyY2hfZG9uZShzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcpCit7CisJdTMyIHZsZF9ycCA9IFJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCk7CisJaW50IGNvdW50ID0gMDsKKworCWRvIHsKKwkJdXNsZWVwX3JhbmdlKDEwMCwgNTAwKTsKKwkJaWYgKHZsZF9ycCA9PSBSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApKQorCQkJYnJlYWs7CisJCWlmIChjb3VudCA+IDEwMDApIHsKKwkJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkJCSIlcywgY291bnQgJWQgIHZsZF9ycCAweCV4IFZMRF9NRU1fVklGSUZPX1JQIDB4JXhcbiIsCisJCQkJCV9fZnVuY19fLCBjb3VudCwgdmxkX3JwLCBSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApKTsKKwkJCWJyZWFrOworCQl9IGVsc2UKKwkJCXZsZF9ycCA9IFJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCk7CisJCWNvdW50Kys7CisJfSB3aGlsZSAoMSk7Cit9CisKK3N0YXRpYyB2b2lkIGZsdXNoX291dHB1dChzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcpCit7CisJaW50IGluZGV4ID0gaHctPnJlZnNbMV07CisKKwkvKiB2aWRlbyBvbmx5IG9uZSBmcmFtZSBuZWVkIG5vdCBmbHVzaC4gKi8KKwlpZiAoaHctPmRlY19udW0gPCAyKQorCQlyZXR1cm47CisKKwlpZiAoKGh3LT5yZWZzWzBdID49IDApICYmCisJCShody0+cmVmc1swXSA8IGh3LT5idWZfbnVtKSkKKwkJaHctPnJlZl91c2VbaHctPnJlZnNbMF1dID0gMDsKKworCWlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgaHctPmJ1Zl9udW0pIHsKKwkJaHctPnJlZl91c2VbaW5kZXhdID0gMDsKKwkJcHJlcGFyZV9kaXNwbGF5X2J1ZihodywgJmh3LT5waWNzW2luZGV4XSk7CisJfQorfQorCitzdGF0aWMgaW50IG5vdGlmeV92NGxfZW9zKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICopdmRlYy0+cHJpdmF0ZTsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IChzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KTsKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmID0gTlVMTDsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPSBOVUxMOworCWludCBpbmRleCA9IElOVkFMSURfSURYOworCisJaWYgKGh3LT5lb3MpIHsKKwkJaWYgKGtmaWZvX2dldCgmaHctPm5ld2ZyYW1lX3EsICZ2ZikgPT0gMCB8fCB2ZiA9PSBOVUxMKSB7CisJCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0VSUk9SLAorCQkJCSIlcyBmYXRhbCBlcnJvciwgbm8gYXZhaWxhYmxlIGJ1ZmZlciBzbG90LlxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQkJaW5kZXggPSBmaW5kX2ZyZWVfYnVmZmVyKGh3KTsKKwkJCWlmIChpbmRleCA9PSBJTlZBTElEX0lEWCkgeworCQkJCWN0eC0+ZmJfb3BzLnF1ZXJ5KCZjdHgtPmZiX29wcywgJmh3LT5mYl90b2tlbik7CisJCQkJaWYgKGN0eC0+ZmJfb3BzLmFsbG9jKCZjdHgtPmZiX29wcywgaHctPmZiX3Rva2VuLCAmZmIsIEFNTF9GQl9SRVFfREVDKSA8IDApIHsKKwkJCQkJcHJfZXJyKCJbJWRdIGdldCBmYiBmYWlsLlxuIiwgY3R4LT5pZCk7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQl9CisJCX0KKworCQl2Zi0+dHlwZSB8PSBWSURUWVBFX1Y0TF9FT1M7CisJCXZmLT50aW1lc3RhbXAgPSBVTE9OR19NQVg7CisJCXZmLT52NGxfbWVtX2hhbmRsZSA9IChpbmRleCA9PSBJTlZBTElEX0lEWCkgPyAodWxvbmcpZmIgOgorCQkJCQkJCWh3LT5waWNzW2luZGV4XS52NGxfcmVmX2J1Zl9hZGRyOworCQl2Zi0+ZmxhZyA9IFZGUkFNRV9GTEFHX0VNUFRZX0ZSQU1FX1Y0TDsKKwkJZmIgPSAoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKil2Zi0+djRsX21lbV9oYW5kbGU7CisKKwkJdmRlY192ZnJhbWVfcmVhZHkodmRlYywgdmYpOworCQlrZmlmb19wdXQoJmh3LT5kaXNwbGF5X3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT5wdHNfbmFtZSwgdmYtPnB0cyk7CisKKwkJaWYgKGh3LT5pc191c2VkX3Y0bCkKKwkJCWZiLT50YXNrLT5zdWJtaXQoZmItPnRhc2ssIFRBU0tfVFlQRV9ERUMpOworCQllbHNlCisJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIodmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfVkZSQU1FX1JFQURZLCBOVUxMKTsKKworCQlwcl9pbmZvKCJbJWRdIG1wZWcxMiBFT1Mgbm90aWZ5LlxuIiwgKGh3LT5pc191c2VkX3Y0bCk/Y3R4LT5pZDp2ZGVjLT5pZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZtcGVnMTJfd29ya19pbXBsZW1lbnQoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3LAorCXN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBmcm9tKQoreworCWludCByOworCisJaWYgKGh3LT5kZWNfcmVzdWx0ICE9IERFQ19SRVNVTFRfRE9ORSkKKwkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19SVU5fRkxPVywKKwkJCSIlcywgcmVzdWx0PSVkLCBzdGF0dXM9JWRcbiIsIF9fZnVuY19fLAorCQkJaHctPmRlY19yZXN1bHQsIHZkZWMtPm5leHRfc3RhdHVzKTsKKwlpZiAoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9ET05FKSB7CisJCWlmICh2ZGVjLT5pbnB1dC5zd2FwX3ZhbGlkKQorCQkJaHctPmRlY19hZ2Fpbl9jbnQgPSAwOworCQl2ZGVjX3ZmcmFtZV9kaXJ0eSh2ZGVjLCBody0+Y2h1bmspOworCQlody0+Y2h1bmsgPSBOVUxMOworCX0gZWxzZSBpZiAoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9BR0FJTiAmJgorCSh2ZGVjLT5uZXh0X3N0YXR1cyAhPSBWREVDX1NUQVRVU19ESVNDT05ORUNURUQpKSB7CisJCS8qCisJCQlzdHJlYW0gYmFzZTogc3RyZWFtIGJ1ZiBlbXB0eSBvciB0aW1lb3V0CisJCQlmcmFtZSBiYXNlOiB2ZGVjX3ByZXBhcmVfaW5wdXQgZmFpbAorCQkqLworCQlpZiAoIXZkZWNfaGFzX21vcmVfaW5wdXQodmRlYykpIHsKKwkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9FT1M7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoKHZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpKSAmJgorCQkJKGVycm9yX3Byb2NfcG9saWN5ICYgMHgxKSAmJgorCQkJY2hlY2tfZGlydHlfZGF0YSh2ZGVjKSkgeworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCXJldHVybjsKKwkJfQorI2lmZGVmIEFHQUlOX0hBU19USFJFU0hPTEQKKwkJaHctPm5leHRfYWdhaW5fZmxhZyA9IDE7CisjZW5kaWYKKwkJLy9ody0+ZGVjX2FnYWluX2NudCsrOworCX0gZWxzZSBpZiAoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9HRVRfREFUQSAmJgorCQl2ZGVjLT5uZXh0X3N0YXR1cyAhPSBWREVDX1NUQVRVU19ESVNDT05ORUNURUQpIHsKKwkJaWYgKCF2ZGVjX2hhc19tb3JlX2lucHV0KHZkZWMpKSB7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRU9TOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQlyZXR1cm47CisJCX0KKwkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WTERfREVUQUlMLAorCQkJIiVzIERFQ19SRVNVTFRfR0VUX0RBVEEgJXggJXggJXhcbiIsCisJCQlfX2Z1bmNfXywKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCksCisJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSk7CisJCXZkZWNfdmZyYW1lX2RpcnR5KHZkZWMsIGh3LT5jaHVuayk7CisJCWh3LT5jaHVuayA9IE5VTEw7CisJCXZkZWNfY2xlYW5faW5wdXQodmRlYyk7CisKKwkJciA9IHZkZWNfcHJlcGFyZV9pbnB1dCh2ZGVjLCAmaHctPmNodW5rKTsKKwkJaWYgKHIgPCAwKSB7CisJCQlody0+aW5wdXRfZW1wdHkrKzsKKwkJCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfR0VUX0RBVEE7CisJCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RFQ19ERVRBSUwsCisJCQkJIiVzOiBJbnN1ZmZpY2llbnQgZGF0YSwgZ2V0IGRhdGEgcmV0cnlcbiIsIF9fZnVuY19fKTsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJcmV0dXJuOworCQl9CisJCWh3LT5pbnB1dF9lbXB0eSA9IDA7CisJCWlmICh2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpICYmIChody0+Y2h1bmsgIT0gTlVMTCkpIHsKKwkJCXIgPSBody0+Y2h1bmstPnNpemUgKworCQkJCShody0+Y2h1bmstPm9mZnNldCAmIChWREVDX0ZJRk9fQUxJR04gLSAxKSk7CisJCQlXUklURV9WUkVHKFZJRkZfQklUX0NOVCwgciAqIDgpOworCQkJaWYgKHZkZWMtPm12ZnJtKQorCQkJCXZkZWMtPm12ZnJtLT5mcmFtZV9zaXplICs9IGh3LT5jaHVuay0+c2l6ZTsKKwkJfQorCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJIiVzOiAleCAleCAleCBzaXplICVkLCBiaXRjbnQgJWRcbiIsCisJCQlfX2Z1bmNfXywKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCksCisJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSwKKwkJCXIsIFJFQURfVlJFRyhWSUZGX0JJVF9DTlQpKTsKKwkJdmRlY19lbmFibGVfaW5wdXQodmRlYyk7CisJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9OT05FOworCQlody0+bGFzdF92bGRfbGV2ZWwgPSAwOworCQlzdGFydF9wcm9jZXNzX3RpbWVfc2V0KGh3KTsKKwkJaHctPmluaXRfZmxhZyA9IDE7CisJCW1vZF90aW1lcigmaHctPmNoZWNrX3RpbWVyLCBqaWZmaWVzICsgQ0hFQ0tfSU5URVJWQUwpOworCQlXUklURV9WUkVHKE1SRUdfQlVGRkVST1VULCAwKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9GT1JDRV9FWElUKSB7CisJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRVJST1IsCisJCQkiJXM6IGZvcmNlIGV4aXRcbiIsIF9fZnVuY19fKTsKKwkJaWYgKGh3LT5zdGF0ICYgU1RBVF9JU1JfUkVHKSB7CisJCQlhbXZkZWNfc3RvcCgpOworCQkJdmRlY19mcmVlX2lycShWREVDX0lSUV8xLCAodm9pZCAqKWh3KTsKKwkJCWh3LT5zdGF0ICY9IH5TVEFUX0lTUl9SRUc7CisJCX0KKwl9IGVsc2UgaWYgKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfRU9TKSB7CisJCWlmIChody0+c3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJCWFtdmRlY19zdG9wKCk7CisJCQlody0+c3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwkJfQorCQlody0+ZW9zID0gMTsKKwkJdmRlY192ZnJhbWVfZGlydHkodmRlYywgaHctPmNodW5rKTsKKwkJaHctPmNodW5rID0gTlVMTDsKKwkJdmRlY19jbGVhbl9pbnB1dCh2ZGVjKTsKKwkJZmx1c2hfb3V0cHV0KGh3KTsKKwkJbm90aWZ5X3Y0bF9lb3ModmRlYyk7CisKKwkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSIlczogZW5kIG9mIHN0cmVhbSwgbnVtICVkKCVkKVxuIiwKKwkJCV9fZnVuY19fLCBody0+ZGlzcF9udW0sIGh3LT5kZWNfbnVtKTsKKwl9CisJaWYgKGh3LT5zdGF0ICYgU1RBVF9WREVDX1JVTikgeworCQlhbXZkZWNfc3RvcCgpOworCQlody0+c3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwl9CisJLypkaXNhYmxlIG1ib3ggaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfTUFTSywgMCk7CisJZGVsX3RpbWVyX3N5bmMoJmh3LT5jaGVja190aW1lcik7CisJaHctPnN0YXQgJj0gflNUQVRfVElNRVJfQVJNOworCXdhaXRfdm1tcGVnMTJfc2VhcmNoX2RvbmUoaHcpOworCisJaWYgKGZyb20gPT0gMSkgeworCQkvKlRoaXMgaXMgYSB0aW1lb3V0IHdvcmsqLworCQlpZiAod29ya19wZW5kaW5nKCZody0+d29yaykpIHsKKwkJCXByX2VycigidGltZW91dCB3b3JrIHJldHVybiBiZWZvciBmaW5pc2hpbmcuIik7CisJCQkvKgorCQkJICogVGhlIHZtcGVnMTJfd29yayBhcnJpdmVzIGF0IHRoZSBsYXN0IHNlY29uZCwKKwkJCSAqIGdpdmUgaXQgYSBjaGFuY2UgdG8gaGFuZGxlIHRoZSBzY2VuYXJpby4KKwkJCSAqLworCQkJcmV0dXJuOworCQl9CisJfQorCisJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKQorCQl2ZGVjX2NvcmVfZmluaXNoX3J1bih2ZGVjLCBDT1JFX01BU0tfVkRFQ18xKTsKKwllbHNlCisJCXZkZWNfY29yZV9maW5pc2hfcnVuKHZkZWMsIENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQyk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmh3LT53YWl0X3EpOworCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShody0+djRsMl9jdHgpOworCisJCWlmIChjdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSAmJgorCQkJIWh3LT52NGxfcGFyYW1zX3BhcnNlZCkKKwkJCXZkZWNfdjRsX3dyaXRlX2ZyYW1lX3N5bmMoY3R4KTsKKwl9CisKKwlpZiAoaHctPnZkZWNfY2IpCisJCWh3LT52ZGVjX2NiKHZkZWMsIGh3LT52ZGVjX2NiX2FyZyk7Cit9CisKK3N0YXRpYyB2b2lkIHZtcGVnMTJfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3ID0KKwljb250YWluZXJfb2Yod29yaywgc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MsIHdvcmspOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGh3KTsKKworCXZtcGVnMTJfd29ya19pbXBsZW1lbnQoaHcsIHZkZWMsIDApOworfQorc3RhdGljIHZvaWQgdm1wZWcxMl90aW1lb3V0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodyA9CisJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB2ZGVjX21wZWcxMl9od19zLCB0aW1lb3V0X3dvcmspOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGh3KTsKKworCWlmICh3b3JrX3BlbmRpbmcoJmh3LT53b3JrKSkgeworCQlwcl9lcnIoInRpbWVvdXQgd29yayByZXR1cm4gYmVmb3IgZXhlY3V0aW5nLiIpOworCQlyZXR1cm47CisJfQorCisJaHctPnRpbWVvdXRfcHJvY2Vzc2luZyA9IDE7CisJdm1wZWcxMl93b3JrX2ltcGxlbWVudChodywgdmRlYywgMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZtcGVnX3ZmX3BlZWsodm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCB2ZnJhbWVfcyAqdmY7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IG9wX2FyZzsKKwlzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcgPQorCShzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJaHctPnBlZWtfbnVtKys7CisKKwlpZiAoa2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKSA+IFZGX1BPT0xfU0laRSkgeworCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1JVTl9GTE9XLAorCQkJImtmaWZvIGxlbjolZCBpbnZhaWxkLCBwZWVrIGVycm9yXG4iLAorCQkJa2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChrZmlmb19wZWVrKCZody0+ZGlzcGxheV9xLCAmdmYpKQorCQlyZXR1cm4gdmY7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyAqdm1wZWdfdmZfZ2V0KHZvaWQgKm9wX2FyZykKK3sKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBvcF9hcmc7CisJc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3ID0KKwkJKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICopdmRlYy0+cHJpdmF0ZTsKKworCWh3LT5nZXRfbnVtKys7CisJaWYgKGtmaWZvX2dldCgmaHctPmRpc3BsYXlfcSwgJnZmKSkgeworCQlBVFJBQ0VfQ09VTlRFUihody0+ZGlzcF9xX25hbWUsIGtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSkpOworCQlyZXR1cm4gdmY7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IG1wZWcxMl92YWxpZF92Zl9jaGVjayhzdHJ1Y3QgdmZyYW1lX3MgKnZmLCBzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcpCit7CisJaW50IGk7CisKKwlpZiAodmYgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgVkZfUE9PTF9TSVpFOyBpKyspIHsKKwkJaWYgKHZmID09ICZody0+dmZwb29sW2ldKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2bXBlZ192Zl9wdXQoc3RydWN0IHZmcmFtZV9zICp2Ziwgdm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBvcF9hcmc7CisJc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3ID0KKwkJKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICopdmRlYy0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFtcGVnMTJfdmFsaWRfdmZfY2hlY2sodmYsIGh3KSkgeworCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0VSUk9SLAorCQkJImludmFsaWQgdmY6ICVseFxuIiwgKHVsb25nKXZmKTsKKwkJcmV0dXJuIDsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5sb2NrLCBmbGFncyk7CisJaHctPnZmYnVmX3VzZVt2Zi0+aW5kZXhdLS07CisJaWYgIChody0+dmZidWZfdXNlW3ZmLT5pbmRleF0gPCAwKSB7CisJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRVJST1IsCisJCQkid2FybjogdmYgJWx4LCBpbmRleCAlZCBwdXRiYWNrIHJlcGV0aXRpdmUsIHNldCB1c2UgdG8gMFxuIiwgKHVsb25nKXZmLCB2Zi0+aW5kZXgpOworCQlody0+dmZidWZfdXNlW3ZmLT5pbmRleF0gPSAwOworCX0KKwlody0+cHV0X251bSsrOworCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfUlVOX0ZMT1csCisJCSIlczogdmY6ICVseCwgaW5kZXg6ICVkLCB1c2U6ICVkXG4iLCBfX2Z1bmNfXywgKHVsb25nKXZmLAorCQl2Zi0+aW5kZXgsIGh3LT52ZmJ1Zl91c2VbdmYtPmluZGV4XSk7CisJa2ZpZm9fcHV0KCZody0+bmV3ZnJhbWVfcSwKKwkJKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwlBVFJBQ0VfQ09VTlRFUihody0+bmV3X3FfbmFtZSwga2ZpZm9fbGVuKCZody0+bmV3ZnJhbWVfcSkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5sb2NrLCBmbGFncyk7Cit9CisKKworc3RhdGljIGludCB2bXBlZ19ldmVudF9jYihpbnQgdHlwZSwgdm9pZCAqZGF0YSwgdm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBvcF9hcmc7CisKKwlpZiAodHlwZSAmIFZGUkFNRV9FVkVOVF9SRUNFSVZFUl9SRVFfU1RBVEUpIHsKKwkJc3RydWN0IHByb3ZpZGVyX3N0YXRlX3JlcV9zICpyZXEgPQorCQkJKHN0cnVjdCBwcm92aWRlcl9zdGF0ZV9yZXFfcyAqKWRhdGE7CisJCWlmIChyZXEtPnJlcV90eXBlID09IFJFUV9TVEFURV9TRUNVUkUpCisJCQlyZXEtPnJlcV9yZXN1bHRbMF0gPSB2ZGVjX3NlY3VyZSh2ZGVjKTsKKwkJZWxzZQorCQkJcmVxLT5yZXFfcmVzdWx0WzBdID0gMHhmZmZmZmZmZjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bXBlZ192Zl9zdGF0ZXMoc3RydWN0IHZmcmFtZV9zdGF0ZXMgKnN0YXRlcywgdm9pZCAqb3BfYXJnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IG9wX2FyZzsKKwlzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcgPQorCQkoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKil2ZGVjLT5wcml2YXRlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5sb2NrLCBmbGFncyk7CisKKwlzdGF0ZXMtPnZmX3Bvb2xfc2l6ZSA9IFZGX1BPT0xfU0laRTsKKwlzdGF0ZXMtPmJ1Zl9mcmVlX251bSA9IGtmaWZvX2xlbigmaHctPm5ld2ZyYW1lX3EpOworCXN0YXRlcy0+YnVmX2F2YWlsX251bSA9IGtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSk7CisJc3RhdGVzLT5idWZfcmVjeWNsZV9udW0gPSAwOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiBnZXRfcmF0aW9fY29udHJvbChzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcpCit7CisJdTMyIGFyX2JpdHM7CisKKwl1MzIgcmF0aW9fY29udHJvbDsKKworCWFyX2JpdHMgPSBody0+cGl4ZWxfcmF0aW87CisKKwlpZiAoYXJfYml0cyA9PSAweDIpCisJCXJhdGlvX2NvbnRyb2wgPSAweGMwIDw8IERJU1BfUkFUSU9fQVNQRUNUX1JBVElPX0JJVDsKKworCWVsc2UgaWYgKGFyX2JpdHMgPT0gMHgzKQorCQlyYXRpb19jb250cm9sID0gMHg5MCA8PCBESVNQX1JBVElPX0FTUEVDVF9SQVRJT19CSVQ7CisKKwllbHNlIGlmIChhcl9iaXRzID09IDB4NCkKKwkJcmF0aW9fY29udHJvbCA9IDB4NzQgPDwgRElTUF9SQVRJT19BU1BFQ1RfUkFUSU9fQklUOworCWVsc2UKKwkJcmF0aW9fY29udHJvbCA9IDA7CisKKwlyZXR1cm4gcmF0aW9fY29udHJvbDsKK30KKworc3RhdGljIGludCB2bW1wZWcxMl9kZWNfc3RhdHVzKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHN0cnVjdCB2ZGVjX2luZm8gKnZzdGF0dXMpCit7CisJc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3ID0KKwkoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKil2ZGVjLT5wcml2YXRlOworCisJaWYgKCFodykKKwkJcmV0dXJuIC0xOworCisJdnN0YXR1cy0+ZnJhbWVfd2lkdGggPSBody0+ZnJhbWVfd2lkdGg7CisJdnN0YXR1cy0+ZnJhbWVfaGVpZ2h0ID0gaHctPmZyYW1lX2hlaWdodDsKKwlpZiAoaHctPmZyYW1lX2R1ciAhPSAwKQorCQl2c3RhdHVzLT5mcmFtZV9yYXRlID0gKCg5NjAwMCAqIDEwIC8gaHctPmZyYW1lX2R1cikgJSAxMCkgPCA1ID8KKwkJICAgICAgICAgICAgICAgICAgICA5NjAwMCAvIGh3LT5mcmFtZV9kdXIgOiAoOTYwMDAgLyBody0+ZnJhbWVfZHVyICsxKTsKKwllbHNlCisJCXZzdGF0dXMtPmZyYW1lX3JhdGUgPSAtMTsKKwl2c3RhdHVzLT5lcnJvcl9jb3VudCA9IFJFQURfVlJFRyhBVl9TQ1JBVENIX0MpOworCXZzdGF0dXMtPnN0YXR1cyA9IGh3LT5zdGF0OworCXZzdGF0dXMtPmJpdF9yYXRlID0gaHctPmd2cy5iaXRfcmF0ZTsKKwl2c3RhdHVzLT5mcmFtZV9kdXIgPSBody0+ZnJhbWVfZHVyOworCXZzdGF0dXMtPmZyYW1lX2RhdGEgPSBody0+Z3ZzLmZyYW1lX2RhdGE7CisJdnN0YXR1cy0+dG90YWxfZGF0YSA9IGh3LT5ndnMudG90YWxfZGF0YTsKKwl2c3RhdHVzLT5mcmFtZV9jb3VudCA9IGh3LT5ndnMuZnJhbWVfY291bnQ7CisJdnN0YXR1cy0+ZXJyb3JfZnJhbWVfY291bnQgPSBody0+Z3ZzLmVycm9yX2ZyYW1lX2NvdW50OworCXZzdGF0dXMtPmRyb3BfZnJhbWVfY291bnQgPSBody0+ZHJvcF9mcmFtZV9jb3VudDsKKwl2c3RhdHVzLT5pX2RlY29kZWRfZnJhbWVzID0gaHctPmd2cy5pX2RlY29kZWRfZnJhbWVzOworCXZzdGF0dXMtPmlfbG9zdF9mcmFtZXMgPSBody0+Z3ZzLmlfbG9zdF9mcmFtZXM7CisJdnN0YXR1cy0+aV9jb25jZWFsZWRfZnJhbWVzID0gaHctPmd2cy5pX2NvbmNlYWxlZF9mcmFtZXM7CisJdnN0YXR1cy0+cF9kZWNvZGVkX2ZyYW1lcyA9IGh3LT5ndnMucF9kZWNvZGVkX2ZyYW1lczsKKwl2c3RhdHVzLT5wX2xvc3RfZnJhbWVzID0gaHctPmd2cy5wX2xvc3RfZnJhbWVzOworCXZzdGF0dXMtPnBfY29uY2VhbGVkX2ZyYW1lcyA9IGh3LT5ndnMucF9jb25jZWFsZWRfZnJhbWVzOworCXZzdGF0dXMtPmJfZGVjb2RlZF9mcmFtZXMgPSBody0+Z3ZzLmJfZGVjb2RlZF9mcmFtZXM7CisJdnN0YXR1cy0+Yl9sb3N0X2ZyYW1lcyA9IGh3LT5ndnMuYl9sb3N0X2ZyYW1lczsKKwl2c3RhdHVzLT5iX2NvbmNlYWxlZF9mcmFtZXMgPSBody0+Z3ZzLmJfY29uY2VhbGVkX2ZyYW1lczsKKwl2c3RhdHVzLT50b3RhbF9kYXRhID0gaHctPmd2cy50b3RhbF9kYXRhOworCXZzdGF0dXMtPnNhbXBfY250ID0gaHctPmd2cy5zYW1wX2NudDsKKwl2c3RhdHVzLT5vZmZzZXQgPSBody0+Z3ZzLm9mZnNldDsKKwl2c3RhdHVzLT5yYXRpb19jb250cm9sID0gZ2V0X3JhdGlvX2NvbnRyb2woaHcpOworCisJc25wcmludGYodnN0YXR1cy0+dmRlY19uYW1lLCBzaXplb2YodnN0YXR1cy0+dmRlY19uYW1lKSwKKwkJCSIlcyIsIERSSVZFUl9OQU1FKTsKKworCXJldHVybiAwOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHZtcGVnMTJfY2FudmFzX2luaXQoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3KQoreworCWludCBpLCByZXQ7CisJdTMyIGNhbnZhc193aWR0aCwgY2FudmFzX2hlaWdodDsKKwl1MzIgZGVjYnVmX3NpemUsIGRlY2J1Zl95X3NpemUsIGRlY2J1Zl91dl9zaXplOworCXVuc2lnbmVkIGxvbmcgZGVjYnVmX3N0YXJ0OworCS8qdTMyIGRpc3BfYWRkciA9IDB4ZmZmZmZmZmY7Ki8KKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisKKwlpZiAoYnVmX3NpemUgPD0gMHgwMDQwMDAwMCkgeworCQkvKiBTRCBvbmx5ICovCisJCWNhbnZhc193aWR0aCA9IDc2ODsKKwkJY2FudmFzX2hlaWdodCA9IDU3NjsKKwkJZGVjYnVmX3lfc2l6ZSA9IDB4ODAwMDA7CisJCWRlY2J1Zl91dl9zaXplID0gMHgyMDAwMDsKKwkJZGVjYnVmX3NpemUgPSAweDEwMDAwMDsKKwl9IGVsc2UgeworCQkvKiBIRCAmIFNEICovCisJCWNhbnZhc193aWR0aCA9IDE5MjA7CisJCWNhbnZhc19oZWlnaHQgPSAxMDg4OworCQlkZWNidWZfeV9zaXplID0gMHgyMDAwMDA7CisJCWRlY2J1Zl91dl9zaXplID0gMHg4MDAwMDsKKwkJZGVjYnVmX3NpemUgPSAweDMwMDAwMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaHctPmJ1Zl9udW0gKyAxOyBpKyspIHsKKwkJdW5zaWduZWQgY2FudmFzOworCisJCWlmIChpID09IGh3LT5idWZfbnVtKSAvKiBTV0FQJkNDQlVGJk1BVElSWCZNViAqLworCQkJZGVjYnVmX3NpemUgPSBXT1JLU1BBQ0VfU0laRTsKKworCQlpZiAoaHctPmlzX3VzZWRfdjRsICYmICEoaSA9PSBody0+YnVmX251bSkpIHsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgeworCQkJcmV0ID0gZGVjb2Rlcl9ibW11X2JveF9hbGxvY19idWZfcGh5KGh3LT5tbV9ibGtfaGFuZGxlLCBpLAorCQkJCQlkZWNidWZfc2l6ZSwgRFJJVkVSX05BTUUsICZkZWNidWZfc3RhcnQpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlwcl9lcnIoImJtbXUgYWxsb2MgZmFpbGVkISBzaXplIDB4JWQgIGlkeCAlZFxuIiwKKwkJCQkJZGVjYnVmX3NpemUsIGkpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKworCQlpZiAoaSA9PSBody0+YnVmX251bSkgeworCQkJaHctPmNjX2J1Zl9zaXplID0gQVVYX0JVRl9BTElHTihDQ0JVRl9TSVpFKTsKKwkJCWh3LT5jY2J1Zl9waHlBZGRyZXNzX3ZpcnQgPSBkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCQkJICBody0+Y2NfYnVmX3NpemUsICZody0+Y2NidWZfcGh5QWRkcmVzcywKKwkJCQkJCSAgR0ZQX0tFUk5FTCk7CisJCQlpZiAoaHctPmNjYnVmX3BoeUFkZHJlc3NfdmlydCA9PSBOVUxMKSB7CisJCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFsbG9jIGNjIGJ1ZmZlclxuIiwgX19mdW5jX18pOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJaHctPmJ1Zl9zdGFydCA9IGRlY2J1Zl9zdGFydDsKKwkJCVdSSVRFX1ZSRUcoTVJFR19DT19NVl9TVEFSVCwgaHctPmJ1Zl9zdGFydCk7CisJCQlXUklURV9WUkVHKE1SRUdfQ0NfQUREUiwgaHctPmNjYnVmX3BoeUFkZHJlc3MpOworCQl9IGVsc2UgeworCQkJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCQkJdW5zaWduZWQgdG1wOworCQkJCWlmIChjYW52YXNfdShody0+Y2FudmFzX3NwZWNbaV0pID09IDB4ZmYpIHsKKwkJCQkJdG1wID0KKwkJCQkJCXZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX1ZERUNfMSwgdmRlYy0+aWQpOworCQkJCQlody0+Y2FudmFzX3NwZWNbaV0gJj0gfigweGZmZmYgPDwgOCk7CisJCQkJCWh3LT5jYW52YXNfc3BlY1tpXSB8PSB0bXAgPDwgODsKKwkJCQkJaHctPmNhbnZhc19zcGVjW2ldIHw9IHRtcCA8PCAxNjsKKwkJCQl9CisJCQkJaWYgKGNhbnZhc195KGh3LT5jYW52YXNfc3BlY1tpXSkgPT0gMHhmZikgeworCQkJCQl0bXAgPQorCQkJCQkJdmRlYy0+Z2V0X2NhbnZhc19leChDT1JFX01BU0tfVkRFQ18xLCB2ZGVjLT5pZCk7CisJCQkJCWh3LT5jYW52YXNfc3BlY1tpXSAmPSB+MHhmZjsKKwkJCQkJaHctPmNhbnZhc19zcGVjW2ldIHw9IHRtcDsKKwkJCQl9CisJCQkJY2FudmFzID0gaHctPmNhbnZhc19zcGVjW2ldOworCQkJfSBlbHNlIHsKKwkJCQljYW52YXMgPSB2ZGVjLT5nZXRfY2FudmFzKGksIDIpOworCQkJCWh3LT5jYW52YXNfc3BlY1tpXSA9IGNhbnZhczsKKwkJCX0KKworCQkJaHctPmNhbnZhc19jb25maWdbaV1bMF0ucGh5X2FkZHIgPQorCQkJCWRlY2J1Zl9zdGFydDsKKwkJCWh3LT5jYW52YXNfY29uZmlnW2ldWzBdLndpZHRoID0KKwkJCQljYW52YXNfd2lkdGg7CisJCQlody0+Y2FudmFzX2NvbmZpZ1tpXVswXS5oZWlnaHQgPQorCQkJCWNhbnZhc19oZWlnaHQ7CisJCQlody0+Y2FudmFzX2NvbmZpZ1tpXVswXS5ibG9ja19tb2RlID0KKwkJCQlody0+Y2FudmFzX21vZGU7CisJCQlody0+Y2FudmFzX2NvbmZpZ1tpXVswXS5lbmRpYW4gPQorCQkJCShody0+Y2FudmFzX21vZGUgPT0gQ0FOVkFTX0JMS01PREVfTElORUFSKT83OjA7CisKKwkJCWNvbmZpZ19jYXZfbHV0KGNhbnZhc195KGNhbnZhcyksCisJCQkmaHctPmNhbnZhc19jb25maWdbaV1bMF0sIFZERUNfMSk7CisKKwkJCWh3LT5jYW52YXNfY29uZmlnW2ldWzFdLnBoeV9hZGRyID0KKwkJCQlkZWNidWZfc3RhcnQgKyBkZWNidWZfeV9zaXplOworCQkJaHctPmNhbnZhc19jb25maWdbaV1bMV0ud2lkdGggPSBjYW52YXNfd2lkdGg7CisJCQlody0+Y2FudmFzX2NvbmZpZ1tpXVsxXS5oZWlnaHQgPSBjYW52YXNfaGVpZ2h0IC8gMjsKKwkJCWh3LT5jYW52YXNfY29uZmlnW2ldWzFdLmJsb2NrX21vZGUgPSBody0+Y2FudmFzX21vZGU7CisJCQlody0+Y2FudmFzX2NvbmZpZ1tpXVsxXS5lbmRpYW4gPQorCQkJCShody0+Y2FudmFzX21vZGUgPT0gQ0FOVkFTX0JMS01PREVfTElORUFSKT83OjA7CisKKwkJCWNvbmZpZ19jYXZfbHV0KGNhbnZhc191KGNhbnZhcyksCisJCQkJJmh3LT5jYW52YXNfY29uZmlnW2ldWzFdLCBWREVDXzEpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2bXBlZzJfZHVtcF9zdGF0ZShzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodyA9CisJCShzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqKSh2ZGVjLT5wcml2YXRlKTsKKwl1MzIgaTsKKwlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiPT09PT09ICVzXG4iLCBfX2Z1bmNfXyk7CisJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIndpZHRoL2hlaWdodCAoJWQvJWQpLGlfZmlyc3QgJWQsIGJ1Zl9udW0gJWQsIHJ1bl9mbGFnICVkXG4iLAorCQlody0+ZnJhbWVfd2lkdGgsCisJCWh3LT5mcmFtZV9oZWlnaHQsCisJCWh3LT5maXJzdF9pX2ZyYW1lX3JlYWR5LAorCQlody0+YnVmX251bSwKKwkJaHctPnJ1bl9mbGFnCisJCSk7CisJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJImlzX2ZyYW1lYmFzZSglZCksIGVvcyAlZCwgc3RhdGUgMHgleCwgZGVjX3Jlc3VsdCAweCV4IGRlY19mcm0gJWQgcHV0X2ZybSAlZCBydW4gJWQgbm90X3J1bl9yZWFkeSAlZCxpbnB1dF9lbXB0eSAlZFxuIiwKKwkJdmRlY19mcmFtZV9iYXNlZCh2ZGVjKSwKKwkJaHctPmVvcywKKwkJaHctPnN0YXQsCisJCWh3LT5kZWNfcmVzdWx0LAorCQlody0+ZGVjX251bSwKKwkJaHctPnB1dF9udW0sCisJCWh3LT5ydW5fY291bnQsCisJCWh3LT5ub3RfcnVuX3JlYWR5LAorCQlody0+aW5wdXRfZW1wdHkKKwkJKTsKKworCWZvciAoaSA9IDA7IGkgPCBody0+YnVmX251bTsgaSsrKSB7CisJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkiaW5kZXggJWQsIHVzZWQgJWQsIHJlZiAlZFxuIiwgaSwKKwkJCWh3LT52ZmJ1Zl91c2VbaV0sIGh3LT5yZWZfdXNlW2ldKTsKKwl9CisKKwlpZiAoIWh3LT5pc191c2VkX3Y0bCAmJiB2Zl9nZXRfcmVjZWl2ZXIodmRlYy0+dmZfcHJvdmlkZXJfbmFtZSkpIHsKKwkJZW51bSByZWNldml2ZXJfc3RhcnRfZSBzdGF0ZSA9CisJCXZmX25vdGlmeV9yZWNlaXZlcih2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1FVUkVZX1NUQVRFLAorCQkJTlVMTCk7CisJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkiXG5yZWNlaXZlciglcykgc3RhdGUgJWRcbiIsCisJCQl2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJc3RhdGUpOworCX0KKwlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCSIlcywgbmV3cSglZC8lZCksIGRpc3BxKCVkLyVkKSB2ZiBwcmUvZ2V0L3B1dCAoJWQvJWQvJWQpLGRyb3A9JWQsIGJ1ZmZlcl9ub3RfcmVhZHkgJWRcbiIsCisJX19mdW5jX18sCisJa2ZpZm9fbGVuKCZody0+bmV3ZnJhbWVfcSksCisJVkZfUE9PTF9TSVpFLAorCWtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSksCisJVkZfUE9PTF9TSVpFLAorCWh3LT5kaXNwX251bSwKKwlody0+Z2V0X251bSwKKwlody0+cHV0X251bSwKKwlody0+ZHJvcF9mcmFtZV9jb3VudCwKKwlody0+YnVmZmVyX25vdF9yZWFkeQorCSk7CisJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIlZJRkZfQklUX0NOVD0weCV4XG4iLAorCQlSRUFEX1ZSRUcoVklGRl9CSVRfQ05UKSk7CisJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIlZMRF9NRU1fVklGSUZPX0xFVkVMPTB4JXhcbiIsCisJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCkpOworCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSJWTERfTUVNX1ZJRklGT19XUD0weCV4XG4iLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApKTsKKwlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiVkxEX01FTV9WSUZJRk9fUlA9MHgleFxuIiwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSk7CisJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIlBBUlNFUl9WSURFT19SUD0weCV4XG4iLAorCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfcnApKTsKKwlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiUEFSU0VSX1ZJREVPX1dQPTB4JXhcbiIsCisJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCkpOworCisJaWYgKHZkZWNfZnJhbWVfYmFzZWQodmRlYykgJiYKKwkJZGVidWdfZW5hYmxlICYgUFJJTlRfRlJBTUVCQVNFX0RBVEEKKwkJKSB7CisJCWludCBqajsKKwkJaWYgKGh3LT5jaHVuayAmJiBody0+Y2h1bmstPmJsb2NrICYmCisJCQlody0+Y2h1bmstPnNpemUgPiAwKSB7CisJCQl1OCAqZGF0YSA9IE5VTEw7CisKKwkJCWlmICghaHctPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQkJCWRhdGEgPSBjb2RlY19tbV92bWFwKGh3LT5jaHVuay0+YmxvY2stPnN0YXJ0ICsKKwkJCQkJaHctPmNodW5rLT5vZmZzZXQsIGh3LT5jaHVuay0+c2l6ZSk7CisJCQllbHNlCisJCQkJZGF0YSA9ICgodTggKilody0+Y2h1bmstPmJsb2NrLT5zdGFydF92aXJ0KSArCisJCQkJCWh3LT5jaHVuay0+b2Zmc2V0OworCisJCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJCSJmcmFtZSBkYXRhIHNpemUgMHgleFxuIiwKKwkJCQlody0+Y2h1bmstPnNpemUpOworCQkJZm9yIChqaiA9IDA7IGpqIDwgaHctPmNodW5rLT5zaXplOyBqaisrKSB7CisJCQkJaWYgKChqaiAmIDB4ZikgPT0gMCkKKwkJCQkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCQkJCVBSSU5UX0ZSQU1FQkFTRV9EQVRBLAorCQkJCQkJIiUwNng6IiwgamopOworCQkJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJUFJJTlRfRlJBTUVCQVNFX0RBVEEsCisJCQkJCSIlMDJ4ICIsIGRhdGFbampdKTsKKwkJCQlpZiAoKChqaiArIDEpICYgMHhmKSA9PSAwKQorCQkJCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLAorCQkJCQkJUFJJTlRfRlJBTUVCQVNFX0RBVEEsICJcbiIpOworCQkJfQorCisJCQlpZiAoIWh3LT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJCQljb2RlY19tbV91bm1hcF9waHlhZGRyKGRhdGEpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCByZXNldF9wcm9jZXNzX3RpbWUoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3KQoreworCWlmIChody0+c3RhcnRfcHJvY2Vzc190aW1lKSB7CisJCXVuc2lnbmVkIHByb2Nlc3NfdGltZSA9CisJCQkxMDAwICogKGppZmZpZXMgLSBody0+c3RhcnRfcHJvY2Vzc190aW1lKSAvIEhaOworCQlody0+c3RhcnRfcHJvY2Vzc190aW1lID0gMDsKKwkJaWYgKHByb2Nlc3NfdGltZSA+IG1heF9wcm9jZXNzX3RpbWVbREVDT0RFX0lEKGh3KV0pCisJCQltYXhfcHJvY2Vzc190aW1lW0RFQ09ERV9JRChodyldID0gcHJvY2Vzc190aW1lOworCX0KK30KKworc3RhdGljIHZvaWQgc3RhcnRfcHJvY2Vzc190aW1lX3NldChzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcpCit7CisJaWYgKChody0+cmVmc1sxXSAhPSAtMSkgJiYgKGh3LT5yZWZzWzBdID09IC0xKSkKKwkJaHctPmRlY29kZV90aW1lb3V0X2NvdW50ID0gMTsKKwllbHNlCisJCWh3LT5kZWNvZGVfdGltZW91dF9jb3VudCA9IDEwOworCWh3LT5zdGFydF9wcm9jZXNzX3RpbWUgPSBqaWZmaWVzOworfQorc3RhdGljIHZvaWQgdGltZW91dF9wcm9jZXNzKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodykKK3sKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisKKwlpZiAod29ya19wZW5kaW5nKCZody0+d29yaykgfHwKKwkgICAgd29ya19idXN5KCZody0+d29yaykgfHwKKwkgICAgd29ya19idXN5KCZody0+dGltZW91dF93b3JrKSB8fAorCSAgICB3b3JrX3BlbmRpbmcoJmh3LT50aW1lb3V0X3dvcmspKSB7CisJCXByX2VycigiJXMgbXBlZzEyWyVkXSB0aW1lb3V0X3Byb2Nlc3MgcmV0dXJuIGJlZm9yIGRvIGFueXRoaW5nLlxuIixfX2Z1bmNfXywgdmRlYy0+aWQpOworCQlyZXR1cm47CisJfQorCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisJYW12ZGVjX3N0b3AoKTsKKwlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0VSUk9SLAorCQkiJXMgZGVjb2RlciB0aW1lb3V0LCBzdGF0dXM9JWQsIGxldmVsPSVkXG4iLAorCQlfX2Z1bmNfXywgdmRlYy0+c3RhdHVzLCBSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpKTsKKwlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwlpZiAoKGh3LT5yZWZzWzFdICE9IC0xKSAmJiAoaHctPnJlZnNbMF0gIT0gLTEpKQorCQlody0+Zmlyc3RfaV9mcmFtZV9yZWFkeSA9IDA7CisKKwkvKgorCSAqIEluIHRoaXMgdmVyeSB0aW1lb3V0IHBvaW50LHRoZSB2bXBlZzEyX3dvcmsgYXJyaXZlcywKKwkgKiBsZXQgaXQgdG8gaGFuZGxlIHRoZSBzY2VuYXJpby4KKwkgKi8KKwlpZiAod29ya19wZW5kaW5nKCZody0+d29yaykpIHsKKwkJcHJfZXJyKCIlcyBtcGVnMTJbJWRdIHJldHVybiBiZWZvciBzY2hlZHVsZS4iLCBfX2Z1bmNfXywgdmRlYy0+aWQpOworCQlyZXR1cm47CisJfQorCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPnRpbWVvdXRfd29yayk7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3RpbWVyX2Z1bmMoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworCXN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodyA9IGNvbnRhaW5lcl9vZih0aW1lciwKKwkJc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MsIGNoZWNrX3RpbWVyKTsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisJdW5zaWduZWQgaW50IHRpbWVvdXRfdmFsID0gZGVjb2RlX3RpbWVvdXRfdmFsOworCisJaWYgKHJhZHIgIT0gMCkgeworCQlpZiAocnZhbCAhPSAwKSB7CisJCQlXUklURV9WUkVHKHJhZHIsIHJ2YWwpOworCQkJcHJfaW5mbygiV1JJVEVfVlJFRygleCwleClcbiIsIHJhZHIsIHJ2YWwpOworCQl9IGVsc2UKKwkJCXByX2luZm8oIlJFQURfVlJFRygleCk9JXhcbiIsIHJhZHIsIFJFQURfVlJFRyhyYWRyKSk7CisJCXJ2YWwgPSAwOworCQlyYWRyID0gMDsKKwl9CisKKwlpZiAoKChkZWJ1Z19lbmFibGUgJiBQUklOVF9GTEFHX1RJTUVPVVRfU1RBVFVTKSA9PSAwKSAmJgorCQkodGltZW91dF92YWwgPiAwKSAmJgorCQkoaHctPnN0YXJ0X3Byb2Nlc3NfdGltZSA+IDApICYmCisJCSgoMTAwMCAqIChqaWZmaWVzIC0gaHctPnN0YXJ0X3Byb2Nlc3NfdGltZSkgLyBIWikKKwkJCQk+IHRpbWVvdXRfdmFsKSkgeworCQlpZiAoaHctPmxhc3RfdmxkX2xldmVsID09IFJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCkpIHsKKwkJCWlmIChody0+ZGVjb2RlX3RpbWVvdXRfY291bnQgPiAwKQorCQkJCWh3LT5kZWNvZGVfdGltZW91dF9jb3VudC0tOworCQkJaWYgKGh3LT5kZWNvZGVfdGltZW91dF9jb3VudCA9PSAwKQorCQkJCXRpbWVvdXRfcHJvY2Vzcyhodyk7CisJCX0KKwkJaHctPmxhc3RfdmxkX2xldmVsID0gUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKTsKKwl9CisKKwlpZiAodmRlYy0+bmV4dF9zdGF0dXMgPT0gVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEKSB7CisJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9GT1JDRV9FWElUOworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJcHJfaW5mbygidmRlYyByZXF1ZXN0ZWQgdG8gYmUgZGlzY29ubmVjdGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW1vZF90aW1lcigmaHctPmNoZWNrX3RpbWVyLCBqaWZmaWVzICsgQ0hFQ0tfSU5URVJWQUwpOworfQorCitzdGF0aWMgaW50IHZtcGVnMTJfaHdfY3R4X3Jlc3RvcmUoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3KQoreworCXUzMiBpbmRleCA9IC0xLCBpOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqIHY0bDJfY3R4ID0gaHctPnY0bDJfY3R4OworCisJaW5kZXggPSBmaW5kX2ZyZWVfYnVmZmVyKGh3KTsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGh3LT5idWZfbnVtKQorCQlyZXR1cm4gLTE7CisJaWYgKCFody0+aW5pdF9mbGFnKSB7CisJCWlmICh2bXBlZzEyX2NhbnZhc19pbml0KGh3KSA8IDApIHsKKwkJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsICJ2bXBlZzEyX2NhbnZhc19pbml0IGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9IGVsc2UgeworCQlXUklURV9WUkVHKE1SRUdfQ09fTVZfU1RBUlQsIGh3LT5idWZfc3RhcnQpOworCQlXUklURV9WUkVHKE1SRUdfQ0NfQUREUiwgaHctPmNjYnVmX3BoeUFkZHJlc3MpOworCQlpZiAoIWh3LT5pc191c2VkX3Y0bCkgeworCQkJZm9yIChpID0gMDsgaSA8IGh3LT5idWZfbnVtOyBpKyspIHsKKwkJCQljb25maWdfY2F2X2x1dChjYW52YXNfeShody0+Y2FudmFzX3NwZWNbaV0pLAorCQkJCQkmaHctPmNhbnZhc19jb25maWdbaV1bMF0sIFZERUNfMSk7CisJCQkJY29uZmlnX2Nhdl9sdXQoY2FudmFzX3UoaHctPmNhbnZhc19zcGVjW2ldKSwKKwkJCQkJJmh3LT5jYW52YXNfY29uZmlnW2ldWzFdLCBWREVDXzEpOworCQkJfQorCQl9CisJfQorCisJLyogcHJlcGFyZSBSRUYwICYgUkVGMQorCXBvaW50cyB0byB0aGUgcGFzdCB0d28gSVAgYnVmZmVycworCXByZXBhcmUgUkVDX0NBTlZBU19BRERSIGFuZCBBTkMyX0NBTlZBU19BRERSCisJcG9pbnRzIHRvIHRoZSBvdXRwdXQgYnVmZmVyKi8KKwlXUklURV9WUkVHKE1SRUdfUkVGMCwKKwkJKGh3LT5yZWZzWzBdID09IC0xKSA/IDB4ZmZmZmZmZmYgOgorCQlody0+Y2FudmFzX3NwZWNbaHctPnJlZnNbMF1dKTsKKwlXUklURV9WUkVHKE1SRUdfUkVGMSwKKwkJKGh3LT5yZWZzWzFdID09IC0xKSA/IDB4ZmZmZmZmZmYgOgorCQlody0+Y2FudmFzX3NwZWNbaHctPnJlZnNbMV1dKTsKKwlXUklURV9WUkVHKFJFQ19DQU5WQVNfQUREUiwgaHctPmNhbnZhc19zcGVjW2luZGV4XSk7CisJV1JJVEVfVlJFRyhBTkMyX0NBTlZBU19BRERSLCBody0+Y2FudmFzX3NwZWNbaW5kZXhdKTsKKworCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfUkVTVE9SRSwKKwkiJXMscmVmMD0weCV4LCByZWYxPTB4JXgscmVjPTB4JXgsIGN0eF92YWxpZD0lZCxpbmRleD0lZFxuIiwKKwlfX2Z1bmNfXywKKwlSRUFEX1ZSRUcoTVJFR19SRUYwKSwKKwlSRUFEX1ZSRUcoTVJFR19SRUYxKSwKKwlSRUFEX1ZSRUcoUkVDX0NBTlZBU19BRERSKSwKKwlody0+Y3R4X3ZhbGlkLCBpbmRleCk7CisKKwkvKiBzZXQgdG8gbXBlZzEgZGVmYXVsdCAqLworCVdSSVRFX1ZSRUcoTVBFRzFfMl9SRUcsCisJKGh3LT5jdHhfdmFsaWQpID8gaHctPnJlZ19tcGVnMV8yX3JlZyA6IDApOworCS8qIGRpc2FibGUgUFNDQUxFIGZvciBoYXJkd2FyZSBzaGFyaW5nICovCisJV1JJVEVfVlJFRyhQU0NBTEVfQ1RSTCwgMCk7CisJLyogZm9yIE1wZWcxIGRlZmF1bHQgdmFsdWUgKi8KKwlXUklURV9WUkVHKFBJQ19IRUFEX0lORk8sCisJKGh3LT5jdHhfdmFsaWQpID8gaHctPnJlZ19waWNfaGVhZF9pbmZvIDogMHgzODApOworCS8qIGRpc2FibGUgbXBlZzQgKi8KKwlXUklURV9WUkVHKE00X0NPTlRST0xfUkVHLCAwKTsKKwkvKiBjbGVhciBtYWlsYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoQVNTSVNUX01CT1gxX0NMUl9SRUcsIDEpOworCS8qIGNsZWFyIGJ1ZmZlciBJTi9PVVQgcmVnaXN0ZXJzICovCisJV1JJVEVfVlJFRyhNUkVHX0JVRkZFUk9VVCwgMCk7CisJLyogZW5hYmxlIG1haWxib3ggaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfTUFTSywgMSk7CisJLyogc2V0IHJlZmVyZW5jZSB3aWR0aCBhbmQgaGVpZ2h0ICovCisJaWYgKChody0+ZnJhbWVfd2lkdGggIT0gMCkgJiYgKGh3LT5mcmFtZV9oZWlnaHQgIT0gMCkpCisJCVdSSVRFX1ZSRUcoTVJFR19DTUQsCisJCShody0+ZnJhbWVfd2lkdGggPDwgMTYpIHwgaHctPmZyYW1lX2hlaWdodCk7CisJZWxzZQorCQlXUklURV9WUkVHKE1SRUdfQ01ELCAwKTsKKworCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfUkVTVE9SRSwKKwkJIjB4JXgsIDB4JXgsIDB4JXgsIDB4JXgsIDB4JXgsIDB4JXhcbiIsCisJCWh3LT5mcmFtZV93aWR0aCwgaHctPmZyYW1lX2hlaWdodCwgaHctPnNlcWluZm8sCisJCWh3LT5yZWdfZl9jb2RlX3JlZywgaHctPnJlZ19zbGljZV92ZXJfcG9zX3BpY190eXBlLAorCQlody0+cmVnX21iX2luZm8pOworCisJV1JJVEVfVlJFRyhNUkVHX1BJQ19XSURUSCwgaHctPnJlZ19waWNfd2lkdGgpOworCVdSSVRFX1ZSRUcoTVJFR19QSUNfSEVJR0hULCBody0+cmVnX3BpY19oZWlnaHQpOworCVdSSVRFX1ZSRUcoTVJFR19TRVFfSU5GTywgaHctPnNlcWluZm8pOworCVdSSVRFX1ZSRUcoRl9DT0RFX1JFRywgaHctPnJlZ19mX2NvZGVfcmVnKTsKKwlXUklURV9WUkVHKFNMSUNFX1ZFUl9QT1NfUElDX1RZUEUsCisJCWh3LT5yZWdfc2xpY2VfdmVyX3Bvc19waWNfdHlwZSk7CisJV1JJVEVfVlJFRyhNQl9JTkZPLCBody0+cmVnX21iX2luZm8pOworCVdSSVRFX1ZSRUcoVkNPUF9DVFJMX1JFRywgaHctPnJlZ192Y29wX2N0cmxfcmVnKTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfSCwgaHctPnJlZ19zaWduYWxfdHlwZSk7CisKKwlpZiAoUkVBRF9WUkVHKE1SRUdfRVJST1JfQ09VTlQpICE9IDAgfHwKKwkJCVJFQURfVlJFRyhNUkVHX0ZBVEFMX0VSUk9SKSA9PSAxKQorCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1JFU1RPUkUsCisJCQkJImVycl9jbnQ6JWQgZmFfZXJyOiVkXG4iLAorCQkJCVJFQURfVlJFRyhNUkVHX0VSUk9SX0NPVU5UKSwKKwkJCQlSRUFEX1ZSRUcoTVJFR19GQVRBTF9FUlJPUikpOworCisJLyogY2xlYXIgZXJyb3IgY291bnQgKi8KKwlXUklURV9WUkVHKE1SRUdfRVJST1JfQ09VTlQsIDApOworCS8qVXNlIE1SRUdfRkFUQUxfRVJST1IgYml0MSwgdGhlIHVjb2RlIGRldGVybWluZQorCQl3aGV0aGVyIHRvIHJlcG9ydCB0aGUgaW50ZXJydXB0aW9uIG9mIHdpZHRoIGFuZAorCQloZWlnaHQgaW5mb3JtYXRpb24saW4gb3JkZXIgdG8gYmUgY29tcGF0aWJsZQorCQl3aXRoIHRoZSBvbGQgdmVyc2lvbiBvZiB1Y29kZS4KKwkJMTogUmVwb3J0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGluZm9ybWF0aW9uCisJCTA6IE5vIFJlcG9ydAorCSAgYml0MDoKKwkgICAgICAgIDE6IFVzZSBjbWEgY2MgYnVmZmVyIGZvciBuZXcgZHJpdmVyCisJICAgICAgICAwOiB1c2UgY29kZWMgbW0gY2MgYnVmZmVyIGZvciBvbGQgZHJpdmVyCisJCSovCisJV1JJVEVfVlJFRyhNUkVHX0ZBVEFMX0VSUk9SLCAzKTsKKwkvKiBjbGVhciB3YWl0IGJ1ZmZlciBzdGF0dXMgKi8KKwlXUklURV9WUkVHKE1SRUdfV0FJVF9CVUZGRVIsIDApOworI2lmZGVmIE5WMjEKKwlTRVRfVlJFR19NQVNLKE1ERUNfUElDX0RDX0NUUkwsIDE8PDE3KTsKKyNlbmRpZgorCisJLyogY2Jjcl9tZXJnZV9zd2FwX2VuICovCisJaWYgKGh3LT5pc191c2VkX3Y0bAorCQkmJiAodjRsMl9jdHgtPnFfZGF0YVtBTUxfUV9EQVRBX0RTVF0uZm10LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX05WMjEKKwkJfHwgdjRsMl9jdHgtPnFfZGF0YVtBTUxfUV9EQVRBX0RTVF0uZm10LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX05WMjFNKSkKKwkJU0VUX1ZSRUdfTUFTSyhNREVDX1BJQ19EQ19DVFJMLCAxIDw8IDE2KTsKKwllbHNlCisJCUNMRUFSX1ZSRUdfTUFTSyhNREVDX1BJQ19EQ19DVFJMLCAxIDw8IDE2KTsKKworCWlmICghaHctPmN0eF92YWxpZCkKKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0osIGh3LT51c2VyZGF0YV93cF9jdHgpOworCisJaWYgKGh3LT5jaHVuaykgeworCQkvKmZyYW1lIGJhc2VkIGlucHV0Ki8KKwkJV1JJVEVfVlJFRyhNUkVHX0lOUFVULAorCQkoaHctPmNodW5rLT5vZmZzZXQgJiA3KSB8ICgxPDw3KSB8IChody0+Y3R4X3ZhbGlkPDw2KSk7CisJfSBlbHNlIHsKKwkJLypzdHJlYW0gYmFzZWQgaW5wdXQqLworCQlXUklURV9WUkVHKE1SRUdfSU5QVVQsIChody0+Y3R4X3ZhbGlkPDw2KSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2bXBlZzEyX2xvY2FsX2luaXQoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3KQoreworCWludCBpOworCUlOSVRfS0ZJRk8oaHctPmRpc3BsYXlfcSk7CisJSU5JVF9LRklGTyhody0+bmV3ZnJhbWVfcSk7CisKKwlody0+dm1wZWcxMl9yYXRpbyA9IGh3LT52bXBlZzEyX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGlvOworCisJaHctPnZtcGVnMTJfcmF0aW82NCA9IGh3LT52bXBlZzEyX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGlvNjQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgVkZfUE9PTF9TSVpFOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IHZmcmFtZV9zICp2ZjsKKwkJdmYgPSAmaHctPnZmcG9vbFtpXTsKKwkJaHctPnZmcG9vbFtpXS5pbmRleCA9IERFQ09ERV9CVUZGRVJfTlVNX01BWDsKKwkJa2ZpZm9fcHV0KCZody0+bmV3ZnJhbWVfcSwgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgREVDT0RFX0JVRkZFUl9OVU1fTUFYOyBpKyspIHsKKwkJaHctPnZmYnVmX3VzZVtpXSA9IDA7CisJCWh3LT5yZWZfdXNlW2ldID0gMDsKKwl9CisKKworCWlmIChody0+bW1fYmxrX2hhbmRsZSkgeworCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWUoaHctPm1tX2Jsa19oYW5kbGUpOworCQlody0+bW1fYmxrX2hhbmRsZSA9IE5VTEw7CisJfQorCisJaHctPm1tX2Jsa19oYW5kbGUgPSBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2JveCgKKwkJCURSSVZFUl9OQU1FLAorCQkJMCwKKwkJCU1BWF9CTU1VX0JVRkZFUl9OVU0sCisJCQk0ICsgUEFHRV9TSElGVCwKKwkJCUNPREVDX01NX0ZMQUdTX0NNQV9DTEVBUiB8CisJCQlDT0RFQ19NTV9GTEFHU19GT1JfVkRFQ09ERVIgfAorCQkJaHctPnR2cF9mbGFnKTsKKwlody0+ZW9zID0gMDsKKwlody0+ZnJhbWVfd2lkdGggPSBody0+ZnJhbWVfaGVpZ2h0ID0gMDsKKwlody0+ZnJhbWVfZHVyID0gaHctPmZyYW1lX3Byb2cgPSAwOworCWh3LT5mcmFtZV9mb3JjZV9za2lwX2ZsYWcgPSAwOworCWh3LT53YWl0X2J1ZmZlcl9jb3VudGVyID0gMDsKKwlody0+Zmlyc3RfaV9mcmFtZV9yZWFkeSA9IDA7CisJaHctPmRlY19jb250cm9sICY9IERFQ19DT05UUk9MX0lOVEVSTkFMX01BU0s7CisJaHctPnJlZnNbMF0gPSAtMTsKKwlody0+cmVmc1sxXSA9IC0xOworCWh3LT5kaXNwX251bSA9IDA7CisJaHctPmRlY19udW0gPSAwOworCWh3LT5wdXRfbnVtID0gMDsKKwlody0+cnVuX2NvdW50ID0gMDsKKwlody0+bm90X3J1bl9yZWFkeSA9IDA7CisJaHctPmlucHV0X2VtcHR5ID0gMDsKKwlody0+cGVla19udW0gPSAwOworCWh3LT5nZXRfbnVtID0gMDsKKwlody0+ZHJvcF9mcmFtZV9jb3VudCA9IDA7CisJaHctPmJ1ZmZlcl9ub3RfcmVhZHkgPSAwOworCWh3LT5zdGFydF9wcm9jZXNzX3RpbWUgPSAwOworCWh3LT5pbml0X2ZsYWcgPSAwOworCWh3LT5kZWNfYWdhaW5fY250ID0gMDsKKwlody0+ZXJyb3JfZnJhbWVfc2tpcF9sZXZlbCA9IGVycm9yX2ZyYW1lX3NraXBfbGV2ZWw7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZody0+d2FpdF9xKTsKKwlpZiAoZGVjX2NvbnRyb2wpCisJCWh3LT5kZWNfY29udHJvbCA9IGRlY19jb250cm9sOworfQorCitzdGF0aWMgczMyIHZtcGVnMTJfaW5pdChzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcpCit7CisJaW50IHNpemU7CisJdTMyIGZ3X3NpemUgPSAxNioweDEwMDA7CisJc3RydWN0IGZpcm13YXJlX3MgKmZ3OworCisJdm1wZWcxMl9sb2NhbF9pbml0KGh3KTsKKworCWZ3ID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IGZpcm13YXJlX3MpICsgZndfc2l6ZSk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGZ3KSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcl9kZWJ1ZygiZ2V0IGZpcm13YXJlIC4uLlxuIik7CisJc2l6ZSA9IGdldF9maXJtd2FyZV9kYXRhKFZJREVPX0RFQ19NUEVHMTJfTVVMVEksIGZ3LT5kYXRhKTsKKwlpZiAoc2l6ZSA8IDApIHsKKwkJcHJfZXJyKCJnZXQgZmlybXdhcmUgZmFpbC5cbiIpOworCQl2ZnJlZShmdyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlmdy0+bGVuID0gc2l6ZTsKKwlody0+ZncgPSBmdzsKKworCUlOSVRfV09SSygmaHctPnVzZXJkYXRhX3B1c2hfd29yaywgdXNlcmRhdGFfcHVzaF9kb193b3JrKTsKKwlJTklUX1dPUksoJmh3LT53b3JrLCB2bXBlZzEyX3dvcmspOworCUlOSVRfV09SSygmaHctPnRpbWVvdXRfd29yaywgdm1wZWcxMl90aW1lb3V0X3dvcmspOworCUlOSVRfV09SSygmaHctPm5vdGlmeV93b3JrLCB2bXBlZzEyX25vdGlmeV93b3JrKTsKKworCWlmIChOVUxMID09IGh3LT51c2VyX2RhdGFfYnVmZmVyKSB7CisJCWh3LT51c2VyX2RhdGFfYnVmZmVyID0ga21hbGxvYyhVU0VSX0RBVEFfU0laRSwKKwkJCQkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKCFody0+dXNlcl9kYXRhX2J1ZmZlcikgeworCQkJcHJfaW5mbygiJXM6IENhbiBub3QgYWxsb2NhdGUgdXNlcl9kYXRhX2J1ZmZlclxuIiwKKwkJCQkgICBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwl2bW1wZWcyX2NyYXRlX3VzZXJkYXRhX21hbmFnZXIoaHcsCisJCQlody0+dXNlcl9kYXRhX2J1ZmZlciwKKwkJCVVTRVJfREFUQV9TSVpFKTsKKworCS8vYW12ZGVjX2VuYWJsZSgpOworCXRpbWVyX3NldHVwKCZody0+Y2hlY2tfdGltZXIsIGNoZWNrX3RpbWVyX2Z1bmMsIDApOworCS8vaW5pdF90aW1lcigmaHctPmNoZWNrX3RpbWVyKTsKKwkvL2h3LT5jaGVja190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaHc7CisJLy9ody0+Y2hlY2tfdGltZXIuZnVuY3Rpb24gPSBjaGVja190aW1lcl9mdW5jOworCWh3LT5jaGVja190aW1lci5leHBpcmVzID0gamlmZmllcyArIENIRUNLX0lOVEVSVkFMOworCisJaHctPnN0YXQgfD0gU1RBVF9USU1FUl9BUk07CisJaHctPnN0YXQgfD0gU1RBVF9JU1JfUkVHOworCisJaHctPmJ1Zl9zdGFydCA9IDA7CisJV1JJVEVfVlJFRyhERUNPREVfU1RPUF9QT1MsIHVkZWJ1Z19mbGFnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBydW5fcmVhZHkoc3RydWN0IHZkZWNfcyAqdmRlYywgdW5zaWduZWQgbG9uZyBtYXNrKQoreworCXN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodyA9CisJCShzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJaWYgKGh3LT5lb3MpCisJCXJldHVybiAwOworCWlmIChody0+dGltZW91dF9wcm9jZXNzaW5nICYmCisJICAgICh3b3JrX3BlbmRpbmcoJmh3LT53b3JrKSB8fCB3b3JrX2J1c3koJmh3LT53b3JrKSB8fAorCSAgICB3b3JrX3BlbmRpbmcoJmh3LT50aW1lb3V0X3dvcmspIHx8IHdvcmtfYnVzeSgmaHctPnRpbWVvdXRfd29yaykpKSB7CisJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkibXBlZzEyIHdvcmsgcGVuZGluZyxub3QgcmVhZHkgZm9yIHJ1bi5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaHctPnRpbWVvdXRfcHJvY2Vzc2luZyA9IDA7CisJaWYgKHZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpICYmIChody0+aW5pdF9mbGFnID09IDApCisJCSYmIHByZV9kZWNvZGVfYnVmX2xldmVsICE9IDApIHsKKwkJdTMyIHJwLCB3cCwgbGV2ZWw7CisKKwkJcnAgPSBTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfcnApOworCQl3cCA9IFNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCk7CisJCWlmICh3cCA8IHJwKQorCQkJbGV2ZWwgPSB2ZGVjLT5pbnB1dC5zaXplICsgd3AgLSBycDsKKwkJZWxzZQorCQkJbGV2ZWwgPSB3cCAtIHJwOworCisJCWlmIChsZXZlbCA8IHByZV9kZWNvZGVfYnVmX2xldmVsKSB7CisJCQlody0+bm90X3J1bl9yZWFkeSsrOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKyNpZmRlZiBBR0FJTl9IQVNfVEhSRVNIT0xECisJCWlmIChody0+bmV4dF9hZ2Fpbl9mbGFnJiYKKwkJCSghdmRlY19mcmFtZV9iYXNlZCh2ZGVjKSkpIHsKKwkJCXUzMiBwYXJzZXJfd3JfcHRyID0KKwkJCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApOworCQkJaWYgKHBhcnNlcl93cl9wdHIgPj0gaHctPnByZV9wYXJzZXJfd3JfcHRyICYmCisJCQkJKHBhcnNlcl93cl9wdHIgLSBody0+cHJlX3BhcnNlcl93cl9wdHIpIDwKKwkJCQlhZ2Fpbl90aHJlc2hvbGQpIHsKKwkJCQlpbnQgciA9IHZkZWNfc3luY19pbnB1dCh2ZGVjKTsKKwkJCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1JVTl9GTE9XLAorCQkJCSIlcyBidWYgbGV2ZWwleFxuIiwKKwkJCQlfX2Z1bmNfXywgcik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKyNlbmRpZgorCisJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisKKwkJaWYgKGN0eC0+cGFyYW1fc2V0c19mcm9tX3Vjb2RlKSB7CisJCQlpZiAoaHctPnY0bF9wYXJhbXNfcGFyc2VkKSB7CisJCQkJaWYgKCFjdHgtPnY0bF9jb2RlY19kcGJfcmVhZHkgJiYKKwkJCQkJdjRsMl9tMm1fbnVtX2RzdF9idWZzX3JlYWR5KGN0eC0+bTJtX2N0eCkgPAorCQkJCQlydW5fcmVhZHlfbWluX2J1Zl9udW0pCisJCQkJaWYgKCFjdHgtPnY0bF9jb2RlY19kcGJfcmVhZHkpCisJCQkJCXJldHVybiAwOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoY3R4LT52NGxfcmVzb2x1dGlvbl9jaGFuZ2UpCisJCQkJCXJldHVybiAwOworCQkJfQorCQl9IGVsc2UgaWYgKCFjdHgtPnY0bF9jb2RlY19kcGJfcmVhZHkpIHsKKwkJCWlmICh2NGwyX20ybV9udW1fZHN0X2J1ZnNfcmVhZHkoY3R4LT5tMm1fY3R4KSA8CisJCQkJcnVuX3JlYWR5X21pbl9idWZfbnVtKQorCQkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKCFpc19lbm91Z2hfZnJlZV9idWZmZXIoaHcpKSB7CisJCWh3LT5ub3RfcnVuX3JlYWR5Kys7CisJCWh3LT5idWZmZXJfbm90X3JlYWR5Kys7CisJCXJldHVybiAwOworCX0KKwlody0+bm90X3J1bl9yZWFkeSA9IDA7CisJaHctPmJ1ZmZlcl9ub3RfcmVhZHkgPSAwOworCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkKKwkJcmV0dXJuICh1bnNpZ25lZCBsb25nKShDT1JFX01BU0tfVkRFQ18xKTsKKwllbHNlCisJCXJldHVybiAodW5zaWduZWQgbG9uZykoQ09SRV9NQVNLX1ZERUNfMSB8IENPUkVfTUFTS19IRVZDKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgZ2V0X2RhdGFfY2hlY2tfc3VtCisJKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodywgaW50IHNpemUpCit7CisJaW50IGpqOworCWludCBzdW0gPSAwOworCXU4ICpkYXRhID0gTlVMTDsKKworCWlmICghaHctPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQlkYXRhID0gY29kZWNfbW1fdm1hcChody0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQlody0+Y2h1bmstPm9mZnNldCwgc2l6ZSk7CisJZWxzZQorCQlkYXRhID0gKCh1OCAqKWh3LT5jaHVuay0+YmxvY2stPnN0YXJ0X3ZpcnQpICsKKwkJCWh3LT5jaHVuay0+b2Zmc2V0OworCisJZm9yIChqaiA9IDA7IGpqIDwgc2l6ZTsgamorKykKKwkJc3VtICs9IGRhdGFbampdOworCisJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIoZGF0YSk7CisJcmV0dXJuIHN1bTsKK30KKworc3RhdGljIGludCBjaGVja19kaXJ0eV9kYXRhKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3ID0KKwkJKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICopKHZkZWMtPnByaXZhdGUpOworCXUzMiB3cCwgcnAsIGxldmVsOworCisJcnAgPSBTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfcnApOworCXdwID0gU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3dwKTsKKworCWlmICh3cCA+IHJwKQorCQlsZXZlbCA9IHdwIC0gcnA7CisJZWxzZQorCQlsZXZlbCA9IHdwICsgdmRlYy0+aW5wdXQuc2l6ZSAtIHJwIDsKKworCWlmIChsZXZlbCA+ICh2ZGVjLT5pbnB1dC5zaXplIC8gMikpCisJCWh3LT5kZWNfYWdhaW5fY250Kys7CisKKwlpZiAoaHctPmRlY19hZ2Fpbl9jbnQgPiBkaXJ0eV9hZ2Fpbl90aHJlc2hvbGQpIHsKKwkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwgIm1wZWcxMiBkYXRhIHNraXBwZWQgJXhcbiIsIGxldmVsKTsKKwkJaHctPmRlY19hZ2Fpbl9jbnQgPSAwOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgcnVuKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHVuc2lnbmVkIGxvbmcgbWFzaywKK3ZvaWQgKCpjYWxsYmFjaykoc3RydWN0IHZkZWNfcyAqLCB2b2lkICopLAorCQl2b2lkICphcmcpCit7CisJc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3ID0KKwkJKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICopdmRlYy0+cHJpdmF0ZTsKKwlpbnQgc2F2ZV9yZWc7CisJaW50IHNpemUsIHJldDsKKworCWh3LT5ydW5fZmxhZyA9IDE7CisJaWYgKCFody0+dmRlY19wZ19lbmFibGVfZmxhZykgeworCQlody0+dmRlY19wZ19lbmFibGVfZmxhZyA9IDE7CisJCWFtdmRlY19lbmFibGUoKTsKKwl9CisJc2F2ZV9yZWcgPSBSRUFEX1ZSRUcoUE9XRVJfQ1RMX1ZMRCk7CisJLyogcmVzZXQgZXZlcnl0aGluZyBleGNlcHQgRE9TX1RPUFsxXSBhbmQgQVBCX0NCVVNbMF0qLworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgMHhmZmZmZmZmMCk7CisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAwKTsKKwlXUklURV9WUkVHKFBPV0VSX0NUTF9WTEQsIHNhdmVfcmVnKTsKKwlody0+cnVuX2NvdW50Kys7CisJdmRlY19yZXNldF9jb3JlKHZkZWMpOworCWh3LT52ZGVjX2NiX2FyZyA9IGFyZzsKKwlody0+dmRlY19jYiA9IGNhbGxiYWNrOworCisjaWZkZWYgQUdBSU5fSEFTX1RIUkVTSE9MRAorCWlmICh2ZGVjX3N0cmVhbV9iYXNlZCh2ZGVjKSkgeworCQlody0+cHJlX3BhcnNlcl93cl9wdHIgPQorCQkJU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3dwKTsKKwkJaHctPm5leHRfYWdhaW5fZmxhZyA9IDA7CisJfQorI2VuZGlmCisKKwlzaXplID0gdmRlY19wcmVwYXJlX2lucHV0KHZkZWMsICZody0+Y2h1bmspOworCWlmIChzaXplIDwgMCkgeworCQlody0+aW5wdXRfZW1wdHkrKzsKKwkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0FHQUlOOworCisJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCwKKwkJCSJ2ZGVjX3ByZXBhcmVfaW5wdXQ6IEluc3VmZmljaWVudCBkYXRhXG4iKTsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCWh3LT5ydW5fZmxhZyA9IDA7CisJCXJldHVybjsKKwl9CisKKwlody0+aW5wdXRfZW1wdHkgPSAwOworCWlmICgodmRlY19mcmFtZV9iYXNlZCh2ZGVjKSkgJiYKKwkJKGh3LT5jaHVuayAhPSBOVUxMKSkgeworCQlzaXplID0gaHctPmNodW5rLT5zaXplICsKKwkJCShody0+Y2h1bmstPm9mZnNldCAmIChWREVDX0ZJRk9fQUxJR04gLSAxKSk7CisJCVdSSVRFX1ZSRUcoVklGRl9CSVRfQ05ULCBzaXplICogOCk7CisJCWlmICh2ZGVjLT5tdmZybSkKKwkJCXZkZWMtPm12ZnJtLT5mcmFtZV9zaXplID0gaHctPmNodW5rLT5zaXplOworCX0KKwlpZiAodmRlY19mcmFtZV9iYXNlZCh2ZGVjKSAmJiAhdmRlY19zZWN1cmUodmRlYykpIHsKKwkJLyogSFcgbmVlZHMgcGFkZGluZyAoTkFMIHN0YXJ0KSBmb3IgZnJhbWUgZW5kaW5nICovCisJCWNoYXIqIHRhaWwgPSAoY2hhciAqKWh3LT5jaHVuay0+YmxvY2stPnN0YXJ0X3ZpcnQ7CisKKwkJdGFpbCArPSBody0+Y2h1bmstPm9mZnNldCArIGh3LT5jaHVuay0+c2l6ZTsKKwkJdGFpbFswXSA9IDA7CisJCXRhaWxbMV0gPSAwOworCQl0YWlsWzJdID0gMTsKKwkJdGFpbFszXSA9IDA7CisJCWNvZGVjX21tX2RtYV9mbHVzaCh0YWlsLCA0LCBETUFfVE9fREVWSUNFKTsKKwl9CisKKwlpZiAodmRlY19mcmFtZV9iYXNlZCh2ZGVjKSAmJiBkZWJ1Z19lbmFibGUgJiYgIXZkZWNfc2VjdXJlKHZkZWMpKSB7CisJCXU4ICpkYXRhID0gTlVMTDsKKwkJaWYgKGh3LT5jaHVuaykKKwkJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfUlVOX0ZMT1csCisJCQkJInJ1bjogY2h1bmsgb2Zmc2V0IDB4JXgsIHNpemUgJWRcbiIsCisJCQkJaHctPmNodW5rLT5vZmZzZXQsIGh3LT5jaHVuay0+c2l6ZSk7CisKKwkJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQlkYXRhID0gY29kZWNfbW1fdm1hcChody0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQkJaHctPmNodW5rLT5vZmZzZXQsIHNpemUpOworCQllbHNlCisJCQlkYXRhID0gKCh1OCAqKWh3LT5jaHVuay0+YmxvY2stPnN0YXJ0X3ZpcnQpICsKKwkJCQlody0+Y2h1bmstPm9mZnNldDsKKworCQlpZiAoZGVidWdfZW5hYmxlICYgUFJJTlRfRkxBR19WREVDX1NUQVRVUworCQkJKSB7CisJCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJIiVzOiBzaXplIDB4JXggc3VtIDB4JXggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggLi4gJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCV9fZnVuY19fLCBzaXplLCBnZXRfZGF0YV9jaGVja19zdW0oaHcsIHNpemUpLAorCQkJZGF0YVswXSwgZGF0YVsxXSwgZGF0YVsyXSwgZGF0YVszXSwKKwkJCWRhdGFbNF0sIGRhdGFbNV0sIGRhdGFbc2l6ZSAtIDRdLAorCQkJZGF0YVtzaXplIC0gM10sCWRhdGFbc2l6ZSAtIDJdLAorCQkJZGF0YVtzaXplIC0gMV0pOworCQl9CisJCWlmIChkZWJ1Z19lbmFibGUgJiBQUklOVF9GUkFNRUJBU0VfREFUQQorCQkJKSB7CisJCQlpbnQgamo7CisJCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GUkFNRUJBU0VfREFUQSwKKwkJCQkiZnJhbWUgZGF0YTpcbiIpOworCQkJZm9yIChqaiA9IDA7IGpqIDwgc2l6ZTsgamorKykgeworCQkJCWlmICgoamogJiAweGYpID09IDApCisJCQkJCXByX2luZm8oIiUwNng6IiwgamopOworCQkJCXByX2luZm8oIiUwMnggIiwgZGF0YVtqal0pOworCQkJCWlmICgoKGpqICsgMSkgJiAweGYpID09IDApCisJCQkJCXByX2luZm8oIlxuIik7CisJCQl9CisJCQlwcl9pbmZvKCJcbiIpOworCQl9CisKKwkJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQljb2RlY19tbV91bm1hcF9waHlhZGRyKGRhdGEpOworCX0gZWxzZSB7CisJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkiJXM6ICV4ICV4ICV4ICV4ICV4IHNpemUgMHgleCwgYml0Y250ICVkXG4iLAorCQkJX19mdW5jX18sCisJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1dQKSwKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCksCisJCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfcnApLAorCQkJU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3dwKSwKKwkJCXNpemUsIFJFQURfVlJFRyhWSUZGX0JJVF9DTlQpKTsKKwl9CisKKwlpZiAodmRlYy0+bWNfbG9hZGVkKSB7CisJLypmaXJtd2FyZSBoYXZlIGxvYWQgYmVmb3JlLAorCSAgYW5kIG5vdCBjaGFuZ2VzIHRvIGFub3RoZXIuCisJICBpZ25vcmUgcmVsb2FkLgorCSovCisJfSBlbHNlIHsKKwkJcmV0ID0gYW12ZGVjX3ZkZWNfbG9hZG1jX2J1Zl9leChWRk9STUFUX01QRUcxMiwgIm1tcGVnMTIiLCB2ZGVjLAorCQkJaHctPmZ3LT5kYXRhLCBody0+ZnctPmxlbik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIlslZF0gJXM6IHRoZSAlcyBmdyBsb2FkaW5nIGZhaWxlZCwgZXJyOiAleFxuIiwgdmRlYy0+aWQsCisJCQkJaHctPmZ3LT5uYW1lLCB0ZWVfZW5hYmxlZCgpID8gIlRFRSIgOiAibG9jYWwiLCByZXQpOworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0ZPUkNFX0VYSVQ7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCWh3LT5ydW5fZmxhZyA9IDA7CisJCQlyZXR1cm47CisJCX0KKwkJdmRlYy0+bWNfbG9hZGVkID0gMTsKKwkJdmRlYy0+bWNfdHlwZSA9IFZGT1JNQVRfTVBFRzEyOworCX0KKworCWlmICh2bXBlZzEyX2h3X2N0eF9yZXN0b3JlKGh3KSA8IDApIHsKKwkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0VSUk9SOworCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0VSUk9SLAorCQkiYW1tdmRlY19tcGVnMTI6IGVycm9yIEhXIGNvbnRleHQgcmVzdG9yZVxuIik7CisJCWh3LT5ydW5fZmxhZyA9IDA7CisJCXJldHVybjsKKwl9CisJLyp3bWIoKTsqLworCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9OT05FOworCWh3LT5zdGF0IHw9IFNUQVRfTUNfTE9BRDsKKwl2ZGVjX2VuYWJsZV9pbnB1dCh2ZGVjKTsKKwlody0+bGFzdF92bGRfbGV2ZWwgPSAwOworCXN0YXJ0X3Byb2Nlc3NfdGltZV9zZXQoaHcpOworCWlmICh2ZGVjLT5tdmZybSkKKwkJdmRlYy0+bXZmcm0tPmh3X2RlY29kZV9zdGFydCA9IGxvY2FsX2Nsb2NrKCk7CisJYW12ZGVjX3N0YXJ0KCk7CisJaHctPnN0YXQgfD0gU1RBVF9WREVDX1JVTjsKKwlody0+c3RhdCB8PSBTVEFUX1RJTUVSX0FSTTsKKwlody0+aW5pdF9mbGFnID0gMTsKKwlpZiAoaHctPm1tX2Jsa19oYW5kbGUpCisJCW1vZF90aW1lcigmaHctPmNoZWNrX3RpbWVyLCBqaWZmaWVzICsgQ0hFQ0tfSU5URVJWQUwpOworCWh3LT5ydW5fZmxhZyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0KHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICopdmRlYy0+cHJpdmF0ZTsKKworCXByX2luZm8oImFtbXZkZWNfbXBlZzEyOiByZXNldC5cbiIpOworCisJdm1wZWcxMl9sb2NhbF9pbml0KGh3KTsKKworCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJdTMyIGksIGJ1Zl9udW0gPSB2bXBlZzEyX2dldF9idWZfbnVtKGh3KTsKKwkJZm9yIChpID0gMDsgaSA8IGJ1Zl9udW07IGkrKykgeworCQkJaHctPnBpY3NbaV0udjRsX3JlZl9idWZfYWRkciA9IDA7CisJCX0KKwl9CisKKwlody0+Y3R4X3ZhbGlkID0gMDsKK30KKworc3RhdGljIGludCB2bXBlZzEyX3NldF90cmlja21vZGUoc3RydWN0IHZkZWNfcyAqdmRlYywgdW5zaWduZWQgbG9uZyB0cmlja21vZGUpCit7CisJc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3ID0KKwkoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKil2ZGVjLT5wcml2YXRlOworCWlmICghaHcpCisJCXJldHVybiAwOworCisJaWYgKHRyaWNrbW9kZSA9PSBUUklDS01PREVfSSkgeworCQlody0+aV9vbmx5ID0gMHgzOworCQkvL3RyaWNrbW9kZV9pID0gMTsKKwl9IGVsc2UgaWYgKHRyaWNrbW9kZSA9PSBUUklDS01PREVfTk9ORSkgeworCQlody0+aV9vbmx5ID0gMHgwOworCQkvL3RyaWNrbW9kZV9pID0gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1tdmRlY19tcGVnMTJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdmRlY19zICpwZGF0YSA9ICooc3RydWN0IHZkZWNfcyAqKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcgPSBOVUxMOworCWludCBjb25maWdfdmFsID0gMDsKKworCXByX2luZm8oImFtbXZkZWNfbXBlZzEyIHByb2JlIHN0YXJ0LlxuIik7CisKKwlpZiAocGRhdGEgPT0gTlVMTCkgeworCQlwcl9pbmZvKCJhbW12ZGVjX21wZWcxMiBwbGF0Zm9ybSBkYXRhIHVuZGVmaW5lZC5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlodyA9IHZ6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zKSk7CisJaWYgKGh3ID09IE5VTEwpIHsKKwkJcHJfaW5mbygiXG5hbW12ZGVjX21wZWcxMiBkZWNvZGVyIGRyaXZlciBhbGxvYyBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiB0aGUgY3R4IGZyb20gdjRsMiBkcml2ZXIuICovCisJaHctPnY0bDJfY3R4ID0gcGRhdGEtPnByaXZhdGU7CisKKwlwZGF0YS0+cHJpdmF0ZSA9IGh3OworCXBkYXRhLT5kZWNfc3RhdHVzID0gdm1tcGVnMTJfZGVjX3N0YXR1czsKKwlwZGF0YS0+c2V0X3RyaWNrbW9kZSA9IHZtcGVnMTJfc2V0X3RyaWNrbW9kZTsKKwlwZGF0YS0+cnVuX3JlYWR5ID0gcnVuX3JlYWR5OworCXBkYXRhLT5ydW4gPSBydW47CisJcGRhdGEtPnJlc2V0ID0gcmVzZXQ7CisJcGRhdGEtPmlycV9oYW5kbGVyID0gdm1wZWcxMl9pc3I7CisJcGRhdGEtPnRocmVhZGVkX2lycV9oYW5kbGVyID0gdm1wZWcxMl9pc3JfdGhyZWFkX2ZuOworCXBkYXRhLT5kdW1wX3N0YXRlID0gdm1wZWcyX2R1bXBfc3RhdGU7CisKKwlwZGF0YS0+dXNlcl9kYXRhX3JlYWQgPSB2bW1wZWcyX3VzZXJfZGF0YV9yZWFkOworCXBkYXRhLT5yZXNldF91c2VyZGF0YV9maWZvID0gdm1tcGVnMl9yZXNldF91c2VyZGF0YV9maWZvOworCXBkYXRhLT53YWtldXBfdXNlcmRhdGFfcG9sbCA9IHZtbXBlZzJfd2FrZXVwX3VzZXJkYXRhX3BvbGw7CisKKwlzbnByaW50Zihody0+dmRlY19uYW1lLCBzaXplb2YoaHctPnZkZWNfbmFtZSksCisJCSJtcGVnMTItJWQiLCBwZGV2LT5pZCk7CisJc25wcmludGYoaHctPnB0c19uYW1lLCBzaXplb2YoaHctPnB0c19uYW1lKSwKKwkJIiVzLXB0cyIsIGh3LT52ZGVjX25hbWUpOworCXNucHJpbnRmKGh3LT5uZXdfcV9uYW1lLCBzaXplb2YoaHctPm5ld19xX25hbWUpLAorCQkiJXMtbmV3ZnJhbWVfcSIsIGh3LT52ZGVjX25hbWUpOworCXNucHJpbnRmKGh3LT5kaXNwX3FfbmFtZSwgc2l6ZW9mKGh3LT5kaXNwX3FfbmFtZSksCisJCSIlcy1kaXNwZnJhbWVfcSIsIGh3LT52ZGVjX25hbWUpOworCisJaWYgKHBkYXRhLT51c2VfdmZtX3BhdGgpIHsKKwkJc25wcmludGYocGRhdGEtPnZmX3Byb3ZpZGVyX25hbWUsIFZERUNfUFJPVklERVJfTkFNRV9TSVpFLAorCQkJICAgIFZGTV9ERUNfUFJPVklERVJfTkFNRSk7CisJCWh3LT5mcmFtZWluZm9fZW5hYmxlID0gMTsKKwl9CisJZWxzZQorCQlzbnByaW50ZihwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwgVkRFQ19QUk9WSURFUl9OQU1FX1NJWkUsCisJCQlQUk9WSURFUl9OQU1FICIuJTAyeCIsIHBkZXYtPmlkICYgMHhmZik7CisJaWYgKHBkYXRhLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IERFQ09ERV9CVUZGRVJfTlVNX01BWDsgaSsrKQorCQkJaHctPmNhbnZhc19zcGVjW2ldID0gMHhmZmZmZmY7CisJfQorCXZmX3Byb3ZpZGVyX2luaXQoJnBkYXRhLT52ZnJhbWVfcHJvdmlkZXIsIHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lLAorCQkmdmZfcHJvdmlkZXJfb3BzLCBwZGF0YSk7CisKKwlpZiAocGRhdGEtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgREVDT0RFX0JVRkZFUl9OVU1fTUFYOyBpKyspCisJCQlody0+Y2FudmFzX3NwZWNbaV0gPSAweGZmZmZmZjsKKwl9CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGRhdGEpOworCisJaHctPmR5bmFtaWNfYnVmX251bV9tYXJnaW4gPSBkeW5hbWljX2J1Zl9udW1fbWFyZ2luOworCWh3LT5jYW52YXNfbW9kZSA9IHBkYXRhLT5jYW52YXNfbW9kZTsKKwlpZiAocGRhdGEtPmNvbmZpZ19sZW4pIHsKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV92NGxfY29kZWNfZW5hYmxlIiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJaHctPmlzX3VzZWRfdjRsID0gY29uZmlnX3ZhbDsKKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywKKwkJCSJwYXJtX3Y0bF9jYW52YXNfbWVtX21vZGUiLAorCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+Y2FudmFzX21vZGUgPSBjb25maWdfdmFsOworCisJCWlmICgoZGVidWdfZW5hYmxlICYgSUdOT1JFX1BBUkFNX0ZST01fQ09ORklHKSA9PSAwICYmCisJCQlnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLAorCQkJInBhcm1fdjRsX2J1ZmZlcl9tYXJnaW4iLAorCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+ZHluYW1pY19idWZfbnVtX21hcmdpbj0gY29uZmlnX3ZhbDsKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJzaWRlYmluZF90eXBlIiwKKwkJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWh3LT5zaWRlYmluZF90eXBlID0gY29uZmlnX3ZhbDsKKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgInNpZGViaW5kX2NoYW5uZWxfaWQiLAorCQkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJaHctPnNpZGViaW5kX2NoYW5uZWxfaWQgPSBjb25maWdfdmFsOworCX0KKworCWh3LT5idWZfbnVtID0gdm1wZWcxMl9nZXRfYnVmX251bShodyk7CisJaHctPnBsYXRmb3JtX2RldiA9IHBkZXY7CisKKwlody0+dHZwX2ZsYWcgPSB2ZGVjX3NlY3VyZShwZGF0YSkgPyBDT0RFQ19NTV9GTEFHU19UVlAgOiAwOworCWlmIChwZGF0YS0+c3lzX2luZm8pCisJCWh3LT52bXBlZzEyX2Ftc3RyZWFtX2RlY19pbmZvID0gKnBkYXRhLT5zeXNfaW5mbzsKKworCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSIlcywgc3lzaW5mbzogJWR4JWQsIHR2cF9mbGFnID0gMHgleFxuIiwKKwkJX19mdW5jX18sCisJCWh3LT52bXBlZzEyX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoLAorCQlody0+dm1wZWcxMl9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQsCisJCWh3LT50dnBfZmxhZyk7CisKKwlpZiAodm1wZWcxMl9pbml0KGh3KSA8IDApIHsKKwkJcHJfaW5mbygiYW1tdmRlY19tcGVnMTIgaW5pdCBmYWlsZWQuXG4iKTsKKwkJaWYgKGh3KSB7CisJCQl2ZnJlZShodyk7CisJCQlodyA9IE5VTEw7CisJCX0KKwkJcGRhdGEtPmRlY19zdGF0dXMgPSBOVUxMOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJdmRlY19zZXRfcHJlcGFyZV9sZXZlbChwZGF0YSwgc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCk7CisKKwl2ZGVjX3NldF92ZnJhbWVfY29tbShwZGF0YSwgRFJJVkVSX05BTUUpOworCisJaWYgKHBkYXRhLT5wYXJhbGxlbF9kZWMgPT0gMSkKKwkJdmRlY19jb3JlX3JlcXVlc3QocGRhdGEsIENPUkVfTUFTS19WREVDXzEpOworCWVsc2UgeworCQl2ZGVjX2NvcmVfcmVxdWVzdChwZGF0YSwgQ09SRV9NQVNLX1ZERUNfMSB8IENPUkVfTUFTS19IRVZDCisJCQkJCXwgQ09SRV9NQVNLX0NPTUJJTkUpOworCX0KKyNpZmRlZiBEVU1QX1VTRVJfREFUQQorCWFtdmRlY19tbXBlZzEyX2luaXRfdXNlcmRhdGFfZHVtcChodyk7CisJcmVzZXRfdXNlcl9kYXRhX2J1Zihodyk7CisjZW5kaWYKKworCS8qSU5JVF9XT1JLKCZ1c2VyZGF0YV9wdXNoX3dvcmssIHVzZXJkYXRhX3B1c2hfZG9fd29yayk7Ki8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbW12ZGVjX21wZWcxMl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKKworeworCXN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodyA9CisJCShzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqKQorCQkoKChzdHJ1Y3QgdmRlY19zICopKHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpKSktPnByaXZhdGUpOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGh3KTsKKwlpbnQgaTsKKworCWlmICh2ZGVjLT5uZXh0X3N0YXR1cyA9PSBWREVDX1NUQVRVU19ESVNDT05ORUNURUQKKwkJJiYgKHZkZWMtPnN0YXR1cyA9PSBWREVDX1NUQVRVU19BQ1RJVkUpKSB7CisJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkiJXMsIGZvcmNlIGV4aXQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9GT1JDRV9FWElUOworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaHctPndhaXRfcSwKKwkJCSh2ZGVjLT5zdGF0dXMgPT0gVkRFQ19TVEFUVVNfQ09OTkVDVEVEKSwKKwkJCW1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOyAgLyogd2FpdCBmb3Igd29yayBkb25lICovCisJfQorCisJaWYgKGh3LT5zdGF0ICYgU1RBVF9WREVDX1JVTikgeworCQlhbXZkZWNfc3RvcCgpOworCQlody0+c3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwl9CisKKwlpZiAoaHctPnN0YXQgJiBTVEFUX0lTUl9SRUcpIHsKKwkJdmRlY19mcmVlX2lycShWREVDX0lSUV8xLCAodm9pZCAqKWh3KTsKKwkJaHctPnN0YXQgJj0gflNUQVRfSVNSX1JFRzsKKwl9CisKKwlpZiAoaHctPnN0YXQgJiBTVEFUX1RJTUVSX0FSTSkgeworCQlkZWxfdGltZXJfc3luYygmaHctPmNoZWNrX3RpbWVyKTsKKwkJaHctPnN0YXQgJj0gflNUQVRfVElNRVJfQVJNOworCX0KKwljYW5jZWxfd29ya19zeW5jKCZody0+dXNlcmRhdGFfcHVzaF93b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZody0+bm90aWZ5X3dvcmspOworCWNhbmNlbF93b3JrX3N5bmMoJmh3LT53b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZody0+dGltZW91dF93b3JrKTsKKworCWlmIChody0+bW1fYmxrX2hhbmRsZSkgeworCQl2b2lkICpibW11X2JveF90bXAgPSBody0+bW1fYmxrX2hhbmRsZTsKKwkJaHctPm1tX2Jsa19oYW5kbGUgPSBOVUxMOworCQl3aGlsZSAoaHctPnJ1bl9mbGFnKQorCQkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOworCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWUoYm1tdV9ib3hfdG1wKTsKKwkJYm1tdV9ib3hfdG1wID0gTlVMTDsKKwl9CisJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKQorCQl2ZGVjX2NvcmVfcmVsZWFzZShod190b192ZGVjKGh3KSwgQ09SRV9NQVNLX1ZERUNfMSk7CisJZWxzZQorCQl2ZGVjX2NvcmVfcmVsZWFzZShod190b192ZGVjKGh3KSwgQ09SRV9NQVNLX1ZERUNfMSB8IENPUkVfTUFTS19IRVZDKTsKKwl2ZGVjX3NldF9zdGF0dXMoaHdfdG9fdmRlYyhodyksIFZERUNfU1RBVFVTX0RJU0NPTk5FQ1RFRCk7CisKKwlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJZm9yIChpID0gMDsgaSA8IERFQ09ERV9CVUZGRVJfTlVNX01BWDsgaSsrKSB7CisJCQl2ZGVjLT5mcmVlX2NhbnZhc19leChjYW52YXNfeShody0+Y2FudmFzX3NwZWNbaV0pLCB2ZGVjLT5pZCk7CisJCQl2ZGVjLT5mcmVlX2NhbnZhc19leChjYW52YXNfdShody0+Y2FudmFzX3NwZWNbaV0pLCB2ZGVjLT5pZCk7CisJCX0KKwl9CisKKwlpZiAoaHctPmNjYnVmX3BoeUFkZHJlc3NfdmlydCkgeworCQlkbWFfZnJlZV9jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksaHctPmNjX2J1Zl9zaXplLAorCQkJaHctPmNjYnVmX3BoeUFkZHJlc3NfdmlydCwgaHctPmNjYnVmX3BoeUFkZHJlc3MpOworCQlody0+Y2NidWZfcGh5QWRkcmVzc192aXJ0ID0gTlVMTDsKKwkJaHctPmNjYnVmX3BoeUFkZHJlc3MgPSAwOworCX0KKworCWlmIChody0+dXNlcl9kYXRhX2J1ZmZlciAhPSBOVUxMKSB7CisJCWtmcmVlKGh3LT51c2VyX2RhdGFfYnVmZmVyKTsKKwkJaHctPnVzZXJfZGF0YV9idWZmZXIgPSBOVUxMOworCX0KKwl2bW1wZWcyX2Rlc3Ryb3lfdXNlcmRhdGFfbWFuYWdlcihodyk7CisKKyNpZmRlZiBEVU1QX1VTRVJfREFUQQorCWFtdmRlY19tbXBlZzEyX3VuaW5pdF91c2VyZGF0YV9kdW1wKGh3KTsKKyNlbmRpZgorCisJaWYgKGh3LT5mdykgeworCQl2ZnJlZShody0+ZncpOworCQlody0+ZncgPSBOVUxMOworCX0KKworCXZmcmVlKGh3KTsKKworCXByX2luZm8oImFtbXZkZWNfbXBlZzEyIHJlbW92ZWQuXG4iKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYW1tdmRlY19tcGVnMTJfZHJpdmVyID0geworCS5wcm9iZSA9IGFtbXZkZWNfbXBlZzEyX3Byb2JlLAorCS5yZW1vdmUgPSBhbW12ZGVjX21wZWcxMl9yZW1vdmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBhbXZkZWNfc3VzcGVuZCwKKwkucmVzdW1lID0gYW12ZGVjX3Jlc3VtZSwKKyNlbmRpZgorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJJVkVSX05BTUUsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBjb2RlY19wcm9maWxlX3QgYW1tdmRlY19tcGVnMTJfcHJvZmlsZSA9IHsKKwkubmFtZSA9ICJtbXBlZzEyIiwKKwkucHJvZmlsZSA9ICJ2NGwiCit9OworCitzdGF0aWMgc3RydWN0IG1jb25maWcgbW1wZWcxMl9jb25maWdzW10gPSB7CisJTUNfUFUzMigicmFkciIsICZyYWRyKSwKKwlNQ19QVTMyKCJydmFsIiwgJnJ2YWwpLAorCU1DX1BVMzIoImRlY19jb250cm9sIiwgJmRlY19jb250cm9sKSwKKwlNQ19QVTMyKCJlcnJvcl9mcmFtZV9za2lwX2xldmVsIiwgJmVycm9yX2ZyYW1lX3NraXBfbGV2ZWwpLAorCU1DX1BVMzIoImRlY29kZV90aW1lb3V0X3ZhbCIsICZkZWNvZGVfdGltZW91dF92YWwpLAorCU1DX1BVMzIoInN0YXJ0X2RlY29kZV9idWZfbGV2ZWwiLCAmc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCksCisJTUNfUFUzMigicHJlX2RlY29kZV9idWZfbGV2ZWwiLCAmcHJlX2RlY29kZV9idWZfbGV2ZWwpLAorCU1DX1BVMzIoImRlYnVnX2VuYWJsZSIsICZkZWJ1Z19lbmFibGUpLAorCU1DX1BVMzIoInVkZWJ1Z19mbGFnIiwgJnVkZWJ1Z19mbGFnKSwKKwlNQ19QVTMyKCJ3aXRob3V0X2Rpc3BsYXlfbW9kZSIsICZ3aXRob3V0X2Rpc3BsYXlfbW9kZSksCisJTUNfUFUzMigiZHluYW1pY19idWZfbnVtX21hcmdpbiIsICZkeW5hbWljX2J1Zl9udW1fbWFyZ2luKSwKKyNpZmRlZiBBR0FJTl9IQVNfVEhSRVNIT0xECisJTUNfUFUzMigiYWdhaW5fdGhyZXNob2xkIiwgJmFnYWluX3RocmVzaG9sZCksCisjZW5kaWYKK307CitzdGF0aWMgc3RydWN0IG1jb25maWdfbm9kZSBtbXBlZzEyX25vZGU7CisKK3N0YXRpYyBpbnQgX19pbml0IGFtbXZkZWNfbXBlZzEyX2RyaXZlcl9pbml0X21vZHVsZSh2b2lkKQoreworCXByX2luZm8oImFtbXZkZWNfbXBlZzEyIG1vZHVsZSBpbml0XG4iKTsKKworCWlmIChwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFtbXZkZWNfbXBlZzEyX2RyaXZlcikpIHsKKwkJcHJfaW5mbygiZmFpbGVkIHRvIHJlZ2lzdGVyIGFtbXZkZWNfbXBlZzEyIGRyaXZlclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwl2Y29kZWNfcHJvZmlsZV9yZWdpc3RlcigmYW1tdmRlY19tcGVnMTJfcHJvZmlsZSk7CisJSU5JVF9SRUdfTk9ERV9DT05GSUdTKCJtZWRpYS5kZWNvZGVyIiwgJm1tcGVnMTJfbm9kZSwKKwkJIm1tcGVnMTIiLCBtbXBlZzEyX2NvbmZpZ3MsIENPTkZJR19GT1JfUlcpOworCXZjb2RlY19mZWF0dXJlX3JlZ2lzdGVyKFZGT1JNQVRfTVBFRzEyLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFtbXZkZWNfbXBlZzEyX2RyaXZlcl9yZW1vdmVfbW9kdWxlKHZvaWQpCit7CisJcHJfaW5mbygiYW1tdmRlY19tcGVnMTIgbW9kdWxlIGV4aXQuXG4iKTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYW1tdmRlY19tcGVnMTJfZHJpdmVyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCittb2R1bGVfcGFyYW0oZGVjX2NvbnRyb2wsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkZWNfY29udHJvbCwgIlxuIGFtbXZkZWNfbXBlZzEyIGRlY29kZXIgY29udHJvbFxuIik7Cittb2R1bGVfcGFyYW0oZXJyb3JfZnJhbWVfc2tpcF9sZXZlbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVycm9yX2ZyYW1lX3NraXBfbGV2ZWwsCisJCQkJICJcbiBhbW12ZGVjX21wZWcxMiBlcnJvcl9mcmFtZV9za2lwX2xldmVsXG4iKTsKKworbW9kdWxlX3BhcmFtKHJhZHIsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhyYWRyLCAiXG5yYWRyXG4iKTsKKworbW9kdWxlX3BhcmFtKHJ2YWwsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhydmFsLCAiXG5ydmFsXG4iKTsKKworbW9kdWxlX3BhcmFtKGRlYnVnX2VuYWJsZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnX2VuYWJsZSwKKwkJCQkJICJcbiBhbW12ZGVjX21wZWcxMiBkZWJ1ZyBlbmFibGVcbiIpOworbW9kdWxlX3BhcmFtKHByZV9kZWNvZGVfYnVmX2xldmVsLCBpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhwcmVfZGVjb2RlX2J1Zl9sZXZlbCwKKwkJIlxuIGFtbXZkZWNfbXBlZzEyIHByZV9kZWNvZGVfYnVmX2xldmVsXG4iKTsKKworbW9kdWxlX3BhcmFtKHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwsCisJCSJcbiBhbW12ZGVjX21wZWcxMiBzdGFydF9kZWNvZGVfYnVmX2xldmVsXG4iKTsKKworbW9kdWxlX3BhcmFtKGRlY29kZV90aW1lb3V0X3ZhbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlY29kZV90aW1lb3V0X3ZhbCwgIlxuIGFtbXZkZWNfbXBlZzEyIGRlY29kZV90aW1lb3V0X3ZhbFxuIik7CisKK21vZHVsZV9wYXJhbShkeW5hbWljX2J1Zl9udW1fbWFyZ2luLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZHluYW1pY19idWZfbnVtX21hcmdpbiwgIlxuIGFtbXZkZWNfbXBlZzEyIGR5bmFtaWNfYnVmX251bV9tYXJnaW5cbiIpOworCittb2R1bGVfcGFyYW1fYXJyYXkobWF4X3Byb2Nlc3NfdGltZSwgdWludCwgJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtKHVkZWJ1Z19mbGFnLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModWRlYnVnX2ZsYWcsICJcbiBhbW12ZGVjX21wZWcxMiB1ZGVidWdfZmxhZ1xuIik7CisKK21vZHVsZV9wYXJhbShkaXJ0eV9hZ2Fpbl90aHJlc2hvbGQsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRpcnR5X2FnYWluX3RocmVzaG9sZCwgIlxuIGFtbXZkZWNfbXBlZzEyIGRpcnR5X2FnYWluX3RocmVzaG9sZFxuIik7CisKKworI2lmZGVmIEFHQUlOX0hBU19USFJFU0hPTEQKK21vZHVsZV9wYXJhbShhZ2Fpbl90aHJlc2hvbGQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhhZ2Fpbl90aHJlc2hvbGQsICJcbiBhZ2Fpbl90aHJlc2hvbGRcbiIpOworI2VuZGlmCisKK21vZHVsZV9wYXJhbSh3aXRob3V0X2Rpc3BsYXlfbW9kZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHdpdGhvdXRfZGlzcGxheV9tb2RlLCAiXG4gYW1tdmRlY19tcGVnMTIgd2l0aG91dF9kaXNwbGF5X21vZGVcbiIpOworCittb2R1bGVfcGFyYW0oZXJyb3JfcHJvY19wb2xpY3ksIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhlcnJvcl9wcm9jX3BvbGljeSwgIlxuIGFtbXZkZWNfbXBlZzEyIGVycm9yX3Byb2NfcG9saWN5XG4iKTsKKworbW9kdWxlX2luaXQoYW1tdmRlY19tcGVnMTJfZHJpdmVyX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGFtbXZkZWNfbXBlZzEyX2RyaXZlcl9yZW1vdmVfbW9kdWxlKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTUxPR0lDIE1VTFRJIE1QRUcxLzIgVmlkZW8gRGVjb2RlciBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvbXBlZzQvTWFrZWZpbGUgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvbXBlZzQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE3Y2M4NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9tcGVnNC9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKK29iai0kKENPTkZJR19BTUxPR0lDX01FRElBX1ZERUNfTVBFRzQpICs9IGFtdmRlY19tcGVnNC5vCithbXZkZWNfbXBlZzQtb2JqcyArPSB2bXBlZzQubworCitvYmotJChDT05GSUdfQU1MT0dJQ19NRURJQV9WREVDX01QRUc0X01VTFRJKSArPSBhbXZkZWNfbW1wZWc0Lm8KK2FtdmRlY19tbXBlZzQtb2JqcyArPSB2bXBlZzRfbXVsdGkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL21wZWc0L3ZtcGVnNC5jIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL21wZWc0L3ZtcGVnNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMzNhNzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvbXBlZzQvdm1wZWc0LmMKQEAgLTAsMCArMSwxMjc4IEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL2FtcG9ydHMvdm1wZWc0LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2RlZmluZSBERUJVRworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL2Ftc3RyZWFtLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9mcmFtZV9zeW5jL3B0c3NlcnYuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWVfcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWVfcmVjZWl2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NhbnZhcy9jYW52YXMuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL3ZkZWNfcmVnLmg+CisjaW5jbHVkZSAidm1wZWc0LmgiCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9yZWdpc3RlcnMvcmVnaXN0ZXIuaD4KKyNpbmNsdWRlICIuLi8uLi8uLi9zdHJlYW1faW5wdXQvYW1wb3J0cy9hbXBvcnRzX3ByaXYuaCIKKyNpbmNsdWRlICIuLi91dGlscy9kZWNvZGVyX21tdV9ib3guaCIKKyNpbmNsdWRlICIuLi91dGlscy9kZWNvZGVyX2JtbXVfYm94LmgiCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jb2RlY19tbS9jb2RlY19tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29uZmlncy5oPgorLy8jaW5jbHVkZSA8bGludXgvYW1sb2dpYy90ZWUuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L3RlZS5oPgorI2luY2x1ZGUgIi4uLy4uLy4uL2NvbW1vbi9jaGlwcy9kZWNvZGVyX2NwdV92ZXJfaW5mby5oIgorCisKKworLyogI2RlZmluZSBDT05GSUdfQU1fVkRFQ19NUEVHNF9MT0cgKi8KKyNpZmRlZiBDT05GSUdfQU1fVkRFQ19NUEVHNF9MT0cKKyNkZWZpbmUgQU1MT0cKKyNkZWZpbmUgTE9HX0xFVkVMX1ZBUiAgICAgICBhbWxvZ19sZXZlbF92bXBlZzQKKyNkZWZpbmUgTE9HX01BU0tfVkFSICAgICAgICBhbWxvZ19tYXNrX3ZtcGVnNAorI2RlZmluZSBMT0dfTEVWRUxfRVJST1IgICAgIDAKKyNkZWZpbmUgTE9HX0xFVkVMX0lORk8gICAgICAxCisjZGVmaW5lIExPR19MRVZFTF9ERVNDICAiMDpFUlJPUiwgMTpJTkZPIgorI2RlZmluZSBMT0dfTUFTS19QVFMgICAgMHgwMQorI2RlZmluZSBMT0dfTUFTS19ERVNDICAgIjB4MDE6REVCVUdfUFRTIgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL2FtbG9nLmg+CisKK01PRFVMRV9BTUxPRyhMT0dfTEVWRUxfRVJST1IsIDAsIExPR19MRVZFTF9ERVNDLCBMT0dfREVGQVVMVF9NQVNLX0RFU0MpOworCisjaW5jbHVkZSAiLi4vdXRpbHMvYW12ZGVjLmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvdmRlYy5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2Zpcm13YXJlLmgiCisKKyNkZWZpbmUgRFJJVkVSX05BTUUgImFtdmRlY19tcGVnNCIKKyNkZWZpbmUgTU9EVUxFX05BTUUgImFtdmRlY19tcGVnNCIKKworI2RlZmluZSBERUJVR19QVFMKKworLyogLyNpZiBNRVNPTl9DUFVfVFlQRSA+PSBNRVNPTl9DUFVfVFlQRV9NRVNPTjYgKi8KKyNkZWZpbmUgTlYyMQorLyogLyNlbmRpZiAqLworCisjZGVmaW5lIElfUElDVFVSRSAgIDAKKyNkZWZpbmUgUF9QSUNUVVJFICAgMQorI2RlZmluZSBCX1BJQ1RVUkUgICAyCisKKyNkZWZpbmUgT1JJX0JVRkZFUl9TVEFSVF9BRERSICAgMHgwMTAwMDAwMAorCisjZGVmaW5lIElOVEVSTEFDRV9GTEFHICAgICAgICAgIDB4ODAKKyNkZWZpbmUgVE9QX0ZJRUxEX0ZJUlNUX0ZMQUcgICAgMHg0MAorCisvKiBwcm90b2NvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTVA0X1BJQ19SQVRJTyAgICAgICBBVl9TQ1JBVENIXzUKKyNkZWZpbmUgTVA0X1JBVEUgICAgICAgICAgICBBVl9TQ1JBVENIXzMKKyNkZWZpbmUgTVA0X0VSUl9DT1VOVCAgICAgICBBVl9TQ1JBVENIXzYKKyNkZWZpbmUgTVA0X1BJQ19XSCAgICAgICAgICBBVl9TQ1JBVENIXzcKKyNkZWZpbmUgTVJFR19CVUZGRVJJTiAgICAgICBBVl9TQ1JBVENIXzgKKyNkZWZpbmUgTVJFR19CVUZGRVJPVVQgICAgICBBVl9TQ1JBVENIXzkKKyNkZWZpbmUgTVA0X05PVF9DT0RFRF9DTlQgICBBVl9TQ1JBVENIX0EKKyNkZWZpbmUgTVA0X1ZPUF9USU1FX0lOQyAgICBBVl9TQ1JBVENIX0IKKyNkZWZpbmUgTVA0X09GRlNFVF9SRUcgICAgICBBVl9TQ1JBVENIX0MKKyNkZWZpbmUgTVA0X1NZU19SQVRFICAgICAgICBBVl9TQ1JBVENIX0UKKyNkZWZpbmUgTUVNX09GRlNFVF9SRUcgICAgICBBVl9TQ1JBVENIX0YKKworI2RlZmluZSBQQVJDX0ZPUkJJRERFTiAgICAgICAgICAgICAgMAorI2RlZmluZSBQQVJDX1NRVUFSRSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQQVJDX0NJRiAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBQQVJDXzEwXzExICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBQQVJDXzE2XzExICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBQQVJDXzQwXzMzICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBQQVJDX1JFU0VSVkVEICAgICAgICAgICAgICAgNgorLyogdmFsdWVzIGJldHdlZW4gNiBhbmQgMTQgYXJlIHJlc2VydmVkICovCisjZGVmaW5lIFBBUkNfRVhURU5ERUQgICAgICAgICAgICAgIDE1CisKKyNkZWZpbmUgVkZfUE9PTF9TSVpFICAgICAgICAgIDMyCisjZGVmaW5lIERFQ09ERV9CVUZGRVJfTlVNX01BWCA4CisjZGVmaW5lIFBVVF9JTlRFUlZBTCAgICAgICAgKEhaLzEwMCkKKyNkZWZpbmUgV09SS1NQQUNFX1NJWkUJCSgxICogU1pfMU0pCisjZGVmaW5lIE1BWF9CTU1VX0JVRkZFUl9OVU0JKERFQ09ERV9CVUZGRVJfTlVNX01BWCArIDEpCisjZGVmaW5lIERDQUNfQlVGRl9TVEFSVF9JUAkweDAyYjAwMDAwCisKKworI2RlZmluZSBSQVRFX0RFVEVDVF9DT1VOVCAgIDUKKyNkZWZpbmUgRFVSQVRJT05fVU5JVCAgICAgICA5NjAwMAorI2RlZmluZSBQVFNfVU5JVCAgICAgICAgICAgIDkwMDAwCisKKyNkZWZpbmUgRFVSMlBUUyh4KSAoKHgpIC0gKCh4KSA+PiA0KSkKKworI2RlZmluZSBNQVhfTVBFRzRfU1VQUE9SVF9TSVpFICgxOTIwKjEwODgpCisKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZtcGVnX3ZmX3BlZWsodm9pZCAqKTsKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZtcGVnX3ZmX2dldCh2b2lkICopOworc3RhdGljIHZvaWQgdm1wZWdfdmZfcHV0KHN0cnVjdCB2ZnJhbWVfcyAqLCB2b2lkICopOworc3RhdGljIGludCB2bXBlZ192Zl9zdGF0ZXMoc3RydWN0IHZmcmFtZV9zdGF0ZXMgKnN0YXRlcywgdm9pZCAqKTsKK3N0YXRpYyBpbnQgdm1wZWdfZXZlbnRfY2IoaW50IHR5cGUsIHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGVfZGF0YSk7CisKK3N0YXRpYyBpbnQgdm1wZWc0X3Byb3RfaW5pdCh2b2lkKTsKK3N0YXRpYyB2b2lkIHZtcGVnNF9sb2NhbF9pbml0KHZvaWQpOworCitzdGF0aWMgY29uc3QgY2hhciB2bXBlZzRfZGVjX2lkW10gPSAidm1wZWc0LWRldiI7CisKKyNkZWZpbmUgUFJPVklERVJfTkFNRSAgICJkZWNvZGVyLm1wZWc0IgorCitzdHJ1Y3QgdmRlY19zICp2ZGVjID0gTlVMTDsKKworLyoKKyAqaW50IHF1ZXJ5X3ZpZGVvX3N0YXR1cyhpbnQgdHlwZSwgaW50ICp2YWx1ZSk7CisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmZyYW1lX29wZXJhdGlvbnNfcyB2bXBlZ192Zl9wcm92aWRlciA9IHsKKwkucGVlayA9IHZtcGVnX3ZmX3BlZWssCisJLmdldCA9IHZtcGVnX3ZmX2dldCwKKwkucHV0ID0gdm1wZWdfdmZfcHV0LAorCS5ldmVudF9jYiA9IHZtcGVnX2V2ZW50X2NiLAorCS52Zl9zdGF0ZXMgPSB2bXBlZ192Zl9zdGF0ZXMsCit9Oworc3RhdGljIHZvaWQgKm1tX2Jsa19oYW5kbGU7CitzdGF0aWMgc3RydWN0IHZmcmFtZV9wcm92aWRlcl9zIHZtcGVnX3ZmX3Byb3Y7CisKK3N0YXRpYyBERUNMQVJFX0tGSUZPKG5ld2ZyYW1lX3EsIHN0cnVjdCB2ZnJhbWVfcyAqLCBWRl9QT09MX1NJWkUpOworc3RhdGljIERFQ0xBUkVfS0ZJRk8oZGlzcGxheV9xLCBzdHJ1Y3QgdmZyYW1lX3MgKiwgVkZfUE9PTF9TSVpFKTsKK3N0YXRpYyBERUNMQVJFX0tGSUZPKHJlY3ljbGVfcSwgc3RydWN0IHZmcmFtZV9zICosIFZGX1BPT0xfU0laRSk7CisKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgdmZwb29sW1ZGX1BPT0xfU0laRV07CitzdGF0aWMgczMyIHZmYnVmX3VzZVtERUNPREVfQlVGRkVSX05VTV9NQVhdOworc3RhdGljIHUzMiBmcmFtZV93aWR0aCwgZnJhbWVfaGVpZ2h0LCBmcmFtZV9kdXIsIGZyYW1lX3Byb2c7CitzdGF0aWMgdTMyIHNhdmVkX3Jlc29sdXRpb247CitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgcmVjeWNsZV90aW1lcjsKK3N0YXRpYyB1MzIgc3RhdDsKK3N0YXRpYyB1MzIgYnVmX3NpemUgPSAzMiAqIDEwMjQgKiAxMDI0Oworc3RhdGljIHUzMiBidWZfb2Zmc2V0Oworc3RhdGljIHUzMiB2bXBlZzRfcmF0aW87CitzdGF0aWMgdTY0IHZtcGVnNF9yYXRpbzY0Oworc3RhdGljIHUzMiByYXRlX2RldGVjdDsKK3N0YXRpYyB1MzIgdm1wZWc0X3JvdGF0aW9uOworc3RhdGljIHUzMiBmcl9oaW50X3N0YXR1czsKKworc3RhdGljIHUzMiB0b3RhbF9mcmFtZTsKK3N0YXRpYyB1MzIgbGFzdF92b3BfdGltZV9pbmMsIGxhc3RfZHVyYXRpb247CitzdGF0aWMgdTMyIGxhc3RfYW5jaF9wdHMsIHZvcF90aW1lX2luY19zaW5jZV9sYXN0X2FuY2gsCisJICAgZnJhbWVfbnVtX3NpbmNlX2xhc3RfYW5jaDsKK3N0YXRpYyB1NjQgbGFzdF9hbmNoX3B0c191czY0Oworc3RhdGljIHN0cnVjdCB2ZGVjX2luZm8gKmd2czsKKworI2lmZGVmIENPTkZJR19BTV9WREVDX01QRUc0X0xPRwordTMyIHB0c19oaXQsIHB0c19taXNzZWQsIHB0c19pX2hpdCwgcHRzX2lfbWlzc2VkOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzZXRfd29yazsKK3N0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3Qgbm90aWZ5X3dvcms7CitzdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IHNldF9jbGtfd29yazsKK3N0YXRpYyBib29sIGlzX3Jlc2V0OworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxvY2spOworCitzdGF0aWMgc3RydWN0IGRlY19zeXNpbmZvIHZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mbzsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXNwZWN0X3JhdGlvX3RhYmxlWzE2XSA9IHsKKwlQQVJDX0ZPUkJJRERFTiwKKwlQQVJDX1NRVUFSRSwKKwlQQVJDX0NJRiwKKwlQQVJDXzEwXzExLAorCVBBUkNfMTZfMTEsCisJUEFSQ180MF8zMywKKwlQQVJDX1JFU0VSVkVELCBQQVJDX1JFU0VSVkVELCBQQVJDX1JFU0VSVkVELCBQQVJDX1JFU0VSVkVELAorCVBBUkNfUkVTRVJWRUQsIFBBUkNfUkVTRVJWRUQsIFBBUkNfUkVTRVJWRUQsIFBBUkNfUkVTRVJWRUQsCisJUEFSQ19SRVNFUlZFRCwgUEFSQ19FWFRFTkRFRAorfTsKKworc3RhdGljIGlubGluZSB1MzIgaW5kZXgyY2FudmFzKHUzMiBpbmRleCkKK3sKKwljb25zdCB1MzIgY2FudmFzX3RhYls4XSA9IHsKKyNpZmRlZiBOVjIxCisJCTB4MDEwMTAwLCAweDAzMDMwMiwgMHgwNTA1MDQsIDB4MDcwNzA2LAorCQkweDA5MDkwOCwgMHgwYjBiMGEsIDB4MGQwZDBjLCAweDBmMGYwZQorI2Vsc2UKKwkJMHgwMjAxMDAsIDB4MDUwNDAzLCAweDA4MDcwNiwgMHgwYjBhMDksCisJCTB4MGUwZDBjLCAweDExMTAwZiwgMHgxNDEzMTIsIDB4MTcxNjE1CisjZW5kaWYKKwl9OworCisJcmV0dXJuIGNhbnZhc190YWJbaW5kZXhdOworfQorCitzdGF0aWMgdm9pZCBzZXRfYXNwZWN0X3JhdGlvKHN0cnVjdCB2ZnJhbWVfcyAqdmYsIHVuc2lnbmVkIGludCBwaXhlbF9yYXRpbykKK3sKKwlpbnQgYXIgPSAwOworCXVuc2lnbmVkIGludCBudW0gPSAwOworCXVuc2lnbmVkIGludCBkZW4gPSAwOworCisJaWYgKHZtcGVnNF9yYXRpbzY0ICE9IDApIHsKKwkJbnVtID0gdm1wZWc0X3JhdGlvNjQgPj4gMzI7CisJCWRlbiA9IHZtcGVnNF9yYXRpbzY0ICYgMHhmZmZmZmZmZjsKKwl9IGVsc2UgeworCQludW0gPSB2bXBlZzRfcmF0aW8gPj4gMTY7CisJCWRlbiA9IHZtcGVnNF9yYXRpbyAmIDB4ZmZmZjsKKworCX0KKwlpZiAoKG51bSA9PSAwKSB8fCAoZGVuID09IDApKSB7CisJCW51bSA9IDE7CisJCWRlbiA9IDE7CisJfQorCisJaWYgKHZtcGVnNF9yYXRpbyA9PSAwKSB7CisJCXZmLT5yYXRpb19jb250cm9sIHw9ICgweDkwIDw8IERJU1BfUkFUSU9fQVNQRUNUX1JBVElPX0JJVCk7CisJCS8qIGFsd2F5cyBzdHJldGNoIHRvIDE2OjkgKi8KKwl9IGVsc2UgaWYgKHBpeGVsX3JhdGlvID4gMHgwZikgeworCQludW0gPSAocGl4ZWxfcmF0aW8gPj4gOCkgKgorCQkJdm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoICogbnVtOworCQlhciA9IGRpdl91NjQoKHBpeGVsX3JhdGlvICYgMHhmZikgKgorCQkJdm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodCAqIGRlbiAqIDB4MTAwVUxMICsKKwkJCShudW0gPj4gMSksIG51bSk7CisJfSBlbHNlIHsKKwkJc3dpdGNoIChhc3BlY3RfcmF0aW9fdGFibGVbcGl4ZWxfcmF0aW9dKSB7CisJCWNhc2UgMDoKKwkJCW51bSA9IHZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby53aWR0aCAqIG51bTsKKwkJCWFyID0gKHZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQgKiBkZW4gKiAweDEwMCArCisJCQkJICAobnVtID4+IDEpKSAvIG51bTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQludW0gPSB2Zi0+d2lkdGggKiBudW07CisJCQlhciA9ICh2Zi0+aGVpZ2h0ICogZGVuICogMHgxMDAgKyAobnVtID4+IDEpKSAvIG51bTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQludW0gPSAodmYtPndpZHRoICogMTIpICogbnVtOworCQkJYXIgPSAodmYtPmhlaWdodCAqIGRlbiAqIDB4MTAwICogMTEgKworCQkJCSAgKChudW0pID4+IDEpKSAvIG51bTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQludW0gPSAodmYtPndpZHRoICogMTApICogbnVtOworCQkJYXIgPSAodmYtPmhlaWdodCAqIGRlbiAqIDB4MTAwICogMTEgKyAobnVtID4+IDEpKSAvCisJCQkJbnVtOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCW51bSA9ICh2Zi0+d2lkdGggKiAxNikgKiBudW07CisJCQlhciA9ICh2Zi0+aGVpZ2h0ICogZGVuICogMHgxMDAgKiAxMSArIChudW0gPj4gMSkpIC8KKwkJCQludW07CisJCQlicmVhazsKKwkJY2FzZSA1OgorCQkJbnVtID0gKHZmLT53aWR0aCAqIDQwKSAqIG51bTsKKwkJCWFyID0gKHZmLT5oZWlnaHQgKiBkZW4gKiAweDEwMCAqIDMzICsgKG51bSA+PiAxKSkgLworCQkJCW51bTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbnVtID0gdmYtPndpZHRoICogbnVtOworCQkJYXIgPSAodmYtPmhlaWdodCAqIGRlbiAqIDB4MTAwICsgKG51bSA+PiAxKSkgLyBudW07CisJCQlicmVhazsKKwkJfQorCX0KKworCWFyID0gbWluKGFyLCBESVNQX1JBVElPX0FTUEVDVF9SQVRJT19NQVgpOworCisJdmYtPnJhdGlvX2NvbnRyb2wgPSAoYXIgPDwgRElTUF9SQVRJT19BU1BFQ1RfUkFUSU9fQklUKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHZtcGVnNF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXUzMiByZWc7CisJc3RydWN0IHZmcmFtZV9zICp2ZiA9IE5VTEw7CisJdTMyIHBpY3R1cmVfdHlwZTsKKwl1MzIgYnVmZmVyX2luZGV4OworCXUzMiBwdHMsIHB0c192YWxpZCA9IDAsIG9mZnNldCA9IDA7CisJdTY0IHB0c191czY0ID0gMDsKKwl1MzIgcmF0ZSwgdm9wX3RpbWVfaW5jLCByZXBlYXRfY250LCBkdXJhdGlvbiA9IDMyMDA7CisJdTMyIGZyYW1lX3NpemU7CisKKwlyZWcgPSBSRUFEX1ZSRUcoTVJFR19CVUZGRVJPVVQpOworCisJaWYgKHJlZykgeworCQlidWZmZXJfaW5kZXggPSByZWcgJiAweDc7CisJCXBpY3R1cmVfdHlwZSA9IChyZWcgPj4gMykgJiA3OworCQlyYXRlID0gUkVBRF9WUkVHKE1QNF9SQVRFKTsKKwkJcmVwZWF0X2NudCA9IFJFQURfVlJFRyhNUDRfTk9UX0NPREVEX0NOVCk7CisJCXZvcF90aW1lX2luYyA9IFJFQURfVlJFRyhNUDRfVk9QX1RJTUVfSU5DKTsKKworCQlpZiAoYnVmZmVyX2luZGV4ID49IERFQ09ERV9CVUZGRVJfTlVNX01BWCkgeworCQkJcHJfZXJyKCJmYXRhbCBlcnJvciwgaW52YWxpZCBidWZmZXIgaW5kZXguIik7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKworCQlpZiAodm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoID09IDApIHsKKwkJCXZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby53aWR0aCA9CisJCQkJUkVBRF9WUkVHKE1QNF9QSUNfV0gpID4+IDE2OworCQl9CisjaWYgMAorCQllbHNlIHsKKwkJCXByX2luZm8oImluZm8gd2lkdGggPSAlZCwgdWNvZGUgd2lkdGggPSAlZFxuIiwKKwkJCQkgICB2bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGgsCisJCQkJICAgUkVBRF9WUkVHKE1QNF9QSUNfV0gpID4+IDE2KTsKKwkJfQorI2VuZGlmCisKKwkJaWYgKHZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQgPT0gMCkgeworCQkJdm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodCA9CisJCQkJUkVBRF9WUkVHKE1QNF9QSUNfV0gpICYgMHhmZmZmOworCQl9CisjaWYgMAorCQllbHNlIHsKKwkJCXByX2luZm8oImluZm8gaGVpZ2h0ID0gJWQsIHVjb2RlIGhlaWdodCA9ICVkXG4iLAorCQkJCSAgIHZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQsCisJCQkJICAgUkVBRF9WUkVHKE1QNF9QSUNfV0gpICYgMHhmZmZmKTsKKwkJfQorI2VuZGlmCisJCWlmICh2bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSA9PSAwCisJCXx8IHZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5yYXRlID4gOTYwMDApIHsKKwkJCS8qIGlmICgocmF0ZSA+PiAxNikgIT0gMCkgeyAqLworCQkJaWYgKChyYXRlICYgMHhmZmZmKSAhPSAwICYmIChyYXRlID4+IDE2KSAhPSAwKSB7CisJCQkJdm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgPQorCQkJCQkocmF0ZSA+PiAxNikgKiBEVVJBVElPTl9VTklUIC8KKwkJCQkJKHJhdGUgJiAweGZmZmYpOworCQkJCWR1cmF0aW9uID0gdm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGU7CisJCQkJaWYgKGZyX2hpbnRfc3RhdHVzID09IFZERUNfTkVFRF9ISU5UKSB7CisJCQkJCXNjaGVkdWxlX3dvcmsoJm5vdGlmeV93b3JrKTsKKwkJCQkJZnJfaGludF9zdGF0dXMgPSBWREVDX0hJTlRFRDsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHJhdGVfZGV0ZWN0IDwgUkFURV9ERVRFQ1RfQ09VTlQpIHsKKwkJCQlpZiAodm9wX3RpbWVfaW5jIDwgbGFzdF92b3BfdGltZV9pbmMpIHsKKwkJCQkJZHVyYXRpb24gPQorCQkJCQkJdm9wX3RpbWVfaW5jICsgcmF0ZSAtCisJCQkJCQlsYXN0X3ZvcF90aW1lX2luYzsKKwkJCQl9IGVsc2UgeworCQkJCQlkdXJhdGlvbiA9CisJCQkJCXZvcF90aW1lX2luYyAtIGxhc3Rfdm9wX3RpbWVfaW5jOworCQkJCX0KKworCQkJCWlmIChkdXJhdGlvbiA9PSBsYXN0X2R1cmF0aW9uKSB7CisJCQkJCXJhdGVfZGV0ZWN0Kys7CisJCQkJCWlmIChyYXRlX2RldGVjdCA+PSBSQVRFX0RFVEVDVF9DT1VOVCkgeworCQkJCQkJdm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgPQorCQkJCQkJZHVyYXRpb24gKiBEVVJBVElPTl9VTklUIC8KKwkJCQkJCXJhdGU7CisJCQkJCQlkdXJhdGlvbiA9CisJCQkJCQl2bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZTsKKwkJCQkJfQorCQkJCX0gZWxzZQorCQkJCQlyYXRlX2RldGVjdCA9IDA7CisKKwkJCQlsYXN0X2R1cmF0aW9uID0gZHVyYXRpb247CisJCQl9CisJCX0gZWxzZSB7CisJCQlkdXJhdGlvbiA9IHZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5yYXRlOworI2lmIDAKKwkJCXByX2luZm8oImluZm8gcmF0ZSA9ICVkLCB1Y29kZSByYXRlID0gMHgleDoweCV4XG4iLAorCQkJCSAgIHZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5yYXRlLAorCQkJCSAgIFJFQURfVlJFRyhNUDRfUkFURSksIHZvcF90aW1lX2luYyk7CisjZW5kaWYKKwkJfQorCisJCWlmICgocGljdHVyZV90eXBlID09IElfUElDVFVSRSkgfHwKKwkJCQkocGljdHVyZV90eXBlID09IFBfUElDVFVSRSkpIHsKKwkJCW9mZnNldCA9IFJFQURfVlJFRyhNUDRfT0ZGU0VUX1JFRyk7CisJCQkvKjI1MDAtLT4zMDAwLGJlY2F1c2Ugc29tZSBtcGVnNAorCQkJICp2aWRlbyBtYXkgY2hlY2tvdXQgZmFpbGVkOworCQkJICptYXkgaGF2ZSBhdiBzeW5jIHByb2JsZW0uY2FuIGNoYW5nZWQgc21hbGwgbGF0ZXIuCisJCQkgKjI2MyBtYXkgbmVlZCBzbWFsbD8KKwkJCSAqLworCQkJaWYgKHB0c19sb29rdXBfb2Zmc2V0X3VzNjQKKwkJCQkoUFRTX1RZUEVfVklERU8sIG9mZnNldCwgJnB0cywKKwkJCQkmZnJhbWVfc2l6ZSwgMzAwMCwKKwkJCQkgJnB0c191czY0KSA9PSAwKSB7CisJCQkJcHRzX3ZhbGlkID0gMTsKKwkJCQlsYXN0X2FuY2hfcHRzID0gcHRzOworCQkJCWxhc3RfYW5jaF9wdHNfdXM2NCA9IHB0c191czY0OworI2lmZGVmIENPTkZJR19BTV9WREVDX01QRUc0X0xPRworCQkJCXB0c19oaXQrKzsKKyNlbmRpZgorCQkJfSBlbHNlIHsKKyNpZmRlZiBDT05GSUdfQU1fVkRFQ19NUEVHNF9MT0cKKwkJCQlwdHNfbWlzc2VkKys7CisjZW5kaWYKKwkJCX0KKyNpZmRlZiBDT05GSUdfQU1fVkRFQ19NUEVHNF9MT0cKKwkJCWFtbG9nX21hc2soTE9HX01BU0tfUFRTLAorCQkJCSJJIG9mZnNldCAweCV4LCBwdHNfdmFsaWQgJWQgcHRzPTB4JXhcbiIsCisJCQkJb2Zmc2V0LCBwdHNfdmFsaWQsIHB0cyk7CisjZW5kaWYKKwkJfQorCisJCWlmIChwdHNfdmFsaWQpIHsKKwkJCWxhc3RfYW5jaF9wdHMgPSBwdHM7CisJCQlsYXN0X2FuY2hfcHRzX3VzNjQgPSBwdHNfdXM2NDsKKwkJCWZyYW1lX251bV9zaW5jZV9sYXN0X2FuY2ggPSAwOworCQkJdm9wX3RpbWVfaW5jX3NpbmNlX2xhc3RfYW5jaCA9IDA7CisJCX0gZWxzZSB7CisJCQlwdHMgPSBsYXN0X2FuY2hfcHRzOworCQkJcHRzX3VzNjQgPSBsYXN0X2FuY2hfcHRzX3VzNjQ7CisKKwkJCWlmICgocmF0ZSAhPSAwKSAmJiAoKHJhdGUgPj4gMTYpID09IDApCisJCQkJJiYgdm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgPT0gMCkgeworCQkJCS8qIHZhcmlhYmxlIFBUUyByYXRlICovCisJCQkJLypidWcgb24gdmFyaWFibGUgcHRzIGNhbGMsCisJCQkJICpkbyBhcyBkaXhlZCB2b3AgZmlyc3QgaWYgd2UKKwkJCQkgKmhhdmUgcmF0ZSBzZXR0aW5nIGJlZm9yZS4KKwkJCQkgKi8KKwkJCQlpZiAodm9wX3RpbWVfaW5jID4gbGFzdF92b3BfdGltZV9pbmMpIHsKKwkJCQkJdm9wX3RpbWVfaW5jX3NpbmNlX2xhc3RfYW5jaCArPQorCQkJCQl2b3BfdGltZV9pbmMgLSBsYXN0X3ZvcF90aW1lX2luYzsKKwkJCQl9IGVsc2UgeworCQkJCQl2b3BfdGltZV9pbmNfc2luY2VfbGFzdF9hbmNoICs9CisJCQkJCQl2b3BfdGltZV9pbmMgKyByYXRlIC0KKwkJCQkJCWxhc3Rfdm9wX3RpbWVfaW5jOworCQkJCX0KKworCQkJCXB0cyArPSB2b3BfdGltZV9pbmNfc2luY2VfbGFzdF9hbmNoICoKKwkJCQkJUFRTX1VOSVQgLyByYXRlOworCQkJCXB0c191czY0ICs9IGRpdl91NjQoKHU2NCkodm9wX3RpbWVfaW5jX3NpbmNlX2xhc3RfYW5jaCAqCisJCQkJCVBUU19VTklUIC8gcmF0ZSkgKiAxMDAsIDkpOworCisJCQkJaWYgKHZvcF90aW1lX2luY19zaW5jZV9sYXN0X2FuY2ggPiAoMSA8PCAxNCkpIHsKKwkJCQkJLyogYXZvaWQgb3ZlcmZsb3cgKi8KKwkJCQkJbGFzdF9hbmNoX3B0cyA9IHB0czsKKwkJCQkJbGFzdF9hbmNoX3B0c191czY0ID0gcHRzX3VzNjQ7CisJCQkJCXZvcF90aW1lX2luY19zaW5jZV9sYXN0X2FuY2ggPSAwOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogZml4ZWQgVk9QIHJhdGUgKi8KKwkJCQlmcmFtZV9udW1fc2luY2VfbGFzdF9hbmNoKys7CisJCQkJcHRzICs9IERVUjJQVFMoZnJhbWVfbnVtX3NpbmNlX2xhc3RfYW5jaCAqCisJCQkJCXZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5yYXRlKTsKKwkJCQlwdHNfdXM2NCArPSBEVVIyUFRTKGZyYW1lX251bV9zaW5jZV9sYXN0X2FuY2ggKgorCQkJCQl2bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSkgKgorCQkJCQkxMDAgLyA5OworCisJCQkJaWYgKGZyYW1lX251bV9zaW5jZV9sYXN0X2FuY2ggPiAoMSA8PCAxNSkpIHsKKwkJCQkJLyogYXZvaWQgb3ZlcmZsb3cgKi8KKwkJCQkJbGFzdF9hbmNoX3B0cyA9IHB0czsKKwkJCQkJbGFzdF9hbmNoX3B0c191czY0ID0gcHRzX3VzNjQ7CisJCQkJCWZyYW1lX251bV9zaW5jZV9sYXN0X2FuY2ggPSAwOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChyZWcgJiBJTlRFUkxBQ0VfRkxBRykgewkvKiBpbnRlcmxhY2UgKi8KKwkJCWlmIChrZmlmb19nZXQoJm5ld2ZyYW1lX3EsICZ2ZikgPT0gMCkgeworCQkJCXByaW50aworCQkJCSgiZmF0YWwgZXJyb3IsIG5vIGF2YWlsYWJsZSBidWZmZXIgc2xvdC4iKTsKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQl9CisJCQl2Zi0+c2lnbmFsX3R5cGUgPSAwOworCQkJdmYtPmluZGV4ID0gYnVmZmVyX2luZGV4OworCQkJdmYtPndpZHRoID0gdm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoOworCQkJdmYtPmhlaWdodCA9IHZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQ7CisJCQl2Zi0+YnVmV2lkdGggPSAxOTIwOworCQkJdmYtPmZsYWcgPSAwOworCQkJdmYtPm9yaWVudGF0aW9uID0gdm1wZWc0X3JvdGF0aW9uOworCQkJdmYtPnB0cyA9IHB0czsKKwkJCXZmLT5wdHNfdXM2NCA9IHB0c191czY0OworCQkJdmYtPmR1cmF0aW9uID0gZHVyYXRpb24gPj4gMTsKKwkJCXZmLT5kdXJhdGlvbl9wdWxsZG93biA9IDA7CisJCQl2Zi0+dHlwZSA9IChyZWcgJiBUT1BfRklFTERfRklSU1RfRkxBRykgPworCQkJCVZJRFRZUEVfSU5URVJMQUNFX1RPUCA6CisJCQkJVklEVFlQRV9JTlRFUkxBQ0VfQk9UVE9NOworI2lmZGVmIE5WMjEKKwkJCXZmLT50eXBlIHw9IFZJRFRZUEVfVklVX05WMjE7CisjZW5kaWYKKwkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9CisJCQkJaW5kZXgyY2FudmFzKGJ1ZmZlcl9pbmRleCk7CisJCQl2Zi0+dHlwZV9vcmlnaW5hbCA9IHZmLT50eXBlOworCisJCQlzZXRfYXNwZWN0X3JhdGlvKHZmLCBSRUFEX1ZSRUcoTVA0X1BJQ19SQVRJTykpOworCisJCQl2ZmJ1Zl91c2VbYnVmZmVyX2luZGV4XSsrOworCQkJdmYtPm1lbV9oYW5kbGUgPQorCQkJCWRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJCW1tX2Jsa19oYW5kbGUsCisJCQkJCWJ1ZmZlcl9pbmRleCk7CisKKwkJCWtmaWZvX3B1dCgmZGlzcGxheV9xLCAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQkJQVRSQUNFX0NPVU5URVIoTU9EVUxFX05BTUUsIHZmLT5wdHMpOworCisJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoUFJPVklERVJfTkFNRSwKKwkJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1ZGUkFNRV9SRUFEWSwKKwkJCQkJTlVMTCk7CisKKwkJCWlmIChrZmlmb19nZXQoJm5ld2ZyYW1lX3EsICZ2ZikgPT0gMCkgeworCQkJCXByaW50aygKKwkJCQkiZmF0YWwgZXJyb3IsIG5vIGF2YWlsYWJsZSBidWZmZXIgc2xvdC4iKTsKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQl9CisJCQl2Zi0+c2lnbmFsX3R5cGUgPSAwOworCQkJdmYtPmluZGV4ID0gYnVmZmVyX2luZGV4OworCQkJdmYtPndpZHRoID0gdm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoOworCQkJdmYtPmhlaWdodCA9IHZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQ7CisJCQl2Zi0+YnVmV2lkdGggPSAxOTIwOworCQkJdmYtPmZsYWcgPSAwOworCQkJdmYtPm9yaWVudGF0aW9uID0gdm1wZWc0X3JvdGF0aW9uOworCisJCQl2Zi0+cHRzID0gMDsKKwkJCXZmLT5wdHNfdXM2NCA9IDA7CisJCQl2Zi0+ZHVyYXRpb24gPSBkdXJhdGlvbiA+PiAxOworCisJCQl2Zi0+ZHVyYXRpb25fcHVsbGRvd24gPSAwOworCQkJdmYtPnR5cGUgPSAocmVnICYgVE9QX0ZJRUxEX0ZJUlNUX0ZMQUcpID8KKwkJCVZJRFRZUEVfSU5URVJMQUNFX0JPVFRPTSA6IFZJRFRZUEVfSU5URVJMQUNFX1RPUDsKKyNpZmRlZiBOVjIxCisJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX1ZJVV9OVjIxOworI2VuZGlmCisJCQl2Zi0+Y2FudmFzMEFkZHIgPSB2Zi0+Y2FudmFzMUFkZHIgPQorCQkJCQlpbmRleDJjYW52YXMoYnVmZmVyX2luZGV4KTsKKwkJCXZmLT50eXBlX29yaWdpbmFsID0gdmYtPnR5cGU7CisKKwkJCXNldF9hc3BlY3RfcmF0aW8odmYsIFJFQURfVlJFRyhNUDRfUElDX1JBVElPKSk7CisKKwkJCXZmYnVmX3VzZVtidWZmZXJfaW5kZXhdKys7CisJCQl2Zi0+bWVtX2hhbmRsZSA9CisJCQkJZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCQkJbW1fYmxrX2hhbmRsZSwKKwkJCQkJYnVmZmVyX2luZGV4KTsKKworCQkJYW1sb2dfbWFzayhMT0dfTUFTS19QVFMsCisJCQkiWyVzOiVkXSBbaW50ZV0gZHVyPTB4JXggcmF0ZT0lZCBwaWN0dXJlX3R5cGU9JWRcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fLCB2Zi0+ZHVyYXRpb24sCisJCQkJdm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUsIHBpY3R1cmVfdHlwZSk7CisKKwkJCWtmaWZvX3B1dCgmZGlzcGxheV9xLCAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQkJQVRSQUNFX0NPVU5URVIoTU9EVUxFX05BTUUsIHZmLT5wdHMpOworCisJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoUFJPVklERVJfTkFNRSwKKwkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfVkZSQU1FX1JFQURZLAorCQkJCU5VTEwpOworCisJCX0gZWxzZSB7CS8qIHByb2dyZXNzaXZlICovCisJCQlpZiAoa2ZpZm9fZ2V0KCZuZXdmcmFtZV9xLCAmdmYpID09IDApIHsKKwkJCQlwcmludGsKKwkJCQkoImZhdGFsIGVycm9yLCBubyBhdmFpbGFibGUgYnVmZmVyIHNsb3QuIik7CisJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJfQorCQkJdmYtPnNpZ25hbF90eXBlID0gMDsKKwkJCXZmLT5pbmRleCA9IGJ1ZmZlcl9pbmRleDsKKwkJCXZmLT53aWR0aCA9IHZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby53aWR0aDsKKwkJCXZmLT5oZWlnaHQgPSB2bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0OworCQkJdmYtPmJ1ZldpZHRoID0gMTkyMDsKKwkJCXZmLT5mbGFnID0gMDsKKwkJCXZmLT5vcmllbnRhdGlvbiA9IHZtcGVnNF9yb3RhdGlvbjsKKwkJCXZmLT5wdHMgPSBwdHM7CisJCQl2Zi0+cHRzX3VzNjQgPSBwdHNfdXM2NDsKKwkJCXZmLT5kdXJhdGlvbiA9IGR1cmF0aW9uOworCQkJdmYtPmR1cmF0aW9uX3B1bGxkb3duID0gcmVwZWF0X2NudCAqIGR1cmF0aW9uOworI2lmZGVmIE5WMjEKKwkJCXZmLT50eXBlID0KKwkJCQlWSURUWVBFX1BST0dSRVNTSVZFIHwgVklEVFlQRV9WSVVfRklFTEQgfAorCQkJCVZJRFRZUEVfVklVX05WMjE7CisjZWxzZQorCQkJdmYtPnR5cGUgPSBWSURUWVBFX1BST0dSRVNTSVZFIHwgVklEVFlQRV9WSVVfRklFTEQ7CisjZW5kaWYKKwkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9CisJCQkJCWluZGV4MmNhbnZhcyhidWZmZXJfaW5kZXgpOworCQkJdmYtPnR5cGVfb3JpZ2luYWwgPSB2Zi0+dHlwZTsKKworCQkJc2V0X2FzcGVjdF9yYXRpbyh2ZiwgUkVBRF9WUkVHKE1QNF9QSUNfUkFUSU8pKTsKKworCQkJYW1sb2dfbWFzayhMT0dfTUFTS19QVFMsCisJCQkiWyVzOiVkXSBbcHJvZ10gZHVyPTB4JXggcmF0ZT0lZCBwaWN0dXJlX3R5cGU9JWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHZmLT5kdXJhdGlvbiwKKwkJCXZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5yYXRlLCBwaWN0dXJlX3R5cGUpOworCisJCQl2ZmJ1Zl91c2VbYnVmZmVyX2luZGV4XSsrOworCQkJdmYtPm1lbV9oYW5kbGUgPQorCQkJCWRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJCW1tX2Jsa19oYW5kbGUsCisJCQkJCWJ1ZmZlcl9pbmRleCk7CisKKwkJCWtmaWZvX3B1dCgmZGlzcGxheV9xLCAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQkJQVRSQUNFX0NPVU5URVIoTU9EVUxFX05BTUUsIHZmLT5wdHMpOworCisJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoUFJPVklERVJfTkFNRSwKKwkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfVkZSQU1FX1JFQURZLAorCQkJCU5VTEwpOworCQl9CisKKwkJdG90YWxfZnJhbWUgKz0gcmVwZWF0X2NudCArIDE7CisKKwkJV1JJVEVfVlJFRyhNUkVHX0JVRkZFUk9VVCwgMCk7CisKKwkJbGFzdF92b3BfdGltZV9pbmMgPSB2b3BfdGltZV9pbmM7CisKKwkJLypjb3VudCBpbmZvKi8KKwkJZ3ZzLT5mcmFtZV9kdXIgPSBkdXJhdGlvbjsKKwkJdmRlY19jb3VudF9pbmZvKGd2cywgMCwgb2Zmc2V0KTsKKwl9CisKKwlXUklURV9WUkVHKEFTU0lTVF9NQk9YMV9DTFJfUkVHLCAxKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyAqdm1wZWdfdmZfcGVlayh2b2lkICpvcF9hcmcpCit7CisJc3RydWN0IHZmcmFtZV9zICp2ZjsKKworCWlmIChrZmlmb19wZWVrKCZkaXNwbGF5X3EsICZ2ZikpCisJCXJldHVybiB2ZjsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2bXBlZ192Zl9nZXQodm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCB2ZnJhbWVfcyAqdmY7CisKKwlpZiAoa2ZpZm9fZ2V0KCZkaXNwbGF5X3EsICZ2ZikpCisJCXJldHVybiB2ZjsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCB2bXBlZ192Zl9wdXQoc3RydWN0IHZmcmFtZV9zICp2Ziwgdm9pZCAqb3BfYXJnKQoreworCWtmaWZvX3B1dCgmcmVjeWNsZV9xLCAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworfQorCitzdGF0aWMgaW50IHZtcGVnX2V2ZW50X2NiKGludCB0eXBlLCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlX2RhdGEpCit7CisJaWYgKHR5cGUgJiBWRlJBTUVfRVZFTlRfUkVDRUlWRVJfUkVTRVQpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlhbXZkZWNfc3RvcCgpOworI2lmbmRlZiBDT05GSUdfQU1MT0dJQ19QT1NUX1BST0NFU1NfTUFOQUdFUgorCQl2Zl9saWdodF91bnJlZ19wcm92aWRlcigmdm1wZWdfdmZfcHJvdik7CisjZW5kaWYKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKKwkJdm1wZWc0X2xvY2FsX2luaXQoKTsKKwkJdm1wZWc0X3Byb3RfaW5pdCgpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CisjaWZuZGVmIENPTkZJR19BTUxPR0lDX1BPU1RfUFJPQ0VTU19NQU5BR0VSCisJCXZmX3JlZ19wcm92aWRlcigmdm1wZWdfdmZfcHJvdik7CisjZW5kaWYKKwkJYW12ZGVjX3N0YXJ0KCk7CisJfQorCisJaWYgKHR5cGUgJiBWRlJBTUVfRVZFTlRfUkVDRUlWRVJfUkVRX1NUQVRFKSB7CisJCXN0cnVjdCBwcm92aWRlcl9zdGF0ZV9yZXFfcyAqcmVxID0KKwkJCShzdHJ1Y3QgcHJvdmlkZXJfc3RhdGVfcmVxX3MgKilkYXRhOworCQlpZiAocmVxLT5yZXFfdHlwZSA9PSBSRVFfU1RBVEVfU0VDVVJFICYmIHZkZWMpCisJCQlyZXEtPnJlcV9yZXN1bHRbMF0gPSB2ZGVjX3NlY3VyZSh2ZGVjKTsKKwkJZWxzZQorCQkJcmVxLT5yZXFfcmVzdWx0WzBdID0gMHhmZmZmZmZmZjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm1wZWdfdmZfc3RhdGVzKHN0cnVjdCB2ZnJhbWVfc3RhdGVzICpzdGF0ZXMsIHZvaWQgKm9wX2FyZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKKworCXN0YXRlcy0+dmZfcG9vbF9zaXplID0gVkZfUE9PTF9TSVpFOworCXN0YXRlcy0+YnVmX2ZyZWVfbnVtID0ga2ZpZm9fbGVuKCZuZXdmcmFtZV9xKTsKKwlzdGF0ZXMtPmJ1Zl9hdmFpbF9udW0gPSBrZmlmb19sZW4oJmRpc3BsYXlfcSk7CisJc3RhdGVzLT5idWZfcmVjeWNsZV9udW0gPSBrZmlmb19sZW4oJnJlY3ljbGVfcSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdm1wZWc0X25vdGlmeV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlwcl9pbmZvKCJmcmFtZSBkdXJhdGlvbiBjaGFuZ2VkICVkXG4iLCB2bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSk7CisJdmZfbm90aWZ5X3JlY2VpdmVyKFBST1ZJREVSX05BTUUsCisJCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9GUl9ISU5ULAorCQkJCQkodm9pZCAqKQorCQkJCQkoKHVuc2lnbmVkIGxvbmcpCisJCQkJCXZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5yYXRlKSk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCByZXNldF9kb193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJYW12ZGVjX3N0b3AoKTsKKyNpZm5kZWYgQ09ORklHX0FNTE9HSUNfUE9TVF9QUk9DRVNTX01BTkFHRVIKKwl2Zl9saWdodF91bnJlZ19wcm92aWRlcigmdm1wZWdfdmZfcHJvdik7CisjZW5kaWYKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCXZtcGVnNF9sb2NhbF9pbml0KCk7CisJdm1wZWc0X3Byb3RfaW5pdCgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKKyNpZm5kZWYgQ09ORklHX0FNTE9HSUNfUE9TVF9QUk9DRVNTX01BTkFHRVIKKwl2Zl9yZWdfcHJvdmlkZXIoJnZtcGVnX3ZmX3Byb3YpOworI2VuZGlmCisJYW12ZGVjX3N0YXJ0KCk7Cit9CisKK3N0YXRpYyB2b2lkIHZtcGVnNF9zZXRfY2xrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwkJaW50IGZwcyA9IDk2MDAwIC8gZnJhbWVfZHVyOworCisJCXNhdmVkX3Jlc29sdXRpb24gPSBmcmFtZV93aWR0aCAqIGZyYW1lX2hlaWdodCAqIGZwczsKKwkJdmRlY19zb3VyY2VfY2hhbmdlZChWRk9STUFUX01QRUc0LAorCQkJZnJhbWVfd2lkdGgsIGZyYW1lX2hlaWdodCwgZnBzKTsKK30KKworc3RhdGljIHZvaWQgdm1wZWdfcHV0X3RpbWVyX2Z1bmMoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworCXdoaWxlICgha2ZpZm9faXNfZW1wdHkoJnJlY3ljbGVfcSkgJiYgKFJFQURfVlJFRyhNUkVHX0JVRkZFUklOKSA9PSAwKSkgeworCQlzdHJ1Y3QgdmZyYW1lX3MgKnZmOworCisJCWlmIChrZmlmb19nZXQoJnJlY3ljbGVfcSwgJnZmKSkgeworCQkJaWYgKCh2Zi0+aW5kZXggPCBERUNPREVfQlVGRkVSX05VTV9NQVgpCisJCQkJJiYgKC0tdmZidWZfdXNlW3ZmLT5pbmRleF0gPT0gMCkpIHsKKwkJCQlXUklURV9WUkVHKE1SRUdfQlVGRkVSSU4sIH4oMSA8PCB2Zi0+aW5kZXgpKTsKKwkJCQl2Zi0+aW5kZXggPSBERUNPREVfQlVGRkVSX05VTV9NQVg7CisJCX0KKwkJCWtmaWZvX3B1dCgmbmV3ZnJhbWVfcSwgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwkJfQorCX0KKworCWlmIChmcmFtZV9kdXIgPiAwICYmIHNhdmVkX3Jlc29sdXRpb24gIT0KKwkJZnJhbWVfd2lkdGggKiBmcmFtZV9oZWlnaHQgKiAoOTYwMDAgLyBmcmFtZV9kdXIpKQorCXNjaGVkdWxlX3dvcmsoJnNldF9jbGtfd29yayk7CisKKwlpZiAoUkVBRF9WUkVHKEFWX1NDUkFUQ0hfTCkpIHsKKwkJcHJfaW5mbygibXBlZzQgZmF0YWwgZXJyb3IgaGFwcGVuZWQsbmVlZCByZXNldCAgICAhIVxuIik7CisJCXNjaGVkdWxlX3dvcmsoJnJlc2V0X3dvcmspOworCX0KKworCisJdGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgUFVUX0lOVEVSVkFMOworCisJYWRkX3RpbWVyKHRpbWVyKTsKK30KKworaW50IHZtcGVnNF9kZWNfc3RhdHVzKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHN0cnVjdCB2ZGVjX2luZm8gKnZzdGF0dXMpCit7CisJaWYgKCEoc3RhdCAmIFNUQVRfVkRFQ19SVU4pKQorCQlyZXR1cm4gLTE7CisKKwl2c3RhdHVzLT5mcmFtZV93aWR0aCA9IHZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby53aWR0aDsKKwl2c3RhdHVzLT5mcmFtZV9oZWlnaHQgPSB2bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0OworCWlmICgwICE9IHZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5yYXRlKQorCQl2c3RhdHVzLT5mcmFtZV9yYXRlID0KKwkJCURVUkFUSU9OX1VOSVQgLyB2bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZTsKKwllbHNlCisJCXZzdGF0dXMtPmZyYW1lX3JhdGUgPSAtMTsKKwl2c3RhdHVzLT5lcnJvcl9jb3VudCA9IFJFQURfVlJFRyhNUDRfRVJSX0NPVU5UKTsKKwl2c3RhdHVzLT5zdGF0dXMgPSBzdGF0OworCXZzdGF0dXMtPmJpdF9yYXRlID0gZ3ZzLT5iaXRfcmF0ZTsKKwl2c3RhdHVzLT5mcmFtZV9kdXIgPSBmcmFtZV9kdXI7CisJdnN0YXR1cy0+ZnJhbWVfZGF0YSA9IGd2cy0+ZnJhbWVfZGF0YTsKKwl2c3RhdHVzLT50b3RhbF9kYXRhID0gZ3ZzLT50b3RhbF9kYXRhOworCXZzdGF0dXMtPmZyYW1lX2NvdW50ID0gZ3ZzLT5mcmFtZV9jb3VudDsKKwl2c3RhdHVzLT5lcnJvcl9mcmFtZV9jb3VudCA9IGd2cy0+ZXJyb3JfZnJhbWVfY291bnQ7CisJdnN0YXR1cy0+ZHJvcF9mcmFtZV9jb3VudCA9IGd2cy0+ZHJvcF9mcmFtZV9jb3VudDsKKwl2c3RhdHVzLT50b3RhbF9kYXRhID0gZ3ZzLT50b3RhbF9kYXRhOworCXZzdGF0dXMtPnNhbXBfY250ID0gZ3ZzLT5zYW1wX2NudDsKKwl2c3RhdHVzLT5vZmZzZXQgPSBndnMtPm9mZnNldDsKKwlzbnByaW50Zih2c3RhdHVzLT52ZGVjX25hbWUsIHNpemVvZih2c3RhdHVzLT52ZGVjX25hbWUpLAorCQkiJXMiLCBEUklWRVJfTkFNRSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHZtcGVnNF9zZXRfaXNyZXNldChzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgaXNyZXNldCkKK3sKKwlpc19yZXNldCA9IGlzcmVzZXQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm1wZWc0X3ZkZWNfaW5mb19pbml0KHZvaWQpCit7CisJZ3ZzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZkZWNfaW5mbyksIEdGUF9LRVJORUwpOworCWlmIChOVUxMID09IGd2cykgeworCQlwcl9pbmZvKCJ0aGUgc3RydWN0IG9mIHZkZWMgc3RhdHVzIG1hbGxvYyBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgdm1wZWc0X2NhbnZhc19pbml0KHZvaWQpCit7CisJaW50IGksIHJldDsKKwl1MzIgY2FudmFzX3dpZHRoLCBjYW52YXNfaGVpZ2h0OworCXVuc2lnbmVkIGxvbmcgYnVmX3N0YXJ0OworCXUzMiBhbGxvY19zaXplLCBkZWNidWZfc2l6ZSwgZGVjYnVmX3lfc2l6ZSwgZGVjYnVmX3V2X3NpemU7CisKKwlpZiAoYnVmX3NpemUgPD0gMHgwMDQwMDAwMCkgeworCQkvKiBTRCBvbmx5ICovCisJCWNhbnZhc193aWR0aCA9IDc2ODsKKwkJY2FudmFzX2hlaWdodCA9IDU3NjsKKwkJZGVjYnVmX3lfc2l6ZSA9IDB4ODAwMDA7CisJCWRlY2J1Zl91dl9zaXplID0gMHgyMDAwMDsKKwkJZGVjYnVmX3NpemUgPSAweDEwMDAwMDsKKwl9IGVsc2UgeworCQlpbnQgdyA9IHZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby53aWR0aDsKKwkJaW50IGggPSB2bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0OworCQlpbnQgYWxpZ25fdywgYWxpZ25faDsKKwkJaW50IG1heCwgbWluOworCisJCWFsaWduX3cgPSBBTElHTih3LCA2NCk7CisJCWFsaWduX2ggPSBBTElHTihoLCA2NCk7CisJCWlmIChhbGlnbl93ID4gYWxpZ25faCkgeworCQkJbWF4ID0gYWxpZ25fdzsKKwkJCW1pbiA9IGFsaWduX2g7CisJCX0gZWxzZSB7CisJCQltYXggPSBhbGlnbl9oOworCQkJbWluID0gYWxpZ25fdzsKKwkJfQorCQkvKiBIRCAmIFNEICovCisJCWlmICgobWF4ID4gMTkyMCB8fCBtaW4gPiAxMDg4KSAmJgorCQkJQUxJR04oYWxpZ25fdyAqIGFsaWduX2ggKiAzLzIsIFNaXzY0SykgKiA5IDw9CisJCQlidWZfc2l6ZSkgeworCQkJY2FudmFzX3dpZHRoID0gYWxpZ25fdzsKKwkJCWNhbnZhc19oZWlnaHQgPSBhbGlnbl9oOworCQkJZGVjYnVmX3lfc2l6ZSA9IEFMSUdOKGFsaWduX3cgKiBhbGlnbl9oLCBTWl82NEspOworCQkJZGVjYnVmX3V2X3NpemUgPSBBTElHTihhbGlnbl93ICogYWxpZ25faC80LCBTWl82NEspOworCQkJZGVjYnVmX3NpemUgPSBBTElHTihhbGlnbl93ICogYWxpZ25faCAqIDMvMiwgU1pfNjRLKTsKKwkJfSBlbHNlIHsgLyoxMDgwcCovCisJCQlpZiAoaCA+IHcpIHsKKwkJCQljYW52YXNfd2lkdGggPSAxMDg4OworCQkJCWNhbnZhc19oZWlnaHQgPSAxOTIwOworCQkJfSBlbHNlIHsKKwkJCQljYW52YXNfd2lkdGggPSAxOTIwOworCQkJCWNhbnZhc19oZWlnaHQgPSAxMDg4OworCQkJfQorCQkJZGVjYnVmX3lfc2l6ZSA9IDB4MjAwMDAwOworCQkJZGVjYnVmX3V2X3NpemUgPSAweDgwMDAwOworCQkJZGVjYnVmX3NpemUgPSAweDMwMDAwMDsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQk1NVV9CVUZGRVJfTlVNOyBpKyspIHsKKwkJLyogd29ya3NwYWNlIG1lbSAqLworCQlpZiAoaSA9PSAoTUFYX0JNTVVfQlVGRkVSX05VTSAtIDEpKQorCQkJYWxsb2Nfc2l6ZSA9ICBXT1JLU1BBQ0VfU0laRTsKKwkJZWxzZQorCQkJYWxsb2Nfc2l6ZSA9IGRlY2J1Zl9zaXplOworCisJCXJldCA9IGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeShtbV9ibGtfaGFuZGxlLCBpLAorCQkJCWFsbG9jX3NpemUsIERSSVZFUl9OQU1FLCAmYnVmX3N0YXJ0KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlpZiAoaSA9PSAoTUFYX0JNTVVfQlVGRkVSX05VTSAtIDEpKSB7CisJCQlidWZfb2Zmc2V0ID0gYnVmX3N0YXJ0IC0gRENBQ19CVUZGX1NUQVJUX0lQOworCQkJY29udGludWU7CisJCX0KKworCisjaWZkZWYgTlYyMQorCQljb25maWdfY2F2X2x1dF9leCgyICogaSArIDAsCisJCQlidWZfc3RhcnQsCisJCQljYW52YXNfd2lkdGgsIGNhbnZhc19oZWlnaHQsCisJCQlDQU5WQVNfQUREUl9OT1dSQVAsIENBTlZBU19CTEtNT0RFXzMyWDMyLCAwLCBWREVDXzEpOworCQljb25maWdfY2F2X2x1dF9leCgyICogaSArIDEsCisJCQlidWZfc3RhcnQgKworCQkJZGVjYnVmX3lfc2l6ZSwgY2FudmFzX3dpZHRoLAorCQkJY2FudmFzX2hlaWdodCAvIDIsIENBTlZBU19BRERSX05PV1JBUCwKKwkJCUNBTlZBU19CTEtNT0RFXzMyWDMyLCAwLCBWREVDXzEpOworI2Vsc2UKKwkJY29uZmlnX2Nhdl9sdXRfZXgoMyAqIGkgKyAwLAorCQkJYnVmX3N0YXJ0LAorCQkJY2FudmFzX3dpZHRoLCBjYW52YXNfaGVpZ2h0LAorCQkJQ0FOVkFTX0FERFJfTk9XUkFQLCBDQU5WQVNfQkxLTU9ERV8zMlgzMiwgMCwgVkRFQ18xKTsKKwkJY29uZmlnX2Nhdl9sdXRfZXgoMyAqIGkgKyAxLAorCQkJYnVmX3N0YXJ0ICsKKwkJCWRlY2J1Zl95X3NpemUsIGNhbnZhc193aWR0aCAvIDIsCisJCQljYW52YXNfaGVpZ2h0IC8gMiwgQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJQ0FOVkFTX0JMS01PREVfMzJYMzIsIDAsIFZERUNfMSk7CisJCWNvbmZpZ19jYXZfbHV0X2V4KDMgKiBpICsgMiwKKwkJCWJ1Zl9zdGFydCArCisJCQlkZWNidWZfeV9zaXplICsgZGVjYnVmX3V2X3NpemUsCisJCQljYW52YXNfd2lkdGggLyAyLCBjYW52YXNfaGVpZ2h0IC8gMiwKKwkJCUNBTlZBU19BRERSX05PV1JBUCwgQ0FOVkFTX0JMS01PREVfMzJYMzIsIDAsIFZERUNfMSk7CisjZW5kaWYKKworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bXBlZzRfcHJvdF9pbml0KHZvaWQpCit7CisJaW50IHI7CisjaWYgMQkvKiAvTUVTT05fQ1BVX1RZUEUgPj0gTUVTT05fQ1BVX1RZUEVfTUVTT042ICovCisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAoMSA8PCA3KSB8ICgxIDw8IDYpKTsKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsIDApOworI2Vsc2UKKwlXUklURV9SRVNFVF9SRUcoUkVTRVQwX1JFR0lTVEVSLCBSRVNFVF9JUUlEQ1QgfCBSRVNFVF9NQyk7CisjZW5kaWYKKworCXIgPSB2bXBlZzRfY2FudmFzX2luaXQoKTsKKworCS8qIGluZGV4IHYgPDwgMTYgfCB1IDw8IDggfCB5ICovCisjaWZkZWYgTlYyMQorCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8wLCAweDAxMDEwMCk7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzEsIDB4MDMwMzAyKTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfMiwgMHgwNTA1MDQpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8zLCAweDA3MDcwNik7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0csIDB4MDkwOTA4KTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfSCwgMHgwYjBiMGEpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9JLCAweDBkMGQwYyk7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0osIDB4MGYwZjBlKTsKKyNlbHNlCisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzAsIDB4MDIwMTAwKTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfMSwgMHgwNTA0MDMpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8yLCAweDA4MDcwNik7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzMsIDB4MGIwYTA5KTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfRywgMHgwZTBkMGMpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9ILCAweDExMTAwZik7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0ksIDB4MTQxMzEyKTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfSiwgMHgxNzE2MTUpOworI2VuZGlmCisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0wsIDApOy8qY2xlYXJmYXRhbCBlcnJvciBmbGFnKi8KKworCS8qIG5vdGlmeSB1Y29kZSB0aGUgYnVmZmVyIG9mZnNldCAqLworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9GLCBidWZfb2Zmc2V0KTsKKworCS8qIGRpc2FibGUgUFNDQUxFIGZvciBoYXJkd2FyZSBzaGFyaW5nICovCisJV1JJVEVfVlJFRyhQU0NBTEVfQ1RSTCwgMCk7CisKKwkvKiBjbGVhciByZXBlYXQgY291bnQgKi8KKwlXUklURV9WUkVHKE1QNF9OT1RfQ09ERURfQ05ULCAwKTsKKworCVdSSVRFX1ZSRUcoTVJFR19CVUZGRVJJTiwgMCk7CisJV1JJVEVfVlJFRyhNUkVHX0JVRkZFUk9VVCwgMCk7CisKKwkvKiBjbGVhciBtYWlsYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoQVNTSVNUX01CT1gxX0NMUl9SRUcsIDEpOworCisJLyogZW5hYmxlIG1haWxib3ggaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfTUFTSywgMSk7CisKKworCisjaWZkZWYgTlYyMQorCVNFVF9WUkVHX01BU0soTURFQ19QSUNfRENfQ1RSTCwgMSA8PCAxNyk7CisjZW5kaWYKKworI2lmIDEvKiAvTUVTT05fQ1BVX1RZUEUgPj0gTUVTT05fQ1BVX1RZUEVfTUVTT044ICovCisJcHJfZGVidWcoIm1wZWc0IG1lc29uOCBwcm90IGluaXRcbiIpOworCVdSSVRFX1ZSRUcoTURFQ19QSUNfRENfVEhSRVNILCAweDQwNDAzOGFhKTsKKyNlbmRpZgorCisJV1JJVEVfVlJFRyhNUDRfUElDX1dILCAodm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLgorCQl3aWR0aCA8PCAxNikgfCB2bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0KTsKKwlXUklURV9WUkVHKE1QNF9TWVNfUkFURSwgdm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUpOworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCB2bXBlZzRfbG9jYWxfaW5pdCh2b2lkKQoreworCWludCBpOworCisJdm1wZWc0X3JhdGlvID0gdm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGlvOworCisJdm1wZWc0X3JhdGlvNjQgPSB2bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8ucmF0aW82NDsKKworCXZtcGVnNF9yb3RhdGlvbiA9CisJCSgoKHVuc2lnbmVkIGxvbmcpIHZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5wYXJhbSkKKwkJCT4+IDE2KSAmIDB4ZmZmZjsKKworCWZyYW1lX3dpZHRoID0gZnJhbWVfaGVpZ2h0ID0gZnJhbWVfZHVyID0gZnJhbWVfcHJvZyA9IDA7CisKKwl0b3RhbF9mcmFtZSA9IDA7CisJc2F2ZWRfcmVzb2x1dGlvbiA9IDA7CisJbGFzdF9hbmNoX3B0cyA9IDA7CisKKwlsYXN0X2FuY2hfcHRzX3VzNjQgPSAwOworCisJbGFzdF92b3BfdGltZV9pbmMgPSBsYXN0X2R1cmF0aW9uID0gMDsKKworCXZvcF90aW1lX2luY19zaW5jZV9sYXN0X2FuY2ggPSAwOworCisJZnJhbWVfbnVtX3NpbmNlX2xhc3RfYW5jaCA9IDA7CisKKyNpZmRlZiBDT05GSUdfQU1fVkRFQ19NUEVHNF9MT0cKKwlwdHNfaGl0ID0gcHRzX21pc3NlZCA9IHB0c19pX2hpdCA9IHB0c19pX21pc3NlZCA9IDA7CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCBERUNPREVfQlVGRkVSX05VTV9NQVg7IGkrKykKKwkJdmZidWZfdXNlW2ldID0gMDsKKworCUlOSVRfS0ZJRk8oZGlzcGxheV9xKTsKKwlJTklUX0tGSUZPKHJlY3ljbGVfcSk7CisJSU5JVF9LRklGTyhuZXdmcmFtZV9xKTsKKworCWZvciAoaSA9IDA7IGkgPCBWRl9QT09MX1NJWkU7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKnZmID0gJnZmcG9vbFtpXTsKKworCQl2ZnBvb2xbaV0uaW5kZXggPSBERUNPREVfQlVGRkVSX05VTV9NQVg7CisJCWtmaWZvX3B1dCgmbmV3ZnJhbWVfcSwgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwl9CisJaWYgKG1tX2Jsa19oYW5kbGUpIHsKKwkJZGVjb2Rlcl9ibW11X2JveF9mcmVlKG1tX2Jsa19oYW5kbGUpOworCQltbV9ibGtfaGFuZGxlID0gTlVMTDsKKwl9CisKKwkJbW1fYmxrX2hhbmRsZSA9IGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYm94KAorCQkJRFJJVkVSX05BTUUsCisJCQkwLAorCQkJTUFYX0JNTVVfQlVGRkVSX05VTSwKKwkJCTQgKyBQQUdFX1NISUZULAorCQkJQ09ERUNfTU1fRkxBR1NfQ01BX0NMRUFSIHwKKwkJCUNPREVDX01NX0ZMQUdTX0ZPUl9WREVDT0RFUik7Cit9CisKK3N0YXRpYyBzMzIgdm1wZWc0X2luaXQodm9pZCkKK3sKKwlpbnQgdHJpY2ttb2RlX2ZmZmIgPSAwOworCWludCBzaXplID0gLTEsIHJldCA9IC0xOworCWNoYXIgZndfbmFtZVszMl0gPSB7MH07CisJY2hhciAqYnVmID0gdm1hbGxvYygweDEwMDAgKiAxNik7CisKKwlpZiAoSVNfRVJSX09SX05VTEwoYnVmKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJYW1sb2dfbGV2ZWwoTE9HX0xFVkVMX0lORk8sICJ2bXBlZzRfaW5pdFxuIik7CisKKwlpZiAodm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLmZvcm1hdCA9PQorCQkJCVZJREVPX0RFQ19GT1JNQVRfTVBFRzRfNSkgeworCQlzaXplID0gZ2V0X2Zpcm13YXJlX2RhdGEoVklERU9fREVDX01QRUc0XzUsIGJ1Zik7CisJCXN0cm5jcHkoZndfbmFtZSwgInZtcGVnNF9tY181Iiwgc2l6ZW9mKGZ3X25hbWUpKTsKKworCQlhbWxvZ19sZXZlbChMT0dfTEVWRUxfSU5GTywgImxvYWQgVklERU9fREVDX0ZPUk1BVF9NUEVHNF81XG4iKTsKKwl9IGVsc2UgaWYgKHZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5mb3JtYXQgPT0gVklERU9fREVDX0ZPUk1BVF9IMjYzKSB7CisJCXNpemUgPSBnZXRfZmlybXdhcmVfZGF0YShWSURFT19ERUNfSDI2MywgYnVmKTsKKwkJc3RybmNweShmd19uYW1lLCAiaDI2M19tYyIsIHNpemVvZihmd19uYW1lKSk7CisKKwkJcHJfaW5mbygibG9hZCBWSURFT19ERUNfRk9STUFUX0gyNjNcbiIpOworCX0gZWxzZQorCQlwcl9lcnIoInVuc3VwcG9ydCBtcGVnNCBzdWIgZm9ybWF0ICVkXG4iLAorCQkJCXZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5mb3JtYXQpOworCisJaWYgKHNpemUgPCAwKSB7CisJCXByX2VycigiZ2V0IGZpcm13YXJlIGZhaWwuIik7CisJCXZmcmVlKGJ1Zik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXQgPSBhbXZkZWNfbG9hZG1jX2V4KFZGT1JNQVRfTVBFRzQsIGZ3X25hbWUsIGJ1Zik7CisJaWYgKHJldCA8IDApIHsKKwkJYW12ZGVjX2Rpc2FibGUoKTsKKwkJdmZyZWUoYnVmKTsKKwkJcHJfZXJyKCIlczogdGhlICVzIGZ3IGxvYWRpbmcgZmFpbGVkLCBlcnI6ICV4XG4iLAorCQkJZndfbmFtZSwgdGVlX2VuYWJsZWQoKSA/ICJURUUiIDogImxvY2FsIiwgcmV0KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwl2ZnJlZShidWYpOworCXN0YXQgfD0gU1RBVF9NQ19MT0FEOworCXF1ZXJ5X3ZpZGVvX3N0YXR1cygwLCAmdHJpY2ttb2RlX2ZmZmIpOworCisJdGltZXJfc2V0dXAoJnJlY3ljbGVfdGltZXIsIHZtcGVnX3B1dF90aW1lcl9mdW5jLCAwKTsKKwlzdGF0IHw9IFNUQVRfVElNRVJfSU5JVDsKKworCWlmICh2ZGVjX3JlcXVlc3RfaXJxKFZERUNfSVJRXzEsIHZtcGVnNF9pc3IsCisJCQkidm1wZWc0LWlycSIsICh2b2lkICopdm1wZWc0X2RlY19pZCkpIHsKKwkJYW1sb2dfbGV2ZWwoTE9HX0xFVkVMX0VSUk9SLCAidm1wZWc0IGlycSByZWdpc3RlciBlcnJvci5cbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJc3RhdCB8PSBTVEFUX0lTUl9SRUc7CisJdm1wZWc0X2xvY2FsX2luaXQoKTsKKwkvKiBlbmFibGUgQU1SSVNDIHNpZGUgcHJvdG9jb2wgKi8KKwlyZXQgPSB2bXBlZzRfcHJvdF9pbml0KCk7CisJaWYgKHJldCA8IDApIAkgeworCQlpZiAobW1fYmxrX2hhbmRsZSkgeworCQkJZGVjb2Rlcl9ibW11X2JveF9mcmVlKG1tX2Jsa19oYW5kbGUpOworCQkJbW1fYmxrX2hhbmRsZSA9IE5VTEw7CisJCX0KKwkJcmV0dXJuIHJldDsKKwl9CisJYW12ZGVjX2VuYWJsZSgpOworCWZyX2hpbnRfc3RhdHVzID0gVkRFQ19OT19ORUVEX0hJTlQ7CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfUE9TVF9QUk9DRVNTX01BTkFHRVIKKwl2Zl9wcm92aWRlcl9pbml0KCZ2bXBlZ192Zl9wcm92LCBQUk9WSURFUl9OQU1FLCAmdm1wZWdfdmZfcHJvdmlkZXIsCisJCQkJCSBOVUxMKTsKKwl2Zl9yZWdfcHJvdmlkZXIoJnZtcGVnX3ZmX3Byb3YpOworCXZmX25vdGlmeV9yZWNlaXZlcihQUk9WSURFUl9OQU1FLCBWRlJBTUVfRVZFTlRfUFJPVklERVJfU1RBUlQsIE5VTEwpOworI2Vsc2UKKwl2Zl9wcm92aWRlcl9pbml0KCZ2bXBlZ192Zl9wcm92LCBQUk9WSURFUl9OQU1FLCAmdm1wZWdfdmZfcHJvdmlkZXIsCisJCQkJCSBOVUxMKTsKKwl2Zl9yZWdfcHJvdmlkZXIoJnZtcGVnX3ZmX3Byb3YpOworI2VuZGlmCisJaWYgKHZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5yYXRlICE9IDApIHsKKwkJaWYgKCFpc19yZXNldCkgeworCQkJdmZfbm90aWZ5X3JlY2VpdmVyKFBST1ZJREVSX05BTUUsCisJCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfRlJfSElOVCwKKwkJCQkJCSh2b2lkICopCisJCQkJCQkoKHVuc2lnbmVkIGxvbmcpCisJCQkJCQl2bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSkpOworCQkJZnJfaGludF9zdGF0dXMgPSBWREVDX0hJTlRFRDsKKwkJfQorCX0gZWxzZQorCQlmcl9oaW50X3N0YXR1cyA9IFZERUNfTkVFRF9ISU5UOworCisJc3RhdCB8PSBTVEFUX1ZGX0hPT0s7CisKKwlyZWN5Y2xlX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgUFVUX0lOVEVSVkFMOworCWFkZF90aW1lcigmcmVjeWNsZV90aW1lcik7CisKKwlzdGF0IHw9IFNUQVRfVElNRVJfQVJNOworCisJYW12ZGVjX3N0YXJ0KCk7CisKKwlzdGF0IHw9IFNUQVRfVkRFQ19SVU47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbXZkZWNfbXBlZzRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdmRlY19zICpwZGF0YSA9ICooc3RydWN0IHZkZWNfcyAqKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWlmIChwZGF0YSA9PSBOVUxMKSB7CisJCWFtbG9nX2xldmVsKExPR19MRVZFTF9FUlJPUiwKKwkJCSJhbXZkZWNfbXBlZzQgbWVtb3J5IHJlc291cmNlIHVuZGVmaW5lZC5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAocGRhdGEtPnN5c19pbmZvKSB7CisJCXZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mbyA9ICpwZGF0YS0+c3lzX2luZm87CisJCWlmICgodm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodCAhPSAwKSAmJgorCQkJKHZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby53aWR0aCA+CisJCQkoTUFYX01QRUc0X1NVUFBPUlRfU0laRS92bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0KSkpIHsKKwkJCXByX2luZm8oImFtdmRlY19tcGVnNDogb3ZlcnNpemUsIHVuc3VwcG9ydDogJWQqJWRcbiIsCisJCQkJdm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoLAorCQkJCXZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9CisJcGRhdGEtPmRlY19zdGF0dXMgPSB2bXBlZzRfZGVjX3N0YXR1czsKKwlwZGF0YS0+c2V0X2lzcmVzZXQgPSB2bXBlZzRfc2V0X2lzcmVzZXQ7CisJaXNfcmVzZXQgPSAwOworCXZkZWMgPSBwZGF0YTsKKworCUlOSVRfV09SSygmcmVzZXRfd29yaywgcmVzZXRfZG9fd29yayk7CisJSU5JVF9XT1JLKCZub3RpZnlfd29yaywgdm1wZWc0X25vdGlmeV93b3JrKTsKKwlJTklUX1dPUksoJnNldF9jbGtfd29yaywgdm1wZWc0X3NldF9jbGspOworCisJdm1wZWc0X3ZkZWNfaW5mb19pbml0KCk7CisKKwlpZiAodm1wZWc0X2luaXQoKSA8IDApIHsKKwkJYW1sb2dfbGV2ZWwoTE9HX0xFVkVMX0VSUk9SLCAiYW12ZGVjX21wZWc0IGluaXQgZmFpbGVkLlxuIik7CisJCWtmcmVlKGd2cyk7CisJCWd2cyA9IE5VTEw7CisJCXBkYXRhLT5kZWNfc3RhdHVzID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW12ZGVjX21wZWc0X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWlmIChzdGF0ICYgU1RBVF9WREVDX1JVTikgeworCQlhbXZkZWNfc3RvcCgpOworCQlzdGF0ICY9IH5TVEFUX1ZERUNfUlVOOworCX0KKworCWlmIChzdGF0ICYgU1RBVF9JU1JfUkVHKSB7CisJCXZkZWNfZnJlZV9pcnEoVkRFQ19JUlFfMSwgKHZvaWQgKil2bXBlZzRfZGVjX2lkKTsKKwkJc3RhdCAmPSB+U1RBVF9JU1JfUkVHOworCX0KKworCWlmIChzdGF0ICYgU1RBVF9USU1FUl9BUk0pIHsKKwkJZGVsX3RpbWVyX3N5bmMoJnJlY3ljbGVfdGltZXIpOworCQlzdGF0ICY9IH5TVEFUX1RJTUVSX0FSTTsKKwl9CisKKwlpZiAoc3RhdCAmIFNUQVRfVkZfSE9PSykgeworCQlpZiAoZnJfaGludF9zdGF0dXMgPT0gVkRFQ19ISU5URUQpCisJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoUFJPVklERVJfTkFNRSwKKwkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfRlJfRU5EX0hJTlQsIE5VTEwpOworCQlmcl9oaW50X3N0YXR1cyA9IFZERUNfTk9fTkVFRF9ISU5UOworCisJCXZmX3VucmVnX3Byb3ZpZGVyKCZ2bXBlZ192Zl9wcm92KTsKKwkJc3RhdCAmPSB+U1RBVF9WRl9IT09LOworCX0KKworCWNhbmNlbF93b3JrX3N5bmMoJnJlc2V0X3dvcmspOworCWNhbmNlbF93b3JrX3N5bmMoJm5vdGlmeV93b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZzZXRfY2xrX3dvcmspOworCisJYW12ZGVjX2Rpc2FibGUoKTsKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UTTIpCisJCXZkZWNfcmVzZXRfY29yZShOVUxMKTsKKwlpZiAobW1fYmxrX2hhbmRsZSkgeworCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWUobW1fYmxrX2hhbmRsZSk7CisJCW1tX2Jsa19oYW5kbGUgPSBOVUxMOworCX0KKworCWFtbG9nX21hc2soTE9HX01BU0tfUFRTLAorCQkicHRzIGhpdCAlZCwgcHRzIG1pc3NlZCAlZCwgaSBoaXQgJWQsIG1pc3NlZCAlZFxuIiwgcHRzX2hpdCwKKwkJCSAgIHB0c19taXNzZWQsIHB0c19pX2hpdCwgcHRzX2lfbWlzc2VkKTsKKwlhbWxvZ19tYXNrKExPR19NQVNLX1BUUywgInRvdGFsIGZyYW1lICVkLCByYXRlICVkXG4iLCB0b3RhbF9mcmFtZSwKKwkJCSAgIHZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5yYXRlKTsKKwlrZnJlZShndnMpOworCWd2cyA9IE5VTEw7CisJdmRlYyA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFtdmRlY19tcGVnNF9kcml2ZXIgPSB7CisJLnByb2JlID0gYW12ZGVjX21wZWc0X3Byb2JlLAorCS5yZW1vdmUgPSBhbXZkZWNfbXBlZzRfcmVtb3ZlLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kID0gYW12ZGVjX3N1c3BlbmQsCisJLnJlc3VtZSA9IGFtdmRlY19yZXN1bWUsCisjZW5kaWYKKwkuZHJpdmVyID0geworCQkubmFtZSA9IERSSVZFUl9OQU1FLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY29kZWNfcHJvZmlsZV90IGFtdmRlY19tcGVnNF9wcm9maWxlID0geworCS5uYW1lID0gIm1wZWc0IiwKKwkucHJvZmlsZSA9ICIiCit9Oworc3RhdGljIHN0cnVjdCBtY29uZmlnIG1wZWc0X2NvbmZpZ3NbXSA9IHsKKwlNQ19QVTMyKCJzdGF0IiwgJnN0YXQpLAorfTsKK3N0YXRpYyBzdHJ1Y3QgbWNvbmZpZ19ub2RlIG1wZWc0X25vZGU7CisKK3N0YXRpYyBpbnQgX19pbml0IGFtdmRlY19tcGVnNF9kcml2ZXJfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlhbWxvZ19sZXZlbChMT0dfTEVWRUxfSU5GTywgImFtdmRlY19tcGVnNCBtb2R1bGUgaW5pdFxuIik7CisKKwlpZiAocGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhbXZkZWNfbXBlZzRfZHJpdmVyKSkgeworCQlhbWxvZ19sZXZlbChMT0dfTEVWRUxfRVJST1IsCisJCSJmYWlsZWQgdG8gcmVnaXN0ZXIgYW12ZGVjX21wZWc0IGRyaXZlclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwl2Y29kZWNfcHJvZmlsZV9yZWdpc3RlcigmYW12ZGVjX21wZWc0X3Byb2ZpbGUpOworCUlOSVRfUkVHX05PREVfQ09ORklHUygibWVkaWEuZGVjb2RlciIsICZtcGVnNF9ub2RlLAorCQkibXBlZzQiLCBtcGVnNF9jb25maWdzLCBDT05GSUdfRk9SX1IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYW12ZGVjX21wZWc0X2RyaXZlcl9yZW1vdmVfbW9kdWxlKHZvaWQpCit7CisJYW1sb2dfbGV2ZWwoTE9HX0xFVkVMX0lORk8sICJhbXZkZWNfbXBlZzQgbW9kdWxlIHJlbW92ZS5cbiIpOworCisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFtdmRlY19tcGVnNF9kcml2ZXIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK21vZHVsZV9pbml0KGFtdmRlY19tcGVnNF9kcml2ZXJfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoYW12ZGVjX21wZWc0X2RyaXZlcl9yZW1vdmVfbW9kdWxlKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTUxPR0lDIE1QRUc0IFZpZGVvIERlY29kZXIgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJUaW0gWWFvIDx0aW15YW9AYW1sb2dpYy5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvbXBlZzQvdm1wZWc0LmggYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvbXBlZzQvdm1wZWc0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkxNGU2YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9tcGVnNC92bXBlZzQuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL2FtcG9ydHMvdm1wZWc0LmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBWTVBFRzRfSAorI2RlZmluZSBWTVBFRzRfSAorCisvKiAvI2lmIE1FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09ONiAqLworLyogVE9ETzogbW92ZSB0byByZWdpc3RlciBoZWFkZXJzICovCisjZGVmaW5lIFZQUF9WRDFfUE9TVEJMRU5EICAgICAgICAgICAoMSA8PCAxMCkKKy8qIC8jZW5kaWYgKi8KKworI2VuZGlmCQkJCS8qIFZNUEVHNF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvbXBlZzQvdm1wZWc0X211bHRpLmMgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvbXBlZzQvdm1wZWc0X211bHRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBjZWI3MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci9tcGVnNC92bXBlZzRfbXVsdGkuYwpAQCAtMCwwICsxLDI5OTYgQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvYW1wb3J0cy92bXBlZzQuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy9hbXN0cmVhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZnJhbWVfc3luYy9wdHNzZXJ2Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3Byb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3JlY2VpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jYW52YXMvY2FudmFzLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jb2RlY19tbS9jb2RlY19tbS5oPgorLy8jaW5jbHVkZSA8bGludXgvYW1sb2dpYy90ZWUuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L3RlZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkL2Nsb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy92ZGVjX3JlZy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvcmVnaXN0ZXJzL3JlZ2lzdGVyLmg+CisjaW5jbHVkZSAiLi4vLi4vLi4vc3RyZWFtX2lucHV0L2FtcG9ydHMvYW1wb3J0c19wcml2LmgiCisKKyNpbmNsdWRlICIuLi91dGlscy9hbXZkZWMuaCIKKyNpbmNsdWRlICIuLi91dGlscy92ZGVjX2lucHV0LmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvdmRlYy5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2Zpcm13YXJlLmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvZGVjb2Rlcl9tbXVfYm94LmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvZGVjb2Rlcl9ibW11X2JveC5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29uZmlncy5oPgorI2luY2x1ZGUgIi4uL3V0aWxzL2Zpcm13YXJlLmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvdmRlY192NGwyX2J1ZmZlcl9vcHMuaCIKKyNpbmNsdWRlICIuLi91dGlscy9jb25maWdfcGFyc2VyLmgiCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1tZW0ybWVtLmg+CisjaW5jbHVkZSAiLi4vdXRpbHMvdmRlY19mZWF0dXJlLmgiCisKKyNkZWZpbmUgRFJJVkVSX05BTUUgImFtbXZkZWNfbXBlZzQiCisKKyNkZWZpbmUgTUVNX05BTUUgImNvZGVjX21tcGVnNCIKKworI2RlZmluZSBERUJVR19QVFMKKworI2RlZmluZSBOVjIxCisjZGVmaW5lIElfUElDVFVSRSAgIDAKKyNkZWZpbmUgUF9QSUNUVVJFICAgMQorI2RlZmluZSBCX1BJQ1RVUkUgICAyCisjZGVmaW5lIEdFVF9QSUNfVFlQRSh0eXBlKSAoIklQQiMjIyMiW3R5cGUmMHgzXSkKKworI2RlZmluZSBPUklfQlVGRkVSX1NUQVJUX0FERFIgICAweDAxMDAwMDAwCisjZGVmaW5lIERFRkFVTFRfTUVNX1NJWkUJKDMyKlNaXzFNKQorCisjZGVmaW5lIElOVEVSTEFDRV9GTEFHICAgICAgICAgIDB4ODAKKyNkZWZpbmUgVE9QX0ZJRUxEX0ZJUlNUX0ZMQUcgICAgMHg0MAorCisvKiBwcm90b2NvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTVJFR19SRUYwICAgICAgICAgICBBVl9TQ1JBVENIXzEKKyNkZWZpbmUgTVJFR19SRUYxICAgICAgICAgICBBVl9TQ1JBVENIXzIKKyNkZWZpbmUgTVA0X1BJQ19SQVRJTyAgICAgICBBVl9TQ1JBVENIXzUKKyNkZWZpbmUgTVA0X1JBVEUgICAgICAgICAgICBBVl9TQ1JBVENIXzMKKyNkZWZpbmUgTVA0X0VSUl9DT1VOVCAgICAgICBBVl9TQ1JBVENIXzYKKyNkZWZpbmUgTVA0X1BJQ19XSCAgICAgICAgICBBVl9TQ1JBVENIXzcKKyNkZWZpbmUgTVJFR19JTlBVVCAgICAgICAgICBBVl9TQ1JBVENIXzgKKyNkZWZpbmUgTVJFR19CVUZGRVJPVVQgICAgICBBVl9TQ1JBVENIXzkKKyNkZWZpbmUgTVA0X05PVF9DT0RFRF9DTlQgICBBVl9TQ1JBVENIX0EKKyNkZWZpbmUgTVA0X1ZPUF9USU1FX0lOQyAgICBBVl9TQ1JBVENIX0IKKyNkZWZpbmUgTVA0X09GRlNFVF9SRUcgICAgICBBVl9TQ1JBVENIX0MKKyNkZWZpbmUgTVA0X1ZPU19JTkZPICAgICAgICBBVl9TQ1JBVENIX0QKKyNkZWZpbmUgTVA0X1NZU19SQVRFICAgICAgICBBVl9TQ1JBVENIX0UKKyNkZWZpbmUgTUVNX09GRlNFVF9SRUcgICAgICBBVl9TQ1JBVENIX0YKKyNkZWZpbmUgTVA0X1BJQ19JTkZPICAgICAgICBBVl9TQ1JBVENIX0gKKworI2RlZmluZSBQQVJDX0ZPUkJJRERFTiAgICAgICAgICAgICAgMAorI2RlZmluZSBQQVJDX1NRVUFSRSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQQVJDX0NJRiAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBQQVJDXzEwXzExICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBQQVJDXzE2XzExICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBQQVJDXzQwXzMzICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBQQVJDX1JFU0VSVkVEICAgICAgICAgICAgICAgNgorLyogdmFsdWVzIGJldHdlZW4gNiBhbmQgMTQgYXJlIHJlc2VydmVkICovCisjZGVmaW5lIFBBUkNfRVhURU5ERUQgICAgICAgICAgICAgIDE1CisKKyNkZWZpbmUgVkZfUE9PTF9TSVpFICAgICAgICAgIDY0CisjZGVmaW5lIERFQ09ERV9CVUZGRVJfTlVNX01BWCAxNgorI2RlZmluZSBERUNPREVfQlVGRkVSX05VTV9ERUYgOAorI2RlZmluZSBQVVRfSU5URVJWQUwgICAgICAgIChIWi8xMDApCisjZGVmaW5lIE1BWF9CTU1VX0JVRkZFUl9OVU0gKERFQ09ERV9CVUZGRVJfTlVNX01BWCArIDEpCisjZGVmaW5lIFdPUktTUEFDRV9TSVpFCQkoMTIqU1pfNjRLKQorc3RhdGljIHUzMiBidWZfc2l6ZSA9IDMyICogMTAyNCAqIDEwMjQ7CisKKyNkZWZpbmUgQ1RYX0xNRU1fU1dBUF9PRkZTRVQgICAgMAorI2RlZmluZSBDVFhfUVVBTlRfTUFUUklYX09GRlNFVCAweDgwMAorLyogZGNhYyBidWZmZXIgbXVzdCBhbGlnbiBhdCA0ayBib3VuZGFyeSAqLworI2RlZmluZSBDVFhfRENBQ19CVUZfT0ZGU0VUICAgICAweDEwMDAKKyNkZWZpbmUgQ1RYX0RFQ0JVRl9PRkZTRVQgICAgICAgKDB4MGMwMDAwICsgMHgxMDAwKQorCisjZGVmaW5lIFJBVEVfREVURUNUX0NPVU5UICAgNQorI2RlZmluZSBEVVJBVElPTl9VTklUICAgICAgIDk2MDAwCisjZGVmaW5lIFBUU19VTklUICAgICAgICAgICAgOTAwMDAKKyNkZWZpbmUgQ0hFQ0tfSU5URVJWQUwgICAgICAgIChIWi8xMDApCisKKyNkZWZpbmUgRFVSMlBUUyh4KSAoKHgpIC0gKCh4KSA+PiA0KSkKKworLyogOTYwMDAvKDYwZnBzKiAyZmllbGQpID0gODAwLCA5NjAwMC8xMGZwcyA9IDk2MDAgKi8KKyNkZWZpbmUgTVBFRzRfVkFMSURfRFVSKHgpICgoeCA8IDk2MDApICYmICh4ID4gNzk5KSkKKworI2RlZmluZSBNQVhfTVBFRzRfU1VQUE9SVF9TSVpFICgxOTIwKjEwODgpCisKKyNkZWZpbmUgREVDX1JFU1VMVF9OT05FICAgICAwCisjZGVmaW5lIERFQ19SRVNVTFRfRE9ORSAgICAgMQorI2RlZmluZSBERUNfUkVTVUxUX0FHQUlOICAgIDIKKyNkZWZpbmUgREVDX1JFU1VMVF9FUlJPUiAgICAzCisjZGVmaW5lIERFQ19SRVNVTFRfRk9SQ0VfRVhJVCA0CisjZGVmaW5lIERFQ19SRVNVTFRfRU9TCQk1CisjZGVmaW5lIERFQ19SRVNVTFRfVU5GSU5JU0gJNgorCisjZGVmaW5lIERFQ19ERUNPREVfVElNRU9VVCAgICAgICAgIDB4MjEKKyNkZWZpbmUgREVDT0RFX0lEKGh3KSAoaHdfdG9fdmRlYyhodyktPmlkKQorI2RlZmluZSBERUNPREVfU1RPUF9QT1MgICAgICAgICBBVl9TQ1JBVENIX0sKK3N0YXRpYyB1MzIgdWRlYnVnX2ZsYWc7CisKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZtcGVnX3ZmX3BlZWsodm9pZCAqKTsKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZtcGVnX3ZmX2dldCh2b2lkICopOworc3RhdGljIHZvaWQgdm1wZWdfdmZfcHV0KHN0cnVjdCB2ZnJhbWVfcyAqLCB2b2lkICopOworc3RhdGljIGludCB2bXBlZ192Zl9zdGF0ZXMoc3RydWN0IHZmcmFtZV9zdGF0ZXMgKnN0YXRlcywgdm9pZCAqKTsKK3N0YXRpYyBpbnQgdm1wZWdfZXZlbnRfY2IoaW50IHR5cGUsIHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGVfZGF0YSk7CitzdGF0aWMgaW50IG5vdGlmeV92NGxfZW9zKHN0cnVjdCB2ZGVjX3MgKnZkZWMpOworCitzdGF0aWMgaW50IHByZV9kZWNvZGVfYnVmX2xldmVsID0gMHg4MDA7CitzdGF0aWMgaW50IHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwgPSAweDQwMDA7CitzdGF0aWMgaW50IGRlYnVnX2VuYWJsZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmFkcjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnZhbDsKKy8qIDB4NDBiaXQgPSA4Ynl0ZSAqLworc3RhdGljIHVuc2lnbmVkIGludCBmcm1iYXNlX2NvbnRfYml0bGV2ZWwgPSAweDQwOworc3RhdGljIHVuc2lnbmVkIGludCBkeW5hbWljX2J1Zl9udW1fbWFyZ2luOworCisjZGVmaW5lIFZNUEVHNF9ERVZfTlVNICAgICAgICA5CitzdGF0aWMgdW5zaWduZWQgaW50IG1heF9kZWNvZGVfaW5zdGFuY2VfbnVtID0gVk1QRUc0X0RFVl9OVU07CitzdGF0aWMgdW5zaWduZWQgaW50IG1heF9wcm9jZXNzX3RpbWVbVk1QRUc0X0RFVl9OVU1dOworc3RhdGljIHVuc2lnbmVkIGludCBkZWNvZGVfdGltZW91dF92YWwgPSAyMDA7CisKK3N0YXRpYyB1MzIgd2l0aG91dF9kaXNwbGF5X21vZGU7CisKKyN1bmRlZiBwcl9pbmZvCisjZGVmaW5lIHByX2luZm8gcHJpbnRrCit1bnNpZ25lZCBpbnQgbXBlZzRfZGVidWdfbWFzayA9IDB4ZmY7CitzdGF0aWMgdTMyIHJ1bl9yZWFkeV9taW5fYnVmX251bSA9IDI7CisKKworI2RlZmluZSBQUklOVF9GTEFHX0VSUk9SICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgUFJJTlRfRkxBR19SVU5fRkxPVyAgICAgICAgICAgMFgwMDAxCisjZGVmaW5lIFBSSU5UX0ZMQUdfVElNRUlORk8gICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBQUklOVF9GTEFHX1VDT0RFX0RFVEFJTAkgICAgICAweDAwMDQKKyNkZWZpbmUgUFJJTlRfRkxBR19WTERfREVUQUlMICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCAgICAgICAgIDB4MDAxMAorI2RlZmluZSBQUklOVF9GTEFHX0JVRkZFUl9ERVRBSUwgICAgICAweDAwMjAKKyNkZWZpbmUgUFJJTlRfRkxBR19SRVNUT1JFICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFBSSU5UX0ZSQU1FX05VTSAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBQUklOVF9GTEFHX0ZPUkNFX0RPTkUgICAgICAgICAweDAxMDAKKyNkZWZpbmUgUFJJTlRfRkxBR19DT1VOVEVSICAgICAgICAgICAgMFgwMjAwCisjZGVmaW5lIFBSSU5UX0ZSQU1FQkFTRV9EQVRBICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBQUklOVF9GTEFHX1ZERUNfU1RBVFVTICAgICAgICAweDA4MDAKKyNkZWZpbmUgUFJJTlRfRkxBR19USU1FT1VUX1NUQVRVUyAgICAgMHgxMDAwCisjZGVmaW5lIFBSSU5UX0ZMQUdfVjRMX0RFVEFJTCAgICAgICAgIDB4ODAwMAorI2RlZmluZSBJR05PUkVfUEFSQU1fRlJPTV9DT05GSUcgICAgICAweDgwMDAwMDAKKworaW50IG1tcGVnNF9kZWJ1Z19wcmludChpbnQgaW5kZXgsIGludCBkZWJ1Z19mbGFnLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwlpZiAoKChkZWJ1Z19lbmFibGUgJiBkZWJ1Z19mbGFnKSAmJgorCQkoKDEgPDwgaW5kZXgpICYgbXBlZzRfZGVidWdfbWFzaykpCisJCXx8IChkZWJ1Z19mbGFnID09IFBSSU5UX0ZMQUdfRVJST1IpKSB7CisJCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IGt6YWxsb2MoNTEyLCBHRlBfQVRPTUlDKTsKKwkJaW50IGxlbiA9IDA7CisJCXZhX2xpc3QgYXJnczsKKworCQlpZiAoIWJ1ZikKKwkJCXJldHVybiAwOworCisJCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJCWxlbiA9IHNwcmludGYoYnVmLCAiJWQ6ICIsIGluZGV4KTsKKwkJdnNucHJpbnRmKGJ1ZiArIGxlbiwgNTEyLWxlbiwgZm10LCBhcmdzKTsKKwkJcHJfaW5mbygiJXMiLCBidWYpOworCQl2YV9lbmQoYXJncyk7CisJCWtmcmVlKGJ1Zik7CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3QgcGljX2luZm9fdCB7CisJaW50IGluZGV4OworCXUzMiBwaWNfdHlwZTsKKwl1MzIgcGljX2luZm87CisJdTMyIHB0czsKKwl1NjQgcHRzNjQ7CisJYm9vbCBwdHNfdmFsaWQ7CisJdTMyIGR1cmF0aW9uOworCXUzMiByZXBlYXRfY250OworCXVsb25nIHY0bF9yZWZfYnVmX2FkZHI7CisJdTMyIGh3X2RlY29kZV90aW1lOworCXUzMiBmcmFtZV9zaXplOyAvLyBGb3IgZnJhbWUgYmFzZSBtb2RlOworCXU2NCB0aW1lc3RhbXA7CisJdTMyIG9mZnNldDsKKwl1MzIgaGVpZ2h0OworCXUzMiB3aWR0aDsKK307CisKK3N0cnVjdCB2ZGVjX21wZWc0X2h3X3MgeworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXY7CisJLyogc3RydWN0IGRldmljZSAqY21hX2RldjsgKi8KKworCURFQ0xBUkVfS0ZJRk8obmV3ZnJhbWVfcSwgc3RydWN0IHZmcmFtZV9zICosIFZGX1BPT0xfU0laRSk7CisJREVDTEFSRV9LRklGTyhkaXNwbGF5X3EsIHN0cnVjdCB2ZnJhbWVfcyAqLCBWRl9QT09MX1NJWkUpOworCXN0cnVjdCB2ZnJhbWVfcyB2ZnBvb2xbVkZfUE9PTF9TSVpFXTsKKworCXMzMiB2ZmJ1Zl91c2VbREVDT0RFX0JVRkZFUl9OVU1fTUFYXTsKKwl1MzIgZnJhbWVfd2lkdGg7CisJdTMyIGZyYW1lX2hlaWdodDsKKwl1MzIgZnJhbWVfZHVyOworCXUzMiBmcmFtZV9wcm9nOworCisJdTMyIGN0eF92YWxpZDsKKwl1MzIgcmVnX3Zjb3BfY3RybF9yZWc7CisJdTMyIHJlZ19waWNfaGVhZF9pbmZvOworCXUzMiByZWdfbXBlZzFfMl9yZWc7CisJdTMyIHJlZ19zbGljZV9xcDsKKwl1MzIgcmVnX21wNF9waWNfd2g7CisJdTMyIHJlZ19tcDRfcmF0ZTsKKwl1MzIgcmVnX21iX2luZm87CisJdTMyIHJlZ19kY19hY19jdHJsOworCXUzMiByZWdfaXFpZGN0X2NvbnRyb2w7CisJdTMyIHJlZ19yZXN5bmNfbWFya2VyX2xlbmd0aDsKKwl1MzIgcmVnX3J2X2FpX21iX2NvdW50OworCXN0cnVjdCB0aW1lcl9saXN0IGNoZWNrX3RpbWVyOworCXUzMiBkZWNvZGVfdGltZW91dF9jb3VudDsKKwl1MzIgdGltZW91dF9jbnQ7CisJdW5zaWduZWQgbG9uZyBpbnQgc3RhcnRfcHJvY2Vzc190aW1lOworCisJdTMyIGxhc3RfdmxkX2xldmVsOworCXU4IGluaXRfZmxhZzsKKwl1MzIgZW9zOworCXZvaWQgKm1tX2Jsa19oYW5kbGU7CisKKwlzdHJ1Y3QgdmZyYW1lX2NodW5rX3MgKmNodW5rOworCXUzMiBjaHVua19vZmZzZXQ7CisJdTMyIGNodW5rX3NpemU7CisJdTMyIGNodW5rX2ZyYW1lX2NvdW50OworCXUzMiBzdGF0OworCXVuc2lnbmVkIGxvbmcgYnVmX3N0YXJ0OworCXUzMiBidWZfc2l6ZTsKKwkvKgorCXVuc2lnbmVkIGxvbmcgY21hX2FsbG9jX2FkZHI7CisJaW50IGNtYV9hbGxvY19jb3VudDsKKwkqLworCXUzMiB2bXBlZzRfcmF0aW87CisJdTY0IHZtcGVnNF9yYXRpbzY0OworCXUzMiByYXRlX2RldGVjdDsKKwl1MzIgdm1wZWc0X3JvdGF0aW9uOworCXUzMiB0b3RhbF9mcmFtZTsKKwl1MzIgbGFzdF92b3BfdGltZV9pbmM7CisJdTMyIGxhc3RfZHVyYXRpb247CisJdTMyIGxhc3RfYW5jaF9wdHM7CisJdTMyIHZvcF90aW1lX2luY19zaW5jZV9sYXN0X2FuY2g7CisJdTMyIGZyYW1lX251bV9zaW5jZV9sYXN0X2FuY2g7CisJdTY0IGxhc3RfYW5jaF9wdHNfdXM2NDsKKworCXUzMiBsYXN0X3B0czsKKwl1NjQgbGFzdF9wdHM2NDsKKwl1MzIgcHRzX2hpdDsKKwl1MzIgcHRzX21pc3NlZDsKKwl1MzIgcHRzX2lfaGl0OworCXUzMiBwdHNfaV9taXNzZWQ7CisJc3RydWN0IHBpY19pbmZvX3QgcGljW0RFQ09ERV9CVUZGRVJfTlVNX01BWF07CisJdTMyIGNhbnZhc19zcGVjW0RFQ09ERV9CVUZGRVJfTlVNX01BWF07CisjaWZkZWYgTlYyMQorCXN0cnVjdCBjYW52YXNfY29uZmlnX3MgY2FudmFzX2NvbmZpZ1tERUNPREVfQlVGRkVSX05VTV9NQVhdWzJdOworI2Vsc2UKKwlzdHJ1Y3QgY2FudmFzX2NvbmZpZ19zIGNhbnZhc19jb25maWdbREVDT0RFX0JVRkZFUl9OVU1fTUFYXVszXTsKKyNlbmRpZgorCXN0cnVjdCBkZWNfc3lzaW5mbyB2bXBlZzRfYW1zdHJlYW1fZGVjX2luZm87CisKKwlzMzIgcmVmc1syXTsKKwlpbnQgZGVjX3Jlc3VsdDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKworCXZvaWQgKCp2ZGVjX2NiKShzdHJ1Y3QgdmRlY19zICosIHZvaWQgKik7CisJdm9pZCAqdmRlY19jYl9hcmc7CisJdTMyIGZyYW1lX251bTsKKwl1MzIgcHV0X251bTsKKwl1MzIgc3lzX21wNF9yYXRlOworCXUzMiBydW5fY291bnQ7CisJdTMyCW5vdF9ydW5fcmVhZHk7CisJdTMyIGJ1ZmZlcl9ub3RfcmVhZHk7CisJdTMyCWlucHV0X2VtcHR5OworCXUzMiBwZWVrX251bTsKKwl1MzIgZ2V0X251bTsKKwl1MzIgZmlyc3RfaV9mcmFtZV9yZWFkeTsKKwl1MzIgZHJvcF9mcmFtZV9jb3VudDsKKwl1MzIgdW5zdGFibGVfcHRzOworCXUzMiBsYXN0X2RlY19wdHM7CisKKwlzdHJ1Y3QgZmlybXdhcmVfcyAqZnc7CisJdTMyIGJsa21vZGU7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9xOworCWJvb2wgaXNfdXNlZF92NGw7CisJdm9pZCAqdjRsMl9jdHg7CisJYm9vbCB2NGxfcGFyYW1zX3BhcnNlZDsKKwl1MzIgYnVmX251bTsKKwl1MzIgZHluYW1pY19idWZfbnVtX21hcmdpbjsKKwl1MzIgaV9vbmx5OworCWludCBzaWRlYmluZF90eXBlOworCWludCBzaWRlYmluZF9jaGFubmVsX2lkOworCXUzMiByZXNfY2hfZmxhZzsKKwl1MzIgcHJvZmlsZV9pZGM7CisJdTMyIGxldmVsX2lkYzsKKwl1bnNpZ25lZCBpbnQgaV9kZWNvZGVkX2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgaV9sb3N0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgaV9jb25jZWFsZWRfZnJhbWVzOworCXVuc2lnbmVkIGludCBwX2RlY29kZWRfZnJhbWVzOworCXVuc2lnbmVkIGludCBwX2xvc3RfZnJhbWVzOworCXVuc2lnbmVkIGludCBwX2NvbmNlYWxlZF9mcmFtZXM7CisJdW5zaWduZWQgaW50IGJfZGVjb2RlZF9mcmFtZXM7CisJdW5zaWduZWQgaW50IGJfbG9zdF9mcmFtZXM7CisJdW5zaWduZWQgaW50IGJfY29uY2VhbGVkX2ZyYW1lczsKKwlpbnQgdmRlY19wZ19lbmFibGVfZmxhZzsKKwl1bG9uZyBmYl90b2tlbjsKKwljaGFyIHZkZWNfbmFtZVszMl07CisJY2hhciBwdHNfbmFtZVszMl07CisJY2hhciBuZXdfcV9uYW1lWzMyXTsKKwljaGFyIGRpc3BfcV9uYW1lWzMyXTsKKwlib29sIHJ1bl9mbGFnOworfTsKK3N0YXRpYyB2b2lkIHZtcGVnNF9sb2NhbF9pbml0KHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3KTsKK3N0YXRpYyBpbnQgdm1wZWc0X2h3X2N0eF9yZXN0b3JlKHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3KTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCisJZ2V0X2RhdGFfY2hlY2tfc3VtKHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3LCBpbnQgc2l6ZSk7CitzdGF0aWMgdm9pZCBmbHVzaF9vdXRwdXQoc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqIGh3KTsKKworI2RlZmluZSBQUk9WSURFUl9OQU1FICAgInZkZWMubXBlZzQiCisKKy8qCisgKmludCBxdWVyeV92aWRlb19zdGF0dXMoaW50IHR5cGUsIGludCAqdmFsdWUpOworICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHZmcmFtZV9vcGVyYXRpb25zX3MgdmZfcHJvdmlkZXJfb3BzID0geworCS5wZWVrID0gdm1wZWdfdmZfcGVlaywKKwkuZ2V0ID0gdm1wZWdfdmZfZ2V0LAorCS5wdXQgPSB2bXBlZ192Zl9wdXQsCisJLmV2ZW50X2NiID0gdm1wZWdfZXZlbnRfY2IsCisJLnZmX3N0YXRlcyA9IHZtcGVnX3ZmX3N0YXRlcywKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFzcGVjdF9yYXRpb190YWJsZVsxNl0gPSB7CisJUEFSQ19GT1JCSURERU4sCisJUEFSQ19TUVVBUkUsCisJUEFSQ19DSUYsCisJUEFSQ18xMF8xMSwKKwlQQVJDXzE2XzExLAorCVBBUkNfNDBfMzMsCisJUEFSQ19SRVNFUlZFRCwgUEFSQ19SRVNFUlZFRCwgUEFSQ19SRVNFUlZFRCwgUEFSQ19SRVNFUlZFRCwKKwlQQVJDX1JFU0VSVkVELCBQQVJDX1JFU0VSVkVELCBQQVJDX1JFU0VSVkVELCBQQVJDX1JFU0VSVkVELAorCVBBUkNfUkVTRVJWRUQsIFBBUkNfRVhURU5ERUQKK307CisKK3N0YXRpYyB2b2lkIHJlc2V0X3Byb2Nlc3NfdGltZShzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodyk7CisKK3N0YXRpYyBpbnQgdm1wZWc0X2dldF9idWZfbnVtKHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3KQoreworCWludCBidWZfbnVtID0gREVDT0RFX0JVRkZFUl9OVU1fREVGOworCisJYnVmX251bSArPSBody0+ZHluYW1pY19idWZfbnVtX21hcmdpbjsKKwlpZiAoYnVmX251bSA+IERFQ09ERV9CVUZGRVJfTlVNX01BWCkKKwkJYnVmX251bSA9IERFQ09ERV9CVUZGRVJfTlVNX01BWDsKKworCXJldHVybiBidWZfbnVtOworfQorCitzdGF0aWMgaW50IHZtcGVnNF92NGxfYWxsb2NfYnVmZl9jb25maWdfY2FudmFzKHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3LCBpbnQgaSkKK3sKKwlpbnQgcmV0OworCXUzMiBjYW52YXM7CisJdWxvbmcgZGVjYnVmX3N0YXJ0ID0gMCwgZGVjYnVmX3V2X3N0YXJ0ID0gMDsKKwlpbnQgZGVjYnVmX3lfc2l6ZSA9IDAsIGRlY2J1Zl91dl9zaXplID0gMDsKKwl1MzIgY2FudmFzX3dpZHRoID0gMCwgY2FudmFzX2hlaWdodCA9IDA7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaHcpOworCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9IE5VTEw7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisKKwlpZiAoaHctPnBpY1tpXS52NGxfcmVmX2J1Zl9hZGRyKSB7CisJCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9CisJCQkoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKikKKwkJCWh3LT5waWNbaV0udjRsX3JlZl9idWZfYWRkcjsKKworCQlmYi0+c3RhdHVzID0gRkJfU1RfREVDT0RFUjsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gY3R4LT5mYl9vcHMuYWxsb2MoJmN0eC0+ZmJfb3BzLCBody0+ZmJfdG9rZW4sICZmYiwgQU1MX0ZCX1JFUV9ERUMpOworCWlmIChyZXQgPCAwKSB7CisJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJIlslZF0gZ2V0IGZiIGZhaWwuXG4iLAorCQkJKChzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikKKwkJCShody0+djRsMl9jdHgpKS0+aWQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWZiLT5zdGF0dXMJPSBGQl9TVF9ERUNPREVSOworCisJaWYgKCFody0+ZnJhbWVfd2lkdGggfHwgIWh3LT5mcmFtZV9oZWlnaHQpIHsKKwkJCXN0cnVjdCB2ZGVjX3BpY19pbmZvIHBpYzsKKwkJCXZkZWNfdjRsX2dldF9waWNfaW5mbyhjdHgsICZwaWMpOworCQkJaHctPmZyYW1lX3dpZHRoID0gcGljLnZpc2libGVfd2lkdGg7CisJCQlody0+ZnJhbWVfaGVpZ2h0ID0gcGljLnZpc2libGVfaGVpZ2h0OworCQkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkJIlslZF0gc2V0ICVkIHggJWQgZnJvbSBJRiBsYXllclxuIiwgY3R4LT5pZCwKKwkJCQlody0+ZnJhbWVfd2lkdGgsIGh3LT5mcmFtZV9oZWlnaHQpOworCX0KKworCWh3LT5waWNbaV0udjRsX3JlZl9idWZfYWRkciA9ICh1bG9uZylmYjsKKwlpZiAoZmItPm51bV9wbGFuZXMgPT0gMSkgeworCQlkZWNidWZfc3RhcnQJPSBmYi0+bS5tZW1bMF0uYWRkcjsKKwkJZGVjYnVmX3lfc2l6ZQk9IGZiLT5tLm1lbVswXS5vZmZzZXQ7CisJCWRlY2J1Zl91dl9zdGFydAk9IGRlY2J1Zl9zdGFydCArIGRlY2J1Zl95X3NpemU7CisJCWRlY2J1Zl91dl9zaXplCT0gZGVjYnVmX3lfc2l6ZSAvIDI7CisJCWNhbnZhc193aWR0aAk9IEFMSUdOKGh3LT5mcmFtZV93aWR0aCwgNjQpOworCQljYW52YXNfaGVpZ2h0CT0gQUxJR04oaHctPmZyYW1lX2hlaWdodCwgNjQpOworCQlmYi0+bS5tZW1bMF0uYnl0ZXNfdXNlZCA9IGZiLT5tLm1lbVswXS5zaXplOworCX0gZWxzZSBpZiAoZmItPm51bV9wbGFuZXMgPT0gMikgeworCQlkZWNidWZfc3RhcnQJPSBmYi0+bS5tZW1bMF0uYWRkcjsKKwkJZGVjYnVmX3lfc2l6ZQk9IGZiLT5tLm1lbVswXS5zaXplOworCQlkZWNidWZfdXZfc3RhcnQJPSBmYi0+bS5tZW1bMV0uYWRkcjsKKwkJZGVjYnVmX3V2X3NpemUJPSBmYi0+bS5tZW1bMV0uc2l6ZTsKKwkJY2FudmFzX3dpZHRoCT0gQUxJR04oaHctPmZyYW1lX3dpZHRoLCA2NCk7CisJCWNhbnZhc19oZWlnaHQJPSBBTElHTihody0+ZnJhbWVfaGVpZ2h0LCA2NCk7CisJCWZiLT5tLm1lbVswXS5ieXRlc191c2VkID0gZGVjYnVmX3lfc2l6ZTsKKwkJZmItPm0ubWVtWzFdLmJ5dGVzX3VzZWQgPSBkZWNidWZfdXZfc2l6ZTsKKwl9CisKKwltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwgIlslZF0gJXMoKSwgdjRsIHJlZiBidWYgYWRkcjogMHgleFxuIiwKKwkJKChzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KSktPmlkLCBfX2Z1bmNfXywgZmIpOworCisJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCXUzMiB0bXA7CisJCWlmIChjYW52YXNfeShody0+Y2FudmFzX3NwZWNbaV0pID09IDB4ZmYpIHsKKwkJCXRtcCA9IHZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX1ZERUNfMSwgdmRlYy0+aWQpOworCQkJaHctPmNhbnZhc19zcGVjW2ldICY9IH4weGZmOworCQkJaHctPmNhbnZhc19zcGVjW2ldIHw9IHRtcDsKKwkJfQorCQlpZiAoY2FudmFzX3UoaHctPmNhbnZhc19zcGVjW2ldKSA9PSAweGZmKSB7CisJCQl0bXAgPSB2ZGVjLT5nZXRfY2FudmFzX2V4KENPUkVfTUFTS19WREVDXzEsIHZkZWMtPmlkKTsKKwkJCWh3LT5jYW52YXNfc3BlY1tpXSAmPSB+KDB4ZmZmZiA8PCA4KTsKKwkJCWh3LT5jYW52YXNfc3BlY1tpXSB8PSB0bXAgPDwgODsKKwkJCWh3LT5jYW52YXNfc3BlY1tpXSB8PSB0bXAgPDwgMTY7CisJCX0KKwkJY2FudmFzID0gaHctPmNhbnZhc19zcGVjW2ldOworCX0gZWxzZSB7CisJCWNhbnZhcyA9IHZkZWMtPmdldF9jYW52YXMoaSwgMik7CisJCWh3LT5jYW52YXNfc3BlY1tpXSA9IGNhbnZhczsKKwl9CisKKwlody0+Y2FudmFzX2NvbmZpZ1tpXVswXS5waHlfYWRkciA9IGRlY2J1Zl9zdGFydDsKKwlody0+Y2FudmFzX2NvbmZpZ1tpXVswXS53aWR0aCA9IGNhbnZhc193aWR0aDsKKwlody0+Y2FudmFzX2NvbmZpZ1tpXVswXS5oZWlnaHQgPSBjYW52YXNfaGVpZ2h0OworCWh3LT5jYW52YXNfY29uZmlnW2ldWzBdLmJsb2NrX21vZGUgPSBody0+YmxrbW9kZTsKKwlpZiAoaHctPmJsa21vZGUgPT0gQ0FOVkFTX0JMS01PREVfTElORUFSKQorCQlody0+Y2FudmFzX2NvbmZpZ1tpXVswXS5lbmRpYW4gPSA3OworCWVsc2UKKwkJaHctPmNhbnZhc19jb25maWdbaV1bMF0uZW5kaWFuID0gMDsKKwljb25maWdfY2F2X2x1dChjYW52YXNfeShjYW52YXMpLAorCQkJJmh3LT5jYW52YXNfY29uZmlnW2ldWzBdLCBWREVDXzEpOworCS8qIG1wZWc0IGRlY29kZXIgY2FudmFzIG5lZWQgdG8gYmUgcmV2ZXJ0IHRvIG1hdGNoIGRpc3BsYXkgY2FudmFzICovCisJaHctPmNhbnZhc19jb25maWdbaV1bMF0uZW5kaWFuID0KKwkJKGh3LT5ibGttb2RlICE9IENBTlZBU19CTEtNT0RFX0xJTkVBUikgPyA3IDogMDsKKworCWh3LT5jYW52YXNfY29uZmlnW2ldWzFdLnBoeV9hZGRyID0KKwkJZGVjYnVmX3V2X3N0YXJ0OworCWh3LT5jYW52YXNfY29uZmlnW2ldWzFdLndpZHRoID0gY2FudmFzX3dpZHRoOworCWh3LT5jYW52YXNfY29uZmlnW2ldWzFdLmhlaWdodCA9IChjYW52YXNfaGVpZ2h0ID4+IDEpOworCWh3LT5jYW52YXNfY29uZmlnW2ldWzFdLmJsb2NrX21vZGUgPSBody0+YmxrbW9kZTsKKwlpZiAoaHctPmJsa21vZGUgPT0gQ0FOVkFTX0JMS01PREVfTElORUFSKQorCQlody0+Y2FudmFzX2NvbmZpZ1tpXVsxXS5lbmRpYW4gPSA3OworCWVsc2UKKwkJaHctPmNhbnZhc19jb25maWdbaV1bMV0uZW5kaWFuID0gMDsKKwljb25maWdfY2F2X2x1dChjYW52YXNfdShjYW52YXMpLAorCQkJJmh3LT5jYW52YXNfY29uZmlnW2ldWzFdLCBWREVDXzEpOworCS8qIG1wZWc0IGRlY29kZXIgY2FudmFzIG5lZWQgdG8gYmUgcmV2ZXJ0IHRvIG1hdGNoIGRpc3BsYXkgY2FudmFzICovCisJaHctPmNhbnZhc19jb25maWdbaV1bMV0uZW5kaWFuID0KKwkJKGh3LT5ibGttb2RlICE9IENBTlZBU19CTEtNT0RFX0xJTkVBUikgPyA3IDogMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgYm9vbCBpc19lbm91Z2hfZnJlZV9idWZmZXIoc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqaHcpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaHctPmJ1Zl9udW07IGkrKykgeworCQlpZiAoaHctPnZmYnVmX3VzZVtpXSA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGkgPT0gaHctPmJ1Zl9udW0gPyBmYWxzZSA6IHRydWU7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9mcmVlX2J1ZmZlcihzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBody0+YnVmX251bTsgaSsrKSB7CisJCWlmIChody0+dmZidWZfdXNlW2ldID09IDApCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA9PSBody0+YnVmX251bSkKKwkJcmV0dXJuIC0xOworCisJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisJCWlmIChjdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSAmJiAhaHctPnY0bF9wYXJhbXNfcGFyc2VkKSB7CisJCQkvKnJ1biB0byBwYXJzZXIgY3NkIGRhdGEqLworCQkJaSA9IDB4ZmZmZmZmOworCQl9IGVsc2UgeworCQkJaWYgKCFjdHgtPmZiX29wcy5xdWVyeSgmY3R4LT5mYl9vcHMsICZody0+ZmJfdG9rZW4pKQorCQkJCXJldHVybiAtMTsKKworCQkJaWYgKHZtcGVnNF92NGxfYWxsb2NfYnVmZl9jb25maWdfY2FudmFzKGh3LCBpKSkKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBzcGVjX3RvX2luZGV4KHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3LCB1MzIgc3BlYykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBody0+YnVmX251bTsgaSsrKSB7CisJCWlmIChody0+Y2FudmFzX3NwZWNbaV0gPT0gc3BlYykKKwkJCXJldHVybiBpOworCX0KKworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgc2V0X2ZyYW1lX2luZm8oc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqaHcsIHN0cnVjdCB2ZnJhbWVfcyAqdmYsCisJCQlpbnQgYnVmZmVyX2luZGV4KQoreworCWludCBhciA9IDA7CisJdW5zaWduZWQgaW50IG51bSA9IDA7CisJdW5zaWduZWQgaW50IGRlbiA9IDA7CisJdW5zaWduZWQgaW50IHBpeGVsX3JhdGlvID0gUkVBRF9WUkVHKE1QNF9QSUNfUkFUSU8pOworCisJaWYgKGh3LT52bXBlZzRfcmF0aW82NCAhPSAwKSB7CisJCW51bSA9IGh3LT52bXBlZzRfcmF0aW82ND4+MzI7CisJCWRlbiA9IGh3LT52bXBlZzRfcmF0aW82NCAmIDB4ZmZmZmZmZmY7CisJfSBlbHNlIHsKKwkJbnVtID0gaHctPnZtcGVnNF9yYXRpbz4+MTY7CisJCWRlbiA9IGh3LT52bXBlZzRfcmF0aW8gJiAweGZmZmY7CisKKwl9CisJaWYgKChudW0gPT0gMCkgfHwgKGRlbiA9PSAwKSkgeworCQludW0gPSAxOworCQlkZW4gPSAxOworCX0KKworCWlmIChody0+dm1wZWc0X3JhdGlvID09IDApIHsKKwkJdmYtPnJhdGlvX2NvbnRyb2wgfD0gKDB4OTAgPDwgRElTUF9SQVRJT19BU1BFQ1RfUkFUSU9fQklUKTsKKwkJdmYtPnNhcl93aWR0aCA9IDE7CisJCXZmLT5zYXJfaGVpZ2h0ID0gMTsKKwkJLyogYWx3YXlzIHN0cmV0Y2ggdG8gMTY6OSAqLworCX0gZWxzZSBpZiAocGl4ZWxfcmF0aW8gPiAweDBmKSB7CisJCW51bSA9IChwaXhlbF9yYXRpbyA+PiA4KSAqCisJCQlody0+ZnJhbWVfd2lkdGggKiBudW07CisJCWFyID0gZGl2X3U2NCgocGl4ZWxfcmF0aW8gJiAweGZmKSAqCisJCQlody0+ZnJhbWVfaGVpZ2h0ICogZGVuICogMHgxMDBVTEwgKworCQkJKG51bSA+PiAxKSwgbnVtKTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKGFzcGVjdF9yYXRpb190YWJsZVtwaXhlbF9yYXRpb10pIHsKKwkJY2FzZSAwOgorCQkJdmYtPnNhcl93aWR0aCA9IDE7CisJCQl2Zi0+c2FyX2hlaWdodCA9IDE7CisJCQludW0gPSBody0+ZnJhbWVfd2lkdGggKiBudW07CisJCQlhciA9IChody0+ZnJhbWVfaGVpZ2h0ICogZGVuICoKKwkJCQkweDEwMCArIChudW0gPj4gMSkpIC8gbnVtOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXZmLT5zYXJfd2lkdGggPSAxOworCQkJdmYtPnNhcl9oZWlnaHQgPSAxOworCQkJbnVtID0gdmYtPndpZHRoICogbnVtOworCQkJYXIgPSAodmYtPmhlaWdodCAqIGRlbiAqIDB4MTAwICsgKG51bSA+PiAxKSkgLyBudW07CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJdmYtPnNhcl93aWR0aCA9IDEyOworCQkJdmYtPnNhcl9oZWlnaHQgPSAxMTsKKwkJCW51bSA9ICh2Zi0+d2lkdGggKiAxMikgKiBudW07CisJCQlhciA9ICh2Zi0+aGVpZ2h0ICogZGVuICogMHgxMDAgKiAxMSArCisJCQkJICAoKG51bSkgPj4gMSkpIC8gbnVtOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXZmLT5zYXJfd2lkdGggPSAxMDsKKwkJCXZmLT5zYXJfaGVpZ2h0ID0gMTE7CisJCQludW0gPSAodmYtPndpZHRoICogMTApICogbnVtOworCQkJYXIgPSAodmYtPmhlaWdodCAqIGRlbiAqIDB4MTAwICogMTEgKyAobnVtID4+IDEpKSAvCisJCQkJbnVtOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCXZmLT5zYXJfd2lkdGggPSAxNjsKKwkJCXZmLT5zYXJfaGVpZ2h0ID0gMTE7CisJCQludW0gPSAodmYtPndpZHRoICogMTYpICogbnVtOworCQkJYXIgPSAodmYtPmhlaWdodCAqIGRlbiAqIDB4MTAwICogMTEgKyAobnVtID4+IDEpKSAvCisJCQkJbnVtOworCQkJYnJlYWs7CisJCWNhc2UgNToKKwkJCXZmLT5zYXJfd2lkdGggPSA0MDsKKwkJCXZmLT5zYXJfaGVpZ2h0ID0gMzM7CisJCQludW0gPSAodmYtPndpZHRoICogNDApICogbnVtOworCQkJYXIgPSAodmYtPmhlaWdodCAqIGRlbiAqIDB4MTAwICogMzMgKyAobnVtID4+IDEpKSAvCisJCQkJbnVtOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl2Zi0+c2FyX3dpZHRoID0gMTsKKwkJCXZmLT5zYXJfaGVpZ2h0ID0gMTsKKwkJCW51bSA9IHZmLT53aWR0aCAqIG51bTsKKwkJCWFyID0gKHZmLT5oZWlnaHQgKiBkZW4gKiAweDEwMCArIChudW0gPj4gMSkpIC8gbnVtOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwl2Zi0+c2lkZWJpbmRfdHlwZSA9IGh3LT5zaWRlYmluZF90eXBlOworCXZmLT5zaWRlYmluZF9jaGFubmVsX2lkID0gaHctPnNpZGViaW5kX2NoYW5uZWxfaWQ7CisKKwlhciA9IG1pbihhciwgRElTUF9SQVRJT19BU1BFQ1RfUkFUSU9fTUFYKTsKKworCXZmLT5zaWduYWxfdHlwZSA9IDA7CisJdmYtPnR5cGVfb3JpZ2luYWwgPSB2Zi0+dHlwZTsKKwl2Zi0+cmF0aW9fY29udHJvbCA9IChhciA8PCBESVNQX1JBVElPX0FTUEVDVF9SQVRJT19CSVQpOworCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IC0xOworI2lmZGVmIE5WMjEKKwl2Zi0+cGxhbmVfbnVtID0gMjsKKyNlbHNlCisJdmYtPnBsYW5lX251bSA9IDM7CisjZW5kaWYKKwl2Zi0+Y2FudmFzMF9jb25maWdbMF0gPSBody0+Y2FudmFzX2NvbmZpZ1tidWZmZXJfaW5kZXhdWzBdOworCXZmLT5jYW52YXMwX2NvbmZpZ1sxXSA9IGh3LT5jYW52YXNfY29uZmlnW2J1ZmZlcl9pbmRleF1bMV07CisjaWZuZGVmIE5WMjEKKwl2Zi0+Y2FudmFzMF9jb25maWdbMl0gPSBody0+Y2FudmFzX2NvbmZpZ1tidWZmZXJfaW5kZXhdWzJdOworI2VuZGlmCisJdmYtPmNhbnZhczFfY29uZmlnWzBdID0gaHctPmNhbnZhc19jb25maWdbYnVmZmVyX2luZGV4XVswXTsKKwl2Zi0+Y2FudmFzMV9jb25maWdbMV0gPSBody0+Y2FudmFzX2NvbmZpZ1tidWZmZXJfaW5kZXhdWzFdOworI2lmbmRlZiBOVjIxCisJdmYtPmNhbnZhczFfY29uZmlnWzJdID0gaHctPmNhbnZhc19jb25maWdbYnVmZmVyX2luZGV4XVsyXTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdm1wZWc0X3NhdmVfaHdfY29udGV4dChzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodykKK3sKKwlody0+cmVnX21wZWcxXzJfcmVnID0gUkVBRF9WUkVHKE1QRUcxXzJfUkVHKTsKKwlody0+cmVnX3Zjb3BfY3RybF9yZWcgPSBSRUFEX1ZSRUcoVkNPUF9DVFJMX1JFRyk7CisJaHctPnJlZ19waWNfaGVhZF9pbmZvID0gUkVBRF9WUkVHKFBJQ19IRUFEX0lORk8pOworCWh3LT5yZWdfc2xpY2VfcXAgPSBSRUFEX1ZSRUcoU0xJQ0VfUVApOworCWh3LT5yZWdfbXA0X3BpY193aCA9IFJFQURfVlJFRyhNUDRfUElDX1dIKTsKKwlody0+cmVnX21wNF9yYXRlID0gUkVBRF9WUkVHKE1QNF9SQVRFKTsKKwlody0+cmVnX21iX2luZm8gPSBSRUFEX1ZSRUcoTUJfSU5GTyk7CisJaHctPnJlZ19kY19hY19jdHJsID0gUkVBRF9WUkVHKERDX0FDX0NUUkwpOworCWh3LT5yZWdfaXFpZGN0X2NvbnRyb2wgPSBSRUFEX1ZSRUcoSVFJRENUX0NPTlRST0wpOworCWh3LT5yZWdfcmVzeW5jX21hcmtlcl9sZW5ndGggPSBSRUFEX1ZSRUcoUkVTWU5DX01BUktFUl9MRU5HVEgpOworCWh3LT5yZWdfcnZfYWlfbWJfY291bnQgPSBSRUFEX1ZSRUcoUlZfQUlfTUJfQ09VTlQpOworfQorCitzdGF0aWMgaW50IHVwZGF0ZV9yZWYoc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqaHcsIGludCBpbmRleCkKK3sKKwlody0+dmZidWZfdXNlW2luZGV4XSsrOworCisJaWYgKGh3LT5yZWZzWzFdID09IC0xKSB7CisJCWh3LT5yZWZzWzFdID0gaW5kZXg7CisJCWluZGV4ID0gLTE7CisJfSBlbHNlIGlmIChody0+cmVmc1swXSA9PSAtMSkgeworCQlody0+cmVmc1swXSA9IGh3LT5yZWZzWzFdOworCQlody0+cmVmc1sxXSA9IGluZGV4OworCQlpbmRleCA9IGh3LT5yZWZzWzBdOworCX0gZWxzZSB7CisJCWh3LT52ZmJ1Zl91c2VbaHctPnJlZnNbMF1dLS07CisJCWh3LT5yZWZzWzBdID0gaHctPnJlZnNbMV07CisJCWh3LT5yZWZzWzFdID0gaW5kZXg7CisJCWluZGV4ID0gaHctPnJlZnNbMF07CisJfQorCisJcmV0dXJuIGluZGV4OworfQorCitzdGF0aWMgaW50IHByZXBhcmVfZGlzcGxheV9idWYoc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqIGh3LAorCXN0cnVjdCBwaWNfaW5mb190ICpwaWMpCit7CisJc3RydWN0IHZmcmFtZV9zICp2ZiA9IE5VTEw7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaHcpOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqIHY0bDJfY3R4ID0gaHctPnY0bDJfY3R4OworCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9IE5VTEw7CisJdWxvbmcgbnZfb3JkZXIgPSBWSURUWVBFX1ZJVV9OVjIxOworCWludCBpbmRleCA9IHBpYy0+aW5kZXg7CisJYm9vbCBwYl9za2lwID0gZmFsc2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIHN3YXAgdXYgKi8KKwlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCWlmICgodjRsMl9jdHgtPmNhcF9waXhfZm10ID09IFY0TDJfUElYX0ZNVF9OVjEyKSB8fAorCQkJKHY0bDJfY3R4LT5jYXBfcGl4X2ZtdCA9PSBWNEwyX1BJWF9GTVRfTlYxMk0pKQorCQkJbnZfb3JkZXIgPSBWSURUWVBFX1ZJVV9OVjEyOworCQlpZiAodmRlYy0+cHJvZ19vbmx5KQorCQkJcGljLT5waWNfaW5mbyAmPSB+SU5URVJMQUNFX0ZMQUc7CisJfQorCisJaWYgKGh3LT5pX29ubHkpCisJCXBiX3NraXAgPSAxOworCisJaWYgKHBpYy0+cGljX2luZm8gJiBJTlRFUkxBQ0VfRkxBRykgeworCQlpZiAoa2ZpZm9fZ2V0KCZody0+bmV3ZnJhbWVfcSwgJnZmKSA9PSAwKSB7CisJCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCQkiZmF0YWwgZXJyb3IsIG5vIGF2YWlsYWJsZSBidWZmZXIgc2xvdC4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCXZmLT52NGxfbWVtX2hhbmRsZQorCQkJCT0gaHctPnBpY1tpbmRleF0udjRsX3JlZl9idWZfYWRkcjsKKwkJCWZiID0gKHN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICopdmYtPnY0bF9tZW1faGFuZGxlOworCQkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVjRMX0RFVEFJTCwKKwkJCQkiWyVkXSAlcygpLCB2NGwgbWVtIGhhbmRsZTogMHglbHhcbiIsCisJCQkJKChzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KSktPmlkLAorCQkJCV9fZnVuY19fLCB2Zi0+djRsX21lbV9oYW5kbGUpOworCQl9CisKKwkJdmYtPmluZGV4ID0gcGljLT5pbmRleDsKKwkJdmYtPndpZHRoID0gcGljLT53aWR0aDsKKwkJdmYtPmhlaWdodCA9IHBpYy0+aGVpZ2h0OworCQl2Zi0+YnVmV2lkdGggPSAxOTIwOworCQl2Zi0+ZmxhZyA9IDA7CisJCXZmLT5vcmllbnRhdGlvbiA9IGh3LT52bXBlZzRfcm90YXRpb247CisJCXZmLT5wdHMgPSBwaWMtPnB0czsKKwkJdmYtPnB0c191czY0ID0gcGljLT5wdHM2NDsKKwkJdmYtPnRpbWVzdGFtcCA9IHBpYy0+dGltZXN0YW1wOworCQl2Zi0+ZHVyYXRpb24gPSBwaWMtPmR1cmF0aW9uID4+IDE7CisJCXZmLT5kdXJhdGlvbl9wdWxsZG93biA9IDA7CisJCXZmLT50eXBlID0gKHBpYy0+cGljX2luZm8gJiBUT1BfRklFTERfRklSU1RfRkxBRykgPworCQkJVklEVFlQRV9JTlRFUkxBQ0VfVE9QIDogVklEVFlQRV9JTlRFUkxBQ0VfQk9UVE9NOworI2lmZGVmIE5WMjEKKwkJdmYtPnR5cGUgfD0gbnZfb3JkZXI7CisjZW5kaWYKKwkJc2V0X2ZyYW1lX2luZm8oaHcsIHZmLCBwaWMtPmluZGV4KTsKKworCQlody0+dmZidWZfdXNlW3BpYy0+aW5kZXhdKys7CisJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1RJTUVJTkZPLAorCQkJImZpZWxkMDogcHRzICVkLCBwdHM2NCAlbGxkLCB3ICVkLCBoICVkLCBkdXIgJWRcbiIsCisJCQl2Zi0+cHRzLCB2Zi0+cHRzX3VzNjQsIHZmLT53aWR0aCwgdmYtPmhlaWdodCwgdmYtPmR1cmF0aW9uKTsKKwkJaWYgKHZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpICYmICghdmRlYy0+dmJ1Zi51c2VfcHRzc2VydikpIHsKKwkJCXZmLT5wdHNfdXM2NCA9CisJCQkJKCgodTY0KXZmLT5kdXJhdGlvbiA8PCAzMikgJgorCQkJCTB4ZmZmZmZmZmYwMDAwMDAwMCkgfCBwaWMtPm9mZnNldDsKKwkJCXZmLT5wdHMgPSAwOworCQl9CisJCWlmICgoKGh3LT5maXJzdF9pX2ZyYW1lX3JlYWR5ID09IDApIHx8IHBiX3NraXApCisJCQkgJiYgKHBpYy0+cGljX3R5cGUgIT0gSV9QSUNUVVJFKSkgeworCQkJaHctPmRyb3BfZnJhbWVfY291bnQrKzsKKwkJCWlmIChwaWMtPnBpY190eXBlID09IElfUElDVFVSRSkgeworCQkJCWh3LT5pX2xvc3RfZnJhbWVzKys7CisJCQl9IGVsc2UgaWYgKHBpYy0+cGljX3R5cGUgPT0gUF9QSUNUVVJFKSB7CisJCQkJaHctPnBfbG9zdF9mcmFtZXMrKzsKKwkJCX0gZWxzZSBpZiAocGljLT5waWNfdHlwZSA9PSBCX1BJQ1RVUkUpIHsKKwkJCQlody0+Yl9sb3N0X2ZyYW1lcysrOworCQkJfQorCQkJaHctPnZmYnVmX3VzZVtpbmRleF0tLTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZody0+bG9jaywgZmxhZ3MpOworCQkJa2ZpZm9fcHV0KCZody0+bmV3ZnJhbWVfcSwKKwkJCQkoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJdmYtPm1lbV9oYW5kbGUgPQorCQkJCWRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJCWh3LT5tbV9ibGtfaGFuZGxlLCBpbmRleCk7CisJCQlrZmlmb19wdXQoJmh3LT5kaXNwbGF5X3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCQlBVFJBQ0VfQ09VTlRFUihody0+cHRzX25hbWUsIHZmLT5wdHMpOworCQkJaHctPmZyYW1lX251bSsrOworCQkJaWYgKHBpYy0+cGljX3R5cGUgPT0gSV9QSUNUVVJFKSB7CisJCQkJaHctPmlfZGVjb2RlZF9mcmFtZXMrKzsKKwkJCX0gZWxzZSBpZiAocGljLT5waWNfdHlwZSA9PSBQX1BJQ1RVUkUpIHsKKwkJCQlody0+cF9kZWNvZGVkX2ZyYW1lcysrOworCQkJfSBlbHNlIGlmIChwaWMtPnBpY190eXBlID09IEJfUElDVFVSRSkgeworCQkJCWh3LT5iX2RlY29kZWRfZnJhbWVzKys7CisJCQl9CisJCQlpZiAod2l0aG91dF9kaXNwbGF5X21vZGUgPT0gMCkgeworCQkJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCQkJaWYgKHY0bDJfY3R4LT5pc19zdHJlYW1fb2ZmKSB7CisJCQkJCQl2bXBlZ192Zl9wdXQodm1wZWdfdmZfZ2V0KHZkZWMpLCB2ZGVjKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWZiLT50YXNrLT5zdWJtaXQoZmItPnRhc2ssIFRBU0tfVFlQRV9ERUMpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJdmZfbm90aWZ5X3JlY2VpdmVyKHZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfVkZSQU1FX1JFQURZLCBOVUxMKTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQl2bXBlZ192Zl9wdXQodm1wZWdfdmZfZ2V0KHZkZWMpLCB2ZGVjKTsKKwkJfQorCisJCWlmIChrZmlmb19nZXQoJmh3LT5uZXdmcmFtZV9xLCAmdmYpID09IDApIHsKKwkJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJCSJlcnJvciwgbm8gYXZhaWxhYmxlIGJ1Zi5cbiIpOworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0VSUk9SOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJdmYtPmluZGV4ID0gcGljLT5pbmRleDsKKwkJdmYtPndpZHRoID0gcGljLT53aWR0aDsKKwkJdmYtPmhlaWdodCA9IHBpYy0+aGVpZ2h0OworCQl2Zi0+YnVmV2lkdGggPSAxOTIwOworCQl2Zi0+ZmxhZyA9IDA7CisJCXZmLT5vcmllbnRhdGlvbiA9IGh3LT52bXBlZzRfcm90YXRpb247CisJCXZmLT5wdHMgPSAwOworCQl2Zi0+cHRzX3VzNjQgPSAwOworCQl2Zi0+dGltZXN0YW1wID0gMDsKKwkJdmYtPmR1cmF0aW9uID0gcGljLT5kdXJhdGlvbiA+PiAxOworCQl2Zi0+ZHVyYXRpb25fcHVsbGRvd24gPSAwOworCQl2Zi0+dHlwZSA9IChwaWMtPnBpY19pbmZvICYgVE9QX0ZJRUxEX0ZJUlNUX0ZMQUcpID8KKwkJCVZJRFRZUEVfSU5URVJMQUNFX0JPVFRPTSA6IFZJRFRZUEVfSU5URVJMQUNFX1RPUDsKKyNpZmRlZiBOVjIxCisJCXZmLT50eXBlIHw9IG52X29yZGVyOworI2VuZGlmCisJCXNldF9mcmFtZV9pbmZvKGh3LCB2ZiwgcGljLT5pbmRleCk7CisKKwkJaHctPnZmYnVmX3VzZVtwaWMtPmluZGV4XSsrOworCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19USU1FSU5GTywKKwkJCSJmaWxlZDE6IHB0cyAlZCwgcHRzNjQgJWxsZCwgdyAlZCwgaCAlZCwgZHVyOiAlZFxuIiwKKwkJCXZmLT5wdHMsIHZmLT5wdHNfdXM2NCwgdmYtPndpZHRoLCB2Zi0+aGVpZ2h0LCB2Zi0+ZHVyYXRpb24pOworCisJCWlmICh2ZGVjX3N0cmVhbV9iYXNlZCh2ZGVjKSAmJiAoIXZkZWMtPnZidWYudXNlX3B0c3NlcnYpKSB7CisJCQl2Zi0+cHRzX3VzNjQgPSAodTY0KS0xOworCQkJdmYtPnB0cyA9IDA7CisJCX0KKwkJaWYgKCgoaHctPmZpcnN0X2lfZnJhbWVfcmVhZHkgPT0gMCkgfHwgcGJfc2tpcCkKKwkJCSYmIChwaWMtPnBpY190eXBlICE9IElfUElDVFVSRSkpIHsKKwkJCWh3LT5kcm9wX2ZyYW1lX2NvdW50Kys7CisJCQlpZiAocGljLT5waWNfdHlwZSA9PSBJX1BJQ1RVUkUpIHsKKwkJCQlody0+aV9sb3N0X2ZyYW1lcysrOworCQkJfSBlbHNlIGlmIChwaWMtPnBpY190eXBlID09IFBfUElDVFVSRSkgeworCQkJCWh3LT5wX2xvc3RfZnJhbWVzKys7CisJCQl9IGVsc2UgaWYgKHBpYy0+cGljX3R5cGUgPT0gQl9QSUNUVVJFKSB7CisJCQkJaHctPmJfbG9zdF9mcmFtZXMrKzsKKwkJCX0KKwkJCWh3LT52ZmJ1Zl91c2VbaW5kZXhdLS07CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmxvY2ssIGZsYWdzKTsKKwkJCWtmaWZvX3B1dCgmaHctPm5ld2ZyYW1lX3EsCisJCQkJKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5sb2NrLCBmbGFncyk7CisJCX0gZWxzZSB7CisJCQl2Zi0+bWVtX2hhbmRsZSA9CisJCQkJZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCQkJaHctPm1tX2Jsa19oYW5kbGUsIGluZGV4KTsKKwkJCWRlY29kZXJfZG9fZnJhbWVfY2hlY2sodmRlYywgdmYpOworCQkJdmRlY192ZnJhbWVfcmVhZHkodmRlYywgdmYpOworCQkJa2ZpZm9fcHV0KCZody0+ZGlzcGxheV9xLAorCQkJCShjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCQlBVFJBQ0VfQ09VTlRFUihody0+cHRzX25hbWUsIHZmLT5wdHMpOworCQkJdmRlYy0+dmRlY19mcHNfZGV0ZWModmRlYy0+aWQpOworCQkJaHctPmZyYW1lX251bSsrOworCQkJaWYgKHBpYy0+cGljX3R5cGUgPT0gSV9QSUNUVVJFKSB7CisJCQkJaHctPmlfZGVjb2RlZF9mcmFtZXMrKzsKKwkJCX0gZWxzZSBpZiAocGljLT5waWNfdHlwZSA9PSBQX1BJQ1RVUkUpIHsKKwkJCQlody0+cF9kZWNvZGVkX2ZyYW1lcysrOworCQkJfSBlbHNlIGlmIChwaWMtPnBpY190eXBlID09IEJfUElDVFVSRSkgeworCQkJCWh3LT5iX2RlY29kZWRfZnJhbWVzKys7CisJCQl9CisJCQlpZiAod2l0aG91dF9kaXNwbGF5X21vZGUgPT0gMCkgeworCQkJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCQkJaWYgKHY0bDJfY3R4LT5pc19zdHJlYW1fb2ZmKSB7CisJCQkJCQl2bXBlZ192Zl9wdXQodm1wZWdfdmZfZ2V0KHZkZWMpLCB2ZGVjKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWZiLT50YXNrLT5zdWJtaXQoZmItPnRhc2ssIFRBU0tfVFlQRV9ERUMpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJdmZfbm90aWZ5X3JlY2VpdmVyKHZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfVkZSQU1FX1JFQURZLCBOVUxMKTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQl2bXBlZ192Zl9wdXQodm1wZWdfdmZfZ2V0KHZkZWMpLCB2ZGVjKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIHByb2dyZXNzaXZlICovCisJCWlmIChrZmlmb19nZXQoJmh3LT5uZXdmcmFtZV9xLCAmdmYpID09IDApIHsKKwkJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJCSJlcnJvciwgbm8gYXZhaWxhYmxlIGJ1ZlxuIik7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRVJST1I7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCQl2Zi0+djRsX21lbV9oYW5kbGUKKwkJCQk9IGh3LT5waWNbaW5kZXhdLnY0bF9yZWZfYnVmX2FkZHI7CisJCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WNExfREVUQUlMLAorCQkJCSJbJWRdICVzKCksIHY0bCBtZW0gaGFuZGxlOiAweCVseFxuIiwKKwkJCQkoKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShody0+djRsMl9jdHgpKS0+aWQsCisJCQkJX19mdW5jX18sIHZmLT52NGxfbWVtX2hhbmRsZSk7CisJCX0KKworCQl2Zi0+aW5kZXggPSBpbmRleDsKKwkJdmYtPndpZHRoID0gcGljLT53aWR0aDsKKwkJdmYtPmhlaWdodCA9IHBpYy0+aGVpZ2h0OworCQl2Zi0+YnVmV2lkdGggPSAxOTIwOworCQl2Zi0+ZmxhZyA9IDA7CisJCXZmLT5vcmllbnRhdGlvbiA9IGh3LT52bXBlZzRfcm90YXRpb247CisJCXZmLT5wdHMgPSBwaWMtPnB0czsKKwkJdmYtPnB0c191czY0ID0gcGljLT5wdHM2NDsKKwkJdmYtPnRpbWVzdGFtcCA9IHBpYy0+dGltZXN0YW1wOworCQl2Zi0+ZHVyYXRpb24gPSBwaWMtPmR1cmF0aW9uOworCQl2Zi0+ZHVyYXRpb25fcHVsbGRvd24gPSBwaWMtPnJlcGVhdF9jbnQgKgorCQkJcGljLT5kdXJhdGlvbjsKKyNpZmRlZiBOVjIxCisJCXZmLT50eXBlID0gVklEVFlQRV9QUk9HUkVTU0lWRSB8CisJCQlWSURUWVBFX1ZJVV9GSUVMRCB8IG52X29yZGVyOworI2Vsc2UKKwkJdmYtPnR5cGUgPSBWSURUWVBFX1BST0dSRVNTSVZFIHwKKwkJCVZJRFRZUEVfVklVX0ZJRUxEOworI2VuZGlmCisJCXNldF9mcmFtZV9pbmZvKGh3LCB2ZiwgaW5kZXgpOworCisJCWh3LT52ZmJ1Zl91c2VbaW5kZXhdKys7CisJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1RJTUVJTkZPLAorCQkJInByb2c6IHB0cyAlZCwgcHRzNjQgJWxsZCwgdyAlZCwgaCAlZCwgZHVyICVkXG4iLAorCQkJdmYtPnB0cywgdmYtPnB0c191czY0LCB2Zi0+d2lkdGgsIHZmLT5oZWlnaHQsIHZmLT5kdXJhdGlvbik7CisJCWlmICh2ZGVjX3N0cmVhbV9iYXNlZCh2ZGVjKSAmJiAoIXZkZWMtPnZidWYudXNlX3B0c3NlcnYpKSB7CisJCQl2Zi0+cHRzX3VzNjQgPQorCQkJCSgoKHU2NCl2Zi0+ZHVyYXRpb24gPDwgMzIpICYKKwkJCQkweGZmZmZmZmZmMDAwMDAwMDApIHwgcGljLT5vZmZzZXQ7CisJCQl2Zi0+cHRzID0gMDsKKwkJfQorCQlpZiAoKChody0+Zmlyc3RfaV9mcmFtZV9yZWFkeSA9PSAwKSB8fCBwYl9za2lwKQorCQkJJiYgKHBpYy0+cGljX3R5cGUgIT0gSV9QSUNUVVJFKSkgeworCQkJaHctPmRyb3BfZnJhbWVfY291bnQrKzsKKwkJCWlmIChwaWMtPnBpY190eXBlID09IElfUElDVFVSRSkgeworCQkJCWh3LT5pX2xvc3RfZnJhbWVzKys7CisJCQl9IGVsc2UgaWYgKHBpYy0+cGljX3R5cGUgPT0gUF9QSUNUVVJFKSB7CisJCQkJaHctPnBfbG9zdF9mcmFtZXMrKzsKKwkJCX0gZWxzZSBpZiAocGljLT5waWNfdHlwZSA9PSBCX1BJQ1RVUkUpIHsKKwkJCQlody0+Yl9sb3N0X2ZyYW1lcysrOworCQkJfQorCQkJaHctPnZmYnVmX3VzZVtpbmRleF0tLTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZody0+bG9jaywgZmxhZ3MpOworCQkJa2ZpZm9fcHV0KCZody0+bmV3ZnJhbWVfcSwKKwkJCQkoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmxvY2ssIGZsYWdzKTsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCB2ZGVjX2luZm8gdmluZm87CisKKwkJCXZmLT5tZW1faGFuZGxlID0KKwkJCQlkZWNvZGVyX2JtbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCQlody0+bW1fYmxrX2hhbmRsZSwgaW5kZXgpOworCQkJZGVjb2Rlcl9kb19mcmFtZV9jaGVjayh2ZGVjLCB2Zik7CisJCQl2ZGVjX3ZmcmFtZV9yZWFkeSh2ZGVjLCB2Zik7CisJCQlrZmlmb19wdXQoJmh3LT5kaXNwbGF5X3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCQlBVFJBQ0VfQ09VTlRFUihody0+cHRzX25hbWUsIHZmLT5wdHMpOworCQkJQVRSQUNFX0NPVU5URVIoaHctPm5ld19xX25hbWUsIGtmaWZvX2xlbigmaHctPm5ld2ZyYW1lX3EpKTsKKwkJCUFUUkFDRV9DT1VOVEVSKGh3LT5kaXNwX3FfbmFtZSwga2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKSk7CisJCQl2ZGVjLT52ZGVjX2Zwc19kZXRlYyh2ZGVjLT5pZCk7CisJCQlody0+ZnJhbWVfbnVtKys7CisJCQlpZiAocGljLT5waWNfdHlwZSA9PSBJX1BJQ1RVUkUpIHsKKwkJCQlody0+aV9kZWNvZGVkX2ZyYW1lcysrOworCQkJfSBlbHNlIGlmIChwaWMtPnBpY190eXBlID09IFBfUElDVFVSRSkgeworCQkJCWh3LT5wX2RlY29kZWRfZnJhbWVzKys7CisJCQl9IGVsc2UgaWYgKHBpYy0+cGljX3R5cGUgPT0gQl9QSUNUVVJFKSB7CisJCQkJaHctPmJfZGVjb2RlZF9mcmFtZXMrKzsKKwkJCX0KKwkJCXZkZWMtPmRlY19zdGF0dXModmRlYywgJnZpbmZvKTsKKwkJCXZkZWNfZmlsbF92ZGVjX2ZyYW1lKHZkZWMsIE5VTEwsCisJCQkJJnZpbmZvLCB2ZiwgcGljLT5od19kZWNvZGVfdGltZSk7CisJCQlpZiAod2l0aG91dF9kaXNwbGF5X21vZGUgPT0gMCkgeworCQkJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCQkJaWYgKHY0bDJfY3R4LT5pc19zdHJlYW1fb2ZmKSB7CisJCQkJCQl2bXBlZ192Zl9wdXQodm1wZWdfdmZfZ2V0KHZkZWMpLCB2ZGVjKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWZiLT50YXNrLT5zdWJtaXQoZmItPnRhc2ssIFRBU0tfVFlQRV9ERUMpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJdmZfbm90aWZ5X3JlY2VpdmVyKHZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfVkZSQU1FX1JFQURZLCBOVUxMKTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQl2bXBlZ192Zl9wdXQodm1wZWdfdmZfZ2V0KHZkZWMpLCB2ZGVjKTsKKwkJfQorCisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2bXBlZzRfcHJlcGFyZV9pbnB1dChzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodykKK3sKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisJc3RydWN0IHZkZWNfaW5wdXRfcyAqaW5wdXQgPSAmdmRlYy0+aW5wdXQ7CisJc3RydWN0IHZmcmFtZV9ibG9ja19saXN0X3MgKmJsb2NrID0gTlVMTDsKKwlzdHJ1Y3QgdmZyYW1lX2NodW5rX3MgKmNodW5rID0gaHctPmNodW5rOworCWludCBkdW1teTsKKworCWlmIChjaHVuayA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBmdWxsIHJlc2V0IHRvIEhXIGlucHV0ICovCisJV1JJVEVfVlJFRyhWTERfTUVNX1ZJRklGT19DT05UUk9MLCAwKTsKKworCS8qIHJlc2V0IFZMRCBmaWZvIGZvciBhbGwgdmRlYyAqLworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgKDE8PDUpIHwgKDE8PDQpIHwgKDE8PDMpKTsKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsIDApOworCisJV1JJVEVfVlJFRyhQT1dFUl9DVExfVkxELCAxIDw8IDQpOworCisJLyoKKwkgKnNldHVwIEhXIGRlY29kZXIgaW5wdXQgYnVmZmVyIChWTEQgY29udGV4dCkKKwkgKiBiYXNlZCBvbiBpbnB1dC0+dHlwZSBhbmQgaW5wdXQtPnRhcmdldAorCSAqLworCWlmIChpbnB1dF9mcmFtZV9iYXNlZChpbnB1dCkpIHsKKwkJYmxvY2sgPSBjaHVuay0+YmxvY2s7CisKKwkJV1JJVEVfVlJFRyhWTERfTUVNX1ZJRklGT19TVEFSVF9QVFIsIGJsb2NrLT5zdGFydCk7CisJCVdSSVRFX1ZSRUcoVkxEX01FTV9WSUZJRk9fRU5EX1BUUiwgYmxvY2stPnN0YXJ0ICsKKwkJCQlibG9jay0+c2l6ZSAtIDgpOworCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX0NVUlJfUFRSLAorCQkJCXJvdW5kX2Rvd24oYmxvY2stPnN0YXJ0ICsgaHctPmNodW5rX29mZnNldCwKKwkJCQkJVkRFQ19GSUZPX0FMSUdOKSk7CisKKwkJV1JJVEVfVlJFRyhWTERfTUVNX1ZJRklGT19DT05UUk9MLCAxKTsKKwkJV1JJVEVfVlJFRyhWTERfTUVNX1ZJRklGT19DT05UUk9MLCAwKTsKKworCQkvKiBzZXQgdG8gbWFudWFsIG1vZGUgKi8KKwkJV1JJVEVfVlJFRyhWTERfTUVNX1ZJRklGT19CVUZfQ05UTCwgMik7CisJCVdSSVRFX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlAsCisJCQkJcm91bmRfZG93bihibG9jay0+c3RhcnQgKyBody0+Y2h1bmtfb2Zmc2V0LAorCQkJCQlWREVDX0ZJRk9fQUxJR04pKTsKKwkJZHVtbXkgPSBody0+Y2h1bmtfb2Zmc2V0ICsgaHctPmNodW5rX3NpemUgKworCQkJVkxEX1BBRERJTkdfU0laRTsKKwkJaWYgKGR1bW15ID49IGJsb2NrLT5zaXplKQorCQkJZHVtbXkgLT0gYmxvY2stPnNpemU7CisJCVdSSVRFX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1AsCisJCQlyb3VuZF9kb3duKGJsb2NrLT5zdGFydCArIGR1bW15LAorCQkJCVZERUNfRklGT19BTElHTikpOworCisJCVdSSVRFX1ZSRUcoVkxEX01FTV9WSUZJRk9fQlVGX0NOVEwsIDMpOworCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX0JVRl9DTlRMLCAyKTsKKworCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX0NPTlRST0wsCisJCQkoMHgxMSA8PCAxNikgfCAoMTw8MTApIHwgKDc8PDMpKTsKKworCX0KK30KKworc3RhdGljIGludCB2bXBlZzRfZ2V0X3BzX2luZm8oc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqaHcsIGludCB3aWR0aCwgaW50IGhlaWdodCwgc3RydWN0IGFtbF92ZGVjX3BzX2luZm9zICpwcykKK3sKKwlwcy0+dmlzaWJsZV93aWR0aAk9IHdpZHRoOworCXBzLT52aXNpYmxlX2hlaWdodAk9IGhlaWdodDsKKwlwcy0+Y29kZWRfd2lkdGgJCT0gQUxJR04od2lkdGgsIDY0KTsKKwlwcy0+Y29kZWRfaGVpZ2h0IAk9IEFMSUdOKGhlaWdodCwgNjQpOworCXBzLT5kcGJfc2l6ZSAJCT0gaHctPmJ1Zl9udW07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2NGxfcmVzX2NoYW5nZShzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChjdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSAmJgorCQlody0+cmVzX2NoX2ZsYWcgPT0gMCkgeworCQlzdHJ1Y3QgYW1sX3ZkZWNfcHNfaW5mb3MgcHM7CisKKwkJaWYgKChody0+ZnJhbWVfd2lkdGggIT0gMCAmJgorCQkJaHctPmZyYW1lX2hlaWdodCAhPSAwKSAmJgorCQkJKGh3LT5mcmFtZV93aWR0aCAhPSB3aWR0aCB8fAorCQkJaHctPmZyYW1lX2hlaWdodCAhPSBoZWlnaHQpKSB7CisJCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCQkidjRsX3Jlc19jaGFuZ2UgUGljIFdpZHRoL0hlaWdodCBDaGFuZ2UgKCVkLCVkKT0+KCVkLCVkKVxuIiwKKwkJCQlody0+ZnJhbWVfd2lkdGgsIGh3LT5mcmFtZV9oZWlnaHQsCisJCQkJd2lkdGgsCisJCQkJaGVpZ2h0KTsKKwkJCXZtcGVnNF9nZXRfcHNfaW5mbyhodywgd2lkdGgsIGhlaWdodCwgJnBzKTsKKwkJCXZkZWNfdjRsX3NldF9wc19pbmZvcyhjdHgsICZwcyk7CisJCQl2ZGVjX3Y0bF9yZXNfY2hfZXZlbnQoY3R4KTsKKwkJCWh3LT52NGxfcGFyYW1zX3BhcnNlZCA9IGZhbHNlOworCQkJaHctPnJlc19jaF9mbGFnID0gMTsKKwkJCWN0eC0+djRsX3Jlc29sdXRpb25fY2hhbmdlID0gMTsKKwkJCWh3LT5lb3MgPSAxOworCQkJZmx1c2hfb3V0cHV0KGh3KTsKKwkJCWlmIChody0+aXNfdXNlZF92NGwpCisJCQkJbm90aWZ5X3Y0bF9lb3MoaHdfdG9fdmRlYyhodykpOworCisJCQlyZXQgPSAxOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaXJxcmV0dXJuX3Qgdm1wZWc0X2lzcl90aHJlYWRfZm4oc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGlycSkKK3sKKwl1MzIgcmVnOworCXUzMiBwaWN0dXJlX3R5cGU7CisJaW50IGluZGV4OworCXUzMiBwdHMsIG9mZnNldCA9IDA7CisJdTY0IHB0c191czY0ID0gMDsKKwl1MzIgZnJhbWVfc2l6ZSwgZGVjX3csIGRlY19oOworCXUzMiB0aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uLCBmaXhlZF92b3BfcmF0ZSwgdm9wX3RpbWVfaW5jLCB2b3NfaW5mbzsKKwl1MzIgcmVwZWF0X2NudCwgZHVyYXRpb24gPSAzMjAwOworCXN0cnVjdCBwaWNfaW5mb190ICpkZWNfcGljLCAqZGlzcF9waWM7CisJc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqaHcgPSAoc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqKSh2ZGVjLT5wcml2YXRlKTsKKwlpZiAoaHctPmVvcykKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJaWYgKFJFQURfVlJFRyhNUDRfUElDX0lORk8pID09IDEpIHsKKwkJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQkJaW50IGZyYW1lX3dpZHRoID0gUkVBRF9WUkVHKE1QNF9QSUNfV0gpPj4gMTY7CisJCQlpbnQgZnJhbWVfaGVpZ2h0ID0gUkVBRF9WUkVHKE1QNF9QSUNfV0gpICYgMHhmZmZmOworCQkJaWYgKCF2NGxfcmVzX2NoYW5nZShodywgZnJhbWVfd2lkdGgsIGZyYW1lX2hlaWdodCkpIHsKKwkJCQlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KTsKKwkJCQlpZiAoY3R4LT5wYXJhbV9zZXRzX2Zyb21fdWNvZGUgJiYgIWh3LT52NGxfcGFyYW1zX3BhcnNlZCkgeworCQkJCQlzdHJ1Y3QgYW1sX3ZkZWNfcHNfaW5mb3MgcHM7CisKKwkJCQkJdm1wZWc0X2dldF9wc19pbmZvKGh3LCBmcmFtZV93aWR0aCwgZnJhbWVfaGVpZ2h0LCAmcHMpOworCQkJCQlody0+djRsX3BhcmFtc19wYXJzZWQgPSB0cnVlOworCQkJCQl2ZGVjX3Y0bF9zZXRfcHNfaW5mb3MoY3R4LCAmcHMpOworCQkJCQlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCQkJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfQUdBSU47CisJCQkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJCX0gZWxzZSB7CisJCQkJCVdSSVRFX1ZSRUcoTVA0X1BJQ19JTkZPLCAwKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisJCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0FHQUlOOworCQkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJfQorCQl9IGVsc2UKKwkJCVdSSVRFX1ZSRUcoTVA0X1BJQ19JTkZPLCAwKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWlmICgoaHctPmlzX3VzZWRfdjRsKSAmJiAhaHctPnY0bF9wYXJhbXNfcGFyc2VkKSB7CisJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1Y0TF9ERVRBSUwsCisJCQkiVGhlIGhlYWQgd2FzIG5vdCBmb3VuZCwgY2FuIG5vdCB0byBkZWNvZGVcbiIpOworCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlXUklURV9WUkVHKEFTU0lTVF9NQk9YMV9DTFJfUkVHLCAxKTsKKwlpZiAoUkVBRF9WUkVHKEFWX1NDUkFUQ0hfTSkgIT0gMCAmJgorCQkoZGVidWdfZW5hYmxlICYgUFJJTlRfRkxBR19VQ09ERV9ERVRBSUwpKSB7CisJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1VDT0RFX0RFVEFJTCwKKwkJImRiZyAleDogJXgsIGxldmVsICV4LCB3cCAleCwgcnAgJXgsIGNudCAleFxuIiwKKwkJCVJFQURfVlJFRyhBVl9TQ1JBVENIX00pLCBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9OKSwKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCksCisJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSwKKwkJCVJFQURfVlJFRyhWSUZGX0JJVF9DTlQpKTsKKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX00sIDApOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCXJlZyA9IFJFQURfVlJFRyhNUkVHX0JVRkZFUk9VVCk7CisKKwl0aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uID0gUkVBRF9WUkVHKE1QNF9SQVRFKTsKKwlmaXhlZF92b3BfcmF0ZSA9IHRpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24gPj4gMTY7CisJdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiAmPSAweGZmZmY7CisJaWYgKHRpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24gPiAwICYmCisJCWZpeGVkX3ZvcF9yYXRlID09IDApCisJCWh3LT5zeXNfbXA0X3JhdGUgPSB0aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uOworCisJaWYgKGh3LT52bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSA9PSAwKSB7CisJCWlmICgoZml4ZWRfdm9wX3JhdGUgIT0gMCkgJiYKKwkJCSh0aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uICE9IDApKSB7CisJCQlody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgPSBmaXhlZF92b3BfcmF0ZSAqCisJCQkJCURVUkFUSU9OX1VOSVQgLyB0aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uOworCQl9IGVsc2UgaWYgKHRpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24gPT0gMAorCQkJJiYgaHctPnN5c19tcDRfcmF0ZSA+IDApCisJCQl0aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uID0gaHctPnN5c19tcDRfcmF0ZTsKKwl9CisJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCwKKwkJInRpbWVfaW5jX3JlcyA9ICVkLCBmaXhlZF92b3BfcmF0ZSA9ICVkLCByYXRlID0gJWRcbiIsCisJCXRpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24sIGZpeGVkX3ZvcF9yYXRlLAorCQlody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUpOworCisJaWYgKHJlZyA9PSAyKSB7CisJCS8qIHRpbWVvdXQgd2hlbiBkZWNvZGluZyBuZXh0IGZyYW1lICovCisKKwkJLyogZm9yIGZyYW1lIGJhc2VkIGNhc2UsIGluc3VmZmljaWVudCByZXN1bHQgbWF5IGhhcHBlbgorCQkgKiBhdCB0aGUgYmVnaW5uaW5nIHdoZW4gb25seSBWT0wgaGVhZCBpcyBhdmFpbGFibGUgc2F2ZQorCQkgKiBIVyBjb250ZXh0IGFsc28sIHN1Y2ggYXMgZm9yIHRoZSBRVGFibGUgZnJvbSBWQ09QIHJlZ2lzdGVyCisJCSAqLworCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCVBSSU5UX0ZMQUdfVkxEX0RFVEFJTCwKKwkJCSIlcywgbGV2ZWwgPSAleCwgdmZpZm9fY3RybCA9ICV4LCBiaXRjbnQgPSAlZFxuIiwKKwkJCV9fZnVuY19fLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKSwKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19DT05UUk9MKSwKKwkJCVJFQURfVlJFRyhWSUZGX0JJVF9DTlQpKTsKKworCQlpZiAodmRlY19mcmFtZV9iYXNlZCh2ZGVjKSkgeworCQkJdm1wZWc0X3NhdmVfaHdfY29udGV4dChodyk7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQl9IGVsc2UgeworCQkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQl9CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9IGVsc2UgeworCQlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCQlwaWN0dXJlX3R5cGUgPSAocmVnID4+IDMpICYgNzsKKwkJcmVwZWF0X2NudCA9IFJFQURfVlJFRyhNUDRfTk9UX0NPREVEX0NOVCk7CisJCXZvcF90aW1lX2luYyA9IFJFQURfVlJFRyhNUDRfVk9QX1RJTUVfSU5DKTsKKwkJdm9zX2luZm8gPSBSRUFEX1ZSRUcoTVA0X1ZPU19JTkZPKTsKKwkJaWYgKCh2b3NfaW5mbyAmIDB4ZmYpICYmCisJCQkoKCh2b3NfaW5mbyA+PiA0KSAmIDB4ZikgIT0gaHctPnByb2ZpbGVfaWRjIHx8CisJCQkodm9zX2luZm8gJiAweGYpICE9IGh3LT5sZXZlbF9pZGMpKSB7CisJCQlody0+cHJvZmlsZV9pZGMgPSB2b3NfaW5mbyA+PiA0ICYgMHhmOworCQkJaHctPmxldmVsX2lkYyA9IHZvc19pbmZvICYgMHhmOworCQkJdmRlY19zZXRfcHJvZmlsZV9sZXZlbCh2ZGVjLCBody0+cHJvZmlsZV9pZGMsIGh3LT5sZXZlbF9pZGMpOworCQkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCwKKwkJCQkicHJvZmlsZV9pZGM6ICVkICBsZXZlbF9pZGM6ICVkXG4iLAorCQkJCWh3LT5wcm9maWxlX2lkYywgaHctPmxldmVsX2lkYyk7CisJCX0KKworCQlpbmRleCA9IHNwZWNfdG9faW5kZXgoaHcsIFJFQURfVlJFRyhSRUNfQ0FOVkFTX0FERFIpKTsKKwkJaWYgKGluZGV4IDwgMCkgeworCQkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkJImludmFsaWQgYnVmZmVyIGluZGV4ICVkLiByZWMgPSAleFxuIiwKKwkJCQlpbmRleCwgUkVBRF9WUkVHKFJFQ19DQU5WQVNfQUREUikpOworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0VSUk9SOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKwkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJCWRlY19waWMgPSAmaHctPnBpY1tpbmRleF07CisJCWlmICh2ZGVjLT5tdmZybSkgeworCQkJZGVjX3BpYy0+ZnJhbWVfc2l6ZSA9IHZkZWMtPm12ZnJtLT5mcmFtZV9zaXplOworCQkJZGVjX3BpYy0+aHdfZGVjb2RlX3RpbWUgPQorCQkJbG9jYWxfY2xvY2soKSAtIHZkZWMtPm12ZnJtLT5od19kZWNvZGVfc3RhcnQ7CisJCX0KKwkJZGVjX3BpYy0+cHRzX3ZhbGlkID0gZmFsc2U7CisJCWRlY19waWMtPnB0cyA9IDA7CisJCWRlY19waWMtPnB0czY0ID0gMDsKKwkJZGVjX3BpYy0+dGltZXN0YW1wID0gMDsKKwkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfQlVGRkVSX0RFVEFJTCwKKwkJCSJuZXcgcGljOiBpbmRleD0lZCwgdXNlZD0lZCwgcmVwZWF0PSVkLCB0aW1lX2luYz0lZFxuIiwKKwkJCWluZGV4LCBody0+dmZidWZfdXNlW2luZGV4XSwgcmVwZWF0X2NudCwgdm9wX3RpbWVfaW5jKTsKKworCQlkZWNfdyA9IFJFQURfVlJFRyhNUDRfUElDX1dIKT4+IDE2OworCQlkZWNfaCA9IFJFQURfVlJFRyhNUDRfUElDX1dIKSAmIDB4ZmZmZjsKKwkJaWYgKGRlY193ICE9IDApIHsKKwkJCWh3LT5mcmFtZV93aWR0aCA9IGRlY193OworCQkJZGVjX3BpYy0+d2lkdGggPSBkZWNfdzsKKwkJfQorCQlpZiAoZGVjX2ggIT0gMCkgeworCQkJaHctPmZyYW1lX2hlaWdodCA9IGRlY19oOworCQkJZGVjX3BpYy0+aGVpZ2h0ID0gZGVjX2g7CisJCX0KKwkJaHctPnJlc19jaF9mbGFnID0gMDsKKworCQlpZiAoaHctPnZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5yYXRlID09IDApIHsKKwkJCWlmICh2b3BfdGltZV9pbmMgPCBody0+bGFzdF92b3BfdGltZV9pbmMpIHsKKwkJCQlkdXJhdGlvbiA9IHZvcF90aW1lX2luYyArCisJCQkJCXRpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24gLQorCQkJCQlody0+bGFzdF92b3BfdGltZV9pbmM7CisJCQl9IGVsc2UgeworCQkJCWR1cmF0aW9uID0gdm9wX3RpbWVfaW5jIC0KKwkJCQkJaHctPmxhc3Rfdm9wX3RpbWVfaW5jOworCQkJfQorCisJCQlpZiAoZHVyYXRpb24gPT0gaHctPmxhc3RfZHVyYXRpb24pIHsKKwkJCQlody0+cmF0ZV9kZXRlY3QrKzsKKwkJCQlpZiAoKGh3LT5yYXRlX2RldGVjdCA+PSBSQVRFX0RFVEVDVF9DT1VOVCkgJiYKKwkJCQkJKHRpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24gIT0gMCkpIHsKKwkJCQkJaHctPnZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5yYXRlID0KKwkJCQkJCWR1cmF0aW9uICogRFVSQVRJT05fVU5JVCAvCisJCQkJCQl0aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uOworCQkJCQlkdXJhdGlvbiA9CisJCQkJCQlody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGU7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlody0+cmF0ZV9kZXRlY3QgPSAwOworCQkJCWh3LT5sYXN0X2R1cmF0aW9uID0gZHVyYXRpb247CisJCQl9CisJCQlpZiAoTVBFRzRfVkFMSURfRFVSKGR1cmF0aW9uKSkgeworCQkJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1RJTUVJTkZPLAorCQkJCQkid2FybjogZHVyYXRpb24gJXgsIHNldCAwXG4iLCBkdXJhdGlvbik7CisJCQkJZHVyYXRpb24gPSAwOworCQkJfQorCQl9IGVsc2UgeworCQkJZHVyYXRpb24gPSBody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGU7CisjaWYgMAorCQkJcHJfaW5mbygiaW5mbyByYXRlID0gJWQsIHVjb2RlIHJhdGUgPSAweCV4OjB4JXhcbiIsCisJCQkJICAgaHctPnZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5yYXRlLAorCQkJCSAgIFJFQURfVlJFRyhNUDRfUkFURSksIHZvcF90aW1lX2luYyk7CisjZW5kaWYKKwkJfQorCisJCS8qIGZyYW1lIG1vZGUgd2l0aCB1bnN0YWJsZSBwdHMgKi8KKwkJaWYgKGh3LT51bnN0YWJsZV9wdHMgJiYgaHctPmNodW5rKSB7CisJCQlkZWNfcGljLT5wdHNfdmFsaWQgPSBody0+Y2h1bmstPnB0c192YWxpZDsKKwkJCWRlY19waWMtPnB0cyA9IGh3LT5jaHVuay0+cHRzOworCQkJZGVjX3BpYy0+cHRzNjQgPSBody0+Y2h1bmstPnB0czY0OworCQkJZGVjX3BpYy0+dGltZXN0YW1wID0gaHctPmNodW5rLT50aW1lc3RhbXA7CisJCQlpZiAoKEJfUElDVFVSRSA9PSBwaWN0dXJlX3R5cGUpIHx8CisJCQkJKGh3LT5sYXN0X2RlY19wdHMgPT0gZGVjX3BpYy0+cHRzKSkKKwkJCQlkZWNfcGljLT5wdHNfdmFsaWQgPSAwOworCisJCQlody0+bGFzdF9kZWNfcHRzID0gZGVjX3BpYy0+cHRzOworCQl9IGVsc2UgaWYgKChJX1BJQ1RVUkUgPT0gcGljdHVyZV90eXBlKSB8fAorCQkJKFBfUElDVFVSRSA9PSBwaWN0dXJlX3R5cGUpKSB7CisJCQlvZmZzZXQgPSBSRUFEX1ZSRUcoTVA0X09GRlNFVF9SRUcpOworCQkJaWYgKGh3LT5jaHVuaykgeworCQkJCWRlY19waWMtPnB0c192YWxpZCA9IGh3LT5jaHVuay0+cHRzX3ZhbGlkOworCQkJCWRlY19waWMtPnB0cyA9IGh3LT5jaHVuay0+cHRzOworCQkJCWRlY19waWMtPnB0czY0ID0gaHctPmNodW5rLT5wdHM2NDsKKwkJCQlkZWNfcGljLT50aW1lc3RhbXAgPSBody0+Y2h1bmstPnRpbWVzdGFtcDsKKwkJCX0gZWxzZSB7CisJCQkJZGVjX3BpYy0+b2Zmc2V0ID0gb2Zmc2V0OworCQkJCWlmICgodmRlYy0+dmJ1Zi5ub19wYXJzZXIgPT0gMCkgfHwgKHZkZWMtPnZidWYudXNlX3B0c3NlcnYpKSB7CisJCQkJCWlmIChwdHNfbG9va3VwX29mZnNldF91czY0KFBUU19UWVBFX1ZJREVPLCBvZmZzZXQsCisJCQkJCQkmcHRzLCAmZnJhbWVfc2l6ZSwgMzAwMCwgJnB0c191czY0KSA9PSAwKSB7CisJCQkJCQlkZWNfcGljLT5wdHNfdmFsaWQgPSB0cnVlOworCQkJCQkJZGVjX3BpYy0+cHRzID0gcHRzOworCQkJCQkJZGVjX3BpYy0+cHRzNjQgPSBwdHNfdXM2NDsKKwkJCQkJCWh3LT5wdHNfaGl0Kys7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlkZWNfcGljLT5wdHNfdmFsaWQgPSBmYWxzZTsKKwkJCQkJCWh3LT5wdHNfbWlzc2VkKys7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19USU1FSU5GTywKKwkJCQkiJWMsIG9mZnNldD0weCV4LCBwdHM9MHgleCglZCksIGluZGV4PSVkLCB1c2VkPSVkXG4iLAorCQkJCUdFVF9QSUNfVFlQRShwaWN0dXJlX3R5cGUpLCBvZmZzZXQsIGRlY19waWMtPnB0cywKKwkJCQlkZWNfcGljLT5wdHNfdmFsaWQsIGluZGV4LCBody0+dmZidWZfdXNlW2luZGV4XSk7CisJCX0KKworCQlkZWNfcGljLT5pbmRleCA9IGluZGV4OworCQlkZWNfcGljLT5waWNfaW5mbyA9IHJlZzsKKwkJZGVjX3BpYy0+cGljX3R5cGUgPSBwaWN0dXJlX3R5cGU7CisJCWRlY19waWMtPmR1cmF0aW9uID0gZHVyYXRpb247CisJCWh3LT52ZmJ1Zl91c2VbaW5kZXhdID0gMDsKKwkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfUlVOX0ZMT1csCisJCQkibW1wZWc0OiBwaWNfbnVtOiAlZCwgaW5kZXggJWQsIHR5cGUgJWMsIHB0cyAleFxuIiwKKwkJCWh3LT5mcmFtZV9udW0sIGluZGV4LAorCQkJR0VUX1BJQ19UWVBFKHBpY3R1cmVfdHlwZSksCisJCQlkZWNfcGljLT5wdHMpOworCisJCS8qIGJ1ZmZlciBtYW5hZ2VtZW50ICovCisJCWlmICgocGljdHVyZV90eXBlID09IElfUElDVFVSRSkgfHwKKwkJCShwaWN0dXJlX3R5cGUgPT0gUF9QSUNUVVJFKSkgeworCQkJaW5kZXggPSB1cGRhdGVfcmVmKGh3LCBpbmRleCk7CisJCX0gZWxzZSB7CisJCQkvKiBkcm9wIEIgZnJhbWUgb3IgZGlzcCBpbW1lZGlhdGVseS4KKwkJCSAqIGRlcGVuZCBvbiBpZiB0aGVyZSBhcmUgdHdvIHJlZiBmcmFtZXMKKwkJCSAqLworCQkJaWYgKGh3LT5yZWZzWzFdID09IC0xKQorCQkJCWluZGV4ID0gLTE7CisJCX0KKwkJdm1wZWc0X3NhdmVfaHdfY29udGV4dChodyk7CisJCWlmIChpbmRleCA8IDApIHsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisJCWRpc3BfcGljID0gJmh3LT5waWNbaW5kZXhdOworCQlpZiAoKGh3LT5maXJzdF9pX2ZyYW1lX3JlYWR5ID09IDApICYmCisJCQkoSV9QSUNUVVJFID09IGRpc3BfcGljLT5waWNfdHlwZSkpCisJCQlody0+Zmlyc3RfaV9mcmFtZV9yZWFkeSA9IDE7CisKKwkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfUlVOX0ZMT1csCisJCQkiZGlzcDogaW5kZXg9JWQsIHB0cz0leCglZCksIHVzZWQ9JWQsIHBpY291dD0lYyhkZWM9JWMpXG4iLAorCQkJaW5kZXgsIGRpc3BfcGljLT5wdHMsIGRpc3BfcGljLT5wdHNfdmFsaWQsCisJCQlody0+dmZidWZfdXNlW2luZGV4XSwKKwkJCUdFVF9QSUNfVFlQRShkaXNwX3BpYy0+cGljX3R5cGUpLAorCQkJR0VUX1BJQ19UWVBFKHBpY3R1cmVfdHlwZSkpOworCisJCWlmIChkaXNwX3BpYy0+cHRzX3ZhbGlkKSB7CisJCQlody0+bGFzdF9hbmNoX3B0cyA9IGRpc3BfcGljLT5wdHM7CisJCQlody0+bGFzdF9hbmNoX3B0c191czY0ID0gZGlzcF9waWMtPnB0czY0OworCQkJaHctPmZyYW1lX251bV9zaW5jZV9sYXN0X2FuY2ggPSAwOworCQkJaHctPnZvcF90aW1lX2luY19zaW5jZV9sYXN0X2FuY2ggPSAwOworCQl9IGVsc2UgaWYgKHZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpKSB7CisJCQlkaXNwX3BpYy0+cHRzID0gaHctPmxhc3RfYW5jaF9wdHM7CisJCQlkaXNwX3BpYy0+cHRzNjQgPSBody0+bGFzdF9hbmNoX3B0c191czY0OworCisJCQlpZiAoKHRpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24gIT0gMCkgJiYKKwkJCQkoZml4ZWRfdm9wX3JhdGUgPT0gMCkgJiYKKwkJCQkoaHctPnZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5yYXRlID09IDApKSB7CisJCQkJLyogdmFyaWFibGUgUFRTIHJhdGUgKi8KKwkJCQkvKmJ1ZyBvbiB2YXJpYWJsZSBwdHMgY2FsYywKKwkJCQkgKmRvIGFzIGRpeGVkIHZvcCBmaXJzdCBpZiB3ZQorCQkJCSAqaGF2ZSByYXRlIHNldHRpbmcgYmVmb3JlLgorCQkJCSAqLworCQkJCWlmICh2b3BfdGltZV9pbmMgPiBody0+bGFzdF92b3BfdGltZV9pbmMpIHsKKwkJCQkJZHVyYXRpb24gPSB2b3BfdGltZV9pbmMgLQorCQkJCQkJaHctPmxhc3Rfdm9wX3RpbWVfaW5jOworCQkJCX0gZWxzZSB7CisJCQkJCWR1cmF0aW9uID0gdm9wX3RpbWVfaW5jICsKKwkJCQkJCXRpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24gLQorCQkJCQkJaHctPmxhc3Rfdm9wX3RpbWVfaW5jOworCQkJCX0KKworCQkJCWh3LT52b3BfdGltZV9pbmNfc2luY2VfbGFzdF9hbmNoICs9IGR1cmF0aW9uOworCisJCQkJZGlzcF9waWMtPnB0cyArPSBody0+dm9wX3RpbWVfaW5jX3NpbmNlX2xhc3RfYW5jaCAqCisJCQkJCVBUU19VTklUIC8gdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbjsKKwkJCQlkaXNwX3BpYy0+cHRzNjQgKz0gKGh3LT52b3BfdGltZV9pbmNfc2luY2VfbGFzdF9hbmNoICoKKwkJCQkJUFRTX1VOSVQgLyB0aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uKSAqCisJCQkJCTEwMCAvIDk7CisKKwkJCQlpZiAoaHctPnZvcF90aW1lX2luY19zaW5jZV9sYXN0X2FuY2ggPgorCQkJCQkoMSA8PCAxNCkpIHsKKwkJCQkJLyogYXZvaWQgb3ZlcmZsb3cgKi8KKwkJCQkJaHctPmxhc3RfYW5jaF9wdHMgPSBkaXNwX3BpYy0+cHRzOworCQkJCQlody0+bGFzdF9hbmNoX3B0c191czY0ID0gZGlzcF9waWMtPnB0czY0OworCQkJCQlody0+dm9wX3RpbWVfaW5jX3NpbmNlX2xhc3RfYW5jaCA9IDA7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKiBmaXhlZCBWT1AgcmF0ZSAqLworCQkJCWh3LT5mcmFtZV9udW1fc2luY2VfbGFzdF9hbmNoKys7CisJCQkJZGlzcF9waWMtPnB0cyArPSBEVVIyUFRTKGh3LT5mcmFtZV9udW1fc2luY2VfbGFzdF9hbmNoICoKKwkJCQkJaHctPnZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5yYXRlKTsKKwkJCQlkaXNwX3BpYy0+cHRzNjQgKz0gRFVSMlBUUygKKwkJCQkJaHctPmZyYW1lX251bV9zaW5jZV9sYXN0X2FuY2ggKgorCQkJCQlody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUpICogMTAwIC8gOTsKKworCQkJCWlmIChody0+ZnJhbWVfbnVtX3NpbmNlX2xhc3RfYW5jaCA+ICgxIDw8IDE1KSkgeworCQkJCQkvKiBhdm9pZCBvdmVyZmxvdyAqLworCQkJCQlody0+bGFzdF9hbmNoX3B0cyA9IGRpc3BfcGljLT5wdHM7CisJCQkJCWh3LT5sYXN0X2FuY2hfcHRzX3VzNjQgPSBkaXNwX3BpYy0+cHRzNjQ7CisJCQkJCWh3LT5mcmFtZV9udW1fc2luY2VfbGFzdF9hbmNoID0gMDsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAoaHctPnVuc3RhYmxlX3B0cyAmJiBody0+Y2h1bmsgJiYKKwkJCU1QRUc0X1ZBTElEX0RVUihkdXJhdGlvbikpIHsKKwkJCS8qIGludmFsaWQgcHRzIGNhbGMgKi8KKwkJCWh3LT5mcmFtZV9udW1fc2luY2VfbGFzdF9hbmNoID0gaHctPmNodW5rX2ZyYW1lX2NvdW50OworCQkJZGlzcF9waWMtPnB0cyA9IGh3LT5sYXN0X2FuY2hfcHRzICsKKwkJCQlEVVIyUFRTKGh3LT5mcmFtZV9udW1fc2luY2VfbGFzdF9hbmNoICoKKwkJCQlkdXJhdGlvbik7CisJCQlkaXNwX3BpYy0+cHRzNjQgPSBody0+bGFzdF9hbmNoX3B0c191czY0ICsKKwkJCQlEVVIyUFRTKGh3LT5mcmFtZV9udW1fc2luY2VfbGFzdF9hbmNoICoKKwkJCQlkdXJhdGlvbikgKiAxMDAgLyA5OworCisJCQlpZiAoaHctPmZyYW1lX251bV9zaW5jZV9sYXN0X2FuY2ggPiAoMSA8PCAxNSkpIHsKKwkJCQkvKiBhdm9pZCBvdmVyZmxvdyAqLworCQkJCWh3LT5sYXN0X2FuY2hfcHRzID0gZGlzcF9waWMtPnB0czsKKwkJCQlody0+bGFzdF9hbmNoX3B0c191czY0ID0gZGlzcF9waWMtPnB0czY0OworCQkJCWh3LT5mcmFtZV9udW1fc2luY2VfbGFzdF9hbmNoID0gMDsKKwkJCX0gZWxzZQorCQkJCWRpc3BfcGljLT5wdHNfdmFsaWQgPSAxOworCQl9CisKKwkJaWYgKHZkZWNfZnJhbWVfYmFzZWQodmRlYykgJiYKKwkJCShody0+dW5zdGFibGVfcHRzKSAmJgorCQkJTVBFRzRfVkFMSURfRFVSKGR1cmF0aW9uKSkgeworCisJCQl1MzIgdGhyZXNob2xkID0gRFVSMlBUUyhkdXJhdGlvbikgPj4gMzsKKworCQkJaWYgKGRpc3BfcGljLT5wdHMgPD0gKGh3LT5sYXN0X3B0cyArIHRocmVzaG9sZCkpIHsKKwkJCQlkaXNwX3BpYy0+cHRzID0gaHctPmxhc3RfcHRzICsgRFVSMlBUUyhkdXJhdGlvbik7CisJCQkJZGlzcF9waWMtPnB0czY0ID0gaHctPmxhc3RfcHRzNjQgKworCQkJCQkoRFVSMlBUUyhkdXJhdGlvbikqMTAwLzkpOworCQkJfQorCQkJaWYgKCFkaXNwX3BpYy0+cHRzX3ZhbGlkKSB7CisJCQkJZGlzcF9waWMtPnB0cyA9IDA7CisJCQkJZGlzcF9waWMtPnB0czY0ID0gMDsKKwkJCQlkaXNwX3BpYy0+dGltZXN0YW1wID0gMDsKKwkJCX0KKwkJfQorCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19USU1FSU5GTywKKwkJCSJkaXNwOiBwaWNfdHlwZSAlYywgcHRzICVkKCVsbGQpLCBkaWZmICVkLCBjbnQgJWQsIGRpc3BfcGljLT50aW1lc3RhbXAgJWxsdVxuIiwKKwkJCUdFVF9QSUNfVFlQRShkaXNwX3BpYy0+cGljX3R5cGUpLAorCQkJZGlzcF9waWMtPnB0cywKKwkJCWRpc3BfcGljLT5wdHM2NCwKKwkJCWRpc3BfcGljLT5wdHMgLSBody0+bGFzdF9wdHMsCisJCQlody0+Y2h1bmtfZnJhbWVfY291bnQsCisJCQlkaXNwX3BpYy0+dGltZXN0YW1wKTsKKwkJaHctPmxhc3RfcHRzID0gZGlzcF9waWMtPnB0czsKKwkJaHctPmxhc3RfcHRzNjQgPSBkaXNwX3BpYy0+cHRzNjQ7CisJCWh3LT5mcmFtZV9kdXIgPSBkdXJhdGlvbjsKKwkJZGlzcF9waWMtPmR1cmF0aW9uID0gZHVyYXRpb247CisJCWRpc3BfcGljLT5yZXBlYXRfY250ID0gcmVwZWF0X2NudDsKKworCQlwcmVwYXJlX2Rpc3BsYXlfYnVmKGh3LCBkaXNwX3BpYyk7CisKKwkJaHctPnRvdGFsX2ZyYW1lICs9IHJlcGVhdF9jbnQgKyAxOworCQlody0+bGFzdF92b3BfdGltZV9pbmMgPSB2b3BfdGltZV9pbmM7CisKKwkJaWYgKHZkZWNfZnJhbWVfYmFzZWQodmRlYykgJiYKKwkJCShmcm1iYXNlX2NvbnRfYml0bGV2ZWwgIT0gMCkgJiYKKwkJCShody0+Zmlyc3RfaV9mcmFtZV9yZWFkeSkpIHsKKwkJCXUzMiBjb25zdW1lX2J5dGUsIHJlc19ieXRlLCBiaXRjbnQ7CisKKwkJCWJpdGNudCA9IFJFQURfVlJFRyhWSUZGX0JJVF9DTlQpOworCQkJcmVzX2J5dGUgPSBiaXRjbnQgPj4gMzsKKworCQkJaWYgKGh3LT5jaHVua19zaXplID4gcmVzX2J5dGUpIHsKKwkJCQlpZiAoYml0Y250ID4gZnJtYmFzZV9jb250X2JpdGxldmVsKSB7CisJCQkJCWNvbnN1bWVfYnl0ZSA9IGh3LT5jaHVua19zaXplIC0gcmVzX2J5dGU7CisKKwkJCQkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfUlVOX0ZMT1csCisJCQkJCQkiJXMsIHNpemUgJWQsIGNvbnN1bWUgJWQsIHJlcyAlZFxuIiwgX19mdW5jX18sCisJCQkJCQlody0+Y2h1bmtfc2l6ZSwgY29uc3VtZV9ieXRlLCByZXNfYnl0ZSk7CisKKwkJCQkJaWYgKGNvbnN1bWVfYnl0ZSA+IFZERUNfRklGT19BTElHTikgeworCQkJCQkJY29uc3VtZV9ieXRlIC09IFZERUNfRklGT19BTElHTjsKKwkJCQkJCXJlc19ieXRlICs9IFZERUNfRklGT19BTElHTjsKKwkJCQkJfQorCQkJCQlody0+Y2h1bmtfb2Zmc2V0ICs9IGNvbnN1bWVfYnl0ZTsKKwkJCQkJaHctPmNodW5rX3NpemUgPSByZXNfYnl0ZTsKKwkJCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX1VORklOSVNIOworCQkJCQlody0+Y2h1bmtfZnJhbWVfY291bnQrKzsKKwkJCQkJaHctPnVuc3RhYmxlX3B0cyA9IDE7CisJCQkJfSBlbHNlIHsKKwkJCQkJaHctPmNodW5rX3NpemUgPSAwOworCQkJCQlody0+Y2h1bmtfb2Zmc2V0ID0gMDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0VSUk9SLAorCQkJCQkiZXJyb3I6IGJpdGJ5dGUgJWQgIGh3LT5jaHVua19zaXplICVkXG4iLCByZXNfYnl0ZSwgaHctPmNodW5rX3NpemUpOworCQkJCWh3LT5jaHVua19zaXplID0gMDsKKwkJCQlody0+Y2h1bmtfb2Zmc2V0ID0gMDsKKwkJCX0KKwkJfQorCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwl9CisJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZSQU1FX05VTSwKKwkJIiVzOiBmcmFtZSBudW06JWRcbiIsIF9fZnVuY19fLCBody0+ZnJhbWVfbnVtKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IHZtcGVnNF9pc3Ioc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGlycSkKK3sKKwlzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodyA9CisJCShzdHJ1Y3QgdmRlY19tcGVnNF9od19zICopKHZkZWMtPnByaXZhdGUpOworCisJaWYgKGh3LT5lb3MpCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCXJldHVybiBJUlFfV0FLRV9USFJFQUQ7Cit9CisKK3N0YXRpYyB2b2lkIGZsdXNoX291dHB1dChzdHJ1Y3QgdmRlY19tcGVnNF9od19zICogaHcpCit7CisJc3RydWN0IHBpY19pbmZvX3QgKnBpYzsKKworCWlmIChody0+dmZidWZfdXNlW2h3LT5yZWZzWzFdXSA+IDApIHsKKwkJcGljID0gJmh3LT5waWNbaHctPnJlZnNbMV1dOworCQlwcmVwYXJlX2Rpc3BsYXlfYnVmKGh3LCBwaWMpOworCX0KK30KKworc3RhdGljIGludCBub3RpZnlfdjRsX2VvcyhzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKil2ZGVjLT5wcml2YXRlOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShody0+djRsMl9jdHgpOworCXN0cnVjdCB2ZnJhbWVfcyAqdmYgPSBOVUxMOworCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9IE5VTEw7CisJaW50IGluZGV4ID0gLTE7CisKKwlpZiAoaHctPmVvcykgeworCQlpZiAoa2ZpZm9fZ2V0KCZody0+bmV3ZnJhbWVfcSwgJnZmKSA9PSAwIHx8IHZmID09IE5VTEwpIHsKKwkJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0VSUk9SLAorCQkJCSIlcyBmYXRhbCBlcnJvciwgbm8gYXZhaWxhYmxlIGJ1ZmZlciBzbG90LlxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCQlpbmRleCA9IGZpbmRfZnJlZV9idWZmZXIoaHcpOworCQkJaWYgKChpbmRleCA9PSAtMSkgfHwgKGluZGV4ID09IDB4ZmZmZmZmKSkgeworCQkJCWN0eC0+ZmJfb3BzLnF1ZXJ5KCZjdHgtPmZiX29wcywgJmh3LT5mYl90b2tlbik7CisJCQkJaWYgKGN0eC0+ZmJfb3BzLmFsbG9jKCZjdHgtPmZiX29wcywgaHctPmZiX3Rva2VuLCAmZmIsIEFNTF9GQl9SRVFfREVDKSA8IDApIHsKKwkJCQkJcHJfZXJyKCJbJWRdIGdldCBmYiBmYWlsLlxuIiwgY3R4LT5pZCk7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQl9CisJCX0KKworCQl2Zi0+dHlwZSB8PSBWSURUWVBFX1Y0TF9FT1M7CisJCXZmLT50aW1lc3RhbXAgPSBVTE9OR19NQVg7CisJCXZmLT52NGxfbWVtX2hhbmRsZSA9IChpbmRleCA9PSAtMSkgPyAodWxvbmcpZmIgOgorCQkJCQkJCWh3LT5waWNbaW5kZXhdLnY0bF9yZWZfYnVmX2FkZHI7OworCQl2Zi0+ZmxhZyA9IFZGUkFNRV9GTEFHX0VNUFRZX0ZSQU1FX1Y0TDsKKwkJZmIgPSAoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKil2Zi0+djRsX21lbV9oYW5kbGU7CisKKwkJdmRlY192ZnJhbWVfcmVhZHkodmRlYywgdmYpOworCQlrZmlmb19wdXQoJmh3LT5kaXNwbGF5X3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisKKwkJaWYgKGh3LT5pc191c2VkX3Y0bCkKKwkJCWZiLT50YXNrLT5zdWJtaXQoZmItPnRhc2ssIFRBU0tfVFlQRV9ERUMpOworCQllbHNlCisJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIodmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfVkZSQU1FX1JFQURZLCBOVUxMKTsKKwkJQVRSQUNFX0NPVU5URVIoaHctPnB0c19uYW1lLCB2Zi0+cHRzKTsKKworCQlwcl9pbmZvKCJbJWRdIG1wZWc0IEVPUyBub3RpZnkuXG4iLCAoaHctPmlzX3VzZWRfdjRsKT9jdHgtPmlkOnZkZWMtPmlkKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdm1wZWc0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MsIHdvcmspOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGh3KTsKKworCS8qIGZpbmlzaGVkIGRlY29kaW5nIG9uZSBmcmFtZSBvciBlcnJvciwKKwkgKiBub3RpZnkgdmRlYyBjb3JlIHRvIHN3aXRjaCBjb250ZXh0CisJICovCisJaWYgKGh3LT5kZWNfcmVzdWx0ICE9IERFQ19SRVNVTFRfRE9ORSkKKwkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfUlVOX0ZMT1csCisJCQkidm1wZWc0X3dvcms6IHJlc3VsdD0lZCxzdGF0dXM9JWRcbiIsCisJCQlody0+ZGVjX3Jlc3VsdCwgaHdfdG9fdmRlYyhodyktPm5leHRfc3RhdHVzKTsKKworCWlmIChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX1VORklOSVNIKSB7CisJCWlmICghaHctPmN0eF92YWxpZCkKKwkJCWh3LT5jdHhfdmFsaWQgPSAxOworCisJfSBlbHNlIGlmICgoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9ET05FKSB8fAorCQkoKCFody0+aXNfdXNlZF92NGwpICYmIChpbnB1dF9mcmFtZV9iYXNlZCgmdmRlYy0+aW5wdXQpKSAmJiBody0+Y2h1bmspKSB7CisJCWlmICghaHctPmN0eF92YWxpZCkKKwkJCWh3LT5jdHhfdmFsaWQgPSAxOworCisJCXZkZWNfdmZyYW1lX2RpcnR5KHZkZWMsIGh3LT5jaHVuayk7CisJCWh3LT5jaHVuayA9IE5VTEw7CisJfSBlbHNlIGlmIChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0FHQUlOCisJCSYmICh2ZGVjLT5uZXh0X3N0YXR1cyAhPSBWREVDX1NUQVRVU19ESVNDT05ORUNURUQpKSB7CisJCS8qCisJCQlzdHJlYW0gYmFzZTogc3RyZWFtIGJ1ZiBlbXB0eSBvciB0aW1lb3V0CisJCQlmcmFtZSBiYXNlOiB2ZGVjX3ByZXBhcmVfaW5wdXQgZmFpbAorCQkqLworCQlpZiAoIXZkZWNfaGFzX21vcmVfaW5wdXQodmRlYykpIHsKKwkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9FT1M7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSBpZiAoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9GT1JDRV9FWElUKSB7CisJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0VSUk9SLAorCQkJIiVzOiBmb3JjZSBleGl0XG4iLCBfX2Z1bmNfXyk7CisJCWlmIChody0+c3RhdCAmIFNUQVRfSVNSX1JFRykgeworCQkJYW12ZGVjX3N0b3AoKTsKKwkJCXZkZWNfZnJlZV9pcnEoVkRFQ19JUlFfMSwgKHZvaWQgKilodyk7CisJCQlody0+c3RhdCAmPSB+U1RBVF9JU1JfUkVHOworCQl9CisJfSBlbHNlIGlmIChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0VPUykgeworCQlody0+ZW9zID0gMTsKKwkJaWYgKGh3LT5zdGF0ICYgU1RBVF9WREVDX1JVTikgeworCQkJYW12ZGVjX3N0b3AoKTsKKwkJCWh3LT5zdGF0ICY9IH5TVEFUX1ZERUNfUlVOOworCQl9CisJCXZkZWNfdmZyYW1lX2RpcnR5KHZkZWMsIGh3LT5jaHVuayk7CisJCWh3LT5jaHVuayA9IE5VTEw7CisJCXZkZWNfY2xlYW5faW5wdXQodmRlYyk7CisJCWZsdXNoX291dHB1dChodyk7CisKKwkJbm90aWZ5X3Y0bF9lb3ModmRlYyk7CisKKwkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkiJXM6IGVvcyBmbHVzaGVkLCBmcmFtZV9udW0gJWRcbiIsCisJCQlfX2Z1bmNfXywgaHctPmZyYW1lX251bSk7CisJfQorCisJaWYgKGh3LT5zdGF0ICYgU1RBVF9WREVDX1JVTikgeworCQlhbXZkZWNfc3RvcCgpOworCQlody0+c3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwl9CisJLypkaXNhYmxlIG1ib3ggaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfTUFTSywgMCk7CisJZGVsX3RpbWVyX3N5bmMoJmh3LT5jaGVja190aW1lcik7CisJaHctPnN0YXQgJj0gflNUQVRfVElNRVJfQVJNOworCisJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisKKwkJaWYgKGN0eC0+cGFyYW1fc2V0c19mcm9tX3Vjb2RlICYmCisJCQkhaHctPnY0bF9wYXJhbXNfcGFyc2VkKQorCQkJdmRlY192NGxfd3JpdGVfZnJhbWVfc3luYyhjdHgpOworCX0KKworCS8qIG1hcmsgaXRzZWxmIGhhcyBhbGwgSFcgcmVzb3VyY2UgcmVsZWFzZWQgYW5kIGlucHV0IHJlbGVhc2VkICovCisJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKQorCQl2ZGVjX2NvcmVfZmluaXNoX3J1bih2ZGVjLCBDT1JFX01BU0tfVkRFQ18xKTsKKwllbHNlCisJCXZkZWNfY29yZV9maW5pc2hfcnVuKHZkZWMsIENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQyk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmh3LT53YWl0X3EpOworCWlmIChody0+dmRlY19jYikKKwkJaHctPnZkZWNfY2IodmRlYywgaHctPnZkZWNfY2JfYXJnKTsKK30KKworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyAqdm1wZWdfdmZfcGVlayh2b2lkICpvcF9hcmcpCit7CisJc3RydWN0IHZmcmFtZV9zICp2ZjsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gb3BfYXJnOworCXN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKil2ZGVjLT5wcml2YXRlOworCisJaWYgKCFodykKKwkJcmV0dXJuIE5VTEw7CisJaHctPnBlZWtfbnVtKys7CisKKwlpZiAoa2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKSA+IFZGX1BPT0xfU0laRSkgeworCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19SVU5fRkxPVywKKwkJCSJrZmlmbyBsZW46JWQgaW52YWlsZCwgcGVlayBlcnJvclxuIiwKKwkJCWtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoa2ZpZm9fcGVlaygmaHctPmRpc3BsYXlfcSwgJnZmKSkKKwkJcmV0dXJuIHZmOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZtcGVnX3ZmX2dldCh2b2lkICpvcF9hcmcpCit7CisJc3RydWN0IHZmcmFtZV9zICp2ZjsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gb3BfYXJnOworCXN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKil2ZGVjLT5wcml2YXRlOworCWh3LT5nZXRfbnVtKys7CisJaWYgKGtmaWZvX2dldCgmaHctPmRpc3BsYXlfcSwgJnZmKSkgeworCQlBVFJBQ0VfQ09VTlRFUihody0+ZGlzcF9xX25hbWUsIGtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSkpOworCQlyZXR1cm4gdmY7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCB2bXBlZ192Zl9wdXQoc3RydWN0IHZmcmFtZV9zICp2Ziwgdm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBvcF9hcmc7CisJc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqaHcgPSAoc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghdmYpCisJCXJldHVybjsKKworCWh3LT52ZmJ1Zl91c2VbdmYtPmluZGV4XS0tOworCWh3LT5wdXRfbnVtKys7CisJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZSQU1FX05VTSwKKwkJIiVzOiBwdXQgbnVtOiVkXG4iLF9fZnVuY19fLCBody0+cHV0X251bSk7CisJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfQlVGRkVSX0RFVEFJTCwKKwkJImluZGV4PSVkLCB1c2VkPSVkXG4iLCB2Zi0+aW5kZXgsIGh3LT52ZmJ1Zl91c2VbdmYtPmluZGV4XSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5sb2NrLCBmbGFncyk7CisJa2ZpZm9fcHV0KCZody0+bmV3ZnJhbWVfcSwgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+bG9jaywgZmxhZ3MpOworCUFUUkFDRV9DT1VOVEVSKGh3LT5uZXdfcV9uYW1lLCBrZmlmb19sZW4oJmh3LT5uZXdmcmFtZV9xKSk7Cit9CisKK3N0YXRpYyBpbnQgdm1wZWdfZXZlbnRfY2IoaW50IHR5cGUsIHZvaWQgKmRhdGEsIHZvaWQgKm9wX2FyZykKK3sKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gb3BfYXJnOworCisJaWYgKHR5cGUgJiBWRlJBTUVfRVZFTlRfUkVDRUlWRVJfUkVRX1NUQVRFKSB7CisJCXN0cnVjdCBwcm92aWRlcl9zdGF0ZV9yZXFfcyAqcmVxID0KKwkJCShzdHJ1Y3QgcHJvdmlkZXJfc3RhdGVfcmVxX3MgKilkYXRhOworCQlpZiAocmVxLT5yZXFfdHlwZSA9PSBSRVFfU1RBVEVfU0VDVVJFKQorCQkJcmVxLT5yZXFfcmVzdWx0WzBdID0gdmRlY19zZWN1cmUodmRlYyk7CisJCWVsc2UKKwkJCXJlcS0+cmVxX3Jlc3VsdFswXSA9IDB4ZmZmZmZmZmY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgIHZtcGVnX3ZmX3N0YXRlcyhzdHJ1Y3QgdmZyYW1lX3N0YXRlcyAqc3RhdGVzLCB2b2lkICpvcF9hcmcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gb3BfYXJnOworCXN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKil2ZGVjLT5wcml2YXRlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5sb2NrLCBmbGFncyk7CisKKwlzdGF0ZXMtPnZmX3Bvb2xfc2l6ZSA9IFZGX1BPT0xfU0laRTsKKwlzdGF0ZXMtPmJ1Zl9mcmVlX251bSA9IGtmaWZvX2xlbigmaHctPm5ld2ZyYW1lX3EpOworCXN0YXRlcy0+YnVmX2F2YWlsX251bSA9IGtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSk7CisJc3RhdGVzLT5idWZfcmVjeWNsZV9udW0gPSAwOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZGVjX3N0YXR1cyhzdHJ1Y3QgdmRlY19zICp2ZGVjLCBzdHJ1Y3QgdmRlY19pbmZvICp2c3RhdHVzKQoreworCXN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3ID0KKwkJKHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKil2ZGVjLT5wcml2YXRlOworCisJaWYgKCFodykKKwkJcmV0dXJuIC0xOworCisJdnN0YXR1cy0+ZnJhbWVfd2lkdGggPSBody0+ZnJhbWVfd2lkdGg7CisJdnN0YXR1cy0+ZnJhbWVfaGVpZ2h0ID0gaHctPmZyYW1lX2hlaWdodDsKKwlpZiAoMCAhPSBody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUpCisJCXZzdGF0dXMtPmZyYW1lX3JhdGUgPSAoKERVUkFUSU9OX1VOSVQgKiAxMCAvIGh3LT52bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSkgJSAxMCkgPCA1ID8KKwkJRFVSQVRJT05fVU5JVCAvIGh3LT52bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSA6IChEVVJBVElPTl9VTklUIC8gaHctPnZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5yYXRlICsxKTsKKwllbHNlCisJCXZzdGF0dXMtPmZyYW1lX3JhdGUgPSAtMTsKKwl2c3RhdHVzLT5lcnJvcl9jb3VudCA9IFJFQURfVlJFRyhNUDRfRVJSX0NPVU5UKTsKKwl2c3RhdHVzLT5zdGF0dXMgPSBody0+c3RhdDsKKwl2c3RhdHVzLT5mcmFtZV9kdXIgPSBody0+ZnJhbWVfZHVyOworCXZzdGF0dXMtPmVycm9yX2ZyYW1lX2NvdW50ID0gUkVBRF9WUkVHKE1QNF9FUlJfQ09VTlQpOworCXZzdGF0dXMtPmRyb3BfZnJhbWVfY291bnQgPSBody0+ZHJvcF9mcmFtZV9jb3VudDsKKwl2c3RhdHVzLT5mcmFtZV9jb3VudCA9aHctPmZyYW1lX251bTsKKwl2c3RhdHVzLT5pX2RlY29kZWRfZnJhbWVzID0gaHctPmlfZGVjb2RlZF9mcmFtZXM7CisJdnN0YXR1cy0+aV9sb3N0X2ZyYW1lcyA9IGh3LT5pX2xvc3RfZnJhbWVzOworCXZzdGF0dXMtPmlfY29uY2VhbGVkX2ZyYW1lcyA9IGh3LT5pX2NvbmNlYWxlZF9mcmFtZXM7CisJdnN0YXR1cy0+cF9kZWNvZGVkX2ZyYW1lcyA9IGh3LT5wX2RlY29kZWRfZnJhbWVzOworCXZzdGF0dXMtPnBfbG9zdF9mcmFtZXMgPSBody0+cF9sb3N0X2ZyYW1lczsKKwl2c3RhdHVzLT5wX2NvbmNlYWxlZF9mcmFtZXMgPSBody0+cF9jb25jZWFsZWRfZnJhbWVzOworCXZzdGF0dXMtPmJfZGVjb2RlZF9mcmFtZXMgPSBody0+Yl9kZWNvZGVkX2ZyYW1lczsKKwl2c3RhdHVzLT5iX2xvc3RfZnJhbWVzID0gaHctPmJfbG9zdF9mcmFtZXM7CisJdnN0YXR1cy0+Yl9jb25jZWFsZWRfZnJhbWVzID0gaHctPmJfY29uY2VhbGVkX2ZyYW1lczsKKwlzbnByaW50Zih2c3RhdHVzLT52ZGVjX25hbWUsIHNpemVvZih2c3RhdHVzLT52ZGVjX25hbWUpLAorCQkJIiVzIiwgRFJJVkVSX05BTUUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB2bXBlZzRfY2FudmFzX2luaXQoc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqaHcpCit7CisJaW50IGksIHJldDsKKwl1MzIgY2FudmFzX3dpZHRoLCBjYW52YXNfaGVpZ2h0OworCXUzMiBkZWNidWZfc2l6ZSwgZGVjYnVmX3lfc2l6ZTsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisJdW5zaWduZWQgbG9uZyBkZWNidWZfc3RhcnQ7CisKKwlpZiAoYnVmX3NpemUgPD0gMHgwMDQwMDAwMCkgeworCQkJLyogU0Qgb25seSAqLworCQkJY2FudmFzX3dpZHRoID0gNzY4OworCQkJY2FudmFzX2hlaWdodCA9IDU3NjsKKwkJCWRlY2J1Zl95X3NpemUgPSAweDgwMDAwOworCQkJZGVjYnVmX3NpemUgPSAweDEwMDAwMDsKKwl9IGVsc2UgeworCQlpbnQgdyA9IDE5MjA7CisJCWludCBoID0gMTA4ODsKKwkJaW50IGFsaWduX3csIGFsaWduX2g7CisJCWludCBtYXgsIG1pbjsKKworCQlhbGlnbl93ID0gQUxJR04odywgNjQpOworCQlhbGlnbl9oID0gQUxJR04oaCwgNjQpOworCQlpZiAoYWxpZ25fdyA+IGFsaWduX2gpIHsKKwkJCW1heCA9IGFsaWduX3c7CisJCQltaW4gPSBhbGlnbl9oOworCQl9IGVsc2UgeworCQkJbWF4ID0gYWxpZ25faDsKKwkJCW1pbiA9IGFsaWduX3c7CisJCX0KKwkJLyogSEQgJiBTRCAqLworCQlpZiAoKG1heCA+IDE5MjAgfHwgbWluID4gMTA4OCkgJiYKKwkJCUFMSUdOKGFsaWduX3cgKiBhbGlnbl9oICogMy8yLCBTWl82NEspICogOSA8PQorCQkJYnVmX3NpemUpIHsKKwkJCWNhbnZhc193aWR0aCA9IGFsaWduX3c7CisJCQljYW52YXNfaGVpZ2h0ID0gYWxpZ25faDsKKwkJCWRlY2J1Zl95X3NpemUgPQorCQkJCUFMSUdOKGFsaWduX3cgKiBhbGlnbl9oLCBTWl82NEspOworCQkJZGVjYnVmX3NpemUgPQorCQkJCUFMSUdOKGFsaWduX3cgKiBhbGlnbl9oICogMy8yLCBTWl82NEspOworCQl9IGVsc2UgeyAvKjEwODBwKi8KKwkJCWNhbnZhc193aWR0aCA9IDE5MjA7CisJCQljYW52YXNfaGVpZ2h0ID0gMTA4ODsKKwkJCWlmIChody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoIDwgaHctPnZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQgKSB7CisJCQkJY2FudmFzX3dpZHRoID0gMTA4ODsKKwkJCQljYW52YXNfaGVpZ2h0ID0gMTkyMDsKKwkJCX0KKwkJCWRlY2J1Zl95X3NpemUgPSAweDIwMDAwMDsKKwkJCWRlY2J1Zl9zaXplID0gMHgzMDAwMDA7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaHctPmJ1Zl9udW0gKyAxOyBpKyspIHsKKworCQl1bnNpZ25lZCBjYW52YXM7CisKKwkJaWYgKGkgPT0gaHctPmJ1Zl9udW0pCisJCQlkZWNidWZfc2l6ZSA9IFdPUktTUEFDRV9TSVpFOworCisJCWlmIChody0+aXNfdXNlZF92NGwgJiYgIShpID09IGh3LT5idWZfbnVtKSkgeworCQkJY29udGludWU7CisJCX0gZWxzZSB7CisJCQlyZXQgPSBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkoaHctPm1tX2Jsa19oYW5kbGUsIGksCisJCQkJCWRlY2J1Zl9zaXplLCBEUklWRVJfTkFNRSwgJmRlY2J1Zl9zdGFydCk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXByX2VycigiYm1tdSBhbGxvYyBmYWlsZWQhIHNpemUgJWQgIGlkeCAlZFxuIiwKKwkJCQkJZGVjYnVmX3NpemUsIGkpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKworCQlpZiAoIXZkZWNfc2VjdXJlKHZkZWMpKSB7CisJCQkvKmluaXQgaW50ZXJuYWwgYnVmKi8KKwkJCWNoYXIgKnRtcGJ1ZiA9IChjaGFyICopY29kZWNfbW1fcGh5c190b192aXJ0KGRlY2J1Zl9zdGFydCk7CisJCQlpZiAodG1wYnVmKSB7CisJCQkJbWVtc2V0KHRtcGJ1ZiwgMCwgZGVjYnVmX3NpemUpOworCQkJCWNvZGVjX21tX2RtYV9mbHVzaCh0bXBidWYsCisJCQkJCSAgIGRlY2J1Zl9zaXplLCBETUFfVE9fREVWSUNFKTsKKwkJCX0gZWxzZSB7CisJCQkJdG1wYnVmID0gY29kZWNfbW1fdm1hcChkZWNidWZfc3RhcnQsIGRlY2J1Zl9zaXplKTsKKwkJCQlpZiAodG1wYnVmKSB7CisJCQkJCW1lbXNldCh0bXBidWYsIDAsIGRlY2J1Zl9zaXplKTsKKwkJCQkJY29kZWNfbW1fZG1hX2ZsdXNoKHRtcGJ1ZiwKKwkJCQkJCSAgIGRlY2J1Zl9zaXplLCBETUFfVE9fREVWSUNFKTsKKwkJCQkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcih0bXBidWYpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChpID09IGh3LT5idWZfbnVtKSB7CisJCQlody0+YnVmX3N0YXJ0ID0gZGVjYnVmX3N0YXJ0OworCQl9IGVsc2UgeworCQkJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCQkJdW5zaWduZWQgdG1wOworCQkJCWlmIChjYW52YXNfeShody0+Y2FudmFzX3NwZWNbaV0pID09IDB4ZmYpIHsKKwkJCQkJdG1wID0KKwkJCQkJCXZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX1ZERUNfMSwgdmRlYy0+aWQpOworCQkJCQlody0+Y2FudmFzX3NwZWNbaV0gJj0gfjB4ZmY7CisJCQkJCWh3LT5jYW52YXNfc3BlY1tpXSB8PSB0bXA7CisJCQkJfQorCQkJCWlmIChjYW52YXNfdShody0+Y2FudmFzX3NwZWNbaV0pID09IDB4ZmYpIHsKKwkJCQkJdG1wID0KKwkJCQkJCXZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX1ZERUNfMSwgdmRlYy0+aWQpOworCQkJCQlody0+Y2FudmFzX3NwZWNbaV0gJj0gfigweGZmZmYgPDwgOCk7CisJCQkJCWh3LT5jYW52YXNfc3BlY1tpXSB8PSB0bXAgPDwgODsKKwkJCQkJaHctPmNhbnZhc19zcGVjW2ldIHw9IHRtcCA8PCAxNjsKKwkJCQl9CisJCQkJY2FudmFzID0gaHctPmNhbnZhc19zcGVjW2ldOworCQkJfSBlbHNlIHsKKwkJCQljYW52YXMgPSB2ZGVjLT5nZXRfY2FudmFzKGksIDIpOworCQkJCWh3LT5jYW52YXNfc3BlY1tpXSA9IGNhbnZhczsKKwkJCX0KKworCQkJaHctPmNhbnZhc19jb25maWdbaV1bMF0ucGh5X2FkZHIgPSBkZWNidWZfc3RhcnQ7CisJCQlody0+Y2FudmFzX2NvbmZpZ1tpXVswXS53aWR0aCA9IGNhbnZhc193aWR0aDsKKwkJCWh3LT5jYW52YXNfY29uZmlnW2ldWzBdLmhlaWdodCA9IGNhbnZhc19oZWlnaHQ7CisJCQlody0+Y2FudmFzX2NvbmZpZ1tpXVswXS5ibG9ja19tb2RlID0gaHctPmJsa21vZGU7CisJCQlpZiAoaHctPmJsa21vZGUgPT0gQ0FOVkFTX0JMS01PREVfTElORUFSKQorCQkJCWh3LT5jYW52YXNfY29uZmlnW2ldWzBdLmVuZGlhbiA9IDc7CisJCQllbHNlCisJCQkJaHctPmNhbnZhc19jb25maWdbaV1bMF0uZW5kaWFuID0gMDsKKwkJCWNvbmZpZ19jYXZfbHV0KGNhbnZhc195KGNhbnZhcyksCisJCQkJCSZody0+Y2FudmFzX2NvbmZpZ1tpXVswXSwgVkRFQ18xKTsKKworCQkJaHctPmNhbnZhc19jb25maWdbaV1bMV0ucGh5X2FkZHIgPQorCQkJCWRlY2J1Zl9zdGFydCArIGRlY2J1Zl95X3NpemU7CisJCQlody0+Y2FudmFzX2NvbmZpZ1tpXVsxXS53aWR0aCA9IGNhbnZhc193aWR0aDsKKwkJCWh3LT5jYW52YXNfY29uZmlnW2ldWzFdLmhlaWdodCA9IChjYW52YXNfaGVpZ2h0ID4+IDEpOworCQkJaHctPmNhbnZhc19jb25maWdbaV1bMV0uYmxvY2tfbW9kZSA9IGh3LT5ibGttb2RlOworCQkJaWYgKGh3LT5ibGttb2RlID09IENBTlZBU19CTEtNT0RFX0xJTkVBUikKKwkJCQlody0+Y2FudmFzX2NvbmZpZ1tpXVsxXS5lbmRpYW4gPSA3OworCQkJZWxzZQorCQkJCWh3LT5jYW52YXNfY29uZmlnW2ldWzFdLmVuZGlhbiA9IDA7CisJCQljb25maWdfY2F2X2x1dChjYW52YXNfdShjYW52YXMpLAorCQkJCQkmaHctPmNhbnZhc19jb25maWdbaV1bMV0sIFZERUNfMSk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdm1wZWc0X2R1bXBfc3RhdGUoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodyA9CisJCShzdHJ1Y3QgdmRlY19tcGVnNF9od19zICopKHZkZWMtPnByaXZhdGUpOworCXUzMiBpOworCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiPT09PT09ICVzXG4iLCBfX2Z1bmNfXyk7CisJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSJ3aWR0aC9oZWlnaHQgKCVkLyVkKSwgaV9mcmFtOiVkLCBidWZmZXJfbm90X3JlYWR5ICVkLCBidWZfbnVtICVkLCBydW5fZmxhZyAlZFxuIiwKKwkJaHctPmZyYW1lX3dpZHRoLAorCQlody0+ZnJhbWVfaGVpZ2h0LAorCQlody0+Zmlyc3RfaV9mcmFtZV9yZWFkeSwKKwkJaHctPmJ1ZmZlcl9ub3RfcmVhZHksCisJCWh3LT5idWZfbnVtLAorCQlody0+cnVuX2ZsYWcKKwkJKTsKKwlmb3IgKGkgPSAwOyBpIDwgaHctPmJ1Zl9udW07IGkrKykgeworCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSJpbmRleCAlZCwgdXNlZCAlZFxuIiwgaSwgaHctPnZmYnVmX3VzZVtpXSk7CisJfQorCisJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSJpc19mcmFtZWJhc2UoJWQpLCBlb3MgJWQsIHN0YXRlIDB4JXgsIGRlY19yZXN1bHQgMHgleCBkZWNfZnJtICVkXG4iLAorCQl2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpLAorCQlody0+ZW9zLAorCQlody0+c3RhdCwKKwkJaHctPmRlY19yZXN1bHQsCisJCWh3LT5mcmFtZV9udW0KKwkJKTsKKwltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJImlzX2ZyYW1lYmFzZSglZCksICBwdXRfZnJtICVkIHJ1biAlZCBub3RfcnVuX3JlYWR5ICVkIGlucHV0X2VtcHR5ICVkLGRyb3AgJWRcbiIsCisJCXZkZWNfZnJhbWVfYmFzZWQodmRlYyksCisJCWh3LT5wdXRfbnVtLAorCQlody0+cnVuX2NvdW50LAorCQlody0+bm90X3J1bl9yZWFkeSwKKwkJaHctPmlucHV0X2VtcHR5LAorCQlody0+ZHJvcF9mcmFtZV9jb3VudAorCQkpOworCisJaWYgKCFody0+aXNfdXNlZF92NGwgJiYgdmZfZ2V0X3JlY2VpdmVyKHZkZWMtPnZmX3Byb3ZpZGVyX25hbWUpKSB7CisJCWVudW0gcmVjZXZpdmVyX3N0YXJ0X2Ugc3RhdGUgPQorCQl2Zl9ub3RpZnlfcmVjZWl2ZXIodmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9RVVJFWV9TVEFURSwKKwkJCU5VTEwpOworCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSJcbnJlY2VpdmVyKCVzKSBzdGF0ZSAlZFxuIiwKKwkJCXZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQlzdGF0ZSk7CisJfQorCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiJXMsIG5ld3EoJWQvJWQpLCBkaXNwcSglZC8lZCkgdmYgcGVlay9nZXQvcHV0ICglZC8lZC8lZClcbiIsCisJCV9fZnVuY19fLAorCQlrZmlmb19sZW4oJmh3LT5uZXdmcmFtZV9xKSwgVkZfUE9PTF9TSVpFLAorCQlrZmlmb19sZW4oJmh3LT5kaXNwbGF5X3EpLCBWRl9QT09MX1NJWkUsCisJCWh3LT5wZWVrX251bSwgaHctPmdldF9udW0sIGh3LT5wdXRfbnVtCisJKTsKKwltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIlZJRkZfQklUX0NOVD0weCV4XG4iLAorCQlSRUFEX1ZSRUcoVklGRl9CSVRfQ05UKSk7CisJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSJWTERfTUVNX1ZJRklGT19MRVZFTD0weCV4XG4iLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpKTsKKwltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIlZMRF9NRU1fVklGSUZPX1dQPTB4JXhcbiIsCisJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19XUCkpOworCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiVkxEX01FTV9WSUZJRk9fUlA9MHgleFxuIiwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSk7CisJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSJQQVJTRVJfVklERU9fUlA9MHgleFxuIiwKKwkJU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3JwKSk7CisJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSJQQVJTRVJfVklERU9fV1A9MHgleFxuIiwKKwkJU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3dwKSk7CisKKwlpZiAodmRlY19mcmFtZV9iYXNlZCh2ZGVjKSAmJgorCQlkZWJ1Z19lbmFibGUgJiBQUklOVF9GUkFNRUJBU0VfREFUQSkgeworCQlpbnQgamo7CisJCWlmIChody0+Y2h1bmsgJiYgaHctPmNodW5rLT5ibG9jayAmJgorCQkJaHctPmNodW5rLT5zaXplID4gMCkgeworCQkJdTggKmRhdGEgPSBOVUxMOworCisJCQlpZiAoIWh3LT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJCQlkYXRhID0gY29kZWNfbW1fdm1hcChody0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQkJCWh3LT5jaHVuay0+b2Zmc2V0LCBody0+Y2h1bmstPnNpemUpOworCQkJZWxzZQorCQkJCWRhdGEgPSAoKHU4ICopaHctPmNodW5rLT5ibG9jay0+c3RhcnRfdmlydCkgKworCQkJCQlody0+Y2h1bmstPm9mZnNldDsKKworCQkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkJImZyYW1lIGRhdGEgc2l6ZSAweCV4XG4iLAorCQkJCWh3LT5jaHVuay0+c2l6ZSk7CisJCQlmb3IgKGpqID0gMDsgamogPCBody0+Y2h1bmstPnNpemU7IGpqKyspIHsKKwkJCQlpZiAoKGpqICYgMHhmKSA9PSAwKQorCQkJCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCQkJUFJJTlRfRlJBTUVCQVNFX0RBVEEsCisJCQkJCQkiJTA2eDoiLCBqaik7CisJCQkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJUFJJTlRfRlJBTUVCQVNFX0RBVEEsCisJCQkJCSIlMDJ4ICIsIGRhdGFbampdKTsKKwkJCQlpZiAoKChqaiArIDEpICYgMHhmKSA9PSAwKQorCQkJCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCQkJUFJJTlRfRlJBTUVCQVNFX0RBVEEsCisJCQkJCQkiXG4iKTsKKwkJCX0KKworCQkJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcihkYXRhKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcmVzZXRfcHJvY2Vzc190aW1lKHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3KQoreworCWlmIChody0+c3RhcnRfcHJvY2Vzc190aW1lKSB7CisJCXVuc2lnbmVkIHByb2Nlc3NfdGltZSA9CisJCQkxMDAwICogKGppZmZpZXMgLSBody0+c3RhcnRfcHJvY2Vzc190aW1lKSAvIEhaOworCQlody0+c3RhcnRfcHJvY2Vzc190aW1lID0gMDsKKwkJaWYgKHByb2Nlc3NfdGltZSA+IG1heF9wcm9jZXNzX3RpbWVbREVDT0RFX0lEKGh3KV0pCisJCQltYXhfcHJvY2Vzc190aW1lW0RFQ09ERV9JRChodyldID0gcHJvY2Vzc190aW1lOworCX0KK30KK3N0YXRpYyB2b2lkIHN0YXJ0X3Byb2Nlc3NfdGltZShzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodykKK3sKKwlody0+ZGVjb2RlX3RpbWVvdXRfY291bnQgPSAyOworCWh3LT5zdGFydF9wcm9jZXNzX3RpbWUgPSBqaWZmaWVzOworfQorCitzdGF0aWMgdm9pZCB0aW1lb3V0X3Byb2Nlc3Moc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqaHcpCit7CisJaWYgKGh3LT5zdGF0ICYgU1RBVF9WREVDX1JVTikgeworCQlhbXZkZWNfc3RvcCgpOworCQlody0+c3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwl9CisJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSIlcyBkZWNvZGVyIHRpbWVvdXQgJWRcbiIsIF9fZnVuY19fLCBody0+dGltZW91dF9jbnQpOworCWlmICh2ZGVjX2ZyYW1lX2Jhc2VkKChod190b192ZGVjKGh3KSkpKSB7CisJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJIiVzIGZyYW1lX251bSAlZCwgY2h1bmsgc2l6ZSAweCV4LCBjaGtzdW0gMHgleFxuIiwKKwkJCV9fZnVuY19fLAorCQkJaHctPmZyYW1lX251bSwKKwkJCWh3LT5jaHVuay0+c2l6ZSwKKwkJCWdldF9kYXRhX2NoZWNrX3N1bShodywgaHctPmNodW5rLT5zaXplKSk7CisJfQorCWh3LT50aW1lb3V0X2NudCsrOworCS8qIHRpbWVvdXQ6IGRhdGEgZHJvcGVkLCBmcmFtZV9udW0gaW5hY2N1cmF0ZSovCisJaHctPmZyYW1lX251bSsrOworCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisJaHctPmZpcnN0X2lfZnJhbWVfcmVhZHkgPSAwOworCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworfQorCisKK3N0YXRpYyB2b2lkIGNoZWNrX3RpbWVyX2Z1bmMoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworCXN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3ID0gY29udGFpbmVyX29mKHRpbWVyLAorCQlzdHJ1Y3QgdmRlY19tcGVnNF9od19zLCBjaGVja190aW1lcik7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaHcpOworCXVuc2lnbmVkIGludCB0aW1lb3V0X3ZhbCA9IGRlY29kZV90aW1lb3V0X3ZhbDsKKworCWlmIChyYWRyICE9IDApIHsKKwkJaWYgKHJ2YWwgIT0gMCkgeworCQkJV1JJVEVfVlJFRyhyYWRyLCBydmFsKTsKKwkJCXByX2luZm8oIldSSVRFX1ZSRUcoJXgsJXgpXG4iLCByYWRyLCBydmFsKTsKKwkJfSBlbHNlCisJCQlwcl9pbmZvKCJSRUFEX1ZSRUcoJXgpPSV4XG4iLCByYWRyLCBSRUFEX1ZSRUcocmFkcikpOworCQlydmFsID0gMDsKKwkJcmFkciA9IDA7CisJfQorCisJaWYgKCgoZGVidWdfZW5hYmxlICYgUFJJTlRfRkxBR19USU1FT1VUX1NUQVRVUykgPT0gMCkgJiYKKwkJKHRpbWVvdXRfdmFsID4gMCkgJiYKKwkJKGh3LT5zdGFydF9wcm9jZXNzX3RpbWUgPiAwKSAmJgorCQkoKDEwMDAgKiAoamlmZmllcyAtIGh3LT5zdGFydF9wcm9jZXNzX3RpbWUpIC8gSFopCisJCQk+IHRpbWVvdXRfdmFsKSkgeworCQlpZiAoaHctPmxhc3RfdmxkX2xldmVsID09IFJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCkpIHsKKwkJCWlmIChody0+ZGVjb2RlX3RpbWVvdXRfY291bnQgPiAwKQorCQkJCWh3LT5kZWNvZGVfdGltZW91dF9jb3VudC0tOworCQkJaWYgKGh3LT5kZWNvZGVfdGltZW91dF9jb3VudCA9PSAwKQorCQkJCXRpbWVvdXRfcHJvY2Vzcyhodyk7CisJCX0KKwkJaHctPmxhc3RfdmxkX2xldmVsID0gUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKTsKKwl9CisKKwlpZiAodmRlYy0+bmV4dF9zdGF0dXMgPT0gVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEKSB7CisJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0VSUk9SLAorCQkJInZkZWMgcmVxdWVzdGVkIHRvIGJlIGRpc2Nvbm5lY3RlZFxuIik7CisJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9GT1JDRV9FWElUOworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJcmV0dXJuOworCX0KKworCW1vZF90aW1lcigmaHctPmNoZWNrX3RpbWVyLCBqaWZmaWVzICsgQ0hFQ0tfSU5URVJWQUwpOworfQorCitzdGF0aWMgaW50IHZtcGVnNF9od19jdHhfcmVzdG9yZShzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodykKK3sKKwlpbnQgaW5kZXgsIGk7CisJdm9pZCAqd29ya3NwYWNlX2J1ZiA9IE5VTEw7CisKKwlpbmRleCA9IGZpbmRfZnJlZV9idWZmZXIoaHcpOworCWlmIChpbmRleCA8IDApCisJCXJldHVybiAtMTsKKworCWlmICghaHctPmluaXRfZmxhZykgeworCQlpZiAodm1wZWc0X2NhbnZhc19pbml0KGh3KSA8IDApCisJCQlyZXR1cm4gLTE7CisJfSBlbHNlIHsKKwkJaWYgKCFody0+aXNfdXNlZF92NGwpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBody0+YnVmX251bTsgaSsrKSB7CisJCQkJY29uZmlnX2Nhdl9sdXQoY2FudmFzX3koaHctPmNhbnZhc19zcGVjW2ldKSwKKwkJCQkJCQkmaHctPmNhbnZhc19jb25maWdbaV1bMF0sIFZERUNfMSk7CisJCQkJY29uZmlnX2Nhdl9sdXQoY2FudmFzX3UoaHctPmNhbnZhc19zcGVjW2ldKSwKKwkJCQkJCQkmaHctPmNhbnZhc19jb25maWdbaV1bMV0sIFZERUNfMSk7CisJCQl9CisJCX0KKwl9CisJLyogcHJlcGFyZSBSRUYwICYgUkVGMQorCSAqIHBvaW50cyB0byB0aGUgcGFzdCB0d28gSVAgYnVmZmVycworCSAqIHByZXBhcmUgUkVDX0NBTlZBU19BRERSIGFuZCBBTkMyX0NBTlZBU19BRERSCisJICogcG9pbnRzIHRvIHRoZSBvdXRwdXQgYnVmZmVyCisJICovCisJaWYgKGh3LT5yZWZzWzBdID09IC0xKSB7CisJCVdSSVRFX1ZSRUcoTVJFR19SRUYwLCAoaHctPnJlZnNbMV0gPT0gLTEpID8gMHhmZmZmZmZmZiA6CisJCQkJCWh3LT5jYW52YXNfc3BlY1tody0+cmVmc1sxXV0pOworCX0gZWxzZSB7CisJCVdSSVRFX1ZSRUcoTVJFR19SRUYwLCBody0+Y2FudmFzX3NwZWNbaHctPnJlZnNbMF1dKTsKKwl9CisJV1JJVEVfVlJFRyhNUkVHX1JFRjEsIChody0+cmVmc1sxXSA9PSAtMSkgPyAweGZmZmZmZmZmIDoKKwkJCQlody0+Y2FudmFzX3NwZWNbaHctPnJlZnNbMV1dKTsKKwlpZiAoKGh3LT5pc191c2VkX3Y0bCkgJiYgKGluZGV4ID09IDB4ZmZmZmZmKSkgeworCQlXUklURV9WUkVHKFJFQ19DQU5WQVNfQUREUiwgMHhmZmZmZmYpOworCQlXUklURV9WUkVHKEFOQzJfQ0FOVkFTX0FERFIsIDB4ZmZmZmZmKTsKKwl9IGVsc2UgeworCQlXUklURV9WUkVHKFJFQ19DQU5WQVNfQUREUiwgaHctPmNhbnZhc19zcGVjW2luZGV4XSk7CisJCVdSSVRFX1ZSRUcoQU5DMl9DQU5WQVNfQUREUiwgaHctPmNhbnZhc19zcGVjW2luZGV4XSk7CisJfQorCisJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfUkVTVE9SRSwKKwkicmVzdG9yZSByZWYwPTB4JXgsIHJlZjE9MHgleCwgcmVjPTB4JXgsIGN0eF92YWxpZD0lZCxpbmRleD0lZFxuIiwKKwkgICBSRUFEX1ZSRUcoTVJFR19SRUYwKSwKKwkgICBSRUFEX1ZSRUcoTVJFR19SRUYxKSwKKwkgICBSRUFEX1ZSRUcoUkVDX0NBTlZBU19BRERSKSwKKwkgICBody0+Y3R4X3ZhbGlkLCBpbmRleCk7CisKKwkvKiBub3RpZnkgdWNvZGUgdGhlIGJ1ZmZlciBzdGFydCBhZGRyZXNzICovCisJd29ya3NwYWNlX2J1ZiA9IGNvZGVjX21tX3ZtYXAoaHctPmJ1Zl9zdGFydCwgV09SS1NQQUNFX1NJWkUpOworCWlmICh3b3Jrc3BhY2VfYnVmKSB7CisJCS8qIGNsZWFyIHRvIGZpeCBkZWNvZGVyIHRpbWVvdXQgYXQgZmlyc3QgdGltZSAqLworCQlpZiAoIWh3LT5pbml0X2ZsYWcpCisJCQltZW1zZXQod29ya3NwYWNlX2J1ZiwgMCwgV09SS1NQQUNFX1NJWkUpOworCQljb2RlY19tbV9kbWFfZmx1c2god29ya3NwYWNlX2J1ZiwKKwkJCVdPUktTUEFDRV9TSVpFLCBETUFfVE9fREVWSUNFKTsKKwkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcih3b3Jrc3BhY2VfYnVmKTsKKwl9CisJV1JJVEVfVlJFRyhNRU1fT0ZGU0VUX1JFRywgaHctPmJ1Zl9zdGFydCk7CisKKwkvKiBkaXNhYmxlIFBTQ0FMRSBmb3IgaGFyZHdhcmUgc2hhcmluZyAqLworCVdSSVRFX1ZSRUcoUFNDQUxFX0NUUkwsIDApOworCisJV1JJVEVfVlJFRyhNUkVHX0JVRkZFUk9VVCwgMHgxMDAwMCk7CisKKwkvKiBjbGVhciBtYWlsYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoQVNTSVNUX01CT1gxX0NMUl9SRUcsIDEpOworCisJLyogZW5hYmxlIG1haWxib3ggaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfTUFTSywgMSk7CisKKwkvKiBjbGVhciByZXBlYXQgY291bnQgKi8KKwlXUklURV9WUkVHKE1QNF9OT1RfQ09ERURfQ05ULCAwKTsKKworI2lmZGVmIE5WMjEKKwlTRVRfVlJFR19NQVNLKE1ERUNfUElDX0RDX0NUUkwsIDEgPDwgMTcpOworI2VuZGlmCisKKyNpZiAxLyogL01FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09OOCAqLworCVdSSVRFX1ZSRUcoTURFQ19QSUNfRENfVEhSRVNILCAweDQwNDAzOGFhKTsKKyNlbmRpZgorCisJV1JJVEVfVlJFRyhNUDRfUElDX1dILCAoaHctPmN0eF92YWxpZCkgPworCQlody0+cmVnX21wNF9waWNfd2ggOgorCQkoKGh3LT5mcmFtZV93aWR0aCA8PCAxNikgfCBody0+ZnJhbWVfaGVpZ2h0KSk7CisJV1JJVEVfVlJFRyhNUDRfU1lTX1JBVEUsIGh3LT52bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSk7CisKKwlpZiAoaHctPmN0eF92YWxpZCkgeworCQlXUklURV9WUkVHKERDX0FDX0NUUkwsIGh3LT5yZWdfZGNfYWNfY3RybCk7CisJCVdSSVRFX1ZSRUcoSVFJRENUX0NPTlRST0wsIGh3LT5yZWdfaXFpZGN0X2NvbnRyb2wpOworCQlXUklURV9WUkVHKFJFU1lOQ19NQVJLRVJfTEVOR1RILCBody0+cmVnX3Jlc3luY19tYXJrZXJfbGVuZ3RoKTsKKwkJV1JJVEVfVlJFRyhSVl9BSV9NQl9DT1VOVCwgaHctPnJlZ19ydl9haV9tYl9jb3VudCk7CisJfQorCVdSSVRFX1ZSRUcoTVBFRzFfMl9SRUcsIChody0+Y3R4X3ZhbGlkKSA/IGh3LT5yZWdfbXBlZzFfMl9yZWcgOiAxKTsKKwlXUklURV9WUkVHKFZDT1BfQ1RSTF9SRUcsIGh3LT5yZWdfdmNvcF9jdHJsX3JlZyk7CisJV1JJVEVfVlJFRyhQSUNfSEVBRF9JTkZPLCBody0+cmVnX3BpY19oZWFkX2luZm8pOworCVdSSVRFX1ZSRUcoU0xJQ0VfUVAsIGh3LT5yZWdfc2xpY2VfcXApOworCVdSSVRFX1ZSRUcoTUJfSU5GTywgaHctPnJlZ19tYl9pbmZvKTsKKworCWlmICh2ZGVjX2ZyYW1lX2Jhc2VkKGh3X3RvX3ZkZWMoaHcpKSAmJiBody0+Y2h1bmspIHsKKwkJLyogZnJhbWUgYmFzZWQgaW5wdXQgKi8KKwkJV1JJVEVfVlJFRyhNUkVHX0lOUFVULCAoaHctPmNodW5rLT5vZmZzZXQgJiA3KSB8ICgxPDw3KSB8CisJCQkJCQkJKGh3LT5jdHhfdmFsaWQ8PDYpKTsKKwl9IGVsc2UgeworCQkvKiBzdHJlYW0gYmFzZWQgaW5wdXQgKi8KKwkJV1JJVEVfVlJFRyhNUkVHX0lOUFVULCAoaHctPmN0eF92YWxpZDw8NikpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2bXBlZzRfbG9jYWxfaW5pdChzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodykKK3sKKwlpbnQgaTsKKworCWh3LT52bXBlZzRfcmF0aW8gPSBody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGlvOworCisJaHctPnZtcGVnNF9yYXRpbzY0ID0gaHctPnZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5yYXRpbzY0OworCisJaHctPnZtcGVnNF9yb3RhdGlvbiA9CisJCSgoKHVuc2lnbmVkIGxvbmcpaHctPnZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5wYXJhbSkgPj4gMTYpICYgMHhmZmZmOworCWh3LT5zeXNfbXA0X3JhdGUgPSBody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGU7CisJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQlody0+ZnJhbWVfd2lkdGggPSAwOworCQlody0+ZnJhbWVfaGVpZ2h0ID0gMDsKKwl9IGVsc2UgeworCQlody0+ZnJhbWVfd2lkdGggPSBody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoOworCQlody0+ZnJhbWVfaGVpZ2h0ID0gaHctPnZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQ7CisJfQorCisJaHctPmZyYW1lX2R1ciA9IDA7CisJaHctPmZyYW1lX3Byb2cgPSAwOworCWh3LT51bnN0YWJsZV9wdHMgPQorCSAgICgoKHVuc2lnbmVkIGxvbmcpIGh3LT52bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8ucGFyYW0gJiAweDQwKSA+PiA2KTsKKwltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJInBhcmFtID0gMHgleCB1bnN0YWJsZV9wdHMgPSAlZFxuIiwKKwkJaHctPnZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5wYXJhbSwKKwkJaHctPnVuc3RhYmxlX3B0cyk7CisJaHctPmxhc3RfZGVjX3B0cyA9IC0xOworCisJaHctPnRvdGFsX2ZyYW1lID0gMDsKKworCWh3LT5sYXN0X2FuY2hfcHRzID0gMDsKKworCWh3LT5sYXN0X2FuY2hfcHRzX3VzNjQgPSAwOworCisJaHctPmxhc3Rfdm9wX3RpbWVfaW5jID0gaHctPmxhc3RfZHVyYXRpb24gPSAwOworCisJaHctPnZvcF90aW1lX2luY19zaW5jZV9sYXN0X2FuY2ggPSAwOworCWh3LT5sYXN0X3B0cyA9IDA7CisJaHctPmxhc3RfcHRzNjQgPSAwOworCWh3LT5mcmFtZV9udW1fc2luY2VfbGFzdF9hbmNoID0gMDsKKwlody0+ZnJhbWVfbnVtID0gMDsKKwlody0+cHV0X251bSA9IDA7CisJaHctPnJ1bl9jb3VudCA9IDA7CisJaHctPm5vdF9ydW5fcmVhZHkgPSAwOworCWh3LT5pbnB1dF9lbXB0eSA9IDA7CisJaHctPnBlZWtfbnVtID0gMDsKKwlody0+Z2V0X251bSA9IDA7CisKKwlody0+cHRzX2hpdCA9IGh3LT5wdHNfbWlzc2VkID0gaHctPnB0c19pX2hpdCA9IGh3LT5wdHNfaV9taXNzZWQgPSAwOworCWh3LT5yZWZzWzBdID0gLTE7CisJaHctPnJlZnNbMV0gPSAtMTsKKwlody0+Zmlyc3RfaV9mcmFtZV9yZWFkeSA9IDA7CisJaHctPmRyb3BfZnJhbWVfY291bnQgPSAwOworCWh3LT5idWZmZXJfbm90X3JlYWR5ID0gMDsKKwlody0+aW5pdF9mbGFnID0gMDsKKwlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfTk9ORTsKKwlody0+dGltZW91dF9jbnQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IERFQ09ERV9CVUZGRVJfTlVNX01BWDsgaSsrKQorCQlody0+dmZidWZfdXNlW2ldID0gMDsKKworCUlOSVRfS0ZJRk8oaHctPmRpc3BsYXlfcSk7CisJSU5JVF9LRklGTyhody0+bmV3ZnJhbWVfcSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVkZfUE9PTF9TSVpFOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IHZmcmFtZV9zICp2ZiA9ICZody0+dmZwb29sW2ldOworCisJCWh3LT52ZnBvb2xbaV0uaW5kZXggPSBERUNPREVfQlVGRkVSX05VTV9NQVg7CisJCWtmaWZvX3B1dCgmaHctPm5ld2ZyYW1lX3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJfQorCWlmIChody0+bW1fYmxrX2hhbmRsZSkgeworCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWUoaHctPm1tX2Jsa19oYW5kbGUpOworCQlody0+bW1fYmxrX2hhbmRsZSA9IE5VTEw7CisJfQorCWh3LT5tbV9ibGtfaGFuZGxlID0gZGVjb2Rlcl9ibW11X2JveF9hbGxvY19ib3goCisJCQlEUklWRVJfTkFNRSwKKwkJCTAsCisJCQlNQVhfQk1NVV9CVUZGRVJfTlVNLAorCQkJNCArIFBBR0VfU0hJRlQsCisJCQlDT0RFQ19NTV9GTEFHU19DTUFfQ0xFQVIgfAorCQkJQ09ERUNfTU1fRkxBR1NfRk9SX1ZERUNPREVSKTsKKwlJTklUX1dPUksoJmh3LT53b3JrLCB2bXBlZzRfd29yayk7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZody0+d2FpdF9xKTsKK30KKworc3RhdGljIHMzMiB2bW1wZWc0X2luaXQoc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqaHcpCit7CisJaW50IHRyaWNrbW9kZV9mZmZiID0gMDsKKwlpbnQgc2l6ZSA9IC0xLCBmd19zaXplID0gMHgxMDAwICogMTY7CisJc3RydWN0IGZpcm13YXJlX3MgKmZ3ID0gTlVMTDsKKworCWZ3ID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IGZpcm13YXJlX3MpICsgZndfc2l6ZSk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGZ3KSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoaHctPnZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5mb3JtYXQgPT0KKwkJCVZJREVPX0RFQ19GT1JNQVRfTVBFRzRfNSkgeworCQlzaXplID0gZ2V0X2Zpcm13YXJlX2RhdGEoVklERU9fREVDX01QRUc0XzVfTVVMVEksIGZ3LT5kYXRhKTsKKwkJc3RybmNweShmdy0+bmFtZSwgIm1tcGVnNF9tY181Iiwgc2l6ZW9mKGZ3LT5uYW1lKSk7CisJfSBlbHNlIGlmIChody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLmZvcm1hdCA9PQorCQkJVklERU9fREVDX0ZPUk1BVF9IMjYzKSB7CisJCXNpemUgPSBnZXRfZmlybXdhcmVfZGF0YShWSURFT19ERUNfSDI2M19NVUxUSSwgZnctPmRhdGEpOworCQlzdHJuY3B5KGZ3LT5uYW1lLCAibWgyNjNfbWMiLCBzaXplb2YoZnctPm5hbWUpKTsKKwl9IGVsc2UKKwkJcHJfZXJyKCJ1bnN1cHBvcnQgbXBlZzQgc3ViIGZvcm1hdCAlZFxuIiwKKwkJCQlody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLmZvcm1hdCk7CisJcHJfaW5mbygibW1wZWc0IGdldCBmdyAlcywgc2l6ZSAleFxuIiwgZnctPm5hbWUsIHNpemUpOworCWlmIChzaXplIDwgMCkgeworCQlwcl9lcnIoImdldCBmaXJtd2FyZSBmYWlsZWQuIik7CisJCXZmcmVlKGZ3KTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZ3LT5sZW4gPSBzaXplOworCWh3LT5mdyA9IGZ3OworCisJcXVlcnlfdmlkZW9fc3RhdHVzKDAsICZ0cmlja21vZGVfZmZmYik7CisKKwlwcl9pbmZvKCIlc1xuIiwgX19mdW5jX18pOworCisJLy9hbXZkZWNfZW5hYmxlKCk7CisKKwl0aW1lcl9zZXR1cCgmaHctPmNoZWNrX3RpbWVyLCBjaGVja190aW1lcl9mdW5jLCAwKTsKKwkvL2luaXRfdGltZXIoJmh3LT5jaGVja190aW1lcik7CisJLy9ody0+Y2hlY2tfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWh3OworCS8vaHctPmNoZWNrX3RpbWVyLmZ1bmN0aW9uID0gY2hlY2tfdGltZXJfZnVuYzsKKwlody0+Y2hlY2tfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBDSEVDS19JTlRFUlZBTDsKKwlody0+c3RhdCB8PSBTVEFUX1RJTUVSX0FSTTsKKwlody0+ZW9zID0gMDsKKwlXUklURV9WUkVHKERFQ09ERV9TVE9QX1BPUywgdWRlYnVnX2ZsYWcpOworCisJdm1wZWc0X2xvY2FsX2luaXQoaHcpOworCXdtYigpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJ1bl9yZWFkeShzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1bnNpZ25lZCBsb25nIG1hc2spCit7CisJc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqaHcgPSAoc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJaWYgKGh3LT5lb3MpCisJCXJldHVybiAwOworCWlmICh2ZGVjX3N0cmVhbV9iYXNlZCh2ZGVjKSAmJiAoaHctPmluaXRfZmxhZyA9PSAwKQorCQkmJiBwcmVfZGVjb2RlX2J1Zl9sZXZlbCAhPSAwKSB7CisJCXUzMiBycCwgd3AsIGxldmVsOworCisJCXJwID0gU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3JwKTsKKwkJd3AgPSBTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApOworCQlpZiAod3AgPCBycCkKKwkJCWxldmVsID0gdmRlYy0+aW5wdXQuc2l6ZSArIHdwIC0gcnA7CisJCWVsc2UKKwkJCWxldmVsID0gd3AgLSBycDsKKwkJaWYgKGxldmVsIDwgcHJlX2RlY29kZV9idWZfbGV2ZWwpIHsKKwkJCWh3LT5ub3RfcnVuX3JlYWR5Kys7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShody0+djRsMl9jdHgpOworCisJCWlmIChjdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSkgeworCQkJaWYgKGh3LT52NGxfcGFyYW1zX3BhcnNlZCkgeworCQkJCWlmICghY3R4LT52NGxfY29kZWNfZHBiX3JlYWR5ICYmCisJCQkJCXY0bDJfbTJtX251bV9kc3RfYnVmc19yZWFkeShjdHgtPm0ybV9jdHgpIDwKKwkJCQkJcnVuX3JlYWR5X21pbl9idWZfbnVtKQorCQkJCQlyZXR1cm4gMDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGN0eC0+djRsX3Jlc29sdXRpb25fY2hhbmdlKQorCQkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfSBlbHNlIGlmICghY3R4LT52NGxfY29kZWNfZHBiX3JlYWR5KSB7CisJCQlpZiAodjRsMl9tMm1fbnVtX2RzdF9idWZzX3JlYWR5KGN0eC0+bTJtX2N0eCkgPAorCQkJCXJ1bl9yZWFkeV9taW5fYnVmX251bSkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmICghaXNfZW5vdWdoX2ZyZWVfYnVmZmVyKGh3KSkgeworCQlody0+YnVmZmVyX25vdF9yZWFkeSsrOworCQlyZXR1cm4gMDsKKwl9CisKKwlody0+bm90X3J1bl9yZWFkeSA9IDA7CisJaHctPmJ1ZmZlcl9ub3RfcmVhZHkgPSAwOworCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkKKwkJcmV0dXJuICh1bnNpZ25lZCBsb25nKShDT1JFX01BU0tfVkRFQ18xKTsKKwllbHNlCisJCXJldHVybiAodW5zaWduZWQgbG9uZykoQ09SRV9NQVNLX1ZERUNfMSB8IENPUkVfTUFTS19IRVZDKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgZ2V0X2RhdGFfY2hlY2tfc3VtCisJKHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3LCBpbnQgc2l6ZSkKK3sKKwlpbnQgamo7CisJaW50IHN1bSA9IDA7CisJdTggKmRhdGEgPSBOVUxMOworCisJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCWRhdGEgPSBjb2RlY19tbV92bWFwKGh3LT5jaHVuay0+YmxvY2stPnN0YXJ0ICsKKwkJCWh3LT5jaHVuay0+b2Zmc2V0LCBzaXplKTsKKwllbHNlCisJCWRhdGEgPSAoKHU4ICopaHctPmNodW5rLT5ibG9jay0+c3RhcnRfdmlydCkgKworCQkJaHctPmNodW5rLT5vZmZzZXQ7CisKKwlmb3IgKGpqID0gMDsgamogPCBzaXplOyBqaisrKQorCQlzdW0gKz0gZGF0YVtqal07CisKKwlpZiAoIWh3LT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcihkYXRhKTsKKwlyZXR1cm4gc3VtOworfQorCitzdGF0aWMgdm9pZCBydW4oc3RydWN0IHZkZWNfcyAqdmRlYywgdW5zaWduZWQgbG9uZyBtYXNrLAorCQl2b2lkICgqY2FsbGJhY2spKHN0cnVjdCB2ZGVjX3MgKiwgdm9pZCAqKSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKil2ZGVjLT5wcml2YXRlOworCWludCBzaXplID0gMCwgcmV0ID0gMDsKKworCWh3LT5ydW5fZmxhZyA9IDE7CisJaWYgKCFody0+dmRlY19wZ19lbmFibGVfZmxhZykgeworCQlody0+dmRlY19wZ19lbmFibGVfZmxhZyA9IDE7CisJCWFtdmRlY19lbmFibGUoKTsKKwl9CisJaHctPnJ1bl9jb3VudCsrOworCWh3LT52ZGVjX2NiX2FyZyA9IGFyZzsKKwlody0+dmRlY19jYiA9IGNhbGxiYWNrOworCXZkZWNfcmVzZXRfY29yZSh2ZGVjKTsKKworCWlmICgodmRlY19mcmFtZV9iYXNlZCh2ZGVjKSkgJiYKKwkJKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfVU5GSU5JU0gpKSB7CisJCXZtcGVnNF9wcmVwYXJlX2lucHV0KGh3KTsKKwkJc2l6ZSA9IGh3LT5jaHVua19zaXplOworCX0gZWxzZSB7CisJCXNpemUgPSB2ZGVjX3ByZXBhcmVfaW5wdXQodmRlYywgJmh3LT5jaHVuayk7CisJCWlmIChzaXplIDwgNCkgeyAvKmxlc3MgdGhhbiBzdGFydCBjb2RlIHNpemUgMDAgMDAgMDEgeHgqLworCQkJaHctPmlucHV0X2VtcHR5Kys7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfQUdBSU47CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCWh3LT5ydW5fZmxhZyA9IDA7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKCh2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpKSAmJgorCQkJKGh3LT5jaHVuayAhPSBOVUxMKSkgeworCQkJaHctPmNodW5rX29mZnNldCA9IGh3LT5jaHVuay0+b2Zmc2V0OworCQkJaHctPmNodW5rX3NpemUgPSBody0+Y2h1bmstPnNpemU7CisJCQlody0+Y2h1bmtfZnJhbWVfY291bnQgPSAwOworCQl9CisJfQorCWlmICh2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpICYmICF2ZGVjX3NlY3VyZSh2ZGVjKSkgeworCQkvKiBIVyBuZWVkcyBwYWRkaW5nIChOQUwgc3RhcnQpIGZvciBmcmFtZSBlbmRpbmcgKi8KKwkJY2hhciogdGFpbCA9IChjaGFyICopaHctPmNodW5rLT5ibG9jay0+c3RhcnRfdmlydDsKKworCQl0YWlsICs9IGh3LT5jaHVuay0+b2Zmc2V0ICsgaHctPmNodW5rLT5zaXplOworCQl0YWlsWzBdID0gMDsKKwkJdGFpbFsxXSA9IDA7CisJCXRhaWxbMl0gPSAxOworCQl0YWlsWzNdID0gMHhiNjsKKwkJY29kZWNfbW1fZG1hX2ZsdXNoKHRhaWwsIDQsIERNQV9UT19ERVZJQ0UpOworCX0KKwlpZiAodmRlY19mcmFtZV9iYXNlZCh2ZGVjKSAmJgorCQkoZGVidWdfZW5hYmxlICYgMHhjMDApKSB7CisJCXU4ICpkYXRhID0gTlVMTDsKKworCQlpZiAoIWh3LT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJCWRhdGEgPSBjb2RlY19tbV92bWFwKGh3LT5jaHVuay0+YmxvY2stPnN0YXJ0ICsKKwkJCQlody0+Y2h1bmtfb2Zmc2V0LCBzaXplKTsKKwkJZWxzZQorCQkJZGF0YSA9ICgodTggKilody0+Y2h1bmstPmJsb2NrLT5zdGFydF92aXJ0KSArCisJCQkJaHctPmNodW5rX29mZnNldDsKKworCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCSIlczogc2l6ZSAweCV4IHN1bSAweCV4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IC4uICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQlfX2Z1bmNfXywgc2l6ZSwgZ2V0X2RhdGFfY2hlY2tfc3VtKGh3LCBzaXplKSwKKwkJCWRhdGFbMF0sIGRhdGFbMV0sIGRhdGFbMl0sIGRhdGFbM10sCisJCQlkYXRhWzRdLCBkYXRhWzVdLCBkYXRhW3NpemUgLSA0XSwKKwkJCWRhdGFbc2l6ZSAtIDNdLAlkYXRhW3NpemUgLSAyXSwKKwkJCWRhdGFbc2l6ZSAtIDFdKTsKKworCQlpZiAoZGVidWdfZW5hYmxlICYgUFJJTlRfRlJBTUVCQVNFX0RBVEEpIHsKKwkJCWludCBqajsKKworCQkJZm9yIChqaiA9IDA7IGpqIDwgc2l6ZTsgamorKykgeworCQkJCWlmICgoamogJiAweGYpID09IDApCisJCQkJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLAorCQkJCQlQUklOVF9GUkFNRUJBU0VfREFUQSwKKwkJCQkJCSIlMDZ4OiIsIGpqKTsKKwkJCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCQlQUklOVF9GUkFNRUJBU0VfREFUQSwKKwkJCQkJIiUwMnggIiwgZGF0YVtqal0pOworCQkJCWlmICgoKGpqICsgMSkgJiAweGYpID09IDApCisJCQkJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLAorCQkJCQlQUklOVF9GUkFNRUJBU0VfREFUQSwKKwkJCQkJCSJcbiIpOworCQkJfQorCQl9CisKKwkJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQljb2RlY19tbV91bm1hcF9waHlhZGRyKGRhdGEpOworCX0KKworCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1JVTl9GTE9XLAorCQkiJXMsIHNpemU9JWQsICV4ICV4ICV4ICV4ICV4XG4iLAorCQlfX2Z1bmNfXywgc2l6ZSwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKSwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1dQKSwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSwKKwkJU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3JwKSwKKwkJU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3dwKSk7CisKKwlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfTk9ORTsKKwlpZiAodmRlYy0+bWNfbG9hZGVkKSB7CisJLypmaXJtd2FyZSBoYXZlIGxvYWQgYmVmb3JlLAorCSAgYW5kIG5vdCBjaGFuZ2VzIHRvIGFub3RoZXIuCisJICBpZ25vcmUgcmVsb2FkLgorCSovCisJfSBlbHNlIHsKKwkJcmV0ID0gYW12ZGVjX3ZkZWNfbG9hZG1jX2J1Zl9leChWRk9STUFUX01QRUc0LGh3LT5mdy0+bmFtZSwgdmRlYywKKwkJCWh3LT5mdy0+ZGF0YSwgaHctPmZ3LT5sZW4pOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCJbJWRdICVzOiB0aGUgJXMgZncgbG9hZGluZyBmYWlsZWQsIGVycjogJXhcbiIsIHZkZWMtPmlkLAorCQkJCWh3LT5mdy0+bmFtZSwgdGVlX2VuYWJsZWQoKSA/ICJURUUiIDogImxvY2FsIiwgcmV0KTsKKwkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9GT1JDRV9FWElUOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQlody0+cnVuX2ZsYWcgPSAwOworCQkJcmV0dXJuOworCQl9CisJCXZkZWMtPm1jX2xvYWRlZCA9IDE7CisJCXZkZWMtPm1jX3R5cGUgPSBWRk9STUFUX01QRUc0OworCX0KKwlpZiAodm1wZWc0X2h3X2N0eF9yZXN0b3JlKGh3KSA8IDApIHsKKwkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0VSUk9SOworCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSJhbXZkZWNfbXBlZzQ6IGVycm9yIEhXIGNvbnRleHQgcmVzdG9yZVxuIik7CisJCWh3LT5ydW5fZmxhZyA9IDA7CisJCXJldHVybjsKKwl9CisJaWYgKHZkZWNfZnJhbWVfYmFzZWQodmRlYykpIHsKKwkJc2l6ZSA9IGh3LT5jaHVua19zaXplICsKKwkJCShody0+Y2h1bmtfb2Zmc2V0ICYgKFZERUNfRklGT19BTElHTiAtIDEpKTsKKwkJV1JJVEVfVlJFRyhWSUZGX0JJVF9DTlQsIHNpemUgKiA4KTsKKwkJaWYgKHZkZWMtPm12ZnJtKQorCQkJdmRlYy0+bXZmcm0tPmZyYW1lX3NpemUgPSBody0+Y2h1bmstPnNpemU7CisJfQorCWh3LT5pbnB1dF9lbXB0eSA9IDA7CisJaHctPmxhc3RfdmxkX2xldmVsID0gMDsKKwlzdGFydF9wcm9jZXNzX3RpbWUoaHcpOworCXZkZWNfZW5hYmxlX2lucHV0KHZkZWMpOworCS8qIHdtYiBiZWZvcmUgSVNSIGlzIGhhbmRsZWQgKi8KKwl3bWIoKTsKKworCWlmICh2ZGVjLT5tdmZybSkKKwkJdmRlYy0+bXZmcm0tPmh3X2RlY29kZV9zdGFydCA9IGxvY2FsX2Nsb2NrKCk7CisJYW12ZGVjX3N0YXJ0KCk7CisJaHctPnN0YXQgfD0gU1RBVF9WREVDX1JVTjsKKwlody0+c3RhdCB8PSBTVEFUX1RJTUVSX0FSTTsKKwlody0+aW5pdF9mbGFnID0gMTsKKwltb2RfdGltZXIoJmh3LT5jaGVja190aW1lciwgamlmZmllcyArIENIRUNLX0lOVEVSVkFMKTsKKwlody0+cnVuX2ZsYWcgPSAwOworfQorCitzdGF0aWMgaW50IHZtcGVnNF9zdG9wKHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3KQoreworCWNhbmNlbF93b3JrX3N5bmMoJmh3LT53b3JrKTsKKworCWlmIChody0+bW1fYmxrX2hhbmRsZSkgeworCQl2b2lkICpibW11X2JveF90bXAgPSBody0+bW1fYmxrX2hhbmRsZTsKKwkJaHctPm1tX2Jsa19oYW5kbGUgPSBOVUxMOworCQl3aGlsZSAoaHctPnJ1bl9mbGFnKQorCQkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOworCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWUoYm1tdV9ib3hfdG1wKTsKKwkJYm1tdV9ib3hfdG1wID0gTlVMTDsKKwl9CisKKwlpZiAoaHctPnN0YXQgJiBTVEFUX1RJTUVSX0FSTSkgeworCQlkZWxfdGltZXJfc3luYygmaHctPmNoZWNrX3RpbWVyKTsKKwkJaHctPnN0YXQgJj0gflNUQVRfVElNRVJfQVJNOworCX0KKworCWlmIChody0+ZncpIHsKKwkJdmZyZWUoaHctPmZ3KTsKKwkJaHctPmZ3ID0gTlVMTDsKKwl9CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgdm9pZCByZXNldChzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKil2ZGVjLT5wcml2YXRlOworCisJcHJfaW5mbygiYW12ZGVjX21tcGVnNDogcmVzZXQuXG4iKTsKKworCXZtcGVnNF9sb2NhbF9pbml0KGh3KTsKKworCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJdTMyIGksIGJ1Zl9udW0gPSB2bXBlZzRfZ2V0X2J1Zl9udW0oaHcpOworCQlmb3IgKGkgPSAwOyBpIDwgYnVmX251bTsgaSsrKSB7CisJCQlody0+cGljW2ldLnY0bF9yZWZfYnVmX2FkZHIgPSAwOworCQl9CisJfQorCWh3LT5jdHhfdmFsaWQgPSAwOworfQorCitzdGF0aWMgaW50IHZtcGVnNF9zZXRfdHJpY2ttb2RlKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHVuc2lnbmVkIGxvbmcgdHJpY2ttb2RlKQoreworCXN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3ID0KKwkoc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJaWYgKCFodykKKwkJcmV0dXJuIDA7CisKKwlpZiAodHJpY2ttb2RlID09IFRSSUNLTU9ERV9JKSB7CisJCWh3LT5pX29ubHkgPSAweDM7CisJCXRyaWNrbW9kZV9pID0gMTsKKwl9IGVsc2UgaWYgKHRyaWNrbW9kZSA9PSBUUklDS01PREVfTk9ORSkgeworCQlody0+aV9vbmx5ID0gMHgwOworCQl0cmlja21vZGVfaSA9IDA7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtbXZkZWNfbXBlZzRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdmRlY19zICpwZGF0YSA9ICooc3RydWN0IHZkZWNfcyAqKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodyA9IE5VTEw7CisJaW50IGNvbmZpZ192YWwgPSAwOworCisJaWYgKHBkYXRhID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlcyBtZW1vcnkgcmVzb3VyY2UgdW5kZWZpbmVkLlxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlodyA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MpKTsKKwlpZiAoaHcgPT0gTlVMTCkgeworCQlwcl9lcnIoIlxuYW12ZGVjX21wZWc0IGRlY29kZXIgZHJpdmVyIGFsbG9jIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoaHcsIDAsIHNpemVvZihzdHJ1Y3QgdmRlY19tcGVnNF9od19zKSk7CisKKwkvKiB0aGUgY3R4IGZyb20gdjRsMiBkcml2ZXIuICovCisJaHctPnY0bDJfY3R4ID0gcGRhdGEtPnByaXZhdGU7CisKKwlwZGF0YS0+cHJpdmF0ZSA9IGh3OworCXBkYXRhLT5kZWNfc3RhdHVzID0gZGVjX3N0YXR1czsKKwkvKiBwZGF0YS0+c2V0X3RyaWNrbW9kZSA9IHNldF90cmlja21vZGU7ICovCisJcGRhdGEtPnNldF90cmlja21vZGUgPSB2bXBlZzRfc2V0X3RyaWNrbW9kZTsKKwlwZGF0YS0+cnVuX3JlYWR5ID0gcnVuX3JlYWR5OworCXBkYXRhLT5ydW4gPSBydW47CisJcGRhdGEtPnJlc2V0ID0gcmVzZXQ7CisJcGRhdGEtPmlycV9oYW5kbGVyID0gdm1wZWc0X2lzcjsKKwlwZGF0YS0+dGhyZWFkZWRfaXJxX2hhbmRsZXIgPSB2bXBlZzRfaXNyX3RocmVhZF9mbjsKKwlwZGF0YS0+ZHVtcF9zdGF0ZSA9IHZtcGVnNF9kdW1wX3N0YXRlOworCisJc25wcmludGYoaHctPnZkZWNfbmFtZSwgc2l6ZW9mKGh3LT52ZGVjX25hbWUpLAorCQkibXBlZzQtJWQiLCBwZGV2LT5pZCk7CisJc25wcmludGYoaHctPnB0c19uYW1lLCBzaXplb2YoaHctPnB0c19uYW1lKSwKKwkJIiVzLXB0cyIsIGh3LT52ZGVjX25hbWUpOworCXNucHJpbnRmKGh3LT5uZXdfcV9uYW1lLCBzaXplb2YoaHctPm5ld19xX25hbWUpLAorCQkiJXMtbmV3ZnJhbWVfcSIsIGh3LT52ZGVjX25hbWUpOworCXNucHJpbnRmKGh3LT5kaXNwX3FfbmFtZSwgc2l6ZW9mKGh3LT5kaXNwX3FfbmFtZSksCisJCSIlcy1kaXNwZnJhbWVfcSIsIGh3LT52ZGVjX25hbWUpOworCisJaWYgKHBkYXRhLT51c2VfdmZtX3BhdGgpCisJCXNucHJpbnRmKHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lLCBWREVDX1BST1ZJREVSX05BTUVfU0laRSwKKwkJCVZGTV9ERUNfUFJPVklERVJfTkFNRSk7CisJZWxzZQorCQlzbnByaW50ZihwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwgVkRFQ19QUk9WSURFUl9OQU1FX1NJWkUsCisJCQlQUk9WSURFUl9OQU1FICIuJTAyeCIsIHBkZXYtPmlkICYgMHhmZik7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwZGF0YSk7CisJaHctPnBsYXRmb3JtX2RldiA9IHBkZXY7CisKKwlpZiAoKChkZWJ1Z19lbmFibGUgJiBJR05PUkVfUEFSQU1fRlJPTV9DT05GSUcpID09IDApICYmIHBkYXRhLT5jb25maWdfbGVuKSB7CisJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLCAicGRhdGEtPmNvbmZpZzogJXNcbiIsIHBkYXRhLT5jb25maWcpOworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgInBhcm1fdjRsX2J1ZmZlcl9tYXJnaW4iLAorCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+ZHluYW1pY19idWZfbnVtX21hcmdpbiA9IGNvbmZpZ192YWw7CisJCWVsc2UKKwkJCWh3LT5keW5hbWljX2J1Zl9udW1fbWFyZ2luID0gZHluYW1pY19idWZfbnVtX21hcmdpbjsKKwl9IGVsc2UgeworCQlody0+ZHluYW1pY19idWZfbnVtX21hcmdpbiA9IGR5bmFtaWNfYnVmX251bV9tYXJnaW47CisJfQorCWh3LT5idWZfbnVtID0gdm1wZWc0X2dldF9idWZfbnVtKGh3KTsKKworCWlmIChwZGF0YS0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBERUNPREVfQlVGRkVSX05VTV9NQVg7IGkrKykKKwkJCWh3LT5jYW52YXNfc3BlY1tpXSA9IDB4ZmZmZmZmOworCX0KKworCWh3LT5ibGttb2RlID0gcGRhdGEtPmNhbnZhc19tb2RlOworCisJaWYgKHBkYXRhLT5zeXNfaW5mbykgeworCQlody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvID0gKnBkYXRhLT5zeXNfaW5mbzsKKwkJaWYgKChody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodCAhPSAwKSAmJgorCQkJKGh3LT52bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGggPgorCQkJKE1BWF9NUEVHNF9TVVBQT1JUX1NJWkUvaHctPnZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQpKSkgeworCQkJcHJfaW5mbygiYW1tdmRlY19tcGVnNDogb3ZlcnNpemUsIHVuc3VwcG9ydDogJWQqJWRcbiIsCisJCQkJaHctPnZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby53aWR0aCwKKwkJCQlody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodCk7CisJCQlwZGF0YS0+ZGVjX3N0YXR1cyA9IE5VTEw7CisJCQl2ZnJlZSgodm9pZCAqKWh3KTsKKwkJCWh3ID0gTlVMTDsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJInN5c2luZm86ICVkIHggJWQsIHJhdGU6ICVkXG4iLAorCQkJaHctPnZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby53aWR0aCwKKwkJCWh3LT52bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0LAorCQkJaHctPnZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5yYXRlKTsKKwl9CisJaWYgKCgoZGVidWdfZW5hYmxlICYgSUdOT1JFX1BBUkFNX0ZST01fQ09ORklHKSA9PSAwKSAmJiBwZGF0YS0+Y29uZmlnX2xlbikgeworCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19SVU5fRkxPVywKKwkJCSAicGRhdGEtPmNvbmZpZzogJXNcbiIsIHBkYXRhLT5jb25maWcpOworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgInBhcm1fdjRsX2J1ZmZlcl9tYXJnaW4iLAorCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+ZHluYW1pY19idWZfbnVtX21hcmdpbiA9IGNvbmZpZ192YWw7CisJCWVsc2UKKwkJCWh3LT5keW5hbWljX2J1Zl9udW1fbWFyZ2luID0gZHluYW1pY19idWZfbnVtX21hcmdpbjsKKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgInNpZGViaW5kX3R5cGUiLAorCQkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJaHctPnNpZGViaW5kX3R5cGUgPSBjb25maWdfdmFsOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAic2lkZWJpbmRfY2hhbm5lbF9pZCIsCisJCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+c2lkZWJpbmRfY2hhbm5lbF9pZCA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV92NGxfY29kZWNfZW5hYmxlIiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJaHctPmlzX3VzZWRfdjRsID0gY29uZmlnX3ZhbDsKKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywKKwkJCSJwYXJtX3Y0bF9jYW52YXNfbWVtX21vZGUiLAorCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+YmxrbW9kZSA9IGNvbmZpZ192YWw7CisJfSBlbHNlCisJCWh3LT5keW5hbWljX2J1Zl9udW1fbWFyZ2luID0gZHluYW1pY19idWZfbnVtX21hcmdpbjsKKworCWlmICghaHctPmlzX3VzZWRfdjRsKQorCQl2Zl9wcm92aWRlcl9pbml0KCZwZGF0YS0+dmZyYW1lX3Byb3ZpZGVyLAorCQkJcGRhdGEtPnZmX3Byb3ZpZGVyX25hbWUsICZ2Zl9wcm92aWRlcl9vcHMsIHBkYXRhKTsKKworCWh3LT5idWZfbnVtID0gdm1wZWc0X2dldF9idWZfbnVtKGh3KTsKKworCWlmICh2bW1wZWc0X2luaXQoaHcpIDwgMCkgeworCQlwcl9lcnIoIiVzIGluaXQgZmFpbGVkLlxuIiwgX19mdW5jX18pOworCisJCWlmIChodykgeworCQkJdmZyZWUoKHZvaWQgKilodyk7CisJCQlodyA9IE5VTEw7CisJCX0KKwkJcGRhdGEtPmRlY19zdGF0dXMgPSBOVUxMOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJdmRlY19zZXRfcHJlcGFyZV9sZXZlbChwZGF0YSwgc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCk7CisKKwl2ZGVjX3NldF92ZnJhbWVfY29tbShwZGF0YSwgRFJJVkVSX05BTUUpOworCisJaWYgKHBkYXRhLT5wYXJhbGxlbF9kZWMgPT0gMSkKKwkJdmRlY19jb3JlX3JlcXVlc3QocGRhdGEsIENPUkVfTUFTS19WREVDXzEpOworCWVsc2UgeworCQl2ZGVjX2NvcmVfcmVxdWVzdChwZGF0YSwgQ09SRV9NQVNLX1ZERUNfMSB8IENPUkVfTUFTS19IRVZDCisJCQkJfCBDT1JFX01BU0tfQ09NQklORSk7CisJfQorCisJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSIlcyBlbmQuXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1tdmRlY19tcGVnNF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodyA9CisJCShzdHJ1Y3QgdmRlY19tcGVnNF9od19zICopCisJCSgoKHN0cnVjdCB2ZGVjX3MgKikocGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldikpKS0+cHJpdmF0ZSk7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaHcpOworCWludCBpOworCisJaWYgKHZkZWMtPm5leHRfc3RhdHVzID09IFZERUNfU1RBVFVTX0RJU0NPTk5FQ1RFRAorCQkJCSYmICh2ZGVjLT5zdGF0dXMgPT0gVkRFQ19TVEFUVVNfQUNUSVZFKSkgeworCQkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkJIiVzICBmb3JjZSBleGl0ICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0ZPUkNFX0VYSVQ7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGh3LT53YWl0X3EsCisJCQkJKHZkZWMtPnN0YXR1cyA9PSBWREVDX1NUQVRVU19DT05ORUNURUQpLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOyAgLyogd2FpdCBmb3Igd29yayBkb25lICovCisJfQorCisJdm1wZWc0X3N0b3AoaHcpOworCisJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKQorCQl2ZGVjX2NvcmVfcmVsZWFzZShod190b192ZGVjKGh3KSwgQ09SRV9NQVNLX1ZERUNfMSk7CisJZWxzZQorCQl2ZGVjX2NvcmVfcmVsZWFzZShod190b192ZGVjKGh3KSwgQ09SRV9NQVNLX1ZERUNfMSB8IENPUkVfTUFTS19IRVZDKTsKKwl2ZGVjX3NldF9zdGF0dXMoaHdfdG9fdmRlYyhodyksIFZERUNfU1RBVFVTX0RJU0NPTk5FQ1RFRCk7CisKKwlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJZm9yIChpID0gMDsgaSA8IERFQ09ERV9CVUZGRVJfTlVNX01BWDsgaSsrKSB7CisJCQl2ZGVjLT5mcmVlX2NhbnZhc19leChjYW52YXNfeShody0+Y2FudmFzX3NwZWNbaV0pLCB2ZGVjLT5pZCk7CisJCQl2ZGVjLT5mcmVlX2NhbnZhc19leChjYW52YXNfdShody0+Y2FudmFzX3NwZWNbaV0pLCB2ZGVjLT5pZCk7CisJCX0KKwl9CisKKwltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJdmZyZWUoKHZvaWQgKilodyk7CisJaHcgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhbW12ZGVjX21wZWc0X2RyaXZlciA9IHsKKwkucHJvYmUgPSBhbW12ZGVjX21wZWc0X3Byb2JlLAorCS5yZW1vdmUgPSBhbW12ZGVjX21wZWc0X3JlbW92ZSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZCA9IGFtdmRlY19zdXNwZW5kLAorCS5yZXN1bWUgPSBhbXZkZWNfcmVzdW1lLAorI2VuZGlmCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGNvZGVjX3Byb2ZpbGVfdCBhbXZkZWNfbXBlZzRfcHJvZmlsZSA9IHsKKwkubmFtZSA9ICJtbXBlZzQiLAorCS5wcm9maWxlID0gInY0bCwgbm9fc2luZ2xlIgorfTsKKworc3RhdGljIGludCBfX2luaXQgYW1tdmRlY19tcGVnNF9kcml2ZXJfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlwcl9pbmZvKCIlcyBcbiIsIF9fZnVuY19fKTsKKworCWlmIChwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFtbXZkZWNfbXBlZzRfZHJpdmVyKSkgeworCQlwcl9lcnIoImZhaWxlZCB0byByZWdpc3RlciBhbW12ZGVjX21wZWc0IGRyaXZlclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwl2Y29kZWNfcHJvZmlsZV9yZWdpc3RlcigmYW12ZGVjX21wZWc0X3Byb2ZpbGUpOworCXZjb2RlY19mZWF0dXJlX3JlZ2lzdGVyKFZGT1JNQVRfTVBFRzQsIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYW1tdmRlY19tcGVnNF9kcml2ZXJfcmVtb3ZlX21vZHVsZSh2b2lkKQoreworCXByX2luZm8oImFtbXZkZWNfbXBlZzQgbW9kdWxlIHJlbW92ZS5cbiIpOworCisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFtbXZkZWNfbXBlZzRfZHJpdmVyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCittb2R1bGVfcGFyYW0oZGVidWdfZW5hYmxlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWdfZW5hYmxlLAorCQkJCQkgIlxuIGFtbXZkZWNfbXBlZzQgZGVidWcgZW5hYmxlXG4iKTsKKworbW9kdWxlX3BhcmFtKGZybWJhc2VfY29udF9iaXRsZXZlbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZybWJhc2VfY29udF9iaXRsZXZlbCwgIlxuZnJtYmFzZV9jb250X2JpdGxldmVsXG4iKTsKKworbW9kdWxlX3BhcmFtKGR5bmFtaWNfYnVmX251bV9tYXJnaW4sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkeW5hbWljX2J1Zl9udW1fbWFyZ2luLCAiXG4gZHluYW1pY19idWZfbnVtX21hcmdpblxuIik7CisKK21vZHVsZV9wYXJhbShyYWRyLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocmFkciwgIlxucmFkclxuIik7CisKK21vZHVsZV9wYXJhbShydmFsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocnZhbCwgIlxucnZhbFxuIik7CisKK21vZHVsZV9wYXJhbShkZWNvZGVfdGltZW91dF92YWwsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkZWNvZGVfdGltZW91dF92YWwsICJcbiBhbW12ZGVjX21wZWc0IGRlY29kZV90aW1lb3V0X3ZhbFxuIik7CisKK21vZHVsZV9wYXJhbV9hcnJheShtYXhfcHJvY2Vzc190aW1lLCB1aW50LCAmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCittb2R1bGVfcGFyYW0ocHJlX2RlY29kZV9idWZfbGV2ZWwsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHByZV9kZWNvZGVfYnVmX2xldmVsLAorCQkiXG4gYW1tdmRlY19tcGVnNCBwcmVfZGVjb2RlX2J1Zl9sZXZlbFxuIik7CisKK21vZHVsZV9wYXJhbShzdGFydF9kZWNvZGVfYnVmX2xldmVsLCBpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhzdGFydF9kZWNvZGVfYnVmX2xldmVsLAorCQkiXG4gYW1tdmRlY19tcGVnNCBzdGFydF9kZWNvZGVfYnVmX2xldmVsXG4iKTsKKworbW9kdWxlX3BhcmFtKHVkZWJ1Z19mbGFnLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModWRlYnVnX2ZsYWcsICJcbiBhbW12ZGVjX21wZWc0IHVkZWJ1Z19mbGFnXG4iKTsKKworbW9kdWxlX3BhcmFtKHdpdGhvdXRfZGlzcGxheV9tb2RlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Mod2l0aG91dF9kaXNwbGF5X21vZGUsICJcbiBhbW12ZGVjX21wZWc0IHdpdGhvdXRfZGlzcGxheV9tb2RlXG4iKTsKKworbW9kdWxlX2luaXQoYW1tdmRlY19tcGVnNF9kcml2ZXJfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoYW1tdmRlY19tcGVnNF9kcml2ZXJfcmVtb3ZlX21vZHVsZSk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQU1MT0dJQyBNUEVHNCBWaWRlbyBEZWNvZGVyIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiVGltIFlhbyA8dGlteWFvQGFtbG9naWMuY29tPiIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvTWFrZWZpbGUgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY4NTQwYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy9NYWtlZmlsZQpAQCAtMCwwICsxLDEzIEBACitvYmotbQkrPQlkZWNvZGVyX2NvbW1vbi5vCitkZWNvZGVyX2NvbW1vbi1vYmpzCSs9CXV0aWxzLm8gdmRlYy5vIHZkZWNfaW5wdXQubyBhbXZkZWMubworZGVjb2Rlcl9jb21tb24tb2JqcwkrPQlkZWNvZGVyX21tdV9ib3gubyBkZWNvZGVyX2JtbXVfYm94Lm8KK2RlY29kZXJfY29tbW9uLW9ianMJKz0JY29uZmlnX3BhcnNlci5vIHZkZWNfcHJvZmlsZS5vCitkZWNvZGVyX2NvbW1vbi1vYmpzCSs9CWFtc3RyZWFtX3Byb2ZpbGUubyAKK2RlY29kZXJfY29tbW9uLW9ianMJKz0JZnJhbWVfY2hlY2subyBhbWxvZ2ljX2ZiY19ob29rLm8KK2RlY29kZXJfY29tbW9uLW9ianMJKz0JdmRlY192NGwyX2J1ZmZlcl9vcHMubworZGVjb2Rlcl9jb21tb24tb2JqcwkrPQl2ZGVjX3N5bmMubworZGVjb2Rlcl9jb21tb24tb2JqcwkrPQl2ZGVjX3Bvd2VyX2N0cmwubworZGVjb2Rlcl9jb21tb24tb2JqcwkrPQl2ZGVjX2NhbnZhc191dGlscy5vCitkZWNvZGVyX2NvbW1vbi1vYmpzCSs9CXZkZWNfZmVhdHVyZS5vCitkZWNvZGVyX2NvbW1vbi1vYmpzCSs9CXZkZWNfZ2UyZF91dGlscy5vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy9hbWxvZ2ljX2ZiY19ob29rLmMgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvYW1sb2dpY19mYmNfaG9vay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MTc5ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvYW1sb2dpY19mYmNfaG9vay5jCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL21lZGlhL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvYW1sb2dpY19mYmNfaG9vay5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgImFtbG9naWNfZmJjX2hvb2suaCIKK3N0YXRpYyBBTUxPR0lDX0ZCQ192ZnJhbWVfZGVjb2Rlcl9mdW5fdCBnX2RlY29kZXJfZnVuOworc3RhdGljIEFNTE9HSUNfRkJDX3ZmcmFtZV9lbmNvZGVyX2Z1bl90IGdfZW5jb2Rlcl9mdW47CisKKworaW50IEFNTE9HSUNfRkJDX3ZmcmFtZV9kZWNvZGVyKAorCXZvaWQgKmRzdHl1dls0XSwKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmLAorCWludCBvdXRfZm9ybWF0LAorCWludCBmbGFncykKKworeworCWlmIChnX2RlY29kZXJfZnVuKSB7CisJCXJldHVybiBnX2RlY29kZXJfZnVuKGRzdHl1diwKKwkJCXZmLAorCQkJb3V0X2Zvcm1hdCwKKwkJCWZsYWdzKTsKKwl9CisJcHJpbnRrKCJubyBBTUxPR0lDX0ZCQ192ZnJhbWVfZGVjb2RlciBFUlJSISFcbiIpOworCXJldHVybiAtMTsKK30KK0VYUE9SVF9TWU1CT0woQU1MT0dJQ19GQkNfdmZyYW1lX2RlY29kZXIpOworCitpbnQgQU1MT0dJQ19GQkNfdmZyYW1lX2VuY29kZXIoCisJdm9pZCAqc3JjeXV2WzRdLAorCXZvaWQgKmRzdF9oZWFkZXIsCisJdm9pZCAqZHN0X2JvZHksCisJaW50IGluX2Zvcm1hdCwKKwlpbnQgZmxhZ3MpCisKK3sKKwlpZiAoZ19lbmNvZGVyX2Z1bikgeworCQlyZXR1cm4gZ19lbmNvZGVyX2Z1bigKKwkJCQlzcmN5dXYsCisJCQkJZHN0X2hlYWRlciwKKwkJCQlkc3RfYm9keSwKKwkJCQlpbl9mb3JtYXQsCisJCQkJZmxhZ3MpOworCX0KKwlwcmludGsoIm5vIEFNTE9HSUNfRkJDX3ZmcmFtZV9lbmNvZGVyIEVSUlIhIVxuIik7CisJcmV0dXJuIC0xOworfQorRVhQT1JUX1NZTUJPTChBTUxPR0lDX0ZCQ192ZnJhbWVfZW5jb2Rlcik7CisKK2ludCByZWdpc3Rlcl9hbWxvZ2ljX2FmYmNfZGVjX2Z1bihBTUxPR0lDX0ZCQ192ZnJhbWVfZGVjb2Rlcl9mdW5fdCBmbikKK3sKKwlpZiAoZ19kZWNvZGVyX2Z1bikgeworCQlwcl9lcnIoImVycm9yISEsQU1MT0dJQ19GQkMgZGVjIGhhdmUgcmVnaXN0ZXJcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXByaW50aygicmVnaXN0ZXJfYW1sb2dpY19hZmJjX2RlY19mdW5cbiIpOworCWdfZGVjb2Rlcl9mdW4gPSBmbjsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfYW1sb2dpY19hZmJjX2RlY19mdW4pOworCitpbnQgcmVnaXN0ZXJfYW1sb2dpY19hZmJjX2VuY19mdW4oQU1MT0dJQ19GQkNfdmZyYW1lX2VuY29kZXJfZnVuX3QgZm4pCit7CisJaWYgKGdfZW5jb2Rlcl9mdW4pIHsKKwkJcHJfZXJyKCJlcnJvciEhLEFNTE9HSUNfRkJDIGVuYyBoYXZlIHJlZ2lzdGVyXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlnX2VuY29kZXJfZnVuID0gZm47CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX2FtbG9naWNfYWZiY19lbmNfZnVuKTsKKworaW50IHVucmVnaXN0ZXJfYW1sb2dpY19hZmJjX2RlY19mdW4odm9pZCkKK3sKKwlnX2RlY29kZXJfZnVuID0gTlVMTDsKKwlwcl9lcnIoInVucmVnaXN0ZXJfYW1sb2dpY19hZmJjX2RlY19mdW5cbiIpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX2FtbG9naWNfYWZiY19kZWNfZnVuKTsKKworaW50IHVucmVnaXN0ZXJfYW1sb2dpY19hZmJjX2VuY19mdW4odm9pZCkKK3sKKwlnX2VuY29kZXJfZnVuID0gTlVMTDsKKwlwcl9lcnIoInVucmVnaXN0ZXJfYW1sb2dpY19hZmJjX2RlY19mdW5cbiIpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX2FtbG9naWNfYWZiY19lbmNfZnVuKTsKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvYW1sb2dpY19mYmNfaG9vay5oIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL2FtbG9naWNfZmJjX2hvb2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWVjNGI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL2FtbG9naWNfZmJjX2hvb2suaApAQCAtMCwwICsxLDU1IEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL21lZGlhL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvYW1sb2dpY19mYmNfaG9vay5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgQU1MR0lDX0ZCQ19IRUFERVJfX18KKyNkZWZpbmUgQU1MR0lDX0ZCQ19IRUFERVJfX18KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWUuaD4KKy8qCit1bnNpZ25lZCBzaG9ydCAqcGxhbmVzWzRdLAorCXVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwl1bnNpZ25lZCAqdjJfaGVhZF9idWYJCQkJLy8gdjJfaGVhZF9idWZfc2l6ZT0oKChmcmFtZV9pbmZvLT5tYncgKyAxKT4+MSkqMikgKiAoKChmcmFtZV9pbmZvLT5tYmggKyAxNSk+PjQpKjE2KQorKTsKKyovCisKK2ludCBBTUxPR0lDX0ZCQ192ZnJhbWVfZGVjb2RlcigKKwl2b2lkICpkc3R5dXZbNF0sCisJc3RydWN0IHZmcmFtZV9zICp2ZiwKKwlpbnQgb3V0X2Zvcm1hdCwKKwlpbnQgZmxhZ3MpOworaW50IEFNTE9HSUNfRkJDX3ZmcmFtZV9lbmNvZGVyKAorCXZvaWQgKnNyY3l1dls0XSwKKwl2b2lkICpkc3RfaGVhZGVyLAorCXZvaWQgKmRzdF9ib2R5LAorCWludCBpbl9mb3JtYXQsCisJaW50IGZsYWdzKTsKKwordHlwZWRlZiBpbnQgKCpBTUxPR0lDX0ZCQ192ZnJhbWVfZGVjb2Rlcl9mdW5fdCkoCisJdm9pZCAqKiwKKwlzdHJ1Y3QgdmZyYW1lX3MgKiwKKwlpbnQsCisJaW50KTsKK3R5cGVkZWYgaW50ICgqQU1MT0dJQ19GQkNfdmZyYW1lX2VuY29kZXJfZnVuX3QpKAorCXZvaWQgKiosCisJdm9pZCAqLAorCXZvaWQgKiwKKwlpbnQsCisJaW50KTsKK2ludCByZWdpc3Rlcl9hbWxvZ2ljX2FmYmNfZGVjX2Z1bihBTUxPR0lDX0ZCQ192ZnJhbWVfZGVjb2Rlcl9mdW5fdCBmbik7CitpbnQgcmVnaXN0ZXJfYW1sb2dpY19hZmJjX2VuY19mdW4oQU1MT0dJQ19GQkNfdmZyYW1lX2VuY29kZXJfZnVuX3QgZm4pOworaW50IHVucmVnaXN0ZXJfYW1sb2dpY19hZmJjX2RlY19mdW4odm9pZCk7CitpbnQgdW5yZWdpc3Rlcl9hbWxvZ2ljX2FmYmNfZW5jX2Z1bih2b2lkKTsKKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy9hbXN0cmVhbV9wcm9maWxlLmMgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvYW1zdHJlYW1fcHJvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMmI5YzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvYW1zdHJlYW1fcHJvZmlsZS5jCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvbWVkaWEvc3RyZWFtX2lucHV0L2FtcG9ydHMvYW1zdHJlYW1fcHJvZmlsZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvYW1zdHJlYW0uaD4KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjb2RlY19wcm9maWxlX3QgKnZjb2RlY19wcm9maWxlW1NVUFBPUlRfVkRFQ19OVU1dID0geyAwIH07CisKK3N0YXRpYyBpbnQgdmNvZGVjX3Byb2ZpbGVfaWR4OworCitzc2l6ZV90IHZjb2RlY19wcm9maWxlX3JlYWQoY2hhciAqYnVmKQoreworCWNoYXIgKnBidWYgPSBidWY7CisJaW50IGkgPSAwOworCisJZm9yIChpID0gMDsgaSA8IHZjb2RlY19wcm9maWxlX2lkeDsgaSsrKSB7CisJCXBidWYgKz0gc25wcmludGYocGJ1ZiwgUEFHRV9TSVpFIC0gKHBidWYgLSBidWYpLCAiJXM6JXM7XG4iLCB2Y29kZWNfcHJvZmlsZVtpXS0+bmFtZSwKKwkJCQkJCXZjb2RlY19wcm9maWxlW2ldLT5wcm9maWxlKTsKKwl9CisKKwlyZXR1cm4gcGJ1ZiAtIGJ1ZjsKK30KK0VYUE9SVF9TWU1CT0wodmNvZGVjX3Byb2ZpbGVfcmVhZCk7CisKK2ludCB2Y29kZWNfcHJvZmlsZV9yZWdpc3Rlcihjb25zdCBzdHJ1Y3QgY29kZWNfcHJvZmlsZV90ICp2ZGVjX3Byb2ZpbGUpCit7CisJaWYgKHZjb2RlY19wcm9maWxlX2lkeCA8IFNVUFBPUlRfVkRFQ19OVU0pIHsKKwkJdmNvZGVjX3Byb2ZpbGVbdmNvZGVjX3Byb2ZpbGVfaWR4XSA9IHZkZWNfcHJvZmlsZTsKKwkJdmNvZGVjX3Byb2ZpbGVfaWR4Kys7CisJCXByX2RlYnVnKCJyZWdpc3QgJXMgY29kZWMgcHJvZmlsZVxuIiwgdmRlY19wcm9maWxlLT5uYW1lKTsKKworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh2Y29kZWNfcHJvZmlsZV9yZWdpc3Rlcik7CisKK2Jvb2wgaXNfc3VwcG9ydF9wcm9maWxlKGNoYXIgKm5hbWUpCit7CisJaW50IHJldCA9IDA7CisJaW50IGksIHNpemUgPSBBUlJBWV9TSVpFKHZjb2RlY19wcm9maWxlKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJaWYgKCF2Y29kZWNfcHJvZmlsZVtpXSkKKwkJCWJyZWFrOworCQlpZiAoIXN0cmNtcChuYW1lLCB2Y29kZWNfcHJvZmlsZVtpXS0+bmFtZSkpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woaXNfc3VwcG9ydF9wcm9maWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy9hbXZkZWMuYyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy9hbXZkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTI1ZmU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL2FtdmRlYy5jCkBAIC0wLDAgKzEsMTE5NiBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9tZWRpYS9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL2FtdmRlYy5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisjZGVmaW5lIERFQlVHCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy92Zm9ybWF0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSAidmRlYy5oIgorCisjaWZkZWYgQ09ORklHX1BNCisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1dBS0VMT0NLCisjaW5jbHVkZSA8bGludXgvd2FrZWxvY2suaD4KKyNlbmRpZgorI2luY2x1ZGUgIi4uLy4uLy4uL3N0cmVhbV9pbnB1dC9hbXBvcnRzL2FtcG9ydHNfcHJpdi5oIgorCisvKiAjaW5jbHVkZSA8bWFjaC9hbV9yZWdzLmg+ICovCisvKiAjaW5jbHVkZSA8bWFjaC9wb3dlcl9nYXRlLmg+ICovCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy92ZGVjX3JlZy5oPgorI2luY2x1ZGUgImFtdmRlYy5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvYW1wb3J0c19jb25maWcuaD4KKyNpbmNsdWRlICJmaXJtd2FyZS5oIgorLy8jaW5jbHVkZSA8bGludXgvYW1sb2dpYy90ZWUuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L3RlZS5oPgorI2luY2x1ZGUgIi4uLy4uLy4uL2NvbW1vbi9jaGlwcy9kZWNvZGVyX2NwdV92ZXJfaW5mby5oIgorCisjZGVmaW5lIE1DX1NJWkUgKDQwOTYgKiAxNikKKworI2lmZGVmIENPTkZJR19XQUtFTE9DSworc3RhdGljIHN0cnVjdCB3YWtlX2xvY2sgYW12ZGVjX2xvY2s7CitzdHJ1Y3QgdGltZXJfbGlzdCBhbXZkZXZ0aW1lcjsKKyNkZWZpbmUgV0FLRV9DSEVDS19JTlRFUlZBTCAoMTAwKkhaLzEwMCkKKyNlbmRpZgorI2RlZmluZSBBTVZERUNfVVNFX1NUQVRJQ19NRU1PUlkKK3N0YXRpYyB2b2lkICptY19hZGRyOworc3RhdGljIGRtYV9hZGRyX3QgbWNfYWRkcl9tYXA7CisKKyNpZmRlZiBDT05GSUdfV0FLRUxPQ0sKK3N0YXRpYyBpbnQgdmlkZW9fcnVubmluZzsKK3N0YXRpYyBpbnQgdmlkZW9fc3RhdGVkX2NoYW5nZWQgPSAxOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGFtdmRlY19wZ19lbmFibGUoYm9vbCBlbmFibGUpCit7CisJdWxvbmcgdGltZW91dDsKKworCWlmIChlbmFibGUpIHsKKwkJQU1WREVDX0NMS19HQVRFX09OKE1ERUNfQ0xLX1BJQ19EQyk7CisJCUFNVkRFQ19DTEtfR0FURV9PTihNREVDX0NMS19EQkxLKTsKKwkJQU1WREVDX0NMS19HQVRFX09OKE1DX0NMSyk7CisJCUFNVkRFQ19DTEtfR0FURV9PTihJUUlEQ1RfQ0xLKTsKKwkJLyogQU1WREVDX0NMS19HQVRFX09OKFZMRF9DTEspOyAqLworCQlBTVZERUNfQ0xLX0dBVEVfT04oQU1SSVNDKTsKKwkJLyogI2lmIE1FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09ONlRWRCAqLworCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9NOCkKKwkJCVdSSVRFX1ZSRUcoR0NMS19FTiwgMHgzZmYpOworCQkvKiAjZW5kaWYgKi8KKwkJQ0xFQVJfVlJFR19NQVNLKE1ERUNfUElDX0RDX0NUUkwsIDEgPDwgMzEpOworCX0gZWxzZSB7CisKKwkJQU1WREVDX0NMS19HQVRFX09GRihBTVJJU0MpOworCQl0aW1lb3V0ID0gamlmZmllcyArIEhaIC8gMTAwOworCisJCXdoaWxlIChSRUFEX1ZSRUcoTURFQ19QSUNfRENfU1RBVFVTKSAhPSAwKSB7CisJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJCVdSSVRFX1ZSRUdfQklUUyhNREVDX1BJQ19EQ19DVFJMLCAxLCAwLCAxKTsKKwkJCQlXUklURV9WUkVHX0JJVFMoTURFQ19QSUNfRENfQ1RSTCwgMCwgMCwgMSk7CisJCQkJUkVBRF9WUkVHKE1ERUNfUElDX0RDX1NUQVRVUyk7CisJCQkJUkVBRF9WUkVHKE1ERUNfUElDX0RDX1NUQVRVUyk7CisJCQkJUkVBRF9WUkVHKE1ERUNfUElDX0RDX1NUQVRVUyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlBTVZERUNfQ0xLX0dBVEVfT0ZGKE1ERUNfQ0xLX1BJQ19EQyk7CisJCXRpbWVvdXQgPSBqaWZmaWVzICsgSFogLyAxMDA7CisKKwkJd2hpbGUgKFJFQURfVlJFRyhEQkxLX1NUQVRVUykgJiAxKSB7CisJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJCVdSSVRFX1ZSRUcoREJMS19DVFJMLCAzKTsKKwkJCQlXUklURV9WUkVHKERCTEtfQ1RSTCwgMCk7CisJCQkJUkVBRF9WUkVHKERCTEtfU1RBVFVTKTsKKwkJCQlSRUFEX1ZSRUcoREJMS19TVEFUVVMpOworCQkJCVJFQURfVlJFRyhEQkxLX1NUQVRVUyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJQU1WREVDX0NMS19HQVRFX09GRihNREVDX0NMS19EQkxLKTsKKwkJdGltZW91dCA9IGppZmZpZXMgKyBIWiAvIDEwMDsKKworCQl3aGlsZSAoUkVBRF9WUkVHKE1DX1NUQVRVUzApICYgMSkgeworCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJCQlTRVRfVlJFR19NQVNLKE1DX0NUUkwxLCAweDkpOworCQkJCUNMRUFSX1ZSRUdfTUFTSyhNQ19DVFJMMSwgMHg5KTsKKwkJCQlSRUFEX1ZSRUcoTUNfU1RBVFVTMCk7CisJCQkJUkVBRF9WUkVHKE1DX1NUQVRVUzApOworCQkJCVJFQURfVlJFRyhNQ19TVEFUVVMwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlBTVZERUNfQ0xLX0dBVEVfT0ZGKE1DX0NMSyk7CisJCXRpbWVvdXQgPSBqaWZmaWVzICsgSFogLyAxMDA7CisJCXdoaWxlIChSRUFEX1ZSRUcoRENBQ19ETUFfQ1RSTCkgJiAweDgwMDApIHsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJCWJyZWFrOworCQl9CisJCUFNVkRFQ19DTEtfR0FURV9PRkYoSVFJRENUX0NMSyk7CisJCS8qIEFNVkRFQ19DTEtfR0FURV9PRkYoVkxEX0NMSyk7ICovCisJfQorfQorCitzdGF0aWMgdm9pZCBhbXZkZWMyX3BnX2VuYWJsZShib29sIGVuYWJsZSkKK3sKKwlpZiAoaGFzX3ZkZWMyKCkpIHsKKwkJdWxvbmcgdGltZW91dDsKKworCQlpZiAoIXZkZWNfb24oVkRFQ18yKSkKKwkJCXJldHVybjsKKwkJaWYgKGVuYWJsZSkgeworCQkJLyogV1JJVEVfVlJFRyhWREVDMl9HQ0xLX0VOLCAweDNmZik7ICovCisJCX0gZWxzZSB7CisJCQl0aW1lb3V0ID0gamlmZmllcyArIEhaIC8gMTA7CisKKwkJCXdoaWxlIChSRUFEX1ZSRUcoVkRFQzJfTURFQ19QSUNfRENfU1RBVFVTKSAhPSAwKSB7CisJCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJCQkJV1JJVEVfVlJFR19CSVRTKFZERUMyX01ERUNfUElDX0RDX0NUUkwsCisJCQkJCQkJMSwgMCwgMSk7CisJCQkJCVdSSVRFX1ZSRUdfQklUUyhWREVDMl9NREVDX1BJQ19EQ19DVFJMLAorCQkJCQkJCTAsIDAsIDEpOworCQkJCQlSRUFEX1ZSRUcoVkRFQzJfTURFQ19QSUNfRENfU1RBVFVTKTsKKwkJCQkJUkVBRF9WUkVHKFZERUMyX01ERUNfUElDX0RDX1NUQVRVUyk7CisJCQkJCVJFQURfVlJFRyhWREVDMl9NREVDX1BJQ19EQ19TVEFUVVMpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCXRpbWVvdXQgPSBqaWZmaWVzICsgSFogLyAxMDsKKworCQkJd2hpbGUgKFJFQURfVlJFRyhWREVDMl9EQkxLX1NUQVRVUykgJiAxKSB7CisJCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJCQkJV1JJVEVfVlJFRyhWREVDMl9EQkxLX0NUUkwsIDMpOworCQkJCQlXUklURV9WUkVHKFZERUMyX0RCTEtfQ1RSTCwgMCk7CisJCQkJCVJFQURfVlJFRyhWREVDMl9EQkxLX1NUQVRVUyk7CisJCQkJCVJFQURfVlJFRyhWREVDMl9EQkxLX1NUQVRVUyk7CisJCQkJCVJFQURfVlJFRyhWREVDMl9EQkxLX1NUQVRVUyk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJdGltZW91dCA9IGppZmZpZXMgKyBIWiAvIDEwOworCisJCQl3aGlsZSAoUkVBRF9WUkVHKFZERUMyX0RDQUNfRE1BX0NUUkwpICYgMHg4MDAwKSB7CisJCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBhbWhldmNfcGdfZW5hYmxlKGJvb2wgZW5hYmxlKQoreworCWlmIChoYXNfaGV2Y192ZGVjKCkpIHsKKwkJdWxvbmcgdGltZW91dDsKKworCQlpZiAoIXZkZWNfb24oVkRFQ19IRVZDKSkKKwkJCXJldHVybjsKKwkJaWYgKGVuYWJsZSkgeworCQkJLyogV1JJVEVfVlJFRyhWREVDMl9HQ0xLX0VOLCAweDNmZik7ICovCisJCX0gZWxzZSB7CisJCQl0aW1lb3V0ID0gamlmZmllcyArIEhaIC8gMTA7CisKKwkJCXdoaWxlIChSRUFEX1ZSRUcoSEVWQ19NREVDX1BJQ19EQ19TVEFUVVMpICE9IDApIHsKKwkJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJCQlXUklURV9WUkVHX0JJVFMoSEVWQ19NREVDX1BJQ19EQ19DVFJMLAorCQkJCQkJMSwgMCwgMSk7CisJCQkJCVdSSVRFX1ZSRUdfQklUUyhIRVZDX01ERUNfUElDX0RDX0NUUkwsCisJCQkJCQkwLCAwLCAxKTsKKwkJCQkJUkVBRF9WUkVHKEhFVkNfTURFQ19QSUNfRENfU1RBVFVTKTsKKwkJCQkJUkVBRF9WUkVHKEhFVkNfTURFQ19QSUNfRENfU1RBVFVTKTsKKwkJCQkJUkVBRF9WUkVHKEhFVkNfTURFQ19QSUNfRENfU1RBVFVTKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQl0aW1lb3V0ID0gamlmZmllcyArIEhaIC8gMTA7CisKKwkJCXdoaWxlIChSRUFEX1ZSRUcoSEVWQ19EQkxLX1NUQVRVUykgJiAxKSB7CisJCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJCQkJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ1RSTCwgMyk7CisJCQkJCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NUUkwsIDApOworCQkJCQlSRUFEX1ZSRUcoSEVWQ19EQkxLX1NUQVRVUyk7CisJCQkJCVJFQURfVlJFRyhIRVZDX0RCTEtfU1RBVFVTKTsKKwkJCQkJUkVBRF9WUkVHKEhFVkNfREJMS19TVEFUVVMpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCXRpbWVvdXQgPSBqaWZmaWVzICsgSFogLyAxMDsKKworCQkJd2hpbGUgKFJFQURfVlJFRyhIRVZDX0RDQUNfRE1BX0NUUkwpICYgMHg4MDAwKSB7CisJCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCisjaWZkZWYgQ09ORklHX1dBS0VMT0NLCitpbnQgYW12ZGVjX3dha2VfbG9jayh2b2lkKQoreworCXdha2VfbG9jaygmYW12ZGVjX2xvY2spOworCXJldHVybiAwOworfQorCitpbnQgYW12ZGVjX3dha2VfdW5sb2NrKHZvaWQpCit7CisJd2FrZV91bmxvY2soJmFtdmRlY19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIGFtdmRlY193YWtlX2xvY2soKQorI2RlZmluZSBhbXZkZWNfd2FrZV91bmxvY2soKQorI2VuZGlmCisKK3N0YXRpYyBzMzIgYW1fdmRlY19sb2FkbWNfZXgoc3RydWN0IHZkZWNfcyAqdmRlYywKKwkJY29uc3QgY2hhciAqbmFtZSwgY2hhciAqZGVmLCBzMzIoKmxvYWQpKGNvbnN0IHUzMiAqKSkKK3sKKwlpbnQgZXJyOworCisJaWYgKCF2ZGVjLT5tY19sb2FkZWQpIHsKKwkJaWYgKCFkZWYpIHsKKwkJCWVyciA9IGdldF9kZWNvZGVyX2Zpcm13YXJlX2RhdGEodmRlYy0+Zm9ybWF0LAorCQkJCQkJbmFtZSwgKHU4ICopKHZkZWMtPm1jKSwKKwkJCQkJCSg0MDk2ICogNCAqIDQpKTsKKwkJCWlmIChlcnIgPD0gMCkKKwkJCQlyZXR1cm4gLTE7CisJCX0gZWxzZQorCQkJbWVtY3B5KChjaGFyICopdmRlYy0+bWMsIGRlZiwgc2l6ZW9mKHZkZWMtPm1jKSk7CisKKwkJdmRlYy0+bWNfbG9hZGVkID0gdHJ1ZTsKKwl9CisKKwllcnIgPSAoKmxvYWQpKHZkZWMtPm1jKTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcl9lcnIoImxvYWRpbmcgZmlybXdhcmUgJXMgdG8gdmRlYyByYW0gIGZhaWxlZCFcbiIsIG5hbWUpOworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzMzIgYW1fdmRlY19sb2FkbWNfYnVmX2V4KHN0cnVjdCB2ZGVjX3MgKnZkZWMsCisJCWNoYXIgKmJ1ZiwgaW50IHNpemUsIHMzMigqbG9hZCkoY29uc3QgdTMyICopKQoreworCWludCBlcnI7CisKKwlpZiAoIXZkZWMtPm1jX2xvYWRlZCkgeworCQltZW1jcHkoKHU4ICopKHZkZWMtPm1jKSwgYnVmLCBzaXplKTsKKwkJdmRlYy0+bWNfbG9hZGVkID0gdHJ1ZTsKKwl9CisKKwllcnIgPSAoKmxvYWQpKHZkZWMtPm1jKTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcl9lcnIoImxvYWRpbmcgZmlybXdhcmUgdG8gdmRlYyByYW0gIGZhaWxlZCFcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzMzIgYW1fbG9hZG1jX2V4KGVudW0gdmZvcm1hdF9lIHR5cGUsCisJCWNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKmRlZiwgczMyKCpsb2FkKShjb25zdCB1MzIgKikpCit7CisJY2hhciAqbWNfYWRkciA9IHZtYWxsb2MoNDA5NiAqIDE2KTsKKwljaGFyICpwbWNfYWRkciA9IGRlZjsKKwlpbnQgZXJyOworCisJaWYgKCFkZWYgJiYgbWNfYWRkcikgeworCQlpbnQgbG9hZGVkOworCisJCWxvYWRlZCA9IGdldF9kZWNvZGVyX2Zpcm13YXJlX2RhdGEodHlwZSwKKwkJCQkJbmFtZSwgbWNfYWRkciwgKDQwOTYgKiAxNikpOworCQlpZiAobG9hZGVkID4gMCkKKwkJCXBtY19hZGRyID0gbWNfYWRkcjsKKwl9CisJaWYgKCFwbWNfYWRkcikgeworCQl2ZnJlZShtY19hZGRyKTsKKwkJcmV0dXJuIC0xOworCX0KKwllcnIgPSAoKmxvYWQpKCh1MzIgKikgcG1jX2FkZHIpOworCWlmIChlcnIgPCAwKSB7CisJCXByX2VycigibG9hZGluZyBmaXJtd2FyZSAlcyB0byB2ZGVjIHJhbSAgZmFpbGVkIVxuIiwgbmFtZSk7CisJCXZmcmVlKG1jX2FkZHIpOworCQlyZXR1cm4gZXJyOworCX0KKwl2ZnJlZShtY19hZGRyKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzMzIgYW12ZGVjX2xvYWRtYyhjb25zdCB1MzIgKnApCit7CisJdWxvbmcgdGltZW91dDsKKwlzMzIgcmV0ID0gMDsKKworI2lmZGVmIEFNVkRFQ19VU0VfU1RBVElDX01FTU9SWQorCWlmIChtY19hZGRyID09IE5VTEwpIHsKKyNlbHNlCisJeworI2VuZGlmCisJCW1jX2FkZHIgPSBrbWFsbG9jKE1DX1NJWkUsIEdGUF9LRVJORUwpOworCX0KKworCWlmICghbWNfYWRkcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1jcHkobWNfYWRkciwgcCwgTUNfU0laRSk7CisKKwltY19hZGRyX21hcCA9IGRtYV9tYXBfc2luZ2xlKGdldF92ZGVjX2RldmljZSgpLAorCQltY19hZGRyLCBNQ19TSVpFLCBETUFfVE9fREVWSUNFKTsKKworCVdSSVRFX1ZSRUcoTVBTUiwgMCk7CisJV1JJVEVfVlJFRyhDUFNSLCAwKTsKKworCS8qIFJlYWQgQ0JVUyByZWdpc3RlciBmb3IgdGltaW5nICovCisJdGltZW91dCA9IFJFQURfVlJFRyhNUFNSKTsKKwl0aW1lb3V0ID0gUkVBRF9WUkVHKE1QU1IpOworCisJdGltZW91dCA9IGppZmZpZXMgKyBIWjsKKworCVdSSVRFX1ZSRUcoSU1FTV9ETUFfQURSLCBtY19hZGRyX21hcCk7CisJV1JJVEVfVlJFRyhJTUVNX0RNQV9DT1VOVCwgMHgxMDAwKTsKKwlXUklURV9WUkVHKElNRU1fRE1BX0NUUkwsICgweDgwMDAgfCAoNyA8PCAxNikpKTsKKworCXdoaWxlIChSRUFEX1ZSRUcoSU1FTV9ETUFfQ1RSTCkgJiAweDgwMDApIHsKKwkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJc2NoZWR1bGUoKTsKKwkJZWxzZSB7CisJCQlwcl9lcnIoInZkZWMgbG9hZCBtYyBlcnJvclxuIik7CisJCQlyZXQgPSAtRUJVU1k7CisJCQlicmVhazsKKwkJfQorCX0KKworCWRtYV91bm1hcF9zaW5nbGUoZ2V0X3ZkZWNfZGV2aWNlKCksCisJCW1jX2FkZHJfbWFwLCBNQ19TSVpFLCBETUFfVE9fREVWSUNFKTsKKworI2lmbmRlZiBBTVZERUNfVVNFX1NUQVRJQ19NRU1PUlkKKwlrZnJlZShtY19hZGRyKTsKKwltY19hZGRyID0gTlVMTDsKKyNlbmRpZgorCisJcmV0dXJuIHJldDsKK30KKworczMyIG9wdGVlX2xvYWRfZncoZW51bSB2Zm9ybWF0X2UgdHlwZSwgY29uc3QgY2hhciAqZndfbmFtZSkKK3sKKwlzMzIgcmV0ID0gLTE7CisJdW5zaWduZWQgaW50IGZvcm1hdCA9IEZJUk1XQVJFX01BWDsKKwl1bnNpZ25lZCBpbnQgdmRlYyA9IE9QVEVFX1ZERUNfTEVHRU5DWTsKKwljaGFyICpuYW1lID0gX19nZXRuYW1lKCk7CisJYm9vbCBpc19zd2FwID0gZmFsc2U7CisKKwlzcHJpbnRmKG5hbWUsICIlcyIsIGZ3X25hbWUgPyBmd19uYW1lIDogIm51bGwiKTsKKworCXN3aXRjaCAoKHUzMil0eXBlKSB7CisJY2FzZSBWRk9STUFUX1ZDMToKKwkJZm9ybWF0ID0gVklERU9fREVDX1ZDMTsKKwkJYnJlYWs7CisKKwljYXNlIFZGT1JNQVRfQVZTOgorCQlpZiAoIXN0cmNtcChuYW1lLCAiYXZzX25vX2NhYmFjIikpCisJCQlmb3JtYXQgPSBWSURFT19ERUNfQVZTX05PQ0FCQUM7CisJCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImF2c19tdWx0aSIpKQorCQkJZm9ybWF0ID0gVklERU9fREVDX0FWU19NVUxUSTsKKwkJZWxzZQorCQkJZm9ybWF0ID0gVklERU9fREVDX0FWUzsKKwkJYnJlYWs7CisKKwljYXNlIFZGT1JNQVRfTVBFRzEyOgorCQlpZiAoIXN0cmNtcChuYW1lLCAibXBlZzEyIikpCisJCQlmb3JtYXQgPSBWSURFT19ERUNfTVBFRzEyOworCQllbHNlIGlmICghc3RyY21wKG5hbWUsICJtbXBlZzEyIikpCisJCQlmb3JtYXQgPSBWSURFT19ERUNfTVBFRzEyX01VTFRJOworCQlicmVhazsKKworCWNhc2UgVkZPUk1BVF9NSlBFRzoKKwkJaWYgKCFzdHJjbXAobmFtZSwgIm1tanBlZyIpKQorCQkJZm9ybWF0ID0gVklERU9fREVDX01KUEVHX01VTFRJOworCQllbHNlCisJCQlmb3JtYXQgPSBWSURFT19ERUNfTUpQRUc7CisJCWJyZWFrOworCisJY2FzZSBWRk9STUFUX1ZQOToKKwkJaWYgKCFzdHJjbXAobmFtZSwgInZwOV9tYyIpKQorCQkJZm9ybWF0ID0gVklERU9fREVDX1ZQOTsKKwkJZWxzZQorCQkJZm9ybWF0ID0gVklERU9fREVDX1ZQOV9NTVU7CisJCWJyZWFrOworCisJY2FzZSBWRk9STUFUX0FWUzI6CisJCWZvcm1hdCA9IFZJREVPX0RFQ19BVlMyX01NVTsKKwkJdmRlYyA9IE9QVEVFX1ZERUNfSEVWQzsKKwkJYnJlYWs7CisKKwljYXNlIFZGT1JNQVRfQVYxOgorCQlmb3JtYXQgPSBWSURFT19ERUNfQVYxX01NVTsKKwkJdmRlYyA9IE9QVEVFX1ZERUNfSEVWQzsKKwkJYnJlYWs7CisKKwljYXNlIFZGT1JNQVRfSEVWQzoKKwkJaWYgKCFzdHJjbXAobmFtZSwgImgyNjVfbW11IikpCisJCQlmb3JtYXQgPSBWSURFT19ERUNfSEVWQ19NTVU7CisJCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImhldmNfbW11X3N3YXAiKSkgeworCQkJZm9ybWF0ID0gVklERU9fREVDX0hFVkNfTU1VX1NXQVA7CisJCQl2ZGVjID0gT1BURUVfVkRFQ19IRVZDOworCQkJaXNfc3dhcCA9IHRydWU7CisJCX0gZWxzZQorCQkJZm9ybWF0ID0gVklERU9fREVDX0hFVkM7CisJCWJyZWFrOworCisJY2FzZSBWRk9STUFUX1JFQUw6CisJCWlmICghc3RyY21wKG5hbWUsICJ2cmVhbF9tY184IikpCisJCQlmb3JtYXQgPSBWSURFT19ERUNfUkVBTF9WODsKKwkJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAidnJlYWxfbWNfOSIpKQorCQkJZm9ybWF0ID0gVklERU9fREVDX1JFQUxfVjk7CisJCWJyZWFrOworCisJY2FzZSBWRk9STUFUX01QRUc0OgorCQlpZiAoIXN0cmNtcChuYW1lLCAibW1wZWc0X21jXzUiKSkKKwkJCWZvcm1hdCA9IFZJREVPX0RFQ19NUEVHNF81X01VTFRJOworCQllbHNlIGlmICgoIXN0cmNtcChuYW1lLCAibWgyNjNfbWMiKSkpCisJCQlmb3JtYXQgPSBWSURFT19ERUNfSDI2M19NVUxUSTsKKwkJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAidm1wZWc0X21jXzUiKSkKKwkJCWZvcm1hdCA9IFZJREVPX0RFQ19NUEVHNF81OworCQllbHNlIGlmICghc3RyY21wKG5hbWUsICJoMjYzX21jIikpCisJCQlmb3JtYXQgPSBWSURFT19ERUNfSDI2MzsKKwkJLypub3Qgc3VwcG9ydCBub3cqLworCQllbHNlIGlmICghc3RyY21wKG5hbWUsICJ2bXBlZzRfbWNfMzExIikpCisJCQlmb3JtYXQgPSBWSURFT19ERUNfTVBFRzRfMzsKKwkJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAidm1wZWc0X21jXzQiKSkKKwkJCWZvcm1hdCA9IFZJREVPX0RFQ19NUEVHNF80OworCQlicmVhazsKKworCWNhc2UgVkZPUk1BVF9IMjY0XzRLMks6CisJCWlmICghc3RyY21wKG5hbWUsICJzaW5nbGVfY29yZSIpKQorCQkJZm9ybWF0ID0gVklERU9fREVDX0gyNjRfNGsyS19TSU5HTEU7CisJCWVsc2UKKwkJCWZvcm1hdCA9IFZJREVPX0RFQ19IMjY0XzRrMks7CisJCWJyZWFrOworCisJY2FzZSBWRk9STUFUX0gyNjRNVkM6CisJCWZvcm1hdCA9IFZJREVPX0RFQ19IMjY0X01WQzsKKwkJYnJlYWs7CisKKwljYXNlIFZGT1JNQVRfSDI2NDoKKwkJaWYgKCFzdHJjbXAobmFtZSwgIm1oMjY0IikpCisJCQlmb3JtYXQgPSBWSURFT19ERUNfSDI2NF9NVUxUSTsKKwkJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAibWgyNjRfbW11IikpIHsKKwkJCWZvcm1hdCA9IFZJREVPX0RFQ19IMjY0X01VTFRJX01NVTsKKwkJCXZkZWMgPSBPUFRFRV9WREVDX0hFVkM7CisJCX0gZWxzZQorCQkJZm9ybWF0ID0gVklERU9fREVDX0gyNjQ7CisJCWJyZWFrOworCWNhc2UgVkZPUk1BVF9KUEVHX0VOQzoKKwkJZm9ybWF0ID0gVklERU9fRU5DX0pQRUc7CisJCXZkZWMgPSBPUFRFRV9WREVDX0hDREVDOworCQlicmVhazsKKwljYXNlIFZGT1JNQVRfSDI2NF9FTkM6CisJCWZvcm1hdCA9IFZJREVPX0VOQ19IMjY0OworCQl2ZGVjID0gT1BURUVfVkRFQ19IQ0RFQzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfaW5mbygiVW5rbm93IHZkZWMgZm9ybWF0OiAldVxuIiwgKHUzMil0eXBlKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGZvcm1hdCA8IEZJUk1XQVJFX01BWCkgeworCQlpZiAoaXNfc3dhcCkKKwkJCXJldCA9IHRlZV9sb2FkX3ZpZGVvX2Z3X3N3YXAoZm9ybWF0LCB2ZGVjLCBpc19zd2FwKTsKKwkJZWxzZQorCQkJcmV0ID0gdGVlX2xvYWRfdmlkZW9fZncoZm9ybWF0LCB2ZGVjKTsKKwl9CisKKwlfX3B1dG5hbWUobmFtZSk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChvcHRlZV9sb2FkX2Z3KTsKKworczMyIGFtdmRlY19sb2FkbWNfZXgoZW51bSB2Zm9ybWF0X2UgdHlwZSwgY29uc3QgY2hhciAqbmFtZSwgY2hhciAqZGVmKQoreworCWlmICh0ZWVfZW5hYmxlZCgpKQorCQlyZXR1cm4gb3B0ZWVfbG9hZF9mdyh0eXBlLCBuYW1lKTsKKwllbHNlCisJCXJldHVybiBhbV9sb2FkbWNfZXgodHlwZSwgbmFtZSwgZGVmLCAmYW12ZGVjX2xvYWRtYyk7Cit9CitFWFBPUlRfU1lNQk9MKGFtdmRlY19sb2FkbWNfZXgpOworCitzMzIgYW12ZGVjX3ZkZWNfbG9hZG1jX2V4KGVudW0gdmZvcm1hdF9lIHR5cGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJc3RydWN0IHZkZWNfcyAqdmRlYywgY2hhciAqZGVmKQoreworCWlmICh0ZWVfZW5hYmxlZCgpKQorCQlyZXR1cm4gb3B0ZWVfbG9hZF9mdyh0eXBlLCBuYW1lKTsKKwllbHNlCisJCXJldHVybiBhbV92ZGVjX2xvYWRtY19leCh2ZGVjLCBuYW1lLCBkZWYsICZhbXZkZWNfbG9hZG1jKTsKK30KK0VYUE9SVF9TWU1CT0woYW12ZGVjX3ZkZWNfbG9hZG1jX2V4KTsKKworczMyIGFtdmRlY192ZGVjX2xvYWRtY19idWZfZXgoZW51bSB2Zm9ybWF0X2UgdHlwZSwgY29uc3QgY2hhciAqbmFtZSwKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjLCBjaGFyICpidWYsIGludCBzaXplKQoreworCWlmICh0ZWVfZW5hYmxlZCgpKQorCQlyZXR1cm4gb3B0ZWVfbG9hZF9mdyh0eXBlLCBuYW1lKTsKKwllbHNlCisJCXJldHVybiBhbV92ZGVjX2xvYWRtY19idWZfZXgodmRlYywgYnVmLCBzaXplLCAmYW12ZGVjX2xvYWRtYyk7Cit9CitFWFBPUlRfU1lNQk9MKGFtdmRlY192ZGVjX2xvYWRtY19idWZfZXgpOworCitzdGF0aWMgczMyIGFtdmRlYzJfbG9hZG1jKGNvbnN0IHUzMiAqcCkKK3sKKwlpZiAoaGFzX3ZkZWMyKCkpIHsKKwkJdWxvbmcgdGltZW91dDsKKwkJczMyIHJldCA9IDA7CisKKyNpZmRlZiBBTVZERUNfVVNFX1NUQVRJQ19NRU1PUlkKKwkJaWYgKG1jX2FkZHIgPT0gTlVMTCkgeworI2Vsc2UKKwkJeworI2VuZGlmCisJCQltY19hZGRyID0ga21hbGxvYyhNQ19TSVpFLCBHRlBfS0VSTkVMKTsKKwkJfQorCisJCWlmICghbWNfYWRkcikKKwkJCXJldHVybiAtRU5PTUVNOworCisJCW1lbWNweShtY19hZGRyLCBwLCBNQ19TSVpFKTsKKworCQltY19hZGRyX21hcCA9IGRtYV9tYXBfc2luZ2xlKGdldF92ZGVjX2RldmljZSgpLAorCQkJbWNfYWRkciwgTUNfU0laRSwgRE1BX1RPX0RFVklDRSk7CisKKwkJV1JJVEVfVlJFRyhWREVDMl9NUFNSLCAwKTsKKwkJV1JJVEVfVlJFRyhWREVDMl9DUFNSLCAwKTsKKworCQkvKiBSZWFkIENCVVMgcmVnaXN0ZXIgZm9yIHRpbWluZyAqLworCQl0aW1lb3V0ID0gUkVBRF9WUkVHKFZERUMyX01QU1IpOworCQl0aW1lb3V0ID0gUkVBRF9WUkVHKFZERUMyX01QU1IpOworCisJCXRpbWVvdXQgPSBqaWZmaWVzICsgSFo7CisKKwkJV1JJVEVfVlJFRyhWREVDMl9JTUVNX0RNQV9BRFIsIG1jX2FkZHJfbWFwKTsKKwkJV1JJVEVfVlJFRyhWREVDMl9JTUVNX0RNQV9DT1VOVCwgMHgxMDAwKTsKKwkJV1JJVEVfVlJFRyhWREVDMl9JTUVNX0RNQV9DVFJMLCAoMHg4MDAwIHwgKDcgPDwgMTYpKSk7CisKKwkJd2hpbGUgKFJFQURfVlJFRyhWREVDMl9JTUVNX0RNQV9DVFJMKSAmIDB4ODAwMCkgeworCQkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJCXNjaGVkdWxlKCk7CisJCQllbHNlIHsKKwkJCQlwcl9lcnIoInZkZWMyIGxvYWQgbWMgZXJyb3JcbiIpOworCQkJCXJldCA9IC1FQlVTWTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWRtYV91bm1hcF9zaW5nbGUoZ2V0X3ZkZWNfZGV2aWNlKCksCisJCQltY19hZGRyX21hcCwgTUNfU0laRSwgRE1BX1RPX0RFVklDRSk7CisKKyNpZm5kZWYgQU1WREVDX1VTRV9TVEFUSUNfTUVNT1JZCisJCWtmcmVlKG1jX2FkZHIpOworCQltY19hZGRyID0gTlVMTDsKKyNlbmRpZgorCisJCXJldHVybiByZXQ7CisJfSBlbHNlCisJCXJldHVybiAwOworfQorCitzMzIgYW12ZGVjMl9sb2FkbWNfZXgoZW51bSB2Zm9ybWF0X2UgdHlwZSwgY29uc3QgY2hhciAqbmFtZSwgY2hhciAqZGVmKQoreworCWlmIChoYXNfdmRlYzIoKSkKKwkJcmV0dXJuIGFtX2xvYWRtY19leCh0eXBlLCBuYW1lLCBkZWYsICZhbXZkZWMyX2xvYWRtYyk7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYW12ZGVjMl9sb2FkbWNfZXgpOworCitzMzIgYW1oY29kZWNfbG9hZG1jKGNvbnN0IHUzMiAqcCkKK3sKKyNpZmRlZiBBTVZERUNfVVNFX1NUQVRJQ19NRU1PUlkKKwlpZiAobWNfYWRkciA9PSBOVUxMKSB7CisjZWxzZQorCXsKKyNlbmRpZgorCQltY19hZGRyID0ga21hbGxvYyhNQ19TSVpFLCBHRlBfS0VSTkVMKTsKKwl9CisKKwlpZiAoIW1jX2FkZHIpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtY3B5KG1jX2FkZHIsIHAsIE1DX1NJWkUpOworCisJbWNfYWRkcl9tYXAgPSBkbWFfbWFwX3NpbmdsZShnZXRfdmRlY19kZXZpY2UoKSwKKwkJCW1jX2FkZHIsIE1DX1NJWkUsIERNQV9UT19ERVZJQ0UpOworCisJV1JJVEVfVlJFRyhIQ09ERUNfSU1FTV9ETUFfQURSLCBtY19hZGRyX21hcCk7CisJV1JJVEVfVlJFRyhIQ09ERUNfSU1FTV9ETUFfQ09VTlQsIDB4MTAwKTsKKwlXUklURV9WUkVHKEhDT0RFQ19JTUVNX0RNQV9DVFJMLCAoMHg4MDAwIHwgKDcgPDwgMTYpKSk7CisKKwl3aGlsZSAoUkVBRF9WUkVHKEhDT0RFQ19JTUVNX0RNQV9DVFJMKSAmIDB4ODAwMCkKKwkJdWRlbGF5KDEwMDApOworCisJZG1hX3VubWFwX3NpbmdsZShnZXRfdmRlY19kZXZpY2UoKSwKKwkJCW1jX2FkZHJfbWFwLCBNQ19TSVpFLCBETUFfVE9fREVWSUNFKTsKKworI2lmbmRlZiBBTVZERUNfVVNFX1NUQVRJQ19NRU1PUlkKKwlrZnJlZShtY19hZGRyKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGFtaGNvZGVjX2xvYWRtYyk7CisKK3MzMiBhbWhjb2RlY19sb2FkbWNfZXgoZW51bSB2Zm9ybWF0X2UgdHlwZSwgY29uc3QgY2hhciAqbmFtZSwgY2hhciAqZGVmKQoreworCXJldHVybiBhbV9sb2FkbWNfZXgodHlwZSwgbmFtZSwgZGVmLCAmYW1oY29kZWNfbG9hZG1jKTsKK30KK0VYUE9SVF9TWU1CT0woYW1oY29kZWNfbG9hZG1jX2V4KTsKKworc3RhdGljIHMzMiBhbWhldmNfbG9hZG1jKGNvbnN0IHUzMiAqcCkKK3sKKwl1bG9uZyB0aW1lb3V0OworCXMzMiByZXQgPSAwOworCisJaWYgKGhhc19oZXZjX3ZkZWMoKSkgeworI2lmZGVmIEFNVkRFQ19VU0VfU1RBVElDX01FTU9SWQorCQlpZiAobWNfYWRkciA9PSBOVUxMKSB7CisjZWxzZQorCQl7CisjZW5kaWYKKwkJCW1jX2FkZHIgPSBrbWFsbG9jKE1DX1NJWkUsIEdGUF9LRVJORUwpOworCQl9CisKKwkJaWYgKCFtY19hZGRyKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJbWVtY3B5KG1jX2FkZHIsIHAsIE1DX1NJWkUpOworCisJCW1jX2FkZHJfbWFwID0KKwkJCWRtYV9tYXBfc2luZ2xlKGdldF92ZGVjX2RldmljZSgpLAorCQkJbWNfYWRkciwgTUNfU0laRSwgRE1BX1RPX0RFVklDRSk7CisKKwkJV1JJVEVfVlJFRyhIRVZDX01QU1IsIDApOworCQlXUklURV9WUkVHKEhFVkNfQ1BTUiwgMCk7CisKKwkJLyogUmVhZCBDQlVTIHJlZ2lzdGVyIGZvciB0aW1pbmcgKi8KKwkJdGltZW91dCA9IFJFQURfVlJFRyhIRVZDX01QU1IpOworCQl0aW1lb3V0ID0gUkVBRF9WUkVHKEhFVkNfTVBTUik7CisKKwkJdGltZW91dCA9IGppZmZpZXMgKyBIWjsKKworCQlXUklURV9WUkVHKEhFVkNfSU1FTV9ETUFfQURSLCBtY19hZGRyX21hcCk7CisJCVdSSVRFX1ZSRUcoSEVWQ19JTUVNX0RNQV9DT1VOVCwgMHgxMDAwKTsKKwkJaWYgKChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3KSB8fAorCQkJKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDMpKQorCQkJV1JJVEVfVlJFRyhIRVZDX0lNRU1fRE1BX0NUUkwsICgweDgwMDAgfCAoMHhmIDw8IDE2KSkpOworCQllbHNlCisJCQlXUklURV9WUkVHKEhFVkNfSU1FTV9ETUFfQ1RSTCwgKDB4ODAwMCB8ICgweDcgPDwgMTYpKSk7CisKKwkJd2hpbGUgKFJFQURfVlJFRyhIRVZDX0lNRU1fRE1BX0NUUkwpICYgMHg4MDAwKSB7CisJCQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpCisJCQkJc2NoZWR1bGUoKTsKKwkJCWVsc2UgeworCQkJCXByX2VycigiaGV2YyBsb2FkIG1jIGVycm9yXG4iKTsKKwkJCQlyZXQgPSAtRUJVU1k7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlkbWFfdW5tYXBfc2luZ2xlKGdldF92ZGVjX2RldmljZSgpLAorCQkJCW1jX2FkZHJfbWFwLCBNQ19TSVpFLCBETUFfVE9fREVWSUNFKTsKKworI2lmbmRlZiBBTVZERUNfVVNFX1NUQVRJQ19NRU1PUlkKKwkJa2ZyZWUobWNfYWRkcik7CisJCW1jX2FkZHIgPSBOVUxMOworI2VuZGlmCisJfQorCisJcmV0dXJuIHJldDsKK30KKworczMyIGFtaGV2Y19sb2FkbWNfZXgoZW51bSB2Zm9ybWF0X2UgdHlwZSwgY29uc3QgY2hhciAqbmFtZSwgY2hhciAqZGVmKQoreworCWlmIChoYXNfaGV2Y192ZGVjKCkpCisJCWlmICh0ZWVfZW5hYmxlZCgpKQorCQkJcmV0dXJuIG9wdGVlX2xvYWRfZncodHlwZSwgbmFtZSk7CisJCWVsc2UKKwkJCXJldHVybiBhbV9sb2FkbWNfZXgodHlwZSwgbmFtZSwgZGVmLCAmYW1oZXZjX2xvYWRtYyk7CisJZWxzZQorCQlyZXR1cm4gLTE7Cit9CitFWFBPUlRfU1lNQk9MKGFtaGV2Y19sb2FkbWNfZXgpOworCitzMzIgYW1oZXZjX3ZkZWNfbG9hZG1jX2V4KGVudW0gdmZvcm1hdF9lIHR5cGUsIHN0cnVjdCB2ZGVjX3MgKnZkZWMsCisJY29uc3QgY2hhciAqbmFtZSwgY2hhciAqZGVmKQoreworCWlmIChoYXNfaGV2Y192ZGVjKCkpCisJCWlmICh0ZWVfZW5hYmxlZCgpKQorCQkJcmV0dXJuIG9wdGVlX2xvYWRfZncodHlwZSwgbmFtZSk7CisJCWVsc2UKKwkJCXJldHVybiBhbV92ZGVjX2xvYWRtY19leCh2ZGVjLCBuYW1lLCBkZWYsICZhbWhldmNfbG9hZG1jKTsKKwllbHNlCisJCXJldHVybiAtMTsKK30KK0VYUE9SVF9TWU1CT0woYW1oZXZjX3ZkZWNfbG9hZG1jX2V4KTsKKwordm9pZCBhbXZkZWNfc3RhcnQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfV0FLRUxPQ0sKKwlhbXZkZWNfd2FrZV9sb2NrKCk7CisjZW5kaWYKKworCS8qICNpZiBNRVNPTl9DUFVfVFlQRSA+PSBNRVNPTl9DUFVfVFlQRV9NRVNPTjYgKi8KKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9NNikgeworCQlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMCk7CisJCVJFQURfVlJFRyhET1NfU1dfUkVTRVQwKTsKKwkJUkVBRF9WUkVHKERPU19TV19SRVNFVDApOworCisJCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgKDEgPDwgMTIpIHwgKDEgPDwgMTEpKTsKKwkJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAwKTsKKworCQlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMCk7CisJCVJFQURfVlJFRyhET1NfU1dfUkVTRVQwKTsKKwkJUkVBRF9WUkVHKERPU19TV19SRVNFVDApOworCX0gZWxzZSB7CisJCS8qICNlbHNlICovCisJCS8qIGFkZGl0aW9uYWwgY2J1cyBkdW1teSByZWdpc3RlciByZWFkaW5nIGZvciB0aW1pbmcgY29udHJvbCAqLworCQlSRUFEX1JFU0VUX1JFRyhSRVNFVDBfUkVHSVNURVIpOworCQlSRUFEX1JFU0VUX1JFRyhSRVNFVDBfUkVHSVNURVIpOworCQlSRUFEX1JFU0VUX1JFRyhSRVNFVDBfUkVHSVNURVIpOworCQlSRUFEX1JFU0VUX1JFRyhSRVNFVDBfUkVHSVNURVIpOworCisJCVdSSVRFX1JFU0VUX1JFRyhSRVNFVDBfUkVHSVNURVIsIFJFU0VUX1ZDUFUgfCBSRVNFVF9DQ1BVKTsKKworCQlSRUFEX1JFU0VUX1JFRyhSRVNFVDBfUkVHSVNURVIpOworCQlSRUFEX1JFU0VUX1JFRyhSRVNFVDBfUkVHSVNURVIpOworCQlSRUFEX1JFU0VUX1JFRyhSRVNFVDBfUkVHSVNURVIpOworCX0KKwkvKiAjZW5kaWYgKi8KKworCVdSSVRFX1ZSRUcoTVBTUiwgMHgwMDAxKTsKK30KK0VYUE9SVF9TWU1CT0woYW12ZGVjX3N0YXJ0KTsKKwordm9pZCBhbXZkZWMyX3N0YXJ0KHZvaWQpCit7CisJaWYgKGhhc192ZGVjMigpKSB7CisjaWZkZWYgQ09ORklHX1dBS0VMT0NLCisJCWFtdmRlY193YWtlX2xvY2soKTsKKyNlbmRpZgorCisJCVJFQURfVlJFRyhET1NfU1dfUkVTRVQyKTsKKwkJUkVBRF9WUkVHKERPU19TV19SRVNFVDIpOworCQlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMik7CisKKwkJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQyLCAoMSA8PCAxMikgfCAoMSA8PCAxMSkpOworCQlXUklURV9WUkVHKERPU19TV19SRVNFVDIsIDApOworCisJCVJFQURfVlJFRyhET1NfU1dfUkVTRVQyKTsKKwkJUkVBRF9WUkVHKERPU19TV19SRVNFVDIpOworCQlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMik7CisKKwkJV1JJVEVfVlJFRyhWREVDMl9NUFNSLCAweDAwMDEpOworCX0KK30KK0VYUE9SVF9TWU1CT0woYW12ZGVjMl9zdGFydCk7CisKK3ZvaWQgYW1oY29kZWNfc3RhcnQodm9pZCkKK3sKKwlXUklURV9WUkVHKEhDT0RFQ19NUFNSLCAweDAwMDEpOworfQorRVhQT1JUX1NZTUJPTChhbWhjb2RlY19zdGFydCk7CisKK3ZvaWQgYW1oZXZjX3N0YXJ0KHZvaWQpCit7CisKKwlpZiAoaGFzX2hldmNfdmRlYygpKSB7CisjaWZkZWYgQ09ORklHX1dBS0VMT0NLCisJCWFtdmRlY193YWtlX2xvY2soKTsKKyNlbmRpZgorCisJCVJFQURfVlJFRyhET1NfU1dfUkVTRVQzKTsKKwkJUkVBRF9WUkVHKERPU19TV19SRVNFVDMpOworCQlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMyk7CisKKwkJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQzLCAoMSA8PCAxMikgfCAoMSA8PCAxMSkpOworCQlXUklURV9WUkVHKERPU19TV19SRVNFVDMsIDApOworCisJCVJFQURfVlJFRyhET1NfU1dfUkVTRVQzKTsKKwkJUkVBRF9WUkVHKERPU19TV19SRVNFVDMpOworCQlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMyk7CisKKwkJV1JJVEVfVlJFRyhIRVZDX01QU1IsIDB4MDAwMSk7CisJfQorfQorRVhQT1JUX1NZTUJPTChhbWhldmNfc3RhcnQpOworCit2b2lkIGFtdmRlY19zdG9wKHZvaWQpCit7CisJdWxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBIWi8xMDsKKworCVdSSVRFX1ZSRUcoTVBTUiwgMCk7CisJV1JJVEVfVlJFRyhDUFNSLCAwKTsKKworCXdoaWxlIChSRUFEX1ZSRUcoSU1FTV9ETUFfQ1RSTCkgJiAweDgwMDApIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCisJCQlicmVhazsKKwl9CisKKwl0aW1lb3V0ID0gamlmZmllcyArIEhaLzEwOworCXdoaWxlIChSRUFEX1ZSRUcoTE1FTV9ETUFfQ1RSTCkgJiAweDgwMDApIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCisJCQlicmVhazsKKwl9CisKKwkvKiAjaWYgTUVTT05fQ1BVX1RZUEUgPj0gTUVTT05fQ1BVX1RZUEVfTUVTT042ICovCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfTTYpIHsKKwkJUkVBRF9WUkVHKERPU19TV19SRVNFVDApOworCQlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMCk7CisJCVJFQURfVlJFRyhET1NfU1dfUkVTRVQwKTsKKworCQlXUklURV9WUkVHKERPU19TV19SRVNFVDAsICgxIDw8IDEyKSB8ICgxIDw8IDExKSk7CisJCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgMCk7CisKKwkJUkVBRF9WUkVHKERPU19TV19SRVNFVDApOworCQlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMCk7CisJCVJFQURfVlJFRyhET1NfU1dfUkVTRVQwKTsKKwl9IGVsc2UgeworCQkvKiAjZWxzZSAqLworCQlXUklURV9SRVNFVF9SRUcoUkVTRVQwX1JFR0lTVEVSLCBSRVNFVF9WQ1BVIHwgUkVTRVRfQ0NQVSk7CisKKwkJLyogYWRkaXRpb25hbCBjYnVzIGR1bW15IHJlZ2lzdGVyIHJlYWRpbmcgZm9yIHRpbWluZyBjb250cm9sICovCisJCVJFQURfUkVTRVRfUkVHKFJFU0VUMF9SRUdJU1RFUik7CisJCVJFQURfUkVTRVRfUkVHKFJFU0VUMF9SRUdJU1RFUik7CisJCVJFQURfUkVTRVRfUkVHKFJFU0VUMF9SRUdJU1RFUik7CisJCVJFQURfUkVTRVRfUkVHKFJFU0VUMF9SRUdJU1RFUik7CisJfQorCS8qICNlbmRpZiAqLworCisjaWZkZWYgQ09ORklHX1dBS0VMT0NLCisJYW12ZGVjX3dha2VfdW5sb2NrKCk7CisjZW5kaWYKK30KK0VYUE9SVF9TWU1CT0woYW12ZGVjX3N0b3ApOworCit2b2lkIGFtdmRlYzJfc3RvcCh2b2lkKQoreworCWlmIChoYXNfdmRlYzIoKSkgeworCQl1bG9uZyB0aW1lb3V0ID0gamlmZmllcyArIEhaLzEwOworCisJCVdSSVRFX1ZSRUcoVkRFQzJfTVBTUiwgMCk7CisJCVdSSVRFX1ZSRUcoVkRFQzJfQ1BTUiwgMCk7CisKKwkJd2hpbGUgKFJFQURfVlJFRyhWREVDMl9JTUVNX0RNQV9DVFJMKSAmIDB4ODAwMCkgeworCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCisJCQkJYnJlYWs7CisJCX0KKworCQlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMik7CisJCVJFQURfVlJFRyhET1NfU1dfUkVTRVQyKTsKKwkJUkVBRF9WUkVHKERPU19TV19SRVNFVDIpOworCisjaWZkZWYgQ09ORklHX1dBS0VMT0NLCisJCWFtdmRlY193YWtlX3VubG9jaygpOworI2VuZGlmCisJfQorfQorRVhQT1JUX1NZTUJPTChhbXZkZWMyX3N0b3ApOworCit2b2lkIGFtaGNvZGVjX3N0b3Aodm9pZCkKK3sKKwlXUklURV9WUkVHKEhDT0RFQ19NUFNSLCAwKTsKK30KK0VYUE9SVF9TWU1CT0woYW1oY29kZWNfc3RvcCk7CisKK3ZvaWQgYW1oZXZjX3N0b3Aodm9pZCkKK3sKKwlpZiAoaGFzX2hldmNfdmRlYygpKSB7CisJCXVsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgSFovMTA7CisKKwkJV1JJVEVfVlJFRyhIRVZDX01QU1IsIDApOworCQlXUklURV9WUkVHKEhFVkNfQ1BTUiwgMCk7CisKKwkJd2hpbGUgKFJFQURfVlJFRyhIRVZDX0lNRU1fRE1BX0NUUkwpICYgMHg4MDAwKSB7CisJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCQlicmVhazsKKwkJfQorCisJCXRpbWVvdXQgPSBqaWZmaWVzICsgSFovMTA7CisJCXdoaWxlIChSRUFEX1ZSRUcoSEVWQ19MTUVNX0RNQV9DVFJMKSAmIDB4ODAwMCkgeworCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCisJCQkJYnJlYWs7CisJCX0KKworCQlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMyk7CisJCVJFQURfVlJFRyhET1NfU1dfUkVTRVQzKTsKKwkJUkVBRF9WUkVHKERPU19TV19SRVNFVDMpOworCisjaWZkZWYgQ09ORklHX1dBS0VMT0NLCisJCWFtdmRlY193YWtlX3VubG9jaygpOworI2VuZGlmCisJfQorfQorRVhQT1JUX1NZTUJPTChhbWhldmNfc3RvcCk7CisKK3ZvaWQgYW12ZGVjX2VuYWJsZSh2b2lkKQoreworCWFtdmRlY19wZ19lbmFibGUodHJ1ZSk7Cit9CitFWFBPUlRfU1lNQk9MKGFtdmRlY19lbmFibGUpOworCit2b2lkIGFtdmRlY19kaXNhYmxlKHZvaWQpCit7CisJYW12ZGVjX3BnX2VuYWJsZShmYWxzZSk7Cit9CitFWFBPUlRfU1lNQk9MKGFtdmRlY19kaXNhYmxlKTsKKwordm9pZCBhbXZkZWMyX2VuYWJsZSh2b2lkKQoreworCWlmIChoYXNfdmRlYzIoKSkKKwkJYW12ZGVjMl9wZ19lbmFibGUodHJ1ZSk7Cit9CitFWFBPUlRfU1lNQk9MKGFtdmRlYzJfZW5hYmxlKTsKKwordm9pZCBhbXZkZWMyX2Rpc2FibGUodm9pZCkKK3sKKwlpZiAoaGFzX3ZkZWMyKCkpCisJCWFtdmRlYzJfcGdfZW5hYmxlKGZhbHNlKTsKK30KK0VYUE9SVF9TWU1CT0woYW12ZGVjMl9kaXNhYmxlKTsKKwordm9pZCBhbWhldmNfZW5hYmxlKHZvaWQpCit7CisJaWYgKGhhc19oZXZjX3ZkZWMoKSkKKwkJYW1oZXZjX3BnX2VuYWJsZSh0cnVlKTsKK30KK0VYUE9SVF9TWU1CT0woYW1oZXZjX2VuYWJsZSk7CisKK3ZvaWQgYW1oZXZjX2Rpc2FibGUodm9pZCkKK3sKKwlpZiAoaGFzX2hldmNfdmRlYygpKQorCQlhbWhldmNfcGdfZW5hYmxlKGZhbHNlKTsKK30KK0VYUE9SVF9TWU1CT0woYW1oZXZjX2Rpc2FibGUpOworCisjaWZkZWYgQ09ORklHX1BNCitpbnQgYW12ZGVjX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgZXZlbnQpCit7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9ICooc3RydWN0IHZkZWNfcyAqKilkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOzsKKworCWlmICh2ZGVjKSB7CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHZkZWMtPmlkbGVfd2FpdCwKKwkJCSh2ZGVjLT5zdGF0dXMgIT0gVkRFQ19TVEFUVVNfQUNUSVZFKSwKKwkJCW1zZWNzX3RvX2ppZmZpZXMoMTAwKSk7CisJfQorCisJYW12ZGVjX3BnX2VuYWJsZShmYWxzZSk7CisKKwkvKiAjaWYgTUVTT05fQ1BVX1RZUEUgPj0gTUVTT05fQ1BVX1RZUEVfTUVTT042VFZEICovCisJaWYgKGhhc192ZGVjMigpKQorCQlhbXZkZWMyX3BnX2VuYWJsZShmYWxzZSk7CisJLyogI2VuZGlmICovCisKKwlpZiAoaGFzX2hldmNfdmRlYygpKQorCQlhbWhldmNfcGdfZW5hYmxlKGZhbHNlKTsKKwkvKnZkZWNfc2V0X3N1c3BlbmRfY2xrKDEsIDApOyovLypERUJVR19UTVAqLworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChhbXZkZWNfc3VzcGVuZCk7CisKK2ludCBhbXZkZWNfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlhbXZkZWNfcGdfZW5hYmxlKHRydWUpOworCisJLyogI2lmIE1FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09ONlRWRCAqLworCWlmIChoYXNfdmRlYzIoKSkKKwkJYW12ZGVjMl9wZ19lbmFibGUodHJ1ZSk7CisJLyogI2VuZGlmICovCisKKwkvKiAjaWYgTUVTT05fQ1BVX1RZUEUgPj0gTUVTT05fQ1BVX1RZUEVfTUVTT044ICovCisJaWYgKGhhc19oZXZjX3ZkZWMoKSkKKwkJYW1oZXZjX3BnX2VuYWJsZSh0cnVlKTsKKwkvKiAjZW5kaWYgKi8KKwkvKnZkZWNfc2V0X3N1c3BlbmRfY2xrKDAsIDApOyovLypERUJVR19UTVAqLworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChhbXZkZWNfcmVzdW1lKTsKKworaW50IGFtaGV2Y19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IGV2ZW50KQoreworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSAqKHN0cnVjdCB2ZGVjX3MgKiopZGV2LT5kZXYucGxhdGZvcm1fZGF0YTs7CisKKwlpZiAodmRlYykgeworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh2ZGVjLT5pZGxlX3dhaXQsCisJCQkodmRlYy0+c3RhdHVzICE9IFZERUNfU1RBVFVTX0FDVElWRSksCisJCQltc2Vjc190b19qaWZmaWVzKDEwMCkpOworCX0KKworCWlmIChoYXNfaGV2Y192ZGVjKCkpIHsKKwkJYW1oZXZjX3BnX2VuYWJsZShmYWxzZSk7CisJCS8qdmRlY19zZXRfc3VzcGVuZF9jbGsoMSwgMSk7Ki8vKkRFQlVHX1RNUCovCisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChhbWhldmNfc3VzcGVuZCk7CisKK2ludCBhbWhldmNfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlpZiAoaGFzX2hldmNfdmRlYygpKSB7CisJCWFtaGV2Y19wZ19lbmFibGUodHJ1ZSk7CisJCS8qdmRlY19zZXRfc3VzcGVuZF9jbGsoMCwgMSk7Ki8vKkRFQlVHX1RNUCovCisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChhbWhldmNfcmVzdW1lKTsKKworCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19XQUtFTE9DSworCitzdGF0aWMgaW50IHZkZWNfaXNfcGF1c2VkKHZvaWQpCit7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgb2xkX3dwID0gLTEsIG9sZF9ycCA9IC0xLCBvbGRfbGV2ZWwgPSAtMTsKKwl1bnNpZ25lZCBsb25nIHdwLCBycCwgbGV2ZWw7CisJc3RhdGljIGludCBwYXVzZWRfdGltZTsKKworCS8qICNpZiBNRVNPTl9DUFVfVFlQRSA+PSBNRVNPTl9DUFVfVFlQRV9NRVNPTjggKi8KKwlpZiAoaGFzX2hldmNfdmRlYygpKSB7CisJCWlmICgodmRlY19vbihWREVDX0hFVkMpKQorCQkJJiYgKFJFQURfVlJFRyhIRVZDX1NUUkVBTV9DT05UUk9MKSAmIDEpKSB7CisJCQl3cCA9IFJFQURfVlJFRyhIRVZDX1NUUkVBTV9XUl9QVFIpOworCQkJcnAgPSBSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSKTsKKwkJCWxldmVsID0gUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0xFVkVMKTsKKwkJfSBlbHNlIHsKKwkJCXdwID0gUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1dQKTsKKwkJCXJwID0gUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKTsKKwkJCWxldmVsID0gUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKTsKKwkJfQorCX0gZWxzZQorCQkvKiAjZW5kaWYgKi8KKwl7CisJCXdwID0gUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1dQKTsKKwkJcnAgPSBSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApOworCQlsZXZlbCA9IFJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCk7CisJfQorCS8qaGF2ZSBkYXRhLGJ1dCBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwgKi8KKwlpZiAoKHJwID09IG9sZF9ycCAmJiBsZXZlbCA+IDEwMjQpIHx8CisJCShycCA9PSBvbGRfcnAgJiYgd3AgPT0gb2xkX3dwICYmIGxldmVsID09IG9sZF9sZXZlbCkpIHsKKwkJLypubyB3cml0ZSAmJiBub3QgcmVhZCAqLworCQlwYXVzZWRfdGltZSsrOworCX0gZWxzZSB7CisJCXBhdXNlZF90aW1lID0gMDsKKwl9CisJb2xkX3dwID0gd3A7IG9sZF9ycCA9IHJwOyBvbGRfbGV2ZWwgPSBsZXZlbDsKKwlpZiAocGF1c2VkX3RpbWUgPiAxMCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBhbXZkZXZfcGF1c2Uodm9pZCkKK3sKKwl2aWRlb19ydW5uaW5nID0gMDsKKwl2aWRlb19zdGF0ZWRfY2hhbmdlZCA9IDE7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGFtdmRldl9wYXVzZSk7CisKK2ludCBhbXZkZXZfcmVzdW1lKHZvaWQpCit7CisJdmlkZW9fcnVubmluZyA9IDE7CisJdmlkZW9fc3RhdGVkX2NoYW5nZWQgPSAxOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChhbXZkZXZfcmVzdW1lKTsKKworc3RhdGljIHZvaWQgdmRlY19wYXVzZWRfY2hlY2tfdGltZXIodW5zaWduZWQgbG9uZyBhcmcpCit7CisJaWYgKHZpZGVvX3N0YXRlZF9jaGFuZ2VkKSB7CisJCWlmICghdmlkZW9fcnVubmluZykgeworCQkJaWYgKHZkZWNfaXNfcGF1c2VkKCkpIHsKKwkJCQlwcl9pbmZvKCJ2ZGVjIHBhdXNlZCBhbmQgcmVsZWFzZSB3YWtlbG9jayBub3dcbiIpOworCQkJCWFtdmRlY193YWtlX3VubG9jaygpOworCQkJCXZpZGVvX3N0YXRlZF9jaGFuZ2VkID0gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWFtdmRlY193YWtlX2xvY2soKTsKKwkJCXZpZGVvX3N0YXRlZF9jaGFuZ2VkID0gMDsKKwkJfQorCX0KKwltb2RfdGltZXIoJmFtdmRldnRpbWVyLCBqaWZmaWVzICsgV0FLRV9DSEVDS19JTlRFUlZBTCk7Cit9CisjZWxzZQoraW50IGFtdmRldl9wYXVzZSh2b2lkKQoreworCXJldHVybiAwOworfQorCitpbnQgYW12ZGV2X3Jlc3VtZSh2b2lkKQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKK2ludCBhbXZkZWNfaW5pdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19XQUtFTE9DSworCS8qCisJICp3YWtlX2xvY2tfaW5pdCgmYW12ZGVjX2xvY2ssIFdBS0VfTE9DS19JRExFLCAiYW12ZGVjX2xvY2siKTsKKwkgKnRtcCBtYXJrIGZvciBjb21waWxlLCBubyAiV0FLRV9MT0NLX0lETEUiIGRlZmluaXRpb24gaW4ga2VybmVsIDMuOAorCSAqLworCXdha2VfbG9ja19pbml0KCZhbXZkZWNfbG9jaywgLypXQUtFX0xPQ0tfSURMRSAqLyBXQUtFX0xPQ0tfU1VTUEVORCwKKwkJCQkgICAiYW12ZGVjX2xvY2siKTsKKworCWluaXRfdGltZXIoJmFtdmRldnRpbWVyKTsKKworCWFtdmRldnRpbWVyLmRhdGEgPSAodWxvbmcpICZhbXZkZXZ0aW1lcjsKKwlhbXZkZXZ0aW1lci5mdW5jdGlvbiA9IHZkZWNfcGF1c2VkX2NoZWNrX3RpbWVyOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGFtdmRlY19pbml0KTsKKwordm9pZCBhbXZkZWNfZXhpdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19XQUtFTE9DSworCWRlbF90aW1lcl9zeW5jKCZhbXZkZXZ0aW1lcik7CisjZW5kaWYKK30KK0VYUE9SVF9TWU1CT0woYW12ZGVjX2V4aXQpOworCisjaWYgMAoraW50IF9faW5pdCBhbXZkZWNfaW5pdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19XQUtFTE9DSworCS8qCisJICp3YWtlX2xvY2tfaW5pdCgmYW12ZGVjX2xvY2ssIFdBS0VfTE9DS19JRExFLCAiYW12ZGVjX2xvY2siKTsKKwkgKnRtcCBtYXJrIGZvciBjb21waWxlLCBubyAiV0FLRV9MT0NLX0lETEUiIGRlZmluaXRpb24gaW4ga2VybmVsIDMuOAorCSAqLworCXdha2VfbG9ja19pbml0KCZhbXZkZWNfbG9jaywgLypXQUtFX0xPQ0tfSURMRSAqLyBXQUtFX0xPQ0tfU1VTUEVORCwKKwkJCQkgICAiYW12ZGVjX2xvY2siKTsKKworCWluaXRfdGltZXIoJmFtdmRldnRpbWVyKTsKKworCWFtdmRldnRpbWVyLmRhdGEgPSAodWxvbmcpICZhbXZkZXZ0aW1lcjsKKwlhbXZkZXZ0aW1lci5mdW5jdGlvbiA9IHZkZWNfcGF1c2VkX2NoZWNrX3RpbWVyOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhbXZkZWNfZXhpdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19XQUtFTE9DSworCWRlbF90aW1lcl9zeW5jKCZhbXZkZXZ0aW1lcik7CisjZW5kaWYKK30KKworbW9kdWxlX2luaXQoYW12ZGVjX2luaXQpOworbW9kdWxlX2V4aXQoYW12ZGVjX2V4aXQpOworI2VuZGlmCisKK01PRFVMRV9ERVNDUklQVElPTigiQW1sb2dpYyBWaWRlbyBEZWNvZGVyIFV0aWxpdHkgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJUaW0gWWFvIDx0aW15YW9AYW1sb2dpYy5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvYW12ZGVjLmggYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvYW12ZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNkZWVjZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy9hbXZkZWMuaApAQCAtMCwwICsxLDkxIEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL21lZGlhL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvYW12ZGVjLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBBTVZERUNfSAorI2RlZmluZSBBTVZERUNfSAorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvYW1wb3J0c19jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL3Zmb3JtYXQuaD4KKyNpbmNsdWRlICJ2ZGVjLmgiCisKKyNkZWZpbmUgVUNPREVfQUxJR04gICAgICAgICA4CisjZGVmaW5lIFVDT0RFX0FMSUdOX01BU0sgICAgN1VMCisKK3N0cnVjdCBhbXZkZWNfZGVjX3JlZ19zIHsKKwl1bnNpZ25lZCBsb25nIG1lbV9zdGFydDsKKwl1bnNpZ25lZCBsb25nIG1lbV9lbmQ7CisJc3RydWN0IGRldmljZSAqY21hX2RldjsKKwlzdHJ1Y3QgZGVjX3N5c2luZm8gKmRlY19zeXNpbmZvOworfTsJCQkJLyphbXZkZWNfZGVjX3JlZ190ICovCisKK3N0cnVjdCB2ZGVjX3M7CisKK2V4dGVybiB2b2lkIGFtdmRlY19zdGFydCh2b2lkKTsKK2V4dGVybiB2b2lkIGFtdmRlY19zdG9wKHZvaWQpOworZXh0ZXJuIHZvaWQgYW12ZGVjX2VuYWJsZSh2b2lkKTsKK2V4dGVybiB2b2lkIGFtdmRlY19kaXNhYmxlKHZvaWQpOworczMyIGFtdmRlY19sb2FkbWNfZXgoZW51bSB2Zm9ybWF0X2UgdHlwZSwgY29uc3QgY2hhciAqbmFtZSwgY2hhciAqZGVmKTsKK3MzMiBhbXZkZWNfdmRlY19sb2FkbWNfZXgoZW51bSB2Zm9ybWF0X2UgdHlwZSwgY29uc3QgY2hhciAqbmFtZSwKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjLCBjaGFyICpkZWYpOworCitleHRlcm4gdm9pZCBhbXZkZWMyX3N0YXJ0KHZvaWQpOworZXh0ZXJuIHZvaWQgYW12ZGVjMl9zdG9wKHZvaWQpOworZXh0ZXJuIHZvaWQgYW12ZGVjMl9lbmFibGUodm9pZCk7CitleHRlcm4gdm9pZCBhbXZkZWMyX2Rpc2FibGUodm9pZCk7CitzMzIgYW12ZGVjMl9sb2FkbWNfZXgoZW51bSB2Zm9ybWF0X2UgdHlwZSwgY29uc3QgY2hhciAqbmFtZSwgY2hhciAqZGVmKTsKKworZXh0ZXJuIHZvaWQgYW1oZXZjX3N0YXJ0KHZvaWQpOworZXh0ZXJuIHZvaWQgYW1oZXZjX3N0b3Aodm9pZCk7CitleHRlcm4gdm9pZCBhbWhldmNfZW5hYmxlKHZvaWQpOworZXh0ZXJuIHZvaWQgYW1oZXZjX2Rpc2FibGUodm9pZCk7CitzMzIgYW1oZXZjX2xvYWRtY19leChlbnVtIHZmb3JtYXRfZSB0eXBlLCBjb25zdCBjaGFyICpuYW1lLCBjaGFyICpkZWYpOworczMyIGFtaGV2Y192ZGVjX2xvYWRtY19leChlbnVtIHZmb3JtYXRfZSB0eXBlLCBzdHJ1Y3QgdmRlY19zICp2ZGVjLAorCWNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKmRlZik7CitzMzIgYW12ZGVjX3ZkZWNfbG9hZG1jX2J1Zl9leChlbnVtIHZmb3JtYXRfZSB0eXBlLCBjb25zdCBjaGFyICpuYW1lLAorCXN0cnVjdCB2ZGVjX3MgKnZkZWMsIGNoYXIgKmJ1ZiwgaW50IHNpemUpOworCitleHRlcm4gdm9pZCBhbWhjb2RlY19zdGFydCh2b2lkKTsKK2V4dGVybiB2b2lkIGFtaGNvZGVjX3N0b3Aodm9pZCk7CitzMzIgYW1oY29kZWNfbG9hZG1jKGNvbnN0IHUzMiAqcCk7CitzMzIgYW1oY29kZWNfbG9hZG1jX2V4KGVudW0gdmZvcm1hdF9lIHR5cGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKmRlZik7CisKK2V4dGVybiBpbnQgYW12ZGV2X3BhdXNlKHZvaWQpOworZXh0ZXJuIGludCBhbXZkZXZfcmVzdW1lKHZvaWQpOworCisjaWZkZWYgQ09ORklHX1BNCitleHRlcm4gaW50IGFtdmRlY19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IGV2ZW50KTsKK2V4dGVybiBpbnQgYW12ZGVjX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZWMpOworZXh0ZXJuIGludCBhbWhldmNfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBldmVudCk7CitleHRlcm4gaW50IGFtaGV2Y19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGVjKTsKKworI2VuZGlmCisKK2ludCBhbXZkZWNfaW5pdCh2b2lkKTsKK3ZvaWQgYW12ZGVjX2V4aXQodm9pZCk7CisKKyNpZiAxCQkJCS8qIE1FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09ONiAqLworI2RlZmluZSBBTVZERUNfQ0xLX0dBVEVfT04oYSkKKyNkZWZpbmUgQU1WREVDX0NMS19HQVRFX09GRihhKQorI2Vsc2UKKyNkZWZpbmUgQU1WREVDX0NMS19HQVRFX09OKGEpIENMS19HQVRFX09OKGEpCisjZGVmaW5lIEFNVkRFQ19DTEtfR0FURV9PRkYoYSkgQ0xLX0dBVEVfT0ZGKGEpCisjZW5kaWYKKworLyogVE9ETzogbW92ZSB0byByZWdpc3RlciBoZWFkZXJzICovCisjZGVmaW5lIFJFU0VUX1ZDUFUgICAgICAgICAgKDE8PDcpCisjZGVmaW5lIFJFU0VUX0NDUFUgICAgICAgICAgKDE8PDgpCisKKyNlbmRpZiAvKiBBTVZERUNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL2NvbmZpZ19wYXJzZXIuYyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy9jb25maWdfcGFyc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE2NTYyMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy9jb25maWdfcGFyc2VyLmMKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9hbXBvcnRzL2NvbmZpZ19wYXJzZXIuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworI2luY2x1ZGUgImNvbmZpZ19wYXJzZXIuaCIKKy8qCisgKnNhbXBsZSBjb25maWc6CisgKmNvbmZpZ3M6IHdpZHRoOjE5MjA7aGVpZ2h0OjEwODA7CisgKm5lZWQ6d2lkdGgKKyAqb2s6IHJldHVybiAwOworICoqdmFsID0gdmFsdWU7CisgKi8KK2ludCBnZXRfY29uZmlnX2ludChjb25zdCBjaGFyICpjb25maWdzLCBjb25zdCBjaGFyICpuZWVkLCBpbnQgKnZhbCkKK3sKKwljb25zdCBjaGFyICpzdHI7CisJaW50IHJldDsKKwlpbnQgbHZhbCA9IDA7CisJKnZhbCA9IDA7CisKKwlpZiAoIWNvbmZpZ3MgfHwgIW5lZWQpCisJCXJldHVybiAtMTsKKwlzdHIgPSBzdHJzdHIoY29uZmlncywgbmVlZCk7CisJaWYgKHN0ciAhPSBOVUxMKSB7CisJCWlmIChzdHIgPiBjb25maWdzICYmIHN0clstMV0gIT0gJzsnKSB7CisJCQkvKgorCQkJICogICBpZiBub3QgdGhlIGZpcnN0IGNvbmZpZyB2YWwuCisJCQkgKiAgIG1ha2Ugc3VyZSBiZWZvcmUgaXMgJzsnCisJCQkgKiAgIHRvIHJlY29nbml6ZToKKwkJCSAqICAgO2Nyb3Bfd2lkdGg6MTAwCisJCQkgKiAgIDt3aWR0aDoxMDAKKwkJCSAqLworCQkJcmV0dXJuIC0yOworCQl9CisJCXN0ciArPSBzdHJsZW4obmVlZCk7CisJCWlmIChzdHJbMF0gIT0gJzonIHx8IHN0clsxXSA9PSAnXDAnKQorCQkJcmV0dXJuIC0zOworCQlyZXQgPSBzc2NhbmYoc3RyLCAiOiVkIiwgJmx2YWwpOworCQlpZiAocmV0ID09IDEpIHsKKwkJCSp2YWwgPSBsdmFsOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gLTQ7Cit9CitFWFBPUlRfU1lNQk9MKGdldF9jb25maWdfaW50KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL2NvbmZpZ19wYXJzZXIuaCBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy9jb25maWdfcGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc0NmNhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy9jb25maWdfcGFyc2VyLmgKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9hbXBvcnRzL2NvbmZpZ19wYXJzZXIuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2lmbmRlZiBDT05GSUdfUEFSU0VSX0hISF8KKyNkZWZpbmUgQ09ORklHX1BBUlNFUl9ISEhfCitpbnQgZ2V0X2NvbmZpZ19pbnQoY29uc3QgY2hhciAqY29uZmlncywgY29uc3QgY2hhciAqbmVlZCwgaW50ICp2YWwpOworCisjZW5kaWYvKkNPTkZJR19QQVJTRVJfSEhIXyovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvZGVjb2Rlcl9ibW11X2JveC5jIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL2RlY29kZXJfYm1tdV9ib3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2E5ZTRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL2RlY29kZXJfYm1tdV9ib3guYwpAQCAtMCwwICsxLDYzNCBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9hbXBvcnRzL2RlY29kZXIvZGVjb2Rlcl9ibW11X2JveC5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisjZGVmaW5lIERFQlVHCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jb2RlY19tbS9jb2RlY19tbV9zY2F0dGVyLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZpZGVvX3NpbmsvdmlkZW9fa2VlcGVyLmg+CisjaW5jbHVkZSAiZGVjb2Rlcl9ibW11X2JveC5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29kZWNfbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvZGVjX21tX2tlZXBlci5oPgorCitzdHJ1Y3QgZGVjb2Rlcl9ibW11X2JveCB7CisJaW50IG1heF9tbV9udW07CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgY2hhbm5lbF9pZDsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWludCB0b3RhbF9zaXplOworCWludCBib3hfcmVmX2NudDsKKwlpbnQgY2hhbmdlX3NpemVfb25fbmVlZF9zbWFsbGVyOworCWludCBhbGlnbjJuOwkJLypjYW4gb3ZlcndpdGUgb24gaWR4IGFsbG9jICovCisJaW50IG1lbV9mbGFnczsJCS8qY2FuIG92ZXJ3aXRlIG9uIGlkeCBhbGxvYyAqLworCXN0cnVjdCBjb2RlY19tbV9zICptbV9saXN0WzFdOworfTsKKworc3RydWN0IGRlY29kZXJfYm1tdV9ib3hfbWdyIHsKKwlpbnQgbnVtOworCXN0cnVjdCBtdXRleCBtdXRleDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGJveF9saXN0OworfTsKK3N0YXRpYyBzdHJ1Y3QgZGVjb2Rlcl9ibW11X2JveF9tZ3IgZ2xvYmFsX2Jsa19tZ3I7CitzdGF0aWMgc3RydWN0IGRlY29kZXJfYm1tdV9ib3hfbWdyICpnZXRfZGVjb2Rlcl9ibW11X2JveF9tZ3Iodm9pZCkKK3sKKwlyZXR1cm4gJmdsb2JhbF9ibGtfbWdyOworfQorCitzdGF0aWMgaW50IGRlY29kZXJfYm1tdV9ib3hfbWdyX2FkZF9ib3goc3RydWN0IGRlY29kZXJfYm1tdV9ib3ggKmJveCkKK3sKKwlzdHJ1Y3QgZGVjb2Rlcl9ibW11X2JveF9tZ3IgKm1nciA9IGdldF9kZWNvZGVyX2JtbXVfYm94X21ncigpOworCisJbXV0ZXhfbG9jaygmbWdyLT5tdXRleCk7CisJbGlzdF9hZGRfdGFpbCgmYm94LT5saXN0LCAmbWdyLT5ib3hfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZtZ3ItPm11dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVyX2JtbXVfYm94X21ncl9kZWxfYm94KHN0cnVjdCBkZWNvZGVyX2JtbXVfYm94ICpib3gpCit7CisJc3RydWN0IGRlY29kZXJfYm1tdV9ib3hfbWdyICptZ3IgPSBnZXRfZGVjb2Rlcl9ibW11X2JveF9tZ3IoKTsKKworCW11dGV4X2xvY2soJm1nci0+bXV0ZXgpOworCWxpc3RfZGVsKCZib3gtPmxpc3QpOworCW11dGV4X3VubG9jaygmbWdyLT5tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK2Jvb2wgZGVjb2Rlcl9ibW11X2JveF92YWxpZGVfY2hlY2sodm9pZCAqYm94KQoreworCXN0cnVjdCBkZWNvZGVyX2JtbXVfYm94X21nciAqbWdyID0gZ2V0X2RlY29kZXJfYm1tdV9ib3hfbWdyKCk7CisJc3RydWN0IGRlY29kZXJfYm1tdV9ib3ggKmJtbXVfYm94ID0gTlVMTDsKKwlib29sIGlzX3ZhbGlkZSA9IGZhbHNlOworCisJbXV0ZXhfbG9jaygmbWdyLT5tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShibW11X2JveCwgJm1nci0+Ym94X2xpc3QsIGxpc3QpIHsKKwkJaWYgKGJtbXVfYm94ICYmIGJtbXVfYm94ID09IGJveCkgeworCQkJaXNfdmFsaWRlID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCW11dGV4X3VubG9jaygmbWdyLT5tdXRleCk7CisKKwlyZXR1cm4gaXNfdmFsaWRlOworfQorRVhQT1JUX1NZTUJPTChkZWNvZGVyX2JtbXVfYm94X3ZhbGlkZV9jaGVjayk7CisKK3ZvaWQgKmRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYm94KGNvbnN0IGNoYXIgKm5hbWUsCisJCWludCBjaGFubmVsX2lkLCBpbnQgbWF4X251bSwKKwkJaW50IGFsaWduZWQsIGludCBtZW1fZmxhZ3MpCisvKm1pbl9zaXplX006d2FpdCBhbGxvYyB0aGlzIHNpemUqLworeworCXN0cnVjdCBkZWNvZGVyX2JtbXVfYm94ICpib3g7CisJaW50IHNpemU7CisJaW50IHR2cF9mbGFnczsKKwl0dnBfZmxhZ3MgPSAobWVtX2ZsYWdzICYgQ09ERUNfTU1fRkxBR1NfVFZQKSA/CisJCUNPREVDX01NX0ZMQUdTX1RWUCA6IDA7CisKKwlwcl9kZWJ1ZygiZGVjb2Rlcl9ibW11X2JveF9hbGxvY19ib3gsIHR2cF9mbGFncyA9ICV4XG4iLCB0dnBfZmxhZ3MpOworCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZGVjb2Rlcl9ibW11X2JveCkgKyBzaXplb2Yoc3RydWN0IGNvZGVjX21tX3MgKikgKgorCQkgICBtYXhfbnVtOworCWJveCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFib3gpIHsKKwkJcHJfZXJyKCJjYW4ndCBhbGxvYyBkZWNvZGVyIGJ1ZmZlcnMgYm94ISEhXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldChib3gsIDAsIHNpemUpOworCWJveC0+bWF4X21tX251bSA9IG1heF9udW07CisJYm94LT5uYW1lID0gbmFtZTsKKwlib3gtPmNoYW5uZWxfaWQgPSBjaGFubmVsX2lkOworCWJveC0+YWxpZ24ybiA9IGFsaWduZWQ7CisJYm94LT5tZW1fZmxhZ3MgPSBtZW1fZmxhZ3MgfCB0dnBfZmxhZ3M7CisJbXV0ZXhfaW5pdCgmYm94LT5tdXRleCk7CisJSU5JVF9MSVNUX0hFQUQoJmJveC0+bGlzdCk7CisJZGVjb2Rlcl9ibW11X2JveF9tZ3JfYWRkX2JveChib3gpOworCXJldHVybiAodm9pZCAqKWJveDsKK30KK0VYUE9SVF9TWU1CT0woZGVjb2Rlcl9ibW11X2JveF9hbGxvY19ib3gpOworCitpbnQgZGVjb2Rlcl9ibW11X2JveF9hbGxvY19pZHgodm9pZCAqaGFuZGxlLCBpbnQgaWR4LCBpbnQgc2l6ZSwgaW50IGFsaWduZWRfMm4sCisJCQkJCQkJICAgaW50IG1lbV9mbGFncykKKy8qYWxpZ24mIGZsYWdzIGlmIC0xIHVzZXIgYm94IGRlZmF1bHQuKi8KK3sKKwlzdHJ1Y3QgZGVjb2Rlcl9ibW11X2JveCAqYm94ID0gaGFuZGxlOworCXN0cnVjdCBjb2RlY19tbV9zICptbTsKKwlpbnQgYWxpZ24gPSBhbGlnbmVkXzJuOworCWludCBtZW1mbGFncyA9IG1lbV9mbGFnczsKKworCWlmICghYm94IHx8IGlkeCA8IDAgfHwgaWR4ID49IGJveC0+bWF4X21tX251bSkgeworCQlwcl9lcnIoImNhbid0IGFsbG9jIGJtbXUgYm94KCVwKSxpZHg6JWRcbiIsCisJCQkJYm94LCBpZHgpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChhbGlnbiA9PSAtMSkKKwkJYWxpZ24gPSBib3gtPmFsaWduMm47CisJaWYgKG1lbWZsYWdzID09IC0xKQorCQltZW1mbGFncyA9IGJveC0+bWVtX2ZsYWdzOworCisJbXV0ZXhfbG9jaygmYm94LT5tdXRleCk7CisJbW0gPSBib3gtPm1tX2xpc3RbaWR4XTsKKwlpZiAobW0pIHsKKwkJaW50IGludmFsaWQgPSAwOworCQlpbnQga2VlcGVkID0gMDsKKworCQlrZWVwZWQgPSBpc19jb2RlY19tbV9rZWVwZWQobW0pOworCQlpZiAoIWtlZXBlZCkgeworCQkJaWYgKG1tLT5wYWdlX2NvdW50ICogUEFHRV9TSVpFIDwgc2l6ZSkgeworCQkJCS8qc2l6ZSBpcyBzbWFsbC4gKi8KKwkJCQlpbnZhbGlkID0gMTsKKwkJCX0gZWxzZSBpZiAoYm94LT5jaGFuZ2Vfc2l6ZV9vbl9uZWVkX3NtYWxsZXIgJiYKKwkJCQkJICAgKG1tLT5idWZmZXJfc2l6ZSA+IChzaXplIDw8IDEpKSkgeworCQkJCS8qc2l6ZSBpcyB0b28gbGFyZ2UuICovCisJCQkJaW52YWxpZCA9IDI7CisJCQl9IGVsc2UgaWYgKG1tLT5waHlfYWRkciAmICgoMSA8PCBhbGlnbikgLSAxKSkgeworCQkJCS8qYWRkciBpcyBub3QgYWxpZ24gKi8KKwkJCQlpbnZhbGlkID0gNDsKKwkJCX0KKwkJCWlmIChpbnZhbGlkKSB7CisJCQkJYm94LT50b3RhbF9zaXplIC09IG1tLT5idWZmZXJfc2l6ZTsKKwkJCQljb2RlY19tbV9yZWxlYXNlKG1tLCBib3gtPm5hbWUpOworCQkJCWJveC0+bW1fbGlzdFtpZHhdID0gTlVMTDsKKwkJCQltbSA9IE5VTEw7CisJCQl9CisJCX0gZWxzZSB7CisJCQlib3gtPnRvdGFsX3NpemUgLT0gbW0tPmJ1ZmZlcl9zaXplOworCQkJY29kZWNfbW1fcmVsZWFzZShtbSwgYm94LT5uYW1lKTsKKwkJCWJveC0+bW1fbGlzdFtpZHhdID0gTlVMTDsKKwkJCW1tID0gTlVMTDsKKwkJfQorCX0KKwlpZiAoIW1tKSB7CisJCW1tID0gY29kZWNfbW1fYWxsb2MoYm94LT5uYW1lLCBzaXplLCBhbGlnbiwgbWVtZmxhZ3MpOworCQlpZiAobW0pIHsKKwkJCWJveC0+bW1fbGlzdFtpZHhdID0gbW07CisJCQlib3gtPnRvdGFsX3NpemUgKz0gbW0tPmJ1ZmZlcl9zaXplOworCQkJbW0tPmluc19pZCA9IGJveC0+Y2hhbm5lbF9pZDsKKwkJCW1tLT5pbnNfYnVmZmVyX2lkID0gaWR4OworCQkJYm94LT5ib3hfcmVmX2NudCsrOworCQl9CisJfQorCW11dGV4X3VubG9jaygmYm94LT5tdXRleCk7CisJcmV0dXJuIG1tID8gMCA6IC1FTk9NRU07Cit9CisKK2ludCBkZWNvZGVyX2JtbXVfYm94X2ZyZWVfaWR4KHZvaWQgKmhhbmRsZSwgaW50IGlkeCkKK3sKKwlzdHJ1Y3QgZGVjb2Rlcl9ibW11X2JveCAqYm94ID0gaGFuZGxlOworCXN0cnVjdCBjb2RlY19tbV9zICptbTsKKworCWlmICghYm94IHx8IGlkeCA8IDAgfHwgaWR4ID49IGJveC0+bWF4X21tX251bSkgeworCQlwcl9lcnIoImNhbid0IGZyZWUgaWR4IG9mIGJveCglcCksaWR4OiVkICBpbiAoJWQtJWQpXG4iLAorCQkJCWJveCwgaWR4LCAwLAorCQkJICAgYm94ID8gKGJveC0+bWF4X21tX251bSAtIDEpIDogMCk7CisJCXJldHVybiAtMTsKKwl9CisJbXV0ZXhfbG9jaygmYm94LT5tdXRleCk7CisJbW0gPSBib3gtPm1tX2xpc3RbaWR4XTsKKwlpZiAobW0pIHsKKwkJYm94LT50b3RhbF9zaXplIC09IG1tLT5idWZmZXJfc2l6ZTsKKwkJY29kZWNfbW1fcmVsZWFzZShtbSwgYm94LT5uYW1lKTsKKwkJYm94LT5tbV9saXN0W2lkeF0gPSBOVUxMOworCQltbSA9IE5VTEw7CisJCWJveC0+Ym94X3JlZl9jbnQtLTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZib3gtPm11dGV4KTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZGVjb2Rlcl9ibW11X2JveF9mcmVlX2lkeCk7CisKK2ludCBkZWNvZGVyX2JtbXVfYm94X2ZyZWUodm9pZCAqaGFuZGxlKQoreworCXN0cnVjdCBkZWNvZGVyX2JtbXVfYm94ICpib3ggPSBoYW5kbGU7CisJc3RydWN0IGNvZGVjX21tX3MgKm1tOworCWludCBpOworCisJaWYgKCFib3gpIHsKKwkJcHJfZXJyKCJjYW4ndCBmcmVlIGJveCBvZiBOVUxMIGJveCFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCW11dGV4X2xvY2soJmJveC0+bXV0ZXgpOworCWZvciAoaSA9IDA7IGkgPCBib3gtPm1heF9tbV9udW07IGkrKykgeworCQltbSA9IGJveC0+bW1fbGlzdFtpXTsKKwkJaWYgKG1tKSB7CisJCQljb2RlY19tbV9yZWxlYXNlKG1tLCBib3gtPm5hbWUpOworCQkJYm94LT5tbV9saXN0W2ldID0gTlVMTDsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmJveC0+bXV0ZXgpOworCWRlY29kZXJfYm1tdV9ib3hfbWdyX2RlbF9ib3goYm94KTsKKwlrZnJlZShib3gpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkZWNvZGVyX2JtbXVfYm94X2ZyZWUpOworCit2b2lkIGRlY29kZXJfYm1tdV90cnlfdG9fcmVsZWFzZV9ib3godm9pZCAqaGFuZGxlKQoreworCXN0cnVjdCBkZWNvZGVyX2JtbXVfYm94ICpib3ggPSBoYW5kbGU7CisJYm9vbCBpc19rZWVwID0gZmFsc2U7CisJaW50IGk7CisKKwlpZiAoIWJveCB8fCBib3gtPmJveF9yZWZfY250KQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZib3gtPm11dGV4KTsKKwlmb3IgKGkgPSAwOyBpIDwgYm94LT5tYXhfbW1fbnVtOyBpKyspIHsKKwkJaWYgKGJveC0+bW1fbGlzdFtpXSkgeworCQkJaXNfa2VlcCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmJveC0+bXV0ZXgpOworCisJaWYgKCFpc19rZWVwKSB7CisJCWRlY29kZXJfYm1tdV9ib3hfbWdyX2RlbF9ib3goYm94KTsKKwkJa2ZyZWUoYm94KTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGRlY29kZXJfYm1tdV90cnlfdG9fcmVsZWFzZV9ib3gpOworCit2b2lkICpkZWNvZGVyX2JtbXVfYm94X2dldF9tZW1faGFuZGxlKHZvaWQgKmJveF9oYW5kbGUsIGludCBpZHgpCit7CisJc3RydWN0IGRlY29kZXJfYm1tdV9ib3ggKmJveCA9IGJveF9oYW5kbGU7CisKKwlpZiAoIWJveCB8fCBpZHggPCAwIHx8IGlkeCA+PSBib3gtPm1heF9tbV9udW0pCisJCXJldHVybiBOVUxMOworCXJldHVybiBib3gtPm1tX2xpc3RbaWR4XTsKK30KK0VYUE9SVF9TWU1CT0woZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSk7CisKK2ludCBkZWNvZGVyX2JtbXVfYm94X2dldF9tZW1fc2l6ZSh2b2lkICpib3hfaGFuZGxlLCBpbnQgaWR4KQoreworCXN0cnVjdCBkZWNvZGVyX2JtbXVfYm94ICpib3ggPSBib3hfaGFuZGxlOworCWludCBzaXplID0gMDsKKworCWlmICghYm94IHx8IGlkeCA8IDAgfHwgaWR4ID49IGJveC0+bWF4X21tX251bSkKKwkJcmV0dXJuIDA7CisJbXV0ZXhfbG9jaygmYm94LT5tdXRleCk7CisJaWYgKGJveC0+bW1fbGlzdFtpZHhdICE9IE5VTEwpCisJCXNpemUgPSBib3gtPm1tX2xpc3RbaWR4XS0+YnVmZmVyX3NpemU7CisJbXV0ZXhfdW5sb2NrKCZib3gtPm11dGV4KTsKKwlyZXR1cm4gc2l6ZTsKK30KKworCit1bnNpZ25lZCBsb25nIGRlY29kZXJfYm1tdV9ib3hfZ2V0X3BoeV9hZGRyKHZvaWQgKmJveF9oYW5kbGUsIGludCBpZHgpCit7CisJc3RydWN0IGRlY29kZXJfYm1tdV9ib3ggKmJveCA9IGJveF9oYW5kbGU7CisJc3RydWN0IGNvZGVjX21tX3MgKm1tOworCisJaWYgKCFib3ggfHwgaWR4IDwgMCB8fCBpZHggPj0gYm94LT5tYXhfbW1fbnVtKQorCQlyZXR1cm4gMDsKKwltbSA9IGJveC0+bW1fbGlzdFtpZHhdOworCWlmICghbW0pCisJCXJldHVybiAwOworCXJldHVybiBtbS0+cGh5X2FkZHI7Cit9CitFWFBPUlRfU1lNQk9MKGRlY29kZXJfYm1tdV9ib3hfZ2V0X3BoeV9hZGRyKTsKKwordm9pZCAqZGVjb2Rlcl9ibW11X2JveF9nZXRfdmlydF9hZGRyKHZvaWQgKmJveF9oYW5kbGUsIGludCBpZHgpCit7CisJc3RydWN0IGRlY29kZXJfYm1tdV9ib3ggKmJveCA9IGJveF9oYW5kbGU7CisJc3RydWN0IGNvZGVjX21tX3MgKm1tOworCisJaWYgKCFib3ggfHwgaWR4IDwgMCB8fCBpZHggPj0gYm94LT5tYXhfbW1fbnVtKQorCQlyZXR1cm4gTlVMTDsKKwltbSA9IGJveC0+bW1fbGlzdFtpZHhdOworCWlmICghbW0pCisJCXJldHVybiAwOworCXJldHVybiBjb2RlY19tbV9waHlzX3RvX3ZpcnQobW0tPnBoeV9hZGRyKTsKK30KKworLypmbGFnczogJjB4MSBmb3Igd2FpdCwqLworaW50IGRlY29kZXJfYm1tdV9ib3hfY2hlY2tfYW5kX3dhaXRfc2l6ZShpbnQgc2l6ZSwgaW50IGZsYWdzLCBpbnQgbWVtX2ZsYWdzKQoreworCWlmICgoZmxhZ3MgJiBCTU1VX0FMTE9DX0ZMQUdTX0NBTl9DTEVBUl9LRUVQRVIpICYmCisJCWNvZGVjX21tX2dldF9mcmVlX3NpemUoKSA8IHNpemUpIHsKKwkJcHJfZXJyKCJDTUEgZm9yY2UgZnJlZSBrZWVwLGZvciBzaXplID0gJWRcbiIsIHNpemUpOworCQkvKm5lZWQgZnJlZSBvdGhlcnM/CisJCSAqLworCQl0cnlfZnJlZV9rZWVwX3ZpZGVvKDEpOworCX0KKworCXJldHVybiBjb2RlY19tbV9lbm91Z2hfZm9yX3NpemUoc2l6ZSwKKwkJCWZsYWdzICYgQk1NVV9BTExPQ19GTEFHU19XQUlULCBtZW1fZmxhZ3MpOworfQorCitpbnQgZGVjb2Rlcl9ibW11X2JveF9hbGxvY19pZHhfd2FpdCgKKwl2b2lkICpoYW5kbGUsIGludCBpZHgsCisJaW50IHNpemUsIGludCBhbGlnbmVkXzJuLAorCWludCBtZW1fZmxhZ3MsCisJaW50IHdhaXRfZmxhZ3MpCit7CisJaW50IGhhdmVfc3BhY2U7CisJaW50IHJldCA9IC0xOworCWludCBrZWVwZWQgPSAwOworCisJaWYgKGRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9zaXplKGhhbmRsZSwgaWR4KSA+PSBzaXplKSB7CisJCXN0cnVjdCBkZWNvZGVyX2JtbXVfYm94ICpib3ggPSBoYW5kbGU7CisJCXN0cnVjdCBjb2RlY19tbV9zICptbTsKKwkJbXV0ZXhfbG9jaygmYm94LT5tdXRleCk7CisJCW1tID0gYm94LT5tbV9saXN0W2lkeF07CisJCWtlZXBlZCA9IGlzX2NvZGVjX21tX2tlZXBlZChtbSk7CisJCW11dGV4X3VubG9jaygmYm94LT5tdXRleCk7CisKKwkJaWYgKCFrZWVwZWQpCisJCQlyZXR1cm4gMDsvKmhhdmUgYWxsb2NlZCBtZW1lcnkgYmVmb3JlLiovCisJfQorCWhhdmVfc3BhY2UgPSBkZWNvZGVyX2JtbXVfYm94X2NoZWNrX2FuZF93YWl0X3NpemUoCisJCQkJCXNpemUsCisJCQkJCXdhaXRfZmxhZ3MsCisJCQkJCW1lbV9mbGFncyk7CisJaWYgKGhhdmVfc3BhY2UpIHsKKwkJcmV0ID0gZGVjb2Rlcl9ibW11X2JveF9hbGxvY19pZHgoaGFuZGxlLAorCQkJCWlkeCwgc2l6ZSwgYWxpZ25lZF8ybiwgbWVtX2ZsYWdzKTsKKwkJaWYgKHJldCA9PSAtRU5PTUVNKSB7CisJCQlwcl9pbmZvKCJibW11IGFsbG9jIGlkeCBmYWlsLCB0cnkgZnJlZSBrZWVwIHZpZGVvLlxuIik7CisJCQl0cnlfZnJlZV9rZWVwX3ZpZGVvKDEpOworCQl9CisJfSBlbHNlIHsKKwkJdHJ5X2ZyZWVfa2VlcF92aWRlbygxKTsKKwkJcmV0ID0gLUVOT01FTTsKKwl9CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZGVjb2Rlcl9ibW11X2JveF9hbGxvY19pZHhfd2FpdCk7CisKK2ludCBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkoCisJdm9pZCAqaGFuZGxlLCBpbnQgaWR4LAorCWludCBzaXplLCB1bnNpZ25lZCBjaGFyICpkcml2ZXJfbmFtZSwKKwl1bnNpZ25lZCBsb25nICpidWZfcGh5X2FkZHIpCit7CisJc3RydWN0IGRlY29kZXJfYm1tdV9ib3ggKmJtbXVfYm94ID0gKHN0cnVjdCBkZWNvZGVyX2JtbXVfYm94ICopaGFuZGxlOworCisJaWYgKGJtbXVfYm94ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFkZWNvZGVyX2JtbXVfYm94X2NoZWNrX2FuZF93YWl0X3NpemUoCisJCQlzaXplLAorCQkJMSwgYm1tdV9ib3gtPm1lbV9mbGFncykpIHsKKwkJcHJfaW5mbygiJXMgbm90IGVub3VnaCBidWYgZm9yIGJ1Zl9pZHggPSAlZFxuIiwKKwkJCQkJZHJpdmVyX25hbWUsIGlkeCk7CisJCXJldHVybgktRU5PTUVNOworCX0KKwlpZiAoIWRlY29kZXJfYm1tdV9ib3hfYWxsb2NfaWR4X3dhaXQoCisJCQloYW5kbGUsCisJCQlpZHgsCisJCQlzaXplLAorCQkJLTEsCisJCQlibW11X2JveC0+bWVtX2ZsYWdzLAorCQkJQk1NVV9BTExPQ19GTEFHU19XQUlUQ0xFQVIpKSB7CisJCSpidWZfcGh5X2FkZHIgPQorCQkJZGVjb2Rlcl9ibW11X2JveF9nZXRfcGh5X2FkZHIoCisJCQloYW5kbGUsCisJCQlpZHgpOworCQkvKgorCQkgKnByX2luZm8oIiVzIG1hbGxvYyBidWZfaWR4ID0gJWQgYWRkciA9ICVsZCBzaXplID0gJWRcbiIsCisJCSAqCWRyaXZlcl9uYW1lLCBpZHgsICpidWZfcGh5X2FkZHIsIHNpemUpOworCQkgKi8KKwkJfSBlbHNlIHsKKwkJCXByX2luZm8oIiVzIG1hbGxvYyBmYWlsZWQgICVkXG4iLCBkcml2ZXJfbmFtZSwgaWR4KTsKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkpOworCitpbnQgZGVjb2Rlcl9ibW11X2JveF9hZGRfY2FsbGJhY2tfZnVuYygKKwl2b2lkICpoYW5kbGUsIGludCBpZHgsCisJdm9pZCAqY2IpCit7CisJc3RydWN0IGRlY29kZXJfYm1tdV9ib3ggKmJveCA9IGhhbmRsZTsKKwlzdHJ1Y3QgY29kZWNfbW1fcyAqbW07CisKKwlpZiAoIWJveCB8fCBpZHggPCAwIHx8IGlkeCA+PSBib3gtPm1heF9tbV9udW0pCisJCXJldHVybiAwOworCisJbXV0ZXhfbG9jaygmYm94LT5tdXRleCk7CisJbW0gPSBib3gtPm1tX2xpc3RbaWR4XTsKKwljb2RlY19tbV9hZGRfcmVsZWFzZV9jYWxsYmFjayhtbSwgKHN0cnVjdCBjb2RlY19tbV9jYl9zICopY2IpOworCW11dGV4X3VubG9jaygmYm94LT5tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZGVjb2Rlcl9ibW11X2JveF9hZGRfY2FsbGJhY2tfZnVuYyk7CisKK3N0YXRpYyBpbnQgZGVjb2Rlcl9ibW11X2JveF9kdW1wKHN0cnVjdCBkZWNvZGVyX2JtbXVfYm94ICpib3gsIHZvaWQgKmJ1ZiwKKwkJCQkJCQkJIGludCBzaXplKQoreworCWNoYXIgKnBidWYgPSBidWY7CisJY2hhciBzYnVmWzUxMl07CisJaW50IHRzaXplID0gMDsKKwlpbnQgczsKKwlpbnQgaTsKKworCWlmICghYnVmKSB7CisJCXBidWYgPSBzYnVmOworCQlzaXplID0gNTEyOworCX0KKyNkZWZpbmUgQlVGUFJJTlQoYXJncy4uLikgXAorCWRvIHtcCisJCXMgPSBzbnByaW50ZihwYnVmLCBzaXplIC0gdHNpemUsIGFyZ3MpO1wKKwkJdHNpemUgKz0gcztcCisJCXBidWYgKz0gczsgXAorCX0gd2hpbGUgKDApCisKKwlmb3IgKGkgPSAwOyBpIDwgYm94LT5tYXhfbW1fbnVtOyBpKyspIHsKKwkJc3RydWN0IGNvZGVjX21tX3MgKm1tID0gYm94LT5tbV9saXN0W2ldOworCQlpZiAoYnVmICYmIChzaXplIC0gdHNpemUpIDwgMjU2KSB7CisJCQlCVUZQUklOVCgiXG5cdCoqTk9UIEVORCoqXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChtbSkgeworCQkJQlVGUFJJTlQoImNvZGUgbWVtWyVkXTolcCwgYWRkcj0lcCwgc2l6ZT0lZCxmcm9tPSVkXG4iLAorCQkJCQkgaSwKKwkJCQkJICh2b2lkICopbW0sCisJCQkJCSAodm9pZCAqKW1tLT5waHlfYWRkciwKKwkJCQkJIG1tLT5idWZmZXJfc2l6ZSwKKwkJCQkJIG1tLT5mcm9tX2ZsYWdzKTsKKwkJCWlmICghYnVmKSB7CisJCQkJcHJfaW5mbygiJXMiLCBzYnVmKTsKKwkJCQlwYnVmID0gc2J1ZjsKKwkJCX0KKwkJfQorCX0KKyN1bmRlZiBCVUZQUklOVAorCisJcmV0dXJuIHRzaXplOworfQorCitzdGF0aWMgaW50IGRlY29kZXJfYm1tdV9ib3hfZHVtcF9hbGwodm9pZCAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgZGVjb2Rlcl9ibW11X2JveF9tZ3IgKm1nciA9IGdldF9kZWNvZGVyX2JtbXVfYm94X21ncigpOworCWNoYXIgKnBidWYgPSBidWY7CisJY2hhciBzYnVmWzUxMl07CisJaW50IHRzaXplID0gMDsKKwlpbnQgczsKKwlpbnQgaTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCAqbGlzdDsKKworCWlmICghYnVmKSB7CisJCXBidWYgPSBzYnVmOworCQlzaXplID0gNTEyOworCX0KKyNkZWZpbmUgQlVGUFJJTlQoYXJncy4uLikgXAorCWRvIHtcCisJCXMgPSBzbnByaW50ZihwYnVmLCBzaXplIC0gdHNpemUsIGFyZ3MpO1wKKwkJdHNpemUgKz0gcztcCisJCXBidWYgKz0gczsgXAorCX0gd2hpbGUgKDApCisKKwltdXRleF9sb2NrKCZtZ3ItPm11dGV4KTsKKwloZWFkID0gJm1nci0+Ym94X2xpc3Q7CisJbGlzdCA9IGhlYWQtPm5leHQ7CisJaSA9IDA7CisJd2hpbGUgKGxpc3QgIT0gaGVhZCkgeworCQlzdHJ1Y3QgZGVjb2Rlcl9ibW11X2JveCAqYm94OworCisJCWJveCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGRlY29kZXJfYm1tdV9ib3gsIGxpc3QpOworCQlCVUZQUklOVCgiYm94WyVkXTogJXMsICVzcGxheWVyX2lkOiVkLCBtYXhfbnVtOiVkLCBzaXplOiVkXG4iLAorCQkJCSBpLCBib3gtPm5hbWUsCisJCQkJIChib3gtPm1lbV9mbGFncyAmIENPREVDX01NX0ZMQUdTX1RWUCkgPworCQkJCSAiVFZQIG1vZGUgIiA6ICIiLAorCQkJCSBib3gtPmNoYW5uZWxfaWQsCisJCQkJIGJveC0+bWF4X21tX251bSwKKwkJCQkgYm94LT50b3RhbF9zaXplKTsKKwkJaWYgKGJ1ZikgeworCQkJcyA9IGRlY29kZXJfYm1tdV9ib3hfZHVtcChib3gsIHBidWYsIHNpemUgLSB0c2l6ZSk7CisJCQlpZiAocyA+IDApIHsKKwkJCQl0c2l6ZSArPSBzOworCQkJCXBidWYgKz0gczsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXByX2luZm8oIiVzIiwgc2J1Zik7CisJCQlwYnVmID0gc2J1ZjsKKwkJCXRzaXplICs9IGRlY29kZXJfYm1tdV9ib3hfZHVtcChib3gsIE5VTEwsIDApOworCQl9CisJCWxpc3QgPSBsaXN0LT5uZXh0OworCQlpKys7CisJfQorCW11dGV4X3VubG9jaygmbWdyLT5tdXRleCk7CisKKyN1bmRlZiBCVUZQUklOVAorCWlmICghYnVmKQorCQlwcl9pbmZvKCIlcyIsIHNidWYpOworCXJldHVybiB0c2l6ZTsKK30KKworc3RhdGljIHNzaXplX3QgYm94X2R1bXBfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLCBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQkJCQkJCSBjaGFyICpidWYpCit7CisJc3NpemVfdCByZXQgPSAwOworCisJcmV0ID0gZGVjb2Rlcl9ibW11X2JveF9kdW1wX2FsbChidWYsIFBBR0VfU0laRSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgZGVidWdfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3NpemVfdCBzaXplID0gMDsKKwlzaXplICs9IHNwcmludGYoYnVmLCAiYm94IGRlYnVnIGhlbHA6XG4iKTsKKwlzaXplICs9IHNwcmludGYoYnVmICsgc2l6ZSwgImVjaG8gbiA+IGRlYnVnXG4iKTsKKwlzaXplICs9IHNwcmludGYoYnVmICsgc2l6ZSwgIm49PTA6IGNsZWFyIGFsbCBkZWJ1Z3MpXG4iKTsKKwlzaXplICs9IHNwcmludGYoYnVmICsgc2l6ZSwKKwkibj0xOiBkdW1wIGFsbCBib3hcbiIpOworCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRlYnVnX3N0b3JlKHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJdW5zaWduZWQgdmFsOworCXNzaXplX3QgcmV0OworCXZhbCA9IC0xOworCXJldCA9IHNzY2FuZihidWYsICIlZCIsICZ2YWwpOworCWlmIChyZXQgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3dpdGNoICh2YWwpIHsKKwljYXNlIDE6CisJCWRlY29kZXJfYm1tdV9ib3hfZHVtcF9hbGwoTlVMTCAsIDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoInVua25vdyBjbWQhICVkXG4iLCB2YWwpOworCX0KKwlyZXR1cm4gc2l6ZTsKKworfQorCitzdGF0aWMgQ0xBU1NfQVRUUl9STyhib3hfZHVtcCk7CitzdGF0aWMgQ0xBU1NfQVRUUl9SVyhkZWJ1Zyk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpkZWNvZGVyX2JtbXVfYm94X2NsYXNzX2F0dHJzW10gPSB7CisJJmNsYXNzX2F0dHJfYm94X2R1bXAuYXR0ciwKKwkmY2xhc3NfYXR0cl9kZWJ1Zy5hdHRyLAorCU5VTEwKK307CisKK0FUVFJJQlVURV9HUk9VUFMoZGVjb2Rlcl9ibW11X2JveF9jbGFzcyk7CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgZGVjb2Rlcl9ibW11X2JveF9jbGFzcyA9IHsKKwkubmFtZSA9ICJkZWNvZGVyX2JtbXVfYm94IiwKKwkuY2xhc3NfZ3JvdXBzID0gZGVjb2Rlcl9ibW11X2JveF9jbGFzc19ncm91cHMsCit9OworCitpbnQgZGVjb2Rlcl9ibW11X2JveF9pbml0KHZvaWQpCit7CisJaW50IHI7CisKKwltZW1zZXQoJmdsb2JhbF9ibGtfbWdyLCAwLCBzaXplb2YoZ2xvYmFsX2Jsa19tZ3IpKTsKKwlJTklUX0xJU1RfSEVBRCgmZ2xvYmFsX2Jsa19tZ3IuYm94X2xpc3QpOworCW11dGV4X2luaXQoJmdsb2JhbF9ibGtfbWdyLm11dGV4KTsKKwlyID0gY2xhc3NfcmVnaXN0ZXIoJmRlY29kZXJfYm1tdV9ib3hfY2xhc3MpOworCXJldHVybiByOworfQorRVhQT1JUX1NZTUJPTChkZWNvZGVyX2JtbXVfYm94X2luaXQpOworCit2b2lkIGRlY29kZXJfYm1tdV9ib3hfZXhpdCh2b2lkKQoreworCWNsYXNzX3VucmVnaXN0ZXIoJmRlY29kZXJfYm1tdV9ib3hfY2xhc3MpOworCXByX2luZm8oImRlYyBibW11IGJveCBleGl0LlxuIik7Cit9CisKKyNpZiAwCitzdGF0aWMgaW50IF9faW5pdCBkZWNvZGVyX2JtbXVfYm94X2luaXQodm9pZCkKK3sKKwlpbnQgcjsKKworCW1lbXNldCgmZ2xvYmFsX2Jsa19tZ3IsIDAsIHNpemVvZihnbG9iYWxfYmxrX21ncikpOworCUlOSVRfTElTVF9IRUFEKCZnbG9iYWxfYmxrX21nci5ib3hfbGlzdCk7CisJbXV0ZXhfaW5pdCgmZ2xvYmFsX2Jsa19tZ3IubXV0ZXgpOworCXIgPSBjbGFzc19yZWdpc3RlcigmZGVjb2Rlcl9ibW11X2JveF9jbGFzcyk7CisJcmV0dXJuIHI7Cit9CisKK21vZHVsZV9pbml0KGRlY29kZXJfYm1tdV9ib3hfaW5pdCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy9kZWNvZGVyX2JtbXVfYm94LmggYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvZGVjb2Rlcl9ibW11X2JveC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzOTc0ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvZGVjb2Rlcl9ibW11X2JveC5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvYW1wb3J0cy9kZWNvZGVyL2RlY29kZXJfYm1tdV9ib3guaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIERFQ09ERVJfQkxPQ0tfQlVGRkVSX0JPWAorI2RlZmluZSBERUNPREVSX0JMT0NLX0JVRkZFUl9CT1gKKwordm9pZCAqZGVjb2Rlcl9ibW11X2JveF9hbGxvY19ib3goY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJCQkJIGludCBjaGFubmVsX2lkLAorCQkJCQkJCQkgaW50IG1heF9udW0sCisJCQkJCQkJCSBpbnQgYWxpZ25lZCwKKwkJCQkJCQkJIGludCBtZW1fZmxhZ3MpOworCitpbnQgZGVjb2Rlcl9ibW11X2JveF9hbGxvY19pZHgoCisJdm9pZCAqaGFuZGxlLCBpbnQgaWR4LCBpbnQgc2l6ZSwKKwlpbnQgYWxpZ25lZF8ybiwgaW50IG1lbV9mbGFncyk7CisKK2ludCBkZWNvZGVyX2JtbXVfYm94X2ZyZWVfaWR4KHZvaWQgKmhhbmRsZSwgaW50IGlkeCk7CitpbnQgZGVjb2Rlcl9ibW11X2JveF9mcmVlKHZvaWQgKmhhbmRsZSk7Cit2b2lkICpkZWNvZGVyX2JtbXVfYm94X2dldF9tZW1faGFuZGxlKAorCXZvaWQgKmJveF9oYW5kbGUsIGludCBpZHgpOworCit1bnNpZ25lZCBsb25nIGRlY29kZXJfYm1tdV9ib3hfZ2V0X3BoeV9hZGRyKAorCXZvaWQgKmJveF9oYW5kbGUsIGludCBpZHgpOworCit2b2lkICpkZWNvZGVyX2JtbXVfYm94X2dldF92aXJ0X2FkZHIoCisJdm9pZCAqYm94X2hhbmRsZSwgaW50IGlkeCk7CisKKy8qZmxhZ3M6ICYweDEgZm9yIHdhaXQsKi8KK2ludCBkZWNvZGVyX2JtbXVfYm94X2NoZWNrX2FuZF93YWl0X3NpemUoCisJaW50IHNpemUsIGludCBmbGFncywgaW50IG1lbV9mbGFncyk7CisKK2ludCBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkoCisJdm9pZCAqaGFuZGxlLCBpbnQgaWR4LAorCWludCBzaXplLCB1bnNpZ25lZCBjaGFyICpkcml2ZXJfbmFtZSwKKwl1bnNpZ25lZCBsb25nICpidWZfcGh5X2FkZHIpOworCitpbnQgZGVjb2Rlcl9ibW11X2JveF9hZGRfY2FsbGJhY2tfZnVuYygKKwl2b2lkICpoYW5kbGUsIGludCBpZHgsCisJdm9pZCAqY2IpOworCisjZGVmaW5lIEJNTVVfQUxMT0NfRkxBR1NfV0FJVCAoMSA8PCAwKQorI2RlZmluZSBCTU1VX0FMTE9DX0ZMQUdTX0NBTl9DTEVBUl9LRUVQRVIgKDEgPDwgMSkKKyNkZWZpbmUgQk1NVV9BTExPQ19GTEFHU19XQUlUQ0xFQVIgXAorCQkoQk1NVV9BTExPQ19GTEFHU19XQUlUIHxcCisJCUJNTVVfQUxMT0NfRkxBR1NfQ0FOX0NMRUFSX0tFRVBFUikKKworaW50IGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfaWR4X3dhaXQoCisJdm9pZCAqaGFuZGxlLCBpbnQgaWR4LAorCWludCBzaXplLCBpbnQgYWxpZ25lZF8ybiwKKwlpbnQgbWVtX2ZsYWdzLAorCWludCB3YWl0X2ZsYWdzKTsKKworYm9vbCBkZWNvZGVyX2JtbXVfYm94X3ZhbGlkZV9jaGVjayh2b2lkICpib3gpOwordm9pZCBkZWNvZGVyX2JtbXVfdHJ5X3RvX3JlbGVhc2VfYm94KHZvaWQgKmhhbmRsZSk7CisKK2ludCBkZWNvZGVyX2JtbXVfYm94X2luaXQodm9pZCk7Cit2b2lkIGRlY29kZXJfYm1tdV9ib3hfZXhpdCh2b2lkKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy9kZWNvZGVyX21tdV9ib3guYyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy9kZWNvZGVyX21tdV9ib3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzE4MGRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL2RlY29kZXJfbW11X2JveC5jCkBAIC0wLDAgKzEsNDE2IEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL21lZGlhL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvZGVjb2Rlcl9tbXVfYm94LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29kZWNfbW1fc2NhdHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorc3RydWN0IGRlY29kZXJfbW11X2JveCB7CisJaW50IG1heF9zY19udW07CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgY2hhbm5lbF9pZDsKKwlpbnQgdHZwX21vZGU7CisJc3RydWN0IG11dGV4IG11dGV4OworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgY29kZWNfbW1fc2NhdHRlciAqc2NfbGlzdFsxXTsKK307CisjZGVmaW5lIE1BWF9LRUVQX0ZSQU1FIDQKKyNkZWZpbmUgU1RBUlRfS0VFUF9JRCAweDkKKyNkZWZpbmUgTUFYX0tFRVBfSUQgICAgKElOVF9NQVggLSAxKQorc3RydWN0IGRlY29kZXJfbW11X2JveF9tZ3IgeworCWludCBudW07CisJc3RydWN0IG11dGV4IG11dGV4OworCXN0cnVjdCBjb2RlY19tbV9zY2F0dGVyICprZWVwX3NjW01BWF9LRUVQX0ZSQU1FXTsKKwlpbnQJa2VlcF9pZFtNQVhfS0VFUF9GUkFNRV07CisJaW50IG5leHRfaWQ7LyppZCBmb3Iga2VlcCAmIGZyZWUuKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGJveF9saXN0OworfTsKK3N0YXRpYyBzdHJ1Y3QgZGVjb2Rlcl9tbXVfYm94X21nciBnbG9iYWxfbWdyOworc3RhdGljIHN0cnVjdCBkZWNvZGVyX21tdV9ib3hfbWdyICpnZXRfZGVjb2Rlcl9tbXVfYm94X21ncih2b2lkKQoreworCXJldHVybiAmZ2xvYmFsX21ncjsKK30KKworc3RhdGljIGludCBkZWNvZGVyX21tdV9ib3hfbWdyX2FkZF9ib3goc3RydWN0IGRlY29kZXJfbW11X2JveCAqYm94KQoreworCXN0cnVjdCBkZWNvZGVyX21tdV9ib3hfbWdyICptZ3IgPSBnZXRfZGVjb2Rlcl9tbXVfYm94X21ncigpOworCisJbXV0ZXhfbG9jaygmbWdyLT5tdXRleCk7CisJbGlzdF9hZGRfdGFpbCgmYm94LT5saXN0LCAmbWdyLT5ib3hfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZtZ3ItPm11dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVyX21tdV9ib3hfbWdyX2RlbF9ib3goc3RydWN0IGRlY29kZXJfbW11X2JveCAqYm94KQoreworCXN0cnVjdCBkZWNvZGVyX21tdV9ib3hfbWdyICptZ3IgPSBnZXRfZGVjb2Rlcl9tbXVfYm94X21ncigpOworCisJbXV0ZXhfbG9jaygmbWdyLT5tdXRleCk7CisJbGlzdF9kZWwoJmJveC0+bGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZtZ3ItPm11dGV4KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGRlY29kZXJfbW11X2JveF9zY19jaGVjayh2b2lkICpoYW5kbGUsIGludCBpc190dnApCit7CisJc3RydWN0IGRlY29kZXJfbW11X2JveCAqYm94ID0gaGFuZGxlOworCWlmICghYm94KSB7CisJCQlwcl9lcnIoIm1tdSBib3ggTlVMTCAhISFcbiIpOworCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiBjb2RlY19tbV9zY2F0dGVyX3NpemUoaXNfdHZwKTsKK30KK0VYUE9SVF9TWU1CT0woZGVjb2Rlcl9tbXVfYm94X3NjX2NoZWNrKTsKKworCit2b2lkICpkZWNvZGVyX21tdV9ib3hfYWxsb2NfYm94KGNvbnN0IGNoYXIgKm5hbWUsCisJaW50IGNoYW5uZWxfaWQsCisJaW50IG1heF9udW0sCisJaW50IG1pbl9zaXplX00sCisJaW50IG1lbV9mbGFncykKKy8qbWluX3NpemVfTTp3YWl0IGFsbG9jIHRoaXMgc2l6ZSovCit7CisJc3RydWN0IGRlY29kZXJfbW11X2JveCAqYm94OworCWludCBzaXplOworCisJcHJfZGVidWcoImRlY29kZXJfbW11X2JveF9hbGxvY19ib3gsIG1lbV9mbGFncyA9IDB4JXhcbiIsIG1lbV9mbGFncyk7CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBkZWNvZGVyX21tdV9ib3gpICsKKwkJCXNpemVvZihzdHJ1Y3QgY29kZWNfbW1fc2NhdHRlciAqKSAqCisJCQltYXhfbnVtOworCWJveCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFib3gpIHsKKwkJcHJfZXJyKCJjYW4ndCBhbGxvYyBkZWNvZGVyIGJ1ZmZlcnMgYm94ISEhXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldChib3gsIDAsIHNpemUpOworCWJveC0+bWF4X3NjX251bSA9IG1heF9udW07CisJYm94LT5uYW1lID0gbmFtZTsKKwlib3gtPmNoYW5uZWxfaWQgPSBjaGFubmVsX2lkOworCWJveC0+dHZwX21vZGUgPSBtZW1fZmxhZ3M7CisKKwltdXRleF9pbml0KCZib3gtPm11dGV4KTsKKwlJTklUX0xJU1RfSEVBRCgmYm94LT5saXN0KTsKKwlkZWNvZGVyX21tdV9ib3hfbWdyX2FkZF9ib3goYm94KTsKKwljb2RlY19tbV9zY2F0dGVyX21ndF9kZWxheV9mcmVlX3N3aXRjaCgxLCAyMDAwLAorCQltaW5fc2l6ZV9NLCBib3gtPnR2cF9tb2RlKTsKKwlyZXR1cm4gKHZvaWQgKilib3g7Cit9CitFWFBPUlRfU1lNQk9MKGRlY29kZXJfbW11X2JveF9hbGxvY19ib3gpOworCitpbnQgZGVjb2Rlcl9tbXVfYm94X2FsbG9jX2lkeCgKKwl2b2lkICpoYW5kbGUsIGludCBpZHgsIGludCBudW1fcGFnZXMsCisJdW5zaWduZWQgaW50ICptbXVfaW5kZXhfYWRyKQoreworCXN0cnVjdCBkZWNvZGVyX21tdV9ib3ggKmJveCA9IGhhbmRsZTsKKwlzdHJ1Y3QgY29kZWNfbW1fc2NhdHRlciAqc2M7CisJaW50IHJldDsKKwlpbnQgaTsKKworCWlmICghYm94IHx8IGlkeCA8IDAgfHwgaWR4ID49IGJveC0+bWF4X3NjX251bSkgeworCQlwcl9lcnIoImNhbid0IGFsbG9jIG1tdSBib3goJXApLGlkeDolZFxuIiwKKwkJCWJveCwgaWR4KTsKKwkJcmV0dXJuIC0xOworCX0KKwltdXRleF9sb2NrKCZib3gtPm11dGV4KTsKKwlzYyA9IGJveC0+c2NfbGlzdFtpZHhdOworCWlmIChzYykgeworCQlpZiAoc2MtPnBhZ2VfbWF4X2NudCA+PSBudW1fcGFnZXMpCisJCQlyZXQgPSBjb2RlY19tbV9zY2F0dGVyX2FsbG9jX3dhbnRfcGFnZXMoc2MsCisJCQkJbnVtX3BhZ2VzKTsKKwkJZWxzZSB7CisJCQljb2RlY19tbV9zY2F0dGVyX2RlY19vd25lcl91c2VyKHNjLCAwKTsKKwkJCWJveC0+c2NfbGlzdFtpZHhdID0gTlVMTDsKKwkJCXNjID0gTlVMTDsKKwkJfQorCisJfQorCWlmICghc2MpIHsKKwkJc2MgPSBjb2RlY19tbV9zY2F0dGVyX2FsbG9jKG51bV9wYWdlcyArIDY0LCBudW1fcGFnZXMsCisJCQlib3gtPnR2cF9tb2RlKTsKKwkJaWYgKCFzYykgeworCQkJbXV0ZXhfdW5sb2NrKCZib3gtPm11dGV4KTsKKwkJCXByX2VycigiYWxsb2MgbW11IGZhaWxlZCwgbmVlZCBwYWdlcz0lZFxuIiwKKwkJCQludW1fcGFnZXMpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWJveC0+c2NfbGlzdFtpZHhdID0gc2M7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgaSsrKQorCQltbXVfaW5kZXhfYWRyW2ldID0gUEFHRV9JTkRFWChzYy0+cGFnZXNfbGlzdFtpXSk7CisKKwltdXRleF91bmxvY2soJmJveC0+bXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRlY29kZXJfbW11X2JveF9hbGxvY19pZHgpOworCitpbnQgZGVjb2Rlcl9tbXVfYm94X2ZyZWVfaWR4X3RhaWwoCisJCXZvaWQgKmhhbmRsZSwgaW50IGlkeCwKKwkJaW50IHN0YXJ0X3JlbGVhc2VfaW5kZXgpCit7CisJc3RydWN0IGRlY29kZXJfbW11X2JveCAqYm94ID0gaGFuZGxlOworCXN0cnVjdCBjb2RlY19tbV9zY2F0dGVyICpzYzsKKworCWlmICghYm94IHx8IGlkeCA8IDAgfHwgaWR4ID49IGJveC0+bWF4X3NjX251bSkgeworCQlwcl9lcnIoImNhbid0IGZyZWUgdGFpbCBtbXUgYm94KCVwKSxpZHg6JWQgaW4gKCVkLSVkKVxuIiwKKwkJCWJveCwgaWR4LCAwLAorCQkJYm94ID8gKGJveC0+bWF4X3NjX251bSAtIDEpIDogMCk7CisJCXJldHVybiAtMTsKKwl9CisJbXV0ZXhfbG9jaygmYm94LT5tdXRleCk7CisJc2MgPSBib3gtPnNjX2xpc3RbaWR4XTsKKwlpZiAoc2MgJiYgc3RhcnRfcmVsZWFzZV9pbmRleCA8IHNjLT5wYWdlX2NudCkKKwkJY29kZWNfbW1fc2NhdHRlcl9mcmVlX3RhaWxfcGFnZXNfZmFzdChzYywKKwkJCQlzdGFydF9yZWxlYXNlX2luZGV4KTsKKwltdXRleF91bmxvY2soJmJveC0+bXV0ZXgpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkZWNvZGVyX21tdV9ib3hfZnJlZV9pZHhfdGFpbCk7CisKK2ludCBkZWNvZGVyX21tdV9ib3hfZnJlZV9pZHgodm9pZCAqaGFuZGxlLCBpbnQgaWR4KQoreworCXN0cnVjdCBkZWNvZGVyX21tdV9ib3ggKmJveCA9IGhhbmRsZTsKKwlzdHJ1Y3QgY29kZWNfbW1fc2NhdHRlciAqc2M7CisKKwlpZiAoIWJveCB8fCBpZHggPCAwIHx8IGlkeCA+PSBib3gtPm1heF9zY19udW0pIHsKKwkJcHJfZXJyKCJjYW4ndCBmcmVlIGlkeCBvZiBib3goJXApLGlkeDolZCAgaW4gKCVkLSVkKVxuIiwKKwkJCWJveCwgaWR4LCAwLAorCQkJYm94ID8gKGJveC0+bWF4X3NjX251bSAtIDEpIDogMCk7CisJCXJldHVybiAtMTsKKwl9CisKKwltdXRleF9sb2NrKCZib3gtPm11dGV4KTsKKwlzYyA9IGJveC0+c2NfbGlzdFtpZHhdOworCWlmIChzYyAmJiBzYy0+cGFnZV9jbnQgPiAwKSB7CisJCWNvZGVjX21tX3NjYXR0ZXJfZGVjX293bmVyX3VzZXIoc2MsIDApOworCQlib3gtPnNjX2xpc3RbaWR4XSA9IE5VTEw7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZib3gtPm11dGV4KTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkZWNvZGVyX21tdV9ib3hfZnJlZV9pZHgpOworCitpbnQgZGVjb2Rlcl9tbXVfYm94X2ZyZWUodm9pZCAqaGFuZGxlKQoreworCXN0cnVjdCBkZWNvZGVyX21tdV9ib3ggKmJveCA9IGhhbmRsZTsKKwlzdHJ1Y3QgY29kZWNfbW1fc2NhdHRlciAqc2M7CisJaW50IGk7CisKKwlpZiAoIWJveCkgeworCQlwcl9lcnIoImNhbid0IGZyZWUgYm94IG9mIE5VTEwgYm94IVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwltdXRleF9sb2NrKCZib3gtPm11dGV4KTsKKwlmb3IgKGkgPSAwOyBpIDwgYm94LT5tYXhfc2NfbnVtOyBpKyspIHsKKwkJc2MgPSBib3gtPnNjX2xpc3RbaV07CisJCWlmIChzYykgeworCQkJY29kZWNfbW1fc2NhdHRlcl9kZWNfb3duZXJfdXNlcihzYywgMCk7CisJCQlib3gtPnNjX2xpc3RbaV0gPSBOVUxMOworCisJCX0KKwl9CisKKwljb2RlY19tbV9zY2F0dGVyX21ndF9kZWxheV9mcmVlX3N3aXRjaCgwLCAwLCAwLCBib3gtPnR2cF9tb2RlKTsKKworCW11dGV4X3VubG9jaygmYm94LT5tdXRleCk7CisKKwlkZWNvZGVyX21tdV9ib3hfbWdyX2RlbF9ib3goYm94KTsKKwlrZnJlZShib3gpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRlY29kZXJfbW11X2JveF9mcmVlKTsKKwordm9pZCAqZGVjb2Rlcl9tbXVfYm94X2dldF9tZW1faGFuZGxlKHZvaWQgKmJveF9oYW5kbGUsIGludCBpZHgpCit7CisJc3RydWN0IGRlY29kZXJfbW11X2JveCAqYm94ID0gYm94X2hhbmRsZTsKKworCWlmICghYm94IHx8IGlkeCA8IDAgfHwgaWR4ID49IGJveC0+bWF4X3NjX251bSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICBib3gtPnNjX2xpc3RbaWR4XTsKK30KK0VYUE9SVF9TWU1CT0woZGVjb2Rlcl9tbXVfYm94X2dldF9tZW1faGFuZGxlKTsKKworc3RhdGljIGludCBkZWNvZGVyX21tdV9ib3hfZHVtcChzdHJ1Y3QgZGVjb2Rlcl9tbXVfYm94ICpib3gsCisJCQkJdm9pZCAqYnVmLCBpbnQgc2l6ZSkKK3sKKwljaGFyICpwYnVmID0gYnVmOworCWNoYXIgc2J1Zls1MTJdOworCWludCB0c2l6ZSA9IDA7CisJaW50IHM7CisJaW50IGk7CisKKwlpZiAoIWJ1ZikgeworCQlwYnVmID0gc2J1ZjsKKwkJc2l6ZSA9IDUxMjsKKwl9CisJI2RlZmluZSBCVUZQUklOVChhcmdzLi4uKSBcCisJZG8ge1wKKwkJcyA9IHNucHJpbnRmKHBidWYsIHNpemUgLSB0c2l6ZSwgYXJncyk7XAorCQl0c2l6ZSArPSBzO1wKKwkJcGJ1ZiArPSBzOyBcCisJfSB3aGlsZSAoMCkKKworCWZvciAoaSA9IDA7IGkgPCBib3gtPm1heF9zY19udW07IGkrKykgeworCQlzdHJ1Y3QgY29kZWNfbW1fc2NhdHRlciAqc2MgPSBib3gtPnNjX2xpc3RbaV07CisKKwkJaWYgKHNjKSB7CisJCQlCVUZQUklOVCgic2MgbWVtWyVkXTolcCwgc2l6ZT0lZFxuIiwKKwkJCQlpLCBzYywKKwkJCQlzYy0+cGFnZV9jbnQgPDwgUEFHRV9TSElGVCk7CisJCX0KKwl9CisjdW5kZWYgQlVGUFJJTlQKKwlpZiAoIWJ1ZikKKwkJcHJfaW5mbygiJXMiLCBzYnVmKTsKKworCXJldHVybiB0c2l6ZTsKK30KKworc3RhdGljIGludCBkZWNvZGVyX21tdV9ib3hfZHVtcF9hbGwodm9pZCAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgZGVjb2Rlcl9tbXVfYm94X21nciAqbWdyID0gZ2V0X2RlY29kZXJfbW11X2JveF9tZ3IoKTsKKwljaGFyICpwYnVmID0gYnVmOworCWNoYXIgc2J1Zls1MTJdOworCWludCB0c2l6ZSA9IDA7CisJaW50IHM7CisJaW50IGk7CisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgKmxpc3Q7CisKKwlpZiAoIXBidWYpIHsKKwkJcGJ1ZiA9IHNidWY7CisJCXNpemUgPSA1MTI7CisJfQorCisJI2RlZmluZSBCVUZQUklOVChhcmdzLi4uKSBcCisJZG8ge1wKKwkJcyA9IHNucHJpbnRmKHBidWYsIHNpemUgLSB0c2l6ZSwgYXJncyk7XAorCQl0c2l6ZSArPSBzO1wKKwkJcGJ1ZiArPSBzOyBcCisJfSB3aGlsZSAoMCkKKworCW11dGV4X2xvY2soJm1nci0+bXV0ZXgpOworCWhlYWQgPSAmbWdyLT5ib3hfbGlzdDsKKwlsaXN0ID0gaGVhZC0+bmV4dDsKKwlpID0gMDsKKwl3aGlsZSAobGlzdCAhPSBoZWFkKSB7CisJCXN0cnVjdCBkZWNvZGVyX21tdV9ib3ggKmJveDsKKwkJYm94ID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgZGVjb2Rlcl9tbXVfYm94LAorCQkJCQkJCWxpc3QpOworCQlCVUZQUklOVCgiYm94WyVkXTogJXMsICVzcGxheWVyX2lkOiVkLCBtYXhfbnVtOiVkXG4iLAorCQkJaSwKKwkJCWJveC0+bmFtZSwKKwkJCWJveC0+dHZwX21vZGUgPyAiVFZQIG1vZGUgIiA6ICIiLAorCQkJYm94LT5jaGFubmVsX2lkLAorCQkJYm94LT5tYXhfc2NfbnVtKTsKKwkJaWYgKGJ1ZikgeworCQkJcyArPSBkZWNvZGVyX21tdV9ib3hfZHVtcChib3gsIHBidWYsIHNpemUgLSB0c2l6ZSk7CisJCQlpZiAocyA+IDApIHsKKwkJCQl0c2l6ZSArPSBzOworCQkJCXBidWYgKz0gczsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXByX2luZm8oIiVzIiwgc2J1Zik7CisJCQlwYnVmID0gc2J1ZjsKKwkJCXRzaXplICs9IGRlY29kZXJfbW11X2JveF9kdW1wKGJveCwgTlVMTCwgMCk7CisJCX0KKwkJbGlzdCA9IGxpc3QtPm5leHQ7CisJCWkrKzsKKwl9CisJbXV0ZXhfdW5sb2NrKCZtZ3ItPm11dGV4KTsKKworCisjdW5kZWYgQlVGUFJJTlQKKwlpZiAoIWJ1ZikKKwkJcHJfaW5mbygiJXMiLCBzYnVmKTsKKwlyZXR1cm4gdHNpemU7Cit9CisKKworCitzdGF0aWMgc3NpemVfdAorYm94X2R1bXBfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQkgICAgICAgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXNzaXplX3QgcmV0ID0gMDsKKworCXJldCA9IGRlY29kZXJfbW11X2JveF9kdW1wX2FsbChidWYsIFBBR0VfU0laRSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIENMQVNTX0FUVFJfUk8oYm94X2R1bXApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZGVjb2Rlcl9tbXVfYm94X2NsYXNzX2F0dHJzW10gPSB7CisJJmNsYXNzX2F0dHJfYm94X2R1bXAuYXR0ciwKKwlOVUxMCit9OworCitBVFRSSUJVVEVfR1JPVVBTKGRlY29kZXJfbW11X2JveF9jbGFzcyk7CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgZGVjb2Rlcl9tbXVfYm94X2NsYXNzID0geworCS5uYW1lID0gImRlY29kZXJfbW11X2JveCIsCisJLmNsYXNzX2dyb3VwcyA9IGRlY29kZXJfbW11X2JveF9jbGFzc19ncm91cHMsCit9OworCitpbnQgZGVjb2Rlcl9tbXVfYm94X2luaXQodm9pZCkKK3sKKwlpbnQgcjsKKworCW1lbXNldCgmZ2xvYmFsX21nciwgMCwgc2l6ZW9mKGdsb2JhbF9tZ3IpKTsKKwlJTklUX0xJU1RfSEVBRCgmZ2xvYmFsX21nci5ib3hfbGlzdCk7CisJbXV0ZXhfaW5pdCgmZ2xvYmFsX21nci5tdXRleCk7CisJZ2xvYmFsX21nci5uZXh0X2lkID0gU1RBUlRfS0VFUF9JRDsKKwlyID0gY2xhc3NfcmVnaXN0ZXIoJmRlY29kZXJfbW11X2JveF9jbGFzcyk7CisJcmV0dXJuIHI7Cit9CitFWFBPUlRfU1lNQk9MKGRlY29kZXJfbW11X2JveF9pbml0KTsKKwordm9pZCBkZWNvZGVyX21tdV9ib3hfZXhpdCh2b2lkKQoreworCWNsYXNzX3VucmVnaXN0ZXIoJmRlY29kZXJfbW11X2JveF9jbGFzcyk7CisJcHJfaW5mbygiZGVjIG1tdSBib3ggZXhpdC5cbiIpOworfQorCisjaWYgMAorc3RhdGljIGludCBfX2luaXQgZGVjb2Rlcl9tbXVfYm94X2luaXQodm9pZCkKK3sKKwlpbnQgcjsKKworCW1lbXNldCgmZ2xvYmFsX21nciwgMCwgc2l6ZW9mKGdsb2JhbF9tZ3IpKTsKKwlJTklUX0xJU1RfSEVBRCgmZ2xvYmFsX21nci5ib3hfbGlzdCk7CisJbXV0ZXhfaW5pdCgmZ2xvYmFsX21nci5tdXRleCk7CisJZ2xvYmFsX21nci5uZXh0X2lkID0gU1RBUlRfS0VFUF9JRDsKKwlyID0gY2xhc3NfcmVnaXN0ZXIoJmRlY29kZXJfbW11X2JveF9jbGFzcyk7CisJcmV0dXJuIHI7Cit9CisKK21vZHVsZV9pbml0KGRlY29kZXJfbW11X2JveF9pbml0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL2RlY29kZXJfbW11X2JveC5oIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL2RlY29kZXJfbW11X2JveC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYjNkZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvZGVjb2Rlcl9tbXVfYm94LmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9tZWRpYS9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL2RlY29kZXJfbW11X2JveC5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgREVDT0RFUl9CVUZGRVJfQk9YCisjZGVmaW5lIERFQ09ERVJfQlVGRkVSX0JPWAorCit2b2lkICpkZWNvZGVyX21tdV9ib3hfYWxsb2NfYm94KGNvbnN0IGNoYXIgKm5hbWUsCisJaW50IGNoYW5uZWxfaWQsCisJaW50IG1heF9udW0sCisJaW50IG1pbl9zaXplX00sCisJaW50IG1lbV9mbGFncyk7CisKK2ludCBkZWNvZGVyX21tdV9ib3hfc2NfY2hlY2sodm9pZCAqaGFuZGxlLCBpbnQgaXNfdHZwKTsKKworaW50IGRlY29kZXJfbW11X2JveF9hbGxvY19pZHgoCisJdm9pZCAqaGFuZGxlLCBpbnQgaWR4LCBpbnQgbnVtX3BhZ2VzLAorCXVuc2lnbmVkIGludCAqbW11X2luZGV4X2Fkcik7CisKK2ludCBkZWNvZGVyX21tdV9ib3hfZnJlZV9pZHhfdGFpbCh2b2lkICpoYW5kbGUsIGludCBpZHgsCisJaW50IHN0YXJ0X3JlbGVhc2VfaW5kZXgpOworCitpbnQgZGVjb2Rlcl9tbXVfYm94X2ZyZWVfaWR4KHZvaWQgKmhhbmRsZSwgaW50IGlkeCk7CisKK2ludCBkZWNvZGVyX21tdV9ib3hfZnJlZSh2b2lkICpoYW5kbGUpOworCitpbnQgZGVjb2Rlcl9tbXVfYm94X21vdmVfa2VlcF9pZHgodm9pZCAqYm94X2hhbmRsZSwKKwlpbnQga2VlcF9pZHgpOworaW50IGRlY29kZXJfbW11X2JveF9mcmVlX2tlZXAoaW50IGtlZXBfaWQpOworCitpbnQgZGVjb2Rlcl9tbXVfYm94X2ZyZWVfYWxsX2tlZXAodm9pZCk7CisKK3ZvaWQgKmRlY29kZXJfbW11X2JveF9nZXRfbWVtX2hhbmRsZSh2b2lkICpib3hfaGFuZGxlLCBpbnQgaWR4KTsKKworaW50IGRlY29kZXJfbW11X2JveF9pbml0KHZvaWQpOworCit2b2lkIGRlY29kZXJfbW11X2JveF9leGl0KHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy9maXJtd2FyZS5oIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL2Zpcm13YXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q0ODAzNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy9maXJtd2FyZS5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNyBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisqIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyoKKyogRGVzY3JpcHRpb246CisqLworI2lmbmRlZiBfX1ZJREVPX0ZJUk1XQVJFX0hFQURFUl8KKyNkZWZpbmUgX19WSURFT19GSVJNV0FSRV9IRUFERVJfCisKKyNpbmNsdWRlICIuLi8uLi8uLi9jb21tb24vZmlybXdhcmUvZmlybXdhcmVfdHlwZS5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmZvcm1hdC5oPgorI2lmIGRlZmluZWQoQ09ORklHX0FNTE9HSUNfVEVFKSB8fCBkZWZpbmVkKENPTkZJR19BTUxPR0lDX1RFRV9NT0RVTEUpCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy90ZWUuaD4KKyNlbmRpZgorCisjZGVmaW5lIEZXX0xPQURfRk9SQ0UJKDB4MSkKKyNkZWZpbmUgRldfTE9BRF9UUlkJKDBYMikKKworc3RydWN0IGZpcm13YXJlX3MgeworCWNoYXIgbmFtZVszMl07CisJdW5zaWduZWQgaW50IGxlbjsKKwljaGFyIGRhdGFbMF07Cit9OworCitleHRlcm4gaW50IGdldF9kZWNvZGVyX2Zpcm13YXJlX2RhdGEoZW51bSB2Zm9ybWF0X2UgdHlwZSwKKwljb25zdCBjaGFyICpmaWxlX25hbWUsIGNoYXIgKmJ1ZiwgaW50IHNpemUpOworZXh0ZXJuIGludCBnZXRfZGF0YV9mcm9tX25hbWUoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqYnVmKTsKK2V4dGVybiBpbnQgZ2V0X2Zpcm13YXJlX2RhdGEodW5zaWduZWQgaW50IGZvcmFtdCwgY2hhciAqYnVmKTsKK2V4dGVybiBpbnQgdmlkZW9fZndfcmVsb2FkKGludCBtb2RlKTsKKworI2lmICFkZWZpbmVkKENPTkZJR19BTUxPR0lDX1RFRSkgJiYgIWRlZmluZWQoQ09ORklHX0FNTE9HSUNfVEVFX01PRFVMRSkKK3N0YXRpYyBpbmxpbmUgYm9vbCB0ZWVfZW5hYmxlZCh2b2lkKSB7IHJldHVybiBmYWxzZTsgfQorc3RhdGljIGlubGluZSBpbnQgdGVlX2xvYWRfdmlkZW9fZndfc3dhcCh1MzIgaW5kZXgsIHUzMiB2ZGVjLCBib29sIGlzX3N3YXApCit7CisJcmV0dXJuIC0xOworfQorc3RhdGljIGlubGluZSBpbnQgdGVlX2xvYWRfdmlkZW9fZncodTMyIGluZGV4LCB1MzIgdmRlYykKK3sKKwlyZXR1cm4gLTE7Cit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvZnJhbWVfY2hlY2suYyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy9mcmFtZV9jaGVjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MDBmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvZnJhbWVfY2hlY2suYwpAQCAtMCwwICsxLDE3ODAgQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvbWVkaWEvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy9mcmFtZV9jaGVjay5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvZGVjX21tLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtY29udGlndW91cy5oPgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jb2RlY19tbS9jb25maWdzLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgInZkZWMuaCIKKyNpbmNsdWRlICJmcmFtZV9jaGVjay5oIgorI2luY2x1ZGUgImFtbG9naWNfZmJjX2hvb2suaCIKKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZS1mbGFncy5oPgorI2luY2x1ZGUgIi4uLy4uLy4uL2NvbW1vbi9jaGlwcy9kZWNvZGVyX2NwdV92ZXJfaW5mby5oIgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisKKyNkZWZpbmUgRkNfRVJST1IJMHgwCisKKyNkZWZpbmUgRkNfWVVWX0RFQlVHCTB4MDEKKyNkZWZpbmUgRkNfQ1JDX0RFQlVHCTB4MDIKKyNkZWZpbmUgRkNfVFNUX0RFQlVHCTB4ODAKKyNkZWZpbmUgRkNfRVJSX0NSQ19CTE9DS19NT0RFCTB4MTAKKyNkZWZpbmUgRkNfQ0hFQ0tfQ1JDX0xPT1BfTU9ERQkweDIwCisjZGVmaW5lIEFEX0NIRUNLX0NSQ19MT09QX01PREUJMHg0MAorCisjZGVmaW5lIFlVVl9NQVNLCTB4MDEKKyNkZWZpbmUgQ1JDX01BU0sJMHgwMgorI2RlZmluZSBBVVhfTUFTSwkweDA0CisKKworI2RlZmluZSBNQVhfWVVWX1NJWkUgKDQwOTYgKiAyMzA0KQorI2RlZmluZSBZVVZfREVGX1NJWkUgKE1BWF9ZVVZfU0laRSAqIDMgLyAyKQorI2RlZmluZSBZVVZfREVGX05VTQkgMQorCisjZGVmaW5lIE1BWF9TSVpFX0FGQkNfUExBTkVTIAkoNDA5NiAqIDIwNDgpCisKKyNkZWZpbmUgVk1BUF9TVFJJREVfU0laRSAgKDEwMjQqMTAyNCkKKworc3RhdGljIHVuc2lnbmVkIGludCBmY19kZWJ1ZzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2l6ZV95dXZfYnVmID0gKFlVVl9ERUZfU0laRSAqIFlVVl9ERUZfTlVNKTsKKworI2RlZmluZSBkYmdfcHJpbnQobWFzaywgLi4uKSBkbyB7CQkJCQlcCisJCQlpZiAoKGZjX2RlYnVnICYgbWFzaykgfHwJCQkJXAorCQkJCShtYXNrID09IEZDX0VSUk9SKSkJCQkJCVwKKwkJCQlwcmludGsoIltGUkFNRV9DSEVDS10gIl9fVkFfQVJHU19fKTtcCisJCX0gd2hpbGUoMCkKKworCisjZGVmaW5lIENSQ19QQVRIICAiL2RhdGEvdG1wLyIKKyNkZWZpbmUgWVVWX1BBVEggICIvZGF0YS90bXAvIgorc3RhdGljIGNoYXIgY29tcF9jcmNbMTI4XSA9ICJuYW1lIjsKK3N0YXRpYyBjaGFyIGF1eF9jb21wX2NyY1sxMjhdID0gImF1eCI7CisKK3N0YXRpYyBzdHJ1Y3QgdmRlY19zICpzaW5nbGVfbW9kZV92ZGVjID0gTlVMTDsKKworc3RhdGljIHVuc2lnbmVkIGludCB5dXZfZW5hYmxlLCBjaGVja19lbmFibGU7CitzdGF0aWMgdW5zaWduZWQgaW50IGF1eF9lbmFibGU7CitzdGF0aWMgdW5zaWduZWQgaW50IHl1dl9zdGFydFtNQVhfSU5TVEFOQ0VfTVVOXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgeXV2X251bVtNQVhfSU5TVEFOQ0VfTVVOXTsKKworI2RlZmluZSBDSEVDS1NVTV9QQVRIICAiL2RhdGEvbG9jYWwvdG1wLyIKK3N0YXRpYyBjaGFyIGNoZWNrc3VtX2luZm9bMTI4XSA9ICJjaGVja3N1bSBpbmZvIjsKK3N0YXRpYyBjaGFyIGNoZWNrc3VtX2ZpbGVuYW1lWzEyOF0gPSAiY2hlY2tzdW0iOworc3RhdGljIHVuc2lnbmVkIGludCBjaGVja3N1bV9lbmFibGU7CitzdGF0aWMgdW5zaWduZWQgaW50IGNoZWNrc3VtX3N0YXJ0X2NvdW50OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGZvcm1hdF9uYW1lW10gPSB7CisJIk1QRUcxMiIsCisJIk1QRUc0IiwKKwkiSDI2NCIsCisJIk1KUEVHIiwKKwkiUkVBTCIsCisJIkpQRUciLAorCSJWQzEiLAorCSJBVlMiLAorCSJZVVYiLAorCSJIMjY0TVZDIiwKKwkiSDI2NF80SzJLIiwKKwkiSEVWQyIsCisJIkgyNjRfRU5DIiwKKwkiSlBFR19FTkMiLAorCSJWUDkiLAorCSJBVlMyIiwKKwkiQVYxIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfZm9ybWF0X25hbWUoaW50IGZvcm1hdCkKK3sKKwlpZiAoZm9ybWF0IDwgMTcgJiYgZm9ybWF0ID49IDApCisJCXJldHVybiBmb3JtYXRfbmFtZVtmb3JtYXRdOworCWVsc2UKKwkJcmV0dXJuICJVbmtub3ciOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZW5hYmxlKHN0cnVjdCBwaWNfY2hlY2tfbWdyX3QgKnAsIGludCBtYXNrKQoreworCXAtPmVuYWJsZSB8PSBtYXNrOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2Rpc2FibGUoc3RydWN0IHBpY19jaGVja19tZ3JfdCAqcCwgaW50IG1hc2spCit7CisJcC0+ZW5hYmxlICY9ICh+bWFzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdXhfc2V0X2VuYWJsZShzdHJ1Y3QgYXV4X2RhdGFfY2hlY2tfbWdyX3QgKnAsIGludCBtYXNrKQoreworCXAtPmVuYWJsZSB8PSBtYXNrOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXV4X3NldF9kaXNhYmxlKHN0cnVjdCBhdXhfZGF0YV9jaGVja19tZ3JfdCAqcCwgaW50IG1hc2spCit7CisJcC0+ZW5hYmxlICY9ICh+bWFzayk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX3NjaGVkdWxlKHN0cnVjdCBwaWNfY2hlY2tfbWdyX3QgKm1ncikKK3sKKwlpZiAoYXRvbWljX3JlYWQoJm1nci0+d29ya19pbml0ZWQpKQorCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJm1nci0+ZnJhbWVfY2hlY2tfd29yayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdXhfZGF0YV9jaGVja19zY2hlZHVsZShzdHJ1Y3QgYXV4X2RhdGFfY2hlY2tfbWdyX3QgKm1ncikKK3sKKwlpZiAoYXRvbWljX3JlYWQoJm1nci0+d29ya19pbml0ZWQpKQorCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJm1nci0+YXV4X2RhdGFfY2hlY2tfd29yayk7Cit9CisKK3N0YXRpYyBib29sIGlzX292ZXJzaXplKGludCB3LCBpbnQgaCkKK3sKKwlpZiAodyA8PSAwIHx8IGggPD0gMCkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoaCAhPSAwICYmICh3ID4gKE1BWF9ZVVZfU0laRSAvIGgpKSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3Vuc2lnbmVkIGxvbmcgdmRlY19jYXZfZ2V0X2FkZHIoaW50IGluZGV4KTsKK3Vuc2lnbmVkIGludCB2ZGVjX2Nhdl9nZXRfd2lkdGgoaW50IGluZGV4KTsKK3Vuc2lnbmVkIGludCB2ZGVjX2Nhdl9nZXRfaGVpZ2h0KGludCBpbmRleCk7CisjZGVmaW5lIGNhbnZhc18wKHYpICgodikgJiAweGZmKQorI2RlZmluZSBjYW52YXNfMSh2KSAoKCh2KSA+PiA4KSAmIDB4ZmYpCisjZGVmaW5lIGNhbnZhc18yKHYpICgoKHYpID4+IDE2KSAmIDB4ZmYpCisjZGVmaW5lIGNhbnZhc18zKHYpICgoKHYpID4+IDI0KSAmIDB4ZmYpCisKKyNkZWZpbmUgY2FudmFzWSh2KSBjYW52YXNfMCh2KQorI2RlZmluZSBjYW52YXNVKHYpIGNhbnZhc18xKHYpCisjZGVmaW5lIGNhbnZhc1YodikgY2FudmFzXzIodikKKyNkZWZpbmUgY2FudmFzVVYodikgY2FudmFzXzEodikKKworc3RhdGljIGludCBnZXRfZnJhbWVfc2l6ZShzdHJ1Y3QgcGljX2NoZWNrX21ncl90ICpwaWMsCisJc3RydWN0IHZmcmFtZV9zICp2ZikKK3sKKwlpZiAoaXNfb3ZlcnNpemUodmYtPndpZHRoLCB2Zi0+aGVpZ2h0KSkgeworCQkJZGJnX3ByaW50KEZDX0VSUk9SLCAidmYgc2l6ZSBlcnI6IHc9JWQsIGg9JWRcbiIsCisJCQkJdmYtPndpZHRoLCB2Zi0+aGVpZ2h0KTsKKwkJCXJldHVybiAtMTsKKwl9CisJcGljLT5oZWlnaHQgPSB2Zi0+aGVpZ2h0OworCXBpYy0+d2lkdGggPSB2Zi0+d2lkdGg7CisJcGljLT5zaXplX3kgPSB2Zi0+d2lkdGggKiB2Zi0+aGVpZ2h0OworCXBpYy0+c2l6ZV91diA9IHBpYy0+c2l6ZV95ID4+ICgxICsgcGljLT5tanBlZ19mbGFnKTsKKwlwaWMtPnNpemVfcGljID0gcGljLT5zaXplX3kgKyAocGljLT5zaXplX3kgPj4gMSk7CisKKwlpZiAoKCEodmYtPnR5cGUgJiBWSURUWVBFX1ZJVV9OVjIxKSkgJiYgKCFwaWMtPm1qcGVnX2ZsYWcpKQorCQlyZXR1cm4gMDsKKworCWlmICgodmYtPmNhbnZhczBBZGRyID09IHZmLT5jYW52YXMxQWRkcikgJiYKKwkJKHZmLT5jYW52YXMwQWRkciAhPSAwKSAmJgorCQkodmYtPmNhbnZhczBBZGRyICE9IC0xKSkgeworCQlwaWMtPmNhbnZhc193ID0gdmRlY19jYXZfZ2V0X3dpZHRoKGNhbnZhc1kodmYtPmNhbnZhczBBZGRyKSk7CisJCQkvL2NhbnZhc19nZXRfd2lkdGgoY2FudmFzWSh2Zi0+Y2FudmFzMEFkZHIpKTsKKwkJcGljLT5jYW52YXNfaCA9IHZkZWNfY2F2X2dldF9oZWlnaHQoY2FudmFzWSh2Zi0+Y2FudmFzMEFkZHIpKTsKKwkJCS8vY2FudmFzX2dldF9oZWlnaHQoY2FudmFzWSh2Zi0+Y2FudmFzMEFkZHIpKTsKKwl9IGVsc2UgeworCQlwaWMtPmNhbnZhc193ID0gdmYtPmNhbnZhczBfY29uZmlnWzBdLndpZHRoOworCQlwaWMtPmNhbnZhc19oID0gdmYtPmNhbnZhczBfY29uZmlnWzBdLmhlaWdodDsKKwl9CisKKwlpZiAoKHBpYy0+Y2FudmFzX2ggPCAxKSB8fCAocGljLT5jYW52YXNfdyA8IDEpKSB7CisJCWRiZ19wcmludChGQ19FUlJPUiwgIihjYW52YXMscGljKSB3KCVkLCVkKSwgaCglZCwlZClcbiIsCisJCQlwaWMtPmNhbnZhc193LCB2Zi0+d2lkdGgsIHBpYy0+Y2FudmFzX2gsIHZmLT5oZWlnaHQpOworCQlyZXR1cm4gLTE7CisJfQorLyoKKwlpbnQgYmxrbW9kOworCWJsa21vZCA9IGNhbnZhc19nZXRfYmxrbW9kZShjYW52YXNZKHZmLT5jYW52YXMwQWRkcikpOworCWlmIChibGttb2QgIT0gQ0FOVkFTX0JMS01PREVfTElORUFSKSB7CisJCWRiZ19wcmludCgwLCAiV0FSTjogY2FudmFzIGJsa21vZCAleFxuIiwgYmxrbW9kKTsKKwl9CisqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhbnZhc19nZXRfdmlydF9hZGRyKHN0cnVjdCBwaWNfY2hlY2tfbWdyX3QgKnBpYywKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmKQoreworCXVuc2lnbmVkIGxvbmcgcGh5X3lfYWRkciwgcGh5X3V2X2FkZHI7CisJdm9pZCAqdmFkZHJfeSwgKnZhZGRyX3V2OworCisJaWYgKCh2Zi0+Y2FudmFzMEFkZHIgPT0gdmYtPmNhbnZhczFBZGRyKSAmJgorCQkodmYtPmNhbnZhczBBZGRyICE9IDApICYmCisJCSh2Zi0+Y2FudmFzMEFkZHIgIT0gLTEpKSB7CisJCXBoeV95X2FkZHIgPSB2ZGVjX2Nhdl9nZXRfYWRkcihjYW52YXNZKHZmLT5jYW52YXMwQWRkcikpOyAvL2NhbnZhc19nZXRfYWRkcihjYW52YXNZKHZmLT5jYW52YXMwQWRkcikpOworCQlwaHlfdXZfYWRkciA9IHZkZWNfY2F2X2dldF9hZGRyKGNhbnZhc1VWKHZmLT5jYW52YXMwQWRkcikpOyAvL2NhbnZhc19nZXRfYWRkcihjYW52YXNVVih2Zi0+Y2FudmFzMEFkZHIpKTsKKwl9IGVsc2UgeworCQlwaHlfeV9hZGRyID0gdmYtPmNhbnZhczBfY29uZmlnWzBdLnBoeV9hZGRyOworCQlwaHlfdXZfYWRkciA9IHZmLT5jYW52YXMwX2NvbmZpZ1sxXS5waHlfYWRkcjsKKwl9CisJdmFkZHJfeQk9IGNvZGVjX21tX3BoeXNfdG9fdmlydChwaHlfeV9hZGRyKTsKKwl2YWRkcl91diA9IGNvZGVjX21tX3BoeXNfdG9fdmlydChwaHlfdXZfYWRkcik7CisKKwlpZiAoKCghdmFkZHJfeSkgfHwgKCF2YWRkcl91dikpICYmICgoIXBoeV95X2FkZHIpIHx8ICghcGh5X3V2X2FkZHIpKSkgeworCQlkYmdfcHJpbnQoRkNfRVJST1IsICIlcywgeV9hZGRyICVwKDB4JWx4KSwgdXZfYWRkciAlcCgweCVseClcbiIsCisJCQlfX2Z1bmNfXywgdmFkZHJfeSwgcGh5X3lfYWRkciwgdmFkZHJfdXYsIHBoeV91dl9hZGRyKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwaWMtPnlfdmFkZHIgPSB2YWRkcl95OworCXBpYy0+dXZfdmFkZHIgPSB2YWRkcl91djsKKwlwaWMtPnlfcGh5YWRkciA9IHBoeV95X2FkZHI7CisJcGljLT51dl9waHlhZGRyID0gcGh5X3V2X2FkZHI7CisKKwlpZiAocGljLT5tanBlZ19mbGFnKSB7CisJCWlmICgodmYtPmNhbnZhczBBZGRyID09IHZmLT5jYW52YXMxQWRkcikgJiYKKwkJKHZmLT5jYW52YXMwQWRkciAhPSAwKSAmJgorCQkodmYtPmNhbnZhczBBZGRyICE9IC0xKSkgeworCQkJcGljLT5leHRyYV92X3BoeWFkZHIgPSBjYW52YXNfZ2V0X2FkZHIoY2FudmFzVih2Zi0+Y2FudmFzMEFkZHIpKTsKKwkJfSBlbHNlIHsKKwkJCXBpYy0+ZXh0cmFfdl9waHlhZGRyID0gdmYtPmNhbnZhczBfY29uZmlnWzJdLnBoeV9hZGRyOworCQl9CisJCXBpYy0+ZXh0cmFfdl92YWRkciA9IGNvZGVjX21tX3BoeXNfdG9fdmlydChwaHlfdXZfYWRkcik7CisKKwkJaWYgKCFwaWMtPmV4dHJhX3ZfdmFkZHIgJiYgIXBpYy0+ZXh0cmFfdl9waHlhZGRyKQorCQkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0cl9zdHJpcChjaGFyICpzdHIpCit7CisJY2hhciAqcyA9IHN0cjsKKwlpbnQgaSA9IDA7CisKKwl3aGlsZSAoc1tpXSkgeworCQlpZiAoc1tpXSA9PSAnXG4nKQorCQkJc1tpXSA9IDA7CisJCWVsc2UgaWYgKHNbaV0gPT0gJyAnKQorCQkJc1tpXSA9ICdfJzsKKwkJaSsrOworCX0KKworCXJldHVybiBpOworfQorCitzdGF0aWMgY2hhciAqZmdldF9jcmNfc3RyKGNoYXIgKmJ1ZiwKKwl1bnNpZ25lZCBpbnQgc2l6ZSwgc3RydWN0IHBpY19jaGVja190ICpmYykKK3sKKwl1bnNpZ25lZCBpbnQgYyA9IDAsIHN6LCByZXQsIGluZGV4LCBjcmMxLCBjcmMyOworCW1tX3NlZ21lbnRfdCBvbGRfZnM7CisJY2hhciAqY3M7CisKKwlpZiAoIWZjLT5jb21wYXJlX2ZwKQorCQlyZXR1cm4gTlVMTDsKKworCW9sZF9mcyA9IGdldF9mcygpOworCXNldF9mcyhLRVJORUxfRFMpOworCisJZG8geworCQljcyA9IGJ1ZjsKKwkJc3ogPSBzaXplOworCQl3aGlsZSAoLS1zeiAmJiAoYyA9IHZmc19yZWFkKGZjLT5jb21wYXJlX2ZwLAorCQkJY3MsIDEsICZmYy0+Y29tcGFyZV9wb3MpICE9IDApKSB7CisJCQlpZiAoKmNzKysgPT0gJ1xuJykKKwkJCQlicmVhazsKKwkJfQorCQkqY3MgPSAnXDAnOworCQlpZiAoKGMgPT0gMCkgJiYgKGNzID09IGJ1ZikpIHsKKwkJCXNldF9mcyhvbGRfZnMpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcmV0ID0gc3NjYW5mKGJ1ZiwgIiUwOHU6ICU4eCAlOHgiLCAmaW5kZXgsICZjcmMxLCAmY3JjMik7CisJCWRiZ19wcmludChGQ19DUkNfREVCVUcsICIlcywgaW5kZXggPSAlZCwgY21wID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgaW5kZXgsIGZjLT5jbXBfY3JjX2NudCk7CisJfXdoaWxlKHJldCAhPSAzIHx8IGluZGV4ICE9IGZjLT5jbXBfY3JjX2NudCk7CisKKwlzZXRfZnMob2xkX2ZzKTsKKwlmYy0+Y21wX2NyY19jbnQrKzsKKworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBjaGFyICpmZ2V0X2F1eF9kYXRhX2NyY19zdHIoY2hhciAqYnVmLAorCXVuc2lnbmVkIGludCBzaXplLCBzdHJ1Y3QgYXV4X2RhdGFfY2hlY2tfdCAqZmMpCit7CisJdW5zaWduZWQgaW50IGMgPSAwLCBzeiwgcmV0LCBpbmRleCwgY3JjOworCW1tX3NlZ21lbnRfdCBvbGRfZnM7CisJY2hhciAqY3M7CisKKwlpZiAoIWZjLT5jb21wYXJlX2ZwKQorCQlyZXR1cm4gTlVMTDsKKworCW9sZF9mcyA9IGdldF9mcygpOworCXNldF9mcyhLRVJORUxfRFMpOworCisJZG8geworCQljcyA9IGJ1ZjsKKwkJc3ogPSBzaXplOworCQl3aGlsZSAoLS1zeiAmJiAoYyA9IHZmc19yZWFkKGZjLT5jb21wYXJlX2ZwLAorCQkJY3MsIDEsICZmYy0+Y29tcGFyZV9wb3MpICE9IDApKSB7CisJCQlpZiAoKmNzKysgPT0gJ1xuJykKKwkJCQlicmVhazsKKwkJfQorCQkqY3MgPSAnXDAnOworCQlpZiAoKGMgPT0gMCkgJiYgKGNzID09IGJ1ZikpIHsKKwkJCXNldF9mcyhvbGRfZnMpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcmV0ID0gc3NjYW5mKGJ1ZiwgIiUwOHU6ICU4eCIsICZpbmRleCwgJmNyYyk7CisJCWRiZ19wcmludChGQ19DUkNfREVCVUcsICIlcywgaW5kZXggPSAlZCwgY21wID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgaW5kZXgsIGZjLT5jbXBfY3JjX2NudCk7CisJfXdoaWxlKHJldCAhPSAyIHx8IGluZGV4ICE9IGZjLT5jbXBfY3JjX2NudCk7CisKKwlzZXRfZnMob2xkX2ZzKTsKKwlmYy0+Y21wX2NyY19jbnQrKzsKKworCXJldHVybiBidWY7Cit9CisKKworc3RhdGljIHN0cnVjdCBmaWxlKiBmaWxlX29wZW4oaW50IG1vZGUsIGNvbnN0IGNoYXIgKnN0ciwgLi4uKQoreworCWNoYXIgZmlsZVsyNTZdID0gezB9OworCXN0cnVjdCBmaWxlKiBmcCA9IE5VTEw7CisJdmFfbGlzdCBhcmdzOworCisJdmFfc3RhcnQoYXJncywgc3RyKTsKKwl2c25wcmludGYoZmlsZSwgc2l6ZW9mKGZpbGUpLCBzdHIsIGFyZ3MpOworCisJZnAgPSBmaWxwX29wZW4oZmlsZSwgbW9kZSwgKG1vZGUmT19DUkVBVCk/MDY2NjowKTsKKwlpZiAoSVNfRVJSKGZwKSkgeworCQlmcCA9IE5VTEw7CisJCWRiZ19wcmludChGQ19FUlJPUiwgIm9wZW4gJXMgZmFpbGVkXG4iLCBmaWxlKTsKKwkJdmFfZW5kKGFyZ3MpOworCQlyZXR1cm4gZnA7CisJfQorCWRiZ19wcmludChGQ19FUlJPUiwgIm9wZW4gJXMgc3VjY2Vzc1xuIiwgZmlsZSk7CisJdmFfZW5kKGFyZ3MpOworCisJcmV0dXJuIGZwOworfQorCitzdGF0aWMgaW50IHdyaXRlX3l1dl93b3JrKHN0cnVjdCBwaWNfY2hlY2tfbWdyX3QgKm1ncikKK3sKKwltbV9zZWdtZW50X3Qgb2xkX2ZzOworCXVuc2lnbmVkIGludCBpLCB3cl9zaXplLCBwaWNfbnVtOworCXN0cnVjdCBwaWNfZHVtcF90ICpkdW1wID0gJm1nci0+cGljX2R1bXA7CisKKwlpZiAoZHVtcC0+ZHVtcF9jbnQgPiAwKSB7CisJCWlmICghZHVtcC0+eXV2X2ZwKSB7CisJCQlkdW1wLT55dXZfZnAgPSBmaWxlX29wZW4oT19DUkVBVCB8IE9fV1JPTkxZIHwgT19UUlVOQywKKwkJCQkiJXMlcy0lZC0lZC55dXYiLCBZVVZfUEFUSCwgY29tcF9jcmMsIG1nci0+aWQsIG1nci0+ZmlsZV9jbnQpOworCQkJZHVtcC0+eXV2X3BvcyA9IDA7CisJCX0KKworCQlpZiAoKG1nci0+ZW5hYmxlICYgWVVWX01BU0spICYmCisJCQkoZHVtcC0+eXV2X2ZwICE9IE5VTEwpICYmCisJCQkoZHVtcC0+ZHVtcF9jbnQgPj0gZHVtcC0+bnVtKSkgeworCisJCQlpID0gMDsKKwkJCXBpY19udW0gPSBkdW1wLT5kdW1wX2NudDsKKwkJCW9sZF9mcyA9IGdldF9mcygpOworCQkJc2V0X2ZzKEtFUk5FTF9EUyk7CisJCQl3aGlsZSAocGljX251bSA+IDApIHsKKwkJCQl3cl9zaXplID0gdmZzX3dyaXRlKGR1bXAtPnl1dl9mcCwKKwkJCQkJKGR1bXAtPmJ1Zl9hZGRyICsgaSAqIG1nci0+c2l6ZV9waWMpLAorCQkJCQltZ3ItPnNpemVfcGljLCAmZHVtcC0+eXV2X3Bvcyk7CisJCQkJaWYgKG1nci0+c2l6ZV9waWMgIT0gd3Jfc2l6ZSkgeworCQkJCQlkYmdfcHJpbnQoRkNfRVJST1IsICJidWYgZmFpbGVkIHRvIHdyaXRlIHl1diBmaWxlXG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXBpY19udW0tLTsKKwkJCQlpKys7CisJCQl9CisJCQlzZXRfZnMob2xkX2ZzKTsKKwkJCXZmc19mc3luYyhkdW1wLT55dXZfZnAsIDApOworCisJCQlmaWxwX2Nsb3NlKGR1bXAtPnl1dl9mcCwgY3VycmVudC0+ZmlsZXMpOworCQkJZHVtcC0+eXV2X3BvcyA9IDA7CisJCQlkdW1wLT55dXZfZnAgPSBOVUxMOworCQkJc2V0X2Rpc2FibGUobWdyLCBZVVZfTUFTSyk7CisJCQlkYmdfcHJpbnQoRkNfWVVWX0RFQlVHLAorCQkJCSJjbG9zZWQgeXV2IGZpbGUsIGR1bXAgeXV2IGV4aXRcbiIpOworCQkJZHVtcC0+bnVtID0gMDsKKwkJCWR1bXAtPmR1bXBfY250ID0gMDsKKwkJCWlmIChkdW1wLT5idWZfYWRkciAhPSBOVUxMKQorCQkJCXZmcmVlKGR1bXAtPmJ1Zl9hZGRyKTsKKwkJCWR1bXAtPmJ1Zl9hZGRyID0gTlVMTDsKKwkJCWR1bXAtPmJ1Zl9zaXplID0gMDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX2NyY193b3JrKHN0cnVjdCBwaWNfY2hlY2tfbWdyX3QgKm1ncikKK3sKKwl1bnNpZ25lZCBpbnQgd3Jfc2l6ZTsKKwljaGFyICpjcmNfYnVmLCAqY3JjX3RtcCA9IE5VTEw7CisJbW1fc2VnbWVudF90IG9sZF9mczsKKwlzdHJ1Y3QgcGljX2NoZWNrX3QgKmNoZWNrID0gJm1nci0+cGljX2NoZWNrOworCisJY3JjX3RtcCA9IChjaGFyICopdnphbGxvYyg2NCAqIDMwKTsKKwlpZiAoIWNyY190bXApCisJCXJldHVybiAtMTsKKworCWlmIChtZ3ItPmVuYWJsZSAmIENSQ19NQVNLKSB7CisJCXdyX3NpemUgPSAwOworCQl3aGlsZSAoa2ZpZm9fZ2V0KCZjaGVjay0+d3JfY2hrX3EsICZjcmNfYnVmKSAhPSAwKSB7CisJCQl3cl9zaXplICs9IHNwcmludGYoJmNyY190bXBbd3Jfc2l6ZV0sICIlcyIsIGNyY19idWYpOworCQkJaWYgKGNoZWNrLT5jb21wYXJlX2ZwICE9IE5VTEwpIHsKKwkJCQlpZiAoIWZnZXRfY3JjX3N0cihjcmNfYnVmLCBTSVpFX0NSQywgY2hlY2spKSB7CisJCQkJCWRiZ19wcmludCgwLCAiJXMsIGNhbid0IGdldCBtb3JlIGNvbXBhcmUgY3JjXG4iLCBfX2Z1bmNfXyk7CisJCQkJCWZpbHBfY2xvc2UoY2hlY2stPmNvbXBhcmVfZnAsIGN1cnJlbnQtPmZpbGVzKTsKKwkJCQkJY2hlY2stPmNvbXBhcmVfZnAgPSBOVUxMOworCQkJCX0KKwkJCX0KKwkJCWtmaWZvX3B1dCgmY2hlY2stPm5ld19jaGtfcSwgY3JjX2J1Zik7CisJCX0KKwkJaWYgKGNoZWNrLT5jaGVja19mcCAmJiAod3Jfc2l6ZSAhPSAwKSkgeworCQkJb2xkX2ZzID0gZ2V0X2ZzKCk7CisJCQlzZXRfZnMoS0VSTkVMX0RTKTsKKwkJCWlmICh3cl9zaXplICE9IHZmc193cml0ZShjaGVjay0+Y2hlY2tfZnAsCisJCQkJY3JjX3RtcCwgd3Jfc2l6ZSwgJmNoZWNrLT5jaGVja19wb3MpKSB7CisJCQkJZGJnX3ByaW50KEZDX0VSUk9SLCAiZmFpbGVkIHRvIGNoZWNrX2R1bXBfZmlscFxuIik7CisJCQl9CisJCQlzZXRfZnMob2xkX2ZzKTsKKwkJfQorCX0KKworCXZmcmVlKGNyY190bXApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX2F1eF9kYXRhX2NyY193b3JrKHN0cnVjdCBhdXhfZGF0YV9jaGVja19tZ3JfdCAqbWdyKQoreworCXVuc2lnbmVkIGludCB3cl9zaXplOworCWNoYXIgKmNyY19idWYsIGNyY190bXBbNjQqMzBdOworCW1tX3NlZ21lbnRfdCBvbGRfZnM7CisJc3RydWN0IGF1eF9kYXRhX2NoZWNrX3QgKmNoZWNrID0gJm1nci0+YXV4X2RhdGFfY2hlY2s7CisKKwlpZiAobWdyLT5lbmFibGUgJiBBVVhfTUFTSykgeworCQl3cl9zaXplID0gMDsKKwkJd2hpbGUgKGtmaWZvX2dldCgmY2hlY2stPndyX2Noa19xLCAmY3JjX2J1ZikgIT0gMCkgeworCQkJd3Jfc2l6ZSArPSBzcHJpbnRmKCZjcmNfdG1wW3dyX3NpemVdLCAiJXMiLCBjcmNfYnVmKTsKKwkJCWlmIChjaGVjay0+Y29tcGFyZV9mcCAhPSBOVUxMKSB7CisJCQkJaWYgKCFmZ2V0X2F1eF9kYXRhX2NyY19zdHIoY3JjX2J1ZiwgU0laRV9DUkMsIGNoZWNrKSkgeworCQkJCQlkYmdfcHJpbnQoMCwgIiVzLCBjYW4ndCBnZXQgbW9yZSBjb21wYXJlIGNyY1xuIiwgX19mdW5jX18pOworCQkJCQlmaWxwX2Nsb3NlKGNoZWNrLT5jb21wYXJlX2ZwLCBjdXJyZW50LT5maWxlcyk7CisJCQkJCWNoZWNrLT5jb21wYXJlX2ZwID0gTlVMTDsKKwkJCQl9CisJCQl9CisJCQlrZmlmb19wdXQoJmNoZWNrLT5uZXdfY2hrX3EsIGNyY19idWYpOworCQl9CisJCWlmIChjaGVjay0+Y2hlY2tfZnAgJiYgKHdyX3NpemUgIT0gMCkpIHsKKwkJCW9sZF9mcyA9IGdldF9mcygpOworCQkJc2V0X2ZzKEtFUk5FTF9EUyk7CisJCQlpZiAod3Jfc2l6ZSAhPSB2ZnNfd3JpdGUoY2hlY2stPmNoZWNrX2ZwLAorCQkJCWNyY190bXAsIHdyX3NpemUsICZjaGVjay0+Y2hlY2tfcG9zKSkgeworCQkJCWRiZ19wcmludChGQ19FUlJPUiwgImZhaWxlZCB0byBjaGVja19kdW1wX2ZpbHBcbiIpOworCQkJfQorCQkJc2V0X2ZzKG9sZF9mcyk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2NoZWNrX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBwaWNfY2hlY2tfbWdyX3QgKm1nciA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQlzdHJ1Y3QgcGljX2NoZWNrX21ncl90LCBmcmFtZV9jaGVja193b3JrKTsKKworCXdyaXRlX3l1dl93b3JrKG1ncik7CisKKwl3cml0ZV9jcmNfd29yayhtZ3IpOworfQorCitzdGF0aWMgdm9pZCBkb19hdXhfZGF0YV9jaGVja193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYXV4X2RhdGFfY2hlY2tfbWdyX3QgKm1nciA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQlzdHJ1Y3QgYXV4X2RhdGFfY2hlY2tfbWdyX3QsIGF1eF9kYXRhX2NoZWNrX3dvcmspOworCisJd3JpdGVfYXV4X2RhdGFfY3JjX3dvcmsobWdyKTsKK30KKworCitzdGF0aWMgaW50IG1lbWNweV9waHlfdG9fdmlydChjaGFyICp0b192aXJ0LAorCXVsb25nIHBoeV9mcm9tLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwl2b2lkICp2YWRkciA9IE5VTEw7CisJdW5zaWduZWQgaW50IHRtcF9zaXplID0gMDsKKworCWlmIChzaW5nbGVfbW9kZV92ZGVjICE9IE5VTEwpIHsKKwkJdW5zaWduZWQgaW50IG9mZnNldCA9IHBoeV9mcm9tICYgKH5QQUdFX01BU0spOworCQl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJCS8qIGZsdXNoIGRjYWNoZSBpbiBpc3IuICovCisJCQlmbHVzaF9kY2FjaGVfcGFnZShwaHlzX3RvX3BhZ2UocGh5X2Zyb20pKTsKKworCQkJaWYgKG9mZnNldCArIHNpemUgPj0gUEFHRV9TSVpFKSB7CisJCQkJdmFkZHIgPSBrbWFwX2F0b21pYyhwaHlzX3RvX3BhZ2UocGh5X2Zyb20pKTsKKwkJCQl0bXBfc2l6ZSA9IChQQUdFX1NJWkUgLSBvZmZzZXQpOworCQkJCXBoeV9mcm9tICs9IHRtcF9zaXplOyAvL2ZvciBuZXh0IGxvb3A7CisJCQkJc2l6ZSAtPSB0bXBfc2l6ZTsKKwkJCQl2YWRkciArPSBvZmZzZXQ7CisJCQl9IGVsc2UgeworCQkJCXZhZGRyID0ga21hcF9hdG9taWMocGh5c190b19wYWdlKHBoeV9mcm9tKSk7CisJCQkJdmFkZHIgKz0gb2Zmc2V0OworCQkJCXRtcF9zaXplID0gc2l6ZTsKKwkJCQlzaXplID0gMDsKKwkJCX0KKwkJCWlmICh2YWRkciA9PSBOVUxMKSB7CisJCQkJZGJnX3ByaW50KEZDX0NSQ19ERUJVRywgIiVzOiBrbWFwX2F0b21pYyBmYWlsZWQgcGh5OiAweCV4XG4iLAorCQkJCQlfX2Z1bmNfXywgKHVuc2lnbmVkIGludClwaHlfZnJvbSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCisJCQltZW1jcHkodG9fdmlydCwgdmFkZHIsIHRtcF9zaXplKTsKKwkJCXRvX3ZpcnQgKz0gdG1wX3NpemU7CisKKwkJCWt1bm1hcF9hdG9taWModmFkZHIgLSBvZmZzZXQpOworCQkJb2Zmc2V0ID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCXdoaWxlIChzaXplID4gMCkgeworCQkJaWYgKHNpemUgPj0gVk1BUF9TVFJJREVfU0laRSkgeworCQkJCXZhZGRyID0gY29kZWNfbW1fdm1hcChwaHlfZnJvbSwgVk1BUF9TVFJJREVfU0laRSk7CisJCQkJdG1wX3NpemUgPSBWTUFQX1NUUklERV9TSVpFOworCQkJCXBoeV9mcm9tICs9IFZNQVBfU1RSSURFX1NJWkU7CisJCQkJc2l6ZSAtPSBWTUFQX1NUUklERV9TSVpFOworCQkJfSBlbHNlIHsKKwkJCQl2YWRkciA9IGNvZGVjX21tX3ZtYXAocGh5X2Zyb20sIHNpemUpOworCQkJCXRtcF9zaXplID0gc2l6ZTsKKwkJCQlzaXplID0gMDsKKwkJCX0KKwkJCWlmICh2YWRkciA9PSBOVUxMKSB7CisJCQkJZGJnX3ByaW50KEZDX1lVVl9ERUJVRywgIiVzOiBjb2RlY19tbV92bWFwIGZhaWxlZCBwaHk6IDB4JXhcbiIsCisJCQkJCV9fZnVuY19fLCAodW5zaWduZWQgaW50KXBoeV9mcm9tKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQljb2RlY19tbV9kbWFfZmx1c2godmFkZHIsCisJCQkJdG1wX3NpemUsIERNQV9GUk9NX0RFVklDRSk7CisJCQltZW1jcHkodG9fdmlydCwgdmFkZHIsIHRtcF9zaXplKTsKKwkJCXRvX3ZpcnQgKz0gdG1wX3NpemU7CisKKwkJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIodmFkZHIpOworCQl9CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZG9feXV2X3VuaXRfY3Aodm9pZCAqKmFkZHIsIHVsb25nIHBoeSwgdm9pZCAqdmlydCwKKwlpbnQgaCwgaW50IHcsIGludCBzdHJpZGUpCit7CisJaW50IHJldCA9IDAsIGk7CisJdm9pZCAqdG1wID0gKmFkZHI7CisKKwlpZiAoKHBoeSAhPSAwKSAmJiAodmlydCA9PSBOVUxMKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisJCQlyZXQgfD0gbWVtY3B5X3BoeV90b192aXJ0KHRtcCwgcGh5LCB3KTsKKwkJCXBoeSArPSBzdHJpZGU7CisJCQl0bXAgKz0gdzsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKwkJCW1lbWNweSh0bXAsIHZpcnQsIHcpOworCQkJdmlydCArPSBzdHJpZGU7CisJCQl0bXAgKz0gdzsKKwkJfQorCX0KKwkqYWRkciA9IHRtcDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZG9feXV2X2R1bXAoc3RydWN0IHBpY19jaGVja19tZ3JfdCAqbWdyLCBzdHJ1Y3QgdmZyYW1lX3MgKnZmKQoreworCWludCByZXQgPSAwOworCXZvaWQgKnRtcF9hZGRyOworCXN0cnVjdCBwaWNfZHVtcF90ICpkdW1wID0gJm1nci0+cGljX2R1bXA7CisKKwlpZiAoZHVtcC0+c3RhcnQgPiAwKSB7CisJCWR1bXAtPnN0YXJ0LS07CisJCXJldHVybiAwOworCX0KKworCWlmIChkdW1wLT5kdW1wX2NudCA+PSBkdW1wLT5udW0pIHsKKwkJbWdyLT5lbmFibGUgJj0gKH5ZVVZfTUFTSyk7CisJCWR1bXAtPm51bSA9IDA7CisJCWR1bXAtPmR1bXBfY250ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHNpbmdsZV9tb2RlX3ZkZWMgIT0gTlVMTCkgeworCQlpZiAobWdyLT5zaXplX3BpYyA+CisJCQkoZHVtcC0+YnVmX3NpemUgLSBkdW1wLT5kdW1wX2NudCAqIG1nci0+c2l6ZV9waWMpKSB7CisJCQlpZiAoZHVtcC0+YnVmX3NpemUpIHsKKwkJCQlkYmdfcHJpbnQoRkNfRVJST1IsCisJCQkJCSJub3QgZW5vdWdoIGJ1ZiBmb3Igc2luZ2xlIG1vZGUsIGZvcmNlIGR1bXAgbGVzc1xuIik7CisJCQkJZHVtcC0+bnVtID0gZHVtcC0+ZHVtcF9jbnQ7CisJCQkJY2hlY2tfc2NoZWR1bGUobWdyKTsKKwkJCX0gZWxzZQorCQkJCXNldF9kaXNhYmxlKG1nciwgWVVWX01BU0spOworCQkJcmV0dXJuIC0xOworCQl9CisJCXRtcF9hZGRyID0gZHVtcC0+YnVmX2FkZHIgKworCQkJbWdyLT5zaXplX3BpYyAqIGR1bXAtPmR1bXBfY250OworCX0gZWxzZSB7CisJCWlmIChtZ3ItPnNpemVfcGljID4gZHVtcC0+YnVmX3NpemUpIHsKKwkJCWRiZ19wcmludChGQ19FUlJPUiwKKwkJCQkibm90IGVub3VnaCBzaXplLCBwaWMvYnVmIHNpemU6IDB4JXgvMHgleFxuIiwKKwkJCQltZ3ItPnNpemVfcGljLCBkdW1wLT5idWZfc2l6ZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJdG1wX2FkZHIgPSBkdW1wLT5idWZfYWRkcjsKKwl9CisKKwlpZiAodmYtPndpZHRoID09IG1nci0+Y2FudmFzX3cpIHsKKwkJaWYgKChtZ3ItPnV2X3ZhZGRyID09IE5VTEwpIHx8IChtZ3ItPnlfdmFkZHIgPT0gTlVMTCkpIHsKKwkJCXJldCB8PSBtZW1jcHlfcGh5X3RvX3ZpcnQodG1wX2FkZHIsIG1nci0+eV9waHlhZGRyLCBtZ3ItPnNpemVfeSk7CisJCQlyZXQgfD0gbWVtY3B5X3BoeV90b192aXJ0KHRtcF9hZGRyICsgbWdyLT5zaXplX3ksCisJCQkJbWdyLT51dl9waHlhZGRyLCBtZ3ItPnNpemVfdXYpOworCQkJaWYgKG1nci0+bWpwZWdfZmxhZykgLyptanBlZyB5dXY0MjAgdSB2IGlzIHNlcGFyYXRlICovCisJCQkJcmV0IHw9IG1lbWNweV9waHlfdG9fdmlydCh0bXBfYWRkciArIG1nci0+c2l6ZV95ICsgbWdyLT5zaXplX3V2LAorCQkJCQltZ3ItPmV4dHJhX3ZfcGh5YWRkciwgbWdyLT5zaXplX3V2KTsKKwkJfSBlbHNlIHsKKwkJCW1lbWNweSh0bXBfYWRkciwgbWdyLT55X3ZhZGRyLCBtZ3ItPnNpemVfeSk7CisJCQltZW1jcHkodG1wX2FkZHIgKyBtZ3ItPnNpemVfeSwgbWdyLT51dl92YWRkciwgbWdyLT5zaXplX3V2KTsKKwkJCWlmIChtZ3ItPm1qcGVnX2ZsYWcpIC8qbWpwZWcgdSB2IGlzIHNlcGFyYXRlICovCisJCQkJbWVtY3B5KHRtcF9hZGRyICsgbWdyLT5zaXplX3kgKyBtZ3ItPnNpemVfdXYsCisJCQkJCW1nci0+ZXh0cmFfdl92YWRkciwgbWdyLT5zaXplX3V2KTsKKwkJfQorCX0gZWxzZSB7CisJCQl1MzIgdXZfc3RyaWRlLCB1dl9jcHNpemU7CisJCQlyZXQgfD0gZG9feXV2X3VuaXRfY3AoJnRtcF9hZGRyLCBtZ3ItPnlfcGh5YWRkciwgbWdyLT55X3ZhZGRyLAorCQkJCXZmLT5oZWlnaHQsIHZmLT53aWR0aCwgbWdyLT5jYW52YXNfdyk7CisKKwkJCXV2X3N0cmlkZSA9IChtZ3ItPm1qcGVnX2ZsYWcpID8gKG1nci0+Y2FudmFzX3cgPj4gMSkgOiBtZ3ItPmNhbnZhc193OworCQkJdXZfY3BzaXplID0gKG1nci0+bWpwZWdfZmxhZykgPyAodmYtPndpZHRoID4+IDEpIDogdmYtPndpZHRoOworCQkJcmV0IHw9IGRvX3l1dl91bml0X2NwKCZ0bXBfYWRkciwgbWdyLT51dl9waHlhZGRyLCBtZ3ItPnV2X3ZhZGRyLAorCQkJCQl2Zi0+aGVpZ2h0ID4+IDEsIHV2X2Nwc2l6ZSwgdXZfc3RyaWRlKTsKKworCQkJaWYgKG1nci0+bWpwZWdfZmxhZykgeworCQkJCXJldCB8PSBkb195dXZfdW5pdF9jcCgmdG1wX2FkZHIsIG1nci0+ZXh0cmFfdl9waHlhZGRyLCBtZ3ItPmV4dHJhX3ZfdmFkZHIsCisJCQkJCXZmLT5oZWlnaHQgPj4gMSwgdXZfY3BzaXplLCB1dl9zdHJpZGUpOworCQkJfQorCX0KKworCWR1bXAtPmR1bXBfY250Kys7CisJZGJnX3ByaW50KDAsICItLS0tLT5kdW1wICVkc3QsIHNpemUgJXggKCVkIHggJWQpLCBkZWMgdG90YWwgJWRcbiIsCisJCWR1bXAtPmR1bXBfY250LCBtZ3ItPnNpemVfcGljLCB2Zi0+d2lkdGgsIHZmLT5oZWlnaHQsIG1nci0+ZnJhbWVfY250KTsKKworCWlmIChzaW5nbGVfbW9kZV92ZGVjICE9IE5VTEwpIHsKKwkJLyogc2luZ2xlIG1vZGUgbmVlZCBzY2hlZHVsZSB3b3JrIHRvIHdyaXRlKi8KKwkJaWYgKGR1bXAtPmR1bXBfY250ID49IGR1bXAtPm51bSkKKwkJCWNoZWNrX3NjaGVkdWxlKG1ncik7CisJfSBlbHNlIHsKKwkJaW50IHdyX3NpemU7CisJCW1tX3NlZ21lbnRfdCBvbGRfZnM7CisKKwkJLyogZHVtcCBmb3IgZGVjIHBpYyBub3QgaW4gaXNyICovCisJCWlmIChkdW1wLT55dXZfZnAgPT0gTlVMTCkgeworCQkJZHVtcC0+eXV2X2ZwID0gZmlsZV9vcGVuKE9fQ1JFQVQgfCBPX1dST05MWSB8IE9fVFJVTkMsCisJCQkJIiVzJXMtJWQtJWQueXV2IiwgWVVWX1BBVEgsIGNvbXBfY3JjLCBtZ3ItPmlkLCBtZ3ItPmZpbGVfY250KTsKKwkJCWlmIChkdW1wLT55dXZfZnAgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLTE7CisJCQltZ3ItPmZpbGVfY250Kys7CisJCX0KKwkJb2xkX2ZzID0gZ2V0X2ZzKCk7CisJCXNldF9mcyhLRVJORUxfRFMpOworCQl3cl9zaXplID0gdmZzX3dyaXRlKGR1bXAtPnl1dl9mcCwgZHVtcC0+YnVmX2FkZHIsCisJCQltZ3ItPnNpemVfcGljLCAmZHVtcC0+eXV2X3Bvcyk7CisJCWlmIChtZ3ItPnNpemVfcGljICE9IHdyX3NpemUpIHsKKwkJCWRiZ19wcmludChGQ19FUlJPUiwgImJ1ZiBmYWlsZWQgdG8gd3JpdGUgeXV2IGZpbGVcbiIpOworCQl9CisJCXNldF9mcyhvbGRfZnMpOworCQl2ZnNfZnN5bmMoZHVtcC0+eXV2X2ZwLCAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjcmNfc3RvcmUoc3RydWN0IHBpY19jaGVja19tZ3JfdCAqbWdyLCBzdHJ1Y3QgdmZyYW1lX3MgKnZmLAorCWludCBjcmNfeSwgaW50IGNyY191dikKK3sKKwlpbnQgcmV0ID0gMDsKKwljaGFyICpjcmNfYWRkciA9IE5VTEw7CisJaW50IGNvbXBfZnJhbWUgPSAwLCBjb21wX2NyY195LCBjb21wX2NyY191djsKKwlzdHJ1Y3QgcGljX2NoZWNrX3QgKmNoZWNrID0gJm1nci0+cGljX2NoZWNrOworCisJbWdyLT55dXZzdW0gKz0gY3JjX3V2OworCW1nci0+eXV2c3VtICs9IGNyY195OworCisJaWYgKGtmaWZvX2dldCgmY2hlY2stPm5ld19jaGtfcSwgJmNyY19hZGRyKSA9PSAwKSB7CisJCWRiZ19wcmludCgwLCAiJTA4ZDogJTA4eCAlMDh4XG4iLAorCQkJbWdyLT5mcmFtZV9jbnQsIGNyY195LCBjcmNfdXYpOworCQlpZiAoY2hlY2stPmNoZWNrX2ZwKSB7CisJCQlkYmdfcHJpbnQoMCwgImNyYzMyIGRyb3BwZWRcbiIpOworCQl9IGVsc2UgeworCQkJZGJnX3ByaW50KDAsICJubyBvcGVuZWQgZmlsZSB0byB3cml0ZSBjcmMzMlxuIik7CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoY2hlY2stPmNtcF9jcmNfY250ID4gbWdyLT5mcmFtZV9jbnQpIHsKKwkJc3NjYW5mKGNyY19hZGRyLCAiJTA4dTogJTh4ICU4eCIsCisJCQkmY29tcF9mcmFtZSwgJmNvbXBfY3JjX3ksICZjb21wX2NyY191dik7CisKKwkJZGJnX3ByaW50KDAsICIlMDhkOiAlMDh4ICUwOHggPC0tPiAlMDhkOiAlMDh4ICUwOHhcbiIsCisJCQltZ3ItPmZyYW1lX2NudCwgY3JjX3ksIGNyY191diwKKwkJCWNvbXBfZnJhbWUsIGNvbXBfY3JjX3ksIGNvbXBfY3JjX3V2KTsKKworCQlpZiAoY29tcF9mcmFtZSA9PSBtZ3ItPmZyYW1lX2NudCkgeworCQkJaWYgKChjb21wX2NyY195ICE9IGNyY195KSB8fCAoY3JjX3V2ICE9IGNvbXBfY3JjX3V2KSkgeworCQkJCQltZ3ItPnBpY19kdW1wLnN0YXJ0ID0gMDsKKwkJCQkJaWYgKGZjX2RlYnVnIHx8IG1nci0+cGljX2R1bXAubnVtIDwgMykKKwkJCQkJCW1nci0+cGljX2R1bXAubnVtKys7CisJCQkJCWRiZ19wcmludCgwLCAiXG5cbkVycm9yOiAlMDhkOiAlMDh4ICUwOHggIT0gJTA4eCAlMDh4XG5cbiIsCisJCQkJCQltZ3ItPmZyYW1lX2NudCwgY3JjX3ksIGNyY191diwgY29tcF9jcmNfeSwgY29tcF9jcmNfdXYpOworCQkJCQlpZiAoISh2Zi0+dHlwZSAmIFZJRFRZUEVfU0NBVFRFUikpCisJCQkJCQlkb195dXZfZHVtcChtZ3IsIHZmKTsKKwkJCQkJaWYgKGZjX2RlYnVnICYgRkNfRVJSX0NSQ19CTE9DS19NT0RFKQorCQkJCQkJbWdyLT5lcnJfY3JjX2Jsb2NrID0gMTsKKwkJCQkJbWdyLT51c3JfY21wX3Jlc3VsdCA9IC0xOworCQkJfQorCQl9IGVsc2UgeworCQkJbWdyLT51c3JfY21wX3Jlc3VsdCA9IC0xOworCQkJZGJnX3ByaW50KDAsICJmcmFtZSBudW0gZXJyb3I6IGZyYW1lX2NudCglZCkgZnJhbWVfY29tcCglZClcbiIsCisJCQkJbWdyLT5mcmFtZV9jbnQsIGNvbXBfZnJhbWUpOworCQl9CisJfSBlbHNlIHsKKwkJZGJnX3ByaW50KDAsICIlMDhkOiAlMDh4ICUwOHhcbiIsIG1nci0+ZnJhbWVfY250LCBjcmNfeSwgY3JjX3V2KTsKKwl9CisKKwlpZiAoKGNoZWNrLT5jaGVja19mcCkgJiYgKGNyY19hZGRyICE9IE5VTEwpKSB7CisJCXJldCA9IHNucHJpbnRmKGNyY19hZGRyLCBTSVpFX0NSQywKKwkJCSIlMDhkOiAlMDh4ICUwOHhcbiIsIG1nci0+ZnJhbWVfY250LCBjcmNfeSwgY3JjX3V2KTsKKworCQlrZmlmb19wdXQoJmNoZWNrLT53cl9jaGtfcSwgY3JjX2FkZHIpOworCQlpZiAoKG1nci0+ZnJhbWVfY250ICYgMHhmKSA9PSAwKQorCQkJY2hlY2tfc2NoZWR1bGUobWdyKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhdXhfZGF0YV9jcmNfc3RvcmUoc3RydWN0IGF1eF9kYXRhX2NoZWNrX21ncl90ICptZ3IsaW50IGNyYykKK3sKKwlpbnQgcmV0ID0gMDsKKwljaGFyICpjcmNfYWRkciA9IE5VTEw7CisJaW50IGNvbXBfZnJhbWUgPSAwLCBjb21wX2NyYzsKKwlzdHJ1Y3QgYXV4X2RhdGFfY2hlY2tfdCAqY2hlY2sgPSAmbWdyLT5hdXhfZGF0YV9jaGVjazsKKworCWlmIChrZmlmb19nZXQoJmNoZWNrLT5uZXdfY2hrX3EsICZjcmNfYWRkcikgPT0gMCkgeworCQlkYmdfcHJpbnQoMCwgIiUwOGQ6ICUwOHhcbiIsCisJCQltZ3ItPmZyYW1lX2NudCwgY3JjKTsKKwkJaWYgKGNoZWNrLT5jaGVja19mcCkgeworCQkJZGJnX3ByaW50KDAsICJjcmMzMiBkcm9wcGVkXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWRiZ19wcmludCgwLCAibm8gb3BlbmVkIGZpbGUgdG8gd3JpdGUgY3JjMzJcbiIpOworCQl9CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGNoZWNrLT5jbXBfY3JjX2NudCA+IG1nci0+ZnJhbWVfY250KSB7CisJCXNzY2FuZihjcmNfYWRkciwgIiUwOHU6ICU4eCIsCisJCQkmY29tcF9mcmFtZSwgJmNvbXBfY3JjKTsKKworCQlkYmdfcHJpbnQoMCwgIiUwOGQ6ICUwOHggPC0tPiAlMDhkOiAlMDh4XG4iLAorCQkJbWdyLT5mcmFtZV9jbnQsIGNyYywKKwkJCWNvbXBfZnJhbWUsIGNvbXBfY3JjKTsKKwkJaWYgKGNvbXBfZnJhbWUgPT0gbWdyLT5mcmFtZV9jbnQpIHsKKwkJCWlmIChjb21wX2NyYyAhPSBjcmMpIHsKKwkJCQkJZGJnX3ByaW50KDAsICJcblxuRXJyb3I6ICUwOGQ6ICUwOHggIT0gJTA4eCBcblxuIiwKKwkJCQkJCW1nci0+ZnJhbWVfY250LCBjcmMsIGNvbXBfY3JjKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWRiZ19wcmludCgwLCAiZnJhbWUgbnVtIGVycm9yOiBmcmFtZV9jbnQoJWQpIGZyYW1lX2NvbXAoJWQpXG4iLAorCQkJCW1nci0+ZnJhbWVfY250LCBjb21wX2ZyYW1lKTsKKwkJfQorCX0gZWxzZSB7CisJCWRiZ19wcmludCgwLCAiJTA4ZDogJTA4eFxuIiwgbWdyLT5mcmFtZV9jbnQsIGNyYyk7CisJfQorCisJaWYgKChjaGVjay0+Y2hlY2tfZnApICYmIChjcmNfYWRkciAhPSBOVUxMKSkgeworCQlyZXQgPSBzbnByaW50ZihjcmNfYWRkciwgU0laRV9DUkMsCisJCQkiJTA4ZDogJTA4eFxuIiwgbWdyLT5mcmFtZV9jbnQsIGNyYyk7CisKKwkJa2ZpZm9fcHV0KCZjaGVjay0+d3JfY2hrX3EsIGNyY19hZGRyKTsKKwkJaWYgKChtZ3ItPmZyYW1lX2NudCAmIDB4ZikgPT0gMCkKKwkJCWF1eF9kYXRhX2NoZWNrX3NjaGVkdWxlKG1ncik7CisJfQorCXJldHVybiByZXQ7Cit9CisKKworCitzdGF0aWMgaW50IGNyYzMyX3ZtYXBfbGUodW5zaWduZWQgaW50ICpjcmMzMiwKKwl1bG9uZyBwaHlhZGRyLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwl2b2lkICp2YWRkciA9IE5VTEw7CisJdW5zaWduZWQgaW50IGNyYyA9ICpjcmMzMjsKKwl1bnNpZ25lZCBpbnQgdG1wX3NpemUgPSAwOworCisJLypzaW5nbGUgbW9kZSBjYW5ub3QgdXNlIGNvZGVjX21tX3ZtYXAqLworCWlmIChzaW5nbGVfbW9kZV92ZGVjICE9IE5VTEwpIHsKKwkJdW5zaWduZWQgaW50IG9mZnNldCA9IHBoeWFkZHIgJiAoflBBR0VfTUFTSyk7CisJCXdoaWxlIChzaXplID4gMCkgeworCQkJLypmbHVzaCBkY2FjaGUgaW4gaXNyLiovCisJCQlmbHVzaF9kY2FjaGVfcGFnZShwaHlzX3RvX3BhZ2UocGh5YWRkcikpOworCisJCQlpZiAob2Zmc2V0ICsgc2l6ZSA+PSBQQUdFX1NJWkUpIHsKKwkJCQl2YWRkciA9IGttYXBfYXRvbWljKHBoeXNfdG9fcGFnZShwaHlhZGRyKSk7CisJCQkJdG1wX3NpemUgPSAoUEFHRV9TSVpFIC0gb2Zmc2V0KTsKKwkJCQlwaHlhZGRyICs9IHRtcF9zaXplOworCQkJCXNpemUgLT0gdG1wX3NpemU7CisJCQkJdmFkZHIgKz0gb2Zmc2V0OworCQkJfSBlbHNlIHsKKwkJCQl2YWRkciA9IGttYXBfYXRvbWljKHBoeXNfdG9fcGFnZShwaHlhZGRyKSk7CisJCQkJdG1wX3NpemUgPSBzaXplOworCQkJCXZhZGRyICs9IG9mZnNldDsKKwkJCQlzaXplID0gMDsKKwkJCX0KKwkJCWlmICh2YWRkciA9PSBOVUxMKSB7CisJCQkJZGJnX3ByaW50KEZDX0NSQ19ERUJVRywgIiVzOiBrbWFwX2F0b21pYyBmYWlsZWQgcGh5OiAweCV4XG4iLAorCQkJCQlfX2Z1bmNfXywgKHVuc2lnbmVkIGludClwaHlhZGRyKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJCWNyYyA9IGNyYzMyX2xlKGNyYywgdmFkZHIsIHRtcF9zaXplKTsKKworCQkJa3VubWFwX2F0b21pYyh2YWRkciAtIG9mZnNldCk7CisJCQlvZmZzZXQgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJd2hpbGUgKHNpemUgPiAwKSB7CisJCQlpZiAoc2l6ZSA+PSBWTUFQX1NUUklERV9TSVpFKSB7CisJCQkJdmFkZHIgPSBjb2RlY19tbV92bWFwKHBoeWFkZHIsIFZNQVBfU1RSSURFX1NJWkUpOworCQkJCXRtcF9zaXplID0gVk1BUF9TVFJJREVfU0laRTsKKwkJCQlwaHlhZGRyICs9IFZNQVBfU1RSSURFX1NJWkU7CisJCQkJc2l6ZSAtPSBWTUFQX1NUUklERV9TSVpFOworCQkJfSBlbHNlIHsKKwkJCQl2YWRkciA9IGNvZGVjX21tX3ZtYXAocGh5YWRkciwgc2l6ZSk7CisJCQkJdG1wX3NpemUgPSBzaXplOworCQkJCXNpemUgPSAwOworCQkJfQorCQkJaWYgKHZhZGRyID09IE5VTEwpIHsKKwkJCQlkYmdfcHJpbnQoRkNfQ1JDX0RFQlVHLCAiJXM6IGNvZGVjX21tX3ZtYXAgZmFpbGVkIHBoeTogMHgleFxuIiwKKwkJCQkJX19mdW5jX18sICh1bnNpZ25lZCBpbnQpcGh5YWRkcik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJY29kZWNfbW1fZG1hX2ZsdXNoKHZhZGRyLAorCQkJCXRtcF9zaXplLCBETUFfRlJPTV9ERVZJQ0UpOworCisJCQljcmMgPSBjcmMzMl9sZShjcmMsIHZhZGRyLCB0bXBfc2l6ZSk7CisKKwkJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIodmFkZHIpOworCQl9CisJfQorCSpjcmMzMiA9IGNyYzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvX2NoZWNrX252MjEoc3RydWN0IHBpY19jaGVja19tZ3JfdCAqbWdyLCBzdHJ1Y3QgdmZyYW1lX3MgKnZmKQoreworCWludCBpOworCXVuc2lnbmVkIGludCBjcmNfeSA9IDAsIGNyY191diA9IDA7CisJdm9pZCAqcF95YWRkciwgKnBfdXZhZGRyOworCXVsb25nIHlfcGh5YWRkciwgdXZfcGh5YWRkcjsKKwlpbnQgcmV0ID0gMDsKKworCXBfeWFkZHIgPSBtZ3ItPnlfdmFkZHI7CisJcF91dmFkZHIgPSBtZ3ItPnV2X3ZhZGRyOworCXlfcGh5YWRkciA9IG1nci0+eV9waHlhZGRyOworCXV2X3BoeWFkZHIgPSBtZ3ItPnV2X3BoeWFkZHI7CisJaWYgKChwX3lhZGRyID09IE5VTEwpIHx8IChwX3V2YWRkciA9PSBOVUxMKSkKKwl7CisJCWlmICh2Zi0+d2lkdGggPT0gbWdyLT5jYW52YXNfdykgeworCQkJcmV0ID0gY3JjMzJfdm1hcF9sZSgmY3JjX3ksIHlfcGh5YWRkciwgbWdyLT5zaXplX3kpOworCQkJcmV0IHw9IGNyYzMyX3ZtYXBfbGUoJmNyY191diwgdXZfcGh5YWRkciwgbWdyLT5zaXplX3V2KTsKKwkJfSBlbHNlIHsKKwkJCWZvciAoaSA9IDA7IGkgPCB2Zi0+aGVpZ2h0OyBpKyspIHsKKwkJCQlyZXQgfD0gY3JjMzJfdm1hcF9sZSgmY3JjX3ksIHlfcGh5YWRkciwgdmYtPndpZHRoKTsKKwkJCQl5X3BoeWFkZHIgKz0gbWdyLT5jYW52YXNfdzsKKwkJCX0KKwkJCWZvciAoaSA9IDA7IGkgPCB2Zi0+aGVpZ2h0LzI7IGkrKykgeworCQkJCXJldCB8PSBjcmMzMl92bWFwX2xlKCZjcmNfdXYsIHV2X3BoeWFkZHIsIHZmLT53aWR0aCk7CisJCQkJdXZfcGh5YWRkciArPSBtZ3ItPmNhbnZhc193OworCQkJfQorCQl9CisJCWlmIChyZXQgPCAwKSB7CisJCQlkYmdfcHJpbnQoMCwgImNhbGMgY3JjIGZhaWxlZCwgbWF5IGNvZGVjX21tX3ZtYXAgZmFpbGVkXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9IGVsc2UgeworCQlpZiAobWdyLT5mcmFtZV9jbnQgPT0gMCkgeworCQkJdW5zaWduZWQgaW50ICpwID0gbWdyLT55X3ZhZGRyOworCQkJZGJnX3ByaW50KDAsICJZVVYwMDAwOiAlMDh4LSUwOHgtJTA4eC0lMDh4XG4iLAorCQkJCXBbMF0sIHBbMV0sIHBbMl0sIHBbM10pOworCQl9CisJCWlmICh2Zi0+d2lkdGggPT0gbWdyLT5jYW52YXNfdykgeworCQkJY3JjX3kgPSBjcmMzMl9sZShjcmNfeSwgcF95YWRkciwgbWdyLT5zaXplX3kpOworCQkJY3JjX3V2ID0gY3JjMzJfbGUoY3JjX3V2LCBwX3V2YWRkciwgbWdyLT5zaXplX3V2KTsKKwkJfSBlbHNlIHsKKwkJCWZvciAoaSA9IDA7IGkgPCB2Zi0+aGVpZ2h0OyBpKyspIHsKKwkJCQljcmNfeSA9IGNyYzMyX2xlKGNyY195LCBwX3lhZGRyLCB2Zi0+d2lkdGgpOworCQkJCXBfeWFkZHIgKz0gbWdyLT5jYW52YXNfdzsKKwkJCX0KKwkJCWZvciAoaSA9IDA7IGkgPCB2Zi0+aGVpZ2h0LzI7IGkrKykgeworCQkJCWNyY191diA9IGNyYzMyX2xlKGNyY191diwgcF91dmFkZHIsIHZmLT53aWR0aCk7CisJCQkJcF91dmFkZHIgKz0gbWdyLT5jYW52YXNfdzsKKwkJCX0KKwkJfQorCX0KKworCWNyY19zdG9yZShtZ3IsIHZmLCBjcmNfeSwgY3JjX3V2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvX2NoZWNrX3l1djE2KHN0cnVjdCBwaWNfY2hlY2tfbWdyX3QgKm1nciwKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmLCBjaGFyICp5YnVmLCBjaGFyICp1dmJ1ZiwKKwljaGFyICp1YnVmLCBjaGFyICp2YnVmKQoreworCXVuc2lnbmVkIGludCBjcmMxLCBjcmMyLCBjcmMzLCBjcmM0OworCWludCB3LCBoOworCisJdyA9IHZmLT53aWR0aDsKKwloID0gdmYtPmhlaWdodDsKKwljcmMxID0gMDsKKwljcmMyID0gMDsKKwljcmMzID0gMDsKKwljcmM0ID0gMDsKKworCWNyYzEgPSBjcmMzMl9sZSgwLCB5YnVmLCB3ICogaCAqMik7CisJY3JjMiA9IGNyYzMyX2xlKDAsIHVidWYsIHcgKiBoLzIpOworCWNyYzMgPSBjcmMzMl9sZSgwLCB2YnVmLCB3ICogaC8yKTsKKwljcmM0ID0gY3JjMzJfbGUoMCwgdXZidWYsIHcgKiBoKjIvMik7CisJLyoKKwlwcmludGsoIiUwOGQ6ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCisJCW1nci0+ZnJhbWVfY250LCBjcmMxLCBjcmM0LCBjcmMyLCBjcmMzKTsKKwkqLworCW1nci0+c2l6ZV95ID0gdyAqIGggKiAyOworCW1nci0+c2l6ZV91diA9IHcgKiBoOworCW1nci0+c2l6ZV9waWMgPSBtZ3ItPnNpemVfeSArIG1nci0+c2l6ZV91djsKKwltZ3ItPnlfdmFkZHIgPSB5YnVmOworCW1nci0+dXZfdmFkZHIgPSB1dmJ1ZjsKKwltZ3ItPmNhbnZhc193ID0gdzsKKwltZ3ItPmNhbnZhc19oID0gaDsKKwljcmNfc3RvcmUobWdyLCB2ZiwgY3JjMSwgY3JjNCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19jaGVja19hdXhfZGF0YV9jcmMoc3RydWN0IGF1eF9kYXRhX2NoZWNrX21ncl90ICptZ3IsCisJY2hhciAqYXV4X2J1ZiwgaW50IHNpemUpCit7CisJdW5zaWduZWQgaW50IGNyYyA9IDA7CisKKwljcmMgPSBjcmMzMl9sZSgwLCBhdXhfYnVmLCBzaXplKTsKKworCS8vcHJfaW5mbygiJXM6Y3JjID0gJTA4eFxuIixjcmMpOworCWF1eF9kYXRhX2NyY19zdG9yZShtZ3IsY3JjKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZmJjX2NoZWNrX3ByZXBhcmUoc3RydWN0IHBpY19jaGVja190ICpjaGVjaywKKwlpbnQgcmVzaXplLCBpbnQgeV9zaXplKQoreworCWludCBpID0gMDsKKworCWlmICAoeV9zaXplID4gTUFYX1NJWkVfQUZCQ19QTEFORVMpCisJCXJldHVybiAtMTsKKworCWlmICgoKCFjaGVjay0+ZmJjX3BsYW5lc1swXSkgfHwKKwkJKCFjaGVjay0+ZmJjX3BsYW5lc1sxXSkgfHwKKwkJKCFjaGVjay0+ZmJjX3BsYW5lc1syXSkgfHwKKwkJKCFjaGVjay0+ZmJjX3BsYW5lc1szXSkpICYmCisJCSghcmVzaXplKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKHJlc2l6ZSkgeworCQlkYmdfcHJpbnQoMCwgInNpemUgY2hhbmdlZCB0byAweCV4KHlfc2l6ZSlcbiIsIHlfc2l6ZSk7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNoZWNrLT5mYmNfcGxhbmVzKTsgaSsrKSB7CisJCQlpZiAoY2hlY2stPmZiY19wbGFuZXNbaV0pIHsKKwkJCQl2ZnJlZShjaGVjay0+ZmJjX3BsYW5lc1tpXSk7CisJCQkJY2hlY2stPmZiY19wbGFuZXNbaV0gPSBOVUxMOworCQkJfQorCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNoZWNrLT5mYmNfcGxhbmVzKTsgaSsrKSB7CisJCWlmICghY2hlY2stPmZiY19wbGFuZXNbaV0pCisJCQljaGVjay0+ZmJjX3BsYW5lc1tpXSA9CisJCQkJdm1hbGxvYyh5X3NpemUgKiBzaXplb2Yoc2hvcnQpKTsKKwl9CisJaWYgKCghY2hlY2stPmZiY19wbGFuZXNbMF0pIHx8CisJCSghY2hlY2stPmZiY19wbGFuZXNbMV0pIHx8CisJCSghY2hlY2stPmZiY19wbGFuZXNbMl0pIHx8CisJCSghY2hlY2stPmZiY19wbGFuZXNbM10pKSB7CisJCWRiZ19wcmludCgwLCAidm1hbGxvYyBzdGFpY3BsYW5lcyBmYWlsZWQgJWx4ICVseCAlbHggJWx4XG4iLAorCQkJKHVsb25nKWNoZWNrLT5mYmNfcGxhbmVzWzBdLAorCQkJKHVsb25nKWNoZWNrLT5mYmNfcGxhbmVzWzFdLAorCQkJKHVsb25nKWNoZWNrLT5mYmNfcGxhbmVzWzJdLAorCQkJKHVsb25nKWNoZWNrLT5mYmNfcGxhbmVzWzNdKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2hlY2stPmZiY19wbGFuZXMpOyBpKyspIHsKKwkJCWlmIChjaGVjay0+ZmJjX3BsYW5lc1tpXSkgeworCQkJCXZmcmVlKGNoZWNrLT5mYmNfcGxhbmVzW2ldKTsKKwkJCQljaGVjay0+ZmJjX3BsYW5lc1tpXSA9IE5VTEw7CisJCQl9CisJCX0KKwkJcmV0dXJuIC0xOworCX0gZWxzZQorCQlkYmdfcHJpbnQoRkNfQ1JDX0RFQlVHLCAidm1hbGxvYyBzdGFpY3BsYW5lcyBzdWNlc3NlZFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGxvYWRfdXNlcl9jbXBfY3JjKHN0cnVjdCBwaWNfY2hlY2tfbWdyX3QgKm1ncikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcGljX2NoZWNrX3QgKmNoazsKKwl2b2lkICpxYWRkcjsKKworCWlmIChtZ3IgPT0gTlVMTCB8fAorCQkobWdyLT5jbXBfcG9vbCA9PSBOVUxMKXx8CisJCShtZ3ItPnVzcl9jbXBfbnVtID09IDApKQorCQlyZXR1cm4gMDsKKworCWNoayA9ICZtZ3ItPnBpY19jaGVjazsKKworCWlmIChjaGstPmNtcF9jcmNfY250ID4gMCkgeworCQlwcl9pbmZvKCJjbXAgY3JjMzIgZGF0YSBpcyByZWFkeVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoY2hrLT5jaGVja19hZGRyID09IE5VTEwpIHsKKwkJcHJfaW5mbygibm8gY21wIGNyYyBidWZcbiIpOyAvKiB2bWFsbG9jIGFnYWluIG9yIHJldHVybiAqLworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKG1nci0+dXNyX2NtcF9udW0gPj0gVVNFUl9DTVBfUE9PTF9NQVhfU0laRSkKKwkJbWdyLT51c3JfY21wX251bSA9IFVTRVJfQ01QX1BPT0xfTUFYX1NJWkUgLSAxOworCisJZm9yIChpID0gMDsgaSA8IG1nci0+dXNyX2NtcF9udW07IGkrKykgeworCQlxYWRkciA9IGNoay0+Y2hlY2tfYWRkciArIGkgKiBTSVpFX0NSQzsKKwkJZGJnX3ByaW50KEZDX0NSQ19ERUJVRywgIiVzLCAlOGQ6ICUwOHggJTA4eFxuIiwgX19mdW5jX18sCisJCQltZ3ItPmNtcF9wb29sW2ldLnBpY19udW0sCisJCQltZ3ItPmNtcF9wb29sW2ldLnlfY3JjLAorCQkJbWdyLT5jbXBfcG9vbFtpXS51dl9jcmMpOworCQlzcHJpbnRmKHFhZGRyLCAiJThkOiAlMDh4ICUwOHhcbiIsCisJCQltZ3ItPmNtcF9wb29sW2ldLnBpY19udW0sCisJCQltZ3ItPmNtcF9wb29sW2ldLnlfY3JjLAorCQkJbWdyLT5jbXBfcG9vbFtpXS51dl9jcmMpOworCisJCWtmaWZvX3B1dCgmY2hrLT5uZXdfY2hrX3EsIHFhZGRyKTsKKwkJY2hrLT5jbXBfY3JjX2NudCsrOworCX0KKworCW1nci0+dXNyX2NtcF9yZXN1bHQgPSAwOworCisJdmZyZWUobWdyLT5jbXBfcG9vbCk7CisJbWdyLT5jbXBfcG9vbCA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgZGVjb2Rlcl9kb19mcmFtZV9jaGVjayhzdHJ1Y3QgdmRlY19zICp2ZGVjLCBzdHJ1Y3QgdmZyYW1lX3MgKnZmKQoreworCWludCByZXNpemUgPSAwOworCXZvaWQgKnBsYW5lc1s0XTsKKwlzdHJ1Y3QgcGljX2NoZWNrX3QgKmNoZWNrID0gTlVMTDsKKwlzdHJ1Y3QgcGljX2NoZWNrX21ncl90ICptZ3IgPSBOVUxMOworCWludCByZXQgPSAwOworCisJaWYgKHZkZWMgPT0gTlVMTCkgeworCQlpZiAoc2luZ2xlX21vZGVfdmRlYyA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCW1nciA9ICZzaW5nbGVfbW9kZV92ZGVjLT52ZmM7CisJfSBlbHNlIHsKKwkJbWdyID0gJnZkZWMtPnZmYzsKKwkJc2luZ2xlX21vZGVfdmRlYyA9IE5VTEw7CisJfQorCisJaWYgKCFzaW5nbGVfbW9kZV92ZGVjICYmCisJCXVubGlrZWx5KGluX2ludGVycnVwdCgpKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKG1nciA9PSBOVUxMKSB8fCAodmYgPT0gTlVMTCkgfHwKKwkJKG1nci0+ZW5hYmxlID09IDApKQorCQlyZXR1cm4gMDsKKworCW1nci0+bWpwZWdfZmxhZyA9ICgodmRlYykgJiYKKwkJKHZkZWMtPmZvcm1hdCA9PSBWRk9STUFUX01KUEVHKSkgPyAxIDogMDsKKworCWlmIChnZXRfZnJhbWVfc2l6ZShtZ3IsIHZmKSA8IDApCisJCXJldHVybiAtMTsKKworCWlmIChtZ3ItPmxhc3Rfc2l6ZV9waWMgIT0gbWdyLT5zaXplX3BpYykgeworCQlyZXNpemUgPSAxOworCQlkYmdfcHJpbnQoMCwgInNpemUgY2hhbmdlZCwgJXgtLT4leCBbJWQgeCAlZF1cbiIsCisJCQltZ3ItPmxhc3Rfc2l6ZV9waWMsIG1nci0+c2l6ZV9waWMsCisJCQl2Zi0+d2lkdGgsIHZmLT5oZWlnaHQpOworCQkvKiBmb3Igc2x0LCBpZiBubyBjb21wYXJlIGNyYyBmaWxlLCB1c2UgdGhlCisJCSAqIGNtcCBjcmMgZnJvbSBhbXN0cmVhbSBpb2N0bCB3cml0ZSAqLworCQlsb2FkX3VzZXJfY21wX2NyYyhtZ3IpOworCX0gZWxzZQorCQlyZXNpemUgPSAwOworCW1nci0+bGFzdF9zaXplX3BpYyA9IG1nci0+c2l6ZV9waWM7CisKKwlpZiAoKHZmLT50eXBlICYgVklEVFlQRV9WSVVfTlYyMSkgfHwgKG1nci0+bWpwZWdfZmxhZykgfHwKKwkJKHZmLT50eXBlICYgVklEVFlQRV9WSVVfTlYxMikpIHsKKwkJaW50IGZsdXNoX3NpemU7CisKKwkJaWYgKGNhbnZhc19nZXRfdmlydF9hZGRyKG1nciwgdmYpIDwgMCkKKwkJCXJldHVybiAtMjsKKworCQkvKiBmbHVzaCAqLworCQlmbHVzaF9zaXplID0gbWdyLT5tanBlZ19mbGFnID8KKwkJCQkoKG1nci0+Y2FudmFzX3cgKiBtZ3ItPmNhbnZhc19oKSA+PiAyKSA6CisJCQkJKChtZ3ItPmNhbnZhc193ICogbWdyLT5jYW52YXNfaCkgPj4gMSk7CisJCWlmIChtZ3ItPnlfdmFkZHIpCisJCQljb2RlY19tbV9kbWFfZmx1c2gobWdyLT55X3ZhZGRyLAorCQkJCW1nci0+Y2FudmFzX3cgKiBtZ3ItPmNhbnZhc19oLCBETUFfRlJPTV9ERVZJQ0UpOworCQlpZiAobWdyLT51dl92YWRkcikKKwkJCWNvZGVjX21tX2RtYV9mbHVzaChtZ3ItPnV2X3ZhZGRyLAorCQkJCWZsdXNoX3NpemUsIERNQV9GUk9NX0RFVklDRSk7CisJCWlmICgobWdyLT5tanBlZ19mbGFnKSAmJiAobWdyLT5leHRyYV92X3ZhZGRyKSkKKwkJCWNvZGVjX21tX2RtYV9mbHVzaChtZ3ItPmV4dHJhX3ZfdmFkZHIsCisJCQkJZmx1c2hfc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKKworCQlpZiAobWdyLT5lbmFibGUgJiBDUkNfTUFTSykKKwkJCXJldCA9IGRvX2NoZWNrX252MjEobWdyLCB2Zik7CisKKwkJaWYgKG1nci0+ZW5hYmxlICYgWVVWX01BU0spCisJCQlkb195dXZfZHVtcChtZ3IsIHZmKTsKKworCX0gZWxzZSBpZiAgKHZmLT50eXBlICYgVklEVFlQRV9TQ0FUVEVSKSB7CisJCWNoZWNrID0gJm1nci0+cGljX2NoZWNrOworCisJCWlmIChtZ3ItPnBpY19kdW1wLmJ1Zl9hZGRyICE9IE5VTEwpIHsKKwkJCWRiZ19wcmludCgwLCAic2NhdHRlciBmcmVlIHl1diBidWZcbiIpOworCQkJdmZyZWUobWdyLT5waWNfZHVtcC5idWZfYWRkcik7CisJCQltZ3ItPnBpY19kdW1wLmJ1Zl9hZGRyID0gTlVMTDsKKwkJfQorCQlpZiAoZmJjX2NoZWNrX3ByZXBhcmUoY2hlY2ssCisJCQkJcmVzaXplLCBtZ3ItPnNpemVfeSkgPCAwKQorCQkJcmV0dXJuIC0zOworCQlwbGFuZXNbMF0gPSBjaGVjay0+ZmJjX3BsYW5lc1swXTsKKwkJcGxhbmVzWzFdID0gY2hlY2stPmZiY19wbGFuZXNbMV07CisJCXBsYW5lc1syXSA9IGNoZWNrLT5mYmNfcGxhbmVzWzJdOworCQlwbGFuZXNbM10gPSBjaGVjay0+ZmJjX3BsYW5lc1szXTsKKwkJcmV0ID0gQU1MT0dJQ19GQkNfdmZyYW1lX2RlY29kZXIocGxhbmVzLCB2ZiwgMCwgMCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkYmdfcHJpbnQoMCwgImFtbG9naWNfZmJjX2xpYi5rbyBlcnJvciAlZFxuIiwgcmV0KTsKKwkJfSBlbHNlIHsKKwkJCWRvX2NoZWNrX3l1djE2KG1nciwgdmYsCisJCQkJKHZvaWQgKilwbGFuZXNbMF0sICh2b2lkICopcGxhbmVzWzNdLC8vdXYKKwkJCQkodm9pZCAqKXBsYW5lc1sxXSwgKHZvaWQgKilwbGFuZXNbMl0pOworCQl9CisJfQorCW1nci0+ZnJhbWVfY250Kys7CisKKwlpZiAobWdyLT51c3JfY21wX251bSA+IDApIHsKKwkJbWdyLT51c3JfY21wX251bSAtPSAxOworCX0KKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGRlY29kZXJfZG9fZnJhbWVfY2hlY2spOworCitpbnQgZGVjb2Rlcl9kb19hdXhfZGF0YV9jaGVjayhzdHJ1Y3QgdmRlY19zICp2ZGVjLCBjaGFyICphdXhfYnVmZmVyLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgYXV4X2RhdGFfY2hlY2tfbWdyX3QgKm1nciA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlpZiAodmRlYyA9PSBOVUxMKSB7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCW1nciA9ICZ2ZGVjLT5hZGM7CisJfQorCisJaWYgKChtZ3IgPT0gTlVMTCkgfHwgKG1nci0+ZW5hYmxlID09IDApKQorCQlyZXR1cm4gMDsKKworCWlmIChtZ3ItPmVuYWJsZSAmIEFVWF9NQVNLKQorCQlyZXQgPSBkb19jaGVja19hdXhfZGF0YV9jcmMobWdyLGF1eF9idWZmZXIsc2l6ZSk7CisKKwltZ3ItPmZyYW1lX2NudCsrOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZGVjb2Rlcl9kb19hdXhfZGF0YV9jaGVjayk7CisKK3N0YXRpYyBpbnQgZHVtcF9idWZfYWxsb2Moc3RydWN0IHBpY19kdW1wX3QgKmR1bXApCit7CisJaWYgKChkdW1wLT5idWZfYWRkciAhPSBOVUxMKSAmJgorCQkoZHVtcC0+YnVmX3NpemUgIT0gMCkpCisJCXJldHVybiAwOworCisJZHVtcC0+YnVmX2FkZHIgPQorCQkoY2hhciAqKXZtYWxsb2Moc2l6ZV95dXZfYnVmKTsKKwlpZiAoIWR1bXAtPmJ1Zl9hZGRyKSB7CisJCWR1bXAtPmJ1Zl9zaXplID0gMDsKKwkJZGJnX3ByaW50KDAsICJ2bWFsbG9jIHl1diBidWYgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWR1bXAtPmJ1Zl9zaXplID0gc2l6ZV95dXZfYnVmOworCisJZGJnX3ByaW50KDAsICIlczogYnVmIGZvciB5dXYgaXMgYWxsb2NlZFxuIiwgX19mdW5jX18pOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkdW1wX3l1dl90cmlnKHN0cnVjdCBwaWNfY2hlY2tfbWdyX3QgKm1nciwKKwlpbnQgaWQsIGludCBzdGFydCwgaW50IG51bSkKK3sKKwlzdHJ1Y3QgcGljX2R1bXBfdCAqZHVtcCA9ICZtZ3ItPnBpY19kdW1wOworCisJaWYgKCFkdW1wLT5udW0pIHsKKwkJbWdyLT5pZCA9IGlkOworCQlkdW1wLT5zdGFydCA9IHN0YXJ0OworCQlkdW1wLT5udW0gPSBudW07CisJCWR1bXAtPmVuZCA9IHN0YXJ0ICsgbnVtOworCQlkdW1wLT5kdW1wX2NudCA9IDA7CisJCWR1bXAtPnl1dl9mcCA9IE5VTEw7CisJCWlmICghYXRvbWljX3JlYWQoJm1nci0+d29ya19pbml0ZWQpKSB7CisJCQlJTklUX1dPUksoJm1nci0+ZnJhbWVfY2hlY2tfd29yaywgZG9fY2hlY2tfd29yayk7CisJCQlhdG9taWNfc2V0KCZtZ3ItPndvcmtfaW5pdGVkLCAxKTsKKwkJfQorCQlkdW1wX2J1Zl9hbGxvYyhkdW1wKTsKKwkJc3RyX3N0cmlwKGNvbXBfY3JjKTsKKwkJc2V0X2VuYWJsZShtZ3IsIFlVVl9NQVNLKTsKKwl9IGVsc2UgeworCQlkYmdfcHJpbnQoRkNfRVJST1IsICJ5dXYgZHVtcCBub3csIHRyaWcgbGF0ZXJcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlkYmdfcHJpbnQoMCwgImR1bXAgeXV2IHRyaWdnZXIsIGZyb20gJWQgdG8gJWQgZnJhbWVcbiIsCisJCWR1bXAtPnN0YXJ0LCBkdW1wLT5lbmQpOworCXJldHVybiAwOworfQorCitpbnQgZnJhbWVfY2hlY2tfaW5pdChzdHJ1Y3QgcGljX2NoZWNrX21ncl90ICptZ3IsIGludCBpZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcGljX2R1bXBfdCAqZHVtcCA9ICZtZ3ItPnBpY19kdW1wOworCXN0cnVjdCBwaWNfY2hlY2tfdCAqY2hlY2sgPSAmbWdyLT5waWNfY2hlY2s7CisKKwltZ3ItPmZyYW1lX2NudCA9IDA7CisJbWdyLT5zaXplX3BpYyA9IDA7CisJbWdyLT5sYXN0X3NpemVfcGljID0gMDsKKwltZ3ItPmlkID0gaWQ7CisJbWdyLT55dXZzdW0gPSAwOworCW1nci0+aGVpZ2h0ID0gMDsKKwltZ3ItPndpZHRoID0gMDsKKworCWR1bXAtPm51bSA9IDA7CisJZHVtcC0+ZHVtcF9jbnQgPSAwOworCWR1bXAtPnl1dl9mcCA9IE5VTEw7CisJY2hlY2stPmNoZWNrX3BvcyA9IDA7CisJY2hlY2stPmNvbXBhcmVfcG9zID0gMDsKKworCWlmICghYXRvbWljX3JlYWQoJm1nci0+d29ya19pbml0ZWQpKSB7CisJCUlOSVRfV09SSygmbWdyLT5mcmFtZV9jaGVja193b3JrLCBkb19jaGVja193b3JrKTsKKwkJYXRvbWljX3NldCgmbWdyLT53b3JrX2luaXRlZCwgMSk7CisJfQorCS8qIGZvciBkdW1wIGVycm9yIHl1diBwcmVwYXJlLiAqLworCWR1bXBfYnVmX2FsbG9jKGR1bXApOworCisJLyogdHJ5IHRvIG9wZW4gY29tcGFyZSBjcmMzMiBmaWxlICovCisJc3RyX3N0cmlwKGNvbXBfY3JjKTsKKwljaGVjay0+Y29tcGFyZV9mcCA9IGZpbGVfb3BlbihPX1JET05MWSwKKwkJIiVzJXMiLCBDUkNfUEFUSCwgY29tcF9jcmMpOworCisJLyogY3JlYXRlIGNyYzMyIGxvZyBmaWxlICovCisJY2hlY2stPmNoZWNrX2ZwID0gZmlsZV9vcGVuKE9fQ1JFQVR8IE9fV1JPTkxZIHwgT19UUlVOQywKKwkJIiVzJXMtJWQtJWQuY3JjIiwgQ1JDX1BBVEgsIGNvbXBfY3JjLCBpZCwgbWdyLT5maWxlX2NudCk7CisKKwlJTklUX0tGSUZPKGNoZWNrLT5uZXdfY2hrX3EpOworCUlOSVRfS0ZJRk8oY2hlY2stPndyX2Noa19xKTsKKwljaGVjay0+Y2hlY2tfYWRkciA9IHZtYWxsb2MoU0laRV9DUkMgKiBTSVpFX0NIRUNLX1EpOworCWlmIChjaGVjay0+Y2hlY2tfYWRkciA9PSBOVUxMKSB7CisJCWRiZ19wcmludChGQ19FUlJPUiwgInZtYWxsb2MgcWJ1ZiBmYWlsXG4iKTsKKwl9IGVsc2UgeworCQl2b2lkICpxYWRkciA9IE5VTEwsICpyZHJldCA9IE5VTEw7CisJCWNoZWNrLT5jbXBfY3JjX2NudCA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBTSVpFX0NIRUNLX1E7IGkrKykgeworCQkJcWFkZHIgPSBjaGVjay0+Y2hlY2tfYWRkciArIGkgKiBTSVpFX0NSQzsKKwkJCXJkcmV0ID0gZmdldF9jcmNfc3RyKHFhZGRyLAorCQkJCVNJWkVfQ1JDLCBjaGVjayk7CisJCQlpZiAocmRyZXQgPT0gTlVMTCkgeworCQkJCWlmIChpIDwgMykKKwkJCQkJZGJnX3ByaW50KDAsICJjYW4ndCBnZXQgY29tcGFyZSBjcmMgc3RyaW5nXG4iKTsKKwkJCQlpZiAoY2hlY2stPmNvbXBhcmVfZnApIHsKKwkJCQkJZmlscF9jbG9zZShjaGVjay0+Y29tcGFyZV9mcCwgY3VycmVudC0+ZmlsZXMpOworCQkJCQljaGVjay0+Y29tcGFyZV9mcCA9IE5VTEw7CisJCQkJfQorCQkJfQorCisJCQlrZmlmb19wdXQoJmNoZWNrLT5uZXdfY2hrX3EsIHFhZGRyKTsKKwkJfQorCX0KKwlzZXRfZW5hYmxlKG1nciwgQ1JDX01BU0spOworCWRiZ19wcmludCgwLCAiJXMgZW5kXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgYXV4X2RhdGFfY2hlY2tfaW5pdChzdHJ1Y3QgYXV4X2RhdGFfY2hlY2tfbWdyX3QgKm1nciwgaW50IGlkKQoreworCWludCBpOworCXN0cnVjdCBhdXhfZGF0YV9jaGVja190ICpjaGVjayA9ICZtZ3ItPmF1eF9kYXRhX2NoZWNrOworCisJbWdyLT5mcmFtZV9jbnQgPSAwOworCW1nci0+aWQgPSBpZDsKKworCWNoZWNrLT5jaGVja19wb3MgPSAwOworCWNoZWNrLT5jb21wYXJlX3BvcyA9IDA7CisKKwlpZiAoIWF0b21pY19yZWFkKCZtZ3ItPndvcmtfaW5pdGVkKSkgeworCQlJTklUX1dPUksoJm1nci0+YXV4X2RhdGFfY2hlY2tfd29yaywgZG9fYXV4X2RhdGFfY2hlY2tfd29yayk7CisJCWF0b21pY19zZXQoJm1nci0+d29ya19pbml0ZWQsIDEpOworCX0KKworCS8qIHRyeSB0byBvcGVuIGNvbXBhcmUgbWV0YSBjcmMzMiBmaWxlICovCisJc3RyX3N0cmlwKGF1eF9jb21wX2NyYyk7CisJY2hlY2stPmNvbXBhcmVfZnAgPSBmaWxlX29wZW4oT19SRE9OTFksCisJCSIlcyVzIiwgQ1JDX1BBVEgsIGF1eF9jb21wX2NyYyk7CisKKwkvKiBjcmVhdGUgbWV0YSBjcmMgbG9nIGZpbGUgKi8KKwljaGVjay0+Y2hlY2tfZnAgPSBmaWxlX29wZW4oT19DUkVBVHwgT19XUk9OTFkgfCBPX1RSVU5DLAorCQkiJXMlcy0lZC0lZC5jcmMiLCBDUkNfUEFUSCwgYXV4X2NvbXBfY3JjLCBpZCwgbWdyLT5maWxlX2NudCk7CisKKwlJTklUX0tGSUZPKGNoZWNrLT5uZXdfY2hrX3EpOworCUlOSVRfS0ZJRk8oY2hlY2stPndyX2Noa19xKTsKKwljaGVjay0+Y2hlY2tfYWRkciA9IHZtYWxsb2MoU0laRV9DUkMgKiBTSVpFX0NIRUNLX1EpOworCWlmIChjaGVjay0+Y2hlY2tfYWRkciA9PSBOVUxMKSB7CisJCWRiZ19wcmludChGQ19FUlJPUiwgInZtYWxsb2MgcWJ1ZiBmYWlsXG4iKTsKKwl9IGVsc2UgeworCQl2b2lkICpxYWRkciA9IE5VTEwsICpyZHJldCA9IE5VTEw7CisJCWNoZWNrLT5jbXBfY3JjX2NudCA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBTSVpFX0NIRUNLX1E7IGkrKykgeworCQkJcWFkZHIgPSBjaGVjay0+Y2hlY2tfYWRkciArIGkgKiBTSVpFX0NSQzsKKwkJCXJkcmV0ID0gZmdldF9hdXhfZGF0YV9jcmNfc3RyKHFhZGRyLAorCQkJCVNJWkVfQ1JDLCBjaGVjayk7CisJCQlpZiAocmRyZXQgPT0gTlVMTCkgeworCQkJCWlmIChpIDwgMykKKwkJCQkJZGJnX3ByaW50KDAsICJjYW4ndCBnZXQgY29tcGFyZSBjcmMgc3RyaW5nXG4iKTsKKwkJCQlpZiAoY2hlY2stPmNvbXBhcmVfZnApIHsKKwkJCQkJZmlscF9jbG9zZShjaGVjay0+Y29tcGFyZV9mcCwgY3VycmVudC0+ZmlsZXMpOworCQkJCQljaGVjay0+Y29tcGFyZV9mcCA9IE5VTEw7CisJCQkJfQorCQkJfQorCisJCQlrZmlmb19wdXQoJmNoZWNrLT5uZXdfY2hrX3EsIHFhZGRyKTsKKwkJfQorCX0KKwlhdXhfc2V0X2VuYWJsZShtZ3IsIEFVWF9NQVNLKTsKKwlkYmdfcHJpbnQoMCwgIiVzIGVuZFxuIiwgX19mdW5jX18pOworCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBmcmFtZV9jaGVja19leGl0KHN0cnVjdCBwaWNfY2hlY2tfbWdyX3QgKm1ncikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcGljX2R1bXBfdCAqZHVtcCA9ICZtZ3ItPnBpY19kdW1wOworCXN0cnVjdCBwaWNfY2hlY2tfdCAqY2hlY2sgPSAmbWdyLT5waWNfY2hlY2s7CisKKwlpZiAobWdyLT5lbmFibGUgIT0gMCkgeworCQlpZiAoZHVtcC0+ZHVtcF9jbnQgIT0gMCkgeworCQkJZGJnX3ByaW50KDAsICIlcywgY250ID0gJWQsIG51bSA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCBkdW1wLT5kdW1wX2NudCwgZHVtcC0+bnVtKTsKKwkJCXNldF9lbmFibGUobWdyLCBZVVZfTUFTSyk7CisJCX0KKwkJaWYgKGF0b21pY19yZWFkKCZtZ3ItPndvcmtfaW5pdGVkKSkgeworCQkJY2FuY2VsX3dvcmtfc3luYygmbWdyLT5mcmFtZV9jaGVja193b3JrKTsKKwkJCWF0b21pY19zZXQoJm1nci0+d29ya19pbml0ZWQsIDApOworCQl9CisJCWlmIChzaW5nbGVfbW9kZV92ZGVjICE9IE5VTEwpCisJCQl3cml0ZV95dXZfd29yayhtZ3IpOworCQl3cml0ZV9jcmNfd29yayhtZ3IpOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNoZWNrLT5mYmNfcGxhbmVzKTsgaSsrKSB7CisJCQlpZiAoY2hlY2stPmZiY19wbGFuZXNbaV0pIHsKKwkJCQl2ZnJlZShjaGVjay0+ZmJjX3BsYW5lc1tpXSk7CisJCQkJY2hlY2stPmZiY19wbGFuZXNbaV0gPSBOVUxMOworCQkJfQorCQl9CisJCWlmIChjaGVjay0+Y2hlY2tfYWRkcikgeworCQkJdmZyZWUoY2hlY2stPmNoZWNrX2FkZHIpOworCQkJY2hlY2stPmNoZWNrX2FkZHIgPSBOVUxMOworCQl9CisKKwkJaWYgKG1nci0+Y21wX3Bvb2wpIHsKKwkJCXZmcmVlKG1nci0+Y21wX3Bvb2wpOworCQkJbWdyLT5jbXBfcG9vbCA9IE5VTEw7CisJCX0KKworCQlpZiAoY2hlY2stPmNoZWNrX2ZwKSB7CisJCQlmaWxwX2Nsb3NlKGNoZWNrLT5jaGVja19mcCwgY3VycmVudC0+ZmlsZXMpOworCQkJY2hlY2stPmNoZWNrX2ZwID0gTlVMTDsKKwkJfQorCQlpZiAoY2hlY2stPmNvbXBhcmVfZnApIHsKKwkJCWZpbHBfY2xvc2UoY2hlY2stPmNvbXBhcmVfZnAsIGN1cnJlbnQtPmZpbGVzKTsKKwkJCWNoZWNrLT5jb21wYXJlX2ZwID0gTlVMTDsKKwkJfQorCQlpZiAoZHVtcC0+eXV2X2ZwKSB7CisJCQlmaWxwX2Nsb3NlKGR1bXAtPnl1dl9mcCwgY3VycmVudC0+ZmlsZXMpOworCQkJZHVtcC0+eXV2X2ZwID0gTlVMTDsKKwkJfQorCQlpZiAoZHVtcC0+YnVmX2FkZHIpIHsKKwkJCXZmcmVlKGR1bXAtPmJ1Zl9hZGRyKTsKKwkJCWR1bXAtPmJ1Zl9hZGRyID0gTlVMTDsKKwkJfQorCQltZ3ItPmZpbGVfY250Kys7CisJCXNldF9kaXNhYmxlKG1nciwgWVVWX01BU0sgfCBDUkNfTUFTSyk7CisJCWRiZ19wcmludCgwLCAiJXMgZW5kXG4iLCBfX2Z1bmNfXyk7CisJfQorfQorCit2b2lkIGF1eF9kYXRhX2NoZWNrX2V4aXQoc3RydWN0IGF1eF9kYXRhX2NoZWNrX21ncl90ICptZ3IpCit7CisJLy9zdHJ1Y3QgcGljX2R1bXBfdCAqZHVtcCA9ICZtZ3ItPnBpY19kdW1wOworCXN0cnVjdCBhdXhfZGF0YV9jaGVja190ICpjaGVjayA9ICZtZ3ItPmF1eF9kYXRhX2NoZWNrOworCisJaWYgKG1nci0+ZW5hYmxlICE9IDApIHsKKwkJaWYgKGF0b21pY19yZWFkKCZtZ3ItPndvcmtfaW5pdGVkKSkgeworCQkJY2FuY2VsX3dvcmtfc3luYygmbWdyLT5hdXhfZGF0YV9jaGVja193b3JrKTsKKwkJCWF0b21pY19zZXQoJm1nci0+d29ya19pbml0ZWQsIDApOworCQl9CisKKwkJd3JpdGVfYXV4X2RhdGFfY3JjX3dvcmsobWdyKTsKKworCQlpZiAoY2hlY2stPmNoZWNrX2FkZHIpIHsKKwkJCXZmcmVlKGNoZWNrLT5jaGVja19hZGRyKTsKKwkJCWNoZWNrLT5jaGVja19hZGRyID0gTlVMTDsKKwkJfQorCisJCWlmIChjaGVjay0+Y2hlY2tfZnApIHsKKwkJCWZpbHBfY2xvc2UoY2hlY2stPmNoZWNrX2ZwLCBjdXJyZW50LT5maWxlcyk7CisJCQljaGVjay0+Y2hlY2tfZnAgPSBOVUxMOworCQl9CisJCWlmIChjaGVjay0+Y29tcGFyZV9mcCkgeworCQkJZmlscF9jbG9zZShjaGVjay0+Y29tcGFyZV9mcCwgY3VycmVudC0+ZmlsZXMpOworCQkJY2hlY2stPmNvbXBhcmVfZnAgPSBOVUxMOworCQl9CisKKwkJbWdyLT5maWxlX2NudCsrOworCQlhdXhfc2V0X2Rpc2FibGUobWdyLCBBVVhfTUFTSyk7CisJCWRiZ19wcmludCgwLCAiJXMgZW5kXG4iLCBfX2Z1bmNfXyk7CisJfQorfQorCisKKworaW50IHZkZWNfZnJhbWVfY2hlY2tfaW5pdChzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCWludCByZXQgPSAwLCBpZCA9IDA7CisKKwlpZiAodmRlYyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWlmICgodmRlYy0+aXNfcmVzZXQpICYmCisJCShnZXRfY3B1X21ham9yX2lkKCkgIT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTCkpCisJCXJldHVybiAwOworCisJdmRlYy0+dmZjLmVycl9jcmNfYmxvY2sgPSAwOworCXNpbmdsZV9tb2RlX3ZkZWMgPSAodmRlY19zaW5nbGUodmRlYykpPyB2ZGVjIDogTlVMTDsKKworCWlmICghY2hlY2tfZW5hYmxlICYmICF5dXZfZW5hYmxlKQorCQlyZXR1cm4gMDsKKworCXZkZWMtPmNhbnZhc19tb2RlID0gQ0FOVkFTX0JMS01PREVfTElORUFSOworCWlkID0gdmRlYy0+aWQ7CisKKwlpZiAoY2hlY2tfZW5hYmxlICYgKDB4MDEgPDwgaWQpKSB7CisJCWZyYW1lX2NoZWNrX2luaXQoJnZkZWMtPnZmYywgaWQpOworCQkvKnJlcGVhdCBjaGVjayBvbmUgdmlkZW8gY3JjMzIsIG5vdCBjbGVhciBlbmFibGUqLworCQlpZiAoKGZjX2RlYnVnICYgRkNfQ0hFQ0tfQ1JDX0xPT1BfTU9ERSkgPT0gMCkKKwkJCWNoZWNrX2VuYWJsZSAmPSB+KDB4MDEgPDwgaWQpOworCX0KKworCWlmICh5dXZfZW5hYmxlICYgKDB4MDEgPDwgaWQpKSB7CisJCXJldCA9IGR1bXBfeXV2X3RyaWcoJnZkZWMtPnZmYywKKwkJCWlkLCB5dXZfc3RhcnRbaWRdLCB5dXZfbnVtW2lkXSk7CisJCWlmIChyZXQgPCAwKQorCQkJcHJfaW5mbygiZHVtcCB5dXYgaW5pdCBmYWlsZWRcbiIpOworCQllbHNlIHsKKwkJCXByX2luZm8oImR1bXAgeXV2IGluaXQgb2ssIHRvdGFsICVkXG4iLAorCQkJCXl1dl9udW1baWRdKTsKKwkJCXZkZWMtPmNhbnZhc19tb2RlID0gQ0FOVkFTX0JMS01PREVfTElORUFSOworCQl9CisJCXl1dl9udW1baWRdID0gMDsKKwkJeXV2X3N0YXJ0W2lkXSA9IDA7CisJCXl1dl9lbmFibGUgJj0gfigweDAxIDw8IGlkKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgcHJpbnRfZGVjb2Rlcl9pbmZvKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJaWYgKHZkZWMtPnZmYy5lbmFibGUgJiBDUkNfTUFTSykgeworCQljb25zdCBjaGFyICpmb3JtYXRfbmFtZTsKKworCQlmb3JtYXRfbmFtZSA9IGdldF9mb3JtYXRfbmFtZSh2ZGVjLT5mb3JtYXQpOworCQlpZiAoZm9ybWF0X25hbWUgPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKworCQlkYmdfcHJpbnQoMCwgIkRlY29kZXItU3VtbWFyeTpUeXBlOiUxMHMsZnJhbWVzaXplOiUwNGR4JTA0ZDtvdXQtbnVtczolMDhkLHl1dnN1bTolMDh4XG4iLAorCQkJZm9ybWF0X25hbWUsIHZkZWMtPnZmYy53aWR0aCwgdmRlYy0+dmZjLmhlaWdodCwKKwkJCXZkZWMtPnZmYy5mcmFtZV9jbnQsIHZkZWMtPnZmYy55dXZzdW0pOworCQlzcHJpbnRmKGNoZWNrc3VtX2luZm8sICJUeXBlOiUxMHMsZnJhbWVzaXplOiUwNGR4JTA0ZCxvdXQtbnVtczolMDhkLHl1dnN1bTolMDh4IiwKKwkJCWZvcm1hdF9uYW1lLCB2ZGVjLT52ZmMud2lkdGgsIHZkZWMtPnZmYy5oZWlnaHQsCisJCQl2ZGVjLT52ZmMuZnJhbWVfY250LCB2ZGVjLT52ZmMueXV2c3VtKTsKKwkJaWYgKGNoZWNrc3VtX2VuYWJsZSkgeworCQkJc3RydWN0IGZpbGUgKmNoZWNrc3VtX2ZwOworCQkJc3RhdGljIGxvZmZfdCBjaGVja3N1bV9wb3M7CisJCQltbV9zZWdtZW50X3Qgb2xkX2ZzOworCQkJY2hhciBjaGVja3N1bV9idWZbMTI4XT0iXG4iOworCQkJc3RhdGljIGludCBudW07CisJCQlzdGF0aWMgY2hhciBmaWxlX25hbWVbMTI4XTsKKworCQkJaWYgKHN0cmNtcChjaGVja3N1bV9maWxlbmFtZSxmaWxlX25hbWUpICE9IDApIHsKKwkJCQludW0gPSAwOworCQkJCWNoZWNrc3VtX3BvcyA9IDA7CisJCQkJc3RyY3B5KGZpbGVfbmFtZSxjaGVja3N1bV9maWxlbmFtZSk7CisJCQl9CisJCQlpZiAoY2hlY2tzdW1fc3RhcnRfY291bnQgPT0gMSkgeworCQkJCW51bSA9IDA7CisJCQkJY2hlY2tzdW1fc3RhcnRfY291bnQgPSAwOworCQkJfQorCisJCQlzdHJfc3RyaXAoY2hlY2tzdW1fZmlsZW5hbWUpOworCQkJY2hlY2tzdW1fZnAgPSBmaWxlX29wZW4oT19DUkVBVHwgT19XUk9OTFkgfCBPX0FQUEVORCwKKwkJCQkiJXMlcy50eHQiLCBDSEVDS1NVTV9QQVRILGNoZWNrc3VtX2ZpbGVuYW1lKTsKKwkJCWlmIChjaGVja3N1bV9mcCA9PSBOVUxMKSB7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJc3ByaW50ZihjaGVja3N1bV9idWYsICIlMDhkIChUeXBlOiUxMHMsIGZyYW1lc2l6ZTolMDRkeCUwNGQsIG91dC1udW1zOiUwOGQsIHl1dnN1bTolMDh4KVxuIiwKKwkJCQludW0sZm9ybWF0X25hbWUsIHZkZWMtPnZmYy53aWR0aCwgdmRlYy0+dmZjLmhlaWdodCwKKwkJCQl2ZGVjLT52ZmMuZnJhbWVfY250LCB2ZGVjLT52ZmMueXV2c3VtKTsKKworCQkJb2xkX2ZzID0gZ2V0X2ZzKCk7CisJCQlzZXRfZnMoS0VSTkVMX0RTKTsKKworCQkJdmZzX3dyaXRlKGNoZWNrc3VtX2ZwLCBjaGVja3N1bV9idWYsCisJCQkJc3RybGVuKGNoZWNrc3VtX2J1ZiksICZjaGVja3N1bV9wb3MpOworCisJCQlzZXRfZnMob2xkX2ZzKTsKKworCQkJZmlscF9jbG9zZShjaGVja3N1bV9mcCwgY3VycmVudC0+ZmlsZXMpOworCQkJY2hlY2tzdW1fZnAgPSBOVUxMOworCQkJbnVtKys7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHZkZWNfYXV4X2RhdGFfY2hlY2tfaW5pdChzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCWludCByZXQgPSAwLCBpZCA9IDA7CisKKwlpZiAodmRlYyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWlmICgodmRlYy0+aXNfcmVzZXQpICYmCisJCShnZXRfY3B1X21ham9yX2lkKCkgIT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTCkpCisJCXJldHVybiAwOworCisJaWYgKCFhdXhfZW5hYmxlKQorCQlyZXR1cm4gMDsKKworCWlkID0gdmRlYy0+aWQ7CisKKwlpZiAoYXV4X2VuYWJsZSAmICgweDAxIDw8IGlkKSkgeworCQlhdXhfZGF0YV9jaGVja19pbml0KCZ2ZGVjLT5hZGMsIGlkKTsKKwkJLypyZXBlYXQgY2hlY2sgb25lIHZpZGVvIG1ldGEgY3JjMzIsIG5vdCBjbGVhciBlbmFibGUqLworCQlpZiAoKGZjX2RlYnVnICYgQURfQ0hFQ0tfQ1JDX0xPT1BfTU9ERSkgPT0gMCkKKwkJCWF1eF9lbmFibGUgJj0gfigweDAxIDw8IGlkKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX2F1eF9kYXRhX2NoZWNrX2luaXQpOworCisKK3ZvaWQgdmRlY19hdXhfZGF0YV9jaGVja19leGl0KHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJaWYgKHZkZWMgPT0gTlVMTCkKKwkJcmV0dXJuOworCWF1eF9kYXRhX2NoZWNrX2V4aXQoJnZkZWMtPmFkYyk7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfYXV4X2RhdGFfY2hlY2tfZXhpdCk7CisKKwordm9pZCB2ZGVjX2ZyYW1lX2NoZWNrX2V4aXQoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlpZiAodmRlYyA9PSBOVUxMKQorCQlyZXR1cm47CisJcHJpbnRfZGVjb2Rlcl9pbmZvKHZkZWMpOworCWZyYW1lX2NoZWNrX2V4aXQoJnZkZWMtPnZmYyk7CisKKwlzaW5nbGVfbW9kZV92ZGVjID0gTlVMTDsKK30KKworc3NpemVfdCBkdW1wX3l1dl9zdG9yZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBOVUxMOworCXVuc2lnbmVkIGludCBpZCA9IDAsIG51bSA9IDAsIHN0YXJ0ID0gMDsKKwlpbnQgcmV0ID0gLTE7CisKKwlyZXQgPSBzc2NhbmYoYnVmLCAiJWQgJWQgJWQiLCAmaWQsICZzdGFydCwgJm51bSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfaW5mbygiJXMsIHBhcnNlIGZhaWxlZFxuIiwgYnVmKTsKKwkJcmV0dXJuIHNpemU7CisJfQorCWlmICgobnVtID09IDApIHx8IChudW0gPiBZVVZfTUFYX0RVTVBfTlVNKSkgeworCQlwcl9pbmZvKCJyZXF1cmVkIHl1diBudW0gJWQsIG1heCAlZFxuIiwKKwkJCW51bSwgWVVWX01BWF9EVU1QX05VTSk7CisJCXJldHVybiBzaXplOworCX0KKwl2ZGVjID0gdmRlY19nZXRfdmRlY19ieV9pZChpZCk7CisJaWYgKHZkZWMgPT0gTlVMTCkgeworCQl5dXZfc3RhcnRbaWRdID0gc3RhcnQ7CisJCXl1dl9udW1baWRdID0gbnVtOworCQl5dXZfZW5hYmxlIHw9ICgxIDw8IGlkKTsKKwkJcHJfaW5mbygibm8gY29ubmVjdGVkIHZkZWMuJWQgbm93LCBzZXQgZHVtcCBva1xuIiwgaWQpOworCQlyZXR1cm4gc2l6ZTsKKwl9CisKKwlyZXQgPSBkdW1wX3l1dl90cmlnKCZ2ZGVjLT52ZmMsIGlkLCBzdGFydCwgbnVtKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfaW5mbygidHJpZ2dlciBkdW1wIHl1diBmYWlsZWRcbiIpOworCWVsc2UKKwkJcHJfaW5mbygidHJpZ2dlciBkdW1wIHl1diBpbml0IG9rLCB0b3RhbCAlZCBmcmFtZXNcbiIsIG51bSk7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3NpemVfdCBkdW1wX3l1dl9zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgaTsKKwljaGFyICpwYnVmID0gYnVmOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9JTlNUQU5DRV9NVU47IGkrKykgeworCQlwYnVmICs9IHByX2luZm8oInZkZWMuJWQsIHN0YXJ0OiAlZCwgdG90YWw6ICVkIGZyYW1lc1xuIiwKKwkJCWksIHl1dl9zdGFydFtpXSwgeXV2X251bVtpXSk7CisJfQorCXBidWYgKz0gc3ByaW50ZihwYnVmLAorCQkiXG5Vc2FnZTogZWNobyBbaWRdIFtzdGFydF0gW251bV0gPiBkdW1wX3l1dlxuXG4iKTsKKwlyZXR1cm4gcGJ1ZiAtIGJ1ZjsKK30KKworCitzc2l6ZV90IGZyYW1lX2NoZWNrX3N0b3JlKHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJaW50IHJldCA9IC0xOworCWludCBvbl9vZmYsIGlkOworCisJcmV0ID0gc3NjYW5mKGJ1ZiwgIiVkICVkIiwgJmlkLCAmb25fb2ZmKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9pbmZvKCIlcywgcGFyc2UgZmFpbGVkXG4iLCBidWYpOworCQlyZXR1cm4gc2l6ZTsKKwl9CisJaWYgKGlkID49IE1BWF9JTlNUQU5DRV9NVU4pIHsKKwkJcHJfaW5mbygiJWQgb3V0IG9mIG1heCB2ZGVjIGlkXG4iLCBpZCk7CisJCXJldHVybiBzaXplOworCX0KKwlpZiAob25fb2ZmKQorCQljaGVja19lbmFibGUgfD0gKDEgPDwgaWQpOworCWVsc2UKKwkJY2hlY2tfZW5hYmxlICY9IH4oMSA8PCBpZCk7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3NpemVfdCBmcmFtZV9jaGVja19zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgaTsKKwljaGFyICpwYnVmID0gYnVmOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9JTlNUQU5DRV9NVU47IGkrKykgeworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwKKwkJCSJ2ZGVjLiVkXHRjcmM6ICVzXG4iLCBpLAorCQkJKGNoZWNrX2VuYWJsZSAmICgweDAxIDw8IGkpKT8iZW5hYmxlZCI6Ii0tIik7CisJfQorCXBidWYgKz0gc3ByaW50ZihwYnVmLAorCQkiXG5Vc2FnZTpcdGVjaG8gW2lkXSAgWzE6b24vMDpvZmZdID4gZnJhbWVfY2hlY2tcblxuIik7CisKKwlpZiAoZmNfZGVidWcgJiBGQ19FUlJfQ1JDX0JMT0NLX01PREUpIHsKKwkJLyogY2F0IGZyYW1lX2NoZWNrIHRvIG5leHQgZnJhbWUgd2hlbiBibG9jayAqLworCQlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gTlVMTDsKKwkJdmRlYyA9IHZkZWNfZ2V0X3ZkZWNfYnlfaWQoX19mZnMoY2hlY2tfZW5hYmxlKSk7CisJCWlmICh2ZGVjKQorCQkJdmRlYy0+dmZjLmVycl9jcmNfYmxvY2sgPSAwOworCX0KKworCXJldHVybiBwYnVmIC0gYnVmOworfQorCisKK21vZHVsZV9wYXJhbV9zdHJpbmcoY29tcF9jcmMsIGNvbXBfY3JjLCAxMjgsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhjb21wX2NyYywgIlxuIGNyY19maWxlbmFtZVxuIik7CisKK21vZHVsZV9wYXJhbV9zdHJpbmcoYXV4X2NvbXBfY3JjLCBhdXhfY29tcF9jcmMsIDEyOCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGF1eF9jb21wX2NyYywgIlxuIGF1eCBjcmNfZmlsZW5hbWVcbiIpOworCisKK21vZHVsZV9wYXJhbShmY19kZWJ1ZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZjX2RlYnVnLCAiXG4gZnJhbWUgY2hlY2sgZGVidWdcbiIpOworCittb2R1bGVfcGFyYW0oYXV4X2VuYWJsZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGF1eF9lbmFibGUsICJcbiBhdXggZGF0YSBjaGVjayBkZWJ1Z1xuIik7CisKK21vZHVsZV9wYXJhbShzaXplX3l1dl9idWYsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhzaXplX3l1dl9idWYsICJcbiBzaXplX3l1dl9idWZcbiIpOworCittb2R1bGVfcGFyYW1fc3RyaW5nKGNoZWNrc3VtX2luZm8sIGNoZWNrc3VtX2luZm8sIDEyOCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNoZWNrc3VtX2luZm8sICJcbiBjaGVja3N1bV9pbmZvXG4iKTsKKworbW9kdWxlX3BhcmFtX3N0cmluZyhjaGVja3N1bV9maWxlbmFtZSwgY2hlY2tzdW1fZmlsZW5hbWUsIDEyOCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNoZWNrc3VtX2ZpbGVuYW1lLCAiXG4gY2hlY2tzdW1fZmlsZW5hbWVcbiIpOworCittb2R1bGVfcGFyYW0oY2hlY2tzdW1fc3RhcnRfY291bnQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhjaGVja3N1bV9zdGFydF9jb3VudCwgIlxuIGNoZWNrc3VtX3N0YXJ0X2NvdW50XG4iKTsKKworbW9kdWxlX3BhcmFtKGNoZWNrc3VtX2VuYWJsZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNoZWNrc3VtX2VuYWJsZSwgIlxuIGNoZWNrc3VtX2VuYWJsZVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvZnJhbWVfY2hlY2suaCBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy9mcmFtZV9jaGVjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ODMzNzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvZnJhbWVfY2hlY2suaApAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9tZWRpYS9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL2ZyYW1lX2NoZWNrLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisqLworCisjaWZuZGVmIF9fRlJBTUVfQ0hFQ0tfSF9fCisjZGVmaW5lIF9fRlJBTUVfQ0hFQ0tfSF9fCisKKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdmZtL3ZmcmFtZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisKKyNkZWZpbmUgRlJBTUVfQ0hFQ0sKKyNkZWZpbmUgQVVYX0RBVEFfQ1JDCisKKworI2RlZmluZSBZVVZfTUFYX0RVTVBfTlVNICA2MAorCisjZGVmaW5lIFNJWkVfQ1JDCTY0CisjZGVmaW5lIFNJWkVfQ0hFQ0tfUSAxMjgKKworI2RlZmluZSBVU0VSX0NNUF9QT09MX01BWF9TSVpFIChTSVpFX0NIRUNLX1EpCisKK3N0cnVjdCBwaWNfZHVtcF90eworCXN0cnVjdCBmaWxlICp5dXZfZnA7CisJbG9mZl90IHl1dl9wb3M7CisJdW5zaWduZWQgaW50IHN0YXJ0OworCXVuc2lnbmVkIGludCBudW07CisJdW5zaWduZWQgaW50IGVuZDsKKwl1bnNpZ25lZCBpbnQgZHVtcF9jbnQ7CisKKwl1bnNpZ25lZCBpbnQgYnVmX3NpemU7CisJY2hhciAqYnVmX2FkZHI7Cit9OworCitzdHJ1Y3QgcGljX2NoZWNrX3R7CisJc3RydWN0IGZpbGUgKmNoZWNrX2ZwOworCWxvZmZfdCBjaGVja19wb3M7CisKKwlzdHJ1Y3QgZmlsZSAqY29tcGFyZV9mcDsKKwlsb2ZmX3QgY29tcGFyZV9wb3M7CisJdW5zaWduZWQgaW50IGNtcF9jcmNfY250OworCXZvaWQgKmZiY19wbGFuZXNbNF07CisJdm9pZCAqY2hlY2tfYWRkcjsKKwlERUNMQVJFX0tGSUZPKG5ld19jaGtfcSwgY2hhciAqLCBTSVpFX0NIRUNLX1EpOworCURFQ0xBUkVfS0ZJRk8od3JfY2hrX3EsIGNoYXIgKiwgU0laRV9DSEVDS19RKTsKK307CisKK3N0cnVjdCBhdXhfZGF0YV9jaGVja190eworCXN0cnVjdCBmaWxlICpjaGVja19mcDsKKwlsb2ZmX3QgY2hlY2tfcG9zOworCisJc3RydWN0IGZpbGUgKmNvbXBhcmVfZnA7CisJbG9mZl90IGNvbXBhcmVfcG9zOworCXVuc2lnbmVkIGludCBjbXBfY3JjX2NudDsKKwl2b2lkICpjaGVja19hZGRyOworCisJREVDTEFSRV9LRklGTyhuZXdfY2hrX3EsIGNoYXIgKiwgU0laRV9DSEVDS19RKTsKKwlERUNMQVJFX0tGSUZPKHdyX2Noa19xLCBjaGFyICosIFNJWkVfQ0hFQ0tfUSk7Cit9OworCisKK3N0cnVjdCBwaWNfY2hlY2tfbWdyX3R7CisJaW50IGlkOworCWludCBlbmFibGU7CisJdW5zaWduZWQgaW50IGZyYW1lX2NudDsKKwkvKiBwaWMgaW5mbyAqLworCXVuc2lnbmVkIGludCBjYW52YXNfdzsKKwl1bnNpZ25lZCBpbnQgY2FudmFzX2g7CisJdW5zaWduZWQgaW50IHNpemVfeTsJLy9yZWFsIHNpemUKKwl1bnNpZ25lZCBpbnQgc2l6ZV91djsKKwl1bnNpZ25lZCBpbnQgc2l6ZV9waWM7CisJdW5zaWduZWQgaW50IGxhc3Rfc2l6ZV9waWM7CisJdm9pZCAqeV92YWRkcjsKKwl2b2lkICp1dl92YWRkcjsKKwl1bG9uZyB5X3BoeWFkZHI7CisJdWxvbmcgdXZfcGh5YWRkcjsKKwlpbnQgZXJyX2NyY19ibG9jazsKKworCWludCBmaWxlX2NudDsKKwlhdG9taWNfdCB3b3JrX2luaXRlZDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZnJhbWVfY2hlY2tfd29yazsKKworCXN0cnVjdCBwaWNfY2hlY2tfdCBwaWNfY2hlY2s7CisJc3RydWN0IHBpY19kdW1wX3QgIHBpY19kdW1wOworCisJc3RydWN0IHVzcl9jcmNfaW5mb190ICpjbXBfcG9vbDsKKwlpbnQgdXNyX2NtcF9udW07CisJaW50IHVzcl9jbXBfcmVzdWx0OworCS8qIGZvciBtanBlZyB1IGRpZmZlcmVudCBhZGRyIHdpdGggdiAqLworCWJvb2wgbWpwZWdfZmxhZzsKKwl2b2lkICpleHRyYV92X3ZhZGRyOworCXVsb25nIGV4dHJhX3ZfcGh5YWRkcjsKKwlpbnQgeXV2c3VtOworCXUzMiB3aWR0aDsKKwl1MzIgaGVpZ2h0OworfTsKKworc3RydWN0IGF1eF9kYXRhX2NoZWNrX21ncl90eworCWludCBpZDsKKwlpbnQgZW5hYmxlOworCXVuc2lnbmVkIGludCBmcmFtZV9jbnQ7CisJLyogcGljIGluZm8gKi8KKwlpbnQgYXV4X3NpemU7CisJY2hhciAqYXV4X2FkZHI7CisKKwlpbnQgZmlsZV9jbnQ7CisJYXRvbWljX3Qgd29ya19pbml0ZWQ7CisJc3RydWN0IHdvcmtfc3RydWN0IGF1eF9kYXRhX2NoZWNrX3dvcms7CisKKwlzdHJ1Y3QgYXV4X2RhdGFfY2hlY2tfdCBhdXhfZGF0YV9jaGVjazsKK307CisKKworaW50IGR1bXBfeXV2X3RyaWcoc3RydWN0IHBpY19jaGVja19tZ3JfdCAqbWdyLAorCWludCBpZCwgaW50IHN0YXJ0LCBpbnQgbnVtKTsKKworaW50IGRlY29kZXJfZG9fZnJhbWVfY2hlY2soc3RydWN0IHZkZWNfcyAqdmRlYywgc3RydWN0IHZmcmFtZV9zICp2Zik7CisKK2ludCBkZWNvZGVyX2RvX2F1eF9kYXRhX2NoZWNrKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGNoYXIgKmF1eF9idWZmZXIsIGludCBzaXplKTsKKworaW50IGZyYW1lX2NoZWNrX2luaXQoc3RydWN0IHBpY19jaGVja19tZ3JfdCAqbWdyLCBpbnQgaWQpOworCit2b2lkIGZyYW1lX2NoZWNrX2V4aXQoc3RydWN0IHBpY19jaGVja19tZ3JfdCAqbWdyKTsKKworc3NpemVfdCBmcmFtZV9jaGVja19zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zik7CisKK3NzaXplX3QgZnJhbWVfY2hlY2tfc3RvcmUoc3RydWN0IGNsYXNzICpjbGFzcywKKwkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7CisKK3NzaXplX3QgZHVtcF95dXZfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpOworCitzc2l6ZV90IGR1bXBfeXV2X3N0b3JlKHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOworCit2b2lkIHZkZWNfZnJhbWVfY2hlY2tfZXhpdChzdHJ1Y3QgdmRlY19zICp2ZGVjKTsKK2ludCB2ZGVjX2ZyYW1lX2NoZWNrX2luaXQoc3RydWN0IHZkZWNfcyAqdmRlYyk7CisKK3ZvaWQgdmRlY19hdXhfZGF0YV9jaGVja19leGl0KHN0cnVjdCB2ZGVjX3MgKnZkZWMpOworaW50IHZkZWNfYXV4X2RhdGFfY2hlY2tfaW5pdChzdHJ1Y3QgdmRlY19zICp2ZGVjKTsKKworCisjZW5kaWYgLyogX19GUkFNRV9DSEVDS19IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3V0aWxzLmMgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzcyYTE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3V0aWxzLmMKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9tZWRpYS9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3V0aWxzLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJ2ZGVjLmgiCisjaW5jbHVkZSAidmRlY19pbnB1dC5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmRlY19yZWcuaD4KKyNpbmNsdWRlICJhbXZkZWMuaCIKKyNpbmNsdWRlICJkZWNvZGVyX21tdV9ib3guaCIKKyNpbmNsdWRlICJkZWNvZGVyX2JtbXVfYm94LmgiCisjaW5jbHVkZSAidmRlY19wcm9maWxlLmgiCisKK3N0YXRpYyBpbnQgX19pbml0IGRlY29kZXJfY29tbW9uX2luaXQodm9pZCkKK3sKKwkvKnZkZWMgaW5pdC4qLworCXZkZWNfbW9kdWxlX2luaXQoKTsKKworCS8qYW12ZGVjIGluaXQuKi8KKwlhbXZkZWNfaW5pdCgpOworCisJLyptbXUgYm94IGluaXQuKi8KKwlkZWNvZGVyX21tdV9ib3hfaW5pdCgpOy8qZXhpdD8qLworCWRlY29kZXJfYm1tdV9ib3hfaW5pdCgpOworCisJdmRlY19wcm9maWxlX2luaXRfZGVidWdmcygpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkZWNvZGVyX2NvbW1vbl9leGl0KHZvaWQpCit7CisJLyp2ZGVjIGV4aXQuKi8KKwl2ZGVjX21vZHVsZV9leGl0KCk7CisKKwkvKmFtdmRlYyBleGl0LiovCisJYW12ZGVjX2V4aXQoKTsKKworCWRlY29kZXJfbW11X2JveF9leGl0KCk7CisJZGVjb2Rlcl9ibW11X2JveF9leGl0KCk7CisKKwl2ZGVjX3Byb2ZpbGVfZXhpdF9kZWJ1Z2ZzKCk7Cit9CisKK21vZHVsZV9pbml0KGRlY29kZXJfY29tbW9uX2luaXQpOworbW9kdWxlX2V4aXQoZGVjb2Rlcl9jb21tb25fZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQU1MT0dJQyBkZWNvZGVyX2NvbW1vbiBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdmRlYy5jIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGYwZTNjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWMuYwpAQCAtMCwwICsxLDYzNDIgQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvbWVkaWEvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKyNkZWZpbmUgREVCVUcKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL3Zmb3JtYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL2lvbWFwLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jYW52YXMvY2FudmFzLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3Byb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3JlY2VpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92aWRlb19zaW5rL2lvbnZpZGVvX2V4dC5oPgorI2lmZGVmIENPTkZJR19BTUxPR0lDX1Y0TF9WSURFTzMKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZpZGVvX3NpbmsvdjRsdmlkZW9fZXh0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92Zm1fZXh0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQvY2xvY2suaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L3NjaGVkL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisvKmZvciBWREVDX0RFQlVHX1NVUFBPUlQqLworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL3ZkZWNfcmVnLmg+CisjaW5jbHVkZSAiLi4vLi4vLi4vc3RyZWFtX2lucHV0L2FtcG9ydHMvc3RyZWFtYnVmLmgiCisjaW5jbHVkZSAidmRlYy5oIgorI2luY2x1ZGUgInZkZWNfdHJhY2UuaCIKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9NVUxUSV9ERUMKKyNpbmNsdWRlICJ2ZGVjX3Byb2ZpbGUuaCIKKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkL2Nsb2NrLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9mZHQuaD4KKyNpbmNsdWRlIDxsaW51eC9saWJmZHRfZW52Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcmVzZXJ2ZWRfbWVtLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLWNvbnRpZ3VvdXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jbWEuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtY29udGlndW91cy5oPgorI2luY2x1ZGUgIi4uLy4uLy4uL3N0cmVhbV9pbnB1dC9hbXBvcnRzL2FtcG9ydHNfcHJpdi5oIgorCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy9hbXBvcnRzX2NvbmZpZy5oPgorI2luY2x1ZGUgIi4uL3V0aWxzL2FtdmRlYy5oIgorI2luY2x1ZGUgInZkZWNfaW5wdXQuaCIKKworI2luY2x1ZGUgIi4uLy4uLy4uL2NvbW1vbi9tZWRpYV9jbG9jay9jbGsvY2xrLmgiCisjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3JlZ2lzdGVycy9jcHVfdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29kZWNfbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZpZGVvX3NpbmsvdmlkZW9fa2VlcGVyLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jb2RlY19tbS9jb25maWdzLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9mcmFtZV9zeW5jL3B0c3NlcnYuaD4KKyNpbmNsdWRlICIuLi8uLi8uLi9jb21tb24vY2hpcHMvZGVjb2Rlcl9jcHVfdmVyX2luZm8uaCIKKyNpbmNsdWRlICJmcmFtZV9jaGVjay5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvdGVlLmg+CisjaW5jbHVkZSAidmRlY19jYW52YXNfdXRpbHMuaCIKKyNpbmNsdWRlICIuLi8uLi8uLi9hbXZkZWNfcG9ydHMvYW1sX3Zjb2RlY19kcnYuaCIKKworCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfUE9XRVIKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL3Bvd2VyX2N0cmwuaD4KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfSU9OVklERU8KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZpZGVvX3NpbmsvaW9udmlkZW9fZXh0Lmg+CisjZW5kaWYKKy8vI2luY2x1ZGUgPGR0LWJpbmRpbmdzL3Bvd2VyL3NjMi1wZC5oPgorLy8jaW5jbHVkZSA8bGludXgvYW1sb2dpYy9wd3JfY3RybC5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgInZkZWNfcG93ZXJfY3RybC5oIgorCitzdGF0aWMgREVGSU5FX01VVEVYKHZkZWNfbXV0ZXgpOworCisjZGVmaW5lIE1DX1NJWkUgKDQwOTYgKiA0KQorI2RlZmluZSBDTUFfQUxMT0NfU0laRSBTWl82NE0KKyNkZWZpbmUgTUVNX05BTUUgInZkZWNfcHJlYWxsb2MiCitzdGF0aWMgaW50IGluaXRlZF92Y29kZWNfbnVtOworI2RlZmluZSBqaWZmaWVzX21zIGRpdjY0X3U2NChnZXRfamlmZmllc182NCgpICogMTAwMCwgSFopCitzdGF0aWMgaW50IHBvd2Vyb25fY2xvY2tfbGV2ZWw7CitzdGF0aWMgaW50IGRlYnVnX3ZkZXRlY3QgPSAwOworc3RhdGljIGludCBrZWVwX3ZkZWNfbWVtOworc3RhdGljIHVuc2lnbmVkIGludCBkZWJ1Z190cmFjZV9udW0gPSAxNiAqIDIwOworc3RhdGljIGludCBzdGVwX21vZGU7CitzdGF0aWMgdW5zaWduZWQgaW50IGNsa19jb25maWc7CisvKgorMHgxIDogZW5hYmxlIHJkbWEKKzB4MiA6IGNoZWNrIHJkbWEgcmVzdWx0CisqLworc3RhdGljIGludCByZG1hX21vZGUgPSAweDE7CisKKy8qCisgKiAweDEgIDogc2NoZWRfcHJpb3JpdHkgdG8gTUFYX1JUX1BSSU8gLTEuCisgKiAweDIgIDogYWx3YXlzIHJlbG9hZCBmaXJtd2FyZS4KKyAqIDB4NCAgOiB2ZGVjIGNhbnZhcyBkZWJ1ZyBlbmFibGUKKyAqIDB4MTAwOiBlbmFibGUgdmRlYyBmZW5jZS4KKyAqLworI2RlZmluZSBWREVDX0RCR19TQ0hFRF9QUklPCSgweDEpCisjZGVmaW5lIFZERUNfREJHX0FMV0FZU19MT0FEX0ZXCSgweDIpCisjZGVmaW5lIFZERUNfREJHX0NBTlZBU19TVEFUVVMJKDB4NCkKKyNkZWZpbmUgVkRFQ19EQkdfRU5BQkxFX0ZFTkNFCSgweDEwMCkKKworCisjZGVmaW5lIEhFVkNfUkRNQV9GX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwZjAKKyNkZWZpbmUgSEVWQ19SRE1BX0ZfU1RBUlRfQUREUiAgICAgICAgICAgICAgICAgICAgIDB4MzBmMQorI2RlZmluZSBIRVZDX1JETUFfRl9FTkRfQUREUiAgICAgICAgICAgICAgICAgICAgICAgMHgzMGYyCisjZGVmaW5lIEhFVkNfUkRNQV9GX1NUQVRVUzAgICAgICAgICAgICAgICAgICAgICAgICAweDMwZjMKKworI2RlZmluZSBIRVZDX1JETUFfQl9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMGY4CisjZGVmaW5lIEhFVkNfUkRNQV9CX1NUQVJUX0FERFIgICAgICAgICAgICAgICAgICAgICAweDMwZjkKKyNkZWZpbmUgSEVWQ19SRE1BX0JfRU5EX0FERFIgICAgICAgICAgICAgICAgICAgICAgIDB4MzBmYQorI2RlZmluZSBIRVZDX1JETUFfQl9TVEFUVVMwICAgICAgICAgICAgICAgICAgICAgICAgMHgzMGZiCisKKworc3RhdGljIHUzMiBkZWJ1ZyA9IFZERUNfREJHX0FMV0FZU19MT0FEX0ZXOworCit1MzIgdmRlY19nZXRfZGVidWcodm9pZCkKK3sKKyAgICByZXR1cm4gZGVidWc7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfZ2V0X2RlYnVnKTsKKworCitpbnQgaGV2Y19tYXhfcmVzZXRfY291bnQ7CitFWFBPUlRfU1lNQk9MKGhldmNfbWF4X3Jlc2V0X2NvdW50KTsKKworaW50IG5vX3Bvd2VyZG93bjsKK0VYUE9SVF9TWU1CT0wobm9fcG93ZXJkb3duKTsKK3N0YXRpYyBpbnQgcGFyYWxsZWxfZGVjb2RlID0gMTsKK3N0YXRpYyBpbnQgZnBzX2RldGVjdGlvbjsKK3N0YXRpYyBpbnQgZnBzX2NsZWFyOworc3RhdGljIGJvb2wgcHJvZ19vbmx5OworCitzdGF0aWMgaW50IGZvcmNlX25vc2VjdXJlX2V2ZW5fZHJtOworc3RhdGljIGludCBkaXNhYmxlX3N3aXRjaF9zaW5nbGVfdG9fbXVsdDsKKworc3RhdGljIERFRklORV9TUElOTE9DSyh2ZGVjX3NwaW5fbG9jayk7CisKKyNkZWZpbmUgSEVWQ19URVNUX0xJTUlUIDEwMAorI2RlZmluZSBHWEJCX1JFVl9BX01JTk9SIDB4QQorCisjZGVmaW5lIFBSSU5UX0ZSQU1FX0lORk8gMQorI2RlZmluZSBESVNBQkxFX0ZSQU1FX0lORk8gMgorCisjZGVmaW5lIFJFU0VUN19SRUdJU1RFUl9MRVZFTCAweDExMjcKKyNkZWZpbmUgUF9SRVNFVENUUkxfUkVTRVQ1X0xFVkVMIDB4MTUKKworI2RlZmluZSBzdHIoYSkgI2EKKyNkZWZpbmUgeHN0cihhKSBzdHIoYSkKKworc3RhdGljIGludCBmcmFtZWluZm9fZmxhZyA9IDA7CitzdGF0aWMgaW50IHY0bHZpZGVvX2FkZF9kaSA9IDE7CitzdGF0aWMgaW50IHY0bHZpZGVvX2FkZF9wcG1nciA9IDA7CitzdGF0aWMgaW50IG1heF9kaV9pbnN0YW5jZSA9IDI7CitzdGF0aWMgaW50IG1heF9zdXBwb3J0ZWRfZGlfaW5zdGFuY2UgPSA0OworCisvL3N0YXRpYyBpbnQgcGF0aF9kZWJ1ZyA9IDA7CisKK3N0YXRpYyBpbnQgZW5hYmxlX212ZGVjX2luZm8gPSAxOworCitpbnQgZGVjb2RlX3VuZGVyZmxvdyA9IDA7Cit1MzIgZGVidWdfbWV0YTsKKworc3RhdGljIGludCBlbmFibGVfc3RyZWFtX21vZGVfbXVsdGlfZGVjOworCitzdF91c2VyZGF0YSB1c2VyZGF0YTsKKwordHlwZWRlZiB2b2lkICgqdmRlY19mcmFtZV9yYXRlX2V2ZW50X2Z1bmMpKGludCk7CisKKyNpZiAxCitleHRlcm4gdm9pZCB2ZnJhbWVfcmF0ZV91ZXZlbnQoaW50IGR1cmF0aW9uKTsKK3ZkZWNfZnJhbWVfcmF0ZV9ldmVudF9mdW5jIGZyYW1lX3JhdGVfbm90aWZ5ID0gdmZyYW1lX3JhdGVfdWV2ZW50OworI2Vsc2UKK3ZkZWNfZnJhbWVfcmF0ZV9ldmVudF9mdW5jIGZyYW1lX3JhdGVfbm90aWZ5ID0gTlVMTDsKKyNlbmRpZgorCit2b2lkIHZkZWNfZnJhbWVfcmF0ZV91ZXZlbnQoaW50IGR1cikKK3sKKwlpZiAoZnJhbWVfcmF0ZV9ub3RpZnkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKHVubGlrZWx5KGluX2ludGVycnVwdCgpKSkKKwkJcmV0dXJuOworCXByX2luZm8oInZkZWNfZnJhbWVfcmF0ZV91ZXZlbnQgJWRcbiIsIGR1cik7CisJZnJhbWVfcmF0ZV9ub3RpZnkoZHVyKTsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19mcmFtZV9yYXRlX3VldmVudCk7CisKKwordm9pZCByZWdpc3Rlcl9mcmFtZV9yYXRlX3VldmVudF9mdW5jKHZkZWNfZnJhbWVfcmF0ZV9ldmVudF9mdW5jIGZ1bmMpCit7CisJZnJhbWVfcmF0ZV9ub3RpZnkgPSBmdW5jOworfQorRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9mcmFtZV9yYXRlX3VldmVudF9mdW5jKTsKKworc3RydWN0IGFtX3JlZyB7CisJY2hhciAqbmFtZTsKKwlpbnQgb2Zmc2V0OworfTsKKworc3RydWN0IHZkZWNfaXNyX2NvbnRleHRfcyB7CisJaW50IGluZGV4OworCWludCBpcnE7CisJaXJxX2hhbmRsZXJfdCBkZXZfaXNyOworCWlycV9oYW5kbGVyX3QgZGV2X3RocmVhZGVkX2lzcjsKKwl2b2lkICpkZXZfaWQ7CisJc3RydWN0IHZkZWNfcyAqdmRlYzsKK307CisKK3N0cnVjdCBkZWNvZGVfZnBzX3MgeworCXUzMiBmcmFtZV9jb3VudDsKKwl1NjQgc3RhcnRfdGltZXN0YW1wOworCXU2NCBsYXN0X3RpbWVzdGFtcDsKKwl1MzIgZnBzOworfTsKKworc3RydWN0IHZkZWNfY29yZV9zIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNvbm5lY3RlZF92ZGVjX2xpc3Q7CisJc3BpbmxvY2tfdCBsb2NrOworCXNwaW5sb2NrX3QgY2FudmFzX2xvY2s7CisJc3BpbmxvY2tfdCBmcHNfbG9jazsKKwlzcGlubG9ja190IGlucHV0X2xvY2s7CisJc3RydWN0IGlkYSBpZGE7CisJYXRvbWljX3QgdmRlY19ucjsKKwlzdHJ1Y3QgdmRlY19zICp2Zm1fdmRlYzsKKwlzdHJ1Y3QgdmRlY19zICphY3RpdmVfdmRlYzsKKwlzdHJ1Y3QgdmRlY19zICphY3RpdmVfaGV2YzsKKwlzdHJ1Y3QgdmRlY19zICpoaW50X2ZyX3ZkZWM7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqdmRlY19jb3JlX3BsYXRmb3JtX2RldmljZTsKKwlzdHJ1Y3QgZGV2aWNlICpjbWFfZGV2OworCXN0cnVjdCBzZW1hcGhvcmUgc2VtOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGhyZWFkOworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp2ZGVjX2NvcmVfd3E7CisKKwl1bnNpZ25lZCBsb25nIHNjaGVkX21hc2s7CisJc3RydWN0IHZkZWNfaXNyX2NvbnRleHRfcyBpc3JfY29udGV4dFtWREVDX0lSUV9NQVhdOworCWludCBwb3dlcl9yZWZfY291bnRbVkRFQ19NQVhdOworCXN0cnVjdCB2ZGVjX3MgKmxhc3RfdmRlYzsKKwlpbnQgcGFyYWxsZWxfZGVjOworCXVuc2lnbmVkIGxvbmcgcG93ZXJfcmVmX21hc2s7CisJaW50IHZkZWNfY29tYmluZV9mbGFnOworCXN0cnVjdCBkZWNvZGVfZnBzX3MgZGVjb2RlX2Zwc1tNQVhfSU5TVEFOQ0VfTVVOXTsKKwl1bnNpZ25lZCBsb25nIGJ1ZmZfZmxhZzsKKwl1bnNpZ25lZCBsb25nIHN0cmVhbV9idWZmX2ZsYWc7CisJc3RydWN0IHBvd2VyX21hbmFnZXJfcyAqcG07CisJdTMyIHZkZWNfcmVzb3VjZV9zdGF0dXM7CisJc3RydWN0IHBvc3RfdGFza19tZ3JfcyBwb3N0OworfTsKKworc3RhdGljIHN0cnVjdCB2ZGVjX2NvcmVfcyAqdmRlY19jb3JlOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZkZWNfc3RhdHVzX3N0cmluZ1tdID0geworCSJWREVDX1NUQVRVU19VTklOSVRJQUxJWkVEIiwKKwkiVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEIiwKKwkiVkRFQ19TVEFUVVNfQ09OTkVDVEVEIiwKKwkiVkRFQ19TVEFUVVNfQUNUSVZFIgorfTsKKy8qCitiaXQgWzI5XSBlbmFibGUgc3RlYW0gbW9kZSBkdiBtdWx0aTsKK2JpdCBbMjhdIGVuYWJsZSBwcmludAorYml0IFsyMzoxNl0gZXRjCitiaXQgWzE1OjEyXQorCW5vbmUgMCBhbmQgbm90IDB4MTogZm9yY2Ugc2luZ2xlCisJbm9uZSAwIGFuZCAweDE6IGZvcmNlIG11bHRpCitiaXQgWzhdCisJMTogZm9yY2UgZHVhbAorYml0IFszXQorCTE6IHVzZSBtYXZzIGZvciBzaW5nbGUgbW9kZQorYml0IFsyXQorCTE6IGZvcmNlIHZmbSBwYXRoIGZvciBmcmFtZSBtb2RlCitiaXQgWzFdCisJMTogZm9yY2UgZXNwYXJzZXIgYXV0byBtb2RlCitiaXQgWzBdCisJMTogZGlzYWJsZSBhdWRvIG1hbnVhbCBtb2RlID8/CisqLworCitzdGF0aWMgaW50IGRlYnVnZmxhZ3M7CisKK3N0YXRpYyBjaGFyIHZmbV9wYXRoW1ZERUNfTUFQX05BTUVfU0laRV0gPSB7ImRpc2FibGUifTsKK3N0YXRpYyBjb25zdCBjaGFyIHZmbV9wYXRoX25vZGVbXVtWREVDX01BUF9OQU1FX1NJWkVdID0KK3sKKwkidmlkZW9fcmVuZGVyLjAiLAorCSJ2aWRlb19yZW5kZXIuMSIsCisJImFtdmlkZW8iLAorCSJ2aWRlb3BpcCIsCisJImRlaW50ZXJsYWNlIiwKKwkiZGltdWx0aS4xIiwKKwkiYW1sdmlkZW8iLAorCSJhbWxfdmlkZW8uMSIsCisJImFtbHZpZGVvMi4wIiwKKwkiYW1sdmlkZW8yLjEiLAorCSJwcG1nciIsCisJImlvbnZpZGVvIiwKKwkiaW9udmlkZW8uMSIsCisJImlvbnZpZGVvLjIiLAorCSJpb252aWRlby4zIiwKKwkiaW9udmlkZW8uNCIsCisJImlvbnZpZGVvLjUiLAorCSJpb252aWRlby42IiwKKwkiaW9udmlkZW8uNyIsCisJImlvbnZpZGVvLjgiLAorCSJ2aWRlb3N5bmMuMCIsCisJInY0bHZpZGVvLjAiLAorCSJ2NGx2aWRlby4xIiwKKwkidjRsdmlkZW8uMiIsCisJInY0bHZpZGVvLjMiLAorCSJ2NGx2aWRlby40IiwKKwkidjRsdmlkZW8uNSIsCisJInY0bHZpZGVvLjYiLAorCSJ2NGx2aWRlby43IiwKKwkidjRsdmlkZW8uOCIsCisJImZha2UtYW12aWRlbyIsCisJImRpc2FibGUiLAorCSJyZXNlcnZlZCIsCit9OworCitpbnQgdmRlY19nZXRfZGVidWdfZmxhZ3Modm9pZCkKK3sKKwlyZXR1cm4gZGVidWdmbGFnczsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19nZXRfZGVidWdfZmxhZ3MpOworCit2b2lkIFZERUNfUFJJTlRfRlVOX0xJTkVOTyhjb25zdCBjaGFyICpmdW4sIGludCBsaW5lKQoreworCWlmIChkZWJ1Z2ZsYWdzICYgMHgxMDAwMDAwMCkKKwkJcHJfaW5mbygiJXMsICVkXG4iLCBmdW4sIGxpbmUpOworfQorRVhQT1JUX1NZTUJPTChWREVDX1BSSU5UX0ZVTl9MSU5FTk8pOworCit1bnNpZ25lZCBjaGFyIGlzX211bHRfaW5jKHVuc2lnbmVkIGludCB0eXBlKQoreworCXVuc2lnbmVkIGNoYXIgcmV0ID0gMDsKKwlpZiAodmRlY19nZXRfZGVidWdfZmxhZ3MoKSAmIDB4ZjAwMCkKKwkJcmV0ID0gKHZkZWNfZ2V0X2RlYnVnX2ZsYWdzKCkgJiAweDEwMDApCisJCQk/IDEgOiAwOworCWVsc2UgaWYgKHR5cGUgJiBQT1JUX1RZUEVfREVDT0RFUl9TQ0hFRCkKKwkJcmV0ID0gMTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChpc19tdWx0X2luYyk7CisKK2Jvb2wgaXNfc3VwcG9ydF9ub19wYXJzZXIodm9pZCkKK3sKKwlpZiAoKGVuYWJsZV9zdHJlYW1fbW9kZV9tdWx0aV9kZWMpIHx8CisJCShnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NDMikgfHwKKwkJKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDcpKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CitFWFBPUlRfU1lNQk9MKGlzX3N1cHBvcnRfbm9fcGFyc2VyKTsKKworc3RhdGljIGNvbnN0IGJvb2wgY29yZXNfd2l0aF9pbnB1dFtWREVDX01BWF0gPSB7CisJdHJ1ZSwgICAvKiBWREVDXzEgKi8KKwlmYWxzZSwgIC8qIFZERUNfSENPREVDICovCisJZmFsc2UsICAvKiBWREVDXzIgKi8KKwl0cnVlLCAgIC8qIFZERUNfSEVWQyAvIFZERUNfSEVWQ19GUk9OVCAqLworCWZhbHNlLCAgLyogVkRFQ19IRVZDX0JBQ0sgKi8KK307CisKK3N0YXRpYyBjb25zdCBpbnQgY29yZXNfaW50W1ZERUNfTUFYXSA9IHsKKwlWREVDX0lSUV8xLAorCVZERUNfSVJRXzIsCisJVkRFQ19JUlFfMCwKKwlWREVDX0lSUV8wLAorCVZERUNfSVJRX0hFVkNfQkFDSworfTsKKwordW5zaWduZWQgbG9uZyB2ZGVjX2NhbnZhc19sb2NrKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmRlY19jb3JlLT5jYW52YXNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGZsYWdzOworfQorCit2b2lkIHZkZWNfY2FudmFzX3VubG9jayh1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZkZWNfY29yZS0+Y2FudmFzX2xvY2ssIGZsYWdzKTsKK30KKwordW5zaWduZWQgbG9uZyB2ZGVjX2Zwc19sb2NrKHN0cnVjdCB2ZGVjX2NvcmVfcyAqY29yZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZjb3JlLT5mcHNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGZsYWdzOworfQorCit2b2lkIHZkZWNfZnBzX3VubG9jayhzdHJ1Y3QgdmRlY19jb3JlX3MgKmNvcmUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29yZS0+ZnBzX2xvY2ssIGZsYWdzKTsKK30KKwordW5zaWduZWQgbG9uZyB2ZGVjX2NvcmVfbG9jayhzdHJ1Y3QgdmRlY19jb3JlX3MgKmNvcmUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb3JlLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZmxhZ3M7Cit9CisKK3ZvaWQgdmRlY19jb3JlX3VubG9jayhzdHJ1Y3QgdmRlY19jb3JlX3MgKmNvcmUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29yZS0+bG9jaywgZmxhZ3MpOworfQorCit1bnNpZ25lZCBsb25nIHZkZWNfaW5wdXRidWZmX2xvY2soc3RydWN0IHZkZWNfY29yZV9zICpjb3JlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29yZS0+aW5wdXRfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGZsYWdzOworfQorCit2b2lkIHZkZWNfaW5wdXRidWZmX3VubG9jayhzdHJ1Y3QgdmRlY19jb3JlX3MgKmNvcmUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29yZS0+aW5wdXRfbG9jaywgZmxhZ3MpOworfQorCisKK3N0YXRpYyBib29sIHZkZWNfaXNfaW5wdXRfZnJhbWVfZW1wdHkoc3RydWN0IHZkZWNfcyAqdmRlYykgeworCXN0cnVjdCB2ZGVjX2NvcmVfcyAqY29yZSA9IHZkZWNfY29yZTsKKwlib29sIHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZmxhZ3MgPSB2ZGVjX2lucHV0YnVmZl9sb2NrKGNvcmUpOworCXJldCA9ICEodmRlYy0+Y29yZV9tYXNrICYgY29yZS0+YnVmZl9mbGFnKTsKKwl2ZGVjX2lucHV0YnVmZl91bmxvY2soY29yZSwgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdmRlY191cChzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXN0cnVjdCB2ZGVjX2NvcmVfcyAqY29yZSA9IHZkZWNfY29yZTsKKworCWlmIChkZWJ1ZyAmIDgpCisJCXByX2luZm8oInZkZWNfdXAsIGlkOiVkXG4iLCB2ZGVjLT5pZCk7CisJdXAoJmNvcmUtPnNlbSk7Cit9CisKK3N0YXRpYyB1NjQgdmRlY19nZXRfdXNfdGltZV9zeXN0ZW0odm9pZCkKK3sKKwlyZXR1cm4gZGl2NjRfdTY0KGxvY2FsX2Nsb2NrKCksIDEwMDApOworfQorCitzdGF0aWMgdm9pZCB2ZGVjX2Zwc19jbGVhcihpbnQgaWQpCit7CisJaWYgKGlkID49IE1BWF9JTlNUQU5DRV9NVU4pCisJCXJldHVybjsKKworCXZkZWNfY29yZS0+ZGVjb2RlX2Zwc1tpZF0uZnJhbWVfY291bnQgPSAwOworCXZkZWNfY29yZS0+ZGVjb2RlX2Zwc1tpZF0uc3RhcnRfdGltZXN0YW1wID0gMDsKKwl2ZGVjX2NvcmUtPmRlY29kZV9mcHNbaWRdLmxhc3RfdGltZXN0YW1wID0gMDsKKwl2ZGVjX2NvcmUtPmRlY29kZV9mcHNbaWRdLmZwcyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHZkZWNfZnBzX2NsZWFyYWxsKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0lOU1RBTkNFX01VTjsgaSsrKSB7CisJCXZkZWNfY29yZS0+ZGVjb2RlX2Zwc1tpXS5mcmFtZV9jb3VudCA9IDA7CisJCXZkZWNfY29yZS0+ZGVjb2RlX2Zwc1tpXS5zdGFydF90aW1lc3RhbXAgPSAwOworCQl2ZGVjX2NvcmUtPmRlY29kZV9mcHNbaV0ubGFzdF90aW1lc3RhbXAgPSAwOworCQl2ZGVjX2NvcmUtPmRlY29kZV9mcHNbaV0uZnBzID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHZkZWNfZnBzX2RldGVjKGludCBpZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGZwc19kZXRlY3Rpb24gPT0gMCkKKwkJcmV0dXJuOworCisJaWYgKGlkID49IE1BWF9JTlNUQU5DRV9NVU4pCisJCXJldHVybjsKKworCWZsYWdzID0gdmRlY19mcHNfbG9jayh2ZGVjX2NvcmUpOworCisJaWYgKGZwc19jbGVhciA9PSAxKSB7CisJCXZkZWNfZnBzX2NsZWFyYWxsKCk7CisJCWZwc19jbGVhciA9IDA7CisJfQorCisJdmRlY19jb3JlLT5kZWNvZGVfZnBzW2lkXS5mcmFtZV9jb3VudCsrOworCWlmICh2ZGVjX2NvcmUtPmRlY29kZV9mcHNbaWRdLmZyYW1lX2NvdW50ID09IDEpIHsKKwkJdmRlY19jb3JlLT5kZWNvZGVfZnBzW2lkXS5zdGFydF90aW1lc3RhbXAgPQorCQkJdmRlY19nZXRfdXNfdGltZV9zeXN0ZW0oKTsKKwkJdmRlY19jb3JlLT5kZWNvZGVfZnBzW2lkXS5sYXN0X3RpbWVzdGFtcCA9CisJCQl2ZGVjX2NvcmUtPmRlY29kZV9mcHNbaWRdLnN0YXJ0X3RpbWVzdGFtcDsKKwl9IGVsc2UgeworCQl2ZGVjX2NvcmUtPmRlY29kZV9mcHNbaWRdLmxhc3RfdGltZXN0YW1wID0KKwkJCXZkZWNfZ2V0X3VzX3RpbWVfc3lzdGVtKCk7CisJCXZkZWNfY29yZS0+ZGVjb2RlX2Zwc1tpZF0uZnBzID0KKwkJCQkodTMyKWRpdl91NjQoKCh1NjQpKHZkZWNfY29yZS0+ZGVjb2RlX2Zwc1tpZF0uZnJhbWVfY291bnQpICoKKwkJCQkJMTAwMDAwMDAwMDApLAorCQkJCQkodmRlY19jb3JlLT5kZWNvZGVfZnBzW2lkXS5sYXN0X3RpbWVzdGFtcCAtCisJCQkJCXZkZWNfY29yZS0+ZGVjb2RlX2Zwc1tpZF0uc3RhcnRfdGltZXN0YW1wKSk7CisJfQorCXZkZWNfZnBzX3VubG9jayh2ZGVjX2NvcmUsIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgdmRlY19kbWNfcGlwZWxpbmVfcmVzZXQodm9pZCkKK3sKKwkvKgorCSAqIGJpdDE1OiB2ZGVjX3BpcGxlCisJICogYml0MTQ6IGhldmNfZG1jX3BpcGxlCisJICogYml0MTM6IGhldmNmX2RtY19waXBsCisJICogYml0MTI6IHdhdmU0MjBfZG1jX3BpcGwKKwkgKiBiaXQxMTogaGNvZGVjX2RtY19waXBsCisJICovCisKKwlXUklURV9SRVNFVF9SRUcoUkVTRVQ3X1JFR0lTVEVSLAorCQkoMSA8PCAxNSkgfCAoMSA8PCAxNCkgfCAoMSA8PCAxMykgfAorCQkoMSA8PCAxMikgfCAoMSA8PCAxMSkpOworfQorCitzdGF0aWMgdm9pZCB2ZGVjX3N0b3BfYXJtcmlzYyhpbnQgaHcpCit7CisJdWxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBIWjsKKworCWlmIChodyA9PSBWREVDX0lOUFVUX1RBUkdFVF9WTEQpIHsKKwkJV1JJVEVfVlJFRyhNUFNSLCAwKTsKKwkJV1JJVEVfVlJFRyhDUFNSLCAwKTsKKworCQl3aGlsZSAoUkVBRF9WUkVHKElNRU1fRE1BX0NUUkwpICYgMHg4MDAwKSB7CisJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCQlicmVhazsKKwkJfQorCisJCXRpbWVvdXQgPSBqaWZmaWVzICsgSFo7CisJCXdoaWxlIChSRUFEX1ZSRUcoTE1FTV9ETUFfQ1RSTCkgJiAweDgwMDApIHsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmIChodyA9PSBWREVDX0lOUFVUX1RBUkdFVF9IRVZDKSB7CisJCVdSSVRFX1ZSRUcoSEVWQ19NUFNSLCAwKTsKKwkJV1JJVEVfVlJFRyhIRVZDX0NQU1IsIDApOworCisJCXdoaWxlIChSRUFEX1ZSRUcoSEVWQ19JTUVNX0RNQV9DVFJMKSAmIDB4ODAwMCkgeworCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCisJCQkJYnJlYWs7CisJCX0KKworCQl0aW1lb3V0ID0gamlmZmllcyArIEhaLzEwOworCQl3aGlsZSAoUkVBRF9WUkVHKEhFVkNfTE1FTV9ETUFfQ1RSTCkgJiAweDgwMDApIHsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJCWJyZWFrOworCQl9CisJfQorfQorCisjZGVmaW5lIFZERUNfQVNTSVNUX0RCVVNfRElTQUJMRQkJMHgwMDQ2CisjZGVmaW5lIEhFVkNfQVNTSVNUX0FYSV9TVEFUVVMyX0xPCQkweDMwN2YKKworc3RhdGljIHZvaWQgdmRlY19kYnVzX2N0cmwoYm9vbCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkgeworCQlXUklURV9WUkVHKFZERUNfQVNTSVNUX0RCVVNfRElTQUJMRSwgMCk7CisJfSBlbHNlIHsKKwkJdTMyIG5vcF9jbnQgPSAyMDA7CisJCVdSSVRFX1ZSRUcoVkRFQ19BU1NJU1RfREJVU19ESVNBQkxFLCAweGZmZmYpOworCQl3aGlsZSAoUkVBRF9WUkVHKFZERUNfQVNTSVNUX0RCVVNfRElTQUJMRSkgIT0gMHhmZmZmKTsKKwkJd2hpbGUgKG5vcF9jbnQtLSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBoZXZjX2FyYl9jdHJsKGJvb2wgZW5hYmxlKQoreworCXUzMiBheGlfY3RybCwgYXhpX3N0YXR1cywgbm9wX2NudCA9IDIwMDsKKworCWlmIChlbmFibGUpIHsKKwkJYXhpX2N0cmwgPSBSRUFEX1ZSRUcoSEVWQ19BU1NJU1RfQVhJX0NUUkwpOworCQlheGlfY3RybCAmPSAofigoMSA8PCA2KSB8ICgxIDw8IDE0KSkpOworCQlXUklURV9WUkVHKEhFVkNfQVNTSVNUX0FYSV9DVFJMLCBheGlfY3RybCk7CQkvL2VuYWJsZSBmcm9udC9iYWNrIGFyYml0b3IKKwl9IGVsc2UgeworCQlheGlfY3RybCA9IFJFQURfVlJFRyhIRVZDX0FTU0lTVF9BWElfQ1RSTCk7CisJCWF4aV9jdHJsIHw9ICgxIDw8IDYpOworCQlXUklURV9WUkVHKEhFVkNfQVNTSVNUX0FYSV9DVFJMLCBheGlfY3RybCk7CSAvLyBkaXNhYmxlIGZyb250IGFyYml0b3IKKworCQlkbyB7CisJCQlheGlfc3RhdHVzID0gUkVBRF9WUkVHKEhFVkNfQVNTSVNUX0FYSV9TVEFUVVMpOworCQkJaWYgKGF4aV9zdGF0dXMgJiAoKDEgPDwgMTUpIHwgKDEgPDwgMTEpKSkJCS8vcmVhZC93cml0ZSBkaXNhYmxlCisJCQkJYnJlYWs7CisJCX0gd2hpbGUgKDEpOworCisJCWF4aV9jdHJsIHw9ICgxIDw8IDE0KTsKKwkJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9BWElfQ1RSTCwgYXhpX2N0cmwpOwkgLy8gZGlzYWJsZSBiYWNrIGFyYml0b3IKKworCQlkbyB7CisJCQlheGlfc3RhdHVzID0gUkVBRF9WUkVHKEhFVkNfQVNTSVNUX0FYSV9TVEFUVVMyX0xPKTsKKwkJCWlmIChheGlfc3RhdHVzICYgKCgxIDw8IDE1KSB8ICgxIDw8IDExKSkpCQkvL3JlYWQvd3JpdGUgZGlzYWJsZQorCQkJCWJyZWFrOworCQl9IHdoaWxlICgxKTsKKworCQl3aGlsZSAobm9wX2NudC0tKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRlY19kbWNfcG9ydF9jdHJsKGJvb2wgZG1jX29uLCB1MzIgdGFyZ2V0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHN0c19yZWdfYWRkciA9IERNQ19DSEFOX1NUUzsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisJdW5zaWduZWQgaW50IGNwdV90eXBlID0gZ2V0X2NwdV9tYWpvcl9pZCgpOworCisJaWYgKHRhcmdldCA9PSBWREVDX0lOUFVUX1RBUkdFVF9WTEQpIHsKKwkJbWFzayA9ICgxIDw8IDEzKTsJLypiaXQxMzogRE9TIFZERUMgaW50ZXJmYWNlKi8KKwkJaWYgKGNwdV90eXBlID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKQorCQkJbWFzayA9ICgxIDw8IDIxKTsKKwl9IGVsc2UgaWYgKHRhcmdldCA9PSBWREVDX0lOUFVUX1RBUkdFVF9IRVZDKSB7CisJCW1hc2sgPSAoMSA8PCA0KTsgLypoZXZjKi8KKwkJaWYgKGNwdV90eXBlID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKQorCQkJbWFzayB8PSAoMSA8PCA4KTsgLypoZXZjYiAqLworCX0KKworCWlmICghbWFzaykgeworCQlwcl9pbmZvKCJkZWJ1ZyBkbWMgY3RybCByZXR1cm5cbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGRtY19vbikgeworCQkvKiBkbWMgYXN5bmMgb24gcmVxdXNldCAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdmRlY19zcGluX2xvY2ssIGZsYWdzKTsKKworCQljb2RlY19kbWNidXNfd3JpdGUoRE1DX1JFUV9DVFJMLAorCQkJY29kZWNfZG1jYnVzX3JlYWQoRE1DX1JFUV9DVFJMKSB8IG1hc2spOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZkZWNfc3Bpbl9sb2NrLCBmbGFncyk7CisJfSBlbHNlIHsKKwkJLyogZG1jIGFzeW5jIG9mZiByZXF1c2V0ICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZGVjX3NwaW5fbG9jaywgZmxhZ3MpOworCisJCWNvZGVjX2RtY2J1c193cml0ZShETUNfUkVRX0NUUkwsCisJCQljb2RlY19kbWNidXNfcmVhZChETUNfUkVRX0NUUkwpICYgfm1hc2spOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZkZWNfc3Bpbl9sb2NrLCBmbGFncyk7CisKKwkJc3dpdGNoIChjcHVfdHlwZSkgeworCQljYXNlIEFNX01FU09OX0NQVV9NQUpPUl9JRF9TNDoKKwkJY2FzZSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfUzREOgorCQljYXNlIEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNVc6CisJCQlzdHNfcmVnX2FkZHIgPSBTNF9ETUNfQ0hBTl9TVFM7CisJCQlicmVhazsKKwkJY2FzZSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDU6CisJCWNhc2UgQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1RDoKKwkJCXN0c19yZWdfYWRkciA9IFQ1X0RNQ19DSEFOX1NUUzsKKwkJCWJyZWFrOworCQljYXNlIEFNX01FU09OX0NQVV9NQUpPUl9JRF9TQzI6CisJCQlzdHNfcmVnX2FkZHIgPSBUTTJfUkVWQl9ETUNfQ0hBTl9TVFM7CisJCQlicmVhazsKKwkJY2FzZSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVE0yOgorCQkJaWYgKGlzX2NwdV9tZXNvbl9yZXZiKCkpCisJCQkJc3RzX3JlZ19hZGRyID0gVE0yX1JFVkJfRE1DX0NIQU5fU1RTOworCQkJZWxzZQorCQkJCXN0c19yZWdfYWRkciA9IERNQ19DSEFOX1NUUzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3RzX3JlZ19hZGRyID0gRE1DX0NIQU5fU1RTOworCQkJYnJlYWs7CisJCX0KKwkJd2hpbGUgKCEoY29kZWNfZG1jYnVzX3JlYWQoc3RzX3JlZ19hZGRyKQorCQkJCSYgbWFzaykpCisJCQkJOworCX0KK30KKworc3RhdGljIHZvaWQgdmRlY19kaXNhYmxlX0RNQyhzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCS8qY2xvc2UgZmlyc3QsdGhlbiB3YWl0IHBlZGRpbmcgZW5kLHRpbWluZyBzdWdnZXN0aW9uIGZyb20gdmxzaSovCisJc3RydWN0IHZkZWNfaW5wdXRfcyAqaW5wdXQgPSAmdmRlYy0+aW5wdXQ7CisKKwkvKiBuZWVkIHRvIHN0b3AgYXJtcmlzYy4gKi8KKwlpZiAoIUlTX0VSUl9PUl9OVUxMKHZkZWMtPmRldikpCisJCXZkZWNfc3RvcF9hcm1yaXNjKGlucHV0LT50YXJnZXQpOworCisJaWYgKChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3KSB8fAorCQkoZ2V0X2NwdV9tYWpvcl9pZCgpID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UMykpIHsKKwkJaWYgKGlucHV0LT50YXJnZXQgPT0gVkRFQ19JTlBVVF9UQVJHRVRfVkxEKSB7CisJCQlpZiAoIXZkZWNfb24oVkRFQ18xKSkKKwkJCQlyZXR1cm47CisJCQl2ZGVjX2RidXNfY3RybCgwKTsKKwkJfSBlbHNlIGlmIChpbnB1dC0+dGFyZ2V0ID09IFZERUNfSU5QVVRfVEFSR0VUX0hFVkMpIHsKKwkJCWlmICghdmRlY19vbihWREVDX0hFVkMpKQorCQkJCXJldHVybjsKKwkJCWhldmNfYXJiX2N0cmwoMCk7CisJCX0KKwl9IGVsc2UKKwkJZGVjX2RtY19wb3J0X2N0cmwoMCwgaW5wdXQtPnRhcmdldCk7CisKKwlwcl9kZWJ1ZygiJXMgaW5wdXQtPnRhcmdldD0gMHgleFxuIiwgX19mdW5jX18sICBpbnB1dC0+dGFyZ2V0KTsKK30KKworc3RhdGljIHZvaWQgdmRlY19lbmFibGVfRE1DKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IHZkZWNfaW5wdXRfcyAqaW5wdXQgPSAmdmRlYy0+aW5wdXQ7CisKKwlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDcpIHx8CisJCShnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1QzKSkgeworCQlpZiAoaW5wdXQtPnRhcmdldCA9PSBWREVDX0lOUFVUX1RBUkdFVF9WTEQpCisJCQl2ZGVjX2RidXNfY3RybCgxKTsKKwkJZWxzZSBpZiAoaW5wdXQtPnRhcmdldCA9PSBWREVDX0lOUFVUX1RBUkdFVF9IRVZDKQorCQkJaGV2Y19hcmJfY3RybCgxKTsKKwkJcmV0dXJuOworCX0KKworCS8qbXVzdCB0byBiZSByZXNldCB0aGUgZG1jIHBpcGVsaW5lIGlmIGl0J3MgZzEyYi4qLworCWlmIChnZXRfY3B1X3R5cGUoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQikKKwkJdmRlY19kbWNfcGlwZWxpbmVfcmVzZXQoKTsKKworCWRlY19kbWNfcG9ydF9jdHJsKDEsIGlucHV0LT50YXJnZXQpOworCisJcHJfZGVidWcoIiVzIGlucHV0LT50YXJnZXQ9IDB4JXhcbiIsIF9fZnVuY19fLCAgaW5wdXQtPnRhcmdldCk7Cit9CisKKworCitzdGF0aWMgaW50IHZkZWNfZ2V0X2h3X3R5cGUoaW50IHZhbHVlKQoreworCWludCB0eXBlOworCXN3aXRjaCAodmFsdWUpIHsKKwkJY2FzZSBWRk9STUFUX0hFVkM6CisJCWNhc2UgVkZPUk1BVF9WUDk6CisJCWNhc2UgVkZPUk1BVF9BVlMyOgorCQljYXNlIFZGT1JNQVRfQVYxOgorCQkJdHlwZSA9IENPUkVfTUFTS19IRVZDOworCQlicmVhazsKKworCQljYXNlIFZGT1JNQVRfTVBFRzEyOgorCQljYXNlIFZGT1JNQVRfTVBFRzQ6CisJCWNhc2UgVkZPUk1BVF9IMjY0OgorCQljYXNlIFZGT1JNQVRfTUpQRUc6CisJCWNhc2UgVkZPUk1BVF9SRUFMOgorCQljYXNlIFZGT1JNQVRfSlBFRzoKKwkJY2FzZSBWRk9STUFUX1ZDMToKKwkJY2FzZSBWRk9STUFUX0FWUzoKKwkJY2FzZSBWRk9STUFUX1lVVjoKKwkJY2FzZSBWRk9STUFUX0gyNjRNVkM6CisJCWNhc2UgVkZPUk1BVF9IMjY0XzRLMks6CisJCWNhc2UgVkZPUk1BVF9IMjY0X0VOQzoKKwkJY2FzZSBWRk9STUFUX0pQRUdfRU5DOgorCQkJdHlwZSA9IENPUkVfTUFTS19WREVDXzE7CisJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQl0eXBlID0gLTE7CisJfQorCisJcmV0dXJuIHR5cGU7Cit9CisKKworc3RhdGljIHZvaWQgdmRlY19zYXZlX2FjdGl2ZV9odyhzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCWludCB0eXBlOworCisJdHlwZSA9IHZkZWNfZ2V0X2h3X3R5cGUodmRlYy0+cG9ydC0+dmZvcm1hdCk7CisKKwlpZiAodHlwZSA9PSBDT1JFX01BU0tfSEVWQykgeworCQl2ZGVjX2NvcmUtPmFjdGl2ZV9oZXZjID0gdmRlYzsKKwl9IGVsc2UgaWYgKHR5cGUgPT0gQ09SRV9NQVNLX1ZERUNfMSkgeworCQl2ZGVjX2NvcmUtPmFjdGl2ZV92ZGVjID0gdmRlYzsKKwl9IGVsc2UgeworCQlwcl9pbmZvKCJzYXZlX2FjdGl2ZV9mdyB3cm9uZ1xuIik7CisJfQorfQorCitzdGF0aWMgdm9pZCB2ZGVjX3VwZGF0ZV9idWZmX3N0YXR1cyh2b2lkKQoreworCXN0cnVjdCB2ZGVjX2NvcmVfcyAqY29yZSA9IHZkZWNfY29yZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB2ZGVjX3MgKnZkZWM7CisKKwlmbGFncyA9IHZkZWNfaW5wdXRidWZmX2xvY2soY29yZSk7CisJY29yZS0+YnVmZl9mbGFnID0gMDsKKwljb3JlLT5zdHJlYW1fYnVmZl9mbGFnID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZkZWMsICZjb3JlLT5jb25uZWN0ZWRfdmRlY19saXN0LCBsaXN0KSB7CisJCXN0cnVjdCB2ZGVjX2lucHV0X3MgKmlucHV0ID0gJnZkZWMtPmlucHV0OworCQlpZiAoaW5wdXRfZnJhbWVfYmFzZWQoaW5wdXQpKSB7CisJCQlpZiAoaW5wdXQtPmhhdmVfZnJhbWVfbnVtIHx8IGlucHV0LT5lb3MpCisJCQkJY29yZS0+YnVmZl9mbGFnIHw9IHZkZWMtPmNvcmVfbWFzazsKKwkJfSBlbHNlIGlmIChpbnB1dF9zdHJlYW1fYmFzZWQoaW5wdXQpKSB7CisJCQljb3JlLT5zdHJlYW1fYnVmZl9mbGFnIHw9IHZkZWMtPmNvcmVfbWFzazsKKwkJfQorCQkvKiBzbGF2ZSBlbCBwcmVfZGVjb2RlX2xldmVsIHdwIHVwZGF0ZSAqLworCQlpZiAoKGlzX3N1cHBvcnRfbm9fcGFyc2VyKCkpICYmICh2ZGVjLT5zbGF2ZSkpIHsKKwkJCVNUQlVGX1dSSVRFKCZ2ZGVjLT5zbGF2ZS0+dmJ1Ziwgc2V0X3dwLAorCQkJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCkpOworCQl9CisJfQorCXZkZWNfaW5wdXRidWZmX3VubG9jayhjb3JlLCBmbGFncyk7Cit9CisKKyNpZiAwCit2b2lkIHZkZWNfdXBkYXRlX3N0cmVhbWJ1ZmZfc3RhdHVzKHZvaWQpCit7CisJc3RydWN0IHZkZWNfY29yZV9zICpjb3JlID0gdmRlY19jb3JlOworCXN0cnVjdCB2ZGVjX3MgKnZkZWM7CisKKwkvKiBjaGVjayBzdHJlYW1pbmcgcHJlcGFyZSBsZXZlbCB0aHJlc2hvbGQgaWYgbm90IEVPUyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkodmRlYywgJmNvcmUtPmNvbm5lY3RlZF92ZGVjX2xpc3QsIGxpc3QpIHsKKwkJc3RydWN0IHZkZWNfaW5wdXRfcyAqaW5wdXQgPSAmdmRlYy0+aW5wdXQ7CisJCWlmIChpbnB1dCAmJiBpbnB1dF9zdHJlYW1fYmFzZWQoaW5wdXQpICYmICFpbnB1dC0+ZW9zICYmCisJCQkodmRlYy0+bmVlZF9tb3JlX2RhdGEgJiBWREVDX05FRURfTU9SRV9EQVRBKSkgeworCQkJdTMyIHJwLCB3cCwgbGV2ZWw7CisKKwkJCXJwID0gU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3JwKTsKKwkJCXdwID0gU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3dwKTsKKwkJCWlmICh3cCA8IHJwKQorCQkJCWxldmVsID0gaW5wdXQtPnNpemUgKyB3cCAtIHJwOworCQkJZWxzZQorCQkJCWxldmVsID0gd3AgLSBycDsKKwkJCWlmICgobGV2ZWwgPCBpbnB1dC0+cHJlcGFyZV9sZXZlbCkgJiYKKwkJCQkocHRzX2dldF9yZWNfbnVtKFBUU19UWVBFX1ZJREVPLAorCQkJCQl2ZGVjLT5pbnB1dC50b3RhbF9yZF9jb3VudCkgPCAyKSkgeworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChsZXZlbCA+IGlucHV0LT5wcmVwYXJlX2xldmVsKSB7CisJCQkJdmRlYy0+bmVlZF9tb3JlX2RhdGEgJj0gflZERUNfTkVFRF9NT1JFX0RBVEE7CisJCQkJaWYgKGRlYnVnICYgOCkKKwkJCQkJcHJfaW5mbygidmRlY19mbHVzaF9zdHJlYW1idWZmX3N0YXR1cyB1cFxuIik7CisJCQkJdmRlY191cCh2ZGVjKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3VwZGF0ZV9zdHJlYW1idWZmX3N0YXR1cyk7CisjZW5kaWYKKworaW50IHZkZWNfc3RhdHVzKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHN0cnVjdCB2ZGVjX2luZm8gKnZzdGF0dXMpCit7CisJaWYgKHZkZWMgJiYgdmRlYy0+ZGVjX3N0YXR1cyAmJgorCQkoKHZkZWMtPnN0YXR1cyA9PSBWREVDX1NUQVRVU19DT05ORUNURUQgfHwKKwkJdmRlYy0+c3RhdHVzID09IFZERUNfU1RBVFVTX0FDVElWRSkpKQorCQlyZXR1cm4gdmRlYy0+ZGVjX3N0YXR1cyh2ZGVjLCB2c3RhdHVzKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3N0YXR1cyk7CisKK2ludCB2ZGVjX3NldF90cmlja21vZGUoc3RydWN0IHZkZWNfcyAqdmRlYywgdW5zaWduZWQgbG9uZyB0cmlja21vZGUpCit7CisJaW50IHI7CisKKwlpZiAodmRlYy0+c2V0X3RyaWNrbW9kZSkgeworCQlyID0gdmRlYy0+c2V0X3RyaWNrbW9kZSh2ZGVjLCB0cmlja21vZGUpOworCisJCWlmICgociA9PSAwKSAmJiAodmRlYy0+c2xhdmUpICYmICh2ZGVjLT5zbGF2ZS0+c2V0X3RyaWNrbW9kZSkpCisJCQlyID0gdmRlYy0+c2xhdmUtPnNldF90cmlja21vZGUodmRlYy0+c2xhdmUsCisJCQkJdHJpY2ttb2RlKTsKKwkJcmV0dXJuIHI7CisJfQorCisJcmV0dXJuIC0xOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3NldF90cmlja21vZGUpOworCitpbnQgdmRlY19zZXRfaXNyZXNldChzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgaXNyZXNldCkKK3sKKwl2ZGVjLT5pc19yZXNldCA9IGlzcmVzZXQ7CisJcHJfaW5mbygiaXNfcmVzZXQ9JWRcbiIsIGlzcmVzZXQpOworCWlmICh2ZGVjLT5zZXRfaXNyZXNldCkKKwkJcmV0dXJuIHZkZWMtPnNldF9pc3Jlc2V0KHZkZWMsIGlzcmVzZXQpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3NldF9pc3Jlc2V0KTsKKworaW50IHZkZWNfc2V0X2R2X21ldGF3aXRoZWwoc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGlzZHZtZXRhd2l0aGVsKQoreworCXZkZWMtPmRvbGJ5X21ldGFfd2l0aF9lbCA9IGlzZHZtZXRhd2l0aGVsOworCXByX2luZm8oImlzZHZtZXRhd2l0aGVsPSVkXG4iLCBpc2R2bWV0YXdpdGhlbCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfc2V0X2R2X21ldGF3aXRoZWwpOworCit2b2lkIHZkZWNfc2V0X25vX3Bvd2VyZG93bihpbnQgZmxhZykKK3sKKwlub19wb3dlcmRvd24gPSBmbGFnOworCXByX2luZm8oIm5vX3Bvd2VyZG93bj0lZFxuIiwgbm9fcG93ZXJkb3duKTsKKwlyZXR1cm47Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfc2V0X25vX3Bvd2VyZG93bik7CisKK3ZvaWQgIHZkZWNfY291bnRfaW5mbyhzdHJ1Y3QgdmRlY19pbmZvICp2cywgdW5zaWduZWQgaW50IGVyciwKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCWlmIChlcnIpCisJCXZzLT5lcnJvcl9mcmFtZV9jb3VudCsrOworCWlmIChvZmZzZXQpIHsKKwkJaWYgKDAgPT0gdnMtPmZyYW1lX2NvdW50KSB7CisJCQl2cy0+b2Zmc2V0ID0gMDsKKwkJCXZzLT5zYW1wX2NudCA9IDA7CisJCX0KKwkJdnMtPmZyYW1lX2RhdGEgPSBvZmZzZXQgPiB2cy0+dG90YWxfZGF0YSA/CisJCQlvZmZzZXQgLSB2cy0+dG90YWxfZGF0YSA6IHZzLT50b3RhbF9kYXRhIC0gb2Zmc2V0OworCQl2cy0+dG90YWxfZGF0YSA9IG9mZnNldDsKKwkJaWYgKHZzLT5zYW1wX2NudCA8IDk2MDAwICogMikgeyAvKiAycyAqLworCQkJaWYgKDAgPT0gdnMtPnNhbXBfY250KQorCQkJCXZzLT5vZmZzZXQgPSBvZmZzZXQ7CisJCQl2cy0+c2FtcF9jbnQgKz0gdnMtPmZyYW1lX2R1cjsKKwkJfSBlbHNlIHsKKwkJCXZzLT5iaXRfcmF0ZSA9IChvZmZzZXQgLSB2cy0+b2Zmc2V0KSAvIDI7CisJCQkvKnByX2luZm8oImJpdHJhdGUgOiAldVxuIix2cy0+Yml0X3JhdGUpOyovCisJCQl2cy0+c2FtcF9jbnQgPSAwOworCQl9CisJCXZzLT5mcmFtZV9jb3VudCsrOworCX0KKwkvKnByX2luZm8oInNpemUgOiAldSwgb2Zmc2V0IDogJXUsIGR1ciA6ICV1LCBjbnQgOiAldVxuIiwKKwkJdnMtPm9mZnNldCxvZmZzZXQsdnMtPmZyYW1lX2R1cix2cy0+c2FtcF9jbnQpOyovCisJcmV0dXJuOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX2NvdW50X2luZm8pOworaW50IHZkZWNfaXNfc3VwcG9ydF80ayh2b2lkKQoreworCXJldHVybiAoKCFpc19tZXNvbl9neGxfcGFja2FnZV84MDVYKCkpICYmCisJCQkoIWlzX2NwdV9zNF9zODA1eDIoKSkgJiYKKwkJCShnZXRfY3B1X21ham9yX2lkKCkgIT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1RCkpOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX2lzX3N1cHBvcnRfNGspOworCisvKgorICogY2xrX2NvbmZpZzoKKyAqMDpkZWZhdWx0CisgKjE6bm8gZ3AwX3BsbDsKKyAqMjphbHdheXMgdXNlZCBncDBfcGxsOworICo+PTEwOmZpeGVkIG4gTSBjbGs7CisgKj09IDEwMCAsIDEwME0gY2xrczsKKyAqLwordW5zaWduZWQgaW50IGdldF92ZGVjX2Nsa19jb25maWdfc2V0dGluZ3Modm9pZCkKK3sKKwlyZXR1cm4gY2xrX2NvbmZpZzsKK30KK3ZvaWQgdXBkYXRlX3ZkZWNfY2xrX2NvbmZpZ19zZXR0aW5ncyh1bnNpZ25lZCBpbnQgY29uZmlnKQoreworCWNsa19jb25maWcgPSBjb25maWc7Cit9CitFWFBPUlRfU1lNQk9MKHVwZGF0ZV92ZGVjX2Nsa19jb25maWdfc2V0dGluZ3MpOworCitzdHJ1Y3QgZGV2aWNlICpnZXRfY29kZWNfY21hX2RldmljZSh2b2lkKQoreworCXJldHVybiB2ZGVjX2NvcmUtPmNtYV9kZXY7Cit9CisKK2ludCB2ZGVjX2dldF9jb3JlX25yKHZvaWQpCit7CisJcmV0dXJuIChpbnQpYXRvbWljX3JlYWQoJnZkZWNfY29yZS0+dmRlY19ucik7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfZ2V0X2NvcmVfbnIpOworCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfTVVMVElfREVDCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZkZWNfZGV2aWNlX25hbWVbXSA9IHsKKwkiYW12ZGVjX21wZWcxMiIsICAgICAiYW1tdmRlY19tcGVnMTIiLAorCSJhbXZkZWNfbXBlZzQiLCAgICAgICJhbW12ZGVjX21wZWc0IiwKKwkiYW12ZGVjX2gyNjQiLCAgICAgICAiYW1tdmRlY19oMjY0IiwKKwkiYW12ZGVjX21qcGVnIiwgICAgICAiYW1tdmRlY19tanBlZyIsCisJImFtdmRlY19yZWFsIiwgICAgICAgImFtbXZkZWNfcmVhbCIsCisJImFtanBlZ2RlYyIsICAgICAgICAgImFtbWpwZWdkZWMiLAorCSJhbXZkZWNfdmMxIiwgICAgICAgICJhbW12ZGVjX3ZjMSIsCisJImFtdmRlY19hdnMiLCAgICAgICAgImFtbXZkZWNfYXZzIiwKKwkiYW12ZGVjX3l1diIsICAgICAgICAiYW1tdmRlY195dXYiLAorCSJhbXZkZWNfaDI2NG12YyIsICAgICJhbW12ZGVjX2gyNjRtdmMiLAorCSJhbXZkZWNfaDI2NF80azJrIiwgICJhbW12ZGVjX2gyNjRfNGsyayIsCisJImFtdmRlY19oMjY1IiwgICAgICAgImFtbXZkZWNfaDI2NSIsCisJImFtdmVuY19hdmMiLCAgICAgICAgImFtdmVuY19hdmMiLAorCSJqcGVnZW5jIiwgICAgICAgICAgICJqcGVnZW5jIiwKKwkiYW12ZGVjX3ZwOSIsICAgICAgICAiYW1tdmRlY192cDkiLAorCSJhbXZkZWNfYXZzMiIsICAgICAgICJhbW12ZGVjX2F2czIiLAorCSJhbXZkZWNfYXYxIiwgICAgICAgICJhbW12ZGVjX2F2MSIsCit9OworCisKKyNlbHNlCisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmRlY19kZXZpY2VfbmFtZVtdID0geworCSJhbXZkZWNfbXBlZzEyIiwKKwkiYW12ZGVjX21wZWc0IiwKKwkiYW12ZGVjX2gyNjQiLAorCSJhbXZkZWNfbWpwZWciLAorCSJhbXZkZWNfcmVhbCIsCisJImFtanBlZ2RlYyIsCisJImFtdmRlY192YzEiLAorCSJhbXZkZWNfYXZzIiwKKwkiYW12ZGVjX3l1diIsCisJImFtdmRlY19oMjY0bXZjIiwKKwkiYW12ZGVjX2gyNjRfNGsyayIsCisJImFtdmRlY19oMjY1IiwKKwkiYW12ZW5jX2F2YyIsCisJImpwZWdlbmMiLAorCSJhbXZkZWNfdnA5IiwKKwkiYW12ZGVjX2F2czIiLAorCSJhbXZkZWNfYXYxIgorfTsKKworI2VuZGlmCisKKy8qCisgKiBPbmx5IHN1cHBvcnQgdGltZSBzbGljZWQgZGVjb2RpbmcgZm9yIGZyYW1lIGJhc2VkIGlucHV0LAorICogc28gbGVnYWN5IGRlY29kZXIgY2FuIGV4aXN0IHdpdGggdGltZSBzbGljZWQgZGVjb2Rlci4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmdldF9kZXZfbmFtZShib29sIHVzZV9sZWdhY3lfdmRlYywgaW50IGZvcm1hdCkKK3sKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9NVUxUSV9ERUMKKwlpZiAodXNlX2xlZ2FjeV92ZGVjICYmIChkZWJ1Z2ZsYWdzICYgMHg4KSA9PSAwKQorCQlyZXR1cm4gdmRlY19kZXZpY2VfbmFtZVtmb3JtYXQgKiAyXTsKKwllbHNlCisJCXJldHVybiB2ZGVjX2RldmljZV9uYW1lW2Zvcm1hdCAqIDIgKyAxXTsKKyNlbHNlCisJcmV0dXJuIHZkZWNfZGV2aWNlX25hbWVbZm9ybWF0XTsKKyNlbmRpZgorfQorCisjaWZkZWYgVkRFQ19ERUJVR19TVVBQT1JUCitzdGF0aWMgdTY0IGdldF9jdXJyZW50X2Nsayh2b2lkKQoreworCS8qc3RydWN0IHRpbWVzcGVjIHh0aW1lID0gY3VycmVudF9rZXJuZWxfdGltZSgpOworCXU2NCB1c2VjID0geHRpbWUudHZfc2VjICogMTAwMDAwMDsKKwl1c2VjICs9IHh0aW1lLnR2X25zZWMgLyAxMDAwOworCSovCisJdTY0IHVzZWMgPSBzY2hlZF9jbG9jaygpOworCXJldHVybiB1c2VjOworfQorCitzdGF0aWMgdm9pZCBpbmNfcHJvZmlfY291bnQodW5zaWduZWQgbG9uZyBtYXNrLCB1MzIgKmNvdW50KQoreworCWVudW0gdmRlY190eXBlX2UgdHlwZTsKKworCWZvciAodHlwZSA9IFZERUNfMTsgdHlwZSA8IFZERUNfTUFYOyB0eXBlKyspIHsKKwkJaWYgKG1hc2sgJiAoMSA8PCB0eXBlKSkKKwkJCWNvdW50W3R5cGVdKys7CisJfQorfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfcHJvZmlfY2xrX3J1bihzdHJ1Y3QgdmRlY19zICp2ZGVjLAorCXVuc2lnbmVkIGxvbmcgbWFzaywgdTY0IGNsaykKK3sKKwllbnVtIHZkZWNfdHlwZV9lIHR5cGU7CisKKwlmb3IgKHR5cGUgPSBWREVDXzE7IHR5cGUgPCBWREVDX01BWDsgdHlwZSsrKSB7CisJCWlmIChtYXNrICYgKDEgPDwgdHlwZSkpIHsKKwkJCXZkZWMtPnN0YXJ0X3J1bl9jbGtbdHlwZV0gPSBjbGs7CisJCQlpZiAodmRlYy0+cHJvZmlsZV9zdGFydF9jbGtbdHlwZV0gPT0gMCkKKwkJCQl2ZGVjLT5wcm9maWxlX3N0YXJ0X2Nsa1t0eXBlXSA9IGNsazsKKwkJCXZkZWMtPnRvdGFsX2Nsa1t0eXBlXSA9IGNsaworCQkJCS0gdmRlYy0+cHJvZmlsZV9zdGFydF9jbGtbdHlwZV07CisJCQkvKnByX2luZm8oInNldCBzdGFydF9ydW5fY2xrICVsZFxuIiwKKwkJCXZkZWMtPnN0YXJ0X3J1bl9jbGspOyovCisKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgdXBkYXRlX3Byb2ZpX2Nsa19zdG9wKHN0cnVjdCB2ZGVjX3MgKnZkZWMsCisJdW5zaWduZWQgbG9uZyBtYXNrLCB1NjQgY2xrKQoreworCWVudW0gdmRlY190eXBlX2UgdHlwZTsKKworCWZvciAodHlwZSA9IFZERUNfMTsgdHlwZSA8IFZERUNfTUFYOyB0eXBlKyspIHsKKwkJaWYgKG1hc2sgJiAoMSA8PCB0eXBlKSkgeworCQkJaWYgKHZkZWMtPnN0YXJ0X3J1bl9jbGtbdHlwZV0gPT0gMCkKKwkJCQlwcl9pbmZvKCJlcnJvciwgc3RhcnRfcnVuX2Nsa1slZF0gbm90IHNldFxuIiwgdHlwZSk7CisKKwkJCS8qcHJfaW5mbygidXBkYXRlIHJ1bl9jbGsgdHlwZSAlZCwgJWxkLCAlbGQsICVsZFxuIiwKKwkJCQl0eXBlLAorCQkJCWNsaywKKwkJCQl2ZGVjLT5zdGFydF9ydW5fY2xrW3R5cGVdLAorCQkJCXZkZWMtPnJ1bl9jbGtbdHlwZV0pOyovCisJCQl2ZGVjLT5ydW5fY2xrW3R5cGVdICs9CisJCQkJKGNsayAtIHZkZWMtPnN0YXJ0X3J1bl9jbGtbdHlwZV0pOworCQl9CisJfQorfQorCisjZW5kaWYKKworaW50IHZkZWNfc2V0X2RlY2luZm8oc3RydWN0IHZkZWNfcyAqdmRlYywgc3RydWN0IGRlY19zeXNpbmZvICpwKQoreworCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZ2ZGVjLT5zeXNfaW5mb19zdG9yZSwgKHZvaWQgKilwLAorCQlzaXplb2Yoc3RydWN0IGRlY19zeXNpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogZm9yY2Ugc3dpdGNoIHRvIG11bHQgaW5zdGFuY2UgaWYgc3VwcG9ydHMgdGhpcyBwcm9maWxlLiAqLworCWlmICgodmRlYy0+dHlwZSA9PSBWREVDX1RZUEVfU0lOR0xFKSAmJgorCQkhZGlzYWJsZV9zd2l0Y2hfc2luZ2xlX3RvX211bHQpIHsKKwkJY29uc3QgY2hhciAqc3RyID0gTlVMTDsKKwkJY2hhciBmbXRbMTZdID0gezB9OworCisJCXN0ciA9IHN0cmNocihnZXRfZGV2X25hbWUoZmFsc2UsIHZkZWMtPmZvcm1hdCksICdfJyk7CisJCWlmICghc3RyKQorCQkJcmV0dXJuIC0xOworCisJCXNwcmludGYoZm10LCAibSVzIiwgKytzdHIpOworCQlpZiAoaXNfc3VwcG9ydF9wcm9maWxlKGZtdCkgJiYKKwkJCXZkZWMtPnN5c19pbmZvLT5mb3JtYXQgIT0gVklERU9fREVDX0ZPUk1BVF9IMjYzICYmCisJCQl2ZGVjLT5mb3JtYXQgIT0gVkZPUk1BVF9BVjEpCisJCQl2ZGVjLT50eXBlID0gVkRFQ19UWVBFX1NUUkVBTV9QQVJTRVI7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfc2V0X2RlY2luZm8pOworCisvKiBjb25zdHJ1Y3QgdmRlYyBzdHJjdHVyZSAqLworc3RydWN0IHZkZWNfcyAqdmRlY19jcmVhdGUoc3RydWN0IHN0cmVhbV9wb3J0X3MgKnBvcnQsCisJCQlzdHJ1Y3QgdmRlY19zICptYXN0ZXIpCit7CisJc3RydWN0IHZkZWNfcyAqdmRlYzsKKwlpbnQgdHlwZSA9IFZERUNfVFlQRV9TSU5HTEU7CisJaW50IGlkOworCWlmIChpc19tdWx0X2luYyhwb3J0LT50eXBlKSkKKwkJdHlwZSA9IChwb3J0LT50eXBlICYgUE9SVF9UWVBFX0ZSQU1FKSA/CisJCQlWREVDX1RZUEVfRlJBTUVfQkxPQ0sgOgorCQkJVkRFQ19UWVBFX1NUUkVBTV9QQVJTRVI7CisKKwlpZCA9IGlkYV9zaW1wbGVfZ2V0KCZ2ZGVjX2NvcmUtPmlkYSwKKwkJCTAsIE1BWF9JTlNUQU5DRV9NVU4sIEdGUF9LRVJORUwpOworCWlmIChpZCA8IDApIHsKKwkJcHJfaW5mbygidmRlY19jcmVhdGUgcmVxdWVzdCBpZCBmYWlsZWQhcmV0ID0lZFxuIiwgaWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJdmRlYyA9IHZ6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZGVjX3MpKTsKKworCS8qIFRCRCAqLworCWlmICh2ZGVjKSB7CisJCXZkZWMtPm1hZ2ljID0gMHg0MzQ1NDQ1NjsKKwkJdmRlYy0+aWQgPSAtMTsKKwkJdmRlYy0+dHlwZSA9IHR5cGU7CisJCXZkZWMtPnBvcnQgPSBwb3J0OworCQl2ZGVjLT5zeXNfaW5mbyA9ICZ2ZGVjLT5zeXNfaW5mb19zdG9yZTsKKworCQlJTklUX0xJU1RfSEVBRCgmdmRlYy0+bGlzdCk7CisKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmdmRlYy0+aWRsZV93YWl0KTsKKworCQlhdG9taWNfaW5jKCZ2ZGVjX2NvcmUtPnZkZWNfbnIpOworI2lmZGVmIENPTkZJR19BTUxPR0lDX1Y0TF9WSURFTzMKKwkJdjRsdmlkZW9fZGVjX2NvdW50X2luY3JlYXNlKCk7CisjZW5kaWYKKwkJdmRlYy0+aWQgPSBpZDsKKwkJdmRlYy0+dmlkZW9faWQgPSAweGZmZmZmZmZmOworCQl2ZGVjX2lucHV0X2luaXQoJnZkZWMtPmlucHV0LCB2ZGVjKTsKKwkJdmRlYy0+aW5wdXQudmRlY19pc19pbnB1dF9mcmFtZV9lbXB0eSA9IHZkZWNfaXNfaW5wdXRfZnJhbWVfZW1wdHk7CisJCXZkZWMtPmlucHV0LnZkZWNfdXAgPSB2ZGVjX3VwOworCQlpZiAobWFzdGVyKSB7CisJCQl2ZGVjLT5tYXN0ZXIgPSBtYXN0ZXI7CisJCQltYXN0ZXItPnNsYXZlID0gdmRlYzsKKwkJCW1hc3Rlci0+c2NoZWQgPSAxOworCQl9CisJCWlmIChlbmFibGVfbXZkZWNfaW5mbykgeworCQkJdmRlYy0+bXZmcm0gPSAoc3RydWN0IHZkZWNfZnJhbWVzX3MgKikKKwkJCQl2emFsbG9jKHNpemVvZihzdHJ1Y3QgdmRlY19mcmFtZXNfcykpOworCQkJaWYgKCF2ZGVjLT5tdmZybSkKKwkJCQlwcl9lcnIoInZ6YWxsb2M6IHZkZWNfZnJhbWVzX3MgZmFpbGVkXG4iKTsKKwkJfQorCX0KKworCXByX2RlYnVnKCJ2ZGVjX2NyZWF0ZSBpbnN0YW5jZSAlcCwgdG90YWwgJWQsIFBNOiAlc1xuIiwgdmRlYywKKwkJYXRvbWljX3JlYWQoJnZkZWNfY29yZS0+dmRlY19uciksCisJCWdldF9wbV9uYW1lKHZkZWNfY29yZS0+cG0tPnBtX3R5cGUpKTsKKworCS8vdHJhY2VfdmRlY19jcmVhdGUodmRlYyk7IC8qREVCVUdfVE1QKi8KKworCXJldHVybiB2ZGVjOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX2NyZWF0ZSk7CisKK2ludCB2ZGVjX3NldF9mb3JtYXQoc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGZvcm1hdCkKK3sKKwl2ZGVjLT5mb3JtYXQgPSBmb3JtYXQ7CisJdmRlYy0+cG9ydF9mbGFnIHw9IFBPUlRfRkxBR19WRk9STUFUOworCisJaWYgKHZkZWMtPnNsYXZlKSB7CisJCXZkZWMtPnNsYXZlLT5mb3JtYXQgPSBmb3JtYXQ7CisJCXZkZWMtPnNsYXZlLT5wb3J0X2ZsYWcgfD0gUE9SVF9GTEFHX1ZGT1JNQVQ7CisJfQorCisJLy90cmFjZV92ZGVjX3NldF9mb3JtYXQodmRlYywgZm9ybWF0KTsvKkRFQlVHX1RNUCovCisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19zZXRfZm9ybWF0KTsKKworaW50IHZkZWNfc2V0X3B0cyhzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1MzIgcHRzKQoreworCXZkZWMtPnB0cyA9IHB0czsKKwl2ZGVjLT5wdHM2NCA9IGRpdjY0X3U2NCgodTY0KXB0cyAqIDEwMCwgOSk7CisJdmRlYy0+cHRzX3ZhbGlkID0gdHJ1ZTsKKwkvL3RyYWNlX3ZkZWNfc2V0X3B0cyh2ZGVjLCAodTY0KXB0cyk7LypERUJVR19UTVAqLworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3NldF9wdHMpOworCit2b2lkIHZkZWNfc2V0X3RpbWVzdGFtcChzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1NjQgdGltZXN0YW1wKQoreworCXZkZWMtPnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwl2ZGVjLT50aW1lc3RhbXBfdmFsaWQgPSB0cnVlOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3NldF90aW1lc3RhbXApOworCit2b2lkIHZkZWNfc2V0X21ldGFkYXRhKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHVsb25nIG1ldGFfcHRyKQoreworCWNoYXIgKnRtcF9idWYgPSBOVUxMOworCXUzMiBzaXplID0gMDsKKworCWlmICghbWV0YV9wdHIpCisJCXJldHVybjsKKworCXRtcF9idWYgPSB2bWFsbG9jKE1FVEFfREFUQV9TSVpFICsgNCk7CisJaWYgKCF0bXBfYnVmKSB7CisJCXByX2VycigiJXM6dm1hbGxvYyAyNTYrNCBmYWlsXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJbWVtY3B5KHRtcF9idWYsICh2b2lkICopbWV0YV9wdHIsIE1FVEFfREFUQV9TSVpFICsgNCk7CisKKwlzaXplID0gdG1wX2J1ZlswXSArICh0bXBfYnVmWzFdIDw8IDgpICsKKwkJKHRtcF9idWZbMl0gPDwgMTYpICsgKHRtcF9idWZbM10gPDwgMjQpOworCisJaWYgKChzaXplID4gMCkgJiYgKHNpemUgPD0gTUVUQV9EQVRBX1NJWkUpKSB7CisJCW1lbWNweSh2ZGVjLT5oZHIxMHBfZGF0YV9idWYsIHRtcF9idWYgKyA0LCBzaXplKTsKKwkJdmRlYy0+aGRyMTBwX2RhdGFfc2l6ZSA9IHNpemU7CisJCXZkZWMtPmhkcjEwcF9kYXRhX3ZhbGlkID0gdHJ1ZTsKKwl9CisKKwl2ZnJlZSh0bXBfYnVmKTsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19zZXRfbWV0YWRhdGEpOworCitpbnQgdmRlY19zZXRfcHRzNjQoc3RydWN0IHZkZWNfcyAqdmRlYywgdTY0IHB0czY0KQoreworCXZkZWMtPnB0czY0ID0gcHRzNjQ7CisJdmRlYy0+cHRzID0gKHUzMilkaXY2NF91NjQocHRzNjQgKiA5LCAxMDApOworCXZkZWMtPnB0c192YWxpZCA9IHRydWU7CisKKwkvL3RyYWNlX3ZkZWNfc2V0X3B0czY0KHZkZWMsIHB0czY0KTsvKkRFQlVHX1RNUCovCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfc2V0X3B0czY0KTsKKworaW50IHZkZWNfZ2V0X3N0YXR1cyhzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXJldHVybiB2ZGVjLT5zdGF0dXM7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfZ2V0X3N0YXR1cyk7CisKK2ludCB2ZGVjX2dldF9mcmFtZV9udW0oc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlyZXR1cm4gdmRlYy0+aW5wdXQuaGF2ZV9mcmFtZV9udW07Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfZ2V0X2ZyYW1lX251bSk7CisKK3ZvaWQgdmRlY19zZXRfc3RhdHVzKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBzdGF0dXMpCit7CisJLy90cmFjZV92ZGVjX3NldF9zdGF0dXModmRlYywgc3RhdHVzKTsvKkRFQlVHX1RNUCovCisJdmRlYy0+c3RhdHVzID0gc3RhdHVzOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3NldF9zdGF0dXMpOworCit2b2lkIHZkZWNfc2V0X25leHRfc3RhdHVzKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBzdGF0dXMpCit7CisJLy90cmFjZV92ZGVjX3NldF9uZXh0X3N0YXR1cyh2ZGVjLCBzdGF0dXMpOy8qREVCVUdfVE1QKi8KKwl2ZGVjLT5uZXh0X3N0YXR1cyA9IHN0YXR1czsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19zZXRfbmV4dF9zdGF0dXMpOworCitpbnQgdmRlY19zZXRfdmlkZW9fcGF0aChzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgdmlkZW9fcGF0aCkKK3sKKwl2ZGVjLT5mcmFtZV9iYXNlX3ZpZGVvX3BhdGggPSB2aWRlb19wYXRoOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3NldF92aWRlb19wYXRoKTsKKworaW50IHZkZWNfc2V0X3JlY2VpdmVfaWQoc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IHJlY2VpdmVfaWQpCit7CisJdmRlYy0+dmZfcmVjZWl2ZXJfaW5zdCA9IHJlY2VpdmVfaWQ7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfc2V0X3JlY2VpdmVfaWQpOworCisvKiBhZGQgZnJhbWUgZGF0YSB0byBpbnB1dCBjaGFpbiAqLworaW50IHZkZWNfd3JpdGVfdmZyYW1lKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiB2ZGVjX2lucHV0X2FkZF9mcmFtZSgmdmRlYy0+aW5wdXQsIGJ1ZiwgY291bnQpOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3dyaXRlX3ZmcmFtZSk7CisKK2ludCB2ZGVjX3dyaXRlX3ZmcmFtZV93aXRoX2RtYShzdHJ1Y3QgdmRlY19zICp2ZGVjLAorCXVsb25nIGFkZHIsIHNpemVfdCBjb3VudCwgdTMyIGhhbmRsZSwgY2h1bmtfZnJlZSBmcmVlLCB2b2lkKiBwcml2KQoreworCXJldHVybiB2ZGVjX2lucHV0X2FkZF9mcmFtZV93aXRoX2RtYSgmdmRlYy0+aW5wdXQsCisJCWFkZHIsIGNvdW50LCBoYW5kbGUsIGZyZWUsIHByaXYpOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3dyaXRlX3ZmcmFtZV93aXRoX2RtYSk7CisKKy8qIGFkZCBhIHdvcmsgcXVldWUgdGhyZWFkIGZvciB2ZGVjKi8KK3ZvaWQgdmRlY19zY2hlZHVsZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlpZiAodmRlY19jb3JlLT52ZGVjX2NvcmVfd3EpCisJCXF1ZXVlX3dvcmsodmRlY19jb3JlLT52ZGVjX2NvcmVfd3EsIHdvcmspOworCWVsc2UKKwkJc2NoZWR1bGVfd29yayh3b3JrKTsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19zY2hlZHVsZV93b3JrKTsKKworc3RhdGljIHN0cnVjdCB2ZGVjX3MgKnZkZWNfZ2V0X2Fzc29jaWF0ZShzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCWlmICh2ZGVjLT5tYXN0ZXIpCisJCXJldHVybiB2ZGVjLT5tYXN0ZXI7CisJZWxzZSBpZiAodmRlYy0+c2xhdmUpCisJCXJldHVybiB2ZGVjLT5zbGF2ZTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgdmRlY19zeW5jX2lucHV0X3JlYWQoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlpZiAoIXZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpKQorCQlyZXR1cm47CisKKwlpZiAodmRlY19kdWFsKHZkZWMpKSB7CisJCXUzMiBtZSwgb3RoZXI7CisJCWlmICh2ZGVjLT5pbnB1dC50YXJnZXQgPT0gVkRFQ19JTlBVVF9UQVJHRVRfVkxEKSB7CisJCQltZSA9IFJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19XUkFQX0NPVU5UKTsKKwkJCW90aGVyID0KKwkJCQl2ZGVjX2dldF9hc3NvY2lhdGUodmRlYyktPmlucHV0LnN0cmVhbV9jb29raWU7CisJCQlpZiAobWUgPiBvdGhlcikKKwkJCQlyZXR1cm47CisJCQllbHNlIGlmIChtZSA9PSBvdGhlcikgeworCQkJCW1lID0gUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKTsKKwkJCQlvdGhlciA9CisJCQkJdmRlY19nZXRfYXNzb2NpYXRlKHZkZWMpLT5pbnB1dC5zd2FwX3JwOworCQkJCWlmIChtZSA+IG90aGVyKSB7CisJCQkJCVNUQlVGX1dSSVRFKCZ2ZGVjLT52YnVmLCBzZXRfcnAsCisJCQkJCQl2ZGVjX2dldF9hc3NvY2lhdGUodmRlYyktPmlucHV0LnN3YXBfcnApOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCisJCQlTVEJVRl9XUklURSgmdmRlYy0+dmJ1Ziwgc2V0X3JwLAorCQkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCkpOworCQl9IGVsc2UgaWYgKHZkZWMtPmlucHV0LnRhcmdldCA9PSBWREVDX0lOUFVUX1RBUkdFVF9IRVZDKSB7CisJCQltZSA9IFJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpOworCQkJaWYgKCgobWUgJiAweDgwMDAwMDAwKSA9PSAwKSAmJgorCQkJCSh2ZGVjLT5pbnB1dC5zdHJlYW1pbmdfcnAgJiAweDgwMDAwMDAwKSkKKwkJCQltZSArPSAxVUxMIDw8IDMyOworCQkJb3RoZXIgPSB2ZGVjX2dldF9hc3NvY2lhdGUodmRlYyktPmlucHV0LnN0cmVhbWluZ19ycDsKKwkJCWlmIChtZSA+IG90aGVyKSB7CisJCQkJU1RCVUZfV1JJVEUoJnZkZWMtPnZidWYsIHNldF9ycCwKKwkJCQkJdmRlY19nZXRfYXNzb2NpYXRlKHZkZWMpLT5pbnB1dC5zd2FwX3JwKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCVNUQlVGX1dSSVRFKCZ2ZGVjLT52YnVmLCBzZXRfcnAsCisJCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1JEX1BUUikpOworCQl9CisJfSBlbHNlIGlmICh2ZGVjLT5pbnB1dC50YXJnZXQgPT0gVkRFQ19JTlBVVF9UQVJHRVRfVkxEKSB7CisJCVNUQlVGX1dSSVRFKCZ2ZGVjLT52YnVmLCBzZXRfcnAsCisJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApKTsKKwl9IGVsc2UgaWYgKHZkZWMtPmlucHV0LnRhcmdldCA9PSBWREVDX0lOUFVUX1RBUkdFVF9IRVZDKSB7CisJCVNUQlVGX1dSSVRFKCZ2ZGVjLT52YnVmLCBzZXRfcnAsCisJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCB2ZGVjX3N5bmNfaW5wdXRfd3JpdGUoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlpZiAoIXZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpKQorCQlyZXR1cm47CisKKwlpZiAodmRlYy0+aW5wdXQudGFyZ2V0ID09IFZERUNfSU5QVVRfVEFSR0VUX1ZMRCkgeworCQlpZiAoaXNfc3VwcG9ydF9ub19wYXJzZXIoKSkgeworCQkJaWYgKCF2ZGVjLT5tYXN0ZXIpIHsKKwkJCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX1dQLAorCQkJCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApKTsKKwkJCX0gZWxzZSB7CisJCQkJU1RCVUZfV1JJVEUoJnZkZWMtPnZidWYsIHNldF93cCwKKwkJCQkJU1RCVUZfUkVBRCgmdmRlYy0+bWFzdGVyLT52YnVmLCBnZXRfd3ApKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVdSSVRFX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1AsCisJCQkJU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3dwKSk7CisJCX0KKwl9IGVsc2UgaWYgKHZkZWMtPmlucHV0LnRhcmdldCA9PSBWREVDX0lOUFVUX1RBUkdFVF9IRVZDKSB7CisJCWlmIChpc19zdXBwb3J0X25vX3BhcnNlcigpKSB7CisJCQlpZiAoIXZkZWMtPm1hc3RlcikgeworCQkJCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fV1JfUFRSLAorCQkJCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApKTsKKwkJCX0gZWxzZSB7CisJCQkJU1RCVUZfV1JJVEUoJnZkZWMtPnZidWYsIHNldF93cCwKKwkJCQkJU1RCVUZfUkVBRCgmdmRlYy0+bWFzdGVyLT52YnVmLCBnZXRfd3ApKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fV1JfUFRSLAorCQkJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCkpOworCQl9CisJfQorfQorCit2b2lkIHZkZWNfc3RyZWFtX3NraXBfZGF0YShzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgc2tpcF9zaXplKQoreworCXUzMiBycF9zZXQ7CisJc3RydWN0IHZkZWNfaW5wdXRfcyAqaW5wdXQgPSAmdmRlYy0+aW5wdXQ7CisJdTMyIHJwID0gMCwgd3AgPSAwLCBsZXZlbDsKKworCXJwID0gU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3JwKTsKKwl3cCA9IFNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCk7CisKKwlpZiAod3AgPiBycCkKKwkJbGV2ZWwgPSB3cCAtIHJwOworCWVsc2UKKwkJbGV2ZWwgPSB3cCArIHZkZWMtPmlucHV0LnNpemUgLSBycCA7CisKKwlpZiAobGV2ZWwgPD0gc2tpcF9zaXplKSB7CisJCXByX2Vycigic2tpcCBzaXplIGlzIGVycm9yLCBidWZmZXIgbGV2ZWwgPSAweCV4LCBza2lwIHNpemUgPSAweCV4XG4iLCBsZXZlbCwgc2tpcF9zaXplKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh3cCA+PSBycCkgeworCQlycF9zZXQgPSBycCArIHNraXBfc2l6ZTsKKwl9CisJZWxzZSBpZiAoKHJwICsgc2tpcF9zaXplKSA8IChpbnB1dC0+c3RhcnQgKyBpbnB1dC0+c2l6ZSkpIHsKKwkJcnBfc2V0ID0gcnAgKyBza2lwX3NpemU7CisJfSBlbHNlIHsKKwkJcnBfc2V0ID0gcnAgKyBza2lwX3NpemUgLSBpbnB1dC0+c2l6ZTsKKwkJaW5wdXQtPnN0cmVhbV9jb29raWUrKzsKKwl9CisKKwlpZiAodmRlYy0+Zm9ybWF0ID09IFZGT1JNQVRfSDI2NCkKKwkJU0VUX1ZSRUdfTUFTSyhQT1dFUl9DVExfVkxELAorCQkJKDEgPDwgOSkpOworCisJV1JJVEVfVlJFRyhWTERfTUVNX1ZJRklGT19DT05UUk9MLCAwKTsKKworCS8qIHJlc3RvcmUgcmVhZCBzaWRlICovCisJV1JJVEVfVlJFRyhWTERfTUVNX1NXQVBfQUREUiwKKwkJaW5wdXQtPnN3YXBfcGFnZV9waHlzKTsKKwlXUklURV9WUkVHKFZMRF9NRU1fU1dBUF9DVEwsIDEpOworCisJd2hpbGUgKFJFQURfVlJFRyhWTERfTUVNX1NXQVBfQ1RMKSAmICgxPDw3KSkKKwkJOworCVdSSVRFX1ZSRUcoVkxEX01FTV9TV0FQX0NUTCwgMCk7CisKKwlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX0NVUlJfUFRSLAorCQlycF9zZXQpOworCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX0NPTlRST0wsIDEpOworCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX0NPTlRST0wsIDApOworCVNUQlVGX1dSSVRFKCZ2ZGVjLT52YnVmLCBzZXRfcnAsCisJCXJwX3NldCk7CisJV1JJVEVfVlJFRyhWTERfTUVNX1NXQVBfQUREUiwKKwkJaW5wdXQtPnN3YXBfcGFnZV9waHlzKTsKKwlXUklURV9WUkVHKFZMRF9NRU1fU1dBUF9DVEwsIDMpOworCXdoaWxlIChSRUFEX1ZSRUcoVkxEX01FTV9TV0FQX0NUTCkgJiAoMTw8NykpCisJCTsKKwlXUklURV9WUkVHKFZMRF9NRU1fU1dBUF9DVEwsIDApOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3N0cmVhbV9za2lwX2RhdGEpOworCisKKworLyoKKyAqZ2V0IG5leHQgZnJhbWUgZnJvbSBpbnB1dCBjaGFpbgorICovCisvKgorICpUSEUgVkxEX0ZJRk8gaXMgNTEyIGJ5dGVzIGFuZCBWaWRlbyBidWZmZXIgbGV2ZWwKKyAqIGVtcHR5IGludGVycnVwdCBpcyBzZXQgdG8gMHg4MCBieXRlcyB0aHJlc2hvbGQKKyAqLworI2RlZmluZSBWTERfUEFERElOR19TSVpFIDEwMjQKKyNkZWZpbmUgSEVWQ19QQURESU5HX1NJWkUgKDEwMjQqMTYpCitpbnQgdmRlY19wcmVwYXJlX2lucHV0KHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHN0cnVjdCB2ZnJhbWVfY2h1bmtfcyAqKnApCit7CisJc3RydWN0IHZkZWNfaW5wdXRfcyAqaW5wdXQgPSAmdmRlYy0+aW5wdXQ7CisJc3RydWN0IHZmcmFtZV9jaHVua19zICpjaHVuayA9IE5VTEw7CisJc3RydWN0IHZmcmFtZV9ibG9ja19saXN0X3MgKmJsb2NrID0gTlVMTDsKKwlpbnQgZHVtbXk7CisKKwkvKiBmdWxsIHJlc2V0IHRvIEhXIGlucHV0ICovCisJaWYgKGlucHV0LT50YXJnZXQgPT0gVkRFQ19JTlBVVF9UQVJHRVRfVkxEKSB7CisJCVdSSVRFX1ZSRUcoVkxEX01FTV9WSUZJRk9fQ09OVFJPTCwgMCk7CisKKwkJLyogcmVzZXQgVkxEIGZpZm8gZm9yIGFsbCB2ZGVjICovCisJCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgKDE8PDUpIHwgKDE8PDQpIHwgKDE8PDMpKTsKKwkJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAwKTsKKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA8IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TQzIpCisJCQlkdW1teSA9IFJFQURfUkVTRVRfUkVHKFJFU0VUMF9SRUdJU1RFUik7CisJCVdSSVRFX1ZSRUcoUE9XRVJfQ1RMX1ZMRCwgMSA8PCA0KTsKKwl9IGVsc2UgaWYgKGlucHV0LT50YXJnZXQgPT0gVkRFQ19JTlBVVF9UQVJHRVRfSEVWQykgeworI2lmIDAKKwkJLyptb3ZlIHRvIGRyaXZlciovCisJCWlmIChpbnB1dF9mcmFtZV9iYXNlZChpbnB1dCkpCisJCQlXUklURV9WUkVHKEhFVkNfU1RSRUFNX0NPTlRST0wsIDApOworCisJCS8qCisJCSAqIDI6IGFzc2lzdAorCQkgKiAzOiBwYXJzZXIKKwkJICogNDogcGFyc2VyX3N0YXRlCisJCSAqIDg6IGRibGsKKwkJICogMTE6bWNwdQorCQkgKiAxMjpjY3B1CisJCSAqIDEzOmRkcgorCQkgKiAxNDppcWl0CisJCSAqIDE1OmlwcAorCQkgKiAxNzpxZGN0CisJCSAqIDE4Om1wcmVkCisJCSAqIDE5OnNhbworCQkgKiAyNDpoZXZjX2FmaWZvCisJCSAqLworCQlXUklURV9WUkVHKERPU19TV19SRVNFVDMsCisJCQkoMTw8Myl8KDE8PDQpfCgxPDw4KXwoMTw8MTEpfCgxPDwxMil8KDE8PDE0KXwoMTw8MTUpfAorCQkJKDE8PDE3KXwoMTw8MTgpfCgxPDwxOSkpOworCQlXUklURV9WUkVHKERPU19TV19SRVNFVDMsIDApOworI2VuZGlmCisJfQorCisJLyoKKwkgKnNldHVwIEhXIGRlY29kZXIgaW5wdXQgYnVmZmVyIChWTEQgY29udGV4dCkKKwkgKiBiYXNlZCBvbiBpbnB1dC0+dHlwZSBhbmQgaW5wdXQtPnRhcmdldAorCSAqLworCWlmIChpbnB1dF9mcmFtZV9iYXNlZChpbnB1dCkpIHsKKwkJY2h1bmsgPSB2ZGVjX2lucHV0X25leHRfY2h1bmsoJnZkZWMtPmlucHV0KTsKKworCQlpZiAoY2h1bmsgPT0gTlVMTCkgeworCQkJKnAgPSBOVUxMOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJYmxvY2sgPSBjaHVuay0+YmxvY2s7CisKKwkJaWYgKGlucHV0LT50YXJnZXQgPT0gVkRFQ19JTlBVVF9UQVJHRVRfVkxEKSB7CisJCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX1NUQVJUX1BUUiwgYmxvY2stPnN0YXJ0KTsKKwkJCVdSSVRFX1ZSRUcoVkxEX01FTV9WSUZJRk9fRU5EX1BUUiwgYmxvY2stPnN0YXJ0ICsKKwkJCQkJYmxvY2stPnNpemUgLSA4KTsKKwkJCVdSSVRFX1ZSRUcoVkxEX01FTV9WSUZJRk9fQ1VSUl9QVFIsCisJCQkJCXJvdW5kX2Rvd24oYmxvY2stPnN0YXJ0ICsgY2h1bmstPm9mZnNldCwKKwkJCQkJCVZERUNfRklGT19BTElHTikpOworCisJCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX0NPTlRST0wsIDEpOworCQkJV1JJVEVfVlJFRyhWTERfTUVNX1ZJRklGT19DT05UUk9MLCAwKTsKKworCQkJLyogc2V0IHRvIG1hbnVhbCBtb2RlICovCisJCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX0JVRl9DTlRMLCAyKTsKKwkJCVdSSVRFX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlAsCisJCQkJCXJvdW5kX2Rvd24oYmxvY2stPnN0YXJ0ICsgY2h1bmstPm9mZnNldCwKKwkJCQkJCVZERUNfRklGT19BTElHTikpOworCQkJZHVtbXkgPSBjaHVuay0+b2Zmc2V0ICsgY2h1bmstPnNpemUgKworCQkJCVZMRF9QQURESU5HX1NJWkU7CisJCQlpZiAoZHVtbXkgPj0gYmxvY2stPnNpemUpCisJCQkJZHVtbXkgLT0gYmxvY2stPnNpemU7CisJCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX1dQLAorCQkJCXJvdW5kX2Rvd24oYmxvY2stPnN0YXJ0ICsgZHVtbXksCisJCQkJCVZERUNfRklGT19BTElHTikpOworCisJCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX0JVRl9DTlRMLCAzKTsKKwkJCVdSSVRFX1ZSRUcoVkxEX01FTV9WSUZJRk9fQlVGX0NOVEwsIDIpOworCisJCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX0NPTlRST0wsCisJCQkJKDB4MTEgPDwgMTYpIHwgKDE8PDEwKSB8ICg3PDwzKSk7CisKKwkJfSBlbHNlIGlmIChpbnB1dC0+dGFyZ2V0ID09IFZERUNfSU5QVVRfVEFSR0VUX0hFVkMpIHsKKwkJCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fU1RBUlRfQUREUiwgYmxvY2stPnN0YXJ0KTsKKwkJCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fRU5EX0FERFIsIGJsb2NrLT5zdGFydCArCisJCQkJCWJsb2NrLT5zaXplKTsKKwkJCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSLCBibG9jay0+c3RhcnQgKworCQkJCQljaHVuay0+b2Zmc2V0KTsKKwkJCWR1bW15ID0gY2h1bmstPm9mZnNldCArIGNodW5rLT5zaXplICsKKwkJCQkJSEVWQ19QQURESU5HX1NJWkU7CisJCQlpZiAoZHVtbXkgPj0gYmxvY2stPnNpemUpCisJCQkJZHVtbXkgLT0gYmxvY2stPnNpemU7CisJCQlXUklURV9WUkVHKEhFVkNfU1RSRUFNX1dSX1BUUiwKKwkJCQlyb3VuZF9kb3duKGJsb2NrLT5zdGFydCArIGR1bW15LAorCQkJCQlWREVDX0ZJRk9fQUxJR04pKTsKKworCQkJLyogc2V0IGVuZGlhbiAqLworCQkJU0VUX1ZSRUdfTUFTSyhIRVZDX1NUUkVBTV9DT05UUk9MLCA3IDw8IDQpOworCQl9CisKKwkJKnAgPSBjaHVuazsKKwkJcmV0dXJuIGNodW5rLT5zaXplOworCisJfSBlbHNlIHsKKwkJLyogc3RyZWFtIGJhc2VkICovCisJCXUzMiBycCA9IDAsIHdwID0gMCwgZmlmb19sZW4gPSAwLCBmaXJzdF9zZXRfcnAgPSAwOworCQlpbnQgc2l6ZTsKKwkJYm9vbCBzd2FwX3ZhbGlkID0gaW5wdXQtPnN3YXBfdmFsaWQ7CisJCXVuc2lnbmVkIGxvbmcgc3dhcF9wYWdlX3BoeXMgPSBpbnB1dC0+c3dhcF9wYWdlX3BoeXM7CisKKwkJaWYgKHZkZWNfZHVhbCh2ZGVjKSAmJgorCQkJKCh2ZGVjLT5mbGFnICYgVkRFQ19GTEFHX1NFTEZfSU5QVVRfQ09OVEVYVCkgPT0gMCkpIHsKKwkJCS8qIGtlZXAgdXNpbmcgcHJldmlvdXMgaW5wdXQgY29udGV4dCAqLworCQkJc3RydWN0IHZkZWNfcyAqbWFzdGVyID0gKHZkZWMtPnNsYXZlKSA/CisJCQkJdmRlYyA6IHZkZWMtPm1hc3RlcjsKKwkJICAgIGlmIChtYXN0ZXItPmlucHV0Lmxhc3Rfc3dhcF9zbGF2ZSkgeworCQkJCXN3YXBfdmFsaWQgPSBtYXN0ZXItPnNsYXZlLT5pbnB1dC5zd2FwX3ZhbGlkOworCQkJCXN3YXBfcGFnZV9waHlzID0KKwkJCQkJbWFzdGVyLT5zbGF2ZS0+aW5wdXQuc3dhcF9wYWdlX3BoeXM7CisJCQl9IGVsc2UgeworCQkJCXN3YXBfdmFsaWQgPSBtYXN0ZXItPmlucHV0LnN3YXBfdmFsaWQ7CisJCQkJc3dhcF9wYWdlX3BoeXMgPSBtYXN0ZXItPmlucHV0LnN3YXBfcGFnZV9waHlzOworCQkJfQorCQl9CisKKwkJaWYgKHN3YXBfdmFsaWQpIHsKKwkJCWlmIChpbnB1dC0+dGFyZ2V0ID09IFZERUNfSU5QVVRfVEFSR0VUX1ZMRCkgeworCQkJCWlmICh2ZGVjLT5mb3JtYXQgPT0gVkZPUk1BVF9IMjY0KQorCQkJCQlTRVRfVlJFR19NQVNLKFBPV0VSX0NUTF9WTEQsCisJCQkJCQkoMSA8PCA5KSk7CisKKwkJCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX0NPTlRST0wsIDApOworCisJCQkJLyogcmVzdG9yZSByZWFkIHNpZGUgKi8KKwkJCQlXUklURV9WUkVHKFZMRF9NRU1fU1dBUF9BRERSLAorCQkJCQlzd2FwX3BhZ2VfcGh5cyk7CisJCQkJV1JJVEVfVlJFRyhWTERfTUVNX1NXQVBfQ1RMLCAxKTsKKworCQkJCXdoaWxlIChSRUFEX1ZSRUcoVkxEX01FTV9TV0FQX0NUTCkgJiAoMTw8NykpCisJCQkJCTsKKwkJCQlXUklURV9WUkVHKFZMRF9NRU1fU1dBUF9DVEwsIDApOworCisJCQkJLyogcmVzdG9yZSB3cmFwIGNvdW50ICovCisJCQkJV1JJVEVfVlJFRyhWTERfTUVNX1ZJRklGT19XUkFQX0NPVU5ULAorCQkJCQlpbnB1dC0+c3RyZWFtX2Nvb2tpZSk7CisKKwkJCQlycCA9IFJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCk7CisJCQkJZmlmb19sZW4gPSBSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpOworCisJCQkJLyogZW5hYmxlICovCisJCQkJV1JJVEVfVlJFRyhWTERfTUVNX1ZJRklGT19DT05UUk9MLAorCQkJCQkoMHgxMSA8PCAxNikgfCAoMTw8MTApKTsKKworCQkJCWlmICh2ZGVjLT52YnVmLm5vX3BhcnNlcikKKwkJCQkJU0VUX1ZSRUdfTUFTSyhWTERfTUVNX1ZJRklGT19DT05UUk9MLAorCQkJCQkJNyA8PCAzKTsKKworCQkJCS8qIHN5bmMgd2l0aCBmcm9udCBlbmQgKi8KKwkJCQl2ZGVjX3N5bmNfaW5wdXRfcmVhZCh2ZGVjKTsKKwkJCQl2ZGVjX3N5bmNfaW5wdXRfd3JpdGUodmRlYyk7CisKKwkJCQl3cCA9IFJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19XUCk7CisJCQl9IGVsc2UgaWYgKGlucHV0LT50YXJnZXQgPT0gVkRFQ19JTlBVVF9UQVJHRVRfSEVWQykgeworCQkJCVNFVF9WUkVHX01BU0soSEVWQ19TVFJFQU1fQ09OVFJPTCwgMSk7CisKKwkJCQkvKiByZXN0b3JlIHJlYWQgc2lkZSAqLworCQkJCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fU1dBUF9BRERSLAorCQkJCQlzd2FwX3BhZ2VfcGh5cyk7CisJCQkJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9TV0FQX0NUUkwsIDEpOworCisJCQkJd2hpbGUgKFJFQURfVlJFRyhIRVZDX1NUUkVBTV9TV0FQX0NUUkwpCisJCQkJCSYgKDE8PDcpKQorCQkJCQk7CisJCQkJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9TV0FQX0NUUkwsIDApOworCisJCQkJLyogcmVzdG9yZSBzdHJlYW0gb2Zmc2V0ICovCisJCQkJV1JJVEVfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQsCisJCQkJCWlucHV0LT5zdHJlYW1fY29va2llKTsKKworCQkJCXJwID0gUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1JEX1BUUik7CisJCQkJZmlmb19sZW4gPSAoUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0ZJRk9fQ1RMKQorCQkJCQkJPj4gMTYpICYgMHg3ZjsKKworCisJCQkJLyogZW5hYmxlICovCisKKwkJCQkvKiBzeW5jIHdpdGggZnJvbnQgZW5kICovCisJCQkJdmRlY19zeW5jX2lucHV0X3JlYWQodmRlYyk7CisJCQkJdmRlY19zeW5jX2lucHV0X3dyaXRlKHZkZWMpOworCisJCQkJd3AgPSBSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fV1JfUFRSKTsKKworCQkJCWlmICh2ZGVjLT52YnVmLm5vX3BhcnNlcikKKwkJCQkJU0VUX1ZSRUdfTUFTSyhIRVZDX1NUUkVBTV9DT05UUk9MLAorCQkJCQkJNyA8PCA0KTsKKwkJCQkvKnByX2luZm8oInZkZWM6IHJlc3RvcmUgY29udGV4dFxyXG4iKTsqLworCQkJfQorCisJCX0gZWxzZSB7CisJCQlpZiAodmRlYy0+dmJ1Zi5leHRfYnVmX2FkZHIpCisJCQkJZmlyc3Rfc2V0X3JwID0gU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3JwKTsKKwkJCWVsc2UgeworCQkJCWlmICh2ZGVjLT5kaXNjYXJkX3N0YXJ0X2RhdGFfZmxhZykKKwkJCQkJZmlyc3Rfc2V0X3JwID0gU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3JwKTsKKwkJCQllbHNlCisJCQkJCWZpcnN0X3NldF9ycCA9IGlucHV0LT5zdGFydDsKKwkJCX0KKwkJCWlmIChpbnB1dC0+dGFyZ2V0ID09IFZERUNfSU5QVVRfVEFSR0VUX1ZMRCkgeworCQkJCVdSSVRFX1ZSRUcoVkxEX01FTV9WSUZJRk9fU1RBUlRfUFRSLAorCQkJCQlpbnB1dC0+c3RhcnQpOworCQkJCVdSSVRFX1ZSRUcoVkxEX01FTV9WSUZJRk9fRU5EX1BUUiwKKwkJCQkJaW5wdXQtPnN0YXJ0ICsgaW5wdXQtPnNpemUgLSA4KTsKKwkJCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX0NVUlJfUFRSLAorCQkJCQlmaXJzdF9zZXRfcnApOworCisJCQkJV1JJVEVfVlJFRyhWTERfTUVNX1ZJRklGT19DT05UUk9MLCAxKTsKKwkJCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX0NPTlRST0wsIDApOworCisJCQkJLyogc2V0IHRvIG1hbnVhbCBtb2RlICovCisJCQkJV1JJVEVfVlJFRyhWTERfTUVNX1ZJRklGT19CVUZfQ05UTCwgMik7CisJCQkJV1JJVEVfVlJFRyhWTERfTUVNX1ZJRklGT19SUCwgZmlyc3Rfc2V0X3JwKTsKKwkJCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX1dQLAorCQkJCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApKTsKKwkJCQlycCA9IFJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCk7CisKKwkJCQkvKiBlbmFibGUgKi8KKwkJCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX0NPTlRST0wsCisJCQkJCSgweDExIDw8IDE2KSB8ICgxPDwxMCkpOworCQkJCWlmICh2ZGVjLT52YnVmLm5vX3BhcnNlcikKKwkJCQkJU0VUX1ZSRUdfTUFTSyhWTERfTUVNX1ZJRklGT19DT05UUk9MLAorCQkJCQkJNyA8PCAzKTsKKworCQkJCXdwID0gUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1dQKTsKKworCQkJfSBlbHNlIGlmIChpbnB1dC0+dGFyZ2V0ID09IFZERUNfSU5QVVRfVEFSR0VUX0hFVkMpIHsKKwkJCQlXUklURV9WUkVHKEhFVkNfU1RSRUFNX1NUQVJUX0FERFIsCisJCQkJCWlucHV0LT5zdGFydCk7CisJCQkJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9FTkRfQUREUiwKKwkJCQkJaW5wdXQtPnN0YXJ0ICsgaW5wdXQtPnNpemUpOworCQkJCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSLAorCQkJCQlmaXJzdF9zZXRfcnApOworCQkJCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fV1JfUFRSLAorCQkJCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApKTsKKwkJCQlycCA9IFJFQURfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIpOworCQkJCXdwID0gUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1dSX1BUUik7CisJCQkJZmlmb19sZW4gPSAoUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0ZJRk9fQ1RMKQorCQkJCQkJPj4gMTYpICYgMHg3ZjsKKwkJCQlpZiAodmRlYy0+dmJ1Zi5ub19wYXJzZXIpCisJCQkJCVNFVF9WUkVHX01BU0soSEVWQ19TVFJFQU1fQ09OVFJPTCwKKwkJCQkJCTcgPDwgNCk7CisJCQkJLyogZW5hYmxlICovCisJCQl9CisJCX0KKwkJKnAgPSBOVUxMOworCQlpZiAod3AgPj0gcnApCisJCQlzaXplID0gd3AgLSBycCArIGZpZm9fbGVuOworCQllbHNlCisJCQlzaXplID0gd3AgKyBpbnB1dC0+c2l6ZSAtIHJwICsgZmlmb19sZW47CisJCWlmIChzaXplIDwgMCkgeworCQkJcHJfaW5mbygiJXMgZXJyb3I6IGlucHV0LT5zaXplICV4IHdwICV4IHJwICV4IGZpZm9fbGVuICV4ID0+IHNpemUgJXhcclxuIiwKKwkJCQlfX2Z1bmNfXywgaW5wdXQtPnNpemUsIHdwLCBycCwgZmlmb19sZW4sIHNpemUpOworCQkJc2l6ZSA9IDA7CisJCX0KKwkJcmV0dXJuIHNpemU7CisJfQorfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3ByZXBhcmVfaW5wdXQpOworCit1MzIgdmRlY19vZmZzZXRfcHJlcGFyZV9pbnB1dChzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1MzIgY29uc3VtZV9ieXRlLCB1MzIgZGF0YV9vZmZzZXQsIHUzMiBkYXRhX3NpemUpCit7CisJc3RydWN0IHZkZWNfaW5wdXRfcyAqaW5wdXQgPSAmdmRlYy0+aW5wdXQ7CisJdTMyIHJlc19ieXRlLCBoZWFkZXJfb2Zmc2V0LCBoZWFkZXJfZGF0YV9zaXplLCBkYXRhX2ludmFsaWQ7CisKKwlyZXNfYnl0ZSA9IGRhdGFfc2l6ZSAtIGNvbnN1bWVfYnl0ZTsKKwloZWFkZXJfb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CisJaGVhZGVyX2RhdGFfc2l6ZSA9IGRhdGFfc2l6ZTsKKwlkYXRhX29mZnNldCArPSBjb25zdW1lX2J5dGU7CisJZGF0YV9zaXplID0gcmVzX2J5dGU7CisKKwlpZiAoaW5wdXQtPnRhcmdldCA9PSBWREVDX0lOUFVUX1RBUkdFVF9WTEQpIHsKKwkJLy90byBkbworCX0gZWxzZSBpZiAoaW5wdXQtPnRhcmdldCA9PSBWREVDX0lOUFVUX1RBUkdFVF9IRVZDKSB7CisJCWRhdGFfaW52YWxpZCA9IGRhdGFfb2Zmc2V0IC0gcm91bmRfZG93bihkYXRhX29mZnNldCwgMHg0MCk7CisJCWRhdGFfb2Zmc2V0IC09IGRhdGFfaW52YWxpZDsKKwkJZGF0YV9zaXplICs9IGRhdGFfaW52YWxpZDsKKworCQlpZiAoZGF0YV9vZmZzZXQgPCBoZWFkZXJfb2Zmc2V0KSB7CisJCQlkYXRhX2ludmFsaWQgPSBjb25zdW1lX2J5dGU7CisJCQlkYXRhX29mZnNldCA9IGhlYWRlcl9vZmZzZXQ7CisJCQlkYXRhX3NpemUgPSBoZWFkZXJfZGF0YV9zaXplOworCQl9CisKKwkJaWYgKGlucHV0X2ZyYW1lX2Jhc2VkKGlucHV0KSkgeworCQkJc3RydWN0IHZmcmFtZV9jaHVua19zICpjaHVuayA9IHZkZWNfaW5wdXRfbmV4dF9jaHVuaygmdmRlYy0+aW5wdXQpOworCQkJc3RydWN0IHZmcmFtZV9ibG9ja19saXN0X3MgKmJsb2NrID0gTlVMTDsKKwkJCWludCBkdW1teTsKKworCQkJYmxvY2sgPSBjaHVuay0+YmxvY2s7CisJCQlXUklURV9WUkVHKEhFVkNfU1RSRUFNX1NUQVJUX0FERFIsIGJsb2NrLT5zdGFydCk7CisJCQlXUklURV9WUkVHKEhFVkNfU1RSRUFNX0VORF9BRERSLCBibG9jay0+c3RhcnQgKworCQkJCQlibG9jay0+c2l6ZSk7CisJCQlXUklURV9WUkVHKEhFVkNfU1RSRUFNX1JEX1BUUiwgYmxvY2stPnN0YXJ0ICsKKwkJCQkJZGF0YV9vZmZzZXQpOworCQkJZHVtbXkgPSBkYXRhX29mZnNldCArIGRhdGFfc2l6ZSArCisJCQkJCUhFVkNfUEFERElOR19TSVpFOworCQkJaWYgKGR1bW15ID49IGJsb2NrLT5zaXplKQorCQkJCWR1bW15IC09IGJsb2NrLT5zaXplOworCQkJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9XUl9QVFIsCisJCQkJcm91bmRfZG93bihibG9jay0+c3RhcnQgKyBkdW1teSwKKwkJCQkJVkRFQ19GSUZPX0FMSUdOKSk7CisKKwkJCS8qIHNldCBlbmRpYW4gKi8KKwkJCVNFVF9WUkVHX01BU0soSEVWQ19TVFJFQU1fQ09OVFJPTCwgNyA8PCA0KTsKKwkJfQorCX0KKwlyZXR1cm4gZGF0YV9pbnZhbGlkOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX29mZnNldF9wcmVwYXJlX2lucHV0KTsKKwordm9pZCB2ZGVjX2VuYWJsZV9pbnB1dChzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXN0cnVjdCB2ZGVjX2lucHV0X3MgKmlucHV0ID0gJnZkZWMtPmlucHV0OworCisJaWYgKHZkZWMtPnN0YXR1cyAhPSBWREVDX1NUQVRVU19BQ1RJVkUpCisJCXJldHVybjsKKworCWlmIChpbnB1dC0+dGFyZ2V0ID09IFZERUNfSU5QVVRfVEFSR0VUX1ZMRCkKKwkJU0VUX1ZSRUdfTUFTSyhWTERfTUVNX1ZJRklGT19DT05UUk9MLCAoMTw8MikgfCAoMTw8MSkpOworCWVsc2UgaWYgKGlucHV0LT50YXJnZXQgPT0gVkRFQ19JTlBVVF9UQVJHRVRfSEVWQykgeworCQlTRVRfVlJFR19NQVNLKEhFVkNfU1RSRUFNX0NPTlRST0wsIDEpOworCQlpZiAodmRlY19zdHJlYW1fYmFzZWQodmRlYykpIHsKKwkJCWlmICh2ZGVjLT52YnVmLm5vX3BhcnNlcikKKwkJCQkvKnNldCBlbmRpYW4gZm9yIG5vbi1wYXJzZXIgbW9kZS4gKi8KKwkJCQlTRVRfVlJFR19NQVNLKEhFVkNfU1RSRUFNX0NPTlRST0wsIDcgPDwgNCk7CisJCQllbHNlCisJCQkJQ0xFQVJfVlJFR19NQVNLKEhFVkNfU1RSRUFNX0NPTlRST0wsIDcgPDwgNCk7CisJCX0gZWxzZQorCQkJU0VUX1ZSRUdfTUFTSyhIRVZDX1NUUkVBTV9DT05UUk9MLCA3IDw8IDQpOworCisJCVNFVF9WUkVHX01BU0soSEVWQ19TVFJFQU1fRklGT19DVEwsICgxPDwyOSkpOworCX0KK30KK0VYUE9SVF9TWU1CT0wodmRlY19lbmFibGVfaW5wdXQpOworCitpbnQgdmRlY19zZXRfaW5wdXRfYnVmZmVyKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHUzMiBzdGFydCwgdTMyIHNpemUpCit7CisJaW50IHIgPSB2ZGVjX2lucHV0X3NldF9idWZmZXIoJnZkZWMtPmlucHV0LCBzdGFydCwgc2l6ZSk7CisKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlpZiAodmRlYy0+c2xhdmUpCisJCXIgPSB2ZGVjX2lucHV0X3NldF9idWZmZXIoJnZkZWMtPnNsYXZlLT5pbnB1dCwgc3RhcnQsIHNpemUpOworCisJcmV0dXJuIHI7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfc2V0X2lucHV0X2J1ZmZlcik7CisKKy8qCisgKiB2ZGVjX2VvcyByZXR1cm5zIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoZXJlIGFyZQorICogbW9yZSBpbnB1dCBjYW4gYmUgdXNlZCBieSBkZWNvZGVyIHRocm91Z2ggdmRlY19wcmVwYXJlX2lucHV0CisgKiBOb3RlOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgcHJpb3IgdG8gdmRlY192ZnJhbWVfZGlydHkKKyAqIGJ5IGRlY29kZXIgZHJpdmVyIHRvIGRldGVybWluZSBpZiBFT1MgaGFwcGVucyBmb3Igc3RyZWFtIGJhc2VkCisgKiBkZWNvZGluZyB3aGVuIHRoZXJlIGlzIG5vIHN1ZmZpY2llbnQgZGF0YSBmb3IgYSBmcmFtZQorICovCitib29sIHZkZWNfaGFzX21vcmVfaW5wdXQoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzdHJ1Y3QgdmRlY19pbnB1dF9zICppbnB1dCA9ICZ2ZGVjLT5pbnB1dDsKKworCWlmICghaW5wdXQtPmVvcykKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoaW5wdXRfZnJhbWVfYmFzZWQoaW5wdXQpKQorCQlyZXR1cm4gdmRlY19pbnB1dF9uZXh0X2lucHV0X2NodW5rKGlucHV0KSAhPSBOVUxMOworCWVsc2UgeworCQlpZiAoaW5wdXQtPnRhcmdldCA9PSBWREVDX0lOUFVUX1RBUkdFVF9WTEQpCisJCQlyZXR1cm4gUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1dQKSAhPQorCQkJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCk7CisJCWVsc2UgeworCQkJcmV0dXJuIChSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fV1JfUFRSKSAmIH4weDMpICE9CisJCQkJKFNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCkgJiB+MHgzKTsKKwkJfQorCX0KK30KK0VYUE9SVF9TWU1CT0wodmRlY19oYXNfbW9yZV9pbnB1dCk7CisKK3ZvaWQgdmRlY19zZXRfcHJlcGFyZV9sZXZlbChzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgbGV2ZWwpCit7CisJdmRlYy0+aW5wdXQucHJlcGFyZV9sZXZlbCA9IGxldmVsOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3NldF9wcmVwYXJlX2xldmVsKTsKKwordm9pZCB2ZGVjX3NldF9mbGFnKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHUzMiBmbGFnKQoreworCXZkZWMtPmZsYWcgPSBmbGFnOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3NldF9mbGFnKTsKKwordm9pZCB2ZGVjX3NldF9lb3Moc3RydWN0IHZkZWNfcyAqdmRlYywgYm9vbCBlb3MpCit7CisJc3RydWN0IHZkZWNfY29yZV9zICpjb3JlID0gdmRlY19jb3JlOworCisJdmRlYy0+aW5wdXQuZW9zID0gZW9zOworCisJaWYgKHZkZWMtPnNsYXZlKQorCQl2ZGVjLT5zbGF2ZS0+aW5wdXQuZW9zID0gZW9zOworCXVwKCZjb3JlLT5zZW0pOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3NldF9lb3MpOworCisjaWZkZWYgVkRFQ19ERUJVR19TVVBQT1JUCit2b2lkIHZkZWNfc2V0X3N0ZXBfbW9kZSh2b2lkKQoreworCXN0ZXBfbW9kZSA9IDB4MWZmOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3NldF9zdGVwX21vZGUpOworI2VuZGlmCisKK3ZvaWQgdmRlY19zZXRfbmV4dF9zY2hlZChzdHJ1Y3QgdmRlY19zICp2ZGVjLCBzdHJ1Y3QgdmRlY19zICpuZXh0X3ZkZWMpCit7CisJaWYgKHZkZWMgJiYgbmV4dF92ZGVjKSB7CisJCXZkZWMtPnNjaGVkID0gMDsKKwkJbmV4dF92ZGVjLT5zY2hlZCA9IDE7CisJfQorfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3NldF9uZXh0X3NjaGVkKTsKKworLyoKKyAqIFN3YXAgQ29udGV4dDogICAgICAgUzAgICAgIFMxICAgICBTMiAgICAgUzMgICAgIFM0CisgKiBTYW1wbGUgc2VxdWVuY2U6ICBNICAgICBTICAgICAgTSAgICAgIE0gICAgICBTCisgKiBNYXN0ZXIgQ29udGV4dDogICAgIFMwICAgICBTMCAgICAgUzIgICAgIFMzICAgICBTMworICogU2xhdmUgY29udGV4dDogICAgICBOQSAgICAgUzEgICAgIFMxICAgICBTMiAgICAgUzQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRyaWNreSBwYXJ0CisgKiBJZiB0aGVyZSBhcmUgYmFjayB0byBiYWNrIGRlY29kaW5nIG9mIG1hc3RlciBvciBzbGF2ZQorICogdGhlbiB0aGUgY29udGV4dCBvZiB0aGUgY291bnRlciBwYXJ0IHNob3VsZCBiZSB1cGRhdGVkCisgKiB3aXRoIGN1cnJlbnQgZGVjb2Rlci4gSW4gdGhpcyBleGFtcGxlLCBTMSBzaG91bGQgYmUKKyAqIHVwZGF0ZWQgdG8gUzIuCisgKiBUaGlzIGlzIGRvbmUgYnkgc3dhcCB0aGUgc3dhcF9wYWdlIGFuZCByZWxhdGVkIGluZm8KKyAqIGJldHdlZW4gdHdvIGxheWVycy4KKyAqLworc3RhdGljIHZvaWQgdmRlY19ib3Jyb3dfaW5wdXRfY29udGV4dChzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXN0cnVjdCBwYWdlICpzd2FwX3BhZ2U7CisJdW5zaWduZWQgbG9uZyBzd2FwX3BhZ2VfcGh5czsKKwlzdHJ1Y3QgdmRlY19pbnB1dF9zICptZTsKKwlzdHJ1Y3QgdmRlY19pbnB1dF9zICpvdGhlcjsKKworCWlmICghdmRlY19kdWFsKHZkZWMpKQorCQlyZXR1cm47CisKKwltZSA9ICZ2ZGVjLT5pbnB1dDsKKwlvdGhlciA9ICZ2ZGVjX2dldF9hc3NvY2lhdGUodmRlYyktPmlucHV0OworCisJLyogc3dhcCB0aGUgc3dhcF9jb250ZXh0LCBib3Jyb3cgY291bnRlciBwYXJ0J3MKKwkgKiBzd2FwIGNvbnRleHQgc3RvcmFnZSBhbmQgdXBkYXRlIGFsbCByZWxhdGVkIGluZm8uCisJICogQWZ0ZXIgdmRlY192ZnJhbWVfZGlydHksIHZkZWNfc2F2ZV9pbnB1dF9jb250ZXh0CisJICogd2lsbCBiZSBjYWxsZWQgdG8gdXBkYXRlIGN1cnJlbnQgdmRlYydzCisJICogc3dhcCBjb250ZXh0CisJICovCisJc3dhcF9wYWdlID0gb3RoZXItPnN3YXBfcGFnZTsKKwlvdGhlci0+c3dhcF9wYWdlID0gbWUtPnN3YXBfcGFnZTsKKwltZS0+c3dhcF9wYWdlID0gc3dhcF9wYWdlOworCisJc3dhcF9wYWdlX3BoeXMgPSBvdGhlci0+c3dhcF9wYWdlX3BoeXM7CisJb3RoZXItPnN3YXBfcGFnZV9waHlzID0gbWUtPnN3YXBfcGFnZV9waHlzOworCW1lLT5zd2FwX3BhZ2VfcGh5cyA9IHN3YXBfcGFnZV9waHlzOworCisJb3RoZXItPnN3YXBfcnAgPSBtZS0+c3dhcF9ycDsKKwlvdGhlci0+c3RyZWFtaW5nX3JwID0gbWUtPnN0cmVhbWluZ19ycDsKKwlvdGhlci0+c3RyZWFtX2Nvb2tpZSA9IG1lLT5zdHJlYW1fY29va2llOworCW90aGVyLT5zd2FwX3ZhbGlkID0gbWUtPnN3YXBfdmFsaWQ7Cit9CisKK3ZvaWQgdmRlY192ZnJhbWVfZGlydHkoc3RydWN0IHZkZWNfcyAqdmRlYywgc3RydWN0IHZmcmFtZV9jaHVua19zICpjaHVuaykKK3sKKwlpZiAoY2h1bmspCisJCWNodW5rLT5mbGFnIHw9IFZGUkFNRV9DSFVOS19GTEFHX0NPTlNVTUVEOworCisJaWYgKHZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpKSB7CisJCXZkZWMtPmlucHV0LnN3YXBfbmVlZGVkID0gdHJ1ZTsKKworCQlpZiAodmRlY19kdWFsKHZkZWMpKSB7CisJCQl2ZGVjX2dldF9hc3NvY2lhdGUodmRlYyktPmlucHV0LmRpcnR5X2NvdW50ID0gMDsKKwkJCXZkZWMtPmlucHV0LmRpcnR5X2NvdW50Kys7CisJCQlpZiAodmRlYy0+aW5wdXQuZGlydHlfY291bnQgPiAxKSB7CisJCQkJdmRlYy0+aW5wdXQuZGlydHlfY291bnQgPSAxOworCQkJCXZkZWNfYm9ycm93X2lucHV0X2NvbnRleHQodmRlYyk7CisJCQl9CisJCX0KKworCQkvKiBmb3Igc3RyZWFtIGJhc2VkIG1vZGUsIHdlIHVwZGF0ZSByZWFkIGFuZCB3cml0ZSBwb2ludGVyCisJCSAqIGFsc28gaW4gY2FzZSBkZWNvZGVyIHdhbnRzIHRvIGtlZXAgd29ya2luZyBvbiBkZWNvZGluZworCQkgKiBmb3IgbW9yZSBmcmFtZXMgd2hpbGUgaW5wdXQgZnJvbnQgZW5kIGhhcyBtb3JlIGRhdGEKKwkJICovCisJCXZkZWNfc3luY19pbnB1dF9yZWFkKHZkZWMpOworCQl2ZGVjX3N5bmNfaW5wdXRfd3JpdGUodmRlYyk7CisKKwkJdmRlYy0+bmVlZF9tb3JlX2RhdGEgfD0gVkRFQ19ORUVEX01PUkVfREFUQV9ESVJUWTsKKwkJdmRlYy0+bmVlZF9tb3JlX2RhdGEgJj0gflZERUNfTkVFRF9NT1JFX0RBVEE7CisJfQorfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3ZmcmFtZV9kaXJ0eSk7CisKK2Jvb2wgdmRlY19uZWVkX21vcmVfZGF0YShzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCWlmICh2ZGVjX3N0cmVhbV9iYXNlZCh2ZGVjKSkKKwkJcmV0dXJuIHZkZWMtPm5lZWRfbW9yZV9kYXRhICYgVkRFQ19ORUVEX01PUkVfREFUQTsKKworCXJldHVybiBmYWxzZTsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19uZWVkX21vcmVfZGF0YSk7CisKKworc3RhdGljIHZvaWQgaGV2Y193YWl0X2Rkcih2b2lkKQoreworCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNykgfHwKKwkJKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDMpKSB7CisJCWhldmNfYXJiX2N0cmwoMCk7CisJfSBlbHNlIHsKKwkJZGVjX2RtY19wb3J0X2N0cmwoMCwgVkRFQ19JTlBVVF9UQVJHRVRfSEVWQyk7CisJfQorfQorCit2b2lkIHZkZWNfc2F2ZV9pbnB1dF9jb250ZXh0KHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IHZkZWNfaW5wdXRfcyAqaW5wdXQgPSAmdmRlYy0+aW5wdXQ7CisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9NVUxUSV9ERUMKKwl2ZGVjX3Byb2ZpbGUodmRlYywgVkRFQ19QUk9GSUxFX0VWRU5UX1NBVkVfSU5QVVQpOworI2VuZGlmCisKKwlpZiAoaW5wdXQtPnRhcmdldCA9PSBWREVDX0lOUFVUX1RBUkdFVF9WTEQpCisJCVdSSVRFX1ZSRUcoVkxEX01FTV9WSUZJRk9fQ09OVFJPTCwgMTw8MTUpOworCisJaWYgKGlucHV0X3N0cmVhbV9iYXNlZChpbnB1dCkgJiYgKGlucHV0LT5zd2FwX25lZWRlZCkpIHsKKwkJaWYgKGlucHV0LT50YXJnZXQgPT0gVkRFQ19JTlBVVF9UQVJHRVRfVkxEKSB7CisJCQlXUklURV9WUkVHKFZMRF9NRU1fU1dBUF9BRERSLAorCQkJCWlucHV0LT5zd2FwX3BhZ2VfcGh5cyk7CisJCQlXUklURV9WUkVHKFZMRF9NRU1fU1dBUF9DVEwsIDMpOworCQkJd2hpbGUgKFJFQURfVlJFRyhWTERfTUVNX1NXQVBfQ1RMKSAmICgxPDw3KSkKKwkJCQk7CisJCQlXUklURV9WUkVHKFZMRF9NRU1fU1dBUF9DVEwsIDApOworCQkJdmRlYy0+aW5wdXQuc3RyZWFtX2Nvb2tpZSA9CisJCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1dSQVBfQ09VTlQpOworCQkJdmRlYy0+aW5wdXQuc3dhcF9ycCA9CisJCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKTsKKwkJCXZkZWMtPmlucHV0LnRvdGFsX3JkX2NvdW50ID0KKwkJCQkodTY0KXZkZWMtPmlucHV0LnN0cmVhbV9jb29raWUgKgorCQkJCXZkZWMtPmlucHV0LnNpemUgKyB2ZGVjLT5pbnB1dC5zd2FwX3JwIC0KKwkJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fQllURVNfQVZBSUwpOworCQl9IGVsc2UgaWYgKGlucHV0LT50YXJnZXQgPT0gVkRFQ19JTlBVVF9UQVJHRVRfSEVWQykgeworCQkJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9TV0FQX0FERFIsCisJCQkJaW5wdXQtPnN3YXBfcGFnZV9waHlzKTsKKwkJCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fU1dBUF9DVFJMLCAzKTsKKworCQkJd2hpbGUgKFJFQURfVlJFRyhIRVZDX1NUUkVBTV9TV0FQX0NUUkwpICYgKDE8PDcpKQorCQkJCTsKKwkJCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fU1dBUF9DVFJMLCAwKTsKKworCQkJdmRlYy0+aW5wdXQuc3RyZWFtX2Nvb2tpZSA9CisJCQkJUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCk7CisJCQl2ZGVjLT5pbnB1dC5zd2FwX3JwID0KKwkJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSKTsKKwkJCWlmICgoKHZkZWMtPmlucHV0LnN0cmVhbV9jb29raWUgJiAweDgwMDAwMDAwKSA9PSAwKSAmJgorCQkJCSh2ZGVjLT5pbnB1dC5zdHJlYW1pbmdfcnAgJiAweDgwMDAwMDAwKSkKKwkJCQl2ZGVjLT5pbnB1dC5zdHJlYW1pbmdfcnAgKz0gMVVMTCA8PCAzMjsKKwkJCXZkZWMtPmlucHV0LnN0cmVhbWluZ19ycCAmPSAweGZmZmZmZmZmVUxMIDw8IDMyOworCQkJdmRlYy0+aW5wdXQuc3RyZWFtaW5nX3JwIHw9IHZkZWMtPmlucHV0LnN0cmVhbV9jb29raWU7CisJCQl2ZGVjLT5pbnB1dC50b3RhbF9yZF9jb3VudCA9IHZkZWMtPmlucHV0LnN0cmVhbWluZ19ycDsKKwkJCWhldmNfd2FpdF9kZHIoKTsKKwkJfQorCisJCWlucHV0LT5zd2FwX3ZhbGlkID0gdHJ1ZTsKKwkJaW5wdXQtPnN3YXBfbmVlZGVkID0gZmFsc2U7CisJCS8qcHJfaW5mbygidmRlYzogc2F2ZSBjb250ZXh0XHJcbiIpOyovCisKKwkJdmRlY19zeW5jX2lucHV0X3JlYWQodmRlYyk7CisKKwkJaWYgKHZkZWNfZHVhbCh2ZGVjKSkgeworCQkJc3RydWN0IHZkZWNfcyAqbWFzdGVyID0gKHZkZWMtPnNsYXZlKSA/CisJCQkJdmRlYyA6IHZkZWMtPm1hc3RlcjsKKwkJCW1hc3Rlci0+aW5wdXQubGFzdF9zd2FwX3NsYXZlID0gKG1hc3Rlci0+c2xhdmUgPT0gdmRlYyk7CisJCQkvKiBwcl9pbmZvKCJtYXN0ZXItPmlucHV0Lmxhc3Rfc3dhcF9zbGF2ZSA9ICVkXG4iLAorCQkJCW1hc3Rlci0+aW5wdXQubGFzdF9zd2FwX3NsYXZlKTsgKi8KKwkJfQorCX0KK30KK0VYUE9SVF9TWU1CT0wodmRlY19zYXZlX2lucHV0X2NvbnRleHQpOworCit2b2lkIHZkZWNfY2xlYW5faW5wdXQoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzdHJ1Y3QgdmRlY19pbnB1dF9zICppbnB1dCA9ICZ2ZGVjLT5pbnB1dDsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmaW5wdXQtPnZmcmFtZV9jaHVua19saXN0KSkgeworCQlzdHJ1Y3QgdmZyYW1lX2NodW5rX3MgKmNodW5rID0KKwkJCXZkZWNfaW5wdXRfbmV4dF9jaHVuayhpbnB1dCk7CisJCWlmIChjaHVuayAmJiAoY2h1bmstPmZsYWcgJiBWRlJBTUVfQ0hVTktfRkxBR19DT05TVU1FRCkpCisJCQl2ZGVjX2lucHV0X3JlbGVhc2VfY2h1bmsoaW5wdXQsIGNodW5rKTsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCXZkZWNfc2F2ZV9pbnB1dF9jb250ZXh0KHZkZWMpOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX2NsZWFuX2lucHV0KTsKKworCitzdGF0aWMgaW50IHZkZWNfaW5wdXRfcmVhZF9yZXN0b3JlKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IHZkZWNfaW5wdXRfcyAqaW5wdXQgPSAmdmRlYy0+aW5wdXQ7CisKKwlpZiAoIXZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpKQorCQlyZXR1cm4gMDsKKworCWlmICghaW5wdXQtPnN3YXBfdmFsaWQpIHsKKwkJaWYgKGlucHV0LT50YXJnZXQgPT0gVkRFQ19JTlBVVF9UQVJHRVRfVkxEKSB7CisJCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX1NUQVJUX1BUUiwKKwkJCQlpbnB1dC0+c3RhcnQpOworCQkJV1JJVEVfVlJFRyhWTERfTUVNX1ZJRklGT19FTkRfUFRSLAorCQkJCWlucHV0LT5zdGFydCArIGlucHV0LT5zaXplIC0gOCk7CisJCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX0NVUlJfUFRSLAorCQkJCWlucHV0LT5zdGFydCk7CisJCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX0NPTlRST0wsIDEpOworCQkJV1JJVEVfVlJFRyhWTERfTUVNX1ZJRklGT19DT05UUk9MLCAwKTsKKworCQkJLyogc2V0IHRvIG1hbnVhbCBtb2RlICovCisJCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX0JVRl9DTlRMLCAyKTsKKwkJCVdSSVRFX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlAsIGlucHV0LT5zdGFydCk7CisJCX0gZWxzZSBpZiAoaW5wdXQtPnRhcmdldCA9PSBWREVDX0lOUFVUX1RBUkdFVF9IRVZDKSB7CisJCQkJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9TVEFSVF9BRERSLAorCQkJCQlpbnB1dC0+c3RhcnQpOworCQkJCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fRU5EX0FERFIsCisJCQkJCWlucHV0LT5zdGFydCArIGlucHV0LT5zaXplKTsKKwkJCQlXUklURV9WUkVHKEhFVkNfU1RSRUFNX1JEX1BUUiwKKwkJCQkJaW5wdXQtPnN0YXJ0KTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJaWYgKGlucHV0LT50YXJnZXQgPT0gVkRFQ19JTlBVVF9UQVJHRVRfVkxEKSB7CisJCS8qIHJlc3RvcmUgcmVhZCBzaWRlICovCisJCVdSSVRFX1ZSRUcoVkxEX01FTV9TV0FQX0FERFIsCisJCQlpbnB1dC0+c3dhcF9wYWdlX3BoeXMpOworCisJCS8qc3dhcCBhY3RpdmUqLworCQlXUklURV9WUkVHKFZMRF9NRU1fU1dBUF9DVEwsIDEpOworCisJCS8qd2FpdCBzd2FwIGJ1c3kqLworCQl3aGlsZSAoUkVBRF9WUkVHKFZMRF9NRU1fU1dBUF9DVEwpICYgKDE8PDcpKQorCQkJOworCisJCVdSSVRFX1ZSRUcoVkxEX01FTV9TV0FQX0NUTCwgMCk7CisJfSBlbHNlIGlmIChpbnB1dC0+dGFyZ2V0ID09IFZERUNfSU5QVVRfVEFSR0VUX0hFVkMpIHsKKwkJLyogcmVzdG9yZSByZWFkIHNpZGUgKi8KKwkJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9TV0FQX0FERFIsCisJCQlpbnB1dC0+c3dhcF9wYWdlX3BoeXMpOworCQlXUklURV9WUkVHKEhFVkNfU1RSRUFNX1NXQVBfQ1RSTCwgMSk7CisKKwkJd2hpbGUgKFJFQURfVlJFRyhIRVZDX1NUUkVBTV9TV0FQX0NUUkwpCisJCQkmICgxPDw3KSkKKwkJCTsKKwkJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9TV0FQX0NUUkwsIDApOworCX0KKworCXJldHVybiAwOworfQorCisKK2ludCB2ZGVjX3N5bmNfaW5wdXQoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzdHJ1Y3QgdmRlY19pbnB1dF9zICppbnB1dCA9ICZ2ZGVjLT5pbnB1dDsKKwl1MzIgcnAgPSAwLCB3cCA9IDAsIGZpZm9fbGVuID0gMDsKKwlpbnQgc2l6ZTsKKworCXZkZWNfaW5wdXRfcmVhZF9yZXN0b3JlKHZkZWMpOworCXZkZWNfc3luY19pbnB1dF9yZWFkKHZkZWMpOworCXZkZWNfc3luY19pbnB1dF93cml0ZSh2ZGVjKTsKKwlpZiAoaW5wdXQtPnRhcmdldCA9PSBWREVDX0lOUFVUX1RBUkdFVF9WTEQpIHsKKwkJcnAgPSBSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApOworCQl3cCA9IFJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19XUCk7CisKKwl9IGVsc2UgaWYgKGlucHV0LT50YXJnZXQgPT0gVkRFQ19JTlBVVF9UQVJHRVRfSEVWQykgeworCQlycCA9IFJFQURfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIpOworCQl3cCA9IFJFQURfVlJFRyhIRVZDX1NUUkVBTV9XUl9QVFIpOworCQlmaWZvX2xlbiA9IChSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fRklGT19DVEwpCisJCQkJPj4gMTYpICYgMHg3ZjsKKwl9CisJaWYgKHdwID49IHJwKQorCQlzaXplID0gd3AgLSBycCArIGZpZm9fbGVuOworCWVsc2UKKwkJc2l6ZSA9IHdwICsgaW5wdXQtPnNpemUgLSBycCArIGZpZm9fbGVuOworCWlmIChzaXplIDwgMCkgeworCQlwcl9pbmZvKCIlcyBlcnJvcjogaW5wdXQtPnNpemUgJXggd3AgJXggcnAgJXggZmlmb19sZW4gJXggPT4gc2l6ZSAleFxyXG4iLAorCQkJX19mdW5jX18sIGlucHV0LT5zaXplLCB3cCwgcnAsIGZpZm9fbGVuLCBzaXplKTsKKwkJc2l6ZSA9IDA7CisJfQorCXJldHVybiBzaXplOworCit9CitFWFBPUlRfU1lNQk9MKHZkZWNfc3luY19pbnB1dCk7CisKK2NvbnN0IGNoYXIgKnZkZWNfc3RhdHVzX3N0cihzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCWlmICh2ZGVjLT5zdGF0dXMgPCAwKQorCQlyZXR1cm4gIklOVkFMSUQiOworCXJldHVybiB2ZGVjLT5zdGF0dXMgPCBBUlJBWV9TSVpFKHZkZWNfc3RhdHVzX3N0cmluZykgPworCQl2ZGVjX3N0YXR1c19zdHJpbmdbdmRlYy0+c3RhdHVzXSA6ICJJTlZBTElEIjsKK30KKworY29uc3QgY2hhciAqdmRlY190eXBlX3N0cihzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXN3aXRjaCAodmRlYy0+dHlwZSkgeworCWNhc2UgVkRFQ19UWVBFX1NJTkdMRToKKwkJcmV0dXJuICJWREVDX1RZUEVfU0lOR0xFIjsKKwljYXNlIFZERUNfVFlQRV9TVFJFQU1fUEFSU0VSOgorCQlyZXR1cm4gIlZERUNfVFlQRV9TVFJFQU1fUEFSU0VSIjsKKwljYXNlIFZERUNfVFlQRV9GUkFNRV9CTE9DSzoKKwkJcmV0dXJuICJWREVDX1RZUEVfRlJBTUVfQkxPQ0siOworCWNhc2UgVkRFQ19UWVBFX0ZSQU1FX0NJUkNVTEFSOgorCQlyZXR1cm4gIlZERUNfVFlQRV9GUkFNRV9DSVJDVUxBUiI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJWREVDX1RZUEVfSU5WQUxJRCI7CisJfQorfQorCitjb25zdCBjaGFyICp2ZGVjX2RldmljZV9uYW1lX3N0cihzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXJldHVybiB2ZGVjX2RldmljZV9uYW1lW3ZkZWMtPmZvcm1hdCAqIDIgKyAxXTsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19kZXZpY2VfbmFtZV9zdHIpOworCit2b2lkIHdhbGtfdmRlY19jb3JlX2xpc3QoY2hhciAqcykKK3sKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjOworCXN0cnVjdCB2ZGVjX2NvcmVfcyAqY29yZSA9IHZkZWNfY29yZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcHJfaW5mbygiJXMgLS0tPlxuIiwgcyk7CisKKwlmbGFncyA9IHZkZWNfY29yZV9sb2NrKHZkZWNfY29yZSk7CisKKwlpZiAobGlzdF9lbXB0eSgmY29yZS0+Y29ubmVjdGVkX3ZkZWNfbGlzdCkpIHsKKwkJcHJfaW5mbygiY29ubmVjdGVkIHZkZWMgbGlzdCBlbXB0eVxuIik7CisJfSBlbHNlIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2ZGVjLCAmY29yZS0+Y29ubmVjdGVkX3ZkZWNfbGlzdCwgbGlzdCkgeworCQkJcHJfaW5mbygiXHR2ZGVjICglcCksIHN0YXR1cyA9ICVzXG4iLCB2ZGVjLAorCQkJCXZkZWNfc3RhdHVzX3N0cih2ZGVjKSk7CisJCX0KKwl9CisKKwl2ZGVjX2NvcmVfdW5sb2NrKHZkZWNfY29yZSwgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTCh3YWxrX3ZkZWNfY29yZV9saXN0KTsKKworLyogaW5zZXJ0IHZkZWMgdG8gdmRlY19jb3JlIGZvciBzY2hlZHVsaW5nLAorICogZm9yIGR1YWwgcnVubmluZyBkZWNvZGVycywgY29ubmVjdC9kaXNjb25uZWN0IGFsd2F5cyBydW5zIGluIHBhaXJzCisgKi8KK2ludCB2ZGVjX2Nvbm5lY3Qoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLy90cmFjZV92ZGVjX2Nvbm5lY3QodmRlYyk7LypERUJVR19UTVAqLworCisJaWYgKHZkZWMtPnN0YXR1cyAhPSBWREVDX1NUQVRVU19ESVNDT05ORUNURUQpCisJCXJldHVybiAwOworCisJdmRlY19zZXRfc3RhdHVzKHZkZWMsIFZERUNfU1RBVFVTX0NPTk5FQ1RFRCk7CisJdmRlY19zZXRfbmV4dF9zdGF0dXModmRlYywgVkRFQ19TVEFUVVNfQ09OTkVDVEVEKTsKKworCWluaXRfY29tcGxldGlvbigmdmRlYy0+aW5hY3RpdmVfZG9uZSk7CisKKwlpZiAodmRlYy0+c2xhdmUpIHsKKwkJdmRlY19zZXRfc3RhdHVzKHZkZWMtPnNsYXZlLCBWREVDX1NUQVRVU19DT05ORUNURUQpOworCQl2ZGVjX3NldF9uZXh0X3N0YXR1cyh2ZGVjLT5zbGF2ZSwgVkRFQ19TVEFUVVNfQ09OTkVDVEVEKTsKKworCQlpbml0X2NvbXBsZXRpb24oJnZkZWMtPnNsYXZlLT5pbmFjdGl2ZV9kb25lKTsKKwl9CisKKwlmbGFncyA9IHZkZWNfY29yZV9sb2NrKHZkZWNfY29yZSk7CisKKwlsaXN0X2FkZF90YWlsKCZ2ZGVjLT5saXN0LCAmdmRlY19jb3JlLT5jb25uZWN0ZWRfdmRlY19saXN0KTsKKworCWlmICh2ZGVjLT5zbGF2ZSkgeworCQlsaXN0X2FkZF90YWlsKCZ2ZGVjLT5zbGF2ZS0+bGlzdCwKKwkJCSZ2ZGVjX2NvcmUtPmNvbm5lY3RlZF92ZGVjX2xpc3QpOworCX0KKworCXZkZWNfY29yZV91bmxvY2sodmRlY19jb3JlLCBmbGFncyk7CisKKwl1cCgmdmRlY19jb3JlLT5zZW0pOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfY29ubmVjdCk7CisKKy8qIHJlbW92ZSB2ZGVjIGZyb20gdmRlY19jb3JlIHNjaGVkdWxpbmcgKi8KK2ludCB2ZGVjX2Rpc2Nvbm5lY3Qoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9NVUxUSV9ERUMKKwl2ZGVjX3Byb2ZpbGUodmRlYywgVkRFQ19QUk9GSUxFX0VWRU5UX0RJU0NPTk5FQ1QpOworI2VuZGlmCisJLy90cmFjZV92ZGVjX2Rpc2Nvbm5lY3QodmRlYyk7LypERUJVR19UTVAqLworCisJaWYgKCh2ZGVjLT5zdGF0dXMgIT0gVkRFQ19TVEFUVVNfQ09OTkVDVEVEKSAmJgorCQkodmRlYy0+c3RhdHVzICE9IFZERUNfU1RBVFVTX0FDVElWRSkpIHsKKwkJcmV0dXJuIDA7CisJfQorCW11dGV4X2xvY2soJnZkZWNfbXV0ZXgpOworCS8qCisJICp3aGVuIGEgdmRlYyBpcyB1bmRlciB0aGUgbWFuYWdlbWVudCBvZiBzY2hlZHVsZXIKKwkgKiB0aGUgc3RhdHVzIGNoYW5nZSB3aWxsIG9ubHkgYmUgZnJvbSB2ZGVjX2NvcmVfdGhyZWFkCisJICovCisJdmRlY19zZXRfbmV4dF9zdGF0dXModmRlYywgVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEKTsKKworCWlmICh2ZGVjLT5zbGF2ZSkKKwkJdmRlY19zZXRfbmV4dF9zdGF0dXModmRlYy0+c2xhdmUsIFZERUNfU1RBVFVTX0RJU0NPTk5FQ1RFRCk7CisJZWxzZSBpZiAodmRlYy0+bWFzdGVyKQorCQl2ZGVjX3NldF9uZXh0X3N0YXR1cyh2ZGVjLT5tYXN0ZXIsIFZERUNfU1RBVFVTX0RJU0NPTk5FQ1RFRCk7CisJbXV0ZXhfdW5sb2NrKCZ2ZGVjX211dGV4KTsKKwl1cCgmdmRlY19jb3JlLT5zZW0pOworCisJaWYoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmdmRlYy0+aW5hY3RpdmVfZG9uZSwKKwkJbXNlY3NfdG9famlmZmllcygyMDAwKSkpCisJCWdvdG8gZGlzY29uX3RpbWVvdXQ7CisKKwlpZiAodmRlYy0+c2xhdmUpIHsKKwkJaWYoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmdmRlYy0+c2xhdmUtPmluYWN0aXZlX2RvbmUsCisJCQltc2Vjc190b19qaWZmaWVzKDIwMDApKSkKKwkJCWdvdG8gZGlzY29uX3RpbWVvdXQ7CisJfSBlbHNlIGlmICh2ZGVjLT5tYXN0ZXIpIHsKKwkJaWYoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmdmRlYy0+bWFzdGVyLT5pbmFjdGl2ZV9kb25lLAorCQkJbXNlY3NfdG9famlmZmllcygyMDAwKSkpCisJCQlnb3RvIGRpc2Nvbl90aW1lb3V0OworCX0KKworCXJldHVybiAwOworZGlzY29uX3RpbWVvdXQ6CisJcHJfZXJyKCIlcyB0aW1lb3V0ISEhIHN0YXR1czogMHgleCBmb3JjZSBpdCB0byAyXG4iLCBfX2Z1bmNfXywgdmRlYy0+c3RhdHVzKTsKKwlpZiAodmRlYy0+c3RhdHVzID09IFZERUNfU1RBVFVTX0FDVElWRSkgeworCQlpZiAodmRlYy0+aW5wdXQudGFyZ2V0ID09IFZERUNfSU5QVVRfVEFSR0VUX1ZMRCkgeworCQkJYW12ZGVjX3N0b3AoKTsKKwkJCVdSSVRFX1ZSRUcoQVNTSVNUX01CT1gxX01BU0ssIDApOworCQkJdmRlY19mcmVlX2lycShWREVDX0lSUV8xLCBOVUxMKTsKKwkJfSBlbHNlIGlmICh2ZGVjLT5pbnB1dC50YXJnZXQgPT0gVkRFQ19JTlBVVF9UQVJHRVRfSEVWQykgeworCQkJYW1oZXZjX3N0b3AoKTsKKwkJCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTUJPWDBfSVJRX1JFRywgMCk7CisJCQl2ZGVjX2ZyZWVfaXJxKFZERUNfSVJRXzAsIE5VTEwpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfZGlzY29ubmVjdCk7CisKKy8qIHJlbGVhc2UgdmRlYyBzdHJ1Y3R1cmUgKi8KK2ludCB2ZGVjX2Rlc3Ryb3koc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwkvL3RyYWNlX3ZkZWNfZGVzdHJveSh2ZGVjKTsvKkRFQlVHX1RNUCovCisKKwl2ZGVjX2lucHV0X3JlbGVhc2UoJnZkZWMtPmlucHV0KTsKKworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX01VTFRJX0RFQworCXZkZWNfcHJvZmlsZV9mbHVzaCh2ZGVjKTsKKyNlbmRpZgorCWlkYV9zaW1wbGVfcmVtb3ZlKCZ2ZGVjX2NvcmUtPmlkYSwgdmRlYy0+aWQpOworCWlmICh2ZGVjLT5tdmZybSkKKwkJdmZyZWUodmRlYy0+bXZmcm0pOworCXZmcmVlKHZkZWMpOworCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfVjRMX1ZJREVPMworCXY0bHZpZGVvX2RlY19jb3VudF9kZWNyZWFzZSgpOworI2VuZGlmCisJYXRvbWljX2RlYygmdmRlY19jb3JlLT52ZGVjX25yKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX2Rlc3Ryb3kpOworCitzdGF0aWMgYm9vbCBpc190dW5uZWxfcGlwZWxpbmUodTMyIHBsKQoreworCXJldHVybiAoKHBsICYgQklUKEZSQU1FX0JBU0VfUEFUSF9EVFZfVFVOTkVMX01PREUpKSB8fAorCQkocGwgJiBCSVQoRlJBTUVfQkFTRV9QQVRIX0FNTFZJREVPX0FNVklERU8pKSkgPworCQl0cnVlIDogZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGlzX3Jlc19sb2NrZWQodTMyIHByZSwgdTMyIGN1cikKK3sKKwlyZXR1cm4gaXNfdHVubmVsX3BpcGVsaW5lKHByZSkgPworCQkoaXNfdHVubmVsX3BpcGVsaW5lKGN1cikgPyB0cnVlIDogZmFsc2UpIDogZmFsc2U7Cit9CisKK2ludCB2ZGVjX3Jlc291cmNlX2NoZWNraW5nKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJLyoKKwkgKiBJZiBpdCBpcyB0aGUgc2luZ2xlIGluc3RhbmNlIHRoYXQgdGhlIHBpcGVsaW5lIG9mIERUViB1c2VkLAorCSAqIHRoZW4gaGF2ZSB0byBjaGVjayB0aGF0IHRoZSByZXNvdXJjZXMgd2hpY2ggaXMgYmVsb25nIHR1bm5lbAorCSAqIHBpcGVsaW5lIHRoZXNlIGFyZSBiZWluZyByZWxlYXNlZC4KKwkgKi8KKwl1bG9uZyBleHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjAwMCk7CisKKwl3aGlsZSAoaXNfcmVzX2xvY2tlZCh2ZGVjX2NvcmUtPnZkZWNfcmVzb3VjZV9zdGF0dXMsCisJCUJJVCh2ZGVjLT5mcmFtZV9iYXNlX3ZpZGVvX3BhdGgpKSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBleHBpcmVzKSkgeworCQkJcHJfZXJyKCJ3YWl0IHZkZWMgcmVzb3VyY2UgdGltZW91dC5cbiIpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlzY2hlZHVsZSgpOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3Jlc291cmNlX2NoZWNraW5nKTsKKworLyoKKyAqcmVnaXN0ZXIgdmRlY19kZXZpY2UKKyAqIGNyZWF0ZSBvdXRwdXQsIHZmbSBvciBjcmVhdGUgaW9udmlkZW8gb3V0cHV0CisgKi8KK3MzMiB2ZGVjX2luaXQoc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGlzXzRrLCBib29sIGlzX3Y0bCkKK3sKKwlpbnQgciA9IDA7CisJc3RydWN0IHZkZWNfcyAqcCA9IHZkZWM7CisJY29uc3QgY2hhciAqcGRldl9uYW1lOworCWNoYXIgZGV2X25hbWVbMzJdID0gezB9OworCWludCBpZCA9IFBMQVRGT1JNX0RFVklEX0FVVE87LyppZiBoYXZlIHVzZWQgbXkgc2VsZiovCisJaW50IG1heF9kaV9jb3VudCA9IG1heF9kaV9pbnN0YW5jZTsKKwljaGFyIHBvc3Rwcm9jZXNzX25hbWVbNjRdID0gezB9OworCWlmICh2ZGVjX3N0cmVhbV9iYXNlZCh2ZGVjKSkKKwkJbWF4X2RpX2NvdW50ID0gbWF4X3N1cHBvcnRlZF9kaV9pbnN0YW5jZTsKKwl2ZGVjLT5pc192NGwgPSBpc192NGwgPyAxIDogMDsKKwlpZiAoaXNfcmVzX2xvY2tlZCh2ZGVjX2NvcmUtPnZkZWNfcmVzb3VjZV9zdGF0dXMsCisJCUJJVCh2ZGVjLT5mcmFtZV9iYXNlX3ZpZGVvX3BhdGgpKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8vcHJfZXJyKCIlcyBbcGlkPSVkLHRnaWQ9JWRdXG4iLCBfX2Z1bmNfXywgY3VycmVudC0+cGlkLCBjdXJyZW50LT50Z2lkKTsKKwlwZGV2X25hbWUgPSBnZXRfZGV2X25hbWUodmRlY19zaW5nbGUodmRlYyksIHZkZWMtPmZvcm1hdCk7CisJaWYgKHBkZXZfbmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXNucHJpbnRmKGRldl9uYW1lLCBzaXplb2YoZGV2X25hbWUpLAorCQkiJXMlcyIsIHBkZXZfbmFtZSwgaXNfdjRsID8gIl92NGwiOiAiIik7CisKKwlwcl9pbmZvKCJ2ZGVjX2luaXQsIGRldl9uYW1lOiVzLCB2ZGVjX3R5cGU9JXMsIGZvcm1hdDogJWRcbiIsCisJCWRldl9uYW1lLCB2ZGVjX3R5cGVfc3RyKHZkZWMpLCB2ZGVjLT5mb3JtYXQpOworCisJc25wcmludGYodmRlYy0+bmFtZSwgc2l6ZW9mKHZkZWMtPm5hbWUpLAorCQkgInZkZWMtJWQiLCB2ZGVjLT5pZCk7CisJc25wcmludGYodmRlYy0+ZGVjX3NwZW5kX3RpbWUsIHNpemVvZih2ZGVjLT5kZWNfc3BlbmRfdGltZSksCisJCSAiJXMtZGVjX3NwZW5kX3RpbWUiLCB2ZGVjLT5uYW1lKTsKKwlzbnByaW50Zih2ZGVjLT5kZWNfc3BlbmRfdGltZV9hdmUsIHNpemVvZih2ZGVjLT5kZWNfc3BlbmRfdGltZV9hdmUpLAorCQkgIiVzLWRlY19zcGVuZF90aW1lX2F2ZSIsIHZkZWMtPm5hbWUpOworCisJLyoKKwkgKnRvZG86IFZGTSBwYXRjaCBjb250cm9sIHNob3VsZCBiZSBjb25maWd1cmFibGUsCisJICogZm9yIG5vdyBhbGwgc3RyZWFtIGJhc2VkIGlucHV0IHVzZXMgZGVmYXVsdCBWRk0gcGF0aC4KKwkgKi8KKwlpZiAoIWlzX3N1cHBvcnRfbm9fcGFyc2VyKCkpIHsKKwkJaWYgKHZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpICYmICF2ZGVjX2R1YWwodmRlYykpIHsKKwkJCWlmICh2ZGVjX2NvcmUtPnZmbV92ZGVjID09IE5VTEwpIHsKKwkJCQlwcl9kZWJ1ZygidmRlY19pbml0IHNldCB2Zm0gZGVjb2RlciAlcFxuIiwgdmRlYyk7CisJCQkJdmRlY19jb3JlLT52Zm1fdmRlYyA9IHZkZWM7CisJCQl9IGVsc2UgeworCQkJCXByX2luZm8oInZkZWNfaW5pdCB2Zm0gcGF0aCBidXN5LlxuIik7CisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCX0KKwkJfQorCX0KKworCW11dGV4X2xvY2soJnZkZWNfbXV0ZXgpOworCWluaXRlZF92Y29kZWNfbnVtKys7CisJbXV0ZXhfdW5sb2NrKCZ2ZGVjX211dGV4KTsKKworCXZkZWNfaW5wdXRfc2V0X3R5cGUoJnZkZWMtPmlucHV0LCB2ZGVjLT50eXBlLAorCQkJKHZkZWMtPmZvcm1hdCA9PSBWRk9STUFUX0hFVkMgfHwKKwkJCXZkZWMtPmZvcm1hdCA9PSBWRk9STUFUX0FWUzIgfHwKKwkJCXZkZWMtPmZvcm1hdCA9PSBWRk9STUFUX1ZQOSB8fAorCQkJdmRlYy0+Zm9ybWF0ID09IFZGT1JNQVRfQVYxCisJCQkpID8KKwkJCQlWREVDX0lOUFVUX1RBUkdFVF9IRVZDIDoKKwkJCQlWREVDX0lOUFVUX1RBUkdFVF9WTEQpOworCWlmICh2ZGVjX3NpbmdsZSh2ZGVjKSB8fCAodmRlY19nZXRfZGVidWdfZmxhZ3MoKSAmIDB4MikpCisJCXZkZWNfZW5hYmxlX0RNQyh2ZGVjKTsKKwlwLT5jbWFfZGV2ID0gdmRlY19jb3JlLT5jbWFfZGV2OworCisJdmRlY19jYW52YXNfcG9ydF9yZWdpc3Rlcih2ZGVjKTsKKworCXAtPnZkZWNfZnBzX2RldGVjID0gdmRlY19mcHNfZGV0ZWM7CisJLyogdG9kbyAqLworCWlmICghdmRlY19kdWFsKHZkZWMpKSB7CisJCXAtPnVzZV92Zm1fcGF0aCA9CisJCQlpc19zdXBwb3J0X25vX3BhcnNlcigpID8KKwkJCXZkZWNfc2luZ2xlKHZkZWMpIDoKKwkJCXZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpOworCX0KKworCWlmIChkZWJ1Z2ZsYWdzICYgKDEgPDwgMjkpKQorCQlwLT5pc19zdHJlYW1fbW9kZV9kdl9tdWx0aSA9IHRydWU7CisJZWxzZQorCQlwLT5pc19zdHJlYW1fbW9kZV9kdl9tdWx0aSA9IGZhbHNlOworCisJaWYgKGRlYnVnZmxhZ3MgJiAweDQpCisJCXAtPnVzZV92Zm1fcGF0aCA9IDE7CisJLyogdmRlY19kZXZfcmVnLmZsYWcgPSAwOyAqLworCWlmICh2ZGVjLT5pZCA+PSAwKQorCQlpZCA9IHZkZWMtPmlkOworCXAtPnBhcmFsbGVsX2RlYyA9IHBhcmFsbGVsX2RlY29kZTsKKwlwLT5wcm9nX29ubHkgPSBwcm9nX29ubHk7CisKKwl2ZGVjX2NvcmUtPnBhcmFsbGVsX2RlYyA9IHBhcmFsbGVsX2RlY29kZTsKKwl2ZGVjLT5jYW52YXNfbW9kZSA9IENBTlZBU19CTEtNT0RFXzMyWDMyOworI2lmZGVmIEZSQU1FX0NIRUNLCisJdmRlY19mcmFtZV9jaGVja19pbml0KHZkZWMpOworI2VuZGlmCisJLyogc3RyZWFtIGJ1ZmZlciBpbml0LiAqLworCWlmICh2ZGVjLT52YnVmLm9wcyAmJiAhdmRlYy0+bWFzdGVyKSB7CisJCXIgPSB2ZGVjLT52YnVmLm9wcy0+aW5pdCgmdmRlYy0+dmJ1ZiwgdmRlYyk7CisJCWlmIChyKSB7CisJCQlwcl9lcnIoIiVzIHN0cmVhbSBidWZmZXIgaW5pdCBlcnIgKCVkKVxuIiwgZGV2X25hbWUsIHIpOworCisJCQltdXRleF9sb2NrKCZ2ZGVjX211dGV4KTsKKwkJCWluaXRlZF92Y29kZWNfbnVtLS07CisJCQltdXRleF91bmxvY2soJnZkZWNfbXV0ZXgpOworCisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJaWYgKHZkZWMtPnNsYXZlKSB7CisJCQltZW1jcHkoJnZkZWMtPnNsYXZlLT52YnVmLCAmdmRlYy0+dmJ1ZiwKKwkJCQlzaXplb2YodmRlYy0+dmJ1ZikpOworCQl9CisJfQorCisJcC0+ZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX2RhdGEoCisJCQkJJnZkZWNfY29yZS0+dmRlY19jb3JlX3BsYXRmb3JtX2RldmljZS0+ZGV2LAorCQkJCWRldl9uYW1lLAorCQkJCWlkLAorCQkJCSZwLCBzaXplb2Yoc3RydWN0IHZkZWNfcyAqKSk7CisKKwlpZiAoSVNfRVJSKHAtPmRldikpIHsKKwkJciA9IFBUUl9FUlIocC0+ZGV2KTsKKwkJcHJfZXJyKCJ2ZGVjOiBEZWNvZGVyIGRldmljZSAlcyByZWdpc3RlciBmYWlsZWQgKCVkKVxuIiwKKwkJCWRldl9uYW1lLCByKTsKKworCQltdXRleF9sb2NrKCZ2ZGVjX211dGV4KTsKKwkJaW5pdGVkX3Zjb2RlY19udW0tLTsKKwkJbXV0ZXhfdW5sb2NrKCZ2ZGVjX211dGV4KTsKKworCQlnb3RvIGVycm9yOworCX0gZWxzZSBpZiAoIXAtPmRldi0+ZGV2LmRyaXZlcikgeworCQlwcl9pbmZvKCJ2ZGVjOiBEZWNvZGVyIGRldmljZSAlcyBkcml2ZXIgcHJvYmUgZmFpbGVkLlxuIiwKKwkJCWRldl9uYW1lKTsKKwkJciA9IC1FTk9ERVY7CisKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoKHAtPnR5cGUgPT0gVkRFQ19UWVBFX0ZSQU1FX0JMT0NLKSAmJiAocC0+cnVuID09IE5VTEwpKSB7CisJCXIgPSAtRU5PREVWOworCQlwcl9lcnIoInZkZWM6IERlY29kZXIgZGV2aWNlIG5vdCBoYW5kbGVkICglcylcbiIsIGRldl9uYW1lKTsKKworCQltdXRleF9sb2NrKCZ2ZGVjX211dGV4KTsKKwkJaW5pdGVkX3Zjb2RlY19udW0tLTsKKwkJbXV0ZXhfdW5sb2NrKCZ2ZGVjX211dGV4KTsKKworCQlnb3RvIGVycm9yOworCX0KKworCWlmIChwLT51c2VfdmZtX3BhdGgpIHsKKwkJdmRlYy0+dmZfcmVjZWl2ZXJfaW5zdCA9IC0xOworCQl2ZGVjLT52Zm1fbWFwX2lkWzBdID0gMDsKKwl9IGVsc2UgaWYgKCF2ZGVjX2R1YWwodmRlYykgJiYgIXZkZWMtPmRpc2FibGVfdmZtKSB7CisJCS8qIGNyZWF0ZSBJT05WSURFTyBpbnN0YW5jZSBhbmQgY29ubmVjdCBkZWNvZGVyJ3MKKwkJICogdmZfcHJvdmlkZXIgaW50ZXJmYWNlIHRvIGl0CisJCSAqLworCQlpZiAoIWlzX3N1cHBvcnRfbm9fcGFyc2VyKCkpIHsKKwkJCWlmIChwLT50eXBlICE9IFZERUNfVFlQRV9GUkFNRV9CTE9DSykgeworCQkJCXIgPSAtRU5PREVWOworCQkJCXByX2VycigidmRlYzogSW5jb3JyZWN0IGRlY29kZXIgdHlwZVxuIik7CisKKwkJCQltdXRleF9sb2NrKCZ2ZGVjX211dGV4KTsKKwkJCQlpbml0ZWRfdmNvZGVjX251bS0tOworCQkJCW11dGV4X3VubG9jaygmdmRlY19tdXRleCk7CisKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQl9CisKKwkJaWYgKHN0cm5jbXAoImRpc2FibGUiLCB2Zm1fcGF0aCwgc3RybGVuKCJkaXNhYmxlIikpKSB7CisJCQlzbnByaW50Zih2ZGVjLT52Zm1fbWFwX2NoYWluLCBWREVDX01BUF9OQU1FX1NJWkUsCisJCQkJIiVzICVzIiwgdmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwgdmZtX3BhdGgpOworCQkJc25wcmludGYodmRlYy0+dmZtX21hcF9pZCwgVkRFQ19NQVBfTkFNRV9TSVpFLAorCQkJCSJ2ZGVjLW1hcC0lZCIsIHZkZWMtPmlkKTsKKwkJfSBlbHNlIGlmIChwLT5mcmFtZV9iYXNlX3ZpZGVvX3BhdGggPT0gRlJBTUVfQkFTRV9QQVRIX0lPTlZJREVPKSB7CisjaWYgMQorCQkJciA9IGlvbnZpZGVvX2Fzc2lnbl9tYXAoJnZkZWMtPnZmX3JlY2VpdmVyX25hbWUsCisJCQkJCSZ2ZGVjLT52Zl9yZWNlaXZlcl9pbnN0KTsKKyNlbHNlCisJCQkvKgorCQkJICogdGVtcG9yYXJpbHkganVzdCB1c2UgZGVjb2RlciBpbnN0YW5jZSBJRCBhcyBpb25kcml2ZXIgSUQKKwkJCSAqIHRvIHNvbHZlIE9NWCBpb25kcml2ZXIgaW5zdGFuY2UgbnVtYmVyIGNoZWNrIHRpbWUgc2VxdWVuY2UKKwkJCSAqIG9ubHkgdGhlIGxpbWl0YXRpb24gaXMgd2UgY2FuIE5PVCBtaXggZGlmZmVyZW50IHZpZGVvCisJCQkgKiBkZWNvZGVycyBzaW5jZSBzYW1lIElEIHdpbGwgYmUgdXNlZCBmb3IgZGlmZmVyZW50IGRlY29kZXIKKwkJCSAqIGZvcm1hdHMuCisJCQkgKi8KKwkJCXZkZWMtPnZmX3JlY2VpdmVyX2luc3QgPSBwLT5kZXYtPmlkOworCQkJciA9IGlvbnZpZGVvX2Fzc2lnbl9tYXAoJnZkZWMtPnZmX3JlY2VpdmVyX25hbWUsCisJCQkJCSZ2ZGVjLT52Zl9yZWNlaXZlcl9pbnN0KTsKKyNlbmRpZgorCQkJaWYgKHIgPCAwKSB7CisJCQkJcHJfZXJyKCJJb25WaWRlbyBmcmFtZSByZWNlaXZlciBhbGxvY2F0aW9uIGZhaWxlZC5cbiIpOworCisJCQkJbXV0ZXhfbG9jaygmdmRlY19tdXRleCk7CisJCQkJaW5pdGVkX3Zjb2RlY19udW0tLTsKKwkJCQltdXRleF91bmxvY2soJnZkZWNfbXV0ZXgpOworCisJCQkJZ290byBlcnJvcjsKKwkJCX0KKworCQkJc25wcmludGYodmRlYy0+dmZtX21hcF9jaGFpbiwgVkRFQ19NQVBfTkFNRV9TSVpFLAorCQkJCSIlcyAlcyIsIHZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQkJdmRlYy0+dmZfcmVjZWl2ZXJfbmFtZSk7CisJCQlzbnByaW50Zih2ZGVjLT52Zm1fbWFwX2lkLCBWREVDX01BUF9OQU1FX1NJWkUsCisJCQkJInZkZWMtbWFwLSVkIiwgdmRlYy0+aWQpOworCQl9IGVsc2UgaWYgKHAtPmZyYW1lX2Jhc2VfdmlkZW9fcGF0aCA9PQorCQkJCUZSQU1FX0JBU0VfUEFUSF9BTUxWSURFT19BTVZJREVPKSB7CisJCQlpZiAodmRlY19zZWN1cmUodmRlYykpIHsKKwkJCQlzbnByaW50Zih2ZGVjLT52Zm1fbWFwX2NoYWluLCBWREVDX01BUF9OQU1FX1NJWkUsCisJCQkJCSIlcyAlcyIsIHZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQkJCSJhbWx2aWRlbyBhbXZpZGVvIik7CisJCQl9IGVsc2UgeworCQkJCWlmIChkZWJ1Z192ZGV0ZWN0KQorCQkJCQlzbnByaW50Zih2ZGVjLT52Zm1fbWFwX2NoYWluLAorCQkJCQkJIFZERUNfTUFQX05BTUVfU0laRSwKKwkJCQkJCSAiJXMgdmRldGVjdC4wICVzIiwKKwkJCQkJCSB2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJCQkJICJhbWx2aWRlbyBwcG1nciBkZWludGVybGFjZSBhbXZpZGVvIik7CisJCQkJZWxzZQorCQkJCQlzbnByaW50Zih2ZGVjLT52Zm1fbWFwX2NoYWluLAorCQkJCQkJIFZERUNfTUFQX05BTUVfU0laRSwgIiVzICVzIiwKKwkJCQkJCSB2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJCQkJICJhbWx2aWRlbyBwcG1nciBkZWludGVybGFjZSBhbXZpZGVvIik7CisJCQl9CisJCQlzbnByaW50Zih2ZGVjLT52Zm1fbWFwX2lkLCBWREVDX01BUF9OQU1FX1NJWkUsCisJCQkJInZkZWMtbWFwLSVkIiwgdmRlYy0+aWQpOworCQl9IGVsc2UgaWYgKHAtPmZyYW1lX2Jhc2VfdmlkZW9fcGF0aCA9PQorCQkJCUZSQU1FX0JBU0VfUEFUSF9BTUxWSURFTzFfQU1WSURFTzIpIHsKKwkJCXNucHJpbnRmKHZkZWMtPnZmbV9tYXBfY2hhaW4sIFZERUNfTUFQX05BTUVfU0laRSwKKwkJCQkiJXMgJXMiLCB2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJCSJhbWxfdmlkZW8uMSB2aWRlb3N5bmMuMCB2aWRlb3BpcCIpOworCQkJc25wcmludGYodmRlYy0+dmZtX21hcF9pZCwgVkRFQ19NQVBfTkFNRV9TSVpFLAorCQkJCSJ2ZGVjLW1hcC0lZCIsIHZkZWMtPmlkKTsKKwkJfSBlbHNlIGlmIChwLT5mcmFtZV9iYXNlX3ZpZGVvX3BhdGggPT0gRlJBTUVfQkFTRV9QQVRIX1Y0TF9PU0QpIHsKKwkJCXNucHJpbnRmKHZkZWMtPnZmbV9tYXBfY2hhaW4sIFZERUNfTUFQX05BTUVfU0laRSwKKwkJCQkiJXMgJXMiLCB2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJCXZkZWMtPnZmX3JlY2VpdmVyX25hbWUpOworCQkJc25wcmludGYodmRlYy0+dmZtX21hcF9pZCwgVkRFQ19NQVBfTkFNRV9TSVpFLAorCQkJCSJ2ZGVjLW1hcC0lZCIsIHZkZWMtPmlkKTsKKwkJfSBlbHNlIGlmIChwLT5mcmFtZV9iYXNlX3ZpZGVvX3BhdGggPT0gRlJBTUVfQkFTRV9QQVRIX1RVTk5FTF9NT0RFKSB7CisJCQlzbnByaW50Zih2ZGVjLT52Zm1fbWFwX2NoYWluLCBWREVDX01BUF9OQU1FX1NJWkUsCisJCQkJIiVzICVzIiwgdmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCQkiYW12aWRlbyIpOworCQkJc25wcmludGYodmRlYy0+dmZtX21hcF9pZCwgVkRFQ19NQVBfTkFNRV9TSVpFLAorCQkJCSJ2ZGVjLW1hcC0lZCIsIHZkZWMtPmlkKTsKKwkJfSBlbHNlIGlmIChwLT5mcmFtZV9iYXNlX3ZpZGVvX3BhdGggPT0gRlJBTUVfQkFTRV9QQVRIX1BJUF9UVU5ORUxfTU9ERSkgeworCQkJc25wcmludGYodmRlYy0+dmZtX21hcF9jaGFpbiwgVkRFQ19NQVBfTkFNRV9TSVpFLAorCQkJCSIlcyAlcyIsIHZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQkJInZpZGVvc3luYy4wIHZpZGVvcGlwIik7CisJCQlzbnByaW50Zih2ZGVjLT52Zm1fbWFwX2lkLCBWREVDX01BUF9OQU1FX1NJWkUsCisJCQkJInZkZWMtbWFwLSVkIiwgdmRlYy0+aWQpOworCQl9IGVsc2UgaWYgKHAtPmZyYW1lX2Jhc2VfdmlkZW9fcGF0aCA9PSBGUkFNRV9CQVNFX1BBVEhfVjRMX1ZJREVPKSB7CisJCQlzbnByaW50Zih2ZGVjLT52Zm1fbWFwX2NoYWluLCBWREVDX01BUF9OQU1FX1NJWkUsCisJCQkJIiVzICVzICVzIiwgdmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCQl2ZGVjLT52Zl9yZWNlaXZlcl9uYW1lLCAiYW12aWRlbyIpOworCQkJc25wcmludGYodmRlYy0+dmZtX21hcF9pZCwgVkRFQ19NQVBfTkFNRV9TSVpFLAorCQkJCSJ2ZGVjLW1hcC0lZCIsIHZkZWMtPmlkKTsKKwkJfSBlbHNlIGlmIChwLT5mcmFtZV9iYXNlX3ZpZGVvX3BhdGggPT0KKwkJCQlGUkFNRV9CQVNFX1BBVEhfRElfVjRMVklERU8pIHsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19WNExfVklERU8zCisJCQlyID0gdjRsdmlkZW9fYXNzaWduX21hcCgmdmRlYy0+dmZfcmVjZWl2ZXJfbmFtZSwKKwkJCQkJJnZkZWMtPnZmX3JlY2VpdmVyX2luc3QpOworI2Vsc2UKKwkJCXIgPSAtMTsKKyNlbmRpZgorCQkJIGlmIChyIDwgMCkgeworCQkJCXByX2VycigiVjRsVmlkZW8gZnJhbWUgcmVjZWl2ZXIgYWxsb2NhdGlvbiBmYWlsZWQuXG4iKTsKKwkJCQltdXRleF9sb2NrKCZ2ZGVjX211dGV4KTsKKwkJCQlpbml0ZWRfdmNvZGVjX251bS0tOworCQkJCW11dGV4X3VubG9jaygmdmRlY19tdXRleCk7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJCWlmICh2NGx2aWRlb19hZGRfcHBtZ3IpCisJCQkJc25wcmludGYocG9zdHByb2Nlc3NfbmFtZSwgc2l6ZW9mKHBvc3Rwcm9jZXNzX25hbWUpLAorCQkJCQkiJXMgIiwgInBwbWdyIik7CisJCQlpZiAoZGVidWdfdmRldGVjdCAmJiAodmRlYy0+dmZfcmVjZWl2ZXJfaW5zdCA9PSAwKSkKKwkJCQlzbnByaW50Zihwb3N0cHJvY2Vzc19uYW1lICsgc3RybGVuKHBvc3Rwcm9jZXNzX25hbWUpLCBzaXplb2YocG9zdHByb2Nlc3NfbmFtZSksCisJCQkJCSAiJXMgIiwgInZkZXRlY3QuMCIpOworCQkJLyogOEsgcmVtb3ZlIGRpICovCisJCQlpZiAoKHZkZWMtPnN5c19pbmZvLT53aWR0aCAqIHZkZWMtPnN5c19pbmZvLT5oZWlnaHQgPiAoNDA5NiAqIDIzMDQpKQorCQkJCXx8ICghdjRsdmlkZW9fYWRkX2RpKSkKKwkJCQlzbnByaW50Zih2ZGVjLT52Zm1fbWFwX2NoYWluLCBWREVDX01BUF9OQU1FX1NJWkUsCisJCQkJCSIlcyAlcyVzIiwgdmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCQkJcG9zdHByb2Nlc3NfbmFtZSwKKwkJCQkJdmRlYy0+dmZfcmVjZWl2ZXJfbmFtZSk7CisJCQllbHNlIHsKKwkJCQlpZiAoKHZkZWMtPnZmX3JlY2VpdmVyX2luc3QgPT0gMCkKKwkJCQkJJiYgKG1heF9kaV9jb3VudCA+IDApKQorCQkJCQlpZiAobWF4X2RpX2NvdW50ID09IDEpCisJCQkJCQlzbnByaW50Zih2ZGVjLT52Zm1fbWFwX2NoYWluLCBWREVDX01BUF9OQU1FX1NJWkUsCisJCQkJCQkJIiVzICVzJXMgJXMiLCB2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJCQkJCXBvc3Rwcm9jZXNzX25hbWUsCisJCQkJCQkJImRlaW50ZXJsYWNlIiwKKwkJCQkJCQl2ZGVjLT52Zl9yZWNlaXZlcl9uYW1lKTsKKwkJCQkJZWxzZQorCQkJCQkJc25wcmludGYodmRlYy0+dmZtX21hcF9jaGFpbiwgVkRFQ19NQVBfTkFNRV9TSVpFLAorCQkJCQkJCSIlcyAlcyVzICVzIiwgdmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCQkJCQlwb3N0cHJvY2Vzc19uYW1lLAorCQkJCQkJCSJkaW11bHRpLjEiLAorCQkJCQkJCXZkZWMtPnZmX3JlY2VpdmVyX25hbWUpOworCQkJCWVsc2UgaWYgKCh2ZGVjLT52Zl9yZWNlaXZlcl9pbnN0IDwKKwkJCQkJICBtYXhfZGlfY291bnQpICYmCisJCQkJCSAgKHZkZWMtPnZmX3JlY2VpdmVyX2luc3QgPT0gMSkpCisJCQkJCXNucHJpbnRmKHZkZWMtPnZmbV9tYXBfY2hhaW4sCisJCQkJCQkgVkRFQ19NQVBfTkFNRV9TSVpFLAorCQkJCQkJICIlcyAlcyAlcyIsCisJCQkJCQkgdmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCQkJCSAiZGVpbnRlcmxhY2UiLAorCQkJCQkJIHZkZWMtPnZmX3JlY2VpdmVyX25hbWUpOworCQkJCWVsc2UgaWYgKHZkZWMtPnZmX3JlY2VpdmVyX2luc3QgPAorCQkJCQkgbWF4X2RpX2NvdW50KQorCQkJCQlzbnByaW50Zih2ZGVjLT52Zm1fbWFwX2NoYWluLAorCQkJCQkJIFZERUNfTUFQX05BTUVfU0laRSwKKwkJCQkJCSAiJXMgJXMlZCAlcyIsCisJCQkJCQkgdmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCQkJCSAiZGltdWx0aS4iLAorCQkJCQkJIHZkZWMtPnZmX3JlY2VpdmVyX2luc3QsCisJCQkJCQkgdmRlYy0+dmZfcmVjZWl2ZXJfbmFtZSk7CisJCQkJZWxzZQorCQkJCQlzbnByaW50Zih2ZGVjLT52Zm1fbWFwX2NoYWluLCBWREVDX01BUF9OQU1FX1NJWkUsCisJCQkJCQkiJXMgJXMiLCB2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJCQkJdmRlYy0+dmZfcmVjZWl2ZXJfbmFtZSk7CisJCQl9CisJCQlzbnByaW50Zih2ZGVjLT52Zm1fbWFwX2lkLCBWREVDX01BUF9OQU1FX1NJWkUsCisJCQkJInZkZWMtbWFwLSVkIiwgdmRlYy0+aWQpOworCQl9IGVsc2UgaWYgKHAtPmZyYW1lX2Jhc2VfdmlkZW9fcGF0aCA9PQorCQkJCUZSQU1FX0JBU0VfUEFUSF9WNExWSURFTykgeworI2lmZGVmIENPTkZJR19BTUxPR0lDX1Y0TF9WSURFTzMKKwkJCXIgPSB2NGx2aWRlb19hc3NpZ25fbWFwKCZ2ZGVjLT52Zl9yZWNlaXZlcl9uYW1lLAorCQkJCQkmdmRlYy0+dmZfcmVjZWl2ZXJfaW5zdCk7CisjZWxzZQorCQkJciA9IC0xOworI2VuZGlmCisJCQlpZiAociA8IDApIHsKKwkJCQlwcl9lcnIoIlY0bFZpZGVvIGZyYW1lIHJlY2VpdmVyIGFsbG9jYXRpb24gZmFpbGVkLlxuIik7CisJCQkJbXV0ZXhfbG9jaygmdmRlY19tdXRleCk7CisJCQkJaW5pdGVkX3Zjb2RlY19udW0tLTsKKwkJCQltdXRleF91bmxvY2soJnZkZWNfbXV0ZXgpOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCQlzbnByaW50Zih2ZGVjLT52Zm1fbWFwX2NoYWluLCBWREVDX01BUF9OQU1FX1NJWkUsCisJCQkJIiVzICVzIiwgdmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCQl2ZGVjLT52Zl9yZWNlaXZlcl9uYW1lKTsKKwkJCXNucHJpbnRmKHZkZWMtPnZmbV9tYXBfaWQsIFZERUNfTUFQX05BTUVfU0laRSwKKwkJCQkidmRlYy1tYXAtJWQiLCB2ZGVjLT5pZCk7CisJCX0gZWxzZSBpZiAocC0+ZnJhbWVfYmFzZV92aWRlb19wYXRoID09CisJCQlGUkFNRV9CQVNFX1BBVEhfRFRWX1RVTk5FTF9NT0RFKSB7CisJCQlzbnByaW50Zih2ZGVjLT52Zm1fbWFwX2NoYWluLCBWREVDX01BUF9OQU1FX1NJWkUsCisJCQkJIiVzIGRlaW50ZXJsYWNlICVzIiwgdmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCQkiYW12aWRlbyIpOworCQkJc25wcmludGYodmRlYy0+dmZtX21hcF9pZCwgVkRFQ19NQVBfTkFNRV9TSVpFLAorCQkJCSJ2ZGVjLW1hcC0lZCIsIHZkZWMtPmlkKTsKKwkJfSBlbHNlIGlmIChwLT5mcmFtZV9iYXNlX3ZpZGVvX3BhdGggPT0KKwkJCUZSQU1FX0JBU0VfUEFUSF9BTUxWSURFT19GRU5DRSkgeworCQkJc25wcmludGYodmRlYy0+dmZtX21hcF9jaGFpbiwgVkRFQ19NQVBfTkFNRV9TSVpFLAorCQkJCSIlcyAlcyIsIHZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQkJImFtbHZpZGVvIGFtdmlkZW8iKTsKKwkJCXNucHJpbnRmKHZkZWMtPnZmbV9tYXBfaWQsIFZERUNfTUFQX05BTUVfU0laRSwKKwkJCQkidmRlYy1tYXAtJWQiLCB2ZGVjLT5pZCk7CisJCX0gZWxzZSBpZiAocC0+ZnJhbWVfYmFzZV92aWRlb19wYXRoID09CisJCQlGUkFNRV9CQVNFX1BBVEhfVjRMVklERU9fRkVOQ0UpIHsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19WNExfVklERU8zCisJCQlyID0gdjRsdmlkZW9fYXNzaWduX21hcCgmdmRlYy0+dmZfcmVjZWl2ZXJfbmFtZSwKKwkJCQkJJnZkZWMtPnZmX3JlY2VpdmVyX2luc3QpOworI2Vsc2UKKwkJCXIgPSAtMTsKKyNlbmRpZgorCQkJaWYgKHIgPCAwKSB7CisJCQkJcHJfZXJyKCJWNGxWaWRlbyBmcmFtZSByZWNlaXZlciBhbGxvY2F0aW9uIGZhaWxlZC5cbiIpOworCQkJCW11dGV4X2xvY2soJnZkZWNfbXV0ZXgpOworCQkJCWluaXRlZF92Y29kZWNfbnVtLS07CisJCQkJbXV0ZXhfdW5sb2NrKCZ2ZGVjX211dGV4KTsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCisJCQlzbnByaW50Zih2ZGVjLT52Zm1fbWFwX2NoYWluLCBWREVDX01BUF9OQU1FX1NJWkUsCisJCQkJCSIlcyAlcyIsIHZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQkJCXZkZWMtPnZmX3JlY2VpdmVyX25hbWUpOworCQkJc25wcmludGYodmRlYy0+dmZtX21hcF9pZCwgVkRFQ19NQVBfTkFNRV9TSVpFLAorCQkJCQkidmRlYy1tYXAtJWQiLCB2ZGVjLT5pZCk7CisJCX0KKworCQlpZiAodmZtX21hcF9hZGQodmRlYy0+dmZtX21hcF9pZCwKKwkJCQkJdmRlYy0+dmZtX21hcF9jaGFpbikgPCAwKSB7CisJCQlyID0gLUVOT01FTTsKKwkJCXByX2VycigiRGVjb2RlciBwaXBlbGluZSBtYXAgY3JlYXRpb24gZmFpbGVkICVzLlxuIiwKKwkJCQl2ZGVjLT52Zm1fbWFwX2lkKTsKKwkJCXZkZWMtPnZmbV9tYXBfaWRbMF0gPSAwOworCisJCQltdXRleF9sb2NrKCZ2ZGVjX211dGV4KTsKKwkJCWluaXRlZF92Y29kZWNfbnVtLS07CisJCQltdXRleF91bmxvY2soJnZkZWNfbXV0ZXgpOworCisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJcHJfZGVidWcoInZmbSBtYXAgJXMgY3JlYXRlZFxuIiwgdmRlYy0+dmZtX21hcF9pZCk7CisKKwkJLyoKKwkJICphc3N1bWUgSU9OVklERU8gZHJpdmVyIGFscmVhZHkgaGF2ZSBhIGZldyB2ZnJhbWVfcmVjZWl2ZXIKKwkJICogcmVnaXN0ZXJlZC4KKwkJICogMS4gQ2FsbCBpb25kcml2ZXIgZnVuY3Rpb24gdG8gYWxsb2NhdGUgYSBJT05WSURFTyBwYXRoIGFuZAorCQkgKiAgICBwcm92aWRlIHJlY2VpdmVyJ3MgbmFtZSBhbmQgcmVjZWl2ZXIgb3AuCisJCSAqIDIuIEdldCBkZWNvZGVyIGRyaXZlcidzIHByb3ZpZGVyIG5hbWUgZnJvbSBkcml2ZXIgaW5zdGFuY2UKKwkJICogMy4gdmZtX21hcF9hZGQobmFtZSwgIjxkZWNvZGVyIHByb3ZpZGVyIG5hbWU+CisJCSAqICAgIDxpb25kcml2ZXIgcmVjZWl2ZXIgbmFtZT4iKSwgZS5nLgorCQkgKiAgICB2Zm1fbWFwX2FkZCgidmRlY19pb25fbWFwXzAiLCAibXBlZzRfMCBpb25kcml2ZXJfMSIpOworCQkgKiA0LiB2Zl9yZWdfcHJvdmlkZXIgYW5kIHZmX3JlZ19yZWNlaXZlcgorCQkgKiBOb3RlOiB0aGUgZGVjb2RlciBwcm92aWRlcidzIG9wIHVzZXMgdmRlYyBhcyBvcF9hcmcKKwkJICogICAgICAgdGhlIGlvbmRyaXZlciByZWNlaXZlcidzIG9wIHVzZXMgaW9uZGV2IGRldmljZSBhcworCQkgKiAgICAgICBvcF9hcmcKKwkJICovCisKKwl9CisKKwlpZiAoIXZkZWNfc2luZ2xlKHZkZWMpICYmICF2ZGVjLT5kaXNhYmxlX3ZmbSkgeworCQl2Zl9yZWdfcHJvdmlkZXIoJnAtPnZmcmFtZV9wcm92aWRlcik7CisKKwkJdmZfbm90aWZ5X3JlY2VpdmVyKHAtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfU1RBUlQsCisJCQl2ZGVjKTsKKworCQlpZiAodmRlY19jb3JlLT5oaW50X2ZyX3ZkZWMgPT0gTlVMTCkKKwkJCXZkZWNfY29yZS0+aGludF9mcl92ZGVjID0gdmRlYzsKKworCQlpZiAodmRlY19jb3JlLT5oaW50X2ZyX3ZkZWMgPT0gdmRlYykgeworCQkJaWYgKHAtPnN5c19pbmZvLT5yYXRlICE9IDApIHsKKwkJCQlpZiAoIXZkZWMtPmlzX3Jlc2V0KSB7CisJCQkJCXZmX25vdGlmeV9yZWNlaXZlcihwLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX0ZSX0hJTlQsCisJCQkJCQkodm9pZCAqKQorCQkJCQkJKCh1bnNpZ25lZCBsb25nKQorCQkJCQkJcC0+c3lzX2luZm8tPnJhdGUpKTsKKwkJCQkJdmRlYy0+ZnJfaGludF9zdGF0ZSA9IFZERUNfSElOVEVEOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJdmRlYy0+ZnJfaGludF9zdGF0ZSA9IFZERUNfTkVFRF9ISU5UOworCQkJfQorCQl9CisJfQorCisJcC0+ZG9sYnlfbWV0YV93aXRoX2VsID0gMDsKKwlwcl9kZWJ1ZygidmRlY19pbml0LCB2Zl9wcm92aWRlcl9uYW1lID0gJXMsIGIgJWRcbiIsCisJCXAtPnZmX3Byb3ZpZGVyX25hbWUsIGlzX2NwdV90bTJfcmV2YigpKTsKKworCW11dGV4X2xvY2soJnZkZWNfbXV0ZXgpOworCXZkZWNfY29yZS0+dmRlY19yZXNvdWNlX3N0YXR1cyB8PSBCSVQocC0+ZnJhbWVfYmFzZV92aWRlb19wYXRoKTsKKwltdXRleF91bmxvY2soJnZkZWNfbXV0ZXgpOworCisJdmRlY19pbnB1dF9wcmVwYXJlX2J1ZnMoLypwcmVwYXJlZCBidWZmZXIgZm9yIGZhc3QgcGxheWluZy4qLworCQkmdmRlYy0+aW5wdXQsCisJCXZkZWMtPnN5c19pbmZvLT53aWR0aCwKKwkJdmRlYy0+c3lzX2luZm8tPmhlaWdodCk7CisJLyogdmRlYyBpcyBub3cgcmVhZHkgdG8gYmUgYWN0aXZlICovCisJdmRlY19zZXRfc3RhdHVzKHZkZWMsIFZERUNfU1RBVFVTX0RJU0NPTk5FQ1RFRCk7CisJcmV0dXJuIDA7CisKK2Vycm9yOgorCXJldHVybiByOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX2luaXQpOworCisvKgorICpSZW1vdmUgdGhlIHZkZWMgYWZ0ZXIgdGltZW91dCBoYXBwZW5zIGJvdGggaW4gdmRlY19kaXNjb25uZWN0CisgKmFuZCBwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlci4gVGhlbiBhZnRlciwgd2UgY2FuIHJlbGVhc2UgdGhlIHZkZWMuCisgKi8KK3N0YXRpYyB2b2lkIHZkZWNfY29ubmVjdF9saXN0X2ZvcmNlX2NsZWFyKHN0cnVjdCB2ZGVjX2NvcmVfcyAqY29yZSwgc3RydWN0IHZkZWNfcyAqdl9yZWYpCit7CisJc3RydWN0IHZkZWNfcyAqdmRlYywgKnRtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZmxhZ3MgPSB2ZGVjX2NvcmVfbG9jayhjb3JlKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2ZGVjLCB0bXAsCisJCSZjb3JlLT5jb25uZWN0ZWRfdmRlY19saXN0LCBsaXN0KSB7CisJCWlmICgodmRlYy0+c3RhdHVzID09IFZERUNfU1RBVFVTX0RJU0NPTk5FQ1RFRCkgJiYKKwkJICAgICh2ZGVjID09IHZfcmVmKSkgeworCQkgICAgcHJfZXJyKCIlcywgdmRlYyA9ICVwLCBhY3RpdmUgdmRlYyA9ICVwXG4iLAorCQkJCV9fZnVuY19fLCB2ZGVjLCBjb3JlLT5hY3RpdmVfdmRlYyk7CisJCQlpZiAodl9yZWYtPmFjdGl2ZV9tYXNrKQorCQkJCWNvcmUtPnNjaGVkX21hc2sgJj0gfnZfcmVmLT5hY3RpdmVfbWFzazsKKwkJCWlmIChjb3JlLT5hY3RpdmVfdmRlYyA9PSB2X3JlZikKKwkJCQljb3JlLT5hY3RpdmVfdmRlYyA9IE5VTEw7CisJCQlpZiAoY29yZS0+YWN0aXZlX2hldmMgPT0gdl9yZWYpCisJCQkJY29yZS0+YWN0aXZlX2hldmMgPSBOVUxMOworCQkJaWYgKGNvcmUtPmxhc3RfdmRlYyA9PSB2X3JlZikKKwkJCQljb3JlLT5sYXN0X3ZkZWMgPSBOVUxMOworCQkJbGlzdF9kZWwoJnZkZWMtPmxpc3QpOworCQl9CisJfQorCisJdmRlY19jb3JlX3VubG9jayhjb3JlLCBmbGFncyk7Cit9CisKK3N0X3VzZXJkYXRhICpnZXRfdmRlY191c2VyZGF0YV9jdHgoKQoreworCXJldHVybiAmdXNlcmRhdGE7Cit9CitFWFBPUlRfU1lNQk9MKGdldF92ZGVjX3VzZXJkYXRhX2N0eCk7CisKK3N0YXRpYyB2b2lkIHZkZWNfdXNlcmRhdGFfY3R4X3JlbGVhc2Uoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlpbnQgaTsKKwlzdF91c2VyZGF0YSAqdXNlcmRhdGEgPSBnZXRfdmRlY191c2VyZGF0YV9jdHgoKTsKKworCW11dGV4X2xvY2soJnVzZXJkYXRhLT5tdXRleCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1VTRVJEQVRBX0NIQU5ORUxfTlVNOyBpKyspIHsKKwkJaWYgKHVzZXJkYXRhLT51c2VkW2ldID09IDEgJiYgdmRlYy0+dmlkZW9faWQgIT0gMHhmZmZmZmZmZikgeworCQkJaWYgKHZkZWNfZ2V0X2RlYnVnX2ZsYWdzKCkgJiAweDEwMDAwMDAwKQorCQkJCXByX2luZm8oImN0eF9yZWxlYXNlIGk6ICVkIHVzZXJkYXRhLmlkICVkXG4iLAorCQkJCWksIHVzZXJkYXRhLT5pZFtpXSk7CisJCQl1c2VyZGF0YS0+cmVhZHlfZmxhZ1tpXSA9IDA7CisJCQl1c2VyZGF0YS0+aWRbaV0gPSAtMTsKKwkJCXVzZXJkYXRhLT51c2VkW2ldID0gMDsKKwkJCXVzZXJkYXRhLT5zZXRfaWRfZmxhZyA9IDA7CisJCX0KKwl9CisKKwltdXRleF91bmxvY2soJnVzZXJkYXRhLT5tdXRleCk7CisKKwlyZXR1cm47Cit9CisKKy8qIHZkZWNfY3JlYXRlL2luaXQvcmVsZWFzZS9kZXN0cm95IGFyZSBhcHBsaWVkIHRvIGJvdGggZHVhbCBydW5uaW5nIGRlY29kZXJzCisgKi8KK3ZvaWQgdmRlY19yZWxlYXNlKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJdTMyIHdjb3VudCA9IDA7CisKKwkvL3RyYWNlX3ZkZWNfcmVsZWFzZSh2ZGVjKTsvKkRFQlVHX1RNUCovCisjaWZkZWYgVkRFQ19ERUJVR19TVVBQT1JUCisJaWYgKHN0ZXBfbW9kZSkgeworCQlwcl9pbmZvKCJWREVDX0RFQlVHOiBpbiBzdGVwX21vZGUsIHdhaXQgcmVsZWFzZVxuIik7CisJCXdoaWxlIChzdGVwX21vZGUpCisJCQl1ZGVsYXkoMTApOworCQlwcl9pbmZvKCJWREVDX0RFQlVHOiBzdGVwX21vZGUgaXMgY2xlYXJcbiIpOworCX0KKyNlbmRpZgorCS8qIFdoZW4gcmVsZWFzZSwgdXNlcnNwYWNlIHN5c3RlbWN0bCBuZWVkIHRoaXMgZHVyYXRpb24gMCBldmVudCAqLworCXZkZWNfZnJhbWVfcmF0ZV91ZXZlbnQoMCk7CisJdmRlY19kaXNjb25uZWN0KHZkZWMpOworCisJaWYgKCF2ZGVjLT5kaXNhYmxlX3ZmbSAmJiB2ZGVjLT52ZnJhbWVfcHJvdmlkZXIubmFtZSkgeworCQlpZiAoIXZkZWNfc2luZ2xlKHZkZWMpKSB7CisJCQlpZiAodmRlY19jb3JlLT5oaW50X2ZyX3ZkZWMgPT0gdmRlYworCQkJJiYgdmRlYy0+ZnJfaGludF9zdGF0ZSA9PSBWREVDX0hJTlRFRCkKKwkJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoCisJCQkJCXZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9GUl9FTkRfSElOVCwKKwkJCQkJTlVMTCk7CisJCQl2ZGVjLT5mcl9oaW50X3N0YXRlID0gVkRFQ19OT19ORUVEX0hJTlQ7CisJCX0KKwkJdmZfdW5yZWdfcHJvdmlkZXIoJnZkZWMtPnZmcmFtZV9wcm92aWRlcik7CisJfQorCisJaWYgKHZkZWNfY29yZS0+dmZtX3ZkZWMgPT0gdmRlYykKKwkJdmRlY19jb3JlLT52Zm1fdmRlYyA9IE5VTEw7CisKKwlpZiAodmRlY19jb3JlLT5oaW50X2ZyX3ZkZWMgPT0gdmRlYykKKwkJdmRlY19jb3JlLT5oaW50X2ZyX3ZkZWMgPSBOVUxMOworCisJaWYgKHZkZWMtPnZmX3JlY2VpdmVyX2luc3QgPj0gMCkgeworCQlpZiAodmRlYy0+dmZtX21hcF9pZFswXSkgeworCQkJdmZtX21hcF9yZW1vdmUodmRlYy0+dmZtX21hcF9pZCk7CisJCQl2ZGVjLT52Zm1fbWFwX2lkWzBdID0gMDsKKwkJfQorCX0KKworCXdoaWxlICh2ZGVjLT5pcnFfY250ID4gdmRlYy0+aXJxX3RocmVhZF9jbnQpIHsKKwkJaWYgKCh3Y291bnQgJiAweDFmKSA9PSAwKQorCQkJcHJfZGVidWcoIiVzIHZkZWNbJWx4XTogJWxsZCA+ICVsbGQsIGxvb3AgJXUgdGltZXNcbiIsX19mdW5jX18sICh1bnNpZ25lZCBsb25nKXZkZWMsCisJCQkJdmRlYy0+aXJxX2NudCx2ZGVjLT5pcnFfdGhyZWFkX2NudCwgd2NvdW50KTsKKwkJLyoKKwkJICogV2FpdCBhdCBtb3N0IDIwMDAgbXMuCisJCSAqIEluIHN1c3BlbmQgc2NlbmFyaW8sIHRoZSBzeXN0ZW0gbWF5IGRpc2FibGUgdGhyZWFkX2ZuLAorCQkgKiB0aHVzIGNhbiBOT1QgYWx3YXlzIHdhaXRpbmcgdGhlIHRocmVhZF9mbiBoYXBwZW4KKwkJICovCisJCWlmICgrK3djb3VudCA+IDEwMDApCisJCQlicmVhazsKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOworCX0KKworI2lmZGVmIEZSQU1FX0NIRUNLCisJdmRlY19mcmFtZV9jaGVja19leGl0KHZkZWMpOworI2VuZGlmCisJdmRlY19mcHNfY2xlYXIodmRlYy0+aWQpOworCWlmIChhdG9taWNfcmVhZCgmdmRlY19jb3JlLT52ZGVjX25yKSA9PSAxKQorCQl2ZGVjX2Rpc2FibGVfRE1DKHZkZWMpOworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHZkZWMtPmRldik7CisJLypDaGVjayBpZiB0aGUgdmRlYyBzdGlsbCBpbiBjb25uZWN0ZWQgbGlzdCwgaWYgeWVzLCBkZWxldGUgaXQqLworCXZkZWNfY29ubmVjdF9saXN0X2ZvcmNlX2NsZWFyKHZkZWNfY29yZSwgdmRlYyk7CisKKwlpZiAodmRlYy0+dmJ1Zi5vcHMgJiYgIXZkZWMtPm1hc3RlcikKKwkJdmRlYy0+dmJ1Zi5vcHMtPnJlbGVhc2UoJnZkZWMtPnZidWYpOworCisJdmRlY191c2VyZGF0YV9jdHhfcmVsZWFzZSh2ZGVjKTsKKworCXByX2RlYnVnKCJ2ZGVjX3JlbGVhc2UgaW5zdGFuY2UgJXAsIHRvdGFsICVkXG4iLCB2ZGVjLAorCQlhdG9taWNfcmVhZCgmdmRlY19jb3JlLT52ZGVjX25yKSk7CisKKwltdXRleF9sb2NrKCZ2ZGVjX211dGV4KTsKKwl2ZGVjX2NvcmUtPnZkZWNfcmVzb3VjZV9zdGF0dXMgJj0gfkJJVCh2ZGVjLT5mcmFtZV9iYXNlX3ZpZGVvX3BhdGgpOworCW11dGV4X3VubG9jaygmdmRlY19tdXRleCk7CisJdmRlY19kZXN0cm95KHZkZWMpOworCisJbXV0ZXhfbG9jaygmdmRlY19tdXRleCk7CisJaW5pdGVkX3Zjb2RlY19udW0tLTsKKwltdXRleF91bmxvY2soJnZkZWNfbXV0ZXgpOworCit9CitFWFBPUlRfU1lNQk9MKHZkZWNfcmVsZWFzZSk7CisKKy8qIEZvciBkdWFsIHJ1bm5pbmcgZGVjb2RlcnMsIHZkZWNfcmVzZXQgaXMgb25seSBjYWxsZWQgd2l0aCBtYXN0ZXIgdmRlYy4KKyAqLworaW50IHZkZWNfcmVzZXQoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwkvL3RyYWNlX3ZkZWNfcmVzZXQodmRlYyk7IC8qREVCVUdfVE1QKi8KKworCXZkZWNfZGlzY29ubmVjdCh2ZGVjKTsKKworCWlmICghdmRlYy0+ZGlzYWJsZV92Zm0pIHsKKwkJaWYgKHZkZWMtPnZmcmFtZV9wcm92aWRlci5uYW1lKQorCQkJdmZfdW5yZWdfcHJvdmlkZXIoJnZkZWMtPnZmcmFtZV9wcm92aWRlcik7CisKKwkJaWYgKCh2ZGVjLT5zbGF2ZSkgJiYgKHZkZWMtPnNsYXZlLT52ZnJhbWVfcHJvdmlkZXIubmFtZSkpCisJCQl2Zl91bnJlZ19wcm92aWRlcigmdmRlYy0+c2xhdmUtPnZmcmFtZV9wcm92aWRlcik7CisJfQorCisJaWYgKHZkZWMtPnJlc2V0KSB7CisJCXZkZWMtPnJlc2V0KHZkZWMpOworCQlpZiAodmRlYy0+c2xhdmUpCisJCQl2ZGVjLT5zbGF2ZS0+cmVzZXQodmRlYy0+c2xhdmUpOworCX0KKwl2ZGVjLT5tY19sb2FkZWQgPSAwOy8qY2xlYXIgZm9yIHJlbG9hZCBmaXJtd2FyZSovCisJdmRlY19pbnB1dF9yZWxlYXNlKCZ2ZGVjLT5pbnB1dCk7CisKKwl2ZGVjX2lucHV0X2luaXQoJnZkZWMtPmlucHV0LCB2ZGVjKTsKKworCXZkZWNfaW5wdXRfcHJlcGFyZV9idWZzKCZ2ZGVjLT5pbnB1dCwgdmRlYy0+c3lzX2luZm8tPndpZHRoLAorCQl2ZGVjLT5zeXNfaW5mby0+aGVpZ2h0KTsKKworCWlmICghdmRlYy0+ZGlzYWJsZV92Zm0pIHsKKwkJdmZfcmVnX3Byb3ZpZGVyKCZ2ZGVjLT52ZnJhbWVfcHJvdmlkZXIpOworCQl2Zl9ub3RpZnlfcmVjZWl2ZXIodmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfU1RBUlQsIHZkZWMpOworCisJCWlmICh2ZGVjLT5zbGF2ZSkgeworCQkJdmZfcmVnX3Byb3ZpZGVyKCZ2ZGVjLT5zbGF2ZS0+dmZyYW1lX3Byb3ZpZGVyKTsKKwkJCXZmX25vdGlmeV9yZWNlaXZlcih2ZGVjLT5zbGF2ZS0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfU1RBUlQsIHZkZWMtPnNsYXZlKTsKKwkJCXZkZWMtPnNsYXZlLT5tY19sb2FkZWQgPSAwOy8qY2xlYXIgZm9yIHJlbG9hZCBmaXJtd2FyZSovCisJCX0KKwl9CisKKwl2ZGVjX2Nvbm5lY3QodmRlYyk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19yZXNldCk7CisKK2ludCB2ZGVjX3Y0bDJfcmVzZXQoc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGZsYWcpCit7CisJLy90cmFjZV92ZGVjX3Jlc2V0KHZkZWMpOyAvKkRFQlVHX1RNUCovCisJcHJfZGVidWcoInZkZWNfdjRsMl9yZXNldCAlZFxuIiwgZmxhZyk7CisJdmRlY19kaXNjb25uZWN0KHZkZWMpOworCWlmIChmbGFnICE9IDIpIHsKKwkJaWYgKCF2ZGVjLT5kaXNhYmxlX3ZmbSkgeworCQkJaWYgKHZkZWMtPnZmcmFtZV9wcm92aWRlci5uYW1lKQorCQkJCXZmX3VucmVnX3Byb3ZpZGVyKCZ2ZGVjLT52ZnJhbWVfcHJvdmlkZXIpOworCisJCQlpZiAoKHZkZWMtPnNsYXZlKSAmJiAodmRlYy0+c2xhdmUtPnZmcmFtZV9wcm92aWRlci5uYW1lKSkKKwkJCQl2Zl91bnJlZ19wcm92aWRlcigmdmRlYy0+c2xhdmUtPnZmcmFtZV9wcm92aWRlcik7CisJCX0KKworCQlpZiAodmRlYy0+cmVzZXQpIHsKKwkJCXZkZWMtPnJlc2V0KHZkZWMpOworCQkJaWYgKHZkZWMtPnNsYXZlKQorCQkJCXZkZWMtPnNsYXZlLT5yZXNldCh2ZGVjLT5zbGF2ZSk7CisJCX0KKwkJdmRlYy0+bWNfbG9hZGVkID0gMDsvKmNsZWFyIGZvciByZWxvYWQgZmlybXdhcmUqLworCisJCXZkZWNfaW5wdXRfcmVsZWFzZSgmdmRlYy0+aW5wdXQpOworCisJCXZkZWNfaW5wdXRfaW5pdCgmdmRlYy0+aW5wdXQsIHZkZWMpOworCisJCXZkZWNfaW5wdXRfcHJlcGFyZV9idWZzKCZ2ZGVjLT5pbnB1dCwgdmRlYy0+c3lzX2luZm8tPndpZHRoLAorCQkJdmRlYy0+c3lzX2luZm8tPmhlaWdodCk7CisKKwkJaWYgKCF2ZGVjLT5kaXNhYmxlX3ZmbSkgeworCQkJdmZfcmVnX3Byb3ZpZGVyKCZ2ZGVjLT52ZnJhbWVfcHJvdmlkZXIpOworCQkJdmZfbm90aWZ5X3JlY2VpdmVyKHZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9TVEFSVCwgdmRlYyk7CisKKwkJCWlmICh2ZGVjLT5zbGF2ZSkgeworCQkJCXZmX3JlZ19wcm92aWRlcigmdmRlYy0+c2xhdmUtPnZmcmFtZV9wcm92aWRlcik7CisJCQkJdmZfbm90aWZ5X3JlY2VpdmVyKHZkZWMtPnNsYXZlLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfU1RBUlQsIHZkZWMtPnNsYXZlKTsKKwkJCQl2ZGVjLT5zbGF2ZS0+bWNfbG9hZGVkID0gMDsvKmNsZWFyIGZvciByZWxvYWQgZmlybXdhcmUqLworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWYgKHZkZWMtPnJlc2V0KSB7CisJCQl2ZGVjLT5yZXNldCh2ZGVjKTsKKwkJCWlmICh2ZGVjLT5zbGF2ZSkKKwkJCQl2ZGVjLT5zbGF2ZS0+cmVzZXQodmRlYy0+c2xhdmUpOworCQl9CisJfQorCisJdmRlY19jb25uZWN0KHZkZWMpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfdjRsMl9yZXNldCk7CisKK3ZvaWQgdmRlY19mcmVlX2NtYWJ1Zih2b2lkKQoreworCW11dGV4X2xvY2soJnZkZWNfbXV0ZXgpOworCisJLyppZiAoaW5pdGVkX3Zjb2RlY19udW0gPiAwKSB7CisJCW11dGV4X3VubG9jaygmdmRlY19tdXRleCk7CisJCXJldHVybjsKKwl9Ki8KKwltdXRleF91bmxvY2soJnZkZWNfbXV0ZXgpOworfQorCit2b2lkIHZkZWNfY29yZV9yZXF1ZXN0KHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKwl2ZGVjLT5jb3JlX21hc2sgfD0gbWFzazsKKworCWlmICh2ZGVjLT5zbGF2ZSkKKwkJdmRlYy0+c2xhdmUtPmNvcmVfbWFzayB8PSBtYXNrOworCWlmICh2ZGVjX2NvcmUtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCWlmIChtYXNrICYgQ09SRV9NQVNLX0NPTUJJTkUpCisJCQl2ZGVjX2NvcmUtPnZkZWNfY29tYmluZV9mbGFnKys7CisJfQorCit9CitFWFBPUlRfU1lNQk9MKHZkZWNfY29yZV9yZXF1ZXN0KTsKKworaW50IHZkZWNfY29yZV9yZWxlYXNlKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKwl2ZGVjLT5jb3JlX21hc2sgJj0gfm1hc2s7CisKKwlpZiAodmRlYy0+c2xhdmUpCisJCXZkZWMtPnNsYXZlLT5jb3JlX21hc2sgJj0gfm1hc2s7CisJaWYgKHZkZWNfY29yZS0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJaWYgKG1hc2sgJiBDT1JFX01BU0tfQ09NQklORSkKKwkJCXZkZWNfY29yZS0+dmRlY19jb21iaW5lX2ZsYWctLTsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfY29yZV9yZWxlYXNlKTsKKworYm9vbCB2ZGVjX2NvcmVfd2l0aF9pbnB1dCh1bnNpZ25lZCBsb25nIG1hc2spCit7CisJZW51bSB2ZGVjX3R5cGVfZSB0eXBlOworCisJZm9yICh0eXBlID0gVkRFQ18xOyB0eXBlIDwgVkRFQ19NQVg7IHR5cGUrKykgeworCQlpZiAoKG1hc2sgJiAoMSA8PCB0eXBlKSkgJiYgY29yZXNfd2l0aF9pbnB1dFt0eXBlXSkKKwkJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKwordm9pZCB2ZGVjX2NvcmVfZmluaXNoX3J1bihzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1bnNpZ25lZCBsb25nIG1hc2spCit7CisJdW5zaWduZWQgbG9uZyBpOworCXVuc2lnbmVkIGxvbmcgdCA9IG1hc2s7CisJbXV0ZXhfbG9jaygmdmRlY19tdXRleCk7CisJd2hpbGUgKHQpIHsKKwkJaSA9IF9fZmZzKHQpOworCQljbGVhcl9iaXQoaSwgJnZkZWMtPmFjdGl2ZV9tYXNrKTsKKwkJdCAmPSB+KDEgPDwgaSk7CisJfQorCisJaWYgKHZkZWMtPmFjdGl2ZV9tYXNrID09IDApIHsKKwkJdmRlY19zZXRfc3RhdHVzKHZkZWMsIFZERUNfU1RBVFVTX0NPTk5FQ1RFRCk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdmRlYy0+aWRsZV93YWl0KTsKKwl9CisKKwltdXRleF91bmxvY2soJnZkZWNfbXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX2NvcmVfZmluaXNoX3J1bik7CisvKgorICogZmluZCB3aGF0IGNvcmUgcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUgZm9yIHZkZWMKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgdmRlY19zY2hlZHVsZV9tYXNrKHN0cnVjdCB2ZGVjX3MgKnZkZWMsCisJdW5zaWduZWQgbG9uZyBhY3RpdmVfbWFzaykKK3sKKwl1bnNpZ25lZCBsb25nIG1hc2sgPSB2ZGVjLT5jb3JlX21hc2sgJgorCQl+Q09SRV9NQVNLX0NPTUJJTkU7CisKKwlpZiAodmRlYy0+Y29yZV9tYXNrICYgQ09SRV9NQVNLX0NPTUJJTkUpIHsKKwkJLyogY29tYmluZWQgY29yZXMgbXVzdCBiZSBncmFudGVkIHRvZ2V0aGVyICovCisJCWlmICgobWFzayAmIH5hY3RpdmVfbWFzaykgPT0gbWFzaykKKwkJCXJldHVybiBtYXNrOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9IGVsc2UKKwkJcmV0dXJuIG1hc2sgJiB+dmRlYy0+c2NoZWRfbWFzayAmIH5hY3RpdmVfbWFzazsKK30KKworLyoKKyAqRGVjb2RlciBjYWxsYmFjaworICogRWFjaCBkZWNvZGVyIGluc3RhbmNlIHVzZXMgdGhpcyBjYWxsYmFjayB0byBub3RpZnkgc3RhdHVzIGNoYW5nZSwgZS5nLiB3aGVuCisgKiBkZWNvZGVyIGZpbmlzaGVkIHVzaW5nIEhXIHJlc291cmNlLgorICogYSBzYW1wbGUgY2FsbGJhY2sgZnJvbSBkZWNvZGVyJ3MgZHJpdmVyIGlzIGZvbGxvd2luZzoKKyAqCisgKiAgICAgICAgaWYgKGh3LT52ZGVjX2NiKSB7CisgKiAgICAgICAgICAgIHZkZWNfc2V0X25leHRfc3RhdHVzKHZkZWMsIFZERUNfU1RBVFVTX0NPTk5FQ1RFRCk7CisgKiAgICAgICAgICAgIGh3LT52ZGVjX2NiKHZkZWMsIGh3LT52ZGVjX2NiX2FyZyk7CisgKiAgICAgICAgfQorICovCitzdGF0aWMgdm9pZCB2ZGVjX2NhbGxiYWNrKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHZkZWNfY29yZV9zICpjb3JlID0gKHN0cnVjdCB2ZGVjX2NvcmVfcyAqKWRhdGE7CisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9NVUxUSV9ERUMKKwl2ZGVjX3Byb2ZpbGUodmRlYywgVkRFQ19QUk9GSUxFX0VWRU5UX0NCKTsKKyNlbmRpZgorCisJdXAoJmNvcmUtPnNlbSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB2ZGVjX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHZkZWNfaXNyX2NvbnRleHRfcyAqYyA9CisJCShzdHJ1Y3QgdmRlY19pc3JfY29udGV4dF9zICopZGV2X2lkOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSB2ZGVjX2NvcmUtPmxhc3RfdmRlYzsKKwlpcnFyZXR1cm5fdCByZXQgPSBJUlFfSEFORExFRDsKKworCWlmICh2ZGVjX2NvcmUtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCWlmIChpcnEgPT0gdmRlY19jb3JlLT5pc3JfY29udGV4dFtWREVDX0lSUV8wXS5pcnEpCisJCQl2ZGVjID0gdmRlY19jb3JlLT5hY3RpdmVfaGV2YzsKKwkJZWxzZSBpZiAoaXJxID09IHZkZWNfY29yZS0+aXNyX2NvbnRleHRbVkRFQ19JUlFfMV0uaXJxKQorCQkJdmRlYyA9IHZkZWNfY29yZS0+YWN0aXZlX3ZkZWM7CisJCWVsc2UKKwkJCXZkZWMgPSBOVUxMOworCX0KKworCWlmIChjLT5kZXZfaXNyKSB7CisJCXJldCA9IGMtPmRldl9pc3IoaXJxLCBjLT5kZXZfaWQpOworCQlnb3RvIGlzcl9kb25lOworCX0KKworCWlmICgoYyAhPSAmdmRlY19jb3JlLT5pc3JfY29udGV4dFtWREVDX0lSUV8wXSkgJiYKKwkgICAgKGMgIT0gJnZkZWNfY29yZS0+aXNyX2NvbnRleHRbVkRFQ19JUlFfMV0pICYmCisJICAgIChjICE9ICZ2ZGVjX2NvcmUtPmlzcl9jb250ZXh0W1ZERUNfSVJRX0hFVkNfQkFDS10pKSB7CisjaWYgMAorCQlwcl93YXJuKCJ2ZGVjIGludGVycnVwdCB3L28gYSB2YWxpZCByZWNlaXZlclxuIik7CisjZW5kaWYKKwkJZ290byBpc3JfZG9uZTsKKwl9CisKKwlpZiAoIXZkZWMpIHsKKyNpZiAwCisJCXByX3dhcm4oInZkZWMgaW50ZXJydXB0IHcvbyBhbiBhY3RpdmUgaW5zdGFuY2UgcnVubmluZy4gY29yZSA9ICVwXG4iLAorCQkJY29yZSk7CisjZW5kaWYKKwkJZ290byBpc3JfZG9uZTsKKwl9CisKKwlpZiAoIXZkZWMtPmlycV9oYW5kbGVyKSB7CisjaWYgMAorCQlwcl93YXJuKCJ2ZGVjIGluc3RhbmNlIGhhcyBubyBpcnEgaGFuZGxlLlxuIik7CisjZW5kaWYKKwkJZ290byAgaXNyX2RvbmU7CisJfQorCisJcmV0ID0gdmRlYy0+aXJxX2hhbmRsZXIodmRlYywgYy0+aW5kZXgpOworaXNyX2RvbmU6CisJaWYgKHZkZWMgJiYgcmV0ID09IElSUV9XQUtFX1RIUkVBRCkKKwkJdmRlYy0+aXJxX2NudCsrOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlycXJldHVybl90IHZkZWNfdGhyZWFkX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHZkZWNfaXNyX2NvbnRleHRfcyAqYyA9CisJCShzdHJ1Y3QgdmRlY19pc3JfY29udGV4dF9zICopZGV2X2lkOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSB2ZGVjX2NvcmUtPmxhc3RfdmRlYzsKKwlpcnFyZXR1cm5fdCByZXQgPSBJUlFfSEFORExFRDsKKworCWlmICh2ZGVjX2NvcmUtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCWlmIChpcnEgPT0gdmRlY19jb3JlLT5pc3JfY29udGV4dFtWREVDX0lSUV8wXS5pcnEpCisJCQl2ZGVjID0gdmRlY19jb3JlLT5hY3RpdmVfaGV2YzsKKwkJZWxzZSBpZiAoaXJxID09IHZkZWNfY29yZS0+aXNyX2NvbnRleHRbVkRFQ19JUlFfMV0uaXJxKQorCQkJdmRlYyA9IHZkZWNfY29yZS0+YWN0aXZlX3ZkZWM7CisJCWVsc2UKKwkJCXZkZWMgPSBOVUxMOworCX0KKworCWlmIChjLT5kZXZfdGhyZWFkZWRfaXNyKSB7CisJCXJldCA9IGMtPmRldl90aHJlYWRlZF9pc3IoaXJxLCBjLT5kZXZfaWQpOworCQlnb3RvIHRocmVhZF9pc3JfZG9uZTsKKwl9CisJaWYgKCF2ZGVjKQorCQlnb3RvIHRocmVhZF9pc3JfZG9uZTsKKworCWlmICghdmRlYy0+dGhyZWFkZWRfaXJxX2hhbmRsZXIpCisJCWdvdG8gdGhyZWFkX2lzcl9kb25lOworCXJldCA9IHZkZWMtPnRocmVhZGVkX2lycV9oYW5kbGVyKHZkZWMsIGMtPmluZGV4KTsKK3RocmVhZF9pc3JfZG9uZToKKwlpZiAodmRlYykKKwkJdmRlYy0+aXJxX3RocmVhZF9jbnQrKzsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgdmRlY19jaGVja19yZWNfbnVtX2Vub3VnaChzdHJ1Y3QgdmRlY19zICp2ZGVjKSB7CisKKwlpZiAodmRlYy0+dmJ1Zi51c2VfcHRzc2VydikgeworCQlyZXR1cm4gKHB0c19nZXRfcmVjX251bShQVFNfVFlQRV9WSURFTywKKwkJCQkJdmRlYy0+aW5wdXQudG90YWxfcmRfY291bnQpID49IDIpOworCX0gZWxzZSB7CisJCXU2NCB0b3RhbF9yZF9jb3VudCA9IHZkZWMtPmlucHV0LnRvdGFsX3JkX2NvdW50OworCisJCWlmICh2ZGVjLT5pbnB1dC50YXJnZXQgPT0gVkRFQ19JTlBVVF9UQVJHRVRfVkxEKSB7CisJCQkvL3RvdGFsX3JkX2NvdW50IC09IHZkZWMtPmlucHV0LnN0YXJ0OworCQkJLypqdXN0IGxpa2UgdXNlIHB0c3NlcnYsIGFsd2F5IHJldHVybiB0cnVlKi8KKwkJCXJldHVybiAxOworCQl9CisJCWlmICgodG90YWxfcmRfY291bnQgPj0gdmRlYy0+dmJ1Zi5sYXN0X29mZnNldFswXSkgJiYKKwkJCSh0b3RhbF9yZF9jb3VudCAtIHZkZWMtPnZidWYubGFzdF9vZmZzZXRbMF0gPCAweDgwMDAwMDAwKSkKKwkJCXJldHVybiAwOworCQllbHNlIGlmICgodG90YWxfcmRfY291bnQgPj0gdmRlYy0+dmJ1Zi5sYXN0X29mZnNldFsxXSkgJiYKKwkJCSh0b3RhbF9yZF9jb3VudCAtIHZkZWMtPnZidWYubGFzdF9vZmZzZXRbMV0gPCAweDgwMDAwMDAwKSkKKwkJCXJldHVybiAwOworCisJCXJldHVybiAxOworCX0KK30KKwordW5zaWduZWQgbG9uZyB2ZGVjX3JlYWR5X3RvX3J1bihzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1bnNpZ25lZCBsb25nIG1hc2spCit7CisJdW5zaWduZWQgbG9uZyByZWFkeV9tYXNrOworCXN0cnVjdCB2ZGVjX2lucHV0X3MgKmlucHV0ID0gJnZkZWMtPmlucHV0OworCisJLyogV2FpdCB0aGUgbWF0Y2hpbmcgaXJxX3RocmVhZCBmaW5pc2hlZCAqLworCWlmICh2ZGVjLT5pcnFfY250ID4gdmRlYy0+aXJxX3RocmVhZF9jbnQpCisJCXJldHVybiBmYWxzZTsKKworCWlmICgodmRlYy0+c3RhdHVzICE9IFZERUNfU1RBVFVTX0NPTk5FQ1RFRCkgJiYKKwkgICAgKHZkZWMtPnN0YXR1cyAhPSBWREVDX1NUQVRVU19BQ1RJVkUpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoIXZkZWMtPnJ1bl9yZWFkeSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogd2hlbiBjcmMzMiBlcnJvciwgYmxvY2sgYXQgZXJyb3IgZnJhbWUgKi8KKwlpZiAodmRlYy0+dmZjLmVycl9jcmNfYmxvY2spCisJCXJldHVybiBmYWxzZTsKKworCWlmICgodmRlYy0+c2xhdmUgfHwgdmRlYy0+bWFzdGVyKSAmJgorCQkodmRlYy0+c2NoZWQgPT0gMCkpCisJCXJldHVybiBmYWxzZTsKKyNpZmRlZiBWREVDX0RFQlVHX1NVUFBPUlQKKwlpbmNfcHJvZmlfY291bnQobWFzaywgdmRlYy0+Y2hlY2tfY291bnQpOworI2VuZGlmCisJaWYgKHZkZWNfY29yZV93aXRoX2lucHV0KG1hc2spKSB7CisJCS8qIGNoZWNrIGZyYW1lIGJhc2VkIGlucHV0IHVuZGVycnVuICovCisJCWlmIChpbnB1dCAmJiAhaW5wdXQtPmVvcyAmJiBpbnB1dF9mcmFtZV9iYXNlZChpbnB1dCkKKwkJCSYmICghdmRlY19pbnB1dF9uZXh0X2NodW5rKGlucHV0KSkpIHsKKyNpZmRlZiBWREVDX0RFQlVHX1NVUFBPUlQKKwkJCWluY19wcm9maV9jb3VudChtYXNrLCB2ZGVjLT5pbnB1dF91bmRlcnJ1bl9jb3VudCk7CisjZW5kaWYKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkvKiBjaGVjayBzdHJlYW1pbmcgcHJlcGFyZSBsZXZlbCB0aHJlc2hvbGQgaWYgbm90IEVPUyAqLworCQlpZiAoaW5wdXQgJiYgaW5wdXRfc3RyZWFtX2Jhc2VkKGlucHV0KSAmJiAhaW5wdXQtPmVvcykgeworCQkJdTMyIHJwLCB3cCwgbGV2ZWw7CisKKwkJCXJwID0gU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3JwKTsKKwkJCXdwID0gU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3dwKTsKKwkJCWlmICh3cCA8IHJwKQorCQkJCWxldmVsID0gaW5wdXQtPnNpemUgKyB3cCAtIHJwOworCQkJZWxzZQorCQkJCWxldmVsID0gd3AgLSBycDsKKworCQkJaWYgKChsZXZlbCA8IGlucHV0LT5wcmVwYXJlX2xldmVsKSAmJgorCQkJCSF2ZGVjX2NoZWNrX3JlY19udW1fZW5vdWdoKHZkZWMpKSB7CisJCQkJdmRlYy0+bmVlZF9tb3JlX2RhdGEgfD0gVkRFQ19ORUVEX01PUkVfREFUQTsKKyNpZmRlZiBWREVDX0RFQlVHX1NVUFBPUlQKKwkJCQlpbmNfcHJvZmlfY291bnQobWFzaywgdmRlYy0+aW5wdXRfdW5kZXJydW5fY291bnQpOworCQkJCWlmIChzdGVwX21vZGUgJiAweDIwMCkgeworCQkJCQlpZiAoKHN0ZXBfbW9kZSAmIDB4ZmYpID09IHZkZWMtPmlkKSB7CisJCQkJCQlzdGVwX21vZGUgfD0gMHhmZjsKKwkJCQkJCXJldHVybiBtYXNrOworCQkJCQl9CisJCQkJfQorI2VuZGlmCisJCQkJcmV0dXJuIGZhbHNlOworCQkJfSBlbHNlIGlmIChsZXZlbCA+IGlucHV0LT5wcmVwYXJlX2xldmVsKQorCQkJCXZkZWMtPm5lZWRfbW9yZV9kYXRhICY9IH5WREVDX05FRURfTU9SRV9EQVRBOworCQl9CisJfQorCisJaWYgKHN0ZXBfbW9kZSkgeworCQlpZiAoKHN0ZXBfbW9kZSAmIDB4ZmYpICE9IHZkZWMtPmlkKQorCQkJcmV0dXJuIDA7CisJCXN0ZXBfbW9kZSB8PSAweGZmOyAvKlZERUNfREVCVUdfU1VQUE9SVCovCisJfQorCisJLypzdGVwX21vZGUgJj0gfjB4ZmY7IG5vdCB3b3JrIGZvciBpZCBvZiAwLCByZW1vdmVkKi8KKworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX01VTFRJX0RFQworCXZkZWNfcHJvZmlsZSh2ZGVjLCBWREVDX1BST0ZJTEVfRVZFTlRfQ0hLX1JVTl9SRUFEWSk7CisjZW5kaWYKKworCXJlYWR5X21hc2sgPSB2ZGVjLT5ydW5fcmVhZHkodmRlYywgbWFzaykgJiBtYXNrOworI2lmZGVmIFZERUNfREVCVUdfU1VQUE9SVAorCWlmIChyZWFkeV9tYXNrICE9IG1hc2spCisJCWluY19wcm9maV9jb3VudChyZWFkeV9tYXNrIF4gbWFzaywgdmRlYy0+bm90X3J1bl9yZWFkeV9jb3VudCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9NVUxUSV9ERUMKKwlpZiAocmVhZHlfbWFzaykKKwkJdmRlY19wcm9maWxlKHZkZWMsIFZERUNfUFJPRklMRV9FVkVOVF9SVU5fUkVBRFkpOworI2VuZGlmCisKKwlyZXR1cm4gcmVhZHlfbWFzazsKK30KKworLyogYnJpZGdlIG9uL29mZiB2ZGVjJ3MgaW50ZXJydXB0IHByb2Nlc3NpbmcgdG8gdmRlYyBjb3JlICovCitzdGF0aWMgdm9pZCB2ZGVjX3JvdXRlX2ludGVycnVwdChzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1bnNpZ25lZCBsb25nIG1hc2ssCisJYm9vbCBlbmFibGUpCit7CisJZW51bSB2ZGVjX3R5cGVfZSB0eXBlOworCisJZm9yICh0eXBlID0gVkRFQ18xOyB0eXBlIDwgVkRFQ19NQVg7IHR5cGUrKykgeworCQlpZiAobWFzayAmICgxIDw8IHR5cGUpKSB7CisJCQlzdHJ1Y3QgdmRlY19pc3JfY29udGV4dF9zICpjID0KKwkJCQkmdmRlY19jb3JlLT5pc3JfY29udGV4dFtjb3Jlc19pbnRbdHlwZV1dOworCQkJaWYgKGVuYWJsZSkKKwkJCQljLT52ZGVjID0gdmRlYzsKKwkJCWVsc2UgaWYgKGMtPnZkZWMgPT0gdmRlYykKKwkJCQljLT52ZGVjID0gTlVMTDsKKwkJfQorCX0KK30KKworLyoKKyAqIFNldCB1cCBzZWN1cmUgcHJvdGVjdGlvbiBmb3IgZWFjaCBkZWNvZGVyIGluc3RhbmNlIHJ1bm5pbmcuCisgKiBOb3RlOiBUaGUgb3BlcmF0aW9uIGZyb20gUkVFIHNpZGUgb25seSByZXNldHMgbWVtb3J5IGFjY2VzcworICogdG8gYSBkZWZhdWx0IHBvbGljeSBhbmQgZXZlbiBhIG5vbl9zZWN1cmUgdHlwZSB3aWxsIHN0aWxsIGJlCisgKiBjaGFuZ2VkIHRvIHNlY3VyZSB0eXBlIGF1dG9tYXRpY2FsbHkgd2hlbiBzZWN1cmUgc291cmNlIGlzCisgKiBkZXRlY3RlZCBpbnNpZGUgVEVFLgorICogUGVyZm9ybSBuZWVkX21vcmVfZGF0YSBjaGVja2luZyBhbmQgc2V0IGZsYWcgaXMgZGVjb2RlcgorICogaXMgbm90IGNvbnN1bWluZyBkYXRhLgorICovCisjZGVmaW5lIERNQ19ERVZfVFlQRV9OT05fU0VDVVJFICAgICAgICAwCisjZGVmaW5lIERNQ19ERVZfVFlQRV9TRUNVUkUgICAgICAgICAgICAxCisKK3ZvaWQgdmRlY19wcmVwYXJlX3J1bihzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1bnNpZ25lZCBsb25nIG1hc2spCit7CisJc3RydWN0IHZkZWNfaW5wdXRfcyAqaW5wdXQgPSAmdmRlYy0+aW5wdXQ7CisJaW50IHNlY3VyZSA9ICh2ZGVjX3NlY3VyZSh2ZGVjKSkgPyBETUNfREVWX1RZUEVfU0VDVVJFIDoKKwkJCURNQ19ERVZfVFlQRV9OT05fU0VDVVJFOworCisJdmRlY19yb3V0ZV9pbnRlcnJ1cHQodmRlYywgbWFzaywgdHJ1ZSk7CisKKwlpZiAoIXZkZWNfY29yZV93aXRoX2lucHV0KG1hc2spKQorCQlyZXR1cm47CisKKwlpZiAodmRlY19zdHJlYW1fYmFzZWQodmRlYykgJiYgIXZkZWNfc2VjdXJlKHZkZWMpKQorCXsKKwkJdGVlX2NvbmZpZ19kZXZpY2Vfc3RhdGUoRE1DX0RFVl9JRF9QQVJTRVIsIDApOworCX0KKwlpZiAoaW5wdXQtPnRhcmdldCA9PSBWREVDX0lOUFVUX1RBUkdFVF9WTEQpCisJCXRlZV9jb25maWdfZGV2aWNlX3N0YXRlKERNQ19ERVZfSURfVkRFQywgc2VjdXJlKTsKKwllbHNlIGlmIChpbnB1dC0+dGFyZ2V0ID09IFZERUNfSU5QVVRfVEFSR0VUX0hFVkMpCisJCXRlZV9jb25maWdfZGV2aWNlX3N0YXRlKERNQ19ERVZfSURfSEVWQywgc2VjdXJlKTsKKworCWlmICh2ZGVjX3N0cmVhbV9iYXNlZCh2ZGVjKSAmJgorCQkoKHZkZWMtPm5lZWRfbW9yZV9kYXRhICYgVkRFQ19ORUVEX01PUkVfREFUQV9SVU4pICYmCisJCSh2ZGVjLT5uZWVkX21vcmVfZGF0YSAmIFZERUNfTkVFRF9NT1JFX0RBVEFfRElSVFkpID09IDApKSB7CisJCXZkZWMtPm5lZWRfbW9yZV9kYXRhIHw9IFZERUNfTkVFRF9NT1JFX0RBVEE7CisJfQorCisJdmRlYy0+bmVlZF9tb3JlX2RhdGEgfD0gVkRFQ19ORUVEX01PUkVfREFUQV9SVU47CisJdmRlYy0+bmVlZF9tb3JlX2RhdGEgJj0gflZERUNfTkVFRF9NT1JFX0RBVEFfRElSVFk7Cit9CisKKy8qIHN0cnVjdCB2ZGVjX2NvcmVfc2hyZWFkIG1hbmFnZXMgYWxsIGRlY29kZXIgaW5zdGFuY2UgaW4gYWN0aXZlIGxpc3QuIFdoZW4KKyAqIGEgdmRlYyBpcyBhZGRlZCBpbnRvIHRoZSBhY3RpdmUgbGlzdCwgaXQgY2FuIG9ubHQgYmUgaW4gdHdvIHN0YXR1czoKKyAqIFZERUNfU1RBVFVTX0NPTk5FQ1RFRCh0aGUgZGVjb2RlciBkb2VzIG5vdCBvd24gSFcgcmVzb3VyY2UgYW5kIHJlYWR5IHRvIHJ1bikKKyAqIFZERUNfU1RBVFVTX0FDVElWRSh0aGUgZGVjb2RlciBvd25zIEhXIHJlc291cmNlcyBhbmQgaXMgcnVubmluZykuCisgKiBSZW1vdmluZyBhIGRlY29kZXIgZnJvbSBhY3RpdmUgbGlzdCBpcyBvbmx5IHBlcmZvcm1lZCB3aXRoaW4gY29yZSB0aHJlYWQuCisgKiBBZGRpbmcgYSBkZWNvZGVyIGludG8gYWN0aXZlIGxpc3QgaXMgcGVyZm9ybWVkIGZyb20gdXNlciB0aHJlYWQuCisgKi8KK3N0YXRpYyBpbnQgdmRlY19jb3JlX3RocmVhZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCB2ZGVjX2NvcmVfcyAqY29yZSA9IChzdHJ1Y3QgdmRlY19jb3JlX3MgKilkYXRhOworCXN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbSA9IHsuc2NoZWRfcHJpb3JpdHkgPSBNQVhfUlRfUFJJTy8yfTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJc2NoZWRfc2V0c2NoZWR1bGVyKGN1cnJlbnQsIFNDSEVEX0ZJRk8sICZwYXJhbSk7CisKKwlhbGxvd19zaWduYWwoU0lHVEVSTSk7CisKKwl3aGlsZSAoZG93bl9pbnRlcnJ1cHRpYmxlKCZjb3JlLT5zZW0pID09IDApIHsKKwkJc3RydWN0IHZkZWNfcyAqdmRlYywgKnRtcCwgKndvcmtlcjsKKwkJdW5zaWduZWQgbG9uZyBzY2hlZF9tYXNrID0gMDsKKwkJTElTVF9IRUFEKGRpc2Nvbm5lY3RpbmdfbGlzdCk7CisKKwkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKKwkJCWJyZWFrOworCQltdXRleF9sb2NrKCZ2ZGVjX211dGV4KTsKKworCQlpZiAoY29yZS0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJCWZvciAoaSA9IFZERUNfMTsgaSA8IFZERUNfTUFYOyBpKyspIHsKKwkJCQljb3JlLT5wb3dlcl9yZWZfbWFzayA9CisJCQkJCWNvcmUtPnBvd2VyX3JlZl9jb3VudFtpXSA+IDAgPworCQkJCQkoY29yZS0+cG93ZXJfcmVmX21hc2sgfCAoMSA8PCBpKSkgOgorCQkJCQkoY29yZS0+cG93ZXJfcmVmX21hc2sgJiB+KDEgPDwgaSkpOworCQkJfQorCQl9CisJCS8qIGNsZWFuIHVwIHByZXZpb3VzIGFjdGl2ZSB2ZGVjJ3MgaW5wdXQgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2ZGVjLCAmY29yZS0+Y29ubmVjdGVkX3ZkZWNfbGlzdCwgbGlzdCkgeworCQkJdW5zaWduZWQgbG9uZyBtYXNrID0gdmRlYy0+c2NoZWRfbWFzayAmCisJCQkJKHZkZWMtPmFjdGl2ZV9tYXNrIF4gdmRlYy0+c2NoZWRfbWFzayk7CisKKwkJCXZkZWNfcm91dGVfaW50ZXJydXB0KHZkZWMsIG1hc2ssIGZhbHNlKTsKKworI2lmZGVmIFZERUNfREVCVUdfU1VQUE9SVAorCQkJdXBkYXRlX3Byb2ZpX2Nsa19zdG9wKHZkZWMsIG1hc2ssIGdldF9jdXJyZW50X2NsaygpKTsKKyNlbmRpZgorCQkJLyoKKwkJCSAqIElmIGRlY29kZXIgcmVsZWFzZWQgc29tZSBjb3JlIHJlc291cmNlcyAobWFzayksIHRoZW4KKwkJCSAqIGNoZWNrIGlmIHRoZXNlIGNvcmUgcmVzb3VyY2VzIGFyZSBhc3NvY2lhdGVkCisJCQkgKiB3aXRoIGFueSBpbnB1dCBzaWRlIGFuZCBkbyBpbnB1dCBjbGVhbiB1cCBhY2NvcmRpbmdseQorCQkJICovCisJCQlpZiAodmRlY19jb3JlX3dpdGhfaW5wdXQobWFzaykpIHsKKwkJCQlzdHJ1Y3QgdmRlY19pbnB1dF9zICppbnB1dCA9ICZ2ZGVjLT5pbnB1dDsKKwkJCQl3aGlsZSAoIWxpc3RfZW1wdHkoCisJCQkJCSZpbnB1dC0+dmZyYW1lX2NodW5rX2xpc3QpKSB7CisJCQkJCXN0cnVjdCB2ZnJhbWVfY2h1bmtfcyAqY2h1bmsgPQorCQkJCQkJdmRlY19pbnB1dF9uZXh0X2NodW5rKGlucHV0KTsKKwkJCQkJaWYgKGNodW5rICYmIChjaHVuay0+ZmxhZyAmCisJCQkJCQlWRlJBTUVfQ0hVTktfRkxBR19DT05TVU1FRCkpCisJCQkJCQl2ZGVjX2lucHV0X3JlbGVhc2VfY2h1bmsoaW5wdXQsCisJCQkJCQkJY2h1bmspOworCQkJCQllbHNlCisJCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQl2ZGVjX3NhdmVfaW5wdXRfY29udGV4dCh2ZGVjKTsKKwkJCX0KKworCQkJdmRlYy0+c2NoZWRfbWFzayAmPSB+bWFzazsKKwkJCWNvcmUtPnNjaGVkX21hc2sgJj0gfm1hc2s7CisJCX0KKwkJdmRlY191cGRhdGVfYnVmZl9zdGF0dXMoKTsKKwkJLyoKKwkJICp0b2RvOgorCQkgKiB0aGlzIGlzIHRoZSBjYXNlIHdoZW4gdGhlIGRlY29kZXIgaXMgaW4gYWN0aXZlIG1vZGUgYW5kCisJCSAqIHRoZSBzeXN0ZW0gc2lkZSB3YW50cyB0byBzdG9wIGl0LiBDdXJyZW50bHkgd2UgcmVseSBvbgorCQkgKiB0aGUgZGVjb2RlciBpbnN0YW5jZSB0byBnbyBiYWNrIHRvIFZERUNfU1RBVFVTX0NPTk5FQ1RFRAorCQkgKiBmcm9tIFZERUNfU1RBVFVTX0FDVElWRSBieSBpdHMgb3duLiBIb3dldmVyLCBpZiBmb3Igc29tZQorCQkgKiByZWFzb24gdGhlIGRlY29kZXIgY2FuIG5vdCBleGlzdCBieSBpdHNlbGYgKGRlYWQgZGVjb2RpbmcKKwkJICogb3Igd2hhdGV2ZXIpLCB0aGVuIHdlIG1heSBoYXZlIHRvIGFkZCBhbm90aGVyIHZkZWMgQVBJCisJCSAqIHRvIGtpbGwgdGhlIHZkZWMgYW5kIHJlbGVhc2UgaXRzIEhXIHJlc291cmNlIGFuZCBtYWtlIGl0CisJCSAqIGJlY29tZSBpbmFjdGl2ZSBhZ2Fpbi4KKwkJICogaWYgKChjb3JlLT5hY3RpdmVfdmRlYykgJiYKKwkJICogKGNvcmUtPmFjdGl2ZV92ZGVjLT5zdGF0dXMgPT0gVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEKSkgeworCQkgKiB9CisJCSAqLworCisJCS8qIGNoZWNrIGRpc2Nvbm5lY3RlZCBkZWNvZGVycyAqLworCQlmbGFncyA9IHZkZWNfY29yZV9sb2NrKHZkZWNfY29yZSk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2ZGVjLCB0bXAsCisJCQkmY29yZS0+Y29ubmVjdGVkX3ZkZWNfbGlzdCwgbGlzdCkgeworCQkJaWYgKCh2ZGVjLT5zdGF0dXMgPT0gVkRFQ19TVEFUVVNfQ09OTkVDVEVEKSAmJgorCQkJICAgICh2ZGVjLT5uZXh0X3N0YXR1cyA9PSBWREVDX1NUQVRVU19ESVNDT05ORUNURUQpKSB7CisJCQkJaWYgKGNvcmUtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCQkJCWlmICh2ZGVjX2NvcmUtPmFjdGl2ZV9oZXZjID09IHZkZWMpCisJCQkJCQl2ZGVjX2NvcmUtPmFjdGl2ZV9oZXZjID0gTlVMTDsKKwkJCQkJaWYgKHZkZWNfY29yZS0+YWN0aXZlX3ZkZWMgPT0gdmRlYykKKwkJCQkJCXZkZWNfY29yZS0+YWN0aXZlX3ZkZWMgPSBOVUxMOworCQkJCX0KKwkJCQlpZiAoY29yZS0+bGFzdF92ZGVjID09IHZkZWMpCisJCQkJCWNvcmUtPmxhc3RfdmRlYyA9IE5VTEw7CisJCQkJbGlzdF9tb3ZlKCZ2ZGVjLT5saXN0LCAmZGlzY29ubmVjdGluZ19saXN0KTsKKwkJCX0KKwkJfQorCQl2ZGVjX2NvcmVfdW5sb2NrKHZkZWNfY29yZSwgZmxhZ3MpOworCQltdXRleF91bmxvY2soJnZkZWNfbXV0ZXgpOworCQkvKiBlbGVjdCBuZXh0IHZkZWMgdG8gYmUgc2NoZWR1bGVkICovCisJCXZkZWMgPSBjb3JlLT5sYXN0X3ZkZWM7CisJCWlmICh2ZGVjKSB7CisJCQl2ZGVjID0gbGlzdF9lbnRyeSh2ZGVjLT5saXN0Lm5leHQsIHN0cnVjdCB2ZGVjX3MsIGxpc3QpOworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9mcm9tKHZkZWMsCisJCQkJJmNvcmUtPmNvbm5lY3RlZF92ZGVjX2xpc3QsIGxpc3QpIHsKKwkJCQlzY2hlZF9tYXNrID0gdmRlY19zY2hlZHVsZV9tYXNrKHZkZWMsCisJCQkJCWNvcmUtPnNjaGVkX21hc2spOworCQkJCWlmICghc2NoZWRfbWFzaykKKwkJCQkJY29udGludWU7CisJCQkJc2NoZWRfbWFzayA9IHZkZWNfcmVhZHlfdG9fcnVuKHZkZWMsCisJCQkJCXNjaGVkX21hc2spOworCQkJCWlmIChzY2hlZF9tYXNrKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKCZ2ZGVjLT5saXN0ID09ICZjb3JlLT5jb25uZWN0ZWRfdmRlY19saXN0KQorCQkJCXZkZWMgPSBOVUxMOworCQl9CisKKwkJaWYgKCF2ZGVjKSB7CisJCQkvKiBzZWFyY2ggZnJvbSBiZWdpbm5pbmcgKi8KKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkodmRlYywKKwkJCQkmY29yZS0+Y29ubmVjdGVkX3ZkZWNfbGlzdCwgbGlzdCkgeworCQkJCXNjaGVkX21hc2sgPSB2ZGVjX3NjaGVkdWxlX21hc2sodmRlYywKKwkJCQkJY29yZS0+c2NoZWRfbWFzayk7CisJCQkJaWYgKHZkZWMgPT0gY29yZS0+bGFzdF92ZGVjKSB7CisJCQkJCWlmICghc2NoZWRfbWFzaykgeworCQkJCQkJdmRlYyA9IE5VTEw7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCXNjaGVkX21hc2sgPSB2ZGVjX3JlYWR5X3RvX3J1bih2ZGVjLAorCQkJCQkJc2NoZWRfbWFzayk7CisKKwkJCQkJaWYgKCFzY2hlZF9tYXNrKSB7CisJCQkJCQl2ZGVjID0gTlVMTDsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlmICghc2NoZWRfbWFzaykKKwkJCQkJY29udGludWU7CisKKwkJCQlzY2hlZF9tYXNrID0gdmRlY19yZWFkeV90b19ydW4odmRlYywKKwkJCQkJc2NoZWRfbWFzayk7CisJCQkJaWYgKHNjaGVkX21hc2spCisJCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoJnZkZWMtPmxpc3QgPT0gJmNvcmUtPmNvbm5lY3RlZF92ZGVjX2xpc3QpCisJCQkJdmRlYyA9IE5VTEw7CisJCX0KKworCQl3b3JrZXIgPSB2ZGVjOworCisJCWlmICh2ZGVjKSB7CisJCQl1bnNpZ25lZCBsb25nIG1hc2sgPSBzY2hlZF9tYXNrOworCQkJdW5zaWduZWQgbG9uZyBpOworCisJCQkvKiBzZXR0aW5nIGFjdGl2ZV9tYXNrIHNob3VsZCBiZSBhdG9taWMuCisJCQkgKiBpdCBjYW4gYmUgbW9kaWZpZWQgYnkgZGVjb2RlciBkcml2ZXIgY2FsbGJhY2tzLgorCQkJICovCisJCQl3aGlsZSAoc2NoZWRfbWFzaykgeworCQkJCWkgPSBfX2ZmcyhzY2hlZF9tYXNrKTsKKwkJCQlzZXRfYml0KGksICZ2ZGVjLT5hY3RpdmVfbWFzayk7CisJCQkJc2NoZWRfbWFzayAmPSB+KDEgPDwgaSk7CisJCQl9CisKKwkJCS8qIHZkZWMncyBzY2hlZF9tYXNrIGlzIG9ubHkgc2V0IGZyb20gY29yZSB0aHJlYWQgKi8KKwkJCXZkZWMtPnNjaGVkX21hc2sgfD0gbWFzazsKKwkJCWlmIChjb3JlLT5sYXN0X3ZkZWMpIHsKKwkJCQlpZiAoKGNvcmUtPmxhc3RfdmRlYyAhPSB2ZGVjKSAmJgorCQkJCQkoY29yZS0+bGFzdF92ZGVjLT5tY190eXBlICE9IHZkZWMtPm1jX3R5cGUpKQorCQkJCQl2ZGVjLT5tY19sb2FkZWQgPSAwOy8qY2xlYXIgZm9yIHJlbG9hZCBmaXJtd2FyZSovCisJCQl9IGVsc2UKKwkJCQl2ZGVjLT5tY19sb2FkZWQgPSAwOworCQkJY29yZS0+bGFzdF92ZGVjID0gdmRlYzsKKwkJCWlmIChkZWJ1ZyAmIDIpCisJCQkJdmRlYy0+bWNfbG9hZGVkID0gMDsvKmFsd2F5IHJlbG9hZCBmaXJtd2FyZSovCisJCQl2ZGVjX3NldF9zdGF0dXModmRlYywgVkRFQ19TVEFUVVNfQUNUSVZFKTsKKworCQkJY29yZS0+c2NoZWRfbWFzayB8PSBtYXNrOworCQkJaWYgKGNvcmUtPnBhcmFsbGVsX2RlYyA9PSAxKQorCQkJCXZkZWNfc2F2ZV9hY3RpdmVfaHcodmRlYyk7CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfTVVMVElfREVDCisJCQl2ZGVjX3Byb2ZpbGUodmRlYywgVkRFQ19QUk9GSUxFX0VWRU5UX1JVTik7CisjZW5kaWYKKwkJCXZkZWNfcHJlcGFyZV9ydW4odmRlYywgbWFzayk7CisjaWZkZWYgVkRFQ19ERUJVR19TVVBQT1JUCisJCQlpbmNfcHJvZmlfY291bnQobWFzaywgdmRlYy0+cnVuX2NvdW50KTsKKwkJCXVwZGF0ZV9wcm9maV9jbGtfcnVuKHZkZWMsIG1hc2ssIGdldF9jdXJyZW50X2NsaygpKTsKKyNlbmRpZgorCQkJdmRlYy0+cnVuKHZkZWMsIG1hc2ssIHZkZWNfY2FsbGJhY2ssIGNvcmUpOworCisKKwkJCS8qIHdlIGhhdmUgc29tZSBjb3JlcyBzY2hlZHVsZWQsIGtlZXAgd29ya2luZyB1bnRpbAorCQkJICogYWxsIHZkZWNzIGFyZSBjaGVja2VkIHdpdGggbm8gY29yZXMgdG8gc2NoZWR1bGUKKwkJCSAqLworCQkJaWYgKGNvcmUtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCQkJaWYgKHZkZWNfY29yZS0+dmRlY19jb21iaW5lX2ZsYWcgPT0gMCkKKwkJCQkJdXAoJmNvcmUtPnNlbSk7CisJCQl9IGVsc2UKKwkJCQl1cCgmY29yZS0+c2VtKTsKKwkJfQorCisJCS8qIHJlbW92ZSBkaXNjb25uZWN0ZWQgZGVjb2RlciBmcm9tIGFjdGl2ZSBsaXN0ICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2ZGVjLCB0bXAsICZkaXNjb25uZWN0aW5nX2xpc3QsIGxpc3QpIHsKKwkJCWxpc3RfZGVsKCZ2ZGVjLT5saXN0KTsKKwkJCXZkZWNfc2V0X3N0YXR1cyh2ZGVjLCBWREVDX1NUQVRVU19ESVNDT05ORUNURUQpOworCQkJLypjb3JlLT5sYXN0X3ZkZWMgPSBOVUxMOyovCisJCQljb21wbGV0ZSgmdmRlYy0+aW5hY3RpdmVfZG9uZSk7CisJCX0KKworCQkvKiBpZiB0aGVyZSBpcyBubyBuZXcgd29yayBzY2hlZHVsZWQgYW5kIG5vdGhpbmcKKwkJICogaXMgcnVubmluZywgc2xlZXAgMjBtcworCQkgKi8KKwkJaWYgKGNvcmUtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCQlpZiAodmRlY19jb3JlLT52ZGVjX2NvbWJpbmVfZmxhZyA9PSAwKSB7CisJCQkJaWYgKCghd29ya2VyKSAmJgorCQkJCQkoKGNvcmUtPnNjaGVkX21hc2sgIT0gY29yZS0+cG93ZXJfcmVmX21hc2spKSAmJgorCQkJCQkoYXRvbWljX3JlYWQoJnZkZWNfY29yZS0+dmRlY19ucikgPiAwKSAmJgorCQkJCQkoKGNvcmUtPmJ1ZmZfZmxhZyB8IGNvcmUtPnN0cmVhbV9idWZmX2ZsYWcpICYKKwkJCQkJKGNvcmUtPnNjaGVkX21hc2sgXiBjb3JlLT5wb3dlcl9yZWZfbWFzaykpKSB7CisJCQkJCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CisJCQkJCQl1cCgmY29yZS0+c2VtKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmICgoIXdvcmtlcikgJiYgKCFjb3JlLT5zY2hlZF9tYXNrKSAmJgorCQkJCQkoYXRvbWljX3JlYWQoJnZkZWNfY29yZS0+dmRlY19ucikgPiAwKSAmJgorCQkJCQkoY29yZS0+YnVmZl9mbGFnIHwgY29yZS0+c3RyZWFtX2J1ZmZfZmxhZykpIHsKKwkJCQkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOworCQkJCQl1cCgmY29yZS0+c2VtKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAoKCF3b3JrZXIpICYmICghY29yZS0+c2NoZWRfbWFzaykgJiYgKGF0b21pY19yZWFkKCZ2ZGVjX2NvcmUtPnZkZWNfbnIpID4gMCkpIHsKKwkJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKKwkJCXVwKCZjb3JlLT5zZW0pOworCQl9CisKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmIDEJCQkJLyogTUVTT05fQ1BVX1RZUEUgPj0gTUVTT05fQ1BVX1RZUEVfTUVTT044ICovCit2b2lkIHZkZWNfcG93ZXJfcmVzZXQodm9pZCkKK3sKKwkvKiBlbmFibGUgdmRlYzEgaXNvbGF0aW9uICovCisJV1JJVEVfQU9SRUcoQU9fUlRJX0dFTl9QV1JfSVNPMCwKKwkJUkVBRF9BT1JFRyhBT19SVElfR0VOX1BXUl9JU08wKSB8IDB4YzApOworCS8qIHBvd2VyIG9mZiB2ZGVjMSBtZW1vcmllcyAqLworCVdSSVRFX1ZSRUcoRE9TX01FTV9QRF9WREVDLCAweGZmZmZmZmZmVUwpOworCS8qIHZkZWMxIHBvd2VyIG9mZiAqLworCVdSSVRFX0FPUkVHKEFPX1JUSV9HRU5fUFdSX1NMRUVQMCwKKwkJUkVBRF9BT1JFRyhBT19SVElfR0VOX1BXUl9TTEVFUDApIHwgMHhjKTsKKworCWlmIChoYXNfdmRlYzIoKSkgeworCQkvKiBlbmFibGUgdmRlYzIgaXNvbGF0aW9uICovCisJCVdSSVRFX0FPUkVHKEFPX1JUSV9HRU5fUFdSX0lTTzAsCisJCQlSRUFEX0FPUkVHKEFPX1JUSV9HRU5fUFdSX0lTTzApIHwgMHgzMDApOworCQkvKiBwb3dlciBvZmYgdmRlYzIgbWVtb3JpZXMgKi8KKwkJV1JJVEVfVlJFRyhET1NfTUVNX1BEX1ZERUMyLCAweGZmZmZmZmZmVUwpOworCQkvKiB2ZGVjMiBwb3dlciBvZmYgKi8KKwkJV1JJVEVfQU9SRUcoQU9fUlRJX0dFTl9QV1JfU0xFRVAwLAorCQkJUkVBRF9BT1JFRyhBT19SVElfR0VOX1BXUl9TTEVFUDApIHwgMHgzMCk7CisJfQorCisJaWYgKGhhc19oZGVjKCkpIHsKKwkJLyogZW5hYmxlIGhjb2RlYyBpc29sYXRpb24gKi8KKwkJV1JJVEVfQU9SRUcoQU9fUlRJX0dFTl9QV1JfSVNPMCwKKwkJCVJFQURfQU9SRUcoQU9fUlRJX0dFTl9QV1JfSVNPMCkgfCAweDMwKTsKKwkJLyogcG93ZXIgb2ZmIGhjb2RlYyBtZW1vcmllcyAqLworCQlXUklURV9WUkVHKERPU19NRU1fUERfSENPREVDLCAweGZmZmZmZmZmVUwpOworCQkvKiBoY29kZWMgcG93ZXIgb2ZmICovCisJCVdSSVRFX0FPUkVHKEFPX1JUSV9HRU5fUFdSX1NMRUVQMCwKKwkJCVJFQURfQU9SRUcoQU9fUlRJX0dFTl9QV1JfU0xFRVAwKSB8IDMpOworCX0KKworCWlmIChoYXNfaGV2Y192ZGVjKCkpIHsKKwkJLyogZW5hYmxlIGhldmMgaXNvbGF0aW9uICovCisJCVdSSVRFX0FPUkVHKEFPX1JUSV9HRU5fUFdSX0lTTzAsCisJCQlSRUFEX0FPUkVHKEFPX1JUSV9HRU5fUFdSX0lTTzApIHwgMHhjMDApOworCQkvKiBwb3dlciBvZmYgaGV2YyBtZW1vcmllcyAqLworCQlXUklURV9WUkVHKERPU19NRU1fUERfSEVWQywgMHhmZmZmZmZmZlVMKTsKKwkJLyogaGV2YyBwb3dlciBvZmYgKi8KKwkJV1JJVEVfQU9SRUcoQU9fUlRJX0dFTl9QV1JfU0xFRVAwLAorCQkJUkVBRF9BT1JFRyhBT19SVElfR0VOX1BXUl9TTEVFUDApIHwgMHhjMCk7CisJfQorfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3Bvd2VyX3Jlc2V0KTsKKworCit2b2lkIHZkZWNfcG93ZXJvbihlbnVtIHZkZWNfdHlwZV9lIGNvcmUpCit7CisJaWYgKGNvcmUgPj0gVkRFQ19NQVgpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJnZkZWNfbXV0ZXgpOworCisJdmRlY19jb3JlLT5wb3dlcl9yZWZfY291bnRbY29yZV0rKzsKKwlpZiAodmRlY19jb3JlLT5wb3dlcl9yZWZfY291bnRbY29yZV0gPiAxKSB7CisJCW11dGV4X3VubG9jaygmdmRlY19tdXRleCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAodmRlY19vbihjb3JlKSkgeworCQltdXRleF91bmxvY2soJnZkZWNfbXV0ZXgpOworCQlyZXR1cm47CisJfQorCisJdmRlY19jb3JlLT5wbS0+cG93ZXJfb24odmRlY19jb3JlLT5jbWFfZGV2LCBjb3JlKTsKKworCW11dGV4X3VubG9jaygmdmRlY19tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfcG93ZXJvbik7CisKK3ZvaWQgdmRlY19wb3dlcm9mZihlbnVtIHZkZWNfdHlwZV9lIGNvcmUpCit7CisJaWYgKGNvcmUgPj0gVkRFQ19NQVgpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJnZkZWNfbXV0ZXgpOworCisJdmRlY19jb3JlLT5wb3dlcl9yZWZfY291bnRbY29yZV0tLTsKKwlpZiAodmRlY19jb3JlLT5wb3dlcl9yZWZfY291bnRbY29yZV0gPiAwKSB7CisJCW11dGV4X3VubG9jaygmdmRlY19tdXRleCk7CisJCXJldHVybjsKKwl9CisKKwl2ZGVjX2NvcmUtPnBtLT5wb3dlcl9vZmYodmRlY19jb3JlLT5jbWFfZGV2LCBjb3JlKTsKKworCW11dGV4X3VubG9jaygmdmRlY19tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfcG93ZXJvZmYpOworCitib29sIHZkZWNfb24oZW51bSB2ZGVjX3R5cGVfZSBjb3JlKQoreworCXJldHVybiB2ZGVjX2NvcmUtPnBtLT5wb3dlcl9zdGF0ZSh2ZGVjX2NvcmUtPmNtYV9kZXYsIGNvcmUpOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX29uKTsKKworI2VsaWYgMAkJCQkvKiBNRVNPTl9DUFVfVFlQRSA+PSBNRVNPTl9DUFVfVFlQRV9NRVNPTjZUVkQgKi8KK3ZvaWQgdmRlY19wb3dlcm9uKGVudW0gdmRlY190eXBlX2UgY29yZSkKK3sKKwl1bG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CisKKwlpZiAoY29yZSA9PSBWREVDXzEpIHsKKwkJLyogdmRlYzEgc29mdCByZXNldCAqLworCQlXUklURV9WUkVHKERPU19TV19SRVNFVDAsIDB4ZmZmZmZmZmMpOworCQlXUklURV9WUkVHKERPU19TV19SRVNFVDAsIDApOworCQkvKiBlbmFibGUgdmRlYzEgY2xvY2sgKi8KKwkJdmRlY19jbG9ja19lbmFibGUoKTsKKwkJLyogcmVzZXQgRE9TIHRvcCByZWdpc3RlcnMgKi8KKwkJV1JJVEVfVlJFRyhET1NfVkRFQ19NQ1JDQ19TVEFMTF9DVFJMLCAwKTsKKwl9IGVsc2UgaWYgKGNvcmUgPT0gVkRFQ18yKSB7CisJCS8qIHZkZWMyIHNvZnQgcmVzZXQgKi8KKwkJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQyLCAweGZmZmZmZmZmKTsKKwkJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQyLCAwKTsKKwkJLyogZW5hYmxlIHZkZWMyIGNsb2NrICovCisJCXZkZWMyX2Nsb2NrX2VuYWJsZSgpOworCQkvKiByZXNldCBET1MgdG9wIHJlZ2lzdGVycyAqLworCQlXUklURV9WUkVHKERPU19WREVDMl9NQ1JDQ19TVEFMTF9DVFJMLCAwKTsKKwl9IGVsc2UgaWYgKGNvcmUgPT0gVkRFQ19IQ09ERUMpIHsKKwkJLyogaGNvZGVjIHNvZnQgcmVzZXQgKi8KKwkJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQxLCAweGZmZmZmZmZmKTsKKwkJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQxLCAwKTsKKwkJLyogZW5hYmxlIGhjb2RlYyBjbG9jayAqLworCQloY29kZWNfY2xvY2tfZW5hYmxlKCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOworfQorCit2b2lkIHZkZWNfcG93ZXJvZmYoZW51bSB2ZGVjX3R5cGVfZSBjb3JlKQoreworCXVsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKKworCWlmIChjb3JlID09IFZERUNfMSkgeworCQkvKiBkaXNhYmxlIHZkZWMxIGNsb2NrICovCisJCXZkZWNfY2xvY2tfb2ZmKCk7CisJfSBlbHNlIGlmIChjb3JlID09IFZERUNfMikgeworCQkvKiBkaXNhYmxlIHZkZWMyIGNsb2NrICovCisJCXZkZWMyX2Nsb2NrX29mZigpOworCX0gZWxzZSBpZiAoY29yZSA9PSBWREVDX0hDT0RFQykgeworCQkvKiBkaXNhYmxlIGhjb2RlYyBjbG9jayAqLworCQloY29kZWNfY2xvY2tfb2ZmKCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOworfQorCitib29sIHZkZWNfb24oZW51bSB2ZGVjX3R5cGVfZSBjb3JlKQoreworCWJvb2wgcmV0ID0gZmFsc2U7CisKKwlpZiAoY29yZSA9PSBWREVDXzEpIHsKKwkJaWYgKFJFQURfSEhJX1JFRyhISElfVkRFQ19DTEtfQ05UTCkgJiAweDEwMCkKKwkJCXJldCA9IHRydWU7CisJfSBlbHNlIGlmIChjb3JlID09IFZERUNfMikgeworCQlpZiAoUkVBRF9ISElfUkVHKEhISV9WREVDMl9DTEtfQ05UTCkgJiAweDEwMCkKKwkJCXJldCA9IHRydWU7CisJfSBlbHNlIGlmIChjb3JlID09IFZERUNfSENPREVDKSB7CisJCWlmIChSRUFEX0hISV9SRUcoSEhJX1ZERUNfQ0xLX0NOVEwpICYgMHgxMDAwMDAwKQorCQkJcmV0ID0gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKK2ludCB2ZGVjX3NvdXJjZV9jaGFuZ2VkKGludCBmb3JtYXQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZwcykKK3sKKwkvKiB0b2RvOiBhZGQgbGV2ZWwgcm91dGluZXMgZm9yIGNsb2NrIGFkanVzdG1lbnQgcGVyIGNoaXBzICovCisJaW50IHJldCA9IC0xOworCXN0YXRpYyBpbnQgb25fc2V0dGluZzsKKworCWlmIChvbl9zZXR0aW5nID4gMCkKKwkJcmV0dXJuIHJldDsvKm9uIGNoYW5naW5nIGNsayxpZ25vcmUgdGhpcyBjaGFuZ2UqLworCisJaWYgKHZkZWNfc291cmNlX2dldChWREVDXzEpID09IHdpZHRoICogaGVpZ2h0ICogZnBzKQorCQlyZXR1cm4gcmV0OworCisKKwlvbl9zZXR0aW5nID0gMTsKKwlyZXQgPSB2ZGVjX3NvdXJjZV9jaGFuZ2VkX2Zvcl9jbGtfc2V0KGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgZnBzKTsKKwlwcl9kZWJ1ZygidmRlYzEgdmlkZW8gY2hhbmdlZCB0byAlZCB4ICVkICVkIGZwcyBjbGstPiVkTUhaXG4iLAorCQkJd2lkdGgsIGhlaWdodCwgZnBzLCB2ZGVjX2Nsa19nZXQoVkRFQ18xKSk7CisJb25fc2V0dGluZyA9IDA7CisJcmV0dXJuIHJldDsKKworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3NvdXJjZV9jaGFuZ2VkKTsKKwordm9pZCB2ZGVjX3Jlc2V0X2NvcmUoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDcpIHx8CisJCShnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1QzKSkgeworCQkvKiB0NyBubyBkbWMgcmVxIGZvciB2ZGVjIG9ubHkgKi8KKwkJdmRlY19kYnVzX2N0cmwoMCk7CisJfSBlbHNlIHsKKwkJZGVjX2RtY19wb3J0X2N0cmwoMCwgVkRFQ19JTlBVVF9UQVJHRVRfVkxEKTsKKwl9CisJLyoKKwkgKiAyOiBhc3Npc3QKKwkgKiAzOiB2bGRfcmVzZXQKKwkgKiA0OiB2bGRfcGFydF9yZXNldAorCSAqIDU6IHZmaWZvIHJlc2V0CisJICogNjogaXFpZGN0CisJICogNzogbWMKKwkgKiA4OiBkYmxrCisJICogOTogcGljX2RjCisJICogMTA6IHBzYworCSAqIDExOiBtY3B1CisJICogMTI6IGNjcHUKKwkgKiAxMzogZGRyCisJICogMTQ6IGFmaWZvCisJICovCisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAoMTw8Myl8KDE8PDQpfCgxPDw1KXwoMTw8Nyl8KDE8PDgpfCgxPDw5KSk7CisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAwKTsKKworCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNykgfHwKKwkJKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDMpKQorCQl2ZGVjX2RidXNfY3RybCgxKTsKKwllbHNlCisJCWRlY19kbWNfcG9ydF9jdHJsKDEsIFZERUNfSU5QVVRfVEFSR0VUX1ZMRCk7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfcmVzZXRfY29yZSk7CisKK3ZvaWQgaGV2Y19tbXVfZG1hX2NoZWNrKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJdWxvbmcgdGltZW91dDsKKwl1MzIgZGF0YTsKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpCisJCXJldHVybjsKKwl0aW1lb3V0ID0gamlmZmllcyArIEhaLzEwMDsKKwl3aGlsZSAoMSkgeworCQlkYXRhICA9IFJFQURfVlJFRyhIRVZDX0NNX0NPUkVfU1RBVFVTKTsKKwkJaWYgKChkYXRhICYgMHgxKSA9PSAwKQorCQkJYnJlYWs7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQlpZiAoZGVidWcgJiAweDEwKQorCQkJCXByX2luZm8oIiAlcyBzYW8gbW11IGRtYSBpZGxlXG4iLCBfX2Z1bmNfXyk7CisJCQlicmVhazsKKwkJfQorCX0KKwkvKmRpc2FibGUgc2FvIG1tdSBkbWEgKi8KKwlDTEVBUl9WUkVHX01BU0soSEVWQ19TQU9fTU1VX0RNQV9DVFJMLCAxIDw8IDApOworCXRpbWVvdXQgPSBqaWZmaWVzICsgSFovMTAwOworCXdoaWxlICgxKSB7CisJCWRhdGEgID0gUkVBRF9WUkVHKEhFVkNfU0FPX01NVV9ETUFfU1RBVFVTKTsKKwkJaWYgKChkYXRhICYgMHgxKSkKKwkJCWJyZWFrOworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJaWYgKGRlYnVnICYgMHgxMCkKKwkJCQlwcl9lcnIoIiVzIHNhbyBtbXUgZG1hIHRpbWVvdXQsIG51bV9idWZfdXNlZCA9IDB4JXhcbiIsCisJCQkJX19mdW5jX18sIChSRUFEX1ZSRUcoSEVWQ19TQU9fTU1VX1NUQVRVUykgPj4gMTYpKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorRVhQT1JUX1NZTUJPTChoZXZjX21tdV9kbWFfY2hlY2spOworCit2b2lkIGhldmNfcmVzZXRfY29yZShzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCWludCBjcHVfdHlwZSA9IGdldF9jcHVfbWFqb3JfaWQoKTsKKworCWlmICgoY3B1X3R5cGUgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3KSB8fAorCQkoY3B1X3R5cGUgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1QzKSkgeworCQkvKiB0NyBubyBkbWMgcmVxIGZvciBoZXZjIG9ubHkgKi8KKwkJaGV2Y19hcmJfY3RybCgwKTsKKwl9IGVsc2UgeworCQlXUklURV9WUkVHKEhFVkNfU1RSRUFNX0NPTlRST0wsIDApOworCisJCWRlY19kbWNfcG9ydF9jdHJsKDAsIFZERUNfSU5QVVRfVEFSR0VUX0hFVkMpOworCX0KKworCWlmICh2ZGVjID09IE5VTEwgfHwgaW5wdXRfZnJhbWVfYmFzZWQodmRlYykpCisJCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fQ09OVFJPTCwgMCk7CisKKwlXUklURV9WUkVHKEhFVkNfU0FPX01NVV9SRVNFVF9DVFJMLAorCQkJUkVBRF9WUkVHKEhFVkNfU0FPX01NVV9SRVNFVF9DVFJMKSB8IDEpOworCisJLyoKKwkgKiAyOiBhc3Npc3QKKwkgKiAzOiBwYXJzZXIKKwkgKiA0OiBwYXJzZXJfc3RhdGUKKwkgKiA4OiBkYmxrCisJICogMTA6d3Jyc3AgbG1lbQorCSAqIDExOm1jcHUKKwkgKiAxMjpjY3B1CisJICogMTM6ZGRyCisJICogMTQ6aXFpdAorCSAqIDE1OmlwcAorCSAqIDE3OnFkY3QKKwkgKiAxODptcHJlZAorCSAqIDE5OnNhbworCSAqIDI0OmhldmNfYWZpZm8KKwkgKiAyNjpyc3RfbW11X24KKwkgKi8KKwlXUklURV9WUkVHKERPU19TV19SRVNFVDMsCisJCSgxPDwzKXwoMTw8NCl8KDE8PDgpfCgxPDwxMCl8KDE8PDExKXwKKwkJKDE8PDEyKXwoMTw8MTMpfCgxPDwxNCl8KDE8PDE1KXwKKwkJKDE8PDE3KXwoMTw8MTgpfCgxPDwxOSl8KDE8PDI0KXwoMTw8MjYpKTsKKworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMywgMCk7CisJd2hpbGUgKFJFQURfVlJFRyhIRVZDX1dSUlNQX0xNRU0pICYgMHhmZmYpCisJCTsKKwlXUklURV9WUkVHKEhFVkNfU0FPX01NVV9SRVNFVF9DVFJMLAorCQkJUkVBRF9WUkVHKEhFVkNfU0FPX01NVV9SRVNFVF9DVFJMKSAmICh+MSkpOworCisJaWYgKGNwdV90eXBlID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UTDEgJiYKKwkJCWlzX21lc29uX3Jldl9iKCkpCisJCWNwdV90eXBlID0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkI7CisJc3dpdGNoIChjcHVfdHlwZSkgeworCWNhc2UgQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkI6CisJCVdSSVRFX1JFU0VUX1JFRygoUkVTRVQ3X1JFR0lTVEVSX0xFVkVMKSwKKwkJCQlSRUFEX1JFU0VUX1JFRyhSRVNFVDdfUkVHSVNURVJfTEVWRUwpICYgKH4oKDE8PDEzKXwoMTw8MTQpKSkpOworCQlXUklURV9SRVNFVF9SRUcoKFJFU0VUN19SRUdJU1RFUl9MRVZFTCksCisJCQkJUkVBRF9SRVNFVF9SRUcoKFJFU0VUN19SRUdJU1RFUl9MRVZFTCkpIHwgKCgxPDwxMyl8KDE8PDE0KSkpOworCQlicmVhazsKKwljYXNlIEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBOgorCWNhc2UgQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMToKKwljYXNlIEFNX01FU09OX0NQVV9NQUpPUl9JRF9UTDE6CisJY2FzZSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVE0yOgorCWNhc2UgQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1OgorCWNhc2UgQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1RDoKKwljYXNlIEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNVc6CisJCVdSSVRFX1JFU0VUX1JFRygoUkVTRVQ3X1JFR0lTVEVSX0xFVkVMKSwKKwkJCQlSRUFEX1JFU0VUX1JFRyhSRVNFVDdfUkVHSVNURVJfTEVWRUwpICYgKH4oKDE8PDEzKSkpKTsKKwkJV1JJVEVfUkVTRVRfUkVHKChSRVNFVDdfUkVHSVNURVJfTEVWRUwpLAorCQkJCVJFQURfUkVTRVRfUkVHKChSRVNFVDdfUkVHSVNURVJfTEVWRUwpKSB8ICgoMTw8MTMpKSk7CisJCWJyZWFrOworCWNhc2UgQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NDMjoKKwljYXNlIEFNX01FU09OX0NQVV9NQUpPUl9JRF9TNDoKKwljYXNlIEFNX01FU09OX0NQVV9NQUpPUl9JRF9TNEQ6CisJCVdSSVRFX1JFU0VUX1JFRyhQX1JFU0VUQ1RSTF9SRVNFVDVfTEVWRUwsCisJCQkJUkVBRF9SRVNFVF9SRUcoUF9SRVNFVENUUkxfUkVTRVQ1X0xFVkVMKSAmICh+KCgxPDwxKXwoMTw8MTIpfCgxPDwxMykpKSk7CisJCVdSSVRFX1JFU0VUX1JFRyhQX1JFU0VUQ1RSTF9SRVNFVDVfTEVWRUwsCisJCQkJUkVBRF9SRVNFVF9SRUcoUF9SRVNFVENUUkxfUkVTRVQ1X0xFVkVMKSB8ICgoMTw8MSl8KDE8PDEyKXwoMTw8MTMpKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWlmICgoY3B1X3R5cGUgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3KSB8fAorCQkoY3B1X3R5cGUgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1QzKSkKKwkJaGV2Y19hcmJfY3RybCgxKTsKKwllbHNlCisJCWRlY19kbWNfcG9ydF9jdHJsKDEsIFZERUNfSU5QVVRfVEFSR0VUX0hFVkMpOworfQorRVhQT1JUX1NZTUJPTChoZXZjX3Jlc2V0X2NvcmUpOworCitpbnQgdmRlYzJfc291cmNlX2NoYW5nZWQoaW50IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZnBzKQoreworCWludCByZXQgPSAtMTsKKwlzdGF0aWMgaW50IG9uX3NldHRpbmc7CisKKwlpZiAoaGFzX3ZkZWMyKCkpIHsKKwkJLyogdG9kbzogYWRkIGxldmVsIHJvdXRpbmVzIGZvciBjbG9jayBhZGp1c3RtZW50IHBlciBjaGlwcyAqLworCQlpZiAob25fc2V0dGluZyAhPSAwKQorCQkJcmV0dXJuIHJldDsvKm9uIGNoYW5naW5nIGNsayxpZ25vcmUgdGhpcyBjaGFuZ2UqLworCisJCWlmICh2ZGVjX3NvdXJjZV9nZXQoVkRFQ18yKSA9PSB3aWR0aCAqIGhlaWdodCAqIGZwcykKKwkJCXJldHVybiByZXQ7CisKKwkJb25fc2V0dGluZyA9IDE7CisJCXJldCA9IHZkZWNfc291cmNlX2NoYW5nZWRfZm9yX2Nsa19zZXQoZm9ybWF0LAorCQkJCQl3aWR0aCwgaGVpZ2h0LCBmcHMpOworCQlwcl9kZWJ1ZygidmRlYzIgdmlkZW8gY2hhbmdlZCB0byAlZCB4ICVkICVkIGZwcyBjbGstPiVkTUhaXG4iLAorCQkJd2lkdGgsIGhlaWdodCwgZnBzLCB2ZGVjX2Nsa19nZXQoVkRFQ18yKSk7CisJCW9uX3NldHRpbmcgPSAwOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wodmRlYzJfc291cmNlX2NoYW5nZWQpOworCitpbnQgaGV2Y19zb3VyY2VfY2hhbmdlZChpbnQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmcHMpCit7CisJLyogdG9kbzogYWRkIGxldmVsIHJvdXRpbmVzIGZvciBjbG9jayBhZGp1c3RtZW50IHBlciBjaGlwcyAqLworCWludCByZXQgPSAtMTsKKwlzdGF0aWMgaW50IG9uX3NldHRpbmc7CisKKwlpZiAob25fc2V0dGluZyAhPSAwKQorCQlyZXR1cm4gcmV0Oy8qb24gY2hhbmdpbmcgY2xrLGlnbm9yZSB0aGlzIGNoYW5nZSovCisKKwlpZiAodmRlY19zb3VyY2VfZ2V0KFZERUNfSEVWQykgPT0gd2lkdGggKiBoZWlnaHQgKiBmcHMpCisJCXJldHVybiByZXQ7CisKKwlvbl9zZXR0aW5nID0gMTsKKwlyZXQgPSB2ZGVjX3NvdXJjZV9jaGFuZ2VkX2Zvcl9jbGtfc2V0KGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgZnBzKTsKKwlwcl9kZWJ1ZygiaGV2YyB2aWRlbyBjaGFuZ2VkIHRvICVkIHggJWQgJWQgZnBzIGNsay0+JWRNSFpcbiIsCisJCQl3aWR0aCwgaGVpZ2h0LCBmcHMsIHZkZWNfY2xrX2dldChWREVDX0hFVkMpKTsKKwlvbl9zZXR0aW5nID0gMDsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGhldmNfc291cmNlX2NoYW5nZWQpOworCitzdGF0aWMgc3RydWN0IGFtX3JlZyBhbV9yaXNjW10gPSB7CisJeyJNU1AiLCAweDMwMH0sCisJeyJNUFNSIiwgMHgzMDF9LAorCXsiTUNQVV9JTlRfQkFTRSIsIDB4MzAyfSwKKwl7Ik1DUFVfSU5UUl9HUlAiLCAweDMwM30sCisJeyJNQ1BVX0lOVFJfTVNLIiwgMHgzMDR9LAorCXsiTUNQVV9JTlRSX1JFUSIsIDB4MzA1fSwKKwl7Ik1QQy1QIiwgMHgzMDZ9LAorCXsiTVBDLUQiLCAweDMwN30sCisJeyJNUENfRSIsIDB4MzA4fSwKKwl7Ik1QQ19XIiwgMHgzMDl9LAorCXsiQ1NQIiwgMHgzMjB9LAorCXsiQ1BTUiIsIDB4MzIxfSwKKwl7IkNDUFVfSU5UX0JBU0UiLCAweDMyMn0sCisJeyJDQ1BVX0lOVFJfR1JQIiwgMHgzMjN9LAorCXsiQ0NQVV9JTlRSX01TSyIsIDB4MzI0fSwKKwl7IkNDUFVfSU5UUl9SRVEiLCAweDMyNX0sCisJeyJDUEMtUCIsIDB4MzI2fSwKKwl7IkNQQy1EIiwgMHgzMjd9LAorCXsiQ1BDX0UiLCAweDMyOH0sCisJeyJDUENfVyIsIDB4MzI5fSwKKwl7IkFWX1NDUkFUQ0hfMCIsIDB4MDljMH0sCisJeyJBVl9TQ1JBVENIXzEiLCAweDA5YzF9LAorCXsiQVZfU0NSQVRDSF8yIiwgMHgwOWMyfSwKKwl7IkFWX1NDUkFUQ0hfMyIsIDB4MDljM30sCisJeyJBVl9TQ1JBVENIXzQiLCAweDA5YzR9LAorCXsiQVZfU0NSQVRDSF81IiwgMHgwOWM1fSwKKwl7IkFWX1NDUkFUQ0hfNiIsIDB4MDljNn0sCisJeyJBVl9TQ1JBVENIXzciLCAweDA5Yzd9LAorCXsiQVZfU0NSQVRDSF84IiwgMHgwOWM4fSwKKwl7IkFWX1NDUkFUQ0hfOSIsIDB4MDljOX0sCisJeyJBVl9TQ1JBVENIX0EiLCAweDA5Y2F9LAorCXsiQVZfU0NSQVRDSF9CIiwgMHgwOWNifSwKKwl7IkFWX1NDUkFUQ0hfQyIsIDB4MDljY30sCisJeyJBVl9TQ1JBVENIX0QiLCAweDA5Y2R9LAorCXsiQVZfU0NSQVRDSF9FIiwgMHgwOWNlfSwKKwl7IkFWX1NDUkFUQ0hfRiIsIDB4MDljZn0sCisJeyJBVl9TQ1JBVENIX0ciLCAweDA5ZDB9LAorCXsiQVZfU0NSQVRDSF9IIiwgMHgwOWQxfSwKKwl7IkFWX1NDUkFUQ0hfSSIsIDB4MDlkMn0sCisJeyJBVl9TQ1JBVENIX0oiLCAweDA5ZDN9LAorCXsiQVZfU0NSQVRDSF9LIiwgMHgwOWQ0fSwKKwl7IkFWX1NDUkFUQ0hfTCIsIDB4MDlkNX0sCisJeyJBVl9TQ1JBVENIX00iLCAweDA5ZDZ9LAorCXsiQVZfU0NSQVRDSF9OIiwgMHgwOWQ3fSwKK307CisKK3N0YXRpYyBzc2l6ZV90IGFtcmlzY19yZWdzX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKKwkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWNoYXIgKnBidWYgPSBidWY7CisJc3RydWN0IGFtX3JlZyAqcmVncyA9IGFtX3Jpc2M7CisJaW50IHJzaXplID0gc2l6ZW9mKGFtX3Jpc2MpIC8gc2l6ZW9mKHN0cnVjdCBhbV9yZWcpOworCWludCBpOworCXVuc2lnbmVkIGludCB2YWw7CisJc3NpemVfdCByZXQ7CisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9NOCkgeworCQltdXRleF9sb2NrKCZ2ZGVjX211dGV4KTsKKwkJaWYgKCF2ZGVjX29uKFZERUNfMSkpIHsKKwkJCW11dGV4X3VubG9jaygmdmRlY19tdXRleCk7CisJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgImFtcmlzYyBpcyBwb3dlciBvZmZcbiIpOworCQkJcmV0ID0gcGJ1ZiAtIGJ1ZjsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9IGVsc2UgaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfTTYpIHsKKwkJLypUT0RPOk02IGRlZmluZSAqLworCQkvKgorCQkgKiAgc3dpdGNoX21vZF9nYXRlX2J5X3R5cGUoTU9EX1ZERUMsIDEpOworCQkgKi8KKwkJYW1wb3J0c19zd2l0Y2hfZ2F0ZSgidmRlYyIsIDEpOworCX0KKwlwYnVmICs9IHNwcmludGYocGJ1ZiwgImFtcmlzYyByZWdpc3RlcnMgc2hvdzpcbiIpOworCWZvciAoaSA9IDA7IGkgPCByc2l6ZTsgaSsrKSB7CisJCXZhbCA9IFJFQURfVlJFRyhyZWdzW2ldLm9mZnNldCk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJXMoJSN4KVx0OiUjeCglZClcbiIsCisJCQkJcmVnc1tpXS5uYW1lLCByZWdzW2ldLm9mZnNldCwgdmFsLCB2YWwpOworCX0KKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9NOCkKKwkJbXV0ZXhfdW5sb2NrKCZ2ZGVjX211dGV4KTsKKwllbHNlIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX002KSB7CisJCS8qVE9ETzpNNiBkZWZpbmUgKi8KKwkJLyoKKwkJICogIHN3aXRjaF9tb2RfZ2F0ZV9ieV90eXBlKE1PRF9WREVDLCAwKTsKKwkJICovCisJCWFtcG9ydHNfc3dpdGNoX2dhdGUoInZkZWMiLCAwKTsKKwl9CisJcmV0ID0gcGJ1ZiAtIGJ1ZjsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBkdW1wX3RyYWNlX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKKwkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCBpOworCWNoYXIgKnBidWYgPSBidWY7CisJc3NpemVfdCByZXQ7CisJdTE2ICp0cmFjZV9idWYgPSBrbWFsbG9jKGRlYnVnX3RyYWNlX251bSAqIDIsIEdGUF9LRVJORUwpOworCisJaWYgKCF0cmFjZV9idWYpIHsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJObyBNZW1vcnkgYnVnXG4iKTsKKwkJcmV0ID0gcGJ1ZiAtIGJ1ZjsKKwkJcmV0dXJuIHJldDsKKwl9CisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfTTgpIHsKKwkJbXV0ZXhfbG9jaygmdmRlY19tdXRleCk7CisJCWlmICghdmRlY19vbihWREVDXzEpKSB7CisJCQltdXRleF91bmxvY2soJnZkZWNfbXV0ZXgpOworCQkJa2ZyZWUodHJhY2VfYnVmKTsKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiYW1yaXNjIGlzIHBvd2VyIG9mZlxuIik7CisJCQlyZXQgPSBwYnVmIC0gYnVmOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0gZWxzZSBpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9NNikgeworCQkvKlRPRE86TTYgZGVmaW5lICovCisJCS8qCisJCSAqICBzd2l0Y2hfbW9kX2dhdGVfYnlfdHlwZShNT0RfVkRFQywgMSk7CisJCSAqLworCQlhbXBvcnRzX3N3aXRjaF9nYXRlKCJ2ZGVjIiwgMSk7CisJfQorCXByX2luZm8oImR1bXAgdHJhY2Ugc3RlcHM6JWQgc3RhcnRcbiIsIGRlYnVnX3RyYWNlX251bSk7CisJaSA9IDA7CisJd2hpbGUgKGkgPD0gZGVidWdfdHJhY2VfbnVtIC0gMTYpIHsKKwkJdHJhY2VfYnVmW2ldID0gUkVBRF9WUkVHKE1QQ19FKTsKKwkJdHJhY2VfYnVmW2kgKyAxXSA9IFJFQURfVlJFRyhNUENfRSk7CisJCXRyYWNlX2J1ZltpICsgMl0gPSBSRUFEX1ZSRUcoTVBDX0UpOworCQl0cmFjZV9idWZbaSArIDNdID0gUkVBRF9WUkVHKE1QQ19FKTsKKwkJdHJhY2VfYnVmW2kgKyA0XSA9IFJFQURfVlJFRyhNUENfRSk7CisJCXRyYWNlX2J1ZltpICsgNV0gPSBSRUFEX1ZSRUcoTVBDX0UpOworCQl0cmFjZV9idWZbaSArIDZdID0gUkVBRF9WUkVHKE1QQ19FKTsKKwkJdHJhY2VfYnVmW2kgKyA3XSA9IFJFQURfVlJFRyhNUENfRSk7CisJCXRyYWNlX2J1ZltpICsgOF0gPSBSRUFEX1ZSRUcoTVBDX0UpOworCQl0cmFjZV9idWZbaSArIDldID0gUkVBRF9WUkVHKE1QQ19FKTsKKwkJdHJhY2VfYnVmW2kgKyAxMF0gPSBSRUFEX1ZSRUcoTVBDX0UpOworCQl0cmFjZV9idWZbaSArIDExXSA9IFJFQURfVlJFRyhNUENfRSk7CisJCXRyYWNlX2J1ZltpICsgMTJdID0gUkVBRF9WUkVHKE1QQ19FKTsKKwkJdHJhY2VfYnVmW2kgKyAxM10gPSBSRUFEX1ZSRUcoTVBDX0UpOworCQl0cmFjZV9idWZbaSArIDE0XSA9IFJFQURfVlJFRyhNUENfRSk7CisJCXRyYWNlX2J1ZltpICsgMTVdID0gUkVBRF9WUkVHKE1QQ19FKTsKKwkJaSArPSAxNjsKKwl9OworCXByX2luZm8oImR1bXAgdHJhY2Ugc3RlcHM6JWQgZmluaXNoZWRcbiIsIGRlYnVnX3RyYWNlX251bSk7CisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfTTgpCisJCW11dGV4X3VubG9jaygmdmRlY19tdXRleCk7CisJZWxzZSBpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9NNikgeworCQkvKlRPRE86TTYgZGVmaW5lICovCisJCS8qCisJCSAqICBzd2l0Y2hfbW9kX2dhdGVfYnlfdHlwZShNT0RfVkRFQywgMCk7CisJCSAqLworCQlhbXBvcnRzX3N3aXRjaF9nYXRlKCJ2ZGVjIiwgMCk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBkZWJ1Z190cmFjZV9udW07IGkrKykgeworCQlpZiAoaSAlIDQgPT0gMCkgeworCQkJaWYgKGkgJSAxNiA9PSAwKQorCQkJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiXG4iKTsKKwkJCWVsc2UgaWYgKGkgJSA4ID09IDApCisJCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIgICIpOworCQkJZWxzZQkvKiA0ICovCisJCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIgIik7CisJCX0KKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlMDR4OiIsIHRyYWNlX2J1ZltpXSk7CisJfQorCXdoaWxlIChpIDwgZGVidWdfdHJhY2VfbnVtKQorCQk7CisJa2ZyZWUodHJhY2VfYnVmKTsKKwlwYnVmICs9IHNwcmludGYocGJ1ZiwgIlxuIik7CisJcmV0ID0gcGJ1ZiAtIGJ1ZjsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBjbG9ja19sZXZlbF9zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwljaGFyICpwYnVmID0gYnVmOworCXNpemVfdCByZXQ7CisKKwlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiVkTUhaXG4iLCB2ZGVjX2Nsa19nZXQoVkRFQ18xKSk7CisKKwlpZiAoaGFzX3ZkZWMyKCkpCisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJWRNSFpcbiIsIHZkZWNfY2xrX2dldChWREVDXzIpKTsKKworCWlmIChoYXNfaGV2Y192ZGVjKCkpCisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJWRNSFpcbiIsIHZkZWNfY2xrX2dldChWREVDX0hFVkMpKTsKKworCXJldCA9IHBidWYgLSBidWY7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgZW5hYmxlX212ZGVjX2luZm9fc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYSwKKwkJCQkgIHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZW5hYmxlX212ZGVjX2luZm8pOworfQorCitzdGF0aWMgc3NpemVfdCBlbmFibGVfbXZkZWNfaW5mb19zdG9yZShzdHJ1Y3QgY2xhc3MgKmNsYSwKKwkJCQkgICBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCByOworCWludCB2YWw7CisKKwlyID0ga3N0cnRvaW50KGJ1ZiwgMCwgJnZhbCk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllbmFibGVfbXZkZWNfaW5mbyA9IHZhbDsKKworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBzc2l6ZV90IHBvd2Vyb25fY2xvY2tfbGV2ZWxfc3RvcmUoc3RydWN0IGNsYXNzICpjbGFzcywKKwkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCXNzaXplX3QgcmV0OworCisJLypyZXQgPSBzc2NhbmYoYnVmLCAiJWQiLCAmdmFsKTsqLworCXJldCA9IGtzdHJ0b2ludChidWYsIDAsICZ2YWwpOworCisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwb3dlcm9uX2Nsb2NrX2xldmVsID0gdmFsOworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBwb3dlcm9uX2Nsb2NrX2xldmVsX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKKwkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwb3dlcm9uX2Nsb2NrX2xldmVsKTsKK30KKworLyoKKyAqaWYga2VlcF92ZGVjX21lbSA9PSAxCisgKmFsd2F5cyBkb24ndCByZWxlYXNlCisgKnZkZWMgNjQgbWVtb3J5IGZvciBmYXN0IHBsYXkuCisgKi8KK3N0YXRpYyBzc2l6ZV90IGtlZXBfdmRlY19tZW1fc3RvcmUoc3RydWN0IGNsYXNzICpjbGFzcywKKwkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCXNzaXplX3QgcmV0OworCisJLypyZXQgPSBzc2NhbmYoYnVmLCAiJWQiLCAmdmFsKTsqLworCXJldCA9IGtzdHJ0b2ludChidWYsIDAsICZ2YWwpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJa2VlcF92ZGVjX21lbSA9IHZhbDsKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3Qga2VlcF92ZGVjX21lbV9zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwga2VlcF92ZGVjX21lbSk7Cit9CisKKyNpZmRlZiBWREVDX0RFQlVHX1NVUFBPUlQKK3N0YXRpYyBzc2l6ZV90IGRlYnVnX3N0b3JlKHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHZkZWNfcyAqdmRlYzsKKwlzdHJ1Y3QgdmRlY19jb3JlX3MgKmNvcmUgPSB2ZGVjX2NvcmU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXVuc2lnbmVkIGlkOworCXVuc2lnbmVkIHZhbDsKKwlzc2l6ZV90IHJldDsKKwljaGFyIGNidWZbMzJdOworCisJY2J1ZlswXSA9IDA7CisJcmV0ID0gc3NjYW5mKGJ1ZiwgIiVzICV4ICV4IiwgY2J1ZiwgJmlkLCAmdmFsKTsKKwkvKnByX2luZm8oCisJIiVzKCVzKT0+cmV0ICVsZDogJXMsICV4LCAleFxuIiwKKwlfX2Z1bmNfXywgYnVmLCByZXQsIGNidWYsIGlkLCB2YWwpOyovCisJaWYgKHN0cmNtcChjYnVmLCAic2NoZWR1bGUiKSA9PSAwKSB7CisJCXByX2luZm8oIlZERUNfREVCVUc6IGZvcmNlIHNjaGVkdWxlXG4iKTsKKwkJdXAoJmNvcmUtPnNlbSk7CisJfSBlbHNlIGlmIChzdHJjbXAoY2J1ZiwgInBvd2VyX29mZiIpID09IDApIHsKKwkJcHJfaW5mbygiVkRFQ19ERUJVRzogcG93ZXIgb2ZmIGNvcmUgJWRcbiIsIGlkKTsKKwkJdmRlY19wb3dlcm9mZihpZCk7CisJfSBlbHNlIGlmIChzdHJjbXAoY2J1ZiwgInBvd2VyX29uIikgPT0gMCkgeworCQlwcl9pbmZvKCJWREVDX0RFQlVHOiBwb3dlcl9vbiBjb3JlICVkXG4iLCBpZCk7CisJCXZkZWNfcG93ZXJvbihpZCk7CisJfSBlbHNlIGlmIChzdHJjbXAoY2J1ZiwgIndyIikgPT0gMCkgeworCQlwcl9pbmZvKCJWREVDX0RFQlVHOiBXUklURV9WUkVHKDB4JXgsIDB4JXgpXG4iLAorCQkJaWQsIHZhbCk7CisJCVdSSVRFX1ZSRUcoaWQsIHZhbCk7CisJfSBlbHNlIGlmIChzdHJjbXAoY2J1ZiwgInJkIikgPT0gMCkgeworCQlwcl9pbmZvKCJWREVDX0RFQlVHOiBSRUFEX1ZSRUcoMHgleCkgPSAweCV4XG4iLAorCQkJaWQsIFJFQURfVlJFRyhpZCkpOworCX0gZWxzZSBpZiAoc3RyY21wKGNidWYsICJyZWFkX2hldmNfY2xrX3JlZyIpID09IDApIHsKKwkJcHJfaW5mbygKKwkJCSJWREVDX0RFQlVHOiBISElfVkRFQzRfQ0xLX0NOVEwgPSAweCV4LCBISElfVkRFQzJfQ0xLX0NOVEwgPSAweCV4XG4iLAorCQkJUkVBRF9ISElfUkVHKEhISV9WREVDNF9DTEtfQ05UTCksCisJCQlSRUFEX0hISV9SRUcoSEhJX1ZERUMyX0NMS19DTlRMKSk7CisJfSBlbHNlIGlmIChzdHJjbXAoY2J1ZiwgIm5vX2ludGVybGFjZSIpID09IDApIHsKKwkJcHJvZ19vbmx5IF49IDE7CisJCXByX2luZm8oInNldCBwcm9nIG9ubHkgJWQsICVzIG91dHB1dFxuIiwKKwkJCXByb2dfb25seSwgcHJvZ19vbmx5PyJmb3JjZSBvbmUgZmlsZWQgb25seSI6ImludGVybGFjZSIpOworCX0KKworCWZsYWdzID0gdmRlY19jb3JlX2xvY2sodmRlY19jb3JlKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodmRlYywKKwkJJmNvcmUtPmNvbm5lY3RlZF92ZGVjX2xpc3QsIGxpc3QpIHsKKwkJcHJfaW5mbygidmRlYzogc3RhdHVzICVkLCBpZCAlZFxuIiwgdmRlYy0+c3RhdHVzLCB2ZGVjLT5pZCk7CisJCWlmICgoKHZkZWMtPnN0YXR1cyA9PSBWREVDX1NUQVRVU19DT05ORUNURUQKKwkJCXx8IHZkZWMtPnN0YXR1cyA9PSBWREVDX1NUQVRVU19BQ1RJVkUpKSAmJgorCQkJKHZkZWMtPmlkID09IGlkKSkgeworCQkJCS8qdG8gYWRkKi8KKwkJCQlicmVhazsKKwkJfQorCX0KKwl2ZGVjX2NvcmVfdW5sb2NrKHZkZWNfY29yZSwgZmxhZ3MpOworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBkZWJ1Z19zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwljaGFyICpwYnVmID0gYnVmOworCXN0cnVjdCB2ZGVjX3MgKnZkZWM7CisJc3RydWN0IHZkZWNfY29yZV9zICpjb3JlID0gdmRlY19jb3JlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSB2ZGVjX2NvcmVfbG9jayh2ZGVjX2NvcmUpOworCXU2NCB0bXA7CisKKwlwYnVmICs9IHNwcmludGYocGJ1ZiwKKwkJIj09PT09PT09PT09PT09IGhlbHA6XG4iKTsKKwlwYnVmICs9IHNwcmludGYocGJ1ZiwKKwkJIidlY2hvIHh4eCA+IGRlYnVnJyB1c3VhZ2U6XG4iKTsKKwlwYnVmICs9IHNwcmludGYocGJ1ZiwKKwkJInNjaGVkdWxlIC0gdHJpZ2dlciBzY2hlZHVsZSB0aHJlYWQgdG8gcnVuXG4iKTsKKwlwYnVmICs9IHNwcmludGYocGJ1ZiwKKwkJInBvd2VyX29mZiBjb3JlX251bSAtIGNhbGwgdmRlY19wb3dlcm9mZihjb3JlX251bSlcbiIpOworCXBidWYgKz0gc3ByaW50ZihwYnVmLAorCQkicG93ZXJfb24gY29yZV9udW0gLSBjYWxsIHZkZWNfcG93ZXJvbihjb3JlX251bSlcbiIpOworCXBidWYgKz0gc3ByaW50ZihwYnVmLAorCQkid3IgYWRyIHZhbCAtIGNhbGwgV1JJVEVfVlJFRyhhZHIsIHZhbClcbiIpOworCXBidWYgKz0gc3ByaW50ZihwYnVmLAorCQkicmQgYWRyIC0gY2FsbCBSRUFEX1ZSRUcoYWRyKVxuIik7CisJcGJ1ZiArPSBzcHJpbnRmKHBidWYsCisJCSJyZWFkX2hldmNfY2xrX3JlZyAtIHJlYWQgSEhJIHJlZ2lzdGVyIGZvciBoZXZjIGNsa1xuIik7CisJcGJ1ZiArPSBzcHJpbnRmKHBidWYsCisJCSJub19pbnRlcmxhY2UgLSBmb3JjZSB2NGwgbm9faW50ZXJsYWNlIG91dHB1dC4gJWRcbiIsIHByb2dfb25seSk7CisJcGJ1ZiArPSBzcHJpbnRmKHBidWYsCisJCSI9PT09PT09PT09PT09PT09PT09XG4iKTsKKworCXBidWYgKz0gc3ByaW50ZihwYnVmLAorCQkibmFtZShjb3JlKVx0c2NoZWR1bGVfY291bnRcdHJ1bl9jb3VudFx0aW5wdXRfdW5kZXJydW5cdGRlY2J1Zl9ub3RfcmVhZHlcdHJ1bl90aW1lXG4iKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZkZWMsCisJCSZjb3JlLT5jb25uZWN0ZWRfdmRlY19saXN0LCBsaXN0KSB7CisJCWVudW0gdmRlY190eXBlX2UgdHlwZTsKKwkJaWYgKCh2ZGVjLT5zdGF0dXMgPT0gVkRFQ19TVEFUVVNfQ09OTkVDVEVECisJCQl8fCB2ZGVjLT5zdGF0dXMgPT0gVkRFQ19TVEFUVVNfQUNUSVZFKSkgeworCQlmb3IgKHR5cGUgPSBWREVDXzE7IHR5cGUgPCBWREVDX01BWDsgdHlwZSsrKSB7CisJCQlpZiAodmRlYy0+Y29yZV9tYXNrICYgKDEgPDwgdHlwZSkpIHsKKwkJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiVzKCVkKToiLAorCQkJCQl2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLCB0eXBlKTsKKwkJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIlx0JWQiLAorCQkJCQl2ZGVjLT5jaGVja19jb3VudFt0eXBlXSk7CisJCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJcdCVkIiwKKwkJCQkJdmRlYy0+cnVuX2NvdW50W3R5cGVdKTsKKwkJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIlx0JWQiLAorCQkJCQl2ZGVjLT5pbnB1dF91bmRlcnJ1bl9jb3VudFt0eXBlXSk7CisJCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJcdCVkIiwKKwkJCQkJdmRlYy0+bm90X3J1bl9yZWFkeV9jb3VudFt0eXBlXSk7CisJCQkJdG1wID0gdmRlYy0+cnVuX2Nsa1t0eXBlXSAqIDEwMDsKKwkJCQlkb19kaXYodG1wLCB2ZGVjLT50b3RhbF9jbGtbdHlwZV0pOworCQkJCXBidWYgKz0gc3ByaW50ZihwYnVmLAorCQkJCQkiXHQlZCUlXG4iLAorCQkJCQl2ZGVjLT50b3RhbF9jbGtbdHlwZV0gPT0gMCA/IDAgOgorCQkJCQkodTMyKXRtcCk7CisJCQl9CisJCX0KKwkgIH0KKwl9CisKKwl2ZGVjX2NvcmVfdW5sb2NrKHZkZWNfY29yZSwgZmxhZ3MpOworCXJldHVybiBwYnVmIC0gYnVmOworCit9CisjZW5kaWYKK2ludCBzaG93X3N0cmVhbV9idWZmZXJfc3RhdHVzKGNoYXIgKmJ1ZiwKKwlpbnQgKCpjYWxsYmFjaykgKHN0cnVjdCBzdHJlYW1fYnVmX3MgKiwgY2hhciAqKSkKK3sKKwljaGFyICpwYnVmID0gYnVmOworCXN0cnVjdCB2ZGVjX3MgKnZkZWM7CisJc3RydWN0IHZkZWNfY29yZV9zICpjb3JlID0gdmRlY19jb3JlOworCXU2NCBmbGFncyA9IHZkZWNfY29yZV9sb2NrKHZkZWNfY29yZSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZkZWMsCisJCSZjb3JlLT5jb25uZWN0ZWRfdmRlY19saXN0LCBsaXN0KSB7CisJCWlmICgodmRlYy0+c3RhdHVzID09IFZERUNfU1RBVFVTX0NPTk5FQ1RFRAorCQkJfHwgdmRlYy0+c3RhdHVzID09IFZERUNfU1RBVFVTX0FDVElWRSkpIHsKKwkJCWlmICh2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpKQorCQkJCWNvbnRpbnVlOworCQkJcGJ1ZiArPSBjYWxsYmFjaygmdmRlYy0+dmJ1ZiwgcGJ1Zik7CisJCX0KKwl9CisJdmRlY19jb3JlX3VubG9jayh2ZGVjX2NvcmUsIGZsYWdzKTsKKworCXJldHVybiBwYnVmIC0gYnVmOworfQorRVhQT1JUX1NZTUJPTChzaG93X3N0cmVhbV9idWZmZXJfc3RhdHVzKTsKKworc3RhdGljIHNzaXplX3QgdmRlY192Zm1fcGF0aF9zdG9yZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQkgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWNoYXIgKmJ1Zl9kdXAsICpwcywgKnRva2VuOworCWNoYXIgc3RyW1ZERUNfTUFQX05BTUVfU0laRV0gPSAiXDAiOworCWJvb2wgZm91bmQgPSBmYWxzZTsKKwlpbnQgaTsKKworCWlmIChzdHJsZW4oYnVmKSA+PSBWREVDX01BUF9OQU1FX1NJWkUpIHsKKwkJcHJfaW5mbygicGFyYW1ldGVyIGlzIG92ZXJmbG93XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWJ1Zl9kdXAgPSBrc3RyZHVwKGJ1ZiwgR0ZQX0tFUk5FTCk7CisJcHMgPSBidWZfZHVwOworCXdoaWxlICgxKSB7CisJCXRva2VuID0gc3Ryc2VwKCZwcywgIlxuICIpOworCQlpZiAodG9rZW4gPT0gTlVMTCkKKwkJCWJyZWFrOworCQlpZiAoKnRva2VuID09ICdcMCcpCisJCQljb250aW51ZTsKKworCQlmb3IgKGkgPSAwOyBzdHJjbXAoInJlc2VydmVkIiwgdmZtX3BhdGhfbm9kZVtpXSkgIT0gMDsgaSsrKSB7CisJCQlpZiAoIXN0cm5jbXAgKHZmbV9wYXRoX25vZGVbaV0sIHRva2VuLCBzdHJsZW4odmZtX3BhdGhfbm9kZVtpXSkpKSB7CisJCQkgICAgICAgIGJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKHN0cmNtcCgicmVzZXJ2ZWQiLCB2Zm1fcGF0aF9ub2RlW2ldKSA9PSAwIHx8CisJCQlzdHJuY21wKCJoZWxwIiwgYnVmLCBzdHJsZW4oImhlbHAiKSkgPT0gMCkgeworCQkJaWYgKHN0cm5jbXAoImhlbHAiLCBidWYsIHN0cmxlbigiaGVscCIpKSAhPSAwKSB7CisJCQkJcHJfaW5mbygid2Fybm5pbmchIElucHV0IHBhcmFtZXRlciBpcyBpbnZhbGlkLiBzZXQgZmFpbGVkIVxuIik7CisJCQl9CisJCQlwcl9pbmZvKCJcbnVzYWdlIGZvciBleGFtcGxlOiBcbiIpOworCQkJcHJfaW5mbygiZWNobyBoZWxwID4gL3N5cy9jbGFzcy92ZGVjL3ZmbV9wYXRoIFxuIik7CisJCQlwcl9pbmZvKCJlY2hvIGRpc2FibGUgPiAvc3lzL2NsYXNzL3ZkZWMvdmZtX3BhdGggXG4iKTsKKwkJCXByX2luZm8oImVjaG8gYW1sdmlkZW8gcHBtZ3IgYW12aWRlbyA+IC9zeXMvY2xhc3MvdmRlYy92Zm1fcGF0aCBcbiIpOworCQkJZm91bmQgPSBmYWxzZTsKKworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlzdHJjYXQoc3RyLCB2Zm1fcGF0aF9ub2RlW2ldKTsKKwkJCXN0cmNhdChzdHIsICIgIik7CisJCQlmb3VuZCA9IHRydWU7CisJCX0KKwl9CisKKwlpZiAoZm91bmQgPT0gdHJ1ZSkgeworCQltZW1zZXQodmZtX3BhdGgsIDAsIHNpemVvZih2Zm1fcGF0aCkpOworCQlzdHJuY3B5KHZmbV9wYXRoLCBzdHIsIHN0cmxlbihzdHIpKTsKKwkJdmZtX3BhdGhbVkRFQ19NQVBfTkFNRV9TSVpFIC0gMV0gPSAnXDAnOworCQlwcl9pbmZvKCJjZmcgcGF0aCBzdWNjZXNzOiBkZWNvZGVyICVzXG4iLCB2Zm1fcGF0aCk7CisJfQorCWtmcmVlKGJ1Zl9kdXApOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCB2ZGVjX3ZmbV9wYXRoX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKKwlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IGxlbiA9IDA7CisJaW50IGk7CisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiY2ZnIHZmbSBwYXRoOiBkZWNvZGVyICVzXG4iLCB2Zm1fcGF0aCk7CisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiXG52Zm0gcGF0aCBub2RlIGxpc3Q6IFxuIik7CisJZm9yIChpID0gMDsgc3RyY21wKCJyZXNlcnZlZCIsIHZmbV9wYXRoX25vZGVbaV0pICE9IDA7IGkrKykgeworCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJcdCVzIFxuIiwgdmZtX3BhdGhfbm9kZVtpXSk7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworLyppcnEgbnVtIGFzIHNhbWUgYXMgLmR0cyovCisvKgorICoJaW50ZXJydXB0cyA9IDwwIDMgMQorICoJCTAgMjMgMQorICoJCTAgMzIgMQorICoJCTAgNDMgMQorICoJCTAgNDQgMQorICoJCTAgNDUgMT47CisgKglpbnRlcnJ1cHQtbmFtZXMgPSAidnN5bmMiLAorICoJCSJkZW11eCIsCisgKgkJInBhcnNlciIsCisgKgkJIm1haWxib3hfMCIsCisgKgkJIm1haWxib3hfMSIsCisgKgkJIm1haWxib3hfMiI7CisgKi8KK3MzMiB2ZGVjX3JlcXVlc3RfdGhyZWFkZWRfaXJxKGVudW0gdmRlY19pcnFfbnVtIG51bSwKKwkJCWlycV9oYW5kbGVyX3QgaGFuZGxlciwKKwkJCWlycV9oYW5kbGVyX3QgdGhyZWFkX2ZuLAorCQkJdW5zaWduZWQgbG9uZyBpcnFmbGFncywKKwkJCWNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldikKK3sKKwlzMzIgcmVzX2lycTsKKwlzMzIgcmV0ID0gMDsKKworCWlmIChudW0gPj0gVkRFQ19JUlFfTUFYKSB7CisJCXByX2VycigiWyVzXSByZXF1ZXN0IGlycSBlcnJvciwgaXJxIG51bSB0b28gYmlnISIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHZkZWNfY29yZS0+aXNyX2NvbnRleHRbbnVtXS5pcnEgPCAwKSB7CisJCXJlc19pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKAorCQkJdmRlY19jb3JlLT52ZGVjX2NvcmVfcGxhdGZvcm1fZGV2aWNlLCBudW0pOworCQlpZiAocmVzX2lycSA8IDApIHsKKwkJCXByX2VycigiWyVzXSBnZXQgaXJxIGVycm9yISIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJdmRlY19jb3JlLT5pc3JfY29udGV4dFtudW1dLmlycSA9IHJlc19pcnE7CisJCXZkZWNfY29yZS0+aXNyX2NvbnRleHRbbnVtXS5kZXZfaXNyID0gaGFuZGxlcjsKKwkJdmRlY19jb3JlLT5pc3JfY29udGV4dFtudW1dLmRldl90aHJlYWRlZF9pc3IgPSB0aHJlYWRfZm47CisJCXZkZWNfY29yZS0+aXNyX2NvbnRleHRbbnVtXS5kZXZfaWQgPSBkZXY7CisJCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKHJlc19pcnEsCisJCQl2ZGVjX2lzciwKKwkJCXZkZWNfdGhyZWFkX2lzciwKKwkJCSh0aHJlYWRfZm4pID8gSVJRRl9PTkVTSE9UIDogaXJxZmxhZ3MsCisJCQlkZXZuYW1lLAorCQkJJnZkZWNfY29yZS0+aXNyX2NvbnRleHRbbnVtXSk7CisKKwkJaWYgKHJldCkgeworCQkJdmRlY19jb3JlLT5pc3JfY29udGV4dFtudW1dLmlycSA9IC0xOworCQkJdmRlY19jb3JlLT5pc3JfY29udGV4dFtudW1dLmRldl9pc3IgPSBOVUxMOworCQkJdmRlY19jb3JlLT5pc3JfY29udGV4dFtudW1dLmRldl90aHJlYWRlZF9pc3IgPSBOVUxMOworCQkJdmRlY19jb3JlLT5pc3JfY29udGV4dFtudW1dLmRldl9pZCA9IE5VTEw7CisKKwkJCXByX2VycigidmRlYyBpcnEgcmVnaXN0ZXIgZXJyb3IgZm9yICVzLlxuIiwgZGV2bmFtZSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0gZWxzZSB7CisJCXZkZWNfY29yZS0+aXNyX2NvbnRleHRbbnVtXS5kZXZfaXNyID0gaGFuZGxlcjsKKwkJdmRlY19jb3JlLT5pc3JfY29udGV4dFtudW1dLmRldl90aHJlYWRlZF9pc3IgPSB0aHJlYWRfZm47CisJCXZkZWNfY29yZS0+aXNyX2NvbnRleHRbbnVtXS5kZXZfaWQgPSBkZXY7CisJfQorCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19yZXF1ZXN0X3RocmVhZGVkX2lycSk7CisKK3MzMiB2ZGVjX3JlcXVlc3RfaXJxKGVudW0gdmRlY19pcnFfbnVtIG51bSwgaXJxX2hhbmRsZXJfdCBoYW5kbGVyLAorCQkJCWNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldikKK3sKKwlwcl9kZWJ1ZygidmRlY19yZXF1ZXN0X2lycSAlcCwgJXNcbiIsIGhhbmRsZXIsIGRldm5hbWUpOworCisJcmV0dXJuIHZkZWNfcmVxdWVzdF90aHJlYWRlZF9pcnEobnVtLAorCQloYW5kbGVyLAorCQlOVUxMLC8qbm8gdGhyZWFkX2ZuKi8KKwkJSVJRRl9TSEFSRUQsCisJCWRldm5hbWUsCisJCWRldik7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfcmVxdWVzdF9pcnEpOworCit2b2lkIHZkZWNfZnJlZV9pcnEoZW51bSB2ZGVjX2lycV9udW0gbnVtLCB2b2lkICpkZXYpCit7CisJaWYgKG51bSA+PSBWREVDX0lSUV9NQVgpIHsKKwkJcHJfZXJyKCJbJXNdIHJlcXVlc3QgaXJxIGVycm9yLCBpcnEgbnVtIHRvbyBiaWchIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCS8qCisJICphc3N1bWUgYW1yaXNjIGlzIHN0b3BwZWQgYWxyZWFkeSBhbmQgdGhlcmUgaXMgbm8gbWFpbGJveCBpbnRlcnJ1cHQKKwkgKiB3aGVuIHdlIHJlc2V0IHBvaW50ZXJzIGhlcmUuCisJICovCisJdmRlY19jb3JlLT5pc3JfY29udGV4dFtudW1dLmRldl9pc3IgPSBOVUxMOworCXZkZWNfY29yZS0+aXNyX2NvbnRleHRbbnVtXS5kZXZfdGhyZWFkZWRfaXNyID0gTlVMTDsKKwl2ZGVjX2NvcmUtPmlzcl9jb250ZXh0W251bV0uZGV2X2lkID0gTlVMTDsKKwlzeW5jaHJvbml6ZV9pcnEodmRlY19jb3JlLT5pc3JfY29udGV4dFtudW1dLmlycSk7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfZnJlZV9pcnEpOworCit2b2lkIHZkZWNfc3luY19pcnEoZW51bSB2ZGVjX2lycV9udW0gbnVtKQoreworI2lmIDAKKwlpZiAoIXZkZWMpCisJCXJldHVybjsKKwlpZiAodmRlYy0+aW5wdXQudGFyZ2V0ID09IFZERUNfSU5QVVRfVEFSR0VUX0hFVkMpCisJCXN5bmNocm9uaXplX2lycSh2ZGVjX2NvcmUtPmlzcl9jb250ZXh0W1ZERUNfSVJRXzBdLmlycSk7CisJZWxzZSAodmRlYy0+aW5wdXQudGFyZ2V0ID09IFZERUNfSU5QVVRfVEFSR0VUX1ZMRCkKKwkJc3luY2hyb25pemVfaXJxKHZkZWNfY29yZS0+aXNyX2NvbnRleHRbVkRFQ19JUlFfMV0uaXJxKTsKKyNlbmRpZgorCXN5bmNocm9uaXplX2lycSh2ZGVjX2NvcmUtPmlzcl9jb250ZXh0W251bV0uaXJxKTsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19zeW5jX2lycSk7CisKK3N0cnVjdCB2ZGVjX3MgKnZkZWNfZ2V0X2RlZmF1bHRfdmRlY19mb3JfdXNlcmRhdGEodm9pZCkKK3sKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjOworCXN0cnVjdCB2ZGVjX3MgKnJldF92ZGVjOworCXN0cnVjdCB2ZGVjX2NvcmVfcyAqY29yZSA9IHZkZWNfY29yZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpZDsKKworCWZsYWdzID0gdmRlY19jb3JlX2xvY2sodmRlY19jb3JlKTsKKworCWlkID0gMHgxMDAwMDAwMDsKKwlyZXRfdmRlYyA9IE5VTEw7CisJaWYgKCFsaXN0X2VtcHR5KCZjb3JlLT5jb25uZWN0ZWRfdmRlY19saXN0KSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZkZWMsICZjb3JlLT5jb25uZWN0ZWRfdmRlY19saXN0LCBsaXN0KSB7CisJCQlpZiAodmRlYy0+aWQgPCBpZCkgeworCQkJCWlkID0gdmRlYy0+aWQ7CisJCQkJcmV0X3ZkZWMgPSB2ZGVjOworCQkJfQorCQl9CisJfQorCisJdmRlY19jb3JlX3VubG9jayh2ZGVjX2NvcmUsIGZsYWdzKTsKKworCXJldHVybiByZXRfdmRlYzsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19nZXRfZGVmYXVsdF92ZGVjX2Zvcl91c2VyZGF0YSk7CisKK3N0cnVjdCB2ZGVjX3MgKnZkZWNfZ2V0X3ZkZWNfYnlfdmlkZW9faWQoaW50IHZpZGVvX2lkKQoreworCXN0cnVjdCB2ZGVjX3MgKnZkZWM7CisJc3RydWN0IHZkZWNfcyAqcmV0X3ZkZWM7CisJc3RydWN0IHZkZWNfY29yZV9zICpjb3JlID0gdmRlY19jb3JlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmbGFncyA9IHZkZWNfY29yZV9sb2NrKHZkZWNfY29yZSk7CisKKwlyZXRfdmRlYyA9IE5VTEw7CisJaWYgKCFsaXN0X2VtcHR5KCZjb3JlLT5jb25uZWN0ZWRfdmRlY19saXN0KSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZkZWMsICZjb3JlLT5jb25uZWN0ZWRfdmRlY19saXN0LCBsaXN0KSB7CisJCQlpZiAodmRlYy0+dmlkZW9faWQgPT0gdmlkZW9faWQpIHsKKwkJCQlyZXRfdmRlYyA9IHZkZWM7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwl2ZGVjX2NvcmVfdW5sb2NrKHZkZWNfY29yZSwgZmxhZ3MpOworCisJcmV0dXJuIHJldF92ZGVjOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX2dldF92ZGVjX2J5X3ZpZGVvX2lkKTsKKworc3RydWN0IHZkZWNfcyAqdmRlY19nZXRfdmRlY19ieV9pZChpbnQgdmRlY19pZCkKK3sKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjOworCXN0cnVjdCB2ZGVjX3MgKnJldF92ZGVjOworCXN0cnVjdCB2ZGVjX2NvcmVfcyAqY29yZSA9IHZkZWNfY29yZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZmxhZ3MgPSB2ZGVjX2NvcmVfbG9jayh2ZGVjX2NvcmUpOworCisJcmV0X3ZkZWMgPSBOVUxMOworCWlmICghbGlzdF9lbXB0eSgmY29yZS0+Y29ubmVjdGVkX3ZkZWNfbGlzdCkpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2ZGVjLCAmY29yZS0+Y29ubmVjdGVkX3ZkZWNfbGlzdCwgbGlzdCkgeworCQkJaWYgKHZkZWMtPmlkID09IHZkZWNfaWQpIHsKKwkJCQlyZXRfdmRlYyA9IHZkZWM7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwl2ZGVjX2NvcmVfdW5sb2NrKHZkZWNfY29yZSwgZmxhZ3MpOworCisJcmV0dXJuIHJldF92ZGVjOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX2dldF92ZGVjX2J5X2lkKTsKKworCitpbnQgdmRlY19yZWFkX3VzZXJfZGF0YShzdHJ1Y3QgdmRlY19zICp2ZGVjLAorCQkJc3RydWN0IHVzZXJkYXRhX3BhcmFtX3QgKnBfdXNlcmRhdGFfcGFyYW0pCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXZkZWMpCisJCXZkZWMgPSB2ZGVjX2dldF9kZWZhdWx0X3ZkZWNfZm9yX3VzZXJkYXRhKCk7CisKKwlpZiAodmRlYykgeworCQlpZiAodmRlYy0+dXNlcl9kYXRhX3JlYWQpCisJCQlyZXQgPSB2ZGVjLT51c2VyX2RhdGFfcmVhZCh2ZGVjLCBwX3VzZXJkYXRhX3BhcmFtKTsKKwl9CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19yZWFkX3VzZXJfZGF0YSk7CisKK2ludCB2ZGVjX3dha2V1cF91c2VyZGF0YV9wb2xsKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJaWYgKHZkZWMpIHsKKwkJaWYgKHZkZWMtPndha2V1cF91c2VyZGF0YV9wb2xsKQorCQkJdmRlYy0+d2FrZXVwX3VzZXJkYXRhX3BvbGwodmRlYyk7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfd2FrZXVwX3VzZXJkYXRhX3BvbGwpOworCit2b2lkIHZkZWNfcmVzZXRfdXNlcmRhdGFfZmlmbyhzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgYkluaXQpCit7CisJaWYgKCF2ZGVjKQorCQl2ZGVjID0gdmRlY19nZXRfZGVmYXVsdF92ZGVjX2Zvcl91c2VyZGF0YSgpOworCisJaWYgKHZkZWMpIHsKKwkJaWYgKHZkZWMtPnJlc2V0X3VzZXJkYXRhX2ZpZm8pCisJCQl2ZGVjLT5yZXNldF91c2VyZGF0YV9maWZvKHZkZWMsIGJJbml0KTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfcmVzZXRfdXNlcmRhdGFfZmlmbyk7CisKK3ZvaWQgdmRlY19zZXRfcHJvZmlsZV9sZXZlbChzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1MzIgcHJvZmlsZV9pZGMsIHUzMiBsZXZlbF9pZGMpCit7CisJaWYgKHZkZWMpIHsKKwkJdmRlYy0+cHJvZmlsZV9pZGMgPSBwcm9maWxlX2lkYzsKKwkJdmRlYy0+bGV2ZWxfaWRjID0gbGV2ZWxfaWRjOworCX0KK30KK0VYUE9SVF9TWU1CT0wodmRlY19zZXRfcHJvZmlsZV9sZXZlbCk7CisKK3N0YXRpYyBpbnQgZHVtcF9tb2RlOworc3RhdGljIHNzaXplX3QgZHVtcF9yaXNjX21lbV9zdG9yZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKS8qc2V0Ki8KK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCXNzaXplX3QgcmV0OworCWNoYXIgZHVtcF9tb2RlX3N0cls0XSA9ICJQUkwiOworCisJLypyZXQgPSBzc2NhbmYoYnVmLCAiJWQiLCAmdmFsKTsqLworCXJldCA9IGtzdHJ0b2ludChidWYsIDAsICZ2YWwpOworCisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkdW1wX21vZGUgPSB2YWwgJiAweDM7CisJcHJfaW5mbygic2V0IGR1bXAgbW9kZSB0byAlZCwlY19tZW1cbiIsCisJCWR1bXBfbW9kZSwgZHVtcF9tb2RlX3N0cltkdW1wX21vZGVdKTsKKwlyZXR1cm4gc2l6ZTsKK30KK3N0YXRpYyB1MzIgcmVhZF9hbXJpc2NfcmVnKGludCByZWcpCit7CisJV1JJVEVfVlJFRygweDMxYiwgcmVnKTsKKwlyZXR1cm4gUkVBRF9WUkVHKDB4MzFjKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9wbWVtKHZvaWQpCit7CisJaW50IGk7CisKKwlXUklURV9WUkVHKDB4MzAxLCAweDgwMDApOworCVdSSVRFX1ZSRUcoMHgzMWQsIDApOworCXByX2luZm8oInN0YXJ0IGR1bXAgYW1yaXNjIHBtZW0gb2YgcmlzY1xuIik7CisJZm9yIChpID0gMDsgaSA8IDB4ZmZmOyBpKyspIHsKKwkJLypzYW1lIGFzIC5vIGZvcm1hdCovCisJCXByX2luZm8oIiUwOHggLy8gMHglMDR4OlxuIiwgcmVhZF9hbXJpc2NfcmVnKGkpLCBpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfbG1lbSh2b2lkKQoreworCWludCBpOworCisJV1JJVEVfVlJFRygweDMwMSwgMHg4MDAwKTsKKwlXUklURV9WUkVHKDB4MzFkLCAyKTsKKwlwcl9pbmZvKCJzdGFydCBkdW1wIGFtcmlzYyBsbWVtXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgMHgzZmY7IGkrKykgeworCQkvKnNhbWUgYXMgKi8KKwkJcHJfaW5mbygiWyUwNHhdID0gMHglMDh4OlxuIiwgaSwgcmVhZF9hbXJpc2NfcmVnKGkpKTsKKwl9Cit9CisKK3N0YXRpYyBzc2l6ZV90IGR1bXBfcmlzY19tZW1fc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJY2hhciAqcGJ1ZiA9IGJ1ZjsKKwlpbnQgcmV0OworCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfTTgpIHsKKwkJbXV0ZXhfbG9jaygmdmRlY19tdXRleCk7CisJCWlmICghdmRlY19vbihWREVDXzEpKSB7CisJCQltdXRleF91bmxvY2soJnZkZWNfbXV0ZXgpOworCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJhbXJpc2MgaXMgcG93ZXIgb2ZmXG4iKTsKKwkJCXJldCA9IHBidWYgLSBidWY7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfSBlbHNlIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX002KSB7CisJCS8qVE9ETzpNNiBkZWZpbmUgKi8KKwkJLyoKKwkJICogIHN3aXRjaF9tb2RfZ2F0ZV9ieV90eXBlKE1PRF9WREVDLCAxKTsKKwkJICovCisJCWFtcG9ydHNfc3dpdGNoX2dhdGUoInZkZWMiLCAxKTsKKwl9CisJLypzdGFydCBkbyoqLworCXN3aXRjaCAoZHVtcF9tb2RlKSB7CisJY2FzZSAwOgorCQlkdW1wX3BtZW0oKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlkdW1wX2xtZW0oKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLypkb25lKi8KKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9NOCkKKwkJbXV0ZXhfdW5sb2NrKCZ2ZGVjX211dGV4KTsKKwllbHNlIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX002KSB7CisJCS8qVE9ETzpNNiBkZWZpbmUgKi8KKwkJLyoKKwkJICogIHN3aXRjaF9tb2RfZ2F0ZV9ieV90eXBlKE1PRF9WREVDLCAwKTsKKwkJICovCisJCWFtcG9ydHNfc3dpdGNoX2dhdGUoInZkZWMiLCAwKTsKKwl9CisJcmV0dXJuIHNwcmludGYoYnVmLCAiZG9uZVxuIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNvcmVfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLCBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCB2ZGVjX2NvcmVfcyAqY29yZSA9IHZkZWNfY29yZTsKKwljaGFyICpwYnVmID0gYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSB2ZGVjX2NvcmVfbG9jayh2ZGVjX2NvcmUpOworCisJaWYgKGxpc3RfZW1wdHkoJmNvcmUtPmNvbm5lY3RlZF92ZGVjX2xpc3QpKQorCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgImNvbm5lY3RlZCB2ZGVjIGxpc3QgZW1wdHlcbiIpOworCWVsc2UgeworCQlzdHJ1Y3QgdmRlY19zICp2ZGVjOworCisJCXBidWYgKz0gc3ByaW50ZihwYnVmLAorCQkJIiBDb3JlOiBsYXN0X3NjaGVkICVwLCBzY2hlZF9tYXNrICVseFxuIiwKKwkJCWNvcmUtPmxhc3RfdmRlYywKKwkJCWNvcmUtPnNjaGVkX21hc2spOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkodmRlYywgJmNvcmUtPmNvbm5lY3RlZF92ZGVjX2xpc3QsIGxpc3QpIHsKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLAorCQkJCSJcdHZkZWMuJWQgKCVwICglcyVzKSksIHN0YXR1cyA9ICVzLFx0dHlwZSA9ICVzLCBcdGFjdGl2ZV9tYXNrID0gJWx4XG4iLAorCQkJCXZkZWMtPmlkLAorCQkJCXZkZWMsCisJCQkJdmRlY19kZXZpY2VfbmFtZVt2ZGVjLT5mb3JtYXQgKiAyXSwKKwkJCQkodmRlYy0+aXNfdjRsID09IDEpID8gIl92NGwiIDogIiIsCisJCQkJdmRlY19zdGF0dXNfc3RyKHZkZWMpLAorCQkJCXZkZWNfdHlwZV9zdHIodmRlYyksCisJCQkJdmRlYy0+YWN0aXZlX21hc2spOworCQl9CisJfQorCisJdmRlY19jb3JlX3VubG9jayh2ZGVjX2NvcmUsIGZsYWdzKTsKKwlyZXR1cm4gcGJ1ZiAtIGJ1ZjsKK30KKworc3RhdGljIHNzaXplX3QgdmRlY19zdGF0dXNfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWNoYXIgKnBidWYgPSBidWY7CisJc3RydWN0IHZkZWNfcyAqdmRlYzsKKwlzdHJ1Y3QgdmRlY19pbmZvIHZzOworCXVuc2lnbmVkIGNoYXIgdmRlY19udW0gPSAwOworCXN0cnVjdCB2ZGVjX2NvcmVfcyAqY29yZSA9IHZkZWNfY29yZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gdmRlY19jb3JlX2xvY2sodmRlY19jb3JlKTsKKworCWlmIChsaXN0X2VtcHR5KCZjb3JlLT5jb25uZWN0ZWRfdmRlY19saXN0KSkgeworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIk5vIHZkZWMuXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2ZGVjLCAmY29yZS0+Y29ubmVjdGVkX3ZkZWNfbGlzdCwgbGlzdCkgeworCQlpZiAoKHZkZWMtPnN0YXR1cyA9PSBWREVDX1NUQVRVU19DT05ORUNURUQKKwkJCXx8IHZkZWMtPnN0YXR1cyA9PSBWREVDX1NUQVRVU19BQ1RJVkUpKSB7CisJCQltZW1zZXQoJnZzLCAwLCBzaXplb2YodnMpKTsKKwkJCWlmICh2ZGVjX3N0YXR1cyh2ZGVjLCAmdnMpKSB7CisJCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJlcnIuXG4iKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLAorCQkJCSJ2ZGVjIGNoYW5uZWwgJXUgc3RhdGlzdGljczpcbiIsCisJCQkJdmRlY19udW0pOworCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsCisJCQkJIiUxM3MgOiAlc1xuIiwgImRldmljZSBuYW1lIiwKKwkJCQl2cy52ZGVjX25hbWUpOworCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsCisJCQkJIiUxM3MgOiAldVxuIiwgImZyYW1lIHdpZHRoIiwKKwkJCQl2cy5mcmFtZV93aWR0aCk7CisJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwKKwkJCQkiJTEzcyA6ICV1XG4iLCAiZnJhbWUgaGVpZ2h0IiwKKwkJCQl2cy5mcmFtZV9oZWlnaHQpOworCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsCisJCQkJIiUxM3MgOiAldSAlc1xuIiwgImZyYW1lIHJhdGUiLAorCQkJCXZzLmZyYW1lX3JhdGUsICJmcHMiKTsKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLAorCQkJCSIlMTNzIDogJXUgJXNcbiIsICJiaXQgcmF0ZSIsCisJCQkJdnMuYml0X3JhdGUgLyAxMDI0ICogOCwgImticHMiKTsKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLAorCQkJCSIlMTNzIDogJXVcbiIsICJzdGF0dXMiLAorCQkJCXZzLnN0YXR1cyk7CisJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwKKwkJCQkiJTEzcyA6ICV1XG4iLCAiZnJhbWUgZHVyIiwKKwkJCQl2cy5mcmFtZV9kdXIpOworCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsCisJCQkJIiUxM3MgOiAldSAlc1xuIiwgImZyYW1lIGRhdGEiLAorCQkJCXZzLmZyYW1lX2RhdGEgLyAxMDI0LCAiS0IiKTsKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLAorCQkJCSIlMTNzIDogJXVcbiIsICJmcmFtZSBjb3VudCIsCisJCQkJdnMuZnJhbWVfY291bnQpOworCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsCisJCQkJIiUxM3MgOiAldVxuIiwgImRyb3AgY291bnQiLAorCQkJCXZzLmRyb3BfZnJhbWVfY291bnQpOworCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsCisJCQkJIiUxM3MgOiAldVxuIiwgImZyYSBlcnIgY291bnQiLAorCQkJCXZzLmVycm9yX2ZyYW1lX2NvdW50KTsKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLAorCQkJCSIlMTNzIDogJXVcbiIsICJodyBlcnIgY291bnQiLAorCQkJCXZzLmVycm9yX2NvdW50KTsKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLAorCQkJCSIlMTNzIDogJWxsdSAlc1xuIiwgInRvdGFsIGRhdGEiLAorCQkJCXZzLnRvdGFsX2RhdGEgLyAxMDI0LCAiS0IiKTsKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLAorCQkJCSIlMTNzIDogJXhcblxuIiwgInJhdGlvX2NvbnRyb2wiLAorCQkJCXZzLnJhdGlvX2NvbnRyb2wpOworCisJCQl2ZGVjX251bSsrOworCQl9CisJfQorb3V0OgorCXZkZWNfY29yZV91bmxvY2sodmRlY19jb3JlLCBmbGFncyk7CisJcmV0dXJuIHBidWYgLSBidWY7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGR1bXBfdmRlY19ibG9ja3Nfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB2ZGVjX2NvcmVfcyAqY29yZSA9IHZkZWNfY29yZTsKKwljaGFyICpwYnVmID0gYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSB2ZGVjX2NvcmVfbG9jayh2ZGVjX2NvcmUpOworCisJaWYgKGxpc3RfZW1wdHkoJmNvcmUtPmNvbm5lY3RlZF92ZGVjX2xpc3QpKQorCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgImNvbm5lY3RlZCB2ZGVjIGxpc3QgZW1wdHlcbiIpOworCWVsc2UgeworCQlzdHJ1Y3QgdmRlY19zICp2ZGVjOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZkZWMsICZjb3JlLT5jb25uZWN0ZWRfdmRlY19saXN0LCBsaXN0KSB7CisJCQlwYnVmICs9IHZkZWNfaW5wdXRfZHVtcF9ibG9ja3MoJnZkZWMtPmlucHV0LAorCQkJCXBidWYsIFBBR0VfU0laRSAtIChwYnVmIC0gYnVmKSk7CisJCX0KKwl9CisJdmRlY19jb3JlX3VubG9jayh2ZGVjX2NvcmUsIGZsYWdzKTsKKworCXJldHVybiBwYnVmIC0gYnVmOworfQorc3RhdGljIHNzaXplX3QgZHVtcF92ZGVjX2NodW5rc19zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCQlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHZkZWNfY29yZV9zICpjb3JlID0gdmRlY19jb3JlOworCWNoYXIgKnBidWYgPSBidWY7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IHZkZWNfY29yZV9sb2NrKHZkZWNfY29yZSk7CisKKwlpZiAobGlzdF9lbXB0eSgmY29yZS0+Y29ubmVjdGVkX3ZkZWNfbGlzdCkpCisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiY29ubmVjdGVkIHZkZWMgbGlzdCBlbXB0eVxuIik7CisJZWxzZSB7CisJCXN0cnVjdCB2ZGVjX3MgKnZkZWM7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodmRlYywgJmNvcmUtPmNvbm5lY3RlZF92ZGVjX2xpc3QsIGxpc3QpIHsKKwkJCXBidWYgKz0gdmRlY19pbnB1dF9kdW1wX2NodW5rcyh2ZGVjLT5pZCwgJnZkZWMtPmlucHV0LAorCQkJCXBidWYsIFBBR0VfU0laRSAtIChwYnVmIC0gYnVmKSk7CisJCX0KKwl9CisJdmRlY19jb3JlX3VubG9jayh2ZGVjX2NvcmUsIGZsYWdzKTsKKworCXJldHVybiBwYnVmIC0gYnVmOworfQorCitzdGF0aWMgc3NpemVfdCBkdW1wX2RlY29kZXJfc3RhdGVfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWNoYXIgKnBidWYgPSBidWY7CisJc3RydWN0IHZkZWNfcyAqdmRlYzsKKwlzdHJ1Y3QgdmRlY19jb3JlX3MgKmNvcmUgPSB2ZGVjX2NvcmU7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IHZkZWNfY29yZV9sb2NrKHZkZWNfY29yZSk7CisKKwlpZiAobGlzdF9lbXB0eSgmY29yZS0+Y29ubmVjdGVkX3ZkZWNfbGlzdCkpIHsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJObyB2ZGVjLlxuIik7CisJfSBlbHNlIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2ZGVjLAorCQkJJmNvcmUtPmNvbm5lY3RlZF92ZGVjX2xpc3QsIGxpc3QpIHsKKwkJCWlmICgodmRlYy0+c3RhdHVzID09IFZERUNfU1RBVFVTX0NPTk5FQ1RFRAorCQkJCXx8IHZkZWMtPnN0YXR1cyA9PSBWREVDX1NUQVRVU19BQ1RJVkUpCisJCQkJJiYgdmRlYy0+ZHVtcF9zdGF0ZSkKKwkJCQkJdmRlYy0+ZHVtcF9zdGF0ZSh2ZGVjKTsKKwkJfQorCX0KKwl2ZGVjX2NvcmVfdW5sb2NrKHZkZWNfY29yZSwgZmxhZ3MpOworCisJcmV0dXJuIHBidWYgLSBidWY7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGR1bXBfZnBzX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKKwkJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwljaGFyICpwYnVmID0gYnVmOworCXN0cnVjdCB2ZGVjX2NvcmVfcyAqY29yZSA9IHZkZWNfY29yZTsKKwlpbnQgaTsKKworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSB2ZGVjX2Zwc19sb2NrKHZkZWNfY29yZSk7CisJZm9yIChpID0gMDsgaSA8IE1BWF9JTlNUQU5DRV9NVU47IGkrKykKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlZCAiLCBjb3JlLT5kZWNvZGVfZnBzW2ldLmZwcyk7CisKKwlwYnVmICs9IHNwcmludGYocGJ1ZiwgIlxuIik7CisJdmRlY19mcHNfdW5sb2NrKHZkZWNfY29yZSwgZmxhZ3MpOworCisJcmV0dXJuIHBidWYgLSBidWY7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHZlcnNpb25fc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWNoYXIgKnBidWYgPSBidWY7CisjaWZkZWYgREVDT0RFUl9WRVJTSU9OCisJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJERUNPREVSIFZFUlNJT046IFYiIHhzdHIoREVDT0RFUl9WRVJTSU9OKSAiXG4iKTsKKyNlbHNlCisjaWZkZWYgUkVMRUFTRURfVkVSU0lPTgorCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIkR1ZSB0byBwcm9qZWN0IGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHByb2JsZW1zLFwKK3RoZSBjdXJyZW50IGRlY29kZXIgdmVyc2lvbiBjb3VsZCBub3QgYmUgZGV0ZWN0ZWQsXAorUGxlYXNlIFVzZSBUaGUgREVDT0RFUiBCQVNFIFZlcnNpb24gZm9yIHRyYWNlYWJpbGl0eVxuIik7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiREVDT0RFUiBCQVNFIFZlcnNpb246ICIgeHN0cihSRUxFQVNFRF9WRVJTSU9OKSAiXG4iKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBVQ09ERV9WRVJTSU9OCisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiVUNPREUgVkVSU0lPTjogViIgeHN0cihVQ09ERV9WRVJTSU9OKSAiXG4iKTsKKyNlbmRpZgorCisJcmV0dXJuIHBidWYgLSBidWY7Cit9CisKK3N0YXRpYyBjaGFyICogcGFyc2VyX2gyNjRfcHJvZmlsZShjaGFyICpwYnVmLCBzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXN3aXRjaCAodmRlYy0+cHJvZmlsZV9pZGMpIHsKKwkJY2FzZSA2NjoKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJWQ6IEJhc2VsaW5lIFByb2ZpbGUoJXUpXG4iLAorCQkJdmRlYy0+aWQsIHZkZWMtPnByb2ZpbGVfaWRjKTsKKwkJCWJyZWFrOworCQljYXNlIDc3OgorCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlZDogTWFpbiBQcm9maWxlKCV1KVxuIiwKKwkJCXZkZWMtPmlkLCB2ZGVjLT5wcm9maWxlX2lkYyk7CisJCQlicmVhazsKKwkJY2FzZSA4ODoKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJWQ6IEV4dGVuZGVkIFByb2ZpbGUoJXUpXG4iLAorCQkJdmRlYy0+aWQsIHZkZWMtPnByb2ZpbGVfaWRjKTsKKwkJCWJyZWFrOworCQljYXNlIDEwMDoKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJWQ6IEhpZ2ggUHJvZmlsZSgldSlcbiIsCisJCQl2ZGVjLT5pZCwgdmRlYy0+cHJvZmlsZV9pZGMpOworCQkJYnJlYWs7CisJCWNhc2UgMTEwOgorCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlZDogSGlnaCAxMCBQcm9maWxlKCV1KVxuIiwKKwkJCXZkZWMtPmlkLCB2ZGVjLT5wcm9maWxlX2lkYyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJWQ6IE5vdCBTdXBwb3J0IFByb2ZpbGUoJXUpXG4iLAorCQkJdmRlYy0+aWQsIHZkZWMtPnByb2ZpbGVfaWRjKTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBwYnVmOworfQorCitzdGF0aWMgY2hhciAqIHBhcnNlcl9tcGVnMl9wcm9maWxlKGNoYXIgKnBidWYsIHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3dpdGNoICh2ZGVjLT5wcm9maWxlX2lkYykgeworCQljYXNlIDU6CisJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiVkOiBTaW1wbGUgUHJvZmlsZSgldSlcbiIsCisJCQl2ZGVjLT5pZCwgdmRlYy0+cHJvZmlsZV9pZGMpOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJWQ6IE1haW4gUHJvZmlsZSgldSlcbiIsCisJCQl2ZGVjLT5pZCwgdmRlYy0+cHJvZmlsZV9pZGMpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJWQ6IFNOUiBTY2FsYWJsZSBQcm9maWxlKCV1KVxuIiwKKwkJCXZkZWMtPmlkLCB2ZGVjLT5wcm9maWxlX2lkYyk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlZDogQWlyc3BhY2UgUHJvZmlsZSgldSlcbiIsCisJCQl2ZGVjLT5pZCwgdmRlYy0+cHJvZmlsZV9pZGMpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJWQ6IEhpZ2ggUHJvZmlsZSgldSlcbiIsCisJCQl2ZGVjLT5pZCwgdmRlYy0+cHJvZmlsZV9pZGMpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiVkOiBOb3QgU3VwcG9ydCBQcm9maWxlKCV1KVxuIiwKKwkJCXZkZWMtPmlkLCB2ZGVjLT5wcm9maWxlX2lkYyk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIHBidWY7Cit9CisKK3N0YXRpYyBjaGFyICogcGFyc2VyX21wZWc0X3Byb2ZpbGUoY2hhciAqcGJ1Ziwgc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzd2l0Y2ggKHZkZWMtPnByb2ZpbGVfaWRjKSB7CisJCWNhc2UgMDoKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJWQ6IFNpbXBsZSBQcm9maWxlKCV1KVxuIiwKKwkJCXZkZWMtPmlkLCB2ZGVjLT5wcm9maWxlX2lkYyk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlZDogU2ltcGxlIFNjYWxhYmxlIFByb2ZpbGUoJXUpXG4iLAorCQkJdmRlYy0+aWQsIHZkZWMtPnByb2ZpbGVfaWRjKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiVkOiBDb3JlIFByb2ZpbGUoJXUpXG4iLAorCQkJdmRlYy0+aWQsIHZkZWMtPnByb2ZpbGVfaWRjKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiVkOiBNYWluIFByb2ZpbGUoJXUpXG4iLAorCQkJdmRlYy0+aWQsIHZkZWMtPnByb2ZpbGVfaWRjKTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiVkOiBOLWJpdCBQcm9maWxlKCV1KVxuIiwKKwkJCXZkZWMtPmlkLCB2ZGVjLT5wcm9maWxlX2lkYyk7CisJCQlicmVhazsKKwkJY2FzZSA1OgorCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlZDogU2NhbGFibGUgVGV4dHVyZSBQcm9maWxlKCV1KVxuIiwKKwkJCXZkZWMtPmlkLCB2ZGVjLT5wcm9maWxlX2lkYyk7CisJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJaWYgKHZkZWMtPnByb2ZpbGVfaWRjID09IDEgfHwgdmRlYy0+cHJvZmlsZV9pZGMgPT0gMikKKwkJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiVkOiBTaW1wbGUgRmFjZSBBbmltYXRpb24gUHJvZmlsZSgldSlcbiIsCisJCQkJdmRlYy0+aWQsIHZkZWMtPnByb2ZpbGVfaWRjKTsKKwkJCWVsc2UKKwkJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiVkOiBTaW1wbGUgRkJBIFByb2ZpbGUoJXUpXG4iLAorCQkJCXZkZWMtPmlkLCB2ZGVjLT5wcm9maWxlX2lkYyk7CisJCQlicmVhazsKKwkJY2FzZSA3OgorCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlZDogQmFzaWMgQW5pbWF0ZWQgVGV4dHVyZSBQcm9maWxlKCV1KVxuIiwKKwkJCXZkZWMtPmlkLCB2ZGVjLT5wcm9maWxlX2lkYyk7CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlZDogSHlicmlkIFByb2ZpbGUoJXUpXG4iLAorCQkJdmRlYy0+aWQsIHZkZWMtPnByb2ZpbGVfaWRjKTsKKwkJCWJyZWFrOworCQljYXNlIDk6CisJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiVkOiBBZHZhbmNlZCBSZWFsIFRpbWUgU2ltcGxlIFByb2ZpbGUoJXUpXG4iLAorCQkJdmRlYy0+aWQsIHZkZWMtPnByb2ZpbGVfaWRjKTsKKwkJCWJyZWFrOworCQljYXNlIDEwOgorCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlZDogQ29yZSBTY2FsYWJsZSBQcm9maWxlKCV1KVxuIiwKKwkJCXZkZWMtPmlkLCB2ZGVjLT5wcm9maWxlX2lkYyk7CisJCQlicmVhazsKKwkJY2FzZSAxMToKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJWQ6IEFkdmFuY2VkIENvZGluZyBFZmZpY2llbmN5IFByb2ZpbGUoJXUpXG4iLAorCQkJdmRlYy0+aWQsIHZkZWMtPnByb2ZpbGVfaWRjKTsKKwkJCWJyZWFrOworCQljYXNlIDEyOgorCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlZDogQWR2YW5jZWQgQ29yZSBQcm9maWxlKCV1KVxuIiwKKwkJCXZkZWMtPmlkLCB2ZGVjLT5wcm9maWxlX2lkYyk7CisJCQlicmVhazsKKwkJY2FzZSAxMzoKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJWQ6IEFkdmFuY2VkIFNjYWxhYmxlIFRleHR1cmUgUHJvZmlsZSgldSlcbiIsCisJCQl2ZGVjLT5pZCwgdmRlYy0+cHJvZmlsZV9pZGMpOworCQkJYnJlYWs7CisJCWNhc2UgMTQ6CisJCWNhc2UgMTU6CisJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiVkOiBBZHZhbmNlZCBTaW1wbGUgUHJvZmlsZSgldSlcbiIsCisJCQl2ZGVjLT5pZCwgdmRlYy0+cHJvZmlsZV9pZGMpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiVkOiBOb3QgU3VwcG9ydCBQcm9maWxlKCV1KVxuIiwKKwkJCXZkZWMtPmlkLCB2ZGVjLT5wcm9maWxlX2lkYyk7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcGJ1ZjsKK30KKworc3RhdGljIHNzaXplX3QgcHJvZmlsZV9pZGNfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLCBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCB2ZGVjX2NvcmVfcyAqY29yZSA9IHZkZWNfY29yZTsKKwljaGFyICpwYnVmID0gYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSB2ZGVjX2NvcmVfbG9jayh2ZGVjX2NvcmUpOworCisJaWYgKGxpc3RfZW1wdHkoJmNvcmUtPmNvbm5lY3RlZF92ZGVjX2xpc3QpKQorCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgImNvbm5lY3RlZCB2ZGVjIGxpc3QgZW1wdHlcbiIpOworCWVsc2UgeworCQlzdHJ1Y3QgdmRlY19zICp2ZGVjOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZkZWMsICZjb3JlLT5jb25uZWN0ZWRfdmRlY19saXN0LCBsaXN0KSB7CisJCQlpZiAodmRlYy0+Zm9ybWF0ID09IDApIHsKKwkJCQlwYnVmID0gcGFyc2VyX21wZWcyX3Byb2ZpbGUocGJ1ZiwgdmRlYyk7CisJCQl9IGVsc2UgaWYgKHZkZWMtPmZvcm1hdCA9PSAxKSB7CisJCQkJcGJ1ZiA9IHBhcnNlcl9tcGVnNF9wcm9maWxlKHBidWYsIHZkZWMpOworCQkJfSBlbHNlIGlmICh2ZGVjLT5mb3JtYXQgPT0gMikgeworCQkJCXBidWYgPSBwYXJzZXJfaDI2NF9wcm9maWxlKHBidWYsIHZkZWMpOworCQkJfSBlbHNlIHsKKwkJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwKKwkJCQkiJWQ6IE5vdCBTdXBwb3J0XG4iLCB2ZGVjLT5pZCk7CisJCQl9CisJCX0KKwl9CisKKwl2ZGVjX2NvcmVfdW5sb2NrKHZkZWNfY29yZSwgZmxhZ3MpOworCXJldHVybiBwYnVmIC0gYnVmOworfQorCitzdGF0aWMgY2hhciAqIHBhcnNlcl9oMjY0X2xldmVsKGNoYXIgKnBidWYsIHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisKKwlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiVkOiBMZXZlbCAlZC4lZCgldSlcbiIsCisJCQl2ZGVjLT5pZCwgdmRlYy0+bGV2ZWxfaWRjLzEwLCB2ZGVjLT5sZXZlbF9pZGMlMTAsIHZkZWMtPmxldmVsX2lkYyk7CisKKwlyZXR1cm4gcGJ1ZjsKK30KKworc3RhdGljIGNoYXIgKiBwYXJzZXJfbXBlZzJfbGV2ZWwoY2hhciAqcGJ1Ziwgc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzd2l0Y2ggKHZkZWMtPmxldmVsX2lkYykgeworCQljYXNlIDEwOgorCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlZDogTG93IExldmVsKCV1KVxuIiwKKwkJCXZkZWMtPmlkLCB2ZGVjLT5sZXZlbF9pZGMpOworCQkJYnJlYWs7CisJCWNhc2UgODoKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJWQ6IE1haW4gTGV2ZWwoJXUpXG4iLAorCQkJdmRlYy0+aWQsIHZkZWMtPmxldmVsX2lkYyk7CisJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlZDogSGlnaCAxNDQwIExldmVsKCV1KVxuIiwKKwkJCXZkZWMtPmlkLCB2ZGVjLT5sZXZlbF9pZGMpOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJWQ6IEhpZ2ggTGV2ZWwoJXUpXG4iLAorCQkJdmRlYy0+aWQsIHZkZWMtPmxldmVsX2lkYyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJWQ6IE5vdCBTdXBwb3J0IExldmVsKCV1KVxuIiwKKwkJCXZkZWMtPmlkLCB2ZGVjLT5sZXZlbF9pZGMpOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHBidWY7Cit9CisKK3N0YXRpYyBjaGFyICogcGFyc2VyX21wZWc0X2xldmVsKGNoYXIgKnBidWYsIHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3dpdGNoICh2ZGVjLT5sZXZlbF9pZGMpIHsKKwkJY2FzZSAxOgorCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlZDogTGV2ZWwgMSgldSlcbiIsCisJCQl2ZGVjLT5pZCwgdmRlYy0+bGV2ZWxfaWRjKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiVkOiBMZXZlbCAyKCV1KVxuIiwKKwkJCXZkZWMtPmlkLCB2ZGVjLT5sZXZlbF9pZGMpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJWQ6IExldmVsIDMoJXUpXG4iLAorCQkJdmRlYy0+aWQsIHZkZWMtPmxldmVsX2lkYyk7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlZDogTGV2ZWwgNCgldSlcbiIsCisJCQl2ZGVjLT5pZCwgdmRlYy0+bGV2ZWxfaWRjKTsKKwkJCWJyZWFrOworCQljYXNlIDU6CisJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiVkOiBMZXZlbCA1KCV1KVxuIiwKKwkJCXZkZWMtPmlkLCB2ZGVjLT5sZXZlbF9pZGMpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiVkOiBOb3QgU3VwcG9ydCBMZXZlbCgldSlcbiIsCisJCQl2ZGVjLT5pZCwgdmRlYy0+bGV2ZWxfaWRjKTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBwYnVmOworfQorCitzdGF0aWMgc3NpemVfdCBsZXZlbF9pZGNfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLCBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCB2ZGVjX2NvcmVfcyAqY29yZSA9IHZkZWNfY29yZTsKKwljaGFyICpwYnVmID0gYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSB2ZGVjX2NvcmVfbG9jayh2ZGVjX2NvcmUpOworCisJaWYgKGxpc3RfZW1wdHkoJmNvcmUtPmNvbm5lY3RlZF92ZGVjX2xpc3QpKQorCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgImNvbm5lY3RlZCB2ZGVjIGxpc3QgZW1wdHlcbiIpOworCWVsc2UgeworCQlzdHJ1Y3QgdmRlY19zICp2ZGVjOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZkZWMsICZjb3JlLT5jb25uZWN0ZWRfdmRlY19saXN0LCBsaXN0KSB7CisJCQlpZiAodmRlYy0+Zm9ybWF0ID09IDApIHsKKwkJCQlwYnVmID0gcGFyc2VyX21wZWcyX2xldmVsKHBidWYsIHZkZWMpOworCQkJfSBlbHNlIGlmICh2ZGVjLT5mb3JtYXQgPT0gMSkgeworCQkJCXBidWYgPSBwYXJzZXJfbXBlZzRfbGV2ZWwocGJ1ZiwgdmRlYyk7CisJCQl9IGVsc2UgaWYgKHZkZWMtPmZvcm1hdCA9PSAyKSB7CisJCQkJcGJ1ZiA9IHBhcnNlcl9oMjY0X2xldmVsKHBidWYsIHZkZWMpOworCQkJfSBlbHNlIHsKKwkJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwKKwkJCQkiJWQ6IE5vdCBTdXBwb3J0XG4iLCB2ZGVjLT5pZCk7CisJCQl9CisJCX0KKwl9CisKKwl2ZGVjX2NvcmVfdW5sb2NrKHZkZWNfY29yZSwgZmxhZ3MpOworCXJldHVybiBwYnVmIC0gYnVmOworfQorCitzdGF0aWMgQ0xBU1NfQVRUUl9STyhhbXJpc2NfcmVncyk7CitzdGF0aWMgQ0xBU1NfQVRUUl9STyhkdW1wX3RyYWNlKTsKK3N0YXRpYyBDTEFTU19BVFRSX1JPKGNsb2NrX2xldmVsKTsKK3N0YXRpYyBDTEFTU19BVFRSX1JXKHBvd2Vyb25fY2xvY2tfbGV2ZWwpOworc3RhdGljIENMQVNTX0FUVFJfUlcoZHVtcF9yaXNjX21lbSk7CitzdGF0aWMgQ0xBU1NfQVRUUl9SVyhrZWVwX3ZkZWNfbWVtKTsKK3N0YXRpYyBDTEFTU19BVFRSX1JXKGVuYWJsZV9tdmRlY19pbmZvKTsKK3N0YXRpYyBDTEFTU19BVFRSX1JPKGNvcmUpOworc3RhdGljIENMQVNTX0FUVFJfUk8odmRlY19zdGF0dXMpOworc3RhdGljIENMQVNTX0FUVFJfUk8oZHVtcF92ZGVjX2Jsb2Nrcyk7CitzdGF0aWMgQ0xBU1NfQVRUUl9STyhkdW1wX3ZkZWNfY2h1bmtzKTsKK3N0YXRpYyBDTEFTU19BVFRSX1JPKGR1bXBfZGVjb2Rlcl9zdGF0ZSk7CisjaWZkZWYgVkRFQ19ERUJVR19TVVBQT1JUCitzdGF0aWMgQ0xBU1NfQVRUUl9SVyhkZWJ1Zyk7CisjZW5kaWYKK3N0YXRpYyBDTEFTU19BVFRSX1JXKHZkZWNfdmZtX3BhdGgpOworI2lmZGVmIEZSQU1FX0NIRUNLCitzdGF0aWMgQ0xBU1NfQVRUUl9SVyhkdW1wX3l1dik7CitzdGF0aWMgQ0xBU1NfQVRUUl9SVyhmcmFtZV9jaGVjayk7CisjZW5kaWYKK3N0YXRpYyBDTEFTU19BVFRSX1JPKGR1bXBfZnBzKTsKK3N0YXRpYyBDTEFTU19BVFRSX1JPKHByb2ZpbGVfaWRjKTsKK3N0YXRpYyBDTEFTU19BVFRSX1JPKGxldmVsX2lkYyk7CitzdGF0aWMgQ0xBU1NfQVRUUl9STyh2ZXJzaW9uKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnZkZWNfY2xhc3NfYXR0cnNbXSA9IHsKKwkmY2xhc3NfYXR0cl9hbXJpc2NfcmVncy5hdHRyLAorCSZjbGFzc19hdHRyX2R1bXBfdHJhY2UuYXR0ciwKKwkmY2xhc3NfYXR0cl9jbG9ja19sZXZlbC5hdHRyLAorCSZjbGFzc19hdHRyX3Bvd2Vyb25fY2xvY2tfbGV2ZWwuYXR0ciwKKwkmY2xhc3NfYXR0cl9kdW1wX3Jpc2NfbWVtLmF0dHIsCisJJmNsYXNzX2F0dHJfa2VlcF92ZGVjX21lbS5hdHRyLAorCSZjbGFzc19hdHRyX2VuYWJsZV9tdmRlY19pbmZvLmF0dHIsCisJJmNsYXNzX2F0dHJfY29yZS5hdHRyLAorCSZjbGFzc19hdHRyX3ZkZWNfc3RhdHVzLmF0dHIsCisJJmNsYXNzX2F0dHJfZHVtcF92ZGVjX2Jsb2Nrcy5hdHRyLAorCSZjbGFzc19hdHRyX2R1bXBfdmRlY19jaHVua3MuYXR0ciwKKwkmY2xhc3NfYXR0cl9kdW1wX2RlY29kZXJfc3RhdGUuYXR0ciwKKyNpZmRlZiBWREVDX0RFQlVHX1NVUFBPUlQKKwkmY2xhc3NfYXR0cl9kZWJ1Zy5hdHRyLAorI2VuZGlmCisJJmNsYXNzX2F0dHJfdmRlY192Zm1fcGF0aC5hdHRyLAorI2lmZGVmIEZSQU1FX0NIRUNLCisJJmNsYXNzX2F0dHJfZHVtcF95dXYuYXR0ciwKKwkmY2xhc3NfYXR0cl9mcmFtZV9jaGVjay5hdHRyLAorI2VuZGlmCisJJmNsYXNzX2F0dHJfZHVtcF9mcHMuYXR0ciwKKwkmY2xhc3NfYXR0cl9wcm9maWxlX2lkYy5hdHRyLAorCSZjbGFzc19hdHRyX2xldmVsX2lkYy5hdHRyLAorCSZjbGFzc19hdHRyX3ZlcnNpb24uYXR0ciwKKwlOVUxMCit9OworCitBVFRSSUJVVEVfR1JPVVBTKHZkZWNfY2xhc3MpOworCitzdGF0aWMgc3RydWN0IGNsYXNzIHZkZWNfY2xhc3MgPSB7CisJLm5hbWUgPSAidmRlYyIsCisJLmNsYXNzX2dyb3VwcyA9IHZkZWNfY2xhc3NfZ3JvdXBzLAorfTsKKworc3RydWN0IGRldmljZSAqZ2V0X3ZkZWNfZGV2aWNlKHZvaWQpCit7CisJcmV0dXJuICZ2ZGVjX2NvcmUtPnZkZWNfY29yZV9wbGF0Zm9ybV9kZXZpY2UtPmRldjsKK30KK0VYUE9SVF9TWU1CT0woZ2V0X3ZkZWNfZGV2aWNlKTsKKworc3RhdGljIGludCB2ZGVjX3Bvc3RfdGFza19yZWN5Y2xlKHZvaWQgKmFyZ3MpCit7CisJc3RydWN0IHBvc3RfdGFza19tZ3JfcyAqcG9zdCA9CisJCShzdHJ1Y3QgcG9zdF90YXNrX21ncl9zICopYXJnczsKKworCXdoaWxlIChwb3N0LT5ydW5uaW5nICYmCisJCWRvd25faW50ZXJydXB0aWJsZSgmcG9zdC0+c2VtKSA9PSAwKSB7CisJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCisJCQlicmVhazsKKwkJbXV0ZXhfbG9jaygmcG9zdC0+bXV0ZXgpOworCQlpZiAoIWxpc3RfZW1wdHkoJnBvc3QtPnRhc2tfcmVjeWNsZSkpIHsKKwkJCXN0cnVjdCB2ZGVjX3Bvc3RfdGFza19wYXJtc19zICpwYXJtcywgKnRtcDsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYXJtcywgdG1wLCAmcG9zdC0+dGFza19yZWN5Y2xlLCByZWN5Y2xlKSB7CisJCQkJaWYgKHBhcm1zLT5zY2hlZHVsZWQpIHsKKwkJCQkJbGlzdF9kZWwoJnBhcm1zLT5yZWN5Y2xlKTsKKwkJCQkJa3RocmVhZF9zdG9wKHBhcm1zLT50YXNrKTsKKwkJCQkJa2ZyZWUocGFybXMpOworCQkJCQlwYXJtcyA9IE5VTEw7CisJCQkJfQorCQkJfQorCQl9CisJCW11dGV4X3VubG9jaygmcG9zdC0+bXV0ZXgpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2ZGVjX3Bvc3RfdGFza19leGl0KHZvaWQpCit7CisJc3RydWN0IHBvc3RfdGFza19tZ3JfcyAqcG9zdCA9ICZ2ZGVjX2NvcmUtPnBvc3Q7CisKKwlwb3N0LT5ydW5uaW5nID0gZmFsc2U7CisJdXAoJnBvc3QtPnNlbSk7CisKKwlrdGhyZWFkX3N0b3AocG9zdC0+dGFzayk7Cit9CisKK3N0YXRpYyBpbnQgdmRlY19wb3N0X3Rhc2tfaW5pdCh2b2lkKQoreworCXN0cnVjdCBwb3N0X3Rhc2tfbWdyX3MgKnBvc3QgPSAmdmRlY19jb3JlLT5wb3N0OworCisJc2VtYV9pbml0KCZwb3N0LT5zZW0sIDApOworCUlOSVRfTElTVF9IRUFEKCZwb3N0LT50YXNrX3JlY3ljbGUpOworCW11dGV4X2luaXQoJnBvc3QtPm11dGV4KTsKKwlwb3N0LT5ydW5uaW5nID0gdHJ1ZTsKKworCXBvc3QtPnRhc2sgPSBrdGhyZWFkX3J1bih2ZGVjX3Bvc3RfdGFza19yZWN5Y2xlLAorCQlwb3N0LCAidGFzay1wb3N0LWRhZW1vbi10aHJlYWQiKTsKKwlpZiAoSVNfRVJSKHBvc3QtPnRhc2spKSB7CisJCXByX2VycigiJXMsIGNyZWF0IHRhc2sgcG9zdCBkYWVtb24gdGhyZWFkIGZhaWxkICVsZFxuIiwKKwkJCV9fZnVuY19fLCBQVFJfRVJSKHBvc3QtPnRhc2spKTsKKwkJcmV0dXJuIFBUUl9FUlIocG9zdC0+dGFzayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmRlY19wb3N0X2hhbmRsZXIodm9pZCAqYXJncykKK3sKKwlzdHJ1Y3QgdmRlY19wb3N0X3Rhc2tfcGFybXNfcyAqcGFybXMgPQorCQkoc3RydWN0IHZkZWNfcG9zdF90YXNrX3Bhcm1zX3MgKikgYXJnczsKKwlzdHJ1Y3QgcG9zdF90YXNrX21ncl9zICpwb3N0ID0gJnZkZWNfY29yZS0+cG9zdDsKKworCWNvbXBsZXRlKCZwYXJtcy0+cGFyayk7CisKKwkvKiBwcm9jZXNzIGNsaWVudCB0YXNrLiAqLworCXBhcm1zLT5mdW5jKHBhcm1zLT5wcml2YXRlKTsKKwlwYXJtcy0+c2NoZWR1bGVkID0gMTsKKwl1cCgmcG9zdC0+c2VtKTsKKworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHZkZWNfcG9zdF90YXNrKHBvc3RfdGFza19oYW5kbGVyIGZ1bmMsIHZvaWQgKmFyZ3MpCit7CisJc3RydWN0IHZkZWNfcG9zdF90YXNrX3Bhcm1zX3MgKnBhcm1zOworCXN0cnVjdCBwb3N0X3Rhc2tfbWdyX3MgKnBvc3QgPSAmdmRlY19jb3JlLT5wb3N0OworCisJcGFybXMgPSBremFsbG9jKHNpemVvZigqcGFybXMpLCBHRlBfS0VSTkVMKTsKKwlpZiAocGFybXMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwYXJtcy0+ZnVuYwk9IGZ1bmM7CisJcGFybXMtPnByaXZhdGUJPSBhcmdzOworCWluaXRfY29tcGxldGlvbigmcGFybXMtPnBhcmspOworCXBhcm1zLT5zY2hlZHVsZWQgPSAwOworCXBhcm1zLT50YXNrCT0ga3RocmVhZF9ydW4odmRlY19wb3N0X2hhbmRsZXIsCisJCQkJcGFybXMsICJ0YXNrLXBvc3QtdGhyZWFkIik7CisJaWYgKElTX0VSUihwYXJtcy0+dGFzaykpIHsKKwkJcHJfZXJyKCIlcywgY3JlYXQgdGFzayBwb3N0IHRocmVhZCBmYWlsZCAlbGRcbiIsCisJCQlfX2Z1bmNfXywgUFRSX0VSUihwYXJtcy0+dGFzaykpOworCQlrZnJlZShwYXJtcyk7CisJCXJldHVybiBQVFJfRVJSKHBhcm1zLT50YXNrKTsKKwl9CisJaWYgKCFfX2t0aHJlYWRfc2hvdWxkX3BhcmsocGFybXMtPnRhc2spKQorCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZwYXJtcy0+cGFyayk7CisKKwltdXRleF9sb2NrKCZwb3N0LT5tdXRleCk7CisJLyogYWRkIHRvIGxpc3QgZm9yIHJlc291cmNlIHJlY3ljbGUgaW4gcG9zdCBkYWVtb24ga3RocmVhZCAqLworCWxpc3RfYWRkX3RhaWwoJnBhcm1zLT5yZWN5Y2xlLCAmcG9zdC0+dGFza19yZWN5Y2xlKTsKKwltdXRleF91bmxvY2soJnBvc3QtPm11dGV4KTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3Bvc3RfdGFzayk7CisKKworCitzdGF0aWMgaW50IHZkZWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzMzIgaSwgcjsKKworCXZkZWNfY29yZSA9IChzdHJ1Y3QgdmRlY19jb3JlX3MgKilkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwKKwkJCXNpemVvZihzdHJ1Y3QgdmRlY19jb3JlX3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAodmRlY19jb3JlID09IE5VTEwpIHsKKwkJcHJfZXJyKCJ2ZGVjIGNvcmUgYWxsb2NhdGlvbiBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYXRvbWljX3NldCgmdmRlY19jb3JlLT52ZGVjX25yLCAwKTsKKwlzZW1hX2luaXQoJnZkZWNfY29yZS0+c2VtLCAxKTsKKworCXIgPSBjbGFzc19yZWdpc3RlcigmdmRlY19jbGFzcyk7CisJaWYgKHIpIHsKKwkJcHJfaW5mbygidmRlYyBjbGFzcyBjcmVhdGUgZmFpbC5cbiIpOworCQlyZXR1cm4gcjsKKwl9CisKKwl2ZGVjX2NvcmUtPnZkZWNfY29yZV9wbGF0Zm9ybV9kZXZpY2UgPSBwZGV2OworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgdmRlY19jb3JlKTsKKworCWZvciAoaSA9IDA7IGkgPCBWREVDX0lSUV9NQVg7IGkrKykgeworCQl2ZGVjX2NvcmUtPmlzcl9jb250ZXh0W2ldLmluZGV4ID0gaTsKKwkJdmRlY19jb3JlLT5pc3JfY29udGV4dFtpXS5pcnEgPSAtMTsKKwl9CisKKwlyID0gdmRlY19yZXF1ZXN0X3RocmVhZGVkX2lycShWREVDX0lSUV8wLCBOVUxMLCBOVUxMLAorCQlJUlFGX09ORVNIT1QsICJ2ZGVjLTAiLCBOVUxMKTsKKwlpZiAociA8IDApIHsKKwkJcHJfZXJyKCJ2ZGVjIGludGVycnVwdCByZXF1ZXN0IGZhaWxlZFxuIik7CisJCXJldHVybiByOworCX0KKworCXIgPSB2ZGVjX3JlcXVlc3RfdGhyZWFkZWRfaXJxKFZERUNfSVJRXzEsIE5VTEwsIE5VTEwsCisJCUlSUUZfT05FU0hPVCwgInZkZWMtMSIsIE5VTEwpOworCWlmIChyIDwgMCkgeworCQlwcl9lcnIoInZkZWMgaW50ZXJydXB0IHJlcXVlc3QgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHI7CisJfQorI2lmIDAKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IE1FU09OX0NQVV9NQUpPUl9JRF9HMTJBKSB7CisJCXIgPSB2ZGVjX3JlcXVlc3RfdGhyZWFkZWRfaXJxKFZERUNfSVJRX0hFVkNfQkFDSywgTlVMTCwgTlVMTCwKKwkJCUlSUUZfT05FU0hPVCwgInZkZWMtaGV2Y19iYWNrIiwgTlVMTCk7CisJCWlmIChyIDwgMCkgeworCQkJcHJfZXJyKCJ2ZGVjIGludGVycnVwdCByZXF1ZXN0IGZhaWxlZFxuIik7CisJCQlyZXR1cm4gcjsKKwkJfQorCX0KKyNlbmRpZgorCXIgPSBvZl9yZXNlcnZlZF9tZW1fZGV2aWNlX2luaXQoJnBkZXYtPmRldik7CisJaWYgKHIgPT0gMCkKKwkJcHJfaW5mbygidmRlY19wcm9iZSBkb25lXG4iKTsKKworCXZkZWNfY29yZS0+Y21hX2RldiA9ICZwZGV2LT5kZXY7CisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX004KSB7CisJCS8qIGRlZmF1bHQgdG8gMjUwTUh6ICovCisJCXZkZWNfY2xvY2tfaGlfZW5hYmxlKCk7CisJfQorCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hCQikgeworCQkvKiBzZXQgdmRlYyBkbWMgcmVxdWVzdCB0byB1cmdlbnQgKi8KKwkJV1JJVEVfRE1DUkVHKERNQ19BTTVfQ0hBTl9DVFJMLCAweDNmMjAzY2YpOworCX0KKwlJTklUX0xJU1RfSEVBRCgmdmRlY19jb3JlLT5jb25uZWN0ZWRfdmRlY19saXN0KTsKKwlzcGluX2xvY2tfaW5pdCgmdmRlY19jb3JlLT5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmdmRlY19jb3JlLT5jYW52YXNfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnZkZWNfY29yZS0+ZnBzX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZ2ZGVjX2NvcmUtPmlucHV0X2xvY2spOworCWlkYV9pbml0KCZ2ZGVjX2NvcmUtPmlkYSk7CisJdmRlY19jb3JlLT50aHJlYWQgPSBrdGhyZWFkX3J1bih2ZGVjX2NvcmVfdGhyZWFkLCB2ZGVjX2NvcmUsCisJCQkJCSJ2ZGVjLWNvcmUiKTsKKworCXZkZWNfY29yZS0+dmRlY19jb3JlX3dxID0gYWxsb2Nfb3JkZXJlZF93b3JrcXVldWUoIiVzIixfX1dRX0xFR0FDWSB8CisJCVdRX01FTV9SRUNMQUlNIHxXUV9ISUdIUFJJLypoaWdoIHByaW9yaXR5Ki8sICJ2ZGVjLXdvcmsiKTsKKwkvKndvcmsgcXVldWUgcHJpb3JpdHkgbG93ZXIgdGhhbiB2ZGVjLWNvcmUuKi8KKworCXZkZWNfcG9zdF90YXNrX2luaXQoKTsKKworCS8qIHBvd2VyIG1hbmFnZXIgaW5pdC4gKi8KKwl2ZGVjX2NvcmUtPnBtID0gKHN0cnVjdCBwb3dlcl9tYW5hZ2VyX3MgKikKKwkJb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKCZwZGV2LT5kZXYpOworCWlmICh2ZGVjX2NvcmUtPnBtLT5pbml0KSB7CisJCXIgPSB2ZGVjX2NvcmUtPnBtLT5pbml0KCZwZGV2LT5kZXYpOworCQlpZiAocikgeworCQkJcHJfZXJyKCJ2ZGVjIHBvd2VyIG1hbmFnZXIgaW5pdCBmYWlsZWRcbiIpOworCQkJcmV0dXJuIHI7CisJCX0KKwkJcHJfZXJyKCJ2ZGVjIHBvd2VyIGluaXQgc3VjY2VzcyFcbiIpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZkZWNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVkRFQ19JUlFfTUFYOyBpKyspIHsKKwkJaWYgKHZkZWNfY29yZS0+aXNyX2NvbnRleHRbaV0uaXJxID49IDApIHsKKwkJCWZyZWVfaXJxKHZkZWNfY29yZS0+aXNyX2NvbnRleHRbaV0uaXJxLAorCQkJCSZ2ZGVjX2NvcmUtPmlzcl9jb250ZXh0W2ldKTsKKwkJCXZkZWNfY29yZS0+aXNyX2NvbnRleHRbaV0uaXJxID0gLTE7CisJCQl2ZGVjX2NvcmUtPmlzcl9jb250ZXh0W2ldLmRldl9pc3IgPSBOVUxMOworCQkJdmRlY19jb3JlLT5pc3JfY29udGV4dFtpXS5kZXZfdGhyZWFkZWRfaXNyID0gTlVMTDsKKwkJCXZkZWNfY29yZS0+aXNyX2NvbnRleHRbaV0uZGV2X2lkID0gTlVMTDsKKwkJfQorCX0KKworCXZkZWNfcG9zdF90YXNrX2V4aXQoKTsKKworCWt0aHJlYWRfc3RvcCh2ZGVjX2NvcmUtPnRocmVhZCk7CisKKwlkZXN0cm95X3dvcmtxdWV1ZSh2ZGVjX2NvcmUtPnZkZWNfY29yZV93cSk7CisKKwlpZiAodmRlY19jb3JlLT5wbS0+cmVsZWFzZSkKKwkJdmRlY19jb3JlLT5wbS0+cmVsZWFzZSgmcGRldi0+ZGV2KTsKKworCWNsYXNzX3VucmVnaXN0ZXIoJnZkZWNfY2xhc3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWNvbmZpZyB2ZGVjX2NvbmZpZ3NbXSA9IHsKKwlNQ19QVTMyKCJkZWJ1Z190cmFjZV9udW0iLCAmZGVidWdfdHJhY2VfbnVtKSwKKwlNQ19QSTMyKCJoZXZjX21heF9yZXNldF9jb3VudCIsICZoZXZjX21heF9yZXNldF9jb3VudCksCisJTUNfUFUzMigiY2xrX2NvbmZpZyIsICZjbGtfY29uZmlnKSwKKwlNQ19QSTMyKCJzdGVwX21vZGUiLCAmc3RlcF9tb2RlKSwKKwlNQ19QSTMyKCJwb3dlcm9uX2Nsb2NrX2xldmVsIiwgJnBvd2Vyb25fY2xvY2tfbGV2ZWwpLAorfTsKK3N0YXRpYyBzdHJ1Y3QgbWNvbmZpZ19ub2RlIHZkZWNfbm9kZTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYW1sb2dpY192ZGVjX21hdGNoZXNbXTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdmRlY19kcml2ZXIgPSB7CisJLnByb2JlID0gdmRlY19wcm9iZSwKKwkucmVtb3ZlID0gdmRlY19yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAidmRlYyIsCisJCS5vZl9tYXRjaF90YWJsZSA9IGFtbG9naWNfdmRlY19tYXRjaGVzLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY29kZWNfcHJvZmlsZV90IGFtdmRlY19jb21tb25fcHJvZmlsZSA9IHsKKwkubmFtZSA9ICJ2ZGVjX2NvbW1vbiIsCisJLnByb2ZpbGUgPSAidmRlYyIKK307CisKK3N0YXRpYyBzdHJ1Y3QgY29kZWNfcHJvZmlsZV90IGFtdmRlY19pbnB1dF9wcm9maWxlID0geworCS5uYW1lID0gInZkZWNfaW5wdXQiLAorCS5wcm9maWxlID0gImRybV9mcmFtZW1vZGUiCit9OworCitpbnQgdmRlY19tb2R1bGVfaW5pdCh2b2lkKQoreworCWlmIChwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnZkZWNfZHJpdmVyKSkgeworCQlwcl9pbmZvKCJmYWlsZWQgdG8gcmVnaXN0ZXIgdmRlYyBtb2R1bGVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJSU5JVF9SRUdfTk9ERV9DT05GSUdTKCJtZWRpYS5kZWNvZGVyIiwgJnZkZWNfbm9kZSwKKwkJInZkZWMiLCB2ZGVjX2NvbmZpZ3MsIENPTkZJR19GT1JfUlcpOworCXZjb2RlY19wcm9maWxlX3JlZ2lzdGVyKCZhbXZkZWNfY29tbW9uX3Byb2ZpbGUpOworCisJdmNvZGVjX3Byb2ZpbGVfcmVnaXN0ZXIoJmFtdmRlY19pbnB1dF9wcm9maWxlKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19tb2R1bGVfaW5pdCk7CisKK3ZvaWQgdmRlY19tb2R1bGVfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ2ZGVjX2RyaXZlcik7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfbW9kdWxlX2V4aXQpOworCisjaWYgMAorc3RhdGljIGludCBfX2luaXQgdmRlY19tb2R1bGVfaW5pdCh2b2lkKQoreworCWlmIChwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnZkZWNfZHJpdmVyKSkgeworCQlwcl9pbmZvKCJmYWlsZWQgdG8gcmVnaXN0ZXIgdmRlYyBtb2R1bGVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJSU5JVF9SRUdfTk9ERV9DT05GSUdTKCJtZWRpYS5kZWNvZGVyIiwgJnZkZWNfbm9kZSwKKwkJInZkZWMiLCB2ZGVjX2NvbmZpZ3MsIENPTkZJR19GT1JfUlcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdmRlY19tb2R1bGVfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ2ZGVjX2RyaXZlcik7Cit9CisjZW5kaWYKKworc3RhdGljIGludCB2ZGVjX21lbV9kZXZpY2VfaW5pdChzdHJ1Y3QgcmVzZXJ2ZWRfbWVtICpybWVtLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJdmRlY19jb3JlLT5jbWFfZGV2ID0gZGV2OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVzZXJ2ZWRfbWVtX29wcyBybWVtX3ZkZWNfb3BzID0geworCS5kZXZpY2VfaW5pdCA9IHZkZWNfbWVtX2RldmljZV9pbml0LAorfTsKKworc3RhdGljIGludCBfX2luaXQgdmRlY19tZW1fc2V0dXAoc3RydWN0IHJlc2VydmVkX21lbSAqcm1lbSkKK3sKKwlybWVtLT5vcHMgPSAmcm1lbV92ZGVjX29wczsKKwlwcl9pbmZvKCJ2ZGVjOiByZXNlcnZlZCBtZW0gc2V0dXBcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCB2ZGVjX3NldF92ZnJhbWVfY29tbShzdHJ1Y3QgdmRlY19zICp2ZGVjLCBjaGFyICpuKQoreworCXN0cnVjdCB2ZGVjX2ZyYW1lc19zICptdmZybSA9IHZkZWMtPm12ZnJtOworCisJaWYgKCFtdmZybSkKKwkJcmV0dXJuOworCisJbXZmcm0tPmNvbW0udmRlY19pZCA9IHZkZWMtPmlkOworCisJc25wcmludGYobXZmcm0tPmNvbW0udmRlY19uYW1lLCBzaXplb2YobXZmcm0tPmNvbW0udmRlY19uYW1lKS0xLAorCQkiJXMiLCBuKTsKKwltdmZybS0+Y29tbS52ZGVjX3R5cGUgPSB2ZGVjLT50eXBlOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3NldF92ZnJhbWVfY29tbSk7CisKK3UzMiBkaWZmX3B0cyh1MzIgYSwgdTMyIGIpCit7CisJaWYgKCFhIHx8ICFiKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiBhYnMoYSAtIGIpOworfQorCisvKgorICogV2Ugb25seSB1c2UgdGhlIGZpcnN0IDUgZnJhbWVzIHRvIGNhbGMgZHVyYXRpb24uCisgKiBUaGUgZmlmb1swXX5maWZvWzRdIG1lYW5zIHRoZSBmcmFtZSAwIHRvIGZyYW1lIDQuCisgKiB3ZSBzdGFydCB0byBjYWxjdWxhdGUgdGhlIGR1cmF0aW9uIGZyb20gZnJhbWUgMS4KKyAqIEFuZCB0aGUgY2FsbGVyIGd1YXJhbnRlZXMgdGhhdCBzbG90ID4gMC4KKyAqLworc3RhdGljIHZvaWQgY2FsX2R1cl9mcm9tX3B0cyhzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1MzIgc2xvdCkKK3sKKyNkZWZpbmUgRFVSQVRJT05fVEhSRVNIT0QgMTAKKwlzdGF0aWMgdTMyIG11c3Rfc2VuZCA9IDAsIHJlYWR5ID0gMDsKKwl1MzIgb2xkID0gMCwgY3VyLCBkaWZmOworCXN0cnVjdCB2ZnJhbWVfY291bnRlcl9zICpmaWZvID0gdmRlYy0+bXZmcm0tPmZpZm9fYnVmOworCisJaWYgKHZkZWMtPm12ZnJtLT53ciA9PSAxKSB7CisJCXJlYWR5ID0gMDsKKwkJbXVzdF9zZW5kID0gMDsKKwl9CisKKwlpZiAobXVzdF9zZW5kID09IDIpCisJCXJldHVybiA7CisKKwlpZiAocmVhZHkpCisJCSsrbXVzdF9zZW5kOworCisJaWYgKCh2ZGVjLT5mb3JtYXQgIT0gVkZPUk1BVF9IMjY0ICYmIHZkZWMtPmZvcm1hdCAhPSBWRk9STUFUX0hFVkMpIHx8CisJICAgICFmaWZvW3Nsb3RdLnB0cykgeworCQlpZiAoZmlmb1tzbG90XS5mcmFtZV9kdXIgIT0gcmVhZHkpIHsKKwkJCWlmIChtdXN0X3NlbmQpCisJCQkJcmVhZHkgPSAocmVhZHkgKyBmaWZvW3Nsb3RdLmZyYW1lX2R1cikgLyAyOworCQkJZWxzZQorCQkJCXJlYWR5ID0gZmlmb1tzbG90XS5mcmFtZV9kdXI7CisJCQlwcl9kZWJ1ZygiJXMgaW5uZXIgZHJpdmVyIGR1ciV1IFxuIixfX2Z1bmNfXywgcmVhZHkpOworCQl9CisJCWdvdG8gZW5kX2hhbmRsZTsKKwl9CisKKwlpZiAoc2xvdCA9PSAxKSB7CisJCWN1ciA9IGRpZmZfcHRzKGZpZm9bMV0ucHRzLCBmaWZvWzBdLnB0cyk7CisJfSBlbHNlIHsKKwkJb2xkID0gZGlmZl9wdHMoZmlmb1tzbG90IC0gMV0ucHRzLCBmaWZvW3Nsb3QgLSAyXS5wdHMpOworCQljdXIgPSBkaWZmX3B0cyhmaWZvW3Nsb3RdLnB0cywgZmlmb1tzbG90IC0gMV0ucHRzKTsKKwl9CisKKwlkaWZmID0gYWJzKGN1ciAtIG9sZCk7CisJaWYgKGRpZmYgPiBEVVJBVElPTl9USFJFU0hPRCkgeworCQl1MzIgZHVyLCBjdXIyOworCisJCWN1cjIgPSAoY3VyIDw8IDQpIC8gMTU7CisJCWRpZmYgPSBhYnMoY3VyMiAtIGZpZm9bc2xvdF0uZnJhbWVfZHVyKTsKKwkJaWYgKGZpZm9bc2xvdF0uZnJhbWVfZHVyID09IDM2MDApCisJCQlkdXIgPSBjdXIyOworCQllbHNlIGlmIChkaWZmIDwgRFVSQVRJT05fVEhSRVNIT0QgfHwgZGlmZiA+IGZpZm9bc2xvdF0uZnJhbWVfZHVyKQorCQkJZHVyID0gZmlmb1tzbG90XS5mcmFtZV9kdXI7CisJCWVsc2UKKwkJCWR1ciA9IGN1cjI7CisKKwkJaWYgKHJlYWR5ID09IGR1cikKKwkJCWdvdG8gZW5kX2hhbmRsZTsKKworCQlpZiAobXVzdF9zZW5kKQorCQkJcmVhZHkgPSAocmVhZHkgKyBkdXIpIC8gMjsKKwkJZWxzZQorCQkJcmVhZHkgPSBkdXI7CisJCXByX2RlYnVnKCIlcyB2c3RhdHVzICV1IGR1ciV1IC0+ICV1LCByZXZpc2VkICV1XG4iLF9fZnVuY19fLGZpZm9bc2xvdF0uZnJhbWVfZHVyLCBjdXIsY3VyMiwgZHVyKTsKKwkJaWYgKGRpZmYgPiAxMCAmJiBzbG90ID49IDIpCisJCQlwcl9kZWJ1Zygid3I9JXUsc2xvdD0ldSBwdHMgJXUsICV1LCAldVxuIix2ZGVjLT5tdmZybS0+d3Isc2xvdCwKKwkJCQlmaWZvW3Nsb3RdLnB0cywgZmlmb1tzbG90LTFdLnB0cyxmaWZvW3Nsb3QtMl0ucHRzKTsKKwl9CisKK2VuZF9oYW5kbGU6CisJaWYgKG11c3Rfc2VuZCkgeworCQkrK211c3Rfc2VuZDsKKwkJdmRlY19mcmFtZV9yYXRlX3VldmVudChyZWFkeSk7CisJfQorfQorCit2b2lkIHZkZWNfZmlsbF92ZGVjX2ZyYW1lKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHN0cnVjdCB2ZnJhbWVfcW9zX3MgKnZmcmFtZV9xb3MsCisJCQkJc3RydWN0IHZkZWNfaW5mbyAqdmluZm8sc3RydWN0IHZmcmFtZV9zICp2ZiwKKwkJCQl1MzIgaHdfZGVjX3RpbWUpCit7CisjZGVmaW5lIE1JTklNVU1fRlJBTUVTIDUKKwl1MzIgaTsKKwlzdHJ1Y3QgdmZyYW1lX2NvdW50ZXJfcyAqZmlmb19idWY7CisJc3RydWN0IHZkZWNfZnJhbWVzX3MgKm12ZnJtID0gdmRlYy0+bXZmcm07CisKKwlpZiAoIW12ZnJtKQorCQlyZXR1cm47CisJZmlmb19idWYgPSBtdmZybS0+Zmlmb19idWY7CisKKwkvKiBhc3N1bWUgZnBzPT02MCxtdi0+d3IgbWF4IHZhbHVlIGNhbiBzdXBwb3J0IHN5c3RlbSBydW5uaW5nIDgyOCBkYXlzLAorCSB0aGlzIGlzIGVub3VnaCBmb3IgdXMgKi8KKwlpID0gbXZmcm0tPndyICYgKE5VTV9GUkFNRV9WREVDLTEpOyAvL2ZpbmQgdGhlIHNsb3QgbnVtIGluIGZpZm9fYnVmCisJbXZmcm0tPmZpZm9fYnVmW2ldLmRlY29kZV90aW1lX2Nvc3QgPSBod19kZWNfdGltZTsKKwlpZiAodmZyYW1lX3FvcykKKwkJbWVtY3B5KCZmaWZvX2J1ZltpXS5xb3MsIHZmcmFtZV9xb3MsIHNpemVvZihzdHJ1Y3QgdmZyYW1lX3Fvc19zKSk7CisJaWYgKHZpbmZvKSB7CisJCW1lbWNweSgmZmlmb19idWZbaV0uZnJhbWVfd2lkdGgsICZ2aW5mby0+ZnJhbWVfd2lkdGgsCisJCSAgICAgICAgKChjaGFyKikmdmluZm8tPnJlc2VydmVkWzBdIC0gKGNoYXIqKSZ2aW5mby0+ZnJhbWVfd2lkdGgpKTsKKwkJLypjb3B5IGZvciBpcGIgcmVwb3J0Ki8KKwkJbWVtY3B5KCZmaWZvX2J1ZltpXS5pX2RlY29kZWRfZnJhbWVzLCAmdmluZm8tPmlfZGVjb2RlZF9mcmFtZXMsCisJCSAgICAgICAgKChjaGFyKikmdmluZm8tPmVuZGlwYl9saW5lWzBdIC0gKGNoYXIqKSZ2aW5mby0+aV9kZWNvZGVkX2ZyYW1lcykpOworCQlmaWZvX2J1ZltpXS5hdl9yZXN5bmNoX2NvdW50ZXIgPSB0aW1lc3RhbXBfYXZzeW5jX2NvdW50ZXJfZ2V0KCk7CisJfQorCWlmICh2ZikgeworCQlmaWZvX2J1ZltpXS52Zl90eXBlID0gdmYtPnR5cGU7CisJCWZpZm9fYnVmW2ldLnNpZ25hbF90eXBlID0gdmYtPnNpZ25hbF90eXBlOworCQlmaWZvX2J1ZltpXS5wdHMgPSB2Zi0+cHRzOworCQlmaWZvX2J1ZltpXS5wdHNfdXM2NCA9IHZmLT5wdHNfdXM2NDsKKworCQkvKiBDYWxjdWxhdGUgdGhlIGR1cmF0aW9uIGZyb20gcHRzICovCisJCWlmICghdmRlYy0+aXNfdjRsICYmIChtdmZybS0+d3IgPCBNSU5JTVVNX0ZSQU1FUyAmJiBtdmZybS0+d3IgPiAwKSkKKwkJCWNhbF9kdXJfZnJvbV9wdHModmRlYywgaSk7CisJfQorCW12ZnJtLT53cisrOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX2ZpbGxfdmRlY19mcmFtZSk7CisKK3ZvaWQgdmRlY192ZnJhbWVfcmVhZHkoc3RydWN0IHZkZWNfcyAqdmRlYywgc3RydWN0IHZmcmFtZV9zICp2ZikgeworCWlmICh2ZGVjX3NlY3VyZSh2ZGVjKSkgeworCQl2Zi0+ZmxhZyB8PSBWRlJBTUVfRkxBR19WSURFT19TRUNVUkU7CisJfSBlbHNlIHsKKwkJdmYtPmZsYWcgJj0gflZGUkFNRV9GTEFHX1ZJREVPX1NFQ1VSRTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfdmZyYW1lX3JlYWR5KTsKKwordm9pZCBzZXRfbWV0YV9kYXRhX3RvX3ZmKHN0cnVjdCB2ZnJhbWVfcyAqdmYsIHUzMiB0eXBlLCB2b2lkICp2NGwyX2N0eCkKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKHY0bDJfY3R4KTsKKwlzdHJ1Y3QgYW1sX21ldGFfaGVhZF9zCQloZWFkOworCXN0cnVjdCBhbWxfdmZfYmFzZV9pbmZvX3MJdmZiX2luZm9zOworCisJaWYgKChjdHggPT0gTlVMTCkgfHwgKHZmID09IE5VTEwpKQorCQlyZXR1cm4gOworCisJaWYgKHZmLT5tZXRhX2RhdGFfYnVmID09IE5VTEwpIHsKKwkJdmYtPm1ldGFfZGF0YV9idWYgPSBjdHgtPm1ldGFfaW5mb3MubWV0YV9idWZzW2N0eC0+bWV0YV9pbmZvcy5pbmRleF0uYnVmOworCQljdHgtPm1ldGFfaW5mb3MuaW5kZXggPSAoY3R4LT5tZXRhX2luZm9zLmluZGV4ICsgMSkgJSBWNExfQ0FQX0JVRkZfTUFYOworCX0KKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgVVZNX01FVEFfREFUQV9WRl9CQVNFX0lORk9TOgorCQlpZiAoKHZmLT5tZXRhX2RhdGFfc2l6ZSArIHNpemVvZihzdHJ1Y3QgYW1sX3ZmX2Jhc2VfaW5mb19zKSArIEFNTF9NRVRBX0hFQURfU0laRSkgPD0gTUVUQV9EQVRBX1NJWkUpIHsKKwkJCWhlYWQubWFnaWMgPSBNRVRBX0RBVEFfTUFHSUM7CisJCQloZWFkLnR5cGUgPSBVVk1fTUVUQV9EQVRBX1ZGX0JBU0VfSU5GT1M7CisJCQloZWFkLmRhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYW1sX3ZmX2Jhc2VfaW5mb19zKTsKKworCQkJbWVtY3B5KHZmLT5tZXRhX2RhdGFfYnVmICsgdmYtPm1ldGFfZGF0YV9zaXplLAorCQkJCSZoZWFkLCBBTUxfTUVUQV9IRUFEX1NJWkUpOworCQkJdmYtPm1ldGFfZGF0YV9zaXplICs9IEFNTF9NRVRBX0hFQURfU0laRTsKKworCQkJdmZiX2luZm9zLndpZHRoID0gdmYtPndpZHRoOworCQkJdmZiX2luZm9zLmhlaWdodCA9IHZmLT5oZWlnaHQ7CisJCQl2ZmJfaW5mb3MuZHVyYXRpb24gPSB2Zi0+ZHVyYXRpb247CisJCQl2ZmJfaW5mb3MuZnJhbWVfdHlwZSA9IHZmLT5mcmFtZV90eXBlOworCQkJdmZiX2luZm9zLnR5cGUgPSB2Zi0+dHlwZTsKKworCQkJbWVtY3B5KHZmLT5tZXRhX2RhdGFfYnVmICsgdmYtPm1ldGFfZGF0YV9zaXplLAorCQkJCSZ2ZmJfaW5mb3MsIHNpemVvZihzdHJ1Y3QgYW1sX3ZmX2Jhc2VfaW5mb19zKSk7CisJCQl2Zi0+bWV0YV9kYXRhX3NpemUgKz0gc2l6ZW9mKHN0cnVjdCBhbWxfdmZfYmFzZV9pbmZvX3MpOworCisJCQlpZiAoZGVidWdfbWV0YSkgeworCQkJCXByX2RlYnVnKCJ2Zi0+bWV0YV9kYXRhX3NpemUgPSAlZFxuIiwgdmYtPm1ldGFfZGF0YV9zaXplKTsKKwkJCQlwcl9kZWJ1ZygidmY6d2lkdGg6JWQgaGVpZ2h0OiVkIGR1cmF0aW9uOiVkIGZyYW1lX3R5cGU6JWQgdHlwZTolZFxuIiwKKwkJCQkJdmZiX2luZm9zLndpZHRoLCB2ZmJfaW5mb3MuaGVpZ2h0LCB2ZmJfaW5mb3MuZHVyYXRpb24sCisJCQkJCXZmYl9pbmZvcy5mcmFtZV90eXBlLCB2ZmJfaW5mb3MudHlwZSk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBVVk1fTUVUQV9EQVRBX0hEUjEwUF9EQVRBOgorCQlpZiAoKHZmLT5tZXRhX2RhdGFfc2l6ZSArIHZmLT5oZHIxMHBfZGF0YV9zaXplICsgQU1MX01FVEFfSEVBRF9TSVpFKSA8PSBNRVRBX0RBVEFfU0laRSkgeworCQkJaGVhZC5tYWdpYyA9IE1FVEFfREFUQV9NQUdJQzsKKwkJCWhlYWQudHlwZSA9IFVWTV9NRVRBX0RBVEFfSERSMTBQX0RBVEE7CisJCQloZWFkLmRhdGFfc2l6ZSA9IHZmLT5oZHIxMHBfZGF0YV9zaXplOworCisJCQltZW1jcHkodmYtPm1ldGFfZGF0YV9idWYgKyB2Zi0+bWV0YV9kYXRhX3NpemUsCisJCQkJJmhlYWQsIEFNTF9NRVRBX0hFQURfU0laRSk7CisJCQl2Zi0+bWV0YV9kYXRhX3NpemUgKz0gQU1MX01FVEFfSEVBRF9TSVpFOworCisJCQltZW1jcHkodmYtPm1ldGFfZGF0YV9idWYgKyB2Zi0+bWV0YV9kYXRhX3NpemUsCisJCQkJdmYtPmhkcjEwcF9kYXRhX2J1ZiwgdmYtPmhkcjEwcF9kYXRhX3NpemUpOworCQkJdmYtPm1ldGFfZGF0YV9zaXplICs9IHZmLT5oZHIxMHBfZGF0YV9zaXplOworCisJCQlpZiAoZGVidWdfbWV0YSkgeworCQkJCXByX2RlYnVnKCJ2Zi0+bWV0YV9kYXRhX3NpemUgPSAlZFxuIiwgdmYtPm1ldGFfZGF0YV9zaXplKTsKKwkJCQlwcl9kZWJ1ZygidmYtPmhkcjEwcF9kYXRhX3NpemUgPSAlZFxuIiwgdmYtPmhkcjEwcF9kYXRhX3NpemUpOworCQkJfQorCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KK0VYUE9SVF9TWU1CT0woc2V0X21ldGFfZGF0YV90b192Zik7CisKKy8qIEluIHRoaXMgZnVuY3Rpb24saWYgd2UgdXNlIGNvcHlfdG9fdXNlciwgd2UgbWF5IGVuY291bnRlciBzbGVlcCwKK3doaWNoIG1heSBibG9jayB0aGUgdmRlY19maWxsX3ZkZWNfZnJhbWUsdGhpcyBpcyBub3QgYWNjZXB0YWJsZS4KK1NvLCB3ZSBzaG91bGQgdXNlIGEgdG1wIGJ1ZmZlcihwYXNzZWQgYnkgY2FsbGVyKSB0byBnZXQgdGhlIGNvbnRlbnQgKi8KK3UzMiAgdmRlY19nZXRfZnJhbWVfdmRlYyhzdHJ1Y3QgdmRlY19zICp2ZGVjLCAgc3RydWN0IHZmcmFtZV9jb3VudGVyX3MgKnRtcGJ1ZikKK3sKKwl1MzIgdG9yZWFkID0gMDsKKwl1MzIgc2xvdF9yZDsKKwlzdHJ1Y3QgdmZyYW1lX2NvdW50ZXJfcyAqZmlmb19idWYgPSBOVUxMOworCXN0cnVjdCB2ZGVjX2ZyYW1lc19zICptdmZybSA9IE5VTEw7CisKKwkvKgorCXN3aXRjaCAodmVyc2lvbikgeworCWNhc2UgdmVyc2lvbl8xOgorCQlmMSgpOworCWNhc2UgdmVyc2lvbl8yOgorCQlmMigpOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwkqLworCisJaWYgKCF2ZGVjKQorCQlyZXR1cm4gMDsKKwltdmZybSA9IHZkZWMtPm12ZnJtOworCWlmICghbXZmcm0pCisJCXJldHVybiAwOworCisJZmlmb19idWYgPSAmbXZmcm0tPmZpZm9fYnVmWzBdOworCisJdG9yZWFkID0gbXZmcm0tPndyIC0gbXZmcm0tPnJkOworCWlmICh0b3JlYWQpIHsKKwkJaWYgKHRvcmVhZCA+PSBOVU1fRlJBTUVfVkRFQyAtIFFPU19GUkFNRV9OVU0pIHsKKwkJCS8qIHJvdW5kIHRoZSBmaWZvX2J1ZiBsZW5ndGggaGFwcGVucywgZ2l2ZSBRT1NfRlJBTUVfTlVNIGZvciBidWZmZXIgKi8KKwkJCW12ZnJtLT5yZCA9IG12ZnJtLT53ciAtIChOVU1fRlJBTUVfVkRFQyAtIFFPU19GUkFNRV9OVU0pOworCQl9CisKKwkJaWYgKHRvcmVhZCA+PSBRT1NfRlJBTUVfTlVNKSB7CisJCQl0b3JlYWQgPSBRT1NfRlJBTUVfTlVNOyAvL2J5IGRlZmF1bHQsIHdlIHVzZSB0aGlzIG51bQorCQl9CisKKwkJc2xvdF9yZCA9IG12ZnJtLT5yZCAmKCBOVU1fRlJBTUVfVkRFQy0xKTsgLy9JbiB0aGlzIGNhc2UgaXQgZXF1YWxzIHRvIHgleQorCQlpZiAoc2xvdF9yZCArIHRvcmVhZCA8PSBOVU1fRlJBTUVfVkRFQykgeworCQkJbWVtY3B5KHRtcGJ1ZiwgJmZpZm9fYnVmW3Nsb3RfcmRdLCB0b3JlYWQqc2l6ZW9mKHN0cnVjdCB2ZnJhbWVfY291bnRlcl9zKSk7CisJCX0gZWxzZSB7CisJCQl1MzIgZXhlZWQ7CisJCQlleGVlZCA9IHNsb3RfcmQgKyB0b3JlYWQgLSBOVU1fRlJBTUVfVkRFQzsKKwkJCW1lbWNweSh0bXBidWYsICZmaWZvX2J1ZltzbG90X3JkXSwgKE5VTV9GUkFNRV9WREVDIC0gc2xvdF9yZCkqc2l6ZW9mKHN0cnVjdCB2ZnJhbWVfY291bnRlcl9zKSk7CisJCQltZW1jcHkoJnRtcGJ1ZltOVU1fRlJBTUVfVkRFQy1zbG90X3JkXSwgJmZpZm9fYnVmWzBdLCBleGVlZCpzaXplb2Yoc3RydWN0IHZmcmFtZV9jb3VudGVyX3MpKTsKKwkJfQorCisJCW12ZnJtLT5yZCArPSB0b3JlYWQ7CisJfQorCXJldHVybiB0b3JlYWQ7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfZ2V0X2ZyYW1lX3ZkZWMpOworCitpbnQgZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhpbnQgZHdfbW9kZSkKK3sKKwlpbnQgcmF0aW8gPSAxOworCisJaWYgKChkd19tb2RlID09IDIpIHx8CisJCQkoZHdfbW9kZSA9PSAzKSkKKwkJcmF0aW8gPSA0OworCWVsc2UgaWYgKChkd19tb2RlID09IDQpIHx8CisJCQkJKGR3X21vZGUgPT0gNSkpCisJCXJhdGlvID0gMjsKKwllbHNlIGlmICgoZHdfbW9kZSA9PSA4KSB8fAorCQkoZHdfbW9kZSA9PSA5KSkKKwkJcmF0aW8gPSA4OworCXJldHVybiByYXRpbzsKK30KK0VYUE9SVF9TWU1CT0woZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyk7CisKK3ZvaWQgdmRlY19zZXRfdmxkX3dwKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHUzMiB3cCkKK3sKKwlpZiAodmRlY19zaW5nbGUodmRlYykpIHsKKwkJV1JJVEVfVlJFRyhWTERfTUVNX1ZJRklGT19XUCwgd3ApOworCX0KK30KK0VYUE9SVF9TWU1CT0wodmRlY19zZXRfdmxkX3dwKTsKKwordm9pZCB2ZGVjX2NvbmZpZ192bGRfcmVnKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHUzMiBhZGRyLCB1MzIgc2l6ZSkKK3sKKwlpZiAodmRlY19zaW5nbGUodmRlYykpIHsKKwkJV1JJVEVfVlJFRyhWTERfTUVNX1ZJRklGT19DT05UUk9MLCAwKTsKKwkJLyogcmVzZXQgVkxEIGJlZm9yZSBzZXR0aW5nIGFsbCBwb2ludGVycyAqLworCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX1dSQVBfQ09VTlQsIDApOworCQkvKlRPRE86IG9ubHkgPiBtNiovCisJCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgKDEgPDwgNCkpOworCQlXUklURV9WUkVHKERPU19TV19SRVNFVDAsIDApOworCisKKwkJV1JJVEVfVlJFRyhQT1dFUl9DVExfVkxELCAxIDw8IDQpOworCisJCVdSSVRFX1ZSRUcoVkxEX01FTV9WSUZJRk9fU1RBUlRfUFRSLAorCQkgICAgICAgYWRkcik7CisJCVdSSVRFX1ZSRUcoVkxEX01FTV9WSUZJRk9fRU5EX1BUUiwKKwkJICAgICAgIGFkZHIgKyBzaXplIC0gOCk7CisJCVdSSVRFX1ZSRUcoVkxEX01FTV9WSUZJRk9fQ1VSUl9QVFIsCisJCSAgICAgICBhZGRyKTsKKworCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX0NPTlRST0wsIDEpOworCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX0NPTlRST0wsIDApOworCisJCS8qIHNldCB0byBtYW51YWwgbW9kZSAqLworCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX0JVRl9DTlRMLCAyKTsKKwkJV1JJVEVfVlJFRyhWTERfTUVNX1ZJRklGT19XUCwgYWRkcik7CisKKwkJV1JJVEVfVlJFRyhWTERfTUVNX1ZJRklGT19CVUZfQ05UTCwgMyk7CisJCVdSSVRFX1ZSRUcoVkxEX01FTV9WSUZJRk9fQlVGX0NOVEwsIDIpOworCisJCS8qIGVuYWJsZSAqLworCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX0NPTlRST0wsCisJCQkoMHgxMSA8PCAxNikgfCAoMTw8MTApIHwgKDEgPDwgMSkgfCAoMSA8PCAyKSk7CisJCVNFVF9WUkVHX01BU0soVkxEX01FTV9WSUZJRk9fQ09OVFJPTCwKKwkJCTcgPDwgMyk7CisJfQorfQorRVhQT1JUX1NZTUJPTCh2ZGVjX2NvbmZpZ192bGRfcmVnKTsKKworc3RhdGljIHZvaWQgY2hlY2tfcmRtYV9yZXN1bHQoaW50IG51bSkKK3sKKwlpbnQgaSwgd3IscmQsZGF0YTsKKwlpbnQgZmxhZyA9IDE7CisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCXdyID0gUkVBRF9WUkVHKEhFVkNfSVFJVF9TQ0FMRUxVVF9XUl9BRERSKTsKKwkJcmQgPSBSRUFEX1ZSRUcoSEVWQ19JUUlUX1NDQUxFTFVUX1JEX0FERFIpOworCQlkYXRhID0gUkVBRF9WUkVHKEhFVkNfSVFJVF9TQ0FMRUxVVF9EQVRBKTsKKwkJaWYgKHdyICE9IChudW0gJiAweDNmZikpIHsKKwkJCXByX2luZm8oIi0tLT5IRVZDX0lRSVRfU0NBTEVMVVRfV1JfQUREUiA9IDB4JXhcbiIsIHdyKTsKKwkJCWZsYWcgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJkICE9IGkpIHsKKwkJCXByX2luZm8oIi0tLT5IRVZDX0lRSVRfU0NBTEVMVVRfUkRfQUREUiA9IDB4JXhcbiIsIHJkKTsKKwkJCWZsYWcgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZGF0YSAhPSAwKSB7CisJCQlwcl9pbmZvKCItLS0+SEVWQ19JUUlUX1NDQUxFTFVUX0RBVEEgPSAweCV4XG4iLCBkYXRhKTsKKwkJCWZsYWcgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGZsYWcgPT0gMCkKKwkJcHJfaW5mbygiLS0+JWQtLXJkbWEgZmxhaWxcbiIsIGkpOworCWVsc2UKKwkJcHJfaW5mbygicmRtYSBva1xuIik7CisJcmV0dXJuOworCit9CisKK2ludCBpc19yZG1hX2VuYWJsZSh2b2lkKQoreworCWlmIChyZG1hX21vZGUgJiYgKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDMpKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpc19yZG1hX2VuYWJsZSk7CisKK3ZvaWQgcmRtYV9mcm9udF9lbmRfd3JvayhkbWFfYWRkcl90IGRkcl9waHlfYWRkciwgdTMyIHNpemUpCit7CisJdWxvbmcgZXhwaXJlczsKKworCVdSSVRFX1ZSRUcoSEVWQ19SRE1BX0ZfQ1RSTCwKKwkJKDBYMCA8PCA3KSB8IC8vYXhpIGlkCisJCSgwWDcgPDwgMykgfCAvL2F4aSBsZW5ndGgKKwkJKDBYMCA8PCAyKSB8IC8vcmRtYSBmb3JjZSBjZyBlbgorCQkoMFgxIDw8IDEpKTsgLy9yZG1hIHBhdGggZW4KKwlXUklURV9WUkVHKEhFVkNfUkRNQV9GX1NUQVJUX0FERFIsIGRkcl9waHlfYWRkcik7IC8vcmRtYSBzdGFydCBhZGRyZXNzCisJV1JJVEVfVlJFRyhIRVZDX1JETUFfRl9FTkRfQUREUiwgICBkZHJfcGh5X2FkZHIgKyAweGZmKTsgLy9yZG1hIGVuZCBhZGRyZXNzCisJV1JJVEVfVlJFRyhIRVZDX1JETUFfRl9TVEFUVVMwLCAgICAwWDEpOyAvL3RyaWdnZXIgcmRtYSBzdGFydCB0byB3b3JrCisKKwlleHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjAwMCk7CisJd2hpbGUgKDEpIHsKKwkJaWYgKChSRUFEX1ZSRUcoSEVWQ19SRE1BX0ZfU1RBVFVTMCkgJiAweDEpID09IDApIHsKKwkJCS8vcHJfaW5mbygicmRtYSBmcm9udF9lbmQgZG9uZVxuIik7CisJCQlicmVhazsKKwkJfQorCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBleHBpcmVzKSkgeworCQkJcHJfaW5mbygid2FpdCByZG1hIGRvbmUgdGltZW91dFxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChyZG1hX21vZGUgJiAweDIpCisJCWNoZWNrX3JkbWFfcmVzdWx0KFNDQUxFTFVUX0RBVEFfV1JJVEVfTlVNKTsKKworCXJldHVybjsKK30KK0VYUE9SVF9TWU1CT0wocmRtYV9mcm9udF9lbmRfd3Jvayk7CisKK3ZvaWQgcmRtYV9iYWNrX2VuZF93b3JrKGRtYV9hZGRyX3QgYmFja19kZHJfcGh5X2FkZHIsIHUzMiBzaXplKQoreworCXVsb25nIGV4cGlyZXM7CisKKwlXUklURV9WUkVHKEhFVkNfUkRNQV9CX0NUUkwsCisJCSgwWDAgPDwgNykgfCAvL2F4aSBpZAorCQkoMFg3IDw8IDMpIHwgLy9heGkgbGVuZ3RoCisJCSgwWDAgPDwgMikgfCAvL3JkbWEgZm9yY2UgY2cgZW4KKwkJKDBYMSA8PCAxKSk7IC8vcmRtYSBwYXRoIGVuCisJV1JJVEVfVlJFRyhIRVZDX1JETUFfQl9TVEFSVF9BRERSLCBiYWNrX2Rkcl9waHlfYWRkcik7IC8vcmRtYSBzdGFydCBhZGRyZXNzCisJV1JJVEVfVlJFRyhIRVZDX1JETUFfQl9FTkRfQUREUiwgICBiYWNrX2Rkcl9waHlfYWRkciArIHNpemUgLTEpOyAvL3JkbWEgZW5kIGFkZHJlc3MKKwlXUklURV9WUkVHKEhFVkNfUkRNQV9CX1NUQVRVUzAsICAgIDBYMSk7IC8vdHJpZ2dlciByZG1hIHN0YXJ0IHRvIHdvcmsKKworCWV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMDAwKTsKKwl3aGlsZSAoMSkgeworCQlpZiAoKFJFQURfVlJFRyhIRVZDX1JETUFfQl9TVEFUVVMwKSAmIDB4MSkgPT0gMCkgeworCQkJLy9wcl9pbmZvKCJyZG1hIGJhY2tfZW5kIGRvbmVcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZXhwaXJlcykpIHsKKwkJCXByX2luZm8oIndhaXQgcmRtYSBkb25lIHRpbWVvdXRcbiIpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHJkbWFfbW9kZSAmIDB4MikKKwkJY2hlY2tfcmRtYV9yZXN1bHQoU0NBTEVMVVRfREFUQV9XUklURV9OVU0pOworCisJcmV0dXJuOworfQorRVhQT1JUX1NZTUJPTChyZG1hX2JhY2tfZW5kX3dvcmspOworCitSRVNFUlZFRE1FTV9PRl9ERUNMQVJFKHZkZWMsICJhbWxvZ2ljLCB2ZGVjLW1lbW9yeSIsIHZkZWNfbWVtX3NldHVwKTsKKy8qCit1aW50IGZvcmNlX2hldmNfY2xvY2tfY250bDsKK0VYUE9SVF9TWU1CT0woZm9yY2VfaGV2Y19jbG9ja19jbnRsKTsKKworbW9kdWxlX3BhcmFtKGZvcmNlX2hldmNfY2xvY2tfY250bCwgdWludCwgMDY2NCk7CisqLworbW9kdWxlX3BhcmFtKGRlYnVnLCB1aW50LCAwNjY0KTsKK21vZHVsZV9wYXJhbShkZWJ1Z190cmFjZV9udW0sIHVpbnQsIDA2NjQpOworbW9kdWxlX3BhcmFtKGhldmNfbWF4X3Jlc2V0X2NvdW50LCBpbnQsIDA2NjQpOworbW9kdWxlX3BhcmFtKGNsa19jb25maWcsIHVpbnQsIDA2NjQpOworbW9kdWxlX3BhcmFtKHN0ZXBfbW9kZSwgaW50LCAwNjY0KTsKK21vZHVsZV9wYXJhbShkZWJ1Z2ZsYWdzLCBpbnQsIDA2NjQpOworbW9kdWxlX3BhcmFtKHBhcmFsbGVsX2RlY29kZSwgaW50LCAwNjY0KTsKK21vZHVsZV9wYXJhbShmcHNfZGV0ZWN0aW9uLCBpbnQsIDA2NjQpOworbW9kdWxlX3BhcmFtKGZwc19jbGVhciwgaW50LCAwNjY0KTsKK21vZHVsZV9wYXJhbShmb3JjZV9ub3NlY3VyZV9ldmVuX2RybSwgaW50LCAwNjY0KTsKK21vZHVsZV9wYXJhbShkaXNhYmxlX3N3aXRjaF9zaW5nbGVfdG9fbXVsdCwgaW50LCAwNjY0KTsKKworbW9kdWxlX3BhcmFtKGRlYnVnX21ldGEsIHVpbnQsIDA2NjQpOworCittb2R1bGVfcGFyYW0oZnJhbWVpbmZvX2ZsYWcsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZyYW1laW5mb19mbGFnLAorCQkJCSJcbiBmcmFtZWluZm9fZmxhZ1xuIik7Cittb2R1bGVfcGFyYW0odjRsdmlkZW9fYWRkX2RpLCBpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh2NGx2aWRlb19hZGRfZGksCisJCQkJIlxuIHY0bHZpZGVvX2FkZF9kaVxuIik7CisKK21vZHVsZV9wYXJhbSh2NGx2aWRlb19hZGRfcHBtZ3IsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHY0bHZpZGVvX2FkZF9wcG1nciwKKwkJCQkiXG4gdjRsdmlkZW9fYWRkX3BwbWdyXG4iKTsKKworbW9kdWxlX3BhcmFtKG1heF9kaV9pbnN0YW5jZSwgaW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2RpX2luc3RhbmNlLAorCQkJCSJcbiBtYXhfZGlfaW5zdGFuY2VcbiIpOworCittb2R1bGVfcGFyYW0obWF4X3N1cHBvcnRlZF9kaV9pbnN0YW5jZSwgaW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X3N1cHBvcnRlZF9kaV9pbnN0YW5jZSwKKwkJCQkiXG4gbWF4X3N1cHBvcnRlZF9kaV9pbnN0YW5jZVxuIik7Cittb2R1bGVfcGFyYW0oZGVidWdfdmRldGVjdCwgaW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWdfdmRldGVjdCwgIlxuIGRlYnVnX3ZkZXRlY3RcbiIpOworCittb2R1bGVfcGFyYW0oZW5hYmxlX3N0cmVhbV9tb2RlX211bHRpX2RlYywgaW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlX3N0cmVhbV9tb2RlX211bHRpX2RlYywKKwkiXG4gZW5hYmxlIG11bHRpLWRlY29kaW5nIG9uIHN0cmVhbSBtb2RlLiBcbiIpOworCittb2R1bGVfcGFyYW0ocmRtYV9tb2RlLCBpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhyZG1hX21vZGUsICJcbiByZG1hX2VuYWJsZVxuIik7CisKKy8qCisqbW9kdWxlX2luaXQodmRlY19tb2R1bGVfaW5pdCk7CisqbW9kdWxlX2V4aXQodmRlY19tb2R1bGVfZXhpdCk7CisqLworI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCisjaW5jbHVkZSAidmRlY190cmFjZS5oIgorTU9EVUxFX0RFU0NSSVBUSU9OKCJBTUxPR0lDIHZkZWMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJUaW0gWWFvIDx0aW15YW9AYW1sb2dpYy5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdmRlYy5oIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTBiZGI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWMuaApAQCAtMCwwICsxLDY5NyBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9tZWRpYS9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWMuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIFZERUNfSAorI2RlZmluZSBWREVDX0gKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL2FtcG9ydHNfY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFyZXR1cm4uaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL2Ftc3RyZWFtLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3Byb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3JlY2VpdmVyLmg+CisjZGVmaW5lIEtFUk5FTF9BVFJBQ0VfVEFHIEtFUk5FTF9BVFJBQ0VfVEFHX1ZERUMKKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvbWVzb25fYXRyYWNlLmg+CisvKiNkZWZpbmUgQ09ORklHX0FNX1ZERUNfRFYqLworI2luY2x1ZGUgIi4uLy4uLy4uL3N0cmVhbV9pbnB1dC9hbXBvcnRzL3N0cmVhbWJ1Zi5oIgorI2luY2x1ZGUgIi4uLy4uLy4uL3N0cmVhbV9pbnB1dC9hbXBvcnRzL3N0cmVhbV9idWZmZXJfYmFzZS5oIgorCisjaW5jbHVkZSAidmRlY19pbnB1dC5oIgorI2luY2x1ZGUgImZyYW1lX2NoZWNrLmgiCisjaW5jbHVkZSAidmRlY19zeW5jLmgiCisjaW5jbHVkZSAidmRlY19jYW52YXNfdXRpbHMuaCIKKworczMyIHZkZWNfZGV2X3JlZ2lzdGVyKHZvaWQpOworczMyIHZkZWNfZGV2X3VucmVnaXN0ZXIodm9pZCk7CisKK2ludCB2ZGVjX3NvdXJjZV9jaGFuZ2VkKGludCBmb3JtYXQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZwcyk7CitpbnQgdmRlYzJfc291cmNlX2NoYW5nZWQoaW50IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZnBzKTsKK2ludCBoZXZjX3NvdXJjZV9jaGFuZ2VkKGludCBmb3JtYXQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZwcyk7CitzdHJ1Y3QgZGV2aWNlICpnZXRfdmRlY19kZXZpY2Uodm9pZCk7CitpbnQgdmRlY19tb2R1bGVfaW5pdCh2b2lkKTsKK3ZvaWQgdmRlY19tb2R1bGVfZXhpdCh2b2lkKTsKKworI2RlZmluZSBNQVhfSU5TVEFOQ0VfTVVOICA5CisKKyNkZWZpbmUgVkRFQ19ERUJVR19TVVBQT1JUCisKKyNkZWZpbmUgREVDX0ZMQUdfSEVWQ19XT1JLQVJPVU5EIDB4MDEKKworI2RlZmluZSBWREVDX0ZJRk9fQUxJR04gOAorCitlbnVtIHZkZWNfdHlwZV9lIHsKKwlWREVDXzEgPSAwLAorCVZERUNfSENPREVDLAorCVZERUNfMiwKKwlWREVDX0hFVkMsCisJVkRFQ19IRVZDQiwKKwlWREVDX1dBVkUsCisJVkRFQ19NQVgKK307CisKK3N0cnVjdCB0cmFjZV9kZWNvZGVyX25hbWUgeworCWNoYXIgc2V0X2NhbnZhczBfYWRkclszMl07CisJY2hhciBnZXRfY2FudmFzMF9hZGRyWzMyXTsKKwljaGFyIHB1dF9jYW52YXMwX2FkZHJbMzJdOworCWNoYXIgdmZfcHV0X25hbWVbMzJdOworCWNoYXIgdmZfZ2V0X25hbWVbMzJdOworCWNoYXIgdmRlY19uYW1lWzMyXTsKKwljaGFyIHB0c19uYW1lWzMyXTsKKwljaGFyIG5ld19xX25hbWVbMzJdOworCWNoYXIgZGlzcF9xX25hbWVbMzJdOworCWNoYXIgZGVjb2RlX3RpbWVfbmFtZVszMl07CisJY2hhciBkZWNvZGVfcnVuX3RpbWVfbmFtZVszMl07CisJY2hhciBkZWNvZGVfaGVhZGVyX3RpbWVfbmFtZVszMl07CisJY2hhciBkZWNvZGVfd29ya190aW1lX25hbWVbMzJdOworCWNoYXIgZGVjb2RlX2hlYWRlcl9tZW1vcnlfdGltZV9uYW1lWzMyXTsKK307CisKKworZW51bSBlX3RyYWNlX2RlY29kZXJfc3RhdHVzIHsKKwlERUNPREVSX1JVTl9TVEFSVCA9IDEsCisJREVDT0RFUl9SVU5fRU5EICAgPSAyLAorCURFQ09ERVJfSVNSX0hFQURfRE9ORSA9IDMsCisJREVDT0RFUl9JU1JfUElDX0RPTkUgPSA0LAorCURFQ09ERVJfSVNSX0VORCAgID0gNSwKKwlERUNPREVSX0lTUl9USFJFQURfSEVBRF9TVEFSVCA9IDYsCisJREVDT0RFUl9JU1JfVEhSRUFEX1BJQ19ET05FX1NUQVJUID0gNywKKwlERUNPREVSX0lTUl9USFJFQURfRUROID0gOCwKKwlERUNPREVSX1dPUktFUl9TVEFSVCAgID0gOSwKKwlERUNPREVSX1dPUktFUl9FTkQgPSAxMCwKKwlERUNPREVSX1dPUktFUl9BR0FJTiA9IDExLAorCURFQ09ERVJfSVNSX1NFSV9ET05FID0gMTIsCisJREVDT0RFUl9JU1JfVEhSRUFEX1NFSV9TVEFSVCA9IDEzLAorCURFQ09ERVJfSVNSX0FVWF9ET05FID0gMTQsCisJREVDT0RFUl9JU1JfVEhSRUFEX0FVWF9TVEFSVCA9IDE1LAorCURFQ09ERVJfSVNSX1RIUkVBRF9IRUFEX0VORCA9IDE2LAorfTsKKworZW51bSBlX3RyYWNlX3J1bl9zdGF0dXMgeworCVRSQUNFX1JVTl9MT0FESU5HX0ZXX1NUQVJUID0gMSwKKwlUUkFDRV9SVU5fTE9BRElOR19GV19FTkQgICA9IDIsCisJVFJBQ0VfUlVOX0xPQURJTkdfUkVTVE9SRV9TVEFSVCA9IDMsCisJVFJBQ0VfUlVOX0xPQURJTkdfUkVTVE9SRV9FTkQgPSA0LAorfTsKKworZW51bSBlX3RyYWNlX2hlYWRlcl9zdGF0dXMgeworCVRSQUNFX0hFQURFUl9NRU1PUllfU1RBUlQgPSAxLAorCVRSQUNFX0hFQURFUl9NRU1PUllfRU5EICAgPSAyLAorCVRSQUNFX0hFQURFUl9SRUdJU1RFUl9TVEFSVCA9IDMsCisJVFJBQ0VfSEVBREVSX1JFR0lTVEVSX0VORCAgID0gNCwKKwlUUkFDRV9IRUFERVJfUlBNX1NUQVJUID0gNSwKKwlUUkFDRV9IRUFERVJfUlBNX0VORCAgID0gNiwKK307CisKK2VudW0gZV90cmFjZV93b3JrX3N0YXR1cyB7CisJVFJBQ0VfV09SS19XQUlUX1NFQVJDSF9ET05FX1NUQVJUID0gMSwKKwlUUkFDRV9XT1JLX1dBSVRfU0VBUkNIX0RPTkVfRU5EICAgPSAyLAorfTsKKworCisjZGVmaW5lIFZERUNfQ0ZHX0ZMQUdfRFZfVFdPTEFSWUVSICgxIDw8IDApCisjZGVmaW5lIFZERUNfQ0ZHX0ZMQUdfRFZfTkVHQVRJVkUgICgxIDw8IDEpCisjZGVmaW5lIFZERUNfQ0ZHX0ZMQUdfRElTX0VSUl9QT0xJQ1kgKDEgPDwgMTEpCisKKyNkZWZpbmUgVkRFQ19DRkdfRkxBR19QUk9HX09OTFkgKDEgPDwgMTYpCisKKyNkZWZpbmUgVVZNX01FVEFfREFUQV9WRl9CQVNFX0lORk9TICgxIDw8IDApCisjZGVmaW5lIFVWTV9NRVRBX0RBVEFfSERSMTBQX0RBVEEgKDEgPDwgMSkKKworI2RlZmluZSBDT1JFX01BU0tfVkRFQ18xICgxIDw8IFZERUNfMSkKKyNkZWZpbmUgQ09SRV9NQVNLX0hDT0RFQyAoMSA8PCBWREVDX0hDT0RFQykKKyNkZWZpbmUgQ09SRV9NQVNLX1ZERUNfMiAoMSA8PCBWREVDXzIpCisjZGVmaW5lIENPUkVfTUFTS19IRVZDICgxIDw8IFZERUNfSEVWQykKKyNkZWZpbmUgQ09SRV9NQVNLX0hFVkNfRlJPTlQgKDEgPDwgVkRFQ19IRVZDKQorI2RlZmluZSBDT1JFX01BU0tfSEVWQ19CQUNLICgxIDw8IFZERUNfSEVWQ0IpCisjZGVmaW5lIENPUkVfTUFTS19DT01CSU5FICgxVUwgPDwgMzEpCisKKyNkZWZpbmUgTUVUQV9EQVRBX1NJWkUJKDI1NikKKworI2RlZmluZSBTRUlfVFlQRQkoMSkKKyNkZWZpbmUgRFZfVFlQRQkJKDIpCisKK2V4dGVybiB2b2lkIHZkZWMyX3Bvd2VyX21vZGUoaW50IGxldmVsKTsKK2V4dGVybiB2b2lkIHZkZWNfcG93ZXJvbihlbnVtIHZkZWNfdHlwZV9lIGNvcmUpOworZXh0ZXJuIHZvaWQgdmRlY19wb3dlcm9mZihlbnVtIHZkZWNfdHlwZV9lIGNvcmUpOworZXh0ZXJuIGJvb2wgdmRlY19vbihlbnVtIHZkZWNfdHlwZV9lIGNvcmUpOworZXh0ZXJuIHZvaWQgdmRlY19wb3dlcl9yZXNldCh2b2lkKTsKKworLyppcnEgbnVtIGFzIHNhbWUgYXMgLmR0cyovCisKKy8qCisgKglpbnRlcnJ1cHRzID0gPDAgMyAxCisgKgkJMCAyMyAxCisgKgkJMCAzMiAxCisgKgkJMCA0MyAxCisgKgkJMCA0NCAxCisgKgkJMCA0NSAxPjsKKyAqCWludGVycnVwdC1uYW1lcyA9ICJ2c3luYyIsCisgKgkJImRlbXV4IiwKKyAqCQkicGFyc2VyIiwKKyAqCQkibWFpbGJveF8wIiwKKyAqCQkibWFpbGJveF8xIiwKKyAqCQkibWFpbGJveF8yIjsKKyAqLworZW51bSB2ZGVjX2lycV9udW0geworCVZTWU5DX0lSUSA9IDAsCisJREVNVVhfSVJRLAorCVBBUlNFUl9JUlEsCisJVkRFQ19JUlFfMCwKKwlWREVDX0lSUV8xLAorCVZERUNfSVJRXzIsCisJVkRFQ19JUlFfSEVWQ19CQUNLLAorCVZERUNfSVJRX01BWCwKK307CisKK2VudW0gdmRlY19mcl9oaW50X3N0YXRlIHsKKwlWREVDX05PX05FRURfSElOVCA9IDAsCisJVkRFQ19ORUVEX0hJTlQsCisJVkRFQ19ISU5URUQsCit9OworZXh0ZXJuIHMzMiB2ZGVjX3JlcXVlc3RfdGhyZWFkZWRfaXJxKGVudW0gdmRlY19pcnFfbnVtIG51bSwKKwkJCWlycV9oYW5kbGVyX3QgaGFuZGxlciwKKwkJCWlycV9oYW5kbGVyX3QgdGhyZWFkX2ZuLAorCQkJdW5zaWduZWQgbG9uZyBpcnFmbGFncywKKwkJCWNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldik7CitleHRlcm4gczMyIHZkZWNfcmVxdWVzdF9pcnEoZW51bSB2ZGVjX2lycV9udW0gbnVtLCBpcnFfaGFuZGxlcl90IGhhbmRsZXIsCisJY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCAqZGV2KTsKK2V4dGVybiB2b2lkIHZkZWNfZnJlZV9pcnEoZW51bSB2ZGVjX2lycV9udW0gbnVtLCB2b2lkICpkZXYpOworCitleHRlcm4gdm9pZCBkbWFfY29udGlndW91c19lYXJseV9maXh1cChwaHlzX2FkZHJfdCBiYXNlLCB1bnNpZ25lZCBsb25nIHNpemUpOwordW5zaWduZWQgaW50IGdldF92ZGVjX2Nsa19jb25maWdfc2V0dGluZ3Modm9pZCk7Cit2b2lkIHVwZGF0ZV92ZGVjX2Nsa19jb25maWdfc2V0dGluZ3ModW5zaWduZWQgaW50IGNvbmZpZyk7CisvL3Vuc2lnbmVkIGludCBnZXRfbW11X21vZGUodm9pZCk7Ly9ERUJVR19UTVAKKy8vZXh0ZXJuIHZvaWQgdmRlY19maWxsX2ZyYW1lX2luZm8oc3RydWN0IHZmcmFtZV9xb3NfcyAqdmZyYW1lX3FvcywgaW50IGRlYnVnKTsKK2V4dGVybiB2b2lkIHZkZWNfZmlsbF92ZGVjX2ZyYW1lKHN0cnVjdCB2ZGVjX3MgKnZkZWMsCisJCQkJc3RydWN0IHZmcmFtZV9xb3NfcyAqdmZyYW1lX3FvcywKKwkJCQlzdHJ1Y3QgdmRlY19pbmZvICp2aW5mbywKKwkJCQlzdHJ1Y3QgdmZyYW1lX3MgKnZmLCB1MzIgaHdfZGVjX3RpbWUpOworCitleHRlcm4gdm9pZCB2ZGVjX3ZmcmFtZV9yZWFkeShzdHJ1Y3QgdmRlY19zICp2ZGVjLCBzdHJ1Y3QgdmZyYW1lX3MgKnZmKTsKK2V4dGVybiB2b2lkIHZkZWNfc2V0X3ZmcmFtZV9jb21tKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGNoYXIgKm4pOworCitzdHJ1Y3QgdmRlY19zOworZW51bSB2Zm9ybWF0X3Q7CisKKy8qIHN0cmVhbSBiYXNlZCB3aXRoIHNpbmdsZSBpbnN0YW5jZSBkZWNvZGVyIGRyaXZlciAqLworI2RlZmluZSBWREVDX1RZUEVfU0lOR0xFICAgICAgICAgICAwCisKKy8qIHN0cmVhbSBiYXNlZCB3aXRoIG11bHRpLWluc3RhbmNlIGRlY29kZXIgd2l0aCBIVyByZXNvdWNlIHNoYXJpbmcgKi8KKyNkZWZpbmUgVkRFQ19UWVBFX1NUUkVBTV9QQVJTRVIgICAgMQorCisvKiBmcmFtZSBiYXNlZCB3aXRoIG11bHRpLWluc3RhbmNlIGRlY29kZXIsIGlucHV0IGJsb2NrIGxpc3QgYmFzZWQgKi8KKyNkZWZpbmUgVkRFQ19UWVBFX0ZSQU1FX0JMT0NLICAgICAgMgorCisvKiBmcmFtZSBiYXNlZCB3aXRoIG11bHRpLWluc3RhbmNlIGRlY29kZXIsIHNpbmdsZSBjaXJjdWxhciBpbnB1dCBibG9jayAqLworI2RlZmluZSBWREVDX1RZUEVfRlJBTUVfQ0lSQ1VMQVIgICAzCisKKy8qIGRlY29kZXIgc3RhdHVzOiB1bmluaXRpYWxpemVkICovCisjZGVmaW5lIFZERUNfU1RBVFVTX1VOSU5JVElBTElaRUQgIDAKKworLyogZGVjb2RlciBzdGF0dXM6IGJlZm9yZSB0aGUgZGVjb2RlciBjYW4gc3RhcnQgY29uc3VtaW5nIGRhdGEgKi8KKyNkZWZpbmUgVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEICAgMQorCisvKiBkZWNvZGVyIHN0YXR1czogZGVjb2RlciBzaG91bGQgYmVjb21lIGRpc2Nvbm5lY3RlZCBvbmNlIGl0J3Mgbm90IGFjdGl2ZSAqLworI2RlZmluZSBWREVDX1NUQVRVU19DT05ORUNURUQgICAgICAyCisKKy8qIGRlY29kZXIgc3RhdHVzOiBkZWNvZGVyIG93bnMgSFcgcmVzb3VyY2UgYW5kIGlzIHJ1bm5pbmcgKi8KKyNkZWZpbmUgVkRFQ19TVEFUVVNfQUNUSVZFICAgICAgICAgMworCisjZGVmaW5lIFZERUNfUFJPVklERVJfTkFNRV9TSVpFIDE2CisjZGVmaW5lIFZERUNfUkVDRUlWRVJfTkFNRV9TSVpFIDE2CisjZGVmaW5lIFZERUNfTUFQX05BTUVfU0laRSAgICAgIDkwCisKKyNkZWZpbmUgVkRFQ19GTEFHX09USEVSX0lOUFVUX0NPTlRFWFQgMHgwCisjZGVmaW5lIFZERUNfRkxBR19TRUxGX0lOUFVUX0NPTlRFWFQgMHgwMQorCisjZGVmaW5lIFZERUNfTkVFRF9NT1JFX0RBVEFfUlVOICAgMHgwMQorI2RlZmluZSBWREVDX05FRURfTU9SRV9EQVRBX0RJUlRZIDB4MDIKKyNkZWZpbmUgVkRFQ19ORUVEX01PUkVfREFUQSAgICAgICAweDA0CisKKyNkZWZpbmUgU0NBTEVMVVRfREFUQV9XUklURV9OVU0gICAxMDI0CisjZGVmaW5lIFJETUFfU0laRSAgICAgICAgICAgICAgICAgKDEwMjQgKiA0ICogNCkKKworc3RydWN0IHZkZWNfcyB7CisJdTMyIG1hZ2ljOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1bnNpZ25lZCBsb25nIGNvcmVfbWFzazsKKwl1bnNpZ25lZCBsb25nIGFjdGl2ZV9tYXNrOworCXVuc2lnbmVkIGxvbmcgc2NoZWRfbWFzazsKKwlpbnQgaWQ7CisKKwlzdHJ1Y3QgdmRlY19zICptYXN0ZXI7CisJc3RydWN0IHZkZWNfcyAqc2xhdmU7CisJc3RydWN0IHN0cmVhbV9wb3J0X3MgKnBvcnQ7CisJc3RydWN0IHN0cmVhbV9idWZfcyB2YnVmOworCWludCBzdGF0dXM7CisJaW50IG5leHRfc3RhdHVzOworCWludCB0eXBlOworCWludCBwb3J0X2ZsYWc7CisJaW50IGZvcm1hdDsKKwl1MzIgcHRzOworCXU2NCBwdHM2NDsKKwlib29sIHB0c192YWxpZDsKKwl1NjQgdGltZXN0YW1wOworCWJvb2wgdGltZXN0YW1wX3ZhbGlkOworCWludCBmbGFnOworCWludCBzY2hlZDsKKwlpbnQgbmVlZF9tb3JlX2RhdGE7CisJdTMyIGNhbnZhc19tb2RlOwkvL2NhbnZhcyBibG9jayBtb2RlCisKKwlzdHJ1Y3QgY29tcGxldGlvbiBpbmFjdGl2ZV9kb25lOworCisJLyogY29uZmlnICh0ZW1wKSAqLworCXVuc2lnbmVkIGxvbmcgbWVtX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgbWVtX2VuZDsKKworCXZvaWQgKm1tX2Jsa19oYW5kbGU7CisKKwlzdHJ1Y3QgZGV2aWNlICpjbWFfZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZGVjX3N5c2luZm8gc3lzX2luZm9fc3RvcmU7CisJc3RydWN0IGRlY19zeXNpbmZvICpzeXNfaW5mbzsKKworCS8qIGlucHV0ICovCisJc3RydWN0IHZkZWNfaW5wdXRfcyBpbnB1dDsKKworCS8qZnJhbWUgY2hlY2sqLworCXN0cnVjdCBwaWNfY2hlY2tfbWdyX3QgdmZjOworCisJLyogbWMgY2FjaGUgKi8KKwl1MzIgbWNbNDA5NiAqIDRdOworCWJvb2wgbWNfbG9hZGVkOworCXUzMiBtY190eXBlOworCS8qIGZyYW1lIHByb3ZpZGVyL3JlY2VpdmVyIGludGVyZmFjZSAqLworCWNoYXIgdmZfcHJvdmlkZXJfbmFtZVtWREVDX1BST1ZJREVSX05BTUVfU0laRV07CisJc3RydWN0IHZmcmFtZV9wcm92aWRlcl9zIHZmcmFtZV9wcm92aWRlcjsKKwljaGFyICp2Zl9yZWNlaXZlcl9uYW1lOworCWNoYXIgdmZtX21hcF9pZFtWREVDX01BUF9OQU1FX1NJWkVdOworCWNoYXIgdmZtX21hcF9jaGFpbltWREVDX01BUF9OQU1FX1NJWkVdOworCWludCB2Zl9yZWNlaXZlcl9pbnN0OworCWVudW0gRlJBTUVfQkFTRV9WSURFT19QQVRIIGZyYW1lX2Jhc2VfdmlkZW9fcGF0aDsKKwllbnVtIHZkZWNfZnJfaGludF9zdGF0ZSBmcl9oaW50X3N0YXRlOworCWJvb2wgdXNlX3ZmbV9wYXRoOworCWNoYXIgY29uZmlnW1BBR0VfU0laRV07CisJaW50IGNvbmZpZ19sZW47CisJYm9vbCBpc19yZXNldDsKKwlib29sIGRvbGJ5X21ldGFfd2l0aF9lbDsKKworCS8qIGNhbnZhcyAqLworCWludCAoKmdldF9jYW52YXMpKHVuc2lnbmVkIGludCBpbmRleCwgdW5zaWduZWQgaW50IGJhc2UpOworCWludCAoKmdldF9jYW52YXNfZXgpKGludCB0eXBlLCBpbnQgaWQpOworCXZvaWQgKCpmcmVlX2NhbnZhc19leCkoaW50IGluZGV4LCBpbnQgaWQpOworCisJaW50ICgqZGVjX3N0YXR1cykoc3RydWN0IHZkZWNfcyAqdmRlYywgc3RydWN0IHZkZWNfaW5mbyAqdnN0YXR1cyk7CisJaW50ICgqc2V0X3RyaWNrbW9kZSkoc3RydWN0IHZkZWNfcyAqdmRlYywgdW5zaWduZWQgbG9uZyB0cmlja21vZGUpOworCWludCAoKnNldF9pc3Jlc2V0KShzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgaXNyZXNldCk7CisJdm9pZCAoKnZkZWNfZnBzX2RldGVjKShpbnQgaWQpOworCisJdW5zaWduZWQgbG9uZyAoKnJ1bl9yZWFkeSkoc3RydWN0IHZkZWNfcyAqdmRlYywgdW5zaWduZWQgbG9uZyBtYXNrKTsKKwl2b2lkICgqcnVuKShzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1bnNpZ25lZCBsb25nIG1hc2ssCisJCQl2b2lkICgqY2FsbGJhY2spKHN0cnVjdCB2ZGVjX3MgKiwgdm9pZCAqKSwgdm9pZCAqKTsKKwl2b2lkICgqcmVzZXQpKHN0cnVjdCB2ZGVjX3MgKnZkZWMpOworCXZvaWQgKCpkdW1wX3N0YXRlKShzdHJ1Y3QgdmRlY19zICp2ZGVjKTsKKwlpcnFyZXR1cm5fdCAoKmlycV9oYW5kbGVyKShzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgaXJxKTsKKwlpcnFyZXR1cm5fdCAoKnRocmVhZGVkX2lycV9oYW5kbGVyKShzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgaXJxKTsKKworCWludCAoKnVzZXJfZGF0YV9yZWFkKShzdHJ1Y3QgdmRlY19zICp2ZGVjLAorCQkJc3RydWN0IHVzZXJkYXRhX3BhcmFtX3QgKnB1c2VyZGF0YV9wYXJhKTsKKwl2b2lkICgqcmVzZXRfdXNlcmRhdGFfZmlmbykoc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGJJbml0KTsKKwl2b2lkICgqd2FrZXVwX3VzZXJkYXRhX3BvbGwpKHN0cnVjdCB2ZGVjX3MgKnZkZWMpOworCS8qIHByaXZhdGUgKi8KKwl2b2lkICpwcml2YXRlOyAgICAgICAvKiBkZWNvZGVyIHBlciBpbnN0YW5jZSBzcGVjaWZpYyBkYXRhICovCisjaWZkZWYgVkRFQ19ERUJVR19TVVBQT1JUCisJdTY0IHByb2ZpbGVfc3RhcnRfY2xrW1ZERUNfTUFYXTsKKwl1NjQgdG90YWxfY2xrW1ZERUNfTUFYXTsKKwl1MzIgY2hlY2tfY291bnRbVkRFQ19NQVhdOworCXUzMiBub3RfcnVuX3JlYWR5X2NvdW50W1ZERUNfTUFYXTsKKwl1MzIgaW5wdXRfdW5kZXJydW5fY291bnRbVkRFQ19NQVhdOworCXUzMiBydW5fY291bnRbVkRFQ19NQVhdOworCXU2NCBydW5fY2xrW1ZERUNfTUFYXTsKKwl1NjQgc3RhcnRfcnVuX2Nsa1tWREVDX01BWF07CisjZW5kaWYKKwl1NjQgaXJxX3RocmVhZF9jbnQ7CisJdTY0IGlycV9jbnQ7CisJaW50IHBhcmFsbGVsX2RlYzsKKwlzdHJ1Y3QgdmRlY19mcmFtZXNfcyAqbXZmcm07CisJc3RydWN0IHZkZWNfc3luYyAqc3luYzsKKworCS8qYXV4IGRhdGEgY2hlY2sqLworCXN0cnVjdCBhdXhfZGF0YV9jaGVja19tZ3JfdCBhZGM7CisKKwl1MzIgaGRyMTBwX2RhdGFfc2l6ZTsKKwljaGFyIGhkcjEwcF9kYXRhX2J1ZltQQUdFX1NJWkVdOworCWJvb2wgaGRyMTBwX2RhdGFfdmFsaWQ7CisJdTMyIHByb2ZpbGVfaWRjOworCXUzMiBsZXZlbF9pZGM7CisJYm9vbCBwcm9nX29ubHk7CisJYm9vbCBkaXNhYmxlX3ZmbTsKKwljaGFyIG5hbWVbMzJdOworCWNoYXIgZGVjX3NwZW5kX3RpbWVbMzJdOworCWNoYXIgZGVjX3NwZW5kX3RpbWVfYXZlWzMyXTsKKwl1MzIgZGlzY2FyZF9zdGFydF9kYXRhX2ZsYWc7CisJdTMyIHZpZGVvX2lkOworCWludCBpc192NGw7CisJYm9vbCBpc19zdHJlYW1fbW9kZV9kdl9tdWx0aTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBpZGxlX3dhaXQ7Cit9OworCisjZGVmaW5lIENPREVDX01PREUoYSwgYiwgYywgZClcCisJKCgodTgpKGEpIDw8IDI0KSB8ICgodTgpKGIpIDw8IDE2KSB8ICgodTgpKGMpIDw8IDgpIHwgKHU4KShkKSkKKworI2RlZmluZSBNRVRBX0RBVEFfTUFHSUMJCUNPREVDX01PREUoJ00nLCAnRScsICdUJywgJ0EnKQorI2RlZmluZSBBTUxfTUVUQV9IRUFEX05VTQk4CisjZGVmaW5lIEFNTF9NRVRBX0hFQURfU0laRQkoQU1MX01FVEFfSEVBRF9OVU0gKiBzaXplb2YodTMyKSkKKworCitzdHJ1Y3QgYW1sX21ldGFfaGVhZF9zIHsKKwl1MzIgbWFnaWM7CisJdTMyIHR5cGU7CisJdTMyIGRhdGFfc2l6ZTsKKwl1MzIgZGF0YVs1XTsKK307CisKK3N0cnVjdCBhbWxfdmZfYmFzZV9pbmZvX3MgeworCXUzMiB3aWR0aDsKKwl1MzIgaGVpZ2h0OworCXUzMiBkdXJhdGlvbjsKKwl1MzIgZnJhbWVfdHlwZTsKKwl1MzIgdHlwZTsKKwl1MzIgZGF0YVsxMl07Cit9OworCitzdHJ1Y3QgYW1sX21ldGFfaW5mb19zIHsKKwl1bmlvbiB7CisJCXN0cnVjdCBhbWxfbWV0YV9oZWFkX3MgaGVhZDsKKwkJdTMyIGJ1ZltBTUxfTUVUQV9IRUFEX05VTV07CisJfTsKKwl1OCBkYXRhWzBdOworfTsKKwordHlwZWRlZiBpbnQgKCpwb3N0X3Rhc2tfaGFuZGxlcikodm9pZCAqYXJncyk7CisKK3N0cnVjdCBwb3N0X3Rhc2tfbWdyX3MgeworCXN0cnVjdCBsaXN0X2hlYWQJdGFza19yZWN5Y2xlOworCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGFzazsKKwlzdHJ1Y3Qgc2VtYXBob3JlICAgICAgICBzZW07CisJc3RydWN0IG11dGV4CQltdXRleDsKKwlib29sIAkJCXJ1bm5pbmc7CisJdm9pZAkJCSpwcml2YXRlOworfTsKKworc3RydWN0IHZkZWNfcG9zdF90YXNrX3Bhcm1zX3MgeworCXN0cnVjdCBsaXN0X2hlYWQJcmVjeWNsZTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnRhc2s7CisJc3RydWN0IGNvbXBsZXRpb24JcGFyazsKKwlwb3N0X3Rhc2tfaGFuZGxlcglmdW5jOworCXZvaWQJCQkqcHJpdmF0ZTsKKwlpbnQJCQlzY2hlZHVsZWQ7Cit9OworCisjZGVmaW5lIE1BWF9VU0VSREFUQV9DSEFOTkVMX05VTSA5CisKK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJd2FpdF9xdWV1ZV9oZWFkX3QgdXNlcmRhdGFfd2FpdDsKKwl1MzIgdmlkZW9faWQ7CisJdTMyIHNldF9pZF9mbGFnOworCXUzMiByZWFkeV9mbGFnW01BWF9VU0VSREFUQV9DSEFOTkVMX05VTV07CisJaW50IHVzZWRbTUFYX1VTRVJEQVRBX0NIQU5ORUxfTlVNXTsKKwl1MzIgaWRbTUFYX1VTRVJEQVRBX0NIQU5ORUxfTlVNXTsKK30gc3RfdXNlcmRhdGE7CisKKy8qIGNvbW1vbiBkZWNvZGVyIHZmcmFtZSBwcm92aWRlciBuYW1lIHRvIHVzZSBkZWZhdWx0IHZmbSBwYXRoICovCisjZGVmaW5lIFZGTV9ERUNfUFJPVklERVJfTkFNRSAiZGVjb2RlciIKKyNkZWZpbmUgVkZNX0RFQ19EVkJMX1BST1ZJREVSX05BTUUgImR2YmxkZWMiCisjZGVmaW5lIFZGTV9ERUNfRFZFTF9QUk9WSURFUl9OQU1FICJkdmVsZGVjIgorCisjZGVmaW5lIFZGTV9ERUNfRFZCTF9QUk9WSURFUl9OQU1FMiAiZHZibGRlYzIiCisjZGVmaW5lIFZGTV9ERUNfRFZFTF9QUk9WSURFUl9OQU1FMiAiZHZlbGRlYzIiCisKKyNkZWZpbmUgaHdfdG9fdmRlYyhodykgKChzdHJ1Y3QgdmRlY19zICopIFwKKwkocGxhdGZvcm1fZ2V0X2RydmRhdGEoaHctPnBsYXRmb3JtX2RldikpKQorCisjZGVmaW5lIGNhbnZhc195KGNhbnZhcykgKChjYW52YXMpICYgMHhmZikKKyNkZWZpbmUgY2FudmFzX3UoY2FudmFzKSAoKChjYW52YXMpID4+IDgpICYgMHhmZikKKyNkZWZpbmUgY2FudmFzX3YoY2FudmFzKSAoKChjYW52YXMpID4+IDE2KSAmIDB4ZmYpCisjZGVmaW5lIGNhbnZhc195MihjYW52YXMpICgoKGNhbnZhcykgPj4gMTYpICYgMHhmZikKKyNkZWZpbmUgY2FudmFzX3UyKGNhbnZhcykgKCgoY2FudmFzKSA+PiAyNCkgJiAweGZmKQorCisjZGVmaW5lIHZkZWNfZnJhbWVfYmFzZWQodmRlYykgXAorCSgoKHZkZWMpLT50eXBlID09IFZERUNfVFlQRV9GUkFNRV9CTE9DSykgfHwgXAorCSAoKHZkZWMpLT50eXBlID09IFZERUNfVFlQRV9GUkFNRV9DSVJDVUxBUikpCisjZGVmaW5lIHZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpIFwKKwkoKCh2ZGVjKS0+dHlwZSA9PSBWREVDX1RZUEVfU1RSRUFNX1BBUlNFUikgfHwgXAorCSAoKHZkZWMpLT50eXBlID09IFZERUNfVFlQRV9TSU5HTEUpKQorI2RlZmluZSB2ZGVjX3NpbmdsZSh2ZGVjKSBcCisJKCh2ZGVjKS0+dHlwZSA9PSBWREVDX1RZUEVfU0lOR0xFKQorI2RlZmluZSB2ZGVjX2R1YWwodmRlYykgXAorCSgoKHZkZWMpLT5wb3J0LT50eXBlICYgUE9SVF9UWVBFX0RVQUxERUMpIHx8XAorCSAodmRlY19nZXRfZGVidWdfZmxhZ3MoKSAmIDB4MTAwKSkKKyNkZWZpbmUgdmRlY19zZWN1cmUodmRlYykgXAorCSgoKHZkZWMpLT5wb3J0X2ZsYWcgJiBQT1JUX0ZMQUdfRFJNKSkKKworI2RlZmluZSBQUl9JTklUKHMpCQkJCQlcCisJaW50IF9fbGVuID0gMCwgX19zaXplID0gczsJCQlcCisJdTggX19idWZbc10gPSB7MH0KKworI2RlZmluZSBQUl9GSUxMKGFyZ3MuLi4pCQkJCVwKKwlkbyB7CQkJCQkJXAorCQlpZiAoKF9fc2l6ZSAtIF9fbGVuKSA8PSAwKSBicmVhazsJXAorCQlfX2xlbiArPSBzbnByaW50ZihfX2J1ZiArIF9fbGVuLAlcCisJCV9fc2l6ZSAtIF9fbGVuLCAjI2FyZ3MpOwkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgUFJfSU5GTyhpZCkJCQkJCVwKKwlkbyB7CQkJCQkJXAorCQlpZiAoX19sZW4gPT0gMCkgYnJlYWs7CQkJXAorCQlwcl9pbmZvKCJbJWRdICVzXG4iLCBpZCwgX19idWYpOwlcCisJCV9fbGVuID0gMDsJCQkJXAorCX0gd2hpbGUgKDApCisKKy8qIGNvbnN0cnVjdCB2ZGVjIHN0cmN0dXJlICovCitleHRlcm4gc3RydWN0IHZkZWNfcyAqdmRlY19jcmVhdGUoc3RydWN0IHN0cmVhbV9wb3J0X3MgKnBvcnQsCisJCQkJc3RydWN0IHZkZWNfcyAqbWFzdGVyKTsKKworLyogc2V0IHZpZGVvIGZvcm1hdCAqLworZXh0ZXJuIGludCB2ZGVjX3NldF9mb3JtYXQoc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGZvcm1hdCk7CisKKy8qIHNldCBQVFMgKi8KK2V4dGVybiBpbnQgdmRlY19zZXRfcHRzKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHUzMiBwdHMpOworCitleHRlcm4gaW50IHZkZWNfc2V0X3B0czY0KHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHU2NCBwdHM2NCk7CisKKy8qIHNldCB2Zm0gbWFwIHdoZW4gdXNlIGZyYW1lIGJhc2UgZGVjb2RlciAqLworZXh0ZXJuIGludCB2ZGVjX3NldF92aWRlb19wYXRoKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCB2aWRlb19wYXRoKTsKKworLyogc2V0IHJlY2VpdmUgaWQgd2hlbiByZWNlaXZlIGlzIGlvbnZpZGVvIG9yIGFtbHZpZGVvICovCitleHRlcm4gaW50IHZkZWNfc2V0X3JlY2VpdmVfaWQoc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IHJlY2VpdmVfaWQpOworCisvKiBhZGQgZnJhbWUgZGF0YSB0byBpbnB1dCBjaGFpbiAqLworZXh0ZXJuIGludCB2ZGVjX3dyaXRlX3ZmcmFtZShzdHJ1Y3QgdmRlY19zICp2ZGVjLCBjb25zdCBjaGFyICpidWYsCisJCQkJc2l6ZV90IGNvdW50KTsKKworZXh0ZXJuIGludCB2ZGVjX3dyaXRlX3ZmcmFtZV93aXRoX2RtYShzdHJ1Y3QgdmRlY19zICp2ZGVjLAorCXVsb25nIGFkZHIsIHNpemVfdCBjb3VudCwgdTMyIGhhbmRsZSwgY2h1bmtfZnJlZSBmcmVlLCB2b2lkKiBwcml2KTsKKworLyogbWFyayB0aGUgdmZyYW1lX2NodW5rIGFzIGNvbnN1bWVkICovCitleHRlcm4gdm9pZCB2ZGVjX3ZmcmFtZV9kaXJ0eShzdHJ1Y3QgdmRlY19zICp2ZGVjLAorCQkJCXN0cnVjdCB2ZnJhbWVfY2h1bmtfcyAqY2h1bmspOworCisvKiBwcmVwYXJlIGRlY29kZXIgaW5wdXQgKi8KK2V4dGVybiBpbnQgdmRlY19wcmVwYXJlX2lucHV0KHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHN0cnVjdCB2ZnJhbWVfY2h1bmtfcyAqKnApOworCitleHRlcm4gdTMyIHZkZWNfb2Zmc2V0X3ByZXBhcmVfaW5wdXQoc3RydWN0IHZkZWNfcyAqdmRlYywgdTMyIGNvbnN1bWVfYnl0ZSwKKwl1MzIgZGF0YV9vZmZzZXQsIHUzMiBkYXRhX3NpemUpOworCisvKiBjbGVhbiBkZWNvZGVyIGlucHV0ICovCitleHRlcm4gdm9pZCB2ZGVjX2NsZWFuX2lucHV0KHN0cnVjdCB2ZGVjX3MgKnZkZWMpOworCisvKiBzeW5jIGRlY29kZXIgaW5wdXQgKi8KK2V4dGVybiBpbnQgdmRlY19zeW5jX2lucHV0KHN0cnVjdCB2ZGVjX3MgKnZkZWMpOworCisvKiBlbmFibGUgZGVjb2RlciBpbnB1dCAqLworZXh0ZXJuIHZvaWQgdmRlY19lbmFibGVfaW5wdXQoc3RydWN0IHZkZWNfcyAqdmRlYyk7CisKKy8qIHNldCBkZWNvZGVyIGlucHV0IHByZXBhcmUgbGV2ZWwgKi8KK2V4dGVybiB2b2lkIHZkZWNfc2V0X3ByZXBhcmVfbGV2ZWwoc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGxldmVsKTsKKworLyogc2V0IHZkZWMgaW5wdXQgKi8KK2V4dGVybiBpbnQgdmRlY19zZXRfaW5wdXRfYnVmZmVyKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHUzMiBzdGFydCwgdTMyIHNpemUpOworCisvKiBjaGVjayBpZiBkZWNvZGVyIGNhbiBnZXQgbW9yZSBpbnB1dCAqLworZXh0ZXJuIGJvb2wgdmRlY19oYXNfbW9yZV9pbnB1dChzdHJ1Y3QgdmRlY19zICp2ZGVjKTsKKworLyogYWxsb2NhdGUgaW5wdXQgY2hhaW4KKyAqIHJlZ2lzdGVyIHZkZWNfZGV2aWNlCisgKiBjcmVhdGUgb3V0cHV0LCB2Zm0gb3IgY3JlYXRlIGlvbnZpZGVvIG91dHB1dAorICogaW5zZXJ0IHZkZWMgdG8gdmRlY19tYW5hZ2VyIGZvciBzY2hlZHVsaW5nCisgKi8KK2V4dGVybiBpbnQgdmRlY19jb25uZWN0KHN0cnVjdCB2ZGVjX3MgKnZkZWMpOworCisvKiByZW1vdmUgdmRlYyBmcm9tIHZkZWNfbWFuYWdlciBzY2hlZHVsaW5nCisgKiByZWxlYXNlIGlucHV0IGNoYWluCisgKiBkaXNjb25uZWN0IHZpZGVvIG91dHB1dCBmcm9tIGlvbnZpZGVvCisgKi8KK2V4dGVybiBpbnQgdmRlY19kaXNjb25uZWN0KHN0cnVjdCB2ZGVjX3MgKnZkZWMpOworCisvKiByZWxlYXNlIHZkZWMgc3RydWN0dXJlICovCitleHRlcm4gaW50IHZkZWNfZGVzdHJveShzdHJ1Y3QgdmRlY19zICp2ZGVjKTsKKworLyogcmVzZXQgdmRlYyAqLworZXh0ZXJuIGludCB2ZGVjX3Jlc2V0KHN0cnVjdCB2ZGVjX3MgKnZkZWMpOworCitleHRlcm4gaW50IHZkZWNfdjRsMl9yZXNldChzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgZmxhZyk7CitleHRlcm4gdm9pZCB2ZGVjX3NldF9zdGF0dXMoc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IHN0YXR1cyk7CisKK2V4dGVybiB2b2lkIHZkZWNfc2V0X25leHRfc3RhdHVzKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBzdGF0dXMpOworCitleHRlcm4gaW50IHZkZWNfc2V0X2RlY2luZm8oc3RydWN0IHZkZWNfcyAqdmRlYywgc3RydWN0IGRlY19zeXNpbmZvICpwKTsKKworZXh0ZXJuIGludCB2ZGVjX2luaXQoc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGlzXzRrLCBib29sIGlzX3Y0bCk7CisKK2V4dGVybiB2b2lkIHZkZWNfcmVsZWFzZShzdHJ1Y3QgdmRlY19zICp2ZGVjKTsKKworZXh0ZXJuIGludCB2ZGVjX3N0YXR1cyhzdHJ1Y3QgdmRlY19zICp2ZGVjLCBzdHJ1Y3QgdmRlY19pbmZvICp2c3RhdHVzKTsKKworZXh0ZXJuIGludCB2ZGVjX3NldF90cmlja21vZGUoc3RydWN0IHZkZWNfcyAqdmRlYywgdW5zaWduZWQgbG9uZyB0cmlja21vZGUpOworCitleHRlcm4gaW50IHZkZWNfc2V0X2lzcmVzZXQoc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGlzcmVzZXQpOworCitleHRlcm4gaW50IHZkZWNfc2V0X2R2X21ldGF3aXRoZWwoc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGlzZHZtZXRhd2l0aGVsKTsKKworZXh0ZXJuIHZvaWQgdmRlY19zZXRfbm9fcG93ZXJkb3duKGludCBmbGFnKTsKKworZXh0ZXJuIGludCB2ZGVjX2lzX3N1cHBvcnRfNGsodm9pZCk7CitleHRlcm4gdm9pZCB2ZGVjX3NldF9mbGFnKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHUzMiBmbGFnKTsKKworZXh0ZXJuIHZvaWQgdmRlY19zZXRfZW9zKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGJvb2wgZW9zKTsKKworZXh0ZXJuIHZvaWQgdmRlY19zZXRfbmV4dF9zY2hlZChzdHJ1Y3QgdmRlY19zICp2ZGVjLCBzdHJ1Y3QgdmRlY19zICpuZXh0X3ZkZWMpOworCitleHRlcm4gY29uc3QgY2hhciAqdmRlY19zdGF0dXNfc3RyKHN0cnVjdCB2ZGVjX3MgKnZkZWMpOworCitleHRlcm4gY29uc3QgY2hhciAqdmRlY190eXBlX3N0cihzdHJ1Y3QgdmRlY19zICp2ZGVjKTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKnZkZWNfZGV2aWNlX25hbWVfc3RyKHN0cnVjdCB2ZGVjX3MgKnZkZWMpOworCitleHRlcm4gdm9pZCB2ZGVjX3NjaGVkdWxlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKworZXh0ZXJuIHZvaWQgIHZkZWNfY291bnRfaW5mbyhzdHJ1Y3QgdmRlY19pbmZvICp2cywgdW5zaWduZWQgaW50IGVyciwKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0KTsKKworZXh0ZXJuIGJvb2wgdmRlY19uZWVkX21vcmVfZGF0YShzdHJ1Y3QgdmRlY19zICp2ZGVjKTsKKworZXh0ZXJuIHZvaWQgdmRlY19yZXNldF9jb3JlKHN0cnVjdCB2ZGVjX3MgKnZkZWMpOworCitleHRlcm4gdm9pZCBoZXZjX3Jlc2V0X2NvcmUoc3RydWN0IHZkZWNfcyAqdmRlYyk7CisKK2V4dGVybiB2b2lkIHZkZWNfc2V0X3N1c3BlbmRfY2xrKGludCBtb2RlLCBpbnQgaGV2Yyk7CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIHZkZWNfcmVhZHlfdG9fcnVuKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHVuc2lnbmVkIGxvbmcgbWFzayk7CisKK2V4dGVybiB2b2lkIHZkZWNfcHJlcGFyZV9ydW4oc3RydWN0IHZkZWNfcyAqdmRlYywgdW5zaWduZWQgbG9uZyBtYXNrKTsKKworZXh0ZXJuIHZvaWQgdmRlY19jb3JlX3JlcXVlc3Qoc3RydWN0IHZkZWNfcyAqdmRlYywgdW5zaWduZWQgbG9uZyBtYXNrKTsKKworZXh0ZXJuIGludCB2ZGVjX2NvcmVfcmVsZWFzZShzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1bnNpZ25lZCBsb25nIG1hc2spOworCitleHRlcm4gYm9vbCB2ZGVjX2NvcmVfd2l0aF9pbnB1dCh1bnNpZ25lZCBsb25nIG1hc2spOworCitleHRlcm4gdm9pZCB2ZGVjX2NvcmVfZmluaXNoX3J1bihzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1bnNpZ25lZCBsb25nIG1hc2spOworCisjaWZkZWYgVkRFQ19ERUJVR19TVVBQT1JUCitleHRlcm4gdm9pZCB2ZGVjX3NldF9zdGVwX21vZGUodm9pZCk7CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgaGV2Y19tbXVfZG1hX2NoZWNrKHN0cnVjdCB2ZGVjX3MgKnZkZWMpOworCitpbnQgdmRlY19yZWFkX3VzZXJfZGF0YShzdHJ1Y3QgdmRlY19zICp2ZGVjLAorCQkJCXN0cnVjdCB1c2VyZGF0YV9wYXJhbV90ICpwX3VzZXJkYXRhX3BhcmFtKTsKKworaW50IHZkZWNfd2FrZXVwX3VzZXJkYXRhX3BvbGwoc3RydWN0IHZkZWNfcyAqdmRlYyk7CisKK3ZvaWQgdmRlY19yZXNldF91c2VyZGF0YV9maWZvKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBiSW5pdCk7CisKK3N0cnVjdCB2ZGVjX3MgKnZkZWNfZ2V0X3ZkZWNfYnlfdmlkZW9faWQoaW50IHZpZGVvX2lkKTsKK3N0cnVjdCB2ZGVjX3MgKnZkZWNfZ2V0X3ZkZWNfYnlfaWQoaW50IHZkZWNfaWQpOworCisKKyNpZmRlZiBWREVDX0RFQlVHX1NVUFBPUlQKK2V4dGVybiB2b2lkIHZkZWNfc2V0X3N0ZXBfbW9kZSh2b2lkKTsKKyNlbmRpZgoraW50IHZkZWNfZ2V0X2RlYnVnX2ZsYWdzKHZvaWQpOworCit2b2lkIFZERUNfUFJJTlRfRlVOX0xJTkVOTyhjb25zdCBjaGFyICpmdW4sIGludCBsaW5lKTsKKwordW5zaWduZWQgY2hhciBpc19tdWx0X2luYyh1bnNpZ25lZCBpbnQpOworCitpbnQgdmRlY19nZXRfc3RhdHVzKHN0cnVjdCB2ZGVjX3MgKnZkZWMpOworCit2b2lkIHZkZWNfc2V0X3RpbWVzdGFtcChzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1NjQgdGltZXN0YW1wKTsKK3ZvaWQgdmRlY19zZXRfbWV0YWRhdGEoc3RydWN0IHZkZWNfcyAqdmRlYywgdWxvbmcgbWV0YV9wdHIpOworCitleHRlcm4gdTMyICB2ZGVjX2dldF9mcmFtZV92ZGVjKHN0cnVjdCB2ZGVjX3MgKnZkZWMsICBzdHJ1Y3QgdmZyYW1lX2NvdW50ZXJfcyAqdG1wYnVmKTsKKworaW50IHZkZWNfZ2V0X2ZyYW1lX251bShzdHJ1Y3QgdmRlY19zICp2ZGVjKTsKKworaW50IHNob3dfc3RyZWFtX2J1ZmZlcl9zdGF0dXMoY2hhciAqYnVmLAorCWludCAoKmNhbGxiYWNrKSAoc3RydWN0IHN0cmVhbV9idWZfcyAqLCBjaGFyICopKTsKKworZXh0ZXJuIGludCBnZXRfZG91YmxlX3dyaXRlX3JhdGlvKGludCBkd19tb2RlKTsKKworYm9vbCBpc19zdXBwb3J0X25vX3BhcnNlcih2b2lkKTsKKworaW50IHZkZWNfcmVzb3VyY2VfY2hlY2tpbmcoc3RydWN0IHZkZWNfcyAqdmRlYyk7CisKK3ZvaWQgc2V0X21ldGFfZGF0YV90b192ZihzdHJ1Y3QgdmZyYW1lX3MgKnZmLCB1MzIgdHlwZSwgdm9pZCAqdjRsMl9jdHgpOworCit2b2lkIHZkZWNfc2V0X3Byb2ZpbGVfbGV2ZWwoc3RydWN0IHZkZWNfcyAqdmRlYywgdTMyIHByb2ZpbGVfaWRjLCB1MzIgbGV2ZWxfaWRjKTsKKworZXh0ZXJuIHZvaWQgdmRlY19zdHJlYW1fc2tpcF9kYXRhKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBza2lwX3NpemUpOwordm9pZCB2ZGVjX3NldF92bGRfd3Aoc3RydWN0IHZkZWNfcyAqdmRlYywgdTMyIHdwKTsKK3ZvaWQgdmRlY19jb25maWdfdmxkX3JlZyhzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1MzIgYWRkciwgdTMyIHNpemUpOworCitleHRlcm4gdTMyIHRpbWVzdGFtcF9hdnN5bmNfY291bnRlcl9nZXQodm9pZCk7CisKK3ZvaWQgdmRlY19jYW52YXNfdW5sb2NrKHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCit1bnNpZ25lZCBsb25nIHZkZWNfY2FudmFzX2xvY2sodm9pZCk7CisKK2ludCB2ZGVjX2dldF9jb3JlX25yKHZvaWQpOworCisKK2ludCB2ZGVjX3Bvc3RfdGFzayhwb3N0X3Rhc2tfaGFuZGxlciBmdW5jLCB2b2lkICphcmdzKTsKKwordm9pZCByZG1hX2Zyb250X2VuZF93cm9rKGRtYV9hZGRyX3QgZGRyX3BoeV9hZGRyLCB1MzIgc2l6ZSk7CisKK3ZvaWQgcmRtYV9iYWNrX2VuZF93b3JrKGRtYV9hZGRyX3QgYmFja19kZHJfcGh5X2FkZHIsIHUzMiBzaXplKTsKKworaW50IGlzX3JkbWFfZW5hYmxlKHZvaWQpOworCitzdF91c2VyZGF0YSAqZ2V0X3ZkZWNfdXNlcmRhdGFfY3R4KHZvaWQpOworCit2b2lkIHZkZWNfZnJhbWVfcmF0ZV91ZXZlbnQoaW50IGR1cik7CisKK3ZvaWQgdmRlY19zeW5jX2lycShlbnVtIHZkZWNfaXJxX251bSBudW0pOworCisKKyNlbmRpZgkJCQkvKiBWREVDX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjX2NhbnZhc191dGlscy5jIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWNfY2FudmFzX3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZmYzAwMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjX2NhbnZhc191dGlscy5jCkBAIC0wLDAgKzEsNDE1IEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL21lZGlhL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdmRlY19jYW52YXNfdXRpbHMuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSAidmRlY19jYW52YXNfdXRpbHMuaCIKKyNpbmNsdWRlICIuLi8uLi8uLi9jb21tb24vY2hpcHMvZGVjb2Rlcl9jcHVfdmVyX2luZm8uaCIKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NhbnZhcy9jYW52YXMuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL3ZkZWNfcmVnLmg+CisjaW5jbHVkZSAidmRlYy5oIgorCitzdGF0aWMgc3RydWN0IGNhbnZhc19zdGF0dXNfcyBjYW52YXNfc3RhdFtDQU5WQVNfTUFYX1NJWkVdOworc3RhdGljIHN0cnVjdCBjYW52YXNfc3RhdHVzX3MgbWRlY19jYXZfc3RhdFtNREVDX0NBVl9MVVRfTUFYXTsKK3N0YXRpYyBzdHJ1Y3QgY2FudmFzX2NvbmZpZ19zICptZGVjX2Nhdl9wb29sID0gTlVMTDsKKworZXh0ZXJuIHUzMiB2ZGVjX2dldF9kZWJ1Zyh2b2lkKTsKKworCitib29sIGlzX3N1cHBvcnRfdmRlY19jYW52YXModm9pZCkKK3sKKwkvKiB2ZGVjIGNhbnZhcyBub3RlOgorCSAqIDEuIGNhbnZhcyBwYXJhbXMgY29uZmlnIHRvIGRpc3BsYXksIGRvIG5vdCB1c2UKKwkgKiAgICB2Zi0+Y2FudmFzeEFkZHIsIHNob3VsZCB1c2UgdmYtPmNhbnZhc3hjb25maWdbXS4KKwkgKiAyLiB0aGUgZW5kaWFuIGNhbiBub3QgY29uZmlnIHdpdGggY2FudmFzLiBhbmQgaGV2YworCSAqICAgIGNvcmUgc2hvdWxkIG5vdCBjb25maWcgY2FudmFzLiBjb25maWcgZW5kaWFuIGluCisJICogICAgcHJvYmUgZnVuY3Rpb24gbGlrZSBoMjY1L3ZwOS9hdjEvYXZzMi4KKwkqLworCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNykgfHwKKwkJKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDMpIHx8CisJCShnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1VykpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KK0VYUE9SVF9TWU1CT0woaXNfc3VwcG9ydF92ZGVjX2NhbnZhcyk7CisKK3N0YXRpYyBpbnQgZ2V0X2NhbnZhcyh1bnNpZ25lZCBpbnQgaW5kZXgsIHVuc2lnbmVkIGludCBiYXNlKQoreworCWludCBzdGFydDsKKwlpbnQgY2FudmFzX2luZGV4ID0gaW5kZXggKiBiYXNlOworCWludCByZXQgPSAwOworCisJaWYgKChiYXNlID4gNCkgfHwgKGJhc2UgPT0gMCkpCisJCXJldHVybiAtMTsKKworCWlmICgoQU1WREVDX0NBTlZBU19TVEFSVF9JTkRFWCArIGNhbnZhc19pbmRleCArIGJhc2UgLSAxKQorCQk8PSBBTVZERUNfQ0FOVkFTX01BWDEpIHsKKwkJc3RhcnQgPSBBTVZERUNfQ0FOVkFTX1NUQVJUX0lOREVYICsgYmFzZSAqIGluZGV4OworCX0gZWxzZSB7CisJCWNhbnZhc19pbmRleCAtPSAoQU1WREVDX0NBTlZBU19NQVgxIC0KKwkJCUFNVkRFQ19DQU5WQVNfU1RBUlRfSU5ERVggKyAxKSAvIGJhc2UgKiBiYXNlOworCQlpZiAoY2FudmFzX2luZGV4IDw9IEFNVkRFQ19DQU5WQVNfTUFYMikKKwkJCXN0YXJ0ID0gY2FudmFzX2luZGV4IC8gYmFzZTsKKwkJZWxzZQorCQkJcmV0dXJuIC0xOworCX0KKworCWlmIChiYXNlID09IDEpIHsKKwkJcmV0ID0gc3RhcnQ7CisJfSBlbHNlIGlmIChiYXNlID09IDIpIHsKKwkJcmV0ID0gKChzdGFydCArIDEpIDw8IDE2KSB8ICgoc3RhcnQgKyAxKSA8PCA4KSB8IHN0YXJ0OworCX0gZWxzZSBpZiAoYmFzZSA9PSAzKSB7CisJCXJldCA9ICgoc3RhcnQgKyAyKSA8PCAxNikgfCAoKHN0YXJ0ICsgMSkgPDwgOCkgfCBzdGFydDsKKwl9IGVsc2UgaWYgKGJhc2UgPT0gNCkgeworCQlyZXQgPSAoKChzdGFydCArIDMpIDw8IDI0KSB8IChzdGFydCArIDIpIDw8IDE2KSB8CisJCQkoKHN0YXJ0ICsgMSkgPDwgOCkgfCBzdGFydDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdldF9jYW52YXNfZXgoaW50IHR5cGUsIGludCBpZCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZmxhZ3MgPSB2ZGVjX2NhbnZhc19sb2NrKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ0FOVkFTX01BWF9TSVpFOyBpKyspIHsKKwkJLyoweDEwLTB4MTUgaGFzIGJlZW4gdXNlZCBieSByZG1hKi8KKwkJaWYgKChpID49IDB4MTApICYmIChpIDw9IDB4MTUpKQorCQkJCWNvbnRpbnVlOworCQlpZiAoKGNhbnZhc19zdGF0W2ldLnR5cGUgPT0gdHlwZSkgJiYKKwkJCShjYW52YXNfc3RhdFtpXS5pZCAmICgxIDw8IGlkKSkgPT0gMCkgeworCQkJY2FudmFzX3N0YXRbaV0uY2FudmFzX3VzZWRfZmxhZysrOworCQkJY2FudmFzX3N0YXRbaV0uaWQgfD0gKDEgPDwgaWQpOworCQkJaWYgKHZkZWNfZ2V0X2RlYnVnKCkgJiA0KQorCQkJCXByX2RlYnVnKCJnZXQgdXNlZCBjYW52YXMgJWRcbiIsIGkpOworCQkJdmRlY19jYW52YXNfdW5sb2NrKGZsYWdzKTsKKwkJCWlmIChpIDwgQU1WREVDX0NBTlZBU19NQVgyICsgMSkKKwkJCQlyZXR1cm4gaTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gKGkgKyBBTVZERUNfQ0FOVkFTX1NUQVJUX0lOREVYIC0gQU1WREVDX0NBTlZBU19NQVgyIC0gMSk7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQ0FOVkFTX01BWF9TSVpFOyBpKyspIHsKKwkJLyoweDEwLTB4MTUgaGFzIGJlZW4gdXNlZCBieSByZG1hKi8KKwkJaWYgKChpID49IDB4MTApICYmIChpIDw9IDB4MTUpKQorCQkJCWNvbnRpbnVlOworCQlpZiAoY2FudmFzX3N0YXRbaV0udHlwZSA9PSAwKSB7CisJCQljYW52YXNfc3RhdFtpXS50eXBlID0gdHlwZTsKKwkJCWNhbnZhc19zdGF0W2ldLmNhbnZhc191c2VkX2ZsYWcgPSAxOworCQkJY2FudmFzX3N0YXRbaV0uaWQgPSAoMSA8PCBpZCk7CisJCQlpZiAodmRlY19nZXRfZGVidWcoKSAmIDQpIHsKKwkJCQlwcl9kZWJ1ZygiZ2V0IGNhbnZhcyAlZFxuIiwgaSk7CisJCQkJcHJfZGVidWcoImNhbnZhc191c2VkX2ZsYWcgJWRcbiIsCisJCQkJCWNhbnZhc19zdGF0W2ldLmNhbnZhc191c2VkX2ZsYWcpOworCQkJCXByX2RlYnVnKCJjYW52YXNfc3RhdFtpXS5pZCAlZFxuIiwKKwkJCQkJY2FudmFzX3N0YXRbaV0uaWQpOworCQkJfQorCQkJdmRlY19jYW52YXNfdW5sb2NrKGZsYWdzKTsKKwkJCWlmIChpIDwgQU1WREVDX0NBTlZBU19NQVgyICsgMSkKKwkJCQlyZXR1cm4gaTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gKGkgKyBBTVZERUNfQ0FOVkFTX1NUQVJUX0lOREVYIC0gQU1WREVDX0NBTlZBU19NQVgyIC0gMSk7CisJCX0KKwl9CisJdmRlY19jYW52YXNfdW5sb2NrKGZsYWdzKTsKKworCXByX2luZm8oImNhbm5vdCBnZXQgY2FudmFzXG4iKTsKKworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9jYW52YXNfZXgoaW50IGluZGV4LCBpbnQgaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgb2Zmc2V0OworCisJZmxhZ3MgPSB2ZGVjX2NhbnZhc19sb2NrKCk7CisJaWYgKGluZGV4ID49IDAgJiYKKwkJaW5kZXggPCBBTVZERUNfQ0FOVkFTX01BWDIgKyAxKQorCQlvZmZzZXQgPSBpbmRleDsKKwllbHNlIGlmICgoaW5kZXggPj0gQU1WREVDX0NBTlZBU19TVEFSVF9JTkRFWCkgJiYKKwkJKGluZGV4IDw9IEFNVkRFQ19DQU5WQVNfTUFYMSkpCisJCW9mZnNldCA9IGluZGV4ICsgQU1WREVDX0NBTlZBU19NQVgyICsgMSAtIEFNVkRFQ19DQU5WQVNfU1RBUlRfSU5ERVg7CisJZWxzZSB7CisJCXZkZWNfY2FudmFzX3VubG9jayhmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKGNhbnZhc19zdGF0W29mZnNldF0uY2FudmFzX3VzZWRfZmxhZyA+IDApICYmCisJCShjYW52YXNfc3RhdFtvZmZzZXRdLmlkICYgKDEgPDwgaWQpKSkgeworCQljYW52YXNfc3RhdFtvZmZzZXRdLmNhbnZhc191c2VkX2ZsYWctLTsKKwkJY2FudmFzX3N0YXRbb2Zmc2V0XS5pZCAmPSB+KDEgPDwgaWQpOworCQlpZiAoY2FudmFzX3N0YXRbb2Zmc2V0XS5jYW52YXNfdXNlZF9mbGFnID09IDApIHsKKwkJCWNhbnZhc19zdGF0W29mZnNldF0udHlwZSA9IDA7CisJCQljYW52YXNfc3RhdFtvZmZzZXRdLmlkID0gMDsKKwkJfQorCQlpZiAodmRlY19nZXRfZGVidWcoKSAmIDQpIHsKKwkJCXByX2RlYnVnKCJmcmVlIGluZGV4ICVkIHVzZWRfZmxhZyAlZCwgdHlwZSA9ICVkLCBpZCA9ICVkXG4iLAorCQkJCW9mZnNldCwKKwkJCQljYW52YXNfc3RhdFtvZmZzZXRdLmNhbnZhc191c2VkX2ZsYWcsCisJCQkJY2FudmFzX3N0YXRbb2Zmc2V0XS50eXBlLAorCQkJCWNhbnZhc19zdGF0W29mZnNldF0uaWQpOworCQl9CisJfQorCXZkZWNfY2FudmFzX3VubG9jayhmbGFncyk7CisKKwlyZXR1cm47Cit9CisKKworc3RhdGljIGludCBnZXRfaW50ZXJuYWxfY2F2X2x1dCh1bnNpZ25lZCBpbnQgaW5kZXgsIHVuc2lnbmVkIGludCBiYXNlKQoreworCWludCBzdGFydDsKKwlpbnQgY2FudmFzX2luZGV4ID0gaW5kZXggKiBiYXNlOworCWludCByZXQgPSAwOworCisJaWYgKChiYXNlID4gNCkgfHwgKGJhc2UgPT0gMCkpCisJCXJldHVybiAtMTsKKworCWlmIChjYW52YXNfaW5kZXggKyBiYXNlIC0gMSA8IE1ERUNfQ0FWX0xVVF9NQVgpCisJCXN0YXJ0ID0gY2FudmFzX2luZGV4OworCWVsc2UKKwkJcmV0dXJuIC0xOworCisJaWYgKGJhc2UgPT0gMSkgeworCQlyZXQgPSBzdGFydDsKKwl9IGVsc2UgaWYgKGJhc2UgPT0gMikgeworCQlyZXQgPSAoKHN0YXJ0ICsgMSkgPDwgMTYpIHwgKChzdGFydCArIDEpIDw8IDgpIHwgc3RhcnQ7CisJfSBlbHNlIGlmIChiYXNlID09IDMpIHsKKwkJcmV0ID0gKChzdGFydCArIDIpIDw8IDE2KSB8ICgoc3RhcnQgKyAxKSA8PCA4KSB8IHN0YXJ0OworCX0gZWxzZSBpZiAoYmFzZSA9PSA0KSB7CisJCXJldCA9ICgoKHN0YXJ0ICsgMykgPDwgMjQpIHwgKHN0YXJ0ICsgMikgPDwgMTYpIHwKKwkJCSgoc3RhcnQgKyAxKSA8PCA4KSB8IHN0YXJ0OworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2ludGVybmFsX2Nhdl9sdXRfZXgoaW50IHR5cGUsIGludCBpZCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZmxhZ3MgPSB2ZGVjX2NhbnZhc19sb2NrKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTURFQ19DQVZfTFVUX01BWDsgaSsrKSB7CisJCWlmICgobWRlY19jYXZfc3RhdFtpXS50eXBlID09IHR5cGUpICYmCisJCQkobWRlY19jYXZfc3RhdFtpXS5pZCAmICgxIDw8IGlkKSkgPT0gMCkgeworCQkJbWRlY19jYXZfc3RhdFtpXS5jYW52YXNfdXNlZF9mbGFnKys7CisJCQltZGVjX2Nhdl9zdGF0W2ldLmlkIHw9ICgxIDw8IGlkKTsKKwkJCWlmICh2ZGVjX2dldF9kZWJ1ZygpICYgNCkKKwkJCQlwcl9kZWJ1ZygiZ2V0IHVzZWQgY2F2IGx1dCAlZFxuIiwgaSk7CisJCQl2ZGVjX2NhbnZhc191bmxvY2soZmxhZ3MpOworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTURFQ19DQVZfTFVUX01BWDsgaSsrKSB7CisJCWlmIChtZGVjX2Nhdl9zdGF0W2ldLnR5cGUgPT0gMCkgeworCQkJbWRlY19jYXZfc3RhdFtpXS50eXBlID0gdHlwZTsKKwkJCW1kZWNfY2F2X3N0YXRbaV0uY2FudmFzX3VzZWRfZmxhZyA9IDE7CisJCQltZGVjX2Nhdl9zdGF0W2ldLmlkID0gKDEgPDwgaWQpOworCQkJaWYgKHZkZWNfZ2V0X2RlYnVnKCkgJiA0KQorCQkJCXByX2RlYnVnKCJnZXQgY2F2IGx1dCAlZFxuIiwgaSk7CisJCQl2ZGVjX2NhbnZhc191bmxvY2soZmxhZ3MpOworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisJdmRlY19jYW52YXNfdW5sb2NrKGZsYWdzKTsKKworCXByX2luZm8oImNhbm5vdCBnZXQgY2F2IGx1dFxuIik7CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfaW50ZXJuYWxfY2F2X2x1dChpbnQgaW5kZXgsIGludCBpZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBvZmZzZXQ7CisKKwlmbGFncyA9IHZkZWNfY2FudmFzX2xvY2soKTsKKwlpZiAoaW5kZXggPiAwICYmIGluZGV4IDwgTURFQ19DQVZfTFVUX01BWCkKKwkJb2Zmc2V0ID0gaW5kZXg7CisJZWxzZSB7CisJCXZkZWNfY2FudmFzX3VubG9jayhmbGFncyk7CisJCXJldHVybjsKKwl9CisJaWYgKChtZGVjX2Nhdl9zdGF0W29mZnNldF0uY2FudmFzX3VzZWRfZmxhZyA+IDApICYmCisJCShtZGVjX2Nhdl9zdGF0W29mZnNldF0uaWQgJiAoMSA8PCBpZCkpKSB7CisJCW1kZWNfY2F2X3N0YXRbb2Zmc2V0XS5jYW52YXNfdXNlZF9mbGFnLS07CisJCW1kZWNfY2F2X3N0YXRbb2Zmc2V0XS5pZCAmPSB+KDEgPDwgaWQpOworCQlpZiAobWRlY19jYXZfc3RhdFtvZmZzZXRdLmNhbnZhc191c2VkX2ZsYWcgPT0gMCkgeworCQkJbWRlY19jYXZfc3RhdFtvZmZzZXRdLnR5cGUgPSAwOworCQkJbWRlY19jYXZfc3RhdFtvZmZzZXRdLmlkID0gMDsKKwkJfQorCQlpZiAodmRlY19nZXRfZGVidWcoKSAmIDQpIHsKKwkJCXByX2RlYnVnKCJmcmVlIGluZGV4ICVkIHVzZWRfZmxhZyAlZCwgdHlwZSA9ICVkLCBpZCA9ICVkXG4iLAorCQkJCW9mZnNldCwKKwkJCQltZGVjX2Nhdl9zdGF0W29mZnNldF0uY2FudmFzX3VzZWRfZmxhZywKKwkJCQltZGVjX2Nhdl9zdGF0W29mZnNldF0udHlwZSwKKwkJCQltZGVjX2Nhdl9zdGF0W29mZnNldF0uaWQpOworCQl9CisJfQorCXZkZWNfY2FudmFzX3VubG9jayhmbGFncyk7CisKKwlyZXR1cm47Cit9CisKK3Vuc2lnbmVkIGxvbmcgdmRlY19jYXZfZ2V0X2FkZHIoaW50IGluZGV4KQoreworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTURFQ19DQVZfTFVUX01BWCkgeworCQlwcl9lcnIoIiVzLCBlcnJvciBpbmRleCAlZFxuIiwgX19mdW5jX18sIGluZGV4KTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiBtZGVjX2Nhdl9wb29sW2luZGV4ICYgTURFQ19DQVZfSU5ERVhfTUFTS10ucGh5X2FkZHI7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfY2F2X2dldF9hZGRyKTsKKwordW5zaWduZWQgaW50IHZkZWNfY2F2X2dldF93aWR0aChpbnQgaW5kZXgpCit7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBNREVDX0NBVl9MVVRfTUFYKSB7CisJCXByX2VycigiJXMsIGVycm9yIGluZGV4ICVkXG4iLCBfX2Z1bmNfXywgaW5kZXgpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIG1kZWNfY2F2X3Bvb2xbaW5kZXggJiBNREVDX0NBVl9JTkRFWF9NQVNLXS53aWR0aDsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19jYXZfZ2V0X3dpZHRoKTsKKwordW5zaWduZWQgaW50IHZkZWNfY2F2X2dldF9oZWlnaHQoaW50IGluZGV4KQoreworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTURFQ19DQVZfTFVUX01BWCkgeworCQlwcl9lcnIoIiVzLCBlcnJvciBpbmRleCAlZFxuIiwgX19mdW5jX18sIGluZGV4KTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gbWRlY19jYXZfcG9vbFtpbmRleCAmIE1ERUNfQ0FWX0lOREVYX01BU0tdLmhlaWdodDsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19jYXZfZ2V0X2hlaWdodCk7CisKK3ZvaWQgY2F2X2x1dF9pbmZvX3N0b3JlKHUzMiBpbmRleCwgdWxvbmcgYWRkciwgdTMyIHdpZHRoLAorCXUzMiBoZWlnaHQsIHUzMiB3cmFwLCB1MzIgYmxrbW9kZSwgdTMyIGVuZGlhbikKK3sKKwlzdHJ1Y3QgY2FudmFzX2NvbmZpZ19zICpwb29sID0gTlVMTDsKKworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTURFQ19DQVZfTFVUX01BWCkgeworCQlwcl9lcnIoIiVzLCBlcnJvciBpbmRleCAlZFxuIiwgX19mdW5jX18sIGluZGV4KTsKKwkJcmV0dXJuOworCX0KKwlpZiAobWRlY19jYXZfcG9vbCA9PSBOVUxMKQorCQltZGVjX2Nhdl9wb29sID0gdnphbGxvYyhzaXplb2Yoc3RydWN0IGNhbnZhc19jb25maWdfcykKKwkJCSogKE1ERUNfQ0FWX0xVVF9NQVggKyAxKSk7CisKKwlpZiAobWRlY19jYXZfcG9vbCA9PSBOVUxMKSB7CisJCXByX2VycigiJXMgZmFpbGVkLCBtZGVjX2Nhdl9wb29sIG51bGxcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlwb29sID0gJm1kZWNfY2F2X3Bvb2xbaW5kZXhdOworCXBvb2wtPndpZHRoID0gd2lkdGg7CisJcG9vbC0+aGVpZ2h0ID0gaGVpZ2h0OworCXBvb2wtPmJsb2NrX21vZGUgPSBibGttb2RlOworCXBvb2wtPmVuZGlhbiA9IGVuZGlhbjsKKwlwb29sLT5waHlfYWRkciA9IGFkZHI7Cit9CisKK3ZvaWQgY29uZmlnX2Nhdl9sdXRfZXgodTMyIGluZGV4LCB1bG9uZyBhZGRyLCB1MzIgd2lkdGgsCisJdTMyIGhlaWdodCwgdTMyIHdyYXAsIHUzMiBibGttb2RlLAorCXUzMiBlbmRpYW4sIGVudW0gdmRlY190eXBlX2UgY29yZSkKK3sKKwl1bnNpZ25lZCBsb25nIGRhdGFoX3RlbXAsIGRhdGFsX3RlbXA7CisKKwlpZiAoIWlzX3N1cHBvcnRfdmRlY19jYW52YXMoKSkgeworCQljYW52YXNfY29uZmlnX2V4KGluZGV4LCBhZGRyLCB3aWR0aCwgaGVpZ2h0LCB3cmFwLCBibGttb2RlLCBlbmRpYW4pOworCQlpZiAodmRlY19nZXRfZGVidWcoKSAmIDB4NDAwMDAwMDApIHsKKwkJCXByX2luZm8oIiVzICUyZCkgYWRkcjogJWx4LCB3aWR0aDogJWQsIGhlaWdodDogJWQsIGJsa206ICVkLCBlbmRpYW46ICVkXG4iLAorCQkJCV9fZnVuY19fLCBpbmRleCwgYWRkciwgd2lkdGgsIGhlaWdodCwgYmxrbW9kZSwgZW5kaWFuKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCWRhdGFsX3RlbXAgPSAoY2F2X2x1dC5zdGFydF9hZGRyICYgMHgxZmZmZmZmZikgfAorCQkJKChjYXZfbHV0LmNhdl93aWR0aCAmIDB4NyApIDw8IDI5ICk7CisJCWRhdGFoX3RlbXAgPSAoKGNhdl9sdXQuY2F2X3dpZHRoICA+PiAzKSAmIDB4MWZmKSB8CisJCQkoKCBjYXZfbHV0LmNhdl9oaWdodCAmIDB4MWZmZikgPDw5ICkgfAorCQkJKChjYXZfbHV0Lnhfd3JhcF9lbiAmIDEpIDw8IDIyICkgfAorCQkJKCggY2F2X2x1dC55X3dyYXBfZW4gJiAxKSA8PCAyMykgfAorCQkJKCggY2F2X2x1dC5ibGtfbW9kZSAmIDB4MykgPDwgMjQpOworCQkqLworCQl1MzIgYWRkcl9iaXRzX2wgPSAoKCgoYWRkciArIDcpID4+IDMpICYgQ0FOVkFTX0FERFJfTE1BU0spIDw8IENBVl9XQUREUl9MQklUKTsKKwkJdTMyIHdpZHRoX2wgICAgID0gKCgoKHdpZHRoICAgICsgNykgPj4gMykgJiBDQU5WQVNfV0lEVEhfTE1BU0spIDw8IENBVl9XSURUSF9MQklUKTsKKwkJdTMyIHdpZHRoX2ggICAgID0gKCgoKHdpZHRoICAgICsgNykgPj4gMykgPj4gQ0FOVkFTX1dJRFRIX0xXSUQpIDw8IENBVl9XSURUSF9IQklUKTsKKwkJdTMyIGhlaWdodF9oICAgID0gKGhlaWdodCAmIENBTlZBU19IRUlHSFRfTUFTSykgPDwgQ0FWX0hFSUdIVF9IQklUOworCQl1MzIgYmxrbW9kX2ggICAgPSAoYmxrbW9kZSAmIENBTlZBU19CTEtNT0RFX01BU0spIDw8IENBVl9CTEtNT0RFX0hCSVQ7CisJCXUzMiBzd2l0Y2hfYml0c19jdGwgPSAoZW5kaWFuICYgMHhmKSA8PCBDQVZfRU5ESUFOX0hCSVQ7CisJCXUzMiB3cmFwX2ggICAgICA9ICgwIDw8IDIzKTsKKwkJZGF0YWxfdGVtcCA9IGFkZHJfYml0c19sIHwgd2lkdGhfbDsKKwkJZGF0YWhfdGVtcCA9IHdpZHRoX2ggfCBoZWlnaHRfaCB8IHdyYXBfaCB8IGJsa21vZF9oIHwgc3dpdGNoX2JpdHNfY3RsOworCisJCWlmIChjb3JlID09IFZERUNfMSkgeworCQkJaWYgKChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1QzKSAmJiAoZW5kaWFuID09IDcpKQorCQkJCVdSSVRFX1ZSRUcoTURFQ19DQVZfQ0ZHMCwgMHgxZmYgPDwgMTcpOworCQkJZWxzZQorCQkJCVdSSVRFX1ZSRUcoTURFQ19DQVZfQ0ZHMCwgMCk7IC8vWzBdY2Fudl9tb2RlLCBieSBkZWZhdWx0IGlzIG5vbi1jYW52LW1vZGUKKwkJCVdSSVRFX1ZSRUcoTURFQ19DQVZfTFVUX0RBVEFMLCBkYXRhbF90ZW1wKTsKKwkJCVdSSVRFX1ZSRUcoTURFQ19DQVZfTFVUX0RBVEFILCBkYXRhaF90ZW1wKTsKKwkJCVdSSVRFX1ZSRUcoTURFQ19DQVZfTFVUX0FERFIsICBpbmRleCk7CisJCX0KKworCQljYXZfbHV0X2luZm9fc3RvcmUoaW5kZXgsIGFkZHIsIHdpZHRoLCBoZWlnaHQsIHdyYXAsIGJsa21vZGUsIGVuZGlhbik7CisKKwkJaWYgKHZkZWNfZ2V0X2RlYnVnKCkgJiAweDQwMDAwMDAwKSB7CisJCQlwcl9pbmZvKCIlcyAlMmQpIGFkZHI6ICVseCwgd2lkdGg6ICVkLCBoZWlnaHQ6ICVkLCBibGttOiAlZCwgZW5kaWFuOiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgaW5kZXgsIGFkZHIsIHdpZHRoLCBoZWlnaHQsIGJsa21vZGUsIGVuZGlhbik7CisJCQlwcl9pbmZvKCJkYXRhKGgsbCk6IDB4JThseCwgMHglOGx4XG4iLCBkYXRhaF90ZW1wLCBkYXRhbF90ZW1wKTsKKwkgICAgfQorCX0KK30KK0VYUE9SVF9TWU1CT0woY29uZmlnX2Nhdl9sdXRfZXgpOworCit2b2lkIGNvbmZpZ19jYXZfbHV0KGludCBpbmRleCwgc3RydWN0IGNhbnZhc19jb25maWdfcyAqY2ZnLAorCWVudW0gdmRlY190eXBlX2UgY29yZSkKK3sKKwljb25maWdfY2F2X2x1dF9leChpbmRleCwKKwkJY2ZnLT5waHlfYWRkciwKKwkJY2ZnLT53aWR0aCwKKwkJY2ZnLT5oZWlnaHQsCisJCUNBTlZBU19BRERSX05PV1JBUCwKKwkJY2ZnLT5ibG9ja19tb2RlLAorCQljZmctPmVuZGlhbiwKKwkJY29yZSk7Cit9CitFWFBPUlRfU1lNQk9MKGNvbmZpZ19jYXZfbHV0KTsKKworCit2b2lkIHZkZWNfY2FudmFzX3BvcnRfcmVnaXN0ZXIoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlpZiAoaXNfc3VwcG9ydF92ZGVjX2NhbnZhcygpKSB7CisJCXZkZWMtPmdldF9jYW52YXMgPSBnZXRfaW50ZXJuYWxfY2F2X2x1dDsKKwkJdmRlYy0+Z2V0X2NhbnZhc19leCA9IGdldF9pbnRlcm5hbF9jYXZfbHV0X2V4OworCQl2ZGVjLT5mcmVlX2NhbnZhc19leCA9IGZyZWVfaW50ZXJuYWxfY2F2X2x1dDsKKwkJaWYgKG1kZWNfY2F2X3Bvb2wgPT0gTlVMTCkgeworCQkJbWRlY19jYXZfcG9vbCA9IHZ6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjYW52YXNfY29uZmlnX3MpCisJCQkqIChNREVDX0NBVl9MVVRfTUFYICsgMSkpOworCQl9CisJfSBlbHNlIHsKKwkJdmRlYy0+Z2V0X2NhbnZhcyA9IGdldF9jYW52YXM7CisJCXZkZWMtPmdldF9jYW52YXNfZXggPSBnZXRfY2FudmFzX2V4OworCQl2ZGVjLT5mcmVlX2NhbnZhc19leCA9IGZyZWVfY2FudmFzX2V4OworCX0KK30KK0VYUE9SVF9TWU1CT0wodmRlY19jYW52YXNfcG9ydF9yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdmRlY19jYW52YXNfdXRpbHMuaCBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjX2NhbnZhc191dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZDgzY2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdmRlY19jYW52YXNfdXRpbHMuaApAQCAtMCwwICsxLDcwIEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL21lZGlhL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdmRlY19jYW52YXNfdXRpbHMuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2lmbmRlZiBfX0NBTlZBU19VVElMU19IX18KKyNkZWZpbmUgX19DQU5WQVNfVVRJTFNfSF9fCisKKyNpbmNsdWRlICJ2ZGVjLmgiCisKKy8qIGV4dGVybmFsIGNhbnZhcyAqLworc3RydWN0IGNhbnZhc19zdGF0dXNfcyB7CisJaW50IHR5cGU7CisJaW50IGNhbnZhc191c2VkX2ZsYWc7CisJaW50IGlkOworfTsKKworI2RlZmluZSBDQU5WQVNfTUFYX1NJWkUgKEFNVkRFQ19DQU5WQVNfTUFYMSAtIEFNVkRFQ19DQU5WQVNfU1RBUlRfSU5ERVggKyAxICsgQU1WREVDX0NBTlZBU19NQVgyICsgMSkKKworCisvKiBpbnRlcm5hbCBjYW52YXMgKi8KKyNkZWZpbmUgQ0FOVkFTX0FERFJfTE1BU0sgICAgICAgMHgxZmZmZmZmZgorI2RlZmluZSBDQU5WQVNfV0lEVEhfTE1BU0sgICAgICAweDcKKyNkZWZpbmUgQ0FOVkFTX1dJRFRIX0xXSUQgICAgICAgMworI2RlZmluZSBDQU5WQVNfSEVJR0hUX01BU0sgICAgICAweDFmZmYKKyNkZWZpbmUgQ0FOVkFTX0JMS01PREVfTUFTSyAgICAgMworCisjZGVmaW5lIENBVl9XQUREUl9MQklUICAgICAgIDAKKyNkZWZpbmUgQ0FWX1dJRFRIX0xCSVQgICAgICAgMjkKKyNkZWZpbmUgQ0FWX1dJRFRIX0hCSVQgICAgICAgMAorI2RlZmluZSBDQVZfSEVJR0hUX0hCSVQgICAgICAoNDEgLSAzMikKKyNkZWZpbmUgQ0FWX1dSQVBYX0hCSVQgICAgICAgKDU0IC0gMzIpCisjZGVmaW5lIENBVl9XUkFQWV9IQklUICAgICAgICg1NSAtIDMyKQorI2RlZmluZSBDQVZfQkxLTU9ERV9IQklUICAgICAoNTYgLSAzMikKKyNkZWZpbmUgQ0FWX0VORElBTl9IQklUICAgICAgKDU4IC0gMzIpCisKKyNkZWZpbmUgTURFQ19DQVZfTFVUX01BWCAxMjgKKyNkZWZpbmUgTURFQ19DQVZfSU5ERVhfTUFTSyAweDdmCisKK2VudW0gdmRlY190eXBlX2U7CisKK3ZvaWQgY29uZmlnX2Nhdl9sdXQoaW50IGluZGV4LCBzdHJ1Y3QgY2FudmFzX2NvbmZpZ19zICpjZmcsIGVudW0gdmRlY190eXBlX2UgY29yZSk7CisKK3ZvaWQgY29uZmlnX2Nhdl9sdXRfZXgodTMyIGluZGV4LCB1bG9uZyBhZGRyLCB1MzIgd2lkdGgsCisJdTMyIGhlaWdodCwgdTMyIHdyYXAsIHUzMiBibGttb2RlLAorCXUzMiBlbmRpYW4sIGVudW0gdmRlY190eXBlX2UgY29yZSk7CisKK3Vuc2lnbmVkIGludCB2ZGVjX2Nhdl9nZXRfd2lkdGgoaW50IGluZGV4KTsKKwordW5zaWduZWQgaW50IHZkZWNfY2F2X2dldF9oZWlnaHQoaW50IGluZGV4KTsKKwordW5zaWduZWQgbG9uZyB2ZGVjX2Nhdl9nZXRfYWRkcihpbnQgaW5kZXgpOworCitib29sIGlzX3N1cHBvcnRfdmRlY19jYW52YXModm9pZCk7CisKK3ZvaWQgdmRlY19jYW52YXNfcG9ydF9yZWdpc3RlcihzdHJ1Y3QgdmRlY19zICp2ZGVjKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjX2ZlYXR1cmUuYyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjX2ZlYXR1cmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTNhNzVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWNfZmVhdHVyZS5jCkBAIC0wLDAgKzEsNTIyIEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL21lZGlhL3N0cmVhbV9pbnB1dC9hbXBvcnRzL2Ftc3RyZWFtX3Byb2ZpbGUuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL2Ftc3RyZWFtLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy92Zm9ybWF0Lmg+CisjaW5jbHVkZSAiLi4vLi4vLi4vY29tbW9uL2NoaXBzL2RlY29kZXJfY3B1X3Zlcl9pbmZvLmgiCisjaW5jbHVkZSAidmRlYy5oIgorCisKKworLy9zdGF0aWMgY29uc3Qgc3RydWN0IGNvZGVjX3Byb2ZpbGVfdCAqdmNvZGVjX2ZlYXR1cmVbU1VQUE9SVF9WREVDX05VTV0gPSB7IDAgfTsKKworc3RydWN0IHZjb2RlY19mZWF0dXJlIHsKKwlpbnQgZm9ybWF0OworCWludCBpc192NGw7Cit9OworCitzdGF0aWMgc3RydWN0IHZjb2RlY19mZWF0dXJlIGZlYXR1cmVbU1VQUE9SVF9WREVDX05VTV07CisKK3N0YXRpYyBpbnQgdmNvZGVjX2ZlYXR1cmVfaWR4Oworc3RhdGljIHVsb25nIGxhc3RfdGltZTsKK3U4IGJ1Zls0MDk2XTsKKworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGZvcm1hdF9uYW1lW10gPSB7CisJImFtbXZkZWNfbXBlZzEyIiwKKwkiYW1tdmRlY19tcGVnNCIsCisJImFtbXZkZWNfaDI2NCIsCisJImFtbXZkZWNfbWpwZWciLAorCSJhbW12ZGVjX3JlYWwiLAorCSJhbW1qcGVnZGVjIiwKKwkiYW1tdmRlY192YzEiLAorCSJhbW12ZGVjX2F2cyIsCisJImFtbXZkZWNfeXV2IiwKKwkiYW1tdmRlY19oMjY0bXZjIiwKKwkiYW1tdmRlY19oMjY0XzRrMmsiLAorCSJhbW12ZGVjX2gyNjUiLAorCSJhbXZlbmNfYXZjIiwKKwkianBlZ2VuYyIsCisJImFtbXZkZWNfdnA5IiwKKwkiYW1tdmRlY19hdnMyIiwKKwkiYW1tdmRlY19hdjEiLAorfTsKKworc3RhdGljIGludCB2Y29kZWNfZmVhdHVyZV9DQyh1OCAqYnVmLCBpbnQgc2l6ZSwgaW50IHZmb3JtYXQsIGludCBpc192NGwpCit7CisJdTggKnBidWYgPSBidWY7CisKKwlpZiAoIWlzX3Y0bCkgeworCQlzd2l0Y2ggKHZmb3JtYXQpIHsKKwkJCWNhc2UgVkZPUk1BVF9NUEVHMTI6CisJCQljYXNlIFZGT1JNQVRfSDI2NDoKKwkJCWNhc2UgVkZPUk1BVF9BVlM6CisJCQkJcGJ1ZiArPSBzbnByaW50ZihwYnVmLCBzaXplLCAiICAgICAgICBcIkNDIHN1YnRpdGxlXCIgOiBcInRydWVcIlxuIik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHBidWYgLSBidWY7Cit9CisKK3N0YXRpYyBpbnQgdmNvZGVjX2ZlYXR1cmVfcmVwb3J0X2luZm9ybWF0aW9uKHU4ICpidWYsIGludCBzaXplLCBpbnQgdmZvcm1hdCwgaW50IGlzX3Y0bCkKK3sKKwl1OCAqcGJ1ZiA9IGJ1ZjsKKworCWlmICghaXNfdjRsKSB7CisJCXBidWYgKz0gc25wcmludGYocGJ1Ziwgc2l6ZSwgIiAgICAgICAgXCJEZWNvZGVyIGluZm9ybWF0aW9uIHJlcG9ydFwiIDogXCJ0cnVlXCJcbiIpOworCX0KKworCXJldHVybiBwYnVmIC0gYnVmOworfQorCitzdGF0aWMgaW50IHZjb2RlY19mZWF0dXJlX2lfb25seV9tb2RlKHU4ICpidWYsIGludCBzaXplLCBpbnQgdmZvcm1hdCkKK3sKKwl1OCAqcGJ1ZiA9IGJ1ZjsKKworCXN3aXRjaCAodmZvcm1hdCkgeworCQljYXNlIFZGT1JNQVRfTVBFRzEyOgorCQljYXNlIFZGT1JNQVRfSDI2NDoKKwkJY2FzZSBWRk9STUFUX01QRUc0OgorCQljYXNlIFZGT1JNQVRfSEVWQzoKKwkJY2FzZSBWRk9STUFUX0FWUzI6CisJCQlwYnVmICs9IHNucHJpbnRmKHBidWYsIHNpemUsICIgICAgICAgIFwiSSBvbmx5IG1vZGVcIiA6IFwidHJ1ZVwiXG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHBidWYgLSBidWY7Cit9CisKK3N0YXRpYyBpbnQgdmNvZGVjX2ZlYXR1cmVfZG9sYnlWaXNvbih1OCAqYnVmLCBpbnQgc2l6ZSwgaW50IHZmb3JtYXQpCit7CisJdTggKnBidWYgPSBidWY7CisKKwlzd2l0Y2ggKHZmb3JtYXQpIHsKKwkJY2FzZSBWRk9STUFUX0gyNjQ6CisJCWNhc2UgVkZPUk1BVF9IRVZDOgorCQljYXNlIFZGT1JNQVRfQVYxOgorCQkJaWYgKChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTSkgJiYKKwkJCQkoZ2V0X2NwdV9tYWpvcl9pZCgpICE9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNSkgJiYKKwkJCQkoZ2V0X2NwdV9tYWpvcl9pZCgpICE9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNUQpICYmCisJCQkJKGdldF9jcHVfbWFqb3JfaWQoKSAhPSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfUzQpKQorCQkJCXBidWYgKz0gc25wcmludGYocGJ1Ziwgc2l6ZSwgIiAgICAgICAgXCJEb2xieVZpc2lvblwiIDogXCJ0cnVlXCJcbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcGJ1ZiAtIGJ1ZjsKK30KKworc3RhdGljIGludCB2Y29kZWNfZmVhdHVyZV9IRFIodTggKmJ1ZiwgaW50IHNpemUsIGludCB2Zm9ybWF0KQoreworCXU4ICpwYnVmID0gYnVmOworCisJc3dpdGNoICh2Zm9ybWF0KSB7CisJCWNhc2UgVkZPUk1BVF9IMjY0OgorCQljYXNlIFZGT1JNQVRfSEVWQzoKKwkJY2FzZSBWRk9STUFUX0FWMToKKwkJY2FzZSBWRk9STUFUX0FWUzI6CisJCWNhc2UgVkZPUk1BVF9WUDk6CisJCQkJcGJ1ZiArPSBzbnByaW50ZihwYnVmLCBzaXplLCAiICAgICAgICBcIkhEUlwiIDogXCJ0cnVlXCJcbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcGJ1ZiAtIGJ1ZjsKK30KKworCitzdGF0aWMgaW50IHZjb2RlY19mZWF0dXJlX2RvdWJsZXdyaXRlKHU4ICpidWYsIGludCBzaXplLCBpbnQgdmZvcm1hdCkKK3sKKwl1OCAqcGJ1ZiA9IGJ1ZjsKKwlpbnQgdHNpemUgPSAwOworCWludCBzOworCisJc3dpdGNoICh2Zm9ybWF0KSB7CisJCWNhc2UgVkZPUk1BVF9IRVZDOgorCQljYXNlIFZGT1JNQVRfVlA5OgorCQljYXNlIFZGT1JNQVRfQVZTMjoKKwkJY2FzZSBWRk9STUFUX0FWMToKKwkJCXMgPSBzbnByaW50ZihwYnVmLCBzaXplIC0gdHNpemUsICIgICAgICAgIFwiRG91YmxlV3JpdGVcIiAiKTsKKwkJCXRzaXplICs9IHM7CisJCQlwYnVmICs9IHM7CisJCQlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSAhPSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDcpICYmCisJCQkJKGdldF9jcHVfbWFqb3JfaWQoKSAhPSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDMpKSB7CisJCQkJcyA9IHNucHJpbnRmKHBidWYsIHNpemUgLSB0c2l6ZSwgIlsgXCIwXCIsIFwiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiLCBcIjB4MTBcIiwgXCIweDEwMDAwXCIsIFwiMHgyMDAwMFwiXVxuIik7CisJCQkJdHNpemUgKz0gczsKKwkJCQlwYnVmICs9IHM7CisJCQl9CisJCQllbHNlIHsKKwkJCQlzID0gc25wcmludGYocGJ1Ziwgc2l6ZSAtIHRzaXplLCAiWyBcIjBcIiwgXCIxXCIsIFwiMlwiLCBcIjNcIiwgXCI0XCIsIFwiOFwiLCBcIjB4MTBcIiwgXCIweDEwMDAwXCIsIFwiMHgyMDAwMFwiXVxuIik7CisJCQkJdHNpemUgKz0gczsKKwkJCQlwYnVmICs9IHM7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBwYnVmIC0gYnVmOworfQorCitzdGF0aWMgaW50IHZjb2RlY19mZWF0dXJlX3ZkZWNfZmVuY2UodTggKmJ1ZiwgaW50IHNpemUsIGludCB2Zm9ybWF0KQoreworCXU4ICpwYnVmID0gYnVmOworCisJc3dpdGNoICh2Zm9ybWF0KSB7CisJCWNhc2UgVkZPUk1BVF9IMjY0OgorCQljYXNlIFZGT1JNQVRfSEVWQzoKKwkJY2FzZSBWRk9STUFUX1ZQOToKKwkJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTSkKKwkJCQlwYnVmICs9IHNucHJpbnRmKHBidWYsIHNpemUsICIgICAgICAgIFwiR2FtZU1vZGVcIiA6IFwidHJ1ZVwiXG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHBidWYgLSBidWY7Cit9CisKK3N0YXRpYyBpbnQgdmNvZGVjX2ZlYXR1cmVfYml0ZGVwdGgodTggKmJ1ZiwgaW50IHNpemUsIGludCB2Zm9ybWF0KQoreworCXU4ICpwYnVmID0gYnVmOworCisJc3dpdGNoICh2Zm9ybWF0KSB7CisJCWNhc2UgVkZPUk1BVF9IRVZDOgorCQljYXNlIFZGT1JNQVRfVlA5OgorCQljYXNlIFZGT1JNQVRfQVZTMjoKKwkJY2FzZSBWRk9STUFUX0FWMToKKwkJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYQkIpCisJCQkJcGJ1ZiArPSBzbnByaW50ZihwYnVmLCBzaXplLCAiICAgICAgICBcIkJpdERlcHRoXCIgOiBcIjEwXCJcbiIpOworCQkJZWxzZQorCQkJCXBidWYgKz0gc25wcmludGYocGJ1Ziwgc2l6ZSwgIiAgICAgICAgXCJCaXREZXB0aFwiIDogXCI4XCJcbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcGJ1ZiAtIGJ1ZjsKK30KKworCitzdGF0aWMgaW50IHZjb2RlY19mZWF0dXJlX01heFJlc29sdXRpb24odTggKmJ1ZiwgaW50IHNpemUsIGludCB2Zm9ybWF0KQoreworCXU4ICpwYnVmID0gYnVmOworCisJc3dpdGNoICh2Zm9ybWF0KSB7CisJCWNhc2UgVkZPUk1BVF9IRVZDOgorCQljYXNlIFZGT1JNQVRfVlA5OgorCQljYXNlIFZGT1JNQVRfQVZTMjoKKwkJY2FzZSBWRk9STUFUX0FWMToKKwkJCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpICYmCisJCQkJKGdldF9jcHVfbWFqb3JfaWQoKSAhPSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDVEKSkKKwkJCQlwYnVmICs9IHNucHJpbnRmKHBidWYsIHNpemUsICIgICAgICAgIFwiTWF4aW11bVJlc29sdXRpb25cIiA6IFwiOGtcIlxuIik7CisJCQllbHNlIGlmICh2ZGVjX2lzX3N1cHBvcnRfNGsoKSAmJgorCQkJCQkoZ2V0X2NwdV9tYWpvcl9pZCgpICE9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNUQpKQorCQkJCXBidWYgKz0gc25wcmludGYocGJ1Ziwgc2l6ZSwgIiAgICAgICAgXCJNYXhpbXVtUmVzb2x1dGlvblwiIDogXCI0azYwXCJcbiIpOworCQkJZWxzZQorCQkJCXBidWYgKz0gc25wcmludGYocGJ1Ziwgc2l6ZSwgIiAgICAgICAgXCJNYXhpbXVtUmVzb2x1dGlvblwiIDogXCIxMDgwcDYwXCJcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgVkZPUk1BVF9IMjY0OgorCQkJaWYgKHZkZWNfaXNfc3VwcG9ydF80aygpKQorCQkJCXBidWYgKz0gc25wcmludGYocGJ1Ziwgc2l6ZSwgIiAgICAgICAgXCJNYXhpbXVtUmVzb2x1dGlvblwiIDogXCI0azMwXCJcbiIpOworCQkJZWxzZQorCQkJCXBidWYgKz0gc25wcmludGYocGJ1Ziwgc2l6ZSwgIiAgICAgICAgXCJNYXhpbXVtUmVzb2x1dGlvblwiIDogXCIxMDgwcDYwXCJcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgVkZPUk1BVF9NUEVHMTI6CisJCWNhc2UgVkZPUk1BVF9NUEVHNDoKKwkJY2FzZSBWRk9STUFUX01KUEVHOgorCQljYXNlIFZGT1JNQVRfVkMxOgorCQljYXNlIFZGT1JNQVRfQVZTOgorCQkJcGJ1ZiArPSBzbnByaW50ZihwYnVmLCBzaXplLCAiICAgICAgICBcIk1heGltdW1SZXNvbHV0aW9uXCIgOiBcIjEwODBwNjBcIlxuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBwYnVmIC0gYnVmOworfQorCitzdGF0aWMgaW50IHZjb2RlY19mZWF0dXJlX2Nsb2NrKHU4ICpidWYsIGludCBzaXplLCBpbnQgdmZvcm1hdCkKK3sKKwl1OCAqcGJ1ZiA9IGJ1ZjsKKworCXN3aXRjaCAodmZvcm1hdCkgeworCQljYXNlIFZGT1JNQVRfSEVWQzoKKwkJY2FzZSBWRk9STUFUX1ZQOToKKwkJY2FzZSBWRk9STUFUX0FWUzI6CisJCWNhc2UgVkZPUk1BVF9BVjE6CisJCQlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQikgJiYKKwkJCQkoZ2V0X2NwdV9tYWpvcl9pZCgpICE9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWExYMikgJiYKKwkJCQkoZ2V0X2NwdV9tYWpvcl9pZCgpICE9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNSkgJiYKKwkJCQkoZ2V0X2NwdV9tYWpvcl9pZCgpICE9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNUQpKQorCQkJCXBidWYgKz0gc25wcmludGYocGJ1Ziwgc2l6ZSwgIiAgICAgICAgXCJDbG9ja0ZyZXF1ZW5jeVwiIDogXCI4MDBNSFpcIlxuIik7CisJCQllbHNlCisJCQkJcGJ1ZiArPSBzbnByaW50ZihwYnVmLCBzaXplLCAiICAgICAgICBcIkNsb2NrRnJlcXVlbmN5XCIgOiBcIjY2N01IWlwiXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFZGT1JNQVRfSDI2NDoKKwkJY2FzZSBWRk9STUFUX01QRUcxMjoKKwkJY2FzZSBWRk9STUFUX01QRUc0OgorCQljYXNlIFZGT1JNQVRfTUpQRUc6CisJCWNhc2UgVkZPUk1BVF9WQzE6CisJCWNhc2UgVkZPUk1BVF9BVlM6CisJCQlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKSAmJgorCQkJCShnZXRfY3B1X21ham9yX2lkKCkgIT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RMMSkgJiYKKwkJCQkoZ2V0X2NwdV9tYWpvcl9pZCgpICE9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWExYMikgJiYKKwkJCQkoZ2V0X2NwdV9tYWpvcl9pZCgpICE9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNSkgJiYKKwkJCQkoZ2V0X2NwdV9tYWpvcl9pZCgpICE9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNUQpKQorCQkJCXBidWYgKz0gc25wcmludGYocGJ1Ziwgc2l6ZSwgIiAgICAgICAgXCJDbG9ja0ZyZXF1ZW5jeVwiIDogXCI4MDBNSFpcIlxuIik7CisJCQllbHNlCisJCQkJcGJ1ZiArPSBzbnByaW50ZihwYnVmLCBzaXplLCAiICAgICAgICBcIkNsb2NrRnJlcXVlbmN5XCIgOiBcIjY2N01IWlwiXG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHBidWYgLSBidWY7Cit9CisKK3N0YXRpYyBpbnQgdmNvZGVjX2ZlYXR1cmVfc3VwcG9ydF9mb3JtYXQoaW50IHZmb3JtYXQpCit7CisKKwlzd2l0Y2ggKHZmb3JtYXQpIHsKKwkJY2FzZSBWRk9STUFUX1ZQOToKKwkJCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWEwpICYmCisJCQkJKGdldF9jcHVfbWFqb3JfaWQoKSAhPSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDUpKQorCQkJCXJldHVybiAxOworCQkJZWxzZQorCQkJCXJldHVybiAwOworCQljYXNlIFZGT1JNQVRfQVZTMjoKKwkJCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKSAmJgorCQkJCShnZXRfY3B1X21ham9yX2lkKCkgIT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1RCkpCisJCQkJcmV0dXJuIDE7CisJCQllbHNlCisJCQkJcmV0dXJuIDA7CisJCWNhc2UgVkZPUk1BVF9BVjE6CisJCQlpZiAoKChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RNMikgJiYKKwkJCQkJaXNfY3B1X3RtMl9yZXZiKCkpIHx8CisJCQkJKChnZXRfY3B1X21ham9yX2lkKCkgPiBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVE0yKSAmJgorCQkJCShnZXRfY3B1X21ham9yX2lkKCkgIT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1KSkpCisJCQkJcmV0dXJuIDE7CisJCQllbHNlCisJCQkJcmV0dXJuIDA7CisJCWNhc2UgVkZPUk1BVF9BVlM6CisJCQlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hNKSkKKwkJCQlyZXR1cm4gMTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gMDsKKwkJY2FzZSBWRk9STUFUX01KUEVHOgorCQljYXNlIFZGT1JNQVRfVkMxOgorCQljYXNlIFZGT1JNQVRfTVBFRzQ6CisJCWNhc2UgVkZPUk1BVF9NUEVHMTI6CisJCWNhc2UgVkZPUk1BVF9IMjY0OgorCQljYXNlIFZGT1JNQVRfSEVWQzoKKwkJCXJldHVybiAxOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmNvZGVjX2ZlYXR1cmVfRkNDKHU4ICpidWYsIGludCBzaXplLCBpbnQgdmZvcm1hdCwgaW50IGlzX3Y0bCkKK3sKKwl1OCAqcGJ1ZiA9IGJ1ZjsKKworCWlmICghaXNfdjRsKSB7CisJCXN3aXRjaCAodmZvcm1hdCkgeworCQkJY2FzZSBWRk9STUFUX0hFVkM6CisJCQljYXNlIFZGT1JNQVRfSDI2NDoKKwkJCWNhc2UgVkZPUk1BVF9NUEVHMTI6CisJCQkJcGJ1ZiArPSBzbnByaW50ZihwYnVmLCBzaXplLCAiICAgICAgICBcIkRlY29kZXIgRkNDIHN1cHBvcnRcIiA6IFwidHJ1ZVwiXG4iKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcGJ1ZiAtIGJ1ZjsKK30KKworc3RhdGljIGludCB2Y29kZWNfZmVhdHVyZV9SRE1BKHU4ICpidWYsIGludCBzaXplLCBpbnQgdmZvcm1hdCkKK3sKKwl1OCAqcGJ1ZiA9IGJ1ZjsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1QzKQorCQlwYnVmICs9IHNucHJpbnRmKHBidWYsIHNpemUsICIgICAgICAgIFwiRGVjb2RlciBSRE1BIHN1cHBvcnRcIiA6IFwidHJ1ZVwiXG4iKTsKKworCXJldHVybiBwYnVmIC0gYnVmOworfQorCitzdGF0aWMgaW50IHZjb2RlY19mZWF0dXJlX3Y0bGRlY19ucih1OCAqYnVmLCBpbnQgc2l6ZSwgaW50IHZmb3JtYXQsIGludCBpc192NGwpCit7CisJdTggKnBidWYgPSBidWY7CisKKwlpZiAoaXNfdjRsKSB7CisJCXBidWYgKz0gc25wcmludGYocGJ1Ziwgc2l6ZSwgIiAgICAgICAgXCJWNGxkZWMgbnJcIiA6IFwidHJ1ZVwiXG4iKTsKKwl9CisKKwlyZXR1cm4gcGJ1ZiAtIGJ1ZjsKK30KKworc3RhdGljIGludCB2Y29kZWNfZmVhdHVyZV9nZTJkX3dyYXBwZXIodTggKmJ1ZiwgaW50IHNpemUsIGludCB2Zm9ybWF0LCBpbnQgaXNfdjRsKQoreworCXU4ICpwYnVmID0gYnVmOworCisJaWYgKGlzX3Y0bCAmJiAoZ2V0X2NwdV9tYWpvcl9pZCgpID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNykpIHsKKwkJcGJ1ZiArPSBzbnByaW50ZihwYnVmLCBzaXplLCAiICAgICAgICBcIkdlMmQgd3JhcHBlclwiIDogXCJ0cnVlXCJcbiIpOworCX0KKworCXJldHVybiBwYnVmIC0gYnVmOworfQorCisKKworaW50IHZjb2RlY19mZWF0dXJlX2dldF9mZWF0dXJlKHU4ICpidWYsIGludCB2Zm9ybWF0LCBpbnQgaXNfdjRsKQoreworCXU4ICpwYnVmID0gYnVmOworCWludCBzaXplID0gUEFHRV9TSVpFOworCWludCB0c2l6ZSA9IDA7CisJaW50IHM7CisKKwlzID0gc25wcmludGYocGJ1Ziwgc2l6ZSAtIHRzaXplLCAiICAgIFwiJXMlc1wiOiAiLCBmb3JtYXRfbmFtZVt2Zm9ybWF0XSwgaXNfdjRsID8gIl92NGwiIDogIiIpOworCXRzaXplICs9IHM7CisJcGJ1ZiArPSBzOworCisJcyA9IHNucHJpbnRmKHBidWYsIHNpemUgLSB0c2l6ZSwgIntcbiIpOworCXRzaXplICs9IHM7CisJcGJ1ZiArPSBzOworCisJcyA9IHZjb2RlY19mZWF0dXJlX0NDKHBidWYsIHNpemUgLSB0c2l6ZSwgdmZvcm1hdCwgaXNfdjRsKTsKKwl0c2l6ZSArPSBzOworCXBidWYgKz0gczsKKworCXMgPSB2Y29kZWNfZmVhdHVyZV9yZXBvcnRfaW5mb3JtYXRpb24ocGJ1Ziwgc2l6ZSAtIHRzaXplLCB2Zm9ybWF0LCBpc192NGwpOworCXRzaXplICs9IHM7CisJcGJ1ZiArPSBzOworCisJcyA9IHZjb2RlY19mZWF0dXJlX3ZkZWNfZmVuY2UocGJ1Ziwgc2l6ZSAtIHRzaXplLCB2Zm9ybWF0KTsKKwl0c2l6ZSArPSBzOworCXBidWYgKz0gczsKKworCXMgPSB2Y29kZWNfZmVhdHVyZV9pX29ubHlfbW9kZShwYnVmLCBzaXplIC0gdHNpemUsIHZmb3JtYXQpOworCXRzaXplICs9IHM7CisJcGJ1ZiArPSBzOworCisJcyA9IHZjb2RlY19mZWF0dXJlX2RvbGJ5Vmlzb24ocGJ1Ziwgc2l6ZSAtIHRzaXplLCB2Zm9ybWF0KTsKKwl0c2l6ZSArPSBzOworCXBidWYgKz0gczsKKworCXMgPSB2Y29kZWNfZmVhdHVyZV9IRFIocGJ1Ziwgc2l6ZSAtIHRzaXplLCB2Zm9ybWF0KTsKKwl0c2l6ZSArPSBzOworCXBidWYgKz0gczsKKworCXMgPSB2Y29kZWNfZmVhdHVyZV9kb3VibGV3cml0ZShwYnVmLCBzaXplIC0gdHNpemUsIHZmb3JtYXQpOworCXRzaXplICs9IHM7CisJcGJ1ZiArPSBzOworCisJcyA9IHZjb2RlY19mZWF0dXJlX2JpdGRlcHRoKHBidWYsIHNpemUgLSB0c2l6ZSwgdmZvcm1hdCk7CisJdHNpemUgKz0gczsKKwlwYnVmICs9IHM7CisKKwlzID0gdmNvZGVjX2ZlYXR1cmVfTWF4UmVzb2x1dGlvbihwYnVmLCBzaXplIC0gdHNpemUsIHZmb3JtYXQpOworCXRzaXplICs9IHM7CisJcGJ1ZiArPSBzOworCisJcyA9IHZjb2RlY19mZWF0dXJlX2Nsb2NrKHBidWYsIHNpemUgLSB0c2l6ZSwgdmZvcm1hdCk7CisJdHNpemUgKz0gczsKKwlwYnVmICs9IHM7CisKKwlzID0gdmNvZGVjX2ZlYXR1cmVfRkNDKHBidWYsIHNpemUgLSB0c2l6ZSwgdmZvcm1hdCwgaXNfdjRsKTsKKwl0c2l6ZSArPSBzOworCXBidWYgKz0gczsKKworCXMgPSB2Y29kZWNfZmVhdHVyZV9SRE1BKHBidWYsIHNpemUgLSB0c2l6ZSwgdmZvcm1hdCk7CisJdHNpemUgKz0gczsKKwlwYnVmICs9IHM7CisKKwlzID0gdmNvZGVjX2ZlYXR1cmVfdjRsZGVjX25yKHBidWYsIHNpemUgLSB0c2l6ZSwgdmZvcm1hdCwgaXNfdjRsKTsKKwl0c2l6ZSArPSBzOworCXBidWYgKz0gczsKKworCXMgPSB2Y29kZWNfZmVhdHVyZV9nZTJkX3dyYXBwZXIocGJ1Ziwgc2l6ZSAtIHRzaXplLCB2Zm9ybWF0LCBpc192NGwpOworCXRzaXplICs9IHM7CisJcGJ1ZiArPSBzOworCisJcyA9IHNucHJpbnRmKHBidWYsIHNpemUgLSB0c2l6ZSwgIiAgICAgICAgXCJVY29kZVZlcnNpb25SZXF1ZXN0XCIgOiBcIjAuMy4xMFwiXG4iKTsKKwl0c2l6ZSArPSBzOworCXBidWYgKz0gczsKKworCXMgPSBzbnByaW50ZihwYnVmLCBzaXplIC0gdHNpemUsICIgICAgfVxuIik7CisJdHNpemUgKz0gczsKKwlwYnVmICs9IHM7CisKKwlyZXR1cm4gcGJ1ZiAtIGJ1ZjsKK30KKworCitzc2l6ZV90IHZjb2RlY19mZWF0dXJlX3JlYWQoY2hhciAqYnVmKQoreworCXN0YXRpYyBpbnQgcmVhZF9jb3VudDsKKwljaGFyICpwYnVmID0gYnVmOworCisJaWYgKGppZmZpZXMgLSBsYXN0X3RpbWUgPiA1ICogSFopIHsKKwkJcmVhZF9jb3VudCA9IDA7CisJCS8qdGltZW91dCA6bm90IGNvbnRpbnVlIGR1bXAsZHVtcCBmcm9tIGZpcnN0LiAqLworCX0KKworCWlmICh2Y29kZWNfZmVhdHVyZV9pZHggPiAwKSB7CisJCWlmIChyZWFkX2NvdW50ID09IDApCisJCQlwYnVmICs9IHNucHJpbnRmKHBidWYsIFBBR0VfU0laRSAtIChwYnVmIC0gYnVmKSwgIntcbiIpOworCQlwYnVmICs9IHZjb2RlY19mZWF0dXJlX2dldF9mZWF0dXJlKHBidWYsIGZlYXR1cmVbcmVhZF9jb3VudF0uZm9ybWF0LCBmZWF0dXJlW3JlYWRfY291bnRdLmlzX3Y0bCk7CisJCXJlYWRfY291bnQrKzsKKwkJaWYgKHJlYWRfY291bnQgPj0gdmNvZGVjX2ZlYXR1cmVfaWR4KSB7CisJCQlyZWFkX2NvdW50ID0gMDsKKwkJCXBidWYgKz0gc25wcmludGYocGJ1ZiwgUEFHRV9TSVpFIC0gKHBidWYgLSBidWYpLCAifSIpOworCQl9CisJfQorCWxhc3RfdGltZSA9IGppZmZpZXM7CisJcmV0dXJuIHBidWYgLSBidWY7Cit9CitFWFBPUlRfU1lNQk9MKHZjb2RlY19mZWF0dXJlX3JlYWQpOworCisKK2ludCB2Y29kZWNfZmVhdHVyZV9yZWdpc3RlcihpbnQgdmZvcm1hdCwgaW50IGlzX3Y0bCkKK3sKKwlpZiAoKHZjb2RlY19mZWF0dXJlX2lkeCA8IFNVUFBPUlRfVkRFQ19OVU0pICYmIHZjb2RlY19mZWF0dXJlX3N1cHBvcnRfZm9ybWF0KHZmb3JtYXQpKSB7CisJCWZlYXR1cmVbdmNvZGVjX2ZlYXR1cmVfaWR4XS5mb3JtYXQgPSB2Zm9ybWF0OworCQlmZWF0dXJlW3Zjb2RlY19mZWF0dXJlX2lkeF0uaXNfdjRsID0gaXNfdjRsOworCQl2Y29kZWNfZmVhdHVyZV9pZHgrKzsKKwkJLy9wcl9kZWJ1ZygicmVnaXN0ICVzIGNvZGVjIHByb2ZpbGVcbiIsIHZkZWNfcHJvZmlsZS0+bmFtZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHZjb2RlY19mZWF0dXJlX3JlZ2lzdGVyKTsKKworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjX2ZlYXR1cmUuaCBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjX2ZlYXR1cmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjkxOGZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWNfZmVhdHVyZS5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvYW1wb3J0cy92ZGVjX3Byb2ZpbGUuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyovCisKKyNpZm5kZWYgVkRFQ19GRUFUVVJFX0gKKyNkZWZpbmUgVkRFQ19GRUFUVVJFX0gKKworaW50IHZjb2RlY19mZWF0dXJlX3JlZ2lzdGVyKGludCB2Zm9ybWF0LCBpbnQgaXNfdjRsKTsKKworc3NpemVfdCB2Y29kZWNfZmVhdHVyZV9yZWFkKGNoYXIgKmJ1Zik7CisKKworCisjZW5kaWYgLyogVkRFQ19GRUFUVVJFX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjX2dlMmRfdXRpbHMuYyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjX2dlMmRfdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGNkMGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWNfZ2UyZF91dGlscy5jCkBAIC0wLDAgKzEsNDg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIERlc2NyaXB0aW9uOgorICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9nZTJkL2dlMmQuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NhbnZhcy9jYW52YXNfbWdyLmg+CisjaW5jbHVkZSAidmRlYy5oIgorI2luY2x1ZGUgInZkZWNfZ2UyZF91dGlscy5oIgorI2luY2x1ZGUgIi4uLy4uLy4uL2NvbW1vbi9jaGlwcy9kZWNvZGVyX2NwdV92ZXJfaW5mby5oIgorCitzdGF0aWMgdTMyIHZkZWNfZ2UyZF9kZWJ1ZyA9IDA7CisKKyNpZm5kZWYgIENPTkZJR19BTUxPR0lDX01FRElBX0dFMkQKK2lubGluZSBzdHJ1Y3QgZ2UyZF9jb250ZXh0X3MgKmNyZWF0ZV9nZTJkX3dvcmtfcXVldWUodm9pZCkgeyByZXR1cm4gTlVMTDsgfQoraW5saW5lIGludCBkZXN0cm95X2dlMmRfd29ya19xdWV1ZShzdHJ1Y3QgZ2UyZF9jb250ZXh0X3MgKmdlMmRfd29ya19xdWV1ZSkgeyByZXR1cm4gLTE7IH0KKyNlbmRpZgorCitlbnVtIHZpZGVvY29tX3NvdXJjZV90eXBlIHsKKwlERUNPREVSXzhCSVRfTk9STUFMID0gMCwKKwlERUNPREVSXzhCSVRfQk9UVE9NLAorCURFQ09ERVJfOEJJVF9UT1AsCisJREVDT0RFUl8xMEJJVF9OT1JNQUwsCisJREVDT0RFUl8xMEJJVF9CT1RUT00sCisJREVDT0RFUl8xMEJJVF9UT1AKK307CisKK3N0YXRpYyB2b2lkIHZkZWNfY2FudmFzX2NhY2hlX2ZyZWUoc3RydWN0IHZkZWNfY2FudmFzX2NhY2hlICpjYW5jaGUpCit7CisJaW50IGkgPSAtMTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNhbmNoZS0+cmVzKTsgaSsrKSB7CisJCWlmIChjYW5jaGUtPnJlc1tpXS5jaWQgPiAwKSB7CisJCQlpZiAodmRlY19nZTJkX2RlYnVnKQorCQkJCXByX2luZm8oImNhbnZhcy1mcmVlLCBuYW1lOiVzLCBjYW52YXMgaWQ6JWRcbiIsCisJCQkJCWNhbmNoZS0+cmVzW2ldLm5hbWUsCisJCQkJCWNhbmNoZS0+cmVzW2ldLmNpZCk7CisKKwkJCWNhbnZhc19wb29sX21hcF9mcmVlX2NhbnZhcyhjYW5jaGUtPnJlc1tpXS5jaWQpOworCisJCQljYW5jaGUtPnJlc1tpXS5jaWQgPSAwOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCB2ZGVjX2NhbnZhc19jYWNoZV9wdXQoc3RydWN0IHZkZWNfZ2UyZCAqZ2UyZCkKK3sKKwlzdHJ1Y3QgdmRlY19jYW52YXNfY2FjaGUgKmNhbmNoZSA9ICZnZTJkLT5jYW5jaGU7CisKKwltdXRleF9sb2NrKCZjYW5jaGUtPmxvY2spOworCisJcHJfaW5mbygiY2FudmFzLXB1dCwgcmVmOiVkXG4iLCBjYW5jaGUtPnJlZik7CisKKwljYW5jaGUtPnJlZi0tOworCisJaWYgKGNhbmNoZS0+cmVmID09IDApIHsKKwkJdmRlY19jYW52YXNfY2FjaGVfZnJlZShjYW5jaGUpOworCX0KKworCW11dGV4X3VubG9jaygmY2FuY2hlLT5sb2NrKTsKK30KKworc3RhdGljIGludCB2ZGVjX2NhbnZhc19jYWNoZV9nZXQoc3RydWN0IHZkZWNfZ2UyZCAqZ2UyZCwgY2hhciAqdXNyKQoreworCXN0cnVjdCB2ZGVjX2NhbnZhc19jYWNoZSAqY2FuY2hlID0gJmdlMmQtPmNhbmNoZTsKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJmNhbmNoZS0+bG9jayk7CisKKwljYW5jaGUtPnJlZisrOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2FuY2hlLT5yZXMpOyBpKyspIHsKKwkJaWYgKGNhbmNoZS0+cmVzW2ldLmNpZCA8PSAwKSB7CisJCQlzbnByaW50ZihjYW5jaGUtPnJlc1tpXS5uYW1lLCAzMiwgIiVzLSVkIiwgdXNyLCBpKTsKKwkJCWNhbmNoZS0+cmVzW2ldLmNpZCA9CisJCQkJY2FudmFzX3Bvb2xfbWFwX2FsbG9jX2NhbnZhcyhjYW5jaGUtPnJlc1tpXS5uYW1lKTsKKwkJfQorCisJCWlmICh2ZGVjX2dlMmRfZGVidWcpCisJCQlwcl9pbmZvKCJjYW52YXMtYWxsb2MsIG5hbWU6JXMsIGNhbnZhcyBpZDolZFxuIiwKKwkJCQljYW5jaGUtPnJlc1tpXS5uYW1lLAorCQkJCWNhbmNoZS0+cmVzW2ldLmNpZCk7CisKKwkJaWYgKGNhbmNoZS0+cmVzW2ldLmNpZCA8PSAwKSB7CisJCQlwcl9lcnIoImNhbnZhcy1mYWlsLCBuYW1lOiVzLCBjYW52YXMgaWQ6JWQuXG4iLAorCQkJCWNhbmNoZS0+cmVzW2ldLm5hbWUsCisJCQkJY2FuY2hlLT5yZXNbaV0uY2lkKTsKKworCQkJbXV0ZXhfdW5sb2NrKCZjYW5jaGUtPmxvY2spOworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwlpZiAodmRlY19nZTJkX2RlYnVnKQorCQlwcl9pbmZvKCJjYW52YXMtZ2V0LCByZWY6JWRcbiIsIGNhbmNoZS0+cmVmKTsKKworCW11dGV4X3VubG9jaygmY2FuY2hlLT5sb2NrKTsKKwlyZXR1cm4gMDsKK2VycjoKKwl2ZGVjX2NhbnZhc19jYWNoZV9wdXQoZ2UyZCk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHZkZWNfY2FudmFzX2NhY2hlX2luaXQoc3RydWN0IHZkZWNfZ2UyZCAqZ2UyZCkKK3sKKwlnZTJkLT5jYW5jaGUucmVmID0gMDsKKwltdXRleF9pbml0KCZnZTJkLT5jYW5jaGUubG9jayk7CisKKwlwcl9pbmZvKCJjYW52YXMtaW5pdCwgcmVmOiVkXG4iLCBnZTJkLT5jYW5jaGUucmVmKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9zb3VyY2VfdHlwZShzdHJ1Y3QgdmZyYW1lX3MgKnZmKQoreworCWVudW0gdmlkZW9jb21fc291cmNlX3R5cGUgcmV0OworCWludCBpbnRlcmxhY2VfbW9kZTsKKworCWludGVybGFjZV9tb2RlID0gdmYtPnR5cGUgJiBWSURUWVBFX1RZUEVNQVNLOworCisJaWYgKCh2Zi0+Yml0ZGVwdGggJiBCSVRERVBUSF9ZMTApICAmJgorCQkoISh2Zi0+dHlwZSAmIFZJRFRZUEVfQ09NUFJFU1MpKSAmJgorCQkoZ2V0X2NwdV90eXBlKCkgPj0gTUVTT05fQ1BVX01BSk9SX0lEX1RYTCkpIHsKKwkJaWYgKGludGVybGFjZV9tb2RlID09IFZJRFRZUEVfSU5URVJMQUNFX1RPUCkKKwkJCXJldCA9IERFQ09ERVJfMTBCSVRfVE9QOworCQllbHNlIGlmIChpbnRlcmxhY2VfbW9kZSA9PSBWSURUWVBFX0lOVEVSTEFDRV9CT1RUT00pCisJCQlyZXQgPSBERUNPREVSXzEwQklUX0JPVFRPTTsKKwkJZWxzZQorCQkJcmV0ID0gREVDT0RFUl8xMEJJVF9OT1JNQUw7CisJfSBlbHNlIHsKKwkJaWYgKGludGVybGFjZV9tb2RlID09IFZJRFRZUEVfSU5URVJMQUNFX1RPUCkKKwkJCXJldCA9IERFQ09ERVJfOEJJVF9UT1A7CisJCWVsc2UgaWYgKGludGVybGFjZV9tb2RlID09IFZJRFRZUEVfSU5URVJMQUNFX0JPVFRPTSkKKwkJCXJldCA9IERFQ09ERVJfOEJJVF9CT1RUT007CisJCWVsc2UKKwkJCXJldCA9IERFQ09ERVJfOEJJVF9OT1JNQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnZXRfaW5wdXRfZm9ybWF0KHN0cnVjdCB2ZnJhbWVfcyAqdmYpCit7CisJaW50IGZvcm1hdCA9IEdFMkRfRk9STUFUX00yNF9ZVVY0MjA7CisJZW51bSB2aWRlb2NvbV9zb3VyY2VfdHlwZSBzb3VyZV90eXBlOworCisJc291cmVfdHlwZSA9IGdldF9zb3VyY2VfdHlwZSh2Zik7CisKKwlzd2l0Y2ggKHNvdXJlX3R5cGUpIHsKKwljYXNlIERFQ09ERVJfOEJJVF9OT1JNQUw6CisJCWlmICh2Zi0+dHlwZSAmIFZJRFRZUEVfVklVXzQyMikKKwkJCWZvcm1hdCA9IEdFMkRfRk9STUFUX1MxNl9ZVVY0MjI7CisJCWVsc2UgaWYgKHZmLT50eXBlICYgVklEVFlQRV9WSVVfTlYyMSkKKwkJCWZvcm1hdCA9IEdFMkRfRk9STUFUX00yNF9OVjIxOworCQllbHNlIGlmICh2Zi0+dHlwZSAmIFZJRFRZUEVfVklVX05WMTIpCisJCQlmb3JtYXQgPSBHRTJEX0ZPUk1BVF9NMjRfTlYxMjsKKwkJZWxzZSBpZiAodmYtPnR5cGUgJiBWSURUWVBFX1ZJVV80NDQpCisJCQlmb3JtYXQgPSBHRTJEX0ZPUk1BVF9TMjRfWVVWNDQ0OworCQllbHNlCisJCQlmb3JtYXQgPSBHRTJEX0ZPUk1BVF9NMjRfWVVWNDIwOworCQlicmVhazsKKwljYXNlIERFQ09ERVJfOEJJVF9CT1RUT006CisJCWlmICh2Zi0+dHlwZSAmIFZJRFRZUEVfVklVXzQyMikKKwkJCWZvcm1hdCA9IEdFMkRfRk9STUFUX1MxNl9ZVVY0MjIKKwkJCQl8IChHRTJEX0ZPUk1BVF9TMTZfWVVWNDIyQiAmICgzIDw8IDMpKTsKKwkJZWxzZSBpZiAodmYtPnR5cGUgJiBWSURUWVBFX1ZJVV9OVjIxKQorCQkJZm9ybWF0ID0gR0UyRF9GT1JNQVRfTTI0X05WMjEKKwkJCQl8IChHRTJEX0ZPUk1BVF9NMjRfTlYyMUIgJiAoMyA8PCAzKSk7CisJCWVsc2UgaWYgKHZmLT50eXBlICYgVklEVFlQRV9WSVVfTlYxMikKKwkJCWZvcm1hdCA9IEdFMkRfRk9STUFUX00yNF9OVjEyCisJCQkJfCAoR0UyRF9GT1JNQVRfTTI0X05WMTJCICYgKDMgPDwgMykpOworCQllbHNlIGlmICh2Zi0+dHlwZSAmIFZJRFRZUEVfVklVXzQ0NCkKKwkJCWZvcm1hdCA9IEdFMkRfRk9STUFUX1MyNF9ZVVY0NDQKKwkJCQl8IChHRTJEX0ZPUk1BVF9TMjRfWVVWNDQ0QiAmICgzIDw8IDMpKTsKKwkJZWxzZQorCQkJZm9ybWF0ID0gR0UyRF9GT1JNQVRfTTI0X1lVVjQyMAorCQkJCXwgKEdFMkRfRk1UX00yNF9ZVVY0MjBCICYgKDMgPDwgMykpOworCQlicmVhazsKKwljYXNlIERFQ09ERVJfOEJJVF9UT1A6CisJCWlmICh2Zi0+dHlwZSAmIFZJRFRZUEVfVklVXzQyMikKKwkJCWZvcm1hdCA9IEdFMkRfRk9STUFUX1MxNl9ZVVY0MjIKKwkJCQl8IChHRTJEX0ZPUk1BVF9TMTZfWVVWNDIyVCAmICgzIDw8IDMpKTsKKwkJZWxzZSBpZiAodmYtPnR5cGUgJiBWSURUWVBFX1ZJVV9OVjIxKQorCQkJZm9ybWF0ID0gR0UyRF9GT1JNQVRfTTI0X05WMjEKKwkJCQl8IChHRTJEX0ZPUk1BVF9NMjRfTlYyMVQgJiAoMyA8PCAzKSk7CisJCWVsc2UgaWYgKHZmLT50eXBlICYgVklEVFlQRV9WSVVfTlYxMikKKwkJCWZvcm1hdCA9IEdFMkRfRk9STUFUX00yNF9OVjEyCisJCQkJfCAoR0UyRF9GT1JNQVRfTTI0X05WMTJUICYgKDMgPDwgMykpOworCQllbHNlIGlmICh2Zi0+dHlwZSAmIFZJRFRZUEVfVklVXzQ0NCkKKwkJCWZvcm1hdCA9IEdFMkRfRk9STUFUX1MyNF9ZVVY0NDQKKwkJCQl8IChHRTJEX0ZPUk1BVF9TMjRfWVVWNDQ0VCAmICgzIDw8IDMpKTsKKwkJZWxzZQorCQkJZm9ybWF0ID0gR0UyRF9GT1JNQVRfTTI0X1lVVjQyMAorCQkJCXwgKEdFMkRfRk1UX00yNF9ZVVY0MjBUICYgKDMgPDwgMykpOworCQlicmVhazsKKwljYXNlIERFQ09ERVJfMTBCSVRfTk9STUFMOgorCQlpZiAodmYtPnR5cGUgJiBWSURUWVBFX1ZJVV80MjIpIHsKKwkJCWlmICh2Zi0+Yml0ZGVwdGggJiBGVUxMX1BBQ0tfNDIyX01PREUpCisJCQkJZm9ybWF0ID0gR0UyRF9GT1JNQVRfUzE2XzEwQklUX1lVVjQyMjsKKwkJCWVsc2UKKwkJCQlmb3JtYXQgPSBHRTJEX0ZPUk1BVF9TMTZfMTJCSVRfWVVWNDIyOworCQl9CisJCWJyZWFrOworCWNhc2UgREVDT0RFUl8xMEJJVF9CT1RUT006CisJCWlmICh2Zi0+dHlwZSAmIFZJRFRZUEVfVklVXzQyMikgeworCQkJaWYgKHZmLT5iaXRkZXB0aCAmIEZVTExfUEFDS180MjJfTU9ERSkKKwkJCQlmb3JtYXQgPSBHRTJEX0ZPUk1BVF9TMTZfMTBCSVRfWVVWNDIyCisJCQkJCXwgKEdFMkRfRk9STUFUX1MxNl8xMEJJVF9ZVVY0MjJCCisJCQkJCSYgKDMgPDwgMykpOworCQkJZWxzZQorCQkJCWZvcm1hdCA9IEdFMkRfRk9STUFUX1MxNl8xMkJJVF9ZVVY0MjIKKwkJCQkJfCAoR0UyRF9GT1JNQVRfUzE2XzEyQklUX1lVVjQyMkIKKwkJCQkJJiAoMyA8PCAzKSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBERUNPREVSXzEwQklUX1RPUDoKKwkJaWYgKHZmLT50eXBlICYgVklEVFlQRV9WSVVfNDIyKSB7CisJCQlpZiAodmYtPmJpdGRlcHRoICYgRlVMTF9QQUNLXzQyMl9NT0RFKQorCQkJCWZvcm1hdCA9IEdFMkRfRk9STUFUX1MxNl8xMEJJVF9ZVVY0MjIKKwkJCQkJfCAoR0UyRF9GT1JNQVRfUzE2XzEwQklUX1lVVjQyMlQKKwkJCQkJJiAoMyA8PCAzKSk7CisJCQllbHNlCisJCQkJZm9ybWF0ID0gR0UyRF9GT1JNQVRfUzE2XzEyQklUX1lVVjQyMgorCQkJCQl8IChHRTJEX0ZPUk1BVF9TMTZfMTJCSVRfWVVWNDIyVAorCQkJCQkmICgzIDw8IDMpKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlmb3JtYXQgPSBHRTJEX0ZPUk1BVF9NMjRfWVVWNDIwOworCX0KKwlyZXR1cm4gZm9ybWF0OworfQorCitpbnQgdmRlY19nZTJkX2luaXQoc3RydWN0IHZkZWNfZ2UyZCoqIGdlMmRfaGFuZGxlLCBpbnQgbW9kZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCB2ZGVjX2dlMmQgKmdlMmQ7CisKKwlpZiAoIWdlMmRfaGFuZGxlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWdlMmQgPSBremFsbG9jKHNpemVvZigqZ2UyZCksIEdGUF9LRVJORUwpOworCWlmICghZ2UyZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl2ZGVjX2NhbnZhc19jYWNoZV9pbml0KGdlMmQpOworCisJZ2UyZC0+d29ya19tb2RlID0gbW9kZTsKKwlpZiAoIWdlMmQtPndvcmtfbW9kZSkgeworCQlnZTJkLT53b3JrX21vZGUgPSBHRTJEX01PREVfQ09OVkVSVF9MRTsKKwl9CisJcHJfaW5mbygidmRlY19nZTJkX2luaXQgd29ya19tb2RlOiVkXG4iLCBnZTJkLT53b3JrX21vZGUpOworCisJZ2UyZC0+Z2UyZF9jb250ZXh0ID0gY3JlYXRlX2dlMmRfd29ya19xdWV1ZSgpOworCWlmICghZ2UyZC0+Z2UyZF9jb250ZXh0KSB7CisJCXByX2VycigiZ2UyZF9jcmVhdGVfaW5zdGFuY2UgZmFpbFxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKHZkZWNfY2FudmFzX2NhY2hlX2dldChnZTJkLCAidmRlYy1nZTJkLWRlYyIpIDwgMCkgeworCQlwcl9lcnIoImNhbnZhcyBwb29sIGFsbG9jIGZhaWwuIHNyYyglZCwgJWQsICVkKSBkc3QoJWQsICVkLCAlZCkuXG4iLAorCQkJZ2UyZC0+Y2FuY2hlLnJlc1swXS5jaWQsCisJCQlnZTJkLT5jYW5jaGUucmVzWzFdLmNpZCwKKwkJCWdlMmQtPmNhbmNoZS5yZXNbMl0uY2lkLAorCQkJZ2UyZC0+Y2FuY2hlLnJlc1szXS5jaWQsCisJCQlnZTJkLT5jYW5jaGUucmVzWzRdLmNpZCwKKwkJCWdlMmQtPmNhbmNoZS5yZXNbNV0uY2lkKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjE7CisJfQorCisJKmdlMmRfaGFuZGxlID0gZ2UyZDsKKworCXJldHVybiAwOworZXJyb3IxOgorCWRlc3Ryb3lfZ2UyZF93b3JrX3F1ZXVlKGdlMmQtPmdlMmRfY29udGV4dCk7CitlcnJvcjoKKwlrZnJlZShnZTJkKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfZ2UyZF9pbml0KTsKKworaW50IHZkZWNfZ2UyZF9jb3B5X2RhdGEoc3RydWN0IHZkZWNfZ2UyZCAqZ2UyZCwgc3RydWN0IHZkZWNfZ2UyZF9pbmZvICpnZTJkX2luZm8pCit7CisJc3RydWN0IGNvbmZpZ19wYXJhX2V4X3MgZ2UyZF9jb25maWc7CisJdTMyIHNyY19mbXQgPSAwLCBkc3RfZm10ID0gMDsKKwlzdHJ1Y3QgY2FudmFzX3MgY2Q7CisKKwlpZiAoIWdlMmQpCisJCXJldHVybiAtMTsKKworCWlmICh2ZGVjX2dlMmRfZGVidWcpCisJCXByX2luZm8oInZkZWNfZ2UyZF9jb3B5X2RhdGEgc3RhcnRcbiIpOworCisJbWVtc2V0KCZnZTJkX2NvbmZpZywgMCwgc2l6ZW9mKGdlMmRfY29uZmlnKSk7CisKKwlzcmNfZm10ID0gZ2V0X2lucHV0X2Zvcm1hdChnZTJkX2luZm8tPmRzdF92Zik7CisJaWYgKGdlMmRfaW5mby0+c3JjX2NhbnZhczBfY29uZmlnWzBdLmVuZGlhbiA9PSA3KQorCQlzcmNfZm10IHw9IEdFMkRfQklHX0VORElBTjsKKwllbHNlCisJCXNyY19mbXQgfD0gR0UyRF9MSVRUTEVfRU5ESUFOOworCisJLyogbmVnb3RpYXRlIGZvcm1hdCBvZiBkZXN0aW5hdGlvbiAqLworCWRzdF9mbXQgPSBnZXRfaW5wdXRfZm9ybWF0KGdlMmRfaW5mby0+ZHN0X3ZmKTsKKwlpZiAoZ2UyZC0+d29ya19tb2RlICYgR0UyRF9NT0RFX0NPTlZFUlRfTlYxMikKKwkJZHN0X2ZtdCB8PSBHRTJEX0ZPUk1BVF9NMjRfTlYxMjsKKwllbHNlIGlmIChnZTJkLT53b3JrX21vZGUgJiBHRTJEX01PREVfQ09OVkVSVF9OVjIxKQorCQlkc3RfZm10IHw9IEdFMkRfRk9STUFUX00yNF9OVjIxOworCisJaWYgKGdlMmQtPndvcmtfbW9kZSAmIEdFMkRfTU9ERV9DT05WRVJUX0xFKQorCQlkc3RfZm10IHw9IEdFMkRfTElUVExFX0VORElBTjsKKwllbHNlCisJCWRzdF9mbXQgfD0gR0UyRF9CSUdfRU5ESUFOOworCisJaWYgKChkc3RfZm10ICYgR0UyRF9DT0xPUl9NQVBfTUFTSykgPT0gR0UyRF9DT0xPUl9NQVBfTlYxMikgeworCQlnZTJkX2luZm8tPmRzdF92Zi0+dHlwZSB8PSBWSURUWVBFX1ZJVV9OVjEyOworCQlnZTJkX2luZm8tPmRzdF92Zi0+dHlwZSAmPSB+VklEVFlQRV9WSVVfTlYyMTsKKwl9IGVsc2UgaWYgKChkc3RfZm10ICYgR0UyRF9DT0xPUl9NQVBfTUFTSykgPT0gR0UyRF9DT0xPUl9NQVBfTlYyMSkgeworCQlnZTJkX2luZm8tPmRzdF92Zi0+dHlwZSB8PSBWSURUWVBFX1ZJVV9OVjIxOworCQlnZTJkX2luZm8tPmRzdF92Zi0+dHlwZSAmPSB+VklEVFlQRV9WSVVfTlYxMjsKKwl9CisJaWYgKChkc3RfZm10ICYgR0UyRF9FTkRJQU5fTUFTSykgPT0gR0UyRF9MSVRUTEVfRU5ESUFOKSB7CisJCWdlMmRfaW5mby0+ZHN0X3ZmLT5jYW52YXMwX2NvbmZpZ1swXS5lbmRpYW4gPSAwOworCQlnZTJkX2luZm8tPmRzdF92Zi0+Y2FudmFzMF9jb25maWdbMV0uZW5kaWFuID0gMDsKKwkJZ2UyZF9pbmZvLT5kc3RfdmYtPmNhbnZhczBfY29uZmlnWzJdLmVuZGlhbiA9IDA7CisJfSBlbHNlIGlmICgoZHN0X2ZtdCAmIEdFMkRfRU5ESUFOX01BU0spID09IEdFMkRfQklHX0VORElBTil7CisJCWdlMmRfaW5mby0+ZHN0X3ZmLT5jYW52YXMwX2NvbmZpZ1swXS5lbmRpYW4gPSA3OworCQlnZTJkX2luZm8tPmRzdF92Zi0+Y2FudmFzMF9jb25maWdbMV0uZW5kaWFuID0gNzsKKwkJZ2UyZF9pbmZvLT5kc3RfdmYtPmNhbnZhczBfY29uZmlnWzJdLmVuZGlhbiA9IDc7CisJfQorCisJZ2UyZF9pbmZvLT5kc3RfdmYtPm1lbV9zZWMgPSBnZTJkX2luZm8tPmRzdF92Zi0+ZmxhZyAmIFZGUkFNRV9GTEFHX1ZJREVPX1NFQ1VSRSA/IDEgOiAwOworCisJbXV0ZXhfbG9jaygmZ2UyZC0+Y2FuY2hlLmxvY2spOworCisJLyogc3JjIGNhbnZhcyBjb25maWd1cmUuICovCisJaWYgKChnZTJkX2luZm8tPmRzdF92Zi0+Y2FudmFzMEFkZHIgPT0gMCkgfHwKKwkJKGdlMmRfaW5mby0+ZHN0X3ZmLT5jYW52YXMwQWRkciA9PSAodTMyKS0xKSkgeworCQljYW52YXNfY29uZmlnX2NvbmZpZyhnZTJkLT5jYW5jaGUucmVzWzBdLmNpZCwgJmdlMmRfaW5mby0+c3JjX2NhbnZhczBfY29uZmlnWzBdKTsKKwkJY2FudmFzX2NvbmZpZ19jb25maWcoZ2UyZC0+Y2FuY2hlLnJlc1sxXS5jaWQsICZnZTJkX2luZm8tPnNyY19jYW52YXMwX2NvbmZpZ1sxXSk7CisJCWNhbnZhc19jb25maWdfY29uZmlnKGdlMmQtPmNhbmNoZS5yZXNbMl0uY2lkLCAmZ2UyZF9pbmZvLT5zcmNfY2FudmFzMF9jb25maWdbMl0pOworCQlnZTJkX2NvbmZpZy5zcmNfcGFyYS5jYW52YXNfaW5kZXggPQorCQkJZ2UyZC0+Y2FuY2hlLnJlc1swXS5jaWQgfAorCQkJZ2UyZC0+Y2FuY2hlLnJlc1sxXS5jaWQgPDwgOCB8CisJCQlnZTJkLT5jYW5jaGUucmVzWzJdLmNpZCA8PCAxNjsKKworCQlnZTJkX2NvbmZpZy5zcmNfcGxhbmVzWzBdLmFkZHIgPQorCQkJZ2UyZF9pbmZvLT5zcmNfY2FudmFzMF9jb25maWdbMF0ucGh5X2FkZHI7CisJCWdlMmRfY29uZmlnLnNyY19wbGFuZXNbMF0udyA9CisJCQlnZTJkX2luZm8tPnNyY19jYW52YXMwX2NvbmZpZ1swXS53aWR0aDsKKwkJZ2UyZF9jb25maWcuc3JjX3BsYW5lc1swXS5oID0KKwkJCWdlMmRfaW5mby0+c3JjX2NhbnZhczBfY29uZmlnWzBdLmhlaWdodDsKKwkJZ2UyZF9jb25maWcuc3JjX3BsYW5lc1sxXS5hZGRyID0KKwkJCWdlMmRfaW5mby0+c3JjX2NhbnZhczBfY29uZmlnWzFdLnBoeV9hZGRyOworCQlnZTJkX2NvbmZpZy5zcmNfcGxhbmVzWzFdLncgPQorCQkJZ2UyZF9pbmZvLT5zcmNfY2FudmFzMF9jb25maWdbMV0ud2lkdGg7CisJCWdlMmRfY29uZmlnLnNyY19wbGFuZXNbMV0uaCA9CisJCQlnZTJkX2luZm8tPnNyY19jYW52YXMwX2NvbmZpZ1sxXS5oZWlnaHQ7CisJCWdlMmRfY29uZmlnLnNyY19wbGFuZXNbMl0uYWRkciA9CisJCQlnZTJkX2luZm8tPnNyY19jYW52YXMwX2NvbmZpZ1syXS5waHlfYWRkcjsKKwkJZ2UyZF9jb25maWcuc3JjX3BsYW5lc1syXS53ID0KKwkJCWdlMmRfaW5mby0+c3JjX2NhbnZhczBfY29uZmlnWzJdLndpZHRoOworCQlnZTJkX2NvbmZpZy5zcmNfcGxhbmVzWzJdLmggPQorCQkJZ2UyZF9pbmZvLT5zcmNfY2FudmFzMF9jb25maWdbMl0uaGVpZ2h0OworCX0gZWxzZSB7CisJCWdlMmRfY29uZmlnLnNyY19wYXJhLmNhbnZhc19pbmRleCA9IGdlMmRfaW5mby0+c3JjX2NhbnZhczBBZGRyOworCX0KKwlnZTJkX2NvbmZpZy5zcmNfcGFyYS5tZW1fdHlwZQk9IENBTlZBU19UWVBFX0lOVkFMSUQ7CisJZ2UyZF9jb25maWcuc3JjX3BhcmEuZm9ybWF0ID0gc3JjX2ZtdDsKKwlnZTJkX2NvbmZpZy5zcmNfcGFyYS5maWxsX2NvbG9yX2VuID0gMDsKKwlnZTJkX2NvbmZpZy5zcmNfcGFyYS5maWxsX21vZGUJPSAwOworCWdlMmRfY29uZmlnLnNyY19wYXJhLnhfcmV2CT0gMDsKKwlnZTJkX2NvbmZpZy5zcmNfcGFyYS55X3Jldgk9IDA7CisJZ2UyZF9jb25maWcuc3JjX3BhcmEuY29sb3IJPSAweGZmZmZmZmZmOworCWdlMmRfY29uZmlnLnNyY19wYXJhLnRvcAk9IDA7CisJZ2UyZF9jb25maWcuc3JjX3BhcmEubGVmdAk9IDA7CisJZ2UyZF9jb25maWcuc3JjX3BhcmEud2lkdGgJPSBnZTJkX2luZm8tPmRzdF92Zi0+d2lkdGg7CisJaWYgKGdlMmRfaW5mby0+ZHN0X3ZmLT50eXBlICYgVklEVFlQRV9JTlRFUkxBQ0UpCisJCWdlMmRfY29uZmlnLnNyY19wYXJhLmhlaWdodCA9IGdlMmRfaW5mby0+ZHN0X3ZmLT5oZWlnaHQgPj4gMTsKKwllbHNlCisJCWdlMmRfY29uZmlnLnNyY19wYXJhLmhlaWdodCA9IGdlMmRfaW5mby0+ZHN0X3ZmLT5oZWlnaHQ7CisKKwkvKiBkc3QgY2FudmFzIGNvbmZpZ3VyZS4gKi8KKwljYW52YXNfY29uZmlnX2NvbmZpZyhnZTJkLT5jYW5jaGUucmVzWzNdLmNpZCwgJmdlMmRfaW5mby0+ZHN0X3ZmLT5jYW52YXMwX2NvbmZpZ1swXSk7CisJaWYgKChnZTJkX2NvbmZpZy5zcmNfcGFyYS5mb3JtYXQgJiAweGZmZmZmKSA9PSBHRTJEX0ZPUk1BVF9NMjRfWVVWNDIwKSB7CisJCWdlMmRfaW5mby0+ZHN0X3ZmLT5jYW52YXMwX2NvbmZpZ1sxXS53aWR0aCA8PD0gMTsKKwl9CisJY2FudmFzX2NvbmZpZ19jb25maWcoZ2UyZC0+Y2FuY2hlLnJlc1s0XS5jaWQsICZnZTJkX2luZm8tPmRzdF92Zi0+Y2FudmFzMF9jb25maWdbMV0pOworCWNhbnZhc19jb25maWdfY29uZmlnKGdlMmQtPmNhbmNoZS5yZXNbNV0uY2lkLCAmZ2UyZF9pbmZvLT5kc3RfdmYtPmNhbnZhczBfY29uZmlnWzJdKTsKKwlnZTJkX2NvbmZpZy5kc3RfcGFyYS5jYW52YXNfaW5kZXggPQorCQlnZTJkLT5jYW5jaGUucmVzWzNdLmNpZCB8CisJCWdlMmQtPmNhbmNoZS5yZXNbNF0uY2lkIDw8IDg7CisJY2FudmFzX3JlYWQoZ2UyZC0+Y2FuY2hlLnJlc1szXS5jaWQsICZjZCk7CisJZ2UyZF9jb25maWcuZHN0X3BsYW5lc1swXS5hZGRyCT0gY2QuYWRkcjsKKwlnZTJkX2NvbmZpZy5kc3RfcGxhbmVzWzBdLncJPSBjZC53aWR0aDsKKwlnZTJkX2NvbmZpZy5kc3RfcGxhbmVzWzBdLmgJPSBjZC5oZWlnaHQ7CisJY2FudmFzX3JlYWQoZ2UyZC0+Y2FuY2hlLnJlc1s0XS5jaWQsICZjZCk7CisJZ2UyZF9jb25maWcuZHN0X3BsYW5lc1sxXS5hZGRyCT0gY2QuYWRkcjsKKwlnZTJkX2NvbmZpZy5kc3RfcGxhbmVzWzFdLncJPSBjZC53aWR0aDsKKwlnZTJkX2NvbmZpZy5kc3RfcGxhbmVzWzFdLmgJPSBjZC5oZWlnaHQ7CisKKwlnZTJkX2NvbmZpZy5kc3RfcGFyYS5mb3JtYXQJPSAgZHN0X2ZtdDsKKwlnZTJkX2NvbmZpZy5kc3RfcGFyYS53aWR0aAk9IGdlMmRfaW5mby0+ZHN0X3ZmLT53aWR0aDsKKwlnZTJkX2NvbmZpZy5kc3RfcGFyYS5oZWlnaHQJPSBnZTJkX2luZm8tPmRzdF92Zi0+aGVpZ2h0OworCWdlMmRfY29uZmlnLmRzdF9wYXJhLm1lbV90eXBlCT0gQ0FOVkFTX1RZUEVfSU5WQUxJRDsKKwlnZTJkX2NvbmZpZy5kc3RfcGFyYS5maWxsX2NvbG9yX2VuID0gMDsKKwlnZTJkX2NvbmZpZy5kc3RfcGFyYS5maWxsX21vZGUJPSAwOworCWdlMmRfY29uZmlnLmRzdF9wYXJhLnhfcmV2CT0gMDsKKwlnZTJkX2NvbmZpZy5kc3RfcGFyYS55X3Jldgk9IDA7CisJZ2UyZF9jb25maWcuZHN0X3BhcmEuY29sb3IJPSAwOworCWdlMmRfY29uZmlnLmRzdF9wYXJhLnRvcAk9IDA7CisJZ2UyZF9jb25maWcuZHN0X3BhcmEubGVmdAk9IDA7CisKKwkvKiBvdGhlciBnZTJkIHBhcmFtZXRlcnMgY29uZmlndXJlLiAqLworCWdlMmRfY29uZmlnLnNyY19rZXkua2V5X2VuYWJsZQk9IDA7CisJZ2UyZF9jb25maWcuc3JjX2tleS5rZXlfbWFzawk9IDA7CisJZ2UyZF9jb25maWcuc3JjX2tleS5rZXlfbW9kZQk9IDA7CisJZ2UyZF9jb25maWcuYWx1X2NvbnN0X2NvbG9yCT0gMDsKKwlnZTJkX2NvbmZpZy5iaXRtYXNrX2VuCQk9IDA7CisJZ2UyZF9jb25maWcuc3JjMV9nYl9hbHBoYQk9IDA7CisJZ2UyZF9jb25maWcuZHN0X3h5X3N3YXAJCT0gMDsKKwlnZTJkX2NvbmZpZy5zcmMyX3BhcmEubWVtX3R5cGUJPSBDQU5WQVNfVFlQRV9JTlZBTElEOworCWdlMmRfY29uZmlnLm1lbV9zZWMJPSBnZTJkX2luZm8tPmRzdF92Zi0+ZmxhZyAmIFZGUkFNRV9GTEFHX1ZJREVPX1NFQ1VSRSA/IDEgOiAwOworCisJaWYgKGdlMmRfY29udGV4dF9jb25maWdfZXgoZ2UyZC0+Z2UyZF9jb250ZXh0LCAmZ2UyZF9jb25maWcpIDwgMCkgeworCQlwcl9lcnIoInZkZWNfZ2UyZF9jb250ZXh0X2NvbmZpZ19leCBlcnJvci5cbiIpOworCQltdXRleF91bmxvY2soJmdlMmQtPmNhbmNoZS5sb2NrKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICghKGdlMmRfaW5mby0+ZHN0X3ZmLT50eXBlICYgVklEVFlQRV9WNExfRU9TKSkgeworCQlpZiAoZ2UyZF9pbmZvLT5kc3RfdmYtPnR5cGUgJiBWSURUWVBFX0lOVEVSTEFDRSkgeworCQkJc3RyZXRjaGJsdF9ub2FscGhhKGdlMmQtPmdlMmRfY29udGV4dCwKKwkJCQkwLCAwLCBnZTJkX2luZm8tPmRzdF92Zi0+d2lkdGgsIGdlMmRfaW5mby0+ZHN0X3ZmLT5oZWlnaHQgLyAyLAorCQkJCTAsIDAsIGdlMmRfaW5mby0+ZHN0X3ZmLT53aWR0aCwgZ2UyZF9pbmZvLT5kc3RfdmYtPmhlaWdodCk7CisJCX0gZWxzZSB7CisJCQlzdHJldGNoYmx0X25vYWxwaGEoZ2UyZC0+Z2UyZF9jb250ZXh0LAorCQkJCTAsIDAsIGdlMmRfaW5mby0+ZHN0X3ZmLT53aWR0aCwgZ2UyZF9pbmZvLT5kc3RfdmYtPmhlaWdodCwKKwkJCQkwLCAwLCBnZTJkX2luZm8tPmRzdF92Zi0+d2lkdGgsIGdlMmRfaW5mby0+ZHN0X3ZmLT5oZWlnaHQpOworCQl9CisJfQorCW11dGV4X3VubG9jaygmZ2UyZC0+Y2FuY2hlLmxvY2spOworCWlmICh2ZGVjX2dlMmRfZGVidWcpCisJCXByX2luZm8oInZkZWNfZ2UyZF9jb3B5X2RhdGEgZG9uZVxuIik7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19nZTJkX2NvcHlfZGF0YSk7CisKK2ludCB2ZGVjX2dlMmRfZGVzdHJveShzdHJ1Y3QgdmRlY19nZTJkICpnZTJkKQoreworCWlmICghZ2UyZCkKKwkJcmV0dXJuIC0xOworCisJcHJfaW5mbygidmRlYyBnZTJkIGRlc3Ryb3kgYmVnaW5cbiIpOworCisJZGVzdHJveV9nZTJkX3dvcmtfcXVldWUoZ2UyZC0+Z2UyZF9jb250ZXh0KTsKKwl2ZGVjX2NhbnZhc19jYWNoZV9wdXQoZ2UyZCk7CisJa2ZyZWUoZ2UyZCk7CisKKwlwcl9pbmZvKCJ2ZGVjIGdlMmQgZGVzdHJveSBkb25lXG4iKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX2dlMmRfZGVzdHJveSk7CisKK21vZHVsZV9wYXJhbSh2ZGVjX2dlMmRfZGVidWcsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHZkZWNfZ2UyZF9kZWJ1ZywgIlxuIHZkZWNfZ2UyZF9kZWJ1Z1xuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdmRlY19nZTJkX3V0aWxzLmggYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdmRlY19nZTJkX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEwMThmNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjX2dlMmRfdXRpbHMuaApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIERlc2NyaXB0aW9uOgorICovCisjaWZuZGVmIF9fR0UyRF9VVElMU19IX18KKyNkZWZpbmUgX19HRTJEX1VUSUxTX0hfXworCisvLyNpbmNsdWRlICIuLi8uLi8uLi9hbXZkZWNfcG9ydHMvYW1sX3Zjb2RlY19kcnYuaCIKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWUuaD4KKworCisvKiBkZWZpbmUgZ2UyZCB3b3JrIG1vZGUuICovCisjZGVmaW5lIEdFMkRfTU9ERV9DT05WRVJUX05WMTIJCSgxIDw8IDApCisjZGVmaW5lIEdFMkRfTU9ERV9DT05WRVJUX05WMjEJCSgxIDw8IDEpCisjZGVmaW5lIEdFMkRfTU9ERV9DT05WRVJUX0xFCQkoMSA8PCAyKQorI2RlZmluZSBHRTJEX01PREVfQ09OVkVSVF9CRQkJKDEgPDwgMykKKyNkZWZpbmUgR0UyRF9NT0RFX1NFUEFSQVRFX0ZJRUxECSgxIDw8IDQpCisjZGVmaW5lIEdFMkRfTU9ERV80MjJfVE9fNDIwCQkoMSA8PCA1KQorCitzdHJ1Y3QgdmRlY19jYW52YXNfcmVzIHsKKwlpbnQJY2lkOworCXU4CW5hbWVbMzJdOworfTsKKworc3RydWN0IHZkZWNfY2FudmFzX2NhY2hlIHsKKwlpbnQJcmVmOworCXN0cnVjdCB2ZGVjX2NhbnZhc19yZXMJcmVzWzZdOworCXN0cnVjdCBtdXRleAkJbG9jazsKK307CisKK3N0cnVjdCB2ZGVjX2dlMmQgeworCXUzMgl3b3JrX21vZGU7IC8qIGVudW0gZ2UyZF93b3JrX21vZGUgKi8KKwlzdHJ1Y3QgZ2UyZF9jb250ZXh0X3MJKmdlMmRfY29udGV4dDsgLyogaGFuZGxlIG9mIEdFMkQgKi8KKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHgJKmN0eDsKKwlzdHJ1Y3QgdmRlY19jYW52YXNfY2FjaGUJY2FuY2hlOworCXZvaWQgKmh3OworfTsKKworc3RydWN0IHZkZWNfZ2UyZF9pbmZvIHsKKwlzdHJ1Y3QgdmZyYW1lX3MgKmRzdF92ZjsKKwl1MzIgc3JjX2NhbnZhczBBZGRyOworCXUzMiBzcmNfY2FudmFzMUFkZHI7OworCXN0cnVjdCBjYW52YXNfY29uZmlnX3Mgc3JjX2NhbnZhczBfY29uZmlnWzNdOworCXN0cnVjdCBjYW52YXNfY29uZmlnX3Mgc3JjX2NhbnZhczFfY29uZmlnWzNdOworfTsKKworaW50IHZkZWNfZ2UyZF9pbml0KHN0cnVjdCB2ZGVjX2dlMmQqKiBnZTJkX2hhbmRsZSwgaW50IG1vZGUpOworCitpbnQgdmRlY19nZTJkX2NvcHlfZGF0YShzdHJ1Y3QgdmRlY19nZTJkICpnZTJkLCBzdHJ1Y3QgdmRlY19nZTJkX2luZm8gKmdlMmRfaW5mbyk7CisKK2ludCB2ZGVjX2dlMmRfZGVzdHJveShzdHJ1Y3QgdmRlY19nZTJkICpnZTJkKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjX2lucHV0LmMgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdmRlY19pbnB1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZWMwYWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdmRlY19pbnB1dC5jCkBAIC0wLDAgKzEsMTIxOCBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9tZWRpYS9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWNfaW5wdXQuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvZGVjX21tLmg+CisjaW5jbHVkZSAiLi4vLi4vLi4vc3RyZWFtX2lucHV0L2FtcG9ydHMvYW1wb3J0c19wcml2LmgiCisjaW5jbHVkZSAidmRlYy5oIgorI2luY2x1ZGUgInZkZWNfaW5wdXQuaCIKKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisKKyNkZWZpbmUgVkZSQU1FX0JMT0NLX1NJWkUgKDUxMiAqIFNaXzFLKS8qNTEyIGZvciAxMDgwcCBkZWZhdWx0IGluaXQuKi8KKyNkZWZpbmUgVkZSQU1FX0JMT0NLX1NJWkVfNEsgKDIgKiBTWl8xTSkgLyoyTSBmb3IgNEsgZGVmYXVsdC4qLworI2RlZmluZSBWRlJBTUVfQkxPQ0tfU0laRV9NQVggKDQgKiBTWl8xTSkKKworI2RlZmluZSBWRlJBTUVfQkxPQ0tfUEFHRUFMSUdOIDQKKyNkZWZpbmUgVkZSQU1FX0JMT0NLX01JTl9MRVZFTCAoMiAqIFNaXzFNKQorI2RlZmluZSBWRlJBTUVfQkxPQ0tfTUFYX0xFVkVMICg4ICogU1pfMU0pCisjZGVmaW5lIFZGUkFNRV9CTE9DS19NQVhfVE9UQUxfU0laRSAoMTYgKiBTWl8xTSkKKworLyoKKzJzIGZvciBPTVgKKyovCisjZGVmaW5lIE1BWF9GUkFNRV9EVVJBVElPTl9TIDIKKworCisjZGVmaW5lIFZGUkFNRV9CTE9DS19IT0xFIChTWl82NEspCisKKyNkZWZpbmUgTUlOX0ZSQU1FX1BBRERJTkdfU0laRSAoKHUzMikoTDFfQ0FDSEVfQllURVMpKQorCisjZGVmaW5lIEVYVFJBX1BBRERJTkdfU0laRSAgKDE2ICogU1pfMUspIC8qSEVWQ19QQURESU5HX1NJWkUqLworCisjZGVmaW5lIE1FTV9OQU1FICJWRlJBTUVfSU5QVVQiCisKKy8vc3RhdGljIGludCB2ZGVjX2lucHV0X2dldF9kdXJhdGlvbl91NjQoc3RydWN0IHZkZWNfaW5wdXRfcyAqaW5wdXQpOworc3RhdGljIHN0cnVjdCB2ZnJhbWVfYmxvY2tfbGlzdF9zICoKKwl2ZGVjX2lucHV0X2FsbG9jX25ld19ibG9jayhzdHJ1Y3QgdmRlY19pbnB1dF9zICppbnB1dCwKKwl1bG9uZyBwaHlfYWRkciwKKwlpbnQgc2l6ZSwKKwljaHVua19mcmVlIGZyZWUsCisJdm9pZCogcHJpdik7CisKK3N0YXRpYyBpbnQgYW1sX2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bG9uZyBuKQoreworCWludCByZXQgPTA7CisKKwlpZiAobGlrZWx5KGFjY2Vzc19vayhmcm9tLCBuKSkpCisJCXJldCA9IGNvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKTsKKwllbHNlCisJCW1lbWNweSh0bywgZnJvbSwgbik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNvcHlfZnJvbV91c2VyX3RvX3BoeWFkZHIodm9pZCAqdmlydHMsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCXUzMiBzaXplLCB1bG9uZyBwaHlzLCB1MzIgcGFkaW5nLCBib29sIGlzX21hcHBlZCkKK3sKKwl1MzIgaSwgc3BhbiA9IFNaXzFNOworCXUzMiBjb3VudCA9IHNpemUgLyBQQUdFX0FMSUdOKHNwYW4pOworCXUzMiByZW1haW4gPSBzaXplICUgUEFHRV9BTElHTihzcGFuKTsKKwl1bG9uZyBhZGRyID0gcGh5czsKKwl1OCAqcCA9IHZpcnRzOworCisJaWYgKGlzX21hcHBlZCkgeworCQlpZiAoYW1sX2NvcHlfZnJvbV91c2VyKHAsIGJ1Ziwgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAocGFkaW5nKQorCQkJbWVtc2V0KHAgKyBzaXplLCAwLCBwYWRpbmcpOworCisJCWNvZGVjX21tX2RtYV9mbHVzaChwLCBzaXplICsgcGFkaW5nLCBETUFfVE9fREVWSUNFKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlhZGRyID0gcGh5cyArIGkgKiBzcGFuOworCQlwID0gY29kZWNfbW1fdm1hcChhZGRyLCBzcGFuKTsKKwkJaWYgKCFwKQorCQkJcmV0dXJuIC0xOworCisJCWlmIChhbWxfY29weV9mcm9tX3VzZXIocCwgYnVmICsgaSAqIHNwYW4sIHNwYW4pKSB7CisJCQljb2RlY19tbV91bm1hcF9waHlhZGRyKHApOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQljb2RlY19tbV9kbWFfZmx1c2gocCwgc3BhbiwgRE1BX1RPX0RFVklDRSk7CisJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIocCk7CisJfQorCisJaWYgKCFyZW1haW4pCisJCXJldHVybiAwOworCisJc3BhbiA9IHNpemUgLSByZW1haW47CisJYWRkciA9IHBoeXMgKyBzcGFuOworCXAgPSBjb2RlY19tbV92bWFwKGFkZHIsIHJlbWFpbiArIHBhZGluZyk7CisJaWYgKCFwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoYW1sX2NvcHlfZnJvbV91c2VyKHAsIGJ1ZiArIHNwYW4sIHJlbWFpbikpIHsKKwkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcihwKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKHBhZGluZykKKwkJbWVtc2V0KHAgKyByZW1haW4sIDAsIHBhZGluZyk7CisKKwljb2RlY19tbV9kbWFfZmx1c2gocCwgcmVtYWluICsgcGFkaW5nLCBETUFfVE9fREVWSUNFKTsKKwljb2RlY19tbV91bm1hcF9waHlhZGRyKHApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmZyYW1lX2NodW5rX2ZpbGwoc3RydWN0IHZkZWNfaW5wdXRfcyAqaW5wdXQsCisJCQlzdHJ1Y3QgdmZyYW1lX2NodW5rX3MgKmNodW5rLCBjb25zdCBjaGFyICpidWYsCisJCQlzaXplX3QgY291bnQsIHN0cnVjdCB2ZnJhbWVfYmxvY2tfbGlzdF9zICpibG9jaykKK3sKKwl1OCAqcCA9ICh1OCAqKWJsb2NrLT5zdGFydF92aXJ0ICsgYmxvY2stPndwOworCWlmIChibG9jay0+dHlwZSA9PSBWREVDX1RZUEVfRlJBTUVfQkxPQ0spIHsKKwkJY29weV9mcm9tX3VzZXJfdG9fcGh5YWRkcihwLCBidWYsIGNvdW50LAorCQkJYmxvY2stPnN0YXJ0ICsgYmxvY2stPndwLAorCQkJY2h1bmstPnBhZGluZ19zaXplLAorCQkJYmxvY2stPmlzX21hcHBlZCk7CisJfSBlbHNlIGlmIChibG9jay0+dHlwZSA9PSBWREVDX1RZUEVfRlJBTUVfQ0lSQ1VMQVIpIHsKKwkJc2l6ZV90IGxlbiA9IG1pbigoc2l6ZV90KShibG9jay0+c2l6ZSAtIGJsb2NrLT53cCksIGNvdW50KTsKKwkJdTMyIHdwOworCisJCWNvcHlfZnJvbV91c2VyX3RvX3BoeWFkZHIocCwgYnVmLCBsZW4sCisJCQkJYmxvY2stPnN0YXJ0ICsgYmxvY2stPndwLCAwLAorCQkJCWJsb2NrLT5pc19tYXBwZWQpOworCQlwICs9IGxlbjsKKworCQlpZiAoY291bnQgPiBsZW4pIHsKKwkJCWNvcHlfZnJvbV91c2VyX3RvX3BoeWFkZHIocCwgYnVmICsgbGVuLAorCQkJCWNvdW50IC0gbGVuLAorCQkJCWJsb2NrLT5zdGFydCwgMCwKKwkJCQlibG9jay0+aXNfbWFwcGVkKTsKKworCQkJcCArPSBjb3VudCAtIGxlbjsKKwkJfQorCisJCXdwID0gYmxvY2stPndwICsgY291bnQ7CisJCWlmICh3cCA+PSBibG9jay0+c2l6ZSkKKwkJCXdwIC09IGJsb2NrLT5zaXplOworCisJCWxlbiA9IG1pbihibG9jay0+c2l6ZSAtIHdwLCBjaHVuay0+cGFkaW5nX3NpemUpOworCisJCWlmICghYmxvY2stPmlzX21hcHBlZCkgeworCQkJcCA9IGNvZGVjX21tX3ZtYXAoYmxvY2stPnN0YXJ0ICsgd3AsIGxlbik7CisJCQltZW1zZXQocCwgMCwgbGVuKTsKKwkJCWNvZGVjX21tX2RtYV9mbHVzaChwLCBsZW4sIERNQV9UT19ERVZJQ0UpOworCQkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcihwKTsKKwkJfSBlbHNlIHsKKwkJCW1lbXNldChwLCAwLCBsZW4pOworCQkJY29kZWNfbW1fZG1hX2ZsdXNoKHAsIGxlbiwgRE1BX1RPX0RFVklDRSk7CisJCX0KKworCQlpZiAoY2h1bmstPnBhZGluZ19zaXplID4gbGVuKSB7CisJCQlwID0gKHU4ICopYmxvY2stPnN0YXJ0X3ZpcnQ7CisKKwkJCWlmICghYmxvY2stPmlzX21hcHBlZCkgeworCQkJCXAgPSBjb2RlY19tbV92bWFwKGJsb2NrLT5zdGFydCwKKwkJCQkJY2h1bmstPnBhZGluZ19zaXplIC0gbGVuKTsKKwkJCQltZW1zZXQocCwgMCwgY2h1bmstPnBhZGluZ19zaXplIC0gbGVuKTsKKwkJCQljb2RlY19tbV9kbWFfZmx1c2gocCwKKwkJCQkJY2h1bmstPnBhZGluZ19zaXplIC0gbGVuLAorCQkJCQlETUFfVE9fREVWSUNFKTsKKwkJCQljb2RlY19tbV91bm1hcF9waHlhZGRyKHApOworCQkJfSBlbHNlIHsKKwkJCQltZW1zZXQocCwgMCwgY2h1bmstPnBhZGluZ19zaXplIC0gbGVuKTsKKwkJCQljb2RlY19tbV9kbWFfZmx1c2gocCwKKwkJCQkJY2h1bmstPnBhZGluZ19zaXplIC0gbGVuLAorCQkJCQlETUFfVE9fREVWSUNFKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHUzMiB2ZnJhbWVfYmxvY2tfc3BhY2Uoc3RydWN0IHZmcmFtZV9ibG9ja19saXN0X3MgKmJsb2NrKQoreworCWlmIChibG9jay0+dHlwZSA9PSBWREVDX1RZUEVfRlJBTUVfQkxPQ0spIHsKKwkJcmV0dXJuIGJsb2NrLT5zaXplIC0gYmxvY2stPndwOworCX0gZWxzZSB7CisJCXJldHVybiAoYmxvY2stPnJwID49IGJsb2NrLT53cCkgPworCQkJICAgKGJsb2NrLT5ycCAtIGJsb2NrLT53cCkgOgorCQkJICAgKGJsb2NrLT5ycCAtIGJsb2NrLT53cCArIGJsb2NrLT5zaXplKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHZmcmFtZV9ibG9ja19hZGRfY2h1bmsoc3RydWN0IHZmcmFtZV9ibG9ja19saXN0X3MgKmJsb2NrLAorCQkJCXN0cnVjdCB2ZnJhbWVfY2h1bmtfcyAqY2h1bmspCit7CisJYmxvY2stPndwICs9IGNodW5rLT5zaXplICsgY2h1bmstPnBhZGluZ19zaXplOworCWlmIChibG9jay0+d3AgPj0gYmxvY2stPnNpemUpCisJCWJsb2NrLT53cCAtPSBibG9jay0+c2l6ZTsKKwlibG9jay0+ZGF0YV9zaXplICs9IGNodW5rLT5zaXplOworCWJsb2NrLT5jaHVua19jb3VudCsrOworCWNodW5rLT5ibG9jayA9IGJsb2NrOworCWJsb2NrLT5pbnB1dC0+d3JfYmxvY2sgPSBibG9jazsKKwljaHVuay0+c2VxdWVuY2UgPSBibG9jay0+aW5wdXQtPnNlcXVlbmNlOworCWJsb2NrLT5pbnB1dC0+c2VxdWVuY2UrKzsKK30KKworc3RhdGljIGJvb2wgaXNfY29oZXJlbnRfYnVmZiA9IDE7CisKK3N0YXRpYyB2b2lkIHZmcmFtZV9ibG9ja19mcmVlX2Jsb2NrKHN0cnVjdCB2ZnJhbWVfYmxvY2tfbGlzdF9zICpibG9jaykKK3sKKwlpZiAoaXNfY29oZXJlbnRfYnVmZikgeworCQlpZiAoYmxvY2stPm1lbV9oYW5kbGUpIHsKKwkJCWNvZGVjX21tX2RtYV9mcmVlX2NvaGVyZW50KGJsb2NrLT5tZW1faGFuZGxlKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChibG9jay0+YWRkcikgeworCQkJY29kZWNfbW1fZnJlZV9mb3JfZG1hKE1FTV9OQU1FLAlibG9jay0+YWRkcik7CisJCX0KKwl9CisJLyoKKwkqcHJfZXJyKCJmcmVlIGJsb2NrICVkLCBzaXplPSVkXG4iLCBibG9jay0+aWQsIGJsb2NrLT5zaXplKTsKKwkqLworCWtmcmVlKGJsb2NrKTsKK30KKworc3RhdGljIGludCB2ZnJhbWVfYmxvY2tfaW5pdF9hbGxvY19zdG9yYWdlKHN0cnVjdCB2ZGVjX2lucHV0X3MgKmlucHV0LAorCQkJc3RydWN0IHZmcmFtZV9ibG9ja19saXN0X3MgKmJsb2NrLAorCQkJdWxvbmcgcGh5X2FkZHIsCisJCQlpbnQgc2l6ZSwKKwkJCWNodW5rX2ZyZWUgZnJlZSwKKwkJCXZvaWQgKnByaXYpCit7CisJaW50IGFsbG9jX3NpemUgPSBpbnB1dC0+ZGVmYXVsdF9ibG9ja19zaXplOworCWJsb2NrLT5tYWdpYyA9IDB4NGI0MzRjNDI7CisJYmxvY2stPmlucHV0ID0gaW5wdXQ7CisJYmxvY2stPnR5cGUgPSBpbnB1dC0+dHlwZTsKKworCS8qCisJICogdG9kbzogZm9yIGRpZmZlcmVudCB0eXBlIHVzZSBkaWZmZXJlbnQgc2l6ZQorCSAqLworCWlmIChwaHlfYWRkcikgeworCQlibG9jay0+aXNfb3V0X2J1ZiA9IDE7CisJCWJsb2NrLT5zdGFydF92aXJ0ID0gTlVMTDsKKwkJYmxvY2stPnN0YXJ0ID0gcGh5X2FkZHI7CisJCWJsb2NrLT5zaXplID0gc2l6ZTsKKwkJYmxvY2stPmZyZWUgPSBmcmVlOworCQlibG9jay0+cHJpdiA9IHByaXY7CisJfSBlbHNlIHsKKwkJYWxsb2Nfc2l6ZSA9IFBBR0VfQUxJR04oYWxsb2Nfc2l6ZSk7CisJCWlmIChpc19jb2hlcmVudF9idWZmKSB7CisJCQlibG9jay0+c3RhcnRfdmlydCA9IGNvZGVjX21tX2RtYV9hbGxvY19jb2hlcmVudCgmYmxvY2stPm1lbV9oYW5kbGUsICZibG9jay0+YWRkciwgYWxsb2Nfc2l6ZSwgTUVNX05BTUUpOworCQl9IGVsc2UgeworCQkJYmxvY2stPmFkZHIgPSBjb2RlY19tbV9hbGxvY19mb3JfZG1hX2V4KAorCQkJCU1FTV9OQU1FLAorCQkJCWFsbG9jX3NpemUvUEFHRV9TSVpFLAorCQkJCVZGUkFNRV9CTE9DS19QQUdFQUxJR04sCisJCQkJQ09ERUNfTU1fRkxBR1NfRE1BX0NQVSB8IENPREVDX01NX0ZMQUdTX0ZPUl9WREVDT0RFUiwKKwkJCQlpbnB1dC0+aWQsCisJCQkJYmxvY2stPmlkKTsKKwkJfQorCisJCWlmICghYmxvY2stPmFkZHIpIHsKKwkJCXByX2VycigiSW5wdXQgYmxvY2sgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlpZiAoIWlzX2NvaGVyZW50X2J1ZmYpCisJCQlibG9jay0+c3RhcnRfdmlydCA9ICh2b2lkICopY29kZWNfbW1fcGh5c190b192aXJ0KGJsb2NrLT5hZGRyKTsKKwkJaWYgKGJsb2NrLT5zdGFydF92aXJ0KQorCQkJYmxvY2stPmlzX21hcHBlZCA9IHRydWU7CisJCWJsb2NrLT5zdGFydCA9IGJsb2NrLT5hZGRyOworCQlibG9jay0+c2l6ZSA9IGFsbG9jX3NpemU7CisJCWJsb2NrLT5pc19vdXRfYnVmID0gMDsKKwkJYmxvY2stPmZyZWUgPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIHZkZWNfaW5wdXRfaW5pdChzdHJ1Y3QgdmRlY19pbnB1dF9zICppbnB1dCwgc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlJTklUX0xJU1RfSEVBRCgmaW5wdXQtPnZmcmFtZV9ibG9ja19saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaW5wdXQtPnZmcmFtZV9ibG9ja19mcmVlX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZpbnB1dC0+dmZyYW1lX2NodW5rX2xpc3QpOworCXNwaW5fbG9ja19pbml0KCZpbnB1dC0+bG9jayk7CisJaW5wdXQtPmlkID0gdmRlYy0+aWQ7CisJaW5wdXQtPmJsb2NrX251bXMgPSAwOworCWlucHV0LT52ZGVjID0gdmRlYzsKKwlpbnB1dC0+YmxvY2tfaWRfc2VxID0gMDsKKwlpbnB1dC0+c2l6ZSA9IDA7CisJaW5wdXQtPmRlZmF1bHRfYmxvY2tfc2l6ZSA9IFZGUkFNRV9CTE9DS19TSVpFOworCXNucHJpbnRmKGlucHV0LT52ZGVjX2lucHV0X25hbWUsIHNpemVvZihpbnB1dC0+dmRlY19pbnB1dF9uYW1lKSwKKwkJICJ2ZGVjLWlucHV0LSVkIiwgdmRlYy0+aWQpOworfQoraW50IHZkZWNfaW5wdXRfcHJlcGFyZV9idWZzKHN0cnVjdCB2ZGVjX2lucHV0X3MgKmlucHV0LAorCWludCBmcmFtZV93aWR0aCwgaW50IGZyYW1lX2hlaWdodCkKK3sKKwlzdHJ1Y3QgdmZyYW1lX2Jsb2NrX2xpc3RfcyAqYmxvY2s7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICh2ZGVjX3NlY3VyZShpbnB1dC0+dmRlYykpCisJCXJldHVybiAwOworCWlmIChpbnB1dC0+c2l6ZSA+IDApCisJCXJldHVybiAwOworCWlmIChmcmFtZV93aWR0aCAqIGZyYW1lX2hlaWdodCA+PSAxOTIwICogMTA4OCkgeworCQkvKmhhdmUgYWRkIGRhdGEgYmVmb3JlLiBpZ25vcmUgcHJlcGFyZSBidWZmZXJzLiovCisJCWlucHV0LT5kZWZhdWx0X2Jsb2NrX3NpemUgPSBWRlJBTUVfQkxPQ0tfU0laRV80SzsKKwl9CisJLypwcmVwYXJlZCAzIGJ1ZmZlcnMgZm9yIHNtb290aCBzdGFydC4qLworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJYmxvY2sgPSB2ZGVjX2lucHV0X2FsbG9jX25ld19ibG9jayhpbnB1dCwgMCwgMCwgTlVMTCwgTlVMTCk7CisJCWlmICghYmxvY2spCisJCQlicmVhazsKKwkJZmxhZ3MgPSB2ZGVjX2lucHV0X2xvY2soaW5wdXQpOworCQlsaXN0X21vdmVfdGFpbCgmYmxvY2stPmxpc3QsCisJCQkJJmlucHV0LT52ZnJhbWVfYmxvY2tfZnJlZV9saXN0KTsKKwkJaW5wdXQtPndyX2Jsb2NrID0gTlVMTDsKKwkJdmRlY19pbnB1dF91bmxvY2soaW5wdXQsIGZsYWdzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmRlY19pbnB1dF9kdW1wX2Jsb2NrX2xvY2tlZCgKKwlzdHJ1Y3QgdmZyYW1lX2Jsb2NrX2xpc3RfcyAqYmxvY2ssCisJY2hhciAqYnVmLCBpbnQgc2l6ZSkKK3sKKwljaGFyICpwYnVmID0gYnVmOworCWNoYXIgc2J1Zls1MTJdOworCWludCB0c2l6ZSA9IDA7CisJaW50IHM7CisKKwlpZiAoIXBidWYpIHsKKwkJcGJ1ZiA9IHNidWY7CisJCXNpemUgPSA1MTI7CisJfQorCSNkZWZpbmUgQlVGUFJJTlQoYXJncy4uLikgXAorCWRvIHtcCisJCXMgPSBzbnByaW50ZihwYnVmLCBzaXplIC0gdHNpemUsIGFyZ3MpO1wKKwkJdHNpemUgKz0gcztcCisJCXBidWYgKz0gczsgXAorCX0gd2hpbGUgKDApCisKKwlCVUZQUklOVCgiXHRibG9jazpbJWQ6JXBdLWFkZHI9JXAsdnN0YXJ0PSVwLHR5cGU9JWRcbiIsCisJCWJsb2NrLT5pZCwKKwkJYmxvY2ssCisJCSh2b2lkICopYmxvY2stPmFkZHIsCisJCSh2b2lkICopYmxvY2stPnN0YXJ0X3ZpcnQsCisJCWJsb2NrLT50eXBlKTsKKwlCVUZQUklOVCgiXHQtYmxvY2tzaXplPSVkLGRhdGE9JWQsd3A9JWQscnA9JWQsY2h1bmtfY291bnQ9JWRcbiIsCisJCWJsb2NrLT5zaXplLAorCQlibG9jay0+ZGF0YV9zaXplLAorCQlibG9jay0+d3AsCisJCWJsb2NrLT5ycCwKKwkJYmxvY2stPmNodW5rX2NvdW50KTsKKwkvKgorCUJVRlBSSU5UKCJcdGxpc3Q9JXAsbmV4dD0lcCxwcmV2PSVwXG4iLAorCQkmYmxvY2stPmxpc3QsCisJCWJsb2NrLT5saXN0Lm5leHQsCisJCWJsb2NrLT5saXN0LnByZXYpOworCSovCisJI3VuZGVmIEJVRlBSSU5UCisJaWYgKCFidWYpCisJCXByX2luZm8oIiVzIiwgc2J1Zik7CisJcmV0dXJuIHRzaXplOworfQorCitpbnQgdmRlY19pbnB1dF9kdW1wX2Jsb2NrcyhzdHJ1Y3QgdmRlY19pbnB1dF9zICppbnB1dCwKKwljaGFyICpidWZzLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqdG1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY2hhciAqbGJ1ZiA9IGJ1ZnM7CisJY2hhciBzYnVmWzI1Nl07CisJaW50IHMgPSAwOworCisJaWYgKHNpemUgPD0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKCFidWZzKQorCQlsYnVmID0gc2J1ZjsKKwlzICs9IHNucHJpbnRmKGxidWYgKyBzLCBzaXplIC0gcywKKwkJImJsb2Nrczp2ZGVjLSVkIGlkOiVkLGJ1ZnNpemU9JWQsZHNpemU9JWQsZnJhbWVzOiVkLGR1cjolZG1zXG4iLAorCQlpbnB1dC0+aWQsCisJCWlucHV0LT5ibG9ja19udW1zLAorCQlpbnB1dC0+c2l6ZSwKKwkJaW5wdXQtPmRhdGFfc2l6ZSwKKwkJaW5wdXQtPmhhdmVfZnJhbWVfbnVtLAorCQl2ZGVjX2lucHV0X2dldF9kdXJhdGlvbl91NjQoaW5wdXQpLzEwMDApOworCWlmIChidWZzKQorCQlsYnVmICs9IHM7CisJZWxzZSB7CisJCXByX2luZm8oIiVzIiwgc2J1Zik7CisJCWxidWYgPSBOVUxMOworCX0KKworCWZsYWdzID0gdmRlY19pbnB1dF9sb2NrKGlucHV0KTsKKwkvKiBkdW1wIGlucHV0IGJsb2NrcyAqLworCWxpc3RfZm9yX2VhY2hfc2FmZShwLCB0bXAsICZpbnB1dC0+dmZyYW1lX2Jsb2NrX2xpc3QpIHsKKwkJc3RydWN0IHZmcmFtZV9ibG9ja19saXN0X3MgKmJsb2NrID0gbGlzdF9lbnRyeSgKKwkJCXAsIHN0cnVjdCB2ZnJhbWVfYmxvY2tfbGlzdF9zLCBsaXN0KTsKKwkJaWYgKGJ1ZnMgIT0gTlVMTCkgeworCQkJbGJ1ZiA9IGJ1ZnMgKyBzOworCQkJaWYgKHNpemUgLSBzIDwgMTI4KQorCQkJCWJyZWFrOworCQl9CisJCXMgKz0gdmRlY19pbnB1dF9kdW1wX2Jsb2NrX2xvY2tlZChibG9jaywgbGJ1Ziwgc2l6ZSAtIHMpOworCX0KKwlsaXN0X2Zvcl9lYWNoX3NhZmUocCwgdG1wLCAmaW5wdXQtPnZmcmFtZV9ibG9ja19mcmVlX2xpc3QpIHsKKwkJc3RydWN0IHZmcmFtZV9ibG9ja19saXN0X3MgKmJsb2NrID0gbGlzdF9lbnRyeSgKKwkJCXAsIHN0cnVjdCB2ZnJhbWVfYmxvY2tfbGlzdF9zLCBsaXN0KTsKKwkJaWYgKGJ1ZnMgIT0gTlVMTCkgeworCQkJbGJ1ZiA9IGJ1ZnMgKyBzOworCQkJaWYgKHNpemUgLSBzIDwgMTI4KQorCQkJCWJyZWFrOworCQl9CisJCXMgKz0gdmRlY19pbnB1dF9kdW1wX2Jsb2NrX2xvY2tlZChibG9jaywgbGJ1Ziwgc2l6ZSAtIHMpOworCX0KKwl2ZGVjX2lucHV0X3VubG9jayhpbnB1dCwgZmxhZ3MpOworCisJcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBpbnQgdmRlY19pbnB1dF9kdW1wX2NodW5rX2xvY2tlZCgKKwlpbnQgaWQsCisJc3RydWN0IHZmcmFtZV9jaHVua19zICpjaHVuaywKKwljaGFyICpidWYsIGludCBzaXplKQoreworCWNoYXIgKnBidWYgPSBidWY7CisJY2hhciBzYnVmWzUxMl07CisJaW50IHRzaXplID0gMDsKKwlpbnQgczsKKworCWlmICghcGJ1ZikgeworCQlwYnVmID0gc2J1ZjsKKwkJc2l6ZSA9IDUxMjsKKwl9CisJI2RlZmluZSBCVUZQUklOVChhcmdzLi4uKSBcCisJZG8ge1wKKwkJcyA9IHNucHJpbnRmKHBidWYsIHNpemUgLSB0c2l6ZSwgYXJncyk7XAorCQl0c2l6ZSArPSBzO1wKKwkJcGJ1ZiArPSBzOyBcCisJfSB3aGlsZSAoMCkKKworCUJVRlBSSU5UKAorCQkiXHRbJWRdWyVsbGQ6JXBdLW9mZj0lZCxzaXplOiVkLHA6JWQsXHRwdHM2ND0lbGxkLGFkZHI9JXBcbiIsCisJCWlkLAorCQljaHVuay0+c2VxdWVuY2UsCisJCWNodW5rLT5ibG9jaywKKwkJY2h1bmstPm9mZnNldCwKKwkJY2h1bmstPnNpemUsCisJCWNodW5rLT5wYWRpbmdfc2l6ZSwKKwkJY2h1bmstPnB0czY0LAorCQkodm9pZCAqKShjaHVuay0+YmxvY2stPmFkZHIgKyBjaHVuay0+b2Zmc2V0KSk7CisJLyoKKwlCVUZQUklOVCgiXHRsaXN0PSVwLG5leHQ9JXAscHJldj0lcFxuIiwKKwkJJmNodW5rLT5saXN0LAorCQljaHVuay0+bGlzdC5uZXh0LAorCQljaHVuay0+bGlzdC5wcmV2KTsKKwkqLworCSN1bmRlZiBCVUZQUklOVAorCWlmICghYnVmKQorCQlwcl9pbmZvKCIlcyIsIHNidWYpOworCXJldHVybiB0c2l6ZTsKK30KKworaW50IHZkZWNfaW5wdXRfZHVtcF9jaHVua3MoaW50IGlkLCBzdHJ1Y3QgdmRlY19pbnB1dF9zICppbnB1dCwKKwljaGFyICpidWZzLCBpbnQgc2l6ZSkKK3sKKworCXN0cnVjdCBsaXN0X2hlYWQgKnAsICp0bXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljaGFyICpsYnVmID0gYnVmczsKKwljaGFyIHNidWZbMjU2XTsKKwlpbnQgcyA9IDA7CisJaW50IGkgPSAwOworCisJaWYgKHNpemUgPD0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWJ1ZnMpCisJCWxidWYgPSBzYnVmOworCXMgPSBzbnByaW50ZihsYnVmICsgcywgc2l6ZSAtIHMsCisJCSJbJWRdYmxvY2tzOnZkZWMtJWQgaWQ6JWQsYnVmc2l6ZT0lZCxkc2l6ZT0lZCxmcmFtZXM6JWQsbWF4ZnJhbWU6JWRcbiIsCisJCWlkLAorCQlpbnB1dC0+aWQsCisJCWlucHV0LT5ibG9ja19udW1zLAorCQlpbnB1dC0+c2l6ZSwKKwkJaW5wdXQtPmRhdGFfc2l6ZSwKKwkJaW5wdXQtPmhhdmVfZnJhbWVfbnVtLAorCQlpbnB1dC0+ZnJhbWVfbWF4X3NpemUpOworCWlmIChidWZzKQorCQlsYnVmICs9IHM7CisJaWYgKCFidWZzKSB7CisJCXByX2luZm8oIiVzIiwgc2J1Zik7CisJCWxidWYgPSBOVUxMOworCX0KKwlmbGFncyA9IHZkZWNfaW5wdXRfbG9jayhpbnB1dCk7CisJLypkdW1wIGNodW5rcyBsaXN0IGluZm9zLiovCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIHRtcCwgJmlucHV0LT52ZnJhbWVfY2h1bmtfbGlzdCkgeworCQlzdHJ1Y3QgdmZyYW1lX2NodW5rX3MgKmNodW5rID0gbGlzdF9lbnRyeSgKKwkJCQlwLCBzdHJ1Y3QgdmZyYW1lX2NodW5rX3MsIGxpc3QpOworCQlpZiAoYnVmcyAhPSBOVUxMKQorCQkJbGJ1ZiA9IGJ1ZnMgKyBzOworCQlzICs9IHZkZWNfaW5wdXRfZHVtcF9jaHVua19sb2NrZWQoaWQsIGNodW5rLCBsYnVmLCBzaXplIC0gcyk7CisJCWkrKzsKKwkJaWYgKGkgPj0gMTApCisJCQlicmVhazsKKwl9CisJdmRlY19pbnB1dF91bmxvY2soaW5wdXQsIGZsYWdzKTsKKworCXJldHVybiBzOworfQorCisKKworaW50IHZkZWNfaW5wdXRfc2V0X2J1ZmZlcihzdHJ1Y3QgdmRlY19pbnB1dF9zICppbnB1dCwgdTMyIHN0YXJ0LCB1MzIgc2l6ZSkKK3sKKwlpZiAoaW5wdXRfZnJhbWVfYmFzZWQoaW5wdXQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlucHV0LT5zdGFydCA9IHN0YXJ0OworCWlucHV0LT5zaXplID0gc2l6ZTsKKwlpbnB1dC0+c3dhcF9ycCA9IHN0YXJ0OworCisJaWYgKHZkZWNfc2VjdXJlKGlucHV0LT52ZGVjKSkKKwkJaW5wdXQtPnN3YXBfcGFnZV9waHlzID0gY29kZWNfbW1fYWxsb2NfZm9yX2RtYSgiU1dBUCIsCisJCQkxLCAwLCBDT0RFQ19NTV9GTEFHU19UVlApOworCWVsc2UgeworCQlpbnB1dC0+c3dhcF9wYWdlID0gY29kZWNfbW1fZG1hX2FsbG9jX2NvaGVyZW50KCZpbnB1dC0+bWVtX2hhbmRsZSwKKwkJCQkodWxvbmcgKikmaW5wdXQtPnN3YXBfcGFnZV9waHlzLAorCQkJCVBBR0VfU0laRSwgTUVNX05BTUUpOworCQlpZiAoaW5wdXQtPnN3YXBfcGFnZSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKGlucHV0LT5zd2FwX3BhZ2VfcGh5cyA9PSAwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX2lucHV0X3NldF9idWZmZXIpOworCit2b2lkIHZkZWNfaW5wdXRfc2V0X3R5cGUoc3RydWN0IHZkZWNfaW5wdXRfcyAqaW5wdXQsIGludCB0eXBlLCBpbnQgdGFyZ2V0KQoreworCWlucHV0LT50eXBlID0gdHlwZTsKKwlpbnB1dC0+dGFyZ2V0ID0gdGFyZ2V0OworCWlmICh0eXBlID09IFZERUNfVFlQRV9GUkFNRV9DSVJDVUxBUikgeworCQkvKmFsd2F5IHVzZWQgbWF4IGJsb2NrLiovCisJCWlucHV0LT5kZWZhdWx0X2Jsb2NrX3NpemUgPSBWRlJBTUVfQkxPQ0tfU0laRV9NQVg7CisJfQorfQorRVhQT1JUX1NZTUJPTCh2ZGVjX2lucHV0X3NldF90eXBlKTsKKworaW50IHZkZWNfaW5wdXRfZ2V0X3N0YXR1cyhzdHJ1Y3QgdmRlY19pbnB1dF9zICppbnB1dCwKKwkJCXN0cnVjdCB2ZGVjX2lucHV0X3N0YXR1c19zICpzdGF0dXMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChpbnB1dC0+dmRlYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZsYWdzID0gdmRlY19pbnB1dF9sb2NrKGlucHV0KTsKKworCWlmIChsaXN0X2VtcHR5KCZpbnB1dC0+dmZyYW1lX2Jsb2NrX2xpc3QpKSB7CisJCXN0YXR1cy0+c2l6ZSA9IFZGUkFNRV9CTE9DS19TSVpFOworCQlzdGF0dXMtPmRhdGFfbGVuID0gMDsKKwkJc3RhdHVzLT5mcmVlX2xlbiA9IFZGUkFNRV9CTE9DS19TSVpFOworCQlzdGF0dXMtPnJlYWRfcG9pbnRlciA9IDA7CisJfSBlbHNlIHsKKwkJaW50IHIgPSBWRlJBTUVfQkxPQ0tfTUFYX0xFVkVMIC0gdmRlY19pbnB1dF9sZXZlbChpbnB1dCkKKwkJCS0gVkZSQU1FX0JMT0NLX0hPTEU7CisJCXN0YXR1cy0+c2l6ZSA9IGlucHV0LT5zaXplOworCQlzdGF0dXMtPmRhdGFfbGVuID0gdmRlY19pbnB1dF9sZXZlbChpbnB1dCk7CisJCXN0YXR1cy0+ZnJlZV9sZW4gPSAociA+IDApID8gciA6IDA7CisJCXN0YXR1cy0+cmVhZF9wb2ludGVyID0gaW5wdXQtPnRvdGFsX3JkX2NvdW50OworCX0KKworCXZkZWNfaW5wdXRfdW5sb2NrKGlucHV0LCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19pbnB1dF9nZXRfc3RhdHVzKTsKKworc3RhdGljIHZvaWQgdmRlY19pbnB1dF9hZGRfYmxvY2soc3RydWN0IHZkZWNfaW5wdXRfcyAqaW5wdXQsCisJCQkJc3RydWN0IHZmcmFtZV9ibG9ja19saXN0X3MgKmJsb2NrKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmbGFncyA9IHZkZWNfaW5wdXRfbG9jayhpbnB1dCk7CisJYmxvY2stPndwID0gMDsKKwlibG9jay0+aWQgPSBpbnB1dC0+YmxvY2tfaWRfc2VxKys7CisJbGlzdF9hZGRfdGFpbCgmYmxvY2stPmxpc3QsICZpbnB1dC0+dmZyYW1lX2Jsb2NrX2xpc3QpOworCWlucHV0LT5zaXplICs9IGJsb2NrLT5zaXplOworCWlucHV0LT5ibG9ja19udW1zKys7CisJaW5wdXQtPndyX2Jsb2NrID0gYmxvY2s7CisJdmRlY19pbnB1dF91bmxvY2soaW5wdXQsIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHZkZWNfaW5wdXRfZGVsX2Jsb2NrX2xvY2tlZChzdHJ1Y3QgdmRlY19pbnB1dF9zICppbnB1dCwKKwkJCQlzdHJ1Y3QgdmZyYW1lX2Jsb2NrX2xpc3RfcyAqYmxvY2spCit7CisJbGlzdF9kZWwoJmJsb2NrLT5saXN0KTsKKwlpbnB1dC0+c2l6ZSAtPSBibG9jay0+c2l6ZTsKKwlpbnB1dC0+YmxvY2tfbnVtcy0tOworfQorCitpbnQgdmRlY19pbnB1dF9sZXZlbChzdHJ1Y3QgdmRlY19pbnB1dF9zICppbnB1dCkKK3sKKwlyZXR1cm4gaW5wdXQtPnRvdGFsX3dyX2NvdW50IC0gaW5wdXQtPnRvdGFsX3JkX2NvdW50OworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX2lucHV0X2xldmVsKTsKKworc3RhdGljIHN0cnVjdCB2ZnJhbWVfYmxvY2tfbGlzdF9zICoKKwl2ZGVjX2lucHV0X2FsbG9jX25ld19ibG9jayhzdHJ1Y3QgdmRlY19pbnB1dF9zICppbnB1dCwKKwl1bG9uZyBwaHlfYWRkciwKKwlpbnQgc2l6ZSwKKwljaHVua19mcmVlIGZyZWUsCisJdm9pZCogcHJpdikKK3sKKwlzdHJ1Y3QgdmZyYW1lX2Jsb2NrX2xpc3RfcyAqYmxvY2s7CisJYmxvY2sgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdmZyYW1lX2Jsb2NrX2xpc3RfcyksCisJCQlHRlBfS0VSTkVMKTsKKwlpZiAoYmxvY2sgPT0gTlVMTCkgeworCQlpbnB1dC0+bm9fbWVtX2Vycl9jbnQrKzsKKwkJcHJfZXJyKCJ2ZnJhbWVfYmxvY2sgc3RydWN0dXJlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKHZmcmFtZV9ibG9ja19pbml0X2FsbG9jX3N0b3JhZ2UoaW5wdXQsCisJCWJsb2NrLCBwaHlfYWRkciwgc2l6ZSwgZnJlZSwgcHJpdikgIT0gMCkgeworCQlrZnJlZShibG9jayk7CisJCXByX2VycigidmZyYW1lX2Jsb2NrIHN0b3JhZ2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCgmYmxvY2stPmxpc3QpOworCisJdmRlY19pbnB1dF9hZGRfYmxvY2soaW5wdXQsIGJsb2NrKTsKKworCS8qCisJICpwcl9pbmZvKCJ2ZGVjLSVkOm5ldyBibG9jayBpZD0lZCwgdG90YWxfYmxvY2tzOiVkLCBzaXplPSVkXG4iLAorCSAqCWlucHV0LT5pZCwKKwkgKglibG9jay0+aWQsCisJICoJaW5wdXQtPmJsb2NrX251bXMsCisJICoJYmxvY2stPnNpemUpOworCSAqLworCWlmICgwICYmIGlucHV0LT5zaXplID4gVkZSQU1FX0JMT0NLX01BWF9MRVZFTCAqIDIpIHsKKwkJLyoKKwkJdXNlZAorCQkqLworCQlwcl9pbmZvKAorCQkiaW5wdXRbJWRdIHJlYWNoIG1heDogc2l6ZTolZCwgYmxvY2tzOiVkIiwKKwkJCWlucHV0LT5pZCwKKwkJCWlucHV0LT5zaXplLAorCQkJaW5wdXQtPmJsb2NrX251bXMpOworCQlwcl9pbmZvKCJsZXZlbDolZCwgd3I6JWxsZCxyZDolbGxkXG4iLAorCQkJdmRlY19pbnB1dF9sZXZlbChpbnB1dCksCisJCQlpbnB1dC0+dG90YWxfd3JfY291bnQsCisJCQlpbnB1dC0+dG90YWxfcmRfY291bnQpOworCQl2ZGVjX2lucHV0X2R1bXBfYmxvY2tzKGlucHV0LCBOVUxMLCAwKTsKKwl9CisJcmV0dXJuIGJsb2NrOworfQoraW50IHZkZWNfaW5wdXRfZ2V0X2R1cmF0aW9uX3U2NChzdHJ1Y3QgdmRlY19pbnB1dF9zICppbnB1dCkKK3sKKwlpbnQgZHVyYXRpb24gPSAoaW5wdXQtPmxhc3RfaW5wdHNfdTY0IC0gaW5wdXQtPmxhc3RfY29tc3VtZWRfcHRzX3U2NCk7CisJaWYgKGlucHV0LT5sYXN0X2luX25vcHRzX2NudCA+IDAgJiYKKwkJaW5wdXQtPmxhc3RfY29tc3VtZWRfcHRzX3U2NCA+IDAgJiYKKwkJaW5wdXQtPmxhc3RfZHVyYXRpb24gPiAwKSB7CisJCWR1cmF0aW9uICs9IChpbnB1dC0+bGFzdF9pbl9ub3B0c19jbnQgLQorCQkJaW5wdXQtPmxhc3RfY29tc3VtZWRfbm9fcHRzX2NudCkgKgorCQkJaW5wdXQtPmxhc3RfZHVyYXRpb247CisJfQorCWlmIChkdXJhdGlvbiA+IDEwMDAgKiAxMDAwMDAwKS8qPiAxMDAwUyxJIHRoaW5rIGp1bXBlZC4qLworCQlkdXJhdGlvbiA9IDA7CisJaWYgKGR1cmF0aW9uIDw9IDAgJiYgaW5wdXQtPmxhc3RfZHVyYXRpb24gPiAwKSB7CisJCS8qLi4qLworCQlkdXJhdGlvbiA9IGlucHV0LT5sYXN0X2R1cmF0aW9uICogaW5wdXQtPmhhdmVfZnJhbWVfbnVtOworCX0KKwlpZiAoZHVyYXRpb24gPCAwKQorCQlkdXJhdGlvbiA9IDA7CisJcmV0dXJuIGR1cmF0aW9uOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX2lucHV0X2dldF9kdXJhdGlvbl91NjQpOworCisvKgorCXJldCA+PSAxMzogaGF2ZSBlbm91Z2ggYnVmZmVyLCBibG9ja2VkIGFkZCBtb3JlIGJ1ZmZlcnMKKyovCitzdGF0aWMgaW50IHZkZWNfaW5wdXRfaGF2ZV9ibG9ja3NfZW5vdWdoKHN0cnVjdCB2ZGVjX2lucHV0X3MgKmlucHV0KQoreworCWludCByZXQgPSAwOworCWlmICh2ZGVjX2lucHV0X2xldmVsKGlucHV0KSA+IFZGUkFNRV9CTE9DS19NSU5fTEVWRUwpCisJCXJldCArPSAxOworCWlmICh2ZGVjX2lucHV0X2xldmVsKGlucHV0KSA+PSBWRlJBTUVfQkxPQ0tfTUFYX0xFVkVMKQorCQlyZXQgKz0gMjsKKwlpZiAodmRlY19pbnB1dF9nZXRfZHVyYXRpb25fdTY0KGlucHV0KSA+IE1BWF9GUkFNRV9EVVJBVElPTl9TKQorCQlyZXQgKz0gNDsKKwlpZiAoaW5wdXQtPmhhdmVfZnJhbWVfbnVtID4gMzApCisJCXJldCArPSA4OworCWVsc2UKKwkJcmV0IC09IDg7Lypub3QgZW5vdWdoIGZyYW1lcy4qLworCWlmIChpbnB1dC0+c2l6ZSA+PSBWRlJBTUVfQkxPQ0tfTUFYX1RPVEFMX1NJWkUpCisJCXJldCArPSAxMDA7LyphbHdheXMgYmxvY2VkIGFkZCBtb3JlIGJ1ZmZlcnMuKi8KKworCXJldHVybiByZXQ7Cit9CitzdGF0aWMgaW50CXZkZWNfaW5wdXRfZ2V0X2ZyZWVfYmxvY2soCisJc3RydWN0IHZkZWNfaW5wdXRfcyAqaW5wdXQsCisJaW50IHNpemUsLypmcmFtZSBzaXplICsgcGFkaW5nKi8KKwlzdHJ1Y3QgdmZyYW1lX2Jsb2NrX2xpc3RfcyAqKmJsb2NrX3JldCkKK3sKKwlzdHJ1Y3QgdmZyYW1lX2Jsb2NrX2xpc3RfcyAqdG9fZnJlZWJsb2NrID0gTlVMTDsKKwlzdHJ1Y3QgdmZyYW1lX2Jsb2NrX2xpc3RfcyAqYmxvY2sgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZmxhZ3MgPSB2ZGVjX2lucHV0X2xvY2soaW5wdXQpOworCS8qZ2V0IGZyb20gZnJlZSBsaXN0LiovCisJaWYgKCFsaXN0X2VtcHR5KCZpbnB1dC0+dmZyYW1lX2Jsb2NrX2ZyZWVfbGlzdCkpIHsKKwkJYmxvY2sgPSBsaXN0X2VudHJ5KGlucHV0LT52ZnJhbWVfYmxvY2tfZnJlZV9saXN0Lm5leHQsCisJCXN0cnVjdCB2ZnJhbWVfYmxvY2tfbGlzdF9zLCBsaXN0KTsKKwkJaWYgKGJsb2NrLT5zaXplIDwgKHNpemUpKSB7CisJCQl2ZGVjX2lucHV0X2RlbF9ibG9ja19sb2NrZWQoaW5wdXQsIGJsb2NrKTsKKwkJCXRvX2ZyZWVibG9jayA9IGJsb2NrOworCQkJYmxvY2sgPSBOVUxMOworCQl9IGVsc2UgeworCQkJbGlzdF9tb3ZlX3RhaWwoJmJsb2NrLT5saXN0LAorCQkJCSZpbnB1dC0+dmZyYW1lX2Jsb2NrX2xpc3QpOworCQkJaW5wdXQtPndyX2Jsb2NrID0gYmxvY2s7Lypzd2l0aCB0byBuZXcgYmxvY2sqLworCQl9CisJfQorCXZkZWNfaW5wdXRfdW5sb2NrKGlucHV0LCBmbGFncyk7CisJaWYgKHRvX2ZyZWVibG9jaykgeworCQkvKmZyZWUgdGhlIHNtYWxsIGJsb2NrLiovCisJCXZmcmFtZV9ibG9ja19mcmVlX2Jsb2NrKHRvX2ZyZWVibG9jayk7CisJfQorCWlmIChibG9jaykgeworCQkqYmxvY2tfcmV0ID0gYmxvY2s7CisJCXJldHVybiAwOworCX0KKworCWlmICh2ZGVjX2lucHV0X2hhdmVfYmxvY2tzX2Vub3VnaChpbnB1dCkgPiAxMykgeworCQkvKmJ1ZiBmdWxsZWQgKi8KKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCWlmIChpbnB1dC0+bm9fbWVtX2Vycl9jbnQgPiAzKSB7CisJCS8qYWxsb2NlZCBmYWlsZWQgbW9yZSB0aW1lcy4KKwkJKi8KKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCWlmIChpbnB1dC0+ZGVmYXVsdF9ibG9ja19zaXplIDw9CisJCXNpemUgKiAyKSB7CisJCWludCBkZWZfc2l6ZSA9IGlucHV0LT5kZWZhdWx0X2Jsb2NrX3NpemU7CisJCWRvIHsKKwkJCWRlZl9zaXplICo9IDI7CisJCX0gd2hpbGUgKChkZWZfc2l6ZSA8PSAyICogc2l6ZSkgJiYKKwkJCShkZWZfc2l6ZSA8PSBWRlJBTUVfQkxPQ0tfU0laRV9NQVgpKTsKKwkJaWYgKGRlZl9zaXplIDwgc2l6ZSkKKwkJCWRlZl9zaXplID0gQUxJR04oc2l6ZSArIDY0LCAoMSA8PCAxNykpOworCQkvKjEyOGsgYWxpZ25lZCxzYW1lIGFzIGNvZGVjX21tKi8KKwkJaW5wdXQtPmRlZmF1bHRfYmxvY2tfc2l6ZSA9IGRlZl9zaXplOworCX0KKwlibG9jayA9IHZkZWNfaW5wdXRfYWxsb2NfbmV3X2Jsb2NrKGlucHV0LCAwLCAwLCBOVUxMLCBOVUxMKTsKKwlpZiAoIWJsb2NrKSB7CisJCWlucHV0LT5ub19tZW1fZXJyX2NudCsrOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJaW5wdXQtPm5vX21lbV9lcnJfY250ID0gMDsKKwkqYmxvY2tfcmV0ID0gYmxvY2s7CisJcmV0dXJuIDA7Cit9CisKK2ludCB2ZGVjX2lucHV0X2FkZF9jaHVuayhzdHJ1Y3QgdmRlY19pbnB1dF9zICppbnB1dCwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQsIHUzMiBoYW5kbGUsIGNodW5rX2ZyZWUgZnJlZSwgdm9pZCogcHJpdikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB2ZnJhbWVfY2h1bmtfcyAqY2h1bms7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGlucHV0LT52ZGVjOworCXN0cnVjdCB2ZnJhbWVfYmxvY2tfbGlzdF9zICpibG9jazsKKworCWludCBuZWVkX3BhZGluZ19zaXplID0gTUlOX0ZSQU1FX1BBRERJTkdfU0laRTsKKworCWlmICh2ZGVjX3NlY3VyZSh2ZGVjKSkgeworCQlibG9jayA9IHZkZWNfaW5wdXRfYWxsb2NfbmV3X2Jsb2NrKGlucHV0LCAodWxvbmcpYnVmLAorCQkJUEFHRV9BTElHTihjb3VudCArIEhFVkNfUEFERElOR19TSVpFICsgMSksCisJCQlmcmVlLCBwcml2KTsgLypBZGQgcGFkZGluZyBsYXJnZSB0aGFuIEhFVkNfUEFERElOR19TSVpFICovCisJCWlmICghYmxvY2spCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJYmxvY2stPmhhbmRsZSA9IGhhbmRsZTsKKwl9IGVsc2UgeworI2lmIDAKKwkJaWYgKGFkZF9jb3VudCA9PSAwKSB7CisJCQlhZGRfY291bnQrKzsKKwkJCW1lbWNweShzcHMsIGJ1ZiwgMzApOworCQkJcmV0dXJuIDMwOworCQl9IGVsc2UgaWYgKGFkZF9jb3VudCA9PSAxKSB7CisJCQlhZGRfY291bnQrKzsKKwkJCW1lbWNweShwcHMsIGJ1ZiwgOCk7CisJCQlyZXR1cm4gODsKKwkJfQorCQlhZGRfY291bnQrKzsKKyNlbmRpZgorCisjaWYgMAorCQlwcl9pbmZvKCJ2ZGVjX2lucHV0X2FkZF9mcmFtZSBhZGQgJXAsIGNvdW50PSVkXG4iLCBidWYsIChpbnQpY291bnQpOworCisJCWlmIChjb3VudCA+PSA4KSB7CisJCQlwcl9pbmZvKCIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQlidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdLCBidWZbM10sCisJCQlidWZbNF0sIGJ1Zls1XSwgYnVmWzZdLCBidWZbN10pOworCQl9CisJCWlmIChjb3VudCA+PSAxNikgeworCQkJcHJfaW5mbygiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJYnVmWzhdLCBidWZbOV0sIGJ1ZlsxMF0sIGJ1ZlsxMV0sCisJCQlidWZbMTJdLCBidWZbMTNdLCBidWZbMTRdLCBidWZbMTVdKTsKKwkJfQorCQlpZiAoY291bnQgPj0gMjQpIHsKKwkJCXByX2luZm8oIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCWJ1ZlsxNl0sIGJ1ZlsxN10sIGJ1ZlsxOF0sIGJ1ZlsxOV0sCisJCQlidWZbMjBdLCBidWZbMjFdLCBidWZbMjJdLCBidWZbMjNdKTsKKwkJfQorCQlpZiAoY291bnQgPj0gMzIpIHsKKwkJCXByX2luZm8oIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCWJ1ZlsyNF0sIGJ1ZlsyNV0sIGJ1ZlsyNl0sIGJ1ZlsyN10sCisJCQlidWZbMjhdLCBidWZbMjldLCBidWZbMzBdLCBidWZbMzFdKTsKKwl9CisjZW5kaWYKKwkJaWYgKGlucHV0X3N0cmVhbV9iYXNlZChpbnB1dCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoY291bnQgPCBQQUdFX1NJWkUpIHsKKwkJCW5lZWRfcGFkaW5nX3NpemUgPSBQQUdFX0FMSUdOKGNvdW50ICsgbmVlZF9wYWRpbmdfc2l6ZSkgLQorCQkJCWNvdW50OworCQl9IGVsc2UgeworCQkJLyp0byA2NCBieXRlcyBhbGlnbmVkOyovCisJCQlpZiAoY291bnQgJiAweDNmKQorCQkJCW5lZWRfcGFkaW5nX3NpemUgKz0gNjQgLSAoY291bnQgJiAweDNmKTsKKwkJfQorCQlibG9jayA9IGlucHV0LT53cl9ibG9jazsKKwkJaWYgKGJsb2NrICYmCisJCQkodmZyYW1lX2Jsb2NrX3NwYWNlKGJsb2NrKSA+IChjb3VudCArIG5lZWRfcGFkaW5nX3NpemUpKSkgeworCQkJLyp0aGlzIGJsb2NrIGhhdmUgZW5vdWdoIGJ1ZmZlcnMuCisJCQlkbyBub3RoaW5ncy4KKwkJCSovCisJCX0gZWxzZSBpZiAoYmxvY2sgJiYgKGJsb2NrLT50eXBlID09IFZERUNfVFlQRV9GUkFNRV9DSVJDVUxBUikpIHsKKwkJCS8qaW4gY2lyY3VsYXIgbW9kdWxlLgorCQkJb25seSBvbmUgYmxvY2ssLiovCisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfSBlbHNlIGlmIChibG9jayAhPSBOVUxMKSB7CisJCQkvKmhhdmUgYmxvY2sgYnV0IG5vdCBlbm91Z2ggc3BhY2UuCisJCQlyZWN5Y2xlIHRoZSBubyBlbm91Z2ggYmxvY2tzLiovCisJCQlmbGFncyA9IHZkZWNfaW5wdXRfbG9jayhpbnB1dCk7CisJCQlpZiAoaW5wdXQtPndyX2Jsb2NrID09IGJsb2NrICYmCisJCQkJYmxvY2stPmNodW5rX2NvdW50ID09IDApIHsKKwkJCQlibG9jay0+cnAgPSAwOworCQkJCWJsb2NrLT53cCA9IDA7CisJCQkJLypibG9jayBubyBkYXRhIG1vdmUgdG8gZnJlZWxpc3QqLworCQkJCWxpc3RfbW92ZV90YWlsKCZibG9jay0+bGlzdCwKKwkJCQkJJmlucHV0LT52ZnJhbWVfYmxvY2tfZnJlZV9saXN0KTsKKwkJCQlpbnB1dC0+d3JfYmxvY2sgPSBOVUxMOworCQkJfQorCQkJdmRlY19pbnB1dF91bmxvY2soaW5wdXQsIGZsYWdzKTsKKwkJCWJsb2NrID0gTlVMTDsKKwkJfQorCQlpZiAoIWJsb2NrKSB7Lyp0cnkgbmV3IGJsb2NrLiovCisJCQlpbnQgcmV0ID0gdmRlY19pbnB1dF9nZXRfZnJlZV9ibG9jayhpbnB1dCwKKwkJCQljb3VudCArIG5lZWRfcGFkaW5nX3NpemUgKyBFWFRSQV9QQURESU5HX1NJWkUsCisJCQkJJmJsb2NrKTsKKwkJCWlmIChyZXQgPCAwKS8qbm8gZW5vdWdoIGJsb2NrIG5vdy4qLworCQkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwljaHVuayA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZnJhbWVfY2h1bmtfcyksIEdGUF9LRVJORUwpOworCisJaWYgKCFjaHVuaykgeworCQlwcl9lcnIoInZmcmFtZV9jaHVuayBzdHJ1Y3R1cmUgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoKHZkZWMtPmhkcjEwcF9kYXRhX3ZhbGlkID09IHRydWUpICYmCisJCSh2ZGVjLT5oZHIxMHBfZGF0YV9zaXplICE9IDApKSB7CisJCWNoYXIgKm5ld19idWY7CisJCW5ld19idWYgPSB2emFsbG9jKHZkZWMtPmhkcjEwcF9kYXRhX3NpemUpOworCQlpZiAobmV3X2J1ZikgeworCQkJbWVtY3B5KG5ld19idWYsIHZkZWMtPmhkcjEwcF9kYXRhX2J1ZiwgdmRlYy0+aGRyMTBwX2RhdGFfc2l6ZSk7CisJCQljaHVuay0+aGRyMTBwX2RhdGFfYnVmID0gbmV3X2J1ZjsKKwkJCWNodW5rLT5oZHIxMHBfZGF0YV9zaXplID0gdmRlYy0+aGRyMTBwX2RhdGFfc2l6ZTsKKwkJfSBlbHNlIHsKKwkJCXByX2VycigiJXM6aGRyMTBwIGRhdGEgdnphbGxvYyBzaXplKCVkKSBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIHZkZWMtPmhkcjEwcF9kYXRhX3NpemUpOworCQkJY2h1bmstPmhkcjEwcF9kYXRhX2J1ZiA9IE5VTEw7CisJCQljaHVuay0+aGRyMTBwX2RhdGFfc2l6ZSA9IDA7CisJCX0KKwl9IGVsc2UgeworCQljaHVuay0+aGRyMTBwX2RhdGFfYnVmID0gTlVMTDsKKwkJY2h1bmstPmhkcjEwcF9kYXRhX3NpemUgPSAwOworCX0KKwl2ZGVjLT5oZHIxMHBfZGF0YV92YWxpZCA9IGZhbHNlOworCisJY2h1bmstPm1hZ2ljID0gMHg0YjU1NDg0MzsKKwlpZiAodmRlYy0+cHRzX3ZhbGlkKSB7CisJCWNodW5rLT5wdHMgPSB2ZGVjLT5wdHM7CisJCWNodW5rLT5wdHM2NCA9IHZkZWMtPnB0czY0OworCX0KKworCWlmICh2ZGVjLT50aW1lc3RhbXBfdmFsaWQpCisJCWNodW5rLT50aW1lc3RhbXAgPSB2ZGVjLT50aW1lc3RhbXA7CisKKwlpZiAodmRlYy0+cHRzX3ZhbGlkICYmCisJCWlucHV0LT5sYXN0X2lucHRzX3U2NCA+IDAgJiYKKwkJaW5wdXQtPmxhc3RfaW5fbm9wdHNfY250ID09IDApIHsKKwkJaW50IGQgPSAoaW50KShjaHVuay0+cHRzNjQgLSBpbnB1dC0+bGFzdF9pbnB0c191NjQpOworCQlpZiAoZCA+IDAgJiYgKGQgPCBpbnB1dC0+bGFzdF9kdXJhdGlvbikpCisJCQlpbnB1dC0+bGFzdF9kdXJhdGlvbiA9IGQ7CisJCS8qCWFsd2FzeTogdXNlZCB0aGUgc21hbGxlc3QgZHVyYXRpb247CisJCQlpZiA2MGZwcy0+MzAgZnBzLgorCQkJbWF5YmUgaGF2ZSB3YXJuaW5nIHZhbHVlLgorCQkqLworCX0KKwljaHVuay0+cHRzX3ZhbGlkID0gdmRlYy0+cHRzX3ZhbGlkOworCXZkZWMtPnB0c192YWxpZCA9IGZhbHNlOworCUlOSVRfTElTVF9IRUFEKCZjaHVuay0+bGlzdCk7CisKKwlpZiAodmRlY19zZWN1cmUodmRlYykpIHsKKwkJY2h1bmstPm9mZnNldCA9IDA7CisJCWNodW5rLT5zaXplID0gY291bnQ7CisJCWNodW5rLT5wYWRpbmdfc2l6ZSA9IFBBR0VfQUxJR04oY2h1bmstPnNpemUgKyBuZWVkX3BhZGluZ19zaXplKSAtCisJCQljaHVuay0+c2l6ZTsKKwl9IGVsc2UgeworCQljaHVuay0+b2Zmc2V0ID0gYmxvY2stPndwOworCQljaHVuay0+c2l6ZSA9IGNvdW50OworCQljaHVuay0+cGFkaW5nX3NpemUgPSBuZWVkX3BhZGluZ19zaXplOworCQlpZiAodmZyYW1lX2NodW5rX2ZpbGwoaW5wdXQsIGNodW5rLCBidWYsIGNvdW50LCBibG9jaykpIHsKKwkJCXByX2VycigidmZyYW1lX2NodW5rX2ZpbGwgZmFpbGVkXG4iKTsKKwkJCWtmcmVlKGNodW5rKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwl9CisKKworCWZsYWdzID0gdmRlY19pbnB1dF9sb2NrKGlucHV0KTsKKworCXZmcmFtZV9ibG9ja19hZGRfY2h1bmsoYmxvY2ssIGNodW5rKTsKKworCWxpc3RfYWRkX3RhaWwoJmNodW5rLT5saXN0LCAmaW5wdXQtPnZmcmFtZV9jaHVua19saXN0KTsKKwlpbnB1dC0+ZGF0YV9zaXplICs9IGNodW5rLT5zaXplOworCWlucHV0LT5oYXZlX2ZyYW1lX251bSsrOworCisJaWYgKGlucHV0LT5oYXZlX2ZyYW1lX251bSA9PSAxKQorCQlpbnB1dC0+dmRlY191cCh2ZGVjKTsKKwlBVFJBQ0VfQ09VTlRFUihpbnB1dC0+dmRlY19pbnB1dF9uYW1lLCBpbnB1dC0+aGF2ZV9mcmFtZV9udW0pOworCWlmIChjaHVuay0+cHRzX3ZhbGlkKSB7CisJCWlucHV0LT5sYXN0X2lucHRzX3U2NCA9IGNodW5rLT5wdHM2NDsKKwkJaW5wdXQtPmxhc3RfaW5fbm9wdHNfY250ID0gMDsKKwl9IGVsc2UgeworCQkvKm5vcHRzKi8KKwkJaW5wdXQtPmxhc3RfaW5fbm9wdHNfY250Kys7CisJfQorCWlmIChjaHVuay0+c2l6ZSA+IGlucHV0LT5mcmFtZV9tYXhfc2l6ZSkKKwkJaW5wdXQtPmZyYW1lX21heF9zaXplID0gY2h1bmstPnNpemU7CisJaW5wdXQtPnRvdGFsX3dyX2NvdW50ICs9IGNvdW50OworCXZkZWNfaW5wdXRfdW5sb2NrKGlucHV0LCBmbGFncyk7CisjaWYgMAorCWlmIChhZGRfY291bnQgPT0gMikKKwkJaW5wdXQtPnRvdGFsX3dyX2NvdW50ICs9IDM4OworI2VuZGlmCisKKwlyZXR1cm4gY291bnQ7Cit9CisKK2ludCB2ZGVjX2lucHV0X2FkZF9mcmFtZShzdHJ1Y3QgdmRlY19pbnB1dF9zICppbnB1dCwgY29uc3QgY2hhciAqYnVmLAorCQkJc2l6ZV90IGNvdW50KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBkcm1faW5mbyBkcm07CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGlucHV0LT52ZGVjOworCXVuc2lnbmVkIGxvbmcgcGh5X2J1ZjsKKworCWlmICh2ZGVjX3NlY3VyZSh2ZGVjKSkgeworCQl3aGlsZSAoY291bnQgPiAwKSB7CisJCQlpZiAoY291bnQgPCBzaXplb2Yoc3RydWN0IGRybV9pbmZvKSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCopJmRybSwgYnVmICsgcmV0LCBzaXplb2Yoc3RydWN0IGRybV9pbmZvKSkpCisJCQkJcmV0dXJuIC1FQUdBSU47CisJCQlpZiAoIShkcm0uZHJtX2ZsYWcgJiBUWVBFX0RSTUlORk9fVjIpKQorCQkJCXJldHVybiAtRUlPOyAvKm11c3QgZHJtIGluZm8gdjIgdmVyc2lvbiovCisJCQlwaHlfYnVmID0gKHVuc2lnbmVkIGxvbmcpIGRybS5kcm1fcGh5OworCQkJdmRlY19pbnB1dF9hZGRfY2h1bmsoaW5wdXQsIChjaGFyICopcGh5X2J1ZiwKKwkJCQkoc2l6ZV90KWRybS5kcm1fcGt0c2l6ZSwgZHJtLmhhbmRsZSwgTlVMTCwgTlVMTCk7CisJCQljb3VudCAtPSBzaXplb2Yoc3RydWN0IGRybV9pbmZvKTsKKwkJCXJldCArPSBzaXplb2Yoc3RydWN0IGRybV9pbmZvKTsKKworCQkJLyogdGhlIGRybSBmcmFtZSBkYXRhIG1pZ2h0IGluY2x1ZGUgaGVhZCBpbmZvcyBhbmQgcmF3ICovCisJCQkvKiBkYXRhIHRodXMgdGhlIG5leHQgZHJtIHVuaXQgc3RpbGwgbmVlZCBhIHZhbGlkIHB0cy4qLworCQkJaWYgKGNvdW50ID49IHNpemVvZihzdHJ1Y3QgZHJtX2luZm8pKQorCQkJCXZkZWMtPnB0c192YWxpZCA9IHRydWU7CisJCX0KKwl9IGVsc2UgeworCQlyZXQgPSB2ZGVjX2lucHV0X2FkZF9jaHVuayhpbnB1dCwgYnVmLCBjb3VudCwgMCwgTlVMTCwgTlVMTCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19pbnB1dF9hZGRfZnJhbWUpOworCitpbnQgdmRlY19pbnB1dF9hZGRfZnJhbWVfd2l0aF9kbWEoc3RydWN0IHZkZWNfaW5wdXRfcyAqaW5wdXQsIHVsb25nIGFkZHIsCisJc2l6ZV90IGNvdW50LCB1MzIgaGFuZGxlLCBjaHVua19mcmVlIGZyZWUsIHZvaWQqIHByaXYpCit7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGlucHV0LT52ZGVjOworCisJcmV0dXJuIHZkZWNfc2VjdXJlKHZkZWMpID8KKwkJdmRlY19pbnB1dF9hZGRfY2h1bmsoaW5wdXQsCisJCQkoY2hhciAqKWFkZHIsIGNvdW50LCBoYW5kbGUsIGZyZWUsIHByaXYpIDogLTE7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfaW5wdXRfYWRkX2ZyYW1lX3dpdGhfZG1hKTsKKworc3RydWN0IHZmcmFtZV9jaHVua19zICp2ZGVjX2lucHV0X25leHRfY2h1bmsoc3RydWN0IHZkZWNfaW5wdXRfcyAqaW5wdXQpCit7CisJc3RydWN0IHZmcmFtZV9jaHVua19zICpjaHVuayA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlmbGFncyA9IHZkZWNfaW5wdXRfbG9jayhpbnB1dCk7CisJaWYgKCFsaXN0X2VtcHR5KCZpbnB1dC0+dmZyYW1lX2NodW5rX2xpc3QpKSB7CisJCWNodW5rID0gbGlzdF9maXJzdF9lbnRyeSgmaW5wdXQtPnZmcmFtZV9jaHVua19saXN0LAorCQkJCXN0cnVjdCB2ZnJhbWVfY2h1bmtfcywgbGlzdCk7CisJfQorCXZkZWNfaW5wdXRfdW5sb2NrKGlucHV0LCBmbGFncyk7CisJcmV0dXJuIGNodW5rOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX2lucHV0X25leHRfY2h1bmspOworCitzdHJ1Y3QgdmZyYW1lX2NodW5rX3MgKnZkZWNfaW5wdXRfbmV4dF9pbnB1dF9jaHVuaygKKwkJCXN0cnVjdCB2ZGVjX2lucHV0X3MgKmlucHV0KQoreworCXN0cnVjdCB2ZnJhbWVfY2h1bmtfcyAqY2h1bmsgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlmbGFncyA9IHZkZWNfaW5wdXRfbG9jayhpbnB1dCk7CisKKwlsaXN0X2Zvcl9lYWNoKHAsICZpbnB1dC0+dmZyYW1lX2NodW5rX2xpc3QpIHsKKwkJc3RydWN0IHZmcmFtZV9jaHVua19zICpjID0gbGlzdF9lbnRyeSgKKwkJCXAsIHN0cnVjdCB2ZnJhbWVfY2h1bmtfcywgbGlzdCk7CisJCWlmICgoYy0+ZmxhZyAmIFZGUkFNRV9DSFVOS19GTEFHX0NPTlNVTUVEKSA9PSAwKSB7CisJCQljaHVuayA9IGM7CisJCQlicmVhazsKKwkJfQorCX0KKwl2ZGVjX2lucHV0X3VubG9jayhpbnB1dCwgZmxhZ3MpOworCXJldHVybiBjaHVuazsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19pbnB1dF9uZXh0X2lucHV0X2NodW5rKTsKKwordm9pZCB2ZGVjX2lucHV0X3JlbGVhc2VfY2h1bmsoc3RydWN0IHZkZWNfaW5wdXRfcyAqaW5wdXQsCisJCQlzdHJ1Y3QgdmZyYW1lX2NodW5rX3MgKmNodW5rKQoreworCXN0cnVjdCB2ZnJhbWVfY2h1bmtfcyAqcDsKKwl1MzIgY2h1bmtfdmFsaWQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHZmcmFtZV9ibG9ja19saXN0X3MgKmJsb2NrID0gY2h1bmstPmJsb2NrOworCXN0cnVjdCB2ZnJhbWVfYmxvY2tfbGlzdF9zICp0b2ZyZWVibG9jayA9IE5VTEw7CisJZmxhZ3MgPSB2ZGVjX2lucHV0X2xvY2soaW5wdXQpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmaW5wdXQtPnZmcmFtZV9jaHVua19saXN0LCBsaXN0KSB7CisJCWlmIChwID09IGNodW5rKSB7CisJCQljaHVua192YWxpZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwkvKiAyIHRocmVhZHMgZ28gaGVyZSwgdGhlIG90aGVyIGRvbmUgdGhlIGRlbGV0aW9uLHNvIHJldHVybiovCisJaWYgKGNodW5rX3ZhbGlkID09IDApIHsKKwkJdmRlY19pbnB1dF91bmxvY2soaW5wdXQsIGZsYWdzKTsKKwkJcHJfZXJyKCIlcyBjaHVuayBpcyBkZWxldGVkLHNvIHJldHVybi5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWxpc3RfZGVsKCZjaHVuay0+bGlzdCk7CisJaW5wdXQtPmhhdmVfZnJhbWVfbnVtLS07CisJQVRSQUNFX0NPVU5URVIoaW5wdXQtPnZkZWNfaW5wdXRfbmFtZSwgaW5wdXQtPmhhdmVfZnJhbWVfbnVtKTsKKwlpZiAoY2h1bmstPnB0c192YWxpZCkgeworCQlpbnB1dC0+bGFzdF9jb21zdW1lZF9ub19wdHNfY250ID0gMDsKKwkJaW5wdXQtPmxhc3RfY29tc3VtZWRfcHRzX3U2NCA9IGNodW5rLT5wdHM2NDsKKwl9IGVsc2UKKwkJaW5wdXQtPmxhc3RfY29tc3VtZWRfbm9fcHRzX2NudCsrOworCWJsb2NrLT5ycCArPSBjaHVuay0+c2l6ZTsKKwlpZiAoYmxvY2stPnJwID49IGJsb2NrLT5zaXplKQorCQlibG9jay0+cnAgLT0gYmxvY2stPnNpemU7CisJYmxvY2stPmRhdGFfc2l6ZSAtPSBjaHVuay0+c2l6ZTsKKwlibG9jay0+Y2h1bmtfY291bnQtLTsKKwlpbnB1dC0+ZGF0YV9zaXplIC09IGNodW5rLT5zaXplOworCWlucHV0LT50b3RhbF9yZF9jb3VudCArPSBjaHVuay0+c2l6ZTsKKwlpZiAoYmxvY2stPmlzX291dF9idWYpIHsKKwkJbGlzdF9tb3ZlX3RhaWwoJmJsb2NrLT5saXN0LAorCQkJJmlucHV0LT52ZnJhbWVfYmxvY2tfZnJlZV9saXN0KTsKKwkJaWYgKGJsb2NrLT5mcmVlKSB7CisJCQl2ZGVjX2lucHV0X2RlbF9ibG9ja19sb2NrZWQoaW5wdXQsIGJsb2NrKTsKKwkJCWJsb2NrLT5mcmVlKGJsb2NrLT5wcml2LCBibG9jay0+aGFuZGxlKTsKKwkJCWtmcmVlKGJsb2NrKTsKKwkJfQorCX0gZWxzZSBpZiAoYmxvY2stPmNodW5rX2NvdW50ID09IDAgJiYKKwkJaW5wdXQtPndyX2Jsb2NrICE9IGJsb2NrICkgey8qZG9uJ3QgZnJlZSB1c2VkIGJsb2NrKi8KKwkJaWYgKGJsb2NrLT5zaXplIDwgaW5wdXQtPmRlZmF1bHRfYmxvY2tfc2l6ZSkgeworCQkJdmRlY19pbnB1dF9kZWxfYmxvY2tfbG9ja2VkKGlucHV0LCBibG9jayk7CisJCQl0b2ZyZWVibG9jayA9IGJsb2NrOworCQl9IGVsc2UgeworCQkJYmxvY2stPnJwID0gMDsKKwkJCWJsb2NrLT53cCA9IDA7CisJCQlsaXN0X21vdmVfdGFpbCgmYmxvY2stPmxpc3QsCisJCQkJJmlucHV0LT52ZnJhbWVfYmxvY2tfZnJlZV9saXN0KTsKKwkJfQorCX0KKworCXZkZWNfaW5wdXRfdW5sb2NrKGlucHV0LCBmbGFncyk7CisJaWYgKHRvZnJlZWJsb2NrKQorCQl2ZnJhbWVfYmxvY2tfZnJlZV9ibG9jayh0b2ZyZWVibG9jayk7CisJa2ZyZWUoY2h1bmspOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX2lucHV0X3JlbGVhc2VfY2h1bmspOworCit1bnNpZ25lZCBsb25nIHZkZWNfaW5wdXRfbG9jayhzdHJ1Y3QgdmRlY19pbnB1dF9zICppbnB1dCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlucHV0LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZmxhZ3M7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfaW5wdXRfbG9jayk7CisKK3ZvaWQgdmRlY19pbnB1dF91bmxvY2soc3RydWN0IHZkZWNfaW5wdXRfcyAqaW5wdXQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5wdXQtPmxvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19pbnB1dF91bmxvY2spOworCit2b2lkIHZkZWNfaW5wdXRfcmVsZWFzZShzdHJ1Y3QgdmRlY19pbnB1dF9zICppbnB1dCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqdG1wOworCisJLyogcmVsZWFzZSBjaHVuayBkYXRhICovCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIHRtcCwgJmlucHV0LT52ZnJhbWVfY2h1bmtfbGlzdCkgeworCQlzdHJ1Y3QgdmZyYW1lX2NodW5rX3MgKmNodW5rID0gbGlzdF9lbnRyeSgKKwkJCQlwLCBzdHJ1Y3QgdmZyYW1lX2NodW5rX3MsIGxpc3QpOworCQl2ZGVjX2lucHV0X3JlbGVhc2VfY2h1bmsoaW5wdXQsIGNodW5rKTsKKwl9CisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIHRtcCwgJmlucHV0LT52ZnJhbWVfYmxvY2tfbGlzdCkgeworCQkvKnNob3VsZCBuZXZlciBoZXJlLiovCisJCWxpc3RfbW92ZV90YWlsKHAsICZpbnB1dC0+dmZyYW1lX2Jsb2NrX2ZyZWVfbGlzdCk7CisJfQorCS8qIHJlbGVhc2UgaW5wdXQgYmxvY2tzICovCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIHRtcCwgJmlucHV0LT52ZnJhbWVfYmxvY2tfZnJlZV9saXN0KSB7CisJCXN0cnVjdCB2ZnJhbWVfYmxvY2tfbGlzdF9zICpibG9jayA9IGxpc3RfZW50cnkoCisJCQlwLCBzdHJ1Y3QgdmZyYW1lX2Jsb2NrX2xpc3RfcywgbGlzdCk7CisJCXZkZWNfaW5wdXRfZGVsX2Jsb2NrX2xvY2tlZChpbnB1dCwgYmxvY2spOworCQl2ZnJhbWVfYmxvY2tfZnJlZV9ibG9jayhibG9jayk7CisJfQorCisJLyogcmVsZWFzZSBzd2FwIHBhZ2VzICovCisJaWYgKHZkZWNfc2VjdXJlKGlucHV0LT52ZGVjKSkgeworCQlpZiAoaW5wdXQtPnN3YXBfcGFnZV9waHlzKQorCQkJY29kZWNfbW1fZnJlZV9mb3JfZG1hKCJTV0FQIiwgaW5wdXQtPnN3YXBfcGFnZV9waHlzKTsKKwl9IGVsc2UgeworCQlpZiAoaW5wdXQtPnN3YXBfcGFnZSkKKwkJCWNvZGVjX21tX2RtYV9mcmVlX2NvaGVyZW50KGlucHV0LT5tZW1faGFuZGxlKTsKKwl9CisJaW5wdXQtPnN3YXBfcGFnZSA9IE5VTEw7CisJaW5wdXQtPnN3YXBfcGFnZV9waHlzID0gMDsKKwlpbnB1dC0+c3dhcF92YWxpZCA9IGZhbHNlOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX2lucHV0X3JlbGVhc2UpOworCit1MzIgdmRlY19pbnB1dF9nZXRfZnJlZWRfaGFuZGxlKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IHZmcmFtZV9ibG9ja19saXN0X3MgKmJsb2NrOworCXN0cnVjdCB2ZGVjX2lucHV0X3MgKmlucHV0ID0gJnZkZWMtPmlucHV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGhhbmRsZSA9IDA7CisKKwlpZiAoIXZkZWMpCisJCXJldHVybiAwOworCisJaWYgKCF2ZGVjX3NlY3VyZSh2ZGVjKSkKKwkJcmV0dXJuIDA7CisKKwlmbGFncyA9IHZkZWNfaW5wdXRfbG9jayhpbnB1dCk7CisJZG8geworCQlibG9jayA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmaW5wdXQtPnZmcmFtZV9ibG9ja19mcmVlX2xpc3QsCisJCXN0cnVjdCB2ZnJhbWVfYmxvY2tfbGlzdF9zLCBsaXN0KTsKKwkJaWYgKCFibG9jaykgeworCQkJYnJlYWs7CisJCX0KKworCQloYW5kbGUgPSBibG9jay0+aGFuZGxlOworCQl2ZGVjX2lucHV0X2RlbF9ibG9ja19sb2NrZWQoaW5wdXQsIGJsb2NrKTsKKwkJaWYgKGJsb2NrLT5mcmVlKQorCQkJYmxvY2stPmZyZWUoYmxvY2stPnByaXYsIGhhbmRsZSk7CisJCWtmcmVlKGJsb2NrKTsKKworCX0gd2hpbGUoIWhhbmRsZSk7CisKKwl2ZGVjX2lucHV0X3VubG9jayhpbnB1dCwgZmxhZ3MpOworCXJldHVybiBoYW5kbGU7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfaW5wdXRfZ2V0X2ZyZWVkX2hhbmRsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdmRlY19pbnB1dC5oIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWNfaW5wdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzgzZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWNfaW5wdXQuaApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9tZWRpYS9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWNfaW5wdXQuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIFZERUNfSU5QVVRfSAorI2RlZmluZSBWREVDX0lOUFVUX0gKKworc3RydWN0IHZkZWNfczsKK3N0cnVjdCB2ZGVjX2lucHV0X3M7CisKK3R5cGVkZWYgdm9pZCAoKmNodW5rX2ZyZWUpKHZvaWQgKnByaXYsIHUzMiBoYW5kbGUpOworCitzdHJ1Y3QgdmZyYW1lX2Jsb2NrX2xpc3RfcyB7CisJdTMyIG1hZ2ljOworCWludCBpZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdWxvbmcgc3RhcnQ7CisJdm9pZCAqc3RhcnRfdmlydDsKKwl1bG9uZyBhZGRyOworCWJvb2wgaXNfbWFwcGVkOworCWludCB0eXBlOworCXUzMiBzaXplOworCXUzMiB3cDsKKwl1MzIgcnA7CisJaW50IGRhdGFfc2l6ZTsKKwlpbnQgY2h1bmtfY291bnQ7CisJaW50IGlzX291dF9idWY7CisJdTMyIGhhbmRsZTsKKwl1bG9uZyBtZW1faGFuZGxlOworCS8qIGZyZWUgY2FsbGJhY2sgKi8KKwljaHVua19mcmVlIGZyZWU7CisJdm9pZCogcHJpdjsKKworCXN0cnVjdCB2ZGVjX2lucHV0X3MgKmlucHV0OworfTsKKworI2RlZmluZSBWRlJBTUVfQ0hVTktfRkxBR19DT05TVU1FRCAgMHgwMDAxCisKK3N0cnVjdCB2ZnJhbWVfY2h1bmtfcyB7CisJdTMyIG1hZ2ljOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlpbnQgZmxhZzsKKwl1MzIgb2Zmc2V0OworCXUzMiBzaXplOworCXUzMiBwdHM7CisJdTMyIHBhZGluZ19zaXplOworCXU2NCBwdHM2NDsKKwlib29sIHB0c192YWxpZDsKKwl1NjQgdGltZXN0YW1wOworCWJvb2wgdGltZXN0YW1wX3ZhbGlkOworCXU2NCBzZXF1ZW5jZTsKKwlzdHJ1Y3QgdmZyYW1lX2Jsb2NrX2xpc3RfcyAqYmxvY2s7CisJdTMyIGhkcjEwcF9kYXRhX3NpemU7CisJY2hhciAqaGRyMTBwX2RhdGFfYnVmOworfTsKKworI2RlZmluZSBWREVDX0lOUFVUX1RBUkdFVF9WTEQgICAgICAgICAgIDAKKyNkZWZpbmUgVkRFQ19JTlBVVF9UQVJHRVRfSEVWQyAgICAgICAgICAxCisjZGVmaW5lIFZMRF9QQURESU5HX1NJWkUgICAgICAgICAgICAgICAgMTAyNAorI2RlZmluZSBIRVZDX1BBRERJTkdfU0laRSAgICAgICAgICAgICAgICgxMDI0KjE2KQorCitzdHJ1Y3QgdmRlY19pbnB1dF9zIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHZmcmFtZV9ibG9ja19saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgdmZyYW1lX2NodW5rX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCB2ZnJhbWVfYmxvY2tfZnJlZV9saXN0OworCXN0cnVjdCB2ZnJhbWVfYmxvY2tfbGlzdF9zICp3cl9ibG9jazsKKwlpbnQgaGF2ZV9mcmVlX2Jsb2NrczsKKwlpbnQgbm9fbWVtX2Vycl9jbnQ7Lyp3aGVuIGFsbG9jIG5vIG1lbSBjbnQrKyovCisJaW50IGJsb2NrX251bXM7CisJaW50IGJsb2NrX2lkX3NlcTsKKwlpbnQgaWQ7CisJc3BpbmxvY2tfdCBsb2NrOworCWludCB0eXBlOworCWludCB0YXJnZXQ7CisJc3RydWN0IHZkZWNfcyAqdmRlYzsKKwlib29sIHN3YXBfdmFsaWQ7CisJYm9vbCBzd2FwX25lZWRlZDsKKwlib29sIGVvczsKKwl1bG9uZyBtZW1faGFuZGxlOworCXZvaWQgKnN3YXBfcGFnZTsKKwlkbWFfYWRkcl90IHN3YXBfcGFnZV9waHlzOworCXU2NCB0b3RhbF93cl9jb3VudDsKKwl1NjQgdG90YWxfcmRfY291bnQ7CisJdTY0IHN0cmVhbWluZ19ycDsKKwl1MzIgc3dhcF9ycDsKKwlib29sIGxhc3Rfc3dhcF9zbGF2ZTsKKwlpbnQgZGlydHlfY291bnQ7CisJdTY0IHNlcXVlbmNlOworCXVuc2lnbmVkIHN0YXJ0OworCXVuc2lnbmVkIHNpemU7CisJaW50IGRlZmF1bHRfYmxvY2tfc2l6ZTsKKwlpbnQgZGF0YV9zaXplOworCWludCBmcmFtZV9tYXhfc2l6ZTsKKwlpbnQgcHJlcGFyZV9sZXZlbDsKKy8qZm9yIGNoZWNrIGZyYW1lIGRlbGF5LiovCisJdTY0IGxhc3RfaW5wdHNfdTY0OworCXU2NCBsYXN0X2NvbXN1bWVkX3B0c191NjQ7CisJaW50IGxhc3RfaW5fbm9wdHNfY250OworCWludCBsYXN0X2NvbXN1bWVkX25vX3B0c19jbnQ7CisJaW50IGxhc3RfZHVyYXRpb247CisvKmZvciBjaGVjayBmcmFtZSBkZWxheS4qLworCWludCBoYXZlX2ZyYW1lX251bTsKKwlpbnQgc3RyZWFtX2Nvb2tpZTsgLyogd3JhcCBjb3VudCBmb3IgdmxkX21lbSBhbmQKKwkJCSAgICAgIEhFVkNfU0hJRlRfQllURV9DT1VOVCBmb3IgaGV2YyAqLworCWNoYXIgdmRlY19pbnB1dF9uYW1lWzMyXTsKKwlib29sICgqdmRlY19pc19pbnB1dF9mcmFtZV9lbXB0eSkoc3RydWN0IHZkZWNfcyAqKTsKKwl2b2lkICgqdmRlY191cCkoc3RydWN0IHZkZWNfcyAqKTsKK307CisKK3N0cnVjdCB2ZGVjX2lucHV0X3N0YXR1c19zIHsKKwlpbnQgc2l6ZTsKKwlpbnQgZGF0YV9sZW47CisJaW50IGZyZWVfbGVuOworCWludCByZWFkX3BvaW50ZXI7Cit9OworCisjZGVmaW5lIGlucHV0X2ZyYW1lX2Jhc2VkKGlucHV0KSBcCisJKCgoaW5wdXQpLT50eXBlID09IFZERUNfVFlQRV9GUkFNRV9CTE9DSykgfHwgXAorCSAoKGlucHV0KS0+dHlwZSA9PSBWREVDX1RZUEVfRlJBTUVfQ0lSQ1VMQVIpKQorI2RlZmluZSBpbnB1dF9zdHJlYW1fYmFzZWQoaW5wdXQpIFwKKwkoKChpbnB1dCktPnR5cGUgPT0gVkRFQ19UWVBFX1NUUkVBTV9QQVJTRVIpIHx8IFwKKwkgKChpbnB1dCktPnR5cGUgPT0gVkRFQ19UWVBFX1NJTkdMRSkpCisKKy8qIEluaXRpYWxpemUgdmRlY19pbnB1dCBzdHJ1Y3R1cmUgKi8KK2V4dGVybiB2b2lkIHZkZWNfaW5wdXRfaW5pdChzdHJ1Y3QgdmRlY19pbnB1dF9zICppbnB1dCwgc3RydWN0IHZkZWNfcyAqdmRlYyk7CitleHRlcm4gaW50IHZkZWNfaW5wdXRfcHJlcGFyZV9idWZzKHN0cnVjdCB2ZGVjX2lucHV0X3MgKmlucHV0LAorCWludCBmcmFtZV93aWR0aCwgaW50IGZyYW1lX2hlaWdodCk7CisKKy8qIEdldCBhdmFpbGFibGUgaW5wdXQgZGF0YSBzaXplICovCitleHRlcm4gaW50IHZkZWNfaW5wdXRfbGV2ZWwoc3RydWN0IHZkZWNfaW5wdXRfcyAqaW5wdXQpOworCisvKiBTZXQgaW5wdXQgdHlwZSBhbmQgdGFyZ2V0ICovCitleHRlcm4gdm9pZCB2ZGVjX2lucHV0X3NldF90eXBlKHN0cnVjdCB2ZGVjX2lucHV0X3MgKmlucHV0LCBpbnQgdHlwZSwKKwlpbnQgdGFyZ2V0KTsKKworLyogU2V0IHN0cmVhbSBidWZmZXIgaW5mb3JtYXRpb24gZm9yIHN0cmVhbSBiYXNlZCBpbnB1dCAqLworZXh0ZXJuIGludCB2ZGVjX2lucHV0X3NldF9idWZmZXIoc3RydWN0IHZkZWNfaW5wdXRfcyAqaW5wdXQsIHUzMiBzdGFydCwKKwl1MzIgc2l6ZSk7CisKKy8qIEFkZCBlbnF1ZXVlIHZpZGVvIGRhdGEgaW50byBkZWNvZGVyJ3MgaW5wdXQgKi8KK2V4dGVybiBpbnQgdmRlY19pbnB1dF9hZGRfZnJhbWUoc3RydWN0IHZkZWNfaW5wdXRfcyAqaW5wdXQsIGNvbnN0IGNoYXIgKmJ1ZiwKKwlzaXplX3QgY291bnQpOworCitleHRlcm4gaW50IHZkZWNfaW5wdXRfYWRkX2ZyYW1lX3dpdGhfZG1hKHN0cnVjdCB2ZGVjX2lucHV0X3MgKmlucHV0LCB1bG9uZyBhZGRyLAorCXNpemVfdCBjb3VudCwgdTMyIGhhbmRsZSwgY2h1bmtfZnJlZSBmcmVlLCB2b2lkKiBwcml2KTsKKworLyogUGVlayBuZXh0IGZyYW1lIGRhdGEgZnJvbSBkZWNvZGVyJ3MgaW5wdXQgKi8KK2V4dGVybiBzdHJ1Y3QgdmZyYW1lX2NodW5rX3MgKnZkZWNfaW5wdXRfbmV4dF9jaHVuaygKKwkJCXN0cnVjdCB2ZGVjX2lucHV0X3MgKmlucHV0KTsKKworLyogUGVlayBuZXh0IGZyYW1lIGRhdGEgZnJvbSBkZWNvZGVyJ3MgaW5wdXQsIG5vdCBtYXJrZWQgYXMgY29uc3VtZWQgKi8KK2V4dGVybiBzdHJ1Y3QgdmZyYW1lX2NodW5rX3MgKnZkZWNfaW5wdXRfbmV4dF9pbnB1dF9jaHVuaygKKwkJCXN0cnVjdCB2ZGVjX2lucHV0X3MgKmlucHV0KTsKKworLyogQ29uc3VtZSBuZXh0IGZyYW1lIGRhdGEgZnJvbSBkZWNvZGVyJ3MgaW5wdXQgKi8KK2V4dGVybiB2b2lkIHZkZWNfaW5wdXRfcmVsZWFzZV9jaHVuayhzdHJ1Y3QgdmRlY19pbnB1dF9zICppbnB1dCwKKwlzdHJ1Y3QgdmZyYW1lX2NodW5rX3MgKmNodW5rKTsKKworLyogR2V0IGRlY29kZXIgaW5wdXQgYnVmZmVyIHN0YXR1cyAqLworZXh0ZXJuIGludCB2ZGVjX2lucHV0X2dldF9zdGF0dXMoc3RydWN0IHZkZWNfaW5wdXRfcyAqaW5wdXQsCisJc3RydWN0IHZkZWNfaW5wdXRfc3RhdHVzX3MgKnN0YXR1cyk7CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIHZkZWNfaW5wdXRfbG9jayhzdHJ1Y3QgdmRlY19pbnB1dF9zICppbnB1dCk7CisKK2V4dGVybiB2b2lkIHZkZWNfaW5wdXRfdW5sb2NrKHN0cnVjdCB2ZGVjX2lucHV0X3MgKmlucHV0LCB1bnNpZ25lZCBsb25nIGxvY2spOworCisvKiByZWxlYXNlIGFsbCByZXNvdXJjZSBmb3IgZGVjb2RlcidzIGlucHV0ICovCitleHRlcm4gdm9pZCB2ZGVjX2lucHV0X3JlbGVhc2Uoc3RydWN0IHZkZWNfaW5wdXRfcyAqaW5wdXQpOworLyogcmV0dXJuIGJsb2NrIGhhbmRsZSBhbmQgZnJlZSBibG9jayAqLworZXh0ZXJuIHUzMiB2ZGVjX2lucHV0X2dldF9mcmVlZF9oYW5kbGUoc3RydWN0IHZkZWNfcyAqdmRlYyk7CitpbnQgdmRlY19pbnB1dF9kdW1wX2NodW5rcyhpbnQgaWQsIHN0cnVjdCB2ZGVjX2lucHV0X3MgKmlucHV0LAorCWNoYXIgKmJ1ZnMsIGludCBzaXplKTsKK2ludCB2ZGVjX2lucHV0X2R1bXBfYmxvY2tzKHN0cnVjdCB2ZGVjX2lucHV0X3MgKmlucHV0LAorCWNoYXIgKmJ1ZnMsIGludCBzaXplKTsKKworaW50IHZkZWNfaW5wdXRfZ2V0X2R1cmF0aW9uX3U2NChzdHJ1Y3QgdmRlY19pbnB1dF9zICppbnB1dCk7CisKKyNlbmRpZiAvKiBWREVDX0lOUFVUX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjX3Bvd2VyX2N0cmwuYyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjX3Bvd2VyX2N0cmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDNjNDVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWNfcG93ZXJfY3RybC5jCkBAIC0wLDAgKzEsODA4IEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL21lZGlhL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdmRlY19wb3dlcl9jdHJsLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2RlZmluZSBERUJVRworI2luY2x1ZGUgInZkZWNfcG93ZXJfY3RybC5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmRlY19yZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL3Bvd2VyX2N0cmwuaD4KKy8vI2luY2x1ZGUgPGR0LWJpbmRpbmdzL3Bvd2VyL3NjMi1wZC5oPgorLy8jaW5jbHVkZSA8bGludXgvYW1sb2dpYy9wd3JfY3RybC5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvcG93ZXJfZG9tYWluLmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvcG93ZXIvc2MyLXBkLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jb2RlY19tbS9jb2RlY19tbS5oPgorI2luY2x1ZGUgIi4uLy4uLy4uL2NvbW1vbi9tZWRpYV9jbG9jay9zd2l0Y2gvYW1wb3J0c19nYXRlLmgiCisjaW5jbHVkZSAiLi4vLi4vLi4vY29tbW9uL2NoaXBzL2RlY29kZXJfY3B1X3Zlcl9pbmZvLmgiCisjaW5jbHVkZSAiLi4vLi4vLi4vY29tbW9uL21lZGlhX2Nsb2NrL2Nsay9jbGsuaCIKKworI2RlZmluZSBIRVZDX1RFU1RfTElNSVQJCSgxMDApCisjZGVmaW5lIEdYQkJfUkVWX0FfTUlOT1IJKDB4YSkKKworI2RlZmluZSBQRElEX0RTUCAgICAgICAgICAgIDAKKyNkZWZpbmUgUERJRF9ET1NfSENPREVDICAgICAgICAgICAgIDEKKyNkZWZpbmUgUERJRF9ET1NfSEVWQyAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUERJRF9ET1NfVkRFQyAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUERJRF9ET1NfV0FWRSAgICAgICAgICAgICAgIDQKKworZXh0ZXJuIGludCBub19wb3dlcmRvd247CitleHRlcm4gaW50IGhldmNfbWF4X3Jlc2V0X2NvdW50OworCitzdHJ1Y3QgcG1fbmFtZV9zIHsKKwlpbnQgdHlwZTsKKwljb25zdCBjaGFyICpuYW1lOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwbV9uYW1lX3MgcG1fbmFtZVtdID0geworCXtQTV9QT1dFUl9DVFJMX1JXX1JFRywJCSJsZWdhY3kifSwKKwl7UE1fUE9XRVJfQ1RSTF9BUEksCQkicG93ZXItY3RybC1hcGkifSwKKwl7UE1fUE9XRVJfRE9NQUlOLAkJInBvd2VyLWRvbWFpbiJ9LAorCXtQTV9QT1dFUl9ET01BSU5fU0VDX0FQSSwJInBkLXNlYy1hcGkifSwKKwl7UE1fUE9XRVJfRE9NQUlOX05PTlNFQ19BUEksCSJwZC1ub24tc2VjLWFwaSJ9LAorfTsKKworY29uc3QgY2hhciAqZ2V0X3BtX25hbWUoaW50IHR5cGUpCit7CisJY29uc3QgY2hhciAqbmFtZSA9ICJ1bmtub3duIjsKKwlpbnQgaSwgc2l6ZSA9IEFSUkFZX1NJWkUocG1fbmFtZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCWlmICh0eXBlID09IHBtX25hbWVbaV0udHlwZSkKKwkJCW5hbWUgPSBwbV9uYW1lW2ldLm5hbWU7CisJfQorCisJcmV0dXJuIG5hbWU7Cit9CitFWFBPUlRfU1lNQk9MKGdldF9wbV9uYW1lKTsKKworc3RhdGljIHN0cnVjdCBwbV9wZF9zIHBtX2RvbWFpbl9kYXRhW10gPSB7CisJeyAubmFtZSA9ICJwd3JjLXZkZWMiLCB9LAorCXsgLm5hbWUgPSAicHdyYy1oY29kZWMiLH0sCisJeyAubmFtZSA9ICJwd3JjLXZkZWMtMiIsIH0sCisJeyAubmFtZSA9ICJwd3JjLWhldmMiLCB9LAorCXsgLm5hbWUgPSAicHdyYy1oZXZjLWIiLCB9LAorCXsgLm5hbWUgPSAicHdyYy13YXZlIiwgfSwKK307CisKK3N0YXRpYyB2b2lkIHBtX3ZkZWNfcG93ZXJfc3dpdGNoKHN0cnVjdCBwbV9wZF9zICpwZCwgaW50IGlkLCBib29sIG9uKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHBkW2lkXS5kZXY7CisKKwlpZiAob24pCisJCXBtX3J1bnRpbWVfZ2V0X3N5bmMoZGV2KTsKKwllbHNlCisJCXBtX3J1bnRpbWVfcHV0X3N5bmMoZGV2KTsKKworCXByX2RlYnVnKCJ0aGUgJS0xNXMgcG93ZXIgJXNcbiIsCisJCXBkW2lkXS5uYW1lLCBvbiA/ICJvbiIgOiAib2ZmIik7Cit9CisKK3N0YXRpYyBpbnQgcG1fdmRlY19wb3dlcl9kb21haW5faW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IGksIGVycjsKKwljb25zdCBzdHJ1Y3QgcG93ZXJfbWFuYWdlcl9zICpwbSA9IG9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YShkZXYpOworCXN0cnVjdCBwbV9wZF9zICpwZCA9IHBtLT5wZF9kYXRhOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocG1fZG9tYWluX2RhdGEpOyBpKyspIHsKKwkJcGRbaV0uZGV2ID0gZGV2X3BtX2RvbWFpbl9hdHRhY2hfYnlfbmFtZShkZXYsIHBkW2ldLm5hbWUpOworCQlpZiAoSVNfRVJSX09SX05VTEwocGRbaV0uZGV2KSkgeworCQkJZXJyID0gUFRSX0VSUihwZFtpXS5kZXYpOworCQkJZGV2X2VycihkZXYsICJHZXQgJXMgZmFpbGVkLCBwbS1kb21haW46ICVkXG4iLAorCQkJCXBkW2ldLm5hbWUsIGVycik7CisJCQljb250aW51ZTsKKwkJfQorCisJCXBkW2ldLmxpbmsgPSBkZXZpY2VfbGlua19hZGQoZGV2LCBwZFtpXS5kZXYsCisJCQkJCSAgICAgRExfRkxBR19QTV9SVU5USU1FIHwKKwkJCQkJICAgICBETF9GTEFHX1NUQVRFTEVTUyk7CisJCWlmIChJU19FUlJfT1JfTlVMTChwZFtpXS5saW5rKSkgeworCQkJZGV2X2VycihkZXYsICJBZGRpbmcgJXMgZGV2aWNlIGxpbmsgZmFpbGVkIVxuIiwKKwkJCQlwZFtpXS5uYW1lKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJcHJfZGVidWcoInBvd2VyIGRvbWFpbjogbmFtZTogJXMsIGRldjogJXB4LCBsaW5rOiAlcHhcbiIsCisJCQlwZFtpXS5uYW1lLCBwZFtpXS5kZXYsIHBkW2ldLmxpbmspOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwbV92ZGVjX3Bvd2VyX2RvbWFpbl9yZWxlc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCBpOworCWNvbnN0IHN0cnVjdCBwb3dlcl9tYW5hZ2VyX3MgKnBtID0gb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKGRldik7CisJc3RydWN0IHBtX3BkX3MgKnBkID0gcG0tPnBkX2RhdGE7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwbV9kb21haW5fZGF0YSk7IGkrKykgeworCQlpZiAoIUlTX0VSUl9PUl9OVUxMKHBkW2ldLmxpbmspKQorCQkJZGV2aWNlX2xpbmtfZGVsKHBkW2ldLmxpbmspOworCisJCWlmICghSVNfRVJSX09SX05VTEwocGRbaV0uZGV2KSkKKwkJCWRldl9wbV9kb21haW5fZGV0YWNoKHBkW2ldLmRldiwgdHJ1ZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBwbV92ZGVjX2Nsb2NrX29uKGludCBpZCkKK3sKKwlpZiAoaWQgPT0gVkRFQ18xKSB7CisJCWFtcG9ydHNfc3dpdGNoX2dhdGUoImNsa192ZGVjX211eCIsIDEpOworCQl2ZGVjX2Nsb2NrX2hpX2VuYWJsZSgpOworCX0gZWxzZSBpZiAoaWQgPT0gVkRFQ19IQ09ERUMpIHsKKwkJaGNvZGVjX2Nsb2NrX2VuYWJsZSgpOworCX0gZWxzZSBpZiAoaWQgPT0gVkRFQ19IRVZDKSB7CisJCS8qIGVuYWJsZSBoZXZjIGNsb2NrICovCisJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NDMiAmJgorCQkJKGdldF9jcHVfbWFqb3JfaWQoKSAhPSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDUpICYmCisJCQkoZ2V0X2NwdV9tYWpvcl9pZCgpICE9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNUQpKQorCQkJYW1wb3J0c19zd2l0Y2hfZ2F0ZSgiY2xrX2hldmNmX211eCIsIDEpOworCQllbHNlCisJCQlhbXBvcnRzX3N3aXRjaF9nYXRlKCJjbGtfaGV2Y19tdXgiLCAxKTsKKwkJaWYgKChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpICYmCisJCQkhaXNfaGV2Y19mcm9udF9iYWNrX2Nsa19jb21iaW5lZCgpKQorCQkJYW1wb3J0c19zd2l0Y2hfZ2F0ZSgiY2xrX2hldmNiX211eCIsIDEpOworCisJCWhldmNfY2xvY2tfaGlfZW5hYmxlKCk7CisKKwkJaWYgKCFpc19oZXZjX2Zyb250X2JhY2tfY2xrX2NvbWJpbmVkKCkpCisJCQloZXZjX2JhY2tfY2xvY2tfaGlfZW5hYmxlKCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBwbV92ZGVjX2Nsb2NrX29mZihpbnQgaWQpCit7CisJaWYgKGlkID09IFZERUNfMSkgeworCQl2ZGVjX2Nsb2NrX29mZigpOworCX0gZWxzZSBpZiAoaWQgPT0gVkRFQ19IQ09ERUMpIHsKKwkJaGNvZGVjX2Nsb2NrX29mZigpOworCX0gZWxzZSBpZiAoaWQgPT0gVkRFQ19IRVZDKSB7CisJCS8qIGRpc2FibGUgaGV2YyBjbG9jayAqLworCQloZXZjX2Nsb2NrX29mZigpOworCQlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQSkgJiYKKwkJCSFpc19oZXZjX2Zyb250X2JhY2tfY2xrX2NvbWJpbmVkKCkpCisJCQloZXZjX2JhY2tfY2xvY2tfb2ZmKCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBwbV92ZGVjX3Bvd2VyX2RvbWFpbl9wb3dlcl9vbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpZCkKK3sKKwljb25zdCBzdHJ1Y3QgcG93ZXJfbWFuYWdlcl9zICpwbSA9IG9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YShkZXYpOworCisJcG1fdmRlY19jbG9ja19vbihpZCk7CisJcG1fdmRlY19wb3dlcl9zd2l0Y2gocG0tPnBkX2RhdGEsIGlkLCB0cnVlKTsKK30KKworc3RhdGljIHZvaWQgcG1fdmRlY19wb3dlcl9kb21haW5fcG93ZXJfb2ZmKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGlkKQoreworCWNvbnN0IHN0cnVjdCBwb3dlcl9tYW5hZ2VyX3MgKnBtID0gb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKGRldik7CisKKwlwbV92ZGVjX2Nsb2NrX29mZihpZCk7CisJcG1fdmRlY19wb3dlcl9zd2l0Y2gocG0tPnBkX2RhdGEsIGlkLCBmYWxzZSk7Cit9CisKK3N0YXRpYyBib29sIHBtX3ZkZWNfcG93ZXJfZG9tYWluX3Bvd2VyX3N0YXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGlkKQoreworCWNvbnN0IHN0cnVjdCBwb3dlcl9tYW5hZ2VyX3MgKnBtID0gb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKGRldik7CisKKwlyZXR1cm4gcG1fcnVudGltZV9hY3RpdmUocG0tPnBkX2RhdGFbaWRdLmRldik7Cit9CisKK3N0YXRpYyBib29sIHRlc3RfaGV2Yyh1MzIgZGVjb21wX2FkZHIsIHUzMiB1c19kZWxheSkKK3sKKwlpbnQgaTsKKworCS8qIFNXX1JFU0VUIElQUCAqLworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX1RPUF9DTlRMLCAxKTsKKwlXUklURV9WUkVHKEhFVkNEX0lQUF9UT1BfQ05UTCwgMCk7CisKKwkvKiBpbml0aWFsaXplIGFsbCBjYW52YXMgdGFibGUgKi8KKwlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9DT05GX0FERFIsIDApOworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9DTURfQUREUiwKKwkJCTB4MSB8IChpIDw8IDgpIHwgZGVjb21wX2FkZHIpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0NPTkZfQUREUiwgMSk7CisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwgKDAgPDwgOCkgfCAoMDw8MSkgfCAxKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIsIDApOworCisJLyogSW5pdGlhbGl6ZSBtY3JjYyAqLworCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMSwgMHgyKTsKKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDIsIDB4MCk7CisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwzLCAweDApOworCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMSwgMHhmZjApOworCisJLyogRGVjb21wIGluaXRpYWxpemUgKi8KKwlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMSwgMHgwKTsKKwlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMiwgMHgwKTsKKworCS8qIEZyYW1lIGxldmVsIGluaXRpYWxpemF0aW9uICovCisJV1JJVEVfVlJFRyhIRVZDRF9JUFBfVE9QX0ZSTUNPTkZJRywgMHgxMDAgfCAoMHgxMDAgPDwgMTYpKTsKKwlXUklURV9WUkVHKEhFVkNEX0lQUF9UT1BfVElMRUNPTkZJRzMsIDB4MCk7CisJV1JJVEVfVlJFRyhIRVZDRF9JUFBfVE9QX0xDVUNPTkZJRywgMHgxIDw8IDUpOworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX0JJVERFUFRIX0NPTkZJRywgMHgyIHwgKDB4MiA8PCAyKSk7CisKKwlXUklURV9WUkVHKEhFVkNEX0lQUF9DT05GSUcsIDB4MCk7CisJV1JJVEVfVlJFRyhIRVZDRF9JUFBfTElORUJVRkZfQkFTRSwgMHgwKTsKKworCS8qIEVuYWJsZSBTV0lNUCBtb2RlICovCisJV1JJVEVfVlJFRyhIRVZDRF9JUFBfU1dNUFJFRElGX0NPTkZJRywgMHgxKTsKKworCS8qIEVuYWJsZSBmcmFtZSAqLworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX1RPUF9DTlRMLCAweDIpOworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX1RPUF9GUk1DVEwsIDB4MSk7CisKKwkvKiBTZW5kIFNXLWNvbW1hbmQgQ1RCIGluZm8gKi8KKwlXUklURV9WUkVHKEhFVkNEX0lQUF9TV01QUkVESUZfQ1RCSU5GTywgMHgxIDw8IDMxKTsKKworCS8qIFNlbmQgUFVfY29tbWFuZCAqLworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX1NXTVBSRURJRl9QVUlORk8wLCAoMHg0IDw8IDkpIHwgKDB4NCA8PCAxNikpOworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX1NXTVBSRURJRl9QVUlORk8xLCAweDEgPDwgMyk7CisJV1JJVEVfVlJFRyhIRVZDRF9JUFBfU1dNUFJFRElGX1BVSU5GTzIsIDB4MCk7CisJV1JJVEVfVlJFRyhIRVZDRF9JUFBfU1dNUFJFRElGX1BVSU5GTzMsIDB4MCk7CisKKwl1ZGVsYXkodXNfZGVsYXkpOworCisJV1JJVEVfVlJFRyhIRVZDRF9JUFBfREJHX1NFTCwgMHgyIDw8IDQpOworCisJcmV0dXJuIChSRUFEX1ZSRUcoSEVWQ0RfSVBQX0RCR19EQVRBKSAmIDMpID09IDE7Cit9CisKK3N0YXRpYyBib29sIGhldmNfd29ya2Fyb3VuZF9uZWVkZWQodm9pZCkKK3sKKwlyZXR1cm4gKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hCQikgJiYKKwkJKGdldF9tZXNvbl9jcHVfdmVyc2lvbihNRVNPTl9DUFVfVkVSU0lPTl9MVkxfTUlOT1IpCisJCQk9PSBHWEJCX1JFVl9BX01JTk9SKTsKK30KKworc3RhdGljIHZvaWQgcG1fdmRlY19sZWdhY3lfcG93ZXJfb2ZmKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGlkKTsKKworc3RhdGljIHZvaWQgcG1fdmRlY19sZWdhY3lfcG93ZXJfb24oc3RydWN0IGRldmljZSAqZGV2LCBpbnQgaWQpCit7CisJdm9pZCAqZGVjb21wX2FkZHIgPSBOVUxMOworCXVsb25nIGRlY29tcF9kbWFfYWRkcjsKKwl1bG9uZyBtZW1faGFuZGxlOworCXUzMiBkZWNvbXBfYWRkcl9hbGlnbmVkID0gMDsKKwlpbnQgaGV2Y19sb29wID0gMDsKKwlpbnQgc2xlZXBfdmFsLCBpc29fdmFsOworCWJvb2wgaXNfcG93ZXJfY3RybF92ZXIyID0gZmFsc2U7CisKKwlpc19wb3dlcl9jdHJsX3ZlcjIgPQorCQkoKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKSAmJgorCQkoZ2V0X2NwdV9tYWpvcl9pZCgpICE9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UTDEpKSA/IHRydWUgOiBmYWxzZTsKKworCWlmIChoZXZjX3dvcmthcm91bmRfbmVlZGVkKCkgJiYKKwkJKGlkID09IFZERUNfSEVWQykpIHsKKwkJZGVjb21wX2FkZHIgPSBjb2RlY19tbV9kbWFfYWxsb2NfY29oZXJlbnQoJm1lbV9oYW5kbGUsCisJCQkmZGVjb21wX2RtYV9hZGRyLCBTWl82NEsgKyBTWl80SywgInZkZWNfcHJlYWxsb2MiKTsKKwkJaWYgKGRlY29tcF9hZGRyKSB7CisJCQlkZWNvbXBfYWRkcl9hbGlnbmVkID0gQUxJR04oZGVjb21wX2RtYV9hZGRyLCBTWl82NEspOworCQkJbWVtc2V0KCh1OCAqKWRlY29tcF9hZGRyICsKKwkJCQkoZGVjb21wX2FkZHJfYWxpZ25lZCAtIGRlY29tcF9kbWFfYWRkciksCisJCQkJMHhmZiwgU1pfNEspOworCQl9IGVsc2UKKwkJCXByX2VycigidmRlYzogYWxsb2MgSEVWQyBneGJiIGRlY29tcCBidWZmZXIgZmFpbGVkLlxuIik7CisJfQorCisJaWYgKGlkID09IFZERUNfMSkgeworCQlzbGVlcF92YWwgPSBpc19wb3dlcl9jdHJsX3ZlcjIgPyAweDIgOiAweGM7CisJCWlzb192YWwgPSBpc19wb3dlcl9jdHJsX3ZlcjIgPyAweDIgOiAweGMwOworCisJCS8qIHZkZWMxIHBvd2VyIG9uICovCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfUE9XRVIKKwkJaWYgKGlzX3N1cHBvcnRfcG93ZXJfY3RybCgpKSB7CisJCQlpZiAocG93ZXJfY3RybF9zbGVlcF9tYXNrKHRydWUsIHNsZWVwX3ZhbCwgMCkpIHsKKwkJCQlwcl9lcnIoInZkZWMtMSBwb3dlciBvbiBjdHJsIHNsZWVwIGZhaWwuXG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0gZWxzZSB7CisJCQlXUklURV9BT1JFRyhBT19SVElfR0VOX1BXUl9TTEVFUDAsCisJCQkJUkVBRF9BT1JFRyhBT19SVElfR0VOX1BXUl9TTEVFUDApICYgfnNsZWVwX3ZhbCk7CisJCX0KKyNlbHNlCisJCVdSSVRFX0FPUkVHKEFPX1JUSV9HRU5fUFdSX1NMRUVQMCwKKwkJCVJFQURfQU9SRUcoQU9fUlRJX0dFTl9QV1JfU0xFRVAwKSAmIH5zbGVlcF92YWwpOworI2VuZGlmCisJCS8qIHdhaXQgMTB1UyAqLworCQl1ZGVsYXkoMTApOworCQkvKiB2ZGVjMSBzb2Z0IHJlc2V0ICovCisJCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgMHhmZmZmZmZmYyk7CisJCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgMCk7CisJCS8qIGVuYWJsZSB2ZGVjMSBjbG9jayAqLworCQkvKgorCQkgKmFkZCBwb3dlciBvbiB2ZGVjIGNsb2NrIGxldmVsIHNldHRpbmcsb25seSBmb3IgbTggY2hpcCwKKwkJICogbThiYWJ5IGFuZCBtOG0yIGNhbiBkeW5hbWljIGFkanVzdCB2ZGVjIGNsb2NrLAorCQkgKiBwb3dlciBvbiB3aXRoIGRlZmF1bHQgY2xvY2sgbGV2ZWwKKwkJICovCisJCWFtcG9ydHNfc3dpdGNoX2dhdGUoImNsa192ZGVjX211eCIsIDEpOworCQl2ZGVjX2Nsb2NrX2hpX2VuYWJsZSgpOworCQkvKiBwb3dlciB1cCB2ZGVjIG1lbW9yaWVzICovCisJCVdSSVRFX1ZSRUcoRE9TX01FTV9QRF9WREVDLCAwKTsKKworCQkvKiByZW1vdmUgdmRlYzEgaXNvbGF0aW9uICovCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfUE9XRVIKKwkJaWYgKGlzX3N1cHBvcnRfcG93ZXJfY3RybCgpKSB7CisJCQlpZiAocG93ZXJfY3RybF9pc29fbWFzayh0cnVlLCBpc29fdmFsLCAwKSkgeworCQkJCXByX2VycigidmRlYy0xIHBvd2VyIG9uIGN0cmwgaXNvIGZhaWwuXG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0gZWxzZSB7CisJCQlXUklURV9BT1JFRyhBT19SVElfR0VOX1BXUl9JU08wLAorCQkJCVJFQURfQU9SRUcoQU9fUlRJX0dFTl9QV1JfSVNPMCkgJiB+aXNvX3ZhbCk7CisJCX0KKyNlbHNlCisJCVdSSVRFX0FPUkVHKEFPX1JUSV9HRU5fUFdSX0lTTzAsCisJCQlSRUFEX0FPUkVHKEFPX1JUSV9HRU5fUFdSX0lTTzApICYgfmlzb192YWwpOworI2VuZGlmCisJCS8qIHJlc2V0IERPUyB0b3AgcmVnaXN0ZXJzICovCisJCVdSSVRFX1ZSRUcoRE9TX1ZERUNfTUNSQ0NfU1RBTExfQ1RSTCwgMCk7CisJfSBlbHNlIGlmIChpZCA9PSBWREVDXzIpIHsKKwkJaWYgKGhhc192ZGVjMigpKSB7CisJCQkvKiB2ZGVjMiBwb3dlciBvbiAqLworCQkJV1JJVEVfQU9SRUcoQU9fUlRJX0dFTl9QV1JfU0xFRVAwLAorCQkJCQlSRUFEX0FPUkVHKEFPX1JUSV9HRU5fUFdSX1NMRUVQMCkgJgorCQkJCQl+MHgzMCk7CisJCQkvKiB3YWl0IDEwdVMgKi8KKwkJCXVkZWxheSgxMCk7CisJCQkvKiB2ZGVjMiBzb2Z0IHJlc2V0ICovCisJCQlXUklURV9WUkVHKERPU19TV19SRVNFVDIsIDB4ZmZmZmZmZmYpOworCQkJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQyLCAwKTsKKwkJCS8qIGVuYWJsZSB2ZGVjMSBjbG9jayAqLworCQkJdmRlYzJfY2xvY2tfaGlfZW5hYmxlKCk7CisJCQkvKiBwb3dlciB1cCB2ZGVjIG1lbW9yaWVzICovCisJCQlXUklURV9WUkVHKERPU19NRU1fUERfVkRFQzIsIDApOworCQkJLyogcmVtb3ZlIHZkZWMyIGlzb2xhdGlvbiAqLworCQkJV1JJVEVfQU9SRUcoQU9fUlRJX0dFTl9QV1JfSVNPMCwKKwkJCQkJUkVBRF9BT1JFRyhBT19SVElfR0VOX1BXUl9JU08wKSAmCisJCQkJCX4weDMwMCk7CisJCQkvKiByZXNldCBET1MgdG9wIHJlZ2lzdGVycyAqLworCQkJV1JJVEVfVlJFRyhET1NfVkRFQzJfTUNSQ0NfU1RBTExfQ1RSTCwgMCk7CisJCX0KKwl9IGVsc2UgaWYgKGlkID09IFZERUNfSENPREVDKSB7CisJCWlmIChoYXNfaGRlYygpKSB7CisJCQlzbGVlcF92YWwgPSBpc19wb3dlcl9jdHJsX3ZlcjIgPyAweDEgOiAweDM7CisJCQlpc29fdmFsID0gaXNfcG93ZXJfY3RybF92ZXIyID8gMHgxIDogMHgzMDsKKworCQkJLyogaGNvZGVjIHBvd2VyIG9uICovCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfUE9XRVIKKwkJCWlmIChpc19zdXBwb3J0X3Bvd2VyX2N0cmwoKSkgeworCQkJCWlmIChwb3dlcl9jdHJsX3NsZWVwX21hc2sodHJ1ZSwgc2xlZXBfdmFsLCAwKSkgeworCQkJCQlwcl9lcnIoImhjb2RlYyBwb3dlciBvbiBjdHJsIHNsZWVwIGZhaWwuXG4iKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJV1JJVEVfQU9SRUcoQU9fUlRJX0dFTl9QV1JfU0xFRVAwLAorCQkJCQlSRUFEX0FPUkVHKEFPX1JUSV9HRU5fUFdSX1NMRUVQMCkgJiB+c2xlZXBfdmFsKTsKKwkJCX0KKyNlbHNlCisJCQlXUklURV9BT1JFRyhBT19SVElfR0VOX1BXUl9TTEVFUDAsCisJCQkJUkVBRF9BT1JFRyhBT19SVElfR0VOX1BXUl9TTEVFUDApICYgfnNsZWVwX3ZhbCk7CisjZW5kaWYKKwkJCS8qIHdhaXQgMTB1UyAqLworCQkJdWRlbGF5KDEwKTsKKwkJCS8qIGhjb2RlYyBzb2Z0IHJlc2V0ICovCisJCQlXUklURV9WUkVHKERPU19TV19SRVNFVDEsIDB4ZmZmZmZmZmYpOworCQkJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQxLCAwKTsKKwkJCS8qIGVuYWJsZSBoY29kZWMgY2xvY2sgKi8KKwkJCWhjb2RlY19jbG9ja19lbmFibGUoKTsKKwkJCS8qIHBvd2VyIHVwIGhjb2RlYyBtZW1vcmllcyAqLworCQkJV1JJVEVfVlJFRyhET1NfTUVNX1BEX0hDT0RFQywgMCk7CisJCQkvKiByZW1vdmUgaGNvZGVjIGlzb2xhdGlvbiAqLworI2lmZGVmIENPTkZJR19BTUxPR0lDX1BPV0VSCisJCQlpZiAoaXNfc3VwcG9ydF9wb3dlcl9jdHJsKCkpIHsKKwkJCQlpZiAocG93ZXJfY3RybF9pc29fbWFzayh0cnVlLCBpc29fdmFsLCAwKSkgeworCQkJCQlwcl9lcnIoImhjb2RlYyBwb3dlciBvbiBjdHJsIGlzbyBmYWlsLlxuIik7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCVdSSVRFX0FPUkVHKEFPX1JUSV9HRU5fUFdSX0lTTzAsCisJCQkJCVJFQURfQU9SRUcoQU9fUlRJX0dFTl9QV1JfSVNPMCkgJiB+aXNvX3ZhbCk7CisJCQl9CisjZWxzZQorCQkJV1JJVEVfQU9SRUcoQU9fUlRJX0dFTl9QV1JfSVNPMCwKKwkJCQlSRUFEX0FPUkVHKEFPX1JUSV9HRU5fUFdSX0lTTzApICYgfmlzb192YWwpOworI2VuZGlmCisJCX0KKwl9IGVsc2UgaWYgKGlkID09IFZERUNfSEVWQykgeworCQlpZiAoaGFzX2hldmNfdmRlYygpKSB7CisJCQlib29sIGhldmNfZml4ZWQgPSBmYWxzZTsKKworCQkJc2xlZXBfdmFsID0gaXNfcG93ZXJfY3RybF92ZXIyID8gMHg0IDogMHhjMDsKKwkJCWlzb192YWwgPSBpc19wb3dlcl9jdHJsX3ZlcjIgPyAweDQgOiAweGMwMDsKKworCQkJd2hpbGUgKCFoZXZjX2ZpeGVkKSB7CisJCQkJLyogaGV2YyBwb3dlciBvbiAqLworI2lmZGVmIENPTkZJR19BTUxPR0lDX1BPV0VSCisJCQkJaWYgKGlzX3N1cHBvcnRfcG93ZXJfY3RybCgpKSB7CisJCQkJCWlmIChwb3dlcl9jdHJsX3NsZWVwX21hc2sodHJ1ZSwgc2xlZXBfdmFsLCAwKSkgeworCQkJCQkJcHJfZXJyKCJoZXZjIHBvd2VyIG9uIGN0cmwgc2xlZXAgZmFpbC5cbiIpOworCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJV1JJVEVfQU9SRUcoQU9fUlRJX0dFTl9QV1JfU0xFRVAwLAorCQkJCQkJUkVBRF9BT1JFRyhBT19SVElfR0VOX1BXUl9TTEVFUDApICYgfnNsZWVwX3ZhbCk7CisJCQkJfQorI2Vsc2UKKwkJCQlXUklURV9BT1JFRyhBT19SVElfR0VOX1BXUl9TTEVFUDAsCisJCQkJCVJFQURfQU9SRUcoQU9fUlRJX0dFTl9QV1JfU0xFRVAwKSAmIH5zbGVlcF92YWwpOworI2VuZGlmCisJCQkJLyogd2FpdCAxMHVTICovCisJCQkJdWRlbGF5KDEwKTsKKwkJCQkvKiBoZXZjIHNvZnQgcmVzZXQgKi8KKwkJCQlXUklURV9WUkVHKERPU19TV19SRVNFVDMsIDB4ZmZmZmZmZmYpOworCQkJCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMywgMCk7CisJCQkJLyogZW5hYmxlIGhldmMgY2xvY2sgKi8KKwkJCQlhbXBvcnRzX3N3aXRjaF9nYXRlKCJjbGtfaGV2Y19tdXgiLCAxKTsKKwkJCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKQorCQkJCQlhbXBvcnRzX3N3aXRjaF9nYXRlKCJjbGtfaGV2Y2JfbXV4IiwgMSk7CisJCQkJaGV2Y19jbG9ja19oaV9lbmFibGUoKTsKKwkJCQloZXZjX2JhY2tfY2xvY2tfaGlfZW5hYmxlKCk7CisJCQkJLyogcG93ZXIgdXAgaGV2YyBtZW1vcmllcyAqLworCQkJCVdSSVRFX1ZSRUcoRE9TX01FTV9QRF9IRVZDLCAwKTsKKwkJCQkvKiByZW1vdmUgaGV2YyBpc29sYXRpb24gKi8KKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19QT1dFUgorCQkJCWlmIChpc19zdXBwb3J0X3Bvd2VyX2N0cmwoKSkgeworCQkJCQlpZiAocG93ZXJfY3RybF9pc29fbWFzayh0cnVlLCBpc29fdmFsLCAwKSkgeworCQkJCQkJcHJfZXJyKCJoZXZjIHBvd2VyIG9uIGN0cmwgaXNvIGZhaWwuXG4iKTsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCVdSSVRFX0FPUkVHKEFPX1JUSV9HRU5fUFdSX0lTTzAsCisJCQkJCQlSRUFEX0FPUkVHKEFPX1JUSV9HRU5fUFdSX0lTTzApICYgfmlzb192YWwpOworCQkJCX0KKyNlbHNlCisJCQkJV1JJVEVfQU9SRUcoQU9fUlRJX0dFTl9QV1JfSVNPMCwKKwkJCQkJUkVBRF9BT1JFRyhBT19SVElfR0VOX1BXUl9JU08wKSAmIH5pc29fdmFsKTsKKyNlbmRpZgorCQkJCWlmICghaGV2Y193b3JrYXJvdW5kX25lZWRlZCgpKQorCQkJCQlicmVhazsKKworCQkJCWlmIChkZWNvbXBfYWRkcikKKwkJCQkJaGV2Y19maXhlZCA9IHRlc3RfaGV2YygKKwkJCQkJCWRlY29tcF9hZGRyX2FsaWduZWQsIDIwKTsKKworCQkJCWlmICghaGV2Y19maXhlZCkgeworCQkJCQloZXZjX2xvb3ArKzsKKwkJCQkJaWYgKGhldmNfbG9vcCA+PSBIRVZDX1RFU1RfTElNSVQpIHsKKwkJCQkJCXByX3dhcm4oImhldmMgcG93ZXIgc2VxdWVuY2Ugb3ZlciBsaW1pdFxuIik7CisJCQkJCQlwcl93YXJuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisJCQkJCQlwcl93YXJuKCIgVGhpcyBjaGlwIGlzIGlkZW50aWZpZWQgdG8gaGF2ZSBIVyBmYWlsdXJlLlxuIik7CisJCQkJCQlwcl93YXJuKCIgUGxlYXNlIGNvbnRhY3Qgc3FhLXBsYXRmb3JtIHRvIHJlcGxhY2UgdGhlIHBsYXRmb3JtLlxuIik7CisJCQkJCQlwcl93YXJuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisKKwkJCQkJCXBhbmljKCJGb3JjZSBwYW5pYyBmb3IgY2hpcCBkZXRlY3Rpb24gISEhXG4iKTsKKworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlwbV92ZGVjX2xlZ2FjeV9wb3dlcl9vZmYoTlVMTCwgVkRFQ19IRVZDKTsKKworCQkJCQltZGVsYXkoMTApOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGhldmNfbG9vcCA+IGhldmNfbWF4X3Jlc2V0X2NvdW50KQorCQkJCWhldmNfbWF4X3Jlc2V0X2NvdW50ID0gaGV2Y19sb29wOworCisJCQlXUklURV9WUkVHKERPU19TV19SRVNFVDMsIDB4ZmZmZmZmZmYpOworCQkJdWRlbGF5KDEwKTsKKwkJCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMywgMCk7CisJCX0KKwl9CisKKwlpZiAoZGVjb21wX2FkZHIpCisJCWNvZGVjX21tX2RtYV9mcmVlX2NvaGVyZW50KG1lbV9oYW5kbGUpOworfQorCitzdGF0aWMgdm9pZCBwbV92ZGVjX2xlZ2FjeV9wb3dlcl9vZmYoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgaWQpCit7CisJaW50IHNsZWVwX3ZhbCwgaXNvX3ZhbDsKKwlib29sIGlzX3Bvd2VyX2N0cmxfdmVyMiA9IGZhbHNlOworCisJaXNfcG93ZXJfY3RybF92ZXIyID0KKwkJKChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkgJiYKKwkJKGdldF9jcHVfbWFqb3JfaWQoKSAhPSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVEwxKSkgPyB0cnVlIDogZmFsc2U7CisKKwlpZiAoaWQgPT0gVkRFQ18xKSB7CisJCXNsZWVwX3ZhbCA9IGlzX3Bvd2VyX2N0cmxfdmVyMiA/IDB4MiA6IDB4YzsKKwkJaXNvX3ZhbCA9IGlzX3Bvd2VyX2N0cmxfdmVyMiA/IDB4MiA6IDB4YzA7CisKKwkJLyogZW5hYmxlIHZkZWMxIGlzb2xhdGlvbiAqLworI2lmZGVmIENPTkZJR19BTUxPR0lDX1BPV0VSCisJCWlmIChpc19zdXBwb3J0X3Bvd2VyX2N0cmwoKSkgeworCQkJaWYgKHBvd2VyX2N0cmxfaXNvX21hc2soZmFsc2UsIGlzb192YWwsIDApKSB7CisJCQkJcHJfZXJyKCJ2ZGVjLTEgcG93ZXIgb2ZmIGN0cmwgaXNvIGZhaWwuXG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0gZWxzZSB7CisJCQlXUklURV9BT1JFRyhBT19SVElfR0VOX1BXUl9JU08wLAorCQkJCVJFQURfQU9SRUcoQU9fUlRJX0dFTl9QV1JfSVNPMCkgfCBpc29fdmFsKTsKKwkJfQorI2Vsc2UKKwkJV1JJVEVfQU9SRUcoQU9fUlRJX0dFTl9QV1JfSVNPMCwKKwkJCVJFQURfQU9SRUcoQU9fUlRJX0dFTl9QV1JfSVNPMCkgfCBpc29fdmFsKTsKKyNlbmRpZgorCQkvKiBwb3dlciBvZmYgdmRlYzEgbWVtb3JpZXMgKi8KKwkJV1JJVEVfVlJFRyhET1NfTUVNX1BEX1ZERUMsIDB4ZmZmZmZmZmZVTCk7CisJCS8qIGRpc2FibGUgdmRlYzEgY2xvY2sgKi8KKwkJdmRlY19jbG9ja19vZmYoKTsKKwkJLyogdmRlYzEgcG93ZXIgb2ZmICovCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfUE9XRVIKKwkJaWYgKGlzX3N1cHBvcnRfcG93ZXJfY3RybCgpKSB7CisJCQlpZiAocG93ZXJfY3RybF9zbGVlcF9tYXNrKGZhbHNlLCBzbGVlcF92YWwsIDApKSB7CisJCQkJcHJfZXJyKCJ2ZGVjLTEgcG93ZXIgb2ZmIGN0cmwgc2xlZXAgZmFpbC5cbiIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVdSSVRFX0FPUkVHKEFPX1JUSV9HRU5fUFdSX1NMRUVQMCwKKwkJCQlSRUFEX0FPUkVHKEFPX1JUSV9HRU5fUFdSX1NMRUVQMCkgfCBzbGVlcF92YWwpOworCQl9CisjZWxzZQorCQlXUklURV9BT1JFRyhBT19SVElfR0VOX1BXUl9TTEVFUDAsCisJCQlSRUFEX0FPUkVHKEFPX1JUSV9HRU5fUFdSX1NMRUVQMCkgfCBzbGVlcF92YWwpOworI2VuZGlmCisJfSBlbHNlIGlmIChpZCA9PSBWREVDXzIpIHsKKwkJaWYgKGhhc192ZGVjMigpKSB7CisJCQkvKiBlbmFibGUgdmRlYzIgaXNvbGF0aW9uICovCisJCQlXUklURV9BT1JFRyhBT19SVElfR0VOX1BXUl9JU08wLAorCQkJCQlSRUFEX0FPUkVHKEFPX1JUSV9HRU5fUFdSX0lTTzApIHwKKwkJCQkJMHgzMDApOworCQkJLyogcG93ZXIgb2ZmIHZkZWMyIG1lbW9yaWVzICovCisJCQlXUklURV9WUkVHKERPU19NRU1fUERfVkRFQzIsIDB4ZmZmZmZmZmZVTCk7CisJCQkvKiBkaXNhYmxlIHZkZWMyIGNsb2NrICovCisJCQl2ZGVjMl9jbG9ja19vZmYoKTsKKwkJCS8qIHZkZWMyIHBvd2VyIG9mZiAqLworCQkJV1JJVEVfQU9SRUcoQU9fUlRJX0dFTl9QV1JfU0xFRVAwLAorCQkJCQlSRUFEX0FPUkVHKEFPX1JUSV9HRU5fUFdSX1NMRUVQMCkgfAorCQkJCQkweDMwKTsKKwkJfQorCX0gZWxzZSBpZiAoaWQgPT0gVkRFQ19IQ09ERUMpIHsKKwkJaWYgKGhhc19oZGVjKCkpIHsKKwkJCXNsZWVwX3ZhbCA9IGlzX3Bvd2VyX2N0cmxfdmVyMiA/IDB4MSA6IDB4MzsKKwkJCWlzb192YWwgPSBpc19wb3dlcl9jdHJsX3ZlcjIgPyAweDEgOiAweDMwOworCisJCQkvKiBlbmFibGUgaGNvZGVjIGlzb2xhdGlvbiAqLworI2lmZGVmIENPTkZJR19BTUxPR0lDX1BPV0VSCisJCQlpZiAoaXNfc3VwcG9ydF9wb3dlcl9jdHJsKCkpIHsKKwkJCQlpZiAocG93ZXJfY3RybF9pc29fbWFzayhmYWxzZSwgaXNvX3ZhbCwgMCkpIHsKKwkJCQkJcHJfZXJyKCJoY29kZWMgcG93ZXIgb2ZmIGN0cmwgaXNvIGZhaWwuXG4iKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJV1JJVEVfQU9SRUcoQU9fUlRJX0dFTl9QV1JfSVNPMCwKKwkJCQkJUkVBRF9BT1JFRyhBT19SVElfR0VOX1BXUl9JU08wKSB8IGlzb192YWwpOworCQkJfQorI2Vsc2UKKwkJCVdSSVRFX0FPUkVHKEFPX1JUSV9HRU5fUFdSX0lTTzAsCisJCQkJUkVBRF9BT1JFRyhBT19SVElfR0VOX1BXUl9JU08wKSB8IGlzb192YWwpOworI2VuZGlmCisJCQkvKiBwb3dlciBvZmYgaGNvZGVjIG1lbW9yaWVzICovCisJCQlXUklURV9WUkVHKERPU19NRU1fUERfSENPREVDLCAweGZmZmZmZmZmVUwpOworCQkJLyogZGlzYWJsZSBoY29kZWMgY2xvY2sgKi8KKwkJCWhjb2RlY19jbG9ja19vZmYoKTsKKwkJCS8qIGhjb2RlYyBwb3dlciBvZmYgKi8KKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19QT1dFUgorCQkJaWYgKGlzX3N1cHBvcnRfcG93ZXJfY3RybCgpKSB7CisJCQkJaWYgKHBvd2VyX2N0cmxfc2xlZXBfbWFzayhmYWxzZSwgc2xlZXBfdmFsLCAwKSkgeworCQkJCQlwcl9lcnIoImhjb2RlYyBwb3dlciBvZmYgY3RybCBzbGVlcCBmYWlsLlxuIik7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCVdSSVRFX0FPUkVHKEFPX1JUSV9HRU5fUFdSX1NMRUVQMCwKKwkJCQkJUkVBRF9BT1JFRyhBT19SVElfR0VOX1BXUl9TTEVFUDApIHwgc2xlZXBfdmFsKTsKKwkJCX0KKyNlbHNlCisJCQlXUklURV9BT1JFRyhBT19SVElfR0VOX1BXUl9TTEVFUDAsCisJCQkJUkVBRF9BT1JFRyhBT19SVElfR0VOX1BXUl9TTEVFUDApIHwgc2xlZXBfdmFsKTsKKyNlbmRpZgorCQl9CisJfSBlbHNlIGlmIChpZCA9PSBWREVDX0hFVkMpIHsKKwkJaWYgKGhhc19oZXZjX3ZkZWMoKSkgeworCQkJc2xlZXBfdmFsID0gaXNfcG93ZXJfY3RybF92ZXIyID8gMHg0IDogMHhjMDsKKwkJCWlzb192YWwgPSBpc19wb3dlcl9jdHJsX3ZlcjIgPyAweDQgOiAweGMwMDsKKworCQkJaWYgKG5vX3Bvd2VyZG93biA9PSAwKSB7CisJCQkJLyogZW5hYmxlIGhldmMgaXNvbGF0aW9uICovCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfUE9XRVIKKwkJCQlpZiAoaXNfc3VwcG9ydF9wb3dlcl9jdHJsKCkpIHsKKwkJCQkJaWYgKHBvd2VyX2N0cmxfaXNvX21hc2soZmFsc2UsIGlzb192YWwsIDApKSB7CisJCQkJCQlwcl9lcnIoImhldmMgcG93ZXIgb2ZmIGN0cmwgaXNvIGZhaWwuXG4iKTsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCVdSSVRFX0FPUkVHKEFPX1JUSV9HRU5fUFdSX0lTTzAsCisJCQkJCQlSRUFEX0FPUkVHKEFPX1JUSV9HRU5fUFdSX0lTTzApIHwgaXNvX3ZhbCk7CisJCQkJfQorI2Vsc2UKKwkJCQlXUklURV9BT1JFRyhBT19SVElfR0VOX1BXUl9JU08wLAorCQkJCQlSRUFEX0FPUkVHKEFPX1JUSV9HRU5fUFdSX0lTTzApIHwgaXNvX3ZhbCk7CisjZW5kaWYKKwkJCQkvKiBwb3dlciBvZmYgaGV2YyBtZW1vcmllcyAqLworCQkJCVdSSVRFX1ZSRUcoRE9TX01FTV9QRF9IRVZDLCAweGZmZmZmZmZmVUwpOworCisJCQkJLyogZGlzYWJsZSBoZXZjIGNsb2NrICovCisJCQkJaGV2Y19jbG9ja19vZmYoKTsKKwkJCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKQorCQkJCQloZXZjX2JhY2tfY2xvY2tfb2ZmKCk7CisKKwkJCQkvKiBoZXZjIHBvd2VyIG9mZiAqLworI2lmZGVmIENPTkZJR19BTUxPR0lDX1BPV0VSCisJCQkJaWYgKGlzX3N1cHBvcnRfcG93ZXJfY3RybCgpKSB7CisJCQkJCWlmIChwb3dlcl9jdHJsX3NsZWVwX21hc2soZmFsc2UsIHNsZWVwX3ZhbCwgMCkpIHsKKwkJCQkJCXByX2VycigiaGV2YyBwb3dlciBvZmYgY3RybCBzbGVlcCBmYWlsLlxuIik7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlXUklURV9BT1JFRyhBT19SVElfR0VOX1BXUl9TTEVFUDAsCisJCQkJCQlSRUFEX0FPUkVHKEFPX1JUSV9HRU5fUFdSX1NMRUVQMCkgfCBzbGVlcF92YWwpOworCQkJCX0KKyNlbHNlCisJCQkJV1JJVEVfQU9SRUcoQU9fUlRJX0dFTl9QV1JfU0xFRVAwLAorCQkJCQlSRUFEX0FPUkVHKEFPX1JUSV9HRU5fUFdSX1NMRUVQMCkgfCBzbGVlcF92YWwpOworI2VuZGlmCisJCQl9IGVsc2UgeworCQkJCXByX2luZm8oIiEhISEhISEhbm90IHBvd2VyIGRvd25cbiIpOworCQkJCWhldmNfcmVzZXRfY29yZShOVUxMKTsKKwkJCQlub19wb3dlcmRvd24gPSAwOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgYm9vbCBwbV92ZGVjX2xlZ2FjeV9wb3dlcl9zdGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpZCkKK3sKKwlib29sIHJldCA9IGZhbHNlOworCisJaWYgKGlkID09IFZERUNfMSkgeworCQlpZiAoKChSRUFEX0FPUkVHKEFPX1JUSV9HRU5fUFdSX1NMRUVQMCkgJgorCQkJKCgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpICYmCisJCQkoZ2V0X2NwdV9tYWpvcl9pZCgpICE9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UTDEpKQorCQkJPyAweDIgOiAweGMpKSA9PSAwKSAmJgorCQkJKFJFQURfSEhJX1JFRyhISElfVkRFQ19DTEtfQ05UTCkgJiAweDEwMCkpCisJCQlyZXQgPSB0cnVlOworCX0gZWxzZSBpZiAoaWQgPT0gVkRFQ18yKSB7CisJCWlmIChoYXNfdmRlYzIoKSkgeworCQkJaWYgKCgoUkVBRF9BT1JFRyhBT19SVElfR0VOX1BXUl9TTEVFUDApICYgMHgzMCkgPT0gMCkgJiYKKwkJCQkoUkVBRF9ISElfUkVHKEhISV9WREVDMl9DTEtfQ05UTCkgJiAweDEwMCkpCisJCQkJcmV0ID0gdHJ1ZTsKKwkJfQorCX0gZWxzZSBpZiAoaWQgPT0gVkRFQ19IQ09ERUMpIHsKKwkJaWYgKGhhc19oZGVjKCkpIHsKKwkJCWlmICgoKFJFQURfQU9SRUcoQU9fUlRJX0dFTl9QV1JfU0xFRVAwKSAmCisJCQkJKCgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpICYmCisJCQkJKGdldF9jcHVfbWFqb3JfaWQoKSAhPSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVEwxKSkKKwkJCQk/IDB4MSA6IDB4MykpID09IDApICYmCisJCQkJKFJFQURfSEhJX1JFRyhISElfVkRFQ19DTEtfQ05UTCkgJiAweDEwMDAwMDApKQorCQkJCXJldCA9IHRydWU7CisJCX0KKwl9IGVsc2UgaWYgKGlkID09IFZERUNfSEVWQykgeworCQlpZiAoaGFzX2hldmNfdmRlYygpKSB7CisJCQlpZiAoKChSRUFEX0FPUkVHKEFPX1JUSV9HRU5fUFdSX1NMRUVQMCkgJgorCQkJCSgoKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKSAmJgorCQkJCShnZXRfY3B1X21ham9yX2lkKCkgIT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RMMSkpCisJCQkJPyAweDQgOiAweGMwKSkgPT0gMCkgJiYKKwkJCQkoUkVBRF9ISElfUkVHKEhISV9WREVDMl9DTEtfQ05UTCkgJiAweDEwMDAwMDApKQorCQkJCXJldCA9IHRydWU7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBwbV92ZGVjX3BkX3NlY19hcGlfcG93ZXJfb24oc3RydWN0IGRldmljZSAqZGV2LCBpbnQgaWQpCit7CisJaW50IHBkX2lkID0gKGlkID09IFZERUNfMSkgPyBQRElEX0RPU19WREVDIDoKKwkJICAgIChpZCA9PSBWREVDX0hFVkMpID8gUERJRF9ET1NfSEVWQyA6CisJCSAgICBQRElEX0RPU19IQ09ERUM7CisKKwlwbV92ZGVjX2Nsb2NrX29uKGlkKTsKKwlwd3JfY3RybF9wc2NpX3NtYyhwZF9pZCwgUFdSX09OKTsKK30KKworc3RhdGljIHZvaWQgcG1fdmRlY19wZF9zZWNfYXBpX3Bvd2VyX29mZihzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpZCkKK3sKKwlpbnQgcGRfaWQgPSAoaWQgPT0gVkRFQ18xKSA/IFBESURfRE9TX1ZERUMgOgorCQkgICAgKGlkID09IFZERUNfSEVWQykgPyBQRElEX0RPU19IRVZDIDoKKwkJICAgIFBESURfRE9TX0hDT0RFQzsKKworCXBtX3ZkZWNfY2xvY2tfb2ZmKGlkKTsKKwlwd3JfY3RybF9wc2NpX3NtYyhwZF9pZCwgUFdSX09GRik7Cit9CisKK3N0YXRpYyBib29sIHBtX3ZkZWNfcGRfc2VjX2FwaV9wb3dlcl9zdGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpZCkKK3sKKwlpbnQgcGRfaWQgPSAoaWQgPT0gVkRFQ18xKSA/IFBESURfRE9TX1ZERUMgOgorCQkgICAgKGlkID09IFZERUNfSEVWQykgPyBQRElEX0RPU19IRVZDIDoKKwkJICAgIFBESURfRE9TX0hDT0RFQzsKKworCXJldHVybiAhcHdyX2N0cmxfc3RhdHVzX3BzY2lfc21jKHBkX2lkKTsKK30KKworc3RhdGljIHZvaWQgcG1fdmRlY19wZF9ub3NlY19hcGlfcG93ZXJfb24oc3RydWN0IGRldmljZSAqZGV2LCBpbnQgaWQpCit7CisjaWYgMAorCWludCBwZF9pZCA9IChpZCA9PSBWREVDXzEpID8gUE1fRE9TX1ZERUMgOgorCQkgICAgKGlkID09IFZERUNfSEVWQykgPyBQTV9ET1NfSEVWQyA6CisJCQlQTV9ET1NfSENPREVDOworCisJcG1fdmRlY19jbG9ja19vbihpZCk7CisJcG93ZXJfZG9tYWluX3N3aXRjaChwZF9pZCwgUFdSX09OKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBwbV92ZGVjX3BkX25vc2VjX2FwaV9wb3dlcl9vZmYoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgaWQpCit7CisjaWYgMAorCWludCBwZF9pZCA9IChpZCA9PSBWREVDXzEpID8gUE1fRE9TX1ZERUMgOgorCQkgICAgKGlkID09IFZERUNfSEVWQykgPyBQTV9ET1NfSEVWQyA6CisJCSAgICBQTV9ET1NfSENPREVDOworCisJcG1fdmRlY19jbG9ja19vZmYoaWQpOworCXBvd2VyX2RvbWFpbl9zd2l0Y2gocGRfaWQsIFBXUl9PRkYpOworI2VuZGlmCit9CisKK3N0YXRpYyBib29sIHBtX3ZkZWNfcGRfbm9zZWNfYXBpX3Bvd2VyX3N0YXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGlkKQoreworCXJldHVybiBwbV92ZGVjX2xlZ2FjeV9wb3dlcl9zdGF0ZShkZXYsIGlkKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9tYW5hZ2VyX3MgcG1fcndfcmVnX2RhdGEgPSB7CisJLnBtX3R5cGUJPSBQTV9QT1dFUl9DVFJMX1JXX1JFRywKKwkucG93ZXJfb24JPSBwbV92ZGVjX2xlZ2FjeV9wb3dlcl9vbiwKKwkucG93ZXJfb2ZmCT0gcG1fdmRlY19sZWdhY3lfcG93ZXJfb2ZmLAorCS5wb3dlcl9zdGF0ZQk9IHBtX3ZkZWNfbGVnYWN5X3Bvd2VyX3N0YXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9tYW5hZ2VyX3MgcG1fY3RybF9hcGlfZGF0YSA9IHsKKwkucG1fdHlwZQk9IFBNX1BPV0VSX0NUUkxfQVBJLAorCS5wb3dlcl9vbgk9IHBtX3ZkZWNfbGVnYWN5X3Bvd2VyX29uLAorCS5wb3dlcl9vZmYJPSBwbV92ZGVjX2xlZ2FjeV9wb3dlcl9vZmYsCisJLnBvd2VyX3N0YXRlCT0gcG1fdmRlY19sZWdhY3lfcG93ZXJfc3RhdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX21hbmFnZXJfcyBwbV9wZF9kYXRhID0geworCS5wbV90eXBlCT0gUE1fUE9XRVJfRE9NQUlOLAorCS5wZF9kYXRhCT0gcG1fZG9tYWluX2RhdGEsCisJLmluaXQJCT0gcG1fdmRlY19wb3dlcl9kb21haW5faW5pdCwKKwkucmVsZWFzZQk9IHBtX3ZkZWNfcG93ZXJfZG9tYWluX3JlbGVzZSwKKwkucG93ZXJfb24JPSBwbV92ZGVjX3Bvd2VyX2RvbWFpbl9wb3dlcl9vbiwKKwkucG93ZXJfb2ZmCT0gcG1fdmRlY19wb3dlcl9kb21haW5fcG93ZXJfb2ZmLAorCS5wb3dlcl9zdGF0ZQk9IHBtX3ZkZWNfcG93ZXJfZG9tYWluX3Bvd2VyX3N0YXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9tYW5hZ2VyX3MgcG1fcGRfc2VjX2FwaV9kYXRhID0geworCS5wbV90eXBlCT0gUE1fUE9XRVJfRE9NQUlOX1NFQ19BUEksCisJLnBvd2VyX29uCT0gcG1fdmRlY19wZF9zZWNfYXBpX3Bvd2VyX29uLAorCS5wb3dlcl9vZmYJPSBwbV92ZGVjX3BkX3NlY19hcGlfcG93ZXJfb2ZmLAorCS5wb3dlcl9zdGF0ZQk9IHBtX3ZkZWNfcGRfc2VjX2FwaV9wb3dlcl9zdGF0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfbWFuYWdlcl9zIHBtX3BkX25vc2VjX2FwaV9kYXRhID0geworCS5wbV90eXBlCT0gUE1fUE9XRVJfRE9NQUlOX05PTlNFQ19BUEksCisJLnBvd2VyX29uCT0gcG1fdmRlY19wZF9ub3NlY19hcGlfcG93ZXJfb24sCisJLnBvd2VyX29mZgk9IHBtX3ZkZWNfcGRfbm9zZWNfYXBpX3Bvd2VyX29mZiwKKwkucG93ZXJfc3RhdGUJPSBwbV92ZGVjX3BkX25vc2VjX2FwaV9wb3dlcl9zdGF0ZSwKK307CisKK2NvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYW1sb2dpY192ZGVjX21hdGNoZXNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImFtbG9naWMsIHZkZWMiLAkJLmRhdGEgPSAmcG1fcndfcmVnX2RhdGEgfSwKKwl7IC5jb21wYXRpYmxlID0gImFtbG9naWMsIHZkZWMtcG0tYXBpIiwJCS5kYXRhID0gJnBtX2N0cmxfYXBpX2RhdGEgfSwKKwl7IC5jb21wYXRpYmxlID0gImFtbG9naWMsIHZkZWMtcG0tcGQiLAkJLmRhdGEgPSAmcG1fcGRfZGF0YSB9LAorCXsgLmNvbXBhdGlibGUgPSAiYW1sb2dpYywgdmRlYy1wbS1wZC1zZWMtYXBpIiwJLmRhdGEgPSAmcG1fcGRfc2VjX2FwaV9kYXRhIH0sCisJeyAuY29tcGF0aWJsZSA9ICJhbWxvZ2ljLCB2ZGVjLXBtLXBkLW5zZWMtYXBpIiwJLmRhdGEgPSAmcG1fcGRfbm9zZWNfYXBpX2RhdGEgfSwKKwl7fSwKK307CitFWFBPUlRfU1lNQk9MKGFtbG9naWNfdmRlY19tYXRjaGVzKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWNfcG93ZXJfY3RybC5oIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWNfcG93ZXJfY3RybC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YWI3N2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdmRlY19wb3dlcl9jdHJsLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvbWVkaWEvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjX3Bvd2VyX2N0cmwuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZmR0Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9kb21haW4uaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSAidmRlYy5oIgorCisvKiBEaXJlY3RseSBjb250cm9sbGVkIGJ5IHJlYWRpbmcgYW5kIHdyaXRpbmcgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBQTV9QT1dFUl9DVFJMX1JXX1JFRwkJKDApCisKKy8qIFVzZSBwb3dlcl9jdHJsX3h4eCBmYW1pbHkgb2YgaW50ZXJmYWNlIGNvbnRyb2xzLiAqLworI2RlZmluZSBQTV9QT1dFUl9DVFJMX0FQSQkJKDEpCisKKy8qCisgKiBQb3dlciBEb21haW4gaW50ZXJmYWNlIGNvbnRyb2wsIGN1cnJlbnRseSBzdXBwb3J0ZWQKKyAqIGluIHZlcnNpb25zIDQuMTkgYW5kIGFib3ZlLgorICovCisjZGVmaW5lIFBNX1BPV0VSX0RPTUFJTgkJCSgyKQorCisvKgorICogQ29udHJvbGxlZCBieSB0aGUgc2VjdXJlIEFQSSBwcm92aWRlZCBieSBwb3dlciBkb21haW4sCisgKiB2ZXJzaW9uIDQuOSBzdXBwb3J0cyBjdXJyZW50bHkgc3VwcG9ydGVkIHBsYXRmb3JtcyAoU0MyKS4KKyAqLworI2RlZmluZSBQTV9QT1dFUl9ET01BSU5fU0VDX0FQSQkJKDMpCisKKy8qCisgKiBVc2Ugbm9uLXNlY3VyZSBBUEkgY29udHJvbCB0aHJvdWdoIHBvd2VyIGRvbWFpbiwgdmVyc2lvbiA0Ljkgc3VwcG9ydCwKKyAqIGN1cnJlbnRseSBzdXBwb3J0ZWQgcGxhdGZvcm1zIChTTTEsIFRNMiwgVE0yLXJldkIpLgorICovCisjZGVmaW5lIFBNX1BPV0VSX0RPTUFJTl9OT05TRUNfQVBJCSg0KQorCitlbnVtIHBtX3BkX2UgeworCVBEX1ZERUMsCisJUERfSENPREVDLAorCVBEX1ZERUMyLAorCVBEX0hFVkMsCisJUERfSEVWQ0IsCisJUERfV0FWRSwKKwlQRF9NQVgKK307CisKK3N0cnVjdCBwbV9wZF9zIHsKKwl1OCAqbmFtZTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IGRldmljZV9saW5rICpsaW5rOworfTsKKworc3RydWN0IHBvd2VyX21hbmFnZXJfcyB7CisJaW50IHBtX3R5cGU7CisJc3RydWN0IHBtX3BkX3MgKnBkX2RhdGE7CisJaW50ICgqaW5pdCkgKHN0cnVjdCBkZXZpY2UgKmRldik7CisJdm9pZCAoKnJlbGVhc2UpIChzdHJ1Y3QgZGV2aWNlICpkZXYpOworCXZvaWQgKCpwb3dlcl9vbikgKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGlkKTsKKwl2b2lkICgqcG93ZXJfb2ZmKSAoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgaWQpOworCWJvb2wgKCpwb3dlcl9zdGF0ZSkgKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGlkKTsKK307CisKK2NvbnN0IGNoYXIgKmdldF9wbV9uYW1lKGludCB0eXBlKTsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDQsIDE5LCAwKQorI2RlZmluZSBETF9GTEFHX1NUQVRFTEVTUwkJQklUKDApCisjZGVmaW5lIERMX0ZMQUdfQVVUT1JFTU9WRV9DT05TVU1FUglCSVQoMSkKKyNkZWZpbmUgRExfRkxBR19QTV9SVU5USU1FCQlCSVQoMikKKyNkZWZpbmUgRExfRkxBR19SUE1fQUNUSVZFCQlCSVQoMykKKyNkZWZpbmUgRExfRkxBR19BVVRPUkVNT1ZFX1NVUFBMSUVSCUJJVCg0KQorCitzdHJ1Y3QgZGV2aWNlX2xpbmsgeworCXUzMiBmbGFnczsKKwkvKiAuLi4gKi8KK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRldmljZSAqZGV2X3BtX2RvbWFpbl9hdHRhY2hfYnlfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCQkJICBjb25zdCBjaGFyICpuYW1lKQorCQkJCQkJCSAgeyByZXR1cm4gTlVMTDsgfQorc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlX2xpbmsgKmRldmljZV9saW5rX2FkZChzdHJ1Y3QgZGV2aWNlICpjb25zdW1lciwKKwkJCQkgICAgc3RydWN0IGRldmljZSAqc3VwcGxpZXIsIHUzMiBmbGFncykKKwkJCQkgICAgeyByZXR1cm4gTlVMTDsgfQorc3RhdGljIGlubGluZSB2b2lkIGRldmljZV9saW5rX2RlbChzdHJ1Y3QgZGV2aWNlX2xpbmsgKmxpbmspIHsgcmV0dXJuOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgZGV2aWNlX2xpbmtfcmVtb3ZlKHZvaWQgKmNvbnN1bWVyLCBzdHJ1Y3QgZGV2aWNlICpzdXBwbGllcikgeyByZXR1cm47IH0KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdmRlY19wcm9maWxlLmMgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdmRlY19wcm9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZmZmViMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjX3Byb2ZpbGUuYwpAQCAtMCwwICsxLDQ3NCBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9hbXBvcnRzL3ZkZWNfcHJvZmlsZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC9jbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmRlY19yZWcuaD4KKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvbWVzb25fYXRyYWNlLmg+CisjaW5jbHVkZSAidmRlY19wcm9maWxlLmgiCisjaW5jbHVkZSAidmRlYy5oIgorCisjZGVmaW5lIElTQV9USU1FUkUgMHgyNjYyCisjZGVmaW5lIElTQV9USU1FUkVfSEkgMHgyNjYzCisKKyNkZWZpbmUgUFJPRklMRV9SRUNfU0laRSA0MAorCitzdGF0aWMgREVGSU5FX01VVEVYKHZkZWNfcHJvZmlsZV9tdXRleCk7CitzdGF0aWMgaW50IHJlY193cDsKK3N0YXRpYyBib29sIHJlY193cmFwcGVkOworc3RhdGljIHVpbnQgZGVjX3RpbWVfc3RhdF9mbGFnOworc3RhdGljIHVpbnQgZGVjX3RpbWVfc3RhdF9yZXNldDsKKworCitzdHJ1Y3QgZGVudHJ5ICpyb290LCAqZXZlbnQ7CisKKyNkZWZpbmUgTUFYX0lOU1RBTkNFX01VTiAgOQorCitzdHJ1Y3QgdmRlY19wcm9maWxlX3RpbWVfc3RhdF9zIHsKKwlpbnQgdGltZV82bXNfbGVzc19jbnQ7CisJaW50IHRpbWVfNl85bXNfY250OworCWludCB0aW1lXzlfMTJtc19jbnQ7CisJaW50IHRpbWVfMTJfMTVtc19jbnQ7CisJaW50IHRpbWVfMTVfMThtc19jbnQ7CisJaW50IHRpbWVfMThfMjFtc19jbnQ7CisJaW50IHRpbWVfMjFtc191cF9jbnQ7CisJdTY0IHRpbWVfbWF4X3VzOworCXU2NCB0aW1lX3RvdGFsX3VzOworfTsKKworc3RydWN0IHZkZWNfcHJvZmlsZV9zdGF0aXN0aWNzX3MgeworCWJvb2wgc3RhdHVzOworCXU2NCBydW5fbGFzdHRpbWVzdGFtcDsKKwlpbnQgcnVuX2NudDsKKwl1NjQgY2JfbGFzdHRpbWVzdGFtcDsKKwlpbnQgY2JfY250OworCXU2NCBkZWNvZGVfZmlyc3RfdXM7CisJc3RydWN0IHZkZWNfcHJvZmlsZV90aW1lX3N0YXRfcyBydW4yY2JfdGltZV9zdGF0OworCXN0cnVjdCB2ZGVjX3Byb2ZpbGVfdGltZV9zdGF0X3MgZGVjb2RlX3RpbWVfc3RhdDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmRlY19wcm9maWxlX3N0YXRpc3RpY3NfcyBzdGF0aXN0aWNzX3NbTUFYX0lOU1RBTkNFX01VTl07CisKKworc3RydWN0IHZkZWNfcHJvZmlsZV9yZWNfcyB7CisJc3RydWN0IHZkZWNfcyAqdmRlYzsKKwl1NjQgdGltZXN0YW1wOworCWludCBldmVudDsKKwlpbnQgcGFyYTE7CisJaW50IHBhcmEyOworfTsKKworc3RhdGljIHN0cnVjdCB2ZGVjX3Byb2ZpbGVfcmVjX3MgcmVjc1tQUk9GSUxFX1JFQ19TSVpFXTsKK3N0YXRpYyBjb25zdCBjaGFyICpldmVudF9uYW1lW1ZERUNfUFJPRklMRV9NQVhfRVZFTlRdID0geworCSJydW4iLAorCSJjYiIsCisJInNhdmVfaW5wdXQiLAorCSJjaGVjayBydW4gcmVhZHkiLAorCSJydW4gcmVhZHkiLAorCSJkaXNjb25uZWN0IiwKKwkiZGVjX3dvcmsiLAorCSJpbmZvIgorfTsKKworI2lmIDAgLyogZ2V0IHRpbWUgZnJvbSBoYXJkd2FyZS4gKi8KK3N0YXRpYyB1NjQgZ2V0X3VzX3RpbWVfaHcodm9pZCkKK3sKKwl1MzIgbG8sIGhpMSwgaGkyOworCWludCBvZmZzZXQgPSAwOworCisJLyogdHhseCwgZzEyYSBpc2EgcmVnaXN0ZXIgYmFzZSBpcyAweDNjMDAgKi8KKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IE1FU09OX0NQVV9NQUpPUl9JRF9UWExYKQorCQlvZmZzZXQgPSAweDE2MDA7CisKKwlkbyB7CisJCWhpMSA9IFJFQURfTVBFR19SRUcoSVNBX1RJTUVSRV9ISSArIG9mZnNldCk7CisJCWxvID0gUkVBRF9NUEVHX1JFRyhJU0FfVElNRVJFICsgb2Zmc2V0KTsKKwkJaGkyID0gUkVBRF9NUEVHX1JFRyhJU0FfVElNRVJFX0hJICsgb2Zmc2V0KTsKKwl9IHdoaWxlIChoaTEgIT0gaGkyKTsKKworCXJldHVybiAoKCh1NjQpaGkxKSA8PCAzMikgfCBsbzsKK30KKyNlbmRpZgorCitzdGF0aWMgdTY0IGdldF91c190aW1lX3N5c3RlbSh2b2lkKQoreworCXJldHVybiBkaXY2NF91NjQobG9jYWxfY2xvY2soKSwgMTAwMCk7Cit9CisKK3N0YXRpYyB2b2lkIHZkZWNfcHJvZmlsZV91cGRhdGVfYWxsb2NfdGltZSgKKwlzdHJ1Y3QgdmRlY19wcm9maWxlX3RpbWVfc3RhdF9zICp0aW1lX3N0YXQsIHU2NCBzdGFydHVzLCB1NjQgZW5kdXMpCit7CisJdTY0IHNwZW5kX3RpbWVfdXMgPSBlbmR1cyAtIHN0YXJ0dXM7CisKKwlpZiAoc3BlbmRfdGltZV91cyA+IDAgJiYgc3BlbmRfdGltZV91cyA8IDEwMDAwMDAwMCkgeworCQlpZiAoc3BlbmRfdGltZV91cyA8IDYwMDApCisJCQl0aW1lX3N0YXQtPnRpbWVfNm1zX2xlc3NfY250Kys7CisJCWVsc2UgaWYgKHNwZW5kX3RpbWVfdXMgPCA5MDAwKQorCQkJdGltZV9zdGF0LT50aW1lXzZfOW1zX2NudCsrOworCQllbHNlIGlmIChzcGVuZF90aW1lX3VzIDwgMTIwMDApCisJCQl0aW1lX3N0YXQtPnRpbWVfOV8xMm1zX2NudCsrOworCQllbHNlIGlmIChzcGVuZF90aW1lX3VzIDwgMTUwMDApCisJCQl0aW1lX3N0YXQtPnRpbWVfMTJfMTVtc19jbnQrKzsKKwkJZWxzZSBpZiAoc3BlbmRfdGltZV91cyA8IDE4MDAwKQorCQkJdGltZV9zdGF0LT50aW1lXzE1XzE4bXNfY250Kys7CisJCWVsc2UgaWYgKHNwZW5kX3RpbWVfdXMgPCAyMTAwMCkKKwkJCXRpbWVfc3RhdC0+dGltZV8xOF8yMW1zX2NudCsrOworCQllbHNlCisJCQl0aW1lX3N0YXQtPnRpbWVfMjFtc191cF9jbnQrKzsKKwl9CisKKwlpZiAoc3BlbmRfdGltZV91cyA+IHRpbWVfc3RhdC0+dGltZV9tYXhfdXMpCisJCXRpbWVfc3RhdC0+dGltZV9tYXhfdXMgPSBzcGVuZF90aW1lX3VzOworCisJdGltZV9zdGF0LT50aW1lX3RvdGFsX3VzICs9IHNwZW5kX3RpbWVfdXM7Cit9CisKKworc3RhdGljIHZvaWQgdmRlY19wcm9maWxlX3N0YXRpc3RpY3Moc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGV2ZW50KQoreworCXN0cnVjdCB2ZGVjX3Byb2ZpbGVfc3RhdGlzdGljc19zICp0aW1lX3N0YXQgPSBOVUxMOworCXU2NCB0aW1lc3RhbXA7CisJaW50IGk7CisKKwlpZiAodmRlYy0+aWQgPj0gTUFYX0lOU1RBTkNFX01VTikKKwkJcmV0dXJuOworCisJaWYgKGV2ZW50ICE9IFZERUNfUFJPRklMRV9FVkVOVF9SVU4gJiYKKwkJCWV2ZW50ICE9IFZERUNfUFJPRklMRV9FVkVOVF9DQikKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmdmRlY19wcm9maWxlX211dGV4KTsKKworCWlmIChkZWNfdGltZV9zdGF0X3Jlc2V0ID09IDEpIHsKKwkJaWYgKGV2ZW50ICE9IFZERUNfUFJPRklMRV9FVkVOVF9SVU4pIHsKKwkJCW11dGV4X3VubG9jaygmdmRlY19wcm9maWxlX211dGV4KTsKKwkJCXJldHVybjsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0lOU1RBTkNFX01VTjsgaSsrKQorCQkJbWVtc2V0KCZzdGF0aXN0aWNzX3NbaV0sIDAsCisJCQkJc2l6ZW9mKHN0cnVjdCB2ZGVjX3Byb2ZpbGVfc3RhdGlzdGljc19zKSk7CisJCWRlY190aW1lX3N0YXRfcmVzZXQgPSAwOworCX0KKworCXRpbWVfc3RhdCA9ICZzdGF0aXN0aWNzX3NbdmRlYy0+aWRdOworCXRpbWVzdGFtcCA9IGdldF91c190aW1lX3N5c3RlbSgpOworCisJaWYgKHRpbWVfc3RhdC0+c3RhdHVzID09IGZhbHNlKSB7CisJCXRpbWVfc3RhdC0+ZGVjb2RlX2ZpcnN0X3VzID0gdGltZXN0YW1wOworCQl0aW1lX3N0YXQtPnN0YXR1cyA9IHRydWU7CisJfQorCisJaWYgKGV2ZW50ID09IFZERUNfUFJPRklMRV9FVkVOVF9SVU4pIHsKKwkJdGltZV9zdGF0LT5ydW5fbGFzdHRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwkJdGltZV9zdGF0LT5ydW5fY250Kys7CisJfSBlbHNlIGlmIChldmVudCA9PSBWREVDX1BST0ZJTEVfRVZFTlRfQ0IpIHsKKwkJLypydW4yY2Igc3RhdGlzdGljcyovCisJCXZkZWNfcHJvZmlsZV91cGRhdGVfYWxsb2NfdGltZSgmdGltZV9zdGF0LT5ydW4yY2JfdGltZV9zdGF0LCB0aW1lX3N0YXQtPnJ1bl9sYXN0dGltZXN0YW1wLCB0aW1lc3RhbXApOworCisJCS8qZGVjb2RlIHN0YXRpc3RpY3MqLworCQlpZiAodGltZV9zdGF0LT5jYl9jbnQgPT0gMCkKKwkJCXZkZWNfcHJvZmlsZV91cGRhdGVfYWxsb2NfdGltZSgmdGltZV9zdGF0LT5kZWNvZGVfdGltZV9zdGF0LCB0aW1lX3N0YXQtPmRlY29kZV9maXJzdF91cywgdGltZXN0YW1wKTsKKwkJZWxzZQorCQkJdmRlY19wcm9maWxlX3VwZGF0ZV9hbGxvY190aW1lKCZ0aW1lX3N0YXQtPmRlY29kZV90aW1lX3N0YXQsIHRpbWVfc3RhdC0+Y2JfbGFzdHRpbWVzdGFtcCwgdGltZXN0YW1wKTsKKworCQl0aW1lX3N0YXQtPmNiX2xhc3R0aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisJCXRpbWVfc3RhdC0+Y2JfY250Kys7CisJCUFUUkFDRV9DT1VOVEVSKHZkZWMtPmRlY19zcGVuZF90aW1lLCB0aW1lc3RhbXAgLSB0aW1lX3N0YXQtPnJ1bl9sYXN0dGltZXN0YW1wKTsKKwkJQVRSQUNFX0NPVU5URVIodmRlYy0+ZGVjX3NwZW5kX3RpbWVfYXZlLCBkaXZfdTY0KHRpbWVfc3RhdC0+cnVuMmNiX3RpbWVfc3RhdC50aW1lX3RvdGFsX3VzLCB0aW1lX3N0YXQtPmNiX2NudCkpOworCX0KKworCW11dGV4X3VubG9jaygmdmRlY19wcm9maWxlX211dGV4KTsKK30KKworCit2b2lkIHZkZWNfcHJvZmlsZV9tb3JlKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBldmVudCwgaW50IHBhcmExLCBpbnQgcGFyYTIpCit7CisJbXV0ZXhfbG9jaygmdmRlY19wcm9maWxlX211dGV4KTsKKworCXJlY3NbcmVjX3dwXS52ZGVjID0gdmRlYzsKKwlyZWNzW3JlY193cF0udGltZXN0YW1wID0gZ2V0X3VzX3RpbWVfc3lzdGVtKCk7CisJcmVjc1tyZWNfd3BdLmV2ZW50ID0gZXZlbnQ7CisJcmVjc1tyZWNfd3BdLnBhcmExID0gcGFyYTE7CisJcmVjc1tyZWNfd3BdLnBhcmEyID0gcGFyYTI7CisKKwlyZWNfd3ArKzsKKwlpZiAocmVjX3dwID09IFBST0ZJTEVfUkVDX1NJWkUpIHsKKwkJcmVjX3dyYXBwZWQgPSB0cnVlOworCQlyZWNfd3AgPSAwOworCX0KKworCW11dGV4X3VubG9jaygmdmRlY19wcm9maWxlX211dGV4KTsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19wcm9maWxlX21vcmUpOworCit2b2lkIHZkZWNfcHJvZmlsZShzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgZXZlbnQpCit7CisJQVRSQUNFX0NPVU5URVIodmRlYy0+dmZtX21hcF9pZCwgZXZlbnQpOworCXZkZWNfcHJvZmlsZV9tb3JlKHZkZWMsIGV2ZW50LCAwICwgMCk7CisJaWYgKGRlY190aW1lX3N0YXRfZmxhZyA9PSAxKQorCQl2ZGVjX3Byb2ZpbGVfc3RhdGlzdGljcyh2ZGVjLCBldmVudCk7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfcHJvZmlsZSk7CisKK3ZvaWQgdmRlY19wcm9maWxlX2ZsdXNoKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJaW50IGk7CisKKwlpZiAodmRlYy0+aWQgPj0gTUFYX0lOU1RBTkNFX01VTikKKwkJCXJldHVybjsKKworCW11dGV4X2xvY2soJnZkZWNfcHJvZmlsZV9tdXRleCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUFJPRklMRV9SRUNfU0laRTsgaSsrKSB7CisJCWlmIChyZWNzW2ldLnZkZWMgPT0gdmRlYykKKwkJCXJlY3NbaV0udmRlYyA9IE5VTEw7CisJfQorCisJbWVtc2V0KCZzdGF0aXN0aWNzX3NbdmRlYy0+aWRdLCAwLCBzaXplb2Yoc3RydWN0IHZkZWNfcHJvZmlsZV9zdGF0aXN0aWNzX3MpKTsKKworCW11dGV4X3VubG9jaygmdmRlY19wcm9maWxlX211dGV4KTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmV2ZW50X3N0cihpbnQgZXZlbnQpCit7CisJaWYgKGV2ZW50IDwgVkRFQ19QUk9GSUxFX01BWF9FVkVOVCkKKwkJcmV0dXJuIGV2ZW50X25hbWVbZXZlbnRdOworCisJcmV0dXJuICJJTlZBTElEIjsKK30KKworc3RhdGljIGludCB2ZGVjX3Byb2ZpbGVfZGJnX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCWludCBpLCBlbmQ7CisJdTY0IGJhc2VfdGltZXN0YW1wOworCisJbXV0ZXhfbG9jaygmdmRlY19wcm9maWxlX211dGV4KTsKKworCWlmIChyZWNfd3JhcHBlZCkgeworCQlpID0gcmVjX3dwOworCQllbmQgPSByZWNfd3A7CisJfSBlbHNlIHsKKwkJaSA9IDA7CisJCWVuZCA9IHJlY193cDsKKwl9CisKKwliYXNlX3RpbWVzdGFtcCA9IHJlY3NbaV0udGltZXN0YW1wOworCXdoaWxlICgxKSB7CisJCWlmICgoIXJlY193cmFwcGVkKSAmJiAoaSA9PSBlbmQpKQorCQkJYnJlYWs7CisKKwkJaWYgKHJlY3NbaV0udmRlYykgeworCQkJc2VxX3ByaW50ZihtLCAiWyVzOiVkXSBcdCUwMTZsbHUgdXMgOiAlcyAoJWQsJWQpXG4iLAorCQkJCXZkZWNfZGV2aWNlX25hbWVfc3RyKHJlY3NbaV0udmRlYyksCisJCQkJcmVjc1tpXS52ZGVjLT5pZCwKKwkJCQlyZWNzW2ldLnRpbWVzdGFtcCAtIGJhc2VfdGltZXN0YW1wLAorCQkJCWV2ZW50X3N0cihyZWNzW2ldLmV2ZW50KSwKKwkJCQlyZWNzW2ldLnBhcmExLAorCQkJCXJlY3NbaV0ucGFyYTIKKwkJCQkpOworCQl9IGVsc2UgeworCQkJc2VxX3ByaW50ZihtLCAiWyVzOiVkXSBcdCUwMTZsbHUgdXMgOiAlcyAoJWQsJWQpXG4iLAorCQkJCSJOL0EiLAorCQkJCTAsCisJCQkJcmVjc1tpXS50aW1lc3RhbXAgLSBiYXNlX3RpbWVzdGFtcCwKKwkJCQlldmVudF9zdHIocmVjc1tpXS5ldmVudCksCisJCQkJcmVjc1tpXS5wYXJhMSwKKwkJCQlyZWNzW2ldLnBhcmEyCisJCQkJKTsKKwkJfQorCQlpZiAoKytpID09IFBST0ZJTEVfUkVDX1NJWkUpCisJCQlpID0gMDsKKworCQlpZiAocmVjX3dyYXBwZWQgJiYgKGkgPT0gZW5kKSkKKwkJCWJyZWFrOworCX0KKworCW11dGV4X3VubG9jaygmdmRlY19wcm9maWxlX211dGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRpbWVfc3RhdF9wcm9maWxlX2RiZ19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJnZkZWNfcHJvZmlsZV9tdXRleCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0lOU1RBTkNFX01VTjsgaSsrKQorCXsKKwkJaWYgKHN0YXRpc3RpY3Nfc1tpXS5zdGF0dXMgPT0gZmFsc2UpCisJCQljb250aW51ZTsKKworCQlzZXFfcHJpbnRmKG0sICJbJWRdcnVuX2NudDolZCwgY2JfY250OiVkXG5cCisJCQlcdFx0XHR0aW1lX3RvdGFsX3VzOiVsbHVcblwKKwkJCVx0XHRcdHJ1bjJjYiB0aW1lOlxuXAorCQkJXHRcdFx0dGltZV9tYXhfdXM6JWxsdVxuXAorCQkJXHRcdFx0WyVkXXJ1bjJjYiBhdmVfdXM6JWxsdVxuXAorCQkJXHRcdFx0dGltZV82bXNfbGVzc19jbnQ6JWRcblwKKwkJCVx0XHRcdHRpbWVfNl85bXNfY250OiVkXG5cCisJCQlcdFx0XHR0aW1lXzlfMTJtc19jbnQ6JWRcblwKKwkJCVx0XHRcdHRpbWVfMTJfMTVtc19jbnQ6JWRcblwKKwkJCVx0XHRcdHRpbWVfMTVfMThtc19jbnQ6JWRcblwKKwkJCVx0XHRcdHRpbWVfMThfMjFtc19jbnQ6JWRcblwKKwkJCVx0XHRcdHRpbWVfMjFtc191cF9jbnQ6JWRcblwKKwkJCVx0XHRcdGRlY29kZSB0aW1lOlxuXAorCQkJXHRcdFx0dGltZV90b3RhbF91czolbGx1XG5cCisJCQlcdFx0XHR0aW1lX21heF91czolbGx1XG5cCisJCQlcdFx0XHRbJWRdY2IyY2IgYXZlX3VzOiVsbHVcblwKKwkJCVx0XHRcdHRpbWVfNm1zX2xlc3NfY250OiVkXG5cCisJCQlcdFx0XHR0aW1lXzZfOW1zX2NudDolZFxuXAorCQkJXHRcdFx0dGltZV85XzEybXNfY250OiVkXG5cCisJCQlcdFx0XHR0aW1lXzEyXzE1bXNfY250OiVkXG5cCisJCQlcdFx0XHR0aW1lXzE1XzE4bXNfY250OiVkXG5cCisJCQlcdFx0XHR0aW1lXzE4XzIxbXNfY250OiVkXG5cCisJCQlcdFx0XHR0aW1lXzIxbXNfdXBfY250OiVkXG4iLAorCQkJaSwKKwkJCXN0YXRpc3RpY3Nfc1tpXS5ydW5fY250LAorCQkJc3RhdGlzdGljc19zW2ldLmNiX2NudCwKKwkJCXN0YXRpc3RpY3Nfc1tpXS5ydW4yY2JfdGltZV9zdGF0LnRpbWVfdG90YWxfdXMsCisJCQlzdGF0aXN0aWNzX3NbaV0ucnVuMmNiX3RpbWVfc3RhdC50aW1lX21heF91cywKKwkJCWksCisJCQlkaXZfdTY0KHN0YXRpc3RpY3Nfc1tpXS5ydW4yY2JfdGltZV9zdGF0LnRpbWVfdG90YWxfdXMgLCBzdGF0aXN0aWNzX3NbaV0uY2JfY250KSwKKwkJCXN0YXRpc3RpY3Nfc1tpXS5ydW4yY2JfdGltZV9zdGF0LnRpbWVfNm1zX2xlc3NfY250LAorCQkJc3RhdGlzdGljc19zW2ldLnJ1bjJjYl90aW1lX3N0YXQudGltZV82Xzltc19jbnQsCisJCQlzdGF0aXN0aWNzX3NbaV0ucnVuMmNiX3RpbWVfc3RhdC50aW1lXzlfMTJtc19jbnQsCisJCQlzdGF0aXN0aWNzX3NbaV0ucnVuMmNiX3RpbWVfc3RhdC50aW1lXzEyXzE1bXNfY250LAorCQkJc3RhdGlzdGljc19zW2ldLnJ1bjJjYl90aW1lX3N0YXQudGltZV8xNV8xOG1zX2NudCwKKwkJCXN0YXRpc3RpY3Nfc1tpXS5ydW4yY2JfdGltZV9zdGF0LnRpbWVfMThfMjFtc19jbnQsCisJCQlzdGF0aXN0aWNzX3NbaV0ucnVuMmNiX3RpbWVfc3RhdC50aW1lXzIxbXNfdXBfY250LAorCQkJc3RhdGlzdGljc19zW2ldLmRlY29kZV90aW1lX3N0YXQudGltZV90b3RhbF91cywKKwkJCXN0YXRpc3RpY3Nfc1tpXS5kZWNvZGVfdGltZV9zdGF0LnRpbWVfbWF4X3VzLAorCQkJaSwKKwkJCWRpdl91NjQoc3RhdGlzdGljc19zW2ldLmRlY29kZV90aW1lX3N0YXQudGltZV90b3RhbF91cyAsIHN0YXRpc3RpY3Nfc1tpXS5jYl9jbnQpLAorCQkJc3RhdGlzdGljc19zW2ldLmRlY29kZV90aW1lX3N0YXQudGltZV82bXNfbGVzc19jbnQsCisJCQlzdGF0aXN0aWNzX3NbaV0uZGVjb2RlX3RpbWVfc3RhdC50aW1lXzZfOW1zX2NudCwKKwkJCXN0YXRpc3RpY3Nfc1tpXS5kZWNvZGVfdGltZV9zdGF0LnRpbWVfOV8xMm1zX2NudCwKKwkJCXN0YXRpc3RpY3Nfc1tpXS5kZWNvZGVfdGltZV9zdGF0LnRpbWVfMTJfMTVtc19jbnQsCisJCQlzdGF0aXN0aWNzX3NbaV0uZGVjb2RlX3RpbWVfc3RhdC50aW1lXzE1XzE4bXNfY250LAorCQkJc3RhdGlzdGljc19zW2ldLmRlY29kZV90aW1lX3N0YXQudGltZV8xOF8yMW1zX2NudCwKKwkJCXN0YXRpc3RpY3Nfc1tpXS5kZWNvZGVfdGltZV9zdGF0LnRpbWVfMjFtc191cF9jbnQpOworCX0KKworCW11dGV4X3VubG9jaygmdmRlY19wcm9maWxlX211dGV4KTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgdmRlY19wcm9maWxlX2RiZ19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCB2ZGVjX3Byb2ZpbGVfZGJnX3Nob3csIE5VTEwpOworfQorCitzdGF0aWMgaW50IHRpbWVfc3RhdF9wcm9maWxlX2RiZ19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCB0aW1lX3N0YXRfcHJvZmlsZV9kYmdfc2hvdywgTlVMTCk7Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXZlbnRfZGJnX2ZvcHMgPSB7CisJLm9wZW4gICAgPSB2ZGVjX3Byb2ZpbGVfZGJnX29wZW4sCisJLnJlYWQgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdGltZV9zdGF0X2RiZ19mb3BzID0geworCS5vcGVuICAgID0gdGltZV9zdGF0X3Byb2ZpbGVfZGJnX29wZW4sCisJLnJlYWQgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworCisjaWYgMCAvKkRFQlVHX1RNUCovCitzdGF0aWMgaW50IF9faW5pdCB2ZGVjX3Byb2ZpbGVfaW5pdF9kZWJ1Z2ZzKHZvaWQpCit7CisJc3RydWN0IGRlbnRyeSAqcm9vdCwgKmV2ZW50OworCisJcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcigidmRlY19wcm9maWxlIiwgTlVMTCk7CisJaWYgKElTX0VSUihyb290KSB8fCAhcm9vdCkKKwkJZ290byBlcnI7CisKKwlldmVudCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImV2ZW50IiwgMDQwMCwgcm9vdCwgTlVMTCwKKwkJCSZldmVudF9kYmdfZm9wcyk7CisJaWYgKCFldmVudCkKKwkJZ290byBlcnJfMTsKKworCW11dGV4X2luaXQoJnZkZWNfcHJvZmlsZV9tdXRleCk7CisKKwlyZXR1cm4gMDsKKworZXJyXzE6CisJZGVidWdmc19yZW1vdmUocm9vdCk7CitlcnI6CisJcHJfZXJyKCJDYW4gbm90IGNyZWF0ZSBkZWJ1Z2ZzIGZvciB2ZGVjX3Byb2ZpbGVcbiIpOworCXJldHVybiAwOworfQorCisjZW5kaWYKKworaW50IHZkZWNfcHJvZmlsZV9pbml0X2RlYnVnZnModm9pZCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpyb290LCAqZXZlbnQsICp0aW1lX3N0YXQ7CisKKwlyb290ID0gZGVidWdmc19jcmVhdGVfZGlyKCJ2ZGVjX3Byb2ZpbGUiLCBOVUxMKTsKKwlpZiAoSVNfRVJSKHJvb3QpIHx8ICFyb290KQorCQlnb3RvIGVycjsKKworCWV2ZW50ID0gZGVidWdmc19jcmVhdGVfZmlsZSgiZXZlbnQiLCAwNDAwLCByb290LCBOVUxMLAorCQkJJmV2ZW50X2RiZ19mb3BzKTsKKwlpZiAoIWV2ZW50KQorCQlnb3RvIGVycl8xOworCisJdGltZV9zdGF0ID0gZGVidWdmc19jcmVhdGVfZmlsZSgidGltZV9zdGF0IiwgMDQwMCwgcm9vdCwgTlVMTCwKKwkJCSZ0aW1lX3N0YXRfZGJnX2ZvcHMpOworCWlmICghdGltZV9zdGF0KQorCQlnb3RvIGVycl8yOworCisJbXV0ZXhfaW5pdCgmdmRlY19wcm9maWxlX211dGV4KTsKKworCXJldHVybiAwOworCitlcnJfMjoKKwlkZWJ1Z2ZzX3JlbW92ZShldmVudCk7CitlcnJfMToKKwlkZWJ1Z2ZzX3JlbW92ZShyb290KTsKK2VycjoKKwlwcl9lcnIoIkNhbiBub3QgY3JlYXRlIGRlYnVnZnMgZm9yIHZkZWNfcHJvZmlsZVxuIik7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfcHJvZmlsZV9pbml0X2RlYnVnZnMpOworCit2b2lkIHZkZWNfcHJvZmlsZV9leGl0X2RlYnVnZnModm9pZCkKK3sKKwlkZWJ1Z2ZzX3JlbW92ZShldmVudCk7CisJZGVidWdmc19yZW1vdmUocm9vdCk7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfcHJvZmlsZV9leGl0X2RlYnVnZnMpOworCittb2R1bGVfcGFyYW0oZGVjX3RpbWVfc3RhdF9mbGFnLCB1aW50LCAwNjY0KTsKKworbW9kdWxlX3BhcmFtKGRlY190aW1lX3N0YXRfcmVzZXQsIHVpbnQsIDA2NjQpOworCisKKy8qbW9kdWxlX2luaXQodmRlY19wcm9maWxlX2luaXRfZGVidWdmcyk7Ki8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWNfcHJvZmlsZS5oIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWNfcHJvZmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZjNiZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdmRlY19wcm9maWxlLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9hbXBvcnRzL3ZkZWNfcHJvZmlsZS5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorKi8KKworI2lmbmRlZiBWREVDX1BST0ZJTEVfSAorI2RlZmluZSBWREVDX1BST0ZJTEVfSAorCitzdHJ1Y3QgdmRlY19zOworCisjZGVmaW5lIFZERUNfUFJPRklMRV9FVkVOVF9SVU4gICAgICAgICAwCisjZGVmaW5lIFZERUNfUFJPRklMRV9FVkVOVF9DQiAgICAgICAgICAxCisjZGVmaW5lIFZERUNfUFJPRklMRV9FVkVOVF9TQVZFX0lOUFVUICAyCisjZGVmaW5lIFZERUNfUFJPRklMRV9FVkVOVF9DSEtfUlVOX1JFQURZIDMKKyNkZWZpbmUgVkRFQ19QUk9GSUxFX0VWRU5UX1JVTl9SRUFEWSAgIDQKKyNkZWZpbmUgVkRFQ19QUk9GSUxFX0VWRU5UX0RJU0NPTk5FQ1QgIDUKKyNkZWZpbmUgVkRFQ19QUk9GSUxFX0VWRU5UX0RFQ19XT1JLICAgIDYKKyNkZWZpbmUgVkRFQ19QUk9GSUxFX0VWRU5UX0lORk8gICAgICAgIDcKKyNkZWZpbmUgVkRFQ19QUk9GSUxFX01BWF9FVkVOVCAgICAgICAgIDgKKworZXh0ZXJuIHZvaWQgdmRlY19wcm9maWxlKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBldmVudCk7CitleHRlcm4gdm9pZCB2ZGVjX3Byb2ZpbGVfbW9yZShzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgZXZlbnQsIGludCBwYXJhMSwgaW50IHBhcmEyKTsKK2V4dGVybiB2b2lkIHZkZWNfcHJvZmlsZV9mbHVzaChzdHJ1Y3QgdmRlY19zICp2ZGVjKTsKKworaW50IHZkZWNfcHJvZmlsZV9pbml0X2RlYnVnZnModm9pZCk7Cit2b2lkIHZkZWNfcHJvZmlsZV9leGl0X2RlYnVnZnModm9pZCk7CisKKyNlbmRpZiAvKiBWREVDX1BST0ZJTEVfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWNfc3luYy5jIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWNfc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MTkyZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdmRlY19zeW5jLmMKQEAgLTAsMCArMSw1MzEgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNyBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisqIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyoKKyogRGVzY3JpcHRpb246CisqLworI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQvY2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zeW5jX2ZpbGUuaD4KKyNpbmNsdWRlICJ2ZGVjX3N5bmMuaCIKKworI2RlZmluZSBWREVDX0RCR19FTkFCTEVfRkVOQ0UJKDB4MTAwKQorI2RlZmluZSBWREVDX1NZTkNfQ09VTlQgMzIKKworc3RydWN0IHZkZWNfc3luY19jb3JlX3MgeworCXN0cnVjdCB2ZGVjX3N5bmMgc192ZGVjX3N5bmNbVkRFQ19TWU5DX0NPVU5UXTsKKwlzcGlubG9ja190IHZkZWNfc3luY19sb2NrOworfTsKKworc3RhdGljIHN0cnVjdCB2ZGVjX3N5bmNfY29yZV9zIHZkZWNfc3luY19jb3JlOworCitleHRlcm4gdTMyIHZkZWNfZ2V0X2RlYnVnKHZvaWQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRtYV9mZW5jZV9vcHMgdGltZWxpbmVfZmVuY2Vfb3BzOworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3luY19wdCAqZmVuY2VfdG9fc3luY19wdChzdHJ1Y3QgZG1hX2ZlbmNlICpmZW5jZSkKK3sKKwlpZiAoZmVuY2UtPm9wcyAhPSAmdGltZWxpbmVfZmVuY2Vfb3BzKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gY29udGFpbmVyX29mKGZlbmNlLCBzdHJ1Y3Qgc3luY19wdCwgZmVuY2UpOworfQorCisvKioKKyAqIHN5bmNfdGltZWxpbmVfY3JlYXRlKCkgLSBjcmVhdGVzIGEgc3luYyBvYmplY3QKKyAqIEBuYW1lOglzeW5jX3RpbWVsaW5lIG5hbWUKKyAqCisgKiBDcmVhdGVzIGEgbmV3IHN5bmNfdGltZWxpbmUuIFJldHVybnMgdGhlIHN5bmNfdGltZWxpbmUgb2JqZWN0IG9yIE5VTEwgaW4KKyAqIGNhc2Ugb2YgZXJyb3IuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3luY190aW1lbGluZSAqc3luY190aW1lbGluZV9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqOworCisJb2JqID0ga3phbGxvYyhzaXplb2YoKm9iaiksIEdGUF9LRVJORUwpOworCWlmICghb2JqKQorCQlyZXR1cm4gTlVMTDsKKworCWtyZWZfaW5pdCgmb2JqLT5rcmVmKTsKKwlvYmotPmNvbnRleHQgPSBkbWFfZmVuY2VfY29udGV4dF9hbGxvYygxKTsKKwlvYmotPnRpbWVzdGFtcCA9IGxvY2FsX2Nsb2NrKCk7CisJc3RybGNweShvYmotPm5hbWUsIG5hbWUsIHNpemVvZihvYmotPm5hbWUpKTsKKwlJTklUX0xJU1RfSEVBRCgmb2JqLT5hY3RpdmVfbGlzdF9oZWFkKTsKKwlJTklUX0xJU1RfSEVBRCgmb2JqLT5wdF9saXN0KTsKKwlzcGluX2xvY2tfaW5pdCgmb2JqLT5sb2NrKTsKKworCXJldHVybiBvYmo7Cit9CisKK3N0YXRpYyB2b2lkIHN5bmNfdGltZWxpbmVfZnJlZShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqID0KKwkJY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBzeW5jX3RpbWVsaW5lLCBrcmVmKTsKKwlzdHJ1Y3QgdmRlY19zeW5jICpzeW5jID0gb2JqLT5wYXJlbnRfc3luYzsKKworCXByX2luZm8oIltWREVDLUZFTkNFXSBmcmVlIHRpbWVsaW5lOiAlbHhcbiIsICh1bG9uZykgb2JqKTsKKwlrZnJlZShvYmopOworCWF0b21pY19zZXQoJnN5bmMtPnVzZV9mbGFnLCAwKTsKKwlzeW5jLT50aW1lbGluZSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHN5bmNfdGltZWxpbmVfZ2V0KHN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmopCit7CisJa3JlZl9nZXQoJm9iai0+a3JlZik7Cit9CisKK3N0YXRpYyB2b2lkIHN5bmNfdGltZWxpbmVfcHV0KHN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmopCit7CisJa3JlZl9wdXQoJm9iai0+a3JlZiwgc3luY190aW1lbGluZV9mcmVlKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnRpbWVsaW5lX2ZlbmNlX2dldF9kcml2ZXJfbmFtZShzdHJ1Y3QgZG1hX2ZlbmNlICpmZW5jZSkKK3sKKwlzdHJ1Y3Qgc3luY190aW1lbGluZSAqcGFyZW50ID0gZmVuY2VfcGFyZW50KGZlbmNlKTsKKworCXJldHVybiBwYXJlbnQtPm5hbWU7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICp0aW1lbGluZV9mZW5jZV9nZXRfdGltZWxpbmVfbmFtZShzdHJ1Y3QgZG1hX2ZlbmNlICpmZW5jZSkKK3sKKwlzdHJ1Y3Qgc3luY190aW1lbGluZSAqcGFyZW50ID0gZmVuY2VfcGFyZW50KGZlbmNlKTsKKworCXJldHVybiBwYXJlbnQtPm5hbWU7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVsaW5lX2ZlbmNlX3JlbGVhc2Uoc3RydWN0IGRtYV9mZW5jZSAqZmVuY2UpCit7CisJc3RydWN0IHN5bmNfcHQgKnB0ID0gZmVuY2VfdG9fc3luY19wdChmZW5jZSk7CisJc3RydWN0IHN5bmNfdGltZWxpbmUgKnBhcmVudCA9IGZlbmNlX3BhcmVudChmZW5jZSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qcHJfaW5mbygiW1ZERUMtRkVOQ0VdIHJlbGVhc2UgZmVuY2U6ICVseFxuIiwgKHVsb25nKSBmZW5jZSk7Ki8KKworCXNwaW5fbG9ja19pcnFzYXZlKGZlbmNlLT5sb2NrLCBmbGFncyk7CisJbGlzdF9kZWwoJnB0LT5saW5rKTsKKwlpZiAoIWxpc3RfZW1wdHkoJnB0LT5hY3RpdmVfbGlzdCkpCisJCWxpc3RfZGVsKCZwdC0+YWN0aXZlX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZmVuY2UtPmxvY2ssIGZsYWdzKTsKKwlzeW5jX3RpbWVsaW5lX3B1dChwYXJlbnQpOworCWRtYV9mZW5jZV9mcmVlKGZlbmNlKTsKK30KKworc3RhdGljIGJvb2wgdGltZWxpbmVfZmVuY2Vfc2lnbmFsZWQoc3RydWN0IGRtYV9mZW5jZSAqZmVuY2UpCit7CisJc3RydWN0IHN5bmNfdGltZWxpbmUgKnBhcmVudCA9IGZlbmNlX3BhcmVudChmZW5jZSk7CisJc3RydWN0IHN5bmNfcHQgKnB0ID0gZ2V0X3N5bmNfcHQoZmVuY2UpOworCisJaWYgKF9fZG1hX2ZlbmNlX2lzX2xhdGVyKGZlbmNlLT5zZXFubywgcGFyZW50LT52YWx1ZSwgZmVuY2UtPm9wcykpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChwdC0+dGltZXN0YW1wID4gcGFyZW50LT50aW1lc3RhbXApCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCB0aW1lbGluZV9mZW5jZV9lbmFibGVfc2lnbmFsaW5nKHN0cnVjdCBkbWFfZmVuY2UgKmZlbmNlKQoreworCXN0cnVjdCBzeW5jX3B0ICpwdCA9IGNvbnRhaW5lcl9vZihmZW5jZSwgc3RydWN0IHN5bmNfcHQsIGZlbmNlKTsKKwlzdHJ1Y3Qgc3luY190aW1lbGluZSAqcGFyZW50ID0gZmVuY2VfcGFyZW50KGZlbmNlKTsKKworCWlmICh0aW1lbGluZV9mZW5jZV9zaWduYWxlZChmZW5jZSkpCisJCXJldHVybiBmYWxzZTsKKworCWxpc3RfYWRkX3RhaWwoJnB0LT5hY3RpdmVfbGlzdCwgJnBhcmVudC0+YWN0aXZlX2xpc3RfaGVhZCk7CisJcmV0dXJuIHRydWU7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCB0aW1lbGluZV9mZW5jZV9kaXNhYmxlX3NpZ25hbGluZyhzdHJ1Y3QgZG1hX2ZlbmNlICpmZW5jZSkKK3sKKwlzdHJ1Y3Qgc3luY19wdCAqcHQgPSBjb250YWluZXJfb2YoZmVuY2UsIHN0cnVjdCBzeW5jX3B0LCBmZW5jZSk7CisKKwlsaXN0X2RlbF9pbml0KCZwdC0+YWN0aXZlX2xpc3QpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHRpbWVsaW5lX2ZlbmNlX3ZhbHVlX3N0cihzdHJ1Y3QgZG1hX2ZlbmNlICpmZW5jZSwKKwkJCQkgICAgY2hhciAqc3RyLCBpbnQgc2l6ZSkKK3sKKwlzbnByaW50ZihzdHIsIHNpemUsICIlbGx1IiwgZmVuY2UtPnNlcW5vKTsKK30KKworc3RhdGljIHZvaWQgdGltZWxpbmVfZmVuY2VfdGltZWxpbmVfdmFsdWVfc3RyKHN0cnVjdCBkbWFfZmVuY2UgKmZlbmNlLAorCQkJCQkgICAgIGNoYXIgKnN0ciwgaW50IHNpemUpCit7CisJc3RydWN0IHN5bmNfdGltZWxpbmUgKnBhcmVudCA9IGZlbmNlX3BhcmVudChmZW5jZSk7CisKKwlzbnByaW50ZihzdHIsIHNpemUsICIlZCIsIHBhcmVudC0+dmFsdWUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRtYV9mZW5jZV9vcHMgdGltZWxpbmVfZmVuY2Vfb3BzID0geworCS5nZXRfZHJpdmVyX25hbWUJPSB0aW1lbGluZV9mZW5jZV9nZXRfZHJpdmVyX25hbWUsCisJLmdldF90aW1lbGluZV9uYW1lCT0gdGltZWxpbmVfZmVuY2VfZ2V0X3RpbWVsaW5lX25hbWUsCisJLmVuYWJsZV9zaWduYWxpbmcJPSB0aW1lbGluZV9mZW5jZV9lbmFibGVfc2lnbmFsaW5nLAorCS8vLmRpc2FibGVfc2lnbmFsaW5nCT0gdGltZWxpbmVfZmVuY2VfZGlzYWJsZV9zaWduYWxpbmcsCisJLnNpZ25hbGVkCQk9IHRpbWVsaW5lX2ZlbmNlX3NpZ25hbGVkLAorCS53YWl0CQkJPSBkbWFfZmVuY2VfZGVmYXVsdF93YWl0LAorCS5yZWxlYXNlCQk9IHRpbWVsaW5lX2ZlbmNlX3JlbGVhc2UsCisJLmZlbmNlX3ZhbHVlX3N0cgk9IHRpbWVsaW5lX2ZlbmNlX3ZhbHVlX3N0ciwKKwkudGltZWxpbmVfdmFsdWVfc3RyCT0gdGltZWxpbmVfZmVuY2VfdGltZWxpbmVfdmFsdWVfc3RyLAorfTsKKworLyoqCisgKiBzeW5jX3RpbWVsaW5lX3NpZ25hbCgpIC0gc2lnbmFsIGEgc3RhdHVzIGNoYW5nZSBvbiBhIHN5bmNfdGltZWxpbmUKKyAqIEBvYmo6CXN5bmNfdGltZWxpbmUgdG8gc2lnbmFsCisgKiBAaW5jOgludW0gdG8gaW5jcmVtZW50IG9uIHRpbWVsaW5lLT52YWx1ZQorICoKKyAqIEEgc3luYyBpbXBsZW1lbnRhdGlvbiBzaG91bGQgY2FsbCB0aGlzIGFueSB0aW1lIG9uZSBvZiBpdCdzIGZlbmNlcworICogaGFzIHNpZ25hbGVkIG9yIGhhcyBhbiBlcnJvciBjb25kaXRpb24uCisgKi8KK3N0YXRpYyB2b2lkIHN5bmNfdGltZWxpbmVfc2lnbmFsKHN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmosIHVuc2lnbmVkIGludCBpbmMpCit7CisJc3RydWN0IHN5bmNfcHQgKnB0LCAqbmV4dDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm9iai0+bG9jaywgZmxhZ3MpOworCW9iai0+dmFsdWUgKz0gaW5jOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwdCwgbmV4dCwgJm9iai0+YWN0aXZlX2xpc3RfaGVhZCwKKwkJCQkgYWN0aXZlX2xpc3QpIHsKKwkJaWYgKGRtYV9mZW5jZV9pc19zaWduYWxlZF9sb2NrZWQoJnB0LT5mZW5jZSkpCisJCQlsaXN0X2RlbF9pbml0KCZwdC0+YWN0aXZlX2xpc3QpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvYmotPmxvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBzeW5jX3B0X2NyZWF0ZSgpIC0gY3JlYXRlcyBhIHN5bmMgcHQKKyAqIEBwYXJlbnQ6CWZlbmNlJ3MgcGFyZW50IHN5bmNfdGltZWxpbmUKKyAqIEBpbmM6CXZhbHVlIG9mIHRoZSBmZW5jZQorICoKKyAqIENyZWF0ZXMgYSBuZXcgc3luY19wdCBhcyBhIGNoaWxkIG9mIEBwYXJlbnQuICBAc2l6ZSBieXRlcyB3aWxsIGJlCisgKiBhbGxvY2F0ZWQgYWxsb3dpbmcgZm9yIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGRhdGEgdG8gYmUga2VwdCBhZnRlcgorICogdGhlIGdlbmVyaWMgc3luY190aW1lbGluZSBzdHJ1Y3QuIFJldHVybnMgdGhlIHN5bmNfcHQgb2JqZWN0IG9yCisgKiBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3luY19wdCAqc3luY19wdF9jcmVhdGUoc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaiwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJc3RydWN0IHN5bmNfcHQgKnB0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwdCA9IGt6YWxsb2Moc2l6ZW9mKCpwdCksIEdGUF9LRVJORUwpOworCWlmICghcHQpCisJCXJldHVybiBOVUxMOworCXNwaW5fbG9ja19pcnFzYXZlKCZvYmotPmxvY2ssIGZsYWdzKTsKKwlzeW5jX3RpbWVsaW5lX2dldChvYmopOworCWRtYV9mZW5jZV9pbml0KCZwdC0+ZmVuY2UsICZ0aW1lbGluZV9mZW5jZV9vcHMsICZvYmotPmxvY2ssCisJCSAgIG9iai0+Y29udGV4dCwgdmFsdWUpOworCWxpc3RfYWRkX3RhaWwoJnB0LT5saW5rLCAmb2JqLT5wdF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmcHQtPmFjdGl2ZV9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvYmotPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBwdDsKK30KKworc3RhdGljIHZvaWQgc3luY19wdF9mcmVlKHN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmosCisJCQkgc3RydWN0IHN5bmNfcHQgKnB0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb2JqLT5sb2NrLCBmbGFncyk7CisJbGlzdF9kZWwoJnB0LT5saW5rKTsKKwlzeW5jX3RpbWVsaW5lX3B1dChvYmopOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9iai0+bG9jaywgZmxhZ3MpOworCWtmcmVlKHB0KTsKKwlwdCA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgdGltZWxpbmVfY3JlYXRlX2ZlbmNlKHN0cnVjdCB2ZGVjX3N5bmMgKnN5bmMsIGludCB1c2FnZSwKKwkJCQkgICAgc3RydWN0IGRtYV9mZW5jZSAqKmZlbmNlLCBpbnQgKmZkLCB1MzIgdmFsdWUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3luY19wdCAqcHQ7CisJc3RydWN0IHN5bmNfZmlsZSAqc3luY19maWxlOworCXN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmogPSBzeW5jLT50aW1lbGluZTsKKworCWlmIChvYmogPT0gTlVMTCkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXB0ID0gc3luY19wdF9jcmVhdGUob2JqLCB2YWx1ZSk7CisJaWYgKCFwdCkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAodXNhZ2UgPT0gRkVOQ0VfVVNFX0ZPUl9BUFApIHsKKwkJKmZkID0gIGdldF91bnVzZWRfZmRfZmxhZ3MoT19DTE9FWEVDKTsKKwkJaWYgKCpmZCA8IDApIHsKKwkJCXJldHVybiAtRUJBREY7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCXN5bmNfZmlsZSA9IHN5bmNfZmlsZV9jcmVhdGUoJnB0LT5mZW5jZSk7CisJCWlmICghc3luY19maWxlKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBlcnI7CisJCX0KKworCQlmZF9pbnN0YWxsKCpmZCwgc3luY19maWxlLT5maWxlKTsKKworCQkvKiBkZWNyZWFzZXMgcmVmY250LiAqLworCQlkbWFfZmVuY2VfcHV0KCZwdC0+ZmVuY2UpOworCX0KKworCSpmZW5jZSA9ICZwdC0+ZmVuY2U7CisKKwlwdC0+dGltZXN0YW1wID0gbG9jYWxfY2xvY2soKTsKKworCWlmICh2ZGVjX2dldF9kZWJ1ZygpICYgVkRFQ19EQkdfRU5BQkxFX0ZFTkNFKQorCQlwcl9pbmZvKCJbVkRFQy1GRU5DRV06IGNyZWF0ZSBmZW5jZTogJWx4LCBmZDogJWQsIHJlZjogJWQsIHVzYWdlOiAlZFxuIiwKKwkJCSh1bG9uZykgJnB0LT5mZW5jZSwgKmZkLCBhdG9taWNfcmVhZCgmcHQtPmZlbmNlLnJlZmNvdW50LnJlZmNvdW50LnJlZnMpLCB1c2FnZSk7CisJcmV0dXJuIDA7CitlcnI6CisJcHV0X3VudXNlZF9mZCgqZmQpOworCWlmIChwdCkKKwkJc3luY19wdF9mcmVlKG9iaiwgcHQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IGRtYV9mZW5jZSAqdmRlY19mZW5jZV9nZXQoaW50IGZkKQoreworCXJldHVybiBzeW5jX2ZpbGVfZ2V0X2ZlbmNlKGZkKTsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19mZW5jZV9nZXQpOworCit2b2lkIHZkZWNfZmVuY2VfcHV0KHN0cnVjdCBkbWFfZmVuY2UgKmZlbmNlKQoreworCWlmICh2ZGVjX2dldF9kZWJ1ZygpICYgVkRFQ19EQkdfRU5BQkxFX0ZFTkNFKQorCQlwcl9pbmZvKCJbVkRFQy1GRU5DRV06IHRoZSBmZW5jZSAoJXB4KSBjb3N0IHRpbWU6ICVsbGQgbnNcbiIsCisJCQlmZW5jZSwgbG9jYWxfY2xvY2soKSAtIGdldF9zeW5jX3B0KGZlbmNlKS0+dGltZXN0YW1wKTsKKwlkbWFfZmVuY2VfcHV0KGZlbmNlKTsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19mZW5jZV9wdXQpOworCitpbnQgdmRlY19mZW5jZV93YWl0KHN0cnVjdCBkbWFfZmVuY2UgKmZlbmNlLCBsb25nIHRpbWVvdXQpCit7CisJaWYgKHZkZWNfZ2V0X2RlYnVnKCkgJiBWREVDX0RCR19FTkFCTEVfRkVOQ0UpCisJCXByX2luZm8oIltWREVDLUZFTkNFXTogd2FpdCBmZW5jZSAlbHguXG4iLCAodWxvbmcpIGZlbmNlKTsKKworCXJldHVybiBkbWFfZmVuY2Vfd2FpdF90aW1lb3V0KGZlbmNlLCBmYWxzZSwgdGltZW91dCk7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfZmVuY2Vfd2FpdCk7CisKK3N0cnVjdCB2ZGVjX3N5bmMgKnZkZWNfc3luY19nZXQodm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgdmRlY19zeW5jX2NvcmVfcyAqY29yZSA9ICZ2ZGVjX3N5bmNfY29yZTsKKwl1bG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb3JlLT52ZGVjX3N5bmNfbG9jaywgZmxhZ3MpOworCisJZm9yIChpID0gMDsgaSA8IFZERUNfU1lOQ19DT1VOVDsgaSsrKSB7CisJCWlmIChhdG9taWNfcmVhZCgmY29yZS0+c192ZGVjX3N5bmNbaV0udXNlX2ZsYWcpID09IDApIHsKKwkJCWludCBqOworCQkJYXRvbWljX3NldCgmY29yZS0+c192ZGVjX3N5bmNbaV0udXNlX2ZsYWcsIDEpOworCQkJZm9yIChqID0gMDsgaiA8IDY0OyBqKyspIHsKKwkJCQljb3JlLT5zX3ZkZWNfc3luY1tpXS5yZWxlYXNlX2NhbGxiYWNrW2pdLmZ1bmMgPSB2ZGVjX2ZlbmNlX2J1ZmZlcl9jb3VudF9kZWNyZWFzZTsKKwkJCQljb3JlLT5zX3ZkZWNfc3luY1tpXS5yZWxlYXNlX2NhbGxiYWNrW2pdLnByaXZhdGVfZGF0YSA9ICh2b2lkICopJmNvcmUtPnNfdmRlY19zeW5jW2ldOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29yZS0+dmRlY19zeW5jX2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybiAmY29yZS0+c192ZGVjX3N5bmNbaV07CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29yZS0+dmRlY19zeW5jX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19zeW5jX2dldCk7CisKK3ZvaWQgdmRlY190aW1lbGluZV9jcmVhdGUoc3RydWN0IHZkZWNfc3luYyAqc3luYywgdTggKm5hbWUpCit7CisJc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iajsKKwlzbnByaW50ZihzeW5jLT5uYW1lLCBzaXplb2Yoc3luYy0+bmFtZSksICIlcyIsIG5hbWUpOworCisJb2JqID0gc3luY190aW1lbGluZV9jcmVhdGUoc3luYy0+bmFtZSk7CisJb2JqLT5wYXJlbnRfc3luYyA9IHN5bmM7CisJc3luYy0+dGltZWxpbmUgPSAodm9pZCAqKW9iajsKKworCWlmIChzeW5jLT50aW1lbGluZSkKKwkJcHJfaW5mbygiW1ZERUMtRkVOQ0VdOiBjcmVhdGUgdGltZWxpbmUgJWx4LCBuYW1lOiAlc1xuIiwKKwkJCSh1bG9uZykgc3luYy0+dGltZWxpbmUsIHN5bmMtPm5hbWUpOworCWVsc2UKKwkJcHJfZXJyKCJbVkRFQy1GRU5DRV06IGNyZWF0ZSB0aW1lbGluZSBmYWlsZC5cbiIpOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3RpbWVsaW5lX2NyZWF0ZSk7CisKK2ludCB2ZGVjX3RpbWVsaW5lX2NyZWF0ZV9mZW5jZShzdHJ1Y3QgdmRlY19zeW5jICpzeW5jKQoreworCXN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmogPSBzeW5jLT50aW1lbGluZTsKKwlzdHJ1Y3Qgc3luY19wdCAqcHQgPSBOVUxMOworCXVsb25nIGZsYWdzOworCXUzMiB2YWx1ZSA9IDA7CisKKwlpZiAob2JqID09IE5VTEwpCisJCXJldHVybiAtRVBFUk07CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb2JqLT5sb2NrLCBmbGFncyk7CisKKwl2YWx1ZSA9IG9iai0+dmFsdWUgKyAxOworCisJaWYgKCFsaXN0X2VtcHR5KCZvYmotPnB0X2xpc3QpKSB7CisJCXB0ID0gbGlzdF9sYXN0X2VudHJ5KCZvYmotPnB0X2xpc3QsIHN0cnVjdCBzeW5jX3B0LCBsaW5rKTsKKwkJaWYgKHZhbHVlIDw9IHB0LT5mZW5jZS5zZXFubykgeworCQkJdmFsdWUgPSBwdC0+ZmVuY2Uuc2Vxbm8gKyAxOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9iai0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHRpbWVsaW5lX2NyZWF0ZV9mZW5jZShzeW5jLAorCQkJCSAgICAgc3luYy0+dXNhZ2UsCisJCQkJICAgICAmc3luYy0+ZmVuY2UsCisJCQkJICAgICAmc3luYy0+ZmQsCisJCQkJICAgICB2YWx1ZSk7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfdGltZWxpbmVfY3JlYXRlX2ZlbmNlKTsKKwordm9pZCB2ZGVjX3RpbWVsaW5lX2luY3JlYXNlKHN0cnVjdCB2ZGVjX3N5bmMgKnN5bmMsIHUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqID0gc3luYy0+dGltZWxpbmU7CisKKwlpZiAob2JqID09IE5VTEwpCisJCXJldHVybjsKKworCW9iai0+dGltZXN0YW1wID0gbG9jYWxfY2xvY2soKTsKKworCWlmICh2ZGVjX2dldF9kZWJ1ZygpICYgVkRFQ19EQkdfRU5BQkxFX0ZFTkNFKQorCQlwcl9pbmZvKCJbVkRFQy1GRU5DRV06IHVwZGF0ZSB0aW1lbGluZSAlZC5cbiIsCisJCQlvYmotPnZhbHVlICsgdmFsdWUpOworCisJc3luY190aW1lbGluZV9zaWduYWwob2JqLCB2YWx1ZSk7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfdGltZWxpbmVfaW5jcmVhc2UpOworCit2b2lkIHZkZWNfdGltZWxpbmVfZ2V0KHN0cnVjdCB2ZGVjX3N5bmMgKnN5bmMpCit7CisJc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaiA9IHN5bmMtPnRpbWVsaW5lOworCisJc3luY190aW1lbGluZV9nZXQob2JqKTsKK30KK0VYUE9SVF9TWU1CT0wodmRlY190aW1lbGluZV9nZXQpOworCisKK3ZvaWQgdmRlY190aW1lbGluZV9wdXQoc3RydWN0IHZkZWNfc3luYyAqc3luYykKK3sKKwlzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqID0gc3luYy0+dGltZWxpbmU7CisKKwlzeW5jX3RpbWVsaW5lX3B1dChvYmopOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3RpbWVsaW5lX3B1dCk7CisKK3ZvaWQgdmRlY19mZW5jZV9zdGF0dXNfc2V0KHN0cnVjdCBkbWFfZmVuY2UgKmZlbmNlLCBpbnQgc3RhdHVzKQoreworCWZlbmNlLT5lcnJvciA9IHN0YXR1czsKK30KK0VYUE9SVF9TWU1CT0wodmRlY19mZW5jZV9zdGF0dXNfc2V0KTsKKworaW50IHZkZWNfZmVuY2Vfc3RhdHVzX2dldChzdHJ1Y3QgZG1hX2ZlbmNlICpmZW5jZSkKK3sKKwlyZXR1cm4gZG1hX2ZlbmNlX2dldF9zdGF0dXMoZmVuY2UpOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX2ZlbmNlX3N0YXR1c19nZXQpOworCitib29sIGNoZWNrX29ianNfYWxsX3NpZ25hbGVkKHN0cnVjdCB2ZGVjX3N5bmMgKnN5bmMpCit7CisJc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaiA9IHN5bmMtPnRpbWVsaW5lOworCWJvb2wgcmV0ID0gZmFsc2U7CisJdWxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb2JqLT5sb2NrLCBmbGFncyk7CisJcmV0ID0gbGlzdF9lbXB0eSgmb2JqLT5hY3RpdmVfbGlzdF9oZWFkKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvYmotPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGNoZWNrX29ianNfYWxsX3NpZ25hbGVkKTsKKworaW50IHZkZWNfY2xlYW5fYWxsX2ZlbmNlKHN0cnVjdCB2ZGVjX3N5bmMgKnN5bmMpCit7CisJLypzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqID0gc3luYy0+dGltZWxpbmU7CisJc3RydWN0IHN5bmNfcHQgKnB0LCAqbmV4dDsKKworCXNwaW5fbG9ja19pcnEoJm9iai0+bG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHQsIG5leHQsICZvYmotPnB0X2xpc3QsIGxpbmspIHsKKwkJZG1hX2ZlbmNlX3NldF9lcnJvcigmcHQtPmZlbmNlLCAtRU5PRU5UKTsKKwkJZG1hX2ZlbmNlX3NpZ25hbF9sb2NrZWQoJnB0LT5mZW5jZSk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxKCZvYmotPmxvY2spOyovCisKKwlzdHJ1Y3Qgc3luY19wdCAqcHQsICpuZXh0OworCXN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmogPSBzeW5jLT50aW1lbGluZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwdCwgbmV4dCwgJm9iai0+cHRfbGlzdCwgbGluaykgeworCQlwcl9lcnIoInZkZWNfY2xlYW5fYWxsX2ZlbmNlICVweFxuIiAsIG9iai0+cGFyZW50X3N5bmMpOworCQkJdmRlY19mZW5jZV9wdXQoJnB0LT5mZW5jZSk7CisJfQorCisJc3luY190aW1lbGluZV9wdXQob2JqKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX2NsZWFuX2FsbF9mZW5jZSk7CisKK3ZvaWQgdmRlY19mZW5jZV9idWZmZXJfY291bnRfaW5jcmVhc2UodWxvbmcgZmVuY2UpCit7CisJc3RydWN0IHZkZWNfc3luYyAqc3luYyA9IChzdHJ1Y3QgdmRlY19zeW5jICopZmVuY2U7CisJc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaiA9IHN5bmMtPnRpbWVsaW5lOworCisJc3Bpbl9sb2NrX2lycSgmb2JqLT5sb2NrKTsKKworCWlmIChhdG9taWNfcmVhZCgmc3luYy0+YnVmZmVyX2NvdW50KSA9PSAwKSB7CisJCQlzeW5jX3RpbWVsaW5lX2dldChvYmopOworCX0KKworCWF0b21pY19pbmMoJnN5bmMtPmJ1ZmZlcl9jb3VudCk7CisKKwlzcGluX3VubG9ja19pcnEoJm9iai0+bG9jayk7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfZmVuY2VfYnVmZmVyX2NvdW50X2luY3JlYXNlKTsKKwordm9pZCB2ZGVjX2ZlbmNlX2J1ZmZlcl9jb3VudF9kZWNyZWFzZShzdHJ1Y3QgY29kZWNfbW1fcyAqbW0sIHN0cnVjdCBjb2RlY19tbV9jYl9zICpjYikKK3sKKwlzdHJ1Y3QgdmRlY19zeW5jICpzeW5jID0gKHN0cnVjdCB2ZGVjX3N5bmMgKiljYi0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzeW5jX3B0ICpwdCwgKm5leHQ7CisJc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaiA9IHN5bmMtPnRpbWVsaW5lOworCisJYXRvbWljX2RlYygmc3luYy0+YnVmZmVyX2NvdW50KTsKKworCWlmIChhdG9taWNfcmVhZCgmc3luYy0+YnVmZmVyX2NvdW50KSA9PSAwKSB7CisJCXN5bmNfdGltZWxpbmVfcHV0KG9iaik7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwdCwgbmV4dCwgJm9iai0+cHRfbGlzdCwgbGluaykgeworCQkJdmRlY19mZW5jZV9wdXQoJnB0LT5mZW5jZSk7CisJCX0KKwkJcmV0dXJuOworCX0KKwlyZXR1cm4gOworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX2ZlbmNlX2J1ZmZlcl9jb3VudF9kZWNyZWFzZSk7CisKK3ZvaWQgdmRlY19zeW5jX2NvcmVfaW5pdCh2b2lkKQoreworCXNwaW5fbG9ja19pbml0KCZ2ZGVjX3N5bmNfY29yZS52ZGVjX3N5bmNfbG9jayk7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfc3luY19jb3JlX2luaXQpOworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjX3N5bmMuaCBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjX3N5bmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjM3YjQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWNfc3luYy5oCkBAIC0wLDAgKzEsMTA3IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorKiBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqCisqIERlc2NyaXB0aW9uOgorKi8KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtZmVuY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zeW5jX2ZpbGUuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L3N5bmNfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29kZWNfbW0uaD4KKworI2RlZmluZSBGRU5DRV9VU0VfRk9SX0RSSVZFUgkoMCkKKyNkZWZpbmUgRkVOQ0VfVVNFX0ZPUl9BUFAJKDEpCisKK3N0cnVjdCBzeW5jX3RpbWVsaW5lIHsKKwlzdHJ1Y3Qga3JlZgkJa3JlZjsKKwljaGFyCQkJbmFtZVszMl07CisKKwkvKiBwcm90ZWN0ZWQgYnkgbG9jayAqLworCXU2NAkJCWNvbnRleHQ7CisJdTMyCQkJdmFsdWU7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkCWFjdGl2ZV9saXN0X2hlYWQ7CisJc3RydWN0IGxpc3RfaGVhZAlwdF9saXN0OworCXNwaW5sb2NrX3QJCWxvY2s7CisKKwl1NjQJCQl0aW1lc3RhbXA7CisJc3RydWN0IHZkZWNfc3luYyAqcGFyZW50X3N5bmM7Cit9OworCitzdHJ1Y3Qgc3luY19wdCB7CisJc3RydWN0IGRtYV9mZW5jZQkJZmVuY2U7CisJc3RydWN0IGxpc3RfaGVhZAlsaW5rOworCXN0cnVjdCBsaXN0X2hlYWQJYWN0aXZlX2xpc3Q7CisJdTY0CQkJdGltZXN0YW1wOworfTsKKworc3RydWN0IHZkZWNfc3luYyB7CisJdTgJCQluYW1lWzMyXTsKKwl2b2lkCQkJKnRpbWVsaW5lOworCWludAkJCXVzYWdlOworCWludAkJCWZkOworCXN0cnVjdCBkbWFfZmVuY2UJCSpmZW5jZTsKKwlhdG9taWNfdCAJCWJ1ZmZlcl9jb3VudDsKKwlhdG9taWNfdCAJCXVzZV9mbGFnOworCXN0cnVjdCBjb2RlY19tbV9jYl9zIHJlbGVhc2VfY2FsbGJhY2tbNjRdOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3luY190aW1lbGluZSAqZmVuY2VfcGFyZW50KHN0cnVjdCBkbWFfZmVuY2UgKmZlbmNlKQoreworCXJldHVybiBjb250YWluZXJfb2YoZmVuY2UtPmxvY2ssIHN0cnVjdCBzeW5jX3RpbWVsaW5lLCBsb2NrKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3luY19wdCAqZ2V0X3N5bmNfcHQoc3RydWN0IGRtYV9mZW5jZSAqZmVuY2UpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihmZW5jZSwgc3RydWN0IHN5bmNfcHQsIGZlbmNlKTsKK30KKworc3RydWN0IGRtYV9mZW5jZSAqdmRlY19mZW5jZV9nZXQoaW50IGZkKTsKKwordm9pZCB2ZGVjX2ZlbmNlX3B1dChzdHJ1Y3QgZG1hX2ZlbmNlICpmZW5jZSk7CisKK2ludCB2ZGVjX2ZlbmNlX3dhaXQoc3RydWN0IGRtYV9mZW5jZSAqZmVuY2UsIGxvbmcgdGltZW91dCk7CisKK3ZvaWQgdmRlY190aW1lbGluZV9jcmVhdGUoc3RydWN0IHZkZWNfc3luYyAqc3luYywgdTggKm5hbWUpOworCitpbnQgdmRlY190aW1lbGluZV9jcmVhdGVfZmVuY2Uoc3RydWN0IHZkZWNfc3luYyAqc3luYyk7CisKK3ZvaWQgdmRlY190aW1lbGluZV9pbmNyZWFzZShzdHJ1Y3QgdmRlY19zeW5jICpzeW5jLCB1MzIgdmFsdWUpOworCit2b2lkIHZkZWNfdGltZWxpbmVfZ2V0KHN0cnVjdCB2ZGVjX3N5bmMgKnN5bmMpOworCit2b2lkIHZkZWNfdGltZWxpbmVfcHV0KHN0cnVjdCB2ZGVjX3N5bmMgKnN5bmMpOworCitpbnQgdmRlY19mZW5jZV9zdGF0dXNfZ2V0KHN0cnVjdCBkbWFfZmVuY2UgKmZlbmNlKTsKKwordm9pZCB2ZGVjX2ZlbmNlX3N0YXR1c19zZXQoc3RydWN0IGRtYV9mZW5jZSAqZmVuY2UsIGludCBzdGF0dXMpOworCitib29sIGNoZWNrX29ianNfYWxsX3NpZ25hbGVkKHN0cnVjdCB2ZGVjX3N5bmMgKnN5bmMpOworCitpbnQgdmRlY19jbGVhbl9hbGxfZmVuY2Uoc3RydWN0IHZkZWNfc3luYyAqc3luYyk7CisKK3ZvaWQgdmRlY19mZW5jZV9idWZmZXJfY291bnRfaW5jcmVhc2UodWxvbmcgZmVuY2UpOworCit2b2lkIHZkZWNfZmVuY2VfYnVmZmVyX2NvdW50X2RlY3JlYXNlKHN0cnVjdCBjb2RlY19tbV9zICptbSwgc3RydWN0IGNvZGVjX21tX2NiX3MgKmNiKTsKKworc3RydWN0IHZkZWNfc3luYyAqdmRlY19zeW5jX2dldCh2b2lkKTsKKwordm9pZCB2ZGVjX3N5bmNfY29yZV9pbml0KHZvaWQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdmRlY190cmFjZS5oIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWNfdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDk1MThlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWNfdHJhY2UuaApAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9hbXBvcnRzL3ZkZWNfdHJhY2UuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyovCisKKyN1bmRlZiBUUkFDRV9TWVNURU0KKyNkZWZpbmUgVFJBQ0VfU1lTVEVNIHZkZWMKKworI2lmICFkZWZpbmVkKF9WREVDX1RSQUNFX0gpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpCisjZGVmaW5lIF9WREVDX1RSQUNFX0gKKworI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KKworc3RydWN0IHZkZWNfczsKKworLyogc2luZ2xlIGxpZmVjeWNsZSBldmVudHMgKi8KK0RFQ0xBUkVfRVZFTlRfQ0xBU1ModmRlY19ldmVudF9jbGFzcywKKwlUUF9QUk9UTyhzdHJ1Y3QgdmRlY19zICp2ZGVjKSwKKwlUUF9BUkdTKHZkZWMpLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoc3RydWN0IHZkZWNfcyAqLCB2ZGVjKQorCSksCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPnZkZWMgPSB2ZGVjOworCSksCisJVFBfcHJpbnRrKCJbJXBdIiwgIF9fZW50cnktPnZkZWMpCispOworCisjZGVmaW5lIERFRklORV9WREVDX0VWRU5UKG5hbWUpIFwKK0RFRklORV9FVkVOVCh2ZGVjX2V2ZW50X2NsYXNzLCBuYW1lLCBcCisJVFBfUFJPVE8oc3RydWN0IHZkZWNfcyAqdmRlYyksIFwKKwlUUF9BUkdTKHZkZWMpKQorCitERUZJTkVfVkRFQ19FVkVOVCh2ZGVjX2NyZWF0ZSk7CitERUZJTkVfVkRFQ19FVkVOVCh2ZGVjX2Nvbm5lY3QpOworREVGSU5FX1ZERUNfRVZFTlQodmRlY19kaXNjb25uZWN0KTsKK0RFRklORV9WREVDX0VWRU5UKHZkZWNfZGVzdHJveSk7CitERUZJTkVfVkRFQ19FVkVOVCh2ZGVjX3Jlc2V0KTsKK0RFRklORV9WREVDX0VWRU5UKHZkZWNfcmVsZWFzZSk7CisKKy8qIHNldCBmb3JtYXQgZXZlbnQgKi8KKyNkZWZpbmUgZm9ybWF0X25hbWUoZm9ybWF0KSBcCisJX19wcmludF9zeW1ib2xpYyhmb3JtYXQsIFwKKwkJezAsICJNUEVHIn0sIFwKKwkJezEsICJNUEVHNCJ9LCBcCisJCXsyLCAiSDI2NCJ9LCBcCisJCXszLCAiTUpQRUcifSwgXAorCQl7NCwgIlJFQUwifSwgXAorCQl7NSwgIkpQRUcifSwgXAorCQl7NiwgIlZDMSJ9LCBcCisJCXs3LCAiQVZTIn0sIFwKKwkJezgsICJZVVYifSwgXAorCQl7OSwgIkgyNjRNVkMifSwgXAorCQl7MTAsICJIMjY0XzRLMksifSwgXAorCQl7MTEsICJIMjY1In0sIFwKKwkJezEyLCAiRU5DX0FWQyJ9LCBcCisJCXsxMywgIkVOQ19KUEVHIn0sIFwKKwkJezE0LCAiVlA5In0pCisKK1RSQUNFX0VWRU5UKHZkZWNfc2V0X2Zvcm1hdCwKKwlUUF9QUk9UTyhzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgZm9ybWF0KSwKKwlUUF9BUkdTKHZkZWMsIGZvcm1hdCksCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZChzdHJ1Y3QgdmRlY19zICosIHZkZWMpCisJCV9fZmllbGQoaW50LCBmb3JtYXQpCisJKSwKKwlUUF9mYXN0X2Fzc2lnbigKKwkJIF9fZW50cnktPnZkZWMgPSB2ZGVjOworCQkgX19lbnRyeS0+Zm9ybWF0ID0gZm9ybWF0OworCSksCisJVFBfcHJpbnRrKCJbJXBdOiVzIiwgX19lbnRyeS0+dmRlYywKKwkJZm9ybWF0X25hbWUoX19lbnRyeS0+Zm9ybWF0KSkKKyk7CisKKy8qIHN0YXR1cyBldmVudHMgKi8KKyNkZWZpbmUgc3RhdHVzX25hbWUoc3RhdHVzKSBcCisJX19wcmludF9zeW1ib2xpYyhzdGF0dXMsIFwKKwkJezAsICJVTklOSVRJQUxJWkVEIn0sIFwKKwkJezEsICJESVNDT05ORUNURUQifSwgXAorCQl7MiwgIkNPTk5FQ1RFRCJ9LCBcCisJCXszLCAiQUNUSVZFIn0pCisKK0RFQ0xBUkVfRVZFTlRfQ0xBU1ModmRlY19zdGF0dXNfY2xhc3MsCisJVFBfUFJPVE8oc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IHN0YXRlKSwKKwlUUF9BUkdTKHZkZWMsIHN0YXRlKSwKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKHN0cnVjdCB2ZGVjX3MgKiwgdmRlYykKKwkJX19maWVsZChpbnQsIHN0YXRlKQorCSksCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPnZkZWMgPSB2ZGVjOworCQlfX2VudHJ5LT5zdGF0ZSA9IHN0YXRlOworCSksCisJVFBfcHJpbnRrKCJbJXBdOiVzIiwgX19lbnRyeS0+dmRlYywgc3RhdHVzX25hbWUoX19lbnRyeS0+c3RhdGUpKQorKTsKKworI2RlZmluZSBERUZJTkVfU1RBVFVTX0VWRU5UKG5hbWUpIFwKK0RFRklORV9FVkVOVCh2ZGVjX3N0YXR1c19jbGFzcywgbmFtZSwgXAorCVRQX1BST1RPKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBzdGF0dXMpLCBcCisJVFBfQVJHUyh2ZGVjLCBzdGF0dXMpKQorCitERUZJTkVfU1RBVFVTX0VWRU5UKHZkZWNfc2V0X3N0YXR1cyk7CitERUZJTkVfU1RBVFVTX0VWRU5UKHZkZWNfc2V0X25leHRfc3RhdHVzKTsKKworLyogc2V0IHB0cyBldmVudHMgKi8KK0RFQ0xBUkVfRVZFTlRfQ0xBU1ModmRlY19wdHNfY2xhc3MsCisJVFBfUFJPVE8oc3RydWN0IHZkZWNfcyAqdmRlYywgdTY0IHB0cyksCisJVFBfQVJHUyh2ZGVjLCBwdHMpLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoc3RydWN0IHZkZWNfcyAqLCB2ZGVjKQorCQlfX2ZpZWxkKHU2NCwgcHRzKQorCSksCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPnZkZWMgPSB2ZGVjOworCQlfX2VudHJ5LT5wdHMgPSBwdHM7CisJKSwKKwlUUF9wcmludGsoIlslcF0lbGx1IiwgX19lbnRyeS0+dmRlYywgX19lbnRyeS0+cHRzKQorKTsKKworI2RlZmluZSBERUZJTkVfUFRTX0VWRU5UKG5hbWUpIFwKK0RFRklORV9FVkVOVCh2ZGVjX3B0c19jbGFzcywgbmFtZSwgXAorCVRQX1BST1RPKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHU2NCBwdHMpLCBcCisJVFBfQVJHUyh2ZGVjLCBwdHMpKQorCitERUZJTkVfUFRTX0VWRU5UKHZkZWNfc2V0X3B0cyk7CitERUZJTkVfUFRTX0VWRU5UKHZkZWNfc2V0X3B0czY0KTsKKworI2VuZGlmIC8qIF9WREVDX1RSQUNFX0ggKi8KKworLyoKKyN1bmRlZiBUUkFDRV9JTkNMVURFX1BBVEgKKyN1bmRlZiBUUkFDRV9JTkNMVURFX0ZJTEUKKyNkZWZpbmUgVFJBQ0VfSU5DTFVERV9QQVRIIC4KKyNkZWZpbmUgVFJBQ0VfSU5DTFVERV9GSUxFIHZkZWNfdHJhY2UKKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KKyovCisvKiovIC8vREVCVUdfVE1QCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdmRlY192NGwyX2J1ZmZlcl9vcHMuYyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjX3Y0bDJfYnVmZmVyX29wcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YmMyMWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdmRlY192NGwyX2J1ZmZlcl9vcHMuYwpAQCAtMCwwICsxLDE3NSBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE3IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyogbW9yZSBkZXRhaWxzLgorKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKgorKiBEZXNjcmlwdGlvbjoKKyovCisjaW5jbHVkZSAidmRlY192NGwyX2J1ZmZlcl9vcHMuaCIKKyNpbmNsdWRlIDxtZWRpYS92NGwyLW1lbTJtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KKworaW50IHZkZWNfdjRsX2dldF9waWNfaW5mbyhzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCwKKwlzdHJ1Y3QgdmRlY19waWNfaW5mbyAqcGljKQoreworCWludCByZXQgPSAwOworCisJaWYgKGN0eC0+ZHJ2X2hhbmRsZSA9PSAwKQorCQlyZXR1cm4gLUVJTzsKKworCXJldCA9IGN0eC0+ZGVjX2lmLT5nZXRfcGFyYW0oY3R4LT5kcnZfaGFuZGxlLAorCQlHRVRfUEFSQU1fUElDX0lORk8sIHBpYyk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3Y0bF9nZXRfcGljX2luZm8pOworCitpbnQgdmRlY192NGxfc2V0X2NmZ19pbmZvcyhzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCwKKwlzdHJ1Y3QgYW1sX3ZkZWNfY2ZnX2luZm9zICpjZmcpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoY3R4LT5kcnZfaGFuZGxlID09IDApCisJCXJldHVybiAtRUlPOworCisJcmV0ID0gY3R4LT5kZWNfaWYtPnNldF9wYXJhbShjdHgtPmRydl9oYW5kbGUsCisJCVNFVF9QQVJBTV9DRkdfSU5GTywgY2ZnKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfdjRsX3NldF9jZmdfaW5mb3MpOworCitpbnQgdmRlY192NGxfc2V0X3BzX2luZm9zKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4LAorCXN0cnVjdCBhbWxfdmRlY19wc19pbmZvcyAqcHMpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoY3R4LT5kcnZfaGFuZGxlID09IDApCisJCXJldHVybiAtRUlPOworCisJcmV0ID0gY3R4LT5kZWNfaWYtPnNldF9wYXJhbShjdHgtPmRydl9oYW5kbGUsCisJCVNFVF9QQVJBTV9QU19JTkZPLCBwcyk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3Y0bF9zZXRfcHNfaW5mb3MpOworCitpbnQgdmRlY192NGxfc2V0X2NvbXBfYnVmX2luZm8oc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsCisJCXN0cnVjdCB2ZGVjX2NvbXBfYnVmX2luZm8gKmluZm8pCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoY3R4LT5kcnZfaGFuZGxlID09IDApCisJCXJldHVybiAtRUlPOworCisJcmV0ID0gY3R4LT5kZWNfaWYtPnNldF9wYXJhbShjdHgtPmRydl9oYW5kbGUsCisJCVNFVF9QQVJBTV9DT01QX0JVRl9JTkZPLCBpbmZvKTsKKworCXJldHVybiByZXQ7CisKK30KK0VYUE9SVF9TWU1CT0wodmRlY192NGxfc2V0X2NvbXBfYnVmX2luZm8pOworCitpbnQgdmRlY192NGxfc2V0X2hkcl9pbmZvcyhzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCwKKwlzdHJ1Y3QgYW1sX3ZkZWNfaGRyX2luZm9zICpoZHIpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoY3R4LT5kcnZfaGFuZGxlID09IDApCisJCXJldHVybiAtRUlPOworCisJcmV0ID0gY3R4LT5kZWNfaWYtPnNldF9wYXJhbShjdHgtPmRydl9oYW5kbGUsCisJCVNFVF9QQVJBTV9IRFJfSU5GTywgaGRyKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfdjRsX3NldF9oZHJfaW5mb3MpOworCit2b2lkIGFtbF92ZGVjX3BpY19pbmZvX3VwZGF0ZShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCkKK3sKKwlpZiAoY3R4ICE9IE5VTEwpCisJCWN0eC0+dmRlY19waWNfaW5mb191cGRhdGUoY3R4KTsKK30KKworaW50IHZkZWNfdjRsX3Bvc3RfZXZldChzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCwgdTMyIGV2ZW50KQoreworCWludCByZXQgPSAwOworCisJaWYgKGN0eC0+ZHJ2X2hhbmRsZSA9PSAwKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAoZXZlbnQgPT0gMSkKKwkJY3R4LT5yZXNldF9mbGFnID0gMjsKKwlyZXQgPSBjdHgtPmRlY19pZi0+c2V0X3BhcmFtKGN0eC0+ZHJ2X2hhbmRsZSwKKwkJU0VUX1BBUkFNX1BPU1RfRVZFTlQsICZldmVudCk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh2ZGVjX3Y0bF9wb3N0X2V2ZXQpOworCitpbnQgdmRlY192NGxfcmVzX2NoX2V2ZW50KHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhbWxfdmNvZGVjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisKKwlpZiAoY3R4LT5kcnZfaGFuZGxlID09IDApCisJCXJldHVybiAtRUlPOworCisJYW1sX3ZkZWNfcGljX2luZm9fdXBkYXRlKGN0eCk7CisKKwltdXRleF9sb2NrKCZjdHgtPnN0YXRlX2xvY2spOworCisJY3R4LT5zdGF0ZSA9IEFNTF9TVEFURV9GTFVTSElORzsvKnByZXBhcmUgZmx1c2hpbmcqLworCisJcHJfaW5mbygiWyVkXTogdmNvZGVjIHN0YXRlIChBTUxfU1RBVEVfRkxVU0hJTkctUkVTQ0hHKVxuIiwgY3R4LT5pZCk7CisKKwltdXRleF91bmxvY2soJmN0eC0+c3RhdGVfbG9jayk7CisKKwl3aGlsZSAoY3R4LT5tMm1fY3R4LT5qb2JfZmxhZ3MgJiBUUkFOU19SVU5OSU5HKSB7CisJCXY0bDJfbTJtX2pvYl9wYXVzZShkZXYtPm0ybV9kZXZfZGVjLCBjdHgtPm0ybV9jdHgpOworCX0KKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfdjRsX3Jlc19jaF9ldmVudCk7CisKKworaW50IHZkZWNfdjRsX3dyaXRlX2ZyYW1lX3N5bmMoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoY3R4LT5kcnZfaGFuZGxlID09IDApCisJCXJldHVybiAtRUlPOworCisJcmV0ID0gY3R4LT5kZWNfaWYtPnNldF9wYXJhbShjdHgtPmRydl9oYW5kbGUsCisJCVNFVF9QQVJBTV9XUklURV9GUkFNRV9TWU5DLCBOVUxMKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHZkZWNfdjRsX3dyaXRlX2ZyYW1lX3N5bmMpOworCitpbnQgdmRlY192NGxfZ2V0X2R3X21vZGUoc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsCisJdW5zaWduZWQgaW50ICpkd19tb2RlKQoreworCWludCByZXQgPSAtMTsKKworCWlmIChjdHgtPmRydl9oYW5kbGUgPT0gMCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXQgPSBjdHgtPmRlY19pZi0+Z2V0X3BhcmFtKGN0eC0+ZHJ2X2hhbmRsZSwKKwkJR0VUX1BBUkFNX0RXX01PREUsIGR3X21vZGUpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wodmRlY192NGxfZ2V0X2R3X21vZGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWNfdjRsMl9idWZmZXJfb3BzLmggYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdmRlY192NGwyX2J1ZmZlcl9vcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODUxM2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWNfdjRsMl9idWZmZXJfb3BzLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE3IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyogbW9yZSBkZXRhaWxzLgorKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKgorKiBEZXNjcmlwdGlvbjoKKyovCisjaWZuZGVmIF9BTUxfVkRFQ19WNEwyX0JVRkZFUl9IXworI2RlZmluZSBfQU1MX1ZERUNfVjRMMl9CVUZGRVJfSF8KKworI2luY2x1ZGUgIi4uLy4uLy4uL2FtdmRlY19wb3J0cy92ZGVjX2Rydl9iYXNlLmgiCisjaW5jbHVkZSAiLi4vLi4vLi4vYW12ZGVjX3BvcnRzL2FtbF92Y29kZWNfYWRhcHQuaCIKKworaW50IHZkZWNfdjRsX2dldF9waWNfaW5mbygKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCwKKwlzdHJ1Y3QgdmRlY19waWNfaW5mbyAqcGljKTsKKworaW50IHZkZWNfdjRsX3NldF9jZmdfaW5mb3MoCisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsCisJc3RydWN0IGFtbF92ZGVjX2NmZ19pbmZvcyAqY2ZnKTsKKworaW50IHZkZWNfdjRsX3NldF9wc19pbmZvcygKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCwKKwlzdHJ1Y3QgYW1sX3ZkZWNfcHNfaW5mb3MgKnBzKTsKKworaW50IHZkZWNfdjRsX3NldF9jb21wX2J1Zl9pbmZvKAorCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4LAorCXN0cnVjdCB2ZGVjX2NvbXBfYnVmX2luZm8gKmluZm8pOworCitpbnQgdmRlY192NGxfc2V0X2hkcl9pbmZvcygKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCwKKwlzdHJ1Y3QgYW1sX3ZkZWNfaGRyX2luZm9zICpoZHIpOworCitpbnQgdmRlY192NGxfd3JpdGVfZnJhbWVfc3luYygKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCk7CisKK2ludCB2ZGVjX3Y0bF9wb3N0X2V2ZXQoCisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHgsCisJdTMyIGV2ZW50KTsKKworaW50IHZkZWNfdjRsX3Jlc19jaF9ldmVudCgKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCk7CisKK2ludCB2ZGVjX3Y0bF9nZXRfZHdfbW9kZSgKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCwKKwl1bnNpZ25lZCBpbnQgKmR3X21vZGUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci92YXYxL01ha2VmaWxlIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3ZhdjEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRhNDk3MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci92YXYxL01ha2VmaWxlCkBAIC0wLDAgKzEsMiBAQAorb2JqLSQoQ09ORklHX0FNTE9HSUNfTUVESUFfVkRFQ19BVjEpICs9IGFtdmRlY19hdjEubworYW12ZGVjX2F2MS1vYmpzICs9IHZhdjEubyBhdjFfYnVmbWdyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci92YXYxL2FvbV9hdjFfZGVmaW5lLmggYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdmF2MS9hb21fYXYxX2RlZmluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZTYzZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdmF2MS9hb21fYXYxX2RlZmluZS5oCkBAIC0wLDAgKzEsMTkwIEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorKiBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqCisqIERlc2NyaXB0aW9uOgorKi8KK2VudW0gTmFsVW5pdFR5cGUKK3sKKyAgTkFMX1VOSVRfQ09ERURfU0xJQ0VfVFJBSUxfTiA9IDAsICAgLy8gMAorICBOQUxfVU5JVF9DT0RFRF9TTElDRV9UUkFJTF9SLCAgIC8vIDEKKworICBOQUxfVU5JVF9DT0RFRF9TTElDRV9UU0FfTiwgICAgIC8vIDIKKyAgTkFMX1VOSVRfQ09ERURfU0xJQ0VfVExBLCAgICAgICAvLyAzICAgLy8gQ3VycmVudCBuYW1lIGluIHRoZSBzcGVjOiBUU0FfUgorCisgIE5BTF9VTklUX0NPREVEX1NMSUNFX1NUU0FfTiwgICAgLy8gNAorICBOQUxfVU5JVF9DT0RFRF9TTElDRV9TVFNBX1IsICAgIC8vIDUKKworICBOQUxfVU5JVF9DT0RFRF9TTElDRV9SQURMX04sICAgIC8vIDYKKyAgTkFMX1VOSVRfQ09ERURfU0xJQ0VfRExQLCAgICAgICAvLyA3IC8vIEN1cnJlbnQgbmFtZSBpbiB0aGUgc3BlYzogUkFETF9SCisKKyAgTkFMX1VOSVRfQ09ERURfU0xJQ0VfUkFTTF9OLCAgICAvLyA4CisgIE5BTF9VTklUX0NPREVEX1NMSUNFX1RGRCwgICAgICAgLy8gOSAvLyBDdXJyZW50IG5hbWUgaW4gdGhlIHNwZWM6IFJBU0xfUgorCisgIE5BTF9VTklUX1JFU0VSVkVEXzEwLAorICBOQUxfVU5JVF9SRVNFUlZFRF8xMSwKKyAgTkFMX1VOSVRfUkVTRVJWRURfMTIsCisgIE5BTF9VTklUX1JFU0VSVkVEXzEzLAorICBOQUxfVU5JVF9SRVNFUlZFRF8xNCwKKyAgTkFMX1VOSVRfUkVTRVJWRURfMTUsCisKKyAgTkFMX1VOSVRfQ09ERURfU0xJQ0VfQkxBLCAgICAgICAvLyAxNiAgIC8vIEN1cnJlbnQgbmFtZSBpbiB0aGUgc3BlYzogQkxBX1dfTFAKKyAgTkFMX1VOSVRfQ09ERURfU0xJQ0VfQkxBTlQsICAgICAvLyAxNyAgIC8vIEN1cnJlbnQgbmFtZSBpbiB0aGUgc3BlYzogQkxBX1dfRExQCisgIE5BTF9VTklUX0NPREVEX1NMSUNFX0JMQV9OX0xQLCAgLy8gMTgKKyAgTkFMX1VOSVRfQ09ERURfU0xJQ0VfSURSLCAgICAgICAvLyAxOSAgLy8gQ3VycmVudCBuYW1lIGluIHRoZSBzcGVjOiBJRFJfV19ETFAKKyAgTkFMX1VOSVRfQ09ERURfU0xJQ0VfSURSX05fTFAsICAvLyAyMAorICBOQUxfVU5JVF9DT0RFRF9TTElDRV9DUkEsICAgICAgIC8vIDIxCisgIE5BTF9VTklUX1JFU0VSVkVEXzIyLAorICBOQUxfVU5JVF9SRVNFUlZFRF8yMywKKworICBOQUxfVU5JVF9SRVNFUlZFRF8yNCwKKyAgTkFMX1VOSVRfUkVTRVJWRURfMjUsCisgIE5BTF9VTklUX1JFU0VSVkVEXzI2LAorICBOQUxfVU5JVF9SRVNFUlZFRF8yNywKKyAgTkFMX1VOSVRfUkVTRVJWRURfMjgsCisgIE5BTF9VTklUX1JFU0VSVkVEXzI5LAorICBOQUxfVU5JVF9SRVNFUlZFRF8zMCwKKyAgTkFMX1VOSVRfUkVTRVJWRURfMzEsCisKKyAgTkFMX1VOSVRfVlBTLCAgICAgICAgICAgICAgICAgICAvLyAzMgorICBOQUxfVU5JVF9TUFMsICAgICAgICAgICAgICAgICAgIC8vIDMzCisgIE5BTF9VTklUX1BQUywgICAgICAgICAgICAgICAgICAgLy8gMzQKKyAgTkFMX1VOSVRfQUNDRVNTX1VOSVRfREVMSU1JVEVSLCAvLyAzNQorICBOQUxfVU5JVF9FT1MsICAgICAgICAgICAgICAgICAgIC8vIDM2CisgIE5BTF9VTklUX0VPQiwgICAgICAgICAgICAgICAgICAgLy8gMzcKKyAgTkFMX1VOSVRfRklMTEVSX0RBVEEsICAgICAgICAgICAvLyAzOAorICBOQUxfVU5JVF9TRUksICAgICAgICAgICAgICAgICAgIC8vIDM5IFByZWZpeCBTRUkKKyAgTkFMX1VOSVRfU0VJX1NVRkZJWCwgICAgICAgICAgICAvLyA0MCBTdWZmaXggU0VJCisgIE5BTF9VTklUX1JFU0VSVkVEXzQxLAorICBOQUxfVU5JVF9SRVNFUlZFRF80MiwKKyAgTkFMX1VOSVRfUkVTRVJWRURfNDMsCisgIE5BTF9VTklUX1JFU0VSVkVEXzQ0LAorICBOQUxfVU5JVF9SRVNFUlZFRF80NSwKKyAgTkFMX1VOSVRfUkVTRVJWRURfNDYsCisgIE5BTF9VTklUX1JFU0VSVkVEXzQ3LAorICBOQUxfVU5JVF9VTlNQRUNJRklFRF80OCwKKyAgTkFMX1VOSVRfVU5TUEVDSUZJRURfNDksCisgIE5BTF9VTklUX1VOU1BFQ0lGSUVEXzUwLAorICBOQUxfVU5JVF9VTlNQRUNJRklFRF81MSwKKyAgTkFMX1VOSVRfVU5TUEVDSUZJRURfNTIsCisgIE5BTF9VTklUX1VOU1BFQ0lGSUVEXzUzLAorICBOQUxfVU5JVF9VTlNQRUNJRklFRF81NCwKKyAgTkFMX1VOSVRfVU5TUEVDSUZJRURfNTUsCisgIE5BTF9VTklUX1VOU1BFQ0lGSUVEXzU2LAorICBOQUxfVU5JVF9VTlNQRUNJRklFRF81NywKKyAgTkFMX1VOSVRfVU5TUEVDSUZJRURfNTgsCisgIE5BTF9VTklUX1VOU1BFQ0lGSUVEXzU5LAorICBOQUxfVU5JVF9VTlNQRUNJRklFRF82MCwKKyAgTkFMX1VOSVRfVU5TUEVDSUZJRURfNjEsCisgIE5BTF9VTklUX1VOU1BFQ0lGSUVEXzYyLAorICBOQUxfVU5JVF9VTlNQRUNJRklFRF82MywKKyAgTkFMX1VOSVRfSU5WQUxJRCwKK307CisKK2ludCBmb3JiaWRkZW5femVyb19iaXQ7CitpbnQgbV9uYWxVbml0VHlwZTsKK2ludCBtX3Jlc2VydmVkWmVybzZCaXRzOworaW50IG1fdGVtcG9yYWxJZDsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFtcmlzYyBTb2Z0d2FyZSBJbnRlcnJ1cHQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFNUklTQ19TVFJFQU1fRU1QVFlfUkVRIDB4MDEKKyNkZWZpbmUgQU1SSVNDX1BBUlNFUl9SRVEgICAgICAgMHgwMgorI2RlZmluZSBBTVJJU0NfTUFJTl9SRVEgICAgICAgICAweDA0CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBT01fQVYxX0RFQ19TVEFUVVMgKEhFVkNfREVDX1NUQVRVUykgZGVmaW5lCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvKmNvbW1hbmQqLworI2RlZmluZSBBT01fQVYxX0RFQ19JRExFICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBT01fQVYxX0RFQ19GUkFNRV9IRUFERVIgICAgICAgICAgICAgMQorI2RlZmluZSBBT01fQVYxX0RFQ19USUxFX0VORCAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBBT01fQVYxX0RFQ19UR19FTkQgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBBT01fQVYxX0RFQ19MQ1VfRU5EICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBBT01fQVYxX0RFQ09ERV9TTElDRSAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBBT01fQVYxX1NFQVJDSF9IRUFEICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBBT01fQVYxX0RVTVBfTE1FTSAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBBT01fQVYxX0ZHU19QQVJBTV9DT05UICAgICAgICAgICAgICAgOAorI2RlZmluZSBBT01fQVYxX0ZHU19QQVJBTV9DT05UICAgICAgICAgICAgICAgOAorI2RlZmluZSBBT01fQVYxX1BJQ19FTkRfQ09OVCAgICAgICAgICAgICAgICAgOQorICAvKnN0YXR1cyovCisjZGVmaW5lIEFPTV9BVjFfREVDX1BJQ19FTkQgICAgICAgICAgICAgICAgICAweGUwCisgIC8qQU9NX0FWMV9GR1NfUEFSQToKKyAgICBCaXRbMTFdIC0gMCBSZWFkLCAxIC0gV3JpdGUKKyAgQml0WzEwOjhdIC0gZmlsbV9ncmFpbl9wYXJhbXNfcmVmX2lkeCwgRm9yIFdyaXRlIHJlcXVlc3QKKyAgKi8KKyNkZWZpbmUgQU9NX0FWMV9GR1NfUEFSQU0gICAgICAgICAgICAgICAgICAgIDB4ZTEKKyNkZWZpbmUgQU9NX0FWMV9ERUNfUElDX0VORF9QUkUgICAgICAgICAgICAgIDB4ZTIKKyNkZWZpbmUgQU9NX0FWMV9IRUFEX1BBUlNFUl9ET05FICAgICAgICAgIDB4ZjAKKyNkZWZpbmUgQU9NX0FWMV9IRUFEX1NFQVJDSF9ET05FICAgICAgICAgIDB4ZjEKKyNkZWZpbmUgQU9NX0FWMV9TRVFfSEVBRF9QQVJTRVJfRE9ORSAgICAgIDB4ZjIKKyNkZWZpbmUgQU9NX0FWMV9GUkFNRV9IRUFEX1BBUlNFUl9ET05FICAgIDB4ZjMKKyNkZWZpbmUgQU9NX0FWMV9GUkFNRV9QQVJTRVJfRE9ORSAgIDB4ZjQKKyNkZWZpbmUgQU9NX0FWMV9SRURVTkRBTlRfRlJBTUVfSEVBRF9QQVJTRVJfRE9ORSAgIDB4ZjUKKyNkZWZpbmUgSEVWQ19BQ1RJT05fRE9ORSAgICAgICAgICAgIDB4ZmYKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5jbHVkZSAicGFyc2VyX2NtZC5oIgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgUEFSU0VSX0NNRF9TS0lQX0NGR18wIDB4MDAwMDA5MGIKKworI2RlZmluZSBQQVJTRVJfQ01EX1NLSVBfQ0ZHXzEgMHgxYjE0MTQwZgorCisjZGVmaW5lIFBBUlNFUl9DTURfU0tJUF9DRkdfMiAweDAwMWIxOTEwCisKKyNkZWZpbmUgUEFSU0VSX0NNRF9OVU1CRVIgMzcKKwordW5zaWduZWQgc2hvcnQgcGFyc2VyX2NtZFtQQVJTRVJfQ01EX05VTUJFUl0gPSB7CisweDA0MDEsCisweDg0MDEsCisweDA4MDAsCisweDA0MDIsCisweDkwMDIsCisweDE0MjMsCisweDhDQzMsCisweDE0MjMsCisweDg4MDQsCisweDk4MjUsCisweDA4MDAsCisweDA0RkUsCisweDg0MDYsCisweDg0MTEsCisweDE4MDAsCisweDg0MDgsCisweDg0MDksCisweDhDMkEsCisweDlDMkIsCisweDFDMDAsCisweDg0MEYsCisweDg0MDcsCisweDgwMDAsCisweDg0MDgsCisweDIwMDAsCisweEE4MDAsCisweDg0MTAsCisweDA0REUsCisweDg0MEMsCisweDg0MEQsCisweEFDMDAsCisweEEwMDAsCisweDA4QzAsCisweDA4RTAsCisweEE0MEUsCisweEZDMDAsCisweDdDMDAKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdmF2MS9hdjFfYnVmbWdyLmMgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdmF2MS9hdjFfYnVmbWdyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU0NTMyMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci92YXYxL2F2MV9idWZtZ3IuYwpAQCAtMCwwICsxLDM0MTYgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNyBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisqIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyoKKyogRGVzY3JpcHRpb246CisqLworI2lmbmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9NVUxUSV9ERUMKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY2FudmFzL2NhbnZhcy5oPgorCisjdW5kZWYgcHJfaW5mbworI2RlZmluZSBwcl9pbmZvIHByaW50aworCisjZGVmaW5lIF9fQ09NUEFSRShjb250ZXh0LCBwMSwgcDIpIGNvbXAocDEsIHAyKQorI2RlZmluZSBfX1NIT1JUU09SVChsbywgaGksIHdpZHRoLCBjb21wLCBjb250ZXh0KSBcCisgIHNob3J0c29ydChsbywgaGksIHdpZHRoLCBjb21wKQorI2RlZmluZSBDVVRPRkYgOCAgICAgICAgICAgIC8qIHRlc3Rpbmcgc2hvd3MgdGhhdCB0aGlzIGlzIGdvb2QgdmFsdWUgKi8KKyNkZWZpbmUgU1RLU0laICg4KnNpemVvZih2b2lkICopIC0gMikKKworI3VuZGVmIHN3YXAKK3N0YXRpYyB2b2lkIHN3YXAoY2hhciAqYSwgY2hhciAqYiwgc2l6ZV90IHdpZHRoKQoreworCWNoYXIgdG1wOworCisJaWYgKGEgIT0gYikKKwkvKiBEbyB0aGUgc3dhcCBvbmUgY2hhcmFjdGVyIGF0IGEgdGltZSB0byBhdm9pZCBwb3RlbnRpYWwKKwkqICAgYWxpZ25tZW50IHByb2JsZW1zLgorCSovCisJd2hpbGUgKHdpZHRoLS0pIHsKKwkJdG1wID0gKmE7CisJCSphKysgPSAqYjsKKwkJKmIrKyA9IHRtcDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNob3J0c29ydChjaGFyICpsbywgY2hhciAqaGksIHNpemVfdCB3aWR0aCwKKyAgaW50ICgqY29tcCkoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKQoreworCWNoYXIgKnAsICptYXg7CisKKwkvKiBOb3RlOiBpbiBhc3NlcnRpb25zIGJlbG93LCBpIGFuZCBqIGFyZSBhbHdheSBpbnNpZGUgb3JpZ2luYWwKKwkqICAgYm91bmQgb2YgYXJyYXkgdG8gc29ydC4KKwkqLworCXdoaWxlIChoaSA+IGxvKSB7CisJCS8qIEFbaV0gPD0gQVtqXSBmb3IgaSA8PSBqLCBqID4gaGkgKi8KKwkJbWF4ID0gbG87CisJCWZvciAocCA9IGxvICsgd2lkdGg7IHAgPD0gaGk7IHAgKz0gd2lkdGgpIHsKKwkJCS8qIEFbaV0gPD0gQVttYXhdIGZvciBsbyA8PSBpIDwgcCAqLworCQkJaWYgKF9fQ09NUEFSRShjb250ZXh0LCBwLCBtYXgpID4gMCkKKwkJCQltYXggPSBwOworCQkJCS8qIEFbaV0gPD0gQVttYXhdIGZvciBsbyA8PSBpIDw9IHAgKi8KKwkJfQorCQkvKiBBW2ldIDw9IEFbbWF4XSBmb3IgbG8gPD0gaSA8PSBoaSAqLworCQlzd2FwKG1heCwgaGksIHdpZHRoKTsKKworCQkvKiBBW2ldIDw9IEFbaGldIGZvciBpIDw9IGhpLCBzbyBBW2ldIDw9IEFbal0gZm9yIGkgPD0gaiwKKwkJKiAgIGogPj0gaGkKKwkJKi8KKwkJaGkgLT0gd2lkdGg7CisKKwkJLyogQVtpXSA8PSBBW2pdIGZvciBpIDw9IGosIGogPiBoaSwgbG9vcCB0b3AgY29uZGl0aW9uCisJCSogICBlc3RhYmxpc2hlZAorCQkqLworCX0KK30KKworc3RhdGljIHZvaWQgcXNvcnQodm9pZCAqYmFzZSwgc2l6ZV90IG51bSwgc2l6ZV90IHdpZHRoLAorICBpbnQgKCpjb21wKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpCit7CisgIGNoYXIgKmxvLCAqaGk7ICAgICAgICAgICAgICAvKiBlbmRzIG9mIHN1Yi1hcnJheSBjdXJyZW50bHkgc29ydGluZyAqLworICBjaGFyICptaWQ7ICAgICAgICAgICAgICAgICAgLyogcG9pbnRzIHRvIG1pZGRsZSBvZiBzdWJhcnJheSAqLworICBjaGFyICpsb2d1eSwgKmhpZ3V5OyAgICAgICAgLyogdHJhdmVsaW5nIHBvaW50ZXJzIGZvciBwYXJ0aXRpb24gc3RlcCAqLworICBzaXplX3Qgc2l6ZTsgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiB0aGUgc3ViLWFycmF5ICovCisgIGNoYXIgKmxvc3RrW1NUS1NJWl0sICpoaXN0a1tTVEtTSVpdOworICBpbnQgc3RrcHRyOworCisvKiAgc3RhY2sgZm9yIHNhdmluZyBzdWItYXJyYXkgdG8gYmUKKyAqICAgICAgICAgIHByb2Nlc3NlZAorICovCisjaWYgMAorICAvKiB2YWxpZGF0aW9uIHNlY3Rpb24gKi8KKyAgX1ZBTElEQVRFX1JFVFVSTl9WT0lEKGJhc2UgIT0gTlVMTCB8fCBudW0gPT0gMCwgRUlOVkFMKTsKKyAgX1ZBTElEQVRFX1JFVFVSTl9WT0lEKHdpZHRoID4gMCwgRUlOVkFMKTsKKyAgX1ZBTElEQVRFX1JFVFVSTl9WT0lEKGNvbXAgIT0gTlVMTCwgRUlOVkFMKTsKKyNlbmRpZgorICBpZiAobnVtIDwgMikKKyAgICByZXR1cm47ICAgICAgICAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvICovCisKKyAgc3RrcHRyID0gMDsgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgc3RhY2sgKi8KKyAgbG8gPSAoY2hhciAqKWJhc2U7CisgIGhpID0gKGNoYXIgKiliYXNlICsgd2lkdGggKiAobnVtIC0gMSk7ICAgICAgLyogaW5pdGlhbGl6ZSBsaW1pdHMgKi8KKworICAvKiB0aGlzIGVudHJ5IHBvaW50IGlzIGZvciBwc2V1ZG8tcmVjdXJzaW9uIGNhbGxpbmc6IHNldHRpbmcKKyAgICogbG8gYW5kIGhpIGFuZCBqdW1waW5nIHRvIGhlcmUgaXMgbGlrZSByZWN1cnNpb24sIGJ1dCBzdGtwdHIgaXMKKyAgICogcHJlc2VydmVkLCBsb2NhbHMgYXJlbid0LCBzbyB3ZSBwcmVzZXJ2ZSBzdHVmZiBvbiB0aGUgc3RhY2sKKyAgICovCityZWN1cnNlOgorCisgIHNpemUgPSAoaGkgLSBsbykgLyB3aWR0aCArIDE7ICAgICAgICAvKiBudW1iZXIgb2YgZWwncyB0byBzb3J0ICovCisKKyAgLyogYmVsb3cgYSBjZXJ0YWluIHNpemUsIGl0IGlzIGZhc3RlciB0byB1c2UgYSBPKG5eMikgc29ydGluZyBtZXRob2QgKi8KKyAgaWYgKHNpemUgPD0gQ1VUT0ZGKSB7CisgICAgX19TSE9SVFNPUlQobG8sIGhpLCB3aWR0aCwgY29tcCwgY29udGV4dCk7CisgIH0gZWxzZSB7CisgICAgLyogRmlyc3Qgd2UgcGljayBhIHBhcnRpdGlvbmluZyBlbGVtZW50LiAgVGhlIGVmZmljaWVuY3kgb2YKKyAgICAgKiB0aGUgYWxnb3JpdGhtIGRlbWFuZHMgdGhhdCB3ZSBmaW5kIG9uZSB0aGF0IGlzIGFwcHJveGltYXRlbHkKKyAgICAgKiB0aGUgbWVkaWFuIG9mIHRoZSB2YWx1ZXMsIGJ1dCBhbHNvIHRoYXQgd2Ugc2VsZWN0IG9uZSBmYXN0LgorICAgICAqIFdlIGNob29zZSB0aGUgbWVkaWFuIG9mIHRoZSBmaXJzdCwgbWlkZGxlLCBhbmQgbGFzdAorICAgICAqIGVsZW1lbnRzLCB0byBhdm9pZCBiYWQgcGVyZm9ybWFuY2UgaW4gdGhlIGZhY2Ugb2YgYWxyZWFkeQorICAgICAqIHNvcnRlZCBkYXRhLCBvciBkYXRhIHRoYXQgaXMgbWFkZSB1cCBvZiBtdWx0aXBsZSBzb3J0ZWQKKyAgICAgKiBydW5zIGFwcGVuZGVkIHRvZ2V0aGVyLiAgVGVzdGluZyBzaG93cyB0aGF0IGEKKyAgICAgKiBtZWRpYW4tb2YtdGhyZWUgYWxnb3JpdGhtIHByb3ZpZGVzIGJldHRlciBwZXJmb3JtYW5jZSB0aGFuCisgICAgICogc2ltcGx5IHBpY2tpbmcgdGhlIG1pZGRsZSBlbGVtZW50IGZvciB0aGUgbGF0dGVyIGNhc2UuCisgICAgICovCisKKyAgICBtaWQgPSBsbyArIChzaXplIC8gMikgKiB3aWR0aDsgICAgICAvKiBmaW5kIG1pZGRsZSBlbGVtZW50ICovCisKKyAgICAvKiBTb3J0IHRoZSBmaXJzdCwgbWlkZGxlLCBsYXN0IGVsZW1lbnRzIGludG8gb3JkZXIgKi8KKyAgICBpZiAoX19DT01QQVJFKGNvbnRleHQsIGxvLCBtaWQpID4gMCkKKyAgICAgIHN3YXAobG8sIG1pZCwgd2lkdGgpOworICAgIGlmIChfX0NPTVBBUkUoY29udGV4dCwgbG8sIGhpKSA+IDApCisgICAgICBzd2FwKGxvLCBoaSwgd2lkdGgpOworICAgIGlmIChfX0NPTVBBUkUoY29udGV4dCwgbWlkLCBoaSkgPiAwKQorICAgICAgc3dhcChtaWQsIGhpLCB3aWR0aCk7CisKKyAgICAvKiBXZSBub3cgd2lzaCB0byBwYXJ0aXRpb24gdGhlIGFycmF5IGludG8gdGhyZWUgcGllY2VzLCBvbmUKKyAgICAgKiBjb25zaXN0aW5nIG9mIGVsZW1lbnRzIDw9IHBhcnRpdGlvbiBlbGVtZW50LCBvbmUgb2YgZWxlbWVudHMKKyAgICAgKiBlcXVhbCB0byB0aGUgcGFydGl0aW9uIGVsZW1lbnQsIGFuZCBvbmUgb2YgZWxlbWVudHMgPiB0aGFuCisgICAgICogaXQuIFRoaXMgaXMgZG9uZSBiZWxvdzsgY29tbWVudHMgaW5kaWNhdGUgY29uZGl0aW9ucworICAgICAqIGVzdGFibGlzaGVkIGF0IGV2ZXJ5IHN0ZXAuCisgICAgICovCisKKyAgICBsb2d1eSA9IGxvOworICAgIGhpZ3V5ID0gaGk7CisKKyAgICAvKiBOb3RlIHRoYXQgaGlndXkgZGVjcmVhc2VzIGFuZCBsb2d1eSBpbmNyZWFzZXMgb24gZXZlcnkKKyAgICAgKiAgIGl0ZXJhdGlvbiwgc28gbG9vcCBtdXN0IHRlcm1pbmF0ZS4KKyAgICAgKi8KKyAgICBmb3IgKDs7KSB7CisgICAgICAvKiBsbyA8PSBsb2d1eSA8IGhpLCBsbyA8IGhpZ3V5IDw9IGhpLAorICAgICAgICogICBBW2ldIDw9IEFbbWlkXSBmb3IgbG8gPD0gaSA8PSBsb2d1eSwKKyAgICAgICAqICAgQVtpXSA+IEFbbWlkXSBmb3IgaGlndXkgPD0gaSA8IGhpLAorICAgICAgICogICBBW2hpXSA+PSBBW21pZF0KKyAgICAgICAqLworCisgICAgICAvKiBUaGUgZG91YmxlZCBsb29wIGlzIHRvIGF2b2lkIGNhbGxpbmcgY29tcChtaWQsbWlkKSwKKyAgICAgICAqICAgc2luY2Ugc29tZSBleGlzdGluZyBjb21wYXJpc29uIGZ1bmNzIGRvbid0IHdvcmsKKyAgICAgICAqICAgd2hlbiBwYXNzZWQgdGhlIHNhbWUgdmFsdWUgZm9yIGJvdGggcG9pbnRlcnMuCisgICAgICAgKi8KKworICAgICAgaWYgKG1pZCA+IGxvZ3V5KSB7CisgICAgICAgIGRvICB7CisgICAgICAgICAgbG9ndXkgKz0gd2lkdGg7CisgICAgICAgIH0gd2hpbGUgKGxvZ3V5IDwgbWlkICYmCisgICAgICAgICAgX19DT01QQVJFKGNvbnRleHQsIGxvZ3V5LCBtaWQpIDw9IDApOworICAgICAgfQorICAgICAgaWYgKG1pZCA8PSBsb2d1eSkgeworICAgICAgICBkbyAgeworICAgICAgICAgIGxvZ3V5ICs9IHdpZHRoOworICAgICAgICB9IHdoaWxlIChsb2d1eSA8PSBoaSAmJgorICAgICAgICAgIF9fQ09NUEFSRShjb250ZXh0LCBsb2d1eSwgbWlkKSA8PSAwKTsKKyAgICAgIH0KKworICAgICAgLyogbG8gPCBsb2d1eSA8PSBoaSsxLCBBW2ldIDw9IEFbbWlkXSBmb3IKKyAgICAgICAqICAgbG8gPD0gaSA8IGxvZ3V5LAorICAgICAgICogICBlaXRoZXIgbG9ndXkgPiBoaSBvciBBW2xvZ3V5XSA+IEFbbWlkXQorICAgICAgICovCisKKyAgICAgIGRvICB7CisgICAgICAgIGhpZ3V5IC09IHdpZHRoOworICAgICAgfSB3aGlsZSAoaGlndXkgPiBtaWQgJiYKKyAgICAgICAgICBfX0NPTVBBUkUoY29udGV4dCwgaGlndXksIG1pZCkgPiAwKTsKKworICAgICAgLyogbG8gPD0gaGlndXkgPCBoaSwgQVtpXSA+IEFbbWlkXSBmb3IgaGlndXkgPCBpIDwgaGksCisgICAgICAgKiAgIGVpdGhlciBoaWd1eSA9PSBsbyBvciBBW2hpZ3V5XSA8PSBBW21pZF0KKyAgICAgICAqLworCisgICAgICBpZiAoaGlndXkgPCBsb2d1eSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIGlmIGxvZ3V5ID4gaGkgb3IgaGlndXkgPT0gbG8sIHRoZW4gd2Ugd291bGQgaGF2ZQorICAgICAgICogICBleGl0ZWQsIHNvIEFbbG9ndXldID4gQVttaWRdLCBBW2hpZ3V5XSA8PSBBW21pZF0sCisgICAgICAgKiAgIGxvZ3V5IDw9IGhpLCBoaWd1eSA+IGxvCisgICAgICAgKi8KKworICAgICAgc3dhcChsb2d1eSwgaGlndXksIHdpZHRoKTsKKworICAgICAgLyogSWYgdGhlIHBhcnRpdGlvbiBlbGVtZW50IHdhcyBtb3ZlZCwgZm9sbG93IGl0LgorICAgICAgICogICBPbmx5IG5lZWQgdG8gY2hlY2sgZm9yIG1pZCA9PSBoaWd1eSwgc2luY2UgYmVmb3JlCisgICAgICAgKiAgIHRoZSBzd2FwLCBBW2xvZ3V5XSA+IEFbbWlkXSBpbXBsaWVzIGxvZ3V5ICE9IG1pZC4KKyAgICAgICAqLworCisgICAgICBpZiAobWlkID09IGhpZ3V5KQorICAgICAgICBtaWQgPSBsb2d1eTsKKworICAgICAgLyogQVtsb2d1eV0gPD0gQVttaWRdLCBBW2hpZ3V5XSA+IEFbbWlkXTsgc28gY29uZGl0aW9uCisgICAgICAgKiAgIGF0IHRvcCBvZiBsb29wIGlzIHJlLWVzdGFibGlzaGVkCisgICAgICAgKi8KKyAgICB9CisKKyAgICAvKiAgICAgQVtpXSA8PSBBW21pZF0gZm9yIGxvIDw9IGkgPCBsb2d1eSwKKyAgICAgKiAgICAgICBBW2ldID4gQVttaWRdIGZvciBoaWd1eSA8IGkgPCBoaSwKKyAgICAgKiAgICAgICBBW2hpXSA+PSBBW21pZF0KKyAgICAgKiAgICAgICBoaWd1eSA8IGxvZ3V5CisgICAgICogICBpbXBseWluZzoKKyAgICAgKiAgICAgICBoaWd1eSA9PSBsb2d1eS0xCisgICAgICogICAgICAgb3IgaGlndXkgPT0gaGkgLSAxLCBsb2d1eSA9PSBoaSArIDEsIEFbaGldID09IEFbbWlkXQorICAgICAqLworCisgICAgLyogRmluZCBhZGphY2VudCBlbGVtZW50cyBlcXVhbCB0byB0aGUgcGFydGl0aW9uIGVsZW1lbnQuICBUaGUKKyAgICAgKiAgIGRvdWJsZWQgbG9vcCBpcyB0byBhdm9pZCBjYWxsaW5nIGNvbXAobWlkLG1pZCksIHNpbmNlIHNvbWUKKyAgICAgKiAgIGV4aXN0aW5nIGNvbXBhcmlzb24gZnVuY3MgZG9uJ3Qgd29yayB3aGVuIHBhc3NlZCB0aGUgc2FtZQorICAgICAqICAgdmFsdWUgZm9yIGJvdGggcG9pbnRlcnMuCisgICAgICovCisKKyAgICBoaWd1eSArPSB3aWR0aDsKKyAgICBpZiAobWlkIDwgaGlndXkpIHsKKyAgICAgIGRvICB7CisgICAgICAgIGhpZ3V5IC09IHdpZHRoOworICAgICAgfSB3aGlsZSAoaGlndXkgPiBtaWQgJiYKKyAgICAgICAgX19DT01QQVJFKGNvbnRleHQsIGhpZ3V5LCBtaWQpID09IDApOworICAgIH0KKyAgICBpZiAobWlkID49IGhpZ3V5KSB7CisgICAgICBkbyAgeworICAgICAgICBoaWd1eSAtPSB3aWR0aDsKKyAgICAgIH0gd2hpbGUgKGhpZ3V5ID4gbG8gJiYKKyAgICAgICAgX19DT01QQVJFKGNvbnRleHQsIGhpZ3V5LCBtaWQpID09IDApOworICAgIH0KKworICAgIC8qIE9LLCBub3cgd2UgaGF2ZSB0aGUgZm9sbG93aW5nOgorICAgICAqICAgICAgaGlndXkgPCBsb2d1eQorICAgICAqICAgICAgbG8gPD0gaGlndXkgPD0gaGkKKyAgICAgKiAgICAgIEFbaV0gIDw9IEFbbWlkXSBmb3IgbG8gPD0gaSA8PSBoaWd1eQorICAgICAqICAgICAgQVtpXSAgPT0gQVttaWRdIGZvciBoaWd1eSA8IGkgPCBsb2d1eQorICAgICAqICAgICAgQVtpXSAgPiAgQVttaWRdIGZvciBsb2d1eSA8PSBpIDwgaGkKKyAgICAgKiAgICAgIEFbaGldID49IEFbbWlkXQorICAgICAqLworCisgICAgLyogV2UndmUgZmluaXNoZWQgdGhlIHBhcnRpdGlvbiwgbm93IHdlIHdhbnQgdG8gc29ydCB0aGUKKyAgICAgKiAgIHN1YmFycmF5cyBbbG8sIGhpZ3V5XSBhbmQgW2xvZ3V5LCBoaV0uCisgICAgICogICBXZSBkbyB0aGUgc21hbGxlciBvbmUgZmlyc3QgdG8gbWluaW1pemUgc3RhY2sgdXNhZ2UuCisgICAgICogICBXZSBvbmx5IHNvcnQgYXJyYXlzIG9mIGxlbmd0aCAyIG9yIG1vcmUuCisgICAgICovCisKKyAgICBpZiAoaGlndXkgLSBsbyA+PSBoaSAtIGxvZ3V5KSB7CisgICAgICBpZiAobG8gPCBoaWd1eSkgeworICAgICAgICBsb3N0a1tzdGtwdHJdID0gbG87CisgICAgICAgIGhpc3RrW3N0a3B0cl0gPSBoaWd1eTsKKyAgICAgICAgKytzdGtwdHI7CisgICAgICB9ICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIGJpZyByZWN1cnNpb24gZm9yIGxhdGVyICovCisKKyAgICAgIGlmIChsb2d1eSA8IGhpKSB7CisgICAgICAgIGxvID0gbG9ndXk7CisgICAgICAgIGdvdG8gcmVjdXJzZTsgICAgICAgICAgLyogZG8gc21hbGwgcmVjdXJzaW9uICovCisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChsb2d1eSA8IGhpKSB7CisgICAgICAgIGxvc3RrW3N0a3B0cl0gPSBsb2d1eTsKKyAgICAgICAgaGlzdGtbc3RrcHRyXSA9IGhpOworICAgICAgICArK3N0a3B0cjsgICAgLyogc2F2ZSBiaWcgcmVjdXJzaW9uIGZvciBsYXRlciAqLworICAgICAgfQorCisgICAgICBpZiAobG8gPCBoaWd1eSkgeworICAgICAgICBoaSA9IGhpZ3V5OworICAgICAgICBnb3RvIHJlY3Vyc2U7ICAgICAgICAgIC8qIGRvIHNtYWxsIHJlY3Vyc2lvbiAqLworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFdlIGhhdmUgc29ydGVkIHRoZSBhcnJheSwgZXhjZXB0IGZvciBhbnkgcGVuZGluZyBzb3J0cyBvbiB0aGUgc3RhY2suCisgICAqICAgQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSwgYW5kIGRvIHRoZW0uCisgICAqLworCisgIC0tc3RrcHRyOworICBpZiAoc3RrcHRyID49IDApIHsKKyAgICBsbyA9IGxvc3RrW3N0a3B0cl07CisgICAgaGkgPSBoaXN0a1tzdGtwdHJdOworICAgIGdvdG8gcmVjdXJzZTsgICAgICAgICAgIC8qIHBvcCBzdWJhcnJheSBmcm9tIHN0YWNrICovCisgIH0gZWxzZQorICAgIHJldHVybjsgICAgICAgICAgICAgICAgIC8qIGFsbCBzdWJhcnJheXMgZG9uZSAqLworfQorCisjZW5kaWYKKworI2luY2x1ZGUgImF2MV9nbG9iYWwuaCIKK2ludCBhb21fcmVhbGxvY19mcmFtZV9idWZmZXIoQVYxX0NPTU1PTiAqY20sIFBJQ19CVUZGRVJfQ09ORklHICpwaWMsCisgIGludCB3aWR0aCwgaW50IGhlaWdodCwgdW5zaWduZWQgaW50IG9yZGVyX2hpbnQpOwordm9pZCBkdW1wX3BhcmFtcyhBVjFEZWNvZGVyICpwYmksIHVuaW9uIHBhcmFtX3UgKnBhcmFtcyk7CisKKyNkZWZpbmUgYXNzZXJ0KGEpCisjZGVmaW5lIElNUExJRVMoYSkKKworaW50IG5ld19jb21wcmVzc2VkX2RhdGFfY291bnQgPSAwOworCitzdGF0aWMgaW50IHZhbGlkX3JlZl9mcmFtZV9zaXplKGludCByZWZfd2lkdGgsIGludCByZWZfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRoaXNfd2lkdGgsIGludCB0aGlzX2hlaWdodCkgeworICByZXR1cm4gMiAqIHRoaXNfd2lkdGggPj0gcmVmX3dpZHRoICYmIDIgKiB0aGlzX2hlaWdodCA+PSByZWZfaGVpZ2h0ICYmCisgICAgICAgICB0aGlzX3dpZHRoIDw9IDE2ICogcmVmX3dpZHRoICYmIHRoaXNfaGVpZ2h0IDw9IDE2ICogcmVmX2hlaWdodDsKK30KKworI2lmZGVmIFNVUFBPUlRfU0NBTEVfRkFDVE9SCisvLyBOb3RlOiBFeHBlY3QgdmFsIHRvIGJlIGluIHE0IHByZWNpc2lvbgorc3RhdGljIGlubGluZSBpbnQgc2NhbGVkX3goaW50IHZhbCwgY29uc3Qgc3RydWN0IHNjYWxlX2ZhY3RvcnMgKnNmKSB7CisgIGNvbnN0IGludCBvZmYgPQorICAgICAgKHNmLT54X3NjYWxlX2ZwIC0gKDEgPDwgUkVGX1NDQUxFX1NISUZUKSkgKiAoMSA8PCAoU1VCUEVMX0JJVFMgLSAxKSk7CisgIGNvbnN0IGludDY0X3QgdHZhbCA9IChpbnQ2NF90KXZhbCAqIHNmLT54X3NjYWxlX2ZwICsgb2ZmOworICByZXR1cm4gKGludClST1VORF9QT1dFUl9PRl9UV09fU0lHTkVEXzY0KHR2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGX1NDQUxFX1NISUZUIC0gU0NBTEVfRVhUUkFfQklUUyk7Cit9CisKKy8vIE5vdGU6IEV4cGVjdCB2YWwgdG8gYmUgaW4gcTQgcHJlY2lzaW9uCitzdGF0aWMgaW5saW5lIGludCBzY2FsZWRfeShpbnQgdmFsLCBjb25zdCBzdHJ1Y3Qgc2NhbGVfZmFjdG9ycyAqc2YpIHsKKyAgY29uc3QgaW50IG9mZiA9CisgICAgICAoc2YtPnlfc2NhbGVfZnAgLSAoMSA8PCBSRUZfU0NBTEVfU0hJRlQpKSAqICgxIDw8IChTVUJQRUxfQklUUyAtIDEpKTsKKyAgY29uc3QgaW50NjRfdCB0dmFsID0gKGludDY0X3QpdmFsICogc2YtPnlfc2NhbGVfZnAgKyBvZmY7CisgIHJldHVybiAoaW50KVJPVU5EX1BPV0VSX09GX1RXT19TSUdORURfNjQodHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZfU0NBTEVfU0hJRlQgLSBTQ0FMRV9FWFRSQV9CSVRTKTsKK30KKworLy8gTm90ZTogRXhwZWN0IHZhbCB0byBiZSBpbiBxNCBwcmVjaXNpb24KK3N0YXRpYyBpbnQgdW5zY2FsZWRfdmFsdWUoaW50IHZhbCwgY29uc3Qgc3RydWN0IHNjYWxlX2ZhY3RvcnMgKnNmKSB7CisgICh2b2lkKXNmOworICByZXR1cm4gdmFsIDw8IFNDQUxFX0VYVFJBX0JJVFM7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2ZpeGVkX3BvaW50X3NjYWxlX2ZhY3RvcihpbnQgb3RoZXJfc2l6ZSwgaW50IHRoaXNfc2l6ZSkgeworICAvLyBDYWxjdWxhdGUgc2NhbGluZyBmYWN0b3Igb25jZSBmb3IgZWFjaCByZWZlcmVuY2UgZnJhbWUKKyAgLy8gYW5kIHVzZSBmaXhlZCBwb2ludCBzY2FsaW5nIGZhY3RvcnMgaW4gZGVjb2RpbmcgYW5kIGVuY29kaW5nIHJvdXRpbmVzLgorICAvLyBIYXJkd2FyZSBpbXBsZW1lbnRhdGlvbnMgY2FuIGNhbGN1bGF0ZSBzY2FsZSBmYWN0b3IgaW4gZGV2aWNlIGRyaXZlcgorICAvLyBhbmQgdXNlIG11bHRpcGxpY2F0aW9uIGFuZCBzaGlmdGluZyBvbiBoYXJkd2FyZSBpbnN0ZWFkIG9mIGRpdmlzaW9uLgorICByZXR1cm4gKChvdGhlcl9zaXplIDw8IFJFRl9TQ0FMRV9TSElGVCkgKyB0aGlzX3NpemUgLyAyKSAvIHRoaXNfc2l6ZTsKK30KKworLy8gR2l2ZW4gdGhlIGZpeGVkIHBvaW50IHNjYWxlLCBjYWxjdWxhdGUgY29hcnNlIHBvaW50IHNjYWxlLgorc3RhdGljIGludCBmaXhlZF9wb2ludF9zY2FsZV90b19jb2Fyc2VfcG9pbnRfc2NhbGUoaW50IHNjYWxlX2ZwKSB7CisgIHJldHVybiBST1VORF9QT1dFUl9PRl9UV08oc2NhbGVfZnAsIFJFRl9TQ0FMRV9TSElGVCAtIFNDQUxFX1NVQlBFTF9CSVRTKTsKK30KKworCit2b2lkIGF2MV9zZXR1cF9zY2FsZV9mYWN0b3JzX2Zvcl9mcmFtZShzdHJ1Y3Qgc2NhbGVfZmFjdG9ycyAqc2YsIGludCBvdGhlcl93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG90aGVyX2gsIGludCB0aGlzX3csIGludCB0aGlzX2gpIHsKKyAgaWYgKCF2YWxpZF9yZWZfZnJhbWVfc2l6ZShvdGhlcl93LCBvdGhlcl9oLCB0aGlzX3csIHRoaXNfaCkpIHsKKyAgICBzZi0+eF9zY2FsZV9mcCA9IFJFRl9JTlZBTElEX1NDQUxFOworICAgIHNmLT55X3NjYWxlX2ZwID0gUkVGX0lOVkFMSURfU0NBTEU7CisgICAgcmV0dXJuOworICB9CisKKyAgc2YtPnhfc2NhbGVfZnAgPSBnZXRfZml4ZWRfcG9pbnRfc2NhbGVfZmFjdG9yKG90aGVyX3csIHRoaXNfdyk7CisgIHNmLT55X3NjYWxlX2ZwID0gZ2V0X2ZpeGVkX3BvaW50X3NjYWxlX2ZhY3RvcihvdGhlcl9oLCB0aGlzX2gpOworCisgIHNmLT54X3N0ZXBfcTQgPSBmaXhlZF9wb2ludF9zY2FsZV90b19jb2Fyc2VfcG9pbnRfc2NhbGUoc2YtPnhfc2NhbGVfZnApOworICBzZi0+eV9zdGVwX3E0ID0gZml4ZWRfcG9pbnRfc2NhbGVfdG9fY29hcnNlX3BvaW50X3NjYWxlKHNmLT55X3NjYWxlX2ZwKTsKKworICBpZiAoYXYxX2lzX3NjYWxlZChzZikpIHsKKyAgICBzZi0+c2NhbGVfdmFsdWVfeCA9IHNjYWxlZF94OworICAgIHNmLT5zY2FsZV92YWx1ZV95ID0gc2NhbGVkX3k7CisgIH0gZWxzZSB7CisgICAgc2YtPnNjYWxlX3ZhbHVlX3ggPSB1bnNjYWxlZF92YWx1ZTsKKyAgICBzZi0+c2NhbGVfdmFsdWVfeSA9IHVuc2NhbGVkX3ZhbHVlOworICB9CisjaWZkZWYgT1JJX0NPREUKKyAgLy8gQVYxIGNvbnZvbHZlIGZ1bmN0aW9ucworICAvLyBTcGVjaWFsIGNhc2UgY29udm9sdmUgZnVuY3Rpb25zIHNob3VsZCBwcm9kdWNlIHRoZSBzYW1lIHJlc3VsdCBhcworICAvLyBhdjFfY29udm9sdmVfMmQuCisgIC8vIHN1YnBlbF94X3FuID09IDAgJiYgc3VicGVsX3lfcW4gPT0gMAorICBzZi0+Y29udm9sdmVbMF1bMF1bMF0gPSBhdjFfY29udm9sdmVfMmRfY29weV9zcjsKKyAgLy8gc3VicGVsX3hfcW4gPT0gMAorICBzZi0+Y29udm9sdmVbMF1bMV1bMF0gPSBhdjFfY29udm9sdmVfeV9zcjsKKyAgLy8gc3VicGVsX3lfcW4gPT0gMAorICBzZi0+Y29udm9sdmVbMV1bMF1bMF0gPSBhdjFfY29udm9sdmVfeF9zcjsKKyAgLy8gc3VicGVsX3hfcW4gIT0gMCAmJiBzdWJwZWxfeV9xbiAhPSAwCisgIHNmLT5jb252b2x2ZVsxXVsxXVswXSA9IGF2MV9jb252b2x2ZV8yZF9zcjsKKyAgLy8gc3VicGVsX3hfcW4gPT0gMCAmJiBzdWJwZWxfeV9xbiA9PSAwCisgIHNmLT5jb252b2x2ZVswXVswXVsxXSA9IGF2MV9kaXN0X3d0ZF9jb252b2x2ZV8yZF9jb3B5OworICAvLyBzdWJwZWxfeF9xbiA9PSAwCisgIHNmLT5jb252b2x2ZVswXVsxXVsxXSA9IGF2MV9kaXN0X3d0ZF9jb252b2x2ZV95OworICAvLyBzdWJwZWxfeV9xbiA9PSAwCisgIHNmLT5jb252b2x2ZVsxXVswXVsxXSA9IGF2MV9kaXN0X3d0ZF9jb252b2x2ZV94OworICAvLyBzdWJwZWxfeF9xbiAhPSAwICYmIHN1YnBlbF95X3FuICE9IDAKKyAgc2YtPmNvbnZvbHZlWzFdWzFdWzFdID0gYXYxX2Rpc3Rfd3RkX2NvbnZvbHZlXzJkOworICAvLyBBVjEgSGlnaCBCRCBjb252b2x2ZSBmdW5jdGlvbnMKKyAgLy8gU3BlY2lhbCBjYXNlIGNvbnZvbHZlIGZ1bmN0aW9ucyBzaG91bGQgcHJvZHVjZSB0aGUgc2FtZSByZXN1bHQgYXMKKyAgLy8gYXYxX2hpZ2hiZF9jb252b2x2ZV8yZC4KKyAgLy8gc3VicGVsX3hfcW4gPT0gMCAmJiBzdWJwZWxfeV9xbiA9PSAwCisgIHNmLT5oaWdoYmRfY29udm9sdmVbMF1bMF1bMF0gPSBhdjFfaGlnaGJkX2NvbnZvbHZlXzJkX2NvcHlfc3I7CisgIC8vIHN1YnBlbF94X3FuID09IDAKKyAgc2YtPmhpZ2hiZF9jb252b2x2ZVswXVsxXVswXSA9IGF2MV9oaWdoYmRfY29udm9sdmVfeV9zcjsKKyAgLy8gc3VicGVsX3lfcW4gPT0gMAorICBzZi0+aGlnaGJkX2NvbnZvbHZlWzFdWzBdWzBdID0gYXYxX2hpZ2hiZF9jb252b2x2ZV94X3NyOworICAvLyBzdWJwZWxfeF9xbiAhPSAwICYmIHN1YnBlbF95X3FuICE9IDAKKyAgc2YtPmhpZ2hiZF9jb252b2x2ZVsxXVsxXVswXSA9IGF2MV9oaWdoYmRfY29udm9sdmVfMmRfc3I7CisgIC8vIHN1YnBlbF94X3FuID09IDAgJiYgc3VicGVsX3lfcW4gPT0gMAorICBzZi0+aGlnaGJkX2NvbnZvbHZlWzBdWzBdWzFdID0gYXYxX2hpZ2hiZF9kaXN0X3d0ZF9jb252b2x2ZV8yZF9jb3B5OworICAvLyBzdWJwZWxfeF9xbiA9PSAwCisgIHNmLT5oaWdoYmRfY29udm9sdmVbMF1bMV1bMV0gPSBhdjFfaGlnaGJkX2Rpc3Rfd3RkX2NvbnZvbHZlX3k7CisgIC8vIHN1YnBlbF95X3FuID09IDAKKyAgc2YtPmhpZ2hiZF9jb252b2x2ZVsxXVswXVsxXSA9IGF2MV9oaWdoYmRfZGlzdF93dGRfY29udm9sdmVfeDsKKyAgLy8gc3VicGVsX3hfcW4gIT0gMCAmJiBzdWJwZWxfeV9xbiAhPSAwCisgIHNmLT5oaWdoYmRfY29udm9sdmVbMV1bMV1bMV0gPSBhdjFfaGlnaGJkX2Rpc3Rfd3RkX2NvbnZvbHZlXzJkOworI2VuZGlmCit9CisjZW5kaWYKKworc3RhdGljIFJlZkNudEJ1ZmZlciAqYXNzaWduX2N1cl9mcmFtZV9uZXdfZmIoQVYxX0NPTU1PTiAqY29uc3QgY20pIHsKKyAgLy8gUmVsZWFzZSB0aGUgcHJldmlvdXNseS11c2VkIGZyYW1lLWJ1ZmZlcgorICBpbnQgbmV3X2ZiX2lkeDsKKyAgaWYgKGNtLT5jdXJfZnJhbWUgIT0gTlVMTCkgeworICAgIC0tY20tPmN1cl9mcmFtZS0+cmVmX2NvdW50OworICAgIGNtLT5jdXJfZnJhbWUgPSBOVUxMOworICB9CisKKyAgLy8gQXNzaWduIGEgbmV3IGZyYW1lYnVmZmVyCisgIG5ld19mYl9pZHggPSBnZXRfZnJlZV9mcmFtZV9idWZmZXIoY20pOworICBpZiAobmV3X2ZiX2lkeCA9PSBJTlZBTElEX0lEWCkgcmV0dXJuIE5VTEw7CisKKyAgY20tPmN1cl9mcmFtZSA9ICZjbS0+YnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnNbbmV3X2ZiX2lkeF07CisgIGNtLT5jdXJfZnJhbWUtPmJ1Zi5idWZfOGJpdF92YWxpZCA9IDA7CisjaWZkZWYgQU1MCisgIGNtLT5jdXJfZnJhbWUtPmJ1Zi5pbmRleCA9IG5ld19mYl9pZHg7CisjZW5kaWYKKyNpZmRlZiBPUklfQ09ERQorICBhdjFfemVybyhjbS0+Y3VyX2ZyYW1lLT5pbnRlcnBfZmlsdGVyX3NlbGVjdGVkKTsKKyNlbmRpZgorICByZXR1cm4gY20tPmN1cl9mcmFtZTsKK30KKworLy8gTW9kaWZ5ICdsaHNfcHRyJyB0byByZWZlcmVuY2UgdGhlIGJ1ZmZlciBhdCAncmhzX3B0cicsIGFuZCB1cGRhdGUgdGhlIHJlZgorLy8gY291bnRzIGFjY29yZGluZ2x5Lgorc3RhdGljIHZvaWQgYXNzaWduX2ZyYW1lX2J1ZmZlcl9wKFJlZkNudEJ1ZmZlciAqKmxoc19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZDbnRCdWZmZXIgKnJoc19wdHIpIHsKKyAgUmVmQ250QnVmZmVyICpjb25zdCBvbGRfcHRyID0gKmxoc19wdHI7CisgIGlmIChvbGRfcHRyICE9IE5VTEwpIHsKKyAgICBhc3NlcnQob2xkX3B0ci0+cmVmX2NvdW50ID4gMCk7CisgICAgLy8gT25lIGxlc3MgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgYXQgJ29sZF9wdHInLCBzbyBkZWNyZWFzZSByZWYgY291bnQuCisgICAgLS1vbGRfcHRyLT5yZWZfY291bnQ7CisgIH0KKworICAqbGhzX3B0ciA9IHJoc19wdHI7CisgIC8vIE9uZSBtb3JlIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIGF0ICdyaHNfcHRyJywgc28gaW5jcmVhc2UgcmVmIGNvdW50LgorICArK3Joc19wdHItPnJlZl9jb3VudDsKK30KKworQVYxRGVjb2RlciAqYXYxX2RlY29kZXJfY3JlYXRlKEJ1ZmZlclBvb2wgKmNvbnN0IHBvb2wsIEFWMV9DT01NT04gKmNtKSB7CisgIGludCBpOworCisjaWZuZGVmIENPTkZJR19BTUxPR0lDX01FRElBX01VTFRJX0RFQworICBBVjFEZWNvZGVyICpwYmkgPSAoQVYxRGVjb2RlciAqKW1hbGxvYyhzaXplb2YoKnBiaSkpOworI2Vsc2UKKyAgQVYxRGVjb2RlciAqcGJpID0gKEFWMURlY29kZXIgKil2bWFsbG9jKHNpemVvZihBVjFEZWNvZGVyKSk7CisjZW5kaWYKKyAgaWYgKCFwYmkpIHJldHVybiBOVUxMOworICBtZW1zZXQocGJpLCAwLCBzaXplb2YoKnBiaSkpOworCisgIC8vIFRoZSBqbXBfYnVmIGlzIHZhbGlkIG9ubHkgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZnVuY3Rpb24gdGhhdCBjYWxscworICAvLyBzZXRqbXAoKS4gVGhlcmVmb3JlLCB0aGlzIGZ1bmN0aW9uIG11c3QgcmVzZXQgdGhlICdzZXRqbXAnIGZpZWxkIHRvIDAKKyAgLy8gYmVmb3JlIGl0IHJldHVybnMuCisKKyAgcGJpLT5jb21tb24gPSBjbTsKKyAgY20tPmVycm9yLnNldGptcCA9IDE7CisKKyNpZmRlZiBPUklfQ09ERQorICBtZW1zZXQoY20tPmZjLCAwLCBzaXplb2YoKmNtLT5mYykpOworICBtZW1zZXQoY20tPmRlZmF1bHRfZnJhbWVfY29udGV4dCwgMCwgc2l6ZW9mKCpjbS0+ZGVmYXVsdF9mcmFtZV9jb250ZXh0KSk7CisjZW5kaWYKKyAgcGJpLT5uZWVkX3Jlc3luYyA9IDE7CisKKyAgLy8gSW5pdGlhbGl6ZSB0aGUgcmVmZXJlbmNlcyB0byBub3QgcG9pbnQgdG8gYW55IGZyYW1lIGJ1ZmZlcnMuCisgIGZvciAoaSA9IDA7IGkgPCBSRUZfRlJBTUVTOyBpKyspIHsKKyAgICBjbS0+cmVmX2ZyYW1lX21hcFtpXSA9IE5VTEw7CisgICAgY20tPm5leHRfcmVmX2ZyYW1lX21hcFtpXSA9IE5VTEw7CisjaWZkZWYgQU1MCisgICAgY20tPm5leHRfdXNlZF9yZWZfZnJhbWVfbWFwW2ldID0gTlVMTDsKKyNlbmRpZgorICB9CisKKyAgY20tPmN1cnJlbnRfZnJhbWUuZnJhbWVfbnVtYmVyID0gMDsKKyAgcGJpLT5kZWNvZGluZ19maXJzdF9mcmFtZSA9IDE7CisgIHBiaS0+Y29tbW9uLT5idWZmZXJfcG9vbCA9IHBvb2w7CisKKyAgY20tPnNlcV9wYXJhbXMuYml0X2RlcHRoID0gQU9NX0JJVFNfODsKKworI2lmZGVmIE9SSV9DT0RFCisgIGNtLT5hbGxvY19taSA9IGRlY19hbGxvY19taTsKKyAgY20tPmZyZWVfbWkgPSBkZWNfZnJlZV9taTsKKyAgY20tPnNldHVwX21pID0gZGVjX3NldHVwX21pOworCisgIGF2MV9sb29wX2ZpbHRlcl9pbml0KGNtKTsKKworICBhdjFfcW1faW5pdChjbSk7CisgIGF2MV9sb29wX3Jlc3RvcmF0aW9uX3ByZWNhbCgpOworI2lmIENPTkZJR19BQ0NPVU5USU5HCisgIHBiaS0+YWNjdF9lbmFibGVkID0gMTsKKyAgYW9tX2FjY291bnRpbmdfaW5pdCgmcGJpLT5hY2NvdW50aW5nKTsKKyNlbmRpZgorI2VuZGlmCisgIGNtLT5lcnJvci5zZXRqbXAgPSAwOworCisjaWZkZWYgT1JJX0NPREUKKyAgYW9tX2dldF93b3JrZXJfaW50ZXJmYWNlKCktPmluaXQoJnBiaS0+bGZfd29ya2VyKTsKKyAgcGJpLT5sZl93b3JrZXIudGhyZWFkX25hbWUgPSAiYW9tIGxmIHdvcmtlciI7CisjZW5kaWYKKworICByZXR1cm4gcGJpOworfQorCitzdGF0aWMgdm9pZCByZXNldF9mcmFtZV9idWZmZXJzKEFWMURlY29kZXIgKmNvbnN0IHBiaSk7CisKK3ZvaWQgYXYxX2J1Zm1ncl9jdHhfcmVzZXQoQVYxRGVjb2RlciAqcGJpLCBCdWZmZXJQb29sICpjb25zdCBwb29sLCBBVjFfQ09NTU9OICpjbSkKK3sKKwl1MzIgc2F2ZV93LCBzYXZlX2g7CisKKwlpZiAoIXBiaSB8fCAhcG9vbCB8fCAhY20pCisJCXJldHVybjsKKworCXJlc2V0X2ZyYW1lX2J1ZmZlcnMocGJpKTsKKwltZW1zZXQocGJpLCAwLCBzaXplb2YoKnBiaSkpOworCS8qc2F2ZSB3LGggZm9yIHJlc29sdXRpb24gY2hhbmdlIGFmdGVyIHNlZWsgKi8KKwlzYXZlX3cgPSBjbS0+d2lkdGg7CisJc2F2ZV9oID0gY20tPmhlaWdodDsKKwltZW1zZXQoY20sIDAsIHNpemVvZigqY20pKTsKKworCWNtLT5jdXJyZW50X2ZyYW1lLmZyYW1lX251bWJlcgk9IDA7CisJY20tPnNlcV9wYXJhbXMuYml0X2RlcHRoCT0gQU9NX0JJVFNfODsKKwljbS0+ZXJyb3Iuc2V0am1wID0gMDsKKwljbS0+d2lkdGggPSBzYXZlX3c7CisJY20tPmhlaWdodCA9IHNhdmVfaDsKKworCXBiaS0+YnVmbWdyX3Byb2NfY291bnQJCT0gMDsKKwlwYmktPm5lZWRfcmVzeW5jCQk9IDE7CisJcGJpLT5kZWNvZGluZ19maXJzdF9mcmFtZQk9IDE7CisJcGJpLT5udW1fb3V0cHV0X2ZyYW1lcwkJPSAwOworCXBiaS0+Y29tbW9uCQkJPSBjbTsKKwlwYmktPmNvbW1vbi0+YnVmZmVyX3Bvb2wJPSBwb29sOworfQorCitpbnQgcmVsZWFzZV9mYl9jYih2b2lkICpjYl9wcml2LCBhb21fY29kZWNfZnJhbWVfYnVmZmVyX3QgKmZiKSB7CisjaWYgMAorICBJbnRlcm5hbEZyYW1lQnVmZmVyICpjb25zdCBpbnRfZmIgPSAoSW50ZXJuYWxGcmFtZUJ1ZmZlciAqKWZiLT5wcml2OworICAodm9pZCljYl9wcml2OworICBpZiAoaW50X2ZiKSBpbnRfZmItPmluX3VzZSA9IDA7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlY3JlYXNlX3JlZl9jb3VudChBVjFEZWNvZGVyICpwYmksIFJlZkNudEJ1ZmZlciAqY29uc3QgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJQb29sICpjb25zdCBwb29sKSB7CisgIGlmIChidWYgIT0gTlVMTCkgeworICAgIC0tYnVmLT5yZWZfY291bnQ7CisgICAgLy8gUmVmZXJlbmNlIGNvdW50cyBzaG91bGQgbmV2ZXIgYmVjb21lIG5lZ2F0aXZlLiBJZiB0aGlzIGFzc2VydGlvbiBmYWlscywKKyAgICAvLyB0aGVyZSBpcyBhIGJ1ZyBpbiBvdXIgcmVmZXJlbmNlIGNvdW50IG1hbmFnZW1lbnQuCisgICAgYXNzZXJ0KGJ1Zi0+cmVmX2NvdW50ID49IDApOworICAgIC8vIEEgd29ya2VyIG1heSBvbmx5IGdldCBhIGZyZWUgZnJhbWVidWZmZXIgaW5kZXggd2hlbiBjYWxsaW5nIGdldF9mcmVlX2ZiLgorICAgIC8vIEJ1dCB0aGUgcmF3IGZyYW1lIGJ1ZmZlciBpcyBub3Qgc2V0IHVwIHVudGlsIHdlIGZpbmlzaCBkZWNvZGluZyBoZWFkZXIuCisgICAgLy8gU28gaWYgYW55IGVycm9yIGhhcHBlbnMgZHVyaW5nIGRlY29kaW5nIGhlYWRlciwgZnJhbWVfYnVmc1tpZHhdIHdpbGwgbm90CisgICAgLy8gaGF2ZSBhIHZhbGlkIHJhdyBmcmFtZSBidWZmZXIuCisgICAgaWYgKGJ1Zi0+cmVmX2NvdW50ID09IDAKKyNpZmRlZiBPUklfQ09ERQorICAgICAmJiBidWYtPnJhd19mcmFtZV9idWZmZXIuZGF0YQorI2VuZGlmCisgICAgICkgeworI2lmZGVmIEFNTAorICAgICAgYXYxX3JlbGVhc2VfYnVmKHBiaSwgYnVmKTsKKyNlbmRpZgorICAgICAgcmVsZWFzZV9mYl9jYihwb29sLT5jYl9wcml2LCAmYnVmLT5yYXdfZnJhbWVfYnVmZmVyKTsKKyAgICAgIGJ1Zi0+cmF3X2ZyYW1lX2J1ZmZlci5kYXRhID0gTlVMTDsKKyAgICAgIGJ1Zi0+cmF3X2ZyYW1lX2J1ZmZlci5zaXplID0gMDsKKyAgICAgIGJ1Zi0+cmF3X2ZyYW1lX2J1ZmZlci5wcml2ID0gTlVMTDsKKyAgICB9CisgIH0KK30KKwordm9pZCBjbGVhcl9mcmFtZV9idWZfcmVmX2NvdW50KEFWMURlY29kZXIgKnBiaSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwYmktPm51bV9vdXRwdXRfZnJhbWVzOyBpKyspIHsKKwkJZGVjcmVhc2VfcmVmX2NvdW50KHBiaSwgcGJpLT5vdXRwdXRfZnJhbWVzW2ldLAorCQkJcGJpLT5jb21tb24tPmJ1ZmZlcl9wb29sKTsKKwl9CisJcGJpLT5udW1fb3V0cHV0X2ZyYW1lcyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHN3YXBfZnJhbWVfYnVmZmVycyhBVjFEZWNvZGVyICpwYmksIGludCBmcmFtZV9kZWNvZGVkKSB7CisgIGludCByZWZfaW5kZXggPSAwLCBtYXNrOworICBBVjFfQ09NTU9OICpjb25zdCBjbSA9IHBiaS0+Y29tbW9uOworICBCdWZmZXJQb29sICpjb25zdCBwb29sID0gY20tPmJ1ZmZlcl9wb29sOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgIGlmIChmcmFtZV9kZWNvZGVkKSB7CisgICAgaW50IGNoZWNrX29uX3Nob3dfZXhpc3RpbmdfZnJhbWU7CisgICAgbG9ja19idWZmZXJfcG9vbChwb29sLCBmbGFncyk7CisKKyAgICAvLyBJbiBleHQtdGlsZSBkZWNvZGluZywgdGhlIGNhbWVyYSBmcmFtZSBoZWFkZXIgaXMgb25seSBkZWNvZGVkIG9uY2UuIFNvLAorICAgIC8vIHdlIGRvbid0IHJlbGVhc2UgdGhlIHJlZmVyZW5jZXMgaGVyZS4KKyAgICBpZiAoIXBiaS0+Y2FtZXJhX2ZyYW1lX2hlYWRlcl9yZWFkeSkgeworICAgICAgLy8gSWYgd2UgYXJlIG5vdCBob2xkaW5nIHJlZmVyZW5jZSBidWZmZXJzIGluIGNtLT5uZXh0X3JlZl9mcmFtZV9tYXAsCisgICAgICAvLyBhc3NlcnQgdGhhdCB0aGUgZm9sbG93aW5nIHR3byBmb3IgbG9vcHMgYXJlIG5vLW9wcy4KKyAgICAgIGFzc2VydChJTVBMSUVTKCFwYmktPmhvbGRfcmVmX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgIGNtLT5jdXJyZW50X2ZyYW1lLnJlZnJlc2hfZnJhbWVfZmxhZ3MgPT0gMCkpOworICAgICAgYXNzZXJ0KElNUExJRVMoIXBiaS0+aG9sZF9yZWZfYnVmLAorICAgICAgICAgICAgICAgICAgICAgY20tPnNob3dfZXhpc3RpbmdfZnJhbWUgJiYgIXBiaS0+cmVzZXRfZGVjb2Rlcl9zdGF0ZSkpOworCisgICAgICAvLyBUaGUgZm9sbG93aW5nIHR3byBmb3IgbG9vcHMgbmVlZCB0byByZWxlYXNlIHRoZSByZWZlcmVuY2Ugc3RvcmVkIGluCisgICAgICAvLyBjbS0+cmVmX2ZyYW1lX21hcFtyZWZfaW5kZXhdIGJlZm9yZSB0cmFuc2ZlcnJpbmcgdGhlIHJlZmVyZW5jZSBzdG9yZWQKKyAgICAgIC8vIGluIGNtLT5uZXh0X3JlZl9mcmFtZV9tYXBbcmVmX2luZGV4XSB0byBjbS0+cmVmX2ZyYW1lX21hcFtyZWZfaW5kZXhdLgorICAgICAgZm9yIChtYXNrID0gY20tPmN1cnJlbnRfZnJhbWUucmVmcmVzaF9mcmFtZV9mbGFnczsgbWFzazsgbWFzayA+Pj0gMSkgeworICAgICAgICBkZWNyZWFzZV9yZWZfY291bnQocGJpLCBjbS0+cmVmX2ZyYW1lX21hcFtyZWZfaW5kZXhdLCBwb29sKTsKKyAgICAgICAgY20tPnJlZl9mcmFtZV9tYXBbcmVmX2luZGV4XSA9IGNtLT5uZXh0X3JlZl9mcmFtZV9tYXBbcmVmX2luZGV4XTsKKyAgICAgICAgY20tPm5leHRfcmVmX2ZyYW1lX21hcFtyZWZfaW5kZXhdID0gTlVMTDsKKyAgICAgICAgKytyZWZfaW5kZXg7CisgICAgICB9CisKKyAgICAgIGNoZWNrX29uX3Nob3dfZXhpc3RpbmdfZnJhbWUgPQorICAgICAgICAgICFjbS0+c2hvd19leGlzdGluZ19mcmFtZSB8fCBwYmktPnJlc2V0X2RlY29kZXJfc3RhdGU7CisgICAgICBmb3IgKDsgcmVmX2luZGV4IDwgUkVGX0ZSQU1FUyAmJiBjaGVja19vbl9zaG93X2V4aXN0aW5nX2ZyYW1lOworICAgICAgICAgICArK3JlZl9pbmRleCkgeworICAgICAgICBkZWNyZWFzZV9yZWZfY291bnQocGJpLCBjbS0+cmVmX2ZyYW1lX21hcFtyZWZfaW5kZXhdLCBwb29sKTsKKyAgICAgICAgY20tPnJlZl9mcmFtZV9tYXBbcmVmX2luZGV4XSA9IGNtLT5uZXh0X3JlZl9mcmFtZV9tYXBbcmVmX2luZGV4XTsKKyAgICAgICAgY20tPm5leHRfcmVmX2ZyYW1lX21hcFtyZWZfaW5kZXhdID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY20tPnNob3dfZXhpc3RpbmdfZnJhbWUgfHwgY20tPnNob3dfZnJhbWUpIHsKKyAgICAgIGlmIChwYmktPm91dHB1dF9hbGxfbGF5ZXJzKSB7CisgICAgICAgIC8vIEFwcGVuZCB0aGlzIGZyYW1lIHRvIHRoZSBvdXRwdXQgcXVldWUKKyAgICAgICAgaWYgKHBiaS0+bnVtX291dHB1dF9mcmFtZXMgPj0gTUFYX05VTV9TUEFUSUFMX0xBWUVSUykgeworICAgICAgICAgIC8vIFdlIGNhbid0IHN0b3JlIHRoZSBuZXcgZnJhbWUgYW55d2hlcmUsIHNvIGRyb3AgaXQgYW5kIHJldHVybiBhbgorICAgICAgICAgIC8vIGVycm9yCisgICAgICAgICAgY20tPmN1cl9mcmFtZS0+YnVmLmNvcnJ1cHRlZCA9IDE7CisgICAgICAgICAgZGVjcmVhc2VfcmVmX2NvdW50KHBiaSwgY20tPmN1cl9mcmFtZSwgcG9vbCk7CisgICAgICAgICAgY20tPmVycm9yLmVycm9yX2NvZGUgPSBBT01fQ09ERUNfVU5TVVBfQklUU1RSRUFNOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBiaS0+b3V0cHV0X2ZyYW1lc1twYmktPm51bV9vdXRwdXRfZnJhbWVzXSA9IGNtLT5jdXJfZnJhbWU7CisgICAgICAgICAgcGJpLT5udW1fb3V0cHV0X2ZyYW1lcysrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBSZXBsYWNlIGFueSBleGlzdGluZyBvdXRwdXQgZnJhbWUKKyAgICAgICAgYXNzZXJ0KHBiaS0+bnVtX291dHB1dF9mcmFtZXMgPT0gMCB8fCBwYmktPm51bV9vdXRwdXRfZnJhbWVzID09IDEpOworICAgICAgICBpZiAocGJpLT5udW1fb3V0cHV0X2ZyYW1lcyA+IDApIHsKKyAgICAgICAgICBkZWNyZWFzZV9yZWZfY291bnQocGJpLCBwYmktPm91dHB1dF9mcmFtZXNbMF0sIHBvb2wpOworICAgICAgICB9CisJaWYgKGNtLT5jdXJfZnJhbWUpIHsKKyAgICAgICAgICBwYmktPm91dHB1dF9mcmFtZXNbMF0gPSBjbS0+Y3VyX2ZyYW1lOworICAgICAgICAgIHBiaS0+bnVtX291dHB1dF9mcmFtZXMgPSAxOworCX0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZGVjcmVhc2VfcmVmX2NvdW50KHBiaSwgY20tPmN1cl9mcmFtZSwgcG9vbCk7CisgICAgfQorCisgICAgdW5sb2NrX2J1ZmZlcl9wb29sKHBvb2wsIGZsYWdzKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBUaGUgY29kZSBoZXJlIGFzc3VtZXMgd2UgYXJlIG5vdCBob2xkaW5nIHJlZmVyZW5jZSBidWZmZXJzIGluCisgICAgLy8gY20tPm5leHRfcmVmX2ZyYW1lX21hcC4gSWYgdGhpcyBhc3NlcnRpb24gZmFpbHMsIHdlIGFyZSBsZWFraW5nIHRoZQorICAgIC8vIGZyYW1lIGJ1ZmZlciByZWZlcmVuY2VzIGluIGNtLT5uZXh0X3JlZl9mcmFtZV9tYXAuCisgICAgYXNzZXJ0KElNUExJRVMoIXBiaS0+Y2FtZXJhX2ZyYW1lX2hlYWRlcl9yZWFkeSwgIXBiaS0+aG9sZF9yZWZfYnVmKSk7CisgICAgLy8gTm90aGluZyB3YXMgZGVjb2RlZCwgc28ganVzdCBkcm9wIHRoaXMgZnJhbWUgYnVmZmVyCisgICAgbG9ja19idWZmZXJfcG9vbChwb29sLCBmbGFncyk7CisgICAgZGVjcmVhc2VfcmVmX2NvdW50KHBiaSwgY20tPmN1cl9mcmFtZSwgcG9vbCk7CisgICAgdW5sb2NrX2J1ZmZlcl9wb29sKHBvb2wsIGZsYWdzKTsKKyAgfQorICBjbS0+Y3VyX2ZyYW1lID0gTlVMTDsKKworICBpZiAoIXBiaS0+Y2FtZXJhX2ZyYW1lX2hlYWRlcl9yZWFkeSkgeworICAgIHBiaS0+aG9sZF9yZWZfYnVmID0gMDsKKworICAgIC8vIEludmFsaWRhdGUgdGhlc2UgcmVmZXJlbmNlcyB1bnRpbCB0aGUgbmV4dCBmcmFtZSBzdGFydHMuCisgICAgZm9yIChyZWZfaW5kZXggPSAwOyByZWZfaW5kZXggPCBJTlRFUl9SRUZTX1BFUl9GUkFNRTsgcmVmX2luZGV4KyspIHsKKyAgICAgIGNtLT5yZW1hcHBlZF9yZWZfaWR4W3JlZl9pbmRleF0gPSBJTlZBTElEX0lEWDsKKyAgICB9CisgIH0KK30KKwordm9pZCBhb21faW50ZXJuYWxfZXJyb3Ioc3RydWN0IGFvbV9pbnRlcm5hbF9lcnJvcl9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgYW9tX2NvZGVjX2Vycl90IGVycm9yLCBjb25zdCBjaGFyICpmbXQsIC4uLikgeworICB2YV9saXN0IGFwOworCisgIGluZm8tPmVycm9yX2NvZGUgPSBlcnJvcjsKKyAgaW5mby0+aGFzX2RldGFpbCA9IDA7CisKKyAgaWYgKGZtdCkgeworICAgIHNpemVfdCBzeiA9IHNpemVvZihpbmZvLT5kZXRhaWwpOworCisgICAgaW5mby0+aGFzX2RldGFpbCA9IDE7CisgICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICAgdnNucHJpbnRmKGluZm8tPmRldGFpbCwgc3ogLSAxLCBmbXQsIGFwKTsKKyAgICB2YV9lbmQoYXApOworICAgIGluZm8tPmRldGFpbFtzeiAtIDFdID0gJ1wwJzsKKyAgfQorI2lmZGVmIE9SSV9DT0RFCisgIGlmIChpbmZvLT5zZXRqbXApIGxvbmdqbXAoaW5mby0+am1wLCBpbmZvLT5lcnJvcl9jb2RlKTsKKyNlbmRpZgorfQorCisjaWZkZWYgT1JJX0NPREUKK3ZvaWQgYXYxX3plcm9fdW51c2VkX2ludGVybmFsX2ZyYW1lX2J1ZmZlcnMoSW50ZXJuYWxGcmFtZUJ1ZmZlckxpc3QgKmxpc3QpIHsKKyAgaW50IGk7CisKKyAgYXNzZXJ0KGxpc3QgIT0gTlVMTCk7CisKKyAgZm9yIChpID0gMDsgaSA8IGxpc3QtPm51bV9pbnRlcm5hbF9mcmFtZV9idWZmZXJzOyArK2kpIHsKKyAgICBpZiAobGlzdC0+aW50X2ZiW2ldLmRhdGEgJiYgIWxpc3QtPmludF9mYltpXS5pbl91c2UpCisgICAgICBtZW1zZXQobGlzdC0+aW50X2ZiW2ldLmRhdGEsIDAsIGxpc3QtPmludF9mYltpXS5zaXplKTsKKyAgfQorfQorI2VuZGlmCisKKy8vIFJlbGVhc2UgdGhlIHJlZmVyZW5jZXMgdG8gdGhlIGZyYW1lIGJ1ZmZlcnMgaW4gY20tPnJlZl9mcmFtZV9tYXAgYW5kIHJlc2V0CisvLyBhbGwgZWxlbWVudHMgb2YgY20tPnJlZl9mcmFtZV9tYXAgdG8gTlVMTC4KK3N0YXRpYyB2b2lkIHJlc2V0X3JlZl9mcmFtZV9tYXAoQVYxRGVjb2RlciAqY29uc3QgcGJpKSB7CisgIEFWMV9DT01NT04gKmNvbnN0IGNtID0gcGJpLT5jb21tb247CisgIEJ1ZmZlclBvb2wgKmNvbnN0IHBvb2wgPSBjbS0+YnVmZmVyX3Bvb2w7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBSRUZfRlJBTUVTOyBpKyspIHsKKyAgICBkZWNyZWFzZV9yZWZfY291bnQocGJpLCBjbS0+cmVmX2ZyYW1lX21hcFtpXSwgcG9vbCk7CisgICAgY20tPnJlZl9mcmFtZV9tYXBbaV0gPSBOVUxMOworI2lmZGVmIEFNTAorICAgIGNtLT5uZXh0X3VzZWRfcmVmX2ZyYW1lX21hcFtpXSA9IE5VTEw7CisjZW5kaWYKKyAgfQorfQorCisvLyBHZW5lcmF0ZSBuZXh0X3JlZl9mcmFtZV9tYXAuCitzdGF0aWMgdm9pZCBnZW5lcmF0ZV9uZXh0X3JlZl9mcmFtZV9tYXAoQVYxRGVjb2RlciAqY29uc3QgcGJpKSB7CisgIEFWMV9DT01NT04gKmNvbnN0IGNtID0gcGJpLT5jb21tb247CisgIEJ1ZmZlclBvb2wgKmNvbnN0IHBvb2wgPSBjbS0+YnVmZmVyX3Bvb2w7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIGludCByZWZfaW5kZXggPSAwOworICBpbnQgbWFzazsKKworICBsb2NrX2J1ZmZlcl9wb29sKHBvb2wsIGZsYWdzKTsKKyAgLy8gY20tPm5leHRfcmVmX2ZyYW1lX21hcCBob2xkcyByZWZlcmVuY2VzIHRvIGZyYW1lIGJ1ZmZlcnMuIEFmdGVyIHN0b3JpbmcgYQorICAvLyBmcmFtZSBidWZmZXIgaW5kZXggaW4gY20tPm5leHRfcmVmX2ZyYW1lX21hcCwgd2UgbmVlZCB0byBpbmNyZWFzZSB0aGUKKyAgLy8gZnJhbWUgYnVmZmVyJ3MgcmVmX2NvdW50LgorICBmb3IgKG1hc2sgPSBjbS0+Y3VycmVudF9mcmFtZS5yZWZyZXNoX2ZyYW1lX2ZsYWdzOyBtYXNrOyBtYXNrID4+PSAxKSB7CisgICAgaWYgKG1hc2sgJiAxKSB7CisgICAgICBjbS0+bmV4dF9yZWZfZnJhbWVfbWFwW3JlZl9pbmRleF0gPSBjbS0+Y3VyX2ZyYW1lOworICAgIH0gZWxzZSB7CisgICAgICBjbS0+bmV4dF9yZWZfZnJhbWVfbWFwW3JlZl9pbmRleF0gPSBjbS0+cmVmX2ZyYW1lX21hcFtyZWZfaW5kZXhdOworICAgIH0KKyAgICBpZiAoY20tPm5leHRfcmVmX2ZyYW1lX21hcFtyZWZfaW5kZXhdICE9IE5VTEwpCisgICAgICArK2NtLT5uZXh0X3JlZl9mcmFtZV9tYXBbcmVmX2luZGV4XS0+cmVmX2NvdW50OworICAgICsrcmVmX2luZGV4OworICB9CisKKyAgZm9yICg7IHJlZl9pbmRleCA8IFJFRl9GUkFNRVM7ICsrcmVmX2luZGV4KSB7CisgICAgY20tPm5leHRfcmVmX2ZyYW1lX21hcFtyZWZfaW5kZXhdID0gY20tPnJlZl9mcmFtZV9tYXBbcmVmX2luZGV4XTsKKyAgICBpZiAoY20tPm5leHRfcmVmX2ZyYW1lX21hcFtyZWZfaW5kZXhdICE9IE5VTEwpCisgICAgICArK2NtLT5uZXh0X3JlZl9mcmFtZV9tYXBbcmVmX2luZGV4XS0+cmVmX2NvdW50OworICB9CisgIHVubG9ja19idWZmZXJfcG9vbChwb29sLCBmbGFncyk7CisgIHBiaS0+aG9sZF9yZWZfYnVmID0gMTsKK30KKworLy8gSWYgdGhlIHJlZnJlc2hfZnJhbWVfZmxhZ3MgYml0bWFzayBpcyBzZXQsIHVwZGF0ZSByZWZlcmVuY2UgZnJhbWUgaWQgdmFsdWVzCisvLyBhbmQgbWFyayBmcmFtZXMgYXMgdmFsaWQgZm9yIHJlZmVyZW5jZS4KK3N0YXRpYyB2b2lkIHVwZGF0ZV9yZWZfZnJhbWVfaWQoQVYxX0NPTU1PTiAqY29uc3QgY20sIGludCBmcmFtZV9pZCkgeworICBpbnQgaTsKKyAgaW50IHJlZnJlc2hfZnJhbWVfZmxhZ3MgPSBjbS0+Y3VycmVudF9mcmFtZS5yZWZyZXNoX2ZyYW1lX2ZsYWdzOworICBhc3NlcnQoY20tPnNlcV9wYXJhbXMuZnJhbWVfaWRfbnVtYmVyc19wcmVzZW50X2ZsYWcpOworICBmb3IgKGkgPSAwOyBpIDwgUkVGX0ZSQU1FUzsgaSsrKSB7CisgICAgaWYgKChyZWZyZXNoX2ZyYW1lX2ZsYWdzID4+IGkpICYgMSkgeworICAgICAgY20tPnJlZl9mcmFtZV9pZFtpXSA9IGZyYW1lX2lkOworICAgICAgY20tPnZhbGlkX2Zvcl9yZWZlcmVuY2luZ1tpXSA9IDE7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfZXhpc3RpbmdfZnJhbWVfcmVzZXQoQVYxRGVjb2RlciAqY29uc3QgcGJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhpc3RpbmdfZnJhbWVfaWR4KSB7CisgIEFWMV9DT01NT04gKmNvbnN0IGNtID0gcGJpLT5jb21tb247CisgIGludCBpOworICBhc3NlcnQoY20tPnNob3dfZXhpc3RpbmdfZnJhbWUpOworCisgIGNtLT5jdXJyZW50X2ZyYW1lLmZyYW1lX3R5cGUgPSBLRVlfRlJBTUU7CisKKyAgY20tPmN1cnJlbnRfZnJhbWUucmVmcmVzaF9mcmFtZV9mbGFncyA9ICgxIDw8IFJFRl9GUkFNRVMpIC0gMTsKKworICBmb3IgKGkgPSAwOyBpIDwgSU5URVJfUkVGU19QRVJfRlJBTUU7ICsraSkgeworICAgIGNtLT5yZW1hcHBlZF9yZWZfaWR4W2ldID0gSU5WQUxJRF9JRFg7CisgIH0KKworICBpZiAocGJpLT5uZWVkX3Jlc3luYykgeworICAgIHJlc2V0X3JlZl9mcmFtZV9tYXAocGJpKTsKKyAgICBwYmktPm5lZWRfcmVzeW5jID0gMDsKKyAgfQorCisgIC8vIE5vdGUgdGhhdCB0aGUgZGlzcGxheWVkIGZyYW1lIG11c3QgYmUgdmFsaWQgZm9yIHJlZmVyZW5jaW5nIGluIG9yZGVyIHRvCisgIC8vIGhhdmUgYmVlbiBzZWxlY3RlZC4KKyAgaWYgKGNtLT5zZXFfcGFyYW1zLmZyYW1lX2lkX251bWJlcnNfcHJlc2VudF9mbGFnKSB7CisgICAgY20tPmN1cnJlbnRfZnJhbWVfaWQgPSBjbS0+cmVmX2ZyYW1lX2lkW2V4aXN0aW5nX2ZyYW1lX2lkeF07CisgICAgdXBkYXRlX3JlZl9mcmFtZV9pZChjbSwgY20tPmN1cnJlbnRfZnJhbWVfaWQpOworICB9CisKKyAgY20tPnJlZnJlc2hfZnJhbWVfY29udGV4dCA9IFJFRlJFU0hfRlJBTUVfQ09OVEVYVF9ESVNBQkxFRDsKKworICBnZW5lcmF0ZV9uZXh0X3JlZl9mcmFtZV9tYXAocGJpKTsKKworI2lmZGVmIE9SSV9DT0RFCisgIC8vIFJlbG9hZCB0aGUgYWRhcHRlZCBDREZzIGZyb20gd2hlbiB3ZSBvcmlnaW5hbGx5IGNvZGVkIHRoaXMga2V5ZnJhbWUKKyAgKmNtLT5mYyA9IGNtLT5uZXh0X3JlZl9mcmFtZV9tYXBbZXhpc3RpbmdfZnJhbWVfaWR4XS0+ZnJhbWVfY29udGV4dDsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCByZXNldF9mcmFtZV9idWZmZXJzKEFWMURlY29kZXIgKmNvbnN0IHBiaSkgeworICBBVjFfQ09NTU9OICpjb25zdCBjbSA9IHBiaS0+Y29tbW9uOworICBSZWZDbnRCdWZmZXIgKmNvbnN0IGZyYW1lX2J1ZnMgPSBjbS0+YnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnM7CisgIGludCBpOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgIC8vIFdlIGhhdmUgbm90IHN0b3JlZCBhbnkgcmVmZXJlbmNlcyB0byBmcmFtZSBidWZmZXJzIGluCisgIC8vIGNtLT5uZXh0X3JlZl9mcmFtZV9tYXAsIHNvIHdlIGNhbiBkaXJlY3RseSByZXNldCBpdCB0byBhbGwgTlVMTC4KKyAgZm9yIChpID0gMDsgaSA8IFJFRl9GUkFNRVM7ICsraSkgeworICAgIGNtLT5uZXh0X3JlZl9mcmFtZV9tYXBbaV0gPSBOVUxMOworICB9CisKKyAgbG9ja19idWZmZXJfcG9vbChjbS0+YnVmZmVyX3Bvb2wsIGZsYWdzKTsKKyAgcmVzZXRfcmVmX2ZyYW1lX21hcChwYmkpOworICBhc3NlcnQoY20tPmN1cl9mcmFtZS0+cmVmX2NvdW50ID09IDEpOworICBmb3IgKGkgPSAwOyBpIDwgRlJBTUVfQlVGRkVSUzsgKytpKSB7CisgICAgLy8gUmVzZXQgYWxsIHVucmVmZXJlbmNlZCBmcmFtZSBidWZmZXJzLiBXZSBjYW4gYWxzbyByZXNldCBjbS0+Y3VyX2ZyYW1lCisgICAgLy8gYmVjYXVzZSB3ZSBhcmUgdGhlIHNvbGUgb3duZXIgb2YgY20tPmN1cl9mcmFtZS4KKyAgICBpZiAoZnJhbWVfYnVmc1tpXS5yZWZfY291bnQgPiAwICYmICZmcmFtZV9idWZzW2ldICE9IGNtLT5jdXJfZnJhbWUpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBmcmFtZV9idWZzW2ldLm9yZGVyX2hpbnQgPSAwOworICAgIGF2MV96ZXJvKGZyYW1lX2J1ZnNbaV0ucmVmX29yZGVyX2hpbnRzKTsKKyAgfQorI2lmZGVmIE9SSV9DT0RFCisgIGF2MV96ZXJvX3VudXNlZF9pbnRlcm5hbF9mcmFtZV9idWZmZXJzKCZjbS0+YnVmZmVyX3Bvb2wtPmludF9mcmFtZV9idWZmZXJzKTsKKyNlbmRpZgorICB1bmxvY2tfYnVmZmVyX3Bvb2woY20tPmJ1ZmZlcl9wb29sLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgZnJhbWVfaXNfaW50cmFfb25seShjb25zdCBBVjFfQ09NTU9OICpjb25zdCBjbSkgeworICByZXR1cm4gY20tPmN1cnJlbnRfZnJhbWUuZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUgfHwKKyAgICAgIGNtLT5jdXJyZW50X2ZyYW1lLmZyYW1lX3R5cGUgPT0gSU5UUkFfT05MWV9GUkFNRTsKK30KKworc3RhdGljIGludCBmcmFtZV9pc19zZnJhbWUoY29uc3QgQVYxX0NPTU1PTiAqY20pIHsKKyAgcmV0dXJuIGNtLT5jdXJyZW50X2ZyYW1lLmZyYW1lX3R5cGUgPT0gU19GUkFNRTsKK30KKworLy8gVGhlc2UgZnVuY3Rpb25zIHRha2UgYSByZWZlcmVuY2UgZnJhbWUgbGFiZWwgYmV0d2VlbiBMQVNUX0ZSQU1FIGFuZAorLy8gRVhUUkVGX0ZSQU1FIGluY2x1c2l2ZS4gIE5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudCB0byB0aGUgaW5kZXhpbmcKKy8vIHByZXZpb3VzbHkgdXNlZCBieSB0aGUgZnJhbWVfcmVmc1tdIGFycmF5Lgorc3RhdGljIGludCBnZXRfcmVmX2ZyYW1lX21hcF9pZHgoY29uc3QgQVYxX0NPTU1PTiAqY29uc3QgY20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTVZfUkVGRVJFTkNFX0ZSQU1FIHJlZl9mcmFtZSkgeworICByZXR1cm4gKHJlZl9mcmFtZSA+PSBMQVNUX0ZSQU1FICYmIHJlZl9mcmFtZSA8PSBFWFRSRUZfRlJBTUUpCisgICAgICAgICAgICAgPyBjbS0+cmVtYXBwZWRfcmVmX2lkeFtyZWZfZnJhbWUgLSBMQVNUX0ZSQU1FXQorICAgICAgICAgICAgIDogSU5WQUxJRF9JRFg7Cit9CisKK3N0YXRpYyBSZWZDbnRCdWZmZXIgKmdldF9yZWZfZnJhbWVfYnVmKAorICAgIGNvbnN0IEFWMV9DT01NT04gKmNvbnN0IGNtLCBjb25zdCBNVl9SRUZFUkVOQ0VfRlJBTUUgcmVmX2ZyYW1lKSB7CisgIGNvbnN0IGludCBtYXBfaWR4ID0gZ2V0X3JlZl9mcmFtZV9tYXBfaWR4KGNtLCByZWZfZnJhbWUpOworICByZXR1cm4gKG1hcF9pZHggIT0gSU5WQUxJRF9JRFgpID8gY20tPnJlZl9mcmFtZV9tYXBbbWFwX2lkeF0gOiBOVUxMOworfQorI2lmZGVmIFNVUFBPUlRfU0NBTEVfRkFDVE9SCitzdGF0aWMgc3RydWN0IHNjYWxlX2ZhY3RvcnMgKmdldF9yZWZfc2NhbGVfZmFjdG9ycygKKyAgICBBVjFfQ09NTU9OICpjb25zdCBjbSwgY29uc3QgTVZfUkVGRVJFTkNFX0ZSQU1FIHJlZl9mcmFtZSkgeworICBjb25zdCBpbnQgbWFwX2lkeCA9IGdldF9yZWZfZnJhbWVfbWFwX2lkeChjbSwgcmVmX2ZyYW1lKTsKKyAgcmV0dXJuIChtYXBfaWR4ICE9IElOVkFMSURfSURYKSA/ICZjbS0+cmVmX3NjYWxlX2ZhY3RvcnNbbWFwX2lkeF0gOiBOVUxMOworfQorI2VuZGlmCitzdGF0aWMgUmVmQ250QnVmZmVyICpnZXRfcHJpbWFyeV9yZWZfZnJhbWVfYnVmKAorICAgIGNvbnN0IEFWMV9DT01NT04gKmNvbnN0IGNtKSB7CisgIGludCBtYXBfaWR4OworICBpZiAoY20tPnByaW1hcnlfcmVmX2ZyYW1lID09IFBSSU1BUllfUkVGX05PTkUpIHJldHVybiBOVUxMOworICBtYXBfaWR4ID0gZ2V0X3JlZl9mcmFtZV9tYXBfaWR4KGNtLCBjbS0+cHJpbWFyeV9yZWZfZnJhbWUgKyAxKTsKKyAgcmV0dXJuIChtYXBfaWR4ICE9IElOVkFMSURfSURYKSA/IGNtLT5yZWZfZnJhbWVfbWFwW21hcF9pZHhdIDogTlVMTDsKK30KKworc3RhdGljIGludCBnZXRfcmVsYXRpdmVfZGlzdChjb25zdCBPcmRlckhpbnRJbmZvICpvaCwgaW50IGEsIGludCBiKSB7CisgIGludCBiaXRzOworICBpbnQgbTsKKyAgaW50IGRpZmY7CisgIGlmICghb2gtPmVuYWJsZV9vcmRlcl9oaW50KSByZXR1cm4gMDsKKworICBiaXRzID0gb2gtPm9yZGVyX2hpbnRfYml0c19taW51c18xICsgMTsKKworICBhc3NlcnQoYml0cyA+PSAxKTsKKyAgYXNzZXJ0KGEgPj0gMCAmJiBhIDwgKDEgPDwgYml0cykpOworICBhc3NlcnQoYiA+PSAwICYmIGIgPCAoMSA8PCBiaXRzKSk7CisKKyAgZGlmZiA9IGEgLSBiOworICBtID0gMSA8PCAoYml0cyAtIDEpOworICBkaWZmID0gKGRpZmYgJiAobSAtIDEpKSAtIChkaWZmICYgbSk7CisgIHJldHVybiBkaWZmOworfQorCisKK3ZvaWQgYXYxX3JlYWRfZnJhbWVfc2l6ZSh1bmlvbiBwYXJhbV91ICpwYXJhbXMsIGludCBudW1fYml0c193aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2JpdHNfaGVpZ2h0LCBpbnQgKndpZHRoLCBpbnQgKmhlaWdodCwgaW50KiBkZWNfd2lkdGgpIHsKKyAgKndpZHRoID0gcGFyYW1zLT5wLmZyYW1lX3dpZHRoOworICAqaGVpZ2h0ID0gcGFyYW1zLT5wLmZyYW1lX2hlaWdodDsvL2FvbV9yYl9yZWFkX2xpdGVyYWwocmIsIG51bV9iaXRzX2hlaWdodCkgKyAxOworI2lmZGVmIEFNTAorICAqZGVjX3dpZHRoID0gcGFyYW1zLT5wLmRlY19mcmFtZV93aWR0aDsKKyNlbmRpZgorfQorCitzdGF0aWMgUkVGRVJFTkNFX01PREUgcmVhZF9mcmFtZV9yZWZlcmVuY2VfbW9kZSgKKyAgICBjb25zdCBBVjFfQ09NTU9OICpjbSwgdW5pb24gcGFyYW1fdSAqcGFyYW1zKSB7CisgIGlmIChmcmFtZV9pc19pbnRyYV9vbmx5KGNtKSkgeworICAgIHJldHVybiBTSU5HTEVfUkVGRVJFTkNFOworICB9IGVsc2UgeworICAgIHJldHVybiBwYXJhbXMtPnAucmVmZXJlbmNlX21vZGUgPyBSRUZFUkVOQ0VfTU9ERV9TRUxFQ1QgOiBTSU5HTEVfUkVGRVJFTkNFOworICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNhbGNfbWlfc2l6ZShpbnQgbGVuKSB7CisgIC8vIGxlbiBpcyBpbiBtaSB1bml0cy4gQWxpZ24gdG8gYSBtdWx0aXBsZSBvZiBTQnMuCisgIHJldHVybiBBTElHTl9QT1dFUl9PRl9UV08obGVuLCBNQVhfTUlCX1NJWkVfTE9HMik7Cit9CisKK3ZvaWQgYXYxX3NldF9tYl9taShBVjFfQ09NTU9OICpjbSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgIC8vIEVuc3VyZSB0aGF0IHRoZSBkZWNvZGVkIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGJvdGggbXVsdGlwbGVzIG9mCisgIC8vIDggbHVtYSBwaXhlbHMgKG5vdGU6IHRoaXMgbWF5IG9ubHkgYmUgYSBtdWx0aXBsZSBvZiA0IGNocm9tYSBwaXhlbHMgaWYKKyAgLy8gc3Vic2FtcGxpbmcgaXMgdXNlZCkuCisgIC8vIFRoaXMgc2ltcGxpZmllcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdmFyaW91cyBleHBlcmltZW50cywKKyAgLy8gZWcuIGNkZWYsIHdoaWNoIG9wZXJhdGVzIG9uIHVuaXRzIG9mIDh4OCBsdW1hIHBpeGVscy4KKyAgY29uc3QgaW50IGFsaWduZWRfd2lkdGggPSBBTElHTl9QT1dFUl9PRl9UV08od2lkdGgsIDMpOworICBjb25zdCBpbnQgYWxpZ25lZF9oZWlnaHQgPSBBTElHTl9QT1dFUl9PRl9UV08oaGVpZ2h0LCAzKTsKKyAgYXYxX3ByaW50MihBVjFfREVCVUdfQlVGTUdSX0RFVEFJTCwgIiBbUElDVFVSRV0gYXYxX3NldF9tYl9taSAoJWQgWCAlZClcbiIsIHdpZHRoLCBoZWlnaHQpOworCisgIGNtLT5taV9jb2xzID0gYWxpZ25lZF93aWR0aCA+PiBNSV9TSVpFX0xPRzI7CisgIGNtLT5taV9yb3dzID0gYWxpZ25lZF9oZWlnaHQgPj4gTUlfU0laRV9MT0cyOworICBjbS0+bWlfc3RyaWRlID0gY2FsY19taV9zaXplKGNtLT5taV9jb2xzKTsKKworICBjbS0+bWJfY29scyA9IChjbS0+bWlfY29scyArIDIpID4+IDI7CisgIGNtLT5tYl9yb3dzID0gKGNtLT5taV9yb3dzICsgMikgPj4gMjsKKyAgY20tPk1CcyA9IGNtLT5tYl9yb3dzICogY20tPm1iX2NvbHM7CisKKyNpZiBDT05GSUdfTFBGX01BU0sKKyAgYWxsb2NfbG9vcF9maWx0ZXJfbWFzayhjbSk7CisjZW5kaWYKK30KKworaW50IGF2MV9hbGxvY19jb250ZXh0X2J1ZmZlcnMoQVYxX0NPTU1PTiAqY20sIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworI2lmZGVmIE9SSV9DT0RFCisgIGludCBuZXdfbWlfc2l6ZTsKKyNlbmRpZgorICBhdjFfc2V0X21iX21pKGNtLCB3aWR0aCwgaGVpZ2h0KTsKKyNpZmRlZiBPUklfQ09ERQorICBuZXdfbWlfc2l6ZSA9IGNtLT5taV9zdHJpZGUgKiBjYWxjX21pX3NpemUoY20tPm1pX3Jvd3MpOworICBpZiAoY20tPm1pX2FsbG9jX3NpemUgPCBuZXdfbWlfc2l6ZSkgeworICAgIGNtLT5mcmVlX21pKGNtKTsKKyAgICBpZiAoY20tPmFsbG9jX21pKGNtLCBuZXdfbWlfc2l6ZSkpIGdvdG8gZmFpbDsKKyAgfQorI2VuZGlmCisgIHJldHVybiAwOworCisjaWZkZWYgT1JJX0NPREUKK2ZhaWw6CisjZW5kaWYKKyAgLy8gY2xlYXIgdGhlIG1pXyogdmFsdWVzIHRvIGZvcmNlIGEgcmVhbGxvYyBvbiByZXN5bmMKKyAgYXYxX3NldF9tYl9taShjbSwgMCwgMCk7CisjaWZkZWYgT1JJX0NPREUKKyAgYXYxX2ZyZWVfY29udGV4dF9idWZmZXJzKGNtKTsKKyNlbmRpZgorICByZXR1cm4gMTsKK30KKworI2lmbmRlZiBVU0VfU0NBTEVEX1dJRFRIX0ZST01fVUNPREUKK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZV9zY2FsZWRfc2l6ZV9oZWxwZXIoaW50ICpkaW0sIGludCBkZW5vbSkgeworICBpZiAoZGVub20gIT0gU0NBTEVfTlVNRVJBVE9SKSB7CisgICAgLy8gV2UgbmVlZCB0byBlbnN1cmUgdGhlIGNvbnN0cmFpbnQgaW4gIkFwcGVuZGl4IEEiIG9mIHRoZSBzcGVjOgorICAgIC8vICogRnJhbWVXaWR0aCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMTYKKyAgICAvLyAqIEZyYW1lSGVpZ2h0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxNgorICAgIC8vIEZvciB0aGlzLCB3ZSBjbGFtcCB0aGUgZG93bnNjYWxlZCBkaW1lbnNpb24gdG8gYXQgbGVhc3QgMTYuIE9uZQorICAgIC8vIGV4Y2VwdGlvbjogaWYgb3JpZ2luYWwgZGltZW5zaW9uIGl0c2VsZiB3YXMgPCAxNiwgdGhlbiB3ZSBrZWVwIHRoZQorICAgIC8vIGRvd25zY2FsZWQgZGltZW5zaW9uIHRvIGJlIHNhbWUgYXMgdGhlIG9yaWdpbmFsLCB0byBlbnN1cmUgdGhhdCByZXNpemluZworICAgIC8vIGlzIHZhbGlkLgorICAgIGNvbnN0IGludCBtaW5fZGltID0gQU9NTUlOKDE2LCAqZGltKTsKKyAgICAvLyBVc2UgdGhpcyB2ZXJzaW9uIGlmIHdlIG5lZWQgKmRpbSB0byBiZSBldmVuCisgICAgLy8gKndpZHRoID0gKCp3aWR0aCAqIFNDQUxFX05VTUVSQVRPUiArIGRlbm9tKSAvICgyICogZGVub20pOworICAgIC8vICp3aWR0aCA8PD0gMTsKKyAgICAqZGltID0gKCpkaW0gKiBTQ0FMRV9OVU1FUkFUT1IgKyBkZW5vbSAvIDIpIC8gKGRlbm9tKTsKKyAgICAqZGltID0gQU9NTUFYKCpkaW0sIG1pbl9kaW0pOworICB9Cit9CisjaWZkZWYgT1JJX0NPREUKK3ZvaWQgYXYxX2NhbGN1bGF0ZV9zY2FsZWRfc2l6ZShpbnQgKndpZHRoLCBpbnQgKmhlaWdodCwgaW50IHJlc2l6ZV9kZW5vbSkgeworICBjYWxjdWxhdGVfc2NhbGVkX3NpemVfaGVscGVyKHdpZHRoLCByZXNpemVfZGVub20pOworICBjYWxjdWxhdGVfc2NhbGVkX3NpemVfaGVscGVyKGhlaWdodCwgcmVzaXplX2Rlbm9tKTsKK30KKyNlbmRpZgordm9pZCBhdjFfY2FsY3VsYXRlX3NjYWxlZF9zdXBlcnJlc19zaXplKGludCAqd2lkdGgsIGludCAqaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdXBlcnJlc19kZW5vbSkgeworICAodm9pZCloZWlnaHQ7CisgIGNhbGN1bGF0ZV9zY2FsZWRfc2l6ZV9oZWxwZXIod2lkdGgsIHN1cGVycmVzX2Rlbm9tKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzZXR1cF9zdXBlcnJlcyhBVjFfQ09NTU9OICpjb25zdCBjbSwgdW5pb24gcGFyYW1fdSAqcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp3aWR0aCwgaW50ICpoZWlnaHQpIHsKKyNpZmRlZiBVU0VfU0NBTEVEX1dJRFRIX0ZST01fVUNPREUKKyAgY20tPnN1cGVycmVzX3Vwc2NhbGVkX3dpZHRoID0gcGFyYW1zLT5wLmZyYW1lX3dpZHRoX3NjYWxlZDsKKyAgY20tPnN1cGVycmVzX3Vwc2NhbGVkX2hlaWdodCA9IHBhcmFtcy0+cC5mcmFtZV9oZWlnaHQ7CisKKworICAqd2lkdGggPSBwYXJhbXMtPnAuZGVjX2ZyYW1lX3dpZHRoOworICAqaGVpZ2h0ID0gcGFyYW1zLT5wLmZyYW1lX2hlaWdodDsKKyAgYXYxX3ByaW50MihBVjFfREVCVUdfQlVGTUdSX0RFVEFJTCwgIiBbUElDVFVSRV0gc2V0IGRlY29kaW5nIHNpemUgdG8gKCVkIFggJWQpIHNjYWxlZCBzaXplIHRvICglZCBYICVkKVxuIiwKKwkqd2lkdGgsICpoZWlnaHQsCisJY20tPnN1cGVycmVzX3Vwc2NhbGVkX3dpZHRoLAorCWNtLT5zdXBlcnJlc191cHNjYWxlZF9oZWlnaHQpOworI2Vsc2UKKyAgY20tPnN1cGVycmVzX3Vwc2NhbGVkX3dpZHRoID0gKndpZHRoOworICBjbS0+c3VwZXJyZXNfdXBzY2FsZWRfaGVpZ2h0ID0gKmhlaWdodDsKKworICBjb25zdCBTZXF1ZW5jZUhlYWRlciAqY29uc3Qgc2VxX3BhcmFtcyA9ICZjbS0+c2VxX3BhcmFtczsKKyAgaWYgKCFzZXFfcGFyYW1zLT5lbmFibGVfc3VwZXJyZXMpIHJldHVybjsKKworICAvL2lmIChhb21fcmJfcmVhZF9iaXQoLTEsIGRlZm1hcmssIHJiKSkgeworICBpZiAocGFyYW1zLT5wLnN1cGVycmVzX3NjYWxlX2Rlbm9taW5hdG9yICE9IFNDQUxFX05VTUVSQVRPUikgeworI2lmZGVmIE9SSV9DT0RFCisgICAgY20tPnN1cGVycmVzX3NjYWxlX2Rlbm9taW5hdG9yID0KKyAgICAgICAgKHVpbnQ4X3QpYW9tX3JiX3JlYWRfbGl0ZXJhbCgtMSwgZGVmbWFyaywgcmIsIFNVUEVSUkVTX1NDQUxFX0JJVFMpOworICAgIGNtLT5zdXBlcnJlc19zY2FsZV9kZW5vbWluYXRvciArPSBTVVBFUlJFU19TQ0FMRV9ERU5PTUlOQVRPUl9NSU47CisjZWxzZQorICAgIGNtLT5zdXBlcnJlc19zY2FsZV9kZW5vbWluYXRvciA9IHBhcmFtcy0+cC5zdXBlcnJlc19zY2FsZV9kZW5vbWluYXRvcjsKKyNlbmRpZgorICAgIC8vIERvbid0IGVkaXQgY20tPndpZHRoIG9yIGNtLT5oZWlnaHQgZGlyZWN0bHksIG9yIHRoZSBidWZmZXJzIHdvbid0IGdldAorICAgIC8vIHJlc2l6ZWQgY29ycmVjdGx5CisgICAgYXYxX2NhbGN1bGF0ZV9zY2FsZWRfc3VwZXJyZXNfc2l6ZSh3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPnN1cGVycmVzX3NjYWxlX2Rlbm9taW5hdG9yKTsKKyAgfSBlbHNlIHsKKyAgICAvLyAxOjEgc2NhbGluZyAtIGllLiBubyBzY2FsaW5nLCBzY2FsZSBub3QgcHJvdmlkZWQKKyAgICBjbS0+c3VwZXJyZXNfc2NhbGVfZGVub21pbmF0b3IgPSBTQ0FMRV9OVU1FUkFUT1I7CisgIH0KKy8qIVVTRV9TQ0FMRURfV0lEVEhfRlJPTV9VQ09ERSovCisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgcmVzaXplX2NvbnRleHRfYnVmZmVycyhBVjFfQ09NTU9OICpjbSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisjaWYgQ09ORklHX1NJWkVfTElNSVQKKyAgaWYgKHdpZHRoID4gREVDT0RFX1dJRFRIX0xJTUlUIHx8IGhlaWdodCA+IERFQ09ERV9IRUlHSFRfTElNSVQpCisgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAiRGltZW5zaW9ucyBvZiAlZHglZCBiZXlvbmQgYWxsb3dlZCBzaXplIG9mICVkeCVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIERFQ09ERV9XSURUSF9MSU1JVCwgREVDT0RFX0hFSUdIVF9MSU1JVCk7CisjZW5kaWYKKyAgaWYgKGNtLT53aWR0aCAhPSB3aWR0aCB8fCBjbS0+aGVpZ2h0ICE9IGhlaWdodCkgeworICAgIGNvbnN0IGludCBuZXdfbWlfcm93cyA9CisgICAgICAgIEFMSUdOX1BPV0VSX09GX1RXTyhoZWlnaHQsIE1JX1NJWkVfTE9HMikgPj4gTUlfU0laRV9MT0cyOworICAgIGNvbnN0IGludCBuZXdfbWlfY29scyA9CisgICAgICAgIEFMSUdOX1BPV0VSX09GX1RXTyh3aWR0aCwgTUlfU0laRV9MT0cyKSA+PiBNSV9TSVpFX0xPRzI7CisKKyAgICAvLyBBbGxvY2F0aW9ucyBpbiBhdjFfYWxsb2NfY29udGV4dF9idWZmZXJzKCkgZGVwZW5kIG9uIGluZGl2aWR1YWwKKyAgICAvLyBkaW1lbnNpb25zIGFzIHdlbGwgYXMgdGhlIG92ZXJhbGwgc2l6ZS4KKyAgICBpZiAobmV3X21pX2NvbHMgPiBjbS0+bWlfY29scyB8fCBuZXdfbWlfcm93cyA+IGNtLT5taV9yb3dzKSB7CisgICAgICBpZiAoYXYxX2FsbG9jX2NvbnRleHRfYnVmZmVycyhjbSwgd2lkdGgsIGhlaWdodCkpIHsKKyAgICAgICAgLy8gVGhlIGNtLT5taV8qIHZhbHVlcyBoYXZlIGJlZW4gY2xlYXJlZCBhbmQgYW55IGV4aXN0aW5nIGNvbnRleHQKKyAgICAgICAgLy8gYnVmZmVycyBoYXZlIGJlZW4gZnJlZWQuIENsZWFyIGNtLT53aWR0aCBhbmQgY20tPmhlaWdodCB0byBiZQorICAgICAgICAvLyBjb25zaXN0ZW50IGFuZCB0byBmb3JjZSBhIHJlYWxsb2MgbmV4dCB0aW1lLgorICAgICAgICBjbS0+d2lkdGggPSAwOworICAgICAgICBjbS0+aGVpZ2h0ID0gMDsKKyAgICAgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19NRU1fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIGNvbnRleHQgYnVmZmVycyIpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBhdjFfc2V0X21iX21pKGNtLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB9CisjaWZkZWYgT1JJX0NPREUKKyAgICBhdjFfaW5pdF9jb250ZXh0X2J1ZmZlcnMoY20pOworI2VuZGlmCisgICAgY20tPndpZHRoID0gd2lkdGg7CisgICAgY20tPmhlaWdodCA9IGhlaWdodDsKKyAgfQorCisjaWZkZWYgT1JJX0NPREUKKyAgZW5zdXJlX212X2J1ZmZlcihjbS0+Y3VyX2ZyYW1lLCBjbSk7CisjZW5kaWYKKyAgY20tPmN1cl9mcmFtZS0+d2lkdGggPSBjbS0+d2lkdGg7CisgIGNtLT5jdXJfZnJhbWUtPmhlaWdodCA9IGNtLT5oZWlnaHQ7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX2J1ZmZlcl9wb29sKEFWMV9DT01NT04gKmNtKSB7CisgIEJ1ZmZlclBvb2wgKmNvbnN0IHBvb2wgPSBjbS0+YnVmZmVyX3Bvb2w7CisgIGNvbnN0IFNlcXVlbmNlSGVhZGVyICpjb25zdCBzZXFfcGFyYW1zID0gJmNtLT5zZXFfcGFyYW1zOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgIGxvY2tfYnVmZmVyX3Bvb2wocG9vbCwgZmxhZ3MpOworICBpZiAoYW9tX3JlYWxsb2NfZnJhbWVfYnVmZmVyKGNtLCAmY20tPmN1cl9mcmFtZS0+YnVmLAorICAgIGNtLT53aWR0aCwgY20tPmhlaWdodCwgY20tPmN1cl9mcmFtZS0+b3JkZXJfaGludCkpIHsKKyAgICB1bmxvY2tfYnVmZmVyX3Bvb2wocG9vbCwgZmxhZ3MpOworICAgIGFvbV9pbnRlcm5hbF9lcnJvcigmY20tPmVycm9yLCBBT01fQ09ERUNfTUVNX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIGZyYW1lIGJ1ZmZlciIpOworICB9CisgIHVubG9ja19idWZmZXJfcG9vbChwb29sLCBmbGFncyk7CisKKyAgY20tPmN1cl9mcmFtZS0+YnVmLmJpdF9kZXB0aCA9ICh1bnNpZ25lZCBpbnQpc2VxX3BhcmFtcy0+Yml0X2RlcHRoOworICBjbS0+Y3VyX2ZyYW1lLT5idWYuY29sb3JfcHJpbWFyaWVzID0gc2VxX3BhcmFtcy0+Y29sb3JfcHJpbWFyaWVzOworICBjbS0+Y3VyX2ZyYW1lLT5idWYudHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzID0KKyAgICAgIHNlcV9wYXJhbXMtPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKKyAgY20tPmN1cl9mcmFtZS0+YnVmLm1hdHJpeF9jb2VmZmljaWVudHMgPSBzZXFfcGFyYW1zLT5tYXRyaXhfY29lZmZpY2llbnRzOworICBjbS0+Y3VyX2ZyYW1lLT5idWYubW9ub2Nocm9tZSA9IHNlcV9wYXJhbXMtPm1vbm9jaHJvbWU7CisgIGNtLT5jdXJfZnJhbWUtPmJ1Zi5jaHJvbWFfc2FtcGxlX3Bvc2l0aW9uID0KKyAgICAgIHNlcV9wYXJhbXMtPmNocm9tYV9zYW1wbGVfcG9zaXRpb247CisgIGNtLT5jdXJfZnJhbWUtPmJ1Zi5jb2xvcl9yYW5nZSA9IHNlcV9wYXJhbXMtPmNvbG9yX3JhbmdlOworICBjbS0+Y3VyX2ZyYW1lLT5idWYucmVuZGVyX3dpZHRoID0gY20tPnJlbmRlcl93aWR0aDsKKyAgY20tPmN1cl9mcmFtZS0+YnVmLnJlbmRlcl9oZWlnaHQgPSBjbS0+cmVuZGVyX2hlaWdodDsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfZnJhbWVfc2l6ZShBVjFfQ09NTU9OICpjbSwgaW50IGZyYW1lX3NpemVfb3ZlcnJpZGVfZmxhZywgdW5pb24gcGFyYW1fdSAqcGFyYW1zKSB7CisgIGNvbnN0IFNlcXVlbmNlSGVhZGVyICpjb25zdCBzZXFfcGFyYW1zID0gJmNtLT5zZXFfcGFyYW1zOworICBpbnQgd2lkdGgsIGhlaWdodCwgZGVjX3dpZHRoOworCisgIGlmIChmcmFtZV9zaXplX292ZXJyaWRlX2ZsYWcpIHsKKyAgICBpbnQgbnVtX2JpdHNfd2lkdGggPSBzZXFfcGFyYW1zLT5udW1fYml0c193aWR0aDsKKyAgICBpbnQgbnVtX2JpdHNfaGVpZ2h0ID0gc2VxX3BhcmFtcy0+bnVtX2JpdHNfaGVpZ2h0OworICAgIGF2MV9yZWFkX2ZyYW1lX3NpemUocGFyYW1zLCBudW1fYml0c193aWR0aCwgbnVtX2JpdHNfaGVpZ2h0LCAmd2lkdGgsICZoZWlnaHQsICZkZWNfd2lkdGgpOworI2lmZGVmIEFNTAorICAgIGNtLT5kZWNfd2lkdGggPSBkZWNfd2lkdGg7CisjZW5kaWYKKyAgICBpZiAod2lkdGggPiBzZXFfcGFyYW1zLT5tYXhfZnJhbWVfd2lkdGggfHwKKyAgICAgICAgaGVpZ2h0ID4gc2VxX3BhcmFtcy0+bWF4X2ZyYW1lX2hlaWdodCkgeworICAgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICJGcmFtZSBkaW1lbnNpb25zIGFyZSBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSB2YWx1ZXMiKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgd2lkdGggPSBzZXFfcGFyYW1zLT5tYXhfZnJhbWVfd2lkdGg7CisgICAgaGVpZ2h0ID0gc2VxX3BhcmFtcy0+bWF4X2ZyYW1lX2hlaWdodDsKKyNpZmRlZiBBTUwKKyAgICBjbS0+ZGVjX3dpZHRoID0gZGVjX3dpZHRoID0gcGFyYW1zLT5wLmRlY19mcmFtZV93aWR0aDsKKyNlbmRpZgorICB9CisgIHNldHVwX3N1cGVycmVzKGNtLCBwYXJhbXMsICZ3aWR0aCwgJmhlaWdodCk7CisgIHJlc2l6ZV9jb250ZXh0X2J1ZmZlcnMoY20sIHdpZHRoLCBoZWlnaHQpOworI2lmZGVmIE9SSV9DT0RFCisgIHNldHVwX3JlbmRlcl9zaXplKGNtLCBwYXJhbXMpOworI2VuZGlmCisgIHNldHVwX2J1ZmZlcl9wb29sKGNtKTsKK30KKworc3RhdGljIGludCB2YWxpZF9yZWZfZnJhbWVfaW1nX2ZtdChhb21fYml0X2RlcHRoX3QgcmVmX2JpdF9kZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWZfeHNzLCBpbnQgcmVmX3lzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFvbV9iaXRfZGVwdGhfdCB0aGlzX2JpdF9kZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aGlzX3hzcywgaW50IHRoaXNfeXNzKSB7CisgIHJldHVybiByZWZfYml0X2RlcHRoID09IHRoaXNfYml0X2RlcHRoICYmIHJlZl94c3MgPT0gdGhpc194c3MgJiYKKyAgICAgICAgIHJlZl95c3MgPT0gdGhpc195c3M7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX2ZyYW1lX3NpemVfd2l0aF9yZWZzKEFWMV9DT01NT04gKmNtLCB1bmlvbiBwYXJhbV91ICpwYXJhbXMpIHsKKyAgaW50IHdpZHRoLCBoZWlnaHQsIGRlY193aWR0aDsKKyAgaW50IGZvdW5kID0gMDsKKyAgaW50IGhhc192YWxpZF9yZWZfZnJhbWUgPSAwOworICBpbnQgaTsKKyAgU2VxdWVuY2VIZWFkZXIgKnNlcV9wYXJhbXM7CisgIGZvciAoaSA9IExBU1RfRlJBTUU7IGkgPD0gQUxUUkVGX0ZSQU1FOyArK2kpIHsKKyAgICAvKmlmIChhb21fcmJfcmVhZF9iaXQocmIpKSB7Ki8KKyAgICBpZiAocGFyYW1zLT5wLnZhbGlkX3JlZl9mcmFtZV9iaXRzICYgKDE8PGkpKSB7CisgICAgICBjb25zdCBSZWZDbnRCdWZmZXIgKmNvbnN0IHJlZl9idWYgPSBnZXRfcmVmX2ZyYW1lX2J1ZihjbSwgaSk7CisgICAgICAvLyBUaGlzIHdpbGwgbmV2ZXIgYmUgTlVMTCBpbiBhIG5vcm1hbCBzdHJlYW0sIGFzIHN0cmVhbXMgYXJlIHJlcXVpcmVkIHRvCisgICAgICAvLyBoYXZlIGEgc2hvd24ga2V5ZnJhbWUgYmVmb3JlIGFueSBpbnRlciBmcmFtZXMsIHdoaWNoIHdvdWxkIHJlZnJlc2ggYWxsCisgICAgICAvLyB0aGUgcmVmZXJlbmNlIGJ1ZmZlcnMuIEhvd2V2ZXIsIGl0IG1pZ2h0IGJlIG51bGwgaWYgd2UncmUgc3RhcnRpbmcgaW4KKyAgICAgIC8vIHRoZSBtaWRkbGUgb2YgYSBzdHJlYW0sIGFuZCBzdGF0aWMgYW5hbHlzaXMgd2lsbCBlcnJvciBpZiB3ZSBkb24ndCBkbworICAgICAgLy8gYSBudWxsIGNoZWNrIGhlcmUuCisgICAgICBpZiAocmVmX2J1ZiA9PSBOVUxMKSB7CisgICAgICAgIGFvbV9pbnRlcm5hbF9lcnJvcigmY20tPmVycm9yLCBBT01fQ09ERUNfQ09SUlVQVF9GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGNvbmRpdGlvbjogaW52YWxpZCByZWZlcmVuY2UgYnVmZmVyIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBQSUNfQlVGRkVSX0NPTkZJRyAqY29uc3QgYnVmID0gJnJlZl9idWYtPmJ1ZjsKKyAgICAgICAgd2lkdGggPSBidWYtPnlfY3JvcF93aWR0aDsKKyAgICAgICAgaGVpZ2h0ID0gYnVmLT55X2Nyb3BfaGVpZ2h0OworICAgICAgICBjbS0+cmVuZGVyX3dpZHRoID0gYnVmLT5yZW5kZXJfd2lkdGg7CisgICAgICAgIGNtLT5yZW5kZXJfaGVpZ2h0ID0gYnVmLT5yZW5kZXJfaGVpZ2h0OworICAgICAgICBzZXR1cF9zdXBlcnJlcyhjbSwgcGFyYW1zLCAmd2lkdGgsICZoZWlnaHQpOworICAgICAgICByZXNpemVfY29udGV4dF9idWZmZXJzKGNtLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgZm91bmQgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzZXFfcGFyYW1zID0gJmNtLT5zZXFfcGFyYW1zOworICBpZiAoIWZvdW5kKSB7CisgICAgaW50IG51bV9iaXRzX3dpZHRoID0gc2VxX3BhcmFtcy0+bnVtX2JpdHNfd2lkdGg7CisgICAgaW50IG51bV9iaXRzX2hlaWdodCA9IHNlcV9wYXJhbXMtPm51bV9iaXRzX2hlaWdodDsKKworICAgIGF2MV9yZWFkX2ZyYW1lX3NpemUocGFyYW1zLCBudW1fYml0c193aWR0aCwgbnVtX2JpdHNfaGVpZ2h0LCAmd2lkdGgsICZoZWlnaHQsICZkZWNfd2lkdGgpOworI2lmZGVmIEFNTAorICAgIGNtLT5kZWNfd2lkdGggPSBkZWNfd2lkdGg7CisjZW5kaWYKKyAgICBzZXR1cF9zdXBlcnJlcyhjbSwgcGFyYW1zLCAmd2lkdGgsICZoZWlnaHQpOworICAgIHJlc2l6ZV9jb250ZXh0X2J1ZmZlcnMoY20sIHdpZHRoLCBoZWlnaHQpOworI2lmZGVmIE9SSV9DT0RFCisgICAgc2V0dXBfcmVuZGVyX3NpemUoY20sIHJiKTsKKyNlbmRpZgorICB9CisKKyAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApCisgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmcmFtZSBzaXplIik7CisKKyAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIGF0IGxlYXN0IG9uZSBvZiBmcmFtZXMgdGhhdCB0aGlzIGZyYW1lIHJlZmVyZW5jZXMKKyAgLy8gaGFzIHZhbGlkIGRpbWVuc2lvbnMuCisgIGZvciAoaSA9IExBU1RfRlJBTUU7IGkgPD0gQUxUUkVGX0ZSQU1FOyArK2kpIHsKKyAgICBjb25zdCBSZWZDbnRCdWZmZXIgKmNvbnN0IHJlZl9mcmFtZSA9IGdldF9yZWZfZnJhbWVfYnVmKGNtLCBpKTsKKyAgICBpZiAocmVmX2ZyYW1lICE9IE5VTEwpIHsKKyAgICAgIGhhc192YWxpZF9yZWZfZnJhbWUgfD0KKyAgICAgICAgdmFsaWRfcmVmX2ZyYW1lX3NpemUocmVmX2ZyYW1lLT5idWYueV9jcm9wX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZfZnJhbWUtPmJ1Zi55X2Nyb3BfaGVpZ2h0LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB9CisgIH0KKyAgaWYgKCFoYXNfdmFsaWRfcmVmX2ZyYW1lKQorICAgIGFvbV9pbnRlcm5hbF9lcnJvcigmY20tPmVycm9yLCBBT01fQ09ERUNfQ09SUlVQVF9GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIlJlZmVyZW5jZWQgZnJhbWUgaGFzIGludmFsaWQgc2l6ZSIpOworICBmb3IgKGkgPSBMQVNUX0ZSQU1FOyBpIDw9IEFMVFJFRl9GUkFNRTsgKytpKSB7CisgICAgY29uc3QgUmVmQ250QnVmZmVyICpjb25zdCByZWZfZnJhbWUgPSBnZXRfcmVmX2ZyYW1lX2J1ZihjbSwgaSk7CisgICAgaWYgKHJlZl9mcmFtZSAhPSBOVUxMKSB7CisgICAgICBpZiAoIXZhbGlkX3JlZl9mcmFtZV9pbWdfZm10KAorICAgICAgICAgICAgcmVmX2ZyYW1lLT5idWYuYml0X2RlcHRoLCByZWZfZnJhbWUtPmJ1Zi5zdWJzYW1wbGluZ194LAorICAgICAgICAgICAgcmVmX2ZyYW1lLT5idWYuc3Vic2FtcGxpbmdfeSwgc2VxX3BhcmFtcy0+Yml0X2RlcHRoLAorICAgICAgICAgICAgc2VxX3BhcmFtcy0+c3Vic2FtcGxpbmdfeCwgc2VxX3BhcmFtcy0+c3Vic2FtcGxpbmdfeSkpCisgICAgICBhb21faW50ZXJuYWxfZXJyb3IoJmNtLT5lcnJvciwgQU9NX0NPREVDX0NPUlJVUFRfRlJBTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZmVyZW5jZWQgZnJhbWUgaGFzIGluY29tcGF0aWJsZSBjb2xvciBmb3JtYXQiKTsKKyAgICB9CisgIH0KKyAgc2V0dXBfYnVmZmVyX3Bvb2woY20pOworfQorCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBtYXBfaWR4OyAgICAgICAgLy8gZnJhbWUgbWFwIGluZGV4CisgIFJlZkNudEJ1ZmZlciAqYnVmOyAgLy8gZnJhbWUgYnVmZmVyCisgIGludCBzb3J0X2lkeDsgICAgICAgLy8gaW5kZXggYmFzZWQgb24gdGhlIG9mZnNldCB0byBiZSB1c2VkIGZvciBzb3J0aW5nCit9IFJFRl9GUkFNRV9JTkZPOworCisvLyBDb21wYXJlcyB0aGUgc29ydF9pZHggZmllbGRzLiBJZiB0aGV5IGFyZSBlcXVhbCwgdGhlbiBjb21wYXJlcyB0aGUgbWFwX2lkeAorLy8gZmllbGRzIHRvIGJyZWFrIHRoZSB0aWUuIFRoaXMgZW5zdXJlcyBhIHN0YWJsZSBzb3J0Lgorc3RhdGljIGludCBjb21wYXJlX3JlZl9mcmFtZV9pbmZvKGNvbnN0IHZvaWQgKmFyZ19hLCBjb25zdCB2b2lkICphcmdfYikgeworICBjb25zdCBSRUZfRlJBTUVfSU5GTyAqaW5mb19hID0gKFJFRl9GUkFNRV9JTkZPICopYXJnX2E7CisgIGNvbnN0IFJFRl9GUkFNRV9JTkZPICppbmZvX2IgPSAoUkVGX0ZSQU1FX0lORk8gKilhcmdfYjsKKworICBjb25zdCBpbnQgc29ydF9pZHhfZGlmZiA9IGluZm9fYS0+c29ydF9pZHggLSBpbmZvX2ItPnNvcnRfaWR4OworICBpZiAoc29ydF9pZHhfZGlmZiAhPSAwKSByZXR1cm4gc29ydF9pZHhfZGlmZjsKKyAgcmV0dXJuIGluZm9fYS0+bWFwX2lkeCAtIGluZm9fYi0+bWFwX2lkeDsKK30KKworCisvKgorZm9yIGF2MV9zZXR1cF9tb3Rpb25fZmllbGQoKQorKi8KK3N0YXRpYyBpbnQgbW90aW9uX2ZpZWxkX3Byb2plY3Rpb24oQVYxX0NPTU1PTiAqY20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WX1JFRkVSRU5DRV9GUkFNRSBzdGFydF9mcmFtZSwgaW50IGRpcikgeworI2lmZGVmIE9SSV9DT0RFCisgIFRQTF9NVl9SRUYgKnRwbF9tdnNfYmFzZSA9IGNtLT50cGxfbXZzOworICBpbnQgcmVmX29mZnNldFtSRUZfRlJBTUVTXSA9IHsgMCB9OworI2VuZGlmCisgIE1WX1JFRkVSRU5DRV9GUkFNRSByZjsKKyAgY29uc3QgUmVmQ250QnVmZmVyICpjb25zdCBzdGFydF9mcmFtZV9idWYgPQorICAgICAgZ2V0X3JlZl9mcmFtZV9idWYoY20sIHN0YXJ0X2ZyYW1lKTsKKyAgaW50IHN0YXJ0X2ZyYW1lX29yZGVyX2hpbnQ7CisgIHVuc2lnbmVkIGludCBjb25zdCAqcmVmX29yZGVyX2hpbnRzOworICBpbnQgY3VyX29yZGVyX2hpbnQ7CisgIGludCBzdGFydF90b19jdXJyZW50X2ZyYW1lX29mZnNldDsKKworI2lmZGVmIEFNTAorICBpbnQgaTsKKyAgLy9hdjFfcHJpbnQyKEFWMV9ERUJVR19CVUZNR1JfREVUQUlMLCAiJCQkJCQkJCQkJCQlczpjbS0+bXZfcmVmX2lkX2luZGV4ID0gJWQsIHN0YXJ0X2ZyYW1lPSVkXG4iLCBfX2Z1bmNfXywgY20tPm12X3JlZl9pZF9pbmRleCwgc3RhcnRfZnJhbWUpOworICBjbS0+bXZfcmVmX2lkW2NtLT5tdl9yZWZfaWRfaW5kZXhdID0gc3RhcnRfZnJhbWU7CisgIGZvciAoaSA9IDA7IGkgPCBSRUZfRlJBTUVTOyBpKyspIHsKKyAgICAgIGNtLT5tdl9yZWZfb2Zmc2V0W2NtLT5tdl9yZWZfaWRfaW5kZXhdW2ldPTA7CisgIH0KKyAgY20tPm12X2NhbF90cGxfbXZzW2NtLT5tdl9yZWZfaWRfaW5kZXhdPTA7CisgIGNtLT5tdl9yZWZfaWRfaW5kZXgrKzsKKyNlbmRpZgorICBpZiAoc3RhcnRfZnJhbWVfYnVmID09IE5VTEwpIHJldHVybiAwOworCisgIGlmIChzdGFydF9mcmFtZV9idWYtPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FIHx8CisgICAgICBzdGFydF9mcmFtZV9idWYtPmZyYW1lX3R5cGUgPT0gSU5UUkFfT05MWV9GUkFNRSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoc3RhcnRfZnJhbWVfYnVmLT5taV9yb3dzICE9IGNtLT5taV9yb3dzIHx8CisgICAgICBzdGFydF9mcmFtZV9idWYtPm1pX2NvbHMgIT0gY20tPm1pX2NvbHMpCisgICAgcmV0dXJuIDA7CisKKyAgc3RhcnRfZnJhbWVfb3JkZXJfaGludCA9IHN0YXJ0X2ZyYW1lX2J1Zi0+b3JkZXJfaGludDsKKyAgcmVmX29yZGVyX2hpbnRzID0KKyAgICAgICZzdGFydF9mcmFtZV9idWYtPnJlZl9vcmRlcl9oaW50c1swXTsKKyAgY3VyX29yZGVyX2hpbnQgPSBjbS0+Y3VyX2ZyYW1lLT5vcmRlcl9oaW50OworICBzdGFydF90b19jdXJyZW50X2ZyYW1lX29mZnNldCA9IGdldF9yZWxhdGl2ZV9kaXN0KAorICAgICAgJmNtLT5zZXFfcGFyYW1zLm9yZGVyX2hpbnRfaW5mbywgc3RhcnRfZnJhbWVfb3JkZXJfaGludCwgY3VyX29yZGVyX2hpbnQpOworCisgIGZvciAocmYgPSBMQVNUX0ZSQU1FOyByZiA8PSBJTlRFUl9SRUZTX1BFUl9GUkFNRTsgKytyZikgeworICAgIGNtLT5tdl9yZWZfb2Zmc2V0W2NtLT5tdl9yZWZfaWRfaW5kZXgtMV1bcmZdID0gZ2V0X3JlbGF0aXZlX2Rpc3QoJmNtLT5zZXFfcGFyYW1zLm9yZGVyX2hpbnRfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2ZyYW1lX29yZGVyX2hpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZfb3JkZXJfaGludHNbcmYgLSBMQVNUX0ZSQU1FXSk7CisgIH0KKyNpZmRlZiBBTUwKKyAgY20tPm12X2NhbF90cGxfbXZzW2NtLT5tdl9yZWZfaWRfaW5kZXgtMV09MTsKKyNlbmRpZgorICBpZiAoZGlyID09IDIpIHN0YXJ0X3RvX2N1cnJlbnRfZnJhbWVfb2Zmc2V0ID0gLXN0YXJ0X3RvX2N1cnJlbnRfZnJhbWVfb2Zmc2V0OworI2lmZGVmIE9SSV9DT0RFCisgIE1WX1JFRiAqbXZfcmVmX2Jhc2UgPSBzdGFydF9mcmFtZV9idWYtPm12czsKKyAgY29uc3QgaW50IG12c19yb3dzID0gKGNtLT5taV9yb3dzICsgMSkgPj4gMTsKKyAgY29uc3QgaW50IG12c19jb2xzID0gKGNtLT5taV9jb2xzICsgMSkgPj4gMTsKKworICBmb3IgKGludCBibGtfcm93ID0gMDsgYmxrX3JvdyA8IG12c19yb3dzOyArK2Jsa19yb3cpIHsKKyAgICBmb3IgKGludCBibGtfY29sID0gMDsgYmxrX2NvbCA8IG12c19jb2xzOyArK2Jsa19jb2wpIHsKKyAgICAgIE1WX1JFRiAqbXZfcmVmID0gJm12X3JlZl9iYXNlW2Jsa19yb3cgKiBtdnNfY29scyArIGJsa19jb2xdOworICAgICAgTVYgZndkX212ID0gbXZfcmVmLT5tdi5hc19tdjsKKworICAgICAgaWYgKG12X3JlZi0+cmVmX2ZyYW1lID4gSU5UUkFfRlJBTUUpIHsKKyAgICAgICAgaW50X212IHRoaXNfbXY7CisgICAgICAgIGludCBtaV9yLCBtaV9jOworICAgICAgICBjb25zdCBpbnQgcmVmX2ZyYW1lX29mZnNldCA9IHJlZl9vZmZzZXRbbXZfcmVmLT5yZWZfZnJhbWVdOworCisgICAgICAgIGludCBwb3NfdmFsaWQgPQorICAgICAgICAgICAgYWJzKHJlZl9mcmFtZV9vZmZzZXQpIDw9IE1BWF9GUkFNRV9ESVNUQU5DRSAmJgorICAgICAgICAgICAgcmVmX2ZyYW1lX29mZnNldCA+IDAgJiYKKyAgICAgICAgICAgIGFicyhzdGFydF90b19jdXJyZW50X2ZyYW1lX29mZnNldCkgPD0gTUFYX0ZSQU1FX0RJU1RBTkNFOworCisgICAgICAgIGlmIChwb3NfdmFsaWQpIHsKKyAgICAgICAgICBnZXRfbXZfcHJvamVjdGlvbigmdGhpc19tdi5hc19tdiwgZndkX212LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3RvX2N1cnJlbnRfZnJhbWVfb2Zmc2V0LCByZWZfZnJhbWVfb2Zmc2V0KTsKKyAgICAgICAgICBwb3NfdmFsaWQgPSBnZXRfYmxvY2tfcG9zaXRpb24oY20sICZtaV9yLCAmbWlfYywgYmxrX3JvdywgYmxrX2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19tdi5hc19tdiwgZGlyID4+IDEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBvc192YWxpZCkgeworICAgICAgICAgIGNvbnN0IGludCBtaV9vZmZzZXQgPSBtaV9yICogKGNtLT5taV9zdHJpZGUgPj4gMSkgKyBtaV9jOworCisgICAgICAgICAgdHBsX212c19iYXNlW21pX29mZnNldF0ubWZtdjAuYXNfbXYucm93ID0gZndkX212LnJvdzsKKyAgICAgICAgICB0cGxfbXZzX2Jhc2VbbWlfb2Zmc2V0XS5tZm12MC5hc19tdi5jb2wgPSBmd2RfbXYuY29sOworICAgICAgICAgIHRwbF9tdnNfYmFzZVttaV9vZmZzZXRdLnJlZl9mcmFtZV9vZmZzZXQgPSByZWZfZnJhbWVfb2Zmc2V0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKKyAgcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBBTUwKK3N0YXRpYyBpbnQgc2V0dXBfbW90aW9uX2ZpZWxkX2RlYnVnX2NvdW50ID0gMDsKKyNlbmRpZgordm9pZCBhdjFfc2V0dXBfbW90aW9uX2ZpZWxkKEFWMV9DT01NT04gKmNtKSB7CisgIGNvbnN0IE9yZGVySGludEluZm8gKmNvbnN0IG9yZGVyX2hpbnRfaW5mbyA9ICZjbS0+c2VxX3BhcmFtcy5vcmRlcl9oaW50X2luZm87CisgIGludCByZWZfZnJhbWU7CisgIGludCBzaXplOworICBpbnQgY3VyX29yZGVyX2hpbnQ7CisgIGNvbnN0IFJlZkNudEJ1ZmZlciAqcmVmX2J1ZltJTlRFUl9SRUZTX1BFUl9GUkFNRV07CisgIGludCByZWZfb3JkZXJfaGludFtJTlRFUl9SRUZTX1BFUl9GUkFNRV07CisgIGludCByZWZfc3RhbXA7CisgIG1lbXNldChjbS0+cmVmX2ZyYW1lX3NpZGUsIDAsIHNpemVvZihjbS0+cmVmX2ZyYW1lX3NpZGUpKTsKKyAgaWYgKCFvcmRlcl9oaW50X2luZm8tPmVuYWJsZV9vcmRlcl9oaW50KSByZXR1cm47CisjaWZkZWYgT1JJX0NPREUKKyAgVFBMX01WX1JFRiAqdHBsX212c19iYXNlID0gY20tPnRwbF9tdnM7CisjZW5kaWYKKyAgc2l6ZSA9ICgoY20tPm1pX3Jvd3MgKyBNQVhfTUlCX1NJWkUpID4+IDEpICogKGNtLT5taV9zdHJpZGUgPj4gMSk7CisjaWZkZWYgT1JJX0NPREUKKyAgZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgc2l6ZTsgKytpZHgpIHsKKyAgICB0cGxfbXZzX2Jhc2VbaWR4XS5tZm12MC5hc19pbnQgPSBJTlZBTElEX01WOworICAgIHRwbF9tdnNfYmFzZVtpZHhdLnJlZl9mcmFtZV9vZmZzZXQgPSAwOworICB9CisjZW5kaWYKKyAgY3VyX29yZGVyX2hpbnQgPSBjbS0+Y3VyX2ZyYW1lLT5vcmRlcl9oaW50OworCisgIGZvciAocmVmX2ZyYW1lID0gTEFTVF9GUkFNRTsgcmVmX2ZyYW1lIDw9IEFMVFJFRl9GUkFNRTsgcmVmX2ZyYW1lKyspIHsKKyAgICBjb25zdCBpbnQgcmVmX2lkeCA9IHJlZl9mcmFtZSAtIExBU1RfRlJBTUU7CisgICAgY29uc3QgUmVmQ250QnVmZmVyICpjb25zdCBidWYgPSBnZXRfcmVmX2ZyYW1lX2J1ZihjbSwgcmVmX2ZyYW1lKTsKKyAgICBpbnQgb3JkZXJfaGludCA9IDA7CisKKyAgICBpZiAoYnVmICE9IE5VTEwpIG9yZGVyX2hpbnQgPSBidWYtPm9yZGVyX2hpbnQ7CisKKyAgICByZWZfYnVmW3JlZl9pZHhdID0gYnVmOworICAgIHJlZl9vcmRlcl9oaW50W3JlZl9pZHhdID0gb3JkZXJfaGludDsKKworICAgIGlmIChnZXRfcmVsYXRpdmVfZGlzdChvcmRlcl9oaW50X2luZm8sIG9yZGVyX2hpbnQsIGN1cl9vcmRlcl9oaW50KSA+IDApCisgICAgICBjbS0+cmVmX2ZyYW1lX3NpZGVbcmVmX2ZyYW1lXSA9IDE7CisgICAgZWxzZSBpZiAob3JkZXJfaGludCA9PSBjdXJfb3JkZXJfaGludCkKKyAgICAgIGNtLT5yZWZfZnJhbWVfc2lkZVtyZWZfZnJhbWVdID0gLTE7CisgIH0KKyAgcmVmX3N0YW1wID0gTUZNVl9TVEFDS19TSVpFIC0gMTsKKyNpZmRlZiBBTUwKKyAgY20tPm12X3JlZl9pZF9pbmRleCA9IDA7CisgIGF2MV9wcmludDIoQVYxX0RFQlVHX0JVRk1HUl9ERVRBSUwsICIlcyglZCkgbWlfY29scyAlZCBtaV9yb3dzICVkXG4iLAorICAgICAgX19mdW5jX18sIHNldHVwX21vdGlvbl9maWVsZF9kZWJ1Z19jb3VudCsrLAorICAgICAgY20tPm1pX2NvbHMsCisgICAgICBjbS0+bWlfcm93cworICAgICAgKTsKKyNlbmRpZgorICBpZiAocmVmX2J1ZltMQVNUX0ZSQU1FIC0gTEFTVF9GUkFNRV0gIT0gTlVMTCkgeworICAgIGNvbnN0IGludCBhbHRfb2ZfbHN0X29yZGVyX2hpbnQgPQorICAgICAgICByZWZfYnVmW0xBU1RfRlJBTUUgLSBMQVNUX0ZSQU1FXQorICAgICAgICAgICAgLT5yZWZfb3JkZXJfaGludHNbQUxUUkVGX0ZSQU1FIC0gTEFTVF9GUkFNRV07CisKKyAgICBjb25zdCBpbnQgaXNfbHN0X292ZXJsYXkgPQorICAgICAgICAoYWx0X29mX2xzdF9vcmRlcl9oaW50ID09IHJlZl9vcmRlcl9oaW50W0dPTERFTl9GUkFNRSAtIExBU1RfRlJBTUVdKTsKKyAgICBpZiAoIWlzX2xzdF9vdmVybGF5KSBtb3Rpb25fZmllbGRfcHJvamVjdGlvbihjbSwgTEFTVF9GUkFNRSwgMik7CisgICAgLS1yZWZfc3RhbXA7CisgIH0KKworICBpZiAoZ2V0X3JlbGF0aXZlX2Rpc3Qob3JkZXJfaGludF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVmX29yZGVyX2hpbnRbQldEUkVGX0ZSQU1FIC0gTEFTVF9GUkFNRV0sCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJfb3JkZXJfaGludCkgPiAwKSB7CisgICAgaWYgKG1vdGlvbl9maWVsZF9wcm9qZWN0aW9uKGNtLCBCV0RSRUZfRlJBTUUsIDApKSAtLXJlZl9zdGFtcDsKKyAgfQorCisgIGlmIChnZXRfcmVsYXRpdmVfZGlzdChvcmRlcl9oaW50X2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICByZWZfb3JkZXJfaGludFtBTFRSRUYyX0ZSQU1FIC0gTEFTVF9GUkFNRV0sCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJfb3JkZXJfaGludCkgPiAwKSB7CisgICAgaWYgKG1vdGlvbl9maWVsZF9wcm9qZWN0aW9uKGNtLCBBTFRSRUYyX0ZSQU1FLCAwKSkgLS1yZWZfc3RhbXA7CisgIH0KKworICBpZiAoZ2V0X3JlbGF0aXZlX2Rpc3Qob3JkZXJfaGludF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVmX29yZGVyX2hpbnRbQUxUUkVGX0ZSQU1FIC0gTEFTVF9GUkFNRV0sCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJfb3JkZXJfaGludCkgPiAwICYmCisgICAgICByZWZfc3RhbXAgPj0gMCkKKyAgICBpZiAobW90aW9uX2ZpZWxkX3Byb2plY3Rpb24oY20sIEFMVFJFRl9GUkFNRSwgMCkpIC0tcmVmX3N0YW1wOworCisgIGlmIChyZWZfc3RhbXAgPj0gMCkgbW90aW9uX2ZpZWxkX3Byb2plY3Rpb24oY20sIExBU1QyX0ZSQU1FLCAyKTsKK30KKworCitzdGF0aWMgdm9pZCBzZXRfcmVmX2ZyYW1lX2luZm8oaW50ICpyZW1hcHBlZF9yZWZfaWR4LCBpbnQgZnJhbWVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRl9GUkFNRV9JTkZPICpyZWZfaW5mbykgeworICBhc3NlcnQoZnJhbWVfaWR4ID49IDAgJiYgZnJhbWVfaWR4IDwgSU5URVJfUkVGU19QRVJfRlJBTUUpOworCisgIHJlbWFwcGVkX3JlZl9pZHhbZnJhbWVfaWR4XSA9IHJlZl9pbmZvLT5tYXBfaWR4OworICBhdjFfcHJpbnQyKEFWMV9ERUJVR19CVUZNR1JfREVUQUlMLCAiKysrKysrKysrKysrKyVzOnJlbWFwcGVkX3JlZl9pZHhbJWRdPTB4JXhcbiIsIF9fZnVuY19fLCBmcmFtZV9pZHgsIHJlZl9pbmZvLT5tYXBfaWR4KTsKK30KKworCit2b2lkIGF2MV9zZXRfZnJhbWVfcmVmcyhBVjFfQ09NTU9OICpjb25zdCBjbSwgaW50ICpyZW1hcHBlZF9yZWZfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxzdF9tYXBfaWR4LCBpbnQgZ2xkX21hcF9pZHgpIHsKKyAgaW50IGxzdF9mcmFtZV9zb3J0X2lkeCA9IC0xOworICBpbnQgZ2xkX2ZyYW1lX3NvcnRfaWR4ID0gLTE7CisgIGludCBpOworICAvL2Fzc2VydChjbS0+c2VxX3BhcmFtcy5vcmRlcl9oaW50X2luZm8uZW5hYmxlX29yZGVyX2hpbnQpOworICAvL2Fzc2VydChjbS0+c2VxX3BhcmFtcy5vcmRlcl9oaW50X2luZm8ub3JkZXJfaGludF9iaXRzX21pbnVzXzEgPj0gMCk7CisgIGNvbnN0IGludCBjdXJfb3JkZXJfaGludCA9IChpbnQpY20tPmN1cnJlbnRfZnJhbWUub3JkZXJfaGludDsKKyAgY29uc3QgaW50IGN1cl9mcmFtZV9zb3J0X2lkeCA9CisgICAgICAxIDw8IGNtLT5zZXFfcGFyYW1zLm9yZGVyX2hpbnRfaW5mby5vcmRlcl9oaW50X2JpdHNfbWludXNfMTsKKworICBSRUZfRlJBTUVfSU5GTyByZWZfZnJhbWVfaW5mb1tSRUZfRlJBTUVTXTsKKyAgaW50IHJlZl9mbGFnX2xpc3RbSU5URVJfUkVGU19QRVJfRlJBTUVdID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CisgIGludCBid2Rfc3RhcnRfaWR4OworICBpbnQgYndkX2VuZF9pZHg7CisgIGludCBmd2Rfc3RhcnRfaWR4LCBmd2RfZW5kX2lkeDsKKyAgaW50IHJlZl9pZHg7CisgIHN0YXRpYyBjb25zdCBNVl9SRUZFUkVOQ0VfRlJBTUUgcmVmX2ZyYW1lX2xpc3RbSU5URVJfUkVGU19QRVJfRlJBTUUgLSAyXSA9IHsKKyAgICBMQVNUMl9GUkFNRSwgTEFTVDNfRlJBTUUsIEJXRFJFRl9GUkFNRSwgQUxUUkVGMl9GUkFNRSwgQUxUUkVGX0ZSQU1FCisgIH07CisKKyAgZm9yIChpID0gMDsgaSA8IFJFRl9GUkFNRVM7ICsraSkgeworICAgIGNvbnN0IGludCBtYXBfaWR4ID0gaTsKKyAgICBSZWZDbnRCdWZmZXIgKmJ1ZjsKKyAgICBpbnQgb2Zmc2V0OworCisgICAgcmVmX2ZyYW1lX2luZm9baV0ubWFwX2lkeCA9IG1hcF9pZHg7CisgICAgcmVmX2ZyYW1lX2luZm9baV0uc29ydF9pZHggPSAtMTsKKworICAgIGJ1ZiA9IGNtLT5yZWZfZnJhbWVfbWFwW21hcF9pZHhdOworICAgIHJlZl9mcmFtZV9pbmZvW2ldLmJ1ZiA9IGJ1ZjsKKworICAgIGlmIChidWYgPT0gTlVMTCkgY29udGludWU7CisgICAgLy8gSWYgdGhpcyBhc3NlcnRpb24gZmFpbHMsIHRoZXJlIGlzIGEgcmVmZXJlbmNlIGxlYWsuCisgICAgYXNzZXJ0KGJ1Zi0+cmVmX2NvdW50ID4gMCk7CisKKyAgICBvZmZzZXQgPSAoaW50KWJ1Zi0+b3JkZXJfaGludDsKKyAgICByZWZfZnJhbWVfaW5mb1tpXS5zb3J0X2lkeCA9CisgICAgICAgIChvZmZzZXQgPT0gLTEpID8gLTEKKyAgICAgICAgICAgICAgICAgICAgICAgOiBjdXJfZnJhbWVfc29ydF9pZHggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcmVsYXRpdmVfZGlzdCgmY20tPnNlcV9wYXJhbXMub3JkZXJfaGludF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIGN1cl9vcmRlcl9oaW50KTsKKyAgICBhc3NlcnQocmVmX2ZyYW1lX2luZm9baV0uc29ydF9pZHggPj0gLTEpOworCisgICAgaWYgKG1hcF9pZHggPT0gbHN0X21hcF9pZHgpIGxzdF9mcmFtZV9zb3J0X2lkeCA9IHJlZl9mcmFtZV9pbmZvW2ldLnNvcnRfaWR4OworICAgIGlmIChtYXBfaWR4ID09IGdsZF9tYXBfaWR4KSBnbGRfZnJhbWVfc29ydF9pZHggPSByZWZfZnJhbWVfaW5mb1tpXS5zb3J0X2lkeDsKKyAgfQorCisgIC8vIENvbmZpcm0gYm90aCBMQVNUX0ZSQU1FIGFuZCBHT0xERU5fRlJBTUUgYXJlIHZhbGlkIGZvcndhcmQgcmVmZXJlbmNlCisgIC8vIGZyYW1lcy4KKyAgaWYgKGxzdF9mcmFtZV9zb3J0X2lkeCA9PSAtMSB8fCBsc3RfZnJhbWVfc29ydF9pZHggPj0gY3VyX2ZyYW1lX3NvcnRfaWR4KSB7CisgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXIgZnJhbWUgcmVxdWVzdHMgYSBsb29rLWFoZWFkIGZyYW1lIGFzIExBU1QiKTsKKyAgfQorICBpZiAoZ2xkX2ZyYW1lX3NvcnRfaWR4ID09IC0xIHx8IGdsZF9mcmFtZV9zb3J0X2lkeCA+PSBjdXJfZnJhbWVfc29ydF9pZHgpIHsKKyAgICBhb21faW50ZXJuYWxfZXJyb3IoJmNtLT5lcnJvciwgQU9NX0NPREVDX0NPUlJVUFRfRlJBTUUsCisgICAgICAgICAgICAgICAgICAgICAgICJJbnRlciBmcmFtZSByZXF1ZXN0cyBhIGxvb2stYWhlYWQgZnJhbWUgYXMgR09MREVOIik7CisgIH0KKworICAvLyBTb3J0IHJlZiBmcmFtZXMgYmFzZWQgb24gdGhlaXIgZnJhbWVfb2Zmc2V0IHZhbHVlcy4KKyAgcXNvcnQocmVmX2ZyYW1lX2luZm8sIFJFRl9GUkFNRVMsIHNpemVvZihSRUZfRlJBTUVfSU5GTyksCisgICAgICAgIGNvbXBhcmVfcmVmX2ZyYW1lX2luZm8pOworCisgIC8vIElkZW50aWZ5IGZvcndhcmQgYW5kIGJhY2t3YXJkIHJlZmVyZW5jZSBmcmFtZXMuCisgIC8vIEZvcndhcmQgIHJlZmVyZW5jZTogb2Zmc2V0IDwgb3JkZXJfaGludAorICAvLyBCYWNrd2FyZCByZWZlcmVuY2U6IG9mZnNldCA+PSBvcmRlcl9oaW50CisgIGZ3ZF9zdGFydF9pZHggPSAwOworICBmd2RfZW5kX2lkeCA9IFJFRl9GUkFNRVMgLSAxOworCisgIGZvciAoaSA9IDA7IGkgPCBSRUZfRlJBTUVTOyBpKyspIHsKKyAgICBpZiAocmVmX2ZyYW1lX2luZm9baV0uc29ydF9pZHggPT0gLTEpIHsKKyAgICAgIGZ3ZF9zdGFydF9pZHgrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChyZWZfZnJhbWVfaW5mb1tpXS5zb3J0X2lkeCA+PSBjdXJfZnJhbWVfc29ydF9pZHgpIHsKKyAgICAgIGZ3ZF9lbmRfaWR4ID0gaSAtIDE7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBid2Rfc3RhcnRfaWR4ID0gZndkX2VuZF9pZHggKyAxOworICBid2RfZW5kX2lkeCA9IFJFRl9GUkFNRVMgLSAxOworCisgIC8vID09PSBCYWNrd2FyZCBSZWZlcmVuY2UgRnJhbWVzID09PQorCisgIC8vID09IEFMVFJFRl9GUkFNRSA9PQorICBpZiAoYndkX3N0YXJ0X2lkeCA8PSBid2RfZW5kX2lkeCkgeworICAgIHNldF9yZWZfZnJhbWVfaW5mbyhyZW1hcHBlZF9yZWZfaWR4LCBBTFRSRUZfRlJBTUUgLSBMQVNUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAmcmVmX2ZyYW1lX2luZm9bYndkX2VuZF9pZHhdKTsKKyAgICByZWZfZmxhZ19saXN0W0FMVFJFRl9GUkFNRSAtIExBU1RfRlJBTUVdID0gMTsKKyAgICBid2RfZW5kX2lkeC0tOworICB9CisKKyAgLy8gPT0gQldEUkVGX0ZSQU1FID09CisgIGlmIChid2Rfc3RhcnRfaWR4IDw9IGJ3ZF9lbmRfaWR4KSB7CisgICAgc2V0X3JlZl9mcmFtZV9pbmZvKHJlbWFwcGVkX3JlZl9pZHgsIEJXRFJFRl9GUkFNRSAtIExBU1RfRlJBTUUsCisgICAgICAgICAgICAgICAgICAgICAgICZyZWZfZnJhbWVfaW5mb1tid2Rfc3RhcnRfaWR4XSk7CisgICAgcmVmX2ZsYWdfbGlzdFtCV0RSRUZfRlJBTUUgLSBMQVNUX0ZSQU1FXSA9IDE7CisgICAgYndkX3N0YXJ0X2lkeCsrOworICB9CisKKyAgLy8gPT0gQUxUUkVGMl9GUkFNRSA9PQorICBpZiAoYndkX3N0YXJ0X2lkeCA8PSBid2RfZW5kX2lkeCkgeworICAgIHNldF9yZWZfZnJhbWVfaW5mbyhyZW1hcHBlZF9yZWZfaWR4LCBBTFRSRUYyX0ZSQU1FIC0gTEFTVF9GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgJnJlZl9mcmFtZV9pbmZvW2J3ZF9zdGFydF9pZHhdKTsKKyAgICByZWZfZmxhZ19saXN0W0FMVFJFRjJfRlJBTUUgLSBMQVNUX0ZSQU1FXSA9IDE7CisgIH0KKworICAvLyA9PT0gRm9yd2FyZCBSZWZlcmVuY2UgRnJhbWVzID09PQorCisgIGZvciAoaSA9IGZ3ZF9zdGFydF9pZHg7IGkgPD0gZndkX2VuZF9pZHg7ICsraSkgeworICAgIC8vID09IExBU1RfRlJBTUUgPT0KKyAgICBpZiAocmVmX2ZyYW1lX2luZm9baV0ubWFwX2lkeCA9PSBsc3RfbWFwX2lkeCkgeworICAgICAgc2V0X3JlZl9mcmFtZV9pbmZvKHJlbWFwcGVkX3JlZl9pZHgsIExBU1RfRlJBTUUgLSBMQVNUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZfZnJhbWVfaW5mb1tpXSk7CisgICAgICByZWZfZmxhZ19saXN0W0xBU1RfRlJBTUUgLSBMQVNUX0ZSQU1FXSA9IDE7CisgICAgfQorCisgICAgLy8gPT0gR09MREVOX0ZSQU1FID09CisgICAgaWYgKHJlZl9mcmFtZV9pbmZvW2ldLm1hcF9pZHggPT0gZ2xkX21hcF9pZHgpIHsKKyAgICAgIHNldF9yZWZfZnJhbWVfaW5mbyhyZW1hcHBlZF9yZWZfaWR4LCBHT0xERU5fRlJBTUUgLSBMQVNUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZfZnJhbWVfaW5mb1tpXSk7CisgICAgICByZWZfZmxhZ19saXN0W0dPTERFTl9GUkFNRSAtIExBU1RfRlJBTUVdID0gMTsKKyAgICB9CisgIH0KKworICBhc3NlcnQocmVmX2ZsYWdfbGlzdFtMQVNUX0ZSQU1FIC0gTEFTVF9GUkFNRV0gPT0gMSAmJgorICAgICAgICAgcmVmX2ZsYWdfbGlzdFtHT0xERU5fRlJBTUUgLSBMQVNUX0ZSQU1FXSA9PSAxKTsKKworICAvLyA9PSBMQVNUMl9GUkFNRSA9PQorICAvLyA9PSBMQVNUM19GUkFNRSA9PQorICAvLyA9PSBCV0RSRUZfRlJBTUUgPT0KKyAgLy8gPT0gQUxUUkVGMl9GUkFNRSA9PQorICAvLyA9PSBBTFRSRUZfRlJBTUUgPT0KKworICAvLyBTZXQgdXAgdGhlIHJlZmVyZW5jZSBmcmFtZXMgaW4gdGhlIGFudGktY2hyb25vbG9naWNhbCBvcmRlci4KKyAgZm9yIChyZWZfaWR4ID0gMDsgcmVmX2lkeCA8IChJTlRFUl9SRUZTX1BFUl9GUkFNRSAtIDIpOyByZWZfaWR4KyspIHsKKyAgICBjb25zdCBNVl9SRUZFUkVOQ0VfRlJBTUUgcmVmX2ZyYW1lID0gcmVmX2ZyYW1lX2xpc3RbcmVmX2lkeF07CisKKyAgICBpZiAocmVmX2ZsYWdfbGlzdFtyZWZfZnJhbWUgLSBMQVNUX0ZSQU1FXSA9PSAxKSBjb250aW51ZTsKKworICAgIHdoaWxlIChmd2Rfc3RhcnRfaWR4IDw9IGZ3ZF9lbmRfaWR4ICYmCisgICAgICAgICAgIChyZWZfZnJhbWVfaW5mb1tmd2RfZW5kX2lkeF0ubWFwX2lkeCA9PSBsc3RfbWFwX2lkeCB8fAorICAgICAgICAgICAgcmVmX2ZyYW1lX2luZm9bZndkX2VuZF9pZHhdLm1hcF9pZHggPT0gZ2xkX21hcF9pZHgpKSB7CisgICAgICBmd2RfZW5kX2lkeC0tOworICAgIH0KKyAgICBpZiAoZndkX3N0YXJ0X2lkeCA+IGZ3ZF9lbmRfaWR4KSBicmVhazsKKworICAgIHNldF9yZWZfZnJhbWVfaW5mbyhyZW1hcHBlZF9yZWZfaWR4LCByZWZfZnJhbWUgLSBMQVNUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAmcmVmX2ZyYW1lX2luZm9bZndkX2VuZF9pZHhdKTsKKyAgICByZWZfZmxhZ19saXN0W3JlZl9mcmFtZSAtIExBU1RfRlJBTUVdID0gMTsKKworICAgIGZ3ZF9lbmRfaWR4LS07CisgIH0KKworICAvLyBBc3NpZ24gYWxsIHRoZSByZW1haW5pbmcgZnJhbWUocyksIGlmIGFueSwgdG8gdGhlIGVhcmxpZXN0IHJlZmVyZW5jZSBmcmFtZS4KKyAgZm9yICg7IHJlZl9pZHggPCAoSU5URVJfUkVGU19QRVJfRlJBTUUgLSAyKTsgcmVmX2lkeCsrKSB7CisgICAgY29uc3QgTVZfUkVGRVJFTkNFX0ZSQU1FIHJlZl9mcmFtZSA9IHJlZl9mcmFtZV9saXN0W3JlZl9pZHhdOworICAgIGlmIChyZWZfZmxhZ19saXN0W3JlZl9mcmFtZSAtIExBU1RfRlJBTUVdID09IDEpIGNvbnRpbnVlOworICAgIHNldF9yZWZfZnJhbWVfaW5mbyhyZW1hcHBlZF9yZWZfaWR4LCByZWZfZnJhbWUgLSBMQVNUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAmcmVmX2ZyYW1lX2luZm9bZndkX3N0YXJ0X2lkeF0pOworICAgIHJlZl9mbGFnX2xpc3RbcmVmX2ZyYW1lIC0gTEFTVF9GUkFNRV0gPSAxOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IElOVEVSX1JFRlNfUEVSX0ZSQU1FOyBpKyspIHsKKyAgICBhc3NlcnQocmVmX2ZsYWdfbGlzdFtpXSA9PSAxKTsKKyAgfQorfQorCit2b2lkIGF2MV9zZXR1cF9mcmFtZV9idWZfcmVmcyhBVjFfQ09NTU9OICpjbSkgeworICBNVl9SRUZFUkVOQ0VfRlJBTUUgcmVmX2ZyYW1lOworICBjbS0+Y3VyX2ZyYW1lLT5vcmRlcl9oaW50ID0gY20tPmN1cnJlbnRfZnJhbWUub3JkZXJfaGludDsKKworICBmb3IgKHJlZl9mcmFtZSA9IExBU1RfRlJBTUU7IHJlZl9mcmFtZSA8PSBBTFRSRUZfRlJBTUU7ICsrcmVmX2ZyYW1lKSB7CisgICAgY29uc3QgUmVmQ250QnVmZmVyICpjb25zdCBidWYgPSBnZXRfcmVmX2ZyYW1lX2J1ZihjbSwgcmVmX2ZyYW1lKTsKKyAgICBpZiAoYnVmICE9IE5VTEwpCisgICAgICBjbS0+Y3VyX2ZyYW1lLT5yZWZfb3JkZXJfaGludHNbcmVmX2ZyYW1lIC0gTEFTVF9GUkFNRV0gPSBidWYtPm9yZGVyX2hpbnQ7CisgIH0KK30KKwordm9pZCBhdjFfc2V0dXBfZnJhbWVfc2lnbl9iaWFzKEFWMV9DT01NT04gKmNtKSB7CisgIE1WX1JFRkVSRU5DRV9GUkFNRSByZWZfZnJhbWU7CisgIGZvciAocmVmX2ZyYW1lID0gTEFTVF9GUkFNRTsgcmVmX2ZyYW1lIDw9IEFMVFJFRl9GUkFNRTsgKytyZWZfZnJhbWUpIHsKKyAgICBjb25zdCBSZWZDbnRCdWZmZXIgKmNvbnN0IGJ1ZiA9IGdldF9yZWZfZnJhbWVfYnVmKGNtLCByZWZfZnJhbWUpOworICAgIGlmIChjbS0+c2VxX3BhcmFtcy5vcmRlcl9oaW50X2luZm8uZW5hYmxlX29yZGVyX2hpbnQgJiYgYnVmICE9IE5VTEwpIHsKKyAgICAgIGNvbnN0IGludCByZWZfb3JkZXJfaGludCA9IGJ1Zi0+b3JkZXJfaGludDsKKyAgICAgIGNtLT5yZWZfZnJhbWVfc2lnbl9iaWFzW3JlZl9mcmFtZV0gPQorICAgICAgICAgIChnZXRfcmVsYXRpdmVfZGlzdCgmY20tPnNlcV9wYXJhbXMub3JkZXJfaGludF9pbmZvLCByZWZfb3JkZXJfaGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCljbS0+Y3VycmVudF9mcmFtZS5vcmRlcl9oaW50KSA8PSAwKQorICAgICAgICAgICAgICA/IDAKKyAgICAgICAgICAgICAgOiAxOworICAgIH0gZWxzZSB7CisgICAgICBjbS0+cmVmX2ZyYW1lX3NpZ25fYmlhc1tyZWZfZnJhbWVdID0gMDsKKyAgICB9CisgIH0KK30KKworCit2b2lkIGF2MV9zZXR1cF9za2lwX21vZGVfYWxsb3dlZChBVjFfQ09NTU9OICpjbSkKK3sKKwljb25zdCBPcmRlckhpbnRJbmZvICpjb25zdCBvcmRlcl9oaW50X2luZm8gPSAmY20tPnNlcV9wYXJhbXMub3JkZXJfaGludF9pbmZvOworCVNraXBNb2RlSW5mbyAqY29uc3Qgc2tpcF9tb2RlX2luZm8gPSAmY20tPmN1cnJlbnRfZnJhbWUuc2tpcF9tb2RlX2luZm87CisJaW50IGk7CisJaW50IGN1cl9vcmRlcl9oaW50OworCWludCByZWZfb3JkZXJfaGludHNbMl0gPSB7IC0xLCBJTlRfTUFYIH07CisJaW50IHJlZl9pZHhbMl0gPSB7IElOVkFMSURfSURYLCBJTlZBTElEX0lEWCB9OworCisJc2tpcF9tb2RlX2luZm8tPnNraXBfbW9kZV9hbGxvd2VkID0gMDsKKwlza2lwX21vZGVfaW5mby0+cmVmX2ZyYW1lX2lkeF8wID0gSU5WQUxJRF9JRFg7CisJc2tpcF9tb2RlX2luZm8tPnJlZl9mcmFtZV9pZHhfMSA9IElOVkFMSURfSURYOworCWF2MV9wcmludDIoQVYxX0RFQlVHX0JVRk1HUl9ERVRBSUwsICJhdjFfc2V0dXBfc2tpcF9tb2RlX2FsbG93ZWQgJWQgJWQgJWRcbiIsIG9yZGVyX2hpbnRfaW5mby0+ZW5hYmxlX29yZGVyX2hpbnQsCisJCWZyYW1lX2lzX2ludHJhX29ubHkoY20pLAorCQljbS0+Y3VycmVudF9mcmFtZS5yZWZlcmVuY2VfbW9kZSk7CisJaWYgKCFvcmRlcl9oaW50X2luZm8tPmVuYWJsZV9vcmRlcl9oaW50IHx8IGZyYW1lX2lzX2ludHJhX29ubHkoY20pIHx8CisJCWNtLT5jdXJyZW50X2ZyYW1lLnJlZmVyZW5jZV9tb2RlID09IFNJTkdMRV9SRUZFUkVOQ0UpCisJCXJldHVybjsKKworCWN1cl9vcmRlcl9oaW50ID0gY20tPmN1cnJlbnRfZnJhbWUub3JkZXJfaGludDsKKworCS8vIElkZW50aWZ5IHRoZSBuZWFyZXN0IGZvcndhcmQgYW5kIGJhY2t3YXJkIHJlZmVyZW5jZXMuCisJZm9yIChpID0gMDsgaSA8IElOVEVSX1JFRlNfUEVSX0ZSQU1FOyArK2kpIHsKKwkJY29uc3QgUmVmQ250QnVmZmVyICpjb25zdCBidWYgPSBnZXRfcmVmX2ZyYW1lX2J1ZihjbSwgTEFTVF9GUkFNRSArIGkpOworCQlpbnQgcmVmX29yZGVyX2hpbnQ7CisJCWlmIChidWYgPT0gTlVMTCkgY29udGludWU7CisKKwkJcmVmX29yZGVyX2hpbnQgPSBidWYtPm9yZGVyX2hpbnQ7CisJCWlmIChnZXRfcmVsYXRpdmVfZGlzdChvcmRlcl9oaW50X2luZm8sIHJlZl9vcmRlcl9oaW50LCBjdXJfb3JkZXJfaGludCkgPCAwKSB7CisJCQkvLyBGb3J3YXJkIHJlZmVyZW5jZQorCQkJaWYgKHJlZl9vcmRlcl9oaW50c1swXSA9PSAtMSB8fAorCQkJCWdldF9yZWxhdGl2ZV9kaXN0KG9yZGVyX2hpbnRfaW5mbywgcmVmX29yZGVyX2hpbnQsCisJCQkJcmVmX29yZGVyX2hpbnRzWzBdKSA+IDApIHsKKwkJCQlyZWZfb3JkZXJfaGludHNbMF0gPSByZWZfb3JkZXJfaGludDsKKwkJCQlyZWZfaWR4WzBdID0gaTsKKwkJCX0KKwkJfSBlbHNlIGlmIChnZXRfcmVsYXRpdmVfZGlzdChvcmRlcl9oaW50X2luZm8sIHJlZl9vcmRlcl9oaW50LAorCQljdXJfb3JkZXJfaGludCkgPiAwKSB7CisJCQkvLyBCYWNrd2FyZCByZWZlcmVuY2UKKwkJCWlmIChyZWZfb3JkZXJfaGludHNbMV0gPT0gSU5UX01BWCB8fAorCQkJCWdldF9yZWxhdGl2ZV9kaXN0KG9yZGVyX2hpbnRfaW5mbywgcmVmX29yZGVyX2hpbnQsCisJCQkJcmVmX29yZGVyX2hpbnRzWzFdKSA8IDApIHsKKwkJCQlyZWZfb3JkZXJfaGludHNbMV0gPSByZWZfb3JkZXJfaGludDsKKwkJCQlyZWZfaWR4WzFdID0gaTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChyZWZfaWR4WzBdICE9IElOVkFMSURfSURYICYmIHJlZl9pZHhbMV0gIT0gSU5WQUxJRF9JRFgpIHsKKwkJLy8gPT0gQmktZGlyZWN0aW9uYWwgcHJlZGljdGlvbiA9PQorCQlza2lwX21vZGVfaW5mby0+c2tpcF9tb2RlX2FsbG93ZWQgPSAxOworCQlza2lwX21vZGVfaW5mby0+cmVmX2ZyYW1lX2lkeF8wID0gQU9NTUlOKHJlZl9pZHhbMF0sIHJlZl9pZHhbMV0pOworCQlza2lwX21vZGVfaW5mby0+cmVmX2ZyYW1lX2lkeF8xID0gQU9NTUFYKHJlZl9pZHhbMF0sIHJlZl9pZHhbMV0pOworCX0gZWxzZSBpZiAocmVmX2lkeFswXSAhPSBJTlZBTElEX0lEWCAmJiByZWZfaWR4WzFdID09IElOVkFMSURfSURYKSB7CisJCS8vID09IEZvcndhcmQgcHJlZGljdGlvbiBvbmx5ID09CisJCS8vIElkZW50aWZ5IHRoZSBzZWNvbmQgbmVhcmVzdCBmb3J3YXJkIHJlZmVyZW5jZS4KKwkJcmVmX29yZGVyX2hpbnRzWzFdID0gLTE7CisJCWZvciAoaSA9IDA7IGkgPCBJTlRFUl9SRUZTX1BFUl9GUkFNRTsgKytpKSB7CisJCQljb25zdCBSZWZDbnRCdWZmZXIgKmNvbnN0IGJ1ZiA9IGdldF9yZWZfZnJhbWVfYnVmKGNtLCBMQVNUX0ZSQU1FICsgaSk7CisJCQlpbnQgcmVmX29yZGVyX2hpbnQ7CisJCQlpZiAoYnVmID09IE5VTEwpIGNvbnRpbnVlOworCisJCQlyZWZfb3JkZXJfaGludCA9IGJ1Zi0+b3JkZXJfaGludDsKKwkJCWlmICgocmVmX29yZGVyX2hpbnRzWzBdICE9IC0xICYmCisJCQlnZXRfcmVsYXRpdmVfZGlzdChvcmRlcl9oaW50X2luZm8sIHJlZl9vcmRlcl9oaW50LCByZWZfb3JkZXJfaGludHNbMF0pIDwgMCkgJiYKKwkJCShyZWZfb3JkZXJfaGludHNbMV0gPT0gLTEgfHwKKwkJCWdldF9yZWxhdGl2ZV9kaXN0KG9yZGVyX2hpbnRfaW5mbywgcmVmX29yZGVyX2hpbnQsIHJlZl9vcmRlcl9oaW50c1sxXSkgPiAwKSkgeworCQkJCS8vIFNlY29uZCBjbG9zZXN0IGZvcndhcmQgcmVmZXJlbmNlCisJCQkJcmVmX29yZGVyX2hpbnRzWzFdID0gcmVmX29yZGVyX2hpbnQ7CisJCQkJcmVmX2lkeFsxXSA9IGk7CisJCQl9CisJCX0KKwkJaWYgKHJlZl9vcmRlcl9oaW50c1sxXSAhPSAtMSkgeworCQkJc2tpcF9tb2RlX2luZm8tPnNraXBfbW9kZV9hbGxvd2VkID0gMTsKKwkJCXNraXBfbW9kZV9pbmZvLT5yZWZfZnJhbWVfaWR4XzAgPSBBT01NSU4ocmVmX2lkeFswXSwgcmVmX2lkeFsxXSk7CisJCQlza2lwX21vZGVfaW5mby0+cmVmX2ZyYW1lX2lkeF8xID0gQU9NTUFYKHJlZl9pZHhbMF0sIHJlZl9pZHhbMV0pOworCQl9CisJfQorCWF2MV9wcmludDIoQVYxX0RFQlVHX0JVRk1HUl9ERVRBSUwsCisJCSJza2lwX21vZGVfaW5mbzogc2tpcF9tb2RlX2FsbG93ZWQgMHgleCAweCV4IDB4JXhcbiIsCisJY20tPmN1cnJlbnRfZnJhbWUuc2tpcF9tb2RlX2luZm8uc2tpcF9tb2RlX2FsbG93ZWQsCisJY20tPmN1cnJlbnRfZnJhbWUuc2tpcF9tb2RlX2luZm8ucmVmX2ZyYW1lX2lkeF8wLAorCWNtLT5jdXJyZW50X2ZyYW1lLnNraXBfbW9kZV9pbmZvLnJlZl9mcmFtZV9pZHhfMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZyYW1lX21pZ2h0X2FsbG93X3JlZl9mcmFtZV9tdnMoY29uc3QgQVYxX0NPTU1PTiAqY20pIHsKKyAgcmV0dXJuICFjbS0+ZXJyb3JfcmVzaWxpZW50X21vZGUgJiYKKyAgICBjbS0+c2VxX3BhcmFtcy5vcmRlcl9oaW50X2luZm8uZW5hYmxlX3JlZl9mcmFtZV9tdnMgJiYKKyAgICBjbS0+c2VxX3BhcmFtcy5vcmRlcl9oaW50X2luZm8uZW5hYmxlX29yZGVyX2hpbnQgJiYKKyAgICAhZnJhbWVfaXNfaW50cmFfb25seShjbSk7Cit9CisKKyNpZmRlZiBPUklfQ09ERQorLyoKKyogc2VnbWVudGF0aW9uCisqLworc3RhdGljIGNvbnN0IGludCBzZWdfZmVhdHVyZV9kYXRhX3NpZ25lZFtTRUdfTFZMX01BWF0gPSB7CisgIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAKK307CisKK3N0YXRpYyBjb25zdCBpbnQgc2VnX2ZlYXR1cmVfZGF0YV9tYXhbU0VHX0xWTF9NQVhdID0geyBNQVhRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9MT09QX0ZJTFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfTE9PUF9GSUxURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX0xPT1BfRklMVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9MT09QX0ZJTFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCB9OworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZWdmZWF0dXJlc19jb3B5KHN0cnVjdCBzZWdtZW50YXRpb24gKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzZWdtZW50YXRpb24gKnNyYykgeworICBpbnQgaSwgajsKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9TRUdNRU5UUzsgaSsrKSB7CisgICAgZHN0LT5mZWF0dXJlX21hc2tbaV0gPSBzcmMtPmZlYXR1cmVfbWFza1tpXTsKKyAgICBmb3IgKGogPSAwOyBqIDwgU0VHX0xWTF9NQVg7IGorKykgeworICAgICAgZHN0LT5mZWF0dXJlX2RhdGFbaV1bal0gPSBzcmMtPmZlYXR1cmVfZGF0YVtpXVtqXTsKKyAgICB9CisgIH0KKyAgZHN0LT5zZWdpZF9wcmVza2lwID0gc3JjLT5zZWdpZF9wcmVza2lwOworICBkc3QtPmxhc3RfYWN0aXZlX3NlZ2lkID0gc3JjLT5sYXN0X2FjdGl2ZV9zZWdpZDsKK30KKworc3RhdGljIHZvaWQgYXYxX2NsZWFyYWxsX3NlZ2ZlYXR1cmVzKHN0cnVjdCBzZWdtZW50YXRpb24gKnNlZykgeworICBhdjFfemVybyhzZWctPmZlYXR1cmVfZGF0YSk7CisgIGF2MV96ZXJvKHNlZy0+ZmVhdHVyZV9tYXNrKTsKK30KKworc3RhdGljIHZvaWQgYXYxX2VuYWJsZV9zZWdmZWF0dXJlKHN0cnVjdCBzZWdtZW50YXRpb24gKnNlZywgaW50IHNlZ21lbnRfaWQsCisgICAgaW50IGZlYXR1cmVfaWQpIHsKKyAgc2VnLT5mZWF0dXJlX21hc2tbc2VnbWVudF9pZF0gfD0gMSA8PCBmZWF0dXJlX2lkOworfQorCit2b2lkIGF2MV9jYWxjdWxhdGVfc2VnZGF0YShzdHJ1Y3Qgc2VnbWVudGF0aW9uICpzZWcpIHsKKyAgc2VnLT5zZWdpZF9wcmVza2lwID0gMDsKKyAgc2VnLT5sYXN0X2FjdGl2ZV9zZWdpZCA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1NFR01FTlRTOyBpKyspIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IFNFR19MVkxfTUFYOyBqKyspIHsKKyAgICAgIGlmIChzZWctPmZlYXR1cmVfbWFza1tpXSAmICgxIDw8IGopKSB7CisgICAgICAgIHNlZy0+c2VnaWRfcHJlc2tpcCB8PSAoaiA+PSBTRUdfTFZMX1JFRl9GUkFNRSk7CisgICAgICAgIHNlZy0+bGFzdF9hY3RpdmVfc2VnaWQgPSBpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgaW50IGF2MV9zZWdfZmVhdHVyZV9kYXRhX21heChpbnQgZmVhdHVyZV9pZCkgeworICByZXR1cm4gc2VnX2ZlYXR1cmVfZGF0YV9tYXhbZmVhdHVyZV9pZF07Cit9CisKK3N0YXRpYyBpbnQgYXYxX2lzX3NlZ2ZlYXR1cmVfc2lnbmVkKGludCBmZWF0dXJlX2lkKSB7CisgIHJldHVybiBzZWdfZmVhdHVyZV9kYXRhX3NpZ25lZFtmZWF0dXJlX2lkXTsKK30KKworc3RhdGljIHZvaWQgYXYxX3NldF9zZWdkYXRhKHN0cnVjdCBzZWdtZW50YXRpb24gKnNlZywgaW50IHNlZ21lbnRfaWQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgZmVhdHVyZV9pZCwgaW50IHNlZ19kYXRhKSB7CisgIGlmIChzZWdfZGF0YSA8IDApIHsKKyAgICBhc3NlcnQoc2VnX2ZlYXR1cmVfZGF0YV9zaWduZWRbZmVhdHVyZV9pZF0pOworICAgIGFzc2VydCgtc2VnX2RhdGEgPD0gc2VnX2ZlYXR1cmVfZGF0YV9tYXhbZmVhdHVyZV9pZF0pOworICB9IGVsc2UgeworICAgIGFzc2VydChzZWdfZGF0YSA8PSBzZWdfZmVhdHVyZV9kYXRhX21heFtmZWF0dXJlX2lkXSk7CisgIH0KKworICBzZWctPmZlYXR1cmVfZGF0YVtzZWdtZW50X2lkXVtmZWF0dXJlX2lkXSA9IHNlZ19kYXRhOworfQorCitzdGF0aWMgaW5saW5lIGludCBjbGFtcChpbnQgdmFsdWUsIGludCBsb3csIGludCBoaWdoKSB7CisgIHJldHVybiB2YWx1ZSA8IGxvdyA/IGxvdyA6ICh2YWx1ZSA+IGhpZ2ggPyBoaWdoIDogdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBzZXR1cF9zZWdtZW50YXRpb24oQVYxX0NPTU1PTiAqY29uc3QgY20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gcGFyYW1fdSAqcGFyYW1zKSB7CisgIHN0cnVjdCBzZWdtZW50YXRpb24gKmNvbnN0IHNlZyA9ICZjbS0+c2VnOworCisgIHNlZy0+dXBkYXRlX21hcCA9IDA7CisgIHNlZy0+dXBkYXRlX2RhdGEgPSAwOworICBzZWctPnRlbXBvcmFsX3VwZGF0ZSA9IDA7CisKKyAgc2VnLT5lbmFibGVkID0gcGFyYW1zLT5wLnNlZ19lbmFibGVkOyAvL2FvbV9yYl9yZWFkX2JpdCgtMSwgZGVmbWFyaywgcmIpOworICBpZiAoIXNlZy0+ZW5hYmxlZCkgeworICAgIGlmIChjbS0+Y3VyX2ZyYW1lLT5zZWdfbWFwKQorICAgICAgbWVtc2V0KGNtLT5jdXJfZnJhbWUtPnNlZ19tYXAsIDAsIChjbS0+bWlfcm93cyAqIGNtLT5taV9jb2xzKSk7CisKKyAgICBtZW1zZXQoc2VnLCAwLCBzaXplb2YoKnNlZykpOworICAgIHNlZ2ZlYXR1cmVzX2NvcHkoJmNtLT5jdXJfZnJhbWUtPnNlZywgc2VnKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGNtLT5zZWcuZW5hYmxlZCAmJiBjbS0+cHJldl9mcmFtZSAmJgorICAgICAgKGNtLT5taV9yb3dzID09IGNtLT5wcmV2X2ZyYW1lLT5taV9yb3dzKSAmJgorICAgICAgKGNtLT5taV9jb2xzID09IGNtLT5wcmV2X2ZyYW1lLT5taV9jb2xzKSkgeworICAgIGNtLT5sYXN0X2ZyYW1lX3NlZ19tYXAgPSBjbS0+cHJldl9mcmFtZS0+c2VnX21hcDsKKyAgfSBlbHNlIHsKKyAgICBjbS0+bGFzdF9mcmFtZV9zZWdfbWFwID0gTlVMTDsKKyAgfQorICAvLyBSZWFkIHVwZGF0ZSBmbGFncworICBpZiAoY20tPnByaW1hcnlfcmVmX2ZyYW1lID09IFBSSU1BUllfUkVGX05PTkUpIHsKKyAgICAvLyBUaGVzZSBmcmFtZXMgY2FuJ3QgdXNlIHByZXZpb3VzIGZyYW1lcywgc28gbXVzdCBzaWduYWwgbWFwICsgZmVhdHVyZXMKKyAgICBzZWctPnVwZGF0ZV9tYXAgPSAxOworICAgIHNlZy0+dGVtcG9yYWxfdXBkYXRlID0gMDsKKyAgICBzZWctPnVwZGF0ZV9kYXRhID0gMTsKKyAgfSBlbHNlIHsKKyAgICBzZWctPnVwZGF0ZV9tYXAgPSBwYXJhbXMtPnAuc2VnX3VwZGF0ZV9tYXA7IC8vIGFvbV9yYl9yZWFkX2JpdCgtMSwgZGVmbWFyaywgcmIpOworICAgIGlmIChzZWctPnVwZGF0ZV9tYXApIHsKKyAgICAgIHNlZy0+dGVtcG9yYWxfdXBkYXRlID0gcGFyYW1zLT5wLnNlZ190ZW1wb3JhbF91cGRhdGU7IC8vYW9tX3JiX3JlYWRfYml0KC0xLCBkZWZtYXJrLCByYik7CisgICAgfSBlbHNlIHsKKyAgICAgIHNlZy0+dGVtcG9yYWxfdXBkYXRlID0gMDsKKyAgICB9CisgICAgc2VnLT51cGRhdGVfZGF0YSA9IHBhcmFtcy0+cC5zZWdfdXBkYXRlX2RhdGE7IC8vYW9tX3JiX3JlYWRfYml0KC0xLCBkZWZtYXJrLCByYik7CisgIH0KKworICAvLyBTZWdtZW50YXRpb24gZGF0YSB1cGRhdGUKKyAgaWYgKHNlZy0+dXBkYXRlX2RhdGEpIHsKKyAgICBhdjFfY2xlYXJhbGxfc2VnZmVhdHVyZXMoc2VnKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1NFR01FTlRTOyBpKyspIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgU0VHX0xWTF9NQVg7IGorKykgeworICAgICAgICBpbnQgZGF0YSA9IDA7CisgICAgICAgIGNvbnN0IGludCBmZWF0dXJlX2VuYWJsZWQgPSBwYXJhbXMtPnAuc2VnX2ZlYXR1cmVfZW5hYmxlZCA7Ly9hb21fcmJfcmVhZF9iaXQoLTEsIGRlZm1hcmssIHJiKTsKKyAgICAgICAgaWYgKGZlYXR1cmVfZW5hYmxlZCkgeworICAgICAgICAgIGF2MV9lbmFibGVfc2VnZmVhdHVyZShzZWcsIGksIGopOworCisgICAgICAgICAgY29uc3QgaW50IGRhdGFfbWF4ID0gYXYxX3NlZ19mZWF0dXJlX2RhdGFfbWF4KGopOworICAgICAgICAgIGNvbnN0IGludCBkYXRhX21pbiA9IC1kYXRhX21heDsKKyAgICAgICAgICAvKgorICAgICAgICAgIGNvbnN0IGludCB1Yml0cyA9IGdldF91bnNpZ25lZF9iaXRzKGRhdGFfbWF4KTsKKworICAgICAgICAgIGlmIChhdjFfaXNfc2VnZmVhdHVyZV9zaWduZWQoaikpIHsKKyAgICAgICAgICAgIGRhdGEgPSBhb21fcmJfcmVhZF9pbnZfc2lnbmVkX2xpdGVyYWwoLTEsIGRlZm1hcmssIHJiLCB1Yml0cyk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGEgPSBhb21fcmJfcmVhZF9saXRlcmFsKC0xLCBkZWZtYXJrLCByYiwgdWJpdHMpOworICAgICAgICAgIH0qLworICAgICAgICAgIGRhdGEgPSBwYXJhbXMtPnAuc2VnX2RhdGE7CisgICAgICAgICAgZGF0YSA9IGNsYW1wKGRhdGEsIGRhdGFfbWluLCBkYXRhX21heCk7CisgICAgICAgIH0KKyAgICAgICAgYXYxX3NldF9zZWdkYXRhKHNlZywgaSwgaiwgZGF0YSk7CisgICAgICB9CisgICAgfQorICAgIGF2MV9jYWxjdWxhdGVfc2VnZGF0YShzZWcpOworICB9IGVsc2UgaWYgKGNtLT5wcmV2X2ZyYW1lKSB7CisgICAgc2VnZmVhdHVyZXNfY29weShzZWcsICZjbS0+cHJldl9mcmFtZS0+c2VnKTsKKyAgfQorICBzZWdmZWF0dXJlc19jb3B5KCZjbS0+Y3VyX2ZyYW1lLT5zZWcsIHNlZyk7Cit9CisjZW5kaWYKKworLyoqLworCisKK2ludCBhdjFfZGVjb2RlX2ZyYW1lX2hlYWRlcnNfYW5kX3NldHVwKEFWMURlY29kZXIgKnBiaSwgaW50IHRyYWlsaW5nX2JpdHNfcHJlc2VudCwgdW5pb24gcGFyYW1fdSAqcGFyYW1zKQoreworICBBVjFfQ09NTU9OICpjb25zdCBjbSA9IHBiaS0+Y29tbW9uOworICAvKgorICByZWFkX3VuY29tcHJlc3NlZF9oZWFkZXIoKQorICAqLworICBjb25zdCBTZXF1ZW5jZUhlYWRlciAqY29uc3Qgc2VxX3BhcmFtcyA9ICZjbS0+c2VxX3BhcmFtczsKKyAgQ3VycmVudEZyYW1lICpjb25zdCBjdXJyZW50X2ZyYW1lID0gJmNtLT5jdXJyZW50X2ZyYW1lOworICAvL01BQ1JPQkxPQ0tEICpjb25zdCB4ZCA9ICZwYmktPm1iOworICBCdWZmZXJQb29sICpjb25zdCBwb29sID0gY20tPmJ1ZmZlcl9wb29sOworICBSZWZDbnRCdWZmZXIgKmNvbnN0IGZyYW1lX2J1ZnMgPSBwb29sLT5mcmFtZV9idWZzOworICBpbnQgaTsKKyAgaW50IGZyYW1lX3NpemVfb3ZlcnJpZGVfZmxhZzsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICBpZiAoIXBiaS0+c2VxdWVuY2VfaGVhZGVyX3JlYWR5KSB7CisgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAiTm8gc2VxdWVuY2UgaGVhZGVyIik7CisgIH0KKyAgY20tPmxhc3RfZnJhbWVfdHlwZSA9IGN1cnJlbnRfZnJhbWUtPmZyYW1lX3R5cGU7CisKKyAgaWYgKHNlcV9wYXJhbXMtPnJlZHVjZWRfc3RpbGxfcGljdHVyZV9oZHIpIHsKKyAgICBjbS0+c2hvd19leGlzdGluZ19mcmFtZSA9IDA7CisgICAgY20tPnNob3dfZnJhbWUgPSAxOworICAgIGN1cnJlbnRfZnJhbWUtPmZyYW1lX3R5cGUgPSBLRVlfRlJBTUU7CisgICAgaWYgKHBiaS0+c2VxdWVuY2VfaGVhZGVyX2NoYW5nZWQpIHsKKyAgICAgIC8vIFRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgbmV3IGNvZGVkIHZpZGVvIHNlcXVlbmNlLgorICAgICAgcGJpLT5zZXF1ZW5jZV9oZWFkZXJfY2hhbmdlZCA9IDA7CisgICAgICBwYmktPmRlY29kaW5nX2ZpcnN0X2ZyYW1lID0gMTsKKyAgICAgIHJlc2V0X2ZyYW1lX2J1ZmZlcnMocGJpKTsKKyAgICB9CisgICAgY20tPmVycm9yX3Jlc2lsaWVudF9tb2RlID0gMTsKKyAgfSBlbHNlIHsKKyAgICBjbS0+c2hvd19leGlzdGluZ19mcmFtZSA9IHBhcmFtcy0+cC5zaG93X2V4aXN0aW5nX2ZyYW1lOworICAgIHBiaS0+cmVzZXRfZGVjb2Rlcl9zdGF0ZSA9IDA7CisgICAgaWYgKGNtLT5zaG93X2V4aXN0aW5nX2ZyYW1lKSB7CisgICAgICBpbnQgZXhpc3RpbmdfZnJhbWVfaWR4OworICAgICAgUmVmQ250QnVmZmVyICpmcmFtZV90b19zaG93OworICAgICAgaWYgKHBiaS0+c2VxdWVuY2VfaGVhZGVyX2NoYW5nZWQpIHsKKyAgICAgICAgYW9tX2ludGVybmFsX2Vycm9yKAorICAgICAgICAgICAgJmNtLT5lcnJvciwgQU9NX0NPREVDX0NPUlJVUFRfRlJBTUUsCisgICAgICAgICAgICAiTmV3IHNlcXVlbmNlIGhlYWRlciBzdGFydHMgd2l0aCBhIHNob3dfZXhpc3RpbmdfZnJhbWUuIik7CisgICAgICB9CisgICAgICAvLyBTaG93IGFuIGV4aXN0aW5nIGZyYW1lIGRpcmVjdGx5LgorICAgICAgZXhpc3RpbmdfZnJhbWVfaWR4ID0gcGFyYW1zLT5wLmV4aXN0aW5nX2ZyYW1lX2lkeDsgLy9hb21fcmJfcmVhZF9saXRlcmFsKHJiLCAzKTsKKyAgICAgIGZyYW1lX3RvX3Nob3cgPSBjbS0+cmVmX2ZyYW1lX21hcFtleGlzdGluZ19mcmFtZV9pZHhdOworICAgICAgaWYgKGZyYW1lX3RvX3Nob3cgPT0gTlVMTCkgeworICAgICAgICAgIGFvbV9pbnRlcm5hbF9lcnJvcigmY20tPmVycm9yLCBBT01fQ09ERUNfVU5TVVBfQklUU1RSRUFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJ1ZmZlciBkb2VzIG5vdCBjb250YWluIGEgZGVjb2RlZCBmcmFtZSIpOworICAgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgaWYgKHNlcV9wYXJhbXMtPmRlY29kZXJfbW9kZWxfaW5mb19wcmVzZW50X2ZsYWcgJiYKKyAgICAgICAgICBjbS0+dGltaW5nX2luZm8uZXF1YWxfcGljdHVyZV9pbnRlcnZhbCA9PSAwKSB7CisgICAgICAgIGNtLT5mcmFtZV9wcmVzZW50YXRpb25fdGltZSA9IHBhcmFtcy0+cC5mcmFtZV9wcmVzZW50YXRpb25fdGltZTsKKyAgICAgICAgLy9yZWFkX3RlbXBvcmFsX3BvaW50X2luZm8oY20pOworICAgICAgfQorICAgICAgaWYgKHNlcV9wYXJhbXMtPmZyYW1lX2lkX251bWJlcnNfcHJlc2VudF9mbGFnKSB7CisgICAgICAgIC8vaW50IGZyYW1lX2lkX2xlbmd0aCA9IHNlcV9wYXJhbXMtPmZyYW1lX2lkX2xlbmd0aDsKKyAgICAgICAgaW50IGRpc3BsYXlfZnJhbWVfaWQgPSBwYXJhbXMtPnAuZGlzcGxheV9mcmFtZV9pZDsgLy9hb21fcmJfcmVhZF9saXRlcmFsKHJiLCBmcmFtZV9pZF9sZW5ndGgpOworICAgICAgICAvKiBDb21wYXJlIGRpc3BsYXlfZnJhbWVfaWQgd2l0aCByZWZfZnJhbWVfaWQgYW5kIGNoZWNrIHZhbGlkIGZvcgorICAgICAgICAgKiByZWZlcmVuY2luZyAqLworICAgICAgICBpZiAoZGlzcGxheV9mcmFtZV9pZCAhPSBjbS0+cmVmX2ZyYW1lX2lkW2V4aXN0aW5nX2ZyYW1lX2lkeF0gfHwKKyAgICAgICAgICAgIGNtLT52YWxpZF9mb3JfcmVmZXJlbmNpbmdbZXhpc3RpbmdfZnJhbWVfaWR4XSA9PSAwKQorICAgICAgICAgIGFvbV9pbnRlcm5hbF9lcnJvcigmY20tPmVycm9yLCBBT01fQ09ERUNfQ09SUlVQVF9GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZmVyZW5jZSBidWZmZXIgZnJhbWUgSUQgbWlzbWF0Y2giKTsKKyAgICAgIH0KKyAgICAgIGxvY2tfYnVmZmVyX3Bvb2wocG9vbCwgZmxhZ3MpOworICAgICAgYXNzZXJ0KGZyYW1lX3RvX3Nob3ctPnJlZl9jb3VudCA+IDApOworICAgICAgLy8gY20tPmN1cl9mcmFtZSBzaG91bGQgYmUgdGhlIGJ1ZmZlciByZWZlcmVuY2VkIGJ5IHRoZSByZXR1cm4gdmFsdWUKKyAgICAgIC8vIG9mIHRoZSBnZXRfZnJlZV9mYigpIGNhbGwgaW4gYXYxX3JlY2VpdmVfY29tcHJlc3NlZF9kYXRhKCksIGFuZAorICAgICAgLy8gZ2VuZXJhdGVfbmV4dF9yZWZfZnJhbWVfbWFwKCkgaGFzIG5vdCBiZWVuIGNhbGxlZCwgc28gcmVmX2NvdW50CisgICAgICAvLyBzaG91bGQgc3RpbGwgYmUgMS4KKyAgICAgIGFzc2VydChjbS0+Y3VyX2ZyYW1lLT5yZWZfY291bnQgPT0gMSk7CisgICAgICAvLyBhc3NpZ25fZnJhbWVfYnVmZmVyX3AoKSBkZWNyZW1lbnRzIHJlZl9jb3VudCBkaXJlY3RseSByYXRoZXIgdGhhbgorICAgICAgLy8gY2FsbCBkZWNyZWFzZV9yZWZfY291bnQoKS4gSWYgY20tPmN1cl9mcmFtZS0+cmF3X2ZyYW1lX2J1ZmZlciBoYXMKKyAgICAgIC8vIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQsIGl0IHdpbGwgbm90IGJlIHJlbGVhc2VkIGJ5CisgICAgICAvLyBhc3NpZ25fZnJhbWVfYnVmZmVyX3AoKSEKKyAgICAgIGFzc2VydCghY20tPmN1cl9mcmFtZS0+cmF3X2ZyYW1lX2J1ZmZlci5kYXRhKTsKKyAgICAgIGFzc2lnbl9mcmFtZV9idWZmZXJfcCgmY20tPmN1cl9mcmFtZSwgZnJhbWVfdG9fc2hvdyk7CisgICAgICBwYmktPnJlc2V0X2RlY29kZXJfc3RhdGUgPSBmcmFtZV90b19zaG93LT5mcmFtZV90eXBlID09IEtFWV9GUkFNRTsKKyAgICAgIHVubG9ja19idWZmZXJfcG9vbChwb29sLCBmbGFncyk7CisKKyNpZmRlZiBPUklfQ09ERQorICAgICAgY20tPmxmLmZpbHRlcl9sZXZlbFswXSA9IDA7CisgICAgICBjbS0+bGYuZmlsdGVyX2xldmVsWzFdID0gMDsKKyNlbmRpZgorICAgICAgY20tPnNob3dfZnJhbWUgPSAxOworCisgICAgICAvLyBTZWN0aW9uIDYuOC4yOiBJdCBpcyBhIHJlcXVpcmVtZW50IG9mIGJpdHN0cmVhbSBjb25mb3JtYW5jZSB0aGF0IHdoZW4KKyAgICAgIC8vIHNob3dfZXhpc3RpbmdfZnJhbWUgaXMgdXNlZCB0byBzaG93IGEgcHJldmlvdXMgZnJhbWUsIHRoYXQgdGhlIHZhbHVlCisgICAgICAvLyBvZiBzaG93YWJsZV9mcmFtZSBmb3IgdGhlIHByZXZpb3VzIGZyYW1lIHdhcyBlcXVhbCB0byAxLgorICAgICAgaWYgKCFmcmFtZV90b19zaG93LT5zaG93YWJsZV9mcmFtZSkgeworICAgICAgICBhb21faW50ZXJuYWxfZXJyb3IoJmNtLT5lcnJvciwgQU9NX0NPREVDX1VOU1VQX0JJVFNUUkVBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJCdWZmZXIgZG9lcyBub3QgY29udGFpbiBhIHNob3dhYmxlIGZyYW1lIik7CisgICAgICB9CisgICAgICAvLyBTZWN0aW9uIDYuOC4yOiBJdCBpcyBhIHJlcXVpcmVtZW50IG9mIGJpdHN0cmVhbSBjb25mb3JtYW5jZSB0aGF0IHdoZW4KKyAgICAgIC8vIHNob3dfZXhpc3RpbmdfZnJhbWUgaXMgdXNlZCB0byBzaG93IGEgcHJldmlvdXMgZnJhbWUgd2l0aAorICAgICAgLy8gUmVmRnJhbWVUeXBlWyBmcmFtZV90b19zaG93X21hcF9pZHggXSBlcXVhbCB0byBLRVlfRlJBTUUsIHRoYXQgdGhlCisgICAgICAvLyBmcmFtZSBpcyBvdXRwdXQgdmlhIHRoZSBzaG93X2V4aXN0aW5nX2ZyYW1lIG1lY2hhbmlzbSBhdCBtb3N0IG9uY2UuCisgICAgICBpZiAocGJpLT5yZXNldF9kZWNvZGVyX3N0YXRlKSBmcmFtZV90b19zaG93LT5zaG93YWJsZV9mcmFtZSA9IDA7CisKKyNpZmRlZiBPUklfQ09ERQorICAgICAgY20tPmZpbG1fZ3JhaW5fcGFyYW1zID0gZnJhbWVfdG9fc2hvdy0+ZmlsbV9ncmFpbl9wYXJhbXM7CisjZW5kaWYKKyAgICAgIGlmIChwYmktPnJlc2V0X2RlY29kZXJfc3RhdGUpIHsKKyAgICAgICAgc2hvd19leGlzdGluZ19mcmFtZV9yZXNldChwYmksIGV4aXN0aW5nX2ZyYW1lX2lkeCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjdXJyZW50X2ZyYW1lLT5yZWZyZXNoX2ZyYW1lX2ZsYWdzID0gMDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgY3VycmVudF9mcmFtZS0+ZnJhbWVfdHlwZSA9IChGUkFNRV9UWVBFKXBhcmFtcy0+cC5mcmFtZV90eXBlOyAvL2FvbV9yYl9yZWFkX2xpdGVyYWwocmIsIDIpOworICAgIGlmIChwYmktPnNlcXVlbmNlX2hlYWRlcl9jaGFuZ2VkKSB7CisgICAgICBpZiAoY3VycmVudF9mcmFtZS0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpIHsKKyAgICAgICAgLy8gVGhpcyBpcyB0aGUgc3RhcnQgb2YgYSBuZXcgY29kZWQgdmlkZW8gc2VxdWVuY2UuCisgICAgICAgIHBiaS0+c2VxdWVuY2VfaGVhZGVyX2NoYW5nZWQgPSAwOworICAgICAgICBwYmktPmRlY29kaW5nX2ZpcnN0X2ZyYW1lID0gMTsKKyAgICAgICAgcmVzZXRfZnJhbWVfYnVmZmVycyhwYmkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlcXVlbmNlIGhlYWRlciBoYXMgY2hhbmdlZCB3aXRob3V0IGEga2V5ZnJhbWUuIik7CisgICAgICB9CisgICAgfQorICAgIGNtLT5zaG93X2ZyYW1lID0gcGFyYW1zLT5wLnNob3dfZnJhbWU7IC8vYW9tX3JiX3JlYWRfYml0KHJiKTsKKyAgICBpZiAoc2VxX3BhcmFtcy0+c3RpbGxfcGljdHVyZSAmJgorICAgICAgICAoY3VycmVudF9mcmFtZS0+ZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUgfHwgIWNtLT5zaG93X2ZyYW1lKSkgeworICAgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICJTdGlsbCBwaWN0dXJlcyBtdXN0IGJlIGNvZGVkIGFzIHNob3duIGtleWZyYW1lcyIpOworICAgIH0KKyAgICBjbS0+c2hvd2FibGVfZnJhbWUgPSBjdXJyZW50X2ZyYW1lLT5mcmFtZV90eXBlICE9IEtFWV9GUkFNRTsKKyAgICBpZiAoY20tPnNob3dfZnJhbWUpIHsKKyAgICAgIGlmIChzZXFfcGFyYW1zLT5kZWNvZGVyX21vZGVsX2luZm9fcHJlc2VudF9mbGFnICYmCisgICAgICAgICAgY20tPnRpbWluZ19pbmZvLmVxdWFsX3BpY3R1cmVfaW50ZXJ2YWwgPT0gMCkKKyAgICAgICAgY20tPmZyYW1lX3ByZXNlbnRhdGlvbl90aW1lID0gcGFyYW1zLT5wLmZyYW1lX3ByZXNlbnRhdGlvbl90aW1lOworICAgICAgICAvL3JlYWRfdGVtcG9yYWxfcG9pbnRfaW5mbyhjbSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFNlZSBpZiB0aGlzIGZyYW1lIGNhbiBiZSB1c2VkIGFzIHNob3dfZXhpc3RpbmdfZnJhbWUgaW4gZnV0dXJlCisgICAgICBjbS0+c2hvd2FibGVfZnJhbWUgPSBwYXJhbXMtPnAuc2hvd2FibGVfZnJhbWU7Ly9hb21fcmJfcmVhZF9iaXQocmIpOworICAgIH0KKyAgICBjbS0+Y3VyX2ZyYW1lLT5zaG93X2ZyYW1lID0gY20tPnNob3dfZnJhbWU7CisgICAgY20tPmN1cl9mcmFtZS0+c2hvd2FibGVfZnJhbWUgPSBjbS0+c2hvd2FibGVfZnJhbWU7CisgICAgY20tPmVycm9yX3Jlc2lsaWVudF9tb2RlID0KKyAgICAgICAgZnJhbWVfaXNfc2ZyYW1lKGNtKSB8fAorICAgICAgICAgICAgICAgIChjdXJyZW50X2ZyYW1lLT5mcmFtZV90eXBlID09IEtFWV9GUkFNRSAmJiBjbS0+c2hvd19mcmFtZSkKKyAgICAgICAgICAgID8gMQorICAgICAgICAgICAgOiBwYXJhbXMtPnAuZXJyb3JfcmVzaWxpZW50X21vZGU7IC8vYW9tX3JiX3JlYWRfYml0KHJiKTsKKyAgfQorCisjaWZkZWYgT1JJX0NPREUKKyAgY20tPmRpc2FibGVfY2RmX3VwZGF0ZSA9IGFvbV9yYl9yZWFkX2JpdChyYik7CisgIGlmIChzZXFfcGFyYW1zLT5mb3JjZV9zY3JlZW5fY29udGVudF90b29scyA9PSAyKSB7CisgICAgY20tPmFsbG93X3NjcmVlbl9jb250ZW50X3Rvb2xzID0gYW9tX3JiX3JlYWRfYml0KHJiKTsKKyAgfSBlbHNlIHsKKyAgICBjbS0+YWxsb3dfc2NyZWVuX2NvbnRlbnRfdG9vbHMgPSBzZXFfcGFyYW1zLT5mb3JjZV9zY3JlZW5fY29udGVudF90b29sczsKKyAgfQorCisgIGlmIChjbS0+YWxsb3dfc2NyZWVuX2NvbnRlbnRfdG9vbHMpIHsKKyAgICBpZiAoc2VxX3BhcmFtcy0+Zm9yY2VfaW50ZWdlcl9tdiA9PSAyKSB7CisgICAgICBjbS0+Y3VyX2ZyYW1lX2ZvcmNlX2ludGVnZXJfbXYgPSBhb21fcmJfcmVhZF9iaXQocmIpOworICAgIH0gZWxzZSB7CisgICAgICBjbS0+Y3VyX2ZyYW1lX2ZvcmNlX2ludGVnZXJfbXYgPSBzZXFfcGFyYW1zLT5mb3JjZV9pbnRlZ2VyX212OworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjbS0+Y3VyX2ZyYW1lX2ZvcmNlX2ludGVnZXJfbXYgPSAwOworICB9CisjZW5kaWYKKworICBmcmFtZV9zaXplX292ZXJyaWRlX2ZsYWcgPSAwOworICBjbS0+YWxsb3dfaW50cmFiYyA9IDA7CisgIGNtLT5wcmltYXJ5X3JlZl9mcmFtZSA9IFBSSU1BUllfUkVGX05PTkU7CisKKyAgaWYgKCFzZXFfcGFyYW1zLT5yZWR1Y2VkX3N0aWxsX3BpY3R1cmVfaGRyKSB7CisgICAgaWYgKHNlcV9wYXJhbXMtPmZyYW1lX2lkX251bWJlcnNfcHJlc2VudF9mbGFnKSB7CisgICAgICBpbnQgZnJhbWVfaWRfbGVuZ3RoID0gc2VxX3BhcmFtcy0+ZnJhbWVfaWRfbGVuZ3RoOworICAgICAgaW50IGRpZmZfbGVuID0gc2VxX3BhcmFtcy0+ZGVsdGFfZnJhbWVfaWRfbGVuZ3RoOworICAgICAgaW50IHByZXZfZnJhbWVfaWQgPSAwOworICAgICAgaW50IGhhdmVfcHJldl9mcmFtZV9pZCA9CisgICAgICAgICAgIXBiaS0+ZGVjb2RpbmdfZmlyc3RfZnJhbWUgJiYKKyAgICAgICAgICAhKGN1cnJlbnRfZnJhbWUtPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FICYmIGNtLT5zaG93X2ZyYW1lKTsKKyAgICAgIGlmIChoYXZlX3ByZXZfZnJhbWVfaWQpIHsKKyAgICAgICAgcHJldl9mcmFtZV9pZCA9IGNtLT5jdXJyZW50X2ZyYW1lX2lkOworICAgICAgfQorICAgICAgY20tPmN1cnJlbnRfZnJhbWVfaWQgPSBwYXJhbXMtPnAuY3VycmVudF9mcmFtZV9pZDsgLy9hb21fcmJfcmVhZF9saXRlcmFsKHJiLCBmcmFtZV9pZF9sZW5ndGgpOworCisgICAgICBpZiAoaGF2ZV9wcmV2X2ZyYW1lX2lkKSB7CisgICAgICAgIGludCBkaWZmX2ZyYW1lX2lkOworICAgICAgICBpZiAoY20tPmN1cnJlbnRfZnJhbWVfaWQgPiBwcmV2X2ZyYW1lX2lkKSB7CisgICAgICAgICAgZGlmZl9mcmFtZV9pZCA9IGNtLT5jdXJyZW50X2ZyYW1lX2lkIC0gcHJldl9mcmFtZV9pZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkaWZmX2ZyYW1lX2lkID0KKyAgICAgICAgICAgICAgKDEgPDwgZnJhbWVfaWRfbGVuZ3RoKSArIGNtLT5jdXJyZW50X2ZyYW1lX2lkIC0gcHJldl9mcmFtZV9pZDsKKyAgICAgICAgfQorICAgICAgICAvKiBDaGVjayBjdXJyZW50X2ZyYW1lX2lkIGZvciBjb25mb3JtYW5jZSAqLworICAgICAgICBpZiAocHJldl9mcmFtZV9pZCA9PSBjbS0+Y3VycmVudF9mcmFtZV9pZCB8fAorICAgICAgICAgICAgZGlmZl9mcmFtZV9pZCA+PSAoMSA8PCAoZnJhbWVfaWRfbGVuZ3RoIC0gMSkpKSB7CisgICAgICAgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCB2YWx1ZSBvZiBjdXJyZW50X2ZyYW1lX2lkIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIENoZWNrIGlmIHNvbWUgZnJhbWVzIG5lZWQgdG8gYmUgbWFya2VkIGFzIG5vdCB2YWxpZCBmb3IgcmVmZXJlbmNpbmcgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBSRUZfRlJBTUVTOyBpKyspIHsKKyAgICAgICAgaWYgKGN1cnJlbnRfZnJhbWUtPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FICYmIGNtLT5zaG93X2ZyYW1lKSB7CisgICAgICAgICAgY20tPnZhbGlkX2Zvcl9yZWZlcmVuY2luZ1tpXSA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAoY20tPmN1cnJlbnRfZnJhbWVfaWQgLSAoMSA8PCBkaWZmX2xlbikgPiAwKSB7CisgICAgICAgICAgaWYgKGNtLT5yZWZfZnJhbWVfaWRbaV0gPiBjbS0+Y3VycmVudF9mcmFtZV9pZCB8fAorICAgICAgICAgICAgICBjbS0+cmVmX2ZyYW1lX2lkW2ldIDwgY20tPmN1cnJlbnRfZnJhbWVfaWQgLSAoMSA8PCBkaWZmX2xlbikpCisgICAgICAgICAgICBjbS0+dmFsaWRfZm9yX3JlZmVyZW5jaW5nW2ldID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoY20tPnJlZl9mcmFtZV9pZFtpXSA+IGNtLT5jdXJyZW50X2ZyYW1lX2lkICYmCisgICAgICAgICAgICAgIGNtLT5yZWZfZnJhbWVfaWRbaV0gPCAoMSA8PCBmcmFtZV9pZF9sZW5ndGgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+Y3VycmVudF9mcmFtZV9pZCAtICgxIDw8IGRpZmZfbGVuKSkKKyAgICAgICAgICAgIGNtLT52YWxpZF9mb3JfcmVmZXJlbmNpbmdbaV0gPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgZnJhbWVfc2l6ZV9vdmVycmlkZV9mbGFnID0gZnJhbWVfaXNfc2ZyYW1lKGNtKSA/IDEgOiBwYXJhbXMtPnAuZnJhbWVfc2l6ZV9vdmVycmlkZV9mbGFnOyAvL2FvbV9yYl9yZWFkX2JpdChyYik7CisKKyAgICBjdXJyZW50X2ZyYW1lLT5vcmRlcl9oaW50ID0gcGFyYW1zLT5wLm9yZGVyX2hpbnQ7IC8qYW9tX3JiX3JlYWRfbGl0ZXJhbCgKKyAgICAgICAgcmIsIHNlcV9wYXJhbXMtPm9yZGVyX2hpbnRfaW5mby5vcmRlcl9oaW50X2JpdHNfbWludXNfMSArIDEpOyovCisgICAgY3VycmVudF9mcmFtZS0+ZnJhbWVfbnVtYmVyID0gY3VycmVudF9mcmFtZS0+b3JkZXJfaGludDsKKworICAgIGlmICghY20tPmVycm9yX3Jlc2lsaWVudF9tb2RlICYmICFmcmFtZV9pc19pbnRyYV9vbmx5KGNtKSkgeworICAgICAgY20tPnByaW1hcnlfcmVmX2ZyYW1lID0gcGFyYW1zLT5wLnByaW1hcnlfcmVmX2ZyYW1lOy8vYW9tX3JiX3JlYWRfbGl0ZXJhbChyYiwgUFJJTUFSWV9SRUZfQklUUyk7CisgICAgfQorICB9CisKKyAgaWYgKHNlcV9wYXJhbXMtPmRlY29kZXJfbW9kZWxfaW5mb19wcmVzZW50X2ZsYWcpIHsKKyAgICBjbS0+YnVmZmVyX3JlbW92YWxfdGltZV9wcmVzZW50ID0gcGFyYW1zLT5wLmJ1ZmZlcl9yZW1vdmFsX3RpbWVfcHJlc2VudDsgLy9hb21fcmJfcmVhZF9iaXQocmIpOworICAgIGlmIChjbS0+YnVmZmVyX3JlbW92YWxfdGltZV9wcmVzZW50KSB7CisgICAgICBpbnQgb3BfbnVtOworICAgICAgZm9yIChvcF9udW0gPSAwOworICAgICAgICAgICBvcF9udW0gPCBzZXFfcGFyYW1zLT5vcGVyYXRpbmdfcG9pbnRzX2NudF9taW51c18xICsgMTsgb3BfbnVtKyspIHsKKyAgICAgICAgaWYgKGNtLT5vcF9wYXJhbXNbb3BfbnVtXS5kZWNvZGVyX21vZGVsX3BhcmFtX3ByZXNlbnRfZmxhZykgeworICAgICAgICAgIGlmICgoKChzZXFfcGFyYW1zLT5vcGVyYXRpbmdfcG9pbnRfaWRjW29wX251bV0gPj4KKyAgICAgICAgICAgICAgICAgY20tPnRlbXBvcmFsX2xheWVyX2lkKSAmCisgICAgICAgICAgICAgICAgMHgxKSAmJgorICAgICAgICAgICAgICAgKChzZXFfcGFyYW1zLT5vcGVyYXRpbmdfcG9pbnRfaWRjW29wX251bV0gPj4KKyAgICAgICAgICAgICAgICAgKGNtLT5zcGF0aWFsX2xheWVyX2lkICsgOCkpICYKKyAgICAgICAgICAgICAgICAweDEpKSB8fAorICAgICAgICAgICAgICBzZXFfcGFyYW1zLT5vcGVyYXRpbmdfcG9pbnRfaWRjW29wX251bV0gPT0gMCkgeworICAgICAgICAgICAgY20tPm9wX2ZyYW1lX3RpbWluZ1tvcF9udW1dLmJ1ZmZlcl9yZW1vdmFsX3RpbWUgPQorICAgICAgICAgICAgICAgIHBhcmFtcy0+cC5vcF9mcmFtZV90aW1pbmdbb3BfbnVtXTsKKyAgICAgICAgICAgICAgICAvKmFvbV9yYl9yZWFkX3Vuc2lnbmVkX2xpdGVyYWwoCisgICAgICAgICAgICAgICAgICAgIHJiLCBjbS0+YnVmZmVyX21vZGVsLmJ1ZmZlcl9yZW1vdmFsX3RpbWVfbGVuZ3RoKTsqLworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbS0+b3BfZnJhbWVfdGltaW5nW29wX251bV0uYnVmZmVyX3JlbW92YWxfdGltZSA9IDA7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNtLT5vcF9mcmFtZV90aW1pbmdbb3BfbnVtXS5idWZmZXJfcmVtb3ZhbF90aW1lID0gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoY3VycmVudF9mcmFtZS0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpIHsKKyAgICBpZiAoIWNtLT5zaG93X2ZyYW1lKSB7ICAvLyB1bnNob3duIGtleWZyYW1lIChmb3J3YXJkIGtleWZyYW1lKQorICAgICAgY3VycmVudF9mcmFtZS0+cmVmcmVzaF9mcmFtZV9mbGFncyA9IHBhcmFtcy0+cC5yZWZyZXNoX2ZyYW1lX2ZsYWdzOyAvL2FvbV9yYl9yZWFkX2xpdGVyYWwocmIsIFJFRl9GUkFNRVMpOworICAgIH0gZWxzZSB7ICAvLyBzaG93biBrZXlmcmFtZQorICAgICAgY3VycmVudF9mcmFtZS0+cmVmcmVzaF9mcmFtZV9mbGFncyA9ICgxIDw8IFJFRl9GUkFNRVMpIC0gMTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgSU5URVJfUkVGU19QRVJfRlJBTUU7ICsraSkgeworICAgICAgY20tPnJlbWFwcGVkX3JlZl9pZHhbaV0gPSBJTlZBTElEX0lEWDsKKyAgICB9CisgICAgaWYgKHBiaS0+bmVlZF9yZXN5bmMpIHsKKyAgICAgIHJlc2V0X3JlZl9mcmFtZV9tYXAocGJpKTsKKyAgICAgIHBiaS0+bmVlZF9yZXN5bmMgPSAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoY3VycmVudF9mcmFtZS0+ZnJhbWVfdHlwZSA9PSBJTlRSQV9PTkxZX0ZSQU1FKSB7CisgICAgICBjdXJyZW50X2ZyYW1lLT5yZWZyZXNoX2ZyYW1lX2ZsYWdzID0gcGFyYW1zLT5wLnJlZnJlc2hfZnJhbWVfZmxhZ3M7IC8vYW9tX3JiX3JlYWRfbGl0ZXJhbChyYiwgUkVGX0ZSQU1FUyk7CisgICAgICBpZiAoY3VycmVudF9mcmFtZS0+cmVmcmVzaF9mcmFtZV9mbGFncyA9PSAweEZGKSB7CisgICAgICAgIGFvbV9pbnRlcm5hbF9lcnJvcigmY20tPmVycm9yLCBBT01fQ09ERUNfVU5TVVBfQklUU1RSRUFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludHJhIG9ubHkgZnJhbWVzIGNhbm5vdCBoYXZlIHJlZnJlc2ggZmxhZ3MgMHhGRiIpOworICAgICAgfQorICAgICAgaWYgKHBiaS0+bmVlZF9yZXN5bmMpIHsKKyAgICAgICAgcmVzZXRfcmVmX2ZyYW1lX21hcChwYmkpOworICAgICAgICBwYmktPm5lZWRfcmVzeW5jID0gMDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHBiaS0+bmVlZF9yZXN5bmMgIT0gMSkgeyAvKiBTa2lwIGlmIG5lZWQgcmVzeW5jICovCisgICAgICBjdXJyZW50X2ZyYW1lLT5yZWZyZXNoX2ZyYW1lX2ZsYWdzID0KKyAgICAgICAgICBmcmFtZV9pc19zZnJhbWUoY20pID8gMHhGRiA6IHBhcmFtcy0+cC5yZWZyZXNoX2ZyYW1lX2ZsYWdzOyAvL2FvbV9yYl9yZWFkX2xpdGVyYWwocmIsIFJFRl9GUkFNRVMpOworICAgIH0KKyAgfQorCisgIGlmICghZnJhbWVfaXNfaW50cmFfb25seShjbSkgfHwgY3VycmVudF9mcmFtZS0+cmVmcmVzaF9mcmFtZV9mbGFncyAhPSAweEZGKSB7CisgICAgLy8gUmVhZCBhbGwgcmVmIGZyYW1lIG9yZGVyIGhpbnRzIGlmIGVycm9yX3Jlc2lsaWVudF9tb2RlID09IDEKKyAgICBpZiAoY20tPmVycm9yX3Jlc2lsaWVudF9tb2RlICYmCisgICAgICAgIHNlcV9wYXJhbXMtPm9yZGVyX2hpbnRfaW5mby5lbmFibGVfb3JkZXJfaGludCkgeworICAgICAgaW50IHJlZl9pZHg7CisgICAgICBmb3IgKHJlZl9pZHggPSAwOyByZWZfaWR4IDwgUkVGX0ZSQU1FUzsgcmVmX2lkeCsrKSB7CisgICAgICAgIC8vIFJlYWQgb3JkZXIgaGludCBmcm9tIGJpdCBzdHJlYW0KKyAgICAgICAgdW5zaWduZWQgaW50IG9yZGVyX2hpbnQgPSBwYXJhbXMtPnAucmVmX29yZGVyX2hpbnRbcmVmX2lkeF07Lyphb21fcmJfcmVhZF9saXRlcmFsKAorICAgICAgICAgICAgcmIsIHNlcV9wYXJhbXMtPm9yZGVyX2hpbnRfaW5mby5vcmRlcl9oaW50X2JpdHNfbWludXNfMSArIDEpOyovCisgICAgICAgIC8vIEdldCBidWZmZXIKKyAgICAgICAgUmVmQ250QnVmZmVyICpidWYgPSBjbS0+cmVmX2ZyYW1lX21hcFtyZWZfaWR4XTsKKyAgICAgICAgaW50IGJ1Zl9pZHg7CisgICAgICAgIGlmIChidWYgPT0gTlVMTCB8fCBvcmRlcl9oaW50ICE9IGJ1Zi0+b3JkZXJfaGludCkgeworICAgICAgICAgIGlmIChidWYgIT0gTlVMTCkgeworICAgICAgICAgICAgbG9ja19idWZmZXJfcG9vbChwb29sLCBmbGFncyk7CisgICAgICAgICAgICBkZWNyZWFzZV9yZWZfY291bnQocGJpLCBidWYsIHBvb2wpOworICAgICAgICAgICAgdW5sb2NrX2J1ZmZlcl9wb29sKHBvb2wsIGZsYWdzKTsKKyAgICAgICAgICB9CisgICAgICAgICAgLy8gSWYgbm8gY29ycmVzcG9uZGluZyBidWZmZXIgZXhpc3RzLCBhbGxvY2F0ZSBhIG5ldyBidWZmZXIgd2l0aCBhbGwKKyAgICAgICAgICAvLyBwaXhlbHMgc2V0IHRvIG5ldXRyYWwgZ3JleS4KKyAgICAgICAgICBidWZfaWR4ID0gIGdldF9mcmVlX2ZyYW1lX2J1ZmZlcihjbSk7CisgICAgICAgICAgaWYgKGJ1Zl9pZHggPT0gSU5WQUxJRF9JRFgpIHsKKyAgICAgICAgICAgIGFvbV9pbnRlcm5hbF9lcnJvcigmY20tPmVycm9yLCBBT01fQ09ERUNfTUVNX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZmluZCBmcmVlIGZyYW1lIGJ1ZmZlciIpOworICAgICAgICAgIH0KKyAgICAgICAgICBidWYgPSAmZnJhbWVfYnVmc1tidWZfaWR4XTsKKyAgICAgICAgICBsb2NrX2J1ZmZlcl9wb29sKHBvb2wsIGZsYWdzKTsKKyAgICAgICAgICBpZiAoYW9tX3JlYWxsb2NfZnJhbWVfYnVmZmVyKGNtLCAmYnVmLT5idWYsIHNlcV9wYXJhbXMtPm1heF9mcmFtZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgIHNlcV9wYXJhbXMtPm1heF9mcmFtZV9oZWlnaHQsIGJ1Zi0+b3JkZXJfaGludCkpIHsKKyAgICAgICAgICAgIGRlY3JlYXNlX3JlZl9jb3VudChwYmksIGJ1ZiwgcG9vbCk7CisgICAgICAgICAgICB1bmxvY2tfYnVmZmVyX3Bvb2wocG9vbCwgZmxhZ3MpOworICAgICAgICAgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19NRU1fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBmcmFtZSBidWZmZXIiKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdW5sb2NrX2J1ZmZlcl9wb29sKHBvb2wsIGZsYWdzKTsKKyNpZmRlZiBPUklfQ09ERQorICAgICAgICAgIHNldF9wbGFuZXNfdG9fbmV1dHJhbF9ncmV5KHNlcV9wYXJhbXMsICZidWYtPmJ1ZiwgMCk7CisjZW5kaWYKKyAgICAgICAgICBjbS0+cmVmX2ZyYW1lX21hcFtyZWZfaWR4XSA9IGJ1ZjsKKyAgICAgICAgICBidWYtPm9yZGVyX2hpbnQgPSBvcmRlcl9oaW50OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGN1cnJlbnRfZnJhbWUtPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKSB7CisgICAgc2V0dXBfZnJhbWVfc2l6ZShjbSwgZnJhbWVfc2l6ZV9vdmVycmlkZV9mbGFnLCBwYXJhbXMpOworI2lmZGVmIE9SSV9DT0RFCisgICAgaWYgKGNtLT5hbGxvd19zY3JlZW5fY29udGVudF90b29scyAmJiAhYXYxX3N1cGVycmVzX3NjYWxlZChjbSkpCisgICAgICBjbS0+YWxsb3dfaW50cmFiYyA9IGFvbV9yYl9yZWFkX2JpdChyYik7CisjZW5kaWYKKyAgICBjbS0+YWxsb3dfcmVmX2ZyYW1lX212cyA9IDA7CisgICAgY20tPnByZXZfZnJhbWUgPSBOVUxMOworICB9IGVsc2UgeworICAgIGNtLT5hbGxvd19yZWZfZnJhbWVfbXZzID0gMDsKKworICAgIGlmIChjdXJyZW50X2ZyYW1lLT5mcmFtZV90eXBlID09IElOVFJBX09OTFlfRlJBTUUpIHsKKyNpZmRlZiBPUklfQ09ERQorICAgICAgY20tPmN1cl9mcmFtZS0+ZmlsbV9ncmFpbl9wYXJhbXNfcHJlc2VudCA9CisgICAgICAgICAgc2VxX3BhcmFtcy0+ZmlsbV9ncmFpbl9wYXJhbXNfcHJlc2VudDsKKyNlbmRpZgorICAgICAgc2V0dXBfZnJhbWVfc2l6ZShjbSwgZnJhbWVfc2l6ZV9vdmVycmlkZV9mbGFnLCBwYXJhbXMpOworI2lmZGVmIE9SSV9DT0RFCisgICAgICBpZiAoY20tPmFsbG93X3NjcmVlbl9jb250ZW50X3Rvb2xzICYmICFhdjFfc3VwZXJyZXNfc2NhbGVkKGNtKSkKKyAgICAgICAgY20tPmFsbG93X2ludHJhYmMgPSBhb21fcmJfcmVhZF9iaXQocmIpOworI2VuZGlmCisgICAgfSBlbHNlIGlmIChwYmktPm5lZWRfcmVzeW5jICE9IDEpIHsgLyogU2tpcCBpZiBuZWVkIHJlc3luYyAqLworICAgICAgaW50IGZyYW1lX3JlZnNfc2hvcnRfc2lnbmFsaW5nID0gMDsKKyAgICAgIC8vIEZyYW1lIHJlZnMgc2hvcnQgc2lnbmFsaW5nIGlzIG9mZiB3aGVuIGVycm9yIHJlc2lsaWVudCBtb2RlIGlzIG9uLgorICAgICAgaWYgKHNlcV9wYXJhbXMtPm9yZGVyX2hpbnRfaW5mby5lbmFibGVfb3JkZXJfaGludCkKKyAgICAgICAgZnJhbWVfcmVmc19zaG9ydF9zaWduYWxpbmcgPSBwYXJhbXMtPnAuZnJhbWVfcmVmc19zaG9ydF9zaWduYWxpbmc7Ly9hb21fcmJfcmVhZF9iaXQocmIpOworCisgICAgICBpZiAoZnJhbWVfcmVmc19zaG9ydF9zaWduYWxpbmcpIHsKKyAgICAgICAgLy8gPT0gTEFTVF9GUkFNRSA9PQorICAgICAgICBjb25zdCBpbnQgbHN0X3JlZiA9IHBhcmFtcy0+cC5sc3RfcmVmOyAvL2FvbV9yYl9yZWFkX2xpdGVyYWwocmIsIFJFRl9GUkFNRVNfTE9HMik7CisgICAgICAgIGNvbnN0IFJlZkNudEJ1ZmZlciAqY29uc3QgbHN0X2J1ZiA9IGNtLT5yZWZfZnJhbWVfbWFwW2xzdF9yZWZdOworCisgICAgICAgIC8vID09IEdPTERFTl9GUkFNRSA9PQorICAgICAgICBjb25zdCBpbnQgZ2xkX3JlZiA9IHBhcmFtcy0+cC5nbGRfcmVmOyAvL2FvbV9yYl9yZWFkX2xpdGVyYWwocmIsIFJFRl9GUkFNRVNfTE9HMik7CisgICAgICAgIGNvbnN0IFJlZkNudEJ1ZmZlciAqY29uc3QgZ2xkX2J1ZiA9IGNtLT5yZWZfZnJhbWVfbWFwW2dsZF9yZWZdOworCisgICAgICAgIC8vIE1vc3Qgb2YgdGhlIHRpbWUsIHN0cmVhbXMgc3RhcnQgd2l0aCBhIGtleWZyYW1lLiBJbiB0aGF0IGNhc2UsCisgICAgICAgIC8vIHJlZl9mcmFtZV9tYXAgd2lsbCBoYXZlIGJlZW4gZmlsbGVkIGluIGF0IHRoYXQgcG9pbnQgYW5kIHdpbGwgbm90CisgICAgICAgIC8vIGNvbnRhaW4gYW55IE5VTExzLiBIb3dldmVyLCBzdHJlYW1zIGFyZSBleHBsaWNpdGx5IGFsbG93ZWQgdG8gc3RhcnQKKyAgICAgICAgLy8gd2l0aCBhbiBpbnRyYS1vbmx5IGZyYW1lLCBzbyBsb25nIGFzIHRoZXkgZG9uJ3QgdGhlbiBzaWduYWwgYQorICAgICAgICAvLyByZWZlcmVuY2UgdG8gYSBzbG90IHRoYXQgaGFzbid0IGJlZW4gc2V0IHlldC4gVGhhdCdzIHdoYXQgd2UgYXJlCisgICAgICAgIC8vIGNoZWNraW5nIGhlcmUuCisgICAgICAgIGlmIChsc3RfYnVmID09IE5VTEwpCisgICAgICAgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXIgZnJhbWUgcmVxdWVzdHMgbm9uZXhpc3RlbnQgcmVmZXJlbmNlIik7CisgICAgICAgIGlmIChnbGRfYnVmID09IE5VTEwpCisgICAgICAgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXIgZnJhbWUgcmVxdWVzdHMgbm9uZXhpc3RlbnQgcmVmZXJlbmNlIik7CisKKyAgICAgICAgYXYxX3NldF9mcmFtZV9yZWZzKGNtLCBjbS0+cmVtYXBwZWRfcmVmX2lkeCwgbHN0X3JlZiwgZ2xkX3JlZik7CisgICAgICB9CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBJTlRFUl9SRUZTX1BFUl9GUkFNRTsgKytpKSB7CisgICAgICAgIGludCByZWYgPSAwOworICAgICAgICBpZiAoIWZyYW1lX3JlZnNfc2hvcnRfc2lnbmFsaW5nKSB7CisgICAgICAgICAgcmVmID0gcGFyYW1zLT5wLnJlbWFwcGVkX3JlZl9pZHhbaV07Ly9hb21fcmJfcmVhZF9saXRlcmFsKHJiLCBSRUZfRlJBTUVTX0xPRzIpOworCisgICAgICAgICAgLy8gTW9zdCBvZiB0aGUgdGltZSwgc3RyZWFtcyBzdGFydCB3aXRoIGEga2V5ZnJhbWUuIEluIHRoYXQgY2FzZSwKKyAgICAgICAgICAvLyByZWZfZnJhbWVfbWFwIHdpbGwgaGF2ZSBiZWVuIGZpbGxlZCBpbiBhdCB0aGF0IHBvaW50IGFuZCB3aWxsIG5vdAorICAgICAgICAgIC8vIGNvbnRhaW4gYW55IE5VTExzLiBIb3dldmVyLCBzdHJlYW1zIGFyZSBleHBsaWNpdGx5IGFsbG93ZWQgdG8gc3RhcnQKKyAgICAgICAgICAvLyB3aXRoIGFuIGludHJhLW9ubHkgZnJhbWUsIHNvIGxvbmcgYXMgdGhleSBkb24ndCB0aGVuIHNpZ25hbCBhCisgICAgICAgICAgLy8gcmVmZXJlbmNlIHRvIGEgc2xvdCB0aGF0IGhhc24ndCBiZWVuIHNldCB5ZXQuIFRoYXQncyB3aGF0IHdlIGFyZQorICAgICAgICAgIC8vIGNoZWNraW5nIGhlcmUuCisgICAgICAgICAgaWYgKGNtLT5yZWZfZnJhbWVfbWFwW3JlZl0gPT0gTlVMTCkKKyAgICAgICAgICAgIGFvbV9pbnRlcm5hbF9lcnJvcigmY20tPmVycm9yLCBBT01fQ09ERUNfQ09SUlVQVF9GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXIgZnJhbWUgcmVxdWVzdHMgbm9uZXhpc3RlbnQgcmVmZXJlbmNlIik7CisgICAgICAgICAgY20tPnJlbWFwcGVkX3JlZl9pZHhbaV0gPSByZWY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVmID0gY20tPnJlbWFwcGVkX3JlZl9pZHhbaV07CisgICAgICAgIH0KKworICAgICAgICBjbS0+cmVmX2ZyYW1lX3NpZ25fYmlhc1tMQVNUX0ZSQU1FICsgaV0gPSAwOworCisgICAgICAgIGlmIChzZXFfcGFyYW1zLT5mcmFtZV9pZF9udW1iZXJzX3ByZXNlbnRfZmxhZykgeworICAgICAgICAgIGludCBmcmFtZV9pZF9sZW5ndGggPSBzZXFfcGFyYW1zLT5mcmFtZV9pZF9sZW5ndGg7CisgICAgICAgICAgLy9pbnQgZGlmZl9sZW4gPSBzZXFfcGFyYW1zLT5kZWx0YV9mcmFtZV9pZF9sZW5ndGg7CisgICAgICAgICAgaW50IGRlbHRhX2ZyYW1lX2lkX21pbnVzXzEgPSBwYXJhbXMtPnAuZGVsdGFfZnJhbWVfaWRfbWludXNfMVtpXTsvL2FvbV9yYl9yZWFkX2xpdGVyYWwocmIsIGRpZmZfbGVuKTsKKyAgICAgICAgICBpbnQgcmVmX2ZyYW1lX2lkID0KKyAgICAgICAgICAgICAgKChjbS0+Y3VycmVudF9mcmFtZV9pZCAtIChkZWx0YV9mcmFtZV9pZF9taW51c18xICsgMSkgKworICAgICAgICAgICAgICAgICgxIDw8IGZyYW1lX2lkX2xlbmd0aCkpICUKKyAgICAgICAgICAgICAgICgxIDw8IGZyYW1lX2lkX2xlbmd0aCkpOworICAgICAgICAgIC8vIENvbXBhcmUgdmFsdWVzIGRlcml2ZWQgZnJvbSBkZWx0YV9mcmFtZV9pZF9taW51c18xIGFuZAorICAgICAgICAgIC8vIHJlZnJlc2hfZnJhbWVfZmxhZ3MuIEFsc28sIGNoZWNrIHZhbGlkIGZvciByZWZlcmVuY2luZworICAgICAgICAgIGlmIChyZWZfZnJhbWVfaWQgIT0gY20tPnJlZl9mcmFtZV9pZFtyZWZdIHx8CisgICAgICAgICAgICAgIGNtLT52YWxpZF9mb3JfcmVmZXJlbmNpbmdbcmVmXSA9PSAwKQorICAgICAgICAgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWZlcmVuY2UgYnVmZmVyIGZyYW1lIElEIG1pc21hdGNoIik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKCFjbS0+ZXJyb3JfcmVzaWxpZW50X21vZGUgJiYgZnJhbWVfc2l6ZV9vdmVycmlkZV9mbGFnKSB7CisgICAgICAgIHNldHVwX2ZyYW1lX3NpemVfd2l0aF9yZWZzKGNtLCBwYXJhbXMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0dXBfZnJhbWVfc2l6ZShjbSwgZnJhbWVfc2l6ZV9vdmVycmlkZV9mbGFnLCBwYXJhbXMpOworICAgICAgfQorI2lmZGVmIE9SSV9DT0RFCisgICAgICBpZiAoY20tPmN1cl9mcmFtZV9mb3JjZV9pbnRlZ2VyX212KSB7CisgICAgICAgIGNtLT5hbGxvd19oaWdoX3ByZWNpc2lvbl9tdiA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBjbS0+YWxsb3dfaGlnaF9wcmVjaXNpb25fbXYgPSBhb21fcmJfcmVhZF9iaXQocmIpOworICAgICAgfQorICAgICAgY20tPmludGVycF9maWx0ZXIgPSByZWFkX2ZyYW1lX2ludGVycF9maWx0ZXIocmIpOworICAgICAgY20tPnN3aXRjaGFibGVfbW90aW9uX21vZGUgPSBhb21fcmJfcmVhZF9iaXQocmIpOworI2VuZGlmCisgICAgfQorCisgICAgY20tPnByZXZfZnJhbWUgPSBnZXRfcHJpbWFyeV9yZWZfZnJhbWVfYnVmKGNtKTsKKyAgICBpZiAoY20tPnByaW1hcnlfcmVmX2ZyYW1lICE9IFBSSU1BUllfUkVGX05PTkUgJiYKKyAgICAgICAgZ2V0X3ByaW1hcnlfcmVmX2ZyYW1lX2J1ZihjbSkgPT0gTlVMTCkgeworICAgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICJSZWZlcmVuY2UgZnJhbWUgY29udGFpbmluZyB0aGlzIGZyYW1lJ3MgaW5pdGlhbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImZyYW1lIGNvbnRleHQgaXMgdW5hdmFpbGFibGUuIik7CisgICAgfQorI2lmIDAKKyAgICBhdjFfcHJpbnQyKEFWMV9ERUJVR19CVUZNR1JfREVUQUlMLCAiJWQsJWQsJWQsJWRcbiIsY20tPmVycm9yX3Jlc2lsaWVudF9tb2RlLAorICAgICAgY20tPnNlcV9wYXJhbXMub3JkZXJfaGludF9pbmZvLmVuYWJsZV9yZWZfZnJhbWVfbXZzLAorICAgICAgY20tPnNlcV9wYXJhbXMub3JkZXJfaGludF9pbmZvLmVuYWJsZV9vcmRlcl9oaW50LGZyYW1lX2lzX2ludHJhX29ubHkoY20pKTsKKworICAgIHByaW50ZigiZnJhbWVfbWlnaHRfYWxsb3dfcmVmX2ZyYW1lX212cygpPT4lZCwgY3VycmVudF9mcmFtZS0+ZnJhbWVfdHlwZT0lZCwgcGJpLT5uZWVkX3Jlc3luYz0lZCwgcGFyYW1zLT5wLmFsbG93X3JlZl9mcmFtZV9tdnM9JWRcbiIsCisgICAgICAgIGZyYW1lX21pZ2h0X2FsbG93X3JlZl9mcmFtZV9tdnMoY20pLCBjdXJyZW50X2ZyYW1lLT5mcmFtZV90eXBlLCBwYmktPm5lZWRfcmVzeW5jLAorICAgICAgICBwYXJhbXMtPnAuYWxsb3dfcmVmX2ZyYW1lX212cyk7CisjZW5kaWYKKyAgICBpZiAoIShjdXJyZW50X2ZyYW1lLT5mcmFtZV90eXBlID09IElOVFJBX09OTFlfRlJBTUUpICYmCisgICAgICAgIHBiaS0+bmVlZF9yZXN5bmMgIT0gMSkgeworICAgICAgaWYgKGZyYW1lX21pZ2h0X2FsbG93X3JlZl9mcmFtZV9tdnMoY20pKQorICAgICAgICBjbS0+YWxsb3dfcmVmX2ZyYW1lX212cyA9IHBhcmFtcy0+cC5hbGxvd19yZWZfZnJhbWVfbXZzOyAvL2FvbV9yYl9yZWFkX2JpdCgtMSwgIjxhbGxvd19yZWZfZnJhbWVfbXZzPiIsIHJiKTsKKyAgICAgIGVsc2UKKyAgICAgICAgY20tPmFsbG93X3JlZl9mcmFtZV9tdnMgPSAwOworCisjaWZkZWYgU1VQUE9SVF9TQ0FMRV9GQUNUT1IKKyAgICAgIGZvciAoaSA9IExBU1RfRlJBTUU7IGkgPD0gQUxUUkVGX0ZSQU1FOyArK2kpIHsKKyAgICAgICAgY29uc3QgUmVmQ250QnVmZmVyICpjb25zdCByZWZfYnVmID0gZ2V0X3JlZl9mcmFtZV9idWYoY20sIGkpOworICAgICAgICBzdHJ1Y3Qgc2NhbGVfZmFjdG9ycyAqY29uc3QgcmVmX3NjYWxlX2ZhY3RvcnMgPQorICAgICAgICAgICAgZ2V0X3JlZl9zY2FsZV9mYWN0b3JzKGNtLCBpKTsKKyAgICAgICBpZiAocmVmX2J1ZiAhPSBOVUxMKSB7CisjaWZkZWYgQU1MCisgICAgICAgIGF2MV9zZXR1cF9zY2FsZV9mYWN0b3JzX2Zvcl9mcmFtZSgKKyAgICAgICAgICAgIHJlZl9zY2FsZV9mYWN0b3JzLCByZWZfYnVmLT5idWYueV9jcm9wX3dpZHRoLAorICAgICAgICAgICAgcmVmX2J1Zi0+YnVmLnlfY3JvcF9oZWlnaHQsIGNtLT5kZWNfd2lkdGgsIGNtLT5oZWlnaHQpOworI2Vsc2UKKyAgICAgICAgYXYxX3NldHVwX3NjYWxlX2ZhY3RvcnNfZm9yX2ZyYW1lKAorICAgICAgICAgICAgcmVmX3NjYWxlX2ZhY3RvcnMsIHJlZl9idWYtPmJ1Zi55X2Nyb3Bfd2lkdGgsCisgICAgICAgICAgICByZWZfYnVmLT5idWYueV9jcm9wX2hlaWdodCwgY20tPndpZHRoLCBjbS0+aGVpZ2h0KTsKKyNlbmRpZgorICAgICAgfQorICAgICAgIGlmIChyZWZfc2NhbGVfZmFjdG9ycykgeworICAgICAgICBpZiAoKCFhdjFfaXNfdmFsaWRfc2NhbGUocmVmX3NjYWxlX2ZhY3RvcnMpKSkKKyAgICAgICAgICBhb21faW50ZXJuYWxfZXJyb3IoJmNtLT5lcnJvciwgQU9NX0NPREVDX1VOU1VQX0JJVFNUUkVBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZmVyZW5jZSBmcmFtZSBoYXMgaW52YWxpZCBkaW1lbnNpb25zIik7CisgICAgICAgfQorICAgICAgfQorI2VuZGlmCisgICAgfQorICB9CisKKyAgYXYxX3NldHVwX2ZyYW1lX2J1Zl9yZWZzKGNtKTsKKworICBhdjFfc2V0dXBfZnJhbWVfc2lnbl9iaWFzKGNtKTsKKworICBjbS0+Y3VyX2ZyYW1lLT5mcmFtZV90eXBlID0gY3VycmVudF9mcmFtZS0+ZnJhbWVfdHlwZTsKKworICBpZiAoc2VxX3BhcmFtcy0+ZnJhbWVfaWRfbnVtYmVyc19wcmVzZW50X2ZsYWcpIHsKKyAgICB1cGRhdGVfcmVmX2ZyYW1lX2lkKGNtLCBjbS0+Y3VycmVudF9mcmFtZV9pZCk7CisgIH0KKyNpZmRlZiBPUklfQ09ERQorICBjb25zdCBpbnQgbWlnaHRfYndkX2FkYXB0ID0KKyAgICAgICEoc2VxX3BhcmFtcy0+cmVkdWNlZF9zdGlsbF9waWN0dXJlX2hkcikgJiYgIShjbS0+ZGlzYWJsZV9jZGZfdXBkYXRlKTsKKyAgaWYgKG1pZ2h0X2J3ZF9hZGFwdCkgeworICAgIGNtLT5yZWZyZXNoX2ZyYW1lX2NvbnRleHQgPSBhb21fcmJfcmVhZF9iaXQocmIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFJFRlJFU0hfRlJBTUVfQ09OVEVYVF9ESVNBQkxFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBSRUZSRVNIX0ZSQU1FX0NPTlRFWFRfQkFDS1dBUkQ7CisgIH0gZWxzZSB7CisgICAgY20tPnJlZnJlc2hfZnJhbWVfY29udGV4dCA9IFJFRlJFU0hfRlJBTUVfQ09OVEVYVF9ESVNBQkxFRDsKKyAgfQorI2VuZGlmCisKKyAgY20tPmN1cl9mcmFtZS0+YnVmLmJpdF9kZXB0aCA9IHNlcV9wYXJhbXMtPmJpdF9kZXB0aDsKKyAgY20tPmN1cl9mcmFtZS0+YnVmLmNvbG9yX3ByaW1hcmllcyA9IHNlcV9wYXJhbXMtPmNvbG9yX3ByaW1hcmllczsKKyAgY20tPmN1cl9mcmFtZS0+YnVmLnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljcyA9CisgICAgICBzZXFfcGFyYW1zLT50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3M7CisgIGNtLT5jdXJfZnJhbWUtPmJ1Zi5tYXRyaXhfY29lZmZpY2llbnRzID0gc2VxX3BhcmFtcy0+bWF0cml4X2NvZWZmaWNpZW50czsKKyAgY20tPmN1cl9mcmFtZS0+YnVmLm1vbm9jaHJvbWUgPSBzZXFfcGFyYW1zLT5tb25vY2hyb21lOworICBjbS0+Y3VyX2ZyYW1lLT5idWYuY2hyb21hX3NhbXBsZV9wb3NpdGlvbiA9CisgICAgICBzZXFfcGFyYW1zLT5jaHJvbWFfc2FtcGxlX3Bvc2l0aW9uOworICBjbS0+Y3VyX2ZyYW1lLT5idWYuY29sb3JfcmFuZ2UgPSBzZXFfcGFyYW1zLT5jb2xvcl9yYW5nZTsKKyAgY20tPmN1cl9mcmFtZS0+YnVmLnJlbmRlcl93aWR0aCA9IGNtLT5yZW5kZXJfd2lkdGg7CisgIGNtLT5jdXJfZnJhbWUtPmJ1Zi5yZW5kZXJfaGVpZ2h0ID0gY20tPnJlbmRlcl9oZWlnaHQ7CisKKyAgaWYgKHBiaS0+bmVlZF9yZXN5bmMpIHsKKyAgICBhb21faW50ZXJuYWxfZXJyb3IoJmNtLT5lcnJvciwgQU9NX0NPREVDX0NPUlJVUFRfRlJBTUUsCisgICAgICAgICAgICAgICAgICAgICAgICJLZXlmcmFtZSAvIGludHJhLW9ubHkgZnJhbWUgcmVxdWlyZWQgdG8gcmVzZXQgZGVjb2RlciIKKyAgICAgICAgICAgICAgICAgICAgICAgIiBzdGF0ZSIpOworICB9CisKKyAgZ2VuZXJhdGVfbmV4dF9yZWZfZnJhbWVfbWFwKHBiaSk7CisKKyNpZmRlZiBPUklfQ09ERQorICBpZiAoY20tPmFsbG93X2ludHJhYmMpIHsKKyAgICAvLyBTZXQgcGFyYW1ldGVycyBjb3JyZXNwb25kaW5nIHRvIG5vIGZpbHRlcmluZy4KKyAgICBzdHJ1Y3QgbG9vcGZpbHRlciAqbGYgPSAmY20tPmxmOworICAgIGxmLT5maWx0ZXJfbGV2ZWxbMF0gPSAwOworICAgIGxmLT5maWx0ZXJfbGV2ZWxbMV0gPSAwOworICAgIGNtLT5jZGVmX2luZm8uY2RlZl9iaXRzID0gMDsKKyAgICBjbS0+Y2RlZl9pbmZvLmNkZWZfc3RyZW5ndGhzWzBdID0gMDsKKyAgICBjbS0+Y2RlZl9pbmZvLm5iX2NkZWZfc3RyZW5ndGhzID0gMTsKKyAgICBjbS0+Y2RlZl9pbmZvLmNkZWZfdXZfc3RyZW5ndGhzWzBdID0gMDsKKyAgICBjbS0+cnN0X2luZm9bMF0uZnJhbWVfcmVzdG9yYXRpb25fdHlwZSA9IFJFU1RPUkVfTk9ORTsKKyAgICBjbS0+cnN0X2luZm9bMV0uZnJhbWVfcmVzdG9yYXRpb25fdHlwZSA9IFJFU1RPUkVfTk9ORTsKKyAgICBjbS0+cnN0X2luZm9bMl0uZnJhbWVfcmVzdG9yYXRpb25fdHlwZSA9IFJFU1RPUkVfTk9ORTsKKyAgfQorCisgIHJlYWRfdGlsZV9pbmZvKHBiaSwgcmIpOworICBpZiAoIWF2MV9pc19taW5fdGlsZV93aWR0aF9zYXRpc2ZpZWQoY20pKSB7CisgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAiTWluaW11bSB0aWxlIHdpZHRoIHJlcXVpcmVtZW50IG5vdCBzYXRpc2ZpZWQiKTsKKyAgfQorCisgIHNldHVwX3F1YW50aXphdGlvbihjbSwgcmIpOworICB4ZC0+YmQgPSAoaW50KXNlcV9wYXJhbXMtPmJpdF9kZXB0aDsKKworICBpZiAoY20tPm51bV9hbGxvY2F0ZWRfYWJvdmVfY29udGV4dF9wbGFuZXMgPCBhdjFfbnVtX3BsYW5lcyhjbSkgfHwKKyAgICAgIGNtLT5udW1fYWxsb2NhdGVkX2Fib3ZlX2NvbnRleHRfbWlfY29sIDwgY20tPm1pX2NvbHMgfHwKKyAgICAgIGNtLT5udW1fYWxsb2NhdGVkX2Fib3ZlX2NvbnRleHRzIDwgY20tPnRpbGVfcm93cykgeworICAgIGF2MV9mcmVlX2Fib3ZlX2NvbnRleHRfYnVmZmVycyhjbSwgY20tPm51bV9hbGxvY2F0ZWRfYWJvdmVfY29udGV4dHMpOworICAgIGlmIChhdjFfYWxsb2NfYWJvdmVfY29udGV4dF9idWZmZXJzKGNtLCBjbS0+dGlsZV9yb3dzKSkKKyAgICAgIGFvbV9pbnRlcm5hbF9lcnJvcigmY20tPmVycm9yLCBBT01fQ09ERUNfTUVNX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgY29udGV4dCBidWZmZXJzIik7CisgIH0KKworICBpZiAoY20tPnByaW1hcnlfcmVmX2ZyYW1lID09IFBSSU1BUllfUkVGX05PTkUpIHsKKyAgICBhdjFfc2V0dXBfcGFzdF9pbmRlcGVuZGVuY2UoY20pOworICB9CisKKyAgc2V0dXBfc2VnbWVudGF0aW9uKGNtLCBwYXJhbXMpOworCisgIGNtLT5kZWx0YV9xX2luZm8uZGVsdGFfcV9yZXMgPSAxOworICBjbS0+ZGVsdGFfcV9pbmZvLmRlbHRhX2xmX3JlcyA9IDE7CisgIGNtLT5kZWx0YV9xX2luZm8uZGVsdGFfbGZfcHJlc2VudF9mbGFnID0gMDsKKyAgY20tPmRlbHRhX3FfaW5mby5kZWx0YV9sZl9tdWx0aSA9IDA7CisgIGNtLT5kZWx0YV9xX2luZm8uZGVsdGFfcV9wcmVzZW50X2ZsYWcgPQorICAgICAgY20tPmJhc2VfcWluZGV4ID4gMCA/IGFvbV9yYl9yZWFkX2JpdCgtMSwgZGVmbWFyaywgcmIpIDogMDsKKyAgaWYgKGNtLT5kZWx0YV9xX2luZm8uZGVsdGFfcV9wcmVzZW50X2ZsYWcpIHsKKyAgICB4ZC0+Y3VycmVudF9xaW5kZXggPSBjbS0+YmFzZV9xaW5kZXg7CisgICAgY20tPmRlbHRhX3FfaW5mby5kZWx0YV9xX3JlcyA9IDEgPDwgYW9tX3JiX3JlYWRfbGl0ZXJhbCgtMSwgZGVmbWFyaywgcmIsIDIpOworICAgIGlmICghY20tPmFsbG93X2ludHJhYmMpCisgICAgICBjbS0+ZGVsdGFfcV9pbmZvLmRlbHRhX2xmX3ByZXNlbnRfZmxhZyA9IGFvbV9yYl9yZWFkX2JpdCgtMSwgZGVmbWFyaywgcmIpOworICAgIGlmIChjbS0+ZGVsdGFfcV9pbmZvLmRlbHRhX2xmX3ByZXNlbnRfZmxhZykgeworICAgICAgY20tPmRlbHRhX3FfaW5mby5kZWx0YV9sZl9yZXMgPSAxIDw8IGFvbV9yYl9yZWFkX2xpdGVyYWwoLTEsIGRlZm1hcmssIHJiLCAyKTsKKyAgICAgIGNtLT5kZWx0YV9xX2luZm8uZGVsdGFfbGZfbXVsdGkgPSBhb21fcmJfcmVhZF9iaXQoLTEsIGRlZm1hcmssIHJiKTsKKyAgICAgIGF2MV9yZXNldF9sb29wX2ZpbHRlcl9kZWx0YSh4ZCwgYXYxX251bV9wbGFuZXMoY20pKTsKKyAgICB9CisgIH0KKworICB4ZC0+Y3VyX2ZyYW1lX2ZvcmNlX2ludGVnZXJfbXYgPSBjbS0+Y3VyX2ZyYW1lX2ZvcmNlX2ludGVnZXJfbXY7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfU0VHTUVOVFM7ICsraSkgeworICAgIGNvbnN0IGludCBxaW5kZXggPSBhdjFfZ2V0X3FpbmRleCgmY20tPnNlZywgaSwgY20tPmJhc2VfcWluZGV4KTsKKyAgICB4ZC0+bG9zc2xlc3NbaV0gPSBxaW5kZXggPT0gMCAmJiBjbS0+eV9kY19kZWx0YV9xID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICBjbS0+dV9kY19kZWx0YV9xID09IDAgJiYgY20tPnVfYWNfZGVsdGFfcSA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgY20tPnZfZGNfZGVsdGFfcSA9PSAwICYmIGNtLT52X2FjX2RlbHRhX3EgPT0gMDsKKyAgICB4ZC0+cWluZGV4W2ldID0gcWluZGV4OworICB9CisgIGNtLT5jb2RlZF9sb3NzbGVzcyA9IGlzX2NvZGVkX2xvc3NsZXNzKGNtLCB4ZCk7CisgIGNtLT5hbGxfbG9zc2xlc3MgPSBjbS0+Y29kZWRfbG9zc2xlc3MgJiYgIWF2MV9zdXBlcnJlc19zY2FsZWQoY20pOworICBzZXR1cF9zZWdtZW50YXRpb25fZGVxdWFudChjbSwgeGQpOworICBpZiAoY20tPmNvZGVkX2xvc3NsZXNzKSB7CisgICAgY20tPmxmLmZpbHRlcl9sZXZlbFswXSA9IDA7CisgICAgY20tPmxmLmZpbHRlcl9sZXZlbFsxXSA9IDA7CisgIH0KKyAgaWYgKGNtLT5jb2RlZF9sb3NzbGVzcyB8fCAhc2VxX3BhcmFtcy0+ZW5hYmxlX2NkZWYpIHsKKyAgICBjbS0+Y2RlZl9pbmZvLmNkZWZfYml0cyA9IDA7CisgICAgY20tPmNkZWZfaW5mby5jZGVmX3N0cmVuZ3Roc1swXSA9IDA7CisgICAgY20tPmNkZWZfaW5mby5jZGVmX3V2X3N0cmVuZ3Roc1swXSA9IDA7CisgIH0KKyAgaWYgKGNtLT5hbGxfbG9zc2xlc3MgfHwgIXNlcV9wYXJhbXMtPmVuYWJsZV9yZXN0b3JhdGlvbikgeworICAgIGNtLT5yc3RfaW5mb1swXS5mcmFtZV9yZXN0b3JhdGlvbl90eXBlID0gUkVTVE9SRV9OT05FOworICAgIGNtLT5yc3RfaW5mb1sxXS5mcmFtZV9yZXN0b3JhdGlvbl90eXBlID0gUkVTVE9SRV9OT05FOworICAgIGNtLT5yc3RfaW5mb1syXS5mcmFtZV9yZXN0b3JhdGlvbl90eXBlID0gUkVTVE9SRV9OT05FOworICB9CisgIHNldHVwX2xvb3BmaWx0ZXIoY20sIHJiKTsKKworICBpZiAoIWNtLT5jb2RlZF9sb3NzbGVzcyAmJiBzZXFfcGFyYW1zLT5lbmFibGVfY2RlZikgeworICAgIHNldHVwX2NkZWYoY20sIHJiKTsKKyAgfQorICBpZiAoIWNtLT5hbGxfbG9zc2xlc3MgJiYgc2VxX3BhcmFtcy0+ZW5hYmxlX3Jlc3RvcmF0aW9uKSB7CisgICAgZGVjb2RlX3Jlc3RvcmF0aW9uX21vZGUoY20sIHJiKTsKKyAgfQorCisgIGNtLT50eF9tb2RlID0gcmVhZF90eF9tb2RlKGNtLCByYik7CisjZW5kaWYKKworICBjdXJyZW50X2ZyYW1lLT5yZWZlcmVuY2VfbW9kZSA9IHJlYWRfZnJhbWVfcmVmZXJlbmNlX21vZGUoY20sIHBhcmFtcyk7CisKKyNpZmRlZiBPUklfQ09ERQorICBpZiAoY3VycmVudF9mcmFtZS0+cmVmZXJlbmNlX21vZGUgIT0gU0lOR0xFX1JFRkVSRU5DRSkKKyAgICBzZXR1cF9jb21wb3VuZF9yZWZlcmVuY2VfbW9kZShjbSk7CisKKworI2VuZGlmCisKKyAgYXYxX3NldHVwX3NraXBfbW9kZV9hbGxvd2VkKGNtKTsKKworICAvKgorICAgIHRoZSBwb2ludCB0aGF0IHVjb2RlIHNlbmQgc2VuZF9idWZtZ3JfaW5mbworICAgIGFuZCB3YWl0IGJ1Zm1nciBjb2RlIHRvIHJldHVybiBpc19za2lwX21vZGVfYWxsb3dlZAorICAqLworCisgIC8qCisgIHJlYWRfdW5jb21wcmVzc2VkX2hlYWRlcigpIGVuZAorICAqLworCisgIGF2MV9zZXR1cF9tb3Rpb25fZmllbGQoY20pOworI2lmZGVmIEFNTAorICBjbS0+Y3VyX2ZyYW1lLT5taV9jb2xzID0gY20tPm1pX2NvbHM7CisgIGNtLT5jdXJfZnJhbWUtPm1pX3Jvd3MgPSBjbS0+bWlfcm93czsKKyAgY20tPmN1cl9mcmFtZS0+ZGVjX3dpZHRoID0gY20tPmRlY193aWR0aDsKKworICAvKgorICBzdXBlcnJlc19wb3N0X2RlY29kZShBVjFEZWNvZGVyICpwYmkpID0+CisgICAgYXYxX3N1cGVycmVzX3Vwc2NhbGUoY20sIHBvb2wpOyA9PgorICAgICAgYW9tX3JlYWxsb2NfZnJhbWVfYnVmZmVyKAorICAgICAgICAgICAgZnJhbWVfdG9fc2hvdywgY20tPnN1cGVycmVzX3Vwc2NhbGVkX3dpZHRoLAorICAgICAgICAgICAgY20tPnN1cGVycmVzX3Vwc2NhbGVkX2hlaWdodCwgc2VxX3BhcmFtcy0+c3Vic2FtcGxpbmdfeCwKKyAgICAgICAgICAgIHNlcV9wYXJhbXMtPnN1YnNhbXBsaW5nX3ksIHNlcV9wYXJhbXMtPnVzZV9oaWdoYml0ZGVwdGgsCisgICAgICAgICAgICBBT01fQk9SREVSX0lOX1BJWEVMUywgY20tPmJ5dGVfYWxpZ25tZW50LCBmYiwgY2IsIGNiX3ByaXYpCisgICovCisgIGFvbV9yZWFsbG9jX2ZyYW1lX2J1ZmZlcihjbSwgJmNtLT5jdXJfZnJhbWUtPmJ1ZiwKKyAgICBjbS0+c3VwZXJyZXNfdXBzY2FsZWRfd2lkdGgsIGNtLT5zdXBlcnJlc191cHNjYWxlZF9oZWlnaHQsCisgICAgY20tPmN1cl9mcmFtZS0+b3JkZXJfaGludCk7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXJlX3NlcV9oZWFkZXJzX2NvbnNpc3RlbnQoY29uc3QgU2VxdWVuY2VIZWFkZXIgKnNlcV9wYXJhbXNfb2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZXF1ZW5jZUhlYWRlciAqc2VxX3BhcmFtc19uZXcpIHsKKyAgcmV0dXJuICFtZW1jbXAoc2VxX3BhcmFtc19vbGQsIHNlcV9wYXJhbXNfbmV3LCBzaXplb2YoU2VxdWVuY2VIZWFkZXIpKTsKK30KKworYW9tX2NvZGVjX2Vycl90IGFvbV9nZXRfbnVtX2xheWVyc19mcm9tX29wZXJhdGluZ19wb2ludF9pZGMoCisgICAgaW50IG9wZXJhdGluZ19wb2ludF9pZGMsIHVuc2lnbmVkIGludCAqbnVtYmVyX3NwYXRpYWxfbGF5ZXJzLAorICAgIHVuc2lnbmVkIGludCAqbnVtYmVyX3RlbXBvcmFsX2xheWVycykgeworICAvLyBkZXJpdmUgbnVtYmVyIG9mIHNwYXRpYWwvdGVtcG9yYWwgbGF5ZXJzIGZyb20gb3BlcmF0aW5nX3BvaW50X2lkYworCisgIGlmICghbnVtYmVyX3NwYXRpYWxfbGF5ZXJzIHx8ICFudW1iZXJfdGVtcG9yYWxfbGF5ZXJzKQorICAgIHJldHVybiBBT01fQ09ERUNfSU5WQUxJRF9QQVJBTTsKKworICBpZiAob3BlcmF0aW5nX3BvaW50X2lkYyA9PSAwKSB7CisgICAgKm51bWJlcl90ZW1wb3JhbF9sYXllcnMgPSAxOworICAgICpudW1iZXJfc3BhdGlhbF9sYXllcnMgPSAxOworICB9IGVsc2UgeworICAgIGludCBqOworICAgICpudW1iZXJfc3BhdGlhbF9sYXllcnMgPSAwOworICAgICpudW1iZXJfdGVtcG9yYWxfbGF5ZXJzID0gMDsKKyAgICBmb3IgKGogPSAwOyBqIDwgTUFYX05VTV9TUEFUSUFMX0xBWUVSUzsgaisrKSB7CisgICAgICAqbnVtYmVyX3NwYXRpYWxfbGF5ZXJzICs9CisgICAgICAgICAgKG9wZXJhdGluZ19wb2ludF9pZGMgPj4gKGogKyBNQVhfTlVNX1RFTVBPUkFMX0xBWUVSUykpICYgMHgxOworICAgIH0KKyAgICBmb3IgKGogPSAwOyBqIDwgTUFYX05VTV9URU1QT1JBTF9MQVlFUlM7IGorKykgeworICAgICAgKm51bWJlcl90ZW1wb3JhbF9sYXllcnMgKz0gKG9wZXJhdGluZ19wb2ludF9pZGMgPj4gaikgJiAweDE7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEFPTV9DT0RFQ19PSzsKK30KKwordm9pZCBhdjFfcmVhZF9zZXF1ZW5jZV9oZWFkZXIoQVYxX0NPTU1PTiAqY20sIHVuaW9uIHBhcmFtX3UgKnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlSGVhZGVyICpzZXFfcGFyYW1zKSB7CisjaWZkZWYgT1JJX0NPREUKKyAgY29uc3QgaW50IG51bV9iaXRzX3dpZHRoID0gYW9tX3JiX3JlYWRfbGl0ZXJhbCgtMSwgIjxudW1fYml0c193aWR0aD4iLCByYiwgNCkgKyAxOworICBjb25zdCBpbnQgbnVtX2JpdHNfaGVpZ2h0ID0gYW9tX3JiX3JlYWRfbGl0ZXJhbCgtMSwgIjxudW1fYml0c19oZWlnaHQ+IiwgcmIsIDQpICsgMTsKKyAgY29uc3QgaW50IG1heF9mcmFtZV93aWR0aCA9IGFvbV9yYl9yZWFkX2xpdGVyYWwoLTEsICI8bWF4X2ZyYW1lX3dpZHRoPiIsIHJiLCBudW1fYml0c193aWR0aCkgKyAxOworICBjb25zdCBpbnQgbWF4X2ZyYW1lX2hlaWdodCA9IGFvbV9yYl9yZWFkX2xpdGVyYWwoLTEsICI8bWF4X2ZyYW1lX2hlaWdodD4iLCByYiwgbnVtX2JpdHNfaGVpZ2h0KSArIDE7CisKKyAgc2VxX3BhcmFtcy0+bnVtX2JpdHNfd2lkdGggPSBudW1fYml0c193aWR0aDsKKyAgc2VxX3BhcmFtcy0+bnVtX2JpdHNfaGVpZ2h0ID0gbnVtX2JpdHNfaGVpZ2h0OworI2VuZGlmCisgIHNlcV9wYXJhbXMtPm1heF9mcmFtZV93aWR0aCA9IHBhcmFtcy0+cC5tYXhfZnJhbWVfd2lkdGg7IC8vbWF4X2ZyYW1lX3dpZHRoOworICBzZXFfcGFyYW1zLT5tYXhfZnJhbWVfaGVpZ2h0ID0gcGFyYW1zLT5wLm1heF9mcmFtZV9oZWlnaHQ7IC8vbWF4X2ZyYW1lX2hlaWdodDsKKworICBpZiAoc2VxX3BhcmFtcy0+cmVkdWNlZF9zdGlsbF9waWN0dXJlX2hkcikgeworICAgIHNlcV9wYXJhbXMtPmZyYW1lX2lkX251bWJlcnNfcHJlc2VudF9mbGFnID0gMDsKKyAgfSBlbHNlIHsKKyAgICBzZXFfcGFyYW1zLT5mcmFtZV9pZF9udW1iZXJzX3ByZXNlbnRfZmxhZyA9IHBhcmFtcy0+cC5mcmFtZV9pZF9udW1iZXJzX3ByZXNlbnRfZmxhZzsgLy9hb21fcmJfcmVhZF9iaXQoLTEsICI8ZnJhbWVfaWRfbnVtYmVyc19wcmVzZW50X2ZsYWc+IiwgcmIpOworICB9CisgIGlmIChzZXFfcGFyYW1zLT5mcmFtZV9pZF9udW1iZXJzX3ByZXNlbnRfZmxhZykgeworICAgIC8vIFdlIG11c3QgYWx3YXlzIGhhdmUgZGVsdGFfZnJhbWVfaWRfbGVuZ3RoIDwgZnJhbWVfaWRfbGVuZ3RoLAorICAgIC8vIGluIG9yZGVyIGZvciBhIGZyYW1lIHRvIGJlIHJlZmVyZW5jZWQgd2l0aCBhIHVuaXF1ZSBkZWx0YS4KKyAgICAvLyBBdm9pZCB3YXN0aW5nIGJpdHMgYnkgdXNpbmcgYSBjb2RpbmcgdGhhdCBlbmZvcmNlcyB0aGlzIHJlc3RyaWN0aW9uLgorI2lmZGVmIE9SSV9DT0RFCisgICAgc2VxX3BhcmFtcy0+ZGVsdGFfZnJhbWVfaWRfbGVuZ3RoID0gYW9tX3JiX3JlYWRfbGl0ZXJhbCgtMSwgIjxkZWx0YV9mcmFtZV9pZF9sZW5ndGg+IiwgcmIsIDQpICsgMjsKKyAgICBzZXFfcGFyYW1zLT5mcmFtZV9pZF9sZW5ndGggPSBwYXJhbXMtPnAuZnJhbWVfaWRfbGVuZ3RoICArIGFvbV9yYl9yZWFkX2xpdGVyYWwoLTEsICI8ZnJhbWVfaWRfbGVuZ3RoPiIsIHJiLCAzKSArIHNlcV9wYXJhbXMtPmRlbHRhX2ZyYW1lX2lkX2xlbmd0aCArIDE7CisjZWxzZQorICAgIHNlcV9wYXJhbXMtPmRlbHRhX2ZyYW1lX2lkX2xlbmd0aCA9IHBhcmFtcy0+cC5kZWx0YV9mcmFtZV9pZF9sZW5ndGg7CisgICAgc2VxX3BhcmFtcy0+ZnJhbWVfaWRfbGVuZ3RoID0gcGFyYW1zLT5wLmZyYW1lX2lkX2xlbmd0aCAgKyBzZXFfcGFyYW1zLT5kZWx0YV9mcmFtZV9pZF9sZW5ndGggKyAxOworI2VuZGlmCisgICAgaWYgKHNlcV9wYXJhbXMtPmZyYW1lX2lkX2xlbmd0aCA+IDE2KQorICAgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGZyYW1lX2lkX2xlbmd0aCIpOworICB9CisjaWZkZWYgT1JJX0NPREUKKyAgc2V0dXBfc2Jfc2l6ZShzZXFfcGFyYW1zLCByYik7CisgIHNlcV9wYXJhbXMtPmVuYWJsZV9maWx0ZXJfaW50cmEgPSBhb21fcmJfcmVhZF9iaXQoLTEsICI8ZW5hYmxlX2ZpbHRlcl9pbnRyYT4iLCByYik7CisgIHNlcV9wYXJhbXMtPmVuYWJsZV9pbnRyYV9lZGdlX2ZpbHRlciA9IGFvbV9yYl9yZWFkX2JpdCgtMSwgIjxlbmFibGVfaW50cmFfZWRnZV9maWx0ZXI+IiwgcmIpOworI2VuZGlmCisKKyAgaWYgKHNlcV9wYXJhbXMtPnJlZHVjZWRfc3RpbGxfcGljdHVyZV9oZHIpIHsKKyAgICBzZXFfcGFyYW1zLT5lbmFibGVfaW50ZXJpbnRyYV9jb21wb3VuZCA9IDA7CisgICAgc2VxX3BhcmFtcy0+ZW5hYmxlX21hc2tlZF9jb21wb3VuZCA9IDA7CisgICAgc2VxX3BhcmFtcy0+ZW5hYmxlX3dhcnBlZF9tb3Rpb24gPSAwOworICAgIHNlcV9wYXJhbXMtPmVuYWJsZV9kdWFsX2ZpbHRlciA9IDA7CisgICAgc2VxX3BhcmFtcy0+b3JkZXJfaGludF9pbmZvLmVuYWJsZV9vcmRlcl9oaW50ID0gMDsKKyAgICBzZXFfcGFyYW1zLT5vcmRlcl9oaW50X2luZm8uZW5hYmxlX2Rpc3Rfd3RkX2NvbXAgPSAwOworICAgIHNlcV9wYXJhbXMtPm9yZGVyX2hpbnRfaW5mby5lbmFibGVfcmVmX2ZyYW1lX212cyA9IDA7CisgICAgc2VxX3BhcmFtcy0+Zm9yY2Vfc2NyZWVuX2NvbnRlbnRfdG9vbHMgPSAyOyAgLy8gU0VMRUNUX1NDUkVFTl9DT05URU5UX1RPT0xTCisgICAgc2VxX3BhcmFtcy0+Zm9yY2VfaW50ZWdlcl9tdiA9IDI7ICAgICAgICAgICAgLy8gU0VMRUNUX0lOVEVHRVJfTVYKKyAgICBzZXFfcGFyYW1zLT5vcmRlcl9oaW50X2luZm8ub3JkZXJfaGludF9iaXRzX21pbnVzXzEgPSAtMTsKKyAgfSBlbHNlIHsKKyNpZmRlZiBPUklfQ09ERQorICAgIHNlcV9wYXJhbXMtPmVuYWJsZV9pbnRlcmludHJhX2NvbXBvdW5kID0gYW9tX3JiX3JlYWRfYml0KC0xLCAiPGVuYWJsZV9pbnRlcmludHJhX2NvbXBvdW5kPiIsIHJiKTsKKyAgICBzZXFfcGFyYW1zLT5lbmFibGVfbWFza2VkX2NvbXBvdW5kID0gYW9tX3JiX3JlYWRfYml0KC0xLCAiPGVuYWJsZV9tYXNrZWRfY29tcG91bmQ+IiwgcmIpOworICAgIHNlcV9wYXJhbXMtPmVuYWJsZV93YXJwZWRfbW90aW9uID0gYW9tX3JiX3JlYWRfYml0KC0xLCAiPGVuYWJsZV93YXJwZWRfbW90aW9uPiIsIHJiKTsKKyAgICBzZXFfcGFyYW1zLT5lbmFibGVfZHVhbF9maWx0ZXIgPSBhb21fcmJfcmVhZF9iaXQoLTEsICI8ZW5hYmxlX2R1YWxfZmlsdGVyPiIsIHJiKTsKKyNlbmRpZgorICAgIHNlcV9wYXJhbXMtPm9yZGVyX2hpbnRfaW5mby5lbmFibGVfb3JkZXJfaGludCA9IHBhcmFtcy0+cC5lbmFibGVfb3JkZXJfaGludDsgLy9hb21fcmJfcmVhZF9iaXQoLTEsICI8b3JkZXJfaGludF9pbmZvLmVuYWJsZV9vcmRlcl9oaW50PiIsIHJiKTsKKyAgICBzZXFfcGFyYW1zLT5vcmRlcl9oaW50X2luZm8uZW5hYmxlX2Rpc3Rfd3RkX2NvbXAgPQorICAgICAgICBzZXFfcGFyYW1zLT5vcmRlcl9oaW50X2luZm8uZW5hYmxlX29yZGVyX2hpbnQgPyBwYXJhbXMtPnAuZW5hYmxlX2Rpc3Rfd3RkX2NvbXAgOiAwOyAvL2FvbV9yYl9yZWFkX2JpdCgtMSwgIjxvcmRlcl9oaW50X2luZm8uZW5hYmxlX2Rpc3Rfd3RkX2NvbXA+IiwgcmIpIDogMDsKKyAgICBzZXFfcGFyYW1zLT5vcmRlcl9oaW50X2luZm8uZW5hYmxlX3JlZl9mcmFtZV9tdnMgPQorICAgICAgICBzZXFfcGFyYW1zLT5vcmRlcl9oaW50X2luZm8uZW5hYmxlX29yZGVyX2hpbnQgPyBwYXJhbXMtPnAuZW5hYmxlX3JlZl9mcmFtZV9tdnMgOiAwOyAvL2FvbV9yYl9yZWFkX2JpdCgtMSwgIjxvcmRlcl9oaW50X2luZm8uZW5hYmxlX3JlZl9mcmFtZV9tdnM+IiwgcmIpIDogMDsKKworI2lmZGVmIE9SSV9DT0RFCisgICAgaWYgKGFvbV9yYl9yZWFkX2JpdCgtMSwgZGVmbWFyaywgcmIpKSB7CisgICAgICBzZXFfcGFyYW1zLT5mb3JjZV9zY3JlZW5fY29udGVudF90b29scyA9CisgICAgICAgICAgMjsgIC8vIFNFTEVDVF9TQ1JFRU5fQ09OVEVOVF9UT09MUworICAgIH0gZWxzZSB7CisgICAgICBzZXFfcGFyYW1zLT5mb3JjZV9zY3JlZW5fY29udGVudF90b29scyA9IGFvbV9yYl9yZWFkX2JpdCgtMSwgZGVmbWFyaywgcmIpOworICAgIH0KKworICAgIGlmIChzZXFfcGFyYW1zLT5mb3JjZV9zY3JlZW5fY29udGVudF90b29scyA+IDApIHsKKyAgICAgIGlmIChhb21fcmJfcmVhZF9iaXQoLTEsIGRlZm1hcmssIHJiKSkgeworICAgICAgICBzZXFfcGFyYW1zLT5mb3JjZV9pbnRlZ2VyX212ID0gMjsgIC8vIFNFTEVDVF9JTlRFR0VSX01WCisgICAgICB9IGVsc2UgeworICAgICAgICBzZXFfcGFyYW1zLT5mb3JjZV9pbnRlZ2VyX212ID0gYW9tX3JiX3JlYWRfYml0KC0xLCBkZWZtYXJrLCByYik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHNlcV9wYXJhbXMtPmZvcmNlX2ludGVnZXJfbXYgPSAyOyAgLy8gU0VMRUNUX0lOVEVHRVJfTVYKKyAgICB9CisjZW5kaWYKKyAgICBzZXFfcGFyYW1zLT5vcmRlcl9oaW50X2luZm8ub3JkZXJfaGludF9iaXRzX21pbnVzXzEgPQorICAgICAgICBzZXFfcGFyYW1zLT5vcmRlcl9oaW50X2luZm8uZW5hYmxlX29yZGVyX2hpbnQKKyAgICAgICAgICAgID8gcGFyYW1zLT5wLm9yZGVyX2hpbnRfYml0c19taW51c18xIC8qYW9tX3JiX3JlYWRfbGl0ZXJhbCgtMSwgIjxvcmRlcl9oaW50X2luZm8ub3JkZXJfaGludF9iaXRzX21pbnVzXzE+IiwgcmIsIDMpKi8KKyAgICAgICAgICAgIDogLTE7CisgIH0KKyAgc2VxX3BhcmFtcy0+ZW5hYmxlX3N1cGVycmVzID0gcGFyYW1zLT5wLmVuYWJsZV9zdXBlcnJlczsgLy9hb21fcmJfcmVhZF9iaXQoLTEsIGRlZm1hcmssIHJiKTsKKworI2lmZGVmIE9SSV9DT0RFCisgIHNlcV9wYXJhbXMtPmVuYWJsZV9jZGVmID0gYW9tX3JiX3JlYWRfYml0KC0xLCBkZWZtYXJrLCByYik7CisgIHNlcV9wYXJhbXMtPmVuYWJsZV9yZXN0b3JhdGlvbiA9IGFvbV9yYl9yZWFkX2JpdCgtMSwgZGVmbWFyaywgcmIpOworI2VuZGlmCit9CisKKyNpZmRlZiBPUklfQ09ERQordm9pZCBhdjFfcmVhZF9vcF9wYXJhbWV0ZXJzX2luZm8oQVYxX0NPTU1PTiAqY29uc3QgY20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYW9tX3JlYWRfYml0X2J1ZmZlciAqcmIsIGludCBvcF9udW0pIHsKKyAgLy8gVGhlIGNtLT5vcF9wYXJhbXMgYXJyYXkgaGFzIE1BWF9OVU1fT1BFUkFUSU5HX1BPSU5UUyArIDEgZWxlbWVudHMuCisgIGlmIChvcF9udW0gPiBNQVhfTlVNX09QRVJBVElOR19QT0lOVFMpIHsKKyAgICBhb21faW50ZXJuYWxfZXJyb3IoJmNtLT5lcnJvciwgQU9NX0NPREVDX1VOU1VQX0JJVFNUUkVBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkFWMSBkb2VzIG5vdCBzdXBwb3J0ICVkIGRlY29kZXIgbW9kZWwgb3BlcmF0aW5nIHBvaW50cyIsCisgICAgICAgICAgICAgICAgICAgICAgIG9wX251bSArIDEpOworICB9CisKKyAgY20tPm9wX3BhcmFtc1tvcF9udW1dLmRlY29kZXJfYnVmZmVyX2RlbGF5ID0gYW9tX3JiX3JlYWRfdW5zaWduZWRfbGl0ZXJhbCgtMSwgZGVmbWFyaywKKyAgICAgIHJiLCBjbS0+YnVmZmVyX21vZGVsLmVuY29kZXJfZGVjb2Rlcl9idWZmZXJfZGVsYXlfbGVuZ3RoKTsKKworICBjbS0+b3BfcGFyYW1zW29wX251bV0uZW5jb2Rlcl9idWZmZXJfZGVsYXkgPSBhb21fcmJfcmVhZF91bnNpZ25lZF9saXRlcmFsKC0xLCBkZWZtYXJrLAorICAgICAgcmIsIGNtLT5idWZmZXJfbW9kZWwuZW5jb2Rlcl9kZWNvZGVyX2J1ZmZlcl9kZWxheV9sZW5ndGgpOworCisgIGNtLT5vcF9wYXJhbXNbb3BfbnVtXS5sb3dfZGVsYXlfbW9kZV9mbGFnID0gYW9tX3JiX3JlYWRfYml0KC0xLCBkZWZtYXJrLCByYik7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBpc192YWxpZF9zZXFfbGV2ZWxfaWR4KEFWMV9MRVZFTCBzZXFfbGV2ZWxfaWR4KSB7CisJcmV0dXJuIHNlcV9sZXZlbF9pZHggPCBTRVFfTEVWRUxTIHx8IHNlcV9sZXZlbF9pZHggPT0gU0VRX0xFVkVMX01BWDsKK30KKworc3RhdGljIHVpbnQzMl90IHJlYWRfc2VxdWVuY2VfaGVhZGVyX29idShBVjFEZWNvZGVyICpwYmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIHBhcmFtX3UgKnBhcmFtcykgeworICBBVjFfQ09NTU9OICpjb25zdCBjbSA9IHBiaS0+Y29tbW9uOworICBpbnQgaTsKKyAgaW50IG9wZXJhdGluZ19wb2ludDsKKyAgLy8gVmVyaWZ5IHJiIGhhcyBiZWVuIGNvbmZpZ3VyZWQgdG8gcmVwb3J0IGVycm9ycy4KKyAgLy9hc3NlcnQocmItPmVycm9yX2hhbmRsZXIpOworCisgIC8vIFVzZSBhIGxvY2FsIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSBpbmZvcm1hdGlvbiBhcyB3ZSBkZWNvZGUuIEF0IHRoZSBlbmQsCisgIC8vIGlmIG5vIGVycm9ycyBoYXZlIG9jY3VycmVkLCBjbS0+c2VxX3BhcmFtcyBpcyB1cGRhdGVkLgorICBTZXF1ZW5jZUhlYWRlciBzaCA9IGNtLT5zZXFfcGFyYW1zOworICBTZXF1ZW5jZUhlYWRlciAqY29uc3Qgc2VxX3BhcmFtcyA9ICZzaDsKKworICBzZXFfcGFyYW1zLT5wcm9maWxlID0gcGFyYW1zLT5wLnByb2ZpbGU7IC8vYXYxX3JlYWRfcHJvZmlsZShyYik7CisgIGlmIChzZXFfcGFyYW1zLT5wcm9maWxlID4gQ09ORklHX01BWF9ERUNPREVfUFJPRklMRSkgeworICAgIGNtLT5lcnJvci5lcnJvcl9jb2RlID0gQU9NX0NPREVDX1VOU1VQX0JJVFNUUkVBTTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIFN0aWxsIHBpY3R1cmUgb3Igbm90CisgIHNlcV9wYXJhbXMtPnN0aWxsX3BpY3R1cmUgPSBwYXJhbXMtPnAuc3RpbGxfcGljdHVyZTsgLy9hb21fcmJfcmVhZF9iaXQoLTEsICI8c3RpbGxfcGljdHVyZT4iLCByYik7CisgIHNlcV9wYXJhbXMtPnJlZHVjZWRfc3RpbGxfcGljdHVyZV9oZHIgPSBwYXJhbXMtPnAucmVkdWNlZF9zdGlsbF9waWN0dXJlX2hkcjsgLy9hb21fcmJfcmVhZF9iaXQoLTEsICI8cmVkdWNlZF9zdGlsbF9waWN0dXJlX2hkcj4iLCByYik7CisgIC8vIFZpZGVvIG11c3QgaGF2ZSByZWR1Y2VkX3N0aWxsX3BpY3R1cmVfaGRyID0gMAorICBpZiAoIXNlcV9wYXJhbXMtPnN0aWxsX3BpY3R1cmUgJiYgc2VxX3BhcmFtcy0+cmVkdWNlZF9zdGlsbF9waWN0dXJlX2hkcikgeworICAgIGNtLT5lcnJvci5lcnJvcl9jb2RlID0gQU9NX0NPREVDX1VOU1VQX0JJVFNUUkVBTTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChzZXFfcGFyYW1zLT5yZWR1Y2VkX3N0aWxsX3BpY3R1cmVfaGRyKSB7CisgICAgY20tPnRpbWluZ19pbmZvX3ByZXNlbnQgPSAwOworICAgIHNlcV9wYXJhbXMtPmRlY29kZXJfbW9kZWxfaW5mb19wcmVzZW50X2ZsYWcgPSAwOworICAgIHNlcV9wYXJhbXMtPmRpc3BsYXlfbW9kZWxfaW5mb19wcmVzZW50X2ZsYWcgPSAwOworICAgIHNlcV9wYXJhbXMtPm9wZXJhdGluZ19wb2ludHNfY250X21pbnVzXzEgPSAwOworICAgIHNlcV9wYXJhbXMtPm9wZXJhdGluZ19wb2ludF9pZGNbMF0gPSAwOworICAgIC8vaWYgKCFyZWFkX2JpdHN0cmVhbV9sZXZlbCgwLCAiPHNlcV9sZXZlbF9pZHg+IiwgJnNlcV9wYXJhbXMtPnNlcV9sZXZlbF9pZHhbMF0sIHJiKSkgeworICAgIGlmICghaXNfdmFsaWRfc2VxX2xldmVsX2lkeChwYXJhbXMtPnAuc2VxX2xldmVsX2lkeFswXSkpIHsKKyAgICAgIGNtLT5lcnJvci5lcnJvcl9jb2RlID0gQU9NX0NPREVDX1VOU1VQX0JJVFNUUkVBTTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzZXFfcGFyYW1zLT50aWVyWzBdID0gMDsKKyAgICBjbS0+b3BfcGFyYW1zWzBdLmRlY29kZXJfbW9kZWxfcGFyYW1fcHJlc2VudF9mbGFnID0gMDsKKyAgICBjbS0+b3BfcGFyYW1zWzBdLmRpc3BsYXlfbW9kZWxfcGFyYW1fcHJlc2VudF9mbGFnID0gMDsKKyAgfSBlbHNlIHsKKyAgICBjbS0+dGltaW5nX2luZm9fcHJlc2VudCA9IHBhcmFtcy0+cC50aW1pbmdfaW5mb19wcmVzZW50OyAvL2FvbV9yYl9yZWFkX2JpdCgtMSwgIjx0aW1pbmdfaW5mb19wcmVzZW50PiIsIHJiKTsgIC8vIHRpbWluZ19pbmZvX3ByZXNlbnRfZmxhZworICAgIGlmIChjbS0+dGltaW5nX2luZm9fcHJlc2VudCkgeworI2lmZGVmIE9SSV9DT0RFCisgICAgICBhdjFfcmVhZF90aW1pbmdfaW5mb19oZWFkZXIoY20sIHJiKTsKKyNlbmRpZgorICAgICAgc2VxX3BhcmFtcy0+ZGVjb2Rlcl9tb2RlbF9pbmZvX3ByZXNlbnRfZmxhZyA9IHBhcmFtcy0+cC5kZWNvZGVyX21vZGVsX2luZm9fcHJlc2VudF9mbGFnOyAvL2FvbV9yYl9yZWFkX2JpdCgtMSwgIjxkZWNvZGVyX21vZGVsX2luZm9fcHJlc2VudF9mbGFnPiIsIHJiKTsKKyNpZmRlZiBPUklfQ09ERQorICAgICAgaWYgKHNlcV9wYXJhbXMtPmRlY29kZXJfbW9kZWxfaW5mb19wcmVzZW50X2ZsYWcpCisgICAgICAgIGF2MV9yZWFkX2RlY29kZXJfbW9kZWxfaW5mbyhjbSwgcmIpOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgIHNlcV9wYXJhbXMtPmRlY29kZXJfbW9kZWxfaW5mb19wcmVzZW50X2ZsYWcgPSAwOworICAgIH0KKyNpZmRlZiBPUklfQ09ERQorICAgIHNlcV9wYXJhbXMtPmRpc3BsYXlfbW9kZWxfaW5mb19wcmVzZW50X2ZsYWcgPSBhb21fcmJfcmVhZF9iaXQoLTEsICI8ZGlzcGxheV9tb2RlbF9pbmZvX3ByZXNlbnRfZmxhZz4iLCByYik7CisjZW5kaWYKKyAgICBzZXFfcGFyYW1zLT5vcGVyYXRpbmdfcG9pbnRzX2NudF9taW51c18xID0gcGFyYW1zLT5wLm9wZXJhdGluZ19wb2ludHNfY250X21pbnVzXzE7CisgICAgICAgIC8vYW9tX3JiX3JlYWRfbGl0ZXJhbCgtMSwgIjxvcGVyYXRpbmdfcG9pbnRzX2NudF9taW51c18xPiIsIHJiLCBPUF9QT0lOVFNfQ05UX01JTlVTXzFfQklUUyk7CisgICAgZm9yIChpID0gMDsgaSA8IHNlcV9wYXJhbXMtPm9wZXJhdGluZ19wb2ludHNfY250X21pbnVzXzEgKyAxOyBpKyspIHsKKyAgICAgIHNlcV9wYXJhbXMtPm9wZXJhdGluZ19wb2ludF9pZGNbaV0gPSBwYXJhbXMtPnAub3BlcmF0aW5nX3BvaW50X2lkY1tpXTsKKyAgICAgICAgICAvL2FvbV9yYl9yZWFkX2xpdGVyYWwoaSwgIjxvcGVyYXRpbmdfcG9pbnRfaWRjPiIsIHJiLCBPUF9QT0lOVFNfSURDX0JJVFMpOworICAgICAgLy9pZiAoIXJlYWRfYml0c3RyZWFtX2xldmVsKGksICI8c2VxX2xldmVsX2lkeD4iLCAmc2VxX3BhcmFtcy0+c2VxX2xldmVsX2lkeFtpXSwgcmIpKSB7CisgICAgICBpZiAoIWlzX3ZhbGlkX3NlcV9sZXZlbF9pZHgocGFyYW1zLT5wLnNlcV9sZXZlbF9pZHhbaV0pKSB7CisgICAgICAgIGNtLT5lcnJvci5lcnJvcl9jb2RlID0gQU9NX0NPREVDX1VOU1VQX0JJVFNUUkVBTTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICAvLyBUaGlzIGlzIHRoZSBzZXFfbGV2ZWxfaWR4W2ldID4gNyBjaGVjayBpbiB0aGUgc3BlYy4gc2VxX2xldmVsX2lkeCA3CisgICAgICAvLyBpcyBlcXVpdmFsZW50IHRvIGxldmVsIDMuMy4KKyNpZmRlZiBPUklfQ09ERQorICAgICAgaWYgKHNlcV9wYXJhbXMtPnNlcV9sZXZlbF9pZHhbaV0gPj0gU0VRX0xFVkVMXzRfMCkKKyAgICAgICAgc2VxX3BhcmFtcy0+dGllcltpXSA9IGFvbV9yYl9yZWFkX2JpdChpLCAiPHRpZXI+IiwgcmIpOworICAgICAgZWxzZQorICAgICAgICBzZXFfcGFyYW1zLT50aWVyW2ldID0gMDsKKyNlbmRpZgorICAgICAgaWYgKHNlcV9wYXJhbXMtPmRlY29kZXJfbW9kZWxfaW5mb19wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgY20tPm9wX3BhcmFtc1tpXS5kZWNvZGVyX21vZGVsX3BhcmFtX3ByZXNlbnRfZmxhZyA9IHBhcmFtcy0+cC5kZWNvZGVyX21vZGVsX3BhcmFtX3ByZXNlbnRfZmxhZ1tpXTsgLy9hb21fcmJfcmVhZF9iaXQoLTEsIGRlZm1hcmssIHJiKTsKKyNpZmRlZiBPUklfQ09ERQorICAgICAgICBpZiAoY20tPm9wX3BhcmFtc1tpXS5kZWNvZGVyX21vZGVsX3BhcmFtX3ByZXNlbnRfZmxhZykKKyAgICAgICAgICBhdjFfcmVhZF9vcF9wYXJhbWV0ZXJzX2luZm8oY20sIHJiLCBpKTsKKyNlbmRpZgorICAgICAgfSBlbHNlIHsKKyAgICAgICAgY20tPm9wX3BhcmFtc1tpXS5kZWNvZGVyX21vZGVsX3BhcmFtX3ByZXNlbnRfZmxhZyA9IDA7CisgICAgICB9CisjaWZkZWYgT1JJX0NPREUKKyAgICAgIGlmIChjbS0+dGltaW5nX2luZm9fcHJlc2VudCAmJgorICAgICAgICAgIChjbS0+dGltaW5nX2luZm8uZXF1YWxfcGljdHVyZV9pbnRlcnZhbCB8fAorICAgICAgICAgICBjbS0+b3BfcGFyYW1zW2ldLmRlY29kZXJfbW9kZWxfcGFyYW1fcHJlc2VudF9mbGFnKSkgeworICAgICAgICBjbS0+b3BfcGFyYW1zW2ldLmJpdHJhdGUgPSBhdjFfbWF4X2xldmVsX2JpdHJhdGUoCisgICAgICAgICAgICBzZXFfcGFyYW1zLT5wcm9maWxlLCBzZXFfcGFyYW1zLT5zZXFfbGV2ZWxfaWR4W2ldLAorICAgICAgICAgICAgc2VxX3BhcmFtcy0+dGllcltpXSk7CisgICAgICAgIC8vIExldmVsIHdpdGggc2VxX2xldmVsX2lkeCA9IDMxIHJldHVybnMgYSBoaWdoICJkdW1teSIgYml0cmF0ZSB0byBwYXNzCisgICAgICAgIC8vIHRoZSBjaGVjaworICAgICAgICBpZiAoY20tPm9wX3BhcmFtc1tpXS5iaXRyYXRlID09IDApCisgICAgICAgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19VTlNVUF9CSVRTVFJFQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBVjEgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGNvbWJpbmF0aW9uIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2ZpbGUsIGxldmVsLCBhbmQgdGllci4iKTsKKyAgICAgICAgLy8gQnVmZmVyIHNpemUgaW4gYml0cy9zIGlzIGJpdHJhdGUgaW4gYml0cy9zICogMSBzCisgICAgICAgIGNtLT5vcF9wYXJhbXNbaV0uYnVmZmVyX3NpemUgPSBjbS0+b3BfcGFyYW1zW2ldLmJpdHJhdGU7CisgICAgICB9CisjZW5kaWYKKyAgICAgIGlmIChjbS0+dGltaW5nX2luZm9fcHJlc2VudCAmJiBjbS0+dGltaW5nX2luZm8uZXF1YWxfcGljdHVyZV9pbnRlcnZhbCAmJgorICAgICAgICAgICFjbS0+b3BfcGFyYW1zW2ldLmRlY29kZXJfbW9kZWxfcGFyYW1fcHJlc2VudF9mbGFnKSB7CisgICAgICAgIC8vIFdoZW4gdGhlIGRlY29kZXJfbW9kZWxfcGFyYW1ldGVycyBhcmUgbm90IHNlbnQgZm9yIHRoaXMgb3AsIHNldAorICAgICAgICAvLyB0aGUgZGVmYXVsdCBvbmVzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCB0aGUgcmVzb3VyY2UgYXZhaWxhYmlsaXR5IG1vZGUKKyAgICAgICAgY20tPm9wX3BhcmFtc1tpXS5kZWNvZGVyX2J1ZmZlcl9kZWxheSA9IDcwMDAwOworICAgICAgICBjbS0+b3BfcGFyYW1zW2ldLmVuY29kZXJfYnVmZmVyX2RlbGF5ID0gMjAwMDA7CisgICAgICAgIGNtLT5vcF9wYXJhbXNbaV0ubG93X2RlbGF5X21vZGVfZmxhZyA9IDA7CisgICAgICB9CisKKyNpZmRlZiBPUklfQ09ERQorICAgICAgaWYgKHNlcV9wYXJhbXMtPmRpc3BsYXlfbW9kZWxfaW5mb19wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgY20tPm9wX3BhcmFtc1tpXS5kaXNwbGF5X21vZGVsX3BhcmFtX3ByZXNlbnRfZmxhZyA9IGFvbV9yYl9yZWFkX2JpdCgtMSwgZGVmbWFyaywgcmIpOworICAgICAgICBpZiAoY20tPm9wX3BhcmFtc1tpXS5kaXNwbGF5X21vZGVsX3BhcmFtX3ByZXNlbnRfZmxhZykgeworICAgICAgICAgIGNtLT5vcF9wYXJhbXNbaV0uaW5pdGlhbF9kaXNwbGF5X2RlbGF5ID0KKyAgICAgICAgICAgICAgYW9tX3JiX3JlYWRfbGl0ZXJhbCgtMSwgZGVmbWFyaywgcmIsIDQpICsgMTsKKyAgICAgICAgICBpZiAoY20tPm9wX3BhcmFtc1tpXS5pbml0aWFsX2Rpc3BsYXlfZGVsYXkgPiAxMCkKKyAgICAgICAgICAgIGFvbV9pbnRlcm5hbF9lcnJvcigKKyAgICAgICAgICAgICAgICAmY20tPmVycm9yLCBBT01fQ09ERUNfVU5TVVBfQklUU1RSRUFNLAorICAgICAgICAgICAgICAgICJBVjEgZG9lcyBub3Qgc3VwcG9ydCBtb3JlIHRoYW4gMTAgZGVjb2RlZCBmcmFtZXMgZGVsYXkiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjbS0+b3BfcGFyYW1zW2ldLmluaXRpYWxfZGlzcGxheV9kZWxheSA9IDEwOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBjbS0+b3BfcGFyYW1zW2ldLmRpc3BsYXlfbW9kZWxfcGFyYW1fcHJlc2VudF9mbGFnID0gMDsKKyAgICAgICAgY20tPm9wX3BhcmFtc1tpXS5pbml0aWFsX2Rpc3BsYXlfZGVsYXkgPSAxMDsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgfQorICAvLyBUaGlzIGRlY29kZXIgc3VwcG9ydHMgYWxsIGxldmVscy4gIENob29zZSBvcGVyYXRpbmcgcG9pbnQgcHJvdmlkZWQgYnkKKyAgLy8gZXh0ZXJuYWwgbWVhbnMKKyAgb3BlcmF0aW5nX3BvaW50ID0gcGJpLT5vcGVyYXRpbmdfcG9pbnQ7CisgIGlmIChvcGVyYXRpbmdfcG9pbnQgPCAwIHx8CisgICAgICBvcGVyYXRpbmdfcG9pbnQgPiBzZXFfcGFyYW1zLT5vcGVyYXRpbmdfcG9pbnRzX2NudF9taW51c18xKQorICAgIG9wZXJhdGluZ19wb2ludCA9IDA7CisgIHBiaS0+Y3VycmVudF9vcGVyYXRpbmdfcG9pbnQgPQorICAgICAgc2VxX3BhcmFtcy0+b3BlcmF0aW5nX3BvaW50X2lkY1tvcGVyYXRpbmdfcG9pbnRdOworICBpZiAoYW9tX2dldF9udW1fbGF5ZXJzX2Zyb21fb3BlcmF0aW5nX3BvaW50X2lkYygKKyAgICAgICAgICBwYmktPmN1cnJlbnRfb3BlcmF0aW5nX3BvaW50LCAmY20tPm51bWJlcl9zcGF0aWFsX2xheWVycywKKyAgICAgICAgICAmY20tPm51bWJlcl90ZW1wb3JhbF9sYXllcnMpICE9IEFPTV9DT0RFQ19PSykgeworICAgIGNtLT5lcnJvci5lcnJvcl9jb2RlID0gQU9NX0NPREVDX0VSUk9SOworICAgIHJldHVybiAwOworICB9CisKKyAgYXYxX3JlYWRfc2VxdWVuY2VfaGVhZGVyKGNtLCBwYXJhbXMsIHNlcV9wYXJhbXMpOworI2lmZGVmIE9SSV9DT0RFCisgIGF2MV9yZWFkX2NvbG9yX2NvbmZpZyhyYiwgcGJpLT5hbGxvd19sb3diaXRkZXB0aCwgc2VxX3BhcmFtcywgJmNtLT5lcnJvcik7CisgIGlmICghKHNlcV9wYXJhbXMtPnN1YnNhbXBsaW5nX3ggPT0gMCAmJiBzZXFfcGFyYW1zLT5zdWJzYW1wbGluZ195ID09IDApICYmCisgICAgICAhKHNlcV9wYXJhbXMtPnN1YnNhbXBsaW5nX3ggPT0gMSAmJiBzZXFfcGFyYW1zLT5zdWJzYW1wbGluZ195ID09IDEpICYmCisgICAgICAhKHNlcV9wYXJhbXMtPnN1YnNhbXBsaW5nX3ggPT0gMSAmJiBzZXFfcGFyYW1zLT5zdWJzYW1wbGluZ195ID09IDApKSB7CisgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19VTlNVUF9CSVRTVFJFQU0sCisgICAgICAgICAgICAgICAgICAgICAgICJPbmx5IDQ6NDo0LCA0OjI6MiBhbmQgNDoyOjAgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgIiVkICVkIHN1YnNhbXBsaW5nIGlzIG5vdCBzdXBwb3J0ZWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBzZXFfcGFyYW1zLT5zdWJzYW1wbGluZ194LCBzZXFfcGFyYW1zLT5zdWJzYW1wbGluZ195KTsKKyAgfQorICBzZXFfcGFyYW1zLT5maWxtX2dyYWluX3BhcmFtc19wcmVzZW50ID0gYW9tX3JiX3JlYWRfYml0KC0xLCAiPGZpbG1fZ3JhaW5fcGFyYW1zX3ByZXNlbnQ+IiwgcmIpOworCisgIGlmIChhdjFfY2hlY2tfdHJhaWxpbmdfYml0cyhwYmksIHJiKSAhPSAwKSB7CisgICAgLy8gY20tPmVycm9yLmVycm9yX2NvZGUgaXMgYWxyZWFkeSBzZXQuCisgICAgcmV0dXJuIDA7CisgIH0KKyNlbmRpZgorCisgIC8vIElmIGEgc2VxdWVuY2UgaGVhZGVyIGhhcyBiZWVuIGRlY29kZWQgYmVmb3JlLCB3ZSBjaGVjayBpZiB0aGUgbmV3CisgIC8vIG9uZSBpcyBjb25zaXN0ZW50IHdpdGggdGhlIG9sZCBvbmUuCisgIGlmIChwYmktPnNlcXVlbmNlX2hlYWRlcl9yZWFkeSkgeworICAgIGlmICghYXJlX3NlcV9oZWFkZXJzX2NvbnNpc3RlbnQoJmNtLT5zZXFfcGFyYW1zLCBzZXFfcGFyYW1zKSkKKyAgICAgIHBiaS0+c2VxdWVuY2VfaGVhZGVyX2NoYW5nZWQgPSAxOworICB9CisKKyAgY20tPnNlcV9wYXJhbXMgPSAqc2VxX3BhcmFtczsKKyAgcGJpLT5zZXF1ZW5jZV9oZWFkZXJfcmVhZHkgPSAxOworICByZXR1cm4gMDsKKworfQorCitpbnQgYW9tX2RlY29kZV9mcmFtZV9mcm9tX29idXMoQVYxRGVjb2RlciAqcGJpLCB1bmlvbiBwYXJhbV91ICpwYXJhbXMsIGludCBvYnVfdHlwZSkKK3sKKyAgQVYxX0NPTU1PTiAqY29uc3QgY20gPSBwYmktPmNvbW1vbjsKKyAgT2J1SGVhZGVyIG9idV9oZWFkZXI7CisgaW50IGZyYW1lX2RlY29kaW5nX2ZpbmlzaGVkID0gMDsKKyAgdWludDMyX3QgZnJhbWVfaGVhZGVyX3NpemUgPSAwOworCisgICAgLy9zdHJ1Y3QgYW9tX3JlYWRfYml0X2J1ZmZlciByYjsKKyAgICBzaXplX3QgcGF5bG9hZF9zaXplID0gMDsKKyAgICBzaXplX3QgZGVjb2RlZF9wYXlsb2FkX3NpemUgPSAwOworICAgIHNpemVfdCBvYnVfcGF5bG9hZF9vZmZzZXQgPSAwOworICAgIC8vc2l6ZV90IGJ5dGVzX3JlYWQgPSAwOworCisgIG1lbXNldCgmb2J1X2hlYWRlciwgMCwgc2l6ZW9mKG9idV9oZWFkZXIpKTsKKyNpZmRlZiBPUklfQ09ERQorICBwYmktPnNlZW5fZnJhbWVfaGVhZGVyID0gMDsKKyNlbHNlCisgIC8qIHNldCBpbiB0aGUgdGVzdC5jKi8KKyNlbmRpZgorCisgIG9idV9oZWFkZXIudHlwZSA9IG9idV90eXBlOworICBwYmktPmN1cl9vYnVfdHlwZSA9IG9idV9oZWFkZXIudHlwZTsKKyAgaWYgKGF2MV9pc19kZWJ1ZyhBT01fREVCVUdfUFJJTlRfTElTVF9JTkZPKSkKKyAgICBkdW1wX3BhcmFtcyhwYmksIHBhcmFtcyk7CisgIHN3aXRjaCAob2J1X2hlYWRlci50eXBlKSB7CisgICAgY2FzZSBPQlVfU0VRVUVOQ0VfSEVBREVSOgorICAgICAgICBkZWNvZGVkX3BheWxvYWRfc2l6ZSA9IHJlYWRfc2VxdWVuY2VfaGVhZGVyX29idShwYmksIHBhcmFtcyk7CisgICAgICAgIGlmIChjbS0+ZXJyb3IuZXJyb3JfY29kZSAhPSBBT01fQ09ERUNfT0spIHJldHVybiAtMTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9CVV9GUkFNRV9IRUFERVI6CisgICAgY2FzZSBPQlVfUkVEVU5EQU5UX0ZSQU1FX0hFQURFUjoKKyAgICBjYXNlIE9CVV9GUkFNRToKKyAgICAgICAgaWYgKG9idV9oZWFkZXIudHlwZSA9PSBPQlVfUkVEVU5EQU5UX0ZSQU1FX0hFQURFUikgeworICAgICAgICAgIGlmICghcGJpLT5zZWVuX2ZyYW1lX2hlYWRlcikgeworICAgICAgICAgICAgY20tPmVycm9yLmVycm9yX2NvZGUgPSBBT01fQ09ERUNfQ09SUlVQVF9GUkFNRTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gT0JVX0ZSQU1FX0hFQURFUiBvciBPQlVfRlJBTUUuCisgICAgICAgICAgaWYgKHBiaS0+c2Vlbl9mcmFtZV9oZWFkZXIpIHsKKyAgICAgICAgICAgIGNtLT5lcnJvci5lcnJvcl9jb2RlID0gQU9NX0NPREVDX0NPUlJVUFRfRlJBTUU7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE9ubHkgZGVjb2RlIGZpcnN0IGZyYW1lIGhlYWRlciByZWNlaXZlZAorICAgICAgICBpZiAoIXBiaS0+c2Vlbl9mcmFtZV9oZWFkZXIgfHwKKyAgICAgICAgICAgIChjbS0+bGFyZ2Vfc2NhbGVfdGlsZSAmJiAhcGJpLT5jYW1lcmFfZnJhbWVfaGVhZGVyX3JlYWR5KSkgeworICAgICAgICAgIGZyYW1lX2hlYWRlcl9zaXplID0gYXYxX2RlY29kZV9mcmFtZV9oZWFkZXJzX2FuZF9zZXR1cCgKKyAgICAgICAgICAgICAgcGJpLCAvKiZyYiwgZGF0YSwgcF9kYXRhX2VuZCwqL29idV9oZWFkZXIudHlwZSAhPSBPQlVfRlJBTUUsIHBhcmFtcyk7CisgICAgICAgICAgcGJpLT5zZWVuX2ZyYW1lX2hlYWRlciA9IDE7CisgICAgICAgICAgaWYgKCFwYmktPmV4dF90aWxlX2RlYnVnICYmIGNtLT5sYXJnZV9zY2FsZV90aWxlKQorICAgICAgICAgICAgcGJpLT5jYW1lcmFfZnJhbWVfaGVhZGVyX3JlYWR5ID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBUT0RPKHd0Yyk6IFZlcmlmeSB0aGF0IHRoZSBmcmFtZV9oZWFkZXJfb2J1IGlzIGlkZW50aWNhbCB0byB0aGUKKyAgICAgICAgICAvLyBvcmlnaW5hbCBmcmFtZV9oZWFkZXJfb2J1LiBGb3Igbm93IGp1c3Qgc2tpcCBmcmFtZV9oZWFkZXJfc2l6ZQorICAgICAgICAgIC8vIGJ5dGVzIGluIHRoZSBiaXQgYnVmZmVyLgorICAgICAgICAgIGlmIChmcmFtZV9oZWFkZXJfc2l6ZSA+IHBheWxvYWRfc2l6ZSkgeworICAgICAgICAgICAgY20tPmVycm9yLmVycm9yX2NvZGUgPSBBT01fQ09ERUNfQ09SUlVQVF9GUkFNRTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB9CisgICAgICAgICAgYXNzZXJ0KHJiLmJpdF9vZmZzZXQgPT0gMCk7CisjaWZkZWYgT1JJX0NPREUKKyAgICAgICAgICByYi5iaXRfb2Zmc2V0ID0gOCAqIGZyYW1lX2hlYWRlcl9zaXplOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBkZWNvZGVkX3BheWxvYWRfc2l6ZSA9IGZyYW1lX2hlYWRlcl9zaXplOworICAgICAgICBwYmktPmZyYW1lX2hlYWRlcl9zaXplID0gZnJhbWVfaGVhZGVyX3NpemU7CisKKyAgICAgICAgaWYgKGNtLT5zaG93X2V4aXN0aW5nX2ZyYW1lKSB7CisgICAgICAgICAgaWYgKG9idV9oZWFkZXIudHlwZSA9PSBPQlVfRlJBTUUpIHsKKyAgICAgICAgICAgIGNtLT5lcnJvci5lcnJvcl9jb2RlID0gQU9NX0NPREVDX1VOU1VQX0JJVFNUUkVBTTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB9CisgICAgICAgICAgZnJhbWVfZGVjb2RpbmdfZmluaXNoZWQgPSAxOworICAgICAgICAgIHBiaS0+c2Vlbl9mcmFtZV9oZWFkZXIgPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW4gbGFyZ2Ugc2NhbGUgdGlsZSBjb2RpbmcsIGRlY29kZSB0aGUgY29tbW9uIGNhbWVyYSBmcmFtZSBoZWFkZXIKKyAgICAgICAgLy8gYmVmb3JlIGFueSB0aWxlIGxpc3QgT0JVLgorICAgICAgICBpZiAoIXBiaS0+ZXh0X3RpbGVfZGVidWcgJiYgcGJpLT5jYW1lcmFfZnJhbWVfaGVhZGVyX3JlYWR5KSB7CisgICAgICAgICAgZnJhbWVfZGVjb2RpbmdfZmluaXNoZWQgPSAxOworICAgICAgICAgIC8vIFNraXAgdGhlIHJlc3Qgb2YgdGhlIGZyYW1lIGRhdGEuCisgICAgICAgICAgZGVjb2RlZF9wYXlsb2FkX3NpemUgPSBwYXlsb2FkX3NpemU7CisgICAgICAgICAgLy8gVXBkYXRlIGRhdGFfZW5kLgorI2lmZGVmIE9SSV9DT0RFCisgICAgICAgICAgKnBfZGF0YV9lbmQgPSBkYXRhX2VuZDsKKyNlbmRpZgorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjaWYgMCAvL2RlZiBBTUwKKyAgICAgICAgZnJhbWVfZGVjb2RpbmdfZmluaXNoZWQgPSAxOworI2VuZGlmCisgICAgICAgIGlmIChvYnVfaGVhZGVyLnR5cGUgIT0gT0JVX0ZSQU1FKSBicmVhazsKKyAgICAgICAgb2J1X3BheWxvYWRfb2Zmc2V0ID0gZnJhbWVfaGVhZGVyX3NpemU7CisgICAgICAgIC8vIEJ5dGUgYWxpZ24gdGhlIHJlYWRlciBiZWZvcmUgcmVhZGluZyB0aGUgdGlsZSBncm91cC4KKyAgICAgICAgLy8gYnl0ZV9hbGlnbm1lbnQoKSBoYXMgc2V0IGNtLT5lcnJvci5lcnJvcl9jb2RlIGlmIGl0IHJldHVybnMgLTEuCisjaWZkZWYgT1JJX0NPREUKKyAgICAgICAgaWYgKGJ5dGVfYWxpZ25tZW50KGNtLCAmcmIpKSByZXR1cm4gLTE7CisgICAgICAgIEFPTV9GQUxMVEhST1VHSF9JTlRFTkRFRDsgIC8vIGZhbGwgdGhyb3VnaCB0byByZWFkIHRpbGUgZ3JvdXAuCisjZW5kaWYKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgICAgIH0KKwlyZXR1cm4gZnJhbWVfZGVjb2RpbmdfZmluaXNoZWQ7Cit9CisKK2ludCBnZXRfYnVmZmVyX2luZGV4KEFWMURlY29kZXIgKnBiaSwgUmVmQ250QnVmZmVyICpidWZmZXIpCit7CisJQVYxX0NPTU1PTiAqY29uc3QgY20gPSBwYmktPmNvbW1vbjsKKwlpbnQgaSA9IC0xOworCisJaWYgKGJ1ZmZlcikgeworCQlmb3IgKGkgPSAwOyBpIDwgRlJBTUVfQlVGRkVSUzsgaSsrKSB7CisJCQlSZWZDbnRCdWZmZXIgKmJ1ZiA9CisJCQkJJmNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmc1tpXTsKKwkJCWlmIChidWYgPT0gYnVmZmVyKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGk7Cit9CisKK3ZvaWQgZHVtcF9idWZmZXIoUmVmQ250QnVmZmVyICpidWYpCit7CisJaW50IGk7CisJcHJfaW5mbygicmVmX2NvdW50ICVkLCB2Zl9yZWYgJWQsIG9yZGVyX2hpbnQgJWQsIHcvaCglZCwlZCkgc2hvd2FibGVfZnJhbWUgJWQgZnJhbWVfdHlwZSAlZCBjYW52YXMoJWQsJWQpIHcvaCglZCwlZCkgbWlfYy9yKCVkLCVkKSBoZWFkZXIgMHgleCByZWZfZGVsdGFzKCIsCisJYnVmLT5yZWZfY291bnQsIGJ1Zi0+YnVmLnZmX3JlZiwgYnVmLT5vcmRlcl9oaW50LCBidWYtPndpZHRoLCBidWYtPmhlaWdodCwgYnVmLT5zaG93YWJsZV9mcmFtZSwgYnVmLT5mcmFtZV90eXBlLAorCWJ1Zi0+YnVmLm1jX2NhbnZhc195LCBidWYtPmJ1Zi5tY19jYW52YXNfdV92LAorCWJ1Zi0+YnVmLnlfY3JvcF93aWR0aCwgYnVmLT5idWYueV9jcm9wX2hlaWdodCwKKwlidWYtPm1pX2NvbHMsIGJ1Zi0+bWlfcm93cywKKwlidWYtPmJ1Zi5oZWFkZXJfYWRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgUkVGX0ZSQU1FUzsgaSsrKQorCQlwcl9pbmZvKCIlZCwiLCBidWYtPnJlZl9kZWx0YXNbaV0pOworCXByX2luZm8oIiksIHJlZl9vcmRlcl9oaW50cygiKTsKKworCWZvciAoaSA9IDA7IGkgPCBJTlRFUl9SRUZTX1BFUl9GUkFNRTsgaSsrKQorCQlwcl9pbmZvKCIlZCAiLCBidWYtPnJlZl9vcmRlcl9oaW50c1tpXSk7CisJcHJfaW5mbygiKSIpOworfQorCit2b2lkIGR1bXBfcmVmX2J1ZmZlcl9pbmZvKEFWMURlY29kZXIgKnBiaSwgaW50IGkpCit7CisJQVYxX0NPTU1PTiAqY29uc3QgY20gPSBwYmktPmNvbW1vbjsKKwlwcl9pbmZvKCJyZW1hcHBlZF9yZWZfaWR4ICVkLCByZWZfZnJhbWVfc2lnbl9iaWFzICVkLCByZWZfZnJhbWVfaWQgJWQsIHZhbGlkX2Zvcl9yZWZlcmVuY2luZyAlZCByZWZfZnJhbWVfc2lkZSAlZCByZWZfZnJhbWVfbWFwIGlkeCAlZCwgbmV4dF9yZWZfZnJhbWVfbWFwIGlkeCAlZCIsCisJCWNtLT5yZW1hcHBlZF9yZWZfaWR4W2ldLAorCQljbS0+cmVmX2ZyYW1lX3NpZ25fYmlhc1tpXSwKKwkJY20tPnJlZl9mcmFtZV9pZFtpXSwKKwkJY20tPnZhbGlkX2Zvcl9yZWZlcmVuY2luZ1tpXSwKKwkJY20tPnJlZl9mcmFtZV9zaWRlW2ldLAorCQlnZXRfYnVmZmVyX2luZGV4KHBiaSwgY20tPnJlZl9mcmFtZV9tYXBbaV0pLAorCQlnZXRfYnVmZmVyX2luZGV4KHBiaSwgY20tPm5leHRfcmVmX2ZyYW1lX21hcFtpXSkpOworfQorCit2b2lkIGR1bXBfbXZfcmVmcyhBVjFEZWNvZGVyICpwYmkpCit7CisgIGludCBpLCBqOworICBBVjFfQ09NTU9OICpjb25zdCBjbSA9IHBiaS0+Y29tbW9uOworICBmb3IgKGkgPSAwOyBpIDwgY20tPm12X3JlZl9pZF9pbmRleDsgaSsrKSB7CisgICAgcHJfaW5mbygiJWQ6IHJlZl9pZCAlZCBjYWxfdHBsX212cyAlZCBtdl9yZWZfb2Zmc2V0OiAiLAorICAgICAgaSwgY20tPm12X3JlZl9pZFtpXSwgY20tPm12X2NhbF90cGxfbXZzW2ldKTsKKyAgICBmb3IgKGogPSAwOyBqIDwgUkVGX0ZSQU1FUzsgaisrKQorICAgICAgICBwcl9pbmZvKCIlZCAiLCBjbS0+bXZfcmVmX29mZnNldFtpXVtqXSk7CisgICAgcHJfaW5mbygiXG4iKTsKKyAgfQorfQorCit2b2lkIGR1bXBfcmVmX3NwZWNfYnVmcyhBVjFEZWNvZGVyICpwYmkpCit7CisgIGludCBpOworICBBVjFfQ09NTU9OICpjb25zdCBjbSA9IHBiaS0+Y29tbW9uOworICBmb3IgKGkgPSAwOyBpIDwgSU5URVJfUkVGU19QRVJfRlJBTUU7ICsraSkgeworICAgIFBJQ19CVUZGRVJfQ09ORklHICpwaWNfY29uZmlnID0gYXYxX2dldF9yZWZfZnJhbWVfc3BlY19idWYoY20sIExBU1RfRlJBTUUgKyBpKTsKKyAgICBpZiAocGljX2NvbmZpZyA9PSBOVUxMKSBjb250aW51ZTsKKyAgICBwcl9pbmZvKCIlZDogaW5kZXggJWQgb3JkZXJfaGludCAlZCBoZWFkZXIgMHgleCBkd19oZWFkZXIgMHgleCBjYW52YXMoJWQsJWQpIG12X3dyX3N0YXJ0IDB4JXggbGN1X3RvdGFsICVkXG4iLAorICAgICAgaSwgcGljX2NvbmZpZy0+aW5kZXgsCisgICAgICBwaWNfY29uZmlnLT5vcmRlcl9oaW50LAorICAgICAgcGljX2NvbmZpZy0+aGVhZGVyX2FkciwKKyNpZmRlZiBBT01fQVYxX01NVV9EVworICAgICAgcGljX2NvbmZpZy0+aGVhZGVyX2R3X2FkciwKKyNlbHNlCisgICAgICAwLAorI2VuZGlmCisgICAgICBwaWNfY29uZmlnLT5tY19jYW52YXNfeSwKKyAgICAgIHBpY19jb25maWctPm1jX2NhbnZhc191X3YsCisgICAgICBwaWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyLAorICAgICAgcGljX2NvbmZpZy0+bGN1X3RvdGFsCisgICAgICApOworICB9Cit9CisKKyNpZmRlZiBTVVBQT1JUX1NDQUxFX0ZBQ1RPUgordm9pZCBkdW1wX3NjYWxlX2ZhY3RvcnMoQVYxRGVjb2RlciAqcGJpKQoreworICBpbnQgaTsKKyAgQVYxX0NPTU1PTiAqY29uc3QgY20gPSBwYmktPmNvbW1vbjsKKyAgZm9yIChpID0gTEFTVF9GUkFNRTsgaSA8PSBBTFRSRUZfRlJBTUU7ICsraSkgeworICAgIHN0cnVjdCBzY2FsZV9mYWN0b3JzICpjb25zdCBzZiA9CisgICAgICAgIGdldF9yZWZfc2NhbGVfZmFjdG9ycyhjbSwgaSk7CisgICAgaWYgKHNmKQorICAgICAgcHJfaW5mbygiJWQ6IGlzX3NjYWxlZCAlZCB4X3NjYWxlX2ZwICVkLCB5X3NjYWxlX2ZwICVkXG4iLAorICAgICAgICBpLCBhdjFfaXNfc2NhbGVkKHNmKSwKKyAgICAgICAgc2YtPnhfc2NhbGVfZnAsIHNmLT55X3NjYWxlX2ZwKTsKKyAgICBlbHNlCisgICAgICBwcl9pbmZvKCIlZDogc2YgbnVsbFxuIiwgaSk7CisgIH0KK30KKworI2VuZGlmCisKK3ZvaWQgZHVtcF9idWZmZXJfc3RhdHVzKEFWMURlY29kZXIgKnBiaSkKK3sKKwlpbnQgaTsKKwlBVjFfQ09NTU9OICpjb25zdCBjbSA9IHBiaS0+Y29tbW9uOworCUJ1ZmZlclBvb2wgKmNvbnN0IHBvb2wgPSBjbS0+YnVmZmVyX3Bvb2w7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2tfYnVmZmVyX3Bvb2wocG9vbCwgZmxhZ3MpOworCisJcHJfaW5mbygiJXM6IHBiaSAlcCBjbSAlcCBjdXJfZnJhbWUgJXBcbiIsIF9fZnVuY19fLCBwYmksIGNtLCBjbS0+Y3VyX2ZyYW1lKTsKKworCXByX2luZm8oIkJ1ZmZlciBQb29sOlxuIik7CisJZm9yIChpID0gMDsgaSA8IEZSQU1FX0JVRkZFUlM7IGkrKykgeworCQlSZWZDbnRCdWZmZXIgKmJ1ZiA9CisJCQkmY20tPmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzW2ldOworCQlwcl9pbmZvKCIlZDogIiwgaSk7CisJCWlmIChidWYpCisJCQlkdW1wX2J1ZmZlcihidWYpOworCQlwcl9pbmZvKCJcbiIpOworCX0KKworCWlmIChjbS0+cHJldl9mcmFtZSkgeworCQlwcl9pbmZvKCJwcmV2X2ZyYW1lICglZCk6ICIsCisJCQlnZXRfYnVmZmVyX2luZGV4KHBiaSwgY20tPnByZXZfZnJhbWUpKTsKKwkJZHVtcF9idWZmZXIoY20tPnByZXZfZnJhbWUpOworCQlwcl9pbmZvKCJcbiIpOworCX0KKwlpZiAoY20tPmN1cl9mcmFtZSkgeworCQlwcl9pbmZvKCJjdXJfZnJhbWUgKCVkKTogIiwKKwkJCWdldF9idWZmZXJfaW5kZXgocGJpLCBjbS0+Y3VyX2ZyYW1lKSk7CisJCWR1bXBfYnVmZmVyKGNtLT5jdXJfZnJhbWUpOworCQlwcl9pbmZvKCJcbiIpOworCX0KKwlwcl9pbmZvKCJSRUZfRlJBTUVTIEluZm8ocmVmIGJ1ZiBpcyByZWZfZnJhbWVfbWFwW3JlbWFwcGVkX3JlZl9pZHhbaS0xXV0sIGk9MX43KTpcbiIpOworCWZvciAoaSA9IDA7IGkgPCBSRUZfRlJBTUVTOyBpKyspIHsKKwkJcHJfaW5mbygiJWQ6ICIsIGkpOworCQlkdW1wX3JlZl9idWZmZXJfaW5mbyhwYmksIGkpOworCQlwcl9pbmZvKCJcbiIpOworCX0KKwlwcl9pbmZvKCJSZWYgU3BlYyBCdWZmZXJzOlxuIik7CisJZHVtcF9yZWZfc3BlY19idWZzKHBiaSk7CisKKwlwcl9pbmZvKCJNViByZWZzOlxuIik7CisJZHVtcF9tdl9yZWZzKHBiaSk7CisKKyNpZmRlZiBTVVBQT1JUX1NDQUxFX0ZBQ1RPUgorCXByX2luZm8oIlNjYWxlIGZhY3RvcnM6XG4iKTsKKwlkdW1wX3NjYWxlX2ZhY3RvcnMocGJpKTsKKyNlbmRpZgorCXVubG9ja19idWZmZXJfcG9vbChwb29sLCBmbGFncyk7Cit9CisKKworc3RydWN0IHBhcmFtX2R1bXBfaXRlbV9zIHsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwljaGFyKiBuYW1lOworCXVuc2lnbmVkIGludCBhZHJfb2ZmOworfSBwYXJhbV9kdW1wX2l0ZW1zW10gPSB7CisJezEsICJwcm9maWxlIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSYoKCh1bmlvbiBwYXJhbV91ICopMCktPnAucHJvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICl9LAorCXsxLCAic3RpbGxfcGljdHVyZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykmKCgodW5pb24gcGFyYW1fdSAqKTApLT5wLnN0aWxsX3BpY3R1cmUgICAgICAgICAgICAgICAgICApfSwKKwl7MSwgInJlZHVjZWRfc3RpbGxfcGljdHVyZV9oZHIiLCAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpJigoKHVuaW9uIHBhcmFtX3UgKikwKS0+cC5yZWR1Y2VkX3N0aWxsX3BpY3R1cmVfaGRyICAgICAgKX0sCisJezEsICJkZWNvZGVyX21vZGVsX2luZm9fcHJlc2VudF9mbGFnIiwgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSYoKCh1bmlvbiBwYXJhbV91ICopMCktPnAuZGVjb2Rlcl9tb2RlbF9pbmZvX3ByZXNlbnRfZmxhZyl9LAorCXsxLCAibWF4X2ZyYW1lX3dpZHRoIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykmKCgodW5pb24gcGFyYW1fdSAqKTApLT5wLm1heF9mcmFtZV93aWR0aCAgICAgICAgICAgICAgICApfSwKKwl7MSwgIm1heF9mcmFtZV9oZWlnaHQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpJigoKHVuaW9uIHBhcmFtX3UgKikwKS0+cC5tYXhfZnJhbWVfaGVpZ2h0ICAgICAgICAgICAgICAgKX0sCisJezEsICJmcmFtZV9pZF9udW1iZXJzX3ByZXNlbnRfZmxhZyIsICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSYoKCh1bmlvbiBwYXJhbV91ICopMCktPnAuZnJhbWVfaWRfbnVtYmVyc19wcmVzZW50X2ZsYWcgICl9LAorCXsxLCAiZGVsdGFfZnJhbWVfaWRfbGVuZ3RoIiwgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykmKCgodW5pb24gcGFyYW1fdSAqKTApLT5wLmRlbHRhX2ZyYW1lX2lkX2xlbmd0aCAgICAgICAgICApfSwKKwl7MSwgImZyYW1lX2lkX2xlbmd0aCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpJigoKHVuaW9uIHBhcmFtX3UgKikwKS0+cC5mcmFtZV9pZF9sZW5ndGggICAgICAgICAgICAgICAgKX0sCisJezEsICJvcmRlcl9oaW50X2JpdHNfbWludXNfMSIsICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSYoKCh1bmlvbiBwYXJhbV91ICopMCktPnAub3JkZXJfaGludF9iaXRzX21pbnVzXzEgICAgICAgICl9LAorCXsxLCAiZW5hYmxlX29yZGVyX2hpbnQiLCAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykmKCgodW5pb24gcGFyYW1fdSAqKTApLT5wLmVuYWJsZV9vcmRlcl9oaW50ICAgICAgICAgICAgICApfSwKKwl7MSwgImVuYWJsZV9kaXN0X3d0ZF9jb21wIiwgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpJigoKHVuaW9uIHBhcmFtX3UgKikwKS0+cC5lbmFibGVfZGlzdF93dGRfY29tcCAgICAgICAgICAgKX0sCisJezEsICJlbmFibGVfcmVmX2ZyYW1lX212cyIsICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSYoKCh1bmlvbiBwYXJhbV91ICopMCktPnAuZW5hYmxlX3JlZl9mcmFtZV9tdnMgICAgICAgICAgICl9LAorCXsxLCAiZW5hYmxlX3N1cGVycmVzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykmKCgodW5pb24gcGFyYW1fdSAqKTApLT5wLmVuYWJsZV9zdXBlcnJlcyAgICAgICAgICAgICAgICApfSwKKwl7MSwgInN1cGVycmVzX3NjYWxlX2Rlbm9taW5hdG9yIiwgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpJigoKHVuaW9uIHBhcmFtX3UgKikwKS0+cC5zdXBlcnJlc19zY2FsZV9kZW5vbWluYXRvciAgICAgKX0sCisJezEsICJzaG93X2V4aXN0aW5nX2ZyYW1lIiwgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSYoKCh1bmlvbiBwYXJhbV91ICopMCktPnAuc2hvd19leGlzdGluZ19mcmFtZSAgICAgICAgICAgICl9LAorCXsxLCAiZnJhbWVfdHlwZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykmKCgodW5pb24gcGFyYW1fdSAqKTApLT5wLmZyYW1lX3R5cGUgICAgICAgICAgICAgICAgICAgICApfSwKKwl7MSwgInNob3dfZnJhbWUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpJigoKHVuaW9uIHBhcmFtX3UgKikwKS0+cC5zaG93X2ZyYW1lICAgICAgICAgICAgICAgICAgICAgKX0sCisJezEsICJlLnIuci5vLnJfcmVzaWxpZW50X21vZGUiLCAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSYoKCh1bmlvbiBwYXJhbV91ICopMCktPnAuZXJyb3JfcmVzaWxpZW50X21vZGUgICAgICAgICAgICl9LAorCXsxLCAicmVmcmVzaF9mcmFtZV9mbGFncyIsICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykmKCgodW5pb24gcGFyYW1fdSAqKTApLT5wLnJlZnJlc2hfZnJhbWVfZmxhZ3MgICAgICAgICAgICApfSwKKwl7MSwgInNob3dhYmxlX2ZyYW1lIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpJigoKHVuaW9uIHBhcmFtX3UgKikwKS0+cC5zaG93YWJsZV9mcmFtZSAgICAgICAgICAgICAgICAgKX0sCisJezEsICJjdXJyZW50X2ZyYW1lX2lkIiwgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSYoKCh1bmlvbiBwYXJhbV91ICopMCktPnAuY3VycmVudF9mcmFtZV9pZCAgICAgICAgICAgICAgICl9LAorCXsxLCAiZnJhbWVfc2l6ZV9vdmVycmlkZV9mbGFnIiwgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykmKCgodW5pb24gcGFyYW1fdSAqKTApLT5wLmZyYW1lX3NpemVfb3ZlcnJpZGVfZmxhZyAgICAgICApfSwKKwl7MSwgIm9yZGVyX2hpbnQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpJigoKHVuaW9uIHBhcmFtX3UgKikwKS0+cC5vcmRlcl9oaW50ICAgICAgICAgICAgICAgICAgICAgKX0sCisJezEsICJwcmltYXJ5X3JlZl9mcmFtZSIsICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSYoKCh1bmlvbiBwYXJhbV91ICopMCktPnAucHJpbWFyeV9yZWZfZnJhbWUgICAgICAgICAgICAgICl9LAorCXsxLCAiZnJhbWVfcmVmc19zaG9ydF9zaWduYWxpbmciLCAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykmKCgodW5pb24gcGFyYW1fdSAqKTApLT5wLmZyYW1lX3JlZnNfc2hvcnRfc2lnbmFsaW5nICAgICApfSwKKwl7MSwgImZyYW1lX3dpZHRoIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpJigoKHVuaW9uIHBhcmFtX3UgKikwKS0+cC5mcmFtZV93aWR0aCAgICAgICAgICAgICAgICAgICAgKX0sCisJezEsICJkZWNfZnJhbWVfd2lkdGgiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSYoKCh1bmlvbiBwYXJhbV91ICopMCktPnAuZGVjX2ZyYW1lX3dpZHRoICAgICAgICAgICAgICAgICl9LAorCXsxLCAiZnJhbWVfd2lkdGhfc2NhbGVkIiwgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykmKCgodW5pb24gcGFyYW1fdSAqKTApLT5wLmZyYW1lX3dpZHRoX3NjYWxlZCAgICAgICAgICAgICApfSwKKwl7MSwgImZyYW1lX2hlaWdodCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpJigoKHVuaW9uIHBhcmFtX3UgKikwKS0+cC5mcmFtZV9oZWlnaHQgICAgICAgICAgICAgICAgICAgKX0sCisJezEsICJyZWZlcmVuY2VfbW9kZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSYoKCh1bmlvbiBwYXJhbV91ICopMCktPnAucmVmZXJlbmNlX21vZGUgICAgICAgICAgICAgICAgICl9LAorCXsxLCAidXBkYXRlX3BhcmFtZXRlcnMiLCAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykmKCgodW5pb24gcGFyYW1fdSAqKTApLT5wLnVwZGF0ZV9wYXJhbWV0ZXJzICAgICAgICAgICAgICApfSwKKwl7MSwgImZpbG1fZ3JhaW5fcGFyYW1zX3JlZl9pZHgiLCAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpJigoKHVuaW9uIHBhcmFtX3UgKikwKS0+cC5maWxtX2dyYWluX3BhcmFtc19yZWZfaWR4ICAgICAgKX0sCisJezEsICJhbGxvd19yZWZfZnJhbWVfbXZzIiwgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSYoKCh1bmlvbiBwYXJhbV91ICopMCktPnAuYWxsb3dfcmVmX2ZyYW1lX212cyAgICAgICAgICAgICl9LAorCXsxLCAibHN0X3JlZiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykmKCgodW5pb24gcGFyYW1fdSAqKTApLT5wLmxzdF9yZWYgICAgICAgICAgICAgICAgICAgICAgICApfSwKKwl7MSwgImdsZF9yZWYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpJigoKHVuaW9uIHBhcmFtX3UgKikwKS0+cC5nbGRfcmVmICAgICAgICAgICAgICAgICAgICAgICAgKX0sCisJe0lOVEVSX1JFRlNfUEVSX0ZSQU1FLCAicmVtYXBwZWRfcmVmX2lkeCIsICAgICAgICh1bnNpZ25lZCBsb25nKSYoKCh1bmlvbiBwYXJhbV91ICopMCktPnAucmVtYXBwZWRfcmVmX2lkeFswXSAgICAgICAgICAgICl9LAorCXtJTlRFUl9SRUZTX1BFUl9GUkFNRSwgImRlbHRhX2ZyYW1lX2lkX21pbnVzXzEiLCAodW5zaWduZWQgbG9uZykmKCgodW5pb24gcGFyYW1fdSAqKTApLT5wLmRlbHRhX2ZyYW1lX2lkX21pbnVzXzFbMF0gICAgICApfSwKKwl7UkVGX0ZSQU1FUywgInJlZl9vcmRlcl9oaW50IiwgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpJigoKHVuaW9uIHBhcmFtX3UgKikwKS0+cC5yZWZfb3JkZXJfaGludFswXSAgICAgICAgICAgICAgKX0sCit9OworCit2b2lkIGR1bXBfcGFyYW1zKEFWMURlY29kZXIgKnBiaSwgdW5pb24gcGFyYW1fdSAqcGFyYW1zKQoreworCWludCBpLCBqOworCXVuc2lnbmVkIGNoYXIgKnN0YXJ0X2FkciA9ICh1bnNpZ25lZCBjaGFyKilwYXJhbXM7CisKKwlwcl9pbmZvKCI9PT09PT09PT09PT0gcGFyYW1zOlxuIik7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihwYXJhbV9kdW1wX2l0ZW1zKSAvIHNpemVvZihwYXJhbV9kdW1wX2l0ZW1zWzBdKTsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBwYXJhbV9kdW1wX2l0ZW1zW2ldLnNpemU7IGorKykgeworCQkJaWYgKHBhcmFtX2R1bXBfaXRlbXNbaV0uc2l6ZSA+IDEpCisJCQkJcHJfaW5mbygiJXMoJWQpOiAweCV4XG4iLAorCQkJCXBhcmFtX2R1bXBfaXRlbXNbaV0ubmFtZSwgaiwKKwkJCQkqKCh1bnNpZ25lZCBzaG9ydCopKHN0YXJ0X2FkciArIHBhcmFtX2R1bXBfaXRlbXNbaV0uYWRyX29mZiArIGogKiAyKSkpOworCQkJZWxzZQorCQkJCXByX2luZm8oIiVzOiAweCV4XG4iLCBwYXJhbV9kdW1wX2l0ZW1zW2ldLm5hbWUsCisJCQkJKigodW5zaWduZWQgc2hvcnQqKShzdGFydF9hZHIgKyBwYXJhbV9kdW1wX2l0ZW1zW2ldLmFkcl9vZmYgKyBqICogMikpKTsKKwkJfQorCX0KK30KKworLypzdGF0aWMgdm9pZCByYXdfd3JpdGVfaW1hZ2UoQVYxRGVjb2RlciAqcGJpLCBQSUNfQlVGRkVSX0NPTkZJRyAqc2QpCit7CisgIHByaW50ZigiJCQkJCQkJCBvdXRwdXQgaW1hZ2VcbiIpOworfSovCisKKy8qCisgIHJldHVybiAwLCBuZWVkIGRlY29kaW5nIGRhdGEKKyAgMSwgZGVjb2RpbmcgZG9uZQorICAtMSwgZGVjb2RpbmcgZXJyb3IKKworKi8KK2ludCBhdjFfYnVmbWdyX3Byb2Nlc3MoQVYxRGVjb2RlciAqcGJpLCB1bmlvbiBwYXJhbV91ICpwYXJhbXMsCisgIHVuc2lnbmVkIGNoYXIgbmV3X2NvbXByZXNzZWRfZGF0YSwgaW50IG9idV90eXBlKQoreworICBBVjFfQ09NTU9OICpjb25zdCBjbSA9IHBiaS0+Y29tbW9uOworICBpbnQgajsKKyAgLy8gUmVsZWFzZSBhbnkgcGVuZGluZyBvdXRwdXQgZnJhbWVzIGZyb20gdGhlIHByZXZpb3VzIGRlY29kZXJfZGVjb2RlIGNhbGwuCisgIC8vIFdlIG5lZWQgdG8gZG8gdGhpcyBldmVuIGlmIHRoZSBkZWNvZGVyIGlzIGJlaW5nIGZsdXNoZWQgb3IgdGhlIGlucHV0CisgIC8vIGFyZ3VtZW50cyBhcmUgaW52YWxpZC4KKyAgQnVmZmVyUG9vbCAqY29uc3QgcG9vbCA9IGNtLT5idWZmZXJfcG9vbDsKKyAgaW50IGZyYW1lX2RlY29kZWQ7CisgIGF2MV9wcmludDIoQVYxX0RFQlVHX0JVRk1HUl9ERVRBSUwsICIlczogcGJpICVwIGNtICVwIGN1cl9mcmFtZSAlcFxuIiwgX19mdW5jX18sIHBiaSwgY20sIGNtLT5jdXJfZnJhbWUpOworICBhdjFfcHJpbnQyKEFWMV9ERUJVR19CVUZNR1JfREVUQUlMLCAiJXM6IG5ld19jb21wcmVzc2VkX2RhdGE9ICVkXG4iLCBfX2Z1bmNfXywgbmV3X2NvbXByZXNzZWRfZGF0YSk7CisgIGZvciAoaiA9IDA7IGogPCBwYmktPm51bV9vdXRwdXRfZnJhbWVzOyBqKyspIHsKKyAgICBkZWNyZWFzZV9yZWZfY291bnQocGJpLCBwYmktPm91dHB1dF9mcmFtZXNbal0sIHBvb2wpOworICB9CisgIHBiaS0+bnVtX291dHB1dF9mcmFtZXMgPSAwOworICAvLworICBpZiAobmV3X2NvbXByZXNzZWRfZGF0YSkgeworICAgIGlmIChhc3NpZ25fY3VyX2ZyYW1lX25ld19mYihjbSkgPT0gTlVMTCkgeworICAgICAgY20tPmVycm9yLmVycm9yX2NvZGUgPSBBT01fQ09ERUNfTUVNX0VSUk9SOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBwYmktPnNlZW5fZnJhbWVfaGVhZGVyID0gMDsKKyAgICBhdjFfcHJpbnQyKEFWMV9ERUJVR19CVUZNR1JfREVUQUlMLCAiTmV3X2NvbXByZXNzZWRfZGF0YSAoJWQpXG4iLCBuZXdfY29tcHJlc3NlZF9kYXRhX2NvdW50KyspOworCisgIH0KKworICBmcmFtZV9kZWNvZGVkID0KKyAgICAgIGFvbV9kZWNvZGVfZnJhbWVfZnJvbV9vYnVzKHBiaSwgcGFyYW1zLCBvYnVfdHlwZSk7CisKKyAgaWYgKHBiaS0+Y3VyX29idV90eXBlID09IE9CVV9GUkFNRV9IRUFERVIgfHwKKyAgICAgICAgICBwYmktPmN1cl9vYnVfdHlwZSA9PSBPQlVfUkVEVU5EQU5UX0ZSQU1FX0hFQURFUiB8fAorICAgICAgICAgIHBiaS0+Y3VyX29idV90eXBlID09IE9CVV9GUkFNRSkgeworICAgICAgaWYgKGF2MV9pc19kZWJ1ZyhBT01fREVCVUdfUFJJTlRfTElTVF9JTkZPKSkgeworICAgICAgICBwcl9pbmZvKCJhZnRlciBidWZtZ3IgKGZyYW1lX2RlY29kZWQgJWQgc2Vlbl9mcmFtZV9oZWFkZXIgJWQpOiAiLAorICAgICAgICAgIGZyYW1lX2RlY29kZWQsIHBiaS0+c2Vlbl9mcmFtZV9oZWFkZXIpOworICAgICAgICBkdW1wX2J1ZmZlcl9zdGF0dXMocGJpKTsKKyAgICAgIH0KKyAgfQorICBhdjFfcHJpbnQyKEFWMV9ERUJVR19CVUZNR1JfREVUQUlMLCAiJXM6IHBiaSAlcCBjbSAlcCBjdXJfZnJhbWUgJXBcbiIsIF9fZnVuY19fLCBwYmksIGNtLCBjbS0+Y3VyX2ZyYW1lKTsKKworICByZXR1cm4gZnJhbWVfZGVjb2RlZDsKKworfQorCitpbnQgYXYxX2dldF9yYXdfZnJhbWUoQVYxRGVjb2RlciAqcGJpLCBzaXplX3QgaW5kZXgsIFBJQ19CVUZGRVJfQ09ORklHICoqc2QpIHsKKyAgaWYgKGluZGV4ID49IHBiaS0+bnVtX291dHB1dF9mcmFtZXMpIHJldHVybiAtMTsKKyAgKnNkID0gJnBiaS0+b3V0cHV0X2ZyYW1lc1tpbmRleF0tPmJ1ZjsKKyAgLy8qZ3JhaW5fcGFyYW1zID0gJnBiaS0+b3V0cHV0X2ZyYW1lc1tpbmRleF0tPmZpbG1fZ3JhaW5fcGFyYW1zOworICAvL2FvbV9jbGVhcl9zeXN0ZW1fc3RhdGUoKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBhdjFfYnVmbWdyX3Bvc3Rwcm9jKEFWMURlY29kZXIgKnBiaSwgdW5zaWduZWQgY2hhciBmcmFtZV9kZWNvZGVkKQoreworICAgIFBJQ19CVUZGRVJfQ09ORklHICpzZCA9IE5VTEw7CisgICAgaW50IGluZGV4OworI2lmIDAKKyAgICBpZiAoZnJhbWVfZGVjb2RlZCkgeworICAgICAgcHJpbnRmKCJiZWZvcmUgc3dhcF9mcmFtZV9idWZmZXJzOiAiKTsKKyAgICAgIGR1bXBfYnVmZmVyX3N0YXR1cyhwYmkpOworICAgIH0KKyNlbmRpZgorICAgIHN3YXBfZnJhbWVfYnVmZmVycyhwYmksIGZyYW1lX2RlY29kZWQpOworICAgIGlmIChmcmFtZV9kZWNvZGVkKSB7CisgICAgICBpZiAoYXYxX2lzX2RlYnVnKEFPTV9ERUJVR19QUklOVF9MSVNUX0lORk8pKSB7CisgICAgICAgIHByX2luZm8oImFmdGVyIHN3YXBfZnJhbWVfYnVmZmVyczogIik7CisgICAgICAgIGR1bXBfYnVmZmVyX3N0YXR1cyhwYmkpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoZnJhbWVfZGVjb2RlZCkgeworICAgICAgcGJpLT5kZWNvZGluZ19maXJzdF9mcmFtZSA9IDA7CisgICAgfQorCisKKyAgICBmb3IgKGluZGV4ID0gMDs7aW5kZXgrKykgeworICAgICAgaWYgKGF2MV9nZXRfcmF3X2ZyYW1lKHBiaSwgaW5kZXgsICZzZCkgPCAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgaWYgKHNkKQorCSAgICAgIGF2MV9yYXdfd3JpdGVfaW1hZ2UocGJpLCBzZCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgYW9tX3JlYWxsb2NfZnJhbWVfYnVmZmVyKEFWMV9DT01NT04gKmNtLCBQSUNfQlVGRkVSX0NPTkZJRyAqcGljLAorICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIHVuc2lnbmVkIGludCBvcmRlcl9oaW50KQoreworICBhdjFfcHJpbnQyKEFWMV9ERUJVR19CVUZNR1JfREVUQUlMLCAiJXMsIGluZGV4IDB4JXgsIHdpZHRoIDB4JXgsIGhlaWdodCAweCV4IG9yZGVyX2hpbnQgMHgleFxuIiwKKyAgICBfX2Z1bmNfXywgcGljLT5pbmRleCwgd2lkdGgsIGhlaWdodCwgb3JkZXJfaGludCk7CisgIHBpYy0+eV9jcm9wX3dpZHRoID0gd2lkdGg7CisgIHBpYy0+eV9jcm9wX2hlaWdodCA9IGhlaWdodDsKKyAgcGljLT5vcmRlcl9oaW50ID0gb3JkZXJfaGludDsKKyAgcmV0dXJuIDA7Cit9CisKKwordW5zaWduZWQgY2hhciBhdjFfZnJhbWVfaXNfaW50ZXIoY29uc3QgQVYxX0NPTU1PTiAqY29uc3QgY20pIHsKKyAgdW5zaWduZWQgY2hhciBpc19pbnRlciA9IGNtLT5jdXJfZnJhbWUgJiYgKGNtLT5jdXJfZnJhbWUtPmZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKQorICAgICAmJiAoY20tPmN1cnJlbnRfZnJhbWUuZnJhbWVfdHlwZSAhPSBJTlRSQV9PTkxZX0ZSQU1FKTsKKyAgcmV0dXJuIGlzX2ludGVyOworfQorCitQSUNfQlVGRkVSX0NPTkZJRyAqYXYxX2dldF9yZWZfZnJhbWVfc3BlY19idWYoCisgICAgY29uc3QgQVYxX0NPTU1PTiAqY29uc3QgY20sIGNvbnN0IE1WX1JFRkVSRU5DRV9GUkFNRSByZWZfZnJhbWUpIHsKKyAgUmVmQ250QnVmZmVyICpidWYgPSBnZXRfcmVmX2ZyYW1lX2J1ZihjbSwgcmVmX2ZyYW1lKTsKKyAgaWYgKGJ1ZikgeworICAgIGJ1Zi0+YnVmLm9yZGVyX2hpbnQgPSBidWYtPm9yZGVyX2hpbnQ7CisgICAgcmV0dXJuICYoYnVmLT5idWYpOworICB9CisgIHJldHVybiBOVUxMOworfQorCitzdHJ1Y3Qgc2NhbGVfZmFjdG9ycyAqYXYxX2dldF9yZWZfc2NhbGVfZmFjdG9ycygKKyAgQVYxX0NPTU1PTiAqY29uc3QgY20sIGNvbnN0IE1WX1JFRkVSRU5DRV9GUkFNRSByZWZfZnJhbWUpCit7CisgIHJldHVybiBnZXRfcmVmX3NjYWxlX2ZhY3RvcnMoY20sIHJlZl9mcmFtZSk7Cit9CisKK3ZvaWQgYXYxX3NldF9uZXh0X3JlZl9mcmFtZV9tYXAoQVYxRGVjb2RlciAqcGJpKSB7CisgIGludCByZWZfaW5kZXggPSAwOworICBpbnQgbWFzazsKKyAgQVYxX0NPTU1PTiAqY29uc3QgY20gPSBwYmktPmNvbW1vbjsKKyAgaW50IGNoZWNrX29uX3Nob3dfZXhpc3RpbmdfZnJhbWU7CisgIGF2MV9wcmludDIoQVYxX0RFQlVHX0JVRk1HUl9ERVRBSUwsICIlcywgJWQsIG1hc2sgMHgleCwgc2hvd19leGlzdGluZ19mcmFtZSAlZCwgcmVzZXRfZGVjb2Rlcl9zdGF0ZSAlZFxuIiwKKyAgICBfX2Z1bmNfXywgcGJpLT5jYW1lcmFfZnJhbWVfaGVhZGVyX3JlYWR5LAorICAgIGNtLT5jdXJyZW50X2ZyYW1lLnJlZnJlc2hfZnJhbWVfZmxhZ3MsCisgICAgY20tPnNob3dfZXhpc3RpbmdfZnJhbWUsCisgICAgcGJpLT5yZXNldF9kZWNvZGVyX3N0YXRlCisgICAgKTsKKyAgaWYgKCFwYmktPmNhbWVyYV9mcmFtZV9oZWFkZXJfcmVhZHkpIHsKKyAgICBmb3IgKG1hc2sgPSBjbS0+Y3VycmVudF9mcmFtZS5yZWZyZXNoX2ZyYW1lX2ZsYWdzOyBtYXNrOyBtYXNrID4+PSAxKSB7CisgICAgICBjbS0+bmV4dF91c2VkX3JlZl9mcmFtZV9tYXBbcmVmX2luZGV4XSA9IGNtLT5uZXh0X3JlZl9mcmFtZV9tYXBbcmVmX2luZGV4XTsKKyAgICAgICsrcmVmX2luZGV4OworICAgIH0KKworICAgIGNoZWNrX29uX3Nob3dfZXhpc3RpbmdfZnJhbWUgPQorICAgICAgICAhY20tPnNob3dfZXhpc3RpbmdfZnJhbWUgfHwgcGJpLT5yZXNldF9kZWNvZGVyX3N0YXRlOworICAgIGZvciAoOyByZWZfaW5kZXggPCBSRUZfRlJBTUVTICYmIGNoZWNrX29uX3Nob3dfZXhpc3RpbmdfZnJhbWU7CisgICAgICAgICArK3JlZl9pbmRleCkgeworICAgICAgY20tPm5leHRfdXNlZF9yZWZfZnJhbWVfbWFwW3JlZl9pbmRleF0gPSBjbS0+bmV4dF9yZWZfZnJhbWVfbWFwW3JlZl9pbmRleF07CisgICAgfQorICB9Cit9CisKK3Vuc2lnbmVkIGludCBhdjFfZ2V0X25leHRfdXNlZF9yZWZfaW5mbygKKyAgICBjb25zdCBBVjFfQ09NTU9OICpjb25zdCBjbSwgaW50IGkpIHsKKyAgLyoKKyAgaSA9IDB+MSBvcmRlX2hpbnQgbWFwCisgIGkgPSAyfjEwIHNpemUgbWFwW2ktMl0KKyAgKi8KKyAgdW5zaWduZWQgaW50IGluZm8gPSAwOworICBpbnQgajsKKyAgaWYgKGkgPCAyKSB7CisgICAgLypuZXh0X3VzZWRfcmVmX2ZyYW1lX21hcCBoYXMgOCBpdGVtcyovCisgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgUmVmQ250QnVmZmVyICpidWYgPQorICAgICAgICBjbS0+bmV4dF91c2VkX3JlZl9mcmFtZV9tYXBbKGkgKiA0KSArIGpdOworICAgICAgaWYgKGJ1ZikKKyAgICAgICAgaW5mbyB8PSAoKGJ1Zi0+YnVmLm9yZGVyX2hpbnQgJiAweGZmKQorICAgICAgICAgIDw8IChqICogOCkpOworICAgIH0KKyAgfSBlbHNlIGlmIChpIDwgMTApIHsKKyAgICBSZWZDbnRCdWZmZXIgKmJ1ZiA9CisgICAgICBjbS0+bmV4dF91c2VkX3JlZl9mcmFtZV9tYXBbaS0yXTsKKyAgICBpZiAoYnVmKQorICAgICAgaW5mbyA9IChidWYtPmJ1Zi55X2Nyb3Bfd2lkdGggPDwgMTYpIHwgKGJ1Zi0+YnVmLnlfY3JvcF9oZWlnaHQgJiAweGZmZmYpOworICB9IGVsc2UgeworICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgIFJlZkNudEJ1ZmZlciAqYnVmID0KKyAgICAgICAgY20tPm5leHRfdXNlZF9yZWZfZnJhbWVfbWFwWygoaSAtIDEwKSAqIDQpICsgal07CisgICAgICBpZiAoYnVmKQorICAgICAgICBpbmZvIHw9ICgoYnVmLT5idWYuaW5kZXggJiAweGZmKQorICAgICAgICAgIDw8IChqICogOCkpOworICAgIH0KKyAgfQorICByZXR1cm4gaW5mbzsKK30KKworUmVmQ250QnVmZmVyICphdjFfZ2V0X3ByaW1hcnlfcmVmX2ZyYW1lX2J1ZigKKyAgY29uc3QgQVYxX0NPTU1PTiAqY29uc3QgY20pCit7CisgIHJldHVybiBnZXRfcHJpbWFyeV9yZWZfZnJhbWVfYnVmKGNtKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci92YXYxL2F2MV9nbG9iYWwuaCBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci92YXYxL2F2MV9nbG9iYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTJiMjI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3ZhdjEvYXYxX2dsb2JhbC5oCkBAIC0wLDAgKzEsMjMzNiBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE3IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyogbW9yZSBkZXRhaWxzLgorKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKgorKiBEZXNjcmlwdGlvbjoKKyovCisjaWZuZGVmIEFWMV9HTE9CQUxfSF8KKyNkZWZpbmUgQVYxX0dMT0JBTF9IXworI2RlZmluZSBBT01fQVYxX01NVV9EVworI2lmbmRlZiBIQVZFX05FT04KKyNkZWZpbmUgSEFWRV9ORU9OIDAKKyNlbmRpZgorI2lmbmRlZiBDT05GSUdfQUNDT1VOVElORworI2RlZmluZSBDT05GSUdfQUNDT1VOVElORyAwCisjZW5kaWYKKyNpZm5kZWYgQ09ORklHX0lOU1BFQ1RJT04KKyNkZWZpbmUgQ09ORklHX0lOU1BFQ1RJT04gMAorI2VuZGlmCisjaWZuZGVmIENPTkZJR19MUEZfTUFTSworI2RlZmluZSBDT05GSUdfTFBGX01BU0sgMAorI2VuZGlmCisjaWZuZGVmIENPTkZJR19TSVpFX0xJTUlUCisjZGVmaW5lIENPTkZJR19TSVpFX0xJTUlUIDAKKyNlbmRpZgorCisjZGVmaW5lIFNVUFBPUlRfU0NBTEVfRkFDVE9SCisjZGVmaW5lIFVTRV9TQ0FMRURfV0lEVEhfRlJPTV9VQ09ERQorI2RlZmluZSBBTUwKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9NVUxUSV9ERUMKKyNkZWZpbmUgQU1MX0RFVklDRQorI2VuZGlmCisjaWZkZWYgQlVGTUdSX0ZPUl9TSU0KKyNkZWZpbmUgcHJpbnRmIGlvX3ByaW50ZgorI2VuZGlmCisKKyNpZm5kZWYgSU5UX01BWAorI2RlZmluZSBJTlRfTUFYIDB4N0ZGRkZGRkYKKyNlbmRpZgorI2RlZmluZSBBT01NSU4oeCwgeSkgKCgoeCkgPCAoeSkpID8gKHgpIDogKHkpKQorI2RlZmluZSBBT01NQVgoeCwgeSkgKCgoeCkgPiAoeSkpID8gKHgpIDogKHkpKQorCisKKyNpZmRlZiBBTUwKKyNkZWZpbmUgQU9NX0FWMV9NTVUKKyNkZWZpbmUgRklMTV9HUkFJTl9SRUdfU0laRSAgMzkKK3R5cGVkZWYgc3RydWN0IGJ1ZmZfcworeworICAgIHVpbnQzMl90IGJ1Zl9zdGFydDsKKyAgICB1aW50MzJfdCBidWZfc2l6ZTsKKyAgICB1aW50MzJfdCBidWZfZW5kOworfSBidWZmX3Q7CisKK3R5cGVkZWYgc3RydWN0IEJ1ZmZJbmZvX3MKK3sKKyAgICB1aW50MzJfdCBtYXhfd2lkdGg7CisgICAgdWludDMyX3QgbWF4X2hlaWdodDsKKyAgICB1aW50MzJfdCBzdGFydF9hZHI7CisgICAgdWludDMyX3QgZW5kX2FkcjsKKyAgICBidWZmX3QgaXBwOworICAgIGJ1ZmZfdCBzYW9fYWJ2OworICAgIGJ1ZmZfdCBzYW9fdmI7CisgICAgYnVmZl90IHNob3J0X3Rlcm1fcnBzOworICAgIGJ1ZmZfdCB2cHM7CisgICAgYnVmZl90IHNlZ19tYXA7CisgICAgYnVmZl90IGRhYWxhX3RvcDsKKyAgICBidWZmX3Qgc2FvX3VwOworICAgIGJ1ZmZfdCBzd2FwX2J1ZjsKKyAgICBidWZmX3QgY2RmX2J1ZjsKKyAgICBidWZmX3QgZ21jX2J1ZjsKKyAgICBidWZmX3Qgc2NhbGVsdXQ7CisgICAgYnVmZl90IGRibGtfcGFyYTsKKyAgICBidWZmX3QgZGJsa19kYXRhOworICAgIGJ1ZmZfdCBjZGVmX2RhdGE7CisgICAgYnVmZl90IHVwc19kYXRhOworI2lmZGVmIEFPTV9BVjFfTU1VCisgICAgYnVmZl90IG1tdV92Ymg7CisgICAgYnVmZl90IGNtX2hlYWRlcjsKKyNlbmRpZgorI2lmZGVmIEFPTV9BVjFfTU1VX0RXCisgICAgYnVmZl90IG1tdV92YmhfZHc7CisgICAgYnVmZl90IGNtX2hlYWRlcl9kdzsKKyNlbmRpZgorICAgIGJ1ZmZfdCBmZ3NfdGFibGU7CisgICAgYnVmZl90IG1wcmVkX2Fib3ZlOworICAgIGJ1ZmZfdCBtcHJlZF9tdjsKKyAgICBidWZmX3QgcnBtOworICAgIGJ1ZmZfdCBsbWVtOworfSBCdWZmSW5mb190OworI2VuZGlmCisKKyNpZiAwCisjZGVmaW5lIHZhX3N0YXJ0KHYsbCkgICBfX2J1aWx0aW5fdmFfc3RhcnQodixsKQorI2RlZmluZSB2YV9lbmQodikgICAgICAgX19idWlsdGluX3ZhX2VuZCh2KQorI2RlZmluZSB2YV9hcmcodixsKSAgICAgX19idWlsdGluX3ZhX2FyZyh2LGwpCisjZW5kaWYKKworLyoKK21lbS5oCisqLworI2lmIChkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXykgfHwgZGVmaW5lZChfX1NVTlBST19DKQorI2RlZmluZSBERUNMQVJFX0FMSUdORUQobiwgdHlwLCB2YWwpIHR5cCB2YWwgX19hdHRyaWJ1dGVfXygoYWxpZ25lZChuKSkpCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorI2RlZmluZSBERUNMQVJFX0FMSUdORUQobiwgdHlwLCB2YWwpIF9fZGVjbHNwZWMoYWxpZ24obikpIHR5cCB2YWwKKyNlbHNlCisjd2FybmluZyBObyBhbGlnbm1lbnQgZGlyZWN0aXZlcyBrbm93biBmb3IgdGhpcyBjb21waWxlci4KKyNkZWZpbmUgREVDTEFSRV9BTElHTkVEKG4sIHR5cCwgdmFsKSB0eXAgdmFsCisjZW5kaWYKKworLyogSW5kaWNhdGVzIHRoYXQgdGhlIHVzYWdlIG9mIHRoZSBzcGVjaWZpZWQgdmFyaWFibGUgaGFzIGJlZW4gYXVkaXRlZCB0byBhc3N1cmUKKyAqIHRoYXQgaXQncyBzYWZlIHRvIHVzZSB1bmluaXRpYWxpemVkLiBTaWxlbmNlcyAnbWF5IGJlIHVzZWQgdW5pbml0aWFsaXplZCcKKyAqIHdhcm5pbmdzIG9uIGdjYy4KKyAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fCisjZGVmaW5lIFVOSU5JVElBTElaRURfSVNfU0FGRSh4KSB4ID0geAorI2Vsc2UKKyNkZWZpbmUgVU5JTklUSUFMSVpFRF9JU19TQUZFKHgpIHgKKyNlbmRpZgorCisjaWYgSEFWRV9ORU9OICYmIGRlZmluZWQoX01TQ19WRVIpCisjZGVmaW5lIF9fYnVpbHRpbl9wcmVmZXRjaCh4KQorI2VuZGlmCisKKy8qIFNoaWZ0IGRvd24gd2l0aCByb3VuZGluZyBmb3IgdXNlIHdoZW4gbiA+PSAwLCB2YWx1ZSA+PSAwICovCisjZGVmaW5lIFJPVU5EX1BPV0VSX09GX1RXTyh2YWx1ZSwgbikgKCgodmFsdWUpICsgKCgoMSA8PCAobikpID4+IDEpKSkgPj4gKG4pKQorCisvKiBTaGlmdCBkb3duIHdpdGggcm91bmRpbmcgZm9yIHNpZ25lZCBpbnRlZ2VycywgZm9yIHVzZSB3aGVuIG4gPj0gMCAqLworI2RlZmluZSBST1VORF9QT1dFUl9PRl9UV09fU0lHTkVEKHZhbHVlLCBuKSAgICAgICAgICAgXAorICAoKCh2YWx1ZSkgPCAwKSA/IC1ST1VORF9QT1dFUl9PRl9UV08oLSh2YWx1ZSksIChuKSkgXAorICAgICAgICAgICAgICAgICA6IFJPVU5EX1BPV0VSX09GX1RXTygodmFsdWUpLCAobikpKQorCisvKiBTaGlmdCBkb3duIHdpdGggcm91bmRpbmcgZm9yIHVzZSB3aGVuIG4gPj0gMCwgdmFsdWUgPj0gMCBmb3IgKDY0IGJpdCkgKi8KKyNkZWZpbmUgUk9VTkRfUE9XRVJfT0ZfVFdPXzY0KHZhbHVlLCBuKSBcCisgICgoKHZhbHVlKSArICgoKChpbnQ2NF90KTEgPDwgKG4pKSA+PiAxKSkpID4+IChuKSkKKy8qIFNoaWZ0IGRvd24gd2l0aCByb3VuZGluZyBmb3Igc2lnbmVkIGludGVnZXJzLCBmb3IgdXNlIHdoZW4gbiA+PSAwICg2NCBiaXQpICovCisjZGVmaW5lIFJPVU5EX1BPV0VSX09GX1RXT19TSUdORURfNjQodmFsdWUsIG4pICAgICAgICAgICBcCisgICgoKHZhbHVlKSA8IDApID8gLVJPVU5EX1BPV0VSX09GX1RXT182NCgtKHZhbHVlKSwgKG4pKSBcCisgICAgICAgICAgICAgICAgIDogUk9VTkRfUE9XRVJfT0ZfVFdPXzY0KCh2YWx1ZSksIChuKSkpCisKKy8qIHNoaWZ0IHJpZ2h0IG9yIGxlZnQgZGVwZW5kaW5nIG9uIHNpZ24gb2YgbiAqLworI2RlZmluZSBSSUdIVF9TSUdORURfU0hJRlQodmFsdWUsIG4pIFwKKyAgKChuKSA8IDAgPyAoKHZhbHVlKSA8PCAoLShuKSkpIDogKCh2YWx1ZSkgPj4gKG4pKSkKKworI2RlZmluZSBBTElHTl9QT1dFUl9PRl9UV08odmFsdWUsIG4pIFwKKyAgKCgodmFsdWUpICsgKCgxIDw8IChuKSkgLSAxKSkgJiB+KCgxIDw8IChuKSkgLSAxKSkKKworI2RlZmluZSBESVZJREVfQU5EX1JPVU5EKHgsIHkpICgoKHgpICsgKCh5KSA+PiAxKSkgLyAoeSkpCisKKyNkZWZpbmUgQ09OVkVSVF9UT19TSE9SVFBUUih4KSAoKHVpbnQxNl90ICopKCgodWludHB0cl90KSh4KSkgPDwgMSkpCisjZGVmaW5lIENPTlZFUlRfVE9fQllURVBUUih4KSAoKHVpbnQ4X3QgKikoKCh1aW50cHRyX3QpKHgpKSA+PiAxKSkKKworI2lmZGVmIEFNTAorI2RlZmluZSBUWVBFREVGIHR5cGVkZWYKKyNkZWZpbmUgVUVOVU0xQllURShlbnVtdmFyKSBlbnVtdmFyCisjZGVmaW5lIFNFTlVNMUJZVEUoZW51bXZhcikgZW51bXZhcgorI2RlZmluZSBVRU5VTTJCWVRFKGVudW12YXIpIGVudW12YXIKKyNkZWZpbmUgU0VOVU0yQllURShlbnVtdmFyKSBlbnVtdmFyCisjZGVmaW5lIFVFTlVNNEJZVEUoZW51bXZhcikgZW51bXZhcgorI2RlZmluZSBTRU5VTTRCWVRFKGVudW12YXIpIGVudW12YXIKKworI2Vsc2UKKyNkZWZpbmUgVFlQRURFRgorLyohXGJyaWVmIGZvcmNlIGVudW0gdG8gYmUgdW5zaWduZWQgMSBieXRlKi8KKyNkZWZpbmUgVUVOVU0xQllURShlbnVtdmFyKSBcCisgIDsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlZGVmIHVpbnQ4X3QgZW51bXZhcgorCisvKiFcYnJpZWYgZm9yY2UgZW51bSB0byBiZSBzaWduZWQgMSBieXRlKi8KKyNkZWZpbmUgU0VOVU0xQllURShlbnVtdmFyKSBcCisgIDsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlZGVmIGludDhfdCBlbnVtdmFyCisKKy8qIVxicmllZiBmb3JjZSBlbnVtIHRvIGJlIHVuc2lnbmVkIDIgYnl0ZSovCisjZGVmaW5lIFVFTlVNMkJZVEUoZW51bXZhcikgXAorICA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHlwZWRlZiB1aW50MTZfdCBlbnVtdmFyCisKKy8qIVxicmllZiBmb3JjZSBlbnVtIHRvIGJlIHNpZ25lZCAyIGJ5dGUqLworI2RlZmluZSBTRU5VTTJCWVRFKGVudW12YXIpIFwKKyAgOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHR5cGVkZWYgaW50MTZfdCBlbnVtdmFyCisKKy8qIVxicmllZiBmb3JjZSBlbnVtIHRvIGJlIHVuc2lnbmVkIDQgYnl0ZSovCisjZGVmaW5lIFVFTlVNNEJZVEUoZW51bXZhcikgXAorICA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHlwZWRlZiB1aW50MzJfdCBlbnVtdmFyCisKKy8qIVxicmllZiBmb3JjZSBlbnVtIHRvIGJlIHVuc2lnbmVkIDQgYnl0ZSovCisjZGVmaW5lIFNFTlVNNEJZVEUoZW51bXZhcikgXAorICA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHlwZWRlZiBpbnQzMl90IGVudW12YXIKKyNlbmRpZgorCisKKy8qCisjaW5jbHVkZSAiZW51bXMuaCIKKyovCisjdW5kZWYgTUFYX1NCX1NJWkUKKworLy8gTWF4IHN1cGVyYmxvY2sgc2l6ZQorI2RlZmluZSBNQVhfU0JfU0laRV9MT0cyIDcKKyNkZWZpbmUgTUFYX1NCX1NJWkUgKDEgPDwgTUFYX1NCX1NJWkVfTE9HMikKKyNkZWZpbmUgTUFYX1NCX1NRVUFSRSAoTUFYX1NCX1NJWkUgKiBNQVhfU0JfU0laRSkKKworLy8gTWluIHN1cGVyYmxvY2sgc2l6ZQorI2RlZmluZSBNSU5fU0JfU0laRV9MT0cyIDYKKworLy8gUGl4ZWxzIHBlciBNb2RlIEluZm8gKE1JKSB1bml0CisjZGVmaW5lIE1JX1NJWkVfTE9HMiAyCisjZGVmaW5lIE1JX1NJWkUgKDEgPDwgTUlfU0laRV9MT0cyKQorCisvLyBNSS11bml0cyBwZXIgbWF4IHN1cGVyYmxvY2sgKE1JIEJsb2NrIC0gTUlCKQorI2RlZmluZSBNQVhfTUlCX1NJWkVfTE9HMiAoTUFYX1NCX1NJWkVfTE9HMiAtIE1JX1NJWkVfTE9HMikKKyNkZWZpbmUgTUFYX01JQl9TSVpFICgxIDw8IE1BWF9NSUJfU0laRV9MT0cyKQorCisvLyBNSS11bml0cyBwZXIgbWluIHN1cGVyYmxvY2sKKyNkZWZpbmUgTUlOX01JQl9TSVpFX0xPRzIgKE1JTl9TQl9TSVpFX0xPRzIgLSBNSV9TSVpFX0xPRzIpCisKKy8vIE1hc2sgdG8gZXh0cmFjdCBNSSBvZmZzZXQgd2l0aGluIG1heCBNSUIKKyNkZWZpbmUgTUFYX01JQl9NQVNLIChNQVhfTUlCX1NJWkUgLSAxKQorCisvLyBNYXhpbXVtIG51bWJlciBvZiB0aWxlIHJvd3MgYW5kIHRpbGUgY29sdW1ucworI2RlZmluZSBNQVhfVElMRV9ST1dTIDY0CisjZGVmaW5lIE1BWF9USUxFX0NPTFMgNjQKKworI2RlZmluZSBNQVhfVkFSVFhfREVQVEggMgorCisjZGVmaW5lIE1JX1NJWkVfNjRYNjQgKDY0ID4+IE1JX1NJWkVfTE9HMikKKyNkZWZpbmUgTUlfU0laRV8xMjhYMTI4ICgxMjggPj4gTUlfU0laRV9MT0cyKQorCisjZGVmaW5lIE1BWF9QQUxFVFRFX1NRVUFSRSAoNjQgKiA2NCkKKy8vIE1heGltdW0gbnVtYmVyIG9mIGNvbG9ycyBpbiBhIHBhbGV0dGUuCisjZGVmaW5lIFBBTEVUVEVfTUFYX1NJWkUgOAorLy8gTWluaW11bSBudW1iZXIgb2YgY29sb3JzIGluIGEgcGFsZXR0ZS4KKyNkZWZpbmUgUEFMRVRURV9NSU5fU0laRSAyCisKKyNkZWZpbmUgRlJBTUVfT0ZGU0VUX0JJVFMgNQorI2RlZmluZSBNQVhfRlJBTUVfRElTVEFOQ0UgKCgxIDw8IEZSQU1FX09GRlNFVF9CSVRTKSAtIDEpCisKKy8vIDQgZnJhbWUgZmlsdGVyIGxldmVsczogeSBwbGFuZSB2ZXJ0aWNhbCwgeSBwbGFuZSBob3Jpem9udGFsLAorLy8gdSBwbGFuZSwgYW5kIHYgcGxhbmUKKyNkZWZpbmUgRlJBTUVfTEZfQ09VTlQgNAorI2RlZmluZSBERUZBVUxUX0RFTFRBX0xGX01VTFRJIDAKKyNkZWZpbmUgTUFYX01PREVfTEZfREVMVEFTIDIKKworI2RlZmluZSBESVNUX1BSRUNJU0lPTl9CSVRTIDQKKyNkZWZpbmUgRElTVF9QUkVDSVNJT04gKDEgPDwgRElTVF9QUkVDSVNJT05fQklUUykgIC8vIDE2CisKKyNkZWZpbmUgUFJPRklMRV9CSVRTIDMKKy8vIFRoZSBmb2xsb3dpbmcgdGhyZWUgcHJvZmlsZXMgYXJlIGN1cnJlbnRseSBkZWZpbmVkLgorLy8gUHJvZmlsZSAwLiAgOC1iaXQgYW5kIDEwLWJpdCA0OjI6MCBhbmQgNDowOjAgb25seS4KKy8vIFByb2ZpbGUgMS4gIDgtYml0IGFuZCAxMC1iaXQgNDo0OjQKKy8vIFByb2ZpbGUgMi4gIDgtYml0IGFuZCAxMC1iaXQgNDoyOjIKKy8vICAgICAgICAgICAgMTItYml0ICA0OjA6MCwgNDoyOjIgYW5kIDQ6NDo0CisvLyBTaW5jZSB3ZSBoYXZlIHRocmVlIGJpdHMgZm9yIHRoZSBwcm9maWxlcywgaXQgY2FuIGJlIGV4dGVuZGVkIGxhdGVyLgorVFlQRURFRiBlbnVtIHsKKyAgUFJPRklMRV8wLAorICBQUk9GSUxFXzEsCisgIFBST0ZJTEVfMiwKKyAgTUFYX1BST0ZJTEVTLAorfSBTRU5VTTFCWVRFKEJJVFNUUkVBTV9QUk9GSUxFKTsKKworI2RlZmluZSBPUF9QT0lOVFNfQ05UX01JTlVTXzFfQklUUyA1CisjZGVmaW5lIE9QX1BPSU5UU19JRENfQklUUyAxMgorCisvLyBOb3RlOiBTb21lIGVudW1zIHVzZSB0aGUgYXR0cmlidXRlICdwYWNrZWQnIHRvIHVzZSBzbWFsbGVzdCBwb3NzaWJsZSBpbnRlZ2VyCisvLyB0eXBlLCBzbyB0aGF0IHdlIGNhbiBzYXZlIG1lbW9yeSB3aGVuIHRoZXkgYXJlIHVzZWQgaW4gc3RydWN0cy9hcnJheXMuCisKK3R5cGVkZWYgZW51bSBBVFRSSUJVVEVfUEFDS0VEIHsKKyAgQkxPQ0tfNFg0LAorICBCTE9DS180WDgsCisgIEJMT0NLXzhYNCwKKyAgQkxPQ0tfOFg4LAorICBCTE9DS184WDE2LAorICBCTE9DS18xNlg4LAorICBCTE9DS18xNlgxNiwKKyAgQkxPQ0tfMTZYMzIsCisgIEJMT0NLXzMyWDE2LAorICBCTE9DS18zMlgzMiwKKyAgQkxPQ0tfMzJYNjQsCisgIEJMT0NLXzY0WDMyLAorICBCTE9DS182NFg2NCwKKyAgQkxPQ0tfNjRYMTI4LAorICBCTE9DS18xMjhYNjQsCisgIEJMT0NLXzEyOFgxMjgsCisgIEJMT0NLXzRYMTYsCisgIEJMT0NLXzE2WDQsCisgIEJMT0NLXzhYMzIsCisgIEJMT0NLXzMyWDgsCisgIEJMT0NLXzE2WDY0LAorICBCTE9DS182NFgxNiwKKyAgQkxPQ0tfU0laRVNfQUxMLAorICBCTE9DS19TSVpFUyA9IEJMT0NLXzRYMTYsCisgIEJMT0NLX0lOVkFMSUQgPSAyNTUsCisgIEJMT0NLX0xBUkdFU1QgPSAoQkxPQ0tfU0laRVMgLSAxKQorfSBCTE9DS19TSVpFMjsKKworLy8gNFg0LCA4WDgsIDE2WDE2LCAzMlgzMiwgNjRYNjQsIDEyOFgxMjgKKyNkZWZpbmUgU1FSX0JMT0NLX1NJWkVTIDYKKworVFlQRURFRiBlbnVtIHsKKyAgUEFSVElUSU9OX05PTkUsCisgIFBBUlRJVElPTl9IT1JaLAorICBQQVJUSVRJT05fVkVSVCwKKyAgUEFSVElUSU9OX1NQTElULAorICBQQVJUSVRJT05fSE9SWl9BLCAgLy8gSE9SWiBzcGxpdCBhbmQgdGhlIHRvcCBwYXJ0aXRpb24gaXMgc3BsaXQgYWdhaW4KKyAgUEFSVElUSU9OX0hPUlpfQiwgIC8vIEhPUlogc3BsaXQgYW5kIHRoZSBib3R0b20gcGFydGl0aW9uIGlzIHNwbGl0IGFnYWluCisgIFBBUlRJVElPTl9WRVJUX0EsICAvLyBWRVJUIHNwbGl0IGFuZCB0aGUgbGVmdCBwYXJ0aXRpb24gaXMgc3BsaXQgYWdhaW4KKyAgUEFSVElUSU9OX1ZFUlRfQiwgIC8vIFZFUlQgc3BsaXQgYW5kIHRoZSByaWdodCBwYXJ0aXRpb24gaXMgc3BsaXQgYWdhaW4KKyAgUEFSVElUSU9OX0hPUlpfNCwgIC8vIDQ6MSBob3Jpem9udGFsIHBhcnRpdGlvbgorICBQQVJUSVRJT05fVkVSVF80LCAgLy8gNDoxIHZlcnRpY2FsIHBhcnRpdGlvbgorICBFWFRfUEFSVElUSU9OX1RZUEVTLAorICBQQVJUSVRJT05fVFlQRVMgPSBQQVJUSVRJT05fU1BMSVQgKyAxLAorICBQQVJUSVRJT05fSU5WQUxJRCA9IDI1NQorfSBVRU5VTTFCWVRFKFBBUlRJVElPTl9UWVBFKTsKKwordHlwZWRlZiBjaGFyIFBBUlRJVElPTl9DT05URVhUOworI2RlZmluZSBQQVJUSVRJT05fUExPRkZTRVQgNCAgLy8gbnVtYmVyIG9mIHByb2JhYmlsaXR5IG1vZGVscyBwZXIgYmxvY2sgc2l6ZQorI2RlZmluZSBQQVJUSVRJT05fQkxPQ0tfU0laRVMgNQorI2RlZmluZSBQQVJUSVRJT05fQ09OVEVYVFMgKFBBUlRJVElPTl9CTE9DS19TSVpFUyAqIFBBUlRJVElPTl9QTE9GRlNFVCkKKworLy8gYmxvY2sgdHJhbnNmb3JtIHNpemUKK1RZUEVERUYgZW51bSB7CisgIFRYXzRYNCwgICAgICAgICAgICAgLy8gNHg0IHRyYW5zZm9ybQorICBUWF84WDgsICAgICAgICAgICAgIC8vIDh4OCB0cmFuc2Zvcm0KKyAgVFhfMTZYMTYsICAgICAgICAgICAvLyAxNngxNiB0cmFuc2Zvcm0KKyAgVFhfMzJYMzIsICAgICAgICAgICAvLyAzMngzMiB0cmFuc2Zvcm0KKyAgVFhfNjRYNjQsICAgICAgICAgICAvLyA2NHg2NCB0cmFuc2Zvcm0KKyAgVFhfNFg4LCAgICAgICAgICAgICAvLyA0eDggdHJhbnNmb3JtCisgIFRYXzhYNCwgICAgICAgICAgICAgLy8gOHg0IHRyYW5zZm9ybQorICBUWF84WDE2LCAgICAgICAgICAgIC8vIDh4MTYgdHJhbnNmb3JtCisgIFRYXzE2WDgsICAgICAgICAgICAgLy8gMTZ4OCB0cmFuc2Zvcm0KKyAgVFhfMTZYMzIsICAgICAgICAgICAvLyAxNngzMiB0cmFuc2Zvcm0KKyAgVFhfMzJYMTYsICAgICAgICAgICAvLyAzMngxNiB0cmFuc2Zvcm0KKyAgVFhfMzJYNjQsICAgICAgICAgICAvLyAzMng2NCB0cmFuc2Zvcm0KKyAgVFhfNjRYMzIsICAgICAgICAgICAvLyA2NHgzMiB0cmFuc2Zvcm0KKyAgVFhfNFgxNiwgICAgICAgICAgICAvLyA0eDE2IHRyYW5zZm9ybQorICBUWF8xNlg0LCAgICAgICAgICAgIC8vIDE2eDQgdHJhbnNmb3JtCisgIFRYXzhYMzIsICAgICAgICAgICAgLy8gOHgzMiB0cmFuc2Zvcm0KKyAgVFhfMzJYOCwgICAgICAgICAgICAvLyAzMng4IHRyYW5zZm9ybQorICBUWF8xNlg2NCwgICAgICAgICAgIC8vIDE2eDY0IHRyYW5zZm9ybQorICBUWF82NFgxNiwgICAgICAgICAgIC8vIDY0eDE2IHRyYW5zZm9ybQorICBUWF9TSVpFU19BTEwsICAgICAgIC8vIEluY2x1ZGVzIHJlY3Rhbmd1bGFyIHRyYW5zZm9ybXMKKyAgVFhfU0laRVMgPSBUWF80WDgsICAvLyBEb2VzIE5PVCBpbmNsdWRlIHJlY3Rhbmd1bGFyIHRyYW5zZm9ybXMKKyAgVFhfU0laRVNfTEFSR0VTVCA9IFRYXzY0WDY0LAorICBUWF9JTlZBTElEID0gMjU1ICAvLyBJbnZhbGlkIHRyYW5zZm9ybSBzaXplCit9IFVFTlVNMUJZVEUoVFhfU0laRSk7CisKKyNkZWZpbmUgVFhfU0laRV9MVU1BX01JTiAoVFhfNFg0KQorLyogV2UgZG9uJ3QgbmVlZCB0byBjb2RlIGEgdHJhbnNmb3JtIHNpemUgdW5sZXNzIHRoZSBhbGxvd2VkIHNpemUgaXMgYXQgbGVhc3QKKyAgIG9uZSBtb3JlIHRoYW4gdGhlIG1pbmltdW0uICovCisjZGVmaW5lIFRYX1NJWkVfQ1RYX01JTiAoVFhfU0laRV9MVU1BX01JTiArIDEpCisKKy8vIE1heGltdW0gdHhfc2l6ZSBjYXRlZ29yaWVzCisjZGVmaW5lIE1BWF9UWF9DQVRTIChUWF9TSVpFUyAtIFRYX1NJWkVfQ1RYX01JTikKKyNkZWZpbmUgTUFYX1RYX0RFUFRIIDIKKworI2RlZmluZSBNQVhfVFhfU0laRV9MT0cyICg2KQorI2RlZmluZSBNQVhfVFhfU0laRSAoMSA8PCBNQVhfVFhfU0laRV9MT0cyKQorI2RlZmluZSBNSU5fVFhfU0laRV9MT0cyIDIKKyNkZWZpbmUgTUlOX1RYX1NJWkUgKDEgPDwgTUlOX1RYX1NJWkVfTE9HMikKKyNkZWZpbmUgTUFYX1RYX1NRVUFSRSAoTUFYX1RYX1NJWkUgKiBNQVhfVFhfU0laRSkKKworLy8gUGFkIDQgZXh0cmEgY29sdW1ucyB0byByZW1vdmUgaG9yaXpvbnRhbCBhdmFpbGFiaWxpdHkgY2hlY2suCisjZGVmaW5lIFRYX1BBRF9IT1JfTE9HMiAyCisjZGVmaW5lIFRYX1BBRF9IT1IgNAorLy8gUGFkIDYgZXh0cmEgcm93cyAoMiBvbiB0b3AgYW5kIDQgb24gYm90dG9tKSB0byByZW1vdmUgdmVydGljYWwgYXZhaWxhYmlsaXR5CisvLyBjaGVjay4KKyNkZWZpbmUgVFhfUEFEX1RPUCAwCisjZGVmaW5lIFRYX1BBRF9CT1RUT00gNAorI2RlZmluZSBUWF9QQURfVkVSIChUWF9QQURfVE9QICsgVFhfUEFEX0JPVFRPTSkKKy8vIFBhZCAxNiBleHRyYSBieXRlcyB0byBhdm9pZCByZWFkaW5nIG92ZXJmbG93IGluIFNJTUQgb3B0aW1pemF0aW9uLgorI2RlZmluZSBUWF9QQURfRU5EIDE2CisjZGVmaW5lIFRYX1BBRF8yRCAoKDMyICsgVFhfUEFEX0hPUikgKiAoMzIgKyBUWF9QQURfVkVSKSArIFRYX1BBRF9FTkQpCisKKy8vIE51bWJlciBvZiBtYXhpdW0gc2l6ZSB0cmFuc2Zvcm0gYmxvY2tzIGluIHRoZSBtYXhpbXVtIHNpemUgc3VwZXJibG9jaworI2RlZmluZSBNQVhfVFhfQkxPQ0tTX0lOX01BWF9TQl9MT0cyICgoTUFYX1NCX1NJWkVfTE9HMiAtIE1BWF9UWF9TSVpFX0xPRzIpICogMikKKyNkZWZpbmUgTUFYX1RYX0JMT0NLU19JTl9NQVhfU0IgKDEgPDwgTUFYX1RYX0JMT0NLU19JTl9NQVhfU0JfTE9HMikKKworLy8gZnJhbWUgdHJhbnNmb3JtIG1vZGUKK1RZUEVERUYgZW51bSB7CisgIE9OTFlfNFg0LCAgICAgICAgIC8vIHVzZSBvbmx5IDR4NCB0cmFuc2Zvcm0KKyAgVFhfTU9ERV9MQVJHRVNULCAgLy8gdHJhbnNmb3JtIHNpemUgaXMgdGhlIGxhcmdlc3QgcG9zc2libGUgZm9yIHB1IHNpemUKKyAgVFhfTU9ERV9TRUxFQ1QsICAgLy8gdHJhbnNmb3JtIHNwZWNpZmllZCBmb3IgZWFjaCBibG9jaworICBUWF9NT0RFUywKK30gVUVOVU0xQllURShUWF9NT0RFKTsKKworLy8gMUQgdHggdHlwZXMKK1RZUEVERUYgZW51bSB7CisgIERDVF8xRCwKKyAgQURTVF8xRCwKKyAgRkxJUEFEU1RfMUQsCisgIElEVFhfMUQsCisgIFRYX1RZUEVTXzFELAorfSBVRU5VTTFCWVRFKFRYX1RZUEVfMUQpOworCitUWVBFREVGIGVudW0geworICBEQ1RfRENULCAgICAgICAgICAgIC8vIERDVCBpbiBib3RoIGhvcml6b250YWwgYW5kIHZlcnRpY2FsCisgIEFEU1RfRENULCAgICAgICAgICAgLy8gQURTVCBpbiB2ZXJ0aWNhbCwgRENUIGluIGhvcml6b250YWwKKyAgRENUX0FEU1QsICAgICAgICAgICAvLyBEQ1QgaW4gdmVydGljYWwsIEFEU1QgaW4gaG9yaXpvbnRhbAorICBBRFNUX0FEU1QsICAgICAgICAgIC8vIEFEU1QgaW4gYm90aCBkaXJlY3Rpb25zCisgIEZMSVBBRFNUX0RDVCwgICAgICAgLy8gRkxJUEFEU1QgaW4gdmVydGljYWwsIERDVCBpbiBob3Jpem9udGFsCisgIERDVF9GTElQQURTVCwgICAgICAgLy8gRENUIGluIHZlcnRpY2FsLCBGTElQQURTVCBpbiBob3Jpem9udGFsCisgIEZMSVBBRFNUX0ZMSVBBRFNULCAgLy8gRkxJUEFEU1QgaW4gYm90aCBkaXJlY3Rpb25zCisgIEFEU1RfRkxJUEFEU1QsICAgICAgLy8gQURTVCBpbiB2ZXJ0aWNhbCwgRkxJUEFEU1QgaW4gaG9yaXpvbnRhbAorICBGTElQQURTVF9BRFNULCAgICAgIC8vIEZMSVBBRFNUIGluIHZlcnRpY2FsLCBBRFNUIGluIGhvcml6b250YWwKKyAgSURUWCwgICAgICAgICAgICAgICAvLyBJZGVudGl0eSBpbiBib3RoIGRpcmVjdGlvbnMKKyAgVl9EQ1QsICAgICAgICAgICAgICAvLyBEQ1QgaW4gdmVydGljYWwsIGlkZW50aXR5IGluIGhvcml6b250YWwKKyAgSF9EQ1QsICAgICAgICAgICAgICAvLyBJZGVudGl0eSBpbiB2ZXJ0aWNhbCwgRENUIGluIGhvcml6b250YWwKKyAgVl9BRFNULCAgICAgICAgICAgICAvLyBBRFNUIGluIHZlcnRpY2FsLCBpZGVudGl0eSBpbiBob3Jpem9udGFsCisgIEhfQURTVCwgICAgICAgICAgICAgLy8gSWRlbnRpdHkgaW4gdmVydGljYWwsIEFEU1QgaW4gaG9yaXpvbnRhbAorICBWX0ZMSVBBRFNULCAgICAgICAgIC8vIEZMSVBBRFNUIGluIHZlcnRpY2FsLCBpZGVudGl0eSBpbiBob3Jpem9udGFsCisgIEhfRkxJUEFEU1QsICAgICAgICAgLy8gSWRlbnRpdHkgaW4gdmVydGljYWwsIEZMSVBBRFNUIGluIGhvcml6b250YWwKKyAgVFhfVFlQRVMsCit9IFVFTlVNMUJZVEUoVFhfVFlQRSk7CisKK1RZUEVERUYgZW51bSB7CisgIFJFR19SRUcsCisgIFJFR19TTU9PVEgsCisgIFJFR19TSEFSUCwKKyAgU01PT1RIX1JFRywKKyAgU01PT1RIX1NNT09USCwKKyAgU01PT1RIX1NIQVJQLAorICBTSEFSUF9SRUcsCisgIFNIQVJQX1NNT09USCwKKyAgU0hBUlBfU0hBUlAsCit9IFVFTlVNMUJZVEUoRFVBTF9GSUxURVJfVFlQRSk7CisKK1RZUEVERUYgZW51bSB7CisgIC8vIERDVCBvbmx5CisgIEVYVF9UWF9TRVRfRENUT05MWSwKKyAgLy8gRENUICsgSWRlbnRpdHkgb25seQorICBFWFRfVFhfU0VUX0RDVF9JRFRYLAorICAvLyBEaXNjcmV0ZSBUcmlnIHRyYW5zZm9ybXMgdy9vIGZsaXAgKDQpICsgSWRlbnRpdHkgKDEpCisgIEVYVF9UWF9TRVRfRFRUNF9JRFRYLAorICAvLyBEaXNjcmV0ZSBUcmlnIHRyYW5zZm9ybXMgdy9vIGZsaXAgKDQpICsgSWRlbnRpdHkgKDEpICsgMUQgSG9yL3ZlcnQgRENUICgyKQorICBFWFRfVFhfU0VUX0RUVDRfSURUWF8xRERDVCwKKyAgLy8gRGlzY3JldGUgVHJpZyB0cmFuc2Zvcm1zIHcvIGZsaXAgKDkpICsgSWRlbnRpdHkgKDEpICsgMUQgSG9yL1ZlciBEQ1QgKDIpCisgIEVYVF9UWF9TRVRfRFRUOV9JRFRYXzFERENULAorICAvLyBEaXNjcmV0ZSBUcmlnIHRyYW5zZm9ybXMgdy8gZmxpcCAoOSkgKyBJZGVudGl0eSAoMSkgKyAxRCBIb3IvVmVyICg2KQorICBFWFRfVFhfU0VUX0FMTDE2LAorICBFWFRfVFhfU0VUX1RZUEVTCit9IFVFTlVNMUJZVEUoVHhTZXRUeXBlKTsKKworI2RlZmluZSBJU18yRF9UUkFOU0ZPUk0odHhfdHlwZSkgKHR4X3R5cGUgPCBJRFRYKQorCisjZGVmaW5lIEVYVF9UWF9TSVpFUyA0ICAgICAgIC8vIG51bWJlciBvZiBzaXplcyB0aGF0IHVzZSBleHRlbmRlZCB0cmFuc2Zvcm1zCisjZGVmaW5lIEVYVF9UWF9TRVRTX0lOVEVSIDQgIC8vIFNldHMgb2YgdHJhbnNmb3JtIHNlbGVjdGlvbnMgZm9yIElOVEVSCisjZGVmaW5lIEVYVF9UWF9TRVRTX0lOVFJBIDMgIC8vIFNldHMgb2YgdHJhbnNmb3JtIHNlbGVjdGlvbnMgZm9yIElOVFJBCisKK1RZUEVERUYgZW51bSB7CisgIEFPTV9MQVNUX0ZMQUcgPSAxIDw8IDAsCisgIEFPTV9MQVNUMl9GTEFHID0gMSA8PCAxLAorICBBT01fTEFTVDNfRkxBRyA9IDEgPDwgMiwKKyAgQU9NX0dPTERfRkxBRyA9IDEgPDwgMywKKyAgQU9NX0JXRF9GTEFHID0gMSA8PCA0LAorICBBT01fQUxUMl9GTEFHID0gMSA8PCA1LAorICBBT01fQUxUX0ZMQUcgPSAxIDw8IDYsCisgIEFPTV9SRUZGUkFNRV9BTEwgPSAoMSA8PCA3KSAtIDEKK30gVUVOVU0xQllURShBT01fUkVGRlJBTUUpOworCitUWVBFREVGIGVudW0geworICBVTklESVJfQ09NUF9SRUZFUkVOQ0UsCisgIEJJRElSX0NPTVBfUkVGRVJFTkNFLAorICBDT01QX1JFRkVSRU5DRV9UWVBFUywKK30gVUVOVU0xQllURShDT01QX1JFRkVSRU5DRV9UWVBFKTsKKworLyplbnVtIHsgUExBTkVfVFlQRV9ZLCBQTEFORV9UWVBFX1VWLCBQTEFORV9UWVBFUyB9IFVFTlVNMUJZVEUoUExBTkVfVFlQRSk7Ki8KKworI2RlZmluZSBDRkxfQUxQSEFCRVRfU0laRV9MT0cyIDQKKyNkZWZpbmUgQ0ZMX0FMUEhBQkVUX1NJWkUgKDEgPDwgQ0ZMX0FMUEhBQkVUX1NJWkVfTE9HMikKKyNkZWZpbmUgQ0ZMX01BR1NfU0laRSAoKDIgPDwgQ0ZMX0FMUEhBQkVUX1NJWkVfTE9HMikgKyAxKQorI2RlZmluZSBDRkxfSURYX1UoaWR4KSAoaWR4ID4+IENGTF9BTFBIQUJFVF9TSVpFX0xPRzIpCisjZGVmaW5lIENGTF9JRFhfVihpZHgpIChpZHggJiAoQ0ZMX0FMUEhBQkVUX1NJWkUgLSAxKSkKKworLyplbnVtIHsgQ0ZMX1BSRURfVSwgQ0ZMX1BSRURfViwgQ0ZMX1BSRURfUExBTkVTIH0gVUVOVU0xQllURShDRkxfUFJFRF9UWVBFKTsqLworCitUWVBFREVGIGVudW0geworICBDRkxfU0lHTl9aRVJPLAorICBDRkxfU0lHTl9ORUcsCisgIENGTF9TSUdOX1BPUywKKyAgQ0ZMX1NJR05TCit9IFVFTlVNMUJZVEUoQ0ZMX1NJR05fVFlQRSk7CisKK1RZUEVERUYgZW51bSB7CisgIENGTF9ESVNBTExPV0VELAorICBDRkxfQUxMT1dFRCwKKyAgQ0ZMX0FMTE9XRURfVFlQRVMKK30gVUVOVU0xQllURShDRkxfQUxMT1dFRF9UWVBFKTsKKworLy8gQ0ZMX1NJR05fWkVSTyxDRkxfU0lHTl9aRVJPIGlzIGludmFsaWQKKyNkZWZpbmUgQ0ZMX0pPSU5UX1NJR05TIChDRkxfU0lHTlMgKiBDRkxfU0lHTlMgLSAxKQorLy8gQ0ZMX1NJR05fVSBpcyBlcXVpdmFsZW50IHRvIChqcyArIDEpIC8gMyBmb3IganMgaW4gMCB0byA4CisjZGVmaW5lIENGTF9TSUdOX1UoanMpICgoKGpzICsgMSkgKiAxMSkgPj4gNSkKKy8vIENGTF9TSUdOX1YgaXMgZXF1aXZhbGVudCB0byAoanMgKyAxKSAlIDMgZm9yIGpzIGluIDAgdG8gOAorI2RlZmluZSBDRkxfU0lHTl9WKGpzKSAoKGpzICsgMSkgLSBDRkxfU0lHTlMgKiBDRkxfU0lHTl9VKGpzKSkKKworLy8gVGhlcmUgaXMgbm8gY29udGV4dCB3aGVuIHRoZSBhbHBoYSBmb3IgYSBnaXZlbiBwbGFuZSBpcyB6ZXJvLgorLy8gU28gdGhlcmUgYXJlIDIgZmV3ZXIgY29udGV4dHMgdGhhbiBqb2ludCBzaWducy4KKyNkZWZpbmUgQ0ZMX0FMUEhBX0NPTlRFWFRTIChDRkxfSk9JTlRfU0lHTlMgKyAxIC0gQ0ZMX1NJR05TKQorI2RlZmluZSBDRkxfQ09OVEVYVF9VKGpzKSAoanMgKyAxIC0gQ0ZMX1NJR05TKQorLy8gQWxzbywgdGhlIGNvbnRleHRzIGFyZSBzeW1tZXRyaWMgdW5kZXIgc3dhcHBpbmcgdGhlIHBsYW5lcy4KKyNkZWZpbmUgQ0ZMX0NPTlRFWFRfVihqcykgXAorICAoQ0ZMX1NJR05fVihqcykgKiBDRkxfU0lHTlMgKyBDRkxfU0lHTl9VKGpzKSAtIENGTF9TSUdOUykKKworVFlQRURFRiBlbnVtIHsKKyAgUEFMRVRURV9NQVAsCisgIENPTE9SX01BUF9UWVBFUywKK30gVUVOVU0xQllURShDT0xPUl9NQVBfVFlQRSk7CisKK1RZUEVERUYgZW51bSB7CisgIFRXT19DT0xPUlMsCisgIFRIUkVFX0NPTE9SUywKKyAgRk9VUl9DT0xPUlMsCisgIEZJVkVfQ09MT1JTLAorICBTSVhfQ09MT1JTLAorICBTRVZFTl9DT0xPUlMsCisgIEVJR0hUX0NPTE9SUywKKyAgUEFMRVRURV9TSVpFUworfSBVRU5VTTFCWVRFKFBBTEVUVEVfU0laRSk7CisKK1RZUEVERUYgZW51bSB7CisgIFBBTEVUVEVfQ09MT1JfT05FLAorICBQQUxFVFRFX0NPTE9SX1RXTywKKyAgUEFMRVRURV9DT0xPUl9USFJFRSwKKyAgUEFMRVRURV9DT0xPUl9GT1VSLAorICBQQUxFVFRFX0NPTE9SX0ZJVkUsCisgIFBBTEVUVEVfQ09MT1JfU0lYLAorICBQQUxFVFRFX0NPTE9SX1NFVkVOLAorICBQQUxFVFRFX0NPTE9SX0VJR0hULAorICBQQUxFVFRFX0NPTE9SUworfSBVRU5VTTFCWVRFKFBBTEVUVEVfQ09MT1IpOworCisvLyBOb3RlOiBBbGwgZGlyZWN0aW9uYWwgcHJlZGljdG9ycyBtdXN0IGJlIGJldHdlZW4gVl9QUkVEIGFuZCBENjdfUFJFRCAoYm90aAorLy8gaW5jbHVzaXZlKS4KK1RZUEVERUYgZW51bSB7CisgIERDX1BSRUQsICAgICAgICAvLyBBdmVyYWdlIG9mIGFib3ZlIGFuZCBsZWZ0IHBpeGVscworICBWX1BSRUQsICAgICAgICAgLy8gVmVydGljYWwKKyAgSF9QUkVELCAgICAgICAgIC8vIEhvcml6b250YWwKKyAgRDQ1X1BSRUQsICAgICAgIC8vIERpcmVjdGlvbmFsIDQ1ICBkZWdyZWUKKyAgRDEzNV9QUkVELCAgICAgIC8vIERpcmVjdGlvbmFsIDEzNSBkZWdyZWUKKyAgRDExM19QUkVELCAgICAgIC8vIERpcmVjdGlvbmFsIDExMyBkZWdyZWUKKyAgRDE1N19QUkVELCAgICAgIC8vIERpcmVjdGlvbmFsIDE1NyBkZWdyZWUKKyAgRDIwM19QUkVELCAgICAgIC8vIERpcmVjdGlvbmFsIDIwMyBkZWdyZWUKKyAgRDY3X1BSRUQsICAgICAgIC8vIERpcmVjdGlvbmFsIDY3ICBkZWdyZWUKKyAgU01PT1RIX1BSRUQsICAgIC8vIENvbWJpbmF0aW9uIG9mIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGludGVycG9sYXRpb24KKyAgU01PT1RIX1ZfUFJFRCwgIC8vIFZlcnRpY2FsIGludGVycG9sYXRpb24KKyAgU01PT1RIX0hfUFJFRCwgIC8vIEhvcml6b250YWwgaW50ZXJwb2xhdGlvbgorICBQQUVUSF9QUkVELCAgICAgLy8gUHJlZGljdCBmcm9tIHRoZSBkaXJlY3Rpb24gb2Ygc21hbGxlc3QgZ3JhZGllbnQKKyAgTkVBUkVTVE1WLAorICBORUFSTVYsCisgIEdMT0JBTE1WLAorICBORVdNViwKKyAgLy8gQ29tcG91bmQgcmVmIGNvbXBvdW5kIG1vZGVzCisgIE5FQVJFU1RfTkVBUkVTVE1WLAorICBORUFSX05FQVJNViwKKyAgTkVBUkVTVF9ORVdNViwKKyAgTkVXX05FQVJFU1RNViwKKyAgTkVBUl9ORVdNViwKKyAgTkVXX05FQVJNViwKKyAgR0xPQkFMX0dMT0JBTE1WLAorICBORVdfTkVXTVYsCisgIE1CX01PREVfQ09VTlQsCisgIElOVFJBX01PREVfU1RBUlQgPSBEQ19QUkVELAorICBJTlRSQV9NT0RFX0VORCA9IE5FQVJFU1RNViwKKyAgSU5UUkFfTU9ERV9OVU0gPSBJTlRSQV9NT0RFX0VORCAtIElOVFJBX01PREVfU1RBUlQsCisgIFNJTkdMRV9JTlRFUl9NT0RFX1NUQVJUID0gTkVBUkVTVE1WLAorICBTSU5HTEVfSU5URVJfTU9ERV9FTkQgPSBORUFSRVNUX05FQVJFU1RNViwKKyAgU0lOR0xFX0lOVEVSX01PREVfTlVNID0gU0lOR0xFX0lOVEVSX01PREVfRU5EIC0gU0lOR0xFX0lOVEVSX01PREVfU1RBUlQsCisgIENPTVBfSU5URVJfTU9ERV9TVEFSVCA9IE5FQVJFU1RfTkVBUkVTVE1WLAorICBDT01QX0lOVEVSX01PREVfRU5EID0gTUJfTU9ERV9DT1VOVCwKKyAgQ09NUF9JTlRFUl9NT0RFX05VTSA9IENPTVBfSU5URVJfTU9ERV9FTkQgLSBDT01QX0lOVEVSX01PREVfU1RBUlQsCisgIElOVEVSX01PREVfU1RBUlQgPSBORUFSRVNUTVYsCisgIElOVEVSX01PREVfRU5EID0gTUJfTU9ERV9DT1VOVCwKKyAgSU5UUkFfTU9ERVMgPSBQQUVUSF9QUkVEICsgMSwgIC8vIFBBRVRIX1BSRUQgaGFzIHRvIGJlIHRoZSBsYXN0IGludHJhIG1vZGUuCisgIElOVFJBX0lOVkFMSUQgPSBNQl9NT0RFX0NPVU5UICAvLyBGb3IgdXZfbW9kZSBpbiBpbnRlciBibG9ja3MKK30gVUVOVU0xQllURShQUkVESUNUSU9OX01PREUpOworCisvLyBUT0RPKGx0cnVkZWF1KSBEbyB3ZSByZWFsbHkgd2FudCB0byBwYWNrIHRoaXM/CisvLyBUT0RPKGx0cnVkZWF1KSBEbyB3ZSBtYXRjaCB3aXRoIFBSRURJQ1RJT05fTU9ERT8KK1RZUEVERUYgZW51bSB7CisgIFVWX0RDX1BSRUQsICAgICAgICAvLyBBdmVyYWdlIG9mIGFib3ZlIGFuZCBsZWZ0IHBpeGVscworICBVVl9WX1BSRUQsICAgICAgICAgLy8gVmVydGljYWwKKyAgVVZfSF9QUkVELCAgICAgICAgIC8vIEhvcml6b250YWwKKyAgVVZfRDQ1X1BSRUQsICAgICAgIC8vIERpcmVjdGlvbmFsIDQ1ICBkZWdyZWUKKyAgVVZfRDEzNV9QUkVELCAgICAgIC8vIERpcmVjdGlvbmFsIDEzNSBkZWdyZWUKKyAgVVZfRDExM19QUkVELCAgICAgIC8vIERpcmVjdGlvbmFsIDExMyBkZWdyZWUKKyAgVVZfRDE1N19QUkVELCAgICAgIC8vIERpcmVjdGlvbmFsIDE1NyBkZWdyZWUKKyAgVVZfRDIwM19QUkVELCAgICAgIC8vIERpcmVjdGlvbmFsIDIwMyBkZWdyZWUKKyAgVVZfRDY3X1BSRUQsICAgICAgIC8vIERpcmVjdGlvbmFsIDY3ICBkZWdyZWUKKyAgVVZfU01PT1RIX1BSRUQsICAgIC8vIENvbWJpbmF0aW9uIG9mIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGludGVycG9sYXRpb24KKyAgVVZfU01PT1RIX1ZfUFJFRCwgIC8vIFZlcnRpY2FsIGludGVycG9sYXRpb24KKyAgVVZfU01PT1RIX0hfUFJFRCwgIC8vIEhvcml6b250YWwgaW50ZXJwb2xhdGlvbgorICBVVl9QQUVUSF9QUkVELCAgICAgLy8gUHJlZGljdCBmcm9tIHRoZSBkaXJlY3Rpb24gb2Ygc21hbGxlc3QgZ3JhZGllbnQKKyAgVVZfQ0ZMX1BSRUQsICAgICAgIC8vIENocm9tYS1mcm9tLUx1bWEKKyAgVVZfSU5UUkFfTU9ERVMsCisgIFVWX01PREVfSU5WQUxJRCwgIC8vIEZvciB1dl9tb2RlIGluIGludGVyIGJsb2NrcworfSBVRU5VTTFCWVRFKFVWX1BSRURJQ1RJT05fTU9ERSk7CisKK1RZUEVERUYgZW51bSB7CisgIFNJTVBMRV9UUkFOU0xBVElPTiwKKyAgT0JNQ19DQVVTQUwsICAgIC8vIDItc2lkZWQgT0JNQworICBXQVJQRURfQ0FVU0FMLCAgLy8gMi1zaWRlZCBXQVJQRUQKKyAgTU9USU9OX01PREVTCit9IFVFTlVNMUJZVEUoTU9USU9OX01PREUpOworCitUWVBFREVGIGVudW0geworICBJSV9EQ19QUkVELAorICBJSV9WX1BSRUQsCisgIElJX0hfUFJFRCwKKyAgSUlfU01PT1RIX1BSRUQsCisgIElOVEVSSU5UUkFfTU9ERVMKK30gVUVOVU0xQllURShJTlRFUklOVFJBX01PREUpOworCitUWVBFREVGIGVudW0geworICBDT01QT1VORF9BVkVSQUdFLAorICBDT01QT1VORF9ESVNUV1RELAorICBDT01QT1VORF9XRURHRSwKKyAgQ09NUE9VTkRfRElGRldURCwKKyAgQ09NUE9VTkRfVFlQRVMsCisgIE1BU0tFRF9DT01QT1VORF9UWVBFUyA9IDIsCit9IFVFTlVNMUJZVEUoQ09NUE9VTkRfVFlQRSk7CisKK1RZUEVERUYgZW51bSB7CisgIEZJTFRFUl9EQ19QUkVELAorICBGSUxURVJfVl9QUkVELAorICBGSUxURVJfSF9QUkVELAorICBGSUxURVJfRDE1N19QUkVELAorICBGSUxURVJfUEFFVEhfUFJFRCwKKyAgRklMVEVSX0lOVFJBX01PREVTLAorfSBVRU5VTTFCWVRFKEZJTFRFUl9JTlRSQV9NT0RFKTsKKworVFlQRURFRiBlbnVtIHsKKyAgU0VRX0xFVkVMXzJfMCwKKyAgU0VRX0xFVkVMXzJfMSwKKyAgU0VRX0xFVkVMXzJfMiwKKyAgU0VRX0xFVkVMXzJfMywKKyAgU0VRX0xFVkVMXzNfMCwKKyAgU0VRX0xFVkVMXzNfMSwKKyAgU0VRX0xFVkVMXzNfMiwKKyAgU0VRX0xFVkVMXzNfMywKKyAgU0VRX0xFVkVMXzRfMCwKKyAgU0VRX0xFVkVMXzRfMSwKKyAgU0VRX0xFVkVMXzRfMiwKKyAgU0VRX0xFVkVMXzRfMywKKyAgU0VRX0xFVkVMXzVfMCwKKyAgU0VRX0xFVkVMXzVfMSwKKyAgU0VRX0xFVkVMXzVfMiwKKyAgU0VRX0xFVkVMXzVfMywKKyAgU0VRX0xFVkVMXzZfMCwKKyAgU0VRX0xFVkVMXzZfMSwKKyAgU0VRX0xFVkVMXzZfMiwKKyAgU0VRX0xFVkVMXzZfMywKKyAgU0VRX0xFVkVMXzdfMCwKKyAgU0VRX0xFVkVMXzdfMSwKKyAgU0VRX0xFVkVMXzdfMiwKKyAgU0VRX0xFVkVMXzdfMywKKyAgU0VRX0xFVkVMUywKKyAgU0VRX0xFVkVMX01BWCA9IDMxCit9IFVFTlVNMUJZVEUoQVYxX0xFVkVMKTsKKworI2RlZmluZSBMRVZFTF9CSVRTIDUKKworI2RlZmluZSBESVJFQ1RJT05BTF9NT0RFUyA4CisjZGVmaW5lIE1BWF9BTkdMRV9ERUxUQSAzCisjZGVmaW5lIEFOR0xFX1NURVAgMworCisjZGVmaW5lIElOVEVSX01PREVTICgxICsgTkVXTVYgLSBORUFSRVNUTVYpCisKKyNkZWZpbmUgSU5URVJfQ09NUE9VTkRfTU9ERVMgKDEgKyBORVdfTkVXTVYgLSBORUFSRVNUX05FQVJFU1RNVikKKworI2RlZmluZSBTS0lQX0NPTlRFWFRTIDMKKyNkZWZpbmUgU0tJUF9NT0RFX0NPTlRFWFRTIDMKKworI2RlZmluZSBDT01QX0lOREVYX0NPTlRFWFRTIDYKKyNkZWZpbmUgQ09NUF9HUk9VUF9JRFhfQ09OVEVYVFMgNgorCisjZGVmaW5lIE5NVl9DT05URVhUUyAzCisKKyNkZWZpbmUgTkVXTVZfTU9ERV9DT05URVhUUyA2CisjZGVmaW5lIEdMT0JBTE1WX01PREVfQ09OVEVYVFMgMgorI2RlZmluZSBSRUZNVl9NT0RFX0NPTlRFWFRTIDYKKyNkZWZpbmUgRFJMX01PREVfQ09OVEVYVFMgMworCisjZGVmaW5lIEdMT0JBTE1WX09GRlNFVCAzCisjZGVmaW5lIFJFRk1WX09GRlNFVCA0CisKKyNkZWZpbmUgTkVXTVZfQ1RYX01BU0sgKCgxIDw8IEdMT0JBTE1WX09GRlNFVCkgLSAxKQorI2RlZmluZSBHTE9CQUxNVl9DVFhfTUFTSyAoKDEgPDwgKFJFRk1WX09GRlNFVCAtIEdMT0JBTE1WX09GRlNFVCkpIC0gMSkKKyNkZWZpbmUgUkVGTVZfQ1RYX01BU0sgKCgxIDw8ICg4IC0gUkVGTVZfT0ZGU0VUKSkgLSAxKQorCisjZGVmaW5lIENPTVBfTkVXTVZfQ1RYUyA1CisjZGVmaW5lIElOVEVSX01PREVfQ09OVEVYVFMgOAorCisjZGVmaW5lIERFTFRBX1FfU01BTEwgMworI2RlZmluZSBERUxUQV9RX1BST0JTIChERUxUQV9RX1NNQUxMKQorI2RlZmluZSBERUZBVUxUX0RFTFRBX1FfUkVTX1BFUkNFUFRVQUwgNAorI2RlZmluZSBERUZBVUxUX0RFTFRBX1FfUkVTX09CSkVDVElWRSA0CisKKyNkZWZpbmUgREVMVEFfTEZfU01BTEwgMworI2RlZmluZSBERUxUQV9MRl9QUk9CUyAoREVMVEFfTEZfU01BTEwpCisjZGVmaW5lIERFRkFVTFRfREVMVEFfTEZfUkVTIDIKKworLyogU2VnbWVudCBGZWF0dXJlIE1hc2tzICovCisjZGVmaW5lIE1BWF9NVl9SRUZfQ0FORElEQVRFUyAyCisKKyNkZWZpbmUgTUFYX1JFRl9NVl9TVEFDS19TSVpFIDgKKyNkZWZpbmUgUkVGX0NBVF9MRVZFTCA2NDAKKworI2RlZmluZSBJTlRSQV9JTlRFUl9DT05URVhUUyA0CisjZGVmaW5lIENPTVBfSU5URVJfQ09OVEVYVFMgNQorI2RlZmluZSBSRUZfQ09OVEVYVFMgMworCisjZGVmaW5lIENPTVBfUkVGX1RZUEVfQ09OVEVYVFMgNQorI2RlZmluZSBVTklfQ09NUF9SRUZfQ09OVEVYVFMgMworCisjZGVmaW5lIFRYRk1fUEFSVElUSU9OX0NPTlRFWFRTICgoVFhfU0laRVMgLSBUWF84WDgpICogNiAtIDMpCisjaWZkZWYgT1JJX0NPREUKK3R5cGVkZWYgdWludDhfdCBUWEZNX0NPTlRFWFQ7CisjZW5kaWYKKy8vIEFuIGVudW0gZm9yIHNpbmdsZSByZWZlcmVuY2UgdHlwZXMgKGFuZCBzb21lIGRlcml2ZWQgdmFsdWVzKS4KK2VudW0geworICBOT05FX0ZSQU1FID0gLTEsCisgIElOVFJBX0ZSQU1FLAorICBMQVNUX0ZSQU1FLAorICBMQVNUMl9GUkFNRSwKKyAgTEFTVDNfRlJBTUUsCisgIEdPTERFTl9GUkFNRSwKKyAgQldEUkVGX0ZSQU1FLAorICBBTFRSRUYyX0ZSQU1FLAorICBBTFRSRUZfRlJBTUUsCisgIFJFRl9GUkFNRVMsCisKKyAgLy8gRXh0cmEvc2NyYXRjaCByZWZlcmVuY2UgZnJhbWUuIEl0IG1heSBiZToKKyAgLy8gLSB1c2VkIHRvIHVwZGF0ZSB0aGUgQUxUUkVGMl9GUkFNRSByZWYgKHNlZSBsc2hpZnRfYndkX3JlZl9mcmFtZXMoKSksIG9yCisgIC8vIC0gdXBkYXRlZCBmcm9tIEFMVFJFRjJfRlJBTUUgcmVmIChzZWUgcnNoaWZ0X2J3ZF9yZWZfZnJhbWVzKCkpLgorICBFWFRSRUZfRlJBTUUgPSBSRUZfRlJBTUVTLAorCisgIC8vIE51bWJlciBvZiBpbnRlciAobm9uLWludHJhKSByZWZlcmVuY2UgdHlwZXMuCisgIElOVEVSX1JFRlNfUEVSX0ZSQU1FID0gQUxUUkVGX0ZSQU1FIC0gTEFTVF9GUkFNRSArIDEsCisKKyAgLy8gTnVtYmVyIG9mIGZvcndhcmQgKGFrYSBwYXN0KSByZWZlcmVuY2UgdHlwZXMuCisgIEZXRF9SRUZTID0gR09MREVOX0ZSQU1FIC0gTEFTVF9GUkFNRSArIDEsCisKKyAgLy8gTnVtYmVyIG9mIGJhY2t3YXJkIChha2EgZnV0dXJlKSByZWZlcmVuY2UgdHlwZXMuCisgIEJXRF9SRUZTID0gQUxUUkVGX0ZSQU1FIC0gQldEUkVGX0ZSQU1FICsgMSwKKworICBTSU5HTEVfUkVGUyA9IEZXRF9SRUZTICsgQldEX1JFRlMsCit9OworCisjZGVmaW5lIFJFRl9GUkFNRVNfTE9HMiAzCisKKy8vIFJFRl9GUkFNRVMgZm9yIHRoZSBjbS0+cmVmX2ZyYW1lX21hcCBhcnJheSwgMSBzY3JhdGNoIGZyYW1lIGZvciB0aGUgbmV3CisvLyBmcmFtZSBpbiBjbS0+Y3VyX2ZyYW1lLCBJTlRFUl9SRUZTX1BFUl9GUkFNRSBmb3Igc2NhbGVkIHJlZmVyZW5jZXMgb24gdGhlCisvLyBlbmNvZGVyIGluIHRoZSBjcGktPnNjYWxlZF9yZWZfYnVmIGFycmF5LgorI2RlZmluZSBGUkFNRV9CVUZGRVJTIChSRUZfRlJBTUVTICsgMSArIElOVEVSX1JFRlNfUEVSX0ZSQU1FKQorCisjZGVmaW5lIEZXRF9SRl9PRkZTRVQocmVmKSAocmVmIC0gTEFTVF9GUkFNRSkKKyNkZWZpbmUgQldEX1JGX09GRlNFVChyZWYpIChyZWYgLSBCV0RSRUZfRlJBTUUpCisKK1RZUEVERUYgZW51bSB7CisgIExBU1RfTEFTVDJfRlJBTUVTLCAgICAgIC8vIHsgTEFTVF9GUkFNRSwgTEFTVDJfRlJBTUUgfQorICBMQVNUX0xBU1QzX0ZSQU1FUywgICAgICAvLyB7IExBU1RfRlJBTUUsIExBU1QzX0ZSQU1FIH0KKyAgTEFTVF9HT0xERU5fRlJBTUVTLCAgICAgLy8geyBMQVNUX0ZSQU1FLCBHT0xERU5fRlJBTUUgfQorICBCV0RSRUZfQUxUUkVGX0ZSQU1FUywgICAvLyB7IEJXRFJFRl9GUkFNRSwgQUxUUkVGX0ZSQU1FIH0KKyAgTEFTVDJfTEFTVDNfRlJBTUVTLCAgICAgLy8geyBMQVNUMl9GUkFNRSwgTEFTVDNfRlJBTUUgfQorICBMQVNUMl9HT0xERU5fRlJBTUVTLCAgICAvLyB7IExBU1QyX0ZSQU1FLCBHT0xERU5fRlJBTUUgfQorICBMQVNUM19HT0xERU5fRlJBTUVTLCAgICAvLyB7IExBU1QzX0ZSQU1FLCBHT0xERU5fRlJBTUUgfQorICBCV0RSRUZfQUxUUkVGMl9GUkFNRVMsICAvLyB7IEJXRFJFRl9GUkFNRSwgQUxUUkVGMl9GUkFNRSB9CisgIEFMVFJFRjJfQUxUUkVGX0ZSQU1FUywgIC8vIHsgQUxUUkVGMl9GUkFNRSwgQUxUUkVGX0ZSQU1FIH0KKyAgVE9UQUxfVU5JRElSX0NPTVBfUkVGUywKKyAgLy8gTk9URTogVU5JRElSX0NPTVBfUkVGUyBpcyB0aGUgbnVtYmVyIG9mIHVuaS1kaXJlY3Rpb25hbCByZWZlcmVuY2UgcGFpcnMKKyAgLy8gICAgICAgdGhhdCBhcmUgZXhwbGljaXRseSBzaWduYWxlZC4KKyAgVU5JRElSX0NPTVBfUkVGUyA9IEJXRFJFRl9BTFRSRUZfRlJBTUVTICsgMSwKK30gVUVOVU0xQllURShVTklESVJfQ09NUF9SRUYpOworCisjZGVmaW5lIFRPVEFMX0NPTVBfUkVGUyAoRldEX1JFRlMgKiBCV0RfUkVGUyArIFRPVEFMX1VOSURJUl9DT01QX1JFRlMpCisKKyNkZWZpbmUgQ09NUF9SRUZTIChGV0RfUkVGUyAqIEJXRF9SRUZTICsgVU5JRElSX0NPTVBfUkVGUykKKworLy8gTk9URTogQSBsaW1pdGVkIG51bWJlciBvZiB1bmlkaXJlY3Rpb25hbCByZWZlcmVuY2UgcGFpcnMgY2FuIGJlIHNpZ25hbGxlZCBmb3IKKy8vICAgICAgIGNvbXBvdW5kIHByZWRpY3Rpb24uIFRoZSB1c2Ugb2Ygc2tpcCBtb2RlLCBvbiB0aGUgb3RoZXIgaGFuZCwgbWFrZXMgaXQKKy8vICAgICAgIHBvc3NpYmxlIHRvIGhhdmUgYSByZWZlcmVuY2UgcGFpciBub3QgbGlzdGVkIGZvciBleHBsaWNpdCBzaWduYWxpbmcuCisjZGVmaW5lIE1PREVfQ1RYX1JFRl9GUkFNRVMgKFJFRl9GUkFNRVMgKyBUT1RBTF9DT01QX1JFRlMpCisKKy8vIE5vdGU6IEl0IGluY2x1ZGVzIHNpbmdsZSBhbmQgY29tcG91bmQgcmVmZXJlbmNlcy4gU28sIGl0IGNhbiB0YWtlIHZhbHVlcyBmcm9tCisvLyBOT05FX0ZSQU1FIHRvIChNT0RFX0NUWF9SRUZfRlJBTUVTIC0gMSkuIEhlbmNlLCBpdCBpcyBub3QgZGVmaW5lZCBhcyBhbiBlbnVtLgordHlwZWRlZiBpbnQ4X3QgTVZfUkVGRVJFTkNFX0ZSQU1FOworCitUWVBFREVGIGVudW0geworICBSRVNUT1JFX05PTkUsCisgIFJFU1RPUkVfV0lFTkVSLAorICBSRVNUT1JFX1NHUlBST0osCisgIFJFU1RPUkVfU1dJVENIQUJMRSwKKyAgUkVTVE9SRV9TV0lUQ0hBQkxFX1RZUEVTID0gUkVTVE9SRV9TV0lUQ0hBQkxFLAorICBSRVNUT1JFX1RZUEVTID0gNCwKK30gVUVOVU0xQllURShSZXN0b3JhdGlvblR5cGUpOworCisvLyBQaWN0dXJlIHByZWRpY3Rpb24gc3RydWN0dXJlcyAoMC0xMiBhcmUgcHJlZGVmaW5lZCkgaW4gc2NhbGFiaWxpdHkgbWV0YWRhdGEuCitUWVBFREVGIGVudW0geworICBTQ0FMQUJJTElUWV9MMVQyID0gMCwKKyAgU0NBTEFCSUxJVFlfTDFUMyA9IDEsCisgIFNDQUxBQklMSVRZX0wyVDEgPSAyLAorICBTQ0FMQUJJTElUWV9MMlQyID0gMywKKyAgU0NBTEFCSUxJVFlfTDJUMyA9IDQsCisgIFNDQUxBQklMSVRZX1MyVDEgPSA1LAorICBTQ0FMQUJJTElUWV9TMlQyID0gNiwKKyAgU0NBTEFCSUxJVFlfUzJUMyA9IDcsCisgIFNDQUxBQklMSVRZX0wyVDFoID0gOCwKKyAgU0NBTEFCSUxJVFlfTDJUMmggPSA5LAorICBTQ0FMQUJJTElUWV9MMlQzaCA9IDEwLAorICBTQ0FMQUJJTElUWV9TMlQxaCA9IDExLAorICBTQ0FMQUJJTElUWV9TMlQyaCA9IDEyLAorICBTQ0FMQUJJTElUWV9TMlQzaCA9IDEzLAorICBTQ0FMQUJJTElUWV9TUyA9IDE0Cit9IFVFTlVNMUJZVEUoU0NBTEFCSUxJVFlfU1RSVUNUVVJFUyk7CisKKyNkZWZpbmUgU1VQRVJSRVNfU0NBTEVfQklUUyAzCisjZGVmaW5lIFNVUEVSUkVTX1NDQUxFX0RFTk9NSU5BVE9SX01JTiAoU0NBTEVfTlVNRVJBVE9SICsgMSkKKworLy8gSW4gbGFyZ2Vfc2NhbGVfdGlsZSBjb2RpbmcsIGV4dGVybmFsIHJlZmVyZW5jZXMgYXJlIHVzZWQuCisjZGVmaW5lIE1BWF9FWFRFUk5BTF9SRUZFUkVOQ0VTIDEyOAorI2RlZmluZSBNQVhfVElMRVMgNTEyCisKKworI2RlZmluZSBDT05GSUdfTVVMVElUSFJFQUQgMAorI2RlZmluZSBDT05GSUdfRU5UUk9QWV9TVEFUUyAwCisKKyNkZWZpbmUgQ09ORklHX01BWF9ERUNPREVfUFJPRklMRSAyCisKKy8qCitmcm9tOgorc2VnX2NvbW1vbi5oCisqLworI2lmZGVmIE9SSV9DT0RFCisKKyNkZWZpbmUgTUFYX1NFR01FTlRTIDgKKyNkZWZpbmUgU0VHX1RSRUVfUFJPQlMgKE1BWF9TRUdNRU5UUyAtIDEpCisKKyNkZWZpbmUgU0VHX1RFTVBPUkFMX1BSRURfQ1RYUyAzCisjZGVmaW5lIFNQQVRJQUxfUFJFRElDVElPTl9QUk9CUyAzCisKK2VudW0geworICBTRUdfTFZMX0FMVF9RLCAgICAgICAvLyBVc2UgYWx0ZXJuYXRlIFF1YW50aXplciAuLi4uCisgIFNFR19MVkxfQUxUX0xGX1lfViwgIC8vIFVzZSBhbHRlcm5hdGUgbG9vcCBmaWx0ZXIgdmFsdWUgb24geSBwbGFuZSB2ZXJ0aWNhbAorICBTRUdfTFZMX0FMVF9MRl9ZX0gsICAvLyBVc2UgYWx0ZXJuYXRlIGxvb3AgZmlsdGVyIHZhbHVlIG9uIHkgcGxhbmUgaG9yaXpvbnRhbAorICBTRUdfTFZMX0FMVF9MRl9VLCAgICAvLyBVc2UgYWx0ZXJuYXRlIGxvb3AgZmlsdGVyIHZhbHVlIG9uIHUgcGxhbmUKKyAgU0VHX0xWTF9BTFRfTEZfViwgICAgLy8gVXNlIGFsdGVybmF0ZSBsb29wIGZpbHRlciB2YWx1ZSBvbiB2IHBsYW5lCisgIFNFR19MVkxfUkVGX0ZSQU1FLCAgIC8vIE9wdGlvbmFsIFNlZ21lbnQgcmVmZXJlbmNlIGZyYW1lCisgIFNFR19MVkxfU0tJUCwgICAgICAgIC8vIE9wdGlvbmFsIFNlZ21lbnQgKDAsMCkgKyBza2lwIG1vZGUKKyAgU0VHX0xWTF9HTE9CQUxNViwKKyAgU0VHX0xWTF9NQVgKK30gVUVOVU0xQllURShTRUdfTFZMX0ZFQVRVUkVTKTsKKworc3RydWN0IHNlZ21lbnRhdGlvbiB7CisgIHVpbnQ4X3QgZW5hYmxlZDsKKyAgdWludDhfdCB1cGRhdGVfbWFwOworICB1aW50OF90IHVwZGF0ZV9kYXRhOworICB1aW50OF90IHRlbXBvcmFsX3VwZGF0ZTsKKworICBpbnQxNl90IGZlYXR1cmVfZGF0YVtNQVhfU0VHTUVOVFNdW1NFR19MVkxfTUFYXTsKKyAgdW5zaWduZWQgaW50IGZlYXR1cmVfbWFza1tNQVhfU0VHTUVOVFNdOworICBpbnQgbGFzdF9hY3RpdmVfc2VnaWQ7ICAvLyBUaGUgaGlnaGVzdCBudW1iZXJlZCBzZWdtZW50IGlkIHRoYXQgaGFzIHNvbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5hYmxlZCBmZWF0dXJlLgorICB1aW50OF90IHNlZ2lkX3ByZXNraXA7ICAvLyBXaGV0aGVyIHRoZSBzZWdtZW50IGlkIHdpbGwgYmUgcmVhZCBiZWZvcmUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNraXAgc3ludGF4IGVsZW1lbnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDE6IHRoZSBzZWdtZW50IGlkIHdpbGwgYmUgcmVhZCBmaXJzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMDogdGhlIHNraXAgc3ludGF4IGVsZW1lbnQgd2lsbCBiZSByZWFkIGZpcnN0LgorfTsKKworLyoKK2Zyb20gYXYxX2xvb3BmaWx0ZXIuaAorKi8KKyNkZWZpbmUgTUFYX0xPT1BfRklMVEVSIDYzCisKKworLyogZnJvbQorcXVhbnRfY29tbW9uLmg6CisqLworI2RlZmluZSBNQVhRIDI1NQorCisjZW5kaWYKKworLyoKK2Zyb206Cithb20vYXYxL2NvbW1vbi9jb21tb24uaAorKi8KKyNkZWZpbmUgYXYxX3plcm8oZGVzdCkgbWVtc2V0KCYoZGVzdCksIDAsIHNpemVvZihkZXN0KSkKKyNkZWZpbmUgYXYxX3plcm9fYXJyYXkoZGVzdCwgbikgbWVtc2V0KGRlc3QsIDAsIG4gKiBzaXplb2YoKihkZXN0KSkpCisvKgorZnJvbToKK2FvbS9hdjEvY29tbW9uL2FsbG9jY29tbW9uLmgKKyovCisjZGVmaW5lIElOVkFMSURfSURYIC0xICAvLyBJbnZhbGlkIGJ1ZmZlciBpbmRleC4KKworLyoKK2Zyb206Cithb20vYXYxL2NvbW1vbi90aW1pbmcuaAorKi8KK3R5cGVkZWYgc3RydWN0IGFvbV90aW1pbmcgeworICB1aW50MzJfdCBudW1fdW5pdHNfaW5fZGlzcGxheV90aWNrOworICB1aW50MzJfdCB0aW1lX3NjYWxlOworICBpbnQgZXF1YWxfcGljdHVyZV9pbnRlcnZhbDsKKyAgdWludDMyX3QgbnVtX3RpY2tzX3Blcl9waWN0dXJlOworfSBhb21fdGltaW5nX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgYW9tX2RlY19tb2RlbF9pbmZvIHsKKyAgdWludDMyX3QgbnVtX3VuaXRzX2luX2RlY29kaW5nX3RpY2s7CisgIGludCBlbmNvZGVyX2RlY29kZXJfYnVmZmVyX2RlbGF5X2xlbmd0aDsKKyAgaW50IGJ1ZmZlcl9yZW1vdmFsX3RpbWVfbGVuZ3RoOworICBpbnQgZnJhbWVfcHJlc2VudGF0aW9uX3RpbWVfbGVuZ3RoOworfSBhb21fZGVjX21vZGVsX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgYW9tX2RlY19tb2RlbF9vcF9wYXJhbWV0ZXJzIHsKKyAgaW50IGRlY29kZXJfbW9kZWxfcGFyYW1fcHJlc2VudF9mbGFnOworICBpbnQ2NF90IGJpdHJhdGU7CisgIGludDY0X3QgYnVmZmVyX3NpemU7CisgIHVpbnQzMl90IGRlY29kZXJfYnVmZmVyX2RlbGF5OworICB1aW50MzJfdCBlbmNvZGVyX2J1ZmZlcl9kZWxheTsKKyAgaW50IGxvd19kZWxheV9tb2RlX2ZsYWc7CisgIGludCBkaXNwbGF5X21vZGVsX3BhcmFtX3ByZXNlbnRfZmxhZzsKKyAgaW50IGluaXRpYWxfZGlzcGxheV9kZWxheTsKK30gYW9tX2RlY19tb2RlbF9vcF9wYXJhbWV0ZXJzX3Q7CisKK3R5cGVkZWYgc3RydWN0IGFvbV9vcF90aW1pbmdfaW5mb190IHsKKyAgdWludDMyX3QgYnVmZmVyX3JlbW92YWxfdGltZTsKK30gYW9tX29wX3RpbWluZ19pbmZvX3Q7CisvKgorZnJvbToKK2FvbS9hb21fY29kZWMuaAorKi8KKy8qIVxicmllZiBPQlUgdHlwZXMuICovCit0eXBlZGVmIGVudW0geworICBPQlVfU0VRVUVOQ0VfSEVBREVSID0gMSwKKyAgT0JVX1RFTVBPUkFMX0RFTElNSVRFUiA9IDIsCisgIE9CVV9GUkFNRV9IRUFERVIgPSAzLAorICBPQlVfVElMRV9HUk9VUCA9IDQsCisgIE9CVV9NRVRBREFUQSA9IDUsCisgIE9CVV9GUkFNRSA9IDYsCisgIE9CVV9SRURVTkRBTlRfRlJBTUVfSEVBREVSID0gNywKKyAgT0JVX1RJTEVfTElTVCA9IDgsCisgIE9CVV9QQURESU5HID0gMTUsCit9IE9CVV9UWVBFOworCit0eXBlZGVmIGVudW0gYW9tX2JpdF9kZXB0aCB7CisgIEFPTV9CSVRTXzggPSA4LCAgIC8qKjwgIDggYml0cyAqLworICBBT01fQklUU18xMCA9IDEwLCAvKio8IDEwIGJpdHMgKi8KKyAgQU9NX0JJVFNfMTIgPSAxMiwgLyoqPCAxMiBiaXRzICovCit9IGFvbV9iaXRfZGVwdGhfdDsKKworLyohXGJyaWVmIEFsZ29yaXRobSByZXR1cm4gY29kZXMgKi8KK3R5cGVkZWYgZW51bSB7CisgIC8qIVxicmllZiBPcGVyYXRpb24gY29tcGxldGVkIHdpdGhvdXQgZXJyb3IgKi8KKyAgQU9NX0NPREVDX09LLAorCisgIC8qIVxicmllZiBVbnNwZWNpZmllZCBlcnJvciAqLworICBBT01fQ09ERUNfRVJST1IsCisKKyAgLyohXGJyaWVmIE1lbW9yeSBvcGVyYXRpb24gZmFpbGVkICovCisgIEFPTV9DT0RFQ19NRU1fRVJST1IsCisKKyAgLyohXGJyaWVmIEFCSSB2ZXJzaW9uIG1pc21hdGNoICovCisgIEFPTV9DT0RFQ19BQklfTUlTTUFUQ0gsCisKKyAgLyohXGJyaWVmIEFsZ29yaXRobSBkb2VzIG5vdCBoYXZlIHJlcXVpcmVkIGNhcGFiaWxpdHkgKi8KKyAgQU9NX0NPREVDX0lOQ0FQQUJMRSwKKworICAvKiFcYnJpZWYgVGhlIGdpdmVuIGJpdHN0cmVhbSBpcyBub3Qgc3VwcG9ydGVkLgorICAgKgorICAgKiBUaGUgYml0c3RyZWFtIHdhcyB1bmFibGUgdG8gYmUgcGFyc2VkIGF0IHRoZSBoaWdoZXN0IGxldmVsLiBUaGUgZGVjb2RlcgorICAgKiBpcyB1bmFibGUgdG8gcHJvY2VlZC4gVGhpcyBlcnJvciBccmVmIFNIT1VMRCBiZSB0cmVhdGVkIGFzIGZhdGFsIHRvIHRoZQorICAgKiBzdHJlYW0uICovCisgIEFPTV9DT0RFQ19VTlNVUF9CSVRTVFJFQU0sCisKKyAgLyohXGJyaWVmIEVuY29kZWQgYml0c3RyZWFtIHVzZXMgYW4gdW5zdXBwb3J0ZWQgZmVhdHVyZQorICAgKgorICAgKiBUaGUgZGVjb2RlciBkb2VzIG5vdCBpbXBsZW1lbnQgYSBmZWF0dXJlIHJlcXVpcmVkIGJ5IHRoZSBlbmNvZGVyLiBUaGlzCisgICAqIHJldHVybiBjb2RlIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGZlYXR1cmVzIHRoYXQgcHJldmVudCBmdXR1cmUKKyAgICogcGljdHVyZXMgZnJvbSBiZWluZyBwcm9wZXJseSBkZWNvZGVkLiBUaGlzIGVycm9yIFxyZWYgTUFZIGJlIHRyZWF0ZWQgYXMKKyAgICogZmF0YWwgdG8gdGhlIHN0cmVhbSBvciBccmVmIE1BWSBiZSB0cmVhdGVkIGFzIGZhdGFsIHRvIHRoZSBjdXJyZW50IEdPUC4KKyAgICovCisgIEFPTV9DT0RFQ19VTlNVUF9GRUFUVVJFLAorCisgIC8qIVxicmllZiBUaGUgY29kZWQgZGF0YSBmb3IgdGhpcyBzdHJlYW0gaXMgY29ycnVwdCBvciBpbmNvbXBsZXRlCisgICAqCisgICAqIFRoZXJlIHdhcyBhIHByb2JsZW0gZGVjb2RpbmcgdGhlIGN1cnJlbnQgZnJhbWUuICBUaGlzIHJldHVybiBjb2RlCisgICAqIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGZhaWx1cmVzIHRoYXQgcHJldmVudCBmdXR1cmUgcGljdHVyZXMgZnJvbQorICAgKiBiZWluZyBwcm9wZXJseSBkZWNvZGVkLiBUaGlzIGVycm9yIFxyZWYgTUFZIGJlIHRyZWF0ZWQgYXMgZmF0YWwgdG8gdGhlCisgICAqIHN0cmVhbSBvciBccmVmIE1BWSBiZSB0cmVhdGVkIGFzIGZhdGFsIHRvIHRoZSBjdXJyZW50IEdPUC4gSWYgZGVjb2RpbmcKKyAgICogaXMgY29udGludWVkIGZvciB0aGUgY3VycmVudCBHT1AsIGFydGlmYWN0cyBtYXkgYmUgcHJlc2VudC4KKyAgICovCisgIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorCisgIC8qIVxicmllZiBBbiBhcHBsaWNhdGlvbi1zdXBwbGllZCBwYXJhbWV0ZXIgaXMgbm90IHZhbGlkLgorICAgKgorICAgKi8KKyAgQU9NX0NPREVDX0lOVkFMSURfUEFSQU0sCisKKyAgLyohXGJyaWVmIEFuIGl0ZXJhdG9yIHJlYWNoZWQgdGhlIGVuZCBvZiBsaXN0LgorICAgKgorICAgKi8KKyAgQU9NX0NPREVDX0xJU1RfRU5ECisKK30gYW9tX2NvZGVjX2Vycl90OworCit0eXBlZGVmIHN0cnVjdCBjZmdfb3B0aW9ucyB7CisgIC8qIVxicmllZiBSZWZsZWN0cyBpZiBleHRfcGFydGl0aW9uIHNob3VsZCBiZSBlbmFibGVkCisgICAqCisgICAqIElmIHRoaXMgdmFsdWUgaXMgbm9uLXplcm8gaXQgZW5hYmxlZCB0aGUgZmVhdHVyZQorICAgKi8KKyAgdW5zaWduZWQgaW50IGV4dF9wYXJ0aXRpb247Cit9IGNmZ19vcHRpb25zX3Q7CisKKy8qCitmcm9tOgorYW9tL2F2MS9jb21tb24vb2J1X3V0aWwuaAorKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgc2l6ZV90IHNpemU7ICAvLyBTaXplICgxIG9yIDIgYnl0ZXMpIG9mIHRoZSBPQlUgaGVhZGVyIChpbmNsdWRpbmcgdGhlCisgICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwgT0JVIGV4dGVuc2lvbiBoZWFkZXIpIGluIHRoZSBiaXRzdHJlYW0uCisgIE9CVV9UWVBFIHR5cGU7CisgIGludCBoYXNfc2l6ZV9maWVsZDsKKyAgaW50IGhhc19leHRlbnNpb247CisgIC8vIFRoZSBmb2xsb3dpbmcgZmllbGRzIGNvbWUgZnJvbSB0aGUgT0JVIGV4dGVuc2lvbiBoZWFkZXIgYW5kIHRoZXJlZm9yZSBhcmUKKyAgLy8gb25seSB1c2VkIGlmIGhhc19leHRlbnNpb24gaXMgdHJ1ZS4KKyAgaW50IHRlbXBvcmFsX2xheWVyX2lkOworICBpbnQgc3BhdGlhbF9sYXllcl9pZDsKK30gT2J1SGVhZGVyOworCisKKy8qCitmcm9tOgorYW9tL2ludGVybmFsL2FvbV9jb2RlY19pbnRlcm5hbC5oCisqLworCitzdHJ1Y3QgYW9tX2ludGVybmFsX2Vycm9yX2luZm8geworICBhb21fY29kZWNfZXJyX3QgZXJyb3JfY29kZTsKKyAgaW50IGhhc19kZXRhaWw7CisgIGNoYXIgZGV0YWlsWzgwXTsKKyAgaW50IHNldGptcDsgIC8vIEJvb2xlYW46IHdoZXRoZXIgJ2ptcCcgaXMgdmFsaWQuCisjaWZkZWYgT1JJX0NPREUKKyAgam1wX2J1ZiBqbXA7CisjZW5kaWYKK307CisKKy8qCitmcm9tOgorYW9tL2FvbV9mcmFtZV9idWZmZXIuaAorKi8KK3R5cGVkZWYgc3RydWN0IGFvbV9jb2RlY19mcmFtZV9idWZmZXIgeworICB1aW50OF90ICpkYXRhOyAvKio8IFBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyICovCisgIHNpemVfdCBzaXplOyAgIC8qKjwgU2l6ZSBvZiBkYXRhIGluIGJ5dGVzICovCisgIHZvaWQgKnByaXY7ICAgIC8qKjwgRnJhbWUncyBwcml2YXRlIGRhdGEgKi8KK30gYW9tX2NvZGVjX2ZyYW1lX2J1ZmZlcl90OworCisvKgorZnJvbToKK2FvbS9hb21faW1hZ2UuaAorKi8KKyNkZWZpbmUgQU9NX0lNQUdFX0FCSV9WRVJTSU9OICg1KSAvKio8XGhpZGVpbml0aWFsaXplciovCisKKyNkZWZpbmUgQU9NX0lNR19GTVRfUExBTkFSIDB4MTAwICAvKio8IEltYWdlIGlzIGEgcGxhbmFyIGZvcm1hdC4gKi8KKyNkZWZpbmUgQU9NX0lNR19GTVRfVVZfRkxJUCAweDIwMCAvKio8IFYgcGxhbmUgcHJlY2VkZXMgVSBpbiBtZW1vcnkuICovCisvKiogMHg0MDAgdXNlZCB0byBzaWduYWwgYWxwaGEgY2hhbm5lbCwgc2tpcHBpbmcgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAqLworI2RlZmluZSBBT01fSU1HX0ZNVF9ISUdIQklUREVQVEggMHg4MDAgLyoqPCBJbWFnZSB1c2VzIDE2Yml0IGZyYW1lYnVmZmVyLiAqLworCisvKiFcYnJpZWYgTGlzdCBvZiBzdXBwb3J0ZWQgaW1hZ2UgZm9ybWF0cyAqLwordHlwZWRlZiBlbnVtIGFvbV9pbWdfZm10IHsKKyAgQU9NX0lNR19GTVRfTk9ORSwKKyAgQU9NX0lNR19GTVRfWVYxMiA9CisgICAgICBBT01fSU1HX0ZNVF9QTEFOQVIgfCBBT01fSU1HX0ZNVF9VVl9GTElQIHwgMSwgLyoqPCBwbGFuYXIgWVZVICovCisgIEFPTV9JTUdfRk1UX0k0MjAgPSBBT01fSU1HX0ZNVF9QTEFOQVIgfCAyLAorICBBT01fSU1HX0ZNVF9BT01ZVjEyID0gQU9NX0lNR19GTVRfUExBTkFSIHwgQU9NX0lNR19GTVRfVVZfRkxJUCB8CisgICAgICAgICAgICAgICAgICAgICAgICAzLCAvKiogPCBwbGFuYXIgNDoyOjAgZm9ybWF0IHdpdGggYW9tIGNvbG9yIHNwYWNlICovCisgIEFPTV9JTUdfRk1UX0FPTUk0MjAgPSBBT01fSU1HX0ZNVF9QTEFOQVIgfCA0LAorICBBT01fSU1HX0ZNVF9JNDIyID0gQU9NX0lNR19GTVRfUExBTkFSIHwgNSwKKyAgQU9NX0lNR19GTVRfSTQ0NCA9IEFPTV9JTUdfRk1UX1BMQU5BUiB8IDYsCisgIEFPTV9JTUdfRk1UX0k0MjAxNiA9IEFPTV9JTUdfRk1UX0k0MjAgfCBBT01fSU1HX0ZNVF9ISUdIQklUREVQVEgsCisgIEFPTV9JTUdfRk1UX1lWMTIxNiA9IEFPTV9JTUdfRk1UX1lWMTIgfCBBT01fSU1HX0ZNVF9ISUdIQklUREVQVEgsCisgIEFPTV9JTUdfRk1UX0k0MjIxNiA9IEFPTV9JTUdfRk1UX0k0MjIgfCBBT01fSU1HX0ZNVF9ISUdIQklUREVQVEgsCisgIEFPTV9JTUdfRk1UX0k0NDQxNiA9IEFPTV9JTUdfRk1UX0k0NDQgfCBBT01fSU1HX0ZNVF9ISUdIQklUREVQVEgsCit9IGFvbV9pbWdfZm10X3Q7IC8qKjwgYWxpYXMgZm9yIGVudW0gYW9tX2ltZ19mbXQgKi8KKworLyohXGJyaWVmIExpc3Qgb2Ygc3VwcG9ydGVkIGNvbG9yIHByaW1hcmllcyAqLwordHlwZWRlZiBlbnVtIGFvbV9jb2xvcl9wcmltYXJpZXMgeworICBBT01fQ0lDUF9DUF9SRVNFUlZFRF8wID0gMCwgIC8qKjwgRm9yIGZ1dHVyZSB1c2UgKi8KKyAgQU9NX0NJQ1BfQ1BfQlRfNzA5ID0gMSwgICAgICAvKio8IEJULjcwOSAqLworICBBT01fQ0lDUF9DUF9VTlNQRUNJRklFRCA9IDIsIC8qKjwgVW5zcGVjaWZpZWQgKi8KKyAgQU9NX0NJQ1BfQ1BfUkVTRVJWRURfMyA9IDMsICAvKio8IEZvciBmdXR1cmUgdXNlICovCisgIEFPTV9DSUNQX0NQX0JUXzQ3MF9NID0gNCwgICAgLyoqPCBCVC40NzAgU3lzdGVtIE0gKGhpc3RvcmljYWwpICovCisgIEFPTV9DSUNQX0NQX0JUXzQ3MF9CX0cgPSA1LCAgLyoqPCBCVC40NzAgU3lzdGVtIEIsIEcgKGhpc3RvcmljYWwpICovCisgIEFPTV9DSUNQX0NQX0JUXzYwMSA9IDYsICAgICAgLyoqPCBCVC42MDEgKi8KKyAgQU9NX0NJQ1BfQ1BfU01QVEVfMjQwID0gNywgICAvKio8IFNNUFRFIDI0MCAqLworICBBT01fQ0lDUF9DUF9HRU5FUklDX0ZJTE0gPQorICAgICAgOCwgLyoqPCBHZW5lcmljIGZpbG0gKGNvbG9yIGZpbHRlcnMgdXNpbmcgaWxsdW1pbmFudCBDKSAqLworICBBT01fQ0lDUF9DUF9CVF8yMDIwID0gOSwgICAgICAvKio8IEJULjIwMjAsIEJULjIxMDAgKi8KKyAgQU9NX0NJQ1BfQ1BfWFlaID0gMTAsICAgICAgICAgLyoqPCBTTVBURSA0MjggKENJRSAxOTIxIFhZWikgKi8KKyAgQU9NX0NJQ1BfQ1BfU01QVEVfNDMxID0gMTEsICAgLyoqPCBTTVBURSBSUCA0MzEtMiAqLworICBBT01fQ0lDUF9DUF9TTVBURV80MzIgPSAxMiwgICAvKio8IFNNUFRFIEVHIDQzMi0xICAqLworICBBT01fQ0lDUF9DUF9SRVNFUlZFRF8xMyA9IDEzLCAvKio8IEZvciBmdXR1cmUgdXNlICh2YWx1ZXMgMTMgLSAyMSkgICovCisgIEFPTV9DSUNQX0NQX0VCVV8zMjEzID0gMjIsICAgIC8qKjwgRUJVIFRlY2guIDMyMTMtRSAgKi8KKyAgQU9NX0NJQ1BfQ1BfUkVTRVJWRURfMjMgPSAyMyAgLyoqPCBGb3IgZnV0dXJlIHVzZSAodmFsdWVzIDIzIC0gMjU1KSAgKi8KK30gYW9tX2NvbG9yX3ByaW1hcmllc190OyAgICAgICAgLyoqPCBhbGlhcyBmb3IgZW51bSBhb21fY29sb3JfcHJpbWFyaWVzICovCisKKy8qIVxicmllZiBMaXN0IG9mIHN1cHBvcnRlZCB0cmFuc2ZlciBmdW5jdGlvbnMgKi8KK3R5cGVkZWYgZW51bSBhb21fdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzIHsKKyAgQU9NX0NJQ1BfVENfUkVTRVJWRURfMCA9IDAsICAvKio8IEZvciBmdXR1cmUgdXNlICovCisgIEFPTV9DSUNQX1RDX0JUXzcwOSA9IDEsICAgICAgLyoqPCBCVC43MDkgKi8KKyAgQU9NX0NJQ1BfVENfVU5TUEVDSUZJRUQgPSAyLCAvKio8IFVuc3BlY2lmaWVkICovCisgIEFPTV9DSUNQX1RDX1JFU0VSVkVEXzMgPSAzLCAgLyoqPCBGb3IgZnV0dXJlIHVzZSAqLworICBBT01fQ0lDUF9UQ19CVF80NzBfTSA9IDQsICAgIC8qKjwgQlQuNDcwIFN5c3RlbSBNIChoaXN0b3JpY2FsKSAgKi8KKyAgQU9NX0NJQ1BfVENfQlRfNDcwX0JfRyA9IDUsICAvKio8IEJULjQ3MCBTeXN0ZW0gQiwgRyAoaGlzdG9yaWNhbCkgKi8KKyAgQU9NX0NJQ1BfVENfQlRfNjAxID0gNiwgICAgICAvKio8IEJULjYwMSAqLworICBBT01fQ0lDUF9UQ19TTVBURV8yNDAgPSA3LCAgIC8qKjwgU01QVEUgMjQwIE0gKi8KKyAgQU9NX0NJQ1BfVENfTElORUFSID0gOCwgICAgICAvKio8IExpbmVhciAqLworICBBT01fQ0lDUF9UQ19MT0dfMTAwID0gOSwgICAgIC8qKjwgTG9nYXJpdGhtaWMgKDEwMCA6IDEgcmFuZ2UpICovCisgIEFPTV9DSUNQX1RDX0xPR18xMDBfU1FSVDEwID0KKyAgICAgIDEwLCAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9nYXJpdGhtaWMgKDEwMCAqIFNxcnQoMTApIDogMSByYW5nZSkgKi8KKyAgQU9NX0NJQ1BfVENfSUVDXzYxOTY2ID0gMTEsIC8qKjwgSUVDIDYxOTY2LTItNCAqLworICBBT01fQ0lDUF9UQ19CVF8xMzYxID0gMTIsICAgLyoqPCBCVC4xMzYxICovCisgIEFPTV9DSUNQX1RDX1NSR0IgPSAxMywgICAgICAvKio8IHNSR0Igb3Igc1lDQyovCisgIEFPTV9DSUNQX1RDX0JUXzIwMjBfMTBfQklUID0gMTQsIC8qKjwgQlQuMjAyMCAxMC1iaXQgc3lzdGVtcyAqLworICBBT01fQ0lDUF9UQ19CVF8yMDIwXzEyX0JJVCA9IDE1LCAvKio8IEJULjIwMjAgMTItYml0IHN5c3RlbXMgKi8KKyAgQU9NX0NJQ1BfVENfU01QVEVfMjA4NCA9IDE2LCAgICAgLyoqPCBTTVBURSBTVCAyMDg0LCBJVFUgQlQuMjEwMCBQUSAqLworICBBT01fQ0lDUF9UQ19TTVBURV80MjggPSAxNywgICAgICAvKio8IFNNUFRFIFNUIDQyOCAqLworICBBT01fQ0lDUF9UQ19ITEcgPSAxOCwgICAgICAgICAgICAvKio8IEJULjIxMDAgSExHLCBBUklCIFNURC1CNjcgKi8KKyAgQU9NX0NJQ1BfVENfUkVTRVJWRURfMTkgPSAxOSAgICAgLyoqPCBGb3IgZnV0dXJlIHVzZSAodmFsdWVzIDE5LTI1NSkgKi8KK30gYW9tX3RyYW5zZmVyX2NoYXJhY3RlcmlzdGljc190OyAgLyoqPCBhbGlhcyBmb3IgZW51bSBhb21fdHJhbnNmZXJfZnVuY3Rpb24gKi8KKworLyohXGJyaWVmIExpc3Qgb2Ygc3VwcG9ydGVkIG1hdHJpeCBjb2VmZmljaWVudHMgKi8KK3R5cGVkZWYgZW51bSBhb21fbWF0cml4X2NvZWZmaWNpZW50cyB7CisgIEFPTV9DSUNQX01DX0lERU5USVRZID0gMCwgICAgLyoqPCBJZGVudGl0eSBtYXRyaXggKi8KKyAgQU9NX0NJQ1BfTUNfQlRfNzA5ID0gMSwgICAgICAvKio8IEJULjcwOSAqLworICBBT01fQ0lDUF9NQ19VTlNQRUNJRklFRCA9IDIsIC8qKjwgVW5zcGVjaWZpZWQgKi8KKyAgQU9NX0NJQ1BfTUNfUkVTRVJWRURfMyA9IDMsICAvKio8IEZvciBmdXR1cmUgdXNlICovCisgIEFPTV9DSUNQX01DX0ZDQyA9IDQsICAgICAgICAgLyoqPCBVUyBGQ0MgNzMuNjI4ICovCisgIEFPTV9DSUNQX01DX0JUXzQ3MF9CX0cgPSA1LCAgLyoqPCBCVC40NzAgU3lzdGVtIEIsIEcgKGhpc3RvcmljYWwpICovCisgIEFPTV9DSUNQX01DX0JUXzYwMSA9IDYsICAgICAgLyoqPCBCVC42MDEgKi8KKyAgQU9NX0NJQ1BfTUNfU01QVEVfMjQwID0gNywgICAvKio8IFNNUFRFIDI0MCBNICovCisgIEFPTV9DSUNQX01DX1NNUFRFX1lDR0NPID0gOCwgLyoqPCBZQ2dDbyAqLworICBBT01fQ0lDUF9NQ19CVF8yMDIwX05DTCA9CisgICAgICA5LCAvKio8IEJULjIwMjAgbm9uLWNvbnN0YW50IGx1bWluYW5jZSwgQlQuMjEwMCBZQ2JDciAgKi8KKyAgQU9NX0NJQ1BfTUNfQlRfMjAyMF9DTCA9IDEwLCAvKio8IEJULjIwMjAgY29uc3RhbnQgbHVtaW5hbmNlICovCisgIEFPTV9DSUNQX01DX1NNUFRFXzIwODUgPSAxMSwgLyoqPCBTTVBURSBTVCAyMDg1IFlEekR4ICovCisgIEFPTV9DSUNQX01DX0NIUk9NQVRfTkNMID0KKyAgICAgIDEyLCAvKio8IENocm9tYXRpY2l0eS1kZXJpdmVkIG5vbi1jb25zdGFudCBsdW1pbmFuY2UgKi8KKyAgQU9NX0NJQ1BfTUNfQ0hST01BVF9DTCA9IDEzLCAvKio8IENocm9tYXRpY2l0eS1kZXJpdmVkIGNvbnN0YW50IGx1bWluYW5jZSAqLworICBBT01fQ0lDUF9NQ19JQ1RDUCA9IDE0LCAgICAgIC8qKjwgQlQuMjEwMCBJQ3RDcCAqLworICBBT01fQ0lDUF9NQ19SRVNFUlZFRF8xNSA9IDE1IC8qKjwgRm9yIGZ1dHVyZSB1c2UgKHZhbHVlcyAxNS0yNTUpICAqLworfSBhb21fbWF0cml4X2NvZWZmaWNpZW50c190OworCisvKiFcYnJpZWYgTGlzdCBvZiBzdXBwb3J0ZWQgY29sb3IgcmFuZ2UgKi8KK3R5cGVkZWYgZW51bSBhb21fY29sb3JfcmFuZ2UgeworICBBT01fQ1JfU1RVRElPX1JBTkdFID0gMCwgLyoqPCBZIFsxNi4uMjM1XSwgVVYgWzE2Li4yNDBdICovCisgIEFPTV9DUl9GVUxMX1JBTkdFID0gMSAgICAvKio8IFlVVi9SR0IgWzAuLjI1NV0gKi8KK30gYW9tX2NvbG9yX3JhbmdlX3Q7ICAgICAgIC8qKjwgYWxpYXMgZm9yIGVudW0gYW9tX2NvbG9yX3JhbmdlICovCisKKy8qIVxicmllZiBMaXN0IG9mIGNocm9tYSBzYW1wbGUgcG9zaXRpb25zICovCit0eXBlZGVmIGVudW0gYW9tX2Nocm9tYV9zYW1wbGVfcG9zaXRpb24geworICBBT01fQ1NQX1VOS05PV04gPSAwLCAgICAgICAgICAvKio8IFVua25vd24gKi8KKyAgQU9NX0NTUF9WRVJUSUNBTCA9IDEsICAgICAgICAgLyoqPCBIb3Jpem9udGFsbHkgY28tbG9jYXRlZCB3aXRoIGx1bWEoMCwgMCkqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHNhbXBsZSwgYmV0d2VlbiB0d28gdmVydGljYWwgc2FtcGxlcyAqLworICBBT01fQ1NQX0NPTE9DQVRFRCA9IDIsICAgICAgICAvKio8IENvLWxvY2F0ZWQgd2l0aCBsdW1hKDAsIDApIHNhbXBsZSAqLworICBBT01fQ1NQX1JFU0VSVkVEID0gMyAgICAgICAgICAvKio8IFJlc2VydmVkIHZhbHVlICovCit9IGFvbV9jaHJvbWFfc2FtcGxlX3Bvc2l0aW9uX3Q7IC8qKjwgYWxpYXMgZm9yIGVudW0gYW9tX3RyYW5zZmVyX2Z1bmN0aW9uICovCisKKy8qCitmcm9tOgorYW9tL2FvbV9zY2FsZS95djEyY29uZmlnLmgKKyovCit0eXBlZGVmIHN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zIHsKKyAgdW5pb24geworICAgIHN0cnVjdCB7CisgICAgICBpbnQgeV93aWR0aDsKKyAgICAgIGludCB1dl93aWR0aDsKKyAgICB9OworICAgIGludCB3aWR0aHNbMl07CisgIH07CisgIHVuaW9uIHsKKyAgICBzdHJ1Y3QgeworICAgICAgaW50IHlfaGVpZ2h0OworICAgICAgaW50IHV2X2hlaWdodDsKKyAgICB9OworICAgIGludCBoZWlnaHRzWzJdOworICB9OworICB1bmlvbiB7CisgICAgc3RydWN0IHsKKyAgICAgIGludCB5X2Nyb3Bfd2lkdGg7CisgICAgICBpbnQgdXZfY3JvcF93aWR0aDsKKyAgICB9OworICAgIGludCBjcm9wX3dpZHRoc1syXTsKKyAgfTsKKyAgdW5pb24geworICAgIHN0cnVjdCB7CisgICAgICBpbnQgeV9jcm9wX2hlaWdodDsKKyAgICAgIGludCB1dl9jcm9wX2hlaWdodDsKKyAgICB9OworICAgIGludCBjcm9wX2hlaWdodHNbMl07CisgIH07CisgIHVuaW9uIHsKKyAgICBzdHJ1Y3QgeworICAgICAgaW50IHlfc3RyaWRlOworICAgICAgaW50IHV2X3N0cmlkZTsKKyAgICB9OworICAgIGludCBzdHJpZGVzWzJdOworICB9OworICB1bmlvbiB7CisgICAgc3RydWN0IHsKKyAgICAgIHVpbnQ4X3QgKnlfYnVmZmVyOworICAgICAgdWludDhfdCAqdV9idWZmZXI7CisgICAgICB1aW50OF90ICp2X2J1ZmZlcjsKKyAgICB9OworICAgIHVpbnQ4X3QgKmJ1ZmZlcnNbM107CisgIH07CisKKyAgLy8gSW5kaWNhdGUgd2hldGhlciB5X2J1ZmZlciwgdV9idWZmZXIsIGFuZCB2X2J1ZmZlciBwb2ludHMgdG8gdGhlIGludGVybmFsbHkKKyAgLy8gYWxsb2NhdGVkIG1lbW9yeSBvciBleHRlcm5hbCBidWZmZXJzLgorICBpbnQgdXNlX2V4dGVybmFsX3JlZmVyZW5jZV9idWZmZXJzOworICAvLyBUaGlzIGlzIG5lZWRlZCB0byBzdG9yZSB5X2J1ZmZlciwgdV9idWZmZXIsIGFuZCB2X2J1ZmZlciB3aGVuIHNldCByZWZlcmVuY2UKKyAgLy8gdXNlcyBhbiBleHRlcm5hbCByZWZlcm5lY2UsIGFuZCByZXN0b3JlIHRob3NlIGJ1ZmZlciBwb2ludGVycyBhZnRlciB0aGUKKyAgLy8gZXh0ZXJuYWwgcmVmZXJlbmNlIGZyYW1lIGlzIG5vIGxvbmdlciB1c2VkLgorICB1aW50OF90ICpzdG9yZV9idWZfYWRyWzNdOworCisgIC8vIElmIHRoZSBmcmFtZSBpcyBzdG9yZWQgaW4gYSAxNi1iaXQgYnVmZmVyLCB0aGlzIHN0b3JlcyBhbiA4LWJpdCB2ZXJzaW9uCisgIC8vIGZvciB1c2UgaW4gZ2xvYmFsIG1vdGlvbiBkZXRlY3Rpb24uIEl0IGlzIGFsbG9jYXRlZCBvbi1kZW1hbmQuCisgIHVpbnQ4X3QgKnlfYnVmZmVyXzhiaXQ7CisgIGludCBidWZfOGJpdF92YWxpZDsKKworICB1aW50OF90ICpidWZmZXJfYWxsb2M7CisgIHNpemVfdCBidWZmZXJfYWxsb2Nfc3o7CisgIGludCBib3JkZXI7CisgIHNpemVfdCBmcmFtZV9zaXplOworICBpbnQgc3Vic2FtcGxpbmdfeDsKKyAgaW50IHN1YnNhbXBsaW5nX3k7CisgIHVuc2lnbmVkIGludCBiaXRfZGVwdGg7CisgIGFvbV9jb2xvcl9wcmltYXJpZXNfdCBjb2xvcl9wcmltYXJpZXM7CisgIGFvbV90cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3NfdCB0cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3M7CisgIGFvbV9tYXRyaXhfY29lZmZpY2llbnRzX3QgbWF0cml4X2NvZWZmaWNpZW50czsKKyAgdWludDhfdCBtb25vY2hyb21lOworICBhb21fY2hyb21hX3NhbXBsZV9wb3NpdGlvbl90IGNocm9tYV9zYW1wbGVfcG9zaXRpb247CisgIGFvbV9jb2xvcl9yYW5nZV90IGNvbG9yX3JhbmdlOworICBpbnQgcmVuZGVyX3dpZHRoOworICBpbnQgcmVuZGVyX2hlaWdodDsKKworICBpbnQgY29ycnVwdGVkOworICBpbnQgZmxhZ3M7CisKKyNpZmRlZiBBTUwKKyAgICBpbnQzMl90IGluZGV4OworICAgIGludDMyX3QgZGVjb2RlX2lkeDsKKyAgICBpbnQzMl90IHNsaWNlX3R5cGU7CisgICAgaW50MzJfdCBSZWZOdW1fTDA7CisgICAgaW50MzJfdCBSZWZOdW1fTDE7CisgICAgaW50MzJfdCBudW1fcmVvcmRlcl9waWM7CisgICAgICAgIGludDMyX3Qgc3RyZWFtX29mZnNldDsKKyAgICB1aW50OF90IHJlZmVyZW5jZWQ7CisgICAgdWludDhfdCBvdXRwdXRfbWFyazsKKyAgICB1aW50OF90IHJlY29uX21hcms7CisgICAgdWludDhfdCBvdXRwdXRfcmVhZHk7CisgICAgdWludDhfdCBlcnJvcl9tYXJrOworICAgIC8qKi8KKyAgICBpbnQzMl90IHNsaWNlX2lkeDsKKyAgICAvKmJ1ZmZlciovCisgICAgdWludDMyX3QgZmdzX3RhYmxlX2FkcjsKKyNpZmRlZiBBT01fQVYxX01NVQorICAgIHVpbnQzMl90IGhlYWRlcl9hZHI7CisjZW5kaWYKKyNpZmRlZiBBT01fQVYxX01NVV9EVworICAgIHVpbnQzMl90IGhlYWRlcl9kd19hZHI7CisjZW5kaWYKKyAgICB1aW50MzJfdCBtcHJlZF9tdl93cl9zdGFydF9hZGRyOworICAgIHVpbnQzMl90IG1jX3lfYWRyOworICAgIHVpbnQzMl90IG1jX3Vfdl9hZHI7CisgICAgaW50MzJfdCBtY19jYW52YXNfeTsKKyAgICBpbnQzMl90IG1jX2NhbnZhc191X3Y7CisKKyAgICBpbnQzMl90IGxjdV90b3RhbDsKKyAgICAvKiovCisgICAgdW5zaWduZWQgaW50IG9yZGVyX2hpbnQ7CisjZW5kaWYKKyNpZmRlZiBBTUxfREVWSUNFCisgICAgIGludCBtdl9idWZfaW5kZXg7CisgICAgICB1bnNpZ25lZCBsb25nIGNtYV9hbGxvY19hZGRyOworICAgICAgaW50IEJVRl9pbmRleDsKKyAgICAgIGludCBidWZfc2l6ZTsKKyAgICAgIGludCBjb21wX2JvZHlfc2l6ZTsKKyAgICAgIHVuc2lnbmVkIGludCBkd195X2FkcjsKKyAgICAgIHVuc2lnbmVkIGludCBkd191X3ZfYWRyOworICAgICAgaW50IGRvdWJsZV93cml0ZV9tb2RlOworICAgICAgaW50IHlfY2FudmFzX2luZGV4OworICAgICAgaW50IHV2X2NhbnZhc19pbmRleDsKKyAgICAgIGludCB2Zl9yZWY7CisgIHN0cnVjdCBjYW52YXNfY29uZmlnX3MgY2FudmFzX2NvbmZpZ1syXTsKKyAgICBjaGFyICphdXhfZGF0YV9idWY7CisgICAgaW50IGF1eF9kYXRhX3NpemU7CisgICAgdTMyIHB0czsKKyAgdTY0IHB0czY0OworICAvKiBwaWN0dXJlIHFvcyBpbmZvbWF0aW9uKi8KKyAgaW50IG1heF9xcDsKKyAgaW50IGF2Z19xcDsKKyAgaW50IG1pbl9xcDsKKyAgaW50IG1heF9za2lwOworICBpbnQgYXZnX3NraXA7CisgIGludCBtaW5fc2tpcDsKKyAgaW50IG1heF9tdjsKKyAgaW50IG1pbl9tdjsKKyAgaW50IGF2Z19tdjsKKyNlbmRpZgorICB1NjQgdGltZXN0YW1wOworICB1MzIgaHdfZGVjb2RlX3RpbWU7CisgIHUzMiBmcmFtZV9zaXplMjsgLy8gRm9yIGZyYW1lIGJhc2UgbW9kZQorfSBQSUNfQlVGRkVSX0NPTkZJRzsKKworLyoKK2Zyb206Citjb21tb24vYmxvY2tkLmgKKyovCitUWVBFREVGIGVudW0geworICBLRVlfRlJBTUUgPSAwLAorICBJTlRFUl9GUkFNRSA9IDEsCisgIElOVFJBX09OTFlfRlJBTUUgPSAyLCAgLy8gcmVwbGFjZXMgaW50cmEtb25seQorICBTX0ZSQU1FID0gMywKKyAgRlJBTUVfVFlQRVMsCit9IFVFTlVNMUJZVEUoRlJBTUVfVFlQRSk7CisKKy8qZnJvbToKK212LmgKKyovCisjaWZkZWYgT1JJX0NPREUKK3R5cGVkZWYgc3RydWN0IG12MzIgeworICBpbnQzMl90IHJvdzsKKyAgaW50MzJfdCBjb2w7Cit9IE1WMzI7CisjZW5kaWYKKy8qZnJvbToKKyBhb21fZmlsdGVyLmgKKyovCisjZGVmaW5lIFNVQlBFTF9CSVRTIDQKKyNkZWZpbmUgU1VCUEVMX01BU0sgKCgxIDw8IFNVQlBFTF9CSVRTKSAtIDEpCisjZGVmaW5lIFNVQlBFTF9TSElGVFMgKDEgPDwgU1VCUEVMX0JJVFMpCisjZGVmaW5lIFNVQlBFTF9UQVBTIDgKKworI2RlZmluZSBTQ0FMRV9TVUJQRUxfQklUUyAxMAorI2RlZmluZSBTQ0FMRV9TVUJQRUxfU0hJRlRTICgxIDw8IFNDQUxFX1NVQlBFTF9CSVRTKQorI2RlZmluZSBTQ0FMRV9TVUJQRUxfTUFTSyAoU0NBTEVfU1VCUEVMX1NISUZUUyAtIDEpCisjZGVmaW5lIFNDQUxFX0VYVFJBX0JJVFMgKFNDQUxFX1NVQlBFTF9CSVRTIC0gU1VCUEVMX0JJVFMpCisjZGVmaW5lIFNDQUxFX0VYVFJBX09GRiAoKDEgPDwgU0NBTEVfRVhUUkFfQklUUykgLyAyKQorCisjZGVmaW5lIFJTX1NVQlBFTF9CSVRTIDYKKyNkZWZpbmUgUlNfU1VCUEVMX01BU0sgKCgxIDw8IFJTX1NVQlBFTF9CSVRTKSAtIDEpCisjZGVmaW5lIFJTX1NDQUxFX1NVQlBFTF9CSVRTIDE0CisjZGVmaW5lIFJTX1NDQUxFX1NVQlBFTF9NQVNLICgoMSA8PCBSU19TQ0FMRV9TVUJQRUxfQklUUykgLSAxKQorI2RlZmluZSBSU19TQ0FMRV9FWFRSQV9CSVRTIChSU19TQ0FMRV9TVUJQRUxfQklUUyAtIFJTX1NVQlBFTF9CSVRTKQorI2RlZmluZSBSU19TQ0FMRV9FWFRSQV9PRkYgKDEgPDwgKFJTX1NDQUxFX0VYVFJBX0JJVFMgLSAxKSkKKworLypmcm9tOgorc2NhbGUuaAorKi8KKyNkZWZpbmUgU0NBTEVfTlVNRVJBVE9SIDgKKworI2RlZmluZSBSRUZfU0NBTEVfU0hJRlQgMTQKKyNkZWZpbmUgUkVGX05PX1NDQUxFICgxIDw8IFJFRl9TQ0FMRV9TSElGVCkKKyNkZWZpbmUgUkVGX0lOVkFMSURfU0NBTEUgLTEKKworc3RydWN0IHNjYWxlX2ZhY3RvcnMgeworICBpbnQgeF9zY2FsZV9mcDsgIC8vIGhvcml6b250YWwgZml4ZWQgcG9pbnQgc2NhbGUgZmFjdG9yCisgIGludCB5X3NjYWxlX2ZwOyAgLy8gdmVydGljYWwgZml4ZWQgcG9pbnQgc2NhbGUgZmFjdG9yCisgIGludCB4X3N0ZXBfcTQ7CisgIGludCB5X3N0ZXBfcTQ7CisKKyAgaW50ICgqc2NhbGVfdmFsdWVfeCkoaW50IHZhbCwgY29uc3Qgc3RydWN0IHNjYWxlX2ZhY3RvcnMgKnNmKTsKKyAgaW50ICgqc2NhbGVfdmFsdWVfeSkoaW50IHZhbCwgY29uc3Qgc3RydWN0IHNjYWxlX2ZhY3RvcnMgKnNmKTsKKyNpZmRlZiBPUklfQ09ERQorICAvLyBjb252b2x2ZV9mbl9wdHJbc3VicGVsX3ggIT0gMF1bc3VicGVsX3kgIT0gMF1baXNfY29tcG91bmRdCisgIGFvbV9jb252b2x2ZV9mbl90IGNvbnZvbHZlWzJdWzJdWzJdOworICBhb21faGlnaGJkX2NvbnZvbHZlX2ZuX3QgaGlnaGJkX2NvbnZvbHZlWzJdWzJdWzJdOworI2VuZGlmCit9OworCisjaWZkZWYgT1JJX0NPREUKK01WMzIgYXYxX3NjYWxlX212KGNvbnN0IE1WICptdiwgaW50IHgsIGludCB5LCBjb25zdCBzdHJ1Y3Qgc2NhbGVfZmFjdG9ycyAqc2YpOworI2VuZGlmCit2b2lkIGF2MV9zZXR1cF9zY2FsZV9mYWN0b3JzX2Zvcl9mcmFtZShzdHJ1Y3Qgc2NhbGVfZmFjdG9ycyAqc2YsIGludCBvdGhlcl93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG90aGVyX2gsIGludCB0aGlzX3csIGludCB0aGlzX2gpOworCitzdGF0aWMgaW5saW5lIGludCBhdjFfaXNfdmFsaWRfc2NhbGUoY29uc3Qgc3RydWN0IHNjYWxlX2ZhY3RvcnMgKnNmKSB7CisjaWZkZWYgT1JJX0NPREUKKyAgYXNzZXJ0KHNmICE9IE5VTEwpOworI2VuZGlmCisgIHJldHVybiBzZi0+eF9zY2FsZV9mcCAhPSBSRUZfSU5WQUxJRF9TQ0FMRSAmJgorICAgICAgICAgc2YtPnlfc2NhbGVfZnAgIT0gUkVGX0lOVkFMSURfU0NBTEU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF2MV9pc19zY2FsZWQoY29uc3Qgc3RydWN0IHNjYWxlX2ZhY3RvcnMgKnNmKSB7CisjaWZkZWYgT1JJX0NPREUKKyAgYXNzZXJ0KHNmICE9IE5VTEwpOworI2VuZGlmCisgIHJldHVybiBhdjFfaXNfdmFsaWRfc2NhbGUoc2YpICYmCisgICAgICAgICAoc2YtPnhfc2NhbGVfZnAgIT0gUkVGX05PX1NDQUxFIHx8IHNmLT55X3NjYWxlX2ZwICE9IFJFRl9OT19TQ0FMRSk7Cit9CisKKworLyoKK2Zyb206Citjb21tb24vb255eGNfaW50LmgKKyovCisKKyNkZWZpbmUgQ0RFRl9NQVhfU1RSRU5HVEhTIDE2CisKKy8qIENvbnN0YW50IHZhbHVlcyB3aGlsZSB3YWl0aW5nIGZvciB0aGUgc2VxdWVuY2UgaGVhZGVyICovCisjZGVmaW5lIEZSQU1FX0lEX0xFTkdUSCAxNQorI2RlZmluZSBERUxUQV9GUkFNRV9JRF9MRU5HVEggMTQKKworI2RlZmluZSBGUkFNRV9DT05URVhUUyAoRlJBTUVfQlVGRkVSUyArIDEpCisvLyBFeHRyYSBmcmFtZSBjb250ZXh0IHdoaWNoIGlzIGFsd2F5cyBrZXB0IGF0IGRlZmF1bHQgdmFsdWVzCisjZGVmaW5lIEZSQU1FX0NPTlRFWFRfREVGQVVMVFMgKEZSQU1FX0NPTlRFWFRTIC0gMSkKKyNkZWZpbmUgUFJJTUFSWV9SRUZfQklUUyAzCisjZGVmaW5lIFBSSU1BUllfUkVGX05PTkUgNworCisjZGVmaW5lIE5VTV9QSU5HX1BPTkdfQlVGRkVSUyAyCisKKyNkZWZpbmUgTUFYX05VTV9URU1QT1JBTF9MQVlFUlMgOAorI2RlZmluZSBNQVhfTlVNX1NQQVRJQUxfTEFZRVJTIDQKKy8qIGNsYW5nLWZvcm1hdCBvZmYgKi8KKy8vIGNsYW5nLWZvcm1hdCBzZWVtcyB0byB0aGluayB0aGlzIGlzIGEgcG9pbnRlciBkZXJlZmVyZW5jZSBhbmQgbm90IGEKKy8vIG11bHRpcGxpY2F0aW9uLgorI2RlZmluZSBNQVhfTlVNX09QRVJBVElOR19QT0lOVFMgXAorICBNQVhfTlVNX1RFTVBPUkFMX0xBWUVSUyAqIE1BWF9OVU1fU1BBVElBTF9MQVlFUlMKKy8qIGNsYW5nLWZvcm1hdCBvbiovCisKKy8vIFRPRE8oamluZ25pbmcpOiBUdXJuaW5nIHRoaXMgb24gdG8gc2V0IHVwIHRyYW5zZm9ybSBjb2VmZmljaWVudAorLy8gcHJvY2Vzc2luZyB0aW1lci4KKyNkZWZpbmUgVFhDT0VGRl9USU1FUiAwCisjZGVmaW5lIFRYQ09FRkZfQ09TVF9USU1FUiAwCisKK1RZUEVERUYgZW51bSB7CisgIFNJTkdMRV9SRUZFUkVOQ0UgPSAwLAorICBDT01QT1VORF9SRUZFUkVOQ0UgPSAxLAorICBSRUZFUkVOQ0VfTU9ERV9TRUxFQ1QgPSAyLAorICBSRUZFUkVOQ0VfTU9ERVMgPSAzLAorfSBVRU5VTTFCWVRFKFJFRkVSRU5DRV9NT0RFKTsKKworVFlQRURFRiBlbnVtIHsKKyAgLyoqCisgICAqIEZyYW1lIGNvbnRleHQgdXBkYXRlcyBhcmUgZGlzYWJsZWQKKyAgICovCisgIFJFRlJFU0hfRlJBTUVfQ09OVEVYVF9ESVNBQkxFRCwKKyAgLyoqCisgICAqIFVwZGF0ZSBmcmFtZSBjb250ZXh0IHRvIHZhbHVlcyByZXN1bHRpbmcgZnJvbSBiYWNrd2FyZCBwcm9iYWJpbGl0eQorICAgKiB1cGRhdGVzIGJhc2VkIG9uIGVudHJvcHkvY291bnRzIGluIHRoZSBkZWNvZGVkIGZyYW1lCisgICAqLworICBSRUZSRVNIX0ZSQU1FX0NPTlRFWFRfQkFDS1dBUkQsCit9IFVFTlVNMUJZVEUoUkVGUkVTSF9GUkFNRV9DT05URVhUX01PREUpOworCisjZGVmaW5lIE1GTVZfU1RBQ0tfU0laRSAzCisKKyNpZmRlZiBBTUwKKyNkZWZpbmUgTVZfUkVGX1NJWkUgOAorI2VuZGlmCisKKyNpZmRlZiBPUklfQ09ERQordHlwZWRlZiBzdHJ1Y3QgeworICBpbnRfbXYgbWZtdjA7CisgIHVpbnQ4X3QgcmVmX2ZyYW1lX29mZnNldDsKK30gVFBMX01WX1JFRjsKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50X212IG12OworICBNVl9SRUZFUkVOQ0VfRlJBTUUgcmVmX2ZyYW1lOworfSBNVl9SRUY7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgUmVmQ250QnVmZmVyX3MgeworICAvLyBGb3IgYSBSZWZDbnRCdWZmZXIsIHRoZSBmb2xsb3dpbmcgYXJlIHJlZmVyZW5jZS1ob2xkaW5nIHZhcmlhYmxlczoKKyAgLy8gLSBjbS0+cmVmX2ZyYW1lX21hcFtdCisgIC8vIC0gY20tPmN1cl9mcmFtZQorICAvLyAtIGNtLT5zY2FsZWRfcmVmX2J1ZltdIChlbmNvZGVyIG9ubHkpCisgIC8vIC0gY20tPm5leHRfcmVmX2ZyYW1lX21hcFtdIChkZWNvZGVyIG9ubHkpCisgIC8vIC0gcGJpLT5vdXRwdXRfZnJhbWVfaW5kZXhbXSAoZGVjb2RlciBvbmx5KQorICAvLyBXaXRoIHRoYXQgZGVmaW5pdGlvbiwgJ3JlZl9jb3VudCcgaXMgdGhlIG51bWJlciBvZiByZWZlcmVuY2UtaG9sZGluZworICAvLyB2YXJpYWJsZXMgdGhhdCBhcmUgY3VycmVudGx5IHJlZmVyZW5jaW5nIHRoaXMgYnVmZmVyLgorICAvLyBGb3IgZXhhbXBsZToKKyAgLy8gLSBzdXBwb3NlIHRoaXMgYnVmZmVyIGlzIGF0IGluZGV4ICdrJyBpbiB0aGUgYnVmZmVyIHBvb2wsIGFuZAorICAvLyAtIFRvdGFsICduJyBvZiB0aGUgdmFyaWFibGVzIC8gYXJyYXkgZWxlbWVudHMgYWJvdmUgaGF2ZSB2YWx1ZSAnaycgKHRoYXQKKyAgLy8gaXMsIHRoZXkgYXJlIHBvaW50aW5nIHRvIGJ1ZmZlciBhdCBpbmRleCAnaycpLgorICAvLyBUaGVuLCBwb29sLT5mcmFtZV9idWZzW2tdLnJlZl9jb3VudCA9IG4uCisgIGludCByZWZfY291bnQ7CisKKyAgdW5zaWduZWQgaW50IG9yZGVyX2hpbnQ7CisgIHVuc2lnbmVkIGludCByZWZfb3JkZXJfaGludHNbSU5URVJfUkVGU19QRVJfRlJBTUVdOworCisgIGludCBpbnRyYV9vbmx5OworICBpbnQgc2VnbWVudGF0aW9uX2VuYWJsZWQ7CisgIHVuc2lnbmVkIGludCBzZWdtZW50X2ZlYXR1cmVbOF07CisjaWZkZWYgQU1MCisgIGludCBzZWdtZW50YXRpb25fdXBkYXRlX21hcDsKKyAgaW50IHByZXZfc2VnbWVudGF0aW9uX2VuYWJsZWQ7CisgIGludCBzZWdfbWlfcm93czsKKyAgaW50IHNlZ19taV9jb2xzOworCisgIHVuc2lnbmVkIGludCBzZWdfbGZfaW5mb195WzhdOworICB1bnNpZ25lZCBpbnQgc2VnX2xmX2luZm9fY1s4XTsKKyAgaW50OF90IHJlZl9kZWx0YXNbUkVGX0ZSQU1FU107CisgIGludDhfdCBtb2RlX2RlbHRhc1tNQVhfTU9ERV9MRl9ERUxUQVNdOworI2VuZGlmCisgIC8vTVZfUkVGICptdnM7CisgIHVpbnQ4X3QgKnNlZ19tYXA7CisjaWZkZWYgT1JJX0NPREUKKyAgc3RydWN0IHNlZ21lbnRhdGlvbiBzZWc7CisjZW5kaWYKKworICBpbnQgbWlfcm93czsKKyAgaW50IG1pX2NvbHM7CisgIC8vIFdpZHRoIGFuZCBoZWlnaHQgZ2l2ZSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIChiZWZvcmUgYW55IHVwc2NhbGluZywgdW5saWtlCisgIC8vIHRoZSBzaXplcyB0aGF0IGNhbiBiZSBkZXJpdmVkIGZyb20gdGhlIGJ1ZiBzdHJ1Y3R1cmUpCisgIGludCB3aWR0aDsKKyAgaW50IGhlaWdodDsKKyNpZmRlZiBPUklfQ09ERQorICBXYXJwZWRNb3Rpb25QYXJhbXMgZ2xvYmFsX21vdGlvbltSRUZfRlJBTUVTXTsKKyNlbmRpZgorICBpbnQgc2hvd2FibGVfZnJhbWU7ICAvLyBmcmFtZSBjYW4gYmUgdXNlZCBhcyBzaG93IGV4aXN0aW5nIGZyYW1lIGluIGZ1dHVyZQorICB1aW50OF90IGZpbG1fZ3JhaW5fcGFyYW1zX3ByZXNlbnQ7CisjaWZkZWYgT1JJX0NPREUKKyAgYW9tX2ZpbG1fZ3JhaW5fdCBmaWxtX2dyYWluX3BhcmFtczsKKyNlbmRpZgorI2lmZGVmIEFNTAorICBpbnQgZGVjX3dpZHRoOworICB1aW50OF90IGZpbG1fZ3JhaW5fcmVnX3ZhbGlkOworICB1aW50MzJfdCBmaWxtX2dyYWluX3JlZ1tGSUxNX0dSQUlOX1JFR19TSVpFXTsKKyNlbmRpZgorICBhb21fY29kZWNfZnJhbWVfYnVmZmVyX3QgcmF3X2ZyYW1lX2J1ZmZlcjsKKyAgUElDX0JVRkZFUl9DT05GSUcgYnVmOworI2lmZGVmIE9SSV9DT0RFCisgIGhhc2hfdGFibGUgaGFzaF90YWJsZTsKKyNlbmRpZgorICBGUkFNRV9UWVBFIGZyYW1lX3R5cGU7CisKKyAgLy8gVGhpcyBpcyBvbmx5IHVzZWQgaW4gdGhlIGVuY29kZXIgYnV0IG5lZWRzIHRvIGJlIGluZGV4ZWQgcGVyIHJlZiBmcmFtZQorICAvLyBzbyBpdCdzIGV4dHJlbWVseSBjb252ZW5pZW50IHRvIGtlZXAgaXQgaGVyZS4KKyNpZmRlZiBPUklfQ09ERQorICBpbnQgaW50ZXJwX2ZpbHRlcl9zZWxlY3RlZFtTV0lUQ0hBQkxFXTsKKyNlbmRpZgorICAvLyBJbnRlciBmcmFtZSByZWZlcmVuY2UgZnJhbWUgZGVsdGEgZm9yIGxvb3AgZmlsdGVyCisjaWZuZGVmIEFNTAorICBpbnQ4X3QgcmVmX2RlbHRhc1tSRUZfRlJBTUVTXTsKKyNlbmRpZgorI2lmZGVmIE9SSV9DT0RFCisgIC8vIDAgPSBaRVJPX01WLCBNVgorICBpbnQ4X3QgbW9kZV9kZWx0YXNbTUFYX01PREVfTEZfREVMVEFTXTsKKworICBGUkFNRV9DT05URVhUIGZyYW1lX2NvbnRleHQ7CisjZW5kaWYKKyAgaW50IHNob3dfZnJhbWU7Cit9IFJlZkNudEJ1ZmZlcjsKKwordHlwZWRlZiBzdHJ1Y3QgQnVmZmVyUG9vbF9zIHsKKy8vIFByb3RlY3QgQnVmZmVyUG9vbCBmcm9tIGJlaW5nIGFjY2Vzc2VkIGJ5IHNldmVyYWwgRnJhbWVXb3JrZXJzIGF0CisvLyB0aGUgc2FtZSB0aW1lIGR1cmluZyBmcmFtZSBwYXJhbGxlbCBkZWNvZGUuCisvLyBUT0RPKGhrdWFuZyk6IFRyeSB0byB1c2UgYXRvbWljIHZhcmlhYmxlIGluc3RlYWQgb2YgbG9ja2luZyB0aGUgd2hvbGUgcG9vbC4KKy8vIFRPRE8od3RjKTogUmVtb3ZlIHRoaXMuIFNlZQorLy8gaHR0cHM6Ly9jaHJvbWl1bS1yZXZpZXcuZ29vZ2xlc291cmNlLmNvbS9jL3dlYm0vbGlidnB4LysvNTYwNjMwLgorI2lmIENPTkZJR19NVUxUSVRIUkVBRAorICBwdGhyZWFkX211dGV4X3QgcG9vbF9tdXRleDsKKyNlbmRpZgorCisgIC8vIFByaXZhdGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGZyYW1lIGJ1ZmZlciBjYWxsYmFja3MuCisgIHZvaWQgKmNiX3ByaXY7CisjaWZkZWYgT1JJX0NPREUKKyAgYW9tX2dldF9mcmFtZV9idWZmZXJfY2JfZm5fdCBnZXRfZmJfY2I7CisgIGFvbV9yZWxlYXNlX2ZyYW1lX2J1ZmZlcl9jYl9mbl90IHJlbGVhc2VfZmJfY2I7CisjZW5kaWYKKyAgUmVmQ250QnVmZmVyIGZyYW1lX2J1ZnNbRlJBTUVfQlVGRkVSU107CisKKyNpZmRlZiBPUklfQ09ERQorICAvLyBGcmFtZSBidWZmZXJzIGFsbG9jYXRlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb2RlYy4KKyAgSW50ZXJuYWxGcmFtZUJ1ZmZlckxpc3QgaW50X2ZyYW1lX2J1ZmZlcnM7CisjZW5kaWYKKyNpZmRlZiBBTUxfREVWSUNFCisgICAgc3BpbmxvY2tfdCBsb2NrOworI2VuZGlmCit9IEJ1ZmZlclBvb2w7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IGNkZWZfcHJpX2RhbXBpbmc7CisgIGludCBjZGVmX3NlY19kYW1waW5nOworICBpbnQgbmJfY2RlZl9zdHJlbmd0aHM7CisgIGludCBjZGVmX3N0cmVuZ3Roc1tDREVGX01BWF9TVFJFTkdUSFNdOworICBpbnQgY2RlZl91dl9zdHJlbmd0aHNbQ0RFRl9NQVhfU1RSRU5HVEhTXTsKKyAgaW50IGNkZWZfYml0czsKK30gQ2RlZkluZm87CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IGRlbHRhX3FfcHJlc2VudF9mbGFnOworICAvLyBSZXNvbHV0aW9uIG9mIGRlbHRhIHF1YW50CisgIGludCBkZWx0YV9xX3JlczsKKyAgaW50IGRlbHRhX2xmX3ByZXNlbnRfZmxhZzsKKyAgLy8gUmVzb2x1dGlvbiBvZiBkZWx0YSBsZiBsZXZlbAorICBpbnQgZGVsdGFfbGZfcmVzOworICAvLyBUaGlzIGlzIGEgZmxhZyBmb3IgbnVtYmVyIG9mIGRlbHRhcyBvZiBsb29wIGZpbHRlciBsZXZlbAorICAvLyAwOiB1c2UgMSBkZWx0YSwgZm9yIHlfdmVydGljYWwsIHlfaG9yaXpvbnRhbCwgdSwgYW5kIHYKKyAgLy8gMTogdXNlIHNlcGFyYXRlIGRlbHRhcyBmb3IgZWFjaCBmaWx0ZXIgbGV2ZWwKKyAgaW50IGRlbHRhX2xmX211bHRpOworfSBEZWx0YVFJbmZvOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBlbmFibGVfb3JkZXJfaGludDsgICAgICAgICAgIC8vIDAgLSBkaXNhYmxlIG9yZGVyIGhpbnQsIGFuZCByZWxhdGVkIHRvb2xzCisgIGludCBvcmRlcl9oaW50X2JpdHNfbWludXNfMTsgICAgIC8vIGRpc3Rfd3RkX2NvbXAsIHJlZl9mcmFtZV9tdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyYW1lX3NpZ25fYmlhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAwLCBlbmFibGVfZGlzdF93dGRfY29tcCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5hYmxlX3JlZl9mcmFtZV9tdnMgbXVzdCBiZSBzZXQgYXMgMC4KKyAgaW50IGVuYWJsZV9kaXN0X3d0ZF9jb21wOyAgICAgICAgLy8gMCAtIGRpc2FibGUgZGlzdC13dGQgY29tcG91bmQgbW9kZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMSAtIGVuYWJsZSBpdAorICBpbnQgZW5hYmxlX3JlZl9mcmFtZV9tdnM7ICAgICAgICAvLyAwIC0gZGlzYWJsZSByZWYgZnJhbWUgbXZzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgLSBlbmFibGUgaXQKK30gT3JkZXJIaW50SW5mbzsKKworLy8gU2VxdWVuY2UgaGVhZGVyIHN0cnVjdHVyZS4KKy8vIE5vdGU6IEFsbCBzeW50YXggZWxlbWVudHMgb2Ygc2VxdWVuY2VfaGVhZGVyX29idSB0aGF0IG5lZWQgdG8gYmUKKy8vIGJpdC1pZGVudGljYWwgYWNyb3NzIG11bHRpcGxlIHNlcXVlbmNlIGhlYWRlcnMgbXVzdCBiZSBwYXJ0IG9mIHRoaXMgc3RydWN0LAorLy8gc28gdGhhdCBjb25zaXN0ZW5jeSBpcyBjaGVja2VkIGJ5IGFyZV9zZXFfaGVhZGVyc19jb25zaXN0ZW50KCkgZnVuY3Rpb24uCit0eXBlZGVmIHN0cnVjdCBTZXF1ZW5jZUhlYWRlciB7CisgIGludCBudW1fYml0c193aWR0aDsKKyAgaW50IG51bV9iaXRzX2hlaWdodDsKKyAgaW50IG1heF9mcmFtZV93aWR0aDsKKyAgaW50IG1heF9mcmFtZV9oZWlnaHQ7CisgIHVpbnQ4X3QgZnJhbWVfaWRfbnVtYmVyc19wcmVzZW50X2ZsYWc7CisgIGludCBmcmFtZV9pZF9sZW5ndGg7CisgIGludCBkZWx0YV9mcmFtZV9pZF9sZW5ndGg7CisgIEJMT0NLX1NJWkUyIHNiX3NpemU7ICAvLyBTaXplIG9mIHRoZSBzdXBlcmJsb2NrIHVzZWQgZm9yIHRoaXMgZnJhbWUKKyAgaW50IG1pYl9zaXplOyAgICAgICAgLy8gU2l6ZSBvZiB0aGUgc3VwZXJibG9jayBpbiB1bml0cyBvZiBNSSBibG9ja3MKKyAgaW50IG1pYl9zaXplX2xvZzI7ICAgLy8gTG9nIDIgb2YgYWJvdmUuCisKKyAgT3JkZXJIaW50SW5mbyBvcmRlcl9oaW50X2luZm87CisKKyAgdWludDhfdCBmb3JjZV9zY3JlZW5fY29udGVudF90b29sczsgIC8vIDAgLSBmb3JjZSBvZmYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgLSBmb3JjZSBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMiAtIGFkYXB0aXZlCisgIHVpbnQ4X3Qgc3RpbGxfcGljdHVyZTsgICAgICAgICAgICAgICAvLyBWaWRlbyBpcyBhIHNpbmdsZSBmcmFtZSBzdGlsbCBwaWN0dXJlCisgIHVpbnQ4X3QgcmVkdWNlZF9zdGlsbF9waWN0dXJlX2hkcjsgICAvLyBVc2UgcmVkdWNlZCBoZWFkZXIgZm9yIHN0aWxsIHBpY3R1cmUKKyAgdWludDhfdCBmb3JjZV9pbnRlZ2VyX212OyAgICAgICAgICAgIC8vIDAgLSBEb24ndCBmb3JjZS4gTVYgY2FuIHVzZSBzdWJwZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgLSBmb3JjZSB0byBpbnRlZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyIC0gYWRhcHRpdmUKKyAgdWludDhfdCBlbmFibGVfZmlsdGVyX2ludHJhOyAgICAgICAgIC8vIGVuYWJsZXMvZGlzYWJsZXMgZmlsdGVyaW50cmEKKyAgdWludDhfdCBlbmFibGVfaW50cmFfZWRnZV9maWx0ZXI7ICAgIC8vIGVuYWJsZXMvZGlzYWJsZXMgZWRnZSB1cHNhbXBsaW5nCisgIHVpbnQ4X3QgZW5hYmxlX2ludGVyaW50cmFfY29tcG91bmQ7ICAvLyBlbmFibGVzL2Rpc2FibGVzIGludGVyaW50cmFfY29tcG91bmQKKyAgdWludDhfdCBlbmFibGVfbWFza2VkX2NvbXBvdW5kOyAgICAgIC8vIGVuYWJsZXMvZGlzYWJsZXMgbWFza2VkIGNvbXBvdW5kCisgIHVpbnQ4X3QgZW5hYmxlX2R1YWxfZmlsdGVyOyAgICAgICAgICAvLyAwIC0gZGlzYWJsZSBkdWFsIGludGVycG9sYXRpb24gZmlsdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxIC0gZW5hYmxlIHZlcnQvaG9yeiBmaWx0ZXIgc2VsZWN0aW9uCisgIHVpbnQ4X3QgZW5hYmxlX3dhcnBlZF9tb3Rpb247ICAgICAgICAvLyAwIC0gZGlzYWJsZSB3YXJwIGZvciB0aGUgc2VxdWVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgLSBlbmFibGUgd2FycCBmb3IgdGhlIHNlcXVlbmNlCisgIHVpbnQ4X3QgZW5hYmxlX3N1cGVycmVzOyAgICAgICAgICAgICAvLyAwIC0gRGlzYWJsZSBzdXBlcnJlcyBmb3IgdGhlIHNlcXVlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYW5kIG5vIGZyYW1lIGxldmVsIHN1cGVycmVzIGZsYWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgLSBFbmFibGUgc3VwZXJyZXMgZm9yIHRoZSBzZXF1ZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGVuYWJsZSBwZXItZnJhbWUgc3VwZXJyZXMgZmxhZworICB1aW50OF90IGVuYWJsZV9jZGVmOyAgICAgICAgICAgICAgICAgLy8gVG8gdHVybiBvbi9vZmYgQ0RFRgorICB1aW50OF90IGVuYWJsZV9yZXN0b3JhdGlvbjsgICAgICAgICAgLy8gVG8gdHVybiBvbi9vZmYgbG9vcCByZXN0b3JhdGlvbgorICBCSVRTVFJFQU1fUFJPRklMRSBwcm9maWxlOworCisgIC8vIE9wZXJhdGluZyBwb2ludCBpbmZvLgorICBpbnQgb3BlcmF0aW5nX3BvaW50c19jbnRfbWludXNfMTsKKyAgaW50IG9wZXJhdGluZ19wb2ludF9pZGNbTUFYX05VTV9PUEVSQVRJTkdfUE9JTlRTXTsKKyAgdWludDhfdCBkaXNwbGF5X21vZGVsX2luZm9fcHJlc2VudF9mbGFnOworICB1aW50OF90IGRlY29kZXJfbW9kZWxfaW5mb19wcmVzZW50X2ZsYWc7CisgIEFWMV9MRVZFTCBzZXFfbGV2ZWxfaWR4W01BWF9OVU1fT1BFUkFUSU5HX1BPSU5UU107CisgIHVpbnQ4X3QgdGllcltNQVhfTlVNX09QRVJBVElOR19QT0lOVFNdOyAgLy8gc2VxX3RpZXIgaW4gdGhlIHNwZWMuIE9uZSBiaXQ6IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciAxLgorCisgIC8vIENvbG9yIGNvbmZpZy4KKyAgYW9tX2JpdF9kZXB0aF90IGJpdF9kZXB0aDsgIC8vIEFPTV9CSVRTXzggaW4gcHJvZmlsZSAwIG9yIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBT01fQklUU18xMCBvciBBT01fQklUU18xMiBpbiBwcm9maWxlIDIgb3IgMy4KKyAgdWludDhfdCB1c2VfaGlnaGJpdGRlcHRoOyAgIC8vIElmIHRydWUsIHdlIG5lZWQgdG8gdXNlIDE2Yml0IGZyYW1lIGJ1ZmZlcnMuCisgIHVpbnQ4X3QgbW9ub2Nocm9tZTsgICAgICAgICAvLyBNb25vY2hvcm1lIHZpZGVvCisgIGFvbV9jb2xvcl9wcmltYXJpZXNfdCBjb2xvcl9wcmltYXJpZXM7CisgIGFvbV90cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3NfdCB0cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3M7CisgIGFvbV9tYXRyaXhfY29lZmZpY2llbnRzX3QgbWF0cml4X2NvZWZmaWNpZW50czsKKyAgaW50IGNvbG9yX3JhbmdlOworICBpbnQgc3Vic2FtcGxpbmdfeDsgICAgICAgICAgLy8gQ2hyb21hIHN1YnNhbXBsaW5nIGZvciB4CisgIGludCBzdWJzYW1wbGluZ195OyAgICAgICAgICAvLyBDaHJvbWEgc3Vic2FtcGxpbmcgZm9yIHkKKyAgYW9tX2Nocm9tYV9zYW1wbGVfcG9zaXRpb25fdCBjaHJvbWFfc2FtcGxlX3Bvc2l0aW9uOworICB1aW50OF90IHNlcGFyYXRlX3V2X2RlbHRhX3E7CisgIHVpbnQ4X3QgZmlsbV9ncnlfZGVxdWFudF9RVFhhaW5fcGFyYW1zX3ByZXNlbnQ7Cit9IFNlcXVlbmNlSGVhZGVyOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHNraXBfbW9kZV9hbGxvd2VkOworICAgIGludCBza2lwX21vZGVfZmxhZzsKKyAgICBpbnQgcmVmX2ZyYW1lX2lkeF8wOworICAgIGludCByZWZfZnJhbWVfaWR4XzE7Cit9IFNraXBNb2RlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBGUkFNRV9UWVBFIGZyYW1lX3R5cGU7CisgIFJFRkVSRU5DRV9NT0RFIHJlZmVyZW5jZV9tb2RlOworCisgIHVuc2lnbmVkIGludCBvcmRlcl9oaW50OworICB1bnNpZ25lZCBpbnQgZnJhbWVfbnVtYmVyOworICBTa2lwTW9kZUluZm8gc2tpcF9tb2RlX2luZm87CisgIGludCByZWZyZXNoX2ZyYW1lX2ZsYWdzOyAgLy8gV2hpY2ggcmVmIGZyYW1lcyBhcmUgb3ZlcndyaXR0ZW4gYnkgdGhpcyBmcmFtZQorICBpbnQgZnJhbWVfcmVmc19zaG9ydF9zaWduYWxpbmc7Cit9IEN1cnJlbnRGcmFtZTsKKwordHlwZWRlZiBzdHJ1Y3QgQVYxX0NvbW1vbl9zIHsKKyAgQ3VycmVudEZyYW1lIGN1cnJlbnRfZnJhbWU7CisgIHN0cnVjdCBhb21faW50ZXJuYWxfZXJyb3JfaW5mbyBlcnJvcjsKKyAgaW50IHdpZHRoOworICBpbnQgaGVpZ2h0OworICBpbnQgcmVuZGVyX3dpZHRoOworICBpbnQgcmVuZGVyX2hlaWdodDsKKyAgaW50IHRpbWluZ19pbmZvX3ByZXNlbnQ7CisgIGFvbV90aW1pbmdfaW5mb190IHRpbWluZ19pbmZvOworICBpbnQgYnVmZmVyX3JlbW92YWxfdGltZV9wcmVzZW50OworICBhb21fZGVjX21vZGVsX2luZm9fdCBidWZmZXJfbW9kZWw7CisgIGFvbV9kZWNfbW9kZWxfb3BfcGFyYW1ldGVyc190IG9wX3BhcmFtc1tNQVhfTlVNX09QRVJBVElOR19QT0lOVFMgKyAxXTsKKyAgYW9tX29wX3RpbWluZ19pbmZvX3Qgb3BfZnJhbWVfdGltaW5nW01BWF9OVU1fT1BFUkFUSU5HX1BPSU5UUyArIDFdOworICB1aW50MzJfdCBmcmFtZV9wcmVzZW50YXRpb25fdGltZTsKKworICBpbnQgY29udGV4dF91cGRhdGVfdGlsZV9pZDsKKyNpZmRlZiBTVVBQT1JUX1NDQUxFX0ZBQ1RPUgorICAvLyBTY2FsZSBvZiB0aGUgY3VycmVudCBmcmFtZSB3aXRoIHJlc3BlY3QgdG8gaXRzZWxmLgorICBzdHJ1Y3Qgc2NhbGVfZmFjdG9ycyBzZl9pZGVudGl0eTsKKyNlbmRpZgorICBSZWZDbnRCdWZmZXIgKnByZXZfZnJhbWU7CisKKyAgLy8gVE9ETyhoa3VhbmcpOiBDb21iaW5lIHRoaXMgd2l0aCBjdXJfYnVmIGluIG1hY3JvYmxvY2tkLgorICBSZWZDbnRCdWZmZXIgKmN1cl9mcmFtZTsKKworICAvLyBGb3IgZW5jb2Rlciwgd2UgaGF2ZSBhIHR3by1sZXZlbCBtYXBwaW5nIGZyb20gcmVmZXJlbmNlIGZyYW1lIHR5cGUgdG8gdGhlCisgIC8vIGNvcnJlc3BvbmRpbmcgYnVmZmVyIGluIHRoZSBidWZmZXIgcG9vbDoKKyAgLy8gKiAncmVtYXBwZWRfcmVmX2lkeFtpIC0gMV0nIG1hcHMgcmVmZXJlbmNlIHR5cGUgJ2knIChyYW5nZTogTEFTVF9GUkFNRSAuLi4KKyAgLy8gRVhUUkVGX0ZSQU1FKSB0byBhIHJlbWFwcGVkIGluZGV4ICdqJyAoaW4gcmFuZ2U6IDAgLi4uIFJFRl9GUkFNRVMgLSAxKQorICAvLyAqIExhdGVyLCAnY20tPnJlZl9mcmFtZV9tYXBbal0nIG1hcHMgdGhlIHJlbWFwcGVkIGluZGV4ICdqJyB0byBhIHBvaW50ZXIgdG8KKyAgLy8gdGhlIHJlZmVyZW5jZSBjb3VudGVkIGJ1ZmZlciBzdHJ1Y3R1cmUgUmVmQ250QnVmZmVyLCB0YWtlbiBmcm9tIHRoZSBidWZmZXIKKyAgLy8gcG9vbCBjbS0+YnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnMuCisgIC8vCisgIC8vIExBU1RfRlJBTUUsICAgICAgICAgICAgICAgICAgICAgICAgLi4uLCAgICAgIEVYVFJFRl9GUkFNRQorICAvLyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAvLyAgICAgIHYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdgorICAvLyByZW1hcHBlZF9yZWZfaWR4W0xBU1RfRlJBTUUgLSAxXSwgIC4uLiwgIHJlbWFwcGVkX3JlZl9pZHhbRVhUUkVGX0ZSQU1FIC0gMV0KKyAgLy8gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgLy8gICAgICB2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYKKyAgLy8gcmVmX2ZyYW1lX21hcFtdLCAgICAgICAgICAgICAgICAgICAuLi4sICAgICByZWZfZnJhbWVfbWFwW10KKyAgLy8KKyAgLy8gTm90ZTogSU5UUkFfRlJBTUUgYWx3YXlzIHJlZmVycyB0byB0aGUgY3VycmVudCBmcmFtZSwgc28gdGhlcmUncyBubyBuZWVkIHRvCisgIC8vIGhhdmUgYSByZW1hcHBlZCBpbmRleCBmb3IgdGhlIHNhbWUuCisgIGludCByZW1hcHBlZF9yZWZfaWR4W1JFRl9GUkFNRVNdOworCisjaWZkZWYgU1VQUE9SVF9TQ0FMRV9GQUNUT1IKKyAgc3RydWN0IHNjYWxlX2ZhY3RvcnMgcmVmX3NjYWxlX2ZhY3RvcnNbUkVGX0ZSQU1FU107CisjZW5kaWYKKyAgLy8gRm9yIGRlY29kZXIsIHJlZl9mcmFtZV9tYXBbaV0gbWFwcyByZWZlcmVuY2UgdHlwZSAnaScgdG8gYSBwb2ludGVyIHRvCisgIC8vIHRoZSBidWZmZXIgaW4gdGhlIGJ1ZmZlciBwb29sICdjbS0+YnVmZmVyX3Bvb2wuZnJhbWVfYnVmcycuCisgIC8vIEZvciBlbmNvZGVyLCByZWZfZnJhbWVfbWFwW2pdICh3aGVyZSBqID0gcmVtYXBwZWRfcmVmX2lkeFtpXSkgbWFwcworICAvLyByZW1hcHBlZCByZWZlcmVuY2UgaW5kZXggJ2onICh0aGF0IGlzLCBvcmlnaW5hbCByZWZlcmVuY2UgdHlwZSAnaScpIHRvCisgIC8vIGEgcG9pbnRlciB0byB0aGUgYnVmZmVyIGluIHRoZSBidWZmZXIgcG9vbCAnY20tPmJ1ZmZlcl9wb29sLmZyYW1lX2J1ZnMnLgorICBSZWZDbnRCdWZmZXIgKnJlZl9mcmFtZV9tYXBbUkVGX0ZSQU1FU107CisKKyAgLy8gUHJlcGFyZSByZWZfZnJhbWVfbWFwIGZvciB0aGUgbmV4dCBmcmFtZS4KKyAgLy8gT25seSB1c2VkIGluIGZyYW1lIHBhcmFsbGVsIGRlY29kZS4KKyAgUmVmQ250QnVmZmVyICpuZXh0X3JlZl9mcmFtZV9tYXBbUkVGX0ZSQU1FU107CisjaWZkZWYgQU1MCisgIFJlZkNudEJ1ZmZlciAqbmV4dF91c2VkX3JlZl9mcmFtZV9tYXBbUkVGX0ZSQU1FU107CisjZW5kaWYKKyAgRlJBTUVfVFlQRSBsYXN0X2ZyYW1lX3R5cGU7IC8qIGxhc3QgZnJhbWUncyBmcmFtZSB0eXBlIGZvciBtb3Rpb24gc2VhcmNoLiovCisKKyAgaW50IHNob3dfZnJhbWU7CisgIGludCBzaG93YWJsZV9mcmFtZTsgIC8vIGZyYW1lIGNhbiBiZSB1c2VkIGFzIHNob3cgZXhpc3RpbmcgZnJhbWUgaW4gZnV0dXJlCisgIGludCBzaG93X2V4aXN0aW5nX2ZyYW1lOworCisgIHVpbnQ4X3QgZGlzYWJsZV9jZGZfdXBkYXRlOworICBpbnQgYWxsb3dfaGlnaF9wcmVjaXNpb25fbXY7CisgIHVpbnQ4X3QgY3VyX2ZyYW1lX2ZvcmNlX2ludGVnZXJfbXY7ICAvLyAwIHRoZSBkZWZhdWx0IGluIEFPTSwgMSBvbmx5IGludGVnZXIKKworICB1aW50OF90IGFsbG93X3NjcmVlbl9jb250ZW50X3Rvb2xzOworICBpbnQgYWxsb3dfaW50cmFiYzsKKyAgaW50IGFsbG93X3dhcnBlZF9tb3Rpb247CisKKyAgLy8gTUJzLCBtYl9yb3dzL2NvbHMgaXMgaW4gMTYtcGl4ZWwgdW5pdHM7IG1pX3Jvd3MvY29scyBpcyBpbgorICAvLyBNQl9NT0RFX0lORk8gKDgtcGl4ZWwpIHVuaXRzLgorICBpbnQgTUJzOworICBpbnQgbWJfcm93cywgbWlfcm93czsKKyAgaW50IG1iX2NvbHMsIG1pX2NvbHM7CisgIGludCBtaV9zdHJpZGU7CisKKyAgLyogcHJvZmlsZSBzZXR0aW5ncyAqLworICBUWF9NT0RFIHR4X21vZGU7CisKKyNpZiBDT05GSUdfRU5UUk9QWV9TVEFUUworICBpbnQgY29lZl9jZGZfY2F0ZWdvcnk7CisjZW5kaWYKKworICBpbnQgYmFzZV9xaW5kZXg7CisgIGludCB5X2RjX2RlbHRhX3E7CisgIGludCB1X2RjX2RlbHRhX3E7CisgIGludCB2X2RjX2RlbHRhX3E7CisgIGludCB1X2FjX2RlbHRhX3E7CisgIGludCB2X2FjX2RlbHRhX3E7CisKKyNpZmRlZiBPUklfQ09ERQorICAvLyBUaGUgZGVxdWFudGl6ZXJzIGJlbG93IGFyZSB0cnVlIGRlcXVhbnRpemVycyB1c2VkIG9ubHkgaW4gdGhlCisgIC8vIGRlcXVhbnRpemF0aW9uIHByb2Nlc3MuICBUaGV5IGhhdmUgdGhlIHNhbWUgY29lZmZpY2llbnQKKyAgLy8gc2hpZnQvc2NhbGUgYXMgVFguCisgIGludDE2X3QgeV9kZXF1YW50X1FUWFtNQVhfU0VHTUVOVFNdWzJdOworICBpbnQxNl90IHVfZGVxdWFudF9RVFhbTUFYX1NFR01FTlRTXVsyXTsKKyAgaW50MTZfdCB2X2RlcXVhbnRfUVRYW01BWF9TRUdNRU5UU11bMl07CisKKyAgLy8gR2xvYmFsIHF1YW50IG1hdHJpeCB0YWJsZXMKKyAgY29uc3QgcW1fdmFsX3QgKmdpcW1hdHJpeFtOVU1fUU1fTEVWRUxTXVszXVtUWF9TSVpFU19BTExdOworICBjb25zdCBxbV92YWxfdCAqZ3FtYXRyaXhbTlVNX1FNX0xFVkVMU11bM11bVFhfU0laRVNfQUxMXTsKKworICAvLyBMb2NhbCBxdWFudCBtYXRyaXggdGFibGVzIGZvciBlYWNoIGZyYW1lCisgIGNvbnN0IHFtX3ZhbF90ICp5X2lxbWF0cml4W01BWF9TRUdNRU5UU11bVFhfU0laRVNfQUxMXTsKKyAgY29uc3QgcW1fdmFsX3QgKnVfaXFtYXRyaXhbTUFYX1NFR01FTlRTXVtUWF9TSVpFU19BTExdOworICBjb25zdCBxbV92YWxfdCAqdl9pcW1hdHJpeFtNQVhfU0VHTUVOVFNdW1RYX1NJWkVTX0FMTF07CisjZW5kaWYKKyAgLy8gRW5jb2RlcgorICBpbnQgdXNpbmdfcW1hdHJpeDsKKyAgaW50IHFtX3k7CisgIGludCBxbV91OworICBpbnQgcW1fdjsKKyAgaW50IG1pbl9xbWxldmVsOworICBpbnQgbWF4X3FtbGV2ZWw7CisgIGludCB1c2VfcXVhbnRfYl9hZGFwdDsKKworICAvKiBXZSBhbGxvY2F0ZSBhIE1CX01PREVfSU5GTyBzdHJ1Y3QgZm9yIGVhY2ggbWFjcm9ibG9jaywgdG9nZXRoZXIgd2l0aAorICAgICBhbiBleHRyYSByb3cgb24gdG9wIGFuZCBjb2x1bW4gb24gdGhlIGxlZnQgdG8gc2ltcGxpZnkgcHJlZGljdGlvbi4gKi8KKyAgaW50IG1pX2FsbG9jX3NpemU7CisKKyNpZmRlZiBPUklfQ09ERQorICBNQl9NT0RFX0lORk8gKm1pcDsgLyogQmFzZSBvZiBhbGxvY2F0ZWQgYXJyYXkgKi8KKyAgTUJfTU9ERV9JTkZPICptaTsgIC8qIENvcnJlc3BvbmRzIHRvIHVwcGVyIGxlZnQgdmlzaWJsZSBtYWNyb2Jsb2NrICovCisKKyAgLy8gVE9ETyhhZ3JhbmdlKTogTW92ZSBwcmV2X21pIGludG8gZW5jb2RlciBzdHJ1Y3R1cmUuCisgIC8vIHByZXZfbWlwIGFuZCBwcmV2X21pIHdpbGwgb25seSBiZSBhbGxvY2F0ZWQgaW4gZW5jb2Rlci4KKyAgTUJfTU9ERV9JTkZPICpwcmV2X21pcDsgLyogTUJfTU9ERV9JTkZPIGFycmF5ICdtaXAnIGZyb20gbGFzdCBkZWNvZGVkIGZyYW1lICovCisgIE1CX01PREVfSU5GTyAqcHJldl9taTsgIC8qICdtaScgZnJvbSBsYXN0IGZyYW1lIChwb2ludHMgaW50byBwcmV2X21pcCkgKi8KKworICAvLyBTZXBhcmF0ZSBtaSBmdW5jdGlvbnMgYmV0d2VlbiBlbmNvZGVyIGFuZCBkZWNvZGVyLgorICBpbnQgKCphbGxvY19taSkoc3RydWN0IEFWMUNvbW1vbiAqY20sIGludCBtaV9zaXplKTsKKyAgdm9pZCAoKmZyZWVfbWkpKHN0cnVjdCBBVjFDb21tb24gKmNtKTsKKyAgdm9pZCAoKnNldHVwX21pKShzdHJ1Y3QgQVYxQ29tbW9uICpjbSk7CisKKyAgLy8gR3JpZCBvZiBwb2ludGVycyB0byA4eDggTUJfTU9ERV9JTkZPIHN0cnVjdHMuICBBbnkgOHg4IG5vdCBpbiB0aGUgdmlzaWJsZQorICAvLyBhcmVhIHdpbGwgYmUgTlVMTC4KKyAgTUJfTU9ERV9JTkZPICoqbWlfZ3JpZF9iYXNlOworICBNQl9NT0RFX0lORk8gKiptaV9ncmlkX3Zpc2libGU7CisgIE1CX01PREVfSU5GTyAqKnByZXZfbWlfZ3JpZF9iYXNlOworICBNQl9NT0RFX0lORk8gKipwcmV2X21pX2dyaWRfdmlzaWJsZTsKKyNlbmRpZgorICAvLyBXaGV0aGVyIHRvIHVzZSBwcmV2aW91cyBmcmFtZXMnIG1vdGlvbiB2ZWN0b3JzIGZvciBwcmVkaWN0aW9uLgorICBpbnQgYWxsb3dfcmVmX2ZyYW1lX212czsKKworICB1aW50OF90ICpsYXN0X2ZyYW1lX3NlZ19tYXA7CisKKyNpZmRlZiBPUklfQ09ERQorICBJbnRlcnBGaWx0ZXIgaW50ZXJwX2ZpbHRlcjsKKyNlbmRpZgorICBpbnQgc3dpdGNoYWJsZV9tb3Rpb25fbW9kZTsKKyNpZmRlZiBPUklfQ09ERQorICBsb29wX2ZpbHRlcl9pbmZvX24gbGZfaW5mbzsKKyNlbmRpZgorICAvLyBUaGUgZGVub21pbmF0b3Igb2YgdGhlIHN1cGVycmVzIHNjYWxlOyB0aGUgbnVtZXJhdG9yIGlzIGZpeGVkLgorICB1aW50OF90IHN1cGVycmVzX3NjYWxlX2Rlbm9taW5hdG9yOworICBpbnQgc3VwZXJyZXNfdXBzY2FsZWRfd2lkdGg7CisgIGludCBzdXBlcnJlc191cHNjYWxlZF9oZWlnaHQ7CisKKyNpZmRlZiBPUklfQ09ERQorICBSZXN0b3JhdGlvbkluZm8gcnN0X2luZm9bTUFYX01CX1BMQU5FXTsKKyNlbmRpZgorICAvLyBQb2ludGVyIHRvIGEgc2NyYXRjaCBidWZmZXIgdXNlZCBieSBzZWxmLWd1aWRlZCByZXN0b3JhdGlvbgorICBpbnQzMl90ICpyc3RfdG1wYnVmOworI2lmZGVmIE9SSV9DT0RFCisgIFJlc3RvcmF0aW9uTGluZUJ1ZmZlcnMgKnJsYnM7CisjZW5kaWYKKyAgLy8gT3V0cHV0IG9mIGxvb3AgcmVzdG9yYXRpb24KKyAgUElDX0JVRkZFUl9DT05GSUcgcnN0X2ZyYW1lOworCisgIC8vIEZsYWcgc2lnbmFsaW5nIGhvdyBmcmFtZSBjb250ZXh0cyBzaG91bGQgYmUgdXBkYXRlZCBhdCB0aGUgZW5kIG9mCisgIC8vIGEgZnJhbWUgZGVjb2RlCisgIFJFRlJFU0hfRlJBTUVfQ09OVEVYVF9NT0RFIHJlZnJlc2hfZnJhbWVfY29udGV4dDsKKworICBpbnQgcmVmX2ZyYW1lX3NpZ25fYmlhc1tSRUZfRlJBTUVTXTsgLyogVHdvIHN0YXRlIDAsIDEgKi8KKworI2lmZGVmIE9SSV9DT0RFCisgIHN0cnVjdCBsb29wZmlsdGVyIGxmOworICBzdHJ1Y3Qgc2VnbWVudGF0aW9uIHNlZzsKKyNlbmRpZgorCisgIGludCBjb2RlZF9sb3NzbGVzczsgIC8vIGZyYW1lIGlzIGZ1bGx5IGxvc3NsZXNzIGF0IHRoZSBjb2RlZCByZXNvbHV0aW9uLgorICBpbnQgYWxsX2xvc3NsZXNzOyAgICAvLyBmcmFtZSBpcyBmdWxseSBsb3NzbGVzcyBhdCB0aGUgdXBzY2FsZWQgcmVzb2x1dGlvbi4KKworICBpbnQgcmVkdWNlZF90eF9zZXRfdXNlZDsKKworI2lmZGVmIE9SSV9DT0RFCisgIC8vIENvbnRleHQgcHJvYmFiaWxpdGllcyBmb3IgcmVmZXJlbmNlIGZyYW1lIHByZWRpY3Rpb24KKyAgTVZfUkVGRVJFTkNFX0ZSQU1FIGNvbXBfZndkX3JlZltGV0RfUkVGU107CisgIE1WX1JFRkVSRU5DRV9GUkFNRSBjb21wX2J3ZF9yZWZbQldEX1JFRlNdOworCisgIEZSQU1FX0NPTlRFWFQgKmZjOyAgICAgICAgICAgICAgLyogdGhpcyBmcmFtZSBlbnRyb3B5ICovCisgIEZSQU1FX0NPTlRFWFQgKmRlZmF1bHRfZnJhbWVfY29udGV4dDsKKyNlbmRpZgorICBpbnQgcHJpbWFyeV9yZWZfZnJhbWU7CisKKyAgaW50IGVycm9yX3Jlc2lsaWVudF9tb2RlOworCisgIGludCB0aWxlX2NvbHMsIHRpbGVfcm93czsKKworICBpbnQgbWF4X3RpbGVfd2lkdGhfc2I7CisgIGludCBtaW5fbG9nMl90aWxlX2NvbHM7CisgIGludCBtYXhfbG9nMl90aWxlX2NvbHM7CisgIGludCBtYXhfbG9nMl90aWxlX3Jvd3M7CisgIGludCBtaW5fbG9nMl90aWxlX3Jvd3M7CisgIGludCBtaW5fbG9nMl90aWxlczsKKyAgaW50IG1heF90aWxlX2hlaWdodF9zYjsKKyAgaW50IHVuaWZvcm1fdGlsZV9zcGFjaW5nX2ZsYWc7CisgIGludCBsb2cyX3RpbGVfY29sczsgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHZhbGlkIGZvciB1bmlmb3JtIHRpbGVzCisgIGludCBsb2cyX3RpbGVfcm93czsgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHZhbGlkIGZvciB1bmlmb3JtIHRpbGVzCisgIGludCB0aWxlX2NvbF9zdGFydF9zYltNQVhfVElMRV9DT0xTICsgMV07ICAvLyB2YWxpZCBmb3IgMCA8PSBpIDw9IHRpbGVfY29scworICBpbnQgdGlsZV9yb3dfc3RhcnRfc2JbTUFYX1RJTEVfUk9XUyArIDFdOyAgLy8gdmFsaWQgZm9yIDAgPD0gaSA8PSB0aWxlX3Jvd3MKKyAgaW50IHRpbGVfd2lkdGgsIHRpbGVfaGVpZ2h0OyAgICAgICAgICAgICAgIC8vIEluIE1JIHVuaXRzCisgIGludCBtaW5faW5uZXJfdGlsZV93aWR0aDsgICAgICAgICAgICAgICAgICAvLyBtaW4gd2lkdGggb2Ygbm9uLXJpZ2h0bW9zdCB0aWxlCisKKyAgdW5zaWduZWQgaW50IGxhcmdlX3NjYWxlX3RpbGU7CisgIHVuc2lnbmVkIGludCBzaW5nbGVfdGlsZV9kZWNvZGluZzsKKworICBpbnQgYnl0ZV9hbGlnbm1lbnQ7CisgIGludCBza2lwX2xvb3BfZmlsdGVyOworICBpbnQgc2tpcF9maWxtX2dyYWluOworCisgIC8vIEV4dGVybmFsIEJ1ZmZlclBvb2wgcGFzc2VkIGZyb20gb3V0c2lkZS4KKyAgQnVmZmVyUG9vbCAqYnVmZmVyX3Bvb2w7CisKKyNpZmRlZiBPUklfQ09ERQorICBQQVJUSVRJT05fQ09OVEVYVCAqKmFib3ZlX3NlZ19jb250ZXh0OworICBFTlRST1BZX0NPTlRFWFQgKiphYm92ZV9jb250ZXh0W01BWF9NQl9QTEFORV07CisgIFRYRk1fQ09OVEVYVCAqKmFib3ZlX3R4Zm1fY29udGV4dDsKKyAgV2FycGVkTW90aW9uUGFyYW1zIGdsb2JhbF9tb3Rpb25bUkVGX0ZSQU1FU107CisgIGFvbV9maWxtX2dyYWluX3QgZmlsbV9ncmFpbl9wYXJhbXM7CisKKyAgQ2RlZkluZm8gY2RlZl9pbmZvOworICBEZWx0YVFJbmZvIGRlbHRhX3FfaW5mbzsgIC8vIERlbHRhIFEgYW5kIERlbHRhIExGIHBhcmFtZXRlcnMKKyNlbmRpZgorICBpbnQgbnVtX3RnOworICBTZXF1ZW5jZUhlYWRlciBzZXFfcGFyYW1zOworICBpbnQgY3VycmVudF9mcmFtZV9pZDsKKyAgaW50IHJlZl9mcmFtZV9pZFtSRUZfRlJBTUVTXTsKKyAgaW50IHZhbGlkX2Zvcl9yZWZlcmVuY2luZ1tSRUZfRlJBTUVTXTsKKyNpZmRlZiBPUklfQ09ERQorICBUUExfTVZfUkVGICp0cGxfbXZzOworI2VuZGlmCisgIGludCB0cGxfbXZzX21lbV9zaXplOworICAvLyBUT0RPKGppbmduaW5nKTogVGhpcyBjYW4gYmUgY29tYmluZWQgd2l0aCBzaWduX2JpYXMgbGF0ZXIuCisgIGludDhfdCByZWZfZnJhbWVfc2lkZVtSRUZfRlJBTUVTXTsKKworICBpbnQgaXNfYW5uZXhiOworCisgIGludCB0ZW1wb3JhbF9sYXllcl9pZDsKKyAgaW50IHNwYXRpYWxfbGF5ZXJfaWQ7CisgIHVuc2lnbmVkIGludCBudW1iZXJfdGVtcG9yYWxfbGF5ZXJzOworICB1bnNpZ25lZCBpbnQgbnVtYmVyX3NwYXRpYWxfbGF5ZXJzOworICBpbnQgbnVtX2FsbG9jYXRlZF9hYm92ZV9jb250ZXh0X21pX2NvbDsKKyAgaW50IG51bV9hbGxvY2F0ZWRfYWJvdmVfY29udGV4dHM7CisgIGludCBudW1fYWxsb2NhdGVkX2Fib3ZlX2NvbnRleHRfcGxhbmVzOworCisjaWYgVFhDT0VGRl9USU1FUgorICBpbnQ2NF90IGN1bV90eGNvZWZmX3RpbWVyOworICBpbnQ2NF90IHR4Y29lZmZfdGltZXI7CisgIGludCB0eGJfY291bnQ7CisjZW5kaWYKKworI2lmIFRYQ09FRkZfQ09TVF9USU1FUgorICBpbnQ2NF90IGN1bV90eGNvZWZmX2Nvc3RfdGltZXI7CisgIGludDY0X3QgdHhjb2VmZl9jb3N0X3RpbWVyOworICBpbnQ2NF90IHR4Y29lZmZfY29zdF9jb3VudDsKKyNlbmRpZgorICBjb25zdCBjZmdfb3B0aW9uc190ICpvcHRpb25zOworICBpbnQgaXNfZGVjb2Rpbmc7CisjaWZkZWYgQU1MCisgIGludCBtdl9yZWZfb2Zmc2V0W01WX1JFRl9TSVpFXVtSRUZfRlJBTUVTXTsKKyAgaW50IG12X3JlZl9pZFtNVl9SRUZfU0laRV07CisgIHVuc2lnbmVkIGNoYXIgbXZfY2FsX3RwbF9tdnNbTVZfUkVGX1NJWkVdOworICBpbnQgbXZfcmVmX2lkX2luZGV4OworICAgICAgaW50IHByZXZfZmJfaWR4OworICAgIGludCBuZXdfZmJfaWR4OworICAgIGludDMyX3QgZGVjX3dpZHRoOworI2VuZGlmCisjaWZkZWYgQU1MX0RFVklDRQorICAgICAgaW50IGN1cl9mYl9pZHhfbW11OworI2lmZGVmIEFPTV9BVjFfTU1VX0RXCisgICAgICBpbnQgY3VyX2ZiX2lkeF9tbXVfZHc7CisjZW5kaWYKKyAgICAgIGludCBjdXJyZW50X3ZpZGVvX2ZyYW1lOworICAgICAgaW50IHVzZV9wcmV2X2ZyYW1lX212czsKKyAgICAgIGludCBmcmFtZV90eXBlOworICAgICAgaW50IGludHJhX29ubHk7CisgIHN0cnVjdCBSZWZDbnRCdWZmZXJfcyBmcmFtZV9yZWZzW0lOVEVSX1JFRlNfUEVSX0ZSQU1FXTsKKworI2VuZGlmCit9IEFWMV9DT01NT047CisKKworLyoKK2Zyb206CisJZGVjb2Rlci9kZWNvZGVyLmgKKyovCisKK3R5cGVkZWYgc3RydWN0IEVYVEVSTkFMX1JFRkVSRU5DRVMgeworICBQSUNfQlVGRkVSX0NPTkZJRyByZWZzW01BWF9FWFRFUk5BTF9SRUZFUkVOQ0VTXTsKKyAgaW50IG51bTsKK30gRVhURVJOQUxfUkVGRVJFTkNFUzsKKwordHlwZWRlZiBzdHJ1Y3QgQVYxRGVjb2RlciB7CisgIC8vREVDTEFSRV9BTElHTkVEKDMyLCBNQUNST0JMT0NLRCwgbWIpOworCisgIC8vREVDTEFSRV9BTElHTkVEKDMyLCBBVjFfQ09NTU9OLCBjb21tb24pOworICBBVjFfQ09NTU9OICpjb21tb247CisKKyNpZmRlZiBPUklfQ09ERQorICBBVnhXb3JrZXIgbGZfd29ya2VyOworICBBVjFMZlN5bmMgbGZfcm93X3N5bmM7CisgIEFWMUxyU3luYyBscl9yb3dfc3luYzsKKyAgQVYxTHJTdHJ1Y3QgbHJfY3R4dDsKKyAgQVZ4V29ya2VyICp0aWxlX3dvcmtlcnM7CisgIGludCBudW1fd29ya2VyczsKKyAgRGVjV29ya2VyRGF0YSAqdGhyZWFkX2RhdGE7CisgIFRocmVhZERhdGEgdGQ7CisgIFRpbGVEYXRhRGVjICp0aWxlX2RhdGE7CisgIGludCBhbGxvY2F0ZWRfdGlsZXM7CisgIFRpbGVCdWZmZXJEZWMgdGlsZV9idWZmZXJzW01BWF9USUxFX1JPV1NdW01BWF9USUxFX0NPTFNdOworICBBVjFEZWNUaWxlTVQgdGlsZV9tdF9pbmZvOworI2VuZGlmCisKKyAgLy8gRWFjaCB0aW1lIHRoZSBkZWNvZGVyIGlzIGNhbGxlZCwgd2UgZXhwZWN0IHRvIHJlY2VpdmUgYSBmdWxsIHRlbXBvcmFsIHVuaXQuCisgIC8vIFRoaXMgY2FuIGNvbnRhaW4gdXAgdG8gb25lIHNob3duIGZyYW1lIHBlciBzcGF0aWFsIGxheWVyIGluIHRoZSBjdXJyZW50CisgIC8vIG9wZXJhdGluZyBwb2ludCAobm90ZSB0aGF0IHNvbWUgbGF5ZXJzIG1heSBiZSBlbnRpcmVseSBvbWl0dGVkKS4KKyAgLy8gSWYgdGhlICdvdXRwdXRfYWxsX2xheWVycycgb3B0aW9uIGlzIHRydWUsIHdlIHNhdmUgYWxsIG9mIHRoZXNlIHNob3duCisgIC8vIGZyYW1lcyBzbyB0aGF0IHRoZXkgY2FuIGJlIHJldHVybmVkIHRvIHRoZSBhcHBsaWNhdGlvbi4gSWYgdGhlCisgIC8vICdvdXRwdXRfYWxsX2xheWVycycgb3B0aW9uIGlzIGZhbHNlLCB0aGVuIHdlIG9ubHkgb3V0cHV0IG9uZSBpbWFnZSBwZXIKKyAgLy8gdGVtcG9yYWwgdW5pdC4KKyAgLy8KKyAgLy8gTm90ZTogVGhlIHNhdmVkIGJ1ZmZlcnMgYXJlIHJlbGVhc2VkIGF0IHRoZSBzdGFydCBvZiB0aGUgbmV4dCB0aW1lIHRoZQorICAvLyBhcHBsaWNhdGlvbiBjYWxscyBhb21fY29kZWNfZGVjb2RlKCkuCisgIGludCBvdXRwdXRfYWxsX2xheWVyczsKKyAgUmVmQ250QnVmZmVyICpvdXRwdXRfZnJhbWVzW01BWF9OVU1fU1BBVElBTF9MQVlFUlNdOworICBzaXplX3QgbnVtX291dHB1dF9mcmFtZXM7ICAvLyBIb3cgbWFueSBmcmFtZXMgYXJlIHF1ZXVlZCB1cCBzbyBmYXI/CisKKyAgLy8gSW4gb3JkZXIgdG8gcHJvcGVybHkgc3VwcG9ydCByYW5kb20tYWNjZXNzIGRlY29kaW5nLCB3ZSBuZWVkCisgIC8vIHRvIGJlaGF2ZSBzbGlnaHRseSBkaWZmZXJlbnRseSBmb3IgdGhlIHZlcnkgZmlyc3QgZnJhbWUgd2UgZGVjb2RlLgorICAvLyBTbyB3ZSB0cmFjayB3aGV0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IGZyYW1lIG9yIG5vdC4KKyAgaW50IGRlY29kaW5nX2ZpcnN0X2ZyYW1lOworCisgIGludCBhbGxvd19sb3diaXRkZXB0aDsKKyAgaW50IG1heF90aHJlYWRzOworICBpbnQgaW52X3RpbGVfb3JkZXI7CisgIGludCBuZWVkX3Jlc3luYzsgICAvLyB3YWl0IGZvciBrZXkvaW50cmEtb25seSBmcmFtZS4KKyAgaW50IGhvbGRfcmVmX2J1ZjsgIC8vIEJvb2xlYW46IHdoZXRoZXIgd2UgYXJlIGhvbGRpbmcgcmVmZXJlbmNlIGJ1ZmZlcnMgaW4KKyAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1vbi5uZXh0X3JlZl9mcmFtZV9tYXAuCisgIGludCByZXNldF9kZWNvZGVyX3N0YXRlOworCisgIGludCB0aWxlX3NpemVfYnl0ZXM7CisgIGludCB0aWxlX2NvbF9zaXplX2J5dGVzOworICBpbnQgZGVjX3RpbGVfcm93LCBkZWNfdGlsZV9jb2w7ICAvLyBhbHdheXMgLTEgZm9yIG5vbi1WUiB0aWxlIGVuY29kaW5nCisjaWYgQ09ORklHX0FDQ09VTlRJTkcKKyAgaW50IGFjY3RfZW5hYmxlZDsKKyAgQWNjb3VudGluZyBhY2NvdW50aW5nOworI2VuZGlmCisgIGludCB0Z19zaXplOyAgIC8vIE51bWJlciBvZiB0aWxlcyBpbiB0aGUgY3VycmVudCB0aWxlZ3JvdXAKKyAgaW50IHRnX3N0YXJ0OyAgLy8gRmlyc3QgdGlsZSBpbiB0aGUgY3VycmVudCB0aWxlZ3JvdXAKKyAgaW50IHRnX3NpemVfYml0X29mZnNldDsKKyAgaW50IHNlcXVlbmNlX2hlYWRlcl9yZWFkeTsKKyAgaW50IHNlcXVlbmNlX2hlYWRlcl9jaGFuZ2VkOworI2lmIENPTkZJR19JTlNQRUNUSU9OCisgIGFvbV9pbnNwZWN0X2NiIGluc3BlY3RfY2I7CisgIHZvaWQgKmluc3BlY3RfY3R4OworI2VuZGlmCisgIGludCBvcGVyYXRpbmdfcG9pbnQ7CisgIGludCBjdXJyZW50X29wZXJhdGluZ19wb2ludDsKKyAgaW50IHNlZW5fZnJhbWVfaGVhZGVyOworCisgIC8vIFN0YXRlIGlmIHRoZSBjYW1lcmEgZnJhbWUgaGVhZGVyIGlzIGFscmVhZHkgZGVjb2RlZCB3aGlsZQorICAvLyBsYXJnZV9zY2FsZV90aWxlID0gMS4KKyAgaW50IGNhbWVyYV9mcmFtZV9oZWFkZXJfcmVhZHk7CisgIHNpemVfdCBmcmFtZV9oZWFkZXJfc2l6ZTsKKyNpZmRlZiBPUklfQ09ERQorICBEYXRhQnVmZmVyIG9idV9zaXplX2hkcjsKKyNlbmRpZgorICBpbnQgb3V0cHV0X2ZyYW1lX3dpZHRoX2luX3RpbGVzX21pbnVzXzE7CisgIGludCBvdXRwdXRfZnJhbWVfaGVpZ2h0X2luX3RpbGVzX21pbnVzXzE7CisgIGludCB0aWxlX2NvdW50X21pbnVzXzE7CisgIHVpbnQzMl90IGNvZGVkX3RpbGVfZGF0YV9zaXplOworICB1bnNpZ25lZCBpbnQgZXh0X3RpbGVfZGVidWc7ICAvLyBmb3IgZXh0LXRpbGUgc29mdHdhcmUgZGVidWcgJiB0ZXN0aW5nCisgIHVuc2lnbmVkIGludCByb3dfbXQ7CisgIEVYVEVSTkFMX1JFRkVSRU5DRVMgZXh0X3JlZnM7CisgIFBJQ19CVUZGRVJfQ09ORklHIHRpbGVfbGlzdF9vdXRidWY7CisKKyNpZmRlZiBPUklfQ09ERQorICBDQl9CVUZGRVIgKmNiX2J1ZmZlcl9iYXNlOworI2VuZGlmCisgIGludCBjYl9idWZmZXJfYWxsb2Nfc2l6ZTsKKworICBpbnQgYWxsb2NhdGVkX3Jvd19tdF9zeW5jX3Jvd3M7CisKKyNpZiBDT05GSUdfTVVMVElUSFJFQUQKKyAgcHRocmVhZF9tdXRleF90ICpyb3dfbXRfbXV0ZXhfOworICBwdGhyZWFkX2NvbmRfdCAqcm93X210X2NvbmRfOworI2VuZGlmCisKKyNpZmRlZiBPUklfQ09ERQorICBBVjFEZWNSb3dNVEluZm8gZnJhbWVfcm93X210X2luZm87CisjZW5kaWYKKworI2lmZGVmIEFNTAorICB1bnNpZ25lZCBjaGFyIHByZWRfaW50ZXJfcmVhZF9lbmFibGU7CisgIGludCBjdXJfb2J1X3R5cGU7CisgIGludCBkZWNvZGVfaWR4OworICBpbnQgYnVmbWdyX3Byb2NfY291bnQ7CisgIGludCBvYnVfZnJhbWVfZnJhbWVfaGVhZF9jb21lX2FmdGVyX3RpbGU7CisgICAgdWludDMyX3QgZnJhbWVfd2lkdGg7CisgICAgdWludDMyX3QgZnJhbWVfaGVpZ2h0OworICAgIEJ1ZmZJbmZvX3QqIHdvcmtfc3BhY2VfYnVmOworICAgIGJ1ZmZfdCogbWNfYnVmOworICAgIC8vdW5zaWduZWQgc2hvcnQgKnJwbV9wdHI7CisgICAgdm9pZCAqcHJpdmF0ZV9kYXRhOworICAgIHUzMiBwcmVfc3RyZWFtX29mZnNldDsKKyNlbmRpZgorfSBBVjFEZWNvZGVyOworCisjZGVmaW5lIFJQTV9CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMAorI2RlZmluZSBSUE1fRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyODAKKwordHlwZWRlZiB1bmlvbiBwYXJhbV91IHsKKyAgICBzdHJ1Y3QgeworICAgICAgICB1bnNpZ25lZCBzaG9ydCBkYXRhW1JQTV9FTkQgLSBSUE1fQkVHSU5dOworICAgIH0gbDsKKyAgICBzdHJ1Y3QgeworICAgICAgICAvKnNlcXVlbmNlIGhlYWQqLworICAgICAgICB1bnNpZ25lZCBzaG9ydCBwcm9maWxlOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBzdGlsbF9waWN0dXJlOworICAgICAgICB1bnNpZ25lZCBzaG9ydCByZWR1Y2VkX3N0aWxsX3BpY3R1cmVfaGRyOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBkZWNvZGVyX21vZGVsX2luZm9fcHJlc2VudF9mbGFnOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBtYXhfZnJhbWVfd2lkdGg7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IG1heF9mcmFtZV9oZWlnaHQ7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGZyYW1lX2lkX251bWJlcnNfcHJlc2VudF9mbGFnOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBkZWx0YV9mcmFtZV9pZF9sZW5ndGg7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGZyYW1lX2lkX2xlbmd0aDsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgb3JkZXJfaGludF9iaXRzX21pbnVzXzE7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGVuYWJsZV9vcmRlcl9oaW50OworICAgICAgICB1bnNpZ25lZCBzaG9ydCBlbmFibGVfZGlzdF93dGRfY29tcDsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgZW5hYmxlX3JlZl9mcmFtZV9tdnM7CisKKyAgICAgICAgLypmcmFtZSBoZWFkKi8KKyAgICAgICAgdW5zaWduZWQgc2hvcnQgc2hvd19leGlzdGluZ19mcmFtZTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgZnJhbWVfdHlwZTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgc2hvd19mcmFtZTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgZXJyb3JfcmVzaWxpZW50X21vZGU7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IHJlZnJlc2hfZnJhbWVfZmxhZ3M7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IHNob3dhYmxlX2ZyYW1lOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBjdXJyZW50X2ZyYW1lX2lkOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBmcmFtZV9zaXplX292ZXJyaWRlX2ZsYWc7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IG9yZGVyX2hpbnQ7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IHByaW1hcnlfcmVmX2ZyYW1lOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBmcmFtZV9yZWZzX3Nob3J0X3NpZ25hbGluZzsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgZnJhbWVfd2lkdGg7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGRlY19mcmFtZV93aWR0aDsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgZnJhbWVfd2lkdGhfc2NhbGVkOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBmcmFtZV9oZWlnaHQ7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IHJlZmVyZW5jZV9tb2RlOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBhbGxvd19yZWZfZnJhbWVfbXZzOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBzdXBlcnJlc19zY2FsZV9kZW5vbWluYXRvcjsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgbHN0X3JlZjsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgZ2xkX3JlZjsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgZXhpc3RpbmdfZnJhbWVfaWR4OworCisgICAgICAgIHVuc2lnbmVkIHNob3J0IHJlbWFwcGVkX3JlZl9pZHhbSU5URVJfUkVGU19QRVJfRlJBTUVdOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBkZWx0YV9mcmFtZV9pZF9taW51c18xW0lOVEVSX1JFRlNfUEVSX0ZSQU1FXTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgcmVmX29yZGVyX2hpbnRbUkVGX0ZSQU1FU107CisgICAgICAgIC8qb3RoZXIgbm90IGluIHJlZmVyZW5jZSovCisgICAgICAgIHVuc2lnbmVkIHNob3J0IGJpdF9kZXB0aDsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgc2VxX2ZsYWdzOworICAgICAgICB1bnNpZ25lZCBzaG9ydCB1cGRhdGVfcGFyYW1ldGVyczsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgZmlsbV9ncmFpbl9wYXJhbXNfcmVmX2lkeDsKKworICAgICAgICAvKmxvb3BfZmlsdGVyICYgc2VnbWVudGF0aW9uKi8KKyAgICAgICAgdW5zaWduZWQgc2hvcnQgbG9vcF9maWx0ZXJfc2hhcnBuZXNzX2xldmVsOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBsb29wX2ZpbHRlcl9tb2RlX3JlZl9kZWx0YV9lbmFibGVkOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBsb29wX2ZpbHRlcl9yZWZfZGVsdGFzXzA7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGxvb3BfZmlsdGVyX3JlZl9kZWx0YXNfMTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgbG9vcF9maWx0ZXJfcmVmX2RlbHRhc18yOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBsb29wX2ZpbHRlcl9yZWZfZGVsdGFzXzM7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGxvb3BfZmlsdGVyX3JlZl9kZWx0YXNfNDsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgbG9vcF9maWx0ZXJfcmVmX2RlbHRhc181OworICAgICAgICB1bnNpZ25lZCBzaG9ydCBsb29wX2ZpbHRlcl9yZWZfZGVsdGFzXzY7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGxvb3BfZmlsdGVyX3JlZl9kZWx0YXNfNzsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgbG9vcF9maWx0ZXJfbW9kZV9kZWx0YXNfMDsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgbG9vcF9maWx0ZXJfbW9kZV9kZWx0YXNfMTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgbG9vcF9maWx0ZXJfbGV2ZWxfMDsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgbG9vcF9maWx0ZXJfbGV2ZWxfMTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgbG9vcF9maWx0ZXJfbGV2ZWxfdTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgbG9vcF9maWx0ZXJfbGV2ZWxfdjsKKworICAgICAgICB1bnNpZ25lZCBzaG9ydCBzZWdtZW50YXRpb25fZW5hYmxlZDsKKyAgICAgICAgICAvKgorICAgICAgICAgICBTRUdfTFZMX0FMVF9MRl9ZX1YgZmVhdHVyZV9lbmFibGU6IHNlZ19sZl9pbmZvX3lbYml0N10KKyAgICAgICAgICAgU0VHX0xWTF9BTFRfTEZfWV9WIGRhdGE6IHNlZ19sZl9pbmZvX3lbYml0MH42XQorICAgICAgICAgICBTRUdfTFZMX0FMVF9MRl9ZX0ggZmVhdHVyZSBlbmFibGU6IHNlZ19sZl9pbmZvX3lbYml0MTVdCisgICAgICAgICAgIFNFR19MVkxfQUxUX0xGX1lfSCBkYXRhOiBzZWdfbGZfaW5mb195W2JpdDh+MTRdCisgICAgICAgICAgICovCisgICAgICAgIHVuc2lnbmVkIHNob3J0IHNlZ19sZl9pbmZvX3lbOF07CisgICAgICAgICAgLyoKKyAgICAgICAgICAgU0VHX0xWTF9BTFRfTEZfVSBmZWF0dXJlX2VuYWJsZTogc2VnX2xmX2luZm9feVtiaXQ3XQorICAgICAgICAgICBTRUdfTFZMX0FMVF9MRl9VIGRhdGE6IHNlZ19sZl9pbmZvX3lbYml0MH42XQorICAgICAgICAgICBTRUdfTFZMX0FMVF9MRl9WIGZlYXR1cmUgZW5hYmxlOiBzZWdfbGZfaW5mb195W2JpdDE1XQorICAgICAgICAgICBTRUdfTFZMX0FMVF9MRl9WIGRhdGE6IHNlZ19sZl9pbmZvX3lbYml0OH4xNF0KKyAgICAgICAgICAgKi8KKyAgICAgICAgdW5zaWduZWQgc2hvcnQgc2VnX2xmX2luZm9fY1s4XTsKKwkJdW5zaWduZWQgc2hvcnQgdmlkZW9fc2lnbmFsX3R5cGU7CisJCXVuc2lnbmVkIHNob3J0IGNvbG9yX2Rlc2NyaXB0aW9uOworCQl1bnNpZ25lZCBzaG9ydCBtbXVfdXNlZF9udW07CisJCXVuc2lnbmVkIHNob3J0IGR3X21tdV91c2VkX251bTsKKwkJdW5zaWduZWQgc2hvcnQgc2VxX2ZsYWdzXzI7CisgICAgICAgIC8qdWNvZGUgZW5kKi8KKyAgICAgICAgLypvdGhlciovCisgICAgICAgIHVuc2lnbmVkIHNob3J0IGVuYWJsZV9zdXBlcnJlczsKKworICAgICAgICAvKnNlcWVuY2Ugbm90IHVzZSovCisgICAgICAgIHVuc2lnbmVkIHNob3J0IG9wZXJhdGluZ19wb2ludHNfY250X21pbnVzXzE7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IG9wZXJhdGluZ19wb2ludF9pZGNbTUFYX05VTV9PUEVSQVRJTkdfUE9JTlRTXTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgc2VxX2xldmVsX2lkeFtNQVhfTlVNX09QRVJBVElOR19QT0lOVFNdOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBkZWNvZGVyX21vZGVsX3BhcmFtX3ByZXNlbnRfZmxhZ1tNQVhfTlVNX09QRVJBVElOR19QT0lOVFNdOworICAgICAgICB1bnNpZ25lZCBzaG9ydCB0aW1pbmdfaW5mb19wcmVzZW50OworICAgICAgICAvKmZyYW1lIGhlYWQgbm90IHVzZSovCisgICAgICAgIHVuc2lnbmVkIHNob3J0IGRpc3BsYXlfZnJhbWVfaWQ7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGZyYW1lX3ByZXNlbnRhdGlvbl90aW1lOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBidWZmZXJfcmVtb3ZhbF90aW1lX3ByZXNlbnQ7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IG9wX2ZyYW1lX3RpbWluZ1tNQVhfTlVNX09QRVJBVElOR19QT0lOVFMgKyAxXTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgdmFsaWRfcmVmX2ZyYW1lX2JpdHM7CisKKyAgICB9IHA7Cit9cGFyYW1fdDsKKworUElDX0JVRkZFUl9DT05GSUcgKmF2MV9nZXRfcmVmX2ZyYW1lX3NwZWNfYnVmKAorICAgIGNvbnN0IEFWMV9DT01NT04gKmNvbnN0IGNtLCBjb25zdCBNVl9SRUZFUkVOQ0VfRlJBTUUgcmVmX2ZyYW1lKTsKKworaW50IGF2MV9idWZtZ3JfcHJvY2VzcyhBVjFEZWNvZGVyICpwYmksIHVuaW9uIHBhcmFtX3UgKnBhcmFtcywKKyAgICB1bnNpZ25lZCBjaGFyIG5ld19jb21wcmVzc2VkX2RhdGEsIGludCBvYnVfdHlwZSk7CisKK3N0cnVjdCBzY2FsZV9mYWN0b3JzICphdjFfZ2V0X3JlZl9zY2FsZV9mYWN0b3JzKAorICBBVjFfQ09NTU9OICpjb25zdCBjbSwgY29uc3QgTVZfUkVGRVJFTkNFX0ZSQU1FIHJlZl9mcmFtZSk7CisKK3ZvaWQgYXYxX3NldF9uZXh0X3JlZl9mcmFtZV9tYXAoQVYxRGVjb2RlciAqcGJpKTsKKwordW5zaWduZWQgaW50IGF2MV9nZXRfbmV4dF91c2VkX3JlZl9pbmZvKAorICAgIGNvbnN0IEFWMV9DT01NT04gKmNvbnN0IGNtLCBpbnQgaSk7CisKK3ZvaWQgYXYxX3JlbGVhc2VfYnVmKEFWMURlY29kZXIgKnBiaSwgUmVmQ250QnVmZmVyICpjb25zdCBidWYpOworCitpbnQgYXYxX2J1Zm1ncl9wb3N0cHJvYyhBVjFEZWNvZGVyICpwYmksIHVuc2lnbmVkIGNoYXIgZnJhbWVfZGVjb2RlZCk7CisKK0FWMURlY29kZXIgKmF2MV9kZWNvZGVyX2NyZWF0ZShCdWZmZXJQb29sICpjb25zdCBwb29sLCBBVjFfQ09NTU9OICpjbSk7CisKK3Vuc2lnbmVkIGNoYXIgYXYxX2ZyYW1lX2lzX2ludGVyKGNvbnN0IEFWMV9DT01NT04gKmNvbnN0IGNtKTsKKworUmVmQ250QnVmZmVyICphdjFfZ2V0X3ByaW1hcnlfcmVmX2ZyYW1lX2J1ZigKKyAgY29uc3QgQVYxX0NPTU1PTiAqY29uc3QgY20pOworCit2b2lkIGF2MV9yYXdfd3JpdGVfaW1hZ2UoQVYxRGVjb2RlciAqcGJpLCBQSUNfQlVGRkVSX0NPTkZJRyAqc2QpOworCitpbnQgZ2V0X2ZyZWVfZnJhbWVfYnVmZmVyKHN0cnVjdCBBVjFfQ29tbW9uX3MgKmNtKTsKKwordm9pZCBhdjFfYnVmbWdyX2N0eF9yZXNldChBVjFEZWNvZGVyICpwYmksIEJ1ZmZlclBvb2wgKmNvbnN0IHBvb2wsIEFWMV9DT01NT04gKmNtKTsKKworI2lmIDEKKyNkZWZpbmUgbG9ja19idWZmZXJfcG9vbChwb29sLCBmbGFncykgXAorICAgIHNwaW5fbG9ja19pcnFzYXZlKCZwb29sLT5sb2NrLCBmbGFncykKKworI2RlZmluZSB1bmxvY2tfYnVmZmVyX3Bvb2wocG9vbCwgZmxhZ3MpIFwKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBmbGFncykKKyNlbHNlCisjZGVmaW5lIGxvY2tfYnVmZmVyX3Bvb2wocG9vbCwgZmxhZ3MpIGZsYWdzPTE7CisKKyNkZWZpbmUgdW5sb2NrX2J1ZmZlcl9wb29sKHBvb2wsIGZsYWdzKSBmbGFncz0wOworCisjZW5kaWYKKworI2RlZmluZSBBVjFfREVCVUdfQlVGTUdSICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQVYxX0RFQlVHX0JVRk1HUl9NT1JFICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEFWMV9ERUJVR19CVUZNR1JfREVUQUlMICAgICAgICAgICAgMHgwNAorI2RlZmluZSBBVjFfREVCVUdfT1VUX1BUUyAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQU9NX0RFQlVHX0hXX01PUkUgICAgICAgICAgICAgICAgICAweDIwCisjZGVmaW5lIEFPTV9ERUJVR19WRlJBTUUgICAgICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBBT01fREVCVUdfUFJJTlRfTElTVF9JTkZPICAgICAgICAgIDB4ODAKKyNkZWZpbmUgQU9NX0FWMV9ERUJVR19TRU5EX1BBUkFNX1dJVEhfUkVHICAgICAgMHgxMDAKKyNkZWZpbmUgQVYxX0RFQlVHX0lHTk9SRV9WRl9SRUYgICAgICAgICAgICAweDIwMAorI2RlZmluZSBBVjFfREVCVUdfREJHX0xGX1BSSU5UICAgICAgICAgICAgIDB4NDAwCisjZGVmaW5lIEFWMV9ERUJVR19SRUcgICAgICAgICAgICAgICAgICAgICAgMHg4MDAKKyNkZWZpbmUgQU9NX0RFQlVHX0JVRk1HUl9PTkxZICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgQU9NX0RFQlVHX0FVWF9EQVRBICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgQVYxX0RFQlVHX1FPU19JTkZPICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgQU9NX0RFQlVHX0RXX0RJU1BfTUFJTiAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgQVYxX0RFQlVHX0RJU19MT0NfRVJST1JfUFJPQyAgICAgICAweDEwMDAwCisjZGVmaW5lIEFPTV9ERUJVR19ESVNfUkVDWUNMRV9NTVVfVEFJTCAgICAgMHgyMDAwMAorI2RlZmluZSBBVjFfREVCVUdfRFVNUF9QSUNfTElTVCAgICAgICAweDQwMDAwCisjZGVmaW5lIEFWMV9ERUJVR19UUklHX1NMSUNFX1NFR01FTlRfUFJPQyAweDgwMDAwCisjZGVmaW5lIEFPTV9ERUJVR19VU0VfRklYRURfTVZfQlVGX1NJWkUgIDB4MTAwMDAwCisjZGVmaW5lIEFWMV9ERUJVR19MT0FEX1VDT0RFX0ZST01fRklMRSAgIDB4MjAwMDAwCisjZGVmaW5lIEFWMV9ERUJVR19GT1JDRV9TRU5EX0FHQUlOICAgICAgIDB4NDAwMDAwCisjZGVmaW5lIEFWMV9ERUJVR19EVU1QX0RBVEEgICAgICAgICAgICAgIDB4ODAwMDAwCisjZGVmaW5lIEFWMV9ERUJVR19DQUNIRSAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMAorI2RlZmluZSBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUgICAgICAgICAweDIwMDAwMDAKKyNkZWZpbmUgQVYxX0RFQlVHX1NFSV9ERVRBSUwgICAgICAgICAgICAgMHg0MDAwMDAwCisjZGVmaW5lIElHTk9SRV9QQVJBTV9GUk9NX0NPTkZJRyAgICAgICAgIDB4ODAwMDAwMAorI2lmIDEKKy8qZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQqLworI2RlZmluZSBQUklOVF9GTEFHX0VSUk9SICAgIDB4MAorI2RlZmluZSBQUklOVF9GTEFHX1Y0TF9ERVRBSUwgICAweDEwMDAwMDAwCisjZGVmaW5lIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMgICAgMHgyMDAwMDAwMAorI2RlZmluZSBQUklOVF9GTEFHX1ZERUNfREVUQUlMICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgUFJJTlRfRkxBR19WREVDX0RBVEEgICAgMHg4MDAwMDAwMAorI2VuZGlmCisKK2ludCBhdjFfcHJpbnQyKGludCBmbGFnLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CisKK3Vuc2lnbmVkIGNoYXIgYXYxX2lzX2RlYnVnKGludCBmbGFnKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci92YXYxL3ZhdjEuYyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci92YXYxL3ZhdjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjc3NTdhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3ZhdjEvdmF2MS5jCkBAIC0wLDAgKzEsMTE2NTYgQEAKKyAvKgorICAqIGRyaXZlcnMvYW1sb2dpYy9hbXBvcnRzL3ZhdjEuYworICAqCisgICogQ29weXJpZ2h0IChDKSAyMDE1IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgKgorICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgICoKKyAgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgICogbW9yZSBkZXRhaWxzLgorICAqCisgICovCisjZGVmaW5lIERFQlVHCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC9jbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy9hbXN0cmVhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmZvcm1hdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZnJhbWVfc3luYy9wdHNzZXJ2Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jYW52YXMvY2FudmFzLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3Byb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3JlY2VpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtY29udGlndW91cy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL3RlZS5oPgorI2luY2x1ZGUgIi4uLy4uLy4uL3N0cmVhbV9pbnB1dC9hbXBvcnRzL2FtcG9ydHNfcHJpdi5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29kZWNfbW0uaD4KKyNpbmNsdWRlICIuLi91dGlscy9kZWNvZGVyX21tdV9ib3guaCIKKyNpbmNsdWRlICIuLi91dGlscy9kZWNvZGVyX2JtbXVfYm94LmgiCisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKworI2RlZmluZSBNRU1fTkFNRSAiY29kZWNfYXYxIgorLyogI2luY2x1ZGUgPG1hY2gvYW1fcmVncy5oPiAqLworI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmRlY19yZWcuaD4KKyNpbmNsdWRlICIuLi91dGlscy92ZGVjLmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvYW12ZGVjLmgiCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfTVVMVElfREVDCisjaW5jbHVkZSAiLi4vdXRpbHMvdmRlY19wcm9maWxlLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdmlkZW9fc2luay92aWRlby5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29uZmlncy5oPgorI2luY2x1ZGUgIi4uL3V0aWxzL2NvbmZpZ19wYXJzZXIuaCIKKyNpbmNsdWRlICIuLi91dGlscy9maXJtd2FyZS5oIgorI2luY2x1ZGUgIi4uLy4uLy4uL2NvbW1vbi9jaGlwcy9kZWNvZGVyX2NwdV92ZXJfaW5mby5oIgorI2luY2x1ZGUgIi4uLy4uLy4uL2FtdmRlY19wb3J0cy92ZGVjX2Rydl9iYXNlLmgiCisKKy8vI2RlZmluZSBERUJVR19VQ09ERV9MT0cKKyNkZWZpbmUgREVCVUdfQ01ECisjZGVmaW5lIERFQlVHX0NSQ19FUlJPUgorCisjZGVmaW5lIFNVUFBPUlRfVjRMMgorLy8jZGVmaW5lIERFQlVHX1VTRV9WUDlfREVWSUNFX05BTUUKKy8vI2RlZmluZSBCVUZNR1JfT05MWV9PTERfQ0hJUAorCisjaWZkZWYgU1VQUE9SVF9WNEwyCisjaW5jbHVkZSAiLi4vdXRpbHMvdmRlY192NGwyX2J1ZmZlcl9vcHMuaCIKKyNpbmNsdWRlIDxtZWRpYS92NGwyLW1lbTJtZW0uaD4KKyNlbmRpZgorI2luY2x1ZGUgIi4uLy4uLy4uL2FtdmRlY19wb3J0cy91dGlscy9jb21tb24uaCIKKyNpbmNsdWRlICIuLi91dGlscy92ZGVjX2ZlYXR1cmUuaCIKKworI2RlZmluZSBBTUwKKyNpbmNsdWRlICJhb21fYXYxX2RlZmluZS5oIgorI2luY2x1ZGUgImF2MV9nbG9iYWwuaCIKKworI2RlZmluZSBEVU1QX0ZJTE1HUkFJTgorI2RlZmluZSBNSVhfU1RSRUFNX1NVUFBPUlQKKy8vI2RlZmluZSBNVl9VU0VfRklYRURfQlVGCisvLyNkZWZpbmUgVVNFX1NQRUNfQlVGX0ZPUl9NTVVfSEVBRAorCisjZGVmaW5lIEFPTV9BVjFfREJMS19JTklUCisjZGVmaW5lIEFPTV9BVjFfVVBTQ0FMRV9JTklUCisKKyNkZWZpbmUgVVNFX0RFQ19QSUNfRU5ECisKKyNkZWZpbmUgU0FOSVRZX0NIRUNLCisjZGVmaW5lIENPX01WX0NPTVBSRVNTCisKKyNpbmNsdWRlICJ2YXYxLmgiCisKKyNkZWZpbmUgRkdTX1RBQkxFX1NJWkUgICg1MTIgKiAxMjggLyA4KQorCisjZGVmaW5lIEFWMV9HTUNfUEFSQU1fQlVGRl9BRERSIAkgICAgICAgICAgICAgICAweDMxNmQKKyNkZWZpbmUgSEVWQ0RfTVBQX0RFQ09NUF9BWElVUkdfQ1RMICAgICAgICAgICAgICAgIDB4MzRjNworI2RlZmluZSBIRVZDX0ZHU19JRFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNjYwCisjZGVmaW5lIEhFVkNfRkdTX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM2NjEKKyNkZWZpbmUgSEVWQ19GR1NfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzY2MgorI2RlZmluZSBBVjFfU0tJUF9NT0RFX0lORk8gICAgICAgICAgICAgICAgICAgICAgICAgMHgzMTZjCisjZGVmaW5lIEFWMV9RVUFOVF9XUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMxNDYKKyNkZWZpbmUgICBBVjFfU0VHX1dfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzE2NQorI2RlZmluZSAgIEFWMV9TRUdfUl9BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMTY2CisjZGVmaW5lIEFWMV9SRUZfU0VHX0lORk8gICAgICAgICAgICAgICAgICAgICAgICAgICAweDMxNzEKKyNkZWZpbmUgSEVWQ19BU1NJU1RfUElDX1NJWkVfRkJfUkVBRCAgICAgICAgICAgICAgIDB4MzAwZAorI2RlZmluZSBQQVJTRVJfUkVGX1NDQUxFX0VOQkwgICAgICAgICAgICAgICAgICAgICAgMHgzMTZiCisjZGVmaW5lIEhFVkNfTVBSRURfTVZfUlBUUl8xICAgICAgICAgICAgICAgICAgICAgICAweDMyNjMKKyNkZWZpbmUgSEVWQ19NUFJFRF9NVl9SUFRSXzIgICAgICAgICAgICAgICAgICAgICAgIDB4MzI2NAorI2RlZmluZSBIRVZDX1NBT19DVFJMOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNjJkCisjZGVmaW5lIEhFVkNfRkdTX1RBQkxFX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAweDM2NjYKKyNkZWZpbmUgSEVWQ19GR1NfVEFCTEVfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgIDB4MzY2NworI2RlZmluZSBIRVZDX0RCTEtfQ0RFRjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNTE1CisjZGVmaW5lIEhFVkNfREJMS19DREVGMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM1MTYKKyNkZWZpbmUgSEVWQ19EQkxLX1VQUzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzUxYworI2RlZmluZSBIRVZDX0RCTEtfVVBTMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNTFkCisjZGVmaW5lIEhFVkNfREJMS19VUFMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM1MWUKKyNkZWZpbmUgSEVWQ19EQkxLX1VQUzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzUxZgorI2RlZmluZSBIRVZDX0RCTEtfVVBTNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNTIwCisjZGVmaW5lIEFWMV9VUFNDQUxFX1gwX1FOICAgICAgICAgICAgICAgICAgICAgICAgICAweDMxNmUKKyNkZWZpbmUgQVYxX1VQU0NBTEVfU1RFUF9RTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MzE2ZgorI2RlZmluZSBIRVZDX0RCTEtfREJMSzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNTIzCisjZGVmaW5lIEhFVkNfREJMS19EQkxLMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM1MjQKKyNkZWZpbmUgSEVWQ19EQkxLX0RCTEsyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzUyNQorCisjZGVmaW5lIEhXX01BU0tfRlJPTlQgICAgMHgxCisjZGVmaW5lIEhXX01BU0tfQkFDSyAgICAgMHgyCisKKyNkZWZpbmUgQVYxRF9NUFBfUkVGSU5GT19UQkxfQUNDQ09ORklHICAgICAgICAgICAgIDB4MzQ0MgorI2RlZmluZSBBVjFEX01QUF9SRUZJTkZPX0RBVEEgICAgICAgICAgICAgICAgICAgICAgMHgzNDQzCisjZGVmaW5lIEFWMURfTVBQX1JFRl9TQ0FMRV9FTkJMICAgICAgICAgICAgICAgICAgICAweDM0NDEKKyNkZWZpbmUgSEVWQ19NUFJFRF9DVFJMNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzI0YworI2RlZmluZSBIRVZDX0NNX0hFQURFUl9TVEFSVF9BRERSICAgICAgICAgICAgICAgICAgMHgzNjI4CisjZGVmaW5lIEhFVkNfREJMS19DRkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM1MGIKKyNkZWZpbmUgSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0RBVEEgICAgICAgICAgICAgICAgIDB4MzQ2NAorI2RlZmluZSBIRVZDX1NBT19NTVVfVkgxX0FERFIgICAgICAgICAgICAgICAgICAgICAgMHgzNjNiCisjZGVmaW5lIEhFVkNfU0FPX01NVV9WSDBfQUREUiAgICAgICAgICAgICAgICAgICAgICAweDM2M2EKKworI2RlZmluZSBIRVZDX01WX0lORk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMTBkCisjZGVmaW5lIEhFVkNfUVBfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMxMzcKKyNkZWZpbmUgSEVWQ19TS0lQX0lORk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzEzNgorCisjZGVmaW5lIEhFVkNfQ01fQk9EWV9MRU5HVEgyICAgICAgICAgICAgICAgICAgICAgICAweDM2NjMKKyNkZWZpbmUgSEVWQ19DTV9IRUFERVJfT0ZGU0VUMiAgICAgICAgICAgICAgICAgICAgIDB4MzY2NAorI2RlZmluZSBIRVZDX0NNX0hFQURFUl9MRU5HVEgyICAgICAgICAgICAgICAgICAgICAgMHgzNjY1CisKKyNkZWZpbmUgSEVWQ19DTV9IRUFERVJfU1RBUlRfQUREUjIgICAgICAgICAgICAgICAgIDB4MzY0YQorI2RlZmluZSBIRVZDX1NBT19NTVVfRE1BX0NUUkwyICAgICAgICAgICAgICAgICAgICAgMHgzNjRjCisjZGVmaW5lIEhFVkNfU0FPX01NVV9WSDBfQUREUjIgICAgICAgICAgICAgICAgICAgICAweDM2NGQKKyNkZWZpbmUgSEVWQ19TQU9fTU1VX1ZIMV9BRERSMiAgICAgICAgICAgICAgICAgICAgIDB4MzY0ZQorI2RlZmluZSBIRVZDX1NBT19NTVVfU1RBVFVTMiAgICAgICAgICAgICAgICAgICAgICAgMHgzNjUwCisjZGVmaW5lIEhFVkNfRFdfVkgwX0FERERSICAgICAgICAgICAgICAgICAgICAgICAgICAweDM2NWUKKyNkZWZpbmUgSEVWQ19EV19WSDFfQURERFIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzY1ZgorCisjaWZkZWYgQlVGTUdSX09OTFlfT0xEX0NISVAKKyN1bmRlZiBBVjFfU0tJUF9NT0RFX0lORk8KKyNkZWZpbmUgQVYxX1NLSVBfTU9ERV9JTkZPICBIRVZDX0FTU0lTVF9TQ1JBVENIX0IKKyNlbmRpZgorCisKKyNkZWZpbmUgQU9NX0FWMV9ERUNfSURMRSAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQU9NX0FWMV9ERUNfRlJBTUVfSEVBREVSICAgICAgICAgICAgIDEKKyNkZWZpbmUgQU9NX0FWMV9ERUNfVElMRV9FTkQgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQU9NX0FWMV9ERUNfVEdfRU5EICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQU9NX0FWMV9ERUNfTENVX0VORCAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQU9NX0FWMV9ERUNPREVfU0xJQ0UgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQU9NX0FWMV9TRUFSQ0hfSEVBRCAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgQU9NX0FWMV9EVU1QX0xNRU0gICAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgQU9NX0FWMV9GR1NfUEFSQU1fQ09OVCAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgQU9NX0FWMV9ESVNDQVJEX05BTCAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQU9NX0FWMV9SRVNVTFRfTkVFRF9NT1JFX0JVRkZFUiAgICAgIDB4MTEKKworLypzdGF0dXMqLworI2RlZmluZSBBT01fQVYxX0RFQ19QSUNfRU5EICAgICAgICAgICAgICAgICAgMHhlMAorLypBT01fQVYxX0ZHU19QQVJBOgorQml0WzExXSAtIDAgUmVhZCwgMSAtIFdyaXRlCitCaXRbMTA6OF0gLSBmaWxtX2dyYWluX3BhcmFtc19yZWZfaWR4LCBGb3IgV3JpdGUgcmVxdWVzdAorKi8KKyNkZWZpbmUgQU9NX0FWMV9GR1NfUEFSQU0gICAgICAgICAgICAgICAgICAgIDB4ZTEKKyNkZWZpbmUgQU9NX0FWMV9ERUNfUElDX0VORF9QUkUgICAgICAgICAgICAgIDB4ZTIKKyNkZWZpbmUgQU9NX0FWMV9IRUFEX1BBUlNFUl9ET05FICAgICAgICAgIDB4ZjAKKyNkZWZpbmUgQU9NX0FWMV9IRUFEX1NFQVJDSF9ET05FICAgICAgICAgIDB4ZjEKKyNkZWZpbmUgQU9NX0FWMV9TRVFfSEVBRF9QQVJTRVJfRE9ORSAgICAgIDB4ZjIKKyNkZWZpbmUgQU9NX0FWMV9GUkFNRV9IRUFEX1BBUlNFUl9ET05FICAgIDB4ZjMKKyNkZWZpbmUgQU9NX0FWMV9GUkFNRV9QQVJTRVJfRE9ORSAgIDB4ZjQKKyNkZWZpbmUgQU9NX0FWMV9SRURVTkRBTlRfRlJBTUVfSEVBRF9QQVJTRVJfRE9ORSAgIDB4ZjUKKyNkZWZpbmUgSEVWQ19BQ1RJT05fRE9ORSAgICAgICAgICAgIDB4ZmYKKworI2RlZmluZSBBT01fREVDT0RFX0JVRkVNUFRZICAgICAgICAweDIwCisjZGVmaW5lIEFPTV9ERUNPREVfVElNRU9VVCAgICAgICAgIDB4MjEKKyNkZWZpbmUgQU9NX1NFQVJDSF9CVUZFTVBUWSAgICAgICAgMHgyMgorI2RlZmluZSBBT01fREVDT0RFX09WRVJfU0laRSAgICAgICAweDIzCisjZGVmaW5lIEFPTV9FT1MgICAgICAgICAgICAgICAgICAgICAweDI0CisjZGVmaW5lIEFPTV9OQUxfREVDT0RFX0RPTkUgICAgICAgICAgICAweDI1CisKKyNkZWZpbmUgVkZfUE9PTF9TSVpFICAgICAgICAzMgorCisjdW5kZWYgcHJfaW5mbworI2RlZmluZSBwcl9pbmZvIHByaW50aworCisjZGVmaW5lIERFQ09ERV9NT0RFX1NJTkdMRQkJKCgweDgwIDw8IDI0KSB8IDApCisjZGVmaW5lIERFQ09ERV9NT0RFX01VTFRJX1NUUkVBTUJBU0UJKCgweDgwIDw8IDI0KSB8IDEpCisjZGVmaW5lIERFQ09ERV9NT0RFX01VTFRJX0ZSQU1FQkFTRQkoKDB4ODAgPDwgMjQpIHwgMikKKyNkZWZpbmUgREVDT0RFX01PREVfU0lOR0xFX0xPV19MQVRFTkNZICgoMHg4MCA8PCAyNCkgfCAzKQorI2RlZmluZSBERUNPREVfTU9ERV9NVUxUSV9GUkFNRUJBU0VfTk9IRUFEICgoMHg4MCA8PCAyNCkgfCA0KQorCisjZGVmaW5lICBBVjFfVFJJR0dFUl9GUkFNRV9ET05FCQkweDEwMAorI2RlZmluZSAgQVYxX1RSSUdHRVJfRlJBTUVfRU5BQkxFCTB4MjAwCisKKyNkZWZpbmUgTVZfTUVNX1VOSVQgMHgyNDAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlICJwYXJzZXJfY21kLmgiCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjZGVmaW5lIFBBUlNFUl9DTURfU0tJUF9DRkdfMCAweDAwMDAwOTBiCisKKyNkZWZpbmUgUEFSU0VSX0NNRF9TS0lQX0NGR18xIDB4MWIxNDE0MGYKKworI2RlZmluZSBQQVJTRVJfQ01EX1NLSVBfQ0ZHXzIgMHgwMDFiMTkxMAorCisjZGVmaW5lIFBBUlNFUl9DTURfTlVNQkVSIDM3CisKKy8qI2RlZmluZSBIRVZDX1BJQ19TVFJVQ1RfU1VQUE9SVCovCisvKiB0byByZW1vdmUsIGZpeCBidWlsZCBlcnJvciAqLworCisvKiNkZWZpbmUgQ09ERUNfTU1fRkxBR1NfRk9SX1ZERUNPREVSICAwKi8KKworI2RlZmluZSBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisjZGVmaW5lIFNVUFBPUlRfMTBCSVQKKy8qICNkZWZpbmUgRVJST1JfSEFORExFX0RFQlVHICovCisKKyNpZm5kZWYgU1RBVF9LVEhSRUFECisjZGVmaW5lIFNUQVRfS1RIUkVBRCAweDQwCisjZW5kaWYKKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKyNkZWZpbmUgTUFYX0RFQ09ERV9JTlNUQU5DRV9OVU0gICAgIDkKKworI2lmZGVmIERFQlVHX1VTRV9WUDlfREVWSUNFX05BTUUKKyNkZWZpbmUgTVVMVElfRFJJVkVSX05BTUUgImFtbXZkZWNfdnA5IgorI2Vsc2UKKyNkZWZpbmUgTVVMVElfRFJJVkVSX05BTUUgImFtbXZkZWNfYXYxIgorI2VuZGlmCisKKyNkZWZpbmUgQVVYX0JVRl9BTElHTihhZHIpICgoYWRyICsgMHhmKSAmICh+MHhmKSkKKyNpZmRlZiBERUJVR19VQ09ERV9MT0cKK3N0YXRpYyB1MzIgcHJlZml4X2F1eF9idWZfc2l6ZTsKK3N0YXRpYyB1MzIgc3VmZml4X2F1eF9idWZfc2l6ZTsKKyNlbHNlCitzdGF0aWMgdTMyIHByZWZpeF9hdXhfYnVmX3NpemUgPSAoMTYgKiAxMDI0KTsKK3N0YXRpYyB1MzIgc3VmZml4X2F1eF9idWZfc2l6ZTsKKyNlbmRpZgorI2lmIChkZWZpbmVkIERFQlVHX1VDT0RFX0xPRykgfHwgKGRlZmluZWQgREVCVUdfQ01EKQorLy8jZGVmaW5lIFVDT0RFX0xPR19CVUZfU0laRSAgICgxNiAqIDEwMjQpCisjZGVmaW5lIFVDT0RFX0xPR19CVUZfU0laRSAgICgxMDI0ICogMTAyNCkKKyNlbmRpZgorc3RhdGljIHVuc2lnbmVkIGludCBtYXhfZGVjb2RlX2luc3RhbmNlX251bQorCQkJCT0gTUFYX0RFQ09ERV9JTlNUQU5DRV9OVU07CitzdGF0aWMgdW5zaWduZWQgaW50IGRlY29kZV9mcmFtZV9jb3VudFtNQVhfREVDT0RFX0lOU1RBTkNFX05VTV07CitzdGF0aWMgdW5zaWduZWQgaW50IGRpc3BsYXlfZnJhbWVfY291bnRbTUFYX0RFQ09ERV9JTlNUQU5DRV9OVU1dOworc3RhdGljIHVuc2lnbmVkIGludCBtYXhfcHJvY2Vzc190aW1lW01BWF9ERUNPREVfSU5TVEFOQ0VfTlVNXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnVuX2NvdW50W01BWF9ERUNPREVfSU5TVEFOQ0VfTlVNXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW5wdXRfZW1wdHlbTUFYX0RFQ09ERV9JTlNUQU5DRV9OVU1dOworc3RhdGljIHVuc2lnbmVkIGludCBub3RfcnVuX3JlYWR5W01BWF9ERUNPREVfSU5TVEFOQ0VfTlVNXTsKKyNpZmRlZiBBT01fQVYxX01NVV9EVworc3RhdGljIHVuc2lnbmVkIGludCBkd19tbXVfZW5hYmxlW01BWF9ERUNPREVfSU5TVEFOQ0VfTlVNXTsKKyNlbmRpZgorCitzdGF0aWMgdTMyIGRlY29kZV90aW1lb3V0X3ZhbCA9IDYwMDsKK3N0YXRpYyBpbnQgc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCA9IDB4ODAwMDsKKy8vc3RhdGljIHUzMiB3b3JrX2J1Zl9zaXplOworc3RhdGljIHUzMiBmb3JjZV9wdHNfdW5zdGFibGU7CitzdGF0aWMgdTMyIG12X2J1Zl9tYXJnaW4gPSBSRUZfRlJBTUVTOworc3RhdGljIHUzMiBtdl9idWZfZHluYW1pY19hbGxvYzsKK3N0YXRpYyB1MzIgZm9yY2VfbWF4X29uZV9tdl9idWZmZXJfc2l6ZTsKKworLyogRE9VQkxFX1dSSVRFX01PREUgaXMgZW5hYmxlZCBvbmx5IHdoZW4gTlYyMSA4IGJpdCBvdXRwdXQgaXMgbmVlZGVkICovCisvKiBkb3VibGVfd3JpdGVfbW9kZToKKyAqCTAsIG5vIGRvdWJsZSB3cml0ZTsKKyAqCTEsIDE6MSByYXRpbzsKKyAqCTIsICgxLzQpOigxLzQpIHJhdGlvOworICoJMywgKDEvNCk6KDEvNCkgcmF0aW8sIHdpdGggYm90aCBjb21wcmVzc2VkIGZyYW1lIGluY2x1ZGVkCisgKgk0LCAoMS8yKTooMS8yKSByYXRpbzsKKyAqCTUsICgxLzIpOigxLzIpIHJhdGlvLCB3aXRoIGJvdGggY29tcHJlc3NlZCBmcmFtZSBpbmNsdWRlZAorICoJOCwgKDEvOCk6KDEvOCkgcmF0aW87CisgKgkweDEwLCBkb3VibGUgd3JpdGUgb25seQorICoJMHgyMCwgbW11IGRvdWJsZSB3cml0ZQorICoJMHgxMDAsIGlmID4gMTA4MHAsdXNlIG1vZGUgNCxlbHNlIHVzZSBtb2RlIDE7CisgKgkweDIwMCwgaWYgPiAxMDgwcCx1c2UgbW9kZSAyLGVsc2UgdXNlIG1vZGUgMTsKKyAqCTB4MzAwLCBpZiA+IDcyMHAsIHVzZSBtb2RlIDQsIGVsc2UgdXNlIG1vZGUgMTsKKyAqLworc3RhdGljIHUzMiBkb3VibGVfd3JpdGVfbW9kZTsKKworI2lmZGVmIERFQlVHX1VTRV9WUDlfREVWSUNFX05BTUUKKyNkZWZpbmUgRFJJVkVSX05BTUUgImFtdmRlY192cDkiCisjZGVmaW5lIERSSVZFUl9IRUFERVJfTkFNRSAiYW12ZGVjX3ZwOV9oZWFkZXIiCisjZWxzZQorI2RlZmluZSBEUklWRVJfTkFNRSAiYW12ZGVjX2F2MSIKKyNkZWZpbmUgRFJJVkVSX0hFQURFUl9OQU1FICJhbXZkZWNfYXYxX2hlYWRlciIKKyNlbmRpZgorCisjZGVmaW5lIFBVVF9JTlRFUlZBTCAgICAgICAgKEhaLzEwMCkKKyNkZWZpbmUgRVJST1JfU1lTVEVNX1JFU0VUX0NPVU5UICAgMjAwCisKKyNkZWZpbmUgUFRTX05PUk1BTCAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBUU19OT05FX1JFRl9VU0VfRFVSQVRJT04gMQorCisjZGVmaW5lIFBUU19NT0RFX1NXSVRDSElOR19USFJFU0hPTEQgICAgICAgICAgIDMKKyNkZWZpbmUgUFRTX01PREVfU1dJVENISU5HX1JFQ09WRVJZX1RIUkVBU0hPTEQgMworCisjZGVmaW5lIERVUjJQVFMoeCkgKCh4KSo5MC85NikKKyNkZWZpbmUgUFRTMkRVUih4KSAoKHgpKjk2LzkwKQorI2RlZmluZSBQVFMyRFVSX3U2NCh4KSAoZGl2X3U2NCgoeCkqOTYsIDkwKSkKKworc3RydWN0IEFWMUhXX3M7CitzdGF0aWMgaW50IHZhdjFfdmZfc3RhdGVzKHN0cnVjdCB2ZnJhbWVfc3RhdGVzICpzdGF0ZXMsIHZvaWQgKik7CitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2YXYxX3ZmX3BlZWsodm9pZCAqKTsKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZhdjFfdmZfZ2V0KHZvaWQgKik7CitzdGF0aWMgdm9pZCB2YXYxX3ZmX3B1dChzdHJ1Y3QgdmZyYW1lX3MgKiwgdm9pZCAqKTsKK3N0YXRpYyBpbnQgdmF2MV9ldmVudF9jYihpbnQgdHlwZSwgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKKworc3RhdGljIGludCB2YXYxX3N0b3Aoc3RydWN0IEFWMUhXX3MgKmh3KTsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCitzdGF0aWMgczMyIHZhdjFfaW5pdChzdHJ1Y3QgdmRlY19zICp2ZGVjKTsKKyNlbHNlCitzdGF0aWMgczMyIHZhdjFfaW5pdChzdHJ1Y3QgQVYxSFdfcyAqaHcpOworI2VuZGlmCitzdGF0aWMgdm9pZCB2YXYxX3Byb3RfaW5pdChzdHJ1Y3QgQVYxSFdfcyAqaHcsIHUzMiBtYXNrKTsKK3N0YXRpYyBpbnQgdmF2MV9sb2NhbF9pbml0KHN0cnVjdCBBVjFIV19zICpodyk7CitzdGF0aWMgdm9pZCB2YXYxX3B1dF90aW1lcl9mdW5jKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcik7CitzdGF0aWMgdm9pZCBkdW1wX2RhdGEoc3RydWN0IEFWMUhXX3MgKmh3LCBpbnQgc2l6ZSk7CitzdGF0aWMgdW5zaWduZWQgaW50IGdldF9kYXRhX2NoZWNrX3N1bQorCShzdHJ1Y3QgQVYxSFdfcyAqaHcsIGludCBzaXplKTsKK3N0YXRpYyB2b2lkIGR1bXBfcGljX2xpc3Qoc3RydWN0IEFWMUhXX3MgKmh3KTsKK3N0YXRpYyBpbnQgdmF2MV9tbXVfbWFwX2FsbG9jKHN0cnVjdCBBVjFIV19zICpodyk7CitzdGF0aWMgdm9pZCB2YXYxX21tdV9tYXBfZnJlZShzdHJ1Y3QgQVYxSFdfcyAqaHcpOworc3RhdGljIGludCBhdjFfYWxsb2NfbW11KAorCQlzdHJ1Y3QgQVYxSFdfcyAqaHcsCisJCWludCBjdXJfYnVmX2lkeCwKKwkJaW50IHBpY193aWR0aCwKKwkJaW50IHBpY19oZWlnaHQsCisJCXVuc2lnbmVkIHNob3J0IGJpdF9kZXB0aCwKKwkJdW5zaWduZWQgaW50ICptbXVfaW5kZXhfYWRyKTsKKworI2lmZGVmIERFQlVHX1VTRV9WUDlfREVWSUNFX05BTUUKK3N0YXRpYyBjb25zdCBjaGFyIHZhdjFfZGVjX2lkW10gPSAidnZwOS1kZXYiOworCisjZGVmaW5lIFBST1ZJREVSX05BTUUgICAiZGVjb2Rlci52cDkiCisjZGVmaW5lIE1VTFRJX0lOU1RBTkNFX1BST1ZJREVSX05BTUUgICAgInZkZWMudnA5IgorI2Vsc2UKK3N0YXRpYyBjb25zdCBjaGFyIHZhdjFfZGVjX2lkW10gPSAidmF2MS1kZXYiOworCisjZGVmaW5lIFBST1ZJREVSX05BTUUgICAiZGVjb2Rlci5hdjEiCisjZGVmaW5lIE1VTFRJX0lOU1RBTkNFX1BST1ZJREVSX05BTUUgICAgInZkZWMuYXYxIgorI2VuZGlmCisjZGVmaW5lIERWX1BST1ZJREVSX05BTUUgICJkdmJsZGVjIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHZmcmFtZV9vcGVyYXRpb25zX3MgdmF2MV92Zl9wcm92aWRlciA9IHsKKwkucGVlayA9IHZhdjFfdmZfcGVlaywKKwkuZ2V0ID0gdmF2MV92Zl9nZXQsCisJLnB1dCA9IHZhdjFfdmZfcHV0LAorCS5ldmVudF9jYiA9IHZhdjFfZXZlbnRfY2IsCisJLnZmX3N0YXRlcyA9IHZhdjFfdmZfc3RhdGVzLAorfTsKKworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcHJvdmlkZXJfcyB2YXYxX3ZmX3Byb3Y7CisKK3N0YXRpYyB1MzIgYml0X2RlcHRoX2x1bWE7CitzdGF0aWMgdTMyIGJpdF9kZXB0aF9jaHJvbWE7CitzdGF0aWMgdTMyIGZyYW1lX3dpZHRoOworc3RhdGljIHUzMiBmcmFtZV9oZWlnaHQ7CitzdGF0aWMgdTMyIHZpZGVvX3NpZ25hbF90eXBlOworc3RhdGljIHUzMiBvbl9ub19rZXlmcmFtZV9za2lwZWQ7CitzdGF0aWMgdTMyIHdpdGhvdXRfZGlzcGxheV9tb2RlOworc3RhdGljIHUzMiB2NGxfYml0c3RyZWFtX2lkX2VuYWJsZSA9IDE7CisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorc3RhdGljIHUzMiBmb3JjZV9kdl9lbmFibGU7CisjZW5kaWYKKworI2RlZmluZSBQUk9CX1NJWkUgICAgKDQ5NiAqIDIgKiA0KQorI2RlZmluZSBQUk9CX0JVRl9TSVpFICAgICgweDUwMDApCisjZGVmaW5lIENPVU5UX0JVRl9TSVpFICAgKDB4MzAwICogNCAqIDQpCisvKmNvbXB1dGVfbG9zbGVzc19jb21wX2JvZHlfc2l6ZSg0MDk2LCAyMzA0LCAxKSA9IDE4ODc0MzY4KDB4MTIwMDAwMCkqLworI2RlZmluZSBNQVhfRlJBTUVfNEtfTlVNIDB4MTIwMAorI2RlZmluZSBNQVhfRlJBTUVfOEtfTlVNIDB4NDgwMAorCisjZGVmaW5lIEhFVkNfQVNTSVNUX01NVV9NQVBfQUREUiAgICAgICAgICAgICAgICAgICAweDMwMDkKKworCisvKlVTRV9CVUZfQkxPQ0sqLworc3RydWN0IEJVRl9zIHsKKwlpbnQgaW5kZXg7CisJdW5zaWduZWQgaW50IGFsbG9jX2ZsYWc7CisJLypidWZmZXIgKi8KKwl1bnNpZ25lZCBpbnQgY21hX3BhZ2VfY291bnQ7CisJdW5zaWduZWQgbG9uZyBhbGxvY19hZGRyOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRyOworCXVuc2lnbmVkIGludCBzaXplOworCisJdW5zaWduZWQgaW50IGZyZWVfc3RhcnRfYWRyOworCXVsb25nIHY0bF9yZWZfYnVmX2FkZHI7CisJdWxvbmcJaGVhZGVyX2FkZHI7CisJdTMyIAloZWFkZXJfc2l6ZTsKKwl1MzIJbHVtYV9zaXplOworCXVsb25nCWNocm9tYV9hZGRyOworCXUzMgljaHJvbWFfc2l6ZTsKK30gLypCVUZfdCAqLzsKKworc3RydWN0IE1WQlVGX3MgeworCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRyOworCXVuc2lnbmVkIGludCBzaXplOworCWludCB1c2VkX2ZsYWc7Cit9IC8qTVZCVUZfdCAqLzsKKworLyojZGVmaW5lIFRFU1RfV1JfUFRSX0lOQyovCisvKiNkZWZpbmUgV1JfUFRSX0lOQ19OVU0gMTI4Ki8KKyNkZWZpbmUgV1JfUFRSX0lOQ19OVU0gMQorCisvLyNkZWZpbmUgU0lNVUxBVElPTgorI2RlZmluZSBET1NfUFJPSkVDVAorI3VuZGVmIE1FTU9SWV9NQVBfSU5fUkVBTF9DSElQCisKKy8qI3VuZGVmIERPU19QUk9KRUNUKi8KKy8qI2RlZmluZSBNRU1PUllfTUFQX0lOX1JFQUxfQ0hJUCovCisKKy8qI2RlZmluZSBDT05GSUdfSEVWQ19DTEtfRk9SQ0VEX09OKi8KKy8qI2RlZmluZSBFTkFCTEVfU1dBUF9URVNUKi8KKyNpZm5kZWYgQlVGTUdSX09OTFlfT0xEX0NISVAKKyNkZWZpbmUgICBNQ1JDQ19FTkFCTEUKKyNlbmRpZgorCisjaWZkZWYgQVYxXzEwQl9OVjIxCisjZWxzZQorI2RlZmluZSBMT1NMRVNTX0NPTVBSRVNTX01PREUKKyNlbmRpZgorCitzdGF0aWMgdTMyIGdldF9waWN0dXJlX3FvczsKKworc3RhdGljIHUzMiBkZWJ1ZzsKKworc3RhdGljIGJvb2wgaXNfcmVzZXQ7CisvKmZvciBkZWJ1ZyovCitzdGF0aWMgdTMyIGZvcmNlX2J1ZnNwZWM7CisvKgorCXVkZWJ1Z19mbGFnOgorCWJpdCAwLCBlbmFibGUgdWNvZGUgcHJpbnQKKwliaXQgMSwgZW5hYmxlIHVjb2RlIGRldGFpbCBwcmludAorCWJpdCBbMzE6MTZdIG5vdCAwLCBwb3MgdG8gZHVtcCBsbWVtCisJCWJpdCAyLCBwb3AgYml0cyB0byBsbWVtCisJCWJpdCBbMTE6OF0sIHByZS1wb3AgYml0cyBmb3IgYWxpZ25tZW50ICh3aGVuIGJpdCAyIGlzIDEpCisqLworc3RhdGljIHUzMiB1ZGVidWdfZmxhZzsKKy8qCisJd2hlbiB1ZGVidWdfZmxhZ1sxOjBdIGlzIG5vdCAwCisJdWRlYnVnX3BhdXNlX3BvcyBub3QgMCwKKwkJcGF1c2UgcG9zaXRpb24KKyovCitzdGF0aWMgdTMyIHVkZWJ1Z19wYXVzZV9wb3M7CisvKgorCXdoZW4gdWRlYnVnX2ZsYWdbMTowXSBpcyBub3QgMAorCWFuZCB1ZGVidWdfcGF1c2VfcG9zIGlzIG5vdCAwLAorCQlwYXVzZSBvbmx5IHdoZW4gREVCVUdfUkVHMiBpcyBlcXVhbCB0byB0aGlzIHZhbAorKi8KK3N0YXRpYyB1MzIgdWRlYnVnX3BhdXNlX3ZhbDsKKworc3RhdGljIHUzMiB1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeDsKKworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCitzdGF0aWMgdTMyIGR2X3RvZ2dsZV9wcm92X25hbWU7CisjZW5kaWYKKworc3RhdGljIHUzMiBydW5fcmVhZHlfbWluX2J1Zl9udW0gPSAyOworI2lmZGVmIERFQlVHX0NSQ19FUlJPUgorLyoKKyAgYml0WzRdIGZpbGwgemVybyBpbiBoZWFkZXIgYmVmb3JlIHN0YXJ0aW5nCisgIGJpdFs1XSBkdW1wIG1tdSBoZWFkZXIgYWx3YXlzCisKKyAgYml0WzZdIGR1bXAgbXYgYnVmZmVyIGFsd2F5cworCisgIGJpdFs4XSBkZWxheSBhZnRlciBkZWNvZGluZworICBiaXRbMzF+MTZdIGRlbGF5ZWQgbXNlY29uZHMKKyovCitzdGF0aWMgdTMyIGNyY19kZWJ1Z19mbGFnOworI2VuZGlmCisjaWZkZWYgREVCVUdfQ01ECitzdGF0aWMgdTMyIGhlYWRlcl9kdW1wX3NpemUgPSAweDEwMDAwOworc3RhdGljIHUzMiBkZWJ1Z19jbWRfd2FpdF9jb3VudDsKK3N0YXRpYyB1MzIgZGVidWdfY21kX3dhaXRfdHlwZTsKKyNlbmRpZgorIworI2RlZmluZSBERUJVR19SRUcKKyNpZmRlZiBERUJVR19SRUcKK3ZvaWQgQVYxX1dSSVRFX1ZSRUdfREJHMih1bnNpZ25lZCBpbnQgYWRyLCB1bnNpZ25lZCBpbnQgdmFsLCBpbnQgbGluZSkKK3sKKwlpZiAoZGVidWcgJiBBVjFfREVCVUdfUkVHKQorCQlwcl9pbmZvKCIlZDolcygleCwgJXgpXG4iLCBsaW5lLCBfX2Z1bmNfXywgYWRyLCB2YWwpOworCWlmIChhZHIgIT0gMCkKKwkJV1JJVEVfVlJFRyhhZHIsIHZhbCk7Cit9CisKKyN1bmRlZiBXUklURV9WUkVHCisjZGVmaW5lIFdSSVRFX1ZSRUcoYSx2KSBBVjFfV1JJVEVfVlJFR19EQkcyKGEsdixfX0xJTkVfXykKKyNlbmRpZgorCisjZGVmaW5lIEZSQU1FX0NOVF9XSU5ET1dfU0laRSA1OQorI2RlZmluZSBSQVRFX0NPUlJFQ1RJT05fVEhSRVNIT0xEIDUKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitBVjEgYnVmZmVyIG1hbmFnZW1lbnQgc3RhcnQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfMTA4MFAgIDB4MTAwMDAKKyNkZWZpbmUgTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFXzRLICAweDQ4MDAwCisjZGVmaW5lIE1NVV9DT01QUkVTU19IRUFERVJfU0laRV84SyAgMHgxMjAwMDAKKworLy8jZGVmaW5lIE1NVV9DT01QUkVTU19IRUFERVJfU0laRSAgMHg0ODAwMAorLy8jZGVmaW5lIE1BWF9PTkVfTVZfQlVGRkVSX1NJWkUgICAweDI2MDAwMAorLy8jZGVmaW5lIE1BWF9PTkVfTVZfQlVGRkVSX1NJWkUgICAweDEzMDAwMAorCisjZGVmaW5lIE1BWF9PTkVfTVZfQlVGRkVSX1NJWkVfMTA4MFAgMHgyMDQwMAorI2RlZmluZSBNQVhfT05FX01WX0JVRkZFUl9TSVpFXzRLICAweDkxNDAwCisjZGVmaW5lIE1BWF9PTkVfTVZfQlVGRkVSX1NJWkVfOEsgMHgyNDQ4MDAKKy8qdG8gc3VwcG9ydCB0bTJyZXZiIGFuZCBzYzIqLworI2RlZmluZSBNQVhfT05FX01WX0JVRkZFUl9TSVpFXzEwODBQX1RNMlJFVkIgMHgyNjQwMAorI2RlZmluZSBNQVhfT05FX01WX0JVRkZFUl9TSVpFXzRLX1RNMlJFVkIgIDB4YWM0MDAKKyNkZWZpbmUgTUFYX09ORV9NVl9CVUZGRVJfU0laRV84S19UTTJSRVZCIDB4MmIwODAwCisKK3N0YXRpYyBpbnQgdmF2MV9tbXVfY29tcHJlc3NfaGVhZGVyX3NpemUoc3RydWN0IEFWMUhXX3MgKmh3KTsKKworLy8jZGVmaW5lIE1NVV9DT01QUkVTU19IRUFERVJfU0laRSAgMHg0ODAwMAorLy8jZGVmaW5lIE1NVV9DT01QUkVTU19IRUFERVJfU0laRV9EVyBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkUKKy8vI2RlZmluZSBNTVVfQ09NUFJFU1NfOEtfSEVBREVSX1NJWkUgICgweDQ4MDAwKjQpCisjZGVmaW5lIE1BWF9TSVpFXzhLICg4MTkyICogNDYwOCkKKyNkZWZpbmUgTUFYX1NJWkVfNEsgKDQwOTYgKiAyMzA0KQorI2RlZmluZSBNQVhfU0laRV8ySyAoMTkyMCAqIDEwODgpCisjZGVmaW5lIElTXzhLX1NJWkUodywgaCkJKCgodykgKiAoaCkpID4gTUFYX1NJWkVfNEspCisjZGVmaW5lIElTXzRLX1NJWkUodywgaCkgICgoKHcpICogKGgpKSA+ICgxOTIwKjEwODgpKQorCisjZGVmaW5lIElOVkFMSURfSURYIC0xICAvKiBJbnZhbGlkIGJ1ZmZlciBpbmRleC4qLworCisKKy8qNCBzY3JhdGNoIGZyYW1lcyBmb3IgdGhlIG5ldyBmcmFtZXMgdG8gc3VwcG9ydCBhIG1heGltdW0gb2YgNCBjb3JlcyBkZWNvZGluZworICppbiBwYXJhbGxlbCwgMyBmb3Igc2NhbGVkIHJlZmVyZW5jZXMgb24gdGhlIGVuY29kZXIuCisgKlRPRE8oaGt1YW5nKTogQWRkIG9uZGVtYW5kIGZyYW1lIGJ1ZmZlcnMgaW5zdGVhZCBvZiBoYXJkY29kaW5nIHRoZSBudW1iZXIKKyAqIC8vIG9mIGZyYW1lYnVmZmVycy4KKyAqVE9ETyhqa29sZXN6YXIpOiBUaGVzZSAzIGV4dHJhIHJlZmVyZW5jZXMgY291bGQgcHJvYmFibHkgY29tZSBmcm9tIHRoZQorICpub3JtYWwgcmVmZXJlbmNlIHBvb2wuCisgKi8KKy8vI2RlZmluZSBGUkFNRV9CVUZGRVJTIChSRUZfRlJBTUVTICsgMTYpCisvLyNkZWZpbmUgUkVGX0ZSQU1FU180SyAoNikKKyNkZWZpbmUgUkVGX0ZSQU1FU180SyBSRUZfRlJBTUVTCisKKyNpZmRlZiBVU0VfU1BFQ19CVUZfRk9SX01NVV9IRUFECisjZGVmaW5lIEhFQURFUl9GUkFNRV9CVUZGRVJTICgwKQorI2VsaWYgKGRlZmluZWQgQU9NX0FWMV9NTVVfRFcpCisjZGVmaW5lIEhFQURFUl9GUkFNRV9CVUZGRVJTICgyICogRlJBTUVfQlVGRkVSUykKKyNlbHNlCisjZGVmaW5lIEhFQURFUl9GUkFNRV9CVUZGRVJTIChGUkFNRV9CVUZGRVJTKQorI2VuZGlmCisjZGVmaW5lIE1BWF9CVUZfTlVNIChGUkFNRV9CVUZGRVJTKQorI2RlZmluZSBNVl9CVUZGRVJfTlVNCUZSQU1FX0JVRkZFUlMKKworLy8jZGVmaW5lIEZSQU1FX0NPTlRFWFRTX0xPRzIgMgorLy8jZGVmaW5lIEZSQU1FX0NPTlRFWFRTICgxIDw8IEZSQU1FX0NPTlRFWFRTX0xPRzIpCisvKmJ1ZmZlciArIGhlYWRlciBidWZmZXIgKyB3b3Jrc3BhY2UqLworI2lmZGVmIE1WX1VTRV9GSVhFRF9CVUYKKyNkZWZpbmUgTUFYX0JNTVVfQlVGRkVSX05VTSAoRlJBTUVfQlVGRkVSUyArIEhFQURFUl9GUkFNRV9CVUZGRVJTICsgMSkKKyNkZWZpbmUgVkZfQlVGRkVSX0lEWChuKSAobikKKyNkZWZpbmUgSEVBREVSX0JVRkZFUl9JRFgobikgKEZSQU1FX0JVRkZFUlMgKyBuKQorI2RlZmluZSBXT1JLX1NQQUNFX0JVRl9JRCAoRlJBTUVfQlVGRkVSUyArIEhFQURFUl9GUkFNRV9CVUZGRVJTKQorI2Vsc2UKKyNkZWZpbmUgTUFYX0JNTVVfQlVGRkVSX05VTSBcCisJKEZSQU1FX0JVRkZFUlMgKyBIRUFERVJfRlJBTUVfQlVGRkVSUyArIE1WX0JVRkZFUl9OVU0gKyAxKQorI2RlZmluZSBWRl9CVUZGRVJfSURYKG4pIChuKQorI2RlZmluZSBIRUFERVJfQlVGRkVSX0lEWChuKSAoRlJBTUVfQlVGRkVSUyArIG4pCisjZGVmaW5lIE1WX0JVRkZFUl9JRFgobikgKEZSQU1FX0JVRkZFUlMgKyBIRUFERVJfRlJBTUVfQlVGRkVSUyArIG4pCisjZGVmaW5lIFdPUktfU1BBQ0VfQlVGX0lEIFwKKwkoRlJBTUVfQlVGRkVSUyArIEhFQURFUl9GUkFNRV9CVUZGRVJTICsgTVZfQlVGRkVSX05VTSkKKyNlbmRpZgorI2lmZGVmIEFPTV9BVjFfTU1VX0RXCisjZGVmaW5lIERXX0hFQURFUl9CVUZGRVJfSURYKG4pIChIRUFERVJfQlVGRkVSX0lEWChIRUFERVJfRlJBTUVfQlVGRkVSUy8yKSArIG4pCisjZW5kaWYKKworCitzdGF0aWMgdm9pZCBzZXRfY2FudmFzKHN0cnVjdCBBVjFIV19zICpodywKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljX2NvbmZpZyk7CisKK3N0YXRpYyB2b2lkIGZpbGxfZnJhbWVfaW5mbyhzdHJ1Y3QgQVYxSFdfcyAqaHcsCisJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKmZyYW1lLAorCXVuc2lnbmVkIGludCBmcmFtZXNpemUsCisJdW5zaWduZWQgaW50IHB0cyk7CisKKworc3RhdGljIGludCAgY29tcHV0ZV9sb3NsZXNzX2NvbXBfYm9keV9zaXplKGludCB3aWR0aCwgaW50IGhlaWdodCwKKwkJCQl1aW50OF90IGlzX2JpdF9kZXB0aF8xMCk7CisKK3ZvaWQgY2xlYXJfZnJhbWVfYnVmX3JlZl9jb3VudChBVjFEZWNvZGVyICpwYmkpOworCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorI2RlZmluZSBERUNfUkVTVUxUX05PTkUgICAgICAgICAgICAgMAorI2RlZmluZSBERUNfUkVTVUxUX0RPTkUgICAgICAgICAgICAgMQorI2RlZmluZSBERUNfUkVTVUxUX0FHQUlOICAgICAgICAgICAgMgorI2RlZmluZSBERUNfUkVTVUxUX0NPTkZJR19QQVJBTSAgICAgMworI2RlZmluZSBERUNfUkVTVUxUX0VSUk9SICAgICAgICAgICAgNAorI2RlZmluZSBERUNfSU5JVF9QSUNMSVNUCQkJNQorI2RlZmluZSBERUNfVU5JTklUX1BJQ0xJU1QJCQk2CisjZGVmaW5lIERFQ19SRVNVTFRfR0VUX0RBVEEgICAgICAgICA3CisjZGVmaW5lIERFQ19SRVNVTFRfR0VUX0RBVEFfUkVUUlkgICA4CisjZGVmaW5lIERFQ19SRVNVTFRfRU9TICAgICAgICAgICAgICA5CisjZGVmaW5lIERFQ19SRVNVTFRfRk9SQ0VfRVhJVCAgICAgICAxMAorCisjZGVmaW5lIERFQ19TMV9SRVNVTFRfTk9ORSAgICAgICAgICAwCisjZGVmaW5lIERFQ19TMV9SRVNVTFRfRE9ORSAgICAgICAgICAxCisjZGVmaW5lIERFQ19TMV9SRVNVTFRfRk9SQ0VfRVhJVCAgICAgICAyCisjZGVmaW5lIERFQ19TMV9SRVNVTFRfVEVTVF9UUklHR0VSX0RPTkUJMHhmMAorCisjaWZkZWYgRkJfREVDT0RJTkdfVEVTVF9TQ0hFRFVMRQorI2RlZmluZSBURVNUX1NFVF9OT05FICAgICAgICAwCisjZGVmaW5lIFRFU1RfU0VUX1BJQ19ET05FICAgIDEKKyNkZWZpbmUgVEVTVF9TRVRfUzJfRE9ORSAgICAgMgorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGF2MV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisjZW5kaWYKKworI2lmZGVmIERVTVBfRklMTUdSQUlOCit1MzIgZmdfZHVtcF9pbmRleCA9IDB4ZmY7CisjZW5kaWYKKworI2lmZGVmIEFPTV9BVjFfREJMS19JTklUCitzdHJ1Y3QgbG9vcF9maWx0ZXJfaW5mb19uX3M7CitzdHJ1Y3QgbG9vcGZpbHRlcjsKK3N0cnVjdCBzZWdtZW50YXRpb25fbGY7CisjZW5kaWYKK3N0cnVjdCBBVjFIV19zIHsKKwlBVjFEZWNvZGVyICpwYmk7CisJdW5pb24gcGFyYW1fdSBhb21fcGFyYW07CisJdW5zaWduZWQgY2hhciBmcmFtZV9kZWNvZGVkOworCXVuc2lnbmVkIGNoYXIgb25lX2NvbXByZXNzZWRfZGF0YV9kb25lOworCXVuc2lnbmVkIGNoYXIgbmV3X2NvbXByZXNzZWRfZGF0YTsKKyNpZiAxCisvKmRlZiBDSEVDS19PQlVfUkVEVU5EQU5UX0ZSQU1FX0hFQURFUiovCisJaW50IG9idV9mcmFtZV9mcmFtZV9oZWFkX2NvbWVfYWZ0ZXJfdGlsZTsKKyNlbmRpZgorCXVuc2lnbmVkIGNoYXIgaW5kZXg7CisKKwlzdHJ1Y3QgZGV2aWNlICpjbWFfZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRmb3JtX2RldjsKKwl2b2lkICgqdmRlY19jYikoc3RydWN0IHZkZWNfcyAqLCB2b2lkICopOworCXZvaWQgKnZkZWNfY2JfYXJnOworCXN0cnVjdCB2ZnJhbWVfY2h1bmtfcyAqY2h1bms7CisJaW50IGRlY19yZXN1bHQ7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3RydWN0IHdvcmtfc3RydWN0IHNldF9jbGtfd29yazsKKwl1MzIgc3RhcnRfc2hpZnRfYnl0ZXM7CisJdTMyIGRhdGFfc2l6ZTsKKworCXN0cnVjdCBCdWZmSW5mb19zIHdvcmtfc3BhY2VfYnVmX3N0b3JlOworCXVuc2lnbmVkIGxvbmcgYnVmX3N0YXJ0OworCXUzMiBidWZfc2l6ZTsKKwl1MzIgY21hX2FsbG9jX2NvdW50OworCXVuc2lnbmVkIGxvbmcgY21hX2FsbG9jX2FkZHI7CisJdWludDhfdCBlb3M7CisJdW5zaWduZWQgbG9uZyBpbnQgc3RhcnRfcHJvY2Vzc190aW1lOworCXVuc2lnbmVkIGxhc3RfbGN1X2lkeDsKKwlpbnQgZGVjb2RlX3RpbWVvdXRfY291bnQ7CisJdW5zaWduZWQgdGltZW91dF9udW07CisJaW50IHNhdmVfYnVmZmVyX21vZGU7CisKKwlpbnQgZG91YmxlX3dyaXRlX21vZGU7CisKKwlsb25nIHVzZWRfNGtfbnVtOworCisJdW5zaWduZWQgY2hhciBtX2luc19mbGFnOworCWNoYXIgKnByb3ZpZGVyX25hbWU7CisJdW5pb24gcGFyYW1fdSBwYXJhbTsKKwlpbnQgZnJhbWVfY291bnQ7CisJaW50IHBpY19jb3VudDsKKwl1MzIgc3RhdDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwl1MzIgZnJhbWVfZHVyOworCXUzMiBmcmFtZV9hcjsKKwlpbnQgZmF0YWxfZXJyb3I7CisJdWludDhfdCBpbml0X2ZsYWc7CisJdWludDhfdCBjb25maWdfbmV4dF9yZWZfaW5mb19mbGFnOworCXVpbnQ4X3QgZmlyc3Rfc2NfY2hlY2tlZDsKKwl1aW50OF90IHByb2Nlc3NfYnVzeTsKKyNkZWZpbmUgUFJPQ19TVEFURV9JTklUCQkJMAorI2RlZmluZSBQUk9DX1NUQVRFX0RFQ09ERVNMSUNFCTEKKyNkZWZpbmUgUFJPQ19TVEFURV9TRU5EQUdBSU4JMgorCXVpbnQ4X3QgcHJvY2Vzc19zdGF0ZTsKKwl1MzIgdWNvZGVfcGF1c2VfcG9zOworCisJaW50IHNob3dfZnJhbWVfbnVtOworCXN0cnVjdCBidWZmX3MgbWNfYnVmX3NwZWM7CisJc3RydWN0IGRlY19zeXNpbmZvIHZhdjFfYW1zdHJlYW1fZGVjX2luZm87CisJdm9pZCAqcnBtX2FkZHI7CisJdm9pZCAqbG1lbV9hZGRyOworCWRtYV9hZGRyX3QgcnBtX3BoeV9hZGRyOworCWRtYV9hZGRyX3QgbG1lbV9waHlfYWRkcjsKKwl1bnNpZ25lZCBzaG9ydCAqbG1lbV9wdHI7CisJdW5zaWduZWQgc2hvcnQgKmRlYnVnX3B0cjsKKyNpZmRlZiBEVU1QX0ZJTE1HUkFJTgorCWRtYV9hZGRyX3QgZmdfcGh5X2FkZHI7CisJdW5zaWduZWQgY2hhciAqZmdfcHRyOworCXZvaWQgKmZnX2FkZHI7CisjZW5kaWYKKwl1MzIgZmdzX3ZhbGlkOworCisJdTggYXV4X2RhdGFfZGlydHk7CisJdTMyIHByZWZpeF9hdXhfc2l6ZTsKKwl1MzIgc3VmZml4X2F1eF9zaXplOworCXZvaWQgKmF1eF9hZGRyOworCWRtYV9hZGRyX3QgYXV4X3BoeV9hZGRyOworCWNoYXIgKmR2X2RhdGFfYnVmOworCWludCBkdl9kYXRhX3NpemU7CisjaWYgKGRlZmluZWQgREVCVUdfVUNPREVfTE9HKSB8fCAoZGVmaW5lZCBERUJVR19DTUQpCisJdm9pZCAqdWNvZGVfbG9nX2FkZHI7CisJZG1hX2FkZHJfdCB1Y29kZV9sb2dfcGh5X2FkZHI7CisjZW5kaWYKKworCXZvaWQgKnByb2JfYnVmZmVyX2FkZHI7CisJdm9pZCAqY291bnRfYnVmZmVyX2FkZHI7CisJZG1hX2FkZHJfdCBwcm9iX2J1ZmZlcl9waHlfYWRkcjsKKwlkbWFfYWRkcl90IGNvdW50X2J1ZmZlcl9waHlfYWRkcjsKKworCXZvaWQgKmZyYW1lX21tdV9tYXBfYWRkcjsKKwlkbWFfYWRkcl90IGZyYW1lX21tdV9tYXBfcGh5X2FkZHI7CisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKwl2b2lkICpkd19mcmFtZV9tbXVfbWFwX2FkZHI7CisJZG1hX2FkZHJfdCBkd19mcmFtZV9tbXVfbWFwX3BoeV9hZGRyOworI2VuZGlmCisJdW5zaWduZWQgaW50IHVzZV9jbWFfZmxhZzsKKworCXN0cnVjdCBCVUZfcyBtX0JVRltNQVhfQlVGX05VTV07CisJc3RydWN0IE1WQlVGX3MgbV9tdl9CVUZbTVZfQlVGRkVSX05VTV07CisJdTMyIHVzZWRfYnVmX251bTsKKwl1MzIgbXZfYnVmX21hcmdpbjsKKwlERUNMQVJFX0tGSUZPKG5ld2ZyYW1lX3EsIHN0cnVjdCB2ZnJhbWVfcyAqLCBWRl9QT09MX1NJWkUpOworCURFQ0xBUkVfS0ZJRk8oZGlzcGxheV9xLCBzdHJ1Y3QgdmZyYW1lX3MgKiwgVkZfUE9PTF9TSVpFKTsKKwlERUNMQVJFX0tGSUZPKHBlbmRpbmdfcSwgc3RydWN0IHZmcmFtZV9zICosIFZGX1BPT0xfU0laRSk7CisJc3RydWN0IHZmcmFtZV9zIHZmcG9vbFtWRl9QT09MX1NJWkVdOworCXUzMiB2Zl9wcmVfY291bnQ7CisJdTMyIHZmX2dldF9jb3VudDsKKwl1MzIgdmZfcHV0X2NvdW50OworCWludCBidWZfbnVtOworCWludCBwaWNfbnVtOworCWludCBsY3Vfc2l6ZV9sb2cyOworCXVuc2lnbmVkIGludCBsb3NsZXNzX2NvbXBfYm9keV9zaXplOworCisJdTMyIHZpZGVvX3NpZ25hbF90eXBlOworCisJdTMyIHB0c191bnN0YWJsZTsKKwl1MzIgbGFzdF9jaHVua19wdHM7CisJdTMyIHB0c19kaWZmX2NvdW50OworCXU2NCBwdHNfZGlmZl9zdW07CisKKwlib29sIGdldF9mcmFtZV9kdXI7CisKKwl1MzIgc2F2ZWRfcmVzb2x1dGlvbjsKKwkvKiovCisJc3RydWN0IEFWMV9Db21tb25fcyBjb21tb247CisJc3RydWN0IFJlZkNudEJ1ZmZlcl9zICpjdXJfYnVmOworCWludCByZWZyZXNoX2ZyYW1lX2ZsYWdzOworCXVpbnQ4X3QgbmVlZF9yZXN5bmM7CisJdWludDhfdCBob2xkX3JlZl9idWY7CisJdWludDhfdCByZWFkeV9mb3JfbmV3X2RhdGE7CisJc3RydWN0IEJ1ZmZlclBvb2xfcyBhdjFfYnVmZmVyX3Bvb2w7CisKKwlzdHJ1Y3QgQnVmZkluZm9fcyAqd29ya19zcGFjZV9idWY7CisKKwlzdHJ1Y3QgYnVmZl9zICptY19idWY7CisKKwl1bnNpZ25lZCBpbnQgZnJhbWVfd2lkdGg7CisJdW5zaWduZWQgaW50IGZyYW1lX2hlaWdodDsKKworCXVuc2lnbmVkIHNob3J0ICpycG1fcHRyOworCWludCAgICAgaW5pdF9waWNfdzsKKwlpbnQgICAgIGluaXRfcGljX2g7CisJaW50ICAgICBsY3VfdG90YWw7CisKKwlpbnQgICAgIGN1cnJlbnRfbGN1X3NpemU7CisKKwlpbnQgICAgIHNsaWNlX3R5cGU7CisKKwlpbnQgc2tpcF9mbGFnOworCWludCBkZWNvZGVfaWR4OworCWludCByZXN1bHRfZG9uZV9jb3VudDsKKwl1aW50OF90IGhhc19rZXlmcmFtZTsKKwl1aW50OF90IGhhc19zZXF1ZW5jZTsKKwl1aW50OF90IHdhaXRfYnVmOworCXVpbnQ4X3QgZXJyb3JfZmxhZzsKKworCS8qIGJpdCAwLCBmb3IgZGVjb2Rpbmc7IGJpdCAxLCBmb3IgZGlzcGxheWluZyAqLworCXVpbnQ4X3QgaWdub3JlX2J1Zm1ncl9lcnJvcjsKKwlpbnQgUEJfc2tpcF9tb2RlOworCWludCBQQl9za2lwX2NvdW50X2FmdGVyX2RlY29kaW5nOworCS8qaHcqLworCisJLyoqLworCXN0cnVjdCB2ZGVjX2luZm8gKmd2czsKKworCXUzMiBwcmVfc3RyZWFtX29mZnNldDsKKworCXVuc2lnbmVkIGludCBkZWNfc3RhdHVzOworCXUzMiBsYXN0X3B1dF9pZHg7CisJaW50IG5ld19mcmFtZV9kaXNwbGF5ZWQ7CisJdm9pZCAqbW11X2JveDsKKwl2b2lkICpibW11X2JveDsKKwlpbnQgbW11X2VuYWJsZTsKKyNpZmRlZiBBT01fQVYxX01NVV9EVworCXZvaWQgKm1tdV9ib3hfZHc7CisJaW50IGR3X21tdV9lbmFibGU7CisjZW5kaWYKKwlzdHJ1Y3QgdmZyYW1lX21hc3Rlcl9kaXNwbGF5X2NvbG91cl9zIHZmX2RwOworCXN0cnVjdCBmaXJtd2FyZV9zICpmdzsKKwlpbnQgbWF4X3BpY193OworCWludCBtYXhfcGljX2g7CisJaW50IGJ1ZmZlcl9zcGVjX2luZGV4OworCWludDMyX3QgbWF4X29uZV9tdl9idWZmZXJfc2l6ZTsKKworCWludCBuZWVkX2NhY2hlX3NpemU7CisJdTY0IHNjX3N0YXJ0X3RpbWU7CisJYm9vbCBwb3N0cHJvY19kb25lOworCWludCBsb3dfbGF0ZW5jeV9mbGFnOworCWJvb2wgbm9faGVhZDsKKwlib29sIHBpY19saXN0X2luaXRfZG9uZTsKKwlib29sIHBpY19saXN0X2luaXRfZG9uZTI7CisJYm9vbCBpc191c2VkX3Y0bDsKKwl2b2lkICp2NGwyX2N0eDsKKwlib29sIHY0bF9wYXJhbXNfcGFyc2VkOworCWludCBmcmFtZWluZm9fZW5hYmxlOworCXN0cnVjdCB2ZnJhbWVfcW9zX3MgdmZyYW1lX3FvczsKKworI2lmZGVmIEFPTV9BVjFfREJMS19JTklUCisJLyoKKwkgKiBtYWxsb2MgbWF5IG5vdCB3b3JrIGluIHJlYWwgY2hpcCwgcGxlYXNlIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmVzCisJICovCisJc3RydWN0IGxvb3BfZmlsdGVyX2luZm9fbl9zICpsZmk7CisJc3RydWN0IGxvb3BmaWx0ZXIgKmxmOworCXN0cnVjdCBzZWdtZW50YXRpb25fbGYgKnNlZ180bGY7CisjZW5kaWYKKwl1MzIgbWVtX21hcF9tb2RlOworCXUzMiBkeW5hbWljX2J1Zl9udW1fbWFyZ2luOworCXN0cnVjdCB2ZnJhbWVfcyB2ZnJhbWVfZHVtbXk7CisJdTMyIHJlc19jaF9mbGFnOworCWludCBidWZmZXJfd3JhcFtGUkFNRV9CVUZGRVJTXTsKKwlpbnQgc2lkZWJpbmRfdHlwZTsKKwlpbnQgc2lkZWJpbmRfY2hhbm5lbF9pZDsKKwl1MzIgY3VyX29idV90eXBlOworCXUzMiBtdWx0aV9mcmFtZV9jbnQ7CisJdTMyIGVuZGlhbjsKKwl1MzIgcnVuX3JlYWR5X21pbl9idWZfbnVtOworCWludCBvbmVfcGFja2FnZV9mcmFtZV9jbnQ7CisJdWxvbmcgZmJfdG9rZW47CisJZG1hX2FkZHJfdCByZG1hX3BoeV9hZHI7CisJdW5zaWduZWQgKnJkbWFfYWRyOworCXN0cnVjdCB0cmFjZV9kZWNvZGVyX25hbWUgdHJhY2U7Cit9OworCitzdGF0aWMgdm9pZCBhdjFfZHVtcF9zdGF0ZShzdHJ1Y3QgdmRlY19zICp2ZGVjKTsKKworaW50IGF2MV9wcmludChzdHJ1Y3QgQVYxSFdfcyAqaHcsCisJaW50IGZsYWcsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworI2RlZmluZSBIRVZDX1BSSU5UX0JVRgkJNTEyCisJdW5zaWduZWQgY2hhciBidWZbSEVWQ19QUklOVF9CVUZdOworCWludCBsZW4gPSAwOworCisJaWYgKGh3ID09IE5VTEwgfHwKKwkJKGZsYWcgPT0gMCkgfHwKKwkJKGRlYnVnICYgZmxhZykpIHsKKwkJdmFfbGlzdCBhcmdzOworCisJCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJCWlmIChodykKKwkJCWxlbiA9IHNwcmludGYoYnVmLCAiWyVkXSIsIGh3LT5pbmRleCk7CisJCXZzbnByaW50ZihidWYgKyBsZW4sIEhFVkNfUFJJTlRfQlVGIC0gbGVuLCBmbXQsIGFyZ3MpOworCQlwcl9pbmZvKCIlcyIsIGJ1Zik7CisJCXZhX2VuZChhcmdzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGNoYXIgYXYxX2lzX2RlYnVnKGludCBmbGFnKQoreworCWlmICgoZmxhZyA9PSAwKSB8fCAoZGVidWcgJiBmbGFnKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGF2MV9wcmludDIoaW50IGZsYWcsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXVuc2lnbmVkIGNoYXIgYnVmW0hFVkNfUFJJTlRfQlVGXTsKKwlpbnQgbGVuID0gMDsKKworCWlmICgoZmxhZyA9PSAwKSB8fAorCQkoZGVidWcgJiBmbGFnKSkgeworCQl2YV9saXN0IGFyZ3M7CisKKwkJdmFfc3RhcnQoYXJncywgZm10KTsKKwkJdnNucHJpbnRmKGJ1ZiArIGxlbiwgSEVWQ19QUklOVF9CVUYgLSBsZW4sIGZtdCwgYXJncyk7CisJCXByX2luZm8oIiVzIiwgYnVmKTsKKwkJdmFfZW5kKGFyZ3MpOworCX0KKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IGlzX292ZXJzaXplKGludCB3LCBpbnQgaCkKK3sKKwlpbnQgbWF4ID0gKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKT8KKwkJTUFYX1NJWkVfOEsgOiBNQVhfU0laRV80SzsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1RCkKKwkJbWF4ID0gTUFYX1NJWkVfMks7CisKKwlpZiAodyA8PSAwIHx8IGggPD0gMCkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoaCAhPSAwICYmICh3ID4gbWF4IC8gaCkpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50IHY0bF9hbGxvY19hbmRfY29uZmlnX3BpYyhzdHJ1Y3QgQVYxSFdfcyAqaHcsCisJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnBpYyk7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBjbG9zZV90byhpbnQgYSwgaW50IGIsIGludCBtKQoreworCXJldHVybiAoYWJzKGEgLSBiKSA8IG0pID8gdHJ1ZSA6IGZhbHNlOworfQorCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorc3RhdGljIGludCBhdjFfcHJpbnRfY29udChzdHJ1Y3QgQVYxSFdfcyAqaHcsCisJaW50IGZsYWcsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXVuc2lnbmVkIGNoYXIgYnVmW0hFVkNfUFJJTlRfQlVGXTsKKwlpbnQgbGVuID0gMDsKKworCWlmIChodyA9PSBOVUxMIHx8CisJCShmbGFnID09IDApIHx8CisJCShkZWJ1ZyAmIGZsYWcpKSB7CisJCXZhX2xpc3QgYXJnczsKKworCQl2YV9zdGFydChhcmdzLCBmbXQpOworCQl2c25wcmludGYoYnVmICsgbGVuLCBIRVZDX1BSSU5UX0JVRiAtIGxlbiwgZm10LCBhcmdzKTsKKwkJcHJfaW5mbygiJXMiLCBidWYpOworCQl2YV9lbmQoYXJncyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0cmlnZ2VyX3NjaGVkdWxlKHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KTsKKworCQlpZiAoY3R4LT5wYXJhbV9zZXRzX2Zyb21fdWNvZGUgJiYKKwkJCSFody0+djRsX3BhcmFtc19wYXJzZWQpCisJCQl2ZGVjX3Y0bF93cml0ZV9mcmFtZV9zeW5jKGN0eCk7CisJfQorCisJaWYgKGh3LT52ZGVjX2NiKQorCQlody0+dmRlY19jYihod190b192ZGVjKGh3KSwgaHctPnZkZWNfY2JfYXJnKTsKK30KKworc3RhdGljIHZvaWQgcmVzZXRfcHJvY2Vzc190aW1lKHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlpZiAoaHctPnN0YXJ0X3Byb2Nlc3NfdGltZSkgeworCQl1bnNpZ25lZCBwcm9jZXNzX3RpbWUgPQorCQkJMTAwMCAqIChqaWZmaWVzIC0gaHctPnN0YXJ0X3Byb2Nlc3NfdGltZSkgLyBIWjsKKwkJaHctPnN0YXJ0X3Byb2Nlc3NfdGltZSA9IDA7CisJCWlmIChwcm9jZXNzX3RpbWUgPiBtYXhfcHJvY2Vzc190aW1lW2h3LT5pbmRleF0pCisJCQltYXhfcHJvY2Vzc190aW1lW2h3LT5pbmRleF0gPSBwcm9jZXNzX3RpbWU7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdGFydF9wcm9jZXNzX3RpbWUoc3RydWN0IEFWMUhXX3MgKmh3KQoreworCWh3LT5zdGFydF9wcm9jZXNzX3RpbWUgPSBqaWZmaWVzOworCWh3LT5kZWNvZGVfdGltZW91dF9jb3VudCA9IDA7CisJaHctPmxhc3RfbGN1X2lkeCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVvdXRfcHJvY2VzcyhzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwlpZiAoaHctPnByb2Nlc3NfYnVzeSkgeworCQlhdjFfcHJpbnQoaHcsCisJCQkwLCAiJXMgZGVjb2RlciB0aW1lb3V0IGJ1dCBwcm9jZXNzX2J1c3lcbiIsIF9fZnVuY19fKTsKKwkJaWYgKGRlYnVnKQorCQkJYXYxX3ByaW50KGh3LCAwLCAiZGVidWcgZGlzYWJsZSB0aW1lb3V0IG5vdGlmeVxuIik7CisJCXJldHVybjsKKwl9CisJaHctPnRpbWVvdXRfbnVtKys7CisJYW1oZXZjX3N0b3AoKTsKKwlhdjFfcHJpbnQoaHcsCisJCTAsICIlcyBkZWNvZGVyIHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKworCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworfQorCitzdGF0aWMgdTMyIGdldF92YWxpZF9kb3VibGVfd3JpdGVfbW9kZShzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJdTMyIGR3ID0gKChkb3VibGVfd3JpdGVfbW9kZSAmIDB4ODAwMDAwMDApID09IDApID8KKwkJaHctPmRvdWJsZV93cml0ZV9tb2RlIDoKKwkJKGRvdWJsZV93cml0ZV9tb2RlICYgMHg3ZmZmZmZmZik7CisJaWYgKGR3ICYgMHgyMCkgeworCQlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA8IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UMykKKwkJCSYmICgoZHcgJiAweGYpID09IDIgfHwgKGR3ICYgMHhmKSA9PSAzKSkgeworCQkJcHJfaW5mbygiTU1VIGRvdWVibGUgd3JpdGUgMTo0IG5vdCBzdXBwb3J0ZWQgISEhXG4iKTsKKwkJCWR3ID0gMDsKKwkJfQorCX0KKwlyZXR1cm4gZHc7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2RvdWJsZV93cml0ZV9tb2RlKHN0cnVjdCBBVjFIV19zICpodykKK3sKKwl1MzIgdmFsaWRfZHdfbW9kZSA9IGdldF92YWxpZF9kb3VibGVfd3JpdGVfbW9kZShodyk7CisJdTMyIGR3OworCWludCB3LCBoOworCXN0cnVjdCBBVjFfQ29tbW9uX3MgKmNtID0gJmh3LT5jb21tb247CisJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKmN1cl9waWNfY29uZmlnOworCisJaWYgKCFjbS0+Y3VyX2ZyYW1lKQorCQlyZXR1cm4gMTsvKm5vIHZhbGlkIGZyYW1lLCovCisKKwlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCXVuc2lnbmVkIGludCBvdXQ7CisKKwkJdmRlY192NGxfZ2V0X2R3X21vZGUoaHctPnY0bDJfY3R4LCAmb3V0KTsKKwkJZHcgPSBvdXQ7CisJCXJldHVybiBkdzsKKwl9CisKKwljdXJfcGljX2NvbmZpZyA9ICZjbS0+Y3VyX2ZyYW1lLT5idWY7CisJdyA9IGN1cl9waWNfY29uZmlnLT55X2Nyb3Bfd2lkdGg7CisJaCA9IGN1cl9waWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0OworCisJZHcgPSAweDE7IC8qMToxKi8KKwlzd2l0Y2ggKHZhbGlkX2R3X21vZGUpIHsKKwljYXNlIDB4MTAwOgorCQlpZiAodyA+IDE5MjAgJiYgaCA+IDEwODgpCisJCQlkdyA9IDB4NDsgLyoxOjIqLworCQlicmVhazsKKwljYXNlIDB4MjAwOgorCQlpZiAodyA+IDE5MjAgJiYgaCA+IDEwODgpCisJCQlkdyA9IDB4MjsgLyoxOjQqLworCQlicmVhazsKKwljYXNlIDB4MzAwOgorCQlpZiAodyA+IDEyODAgJiYgaCA+IDcyMCkKKwkJCWR3ID0gMHg0OyAvKjE6MiovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWR3ID0gdmFsaWRfZHdfbW9kZTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBkdzsKK30KKworLyogZm9yIGRvdWJsZSB3cml0ZSBidWYgYWxsb2MgKi8KK3N0YXRpYyBpbnQgZ2V0X2RvdWJsZV93cml0ZV9tb2RlX2luaXQoc3RydWN0IEFWMUhXX3MgKmh3KQoreworCXUzMiB2YWxpZF9kd19tb2RlID0gZ2V0X3ZhbGlkX2RvdWJsZV93cml0ZV9tb2RlKGh3KTsKKwl1MzIgZHc7CisJaW50IHcgPSBody0+aW5pdF9waWNfdzsKKwlpbnQgaCA9IGh3LT5pbml0X3BpY19oOworCisJZHcgPSAweDE7IC8qMToxKi8KKwlzd2l0Y2ggKHZhbGlkX2R3X21vZGUpIHsKKwljYXNlIDB4MTAwOgorCQlpZiAodyA+IDE5MjAgJiYgaCA+IDEwODgpCisJCQlkdyA9IDB4NDsgLyoxOjIqLworCQlicmVhazsKKwljYXNlIDB4MjAwOgorCQlpZiAodyA+IDE5MjAgJiYgaCA+IDEwODgpCisJCQlkdyA9IDB4MjsgLyoxOjQqLworCQlicmVhazsKKwljYXNlIDB4MzAwOgorCQlpZiAodyA+IDEyODAgJiYgaCA+IDcyMCkKKwkJCWR3ID0gMHg0OyAvKjE6MiovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWR3ID0gdmFsaWRfZHdfbW9kZTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBkdzsKK30KKyNlbmRpZgorCisvKiByZXR1cm4gcGFnZSBudW1iZXIgKi8KK3N0YXRpYyBpbnQgYXYxX21tdV9wYWdlX251bShzdHJ1Y3QgQVYxSFdfcyAqaHcsCisJCWludCB3LCBpbnQgaCwgaW50IHNhdmVfbW9kZSkKK3sKKwlpbnQgcGljdHVyZV9zaXplOworCWludCBjdXJfbW11XzRrX251bWJlciwgbWF4X2ZyYW1lX251bTsKKworCXBpY3R1cmVfc2l6ZSA9IGNvbXB1dGVfbG9zbGVzc19jb21wX2JvZHlfc2l6ZSh3LCBoLCBzYXZlX21vZGUpOworCWN1cl9tbXVfNGtfbnVtYmVyID0gKChwaWN0dXJlX3NpemUgKyAoUEFHRV9TSVpFIC0gMSkpID4+IFBBR0VfU0hJRlQpOworCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKQorCQltYXhfZnJhbWVfbnVtID0gTUFYX0ZSQU1FXzhLX05VTTsKKwllbHNlCisJCW1heF9mcmFtZV9udW0gPSBNQVhfRlJBTUVfNEtfTlVNOworCisJaWYgKGN1cl9tbXVfNGtfbnVtYmVyID4gbWF4X2ZyYW1lX251bSkgeworCQlwcl9lcnIoIm92ZXIgbWF4ICEhIGN1cl9tbXVfNGtfbnVtYmVyIDB4JXggd2lkdGggJWQgaGVpZ2h0ICVkXG4iLAorCQkJY3VyX21tdV80a19udW1iZXIsIHcsIGgpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIGN1cl9tbXVfNGtfbnVtYmVyOworfQorCitzdGF0aWMgc3RydWN0IGludGVybmFsX2NvbXBfYnVmKiB2NGxmYl90b19pY29tcF9idWYoCisJCXN0cnVjdCBBVjFIV19zICpodywKKwkJc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKmZiKQoreworCXN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1ZiAqYW1sX2ZiID0gTlVMTDsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKiB2NGwyX2N0eCA9IGh3LT52NGwyX2N0eDsKKworCWFtbF9mYiA9IGNvbnRhaW5lcl9vZihmYiwgc3RydWN0IGFtbF92aWRlb19kZWNfYnVmLCBmcmFtZV9idWZmZXIpOworCisJcmV0dXJuICZ2NGwyX2N0eC0+Y29tcF9idWZzW2FtbF9mYi0+aW50ZXJuYWxfaW5kZXhdOworfQorCitzdGF0aWMgc3RydWN0IGludGVybmFsX2NvbXBfYnVmKiBpbmRleF90b19pY29tcF9idWYoCisJCXN0cnVjdCBBVjFIV19zICpodywgaW50IGluZGV4KQoreworCXN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1ZiAqYW1sX2ZiID0gTlVMTDsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKiB2NGwyX2N0eCA9IGh3LT52NGwyX2N0eDsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPSBOVUxMOworCisJZmIgPSAoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKikKKwkJaHctPm1fQlVGW2luZGV4XS52NGxfcmVmX2J1Zl9hZGRyOworCWFtbF9mYiA9IGNvbnRhaW5lcl9vZihmYiwgc3RydWN0IGFtbF92aWRlb19kZWNfYnVmLCBmcmFtZV9idWZmZXIpOworCisJcmV0dXJuICZ2NGwyX2N0eC0+Y29tcF9idWZzW2FtbF9mYi0+aW50ZXJuYWxfaW5kZXhdOworfQorCisvLyNkZWZpbmUJTUFYXzRLX05VTQkJMHgxMjAwCitpbnQgYXYxX2FsbG9jX21tdSgKKwlzdHJ1Y3QgQVYxSFdfcyAqaHcsCisJaW50IGN1cl9idWZfaWR4LAorCWludCBwaWNfd2lkdGgsCisJaW50IHBpY19oZWlnaHQsCisJdW5zaWduZWQgc2hvcnQgYml0X2RlcHRoLAorCXVuc2lnbmVkIGludCAqbW11X2luZGV4X2FkcikKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgYml0X2RlcHRoXzEwID0gKGJpdF9kZXB0aCA9PSBBT01fQklUU18xMCk7CisJaW50IGN1cl9tbXVfNGtfbnVtYmVyOworCisJaWYgKGh3LT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MTApCisJCXJldHVybiAwOworCisJaWYgKGJpdF9kZXB0aCA+PSBBT01fQklUU18xMikgeworCQlody0+ZmF0YWxfZXJyb3IgPSBERUNPREVSX0ZBVEFMX0VSUk9SX1NJWkVfT1ZFUkZMT1c7CisJCXByX2VycigiZmF0YWxfZXJyb3IsIHVuIHN1cHBvcnQgYml0IGRlcHRoIDEyIVxuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWN1cl9tbXVfNGtfbnVtYmVyID0gYXYxX21tdV9wYWdlX251bShodywKKwkJCQlwaWNfd2lkdGgsCisJCQkJcGljX2hlaWdodCwKKwkJCQliaXRfZGVwdGhfMTApOworCWlmIChjdXJfbW11XzRrX251bWJlciA8IDApCisJCXJldHVybiAtMTsKKworCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJc3RydWN0IGludGVybmFsX2NvbXBfYnVmICppYnVmID0KKwkJCWluZGV4X3RvX2ljb21wX2J1ZihodywgY3VyX2J1Zl9pZHgpOworCisJCXJldCA9IGRlY29kZXJfbW11X2JveF9hbGxvY19pZHgoCisJCQkJaWJ1Zi0+bW11X2JveCwKKwkJCQlpYnVmLT5pbmRleCwKKwkJCQlpYnVmLT5mcmFtZV9idWZmZXJfc2l6ZSwKKwkJCQltbXVfaW5kZXhfYWRyKTsKKwl9IGVsc2UgeworCQlyZXQgPSBkZWNvZGVyX21tdV9ib3hfYWxsb2NfaWR4KAorCQkJaHctPm1tdV9ib3gsCisJCQljdXJfYnVmX2lkeCwKKwkJCWN1cl9tbXVfNGtfbnVtYmVyLAorCQkJbW11X2luZGV4X2Fkcik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIEFPTV9BVjFfTU1VX0RXCitzdGF0aWMgaW50IGNvbXB1dGVfbG9zbGVzc19jb21wX2JvZHlfc2l6ZV9kdyhpbnQgd2lkdGgsIGludCBoZWlnaHQsCisJCQkJdWludDhfdCBpc19iaXRfZGVwdGhfMTApOworCitpbnQgYXYxX2FsbG9jX21tdV9kdygKKwlzdHJ1Y3QgQVYxSFdfcyAqaHcsCisJaW50IGN1cl9idWZfaWR4LAorCWludCBwaWNfd2lkdGgsCisJaW50IHBpY19oZWlnaHQsCisJdW5zaWduZWQgc2hvcnQgYml0X2RlcHRoLAorCXVuc2lnbmVkIGludCAqbW11X2luZGV4X2FkcikKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgYml0X2RlcHRoXzEwID0gKGJpdF9kZXB0aCA9PSBBT01fQklUU18xMCk7CisJaW50IHBpY3R1cmVfc2l6ZTsKKwlpbnQgY3VyX21tdV80a19udW1iZXIsIG1heF9mcmFtZV9udW07CisJaWYgKCFody0+bW11X2JveF9kdykgeworCQlwcl9lcnIoImVycm9yIG5vIG1tdSBib3ghXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoaHctPmRvdWJsZV93cml0ZV9tb2RlICYgMHgxMCkKKwkJcmV0dXJuIDA7CisJaWYgKGJpdF9kZXB0aCA+PSBBT01fQklUU18xMikgeworCQlody0+ZmF0YWxfZXJyb3IgPSBERUNPREVSX0ZBVEFMX0VSUk9SX1NJWkVfT1ZFUkZMT1c7CisJCXByX2VycigiZmF0YWxfZXJyb3IsIHVuIHN1cHBvcnQgYml0IGRlcHRoIDEyIVxuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwaWN0dXJlX3NpemUgPSBjb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemVfZHcocGljX3dpZHRoLCBwaWNfaGVpZ2h0LAorCQkJCSAgIGJpdF9kZXB0aF8xMCk7CisJY3VyX21tdV80a19udW1iZXIgPSAoKHBpY3R1cmVfc2l6ZSArICgxIDw8IDEyKSAtIDEpID4+IDEyKTsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkKKwkJbWF4X2ZyYW1lX251bSA9IE1BWF9GUkFNRV84S19OVU07CisJZWxzZQorCQltYXhfZnJhbWVfbnVtID0gTUFYX0ZSQU1FXzRLX05VTTsKKworCWlmIChjdXJfbW11XzRrX251bWJlciA+IG1heF9mcmFtZV9udW0pIHsKKwkJcHJfZXJyKCJvdmVyIG1heCAhISBjdXJfbW11XzRrX251bWJlciAweCV4IHdpZHRoICVkIGhlaWdodCAlZFxuIiwKKwkJCWN1cl9tbXVfNGtfbnVtYmVyLCBwaWNfd2lkdGgsIHBpY19oZWlnaHQpOworCQlyZXR1cm4gLTE7CisJfQorCXJldCA9IGRlY29kZXJfbW11X2JveF9hbGxvY19pZHgoCisJCWh3LT5tbXVfYm94X2R3LAorCQljdXJfYnVmX2lkeCwKKwkJY3VyX21tdV80a19udW1iZXIsCisJCW1tdV9pbmRleF9hZHIpOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworI2lmbmRlZiBNVl9VU0VfRklYRURfQlVGCitzdGF0aWMgdm9pZCBkZWFsbG9jX212X2J1ZnMoc3RydWN0IEFWMUhXX3MgKmh3KQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBNVl9CVUZGRVJfTlVNOyBpKyspIHsKKwkJaWYgKGh3LT5tX212X0JVRltpXS5zdGFydF9hZHIpIHsKKwkJCWlmIChkZWJ1ZykKKwkJCQlwcl9pbmZvKAorCQkJCSJkZWFsbG9jIG12IGJ1ZiglZCkgYWRyICVsZCBzaXplIDB4JXggdXNlZF9mbGFnICVkXG4iLAorCQkJCWksIGh3LT5tX212X0JVRltpXS5zdGFydF9hZHIsCisJCQkJaHctPm1fbXZfQlVGW2ldLnNpemUsCisJCQkJaHctPm1fbXZfQlVGW2ldLnVzZWRfZmxhZyk7CisJCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWVfaWR4KAorCQkJCWh3LT5ibW11X2JveCwKKwkJCQlNVl9CVUZGRVJfSURYKGkpKTsKKwkJCWh3LT5tX212X0JVRltpXS5zdGFydF9hZHIgPSAwOworCQkJaHctPm1fbXZfQlVGW2ldLnNpemUgPSAwOworCQkJaHctPm1fbXZfQlVGW2ldLnVzZWRfZmxhZyA9IDA7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgYWxsb2NfbXZfYnVmKHN0cnVjdCBBVjFIV19zICpodywKKwlpbnQgaSwgaW50IHNpemUpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoaHctPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciAmJgorCQlzaXplID4gaHctPm1fbXZfQlVGW2ldLnNpemUpIHsKKwkJZGVhbGxvY19tdl9idWZzKGh3KTsKKwl9IGVsc2UgaWYgKGh3LT5tX212X0JVRltpXS5zdGFydF9hZHIpCisJCXJldHVybiAwOworCisJaWYgKGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeQorCQkoaHctPmJtbXVfYm94LAorCQlNVl9CVUZGRVJfSURYKGkpLCBzaXplLAorCQlEUklWRVJfTkFNRSwKKwkJJmh3LT5tX212X0JVRltpXS5zdGFydF9hZHIpIDwgMCkgeworCQlody0+bV9tdl9CVUZbaV0uc3RhcnRfYWRyID0gMDsKKwkJcmV0ID0gLTE7CisJfSBlbHNlIHsKKwkJaHctPm1fbXZfQlVGW2ldLnNpemUgPSBzaXplOworCQlody0+bV9tdl9CVUZbaV0udXNlZF9mbGFnID0gMDsKKwkJcmV0ID0gMDsKKwkJaWYgKGRlYnVnKSB7CisJCQlwcl9pbmZvKAorCQkJIk1WIEJ1ZmZlciAlZDogc3RhcnRfYWRyICVwIHNpemUgJXhcbiIsCisJCQlpLAorCQkJKHZvaWQgKilody0+bV9tdl9CVUZbaV0uc3RhcnRfYWRyLAorCQkJaHctPm1fbXZfQlVGW2ldLnNpemUpOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY2FsX212X2J1Zl9zaXplKHN0cnVjdCBBVjFIV19zICpodywgaW50IHBpY193aWR0aCwgaW50IHBpY19oZWlnaHQpCit7CisJdW5zaWduZWQgbGN1X3NpemUgPSBody0+Y3VycmVudF9sY3Vfc2l6ZTsKKwlpbnQgZXh0ZW5kZWRfcGljX3dpZHRoID0gKHBpY193aWR0aCArIGxjdV9zaXplIC0xKQorCQkJCSYgKH4obGN1X3NpemUgLSAxKSk7CisJaW50IGV4dGVuZGVkX3BpY19oZWlnaHQgPSAocGljX2hlaWdodCArIGxjdV9zaXplIC0xKQorCQkJCSYgKH4obGN1X3NpemUgLSAxKSk7CisKKwlpbnQgbGN1X3hfbnVtID0gZXh0ZW5kZWRfcGljX3dpZHRoIC8gbGN1X3NpemU7CisJaW50IGxjdV95X251bSA9IGV4dGVuZGVkX3BpY19oZWlnaHQgLyBsY3Vfc2l6ZTsKKwlpbnQgc2l6ZV9hLCBzaXplX2IsIHNpemU7CisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID4gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NDMikKKwkJLyp0bTJyZXZiIGFuZCBzYzIqLworCQlzaXplX2EgPSBsY3VfeF9udW0gKiBsY3VfeV9udW0gKiAxNiAqCisJCQkoKGxjdV9zaXplID09IDY0KSA/IDE2IDogNjQpOworCWVsc2UKKwkJc2l6ZV9hID0gbGN1X3hfbnVtICogbGN1X3lfbnVtICogMTYgKgorCQkJKChsY3Vfc2l6ZSA9PSA2NCkgPyAxOSA6IDc2KTsKKworCXNpemVfYiA9IGxjdV94X251bSAqICgobGN1X3lfbnVtID4+IDMpICsKKwkJCShsY3VfeV9udW0gJiAweDcpKSAqIDE2OworCXNpemUgPSAoKHNpemVfYSArIHNpemVfYikgKyAweGZmZmYpICYgKH4weGZmZmYpOworCisJaWYgKGRlYnVnICYgQU9NX0RFQlVHX1VTRV9GSVhFRF9NVl9CVUZfU0laRSkKKwkJc2l6ZSA9IGh3LT5tYXhfb25lX212X2J1ZmZlcl9zaXplOworCWlmIChmb3JjZV9tYXhfb25lX212X2J1ZmZlcl9zaXplKQorCQlzaXplID0gZm9yY2VfbWF4X29uZV9tdl9idWZmZXJfc2l6ZTsKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGludCBpbml0X212X2J1Zl9saXN0KHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlpbnQgaTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgY291bnQgPSBNVl9CVUZGRVJfTlVNOworCWludCBwaWNfd2lkdGggPSBody0+aW5pdF9waWNfdzsKKwlpbnQgcGljX2hlaWdodCA9IGh3LT5pbml0X3BpY19oOworCWludCBzaXplID0gY2FsX212X2J1Zl9zaXplKGh3LCBwaWNfd2lkdGgsIHBpY19oZWlnaHQpOworCisJaWYgKG12X2J1Zl9keW5hbWljX2FsbG9jKQorCQlyZXR1cm4gMDsKKyNpZiAwCisJaWYgKG12X2J1Zl9tYXJnaW4gPiAwKQorCQljb3VudCA9IFJFRl9GUkFNRVMgKyBtdl9idWZfbWFyZ2luOworCWlmIChody0+aW5pdF9waWNfdyA+IDIwNDggJiYgaHctPmluaXRfcGljX2ggPiAxMDg4KQorCQljb3VudCA9IFJFRl9GUkFNRVNfNEsgKyBtdl9idWZfbWFyZ2luOworI2Vsc2UKKwlpZiAoZGVidWcpCisJCXByX2luZm8oIiVzLCBjYWxjdWxhdGVkIG12IHNpemUgMHgleFxuIiwKKwkJCV9fZnVuY19fLCBzaXplKTsKKworCWlmICgoaHctPmlzX3VzZWRfdjRsKSAmJiAhSVNfOEtfU0laRShwaWNfd2lkdGgsIHBpY19oZWlnaHQpKSB7CisJCXNpemUgPSAweDEwMDAwMDsKKwl9CisKKwlpZiAoaHctPmluaXRfcGljX3cgPiA0MDk2ICYmIGh3LT5pbml0X3BpY19oID4gMjA0OCkKKwkJY291bnQgPSBSRUZfRlJBTUVTXzRLICsgaHctPm12X2J1Zl9tYXJnaW47CisJZWxzZSBpZiAoaHctPmluaXRfcGljX3cgPiAyMDQ4ICYmIGh3LT5pbml0X3BpY19oID4gMTA4OCkKKwkJY291bnQgPSBSRUZfRlJBTUVTXzRLICsgaHctPm12X2J1Zl9tYXJnaW47CisJZWxzZQorCQljb3VudCA9IFJFRl9GUkFNRVMgKyBody0+bXZfYnVmX21hcmdpbjsKKworI2VuZGlmCisJaWYgKGRlYnVnKSB7CisJCXByX2luZm8oIiVzIHc6JWQsIGg6JWQsIGNvdW50OiAlZCwgc2l6ZSAweCV4XG4iLAorCQlfX2Z1bmNfXywgaHctPmluaXRfcGljX3csIGh3LT5pbml0X3BpY19oLAorCQljb3VudCwgc2l6ZSk7CisJfQorCisJZm9yIChpID0gMDsKKwkJaSA8IGNvdW50ICYmIGkgPCBNVl9CVUZGRVJfTlVNOyBpKyspIHsKKwkJaWYgKGFsbG9jX212X2J1ZihodywgaSwgc2l6ZSkgPCAwKSB7CisJCQlyZXQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X212X2J1ZihzdHJ1Y3QgQVYxSFdfcyAqaHcsCisJCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpwaWNfY29uZmlnKQoreworCWludCBpOworCWludCByZXQgPSAtMTsKKwlpZiAobXZfYnVmX2R5bmFtaWNfYWxsb2MpIHsKKwkJaW50IHNpemUgPSBjYWxfbXZfYnVmX3NpemUoaHcsCisJCQlwaWNfY29uZmlnLT55X2Nyb3Bfd2lkdGgsIHBpY19jb25maWctPnlfY3JvcF9oZWlnaHQpOworCQlmb3IgKGkgPSAwOyBpIDwgTVZfQlVGRkVSX05VTTsgaSsrKSB7CisJCQlpZiAoaHctPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciA9PSAwKSB7CisJCQkJcmV0ID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoaSA9PSBNVl9CVUZGRVJfTlVNKSB7CisJCQlwcl9pbmZvKAorCQkJIiVzOiBFcnJvciwgbXYgYnVmIE1WX0JVRkZFUl9OVU0gaXMgbm90IGVub3VnaFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlpZiAoYWxsb2NfbXZfYnVmKGh3LCByZXQsIHNpemUpID49IDApIHsKKwkJCXBpY19jb25maWctPm12X2J1Zl9pbmRleCA9IHJldDsKKwkJCXBpY19jb25maWctPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIgPQorCQkJCShody0+bV9tdl9CVUZbcmV0XS5zdGFydF9hZHIgKyAweGZmZmYpICYKKwkJCQkofjB4ZmZmZik7CisJCX0gZWxzZSB7CisJCQlwcl9pbmZvKAorCQkJIiVzOiBFcnJvciwgbXYgYnVmIGFsbG9jIGZhaWxcbiIsCisJCQlfX2Z1bmNfXyk7CisJCX0KKwkJcmV0dXJuIHJldDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTVZfQlVGRkVSX05VTTsgaSsrKSB7CisJCWlmIChody0+bV9tdl9CVUZbaV0uc3RhcnRfYWRyICYmCisJCQlody0+bV9tdl9CVUZbaV0udXNlZF9mbGFnID09IDApIHsKKwkJCWh3LT5tX212X0JVRltpXS51c2VkX2ZsYWcgPSAxOworCQkJcmV0ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHJldCA+PSAwKSB7CisJCXBpY19jb25maWctPm12X2J1Zl9pbmRleCA9IHJldDsKKwkJcGljX2NvbmZpZy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkciA9CisJCQkoaHctPm1fbXZfQlVGW3JldF0uc3RhcnRfYWRyICsgMHhmZmZmKSAmCisJCQkofjB4ZmZmZik7CisJCWlmIChkZWJ1ZyAmIEFWMV9ERUJVR19CVUZNR1JfTU9SRSkKKwkJCXByX2luZm8oCisJCQkiJXMgPT4gJWQgKCVkKSBzaXplIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgcmV0LAorCQkJcGljX2NvbmZpZy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkciwKKwkJCWh3LT5tX212X0JVRltyZXRdLnNpemUpOworCX0gZWxzZSB7CisJCXByX2luZm8oCisJCSIlczogRXJyb3IsIG12IGJ1ZiBpcyBub3QgZW5vdWdoXG4iLAorCQlfX2Z1bmNfXyk7CisJfQorCXJldHVybiByZXQ7Cit9CitzdGF0aWMgdm9pZCBwdXRfbXZfYnVmKHN0cnVjdCBBVjFIV19zICpodywKKwkJCQlpbnQgKm12X2J1Zl9pbmRleCkKK3sKKwlpbnQgaSA9ICptdl9idWZfaW5kZXg7CisJaWYgKGkgPj0gTVZfQlVGRkVSX05VTSkgeworCQlpZiAoZGVidWcgJiBBVjFfREVCVUdfQlVGTUdSX01PUkUpCisJCQlwcl9pbmZvKAorCQkJIiVzOiBpbmRleCAlZCBiZXlvbmQgcmFuZ2VcbiIsCisJCQlfX2Z1bmNfXywgaSk7CisJCXJldHVybjsKKwl9CisJaWYgKG12X2J1Zl9keW5hbWljX2FsbG9jKSB7CisJCWlmIChody0+bV9tdl9CVUZbaV0uc3RhcnRfYWRyKSB7CisJCQlpZiAoZGVidWcpCisJCQkJcHJfaW5mbygKKwkJCQkiZGVhbGxvYyBtdiBidWYoJWQpIGFkciAlbGQgc2l6ZSAweCV4IHVzZWRfZmxhZyAlZFxuIiwKKwkJCQlpLCBody0+bV9tdl9CVUZbaV0uc3RhcnRfYWRyLAorCQkJCWh3LT5tX212X0JVRltpXS5zaXplLAorCQkJCWh3LT5tX212X0JVRltpXS51c2VkX2ZsYWcpOworCQkJZGVjb2Rlcl9ibW11X2JveF9mcmVlX2lkeCgKKwkJCQlody0+Ym1tdV9ib3gsCisJCQkJTVZfQlVGRkVSX0lEWChpKSk7CisJCQlody0+bV9tdl9CVUZbaV0uc3RhcnRfYWRyID0gMDsKKwkJCWh3LT5tX212X0JVRltpXS5zaXplID0gMDsKKwkJCWh3LT5tX212X0JVRltpXS51c2VkX2ZsYWcgPSAwOworCQl9CisJCSptdl9idWZfaW5kZXggPSAtMTsKKwkJcmV0dXJuOworCX0KKworCWlmIChkZWJ1ZyAmIEFWMV9ERUJVR19CVUZNR1JfTU9SRSkKKwkJcHJfaW5mbygKKwkJIiVzKCVkKTogdXNlZF9mbGFnKCVkKVxuIiwKKwkJX19mdW5jX18sIGksCisJCWh3LT5tX212X0JVRltpXS51c2VkX2ZsYWcpOworCisJKm12X2J1Zl9pbmRleCA9IC0xOworCWlmIChody0+bV9tdl9CVUZbaV0uc3RhcnRfYWRyICYmCisJCWh3LT5tX212X0JVRltpXS51c2VkX2ZsYWcpCisJCWh3LT5tX212X0JVRltpXS51c2VkX2ZsYWcgPSAwOworfQorc3RhdGljIHZvaWQJcHV0X3VuX3VzZWRfbXZfYnVmcyhzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJc3RydWN0IEFWMV9Db21tb25fcyAqY29uc3QgY20gPSAmaHctPmNvbW1vbjsKKwlzdHJ1Y3QgUmVmQ250QnVmZmVyX3MgKmNvbnN0IGZyYW1lX2J1ZnMgPSBjbS0+YnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnM7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGh3LT51c2VkX2J1Zl9udW07ICsraSkgeworCQlpZiAoKGZyYW1lX2J1ZnNbaV0ucmVmX2NvdW50ID09IDApICYmCisJCQkoZnJhbWVfYnVmc1tpXS5idWYuaW5kZXggIT0gLTEpICYmCisJCQkoZnJhbWVfYnVmc1tpXS5idWYubXZfYnVmX2luZGV4ID49IDApCisJCQkpCisJCQlwdXRfbXZfYnVmKGh3LCAmZnJhbWVfYnVmc1tpXS5idWYubXZfYnVmX2luZGV4KTsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgaW5pdF9waWNfbGlzdF9odyhzdHJ1Y3QgQVYxSFdfcyAqcGJpKTsKKworc3RhdGljIHZvaWQgdXBkYXRlX2hpZGVfZnJhbWVfdGltZXN0YW1wKHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlSZWZDbnRCdWZmZXIgKmNvbnN0IGZyYW1lX2J1ZnMgPSBody0+Y29tbW9uLmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGh3LT51c2VkX2J1Zl9udW07ICsraSkgeworCQlpZiAoKCFmcmFtZV9idWZzW2ldLnNob3dfZnJhbWUpICYmCisJCQkoZnJhbWVfYnVmc1tpXS5zaG93YWJsZV9mcmFtZSkgJiYKKwkJCSghZnJhbWVfYnVmc1tpXS5idWYudmZfcmVmKSAmJgorCQkJKGZyYW1lX2J1ZnNbaV0uYnVmLkJVRl9pbmRleCAhPSAtMSkpIHsKKwkJCWZyYW1lX2J1ZnNbaV0uYnVmLnRpbWVzdGFtcCA9IGh3LT5jaHVuay0+dGltZXN0YW1wOworCQkJZnJhbWVfYnVmc1tpXS5idWYucHRzID0gaHctPmNodW5rLT5wdHM7CisJCQlmcmFtZV9idWZzW2ldLmJ1Zi5wdHM2NCA9IGh3LT5jaHVuay0+cHRzNjQ7CisJCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19PVVRfUFRTLAorCQkJCSIlcywgdXBkYXRlICVkIGhpZGUgZnJhbWUgdHM6ICVsbGQsIHB0cyAlZCwgcHRzNjQgJWxsZFxuIiwKKwkJCQlfX2Z1bmNfXywgaSwgZnJhbWVfYnVmc1tpXS5idWYudGltZXN0YW1wLCBody0+Y2h1bmstPnB0cywgaHctPmNodW5rLT5wdHM2NCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2ZyZWVfZmJfaWR4KEFWMV9DT01NT04gKmNtKQoreworCWludCBpOworCVJlZkNudEJ1ZmZlciAqY29uc3QgZnJhbWVfYnVmcyA9IGNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmczsKKworCWZvciAoaSA9IDA7IGkgPCBGUkFNRV9CVUZGRVJTOyArK2kpIHsKKwkJaWYgKGZyYW1lX2J1ZnNbaV0ucmVmX2NvdW50ID09IDAKKwkJCSYmIGZyYW1lX2J1ZnNbaV0uYnVmLnZmX3JlZiA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIChpICE9IEZSQU1FX0JVRkZFUlMpID8gaSA6IC0xOworfQorCitzdGF0aWMgaW50IHY0bF9nZXRfZnJlZV9mYihzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJc3RydWN0IEFWMV9Db21tb25fcyAqY29uc3QgY20gPSAmaHctPmNvbW1vbjsKKwlzdHJ1Y3QgUmVmQ250QnVmZmVyX3MgKmNvbnN0IGZyYW1lX2J1ZnMgPSBjbS0+YnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnM7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICogdjRsID0gaHctPnY0bDJfY3R4OworCXN0cnVjdCB2NGxfYnVmZl9wb29sICpwb29sID0gJnY0bC0+Y2FwX3Bvb2w7CisJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnBpYyA9IE5VTEw7CisJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKmZyZWVfcGljID0gTlVMTDsKKwl1bG9uZyBmbGFnczsKKwlpbnQgaWR4LCBpOworCisJbG9ja19idWZmZXJfcG9vbChjbS0+YnVmZmVyX3Bvb2wsIGZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBwb29sLT5pbjsgKytpKSB7CisJCXUzMiBzdGF0ZSA9IChwb29sLT5zZXFbaV0gPj4gMTYpOworCQl1MzIgaW5kZXggPSAocG9vbC0+c2VxW2ldICYgMHhmZmZmKTsKKworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgVjRMX0NBUF9CVUZGX0lOX0RFQzoKKwkJCXBpYyA9ICZmcmFtZV9idWZzW2ldLmJ1ZjsKKwkJCWlmICgoZnJhbWVfYnVmc1tpXS5yZWZfY291bnQgPT0gMCkgJiYKKwkJCQkocGljLT52Zl9yZWYgPT0gMCkgJiYKKwkJCQkocGljLT5pbmRleCAhPSAtMSkgJiYKKwkJCQlwaWMtPmNtYV9hbGxvY19hZGRyKSB7CisJCQkJZnJlZV9waWMgPSBwaWM7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBWNExfQ0FQX0JVRkZfSU5fTTJNOgorCQkJaWR4ID0gZ2V0X2ZyZWVfZmJfaWR4KGNtKTsKKwkJCWlmIChpZHggPCAwKQorCQkJCWJyZWFrOworCisJCQlwaWMgPSAmZnJhbWVfYnVmc1tpZHhdLmJ1ZjsKKwkJCXBpYy0+eV9jcm9wX3dpZHRoID0gaHctPmZyYW1lX3dpZHRoOworCQkJcGljLT55X2Nyb3BfaGVpZ2h0ID0gaHctPmZyYW1lX2hlaWdodDsKKwkJCWh3LT5idWZmZXJfd3JhcFtpZHhdID0gaW5kZXg7CisJCQlpZiAoIXY0bF9hbGxvY19hbmRfY29uZmlnX3BpYyhodywgcGljKSkgeworCQkJCXNldF9jYW52YXMoaHcsIHBpYyk7CisJCQkJaW5pdF9waWNfbGlzdF9odyhodyk7CisJCQkJZnJlZV9waWMgPSBwaWM7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByX2VycigidjRsIGJ1ZmZlciBzdGF0ZSBlcnIgJWQuXG4iLCBzdGF0ZSk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChmcmVlX3BpYykgeworCQkJaWYgKGZyYW1lX2J1ZnNbaV0uYnVmLnVzZV9leHRlcm5hbF9yZWZlcmVuY2VfYnVmZmVycykgeworCQkJCS8vIElmIHRoaXMgZnJhbWUgYnVmZmVyJ3MgeV9idWZmZXIsIHVfYnVmZmVyLCBhbmQgdl9idWZmZXIgcG9pbnQgdG8gdGhlCisJCQkJLy8gZXh0ZXJuYWwgcmVmZXJlbmNlIGJ1ZmZlcnMuIFJlc3RvcmUgdGhlIGJ1ZmZlciBwb2ludGVycyB0byBwb2ludCB0byB0aGUKKwkJCQkvLyBpbnRlcm5hbGx5IGFsbG9jYXRlZCBtZW1vcnkuCisJCQkJUElDX0JVRkZFUl9DT05GSUcgKnliZiA9ICZmcmFtZV9idWZzW2ldLmJ1ZjsKKworCQkJCXliZi0+eV9idWZmZXIgPSB5YmYtPnN0b3JlX2J1Zl9hZHJbMF07CisJCQkJeWJmLT51X2J1ZmZlciA9IHliZi0+c3RvcmVfYnVmX2FkclsxXTsKKwkJCQl5YmYtPnZfYnVmZmVyID0geWJmLT5zdG9yZV9idWZfYWRyWzJdOworCQkJCXliZi0+dXNlX2V4dGVybmFsX3JlZmVyZW5jZV9idWZmZXJzID0gMDsKKwkJCX0KKworCQkJZnJhbWVfYnVmc1tpXS5yZWZfY291bnQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoZnJlZV9waWMgJiYgaHctPmNodW5rKSB7CisJCWZyZWVfcGljLT50aW1lc3RhbXAgPSBody0+Y2h1bmstPnRpbWVzdGFtcDsKKwkJdXBkYXRlX2hpZGVfZnJhbWVfdGltZXN0YW1wKGh3KTsKKwl9CisKKwl1bmxvY2tfYnVmZmVyX3Bvb2woY20tPmJ1ZmZlcl9wb29sLCBmbGFncyk7CisKKwlpZiAoZnJlZV9waWMpIHsKKwkJc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKmZiID0KKwkJCShzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqKQorCQkJaHctPm1fQlVGW2ZyZWVfcGljLT5pbmRleF0udjRsX3JlZl9idWZfYWRkcjsKKworCQlmYi0+c3RhdHVzID0gRkJfU1RfREVDT0RFUjsKKwl9CisKKwlpZiAoZGVidWcgJiBBVjFfREVCVUdfT1VUX1BUUykgeworCQlpZiAoZnJlZV9waWMpIHsKKwkJCXByX2RlYnVnKCIlcywgaWR4OiAlZCwgdHM6ICVsbGRcbiIsCisJCQkJX19mdW5jX18sIGZyZWVfcGljLT5pbmRleCwgZnJlZV9waWMtPnRpbWVzdGFtcCk7CisJCX0gZWxzZSB7CisJCQlwcl9kZWJ1ZygiJXMsIGF2MSBnZXQgZnJlZSBwaWMgbnVsbFxuIiwgX19mdW5jX18pOworCQl9CisJfQorCisJcmV0dXJuIGZyZWVfcGljID8gZnJlZV9waWMtPmluZGV4IDogSU5WQUxJRF9JRFg7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2ZyZWVfZmIoQVYxX0NPTU1PTiAqY20pIHsKKwlSZWZDbnRCdWZmZXIgKmNvbnN0IGZyYW1lX2J1ZnMgPSBjbS0+YnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCWxvY2tfYnVmZmVyX3Bvb2woY20tPmJ1ZmZlcl9wb29sLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IEZSQU1FX0JVRkZFUlM7ICsraSkgeworCQlpZiAoZnJhbWVfYnVmc1tpXS5yZWZfY291bnQgPT0gMAorI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX01VTFRJX0RFQworCQkJJiYgZnJhbWVfYnVmc1tpXS5idWYudmZfcmVmID09IDAKKyNlbmRpZgorCQkpCisJCWJyZWFrOworCX0KKworCWlmIChpICE9IEZSQU1FX0JVRkZFUlMpIHsKKwkJaWYgKGZyYW1lX2J1ZnNbaV0uYnVmLnVzZV9leHRlcm5hbF9yZWZlcmVuY2VfYnVmZmVycykgeworCQkvLyBJZiB0aGlzIGZyYW1lIGJ1ZmZlcidzIHlfYnVmZmVyLCB1X2J1ZmZlciwgYW5kIHZfYnVmZmVyIHBvaW50IHRvIHRoZQorCQkvLyBleHRlcm5hbCByZWZlcmVuY2UgYnVmZmVycy4gUmVzdG9yZSB0aGUgYnVmZmVyIHBvaW50ZXJzIHRvIHBvaW50IHRvIHRoZQorCQkvLyBpbnRlcm5hbGx5IGFsbG9jYXRlZCBtZW1vcnkuCisJCVBJQ19CVUZGRVJfQ09ORklHICp5YmYgPSAmZnJhbWVfYnVmc1tpXS5idWY7CisJCXliZi0+eV9idWZmZXIgPSB5YmYtPnN0b3JlX2J1Zl9hZHJbMF07CisJCXliZi0+dV9idWZmZXIgPSB5YmYtPnN0b3JlX2J1Zl9hZHJbMV07CisJCXliZi0+dl9idWZmZXIgPSB5YmYtPnN0b3JlX2J1Zl9hZHJbMl07CisJCXliZi0+dXNlX2V4dGVybmFsX3JlZmVyZW5jZV9idWZmZXJzID0gMDsKKwkJfQorCisJCWZyYW1lX2J1ZnNbaV0ucmVmX2NvdW50ID0gMTsKKwl9IGVsc2UgeworCQkvLyBXZSBzaG91bGQgbmV2ZXIgcnVuIG91dCBvZiBmcmVlIGJ1ZmZlcnMuIElmIHRoaXMgYXNzZXJ0aW9uIGZhaWxzLCB0aGVyZQorCQkvLyBpcyBhIHJlZmVyZW5jZSBsZWFrLgorCQkvL2Fzc2VydCgwICYmICJSYW4gb3V0IG9mIGZyZWUgZnJhbWUgYnVmZmVycy4gTGlrZWx5IGEgcmVmZXJlbmNlIGxlYWsuIik7CisJCS8vIFJlc2V0IGkgdG8gYmUgSU5WQUxJRF9JRFggdG8gaW5kaWNhdGUgbm8gZnJlZSBidWZmZXIgZm91bmQuCisJCWkgPSBJTlZBTElEX0lEWDsKKwl9CisKKwlpZiAoaSAhPSBJTlZBTElEX0lEWCkgeworCQlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljID0gJmZyYW1lX2J1ZnNbaV0uYnVmOworCQlzdHJ1Y3QgQVYxSFdfcyAqaHcgPSBjb250YWluZXJfb2YoY20sIHN0cnVjdCBBVjFIV19zLCBjb21tb24pOworCisJCWlmIChwaWMgJiYgaHctPmNodW5rKSB7CisJCQlwaWMtPnRpbWVzdGFtcCA9IGh3LT5jaHVuay0+dGltZXN0YW1wOworCQkJcGljLT5wdHMgPSBody0+Y2h1bmstPnB0czsKKwkJCXBpYy0+cHRzNjQgPSBody0+Y2h1bmstPnB0czY0OworCQkJdXBkYXRlX2hpZGVfZnJhbWVfdGltZXN0YW1wKGh3KTsKKwkJfQorCisJCWlmIChwaWMpCisJCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19PVVRfUFRTLAorCQkJCSIlcywgaWR4OiAlZCwgdHM6ICVsbGQsIHB0cyAlZCwgcHRzNjQgJWxsZFxuIiwKKwkJCQlfX2Z1bmNfXywgaSwgcGljLT50aW1lc3RhbXAsIHBpYy0+cHRzLCBwaWMtPnB0czY0KTsKKwl9CisKKwl1bmxvY2tfYnVmZmVyX3Bvb2woY20tPmJ1ZmZlcl9wb29sLCBmbGFncyk7CisKKwlyZXR1cm4gaTsKK30KKworaW50IGdldF9mcmVlX2ZyYW1lX2J1ZmZlcihzdHJ1Y3QgQVYxX0NvbW1vbl9zICpjbSkKK3sKKwlzdHJ1Y3QgQVYxSFdfcyAqaHcgPSBjb250YWluZXJfb2YoY20sIHN0cnVjdCBBVjFIV19zLCBjb21tb24pOworCisJcmV0dXJuIGh3LT5pc191c2VkX3Y0bCA/IHY0bF9nZXRfZnJlZV9mYihodykgOiBnZXRfZnJlZV9mYihjbSk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2ZyZWVfYnVmX2NvdW50KHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlzdHJ1Y3QgQVYxX0NvbW1vbl9zICpjb25zdCBjbSA9ICZody0+Y29tbW9uOworCXN0cnVjdCBSZWZDbnRCdWZmZXJfcyAqY29uc3QgZnJhbWVfYnVmcyA9IGNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmczsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IChzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KTsKKwlpbnQgaSwgZnJlZV9idWZfY291bnQgPSAwOworCisJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQlmb3IgKGkgPSAwOyBpIDwgaHctPnVzZWRfYnVmX251bTsgKytpKSB7CisJCQlpZiAoKGZyYW1lX2J1ZnNbaV0ucmVmX2NvdW50ID09IDApICYmCisJCQkJKGZyYW1lX2J1ZnNbaV0uYnVmLnZmX3JlZiA9PSAwKSAmJgorCQkJCWZyYW1lX2J1ZnNbaV0uYnVmLmNtYV9hbGxvY19hZGRyKSB7CisJCQkJZnJlZV9idWZfY291bnQrKzsKKwkJCX0KKwkJfQorCisJCWlmIChjdHgtPmNhcF9wb29sLmRlYyA8IGh3LT51c2VkX2J1Zl9udW0pIHsKKwkJCWZyZWVfYnVmX2NvdW50ICs9CisJCQkJdjRsMl9tMm1fbnVtX2RzdF9idWZzX3JlYWR5KGN0eC0+bTJtX2N0eCk7CisJCX0KKwkJLyogdHJpZ2dlciB0byBwYXJzZSBoZWFkIGRhdGEuICovCisJCWlmICghaHctPnY0bF9wYXJhbXNfcGFyc2VkKSB7CisJCQlmcmVlX2J1Zl9jb3VudCA9IGh3LT5ydW5fcmVhZHlfbWluX2J1Zl9udW07CisJCX0KKwkJaWYgKChkZWJ1ZyAmIEFWMV9ERUJVR19CVUZNR1JfTU9SRSkgJiYKKwkJCShmcmVlX2J1Zl9jb3VudCA8PSAwKSkgeworCQkJcHJfaW5mbygiJXMsIGZyZWUgY291bnQgJWQsIG0ybV9yZWFkeSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlmcmVlX2J1Zl9jb3VudCwKKwkJCQl2NGwyX20ybV9udW1fZHN0X2J1ZnNfcmVhZHkoY3R4LT5tMm1fY3R4KSk7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgaHctPnVzZWRfYnVmX251bTsgKytpKQorCQkJaWYgKChmcmFtZV9idWZzW2ldLnJlZl9jb3VudCA9PSAwKSAmJgorCQkJCShmcmFtZV9idWZzW2ldLmJ1Zi52Zl9yZWYgPT0gMCkgJiYKKwkJCQkoZnJhbWVfYnVmc1tpXS5idWYuaW5kZXggIT0gLTEpKSB7CisJCQkJZnJlZV9idWZfY291bnQrKzsKKwkJCX0KKwl9CisKKwlyZXR1cm4gZnJlZV9idWZfY291bnQ7Cit9CisKK2ludCBhb21fYnVmbWdyX2luaXQoc3RydWN0IEFWMUhXX3MgKmh3LCBzdHJ1Y3QgQnVmZkluZm9fcyAqYnVmX3NwZWNfaSwKKwkJc3RydWN0IGJ1ZmZfcyAqbWNfYnVmX2kpIHsKKwlzdHJ1Y3QgQVYxX0NvbW1vbl9zICpjbSA9ICZody0+Y29tbW9uOworCWlmIChkZWJ1ZykKKwkJcHJfaW5mbygiJXMgJWQgJXBcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgaHctPnBiaSk7CisJaHctPmZyYW1lX2NvdW50ID0gMDsKKwlody0+cGljX2NvdW50ID0gMDsKKwlody0+cHJlX3N0cmVhbV9vZmZzZXQgPSAwOworCXNwaW5fbG9ja19pbml0KCZjbS0+YnVmZmVyX3Bvb2wtPmxvY2spOworCWNtLT5wcmV2X2ZiX2lkeCA9IElOVkFMSURfSURYOworCWNtLT5uZXdfZmJfaWR4ID0gSU5WQUxJRF9JRFg7CisJaHctPnVzZWRfNGtfbnVtID0gLTE7CisJY20tPmN1cl9mYl9pZHhfbW11ID0gSU5WQUxJRF9JRFg7CisJcHJfZGVidWcKKwkoIkFmdGVyIGFvbV9idWZtZ3JfaW5pdCwgcHJldl9mYl9pZHggOiAlZCwgbmV3X2ZiX2lkeCA6ICVkXHJcbiIsCisJCWNtLT5wcmV2X2ZiX2lkeCwgY20tPm5ld19mYl9pZHgpOworCWh3LT5uZWVkX3Jlc3luYyA9IDE7CisKKwljbS0+Y3VycmVudF92aWRlb19mcmFtZSA9IDA7CisJaHctPnJlYWR5X2Zvcl9uZXdfZGF0YSA9IDE7CisKKwkvKiBwcml2YXRlIGluaXQgKi8KKwlody0+d29ya19zcGFjZV9idWYgPSBidWZfc3BlY19pOworCWlmICghaHctPm1tdV9lbmFibGUpCisJCWh3LT5tY19idWYgPSBtY19idWZfaTsKKworCWh3LT5ycG1fYWRkciA9IE5VTEw7CisJaHctPmxtZW1fYWRkciA9IE5VTEw7CisjaWZkZWYgRFVNUF9GSUxNR1JBSU4KKwlody0+ZmdfYWRkciA9IE5VTEw7CisjZW5kaWYKKwlody0+dXNlX2NtYV9mbGFnID0gMDsKKwlody0+ZGVjb2RlX2lkeCA9IDA7CisJaHctPnJlc3VsdF9kb25lX2NvdW50ID0gMDsKKwkvKmludCBtX3VpTWF4Q1VXaWR0aCA9IDE8PDc7Ki8KKwkvKmludCBtX3VpTWF4Q1VIZWlnaHQgPSAxPDw3OyovCisJaHctPmhhc19rZXlmcmFtZSA9IDA7CisJaHctPmhhc19zZXF1ZW5jZSA9IDA7CisJaHctPnNraXBfZmxhZyA9IDA7CisJaHctPndhaXRfYnVmID0gMDsKKwlody0+ZXJyb3JfZmxhZyA9IDA7CisKKwlody0+YnVmX251bSA9IDA7CisJaHctPnBpY19udW0gPSAwOworCisJaHctPmxhc3RfY2h1bmtfcHRzID0gMDsKKwlody0+cHRzX2RpZmZfY291bnQgPSAwOworCWh3LT5wdHNfZGlmZl9zdW0gPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qCitzdHJ1Y3QgQVYxSFdfcyBhdjFfZGVjb2RlcjsKK3VuaW9uIHBhcmFtX3UgYXYxX3BhcmFtOworKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqQVYxIGJ1ZmZlciBtYW5hZ2VtZW50IGVuZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisKKyNkZWZpbmUgSEVWQ19DTV9CT0RZX1NUQVJUX0FERFIgICAgCQkJICAgIDB4MzYyNgorI2RlZmluZSBIRVZDX0NNX0JPRFlfTEVOR1RIICAgIAkJCQkgICAgMHgzNjI3CisjZGVmaW5lIEhFVkNfQ01fSEVBREVSX0xFTkdUSCAgICAJCQkJICAweDM2MjkKKyNkZWZpbmUgSEVWQ19DTV9IRUFERVJfT0ZGU0VUICAgIAkJCQkgIDB4MzYyYgorCisjZGVmaW5lIExPU0xFU1NfQ09NUFJFU1NfTU9ERQorCisvKiNkZWZpbmUgREVDT01QX0hFQURSX1NVUkdFTlQqLworI2lmZGVmIEFWMV8xMEJfTlYyMQorc3RhdGljIHUzMiBtZW1fbWFwX21vZGUgPSAyICAvKiAwOmxpbmVhciAxOjMyeDMyIDI6NjR4MzIqLworI2Vsc2UKK3N0YXRpYyB1MzIgbWVtX21hcF9tb2RlOyAvKiAwOmxpbmVhciAxOjMyeDMyIDI6NjR4MzIgOyBtOGJhYnkgdGVzdDE5MDIgKi8KKyNlbmRpZgorc3RhdGljIHUzMiBlbmFibGVfbWVtX3NhdmluZyA9IDE7CitzdGF0aWMgdTMyIGZvcmNlX3dfaDsKKworc3RhdGljIHUzMiBmb3JjZV9mcHM7CisKKworY29uc3QgdTMyIGF2MV92ZXJzaW9uID0gMjAxNjAyMTAxOworc3RhdGljIHUzMiBkZWJ1ZzsKK3N0YXRpYyB1MzIgcmFkcjsKK3N0YXRpYyB1MzIgcnZhbDsKK3N0YXRpYyB1MzIgcG9wX3Nob3J0czsKK3N0YXRpYyB1MzIgZGJnX2NtZDsKK3N0YXRpYyB1MzIgZGJnX3NraXBfZGVjb2RlX2luZGV4OworLyoKKyAqIGJpdCAwfjMsIGZvciBIRVZDRF9JUFBfQVhJSUZfQ09ORklHIGVuZGlhbiBjb25maWcKKyAqIGJpdCA4fjIzLCBmb3IgSEVWQ19TQU9fQ1RSTDEgZW5kaWFuIGNvbmZpZworICovCitzdGF0aWMgdTMyIGVuZGlhbjsKKyNkZWZpbmUgSEVWQ19DT05GSUdfQklHX0VORElBTiAgICAgKCgweDg4MCA8PCA4KSB8IDB4OCkKKyNkZWZpbmUgSEVWQ19DT05GSUdfTElUVExFX0VORElBTiAgKCgweGZmMCA8PCA4KSB8IDB4ZikKKworc3RhdGljIHUzMiBtdWx0aV9mcmFtZXNfaW5fb25lX3BhY2sgPSAxOworI2lmZGVmIEVSUk9SX0hBTkRMRV9ERUJVRworc3RhdGljIHUzMiBkYmdfbmFsX3NraXBfZmxhZzsKKwkJLyogYml0WzBdLCBza2lwIHZwczsgYml0WzFdLCBza2lwIHNwczsgYml0WzJdLCBza2lwIHBwcyAqLworc3RhdGljIHUzMiBkYmdfbmFsX3NraXBfY291bnQ7CisjZW5kaWYKKy8qZm9yIGRlYnVnKi8KK3N0YXRpYyB1MzIgZGVjb2RlX3BpY19iZWdpbjsKK3N0YXRpYyB1aW50IHNsaWNlX3BhcnNlX2JlZ2luOworc3RhdGljIHUzMiBzdGVwOworI2lmZGVmIE1JWF9TVFJFQU1fU1VQUE9SVAorc3RhdGljIHUzMiBidWZfYWxsb2Nfd2lkdGggPSA0MDk2Oworc3RhdGljIHUzMiBidWZfYWxsb2NfaGVpZ2h0ID0gMjMwNDsKK3N0YXRpYyB1MzIgYXYxX21heF9waWNfdyA9IDQwOTY7CitzdGF0aWMgdTMyIGF2MV9tYXhfcGljX2ggPSAyMzA0OworCitzdGF0aWMgdTMyIGR5bmFtaWNfYnVmX251bV9tYXJnaW4gPSAzOworI2Vsc2UKK3N0YXRpYyB1MzIgYnVmX2FsbG9jX3dpZHRoOworc3RhdGljIHUzMiBidWZfYWxsb2NfaGVpZ2h0Oworc3RhdGljIHUzMiBkeW5hbWljX2J1Zl9udW1fbWFyZ2luID0gNzsKKyNlbmRpZgorc3RhdGljIHUzMiBidWZfYWxsb2NfZGVwdGggPSAxMDsKK3N0YXRpYyB1MzIgYnVmX2FsbG9jX3NpemU7CisvKgorICpiaXRbMF06IDAsCisgKiAgICBiaXRbMV06IDAsIGFsd2F5cyByZWxlYXNlIGNtYSBidWZmZXIgd2hlbiBzdG9wCisgKiAgICBiaXRbMV06IDEsIG5ldmVyIHJlbGVhc2UgY21hIGJ1ZmZlciB3aGVuIHN0b3AKKyAqYml0WzBdOiAxLCB3aGVuIHN0b3AsIHJlbGVhc2UgY21hIGJ1ZmZlciBpZiBibGFja291dCBpcyAxOworICpkbyBub3QgcmVsZWFzZSBjbWEgYnVmZmVyIGlzIGJsYWNrb3V0IGlzIG5vdCAxCisgKgorICpiaXRbMl06IDAsIHdoZW4gc3RhcnQgZGVjb2RpbmcsIGNoZWNrIGN1cnJlbnQgZGlzcGxheWVkIGJ1ZmZlcgorICoJIChvbmx5IGZvciBidWZmZXIgZGVjb2RlZCBieSBBVjEpIGlmIGJsYWNrb3V0IGlzIDAKKyAqCSAxLCBkbyBub3QgY2hlY2sgY3VycmVudCBkaXNwbGF5ZWQgYnVmZmVyCisgKgorICpiaXRbM106IDEsIGlmIGJsYWNrb3V0IGlzIG5vdCAxLCBkbyBub3QgcmVsZWFzZSBjdXJyZW50CisgKgkJCWRpc3BsYXllZCBjbWEgYnVmZmVyIGFsd2F5cy4KKyAqLworLyogc2V0IHRvIDEgZm9yIGZhc3QgcGxheTsKKyAqCXNldCB0byA4IGZvciBvdGhlciBjYXNlIG9mICJrZWVwIGxhc3QgZnJhbWUiCisgKi8KK3N0YXRpYyB1MzIgYnVmZmVyX21vZGUgPSAxOworLyogYnVmZmVyX21vZGVfZGJnOiBkZWJ1ZyBvbmx5Ki8KK3N0YXRpYyB1MzIgYnVmZmVyX21vZGVfZGJnID0gMHhmZmZmMDAwMDsKKy8qKi8KKworLyoKKyAqYml0IDAsIDE6IG9ubHkgZGlzcGxheSBJIHBpY3R1cmU7CisgKmJpdCAxLCAxOiBvbmx5IGRlY29kZSBJIHBpY3R1cmU7CisgKi8KK3N0YXRpYyB1MzIgaV9vbmx5X2ZsYWc7CisKK3N0YXRpYyB1MzIgbG93X2xhdGVuY3lfZmxhZzsKKworc3RhdGljIHUzMiBub19oZWFkOworCitzdGF0aWMgdTMyIG1heF9kZWNvZGluZ190aW1lOworLyoKKyAqZXJyb3IgaGFuZGxpbmcKKyAqLworLyplcnJvcl9oYW5kbGVfcG9saWN5OgorICpiaXQgMDogMCwgYXV0byBza2lwIGVycm9yX3NraXBfbmFsX2NvdW50IG5hbHMgYmVmb3JlIGVycm9yIHJlY292ZXJ5OworICoxLCBza2lwIGVycm9yX3NraXBfbmFsX2NvdW50IG5hbHMgYmVmb3JlIGVycm9yIHJlY292ZXJ5OworICpiaXQgMSAodmFsaWQgb25seSB3aGVuIGJpdDAgPT0gMSk6CisgKjEsIHdhaXQgdnBzL3Nwcy9wcHMgYWZ0ZXIgZXJyb3IgcmVjb3Zlcnk7CisgKmJpdCAyICh2YWxpZCBvbmx5IHdoZW4gYml0MCA9PSAwKToKKyAqMCwgYXV0byBzZWFyY2ggYWZ0ZXIgZXJyb3IgcmVjb3ZlcnkgKGF2MV9yZWNvdmVyKCkgY2FsbGVkKTsKKyAqMSwgbWFudWFsIHNlYXJjaCBhZnRlciBlcnJvciByZWNvdmVyeQorICooY2hhbmdlIHRvIGF1dG8gc2VhcmNoIGFmdGVyIGdldCBJRFI6IFdSSVRFX1ZSRUcoTkFMX1NFQVJDSF9DVEwsIDB4MikpCisgKgorICpiaXQgNDogMCwgc2V0IGVycm9yX21hcmsgYWZ0ZXIgcmVzZXQvcmVjb3ZlcgorICogICAgMSwgZG8gbm90IHNldCBlcnJvcl9tYXJrIGFmdGVyIHJlc2V0L3JlY292ZXIKKyAqYml0IDU6IDAsIGNoZWNrIHRvdGFsIGxjdSBmb3IgZXZlcnkgcGljdHVyZQorICogICAgMSwgZG8gbm90IGNoZWNrIHRvdGFsIGxjdQorICoKKyAqLworCitzdGF0aWMgdTMyIGVycm9yX2hhbmRsZV9wb2xpY3k7CisvKnN0YXRpYyB1MzIgcGFyc2VyX3NlaV9lbmFibGUgPSAxOyovCisjZGVmaW5lIE1BWF9CVUZfTlVNX05PUk1BTCAgICAgMTYKKy8qbGVzcyBidWZzIG51bSAxMiBjYXVzZWQgZnJhbWUgZHJvcCwgbnRzIGZhaWxlZCovCisjZGVmaW5lIE1BWF9CVUZfTlVNX0xFU1MgICAxNAorc3RhdGljIHUzMiBtYXhfYnVmX251bSA9IE1BWF9CVUZfTlVNX05PUk1BTDsKKyNkZWZpbmUgTUFYX0JVRl9OVU1fU0FWRV9CVUYgIDgKKworc3RhdGljIERFRklORV9NVVRFWCh2YXYxX211dGV4KTsKKyNpZm5kZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorc3RhdGljIHN0cnVjdCBkZXZpY2UgKmNtYV9kZXY7CisjZW5kaWYKKyNkZWZpbmUgSEVWQ19ERUNfU1RBVFVTX1JFRyAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzAKKyNkZWZpbmUgSEVWQ19GR19TVEFUVVMJCQlIRVZDX0FTU0lTVF9TQ1JBVENIX0IKKyNkZWZpbmUgSEVWQ19SUE1fQlVGRkVSICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzEKKyNkZWZpbmUgQU9NX0FWMV9BREFQVF9QUk9CX1JFRyAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF8zCisjZGVmaW5lIEFPTV9BVjFfTU1VX01BUF9CVUZGRVIgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfNCAvLyBjaGFuZ2VkIHRvIHVzZSBIRVZDX0FTU0lTVF9NTVVfTUFQX0FERFIKKyNkZWZpbmUgQU9NX0FWMV9EQUFMQV9UT1BfQlVGRkVSICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF81CisvLyNkZWZpbmUgSEVWQ19TQU9fVVAgICAgICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzYKKy8vI2RlZmluZSBIRVZDX1NUUkVBTV9TV0FQX0JVRkZFUiAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfNworI2RlZmluZSBBT01fQVYxX0NERl9CVUZGRVJfVyAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfOAorI2RlZmluZSBBT01fQVYxX0NERl9CVUZGRVJfUiAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfOQorI2RlZmluZSBBT01fQVYxX0NPVU5UX1NXQVBfQlVGRkVSICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0EKKyNkZWZpbmUgQU9NX0FWMV9TRUdfTUFQX0JVRkZFUl9XICBBVjFfU0VHX1dfQUREUiAgLy8gICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9CCisjZGVmaW5lIEFPTV9BVjFfU0VHX01BUF9CVUZGRVJfUiAgQVYxX1NFR19SX0FERFIgIC8vICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfQworLy8jZGVmaW5lIEhFVkNfc2FvX3ZiX3NpemUgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9CCisvLyNkZWZpbmUgSEVWQ19TQU9fVkIgICAgICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0MKKy8vI2RlZmluZSBIRVZDX1NDQUxFTFVUICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfRAorI2RlZmluZSBIRVZDX1dBSVRfRkxBRwkgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9FCisjZGVmaW5lIFJQTV9DTURfUkVHICAgICAgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9GCisvLyNkZWZpbmUgSEVWQ19TVFJFQU1fU1dBUF9URVNUICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0wKKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKyNkZWZpbmUgSEVWQ19ERUNPREVfQ09VTlQgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9NCisjZGVmaW5lIEhFVkNfREVDT0RFX1NJWkUJCUhFVkNfQVNTSVNUX1NDUkFUQ0hfTgorI2Vsc2UKKyNkZWZpbmUgSEVWQ19ERUNPREVfUElDX0JFR0lOX1JFRyBIRVZDX0FTU0lTVF9TQ1JBVENIX00KKyNkZWZpbmUgSEVWQ19ERUNPREVfUElDX05VTV9SRUcgICBIRVZDX0FTU0lTVF9TQ1JBVENIX04KKyNlbmRpZgorI2RlZmluZSBBT01fQVYxX1NFR01FTlRfRkVBVFVSRSAgIEFWMV9RVUFOVF9XUgorCisjZGVmaW5lIERFQlVHX1JFRzEgICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfRworI2RlZmluZSBERUJVR19SRUcyICAgICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0gKKworI2RlZmluZSBMTUVNX0RVTVBfQURSICAgICAJICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0kKKyNkZWZpbmUgQ1VSX05BTF9VTklUX1RZUEUgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9KCisjZGVmaW5lIERFQ09ERV9TVE9QX1BPUyAgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9LCisKKyNkZWZpbmUgUElDX0VORF9MQ1VfQ09VTlQgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF8yCisKKyNkZWZpbmUgSEVWQ19BVVhfQURSCQkJSEVWQ19BU1NJU1RfU0NSQVRDSF9MCisjZGVmaW5lIEhFVkNfQVVYX0RBVEFfU0laRQkJSEVWQ19BU1NJU1RfU0NSQVRDSF83CisjaWYgKGRlZmluZWQgREVCVUdfVUNPREVfTE9HKSB8fCAoZGVmaW5lZCBERUJVR19DTUQpCisjZGVmaW5lIEhFVkNfREJHX0xPR19BRFIgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9DCisjaWZkZWYgREVCVUdfQ01ECisjZGVmaW5lIEhFVkNfRF9BRFIgICAgICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzQKKyNlbmRpZgorI2VuZGlmCisvKgorICp1Y29kZSBwYXJzZXIvc2VhcmNoIGNvbnRyb2wKKyAqYml0IDA6ICAwLCBoZWFkZXIgYXV0byBwYXJzZTsgMSwgaGVhZGVyIG1hbnVhbCBwYXJzZQorICpiaXQgMTogIDAsIGF1dG8gc2tpcCBmb3Igbm9uZXNlYW1sZXNzIHN0cmVhbTsgMSwgbm8gc2tpcAorICpiaXQgWzM6Ml06IHZhbGlkIHdoZW4gYml0MT09MDsKKyAqMCwgYXV0byBza2lwIG5hbCBiZWZvcmUgZmlyc3QgdnBzL3Nwcy9wcHMvaWRyOworICoxLCBhdXRvIHNraXAgbmFsIGJlZm9yZSBmaXJzdCB2cHMvc3BzL3BwcworICoyLCBhdXRvIHNraXAgbmFsIGJlZm9yZSBmaXJzdCAgdnBzL3Nwcy9wcHMsCisgKglhbmQgbm90IGRlY29kZSB1bnRpbCB0aGUgZmlyc3QgSSBzbGljZSAod2l0aCBzbGljZSBhZGRyZXNzIG9mIDApCisgKgorICozLCBhdXRvIHNraXAgYmVmb3JlIGZpcnN0IEkgc2xpY2UgKG5hbF90eXBlID49MTYgJiYgbmFsX3R5cGU8PTIxKQorICpiaXQgWzE1OjRdIG5hbCBza2lwIGNvdW50ICh2YWxpZCB3aGVuIGJpdDAgPT0gMSAobWFudWFsIG1vZGUpICkKKyAqYml0IFsxNl06IGZvciBOQUxfVU5JVF9FT1Mgd2hlbiBiaXQwIGlzIDA6CisgKgkwLCBzZW5kIFNFQVJDSF9ET05FIHRvIGFybSA7ICAxLCBkbyBub3Qgc2VuZCBTRUFSQ0hfRE9ORSB0byBhcm0KKyAqYml0IFsxN106IGZvciBOQUxfU0VJIHdoZW4gYml0MCBpcyAwOgorICoJMCwgZG8gbm90IHBhcnNlIFNFSSBpbiB1Y29kZTsgMSwgcGFyc2UgU0VJIGluIHVjb2RlCisgKmJpdCBbMzE6MjBdOiB1c2VkIGJ5IHVjb2RlIGZvciBkZWJ1ZyBwdXJwb3NlCisgKi8KKyNkZWZpbmUgTkFMX1NFQVJDSF9DVEwgICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0kKKwkvKlszMToyNF0gY2hpcCBmZWF0dXJlCisJCTMxOiAwLCB1c2UgTUJPWDE7IDEsIHVzZSBNQk9YMAorCSAgWzI0OjE2XSBkZWJ1ZworCSAgICAweDEsIGJ1Zm1nciBvbmx5CisJKi8KKyNkZWZpbmUgREVDT0RFX01PREUgICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfSgorI2RlZmluZSBERUNPREVfU1RPUF9QT1MgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0sKKworI2RlZmluZSBSUE1fQlVGX1NJWkUgKChSUE1fRU5EIC0gUlBNX0JFR0lOKSAqIDIpCisjZGVmaW5lIExNRU1fQlVGX1NJWkUgKDB4NjAwICogMikKKworLyoKKyNpZmRlZiBNQVBfOEsKK3N0YXRpYyB1MzIgc2VnX21hcF9zaXplID0gMHhkODAwMDsKKyNlbHNlCitzdGF0aWMgdTMyIHNlZ19tYXBfc2l6ZSA9IDB4MzYwMDA7CisjZW5kaWYKKyovCisvL3N0YXRpYyB1MzIgc2VnX21hcF9zaXplID0gMHgzNjAwMDsKKworLy8jZGVmaW5lIFZCSF9CVUZfQ09VTlQgNAorLy8jZGVmaW5lIFZCSF9CVUZfU0laRV8xMDgwUCAoKCgoMiAqIDE2ICogMTA4OCkgKyAweGZmZmYpICYgKH4weGZmZmYpKSAqIFZCSF9CVUZfQ09VTlQpCisvLyNkZWZpbmUgVkJIX0JVRl9TSVpFXzRLICgoKCgyICogMTYgKiAyMzA0KSArIDB4ZmZmZikgJiAofjB4ZmZmZikpKSAqIFZCSF9CVUZfQ09VTlQpCisvLyNkZWZpbmUgVkJIX0JVRl9TSVpFXzhLICgoKCgyICogMTYgKiA0NjA4KSArIDB4ZmZmZikgJiAofjB4ZmZmZikpKSAqIFZCSF9CVUZfQ09VTlQpCisKKwkvKm1tdV92YmggYnVmIGlzIHVzZWQgYnkgSEVWQ19TQU9fTU1VX1ZIMF9BRERSLCBIRVZDX1NBT19NTVVfVkgxX0FERFIqLworI2RlZmluZSBWQkhfQlVGX1NJWkVfMTA4MFAgMHgzMDAwCisjZGVmaW5lIFZCSF9CVUZfU0laRV80SyAweDUwMDAKKyNkZWZpbmUgVkJIX0JVRl9TSVpFXzhLIDB4YTAwMAorI2RlZmluZSBWQkhfQlVGX1NJWkUoYnVmc3BlYykgKGJ1ZnNwZWMtPm1tdV92YmguYnVmX3NpemUgLyAyKQorCS8qbW11X3ZiaF9kdyBidWYgaXMgdXNlZCBieSBIRVZDX1NBT19NTVVfVkgwX0FERFIyLEhFVkNfU0FPX01NVV9WSDFfQUREUjIsCisJCUhFVkNfRFdfVkgwX0FERERSLCBIRVZDX0RXX1ZIMV9BREREUiovCisjZGVmaW5lIERXX1ZCSF9CVUZfU0laRV8xMDgwUCAoVkJIX0JVRl9TSVpFXzEwODBQICogMikKKyNkZWZpbmUgRFdfVkJIX0JVRl9TSVpFXzRLIChWQkhfQlVGX1NJWkVfNEsgKiAyKQorI2RlZmluZSBEV19WQkhfQlVGX1NJWkVfOEsgKFZCSF9CVUZfU0laRV84SyAqIDIpCisjZGVmaW5lIERXX1ZCSF9CVUZfU0laRShidWZzcGVjKSAoYnVmc3BlYy0+bW11X3ZiaF9kdy5idWZfc2l6ZSAvIDQpCisKKy8qIG5lY2Vzc2FyeSA0SyBwYWdlIHNpemUgYWxpZ24gZm9yIHQ3L3QzIGRlY29kZXIgYW5kIGFmdGVyLiBmaXggY2FzZTE0NDAgZGVjIHRpbWVvdXQgKi8KKyNkZWZpbmUgV09SS0JVRl9BTElHTihhZGRyKSAoQUxJR04oYWRkciwgUEFHRV9TSVpFKSkKKworI2RlZmluZSBXT1JLX0JVRl9TUEVDX05VTSAzCisKK3N0YXRpYyBzdHJ1Y3QgQnVmZkluZm9fcyBhb21fd29ya2J1ZmZfc3BlY1tXT1JLX0JVRl9TUEVDX05VTV0gPSB7CisJeyAvLzhNIGJ5dGVzCisJCS5tYXhfd2lkdGggPSAxOTIwLAorCQkubWF4X2hlaWdodCA9IDEwODgsCisJCS5pcHAgPSB7CisJCQkvLyBJUFAgd29yayBzcGFjZSBjYWxjdWxhdGlvbiA6IDQwOTYgKiAoWStDYkNyK0ZsYWdzKSA9IDEyaywgcm91bmQgdG8gMTZrCisJCQkuYnVmX3NpemUgPSAweDFFMDAsCisJCX0sCisJCS5zYW9fYWJ2ID0geworCQkJLmJ1Zl9zaXplID0gMHgwLCAvLzB4MzAwMDAsCisJCX0sCisJCS5zYW9fdmIgPSB7CisJCQkuYnVmX3NpemUgPSAweDAsIC8vMHgzMDAwMCwKKwkJfSwKKwkJLnNob3J0X3Rlcm1fcnBzID0geworCQkJLy8gU0hPUlRfVEVSTV9SUFMgLSBNYXggNjQgc2V0LCAxNiBlbnRyeSBldmVyeSBzZXQsIHRvdGFsIDY0eDE2eDIgPSAyMDQ4IGJ5dGVzICgweDgwMCkKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkudnBzID0geworCQkJLy8gVlBTIFNUT1JFIEFSRUEgLSBNYXggMTYgVlBTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLCB0b3RhbCAweDA4MDAgYnl0ZXMKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc2VnX21hcCA9IHsKKwkJCS8vIFNFR01FTlQgTUFQIEFSRUEgLSAxOTIweDEwODgvNC80ICogMyBiaXRzID0gMHhCRjQwIEJ5dGVzICogMTYgPSAweEJGNDAwCisJCQkuYnVmX3NpemUgPSAweEJGNDAwLAorCQl9LAorCQkuZGFhbGFfdG9wID0geworCQkJLy8gREFBTEEgVE9QIFNUT1JFIEFSRUEgLSAyMjQgQnl0ZXMgKHVzZSAyNTYgQnl0ZXMgZm9yIExQRERSNCkgcGVyIDEyOC4gVG90YWwgNDA5Ni8xMjgqMjU2ID0gMHgyMDAwCisJCQkuYnVmX3NpemUgPSAweGYwMCwKKwkJfSwKKwkJLnNhb191cCA9IHsKKwkJCS8vIFNBTyBVUCBTVE9SRSBBUkVBIC0gTWF4IDY0MCgxMDI0MC8xNikgTENVLCBlYWNoIGhhcyAxNiBieXRlcyB0b3RhbCAweDI4MDAgYnl0ZXMKKwkJCS5idWZfc2l6ZSA9IDB4MCwgLy8weDI4MDAsCisJCX0sCisJCS5zd2FwX2J1ZiA9IHsKKwkJCS8vIDI1NmN5Y2xleDY0Yml0ID0gMksgYnl0ZXMgMHg4MDAgKG9ubHkgMTQ0IGN5Y2xlcyB2YWxpZCkKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuY2RmX2J1ZiA9IHsKKwkJCS8vIGZvciBjb250ZXh0IHN0b3JlL2xvYWQgMTAyNHgyNTYgeDE2ID0gNTEySyBieXRlcyAxNioweDgwMDAKKwkJCS5idWZfc2l6ZSA9IDB4ODAwMDAsCisJCX0sCisJCS5nbWNfYnVmID0geworCQkJLy8gZm9yIGdtY19wYXJhbWV0ZXIgc3RvcmUvbG9hZCAxMjggeCAxNiA9IDJLIGJ5dGVzIDB4ODAwCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNjYWxlbHV0ID0geworCQkJLy8gc3VwcG9ydCB1cCB0byAzMiBTQ0FMRUxVVCAxMDI0eDMyID0gMzJLYnl0ZXMgKDB4ODAwMCkKKwkJCS5idWZfc2l6ZSA9IDB4MCwgLy8weDgwMDAsCisJCX0sCisJCS5kYmxrX3BhcmEgPSB7CisJCQkvLyBEQkxLIC0+IE1heCAyNTYoNDA5Ni8xNikgTENVLCBlYWNoIHBhcmEgMTAyNGJ5dGVzKHRvdGFsOjB4NDAwMDApLCBkYXRhIDEwMjRieXRlcyh0b3RhbDoweDQwMDAwKQorCQkJLmJ1Zl9zaXplID0gMHhkMDAsIC8qMHhjNDAqLworCQl9LAorCQkuZGJsa19kYXRhID0geworCQkJLmJ1Zl9zaXplID0gMHg0OTAwMCwKKwkJfSwKKwkJLmNkZWZfZGF0YSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MjI0MDAsCisJCX0sCisJCS51cHNfZGF0YSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MzYwMDAsCisJCX0sCisJCS5mZ3NfdGFibGUgPSB7CisJCQkuYnVmX3NpemUgPSBGR1NfVEFCTEVfU0laRSAqIEZSQU1FX0JVRkZFUlMsIC8vIDUxMngxMjhiaXRzCisJCX0sCisjaWZkZWYgQU9NX0FWMV9NTVUKKwkJLm1tdV92YmggPSB7CisJCQkuYnVmX3NpemUgPSBWQkhfQlVGX1NJWkVfMTA4MFAsIC8vMioxNioobW9yZSB0aGFuIDIzMDQpLzQsIDRLCisJCX0sCisJCS5jbV9oZWFkZXIgPSB7CisJI2lmZGVmIFVTRV9TUEVDX0JVRl9GT1JfTU1VX0hFQUQKKwkJCS5idWZfc2l6ZSA9IE1NVV9DT01QUkVTU19IRUFERVJfU0laRV8xMDgwUCAqIEZSQU1FX0JVRkZFUlMsIC8vIDB4NDQwMDAgPSAoKDEwODgqMioxMDI0KjQpLzMyLzQpKigzMi84KQorCSNlbHNlCisJCQkuYnVmX3NpemUgPSAwLAorCSNlbmRpZgorCQl9LAorI2VuZGlmCisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKwkJLm1tdV92YmhfZHcgPSB7CisJCQkuYnVmX3NpemUgPSBEV19WQkhfQlVGX1NJWkVfMTA4MFAsIC8vMioxNioobW9yZSB0aGFuIDIzMDQpLzQsIDRLCisJCX0sCisJCS5jbV9oZWFkZXJfZHcgPSB7CisJI2lmZGVmIFVTRV9TUEVDX0JVRl9GT1JfTU1VX0hFQUQKKwkJCS5idWZfc2l6ZSA9IE1NVV9DT01QUkVTU19IRUFERVJfU0laRV8xMDgwUCpGUkFNRV9CVUZGRVJTLCAvLyAweDQ0MDAwID0gKCgxMDg4KjIqMTAyNCo0KS8zMi80KSooMzIvOCkKKwkjZWxzZQorCQkJLmJ1Zl9zaXplID0gMCwKKwkjZW5kaWYKKwkJfSwKKyNlbmRpZgorCQkubXByZWRfYWJvdmUgPSB7CisJCQkuYnVmX3NpemUgPSAweDI4MDAsIC8qcm91bmQgZnJvbSAweDI3NjAqLyAvKiAyICogc2l6ZSBvZiBodyovCisJCX0sCisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCQkubXByZWRfbXYgPSB7CisJCSAgIC5idWZfc2l6ZSA9IE1BWF9PTkVfTVZfQlVGRkVSX1NJWkVfMTA4MFBfVE0yUkVWQiAqIEZSQU1FX0JVRkZFUlMsLypyb3VuZCBmcm9tIDIwM0EwKi8gLy8xMDgwcCwgMHg0MDAwMCBwZXIgYnVmZmVyCisJCX0sCisjZW5kaWYKKwkJLnJwbSA9IHsKKwkJICAgLmJ1Zl9zaXplID0gMHg4MCoyLAorCQl9LAorCQkubG1lbSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4NDAwICogMiwKKwkJfQorCX0sCisJeworI2lmZGVmIFZQVV9GSUxNR1JBSU5fRFVNUAorCQkubWF4X3dpZHRoID0gNjQwLAorCQkubWF4X2hlaWdodCA9IDQ4MCwKKyNlbHNlCisJCS5tYXhfd2lkdGggPSA0MDk2LAorCQkubWF4X2hlaWdodCA9IDIzMDQsCisjZW5kaWYKKwkJLmlwcCA9IHsKKwkJCS8vIElQUCB3b3JrIHNwYWNlIGNhbGN1bGF0aW9uIDogNDA5NiAqIChZK0NiQ3IrRmxhZ3MpID0gMTJrLCByb3VuZCB0byAxNmsKKwkJCS5idWZfc2l6ZSA9IDB4NDAwMCwKKwkJfSwKKwkJLnNhb19hYnYgPSB7CisJCQkuYnVmX3NpemUgPSAweDAsIC8vMHgzMDAwMCwKKwkJfSwKKwkJLnNhb192YiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MCwgLy8weDMwMDAwLAorCQl9LAorCQkuc2hvcnRfdGVybV9ycHMgPSB7CisJCQkvLyBTSE9SVF9URVJNX1JQUyAtIE1heCA2NCBzZXQsIDE2IGVudHJ5IGV2ZXJ5IHNldCwgdG90YWwgNjR4MTZ4MiA9IDIwNDggYnl0ZXMgKDB4ODAwKQorCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS52cHMgPSB7CisJCQkvLyBWUFMgU1RPUkUgQVJFQSAtIE1heCAxNiBWUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsIHRvdGFsIDB4MDgwMCBieXRlcworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zZWdfbWFwID0geworCQkJLy8gU0VHTUVOVCBNQVAgQVJFQSAtIDQwOTZ4MjMwNC80LzQgKiAzIGJpdHMgPSAweDM2MDAwIEJ5dGVzICogMTYgPSAweDM2MDAwMAorCQkJLmJ1Zl9zaXplID0gMHgzNjAwMDAsCisJCX0sCisJCS5kYWFsYV90b3AgPSB7CisJCQkvLyBEQUFMQSBUT1AgU1RPUkUgQVJFQSAtIDIyNCBCeXRlcyAodXNlIDI1NiBCeXRlcyBmb3IgTFBERFI0KSBwZXIgMTI4LiBUb3RhbCA0MDk2LzEyOCoyNTYgPSAweDIwMDAKKwkJCS5idWZfc2l6ZSA9IDB4MjAwMCwKKwkJfSwKKwkJLnNhb191cCA9IHsKKwkJCS8vIFNBTyBVUCBTVE9SRSBBUkVBIC0gTWF4IDY0MCgxMDI0MC8xNikgTENVLCBlYWNoIGhhcyAxNiBieXRlcyB0b3RhbCAweDI4MDAgYnl0ZXMKKwkJCS5idWZfc2l6ZSA9IDB4MCwgLy8weDI4MDAsCisJCX0sCisJCS5zd2FwX2J1ZiA9IHsKKwkJCS8vIDI1NmN5Y2xleDY0Yml0ID0gMksgYnl0ZXMgMHg4MDAgKG9ubHkgMTQ0IGN5Y2xlcyB2YWxpZCkKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuY2RmX2J1ZiA9IHsKKwkJLy8gZm9yIGNvbnRleHQgc3RvcmUvbG9hZCAxMDI0eDI1NiB4MTYgPSA1MTJLIGJ5dGVzIDE2KjB4ODAwMAorCQkJLmJ1Zl9zaXplID0gMHg4MDAwMCwKKwkJfSwKKwkJLmdtY19idWYgPSB7CisJCS8vIGZvciBnbWNfcGFyYW1ldGVyIHN0b3JlL2xvYWQgMTI4IHggMTYgPSAySyBieXRlcyAweDgwMAorCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zY2FsZWx1dCA9IHsKKwkJCS8vIHN1cHBvcnQgdXAgdG8gMzIgU0NBTEVMVVQgMTAyNHgzMiA9IDMyS2J5dGVzICgweDgwMDApCisJCQkuYnVmX3NpemUgPSAweDAsIC8vMHg4MDAwLAorCQl9LAorCQkuZGJsa19wYXJhID0geworCQkJLy8gREJMSyAtPiBNYXggMjU2KDQwOTYvMTYpIExDVSwgZWFjaCBwYXJhIDEwMjRieXRlcyh0b3RhbDoweDQwMDAwKSwgZGF0YSAxMDI0Ynl0ZXModG90YWw6MHg0MDAwMCkKKwkJCS5idWZfc2l6ZSA9IDB4MWEwMCwgLyoweDE5ODAqLworCQl9LAorCQkuZGJsa19kYXRhID0geworCQkJLmJ1Zl9zaXplID0gMHg1MjgwMCwKKwkJfSwKKwkJLmNkZWZfZGF0YSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MjRhMDAsCisJCX0sCisJCS51cHNfZGF0YSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4NmYwMDAsCisJCX0sCisJCS5mZ3NfdGFibGUgPSB7CisJCQkuYnVmX3NpemUgPSBGR1NfVEFCTEVfU0laRSAqIEZSQU1FX0JVRkZFUlMsIC8vIDUxMngxMjhiaXRzCisJCX0sCisjaWZkZWYgQU9NX0FWMV9NTVUKKwkJLm1tdV92YmggPSB7CisJCQkuYnVmX3NpemUgPSBWQkhfQlVGX1NJWkVfNEssIC8vMioxNioobW9yZSB0aGFuIDIzMDQpLzQsIDRLCisJCX0sCisJCS5jbV9oZWFkZXIgPSB7CisJI2lmZGVmIFVTRV9TUEVDX0JVRl9GT1JfTU1VX0hFQUQKKwkJCS5idWZfc2l6ZSA9IE1NVV9DT01QUkVTU19IRUFERVJfU0laRV80SypGUkFNRV9CVUZGRVJTLCAvLyAweDQ0MDAwID0gKCgxMDg4KjIqMTAyNCo0KS8zMi80KSooMzIvOCkKKwkjZWxzZQorCQkJLmJ1Zl9zaXplID0gMCwKKwkjZW5kaWYKKwkJfSwKKyNlbmRpZgorI2lmZGVmIEFPTV9BVjFfTU1VX0RXCisJCS5tbXVfdmJoX2R3ID0geworCQkJLmJ1Zl9zaXplID0gRFdfVkJIX0JVRl9TSVpFXzRLLCAvLzIqMTYqKG1vcmUgdGhhbiAyMzA0KS80LCA0SworCQl9LAorCQkuY21faGVhZGVyX2R3ID0geworCSNpZmRlZiBVU0VfU1BFQ19CVUZfRk9SX01NVV9IRUFECisJCQkuYnVmX3NpemUgPSBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfNEsqRlJBTUVfQlVGRkVSUywgLy8gMHg0NDAwMCA9ICgoMTA4OCoyKjEwMjQqNCkvMzIvNCkqKDMyLzgpCisJI2Vsc2UKKwkJCS5idWZfc2l6ZSA9IDAsCisJI2VuZGlmCisJCX0sCisjZW5kaWYKKwkJLm1wcmVkX2Fib3ZlID0geworCQkJLmJ1Zl9zaXplID0gMHg1NDAwLCAvKiAyICogc2l6ZSBvZiBodyovCisJCX0sCisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCQkubXByZWRfbXYgPSB7CisJCSAgLyogLmJ1Zl9zaXplID0gMHgxMDAwMDAqMTYsCisJCSAgLy80azJrICwgMHgxMDAwMDAgcGVyIGJ1ZmZlciAqLworCQkgIC8qIDQwOTZ4MjMwNCAsIDB4MTIwMDAwIHBlciBidWZmZXIgKi8KKwkJICAuYnVmX3NpemUgPSBNQVhfT05FX01WX0JVRkZFUl9TSVpFXzRLX1RNMlJFVkIgKiBGUkFNRV9CVUZGRVJTLAorCQl9LAorI2VuZGlmCisJCS5ycG0gPSB7CisJCSAgIC5idWZfc2l6ZSA9IDB4ODAqMiwKKwkJfSwKKwkJLmxtZW0gPSB7CisJCQkuYnVmX3NpemUgPSAweDQwMCAqIDIsCisJCX0KKworCX0sCisJeworCQkubWF4X3dpZHRoID0gODE5MiwKKwkJLm1heF9oZWlnaHQgPSA0NjA4LAorCQkuaXBwID0geworCQkJLy8gSVBQIHdvcmsgc3BhY2UgY2FsY3VsYXRpb24gOiA0MDk2ICogKFkrQ2JDcitGbGFncykgPSAxMmssIHJvdW5kIHRvIDE2aworCQkJLmJ1Zl9zaXplID0gMHg0MDAwLAorCQl9LAorCQkuc2FvX2FidiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MCwgLy8weDMwMDAwLAorCQl9LAorCQkuc2FvX3ZiID0geworCQkJLmJ1Zl9zaXplID0gMHgwLCAvLzB4MzAwMDAsCisJCX0sCisJCS5zaG9ydF90ZXJtX3JwcyA9IHsKKwkJCS8vIFNIT1JUX1RFUk1fUlBTIC0gTWF4IDY0IHNldCwgMTYgZW50cnkgZXZlcnkgc2V0LCB0b3RhbCA2NHgxNngyID0gMjA0OCBieXRlcyAoMHg4MDApCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnZwcyA9IHsKKwkJCS8vIFZQUyBTVE9SRSBBUkVBIC0gTWF4IDE2IFZQUywgZWFjaCBoYXMgMHg4MCBieXRlcywgdG90YWwgMHgwODAwIGJ5dGVzCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNlZ19tYXAgPSB7CisJCQkvLyBTRUdNRU5UIE1BUCBBUkVBIC0gNDA5NngyMzA0LzQvNCAqIDMgYml0cyA9IDB4MzYwMDAgQnl0ZXMgKiAxNiA9IDB4MzYwMDAwCisJCQkuYnVmX3NpemUgPSAweGQ4MDAwMCwKKwkJfSwKKwkJLmRhYWxhX3RvcCA9IHsKKwkJCS8vIERBQUxBIFRPUCBTVE9SRSBBUkVBIC0gMjI0IEJ5dGVzICh1c2UgMjU2IEJ5dGVzIGZvciBMUEREUjQpIHBlciAxMjguIFRvdGFsIDQwOTYvMTI4KjI1NiA9IDB4MjAwMAorCQkJLmJ1Zl9zaXplID0gMHgyMDAwLAorCQl9LAorCQkuc2FvX3VwID0geworCQkJLy8gU0FPIFVQIFNUT1JFIEFSRUEgLSBNYXggNjQwKDEwMjQwLzE2KSBMQ1UsIGVhY2ggaGFzIDE2IGJ5dGVzIHRvdGFsIDB4MjgwMCBieXRlcworCQkJLmJ1Zl9zaXplID0gMHgwLCAvLzB4MjgwMCwKKwkJfSwKKwkJLnN3YXBfYnVmID0geworCQkJLy8gMjU2Y3ljbGV4NjRiaXQgPSAySyBieXRlcyAweDgwMCAob25seSAxNDQgY3ljbGVzIHZhbGlkKQorCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5jZGZfYnVmID0geworCQkvLyBmb3IgY29udGV4dCBzdG9yZS9sb2FkIDEwMjR4MjU2IHgxNiA9IDUxMksgYnl0ZXMgMTYqMHg4MDAwCisJCQkuYnVmX3NpemUgPSAweDgwMDAwLAorCQl9LAorCQkuZ21jX2J1ZiA9IHsKKwkJLy8gZm9yIGdtY19wYXJhbWV0ZXIgc3RvcmUvbG9hZCAxMjggeCAxNiA9IDJLIGJ5dGVzIDB4ODAwCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNjYWxlbHV0ID0geworCQkJLy8gc3VwcG9ydCB1cCB0byAzMiBTQ0FMRUxVVCAxMDI0eDMyID0gMzJLYnl0ZXMgKDB4ODAwMCkKKwkJCS5idWZfc2l6ZSA9IDB4MCwgLy8weDgwMDAsCisJCX0sCisJCS5kYmxrX3BhcmEgPSB7CisJCQkvLyBEQkxLIC0+IE1heCAyNTYoNDA5Ni8xNikgTENVLCBlYWNoIHBhcmEgMTAyNGJ5dGVzKHRvdGFsOjB4NDAwMDApLCBkYXRhIDEwMjRieXRlcyh0b3RhbDoweDQwMDAwKQorCQkJLmJ1Zl9zaXplID0gMHgzMzAwLCAvKjB4MzJhMCovCisJCX0sCisJCS5kYmxrX2RhdGEgPSB7CisJCQkuYnVmX3NpemUgPSAweGE0ODAwLAorCQl9LAorCQkuY2RlZl9kYXRhID0geworCQkJLmJ1Zl9zaXplID0gMHgyOTIwMCwKKwkJfSwKKwkJLnVwc19kYXRhID0geworCQkJLmJ1Zl9zaXplID0gMHhkYjAwMCwKKwkJfSwKKwkJLmZnc190YWJsZSA9IHsKKwkJCS5idWZfc2l6ZSA9IEZHU19UQUJMRV9TSVpFICogRlJBTUVfQlVGRkVSUywgLy8gNTEyeDEyOGJpdHMKKwkJfSwKKyNpZmRlZiBBT01fQVYxX01NVQorCQkubW11X3ZiaCA9IHsKKwkJCS5idWZfc2l6ZSA9IFZCSF9CVUZfU0laRV84SywgLy8yKjE2Kihtb3JlIHRoYW4gMjMwNCkvNCwgNEsKKwkJfSwKKwkJLmNtX2hlYWRlciA9IHsKKwkjaWZkZWYgVVNFX1NQRUNfQlVGX0ZPUl9NTVVfSEVBRAorCQkJLmJ1Zl9zaXplID0gTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFXzhLKkZSQU1FX0JVRkZFUlMsIC8vIDB4NDQwMDAgPSAoKDEwODgqMioxMDI0KjQpLzMyLzQpKigzMi84KQorI2Vsc2UKKwkJCS5idWZfc2l6ZSA9IDAsCisjZW5kaWYKKwkJfSwKKyNlbmRpZgorI2lmZGVmIEFPTV9BVjFfTU1VX0RXCisJCS5tbXVfdmJoX2R3ID0geworCQkJLmJ1Zl9zaXplID0gRFdfVkJIX0JVRl9TSVpFXzhLLCAvLzIqMTYqKG1vcmUgdGhhbiAyMzA0KS80LCA0SworCQl9LAorCQkuY21faGVhZGVyX2R3ID0geworCSNpZmRlZiBVU0VfU1BFQ19CVUZfRk9SX01NVV9IRUFECisJCQkuYnVmX3NpemUgPSBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfOEsqRlJBTUVfQlVGRkVSUywgLy8gMHg0NDAwMCA9ICgoMTA4OCoyKjEwMjQqNCkvMzIvNCkqKDMyLzgpCisJI2Vsc2UKKwkJCS5idWZfc2l6ZSA9IDAsCisJI2VuZGlmCisJCX0sCisjZW5kaWYKKwkJLm1wcmVkX2Fib3ZlID0geworCQkJLmJ1Zl9zaXplID0gMHhBODAwLCAvKiAyICogc2l6ZSBvZiBodyovCisJCX0sCisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCQkubXByZWRfbXYgPSB7CisJCSAgLyogLmJ1Zl9zaXplID0gMHgxMDAwMDAqMTYsCisJCSAgLy80azJrICwgMHgxMDAwMDAgcGVyIGJ1ZmZlciAqLworCQkgIC8qIDQwOTZ4MjMwNCAsIDB4MTIwMDAwIHBlciBidWZmZXIgKi8KKwkJICAuYnVmX3NpemUgPSBNQVhfT05FX01WX0JVRkZFUl9TSVpFXzhLX1RNMlJFVkIgKiBGUkFNRV9CVUZGRVJTLAorCQl9LAorI2VuZGlmCisJCS5ycG0gPSB7CisJCSAgIC5idWZfc2l6ZSA9IDB4ODAqMiwKKwkJfSwKKwkJLmxtZW0gPSB7CisJCQkuYnVmX3NpemUgPSAweDQwMCAqIDIsCisJCX0KKworCX0KK307CisKKworLyoKKyogQVVYIERBVEEgUHJvY2VzcworKi8KK3N0YXRpYyB1MzIgaW5pdF9hdXhfc2l6ZTsKK3N0YXRpYyBpbnQgYXV4X2RhdGFfaXNfYXZhaWJsZShzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJdTMyIHJlZ192YWw7CisKKwlyZWdfdmFsID0gUkVBRF9WUkVHKEhFVkNfQVVYX0RBVEFfU0laRSk7CisJaWYgKHJlZ192YWwgIT0gMCAmJiByZWdfdmFsICE9IGluaXRfYXV4X3NpemUpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19hdXhfYnVmKHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlXUklURV9WUkVHKEhFVkNfQVVYX0FEUiwgaHctPmF1eF9waHlfYWRkcik7CisJaW5pdF9hdXhfc2l6ZSA9ICgoaHctPnByZWZpeF9hdXhfc2l6ZSA+PiA0KSA8PCAxNikgfAorCQkoaHctPnN1ZmZpeF9hdXhfc2l6ZSA+PiA0KTsKKwlXUklURV9WUkVHKEhFVkNfQVVYX0RBVEFfU0laRSwgaW5pdF9hdXhfc2l6ZSk7Cit9CisKKy8qCisqIGR2X21ldGFfZmxhZzogMSwgZG9sYnkgbWV0YSAoVDM1KSBvbmx5OyAyLCBub3QgaW5jbHVkZSBkb2xieSBtZXRhIChUMzUpCisqLworc3RhdGljIHZvaWQgc2V0X2F1eF9kYXRhKHN0cnVjdCBBVjFIV19zICpodywKKwkgICAgY2hhciAqKmF1eF9kYXRhX2J1ZiwgaW50ICphdXhfZGF0YV9zaXplLAorCXVuc2lnbmVkIGNoYXIgc3VmZml4X2ZsYWcsCisJdW5zaWduZWQgY2hhciBkdl9tZXRhX2ZsYWcpCit7CisJaW50IGk7CisJdW5zaWduZWQgc2hvcnQgKmF1eF9hZHI7CisJdW5zaWduZWQgaW50IHNpemVfcmVnX3ZhbCA9CisJCVJFQURfVlJFRyhIRVZDX0FVWF9EQVRBX1NJWkUpOworCXVuc2lnbmVkIGludCBhdXhfY291bnQgPSAwOworCWludCBhdXhfc2l6ZSA9IDA7CisJaWYgKDAgPT0gYXV4X2RhdGFfaXNfYXZhaWJsZShodykpCisJCXJldHVybjsKKworCWlmIChody0+YXV4X2RhdGFfZGlydHkgfHwKKwkJaHctPm1faW5zX2ZsYWcgPT0gMCkgeworCisJCWh3LT5hdXhfZGF0YV9kaXJ0eSA9IDA7CisJfQorCisJaWYgKHN1ZmZpeF9mbGFnKSB7CisJCWF1eF9hZHIgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCShody0+YXV4X2FkZHIgKworCQkJaHctPnByZWZpeF9hdXhfc2l6ZSk7CisJCWF1eF9jb3VudCA9CisJCSgoc2l6ZV9yZWdfdmFsICYgMHhmZmZmKSA8PCA0KQorCQkJPj4gMTsKKwkJYXV4X3NpemUgPQorCQkJaHctPnN1ZmZpeF9hdXhfc2l6ZTsKKwl9IGVsc2UgeworCQlhdXhfYWRyID0KKwkJKHVuc2lnbmVkIHNob3J0ICopaHctPmF1eF9hZGRyOworCQlhdXhfY291bnQgPQorCQkoKHNpemVfcmVnX3ZhbCA+PiAxNikgPDwgNCkKKwkJCT4+IDE7CisJCWF1eF9zaXplID0KKwkJCWh3LT5wcmVmaXhfYXV4X3NpemU7CisJfQorCWlmIChkZWJ1ZyAmIEFWMV9ERUJVR19CVUZNR1JfTU9SRSkgeworCQlhdjFfcHJpbnQoaHcsIDAsCisJCQkiJXM6b2xkIHNpemUgJWQgY291bnQgJWQsc3VmICVkIGR2X2ZsYWcgJWRcclxuIiwKKwkJCV9fZnVuY19fLCAqYXV4X2RhdGFfc2l6ZSwKKwkJCWF1eF9jb3VudCwgc3VmZml4X2ZsYWcsIGR2X21ldGFfZmxhZyk7CisJfQorCWlmIChhdXhfc2l6ZSA+IDAgJiYgYXV4X2NvdW50ID4gMCkgeworCQlpbnQgaGVhZHNfc2l6ZSA9IDA7CisJCWludCBuZXdfc2l6ZTsKKwkJY2hhciAqbmV3X2J1ZjsKKworCQlmb3IgKGkgPSAwOyBpIDwgYXV4X2NvdW50OyBpKyspIHsKKwkJCXVuc2lnbmVkIGNoYXIgdGFnID0gYXV4X2FkcltpXSA+PiA4OworCQkJaWYgKHRhZyAhPSAwICYmIHRhZyAhPSAweGZmKSB7CisJCQkJaWYgKGR2X21ldGFfZmxhZyA9PSAwKQorCQkJCQloZWFkc19zaXplICs9IDg7CisJCQkJZWxzZSBpZiAoZHZfbWV0YV9mbGFnID09IDEgJiYgdGFnID09IDB4MTQpCisJCQkJCWhlYWRzX3NpemUgKz0gODsKKwkJCQllbHNlIGlmIChkdl9tZXRhX2ZsYWcgPT0gMiAmJiB0YWcgIT0gMHgxNCkKKwkJCQkJaGVhZHNfc2l6ZSArPSA4OworCQkJfQorCQl9CisJCW5ld19zaXplID0gKmF1eF9kYXRhX3NpemUgKyBhdXhfY291bnQgKyBoZWFkc19zaXplOworCQluZXdfYnVmID0gdm1hbGxvYyhuZXdfc2l6ZSk7CisJCWlmIChuZXdfYnVmKSB7CisJCQl1bnNpZ25lZCBjaGFyIHZhbGlkX3RhZyA9IDA7CisJCQl1bnNpZ25lZCBjaGFyICpoID0KKwkJCQluZXdfYnVmICsKKwkJCQkqYXV4X2RhdGFfc2l6ZTsKKwkJCXVuc2lnbmVkIGNoYXIgKnAgPSBoICsgODsKKwkJCWludCBsZW4gPSAwOworCQkJaW50IHBhZGRpbmdfbGVuID0gMDsKKwkJCWlmICgqYXV4X2RhdGFfYnVmKSB7CisJCQkJbWVtY3B5KG5ld19idWYsICphdXhfZGF0YV9idWYsICAqYXV4X2RhdGFfc2l6ZSk7CisJCQkJdmZyZWUoKmF1eF9kYXRhX2J1Zik7CisJCQl9CisJCQkqYXV4X2RhdGFfYnVmID0gbmV3X2J1ZjsKKwkJCWZvciAoaSA9IDA7IGkgPCBhdXhfY291bnQ7IGkgKz0gNCkgeworCQkJCWludCBpaTsKKwkJCQl1bnNpZ25lZCBjaGFyIHRhZyA9IGF1eF9hZHJbaSArIDNdID4+IDg7CisJCQkJaWYgKHRhZyAhPSAwICYmIHRhZyAhPSAweGZmKSB7CisJCQkJCWlmIChkdl9tZXRhX2ZsYWcgPT0gMCkKKwkJCQkJCXZhbGlkX3RhZyA9IDE7CisJCQkJCWVsc2UgaWYgKGR2X21ldGFfZmxhZyA9PSAxCisJCQkJCQkmJiB0YWcgPT0gMHgxNCkKKwkJCQkJCXZhbGlkX3RhZyA9IDE7CisJCQkJCWVsc2UgaWYgKGR2X21ldGFfZmxhZyA9PSAyCisJCQkJCQkmJiB0YWcgIT0gMHgxNCkKKwkJCQkJCXZhbGlkX3RhZyA9IDE7CisJCQkJCWVsc2UKKwkJCQkJCXZhbGlkX3RhZyA9IDA7CisJCQkJCWlmICh2YWxpZF90YWcgJiYgbGVuID4gMCkgeworCQkJCQkJKmF1eF9kYXRhX3NpemUgKz0KKwkJCQkJCShsZW4gKyA4KTsKKwkJCQkJCWhbMF0gPSAobGVuID4+IDI0KQorCQkJCQkJJiAweGZmOworCQkJCQkJaFsxXSA9IChsZW4gPj4gMTYpCisJCQkJCQkmIDB4ZmY7CisJCQkJCQloWzJdID0gKGxlbiA+PiA4KQorCQkJCQkJJiAweGZmOworCQkJCQkJaFszXSA9IChsZW4gPj4gMCkKKwkJCQkJCSYgMHhmZjsKKwkJCQkJCWhbNl0gPQorCQkJCQkJKHBhZGRpbmdfbGVuID4+IDgpCisJCQkJCQkmIDB4ZmY7CisJCQkJCQloWzddID0gKHBhZGRpbmdfbGVuKQorCQkJCQkJJiAweGZmOworCQkJCQkJaCArPSAobGVuICsgOCk7CisJCQkJCQlwICs9IDg7CisJCQkJCQlsZW4gPSAwOworCQkJCQkJcGFkZGluZ19sZW4gPSAwOworCQkJCQl9CisJCQkJCWlmICh2YWxpZF90YWcpIHsKKwkJCQkJCWhbNF0gPSB0YWc7CisJCQkJCQloWzVdID0gMDsKKwkJCQkJCWhbNl0gPSAwOworCQkJCQkJaFs3XSA9IDA7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKHZhbGlkX3RhZykgeworCQkJCQlmb3IgKGlpID0gMDsgaWkgPCA0OyBpaSsrKSB7CisJCQkJCQl1bnNpZ25lZCBzaG9ydCBhYSA9CisJCQkJCQkJYXV4X2FkcltpICsgMworCQkJCQkJCS0gaWldOworCQkJCQkJKnAgPSBhYSAmIDB4ZmY7CisJCQkJCQlwKys7CisJCQkJCQlsZW4rKzsKKwkJCQkJCWlmICgoYWEgPj4gOCkgPT0gMHhmZikKKwkJCQkJCQlwYWRkaW5nX2xlbisrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKGxlbiA+IDApIHsKKwkJCQkqYXV4X2RhdGFfc2l6ZSArPSAobGVuICsgOCk7CisJCQkJaFswXSA9IChsZW4gPj4gMjQpICYgMHhmZjsKKwkJCQloWzFdID0gKGxlbiA+PiAxNikgJiAweGZmOworCQkJCWhbMl0gPSAobGVuID4+IDgpICYgMHhmZjsKKwkJCQloWzNdID0gKGxlbiA+PiAwKSAmIDB4ZmY7CisJCQkJaFs2XSA9IChwYWRkaW5nX2xlbiA+PiA4KSAmIDB4ZmY7CisJCQkJaFs3XSA9IChwYWRkaW5nX2xlbikgJiAweGZmOworCQkJfQorCQkJaWYgKGRlYnVnICYgQVYxX0RFQlVHX0JVRk1HUl9NT1JFKSB7CisJCQkJYXYxX3ByaW50KGh3LCAwLAorCQkJCQkiYXV4OiAoc2l6ZSAlZCkgc3VmZml4X2ZsYWcgJWRcbiIsCisJCQkJCSphdXhfZGF0YV9zaXplLCBzdWZmaXhfZmxhZyk7CisJCQkJZm9yIChpID0gMDsgaSA8ICphdXhfZGF0YV9zaXplOyBpKyspIHsKKwkJCQkJYXYxX3ByaW50X2NvbnQoaHcsIDAsCisJCQkJCQkiJTAyeCAiLCAoKmF1eF9kYXRhX2J1ZilbaV0pOworCQkJCQlpZiAoKChpICsgMSkgJiAweGYpID09IDApCisJCQkJCQlhdjFfcHJpbnRfY29udChodywgMCwgIlxuIik7CisJCQkJfQorCQkJCWF2MV9wcmludF9jb250KGh3LCAwLCAiXG4iKTsKKwkJCX0KKworCQl9IGVsc2UgeworCQkJYXYxX3ByaW50KGh3LCAwLCAibmV3IGJ1ZiBhbGxvYyBmYWlsZWRcbiIpOworCQkJaWYgKCphdXhfZGF0YV9idWYpCisJCQkJdmZyZWUoKmF1eF9kYXRhX2J1Zik7CisJCQkqYXV4X2RhdGFfYnVmID0gTlVMTDsKKwkJCSphdXhfZGF0YV9zaXplID0gMDsKKwkJfQorCX0KKworfQorCitzdGF0aWMgdm9pZCBzZXRfZHZfZGF0YShzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJc2V0X2F1eF9kYXRhKGh3LCAmaHctPmR2X2RhdGFfYnVmLAorCQkmaHctPmR2X2RhdGFfc2l6ZSwgMCwgMSk7CisKK30KKworc3RhdGljIHZvaWQgc2V0X3BpY19hdXhfZGF0YShzdHJ1Y3QgQVYxSFdfcyAqaHcsCisJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnBpYywgdW5zaWduZWQgY2hhciBzdWZmaXhfZmxhZywKKwl1bnNpZ25lZCBjaGFyIGR2X21ldGFfZmxhZykKK3sKKwlpZiAocGljID09IE5VTEwpCisJCXJldHVybjsKKwlzZXRfYXV4X2RhdGEoaHcsICZwaWMtPmF1eF9kYXRhX2J1ZiwKKwkJJnBpYy0+YXV4X2RhdGFfc2l6ZSwgc3VmZml4X2ZsYWcsIGR2X21ldGFfZmxhZyk7Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlfZHZfZGF0YShzdHJ1Y3QgQVYxSFdfcyAqaHcsCisJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnBpYykKK3sKKwljaGFyICpuZXdfYnVmOworCWludCBuZXdfc2l6ZTsKKwluZXdfc2l6ZSA9IHBpYy0+YXV4X2RhdGFfc2l6ZSArIGh3LT5kdl9kYXRhX3NpemU7CisJbmV3X2J1ZiA9IHZtYWxsb2MobmV3X3NpemUpOworCWlmIChuZXdfYnVmKSB7CisJCWlmIChkZWJ1ZyAmIEFWMV9ERUJVR19CVUZNR1JfTU9SRSkgeworCQkJYXYxX3ByaW50KGh3LCAwLAorCQkJCSIlczogKHNpemUgJWQpIHBpYyBpbmRleCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlody0+ZHZfZGF0YV9zaXplLCBwaWMtPmluZGV4KTsKKwkJfQorCQlpZiAocGljLT5hdXhfZGF0YV9idWYpIHsKKwkJCW1lbWNweShuZXdfYnVmLCBwaWMtPmF1eF9kYXRhX2J1ZiwgIHBpYy0+YXV4X2RhdGFfc2l6ZSk7CisJCQl2ZnJlZShwaWMtPmF1eF9kYXRhX2J1Zik7CisJCX0KKwkJbWVtY3B5KG5ld19idWYgKyBwaWMtPmF1eF9kYXRhX3NpemUsIGh3LT5kdl9kYXRhX2J1ZiwgaHctPmR2X2RhdGFfc2l6ZSk7CisJCXBpYy0+YXV4X2RhdGFfc2l6ZSArPSBody0+ZHZfZGF0YV9zaXplOworCQlwaWMtPmF1eF9kYXRhX2J1ZiA9IG5ld19idWY7CisJCXZmcmVlKGh3LT5kdl9kYXRhX2J1Zik7CisJCWh3LT5kdl9kYXRhX2J1ZiA9IE5VTEw7CisJCWh3LT5kdl9kYXRhX3NpemUgPSAwOworCX0KKworfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX2F1eF9kYXRhKHN0cnVjdCBBVjFIV19zICpodywKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljKQoreworCWlmIChwaWMtPmF1eF9kYXRhX2J1ZikKKwkJdmZyZWUocGljLT5hdXhfZGF0YV9idWYpOworCXBpYy0+YXV4X2RhdGFfYnVmID0gTlVMTDsKKwlwaWMtPmF1eF9kYXRhX3NpemUgPSAwOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2F1eF9idWYoc3RydWN0IEFWMUhXX3MgKmh3KQoreworCWludCBpOworCXVuc2lnbmVkIHNob3J0ICphdXhfYWRyID0KKwkJKHVuc2lnbmVkIHNob3J0ICopCisJCWh3LT5hdXhfYWRkcjsKKwl1bnNpZ25lZCBpbnQgYXV4X3NpemUgPQorCQkoUkVBRF9WUkVHKEhFVkNfQVVYX0RBVEFfU0laRSkKKwkJPj4gMTYpIDw8IDQ7CisKKwlpZiAoaHctPnByZWZpeF9hdXhfc2l6ZSA+IDApIHsKKwkJYXYxX3ByaW50KGh3LCAwLAorCQkJInByZWZpeCBhdXg6IChzaXplICVkKVxuIiwKKwkJCWF1eF9zaXplKTsKKwkJZm9yIChpID0gMDsgaSA8CisJCShhdXhfc2l6ZSA+PiAxKTsgaSsrKSB7CisJCQlhdjFfcHJpbnRfY29udChodywgMCwKKwkJCQkiJTA0eCAiLAorCQkJCSooYXV4X2FkciArIGkpKTsKKwkJCWlmICgoKGkgKyAxKSAmIDB4ZikKKwkJCQk9PSAwKQorCQkJCWF2MV9wcmludF9jb250KGh3LAorCQkJCTAsICJcbiIpOworCQl9CisJfQorCWlmIChody0+c3VmZml4X2F1eF9zaXplID4gMCkgeworCQlhdXhfYWRyID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkoaHctPmF1eF9hZGRyICsKKwkJCWh3LT5wcmVmaXhfYXV4X3NpemUpOworCQlhdXhfc2l6ZSA9CisJCShSRUFEX1ZSRUcoSEVWQ19BVVhfREFUQV9TSVpFKSAmIDB4ZmZmZikKKwkJCTw8IDQ7CisJCWF2MV9wcmludChodywgMCwKKwkJCSJzdWZmaXggYXV4OiAoc2l6ZSAlZClcbiIsCisJCQlhdXhfc2l6ZSk7CisJCWZvciAoaSA9IDA7IGkgPAorCQkoYXV4X3NpemUgPj4gMSk7IGkrKykgeworCQkJYXYxX3ByaW50X2NvbnQoaHcsIDAsCisJCQkJIiUwNHggIiwgKihhdXhfYWRyICsgaSkpOworCQkJaWYgKCgoaSArIDEpICYgMHhmKSA9PSAwKQorCQkJCWF2MV9wcmludF9jb250KGh3LCAwLCAiXG4iKTsKKwkJfQorCX0KK30KKworLyoKKyoKKyovCisKKy8qTG9zbGVzcyBjb21wcmVzc2lvbiBib2R5IGJ1ZmZlciBzaXplIDRLIHBlciA2NHgzMiAoanQpKi8KK3N0YXRpYyBpbnQgY29tcHV0ZV9sb3NsZXNzX2NvbXBfYm9keV9zaXplKGludCB3aWR0aCwgaW50IGhlaWdodCwKKwkJCQl1aW50OF90IGlzX2JpdF9kZXB0aF8xMCkKK3sKKwlpbnQgICAgIHdpZHRoX3g2NDsKKwlpbnQgICAgIGhlaWdodF94MzI7CisJaW50ICAgICBic2l6ZTsKKworCXdpZHRoX3g2NCA9IHdpZHRoICsgNjM7CisJd2lkdGhfeDY0ID4+PSA2OworCWhlaWdodF94MzIgPSBoZWlnaHQgKyAzMTsKKwloZWlnaHRfeDMyID4+PSA1OworCWJzaXplID0gKGlzX2JpdF9kZXB0aF8xMD80MDk2OjMyMDApKndpZHRoX3g2NCpoZWlnaHRfeDMyOworCWlmIChkZWJ1ZyAmIEFWMV9ERUJVR19CVUZNR1JfTU9SRSkKKwkJcHJfaW5mbygiJXMoJWQsJWQsJWQpPT4lZFxuIiwKKwkJCV9fZnVuY19fLCB3aWR0aCwgaGVpZ2h0LAorCQkJaXNfYml0X2RlcHRoXzEwLCBic2l6ZSk7CisKKwlyZXR1cm4gIGJzaXplOworfQorCisvKiBMb3NsZXNzIGNvbXByZXNzaW9uIGhlYWRlciBidWZmZXIgc2l6ZSAzMmJ5dGVzIHBlciAxMjh4NjQgKGp0KSovCitzdGF0aWMgIGludCAgY29tcHV0ZV9sb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworCWludCAgICAgd2lkdGhfeDEyODsKKwlpbnQgICAgIGhlaWdodF94NjQ7CisJaW50ICAgICBoc2l6ZTsKKworCXdpZHRoX3gxMjggPSB3aWR0aCArIDEyNzsKKwl3aWR0aF94MTI4ID4+PSA3OworCWhlaWdodF94NjQgPSBoZWlnaHQgKyA2MzsKKwloZWlnaHRfeDY0ID4+PSA2OworCisJaHNpemUgPSAzMiAqIHdpZHRoX3gxMjggKiBoZWlnaHRfeDY0OworCWlmIChkZWJ1ZyAmIEFWMV9ERUJVR19CVUZNR1JfTU9SRSkKKwkJcHJfaW5mbygiJXMoJWQsJWQpPT4lZFxuIiwKKwkJCV9fZnVuY19fLCB3aWR0aCwgaGVpZ2h0LAorCQkJaHNpemUpOworCisJcmV0dXJuICBoc2l6ZTsKK30KKworI2lmZGVmIEFPTV9BVjFfTU1VX0RXCitzdGF0aWMgaW50IGNvbXB1dGVfbG9zbGVzc19jb21wX2JvZHlfc2l6ZV9kdyhpbnQgd2lkdGgsIGludCBoZWlnaHQsCisJCQkJdWludDhfdCBpc19iaXRfZGVwdGhfMTApCit7CisKKwlyZXR1cm4gY29tcHV0ZV9sb3NsZXNzX2NvbXBfYm9keV9zaXplKHdpZHRoLCBoZWlnaHQsIGlzX2JpdF9kZXB0aF8xMCk7Cit9CisKKy8qIExvc2xlc3MgY29tcHJlc3Npb24gaGVhZGVyIGJ1ZmZlciBzaXplIDMyYnl0ZXMgcGVyIDEyOHg2NCAoanQpKi8KK3N0YXRpYyBpbnQgY29tcHV0ZV9sb3NsZXNzX2NvbXBfaGVhZGVyX3NpemVfZHcoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworCXJldHVybiBjb21wdXRlX2xvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSh3aWR0aCwgaGVpZ2h0KTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBpbml0X2J1ZmZfc3BlYyhzdHJ1Y3QgQVYxSFdfcyAqaHcsCisJc3RydWN0IEJ1ZmZJbmZvX3MgKmJ1Zl9zcGVjKQoreworCXZvaWQgKm1lbV9zdGFydF92aXJ0OworCisJYnVmX3NwZWMtPmlwcC5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5zdGFydF9hZHIpOworCWJ1Zl9zcGVjLT5zYW9fYWJ2LmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPmlwcC5idWZfc3RhcnQgKyBidWZfc3BlYy0+aXBwLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+c2FvX3ZiLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnNhb19hYnYuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnNhb19hYnYuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5zaG9ydF90ZXJtX3Jwcy5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5zYW9fdmIuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnNhb192Yi5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPnZwcy5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5zaG9ydF90ZXJtX3Jwcy5idWZfc3RhcnQgKyBidWZfc3BlYy0+c2hvcnRfdGVybV9ycHMuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5zZWdfbWFwLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnZwcy5idWZfc3RhcnQgKyBidWZfc3BlYy0+dnBzLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+ZGFhbGFfdG9wLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnNlZ19tYXAuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnNlZ19tYXAuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5zYW9fdXAuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+ZGFhbGFfdG9wLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5kYWFsYV90b3AuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5zd2FwX2J1Zi5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5zYW9fdXAuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnNhb191cC5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPmNkZl9idWYuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c3dhcF9idWYuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnN3YXBfYnVmLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+Z21jX2J1Zi5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5jZGZfYnVmLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5jZGZfYnVmLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+c2NhbGVsdXQuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+Z21jX2J1Zi5idWZfc3RhcnQgKyBidWZfc3BlYy0+Z21jX2J1Zi5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5zY2FsZWx1dC5idWZfc3RhcnQgKyBidWZfc3BlYy0+c2NhbGVsdXQuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5kYmxrX2RhdGEuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5kYmxrX3BhcmEuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5jZGVmX2RhdGEuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+ZGJsa19kYXRhLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5kYmxrX2RhdGEuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT51cHNfZGF0YS5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5jZGVmX2RhdGEuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPmNkZWZfZGF0YS5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPmZnc190YWJsZS5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT51cHNfZGF0YS5idWZfc3RhcnQgKyBidWZfc3BlYy0+dXBzX2RhdGEuYnVmX3NpemUpOworI2lmZGVmIEFPTV9BVjFfTU1VCisJYnVmX3NwZWMtPm1tdV92YmguYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+ZmdzX3RhYmxlLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5mZ3NfdGFibGUuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5jbV9oZWFkZXIuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+bW11X3ZiaC5idWZfc3RhcnQgKyBidWZfc3BlYy0+bW11X3ZiaC5idWZfc2l6ZSk7CisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKwlidWZfc3BlYy0+bW11X3ZiaF9kdy5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5jbV9oZWFkZXIuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPmNtX2hlYWRlci5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPmNtX2hlYWRlcl9kdy5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5tbXVfdmJoX2R3LmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5tbXVfdmJoX2R3LmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+bXByZWRfYWJvdmUuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+Y21faGVhZGVyX2R3LmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5jbV9oZWFkZXJfZHcuYnVmX3NpemUpOworI2Vsc2UKKwlidWZfc3BlYy0+bXByZWRfYWJvdmUuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+Y21faGVhZGVyLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5jbV9oZWFkZXIuYnVmX3NpemUpOworI2VuZGlmCisjZWxzZQorCWJ1Zl9zcGVjLT5tcHJlZF9hYm92ZS5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5mZ3NfdGFibGUuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPmZnc190YWJsZS5idWZfc2l6ZSk7CisjZW5kaWYKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJYnVmX3NwZWMtPm1wcmVkX212LmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPm1wcmVkX2Fib3ZlLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5tcHJlZF9hYm92ZS5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPnJwbS5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5tcHJlZF9tdi5idWZfc3RhcnQgKyBidWZfc3BlYy0+bXByZWRfbXYuYnVmX3NpemUpOworI2Vsc2UKKwlidWZfc3BlYy0+cnBtLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPm1wcmVkX2Fib3ZlLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5tcHJlZF9hYm92ZS5idWZfc2l6ZSk7CisjZW5kaWYKKwlidWZfc3BlYy0+bG1lbS5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5ycG0uYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnJwbS5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPmVuZF9hZHIgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5sbWVtLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5sbWVtLmJ1Zl9zaXplKTsKKworCWlmICghaHcpCisJCXJldHVybjsKKworCWlmICghdmRlY19zZWN1cmUoaHdfdG9fdmRlYyhodykpKSB7CisJCW1lbV9zdGFydF92aXJ0ID0KKwkJCWNvZGVjX21tX3BoeXNfdG9fdmlydChidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zdGFydCk7CisJCWlmIChtZW1fc3RhcnRfdmlydCkgeworCQkJbWVtc2V0KG1lbV9zdGFydF92aXJ0LCAwLAorCQkJCWJ1Zl9zcGVjLT5kYmxrX3BhcmEuYnVmX3NpemUpOworCQkJY29kZWNfbW1fZG1hX2ZsdXNoKG1lbV9zdGFydF92aXJ0LAorCQkJCWJ1Zl9zcGVjLT5kYmxrX3BhcmEuYnVmX3NpemUsCisJCQkJRE1BX1RPX0RFVklDRSk7CisJCX0gZWxzZSB7CisJCQltZW1fc3RhcnRfdmlydCA9IGNvZGVjX21tX3ZtYXAoCisJCQkJYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc3RhcnQsCisJCQkJYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc2l6ZSk7CisJCQlpZiAobWVtX3N0YXJ0X3ZpcnQpIHsKKwkJCQltZW1zZXQobWVtX3N0YXJ0X3ZpcnQsIDAsCisJCQkJCWJ1Zl9zcGVjLT5kYmxrX3BhcmEuYnVmX3NpemUpOworCQkJCWNvZGVjX21tX2RtYV9mbHVzaChtZW1fc3RhcnRfdmlydCwKKwkJCQkJYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc2l6ZSwKKwkJCQkJRE1BX1RPX0RFVklDRSk7CisJCQkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcihtZW1fc3RhcnRfdmlydCk7CisJCQl9IGVsc2UgeworCQkJCS8qbm90IHZpcnQgZm9yIHR2cCBwbGF5aW5nLAorCQkJCW1heSBuZWVkIGNsZWFyIG9uIHVjb2RlLiovCisJCQkJcHJfZXJyKCJtZW1fc3RhcnRfdmlydCBmYWlsZWRcbiIpOworCQkJfQorCQl9CisJfQorCisJaWYgKGRlYnVnKSB7CisJCXByX2luZm8oIiVzIHdvcmtzcGFjZSAoJXggJXgpIHNpemUgPSAleFxuIiwgX19mdW5jX18sCisJCQkgICBidWZfc3BlYy0+c3RhcnRfYWRyLCBidWZfc3BlYy0+ZW5kX2FkciwKKwkJCSAgIGJ1Zl9zcGVjLT5lbmRfYWRyIC0gYnVmX3NwZWMtPnN0YXJ0X2Fkcik7CisJfQorCisJaWYgKGRlYnVnKSB7CisJCXByX2luZm8oImlwcC5idWZfc3RhcnQgICAgCQkgOiV4XG4iLAorCQkJICAgYnVmX3NwZWMtPmlwcC5idWZfc3RhcnQpOworCQlwcl9pbmZvKCJzYW9fYWJ2LmJ1Zl9zdGFydCAgICAJICA6JXhcbiIsCisJCQkgICBidWZfc3BlYy0+c2FvX2Fidi5idWZfc3RhcnQpOworCQlwcl9pbmZvKCJzYW9fdmIuYnVmX3N0YXJ0ICAgIAkgIDoleFxuIiwKKwkJCSAgIGJ1Zl9zcGVjLT5zYW9fdmIuYnVmX3N0YXJ0KTsKKwkJcHJfaW5mbygic2hvcnRfdGVybV9ycHMuYnVmX3N0YXJ0ICA6JXhcbiIsCisJCQkgICBidWZfc3BlYy0+c2hvcnRfdGVybV9ycHMuYnVmX3N0YXJ0KTsKKwkJcHJfaW5mbygidnBzLmJ1Zl9zdGFydCAgICAJCSA6JXhcbiIsCisJCQkgICBidWZfc3BlYy0+dnBzLmJ1Zl9zdGFydCk7CisJCXByX2luZm8oInNlZ19tYXAuYnVmX3N0YXJ0ICAgIAkgIDoleFxuIiwKKwkJCSAgIGJ1Zl9zcGVjLT5zZWdfbWFwLmJ1Zl9zdGFydCk7CisJCXByX2luZm8oImRhYWxhX3RvcC5idWZfc3RhcnQgICAgCSAgOiV4XG4iLAorCQkJICAgYnVmX3NwZWMtPmRhYWxhX3RvcC5idWZfc3RhcnQpOworCQlwcl9pbmZvKCJzd2FwX2J1Zi5idWZfc3RhcnQgICAgCToleFxuIiwKKwkJCSAgIGJ1Zl9zcGVjLT5zd2FwX2J1Zi5idWZfc3RhcnQpOworCQlwcl9pbmZvKCJjZGZfYnVmLmJ1Zl9zdGFydCAgICAJOiV4XG4iLAorCQkJICAgYnVmX3NwZWMtPmNkZl9idWYuYnVmX3N0YXJ0KTsKKwkJcHJfaW5mbygiZ21jX2J1Zi5idWZfc3RhcnQgICAgCToleFxuIiwKKwkJCSAgIGJ1Zl9zcGVjLT5nbWNfYnVmLmJ1Zl9zdGFydCk7CisJCXByX2luZm8oInNjYWxlbHV0LmJ1Zl9zdGFydCAgICAJOiV4XG4iLAorCQkJICAgYnVmX3NwZWMtPnNjYWxlbHV0LmJ1Zl9zdGFydCk7CisJCXByX2luZm8oImRibGtfcGFyYS5idWZfc3RhcnQgICAgICAgOiV4XG4iLAorCQkJICAgYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc3RhcnQpOworCQlwcl9pbmZvKCJkYmxrX2RhdGEuYnVmX3N0YXJ0ICAgICAgIDoleFxuIiwKKwkJCSAgIGJ1Zl9zcGVjLT5kYmxrX2RhdGEuYnVmX3N0YXJ0KTsKKwkJcHJfaW5mbygiY2RlZl9kYXRhLmJ1Zl9zdGFydCAgICAgICA6JXhcbiIsCisJCQkJYnVmX3NwZWMtPmNkZWZfZGF0YS5idWZfc3RhcnQpOworCQlwcl9pbmZvKCJ1cHNfZGF0YS5idWZfc3RhcnQgICAgICAgOiV4XG4iLAorCQkJCWJ1Zl9zcGVjLT51cHNfZGF0YS5idWZfc3RhcnQpOworCisjaWZkZWYgQU9NX0FWMV9NTVUKKwkJcHJfaW5mbygibW11X3ZiaC5idWZfc3RhcnQgICAgIDoleFxuIiwKKwkJCWJ1Zl9zcGVjLT5tbXVfdmJoLmJ1Zl9zdGFydCk7CisjZW5kaWYKKwkJcHJfaW5mbygibXByZWRfYWJvdmUuYnVmX3N0YXJ0ICAgICA6JXhcbiIsCisJCQkgICBidWZfc3BlYy0+bXByZWRfYWJvdmUuYnVmX3N0YXJ0KTsKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJCXByX2luZm8oIm1wcmVkX212LmJ1Zl9zdGFydCAgICAJOiV4XG4iLAorCQkJICAgYnVmX3NwZWMtPm1wcmVkX212LmJ1Zl9zdGFydCk7CisjZW5kaWYKKwkJaWYgKChkZWJ1ZyAmIEFPTV9BVjFfREVCVUdfU0VORF9QQVJBTV9XSVRIX1JFRykgPT0gMCkgeworCQkJcHJfaW5mbygicnBtLmJ1Zl9zdGFydCAgICAJCSA6JXhcbiIsCisJCQkJICAgYnVmX3NwZWMtPnJwbS5idWZfc3RhcnQpOworCQl9CisJfQorfQorCisKKworc3RhdGljIHZvaWQgdW5pbml0X21tdV9idWZmZXJzKHN0cnVjdCBBVjFIV19zICpodykKK3sKKyNpZm5kZWYgTVZfVVNFX0ZJWEVEX0JVRgorCWRlYWxsb2NfbXZfYnVmcyhodyk7CisjZW5kaWYKKwlpZiAoaHctPm1tdV9ib3gpCisJCWRlY29kZXJfbW11X2JveF9mcmVlKGh3LT5tbXVfYm94KTsKKwlody0+bW11X2JveCA9IE5VTEw7CisKKyNpZmRlZiBBT01fQVYxX01NVV9EVworCWlmIChody0+bW11X2JveF9kdykKKwkJZGVjb2Rlcl9tbXVfYm94X2ZyZWUoaHctPm1tdV9ib3hfZHcpOworCWh3LT5tbXVfYm94X2R3ID0gTlVMTDsKKyNlbmRpZgorCWlmIChody0+Ym1tdV9ib3gpCisJCWRlY29kZXJfYm1tdV9ib3hfZnJlZShody0+Ym1tdV9ib3gpOworCWh3LT5ibW11X2JveCA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgY2FsY19sdWNfcXVhbnRpdHkoaW50IGxjdV9zaXplLCB1MzIgdywgdTMyIGgpCit7CisJaW50IHBpY193aWR0aF82NCA9ICh3ICsgNjMpICYgKH4weDNmKTsKKwlpbnQgcGljX2hlaWdodF8zMiA9IChoICsgMzEpICYgKH4weDFmKTsKKwlpbnQgcGljX3dpZHRoX2xjdSAgPSAocGljX3dpZHRoXzY0ICUgbGN1X3NpemUpID8KKwkJcGljX3dpZHRoXzY0IC8gbGN1X3NpemUgICsgMSA6IHBpY193aWR0aF82NCAvIGxjdV9zaXplOworCWludCBwaWNfaGVpZ2h0X2xjdSA9IChwaWNfaGVpZ2h0XzMyICUgbGN1X3NpemUpID8KKwkJcGljX2hlaWdodF8zMiAvIGxjdV9zaXplICsgMSA6IHBpY19oZWlnaHRfMzIgLyBsY3Vfc2l6ZTsKKworCXJldHVybiBwaWNfd2lkdGhfbGN1ICogcGljX2hlaWdodF9sY3U7Cit9CisKKy8qIHJldHVybiBpbiBNQiAqLworc3RhdGljIGludCBhdjFfbWF4X21tdV9idWZfc2l6ZShpbnQgbWF4X3csIGludCBtYXhfaCkKK3sKKwlpbnQgYnVmX3NpemUgPSA0ODsKKworCWlmICgobWF4X3cgKiBtYXhfaCA+IDEyODAqNzM2KSAmJgorCQkobWF4X3cgKiBtYXhfaCA8PSAxOTIwKjEwODgpKSB7CisJCWJ1Zl9zaXplID0gMTI7CisJfSBlbHNlIGlmICgobWF4X3cgKiBtYXhfaCA+IDApICYmCisJCShtYXhfdyAqIG1heF9oIDw9IDEyODAqNzM2KSkgeworCQlidWZfc2l6ZSA9IDQ7CisJfQorCisJcmV0dXJuIGJ1Zl9zaXplOworfQorCitzdGF0aWMgaW50IGF2MV9nZXRfaGVhZGVyX3NpemUoaW50IHcsIGludCBoKQoreworCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpICYmCisJCUlTXzhLX1NJWkUodywgaCkpCisJCXJldHVybiBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfOEs7CisJaWYgKElTXzRLX1NJWkUodywgaCkpCisJCXJldHVybiBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfNEs7CisKKwlyZXR1cm4gTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFXzEwODBQOworfQorCitzdGF0aWMgaW50IHY0bF9hbGxvY19hbmRfY29uZmlnX3BpYyhzdHJ1Y3QgQVYxSFdfcyAqaHcsCisJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnBpYykKK3sKKwlpbnQgcmV0ID0gLTE7CisJaW50IGkgPSBwaWMtPmluZGV4OworCWludCBkd19tb2RlID0gZ2V0X2RvdWJsZV93cml0ZV9tb2RlX2luaXQoaHcpOworCWludCBsY3VfdG90YWwgPSBjYWxjX2x1Y19xdWFudGl0eShody0+Y3VycmVudF9sY3Vfc2l6ZSwKKwkJaHctPmZyYW1lX3dpZHRoLCBody0+ZnJhbWVfaGVpZ2h0KTsKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJdTMyIG1wcmVkX212X2VuZCA9IGh3LT53b3JrX3NwYWNlX2J1Zi0+bXByZWRfbXYuYnVmX3N0YXJ0ICsKKwkJaHctPndvcmtfc3BhY2VfYnVmLT5tcHJlZF9tdi5idWZfc2l6ZTsKKy8vI2lmZGVmIFVTRV9EWU5BTUlDX01WX0JVRkZFUgorLy8JICBpbnQzMl90IE1WX01FTV9VTklUID0gKGxjdV9zaXplID09IDEyOCkgPyAoMTkqNCoxNikgOiAoMTkqMTYpOworLy8JICBpbnQzMl90IG12X2J1ZmZlcl9zaXplID0gKGxjdV90b3RhbCpNVl9NRU1fVU5JVCk7CisvLyNlbHNlCisJICBpbnQzMl90IG12X2J1ZmZlcl9zaXplID0gaHctPm1heF9vbmVfbXZfYnVmZmVyX3NpemU7CisvLyNlbmRpZgorI2VuZGlmCisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPSAoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopaHctPnY0bDJfY3R4OworCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9IE5VTEw7CisKKwlpZiAoaSA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBjdHgtPmZiX29wcy5hbGxvYygmY3R4LT5mYl9vcHMsIGh3LT5mYl90b2tlbiwgJmZiLCBBTUxfRkJfUkVRX0RFQyk7CisJaWYgKHJldCA8IDApIHsKKwkJYXYxX3ByaW50KGh3LCAwLCAiWyVkXSBBVjEgZ2V0IGJ1ZmZlciBmYWlsLlxuIiwgY3R4LT5pZCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZmItPnN0YXR1cwk9IEZCX1NUX0RFQ09ERVI7CisKKwlpZiAoaHctPm1tdV9lbmFibGUpIHsKKwkJc3RydWN0IGludGVybmFsX2NvbXBfYnVmICppYnVmID0gdjRsZmJfdG9faWNvbXBfYnVmKGh3LCBmYik7CisKKwkJaHctPm1fQlVGW2ldLmhlYWRlcl9hZGRyID0gaWJ1Zi0+aGVhZGVyX2FkZHI7CisJCWlmIChkZWJ1ZyAmIEFWMV9ERUJVR19CVUZNR1JfTU9SRSkgeworCQkJcHJfaW5mbygiTU1VIGhlYWRlcl9hZHIgJWQ6ICVsZFxuIiwKKwkJCQlpLCBody0+bV9CVUZbaV0uaGVhZGVyX2FkZHIpOworCQl9CisJfQorCisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCWlmICgoaHctPndvcmtfc3BhY2VfYnVmLT5tcHJlZF9tdi5idWZfc3RhcnQgKworCQkoKGkgKyAxKSAqIG12X2J1ZmZlcl9zaXplKSkKKwkJPD0gbXByZWRfbXZfZW5kKSB7CisjZW5kaWYKKwlody0+bV9CVUZbaV0udjRsX3JlZl9idWZfYWRkciA9ICh1bG9uZylmYjsKKwlwaWMtPmNtYV9hbGxvY19hZGRyID0gZmItPm0ubWVtWzBdLmFkZHI7CisJaWYgKGZiLT5udW1fcGxhbmVzID09IDEpIHsKKwkJaHctPm1fQlVGW2ldLnN0YXJ0X2FkciA9IGZiLT5tLm1lbVswXS5hZGRyOworCQlody0+bV9CVUZbaV0ubHVtYV9zaXplID0gZmItPm0ubWVtWzBdLm9mZnNldDsKKwkJaHctPm1fQlVGW2ldLnNpemUgPSBmYi0+bS5tZW1bMF0uc2l6ZTsKKwkJZmItPm0ubWVtWzBdLmJ5dGVzX3VzZWQgPSBmYi0+bS5tZW1bMF0uc2l6ZTsKKwkJcGljLT5kd195X2FkciA9IGh3LT5tX0JVRltpXS5zdGFydF9hZHI7CisJCXBpYy0+ZHdfdV92X2FkciA9IHBpYy0+ZHdfeV9hZHIgKyBody0+bV9CVUZbaV0ubHVtYV9zaXplOworCX0gZWxzZSBpZiAoZmItPm51bV9wbGFuZXMgPT0gMikgeworCQlody0+bV9CVUZbaV0uc3RhcnRfYWRyID0gZmItPm0ubWVtWzBdLmFkZHI7CisJCWh3LT5tX0JVRltpXS5zaXplID0gZmItPm0ubWVtWzBdLnNpemU7CisJCWh3LT5tX0JVRltpXS5jaHJvbWFfYWRkciA9IGZiLT5tLm1lbVsxXS5hZGRyOworCQlody0+bV9CVUZbaV0uY2hyb21hX3NpemUgPSBmYi0+bS5tZW1bMV0uc2l6ZTsKKwkJZmItPm0ubWVtWzBdLmJ5dGVzX3VzZWQgPSBmYi0+bS5tZW1bMF0uc2l6ZTsKKwkJZmItPm0ubWVtWzFdLmJ5dGVzX3VzZWQgPSBmYi0+bS5tZW1bMV0uc2l6ZTsKKwkJcGljLT5kd195X2FkciA9IGh3LT5tX0JVRltpXS5zdGFydF9hZHI7CisJCXBpYy0+ZHdfdV92X2FkciA9IGh3LT5tX0JVRltpXS5jaHJvbWFfYWRkcjsKKwl9CisKKwkvKiBjb25maWcgZnJhbWUgYnVmZmVyICovCisJaWYgKGh3LT5tbXVfZW5hYmxlKQorCQlwaWMtPmhlYWRlcl9hZHIgPSBody0+bV9CVUZbaV0uaGVhZGVyX2FkZHI7CisKKwlwaWMtPkJVRl9pbmRleAkJPSBpOworCXBpYy0+bGN1X3RvdGFsCQk9IGxjdV90b3RhbDsKKwlwaWMtPm1jX2NhbnZhc195CT0gcGljLT5pbmRleDsKKwlwaWMtPm1jX2NhbnZhc191X3YJPSBwaWMtPmluZGV4OworCisJaWYgKGR3X21vZGUgJiAweDEwKSB7CisJCXBpYy0+bWNfY2FudmFzX3kgPSAocGljLT5pbmRleCA8PCAxKTsKKwkJcGljLT5tY19jYW52YXNfdV92ID0gKHBpYy0+aW5kZXggPDwgMSkgKyAxOworCX0KKworI2lmZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwlwaWMtPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIgPQorCQlody0+d29ya19zcGFjZV9idWYtPm1wcmVkX212LmJ1Zl9zdGFydCArCisJCShwaWMtPmluZGV4ICogbXZfYnVmZmVyX3NpemUpOworI2VuZGlmCisKKyNpZmRlZiBEVU1QX0ZJTE1HUkFJTgorCWlmIChwaWMtPmluZGV4ID09IGZnX2R1bXBfaW5kZXgpIHsKKwkJcGljLT5mZ3NfdGFibGVfYWRyID0gaHctPmZnX3BoeV9hZGRyOworCQlwcl9pbmZvKCJzZXQgYnVmZmVyICVkIGZpbG0gZ3JhaW4gdGFibGUgMHgleFxuIiwKKwkJCXBpYy0+aW5kZXgsIHBpYy0+ZmdzX3RhYmxlX2Fkcik7CisJfSBlbHNlCisjZW5kaWYKKwlwaWMtPmZnc190YWJsZV9hZHIgPQorCQlody0+d29ya19zcGFjZV9idWYtPmZnc190YWJsZS5idWZfc3RhcnQgKworCQkocGljLT5pbmRleCAqIEZHU19UQUJMRV9TSVpFKTsKKworCWlmIChkZWJ1ZykgeworCisJCXByX2luZm8oIiVzIGluZGV4ICVkIEJVRl9pbmRleCAlZCAiLAorCQkJX19mdW5jX18sIHBpYy0+aW5kZXgsCisJCQlwaWMtPkJVRl9pbmRleCk7CisJCXByX2luZm8oImNvbXBfYm9keV9zaXplICV4IGNvbXBfYnVmX3NpemUgJXggIiwKKwkJCXBpYy0+Y29tcF9ib2R5X3NpemUsCisJCQlwaWMtPmJ1Zl9zaXplKTsKKwkJcHJfaW5mbygibXByZWRfbXZfd3Jfc3RhcnRfYWRyICVkXG4iLAorCQkJcGljLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyKTsKKwkJcHJfaW5mbygiZHdfeV9hZHIgJWQsIHBpY19jb25maWctPmR3X3Vfdl9hZHIgPSVkXG4iLAorCQkJcGljLT5kd195X2FkciwKKwkJCXBpYy0+ZHdfdV92X2Fkcik7CisJfQorI2lmZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwl9CisjZW5kaWYKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNvbmZpZ19waWMoc3RydWN0IEFWMUhXX3MgKmh3LAorCQkJCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpwaWNfY29uZmlnKQoreworCWludCByZXQgPSAtMTsKKwlpbnQgaTsKKwlpbnQgcGljX3dpZHRoID0gaHctPmluaXRfcGljX3c7CisJaW50IHBpY19oZWlnaHQgPSBody0+aW5pdF9waWNfaDsKKwkvL2ludCBsY3Vfc2l6ZSA9ICgocGFyYW1zLT5wLnNlcV9mbGFncyA+PiA2KSAmIDB4MSkgPyAxMjggOiA2NDsKKyAgICBpbnQgbGN1X3NpemUgPSBody0+Y3VycmVudF9sY3Vfc2l6ZTsKKworCWludCBwaWNfd2lkdGhfNjQgPSAocGljX3dpZHRoICsgNjMpICYgKH4weDNmKTsKKwlpbnQgcGljX2hlaWdodF8zMiA9IChwaWNfaGVpZ2h0ICsgMzEpICYgKH4weDFmKTsKKwlpbnQgcGljX3dpZHRoX2xjdSAgPSAocGljX3dpZHRoXzY0ICUgbGN1X3NpemUpID8KKwkJCQlwaWNfd2lkdGhfNjQgLyBsY3Vfc2l6ZSAgKyAxCisJCQkJOiBwaWNfd2lkdGhfNjQgLyBsY3Vfc2l6ZTsKKwlpbnQgcGljX2hlaWdodF9sY3UgPSAocGljX2hlaWdodF8zMiAlIGxjdV9zaXplKSA/CisJCQkJcGljX2hlaWdodF8zMiAvIGxjdV9zaXplICsgMQorCQkJCTogcGljX2hlaWdodF8zMiAvIGxjdV9zaXplOworCWludCBsY3VfdG90YWwgICAgICAgPSBwaWNfd2lkdGhfbGN1ICogcGljX2hlaWdodF9sY3U7CisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCXUzMiBtcHJlZF9tdl9lbmQgPSBody0+d29ya19zcGFjZV9idWYtPm1wcmVkX212LmJ1Zl9zdGFydCArCisJCQlody0+d29ya19zcGFjZV9idWYtPm1wcmVkX212LmJ1Zl9zaXplOworLy8jaWZkZWYgVVNFX0RZTkFNSUNfTVZfQlVGRkVSCisvLyAgaW50MzJfdCBNVl9NRU1fVU5JVCA9IChsY3Vfc2l6ZSA9PSAxMjgpID8gKDE5KjQqMTYpIDogKDE5KjE2KTsKKy8vICBpbnQzMl90IG12X2J1ZmZlcl9zaXplID0gKGxjdV90b3RhbCpNVl9NRU1fVU5JVCk7CisvLyNlbHNlCisgIGludDMyX3QgbXZfYnVmZmVyX3NpemUgPSBody0+bWF4X29uZV9tdl9idWZmZXJfc2l6ZTsKKy8vI2VuZGlmCisKKyNlbmRpZgorCisJdTMyIHlfYWRyID0gMDsKKwlpbnQgYnVmX3NpemUgPSAwOworCisJaW50IGxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSA9CisJCQljb21wdXRlX2xvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZShwaWNfd2lkdGgsCisJCQlwaWNfaGVpZ2h0KTsKKwlpbnQgbG9zbGVzc19jb21wX2JvZHlfc2l6ZSA9IGNvbXB1dGVfbG9zbGVzc19jb21wX2JvZHlfc2l6ZShwaWNfd2lkdGgsCisJCQlwaWNfaGVpZ2h0LCBidWZfYWxsb2NfZGVwdGggPT0gMTApOworCWludCBtY19idWZmZXJfc2l6ZSA9IGxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSArIGxvc2xlc3NfY29tcF9ib2R5X3NpemU7CisJaW50IG1jX2J1ZmZlcl9zaXplX2ggPSAobWNfYnVmZmVyX3NpemUgKyAweGZmZmYpID4+IDE2OworCWludCBtY19idWZmZXJfc2l6ZV91X3YgPSAwOworCWludCBtY19idWZmZXJfc2l6ZV91X3ZfaCA9IDA7CisJaW50IGR3X21vZGUgPSBnZXRfZG91YmxlX3dyaXRlX21vZGVfaW5pdChodyk7CisKKwlody0+bGN1X3RvdGFsID0gbGN1X3RvdGFsOworCisJaWYgKGR3X21vZGUgJiYgKGR3X21vZGUgJiAweDIwKSA9PSAwKSB7CisJCWludCBwaWNfd2lkdGhfZHcgPSBwaWNfd2lkdGggLworCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhkd19tb2RlICYgMHhmKTsKKwkJaW50IHBpY19oZWlnaHRfZHcgPSBwaWNfaGVpZ2h0IC8KKwkJCWdldF9kb3VibGVfd3JpdGVfcmF0aW8oZHdfbW9kZSAmIDB4Zik7CisKKwkJaW50IHBpY193aWR0aF82NF9kdyA9IChwaWNfd2lkdGhfZHcgKyA2MykgJiAofjB4M2YpOworCQlpbnQgcGljX2hlaWdodF8zMl9kdyA9IChwaWNfaGVpZ2h0X2R3ICsgMzEpICYgKH4weDFmKTsKKwkJaW50IHBpY193aWR0aF9sY3VfZHcgID0gKHBpY193aWR0aF82NF9kdyAlIGxjdV9zaXplKSA/CisJCQkJCXBpY193aWR0aF82NF9kdyAvIGxjdV9zaXplICArIDEKKwkJCQkJOiBwaWNfd2lkdGhfNjRfZHcgLyBsY3Vfc2l6ZTsKKwkJaW50IHBpY19oZWlnaHRfbGN1X2R3ID0gKHBpY19oZWlnaHRfMzJfZHcgJSBsY3Vfc2l6ZSkgPworCQkJCQlwaWNfaGVpZ2h0XzMyX2R3IC8gbGN1X3NpemUgKyAxCisJCQkJCTogcGljX2hlaWdodF8zMl9kdyAvIGxjdV9zaXplOworCQlpbnQgbGN1X3RvdGFsX2R3ICAgICAgID0gcGljX3dpZHRoX2xjdV9kdyAqIHBpY19oZWlnaHRfbGN1X2R3OworCQltY19idWZmZXJfc2l6ZV91X3YgPSBsY3VfdG90YWxfZHcgKiBsY3Vfc2l6ZSAqIGxjdV9zaXplIC8gMjsKKwkJbWNfYnVmZmVyX3NpemVfdV92X2ggPSAobWNfYnVmZmVyX3NpemVfdV92ICsgMHhmZmZmKSA+PiAxNjsKKwkJLyo2NGsgYWxpZ25tZW50Ki8KKwkJYnVmX3NpemUgPSAoKG1jX2J1ZmZlcl9zaXplX3Vfdl9oIDw8IDE2KSAqIDMpOworCQlidWZfc2l6ZSA9ICgoYnVmX3NpemUgKyAweGZmZmYpID4+IDE2KSA8PCAxNjsKKwl9CisKKwlpZiAobWNfYnVmZmVyX3NpemUgJiAweGZmZmYpIC8qNjRrIGFsaWdubWVudCovCisJCW1jX2J1ZmZlcl9zaXplX2ggKz0gMTsKKwlpZiAoKCFody0+bW11X2VuYWJsZSkgJiYgKChkd19tb2RlICYgMHgxMCkgPT0gMCkpCisJCWJ1Zl9zaXplICs9IChtY19idWZmZXJfc2l6ZV9oIDw8IDE2KTsKKworI2lmZGVmIFVTRV9TUEVDX0JVRl9GT1JfTU1VX0hFQUQKKwlpZiAoaHctPm1tdV9lbmFibGUpIHsKKwkJcGljX2NvbmZpZy0+aGVhZGVyX2FkciA9CisJCQlody0+d29ya19zcGFjZV9idWYtPmNtX2hlYWRlci5idWZfc3RhcnQgKworCQkJCQkocGljX2NvbmZpZy0+aW5kZXggKiB2YXYxX21tdV9jb21wcmVzc19oZWFkZXJfc2l6ZShodykpOworCisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKwkJaWYgKGh3LT5kd19tbXVfZW5hYmxlKSB7CisJCQlwaWNfY29uZmlnLT5oZWFkZXJfZHdfYWRyID0KKwkJCQlody0+d29ya19zcGFjZV9idWYtPmNtX2hlYWRlcl9kdy5idWZfc3RhcnQgKworCQkJCQkJKHBpY19jb25maWctPmluZGV4ICogdmF2MV9tbXVfY29tcHJlc3NfaGVhZGVyX3NpemUoaHcpKTsKKworCQl9CisjZW5kaWYKKwl9CisKKyNlbHNlCisvKiFVU0VfU1BFQ19CVUZfRk9SX01NVV9IRUFEKi8KKwlpZiAoaHctPm1tdV9lbmFibGUpIHsKKwkJcGljX2NvbmZpZy0+aGVhZGVyX2FkciA9IGRlY29kZXJfYm1tdV9ib3hfZ2V0X3BoeV9hZGRyKAorCQkJaHctPmJtbXVfYm94LCBIRUFERVJfQlVGRkVSX0lEWChwaWNfY29uZmlnLT5pbmRleCkpOworCisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKwkJaWYgKGh3LT5kd19tbXVfZW5hYmxlKSB7CisJCQlwaWNfY29uZmlnLT5oZWFkZXJfZHdfYWRyID0gZGVjb2Rlcl9ibW11X2JveF9nZXRfcGh5X2FkZHIoCisJCQkJaHctPmJtbXVfYm94LCBEV19IRUFERVJfQlVGRkVSX0lEWChwaWNfY29uZmlnLT5pbmRleCkpOworCisJCX0KKwkJaWYgKGRlYnVnICYgQVYxX0RFQlVHX0JVRk1HUl9NT1JFKSB7CisJCQlwcl9pbmZvKCJNTVUgZHcgaGVhZGVyX2FkciAoJWQsICVkKSAlZDogJWRcbiIsCisJCQkJaHctPmR3X21tdV9lbmFibGUsCisJCQkJRFdfSEVBREVSX0JVRkZFUl9JRFgocGljX2NvbmZpZy0+aW5kZXgpLAorCQkJCXBpY19jb25maWctPmluZGV4LAorCQkJCXBpY19jb25maWctPmhlYWRlcl9kd19hZHIpOworCQl9CisjZW5kaWYKKworCQlpZiAoZGVidWcgJiBBVjFfREVCVUdfQlVGTUdSX01PUkUpIHsKKwkJCXByX2luZm8oIk1NVSBoZWFkZXJfYWRyICVkOiAlZFxuIiwKKwkJCQlwaWNfY29uZmlnLT5pbmRleCwgcGljX2NvbmZpZy0+aGVhZGVyX2Fkcik7CisJCX0KKwl9CisjZW5kaWYKKworCWkgPSBwaWNfY29uZmlnLT5pbmRleDsKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJaWYgKChody0+d29ya19zcGFjZV9idWYtPm1wcmVkX212LmJ1Zl9zdGFydCArCisJCSgoaSArIDEpICogbXZfYnVmZmVyX3NpemUpKQorCQk8PSBtcHJlZF9tdl9lbmQKKwkpIHsKKyNlbmRpZgorCQlpZiAoYnVmX3NpemUgPiAwKSB7CisJCQlyZXQgPSBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkoaHctPmJtbXVfYm94LAorCQkJCQlWRl9CVUZGRVJfSURYKGkpLAorCQkJCQlidWZfc2l6ZSwgRFJJVkVSX05BTUUsCisJCQkJCSZwaWNfY29uZmlnLT5jbWFfYWxsb2NfYWRkcik7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXByX2luZm8oCisJCQkJCSJkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkgaWR4ICVkIHNpemUgJWQgZmFpbFxuIiwKKwkJCQkJVkZfQlVGRkVSX0lEWChpKSwKKwkJCQkJYnVmX3NpemUKKwkJCQkJKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCisJCQlpZiAocGljX2NvbmZpZy0+Y21hX2FsbG9jX2FkZHIpCisJCQkJeV9hZHIgPSBwaWNfY29uZmlnLT5jbWFfYWxsb2NfYWRkcjsKKwkJCWVsc2UgeworCQkJCXByX2luZm8oCisJCQkJCSJkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkgaWR4ICVkIHNpemUgJWQgcmV0dXJuIG51bGxcbiIsCisJCQkJCVZGX0JVRkZFUl9JRFgoaSksCisJCQkJCWJ1Zl9zaXplCisJCQkJCSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXsKKwkJCS8qZW5zdXJlIGdldF9waWNfYnlfUE9DKCkKKwkJCW5vdCBnZXQgdGhlIGJ1ZmZlciBub3QgZGVjb2RlZCovCisJCQlwaWNfY29uZmlnLT5CVUZfaW5kZXggPSBpOworCQkJcGljX2NvbmZpZy0+bGN1X3RvdGFsID0gbGN1X3RvdGFsOworCisJCQlwaWNfY29uZmlnLT5jb21wX2JvZHlfc2l6ZSA9IGxvc2xlc3NfY29tcF9ib2R5X3NpemU7CisJCQlwaWNfY29uZmlnLT5idWZfc2l6ZSA9IGJ1Zl9zaXplOworCisJCQlwaWNfY29uZmlnLT5tY19jYW52YXNfeSA9IHBpY19jb25maWctPmluZGV4OworCQkJcGljX2NvbmZpZy0+bWNfY2FudmFzX3VfdiA9IHBpY19jb25maWctPmluZGV4OworCQkJaWYgKGR3X21vZGUgJiAweDEwKSB7CisJCQkJcGljX2NvbmZpZy0+ZHdfeV9hZHIgPSB5X2FkcjsKKwkJCQlwaWNfY29uZmlnLT5kd191X3ZfYWRyID0geV9hZHIgKworCQkJCQkoKG1jX2J1ZmZlcl9zaXplX3Vfdl9oIDw8IDE2KSA8PCAxKTsKKworCQkJCXBpY19jb25maWctPm1jX2NhbnZhc195ID0KKwkJCQkJKHBpY19jb25maWctPmluZGV4IDw8IDEpOworCQkJCXBpY19jb25maWctPm1jX2NhbnZhc191X3YgPQorCQkJCQkocGljX2NvbmZpZy0+aW5kZXggPDwgMSkgKyAxOworCQkJfSBlbHNlIGlmIChkd19tb2RlICYmIChkd19tb2RlICYgMHgyMCkgPT0gMCkgeworCQkJCXBpY19jb25maWctPmR3X3lfYWRyID0geV9hZHI7CisJCQkJcGljX2NvbmZpZy0+ZHdfdV92X2FkciA9IHBpY19jb25maWctPmR3X3lfYWRyICsKKwkJCQkoKG1jX2J1ZmZlcl9zaXplX3Vfdl9oIDw8IDE2KSA8PCAxKTsKKwkJCX0KKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJCQlwaWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyID0KKwkJCWh3LT53b3JrX3NwYWNlX2J1Zi0+bXByZWRfbXYuYnVmX3N0YXJ0ICsKKwkJCQkJKHBpY19jb25maWctPmluZGV4ICogbXZfYnVmZmVyX3NpemUpOworI2VuZGlmCisjaWZkZWYgRFVNUF9GSUxNR1JBSU4KKwkJCWlmIChwaWNfY29uZmlnLT5pbmRleCA9PSBmZ19kdW1wX2luZGV4KSB7CisJCQkJcGljX2NvbmZpZy0+ZmdzX3RhYmxlX2FkciA9IGh3LT5mZ19waHlfYWRkcjsKKwkJCQlwcl9pbmZvKCJzZXQgYnVmZmVyICVkIGZpbG0gZ3JhaW4gdGFibGUgMHgleFxuIiwKKwkJCQkJcGljX2NvbmZpZy0+aW5kZXgsIHBpY19jb25maWctPmZnc190YWJsZV9hZHIpOworCQkJfSBlbHNlCisjZW5kaWYKKwkJICAgIHBpY19jb25maWctPmZnc190YWJsZV9hZHIgPQorCQkJCWh3LT53b3JrX3NwYWNlX2J1Zi0+ZmdzX3RhYmxlLmJ1Zl9zdGFydCArCisJCQkJKHBpY19jb25maWctPmluZGV4ICogRkdTX1RBQkxFX1NJWkUpOworCisJCQlpZiAoZGVidWcpIHsKKwkJCQlwcl9pbmZvCisJCQkJKCIlcyBpbmRleCAlZCBCVUZfaW5kZXggJWQgIiwKKwkJCQlfX2Z1bmNfXywgcGljX2NvbmZpZy0+aW5kZXgsCisJCQkJcGljX2NvbmZpZy0+QlVGX2luZGV4KTsKKwkJCQlwcl9pbmZvCisJCQkJKCJjb21wX2JvZHlfc2l6ZSAleCBjb21wX2J1Zl9zaXplICV4ICIsCisJCQkJcGljX2NvbmZpZy0+Y29tcF9ib2R5X3NpemUsCisJCQkJcGljX2NvbmZpZy0+YnVmX3NpemUpOworCQkJCXByX2luZm8KKwkJCQkoIm1wcmVkX212X3dyX3N0YXJ0X2FkciAlZFxuIiwKKwkJCQlwaWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyKTsKKwkJCQlwcl9pbmZvKCJkd195X2FkciAlZCwgcGljX2NvbmZpZy0+ZHdfdV92X2FkciA9JWRcbiIsCisJCQkJCXBpY19jb25maWctPmR3X3lfYWRyLAorCQkJCQlwaWNfY29uZmlnLT5kd191X3ZfYWRyKTsKKwkJCX0KKwkJCXJldCA9IDA7CisJCX0KKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJfQorI2VuZGlmCisJcmV0dXJuIHJldDsKK30KKworI2lmbmRlZiBVU0VfU1BFQ19CVUZfRk9SX01NVV9IRUFECitzdGF0aWMgaW50IHZhdjFfbW11X2NvbXByZXNzX2hlYWRlcl9zaXplKHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKSAmJgorCQlJU184S19TSVpFKGh3LT5tYXhfcGljX3csIGh3LT5tYXhfcGljX2gpKQorCQlyZXR1cm4gKE1NVV9DT01QUkVTU19IRUFERVJfU0laRV84Syk7CisKKwlpZiAoSVNfNEtfU0laRShody0+bWF4X3BpY193LCBody0+bWF4X3BpY19oKSkKKwkJcmV0dXJuIE1NVV9DT01QUkVTU19IRUFERVJfU0laRV80SzsKKworCXJldHVybiAoTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFXzEwODBQKTsKK30KKyNlbmRpZgorLyojZGVmaW5lIEZSQU1FX01NVV9NQVBfU0laRSAgKE1BWF9GUkFNRV80S19OVU0gKiA0KSovCitzdGF0aWMgaW50IHZhdjFfZnJhbWVfbW11X21hcF9zaXplKHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKSAmJgorCQlJU184S19TSVpFKGh3LT5tYXhfcGljX3csIGh3LT5tYXhfcGljX2gpKQorCQlyZXR1cm4gKE1BWF9GUkFNRV84S19OVU0gKiA0KTsKKworCXJldHVybiAoTUFYX0ZSQU1FXzRLX05VTSAqIDQpOworfQorCisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKK3N0YXRpYyBpbnQgdmFvbV9kd19mcmFtZV9tbXVfbWFwX3NpemUoc3RydWN0IEFWMUhXX3MgKmh3KQoreworCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpICYmCisJCUlTXzhLX1NJWkUoaHctPm1heF9waWNfdywgaHctPm1heF9waWNfaCkpCisJCXJldHVybiAoTUFYX0ZSQU1FXzhLX05VTSAqIDQpOworCisJcmV0dXJuIChNQVhfRlJBTUVfNEtfTlVNICogNCk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgaW5pdF9waWNfbGlzdChzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJaW50IGk7CisJc3RydWN0IEFWMV9Db21tb25fcyAqY20gPSAmaHctPmNvbW1vbjsKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljX2NvbmZpZzsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisKKyNpZm5kZWYgVVNFX1NQRUNfQlVGX0ZPUl9NTVVfSEVBRAorCXUzMiBoZWFkZXJfc2l6ZTsKKwlpZiAoaHctPm1tdV9lbmFibGUgJiYgKChody0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDEwKSA9PSAwKSkgeworCQloZWFkZXJfc2l6ZSA9IHZhdjFfbW11X2NvbXByZXNzX2hlYWRlcl9zaXplKGh3KTsKKwkJLyphbGxvYyBBVjEgY29tcHJlc3MgaGVhZGVyIGZpcnN0Ki8KKwkJZm9yIChpID0gMDsgaSA8IGh3LT51c2VkX2J1Zl9udW07IGkrKykgeworCQkJdW5zaWduZWQgbG9uZyBidWZfYWRkcjsKKwkJCWlmIChkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkKKwkJCQkoaHctPmJtbXVfYm94LAorCQkJCUhFQURFUl9CVUZGRVJfSURYKGkpLCBoZWFkZXJfc2l6ZSwKKwkJCQlEUklWRVJfSEVBREVSX05BTUUsCisJCQkJJmJ1Zl9hZGRyKSA8IDApIHsKKwkJCQlhdjFfcHJpbnQoaHcsIDAsICIlcyBtYWxsb2MgY29tcHJlc3MgaGVhZGVyIGZhaWxlZCAlZFxuIiwKKwkJCQlEUklWRVJfSEVBREVSX05BTUUsIGkpOworCQkJCWh3LT5mYXRhbF9lcnJvciB8PSBERUNPREVSX0ZBVEFMX0VSUk9SX05PX01FTTsKKwkJCQlyZXR1cm47CisJCQl9CisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKwkJCWlmIChody0+ZHdfbW11X2VuYWJsZSkgeworCQkJCWlmIChkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkKKwkJCQkJKGh3LT5ibW11X2JveCwKKwkJCQkJRFdfSEVBREVSX0JVRkZFUl9JRFgoaSksIGhlYWRlcl9zaXplLAorCQkJCQlEUklWRVJfSEVBREVSX05BTUUsCisJCQkJCSZidWZfYWRkcikgPCAwKSB7CisJCQkJCWF2MV9wcmludChodywgMCwgIiVzIG1hbGxvYyBjb21wcmVzcyBkdyBoZWFkZXIgZmFpbGVkICVkXG4iLAorCQkJCQlEUklWRVJfSEVBREVSX05BTUUsIGkpOworCQkJCQlody0+ZmF0YWxfZXJyb3IgfD0gREVDT0RFUl9GQVRBTF9FUlJPUl9OT19NRU07CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisjZW5kaWYKKwkJfQorCX0KKyNlbmRpZgorCWZvciAoaSA9IDA7IGkgPCBody0+dXNlZF9idWZfbnVtOyBpKyspIHsKKwkJcGljX2NvbmZpZyA9ICZjbS0+YnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnNbaV0uYnVmOworCQlwaWNfY29uZmlnLT5pbmRleCA9IGk7CisJCXBpY19jb25maWctPkJVRl9pbmRleCA9IC0xOworCQlwaWNfY29uZmlnLT5tdl9idWZfaW5kZXggPSAtMTsKKwkJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCQlwaWNfY29uZmlnLT55X2NhbnZhc19pbmRleCA9IC0xOworCQkJcGljX2NvbmZpZy0+dXZfY2FudmFzX2luZGV4ID0gLTE7CisJCX0KKwkJcGljX2NvbmZpZy0+eV9jcm9wX3dpZHRoID0gaHctPmluaXRfcGljX3c7CisJCXBpY19jb25maWctPnlfY3JvcF9oZWlnaHQgPSBody0+aW5pdF9waWNfaDsKKwkJcGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGUgPSBnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpOworCQlody0+YnVmZmVyX3dyYXBbaV0gPSBpOworCisJCWlmICghaHctPmlzX3VzZWRfdjRsKSB7CisJCQlpZiAoY29uZmlnX3BpYyhodywgcGljX2NvbmZpZykgPCAwKSB7CisJCQkJaWYgKGRlYnVnKQorCQkJCQlhdjFfcHJpbnQoaHcsIDAsICJDb25maWdfcGljICVkIGZhaWxcbiIsCisJCQkJCQlwaWNfY29uZmlnLT5pbmRleCk7CisJCQkJcGljX2NvbmZpZy0+aW5kZXggPSAtMTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKHBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlICYmCisJCQkJKHBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlICYgMHgyMCkgPT0gMCkgeworCQkJCXNldF9jYW52YXMoaHcsIHBpY19jb25maWcpOworCQkJfQorCQl9CisJfQorCWZvciAoOyBpIDwgaHctPnVzZWRfYnVmX251bTsgaSsrKSB7CisJCXBpY19jb25maWcgPSAmY20tPmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzW2ldLmJ1ZjsKKwkJcGljX2NvbmZpZy0+aW5kZXggPSAtMTsKKwkJcGljX2NvbmZpZy0+QlVGX2luZGV4ID0gLTE7CisJCXBpY19jb25maWctPm12X2J1Zl9pbmRleCA9IC0xOworCQlody0+YnVmZmVyX3dyYXBbaV0gPSBpOworCQlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJCXBpY19jb25maWctPnlfY2FudmFzX2luZGV4ID0gLTE7CisJCQlwaWNfY29uZmlnLT51dl9jYW52YXNfaW5kZXggPSAtMTsKKwkJfQorCX0KKwlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19CVUZNR1IsICIlcyBvaywgdXNlZF9idWZfbnVtID0gJWRcbiIsCisJCV9fZnVuY19fLCBody0+dXNlZF9idWZfbnVtKTsKKworfQorCitzdGF0aWMgdm9pZCBpbml0X3BpY19saXN0X2h3KHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgQVYxX0NvbW1vbl9zICpjbSA9ICZody0+Y29tbW9uOworCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpwaWNfY29uZmlnOworCS8qV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DMkFYSV9UQkxfQ09ORl9BRERSLCAweDApOyovCisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DMkFYSV9UQkxfQ09ORl9BRERSLAorCQkoMHgxIDw8IDEpIHwgKDB4MSA8PCAyKSk7CisKKworCWZvciAoaSA9IDA7IGkgPCBody0+dXNlZF9idWZfbnVtOyBpKyspIHsKKwkJcGljX2NvbmZpZyA9ICZjbS0+YnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnNbaV0uYnVmOworCQlpZiAocGljX2NvbmZpZy0+aW5kZXggPCAwKQorCQkJYnJlYWs7CisKKwkJaWYgKGh3LT5tbXVfZW5hYmxlICYmICgocGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDEwKSA9PSAwKSkgeworCisJCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9EQVRBLAorCQkJCXBpY19jb25maWctPmhlYWRlcl9hZHIgPj4gNSk7CisJCX0gZWxzZSB7CisJCQkvKldSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0NNRF9BRERSLAorCQkJICoJcGljX2NvbmZpZy0+bWNfeV9hZHIKKwkJCSAqCXwgKHBpY19jb25maWctPm1jX2NhbnZhc195IDw8IDgpIHwgMHgxKTsKKwkJCSAqLworCQkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DMkFYSV9UQkxfREFUQSwKKwkJCQlwaWNfY29uZmlnLT5kd195X2FkciA+PiA1KTsKKwkJfQorI2lmbmRlZiBMT1NMRVNTX0NPTVBSRVNTX01PREUKKwkJLypXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9DTURfQUREUiwKKwkJICoJcGljX2NvbmZpZy0+bWNfdV92X2FkcgorCQkgKgl8IChwaWNfY29uZmlnLT5tY19jYW52YXNfdV92IDw8IDgpfCAweDEpOworCQkgKi8KKwkJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0RBVEEsCisJCQkJcGljX2NvbmZpZy0+ZHdfdV92X2FkciA+PiA1KTsKKyNlbHNlCisJCWlmIChwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MTApIHsKKwkJCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9EQVRBLAorCQkJCXBpY19jb25maWctPmR3X3Vfdl9hZHIgPj4gNSk7CisJCX0KKyNlbmRpZgorCX0KKwlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9DT05GX0FERFIsIDB4MSk7CisKKyNpZmRlZiBDSEFOR0VfUkVNT1ZFRAorCS8qWmVybyBvdXQgY2FudmFzIHJlZ2lzdGVycyBpbiBJUFAgLS0gYXZvaWQgc2ltdWxhdGlvbiBYKi8KKwlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0FDQ0NPTkZJR19BRERSLAorCQkJKDAgPDwgOCkgfCAoMCA8PCAxKSB8IDEpOworI2Vsc2UKKwlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0FDQ0NPTkZJR19BRERSLAorCQkJKDEgPDwgOCkgfCAoMCA8PCAxKSB8IDEpOworI2VuZGlmCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSLCAwKTsKK30KKworCitzdGF0aWMgdm9pZCBkdW1wX3BpY19saXN0KHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlzdHJ1Y3QgQVYxX0NvbW1vbl9zICpjb25zdCBjbSA9ICZody0+Y29tbW9uOworCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpwaWNfY29uZmlnOworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBGUkFNRV9CVUZGRVJTOyBpKyspIHsKKwkJcGljX2NvbmZpZyA9ICZjbS0+YnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnNbaV0uYnVmOworCQlhdjFfcHJpbnQoaHcsIDAsCisJCQkiQnVmKCVkKSBpbmRleCAlZCBtdl9idWZfaW5kZXggJWQgcmVmX2NvdW50ICVkIHZmX3JlZiAlZCBkZWNfaWR4ICVkIHNsaWNlX3R5cGUgJWQgdy9oICVkLyVkIGFkciVsZFxuIiwKKwkJCWksCisJCQlwaWNfY29uZmlnLT5pbmRleCwKKyNpZm5kZWYgTVZfVVNFX0ZJWEVEX0JVRgorCQkJcGljX2NvbmZpZy0+bXZfYnVmX2luZGV4LAorI2Vsc2UKKwkJCS0xLAorI2VuZGlmCisJCQljbS0+YnVmZmVyX3Bvb2wtPgorCQkJZnJhbWVfYnVmc1tpXS5yZWZfY291bnQsCisJCQlwaWNfY29uZmlnLT52Zl9yZWYsCisJCQlwaWNfY29uZmlnLT5kZWNvZGVfaWR4LAorCQkJcGljX2NvbmZpZy0+c2xpY2VfdHlwZSwKKwkJCXBpY19jb25maWctPnlfY3JvcF93aWR0aCwKKwkJCXBpY19jb25maWctPnlfY3JvcF9oZWlnaHQsCisJCQlwaWNfY29uZmlnLT5jbWFfYWxsb2NfYWRkcgorCQkJKTsKKwl9CisJcmV0dXJuOworfQorCit2b2lkIGF2MV9yZWxlYXNlX2J1ZihBVjFEZWNvZGVyICpwYmksIFJlZkNudEJ1ZmZlciAqY29uc3QgYnVmKQoreworCisjaWYgMAorCS8vZGVmIENIQU5HRV9ET05FCisJc3RydWN0IEFWMUhXX3MgKmh3ID0gKHN0cnVjdCBBVjFIV19zICopKHBiaS0+cHJpdmF0ZV9kYXRhKTsKKwlpZiAoIWh3LT5tbXVfZW5hYmxlKQorCQlyZXR1cm47CisJLy9yZWxlYXNlX2J1ZmZlcl80aygmYXYxX21tdW1ncl9tLCBidWYtPmJ1Zi5pbmRleCk7CisJZGVjb2Rlcl9tbXVfYm94X2ZyZWVfaWR4KGh3LT5tbXVfYm94LCBidWYtPmJ1Zi5pbmRleCk7CisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKwkvL3JlbGVhc2VfYnVmZmVyXzRrKCZhdjFfbW11bWdyX2R3LCBidWYtPmJ1Zi5pbmRleCk7CisJZGVjb2Rlcl9tbXVfYm94X2ZyZWVfaWR4KGh3LT5tbXVfYm94X2R3LCBidWYtPmJ1Zi5pbmRleCk7CisjZW5kaWYKKworI2VuZGlmCit9CisKK3ZvaWQgYXYxX3JlbGVhc2VfYnVmcyhzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJQVYxX0NPTU1PTiAqY20gPSAmaHctPmNvbW1vbjsKKwlSZWZDbnRCdWZmZXIgKmNvbnN0IGZyYW1lX2J1ZnMgPSBjbS0+YnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnM7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRlJBTUVfQlVGRkVSUzsgKytpKSB7CisJCWlmIChmcmFtZV9idWZzW2ldLmJ1Zi52Zl9yZWYgPT0gMCAmJgorCQkJZnJhbWVfYnVmc1tpXS5yZWZfY291bnQgPT0gMCAmJgorCQkJZnJhbWVfYnVmc1tpXS5idWYuaW5kZXggPj0gMCkgeworCQkJaWYgKGZyYW1lX2J1ZnNbaV0uYnVmLmF1eF9kYXRhX2J1ZikKKwkJCQlyZWxlYXNlX2F1eF9kYXRhKGh3LCAmZnJhbWVfYnVmc1tpXS5idWYpOworCQl9CisJfQorfQorCisjaWZkZWYgREVCVUdfQ01ECitzdGF0aWMgdm9pZCBkX2ZpbGxfemVybyhzdHJ1Y3QgQVYxSFdfcyAqaHcsIHVuc2lnbmVkIGludCBwaHlhZHIsIGludCBzaXplKQoreworCVdSSVRFX1ZSRUcoSEVWQ19EQkdfTE9HX0FEUiwgcGh5YWRyKTsKKwlXUklURV9WUkVHKERFQlVHX1JFRzEsCisJCTB4MjAwMDAwMDAgfCBzaXplKTsKKwlkZWJ1Z19jbWRfd2FpdF9jb3VudCA9IDA7CisJZGVidWdfY21kX3dhaXRfdHlwZSA9IDE7CisJd2hpbGUgKChSRUFEX1ZSRUcoREVCVUdfUkVHMSkgJiAweDEpID09IDAKKwkJJiYgZGVidWdfY21kX3dhaXRfY291bnQgPCAweDdmZmZmZmZmKSB7CisJCWRlYnVnX2NtZF93YWl0X2NvdW50Kys7CisJfQorCisJV1JJVEVfVlJFRyhERUJVR19SRUcxLCAwKTsKKwlkZWJ1Z19jbWRfd2FpdF90eXBlID0gMDsKK30KKworc3RhdGljIHZvaWQgZF9kdW1wKHN0cnVjdCBBVjFIV19zICpodywgdW5zaWduZWQgaW50IHBoeWFkciwgaW50IHNpemUsCisJc3RydWN0IGZpbGUgKmZwLCBsb2ZmX3QgKndyX29mZikKK3sKKworCWludCBqajsKKwl1bnNpZ25lZCBjaGFyICpkYXRhID0gKHVuc2lnbmVkIGNoYXIgKikKKwkJKGh3LT51Y29kZV9sb2dfYWRkcik7CisJV1JJVEVfVlJFRyhIRVZDX0RCR19MT0dfQURSLCBody0+dWNvZGVfbG9nX3BoeV9hZGRyKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19EX0FEUiwgcGh5YWRyKTsKKwlXUklURV9WUkVHKERFQlVHX1JFRzEsCisJCTB4MTAwMDAwMDAgfCBzaXplKTsKKworCWRlYnVnX2NtZF93YWl0X2NvdW50ID0gMDsKKwlkZWJ1Z19jbWRfd2FpdF90eXBlID0gMzsKKwl3aGlsZSAoKFJFQURfVlJFRyhERUJVR19SRUcxKSAmIDB4MSkgPT0gMAorCQkmJiBkZWJ1Z19jbWRfd2FpdF9jb3VudCA8IDB4N2ZmZmZmZmYpIHsKKwkJZGVidWdfY21kX3dhaXRfY291bnQrKzsKKwl9CisKKwlpZiAoZnApIHsKKwkJdmZzX3dyaXRlKGZwLCBkYXRhLAorCQkJc2l6ZSwgd3Jfb2ZmKTsKKworCX0gZWxzZSB7CisJCWZvciAoamogPSAwOyBqaiA8IHNpemU7IGpqKyspIHsKKwkJCWlmICgoamogJiAweGYpID09IDApCisJCQkJYXYxX3ByaW50KGh3LCAwLAorCQkJCQkiJTA2eDoiLCBqaik7CisJCQlhdjFfcHJpbnRfY29udChodywgMCwKKwkJCQkiJTAyeCAiLCBkYXRhW2pqXSk7CisJCQlpZiAoKChqaiArIDEpICYgMHhmKSA9PSAwKQorCQkJCWF2MV9wcmludF9jb250KGh3LCAwLAorCQkJCQkiXG4iKTsKKwkJfQorCQlhdjFfcHJpbnQoaHcsIDAsICJcbiIpOworCX0KKworCVdSSVRFX1ZSRUcoREVCVUdfUkVHMSwgMCk7CisJZGVidWdfY21kX3dhaXRfdHlwZSA9IDA7CisKK30KKworc3RhdGljIHZvaWQgbXZfYnVmZmVyX2ZpbGxfemVybyhzdHJ1Y3QgQVYxSFdfcyAqaHcsIHN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpwaWNfY29uZmlnKQoreworCXByX2luZm8oImZpbGwgZHVtbXkgZGF0YSBwaWMgaW5kZXggJWQgY29sb2NhdGUgYWRkcmVzZXMgJXggc2l6ZSAleFxuIiwKKwkJcGljX2NvbmZpZy0+aW5kZXgsIHBpY19jb25maWctPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIsCisJCWh3LT5tX212X0JVRltwaWNfY29uZmlnLT5tdl9idWZfaW5kZXhdLnNpemUpOworCWRfZmlsbF96ZXJvKGh3LCBwaWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyLAorCQlody0+bV9tdl9CVUZbcGljX2NvbmZpZy0+bXZfYnVmX2luZGV4XS5zaXplKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9tdl9idWZmZXIoc3RydWN0IEFWMUhXX3MgKmh3LCBzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljX2NvbmZpZykKK3sKKworCXVuc2lnbmVkIGludCBhZHIsIHNpemU7CisJdW5zaWduZWQgaW50IGFkcl9lbmQgPSBwaWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyICsKKwkJaHctPm1fbXZfQlVGW3BpY19jb25maWctPm12X2J1Zl9pbmRleF0uc2l6ZTsKKwltbV9zZWdtZW50X3Qgb2xkX2ZzOworCWxvZmZfdCBvZmYgPSAwOworCWludCBtb2RlID0gT19DUkVBVCB8IE9fV1JPTkxZIHwgT19UUlVOQzsKKwljaGFyIGZpbGVbNjRdOworCXN0cnVjdCBmaWxlICpmcDsKKwlzcHJpbnRmKCZmaWxlWzBdLCAiL2RhdGEvdG1wL2NvbG9jYXRlJWQiLCBody0+ZnJhbWVfY291bnQtMSk7CisJZnAgPSBmaWxwX29wZW4oZmlsZSwgbW9kZSwgMDY2Nik7CisJb2xkX2ZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKEtFUk5FTF9EUyk7CisJZm9yIChhZHIgPSBwaWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyOworCQlhZHIgPCBhZHJfZW5kOworCQlhZHIgKz0gVUNPREVfTE9HX0JVRl9TSVpFKSB7CisJCXNpemUgPSBVQ09ERV9MT0dfQlVGX1NJWkU7CisJCWlmIChzaXplID4gKGFkcl9lbmQgLSBhZHIpKQorCQkJc2l6ZSA9IGFkcl9lbmQgLSBhZHI7CisJCXByX2luZm8oImR1bXAgcGljIGluZGV4ICVkIGNvbG9jYXRlIGFkZHJlc2VzICV4IHNpemUgJXhcbiIsCisJCQlwaWNfY29uZmlnLT5pbmRleCwgYWRyLCBzaXplKTsKKwkJZF9kdW1wKGh3LCBhZHIsIHNpemUsIGZwLCAmb2ZmKTsKKwl9CisJc2V0X2ZzKG9sZF9mcyk7CisJdmZzX2ZzeW5jKGZwLCAwKTsKKworCWZpbHBfY2xvc2UoZnAsIGN1cnJlbnQtPmZpbGVzKTsKK30KKworI2VuZGlmCisKK3N0YXRpYyBpbnQgY29uZmlnX3BpY19zaXplKHN0cnVjdCBBVjFIV19zICpodywgdW5zaWduZWQgc2hvcnQgYml0X2RlcHRoKQoreworCXVpbnQzMl90IGRhdGEzMjsKKwlzdHJ1Y3QgQVYxX0NvbW1vbl9zICpjbSA9ICZody0+Y29tbW9uOworCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpjdXJfcGljX2NvbmZpZyA9ICZjbS0+Y3VyX2ZyYW1lLT5idWY7CisJaW50IGxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSwgbG9zbGVzc19jb21wX2JvZHlfc2l6ZTsKKyNpZmRlZiBBT01fQVYxX01NVV9EVworCWludCBsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemVfZHcsIGxvc2xlc3NfY29tcF9ib2R5X3NpemVfZHc7CisjZW5kaWYKKyAgICBhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkiCSMjIyMgY29uZmlnX3BpY19zaXplICMjIyMsIGJpdF9kZXB0aCA9ICVkXG4iLCBiaXRfZGVwdGgpOworCisJZnJhbWVfd2lkdGggPSBjdXJfcGljX2NvbmZpZy0+eV9jcm9wX3dpZHRoOworCWZyYW1lX2hlaWdodCA9IGN1cl9waWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0OworCWN1cl9waWNfY29uZmlnLT5iaXRfZGVwdGggPSBiaXRfZGVwdGg7CisJY3VyX3BpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlID0gZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KTsKKworCS8qIHVzZSBmaXhlZCBtYXhpbXVtIHNpemUgICAvLyAxMjh4MTI4LzQvNCozLWJpdHMgPSAzODQgQnl0ZXMKKyAgICBzZWdfbWFwX3NpemUgPQorCSgoZnJhbWVfd2lkdGggKyAxMjcpID4+IDcpICogKChmcmFtZV9oZWlnaHQgKyAxMjcpID4+IDcpICogMzg0IDsKKwkqLworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgIT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1QzKSB7CisJCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfUElDVFVSRV9TSVpFLAorCQkJKGZyYW1lX2hlaWdodCA8PCAxNikgfCBmcmFtZV93aWR0aCk7CisJfQorI2lmZGVmIERVQUxfREVDT0RFCisjZWxzZQorCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfUElDX1NJWkVfRkJfUkVBRCwKKwkJKGZyYW1lX2hlaWdodCA8PCAxNikgfCBmcmFtZV93aWR0aCk7CisjZW5kaWYKKyNpZmRlZiBBT01fQVYxX01NVQorCisgIC8vYWxsb2NfbW11KCZhdjFfbW11bWdyX20sIGNtLT5jdXJfZnJhbWUtPmJ1Zi5pbmRleCwgZnJhbWVfd2lkdGgsIGZyYW1lX2hlaWdodCwgIGJpdF9kZXB0aCk7CisjZW5kaWYKKyNpZmRlZiBBT01fQVYxX01NVV9EVworCisgIC8vYWxsb2NfbW11KCZhdjFfbW11bWdyX2R3LCBjbS0+Y3VyX2ZyYW1lLT5idWYuaW5kZXgsIGZyYW1lX3dpZHRoLCBmcmFtZV9oZWlnaHQsICBiaXRfZGVwdGgpOworICAgIGxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZV9kdyA9CisJCWNvbXB1dGVfbG9zbGVzc19jb21wX2hlYWRlcl9zaXplX2R3KGZyYW1lX3dpZHRoLCBmcmFtZV9oZWlnaHQpOworICAgIGxvc2xlc3NfY29tcF9ib2R5X3NpemVfZHcgPQorCQljb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemVfZHcoZnJhbWVfd2lkdGgsIGZyYW1lX2hlaWdodCwKKwkJCShiaXRfZGVwdGggPT0gQU9NX0JJVFNfMTApKTsKKyNlbmRpZgorCisgICAgbG9zbGVzc19jb21wX2hlYWRlcl9zaXplID0KKwkJY29tcHV0ZV9sb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUKKwkJKGZyYW1lX3dpZHRoLCBmcmFtZV9oZWlnaHQpOworICAgIGxvc2xlc3NfY29tcF9ib2R5X3NpemUgPQorCQljb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemUoZnJhbWVfd2lkdGgsCisJCWZyYW1lX2hlaWdodCwgKGJpdF9kZXB0aCA9PSBBT01fQklUU18xMCkpOworCisJY3VyX3BpY19jb25maWctPmNvbXBfYm9keV9zaXplID0gbG9zbGVzc19jb21wX2JvZHlfc2l6ZTsKKworCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCSIlczogd2lkdGggJWQgaGVpZ2h0ICVkIGRlcHRoICVkIGhlYWRfc2l6ZSAweCV4IGJvZHlfc2l6ZSAweCV4XHJcbiIsCisJCV9fZnVuY19fLCBmcmFtZV93aWR0aCwgZnJhbWVfaGVpZ2h0LCBiaXRfZGVwdGgsCisJCWxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSwgbG9zbGVzc19jb21wX2JvZHlfc2l6ZSk7CisjaWZkZWYgTE9TTEVTU19DT01QUkVTU19NT0RFCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkw1KTsKKwlpZiAoYml0X2RlcHRoID09IEFPTV9CSVRTXzEwKQorCQlkYXRhMzIgJj0gfigxPDw5KTsKKwllbHNlCisJCWRhdGEzMiB8PSAoMTw8OSk7CisKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw1LCBkYXRhMzIpOworCisJaWYgKGh3LT5tbXVfZW5hYmxlKSB7CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLCgweDE8PCA0KSk7IC8vIGJpdFs0XSA6IHBhZ2VkX21lbV9tb2RlCisJfSBlbHNlIHsKKwkJaWYgKGJpdF9kZXB0aCA9PSBBT01fQklUU18xMCkKKwkJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLCAoMDw8MykpOyAvLyBiaXRbM10gc21lbSBtZG9lCisJCWVsc2UKKwkJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLCAoMTw8MykpOyAvLyBiaXRbM10gc21lbSBtZG9lCisJfQorCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwyLAorCQkobG9zbGVzc19jb21wX2JvZHlfc2l6ZSA+PiA1KSk7CisJLyoKKwlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMywKKwkoMHhmZjw8MjApIHwgKDB4ZmY8PDEwKSB8IDB4ZmYpOyAvLzgtYml0IG1vZGUKKwkqLworCVdSSVRFX1ZSRUcoSEVWQ19DTV9CT0RZX0xFTkdUSCwKKwkJbG9zbGVzc19jb21wX2JvZHlfc2l6ZSk7CisJV1JJVEVfVlJFRyhIRVZDX0NNX0hFQURFUl9PRkZTRVQsCisJCWxvc2xlc3NfY29tcF9ib2R5X3NpemUpOworCVdSSVRFX1ZSRUcoSEVWQ19DTV9IRUFERVJfTEVOR1RILAorCQlsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUpOworCisJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShodykgJiAweDEwKQorCQlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMSwgMHgxIDw8IDMxKTsKKworI2Vsc2UKKwlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMSwweDEgPDwgMzEpOworI2VuZGlmCisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKyAgICBpZiAoaHctPmR3X21tdV9lbmFibGUpIHsKKwkJV1JJVEVfVlJFRyhIRVZDX0NNX0JPRFlfTEVOR1RIMiwgbG9zbGVzc19jb21wX2JvZHlfc2l6ZV9kdyk7CisJCVdSSVRFX1ZSRUcoSEVWQ19DTV9IRUFERVJfT0ZGU0VUMiwgbG9zbGVzc19jb21wX2JvZHlfc2l6ZV9kdyk7CisJCVdSSVRFX1ZSRUcoSEVWQ19DTV9IRUFERVJfTEVOR1RIMiwgbG9zbGVzc19jb21wX2hlYWRlcl9zaXplX2R3KTsKKwl9CisjZW5kaWYKKyAgICByZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IGNvbmZpZ19tY19idWZmZXIoc3RydWN0IEFWMUhXX3MgKmh3LCB1bnNpZ25lZCBzaG9ydCBiaXRfZGVwdGgsIHVuc2lnbmVkIGNoYXIgaW50ZXJfZmxhZykKK3sKKwlpbnQzMl90IGk7CisJQVYxX0NPTU1PTiAqY20gPSAmaHctPmNvbW1vbjsKKwlQSUNfQlVGRkVSX0NPTkZJRyogY3VyX3BpY19jb25maWcgPSAmY20tPmN1cl9mcmFtZS0+YnVmOworCXVpbnQ4X3Qgc2NhbGVfZW5hYmxlID0gMDsKKworCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCSIgIyMjIyBjb25maWdfbWNfYnVmZmVyICVzICMjIyNcbiIsCisJCWludGVyX2ZsYWcgPyAiaW50ZXIiIDogImludHJhIik7CisKKyNpZmRlZiBERUJVR19QUklOVAorCWlmIChkZWJ1ZyZBT01fQVYxX0RFQlVHX0JVRk1HUikKKwkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJCSJjb25maWdfbWNfYnVmZmVyIGVudGVyZWQgLi4uLi5cbiIpOworI2VuZGlmCisKKwlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0FDQ0NPTkZJR19BRERSLAorCQkoMCA8PCA4KSB8ICgwPDwxKSB8IDEpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSLAorCQkoY3VyX3BpY19jb25maWctPm9yZGVyX2hpbnQ8PDI0KSB8CisJCShjdXJfcGljX2NvbmZpZy0+bWNfY2FudmFzX3Vfdjw8MTYpIHwKKwkJKGN1cl9waWNfY29uZmlnLT5tY19jYW52YXNfdV92PDw4KXwKKwkJY3VyX3BpY19jb25maWctPm1jX2NhbnZhc195KTsKKwlmb3IgKGkgPSBMQVNUX0ZSQU1FOyBpIDw9IEFMVFJFRl9GUkFNRTsgaSsrKSB7CisJCVBJQ19CVUZGRVJfQ09ORklHICpwaWNfY29uZmlnOyAvL2NtLT5mcmFtZV9yZWZzW2ldLmJ1ZjsKKwkJaWYgKGludGVyX2ZsYWcpCisJCQlwaWNfY29uZmlnID0gYXYxX2dldF9yZWZfZnJhbWVfc3BlY19idWYoY20sIGkpOworCQllbHNlCisJCQlwaWNfY29uZmlnID0gY3VyX3BpY19jb25maWc7CisJCWlmIChwaWNfY29uZmlnKSB7CisJCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUiwKKwkJCQkocGljX2NvbmZpZy0+b3JkZXJfaGludDw8MjQpIHwKKwkJCQkocGljX2NvbmZpZy0+bWNfY2FudmFzX3Vfdjw8MTYpIHwKKwkJCQkocGljX2NvbmZpZy0+bWNfY2FudmFzX3Vfdjw8OCkgfAorCQkJCXBpY19jb25maWctPm1jX2NhbnZhc195KTsKKwkJCWlmIChpbnRlcl9mbGFnKQorCQkJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCQkJInJlZmlkIDB4JXggbWNfY2FudmFzX3VfdiAweCV4IG1jX2NhbnZhc195IDB4JXggb3JkZXJfaGludCAweCV4XG4iLAorCQkJCWksIHBpY19jb25maWctPm1jX2NhbnZhc191X3YsCisJCQkJcGljX2NvbmZpZy0+bWNfY2FudmFzX3ksIHBpY19jb25maWctPm9yZGVyX2hpbnQpOworCQl9IGVsc2UgeworCQkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIsIDApOworCQl9CisJfQorCisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwKKwkJKDE2IDw8IDgpIHwgKDAgPDwgMSkgfCAxKTsKKwlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUiwKKwkJKGN1cl9waWNfY29uZmlnLT5vcmRlcl9oaW50IDw8IDI0KSB8CisJCShjdXJfcGljX2NvbmZpZy0+bWNfY2FudmFzX3VfdiA8PCAxNikgfAorCQkoY3VyX3BpY19jb25maWctPm1jX2NhbnZhc191X3YgPDwgOCkgfAorCQljdXJfcGljX2NvbmZpZy0+bWNfY2FudmFzX3kpOworCWZvciAoaSA9IExBU1RfRlJBTUU7IGkgPD0gQUxUUkVGX0ZSQU1FOyBpKyspIHsKKwkJUElDX0JVRkZFUl9DT05GSUcgKnBpY19jb25maWc7CisJCWlmIChpbnRlcl9mbGFnKQorCQkJcGljX2NvbmZpZyA9IGF2MV9nZXRfcmVmX2ZyYW1lX3NwZWNfYnVmKGNtLCBpKTsKKwkJZWxzZQorCQkJcGljX2NvbmZpZyA9IGN1cl9waWNfY29uZmlnOworCisJCWlmIChwaWNfY29uZmlnKSB7CisJCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUiwKKwkJCShwaWNfY29uZmlnLT5vcmRlcl9oaW50IDw8IDI0KXwKKwkJCShwaWNfY29uZmlnLT5tY19jYW52YXNfdV92IDw8IDE2KSB8CisJCQkocGljX2NvbmZpZy0+bWNfY2FudmFzX3VfdiA8PCA4KSB8CisJCQlwaWNfY29uZmlnLT5tY19jYW52YXNfeSk7CisJCX0gZWxzZSB7CisJCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUiwgMCk7CisJCX0KKwl9CisKKwlXUklURV9WUkVHKEFWMURfTVBQX1JFRklORk9fVEJMX0FDQ0NPTkZJRywKKwkJKDB4MSA8PCAyKSB8ICgweDAgPDwzKSk7IC8vIGF1dG9faW5jIHN0YXJ0IGluZGV4OjAgZmllbGQ6MAorCWZvciAoaSA9IDA7IGkgPD0gQUxUUkVGX0ZSQU1FOyBpKyspIHsKKwkJaW50MzJfdCByZWZfcGljX2JvZHlfc2l6ZTsKKwkJc3RydWN0IHNjYWxlX2ZhY3RvcnMgKiBzZiA9IE5VTEw7CisJCVBJQ19CVUZGRVJfQ09ORklHICpwaWNfY29uZmlnOworCisJCWlmIChpbnRlcl9mbGFnICYmIGkgPj0gTEFTVF9GUkFNRSkKKwkJCXBpY19jb25maWcgPSBhdjFfZ2V0X3JlZl9mcmFtZV9zcGVjX2J1ZihjbSwgaSk7CisJCWVsc2UKKwkJCXBpY19jb25maWcgPSBjdXJfcGljX2NvbmZpZzsKKworCQlpZiAocGljX2NvbmZpZykgeworCQkJcmVmX3BpY19ib2R5X3NpemUgPQorCQkJCWNvbXB1dGVfbG9zbGVzc19jb21wX2JvZHlfc2l6ZShwaWNfY29uZmlnLT55X2Nyb3Bfd2lkdGgsCisJCQlwaWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0LCAoYml0X2RlcHRoID09IEFPTV9CSVRTXzEwKSk7CisKKwkJCVdSSVRFX1ZSRUcoQVYxRF9NUFBfUkVGSU5GT19EQVRBLCBwaWNfY29uZmlnLT55X2Nyb3Bfd2lkdGgpOworCQkJV1JJVEVfVlJFRyhBVjFEX01QUF9SRUZJTkZPX0RBVEEsIHBpY19jb25maWctPnlfY3JvcF9oZWlnaHQpOworCQkJaWYgKGludGVyX2ZsYWcgJiYgaSA+PSBMQVNUX0ZSQU1FKSB7CisJCQkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJCQkicmVmaWQgJWQ6IHJlZiB3aWR0aC9oZWlnaHQoJWQsJWQpLCBjdXIgd2lkdGgvaGVpZ2h0KCVkLCVkKSByZWZfcGljX2JvZHlfc2l6ZSAweCV4XG4iLAorCQkJCWksIHBpY19jb25maWctPnlfY3JvcF93aWR0aCwgcGljX2NvbmZpZy0+eV9jcm9wX2hlaWdodCwKKwkJCQljdXJfcGljX2NvbmZpZy0+eV9jcm9wX3dpZHRoLCBjdXJfcGljX2NvbmZpZy0+eV9jcm9wX2hlaWdodCwKKwkJCQlyZWZfcGljX2JvZHlfc2l6ZSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZWZfcGljX2JvZHlfc2l6ZSA9IDA7CisJCQlXUklURV9WUkVHKEFWMURfTVBQX1JFRklORk9fREFUQSwgMCk7CisJCQlXUklURV9WUkVHKEFWMURfTVBQX1JFRklORk9fREFUQSwgMCk7CisJCX0KKworCQlpZiAoaW50ZXJfZmxhZyAmJiBpID49IExBU1RfRlJBTUUpCisJCQlzZiA9IGF2MV9nZXRfcmVmX3NjYWxlX2ZhY3RvcnMoY20sIGkpOworCisJCWlmICgoc2YgIT0gTlVMTCkgJiYgYXYxX2lzX3NjYWxlZChzZikpIHsKKwkJCXNjYWxlX2VuYWJsZSB8PSAoMSA8PCBpKTsKKwkJfQorCisJCWlmIChzZikgeworCQkJV1JJVEVfVlJFRyhBVjFEX01QUF9SRUZJTkZPX0RBVEEsIHNmLT54X3NjYWxlX2ZwKTsKKwkJCVdSSVRFX1ZSRUcoQVYxRF9NUFBfUkVGSU5GT19EQVRBLCBzZi0+eV9zY2FsZV9mcCk7CisKKwkJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCQkieF9zY2FsZV9mcCAlZCwgeV9zY2FsZV9mcCAlZFxuIiwKKwkJCXNmLT54X3NjYWxlX2ZwLCBzZi0+eV9zY2FsZV9mcCk7CisJCX0gZWxzZSB7CisJCQlXUklURV9WUkVHKEFWMURfTVBQX1JFRklORk9fREFUQSwgUkVGX05PX1NDQUxFKTsgLy8xPDwxNAorCQkJV1JJVEVfVlJFRyhBVjFEX01QUF9SRUZJTkZPX0RBVEEsIFJFRl9OT19TQ0FMRSk7CisJCX0KKwkJaWYgKGh3LT5tbXVfZW5hYmxlKQorCQkJV1JJVEVfVlJFRyhBVjFEX01QUF9SRUZJTkZPX0RBVEEsIDApOworCQllbHNlCisJCQlXUklURV9WUkVHKEFWMURfTVBQX1JFRklORk9fREFUQSwKKwkJCQlyZWZfcGljX2JvZHlfc2l6ZSA+PiA1KTsKKwl9CisJV1JJVEVfVlJFRyhBVjFEX01QUF9SRUZfU0NBTEVfRU5CTCwgc2NhbGVfZW5hYmxlKTsKKwlXUklURV9WUkVHKFBBUlNFUl9SRUZfU0NBTEVfRU5CTCwgc2NhbGVfZW5hYmxlKTsKKwlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkiV1JJVEVfVlJFRyhQQVJTRVJfUkVGX1NDQUxFX0VOQkwsIDB4JXgpXG4iLAorCQlzY2FsZV9lbmFibGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjbGVhcl9tcHJlZF9odyhzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJdW5zaWduZWQgaW50IGRhdGEzMjsKKworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX01QUkVEX0NUUkw0KTsKKwlkYXRhMzIgJj0gICh+KDEgPDwgNikpOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9DVFJMNCwgZGF0YTMyKTsKK30KKworc3RhdGljIHZvaWQgY29uZmlnX21wcmVkX2h3KHN0cnVjdCBBVjFIV19zICpodywgdW5zaWduZWQgY2hhciBpbnRlcl9mbGFnKQoreworCUFWMV9DT01NT04gKmNtID0gJmh3LT5jb21tb247CisJUElDX0JVRkZFUl9DT05GSUcgKmN1cl9waWNfY29uZmlnID0gJmNtLT5jdXJfZnJhbWUtPmJ1ZjsKKwkvL1BJQ19CVUZGRVJfQ09ORklHICpsYXN0X2ZyYW1lX3BpY19jb25maWcgPSBOVUxMOworCWludCBpLCBqLCBwb3MsIHJlZ19pOworCWludCBtdl9jYWxfdHBsX2NvdW50ID0gMDsKKwl1bnNpZ25lZCBpbnQgbXZfcmVmX2lkW01GTVZfU1RBQ0tfU0laRV0gPSB7MCwgMCwgMH07CisJdW5zaWduZWQgcmVmX29mZnNldF9yZWdbXSA9IHsKKwkJSEVWQ19NUFJFRF9MMF9SRUYwNl9QT0MsCisJCUhFVkNfTVBSRURfTDBfUkVGMDdfUE9DLAorCQlIRVZDX01QUkVEX0wwX1JFRjA4X1BPQywKKwkJSEVWQ19NUFJFRF9MMF9SRUYwOV9QT0MsCisJCUhFVkNfTVBSRURfTDBfUkVGMTBfUE9DLAorCQlIRVZDX01QUkVEX0wwX1JFRjExX1BPQywKKwl9OworCXVuc2lnbmVkIHJlZl9idWZfcmVnW10gPSB7CisJCUhFVkNfTVBSRURfTDBfUkVGMDNfUE9DLAorCQlIRVZDX01QUkVEX0wwX1JFRjA0X1BPQywKKwkJSEVWQ19NUFJFRF9MMF9SRUYwNV9QT0MKKwl9OworCXVuc2lnbmVkIHJlZl9vZmZzZXRfdmFsWzZdID0KKwkJezAsIDAsIDAsIDAsIDAsIDB9OworCXVuc2lnbmVkIHJlZl9idWZfdmFsWzNdID0gezAsIDAsIDB9OworCisJdWludDMyX3QgZGF0YTMyOworCWludDMyX3QgIG1wcmVkX2N1cnJfbGN1X3g7CisJaW50MzJfdCAgbXByZWRfY3Vycl9sY3VfeTsKKwkvL2ludDMyX3QgICAgIG1wcmVkX212X3JkX2VuZF9hZGRyOworCisJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkiICMjIyMgY29uZmlnX21wcmVkX2h3ICMjIyNcbiIpOworCisJLyppZiAoY20tPnByZXZfZnJhbWUpCisJbGFzdF9mcmFtZV9waWNfY29uZmlnID0gJmNtLT5wcmV2X2ZyYW1lLT5idWY7CisJbXByZWRfbXZfcmRfZW5kX2FkZHIgPSBsYXN0X2ZyYW1lX3BpY19jb25maWctPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIKKwkrIChsYXN0X2ZyYW1lX3BpY19jb25maWctPmxjdV90b3RhbCAqIE1WX01FTV9VTklUKTsKKwkqLworCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfTVBSRURfQ1VSUl9MQ1UpOworCW1wcmVkX2N1cnJfbGN1X3ggICA9ZGF0YTMyICYgMHhmZmZmOworCW1wcmVkX2N1cnJfbGN1X3kgICA9KGRhdGEzMj4+MTYpICYgMHhmZmZmOworCisJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkiY3VyIHBpYyBpbmRleCAlZFxuIiwgY3VyX3BpY19jb25maWctPmluZGV4KTsKKwkvKnByaW50aygiY3VyIHBpYyBpbmRleCAlZCAgY29sIHBpYyBpbmRleCAlZFxuIiwKKwljdXJfcGljX2NvbmZpZy0+aW5kZXgsIGxhc3RfZnJhbWVfcGljX2NvbmZpZy0+aW5kZXgpOyovCisKKwkvL1dSSVRFX1ZSRUcoSEVWQ19NUFJFRF9DVFJMMywweDI0MTIyNDEyKTsKKyNpZmRlZiBDT19NVl9DT01QUkVTUworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1RCkgeworCQlXUklURV9WUkVHKEhFVkNfTVBSRURfQ1RSTDMsMHgxMDE1MTAxNSk7IC8vICdkMTAsICdkMjEgZm9yIEFWMQorCX0gZWxzZSB7CisJCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9DVFJMMywweDEzMTUxMzE1KTsgLy8gJ2QxOSwgJ2QyMSBmb3IgQVYxCisJfQorI2Vsc2UKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfQ1RSTDMsMHgxMzE1MTMxNSk7IC8vICdkMTksICdkMjEgZm9yIEFWMQorI2VuZGlmCisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0FCVl9TVEFSVF9BRERSLAorCWh3LT5wYmktPndvcmtfc3BhY2VfYnVmLT5tcHJlZF9hYm92ZS5idWZfc3RhcnQpOworCisjaWYgMAorCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX01QUkVEX0NUUkw0KTsKKwlkYXRhMzIgJj0gICh+KDE8PDYpKTsKKwlkYXRhMzIgfD0gKGNtLT51c2VfcHJldl9mcmFtZV9tdnMgPDwgNik7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0NUUkw0LCBkYXRhMzIpOworI2VuZGlmCisJaWYgKGludGVyX2ZsYWcpIHsKKwkJLyogY29uZmlnIHNpZ25fYmlhcyAqLworCQkvL2RhdGEzMiA9IChjbS0+Y3VyX2ZyYW1lX2ZvcmNlX2ludGVnZXJfbXYgJiAweDEpIDw8IDk7CisJCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX01QUkVEX0NUUkw0KTsKKwkJZGF0YTMyICY9ICh+KDB4ZmYgPDwgMTIpKTsKKwkJLy9mb3IgKGkgPSBMQVNUX0ZSQU1FOyBpIDw9IEFMVFJFRl9GUkFNRTsgaSsrKSB7CisJCS8qIEhFVkNfTVBSRURfQ1RSTDRbYml0IDEyXSBpcyBmb3IgY20tPnJlZl9mcmFtZV9zaWduX2JpYXNbMF0KKwkJaW5zdGVhZCBvZiBjbS0+cmVmX2ZyYW1lX3NpZ25fYmlhc1tMQVNUX0ZSQU1FXSAqLworCQlmb3IgKGkgPSAwOyBpIDw9IEFMVFJFRl9GUkFNRTsgaSsrKSB7CisJCQlkYXRhMzIgfD0gKChjbS0+cmVmX2ZyYW1lX3NpZ25fYmlhc1tpXSAmIDB4MSkgPDwgKDEyICsgaSkpOworCQl9CisJCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9DVFJMNCwgZGF0YTMyKTsKKwkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJCSJXUklURV9WUkVHKEhFVkNfTVBSRURfQ1RSTDQsIDB4JXgpXG4iLCBkYXRhMzIpOworCX0KKyNpZiAxCisJZGF0YTMyID0gKChjbS0+c2VxX3BhcmFtcy5vcmRlcl9oaW50X2luZm8uZW5hYmxlX29yZGVyX2hpbnQgPDwgMjcpIHwKKwkJKGNtLT5zZXFfcGFyYW1zLm9yZGVyX2hpbnRfaW5mby5vcmRlcl9oaW50X2JpdHNfbWludXNfMSA8PCAyNCkgfAorCQkoY20tPmN1cl9mcmFtZS0+b3JkZXJfaGludCA8PCAxNiApKTsKKyNpZmRlZiBDT19NVl9DT01QUkVTUworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1RCkgeworCQlkYXRhMzIgfD0gKDB4MTAgPDwgOCkgfCAoMHgxMCA8PCAwKTsKKwl9IGVsc2UgeworCQlkYXRhMzIgfD0gKDB4MTMgPDwgOCkgfCAoMHgxMyA8PCAwKTsKKwl9CisjZWxzZQorCQlkYXRhMzIgfD0gKDB4MTMgPDwgOCkgfCAoMHgxMyA8PCAwKTsKKyNlbmRpZgorCisjZWxzZQorCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX01QUkVEX0wwX1JFRjAwX1BPQyk7CisJZGF0YTMyICY9ICh+KDB4ZmYgPDwgMTYpKTsKKwlkYXRhMzIgfD0gKGNtLT5jdXJfZnJhbWUtPm9yZGVyX2hpbnQgJiAweGZmKTsKKwlkYXRhMzIgJj0gKH4oMSA8PCAyNykpOworCWRhdGEzMiB8PSAoY20tPnNlcV9wYXJhbXMub3JkZXJfaGludF9pbmZvLmVuYWJsZV9vcmRlcl9oaW50IDw8IDI3KTsKKyNlbmRpZgorCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMF9SRUYwMF9QT0MsIGRhdGEzMik7CisJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkiV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wwX1JFRjAwX1BPQywgMHgleClcbiIsIGRhdGEzMik7CisKKwlpZiAoaW50ZXJfZmxhZykgeworCQkvKiBjb25maWcgcmVmX2J1ZiBpZCBhbmQgb3JkZXIgaGludCAqLworCQlkYXRhMzIgPSAwOworCQlwb3MgPSAyNTsKKwkJcmVnX2kgPSAwOworCQlmb3IgKGkgPSBBTFRSRUZfRlJBTUU7IGkgPj0gTEFTVF9GUkFNRTsgaS0tKSB7CisJCQkJUElDX0JVRkZFUl9DT05GSUcgKnBpY19jb25maWcgPQorCQkJCQlhdjFfZ2V0X3JlZl9mcmFtZV9zcGVjX2J1ZihjbSwgaSk7CisJCQlpZiAocGljX2NvbmZpZykgeworCQkJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCQkJCSJwaWNfY29uZmlnIGZvciAlZCB0aCByZWY6IGluZGV4ICVkLCByZWdbJWRdIHBvcyAlZFxuIiwKKwkJCQkJaSwgcGljX2NvbmZpZy0+aW5kZXgsIHJlZ19pLCBwb3MpOworCQkJCWRhdGEzMiB8PSAoKHBpY19jb25maWctPmluZGV4IDwgMCk/IDAgOiBwaWNfY29uZmlnLT5pbmRleCkgPDwgcG9zOworCQkJfSBlbHNlCisJCQkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJCQkicGljX2NvbmZpZyBpcyBudWxsIGZvciAlZCB0aCByZWZcbiIsIGkpOworCQkJaWYgKHBvcyA9PSAwKSB7CisJCQkJLy9XUklURV9WUkVHKHJlZl9idWZfcmVnW3JlZ19pXSwgZGF0YTMyKTsKKwkJCQlyZWZfYnVmX3ZhbFtyZWdfaV0gPSBkYXRhMzI7CisJCQkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJCQkicmVmX2J1Zl9yZWdbJWRdLCBXUklURV9WUkVHKDB4JXgsIDB4JXgpXG4iLAorCQkJCXJlZ19pLCByZWZfYnVmX3JlZ1tyZWdfaV0sIGRhdGEzMik7CisJCQkJcmVnX2krKzsKKwkJCQlkYXRhMzIgPSAwOworCQkJCXBvcyA9IDI0OyAvL2ZvciBQX0hFVkNfTVBSRURfTDBfUkVGMDRfUE9DCisJCQl9IGVsc2UgeworCQkJCWlmIChwb3MgPT0gMjQpCisJCQkJcG9zIC09IDg7IC8vZm9yIFBfSEVWQ19NUFJFRF9MMF9SRUYwNF9QT0MKKwkJCQllbHNlCisJCQkJcG9zIC09IDU7IC8vZm9yIFBfSEVWQ19NUFJFRF9MMF9SRUYwM19QT0MKKwkJCX0KKwkJfQorCQlmb3IgKGkgPSBBTFRSRUZfRlJBTUU7IGkgPj0gTEFTVF9GUkFNRTsgaS0tKSB7CisJCQlQSUNfQlVGRkVSX0NPTkZJRyAqcGljX2NvbmZpZyA9CisJCQkJYXYxX2dldF9yZWZfZnJhbWVfc3BlY19idWYoY20sIGkpOworCQkJaWYgKHBpY19jb25maWcpIHsKKwkJCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkJCQkicGljX2NvbmZpZyBmb3IgJWQgdGggcmVmOiBvcmRlcl9oaW50ICVkLCByZWdbJWRdIHBvcyAlZFxuIiwKKwkJCQkJaSwgcGljX2NvbmZpZy0+b3JkZXJfaGludCwgcmVnX2ksIHBvcyk7CisJCQkJZGF0YTMyIHw9ICgocGljX2NvbmZpZy0+aW5kZXggPCAwKT8gMCA6IHBpY19jb25maWctPm9yZGVyX2hpbnQpIDw8IHBvczsKKwkJCX0gZWxzZQorCQkJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCQkJInBpY19jb25maWcgaXMgbnVsbCBmb3IgJWQgdGggcmVmXG4iLCBpKTsKKwkJCWlmIChwb3MgPT0gMCkgeworCQkJCS8vV1JJVEVfVlJFRyhyZWZfYnVmX3JlZ1tyZWdfaV0sIGRhdGEzMik7CisJCQkJcmVmX2J1Zl92YWxbcmVnX2ldID0gZGF0YTMyOworCQkJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCQkJInJlZl9idWZfcmVnWyVkXSwgV1JJVEVfVlJFRygweCV4LCAweCV4KVxuIiwKKwkJCQlyZWdfaSwgcmVmX2J1Zl9yZWdbcmVnX2ldLCBkYXRhMzIpOworCQkJCXJlZ19pKys7CisJCQkJZGF0YTMyID0gMDsKKwkJCQlwb3MgPSAyNDsKKwkJCX0gZWxzZQorCQkJCXBvcyAtPSA4OworCQl9CisJCWlmIChwb3MgIT0gMjQpIHsKKwkJCS8vV1JJVEVfVlJFRyhyZWZfYnVmX3JlZ1tyZWdfaV0sIGRhdGEzMik7CisJCQlyZWZfYnVmX3ZhbFtyZWdfaV0gPSBkYXRhMzI7CisJCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkJCSJyZWZfYnVmX3JlZ1slZF0sIFdSSVRFX1ZSRUcoMHgleCwgMHgleClcbiIsCisJCQlyZWdfaSwgcmVmX2J1Zl9yZWdbcmVnX2ldLCBkYXRhMzIpOworCQl9CisJCS8qIGNvbmZpZyByZWZfb2Zmc2V0ICovCisJCWRhdGEzMiA9IDA7CisJCXBvcyA9IDI0OworCQltdl9jYWxfdHBsX2NvdW50ID0gMDsKKwkJcmVnX2kgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgY20tPm12X3JlZl9pZF9pbmRleDsgaSsrKSB7CisJCQlpZiAoY20tPm12X2NhbF90cGxfbXZzW2ldKSB7CisJCQkJbXZfcmVmX2lkW212X2NhbF90cGxfY291bnRdID0gY20tPm12X3JlZl9pZFtpXTsKKwkJCQltdl9jYWxfdHBsX2NvdW50Kys7CisJCQkJZm9yIChqID0gTEFTVF9GUkFNRTsgaiA8PSBBTFRSRUZfRlJBTUU7IGorKykgeworCQkJCQkvKm9mZnNldCBjYW4gYmUgbmVnYXRpdmUqLworCQkJCQl1bnNpZ25lZCBjaGFyIG9mZnZhbCA9CisJCQkJCQljbS0+bXZfcmVmX29mZnNldFtpXVtqXSAmIDB4ZmY7CisJCQkJCWRhdGEzMiB8PSAob2ZmdmFsIDw8IHBvcyk7CisJCQkJCWlmIChwb3MgPT0gMCkgeworCQkJCQkJLy9XUklURV9WUkVHKHJlZl9vZmZzZXRfcmVnW3JlZ19pXSwgZGF0YTMyKTsKKwkJCQkJCXJlZl9vZmZzZXRfdmFsW3JlZ19pXSA9IGRhdGEzMjsKKwkJCQkJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCQkJCQkicmVmX29mZnNldF9yZWdbJWRdLCBXUklURV9WUkVHKDB4JXgsIDB4JXgpXG4iLAorCQkJCQkJcmVnX2ksIHJlZl9vZmZzZXRfcmVnW3JlZ19pXSwgZGF0YTMyKTsKKwkJCQkJCXJlZ19pKys7CisJCQkJCQlkYXRhMzIgPSAwOworCQkJCQkJcG9zID0gMjQ7CisJCQkJCX0gZWxzZQorCQkJCQkJcG9zIC09IDg7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChwb3MgIT0gMjQpIHsKKwkJLy9XUklURV9WUkVHKHJlZl9vZmZzZXRfcmVnW3JlZ19pXSwgZGF0YTMyKTsKKwkJcmVmX29mZnNldF92YWxbcmVnX2ldID0gZGF0YTMyOworCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkicmVmX29mZnNldF9yZWdbJWRdLCBXUklURV9WUkVHKDB4JXgsIDB4JXgpXG4iLAorCQlyZWdfaSwgcmVmX29mZnNldF9yZWdbcmVnX2ldLCBkYXRhMzIpOworCQl9CisKKwkJZGF0YTMyID0gcmVmX29mZnNldF92YWxbNV0gfCAvL1JFQURfVlJFRyhIRVZDX01QUkVEX0wwX1JFRjExX1BPQykgfAorCQkJbXZfY2FsX3RwbF9jb3VudCB8IChtdl9yZWZfaWRbMF0gPDwgMikgfAorCQkJKG12X3JlZl9pZFsxXSA8PCA1KSB8IChtdl9yZWZfaWRbMl0gPDwgOCk7CisJCXJlZl9vZmZzZXRfdmFsWzVdID0gZGF0YTMyOworCQkvL1dSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMF9SRUYxMV9QT0MsIGRhdGEzMik7CisJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCQkiV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wwX1JFRjExX1BPQyAweCV4LCAweCV4KVxuIiwKKwkJCUhFVkNfTVBSRURfTDBfUkVGMTFfUE9DLCBkYXRhMzIpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQlXUklURV9WUkVHKHJlZl9idWZfcmVnW2ldLCByZWZfYnVmX3ZhbFtpXSk7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJV1JJVEVfVlJFRyhyZWZfb2Zmc2V0X3JlZ1tpXSwgcmVmX29mZnNldF92YWxbaV0pOworCisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX01WX1dSX1NUQVJUX0FERFIsCisJCWN1cl9waWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfV1BUUiwKKwkJY3VyX3BpY19jb25maWctPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIpOworCisJaWYgKGludGVyX2ZsYWcpIHsKKwkJZm9yIChpID0gMDsgaSA8IG12X2NhbF90cGxfY291bnQ7IGkrKykgeworCQkJUElDX0JVRkZFUl9DT05GSUcgKnBpY19jb25maWcgPQorCQkJYXYxX2dldF9yZWZfZnJhbWVfc3BlY19idWYoY20sIG12X3JlZl9pZFtpXSk7CisJCQlpZiAocGljX2NvbmZpZyA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGkgPT0gMCkgeworCQkJCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9NVl9SRF9TVEFSVF9BRERSLAorCQkJCQlwaWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyKTsKKwkJCQlXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfUlBUUiwKKwkJCQkJcGljX2NvbmZpZy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkcik7CisJCQl9IGVsc2UgaWYgKGkgPT0gMSkgeworCQkJCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMF9SRUYwMV9QT0MsCisJCQkJCXBpY19jb25maWctPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIpOworCQkJCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9NVl9SUFRSXzEsCisJCQkJCXBpY19jb25maWctPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIpOworCQkJfSBlbHNlIGlmIChpID09IDIpIHsKKwkJCQlXUklURV9WUkVHKEhFVkNfTVBSRURfTDBfUkVGMDJfUE9DLAorCQkJCQlwaWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyKTsKKwkJCQlXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfUlBUUl8yLAorCQkJCQlwaWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyKTsKKwkJCX0gZWxzZSB7CisJCQkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJCQkJIiVzOiBtdl9yZWZfaWQgZXJyb3JcbiIsIF9fZnVuY19fKTsKKwkJCX0KKwkJfQorCX0KKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19NUFJFRF9DVFJMMCk7CisJZGF0YTMyICY9IH4oKDEgPDwgMTApIHwgKDEgPDwgMTEpKTsKKwlkYXRhMzIgfD0gKDEgPDwgMTApOyAvKndyaXRlIGVuYWJsZSovCisJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJImN1cnJlbnRfZnJhbWUuZnJhbWVfdHlwZT0lZCwgY3VyX2ZyYW1lLT5mcmFtZV90eXBlPSVkLCBhbGxvd19yZWZfZnJhbWVfbXZzPSVkXG4iLAorCQljbS0+Y3VycmVudF9mcmFtZS5mcmFtZV90eXBlLCBjbS0+Y3VyX2ZyYW1lLT5mcmFtZV90eXBlLAorCQljbS0+YWxsb3dfcmVmX2ZyYW1lX212cyk7CisKKwlpZiAoYXYxX2ZyYW1lX2lzX2ludGVyKCZody0+Y29tbW9uKSkgeworCQlpZiAoY20tPmFsbG93X3JlZl9mcmFtZV9tdnMpIHsKKwkJCWRhdGEzMiB8PSAoMSA8PCAxMSk7IC8qcmVhZCBlbmFibGUqLworCQl9CisJfQorCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCSJXUklURV9WUkVHKEhFVkNfTVBSRURfQ1RSTDAgMHgleCwgMHgleClcbiIsCisJCUhFVkNfTVBSRURfQ1RSTDAsIGRhdGEzMik7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0NUUkwwLCBkYXRhMzIpOworCS8qCisJcHJpbnRrKCJjb25maWdfbXByZWQ6ICgleCkgd3Jfc3RhcnRfYWRkciAgJXggZnJvbSBpbmR4ICVkOworCQkoJXgpIHJkX3N0YXJ0X2FkZHIgJXggZnJvbSBpbmRleCAlZFxuIiwKKwkJY3VyX3BpY19jb25maWcsICBjdXJfcGljX2NvbmZpZy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkciwgIGN1cl9waWNfY29uZmlnLT5pbmRleCwKKwlsYXN0X2ZyYW1lX3BpY19jb25maWcsICBsYXN0X2ZyYW1lX3BpY19jb25maWctPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIsICBsYXN0X2ZyYW1lX3BpY19jb25maWctPmluZGV4KTsKKwlkYXRhMzIgPSAoKHBiaS0+bGN1X3hfbnVtIC0gcGJpLT50aWxlX3dpZHRoX2xjdSkqTVZfTUVNX1VOSVQpOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9NVl9XUl9ST1dfSlVNUCxkYXRhMzIpOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9NVl9SRF9ST1dfSlVNUCxkYXRhMzIpOworCisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX01WX1JEX0VORF9BRERSLCBtcHJlZF9tdl9yZF9lbmRfYWRkcik7CisJKi8KK30KKworc3RhdGljIHZvaWQgY29uZmlnX3Nhb19odyhzdHJ1Y3QgQVYxSFdfcyAqaHcsIHVuaW9uIHBhcmFtX3UgKnBhcmFtcykKK3sKKwkvKgorCSEhISEhISEhISEhISEhISEhISEhISEhISFUT0RPIC4uLi4gISEhISEhISEhISEKKwltZW1fbWFwX21vZGUsIGVuZGlhbiwgZ2V0X2RvdWJsZV93cml0ZV9tb2RlCisJKi8KKwlBVjFfQ09NTU9OICpjbSA9ICZody0+Y29tbW9uOworICAgIFBJQ19CVUZGRVJfQ09ORklHKiBwaWNfY29uZmlnID0gJmNtLT5jdXJfZnJhbWUtPmJ1ZjsKKyAgICB1aW50MzJfdCBkYXRhMzI7CisgICAgaW50MzJfdCBsY3Vfc2l6ZSA9CisJCSgocGFyYW1zLT5wLnNlcV9mbGFncyA+PiA2KSAmIDB4MSkgPyAxMjggOiA2NDsKKyAgICBpbnQzMl90IG1jX2J1ZmZlcl9zaXplX3VfdiA9CisJCXBpY19jb25maWctPmxjdV90b3RhbCpsY3Vfc2l6ZSpsY3Vfc2l6ZS8yOworICAgIGludDMyX3QgbWNfYnVmZmVyX3NpemVfdV92X2ggPQorCQkobWNfYnVmZmVyX3NpemVfdV92ICsgMHhmZmZmKT4+MTY7IC8vNjRrIGFsaWdubWVudAorCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqIHY0bDJfY3R4ID0gaHctPnY0bDJfY3R4OworCisgICAgYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJIlt0ZXN0LmNdICMjIyMgY29uZmlnX3Nhb19odyAjIyMjLCBsY3Vfc2l6ZSAlZFxuIiwgbGN1X3NpemUpOworICAgIGF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCSJbY29uZmlnX3Nhb19od10gbGN1X3RvdGFsIDogJWRcbiIsIHBpY19jb25maWctPmxjdV90b3RhbCk7CisgICAgYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJIltjb25maWdfc2FvX2h3XSBtY195X2FkciA6IDB4JXhcbiIsIHBpY19jb25maWctPm1jX3lfYWRyKTsKKyAgICBhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkiW2NvbmZpZ19zYW9faHddIG1jX3Vfdl9hZHIgOiAweCV4XG4iLCBwaWNfY29uZmlnLT5tY191X3ZfYWRyKTsKKyAgICBhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkiW2NvbmZpZ19zYW9faHddIGhlYWRlcl9hZHIgOiAweCV4XG4iLCBwaWNfY29uZmlnLT5oZWFkZXJfYWRyKTsKKyNpZmRlZiBBT01fQVYxX01NVV9EVworICAgIGlmIChody0+ZHdfbW11X2VuYWJsZSkKKwkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJIltjb25maWdfc2FvX2h3XSBoZWFkZXJfZHdfYWRyIDogMHgleFxuIiwgcGljX2NvbmZpZy0+aGVhZGVyX2R3X2Fkcik7CisjZW5kaWYKKyAgICBkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDkpIHwgKDEgPDwgMSk7CisgICAgV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMOSwgZGF0YTMyKTsKKworICAgIGRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMNSk7CisgICAgZGF0YTMyIHw9ICgweDEgPDwgMTQpOyAvKiBhdjEgbW9kZSAqLworICAgIGRhdGEzMiB8PSAoMHhmZiA8PCAxNik7IC8qIGR3IHt2MSx2MCxoMSxoMH0gY3RybF95X2NidXMgKi8KKyAgICBXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw1LCBkYXRhMzIpOworCisgICAgV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMMCwKKwkJbGN1X3NpemUgPT0gMTI4ID8gMHg3IDogMHg2KTsgLypsY3Vfc2l6ZV9sb2cyKi8KKyNpZmRlZiBMT1NMRVNTX0NPTVBSRVNTX01PREUKKyAgICBXUklURV9WUkVHKEhFVkNfQ01fQk9EWV9TVEFSVF9BRERSLCBwaWNfY29uZmlnLT5tY195X2Fkcik7CisjaWZkZWYgQU9NX0FWMV9NTVUKKyAgICBXUklURV9WUkVHKEhFVkNfQ01fSEVBREVSX1NUQVJUX0FERFIsIHBpY19jb25maWctPmhlYWRlcl9hZHIpOworI2VuZGlmCisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKyAgICBpZiAoaHctPmR3X21tdV9lbmFibGUpCisJCVdSSVRFX1ZSRUcoSEVWQ19DTV9IRUFERVJfU1RBUlRfQUREUjIsIHBpY19jb25maWctPmhlYWRlcl9kd19hZHIpOworI2VuZGlmCisjZWxzZQorLyohTE9TTEVTU19DT01QUkVTU19NT0RFKi8KKyAgICBXUklURV9WUkVHKEhFVkNfU0FPX1lfU1RBUlRfQUREUiwgcGljX2NvbmZpZy0+bWNfeV9hZHIpOworI2VuZGlmCisKKyAgICBhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkiW2NvbmZpZ19zYW9faHddIHNhb19ib2R5X2FkZHI6JXhcbiIsIHBpY19jb25maWctPm1jX3lfYWRyKTsKKwkvL3ByaW50aygiW2NvbmZpZ19zYW9faHddIHNhb19oZWFkZXJfYWRkcjoleFxuIiwgcGljX2NvbmZpZy0+bWNfeV9hZHIgKyBsb3NsZXNzX2NvbXBfYm9keV9zaXplICk7CisKKyNpZmRlZiBWUFVfRklMTUdSQUlOX0RVTVAKKwkvLyBMZXQgTWljcm9jb2RlIHRvIGluY3JlYXNlCisJLy8gV1JJVEVfVlJFRyhIRVZDX0ZHU19UQUJMRV9TVEFSVCwgcGljX2NvbmZpZy0+ZmdzX3RhYmxlX2Fkcik7CisjZWxzZQorICAgIFdSSVRFX1ZSRUcoSEVWQ19GR1NfVEFCTEVfU1RBUlQsIHBpY19jb25maWctPmZnc190YWJsZV9hZHIpOworI2VuZGlmCisgICAgV1JJVEVfVlJFRyhIRVZDX0ZHU19UQUJMRV9MRU5HVEgsIEZHU19UQUJMRV9TSVpFICogOCk7CisgICAgYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJIltjb25maWdfc2FvX2h3XSBmZ3NfdGFibGUgYWRyOjB4JXggLCBsZW5ndGggMHgleCBiaXRzXG4iLAorCQlwaWNfY29uZmlnLT5mZ3NfdGFibGVfYWRyLCBGR1NfVEFCTEVfU0laRSAqIDgpOworCisgICAgZGF0YTMyID0gKG1jX2J1ZmZlcl9zaXplX3Vfdl9oPDwxNik8PDE7CisJLy9wcmludGsoImRhdGEzMiA9ICV4LCBtY19idWZmZXJfc2l6ZV91X3ZfaCA9ICV4LCBsY3VfdG90YWwgPSAleFxuIiwgZGF0YTMyLCBtY19idWZmZXJfc2l6ZV91X3ZfaCwgcGljX2NvbmZpZy0+bGN1X3RvdGFsKTsKKyAgICBXUklURV9WUkVHKEhFVkNfU0FPX1lfTEVOR1RIICxkYXRhMzIpOworCisjaWZuZGVmIExPU0xFU1NfQ09NUFJFU1NfTU9ERQorICAgIFdSSVRFX1ZSRUcoSEVWQ19TQU9fQ19TVEFSVF9BRERSLCBwaWNfY29uZmlnLT5tY191X3ZfYWRyKTsKKyNlbHNlCisjZW5kaWYKKworICAgIGRhdGEzMiA9IChtY19idWZmZXJfc2l6ZV91X3ZfaDw8MTYpOworICAgIFdSSVRFX1ZSRUcoSEVWQ19TQU9fQ19MRU5HVEggICxkYXRhMzIpOworCisjaWZuZGVmIExPU0xFU1NfQ09NUFJFU1NfTU9ERQorCS8qIG11bHRpIHRpbGUgdG8gZG8uLi4gKi8KKyAgICBXUklURV9WUkVHKEhFVkNfU0FPX1lfV1BUUiwgcGljX2NvbmZpZy0+bWNfeV9hZHIpOworCisgICAgV1JJVEVfVlJFRyhIRVZDX1NBT19DX1dQVFIsIHBpY19jb25maWctPm1jX3Vfdl9hZHIpOworI2Vsc2UKKyAgICBpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSAmJgorCQkoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSAmIDB4MjApID09IDApIHsKKwkgICAgV1JJVEVfVlJFRyhIRVZDX1NBT19ZX1NUQVJUX0FERFIsIHBpY19jb25maWctPmR3X3lfYWRyKTsKKwkgICAgV1JJVEVfVlJFRyhIRVZDX1NBT19DX1NUQVJUX0FERFIsIHBpY19jb25maWctPmR3X3Vfdl9hZHIpOworCSAgICBXUklURV9WUkVHKEhFVkNfU0FPX1lfV1BUUiwgcGljX2NvbmZpZy0+ZHdfeV9hZHIpOworCSAgICBXUklURV9WUkVHKEhFVkNfU0FPX0NfV1BUUiwgcGljX2NvbmZpZy0+ZHdfdV92X2Fkcik7CisJfSBlbHNlIHsKKwkJLy9XUklURV9WUkVHKEhFVkNfU0FPX1lfU1RBUlRfQUREUiwgMHhmZmZmZmZmZik7CisJCS8vV1JJVEVfVlJFRyhIRVZDX1NBT19DX1NUQVJUX0FERFIsIDB4ZmZmZmZmZmYpOworCX0KKyNlbmRpZgorCisKKyNpZm5kZWYgQU9NX0FWMV9OVjIxCisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKyAgICBpZiAoaHctPmR3X21tdV9lbmFibGUpIHsKKwl9CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgQU9NX0FWMV9OVjIxCisjaWZkZWYgRE9TX1BST0pFQ1QKKyAgICBkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDEpOworICAgIGRhdGEzMiAmPSAofjB4MzAwMCk7CisgICAgZGF0YTMyIHw9IChody0+bWVtX21hcF9tb2RlIDw8IDEyKTsgLy8gWzEzOjEyXSBheGlfYWZvcm1hdCwgMC1MaW5lYXIsIDEtMzJ4MzIsIDItNjR4MzIKKyAgICBkYXRhMzIgJj0gKH4weDMpOworICAgIGRhdGEzMiB8PSAweDE7IC8vIFsxXTpkd19kaXNhYmxlIFswXTpjbV9kaXNhYmxlCisgICAgV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMMSwgZGF0YTMyKTsKKworICAgIGRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMNSk7IC8vIFsyMzoyMl0gZHdfdjFfY3RybCBbMjE6MjBdIGR3X3YwX2N0cmwgWzE5OjE4XSBkd19oMV9jdHJsIFsxNzoxNl0gZHdfaDBfY3RybAorICAgIGRhdGEzMiAmPSB+KDB4ZmYgPDwgMTYpOwkJCSAgIC8vIHNldCB0aGVtIGFsbCAwIGZvciBBT01fQVYxX05WMjEgKG5vIGRvd24tc2NhbGUpCisgICAgV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMNSwgZGF0YTMyKTsKKworICAgIGRhdGEzMiA9IFJFQURfVlJFRyhIRVZDRF9JUFBfQVhJSUZfQ09ORklHKTsKKyAgICBkYXRhMzIgJj0gKH4weDMwKTsKKyAgICBkYXRhMzIgfD0gKGh3LT5tZW1fbWFwX21vZGUgPDwgNCk7IC8vIFs1OjRdCS0tIGFkZHJlc3NfZm9ybWF0IDAwOmxpbmVhciAwMTozMngzMiAxMDo2NHgzMgorICAgIFdSSVRFX1ZSRUcoSEVWQ0RfSVBQX0FYSUlGX0NPTkZJRywgZGF0YTMyKTsKKyNlbHNlCisvLyBtOGJhYnkgdGVzdDE5MDIKKyAgIGRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMMSk7CisJZGF0YTMyICY9ICh+MHgzMDAwKTsKKwlkYXRhMzIgfD0gKGh3LT5tZW1fbWFwX21vZGUgPDwgMTIpOyAvLyBbMTM6MTJdIGF4aV9hZm9ybWF0LCAwLUxpbmVhciwgMS0zMngzMiwgMi02NHgzMgorICAgIGRhdGEzMiAmPSAofjB4ZmYwKTsKKwkvL2RhdGEzMiB8PSAweDY3MDsgIC8vIEJpZy1FbmRpYW4gcGVyIDY0LWJpdAorICAgIGRhdGEzMiB8PSAweDg4MDsgIC8vIEJpZy1FbmRpYW4gcGVyIDY0LWJpdAorICAgIGRhdGEzMiAmPSAofjB4Myk7CisgICAgZGF0YTMyIHw9IDB4MTsgLy8gWzFdOmR3X2Rpc2FibGUgWzBdOmNtX2Rpc2FibGUKKyAgICBXUklURV9WUkVHKEhFVkNfU0FPX0NUUkwxLCBkYXRhMzIpOworCisgICAgZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkw1KTsgLy8gWzIzOjIyXSBkd192MV9jdHJsIFsyMToyMF0gZHdfdjBfY3RybCBbMTk6MThdIGR3X2gxX2N0cmwgWzE3OjE2XSBkd19oMF9jdHJsCisgICAgZGF0YTMyICY9IH4oMHhmZiA8PCAxNik7CQkJICAgLy8gc2V0IHRoZW0gYWxsIDAgZm9yIEFPTV9BVjFfTlYyMSAobm8gZG93bi1zY2FsZSkKKyAgICBXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw1LCBkYXRhMzIpOworCisgICAgZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNEX0lQUF9BWElJRl9DT05GSUcpOworCWRhdGEzMiAmPSAofjB4MzApOworCWRhdGEzMiB8PSAoaHctPm1lbV9tYXBfbW9kZSA8PCA0KTsgLy8gWzU6NF0JLS0gYWRkcmVzc19mb3JtYXQgMDA6bGluZWFyIDAxOjMyeDMyIDEwOjY0eDMyCisJZGF0YTMyICY9ICh+MHhGKTsKKyAgICBkYXRhMzIgfD0gMHg4OwkvLyBCaWctRW5kaWFuIHBlciA2NC1iaXQKKyAgICBXUklURV9WUkVHKEhFVkNEX0lQUF9BWElJRl9DT05GSUcsIGRhdGEzMik7CisjZW5kaWYKKyNlbHNlCisvKkNIQU5HRV9ET05FIG5ubiovCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkwxKTsKKwlkYXRhMzIgJj0gKH4weDMwMDApOworCWRhdGEzMiB8PSAoaHctPm1lbV9tYXBfbW9kZSA8PCAxMik7IC8qIFsxMzoxMl0gYXhpX2Fmb3JtYXQsIDAtTGluZWFyLCAxLTMyeDMyLCAyLTY0eDMyICovCisJZGF0YTMyICY9ICh+MHhmZjApOworCS8qIGRhdGEzMiB8PSAweDY3MDsgIC8vIEJpZy1FbmRpYW4gcGVyIDY0LWJpdCAqLworI2lmZGVmIEFPTV9BVjFfTU1VX0RXCisJaWYgKGh3LT5kd19tbXVfZW5hYmxlID09IDApCisJCWRhdGEzMiB8PSAoKGh3LT5lbmRpYW4gPj4gOCkgJiAweGZmZik7CS8qIEJpZy1FbmRpYW4gcGVyIDY0LWJpdCAqLworI2Vsc2UKKwlkYXRhMzIgfD0gKChody0+ZW5kaWFuID4+IDgpICYgMHhmZmYpOwkvKiBCaWctRW5kaWFuIHBlciA2NC1iaXQgKi8KKyNlbmRpZgorCWRhdGEzMiAmPSAofjB4Myk7IC8qWzFdOmR3X2Rpc2FibGUgWzBdOmNtX2Rpc2FibGUqLworCWlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpID09IDApCisJCWRhdGEzMiB8PSAweDI7IC8qZGlzYWJsZSBkb3VibGUgd3JpdGUqLworCWVsc2UgaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShodykgJiAweDEwKQorCQlkYXRhMzIgfD0gMHgxOyAvKmRpc2FibGUgY20qLworCSBpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKSB7IC8qID49IEcxMkEgZHcgd3JpdGUgY29udHJvbCAqLworCQl1bnNpZ25lZCBpbnQgZGF0YTsKKwkJZGF0YSA9IFJFQURfVlJFRyhIRVZDX0RCTEtfQ0ZHQik7CisJCWRhdGEgJj0gKH4weDMwMCk7IC8qWzhdOmZpcnN0IHdyaXRlIGVuYWJsZSAoY29tcHJlc3MpICBbOV06ZG91YmxlIHdyaXRlIGVuYWJsZSAodW5jb21wcmVzcykqLworCQlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSA9PSAwKQorCQkJZGF0YSB8PSAoMHgxIDw8IDgpOyAvKmVuYWJsZSBmaXJzdCB3cml0ZSovCisJCWVsc2UgaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShodykgJiAweDEwKQorCQkJZGF0YSB8PSAoMHgxIDw8IDkpOyAvKmRvdWJsZSB3cml0ZSBvbmx5Ki8KKwkJZWxzZQorCQkJZGF0YSB8PSAoKDB4MSA8PCA4KSAgfCgweDEgPDwgOSkpOworCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkdCLCBkYXRhKTsKKwl9CisKKwkvKiBzd2FwIHV2ICovCisJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQlpZiAoKHY0bDJfY3R4LT5xX2RhdGFbQU1MX1FfREFUQV9EU1RdLmZtdC0+Zm91cmNjID09IFY0TDJfUElYX0ZNVF9OVjIxKSB8fAorCQkJKHY0bDJfY3R4LT5xX2RhdGFbQU1MX1FfREFUQV9EU1RdLmZtdC0+Zm91cmNjID09IFY0TDJfUElYX0ZNVF9OVjIxTSkpCisJCQlkYXRhMzIgJj0gfigxIDw8IDgpOyAvKiBOVjIxICovCisJCWVsc2UKKwkJCWRhdGEzMiB8PSAoMSA8PCA4KTsgLyogTlYxMiAqLworCX0KKwlkYXRhMzIgJj0gKH4oMyA8PCAxNCkpOworCWRhdGEzMiB8PSAoMiA8PCAxNCk7CisJLyoKKwkqICBbMzE6MjRdIGFyX2ZpZm8xX2F4aV90aHJlZAorCSogIFsyMzoxNl0gYXJfZmlmbzBfYXhpX3RocmVkCisJKiAgWzE1OjE0XSBheGlfbGluZWFsaWduLCAwLTE2Ynl0ZXMsIDEtMzJieXRlcywgMi02NGJ5dGVzCisJKiAgWzEzOjEyXSBheGlfYWZvcm1hdCwgMC1MaW5lYXIsIDEtMzJ4MzIsIDItNjR4MzIKKwkqICBbMTE6MDhdIGF4aV9sZW5kaWFuX0MKKwkqICBbMDc6MDRdIGF4aV9sZW5kaWFuX1kKKwkqICBbM10gICAgIHJlc2VydmVkCisJKiAgWzJdICAgICBjbGtfZm9yY2VvbgorCSogIFsxXSAgICAgZHdfZGlzYWJsZTpkaXNhYmxlIGRvdWJsZSB3cml0ZSBvdXRwdXQKKwkqICBbMF0gICAgIGNtX2Rpc2FibGU6ZGlzYWJsZSBjb21wcmVzcyBvdXRwdXQKKwkqLworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDEsIGRhdGEzMik7CisKKwlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSAmIDB4MTApIHsKKwkJLyogWzIzOjIyXSBkd192MV9jdHJsCisJCSAqWzIxOjIwXSBkd192MF9jdHJsCisJCSAqWzE5OjE4XSBkd19oMV9jdHJsCisJCSAqWzE3OjE2XSBkd19oMF9jdHJsCisJCSAqLworCQlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDUpOworCQkvKnNldCB0aGVtIGFsbCAwIGZvciBIMjY1X05WMjEgKG5vIGRvd24tc2NhbGUpKi8KKwkJZGF0YTMyICY9IH4oMHhmZiA8PCAxNik7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDUsIGRhdGEzMik7CisJfSBlbHNlIHsKKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDcpCisJCQlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkwyNiwgMCk7CisJCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMNSk7CisJCWRhdGEzMiAmPSAofigweGZmIDw8IDE2KSk7CisJCWlmICgoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSAmIDB4ZikgPT0gOCkgeworCQkJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMMjYsIDB4Zik7CisJCQlkYXRhMzIgfD0gKDB4ZmYgPDwgMTYpOworCQl9IGVsc2UgaWYgKChnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpICYgMHhmKSA9PSAyIHx8CisJCQkoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSAmIDB4ZikgPT0gMykKKwkJCWRhdGEzMiB8PSAoMHhmZjw8MTYpOworCQllbHNlIGlmICgoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSAmIDB4ZikgPT0gNCB8fAorCQkJKGdldF9kb3VibGVfd3JpdGVfbW9kZShodykgJiAweGYpID09IDUpCisJCQlkYXRhMzIgfD0gKDB4MzM8PDE2KTsKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMNSwgZGF0YTMyKTsKKwl9CisKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ0RfSVBQX0FYSUlGX0NPTkZJRyk7CisJZGF0YTMyICY9ICh+MHgzMCk7CisJLyogWzU6NF0JLS0gYWRkcmVzc19mb3JtYXQgMDA6bGluZWFyIDAxOjMyeDMyIDEwOjY0eDMyICovCisJZGF0YTMyIHw9IChody0+bWVtX21hcF9tb2RlIDw8IDQpOworCWRhdGEzMiAmPSAofjB4Zik7CisJZGF0YTMyIHw9IChody0+ZW5kaWFuICYgMHhmKTsgIC8qIHZhbGlkIG9ubHkgd2hlbiBkb3VibGUgd3JpdGUgb25seSAqLworCisJLyogc3dhcCB1diAqLworCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJaWYgKCh2NGwyX2N0eC0+cV9kYXRhW0FNTF9RX0RBVEFfRFNUXS5mbXQtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfTlYyMSkgfHwKKwkJCSh2NGwyX2N0eC0+cV9kYXRhW0FNTF9RX0RBVEFfRFNUXS5mbXQtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfTlYyMU0pKQorCQkJZGF0YTMyIHw9ICgxIDw8IDEyKTsgLyogTlYyMSAqLworCQllbHNlCisJCQlkYXRhMzIgJj0gfigxIDw8IDEyKTsgLyogTlYxMiAqLworCX0KKwlkYXRhMzIgJj0gKH4oMyA8PCA4KSk7CisJZGF0YTMyIHw9ICgyIDw8IDgpOworCS8qCisJKiBbMzowXSAgIGxpdHRsZV9lbmRpYW4KKwkqIFs1OjRdICAgYWRkcmVzc19mb3JtYXQgMDA6bGluZWFyIDAxOjMyeDMyIDEwOjY0eDMyCisJKiBbNzo2XSAgIHJlc2VydmVkCisJKiBbOTo4XSAgIExpbmVhcl9MaW5lQWxpZ25tZW50IDAwOjE2Ynl0ZSAwMTozMmJ5dGUgMTA6NjRieXRlCisJKiBbMTE6MTBdIHJlc2VydmVkCisJKiBbMTJdICAgIENiQ3JfYnl0ZV9zd2FwCisJKiBbMzE6MTNdIHJlc2VydmVkCisJKi8KKwlXUklURV9WUkVHKEhFVkNEX0lQUF9BWElJRl9DT05GSUcsIGRhdGEzMik7CisKKyNlbmRpZgorCit9CisKKworI2lmZGVmIEFPTV9BVjFfREJMS19JTklUCisvKgorICogRGVmaW5lcywgZGVjbGFyYXRpb25zLCBzdWItZnVuY3Rpb25zIGZvciBhdjEgZGUtYmxvY2sgbG9vcCBmaWx0ZXIgVGhyL0x2bCB0YWJsZSB1cGRhdGUKKyAqIC0gc3RydWN0IHNlZ21lbnRhdGlvbl9sZiBpcyBmb3IgbG9vcCBmaWx0ZXIgb25seSAocmVtb3ZlZCBzb21ldGhpbmcpCisgKiAtIGZ1bmN0aW9uICJhdjFfbG9vcF9maWx0ZXJfaW5pdCIgYW5kICJhdjFfbG9vcF9maWx0ZXJfZnJhbWVfaW5pdCIgd2lsbCBiZSBpbnN0YW50aWF0ZWQgaW4gQ19FbnRyeQorICogLSBhdjFfbG9vcF9maWx0ZXJfaW5pdCBydW4gb25jZSBiZWZvcmUgZGVjb2Rpbmcgc3RhcnQKKyAqIC0gYXYxX2xvb3BfZmlsdGVyX2ZyYW1lX2luaXQgcnVuIGJlZm9yZSBldmVyeSBmcmFtZSBkZWNvZGluZyBzdGFydAorICogLSBzZXQgdmlkZW8gZm9ybWF0IHRvIEFPTV9BVjEgaXMgaW4gYXYxX2xvb3BfZmlsdGVyX2luaXQKKyAqLworI2RlZmluZSBNQVhfTE9PUF9GSUxURVIgNjMKKyNkZWZpbmUgTUFYX01PREVfTEZfREVMVEFTIDIKKyNkZWZpbmUgTUFYX1NFR01FTlRTIDgKKyNkZWZpbmUgTUFYX01CX1BMQU5FIDMKKwordHlwZWRlZiBlbnVtIHsKKyAgU0VHX0xWTF9BTFRfUSwJICAgLy8gVXNlIGFsdGVybmF0ZSBRdWFudGl6ZXIgLi4uLgorICBTRUdfTFZMX0FMVF9MRl9ZX1YsICAvLyBVc2UgYWx0ZXJuYXRlIGxvb3AgZmlsdGVyIHZhbHVlIG9uIHkgcGxhbmUgdmVydGljYWwKKyAgU0VHX0xWTF9BTFRfTEZfWV9ILCAgLy8gVXNlIGFsdGVybmF0ZSBsb29wIGZpbHRlciB2YWx1ZSBvbiB5IHBsYW5lIGhvcml6b250YWwKKyAgU0VHX0xWTF9BTFRfTEZfVSwJLy8gVXNlIGFsdGVybmF0ZSBsb29wIGZpbHRlciB2YWx1ZSBvbiB1IHBsYW5lCisgIFNFR19MVkxfQUxUX0xGX1YsCS8vIFVzZSBhbHRlcm5hdGUgbG9vcCBmaWx0ZXIgdmFsdWUgb24gdiBwbGFuZQorICBTRUdfTFZMX1JFRl9GUkFNRSwgICAvLyBPcHRpb25hbCBTZWdtZW50IHJlZmVyZW5jZSBmcmFtZQorICBTRUdfTFZMX1NLSVAsCQkvLyBPcHRpb25hbCBTZWdtZW50ICgwLDApICsgc2tpcCBtb2RlCisgIFNFR19MVkxfR0xPQkFMTVYsCisgIFNFR19MVkxfTUFYCit9IFNFR19MVkxfRkVBVFVSRVM7CisKK3N0YXRpYyBjb25zdCBTRUdfTFZMX0ZFQVRVUkVTIHNlZ19sdmxfbGZfbHV0W01BWF9NQl9QTEFORV1bMl0gPSB7CisgIHsgU0VHX0xWTF9BTFRfTEZfWV9WLCBTRUdfTFZMX0FMVF9MRl9ZX0ggfSwKKyAgeyBTRUdfTFZMX0FMVF9MRl9VLCBTRUdfTFZMX0FMVF9MRl9VIH0sCisgIHsgU0VHX0xWTF9BTFRfTEZfViwgU0VHX0xWTF9BTFRfTEZfViB9Cit9OworCitzdHJ1Y3Qgc2VnbWVudGF0aW9uX2xmIHsgLy8gZm9yIGxvb3BmaWx0ZXIgb25seQorICB1aW50OF90IGVuYWJsZWQ7CisJCSAgLyoKKwkJICAgU0VHX0xWTF9BTFRfTEZfWV9WIGZlYXR1cmVfZW5hYmxlOiBzZWdfbGZfaW5mb195W2JpdDddCisJCSAgIFNFR19MVkxfQUxUX0xGX1lfViBkYXRhOiBzZWdfbGZfaW5mb195W2JpdDB+Nl0KKwkJICAgU0VHX0xWTF9BTFRfTEZfWV9IIGZlYXR1cmUgZW5hYmxlOiBzZWdfbGZfaW5mb195W2JpdDE1XQorCQkgICBTRUdfTFZMX0FMVF9MRl9ZX0ggZGF0YTogc2VnX2xmX2luZm9feVtiaXQ4fjE0XQorCQkgICAqLworICB1aW50MTZfdCBzZWdfbGZfaW5mb195WzhdOworCQkgIC8qCisJCSAgIFNFR19MVkxfQUxUX0xGX1UgZmVhdHVyZV9lbmFibGU6IHNlZ19sZl9pbmZvX2NbYml0N10KKwkJICAgU0VHX0xWTF9BTFRfTEZfVSBkYXRhOiBzZWdfbGZfaW5mb19jW2JpdDB+Nl0KKwkJICAgU0VHX0xWTF9BTFRfTEZfViBmZWF0dXJlIGVuYWJsZTogc2VnX2xmX2luZm9fY1tiaXQxNV0KKwkJICAgU0VHX0xWTF9BTFRfTEZfViBkYXRhOiBzZWdfbGZfaW5mb19jW2JpdDh+MTRdCisJCSAgICovCisgIHVpbnQxNl90IHNlZ19sZl9pbmZvX2NbOF07Cit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQ4X3QgbWJsaW07CisgIHVpbnQ4X3QgbGltOworICB1aW50OF90IGhldl90aHI7Cit9IGxvb3BfZmlsdGVyX3RocmVzaDsKKwordHlwZWRlZiBzdHJ1Y3QgbG9vcF9maWx0ZXJfaW5mb19uX3MgeworICBsb29wX2ZpbHRlcl90aHJlc2ggbGZ0aHJbTUFYX0xPT1BfRklMVEVSICsgMV07CisgIHVpbnQ4X3QgbHZsW01BWF9NQl9QTEFORV1bTUFYX1NFR01FTlRTXVsyXVtSRUZfRlJBTUVTXVtNQVhfTU9ERV9MRl9ERUxUQVNdOworfSBsb29wX2ZpbHRlcl9pbmZvX247CisKK3N0cnVjdCBsb29wZmlsdGVyIHsKKyAgaW50MzJfdCBmaWx0ZXJfbGV2ZWxbMl07CisgIGludDMyX3QgZmlsdGVyX2xldmVsX3U7CisgIGludDMyX3QgZmlsdGVyX2xldmVsX3Y7CisKKyAgaW50MzJfdCBzaGFycG5lc3NfbGV2ZWw7CisKKyAgdWludDhfdCBtb2RlX3JlZl9kZWx0YV9lbmFibGVkOworICB1aW50OF90IG1vZGVfcmVmX2RlbHRhX3VwZGF0ZTsKKworICAvLyAwID0gSW50cmEsIExhc3QsIExhc3QyK0xhc3QzLAorICAvLyBHRiwgQlJGLCBBUkYyLCBBUkYKKyAgaW50OF90IHJlZl9kZWx0YXNbUkVGX0ZSQU1FU107CisKKyAgLy8gMCA9IFpFUk9fTVYsIE1WCisgIGludDhfdCBtb2RlX2RlbHRhc1tNQVhfTU9ERV9MRl9ERUxUQVNdOworCisgIGludDMyX3QgY29tYmluZV92ZXJ0X2hvcnpfbGY7CisKKyAgaW50MzJfdCBsZl9waWNfY250OworCisvLyNpZiBMT09QX0ZJTFRFUl9CSVRNQVNLCisgIC8vTG9vcEZpbHRlck1hc2sgKmxmbTsKKyAgLy9zaXplX3QgbGZtX251bTsKKyAgLy9pbnQgbGZtX3N0cmlkZTsKKyAgLy9McGZTdXBlcmJsb2NrSW5mbyBuZWlnaGJvcl9zYl9scGZfaW5mbzsKKy8vI2VuZGlmICAvLyBMT09QX0ZJTFRFUl9CSVRNQVNLCit9OworI2lmZGVmIERCR19MUEZfREJMS19MVkwKK3N0YXRpYyBpbnQzMl90IG15Y2xhbXAoaW50MzJfdCB2YWx1ZSwgaW50MzJfdCBsb3csIGludDMyX3QgaGlnaCkgeworICByZXR1cm4gdmFsdWUgPCBsb3cgPyBsb3cgOiAodmFsdWUgPiBoaWdoID8gaGlnaCA6IHZhbHVlKTsKK30KKyNlbmRpZgorLypzdGF0aWMgaW50OF90IGV4dGVuZF9zaWduXzdiaXRzKHVpbnQ4X3QgdmFsdWUpIHsKKyAgcmV0dXJuICgoKHZhbHVlPj42KSAmIDB4MSk8PDcpIHwgKHZhbHVlJjB4N2YpOworfSovCisKKy8vIGNvbnZlcnQgZGF0YSB0byBpbnQ4X3QgdmFyaWFibGUKKy8vIHZhbHVlIDogc2lnbmVkIGRhdGEgKHdpdGggYW55IGJpdHdpZHRoPDgpIHdoaWNoIGlzIGFzc2lnbmVkIHRvIHVpbnQ4X3QgdmFyaWFibGUgYXMgYW4gaW5wdXQKKy8vIGJ3ICAgIDogYml0d2lkdGggb2Ygc2lnbmVkIGRhdGEsIChmcm9tIDEgdG8gNykKK3N0YXRpYyBpbnQ4X3QgY29udjJpbnQ4ICh1aW50OF90IHZhbHVlLCB1aW50OF90IGJ3KSB7CisgICAgaWYgKGJ3PDEgfHwgYnc+NykgcmV0dXJuIChpbnQ4X3QpdmFsdWU7CisgICAgZWxzZSB7CisJICAgIGNvbnN0IHVpbnQ4X3QgZGF0YV9iaXRzID0gdmFsdWUgJiAoKDE8PGJ3KS0xKTsKKwkgICAgY29uc3QgdWludDhfdCBzaWduX2JpdCA9ICh2YWx1ZT4+KGJ3LTEpKSAmIDB4MTsKKwkgICAgY29uc3QgdWludDhfdCBzaWduX2JpdF9leHQgPSBzaWduX2JpdCB8IHNpZ25fYml0PDwxIHwgc2lnbl9iaXQ8PDIgfCBzaWduX2JpdDw8MyB8IHNpZ25fYml0PDw0IHwgc2lnbl9iaXQ8PDUgfCBzaWduX2JpdDw8NiB8IHNpZ25fYml0PDw3OworCSAgICByZXR1cm4gKGludDhfdCkoKHNpZ25fYml0X2V4dDw8YncpIHwgZGF0YV9iaXRzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGF2MV91cGRhdGVfc2hhcnBuZXNzKGxvb3BfZmlsdGVyX2luZm9fbiAqbGZpLCBpbnQzMl90IHNoYXJwbmVzc19sdmwpIHsKKyAgaW50MzJfdCBsdmw7CisKKyAgLy8gRm9yIGVhY2ggcG9zc2libGUgdmFsdWUgZm9yIHRoZSBsb29wIGZpbHRlciBmaWxsIG91dCBsaW1pdHMKKyAgZm9yIChsdmwgPSAwOyBsdmwgPD0gTUFYX0xPT1BfRklMVEVSOyBsdmwrKykgeworCS8vIFNldCBsb29wIGZpbHRlciBwYXJhbWV0ZXJzIHRoYXQgY29udHJvbCBzaGFycG5lc3MuCisgICAgaW50MzJfdCBibG9ja19pbnNpZGVfbGltaXQgPQorCQlsdmwgPj4gKChzaGFycG5lc3NfbHZsID4gMCkgKyAoc2hhcnBuZXNzX2x2bCA+IDQpKTsKKworICAgIGlmIChzaGFycG5lc3NfbHZsID4gMCkgeworCSAgaWYgKGJsb2NrX2luc2lkZV9saW1pdCA+ICg5IC0gc2hhcnBuZXNzX2x2bCkpCisJICAgIGJsb2NrX2luc2lkZV9saW1pdCA9ICg5IC0gc2hhcnBuZXNzX2x2bCk7CisJfQorCisgICAgaWYgKGJsb2NrX2luc2lkZV9saW1pdCA8IDEpCisJICBibG9ja19pbnNpZGVfbGltaXQgPSAxOworCisgICAgbGZpLT5sZnRocltsdmxdLmxpbSA9ICh1aW50OF90KWJsb2NrX2luc2lkZV9saW1pdDsKKyAgICBsZmktPmxmdGhyW2x2bF0ubWJsaW0gPSAodWludDhfdCkoMiAqIChsdmwgKyAyKSArIGJsb2NrX2luc2lkZV9saW1pdCk7CisgIH0KK30KKworLy8gaW5zdGFudGlhdGUgdGhpcyBmdW5jdGlvbiBvbmNlIHdoZW4gZGVjb2RlIGlzIHN0YXJ0ZWQKK3ZvaWQgYXYxX2xvb3BfZmlsdGVyX2luaXQobG9vcF9maWx0ZXJfaW5mb19uICpsZmksIHN0cnVjdCBsb29wZmlsdGVyICpsZikgeworCWludDMyX3QgaTsKKwl1aW50MzJfdCBkYXRhMzI7CisKKwkvLyBpbml0IGxpbWl0cyBmb3IgZ2l2ZW4gc2hhcnBuZXNzCisJYXYxX3VwZGF0ZV9zaGFycG5lc3MobGZpLCBsZi0+c2hhcnBuZXNzX2xldmVsKTsKKworCS8vIFdyaXRlIHRvIHJlZ2lzdGVyCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJdWludDMyX3QgdGhyOworCQl0aHIgPSAoKGxmaS0+bGZ0aHJbaSoyKzFdLmxpbSAmIDB4M2YpPDw4KSB8CisJCQkobGZpLT5sZnRocltpKjIrMV0ubWJsaW0gJiAweGZmKTsKKwkJdGhyID0gKHRocjw8MTYpIHwgKChsZmktPmxmdGhyW2kqMl0ubGltICYgMHgzZik8PDgpIHwKKwkJCShsZmktPmxmdGhyW2kqMl0ubWJsaW0gJiAweGZmKTsKKwkJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHOSwgdGhyKTsKKwl9CisJLy8gdmlkZW8gZm9ybWF0IGlzIEFPTV9BVjEKKwlkYXRhMzIgPSAoMHg1NyA8PCA4KSB8ICAvLyAxc3QvMm5kIHdyaXRlIGJvdGggZW5hYmxlCisJCSgweDQgIDw8IDApOyAgIC8vIGFvbV9hdjEgdmlkZW8gZm9ybWF0CisJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHQiwgZGF0YTMyKTsKKwlhdjFfcHJpbnQyKEFPTV9ERUJVR19IV19NT1JFLAorCQkiW0RCTEsgREVCVUddIENGR0IgOiAweCV4XG4iLCBkYXRhMzIpOworfQorCisvLyBwZXJmb3JtIHRoaXMgZnVuY3Rpb24gcGVyIGZyYW1lCit2b2lkIGF2MV9sb29wX2ZpbHRlcl9mcmFtZV9pbml0KEFWMURlY29kZXIqIHBiaSwgc3RydWN0IHNlZ21lbnRhdGlvbl9sZiAqc2VnLAorCWxvb3BfZmlsdGVyX2luZm9fbiAqbGZpLAorCXN0cnVjdCBsb29wZmlsdGVyICpsZiwKKwlpbnQzMl90IHBpY193aWR0aCkgeworCUJ1ZmZJbmZvX3QqIGJ1Zl9zcGVjID0gcGJpLT53b3JrX3NwYWNlX2J1ZjsKKwlpbnQzMl90IGk7CisjaWZkZWYgREJHX0xQRl9EQkxLX0xWTAorCWludDMyX3QgZGlyOworCWludDMyX3QgZmlsdF9sdmxbTUFYX01CX1BMQU5FXSwgZmlsdF9sdmxfcltNQVhfTUJfUExBTkVdOworCWludDMyX3QgcGxhbmU7CisJaW50MzJfdCBzZWdfaWQ7CisjZW5kaWYKKwkvLyBuX3NoaWZ0IGlzIHRoZSBtdWx0aXBsaWVyIGZvciBsZl9kZWx0YXMKKwkvLyB0aGUgbXVsdGlwbGllciBpcyAxIGZvciB3aGVuIGZpbHRlcl9sdmwgaXMgYmV0d2VlbiAwIGFuZCAzMTsKKwkvLyAyIHdoZW4gZmlsdGVyX2x2bCBpcyBiZXR3ZWVuIDMyIGFuZCA2MworCisJLy8gdXBkYXRlIGxpbWl0cyBpZiBzaGFycG5lc3MgaGFzIGNoYW5nZWQKKwlhdjFfdXBkYXRlX3NoYXJwbmVzcyhsZmksIGxmLT5zaGFycG5lc3NfbGV2ZWwpOworCisJLy8gV3JpdGUgdG8gcmVnaXN0ZXIKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQl1aW50MzJfdCB0aHI7CisJCXRociA9ICgobGZpLT5sZnRocltpKjIrMV0ubGltICYgMHgzZik8PDgpCisJCQl8IChsZmktPmxmdGhyW2kqMisxXS5tYmxpbSAmIDB4ZmYpOworCQl0aHIgPSAodGhyPDwxNikgfCAoKGxmaS0+bGZ0aHJbaSoyXS5saW0gJiAweDNmKTw8OCkKKwkJCXwgKGxmaS0+bGZ0aHJbaSoyXS5tYmxpbSAmIDB4ZmYpOworCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkc5LCB0aHIpOworCX0KKyNpZmRlZiBEQkdfTFBGX0RCTEtfTFZMCisJZmlsdF9sdmxbMF0gPSBsZi0+ZmlsdGVyX2xldmVsWzBdOworCWZpbHRfbHZsWzFdID0gbGYtPmZpbHRlcl9sZXZlbF91OworCWZpbHRfbHZsWzJdID0gbGYtPmZpbHRlcl9sZXZlbF92OworCisJZmlsdF9sdmxfclswXSA9IGxmLT5maWx0ZXJfbGV2ZWxbMV07CisJZmlsdF9sdmxfclsxXSA9IGxmLT5maWx0ZXJfbGV2ZWxfdTsKKwlmaWx0X2x2bF9yWzJdID0gbGYtPmZpbHRlcl9sZXZlbF92OworCisjaWZkZWYgREJHX0xQRl9QUklOVAorCXByaW50aygiTEZfUFJJTlQ6IHBpY19jbnQoJWQpIGJhc2VfZmlsdGVyX2xldmVsKCVkLCVkLCVkLCVkKVxuIiwKKwkJbGYtPmxmX3BpY19jbnQsIGxmLT5maWx0ZXJfbGV2ZWxbMF0sCisJCWxmLT5maWx0ZXJfbGV2ZWxbMV0sIGxmLT5maWx0ZXJfbGV2ZWxfdSwgbGYtPmZpbHRlcl9sZXZlbF92KTsKKyNlbmRpZgorCisJZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgMzsgcGxhbmUrKykgeworCQlpZiAocGxhbmUgPT0gMCAmJiAhZmlsdF9sdmxbMF0gJiYgIWZpbHRfbHZsX3JbMF0pCisJCSAgYnJlYWs7CisJCWVsc2UgaWYgKHBsYW5lID09IDEgJiYgIWZpbHRfbHZsWzFdKQorCQkgIGNvbnRpbnVlOworCQllbHNlIGlmIChwbGFuZSA9PSAyICYmICFmaWx0X2x2bFsyXSkKKwkJICBjb250aW51ZTsKKworCQlmb3IgKHNlZ19pZCA9IDA7IHNlZ19pZCA8IE1BWF9TRUdNRU5UUzsgc2VnX2lkKyspIHsgLy8gTUFYX1NFR01FTlRTPT04CisJCQlmb3IgKGRpciA9IDA7IGRpciA8IDI7ICsrZGlyKSB7CisJCQkJaW50MzJfdCBsdmxfc2VnID0gKGRpciA9PSAwKSA/IGZpbHRfbHZsW3BsYW5lXSA6IGZpbHRfbHZsX3JbcGxhbmVdOworCQkJCS8vYXNzZXJ0KHBsYW5lID49IDAgJiYgcGxhbmUgPD0gMik7CisJCQkJY29uc3QgdWludDhfdCBzZWdfbGZfaW5mb195MCA9IHNlZy0+c2VnX2xmX2luZm9feVtzZWdfaWRdICYgMHhmZjsKKwkJCQljb25zdCB1aW50OF90IHNlZ19sZl9pbmZvX3kxID0gKHNlZy0+c2VnX2xmX2luZm9feVtzZWdfaWRdPj44KSAmIDB4ZmY7CisJCQkJY29uc3QgdWludDhfdCBzZWdfbGZfaW5mb191ID0gc2VnLT5zZWdfbGZfaW5mb19jW3NlZ19pZF0gJiAweGZmOworCQkJCWNvbnN0IHVpbnQ4X3Qgc2VnX2xmX2luZm9fdiA9IChzZWctPnNlZ19sZl9pbmZvX2Nbc2VnX2lkXT4+OCkgJiAweGZmOworCQkJCWNvbnN0IHVpbnQ4X3Qgc2VnX2xmX2luZm8gPSAocGxhbmU9PTIpID8gc2VnX2xmX2luZm9fdiA6IChwbGFuZT09MSkgPworCQkJCQlzZWdfbGZfaW5mb191IDogKChkaXI9PTApID8gIHNlZ19sZl9pbmZvX3kwIDogc2VnX2xmX2luZm9feTEpOworCQkJCWNvbnN0IGludDhfdCBzZWdfbGZfYWN0aXZlID0gKChzZWctPmVuYWJsZWQpICYmICgoc2VnX2xmX2luZm8+PjcpICYgMHgxKSk7CisJCQkJY29uc3QgaW50OF90IHNlZ19sZl9kYXRhID0gY29udjJpbnQ4KHNlZ19sZl9pbmZvLDcpOworI2lmZGVmIERCR19MUEZfUFJJTlQKKwkJCQljb25zdCBpbnQ4X3Qgc2VnX2xmX2RhdGFfY2xpcCA9IChzZWdfbGZfZGF0YT42MykgPyA2MyA6CisJCQkJCShzZWdfbGZfZGF0YTwtNjMpID8gLTYzIDogc2VnX2xmX2RhdGE7CisjZW5kaWYKKwkJCQlpZiAoc2VnX2xmX2FjdGl2ZSkgeworCQkJCSAgbHZsX3NlZyA9IG15Y2xhbXAobHZsX3NlZyArIChpbnQzMl90KXNlZ19sZl9kYXRhLCAwLCBNQVhfTE9PUF9GSUxURVIpOworCQkJCX0KKworI2lmZGVmIERCR19MUEZfUFJJTlQKKwkJCQlwcmludGsoIkxGX1BSSU5UOnBsYW5lKCVkKSBzZWdfaWQoJWQpIGRpciglZCkgc2VnX2xmX2luZm8oJWQsMHgleCksbHZsX3NlZygweCV4KVxuIiwKKwkJCQkJcGxhbmUsc2VnX2lkLGRpcixzZWdfbGZfYWN0aXZlLHNlZ19sZl9kYXRhX2NsaXAsbHZsX3NlZyk7CisjZW5kaWYKKworCQkJCWlmICghbGYtPm1vZGVfcmVmX2RlbHRhX2VuYWJsZWQpIHsKKwkJCQkgIC8vIHdlIGNvdWxkIGdldCByaWQgb2YgdGhpcyBpZiB3ZSBhc3N1bWUgdGhhdCBkZWx0YXMgYXJlIHNldCB0bworCQkJCSAgLy8gemVybyB3aGVuIG5vdCBpbiB1c2U7IGVuY29kZXIgYWx3YXlzIHVzZXMgZGVsdGFzCisJCQkJICBtZW1zZXQobGZpLT5sdmxbcGxhbmVdW3NlZ19pZF1bZGlyXSwgbHZsX3NlZywKKwkJCQkJCSBzaXplb2YobGZpLT5sdmxbcGxhbmVdW3NlZ19pZF1bZGlyXSkpOworCQkJCX0gZWxzZSB7CisJCQkJCWludDMyX3QgcmVmLCBtb2RlOworCQkJCQljb25zdCBpbnQzMl90IHNjYWxlID0gMSA8PCAobHZsX3NlZyA+PiA1KTsKKwkJCQkJY29uc3QgaW50MzJfdCBpbnRyYV9sdmwgPSBsdmxfc2VnICsgbGYtPnJlZl9kZWx0YXNbSU5UUkFfRlJBTUVdICogc2NhbGU7CisJCQkJCWxmaS0+bHZsW3BsYW5lXVtzZWdfaWRdW2Rpcl1bSU5UUkFfRlJBTUVdWzBdID0KKwkJCQkJICBteWNsYW1wKGludHJhX2x2bCwgMCwgTUFYX0xPT1BfRklMVEVSKTsKKyNpZmRlZiBEQkdfTFBGX1BSSU5UCisJCQkJCXByaW50aygiTEZfUFJJTlQ6cmVmX2RlbHRhc1tJTlRSQV9GUkFNRV0oJWQpXG4iLGxmLT5yZWZfZGVsdGFzW0lOVFJBX0ZSQU1FXSk7CisjZW5kaWYKKwkJCQkJZm9yIChyZWYgPSBMQVNUX0ZSQU1FOyByZWYgPCBSRUZfRlJBTUVTOyArK3JlZikgewkJIC8vIExBU1RfRlJBTUU9PTEgUkVGX0ZSQU1FUz09OAorCQkJCQkJZm9yIChtb2RlID0gMDsgbW9kZSA8IE1BWF9NT0RFX0xGX0RFTFRBUzsgKyttb2RlKSB7CSAvLyBNQVhfTU9ERV9MRl9ERUxUQVM9PTIKKwkJCQkJCQljb25zdCBpbnQzMl90IGludGVyX2x2bCA9CisJCQkJCQkJCWx2bF9zZWcgKyBsZi0+cmVmX2RlbHRhc1tyZWZdICogc2NhbGUgKworCQkJCQkJCQlsZi0+bW9kZV9kZWx0YXNbbW9kZV0gKiBzY2FsZTsKKwkJCQkJCQlsZmktPmx2bFtwbGFuZV1bc2VnX2lkXVtkaXJdW3JlZl1bbW9kZV0gPQorCQkJCQkJCQlteWNsYW1wKGludGVyX2x2bCwgMCwgTUFYX0xPT1BfRklMVEVSKTsKKyNpZmRlZiBEQkdfTFBGX1BSSU5UCisJCQkJCQkJcHJpbnRrKCJMRl9QUklOVDpyZWZfZGVsdGFzKCVkKSBtb2RlX2RlbHRhcyglZClcbiIsCisJCQkJCQkJbGYtPnJlZl9kZWx0YXNbcmVmXSwgbGYtPm1vZGVfZGVsdGFzW21vZGVdKTsKKyNlbmRpZgorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisjaWZkZWYgREJHX0xQRl9QUklOVAorCWZvciAoaSA9IDA7IGkgPD0gTUFYX0xPT1BfRklMVEVSOyBpKyspIHsKKwkJcHJpbnRrKCJMRl9QUklOVDooJTJkKSB0aHI9JWQsYmxpbT0lM2QsbGltPSUyZFxuIiwKKwkJCWksIGxmaS0+bGZ0aHJbaV0uaGV2X3RociwKKwkJCWxmaS0+bGZ0aHJbaV0ubWJsaW0sIGxmaS0+bGZ0aHJbaV0ubGltKTsKKwl9CisJZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgMzsgcGxhbmUrKykgeworCQlmb3IgKHNlZ19pZCA9IDA7IHNlZ19pZCA8IE1BWF9TRUdNRU5UUzsgc2VnX2lkKyspIHsgLy8gTUFYX1NFR01FTlRTPT04CisJCQlmb3IgKGRpciA9IDA7IGRpciA8IDI7ICsrZGlyKSB7CisJCQkJaW50MzJfdCBtb2RlOworCQkJCWZvciAobW9kZSA9IDA7IG1vZGUgPCAyOyArK21vZGUpIHsKKwkJCQkJcHJpbnRrKCJhc3NpZ24ge2x2bFslZF1bJWRdWyVkXVswXVslZF0sbHZsWyVkXVslZF1bJWRdWzFdWyVkXSxsdmxbJWRdWyVkXVslZF1bMl1bJWRdLGx2bFslZF1bJWRdWyVkXVszXVslZF0sbHZsWyVkXVslZF1bJWRdWzRdWyVkXSxsdmxbJWRdWyVkXVslZF1bNV1bJWRdLGx2bFslZF1bJWRdWyVkXVs2XVslZF0sbHZsWyVkXVslZF1bJWRdWzddWyVkXX09ezYnZCUyZCw2J2QlMmQsNidkJTJkLDYnZCUyZCw2J2QlMmQsNidkJTJkLDYnZCUyZCw2J2QlMmR9O1xuIiwKKwkJCQkJcGxhbmUsIHNlZ19pZCwgZGlyLCBtb2RlLAorCQkJCQlwbGFuZSwgc2VnX2lkLCBkaXIsIG1vZGUsCisJCQkJCXBsYW5lLCBzZWdfaWQsIGRpciwgbW9kZSwKKwkJCQkJcGxhbmUsIHNlZ19pZCwgZGlyLCBtb2RlLAorCQkJCQlwbGFuZSwgc2VnX2lkLCBkaXIsIG1vZGUsCisJCQkJCXBsYW5lLCBzZWdfaWQsIGRpciwgbW9kZSwKKwkJCQkJcGxhbmUsIHNlZ19pZCwgZGlyLCBtb2RlLAorCQkJCQlwbGFuZSwgc2VnX2lkLCBkaXIsIG1vZGUsCisJCQkJCWxmaS0+bHZsW3BsYW5lXVtzZWdfaWRdW2Rpcl1bMF1bbW9kZV0sCisJCQkJCWxmaS0+bHZsW3BsYW5lXVtzZWdfaWRdW2Rpcl1bMV1bbW9kZV0sCisJCQkJCWxmaS0+bHZsW3BsYW5lXVtzZWdfaWRdW2Rpcl1bMl1bbW9kZV0sCisJCQkJCWxmaS0+bHZsW3BsYW5lXVtzZWdfaWRdW2Rpcl1bM11bbW9kZV0sCisJCQkJCWxmaS0+bHZsW3BsYW5lXVtzZWdfaWRdW2Rpcl1bNF1bbW9kZV0sCisJCQkJCWxmaS0+bHZsW3BsYW5lXVtzZWdfaWRdW2Rpcl1bNV1bbW9kZV0sCisJCQkJCWxmaS0+bHZsW3BsYW5lXVtzZWdfaWRdW2Rpcl1bNl1bbW9kZV0sCisJCQkJCWxmaS0+bHZsW3BsYW5lXVtzZWdfaWRdW2Rpcl1bN11bbW9kZV0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCS8vIFdyaXRlIHRvIHJlZ2lzdGVyCisJZm9yIChpID0gMDsgaSA8IDE5MjsgaSsrKSB7CisJCXVpbnQzMl90IGxldmVsOworCQlsZXZlbCA9ICgobGZpLT5sdmxbaT4+NiYzXVtpPj4zJjddWzFdW2kmN11bMV0gJiAweDNmKTw8MjQpIHwKKwkJCSgobGZpLT5sdmxbaT4+NiYzXVtpPj4zJjddWzFdW2kmN11bMF0gJiAweDNmKTw8MTYpIHwKKwkJCSgobGZpLT5sdmxbaT4+NiYzXVtpPj4zJjddWzBdW2kmN11bMV0gJiAweDNmKTw8OCkgfAorCQkJKGxmaS0+bHZsW2k+PjYmM11baT4+MyY3XVswXVtpJjddWzBdICYgMHgzZik7CisJCWlmICghbGYtPmZpbHRlcl9sZXZlbFswXSAmJiAhbGYtPmZpbHRlcl9sZXZlbFsxXSkKKwkJCWxldmVsID0gMDsKKwkJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHQSwgbGV2ZWwpOworCX0KKyNlbmRpZiAgLy8gREJHX0xQRl9EQkxLX0xWTAorCisjaWZkZWYgREJHX0xQRl9EQkxLX0ZPUkNFRF9PRkYKKwlpZiAobGYtPmxmX3BpY19jbnQgPT0gMikgeworCQlwcmludGsoIkxGX1BSSU5UOiBwaWNfY250KCVkKSBkYmxrIGZvcmNlZCBvZmYgISEhXG4iLCBsZi0+bGZfcGljX2NudCk7CisJCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0RCTEswLCAwKTsKKwl9IGVsc2UKKwkJV1JJVEVfVlJFRyhIRVZDX0RCTEtfREJMSzAsCisJCQlsZi0+ZmlsdGVyX2xldmVsWzBdIHwgbGYtPmZpbHRlcl9sZXZlbFsxXSA8PCA2IHwKKwkJCWxmLT5maWx0ZXJfbGV2ZWxfdSA8PCAxMiB8IGxmLT5maWx0ZXJfbGV2ZWxfdiA8PCAxOCk7CisjZWxzZQorCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0RCTEswLAorCQlsZi0+ZmlsdGVyX2xldmVsWzBdIHwgbGYtPmZpbHRlcl9sZXZlbFsxXTw8NiB8CisJCWxmLT5maWx0ZXJfbGV2ZWxfdTw8MTIgfCBsZi0+ZmlsdGVyX2xldmVsX3Y8PDE4KTsKKyNlbmRpZgorCWZvciAoaSA9MDsgaSA8IDEwOyBpKyspCisJCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0RCTEsxLAorCQkJKChpPDIpID8gbGYtPm1vZGVfZGVsdGFzW2kmMV0gOiBsZi0+cmVmX2RlbHRhc1soaS0yKSY3XSkpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0RCTEsyLAorCQkJKHVpbnQzMl90KShzZWctPnNlZ19sZl9pbmZvX3lbaV0pIHwgKHVpbnQzMl90KShzZWctPnNlZ19sZl9pbmZvX2NbaV08PDE2KSk7CisKKwkvLyBTZXQgUF9IRVZDX0RCTEtfQ0ZHQiBhZ2FpbgorCXsKKwkJdWludDMyX3QgbHBmX2RhdGEzMiA9IFJFQURfVlJFRyhIRVZDX0RCTEtfQ0ZHQik7CisJCWlmIChsZi0+bW9kZV9yZWZfZGVsdGFfZW5hYmxlZCkKKwkJCWxwZl9kYXRhMzIgfD0gICgweDE8PDI4KTsgLy8gbW9kZV9yZWZfZGVsdGFfZW5hYmxlZAorCQllbHNlCisJCQlscGZfZGF0YTMyICY9IH4oMHgxPDwyOCk7CisJCWlmIChzZWctPmVuYWJsZWQpCisJCQlscGZfZGF0YTMyIHw9ICAoMHgxPDwyOSk7IC8vIHNlZyBlbmFibGUKKwkJZWxzZQorCQkJbHBmX2RhdGEzMiAmPSB+KDB4MTw8MjkpOworCQlpZiAocGljX3dpZHRoID49IDEyODApCisJCQlscGZfZGF0YTMyIHw9ICgweDEgPDwgNCk7IC8vIGRibGsgcGlwZWxpbmUgbW9kZT0xIGZvciBwZXJmb3JtYW5jZQorCQllbHNlCisJCQlscGZfZGF0YTMyICY9IH4oMHgzIDw8IDQpOworCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkdCLCBscGZfZGF0YTMyKTsKKwl9CisJICAvLyBTZXQgQ0RFRgorCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NERUYwLCBidWZfc3BlYy0+Y2RlZl9kYXRhLmJ1Zl9zdGFydCk7CisJeworCQl1aW50MzJfdCBjZGVmX2RhdGEzMiA9IChSRUFEX1ZSRUcoSEVWQ19EQkxLX0NERUYxKSAmIDB4ZmZmZmZmMDApOworCQljZGVmX2RhdGEzMiB8PSAxNzsJLy8gVE9ETyBFUlJPUiA6OiBjZGVmIHRlbXAgZG1hIGFkZHJlc3MgbGVmdCBvZmZzZXQKKyNpZmRlZiBEQkdfTFBGX0NERUZfTk9fUElQRUxJTkUKKwkJY2RlZl9kYXRhMzIgfD0gKDE8PDE3KTsgLy8gY2RlZiB0ZXN0IG5vIHBpcGVsaW5lIGZvciB2ZXJ5IHNtYWxsIHBpY3R1cmUKKyNlbmRpZgorCQlXUklURV9WUkVHKEhFVkNfREJMS19DREVGMSwgY2RlZl9kYXRhMzIpOworCX0KKwkvLyBQaWN0dXJlIGNvdW50CisJbGYtPmxmX3BpY19jbnQrKzsKK30KKyNlbmRpZiAgLy8gI2lmZGVmIEFPTV9BVjFfREJMS19JTklUCisKKyNpZmRlZiBBT01fQVYxX1VQU0NBTEVfSU5JVAorLyoKKyAqIHRoZXNlIGZ1bmN0aW9ucyBoZXJlIGZvciB1cHNjYWxpbmcgdXBkYXRlZCBpbiBldmVyeSBwaWN0dXJlCisgKi8KKyNkZWZpbmUgUlNfU1VCUEVMX0JJVFMgNgorI2RlZmluZSBSU19TVUJQRUxfTUFTSyAoKDEgPDwgUlNfU1VCUEVMX0JJVFMpIC0gMSkKKyNkZWZpbmUgUlNfU0NBTEVfU1VCUEVMX0JJVFMgMTQKKyNkZWZpbmUgUlNfU0NBTEVfU1VCUEVMX01BU0sgKCgxIDw8IFJTX1NDQUxFX1NVQlBFTF9CSVRTKSAtIDEpCisjZGVmaW5lIFJTX1NDQUxFX0VYVFJBX0JJVFMgKFJTX1NDQUxFX1NVQlBFTF9CSVRTIC0gUlNfU1VCUEVMX0JJVFMpCisjZGVmaW5lIFJTX1NDQUxFX0VYVFJBX09GRiAoMSA8PCAoUlNfU0NBTEVfRVhUUkFfQklUUyAtIDEpKQorCitzdGF0aWMgaW50MzJfdCBhdjFfZ2V0X3Vwc2NhbGVfY29udm9sdmVfc3RlcChpbnQzMl90IGluX2xlbmd0aCwgaW50MzJfdCBvdXRfbGVuZ3RoKSB7CisgIHJldHVybiAoKGluX2xlbmd0aCA8PCBSU19TQ0FMRV9TVUJQRUxfQklUUykgKyBvdXRfbGVuZ3RoIC8gMikgLyBvdXRfbGVuZ3RoOworfQorCitzdGF0aWMgaW50MzJfdCBnZXRfdXBzY2FsZV9jb252b2x2ZV94MChpbnQzMl90IGluX2xlbmd0aCwgaW50MzJfdCBvdXRfbGVuZ3RoLAorCQkJCQkJCQkJICAgaW50MzJfdCB4X3N0ZXBfcW4pIHsKKyAgY29uc3QgaW50MzJfdCBlcnIgPSBvdXRfbGVuZ3RoICogeF9zdGVwX3FuIC0gKGluX2xlbmd0aCA8PCBSU19TQ0FMRV9TVUJQRUxfQklUUyk7CisgIGNvbnN0IGludDMyX3QgeDAgPQorCSAgKC0oKG91dF9sZW5ndGggLSBpbl9sZW5ndGgpIDw8IChSU19TQ0FMRV9TVUJQRUxfQklUUyAtIDEpKSArCisJICAgb3V0X2xlbmd0aCAvIDIpIC8KKwkJICBvdXRfbGVuZ3RoICsKKwkgIFJTX1NDQUxFX0VYVFJBX09GRiAtIGVyciAvIDI7CisgIHJldHVybiAoaW50MzJfdCkoKHVpbnQzMl90KXgwICYgUlNfU0NBTEVfU1VCUEVMX01BU0spOworfQorCit2b2lkIGF2MV91cHNjYWxlX2ZyYW1lX2luaXQoQVYxRGVjb2RlciogcGJpLCBBVjFfQ09NTU9OICpjbSwgcGFyYW1fdCogcGFyYW1zKQoreworCUJ1ZmZJbmZvX3QqIGJ1Zl9zcGVjID0gcGJpLT53b3JrX3NwYWNlX2J1ZjsKKwkvL3VpbnQzMl90IGRhdGEzMjsKKwljb25zdCBpbnQzMl90IHdpZHRoICAgICAgICAgICAgICAgICAgID0gY20tPmRlY193aWR0aDsKKwljb25zdCBpbnQzMl90IHN1cGVycmVzX3Vwc2NhbGVkX3dpZHRoID0gY20tPnN1cGVycmVzX3Vwc2NhbGVkX3dpZHRoOworCWNvbnN0IGludDMyX3QgeF9zdGVwX3FuX2x1bWEgICAgICAgICAgPSBhdjFfZ2V0X3Vwc2NhbGVfY29udm9sdmVfc3RlcCh3aWR0aCwgc3VwZXJyZXNfdXBzY2FsZWRfd2lkdGgpOworCWNvbnN0IGludDMyX3QgeDBfcW5fbHVtYSAgICAgICAgICAgICAgPSBnZXRfdXBzY2FsZV9jb252b2x2ZV94MCh3aWR0aCwgc3VwZXJyZXNfdXBzY2FsZWRfd2lkdGgsIHhfc3RlcF9xbl9sdW1hKTsKKwljb25zdCBpbnQzMl90IHhfc3RlcF9xbl9jaHJvbWEgICAgICAgID0gYXYxX2dldF91cHNjYWxlX2NvbnZvbHZlX3N0ZXAoKHdpZHRoKzEpPj4xLCAoc3VwZXJyZXNfdXBzY2FsZWRfd2lkdGgrMSk+PjEpOworCWNvbnN0IGludDMyX3QgeDBfcW5fY2hyb21hICAgICAgICAgICAgPSBnZXRfdXBzY2FsZV9jb252b2x2ZV94MCgod2lkdGgrMSk+PjEsIChzdXBlcnJlc191cHNjYWxlZF93aWR0aCsxKT4+MSwgeF9zdGVwX3FuX2Nocm9tYSk7CisgICAgYXYxX3ByaW50MihBT01fREVCVUdfSFdfTU9SRSwKKwkJIlVQU19QUklOVDogd2lkdGgoJWQgLT4gJWQpXG4iLAorCQl3aWR0aCwgc3VwZXJyZXNfdXBzY2FsZWRfd2lkdGgpOworICAgIGF2MV9wcmludDIoQU9NX0RFQlVHX0hXX01PUkUsCisJCSJVUFNfUFJJTlQ6IHhzdGVwKCVkLCVkKSgweCVYLCAweCVYKSB4MHFuKCVkLCVkKSgweCVYLCAweCVYKVxuIiwKKwkgIHhfc3RlcF9xbl9sdW1hLHhfc3RlcF9xbl9jaHJvbWEsCisJICB4X3N0ZXBfcW5fbHVtYSx4X3N0ZXBfcW5fY2hyb21hLAorCSAgeDBfcW5fbHVtYSx4MF9xbl9jaHJvbWEsCisJICB4MF9xbl9sdW1hLHgwX3FuX2Nocm9tYSk7CisgICAgV1JJVEVfVlJFRyhIRVZDX0RCTEtfVVBTMSwgYnVmX3NwZWMtPnVwc19kYXRhLmJ1Zl9zdGFydCk7CisgICAgV1JJVEVfVlJFRyhIRVZDX0RCTEtfVVBTMiwgeDBfcW5fbHVtYSk7CQkgLy8geDBfcW4geQorICAgIFdSSVRFX1ZSRUcoSEVWQ19EQkxLX1VQUzMsIHgwX3FuX2Nocm9tYSk7CSAgIC8vIHgwX3FuIGMKKyAgICBXUklURV9WUkVHKEhFVkNfREJMS19VUFM0LCB4X3N0ZXBfcW5fbHVtYSk7CSAvLyB4X3N0ZXAgeQorICAgIFdSSVRFX1ZSRUcoSEVWQ19EQkxLX1VQUzUsIHhfc3RlcF9xbl9jaHJvbWEpOyAgIC8vIHhfc3RlcCBjCisgICAgV1JJVEVfVlJFRyhBVjFfVVBTQ0FMRV9YMF9RTiwgKHgwX3FuX2Nocm9tYTw8MTYpfHgwX3FuX2x1bWEpOworICAgIFdSSVRFX1ZSRUcoQVYxX1VQU0NBTEVfU1RFUF9RTiwgKHhfc3RlcF9xbl9jaHJvbWE8PDE2KXx4X3N0ZXBfcW5fbHVtYSk7CisKKy8qCisgKiBUaWxlUiBjYWxjdWxhdGlvbiBoZXJlIGlmIGNtIG5lZWRzIGFuIGV4YWN0bHkgYWNjdXJhdGUgdmFsdWUKKyAqLworLy8jZGVmaW5lIEFWMV9VUFNDQUxFX1RJTEVSX0NBTENVTEFUSU9OCisjaWZkZWYgQVYxX1VQU0NBTEVfVElMRVJfQ0FMQ1VMQVRJT04KKyAgICB1aW50MzJfdCB1cHNjbF9lbmFibGVkID0gMTsgLy8gMSBqdXN0IGZvciBleGFtcGxlLCBhY3R1YWxseSB0aGlzIGlzIHVzZV9zdXBlcnJlcyBmbGFnCisgICAgdWludDMyX3QgdGlsZXJfeCA9IDE5MjsgLy8gMTkyIGp1c3QgZm9yIGV4YW1wbGUsIGFjdHVhbGx5IHRoaXMgaXMgdGlsZSBlbmQKKyAgICB1aW50MzJfdCB1eDsKKyAgICB1aW50MzJfdCB1eF90aWxlcix1eF90aWxlcl9ybmQzMjsKKyAgICB1aW50MzJfdCB4cW5feTsKKyAgICB1aW50MzJfdCB4cW5fYzsKKyAgICB1aW50MzJfdCB0aWxlcl94X3kgPSB0aWxlcl94ICAgICAtIDggLSAzOyAvLyBkYmxrL2NkZWYgbGVmdC1zaGlmdC04IHBsdXMgdXBzY2FsaW5nIGV4dHJhLTMKKyAgICB1aW50MzJfdCB0aWxlcl94X2MgPSAodGlsZXJfeC8yKSAtIDQgLSAzOyAvLyBkYmxrL2NkZWYgbGVmdC1zaGlmdC00IHBsdXMgdXBzY2FsaW5nIGV4dHJhLTMKKworICAgIHhxbl95ID0geDBfcW5fbHVtYTsKKyAgICB4cW5fYyA9IHgwX3FuX2Nocm9tYTsKKyAgICB1eF90aWxlciA9IDA7CisgICAgdXhfdGlsZXJfcm5kMzIgPSAwOworICAgIGZvciAodXg9MDsgdXg8MTYzODQ7IHV4Kz04KSB7CisJICAgIHVpbnQzMl90IHgxcW5feSAgICAgPSB4cW5feSArIHhfc3RlcF9xbl9sdW1hICAqKCAgNyszKTsgLy8gZXh0cmEtMyBpcyBmb3IgbHJmCisJICAgIHVpbnQzMl90IHgxcW5fYyAgICAgPSB4cW5fYyArIHhfc3RlcF9xbl9jaHJvbWEqKCAgMyszKTsgLy8gZXh0cmEtMyBpcyBmb3IgbHJmCisJICAgIHVpbnQzMl90IHgxcW5feV9ueHQgPSB4cW5feSArIHhfc3RlcF9xbl9sdW1hICAqKDgrNyszKTsgLy8gZXh0cmEtMyBpcyBmb3IgbHJmCisJICAgIHVpbnQzMl90IHgxcW5fY19ueHQgPSB4cW5fYyArIHhfc3RlcF9xbl9jaHJvbWEqKDQrMyszKTsgLy8gZXh0cmEtMyBpcyBmb3IgbHJmCisKKwkgICAgdWludDMyX3QgeDFfeSA9IHVwc2NsX2VuYWJsZWQgPyAoeDFxbl95Pj4xNCkgOiB1eCAgICArNyszOworCSAgICB1aW50MzJfdCB4MV9jID0gdXBzY2xfZW5hYmxlZCA/ICh4MXFuX2M+PjE0KSA6ICh1eC8yKSszKzM7CisJICAgIHVpbnQzMl90IHgxX3lfbnh0ID0gdXBzY2xfZW5hYmxlZCA/ICh4MXFuX3lfbnh0Pj4xNCkgOiB1eCAgICArOCs3KzM7CisJICAgIHVpbnQzMl90IHgxX2Nfbnh0ID0gdXBzY2xfZW5hYmxlZCA/ICh4MXFuX2Nfbnh0Pj4xNCkgOiAodXgvMikrNCszKzM7CisKKwkgICAgaWYgKCh4MV95PHRpbGVyX3hfeSAmJiB4MV9jPHRpbGVyX3hfYykgJiYKKwkJCSh4MV95X254dD49dGlsZXJfeF95IHx8IHgxX2Nfbnh0Pj10aWxlcl94X2MpKSB7CisJCSAgICB1eF90aWxlciA9IHV4OworCQkgICAgdXhfdGlsZXJfcm5kMzIgPSAodXhfdGlsZXIvMzIgKyAodXhfdGlsZXIlMzIgPyAxIDogMCkpICogMzI7CisJCSAgICBicmVhazsKKwkJfQorCisJICAgIHhxbl95ICs9IHhfc3RlcF9xbl9sdW1hKjg7CisJICAgIHhxbl9jICs9IHhfc3RlcF9xbl9jaHJvbWEqNDsKKwl9CisKKyAgICBhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkiVVBTX1BSSU5UOiB4cW5feSgweCV4KSwgeHFuX2MoMHgleCksIHgxcW5feSgweCV4KSwgeDFxbl9jKDB4JXgpXG4iLAorCQl4cW5feSwgeHFuX2MsIHgxcW5feSwgeDFxbl9jKTsKKyAgICBhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkiVVBTX1BSSU5UOiB1eF90aWxlciglZCkoMHgleCksIHV4X3RpbGVyX3JuZDMyKCVkKSgweCV4KVxuIiwKKwkJdXhfdGlsZXIsIHV4X3RpbGVyLCB1eF90aWxlcl9ybmQzMiwgdXhfdGlsZXJfcm5kMzIpOworI2VuZGlmCisKKwkvLyBURU1QIHdyaXRlIGxyZiByZWdpc3RlciBoZXJlCisJLy9XUklURV9WUkVHKEhFVkNfREJMS19MUkYwLCAxPDwwIHwgMTw8Mik7IC8vIExSRiBVTklUIFNJWkUKKwkvL1dSSVRFX1ZSRUcoSEVWQ19EQkxLX0xSRjEsIDM8PDAgfCAxPDw4IHwgMTw8MTYgfCAxPDwyNCk7IC8vIExSRiBVTklUIE5VTUJFUgorCisJLy8gVEVNUCBHbG9iYWwgRW5hYmxlcyB3cml0ZSBoZXJlCisJLyoKKyAgICBjb25zdCB1aW50MzJfdCBkYmxrX2VuYWJsZSA9ICghY20tPmFsbG93X2ludHJhYmMgJiYgIWNtLT5zaW5nbGVfdGlsZV9kZWNvZGluZyAmJiAoY20tPmxmLmZpbHRlcl9sZXZlbFswXSB8fCBjbS0+bGYuZmlsdGVyX2xldmVsWzFdKSk7CisgICAgY29uc3QgdWludDMyX3QgY2RlZl9lbmFibGUgPSAoIWNtLT5hbGxvd19pbnRyYWJjICYmICFjbS0+c2luZ2xlX3RpbGVfZGVjb2RpbmcgJiYgIWNtLT5za2lwX2xvb3BfZmlsdGVyICYmICFjbS0+Y29kZWRfbG9zc2xlc3MgJiYgKGNtLT5jZGVmX2JpdHMgfHwgY20tPmNkZWZfc3RyZW5ndGhzWzBdIHx8IGNtLT5jZGVmX3V2X3N0cmVuZ3Roc1swXSkpOworICAgIHByaW50aygiTFBGX0VOQUJMRVMgOiBkYmxrKCVkKSBjZGVmKCVkKVxuIiwgZGJsa19lbmFibGUsIGNkZWZfZW5hYmxlKTsKKyAgICBkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19EQkxLX0NGR0IgKTsKKyAgICBkYXRhMzIgJj0gfigweGY8PDIwKTsKKyAgICBkYXRhMzIgfD0gKGRibGtfZW5hYmxlPDwyMCk7CisgICAgZGF0YTMyIHw9IChjZGVmX2VuYWJsZTw8MjMpOworICAgIFdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGR0IsIGRhdGEzMik7CisJKi8KK30KKworI2VuZGlmIC8vICNpZmRlZiBBT01fQVYxX1VQU0NBTEVfSU5JVAorCitzdGF0aWMgdm9pZCByZWxlYXNlX2RibGtfc3RydWN0KHN0cnVjdCBBVjFIV19zICpodykKK3sKKyNpZmRlZiBBT01fQVYxX0RCTEtfSU5JVAorCWlmIChody0+bGZpKQorCQl2ZnJlZShody0+bGZpKTsKKwlpZiAoaHctPmxmKQorCQl2ZnJlZShody0+bGYpOworCWlmIChody0+c2VnXzRsZikKKwkJdmZyZWUoaHctPnNlZ180bGYpOworCWh3LT5sZmkgPSBOVUxMOworCWh3LT5sZiA9IE5VTEw7CisJaHctPnNlZ180bGYgPSBOVUxMOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgaW5pdF9kYmxrX3N0cnVjKHN0cnVjdCBBVjFIV19zICpodykKK3sKKyNpZmRlZiBBT01fQVYxX0RCTEtfSU5JVAorICAgIGh3LT5sZmkgPSB2bWFsbG9jKHNpemVvZihsb29wX2ZpbHRlcl9pbmZvX24pKTsKKyAgICBody0+bGYgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgbG9vcGZpbHRlcikpOworICAgIGh3LT5zZWdfNGxmID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IHNlZ21lbnRhdGlvbl9sZikpOworCisgICAgaWYgKGh3LT5sZmkgPT0gTlVMTCB8fCBody0+bGYgPT0gTlVMTCB8fCBody0+c2VnXzRsZiA9PSBOVUxMKSB7CisJCXByaW50aygiW3Rlc3QuY10gYW9tX2xvb3BfZmlsdGVyIGluaXQgbWFsbG9jIGVycm9yISEhXG4iKTsKKwkJcmVsZWFzZV9kYmxrX3N0cnVjdChodyk7CisJCXJldHVybiAtMTsKKwl9CisKKyAgICBody0+bGYtPm1vZGVfcmVmX2RlbHRhX2VuYWJsZWQgPSAxOyAvLyBzZXQgZGVmYXVsdCBoZXJlCisgICAgaHctPmxmLT5tb2RlX3JlZl9kZWx0YV91cGRhdGUgPSAxOyAvLyBzZXQgZGVmYXVsdCBoZXJlCisgICAgaHctPmxmLT5zaGFycG5lc3NfbGV2ZWwgPSAwOyAvLyBpbml0IHRvIDAKKyAgICBody0+bGYtPmxmX3BpY19jbnQgPSAwOyAvLyBpbml0IHRvIDAKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjb25maWdfZGJsa19odyhzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisgICAgQVYxRGVjb2RlciAqcGJpID0gaHctPnBiaTsKKyAgICBBVjFfQ09NTU9OICpjbSA9ICZody0+Y29tbW9uOworICAgIGxvb3BfZmlsdGVyX2luZm9fbiAqbGZpID0gaHctPmxmaTsKKyAgICBzdHJ1Y3QgbG9vcGZpbHRlciAqbGYgPSBody0+bGY7CisgICAgc3RydWN0IHNlZ21lbnRhdGlvbl9sZiAqc2VnXzRsZiA9IGh3LT5zZWdfNGxmOworICAgIEJ1ZmZJbmZvX3QqIGJ1Zl9zcGVjID0gcGJpLT53b3JrX3NwYWNlX2J1ZjsKKwlQSUNfQlVGRkVSX0NPTkZJRyogY3VyX3BpY19jb25maWcgPSAmY20tPmN1cl9mcmFtZS0+YnVmOworCVBJQ19CVUZGRVJfQ09ORklHKiBwcmV2X3BpY19jb25maWcgPSAmY20tPnByZXZfZnJhbWUtPmJ1ZjsKKyAgICBpbnQgaTsKKworI2lmZGVmIEFPTV9BVjFfREJMS19JTklUCisjaWZkZWYgRFVBTF9ERUNPREUKKyNlbHNlCisJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkiW3Rlc3QuYyByZWZfZGVsdGFdIGN1cl9mcmFtZSA6ICVwIHByZXZfZnJhbWUgOiAlcCAtICVwIFxuIiwKKwljbS0+Y3VyX2ZyYW1lLCBjbS0+cHJldl9mcmFtZSwKKwlhdjFfZ2V0X3ByaW1hcnlfcmVmX2ZyYW1lX2J1ZihjbSkpOworCS8vIGdldCBsZiBwYXJhbWV0ZXJzIGZyb20gcGFyc2VyCisJbGYtPm1vZGVfcmVmX2RlbHRhX2VuYWJsZWQgPQorCQkoaHctPmFvbV9wYXJhbS5wLmxvb3BfZmlsdGVyX21vZGVfcmVmX2RlbHRhX2VuYWJsZWQgJiAxKTsKKwlsZi0+bW9kZV9yZWZfZGVsdGFfdXBkYXRlID0KKwkJKChody0+YW9tX3BhcmFtLnAubG9vcF9maWx0ZXJfbW9kZV9yZWZfZGVsdGFfZW5hYmxlZCA+PiAxKSAmIDEpOworCWxmLT5zaGFycG5lc3NfbGV2ZWwgPQorCQlody0+YW9tX3BhcmFtLnAubG9vcF9maWx0ZXJfc2hhcnBuZXNzX2xldmVsOworCWlmICgoKGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9tb2RlX3JlZl9kZWx0YV9lbmFibGVkKSYzKSA9PSAzKSB7IC8vIGVuYWJsZWQgYnV0IGFuZCB1cGRhdGUKKwkJaWYgKGNtLT5wcmV2X2ZyYW1lIDw9IDApIHsKKwkJICAvLyBhbHJlYWR5IGluaXRpYWxpemVkIGluIE1pY3JvY29kZQorCQkJbGYtPnJlZl9kZWx0YXNbMF0gPSBjb252MmludDgoKHVpbnQ4X3QpKGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9yZWZfZGVsdGFzXzApLDcpOworCQkJbGYtPnJlZl9kZWx0YXNbMV0JPSBjb252MmludDgoKHVpbnQ4X3QpKGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9yZWZfZGVsdGFzXzA+PjgpLDcpOworCQkJbGYtPnJlZl9kZWx0YXNbMl0JPSBjb252MmludDgoKHVpbnQ4X3QpKGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9yZWZfZGVsdGFzXzEpLDcpOworCQkJbGYtPnJlZl9kZWx0YXNbM10JPSBjb252MmludDgoKHVpbnQ4X3QpKGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9yZWZfZGVsdGFzXzE+PjgpLDcpOworCQkJbGYtPnJlZl9kZWx0YXNbNF0JPSBjb252MmludDgoKHVpbnQ4X3QpKGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9yZWZfZGVsdGFzXzIpLDcpOworCQkJbGYtPnJlZl9kZWx0YXNbNV0JPSBjb252MmludDgoKHVpbnQ4X3QpKGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9yZWZfZGVsdGFzXzI+PjgpLDcpOworCQkJbGYtPnJlZl9kZWx0YXNbNl0JPSBjb252MmludDgoKHVpbnQ4X3QpKGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9yZWZfZGVsdGFzXzMpLDcpOworCQkJbGYtPnJlZl9kZWx0YXNbN10JPSBjb252MmludDgoKHVpbnQ4X3QpKGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9yZWZfZGVsdGFzXzM+PjgpLDcpOworCQkJbGYtPm1vZGVfZGVsdGFzWzBdID0gY29udjJpbnQ4KCh1aW50OF90KShody0+YW9tX3BhcmFtLnAubG9vcF9maWx0ZXJfbW9kZV9kZWx0YXNfMCksNyk7CisJCQlsZi0+bW9kZV9kZWx0YXNbMV0gPSBjb252MmludDgoKHVpbnQ4X3QpKGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9tb2RlX2RlbHRhc18wPj44KSw3KTsKKwkJfSBlbHNlIHsKKwkJCWxmLT5yZWZfZGVsdGFzWzBdID0gKGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9yZWZfZGVsdGFzXzAgJiAweDgwKSA/CisJCQkJY29udjJpbnQ4KCh1aW50OF90KShody0+YW9tX3BhcmFtLnAubG9vcF9maWx0ZXJfcmVmX2RlbHRhc18wKSw3KSA6CisJCQkgICAgY20tPnByZXZfZnJhbWUtPnJlZl9kZWx0YXNbMF07CisJCQlsZi0+cmVmX2RlbHRhc1sxXQk9IChody0+YW9tX3BhcmFtLnAubG9vcF9maWx0ZXJfcmVmX2RlbHRhc18wICYgMHg4MDAwKSA/CisJCQkJY29udjJpbnQ4KCh1aW50OF90KShody0+YW9tX3BhcmFtLnAubG9vcF9maWx0ZXJfcmVmX2RlbHRhc18wPj44KSw3KSA6CisJCQkgICAgY20tPnByZXZfZnJhbWUtPnJlZl9kZWx0YXNbMV07CisJCQlsZi0+cmVmX2RlbHRhc1syXQk9IChody0+YW9tX3BhcmFtLnAubG9vcF9maWx0ZXJfcmVmX2RlbHRhc18xICYgMHg4MCkgPworCQkJCWNvbnYyaW50OCgodWludDhfdCkoaHctPmFvbV9wYXJhbS5wLmxvb3BfZmlsdGVyX3JlZl9kZWx0YXNfMSksNykgOgorCQkJICAgIGNtLT5wcmV2X2ZyYW1lLT5yZWZfZGVsdGFzWzJdOworCQkJbGYtPnJlZl9kZWx0YXNbM10JPSAoaHctPmFvbV9wYXJhbS5wLmxvb3BfZmlsdGVyX3JlZl9kZWx0YXNfMSAmIDB4ODAwMCkgPworCQkJCWNvbnYyaW50OCgodWludDhfdCkoaHctPmFvbV9wYXJhbS5wLmxvb3BfZmlsdGVyX3JlZl9kZWx0YXNfMT4+OCksNykgOgorCQkJICAgIGNtLT5wcmV2X2ZyYW1lLT5yZWZfZGVsdGFzWzNdOworCQkJbGYtPnJlZl9kZWx0YXNbNF0JPSAoaHctPmFvbV9wYXJhbS5wLmxvb3BfZmlsdGVyX3JlZl9kZWx0YXNfMiAmIDB4ODApID8KKwkJCQljb252MmludDgoKHVpbnQ4X3QpKGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9yZWZfZGVsdGFzXzIpLDcpIDoKKwkJCSAgICBjbS0+cHJldl9mcmFtZS0+cmVmX2RlbHRhc1s0XTsKKwkJCWxmLT5yZWZfZGVsdGFzWzVdCT0gKGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9yZWZfZGVsdGFzXzIgJiAweDgwMDApID8KKwkJCQljb252MmludDgoKHVpbnQ4X3QpKGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9yZWZfZGVsdGFzXzI+PjgpLDcpIDoKKwkJCSAgICBjbS0+cHJldl9mcmFtZS0+cmVmX2RlbHRhc1s1XTsKKwkJCWxmLT5yZWZfZGVsdGFzWzZdID0gKGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9yZWZfZGVsdGFzXzMgJiAweDgwKSA/CisJCQkJY29udjJpbnQ4KCh1aW50OF90KShody0+YW9tX3BhcmFtLnAubG9vcF9maWx0ZXJfcmVmX2RlbHRhc18zKSw3KSA6CisJCQkgICAgY20tPnByZXZfZnJhbWUtPnJlZl9kZWx0YXNbNl07CisJCQlsZi0+cmVmX2RlbHRhc1s3XQk9IChody0+YW9tX3BhcmFtLnAubG9vcF9maWx0ZXJfcmVmX2RlbHRhc18zICYgMHg4MDAwKSA/CisJCQkJY29udjJpbnQ4KCh1aW50OF90KShody0+YW9tX3BhcmFtLnAubG9vcF9maWx0ZXJfcmVmX2RlbHRhc18zPj44KSw3KSA6CisJCQkgICAgY20tPnByZXZfZnJhbWUtPnJlZl9kZWx0YXNbN107CisJCQlsZi0+bW9kZV9kZWx0YXNbMF0gPSAoaHctPmFvbV9wYXJhbS5wLmxvb3BfZmlsdGVyX21vZGVfZGVsdGFzXzAgJiAweDgwKSA/CisJCQkJY29udjJpbnQ4KCh1aW50OF90KShody0+YW9tX3BhcmFtLnAubG9vcF9maWx0ZXJfbW9kZV9kZWx0YXNfMCksNykgOgorCQkJICAgIGNtLT5wcmV2X2ZyYW1lLT5tb2RlX2RlbHRhc1swXTsKKwkJCWxmLT5tb2RlX2RlbHRhc1sxXSA9IChody0+YW9tX3BhcmFtLnAubG9vcF9maWx0ZXJfbW9kZV9kZWx0YXNfMCAmIDB4ODAwMCkgPworCQkJCWNvbnYyaW50OCgodWludDhfdCkoaHctPmFvbV9wYXJhbS5wLmxvb3BfZmlsdGVyX21vZGVfZGVsdGFzXzA+PjgpLDcpIDoKKwkJCSAgICBjbS0+cHJldl9mcmFtZS0+bW9kZV9kZWx0YXNbMV07CisJCX0KKwl9IC8vZWxzZSBpZiAoaHctPmFvbV9wYXJhbS5wLmxvb3BfZmlsdGVyX21vZGVfcmVmX2RlbHRhX2VuYWJsZWQgPT0gMSkgeyAvLyBlbmFibGVkIGJ1dCBubyB1cGRhdGUKKwkgIGVsc2UgeyAvLyBtYXRjaCBjIGNvZGUgLS0gbm90IGVuYWJsZWQsIHN0aWxsIG5lZWQgdG8gY29weSBwcmV2IHRvIHVzZWQgZm9yIG5leHQKKwkJaWYgKChjbS0+cHJldl9mcmFtZSA8PSAwKSB8IChody0+YW9tX3BhcmFtLnAubG9vcF9maWx0ZXJfbW9kZV9yZWZfZGVsdGFfZW5hYmxlZCAmIDQpKSB7CisJCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkJCSJbdGVzdC5jXSBtb2RlX3JlZl9kZWx0YSBzZXQgdG8gZGVmYXVsdFxuIik7CisJCQlsZi0+cmVmX2RlbHRhc1swXSA9IGNvbnYyaW50OCgodWludDhfdCkxLDcpOworCQkJbGYtPnJlZl9kZWx0YXNbMV0gPSBjb252MmludDgoKHVpbnQ4X3QpMCw3KTsKKwkJCWxmLT5yZWZfZGVsdGFzWzJdID0gY29udjJpbnQ4KCh1aW50OF90KTAsNyk7CisJCQlsZi0+cmVmX2RlbHRhc1szXSA9IGNvbnYyaW50OCgodWludDhfdCkwLDcpOworCQkJbGYtPnJlZl9kZWx0YXNbNF0gPSBjb252MmludDgoKHVpbnQ4X3QpMHhmZiw3KTsKKwkJCWxmLT5yZWZfZGVsdGFzWzVdID0gY29udjJpbnQ4KCh1aW50OF90KTAsNyk7CisJCQlsZi0+cmVmX2RlbHRhc1s2XSA9IGNvbnYyaW50OCgodWludDhfdCkweGZmLDcpOworCQkJbGYtPnJlZl9kZWx0YXNbN10gPSBjb252MmludDgoKHVpbnQ4X3QpMHhmZiw3KTsKKwkJCWxmLT5tb2RlX2RlbHRhc1swXSA9IGNvbnYyaW50OCgodWludDhfdCkwLDcpOworCQkJbGYtPm1vZGVfZGVsdGFzWzFdID0gY29udjJpbnQ4KCh1aW50OF90KTAsNyk7CisJCX0gZWxzZSB7CisJCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkJCSJbdGVzdC5jXSBtb2RlX3JlZl9kZWx0YSBjb3B5IGZyb20gcHJldl9mcmFtZVxuIik7CisJCQlsZi0+cmVmX2RlbHRhc1swXQkJCSAgID0gY20tPnByZXZfZnJhbWUtPnJlZl9kZWx0YXNbMF07CisJCQlsZi0+cmVmX2RlbHRhc1sxXQkJCSAgID0gY20tPnByZXZfZnJhbWUtPnJlZl9kZWx0YXNbMV07CisJCQlsZi0+cmVmX2RlbHRhc1syXQkJCSAgID0gY20tPnByZXZfZnJhbWUtPnJlZl9kZWx0YXNbMl07CisJCQlsZi0+cmVmX2RlbHRhc1szXQkJCSAgID0gY20tPnByZXZfZnJhbWUtPnJlZl9kZWx0YXNbM107CisJCQlsZi0+cmVmX2RlbHRhc1s0XQkJCSAgID0gY20tPnByZXZfZnJhbWUtPnJlZl9kZWx0YXNbNF07CisJCQlsZi0+cmVmX2RlbHRhc1s1XQkJCSAgID0gY20tPnByZXZfZnJhbWUtPnJlZl9kZWx0YXNbNV07CisJCQlsZi0+cmVmX2RlbHRhc1s2XQkJCSAgID0gY20tPnByZXZfZnJhbWUtPnJlZl9kZWx0YXNbNl07CisJCQlsZi0+cmVmX2RlbHRhc1s3XQkJCSAgID0gY20tPnByZXZfZnJhbWUtPnJlZl9kZWx0YXNbN107CisJCQlsZi0+bW9kZV9kZWx0YXNbMF0JCQkgID0gY20tPnByZXZfZnJhbWUtPm1vZGVfZGVsdGFzWzBdOworCQkJbGYtPm1vZGVfZGVsdGFzWzFdCQkJICA9IGNtLT5wcmV2X2ZyYW1lLT5tb2RlX2RlbHRhc1sxXTsKKwkJfQorCX0KKwlsZi0+ZmlsdGVyX2xldmVsWzBdCQkJID0gaHctPmFvbV9wYXJhbS5wLmxvb3BfZmlsdGVyX2xldmVsXzA7CisJbGYtPmZpbHRlcl9sZXZlbFsxXQkJCSA9IGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9sZXZlbF8xOworCWxmLT5maWx0ZXJfbGV2ZWxfdSAgICAJCSAgPSBody0+YW9tX3BhcmFtLnAubG9vcF9maWx0ZXJfbGV2ZWxfdTsKKwlsZi0+ZmlsdGVyX2xldmVsX3YgICAgCQkgID0gaHctPmFvbV9wYXJhbS5wLmxvb3BfZmlsdGVyX2xldmVsX3Y7CisKKwljbS0+Y3VyX2ZyYW1lLT5yZWZfZGVsdGFzWzBdID0gbGYtPnJlZl9kZWx0YXNbMF07CisJY20tPmN1cl9mcmFtZS0+cmVmX2RlbHRhc1sxXSA9IGxmLT5yZWZfZGVsdGFzWzFdOworCWNtLT5jdXJfZnJhbWUtPnJlZl9kZWx0YXNbMl0gPSBsZi0+cmVmX2RlbHRhc1syXTsKKwljbS0+Y3VyX2ZyYW1lLT5yZWZfZGVsdGFzWzNdID0gbGYtPnJlZl9kZWx0YXNbM107CisJY20tPmN1cl9mcmFtZS0+cmVmX2RlbHRhc1s0XSA9IGxmLT5yZWZfZGVsdGFzWzRdOworCWNtLT5jdXJfZnJhbWUtPnJlZl9kZWx0YXNbNV0gPSBsZi0+cmVmX2RlbHRhc1s1XTsKKwljbS0+Y3VyX2ZyYW1lLT5yZWZfZGVsdGFzWzZdID0gbGYtPnJlZl9kZWx0YXNbNl07CisJY20tPmN1cl9mcmFtZS0+cmVmX2RlbHRhc1s3XSA9IGxmLT5yZWZfZGVsdGFzWzddOworCWNtLT5jdXJfZnJhbWUtPm1vZGVfZGVsdGFzWzBdID0gbGYtPm1vZGVfZGVsdGFzWzBdOworCWNtLT5jdXJfZnJhbWUtPm1vZGVfZGVsdGFzWzFdID0gbGYtPm1vZGVfZGVsdGFzWzFdOworCisJLy8gZ2V0IHNlZ180bGYgcGFyYW1ldGVycyBmcm9tIHBhcnNlcgorCXNlZ180bGYtPmVuYWJsZWQgPSBody0+YW9tX3BhcmFtLnAuc2VnbWVudGF0aW9uX2VuYWJsZWQgJiAxOworCWNtLT5jdXJfZnJhbWUtPnNlZ21lbnRhdGlvbl9lbmFibGVkID0gaHctPmFvbV9wYXJhbS5wLnNlZ21lbnRhdGlvbl9lbmFibGVkICYgMTsKKwljbS0+Y3VyX2ZyYW1lLT5pbnRyYV9vbmx5ID0gKGh3LT5hb21fcGFyYW0ucC5zZWdtZW50YXRpb25fZW5hYmxlZCA+PiAyKSAmIDE7CisJY20tPmN1cl9mcmFtZS0+c2VnbWVudGF0aW9uX3VwZGF0ZV9tYXAgPSAoaHctPmFvbV9wYXJhbS5wLnNlZ21lbnRhdGlvbl9lbmFibGVkID4+IDMpICYgMTsKKworCWlmIChody0+YW9tX3BhcmFtLnAuc2VnbWVudGF0aW9uX2VuYWJsZWQgJiAxKSB7IC8vIHNlZ21lbnRhdGlvbl9lbmFibGVkCisJCWlmIChody0+YW9tX3BhcmFtLnAuc2VnbWVudGF0aW9uX2VuYWJsZWQgJiAyKSB7IC8vIHNlZ21lbnRhdGlvbl91cGRhdGVfZGF0YQorCQkJZm9yIChpID0gMDsgaSA8IE1BWF9TRUdNRU5UUzsgaSsrKSB7CisJCQkJc2VnXzRsZi0+c2VnX2xmX2luZm9feVtpXSA9IGh3LT5hb21fcGFyYW0ucC5zZWdfbGZfaW5mb195W2ldOworCQkJCXNlZ180bGYtPnNlZ19sZl9pbmZvX2NbaV0gPSBody0+YW9tX3BhcmFtLnAuc2VnX2xmX2luZm9fY1tpXTsKKwkJCQkjaWZkZWYgREJHX0xQRl9QUklOVAorCQkJCQlwcmludGsoIiByZWFkIHNlZ19sZl9pbmZvIFslZF0gOiAweCV4LCAweCV4XG4iLAorCQkJCQlpLCBzZWdfNGxmLT5zZWdfbGZfaW5mb195W2ldLCBzZWdfNGxmLT5zZWdfbGZfaW5mb19jW2ldKTsKKwkJCQkjZW5kaWYKKwkJCQl9CisJCQl9IC8vIHNlZ21lbnRhdGlvbl91cGRhdGVfZGF0YQorCQkJZWxzZSB7IC8vIG5vIHNlZ21lbnRhdGlvbl91cGRhdGVfZGF0YQorCQkJCWlmIChjbS0+cHJldl9mcmFtZSA8PSAwKSB7CisJCQkJCWZvciAoaT0wO2k8TUFYX1NFR01FTlRTO2krKykgeworCQkJCQkJc2VnXzRsZi0+c2VnX2xmX2luZm9feVtpXSA9IDA7CisJCQkJCQlzZWdfNGxmLT5zZWdfbGZfaW5mb19jW2ldID0gMDsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWZvciAoaSA9IDA7IGkgPCBNQVhfU0VHTUVOVFM7IGkrKykgeworCQkJCQkJc2VnXzRsZi0+c2VnX2xmX2luZm9feVtpXSA9IGNtLT5wcmV2X2ZyYW1lLT5zZWdfbGZfaW5mb195W2ldOworCQkJCQkJc2VnXzRsZi0+c2VnX2xmX2luZm9fY1tpXSA9IGNtLT5wcmV2X2ZyYW1lLT5zZWdfbGZfaW5mb19jW2ldOworCQkjaWZkZWYgREJHX0xQRl9QUklOVAorCQkJCQkgIHByaW50aygiIFJlZnJlbmNlIHNlZ19sZl9pbmZvIFslZF0gOiAweCV4LCAweCV4XG4iLAorCQkJCQkgIGksIHNlZ180bGYtPnNlZ19sZl9pbmZvX3lbaV0sIHNlZ180bGYtPnNlZ19sZl9pbmZvX2NbaV0pOworCQkjZW5kaWYKKwkJCQkJfQorCQkJCX0KKwkJCX0gLy8gbm8gc2VnbWVudGF0aW9uX3VwZGF0ZV9kYXRhCisJCX0gLy8gc2VnbWVudGF0aW9uX2VuYWJsZWQKKwkJZWxzZSB7CisJCQlmb3IgKGk9MDtpPE1BWF9TRUdNRU5UUztpKyspIHsKKwkJCQlzZWdfNGxmLT5zZWdfbGZfaW5mb195W2ldID0gMDsKKwkJCQlzZWdfNGxmLT5zZWdfbGZfaW5mb19jW2ldID0gMDsKKwkJCX0KKwkJfSAvLyBOT1Qgc2VnbWVudGF0aW9uX2VuYWJsZWQKKwkJZm9yIChpPTA7aTxNQVhfU0VHTUVOVFM7aSsrKSB7CisJCQljbS0+Y3VyX2ZyYW1lLT5zZWdfbGZfaW5mb195W2ldID0gc2VnXzRsZi0+c2VnX2xmX2luZm9feVtpXTsKKwkJCWNtLT5jdXJfZnJhbWUtPnNlZ19sZl9pbmZvX2NbaV0gPSBzZWdfNGxmLT5zZWdfbGZfaW5mb19jW2ldOworI2lmZGVmIERCR19MUEZfUFJJTlQKKwkJCXByaW50aygiIFNBVkUgc2VnX2xmX2luZm8gWyVkXSA6IDB4JXgsIDB4JXhcbiIsCisJCQlpLCBjbS0+Y3VyX2ZyYW1lLT5zZWdfbGZfaW5mb195W2ldLAorCQkJY20tPmN1cl9mcmFtZS0+c2VnX2xmX2luZm9fY1tpXSk7CisjZW5kaWYKKwkJfQorCisJLyoKKwkqIFVwZGF0ZSBsb29wIGZpbHRlciBUaHIvTHZsIHRhYmxlIGZvciBldmVyeSBmcmFtZQorCSovCisJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJIlt0ZXN0LmNdIGF2MV9sb29wX2ZpbHRlcl9mcmFtZV9pbml0IChydW4gYmVmb3JlIGV2ZXJ5IGZyYW1lIGRlY29kaW5nIHN0YXJ0KVxuIik7CisJYXYxX2xvb3BfZmlsdGVyX2ZyYW1lX2luaXQocGJpLCBzZWdfNGxmLCBsZmksIGxmLCBjbS0+ZGVjX3dpZHRoKTsKKyNlbmRpZiAvLyBub3QgRFVBTF9ERUNPREUKKyNlbmRpZgorCisjaWZkZWYgQU9NX0FWMV9VUFNDQUxFX0lOSVQKKwkvKgorCSogaW5pdCBmb3IgdXBzY2FsaW5nCisJKi8KKwlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkiW3Rlc3QuY10gYXYxX3Vwc2NhbGVfZnJhbWVfaW5pdCAocnVuIGJlZm9yZSBldmVyeSBmcmFtZSBkZWNvZGluZyBzdGFydClcbiIpOworCWF2MV91cHNjYWxlX2ZyYW1lX2luaXQocGJpLAorCQlwYmktPmNvbW1vbiwgJmh3LT5hb21fcGFyYW0pOworI2VuZGlmIC8vICNpZmRlZiBBT01fQVYxX1VQU0NBTEVfSU5JVAorCisJLy9CdWZmSW5mb190KiBidWZfc3BlYyA9IHBiaS0+d29ya19zcGFjZV9idWY7CisJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJIlt0ZXN0LmNdIGN1cl9mcmFtZSA6ICVwIHByZXZfZnJhbWUgOiAlcCAtICVwIFxuIiwKKwkJY20tPmN1cl9mcmFtZSwgY20tPnByZXZfZnJhbWUsIGF2MV9nZXRfcHJpbWFyeV9yZWZfZnJhbWVfYnVmKGNtKSk7CisJaWYgKGNtLT5jdXJfZnJhbWUgPD0gMCkgeworCQlXUklURV9WUkVHKEFPTV9BVjFfQ0RGX0JVRkZFUl9XLCBidWZfc3BlYy0+Y2RmX2J1Zi5idWZfc3RhcnQpOworCQlXUklURV9WUkVHKEFPTV9BVjFfU0VHX01BUF9CVUZGRVJfVywgYnVmX3NwZWMtPnNlZ19tYXAuYnVmX3N0YXJ0KTsKKwl9CisJZWxzZSB7CisJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCQkiW3Rlc3QuY10gQ29uZmlnIFdSSVRFIENERl9CVUYvU0VHX01BUF9CVUYgIDogJWRcbiIsCisJCQljdXJfcGljX2NvbmZpZy0+aW5kZXgpOworCQlXUklURV9WUkVHKEFPTV9BVjFfQ0RGX0JVRkZFUl9XLAorCQkJYnVmX3NwZWMtPmNkZl9idWYuYnVmX3N0YXJ0ICsgKDB4ODAwMCpjdXJfcGljX2NvbmZpZy0+aW5kZXgpKTsKKwkJV1JJVEVfVlJFRyhBT01fQVYxX1NFR19NQVBfQlVGRkVSX1csCisJCQlidWZfc3BlYy0+c2VnX21hcC5idWZfc3RhcnQgKyAoKGJ1Zl9zcGVjLT5zZWdfbWFwLmJ1Zl9zaXplIC8gMTYpICogY3VyX3BpY19jb25maWctPmluZGV4KSk7CisJfQorCWNtLT5jdXJfZnJhbWUtPnNlZ19taV9yb3dzID0gY20tPmN1cl9mcmFtZS0+bWlfcm93czsKKwljbS0+Y3VyX2ZyYW1lLT5zZWdfbWlfY29scyA9IGNtLT5jdXJfZnJhbWUtPm1pX2NvbHM7CisJaWYgKGNtLT5wcmV2X2ZyYW1lIDw9IDApIHsKKwkJV1JJVEVfVlJFRyhBT01fQVYxX0NERl9CVUZGRVJfUiwgYnVmX3NwZWMtPmNkZl9idWYuYnVmX3N0YXJ0KTsKKwkJV1JJVEVfVlJFRyhBT01fQVYxX1NFR19NQVBfQlVGRkVSX1IsIGJ1Zl9zcGVjLT5zZWdfbWFwLmJ1Zl9zdGFydCk7CisJfSBlbHNlIHsKKwkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJCSJbdGVzdC5jXSBDb25maWcgUkVBRCAgQ0RGX0JVRi9TRUdfTUFQX0JVRiAgOiAlZFxuIiwKKwkJCXByZXZfcGljX2NvbmZpZy0+aW5kZXgpOworCQlXUklURV9WUkVHKEFPTV9BVjFfQ0RGX0JVRkZFUl9SLAorCQkJYnVmX3NwZWMtPmNkZl9idWYuYnVmX3N0YXJ0ICsgKDB4ODAwMCpwcmV2X3BpY19jb25maWctPmluZGV4KSk7CisJCVdSSVRFX1ZSRUcoQU9NX0FWMV9TRUdfTUFQX0JVRkZFUl9SLAorCQkJYnVmX3NwZWMtPnNlZ19tYXAuYnVmX3N0YXJ0ICsgKChidWZfc3BlYy0+c2VnX21hcC5idWZfc2l6ZSAvIDE2KSAqIHByZXZfcGljX2NvbmZpZy0+aW5kZXgpKTsKKworCQkvLyBzZWdtZW50YXRpb25fZW5hYmxlZCBidXQgbm8gc2VnbWVudGF0aW9uX3VwZGF0ZV9kYXRhCisJCWlmICgoaHctPmFvbV9wYXJhbS5wLnNlZ21lbnRhdGlvbl9lbmFibGVkICYgMykgPT0gMSkgeworCQkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJCQkiW3Rlc3QuY10gc2VnZmVhdHVyZXNfY29weSBmcm9tIHByZXZfZnJhbWVcbiIpOworCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJCVdSSVRFX1ZSRUcoQU9NX0FWMV9TRUdNRU5UX0ZFQVRVUkUsCisJCQkJCWNtLT5wcmV2X2ZyYW1lLT5zZWdtZW50X2ZlYXR1cmVbaV0pOworCQkJfQorCQl9CisJCS8vIHNlZ21lbnRhdGlvbl9lbmFibGVkIGJ1dCBubyBzZWdtZW50YXRpb25fdXBkYXRlX21hcAorCQlpZiAoKGh3LT5hb21fcGFyYW0ucC5zZWdtZW50YXRpb25fZW5hYmxlZCAmIDkpID09IDEpIHsKKwkJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCQkJIlt0ZXN0LmNdIHNlZ19tYXBfc2l6ZSBjb3B5IGZyb20gcHJldl9mcmFtZVxuIik7CisJCQljbS0+Y3VyX2ZyYW1lLT5zZWdfbWlfcm93cyA9IGNtLT5wcmV2X2ZyYW1lLT5zZWdfbWlfcm93czsKKwkJCWNtLT5jdXJfZnJhbWUtPnNlZ19taV9jb2xzID0gY20tPnByZXZfZnJhbWUtPnNlZ19taV9jb2xzOworCQl9CisJfQorI2lmZGVmIFBSSU5UX0hFVkNfREFUQV9QQVRIX01PTklUT1IKKwl7CisJCXVpbnQzMl90IHRvdGFsX2Nsa19jb3VudDsKKwkJdWludDMyX3QgcGF0aF90cmFuc2Zlcl9jb3VudDsKKwkJdWludDMyX3QgcGF0aF93YWl0X2NvdW50OworCQlmbG9hdCBwYXRoX3dhaXRfcmF0aW87CisJCWlmIChwYmktPmRlY29kZV9pZHggPiAxKSB7CisJCQlXUklURV9WUkVHKEhFVkNfUEFUSF9NT05JVE9SX0NUUkwsIDApOyAvLyBEaXNhYmJsZSBtb25pdG9yIGFuZCBzZXQgcmRfaWR4IHRvIDAKKwkJCXRvdGFsX2Nsa19jb3VudCA9IFJFQURfVlJFRyhIRVZDX1BBVEhfTU9OSVRPUl9EQVRBKTsKKworCQkJV1JJVEVfVlJFRyhIRVZDX1BBVEhfTU9OSVRPUl9DVFJMLCAoMTw8NCkpOyAvLyBEaXNhYmJsZSBtb25pdG9yIGFuZCBzZXQgcmRfaWR4IHRvIDAKKworCQkJLy8gcGFyc2VyIC0tPiBpcWl0CisJCQlwYXRoX3RyYW5zZmVyX2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUEFUSF9NT05JVE9SX0RBVEEpOworCQkJcGF0aF93YWl0X2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUEFUSF9NT05JVE9SX0RBVEEpOworCQkJaWYgKHBhdGhfdHJhbnNmZXJfY291bnQgPT0gMCkKKwkJCQlwYXRoX3dhaXRfcmF0aW8gPSAwLjA7CisJCQllbHNlCisJCQkJcGF0aF93YWl0X3JhdGlvID0KKwkJCQkJKGZsb2F0KXBhdGhfd2FpdF9jb3VudC8oZmxvYXQpcGF0aF90cmFuc2Zlcl9jb3VudDsKKwkJCXByaW50aygiW1AlZCBIRVZDIFBBVEhdIFBhcnNlci9JUUlUL0lQUC9EQkxLL09XL0REUi9DTUQgV0FJVElORyBcJSA6ICUuMmYiLAorCQkJCXBiaS0+ZGVjb2RlX2lkeCAtIDIsCisJCQkJcGF0aF93YWl0X3JhdGlvKTsKKworCQkJLy8gaXFpdCAtLT4gaXBwCisJCQlwYXRoX3RyYW5zZmVyX2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUEFUSF9NT05JVE9SX0RBVEEpOworCQkJcGF0aF93YWl0X2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUEFUSF9NT05JVE9SX0RBVEEpOworCQkJaWYgKHBhdGhfdHJhbnNmZXJfY291bnQgPT0gMCkKKwkJCQlwYXRoX3dhaXRfcmF0aW8gPSAwLjA7CisJCQllbHNlCisJCQkJcGF0aF93YWl0X3JhdGlvID0gKGZsb2F0KXBhdGhfd2FpdF9jb3VudC8oZmxvYXQpcGF0aF90cmFuc2Zlcl9jb3VudDsKKwkJCXByaW50aygiICUuMmYiLCBwYXRoX3dhaXRfcmF0aW8pOworCisJCQkvLyBkYmxrIDwtLSBpcHAKKwkJCXBhdGhfdHJhbnNmZXJfY291bnQgPSBSRUFEX1ZSRUcoSEVWQ19QQVRIX01PTklUT1JfREFUQSk7CisJCQlwYXRoX3dhaXRfY291bnQgPSBSRUFEX1ZSRUcoSEVWQ19QQVRIX01PTklUT1JfREFUQSk7CisJCQlpZiAocGF0aF90cmFuc2Zlcl9jb3VudCA9PSAwKQorCQkJCXBhdGhfd2FpdF9yYXRpbyA9IDAuMDsKKwkJCWVsc2UKKwkJCQlwYXRoX3dhaXRfcmF0aW8gPSAoZmxvYXQpcGF0aF93YWl0X2NvdW50LyhmbG9hdClwYXRoX3RyYW5zZmVyX2NvdW50OworCQkJcHJpbnRrKCIgJS4yZiIsIHBhdGhfd2FpdF9yYXRpbyk7CisKKwkJCS8vIGRibGsgLS0+IG93CisJCQlwYXRoX3RyYW5zZmVyX2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUEFUSF9NT05JVE9SX0RBVEEpOworCQkJcGF0aF93YWl0X2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUEFUSF9NT05JVE9SX0RBVEEpOworCQkJaWYgKHBhdGhfdHJhbnNmZXJfY291bnQgPT0gMCkKKwkJCQlwYXRoX3dhaXRfcmF0aW8gPSAwLjA7CisJCQllbHNlIHBhdGhfd2FpdF9yYXRpbyA9CisJCQkJKGZsb2F0KXBhdGhfd2FpdF9jb3VudC8oZmxvYXQpcGF0aF90cmFuc2Zlcl9jb3VudDsKKwkJCXByaW50aygiICUuMmYiLCBwYXRoX3dhaXRfcmF0aW8pOworCisJCQkvLyA8LS0+IEREUgorCQkJcGF0aF90cmFuc2Zlcl9jb3VudCA9IFJFQURfVlJFRyhIRVZDX1BBVEhfTU9OSVRPUl9EQVRBKTsKKwkJCXBhdGhfd2FpdF9jb3VudCA9IFJFQURfVlJFRyhIRVZDX1BBVEhfTU9OSVRPUl9EQVRBKTsKKwkJCWlmIChwYXRoX3RyYW5zZmVyX2NvdW50ID09IDApCisJCQkJcGF0aF93YWl0X3JhdGlvID0gMC4wOworCQkJZWxzZSBwYXRoX3dhaXRfcmF0aW8gPQorCQkJCShmbG9hdClwYXRoX3dhaXRfY291bnQvKGZsb2F0KXBhdGhfdHJhbnNmZXJfY291bnQ7CisJCQlwcmludGsoIiAlLjJmIiwgcGF0aF93YWl0X3JhdGlvKTsKKworCQkJLy8gQ01ECisJCQlwYXRoX3RyYW5zZmVyX2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUEFUSF9NT05JVE9SX0RBVEEpOworCQkJcGF0aF93YWl0X2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUEFUSF9NT05JVE9SX0RBVEEpOworCQkJaWYgKHBhdGhfdHJhbnNmZXJfY291bnQgPT0gMCkKKwkJCQlwYXRoX3dhaXRfcmF0aW8gPSAwLjA7CisJCQllbHNlCisJCQkJcGF0aF93YWl0X3JhdGlvID0gKGZsb2F0KXBhdGhfd2FpdF9jb3VudC8oZmxvYXQpcGF0aF90cmFuc2Zlcl9jb3VudDsKKwkJCXByaW50aygiICUuMmZcbiIsIHBhdGhfd2FpdF9yYXRpbyk7CisJCX0KKwl9CisKKyNlbmRpZgorCit9CisKK3N0YXRpYyB2b2lkIGFvbV9jb25maWdfd29ya19zcGFjZV9odyhzdHJ1Y3QgQVYxSFdfcyAqaHcsIHUzMiBtYXNrKQoreworCXN0cnVjdCBCdWZmSW5mb19zICpidWZfc3BlYyA9IGh3LT53b3JrX3NwYWNlX2J1ZjsKKwl1bnNpZ25lZCBpbnQgZGF0YTMyOworCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsICIlcyAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlpZiAoZGVidWcgJiYgaHctPmluaXRfZmxhZyA9PSAwKQorCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLCAiJXMgJXggJXggJXggJXggJXggJXggJXggJXhcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWJ1Zl9zcGVjLT5pcHAuYnVmX3N0YXJ0LAorCQkJYnVmX3NwZWMtPnN0YXJ0X2FkciwKKwkJCWJ1Zl9zcGVjLT5zaG9ydF90ZXJtX3Jwcy5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+c2FvX3VwLmJ1Zl9zdGFydCwKKwkJCWJ1Zl9zcGVjLT5zd2FwX2J1Zi5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+c2NhbGVsdXQuYnVmX3N0YXJ0LAorCQkJYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+ZGJsa19kYXRhLmJ1Zl9zdGFydCk7CisJaWYgKG1hc2sgJiBIV19NQVNLX0ZST05UKSB7CisJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwgIiVzICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlpZiAoKGRlYnVnICYgQU9NX0FWMV9ERUJVR19TRU5EX1BBUkFNX1dJVEhfUkVHKSA9PSAwKQorCQkJV1JJVEVfVlJFRyhIRVZDX1JQTV9CVUZGRVIsICh1MzIpaHctPnJwbV9waHlfYWRkcik7CisKKwkJLypXUklURV9WUkVHKEhFVkNfU1RSRUFNX1NXQVBfQlVGRkVSLAorCQkJYnVmX3NwZWMtPnN3YXBfYnVmLmJ1Zl9zdGFydCk7Ki8KKwkJV1JJVEVfVlJFRyhMTUVNX0RVTVBfQURSLCAodTMyKWh3LT5sbWVtX3BoeV9hZGRyKTsKKworCX0KKworCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsICIlcyAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworICAgIFdSSVRFX1ZSRUcoQU9NX0FWMV9EQUFMQV9UT1BfQlVGRkVSLAorCQlidWZfc3BlYy0+ZGFhbGFfdG9wLmJ1Zl9zdGFydCk7CisgICAgV1JJVEVfVlJFRyhBVjFfR01DX1BBUkFNX0JVRkZfQUREUiwKKwkJYnVmX3NwZWMtPmdtY19idWYuYnVmX3N0YXJ0KTsKKworICAgIFdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGRzQsCisJCWJ1Zl9zcGVjLT5kYmxrX3BhcmEuYnVmX3N0YXJ0KTsgLy8gY2ZnX2FkZHJfY2lmCisgICAgV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHNSwKKwkJYnVmX3NwZWMtPmRibGtfZGF0YS5idWZfc3RhcnQpOyAvLyBjZmdfYWRkcl94aW8KKworCWlmIChtYXNrICYgSFdfTUFTS19CQUNLKSB7CisjaWZkZWYgTE9TTEVTU19DT01QUkVTU19NT0RFCisJCWludCBsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUgPQorCQkJY29tcHV0ZV9sb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUoaHctPmluaXRfcGljX3csCisJCQlody0+aW5pdF9waWNfaCk7CisJCWludCBsb3NsZXNzX2NvbXBfYm9keV9zaXplID0KKwkJCWNvbXB1dGVfbG9zbGVzc19jb21wX2JvZHlfc2l6ZShody0+aW5pdF9waWNfdywKKwkJCWh3LT5pbml0X3BpY19oLCBidWZfYWxsb2NfZGVwdGggPT0gMTApOworI2VuZGlmCisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKwkJaW50IGxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZV9kdyA9CisJCQljb21wdXRlX2xvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZV9kdyhody0+aW5pdF9waWNfdywKKwkJCWh3LT5pbml0X3BpY19oKTsKKwkJaW50IGxvc2xlc3NfY29tcF9ib2R5X3NpemVfZHcgPQorCQkJY29tcHV0ZV9sb3NsZXNzX2NvbXBfYm9keV9zaXplX2R3KGh3LT5pbml0X3BpY193LAorCQkJaHctPmluaXRfcGljX2gsIGJ1Zl9hbGxvY19kZXB0aCA9PSAxMCk7CisjZW5kaWYKKwkJV1JJVEVfVlJFRyhIRVZDRF9JUFBfTElORUJVRkZfQkFTRSwKKwkJCWJ1Zl9zcGVjLT5pcHAuYnVmX3N0YXJ0KTsKKwkJLy9XUklURV9WUkVHKEhFVkNfU0FPX1VQLCBidWZfc3BlYy0+c2FvX3VwLmJ1Zl9zdGFydCk7CisJCS8vV1JJVEVfVlJFRyhIRVZDX1NDQUxFTFVULCBidWZfc3BlYy0+c2NhbGVsdXQuYnVmX3N0YXJ0KTsKKyNpZmRlZiBDSEFOR0VfUkVNT1ZFRAorCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKSB7CisJCQkvKiBjZmdfYWRkcl9hZHAqLworCQkJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHRSwgYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc3RhcnQpOworCQkJaWYgKGRlYnVnICYgQVYxX0RFQlVHX0JVRk1HUl9NT1JFKQorCQkJCXByX2luZm8oIldyaXRlIEhFVkNfREJMS19DRkdFXG4iKTsKKwkJfQorI2VuZGlmCisJCS8qIGNmZ19wX2FkZHIgKi8KKwkJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHNCwgYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc3RhcnQpOworCQkvKiBjZmdfZF9hZGRyICovCisJCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGRzUsIGJ1Zl9zcGVjLT5kYmxrX2RhdGEuYnVmX3N0YXJ0KTsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkgeworCQlpZiAoYnVmX3NwZWMtPm1heF93aWR0aCA8PSA0MDk2ICYmIGJ1Zl9zcGVjLT5tYXhfaGVpZ2h0IDw9IDIzMDQpCisJCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkczLCAweDQwNDAxMCk7IC8vZGVmYXVsdCB2YWx1ZQorCQllbHNlCisJCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkczLCAweDgwODAyMCk7IC8vIG1ha2UgbGVmdCBzdG9yYWdlIDIgeCA0a10KKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQlVGTUdSX01PUkUsCisJCQkiSEVWQ19EQkxLX0NGRzMgPSAleFxuIiwgUkVBRF9WUkVHKEhFVkNfREJMS19DRkczKSk7CisJfQorCisjaWZkZWYgTE9TTEVTU19DT01QUkVTU19NT0RFCisJaWYgKGh3LT5tbXVfZW5hYmxlKSB7CisJCS8qYml0WzRdIDogcGFnZWRfbWVtX21vZGUqLworCQlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMSwgKDB4MSA8PCA0KSk7CisjaWZkZWYgQ0hBTkdFX1JFTU9WRUQKKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA8IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpCisjZW5kaWYKKwkJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwyLCAwKTsKKwl9IGVsc2UgeworCQkvKmlmIChjdXJfcGljX2NvbmZpZy0+Yml0X2RlcHRoID09IEFPTV9CSVRTXzEwKQorCQkgKglXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMSwgKDA8PDMpKTsKKwkJICovCisJCS8qYml0WzNdIHNtZW0gbWRvZSovCisJCS8qZWxzZSBXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMSwgKDE8PDMpKTsqLworCQkvKmJpdFszXSBzbWVtIG1kb2UqLworCQlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMiwKKwkJCShsb3NsZXNzX2NvbXBfYm9keV9zaXplID4+IDUpKTsKKwl9CisJLypXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMiwKKwkJKGxvc2xlc3NfY29tcF9ib2R5X3NpemUgPj4gNSkpOyovCisJLypXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMywKKwkJKDB4ZmY8PDIwKSB8ICgweGZmPDwxMCkgfCAweGZmKTsqLworCS8qOC1iaXQgbW9kZSAqLworCVdSSVRFX1ZSRUcoSEVWQ19DTV9CT0RZX0xFTkdUSCwgbG9zbGVzc19jb21wX2JvZHlfc2l6ZSk7CisJV1JJVEVfVlJFRyhIRVZDX0NNX0hFQURFUl9PRkZTRVQsIGxvc2xlc3NfY29tcF9ib2R5X3NpemUpOworCVdSSVRFX1ZSRUcoSEVWQ19DTV9IRUFERVJfTEVOR1RILCBsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUpOworCWlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpICYgMHgxMCkKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDEsIDB4MSA8PCAzMSk7CisjZWxzZQorCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLCAweDEgPDwgMzEpOworI2VuZGlmCisKKwlpZiAoaHctPm1tdV9lbmFibGUpIHsKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19NTVVfVkgwX0FERFIsIGJ1Zl9zcGVjLT5tbXVfdmJoLmJ1Zl9zdGFydCk7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fTU1VX1ZIMV9BRERSLCBidWZfc3BlYy0+bW11X3ZiaC5idWZfc3RhcnQKKwkJCQkrIFZCSF9CVUZfU0laRShidWZfc3BlYykpOworCQkvKmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMOSk7Ki8KKwkJLypkYXRhMzIgfD0gMHgxOyovCisJCS8qV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMOSwgZGF0YTMyKTsqLworCisJCS8qIHVzZSBIRVZDX0NNX0hFQURFUl9TVEFSVF9BRERSICovCisJCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMNSk7CisJCWRhdGEzMiB8PSAoMTw8MTApOworCQlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw1LCBkYXRhMzIpOworCX0KKyNpZmRlZiBBT01fQVYxX01NVV9EVworICAgIGRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMNSk7CisJaWYgKGh3LT5kd19tbXVfZW5hYmxlKSB7CisJCXUzMiBkYXRhX3RtcDsKKwkJZGF0YV90bXAgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDkpOworCQlkYXRhX3RtcCB8PSAoMTw8MTApOworCQlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw5LCBkYXRhX3RtcCk7CisKKwkgICAgV1JJVEVfVlJFRyhIRVZDX0NNX0JPRFlfTEVOR1RIMixsb3NsZXNzX2NvbXBfYm9keV9zaXplX2R3KTsKKwkgICAgV1JJVEVfVlJFRyhIRVZDX0NNX0hFQURFUl9PRkZTRVQyLGxvc2xlc3NfY29tcF9ib2R5X3NpemVfZHcpOworCSAgICBXUklURV9WUkVHKEhFVkNfQ01fSEVBREVSX0xFTkdUSDIsbG9zbGVzc19jb21wX2hlYWRlcl9zaXplX2R3KTsKKworCSAgICBXUklURV9WUkVHKEhFVkNfU0FPX01NVV9WSDBfQUREUjIsIGJ1Zl9zcGVjLT5tbXVfdmJoX2R3LmJ1Zl9zdGFydCk7CisJICAgIFdSSVRFX1ZSRUcoSEVWQ19TQU9fTU1VX1ZIMV9BRERSMiwgYnVmX3NwZWMtPm1tdV92YmhfZHcuYnVmX3N0YXJ0CisJCQkrIERXX1ZCSF9CVUZfU0laRShidWZfc3BlYykpOworCisJCVdSSVRFX1ZSRUcoSEVWQ19EV19WSDBfQURERFIsIGJ1Zl9zcGVjLT5tbXVfdmJoX2R3LmJ1Zl9zdGFydAorCQkJKyAoMiAqIERXX1ZCSF9CVUZfU0laRShidWZfc3BlYykpKTsKKwkJV1JJVEVfVlJFRyhIRVZDX0RXX1ZIMV9BREREUiwgYnVmX3NwZWMtPm1tdV92YmhfZHcuYnVmX3N0YXJ0CisJCQkrICgzICogRFdfVkJIX0JVRl9TSVpFKGJ1Zl9zcGVjKSkpOworCisJCS8qIHVzZSBIRVZDX0NNX0hFQURFUl9TVEFSVF9BRERSICovCisJICAgIGRhdGEzMiB8PSAoMTw8MTUpOworCX0gZWxzZQorCSAgICBkYXRhMzIgJj0gfigxPDwxNSk7CisgICAgV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMNSwgZGF0YTMyKTsKKyNlbmRpZgorCisJV1JJVEVfVlJFRyhMTUVNX0RVTVBfQURSLCAodTMyKWh3LT5sbWVtX3BoeV9hZGRyKTsKKyNpZmRlZiBDSEFOR0VfUkVNT1ZFRAorCisJCVdSSVRFX1ZSRUcoQVYxX1NFR19NQVBfQlVGRkVSLCBidWZfc3BlYy0+c2VnX21hcC5idWZfc3RhcnQpOworCisJCSAvKiovCisJCVdSSVRFX1ZSRUcoQVYxX1BST0JfU1dBUF9CVUZGRVIsIGh3LT5wcm9iX2J1ZmZlcl9waHlfYWRkcik7CisJCVdSSVRFX1ZSRUcoQVYxX0NPVU5UX1NXQVBfQlVGRkVSLCBody0+Y291bnRfYnVmZmVyX3BoeV9hZGRyKTsKKwkJaWYgKGh3LT5tbXVfZW5hYmxlKSB7CisJCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKQorCQkJCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTU1VX01BUF9BRERSLCBody0+ZnJhbWVfbW11X21hcF9waHlfYWRkcik7CisJCQllbHNlCisJCQkJV1JJVEVfVlJFRyhBVjFfTU1VX01BUF9CVUZGRVIsIGh3LT5mcmFtZV9tbXVfbWFwX3BoeV9hZGRyKTsKKwkJfQorI2Vsc2UKKwlpZiAoaHctPm1tdV9lbmFibGUpCisJICAgIFdSSVRFX1ZSRUcoSEVWQ19TQU9fTU1VX0RNQV9DVFJMLCBody0+ZnJhbWVfbW11X21hcF9waHlfYWRkcik7CisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKwlpZiAoaHctPmR3X21tdV9lbmFibGUpIHsKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19NTVVfRE1BX0NUUkwyLCBody0+ZHdfZnJhbWVfbW11X21hcF9waHlfYWRkcik7CisJCS8vZGVmYXVsdCBvZiAweGZmZmZmZmZmIHdpbGwgZGlzYWJsZSBkdworCSAgICBXUklURV9WUkVHKEhFVkNfU0FPX1lfU1RBUlRfQUREUiwgMCk7CisJICAgIFdSSVRFX1ZSRUcoSEVWQ19TQU9fQ19TVEFSVF9BRERSLCAwKTsKKwl9CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIENPX01WX0NPTVBSRVNTCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDVEKSB7CisJICAgIGRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX01QUkVEX0NUUkw0KTsKKwkgICAgZGF0YTMyIHw9ICAoMSA8PCAxKTsKKwkgICAgV1JJVEVfVlJFRyhIRVZDX01QUkVEX0NUUkw0LCBkYXRhMzIpOworCX0KKyNlbmRpZgorCX0KKworCWNvbmZpZ19hdXhfYnVmKGh3KTsKK30KKworI2lmZGVmIE1DUkNDX0VOQUJMRQorc3RhdGljIHUzMiBtY3JjY19jYWNoZV9hbGdfZmxhZyA9IDE7CitzdGF0aWMgdm9pZCBtY3JjY19wZXJmY291bnRfcmVzZXQoc3RydWN0IEFWMUhXX3MgKmh3KTsKK3N0YXRpYyB2b2lkIGRlY29tcF9wZXJmY291bnRfcmVzZXQoc3RydWN0IEFWMUhXX3MgKmh3KTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBhb21faW5pdF9kZWNvZGVyX2h3KHN0cnVjdCBBVjFIV19zICpodywgdTMyIG1hc2spCit7CisJdW5zaWduZWQgaW50IGRhdGEzMjsKKwlpbnQgaTsKKwljb25zdCB1bnNpZ25lZCBzaG9ydCBwYXJzZXJfY21kW1BBUlNFUl9DTURfTlVNQkVSXSA9IHsKKwkJMHgwNDAxLCAweDg0MDEsIDB4MDgwMCwgMHgwNDAyLCAweDkwMDIsIDB4MTQyMywKKwkJMHg4Q0MzLCAweDE0MjMsIDB4ODgwNCwgMHg5ODI1LCAweDA4MDAsIDB4MDRGRSwKKwkJMHg4NDA2LCAweDg0MTEsIDB4MTgwMCwgMHg4NDA4LCAweDg0MDksIDB4OEMyQSwKKwkJMHg5QzJCLCAweDFDMDAsIDB4ODQwRiwgMHg4NDA3LCAweDgwMDAsIDB4ODQwOCwKKwkJMHgyMDAwLCAweEE4MDAsIDB4ODQxMCwgMHgwNERFLCAweDg0MEMsIDB4ODQwRCwKKwkJMHhBQzAwLCAweEEwMDAsIDB4MDhDMCwgMHgwOEUwLCAweEE0MEUsIDB4RkMwMCwKKwkJMHg3QzAwCisJfTsKKyNpZiAwCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBNRVNPTl9DUFVfTUFKT1JfSURfRzEyQSkgeworCQkvKiBTZXQgTUNSIGZldGNoIHByaW9yaXRpZXMqLworCQlkYXRhMzIgPSAweDEgfCAoMHgxIDw8IDIpIHwgKDB4MSA8PDMpIHwKKwkJCSgyNCA8PCA0KSB8ICgzMiA8PCAxMSkgfCAoMjQgPDwgMTgpIHwgKDMyIDw8IDI1KTsKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0FYSVVSR19DVEwsIGRhdGEzMik7CisJfQorI2VuZGlmCisJLyppZiAoZGVidWcgJiBBVjFfREVCVUdfQlVGTUdSX01PUkUpCisJCXByX2luZm8oIiVzXG4iLCBfX2Z1bmNfXyk7Ki8KKwlpZiAobWFzayAmIEhXX01BU0tfRlJPTlQpIHsKKwkJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0lOVF9DT05UUk9MKTsKKyNpZmRlZiBDSEFOR0VfUkVNT1ZFRAorI2lmIDEKKwkJLyogc2V0IGJpdCAzMX4yOSB0byAzIGlmIEhFVkNfU1RSRUFNX0ZJRk9fQ1RMWzI5XSBpcyAxICovCisJCWRhdGEzMiAmPSB+KDcgPDwgMjkpOworCQlkYXRhMzIgfD0gKDMgPDwgMjkpOworI2VuZGlmCisJCWRhdGEzMiA9IGRhdGEzMiB8CisJCSgxIDw8IDI0KSB8LypzdHJlYW1fYnVmZmVyX2VtcHR5X2ludF9hbXJpc2NfZW5hYmxlKi8KKwkJKDEgPDwgMjIpIHwvKnN0cmVhbV9maWZvX2VtcHR5X2ludF9hbXJpc2NfZW5hYmxlKi8KKwkJKDEgPDwgNykgfC8qZGVjX2RvbmVfaW50X2NwdV9lbmFibGUqLworCQkoMSA8PCA0KSB8LypzdGFydGNvZGVfZm91bmRfaW50X2NwdV9lbmFibGUqLworCQkoMCA8PCAzKSB8LypzdGFydGNvZGVfZm91bmRfaW50X2FtcmlzY19lbmFibGUqLworCQkoMSA8PCAwKQkvKnBhcnNlcl9pbnRfZW5hYmxlKi8KKwkJOworI2Vsc2UKKwkJZGF0YTMyID0gZGF0YTMyICYgMHgwM2ZmZmZmZjsKKwkJZGF0YTMyID0gZGF0YTMyIHwKKwkJCSgzIDw8IDI5KSB8ICAvLyBzdHJlYW1fYnVmZmVyX2VtcHR5X2ludF9jdGwgKCAweDIwMCBpbnRlcnJ1cHQpCisJCQkoMyA8PCAyNikgfCAgLy8gc3RyZWFtX2ZpZm9fZW1wdHlfaW50X2N0bCAoIDQgaW50ZXJydXB0KQorCQkJKDEgPDwgMjQpIHwgIC8vIHN0cmVhbV9idWZmZXJfZW1wdHlfaW50X2FtcmlzY19lbmFibGUKKwkJCSgxIDw8IDIyKSB8ICAvLyBzdHJlYW1fZmlmb19lbXB0eV9pbnRfYW1yaXNjX2VuYWJsZQorI2lmZGVmIEFPTV9BVjFfSEVEX0ZCCisjaWZkZWYgRFVBTF9ERUNPREUKKwkJLy8gRm9yIEhBTFQgQ0NQVSB0ZXN0LiBVc2UgUHVsbCBpbnNpZGUgQ0NQVSB0byBnZW5lcmF0ZSBpbnRlcnJ1cHQKKwkJLy8gKDEgPDwgOSkgfCAgLy8gZmVkX2ZiX3NsaWNlX2RvbmVfaW50X2FtcmlzY19lbmFibGUKKyNlbHNlCisJCQkoMSA8PCAxMCkgfCAgLy8gZmVkX2ZiX3NsaWNlX2RvbmVfaW50X2NwdV9lbmFibGUKKyNlbmRpZgorI2VuZGlmCisJCQkoMSA8PCA3KSB8ICAvLyBkZWNfZG9uZV9pbnRfY3B1X2VuYWJsZQorCQkJKDEgPDwgNCkgfCAgLy8gc3RhcnRjb2RlX2ZvdW5kX2ludF9jcHVfZW5hYmxlCisJCQkoMCA8PCAzKSB8ICAvLyBzdGFydGNvZGVfZm91bmRfaW50X2FtcmlzY19lbmFibGUKKwkJCSgxIDw8IDApICAgIC8vIHBhcnNlcl9pbnRfZW5hYmxlCisJCQk7CisjZW5kaWYKKwkJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9JTlRfQ09OVFJPTCwgZGF0YTMyKTsKKworCQlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9TVEFUVVMpOworCQlkYXRhMzIgPSBkYXRhMzIgfAorCQkoMCA8PCAxKSB8LyplbXVsYXRpb25fY2hlY2tfb2ZmIEFWMQorCQkJZG8gbm90IGhhdmUgZW11bGF0aW9uKi8KKwkJKDEgPDwgMCkvKnN0YXJ0Y29kZV9jaGVja19vbiovCisJCTsKKwkJV1JJVEVfVlJFRyhIRVZDX1NISUZUX1NUQVRVUywgZGF0YTMyKTsKKwkJV1JJVEVfVlJFRyhIRVZDX1NISUZUX0NPTlRST0wsCisJCSgwIDw8IDE0KSB8IC8qZGlzYWJsZV9zdGFydF9jb2RlX3Byb3RlY3QqLworCQkoMSA8PCAxMCkgfCAvKmxlbmd0aF96ZXJvX3N0YXJ0Y29kZV9lbiBmb3IgQVYxKi8KKwkJKDEgPDwgOSkgfCAvKmxlbmd0aF92YWxpZF9zdGFydGNvZGVfZW4gZm9yIEFWMSovCisJCSgzIDw8IDYpIHwgLypzZnRfdmFsaWRfd3JfcG9zaXRpb24qLworCQkoMiA8PCA0KSB8IC8qZW11bGF0ZV9jb2RlX2xlbmd0aF9zdWJfMSovCisJCSgzIDw8IDEpIHwgLypzdGFydF9jb2RlX2xlbmd0aF9zdWJfMQorCQlBVjEgdXNlIDB4MDAwMDAwMDEgYXMgc3RhcnRjb2RlICg0IEJ5dGVzKSovCisJCSgxIDw8IDApICAgLypzdHJlYW1fc2hpZnRfZW5hYmxlKi8KKwkJKTsKKworCQlXUklURV9WUkVHKEhFVkNfQ0FCQUNfQ09OVFJPTCwKKwkJCSgxIDw8IDApLypjYWJhY19lbmFibGUqLworCQkpOworCisJCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfQ09SRV9DT05UUk9MLAorCQkJKDEgPDwgMCkvKiBoZXZjX3BhcnNlcl9jb3JlX2Nsa19lbiovCisJCSk7CisKKwkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCAwKTsKKwl9CisKKwlpZiAobWFzayAmIEhXX01BU0tfQkFDSykgeworCQkvKkluaXRpYWwgSVFJVF9TQ0FMRUxVVCBtZW1vcnkKKwkJLS0ganVzdCB0byBhdm9pZCBYIGluIHNpbXVsYXRpb24qLworCQlpZiAoaXNfcmRtYV9lbmFibGUoKSkKKwkJCXJkbWFfYmFja19lbmRfd29yayhody0+cmRtYV9waHlfYWRyLCBSRE1BX1NJWkUpOworCQllbHNlIHsKKwkJCVdSSVRFX1ZSRUcoSEVWQ19JUUlUX1NDQUxFTFVUX1dSX0FERFIsIDApOy8qY2ZnX3BfYWRkciovCisJCQlmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorCQkJCVdSSVRFX1ZSRUcoSEVWQ19JUUlUX1NDQUxFTFVUX0RBVEEsIDApOworCQl9CisJfQorCisJaWYgKG1hc2sgJiBIV19NQVNLX0ZST05UKSB7CisJCXUzMiBkZWNvZGVfbW9kZTsKKy8qCisjaWZkZWYgRU5BQkxFX1NXQVBfVEVTVAorCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fU1dBUF9URVNULCAxMDApOworI2Vsc2UKKwlXUklURV9WUkVHKEhFVkNfU1RSRUFNX1NXQVBfVEVTVCwgMCk7CisjZW5kaWYKKyovCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQlpZiAoIWh3LT5tX2luc19mbGFnKSB7CisJCQlpZiAoaHctPmxvd19sYXRlbmN5X2ZsYWcpCisJCQkJZGVjb2RlX21vZGUgPSBERUNPREVfTU9ERV9TSU5HTEVfTE9XX0xBVEVOQ1k7CisJCQllbHNlCisJCQkJZGVjb2RlX21vZGUgPSBERUNPREVfTU9ERV9TSU5HTEU7CisJCX0gZWxzZSBpZiAodmRlY19mcmFtZV9iYXNlZChod190b192ZGVjKGh3KSkpCisJCQlkZWNvZGVfbW9kZSA9IGh3LT5ub19oZWFkID8KKwkJCQlERUNPREVfTU9ERV9NVUxUSV9GUkFNRUJBU0VfTk9IRUFEIDoKKwkJCQlERUNPREVfTU9ERV9NVUxUSV9GUkFNRUJBU0U7CisJCWVsc2UKKwkJCWRlY29kZV9tb2RlID0gREVDT0RFX01PREVfTVVMVElfU1RSRUFNQkFTRTsKKwkJaWYgKGRlYnVnICYgQU9NX0RFQlVHX0JVRk1HUl9PTkxZKQorCQkJZGVjb2RlX21vZGUgfD0gKDEgPDwgMTYpOworCQlXUklURV9WUkVHKERFQ09ERV9NT0RFLCBkZWNvZGVfbW9kZSk7CisJCVdSSVRFX1ZSRUcoSEVWQ19ERUNPREVfU0laRSwgMCk7CisJCVdSSVRFX1ZSRUcoSEVWQ19ERUNPREVfQ09VTlQsIDApOworI2Vsc2UKKwlXUklURV9WUkVHKERFQ09ERV9NT0RFLCBERUNPREVfTU9ERV9TSU5HTEUpOworCVdSSVRFX1ZSRUcoSEVWQ19ERUNPREVfUElDX0JFR0lOX1JFRywgMCk7CisJV1JJVEVfVlJFRyhIRVZDX0RFQ09ERV9QSUNfTlVNX1JFRywgMHg3ZmZmZmZmZik7IC8qdG8gcmVtb3ZlKi8KKyNlbmRpZgorCS8qU2VuZCBwYXJzZXJfY21kKi8KKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0NNRF9XUklURSwgKDEgPDwgMTYpIHwgKDAgPDwgMCkpOworCWZvciAoaSA9IDA7IGkgPCBQQVJTRVJfQ01EX05VTUJFUjsgaSsrKQorCQlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0NNRF9XUklURSwgcGFyc2VyX2NtZFtpXSk7CisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9DTURfU0tJUF8wLCBQQVJTRVJfQ01EX1NLSVBfQ0ZHXzApOworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfQ01EX1NLSVBfMSwgUEFSU0VSX0NNRF9TS0lQX0NGR18xKTsKKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0NNRF9TS0lQXzIsIFBBUlNFUl9DTURfU0tJUF9DRkdfMik7CisKKworCQlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0lGX0NPTlRST0wsCisJCQkvKiAgKDEgPDwgOCkgfCovIC8qc2FvX3N3X3ByZWRfZW5hYmxlKi8KKwkJCSgxIDw8IDUpIHwgLypwYXJzZXJfc2FvX2lmX2VuKi8KKwkJCSgxIDw8IDIpIHwgLypwYXJzZXJfbXByZWRfaWZfZW4qLworCQkJKDEgPDwgMCkgLypwYXJzZXJfc2NhbGVyX2lmX2VuKi8KKwkJKTsKKwl9CisKKwlpZiAobWFzayAmIEhXX01BU0tfQkFDSykgeworCQkvKkNoYW5nZWQgdG8gU3RhcnQgTVBSRUQgaW4gbWljcm9jb2RlKi8KKwkJLyoKKwkJcHJfaW5mbygiW3Rlc3QuY10gU3RhcnQgTVBSRURcbiIpOworCQlXUklURV9WUkVHKEhFVkNfTVBSRURfSU5UX1NUQVRVUywKKwkJKDE8PDMxKQorCQkpOworCQkqLworCQlXUklURV9WUkVHKEhFVkNEX0lQUF9UT1BfQ05UTCwKKwkJCSgwIDw8IDEpIHwgLyplbmFibGUgaXBwKi8KKwkJCSgxIDw8IDApICAgLypzb2Z0d2FyZSByZXNldCBpcHAgYW5kIG1wcCovCisJCSk7CisjaWZkZWYgQ0hBTkdFX1JFTU9WRUQKKwkJV1JJVEVfVlJFRyhIRVZDRF9JUFBfVE9QX0NOVEwsCisJCQkoMSA8PCAxKSB8IC8qZW5hYmxlIGlwcCovCisJCQkoMCA8PCAwKSAgIC8qc29mdHdhcmUgcmVzZXQgaXBwIGFuZCBtcHAqLworCQkpOworI2Vsc2UKKwkJV1JJVEVfVlJFRyhIRVZDRF9JUFBfVE9QX0NOVEwsCisJCQkoMyA8PCA0KSB8IC8vIGF2MQorCQkJKDEgPDwgMSkgfCAvKmVuYWJsZSBpcHAqLworCQkJKDAgPDwgMCkgICAvKnNvZnR3YXJlIHJlc2V0IGlwcCBhbmQgbXBwKi8KKwkJKTsKKyNlbmRpZgorCWlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpICYgMHgxMCkgeworCQkvKkVuYWJsZSBOVjIxIHJlZmVyZW5jZSByZWFkIG1vZGUgZm9yIE1DKi8KKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDEsIDB4MSA8PCAzMSk7CisJfQorI2lmZGVmIE1DUkNDX0VOQUJMRQorCQkvKkluaXRpYWxpemUgbWNyY2MgYW5kIGRlY29tcCBwZXJmIGNvdW50ZXJzKi8KKwkJaWYgKG1jcmNjX2NhY2hlX2FsZ19mbGFnICYmCisJCQlody0+aW5pdF9mbGFnID09IDApIHsKKwkJCW1jcmNjX3BlcmZjb3VudF9yZXNldChodyk7CisJCQlkZWNvbXBfcGVyZmNvdW50X3Jlc2V0KGh3KTsKKwkJfQorI2VuZGlmCisJfQorI2lmZGVmIENIQU5HRV9SRU1PVkVECisjZWxzZQorLy8gU2V0IE1DUiBmZXRjaCBwcmlvcml0aWVzCisgICAgZGF0YTMyID0gMHgxIHwgKDB4MSA8PCAyKSB8ICgweDEgPDwzKSB8CisJKDI0IDw8IDQpIHwgKDMyIDw8IDExKSB8ICgyNCA8PCAxOCkgfCAoMzIgPDwgMjUpOworICAgIFdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9BWElVUkdfQ1RMLCBkYXRhMzIpOworI2VuZGlmCisJcmV0dXJuOworfQorCisKKyNpZmRlZiBDT05GSUdfSEVWQ19DTEtfRk9SQ0VEX09OCitzdGF0aWMgdm9pZCBjb25maWdfYXYxX2Nsa19mb3JjZWRfb24odm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgcmRhdGEzMjsKKwkvKklRSVQqLworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19JUUlUX0NMS19SU1RfQ1RSTCk7CisJV1JJVEVfVlJFRyhIRVZDX0lRSVRfQ0xLX1JTVF9DVFJMLCByZGF0YTMyIHwgKDB4MSA8PCAyKSk7CisKKwkvKiBEQkxLKi8KKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfREJMS19DRkcwKTsKKwlXUklURV9WUkVHKEhFVkNfREJMS19DRkcwLCByZGF0YTMyIHwgKDB4MSA8PCAyKSk7CisKKwkvKiBTQU8qLworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDEpOworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDEsIHJkYXRhMzIgfCAoMHgxIDw8IDIpKTsKKworCS8qTVBSRUQqLworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19NUFJFRF9DVFJMMSk7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0NUUkwxLCByZGF0YTMyIHwgKDB4MSA8PCAyNCkpOworCisJLyogUEFSU0VSKi8KKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0NPTlRST0wpOworCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fQ09OVFJPTCwgcmRhdGEzMiB8ICgweDEgPDwgMTUpKTsKKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0hJRlRfQ09OVFJPTCk7CisJV1JJVEVfVlJFRyhIRVZDX1NISUZUX0NPTlRST0wsIHJkYXRhMzIgfCAoMHgxIDw8IDE1KSk7CisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX0NBQkFDX0NPTlRST0wpOworCVdSSVRFX1ZSRUcoSEVWQ19DQUJBQ19DT05UUk9MLCByZGF0YTMyIHwgKDB4MSA8PCAxMykpOworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfQ09SRV9DT05UUk9MKTsKKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0NPUkVfQ09OVFJPTCwgcmRhdGEzMiB8ICgweDEgPDwgMTUpKTsKKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0lOVF9DT05UUk9MKTsKKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0lOVF9DT05UUk9MLCByZGF0YTMyIHwgKDB4MSA8PCAxNSkpOworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfSUZfQ09OVFJPTCk7CisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9JRl9DT05UUk9MLAorCQkJcmRhdGEzMiB8ICgweDEgPDwgNikgfCAoMHgxIDw8IDMpIHwgKDB4MSA8PCAxKSk7CisKKwkvKklQUCovCisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDRF9JUFBfRFlOQ0xLR0FURV9DT05GSUcpOworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX0RZTkNMS0dBVEVfQ09ORklHLCByZGF0YTMyIHwgMHhmZmZmZmZmZik7CisKKwkvKiBNQ1JDQyovCisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDRF9NQ1JDQ19DVEwxKTsKKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDEsIHJkYXRhMzIgfCAoMHgxIDw8IDMpKTsKK30KKyNlbmRpZgorCisKK3N0YXRpYyBpbnQgdmF2MV9tbXVfbWFwX2FsbG9jKHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlpZiAoaHctPm1tdV9lbmFibGUpIHsKKwkJdTMyIG1tdV9tYXBfc2l6ZSA9IHZhdjFfZnJhbWVfbW11X21hcF9zaXplKGh3KTsKKwkJaHctPmZyYW1lX21tdV9tYXBfYWRkciA9CisJCQlkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCW1tdV9tYXBfc2l6ZSwKKwkJCQkmaHctPmZyYW1lX21tdV9tYXBfcGh5X2FkZHIsIEdGUF9LRVJORUwpOworCQlpZiAoaHctPmZyYW1lX21tdV9tYXBfYWRkciA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgY291bnRfYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbWVtc2V0KGh3LT5mcmFtZV9tbXVfbWFwX2FkZHIsIDAsIG1tdV9tYXBfc2l6ZSk7CisJfQorI2lmZGVmIEFPTV9BVjFfTU1VX0RXCisJaWYgKGh3LT5kd19tbXVfZW5hYmxlKSB7CisJCXUzMiBtbXVfbWFwX3NpemUgPSB2YW9tX2R3X2ZyYW1lX21tdV9tYXBfc2l6ZShodyk7CisJCWh3LT5kd19mcmFtZV9tbXVfbWFwX2FkZHIgPQorCQkJZG1hX2FsbG9jX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQltbXVfbWFwX3NpemUsCisJCQkJJmh3LT5kd19mcmFtZV9tbXVfbWFwX3BoeV9hZGRyLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGh3LT5kd19mcmFtZV9tbXVfbWFwX2FkZHIgPT0gTlVMTCkgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFsbG9jIGNvdW50X2J1ZmZlclxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC0xOworCQl9CisJCW1lbXNldChody0+ZHdfZnJhbWVfbW11X21hcF9hZGRyLCAwLCBtbXVfbWFwX3NpemUpOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHZhdjFfbW11X21hcF9mcmVlKHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlpZiAoaHctPm1tdV9lbmFibGUpIHsKKwkJdTMyIG1tdV9tYXBfc2l6ZSA9IHZhdjFfZnJhbWVfbW11X21hcF9zaXplKGh3KTsKKwkJaWYgKGh3LT5mcmFtZV9tbXVfbWFwX2FkZHIpIHsKKwkJCWlmIChody0+ZnJhbWVfbW11X21hcF9waHlfYWRkcikKKwkJCQlkbWFfZnJlZV9jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJCW1tdV9tYXBfc2l6ZSwKKwkJCQkJaHctPmZyYW1lX21tdV9tYXBfYWRkciwKKwkJCQkJaHctPmZyYW1lX21tdV9tYXBfcGh5X2FkZHIpOworCQkJaHctPmZyYW1lX21tdV9tYXBfYWRkciA9IE5VTEw7CisJCX0KKwl9CisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKwlpZiAoaHctPmR3X21tdV9lbmFibGUpIHsKKwkJdTMyIG1tdV9tYXBfc2l6ZSA9IHZhb21fZHdfZnJhbWVfbW11X21hcF9zaXplKGh3KTsKKwkJaWYgKGh3LT5kd19mcmFtZV9tbXVfbWFwX2FkZHIpIHsKKwkJCWlmIChody0+ZHdfZnJhbWVfbW11X21hcF9waHlfYWRkcikKKwkJCQlkbWFfZnJlZV9jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJCW1tdV9tYXBfc2l6ZSwKKwkJCQkJaHctPmR3X2ZyYW1lX21tdV9tYXBfYWRkciwKKwkJCQkJaHctPmR3X2ZyYW1lX21tdV9tYXBfcGh5X2FkZHIpOworCQkJaHctPmR3X2ZyYW1lX21tdV9tYXBfYWRkciA9IE5VTEw7CisJCX0KKwl9CisjZW5kaWYKK30KKworCitzdGF0aWMgdm9pZCBhdjFfbG9jYWxfdW5pbml0KHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlody0+cnBtX3B0ciA9IE5VTEw7CisJaHctPmxtZW1fcHRyID0gTlVMTDsKKyNpZmRlZiBEVU1QX0ZJTE1HUkFJTgorCWh3LT5mZ19wdHIgPSBOVUxMOworCWlmIChody0+ZmdfYWRkcikgeworCQlpZiAoaHctPmZnX3BoeV9hZGRyKQorCQkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCUZHU19UQUJMRV9TSVpFLCBody0+ZmdfYWRkciwKKwkJCQlody0+ZmdfcGh5X2FkZHIpOworCQlody0+ZmdfYWRkciA9IE5VTEw7CisJfQorI2VuZGlmCisJaWYgKGh3LT5ycG1fYWRkcikgeworCQlkbWFfZnJlZV9jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJCVJQTV9CVUZfU0laRSwKKwkJCQkJaHctPnJwbV9hZGRyLAorCQkJCQlody0+cnBtX3BoeV9hZGRyKTsKKwkJaHctPnJwbV9hZGRyID0gTlVMTDsKKwl9CisJaWYgKGh3LT5hdXhfYWRkcikgeworCQlkbWFfZnJlZV9jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJaHctPnByZWZpeF9hdXhfc2l6ZSArIGh3LT5zdWZmaXhfYXV4X3NpemUsIGh3LT5hdXhfYWRkciwKKwkJCQkJaHctPmF1eF9waHlfYWRkcik7CisJCWh3LT5hdXhfYWRkciA9IE5VTEw7CisJfQorI2lmIChkZWZpbmVkIERFQlVHX1VDT0RFX0xPRykgfHwgKGRlZmluZWQgREVCVUdfQ01EKQorCWlmIChody0+dWNvZGVfbG9nX2FkZHIpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCVVDT0RFX0xPR19CVUZfU0laRSwgaHctPnVjb2RlX2xvZ19hZGRyLAorCQkJCQlody0+dWNvZGVfbG9nX3BoeV9hZGRyKTsKKwkJaHctPnVjb2RlX2xvZ19hZGRyID0gTlVMTDsKKwl9CisjZW5kaWYKKwlpZiAoaHctPmxtZW1fYWRkcikgeworCQlpZiAoaHctPmxtZW1fcGh5X2FkZHIpCisJCQlkbWFfZnJlZV9jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJTE1FTV9CVUZfU0laRSwgaHctPmxtZW1fYWRkciwKKwkJCQlody0+bG1lbV9waHlfYWRkcik7CisJCWh3LT5sbWVtX2FkZHIgPSBOVUxMOworCX0KKwlpZiAoaHctPnByb2JfYnVmZmVyX2FkZHIpIHsKKwkJaWYgKGh3LT5wcm9iX2J1ZmZlcl9waHlfYWRkcikKKwkJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlQUk9CX0JVRl9TSVpFLCBody0+cHJvYl9idWZmZXJfYWRkciwKKwkJCQlody0+cHJvYl9idWZmZXJfcGh5X2FkZHIpOworCisJCWh3LT5wcm9iX2J1ZmZlcl9hZGRyID0gTlVMTDsKKwl9CisJaWYgKGh3LT5jb3VudF9idWZmZXJfYWRkcikgeworCQlpZiAoaHctPmNvdW50X2J1ZmZlcl9waHlfYWRkcikKKwkJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlDT1VOVF9CVUZfU0laRSwgaHctPmNvdW50X2J1ZmZlcl9hZGRyLAorCQkJCWh3LT5jb3VudF9idWZmZXJfcGh5X2FkZHIpOworCisJCWh3LT5jb3VudF9idWZmZXJfYWRkciA9IE5VTEw7CisJfQorCisJdmF2MV9tbXVfbWFwX2ZyZWUoaHcpOworCisJaWYgKGh3LT5ndnMpCisJCXZmcmVlKGh3LT5ndnMpOworCWh3LT5ndnMgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGF2MV9sb2NhbF9pbml0KHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlpbnQgcmV0ID0gLTE7CisJLyppbnQgbG9zbGVzc19jb21wX2hlYWRlcl9zaXplLCBsb3NsZXNzX2NvbXBfYm9keV9zaXplOyovCisKKwlzdHJ1Y3QgQnVmZkluZm9fcyAqY3VyX2J1Zl9pbmZvID0gTlVMTDsKKworCW1lbXNldCgmaHctPnBhcmFtLCAwLCBzaXplb2YodW5pb24gcGFyYW1fdSkpOworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwljdXJfYnVmX2luZm8gPSAmaHctPndvcmtfc3BhY2VfYnVmX3N0b3JlOworICAgIGh3LT5wYmktPndvcmtfc3BhY2VfYnVmID0gY3VyX2J1Zl9pbmZvOworI2lmIDAKKwlpZiAodmRlY19pc19zdXBwb3J0XzRrKCkpIHsKKwkJbWVtY3B5KGN1cl9idWZfaW5mbywgJmFvbV93b3JrYnVmZl9zcGVjWzFdLAkvKiA4ayAqLworCQkJc2l6ZW9mKHN0cnVjdCBCdWZmSW5mb19zKSk7CisJfSBlbHNlCisJCW1lbWNweShjdXJfYnVmX2luZm8sICZhb21fd29ya2J1ZmZfc3BlY1swXSwvKiAxMDgwcCAqLworCQlzaXplb2Yoc3RydWN0IEJ1ZmZJbmZvX3MpKTsKKyNlbmRpZgorCW1lbWNweShjdXJfYnVmX2luZm8sICZhb21fd29ya2J1ZmZfc3BlY1tody0+YnVmZmVyX3NwZWNfaW5kZXhdLAorCQlzaXplb2Yoc3RydWN0IEJ1ZmZJbmZvX3MpKTsKKworCWN1cl9idWZfaW5mby0+c3RhcnRfYWRyID0gaHctPmJ1Zl9zdGFydDsKKwlpZiAoIWh3LT5tbXVfZW5hYmxlKQorCQlody0+bWNfYnVmX3NwZWMuYnVmX2VuZCA9IGh3LT5idWZfc3RhcnQgKyBody0+YnVmX3NpemU7CisKKyNlbHNlCisvKiEgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVCovCisjaWYgMAorCWlmICh2ZGVjX2lzX3N1cHBvcnRfNGsoKSkgeworCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpCisJCQljdXJfYnVmX2luZm8gPSAmYW9tX3dvcmtidWZmX3NwZWNbMV07LyogOGsgd29yayBzcGFjZSAqLworCQllbHNlCisJCQljdXJfYnVmX2luZm8gPSAmYW9tX3dvcmtidWZmX3NwZWNbMV07LyogNGsyayB3b3JrIHNwYWNlICovCisJfSBlbHNlCisJCWN1cl9idWZfaW5mbyA9ICZhb21fd29ya2J1ZmZfc3BlY1swXTsvKiAxMDgwcCB3b3JrIHNwYWNlICovCisjZW5kaWYKKwltZW1jcHkoY3VyX2J1Zl9pbmZvLCAmYW9tX3dvcmtidWZmX3NwZWNbaHctPmJ1ZmZlcl9zcGVjX2luZGV4XSwKKwkJc2l6ZW9mKHN0cnVjdCBCdWZmSW5mb19zKSk7CisjZW5kaWYKKworCWluaXRfYnVmZl9zcGVjKGh3LCBjdXJfYnVmX2luZm8pOworCWFvbV9idWZtZ3JfaW5pdChodywgY3VyX2J1Zl9pbmZvLCBOVUxMKTsKKworCWlmICghdmRlY19pc19zdXBwb3J0XzRrKCkKKwkJJiYgKGJ1Zl9hbGxvY193aWR0aCA+IDE5MjAgJiYgIGJ1Zl9hbGxvY19oZWlnaHQgPiAxMDg4KSkgeworCQlidWZfYWxsb2Nfd2lkdGggPSAxOTIwOworCQlidWZfYWxsb2NfaGVpZ2h0ID0gMTA4ODsKKwkJaWYgKGh3LT5tYXhfcGljX3cgPiAxOTIwICYmIGh3LT5tYXhfcGljX2ggPiAxMDg4KSB7CisJCQlody0+bWF4X3BpY193ID0gMTkyMDsKKwkJCWh3LT5tYXhfcGljX2ggPSAxMDg4OworCQl9CisJfSBlbHNlIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkgeworCQlidWZfYWxsb2Nfd2lkdGggPSA4MTkyOworCQlidWZfYWxsb2NfaGVpZ2h0ID0gNDYwODsKKwl9CisKKwlody0+aW5pdF9waWNfdyA9IGh3LT5tYXhfcGljX3cgPyBody0+bWF4X3BpY193IDoKKwkJKGh3LT52YXYxX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoID8gaHctPnZhdjFfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGggOgorCQkoYnVmX2FsbG9jX3dpZHRoID8gYnVmX2FsbG9jX3dpZHRoIDogaHctPndvcmtfc3BhY2VfYnVmLT5tYXhfd2lkdGgpKTsKKwlody0+aW5pdF9waWNfaCA9IGh3LT5tYXhfcGljX2ggPyBody0+bWF4X3BpY19oIDoKKwkJKGh3LT52YXYxX2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodCA/IGh3LT52YXYxX2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodCA6CisJCShidWZfYWxsb2NfaGVpZ2h0ID8gYnVmX2FsbG9jX2hlaWdodCA6IGh3LT53b3JrX3NwYWNlX2J1Zi0+bWF4X2hlaWdodCkpOworCisgICAgaHctPnBiaS0+ZnJhbWVfd2lkdGggPSBody0+aW5pdF9waWNfdzsKKyAgICBody0+cGJpLT5mcmFtZV9oZWlnaHQgPSBody0+aW5pdF9waWNfaDsKKworCS8qIHZpZGVvIGlzIG5vdCBzdXBwb3J0IHVuYWxpZ25lZCB3aXRoIDY0IGluIHRsMQorCSoqIHZkZWMgY2FudmFzIG1vZGUgd2lsbCBiZSBsaW5lYXIgd2hlbiBkdW1wIHl1diBpcyBzZXQKKwkqLworCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpICYmCisJCShody0+ZG91YmxlX3dyaXRlX21vZGUgIT0gMCkgJiYKKwkJKCgoaHctPm1heF9waWNfdyAlIDY0KSAhPSAwKSB8fAorCQkoaHctPnZhdjFfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGggJSA2NCkgIT0gMCkpIHsKKwkJaWYgKGh3X3RvX3ZkZWMoaHcpLT5jYW52YXNfbW9kZSAhPQorCQkJQ0FOVkFTX0JMS01PREVfTElORUFSKQorCQkJaHctPm1lbV9tYXBfbW9kZSA9IDI7CisJCWVsc2UgeworCQkJaHctPm1lbV9tYXBfbW9kZSA9IDA7CisJCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLCAidmRlYyBibGttb2QgbGluZWFyLCBmb3JjZSBtZW1fbWFwX21vZGUgMFxuIik7CisJCX0KKwl9CisKKyNpZiAwCisvL25kZWYgTVZfVVNFX0ZJWEVEX0JVRgorCWlmIChpbml0X212X2J1Zl9saXN0KGh3KSA8IDApIHsKKwkJcHJfZXJyKCIlczogaW5pdF9tdl9idWZfbGlzdCBmYWlsXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtMTsKKwl9CisjZW5kaWYKKworCWh3LT5tdl9idWZfbWFyZ2luID0gbXZfYnVmX21hcmdpbjsKKwlpZiAoSVNfNEtfU0laRShody0+aW5pdF9waWNfdywgaHctPmluaXRfcGljX2gpKSB7CisJCWh3LT51c2VkX2J1Zl9udW0gPSBNQVhfQlVGX05VTV9MRVNTICsgZHluYW1pY19idWZfbnVtX21hcmdpbjsKKwkJaWYgKGh3LT51c2VkX2J1Zl9udW0gPiBSRUZfRlJBTUVTXzRLKQorCQkJaHctPm12X2J1Zl9tYXJnaW4gPSBody0+dXNlZF9idWZfbnVtIC0gUkVGX0ZSQU1FU180SyArIDE7CisJfQorCWVsc2UKKwkJaHctPnVzZWRfYnVmX251bSA9IG1heF9idWZfbnVtICsgZHluYW1pY19idWZfbnVtX21hcmdpbjsKKworCWlmIChody0+aXNfdXNlZF92NGwpCisJCWh3LT51c2VkX2J1Zl9udW0gPSA5ICsgaHctPmR5bmFtaWNfYnVmX251bV9tYXJnaW47CisKKwlpZiAoaHctPnVzZWRfYnVmX251bSA+IE1BWF9CVUZfTlVNKQorCQlody0+dXNlZF9idWZfbnVtID0gTUFYX0JVRl9OVU07CisJaWYgKGh3LT51c2VkX2J1Zl9udW0gPiBGUkFNRV9CVUZGRVJTKQorCQlody0+dXNlZF9idWZfbnVtID0gRlJBTUVfQlVGRkVSUzsKKworCWh3LT5wdHNfdW5zdGFibGUgPSAoKHVuc2lnbmVkIGxvbmcpKGh3LT52YXYxX2Ftc3RyZWFtX2RlY19pbmZvLnBhcmFtKQorCQkJJiAweDQwKSA+PiA2OworCisJaWYgKChkZWJ1ZyAmIEFPTV9BVjFfREVCVUdfU0VORF9QQVJBTV9XSVRIX1JFRykgPT0gMCkgeworCQlody0+cnBtX2FkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCVJQTV9CVUZfU0laRSwKKwkJCQkmaHctPnJwbV9waHlfYWRkciwgR0ZQX0tFUk5FTCk7CisJCWlmIChody0+cnBtX2FkZHIgPT0gTlVMTCkgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFsbG9jIHJwbSBidWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlody0+cnBtX3B0ciA9IGh3LT5ycG1fYWRkcjsKKwl9CisKKwlpZiAocHJlZml4X2F1eF9idWZfc2l6ZSA+IDAgfHwKKwkJc3VmZml4X2F1eF9idWZfc2l6ZSA+IDApIHsKKwkJdTMyIGF1eF9idWZfc2l6ZTsKKworCQlody0+cHJlZml4X2F1eF9zaXplID0gQVVYX0JVRl9BTElHTihwcmVmaXhfYXV4X2J1Zl9zaXplKTsKKwkJaHctPnN1ZmZpeF9hdXhfc2l6ZSA9IEFVWF9CVUZfQUxJR04oc3VmZml4X2F1eF9idWZfc2l6ZSk7CisJCWF1eF9idWZfc2l6ZSA9IGh3LT5wcmVmaXhfYXV4X3NpemUgKyBody0+c3VmZml4X2F1eF9zaXplOworCQlody0+YXV4X2FkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCWF1eF9idWZfc2l6ZSwgJmh3LT5hdXhfcGh5X2FkZHIsIEdGUF9LRVJORUwpOworCQlpZiAoaHctPmF1eF9hZGRyID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvYyBycG0gYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJCQlnb3RvIGRtYV9hbGxvY19mYWlsOworCQl9CisJfQorI2lmIChkZWZpbmVkIERFQlVHX1VDT0RFX0xPRykgfHwgKGRlZmluZWQgREVCVUdfQ01EKQorCS8vaWYgKHVkZWJ1Z19mbGFnICYgMHg4KSB7CisJCWh3LT51Y29kZV9sb2dfYWRkciA9IGRtYV9hbGxvY19jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJVUNPREVfTE9HX0JVRl9TSVpFLCAmaHctPnVjb2RlX2xvZ19waHlfYWRkciwgR0ZQX0tFUk5FTCk7CisJCWlmIChody0+dWNvZGVfbG9nX2FkZHIgPT0gTlVMTCkgeworCQkJaHctPnVjb2RlX2xvZ19waHlfYWRkciA9IDA7CisJCX0KKwkJcHJfaW5mbygiJXM6IGFsbG9jIHVjb2RlIGxvZyBidWZmZXIgJXBcbiIsCisJCQlfX2Z1bmNfXywgaHctPnVjb2RlX2xvZ19hZGRyKTsKKwkvL30KKyNlbmRpZgorI2lmZGVmIERVTVBfRklMTUdSQUlOCisJaHctPmZnX2FkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJRkdTX1RBQkxFX1NJWkUsCisJCQkmaHctPmZnX3BoeV9hZGRyLCBHRlBfS0VSTkVMKTsKKwlpZiAoaHctPmZnX2FkZHIgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgZmcgYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJfQorCWh3LT5mZ19wdHIgPSBody0+ZmdfYWRkcjsKKyNlbmRpZgorCWh3LT5sbWVtX2FkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJTE1FTV9CVUZfU0laRSwKKwkJCSZody0+bG1lbV9waHlfYWRkciwgR0ZQX0tFUk5FTCk7CisJaWYgKGh3LT5sbWVtX2FkZHIgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgbG1lbSBidWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJZ290byBkbWFfYWxsb2NfZmFpbDsKKwl9CisJaHctPmxtZW1fcHRyID0gaHctPmxtZW1fYWRkcjsKKworCWh3LT5wcm9iX2J1ZmZlcl9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlQUk9CX0JVRl9TSVpFLAorCQkJCSZody0+cHJvYl9idWZmZXJfcGh5X2FkZHIsIEdGUF9LRVJORUwpOworCWlmIChody0+cHJvYl9idWZmZXJfYWRkciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvYyBwcm9iX2J1ZmZlclxuIiwgX19mdW5jX18pOworCQlnb3RvIGRtYV9hbGxvY19mYWlsOworCX0KKwltZW1zZXQoaHctPnByb2JfYnVmZmVyX2FkZHIsIDAsIFBST0JfQlVGX1NJWkUpOworCWh3LT5jb3VudF9idWZmZXJfYWRkciA9IGRtYV9hbGxvY19jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJQ09VTlRfQlVGX1NJWkUsCisJCQkJJmh3LT5jb3VudF9idWZmZXJfcGh5X2FkZHIsIEdGUF9LRVJORUwpOworCWlmIChody0+Y291bnRfYnVmZmVyX2FkZHIgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgY291bnRfYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZG1hX2FsbG9jX2ZhaWw7CisJfQorCW1lbXNldChody0+Y291bnRfYnVmZmVyX2FkZHIsIDAsIENPVU5UX0JVRl9TSVpFKTsKKworCXZkZWNfc2V0X3ZmcmFtZV9jb21tKGh3X3RvX3ZkZWMoaHcpLCBEUklWRVJfTkFNRSk7CisJcmV0ID0gdmF2MV9tbXVfbWFwX2FsbG9jKGh3KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBkbWFfYWxsb2NfZmFpbDsKKworCXJldHVybiByZXQ7CisKK2RtYV9hbGxvY19mYWlsOgorCWF2MV9sb2NhbF91bmluaXQoaHcpOworCXJldHVybiAtMTsKK30KKworCisjZGVmaW5lIHNwZWMyY2FudmFzKHgpICBcCisJKCgoeCktPnV2X2NhbnZhc19pbmRleCA8PCAxNikgfCBcCisJICgoeCktPnV2X2NhbnZhc19pbmRleCA8PCA4KSAgfCBcCisJICgoeCktPnlfY2FudmFzX2luZGV4IDw8IDApKQorCisKK3N0YXRpYyB2b2lkIHNldF9jYW52YXMoc3RydWN0IEFWMUhXX3MgKmh3LAorCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpwaWNfY29uZmlnKQoreworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGh3KTsKKwlpbnQgY2FudmFzX3cgPSBBTElHTihwaWNfY29uZmlnLT55X2Nyb3Bfd2lkdGgsIDY0KS80OworCWludCBjYW52YXNfaCA9IEFMSUdOKHBpY19jb25maWctPnlfY3JvcF9oZWlnaHQsIDMyKS80OworCWludCBibGttb2RlID0gaHctPm1lbV9tYXBfbW9kZTsKKwkvKkNBTlZBU19CTEtNT0RFXzY0WDMyKi8KKwlpZgkocGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGUpIHsKKwkJY2FudmFzX3cgPSBwaWNfY29uZmlnLT55X2Nyb3Bfd2lkdGgJLworCQkJCWdldF9kb3VibGVfd3JpdGVfcmF0aW8oCisJCQkJCXBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlICYgMHhmKTsKKwkJY2FudmFzX2ggPSBwaWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0IC8KKwkJCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKAorCQkJCQlwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4Zik7CisKKwkJLyogc2FvIGN0cmwxIGNvbmZpZyBhbGlnbmVkIHdpdGggNjQsIHNvIGFsaWduZWQgd2l0aCA2NCBzYW1lICovCisJCWNhbnZhc193ID0gQUxJR04oY2FudmFzX3csIDY0KTsKKwkJY2FudmFzX2ggPSBBTElHTihjYW52YXNfaCwgMzIpOworCisJCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQkJaWYgKHBpY19jb25maWctPnlfY2FudmFzX2luZGV4ID09IC0xKQorCQkJCXBpY19jb25maWctPnlfY2FudmFzX2luZGV4ID0KKwkJCQkJdmRlYy0+Z2V0X2NhbnZhc19leChDT1JFX01BU0tfSEVWQywgdmRlYy0+aWQpOworCQkJaWYgKHBpY19jb25maWctPnV2X2NhbnZhc19pbmRleCA9PSAtMSkKKwkJCQlwaWNfY29uZmlnLT51dl9jYW52YXNfaW5kZXggPQorCQkJCQl2ZGVjLT5nZXRfY2FudmFzX2V4KENPUkVfTUFTS19IRVZDLCB2ZGVjLT5pZCk7CisJCX0gZWxzZSB7CisJCQlwaWNfY29uZmlnLT55X2NhbnZhc19pbmRleCA9IDEyOCArIHBpY19jb25maWctPmluZGV4ICogMjsKKwkJCXBpY19jb25maWctPnV2X2NhbnZhc19pbmRleCA9IDEyOCArIHBpY19jb25maWctPmluZGV4ICogMiArIDE7CisJCX0KKworCQljb25maWdfY2F2X2x1dF9leChwaWNfY29uZmlnLT55X2NhbnZhc19pbmRleCwKKwkJCXBpY19jb25maWctPmR3X3lfYWRyLCBjYW52YXNfdywgY2FudmFzX2gsCisJCQlDQU5WQVNfQUREUl9OT1dSQVAsIGJsa21vZGUsIGh3LT5pc191c2VkX3Y0bCA/IDAgOiA3LCBWREVDX0hFVkMpOworCQljb25maWdfY2F2X2x1dF9leChwaWNfY29uZmlnLT51dl9jYW52YXNfaW5kZXgsCisJCQlwaWNfY29uZmlnLT5kd191X3ZfYWRyLAljYW52YXNfdywgY2FudmFzX2gsCisJCQlDQU5WQVNfQUREUl9OT1dSQVAsIGJsa21vZGUsIGh3LT5pc191c2VkX3Y0bCA/IDAgOiA3LCBWREVDX0hFVkMpOworCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQlwaWNfY29uZmlnLT5jYW52YXNfY29uZmlnWzBdLnBoeV9hZGRyID0KKwkJCQlwaWNfY29uZmlnLT5kd195X2FkcjsKKwkJcGljX2NvbmZpZy0+Y2FudmFzX2NvbmZpZ1swXS53aWR0aCA9CisJCQkJY2FudmFzX3c7CisJCXBpY19jb25maWctPmNhbnZhc19jb25maWdbMF0uaGVpZ2h0ID0KKwkJCQljYW52YXNfaDsKKwkJcGljX2NvbmZpZy0+Y2FudmFzX2NvbmZpZ1swXS5ibG9ja19tb2RlID0KKwkJCQlibGttb2RlOworCQlwaWNfY29uZmlnLT5jYW52YXNfY29uZmlnWzBdLmVuZGlhbiA9IGh3LT5pc191c2VkX3Y0bCA/IDAgOiA3OworCisJCXBpY19jb25maWctPmNhbnZhc19jb25maWdbMV0ucGh5X2FkZHIgPQorCQkJCXBpY19jb25maWctPmR3X3Vfdl9hZHI7CisJCXBpY19jb25maWctPmNhbnZhc19jb25maWdbMV0ud2lkdGggPQorCQkJCWNhbnZhc193OworCQlwaWNfY29uZmlnLT5jYW52YXNfY29uZmlnWzFdLmhlaWdodCA9CisJCQkJY2FudmFzX2g7CisJCXBpY19jb25maWctPmNhbnZhc19jb25maWdbMV0uYmxvY2tfbW9kZSA9CisJCQkJYmxrbW9kZTsKKwkJcGljX2NvbmZpZy0+Y2FudmFzX2NvbmZpZ1sxXS5lbmRpYW4gPSBody0+aXNfdXNlZF92NGwgPyAwIDogNzsKKyNlbmRpZgorCX0KK30KKworc3RhdGljIHZvaWQgc2V0X2ZyYW1lX2luZm8oc3RydWN0IEFWMUhXX3MgKmh3LCBzdHJ1Y3QgdmZyYW1lX3MgKnZmKQoreworCXVuc2lnbmVkIGludCBhciA9IERJU1BfUkFUSU9fQVNQRUNUX1JBVElPX01BWDsKKwl2Zi0+ZHVyYXRpb24gPSBody0+ZnJhbWVfZHVyOworCXZmLT5kdXJhdGlvbl9wdWxsZG93biA9IDA7CisJdmYtPmZsYWcgPSAwOworCXZmLT5wcm9wLm1hc3Rlcl9kaXNwbGF5X2NvbG91ciA9IGh3LT52Zl9kcDsKKwl2Zi0+c2lnbmFsX3R5cGUgPSBody0+dmlkZW9fc2lnbmFsX3R5cGU7CisJaWYgKHZmLT5jb21wV2lkdGggJiYgdmYtPmNvbXBIZWlnaHQpCisJCWh3LT5mcmFtZV9hciA9IHZmLT5jb21wSGVpZ2h0ICogMHgxMDAgLyB2Zi0+Y29tcFdpZHRoOworCWFyID0gbWluX3QodTMyLCBhciwgRElTUF9SQVRJT19BU1BFQ1RfUkFUSU9fTUFYKTsKKwl2Zi0+cmF0aW9fY29udHJvbCA9IChhciA8PCBESVNQX1JBVElPX0FTUEVDVF9SQVRJT19CSVQpOworCXZmLT5zYXJfd2lkdGggPSAxOworCXZmLT5zYXJfaGVpZ2h0ID0gMTsKKworCWlmIChody0+aXNfdXNlZF92NGwgJiYgaHctPnZmX2RwLnByZXNlbnRfZmxhZykgeworCQlzdHJ1Y3QgYW1sX3ZkZWNfaGRyX2luZm9zIGhkcjsKKwkJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShody0+djRsMl9jdHgpOworCisJCW1lbXNldCgmaGRyLCAwLCBzaXplb2YoaGRyKSk7CisJCWhkci5zaWduYWxfdHlwZSA9IHZmLT5zaWduYWxfdHlwZTsKKwkJaGRyLmNvbG9yX3Bhcm1zID0gaHctPnZmX2RwOworCQl2ZGVjX3Y0bF9zZXRfaGRyX2luZm9zKGN0eCwgJmhkcik7CisJfQorCisJdmYtPnNpZGViaW5kX3R5cGUgPSBody0+c2lkZWJpbmRfdHlwZTsKKwl2Zi0+c2lkZWJpbmRfY2hhbm5lbF9pZCA9IGh3LT5zaWRlYmluZF9jaGFubmVsX2lkOworfQorCitzdGF0aWMgaW50IHZhdjFfdmZfc3RhdGVzKHN0cnVjdCB2ZnJhbWVfc3RhdGVzICpzdGF0ZXMsIHZvaWQgKm9wX2FyZykKK3sKKwlzdHJ1Y3QgQVYxSFdfcyAqaHcgPSAoc3RydWN0IEFWMUhXX3MgKilvcF9hcmc7CisKKwlzdGF0ZXMtPnZmX3Bvb2xfc2l6ZSA9IFZGX1BPT0xfU0laRTsKKwlzdGF0ZXMtPmJ1Zl9mcmVlX251bSA9IGtmaWZvX2xlbigmaHctPm5ld2ZyYW1lX3EpOworCXN0YXRlcy0+YnVmX2F2YWlsX251bSA9IGtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSk7CisKKwlpZiAoc3RlcCA9PSAyKQorCQlzdGF0ZXMtPmJ1Zl9hdmFpbF9udW0gPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2YXYxX3ZmX3BlZWsodm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCB2ZnJhbWVfcyAqdmZbMl0gPSB7MCwgMH07CisJc3RydWN0IEFWMUhXX3MgKmh3ID0gKHN0cnVjdCBBVjFIV19zICopb3BfYXJnOworCisJaWYgKHN0ZXAgPT0gMikKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoa2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKSA+IFZGX1BPT0xfU0laRSkgeworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19CVUZNR1IsCisJCQkia2ZpZm8gbGVuOiVkIGludmFpbGQsIHBlZWsgZXJyb3JcbiIsCisJCQlrZmlmb19sZW4oJmh3LT5kaXNwbGF5X3EpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGtmaWZvX291dF9wZWVrKCZody0+ZGlzcGxheV9xLCAodm9pZCAqKSZ2ZiwgMikpIHsKKwkJaWYgKHZmWzFdKSB7CisJCQl2ZlswXS0+bmV4dF92Zl9wdHNfdmFsaWQgPSB0cnVlOworCQkJdmZbMF0tPm5leHRfdmZfcHRzID0gdmZbMV0tPnB0czsKKwkJfSBlbHNlCisJCQl2ZlswXS0+bmV4dF92Zl9wdHNfdmFsaWQgPSBmYWxzZTsKKwkJcmV0dXJuIHZmWzBdOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2YXYxX3ZmX2dldCh2b2lkICpvcF9hcmcpCit7CisJc3RydWN0IHZmcmFtZV9zICp2ZjsKKwlzdHJ1Y3QgQVYxSFdfcyAqaHcgPSAoc3RydWN0IEFWMUhXX3MgKilvcF9hcmc7CisKKwlpZiAoc3RlcCA9PSAyKQorCQlyZXR1cm4gTlVMTDsKKwllbHNlIGlmIChzdGVwID09IDEpCisJCQlzdGVwID0gMjsKKworCWlmIChrZmlmb19nZXQoJmh3LT5kaXNwbGF5X3EsICZ2ZikpIHsKKwkJc3RydWN0IHZmcmFtZV9zICpuZXh0X3ZmID0gTlVMTDsKKwkJdWludDhfdCBpbmRleCA9IHZmLT5pbmRleCAmIDB4ZmY7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kaXNwX3FfbmFtZSwga2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKSk7CisJCWlmIChpbmRleCA8IGh3LT51c2VkX2J1Zl9udW0gfHwKKwkJCSh2Zi0+dHlwZSAmIFZJRFRZUEVfVjRMX0VPUykpIHsKKwkJCWh3LT52Zl9nZXRfY291bnQrKzsKKwkJCXZmLT5pbmRleF9kaXNwID0gaHctPnZmX2dldF9jb3VudDsKKwkJCWlmIChkZWJ1ZyAmIEFPTV9ERUJVR19WRlJBTUUpIHsKKwkJCQlzdHJ1Y3QgQnVmZmVyUG9vbF9zICpwb29sID0gaHctPmNvbW1vbi5idWZmZXJfcG9vbDsKKwkJCQlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljID0KKwkJCQkJJnBvb2wtPmZyYW1lX2J1ZnNbaW5kZXhdLmJ1ZjsKKwkJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJCWxvY2tfYnVmZmVyX3Bvb2woaHctPmNvbW1vbi5idWZmZXJfcG9vbCwgZmxhZ3MpOworCQkJCWF2MV9wcmludChodywgQU9NX0RFQlVHX1ZGUkFNRSwgIiVzIGluZGV4IDB4JXggdHlwZSAweCV4IHcvaCAlZC8lZCwgYXV4IHNpemUgJWQsIHB0cyAlZCwgJWxsZCwgdHM6ICVsbHVcbiIsCisJCQkJCV9fZnVuY19fLCB2Zi0+aW5kZXgsIHZmLT50eXBlLAorCQkJCQl2Zi0+d2lkdGgsIHZmLT5oZWlnaHQsCisJCQkJCXBpYy0+YXV4X2RhdGFfc2l6ZSwKKwkJCQkJdmYtPnB0cywKKwkJCQkJdmYtPnB0c191czY0LAorCQkJCQl2Zi0+dGltZXN0YW1wKTsKKwkJCQl1bmxvY2tfYnVmZmVyX3Bvb2woaHctPmNvbW1vbi5idWZmZXJfcG9vbCwgZmxhZ3MpOworCQkJfQorCisJCQlpZiAoa2ZpZm9fcGVlaygmaHctPmRpc3BsYXlfcSwgJm5leHRfdmYpICYmIG5leHRfdmYpIHsKKwkJCQl2Zi0+bmV4dF92Zl9wdHNfdmFsaWQgPSB0cnVlOworCQkJCXZmLT5uZXh0X3ZmX3B0cyA9IG5leHRfdmYtPnB0czsKKwkJCX0gZWxzZQorCQkJCXZmLT5uZXh0X3ZmX3B0c192YWxpZCA9IGZhbHNlOworI2lmZGVmIERVTVBfRklMTUdSQUlOCisJCQlpZiAoaW5kZXggPT0gZmdfZHVtcF9pbmRleCkgeworCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkJaW50IGlpOworCQkJCWxvY2tfYnVmZmVyX3Bvb2woaHctPmNvbW1vbi5idWZmZXJfcG9vbCwgZmxhZ3MpOworCQkJCXByX2luZm8oIkZHU19UQUJMRSBmb3IgYnVmZmVyICVkOlxuIiwgaW5kZXgpOworCQkJCWZvciAoaWkgPSAwOyBpaSA8IEZHU19UQUJMRV9TSVpFOyBpaSsrKSB7CisJCQkgICAgICAgIHByX2luZm8oIiUwMnggIiwgaHctPmZnX3B0cltpaV0pOworCSAgICAgICAgCQlpZiAoKChpaSsgMSkgJiAweGYpID09IDApCisJCQkJCQlwcl9pbmZvKCJcbiIpOworCSAgICAJCX0KKwkJCQl1bmxvY2tfYnVmZmVyX3Bvb2woaHctPmNvbW1vbi5idWZmZXJfcG9vbCwgZmxhZ3MpOworCQkJfQorI2VuZGlmCisKKwkJCXJldHVybiB2ZjsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgdmF2MV92Zl9wdXQoc3RydWN0IHZmcmFtZV9zICp2Ziwgdm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCBBVjFIV19zICpodyA9IChzdHJ1Y3QgQVYxSFdfcyAqKW9wX2FyZzsKKwl1aW50OF90IGluZGV4ID0gdmYtPmluZGV4ICYgMHhmZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCh2ZiA9PSBOVUxMKSB8fCAoaHcgPT0gTlVMTCkpCisJCXJldHVybjsKKworCWtmaWZvX3B1dCgmaHctPm5ld2ZyYW1lX3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLm5ld19xX25hbWUsIGtmaWZvX2xlbigmaHctPm5ld2ZyYW1lX3EpKTsKKwlody0+dmZfcHV0X2NvdW50Kys7CisJaWYgKGRlYnVnICYgQU9NX0RFQlVHX1ZGUkFNRSkgeworCQlsb2NrX2J1ZmZlcl9wb29sKGh3LT5jb21tb24uYnVmZmVyX3Bvb2wsIGZsYWdzKTsKKwkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfVkZSQU1FLCAiJXMgaW5kZXggMHgleCB0eXBlIDB4JXggdy9oICVkLyVkLCBwdHMgJWQsICVsbGQsIHRzOiAlbGx1XG4iLAorCQkJX19mdW5jX18sIHZmLT5pbmRleCwgdmYtPnR5cGUsCisJCQl2Zi0+d2lkdGgsIHZmLT5oZWlnaHQsCisJCQl2Zi0+cHRzLAorCQkJdmYtPnB0c191czY0LAorCQkJdmYtPnRpbWVzdGFtcCk7CisJCXVubG9ja19idWZmZXJfcG9vbChody0+Y29tbW9uLmJ1ZmZlcl9wb29sLCBmbGFncyk7CisJfQorCisJaWYgKGluZGV4IDwgaHctPnVzZWRfYnVmX251bSkgeworCQlzdHJ1Y3QgQVYxX0NvbW1vbl9zICpjbSA9ICZody0+Y29tbW9uOworCQlzdHJ1Y3QgQnVmZmVyUG9vbF9zICpwb29sID0gY20tPmJ1ZmZlcl9wb29sOworCisJCWxvY2tfYnVmZmVyX3Bvb2woaHctPmNvbW1vbi5idWZmZXJfcG9vbCwgZmxhZ3MpOworCQlpZiAoKGRlYnVnICYgQVYxX0RFQlVHX0lHTk9SRV9WRl9SRUYpID09IDApIHsKKwkJCWlmIChwb29sLT5mcmFtZV9idWZzW2luZGV4XS5idWYudmZfcmVmID4gMCkKKwkJCQlwb29sLT5mcmFtZV9idWZzW2luZGV4XS5idWYudmZfcmVmLS07CisJCX0KKwkJaWYgKGh3LT53YWl0X2J1ZikKKwkJCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTUJPWDBfSVJRX1JFRywKKwkJCQkJCTB4MSk7CisJCWh3LT5sYXN0X3B1dF9pZHggPSBpbmRleDsKKwkJaHctPm5ld19mcmFtZV9kaXNwbGF5ZWQrKzsKKwkJdW5sb2NrX2J1ZmZlcl9wb29sKGh3LT5jb21tb24uYnVmZmVyX3Bvb2wsIGZsYWdzKTsKKwl9CisKK30KKworc3RhdGljIGludCB2YXYxX2V2ZW50X2NiKGludCB0eXBlLCB2b2lkICpkYXRhLCB2b2lkICpvcF9hcmcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgQVYxSFdfcyAqaHcgPSAoc3RydWN0IEFWMUhXX3MgKilvcF9hcmc7CisJc3RydWN0IEFWMV9Db21tb25fcyAqY20gPSAmaHctPmNvbW1vbjsKKwlzdHJ1Y3QgQnVmZmVyUG9vbF9zICpwb29sID0gY20tPmJ1ZmZlcl9wb29sOworCisJaWYgKHR5cGUgJiBWRlJBTUVfRVZFTlRfUkVDRUlWRVJfUkVTRVQpIHsKKyNpZiAwCisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJYW1oZXZjX3N0b3AoKTsKKyNpZm5kZWYgQ09ORklHX0FNTE9HSUNfUE9TVF9QUk9DRVNTX01BTkFHRVIKKwkJdmZfbGlnaHRfdW5yZWdfcHJvdmlkZXIoJnZhdjFfdmZfcHJvdik7CisjZW5kaWYKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5sb2NrLCBmbGFncyk7CisJCXZhdjFfbG9jYWxfaW5pdCgpOworCQl2YXYxX3Byb3RfaW5pdCgpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+bG9jaywgZmxhZ3MpOworI2lmbmRlZiBDT05GSUdfQU1MT0dJQ19QT1NUX1BST0NFU1NfTUFOQUdFUgorCQl2Zl9yZWdfcHJvdmlkZXIoJnZhdjFfdmZfcHJvdik7CisjZW5kaWYKKwkJYW1oZXZjX3N0YXJ0KCk7CisjZW5kaWYKKwl9IGVsc2UgaWYgKHR5cGUgJiBWRlJBTUVfRVZFTlRfUkVDRUlWRVJfR0VUX0FVWF9EQVRBKSB7CisJCXN0cnVjdCBwcm92aWRlcl9hdXhfcmVxX3MgKnJlcSA9CisJCQkoc3RydWN0IHByb3ZpZGVyX2F1eF9yZXFfcyAqKWRhdGE7CisJCXVuc2lnbmVkIGNoYXIgaW5kZXg7CisKKwkJbG9ja19idWZmZXJfcG9vbChody0+Y29tbW9uLmJ1ZmZlcl9wb29sLCBmbGFncyk7CisJCWluZGV4ID0gcmVxLT52Zi0+aW5kZXggJiAweGZmOworCQlyZXEtPmF1eF9idWYgPSBOVUxMOworCQlyZXEtPmF1eF9zaXplID0gMDsKKwkJaWYgKHJlcS0+Ym90X2ZsYWcpCisJCQlpbmRleCA9IChyZXEtPnZmLT5pbmRleCA+PiA4KSAmIDB4ZmY7CisJCWlmIChpbmRleCAhPSAweGZmCisJCQkmJiBpbmRleCA8IGh3LT51c2VkX2J1Zl9udW0pIHsKKwkJCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpwaWNfY29uZmlnID0KKwkJCQkmcG9vbC0+ZnJhbWVfYnVmc1tpbmRleF0uYnVmOworCQkJcmVxLT5hdXhfYnVmID0gcGljX2NvbmZpZy0+YXV4X2RhdGFfYnVmOworCQkJcmVxLT5hdXhfc2l6ZSA9IHBpY19jb25maWctPmF1eF9kYXRhX3NpemU7CisjaWYgMAorLy9kZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwkJCWlmIChody0+YnlwYXNzX2R2ZW5sICYmICFkb2xieV9tZXRhX3dpdGhfZWwpCisJCQkJcmVxLT5kdl9lbmhhbmNlX2V4aXN0ID0gZmFsc2U7CisJCQllbHNlCisJCQkJcmVxLT5kdl9lbmhhbmNlX2V4aXN0ID0KKwkJCQkJcGljX2NvbmZpZy0+ZHZfZW5oYW5jZV9leGlzdDsKKwkJCWF2MV9wcmludChodywgQU9NX0RFQlVHX1ZGUkFNRSwKKwkJCSJxdWVyeSBkdl9lbmhhbmNlX2V4aXN0IGZvciBwaWMgKHZmIDB4JXAsIHBvYyAlZCBpbmRleCAlZCkgZmxhZyA9PiAlZCwgYXV4IHNpemQgMHgleFxuIiwKKwkJCXJlcS0+dmYsCisJCQlwaWNfY29uZmlnLT5QT0MsIGluZGV4LAorCQkJcmVxLT5kdl9lbmhhbmNlX2V4aXN0LCByZXEtPmF1eF9zaXplKTsKKyNlbHNlCisJCQlyZXEtPmR2X2VuaGFuY2VfZXhpc3QgPSAwOworI2VuZGlmCisJCX0KKwkJdW5sb2NrX2J1ZmZlcl9wb29sKGh3LT5jb21tb24uYnVmZmVyX3Bvb2wsIGZsYWdzKTsKKworCQlpZiAoZGVidWcgJiBBT01fREVCVUdfQVVYX0RBVEEpCisJCQlhdjFfcHJpbnQoaHcsIDAsCisJCQkiJXModHlwZSAweCV4IHZmIGluZGV4IDB4JXgpPT5zaXplIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgdHlwZSwgaW5kZXgsIHJlcS0+YXV4X3NpemUpOworCX0gZWxzZSBpZiAodHlwZSAmIFZGUkFNRV9FVkVOVF9SRUNFSVZFUl9SRVFfU1RBVEUpIHsKKwkJc3RydWN0IHByb3ZpZGVyX3N0YXRlX3JlcV9zICpyZXEgPQorCQkJKHN0cnVjdCBwcm92aWRlcl9zdGF0ZV9yZXFfcyAqKWRhdGE7CisJCWlmIChyZXEtPnJlcV90eXBlID09IFJFUV9TVEFURV9TRUNVUkUpCisJCQlyZXEtPnJlcV9yZXN1bHRbMF0gPSB2ZGVjX3NlY3VyZShod190b192ZGVjKGh3KSk7CisJCWVsc2UKKwkJCXJlcS0+cmVxX3Jlc3VsdFswXSA9IDB4ZmZmZmZmZmY7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIGF2MV9pbmNfdmZfcmVmKHN0cnVjdCBBVjFIV19zICpodywgaW50IGluZGV4KQoreworCXN0cnVjdCBBVjFfQ29tbW9uX3MgKmNtID0gJmh3LT5jb21tb247CisKKwlpZiAoKGRlYnVnICYgQVYxX0RFQlVHX0lHTk9SRV9WRl9SRUYpID09IDApIHsKKwkJY20tPmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzW2luZGV4XS5idWYudmZfcmVmKys7CisKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQlVGTUdSX01PUkUsICIlcyBpbmRleCA9ICVkIG5ldyB2Zl9yZWYgPSAlZFxyXG4iLAorCQkJX19mdW5jX18sIGluZGV4LAorCQkJY20tPmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzW2luZGV4XS5idWYudmZfcmVmKTsKKwl9Cit9CisjaWYgMAorc3RhdGljIGludCBmcmFtZV9kdXJhdGlvbl9hZGFwdChzdHJ1Y3QgQVYxSFdfcyAqaHcsIHN0cnVjdCB2ZnJhbWVfcyAqdmYsIHUzMiB2YWxpZCkKK3sKKwl1MzIgb2xkX2R1cmF0aW9uLCBwdHNfZHVyYXRpb24gPSAwOworCXUzMiBwdHMgPSB2Zi0+cHRzOworCisJaWYgKGh3LT5nZXRfZnJhbWVfZHVyID09IHRydWUpCisJCXJldHVybiB0cnVlOworCisJaHctPmZyYW1lX2NudF93aW5kb3crKzsKKwlpZiAoIShody0+YXYxX2ZpcnN0X3B0c19yZWFkeSA9PSAxKSkgeworCQlpZiAodmFsaWQpIHsKKwkJCWh3LT5wdHMxID0gcHRzOworCQkJaHctPmZyYW1lX2NudF93aW5kb3cgPSAwOworCQkJaHctPmR1cmF0aW9uX2Zyb21fcHRzX2RvbmUgPSAwOworCQkJaHctPmF2MV9maXJzdF9wdHNfcmVhZHkgPSAxOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHB0cyA8IGh3LT5wdHMxKSB7CisJCQlpZiAoaHctPmZyYW1lX2NudF93aW5kb3cgPiBGUkFNRV9DTlRfV0lORE9XX1NJWkUpIHsKKwkJCQlody0+cHRzMSA9IHB0czsKKwkJCQlody0+ZnJhbWVfY250X3dpbmRvdyA9IDA7CisJCQl9CisJCX0KKworCQlpZiAodmFsaWQgJiYgKGh3LT5mcmFtZV9jbnRfd2luZG93ID4gRlJBTUVfQ05UX1dJTkRPV19TSVpFKSAmJgorCQkJKHB0cyA+IGh3LT5wdHMxKSAmJiAoaHctPmR1cmF0aW9uX2Zyb21fcHRzX2RvbmUgPT0gMCkpIHsKKwkJCQlvbGRfZHVyYXRpb24gPSBody0+ZnJhbWVfZHVyOworCQkJCWh3LT5wdHMyID0gcHRzOworCQkJCXB0c19kdXJhdGlvbiA9ICgoKGh3LT5wdHMyIC0gaHctPnB0czEpICogMTYpIC8KKwkJCQkJKGh3LT5mcmFtZV9jbnRfd2luZG93ICogMTUpKTsKKworCQkJaWYgKGNsb3NlX3RvKHB0c19kdXJhdGlvbiwgb2xkX2R1cmF0aW9uLCAyMDAwKSkgeworCQkJCWh3LT5mcmFtZV9kdXIgPSBwdHNfZHVyYXRpb247CisJCQkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfT1VUX1BUUywKKwkJCQkJInVzZSBjYWxjIGR1cmF0aW9uICVkXG4iLCBwdHNfZHVyYXRpb24pOworCQkJfQorCisJCQlpZiAoaHctPmR1cmF0aW9uX2Zyb21fcHRzX2RvbmUgPT0gMCkgeworCQkJCWlmIChjbG9zZV90byhwdHNfZHVyYXRpb24sIG9sZF9kdXJhdGlvbiwgUkFURV9DT1JSRUNUSU9OX1RIUkVTSE9MRCkpIHsKKwkJCQkJaHctPmR1cmF0aW9uX2Zyb21fcHRzX2RvbmUgPSAxOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICghY2xvc2VfdG8ocHRzX2R1cmF0aW9uLAorCQkJCQkJIG9sZF9kdXJhdGlvbiwgMTAwMCkgJiYKKwkJCQkJCSFjbG9zZV90byhwdHNfZHVyYXRpb24sCisJCQkJCQlody0+ZnJhbWVfZHVyLCAxMDAwKSAmJgorCQkJCQkJY2xvc2VfdG8ocHRzX2R1cmF0aW9uLAorCQkJCQkJaHctPmxhc3RfZHVyYXRpb24sIDIwMCkpIHsKKwkJCQkJCS8qIGZyYW1lX2R1ciBtdXN0CisJCQkJCQkgKiAgd3JvbmcscmVjb3ZlciBpdC4KKwkJCQkJCSAqLworCQkJCQkJaHctPmZyYW1lX2R1ciA9IHB0c19kdXJhdGlvbjsKKwkJCQkJfQorCQkJCQlody0+cHRzMSA9IGh3LT5wdHMyOworCQkJCQlody0+ZnJhbWVfY250X3dpbmRvdyA9IDA7CisJCQkJCWh3LT5kdXJhdGlvbl9mcm9tX3B0c19kb25lID0gMDsKKwkJCQl9CisJCQl9CisJCQlody0+bGFzdF9kdXJhdGlvbiA9IHB0c19kdXJhdGlvbjsKKwkJfQorCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB1cGRhdGVfdmZfbWVtaGFuZGxlKHN0cnVjdCBBVjFIV19zICpodywKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmLCBzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljKQoreworCS8qIGtlZXBlciBub3QgbmVlZGVkIGZvciB2NGwgc29sdXRpb24gKi8KKwlpZiAoaHctPmlzX3VzZWRfdjRsKQorCQlyZXR1cm47CisKKwlpZiAocGljLT5pbmRleCA8IDApIHsKKwkJdmYtPm1lbV9oYW5kbGUgPSBOVUxMOworCQl2Zi0+bWVtX2hlYWRfaGFuZGxlID0gTlVMTDsKKwkJdmYtPm1lbV9kd19oYW5kbGUgPSBOVUxMOworCX0gZWxzZSBpZiAodmYtPnR5cGUgJiBWSURUWVBFX1NDQVRURVIpIHsKKyNpZmRlZiBBT01fQVYxX01NVV9EVworCQlpZiAocGljLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MjAgJiYKKwkJCShkZWJ1ZyAmIEFPTV9ERUJVR19EV19ESVNQX01BSU4pID09IDApIHsKKwkJCXZmLT5tZW1faGFuZGxlID0KKwkJCQlkZWNvZGVyX21tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJCWh3LT5tbXVfYm94X2R3LCBwaWMtPmluZGV4KTsKKwkJCXZmLT5tZW1faGVhZF9oYW5kbGUgPQorCQkJCWRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJCWh3LT5ibW11X2JveCwKKwkJCQkJRFdfSEVBREVSX0JVRkZFUl9JRFgocGljLT5CVUZfaW5kZXgpKTsKKwkJCXZmLT5tZW1fZHdfaGFuZGxlID0gTlVMTDsKKwkJfSBlbHNlCisjZW5kaWYKKwkJeworCQl2Zi0+bWVtX2hhbmRsZSA9CisJCQlkZWNvZGVyX21tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJaHctPm1tdV9ib3gsIHBpYy0+aW5kZXgpOworCQl2Zi0+bWVtX2hlYWRfaGFuZGxlID0KKwkJCWRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJaHctPmJtbXVfYm94LAorCQkJCUhFQURFUl9CVUZGRVJfSURYKHBpYy0+QlVGX2luZGV4KSk7CisJCWlmIChody0+ZG91YmxlX3dyaXRlX21vZGUgPT0gMykKKwkJCXZmLT5tZW1fZHdfaGFuZGxlID0KKwkJCQlkZWNvZGVyX2JtbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCQlody0+Ym1tdV9ib3gsCisJCQkJCVZGX0JVRkZFUl9JRFgocGljLT5CVUZfaW5kZXgpKTsKKwkJZWxzZQorCQkJdmYtPm1lbV9kd19oYW5kbGUgPSBOVUxMOworCQl9CisjaWZkZWYgVVNFX1NQRUNfQlVGX0ZPUl9NTVVfSEVBRAorCQl2Zi0+bWVtX2hlYWRfaGFuZGxlID0gTlVMTDsKKyNlbmRpZgorCX0gZWxzZSB7CisJCXZmLT5tZW1faGFuZGxlID0KKwkJCWRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJaHctPmJtbXVfYm94LCBWRl9CVUZGRVJfSURYKHBpYy0+QlVGX2luZGV4KSk7CisJCXZmLT5tZW1faGVhZF9oYW5kbGUgPSBOVUxMOworCQl2Zi0+bWVtX2R3X2hhbmRsZSA9IE5VTEw7CisJCS8qdmYtPm1lbV9oZWFkX2hhbmRsZSA9CisJCSAqZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJICpody0+Ym1tdV9ib3gsIFZGX0JVRkZFUl9JRFgoQlVGX2luZGV4KSk7CisJCSAqLworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGF2MV91cGRhdGVfZ3ZzKHN0cnVjdCBBVjFIV19zICpodywgc3RydWN0IHZmcmFtZV9zICp2ZiwKKwkJCQkgIHN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpwaWNfY29uZmlnKQoreworCWlmIChody0+Z3ZzLT5mcmFtZV9oZWlnaHQgIT0gcGljX2NvbmZpZy0+eV9jcm9wX2hlaWdodCkgeworCQlody0+Z3ZzLT5mcmFtZV93aWR0aCA9IHBpY19jb25maWctPnlfY3JvcF93aWR0aDsKKwkJaHctPmd2cy0+ZnJhbWVfaGVpZ2h0ID0gcGljX2NvbmZpZy0+eV9jcm9wX2hlaWdodDsKKwl9CisJaWYgKGh3LT5ndnMtPmZyYW1lX2R1ciAhPSBody0+ZnJhbWVfZHVyKSB7CisJCWh3LT5ndnMtPmZyYW1lX2R1ciA9IGh3LT5mcmFtZV9kdXI7CisJCWlmIChody0+ZnJhbWVfZHVyICE9IDApCisJCQlody0+Z3ZzLT5mcmFtZV9yYXRlID0gKCg5NjAwMCAqIDEwIC8gaHctPmZyYW1lX2R1cikgJSAxMCkgPCA1ID8KKwkJCQkJOTYwMDAgLyBody0+ZnJhbWVfZHVyIDogKDk2MDAwIC8gaHctPmZyYW1lX2R1ciArMSk7CisJCWVsc2UKKwkJCWh3LT5ndnMtPmZyYW1lX3JhdGUgPSAtMTsKKwl9CisJaWYgKHZmICYmIGh3LT5ndnMtPnJhdGlvX2NvbnRyb2wgIT0gdmYtPnJhdGlvX2NvbnRyb2wpCisJCWh3LT5ndnMtPnJhdGlvX2NvbnRyb2wgPSB2Zi0+cmF0aW9fY29udHJvbDsKKworCWh3LT5ndnMtPnN0YXR1cyA9IGh3LT5zdGF0IHwgaHctPmZhdGFsX2Vycm9yOworCWh3LT5ndnMtPmVycm9yX2NvdW50ID0gaHctPmd2cy0+ZXJyb3JfZnJhbWVfY291bnQ7CisKK30KKworc3RhdGljIGludCBwcmVwYXJlX2Rpc3BsYXlfYnVmKHN0cnVjdCBBVjFIV19zICpodywKKwkJCQlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljX2NvbmZpZykKK3sKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmID0gTlVMTDsKKwlzdHJ1Y3QgdmRlY19pbmZvIHRtcDR4OworCWludCBzdHJlYW1fb2Zmc2V0ID0gcGljX2NvbmZpZy0+c3RyZWFtX29mZnNldDsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKiB2NGwyX2N0eCA9IGh3LT52NGwyX2N0eDsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPSBOVUxMOworCXVsb25nIG52X29yZGVyID0gVklEVFlQRV9WSVVfTlYyMTsKKwl1MzIgcHRzX3ZhbGlkID0gMCwgcHRzX3VzNjRfdmFsaWQgPSAwOworCXUzMiBmcmFtZV9zaXplOworCisJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfVkZSQU1FLCAiJXMgaW5kZXggPSAlZFxyXG4iLCBfX2Z1bmNfXywgcGljX2NvbmZpZy0+aW5kZXgpOworCWlmIChrZmlmb19nZXQoJmh3LT5uZXdmcmFtZV9xLCAmdmYpID09IDApIHsKKwkJYXYxX3ByaW50KGh3LCAwLCAiZmF0YWwgZXJyb3IsIG5vIGF2YWlsYWJsZSBidWZmZXIgc2xvdC4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHN3YXAgdXYgKi8KKwlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCWlmICgodjRsMl9jdHgtPmNhcF9waXhfZm10ID09IFY0TDJfUElYX0ZNVF9OVjEyKSB8fAorCQkJKHY0bDJfY3R4LT5jYXBfcGl4X2ZtdCA9PSBWNEwyX1BJWF9GTVRfTlYxMk0pKQorCQkJbnZfb3JkZXIgPSBWSURUWVBFX1ZJVV9OVjEyOworCX0KKworCWlmIChwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSAmJgorCQkocGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDIwKSA9PSAwKQorCQlzZXRfY2FudmFzKGh3LCBwaWNfY29uZmlnKTsKKworCWRpc3BsYXlfZnJhbWVfY291bnRbaHctPmluZGV4XSsrOworCWlmICh2ZikgeworCQlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCQl2Zi0+djRsX21lbV9oYW5kbGUKKwkJCQk9IGh3LT5tX0JVRltwaWNfY29uZmlnLT5CVUZfaW5kZXhdLnY0bF9yZWZfYnVmX2FkZHI7CisJCQlmYiA9IChzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqKXZmLT52NGxfbWVtX2hhbmRsZTsKKwkJCWlmIChody0+bW11X2VuYWJsZSkgeworCQkJCXZmLT5tbV9ib3guYm1tdV9ib3gJPSBody0+Ym1tdV9ib3g7CisJCQkJdmYtPm1tX2JveC5ibW11X2lkeAk9IEhFQURFUl9CVUZGRVJfSURYKGh3LT5idWZmZXJfd3JhcFtwaWNfY29uZmlnLT5CVUZfaW5kZXhdKTsKKwkJCQl2Zi0+bW1fYm94Lm1tdV9ib3gJPSBody0+bW11X2JveDsKKwkJCQl2Zi0+bW1fYm94Lm1tdV9pZHgJPSBody0+YnVmZmVyX3dyYXBbcGljX2NvbmZpZy0+QlVGX2luZGV4XTsKKwkJCX0KKwkJfQorCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQlpZiAodmRlY19mcmFtZV9iYXNlZChod190b192ZGVjKGh3KSkpIHsKKwkJCXZmLT5wdHMgPSBwaWNfY29uZmlnLT5wdHM7CisJCQl2Zi0+cHRzX3VzNjQgPSBwaWNfY29uZmlnLT5wdHM2NDsKKworCQkJaWYgKGh3LT5pc191c2VkX3Y0bCAmJiB2NGxfYml0c3RyZWFtX2lkX2VuYWJsZSkKKwkJCQl2Zi0+dGltZXN0YW1wID0gcGljX2NvbmZpZy0+dGltZXN0YW1wOworCQkJZWxzZQorCQkJCXZmLT50aW1lc3RhbXAgPSBwaWNfY29uZmlnLT5wdHM2NDsKKworCQkJaWYgKHZmLT5wdHMgIT0gMCB8fCB2Zi0+cHRzX3VzNjQgIT0gMCkgeworCQkJCXB0c192YWxpZCA9IDE7CisJCQkJcHRzX3VzNjRfdmFsaWQgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlwdHNfdmFsaWQgPSAwOworCQkJCXB0c191czY0X3ZhbGlkID0gMDsKKwkJCX0KKwkJfSBlbHNlCisjZW5kaWYKKwkJaWYgKHB0c19sb29rdXBfb2Zmc2V0X3VzNjQKKwkJCShQVFNfVFlQRV9WSURFTywgc3RyZWFtX29mZnNldCwgJnZmLT5wdHMsCisJCQkmZnJhbWVfc2l6ZSwgMCwKKwkJCSZ2Zi0+cHRzX3VzNjQpICE9IDApIHsKKyNpZmRlZiBERUJVR19QVFMKKwkJCWh3LT5wdHNfbWlzc2VkKys7CisjZW5kaWYKKwkJCXZmLT5wdHMgPSAwOworCQkJdmYtPnB0c191czY0ID0gMDsKKwkJCXB0c192YWxpZCA9IDA7CisJCQlwdHNfdXM2NF92YWxpZCA9IDA7CisJCX0gZWxzZSB7CisjaWZkZWYgREVCVUdfUFRTCisJCQlody0+cHRzX2hpdCsrOworI2VuZGlmCisJCQlwdHNfdmFsaWQgPSAxOworCQkJcHRzX3VzNjRfdmFsaWQgPSAxOworCQl9CisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX09VVF9QVFMsCisJCQkiYXYxIG91dHB1dCBzbGljZSB0eXBlICVkLCBkdXIgJWQsIHB0cyAlZCwgcHRzNjQgJWxsZCwgdHM6ICVsbHVcbiIsCisJCQlwaWNfY29uZmlnLT5zbGljZV90eXBlLCBody0+ZnJhbWVfZHVyLCB2Zi0+cHRzLCB2Zi0+cHRzX3VzNjQsIHZmLT50aW1lc3RhbXApOworCisJCWZpbGxfZnJhbWVfaW5mbyhodywgcGljX2NvbmZpZywgZnJhbWVfc2l6ZSwgdmYtPnB0cyk7CisKKwkJdmYtPmluZGV4ID0gMHhmZjAwIHwgcGljX2NvbmZpZy0+aW5kZXg7CisJCWlmIChwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MTApIHsKKwkJCS8qIGRvdWJsZSB3cml0ZSBvbmx5ICovCisJCQl2Zi0+Y29tcEJvZHlBZGRyID0gMDsKKwkJCXZmLT5jb21wSGVhZEFkZHIgPSAwOworI2lmZGVmIEFPTV9BVjFfTU1VX0RXCisJCQl2Zi0+ZHdCb2R5QWRkciA9IDA7CisJCQl2Zi0+ZHdIZWFkQWRkciA9IDA7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCWlmIChody0+bW11X2VuYWJsZSkgeworCQkJCXZmLT5jb21wQm9keUFkZHIgPSAwOworCQkJCXZmLT5jb21wSGVhZEFkZHIgPSBwaWNfY29uZmlnLT5oZWFkZXJfYWRyOworCQkJCXZmLT5mZ3NfdGFibGVfYWRyID0gcGljX2NvbmZpZy0+ZmdzX3RhYmxlX2FkcjsKKwkJCQl2Zi0+ZmdzX3ZhbGlkID0gaHctPmZnc192YWxpZDsKKyNpZmRlZiBBT01fQVYxX01NVV9EVworCQkJCXZmLT5kd0JvZHlBZGRyID0gMDsKKwkJCQl2Zi0+ZHdIZWFkQWRkciA9IDA7CisJCQkJaWYgKHBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlICYgMHgyMCkgeworCQkJCQl1MzIgbW9kZSA9IHBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlICYgMHhmOworCQkJCQlpZiAobW9kZSA9PSA1IHx8IG1vZGUgPT0gMykKKwkJCQkJCXZmLT5kd0hlYWRBZGRyID0gcGljX2NvbmZpZy0+aGVhZGVyX2R3X2FkcjsKKwkJCQkJZWxzZSBpZiAoKG1vZGUgPT0gMSB8fCBtb2RlID09IDIgfHwgbW9kZSA9PSA0KQorCQkJCQkmJiAoZGVidWcgJiBBT01fREVCVUdfRFdfRElTUF9NQUlOKSA9PSAwKSB7CisJCQkJCQl2Zi0+Y29tcEhlYWRBZGRyID0gcGljX2NvbmZpZy0+aGVhZGVyX2R3X2FkcjsKKwkJCQkJCXZmLT5mZ3NfdmFsaWQgPSAwOworCQkJCQkJYXYxX3ByaW50KGh3LCAwLAorCQkJCQkJCSJVc2UgZHcgbW11IGZvciBkaXNwbGF5XG4iKTsKKwkJCQkJfQorCQkJCX0KKyNlbmRpZgorCQkJfSBlbHNlIHsKKwkJCQkvKnZmLT5jb21wQm9keUFkZHIgPSBwaWNfY29uZmlnLT5tY195X2FkcjsKKwkJCQkgKnZmLT5jb21wSGVhZEFkZHIgPSBwaWNfY29uZmlnLT5tY195X2FkciArCisJCQkJICpwaWNfY29uZmlnLT5jb21wX2JvZHlfc2l6ZTsgKi8KKwkJCQkvKmhlYWQgYWRyKi8KKwkJCX0KKwkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IDA7CisJCX0KKwkJaWYgKHBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlICYmCisJCQkocGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDIwKSA9PSAwKSB7CisJCQl2Zi0+dHlwZSA9IFZJRFRZUEVfUFJPR1JFU1NJVkUgfAorCQkJCVZJRFRZUEVfVklVX0ZJRUxEOworCQkJdmYtPnR5cGUgfD0gbnZfb3JkZXI7CisJCQlpZiAoKHBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlID09IDMgfHwKKwkJCQlwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSA9PSA1KSAmJgorCQkJCSghSVNfOEtfU0laRShwaWNfY29uZmlnLT55X2Nyb3Bfd2lkdGgsCisJCQkJcGljX2NvbmZpZy0+eV9jcm9wX2hlaWdodCkpKSB7CisJCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9DT01QUkVTUzsKKwkJCQlpZiAoaHctPm1tdV9lbmFibGUpCisJCQkJCXZmLT50eXBlIHw9IFZJRFRZUEVfU0NBVFRFUjsKKwkJCX0KKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCQlpZiAoaHctPm1faW5zX2ZsYWcpIHsKKwkJCQl2Zi0+Y2FudmFzMEFkZHIgPSB2Zi0+Y2FudmFzMUFkZHIgPSAtMTsKKwkJCQl2Zi0+cGxhbmVfbnVtID0gMjsKKwkJCQl2Zi0+Y2FudmFzMF9jb25maWdbMF0gPQorCQkJCQlwaWNfY29uZmlnLT5jYW52YXNfY29uZmlnWzBdOworCQkJCXZmLT5jYW52YXMwX2NvbmZpZ1sxXSA9CisJCQkJCXBpY19jb25maWctPmNhbnZhc19jb25maWdbMV07CisJCQkJdmYtPmNhbnZhczFfY29uZmlnWzBdID0KKwkJCQkJcGljX2NvbmZpZy0+Y2FudmFzX2NvbmZpZ1swXTsKKwkJCQl2Zi0+Y2FudmFzMV9jb25maWdbMV0gPQorCQkJCQlwaWNfY29uZmlnLT5jYW52YXNfY29uZmlnWzFdOworCisJCQl9IGVsc2UKKyNlbmRpZgorCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9CisJCQkJCXNwZWMyY2FudmFzKHBpY19jb25maWcpOworCQl9IGVsc2UgeworCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0gMDsKKwkJCXZmLT50eXBlID0gVklEVFlQRV9DT01QUkVTUyB8IFZJRFRZUEVfVklVX0ZJRUxEOworCQkJaWYgKGh3LT5tbXVfZW5hYmxlKQorCQkJCXZmLT50eXBlIHw9IFZJRFRZUEVfU0NBVFRFUjsKKwkJfQorCisJCXN3aXRjaCAocGljX2NvbmZpZy0+Yml0X2RlcHRoKSB7CisJCWNhc2UgQU9NX0JJVFNfODoKKwkJCXZmLT5iaXRkZXB0aCA9IEJJVERFUFRIX1k4IHwKKwkJCQlCSVRERVBUSF9VOCB8IEJJVERFUFRIX1Y4OworCQkJYnJlYWs7CisJCWNhc2UgQU9NX0JJVFNfMTA6CisJCWNhc2UgQU9NX0JJVFNfMTI6CisJCQl2Zi0+Yml0ZGVwdGggPSBCSVRERVBUSF9ZMTAgfAorCQkJCUJJVERFUFRIX1UxMCB8IEJJVERFUFRIX1YxMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdmYtPmJpdGRlcHRoID0gQklUREVQVEhfWTEwIHwKKwkJCQlCSVRERVBUSF9VMTAgfCBCSVRERVBUSF9WMTA7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKHZmLT50eXBlICYgVklEVFlQRV9DT01QUkVTUykgPT0gMCkKKwkJCXZmLT5iaXRkZXB0aCA9CisJCQkJQklUREVQVEhfWTggfCBCSVRERVBUSF9VOCB8IEJJVERFUFRIX1Y4OworCQlpZiAocGljX2NvbmZpZy0+Yml0X2RlcHRoID09IEFPTV9CSVRTXzgpCisJCQl2Zi0+Yml0ZGVwdGggfD0gQklUREVQVEhfU0FWSU5HX01PREU7CisKKwkJLyogaWYgKCh2Zi0+d2lkdGghPXBpY19jb25maWctPndpZHRoKXwKKwkJICoJKHZmLT5oZWlnaHQhPXBpY19jb25maWctPmhlaWdodCkpCisJCSAqLworCQkvKiBwcl9pbmZvKCJhYWE6ICVkLyVkLCAlZC8lZFxuIiwKKwkJICAgdmYtPndpZHRoLHZmLT5oZWlnaHQsIHBpY19jb25maWctPndpZHRoLAorCQkJcGljX2NvbmZpZy0+aGVpZ2h0KTsgKi8KKwkJdmYtPndpZHRoID0gcGljX2NvbmZpZy0+eV9jcm9wX3dpZHRoIC8KKwkJCWdldF9kb3VibGVfd3JpdGVfcmF0aW8oCisJCQkJcGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweGYpOworCQl2Zi0+aGVpZ2h0ID0gcGljX2NvbmZpZy0+eV9jcm9wX2hlaWdodCAvCisJCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKAorCQkJCXBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlICYgMHhmKTsKKwkJaWYgKGZvcmNlX3dfaCAhPSAwKSB7CisJCQl2Zi0+d2lkdGggPSAoZm9yY2Vfd19oID4+IDE2KSAmIDB4ZmZmZjsKKwkJCXZmLT5oZWlnaHQgPSBmb3JjZV93X2ggJiAweGZmZmY7CisJCX0KKwkJaWYgKChwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MjApICYmCisJCQkoKHBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlICYgMHhmKSA9PSAyIHx8CisJCQkocGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweGYpID09IDQpKSB7CisJCQl2Zi0+Y29tcFdpZHRoID0gcGljX2NvbmZpZy0+eV9jcm9wX3dpZHRoIC8KKwkJCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKAorCQkJCQlwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4Zik7CisJCQl2Zi0+Y29tcEhlaWdodCA9IHBpY19jb25maWctPnlfY3JvcF9oZWlnaHQgLworCQkJCWdldF9kb3VibGVfd3JpdGVfcmF0aW8oCisJCQkJCXBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlICYgMHhmKTsKKwkJfSBlbHNlIHsKKwkJCXZmLT5jb21wV2lkdGggPSBwaWNfY29uZmlnLT55X2Nyb3Bfd2lkdGg7CisJCQl2Zi0+Y29tcEhlaWdodCA9IHBpY19jb25maWctPnlfY3JvcF9oZWlnaHQ7CisJCX0KKwkJc2V0X2ZyYW1lX2luZm8oaHcsIHZmKTsKKwkJaWYgKGZvcmNlX2ZwcyAmIDB4MTAwKSB7CisJCQl1MzIgcmF0ZSA9IGZvcmNlX2ZwcyAmIDB4ZmY7CisKKwkJCWlmIChyYXRlKQorCQkJCXZmLT5kdXJhdGlvbiA9IDk2MDAwL3JhdGU7CisJCQllbHNlCisJCQkJdmYtPmR1cmF0aW9uID0gMDsKKwkJfQorCQl1cGRhdGVfdmZfbWVtaGFuZGxlKGh3LCB2ZiwgcGljX2NvbmZpZyk7CisKKwkJYXYxX2luY192Zl9yZWYoaHcsIHBpY19jb25maWctPmluZGV4KTsKKwkJZGVjb2Rlcl9kb19mcmFtZV9jaGVjayhod190b192ZGVjKGh3KSwgdmYpOworCQl2ZGVjX3ZmcmFtZV9yZWFkeShod190b192ZGVjKGh3KSwgdmYpOworCQlrZmlmb19wdXQoJmh3LT5kaXNwbGF5X3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5wdHNfbmFtZSwgdmYtPnB0cyk7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5uZXdfcV9uYW1lLCBrZmlmb19sZW4oJmh3LT5uZXdmcmFtZV9xKSk7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kaXNwX3FfbmFtZSwga2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKSk7CisKKwkJaHctPnZmX3ByZV9jb3VudCsrOworCQkvKmNvdW50IGluZm8qLworCQlody0+Z3ZzLT5mcmFtZV9kdXIgPSBody0+ZnJhbWVfZHVyOworCQl2ZGVjX2NvdW50X2luZm8oaHctPmd2cywgMCwgc3RyZWFtX29mZnNldCk7CisKKwkJaHdfdG9fdmRlYyhodyktPnZkZWNfZnBzX2RldGVjKGh3X3RvX3ZkZWMoaHcpLT5pZCk7CisKKyNpZmRlZiBBVVhfREFUQV9DUkMKKwkJZGVjb2Rlcl9kb19hdXhfZGF0YV9jaGVjayhod190b192ZGVjKGh3KSwgcGljX2NvbmZpZy0+YXV4X2RhdGFfYnVmLAorCQkJcGljX2NvbmZpZy0+YXV4X2RhdGFfc2l6ZSk7CisjZW5kaWYKKworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19TRUlfREVUQUlMLCAiJXMgYXV4X2RhdGFfc2l6ZSA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCBwaWNfY29uZmlnLT5hdXhfZGF0YV9zaXplKTsKKworCQlpZiAoZGVidWcgJiBBVjFfREVCVUdfU0VJX0RFVEFJTCkgeworCQkJaW50IGkgPSAwOworCQkJUFJfSU5JVCgxMjgpOworCQkJZm9yIChpID0gMDsgaSA8IHBpY19jb25maWctPmF1eF9kYXRhX3NpemU7IGkrKykgeworCQkJCVBSX0ZJTEwoIiUwMnggIiwgcGljX2NvbmZpZy0+YXV4X2RhdGFfYnVmW2ldKTsKKwkJCQlpZiAoKChpICsgMSkgJiAweGYpID09IDApCisJCQkJCVBSX0lORk8oaHctPmluZGV4KTsKKwkJCX0KKwkJCVBSX0lORk8oaHctPmluZGV4KTsKKwkJfQorCisJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCXVwZGF0ZV92ZnJhbWVfc3JjX2ZtdCh2ZiwKKwkJCQlwaWNfY29uZmlnLT5hdXhfZGF0YV9idWYsCisJCQkJcGljX2NvbmZpZy0+YXV4X2RhdGFfc2l6ZSwKKwkJCQlmYWxzZSwgaHctPnByb3ZpZGVyX25hbWUsIE5VTEwpOworCQl9CisKKwkJYXYxX3VwZGF0ZV9ndnMoaHcsIHZmLCBwaWNfY29uZmlnKTsKKwkJbWVtY3B5KCZ0bXA0eCwgaHctPmd2cywgc2l6ZW9mKHN0cnVjdCB2ZGVjX2luZm8pKTsKKwkJdG1wNHguYml0X2RlcHRoX2x1bWEgPSBiaXRfZGVwdGhfbHVtYTsKKwkJdG1wNHguYml0X2RlcHRoX2Nocm9tYSA9IGJpdF9kZXB0aF9jaHJvbWE7CisJCXRtcDR4LmRvdWJsZV93cml0ZV9tb2RlID0gcGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGU7CisJCXZkZWNfZmlsbF92ZGVjX2ZyYW1lKGh3X3RvX3ZkZWMoaHcpLCAmaHctPnZmcmFtZV9xb3MsICZ0bXA0eCwgdmYsIHBpY19jb25maWctPmh3X2RlY29kZV90aW1lKTsKKwkJaWYgKHdpdGhvdXRfZGlzcGxheV9tb2RlID09IDApIHsKKwkJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCQlpZiAodjRsMl9jdHgtPmlzX3N0cmVhbV9vZmYpIHsKKwkJCQkJdmF2MV92Zl9wdXQodmF2MV92Zl9nZXQoaHcpLCBodyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZmItPnRhc2stPnN1Ym1pdChmYi0+dGFzaywgVEFTS19UWVBFX0RFQyk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoaHctPnByb3ZpZGVyX25hbWUsCisJCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9WRlJBTUVfUkVBRFksIE5VTEwpOworCQkJfQorCQl9IGVsc2UKKwkJCXZhdjFfdmZfcHV0KHZhdjFfdmZfZ2V0KGh3KSwgaHcpOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIGF2MV9yYXdfd3JpdGVfaW1hZ2UoQVYxRGVjb2RlciAqcGJpLCBQSUNfQlVGRkVSX0NPTkZJRyAqc2QpCit7CisJc2QtPnN0cmVhbV9vZmZzZXQgPSBwYmktPnByZV9zdHJlYW1fb2Zmc2V0OworCXByZXBhcmVfZGlzcGxheV9idWYoKHN0cnVjdCBBVjFIV19zICopKHBiaS0+cHJpdmF0ZV9kYXRhKSwgc2QpOworCXBiaS0+cHJlX3N0cmVhbV9vZmZzZXQgPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKTsKK30KKworc3RhdGljIGludCBub3RpZnlfdjRsX2VvcyhzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXN0cnVjdCBBVjFIV19zICpodyA9IChzdHJ1Y3QgQVYxSFdfcyAqKXZkZWMtPnByaXZhdGU7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPSAoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisJc3RydWN0IHZmcmFtZV9zICp2ZiA9ICZody0+dmZyYW1lX2R1bW15OworCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9IE5VTEw7CisJaW50IGluZGV4ID0gSU5WQUxJRF9JRFg7CisJdWxvbmcgZXhwaXJlczsKKworCWlmIChody0+ZW9zKSB7CisJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCWV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMDAwKTsKKwkJCXdoaWxlIChJTlZBTElEX0lEWCA9PSAoaW5kZXggPSB2NGxfZ2V0X2ZyZWVfZmIoaHcpKSkgeworCQkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGV4cGlyZXMpIHx8CisJCQkJCXY0bDJfbTJtX251bV9kc3RfYnVmc19yZWFkeShjdHgtPm0ybV9jdHgpKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKGluZGV4ID09IElOVkFMSURfSURYKSB7CisJCQkJY3R4LT5mYl9vcHMucXVlcnkoJmN0eC0+ZmJfb3BzLCAmaHctPmZiX3Rva2VuKTsKKwkJCQlpZiAoY3R4LT5mYl9vcHMuYWxsb2MoJmN0eC0+ZmJfb3BzLCBody0+ZmJfdG9rZW4sICZmYiwgQU1MX0ZCX1JFUV9ERUMpIDwgMCkgeworCQkJCQlwcl9lcnIoIlslZF0gRU9TIGdldCBmcmVlIGJ1ZmYgZmFpbC5cbiIsIGN0eC0+aWQpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJfQorCQl9CisKKwkJdmYtPnR5cGUJCXw9IFZJRFRZUEVfVjRMX0VPUzsKKwkJdmYtPnRpbWVzdGFtcAkJPSBVTE9OR19NQVg7CisJCXZmLT5mbGFnCQk9IFZGUkFNRV9GTEFHX0VNUFRZX0ZSQU1FX1Y0TDsKKwkJdmYtPnY0bF9tZW1faGFuZGxlCT0gKGluZGV4ID09IElOVkFMSURfSURYKSA/ICh1bG9uZylmYiA6CisJCQkJCWh3LT5tX0JVRltpbmRleF0udjRsX3JlZl9idWZfYWRkcjsKKwkJZmIgPSAoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKil2Zi0+djRsX21lbV9oYW5kbGU7CisKKwkJdmRlY192ZnJhbWVfcmVhZHkodmRlYywgdmYpOworCQlrZmlmb19wdXQoJmh3LT5kaXNwbGF5X3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisKKwkJaWYgKGh3LT5pc191c2VkX3Y0bCkKKwkJCWZiLT50YXNrLT5zdWJtaXQoZmItPnRhc2ssIFRBU0tfVFlQRV9ERUMpOworCQllbHNlCisJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIodmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfVkZSQU1FX1JFQURZLCBOVUxMKTsKKworCQlhdjFfcHJpbnQoaHcsIDAsICJbJWRdIEFWMSBFT1Mgbm90aWZ5LlxuIiwgKGh3LT5pc191c2VkX3Y0bCk/Y3R4LT5pZDp2ZGVjLT5pZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9ycG1fcGFyYW0odW5pb24gcGFyYW1fdSAqcGFyYW1zKQoreworCWludCBpOworCXVuc2lnbmVkIGludCBkYXRhMzI7CisKKwlpZiAoZGVidWcgJiBBVjFfREVCVUdfQlVGTUdSKQorCQlwcl9pbmZvKCJlbnRlciAlc1xyXG4iLCBfX2Z1bmNfXyk7CisJZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7CisJCWRvIHsKKwkJCWRhdGEzMiA9IFJFQURfVlJFRyhSUE1fQ01EX1JFRyk7CisJCQkvKnByX2luZm8oIiV4XG4iLCBkYXRhMzIpOyovCisJCX0gd2hpbGUgKChkYXRhMzIgJiAweDEwMDAwKSA9PSAwKTsKKwkJcGFyYW1zLT5sLmRhdGFbaV0gPSBkYXRhMzImMHhmZmZmOworCQkvKnByX2luZm8oIiV4XG4iLCBkYXRhMzIpOyovCisJCVdSSVRFX1ZSRUcoUlBNX0NNRF9SRUcsIDApOworCX0KKwlpZiAoZGVidWcgJiBBVjFfREVCVUdfQlVGTUdSKQorCQlwcl9pbmZvKCJsZWF2ZSAlc1xyXG4iLCBfX2Z1bmNfXyk7Cit9CisKKyNpZmRlZiBDSEFOR0VfUkVNT1ZFRAorc3RhdGljIGludCByZWN5Y2xlX21tdV9idWZfdGFpbChzdHJ1Y3QgQVYxSFdfcyAqaHcsCisJCWJvb2wgY2hlY2tfZG1hKQoreworCXN0cnVjdCBBVjFfQ29tbW9uX3MgKmNvbnN0IGNtID0gJmh3LT5jb21tb247CisKKwlody0+dXNlZF80a19udW0gPQorCQlSRUFEX1ZSRUcoSEVWQ19TQU9fTU1VX1NUQVRVUykgPj4gMTY7CisKKwlhdjFfcHJpbnQoaHcsIDAsICJwaWMgaW5kZXggJWQgcGFnZV9zdGFydCAlZFxuIiwKKwkJY20tPmN1cl9mYl9pZHhfbW11LCBody0+dXNlZF80a19udW0pOworCisJaWYgKGNoZWNrX2RtYSkKKwkJaGV2Y19tbXVfZG1hX2NoZWNrKGh3X3RvX3ZkZWMoaHcpKTsKKworCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJaW50IGluZGV4ID0gY20tPmN1cl9mYl9pZHhfbW11OworCQlzdHJ1Y3QgaW50ZXJuYWxfY29tcF9idWYgKmlidWYgPQorCQkJaW5kZXhfdG9faWNvbXBfYnVmKGh3LCBpbmRleCk7CisKKwkJZGVjb2Rlcl9tbXVfYm94X2ZyZWVfaWR4X3RhaWwoCisJCQkJaWJ1Zi0+bW11X2JveCwKKwkJCQlpYnVmLT5pbmRleCwKKwkJCQlody0+dXNlZF80a19udW0pOworCX0gZWxzZSB7CisJCWRlY29kZXJfbW11X2JveF9mcmVlX2lkeF90YWlsKAorCQkJCWh3LT5tbXVfYm94LAorCQkJCWNtLT5jdXJfZmJfaWR4X21tdSwKKwkJCQlody0+dXNlZF80a19udW0pOworCX0KKworCWNtLT5jdXJfZmJfaWR4X21tdSA9IElOVkFMSURfSURYOworCWh3LT51c2VkXzRrX251bSA9IC0xOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2lmZGVmIENIQU5HRV9SRU1PVkVECitzdGF0aWMgdm9pZCBhdjFfcmVjeWNsZV9tbXVfYnVmX3RhaWwoc3RydWN0IEFWMUhXX3MgKmh3KQoreworCXN0cnVjdCBBVjFfQ29tbW9uX3MgKmNvbnN0IGNtID0gJmh3LT5jb21tb247CisJaWYgKGh3LT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MTApCisJCXJldHVybjsKKworCWlmIChjbS0+Y3VyX2ZiX2lkeF9tbXUgIT0gSU5WQUxJRF9JRFgpIHsKKwkJcmVjeWNsZV9tbXVfYnVmX3RhaWwoaHcsCisJCQkoKGh3LT51c2VkXzRrX251bSA9PSAtMSkgJiYKKwkJCWh3LT5tX2luc19mbGFnKSA/IDEgOiAwKTsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgYXYxX3JlY3ljbGVfbW11X2J1ZihzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJc3RydWN0IEFWMV9Db21tb25fcyAqY29uc3QgY20gPSAmaHctPmNvbW1vbjsKKworCWlmIChody0+aXNfdXNlZF92NGwpCisJCXJldHVybjsKKworCWlmIChody0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDEwKQorCQlyZXR1cm47CisJaWYgKGNtLT5jdXJfZmJfaWR4X21tdSAhPSBJTlZBTElEX0lEWCkgeworCQlkZWNvZGVyX21tdV9ib3hfZnJlZV9pZHgoaHctPm1tdV9ib3gsCisJCQljbS0+Y3VyX2ZiX2lkeF9tbXUpOworCisJCWNtLT5jdXJfZmJfaWR4X21tdSA9IElOVkFMSURfSURYOworCQlody0+dXNlZF80a19udW0gPSAtMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRlY19hZ2Fpbl9wcm9jZXNzKHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlhbWhldmNfc3RvcCgpOworCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKwlpZiAoaHctPnByb2Nlc3Nfc3RhdGUgPT0KKwkJUFJPQ19TVEFURV9ERUNPREVTTElDRSkgeworCQlody0+cHJvY2Vzc19zdGF0ZSA9CisJCVBST0NfU1RBVEVfU0VOREFHQUlOOworCQlpZiAoaHctPm1tdV9lbmFibGUpCisJCQlhdjFfcmVjeWNsZV9tbXVfYnVmKGh3KTsKKwl9CisJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKK30KKworc3RhdGljIHZvaWQgcmVhZF9maWxtX2dyYWluX3JlZyhzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisgICAgQVYxX0NPTU1PTiAqY20gPSAmaHctPmNvbW1vbjsKKyAgICBpbnQgaTsKKyAgICBpZiAoY20tPmN1cl9mcmFtZSA9PSBOVUxMKSB7CisJICAgIGF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsICIlcywgY3VyX2ZyYW1lIG5vdCBleGlzdCEhIVxuIiwgX19mdW5jX18pOworCSAgICByZXR1cm47CisJfSBlbHNlCisJICAgIGF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsICIlc1xuIiwgX19mdW5jX18pOworICAgIFdSSVRFX1ZSRUcoSEVWQ19GR1NfSURYLCAwKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRklMTV9HUkFJTl9SRUdfU0laRTsgaSsrKSB7CisJICAgIGNtLT5jdXJfZnJhbWUtPmZpbG1fZ3JhaW5fcmVnW2ldID0gUkVBRF9WUkVHKEhFVkNfRkdTX0RBVEEpOworCX0KKyAgICBjbS0+Y3VyX2ZyYW1lLT5maWxtX2dyYWluX3JlZ192YWxpZCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19maWxtX2dyYWluX3JlZyhzdHJ1Y3QgQVYxSFdfcyAqaHcsIGludCBmaWxtX2dyYWluX3BhcmFtc19yZWZfaWR4KQoreworCisgICAgQVYxX0NPTU1PTiAqY20gPSAmaHctPmNvbW1vbjsKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBjaGFyIGZvdW5kID0gMDsKKyAgICBSZWZDbnRCdWZmZXIgKmJ1ZjsKKyAgICBhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkiICMjICVzIGZyb21lIHJlZmVyZW5jZSBpZHggJWRcbiIsCisJCV9fZnVuY19fLCBmaWxtX2dyYWluX3BhcmFtc19yZWZfaWR4KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgSU5URVJfUkVGU19QRVJfRlJBTUU7ICsraSkgeworCSAgICBpZiAoZmlsbV9ncmFpbl9wYXJhbXNfcmVmX2lkeCA9PSBjbS0+cmVtYXBwZWRfcmVmX2lkeFtpXSkgeworCQkgICAgZm91bmQgPSAxOworCQkgICAgYnJlYWs7CisJCX0KKwl9CisgICAgaWYgKCFmb3VuZCkgeworCSAgICBhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkJIiVzIEVycm9yLCBJbnZhbGlkIGZpbG0gZ3JhaW4gcmVmZXJlbmNlIGlkeCAlZFxuIiwKKwkJCV9fZnVuY19fLCBmaWxtX2dyYWluX3BhcmFtc19yZWZfaWR4KTsKKwkgICAgcmV0dXJuOworCX0KKyAgICBidWYgPSBjbS0+cmVmX2ZyYW1lX21hcFtmaWxtX2dyYWluX3BhcmFtc19yZWZfaWR4XTsKKworICAgIGlmIChidWYtPmZpbG1fZ3JhaW5fcmVnX3ZhbGlkID09IDApIHsKKwkgICAgYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJCSIlcyBFcnJvciwgZmlsbSBncmFpbiByZWdpc3RlciBkYXRhIGludmFsaWQgZm9yIHJlZmVyZW5jZSBpZHggJWRcbiIsCisJCQlfX2Z1bmNfXywgZmlsbV9ncmFpbl9wYXJhbXNfcmVmX2lkeCk7CisJICAgIHJldHVybjsKKwl9CisKKyAgICBpZiAoY20tPmN1cl9mcmFtZSA9PSBOVUxMKSB7CisJICAgIGF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCQkiJXMsIGN1cl9mcmFtZSBub3QgZXhpc3QhISFcbiIsIF9fZnVuY19fKTsKKwl9CisgICAgV1JJVEVfVlJFRyhIRVZDX0ZHU19JRFgsIDApOworICAgIGZvciAoaSA9IDA7IGkgPCBGSUxNX0dSQUlOX1JFR19TSVpFOyBpKyspIHsKKwkgICAgV1JJVEVfVlJFRyhIRVZDX0ZHU19EQVRBLCBidWYtPmZpbG1fZ3JhaW5fcmVnW2ldKTsKKwkgICAgaWYgKGNtLT5jdXJfZnJhbWUpCisJCSAgICBjbS0+Y3VyX2ZyYW1lLT5maWxtX2dyYWluX3JlZ1tpXSA9IGJ1Zi0+ZmlsbV9ncmFpbl9yZWdbaV07CisJfQorICAgIGlmIChjbS0+Y3VyX2ZyYW1lKQorCSAgICBjbS0+Y3VyX2ZyYW1lLT5maWxtX2dyYWluX3JlZ192YWxpZCA9IDE7CisgICAgV1JJVEVfVlJFRyhIRVZDX0ZHU19DVFJMLCBSRUFEX1ZSRUcoSEVWQ19GR1NfQ1RSTCkgfCAxKTsgLy8gc2V0IGZpbF9ncmFpbl9zdGFydAorfQorCit2b2lkIGNvbmZpZ19uZXh0X3JlZl9pbmZvX2h3KHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlpbnQgajsKKwlBVjFfQ09NTU9OICpjb25zdCBjbSA9ICZody0+Y29tbW9uOworCisJYXYxX3NldF9uZXh0X3JlZl9mcmFtZV9tYXAoaHctPnBiaSk7CisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU0MyKQorCQlXUklURV9WUkVHKEhFVkNfUEFSU0VSX01FTV9XUl9BRERSLCAweDExYTApOworCWVsc2UKKwkJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9NRU1fV1JfQUREUiwgMHgxMDAwKTsKKworCWZvciAoaiA9IDA7IGogPCAxMjsgaisrKSB7CisJCXVuc2lnbmVkIGludCBpbmZvID0KKwkJCWF2MV9nZXRfbmV4dF91c2VkX3JlZl9pbmZvKGNtLCBqKTsKKworCQlXUklURV9WUkVHKEhFVkNfUEFSU0VSX01FTV9SV19EQVRBLCBpbmZvKTsKKwkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJCSJjb25maWcgbmV4dCByZWYgaW5mbyAlZCAweCV4XG4iLCBqLCBpbmZvKTsKKwl9Cit9CisKKworCisjaWZkZWYgUFJJTlRfSEVWQ19EQVRBX1BBVEhfTU9OSVRPUgordm9pZCBkYXRhcGF0aF9tb25pdG9yKHN0cnVjdCBBVjFIV19zICpodykKK3sKKwkJICB1aW50MzJfdCB0b3RhbF9jbGtfY291bnQ7CisJCSAgdWludDMyX3QgcGF0aF90cmFuc2Zlcl9jb3VudDsKKwkJICB1aW50MzJfdCBwYXRoX3dhaXRfY291bnQ7CisgIGZsb2F0IHBhdGhfd2FpdF9yYXRpbzsKKyAgaWYgKHBiaS0+ZGVjb2RlX2lkeCA+IDEpIHsKKyAgICBXUklURV9WUkVHKEhFVkNfUEFUSF9NT05JVE9SX0NUUkwsIDApOyAvLyBEaXNhYmJsZSBtb25pdG9yIGFuZCBzZXQgcmRfaWR4IHRvIDAKKyAgICB0b3RhbF9jbGtfY291bnQgPSBSRUFEX1ZSRUcoSEVWQ19QQVRIX01PTklUT1JfREFUQSk7CisKKyAgICBXUklURV9WUkVHKEhFVkNfUEFUSF9NT05JVE9SX0NUUkwsICgxPDw0KSk7IC8vIERpc2FiYmxlIG1vbml0b3IgYW5kIHNldCByZF9pZHggdG8gMAorCisvLyBwYXJzZXIgLS0+IGlxaXQKKyAgICBwYXRoX3RyYW5zZmVyX2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUEFUSF9NT05JVE9SX0RBVEEpOworICAgIHBhdGhfd2FpdF9jb3VudCA9IFJFQURfVlJFRyhIRVZDX1BBVEhfTU9OSVRPUl9EQVRBKTsKKyAgICBpZiAocGF0aF90cmFuc2Zlcl9jb3VudCA9PSAwKSBwYXRoX3dhaXRfcmF0aW8gPSAwLjA7CisgICAgZWxzZSBwYXRoX3dhaXRfcmF0aW8gPSAoZmxvYXQpcGF0aF93YWl0X2NvdW50LyhmbG9hdClwYXRoX3RyYW5zZmVyX2NvdW50OworICAgIHByaW50aygiW1AlZCBIRVZDIFBBVEhdIFBhcnNlci9JUUlUL0lQUC9EQkxLL09XL0REUi9DTUQgV0FJVElORyBcJSA6ICUuMmYiLAorICAgICAgICBwYmktPmRlY29kZV9pZHggLSAyLCBwYXRoX3dhaXRfcmF0aW8pOworCisvLyBpcWl0IC0tPiBpcHAKKyAgICBwYXRoX3RyYW5zZmVyX2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUEFUSF9NT05JVE9SX0RBVEEpOworICAgIHBhdGhfd2FpdF9jb3VudCA9IFJFQURfVlJFRyhIRVZDX1BBVEhfTU9OSVRPUl9EQVRBKTsKKyAgICBpZiAocGF0aF90cmFuc2Zlcl9jb3VudCA9PSAwKSBwYXRoX3dhaXRfcmF0aW8gPSAwLjA7CisgICAgZWxzZSBwYXRoX3dhaXRfcmF0aW8gPSAoZmxvYXQpcGF0aF93YWl0X2NvdW50LyhmbG9hdClwYXRoX3RyYW5zZmVyX2NvdW50OworICAgIHByaW50aygiICUuMmYiLCBwYXRoX3dhaXRfcmF0aW8pOworCisvLyBkYmxrIDwtLSBpcHAKKyAgICBwYXRoX3RyYW5zZmVyX2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUEFUSF9NT05JVE9SX0RBVEEpOworICAgIHBhdGhfd2FpdF9jb3VudCA9IFJFQURfVlJFRyhIRVZDX1BBVEhfTU9OSVRPUl9EQVRBKTsKKyAgICBpZiAocGF0aF90cmFuc2Zlcl9jb3VudCA9PSAwKSBwYXRoX3dhaXRfcmF0aW8gPSAwLjA7CisgICAgZWxzZSBwYXRoX3dhaXRfcmF0aW8gPSAoZmxvYXQpcGF0aF93YWl0X2NvdW50LyhmbG9hdClwYXRoX3RyYW5zZmVyX2NvdW50OworICAgIHByaW50aygiICUuMmYiLCBwYXRoX3dhaXRfcmF0aW8pOworCisvLyBkYmxrIC0tPiBvdworICAgIHBhdGhfdHJhbnNmZXJfY291bnQgPSBSRUFEX1ZSRUcoSEVWQ19QQVRIX01PTklUT1JfREFUQSk7CisgICAgcGF0aF93YWl0X2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUEFUSF9NT05JVE9SX0RBVEEpOworICAgIGlmIChwYXRoX3RyYW5zZmVyX2NvdW50ID09IDApIHBhdGhfd2FpdF9yYXRpbyA9IDAuMDsKKyAgICBlbHNlIHBhdGhfd2FpdF9yYXRpbyA9IChmbG9hdClwYXRoX3dhaXRfY291bnQvKGZsb2F0KXBhdGhfdHJhbnNmZXJfY291bnQ7CisgICAgcHJpbnRrKCIgJS4yZiIsIHBhdGhfd2FpdF9yYXRpbyk7CisKKy8vIDwtLT4gRERSCisgICAgcGF0aF90cmFuc2Zlcl9jb3VudCA9IFJFQURfVlJFRyhIRVZDX1BBVEhfTU9OSVRPUl9EQVRBKTsKKyAgICBwYXRoX3dhaXRfY291bnQgPSBSRUFEX1ZSRUcoSEVWQ19QQVRIX01PTklUT1JfREFUQSk7CisgICAgaWYgKHBhdGhfdHJhbnNmZXJfY291bnQgPT0gMCkgcGF0aF93YWl0X3JhdGlvID0gMC4wOworICAgIGVsc2UgcGF0aF93YWl0X3JhdGlvID0gKGZsb2F0KXBhdGhfd2FpdF9jb3VudC8oZmxvYXQpcGF0aF90cmFuc2Zlcl9jb3VudDsKKyAgICBwcmludGsoIiAlLjJmIiwgcGF0aF93YWl0X3JhdGlvKTsKKworLy8gQ01ECisgICAgcGF0aF90cmFuc2Zlcl9jb3VudCA9IFJFQURfVlJFRyhIRVZDX1BBVEhfTU9OSVRPUl9EQVRBKTsKKyAgICBwYXRoX3dhaXRfY291bnQgPSBSRUFEX1ZSRUcoSEVWQ19QQVRIX01PTklUT1JfREFUQSk7CisgICAgaWYgKHBhdGhfdHJhbnNmZXJfY291bnQgPT0gMCkgcGF0aF93YWl0X3JhdGlvID0gMC4wOworICAgIGVsc2UgcGF0aF93YWl0X3JhdGlvID0gKGZsb2F0KXBhdGhfd2FpdF9jb3VudC8oZmxvYXQpcGF0aF90cmFuc2Zlcl9jb3VudDsKKyAgICBwcmludGsoIiAlLjJmXG4iLCBwYXRoX3dhaXRfcmF0aW8pOworICB9Cit9CisKKyNlbmRpZgorCisjaWZkZWYgTUNSQ0NfRU5BQkxFCisKK3N0YXRpYyBpbnQgbWNyY2NfaGl0X3JhdGU7CitzdGF0aWMgaW50IG1jcmNjX2J5cGFzc19yYXRlOworCisjZGVmaW5lIENfUmVnX1dyICBXUklURV9WUkVHCitzdGF0aWMgdm9pZCBDX1JlZ19SZCh1bnNpZ25lZCBpbnQgYWRyLCB1bnNpZ25lZCBpbnQgKnZhbCkKK3sKKwkqdmFsID0gUkVBRF9WUkVHKGFkcik7Cit9CisKK3N0YXRpYyB2b2lkIG1jcmNjX3BlcmZjb3VudF9yZXNldChzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsCisJCSJbY2FjaGVfdXRpbC5jXSBFbnRlcmVkIG1jcmNjX3BlcmZjb3VudF9yZXNldC4uLlxuIik7CisJQ19SZWdfV3IoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpMHgxKTsKKwlDX1JlZ19XcihIRVZDRF9NQ1JDQ19QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkweDApOworCXJldHVybjsKK30KKworc3RhdGljIHVuc2lnbmVkIHJhd19tY3JfY250X3RvdGFsX3ByZXY7CitzdGF0aWMgdW5zaWduZWQgaGl0X21jcl8wX2NudF90b3RhbF9wcmV2Oworc3RhdGljIHVuc2lnbmVkIGhpdF9tY3JfMV9jbnRfdG90YWxfcHJldjsKK3N0YXRpYyB1bnNpZ25lZCBieXBfbWNyX2NudF9uY2hjYW52X3RvdGFsX3ByZXY7CitzdGF0aWMgdW5zaWduZWQgYnlwX21jcl9jbnRfbmNob3V0d2luX3RvdGFsX3ByZXY7CisKK3N0YXRpYyB2b2lkIG1jcmNjX2dldF9oaXRyYXRlKHN0cnVjdCBBVjFIV19zICpodywgdW5zaWduZWQgcmVzZXRfcHJlKQoreworCXVuc2lnbmVkICBkZWx0YV9oaXRfbWNyXzBfY250OworCXVuc2lnbmVkICBkZWx0YV9oaXRfbWNyXzFfY250OworCXVuc2lnbmVkICBkZWx0YV9yYXdfbWNyX2NudDsKKwl1bnNpZ25lZCAgZGVsdGFfbWNyX2NudF9uY2hjYW52OworCXVuc2lnbmVkICBkZWx0YV9tY3JfY250X25jaG91dHdpbjsKKworCXVuc2lnbmVkICAgdG1wOworCXVuc2lnbmVkICAgcmF3X21jcl9jbnQ7CisJdW5zaWduZWQgICBoaXRfbWNyX2NudDsKKwl1bnNpZ25lZCAgIGJ5cF9tY3JfY250X25jaG91dHdpbjsKKwl1bnNpZ25lZCAgIGJ5cF9tY3JfY250X25jaGNhbnY7CisJaW50ICAgICAgaGl0cmF0ZTsKKworCWlmIChyZXNldF9wcmUpIHsKKwkJcmF3X21jcl9jbnRfdG90YWxfcHJldiA9IDA7CisJCWhpdF9tY3JfMF9jbnRfdG90YWxfcHJldiA9IDA7CisJCWhpdF9tY3JfMV9jbnRfdG90YWxfcHJldiA9IDA7CisJCWJ5cF9tY3JfY250X25jaGNhbnZfdG90YWxfcHJldiA9IDA7CisJCWJ5cF9tY3JfY250X25jaG91dHdpbl90b3RhbF9wcmV2ID0gMDsKKwl9CisJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsICJbY2FjaGVfdXRpbC5jXSBFbnRlcmVkIG1jcmNjX2dldF9oaXRyYXRlLi4uXG4iKTsKKwlDX1JlZ19XcihIRVZDRF9NQ1JDQ19QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHgwPDwxKSk7CisJQ19SZWdfUmQoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9EQVRBLCAmcmF3X21jcl9jbnQpOworCUNfUmVnX1dyKEhFVkNEX01DUkNDX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDE8PDEpKTsKKwlDX1JlZ19SZChIRVZDRF9NQ1JDQ19QRVJGTU9OX0RBVEEsICZoaXRfbWNyX2NudCk7CisJQ19SZWdfV3IoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4Mjw8MSkpOworCUNfUmVnX1JkKEhFVkNEX01DUkNDX1BFUkZNT05fREFUQSwgJmJ5cF9tY3JfY250X25jaG91dHdpbik7CisJQ19SZWdfV3IoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4Mzw8MSkpOworCUNfUmVnX1JkKEhFVkNEX01DUkNDX1BFUkZNT05fREFUQSwgJmJ5cF9tY3JfY250X25jaGNhbnYpOworCisJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsICJyYXdfbWNyX2NudF90b3RhbDogJWRcbiIscmF3X21jcl9jbnQpOworCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLCAiaGl0X21jcl9jbnRfdG90YWw6ICVkXG4iLGhpdF9tY3JfY250KTsKKwlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19DQUNIRV9ISVRfUkFURSwgImJ5cF9tY3JfY250X25jaG91dHdpbl90b3RhbDogJWRcbiIsYnlwX21jcl9jbnRfbmNob3V0d2luKTsKKwlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19DQUNIRV9ISVRfUkFURSwgImJ5cF9tY3JfY250X25jaGNhbnZfdG90YWw6ICVkXG4iLGJ5cF9tY3JfY250X25jaGNhbnYpOworCisJZGVsdGFfcmF3X21jcl9jbnQgPSByYXdfbWNyX2NudCAtIHJhd19tY3JfY250X3RvdGFsX3ByZXY7CisJZGVsdGFfbWNyX2NudF9uY2hjYW52ID0gYnlwX21jcl9jbnRfbmNoY2FudiAtIGJ5cF9tY3JfY250X25jaGNhbnZfdG90YWxfcHJldjsKKwlkZWx0YV9tY3JfY250X25jaG91dHdpbiA9IGJ5cF9tY3JfY250X25jaG91dHdpbiAtIGJ5cF9tY3JfY250X25jaG91dHdpbl90b3RhbF9wcmV2OworCXJhd19tY3JfY250X3RvdGFsX3ByZXYgPSByYXdfbWNyX2NudDsKKwlieXBfbWNyX2NudF9uY2hjYW52X3RvdGFsX3ByZXYgPSBieXBfbWNyX2NudF9uY2hjYW52OworCWJ5cF9tY3JfY250X25jaG91dHdpbl90b3RhbF9wcmV2ID0gYnlwX21jcl9jbnRfbmNob3V0d2luOworCisJQ19SZWdfV3IoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4NDw8MSkpOworCUNfUmVnX1JkKEhFVkNEX01DUkNDX1BFUkZNT05fREFUQSwgJnRtcCk7CisJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsICJtaXNzX21jcl8wX2NudF90b3RhbDogJWRcbiIsdG1wKTsKKwlDX1JlZ19XcihIRVZDRF9NQ1JDQ19QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHg1PDwxKSk7CisJQ19SZWdfUmQoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9EQVRBLCAmdG1wKTsKKwlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19DQUNIRV9ISVRfUkFURSwgIm1pc3NfbWNyXzFfY250X3RvdGFsOiAlZFxuIix0bXApOworCUNfUmVnX1dyKEhFVkNEX01DUkNDX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDY8PDEpKTsKKwlDX1JlZ19SZChIRVZDRF9NQ1JDQ19QRVJGTU9OX0RBVEEsICZ0bXApOworCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLCAiaGl0X21jcl8wX2NudF90b3RhbDogJWRcbiIsdG1wKTsKKwlkZWx0YV9oaXRfbWNyXzBfY250ID0gdG1wIC0gaGl0X21jcl8wX2NudF90b3RhbF9wcmV2OworCWhpdF9tY3JfMF9jbnRfdG90YWxfcHJldiA9IHRtcDsKKwlDX1JlZ19XcihIRVZDRF9NQ1JDQ19QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHg3PDwxKSk7CisJQ19SZWdfUmQoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9EQVRBLCAmdG1wKTsKKwlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19DQUNIRV9ISVRfUkFURSwgImhpdF9tY3JfMV9jbnRfdG90YWw6ICVkXG4iLHRtcCk7CisJZGVsdGFfaGl0X21jcl8xX2NudCA9IHRtcCAtIGhpdF9tY3JfMV9jbnRfdG90YWxfcHJldjsKKwloaXRfbWNyXzFfY250X3RvdGFsX3ByZXYgPSB0bXA7CisKKwlpZiAoIGRlbHRhX3Jhd19tY3JfY250ICE9IDAgKSB7CisJCWhpdHJhdGUgPSAxMDAgKiBkZWx0YV9oaXRfbWNyXzBfY250LyBkZWx0YV9yYXdfbWNyX2NudDsKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsICJDQU5WMF9ISVRfUkFURSA6ICVkXG4iLCBoaXRyYXRlKTsKKwkJaGl0cmF0ZSA9IDEwMCAqIGRlbHRhX2hpdF9tY3JfMV9jbnQvZGVsdGFfcmF3X21jcl9jbnQ7CisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLCAiQ0FOVjFfSElUX1JBVEUgOiAlZFxuIiwgaGl0cmF0ZSk7CisJCWhpdHJhdGUgPSAxMDAgKiBkZWx0YV9tY3JfY250X25jaGNhbnYvZGVsdGFfcmF3X21jcl9jbnQ7CisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLCAiTk9OQ0FDSF9DQU5WX0JZUF9SQVRFIDogJWRcbiIsIGhpdHJhdGUpOworCQloaXRyYXRlID0gMTAwICogZGVsdGFfbWNyX2NudF9uY2hvdXR3aW4vZGVsdGFfcmF3X21jcl9jbnQ7CisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLCAiQ0FDSEVfT1VUV0lOX0JZUF9SQVRFIDogJWRcbiIsIGhpdHJhdGUpOworCX0KKworCWlmIChyYXdfbWNyX2NudCAhPSAwKQorCXsKKwkJaGl0cmF0ZSA9IDEwMCpoaXRfbWNyX2NudC9yYXdfbWNyX2NudDsKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsICJNQ1JDQ19ISVRfUkFURSA6ICVkXG4iLCBoaXRyYXRlKTsKKwkJaGl0cmF0ZSA9IDEwMCooYnlwX21jcl9jbnRfbmNob3V0d2luICsgYnlwX21jcl9jbnRfbmNoY2FudikvcmF3X21jcl9jbnQ7CisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLCAiTUNSQ0NfQllQX1JBVEUgOiAlZFxuIiwgaGl0cmF0ZSk7CisJfSBlbHNlIHsKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsICJNQ1JDQ19ISVRfUkFURSA6IG5hXG4iKTsKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsICJNQ1JDQ19CWVBfUkFURSA6IG5hXG4iKTsKKwl9CisJbWNyY2NfaGl0X3JhdGUgPSAxMDAqaGl0X21jcl9jbnQvcmF3X21jcl9jbnQ7CisJbWNyY2NfYnlwYXNzX3JhdGUgPSAxMDAqKGJ5cF9tY3JfY250X25jaG91dHdpbiArIGJ5cF9tY3JfY250X25jaGNhbnYpL3Jhd19tY3JfY250OworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBkZWNvbXBfcGVyZmNvdW50X3Jlc2V0KHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19DQUNIRV9ISVRfUkFURSwgIltjYWNoZV91dGlsLmNdIEVudGVyZWQgZGVjb21wX3BlcmZjb3VudF9yZXNldC4uLlxuIik7CisJQ19SZWdfV3IoSEVWQ0RfTVBQX0RFQ09NUF9QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkweDEpOworCUNfUmVnX1dyKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpMHgwKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGRlY29tcF9nZXRfaGl0cmF0ZShzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJdW5zaWduZWQgICByYXdfbWNyX2NudDsKKwl1bnNpZ25lZCAgIGhpdF9tY3JfY250OworCWludCAgaGl0cmF0ZTsKKworCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLCAiW2NhY2hlX3V0aWwuY10gRW50ZXJlZCBkZWNvbXBfZ2V0X2hpdHJhdGUuLi5cbiIpOworCUNfUmVnX1dyKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4MDw8MSkpOworCUNfUmVnX1JkKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9EQVRBLCAmcmF3X21jcl9jbnQpOworCUNfUmVnX1dyKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4MTw8MSkpOworCUNfUmVnX1JkKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9EQVRBLCAmaGl0X21jcl9jbnQpOworCisJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsICJoY2FjaGVfcmF3X2NudF90b3RhbDogJWRcbiIscmF3X21jcl9jbnQpOworCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLCAiaGNhY2hlX2hpdF9jbnRfdG90YWw6ICVkXG4iLGhpdF9tY3JfY250KTsKKworCWlmICggcmF3X21jcl9jbnQgIT0gMCApIHsKKwkJaGl0cmF0ZSA9IDEwMCpoaXRfbWNyX2NudC9yYXdfbWNyX2NudDsKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsICJERUNPTVBfSENBQ0hFX0hJVF9SQVRFIDogJS4yZlwlXG4iLCBoaXRyYXRlKTsKKwl9IGVsc2UgeworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19DQUNIRV9ISVRfUkFURSwgIkRFQ09NUF9IQ0FDSEVfSElUX1JBVEUgOiBuYVxuIik7CisJfQorCUNfUmVnX1dyKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4Mjw8MSkpOworCUNfUmVnX1JkKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9EQVRBLCAmcmF3X21jcl9jbnQpOworCUNfUmVnX1dyKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4Mzw8MSkpOworCUNfUmVnX1JkKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9EQVRBLCAmaGl0X21jcl9jbnQpOworCisJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsICJkY2FjaGVfcmF3X2NudF90b3RhbDogJWRcbiIscmF3X21jcl9jbnQpOworCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLCAiZGNhY2hlX2hpdF9jbnRfdG90YWw6ICVkXG4iLGhpdF9tY3JfY250KTsKKworCWlmICggcmF3X21jcl9jbnQgIT0gMCApIHsKKwkJaGl0cmF0ZSA9IDEwMCpoaXRfbWNyX2NudC9yYXdfbWNyX2NudDsKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsICJERUNPTVBfRENBQ0hFX0hJVF9SQVRFIDogJWRcbiIsIGhpdHJhdGUpOworCisJCS8vaGl0cmF0ZSA9ICgoZmxvYXQpaGl0X21jcl9jbnQvKGZsb2F0KXJhd19tY3JfY250KTsKKwkJLy9oaXRyYXRlID0gKG1jcmNjX2hpdF9yYXRlICsgKG1jcmNjX2J5cGFzc19yYXRlICogaGl0cmF0ZSkpKjEwMDsKKwkJaGl0cmF0ZSA9IG1jcmNjX2hpdF9yYXRlICsgKG1jcmNjX2J5cGFzc19yYXRlICogaGl0X21jcl9jbnQvcmF3X21jcl9jbnQpOworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19DQUNIRV9ISVRfUkFURSwgIk1DUkNDX0RFQ09NUF9EQ0FDSEVfRUZGRUNUSVZFX0hJVF9SQVRFIDogJWRcbiIsIGhpdHJhdGUpOworCisJfSBlbHNlIHsKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsICJERUNPTVBfRENBQ0hFX0hJVF9SQVRFIDogbmFcbiIpOworCX0KKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgZGVjb21wX2dldF9jb21wcmF0ZShzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJdW5zaWduZWQgICByYXdfdWNvbXBfY250OworCXVuc2lnbmVkICAgZmFzdF9jb21wX2NudDsKKwl1bnNpZ25lZCAgIHNsb3dfY29tcF9jbnQ7CisJaW50ICAgICAgY29tcHJhdGU7CisKKwlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19DQUNIRV9ISVRfUkFURSwgIltjYWNoZV91dGlsLmNdIEVudGVyZWQgZGVjb21wX2dldF9jb21wcmF0ZS4uLlxuIik7CisJQ19SZWdfV3IoSEVWQ0RfTVBQX0RFQ09NUF9QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHg0PDwxKSk7CisJQ19SZWdfUmQoSEVWQ0RfTVBQX0RFQ09NUF9QRVJGTU9OX0RBVEEsICZmYXN0X2NvbXBfY250KTsKKwlDX1JlZ19XcihIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDU8PDEpKTsKKwlDX1JlZ19SZChIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fREFUQSwgJnNsb3dfY29tcF9jbnQpOworCUNfUmVnX1dyKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4Njw8MSkpOworCUNfUmVnX1JkKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9EQVRBLCAmcmF3X3Vjb21wX2NudCk7CisKKwlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19DQUNIRV9ISVRfUkFURSwgImRlY29tcF9mYXN0X2NvbXBfdG90YWw6ICVkXG4iLGZhc3RfY29tcF9jbnQpOworCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLCAiZGVjb21wX3Nsb3dfY29tcF90b3RhbDogJWRcbiIsc2xvd19jb21wX2NudCk7CisJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsICJkZWNvbXBfcmF3X3VuY29tcF90b3RhbDogJWRcbiIscmF3X3Vjb21wX2NudCk7CisKKwlpZiAoIHJhd191Y29tcF9jbnQgIT0gMCApCisJeworCQljb21wcmF0ZSA9IDEwMCooZmFzdF9jb21wX2NudCArIHNsb3dfY29tcF9jbnQpL3Jhd191Y29tcF9jbnQ7CisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLCAiREVDT01QX0NPTVBfUkFUSU8gOiAlZFxuIiwgY29tcHJhdGUpOworCX0gZWxzZQorCXsKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsICJERUNPTVBfQ09NUF9SQVRJTyA6IG5hXG4iKTsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2hpdF9yYXRlKHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlpZiAoZGVidWcgJiBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUpIHsKKwkJbWNyY2NfZ2V0X2hpdHJhdGUoaHcsIGh3LT5tX2luc19mbGFnKTsKKwkJZGVjb21wX2dldF9oaXRyYXRlKGh3KTsKKwkJZGVjb21wX2dldF9jb21wcmF0ZShodyk7CisJfQorfQorCitzdGF0aWMgIHVpbnQzMl90ICBtY3JjY19nZXRfYWJzX2ZyYW1lX2Rpc3RhbmNlKHN0cnVjdCBBVjFIV19zICpodywgdWludDMyX3QgcmVmaWQsIHVpbnQzMl90IHJlZl9vaGludCwgdWludDMyX3QgY3Vycl9vaGludCwgdWludDMyX3Qgb2hpbnRfYml0c19taW4xKQoreworCWludDMyX3QgZGlmZl9vaGludDA7CisJaW50MzJfdCBkaWZmX29oaW50MTsKKwl1aW50MzJfdCBhYnNfZGlzdDsKKwl1aW50MzJfdCBtOworCXVpbnQzMl90IG1fbWluMTsKKworCWRpZmZfb2hpbnQwID0gcmVmX29oaW50IC0gY3Vycl9vaGludDsKKworCW0gPSAoMSA8PCBvaGludF9iaXRzX21pbjEpOworCW1fbWluMSA9IG0gLTE7CisKKwlkaWZmX29oaW50MSA9IChkaWZmX29oaW50MCAmIG1fbWluMSApIC0gKGRpZmZfb2hpbnQwICYgbSk7CisKKwlhYnNfZGlzdCA9IChkaWZmX29oaW50MSA8IDApID8gLWRpZmZfb2hpbnQxIDogZGlmZl9vaGludDE7CisKKwlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19DQUNIRV9ISVRfUkFURSwKKwkJIltjYWNoZV91dGlsLmNdIHJlZmlkOiUweCByZWZfb3JkZXJoaW50OiUweCBjdXJyX29yZGVyaGludDolMHggb3JkZXJoaW50X2JpdHNfbWluMTolMHggYWJkX2Rpc3Q6JTB4XG4iLAorCQlyZWZpZCwgcmVmX29oaW50LCBjdXJyX29oaW50LCBvaGludF9iaXRzX21pbjEsYWJzX2Rpc3QpOworCisJcmV0dXJuICBhYnNfZGlzdDsKK30KKworc3RhdGljIHZvaWQgIGNvbmZpZ19tY3JjY19heGlfaHdfbmVhcmVzdF9yZWYoc3RydWN0IEFWMUhXX3MgKmh3KQoreworCXVpbnQzMl90IGk7CisJdWludDMyX3QgcmRhdGEzMjsKKwl1aW50MzJfdCBkaXN0X2FycmF5WzhdOworCXVpbnQzMl90IHJlZmNhbnZhc19hcnJheVsyXTsKKwl1aW50MzJfdCBvcmRlcmhpbnRfYml0czsKKwl1bnNpZ25lZCBjaGFyIGlzX2ludGVyOworCUFWMV9DT01NT04gKmNtID0gJmh3LT5jb21tb247CisJUElDX0JVRkZFUl9DT05GSUcgKmN1cnJfcGljX2NvbmZpZzsKKwlpbnQzMl90ICBjdXJyX29yZGVyaGludDsKKwlpbnQgY2luZGV4MCA9IExBU1RfRlJBTUU7CisJdWludDMyX3QgICAgbGFzdF9yZWZfb3JkZXJoaW50X2Rpc3QgPSAxMDIzOyAvLyBsYXJnZSBkaXN0YW5jZQorCXVpbnQzMl90ICAgIGN1cnJfcmVmX29yZGVyaGludF9kaXN0ID0gMTAyMzsgLy8gbGFyZ2UgZGlzdGFuY2UKKwlpbnQgY2luZGV4MTsKKwlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19DQUNIRV9ISVRfUkFURSwKKwkJIlt0ZXN0LmNdICMjIyMgY29uZmlnX21jcmNjX2F4aV9odyAjIyMjXG4iKTsKKworCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMSwgMHgyKTsgLy8gcmVzZXQgbWNyY2MKKworCWlzX2ludGVyID0gYXYxX2ZyYW1lX2lzX2ludGVyKCZody0+Y29tbW9uKTsgLy8oKHBiaS0+Y29tbW9uLmZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKSAmJiAoIXBiaS0+Y29tbW9uLmludHJhX29ubHkpKSA/IDEgOiAwOworCWlmICggIWlzX2ludGVyICkgeyAvLyBJLVBJQworCQkvL1dSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMSwgMHgxKTsgLy8gcmVtb3ZlIHJlc2V0IC0tIGRpc2FibGVzIGNsb2NrCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMiwgMHhmZmZmZmZmZik7IC8vIFJlcGxhY2Ugd2l0aCBjdXJyZW50LWZyYW1lIGNhbnZhcworCQlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDMsIDB4ZmZmZmZmZmYpOyAvLworCQlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDEsIDB4ZmYwKTsgLy8gZW5hYmxlIG1jcmNjIHByb2dyZXNzaXZlLW1vZGUKKwkJcmV0dXJuOworCX0KKworI2lmIDAKKwkvL3ByaW50aygiYmVmb3JlIGNhbGwgbWNyY2NfZ2V0X2hpdHJhdGVcclxuIik7CisJbWNyY2NfZ2V0X2hpdHJhdGUoaHcpOworCWRlY29tcF9nZXRfaGl0cmF0ZShodyk7CisJZGVjb21wX2dldF9jb21wcmF0ZShodyk7CisjZW5kaWYKKworCS8vIEZpbmQgYWJzb2x1dGUgb3JkZXJoaW50IGRlbHRhCisJY3Vycl9waWNfY29uZmlnID0gICZjbS0+Y3VyX2ZyYW1lLT5idWY7CisJY3Vycl9vcmRlcmhpbnQgPSBjdXJyX3BpY19jb25maWctPm9yZGVyX2hpbnQ7CisJb3JkZXJoaW50X2JpdHMgPSBjbS0+c2VxX3BhcmFtcy5vcmRlcl9oaW50X2luZm8ub3JkZXJfaGludF9iaXRzX21pbnVzXzE7CisJZm9yIChpID0gTEFTVF9GUkFNRTsgaSA8PSBBTFRSRUZfRlJBTUU7IGkrKykgeworCQlpbnQzMl90ICByZWZfb3JkZXJoaW50ID0gMDsKKwkJUElDX0JVRkZFUl9DT05GSUcgKnBpY19jb25maWc7CisJCS8vaW50MzJfdCAgdG1wOworCQlwaWNfY29uZmlnID0gYXYxX2dldF9yZWZfZnJhbWVfc3BlY19idWYoY20saSk7CisJCWlmIChwaWNfY29uZmlnKQorCQkJcmVmX29yZGVyaGludCA9IHBpY19jb25maWctPm9yZGVyX2hpbnQ7CisJCS8vdG1wID0gY3Vycl9vcmRlcmhpbnQgLSByZWZfb3JkZXJoaW50OworCQkvL2Rpc3RfYXJyYXlbaV0gPSAgKHRtcCA8IDApID8gLXRtcCA6IHRtcDsKKwkJZGlzdF9hcnJheVtpXSA9ICBtY3JjY19nZXRfYWJzX2ZyYW1lX2Rpc3RhbmNlKGh3LCBpLHJlZl9vcmRlcmhpbnQsIGN1cnJfb3JkZXJoaW50LCBvcmRlcmhpbnRfYml0cyk7CisJfQorCS8vIEdldCBzbWFsbGVzdCBvcmRlcmhpbnQgZGlzdGFuY2UgcmVmaWQKKwlmb3IgKGkgPSBMQVNUX0ZSQU1FOyBpIDw9IEFMVFJFRl9GUkFNRTsgaSsrKSB7CisJCVBJQ19CVUZGRVJfQ09ORklHICpwaWNfY29uZmlnOworCQlwaWNfY29uZmlnID0gYXYxX2dldF9yZWZfZnJhbWVfc3BlY19idWYoY20sIGkpOworCQljdXJyX3JlZl9vcmRlcmhpbnRfZGlzdCA9IGRpc3RfYXJyYXlbaV07CisJCWlmICggY3Vycl9yZWZfb3JkZXJoaW50X2Rpc3QgPCBsYXN0X3JlZl9vcmRlcmhpbnRfZGlzdCkgeworCQkJY2luZGV4MCA9IGk7CisJCQlsYXN0X3JlZl9vcmRlcmhpbnRfZGlzdCA9IGN1cnJfcmVmX29yZGVyaGludF9kaXN0OworCQl9CisJfQorCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfQUNDQ09ORklHX0FERFIsIChjaW5kZXgwIDw8IDgpIHwgKDE8PDEpIHwgMCk7CisJcmVmY2FudmFzX2FycmF5WzBdID0gUkVBRF9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUikgJiAweGZmZmY7CisKKwlsYXN0X3JlZl9vcmRlcmhpbnRfZGlzdCA9IDEwMjM7IC8vIGxhcmdlIGRpc3RhbmNlCisJY3Vycl9yZWZfb3JkZXJoaW50X2Rpc3QgPSAxMDIzOyAvLyBsYXJnZSBkaXN0YW5jZQorCS8vIEdldCAybmQgc21hbGxlc3Qgb3JkZXJoaW50IGRpc3RhbmNlIHJlZmlkCisJY2luZGV4MSA9IExBU1RfRlJBTUU7CisJZm9yIChpID0gTEFTVF9GUkFNRTsgaSA8PSBBTFRSRUZfRlJBTUU7IGkrKykgeworCQlQSUNfQlVGRkVSX0NPTkZJRyAqcGljX2NvbmZpZzsKKwkJcGljX2NvbmZpZyA9IGF2MV9nZXRfcmVmX2ZyYW1lX3NwZWNfYnVmKGNtLCBpKTsKKwkJY3Vycl9yZWZfb3JkZXJoaW50X2Rpc3QgPSBkaXN0X2FycmF5W2ldOworCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0FDQ0NPTkZJR19BRERSLCAoaSA8PCA4KSB8ICgxPDwxKSB8IDApOworCQlyZWZjYW52YXNfYXJyYXlbMV0gPSBSRUFEX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSKSAmIDB4ZmZmZjsKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsICJbY2FjaGVfdXRpbC5jXSBjdXJyX3JlZl9vcmRlcmhpbnRfZGlzdDoleCBsYXN0X3JlZl9vcmRlcmhpbnRfZGlzdDoleCByZWZjYW52YXNfYXJyYXlbMF06JXggcmVmY2FudmFzX2FycmF5WzFdOiV4XG4iLAorCQljdXJyX3JlZl9vcmRlcmhpbnRfZGlzdCwgbGFzdF9yZWZfb3JkZXJoaW50X2Rpc3QsIHJlZmNhbnZhc19hcnJheVswXSxyZWZjYW52YXNfYXJyYXlbMV0pOworCQlpZiAoKGN1cnJfcmVmX29yZGVyaGludF9kaXN0IDwgbGFzdF9yZWZfb3JkZXJoaW50X2Rpc3QpICYmIChyZWZjYW52YXNfYXJyYXlbMF0gIT0gcmVmY2FudmFzX2FycmF5WzFdKSkgeworCQkJY2luZGV4MSA9IGk7CisJCQlsYXN0X3JlZl9vcmRlcmhpbnRfZGlzdCA9IGN1cnJfcmVmX29yZGVyaGludF9kaXN0OworCQl9CisJfQorCisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwgKGNpbmRleDAgPDwgOCkgfCAoMTw8MSkgfCAwKTsKKwlyZWZjYW52YXNfYXJyYXlbMF0gPSBSRUFEX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSKTsKKwlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0FDQ0NPTkZJR19BRERSLCAoY2luZGV4MSA8PCA4KSB8ICgxPDwxKSB8IDApOworCXJlZmNhbnZhc19hcnJheVsxXSA9IFJFQURfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIpOworCisJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsICJbY2FjaGVfdXRpbC5jXSByZWZjYW52YXNfYXJyYXlbMF0oaW5kZXggJWQpOiV4IHJlZmNhbnZhc19hcnJheVsxXShpbmRleCAlZCk6JXhcbiIsCisJY2luZGV4MCwgcmVmY2FudmFzX2FycmF5WzBdLCBjaW5kZXgxLCByZWZjYW52YXNfYXJyYXlbMV0pOworCisJLy8gbG93ZXN0IGRlbHRhX3BpY251bQorCXJkYXRhMzIgPSByZWZjYW52YXNfYXJyYXlbMF07CisJcmRhdGEzMiA9IHJkYXRhMzIgJiAweGZmZmY7CisJcmRhdGEzMiA9IHJkYXRhMzIgfCAoIHJkYXRhMzIgPDwgMTYpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMiwgcmRhdGEzMik7CisKKwkvLyAybmQtbG93ZXN0IGRlbHRhX3BpY251bQorCXJkYXRhMzIgPSByZWZjYW52YXNfYXJyYXlbMV07CisJcmRhdGEzMiA9IHJkYXRhMzIgJiAweGZmZmY7CisJcmRhdGEzMiA9IHJkYXRhMzIgfCAoIHJkYXRhMzIgPDwgMTYpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMywgcmRhdGEzMik7CisKKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDEsIDB4ZmYwKTsgLy8gZW5hYmxlIG1jcmNjIHByb2dyZXNzaXZlLW1vZGUKKwlyZXR1cm47Cit9CisKKworI2VuZGlmCisKKyNpZiAwCit2b2lkIHJlbGVhc2VfdW51c2VkXzRrX2V4dChNTVVfQlVGRl9NR1IgKm1tdW1nciwgaW50MzJfdCBjdXJfYnVmX2lkeCwgbG9uZyB1c2VkXzRrX251bSkKK3sKKyAgaW50MzJfdCByZWxlYXNlXzRrX3Bvc2l0aW9uOworICBpbnQzMl90IGk7CisKKyAgaWYobW11bWdyLT5tbXVfcGljX2NvdW50IDwgMCkgcmV0dXJuOworCisgIG1tdW1nci0+bW11X29mZnNldF9zZWVkID0gdXNlZF80a19udW0gJiAweGZmOworICBpZih1c2VkXzRrX251bSA+IG1tdW1nci0+bW11X2J1ZltjdXJfYnVmX2lkeF0ubW11XzRrX251bWJlcikgeworICAgIHByaW50aygiW01NVSBNRU0gRVJST1JdIDogVXNlIG1vcmUgNEsgUGFnZSB0aGFuIGFsbG9jYXRlZCAgJWQgPiAoWyVkXSA9ICVkKSEhXHJcbiIsIHVzZWRfNGtfbnVtLCBjdXJfYnVmX2lkeCwgbW11bWdyLT5tbXVfYnVmW2N1cl9idWZfaWR4XS5tbXVfNGtfbnVtYmVyKTsKKyAgfQorICBlbHNlIHByaW50aygiW01NVSBNRU0gUkVMRUFTRV0gOiBQJWQoYnVmZmVyICVkKSB1c2VkICVkIG9mICVkIDRrIGJ1ZmZlciAoJWQlYylcclxuIiwgbW11bWdyLT5tbXVfcGljX2NvdW50LCBjdXJfYnVmX2lkeCwgdXNlZF80a19udW0sIG1tdW1nci0+bW11X2J1ZltjdXJfYnVmX2lkeF0ubW11XzRrX251bWJlciwgdXNlZF80a19udW0qMTAwL21tdW1nci0+bW11X2J1ZltjdXJfYnVmX2lkeF0ubW11XzRrX251bWJlciwgJyUnKTsKKworICBmb3IoaSA9IHVzZWRfNGtfbnVtOyBpPG1tdW1nci0+bW11X2J1ZltjdXJfYnVmX2lkeF0ubW11XzRrX251bWJlcjsgaSsrKXsKKyAgICByZWxlYXNlXzRrX3Bvc2l0aW9uID0gbW11bWdyLT5tbXVfYnVmW2N1cl9idWZfaWR4XS5tbXVfNGtfaW5kZXhbaV0gLSBtbXVtZ3ItPk1DX0JVRkZFUl9TVEFSVF80S19BRFI7CisgICAgcHJpbnRrKCJbTU1VIE1FTSBSRUxFQVNFIERFQlVHXSByZWxlYXNlXzRrX3Bvc2l0aW9uWyVkXSA6IDB4JXhcbiIsIGksIHJlbGVhc2VfNGtfcG9zaXRpb24rbW11bWdyLT5NQ19CVUZGRVJfU1RBUlRfNEtfQURSKTsKKyAgICBtbXVtZ3ItPm1tdV80a19zdGF0dXNbcmVsZWFzZV80a19wb3NpdGlvbl0gPSAwOworICB9CisgIG1tdW1nci0+Y3VyX21lbV91c2FnZSAtPSAobW11bWdyLT5tbXVfYnVmW2N1cl9idWZfaWR4XS5tbXVfNGtfbnVtYmVyIC0gdXNlZF80a19udW0pKjQwOTY7CisgIG1tdW1nci0+bW11X2J1ZltjdXJfYnVmX2lkeF0ubW11XzRrX251bWJlciA9IHVzZWRfNGtfbnVtOworfQorI2VuZGlmCisKK2ludCBhdjFfY29udGludWVfZGVjb2Rpbmcoc3RydWN0IEFWMUhXX3MgKmh3LCBpbnQgb2J1X3R5cGUpCit7CisJaW50IHJldCA9IDA7CisjaWZkZWYgU0FOSVRZX0NIRUNLCisJcGFyYW1fdCogcGFyYW1zID0gJmh3LT5hb21fcGFyYW07CisjZW5kaWYKKyNpZiAxCisJLy9kZWYgQ0hBTkdFX0RPTkUKKwlBVjFEZWNvZGVyICpwYmkgPSBody0+cGJpOworCUFWMV9DT01NT04gKmNvbnN0IGNtID0gcGJpLT5jb21tb247CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPSAoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisJaW50IGk7CisKKwlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkiJXM6IHBiaSAlcCBjbSAlcCBjdXJfZnJhbWUgJXAgJWQgaGFzX3NlcSAlZCBoYXNfa2V5ZnJhbWUgJWRcbiIsCisJCV9fZnVuY19fLCBwYmksIGNtLCBjbS0+Y3VyX2ZyYW1lLAorCQlwYmktPmJ1Zm1ncl9wcm9jX2NvdW50LAorCQlody0+aGFzX3NlcXVlbmNlLAorCQlody0+aGFzX2tleWZyYW1lKTsKKworCWlmIChody0+aGFzX3NlcXVlbmNlID09IDApIHsKKwkJYXYxX3ByaW50KGh3LCAwLAorCQkJIm5vIHNlcXVlbmNlIGhlYWQsIHNraXBcbiIpOworCQlpZiAoIWh3LT5tX2luc19mbGFnKQorCQkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCBBT01fQVYxX1NFQVJDSF9IRUFEKTsKKwkJcmV0dXJuIC0yOworCX0gZWxzZSBpZiAoaHctPmhhc19rZXlmcmFtZSA9PSAwICYmCisJCWh3LT5hb21fcGFyYW0ucC5mcmFtZV90eXBlICE9IEtFWV9GUkFNRSl7CisJCWF2MV9wcmludChodywgMCwKKwkJCSJubyBrZXkgZnJhbWUsIHNraXBcbiIpOworCQlvbl9ub19rZXlmcmFtZV9za2lwZWQrKzsKKwkJaWYgKCFody0+bV9pbnNfZmxhZykKKwkJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgQU9NX0FWMV9TRUFSQ0hfSEVBRCk7CisJCXJldHVybiAtMjsKKwl9CisJaHctPmhhc19rZXlmcmFtZSA9IDE7CisJb25fbm9fa2V5ZnJhbWVfc2tpcGVkID0gMDsKKworCWlmIChody0+aXNfdXNlZF92NGwgJiYgY3R4LT5wYXJhbV9zZXRzX2Zyb21fdWNvZGUpCisJCWh3LT5yZXNfY2hfZmxhZyA9IDA7CisKKwkvL3ByZV9kZWNvZGVfaWR4ID0gcGJpLT5kZWNvZGVfaWR4OworCWlmIChwYmktPmJ1Zm1ncl9wcm9jX2NvdW50ID09IDAgfHwKKwlody0+b25lX2NvbXByZXNzZWRfZGF0YV9kb25lKSB7CisJCWh3LT5uZXdfY29tcHJlc3NlZF9kYXRhID0gMTsKKwkJaHctPm9uZV9jb21wcmVzc2VkX2RhdGFfZG9uZSA9IDA7CisJfSBlbHNlIHsKKwkJaHctPm5ld19jb21wcmVzc2VkX2RhdGEgPSAwOworCX0KKyNpZmRlZiBTRU5EX01NVV9VU0VEX05VTQorICAgICAgaWYgKGNtLT5wcmV2X2ZiX2lkeCAhPSBJTlZBTElEX0lEWCkgeworICAgICAgICAgICAgbG9uZyB1c2VkXzRrX251bSA9IGFvbV9wYXJhbS5wLm1tdV91c2VkX251bTsKKyAgICAgICAgICAgIGlmICh1c2VkXzRrX251bSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICBwcmludGsoIm1tdSBmcmVlIHRhaWwsIGluZGV4ICVkIHVzZWRfbnVtIDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICBjbS0+cHJldl9mYl9pZHgsIHVzZWRfNGtfbnVtKTsKKyAgICAgICAgICAgICAgICAgIHJlbGVhc2VfdW51c2VkXzRrX2V4dCgmYXYxX21tdW1ncl9tLCBjbS0+cHJldl9mYl9pZHgsIHVzZWRfNGtfbnVtKTsKKyAgICAgICAgICAgIH0KKworI2lmZGVmIEFPTV9BVjFfTU1VX0RXCisgICAgICAgICAgICB1c2VkXzRrX251bSA9IGFvbV9wYXJhbS5wLmR3X21tdV91c2VkX251bTsKKyAgICAgICAgICAgIGlmICh1c2VkXzRrX251bSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICByZWxlYXNlX3VudXNlZF80a19leHQoJmF2MV9tbXVtZ3JfZHcsIGNtLT5wcmV2X2ZiX2lkeCwgdXNlZF80a19udW0pOworICAgICAgICAgICAgICAgICAgcHJpbnRrKCJkdyBtbXUgZnJlZSB0YWlsLCBpbmRleCAlZCB1c2VkX251bSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgY20tPnByZXZfZmJfaWR4LCB1c2VkXzRrX251bSk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgIH0KKyAgICAgIGNtLT5wcmV2X2ZiX2lkeCA9IElOVkFMSURfSURYOworCisjZW5kaWYKKyNpZmRlZiBTQU5JVFlfQ0hFQ0sKKwlyZXQgPSAwOworCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCSJDaGVjayBQaWN0dXJlIHNpemUsIG1heCAoJWQsICVkKSwgd2lkdGgvaGVpZ2h0ICglZCwgJWQpLCBkZWNfd2lkdGggJWRcbiIsCisJCXBhcmFtcy0+cC5tYXhfZnJhbWVfd2lkdGgsCisJCXBhcmFtcy0+cC5tYXhfZnJhbWVfaGVpZ2h0LAorCQlwYXJhbXMtPnAuZnJhbWVfd2lkdGhfc2NhbGVkLAorCQlwYXJhbXMtPnAuZnJhbWVfaGVpZ2h0LAorCQlwYXJhbXMtPnAuZGVjX2ZyYW1lX3dpZHRoCisJKTsKKworCWlmICgvKnBhcmFtcy0+cC5tYXhfZnJhbWVfd2lkdGggPiBNQVhfUElDX1dJRFRIIHx8CisJcGFyYW1zLT5wLm1heF9mcmFtZV9oZWlnaHQgPiBNQVhfUElDX0hFSUdIVCB8fCovCisJKHBhcmFtcy0+cC5mcmFtZV93aWR0aF9zY2FsZWQgKiBwYXJhbXMtPnAuZnJhbWVfaGVpZ2h0KSA+IE1BWF9TSVpFXzhLIHx8CisJKHBhcmFtcy0+cC5kZWNfZnJhbWVfd2lkdGggKiBwYXJhbXMtPnAuZnJhbWVfaGVpZ2h0KSA+IE1BWF9TSVpFXzhLIHx8CisJcGFyYW1zLT5wLmZyYW1lX3dpZHRoX3NjYWxlZCA8PSAwIHx8CisJcGFyYW1zLT5wLmRlY19mcmFtZV93aWR0aCA8PSAwIHx8CisJcGFyYW1zLT5wLmZyYW1lX2hlaWdodCA8PSAwKSB7CisJCWF2MV9wcmludChodywgMCwgIiEhUGljdHVyZSBzaXplIGVycm9yLCBtYXggKCVkLCAlZCksIHdpZHRoL2hlaWdodCAoJWQsICVkKSwgZGVjX3dpZHRoICVkXG4iLAorCQkJcGFyYW1zLT5wLm1heF9mcmFtZV93aWR0aCwKKwkJCXBhcmFtcy0+cC5tYXhfZnJhbWVfaGVpZ2h0LAorCQkJcGFyYW1zLT5wLmZyYW1lX3dpZHRoX3NjYWxlZCwKKwkJCXBhcmFtcy0+cC5mcmFtZV9oZWlnaHQsCisJCQlwYXJhbXMtPnAuZGVjX2ZyYW1lX3dpZHRoCisJCSk7CisJCXJldCA9IC0xOworCX0KKyNlbmRpZgorCWlmIChyZXQgPj0gMCkgeworCQlyZXQgPSBhdjFfYnVmbWdyX3Byb2Nlc3MocGJpLCAmaHctPmFvbV9wYXJhbSwKKwkJCWh3LT5uZXdfY29tcHJlc3NlZF9kYXRhLCBvYnVfdHlwZSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIC0xOworCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkJIiVzOiBwYmkgJXAgY20gJXAgY3VyX2ZyYW1lICVwXG4iLAorCQkJX19mdW5jX18sIHBiaSwgY20sIGNtLT5jdXJfZnJhbWUpOworCisJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCQkiMSsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrJWQgJXBcbiIsCisJCQlyZXQsIGNtLT5jdXJfZnJhbWUpOworCQlpZiAoaHctPm5ld19jb21wcmVzc2VkX2RhdGEpCisJCQlXUklURV9WUkVHKFBJQ19FTkRfTENVX0NPVU5ULCAwKTsKKwl9CisJaWYgKHJldCA+IDApIHsKKwkJLyogdGhlIGNhc2Ugd2hlbiBjbS0+c2hvd19leGlzdGluZ19mcmFtZSBpcyAxICovCisJCS8qY2FzZSAzMDE2Ki8KKwkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJCSJEZWNvZGluZyBkb25lIChpbmRleD0lZCwgc2hvd19leGlzdGluZ19mcmFtZSA9ICVkKVxuIiwKKwkJCWNtLT5jdXJfZnJhbWU/IGNtLT5jdXJfZnJhbWUtPmJ1Zi5pbmRleDotMSwKKwkJCWNtLT5zaG93X2V4aXN0aW5nX2ZyYW1lCisJCQkpOworCisJCWlmIChjbS0+Y3VyX2ZyYW1lKSB7CisJCQlQSUNfQlVGRkVSX0NPTkZJRyogY3VyX3BpY19jb25maWcgPSAmY20tPmN1cl9mcmFtZS0+YnVmOworCQkJaWYgKGRlYnVnICYKKwkJCQlBVjFfREVCVUdfQlVGTUdSX01PUkUpCisJCQkJZHVtcF9hdXhfYnVmKGh3KTsKKwkJCXNldF9waWNfYXV4X2RhdGEoaHcsCisJCQkJY3VyX3BpY19jb25maWcsIDAsIDApOworCQl9CisJCWNvbmZpZ19uZXh0X3JlZl9pbmZvX2h3KGh3KTsKKworCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkJImFvbV9idWZtZ3JfcHJvY2Vzcz0+ICVkLGRlY29kZSBkb25lLCBBT01fQVYxX1NFQVJDSF9IRUFEXHJcbiIsIHJldCk7CisJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgQU9NX0FWMV9TRUFSQ0hfSEVBRCk7CisJCXBiaS0+ZGVjb2RlX2lkeCsrOworCQlwYmktPmJ1Zm1ncl9wcm9jX2NvdW50Kys7CisJCWh3LT5mcmFtZV9kZWNvZGVkID0gMTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChyZXQgPCAwKSB7CisJCWh3LT5mcmFtZV9kZWNvZGVkID0gMTsKKwkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJImFvbV9idWZtZ3JfcHJvY2Vzcz0+ICVkLCBidWZtZ3IgZS5yLnIuby5yLiAlZCwgQU9NX0FWMV9TRUFSQ0hfSEVBRFxyXG4iLAorCQlyZXQsIGNtLT5lcnJvci5lcnJvcl9jb2RlKTsKKwkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCBBT01fQVYxX1NFQVJDSF9IRUFEKTsKKwkJcmV0dXJuIDA7CisJfQorCWVsc2UgaWYgKHJldCA9PSAwKSB7CisJCVBJQ19CVUZGRVJfQ09ORklHKiBjdXJfcGljX2NvbmZpZyA9ICZjbS0+Y3VyX2ZyYW1lLT5idWY7CisJCVBJQ19CVUZGRVJfQ09ORklHKiBwcmV2X3BpY19jb25maWcgPSAmY20tPnByZXZfZnJhbWUtPmJ1ZjsKKwkJLy9zdHJ1Y3Qgc2VnbWVudGF0aW9uX2xmICpzZWdfNGxmID0gJmh3LT5zZWdfNGxmX3N0b3JlOworCQlpZiAoZGVidWcgJgorCQkJQVYxX0RFQlVHX0JVRk1HUl9NT1JFKQorCQkJZHVtcF9hdXhfYnVmKGh3KTsKKwkJc2V0X2R2X2RhdGEoaHcpOworCQlpZiAoY20tPnNob3dfZnJhbWUgJiYKKwkJCWh3LT5kdl9kYXRhX2J1ZiAhPSBOVUxMKQorCQkJY29weV9kdl9kYXRhKGh3LCBjdXJfcGljX2NvbmZpZyk7CisJCS8qIHRvIGRvOi4uCisJCXNldF9waWNfYXV4X2RhdGEoaHcsCisJCQljdXJfcGljX2NvbmZpZywgMCwgMik7Ki8KKwkJaHctPmZyYW1lX2RlY29kZWQgPSAwOworCQlwYmktPmJ1Zm1ncl9wcm9jX2NvdW50Kys7CisJCWlmIChody0+bmV3X2NvbXByZXNzZWRfZGF0YSA9PSAwKSB7CisJCQlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIEFPTV9BVjFfREVDT0RFX1NMSUNFKTsKKwkJCXJldHVybiAwOworCQl9CisJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCSIgW1BJQ1RVUkUgJWRdIGNtLT5jdXJfZnJhbWUtPm1pX3NpemUgOiAoJWQgWCAlZCkgeV9jcm9wX3NpemUgOiglZCBYICVkKVxuIiwKKwkJaHctPmZyYW1lX2NvdW50LAorCQljbS0+Y3VyX2ZyYW1lLT5taV9jb2xzLAorCQljbS0+Y3VyX2ZyYW1lLT5taV9yb3dzLAorCQljdXJfcGljX2NvbmZpZy0+eV9jcm9wX3dpZHRoLAorCQljdXJfcGljX2NvbmZpZy0+eV9jcm9wX2hlaWdodCk7CisJCWlmIChjbS0+cHJldl9mcmFtZSA+IDApIHsKKwkJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCQkiIFtTRUdNRU5UXSBjbS0+cHJldl9mcmFtZS0+c2VnbWVudGF0aW9uX2VuYWJsZWQgOiAlZFxuIiwKKwkJCWNtLT5wcmV2X2ZyYW1lLT5zZWdtZW50YXRpb25fZW5hYmxlZCk7CisJCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkJIiBbU0VHTUVOVF0gY20tPnByZXZfZnJhbWUtPm1pX3NpemUgOiAoJWQgWCAlZClcbiIsCisJCQljbS0+cHJldl9mcmFtZS0+bWlfY29scywgY20tPnByZXZfZnJhbWUtPm1pX3Jvd3MpOworCQl9CisJCWNtLT5jdXJfZnJhbWUtPnByZXZfc2VnbWVudGF0aW9uX2VuYWJsZWQgPSAoY20tPnByZXZfZnJhbWUgPiAwKSA/CisJCShjbS0+cHJldl9mcmFtZS0+c2VnbWVudGF0aW9uX2VuYWJsZWQgJiAoY20tPnByZXZfZnJhbWUtPnNlZ21lbnRhdGlvbl91cGRhdGVfbWFwCisJCXwgY20tPnByZXZfZnJhbWUtPnByZXZfc2VnbWVudGF0aW9uX2VuYWJsZWQpICYKKwkJKGNtLT5jdXJfZnJhbWUtPm1pX3Jvd3MgPT0gY20tPnByZXZfZnJhbWUtPm1pX3Jvd3MpICYKKwkJKGNtLT5jdXJfZnJhbWUtPm1pX2NvbHMgPT0gY20tPnByZXZfZnJhbWUtPm1pX2NvbHMpKSA6IDA7CisJCVdSSVRFX1ZSRUcoQVYxX1NLSVBfTU9ERV9JTkZPLAorCQkJKGNtLT5jdXJfZnJhbWUtPnByZXZfc2VnbWVudGF0aW9uX2VuYWJsZWQgPDwgMzEpIHwKKwkJCSgoKGNtLT5wcmV2X2ZyYW1lID4gMCkgPyBjbS0+cHJldl9mcmFtZS0+aW50cmFfb25seSA6IDApIDw8IDMwKSB8CisJCQkoKChjbS0+cHJldl9mcmFtZSA+IDApID8gcHJldl9waWNfY29uZmlnLT5pbmRleCA6IDB4MWYpIDw8IDI0KSB8CisJCQkoKChjbS0+Y3VyX2ZyYW1lID4gMCkgPyBjdXJfcGljX2NvbmZpZy0+aW5kZXggOiAweDFmKSA8PCAxNikgfAorCQkJKGNtLT5jdXJyZW50X2ZyYW1lLnNraXBfbW9kZV9pbmZvLnJlZl9mcmFtZV9pZHhfMCAmIDB4ZikgfAorCQkJKChjbS0+Y3VycmVudF9mcmFtZS5za2lwX21vZGVfaW5mby5yZWZfZnJhbWVfaWR4XzEgJiAweGYpIDw8IDQpIHwKKwkJCShjbS0+Y3VycmVudF9mcmFtZS5za2lwX21vZGVfaW5mby5za2lwX21vZGVfYWxsb3dlZCA8PCA4KSk7CisJCWN1cl9waWNfY29uZmlnLT5kZWNvZGVfaWR4ID0gcGJpLT5kZWNvZGVfaWR4OworCisJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCQkiRGVjb2RlIEZyYW1lIERhdGEgJWQgZnJhbWVfdHlwZSAlZCAoJWQpIGJ1Zm1ncl9wcm9jX2NvdW50ICVkXG4iLAorCQlwYmktPmRlY29kZV9pZHgsCisJCWNtLT5jdXJfZnJhbWUtPmZyYW1lX3R5cGUsCisJCWNtLT5jdXJyZW50X2ZyYW1lLmZyYW1lX3R5cGUsCisJCXBiaS0+YnVmbWdyX3Byb2NfY291bnQpOworCQlwYmktPmRlY29kZV9pZHgrKzsKKwkJaHctPmZyYW1lX2NvdW50Kys7CisjaWZkZWYgU0VORF9NTVVfVVNFRF9OVU0KKwkJY20tPnByZXZfZmJfaWR4ID0gY20tPmN1cl9mYl9pZHhfbW11OworCQljbS0+Y3VyX2ZiX2lkeF9tbXUgPSBjbS0+Y3VyX2ZyYW1lLT5idWYuaW5kZXg7CisjZW5kaWYKKwkJY3VyX3BpY19jb25maWctPnNsaWNlX3R5cGUgPSBjbS0+Y3VyX2ZyYW1lLT5mcmFtZV90eXBlOworCQlpZiAoaHctPmNodW5rKSB7CisJCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19PVVRfUFRTLAorCQkJCSIlcywgY29uZmlnIHBpYyBwdHMgJWQsIHB0czY0ICVsbGQsIHRzOiAlbGxkXG4iLAorCQkJCV9fZnVuY19fLCBody0+Y2h1bmstPnB0cywgaHctPmNodW5rLT5wdHM2NCwgaHctPmNodW5rLT50aW1lc3RhbXApOworCQkJY3VyX3BpY19jb25maWctPnB0cyA9IGh3LT5jaHVuay0+cHRzOworCQkJY3VyX3BpY19jb25maWctPnB0czY0ID0gaHctPmNodW5rLT5wdHM2NDsKKwkJCWN1cl9waWNfY29uZmlnLT50aW1lc3RhbXAgPSAgaHctPmNodW5rLT50aW1lc3RhbXA7CisKKwkJCWlmIChody0+aXNfdXNlZF92NGwgJiYgIXY0bF9iaXRzdHJlYW1faWRfZW5hYmxlKSB7CisJCQkJY3VyX3BpY19jb25maWctPnB0czY0ID0gaHctPmNodW5rLT50aW1lc3RhbXA7CisJCQkJaHctPmNodW5rLT50aW1lc3RhbXAgPSAwOworCQkJfQorCQl9CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfaGVhZGVyX21lbW9yeV90aW1lX25hbWUsIFRSQUNFX0hFQURFUl9SRUdJU1RFUl9TVEFSVCk7CisjaWZkZWYgRFVBTF9ERUNPREUKKyNlbHNlCisJCWNvbmZpZ19waWNfc2l6ZShodywgaHctPmFvbV9wYXJhbS5wLmJpdF9kZXB0aCk7CisjZW5kaWYKKwkJaWYgKGdldF9tdl9idWYoaHcsICZjbS0+Y3VyX2ZyYW1lLT5idWYpIDwgMCkgeworCQkJYXYxX3ByaW50KGh3LCAwLAorCQkJCSIlczogRXJyb3IgZ2V0X212X2J1ZiBmYWlsXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldCA9IC0xOworCQl9CisKKwkJaWYgKHJldCA+PSAwICYmIGh3LT5tbXVfZW5hYmxlICYmICgoaHctPmRvdWJsZV93cml0ZV9tb2RlICYgMHgxMCkgPT0gMCkpIHsKKwkJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfaGVhZGVyX21lbW9yeV90aW1lX25hbWUsIFRSQUNFX0hFQURFUl9NRU1PUllfU1RBUlQpOworCQkJcmV0ID0gYXYxX2FsbG9jX21tdShodywKKwkJCQljbS0+Y3VyX2ZyYW1lLT5idWYuaW5kZXgsCisJCQkJY3VyX3BpY19jb25maWctPnlfY3JvcF93aWR0aCwKKwkJCQljdXJfcGljX2NvbmZpZy0+eV9jcm9wX2hlaWdodCwKKwkJCQlody0+YW9tX3BhcmFtLnAuYml0X2RlcHRoLAorCQkJCWh3LT5mcmFtZV9tbXVfbWFwX2FkZHIpOworCQkJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV9oZWFkZXJfbWVtb3J5X3RpbWVfbmFtZSwgVFJBQ0VfSEVBREVSX01FTU9SWV9FTkQpOworCQkJaWYgKHJldCA+PSAwKQorCQkJCWNtLT5jdXJfZmJfaWR4X21tdSA9IGNtLT5jdXJfZnJhbWUtPmJ1Zi5pbmRleDsKKwkJCWVsc2UKKwkJCQlwcl9lcnIoImNhbid0IGFsbG9jIG5lZWQgbW11MSxpZHggJWQgcmV0ID0lZFxuIiwKKwkJCQljbS0+Y3VyX2ZyYW1lLT5idWYuaW5kZXgsIHJldCk7CisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKwkJCWlmIChody0+ZHdfbW11X2VuYWJsZSkgeworCQkJCXJldCA9IGF2MV9hbGxvY19tbXVfZHcoaHcsCisJCQkJY20tPmN1cl9mcmFtZS0+YnVmLmluZGV4LAorCQkJCWN1cl9waWNfY29uZmlnLT55X2Nyb3Bfd2lkdGgsCisJCQkJY3VyX3BpY19jb25maWctPnlfY3JvcF9oZWlnaHQsCisJCQkJaHctPmFvbV9wYXJhbS5wLmJpdF9kZXB0aCwKKwkJCQlody0+ZHdfZnJhbWVfbW11X21hcF9hZGRyKTsKKwkJCQlpZiAocmV0ID49IDApCisJCQkJCWNtLT5jdXJfZmJfaWR4X21tdV9kdyA9IGNtLT5jdXJfZnJhbWUtPmJ1Zi5pbmRleDsKKwkJCQllbHNlCisJCQkJCXByX2VycigiY2FuJ3QgYWxsb2MgbmVlZCBkdyBtbXUxLGlkeCAlZCByZXQgPSVkXG4iLAorCQkJCQljbS0+Y3VyX2ZyYW1lLT5idWYuaW5kZXgsIHJldCk7CisJCQl9CisjZW5kaWYKKyNpZmRlZiBERUJVR19DUkNfRVJST1IKKwkJCWlmIChjcmNfZGVidWdfZmxhZyAmIDB4NDApCisJCQkJbXZfYnVmZmVyX2ZpbGxfemVybyhodywgJmNtLT5jdXJfZnJhbWUtPmJ1Zik7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCXJldCA9IDA7CisJCX0KKwkJaWYgKGF2MV9mcmFtZV9pc19pbnRlcigmaHctPmNvbW1vbikpIHsKKwkJCS8vaWYgKChwYmktPmNvbW1vbi5mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkgJiYgKCFwYmktPmNvbW1vbi5pbnRyYV9vbmx5KSkgeworI2lmZGVmIERVQUxfREVDT0RFCisjZWxzZQorCQkJY29uZmlnX21jX2J1ZmZlcihodywgaHctPmFvbV9wYXJhbS5wLmJpdF9kZXB0aCwgMSk7CisjZW5kaWYKKwkJCWNvbmZpZ19tcHJlZF9odyhodywgMSk7CisJCX0KKwkJZWxzZSB7CisJCQljb25maWdfbWNfYnVmZmVyKGh3LCBody0+YW9tX3BhcmFtLnAuYml0X2RlcHRoLCAwKTsKKwkJCWNsZWFyX21wcmVkX2h3KGh3KTsKKwkJCWNvbmZpZ19tcHJlZF9odyhodywgMCk7CisJCX0KKyNpZmRlZiBEVUFMX0RFQ09ERQorI2Vsc2UKKyNpZmRlZiBNQ1JDQ19FTkFCTEUKKwkJY29uZmlnX21jcmNjX2F4aV9od19uZWFyZXN0X3JlZihodyk7CisjZW5kaWYKKwkJY29uZmlnX3Nhb19odyhodywgJmh3LT5hb21fcGFyYW0pOworI2VuZGlmCisKKwkJY29uZmlnX2RibGtfaHcoaHcpOworCisJCS8qIHN0b3JlIHNlZ21lbnRfZmVhdHVyZSBiZWZvcmUgc2hhcmVkIHN1Yi1tb2R1bGUgcnVuIHRvIGZpeCBtb3NhaWMgb24gdDVkICovCisJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NDMikKKwkJCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfTUVNX1dSX0FERFIsIDB4MTFiMCArIChjdXJfcGljX2NvbmZpZy0+aW5kZXgpKTsKKwkJZWxzZQorCQkJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9NRU1fV1JfQUREUiwgMHgxMDEwICsgKGN1cl9waWNfY29uZmlnLT5pbmRleCkpOworCQlpZiAoaHctPmFvbV9wYXJhbS5wLnNlZ21lbnRhdGlvbl9lbmFibGVkICYgMSkgLy8gc2VnbWVudGF0aW9uX2VuYWJsZWQKKwkJCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfTUVNX1JXX0RBVEEsIFJFQURfVlJFRyhBVjFfUkVGX1NFR19JTkZPKSk7CisJCWVsc2UKKwkJCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfTUVNX1JXX0RBVEEsIDApOworCisJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsICJIRVZDX0RFQ19TVEFUVVNfUkVHIDw9IEFPTV9BVjFfREVDT0RFX1NMSUNFXG4iKTsKKwkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCBBT01fQVYxX0RFQ09ERV9TTElDRSk7CisKKwkJLy8gU2F2ZSBzZWdtZW50X2ZlYXR1cmUgd2hpbGUgaGFyZHdhcmUgZGVjb2RpbmcKKwkJaWYgKGh3LT5zZWdfNGxmLT5lbmFibGVkKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQljbS0+Y3VyX2ZyYW1lLT5zZWdtZW50X2ZlYXR1cmVbaV0gPSBSRUFEX1ZSRUcoQU9NX0FWMV9TRUdNRU5UX0ZFQVRVUkUpOworCQkJfQorCQl9IGVsc2UgeworCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJCWNtLT5jdXJfZnJhbWUtPnNlZ21lbnRfZmVhdHVyZVtpXSA9ICgweDgwMDAwMDAwIHwgKGkgPDwgMjIpKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsICJTZXF1ZW5jZSBoZWFkLCBTZWFyY2ggbmV4dCBzdGFydCBjb2RlXG4iKTsKKwkJY20tPnByZXZfZmJfaWR4ID0gSU5WQUxJRF9JRFg7CisJCS8vc2tpcCwgc2VhcmNoIG5leHQgc3RhcnQgY29kZQorCQlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIEFPTV9BVjFfREVDT0RFX1NMSUNFKTsKKwl9CisJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV9oZWFkZXJfbWVtb3J5X3RpbWVfbmFtZSwgVFJBQ0VfSEVBREVSX1JFR0lTVEVSX0VORCk7CisJcmV0dXJuIHJldDsKKworI2Vsc2UKKworCWJpdF9kZXB0aF9sdW1hID0gYXYxX3BhcmFtLnAuYml0X2RlcHRoOworCWJpdF9kZXB0aF9jaHJvbWEgPSBhdjFfcGFyYW0ucC5iaXRfZGVwdGg7CisKKwlpZiAoaHctPnByb2Nlc3Nfc3RhdGUgIT0gUFJPQ19TVEFURV9TRU5EQUdBSU4pIHsKKwkJcmV0ID0gYXYxX2J1Zm1ncl9wcm9jZXNzKGh3LCAmYXYxX3BhcmFtKTsKKwkJaWYgKCFody0+bV9pbnNfZmxhZykKKwkJCWh3LT5yZXN1bHRfZG9uZV9jb3VudCsrOworCX0gZWxzZSB7CisJCXVuaW9uIHBhcmFtX3UgKnBhcmFtcyA9ICZhdjFfcGFyYW07CisJCWlmIChody0+bW11X2VuYWJsZSAmJiAoKGh3LT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MTApID09IDApKSB7CisJCQlyZXQgPSBhdjFfYWxsb2NfbW11KGh3LAorCQkJCWNtLT5uZXdfZmJfaWR4LAorCQkJCXBhcmFtcy0+cC53aWR0aCwKKwkJCQlwYXJhbXMtPnAuaGVpZ2h0LAorCQkJCXBhcmFtcy0+cC5iaXRfZGVwdGgsCisJCQkJaHctPmZyYW1lX21tdV9tYXBfYWRkcik7CisJCQlpZiAocmV0ID49IDApCisJCQkJY20tPmN1cl9mYl9pZHhfbW11ID0gY20tPm5ld19mYl9pZHg7CisJCQllbHNlCisJCQkJcHJfZXJyKCJjYW4ndCBhbGxvYyBuZWVkIG1tdTEsaWR4ICVkIHJldCA9JWRcbiIsCisJCQkJCWNtLT5uZXdfZmJfaWR4LCByZXQpOworCQl9IGVsc2UgeworCQkJcmV0ID0gMDsKKwkJfQorCQlXUklURV9WUkVHKEhFVkNfUEFSU0VSX1BJQ1RVUkVfU0laRSwKKwkJCShwYXJhbXMtPnAuaGVpZ2h0IDw8IDE2KSB8IHBhcmFtcy0+cC53aWR0aCk7CisJfQorCWlmIChyZXQgPCAwKSB7CisJCQlwcl9pbmZvKCJhdjFfYnVmbWdyX3Byb2Nlc3M9PiAlZCwgQVYxXzEwQl9ESVNDQVJEX05BTFxyXG4iLCByZXQpOworCQlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIEFWMV8xMEJfRElTQ0FSRF9OQUwpOworCQljbS0+c2hvd19mcmFtZSA9IDA7CisJCWlmIChody0+bW11X2VuYWJsZSkKKwkJCWF2MV9yZWN5Y2xlX21tdV9idWYoaHcpOworCisJCWlmIChody0+bV9pbnNfZmxhZykgeworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJCQlhbWhldmNfc3RvcCgpOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCX0KKwkJcmV0dXJuIHJldDsKKwl9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisJCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpjdXJfcGljX2NvbmZpZworCQkJPSAmY20tPmN1cl9mcmFtZS0+YnVmOworCQljdXJfcGljX2NvbmZpZy0+ZGVjb2RlX2lkeCA9IGh3LT5mcmFtZV9jb3VudDsKKworCQlpZiAoaHctPnByb2Nlc3Nfc3RhdGUgIT0gUFJPQ19TVEFURV9TRU5EQUdBSU4pIHsKKwkJCWlmICghaHctPm1faW5zX2ZsYWcpIHsKKwkJCQlody0+ZnJhbWVfY291bnQrKzsKKwkJCQlkZWNvZGVfZnJhbWVfY291bnRbaHctPmluZGV4XQorCQkJCQk9IGh3LT5mcmFtZV9jb3VudDsKKwkJCX0KKwkJCWlmIChody0+Y2h1bmspIHsKKwkJCQljdXJfcGljX2NvbmZpZy0+cHRzID0gaHctPmNodW5rLT5wdHM7CisJCQkJY3VyX3BpY19jb25maWctPnB0czY0ID0gaHctPmNodW5rLT5wdHM2NDsKKwkJCX0KKwkJfQorCQkvKnByX2luZm8oIkRlY29kZSBGcmFtZSBEYXRhICVkXG4iLCBody0+ZnJhbWVfY291bnQpOyovCisJCWNvbmZpZ19waWNfc2l6ZShodywgYXYxX3BhcmFtLnAuYml0X2RlcHRoKTsKKworCQlpZiAoKGh3LT5jb21tb24uZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUpCisJCQkmJiAoIWh3LT5jb21tb24uaW50cmFfb25seSkpIHsKKwkJCWNvbmZpZ19tY19idWZmZXIoaHcsIGF2MV9wYXJhbS5wLmJpdF9kZXB0aCk7CisJCQljb25maWdfbXByZWRfaHcoaHcpOworCQl9IGVsc2UgeworCQkJY2xlYXJfbXByZWRfaHcoaHcpOworCQl9CisjaWZkZWYgTUNSQ0NfRU5BQkxFCisJCWlmIChtY3JjY19jYWNoZV9hbGdfZmxhZykKKwkJCWNvbmZpZ19tY3JjY19heGlfaHdfbmV3KGh3KTsKKwkJZWxzZQorCQkJY29uZmlnX21jcmNjX2F4aV9odyhodyk7CisjZW5kaWYKKwkJY29uZmlnX3Nhb19odyhodywgJmF2MV9wYXJhbSk7CisJCS8qcHJfaW5mbygiSEVWQ19ERUNfU1RBVFVTX1JFRyA8PSBBVjFfMTBCX0RFQ09ERV9TTElDRVxuIik7Ki8KKwkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCBBVjFfMTBCX0RFQ09ERV9TTElDRSk7CisJfSBlbHNlIHsKKwkJcHJfaW5mbygiU2tpcCBzZWFyY2ggbmV4dCBzdGFydCBjb2RlXG4iKTsKKwkJY20tPnByZXZfZmJfaWR4ID0gSU5WQUxJRF9JRFg7CisJCS8qc2tpcCwgc2VhcmNoIG5leHQgc3RhcnQgY29kZSovCisJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgQVYxXzEwQl9ERUNPREVfU0xJQ0UpOworCX0KKwlody0+cHJvY2Vzc19zdGF0ZSA9IFBST0NfU1RBVEVfREVDT0RFU0xJQ0U7CisJaWYgKGh3LT5tbXVfZW5hYmxlICYmICgoaHctPmRvdWJsZV93cml0ZV9tb2RlICYgMHgxMCkgPT0gMCkpIHsKKwkJaWYgKGh3LT5sYXN0X3B1dF9pZHggPCBody0+dXNlZF9idWZfbnVtKSB7CisJCQlzdHJ1Y3QgUmVmQ250QnVmZmVyX3MgKmZyYW1lX2J1ZnMgPQorCQkJCWNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmczsKKwkJCWludCBpID0gaHctPmxhc3RfcHV0X2lkeDsKKwkJCS8qZnJlZSBub3QgdXNlZCBidWZmZXJzLiovCisJCQlpZiAoKGZyYW1lX2J1ZnNbaV0ucmVmX2NvdW50ID09IDApICYmCisJCQkoZnJhbWVfYnVmc1tpXS5idWYudmZfcmVmID09IDApICYmCisJCQkoZnJhbWVfYnVmc1tpXS5idWYuaW5kZXggIT0gLTEpKSB7CisJCQkJaWYgKHBiaS0+aXNfdXNlZF92NGwpIHsKKwkJCQkJc3RydWN0IGludGVybmFsX2NvbXBfYnVmICppYnVmID0KKwkJCQkJCWluZGV4X3RvX2ljb21wX2J1ZihwYmksIGkpOworCisJCQkJCWRlY29kZXJfbW11X2JveF9mcmVlX2lkeChpYnVmLT5tbXVfYm94LCBpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlkZWNvZGVyX21tdV9ib3hfZnJlZV9pZHgocGJpLT5tbXVfYm94LCBpKTsKKwkJCQl9CisJCQl9CisJCQlody0+bGFzdF9wdXRfaWR4ID0gLTE7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBmaWxsX2ZyYW1lX2luZm8oc3RydWN0IEFWMUhXX3MgKmh3LAorCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpmcmFtZSwKKwl1bnNpZ25lZCBpbnQgZnJhbWVzaXplLAorCXVuc2lnbmVkIGludCBwdHMpCit7CisJc3RydWN0IHZmcmFtZV9xb3NfcyAqdmZyYW1lX3FvcyA9ICZody0+dmZyYW1lX3FvczsKKworCWlmIChmcmFtZS0+c2xpY2VfdHlwZSA9PSBLRVlfRlJBTUUpCisJCXZmcmFtZV9xb3MtPnR5cGUgPSAxOworCWVsc2UgaWYgKGZyYW1lLT5zbGljZV90eXBlID09IElOVEVSX0ZSQU1FKQorCQl2ZnJhbWVfcW9zLT50eXBlID0gMjsKKy8qCisjZGVmaW5lIFNIT1dfUU9TX0lORk8KKyovCisJdmZyYW1lX3Fvcy0+c2l6ZSA9IGZyYW1lc2l6ZTsKKwl2ZnJhbWVfcW9zLT5wdHMgPSBwdHM7CisjaWZkZWYgU0hPV19RT1NfSU5GTworCWF2MV9wcmludChodywgMCwgInNsaWNlOiVkXG4iLCBmcmFtZS0+c2xpY2VfdHlwZSk7CisjZW5kaWYKKwl2ZnJhbWVfcW9zLT5tYXhfbXYgPSBmcmFtZS0+bWF4X212OworCXZmcmFtZV9xb3MtPmF2Z19tdiA9IGZyYW1lLT5hdmdfbXY7CisJdmZyYW1lX3Fvcy0+bWluX212ID0gZnJhbWUtPm1pbl9tdjsKKyNpZmRlZiBTSE9XX1FPU19JTkZPCisJYXYxX3ByaW50KGh3LCAwLCAibXY6IG1heDolZCwgIGF2ZzolZCwgbWluOiVkXG4iLAorCQkJdmZyYW1lX3Fvcy0+bWF4X212LAorCQkJdmZyYW1lX3Fvcy0+YXZnX212LAorCQkJdmZyYW1lX3Fvcy0+bWluX212KTsKKyNlbmRpZgorCXZmcmFtZV9xb3MtPm1heF9xcCA9IGZyYW1lLT5tYXhfcXA7CisJdmZyYW1lX3Fvcy0+YXZnX3FwID0gZnJhbWUtPmF2Z19xcDsKKwl2ZnJhbWVfcW9zLT5taW5fcXAgPSBmcmFtZS0+bWluX3FwOworI2lmZGVmIFNIT1dfUU9TX0lORk8KKwlhdjFfcHJpbnQoaHcsIDAsICJxcDogbWF4OiVkLCAgYXZnOiVkLCBtaW46JWRcbiIsCisJCQl2ZnJhbWVfcW9zLT5tYXhfcXAsCisJCQl2ZnJhbWVfcW9zLT5hdmdfcXAsCisJCQl2ZnJhbWVfcW9zLT5taW5fcXApOworI2VuZGlmCisJdmZyYW1lX3Fvcy0+bWF4X3NraXAgPSBmcmFtZS0+bWF4X3NraXA7CisJdmZyYW1lX3Fvcy0+YXZnX3NraXAgPSBmcmFtZS0+YXZnX3NraXA7CisJdmZyYW1lX3Fvcy0+bWluX3NraXAgPSBmcmFtZS0+bWluX3NraXA7CisjaWZkZWYgU0hPV19RT1NfSU5GTworCWF2MV9wcmludChodywgMCwgInNraXA6IG1heDolZCwJYXZnOiVkLCBtaW46JWRcbiIsCisJCQl2ZnJhbWVfcW9zLT5tYXhfc2tpcCwKKwkJCXZmcmFtZV9xb3MtPmF2Z19za2lwLAorCQkJdmZyYW1lX3Fvcy0+bWluX3NraXApOworI2VuZGlmCisJdmZyYW1lX3Fvcy0+bnVtKys7CisJLyoKKwlpZiAoaHctPmZyYW1laW5mb19lbmFibGUpCisJCXZkZWNfZmlsbF9mcmFtZV9pbmZvKHZmcmFtZV9xb3MsIDEpOworCSovCit9CisKKy8qIG9ubHkgd2hlbiB3ZSBkZWNvZGVkIG9uZSBmaWVsZCBvciBvbmUgZnJhbWUsCit3ZSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGdldCBxb3MgaW5mbyovCitzdGF0aWMgdm9pZCBnZXRfcGljdHVyZV9xb3NfaW5mbyhzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKmZyYW1lID0gJmh3LT5jdXJfYnVmLT5idWY7CisKKwlpZiAoIWZyYW1lKQorCQlyZXR1cm47CisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpIHsKKwkJdW5zaWduZWQgY2hhciBhWzNdOworCQl1bnNpZ25lZCBjaGFyIGksIGosIHQ7CisJCXVuc2lnbmVkIGxvbmcgIGRhdGE7CisKKwkJZGF0YSA9IFJFQURfVlJFRyhIRVZDX01WX0lORk8pOworCQlpZiAoZnJhbWUtPnNsaWNlX3R5cGUgPT0gS0VZX0ZSQU1FKQorCQkJZGF0YSA9IDA7CisJCWFbMF0gPSBkYXRhICYgMHhmZjsKKwkJYVsxXSA9IChkYXRhID4+IDgpICYgMHhmZjsKKwkJYVsyXSA9IChkYXRhID4+IDE2KSAmIDB4ZmY7CisKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJZm9yIChqID0gaSsxOyBqIDwgMzsgaisrKSB7CisJCQkJaWYgKGFbal0gPCBhW2ldKSB7CisJCQkJCXQgPSBhW2pdOworCQkJCQlhW2pdID0gYVtpXTsKKwkJCQkJYVtpXSA9IHQ7CisJCQkJfSBlbHNlIGlmIChhW2pdID09IGFbaV0pIHsKKwkJCQkJYVtpXSsrOworCQkJCQl0ID0gYVtqXTsKKwkJCQkJYVtqXSA9IGFbaV07CisJCQkJCWFbaV0gPSB0OworCQkJCX0KKwkJCX0KKwkJfQorCQlmcmFtZS0+bWF4X212ID0gYVsyXTsKKwkJZnJhbWUtPmF2Z19tdiA9IGFbMV07CisJCWZyYW1lLT5taW5fbXYgPSBhWzBdOworCisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX1FPU19JTkZPLAorCQkJIm12IGRhdGEgJXggIGFbMF09ICV4IGFbMV09ICV4IGFbMl09ICV4XG4iLAorCQkJZGF0YSwgYVswXSwgYVsxXSwgYVsyXSk7CisKKwkJZGF0YSA9IFJFQURfVlJFRyhIRVZDX1FQX0lORk8pOworCQlhWzBdID0gZGF0YSAmIDB4MWY7CisJCWFbMV0gPSAoZGF0YSA+PiA4KSAmIDB4M2Y7CisJCWFbMl0gPSAoZGF0YSA+PiAxNikgJiAweDdmOworCisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCWZvciAoaiA9IGkrMTsgaiA8IDM7IGorKykgeworCQkJCWlmIChhW2pdIDwgYVtpXSkgeworCQkJCQl0ID0gYVtqXTsKKwkJCQkJYVtqXSA9IGFbaV07CisJCQkJCWFbaV0gPSB0OworCQkJCX0gZWxzZSBpZiAoYVtqXSA9PSBhW2ldKSB7CisJCQkJCWFbaV0rKzsKKwkJCQkJdCA9IGFbal07CisJCQkJCWFbal0gPSBhW2ldOworCQkJCQlhW2ldID0gdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJZnJhbWUtPm1heF9xcCA9IGFbMl07CisJCWZyYW1lLT5hdmdfcXAgPSBhWzFdOworCQlmcmFtZS0+bWluX3FwID0gYVswXTsKKworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19RT1NfSU5GTywKKwkJCSJxcCBkYXRhICV4ICBhWzBdPSAleCBhWzFdPSAleCBhWzJdPSAleFxuIiwKKwkJCWRhdGEsIGFbMF0sIGFbMV0sIGFbMl0pOworCisJCWRhdGEgPSBSRUFEX1ZSRUcoSEVWQ19TS0lQX0lORk8pOworCQlhWzBdID0gZGF0YSAmIDB4MWY7CisJCWFbMV0gPSAoZGF0YSA+PiA4KSAmIDB4M2Y7CisJCWFbMl0gPSAoZGF0YSA+PiAxNikgJiAweDdmOworCisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCWZvciAoaiA9IGkrMTsgaiA8IDM7IGorKykgeworCQkJCWlmIChhW2pdIDwgYVtpXSkgeworCQkJCQl0ID0gYVtqXTsKKwkJCQkJYVtqXSA9IGFbaV07CisJCQkJCWFbaV0gPSB0OworCQkJCX0gZWxzZSBpZiAoYVtqXSA9PSBhW2ldKSB7CisJCQkJCWFbaV0rKzsKKwkJCQkJdCA9IGFbal07CisJCQkJCWFbal0gPSBhW2ldOworCQkJCQlhW2ldID0gdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJZnJhbWUtPm1heF9za2lwID0gYVsyXTsKKwkJZnJhbWUtPmF2Z19za2lwID0gYVsxXTsKKwkJZnJhbWUtPm1pbl9za2lwID0gYVswXTsKKworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19RT1NfSU5GTywKKwkJCSJza2lwIGRhdGEgJXggIGFbMF09ICV4IGFbMV09ICV4IGFbMl09ICV4XG4iLAorCQkJZGF0YSwgYVswXSwgYVsxXSwgYVsyXSk7CisJfSBlbHNlIHsKKwkJdWludDMyX3QgYmxrODhfeV9jb3VudDsKKwkJdWludDMyX3QgYmxrODhfY19jb3VudDsKKwkJdWludDMyX3QgYmxrMjJfbXZfY291bnQ7CisJCXVpbnQzMl90IHJkYXRhMzI7CisJCWludDMyX3QgbXZfaGk7CisJCWludDMyX3QgbXZfbG87CisJCXVpbnQzMl90IHJkYXRhMzJfbDsKKwkJdWludDMyX3QgbXZ4X0wwX2hpOworCQl1aW50MzJfdCBtdnlfTDBfaGk7CisJCXVpbnQzMl90IG12eF9MMV9oaTsKKwkJdWludDMyX3QgbXZ5X0wxX2hpOworCQlpbnQ2NF90IHZhbHVlOworCQl1aW50NjRfdCB0ZW1wX3ZhbHVlOworCQlpbnQgcGljX251bWJlciA9IGZyYW1lLT5kZWNvZGVfaWR4OworCisJCWZyYW1lLT5tYXhfbXYgPSAwOworCQlmcmFtZS0+YXZnX212ID0gMDsKKwkJZnJhbWUtPm1pbl9tdiA9IDA7CisKKwkJZnJhbWUtPm1heF9za2lwID0gMDsKKwkJZnJhbWUtPmF2Z19za2lwID0gMDsKKwkJZnJhbWUtPm1pbl9za2lwID0gMDsKKworCQlmcmFtZS0+bWF4X3FwID0gMDsKKwkJZnJhbWUtPmF2Z19xcCA9IDA7CisJCWZyYW1lLT5taW5fcXAgPSAwOworCisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX1FPU19JTkZPLCAic2xpY2VfdHlwZTolZCwgcG9jOiVkXG4iLAorCQkJZnJhbWUtPnNsaWNlX3R5cGUsCisJCQlwaWNfbnVtYmVyKTsKKworCQkvKiBzZXQgcmRfaWR4IHRvIDAgKi8KKwkJV1JJVEVfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0NUUkwsIDApOworCisJCWJsazg4X3lfY291bnQgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkJaWYgKGJsazg4X3lfY291bnQgPT0gMCkgeworCisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE5PIERhdGEgeWV0LlxuIiwKKwkJCXBpY19udW1iZXIpOworCisJCQkvKiByZXNldCBhbGwgY291bnRzICovCisJCQlXUklURV9WUkVHKEhFVkNfUElDX1FVQUxJVFlfQ1RSTCwgKDE8PDgpKTsKKwkJCXJldHVybjsKKwkJfQorCQkvKiBxcF95X3N1bSAqLworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gWSBRUCBBVkcgOiAlZCAoJWQvJWQpXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMi9ibGs4OF95X2NvdW50LAorCQkJcmRhdGEzMiwgYmxrODhfeV9jb3VudCk7CisKKwkJZnJhbWUtPmF2Z19xcCA9IHJkYXRhMzIvYmxrODhfeV9jb3VudDsKKwkJLyogaW50cmFfeV9jb3VudCAqLworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gWSBpbnRyYSByYXRlIDogJWQlYyAoJWQpXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMioxMDAvYmxrODhfeV9jb3VudCwKKwkJCSclJywgcmRhdGEzMik7CisKKwkJLyogc2tpcHBlZF95X2NvdW50ICovCisJCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBZIHNraXBwZWQgcmF0ZSA6ICVkJWMgKCVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzIqMTAwL2Jsazg4X3lfY291bnQsCisJCQknJScsIHJkYXRhMzIpOworCisJCWZyYW1lLT5hdmdfc2tpcCA9IHJkYXRhMzIqMTAwL2Jsazg4X3lfY291bnQ7CisJCS8qIGNvZWZmX25vbl96ZXJvX3lfY291bnQgKi8KKwkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIFkgWkVST19Db2VmZiByYXRlIDogJWQlYyAoJWQpXG4iLAorCQkJcGljX251bWJlciwgKDEwMCAtIHJkYXRhMzIqMTAwLyhibGs4OF95X2NvdW50KjEpKSwKKwkJCSclJywgcmRhdGEzMik7CisKKwkJLyogYmxrNjZfY19jb3VudCAqLworCQlibGs4OF9jX2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJCWlmIChibGs4OF9jX2NvdW50ID09IDApIHsKKwkJCWF2MV9wcmludChodywgQVYxX0RFQlVHX1FPU19JTkZPLAorCQkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBOTyBEYXRhIHlldC5cbiIsCisJCQkJcGljX251bWJlcik7CisJCQkvKiByZXNldCBhbGwgY291bnRzICovCisJCQlXUklURV9WUkVHKEhFVkNfUElDX1FVQUxJVFlfQ1RSTCwgKDE8PDgpKTsKKwkJCXJldHVybjsKKwkJfQorCQkvKiBxcF9jX3N1bSAqLworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfUU9TX0lORk8sCisJCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIEMgUVAgQVZHIDogJWQgKCVkLyVkKVxuIiwKKwkJCQlwaWNfbnVtYmVyLCByZGF0YTMyL2Jsazg4X2NfY291bnQsCisJCQkJcmRhdGEzMiwgYmxrODhfY19jb3VudCk7CisKKwkJLyogaW50cmFfY19jb3VudCAqLworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gQyBpbnRyYSByYXRlIDogJWQlYyAoJWQpXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMioxMDAvYmxrODhfY19jb3VudCwKKwkJCSclJywgcmRhdGEzMik7CisKKwkJLyogc2tpcHBlZF9jdV9jX2NvdW50ICovCisJCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBDIHNraXBwZWQgcmF0ZSA6ICVkJWMgKCVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzIqMTAwL2Jsazg4X2NfY291bnQsCisJCQknJScsIHJkYXRhMzIpOworCisJCS8qIGNvZWZmX25vbl96ZXJvX2NfY291bnQgKi8KKwkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIEMgWkVST19Db2VmZiByYXRlIDogJWQlYyAoJWQpXG4iLAorCQkJcGljX251bWJlciwgKDEwMCAtIHJkYXRhMzIqMTAwLyhibGs4OF9jX2NvdW50KjEpKSwKKwkJCSclJywgcmRhdGEzMik7CisKKwkJLyogMSdoMCwgcXBfY19tYXhbNjowXSwgMSdoMCwgcXBfY19taW5bNjowXSwKKwkJMSdoMCwgcXBfeV9tYXhbNjowXSwgMSdoMCwgcXBfeV9taW5bNjowXSAqLworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gWSBRUCBtaW4gOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIChyZGF0YTMyPj4wKSYweGZmKTsKKworCQlmcmFtZS0+bWluX3FwID0gKHJkYXRhMzI+PjApJjB4ZmY7CisKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gWSBRUCBtYXggOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIChyZGF0YTMyPj44KSYweGZmKTsKKworCQlmcmFtZS0+bWF4X3FwID0gKHJkYXRhMzI+PjgpJjB4ZmY7CisKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gQyBRUCBtaW4gOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIChyZGF0YTMyPj4xNikmMHhmZik7CisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIEMgUVAgbWF4IDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCAocmRhdGEzMj4+MjQpJjB4ZmYpOworCisJCS8qIGJsazIyX212X2NvdW50ICovCisJCWJsazIyX212X2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJCWlmIChibGsyMl9tdl9jb3VudCA9PSAwKSB7CisJCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19RT1NfSU5GTywKKwkJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTk8gTVYgRGF0YSB5ZXQuXG4iLAorCQkJCXBpY19udW1iZXIpOworCQkJLyogcmVzZXQgYWxsIGNvdW50cyAqLworCQkJV1JJVEVfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0NUUkwsICgxPDw4KSk7CisJCQlyZXR1cm47CisJCX0KKwkJLyogbXZ5X0wxX2NvdW50WzM5OjMyXSwgbXZ4X0wxX2NvdW50WzM5OjMyXSwKKwkJbXZ5X0wwX2NvdW50WzM5OjMyXSwgbXZ4X0wwX2NvdW50WzM5OjMyXSAqLworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJCS8qIHNob3VsZCBhbGwgYmUgMHgwMCBvciAweGZmICovCisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE1WIEFWRyBIaWdoIEJpdHM6IDB4JVhcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyKTsKKworCQltdnhfTDBfaGkgPSAoKHJkYXRhMzI+PjApJjB4ZmYpOworCQltdnlfTDBfaGkgPSAoKHJkYXRhMzI+PjgpJjB4ZmYpOworCQltdnhfTDFfaGkgPSAoKHJkYXRhMzI+PjE2KSYweGZmKTsKKwkJbXZ5X0wxX2hpID0gKChyZGF0YTMyPj4yNCkmMHhmZik7CisKKwkJLyogbXZ4X0wwX2NvdW50WzMxOjBdICovCisJCXJkYXRhMzJfbCA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCQl0ZW1wX3ZhbHVlID0gbXZ4X0wwX2hpOworCQl0ZW1wX3ZhbHVlID0gKHRlbXBfdmFsdWUgPDwgMzIpIHwgcmRhdGEzMl9sOworCisJCWlmIChtdnhfTDBfaGkgJiAweDgwKQorCQkJdmFsdWUgPSAweEZGRkZGRkYwMDAwMDAwMDAgfCB0ZW1wX3ZhbHVlOworCQllbHNlCisJCQl2YWx1ZSA9IHRlbXBfdmFsdWU7CisKKwkJdmFsdWUgPSBkaXZfczY0KHZhbHVlLCBibGsyMl9tdl9jb3VudCk7CisKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZYX0wwIEFWRyA6ICVkICglbGxkLyVkKVxuIiwKKwkJCXBpY19udW1iZXIsIChpbnQpdmFsdWUsCisJCQl2YWx1ZSwgYmxrMjJfbXZfY291bnQpOworCisJCWZyYW1lLT5hdmdfbXYgPSB2YWx1ZTsKKworCQkvKiBtdnlfTDBfY291bnRbMzE6MF0gKi8KKwkJcmRhdGEzMl9sID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJCXRlbXBfdmFsdWUgPSBtdnlfTDBfaGk7CisJCXRlbXBfdmFsdWUgPSAodGVtcF92YWx1ZSA8PCAzMikgfCByZGF0YTMyX2w7CisKKwkJaWYgKG12eV9MMF9oaSAmIDB4ODApCisJCQl2YWx1ZSA9IDB4RkZGRkZGRjAwMDAwMDAwMCB8IHRlbXBfdmFsdWU7CisJCWVsc2UKKwkJCXZhbHVlID0gdGVtcF92YWx1ZTsKKworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVllfTDAgQVZHIDogJWQgKCVsbGQvJWQpXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMl9sL2JsazIyX212X2NvdW50LAorCQkJdmFsdWUsIGJsazIyX212X2NvdW50KTsKKworCQkvKiBtdnhfTDFfY291bnRbMzE6MF0gKi8KKwkJcmRhdGEzMl9sID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJCXRlbXBfdmFsdWUgPSBtdnhfTDFfaGk7CisJCXRlbXBfdmFsdWUgPSAodGVtcF92YWx1ZSA8PCAzMikgfCByZGF0YTMyX2w7CisJCWlmIChtdnhfTDFfaGkgJiAweDgwKQorCQkJdmFsdWUgPSAweEZGRkZGRkYwMDAwMDAwMDAgfCB0ZW1wX3ZhbHVlOworCQllbHNlCisJCQl2YWx1ZSA9IHRlbXBfdmFsdWU7CisKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZYX0wxIEFWRyA6ICVkICglbGxkLyVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzJfbC9ibGsyMl9tdl9jb3VudCwKKwkJCXZhbHVlLCBibGsyMl9tdl9jb3VudCk7CisKKwkJLyogbXZ5X0wxX2NvdW50WzMxOjBdICovCisJCXJkYXRhMzJfbCA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCQl0ZW1wX3ZhbHVlID0gbXZ5X0wxX2hpOworCQl0ZW1wX3ZhbHVlID0gKHRlbXBfdmFsdWUgPDwgMzIpIHwgcmRhdGEzMl9sOworCQlpZiAobXZ5X0wxX2hpICYgMHg4MCkKKwkJCXZhbHVlID0gMHhGRkZGRkZGMDAwMDAwMDAwIHwgdGVtcF92YWx1ZTsKKwkJZWxzZQorCQkJdmFsdWUgPSB0ZW1wX3ZhbHVlOworCisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWV9MMSBBVkcgOiAlZCAoJWxsZC8lZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyX2wvYmxrMjJfbXZfY291bnQsCisJCQl2YWx1ZSwgYmxrMjJfbXZfY291bnQpOworCisJCS8qIHttdnhfTDBfbWF4LCBtdnhfTDBfbWlufSAvLyBmb3JtYXQgOiB7c2lnbiwgYWJzWzE0OjBdfSAgKi8KKwkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCQltdl9oaSA9IChyZGF0YTMyPj4xNikmMHhmZmZmOworCQlpZiAobXZfaGkgJiAweDgwMDApCisJCQltdl9oaSA9IDB4ODAwMCAtIG12X2hpOworCisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWF9MMCBNQVggOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIG12X2hpKTsKKworCQlmcmFtZS0+bWF4X212ID0gbXZfaGk7CisKKwkJbXZfbG8gPSAocmRhdGEzMj4+MCkmMHhmZmZmOworCQlpZiAobXZfbG8gJiAweDgwMDApCisJCQltdl9sbyA9IDB4ODAwMCAtIG12X2xvOworCisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWF9MMCBNSU4gOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIG12X2xvKTsKKworCQlmcmFtZS0+bWluX212ID0gbXZfbG87CisKKwkJLyoge212eV9MMF9tYXgsIG12eV9MMF9taW59ICovCisJCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkJbXZfaGkgPSAocmRhdGEzMj4+MTYpJjB4ZmZmZjsKKwkJaWYgKG12X2hpICYgMHg4MDAwKQorCQkJbXZfaGkgPSAweDgwMDAgLSBtdl9oaTsKKworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVllfTDAgTUFYIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9oaSk7CisKKwkJbXZfbG8gPSAocmRhdGEzMj4+MCkmMHhmZmZmOworCQlpZiAobXZfbG8gJiAweDgwMDApCisJCQltdl9sbyA9IDB4ODAwMCAtIG12X2xvOworCisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWV9MMCBNSU4gOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIG12X2xvKTsKKworCQkvKiB7bXZ4X0wxX21heCwgbXZ4X0wxX21pbn0gKi8KKwkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCQltdl9oaSA9IChyZGF0YTMyPj4xNikmMHhmZmZmOworCQlpZiAobXZfaGkgJiAweDgwMDApCisJCQltdl9oaSA9IDB4ODAwMCAtIG12X2hpOworCisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWF9MMSBNQVggOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIG12X2hpKTsKKworCQltdl9sbyA9IChyZGF0YTMyPj4wKSYweGZmZmY7CisJCWlmIChtdl9sbyAmIDB4ODAwMCkKKwkJCW12X2xvID0gMHg4MDAwIC0gbXZfbG87CisKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZYX0wxIE1JTiA6ICVkXG4iLAorCQkJcGljX251bWJlciwgbXZfbG8pOworCisJCS8qIHttdnlfTDFfbWF4LCBtdnlfTDFfbWlufSAqLworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJCW12X2hpID0gKHJkYXRhMzI+PjE2KSYweGZmZmY7CisJCWlmIChtdl9oaSAmIDB4ODAwMCkKKwkJCW12X2hpID0gMHg4MDAwIC0gbXZfaGk7CisKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZZX0wxIE1BWCA6ICVkXG4iLAorCQkJcGljX251bWJlciwgbXZfaGkpOworCisJCW12X2xvID0gKHJkYXRhMzI+PjApJjB4ZmZmZjsKKwkJaWYgKG12X2xvICYgMHg4MDAwKQorCQkJbXZfbG8gPSAweDgwMDAgLSBtdl9sbzsKKworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVllfTDEgTUlOIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9sbyk7CisKKwkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0NUUkwpOworCisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIEFmdGVyIFJlYWQgOiBWREVDX1BJQ19RVUFMSVRZX0NUUkwgOiAweCV4XG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMik7CisKKwkJLyogcmVzZXQgYWxsIGNvdW50cyAqLworCQlXUklURV9WUkVHKEhFVkNfUElDX1FVQUxJVFlfQ1RSTCwgKDE8PDgpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbG9hZF9wYXJhbShzdHJ1Y3QgQVYxSFdfcyAqaHcsIHVuaW9uIHBhcmFtX3UgKnBhcmFtcywgdWludDMyX3QgZGVjX3N0YXR1cykKK3sKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIGludCBoZWFkX3R5cGUgPSAwOworICAgIGlmIChkZWNfc3RhdHVzID09IEFPTV9BVjFfU0VRX0hFQURfUEFSU0VSX0RPTkUpCisJICBoZWFkX3R5cGUgPSBPQlVfU0VRVUVOQ0VfSEVBREVSOworICAgIGVsc2UgaWYgKGRlY19zdGF0dXMgPT0gQU9NX0FWMV9GUkFNRV9IRUFEX1BBUlNFUl9ET05FKQorCSAgaGVhZF90eXBlID0gT0JVX0ZSQU1FX0hFQURFUjsKKyAgICBlbHNlIGlmIChkZWNfc3RhdHVzID09IEFPTV9BVjFfRlJBTUVfUEFSU0VSX0RPTkUpCisJICBoZWFkX3R5cGUgPSBPQlVfRlJBTUU7CisgICAgZWxzZSBpZiAoZGVjX3N0YXR1cyA9PSBBT01fQVYxX1JFRFVOREFOVF9GUkFNRV9IRUFEX1BBUlNFUl9ET05FKQorCSAgaGVhZF90eXBlID0gT0JVX1JFRFVOREFOVF9GUkFNRV9IRUFERVI7CisgICAgZWxzZSB7CisJICAvL3ByaW50ZigiRXJyb3IsIGRlY19zdGF0dXMgb2YgMHgleCwgbm90IHN1cHBvcnRlZCEhIVxuIiwgZGVjX3N0YXR1cyk7CisJICByZXR1cm4gLTE7CisJfQorCWF2MV9wcmludDIoQU9NX0RFQlVHX0hXX01PUkUsICJsb2FkX3BhcmFtOiByZXQgMHgleFxuIiwgaGVhZF90eXBlKTsKKwlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX2hlYWRlcl9tZW1vcnlfdGltZV9uYW1lLCBUUkFDRV9IRUFERVJfUlBNX1NUQVJUKTsKKwlpZiAoZGVidWcmQU9NX0FWMV9ERUJVR19TRU5EX1BBUkFNX1dJVEhfUkVHKSB7CisJCWdldF9ycG1fcGFyYW0ocGFyYW1zKTsKKwl9CisJZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCAoUlBNX0VORC1SUE1fQkVHSU4pOyBpICs9IDQpIHsKKwkJCWludDMyX3QgaWk7CisJCQlmb3IgKGlpID0gMDsgaWkgPCA0OyBpaSsrKSB7CisJCQkJcGFyYW1zLT5sLmRhdGFbaStpaV09aHctPnJwbV9wdHJbaSszLWlpXTsKKwkJCX0KKwkJfQorCX0KKwlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX2hlYWRlcl9tZW1vcnlfdGltZV9uYW1lLCBUUkFDRV9IRUFERVJfUlBNX0VORCk7CisKKyAgICBwYXJhbXMtPnAuZW5hYmxlX3JlZl9mcmFtZV9tdnMgPSAocGFyYW1zLT5wLnNlcV9mbGFncyA+PiA3KSAmIDB4MTsKKyAgICBwYXJhbXMtPnAuZW5hYmxlX3N1cGVycmVzID0gKHBhcmFtcy0+cC5zZXFfZmxhZ3MgPj4gMTUpICYgMHgxOworCisgICAgaWYgKGRlYnVnICYgQVYxX0RFQlVHX0JVRk1HUl9NT1JFKSB7CisJCWxvY2tfYnVmZmVyX3Bvb2woaHctPmNvbW1vbi5idWZmZXJfcG9vbCwgZmxhZ3MpOworCSAgICBwcl9pbmZvKCJhb21fcGFyYW06ICglZClcbiIsIGh3LT5wYmktPmRlY29kZV9pZHgpOworCQkvL3BiaS0+c2xpY2VfaWR4Kys7CisJICAgIGZvciAoIGkgPSAwOyBpIDwgKFJQTV9FTkQtUlBNX0JFR0lOKTsgaSsrKSB7CisJCSAgICBwcl9pbmZvKCIlMDR4ICIsIHBhcmFtcy0+bC5kYXRhW2ldKTsKKwkJICAgIGlmICgoKGkgKyAxKSAmIDB4ZikgPT0gMCkKKwkJCSAgICBwcl9pbmZvKCJcbiIpOworCQl9CisJCXVubG9ja19idWZmZXJfcG9vbChody0+Y29tbW9uLmJ1ZmZlcl9wb29sLCBmbGFncyk7CisJfQorICByZXR1cm4gaGVhZF90eXBlOworfQorCitzdGF0aWMgaW50IGF2MV9wb3N0cHJvYyhzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJaWYgKGh3LT5wb3N0cHJvY19kb25lKQorCQlyZXR1cm4gMDsKKwlody0+cG9zdHByb2NfZG9uZSA9IDE7CisJcmV0dXJuIGF2MV9idWZtZ3JfcG9zdHByb2MoaHctPnBiaSwgaHctPmZyYW1lX2RlY29kZWQpOworfQorCitzdGF0aWMgdm9pZCB2YXYxX2dldF9jb21wX2J1Zl9pbmZvKHN0cnVjdCBBVjFIV19zICpodywKKwkJCQkJc3RydWN0IHZkZWNfY29tcF9idWZfaW5mbyAqaW5mbykKK3sKKwl1MTYgYml0X2RlcHRoID0gaHctPnBhcmFtLnAuYml0X2RlcHRoOworCisJaW5mby0+bWF4X3NpemUgPSBhdjFfbWF4X21tdV9idWZfc2l6ZSgKKwkJCWh3LT5tYXhfcGljX3csCisJCQlody0+bWF4X3BpY19oKTsKKwlpbmZvLT5oZWFkZXJfc2l6ZSA9IGF2MV9nZXRfaGVhZGVyX3NpemUoCisJCQlody0+ZnJhbWVfd2lkdGgsCisJCQlody0+ZnJhbWVfaGVpZ2h0KTsKKwlpbmZvLT5mcmFtZV9idWZmZXJfc2l6ZSA9IGF2MV9tbXVfcGFnZV9udW0oCisJCQlodywgaHctPmZyYW1lX3dpZHRoLAorCQkJaHctPmZyYW1lX2hlaWdodCwKKwkJCWJpdF9kZXB0aCA9PSAwKTsKK30KKworc3RhdGljIGludCB2YXYxX2dldF9wc19pbmZvKHN0cnVjdCBBVjFIV19zICpodywgc3RydWN0IGFtbF92ZGVjX3BzX2luZm9zICpwcykKK3sKKwlwcy0+dmlzaWJsZV93aWR0aCAJPSBody0+ZnJhbWVfd2lkdGg7CisJcHMtPnZpc2libGVfaGVpZ2h0IAk9IGh3LT5mcmFtZV9oZWlnaHQ7CisJcHMtPmNvZGVkX3dpZHRoIAk9IEFMSUdOKGh3LT5mcmFtZV93aWR0aCwgNjQpOworCXBzLT5jb2RlZF9oZWlnaHQgCT0gQUxJR04oaHctPmZyYW1lX2hlaWdodCwgNjQpOworCXBzLT5kcGJfc2l6ZSAJCT0gaHctPnVzZWRfYnVmX251bTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgdjRsX3Jlc19jaGFuZ2Uoc3RydWN0IEFWMUhXX3MgKmh3KQoreworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShody0+djRsMl9jdHgpOworCXN0cnVjdCBBVjFfQ29tbW9uX3MgKmNvbnN0IGNtID0gJmh3LT5jb21tb247CisJaW50IHJldCA9IDA7CisKKwlpZiAoY3R4LT5wYXJhbV9zZXRzX2Zyb21fdWNvZGUgJiYKKwkJaHctPnJlc19jaF9mbGFnID09IDApIHsKKwkJc3RydWN0IGFtbF92ZGVjX3BzX2luZm9zIHBzOworCQlzdHJ1Y3QgdmRlY19jb21wX2J1Zl9pbmZvIGNvbXA7CisKKwkJaWYgKChjbS0+d2lkdGggIT0gMCAmJgorCQkJY20tPmhlaWdodCAhPSAwKSAmJgorCQkJKGh3LT5mcmFtZV93aWR0aCAhPSBjbS0+d2lkdGggfHwKKwkJCWh3LT5mcmFtZV9oZWlnaHQgIT0gY20tPmhlaWdodCkpIHsKKworCQkJYXYxX3ByaW50KGh3LCAwLAorCQkJCSIlcyAoJWQsJWQpPT4oJWQsJWQpXHJcbiIsIF9fZnVuY19fLCBjbS0+d2lkdGgsCisJCQkJY20tPmhlaWdodCwgaHctPmZyYW1lX3dpZHRoLCBody0+ZnJhbWVfaGVpZ2h0KTsKKworCQkJaWYgKGdldF92YWxpZF9kb3VibGVfd3JpdGVfbW9kZShodykgIT0gMTYpIHsKKwkJCQl2YXYxX2dldF9jb21wX2J1Zl9pbmZvKGh3LCAmY29tcCk7CisJCQkJdmRlY192NGxfc2V0X2NvbXBfYnVmX2luZm8oY3R4LCAmY29tcCk7CisJCQl9CisKKwkJCXZhdjFfZ2V0X3BzX2luZm8oaHcsICZwcyk7CisJCQl2ZGVjX3Y0bF9zZXRfcHNfaW5mb3MoY3R4LCAmcHMpOworCQkJdmRlY192NGxfcmVzX2NoX2V2ZW50KGN0eCk7CisJCQlody0+djRsX3BhcmFtc19wYXJzZWQgPSBmYWxzZTsKKwkJCWh3LT5yZXNfY2hfZmxhZyA9IDE7CisJCQljdHgtPnY0bF9yZXNvbHV0aW9uX2NoYW5nZSA9IDE7CisJCQlody0+ZW9zID0gMTsKKwkJCS8vZGVsX3RpbWVyX3N5bmMoJnBiaS0+dGltZXIpOworCQkJbm90aWZ5X3Y0bF9lb3MoaHdfdG9fdmRlYyhodykpOworCQkJcmV0ID0gMTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB2YXYxX2lzcl90aHJlYWRfZm4oaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgQVYxSFdfcyAqaHcgPSAoc3RydWN0IEFWMUhXX3MgKilkYXRhOworCXVuc2lnbmVkIGludCBkZWNfc3RhdHVzID0gaHctPmRlY19zdGF0dXM7CisJaW50IG9idV90eXBlOworCWludCByZXQgPSAwOworCisJaWYgKGRlY19zdGF0dXMgPT0gQU9NX0FWMV9GUkFNRV9IRUFEX1BBUlNFUl9ET05FIHx8CisJCWRlY19zdGF0dXMgPT0gQU9NX0FWMV9TRVFfSEVBRF9QQVJTRVJfRE9ORSB8fAorCQlkZWNfc3RhdHVzID09IEFPTV9BVjFfRlJBTUVfUEFSU0VSX0RPTkUpIHsKKwkJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX1RIUkVBRF9IRUFEX1NUQVJUKTsKKwl9CisJZWxzZSBpZiAoZGVjX3N0YXR1cyA9PSBBT01fQVYxX0RFQ19QSUNfRU5EIHx8CisJCWRlY19zdGF0dXMgPT0gQU9NX05BTF9ERUNPREVfRE9ORSkgeworCQlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9JU1JfVEhSRUFEX1BJQ19ET05FX1NUQVJUKTsKKwl9CisKKwlpZiAoaHctPmVvcykKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCWh3LT53YWl0X2J1ZiA9IDA7CisJaWYgKChkZWNfc3RhdHVzID09IEFPTV9OQUxfREVDT0RFX0RPTkUpIHx8CisJCQkoZGVjX3N0YXR1cyA9PSBBT01fU0VBUkNIX0JVRkVNUFRZKSB8fAorCQkJKGRlY19zdGF0dXMgPT0gQU9NX0RFQ09ERV9CVUZFTVBUWSkKKwkJKSB7CisJCWlmIChody0+bV9pbnNfZmxhZykgeworCQkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwkJCWlmICghdmRlY19mcmFtZV9iYXNlZChod190b192ZGVjKGh3KSkpCisJCQkJZGVjX2FnYWluX3Byb2Nlc3MoaHcpOworCQkJZWxzZSB7CisJCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJCQkJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX1RIUkVBRF9FRE4pOworCQkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJfQorCQl9CisJCWh3LT5wcm9jZXNzX2J1c3kgPSAwOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfSBlbHNlIGlmIChkZWNfc3RhdHVzID09IEFPTV9BVjFfREVDX1BJQ19FTkQpIHsKKwkJc3RydWN0IEFWMV9Db21tb25fcyAqY29uc3QgY20gPSAmaHctPmNvbW1vbjsKKwkJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKmZyYW1lID0gJmNtLT5jdXJfZnJhbWUtPmJ1ZjsKKwkJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaHcpOworI2lmIDEKKwkJdTMyIGZnX3JlZzAsIGZnX3JlZzEsIG51bV95X3BvaW50cywgbnVtX2NiX3BvaW50cywgbnVtX2NyX3BvaW50czsKKwkJV1JJVEVfVlJFRyhIRVZDX0ZHU19JRFgsIDApOworCQlmZ19yZWcwID0gUkVBRF9WUkVHKEhFVkNfRkdTX0RBVEEpOworCQlmZ19yZWcxID0gUkVBRF9WUkVHKEhFVkNfRkdTX0RBVEEpOworCQludW1feV9wb2ludHMgPSBmZ19yZWcxICYgMHhmOworCQludW1fY3JfcG9pbnRzID0gKGZnX3JlZzEgPj4gOCkgJiAweGY7CisJCW51bV9jYl9wb2ludHMgPSAoZmdfcmVnMSA+PiA0KSAmIDB4ZjsKKwkJaWYgKChudW1feV9wb2ludHMgPiAwKSB8fAorCQkoKG51bV9jYl9wb2ludHMgPiAwKSB8ICgoZmdfcmVnMCA+PiAxNykgJiAweDEpKSB8fAorCQkoKG51bV9jcl9wb2ludHMgPiAwKSB8ICgoZmdfcmVnMCA+PiAxNykgJiAweDEpKSkKKwkJCWh3LT5mZ3NfdmFsaWQgPSAxOworCQllbHNlCisJCQlody0+ZmdzX3ZhbGlkID0gMDsKKwkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJCSJmZ19kYXRhMCAweCV4IGZnX2RhdGExIDB4JXggZmdfdmFsaWQgJWRcbiIsCisJCQlmZ19yZWcwLCBmZ19yZWcxLCBody0+ZmdzX3ZhbGlkKTsKKyNlbHNlCisJCWlmIChSRUFEX1ZSRUcoSEVWQ19GR1NfQ1RSTCkgJgorCQkJCSgoMSA8PCA0KSB8ICgxIDw8IDUpIHwgKDEgPDwgNikpKQorCQkJaHctPmZnc192YWxpZCA9IDE7CisJCWVsc2UKKwkJCWh3LT5mZ3NfdmFsaWQgPSAwOworI2VuZGlmCisJCWRlY29kZV9mcmFtZV9jb3VudFtody0+aW5kZXhdID0gaHctPmZyYW1lX2NvdW50OworCQlpZiAoaHctPm1faW5zX2ZsYWcpIHsKKyNpZmRlZiBVU0VfREVDX1BJQ19FTkQKKwkJCWlmIChSRUFEX1ZSRUcoUElDX0VORF9MQ1VfQ09VTlQpICE9IDApIHsKKwkJCQlody0+ZnJhbWVfZGVjb2RlZCA9IDE7CisJCQkJaWYgKGNtLT5jdXJfZnJhbWUgJiYgdmRlYy0+bXZmcm0gJiYgZnJhbWUpIHsKKwkJCQkJZnJhbWUtPmh3X2RlY29kZV90aW1lID0KKwkJCQkJbG9jYWxfY2xvY2soKSAtIHZkZWMtPm12ZnJtLT5od19kZWNvZGVfc3RhcnQ7CisJCQkJCWZyYW1lLT5mcmFtZV9zaXplMiA9IHZkZWMtPm12ZnJtLT5mcmFtZV9zaXplOworCQkJCX0KKwkJCQlody0+Z3ZzLT5mcmFtZV9jb3VudCA9IGh3LT5mcmFtZV9jb3VudDsKKwkJCQkvKgorCQkJCUluIGMgbW9kdWxlLCBtdWx0aSBvYnVzIGFyZSBwdXQgaW4gb25lIHBhY2tldCwgd2hpY2ggaXMgZGVjb2RlZAorCQkJCXdpdGggYXYxX3JlY2VpdmVfY29tcHJlc3NlZF9kYXRhKCkuCisJCQkJRm9yIFNUUkVBTV9NT0RFIG9yIFNJTkdMRV9NT0RFLCB0aGVyZSBpcyBubyBwYWNrZXQgYm91bmRhcnksCisJCQkJd2UgYXNzdW1lIGVhY2ggcGFja2V0IG11c3QgYW5kIG9ubHkgaW5jbHVkZSBvbmUgcGljdHVyZSBvZiBkYXRhIChMQ1VzKQorCQkJCSBvciBjbS0+c2hvd19leGlzdGluZ19mcmFtZSBpcyAxCisJCQkJKi8KKwkJCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkJCQkiRGVjb2RpbmcgZG9uZSAoaW5kZXggJWQpLCBmZ3NfdmFsaWQgJWQgZGF0YV9zaXplIDB4JXggc2hpZnRieXRlIDB4JXhcbiIsCisJCQkJCWNtLT5jdXJfZnJhbWU/IGNtLT5jdXJfZnJhbWUtPmJ1Zi5pbmRleDotMSwKKwkJCQkJaHctPmZnc192YWxpZCwKKwkJCQkJaHctPmRhdGFfc2l6ZSwKKwkJCQkJUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCkpOworCQkJCWh3LT5jb25maWdfbmV4dF9yZWZfaW5mb19mbGFnID0gMTsgLyp0byBkbzogbG93X2xhdGVuY3lfZmxhZyAgY2FzZSovCisJCQkJLy9jb25maWdfbmV4dF9yZWZfaW5mb19odyhodyk7CisJCQl9CisjZW5kaWYKKworCQkJaWYgKGdldF9waWN0dXJlX3FvcykKKwkJCQlnZXRfcGljdHVyZV9xb3NfaW5mbyhodyk7CisKKwkJCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisKKwkJCWlmIChody0+bV9pbnNfZmxhZyAmJiBody0+bW11X2VuYWJsZSAmJgorCQkJCShkZWJ1ZyAmIEFPTV9ERUJVR19ESVNfUkVDWUNMRV9NTVVfVEFJTCkgPT0gMCkgeworCQkJCWxvbmcgdXNlZF80a19udW0gPQorCQkJCShSRUFEX1ZSRUcoSEVWQ19TQU9fTU1VX1NUQVRVUykgPj4gMTYpOworCQkJCWlmIChjbS0+Y3VyX2ZyYW1lICE9IE5VTEwpIHsKKwkJCQkJaGV2Y19tbXVfZG1hX2NoZWNrKGh3X3RvX3ZkZWMoaHcpKTsKKworCQkJCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLCAibW11IGZyZWUgdGFpbCwgaW5kZXggJWQgdXNlZF9udW0gMHgleFxuIiwKKwkJCQkJCWNtLT5jdXJfZnJhbWUtPmJ1Zi5pbmRleCwgdXNlZF80a19udW0pOworCQkJCQlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCQkJCQlzdHJ1Y3QgaW50ZXJuYWxfY29tcF9idWYgKmlidWYgPQorCQkJCQkJCWluZGV4X3RvX2ljb21wX2J1ZihodywgY20tPmN1cl9mYl9pZHhfbW11KTsKKworCQkJCQkJZGVjb2Rlcl9tbXVfYm94X2ZyZWVfaWR4X3RhaWwoCisJCQkJCQkJaWJ1Zi0+bW11X2JveCwKKwkJCQkJCQlpYnVmLT5pbmRleCwKKwkJCQkJCQl1c2VkXzRrX251bSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlkZWNvZGVyX21tdV9ib3hfZnJlZV9pZHhfdGFpbChody0+bW11X2JveCwKKwkJCQkJCQljbS0+Y3VyX2ZyYW1lLT5idWYuaW5kZXgsIHVzZWRfNGtfbnVtKTsKKwkJCQkJfQorI2lmZGVmIEFPTV9BVjFfTU1VX0RXCisJCQkJCWlmIChody0+ZHdfbW11X2VuYWJsZSkgeworCQkJCQkJdXNlZF80a19udW0gPQorCQkJCQkJKFJFQURfVlJFRyhIRVZDX1NBT19NTVVfU1RBVFVTMikgPj4gMTYpOworCQkJCQkJZGVjb2Rlcl9tbXVfYm94X2ZyZWVfaWR4X3RhaWwoaHctPm1tdV9ib3hfZHcsCisJCQkJCQkJY20tPmN1cl9mcmFtZS0+YnVmLmluZGV4LCB1c2VkXzRrX251bSk7CisJCQkJCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLCAiZHcgbW11IGZyZWUgdGFpbCwgaW5kZXggJWQgdXNlZF9udW0gMHgleFxuIiwKKwkJCQkJCQljbS0+Y3VyX2ZyYW1lLT5idWYuaW5kZXgsIHVzZWRfNGtfbnVtKTsKKwkJCQkJfQorI2VuZGlmCisJCQkJfQorCisKKwkJCX0KKwkJCS8qCisJCQlpZiAoZGVidWcgJgorCQkJCUFWMV9ERUJVR19CVUZNR1JfTU9SRSkKKwkJCQlkdW1wX2F1eF9idWYoaHcpOworCQkJc2V0X2F1eF9kYXRhKGh3LAorCQkJCSZjbS0+Y3VyX2ZyYW1lLT5idWYsIDAsIDApOworCQkJKi8KKwkJCWlmICgvKmh3LT52Zl9wcmVfY291bnQgPT0gMCB8fCovIGh3LT5sb3dfbGF0ZW5jeV9mbGFnKQorCQkJCWF2MV9wb3N0cHJvYyhodyk7CisKKwkJCWlmIChtdWx0aV9mcmFtZXNfaW5fb25lX3BhY2sgJiYKKwkJCWh3LT5mcmFtZV9kZWNvZGVkICYmCisJCQlSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKSA8IGh3LT5kYXRhX3NpemUpIHsKKyNpZmRlZiBERUJVR19DUkNfRVJST1IKKwkJCQlpZiAoKGNyY19kZWJ1Z19mbGFnICYgMHg0MCkgJiYgY20tPmN1cl9mcmFtZSkKKwkJCQkJZHVtcF9tdl9idWZmZXIoaHcsICZjbS0+Y3VyX2ZyYW1lLT5idWYpOworI2VuZGlmCisJCQkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCBBT01fQVYxX1NFQVJDSF9IRUFEKTsKKwkJCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkJCSJQSUNfRU5ELCBmZ3NfdmFsaWQgJWQgc2VhcmNoIGhlYWQgLi4uXG4iLAorCQkJCWh3LT5mZ3NfdmFsaWQpOworCQkJCWlmIChody0+Y29uZmlnX25leHRfcmVmX2luZm9fZmxhZykKKwkJCQkJY29uZmlnX25leHRfcmVmX2luZm9faHcoaHcpOworCQkJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9USFJFQURfRUROKTsKKwkJCX0gZWxzZSB7CisjaWZkZWYgREVCVUdfQ1JDX0VSUk9SCisJCQkJaWYgKChjcmNfZGVidWdfZmxhZyAmIDB4NDApICYmIGNtLT5jdXJfZnJhbWUpCisJCQkJCWR1bXBfbXZfYnVmZmVyKGh3LCAmY20tPmN1cl9mcmFtZS0+YnVmKTsKKyNlbmRpZgorCQkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworCQkJCWFtaGV2Y19zdG9wKCk7CisjaWZkZWYgTUNSQ0NfRU5BQkxFCisJCQkJaWYgKG1jcmNjX2NhY2hlX2FsZ19mbGFnKQorCQkJCQlkdW1wX2hpdF9yYXRlKGh3KTsKKyNlbmRpZgorCQkJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9USFJFQURfRUROKTsKKwkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCX0KKwkJfSBlbHNlIHsKKyAgICAgICAgICAgIGF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisgICAgICAgICAgICAJIlBJQ19FTkQsIGZnc192YWxpZCAlZCBzZWFyY2ggaGVhZCAuLi5cbiIsCisgICAgICAgICAgICAJaHctPmZnc192YWxpZCk7CisjaWZkZWYgVVNFX0RFQ19QSUNfRU5ECisJCSAgICBpZiAoUkVBRF9WUkVHKFBJQ19FTkRfTENVX0NPVU5UKSAhPSAwKSB7CisJCQkgICAgaHctPmZyYW1lX2RlY29kZWQgPSAxOworCQkJCQkvKgorCQkJCSAgICBJbiBjIG1vZHVsZSwgbXVsdGkgb2J1cyBhcmUgcHV0IGluIG9uZSBwYWNrZXQsIHdoaWNoIGlzIGRlY29kZWQKKwkJCQkgICAgd2l0aCBhdjFfcmVjZWl2ZV9jb21wcmVzc2VkX2RhdGEoKS4KKwkJCQkgICAgRm9yIFNUUkVBTV9NT0RFIG9yIFNJTkdMRV9NT0RFLCB0aGVyZSBpcyBubyBwYWNrZXQgYm91bmRhcnksCisJCQkJICAgIHdlIGFzc3VtZSBlYWNoIHBhY2tldCBtdXN0IGFuZCBvbmx5IGluY2x1ZGUgb25lIHBpY3R1cmUgb2YgZGF0YSAoTENVcykKKwkJCQkJIG9yIGNtLT5zaG93X2V4aXN0aW5nX2ZyYW1lIGlzIDEKKwkJCQkJKi8KKwkJCQlpZiAoY20tPmN1cl9mcmFtZSkKKwkJCQkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwgIkRlY29kaW5nIGRvbmUgKGluZGV4ICVkKVxuIiwKKwkJCQkJCWNtLT5jdXJfZnJhbWU/IGNtLT5jdXJfZnJhbWUtPmJ1Zi5pbmRleDotMSk7CisJCQkJY29uZmlnX25leHRfcmVmX2luZm9faHcoaHcpOworCQkJfQorI2VuZGlmCisJCQlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIEFPTV9BVjFfU0VBUkNIX0hFQUQpOworCQkJLyoKKwkJCWlmIChkZWJ1ZyAmCisJCQkJQVYxX0RFQlVHX0JVRk1HUl9NT1JFKQorCQkJCWR1bXBfYXV4X2J1Zihodyk7CisJCQlzZXRfYXV4X2RhdGEoaHcsCisJCQkJJmNtLT5jdXJfZnJhbWUtPmJ1ZiwgMCwgMCk7CisJCQkqLworCQkJaWYgKGh3LT5sb3dfbGF0ZW5jeV9mbGFnKSB7CisJCQkJYXYxX3Bvc3Rwcm9jKGh3KTsKKwkJCQl2ZGVjX3Byb2ZpbGUoaHdfdG9fdmRlYyhodyksIFZERUNfUFJPRklMRV9FVkVOVF9DQik7CisJCQkJaWYgKGRlYnVnICYgUFJJTlRfRkxBR19WREVDX0RFVEFJTCkKKwkJCQkJcHJfaW5mbygiJXMgQVYxIGZyYW1lIGRvbmUgXG4iLCBfX2Z1bmNfXyk7CisJCQl9CisJCX0KKworCQlody0+cHJvY2Vzc19idXN5ID0gMDsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWlmIChkZWNfc3RhdHVzID09IEFPTV9FT1MpIHsKKwkJaWYgKGh3LT5tX2luc19mbGFnKQorCQkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKworCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLCAiQVYxX0VPUywgZmx1c2ggYnVmZmVyXHJcbiIpOworCisJCWF2MV9wb3N0cHJvYyhodyk7CisKKwkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwgInNlbmQgQVYxXzEwQl9ESVNDQVJEX05BTFxyXG4iKTsKKwkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCBBT01fQVYxX0RJU0NBUkRfTkFMKTsKKwkJaHctPnByb2Nlc3NfYnVzeSA9IDA7CisJCWlmIChody0+bV9pbnNfZmxhZykgeworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJCQlhbWhldmNfc3RvcCgpOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCX0KKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0gZWxzZSBpZiAoZGVjX3N0YXR1cyA9PSBBT01fREVDT0RFX09WRVJfU0laRSkgeworCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLCAiYXYxICBkZWNvZGUgb3ZlcnNpemUgISFcbiIpOworCQkvKmRlYnVnIHw9IChBVjFfREVCVUdfRElTX0xPQ19FUlJPUl9QUk9DIHwKKwkJCUFWMV9ERUJVR19ESVNfU1lTX0VSUk9SX1BST0MpOyovCisJCWh3LT5mYXRhbF9lcnJvciB8PSBERUNPREVSX0ZBVEFMX0VSUk9SX1NJWkVfT1ZFUkZMT1c7CisJCWh3LT5wcm9jZXNzX2J1c3kgPSAwOworCQlpZiAoaHctPm1faW5zX2ZsYWcpCisJCQlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisgICAgb2J1X3R5cGUgPSBsb2FkX3BhcmFtKGh3LCAmaHctPmFvbV9wYXJhbSwgZGVjX3N0YXR1cyk7CisgICAgaWYgKG9idV90eXBlIDwgMCkgeworCQlody0+cHJvY2Vzc19idXN5ID0gMDsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworICAgIGlmIChvYnVfdHlwZSA9PSBPQlVfU0VRVUVOQ0VfSEVBREVSKSB7CisJCWludCBuZXh0X2xjdV9zaXplOworCSAgICBody0+aGFzX3NlcXVlbmNlID0gMTsKKwkgICAgYXYxX2J1Zm1ncl9wcm9jZXNzKGh3LT5wYmksICZody0+YW9tX3BhcmFtLCAwLCBvYnVfdHlwZSk7CisKKwkJaWYgKChody0+bWF4X3BpY193IDwgaHctPmFvbV9wYXJhbS5wLm1heF9mcmFtZV93aWR0aCkgfHwKKwkJCShody0+bWF4X3BpY19oIDwgaHctPmFvbV9wYXJhbS5wLm1heF9mcmFtZV9oZWlnaHQpKSB7CisJCQlhdjFfcHJpbnQoaHcsIDAsICIlcywgbWF4IHNpemUgY2hhbmdlICglZCwgJWQpIC0+ICglZCwgJWQpXG4iLAorCQkJCV9fZnVuY19fLCBody0+bWF4X3BpY193LCBody0+bWF4X3BpY19oLAorCQkJCWh3LT5hb21fcGFyYW0ucC5tYXhfZnJhbWVfd2lkdGgsIGh3LT5hb21fcGFyYW0ucC5tYXhfZnJhbWVfaGVpZ2h0KTsKKwkJCXZhdjFfbW11X21hcF9mcmVlKGh3KTsKKwkJCWh3LT5tYXhfcGljX3cgPSBody0+YW9tX3BhcmFtLnAubWF4X2ZyYW1lX3dpZHRoOworCQkJaHctPm1heF9waWNfaCA9IGh3LT5hb21fcGFyYW0ucC5tYXhfZnJhbWVfaGVpZ2h0OworCQkJaHctPmluaXRfcGljX3cgPSBody0+bWF4X3BpY193OworCQkJaHctPmluaXRfcGljX2ggPSBody0+bWF4X3BpY19oOworCQkJaHctPnBiaS0+ZnJhbWVfd2lkdGggPSBody0+aW5pdF9waWNfdzsKKwkJCWh3LT5wYmktPmZyYW1lX2hlaWdodCA9IGh3LT5pbml0X3BpY19oOworCQkJaWYgKElTXzhLX1NJWkUoaHctPm1heF9waWNfdywgaHctPm1heF9waWNfaCkpIHsKKwkJCQlody0+ZG91YmxlX3dyaXRlX21vZGUgPSA0OworCQkJCWh3LT51c2VkX2J1Zl9udW0gPSBNQVhfQlVGX05VTV9MRVNTOworCQkJCWlmIChody0+dXNlZF9idWZfbnVtID4gUkVGX0ZSQU1FU180SykKKwkJCQkJaHctPm12X2J1Zl9tYXJnaW4gPSBody0+dXNlZF9idWZfbnVtIC0gUkVGX0ZSQU1FU180SyArIDE7CisJCQkJaWYgKCgoaHctPm1heF9waWNfdyAlIDY0KSAhPSAwKSAmJgorCQkJCQkoaHdfdG9fdmRlYyhodyktPmNhbnZhc19tb2RlICE9IENBTlZBU19CTEtNT0RFX0xJTkVBUikpCisJCQkJCWh3LT5tZW1fbWFwX21vZGUgPSAyOworCQkJCWF2MV9wcmludChodywgMCwKKwkJCQkJImZvcmNlIDhrIGRvdWJsZSB3cml0ZSA0LCBtZW1fbWFwX21vZGUgJWRcbiIsIGh3LT5tZW1fbWFwX21vZGUpOworCQkJfQorCQkJdmF2MV9tbXVfbWFwX2FsbG9jKGh3KTsKKwkJCWlmIChody0+bW11X2VuYWJsZSkKKwkJCSAgICBXUklURV9WUkVHKEhFVkNfU0FPX01NVV9ETUFfQ1RSTCwgaHctPmZyYW1lX21tdV9tYXBfcGh5X2FkZHIpOworI2lmZGVmIEFPTV9BVjFfTU1VX0RXCisJCQlpZiAoaHctPmR3X21tdV9lbmFibGUpIHsKKwkJCQlXUklURV9WUkVHKEhFVkNfU0FPX01NVV9ETUFfQ1RSTDIsIGh3LT5kd19mcmFtZV9tbXVfbWFwX3BoeV9hZGRyKTsKKwkJCQkvL2RlZmF1bHQgb2YgMHhmZmZmZmZmZiB3aWxsIGRpc2FibGUgZHcKKwkJCSAgICBXUklURV9WUkVHKEhFVkNfU0FPX1lfU1RBUlRfQUREUiwgMCk7CisJCQkgICAgV1JJVEVfVlJFRyhIRVZDX1NBT19DX1NUQVJUX0FERFIsIDApOworCQkJfQorI2VuZGlmCisKKwkJCS8qdjRsMiBhbGxvYyBuZXcgbXYgd2hlbiBtYXggc2l6ZSBjaGFuZ2VkICovCisJCQlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCQkJLyogbm93IGxlc3MgdGhhbiA4ayB1c2UgZml4IG12IGJ1ZiBzaXplICovCisJCQkJaWYgKElTXzhLX1NJWkUoaHctPm1heF9waWNfdywgaHctPm1heF9waWNfaCkgJiYgaHctPnBpY19saXN0X2luaXRfZG9uZSkgeworCQkJCQlpZiAoaW5pdF9tdl9idWZfbGlzdChodykgPCAwKQorCQkJCQkJcHJfZXJyKCIlczogISEhIUVycm9yLCByZWluaXRfbXZfYnVmX2xpc3QgZmFpbFxuIiwgX19mdW5jX18pOworCQkJCX0KKwkJCX0KKwkJfQorCQliaXRfZGVwdGhfbHVtYSA9IGh3LT5hb21fcGFyYW0ucC5iaXRfZGVwdGg7CisJCWJpdF9kZXB0aF9jaHJvbWEgPSBody0+YW9tX3BhcmFtLnAuYml0X2RlcHRoOworCQluZXh0X2xjdV9zaXplID0gKChody0+YW9tX3BhcmFtLnAuc2VxX2ZsYWdzID4+IDYpICYgMHgxKSA/IDEyOCA6IDY0OworCQlody0+dmlkZW9fc2lnbmFsX3R5cGUgPSAoaHctPmFvbV9wYXJhbS5wLnZpZGVvX3NpZ25hbF90eXBlIDw8IDE2CisJCQl8IGh3LT5hb21fcGFyYW0ucC5jb2xvcl9kZXNjcmlwdGlvbik7CisKKwkgICAgaWYgKG5leHRfbGN1X3NpemUgIT0gaHctPmN1cnJlbnRfbGN1X3NpemUpIHsKKwkJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCQkJIiAjIyBsY3Vfc2l6ZSBjaGFuZ2VkIGZyb20gJWQgdG8gJWRcbiIsCisJCQkJaHctPmN1cnJlbnRfbGN1X3NpemUsIG5leHRfbGN1X3NpemUpOworCQkJaHctPmN1cnJlbnRfbGN1X3NpemUgPSBuZXh0X2xjdV9zaXplOworCQl9CisKKwkgICAgaWYgKCFody0+cGljX2xpc3RfaW5pdF9kb25lKSB7CisjaWYgMAorCQkJaWYgKGh3LT5tX2luc19mbGFnKSB7CisJCQkJLyogcGljdHVyZSBsaXN0IGluaXQuKi8KKwkJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19JTklUX1BJQ0xJU1Q7CisJCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQl9IGVsc2UKKyNlbmRpZgorCQkJeworCQkJCWluaXRfcGljX2xpc3QoaHcpOworCQkJCWluaXRfcGljX2xpc3RfaHcoaHcpOworI2lmbmRlZiBNVl9VU0VfRklYRURfQlVGCisJCQkJaWYgKGluaXRfbXZfYnVmX2xpc3QoaHcpIDwgMCkgeworCQkJCQlwcl9lcnIoIiVzOiAhISEhRXJyb3IsIGluaXRfbXZfYnVmX2xpc3QgZmFpbFxuIiwgX19mdW5jX18pOworCQkJCX0KKyNlbmRpZgorCQkJfQorCQkJaHctPnBpY19saXN0X2luaXRfZG9uZSA9IHRydWU7CisJCX0KKwkgICAgYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJCSJBT01fQVYxX1NFUV9IRUFEX1BBUlNFUl9ET05FLCBzZWFyY2ggaGVhZCAuLi5cbiIpOworCSAgICBXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIEFPTV9BVjFfU0VBUkNIX0hFQUQpOworCQlody0+cHJvY2Vzc19idXN5ID0gMDsKKwkJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX1RIUkVBRF9IRUFEX0VORCk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisjaWZuZGVmIFVTRV9ERUNfUElDX0VORAorCQkvL2lmIChwYmktPndhaXRfYnVmKSB7CisJICAgIGlmIChwYmktPmJ1Zm1ncl9wcm9jX2NvdW50ID4gMCkgeworCQkgICAgaWYgKFJFQURfVlJFRyhQSUNfRU5EX0xDVV9DT1VOVCkgIT0gMCkgeworCQkJICAgIGh3LT5mcmFtZV9kZWNvZGVkID0gMTsKKwkJCQkvKgorCQkJICAgIEluIGMgbW9kdWxlLCBtdWx0aSBvYnVzIGFyZSBwdXQgaW4gb25lIHBhY2tldCwgd2hpY2ggaXMgZGVjb2RlZAorCQkJICAgIHdpdGggYXYxX3JlY2VpdmVfY29tcHJlc3NlZF9kYXRhKCkuCisJCQkgICAgRm9yIFNUUkVBTV9NT0RFIG9yIFNJTkdMRV9NT0RFLCB0aGVyZSBpcyBubyBwYWNrZXQgYm91bmRhcnksCisJCQkgICAgd2UgYXNzdW1lIGVhY2ggcGFja2V0IG11c3QgYW5kIG9ubHkgaW5jbHVkZSBvbmUgcGljdHVyZSBvZiBkYXRhIChMQ1VzKQorCQkJCSBvciBjbS0+c2hvd19leGlzdGluZ19mcmFtZSBpcyAxCisJCQkJKi8KKwkJCQlpZiAoY20tPmN1cl9mcmFtZSkKKwkJCQkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwgIkRlY29kaW5nIGRvbmUgKGluZGV4ICVkKVxuIiwKKwkJCQkJCWNtLT5jdXJfZnJhbWU/IGNtLT5jdXJfZnJhbWUtPmJ1Zi5pbmRleDotMSk7CisJCQl9CisJCX0KKyNlbmRpZgorI2lmIDEKKy8qZGVmIENIRUNLX09CVV9SRURVTkRBTlRfRlJBTUVfSEVBREVSKi8KKwkgICAgaWYgKGRlYnVnICYgQU9NX0RFQlVHX0JVRk1HUl9PTkxZKSB7CisJCSAgICBpZiAoUkVBRF9WUkVHKFBJQ19FTkRfTENVX0NPVU5UKSAhPSAwKQorCQkJICAgIGh3LT5vYnVfZnJhbWVfZnJhbWVfaGVhZF9jb21lX2FmdGVyX3RpbGUgPSAwOworCisJCSAgICBpZiAob2J1X3R5cGUgPT0gT0JVX0ZSQU1FX0hFQURFUiB8fAorCQkJICBvYnVfdHlwZSA9PSBPQlVfRlJBTUUpIHsKKwkJCSAgaHctPm9idV9mcmFtZV9mcmFtZV9oZWFkX2NvbWVfYWZ0ZXJfdGlsZSA9IDE7CisJCQl9IGVsc2UgaWYgKG9idV90eXBlID09IE9CVV9SRURVTkRBTlRfRlJBTUVfSEVBREVSICYmCisJCQkJaHctPm9idV9mcmFtZV9mcmFtZV9oZWFkX2NvbWVfYWZ0ZXJfdGlsZSA9PSAwKSB7CisJCQkJaWYgKGh3LT5mcmFtZV9kZWNvZGVkID09IDEpIHsKKwkJCQkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJCQkJCSJXYXJuaW5nLCBPQlVfUkVEVU5EQU5UX0ZSQU1FX0hFQURFUiBjb21lIHdpdGhvdXQgT0JVX0ZSQU1FIG9yIE9CVV9GUkFNRV9IRUFEXG4iKTsKKwkJCQkJaHctPmZyYW1lX2RlY29kZWQgPSAwOworCQkJCX0KKwkJCX0KKwkJfQorI2VuZGlmCisJaWYgKGh3LT5mcmFtZV9kZWNvZGVkKQorCQlody0+b25lX2NvbXByZXNzZWRfZGF0YV9kb25lID0gMTsKKworCWlmIChody0+bV9pbnNfZmxhZykKKwkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKworCWlmIChody0+cHJvY2Vzc19zdGF0ZSAhPSBQUk9DX1NUQVRFX1NFTkRBR0FJTgorCQkpIHsKKwkgICAgaWYgKGh3LT5vbmVfY29tcHJlc3NlZF9kYXRhX2RvbmUpIHsKKwkgICAgICAgIGF2MV9wb3N0cHJvYyhodyk7CisJICAgICAgICBhdjFfcmVsZWFzZV9idWZzKGh3KTsKKyNpZm5kZWYgTVZfVVNFX0ZJWEVEX0JVRgorCSAgICAgICAgcHV0X3VuX3VzZWRfbXZfYnVmcyhodyk7CisjZW5kaWYKKwkgICAgfQorCX0KKworCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShody0+djRsMl9jdHgpOworCisJCWh3LT5mcmFtZV93aWR0aCA9IGh3LT5jb21tb24uc2VxX3BhcmFtcy5tYXhfZnJhbWVfd2lkdGg7CisJCWh3LT5mcmFtZV9oZWlnaHQgPSBody0+Y29tbW9uLnNlcV9wYXJhbXMubWF4X2ZyYW1lX2hlaWdodDsKKworCQlpZiAoIXY0bF9yZXNfY2hhbmdlKGh3KSkgeworCQkJaWYgKGN0eC0+cGFyYW1fc2V0c19mcm9tX3Vjb2RlICYmICFody0+djRsX3BhcmFtc19wYXJzZWQpIHsKKwkJCQlzdHJ1Y3QgYW1sX3ZkZWNfcHNfaW5mb3MgcHM7CisJCQkJc3RydWN0IHZkZWNfY29tcF9idWZfaW5mbyBjb21wOworCisJCQkJcHJfaW5mbygic2V0IHVjb2RlIHBhcnNlXG4iKTsKKwkJCQlpZiAoZ2V0X3ZhbGlkX2RvdWJsZV93cml0ZV9tb2RlKGh3KSAhPSAxNikgeworCQkJCQl2YXYxX2dldF9jb21wX2J1Zl9pbmZvKGh3LCAmY29tcCk7CisJCQkJCXZkZWNfdjRsX3NldF9jb21wX2J1Zl9pbmZvKGN0eCwgJmNvbXApOworCQkJCX0KKworCQkJCXZhdjFfZ2V0X3BzX2luZm8oaHcsICZwcyk7CisJCQkJLypub3RpY2UgdGhlIHY0bDIgY29kZWMuKi8KKwkJCQl2ZGVjX3Y0bF9zZXRfcHNfaW5mb3MoY3R4LCAmcHMpOworCQkJCWh3LT52NGxfcGFyYW1zX3BhcnNlZCA9IHRydWU7CisJCQkJaHctPnBvc3Rwcm9jX2RvbmUgPSAwOworCQkJCWh3LT5wcm9jZXNzX2J1c3kgPSAwOworCQkJCWRlY19hZ2Fpbl9wcm9jZXNzKGh3KTsKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlody0+cG9zdHByb2NfZG9uZSA9IDA7CisJCQlody0+cHJvY2Vzc19idXN5ID0gMDsKKwkJCWRlY19hZ2Fpbl9wcm9jZXNzKGh3KTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCX0KKworCWlmIChody0+b25lX3BhY2thZ2VfZnJhbWVfY250KSB7CisJCWlmIChnZXRfZnJlZV9idWZfY291bnQoaHcpIDw9IDApIHsKKwkJCWh3LT5kZWNfcmVzdWx0ID0gQU9NX0FWMV9SRVNVTFRfTkVFRF9NT1JFX0JVRkZFUjsKKwkJCWh3LT5jdXJfb2J1X3R5cGUgPSBvYnVfdHlwZTsKKwkJCWh3LT5wcm9jZXNzX2J1c3kgPSAwOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9JU1JfVEhSRUFEX0hFQURfRU5EKTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCX0KKwlody0+b25lX3BhY2thZ2VfZnJhbWVfY250Kys7CisKKwlyZXQgPSBhdjFfY29udGludWVfZGVjb2RpbmcoaHcsIG9idV90eXBlKTsKKwlody0+cG9zdHByb2NfZG9uZSA9IDA7CisJaHctPnByb2Nlc3NfYnVzeSA9IDA7CisKKwlpZiAoaHctPm1faW5zX2ZsYWcpIHsKKwkJaWYgKHJldCA+PSAwKQorCQkJc3RhcnRfcHJvY2Vzc190aW1lKGh3KTsKKwkJZWxzZSB7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwkJCWFtaGV2Y19zdG9wKCk7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJfQorCX0KKwlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9JU1JfVEhSRUFEX0hFQURfRU5EKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB2YXYxX2lzcihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCWludCBpOworCXVuc2lnbmVkIGludCBkZWNfc3RhdHVzOworCXN0cnVjdCBBVjFIV19zICpodyA9IChzdHJ1Y3QgQVYxSFdfcyAqKWRhdGE7CisJLy9zdHJ1Y3QgQVYxX0NvbW1vbl9zICpjb25zdCBjbSA9ICZody0+Y29tbW9uOworCXVpbnQgZGVidWdfdGFnOworCisJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9NQk9YMF9DTFJfUkVHLCAxKTsKKworCWRlY19zdGF0dXMgPSBSRUFEX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRykgJiAweGZmOworCisJaWYgKGRlY19zdGF0dXMgPT0gQU9NX0FWMV9GUkFNRV9IRUFEX1BBUlNFUl9ET05FIHx8CisJCWRlY19zdGF0dXMgPT0gQU9NX0FWMV9TRVFfSEVBRF9QQVJTRVJfRE9ORSB8fAorCQlkZWNfc3RhdHVzID09IEFPTV9BVjFfRlJBTUVfUEFSU0VSX0RPTkUpIHsKKwkJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX0hFQURfRE9ORSk7CisJfQorCWVsc2UgaWYgKGRlY19zdGF0dXMgPT0gQU9NX0FWMV9ERUNfUElDX0VORCB8fAorCQlkZWNfc3RhdHVzID09IEFPTV9OQUxfREVDT0RFX0RPTkUpIHsKKwkJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX1BJQ19ET05FKTsKKwl9CisJaWYgKCFodykKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCWlmIChody0+aW5pdF9mbGFnID09IDApCisJCXJldHVybiBJUlFfSEFORExFRDsKKwlpZiAoaHctPnByb2Nlc3NfYnVzeSkvKm9uIHByb2Nlc3MuKi8KKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCWh3LT5kZWNfc3RhdHVzID0gZGVjX3N0YXR1czsKKwlody0+cHJvY2Vzc19idXN5ID0gMTsKKwlpZiAoZGVidWcgJiBBVjFfREVCVUdfQlVGTUdSKQorCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19CVUZNR1IsCisJCQkiYXYxIGlzciAoJWQpIGRlYyBzdGF0dXMgID0gMHgleCAoMHgleCksIGxjdSAweCV4IHNoaWZ0Ynl0ZSAweCV4IHNoaWZ0ZWRfZGF0YSAweCV4ICgleCAleCBsZXYgJXgsIHdyICV4LCByZCAleCkgbG9nICV4XG4iLAorCQkJaXJxLAorCQkJZGVjX3N0YXR1cywgUkVBRF9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcpLAorCQkJUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0xDVV9TVEFSVCksCisJCQlSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NISUZURURfREFUQSksCisJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fU1RBUlRfQUREUiksCisJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fRU5EX0FERFIpLAorCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0xFVkVMKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9XUl9QVFIpLAorCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1JEX1BUUiksCisjaWZkZWYgREVCVUdfVUNPREVfTE9HCisJCQlSRUFEX1ZSRUcoSEVWQ19EQkdfTE9HX0FEUikKKyNlbHNlCisJCQkwCisjZW5kaWYKKwkJKTsKKyNpZmRlZiBERUJVR19VQ09ERV9MT0cKKwlpZiAoKHVkZWJ1Z19mbGFnICYgMHg4KSAmJgorCQkoaHctPnVjb2RlX2xvZ19hZGRyICE9IDApICYmCisJCShSRUFEX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRykgJiAweDEwMCkpIHsKKwkgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJdW5zaWduZWQgc2hvcnQgKmxvZ19hZHIgPQorCQkJKHVuc2lnbmVkIHNob3J0ICopaHctPnVjb2RlX2xvZ19hZGRyOworCQlsb2NrX2J1ZmZlcl9wb29sKGh3LT5wYmktPmNvbW1vbi5idWZmZXJfcG9vbCwgZmxhZ3MpOworCQl3aGlsZSAoKihsb2dfYWRyICsgMykpIHsKKwkJCXByX2luZm8oImRiZyUwNHggJTA0eCAlMDR4ICUwNHhcbiIsCisJCQkJKihsb2dfYWRyICsgMyksICoobG9nX2FkciArIDIpLCAqKGxvZ19hZHIgKyAxKSwgKihsb2dfYWRyICsgMCkKKwkJCQkpOworCQkJbG9nX2FkciArPSA0OworCQl9CisJCXVubG9ja19idWZmZXJfcG9vbChody0+cGJpLT5jb21tb24uYnVmZmVyX3Bvb2wsIGZsYWdzKTsKKwl9CisjZW5kaWYKKwlkZWJ1Z190YWcgPSBSRUFEX0hSRUcoREVCVUdfUkVHMSk7CisJaWYgKGRlYnVnX3RhZyAmIDB4MTAwMDApIHsKKwkJcHJfaW5mbygiTE1FTTx0YWcgJXg+OlxuIiwgUkVBRF9IUkVHKERFQlVHX1JFRzEpKTsKKwkJZm9yIChpID0gMDsgaSA8IDB4NDAwOyBpICs9IDQpIHsKKwkJCWludCBpaTsKKwkJCWlmICgoaSAmIDB4ZikgPT0gMCkKKwkJCQlwcl9pbmZvKCIlMDN4OiAiLCBpKTsKKwkJCWZvciAoaWkgPSAwOyBpaSA8IDQ7IGlpKyspIHsKKwkJCQlwcl9pbmZvKCIlMDR4ICIsCisJCQkJCSAgIGh3LT5sbWVtX3B0cltpICsgMyAtIGlpXSk7CisJCQl9CisJCQlpZiAoKChpICsgaWkpICYgMHhmKSA9PSAwKQorCQkJCXByX2luZm8oIlxuIik7CisJCX0KKwkJaWYgKCgodWRlYnVnX3BhdXNlX3BvcyAmIDB4ZmZmZikKKwkJCT09IChkZWJ1Z190YWcgJiAweGZmZmYpKSAmJgorCQkJKHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4ID09IDAgfHwKKwkJCXVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4ID09IGh3LT5yZXN1bHRfZG9uZV9jb3VudCkgJiYKKwkJCSh1ZGVidWdfcGF1c2VfdmFsID09IDAgfHwKKwkJCXVkZWJ1Z19wYXVzZV92YWwgPT0gUkVBRF9IUkVHKERFQlVHX1JFRzIpKSkgeworCQkJdWRlYnVnX3BhdXNlX3BvcyAmPSAweGZmZmY7CisJCQlody0+dWNvZGVfcGF1c2VfcG9zID0gdWRlYnVnX3BhdXNlX3BvczsKKwkJfQorCQllbHNlIGlmIChkZWJ1Z190YWcgJiAweDIwMDAwKQorCQkJaHctPnVjb2RlX3BhdXNlX3BvcyA9IDB4ZmZmZmZmZmY7CisJCWlmIChody0+dWNvZGVfcGF1c2VfcG9zKQorCQkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwkJZWxzZQorCQkJV1JJVEVfSFJFRyhERUJVR19SRUcxLCAwKTsKKwl9IGVsc2UgaWYgKGRlYnVnX3RhZyAhPSAwKSB7CisJCXByX2luZm8oCisJCQkiZGJnJXg6ICV4IGxjdSAleFxuIiwgUkVBRF9IUkVHKERFQlVHX1JFRzEpLAorCQkJICAgUkVBRF9IUkVHKERFQlVHX1JFRzIpLAorCQkJICAgUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0xDVV9TVEFSVCkpOworCisJCWlmICgoKHVkZWJ1Z19wYXVzZV9wb3MgJiAweGZmZmYpCisJCQk9PSAoZGVidWdfdGFnICYgMHhmZmZmKSkgJiYKKwkJCSh1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeCA9PSAwIHx8CisJCQl1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeCA9PSBody0+cmVzdWx0X2RvbmVfY291bnQpICYmCisJCQkodWRlYnVnX3BhdXNlX3ZhbCA9PSAwIHx8CisJCQl1ZGVidWdfcGF1c2VfdmFsID09IFJFQURfSFJFRyhERUJVR19SRUcyKSkpIHsKKwkJCXVkZWJ1Z19wYXVzZV9wb3MgJj0gMHhmZmZmOworCQkJaHctPnVjb2RlX3BhdXNlX3BvcyA9IHVkZWJ1Z19wYXVzZV9wb3M7CisJCX0KKwkJaWYgKGh3LT51Y29kZV9wYXVzZV9wb3MpCisJCQlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCQllbHNlCisJCQlXUklURV9IUkVHKERFQlVHX1JFRzEsIDApOworCQlody0+cHJvY2Vzc19idXN5ID0gMDsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworICAgIC8vaWYgKFJFQURfVlJFRyhIRVZDX0ZHX1NUQVRVUykgPT0gQU9NX0FWMV9GR1NfUEFSQU0pIHsKKwlpZiAoaHctPmRlY19zdGF0dXMgPT0gQU9NX0FWMV9GR1NfUEFSQU0pIHsKKwkgICAgdWludDMyX3Qgc3RhdHVzX3ZhbCA9IFJFQURfVlJFRyhIRVZDX0ZHX1NUQVRVUyk7CisJICAgIFdSSVRFX1ZSRUcoSEVWQ19GR19TVEFUVVMsIEFPTV9BVjFfRkdTX1BBUkFNX0NPTlQpOworCSAgICBXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIEFPTV9BVjFfRkdTX1BBUkFNX0NPTlQpOworCQkJLy8gQml0WzExXSAtIDAgUmVhZCwgMSAtIFdyaXRlCisJCQkvLyBCaXRbMTA6OF0gLSBmaWxtX2dyYWluX3BhcmFtc19yZWZfaWR4IC8vIEZvciBXcml0ZSByZXF1ZXN0CisJICAgIGlmICgoc3RhdHVzX3ZhbCA+PiAxMSkgJiAweDEpIHsKKwkJICAgIHVpbnQzMl90IGZpbG1fZ3JhaW5fcGFyYW1zX3JlZl9pZHggPSAoc3RhdHVzX3ZhbCA+PiA4KSAmIDB4NzsKKwkJICAgIGNvbmZpZ19maWxtX2dyYWluX3JlZyhodywgZmlsbV9ncmFpbl9wYXJhbXNfcmVmX2lkeCk7CisJCX0KKwkgICAgZWxzZQorCQkgICAgcmVhZF9maWxtX2dyYWluX3JlZyhodyk7CisJCWh3LT5wcm9jZXNzX2J1c3kgPSAwOworCSAgICByZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKCFody0+bV9pbnNfZmxhZykgeworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19CVUZNR1IsCisJCQkiZXJyb3IgZmxhZyA9ICVkXG4iLCBody0+ZXJyb3JfZmxhZyk7CisJCWlmIChody0+ZXJyb3JfZmxhZyA9PSAxKSB7CisJCQlody0+ZXJyb3JfZmxhZyA9IDI7CisJCQlody0+cHJvY2Vzc19idXN5ID0gMDsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfSBlbHNlIGlmIChody0+ZXJyb3JfZmxhZyA9PSAzKSB7CisJCQlody0+cHJvY2Vzc19idXN5ID0gMDsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCQlpZiAoZ2V0X2ZyZWVfYnVmX2NvdW50KGh3KSA8PSAwKSB7CisJCQkvKgorCQkJaWYgKGh3LT53YWl0X2J1ZiA9PSAwKQorCQkJcHJfaW5mbygic2V0IHdhaXRfYnVmIHRvIDFcclxuIik7CisJCQkqLworCQkJaHctPndhaXRfYnVmID0gMTsKKwkJCWh3LT5wcm9jZXNzX2J1c3kgPSAwOworCQkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQlVGTUdSLAorCQkJCSJmcmVlIGJ1ZiBub3QgZW5vdWdoID0gJWRcbiIsCisJCQkJZ2V0X2ZyZWVfYnVmX2NvdW50KGh3KSk7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKwl9CisJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX0VORCk7CisJcmV0dXJuIElSUV9XQUtFX1RIUkVBRDsKK30KKworc3RhdGljIHZvaWQgYXYxX3NldF9jbGsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBBVjFIV19zICpodyA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQlzdHJ1Y3QgQVYxSFdfcywgc2V0X2Nsa193b3JrKTsKKwlpbnQgZnBzID0gOTYwMDAgLyBody0+ZnJhbWVfZHVyOworCisJaWYgKGhldmNfc291cmNlX2NoYW5nZWQoVkZPUk1BVF9BVjEsCisJCWZyYW1lX3dpZHRoLCBmcmFtZV9oZWlnaHQsIGZwcykgPiAwKQorCQlody0+c2F2ZWRfcmVzb2x1dGlvbiA9IGZyYW1lX3dpZHRoICoKKwkJZnJhbWVfaGVpZ2h0ICogZnBzOworfQorCitzdGF0aWMgdm9pZCB2YXYxX3B1dF90aW1lcl9mdW5jKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKK3sKKwlzdHJ1Y3QgQVYxSFdfcyAqaHcgPSBjb250YWluZXJfb2YodGltZXIsCisJCXN0cnVjdCBBVjFIV19zLCB0aW1lcik7CisJdWludDhfdCBlbXB0eV9mbGFnOworCXVuc2lnbmVkIGludCBidWZfbGV2ZWw7CisKKwllbnVtIHJlY2V2aXZlcl9zdGFydF9lIHN0YXRlID0gUkVDRUlWRVJfSU5BQ1RJVkU7CisKKwlpZiAoaHctPm1faW5zX2ZsYWcpIHsKKwkJaWYgKGh3X3RvX3ZkZWMoaHcpLT5uZXh0X3N0YXR1cworCQkJPT0gVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEKSB7CisJCQlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShody0+djRsMl9jdHgpOworCQkJaWYgKCFody0+aXNfdXNlZF92NGwgfHwgY3R4LT5pc19zdHJlYW1fb2ZmKSB7CisJCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0ZPUkNFX0VYSVQ7CisJCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQkJcHJfZGVidWcoInZkZWMgcmVxdWVzdGVkIHRvIGJlIGRpc2Nvbm5lY3RlZFxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQorCWlmIChody0+aW5pdF9mbGFnID09IDApIHsKKwkJaWYgKGh3LT5zdGF0ICYgU1RBVF9USU1FUl9BUk0pIHsKKwkJCXRpbWVyLT5leHBpcmVzID0gamlmZmllcyArIFBVVF9JTlRFUlZBTDsKKwkJCWFkZF90aW1lcigmaHctPnRpbWVyKTsKKwkJfQorCQlyZXR1cm47CisJfQorCWlmIChody0+bV9pbnNfZmxhZyA9PSAwKSB7CisJCWlmICh2Zl9nZXRfcmVjZWl2ZXIoaHctPnByb3ZpZGVyX25hbWUpKSB7CisJCQlzdGF0ZSA9CisJCQkJdmZfbm90aWZ5X3JlY2VpdmVyKGh3LT5wcm92aWRlcl9uYW1lLAorCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfUVVSRVlfU1RBVEUsCisJCQkJCU5VTEwpOworCQkJaWYgKChzdGF0ZSA9PSBSRUNFSVZFUl9TVEFURV9OVUxMKQorCQkJCXx8IChzdGF0ZSA9PSBSRUNFSVZFUl9TVEFURV9OT05FKSkKKwkJCQlzdGF0ZSA9IFJFQ0VJVkVSX0lOQUNUSVZFOworCQl9IGVsc2UKKwkJCXN0YXRlID0gUkVDRUlWRVJfSU5BQ1RJVkU7CisKKwkJZW1wdHlfZmxhZyA9IChSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfSU5UX1NUQVRVUykgPj4gNikgJiAweDE7CisJCS8qIGVycm9yIHdhdGNoZG9nICovCisJCWlmIChlbXB0eV9mbGFnID09IDApIHsKKwkJCS8qIGRlY29kZXIgaGFzIGlucHV0ICovCisJCQlpZiAoKGRlYnVnICYgQVYxX0RFQlVHX0RJU19MT0NfRVJST1JfUFJPQykgPT0gMCkgeworCisJCQkJYnVmX2xldmVsID0gUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0xFVkVMKTsKKwkJCQkvKiByZWNlaXZlciBoYXMgbm8gYnVmZmVyIHRvIHJlY3ljbGUgKi8KKwkJCQlpZiAoKHN0YXRlID09IFJFQ0VJVkVSX0lOQUNUSVZFKSAmJgorCQkJCQkoa2ZpZm9faXNfZW1wdHkoJmh3LT5kaXNwbGF5X3EpICYmCisJCQkJCSBidWZfbGV2ZWwgPiAweDIwMCkKKwkJCQkJKSB7CisJCQkJCQlXUklURV9WUkVHCisJCQkJCQkoSEVWQ19BU1NJU1RfTUJPWDBfSVJRX1JFRywKKwkJCQkJCSAweDEpOworCQkJCX0KKwkJCX0KKworCQl9CisJfQorI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwllbHNlIHsKKwkJaWYgKAorCQkJKGRlY29kZV90aW1lb3V0X3ZhbCA+IDApICYmCisJCQkoaHctPnN0YXJ0X3Byb2Nlc3NfdGltZSA+IDApICYmCisJCQkoKDEwMDAgKiAoamlmZmllcyAtIGh3LT5zdGFydF9wcm9jZXNzX3RpbWUpIC8gSFopCisJCQkJPiBkZWNvZGVfdGltZW91dF92YWwpCisJCSkgeworCQkJaW50IGN1cnJlbnRfbGN1X2lkeCA9CisJCQkJUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0xDVV9TVEFSVCkKKwkJCQkmIDB4ZmZmZmZmOworCQkJaWYgKGh3LT5sYXN0X2xjdV9pZHggPT0gY3VycmVudF9sY3VfaWR4KSB7CisJCQkJaWYgKGh3LT5kZWNvZGVfdGltZW91dF9jb3VudCA+IDApCisJCQkJCWh3LT5kZWNvZGVfdGltZW91dF9jb3VudC0tOworCQkJCWlmIChody0+ZGVjb2RlX3RpbWVvdXRfY291bnQgPT0gMCkgeworCQkJCQlpZiAoaW5wdXRfZnJhbWVfYmFzZWQoCisJCQkJCQlod190b192ZGVjKGh3KSkgfHwKKwkJCQkJKFJFQURfVlJFRyhIRVZDX1NUUkVBTV9MRVZFTCkgPiAweDIwMCkpCisJCQkJCQl0aW1lb3V0X3Byb2Nlc3MoaHcpOworCQkJCQllbHNlIHsKKwkJCQkJCWF2MV9wcmludChodywgMCwKKwkJCQkJCQkidGltZW91dCAmIGVtcHR5LCBhZ2FpblxuIik7CisJCQkJCQlkZWNfYWdhaW5fcHJvY2Vzcyhodyk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXN0YXJ0X3Byb2Nlc3NfdGltZShodyk7CisJCQkJaHctPmxhc3RfbGN1X2lkeCA9IGN1cnJlbnRfbGN1X2lkeDsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCisJaWYgKChody0+dWNvZGVfcGF1c2VfcG9zICE9IDApICYmCisJCShody0+dWNvZGVfcGF1c2VfcG9zICE9IDB4ZmZmZmZmZmYpICYmCisJCXVkZWJ1Z19wYXVzZV9wb3MgIT0gaHctPnVjb2RlX3BhdXNlX3BvcykgeworCQlody0+dWNvZGVfcGF1c2VfcG9zID0gMDsKKwkJV1JJVEVfSFJFRyhERUJVR19SRUcxLCAwKTsKKwl9CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCWlmIChkZWJ1ZyAmIEFWMV9ERUJVR19EVU1QX0RBVEEpIHsKKwkJZGVidWcgJj0gfkFWMV9ERUJVR19EVU1QX0RBVEE7CisJCWF2MV9wcmludChodywgMCwKKwkJCSIlczogY2h1bmsgc2l6ZSAweCV4IG9mZiAweCV4IHN1bSAweCV4XG4iLAorCQkJX19mdW5jX18sCisJCQlody0+Y2h1bmstPnNpemUsCisJCQlody0+Y2h1bmstPm9mZnNldCwKKwkJCWdldF9kYXRhX2NoZWNrX3N1bShodywgaHctPmNodW5rLT5zaXplKQorCQkJKTsKKwkJZHVtcF9kYXRhKGh3LCBody0+Y2h1bmstPnNpemUpOworCX0KKyNlbmRpZgorCWlmIChkZWJ1ZyAmIEFWMV9ERUJVR19EVU1QX1BJQ19MSVNUKSB7CisJCS8qZHVtcF9waWNfbGlzdChodyk7Ki8KKwkJYXYxX2R1bXBfc3RhdGUoaHdfdG9fdmRlYyhodykpOworCQlkZWJ1ZyAmPSB+QVYxX0RFQlVHX0RVTVBfUElDX0xJU1Q7CisJfQorCWlmIChkZWJ1ZyAmIEFWMV9ERUJVR19UUklHX1NMSUNFX1NFR01FTlRfUFJPQykgeworCQlXUklURV9WUkVHKEhFVkNfQVNTSVNUX01CT1gwX0lSUV9SRUcsIDB4MSk7CisJCWRlYnVnICY9IH5BVjFfREVCVUdfVFJJR19TTElDRV9TRUdNRU5UX1BST0M7CisJfQorCS8qaWYgKGRlYnVnICYgQVYxX0RFQlVHX0hXX1JFU0VUKSB7CisJfSovCisKKwlpZiAocmFkciAhPSAwKSB7CisJCWlmICgocmFkciA+PiAyNCkgIT0gMCkgeworCQkJaW50IGNvdW50ID0gcmFkciA+PiAyNDsKKwkJCWludCBhZHIgPSByYWRyICYgMHhmZmZmZmY7CisJCQlpbnQgaTsKKwkJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQkJCXByX2luZm8oIlJFQURfVlJFRygleCk9JXhcbiIsIGFkcitpLCBSRUFEX1ZSRUcoYWRyK2kpKTsKKwkJfSBlbHNlIGlmIChydmFsICE9IDApIHsKKwkJCVdSSVRFX1ZSRUcocmFkciwgcnZhbCk7CisJCQlwcl9pbmZvKCJXUklURV9WUkVHKCV4LCV4KVxuIiwgcmFkciwgcnZhbCk7CisJCX0gZWxzZQorCQkJcHJfaW5mbygiUkVBRF9WUkVHKCV4KT0leFxuIiwgcmFkciwgUkVBRF9WUkVHKHJhZHIpKTsKKwkJcnZhbCA9IDA7CisJCXJhZHIgPSAwOworCX0KKwlpZiAocG9wX3Nob3J0cyAhPSAwKSB7CisJCWludCBpOworCQl1MzIgc3VtID0gMDsKKworCQlwcl9pbmZvKCJwb3Agc3RyZWFtIDB4JXggc2hvcnRzXHJcbiIsIHBvcF9zaG9ydHMpOworCQlmb3IgKGkgPSAwOyBpIDwgcG9wX3Nob3J0czsgaSsrKSB7CisJCQl1MzIgZGF0YSA9CisJCQkoUkVBRF9IUkVHKEhFVkNfU0hJRlRFRF9EQVRBKSA+PiAxNik7CisJCQlXUklURV9IUkVHKEhFVkNfU0hJRlRfQ09NTUFORCwKKwkJCSgxPDw3KXwxNik7CisJCQlpZiAoKGkgJiAweGYpID09IDApCisJCQkJcHJfaW5mbygiJTA0eDoiLCBpKTsKKwkJCXByX2luZm8oIiUwNHggIiwgZGF0YSk7CisJCQlpZiAoKChpICsgMSkgJiAweGYpID09IDApCisJCQkJcHJfaW5mbygiXHJcbiIpOworCQkJc3VtICs9IGRhdGE7CisJCX0KKwkJcHJfaW5mbygiXHJcbnN1bSA9ICV4XHJcbiIsIHN1bSk7CisJCXBvcF9zaG9ydHMgPSAwOworCX0KKwlpZiAoZGJnX2NtZCAhPSAwKSB7CisJCWlmIChkYmdfY21kID09IDEpIHsKKwkJCXUzMiBkaXNwX2xhZGRyOworCisJCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWEJCICYmCisJCQkJZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSA9PSAwKSB7CisJCQkJZGlzcF9sYWRkciA9CisJCQkJCVJFQURfVkNCVVNfUkVHKEFGQkNfQk9EWV9CQUREUikgPDwgNDsKKwkJCX0gZWxzZSB7CisJCQkJc3RydWN0IGNhbnZhc19zIGN1cl9jYW52YXM7CisKKwkJCQljYW52YXNfcmVhZCgoUkVBRF9WQ0JVU19SRUcoVkQxX0lGMF9DQU5WQVMwKQorCQkJCQkmIDB4ZmYpLCAmY3VyX2NhbnZhcyk7CisJCQkJZGlzcF9sYWRkciA9IGN1cl9jYW52YXMuYWRkcjsKKwkJCX0KKwkJCXByX2luZm8oImN1cnJlbnQgZGlzcGxheWVkIGJ1ZmZlciBhZGRyZXNzICV4XHJcbiIsCisJCQkJZGlzcF9sYWRkcik7CisJCX0KKwkJZGJnX2NtZCA9IDA7CisJfQorCS8qZG9uJ3QgY2hhbmdlZCBhdCBzdGFydC4qLworCWlmIChody0+Z2V0X2ZyYW1lX2R1ciAmJiBody0+c2hvd19mcmFtZV9udW0gPiA2MCAmJgorCQlody0+ZnJhbWVfZHVyID4gMCAmJiBody0+c2F2ZWRfcmVzb2x1dGlvbiAhPQorCQlmcmFtZV93aWR0aCAqIGZyYW1lX2hlaWdodCAqCisJCQkoOTYwMDAgLyBody0+ZnJhbWVfZHVyKSkKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+c2V0X2Nsa193b3JrKTsKKworCXRpbWVyLT5leHBpcmVzID0gamlmZmllcyArIFBVVF9JTlRFUlZBTDsKKwlhZGRfdGltZXIodGltZXIpOworfQorCisKK2ludCB2YXYxX2RlY19zdGF0dXMoc3RydWN0IHZkZWNfcyAqdmRlYywgc3RydWN0IHZkZWNfaW5mbyAqdnN0YXR1cykKK3sKKwlzdHJ1Y3QgQVYxSFdfcyAqYXYxID0KKwkJKHN0cnVjdCBBVjFIV19zICopdmRlYy0+cHJpdmF0ZTsKKworCWlmICghYXYxKQorCQlyZXR1cm4gLTE7CisKKwl2c3RhdHVzLT5mcmFtZV93aWR0aCA9IGZyYW1lX3dpZHRoOworCXZzdGF0dXMtPmZyYW1lX2hlaWdodCA9IGZyYW1lX2hlaWdodDsKKwlpZiAoYXYxLT5mcmFtZV9kdXIgIT0gMCkKKwkJdnN0YXR1cy0+ZnJhbWVfcmF0ZSA9IDk2MDAwIC8gYXYxLT5mcmFtZV9kdXI7CisJZWxzZQorCQl2c3RhdHVzLT5mcmFtZV9yYXRlID0gLTE7CisJdnN0YXR1cy0+ZXJyb3JfY291bnQgPSAwOworCXZzdGF0dXMtPnN0YXR1cyA9IGF2MS0+c3RhdCB8IGF2MS0+ZmF0YWxfZXJyb3I7CisJdnN0YXR1cy0+ZnJhbWVfZHVyID0gYXYxLT5mcmFtZV9kdXI7CisvLyNpZm5kZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfTVVMVElfREVDCisJdnN0YXR1cy0+Yml0X3JhdGUgPSBhdjEtPmd2cy0+Yml0X3JhdGU7CisJdnN0YXR1cy0+ZnJhbWVfZGF0YSA9IGF2MS0+Z3ZzLT5mcmFtZV9kYXRhOworCXZzdGF0dXMtPnRvdGFsX2RhdGEgPSBhdjEtPmd2cy0+dG90YWxfZGF0YTsKKwl2c3RhdHVzLT5mcmFtZV9jb3VudCA9IGF2MS0+Z3ZzLT5mcmFtZV9jb3VudDsKKwl2c3RhdHVzLT5lcnJvcl9mcmFtZV9jb3VudCA9IGF2MS0+Z3ZzLT5lcnJvcl9mcmFtZV9jb3VudDsKKwl2c3RhdHVzLT5kcm9wX2ZyYW1lX2NvdW50ID0gYXYxLT5ndnMtPmRyb3BfZnJhbWVfY291bnQ7CisJdnN0YXR1cy0+c2FtcF9jbnQgPSBhdjEtPmd2cy0+c2FtcF9jbnQ7CisJdnN0YXR1cy0+b2Zmc2V0ID0gYXYxLT5ndnMtPm9mZnNldDsKKwlzbnByaW50Zih2c3RhdHVzLT52ZGVjX25hbWUsIHNpemVvZih2c3RhdHVzLT52ZGVjX25hbWUpLAorCQkiJXMiLCBEUklWRVJfTkFNRSk7CisvLyNlbmRpZgorCXJldHVybiAwOworfQorCitpbnQgdmF2MV9zZXRfaXNyZXNldChzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgaXNyZXNldCkKK3sKKwlpc19yZXNldCA9IGlzcmVzZXQ7CisJcmV0dXJuIDA7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCBBVjFfREVDT0RFX0lOSVQodm9pZCkKK3sKKwkvKiBlbmFibGUgYXYxIGNsb2NrcyAqLworCVdSSVRFX1ZSRUcoRE9TX0dDTEtfRU4zLCAweGZmZmZmZmZmKTsKKwkvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwkvKiBQb3dlciBPTiBIRVZDICovCisJLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisJLyogUG93ZXJ1cCBIRVZDICovCisJV1JJVEVfVlJFRyhBT19SVElfR0VOX1BXUl9TTEVFUDAsCisJCQlSRUFEX1ZSRUcoQU9fUlRJX0dFTl9QV1JfU0xFRVAwKSAmICh+KDB4MyA8PCA2KSkpOworCVdSSVRFX1ZSRUcoRE9TX01FTV9QRF9IRVZDLCAweDApOworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMywgUkVBRF9WUkVHKERPU19TV19SRVNFVDMpIHwgKDB4M2ZmZmYgPDwgMikpOworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMywgUkVBRF9WUkVHKERPU19TV19SRVNFVDMpICYgKH4oMHgzZmZmZiA8PCAyKSkpOworCS8qIHJlbW92ZSBpc29sYXRpb25zICovCisJV1JJVEVfVlJFRyhBT19SVElfR0VOX1BXUl9JU08wLAorCQkJUkVBRF9WUkVHKEFPX1JUSV9HRU5fUFdSX0lTTzApICYgKH4oMHgzIDw8IDEwKSkpOworCit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgdmF2MV9wcm90X2luaXQoc3RydWN0IEFWMUhXX3MgKmh3LCB1MzIgbWFzaykKK3sKKwl1bnNpZ25lZCBpbnQgZGF0YTMyOworCS8qIEFWMV9ERUNPREVfSU5JVCgpOyAqLworCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsICIlcyAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCWFvbV9jb25maWdfd29ya19zcGFjZV9odyhodywgbWFzayk7CisJaWYgKG1hc2sgJiBIV19NQVNLX0JBQ0spIHsKKwkJLy90byBkbzogLi4gZm9yIHNpbmdsZSBpbnN0YW5jZSwgY2FsbGVkIGFmdGVyIGluaXRfcGljX2xpc3QoKQorCQlpZiAoaHctPm1faW5zX2ZsYWcpCisJCQlpbml0X3BpY19saXN0X2h3KGh3KTsKKwl9CisKKwlhb21faW5pdF9kZWNvZGVyX2h3KGh3LCBtYXNrKTsKKworI2lmZGVmIEFPTV9BVjFfREJMS19JTklUCisJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkiW3Rlc3QuY10gYXYxX2xvb3BfZmlsdGVyX2luaXQgKHJ1biBvbmNlIGJlZm9yZSBkZWNvZGluZyBzdGFydClcbiIpOworICAgIGF2MV9sb29wX2ZpbHRlcl9pbml0KGh3LT5sZmksIGh3LT5sZik7CisjZW5kaWYKKwlpZiAoKG1hc2sgJiBIV19NQVNLX0ZST05UKSA9PSAwKQorCQlyZXR1cm47CisjaWYgMQorCWlmIChkZWJ1ZyAmIEFWMV9ERUJVR19CVUZNR1JfTU9SRSkKKwkJcHJfaW5mbygiJXNcbiIsIF9fZnVuY19fKTsKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fQ09OVFJPTCk7CisJZGF0YTMyID0gZGF0YTMyIHwKKwkJKDEgPDwgMCkvKnN0cmVhbV9mZXRjaF9lbmFibGUqLworCQk7CisJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9DT05UUk9MLCBkYXRhMzIpOworCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQSkgeworCSAgICBpZiAoZGVidWcgJiBBVjFfREVCVUdfQlVGTUdSKQorCQkgICAgcHJfaW5mbygiW3Rlc3QuY10gQ29uZmlnIFNUUkVBTV9GSUZPX0NUTFxuIik7CisJICAgIGRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NUUkVBTV9GSUZPX0NUTCk7CisJICAgIGRhdGEzMiA9IGRhdGEzMiB8CisJCQkJICgxIDw8IDI5KSAvLyBzdHJlYW1fZmlmb19ob2xlCisJCQkJIDsKKwkgICAgV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9GSUZPX0NUTCwgZGF0YTMyKTsKKwl9CisjaWYgMAorCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NISUZUX1NUQVJUQ09ERSk7CisJaWYgKGRhdGEzMiAhPSAweDAwMDAwMTAwKSB7CisJCXByX2luZm8oImF2MSBwcm90IGluaXQgZXJyb3IgJWRcbiIsIF9fTElORV9fKTsKKwkJcmV0dXJuOworCX0KKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9FTVVMQVRFQ09ERSk7CisJaWYgKGRhdGEzMiAhPSAweDAwMDAwMzAwKSB7CisJCXByX2luZm8oImF2MSBwcm90IGluaXQgZXJyb3IgJWRcbiIsIF9fTElORV9fKTsKKwkJcmV0dXJuOworCX0KKwlXUklURV9WUkVHKEhFVkNfU0hJRlRfU1RBUlRDT0RFLCAweDEyMzQ1Njc4KTsKKwlXUklURV9WUkVHKEhFVkNfU0hJRlRfRU1VTEFURUNPREUsIDB4OWFiY2RlZjApOworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NISUZUX1NUQVJUQ09ERSk7CisJaWYgKGRhdGEzMiAhPSAweDEyMzQ1Njc4KSB7CisJCXByX2luZm8oImF2MSBwcm90IGluaXQgZXJyb3IgJWRcbiIsIF9fTElORV9fKTsKKwkJcmV0dXJuOworCX0KKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9FTVVMQVRFQ09ERSk7CisJaWYgKGRhdGEzMiAhPSAweDlhYmNkZWYwKSB7CisJCXByX2luZm8oImF2MSBwcm90IGluaXQgZXJyb3IgJWRcbiIsIF9fTElORV9fKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9TVEFSVENPREUsIDB4MDAwMDAwMDAxKTsKKwlXUklURV9WUkVHKEhFVkNfU0hJRlRfRU1VTEFURUNPREUsIDB4MDAwMDAzMDApOworI2VuZGlmCisKKworCisJV1JJVEVfVlJFRyhIRVZDX1dBSVRfRkxBRywgMSk7CisKKwkvKiBXUklURV9WUkVHKEhFVkNfTVBTUiwgMSk7ICovCisKKwkvKiBjbGVhciBtYWlsYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTUJPWDBfQ0xSX1JFRywgMSk7CisKKwkvKiBlbmFibGUgbWFpbGJveCBpbnRlcnJ1cHQgKi8KKwlXUklURV9WUkVHKEhFVkNfQVNTSVNUX01CT1gwX01BU0ssIDEpOworCisJLyogZGlzYWJsZSBQU0NBTEUgZm9yIGhhcmR3YXJlIHNoYXJpbmcgKi8KKwlXUklURV9WUkVHKEhFVkNfUFNDQUxFX0NUUkwsIDApOworCisJV1JJVEVfVlJFRyhERUJVR19SRUcxLCAweDApOworCS8qY2hlY2sgdnBzL3Nwcy9wcHMvaS1zbGljZSBpbiB1Y29kZSovCisJV1JJVEVfVlJFRyhOQUxfU0VBUkNIX0NUTCwgMHg4KTsKKworCVdSSVRFX1ZSRUcoREVDT0RFX1NUT1BfUE9TLCB1ZGVidWdfZmxhZyk7CisjaWYgKGRlZmluZWQgREVCVUdfVUNPREVfTE9HKSB8fCAoZGVmaW5lZCBERUJVR19DTUQpCisJV1JJVEVfVlJFRyhIRVZDX0RCR19MT0dfQURSLCBody0+dWNvZGVfbG9nX3BoeV9hZGRyKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IHZhdjFfbG9jYWxfaW5pdChzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJaW50IGk7CisJaW50IHJldDsKKwlpbnQgd2lkdGgsIGhlaWdodDsKKworCWh3LT5ndnMgPSB2emFsbG9jKHNpemVvZihzdHJ1Y3QgdmRlY19pbmZvKSk7CisJaWYgKE5VTEwgPT0gaHctPmd2cykgeworCQlwcl9pbmZvKCJ0aGUgc3RydWN0IG9mIHZkZWMgc3RhdHVzIG1hbGxvYyBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKyNpZmRlZiBERUJVR19QVFMKKwlody0+cHRzX21pc3NlZCA9IDA7CisJaHctPnB0c19oaXQgPSAwOworI2VuZGlmCisJaHctPm5ld19mcmFtZV9kaXNwbGF5ZWQgPSAwOworCWh3LT5sYXN0X3B1dF9pZHggPSAtMTsKKwlody0+c2F2ZWRfcmVzb2x1dGlvbiA9IDA7CisJaHctPmdldF9mcmFtZV9kdXIgPSBmYWxzZTsKKwlvbl9ub19rZXlmcmFtZV9za2lwZWQgPSAwOworCXdpZHRoID0gaHctPnZhdjFfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGg7CisJaGVpZ2h0ID0gaHctPnZhdjFfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0OworCWh3LT5mcmFtZV9kdXIgPQorCQkoaHctPnZhdjFfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSA9PQorCQkgMCkgPyAzMjAwIDogaHctPnZhdjFfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZTsKKwlpZiAod2lkdGggJiYgaGVpZ2h0KQorCQlody0+ZnJhbWVfYXIgPSBoZWlnaHQgKiAweDEwMCAvIHdpZHRoOworLyoKKyAqVE9ETzpGT1IgVkVSU0lPTgorICovCisJcHJfaW5mbygiYXYxOiB2ZXIgKCVkLCVkKSBkZWNpbmZvOiAlZHglZCByYXRlPSVkXG4iLCBhdjFfdmVyc2lvbiwKKwkJICAgMCwgd2lkdGgsIGhlaWdodCwgaHctPmZyYW1lX2R1cik7CisKKwlpZiAoaHctPmZyYW1lX2R1ciA9PSAwKQorCQlody0+ZnJhbWVfZHVyID0gOTYwMDAgLyAyNDsKKworCUlOSVRfS0ZJRk8oaHctPmRpc3BsYXlfcSk7CisJSU5JVF9LRklGTyhody0+bmV3ZnJhbWVfcSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRlJBTUVfQlVGRkVSUzsgaSsrKSB7CisJCWh3LT5idWZmZXJfd3JhcFtpXSA9IGk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFZGX1BPT0xfU0laRTsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqdmYgPSAmaHctPnZmcG9vbFtpXTsKKworCQlody0+dmZwb29sW2ldLmluZGV4ID0gLTE7CisJCWtmaWZvX3B1dCgmaHctPm5ld2ZyYW1lX3EsIHZmKTsKKwl9CisKKwlyZXQgPSBhdjFfbG9jYWxfaW5pdChodyk7CisKKwlpZiAoZm9yY2VfcHRzX3Vuc3RhYmxlKSB7CisJCWlmICghaHctPnB0c191bnN0YWJsZSkgeworCQkJaHctPnB0c191bnN0YWJsZSA9CisJCQkoaHctPnZhdjFfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSA9PSAwKT8xOjA7CisJCQlwcl9pbmZvKCJzZXQgcHRzIHVuc3RhYmxlXG4iKTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKK3N0YXRpYyBzMzIgdmF2MV9pbml0KHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IEFWMUhXX3MgKmh3ID0gKHN0cnVjdCBBVjFIV19zICopdmRlYy0+cHJpdmF0ZTsKKyNlbHNlCitzdGF0aWMgczMyIHZhdjFfaW5pdChzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisjZW5kaWYKKwlpbnQgcmV0OworCWludCBmd19zaXplID0gMHgxMDAwICogMTY7CisJc3RydWN0IGZpcm13YXJlX3MgKmZ3ID0gTlVMTDsKKworCWh3LT5zdGF0IHw9IFNUQVRfVElNRVJfSU5JVDsKKworCWlmICh2YXYxX2xvY2FsX2luaXQoaHcpIDwgMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWZ3ID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IGZpcm13YXJlX3MpICsgZndfc2l6ZSk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGZ3KSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLCAiJXMgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisjaWZkZWYgREVCVUdfVVNFX1ZQOV9ERVZJQ0VfTkFNRQorCWlmIChnZXRfZmlybXdhcmVfZGF0YShWSURFT19ERUNfVlA5X01NVSwgZnctPmRhdGEpIDwgMCkgeworI2Vsc2UKKwlpZiAoZ2V0X2Zpcm13YXJlX2RhdGEoVklERU9fREVDX0FWMV9NTVUsIGZ3LT5kYXRhKSA8IDApIHsKKyNlbmRpZgorCQlwcl9lcnIoImdldCBmaXJtd2FyZSBmYWlsLlxuIik7CisJCXByaW50aygiJXMgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXZmcmVlKGZ3KTsKKwkJcmV0dXJuIC0xOworCX0KKwlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLCAiJXMgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJZnctPmxlbiA9IGZ3X3NpemU7CisKKwlJTklUX1dPUksoJmh3LT5zZXRfY2xrX3dvcmssIGF2MV9zZXRfY2xrKTsKKwl0aW1lcl9zZXR1cCgmaHctPnRpbWVyLCB2YXYxX3B1dF90aW1lcl9mdW5jLCAwKTsKKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlpZiAoaHctPm1faW5zX2ZsYWcpIHsKKwkJaHctPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgUFVUX0lOVEVSVkFMOworCisJCS8qYWRkX3RpbWVyKCZody0+dGltZXIpOworCisJCWh3LT5zdGF0IHw9IFNUQVRfVElNRVJfQVJNOworCQlody0+c3RhdCB8PSBTVEFUX0lTUl9SRUc7Ki8KKworCQlJTklUX1dPUksoJmh3LT53b3JrLCBhdjFfd29yayk7CisJCWh3LT5mdyA9IGZ3OworCisJCXJldHVybiAwOwkvKm11bHRpIGluc3RhbmNlIHJldHVybiAqLworCX0KKyNlbmRpZgorCWFtaGV2Y19lbmFibGUoKTsKKworCXJldCA9IGFtaGV2Y19sb2FkbWNfZXgoVkZPUk1BVF9BVjEsIE5VTEwsIGZ3LT5kYXRhKTsKKwlpZiAocmV0IDwgMCkgeworCQlhbWhldmNfZGlzYWJsZSgpOworCQl2ZnJlZShmdyk7CisJCXByX2VycigiQVYxOiB0aGUgJXMgZncgbG9hZGluZyBmYWlsZWQsIGVycjogJXhcbiIsCisJCQl0ZWVfZW5hYmxlZCgpID8gIlRFRSIgOiAibG9jYWwiLCByZXQpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXZmcmVlKGZ3KTsKKworCWh3LT5zdGF0IHw9IFNUQVRfTUNfTE9BRDsKKworCS8qIGVuYWJsZSBBTVJJU0Mgc2lkZSBwcm90b2NvbCAqLworCXZhdjFfcHJvdF9pbml0KGh3LCBIV19NQVNLX0ZST05UIHwgSFdfTUFTS19CQUNLKTsKKworCWlmICh2ZGVjX3JlcXVlc3RfdGhyZWFkZWRfaXJxKFZERUNfSVJRXzAsCisJCQkJdmF2MV9pc3IsCisJCQkJdmF2MV9pc3JfdGhyZWFkX2ZuLAorCQkJCUlSUUZfT05FU0hPVCwvKnJ1biB0aHJlYWQgb24gdGhpcyBpcnEgZGlzYWJsZWQqLworCQkJCSJ2YXYxLWlycSIsICh2b2lkICopaHcpKSB7CisJCXByX2luZm8oInZhdjEgaXJxIHJlZ2lzdGVyIGVycm9yLlxuIik7CisJCWFtaGV2Y19kaXNhYmxlKCk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWh3LT5zdGF0IHw9IFNUQVRfSVNSX1JFRzsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCWlmIChmb3JjZV9kdl9lbmFibGUpCisJCWh3LT5wcm92aWRlcl9uYW1lID0gRFZfUFJPVklERVJfTkFNRTsKKwllbHNlCisjZW5kaWYKKwkJaHctPnByb3ZpZGVyX25hbWUgPSBQUk9WSURFUl9OQU1FOworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlpZiAoIWh3LT5pc191c2VkX3Y0bCkgeworCQl2Zl9wcm92aWRlcl9pbml0KCZ2YXYxX3ZmX3Byb3YsIGh3LT5wcm92aWRlcl9uYW1lLAorCQkJCQkmdmF2MV92Zl9wcm92aWRlciwgaHcpOworCQl2Zl9yZWdfcHJvdmlkZXIoJnZhdjFfdmZfcHJvdik7CisJCXZmX25vdGlmeV9yZWNlaXZlcihody0+cHJvdmlkZXJfbmFtZSwgVkZSQU1FX0VWRU5UX1BST1ZJREVSX1NUQVJULCBOVUxMKTsKKwkJaWYgKGh3LT5mcmFtZV9kdXIgIT0gMCkgeworCQkJaWYgKCFpc19yZXNldCkKKwkJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoaHctPnByb3ZpZGVyX25hbWUsCisJCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfRlJfSElOVCwKKwkJCQkJCSh2b2lkICopCisJCQkJCQkoKHVuc2lnbmVkIGxvbmcpaHctPmZyYW1lX2R1cikpOworCQl9CisJfQorI2Vsc2UKKwl2Zl9wcm92aWRlcl9pbml0KCZ2YXYxX3ZmX3Byb3YsIGh3LT5wcm92aWRlcl9uYW1lLCAmdmF2MV92Zl9wcm92aWRlciwKKwkJCQkJIGh3KTsKKwl2Zl9yZWdfcHJvdmlkZXIoJnZhdjFfdmZfcHJvdik7CisJdmZfbm90aWZ5X3JlY2VpdmVyKGh3LT5wcm92aWRlcl9uYW1lLCBWRlJBTUVfRVZFTlRfUFJPVklERVJfU1RBUlQsIE5VTEwpOworCWlmICghaXNfcmVzZXQpCisJCXZmX25vdGlmeV9yZWNlaXZlcihody0+cHJvdmlkZXJfbmFtZSwgVkZSQU1FX0VWRU5UX1BST1ZJREVSX0ZSX0hJTlQsCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKWh3LT5mcmFtZV9kdXIpKTsKKyNlbmRpZgorCWh3LT5zdGF0IHw9IFNUQVRfVkZfSE9PSzsKKworCWh3LT50aW1lci5leHBpcmVzID0gamlmZmllcyArIFBVVF9JTlRFUlZBTDsKKwlhZGRfdGltZXIoJmh3LT50aW1lcik7CisKKwlody0+c3RhdCB8PSBTVEFUX1ZERUNfUlVOOworCWh3LT5zdGF0IHw9IFNUQVRfVElNRVJfQVJNOworCisJYW1oZXZjX3N0YXJ0KCk7CisKKwlody0+aW5pdF9mbGFnID0gMTsKKwlody0+cHJvY2Vzc19idXN5ID0gMDsKKwlwcl9pbmZvKCIlZCwgdmF2MV9pbml0LCBSUD0weCV4XG4iLAorCQlfX0xJTkVfXywgUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1JEX1BUUikpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZtYXYxX3N0b3Aoc3RydWN0IEFWMUhXX3MgKmh3KQoreworCWh3LT5pbml0X2ZsYWcgPSAwOworCisJaWYgKGh3LT5zdGF0ICYgU1RBVF9WREVDX1JVTikgeworCQlhbWhldmNfc3RvcCgpOworCQlody0+c3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwl9CisJaWYgKGh3LT5zdGF0ICYgU1RBVF9JU1JfUkVHKSB7CisJCXZkZWNfZnJlZV9pcnEoVkRFQ19JUlFfMCwgKHZvaWQgKilodyk7CisJCWh3LT5zdGF0ICY9IH5TVEFUX0lTUl9SRUc7CisJfQorCWlmIChody0+c3RhdCAmIFNUQVRfVElNRVJfQVJNKSB7CisJCWRlbF90aW1lcl9zeW5jKCZody0+dGltZXIpOworCQlody0+c3RhdCAmPSB+U1RBVF9USU1FUl9BUk07CisJfQorCisJaWYgKCFody0+aXNfdXNlZF92NGwgJiYgKGh3LT5zdGF0ICYgU1RBVF9WRl9IT09LKSkgeworCQlpZiAoIWlzX3Jlc2V0KQorCQkJdmZfbm90aWZ5X3JlY2VpdmVyKGh3LT5wcm92aWRlcl9uYW1lLAorCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfRlJfRU5EX0hJTlQsCisJCQkJCU5VTEwpOworCisJCXZmX3VucmVnX3Byb3ZpZGVyKCZ2YXYxX3ZmX3Byb3YpOworCQlody0+c3RhdCAmPSB+U1RBVF9WRl9IT09LOworCX0KKwlhdjFfbG9jYWxfdW5pbml0KGh3KTsKKwlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCWNhbmNlbF93b3JrX3N5bmMoJmh3LT53b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZody0+c2V0X2Nsa193b3JrKTsKKwl1bmluaXRfbW11X2J1ZmZlcnMoaHcpOworCWlmIChody0+ZncpCisJCXZmcmVlKGh3LT5mdyk7CisJaHctPmZ3ID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2YXYxX3N0b3Aoc3RydWN0IEFWMUhXX3MgKmh3KQoreworCisJaHctPmluaXRfZmxhZyA9IDA7CisJaHctPmZpcnN0X3NjX2NoZWNrZWQgPSAwOworCWlmIChody0+c3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJYW1oZXZjX3N0b3AoKTsKKwkJaHctPnN0YXQgJj0gflNUQVRfVkRFQ19SVU47CisJfQorCisJaWYgKGh3LT5zdGF0ICYgU1RBVF9JU1JfUkVHKSB7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQlpZiAoIWh3LT5tX2luc19mbGFnKQorI2VuZGlmCisJCQlXUklURV9WUkVHKEhFVkNfQVNTSVNUX01CT1gwX01BU0ssIDApOworCQl2ZGVjX2ZyZWVfaXJxKFZERUNfSVJRXzAsICh2b2lkICopaHcpOworCQlody0+c3RhdCAmPSB+U1RBVF9JU1JfUkVHOworCX0KKworCWlmIChody0+c3RhdCAmIFNUQVRfVElNRVJfQVJNKSB7CisJCWRlbF90aW1lcl9zeW5jKCZody0+dGltZXIpOworCQlody0+c3RhdCAmPSB+U1RBVF9USU1FUl9BUk07CisJfQorCisJaWYgKCFody0+aXNfdXNlZF92NGwgJiYgKGh3LT5zdGF0ICYgU1RBVF9WRl9IT09LKSkgeworCQlpZiAoIWlzX3Jlc2V0KQorCQkJdmZfbm90aWZ5X3JlY2VpdmVyKGh3LT5wcm92aWRlcl9uYW1lLAorCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfRlJfRU5EX0hJTlQsCisJCQkJCU5VTEwpOworCisJCXZmX3VucmVnX3Byb3ZpZGVyKCZ2YXYxX3ZmX3Byb3YpOworCQlody0+c3RhdCAmPSB+U1RBVF9WRl9IT09LOworCX0KKwlhdjFfbG9jYWxfdW5pbml0KGh3KTsKKworCWNhbmNlbF93b3JrX3N5bmMoJmh3LT5zZXRfY2xrX3dvcmspOworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlpZiAoaHctPm1faW5zX2ZsYWcpIHsKKwkJY2FuY2VsX3dvcmtfc3luYygmaHctPndvcmspOworCX0gZWxzZQorCQlhbWhldmNfZGlzYWJsZSgpOworI2Vsc2UKKwlhbWhldmNfZGlzYWJsZSgpOworI2VuZGlmCisJdW5pbml0X21tdV9idWZmZXJzKGh3KTsKKworCXZmcmVlKGh3LT5mdyk7CisJaHctPmZ3ID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgYW12ZGVjX2F2MV9tbXVfaW5pdChzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJaW50IHR2cF9mbGFnID0gdmRlY19zZWN1cmUoaHdfdG9fdmRlYyhodykpID8KKwkJQ09ERUNfTU1fRkxBR1NfVFZQIDogMDsKKwlpbnQgYnVmX3NpemUgPSA0ODsKKworCWlmICgoaHctPm1heF9waWNfdyAqIGh3LT5tYXhfcGljX2ggPiAxMjgwKjczNikgJiYKKwkJKGh3LT5tYXhfcGljX3cgKiBody0+bWF4X3BpY19oIDw9IDE5MjAqMTA4OCkpIHsKKwkJYnVmX3NpemUgPSAxMjsKKwl9IGVsc2UgaWYgKChody0+bWF4X3BpY193ICogaHctPm1heF9waWNfaCA+IDApICYmCisJCShody0+bWF4X3BpY193ICogaHctPm1heF9waWNfaCA8PSAxMjgwKjczNikpIHsKKwkJYnVmX3NpemUgPSA0OworCX0KKwlody0+bmVlZF9jYWNoZV9zaXplID0gYnVmX3NpemUgKiBTWl8xTTsKKwlody0+c2Nfc3RhcnRfdGltZSA9IGdldF9qaWZmaWVzXzY0KCk7CisJaWYgKGh3LT5tbXVfZW5hYmxlICYmICFody0+aXNfdXNlZF92NGwpIHsKKwkJaW50IGNvdW50ID0gRlJBTUVfQlVGRkVSUzsKKwkJaHctPm1tdV9ib3ggPSBkZWNvZGVyX21tdV9ib3hfYWxsb2NfYm94KERSSVZFUl9OQU1FLAorCQkJaHctPmluZGV4IC8qICogMiovLCBjb3VudCwKKwkJCWh3LT5uZWVkX2NhY2hlX3NpemUsCisJCQl0dnBfZmxhZworCQkJKTsKKwkJaWYgKCFody0+bW11X2JveCkgeworCQkJcHJfZXJyKCJhdjEgYWxsb2MgbW11IGJveCBmYWlsZWQhIVxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKyNpZmRlZiBBT01fQVYxX01NVV9EVworCQlpZiAoaHctPmR3X21tdV9lbmFibGUpIHsKKwkJCWh3LT5tbXVfYm94X2R3ID0gZGVjb2Rlcl9tbXVfYm94X2FsbG9jX2JveChEUklWRVJfTkFNRSwKKwkJCQlody0+aW5kZXggLyoqIDIgKyAxKi8sIGNvdW50LAorCQkJCWh3LT5uZWVkX2NhY2hlX3NpemUsCisJCQkJdHZwX2ZsYWcKKwkJCQkpOworCQkJaWYgKCFody0+bW11X2JveF9kdykgeworCQkJCXByX2VycigiYXYxIGFsbG9jIGR3IG1tdSBib3ggZmFpbGVkISFcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorI2VuZGlmCisKKwl9CisJaHctPmJtbXVfYm94ID0gZGVjb2Rlcl9ibW11X2JveF9hbGxvY19ib3goCisJCQlEUklWRVJfTkFNRSwKKwkJCWh3LT5pbmRleCwKKwkJCU1BWF9CTU1VX0JVRkZFUl9OVU0sCisJCQk0ICsgUEFHRV9TSElGVCwKKwkJCUNPREVDX01NX0ZMQUdTX0NNQV9DTEVBUiB8CisJCQlDT0RFQ19NTV9GTEFHU19GT1JfVkRFQ09ERVIgfAorCQkJdHZwX2ZsYWcpOworCWF2MV9wcmludChodywgQVYxX0RFQlVHX0JVRk1HUiwKKwkJIiVzLCBNQVhfQk1NVV9CVUZGRVJfTlVNID0gJWRcbiIsCisJCV9fZnVuY19fLAorCQlNQVhfQk1NVV9CVUZGRVJfTlVNKTsKKwlpZiAoIWh3LT5ibW11X2JveCkgeworCQlwcl9lcnIoImF2MSBhbGxvYyBibW11IGJveCBmYWlsZWQhIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgQVYxSFdfcyAqZ0hldmM7CisKKworc3RhdGljIGludCBhbXZkZWNfYXYxX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHZkZWNfcyAqcGRhdGEgPSAqKHN0cnVjdCB2ZGVjX3MgKiopcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlzdHJ1Y3QgQVYxSFdfcyAqaHc7CisJQVYxRGVjb2RlciAqcGJpOworCWludCByZXQ7CisJdTMyIHdvcmtfYnVmX3NpemU7CisJc3RydWN0IEJ1ZmZJbmZvX3MgKnBfYnVmX2luZm87CisjaWZuZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlpbnQgaTsKKyNlbmRpZgorCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RNMikgfHwKKwkJKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDUpIHx8CisJCSgoZ2V0X2NwdV9tYWpvcl9pZCgpID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UTTIpICYmICFpc19tZXNvbl9yZXZfYigpKSkgeworCQlwcl9lcnIoImF2MSB1bnN1cHBvcnRlZCBvbiBjcHUgJWQsIGlzX3RtMl9yZXZiICVkXG4iLAorCQkJZ2V0X2NwdV9tYWpvcl9pZCgpLCBpc19jcHVfdG0yX3JldmIoKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW11dGV4X2xvY2soJnZhdjFfbXV0ZXgpOworCWh3ID0gdnphbGxvYyhzaXplb2Yoc3RydWN0IEFWMUhXX3MpKTsKKwlpZiAoaHcgPT0gTlVMTCkgeworCQlhdjFfcHJpbnQoaHcsIDAsICJcbmFtdmRlY19hdjEgZGV2aWNlIGRhdGEgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQltdXRleF91bmxvY2soJnZhdjFfbXV0ZXgpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZ0hldmMgPSBodzsKKwkvKgorCW1lbWNweSgmQlVGWzBdLCAmaHctPm1fQlVGWzBdLCBzaXplb2Yoc3RydWN0IEJVRl9zKSAqIE1BWF9CVUZfTlVNKTsKKwltZW1zZXQoaHcsIDAsIHNpemVvZihzdHJ1Y3QgQVYxSFdfcykpOworCW1lbWNweSgmaHctPm1fQlVGWzBdLCAmQlVGWzBdLCBzaXplb2Yoc3RydWN0IEJVRl9zKSAqIE1BWF9CVUZfTlVNKTsKKwkqLworCWlmIChpbml0X2RibGtfc3RydWMoaHcpIDwgMCkgeworCQlhdjFfcHJpbnQoaHcsIDAsICJcbmFtbXZkZWNfYXYxIGRldmljZSBkYXRhIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJdmZyZWUoaHcpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwYmkgPSBhdjFfZGVjb2Rlcl9jcmVhdGUoJmh3LT5hdjFfYnVmZmVyX3Bvb2wsICZody0+Y29tbW9uKTsgLy8mYW9tX2RlY29kZXI7CisJaHctPnBiaSA9IHBiaTsKKwlpZiAoaHctPnBiaSA9PSBOVUxMKSB7CisJCXByX2luZm8oIlxuYW1tdmRlY19hdjEgZGV2aWNlIGRhdGEgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZWxlYXNlX2RibGtfc3RydWN0KGh3KTsKKwkJdmZyZWUoaHcpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLy9ody0+Y29tbW9uLmJ1ZmZlcl9wb29sID0gJmh3LT5hdjFfYnVmZmVyX3Bvb2w7IC8vPz8/PworCWh3LT5wYmktPnByaXZhdGVfZGF0YSA9IGh3OworCisJaHctPmluaXRfZmxhZyA9IDA7CisJaHctPmZpcnN0X3NjX2NoZWNrZWQ9IDA7CisKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJaHctPmVvcyA9IDA7CisJaHctPnN0YXJ0X3Byb2Nlc3NfdGltZSA9IDA7CisJaHctPnRpbWVvdXRfbnVtID0gMDsKKyNlbmRpZgorCWh3LT5mYXRhbF9lcnJvciA9IDA7CisJaHctPnNob3dfZnJhbWVfbnVtID0gMDsKKwlpZiAocGRhdGEgPT0gTlVMTCkgeworCQlhdjFfcHJpbnQoaHcsIDAsICJcbmFtdmRlY19hdjEgbWVtb3J5IHJlc291cmNlIHVuZGVmaW5lZC5cbiIpOworCQl2ZnJlZShodyk7CisJCW11dGV4X3VubG9jaygmdmF2MV9tdXRleCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChwZGF0YS0+c3lzX2luZm8pIHsKKwkJaHctPnZhdjFfYW1zdHJlYW1fZGVjX2luZm8gPSAqcGRhdGEtPnN5c19pbmZvOworCQlhdjFfbWF4X3BpY193ID0gKGh3LT52YXYxX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoKSA/CisJCQkoaHctPnZhdjFfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGgpIDogODE5MjsKKworCQlhdjFfbWF4X3BpY19oID0gKGh3LT52YXYxX2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodCkgPworCQkJKGh3LT52YXYxX2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodCkgOiA0NjA4OworCX0gZWxzZSB7CisJCWh3LT52YXYxX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoID0gMDsKKwkJaHctPnZhdjFfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0ID0gMDsKKwkJaHctPnZhdjFfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSA9IDMwOworCQlhdjFfbWF4X3BpY193ID0gODE5MjsKKwkJYXYxX21heF9waWNfaCA9IDQ2MDg7CisJfQorCWh3LT5tYXhfcGljX3cgPSBhdjFfbWF4X3BpY193OworCWh3LT5tYXhfcGljX2ggPSBhdjFfbWF4X3BpY19oOworCisJaHctPm1faW5zX2ZsYWcgPSAwOworCisJaWYgKGZvcmNlX2J1ZnNwZWMpIHsKKwkJaHctPmJ1ZmZlcl9zcGVjX2luZGV4ID0gZm9yY2VfYnVmc3BlYyAmIDB4ZjsKKwkJcHJfaW5mbygiZm9yY2UgYnVmZmVyIHNwZWMgJWRcbiIsIGZvcmNlX2J1ZnNwZWMgJiAweGYpOworCX0gZWxzZSBpZiAodmRlY19pc19zdXBwb3J0XzRrKCkpIHsKKwkJaWYgKElTXzhLX1NJWkUoaHctPm1heF9waWNfdywgaHctPm1heF9waWNfaCkpCisJCQlody0+YnVmZmVyX3NwZWNfaW5kZXggPSAyOworCQllbHNlIGlmIChJU180S19TSVpFKGh3LT5tYXhfcGljX3csIGh3LT5tYXhfcGljX2gpKQorCQkJaHctPmJ1ZmZlcl9zcGVjX2luZGV4ID0gMTsKKwkJZWxzZQorCQkJaHctPmJ1ZmZlcl9zcGVjX2luZGV4ID0gMDsKKwl9IGVsc2UKKwkJaHctPmJ1ZmZlcl9zcGVjX2luZGV4ID0gMDsKKworCWlmIChody0+YnVmZmVyX3NwZWNfaW5kZXggPT0gMCkKKwkJaHctPm1heF9vbmVfbXZfYnVmZmVyX3NpemUgPQorCQkJKGdldF9jcHVfbWFqb3JfaWQoKSA+IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TQzIpID8KKwkJCQlNQVhfT05FX01WX0JVRkZFUl9TSVpFXzEwODBQIDogTUFYX09ORV9NVl9CVUZGRVJfU0laRV8xMDgwUF9UTTJSRVZCOworCWVsc2UgaWYgKGh3LT5idWZmZXJfc3BlY19pbmRleCA9PSAxKQorCQlody0+bWF4X29uZV9tdl9idWZmZXJfc2l6ZSA9CisJCShnZXRfY3B1X21ham9yX2lkKCkgPiBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU0MyKSA/CisJCQlNQVhfT05FX01WX0JVRkZFUl9TSVpFXzRLIDogTUFYX09ORV9NVl9CVUZGRVJfU0laRV80S19UTTJSRVZCOworCWVsc2UKKwkJaHctPm1heF9vbmVfbXZfYnVmZmVyX3NpemUgPQorCQkoZ2V0X2NwdV9tYWpvcl9pZCgpID4gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NDMikgPworCQkJTUFYX09ORV9NVl9CVUZGRVJfU0laRV84SyA6IE1BWF9PTkVfTVZfQlVGRkVSX1NJWkVfOEtfVE0yUkVWQjsKKworCXBfYnVmX2luZm8gPSAmYW9tX3dvcmtidWZmX3NwZWNbaHctPmJ1ZmZlcl9zcGVjX2luZGV4XTsKKwl3b3JrX2J1Zl9zaXplID0gKHBfYnVmX2luZm8tPmVuZF9hZHIgLSBwX2J1Zl9pbmZvLT5zdGFydF9hZHIKKwkJICsgMHhmZmZmKSAmICh+MHhmZmZmKTsKKwlhdjFfcHJpbnQoaHcsIDAsCisJCQkidmRlY19pc19zdXBwb3J0XzRrKCkgJWQgIG1heF9waWNfdyAlZCBtYXhfcGljX2ggJWQgYnVmZmVyX3NwZWNfaW5kZXggJWQgd29ya19idWZfc2l6ZSAweCV4XG4iLAorCQkJdmRlY19pc19zdXBwb3J0XzRrKCksIGh3LT5tYXhfcGljX3csIGh3LT5tYXhfcGljX2gsCisJCQlody0+YnVmZmVyX3NwZWNfaW5kZXgsIHdvcmtfYnVmX3NpemUpOworCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCWh3LT5wbGF0Zm9ybV9kZXYgPSBwZGV2OworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBkYXRhKTsKKyNlbmRpZgorCWh3LT5kb3VibGVfd3JpdGVfbW9kZSA9IGRvdWJsZV93cml0ZV9tb2RlOworCWh3LT5tbXVfZW5hYmxlID0gMTsKKyNpZmRlZiBBT01fQVYxX01NVV9EVworCWh3LT5kd19tbXVfZW5hYmxlID0KKwkJZ2V0X2RvdWJsZV93cml0ZV9tb2RlX2luaXQoaHcpICYgMHgyMCA/IDEgOiAwOworI2VuZGlmCisJaWYgKGFtdmRlY19hdjFfbW11X2luaXQoaHcpIDwgMCkgeworCQl2ZnJlZShodyk7CisJCW11dGV4X3VubG9jaygmdmF2MV9tdXRleCk7CisJCXByX2VycigiYXYxIGFsbG9jIGJtbXUgYm94IGZhaWxlZCEhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldCA9IGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeShody0+Ym1tdV9ib3gsIFdPUktfU1BBQ0VfQlVGX0lELAorCQkJd29ya19idWZfc2l6ZSwgRFJJVkVSX05BTUUsICZwZGF0YS0+bWVtX3N0YXJ0KTsKKwlpZiAocmV0IDwgMCkgeworCQl1bmluaXRfbW11X2J1ZmZlcnMoaHcpOworCQl2ZnJlZShodyk7CisJCW11dGV4X3VubG9jaygmdmF2MV9tdXRleCk7CisJCXJldHVybiByZXQ7CisJfQorCWh3LT5idWZfc2l6ZSA9IHdvcmtfYnVmX3NpemU7CisKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJaHctPmJ1Zl9zdGFydCA9IHBkYXRhLT5tZW1fc3RhcnQ7CisjZWxzZQorCWlmICghaHctPm1tdV9lbmFibGUpCisJCWh3LT5tY19idWZfc3BlYy5idWZfZW5kID0gcGRhdGEtPm1lbV9zdGFydCArIGh3LT5idWZfc2l6ZTsKKworCWZvciAoaSA9IDA7IGkgPCBXT1JLX0JVRl9TUEVDX05VTTsgaSsrKQorCQlhb21fd29ya2J1ZmZfc3BlY1tpXS5zdGFydF9hZHIgPSBwZGF0YS0+bWVtX3N0YXJ0OworI2VuZGlmCisKKwlpZiAoZGVidWcpIHsKKwkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwgIj09PUFWMSBkZWNvZGVyIG1lbSByZXNvdXJjZSAweCVseCBzaXplIDB4JXhcbiIsCisJCQkgICBwZGF0YS0+bWVtX3N0YXJ0LCBody0+YnVmX3NpemUpOworCX0KKworCWh3LT5ub19oZWFkID0gbm9faGVhZDsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJaHctPmNtYV9kZXYgPSBwZGF0YS0+Y21hX2RldjsKKyNlbHNlCisJY21hX2RldiA9IHBkYXRhLT5jbWFfZGV2OworI2VuZGlmCisKKwlody0+ZW5kaWFuID0gSEVWQ19DT05GSUdfTElUVExFX0VORElBTjsKKwlpZiAoaXNfc3VwcG9ydF92ZGVjX2NhbnZhcygpKQorCQlody0+ZW5kaWFuID0gSEVWQ19DT05GSUdfQklHX0VORElBTjsKKwlpZiAoZW5kaWFuKQorCQlody0+ZW5kaWFuID0gZW5kaWFuOworCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCXBkYXRhLT5wcml2YXRlID0gaHc7CisJcGRhdGEtPmRlY19zdGF0dXMgPSB2YXYxX2RlY19zdGF0dXM7CisJcGRhdGEtPnNldF9pc3Jlc2V0ID0gdmF2MV9zZXRfaXNyZXNldDsKKwlpc19yZXNldCA9IDA7CisJaWYgKHZhdjFfaW5pdChwZGF0YSkgPCAwKSB7CisjZWxzZQorCWlmICh2YXYxX2luaXQoaHcpIDwgMCkgeworI2VuZGlmCisJCWF2MV9wcmludChodywgMCwgIlxuYW12ZGVjX2F2MSBpbml0IGZhaWxlZC5cbiIpOworCQlhdjFfbG9jYWxfdW5pbml0KGh3KTsKKwkJdW5pbml0X21tdV9idWZmZXJzKGh3KTsKKwkJdmZyZWUoaHcpOworCQlwZGF0YS0+ZGVjX3N0YXR1cyA9IE5VTEw7CisJCW11dGV4X3VubG9jaygmdmF2MV9tdXRleCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkvKnNldCB0aGUgbWF4IGNsayBmb3Igc21vb3RoIHBsYXlpbmcuLi4qLworCWhldmNfc291cmNlX2NoYW5nZWQoVkZPUk1BVF9BVjEsIDQwOTYsIDIwNDgsIDYwKTsKKwltdXRleF91bmxvY2soJnZhdjFfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW12ZGVjX2F2MV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgQVYxSFdfcyAqaHcgPSBnSGV2YzsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisJaW50IGk7CisKKwlpZiAoZGVidWcpCisJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsICJhbXZkZWNfYXYxX3JlbW92ZVxuIik7CisKKwltdXRleF9sb2NrKCZ2YXYxX211dGV4KTsKKworCXZhdjFfc3RvcChodyk7CisKKwloZXZjX3NvdXJjZV9jaGFuZ2VkKFZGT1JNQVRfQVYxLCAwLCAwLCAwKTsKKworCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQlmb3IgKGkgPSAwOyBpIDwgRlJBTUVfQlVGRkVSUzsgaSsrKSB7CisJCQl2ZGVjLT5mcmVlX2NhbnZhc19leChody0+Y29tbW9uLmJ1ZmZlcl9wb29sLT4KKwkJCQlmcmFtZV9idWZzW2ldLmJ1Zi55X2NhbnZhc19pbmRleCwgdmRlYy0+aWQpOworCQkJdmRlYy0+ZnJlZV9jYW52YXNfZXgoaHctPmNvbW1vbi5idWZmZXJfcG9vbC0+CisJCQkJZnJhbWVfYnVmc1tpXS5idWYudXZfY2FudmFzX2luZGV4LCB2ZGVjLT5pZCk7CisJCX0KKwl9CisKKyNpZmRlZiBERUJVR19QVFMKKwlwcl9pbmZvKCJwdHMgbWlzc2VkICVsZCwgcHRzIGhpdCAlbGQsIGR1cmF0aW9uICVkXG4iLAorCQkgICBody0+cHRzX21pc3NlZCwgaHctPnB0c19oaXQsIGh3LT5mcmFtZV9kdXIpOworI2VuZGlmCisJdmZyZWUoaHctPnBiaSk7CisJcmVsZWFzZV9kYmxrX3N0cnVjdChodyk7CisJdmZyZWUoaHcpOworCW11dGV4X3VubG9jaygmdmF2MV9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGF2MV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlhbWhldmNfc3VzcGVuZCh0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSwgZGV2LT5wb3dlci5wb3dlcl9zdGF0ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXYxX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJYW1oZXZjX3Jlc3VtZSh0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBhdjFfcG1fb3BzID0geworCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKGF2MV9zdXNwZW5kLCBhdjFfcmVzdW1lKQorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhbXZkZWNfYXYxX2RyaXZlciA9IHsKKwkucHJvYmUgPSBhbXZkZWNfYXYxX3Byb2JlLAorCS5yZW1vdmUgPSBhbXZkZWNfYXYxX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9IERSSVZFUl9OQU1FLAorI2lmZGVmIENPTkZJR19QTQorCQkucG0gPSAmYXYxX3BtX29wcywKKyNlbmRpZgorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY29kZWNfcHJvZmlsZV90IGFtdmRlY19hdjFfcHJvZmlsZSA9IHsKKyNpZmRlZiBERUJVR19VU0VfVlA5X0RFVklDRV9OQU1FCisJLm5hbWUgPSAidnA5IiwKKyNlbHNlCisJLm5hbWUgPSAiYXYxIiwKKyNlbmRpZgorCS5wcm9maWxlID0gIiIKK307CisKK3N0YXRpYyBzdHJ1Y3QgY29kZWNfcHJvZmlsZV90IGFtdmRlY19hdjFfcHJvZmlsZV9tdWx0OworCitzdGF0aWMgdW5zaWduZWQgaW50IGdldF9kYXRhX2NoZWNrX3N1bQorCShzdHJ1Y3QgQVYxSFdfcyAqaHcsIGludCBzaXplKQoreworCWludCBzdW0gPSAwOworCXU4ICpkYXRhID0gTlVMTDsKKworCWlmICghaHctPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQlkYXRhID0gY29kZWNfbW1fdm1hcChody0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQlody0+Y2h1bmstPm9mZnNldCwgc2l6ZSk7CisJZWxzZQorCQlkYXRhID0gKCh1OCAqKWh3LT5jaHVuay0+YmxvY2stPnN0YXJ0X3ZpcnQpICsKKwkJCWh3LT5jaHVuay0+b2Zmc2V0OworCisJc3VtID0gY3JjMzJfbGUoMCwgZGF0YSwgc2l6ZSk7CisKKwlpZiAoIWh3LT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcihkYXRhKTsKKwlyZXR1cm4gc3VtOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2RhdGEoc3RydWN0IEFWMUhXX3MgKmh3LCBpbnQgc2l6ZSkKK3sKKwlpbnQgamo7CisJdTggKmRhdGEgPSBOVUxMOworCWludCBwYWRkaW5nX3NpemUgPSBody0+Y2h1bmstPm9mZnNldCAmCisJCShWREVDX0ZJRk9fQUxJR04gLSAxKTsKKworCWlmICghaHctPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQlkYXRhID0gY29kZWNfbW1fdm1hcChody0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQlody0+Y2h1bmstPm9mZnNldCwgc2l6ZSk7CisJZWxzZQorCQlkYXRhID0gKCh1OCAqKWh3LT5jaHVuay0+YmxvY2stPnN0YXJ0X3ZpcnQpICsKKwkJCWh3LT5jaHVuay0+b2Zmc2V0OworCisJYXYxX3ByaW50KGh3LCAwLCAicGFkZGluZzogIik7CisJZm9yIChqaiA9IHBhZGRpbmdfc2l6ZTsgamogPiAwOyBqai0tKQorCQlhdjFfcHJpbnRfY29udChodywKKwkJCTAsCisJCQkiJTAyeCAiLCAqKGRhdGEgLSBqaikpOworCWF2MV9wcmludF9jb250KGh3LCAwLCAiZGF0YSBhZHIgJXBcbiIsCisJCWRhdGEpOworCisJZm9yIChqaiA9IDA7IGpqIDwgc2l6ZTsgamorKykgeworCQlpZiAoKGpqICYgMHhmKSA9PSAwKQorCQkJYXYxX3ByaW50KGh3LAorCQkJCTAsCisJCQkJIiUwNng6IiwgamopOworCQlhdjFfcHJpbnRfY29udChodywKKwkJCTAsCisJCQkiJTAyeCAiLCBkYXRhW2pqXSk7CisJCWlmICgoKGpqICsgMSkgJiAweGYpID09IDApCisJCQlhdjFfcHJpbnQoaHcsCisJCQkgMCwKKwkJCQkiXG4iKTsKKwl9CisJYXYxX3ByaW50KGh3LAorCSAwLAorCQkiXG4iKTsKKworCWlmICghaHctPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQljb2RlY19tbV91bm1hcF9waHlhZGRyKGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBhdjFfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IEFWMUhXX3MgKmh3ID0gY29udGFpbmVyX29mKHdvcmssCisJCXN0cnVjdCBBVjFIV19zLCB3b3JrKTsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisJLyogZmluaXNoZWQgZGVjb2Rpbmcgb25lIGZyYW1lIG9yIGVycm9yLAorCSAqIG5vdGlmeSB2ZGVjIGNvcmUgdG8gc3dpdGNoIGNvbnRleHQKKwkgKi8KKwlpZiAoaHctPmRlY19yZXN1bHQgIT0gQU9NX0FWMV9SRVNVTFRfTkVFRF9NT1JFX0JVRkZFUikKKwkJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfV09SS0VSX1NUQVJUKTsKKworCWlmIChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0FHQUlOKQorCQlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9XT1JLRVJfQUdBSU4pOworCisJYXYxX3ByaW50KGh3LCBQUklOVF9GTEFHX1ZERUNfREVUQUlMLAorCQkiJXMgZGVjX3Jlc3VsdCAlZCAleCAleCAleFxuIiwKKwkJX19mdW5jX18sCisJCWh3LT5kZWNfcmVzdWx0LAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fTEVWRUwpLAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fV1JfUFRSKSwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1JEX1BUUikpOworCisJaWYgKGh3LT5kZWNfcmVzdWx0ID09IEFPTV9BVjFfUkVTVUxUX05FRURfTU9SRV9CVUZGRVIpIHsKKwkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwkJaWYgKGdldF9mcmVlX2J1Zl9jb3VudChodykgPD0gMCkgeworCQkJaHctPmRlY19yZXN1bHQgPSBBT01fQVYxX1JFU1VMVF9ORUVEX01PUkVfQlVGRkVSOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCX0gZWxzZSB7CisJCQlhdjFfcmVsZWFzZV9idWZzKGh3KTsKKwkJCWF2MV9jb250aW51ZV9kZWNvZGluZyhodywgaHctPmN1cl9vYnVfdHlwZSk7CisJCQlody0+cG9zdHByb2NfZG9uZSA9IDA7CisJCQlzdGFydF9wcm9jZXNzX3RpbWUoaHcpOworCQl9CisJCXJldHVybjsKKwl9CisKKwlpZiAoKChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0dFVF9EQVRBKSB8fAorCQkoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9HRVRfREFUQV9SRVRSWSkpCisJCSYmIChod190b192ZGVjKGh3KS0+bmV4dF9zdGF0dXMgIT0KKwkJVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEKSkgeworCQlpZiAoIXZkZWNfaGFzX21vcmVfaW5wdXQodmRlYykpIHsKKwkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9FT1M7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0dFVF9EQVRBKSB7CisJCQlhdjFfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkJIiVzIERFQ19SRVNVTFRfR0VUX0RBVEEgJXggJXggJXhcbiIsCisJCQkJX19mdW5jX18sCisJCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0xFVkVMKSwKKwkJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fV1JfUFRSKSwKKwkJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSKSk7CisJCQl2ZGVjX3ZmcmFtZV9kaXJ0eSh2ZGVjLCBody0+Y2h1bmspOworCQkJdmRlY19jbGVhbl9pbnB1dCh2ZGVjKTsKKwkJfQorCisJCWlmIChnZXRfZnJlZV9idWZfY291bnQoaHcpID49CisJCQlody0+cnVuX3JlYWR5X21pbl9idWZfbnVtKSB7CisJCQlpbnQgcjsKKwkJCWludCBkZWNvZGVfc2l6ZTsKKwkJCXIgPSB2ZGVjX3ByZXBhcmVfaW5wdXQodmRlYywgJmh3LT5jaHVuayk7CisJCQlpZiAociA8IDApIHsKKwkJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfR0VUX0RBVEFfUkVUUlk7CisKKwkJCQlhdjFfcHJpbnQoaHcsCisJCQkJCVBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsCisJCQkJCSJhbXZkZWNfdmgyNjU6IEluc3VmZmljaWVudCBkYXRhXG4iKTsKKworCQkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9OT05FOworCQkJYXYxX3ByaW50KGh3LCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJCSIlczogY2h1bmsgc2l6ZSAweCV4IHN1bSAweCV4XG4iLAorCQkJCV9fZnVuY19fLCByLAorCQkJCShkZWJ1ZyAmIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMpID8KKwkJCQlnZXRfZGF0YV9jaGVja19zdW0oaHcsIHIpIDogMAorCQkJCSk7CisKKwkJCWlmIChkZWJ1ZyAmIFBSSU5UX0ZMQUdfVkRFQ19EQVRBKQorCQkJCWR1bXBfZGF0YShodywgaHctPmNodW5rLT5zaXplKTsKKworCQkJZGVjb2RlX3NpemUgPSBody0+Y2h1bmstPnNpemUgKworCQkJCShody0+Y2h1bmstPm9mZnNldCAmIChWREVDX0ZJRk9fQUxJR04gLSAxKSk7CisKKwkJCVdSSVRFX1ZSRUcoSEVWQ19ERUNPREVfU0laRSwKKwkJCQlSRUFEX1ZSRUcoSEVWQ19ERUNPREVfU0laRSkgKyBkZWNvZGVfc2l6ZSk7CisKKwkJCXZkZWNfZW5hYmxlX2lucHV0KHZkZWMpOworCisJCQlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIEhFVkNfQUNUSU9OX0RPTkUpOworCisJCQlzdGFydF9wcm9jZXNzX3RpbWUoaHcpOworCisJCX0gZWxzZSB7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfR0VUX0RBVEFfUkVUUlk7CisKKwkJCWF2MV9wcmludChodywgUFJJTlRfRkxBR19WREVDX0RFVEFJTCwKKwkJCQkiYW12ZGVjX3ZoMjY1OiBJbnN1ZmZpY2llbnQgZGF0YVxuIik7CisKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQl9CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfRE9ORSkgeworCQkvKiBpZiAoIWh3LT5jdHhfdmFsaWQpCisJCQlody0+Y3R4X3ZhbGlkID0gMTsgKi8KKwkJaHctPnJlc3VsdF9kb25lX2NvdW50Kys7CisJCWh3LT5wcm9jZXNzX3N0YXRlID0gUFJPQ19TVEFURV9JTklUOworCisJCWF2MV9wcmludChodywgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCSIlcyAoPT09PiAlZCkgZGVjX3Jlc3VsdCAlZCAoJWQpICV4ICV4ICV4IHNoaWZ0Ynl0ZXMgMHgleCBkZWNieXRlcyAweCV4XG4iLAorCQkJX19mdW5jX18sCisJCQlody0+ZnJhbWVfY291bnQsCisJCQlody0+ZGVjX3Jlc3VsdCwKKwkJCWh3LT5yZXN1bHRfZG9uZV9jb3VudCwKKwkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9MRVZFTCksCisJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fV1JfUFRSKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIpLAorCQkJUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCksCisJCQlSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKSAtCisJCQlody0+c3RhcnRfc2hpZnRfYnl0ZXMKKwkJCSk7CisJCXZkZWNfdmZyYW1lX2RpcnR5KGh3X3RvX3ZkZWMoaHcpLCBody0+Y2h1bmspOworCX0gZWxzZSBpZiAoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9BR0FJTikgeworCQkvKgorCQkJc3RyZWFtIGJhc2U6IHN0cmVhbSBidWYgZW1wdHkgb3IgdGltZW91dAorCQkJZnJhbWUgYmFzZTogdmRlY19wcmVwYXJlX2lucHV0IGZhaWwKKwkJKi8KKwkJaWYgKCF2ZGVjX2hhc19tb3JlX2lucHV0KHZkZWMpKSB7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRU9TOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgaWYgKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfRU9TKSB7CisJCWF2MV9wcmludChodywgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCSIlczogZW5kIG9mIHN0cmVhbVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJaHctPmVvcyA9IDE7CisJCWF2MV9wb3N0cHJvYyhodyk7CisKKwkJbm90aWZ5X3Y0bF9lb3MoaHdfdG9fdmRlYyhodykpOworCisJCXZkZWNfdmZyYW1lX2RpcnR5KGh3X3RvX3ZkZWMoaHcpLCBody0+Y2h1bmspOworCX0gZWxzZSBpZiAoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9GT1JDRV9FWElUKSB7CisJCWF2MV9wcmludChodywgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCSIlczogZm9yY2UgZXhpdFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJaWYgKGh3LT5zdGF0ICYgU1RBVF9WREVDX1JVTikgeworCQkJYW1oZXZjX3N0b3AoKTsKKwkJCWh3LT5zdGF0ICY9IH5TVEFUX1ZERUNfUlVOOworCQl9CisKKwkJaWYgKGh3LT5zdGF0ICYgU1RBVF9JU1JfUkVHKSB7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQkJaWYgKCFody0+bV9pbnNfZmxhZykKKyNlbmRpZgorCQkJCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTUJPWDBfTUFTSywgMCk7CisJCQl2ZGVjX2ZyZWVfaXJxKFZERUNfSVJRXzAsICh2b2lkICopaHcpOworCQkJaHctPnN0YXQgJj0gflNUQVRfSVNSX1JFRzsKKwkJfQorCX0KKwlpZiAoaHctPnN0YXQgJiBTVEFUX1ZERUNfUlVOKSB7CisJCWFtaGV2Y19zdG9wKCk7CisJCWh3LT5zdGF0ICY9IH5TVEFUX1ZERUNfUlVOOworCX0KKworCWlmIChody0+c3RhdCAmIFNUQVRfVElNRVJfQVJNKSB7CisJCWRlbF90aW1lcl9zeW5jKCZody0+dGltZXIpOworCQlody0+c3RhdCAmPSB+U1RBVF9USU1FUl9BUk07CisJfQorCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX1dPUktFUl9FTkQpOworCS8qIG1hcmsgaXRzZWxmIGhhcyBhbGwgSFcgcmVzb3VyY2UgcmVsZWFzZWQgYW5kIGlucHV0IHJlbGVhc2VkICovCisJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKQorCQl2ZGVjX2NvcmVfZmluaXNoX3J1bih2ZGVjLCBDT1JFX01BU0tfSEVWQyk7CisJZWxzZQorCQl2ZGVjX2NvcmVfZmluaXNoX3J1bihod190b192ZGVjKGh3KSwgQ09SRV9NQVNLX1ZERUNfMQorCQkJCQl8IENPUkVfTUFTS19IRVZDKTsKKwl0cmlnZ2VyX3NjaGVkdWxlKGh3KTsKK30KKworc3RhdGljIGludCBhdjFfaHdfY3R4X3Jlc3RvcmUoc3RydWN0IEFWMUhXX3MgKmh3KQoreworCXZhdjFfcHJvdF9pbml0KGh3LCBIV19NQVNLX0ZST05UIHwgSFdfTUFTS19CQUNLKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2wgaXNfYXZhbGlhYmxlX2J1ZmZlcihzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJQVYxX0NPTU1PTiAqY20gPSAmaHctPmNvbW1vbjsKKwlSZWZDbnRCdWZmZXIgKmNvbnN0IGZyYW1lX2J1ZnMgPSBjbS0+YnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnM7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisJaW50IGksIGZyZWVfY291bnQgPSAwOworCisJaWYgKGN0eC0+Y2FwX3Bvb2wuZGVjIDwgaHctPnVzZWRfYnVmX251bSkgeworCQlmcmVlX2NvdW50ID0gdjRsMl9tMm1fbnVtX2RzdF9idWZzX3JlYWR5KGN0eC0+bTJtX2N0eCk7CisJCWlmIChmcmVlX2NvdW50ICYmCisJCQkhY3R4LT5mYl9vcHMucXVlcnkoJmN0eC0+ZmJfb3BzLCAmaHctPmZiX3Rva2VuKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IGh3LT51c2VkX2J1Zl9udW07ICsraSkgeworCQlpZiAoKGZyYW1lX2J1ZnNbaV0ucmVmX2NvdW50ID09IDApICYmCisJCQkoZnJhbWVfYnVmc1tpXS5idWYudmZfcmVmID09IDApICYmCisJCQkoZnJhbWVfYnVmc1tpXS5idWYuaW5kZXggPj0gMCkgJiYKKwkJCWZyYW1lX2J1ZnNbaV0uYnVmLmNtYV9hbGxvY19hZGRyKSB7CisJCQlmcmVlX2NvdW50Kys7CisJCX0KKwl9CisKKwlyZXR1cm4gZnJlZV9jb3VudCA8IGh3LT5ydW5fcmVhZHlfbWluX2J1Zl9udW0gPyAwIDogMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcnVuX3JlYWR5KHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgQVYxSFdfcyAqaHcgPQorCQkoc3RydWN0IEFWMUhXX3MgKil2ZGVjLT5wcml2YXRlOworCWludCB0dnAgPSB2ZGVjX3NlY3VyZShod190b192ZGVjKGh3KSkgPworCQlDT0RFQ19NTV9GTEFHU19UVlAgOiAwOworCXVuc2lnbmVkIGxvbmcgcmV0ID0gMDsKKworCWlmICghaHctPnBpY19saXN0X2luaXRfZG9uZTIgfHwgaHctPmVvcykKKwkJcmV0dXJuIHJldDsKKworCWlmICghaHctPmZpcnN0X3NjX2NoZWNrZWQgJiYgaHctPm1tdV9lbmFibGUpIHsKKwkJaW50IHNpemU7CisJCXZvaWQgKiBtbXVfYm94OworCisJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisJCQltbXVfYm94ID0gY3R4LT5tbXVfYm94OworCQl9IGVsc2UKKwkJCW1tdV9ib3ggPSBody0+bW11X2JveDsKKworCQlzaXplID0gZGVjb2Rlcl9tbXVfYm94X3NjX2NoZWNrKG1tdV9ib3gsIHR2cCk7CisJCWh3LT5maXJzdF9zY19jaGVja2VkID0gMTsKKwkJYXYxX3ByaW50KGh3LCAwLCAiYXYxIGNhY2hlZD0lZCAgbmVlZF9zaXplPSVkIHNwZWVkPSAlZCBtc1xuIiwKKwkJCXNpemUsIChody0+bmVlZF9jYWNoZV9zaXplID4+IFBBR0VfU0hJRlQpLAorCQkJKGludCkoZ2V0X2ppZmZpZXNfNjQoKSAtIGh3LT5zY19zdGFydF90aW1lKSAqIDEwMDAvSFopOworI2lmZGVmIEFPTV9BVjFfTU1VX0RXCisJCS8qISEhISEhIFRvIGRvIC4uLiAqLworCQlpZiAoaHctPmR3X21tdV9lbmFibGUpIHsKKworCQl9CisjZW5kaWYKKwl9CisKKwlpZiAoZ2V0X2ZyZWVfYnVmX2NvdW50KGh3KSA+PQorCQlody0+cnVuX3JlYWR5X21pbl9idWZfbnVtKSB7CisJCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkKKwkJCXJldCA9IENPUkVfTUFTS19IRVZDOworCQllbHNlCisJCQlyZXQgPSBDT1JFX01BU0tfVkRFQ18xIHwgQ09SRV9NQVNLX0hFVkM7CisJfQorCisJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisKKwkJaWYgKGN0eC0+cGFyYW1fc2V0c19mcm9tX3Vjb2RlKSB7CisJCQlpZiAoaHctPnY0bF9wYXJhbXNfcGFyc2VkKSB7CisJCQkJaWYgKGN0eC0+Y2FwX3Bvb2wuZGVjIDwgaHctPnVzZWRfYnVmX251bSkgeworCQkJCQlpZiAoaXNfYXZhbGlhYmxlX2J1ZmZlcihodykpCisJCQkJCQlyZXQgPSBDT1JFX01BU0tfSEVWQzsKKwkJCQkJZWxzZQorCQkJCQkJcmV0ID0gMDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChjdHgtPnY0bF9yZXNvbHV0aW9uX2NoYW5nZSkKKwkJCQkJcmV0ID0gMDsKKwkJCX0KKwkJfSBlbHNlIGlmIChjdHgtPmNhcF9wb29sLmluIDwgY3R4LT5kcGJfc2l6ZSkgeworCQkJaWYgKHY0bDJfbTJtX251bV9kc3RfYnVmc19yZWFkeShjdHgtPm0ybV9jdHgpIDwKKwkJCQlody0+cnVuX3JlYWR5X21pbl9idWZfbnVtKQorCQkJCXJldCA9IDA7CisJCX0KKwl9CisKKwlpZiAocmV0KQorCQlub3RfcnVuX3JlYWR5W2h3LT5pbmRleF0gPSAwOworCWVsc2UKKwkJbm90X3J1bl9yZWFkeVtody0+aW5kZXhdKys7CisKKwkvKmF2MV9wcmludChodywKKwkJUFJJTlRfRkxBR19WREVDX0RFVEFJTCwgIiVzIG1hc2sgJWx4PT4lbHhcclxuIiwKKwkJX19mdW5jX18sIG1hc2ssIHJldCk7Ki8KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBhdjFfZnJhbWVfbW9kZV9jYWxfZHVyKHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlpZiAoaHctPmNodW5rID09IE5VTEwpCisJCQlyZXR1cm47CisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX09VVF9QVFMsCisJCQkicnVuX2Zyb250OiBwdHMgJWQsIHB0czY0ICVsbGQsIHRzOiAlbGx1XG4iLAorCQkJaHctPmNodW5rLT5wdHMsIGh3LT5jaHVuay0+cHRzNjQsIGh3LT5jaHVuay0+dGltZXN0YW1wKTsKKworCQlpZiAoaHctPnB0c19kaWZmX2NvdW50ID4gRlJBTUVfQlVGRkVSUykKKwkJCXJldHVybiA7CisKKwkJaWYgKChody0+Y2h1bmstPnB0cyA+IGh3LT5sYXN0X2NodW5rX3B0cykgJiYgKGh3LT5sYXN0X2NodW5rX3B0cyA+IDApKSB7CisJCQlody0+cHRzX2RpZmZfY291bnQrKzsKKwkJCWh3LT5wdHNfZGlmZl9zdW0gID0gaHctPnB0c19kaWZmX3N1bSArIChody0+Y2h1bmstPnB0cyAtIGh3LT5sYXN0X2NodW5rX3B0cyk7CisJCQlpZiAoaHctPnB0c19kaWZmX2NvdW50ID4gRlJBTUVfQlVGRkVSUykgeworCQkJCXUzMiBjYWxjX2R1ciA9ICh1MzIpZGl2X3U2NChkaXZfdTY0KGh3LT5wdHNfZGlmZl9zdW0sIGh3LT5wdHNfZGlmZl9jb3VudCkqOTYsIDkwKTsKKwkJCQlpZiAoKGNhbGNfZHVyIDw9IDE2MDAwKSAmJiAoY2FsY19kdXIgPj0gODAwKSkgeworCQkJCQlhdjFfcHJpbnQoaHcsIDAsICJjaGFuZ2UgdG8gY2FsYyBkdXIgJWQsIG9sZCBkdXIgJWRcbiIsIGNhbGNfZHVyLCBody0+ZnJhbWVfZHVyKTsKKwkJCQkJaHctPmZyYW1lX2R1ciA9IGNhbGNfZHVyOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWh3LT5sYXN0X2NodW5rX3B0cyA9IGh3LT5jaHVuay0+cHRzOworfQorCitzdGF0aWMgdm9pZCBydW5fZnJvbnQoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzdHJ1Y3QgQVYxSFdfcyAqaHcgPQorCQkoc3RydWN0IEFWMUhXX3MgKil2ZGVjLT5wcml2YXRlOworCWludCByZXQsIHNpemU7CisKKwlydW5fY291bnRbaHctPmluZGV4XSsrOworCS8qIGh3LT5jaHVuayA9IHZkZWNfcHJlcGFyZV9pbnB1dCh2ZGVjKTsgKi8KKwloZXZjX3Jlc2V0X2NvcmUodmRlYyk7CisKKwlzaXplID0gdmRlY19wcmVwYXJlX2lucHV0KHZkZWMsICZody0+Y2h1bmspOworCWlmIChzaXplIDwgMCkgeworCQlpbnB1dF9lbXB0eVtody0+aW5kZXhdKys7CisKKwkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0FHQUlOOworCisJCWF2MV9wcmludChodywgUFJJTlRfRkxBR19WREVDX0RFVEFJTCwKKwkJCSJhbW12ZGVjX2F2MTogSW5zdWZmaWNpZW50IGRhdGFcbiIpOworCisJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQlyZXR1cm47CisJfQorCWlucHV0X2VtcHR5W2h3LT5pbmRleF0gPSAwOworCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9OT05FOworCWh3LT5zdGFydF9zaGlmdF9ieXRlcyA9IFJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpOworCisJYXYxX2ZyYW1lX21vZGVfY2FsX2R1cihodyk7CisKKwlpZiAoZGVidWcgJiBQUklOVF9GTEFHX1ZERUNfU1RBVFVTKSB7CisJCWlmICh2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpICYmIGh3LT5jaHVuayAmJiAhdmRlY19zZWN1cmUodmRlYykpIHsKKwkJCXU4ICpkYXRhID0gTlVMTDsKKworCQkJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQkJZGF0YSA9IGNvZGVjX21tX3ZtYXAoaHctPmNodW5rLT5ibG9jay0+c3RhcnQgKworCQkJCQlody0+Y2h1bmstPm9mZnNldCwgc2l6ZSk7CisJCQllbHNlCisJCQkJZGF0YSA9ICgodTggKilody0+Y2h1bmstPmJsb2NrLT5zdGFydF92aXJ0KSArCisJCQkJCWh3LT5jaHVuay0+b2Zmc2V0OworCisJCQkvL3ByaW50X2hleF9kZWJ1ZyhkYXRhLCBzaXplLCBzaXplID4gNjQgPyA2NCA6IHNpemUpOworCQkJYXYxX3ByaW50KGh3LCAwLAorCQkJCSIlczogc2l6ZSAweCV4IHN1bSAweCV4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IC4uICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQkJX19mdW5jX18sIHNpemUsIGdldF9kYXRhX2NoZWNrX3N1bShodywgc2l6ZSksCisJCQkJZGF0YVswXSwgZGF0YVsxXSwgZGF0YVsyXSwgZGF0YVszXSwKKwkJCQlkYXRhWzRdLCBkYXRhWzVdLCBkYXRhW3NpemUgLSA0XSwKKwkJCQlkYXRhW3NpemUgLSAzXSwgZGF0YVtzaXplIC0gMl0sCisJCQkJZGF0YVtzaXplIC0gMV0pOworCQkJYXYxX3ByaW50KGh3LCAwLAorCQkJCSIlcyBmcm0gY250ICglZCk6IGNodW5rICgweCV4IDB4JXgpICgleCAleCAleCAleCAleCkgYnl0ZXMgMHgleFxuIiwKKwkJCQlfX2Z1bmNfXywgaHctPmZyYW1lX2NvdW50LCBody0+Y2h1bmstPnNpemUsIGh3LT5jaHVuay0+b2Zmc2V0LAorCQkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9TVEFSVF9BRERSKSwKKwkJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fRU5EX0FERFIpLAorCQkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9MRVZFTCksCisJCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1dSX1BUUiksCisJCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1JEX1BUUiksCisJCQkJaHctPnN0YXJ0X3NoaWZ0X2J5dGVzKTsKKworCQkJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcihkYXRhKTsKKwkJfSBlbHNlIHsKKwkJCWF2MV9wcmludChodywgMCwKKwkJCQkiJXMgKCVkKTogc2l6ZSAweCV4ICgweCV4IDB4JXgpICgleCAleCAleCAleCAleCkgYnl0ZXMgMHgleFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlody0+ZnJhbWVfY291bnQsIHNpemUsCisJCQkJaHctPmNodW5rID8gaHctPmNodW5rLT5zaXplIDogMCwKKwkJCQlody0+Y2h1bmsgPyBody0+Y2h1bmstPm9mZnNldCA6IDAsCisJCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1NUQVJUX0FERFIpLAorCQkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9FTkRfQUREUiksCisJCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0xFVkVMKSwKKwkJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fV1JfUFRSKSwKKwkJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSKSwKKwkJCQlody0+c3RhcnRfc2hpZnRfYnl0ZXMpOworCQl9CisJfQorCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfcnVuX3RpbWVfbmFtZSwgVFJBQ0VfUlVOX0xPQURJTkdfRldfU1RBUlQpOworCWlmICh2ZGVjLT5tY19sb2FkZWQpIHsKKwkvKmZpcm13YXJlIGhhdmUgbG9hZCBiZWZvcmUsCisJICBhbmQgbm90IGNoYW5nZXMgdG8gYW5vdGhlci4KKwkgIGlnbm9yZSByZWxvYWQuCisJKi8KKwl9IGVsc2UgeworI2lmZGVmIERFQlVHX1VTRV9WUDlfREVWSUNFX05BTUUKKwkJCXJldCA9IGFtaGV2Y19sb2FkbWNfZXgoVkZPUk1BVF9WUDksIE5VTEwsIGh3LT5mdy0+ZGF0YSk7CisjZWxzZQorCQkJcmV0ID0gYW1oZXZjX2xvYWRtY19leChWRk9STUFUX0FWMSwgTlVMTCwgaHctPmZ3LT5kYXRhKTsKKyNlbmRpZgorCQkJaWYgKHJldCA8IDApIHsKKwkJCWFtaGV2Y19kaXNhYmxlKCk7CisJCQlhdjFfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfRVJST1IsCisJCQkJIkFWMTogdGhlICVzIGZ3IGxvYWRpbmcgZmFpbGVkLCBlcnI6ICV4XG4iLAorCQkJCXRlZV9lbmFibGVkKCkgPyAiVEVFIiA6ICJsb2NhbCIsIHJldCk7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRk9SQ0VfRVhJVDsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJcmV0dXJuOworCQl9CisJCXZkZWMtPm1jX2xvYWRlZCA9IDE7CisjaWZkZWYgREVCVUdfVVNFX1ZQOV9ERVZJQ0VfTkFNRQorCQl2ZGVjLT5tY190eXBlID0gVkZPUk1BVF9WUDk7CisjZWxzZQorCQl2ZGVjLT5tY190eXBlID0gVkZPUk1BVF9BVjE7CisjZW5kaWYKKwl9CisJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV9ydW5fdGltZV9uYW1lLCBUUkFDRV9SVU5fTE9BRElOR19GV19FTkQpOworCisJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV9ydW5fdGltZV9uYW1lLCBUUkFDRV9SVU5fTE9BRElOR19SRVNUT1JFX1NUQVJUKTsKKwlpZiAoYXYxX2h3X2N0eF9yZXN0b3JlKGh3KSA8IDApIHsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCXJldHVybjsKKwl9CisJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV9ydW5fdGltZV9uYW1lLCBUUkFDRV9SVU5fTE9BRElOR19SRVNUT1JFX0VORCk7CisJdmRlY19lbmFibGVfaW5wdXQodmRlYyk7CisKKwlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIEhFVkNfQUNUSU9OX0RPTkUpOworCisJaWYgKHZkZWNfZnJhbWVfYmFzZWQodmRlYykpIHsKKwkJaWYgKGRlYnVnICYgUFJJTlRfRkxBR19WREVDX0RBVEEpCisJCQlkdW1wX2RhdGEoaHcsIGh3LT5jaHVuay0+c2l6ZSk7CisKKwkJV1JJVEVfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQsIDApOworCQlzaXplID0gaHctPmNodW5rLT5zaXplICsKKwkJCShody0+Y2h1bmstPm9mZnNldCAmIChWREVDX0ZJRk9fQUxJR04gLSAxKSk7CisJCWlmICh2ZGVjLT5tdmZybSkKKwkJCXZkZWMtPm12ZnJtLT5mcmFtZV9zaXplID0gaHctPmNodW5rLT5zaXplOworCX0KKwlody0+ZGF0YV9zaXplID0gc2l6ZTsKKwlXUklURV9WUkVHKEhFVkNfREVDT0RFX1NJWkUsIHNpemUpOworCVdSSVRFX1ZSRUcoSEVWQ19ERUNPREVfQ09VTlQsIGh3LT5yZXN1bHRfZG9uZV9jb3VudCk7CisJV1JJVEVfVlJFRyhMTUVNX0RVTVBfQURSLCAodTMyKWh3LT5sbWVtX3BoeV9hZGRyKTsKKwlpZiAoaHctPmNvbmZpZ19uZXh0X3JlZl9pbmZvX2ZsYWcpCisJICAgIGNvbmZpZ19uZXh0X3JlZl9pbmZvX2h3KGh3KTsKKwlody0+Y29uZmlnX25leHRfcmVmX2luZm9fZmxhZyA9IDA7CisJaHctPmluaXRfZmxhZyA9IDE7CisKKwlhdjFfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsCisJCSIlczogc3RhcnQgaHcgKCV4ICV4ICV4KSBIRVZDX0RFQ09ERV9TSVpFIDB4JXhcbiIsCisJCV9fZnVuY19fLAorCQlSRUFEX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRyksCisJCVJFQURfVlJFRyhIRVZDX01QQ19FKSwKKwkJUkVBRF9WUkVHKEhFVkNfTVBTUiksCisJCVJFQURfVlJFRyhIRVZDX0RFQ09ERV9TSVpFKSk7CisKKwlzdGFydF9wcm9jZXNzX3RpbWUoaHcpOworCW1vZF90aW1lcigmaHctPnRpbWVyLCBqaWZmaWVzKTsKKwlody0+c3RhdCB8PSBTVEFUX1RJTUVSX0FSTTsKKwlody0+c3RhdCB8PSBTVEFUX0lTUl9SRUc7CisJYW1oZXZjX3N0YXJ0KCk7CisJaHctPnN0YXQgfD0gU1RBVF9WREVDX1JVTjsKK30KKworc3RhdGljIHZvaWQgcnVuKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHVuc2lnbmVkIGxvbmcgbWFzaywKKwl2b2lkICgqY2FsbGJhY2spKHN0cnVjdCB2ZGVjX3MgKiwgdm9pZCAqKSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBBVjFIV19zICpodyA9CisJCShzdHJ1Y3QgQVYxSFdfcyAqKXZkZWMtPnByaXZhdGU7CisKKwlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9SVU5fU1RBUlQpOworCWF2MV9wcmludChodywKKwkJUFJJTlRfRkxBR19WREVDX0RFVEFJTCwgIiVzIG1hc2sgJWx4XHJcbiIsCisJCV9fZnVuY19fLCBtYXNrKTsKKworCXJ1bl9jb3VudFtody0+aW5kZXhdKys7CisJaWYgKHZkZWMtPm12ZnJtKQorCQl2ZGVjLT5tdmZybS0+aHdfZGVjb2RlX3N0YXJ0ID0gbG9jYWxfY2xvY2soKTsKKwlody0+dmRlY19jYl9hcmcgPSBhcmc7CisJaHctPnZkZWNfY2IgPSBjYWxsYmFjazsKKwlody0+b25lX3BhY2thZ2VfZnJhbWVfY250ID0gMDsKKwkJcnVuX2Zyb250KHZkZWMpOworCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX1JVTl9FTkQpOworfQorCitzdGF0aWMgdm9pZCAgYXYxX2RlY29kZV9jdHhfcmVzZXQoc3RydWN0IEFWMUhXX3MgKmh3KQoreworCXN0cnVjdCBBVjFfQ29tbW9uX3MgKmNvbnN0IGNtID0gJmh3LT5jb21tb247CisJc3RydWN0IFJlZkNudEJ1ZmZlcl9zICpjb25zdCBmcmFtZV9idWZzID0gY20tPmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEZSQU1FX0JVRkZFUlM7ICsraSkgeworCQlmcmFtZV9idWZzW2ldLnJlZl9jb3VudAkJPSAwOworCQlmcmFtZV9idWZzW2ldLmJ1Zi52Zl9yZWYJPSAwOworCQlmcmFtZV9idWZzW2ldLmJ1Zi5kZWNvZGVfaWR4CT0gMDsKKwkJZnJhbWVfYnVmc1tpXS5idWYuY21hX2FsbG9jX2FkZHIgPSAwOworCQlmcmFtZV9idWZzW2ldLmJ1Zi5pbmRleAkJPSBpOworCQlmcmFtZV9idWZzW2ldLmJ1Zi5CVUZfaW5kZXgJPSAtMTsKKwkJZnJhbWVfYnVmc1tpXS5idWYubXZfYnVmX2luZGV4CT0gLTE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE1WX0JVRkZFUl9OVU07IGkrKykgeworCQlpZiAoaHctPm1fbXZfQlVGW2ldLnN0YXJ0X2FkcikgeworCQkJaHctPm1fbXZfQlVGW2ldLnVzZWRfZmxhZyA9IDA7CisJCX0KKwl9CisKKwlody0+b25lX2NvbXByZXNzZWRfZGF0YV9kb25lID0gMDsKKwlody0+Y29uZmlnX25leHRfcmVmX2luZm9fZmxhZyA9IDA7CisJaHctPmluaXRfZmxhZwkJPSAwOworCWh3LT5maXJzdF9zY19jaGVja2VkCT0gMDsKKwlody0+ZmF0YWxfZXJyb3IJCT0gMDsKKwlody0+c2hvd19mcmFtZV9udW0JPSAwOworCWh3LT5wb3N0cHJvY19kb25lCT0gMDsKKwlody0+cHJvY2Vzc19idXN5CT0gMDsKKwlody0+cHJvY2Vzc19zdGF0ZQk9IDA7CisJaHctPmZyYW1lX2RlY29kZWQJPSAwOworCWh3LT5lb3MJCQk9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0KHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IEFWMUhXX3MgKmh3ID0KKwkJKHN0cnVjdCBBVjFIV19zICopdmRlYy0+cHJpdmF0ZTsKKworCWNhbmNlbF93b3JrX3N5bmMoJmh3LT53b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZody0+c2V0X2Nsa193b3JrKTsKKworCWlmIChody0+c3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJYW1oZXZjX3N0b3AoKTsKKwkJaHctPnN0YXQgJj0gflNUQVRfVkRFQ19SVU47CisJfQorCisJaWYgKGh3LT5zdGF0ICYgU1RBVF9USU1FUl9BUk0pIHsKKwkJZGVsX3RpbWVyX3N5bmMoJmh3LT50aW1lcik7CisJCWh3LT5zdGF0ICY9IH5TVEFUX1RJTUVSX0FSTTsKKwl9CisKKwlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCisJYXYxX2J1Zm1ncl9jdHhfcmVzZXQoaHctPnBiaSwgJmh3LT5hdjFfYnVmZmVyX3Bvb2wsICZody0+Y29tbW9uKTsKKwlody0+cGJpLT5wcml2YXRlX2RhdGEgPSBodzsKKworCWF2MV9sb2NhbF91bmluaXQoaHcpOworCWlmICh2YXYxX2xvY2FsX2luaXQoaHcpIDwgMCkKKwkJYXYxX3ByaW50KGh3LCAwLCAiJXMgbG9jYWxfaW5pdCBmYWlsZWQgXHJcbiIsIF9fZnVuY19fKTsKKworCWF2MV9kZWNvZGVfY3R4X3Jlc2V0KGh3KTsKKworCWF2MV9wcmludChodywgUFJJTlRfRkxBR19WREVDX0RFVEFJTCwgIiVzXHJcbiIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGF2MV9pcnFfY2Ioc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGlycSkKK3sKKwlzdHJ1Y3QgQVYxSFdfcyAqaHcgPQorCQkoc3RydWN0IEFWMUhXX3MgKil2ZGVjLT5wcml2YXRlOworCXJldHVybiB2YXYxX2lzcigwLCBodyk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhdjFfdGhyZWFkZWRfaXJxX2NiKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBpcnEpCit7CisJc3RydWN0IEFWMUhXX3MgKmh3ID0KKwkJKHN0cnVjdCBBVjFIV19zICopdmRlYy0+cHJpdmF0ZTsKKwlyZXR1cm4gdmF2MV9pc3JfdGhyZWFkX2ZuKDAsIGh3KTsKK30KKworc3RhdGljIHZvaWQgYXYxX2R1bXBfc3RhdGUoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzdHJ1Y3QgQVYxSFdfcyAqaHcgPQorCQkoc3RydWN0IEFWMUhXX3MgKil2ZGVjLT5wcml2YXRlOworCXN0cnVjdCBBVjFfQ29tbW9uX3MgKmNvbnN0IGNtID0gJmh3LT5jb21tb247CisJaW50IGk7CisJYXYxX3ByaW50KGh3LCAwLCAiPT09PT09ICVzXG4iLCBfX2Z1bmNfXyk7CisKKwlhdjFfcHJpbnQoaHcsIDAsCisJCSJ3aWR0aC9oZWlnaHQgKCVkLyVkKSwgdXNlZF9idWZfbnVtICVkXG4iLAorCQljbS0+d2lkdGgsCisJCWNtLT5oZWlnaHQsCisJCWh3LT51c2VkX2J1Zl9udW0KKwkJKTsKKworCWF2MV9wcmludChodywgMCwKKwkJImlzX2ZyYW1lYmFzZSglZCksIGVvcyAlZCwgZGVjX3Jlc3VsdCAweCV4IGRlY19mcm0gJWQgZGlzcF9mcm0gJWQgcnVuICVkIG5vdF9ydW5fcmVhZHkgJWQgaW5wdXRfZW1wdHkgJWQgbG93X2xhdGVuY3kgJWQgbm9faGVhZCAlZCBcbiIsCisJCWlucHV0X2ZyYW1lX2Jhc2VkKHZkZWMpLAorCQlody0+ZW9zLAorCQlody0+ZGVjX3Jlc3VsdCwKKwkJZGVjb2RlX2ZyYW1lX2NvdW50W2h3LT5pbmRleF0sCisJCWRpc3BsYXlfZnJhbWVfY291bnRbaHctPmluZGV4XSwKKwkJcnVuX2NvdW50W2h3LT5pbmRleF0sCisJCW5vdF9ydW5fcmVhZHlbaHctPmluZGV4XSwKKwkJaW5wdXRfZW1wdHlbaHctPmluZGV4XSwKKwkJaHctPmxvd19sYXRlbmN5X2ZsYWcsCisJCWh3LT5ub19oZWFkCisJCSk7CisKKwlpZiAoIWh3LT5pc191c2VkX3Y0bCAmJiB2Zl9nZXRfcmVjZWl2ZXIodmRlYy0+dmZfcHJvdmlkZXJfbmFtZSkpIHsKKwkJZW51bSByZWNldml2ZXJfc3RhcnRfZSBzdGF0ZSA9CisJCXZmX25vdGlmeV9yZWNlaXZlcih2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1FVUkVZX1NUQVRFLAorCQkJTlVMTCk7CisJCWF2MV9wcmludChodywgMCwKKwkJCSJcbnJlY2VpdmVyKCVzKSBzdGF0ZSAlZFxuIiwKKwkJCXZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQlzdGF0ZSk7CisJfQorCisJYXYxX3ByaW50KGh3LCAwLAorCSIlcywgbmV3cSglZC8lZCksIGRpc3BxKCVkLyVkKSwgdmYgcHJlcGFyZS9nZXQvcHV0ICglZC8lZC8lZCksIGZyZWVfYnVmX2NvdW50ICVkIChtaW4gJWQgZm9yIHJ1bl9yZWFkeSlcbiIsCisJX19mdW5jX18sCisJa2ZpZm9fbGVuKCZody0+bmV3ZnJhbWVfcSksCisJVkZfUE9PTF9TSVpFLAorCWtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSksCisJVkZfUE9PTF9TSVpFLAorCWh3LT52Zl9wcmVfY291bnQsCisJaHctPnZmX2dldF9jb3VudCwKKwlody0+dmZfcHV0X2NvdW50LAorCWdldF9mcmVlX2J1Zl9jb3VudChodyksCisJaHctPnJ1bl9yZWFkeV9taW5fYnVmX251bQorCSk7CisKKwlkdW1wX3BpY19saXN0KGh3KTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQlVGX05VTTsgaSsrKSB7CisJCWF2MV9wcmludChodywgMCwKKwkJCSJtdl9CdWYoJWQpIHN0YXJ0X2FkciAweCV4IHNpemUgMHgleCB1c2VkICVkXG4iLAorCQkJaSwKKwkJCWh3LT5tX212X0JVRltpXS5zdGFydF9hZHIsCisJCQlody0+bV9tdl9CVUZbaV0uc2l6ZSwKKwkJCWh3LT5tX212X0JVRltpXS51c2VkX2ZsYWcpOworCX0KKworCWF2MV9wcmludChodywgMCwKKwkJIkhFVkNfREVDX1NUQVRVU19SRUc9MHgleFxuIiwKKwkJUkVBRF9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcpKTsKKwlhdjFfcHJpbnQoaHcsIDAsCisJCSJIRVZDX01QQ19FPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX01QQ19FKSk7CisJYXYxX3ByaW50KGh3LCAwLAorCQkiREVDT0RFX01PREU9MHgleFxuIiwKKwkJUkVBRF9WUkVHKERFQ09ERV9NT0RFKSk7CisJYXYxX3ByaW50KGh3LCAwLAorCQkiTkFMX1NFQVJDSF9DVEw9MHgleFxuIiwKKwkJUkVBRF9WUkVHKE5BTF9TRUFSQ0hfQ1RMKSk7CisJYXYxX3ByaW50KGh3LCAwLAorCQkiSEVWQ19QQVJTRVJfTENVX1NUQVJUPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX1BBUlNFUl9MQ1VfU1RBUlQpKTsKKwlhdjFfcHJpbnQoaHcsIDAsCisJCSJIRVZDX0RFQ09ERV9TSVpFPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX0RFQ09ERV9TSVpFKSk7CisJYXYxX3ByaW50KGh3LCAwLAorCQkiSEVWQ19TSElGVF9CWVRFX0NPVU5UPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpKTsKKwlhdjFfcHJpbnQoaHcsIDAsCisJCSJIRVZDX1NUUkVBTV9TVEFSVF9BRERSPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9TVEFSVF9BRERSKSk7CisJYXYxX3ByaW50KGh3LCAwLAorCQkiSEVWQ19TVFJFQU1fRU5EX0FERFI9MHgleFxuIiwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0VORF9BRERSKSk7CisJYXYxX3ByaW50KGh3LCAwLAorCQkiSEVWQ19TVFJFQU1fTEVWRUw9MHgleFxuIiwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0xFVkVMKSk7CisJYXYxX3ByaW50KGh3LCAwLAorCQkiSEVWQ19TVFJFQU1fV1JfUFRSPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9XUl9QVFIpKTsKKwlhdjFfcHJpbnQoaHcsIDAsCisJCSJIRVZDX1NUUkVBTV9SRF9QVFI9MHgleFxuIiwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1JEX1BUUikpOworCWF2MV9wcmludChodywgMCwKKwkJIlBBUlNFUl9WSURFT19SUD0weCV4XG4iLAorCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfcnApKTsKKwlhdjFfcHJpbnQoaHcsIDAsCisJCSJQQVJTRVJfVklERU9fV1A9MHgleFxuIiwKKwkJU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3dwKSk7CisKKwlpZiAoaW5wdXRfZnJhbWVfYmFzZWQodmRlYykgJiYKKwkJKGRlYnVnICYgUFJJTlRfRkxBR19WREVDX0RBVEEpCisJCSkgeworCQlpbnQgamo7CisJCWlmIChody0+Y2h1bmsgJiYgaHctPmNodW5rLT5ibG9jayAmJgorCQkJaHctPmNodW5rLT5zaXplID4gMCkgeworCQkJdTggKmRhdGEgPSBOVUxMOworCisJCQlpZiAoIWh3LT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJCQlkYXRhID0gY29kZWNfbW1fdm1hcCgKKwkJCQkJaHctPmNodW5rLT5ibG9jay0+c3RhcnQgKworCQkJCQlody0+Y2h1bmstPm9mZnNldCwKKwkJCQkJaHctPmNodW5rLT5zaXplKTsKKwkJCWVsc2UKKwkJCQlkYXRhID0gKCh1OCAqKWh3LT5jaHVuay0+YmxvY2stPnN0YXJ0X3ZpcnQpCisJCQkJCSsgaHctPmNodW5rLT5vZmZzZXQ7CisJCQlhdjFfcHJpbnQoaHcsIDAsCisJCQkJImZyYW1lIGRhdGEgc2l6ZSAweCV4XG4iLAorCQkJCWh3LT5jaHVuay0+c2l6ZSk7CisJCQlmb3IgKGpqID0gMDsgamogPCBody0+Y2h1bmstPnNpemU7IGpqKyspIHsKKwkJCQlpZiAoKGpqICYgMHhmKSA9PSAwKQorCQkJCQlhdjFfcHJpbnQoaHcsIDAsCisJCQkJCQkiJTA2eDoiLCBqaik7CisJCQkJYXYxX3ByaW50X2NvbnQoaHcsIDAsCisJCQkJCSIlMDJ4ICIsIGRhdGFbampdKTsKKwkJCQlpZiAoKChqaiArIDEpICYgMHhmKSA9PSAwKQorCQkJCQlhdjFfcHJpbnRfY29udChodywgMCwKKwkJCQkJCSJcbiIpOworCQkJfQorCisJCQlpZiAoIWh3LT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJCQljb2RlY19tbV91bm1hcF9waHlhZGRyKGRhdGEpOworCQl9CisJfQorCit9CisKK3N0YXRpYyBpbnQgYW1tdmRlY19hdjFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdmRlY19zICpwZGF0YSA9ICooc3RydWN0IHZkZWNfcyAqKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpbnQgcmV0OworCWludCBjb25maWdfdmFsOworCWludCBpOworCXN0cnVjdCB2ZnJhbWVfY29udGVudF9saWdodF9sZXZlbF9zIGNvbnRlbnRfbGlnaHRfbGV2ZWw7CisJc3RydWN0IHZmcmFtZV9tYXN0ZXJfZGlzcGxheV9jb2xvdXJfcyB2Zl9kcDsKKwl1MzIgd29ya19idWZfc2l6ZTsKKwlzdHJ1Y3QgQnVmZkluZm9fcyAqcF9idWZfaW5mbzsKKwlzdHJ1Y3QgQVYxSFdfcyAqaHcgPSBOVUxMOworCisJaWYgKChnZXRfY3B1X21ham9yX2lkKCkgPCBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVE0yKSB8fAorCQkoZ2V0X2NwdV9tYWpvcl9pZCgpID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNSkgfHwKKwkJKChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RNMikgJiYgIWlzX21lc29uX3Jldl9iKCkpKSB7CisJCXByX2VycigiYXYxIHVuc3VwcG9ydGVkIG9uIGNwdSAlZCwgaXNfdG0yX3JldmIgJWRcbiIsCisJCQlnZXRfY3B1X21ham9yX2lkKCksIGlzX2NwdV90bTJfcmV2YigpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHBkYXRhID09IE5VTEwpIHsKKwkJYXYxX3ByaW50KGh3LCAwLCAiXG5hbW12ZGVjX2F2MSBtZW1vcnkgcmVzb3VyY2UgdW5kZWZpbmVkLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwltZW1zZXQoJnZmX2RwLCAwLCBzaXplb2Yoc3RydWN0IHZmcmFtZV9tYXN0ZXJfZGlzcGxheV9jb2xvdXJfcykpOworCisJaHcgPSB2emFsbG9jKHNpemVvZihzdHJ1Y3QgQVYxSFdfcykpOworCWlmIChodyA9PSBOVUxMKSB7CisJCWF2MV9wcmludChodywgMCwgIlxuYW1tdmRlY19hdjEgZGV2aWNlIGRhdGEgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoaW5pdF9kYmxrX3N0cnVjKGh3KSA8IDApIHsKKwkJYXYxX3ByaW50KGh3LCAwLCAiXG5hbW12ZGVjX2F2MSBkZXZpY2UgZGF0YSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXZmcmVlKGh3KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaHctPnBiaSA9IGF2MV9kZWNvZGVyX2NyZWF0ZSgmaHctPmF2MV9idWZmZXJfcG9vbCwgJmh3LT5jb21tb24pOyAvLyZhb21fZGVjb2RlcjsKKwlpZiAoaHctPnBiaSA9PSBOVUxMKSB7CisJCWF2MV9wcmludChodywgMCwgIlxuYW1tdmRlY19hdjEgZGV2aWNlIGRhdGEgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZWxlYXNlX2RibGtfc3RydWN0KGh3KTsKKwkJdmZyZWUoaHcpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlody0+cGJpLT5wcml2YXRlX2RhdGEgPSBodzsKKwkvKiB0aGUgY3R4IGZyb20gdjRsMiBkcml2ZXIuICovCisJaHctPnY0bDJfY3R4ID0gcGRhdGEtPnByaXZhdGU7CisKKwlwZGF0YS0+cHJpdmF0ZSA9IGh3OworCXBkYXRhLT5kZWNfc3RhdHVzID0gdmF2MV9kZWNfc3RhdHVzOworCS8qIHBkYXRhLT5zZXRfdHJpY2ttb2RlID0gc2V0X3RyaWNrbW9kZTsgKi8KKwlwZGF0YS0+cnVuX3JlYWR5ID0gcnVuX3JlYWR5OworCXBkYXRhLT5ydW4gPSBydW47CisJcGRhdGEtPnJlc2V0ID0gcmVzZXQ7CisJcGRhdGEtPmlycV9oYW5kbGVyID0gYXYxX2lycV9jYjsKKwlwZGF0YS0+dGhyZWFkZWRfaXJxX2hhbmRsZXIgPSBhdjFfdGhyZWFkZWRfaXJxX2NiOworCXBkYXRhLT5kdW1wX3N0YXRlID0gYXYxX2R1bXBfc3RhdGU7CisKKwlody0+aW5kZXggPSBwZGV2LT5pZDsKKwlpZiAoaXNfcmRtYV9lbmFibGUoKSkgeworCQlody0+cmRtYV9hZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLCBSRE1BX1NJWkUsICZody0+cmRtYV9waHlfYWRyLCBHRlBfS0VSTkVMKTsKKwkJZm9yIChpID0gMDsgaSA8IFNDQUxFTFVUX0RBVEFfV1JJVEVfTlVNOyBpKyspIHsKKwkJCWh3LT5yZG1hX2FkcltpICogNF0gPSBIRVZDX0lRSVRfU0NBTEVMVVRfV1JfQUREUiAmIDB4ZmZmOworCQkJaHctPnJkbWFfYWRyW2kgKiA0ICsgMV0gPSBpOworCQkJaHctPnJkbWFfYWRyW2kgKiA0ICsgMl0gPSBIRVZDX0lRSVRfU0NBTEVMVVRfREFUQSAmIDB4ZmZmOworCQkJaHctPnJkbWFfYWRyW2kgKiA0ICsgM10gPSAwOworCQkJaWYgKGkgPT0gU0NBTEVMVVRfREFUQV9XUklURV9OVU0gLSAxKSB7CisJCQkJaHctPnJkbWFfYWRyW2kgKiA0ICsgMl0gPSAoSEVWQ19JUUlUX1NDQUxFTFVUX0RBVEEgJiAweGZmZikgfCAweDIwMDAwOworCQkJfQorCQl9CisJfQorCXNucHJpbnRmKGh3LT50cmFjZS52ZGVjX25hbWUsIHNpemVvZihody0+dHJhY2UudmRlY19uYW1lKSwKKwkJImF2MS0lZCIsIGh3LT5pbmRleCk7CisJc25wcmludGYoaHctPnRyYWNlLnB0c19uYW1lLCBzaXplb2YoaHctPnRyYWNlLnB0c19uYW1lKSwKKwkJIiVzLXB0cyIsIGh3LT50cmFjZS52ZGVjX25hbWUpOworCXNucHJpbnRmKGh3LT50cmFjZS5uZXdfcV9uYW1lLCBzaXplb2YoaHctPnRyYWNlLm5ld19xX25hbWUpLAorCQkiJXMtbmV3ZnJhbWVfcSIsIGh3LT50cmFjZS52ZGVjX25hbWUpOworCXNucHJpbnRmKGh3LT50cmFjZS5kaXNwX3FfbmFtZSwgc2l6ZW9mKGh3LT50cmFjZS5kaXNwX3FfbmFtZSksCisJCSIlcy1kaXNwZnJhbWVfcSIsIGh3LT50cmFjZS52ZGVjX25hbWUpOworCXNucHJpbnRmKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBzaXplb2YoaHctPnRyYWNlLmRlY29kZV90aW1lX25hbWUpLAorCQkiZGVjb2Rlcl90aW1lJWQiLCBwZGV2LT5pZCk7CisJc25wcmludGYoaHctPnRyYWNlLmRlY29kZV9ydW5fdGltZV9uYW1lLCBzaXplb2YoaHctPnRyYWNlLmRlY29kZV9ydW5fdGltZV9uYW1lKSwKKwkJImRlY29kZXJfcnVuX3RpbWUlZCIsIHBkZXYtPmlkKTsKKwlzbnByaW50Zihody0+dHJhY2UuZGVjb2RlX2hlYWRlcl9tZW1vcnlfdGltZV9uYW1lLCBzaXplb2YoaHctPnRyYWNlLmRlY29kZV9oZWFkZXJfbWVtb3J5X3RpbWVfbmFtZSksCisJCSJkZWNvZGVyX2hlYWRlcl90aW1lJWQiLCBwZGV2LT5pZCk7CisJc25wcmludGYoaHctPnRyYWNlLmRlY29kZV93b3JrX3RpbWVfbmFtZSwgc2l6ZW9mKGh3LT50cmFjZS5kZWNvZGVfd29ya190aW1lX25hbWUpLAorCQkiZGVjb2Rlcl93b3JrX3RpbWUlZCIsIHBkZXYtPmlkKTsKKwlpZiAocGRhdGEtPnVzZV92Zm1fcGF0aCkKKwkJc25wcmludGYocGRhdGEtPnZmX3Byb3ZpZGVyX25hbWUsIFZERUNfUFJPVklERVJfTkFNRV9TSVpFLAorCQkJVkZNX0RFQ19QUk9WSURFUl9OQU1FKTsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCWVsc2UgaWYgKHZkZWNfZHVhbChwZGF0YSkpIHsKKwkJc3RydWN0IEFWMUhXX3MgKmhldmNfcGFpciA9IE5VTEw7CisKKwkJaWYgKGR2X3RvZ2dsZV9wcm92X25hbWUpIC8qZGVidWcgcHVycG9zZSovCisJCQlzbnByaW50ZihwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCVZERUNfUFJPVklERVJfTkFNRV9TSVpFLAorCQkJCShwZGF0YS0+bWFzdGVyKSA/IFZGTV9ERUNfRFZCTF9QUk9WSURFUl9OQU1FIDoKKwkJCQlWRk1fREVDX0RWRUxfUFJPVklERVJfTkFNRSk7CisJCWVsc2UKKwkJCXNucHJpbnRmKHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJVkRFQ19QUk9WSURFUl9OQU1FX1NJWkUsCisJCQkJKHBkYXRhLT5tYXN0ZXIpID8gVkZNX0RFQ19EVkVMX1BST1ZJREVSX05BTUUgOgorCQkJCVZGTV9ERUNfRFZCTF9QUk9WSURFUl9OQU1FKTsKKwkJaWYgKHBkYXRhLT5tYXN0ZXIpCisJCQloZXZjX3BhaXIgPSAoc3RydWN0IEFWMUhXX3MgKilwZGF0YS0+bWFzdGVyLT5wcml2YXRlOworCQllbHNlIGlmIChwZGF0YS0+c2xhdmUpCisJCQloZXZjX3BhaXIgPSAoc3RydWN0IEFWMUhXX3MgKilwZGF0YS0+c2xhdmUtPnByaXZhdGU7CisJfQorI2VuZGlmCisJZWxzZQorCQlzbnByaW50ZihwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwgVkRFQ19QUk9WSURFUl9OQU1FX1NJWkUsCisJCQlNVUxUSV9JTlNUQU5DRV9QUk9WSURFUl9OQU1FICIuJTAyeCIsIHBkZXYtPmlkICYgMHhmZik7CisKKwlody0+cHJvdmlkZXJfbmFtZSA9IHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBkYXRhKTsKKworCWh3LT5wbGF0Zm9ybV9kZXYgPSBwZGV2OworCWh3LT52aWRlb19zaWduYWxfdHlwZSA9IDA7CisJaHctPm1faW5zX2ZsYWcgPSAxOworCisJaWYgKHBkYXRhLT5zeXNfaW5mbykgeworCQlody0+dmF2MV9hbXN0cmVhbV9kZWNfaW5mbyA9ICpwZGF0YS0+c3lzX2luZm87CisJCWlmICgodW5zaWduZWQgbG9uZykgaHctPnZhdjFfYW1zdHJlYW1fZGVjX2luZm8ucGFyYW0KKwkJCQkmIDB4MDgpIHsKKwkJCQlody0+bG93X2xhdGVuY3lfZmxhZyA9IDE7CisJCQl9IGVsc2UKKwkJCQlody0+bG93X2xhdGVuY3lfZmxhZyA9IDA7CisJfSBlbHNlIHsKKwkJaHctPnZhdjFfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGggPSAwOworCQlody0+dmF2MV9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQgPSAwOworCQlody0+dmF2MV9hbXN0cmVhbV9kZWNfaW5mby5yYXRlID0gMzA7CisJfQorCisJaWYgKChkZWJ1ZyAmIElHTk9SRV9QQVJBTV9GUk9NX0NPTkZJRykgPT0gMCAmJgorCQkJcGRhdGEtPmNvbmZpZ19sZW4pIHsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCWludCBhdjFfYnVmX3dpZHRoID0gMDsKKwkJaW50IGF2MV9idWZfaGVpZ2h0ID0gMDsKKwkJLyp1c2UgcHRyIGNvbmZpZyBmb3IgZG91YmVsX3dyaXRlX21vZGUsIGV0YyovCisJCWF2MV9wcmludChodywgMCwgInBkYXRhLT5jb25maWc9JXNcbiIsIHBkYXRhLT5jb25maWcpOworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgImF2MV9kb3VibGVfd3JpdGVfbW9kZSIsCisJCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+ZG91YmxlX3dyaXRlX21vZGUgPSBjb25maWdfdmFsOworCQllbHNlCisJCQlody0+ZG91YmxlX3dyaXRlX21vZGUgPSBkb3VibGVfd3JpdGVfbW9kZTsKKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgInNhdmVfYnVmZmVyX21vZGUiLAorCQkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJaHctPnNhdmVfYnVmZmVyX21vZGUgPSBjb25maWdfdmFsOworCQllbHNlCisJCQlody0+c2F2ZV9idWZmZXJfbW9kZSA9IDA7CisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAiYXYxX2J1Zl93aWR0aCIsCisJCQkJJmNvbmZpZ192YWwpID09IDApIHsKKwkJCWF2MV9idWZfd2lkdGggPSBjb25maWdfdmFsOworCQl9CisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAiYXYxX2J1Zl9oZWlnaHQiLAorCQkJCSZjb25maWdfdmFsKSA9PSAwKSB7CisJCQlhdjFfYnVmX2hlaWdodCA9IGNvbmZpZ192YWw7CisJCX0KKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm5vX2hlYWQiLAorCQkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJaHctPm5vX2hlYWQgPSBjb25maWdfdmFsOworCQllbHNlCisJCQlody0+bm9faGVhZCA9IG5vX2hlYWQ7CisKKwkJLyp1c2UgcHRyIGNvbmZpZyBmb3IgbWF4X3BpY193LCBldGMqLworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgImF2MV9tYXhfcGljX3ciLAorCQkJCSZjb25maWdfdmFsKSA9PSAwKSB7CisJCQkJaHctPm1heF9waWNfdyA9IGNvbmZpZ192YWw7CisJCX0KKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJhdjFfbWF4X3BpY19oIiwKKwkJCQkmY29uZmlnX3ZhbCkgPT0gMCkgeworCQkJCWh3LT5tYXhfcGljX2ggPSBjb25maWdfdmFsOworCQl9CisJCWlmICgoaHctPm1heF9waWNfdyAqIGh3LT5tYXhfcGljX2gpCisJCQk8IChhdjFfYnVmX3dpZHRoICogYXYxX2J1Zl9oZWlnaHQpKSB7CisJCQlody0+bWF4X3BpY193ID0gYXYxX2J1Zl93aWR0aDsKKwkJCWh3LT5tYXhfcGljX2ggPSBhdjFfYnVmX2hlaWdodDsKKwkJCWF2MV9wcmludChodywgMCwgInVzZSBidWYgcmVzb2x1dGlvblxuIik7CisJCX0KKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgInNpZGViaW5kX3R5cGUiLAorCQkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJaHctPnNpZGViaW5kX3R5cGUgPSBjb25maWdfdmFsOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAic2lkZWJpbmRfY2hhbm5lbF9pZCIsCisJCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+c2lkZWJpbmRfY2hhbm5lbF9pZCA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV92NGxfY29kZWNfZW5hYmxlIiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJaHctPmlzX3VzZWRfdjRsID0gY29uZmlnX3ZhbDsKKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywKKwkJCSJwYXJtX3Y0bF9idWZmZXJfbWFyZ2luIiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJaHctPmR5bmFtaWNfYnVmX251bV9tYXJnaW4gPSBjb25maWdfdmFsOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLAorCQkJInBhcm1fdjRsX2NhbnZhc19tZW1fbW9kZSIsCisJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWh3LT5tZW1fbWFwX21vZGUgPSBjb25maWdfdmFsOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLAorCQkJInBhcm1fdjRsX2xvd19sYXRlbmN5X21vZGUiLAorCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+bG93X2xhdGVuY3lfZmxhZyA9IGNvbmZpZ192YWw7CisKKyNlbmRpZgorCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIkhEUlN0YXRpY0luZm8iLAorCQkJCSZ2Zl9kcC5wcmVzZW50X2ZsYWcpID09IDAKKwkJCQkmJiB2Zl9kcC5wcmVzZW50X2ZsYWcgPT0gMSkgeworCQkJZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm1HLngiLAorCQkJCQkmdmZfZHAucHJpbWFyaWVzWzBdWzBdKTsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtRy55IiwKKwkJCQkJJnZmX2RwLnByaW1hcmllc1swXVsxXSk7CisJCQlnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAibUIueCIsCisJCQkJCSZ2Zl9kcC5wcmltYXJpZXNbMV1bMF0pOworCQkJZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm1CLnkiLAorCQkJCQkmdmZfZHAucHJpbWFyaWVzWzFdWzFdKTsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtUi54IiwKKwkJCQkJJnZmX2RwLnByaW1hcmllc1syXVswXSk7CisJCQlnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAibVIueSIsCisJCQkJCSZ2Zl9kcC5wcmltYXJpZXNbMl1bMV0pOworCQkJZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm1XLngiLAorCQkJCQkmdmZfZHAud2hpdGVfcG9pbnRbMF0pOworCQkJZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm1XLnkiLAorCQkJCQkmdmZfZHAud2hpdGVfcG9pbnRbMV0pOworCQkJZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm1NYXhETCIsCisJCQkJCSZ2Zl9kcC5sdW1pbmFuY2VbMF0pOworCQkJZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm1NaW5ETCIsCisJCQkJCSZ2Zl9kcC5sdW1pbmFuY2VbMV0pOworCQkJdmZfZHAuY29udGVudF9saWdodF9sZXZlbC5wcmVzZW50X2ZsYWcgPSAxOworCQkJZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm1NYXhDTEwiLAorCQkJCQkmY29udGVudF9saWdodF9sZXZlbC5tYXhfY29udGVudCk7CisJCQlnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAibU1heEZBTEwiLAorCQkJCQkmY29udGVudF9saWdodF9sZXZlbC5tYXhfcGljX2F2ZXJhZ2UpOworCQkJdmZfZHAuY29udGVudF9saWdodF9sZXZlbCA9IGNvbnRlbnRfbGlnaHRfbGV2ZWw7CisJCQlody0+dmlkZW9fc2lnbmFsX3R5cGUgPSAoMSA8PCAyOSkKKwkJCQkJfCAoNSA8PCAyNikJLyogdW5zcGVjaWZpZWQgKi8KKwkJCQkJfCAoMCA8PCAyNSkJLyogbGltaXQgKi8KKwkJCQkJfCAoMSA8PCAyNCkJLyogY29sb3IgYXZhaWxhYmxlICovCisJCQkJCXwgKDkgPDwgMTYpCS8qIDIwMjAgKi8KKwkJCQkJfCAoMTYgPDwgOCkJLyogMjA4NCAqLworCQkJCQl8ICg5IDw8IDApOwkvKiAyMDIwICovCisJCX0KKwkJaHctPnZmX2RwID0gdmZfZHA7CisJfSBlbHNlIHsKKwkJdTMyIGZvcmNlX3csIGZvcmNlX2g7CisJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1RCkgeworCQkJZm9yY2VfdyA9IDE5MjA7CisJCQlmb3JjZV9oID0gMTA4ODsKKwkJfSBlbHNlIHsKKwkJCWZvcmNlX3cgPSA4MTkyOworCQkJZm9yY2VfaCA9IDQ2MDg7CisJCX0KKwkJaWYgKGh3LT52YXYxX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoKQorCQkJaHctPm1heF9waWNfdyA9IGh3LT52YXYxX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoOworCQllbHNlCisJCQlody0+bWF4X3BpY193ID0gZm9yY2VfdzsKKworCQlpZiAoaHctPnZhdjFfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0KQorCQkJaHctPm1heF9waWNfaCA9IGh3LT52YXYxX2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodDsKKwkJZWxzZQorCQkJaHctPm1heF9waWNfaCA9IGZvcmNlX2g7CisJCWh3LT5kb3VibGVfd3JpdGVfbW9kZSA9IGRvdWJsZV93cml0ZV9tb2RlOworCX0KKworCWh3LT5lbmRpYW4gPSBIRVZDX0NPTkZJR19MSVRUTEVfRU5ESUFOOworCWlmICghaHctPmlzX3VzZWRfdjRsKSB7CisJCXZmX3Byb3ZpZGVyX2luaXQoJnBkYXRhLT52ZnJhbWVfcHJvdmlkZXIsIHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJJnZhdjFfdmZfcHJvdmlkZXIsIGh3KTsKKwl9CisKKwlody0+bWVtX21hcF9tb2RlID0gbWVtX21hcF9tb2RlOworCWlmIChpc19zdXBwb3J0X3ZkZWNfY2FudmFzKCkpCisJCWh3LT5lbmRpYW4gPSBIRVZDX0NPTkZJR19CSUdfRU5ESUFOOworCWlmIChlbmRpYW4pCisJCWh3LT5lbmRpYW4gPSBlbmRpYW47CisKKwlpZiAoaXNfb3ZlcnNpemUoaHctPm1heF9waWNfdywgaHctPm1heF9waWNfaCkpIHsKKwkJcHJfZXJyKCJvdmVyIHNpemU6ICVkeCVkLCBwcm9iZSBmYWlsZWRcbiIsCisJCQlody0+bWF4X3BpY193LCBody0+bWF4X3BpY19oKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoZm9yY2VfYnVmc3BlYykgeworCQlody0+YnVmZmVyX3NwZWNfaW5kZXggPSBmb3JjZV9idWZzcGVjICYgMHhmOworCQlwcl9pbmZvKCJmb3JjZSBidWZmZXIgc3BlYyAlZFxuIiwgZm9yY2VfYnVmc3BlYyAmIDB4Zik7CisJfSBlbHNlIGlmICh2ZGVjX2lzX3N1cHBvcnRfNGsoKSkgeworCQlpZiAoSVNfOEtfU0laRShody0+bWF4X3BpY193LCBody0+bWF4X3BpY19oKSkKKwkJCWh3LT5idWZmZXJfc3BlY19pbmRleCA9IDI7CisJCWVsc2UgaWYgKElTXzRLX1NJWkUoaHctPm1heF9waWNfdywgaHctPm1heF9waWNfaCkpCisJCQlody0+YnVmZmVyX3NwZWNfaW5kZXggPSAxOworCQllbHNlCisJCQlody0+YnVmZmVyX3NwZWNfaW5kZXggPSAwOworCX0gZWxzZQorCQlody0+YnVmZmVyX3NwZWNfaW5kZXggPSAwOworCisJaWYgKGh3LT5idWZmZXJfc3BlY19pbmRleCA9PSAwKQorCQlody0+bWF4X29uZV9tdl9idWZmZXJfc2l6ZSA9CisJCQkoZ2V0X2NwdV9tYWpvcl9pZCgpID4gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NDMikgPworCQkJCU1BWF9PTkVfTVZfQlVGRkVSX1NJWkVfMTA4MFAgOiBNQVhfT05FX01WX0JVRkZFUl9TSVpFXzEwODBQX1RNMlJFVkI7CisJZWxzZSBpZiAoaHctPmJ1ZmZlcl9zcGVjX2luZGV4ID09IDEpCisJCWh3LT5tYXhfb25lX212X2J1ZmZlcl9zaXplID0KKwkJKGdldF9jcHVfbWFqb3JfaWQoKSA+IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TQzIpID8KKwkJCU1BWF9PTkVfTVZfQlVGRkVSX1NJWkVfNEsgOiBNQVhfT05FX01WX0JVRkZFUl9TSVpFXzRLX1RNMlJFVkI7CisJZWxzZQorCQlody0+bWF4X29uZV9tdl9idWZmZXJfc2l6ZSA9CisJCShnZXRfY3B1X21ham9yX2lkKCkgPiBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU0MyKSA/CisJCQlNQVhfT05FX01WX0JVRkZFUl9TSVpFXzhLIDogTUFYX09ORV9NVl9CVUZGRVJfU0laRV84S19UTTJSRVZCOworCisJcF9idWZfaW5mbyA9ICZhb21fd29ya2J1ZmZfc3BlY1tody0+YnVmZmVyX3NwZWNfaW5kZXhdOworCXdvcmtfYnVmX3NpemUgPSAocF9idWZfaW5mby0+ZW5kX2FkciAtIHBfYnVmX2luZm8tPnN0YXJ0X2FkcgorCQkgKyAweGZmZmYpICYgKH4weGZmZmYpOworCisJYXYxX3ByaW50KGh3LCAwLAorCQkJInZkZWNfaXNfc3VwcG9ydF80aygpICVkICBtYXhfcGljX3cgJWQgbWF4X3BpY19oICVkIGJ1ZmZlcl9zcGVjX2luZGV4ICVkIHdvcmtfYnVmX3NpemUgMHgleFxuIiwKKwkJCXZkZWNfaXNfc3VwcG9ydF80aygpLCBody0+bWF4X3BpY193LCBody0+bWF4X3BpY19oLAorCQkJaHctPmJ1ZmZlcl9zcGVjX2luZGV4LCB3b3JrX2J1Zl9zaXplKTsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPCBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hMIHx8CisJCWh3LT5kb3VibGVfd3JpdGVfbW9kZSA9PSAweDEwKQorCQlody0+bW11X2VuYWJsZSA9IDA7CisJZWxzZQorCQlody0+bW11X2VuYWJsZSA9IDE7CisKKwl2aWRlb19zaWduYWxfdHlwZSA9IGh3LT52aWRlb19zaWduYWxfdHlwZTsKKworCWlmIChwZGF0YS0+c3lzX2luZm8pIHsKKwkJaHctPnZhdjFfYW1zdHJlYW1fZGVjX2luZm8gPSAqcGRhdGEtPnN5c19pbmZvOworCQlpZiAoKHVuc2lnbmVkIGxvbmcpIGh3LT52YXYxX2Ftc3RyZWFtX2RlY19pbmZvLnBhcmFtCisJCQkJJiAweDA4KSB7CisJCQkJaHctPmxvd19sYXRlbmN5X2ZsYWcgPSAxOworCQkJfSBlbHNlCisJCQkJaHctPmxvd19sYXRlbmN5X2ZsYWcgPSAwOworCX0gZWxzZSB7CisJCWh3LT52YXYxX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoID0gMDsKKwkJaHctPnZhdjFfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0ID0gMDsKKwkJaHctPnZhdjFfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSA9IDMwOworCX0KKworI2lmZGVmIEFPTV9BVjFfTU1VX0RXCisJaHctPmR3X21tdV9lbmFibGUgPQorCQlnZXRfZG91YmxlX3dyaXRlX21vZGVfaW5pdChodykgJiAweDIwID8gMSA6IDA7CisKKyNlbmRpZgorCWF2MV9wcmludChodywgMCwKKwkJCSJub19oZWFkICVkICBsb3dfbGF0ZW5jeSAlZCwgc2lnbmFsX3R5cGUgMHgleFxuIiwKKwkJCWh3LT5ub19oZWFkLCBody0+bG93X2xhdGVuY3lfZmxhZywgaHctPnZpZGVvX3NpZ25hbF90eXBlKTsKKyNpZiAwCisJaHctPmJ1Zl9zdGFydCA9IHBkYXRhLT5tZW1fc3RhcnQ7CisJaHctPmJ1Zl9zaXplID0gcGRhdGEtPm1lbV9lbmQgLSBwZGF0YS0+bWVtX3N0YXJ0ICsgMTsKKyNlbHNlCisJaWYgKGFtdmRlY19hdjFfbW11X2luaXQoaHcpIDwgMCkgeworCQlwcl9lcnIoImF2MSBhbGxvYyBibW11IGJveCBmYWlsZWQhIVxuIik7CisJCS8qIGRldm1fa2ZyZWUoJnBkZXYtPmRldiwgKHZvaWQgKilodyk7ICovCisJCXZmcmVlKCh2b2lkICopaHcpOworCQlwZGF0YS0+ZGVjX3N0YXR1cyA9IE5VTEw7CisJCXJldHVybiAtMTsKKwl9CisKKwlody0+Y21hX2FsbG9jX2NvdW50ID0gUEFHRV9BTElHTih3b3JrX2J1Zl9zaXplKSAvIFBBR0VfU0laRTsKKwlyZXQgPSBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkoaHctPmJtbXVfYm94LCBXT1JLX1NQQUNFX0JVRl9JRCwKKwkJCWh3LT5jbWFfYWxsb2NfY291bnQgKiBQQUdFX1NJWkUsIERSSVZFUl9OQU1FLAorCQkJJmh3LT5jbWFfYWxsb2NfYWRkcik7CisJaWYgKHJldCA8IDApIHsKKwkJdW5pbml0X21tdV9idWZmZXJzKGh3KTsKKwkJLyogZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCAodm9pZCAqKWh3KTsgKi8KKwkJdmZyZWUoKHZvaWQgKilodyk7CisJCXBkYXRhLT5kZWNfc3RhdHVzID0gTlVMTDsKKwkJcmV0dXJuIHJldDsKKwl9CisJaHctPmJ1Zl9zdGFydCA9IGh3LT5jbWFfYWxsb2NfYWRkcjsKKwlody0+YnVmX3NpemUgPSB3b3JrX2J1Zl9zaXplOworI2VuZGlmCisKKwlody0+aW5pdF9mbGFnID0gMDsKKwlody0+Zmlyc3Rfc2NfY2hlY2tlZCA9IDA7CisJaHctPmZhdGFsX2Vycm9yID0gMDsKKwlody0+c2hvd19mcmFtZV9udW0gPSAwOworCWh3LT5ydW5fcmVhZHlfbWluX2J1Zl9udW0gPSBydW5fcmVhZHlfbWluX2J1Zl9udW07CisKKwlpZiAoZGVidWcpIHsKKwkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwgIj09PUFWMSBkZWNvZGVyIG1lbSByZXNvdXJjZSAweCVseCBzaXplIDB4JXhcbiIsCisJCQkgICBody0+YnVmX3N0YXJ0LAorCQkJICAgaHctPmJ1Zl9zaXplKTsKKwl9CisKKwlody0+Y21hX2RldiA9IHBkYXRhLT5jbWFfZGV2OworCWlmICh2YXYxX2luaXQocGRhdGEpIDwgMCkgeworCQlhdjFfcHJpbnQoaHcsIDAsICJcbmFtdmRlY19hdjEgaW5pdCBmYWlsZWQuXG4iKTsKKwkJYXYxX2xvY2FsX3VuaW5pdChodyk7CisJCXVuaW5pdF9tbXVfYnVmZmVycyhodyk7CisJCS8qIGRldm1fa2ZyZWUoJnBkZXYtPmRldiwgKHZvaWQgKilodyk7ICovCisJCXZmcmVlKCh2b2lkICopaHcpOworCQlwZGF0YS0+ZGVjX3N0YXR1cyA9IE5VTEw7CisJCXJldHVybiAtRU5PREVWOworCX0KKworI2lmZGVmIEFVWF9EQVRBX0NSQworCXZkZWNfYXV4X2RhdGFfY2hlY2tfaW5pdChwZGF0YSk7CisjZW5kaWYKKworCXZkZWNfc2V0X3ByZXBhcmVfbGV2ZWwocGRhdGEsIHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwpOworCWhldmNfc291cmNlX2NoYW5nZWQoVkZPUk1BVF9BVjEsIDQwOTYsIDIwNDgsIDYwKTsKKworCWlmIChwZGF0YS0+cGFyYWxsZWxfZGVjID09IDEpCisJCXZkZWNfY29yZV9yZXF1ZXN0KHBkYXRhLCBDT1JFX01BU0tfSEVWQyk7CisJZWxzZQorCQl2ZGVjX2NvcmVfcmVxdWVzdChwZGF0YSwgQ09SRV9NQVNLX1ZERUNfMSB8IENPUkVfTUFTS19IRVZDCisJCQkJCXwgQ09SRV9NQVNLX0NPTUJJTkUpOworCisJaHctPnBpY19saXN0X2luaXRfZG9uZTIgPSB0cnVlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtbXZkZWNfYXYxX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBBVjFIV19zICpodyA9IChzdHJ1Y3QgQVYxSFdfcyAqKQorCQkoKChzdHJ1Y3QgdmRlY19zICopKHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpKSktPnByaXZhdGUpOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGh3KTsKKwlpbnQgaTsKKwlpZiAoZGVidWcpCisJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsICJhbXZkZWNfYXYxX3JlbW92ZVxuIik7CisKKyNpZmRlZiBBVVhfREFUQV9DUkMKKwl2ZGVjX2F1eF9kYXRhX2NoZWNrX2V4aXQodmRlYyk7CisjZW5kaWYKKworCXZtYXYxX3N0b3AoaHcpOworCisJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKQorCQl2ZGVjX2NvcmVfcmVsZWFzZShod190b192ZGVjKGh3KSwgQ09SRV9NQVNLX0hFVkMpOworCWVsc2UKKwkJdmRlY19jb3JlX3JlbGVhc2UoaHdfdG9fdmRlYyhodyksIENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQyk7CisKKwl2ZGVjX3NldF9zdGF0dXMoaHdfdG9fdmRlYyhodyksIFZERUNfU1RBVFVTX0RJU0NPTk5FQ1RFRCk7CisKKwlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJZm9yIChpID0gMDsgaSA8IEZSQU1FX0JVRkZFUlM7IGkrKykgeworCQkJdmRlYy0+ZnJlZV9jYW52YXNfZXgKKwkJCQkoaHctPmNvbW1vbi5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmc1tpXS5idWYueV9jYW52YXNfaW5kZXgsCisJCQkJdmRlYy0+aWQpOworCQkJdmRlYy0+ZnJlZV9jYW52YXNfZXgKKwkJCQkoaHctPmNvbW1vbi5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmc1tpXS5idWYudXZfY2FudmFzX2luZGV4LAorCQkJCXZkZWMtPmlkKTsKKwkJfQorCX0KKworI2lmZGVmIERFQlVHX1BUUworCXByX2luZm8oInB0cyBtaXNzZWQgJWxkLCBwdHMgaGl0ICVsZCwgZHVyYXRpb24gJWRcbiIsCisJCSAgIGh3LT5wdHNfbWlzc2VkLCBody0+cHRzX2hpdCwgaHctPmZyYW1lX2R1cik7CisjZW5kaWYKKwkvKiBkZXZtX2tmcmVlKCZwZGV2LT5kZXYsICh2b2lkICopaHcpOyAqLworCWlmIChpc19yZG1hX2VuYWJsZSgpKQorCQlkbWFfZnJlZV9jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksIFJETUFfU0laRSwgaHctPnJkbWFfYWRyLCBody0+cmRtYV9waHlfYWRyKTsKKwl2ZnJlZShody0+cGJpKTsKKwlyZWxlYXNlX2RibGtfc3RydWN0KGh3KTsKKwl2ZnJlZSgodm9pZCAqKWh3KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYW1tdmRlY19hdjFfZHJpdmVyID0geworCS5wcm9iZSA9IGFtbXZkZWNfYXYxX3Byb2JlLAorCS5yZW1vdmUgPSBhbW12ZGVjX2F2MV9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBNVUxUSV9EUklWRVJfTkFNRSwKKyNpZmRlZiBDT05GSUdfUE0KKwkJLnBtID0gJmF2MV9wbV9vcHMsCisjZW5kaWYKKwl9Cit9OworI2VuZGlmCitzdGF0aWMgc3RydWN0IG1jb25maWcgYXYxX2NvbmZpZ3NbXSA9IHsKKwlNQ19QVTMyKCJiaXRfZGVwdGhfbHVtYSIsICZiaXRfZGVwdGhfbHVtYSksCisJTUNfUFUzMigiYml0X2RlcHRoX2Nocm9tYSIsICZiaXRfZGVwdGhfY2hyb21hKSwKKwlNQ19QVTMyKCJmcmFtZV93aWR0aCIsICZmcmFtZV93aWR0aCksCisJTUNfUFUzMigiZnJhbWVfaGVpZ2h0IiwgJmZyYW1lX2hlaWdodCksCisJTUNfUFUzMigiZGVidWciLCAmZGVidWcpLAorCU1DX1BVMzIoInJhZHIiLCAmcmFkciksCisJTUNfUFUzMigicnZhbCIsICZydmFsKSwKKwlNQ19QVTMyKCJwb3Bfc2hvcnRzIiwgJnBvcF9zaG9ydHMpLAorCU1DX1BVMzIoImRiZ19jbWQiLCAmZGJnX2NtZCksCisJTUNfUFUzMigiZGJnX3NraXBfZGVjb2RlX2luZGV4IiwgJmRiZ19za2lwX2RlY29kZV9pbmRleCksCisJTUNfUFUzMigiZW5kaWFuIiwgJmVuZGlhbiksCisJTUNfUFUzMigic3RlcCIsICZzdGVwKSwKKwlNQ19QVTMyKCJ1ZGVidWdfZmxhZyIsICZ1ZGVidWdfZmxhZyksCisJTUNfUFUzMigiZGVjb2RlX3BpY19iZWdpbiIsICZkZWNvZGVfcGljX2JlZ2luKSwKKwlNQ19QVTMyKCJzbGljZV9wYXJzZV9iZWdpbiIsICZzbGljZV9wYXJzZV9iZWdpbiksCisJTUNfUFUzMigiaV9vbmx5X2ZsYWciLCAmaV9vbmx5X2ZsYWcpLAorCU1DX1BVMzIoImVycm9yX2hhbmRsZV9wb2xpY3kiLCAmZXJyb3JfaGFuZGxlX3BvbGljeSksCisJTUNfUFUzMigiYnVmX2FsbG9jX3dpZHRoIiwgJmJ1Zl9hbGxvY193aWR0aCksCisJTUNfUFUzMigiYnVmX2FsbG9jX2hlaWdodCIsICZidWZfYWxsb2NfaGVpZ2h0KSwKKwlNQ19QVTMyKCJidWZfYWxsb2NfZGVwdGgiLCAmYnVmX2FsbG9jX2RlcHRoKSwKKwlNQ19QVTMyKCJidWZfYWxsb2Nfc2l6ZSIsICZidWZfYWxsb2Nfc2l6ZSksCisJTUNfUFUzMigiYnVmZmVyX21vZGUiLCAmYnVmZmVyX21vZGUpLAorCU1DX1BVMzIoImJ1ZmZlcl9tb2RlX2RiZyIsICZidWZmZXJfbW9kZV9kYmcpLAorCU1DX1BVMzIoIm1heF9idWZfbnVtIiwgJm1heF9idWZfbnVtKSwKKwlNQ19QVTMyKCJkeW5hbWljX2J1Zl9udW1fbWFyZ2luIiwgJmR5bmFtaWNfYnVmX251bV9tYXJnaW4pLAorCU1DX1BVMzIoIm1lbV9tYXBfbW9kZSIsICZtZW1fbWFwX21vZGUpLAorCU1DX1BVMzIoImRvdWJsZV93cml0ZV9tb2RlIiwgJmRvdWJsZV93cml0ZV9tb2RlKSwKKwlNQ19QVTMyKCJlbmFibGVfbWVtX3NhdmluZyIsICZlbmFibGVfbWVtX3NhdmluZyksCisJTUNfUFUzMigiZm9yY2Vfd19oIiwgJmZvcmNlX3dfaCksCisJTUNfUFUzMigiZm9yY2VfZnBzIiwgJmZvcmNlX2ZwcyksCisJTUNfUFUzMigibWF4X2RlY29kaW5nX3RpbWUiLCAmbWF4X2RlY29kaW5nX3RpbWUpLAorCU1DX1BVMzIoIm9uX25vX2tleWZyYW1lX3NraXBlZCIsICZvbl9ub19rZXlmcmFtZV9za2lwZWQpLAorCU1DX1BVMzIoInN0YXJ0X2RlY29kZV9idWZfbGV2ZWwiLCAmc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCksCisJTUNfUFUzMigiZGVjb2RlX3RpbWVvdXRfdmFsIiwgJmRlY29kZV90aW1lb3V0X3ZhbCksCisJTUNfUFUzMigiYXYxX21heF9waWNfdyIsICZhdjFfbWF4X3BpY193KSwKKwlNQ19QVTMyKCJhdjFfbWF4X3BpY19oIiwgJmF2MV9tYXhfcGljX2gpLAorfTsKK3N0YXRpYyBzdHJ1Y3QgbWNvbmZpZ19ub2RlIGF2MV9ub2RlOworCitzdGF0aWMgaW50IF9faW5pdCBhbXZkZWNfYXYxX2RyaXZlcl9pbml0X21vZHVsZSh2b2lkKQoreworCS8vc3RydWN0IEJ1ZmZJbmZvX3MgKnBfYnVmX2luZm87CisJaW50IGk7CisjaWZkZWYgQlVGTUdSX09OTFlfT0xEX0NISVAKKwlkZWJ1ZyB8PSBBT01fREVCVUdfQlVGTUdSX09OTFk7CisjZW5kaWYKKwkvKgorCWlmICh2ZGVjX2lzX3N1cHBvcnRfNGsoKSkgeworCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpCisJCQlwX2J1Zl9pbmZvID0gJmFvbV93b3JrYnVmZl9zcGVjWzFdOworCQllbHNlCisJCQlwX2J1Zl9pbmZvID0gJmFvbV93b3JrYnVmZl9zcGVjWzFdOworCX0gZWxzZQorCQlwX2J1Zl9pbmZvID0gJmFvbV93b3JrYnVmZl9zcGVjWzBdOworCisJaW5pdF9idWZmX3NwZWMoTlVMTCwgcF9idWZfaW5mbyk7CisJd29ya19idWZfc2l6ZSA9CisJCShwX2J1Zl9pbmZvLT5lbmRfYWRyIC0gcF9idWZfaW5mby0+c3RhcnRfYWRyCisJCSArIDB4ZmZmZikgJiAofjB4ZmZmZik7CisJKi8KKwlmb3IgKGkgPSAwOyBpIDwgV09SS19CVUZfU1BFQ19OVU07IGkrKykKKwkJaW5pdF9idWZmX3NwZWMoTlVMTCwgJmFvbV93b3JrYnVmZl9zcGVjW2ldKTsKKworCXByX2RlYnVnKCJhbXZkZWNfYXYxIG1vZHVsZSBpbml0XG4iKTsKKworCWVycm9yX2hhbmRsZV9wb2xpY3kgPSAwOworCisjaWZkZWYgRVJST1JfSEFORExFX0RFQlVHCisJZGJnX25hbF9za2lwX2ZsYWcgPSAwOworCWRiZ19uYWxfc2tpcF9jb3VudCA9IDA7CisjZW5kaWYKKwl1ZGVidWdfZmxhZyA9IDA7CisJZGVjb2RlX3BpY19iZWdpbiA9IDA7CisJc2xpY2VfcGFyc2VfYmVnaW4gPSAwOworCXN0ZXAgPSAwOworCWJ1Zl9hbGxvY19zaXplID0gMDsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJaWYgKHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYW1tdmRlY19hdjFfZHJpdmVyKSkKKwkJcHJfZXJyKCJmYWlsZWQgdG8gcmVnaXN0ZXIgYW1tdmRlY19hdjEgZHJpdmVyXG4iKTsKKworI2VuZGlmCisJaWYgKHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYW12ZGVjX2F2MV9kcml2ZXIpKSB7CisJCXByX2VycigiZmFpbGVkIHRvIHJlZ2lzdGVyIGFtdmRlY19hdjEgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1RCkgeworCQlhbXZkZWNfYXYxX3Byb2ZpbGUucHJvZmlsZSA9CisJCQkJIjEwYml0LCBkd3JpdGUsIGNvbXByZXNzZWQsIG5vX2hlYWQsIHY0bC11dm0iOworCX0gZWxzZSBpZiAoKChnZXRfY3B1X21ham9yX2lkKCkgPiBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVE0yKSB8fCBpc19jcHVfdG0yX3JldmIoKSkKKwkJJiYgKGdldF9jcHVfbWFqb3JfaWQoKSAhPSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDUpKSB7CisJCWFtdmRlY19hdjFfcHJvZmlsZS5wcm9maWxlID0KKwkJCQkiOGssIDEwYml0LCBkd3JpdGUsIGNvbXByZXNzZWQsIG5vX2hlYWQsIGZyYW1lX2R2LCB2NGwtdXZtIjsKKwl9IGVsc2UgeworCQlhbXZkZWNfYXYxX3Byb2ZpbGUubmFtZSA9ICJhdjFfdW5zdXBwb3J0IjsKKwl9CisKKwl2Y29kZWNfcHJvZmlsZV9yZWdpc3RlcigmYW12ZGVjX2F2MV9wcm9maWxlKTsKKwlhbXZkZWNfYXYxX3Byb2ZpbGVfbXVsdCA9IGFtdmRlY19hdjFfcHJvZmlsZTsKKyNpZmRlZiBERUJVR19VU0VfVlA5X0RFVklDRV9OQU1FCisKKwlhbXZkZWNfYXYxX3Byb2ZpbGVfbXVsdC5uYW1lID0gIm12cDkiOworCXZjb2RlY19wcm9maWxlX3JlZ2lzdGVyKCZhbXZkZWNfYXYxX3Byb2ZpbGVfbXVsdCk7CisJSU5JVF9SRUdfTk9ERV9DT05GSUdTKCJtZWRpYS5kZWNvZGVyIiwgJmF2MV9ub2RlLAorCQkidnA5IiwgYXYxX2NvbmZpZ3MsIENPTkZJR19GT1JfUlcpOworCisjZWxzZQorCWFtdmRlY19hdjFfcHJvZmlsZV9tdWx0Lm5hbWUgPSAibWF2MSI7CisJdmNvZGVjX3Byb2ZpbGVfcmVnaXN0ZXIoJmFtdmRlY19hdjFfcHJvZmlsZV9tdWx0KTsKKwlJTklUX1JFR19OT0RFX0NPTkZJR1MoIm1lZGlhLmRlY29kZXIiLCAmYXYxX25vZGUsCisJCSJhdjEiLCBhdjFfY29uZmlncywgQ09ORklHX0ZPUl9SVyk7CisjZW5kaWYKKwl2Y29kZWNfZmVhdHVyZV9yZWdpc3RlcihWRk9STUFUX0FWMSwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFtdmRlY19hdjFfZHJpdmVyX3JlbW92ZV9tb2R1bGUodm9pZCkKK3sKKwlwcl9kZWJ1ZygiYW12ZGVjX2F2MSBtb2R1bGUgcmVtb3ZlLlxuIik7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhbW12ZGVjX2F2MV9kcml2ZXIpOworI2VuZGlmCisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFtdmRlY19hdjFfZHJpdmVyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KK21vZHVsZV9wYXJhbShmb3JjZV9kdl9lbmFibGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9kdl9lbmFibGUsICJcbiBhbXZkZWNfYXYxIGZvcmNlX2R2X2VuYWJsZVxuIik7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKGJpdF9kZXB0aF9sdW1hLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoYml0X2RlcHRoX2x1bWEsICJcbiBhbXZkZWNfYXYxIGJpdF9kZXB0aF9sdW1hXG4iKTsKKworbW9kdWxlX3BhcmFtKGJpdF9kZXB0aF9jaHJvbWEsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhiaXRfZGVwdGhfY2hyb21hLCAiXG4gYW12ZGVjX2F2MSBiaXRfZGVwdGhfY2hyb21hXG4iKTsKKworbW9kdWxlX3BhcmFtKGZyYW1lX3dpZHRoLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZnJhbWVfd2lkdGgsICJcbiBhbXZkZWNfYXYxIGZyYW1lX3dpZHRoXG4iKTsKKworbW9kdWxlX3BhcmFtKGZyYW1lX2hlaWdodCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZyYW1lX2hlaWdodCwgIlxuIGFtdmRlY19hdjEgZnJhbWVfaGVpZ2h0XG4iKTsKKworbW9kdWxlX3BhcmFtKG11bHRpX2ZyYW1lc19pbl9vbmVfcGFjaywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG11bHRpX2ZyYW1lc19pbl9vbmVfcGFjaywgIlxuIG11bHRpX2ZyYW1lc19pbl9vbmVfcGFja1xuIik7CisKK21vZHVsZV9wYXJhbShkZWJ1ZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiXG4gYW12ZGVjX2F2MSBkZWJ1Z1xuIik7CisKK21vZHVsZV9wYXJhbShyYWRyLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocmFkciwgIlxuIHJhZHJcbiIpOworCittb2R1bGVfcGFyYW0ocnZhbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJ2YWwsICJcbiBydmFsXG4iKTsKKworbW9kdWxlX3BhcmFtKHBvcF9zaG9ydHMsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhwb3Bfc2hvcnRzLCAiXG4gcnZhbFxuIik7CisKK21vZHVsZV9wYXJhbShkYmdfY21kLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGJnX2NtZCwgIlxuIGRiZ19jbWRcbiIpOworCittb2R1bGVfcGFyYW0oZGJnX3NraXBfZGVjb2RlX2luZGV4LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGJnX3NraXBfZGVjb2RlX2luZGV4LCAiXG4gZGJnX3NraXBfZGVjb2RlX2luZGV4XG4iKTsKKworbW9kdWxlX3BhcmFtKGVuZGlhbiwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuZGlhbiwgIlxuIHJ2YWxcbiIpOworCittb2R1bGVfcGFyYW0oc3RlcCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHN0ZXAsICJcbiBhbXZkZWNfYXYxIHN0ZXBcbiIpOworCittb2R1bGVfcGFyYW0oZGVjb2RlX3BpY19iZWdpbiwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlY29kZV9waWNfYmVnaW4sICJcbiBhbXZkZWNfYXYxIGRlY29kZV9waWNfYmVnaW5cbiIpOworCittb2R1bGVfcGFyYW0oc2xpY2VfcGFyc2VfYmVnaW4sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhzbGljZV9wYXJzZV9iZWdpbiwgIlxuIGFtdmRlY19hdjEgc2xpY2VfcGFyc2VfYmVnaW5cbiIpOworCittb2R1bGVfcGFyYW0oaV9vbmx5X2ZsYWcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhpX29ubHlfZmxhZywgIlxuIGFtdmRlY19hdjEgaV9vbmx5X2ZsYWdcbiIpOworCittb2R1bGVfcGFyYW0obG93X2xhdGVuY3lfZmxhZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGxvd19sYXRlbmN5X2ZsYWcsICJcbiBhbXZkZWNfYXYxIGxvd19sYXRlbmN5X2ZsYWdcbiIpOworCittb2R1bGVfcGFyYW0obm9faGVhZCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vX2hlYWQsICJcbiBhbXZkZWNfYXYxIG5vX2hlYWRcbiIpOworCittb2R1bGVfcGFyYW0oZXJyb3JfaGFuZGxlX3BvbGljeSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVycm9yX2hhbmRsZV9wb2xpY3ksICJcbiBhbXZkZWNfYXYxIGVycm9yX2hhbmRsZV9wb2xpY3lcbiIpOworCittb2R1bGVfcGFyYW0oYnVmX2FsbG9jX3dpZHRoLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoYnVmX2FsbG9jX3dpZHRoLCAiXG4gYnVmX2FsbG9jX3dpZHRoXG4iKTsKKworbW9kdWxlX3BhcmFtKGJ1Zl9hbGxvY19oZWlnaHQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhidWZfYWxsb2NfaGVpZ2h0LCAiXG4gYnVmX2FsbG9jX2hlaWdodFxuIik7CisKK21vZHVsZV9wYXJhbShidWZfYWxsb2NfZGVwdGgsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhidWZfYWxsb2NfZGVwdGgsICJcbiBidWZfYWxsb2NfZGVwdGhcbiIpOworCittb2R1bGVfcGFyYW0oYnVmX2FsbG9jX3NpemUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhidWZfYWxsb2Nfc2l6ZSwgIlxuIGJ1Zl9hbGxvY19zaXplXG4iKTsKKworbW9kdWxlX3BhcmFtKGJ1ZmZlcl9tb2RlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoYnVmZmVyX21vZGUsICJcbiBidWZmZXJfbW9kZVxuIik7CisKK21vZHVsZV9wYXJhbShidWZmZXJfbW9kZV9kYmcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhidWZmZXJfbW9kZV9kYmcsICJcbiBidWZmZXJfbW9kZV9kYmdcbiIpOworLypVU0VfQlVGX0JMT0NLKi8KK21vZHVsZV9wYXJhbShtYXhfYnVmX251bSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9idWZfbnVtLCAiXG4gbWF4X2J1Zl9udW1cbiIpOworCittb2R1bGVfcGFyYW0oZHluYW1pY19idWZfbnVtX21hcmdpbiwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGR5bmFtaWNfYnVmX251bV9tYXJnaW4sICJcbiBkeW5hbWljX2J1Zl9udW1fbWFyZ2luXG4iKTsKKworbW9kdWxlX3BhcmFtKG12X2J1Zl9tYXJnaW4sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhtdl9idWZfbWFyZ2luLCAiXG4gbXZfYnVmX21hcmdpblxuIik7CisKK21vZHVsZV9wYXJhbShtdl9idWZfZHluYW1pY19hbGxvYywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG12X2J1Zl9keW5hbWljX2FsbG9jLCAiXG4gbXZfYnVmX2R5bmFtaWNfYWxsb2NcbiIpOworCittb2R1bGVfcGFyYW0oZm9yY2VfbWF4X29uZV9tdl9idWZmZXJfc2l6ZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX21heF9vbmVfbXZfYnVmZmVyX3NpemUsICJcbiBmb3JjZV9tYXhfb25lX212X2J1ZmZlcl9zaXplXG4iKTsKKworbW9kdWxlX3BhcmFtKHJ1bl9yZWFkeV9taW5fYnVmX251bSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJ1bl9yZWFkeV9taW5fYnVmX251bSwgIlxuIHJ1bl9yZWFkeV9taW5fYnVmX251bVxuIik7CisKKy8qKi8KKworbW9kdWxlX3BhcmFtKG1lbV9tYXBfbW9kZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG1lbV9tYXBfbW9kZSwgIlxuIG1lbV9tYXBfbW9kZVxuIik7CisKKyNpZmRlZiBTVVBQT1JUXzEwQklUCittb2R1bGVfcGFyYW0oZG91YmxlX3dyaXRlX21vZGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkb3VibGVfd3JpdGVfbW9kZSwgIlxuIGRvdWJsZV93cml0ZV9tb2RlXG4iKTsKKworbW9kdWxlX3BhcmFtKGVuYWJsZV9tZW1fc2F2aW5nLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlX21lbV9zYXZpbmcsICJcbiBlbmFibGVfbWVtX3NhdmluZ1xuIik7CisKK21vZHVsZV9wYXJhbShmb3JjZV93X2gsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV93X2gsICJcbiBmb3JjZV93X2hcbiIpOworI2VuZGlmCisKK21vZHVsZV9wYXJhbShmb3JjZV9mcHMsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9mcHMsICJcbiBmb3JjZV9mcHNcbiIpOworCittb2R1bGVfcGFyYW0obWF4X2RlY29kaW5nX3RpbWUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfZGVjb2RpbmdfdGltZSwgIlxuIG1heF9kZWNvZGluZ190aW1lXG4iKTsKKworbW9kdWxlX3BhcmFtKG9uX25vX2tleWZyYW1lX3NraXBlZCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG9uX25vX2tleWZyYW1lX3NraXBlZCwgIlxuIG9uX25vX2tleWZyYW1lX3NraXBlZFxuIik7CisKKyNpZmRlZiBNQ1JDQ19FTkFCTEUKK21vZHVsZV9wYXJhbShtY3JjY19jYWNoZV9hbGdfZmxhZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG1jcmNjX2NhY2hlX2FsZ19mbGFnLCAiXG4gbWNyY2NfY2FjaGVfYWxnX2ZsYWdcbiIpOworI2VuZGlmCisKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCittb2R1bGVfcGFyYW0oc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCwgaW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCwKKwkJIlxuIGF2MSBzdGFydF9kZWNvZGVfYnVmX2xldmVsXG4iKTsKKworbW9kdWxlX3BhcmFtKGRlY29kZV90aW1lb3V0X3ZhbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlY29kZV90aW1lb3V0X3ZhbCwKKwkiXG4gYXYxIGRlY29kZV90aW1lb3V0X3ZhbFxuIik7CisKK21vZHVsZV9wYXJhbShhdjFfbWF4X3BpY193LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoYXYxX21heF9waWNfdywgIlxuIGF2MV9tYXhfcGljX3dcbiIpOworCittb2R1bGVfcGFyYW0oYXYxX21heF9waWNfaCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGF2MV9tYXhfcGljX2gsICJcbiBhdjFfbWF4X3BpY19oXG4iKTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGRlY29kZV9mcmFtZV9jb3VudCwgdWludCwKKwkmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCittb2R1bGVfcGFyYW1fYXJyYXkoZGlzcGxheV9mcmFtZV9jb3VudCwgdWludCwKKwkmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCittb2R1bGVfcGFyYW1fYXJyYXkobWF4X3Byb2Nlc3NfdGltZSwgdWludCwKKwkmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCittb2R1bGVfcGFyYW1fYXJyYXkocnVuX2NvdW50LCB1aW50LAorCSZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisKK21vZHVsZV9wYXJhbV9hcnJheShpbnB1dF9lbXB0eSwgdWludCwKKwkmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCittb2R1bGVfcGFyYW1fYXJyYXkobm90X3J1bl9yZWFkeSwgdWludCwKKwkmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKK21vZHVsZV9wYXJhbV9hcnJheShkd19tbXVfZW5hYmxlLCB1aW50LAorCSZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKHByZWZpeF9hdXhfYnVmX3NpemUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhwcmVmaXhfYXV4X2J1Zl9zaXplLCAiXG4gcHJlZml4X2F1eF9idWZfc2l6ZVxuIik7CisKK21vZHVsZV9wYXJhbShzdWZmaXhfYXV4X2J1Zl9zaXplLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3VmZml4X2F1eF9idWZfc2l6ZSwgIlxuIHN1ZmZpeF9hdXhfYnVmX3NpemVcbiIpOworCisjZW5kaWYKKworI2lmZGVmIERVTVBfRklMTUdSQUlOCittb2R1bGVfcGFyYW0oZmdfZHVtcF9pbmRleCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZnX2R1bXBfaW5kZXgsICJcbiBmZ19kdW1wX2luZGV4XG4iKTsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0oZ2V0X3BpY3R1cmVfcW9zLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZ2V0X3BpY3R1cmVfcW9zLCAiXG4gYW12ZGVjX2F2MSBnZXRfcGljdHVyZV9xb3NcbiIpOworCittb2R1bGVfcGFyYW0oZm9yY2VfYnVmc3BlYywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2J1ZnNwZWMsICJcbiBhbXZkZWNfaDI2NSBmb3JjZV9idWZzcGVjXG4iKTsKKworbW9kdWxlX3BhcmFtKHVkZWJ1Z19mbGFnLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModWRlYnVnX2ZsYWcsICJcbiBhbXZkZWNfaDI2NSB1ZGVidWdfZmxhZ1xuIik7CisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorbW9kdWxlX3BhcmFtKGR2X3RvZ2dsZV9wcm92X25hbWUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkdl90b2dnbGVfcHJvdl9uYW1lLCAiXG4gZHZfdG9nZ2xlX3Byb3ZfbmFtZVxuIik7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKHVkZWJ1Z19wYXVzZV9wb3MsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh1ZGVidWdfcGF1c2VfcG9zLCAiXG4gdWRlYnVnX3BhdXNlX3Bvc1xuIik7CisKK21vZHVsZV9wYXJhbSh1ZGVidWdfcGF1c2VfdmFsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModWRlYnVnX3BhdXNlX3ZhbCwgIlxuIHVkZWJ1Z19wYXVzZV92YWxcbiIpOworCittb2R1bGVfcGFyYW0odWRlYnVnX3BhdXNlX2RlY29kZV9pZHgsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeCwgIlxuIHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4XG4iKTsKKworI2lmZGVmIERFQlVHX0NSQ19FUlJPUgorbW9kdWxlX3BhcmFtKGNyY19kZWJ1Z19mbGFnLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoY3JjX2RlYnVnX2ZsYWcsICJcbiBjcmNfZGVidWdfZmxhZ1xuIik7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX0NNRAorbW9kdWxlX3BhcmFtKGRlYnVnX2NtZF93YWl0X3R5cGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1Z19jbWRfd2FpdF90eXBlLCAiXG4gZGVidWdfY21kX3dhaXRfdHlwZVxuIik7CisKK21vZHVsZV9wYXJhbShkZWJ1Z19jbWRfd2FpdF9jb3VudCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnX2NtZF93YWl0X2NvdW50LCAiXG4gZGVidWdfY21kX3dhaXRfY291bnRcbiIpOworCittb2R1bGVfcGFyYW0oaGVhZGVyX2R1bXBfc2l6ZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGhlYWRlcl9kdW1wX3NpemUsICJcbiBoZWFkZXJfZHVtcF9zaXplXG4iKTsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0oZm9yY2VfcHRzX3Vuc3RhYmxlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2VfcHRzX3Vuc3RhYmxlLCAiXG4gZm9yY2VfcHRzX3Vuc3RhYmxlXG4iKTsKKworbW9kdWxlX3BhcmFtKHdpdGhvdXRfZGlzcGxheV9tb2RlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Mod2l0aG91dF9kaXNwbGF5X21vZGUsICJcbiB3aXRob3V0X2Rpc3BsYXlfbW9kZVxuIik7CisKK21vZHVsZV9wYXJhbSh2NGxfYml0c3RyZWFtX2lkX2VuYWJsZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHY0bF9iaXRzdHJlYW1faWRfZW5hYmxlLCAiXG4gdjRsX2JpdHN0cmVhbV9pZF9lbmFibGVcbiIpOworCittb2R1bGVfaW5pdChhbXZkZWNfYXYxX2RyaXZlcl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChhbXZkZWNfYXYxX2RyaXZlcl9yZW1vdmVfbW9kdWxlKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTUxPR0lDIGF2MSBWaWRlbyBEZWNvZGVyIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdmF2MS92YXYxLmggYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdmF2MS92YXYxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYyYjc2NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci92YXYxL3ZhdjEuaApAQCAtMCwwICsxLDIyIEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL2FtcG9ydHMvdmF2MS5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgVkFWMV9ICisjZGVmaW5lIFZBVjFfSAordm9pZCBhZGFwdF9jb2VmX3Byb2JzKGludCBwaWNfY291bnQsIGludCBwcmV2X2tmLCBpbnQgY3VyX2tmLCBpbnQgcHJlX2ZjLAordW5zaWduZWQgaW50ICpwcmV2X3Byb2IsIHVuc2lnbmVkIGludCAqY3VyX3Byb2IsIHVuc2lnbmVkIGludCAqY291bnQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdmMxL01ha2VmaWxlIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3ZjMS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDNhNjAwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3ZjMS9NYWtlZmlsZQpAQCAtMCwwICsxLDIgQEAKK29iai0kKENPTkZJR19BTUxPR0lDX01FRElBX1ZERUNfVkMxKSArPSBhbXZkZWNfdmMxLm8KK2FtdmRlY192YzEtb2JqcyArPSB2dmMxLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci92YzEvdnZjMS5jIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3ZjMS92dmMxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYwZGZhOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci92YzEvdnZjMS5jCkBAIC0wLDAgKzEsMTQ0MCBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9hbXBvcnRzL3Z2YzEuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2RlZmluZSBERUJVRworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy9hbXN0cmVhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZnJhbWVfc3luYy9wdHNzZXJ2Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jYW52YXMvY2FudmFzLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jYW52YXMvY2FudmFzX21nci5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdmZtL3ZmcmFtZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdmZtL3ZmcmFtZV9wcm92aWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdmZtL3ZmcmFtZV9yZWNlaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmRlY19yZWcuaD4KKyNpbmNsdWRlICIuLi91dGlscy9hbXZkZWMuaCIKKyNpbmNsdWRlICIuLi91dGlscy92ZGVjLmgiCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9yZWdpc3RlcnMvcmVnaXN0ZXIuaD4KKyNpbmNsdWRlICIuLi8uLi8uLi9zdHJlYW1faW5wdXQvYW1wb3J0cy9hbXBvcnRzX3ByaXYuaCIKKyNpbmNsdWRlICIuLi91dGlscy9kZWNvZGVyX21tdV9ib3guaCIKKyNpbmNsdWRlICIuLi91dGlscy9kZWNvZGVyX2JtbXVfYm94LmgiCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jb2RlY19tbS9jb2RlY19tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29uZmlncy5oPgorI2luY2x1ZGUgIi4uL3V0aWxzL2Zpcm13YXJlLmgiCisvLyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL3RlZS5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvdGVlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlICIuLi8uLi8uLi9jb21tb24vY2hpcHMvZGVjb2Rlcl9jcHVfdmVyX2luZm8uaCIKKyNpbmNsdWRlICIuLi91dGlscy92ZGVjX2ZlYXR1cmUuaCIKKworI2RlZmluZSBEUklWRVJfTkFNRSAiYW12ZGVjX3ZjMSIKKyNkZWZpbmUgTU9EVUxFX05BTUUgImFtdmRlY192YzEiCisKKyNkZWZpbmUgREVCVUdfUFRTCisjaWYgMQkvKiAvL01FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09ONiAqLworI2RlZmluZSBOVjIxCisjZW5kaWYKKworI2RlZmluZSBWQzFfTUFYX1NVUFBPUlRfU0laRSAoMTkyMCoxMDg4KQorCisjZGVmaW5lIElfUElDVFVSRSAgIDAKKyNkZWZpbmUgUF9QSUNUVVJFICAgMQorI2RlZmluZSBCX1BJQ1RVUkUgICAyCisKKyNkZWZpbmUgT1JJX0JVRkZFUl9TVEFSVF9BRERSICAgMHgwMTAwMDAwMAorCisjZGVmaW5lIElOVEVSTEFDRV9GTEFHICAgICAgICAgIDB4ODAKKyNkZWZpbmUgQk9UVE9NX0ZJRUxEX0ZJUlNUX0ZMQUcgMHg0MAorCisvKiBwcm90b2NvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgVkMxX1BJQ19SQVRJTyAgICAgICBBVl9TQ1JBVENIXzAKKyNkZWZpbmUgVkMxX0VSUk9SX0NPVU5UICAgIEFWX1NDUkFUQ0hfNgorI2RlZmluZSBWQzFfU09TX0NPVU5UICAgICBBVl9TQ1JBVENIXzcKKyNkZWZpbmUgVkMxX0JVRkZFUklOICAgICAgIEFWX1NDUkFUQ0hfOAorI2RlZmluZSBWQzFfQlVGRkVST1VUICAgICAgQVZfU0NSQVRDSF85CisjZGVmaW5lIFZDMV9SRVBFQVRfQ09VTlQgICAgQVZfU0NSQVRDSF9BCisjZGVmaW5lIFZDMV9USU1FX1NUQU1QICAgICAgQVZfU0NSQVRDSF9CCisjZGVmaW5lIFZDMV9PRkZTRVRfUkVHICAgICAgQVZfU0NSQVRDSF9DCisjZGVmaW5lIE1FTV9PRkZTRVRfUkVHICAgICAgQVZfU0NSQVRDSF9GCisKKyNkZWZpbmUgVkZfUE9PTF9TSVpFCQkxNgorI2RlZmluZSBERUNPREVfQlVGRkVSX05VTV9NQVgJNAorI2RlZmluZSBXT1JLU1BBQ0VfU0laRQkJKDIgKiBTWl8xTSkKKyNkZWZpbmUgTUFYX0JNTVVfQlVGRkVSX05VTQkoREVDT0RFX0JVRkZFUl9OVU1fTUFYICsgMSkKKyNkZWZpbmUgVkZfQlVGRkVSX0lEWChuKQkoMSArIG4pCisjZGVmaW5lIERDQUNfQlVGRl9TVEFSVF9BRERSCTB4MDFmMDAwMDAKKworCisjZGVmaW5lIFBVVF9JTlRFUlZBTCAgICAgICAgKEhaLzEwMCkKKworI2lmIDEJLyogL01FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09ONiAqLworLyogVE9ETzogbW92ZSB0byByZWdpc3RlciBoZWFkZXJzICovCisjZGVmaW5lIFZQUF9WRDFfUE9TVEJMRU5EICAgICAgICgxIDw8IDEwKQorI2RlZmluZSBNRU1fRklGT19DTlRfQklUICAgICAgICAxNgorI2RlZmluZSBNRU1fTEVWRUxfQ05UX0JJVCAgICAgICAxOAorI2VuZGlmCitzdGF0aWMgc3RydWN0IHZkZWNfaW5mbyAqZ3ZzOworc3RhdGljIHN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBOVUxMOworCitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2dmMxX3ZmX3BlZWsodm9pZCAqKTsKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZ2YzFfdmZfZ2V0KHZvaWQgKik7CitzdGF0aWMgdm9pZCB2dmMxX3ZmX3B1dChzdHJ1Y3QgdmZyYW1lX3MgKiwgdm9pZCAqKTsKK3N0YXRpYyBpbnQgdnZjMV92Zl9zdGF0ZXMoc3RydWN0IHZmcmFtZV9zdGF0ZXMgKnN0YXRlcywgdm9pZCAqKTsKK3N0YXRpYyBpbnQgdnZjMV9ldmVudF9jYihpbnQgdHlwZSwgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKKworc3RhdGljIGludCB2dmMxX3Byb3RfaW5pdCh2b2lkKTsKK3N0YXRpYyB2b2lkIHZ2YzFfbG9jYWxfaW5pdChib29sIGlzX3Jlc2V0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgdnZjMV9kZWNfaWRbXSA9ICJ2dmMxLWRldiI7CisKKyNkZWZpbmUgUFJPVklERVJfTkFNRSAgICJkZWNvZGVyLnZjMSIKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmZyYW1lX29wZXJhdGlvbnNfcyB2dmMxX3ZmX3Byb3ZpZGVyID0geworCS5wZWVrID0gdnZjMV92Zl9wZWVrLAorCS5nZXQgPSB2dmMxX3ZmX2dldCwKKwkucHV0ID0gdnZjMV92Zl9wdXQsCisJLmV2ZW50X2NiID0gdnZjMV9ldmVudF9jYiwKKwkudmZfc3RhdGVzID0gdnZjMV92Zl9zdGF0ZXMsCit9Oworc3RhdGljIHZvaWQgKm1tX2Jsa19oYW5kbGU7CitzdGF0aWMgc3RydWN0IHZmcmFtZV9wcm92aWRlcl9zIHZ2YzFfdmZfcHJvdjsKKworc3RhdGljIERFQ0xBUkVfS0ZJRk8obmV3ZnJhbWVfcSwgc3RydWN0IHZmcmFtZV9zICosIFZGX1BPT0xfU0laRSk7CitzdGF0aWMgREVDTEFSRV9LRklGTyhkaXNwbGF5X3EsIHN0cnVjdCB2ZnJhbWVfcyAqLCBWRl9QT09MX1NJWkUpOworc3RhdGljIERFQ0xBUkVfS0ZJRk8ocmVjeWNsZV9xLCBzdHJ1Y3QgdmZyYW1lX3MgKiwgVkZfUE9PTF9TSVpFKTsKKworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyB2ZnBvb2xbVkZfUE9PTF9TSVpFXTsKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgdmZwb29sMltWRl9QT09MX1NJWkVdOworc3RhdGljIGludCBjdXJfcG9vbF9pZHg7CisKK3N0YXRpYyBzMzIgdmZidWZfdXNlW0RFQ09ERV9CVUZGRVJfTlVNX01BWF07CitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgcmVjeWNsZV90aW1lcjsKK3N0YXRpYyB1MzIgc3RhdDsKK3N0YXRpYyB1MzIgYnVmX3NpemUgPSAzMiAqIDEwMjQgKiAxMDI0Oworc3RhdGljIHUzMiBidWZfb2Zmc2V0Oworc3RhdGljIHUzMiBhdmlfZmxhZzsKK3N0YXRpYyB1MzIgdW5zdGFibGVfcHRzX2RlYnVnOworc3RhdGljIHUzMiB1bnN0YWJsZV9wdHM7CitzdGF0aWMgdTMyIHZ2YzFfcmF0aW87CitzdGF0aWMgdTMyIHZ2YzFfZm9ybWF0OworCitzdGF0aWMgdTMyIGludHJhX291dHB1dDsKK3N0YXRpYyB1MzIgZnJhbWVfd2lkdGgsIGZyYW1lX2hlaWdodCwgZnJhbWVfZHVyOworc3RhdGljIHUzMiBzYXZlZF9yZXNvbHV0aW9uOworc3RhdGljIHUzMiBwdHNfYnlfb2Zmc2V0ID0gMTsKK3N0YXRpYyB1MzIgdG90YWxfZnJhbWU7CitzdGF0aWMgdTMyIG5leHRfcHRzOworc3RhdGljIHU2NCBuZXh0X3B0c191czY0Oworc3RhdGljIGJvb2wgaXNfcmVzZXQ7CitzdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IHNldF9jbGtfd29yazsKK3N0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3QgZXJyb3Jfd2Rfd29yazsKK3N0YXRpYyBzdHJ1Y3QgY2FudmFzX2NvbmZpZ19zIHZjMV9jYW52YXNfY29uZmlnW0RFQ09ERV9CVUZGRVJfTlVNX01BWF1bM107CitzcGlubG9ja190IHZjMV9ycF9sb2NrOworCisKKyNpZmRlZiBERUJVR19QVFMKK3N0YXRpYyB1MzIgcHRzX2hpdCwgcHRzX21pc3NlZCwgcHRzX2lfaGl0LCBwdHNfaV9taXNzZWQ7CisjZW5kaWYKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7CisKK3N0YXRpYyBzdHJ1Y3QgZGVjX3N5c2luZm8gdnZjMV9hbXN0cmVhbV9kZWNfaW5mbzsKKworc3RydWN0IGZybV9zIHsKKwlpbnQgc3RhdGU7CisJdTMyIHN0YXJ0X3B0czsKKwlpbnQgbnVtOworCXUzMiBlbmRfcHRzOworCXUzMiByYXRlOworCXUzMiB0cnltYXg7Cit9OworCitzdGF0aWMgc3RydWN0IGZybV9zIGZybTsKKworZW51bSB7CisJUkFURV9NRUFTVVJFX1NUQVJUX1BUUyA9IDAsCisJUkFURV9NRUFTVVJFX0VORF9QVFMsCisJUkFURV9NRUFTVVJFX0RPTkUKK307CisjZGVmaW5lIFJBVEVfTUVBU1VSRV9OVU0gOAorI2RlZmluZSBSQVRFX0NPUlJFQ1RJT05fVEhSRVNIT0xEIDUKKyNkZWZpbmUgUkFURV8yNF9GUFMgIDM3NTUJLyogMjMuOTcgKi8KKyNkZWZpbmUgUkFURV8zMF9GUFMgIDMwMDMJLyogMjkuOTcgKi8KKyNkZWZpbmUgRFVSMlBUUyh4KSAoKHgpKjkwLzk2KQorI2RlZmluZSBQVFMyRFVSKHgpICgoeCkqOTYvOTApCisKK3N0YXRpYyBpbmxpbmUgaW50IHBvb2xfaW5kZXgoc3RydWN0IHZmcmFtZV9zICp2ZikKK3sKKwlpZiAoKHZmID49ICZ2ZnBvb2xbMF0pICYmICh2ZiA8PSAmdmZwb29sW1ZGX1BPT0xfU0laRSAtIDFdKSkKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAoKHZmID49ICZ2ZnBvb2wyWzBdKSAmJiAodmYgPD0gJnZmcG9vbDJbVkZfUE9PTF9TSVpFIC0gMV0pKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSBib29sIGNsb3NlX3RvKGludCBhLCBpbnQgYiwgaW50IG0pCit7CisJcmV0dXJuIGFicyhhIC0gYikgPCBtOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBpbmRleDJjYW52YXModTMyIGluZGV4KQoreworCWNvbnN0IHUzMiBjYW52YXNfdGFiW0RFQ09ERV9CVUZGRVJfTlVNX01BWF0gPSB7CisjaWYgMQkvKiBBTFdBU1kuTUVTT05fQ1BVX1RZUEUgPj0gTUVTT05fQ1BVX1RZUEVfTUVTT042ICovCisJMHgwMTAxMDAsIDB4MDMwMzAyLCAweDA1MDUwNCwgMHgwNzA3MDYvKiwKKwkweDA5MDkwOCwgMHgwYjBiMGEsIDB4MGQwZDBjLCAweDBmMGYwZSovCisjZWxzZQorCQkweDAyMDEwMCwgMHgwNTA0MDMsIDB4MDgwNzA2LCAweDBiMGEwOQorI2VuZGlmCisJfTsKKworCXJldHVybiBjYW52YXNfdGFiW2luZGV4XTsKK30KKworc3RhdGljIHZvaWQgc2V0X2FzcGVjdF9yYXRpbyhzdHJ1Y3QgdmZyYW1lX3MgKnZmLCB1bnNpZ25lZCBpbnQgcGl4ZWxfcmF0aW8pCit7CisJaW50IGFyID0gMDsKKworCWlmICh2dmMxX3JhdGlvID09IDApIHsKKwkJLyogYWx3YXlzIHN0cmV0Y2ggdG8gMTY6OSAqLworCQl2Zi0+cmF0aW9fY29udHJvbCB8PSAoMHg5MCA8PCBESVNQX1JBVElPX0FTUEVDVF9SQVRJT19CSVQpOworCX0gZWxzZSBpZiAocGl4ZWxfcmF0aW8gPiAweDBmKSB7CisJCWFyID0gKHZ2YzFfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0ICogKHBpeGVsX3JhdGlvICYgMHhmZikgKgorCQkJICB2dmMxX3JhdGlvKSAvICh2dmMxX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoICoKKwkJCQkJCQkgKHBpeGVsX3JhdGlvID4+IDgpKTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKHBpeGVsX3JhdGlvKSB7CisJCWNhc2UgMDoKKwkJCWFyID0gKHZ2YzFfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0ICogdnZjMV9yYXRpbykgLworCQkJCSB2dmMxX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXZmLT5zYXJfd2lkdGggPSAxOworCQkJdmYtPnNhcl9oZWlnaHQgPSAxOworCQkJYXIgPSAodmYtPmhlaWdodCAqIHZ2YzFfcmF0aW8pIC8gdmYtPndpZHRoOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXZmLT5zYXJfd2lkdGggPSAxMjsKKwkJCXZmLT5zYXJfaGVpZ2h0ID0gMTE7CisJCQlhciA9ICh2Zi0+aGVpZ2h0ICogMTEgKiB2dmMxX3JhdGlvKSAvICh2Zi0+d2lkdGggKiAxMik7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJdmYtPnNhcl93aWR0aCA9IDEwOworCQkJdmYtPnNhcl9oZWlnaHQgPSAxMTsKKwkJCWFyID0gKHZmLT5oZWlnaHQgKiAxMSAqIHZ2YzFfcmF0aW8pIC8gKHZmLT53aWR0aCAqIDEwKTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQl2Zi0+c2FyX3dpZHRoID0gMTY7CisJCQl2Zi0+c2FyX2hlaWdodCA9IDExOworCQkJYXIgPSAodmYtPmhlaWdodCAqIDExICogdnZjMV9yYXRpbykgLyAodmYtPndpZHRoICogMTYpOworCQkJYnJlYWs7CisJCWNhc2UgNToKKwkJCXZmLT5zYXJfd2lkdGggPSA0MDsKKwkJCXZmLT5zYXJfaGVpZ2h0ID0gMzM7CisJCQlhciA9ICh2Zi0+aGVpZ2h0ICogMzMgKiB2dmMxX3JhdGlvKSAvICh2Zi0+d2lkdGggKiA0MCk7CisJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJdmYtPnNhcl93aWR0aCA9IDI0OworCQkJdmYtPnNhcl9oZWlnaHQgPSAxMTsKKwkJCWFyID0gKHZmLT5oZWlnaHQgKiAxMSAqIHZ2YzFfcmF0aW8pIC8gKHZmLT53aWR0aCAqIDI0KTsKKwkJCWJyZWFrOworCQljYXNlIDc6CisJCQl2Zi0+c2FyX3dpZHRoID0gMjA7CisJCQl2Zi0+c2FyX2hlaWdodCA9IDExOworCQkJYXIgPSAodmYtPmhlaWdodCAqIDExICogdnZjMV9yYXRpbykgLyAodmYtPndpZHRoICogMjApOworCQkJYnJlYWs7CisJCWNhc2UgODoKKwkJCXZmLT5zYXJfd2lkdGggPSAzMjsKKwkJCXZmLT5zYXJfaGVpZ2h0ID0gMTE7CisJCQlhciA9ICh2Zi0+aGVpZ2h0ICogMTEgKiB2dmMxX3JhdGlvKSAvICh2Zi0+d2lkdGggKiAzMik7CisJCQlicmVhazsKKwkJY2FzZSA5OgorCQkJdmYtPnNhcl93aWR0aCA9IDgwOworCQkJdmYtPnNhcl9oZWlnaHQgPSAzMzsKKwkJCWFyID0gKHZmLT5oZWlnaHQgKiAzMyAqIHZ2YzFfcmF0aW8pIC8gKHZmLT53aWR0aCAqIDgwKTsKKwkJCWJyZWFrOworCQljYXNlIDEwOgorCQkJdmYtPnNhcl93aWR0aCA9IDE4OworCQkJdmYtPnNhcl9oZWlnaHQgPSAxMTsKKwkJCWFyID0gKHZmLT5oZWlnaHQgKiAxMSAqIHZ2YzFfcmF0aW8pIC8gKHZmLT53aWR0aCAqIDE4KTsKKwkJCWJyZWFrOworCQljYXNlIDExOgorCQkJdmYtPnNhcl93aWR0aCA9IDE1OworCQkJdmYtPnNhcl9oZWlnaHQgPSAxMTsKKwkJCWFyID0gKHZmLT5oZWlnaHQgKiAxMSAqIHZ2YzFfcmF0aW8pIC8gKHZmLT53aWR0aCAqIDE1KTsKKwkJCWJyZWFrOworCQljYXNlIDEyOgorCQkJdmYtPnNhcl93aWR0aCA9IDY0OworCQkJdmYtPnNhcl9oZWlnaHQgPSAzMzsKKwkJCWFyID0gKHZmLT5oZWlnaHQgKiAzMyAqIHZ2YzFfcmF0aW8pIC8gKHZmLT53aWR0aCAqIDY0KTsKKwkJCWJyZWFrOworCQljYXNlIDEzOgorCQkJdmYtPnNhcl93aWR0aCA9IDE2MDsKKwkJCXZmLT5zYXJfaGVpZ2h0ID0gOTk7CisJCQlhciA9ICh2Zi0+aGVpZ2h0ICogOTkgKiB2dmMxX3JhdGlvKSAvCisJCQkJKHZmLT53aWR0aCAqIDE2MCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXZmLT5zYXJfd2lkdGggPSAxOworCQkJdmYtPnNhcl9oZWlnaHQgPSAxOworCQkJYXIgPSAodmYtPmhlaWdodCAqIHZ2YzFfcmF0aW8pIC8gdmYtPndpZHRoOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlhciA9IG1pbihhciwgRElTUF9SQVRJT19BU1BFQ1RfUkFUSU9fTUFYKTsKKworCXZmLT5yYXRpb19jb250cm9sID0gKGFyIDw8IERJU1BfUkFUSU9fQVNQRUNUX1JBVElPX0JJVCk7CisJLyp2Zi0+cmF0aW9fY29udHJvbCB8PSBESVNQX1JBVElPX0ZPUkNFQ09ORklHIHwgRElTUF9SQVRJT19LRUVQUkFUSU87Ki8KK30KKworc3RhdGljIHZvaWQgdmMxX3NldF9ycCh2b2lkKSB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2YzFfcnBfbG9jaywgZmxhZ3MpOworCVNUQlVGX1dSSVRFKCZ2ZGVjLT52YnVmLCBzZXRfcnAsCisJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZjMV9ycF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB2dmMxX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJdTMyIHJlZzsKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmID0gTlVMTDsKKwl1MzIgcmVwZWF0X2NvdW50OworCXUzMiBwaWN0dXJlX3R5cGU7CisJdTMyIGJ1ZmZlcl9pbmRleDsKKwl1bnNpZ25lZCBpbnQgcHRzLCBwdHNfdmFsaWQgPSAwLCBvZmZzZXQgPSAwOworCXUzMiB2X3dpZHRoLCB2X2hlaWdodDsKKwl1NjQgcHRzX3VzNjQgPSAwOworCXUzMiBmcmFtZV9zaXplOworCisJcmVnID0gUkVBRF9WUkVHKFZDMV9CVUZGRVJPVVQpOworCisJaWYgKHJlZykgeworCQl2X3dpZHRoID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfSik7CisJCXZfaGVpZ2h0ID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfSyk7CisKKwkJdmMxX3NldF9ycCgpOworCisJCWlmICh2X3dpZHRoICYmIHZfd2lkdGggPD0gNDA5NgorCQkJJiYgKHZfd2lkdGggIT0gdnZjMV9hbXN0cmVhbV9kZWNfaW5mby53aWR0aCkpIHsKKwkJCXByX2luZm8oImZyYW1lIHdpZHRoIGNoYW5nZWQgJWQgdG8gJWRcbiIsCisJCQkJICAgdnZjMV9hbXN0cmVhbV9kZWNfaW5mby53aWR0aCwgdl93aWR0aCk7CisJCQl2dmMxX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoID0gdl93aWR0aDsKKwkJCWZyYW1lX3dpZHRoID0gdl93aWR0aDsKKwkJfQorCQlpZiAodl9oZWlnaHQgJiYgdl9oZWlnaHQgPD0gNDA5NgorCQkJJiYgKHZfaGVpZ2h0ICE9IHZ2YzFfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0KSkgeworCQkJcHJfaW5mbygiZnJhbWUgaGVpZ2h0IGNoYW5nZWQgJWQgdG8gJWRcbiIsCisJCQkJICAgdnZjMV9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQsIHZfaGVpZ2h0KTsKKwkJCXZ2YzFfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0ID0gdl9oZWlnaHQ7CisJCQlmcmFtZV9oZWlnaHQgPSB2X2hlaWdodDsKKwkJfQorCisJCWlmIChwdHNfYnlfb2Zmc2V0KSB7CisJCQlvZmZzZXQgPSBSRUFEX1ZSRUcoVkMxX09GRlNFVF9SRUcpOworCQkJaWYgKHB0c19sb29rdXBfb2Zmc2V0X3VzNjQoCisJCQkJCVBUU19UWVBFX1ZJREVPLAorCQkJCQlvZmZzZXQsICZwdHMsICZmcmFtZV9zaXplLAorCQkJCQkwLCAmcHRzX3VzNjQpID09IDApIHsKKwkJCQlwdHNfdmFsaWQgPSAxOworI2lmZGVmIERFQlVHX1BUUworCQkJCXB0c19oaXQrKzsKKyNlbmRpZgorCQkJfSBlbHNlIHsKKyNpZmRlZiBERUJVR19QVFMKKwkJCQlwdHNfbWlzc2VkKys7CisjZW5kaWYKKwkJCX0KKwkJfQorCisJCXJlcGVhdF9jb3VudCA9IFJFQURfVlJFRyhWQzFfUkVQRUFUX0NPVU5UKTsKKwkJYnVmZmVyX2luZGV4ID0gKChyZWcgJiAweDcpIC0gMSkgJiAzOworCQlwaWN0dXJlX3R5cGUgPSAocmVnID4+IDMpICYgNzsKKworCQlpZiAoYnVmZmVyX2luZGV4ID49IERFQ09ERV9CVUZGRVJfTlVNX01BWCkgeworCQkJcHJfaW5mbygiZmF0YWwgZXJyb3IsIGludmFsaWQgYnVmZmVyIGluZGV4LiIpOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisKKwkJaWYgKChpbnRyYV9vdXRwdXQgPT0gMCkgJiYgKHBpY3R1cmVfdHlwZSAhPSAwKSkgeworCQkJV1JJVEVfVlJFRyhWQzFfQlVGRkVSSU4sIH4oMSA8PCBidWZmZXJfaW5kZXgpKTsKKwkJCVdSSVRFX1ZSRUcoVkMxX0JVRkZFUk9VVCwgMCk7CisJCQlXUklURV9WUkVHKEFTU0lTVF9NQk9YMV9DTFJfUkVHLCAxKTsKKworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisKKwkJaW50cmFfb3V0cHV0ID0gMTsKKworI2lmZGVmIERFQlVHX1BUUworCQlpZiAocGljdHVyZV90eXBlID09IElfUElDVFVSRSkgeworCQkJLyogcHJfaW5mbygiSSBvZmZzZXQgMHgleCwKKwkJCSAqcHRzX3ZhbGlkICVkXG4iLCBvZmZzZXQsIHB0c192YWxpZCk7CisJCQkgKi8KKwkJCWlmICghcHRzX3ZhbGlkKQorCQkJCXB0c19pX21pc3NlZCsrOworCQkJZWxzZQorCQkJCXB0c19pX2hpdCsrOworCQl9CisjZW5kaWYKKworCQlpZiAoKHB0c192YWxpZCkgJiYgKGZybS5zdGF0ZSAhPSBSQVRFX01FQVNVUkVfRE9ORSkpIHsKKwkJCWlmIChmcm0uc3RhdGUgPT0gUkFURV9NRUFTVVJFX1NUQVJUX1BUUykgeworCQkJCWZybS5zdGFydF9wdHMgPSBwdHM7CisJCQkJZnJtLnN0YXRlID0gUkFURV9NRUFTVVJFX0VORF9QVFM7CisJCQkJZnJtLnRyeW1heCA9IFJBVEVfTUVBU1VSRV9OVU07CisJCQl9IGVsc2UgaWYgKGZybS5zdGF0ZSA9PSBSQVRFX01FQVNVUkVfRU5EX1BUUykgeworCQkJCWlmIChmcm0ubnVtID49IGZybS50cnltYXgpIHsKKwkJCQkJZnJtLmVuZF9wdHMgPSBwdHM7CisJCQkJCWZybS5yYXRlID0gKGZybS5lbmRfcHRzIC0KKwkJCQkJCWZybS5zdGFydF9wdHMpIC8gZnJtLm51bTsKKwkJCQkJcHJfaW5mbygiZnJhdGUgYmVmb3JlPSVkLCVkLG51bT0lZFxuIiwKKwkJCQkJZnJtLnJhdGUsCisJCQkJCURVUjJQVFModnZjMV9hbXN0cmVhbV9kZWNfaW5mby5yYXRlKSwKKwkJCQkJZnJtLm51bSk7CisJCQkJCS8qIGNoZWNrIGlmIG1lYXN1cmVkIHJhdGUgaXMgc2FtZSBhcworCQkJCQkgKiBzZXR0aW5ncyBmcm9tIHVwcGVyIGxheWVyCisJCQkJCSAqIGFuZCBjb3JyZWN0IGl0IGlmIG5lY2Vzc2FyeQorCQkJCQkgKi8KKwkJCQkJaWYgKChjbG9zZV90byhmcm0ucmF0ZSwgUkFURV8zMF9GUFMsCisJCQkJCQlSQVRFX0NPUlJFQ1RJT05fVEhSRVNIT0xEKSAmJgorCQkJCQkJY2xvc2VfdG8oCisJCQkJCQlEVVIyUFRTKAorCQkJCQkJdnZjMV9hbXN0cmVhbV9kZWNfaW5mby5yYXRlKSwKKwkJCQkJCVJBVEVfMjRfRlBTLAorCQkJCQkJUkFURV9DT1JSRUNUSU9OX1RIUkVTSE9MRCkpCisJCQkJCQl8fAorCQkJCQkJKGNsb3NlX3RvKAorCQkJCQkJZnJtLnJhdGUsIFJBVEVfMjRfRlBTLAorCQkJCQkJUkFURV9DT1JSRUNUSU9OX1RIUkVTSE9MRCkKKwkJCQkJCSYmCisJCQkJCQljbG9zZV90byhEVVIyUFRTKAorCQkJCQkJdnZjMV9hbXN0cmVhbV9kZWNfaW5mby5yYXRlKSwKKwkJCQkJCVJBVEVfMzBfRlBTLAorCQkJCQkJUkFURV9DT1JSRUNUSU9OX1RIUkVTSE9MRCkpKSB7CisJCQkJCQlwcl9pbmZvKAorCQkJCQkJInZ2YzE6IGZyYXRlIGZyb20gJWQgdG8gJWRcbiIsCisJCQkJCQl2dmMxX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUsCisJCQkJCQlQVFMyRFVSKGZybS5yYXRlKSk7CisKKwkJCQkJCXZ2YzFfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSA9CisJCQkJCQkJUFRTMkRVUihmcm0ucmF0ZSk7CisJCQkJCQlmcm0uc3RhdGUgPSBSQVRFX01FQVNVUkVfRE9ORTsKKwkJCQkJfSBlbHNlIGlmIChjbG9zZV90byhmcm0ucmF0ZSwKKwkJCQkJCURVUjJQVFMoCisJCQkJCQl2dmMxX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUpLAorCQkJCQkJUkFURV9DT1JSRUNUSU9OX1RIUkVTSE9MRCkpCisJCQkJCQlmcm0uc3RhdGUgPSBSQVRFX01FQVNVUkVfRE9ORTsKKwkJCQkJZWxzZSB7CisKKy8qIG1heWJlIHN0aWxsIGhhdmUgcHJvYmxlbSwKKyAqCQkJCQkJdHJ5IG5leHQgZG91YmxlIGZyYW1lcy4uLi4KKyAqLworCQkJCQkJZnJtLnN0YXRlID0gUkFURV9NRUFTVVJFX0RPTkU7CisJCQkJCQlmcm0uc3RhcnRfcHRzID0gcHRzOworCQkJCQkJZnJtLnN0YXRlID0KKwkJCQkJCVJBVEVfTUVBU1VSRV9FTkRfUFRTOworCQkJCQkJLyo2MCBmcHMqNjAgUyAqLworCQkJCQkJZnJtLm51bSA9IDA7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoZnJtLnN0YXRlICE9IFJBVEVfTUVBU1VSRV9ET05FKQorCQkJZnJtLm51bSArPSAocmVwZWF0X2NvdW50ID4gMSkgPyByZXBlYXRfY291bnQgOiAxOworCQlpZiAodnZjMV9hbXN0cmVhbV9kZWNfaW5mby5yYXRlID09IDApCisJCQl2dmMxX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgPSBQVFMyRFVSKGZybS5yYXRlKTsKKworCQlpZiAocmVnICYgSU5URVJMQUNFX0ZMQUcpIHsJLyogaW50ZXJsYWNlICovCisJCQlpZiAoa2ZpZm9fZ2V0KCZuZXdmcmFtZV9xLCAmdmYpID09IDApIHsKKwkJCQlwcl9pbmZvCisJCQkJKCJmYXRhbCBlcnJvciwgbm8gYXZhaWxhYmxlIGJ1ZmZlciBzbG90LiIpOworCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCX0KKwkJCXZmLT5zaWduYWxfdHlwZSA9IDA7CisJCQl2Zi0+aW5kZXggPSBidWZmZXJfaW5kZXg7CisJCQl2Zi0+d2lkdGggPSB2dmMxX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoOworCQkJdmYtPmhlaWdodCA9IHZ2YzFfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0OworCQkJdmYtPmJ1ZldpZHRoID0gMTkyMDsKKwkJCXZmLT5mbGFnID0gMDsKKworCQkJaWYgKHB0c192YWxpZCkgeworCQkJCXZmLT5wdHMgPSBwdHM7CisJCQkJdmYtPnB0c191czY0ID0gcHRzX3VzNjQ7CisJCQkJaWYgKChyZXBlYXRfY291bnQgPiAxKSAmJiBhdmlfZmxhZykgeworCQkJCQl2Zi0+ZHVyYXRpb24gPQorCQkJCQkJdnZjMV9hbXN0cmVhbV9kZWNfaW5mby5yYXRlICoKKwkJCQkJCXJlcGVhdF9jb3VudCA+PiAxOworCQkJCQluZXh0X3B0cyA9IHB0cyArCisJCQkJCQkodnZjMV9hbXN0cmVhbV9kZWNfaW5mby5yYXRlICoKKwkJCQkJCSByZXBlYXRfY291bnQgPj4gMSkgKiAxNSAvIDE2OworCQkJCQluZXh0X3B0c191czY0ID0gcHRzX3VzNjQgKworCQkJCQkJKCh2dmMxX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgKgorCQkJCQkJcmVwZWF0X2NvdW50ID4+IDEpICogMTUgLyAxNikgKgorCQkJCQkJMTAwIC8gOTsKKwkJCQl9IGVsc2UgeworCQkJCQl2Zi0+ZHVyYXRpb24gPQorCQkJCQl2dmMxX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgPj4gMTsKKwkJCQkJbmV4dF9wdHMgPSAwOworCQkJCQluZXh0X3B0c191czY0ID0gMDsKKwkJCQkJaWYgKHBpY3R1cmVfdHlwZSAhPSBJX1BJQ1RVUkUgJiYKKwkJCQkJCXVuc3RhYmxlX3B0cykgeworCQkJCQkJdmYtPnB0cyA9IDA7CisJCQkJCQl2Zi0+cHRzX3VzNjQgPSAwOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQl2Zi0+cHRzID0gbmV4dF9wdHM7CisJCQkJdmYtPnB0c191czY0ID0gbmV4dF9wdHNfdXM2NDsKKwkJCQlpZiAoKHJlcGVhdF9jb3VudCA+IDEpICYmIGF2aV9mbGFnKSB7CisJCQkJCXZmLT5kdXJhdGlvbiA9CisJCQkJCQl2dmMxX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgKgorCQkJCQkJcmVwZWF0X2NvdW50ID4+IDE7CisJCQkJCWlmIChuZXh0X3B0cyAhPSAwKSB7CisJCQkJCQluZXh0X3B0cyArPSAoKHZmLT5kdXJhdGlvbikgLQorCQkJCQkJKCh2Zi0+ZHVyYXRpb24pID4+IDQpKTsKKwkJCQkJfQorCQkJCQlpZiAobmV4dF9wdHNfdXM2NCAhPSAwKSB7CisJCQkJCQluZXh0X3B0c191czY0ICs9CisJCQkJCQlkaXZfdTY0KCh1NjQpKCh2Zi0+ZHVyYXRpb24pIC0KKwkJCQkJCSgodmYtPmR1cmF0aW9uKSA+PiA0KSkgKgorCQkJCQkJMTAwLCA5KTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXZmLT5kdXJhdGlvbiA9CisJCQkJCXZ2YzFfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSA+PiAxOworCQkJCQluZXh0X3B0cyA9IDA7CisJCQkJCW5leHRfcHRzX3VzNjQgPSAwOworCQkJCQlpZiAocGljdHVyZV90eXBlICE9IElfUElDVFVSRSAmJgorCQkJCQkJdW5zdGFibGVfcHRzKSB7CisJCQkJCQl2Zi0+cHRzID0gMDsKKwkJCQkJCXZmLT5wdHNfdXM2NCA9IDA7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCXZmLT5kdXJhdGlvbl9wdWxsZG93biA9IDA7CisJCQl2Zi0+dHlwZSA9IChyZWcgJiBCT1RUT01fRklFTERfRklSU1RfRkxBRykgPworCQkJVklEVFlQRV9JTlRFUkxBQ0VfQk9UVE9NIDogVklEVFlQRV9JTlRFUkxBQ0VfVE9QOworI2lmZGVmIE5WMjEKKwkJCXZmLT50eXBlIHw9IFZJRFRZUEVfVklVX05WMjE7CisjZW5kaWYKKwkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9CisJCQkJCQlpbmRleDJjYW52YXMoYnVmZmVyX2luZGV4KTsKKwkJCXZmLT5vcmllbnRhdGlvbiA9IDA7CisJCQl2Zi0+dHlwZV9vcmlnaW5hbCA9IHZmLT50eXBlOworCQkJc2V0X2FzcGVjdF9yYXRpbyh2ZiwgUkVBRF9WUkVHKFZDMV9QSUNfUkFUSU8pKTsKKworCQkJdmZidWZfdXNlW2J1ZmZlcl9pbmRleF0rKzsKKwkJCXZmLT5tZW1faGFuZGxlID0KKwkJCQlkZWNvZGVyX2JtbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCQltbV9ibGtfaGFuZGxlLAorCQkJCQlidWZmZXJfaW5kZXgpOworCQkJaWYgKGlzX3N1cHBvcnRfdmRlY19jYW52YXMoKSkgeworCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IC0xOworCQkJCXZmLT5jYW52YXMwX2NvbmZpZ1swXSA9IHZjMV9jYW52YXNfY29uZmlnW2J1ZmZlcl9pbmRleF1bMF07CisJCQkJdmYtPmNhbnZhczBfY29uZmlnWzFdID0gdmMxX2NhbnZhc19jb25maWdbYnVmZmVyX2luZGV4XVsxXTsKKyNpZmRlZiBOVjIxCisJCQkJdmYtPnBsYW5lX251bSA9IDI7CisjZWxzZQorCQkJCXZmLT5jYW52YXMwX2NvbmZpZ1syXSA9IHZjMV9jYW52YXNfY29uZmlnW2J1ZmZlcl9pbmRleF1bMl07CisJCQkJdmYtPnBsYW5lX251bSA9IDM7CisjZW5kaWYKKwkJCX0KKwkJCWtmaWZvX3B1dCgmZGlzcGxheV9xLCAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQkJQVRSQUNFX0NPVU5URVIoTU9EVUxFX05BTUUsIHZmLT5wdHMpOworCisJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoCisJCQkJUFJPVklERVJfTkFNRSwKKwkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfVkZSQU1FX1JFQURZLAorCQkJCU5VTEwpOworCisJCQlpZiAoa2ZpZm9fZ2V0KCZuZXdmcmFtZV9xLCAmdmYpID09IDApIHsKKwkJCQlwcl9pbmZvCisJCQkJKCJmYXRhbCBlcnJvciwgbm8gYXZhaWxhYmxlIGJ1ZmZlciBzbG90LiIpOworCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCX0KKwkJCXZmLT5zaWduYWxfdHlwZSA9IDA7CisJCQl2Zi0+aW5kZXggPSBidWZmZXJfaW5kZXg7CisJCQl2Zi0+d2lkdGggPSB2dmMxX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoOworCQkJdmYtPmhlaWdodCA9IHZ2YzFfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0OworCQkJdmYtPmJ1ZldpZHRoID0gMTkyMDsKKwkJCXZmLT5mbGFnID0gMDsKKworCQkJdmYtPnB0cyA9IG5leHRfcHRzOworCQkJdmYtPnB0c191czY0ID0gbmV4dF9wdHNfdXM2NDsKKwkJCWlmICgocmVwZWF0X2NvdW50ID4gMSkgJiYgYXZpX2ZsYWcpIHsKKwkJCQl2Zi0+ZHVyYXRpb24gPQorCQkJCQl2dmMxX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgKgorCQkJCQlyZXBlYXRfY291bnQgPj4gMTsKKwkJCQlpZiAobmV4dF9wdHMgIT0gMCkgeworCQkJCQluZXh0X3B0cyArPQorCQkJCQkJKCh2Zi0+ZHVyYXRpb24pIC0KKwkJCQkJCSAoKHZmLT5kdXJhdGlvbikgPj4gNCkpOworCQkJCX0KKwkJCQlpZiAobmV4dF9wdHNfdXM2NCAhPSAwKSB7CisJCQkJCW5leHRfcHRzX3VzNjQgKz0gZGl2X3U2NCgodTY0KSgodmYtPmR1cmF0aW9uKSAtCisJCQkJCSgodmYtPmR1cmF0aW9uKSA+PiA0KSkgKiAxMDAsIDkpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJdmYtPmR1cmF0aW9uID0KKwkJCQkJdnZjMV9hbXN0cmVhbV9kZWNfaW5mby5yYXRlID4+IDE7CisJCQkJbmV4dF9wdHMgPSAwOworCQkJCW5leHRfcHRzX3VzNjQgPSAwOworCQkJCWlmIChwaWN0dXJlX3R5cGUgIT0gSV9QSUNUVVJFICYmCisJCQkJCXVuc3RhYmxlX3B0cykgeworCQkJCQl2Zi0+cHRzID0gMDsKKwkJCQkJdmYtPnB0c191czY0ID0gMDsKKwkJCQl9CisJCQl9CisKKwkJCXZmLT5kdXJhdGlvbl9wdWxsZG93biA9IDA7CisJCQl2Zi0+dHlwZSA9IChyZWcgJiBCT1RUT01fRklFTERfRklSU1RfRkxBRykgPworCQkJVklEVFlQRV9JTlRFUkxBQ0VfVE9QIDogVklEVFlQRV9JTlRFUkxBQ0VfQk9UVE9NOworI2lmZGVmIE5WMjEKKwkJCXZmLT50eXBlIHw9IFZJRFRZUEVfVklVX05WMjE7CisjZW5kaWYKKwkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9CisJCQkJCWluZGV4MmNhbnZhcyhidWZmZXJfaW5kZXgpOworCQkJdmYtPm9yaWVudGF0aW9uID0gMDsKKwkJCXZmLT50eXBlX29yaWdpbmFsID0gdmYtPnR5cGU7CisJCQlzZXRfYXNwZWN0X3JhdGlvKHZmLCBSRUFEX1ZSRUcoVkMxX1BJQ19SQVRJTykpOworCisJCQl2ZmJ1Zl91c2VbYnVmZmVyX2luZGV4XSsrOworCQkJdmYtPm1lbV9oYW5kbGUgPQorCQkJCWRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJCW1tX2Jsa19oYW5kbGUsCisJCQkJCWJ1ZmZlcl9pbmRleCk7CisKKwkJCWlmIChpc19zdXBwb3J0X3ZkZWNfY2FudmFzKCkpIHsKKwkJCQl2Zi0+Y2FudmFzMEFkZHIgPSB2Zi0+Y2FudmFzMUFkZHIgPSAtMTsKKwkJCQl2Zi0+Y2FudmFzMF9jb25maWdbMF0gPSB2YzFfY2FudmFzX2NvbmZpZ1tidWZmZXJfaW5kZXhdWzBdOworCQkJCXZmLT5jYW52YXMwX2NvbmZpZ1sxXSA9IHZjMV9jYW52YXNfY29uZmlnW2J1ZmZlcl9pbmRleF1bMV07CisjaWZkZWYgTlYyMQorCQkJCXZmLT5wbGFuZV9udW0gPSAyOworI2Vsc2UKKwkJCQl2Zi0+Y2FudmFzMF9jb25maWdbMl0gPSB2YzFfY2FudmFzX2NvbmZpZ1tidWZmZXJfaW5kZXhdWzJdOworCQkJCXZmLT5wbGFuZV9udW0gPSAzOworI2VuZGlmCisJCQl9CisJCQlrZmlmb19wdXQoJmRpc3BsYXlfcSwgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwkJCUFUUkFDRV9DT1VOVEVSKE1PRFVMRV9OQU1FLCB2Zi0+cHRzKTsKKworCQkJdmZfbm90aWZ5X3JlY2VpdmVyKAorCQkJCQlQUk9WSURFUl9OQU1FLAorCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfVkZSQU1FX1JFQURZLAorCQkJCQlOVUxMKTsKKwkJfSBlbHNlIHsJLyogcHJvZ3Jlc3NpdmUgKi8KKwkJCWlmIChrZmlmb19nZXQoJm5ld2ZyYW1lX3EsICZ2ZikgPT0gMCkgeworCQkJCXByX2luZm8KKwkJCQkoImZhdGFsIGVycm9yLCBubyBhdmFpbGFibGUgYnVmZmVyIHNsb3QuIik7CisJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJfQorCQkJdmYtPnNpZ25hbF90eXBlID0gMDsKKwkJCXZmLT5pbmRleCA9IGJ1ZmZlcl9pbmRleDsKKwkJCXZmLT53aWR0aCA9IHZ2YzFfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGg7CisJCQl2Zi0+aGVpZ2h0ID0gdnZjMV9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQ7CisJCQl2Zi0+YnVmV2lkdGggPSAxOTIwOworCQkJdmYtPmZsYWcgPSAwOworCisJCQlpZiAocHRzX3ZhbGlkKSB7CisJCQkJdmYtPnB0cyA9IHB0czsKKwkJCQl2Zi0+cHRzX3VzNjQgPSBwdHNfdXM2NDsKKwkJCQlpZiAoKHJlcGVhdF9jb3VudCA+IDEpICYmIGF2aV9mbGFnKSB7CisJCQkJCXZmLT5kdXJhdGlvbiA9CisJCQkJCQl2dmMxX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgKgorCQkJCQkJcmVwZWF0X2NvdW50OworCQkJCQluZXh0X3B0cyA9CisJCQkJCQlwdHMgKworCQkJCQkJKHZ2YzFfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSAqCisJCQkJCQkgcmVwZWF0X2NvdW50KSAqIDE1IC8gMTY7CisJCQkJCW5leHRfcHRzX3VzNjQgPSBwdHNfdXM2NCArCisJCQkJCQkoKHZ2YzFfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSAqCisJCQkJCQlyZXBlYXRfY291bnQpICogMTUgLyAxNikgKgorCQkJCQkJMTAwIC8gOTsKKwkJCQl9IGVsc2UgeworCQkJCQl2Zi0+ZHVyYXRpb24gPQorCQkJCQkJdnZjMV9hbXN0cmVhbV9kZWNfaW5mby5yYXRlOworCQkJCQluZXh0X3B0cyA9IDA7CisJCQkJCW5leHRfcHRzX3VzNjQgPSAwOworCQkJCQlpZiAocGljdHVyZV90eXBlICE9IElfUElDVFVSRSAmJgorCQkJCQkJdW5zdGFibGVfcHRzKSB7CisJCQkJCQl2Zi0+cHRzID0gMDsKKwkJCQkJCXZmLT5wdHNfdXM2NCA9IDA7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXZmLT5wdHMgPSBuZXh0X3B0czsKKwkJCQl2Zi0+cHRzX3VzNjQgPSBuZXh0X3B0c191czY0OworCQkJCWlmICgocmVwZWF0X2NvdW50ID4gMSkgJiYgYXZpX2ZsYWcpIHsKKwkJCQkJdmYtPmR1cmF0aW9uID0KKwkJCQkJCXZ2YzFfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSAqCisJCQkJCQlyZXBlYXRfY291bnQ7CisJCQkJCWlmIChuZXh0X3B0cyAhPSAwKSB7CisJCQkJCQluZXh0X3B0cyArPSAoKHZmLT5kdXJhdGlvbikgLQorCQkJCQkJCSgodmYtPmR1cmF0aW9uKSA+PiA0KSk7CisJCQkJCX0KKwkJCQkJaWYgKG5leHRfcHRzX3VzNjQgIT0gMCkgeworCQkJCQkJbmV4dF9wdHNfdXM2NCArPQorCQkJCQkJZGl2X3U2NCgodTY0KSgodmYtPmR1cmF0aW9uKSAtCisJCQkJCQkoKHZmLT5kdXJhdGlvbikgPj4gNCkpICoKKwkJCQkJCTEwMCwgOSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQl2Zi0+ZHVyYXRpb24gPQorCQkJCQkJdnZjMV9hbXN0cmVhbV9kZWNfaW5mby5yYXRlOworCQkJCQluZXh0X3B0cyA9IDA7CisJCQkJCW5leHRfcHRzX3VzNjQgPSAwOworCQkJCQlpZiAocGljdHVyZV90eXBlICE9IElfUElDVFVSRSAmJgorCQkJCQkJdW5zdGFibGVfcHRzKSB7CisJCQkJCQl2Zi0+cHRzID0gMDsKKwkJCQkJCXZmLT5wdHNfdXM2NCA9IDA7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCXZmLT5kdXJhdGlvbl9wdWxsZG93biA9IDA7CisjaWZkZWYgTlYyMQorCQkJdmYtPnR5cGUgPQorCQkJCVZJRFRZUEVfUFJPR1JFU1NJVkUgfCBWSURUWVBFX1ZJVV9GSUVMRCB8CisJCQkJVklEVFlQRV9WSVVfTlYyMTsKKyNlbHNlCisJCQl2Zi0+dHlwZSA9IFZJRFRZUEVfUFJPR1JFU1NJVkUgfCBWSURUWVBFX1ZJVV9GSUVMRDsKKyNlbmRpZgorCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0KKwkJCQkJCWluZGV4MmNhbnZhcyhidWZmZXJfaW5kZXgpOworCQkJdmYtPm9yaWVudGF0aW9uID0gMDsKKwkJCXZmLT50eXBlX29yaWdpbmFsID0gdmYtPnR5cGU7CisJCQlzZXRfYXNwZWN0X3JhdGlvKHZmLCBSRUFEX1ZSRUcoVkMxX1BJQ19SQVRJTykpOworCisJCQl2ZmJ1Zl91c2VbYnVmZmVyX2luZGV4XSsrOworCQkJdmYtPm1lbV9oYW5kbGUgPQorCQkJCWRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJCW1tX2Jsa19oYW5kbGUsCisJCQkJCWJ1ZmZlcl9pbmRleCk7CisJCQlpZiAoaXNfc3VwcG9ydF92ZGVjX2NhbnZhcygpKSB7CisJCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0gLTE7CisJCQkJdmYtPmNhbnZhczBfY29uZmlnWzBdID0gdmMxX2NhbnZhc19jb25maWdbYnVmZmVyX2luZGV4XVswXTsKKwkJCQl2Zi0+Y2FudmFzMF9jb25maWdbMV0gPSB2YzFfY2FudmFzX2NvbmZpZ1tidWZmZXJfaW5kZXhdWzFdOworI2lmZGVmIE5WMjEKKwkJCQl2Zi0+cGxhbmVfbnVtID0gMjsKKyNlbHNlCisJCQkJdmYtPmNhbnZhczBfY29uZmlnWzJdID0gdmMxX2NhbnZhc19jb25maWdbYnVmZmVyX2luZGV4XVsyXTsKKwkJCQl2Zi0+cGxhbmVfbnVtID0gMzsKKyNlbmRpZgorCQkJfQorCQkJa2ZpZm9fcHV0KCZkaXNwbGF5X3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCQlBVFJBQ0VfQ09VTlRFUihNT0RVTEVfTkFNRSwgdmYtPnB0cyk7CisKKwkJCXZmX25vdGlmeV9yZWNlaXZlcihQUk9WSURFUl9OQU1FLAorCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfVkZSQU1FX1JFQURZLAorCQkJCQlOVUxMKTsKKwkJfQorCQlmcmFtZV9kdXIgPSB2dmMxX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGU7CisJCXRvdGFsX2ZyYW1lKys7CisKKwkJLypjb3VudCBpbmZvKi8KKwkJZ3ZzLT5mcmFtZV9kdXIgPSBmcmFtZV9kdXI7CisJCXZkZWNfY291bnRfaW5mbyhndnMsIDAsIG9mZnNldCk7CisKKwkJLyogcHJfaW5mbygiUGljVHlwZSA9ICVkLCBQVFMgPSAweCV4LCByZXBlYXQKKwkJICpjb3VudCAlZFxuIiwgcGljdHVyZV90eXBlLCB2Zi0+cHRzLCByZXBlYXRfY291bnQpOworCQkgKi8KKwkJV1JJVEVfVlJFRyhWQzFfQlVGRkVST1VULCAwKTsKKwl9CisKKwlXUklURV9WUkVHKEFTU0lTVF9NQk9YMV9DTFJfUkVHLCAxKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyAqdnZjMV92Zl9wZWVrKHZvaWQgKm9wX2FyZykKK3sKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmOworCisJaWYgKGtmaWZvX3BlZWsoJmRpc3BsYXlfcSwgJnZmKSkKKwkJcmV0dXJuIHZmOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZ2YzFfdmZfZ2V0KHZvaWQgKm9wX2FyZykKK3sKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmOworCisJaWYgKGtmaWZvX2dldCgmZGlzcGxheV9xLCAmdmYpKQorCQlyZXR1cm4gdmY7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgdnZjMV92Zl9wdXQoc3RydWN0IHZmcmFtZV9zICp2Ziwgdm9pZCAqb3BfYXJnKQoreworCWlmIChwb29sX2luZGV4KHZmKSA9PSBjdXJfcG9vbF9pZHgpCisJCWtmaWZvX3B1dCgmcmVjeWNsZV9xLCAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworfQorCitzdGF0aWMgaW50IHZ2YzFfdmZfc3RhdGVzKHN0cnVjdCB2ZnJhbWVfc3RhdGVzICpzdGF0ZXMsIHZvaWQgKm9wX2FyZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKKworCXN0YXRlcy0+dmZfcG9vbF9zaXplID0gVkZfUE9PTF9TSVpFOworCXN0YXRlcy0+YnVmX2ZyZWVfbnVtID0ga2ZpZm9fbGVuKCZuZXdmcmFtZV9xKTsKKwlzdGF0ZXMtPmJ1Zl9hdmFpbF9udW0gPSBrZmlmb19sZW4oJmRpc3BsYXlfcSk7CisJc3RhdGVzLT5idWZfcmVjeWNsZV9udW0gPSBrZmlmb19sZW4oJnJlY3ljbGVfcSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2dmMxX2V2ZW50X2NiKGludCB0eXBlLCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlX2RhdGEpCit7CisJaWYgKHR5cGUgJiBWRlJBTUVfRVZFTlRfUkVDRUlWRVJfUkVTRVQpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlhbXZkZWNfc3RvcCgpOworI2lmbmRlZiBDT05GSUdfQU1MT0dJQ19QT1NUX1BST0NFU1NfTUFOQUdFUgorCQl2Zl9saWdodF91bnJlZ19wcm92aWRlcigmdnZjMV92Zl9wcm92KTsKKyNlbmRpZgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCQl2dmMxX2xvY2FsX2luaXQodHJ1ZSk7CisJCXZ2YzFfcHJvdF9pbml0KCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKKyNpZm5kZWYgQ09ORklHX0FNTE9HSUNfUE9TVF9QUk9DRVNTX01BTkFHRVIKKwkJdmZfcmVnX3Byb3ZpZGVyKCZ2dmMxX3ZmX3Byb3YpOworI2VuZGlmCisJCWFtdmRlY19zdGFydCgpOworCX0KKworCWlmICh0eXBlICYgVkZSQU1FX0VWRU5UX1JFQ0VJVkVSX1JFUV9TVEFURSkgeworCQlzdHJ1Y3QgcHJvdmlkZXJfc3RhdGVfcmVxX3MgKnJlcSA9CisJCQkoc3RydWN0IHByb3ZpZGVyX3N0YXRlX3JlcV9zICopZGF0YTsKKwkJaWYgKHJlcS0+cmVxX3R5cGUgPT0gUkVRX1NUQVRFX1NFQ1VSRSAmJiB2ZGVjKQorCQkJcmVxLT5yZXFfcmVzdWx0WzBdID0gdmRlY19zZWN1cmUodmRlYyk7CisJCWVsc2UKKwkJCXJlcS0+cmVxX3Jlc3VsdFswXSA9IDB4ZmZmZmZmZmY7CisJfQorCXJldHVybiAwOworfQorCitpbnQgdnZjMV9kZWNfc3RhdHVzKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHN0cnVjdCB2ZGVjX2luZm8gKnZzdGF0dXMpCit7CisJaWYgKCEoc3RhdCAmIFNUQVRfVkRFQ19SVU4pKQorCQlyZXR1cm4gLTE7CisKKwl2c3RhdHVzLT5mcmFtZV93aWR0aCA9IHZ2YzFfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGg7CisJdnN0YXR1cy0+ZnJhbWVfaGVpZ2h0ID0gdnZjMV9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQ7CisJaWYgKHZ2YzFfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSAhPSAwKQorCQl2c3RhdHVzLT5mcmFtZV9yYXRlID0gOTYwMDAgLyB2dmMxX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGU7CisJZWxzZQorCQl2c3RhdHVzLT5mcmFtZV9yYXRlID0gLTE7CisJdnN0YXR1cy0+ZXJyb3JfY291bnQgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9DKTsKKwl2c3RhdHVzLT5zdGF0dXMgPSBzdGF0OworCXZzdGF0dXMtPmJpdF9yYXRlID0gZ3ZzLT5iaXRfcmF0ZTsKKwl2c3RhdHVzLT5mcmFtZV9kdXIgPSB2dmMxX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGU7CisJdnN0YXR1cy0+ZnJhbWVfZGF0YSA9IGd2cy0+ZnJhbWVfZGF0YTsKKwl2c3RhdHVzLT50b3RhbF9kYXRhID0gZ3ZzLT50b3RhbF9kYXRhOworCXZzdGF0dXMtPmZyYW1lX2NvdW50ID0gZ3ZzLT5mcmFtZV9jb3VudDsKKwl2c3RhdHVzLT5lcnJvcl9mcmFtZV9jb3VudCA9IGd2cy0+ZXJyb3JfZnJhbWVfY291bnQ7CisJdnN0YXR1cy0+ZHJvcF9mcmFtZV9jb3VudCA9IGd2cy0+ZHJvcF9mcmFtZV9jb3VudDsKKwl2c3RhdHVzLT50b3RhbF9kYXRhID0gZ3ZzLT50b3RhbF9kYXRhOworCXZzdGF0dXMtPnNhbXBfY250ID0gZ3ZzLT5zYW1wX2NudDsKKwl2c3RhdHVzLT5vZmZzZXQgPSBndnMtPm9mZnNldDsKKwlzbnByaW50Zih2c3RhdHVzLT52ZGVjX25hbWUsIHNpemVvZih2c3RhdHVzLT52ZGVjX25hbWUpLAorCQkiJXMiLCBEUklWRVJfTkFNRSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHZ2YzFfc2V0X2lzcmVzZXQoc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGlzcmVzZXQpCit7CisJaXNfcmVzZXQgPSBpc3Jlc2V0OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZ2YzFfdmRlY19pbmZvX2luaXQodm9pZCkKK3sKKwlndnMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdmRlY19pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKE5VTEwgPT0gZ3ZzKSB7CisJCXByX2luZm8oInRoZSBzdHJ1Y3Qgb2YgdmRlYyBzdGF0dXMgbWFsbG9jIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB2dmMxX2NhbnZhc19pbml0KHZvaWQpCit7CisJaW50IGksIHJldDsKKwl1MzIgY2FudmFzX3dpZHRoLCBjYW52YXNfaGVpZ2h0OworCXUzMiBhbGxvY19zaXplLCBkZWNidWZfc2l6ZSwgZGVjYnVmX3lfc2l6ZSwgZGVjYnVmX3V2X3NpemU7CisJdW5zaWduZWQgbG9uZyBidWZfc3RhcnQ7CisKKwlpZiAoYnVmX3NpemUgPD0gMHgwMDQwMDAwMCkgeworCQkvKiBTRCBvbmx5ICovCisJCWNhbnZhc193aWR0aCA9IDc2ODsKKwkJY2FudmFzX2hlaWdodCA9IDU3NjsKKwkJZGVjYnVmX3lfc2l6ZSA9IDB4ODAwMDA7CisJCWRlY2J1Zl91dl9zaXplID0gMHgyMDAwMDsKKwkJZGVjYnVmX3NpemUgPSAweDEwMDAwMDsKKwl9IGVsc2UgeworCQkvKiBIRCAmIFNEICovCisJCWNhbnZhc193aWR0aCA9IDE5MjA7CisJCWNhbnZhc19oZWlnaHQgPSAxMDg4OworCQlkZWNidWZfeV9zaXplID0gMHgyMDAwMDA7CisJCWRlY2J1Zl91dl9zaXplID0gMHg4MDAwMDsKKwkJZGVjYnVmX3NpemUgPSAweDMwMDAwMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0JNTVVfQlVGRkVSX05VTTsgaSsrKSB7CisJCS8qIHdvcmtzcGFjZSBtZW0gKi8KKwkJaWYgKGkgPT0gKE1BWF9CTU1VX0JVRkZFUl9OVU0gLSAxKSkKKwkJCWFsbG9jX3NpemUgPSBXT1JLU1BBQ0VfU0laRTsKKwkJZWxzZQorCQkJYWxsb2Nfc2l6ZSA9IGRlY2J1Zl9zaXplOworCisJCXJldCA9IGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeShtbV9ibGtfaGFuZGxlLCBpLAorCQkJCWFsbG9jX3NpemUsIERSSVZFUl9OQU1FLCAmYnVmX3N0YXJ0KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlpZiAoaSA9PSAoTUFYX0JNTVVfQlVGRkVSX05VTSAtIDEpKSB7CisJCQlidWZfb2Zmc2V0ID0gYnVmX3N0YXJ0IC0gRENBQ19CVUZGX1NUQVJUX0FERFI7CisJCQljb250aW51ZTsKKwkJfQorCisjaWZkZWYgTlYyMQorCQljb25maWdfY2F2X2x1dF9leCgyICogaSArIDAsCisJCQlidWZfc3RhcnQsCisJCQljYW52YXNfd2lkdGgsIGNhbnZhc19oZWlnaHQsCisJCQlDQU5WQVNfQUREUl9OT1dSQVAsIENBTlZBU19CTEtNT0RFXzMyWDMyLCAwLCBWREVDXzEpOworCQl2YzFfY2FudmFzX2NvbmZpZ1tpXVswXS5lbmRpYW4gPSAwOworCQl2YzFfY2FudmFzX2NvbmZpZ1tpXVswXS53aWR0aCA9IGNhbnZhc193aWR0aDsKKwkJdmMxX2NhbnZhc19jb25maWdbaV1bMF0uaGVpZ2h0ID0gY2FudmFzX2hlaWdodDsKKwkJdmMxX2NhbnZhc19jb25maWdbaV1bMF0uYmxvY2tfbW9kZSA9IENBTlZBU19CTEtNT0RFXzMyWDMyOworCQl2YzFfY2FudmFzX2NvbmZpZ1tpXVswXS5waHlfYWRkciA9IGJ1Zl9zdGFydDsKKworCQljb25maWdfY2F2X2x1dF9leCgyICogaSArIDEsCisJCQlidWZfc3RhcnQgKworCQkJZGVjYnVmX3lfc2l6ZSwgY2FudmFzX3dpZHRoLAorCQkJY2FudmFzX2hlaWdodCAvIDIsIENBTlZBU19BRERSX05PV1JBUCwKKwkJCUNBTlZBU19CTEtNT0RFXzMyWDMyLCAwLCBWREVDXzEpOworCQl2YzFfY2FudmFzX2NvbmZpZ1tpXVsxXS5lbmRpYW4gPSAwOworCQl2YzFfY2FudmFzX2NvbmZpZ1tpXVsxXS53aWR0aCA9IGNhbnZhc193aWR0aDsKKwkJdmMxX2NhbnZhc19jb25maWdbaV1bMV0uaGVpZ2h0ID0gY2FudmFzX2hlaWdodCA+PiAxOworCQl2YzFfY2FudmFzX2NvbmZpZ1tpXVsxXS5ibG9ja19tb2RlID0gQ0FOVkFTX0JMS01PREVfMzJYMzI7CisJCXZjMV9jYW52YXNfY29uZmlnW2ldWzFdLnBoeV9hZGRyID0gYnVmX3N0YXJ0ICsgZGVjYnVmX3lfc2l6ZTsKKyNlbHNlCisJCWNvbmZpZ19jYXZfbHV0X2V4KDMgKiBpICsgMCwKKwkJCWJ1Zl9zdGFydCwKKwkJCWNhbnZhc193aWR0aCwgY2FudmFzX2hlaWdodCwKKwkJCUNBTlZBU19BRERSX05PV1JBUCwgQ0FOVkFTX0JMS01PREVfMzJYMzIsIDAsIFZERUNfMSk7CisJCXZjMV9jYW52YXNfY29uZmlnW2ldWzBdLmVuZGlhbiA9IDA7CisJCXZjMV9jYW52YXNfY29uZmlnW2ldWzBdLndpZHRoID0gY2FudmFzX3dpZHRoOworCQl2YzFfY2FudmFzX2NvbmZpZ1tpXVswXS5oZWlnaHQgPSBjYW52YXNfaGVpZ2h0OworCQl2YzFfY2FudmFzX2NvbmZpZ1tpXVswXS5ibG9ja19tb2RlID0gQ0FOVkFTX0JMS01PREVfMzJYMzI7CisJCXZjMV9jYW52YXNfY29uZmlnW2ldWzBdLnBoeV9hZGRyID0gYnVmX3N0YXJ0OworCQljb25maWdfY2F2X2x1dF9leCgzICogaSArIDEsCisJCQlidWZfc3RhcnQgKworCQkJZGVjYnVmX3lfc2l6ZSwgY2FudmFzX3dpZHRoIC8gMiwKKwkJCWNhbnZhc19oZWlnaHQgLyAyLCBDQU5WQVNfQUREUl9OT1dSQVAsCisJCQlDQU5WQVNfQkxLTU9ERV8zMlgzMiwgMCwgVkRFQ18xKTsKKwkJdmMxX2NhbnZhc19jb25maWdbaV1bMV0uZW5kaWFuID0gMDsKKwkJdmMxX2NhbnZhc19jb25maWdbaV1bMV0ud2lkdGggPSBjYW52YXNfd2lkdGggPj4gMTsKKwkJdmMxX2NhbnZhc19jb25maWdbaV1bMV0uaGVpZ2h0ID0gY2FudmFzX2hlaWdodCA+PiAxOworCQl2YzFfY2FudmFzX2NvbmZpZ1tpXVsxXS5ibG9ja19tb2RlID0gQ0FOVkFTX0JMS01PREVfMzJYMzI7CisJCXZjMV9jYW52YXNfY29uZmlnW2ldWzFdLnBoeV9hZGRyID0gYnVmX3N0YXJ0ICsgZGVjYnVmX3lfc2l6ZTsKKwkJY29uZmlnX2Nhdl9sdXRfZXgoMyAqIGkgKyAyLAorCQkJYnVmX3N0YXJ0ICsKKwkJCWRlY2J1Zl95X3NpemUgKyBkZWNidWZfdXZfc2l6ZSwKKwkJCWNhbnZhc193aWR0aCAvIDIsIGNhbnZhc19oZWlnaHQgLyAyLAorCQkJQ0FOVkFTX0FERFJfTk9XUkFQLCBDQU5WQVNfQkxLTU9ERV8zMlgzMiwgMCwgVkRFQ18xKTsKKwkJdmMxX2NhbnZhc19jb25maWdbaV1bMl0uZW5kaWFuID0gMDsKKwkJdmMxX2NhbnZhc19jb25maWdbaV1bMl0ud2lkdGggPSBjYW52YXNfd2lkdGggPj4gMTsKKwkJdmMxX2NhbnZhc19jb25maWdbaV1bMl0uaGVpZ2h0ID0gY2FudmFzX2hlaWdodCA+PiAxOworCQl2YzFfY2FudmFzX2NvbmZpZ1tpXVsyXS5ibG9ja19tb2RlID0gQ0FOVkFTX0JMS01PREVfMzJYMzI7CisJCXZjMV9jYW52YXNfY29uZmlnW2ldWzJdLnBoeV9hZGRyID0gYnVmX3N0YXJ0ICsKKwkJCWRlY2J1Zl95X3NpemUgKyBkZWNidWZfdXZfc2l6ZTsKKyNlbmRpZgorCisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZ2YzFfcHJvdF9pbml0KHZvaWQpCit7CisJaW50IHI7CisjaWYgMQkvKiAvTUVTT05fQ1BVX1RZUEUgPj0gTUVTT05fQ1BVX1RZUEVfTUVTT042ICovCisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAoMSA8PCA3KSB8ICgxIDw8IDYpIHwgKDEgPDwgNCkpOworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgMCk7CisKKwlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMCk7CisKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsICgxIDw8IDcpIHwgKDEgPDwgNikgfCAoMSA8PCA0KSk7CisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAwKTsKKworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgKDEgPDwgOSkgfCAoMSA8PCA4KSk7CisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAwKTsKKworI2Vsc2UKKwlXUklURV9SRVNFVF9SRUcoUkVTRVQwX1JFR0lTVEVSLAorCQkJCSAgIFJFU0VUX0lRSURDVCB8IFJFU0VUX01DIHwgUkVTRVRfVkxEX1BBUlQpOworCVJFQURfUkVTRVRfUkVHKFJFU0VUMF9SRUdJU1RFUik7CisJV1JJVEVfUkVTRVRfUkVHKFJFU0VUMF9SRUdJU1RFUiwKKwkJCQkgICBSRVNFVF9JUUlEQ1QgfCBSRVNFVF9NQyB8IFJFU0VUX1ZMRF9QQVJUKTsKKworCVdSSVRFX1JFU0VUX1JFRyhSRVNFVDJfUkVHSVNURVIsIFJFU0VUX1BJQ19EQyB8IFJFU0VUX0RCTEspOworI2VuZGlmCisKKwlXUklURV9WUkVHKFBPV0VSX0NUTF9WTEQsIDB4MTApOworCVdSSVRFX1ZSRUdfQklUUyhWTERfTUVNX1ZJRklGT19DT05UUk9MLCAyLCBNRU1fRklGT19DTlRfQklULCAyKTsKKwlXUklURV9WUkVHX0JJVFMoVkxEX01FTV9WSUZJRk9fQ09OVFJPTCwgOCwgTUVNX0xFVkVMX0NOVF9CSVQsIDYpOworCisJciA9IHZ2YzFfY2FudmFzX2luaXQoKTsKKworCS8qIGluZGV4IHYgPDwgMTYgfCB1IDw8IDggfCB5ICovCisjaWZkZWYgTlYyMQorCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8wLCAweDAxMDEwMCk7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzEsIDB4MDMwMzAyKTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfMiwgMHgwNTA1MDQpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8zLCAweDA3MDcwNik7CisvKglXUklURV9WUkVHKEFWX1NDUkFUQ0hfRywgMHgwOTA5MDgpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9ILCAweDBiMGIwYSk7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0ksIDB4MGQwZDBjKTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfSiwgMHgwZjBmMGUpOyovCisjZWxzZQorCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8wLCAweDAyMDEwMCk7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzEsIDB4MDUwNDAzKTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfMiwgMHgwODA3MDYpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8zLCAweDBiMGEwOSk7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0csIDB4MDkwOTA4KTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfSCwgMHgwYjBiMGEpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9JLCAweDBkMGQwYyk7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0osIDB4MGYwZjBlKTsKKyNlbmRpZgorCisJLyogbm90aWZ5IHVjb2RlIHRoZSBidWZmZXIgb2Zmc2V0ICovCisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0YsIGJ1Zl9vZmZzZXQpOworCisJLyogZGlzYWJsZSBQU0NBTEUgZm9yIGhhcmR3YXJlIHNoYXJpbmcgKi8KKwlXUklURV9WUkVHKFBTQ0FMRV9DVFJMLCAwKTsKKworCVdSSVRFX1ZSRUcoVkMxX1NPU19DT1VOVCwgMCk7CisJV1JJVEVfVlJFRyhWQzFfQlVGRkVSSU4sIDApOworCVdSSVRFX1ZSRUcoVkMxX0JVRkZFUk9VVCwgMCk7CisKKwkvKiBjbGVhciBtYWlsYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoQVNTSVNUX01CT1gxX0NMUl9SRUcsIDEpOworCisJLyogZW5hYmxlIG1haWxib3ggaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfTUFTSywgMSk7CisKKyNpZmRlZiBOVjIxCisJU0VUX1ZSRUdfTUFTSyhNREVDX1BJQ19EQ19DVFJMLCAxIDw8IDE3KTsKKyNlbmRpZgorCUNMRUFSX1ZSRUdfTUFTSyhNREVDX1BJQ19EQ19DVFJMLCAxIDw8IDE2KTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCB2dmMxX2xvY2FsX2luaXQoYm9vbCBpc19yZXNldCkKK3sKKwlpbnQgaTsKKworCS8qIHZ2YzFfcmF0aW8gPSAweDEwMDsgKi8KKwl2dmMxX3JhdGlvID0gdnZjMV9hbXN0cmVhbV9kZWNfaW5mby5yYXRpbzsKKworCWF2aV9mbGFnID0gKHVuc2lnbmVkIGxvbmcpIHZ2YzFfYW1zdHJlYW1fZGVjX2luZm8ucGFyYW0gJiAweDAxOworCisJdW5zdGFibGVfcHRzID0gKCgodW5zaWduZWQgbG9uZykgdnZjMV9hbXN0cmVhbV9kZWNfaW5mby5wYXJhbSAmIDB4NDApID4+IDYpOworCWlmICh1bnN0YWJsZV9wdHNfZGVidWcgPT0gMSkgeworCQl1bnN0YWJsZV9wdHMgPSAxOworCQlwcl9pbmZvKCJ2YzEgaW5pdCAsIHVuc3RhYmxlX3B0c19kZWJ1ZyA9ICV1XG4iLHVuc3RhYmxlX3B0c19kZWJ1Zyk7CisJfQorCXRvdGFsX2ZyYW1lID0gMDsKKworCW5leHRfcHRzID0gMDsKKworCW5leHRfcHRzX3VzNjQgPSAwOworCXNhdmVkX3Jlc29sdXRpb24gPSAwOworCWZyYW1lX3dpZHRoID0gZnJhbWVfaGVpZ2h0ID0gZnJhbWVfZHVyID0gMDsKKyNpZmRlZiBERUJVR19QVFMKKwlwdHNfaGl0ID0gcHRzX21pc3NlZCA9IHB0c19pX2hpdCA9IHB0c19pX21pc3NlZCA9IDA7CisjZW5kaWYKKworCW1lbXNldCgmZnJtLCAwLCBzaXplb2YoZnJtKSk7CisKKwlpZiAoIWlzX3Jlc2V0KSB7CisJCWZvciAoaSA9IDA7IGkgPCBERUNPREVfQlVGRkVSX05VTV9NQVg7IGkrKykKKwkJCXZmYnVmX3VzZVtpXSA9IDA7CisKKwkJSU5JVF9LRklGTyhkaXNwbGF5X3EpOworCQlJTklUX0tGSUZPKHJlY3ljbGVfcSk7CisJCUlOSVRfS0ZJRk8obmV3ZnJhbWVfcSk7CisJCWN1cl9wb29sX2lkeCBePSAxOworCQlmb3IgKGkgPSAwOyBpIDwgVkZfUE9PTF9TSVpFOyBpKyspIHsKKwkJCWNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqdmY7CisKKwkJCWlmIChjdXJfcG9vbF9pZHggPT0gMCkgeworCQkJCXZmID0gJnZmcG9vbFtpXTsKKwkJCQl2ZnBvb2xbaV0uaW5kZXggPSBERUNPREVfQlVGRkVSX05VTV9NQVg7CisJCQl9IGVsc2UgeworCQkJCXZmID0gJnZmcG9vbDJbaV07CisJCQkJdmZwb29sMltpXS5pbmRleCA9IERFQ09ERV9CVUZGRVJfTlVNX01BWDsKKwkJCX0KKwkJCWtmaWZvX3B1dCgmbmV3ZnJhbWVfcSwgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwkJfQorCX0KKworCWlmIChtbV9ibGtfaGFuZGxlKSB7CisJCWRlY29kZXJfYm1tdV9ib3hfZnJlZShtbV9ibGtfaGFuZGxlKTsKKwkJbW1fYmxrX2hhbmRsZSA9IE5VTEw7CisJfQorCisJCW1tX2Jsa19oYW5kbGUgPSBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2JveCgKKwkJCURSSVZFUl9OQU1FLAorCQkJMCwKKwkJCU1BWF9CTU1VX0JVRkZFUl9OVU0sCisJCQk0ICsgUEFHRV9TSElGVCwKKwkJCUNPREVDX01NX0ZMQUdTX0NNQV9DTEVBUiB8CisJCQlDT0RFQ19NTV9GTEFHU19GT1JfVkRFQ09ERVIpOworfQorCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfUE9TVF9QUk9DRVNTX01BTkFHRVIKK3N0YXRpYyB2b2lkIHZ2YzFfcHBtZ3JfcmVzZXQodm9pZCkKK3sKKwl2Zl9ub3RpZnlfcmVjZWl2ZXIoUFJPVklERVJfTkFNRSwgVkZSQU1FX0VWRU5UX1BST1ZJREVSX1JFU0VULCBOVUxMKTsKKworCXZ2YzFfbG9jYWxfaW5pdCh0cnVlKTsKKworCS8qIHZmX25vdGlmeV9yZWNlaXZlcihQUk9WSURFUl9OQU1FLAorCSAqIFZGUkFNRV9FVkVOVF9QUk9WSURFUl9TVEFSVCxOVUxMKTsKKwkgKi8KKworCXByX2luZm8oInZ2YzFkZWM6IHZmX3BwbWdyX3Jlc2V0XG4iKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB2dmMxX3NldF9jbGsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCQlpbnQgZnBzID0gOTYwMDAgLyBmcmFtZV9kdXI7CisKKwkJc2F2ZWRfcmVzb2x1dGlvbiA9IGZyYW1lX3dpZHRoICogZnJhbWVfaGVpZ2h0ICogZnBzOworCQl2ZGVjX3NvdXJjZV9jaGFuZ2VkKFZGT1JNQVRfVkMxLAorCQkJZnJhbWVfd2lkdGgsIGZyYW1lX2hlaWdodCwgZnBzKTsKKworfQorCitzdGF0aWMgdm9pZCBlcnJvcl9kb193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwkJYW12ZGVjX3N0b3AoKTsKKwkJbXNsZWVwKDIwKTsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19QT1NUX1BST0NFU1NfTUFOQUdFUgorCQl2dmMxX3BwbWdyX3Jlc2V0KCk7CisjZWxzZQorCQl2Zl9saWdodF91bnJlZ19wcm92aWRlcigmdnZjMV92Zl9wcm92KTsKKwkJdnZjMV9sb2NhbF9pbml0KHRydWUpOworCQl2Zl9yZWdfcHJvdmlkZXIoJnZ2YzFfdmZfcHJvdik7CisjZW5kaWYKKwkJdnZjMV9wcm90X2luaXQoKTsKKwkJYW12ZGVjX3N0YXJ0KCk7Cit9CisKK3N0YXRpYyB2b2lkIHZ2YzFfcHV0X3RpbWVyX2Z1bmMoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworCWlmIChSRUFEX1ZSRUcoVkMxX1NPU19DT1VOVCkgPiAxMCkKKwkJc2NoZWR1bGVfd29yaygmZXJyb3Jfd2Rfd29yayk7CisKKwl2YzFfc2V0X3JwKCk7CisKKwl3aGlsZSAoIWtmaWZvX2lzX2VtcHR5KCZyZWN5Y2xlX3EpICYmIChSRUFEX1ZSRUcoVkMxX0JVRkZFUklOKSA9PSAwKSkgeworCQlzdHJ1Y3QgdmZyYW1lX3MgKnZmOworCisJCWlmIChrZmlmb19nZXQoJnJlY3ljbGVfcSwgJnZmKSkgeworCQkJaWYgKCh2Zi0+aW5kZXggPCBERUNPREVfQlVGRkVSX05VTV9NQVgpICYmCisJCQkJKC0tdmZidWZfdXNlW3ZmLT5pbmRleF0gPT0gMCkpIHsKKwkJCQlXUklURV9WUkVHKFZDMV9CVUZGRVJJTiwgfigxIDw8IHZmLT5pbmRleCkpOworCQkJCXZmLT5pbmRleCA9IERFQ09ERV9CVUZGRVJfTlVNX01BWDsKKwkJCX0KKwkJaWYgKHBvb2xfaW5kZXgodmYpID09IGN1cl9wb29sX2lkeCkKKwkJCWtmaWZvX3B1dCgmbmV3ZnJhbWVfcSwgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwkJfQorCX0KKworCWlmIChmcmFtZV9kdXIgPiAwICYmIHNhdmVkX3Jlc29sdXRpb24gIT0KKwkJZnJhbWVfd2lkdGggKiBmcmFtZV9oZWlnaHQgKiAoOTYwMDAgLyBmcmFtZV9kdXIpKQorCQlzY2hlZHVsZV93b3JrKCZzZXRfY2xrX3dvcmspOworCXRpbWVyLT5leHBpcmVzID0gamlmZmllcyArIFBVVF9JTlRFUlZBTDsKKworCWFkZF90aW1lcih0aW1lcik7Cit9CisKK3N0YXRpYyBzMzIgdnZjMV9pbml0KHZvaWQpCit7CisJaW50IHJldCA9IC0xOworCWNoYXIgKmJ1ZiA9IHZtYWxsb2MoMHgxMDAwICogMTYpOworCWludCBmd190eXBlID0gVklERU9fREVDX1ZDMTsKKworCWlmIChJU19FUlJfT1JfTlVMTChidWYpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByX2luZm8oInZ2YzFfaW5pdCwgZm9ybWF0ICVkXG4iLCB2dmMxX2Ftc3RyZWFtX2RlY19pbmZvLmZvcm1hdCk7CisJdGltZXJfc2V0dXAoJnJlY3ljbGVfdGltZXIsIHZ2YzFfcHV0X3RpbWVyX2Z1bmMsIDApOworCisJc3RhdCB8PSBTVEFUX1RJTUVSX0lOSVQ7CisKKwlpbnRyYV9vdXRwdXQgPSAwOworCWFtdmRlY19lbmFibGUoKTsKKworCXZ2YzFfbG9jYWxfaW5pdChmYWxzZSk7CisKKwlpZiAodnZjMV9hbXN0cmVhbV9kZWNfaW5mby5mb3JtYXQgPT0gVklERU9fREVDX0ZPUk1BVF9XTVYzKSB7CisJCXByX2luZm8oIldNVjMgZGVjIGZvcm1hdFxuIik7CisJCXZ2YzFfZm9ybWF0ID0gVklERU9fREVDX0ZPUk1BVF9XTVYzOworCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfNCwgMCk7CisJfSBlbHNlIGlmICh2dmMxX2Ftc3RyZWFtX2RlY19pbmZvLmZvcm1hdCA9PSBWSURFT19ERUNfRk9STUFUX1dWQzEpIHsKKwkJcHJfaW5mbygiV1ZDMSBkZWMgZm9ybWF0XG4iKTsKKwkJdnZjMV9mb3JtYXQgPSBWSURFT19ERUNfRk9STUFUX1dWQzE7CisJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF80LCAxKTsKKwl9IGVsc2UKKwkJcHJfaW5mbygibm90IHN1cHBvcnRlZCBWQzEgZm9ybWF0XG4iKTsKKworCWlmIChnZXRfZmlybXdhcmVfZGF0YShmd190eXBlLCBidWYpIDwgMCkgeworCQlhbXZkZWNfZGlzYWJsZSgpOworCQlwcl9lcnIoImdldCBmaXJtd2FyZSBmYWlsLiIpOworCQl2ZnJlZShidWYpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0ID0gYW12ZGVjX2xvYWRtY19leChWRk9STUFUX1ZDMSwgTlVMTCwgYnVmKTsKKwlpZiAocmV0IDwgMCkgeworCQlhbXZkZWNfZGlzYWJsZSgpOworCQl2ZnJlZShidWYpOworCQlwcl9lcnIoIlZDMTogdGhlICVzIGZ3IGxvYWRpbmcgZmFpbGVkLCBlcnI6ICV4XG4iLAorCQkJdGVlX2VuYWJsZWQoKSA/ICJURUUiIDogImxvY2FsIiwgcmV0KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwl2ZnJlZShidWYpOworCisJc3RhdCB8PSBTVEFUX01DX0xPQUQ7CisKKwkvKiBlbmFibGUgQU1SSVNDIHNpZGUgcHJvdG9jb2wgKi8KKwlyZXQgPSB2dmMxX3Byb3RfaW5pdCgpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKHZkZWNfcmVxdWVzdF9pcnEoVkRFQ19JUlFfMSwgdnZjMV9pc3IsCisJCQkidnZjMS1pcnEiLCAodm9pZCAqKXZ2YzFfZGVjX2lkKSkgeworCQlhbXZkZWNfZGlzYWJsZSgpOworCisJCXByX2luZm8oInZ2YzEgaXJxIHJlZ2lzdGVyIGVycm9yLlxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXN0YXQgfD0gU1RBVF9JU1JfUkVHOworI2lmZGVmIENPTkZJR19BTUxPR0lDX1BPU1RfUFJPQ0VTU19NQU5BR0VSCisJdmZfcHJvdmlkZXJfaW5pdCgmdnZjMV92Zl9wcm92LAorCQlQUk9WSURFUl9OQU1FLCAmdnZjMV92Zl9wcm92aWRlciwgTlVMTCk7CisJdmZfcmVnX3Byb3ZpZGVyKCZ2dmMxX3ZmX3Byb3YpOworCXZmX25vdGlmeV9yZWNlaXZlcihQUk9WSURFUl9OQU1FLAorCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfU1RBUlQsIE5VTEwpOworI2Vsc2UKKwl2Zl9wcm92aWRlcl9pbml0KCZ2dmMxX3ZmX3Byb3YsCisJCVBST1ZJREVSX05BTUUsICZ2dmMxX3ZmX3Byb3ZpZGVyLCBOVUxMKTsKKwl2Zl9yZWdfcHJvdmlkZXIoJnZ2YzFfdmZfcHJvdik7CisjZW5kaWYKKworCWlmICghaXNfcmVzZXQpCisJCXZmX25vdGlmeV9yZWNlaXZlcihQUk9WSURFUl9OQU1FLAorCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9GUl9ISU5ULAorCQkJCSh2b2lkICopCisJCQkJKCh1bnNpZ25lZCBsb25nKXZ2YzFfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSkpOworCisJc3RhdCB8PSBTVEFUX1ZGX0hPT0s7CisKKwlyZWN5Y2xlX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgUFVUX0lOVEVSVkFMOworCWFkZF90aW1lcigmcmVjeWNsZV90aW1lcik7CisKKwlzdGF0IHw9IFNUQVRfVElNRVJfQVJNOworCisJYW12ZGVjX3N0YXJ0KCk7CisKKwlzdGF0IHw9IFNUQVRfVkRFQ19SVU47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbXZkZWNfdmMxX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHZkZWNfcyAqcGRhdGEgPSAqKHN0cnVjdCB2ZGVjX3MgKiopcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAocGRhdGEgPT0gTlVMTCkgeworCQlwcl9pbmZvKCJhbXZkZWNfdmMxIG1lbW9yeSByZXNvdXJjZSB1bmRlZmluZWQuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKHBkYXRhLT5zeXNfaW5mbykgeworCQl2dmMxX2Ftc3RyZWFtX2RlY19pbmZvID0gKnBkYXRhLT5zeXNfaW5mbzsKKworCQlpZiAoKHZ2YzFfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0ICE9IDApICYmCisJCQkodnZjMV9hbXN0cmVhbV9kZWNfaW5mby53aWR0aCA+CisJCQkoVkMxX01BWF9TVVBQT1JUX1NJWkUvdnZjMV9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQpKSkgeworCQkJcHJfaW5mbygiYW12ZGVjX3ZjMTogb3ZlciBzaXplLCB1bnN1cHBvcnQ6ICVkICogJWRcbiIsCisJCQkJdnZjMV9hbXN0cmVhbV9kZWNfaW5mby53aWR0aCwKKwkJCQl2dmMxX2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodCk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0KKwlwZGF0YS0+ZGVjX3N0YXR1cyA9IHZ2YzFfZGVjX3N0YXR1czsKKwlwZGF0YS0+c2V0X2lzcmVzZXQgPSB2dmMxX3NldF9pc3Jlc2V0OworCWlzX3Jlc2V0ID0gMDsKKwl2ZGVjID0gcGRhdGE7CisKKwl2dmMxX3ZkZWNfaW5mb19pbml0KCk7CisKKwlJTklUX1dPUksoJmVycm9yX3dkX3dvcmssIGVycm9yX2RvX3dvcmspOworCUlOSVRfV09SSygmc2V0X2Nsa193b3JrLCB2dmMxX3NldF9jbGspOworCXNwaW5fbG9ja19pbml0KCZ2YzFfcnBfbG9jayk7CisJaWYgKHZ2YzFfaW5pdCgpIDwgMCkgeworCQlwcl9pbmZvKCJhbXZkZWNfdmMxIGluaXQgZmFpbGVkLlxuIik7CisJCWtmcmVlKGd2cyk7CisJCWd2cyA9IE5VTEw7CisJCXBkYXRhLT5kZWNfc3RhdHVzID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW12ZGVjX3ZjMV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwljYW5jZWxfd29ya19zeW5jKCZlcnJvcl93ZF93b3JrKTsKKwlpZiAoc3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJYW12ZGVjX3N0b3AoKTsKKwkJc3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwl9CisKKwlpZiAoc3RhdCAmIFNUQVRfSVNSX1JFRykgeworCQl2ZGVjX2ZyZWVfaXJxKFZERUNfSVJRXzEsICh2b2lkICopdnZjMV9kZWNfaWQpOworCQlzdGF0ICY9IH5TVEFUX0lTUl9SRUc7CisJfQorCisJaWYgKHN0YXQgJiBTVEFUX1RJTUVSX0FSTSkgeworCQlkZWxfdGltZXJfc3luYygmcmVjeWNsZV90aW1lcik7CisJCXN0YXQgJj0gflNUQVRfVElNRVJfQVJNOworCX0KKworCWNhbmNlbF93b3JrX3N5bmMoJnNldF9jbGtfd29yayk7CisJaWYgKHN0YXQgJiBTVEFUX1ZGX0hPT0spIHsKKwkJaWYgKCFpc19yZXNldCkKKwkJCXZmX25vdGlmeV9yZWNlaXZlcihQUk9WSURFUl9OQU1FLAorCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfRlJfRU5EX0hJTlQsCisJCQkJCU5VTEwpOworCisJCXZmX3VucmVnX3Byb3ZpZGVyKCZ2dmMxX3ZmX3Byb3YpOworCQlzdGF0ICY9IH5TVEFUX1ZGX0hPT0s7CisJfQorCisJYW12ZGVjX2Rpc2FibGUoKTsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RNMikKKwkJdmRlY19yZXNldF9jb3JlKE5VTEwpOworCisJaWYgKG1tX2Jsa19oYW5kbGUpIHsKKwkJZGVjb2Rlcl9ibW11X2JveF9mcmVlKG1tX2Jsa19oYW5kbGUpOworCQltbV9ibGtfaGFuZGxlID0gTlVMTDsKKwl9CisKKyNpZmRlZiBERUJVR19QVFMKKwlwcl9kZWJ1ZygicHRzIGhpdCAlZCwgcHRzIG1pc3NlZCAlZCwgaSBoaXQgJWQsIG1pc3NlZCAlZFxuIiwgcHRzX2hpdCwKKwkJcHRzX21pc3NlZCwgcHRzX2lfaGl0LCBwdHNfaV9taXNzZWQpOworCXByX2RlYnVnKCJ0b3RhbCBmcmFtZSAlZCwgYXZpX2ZsYWcgJWQsIHJhdGUgJWRcbiIsCisJCXRvdGFsX2ZyYW1lLCBhdmlfZmxhZywKKwkJdnZjMV9hbXN0cmVhbV9kZWNfaW5mby5yYXRlKTsKKyNlbmRpZgorCWtmcmVlKGd2cyk7CisJZ3ZzID0gTlVMTDsKKwl2ZGVjID0gTlVMTDsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYW12ZGVjX3ZjMV9kcml2ZXIgPSB7CisJLnByb2JlID0gYW12ZGVjX3ZjMV9wcm9iZSwKKwkucmVtb3ZlID0gYW12ZGVjX3ZjMV9yZW1vdmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBhbXZkZWNfc3VzcGVuZCwKKwkucmVzdW1lID0gYW12ZGVjX3Jlc3VtZSwKKyNlbmRpZgorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJJVkVSX05BTUUsCisJfQorfTsKKworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfTUVTT04pCS8qbWVzb24xIG9ubHkgc3VwcG9ydCBwcm9ncmVzc2l2ZSAqLworc3RhdGljIHN0cnVjdCBjb2RlY19wcm9maWxlX3QgYW12ZGVjX3ZjMV9wcm9maWxlID0geworCS5uYW1lID0gInZjMSIsCisJLnByb2ZpbGUgPSAicHJvZ3Jlc3NpdmUsIHdtdjMiCit9OworI2Vsc2UKK3N0YXRpYyBzdHJ1Y3QgY29kZWNfcHJvZmlsZV90IGFtdmRlY192YzFfcHJvZmlsZSA9IHsKKwkubmFtZSA9ICJ2YzEiLAorCS5wcm9maWxlID0gInByb2dyZXNzaXZlLCBpbnRlcmxhY2UsIHdtdjMiCit9OworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IGFtdmRlY192YzFfZHJpdmVyX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcHJfZGVidWcoImFtdmRlY192YzEgbW9kdWxlIGluaXRcbiIpOworCisJaWYgKHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYW12ZGVjX3ZjMV9kcml2ZXIpKSB7CisJCXByX2VycigiZmFpbGVkIHRvIHJlZ2lzdGVyIGFtdmRlY192YzEgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXZjb2RlY19wcm9maWxlX3JlZ2lzdGVyKCZhbXZkZWNfdmMxX3Byb2ZpbGUpOworCXZjb2RlY19mZWF0dXJlX3JlZ2lzdGVyKFZGT1JNQVRfVkMxLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFtdmRlY192YzFfZHJpdmVyX3JlbW92ZV9tb2R1bGUodm9pZCkKK3sKKwlwcl9kZWJ1ZygiYW12ZGVjX3ZjMSBtb2R1bGUgcmVtb3ZlLlxuIik7CisKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYW12ZGVjX3ZjMV9kcml2ZXIpOworfQorbW9kdWxlX3BhcmFtKHVuc3RhYmxlX3B0c19kZWJ1ZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHVuc3RhYmxlX3B0c19kZWJ1ZywgIlxuIGFtdmRlY192YzEgdW5zdGFibGVfcHRzXG4iKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCittb2R1bGVfaW5pdChhbXZkZWNfdmMxX2RyaXZlcl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChhbXZkZWNfdmMxX2RyaXZlcl9yZW1vdmVfbW9kdWxlKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTUxPR0lDIFZDMSBWaWRlbyBEZWNvZGVyIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiUWkgV2FuZyA8cWkud2FuZ0BhbWxvZ2ljLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci92cDkvTWFrZWZpbGUgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdnA5L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZWRlZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdnA5L01ha2VmaWxlCkBAIC0wLDAgKzEsMiBAQAorb2JqLSQoQ09ORklHX0FNTE9HSUNfTUVESUFfVkRFQ19WUDkpICs9IGFtdmRlY192cDkubworYW12ZGVjX3ZwOS1vYmpzICs9IHZ2cDkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3ZwOS92dnA5LmMgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdnA5L3Z2cDkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmE0N2ZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3ZwOS92dnA5LmMKQEAgLTAsMCArMSwxMjg0MCBAQAorIC8qCisgICogZHJpdmVycy9hbWxvZ2ljL2FtcG9ydHMvdnZwOS5jCisgICoKKyAgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAqCisgICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgKgorICAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAgKiBtb3JlIGRldGFpbHMuCisgICoKKyAgKi8KKyNkZWZpbmUgREVCVUcKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy9hbXN0cmVhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmZvcm1hdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZnJhbWVfc3luYy9wdHNzZXJ2Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jYW52YXMvY2FudmFzLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3Byb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3JlY2VpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtY29udGlndW91cy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvdGVlLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC90ZWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC9jbG9jay5oPgorI2luY2x1ZGUgIi4uLy4uLy4uL3N0cmVhbV9pbnB1dC9hbXBvcnRzL2FtcG9ydHNfcHJpdi5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29kZWNfbW0uaD4KKyNpbmNsdWRlICIuLi91dGlscy9kZWNvZGVyX21tdV9ib3guaCIKKyNpbmNsdWRlICIuLi91dGlscy9kZWNvZGVyX2JtbXVfYm94LmgiCisKKyNkZWZpbmUgTUVNX05BTUUgImNvZGVjX3ZwOSIKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL3ZkZWNfcmVnLmg+CisjaW5jbHVkZSAiLi4vdXRpbHMvdmRlYy5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL2FtdmRlYy5oIgorI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX01VTFRJX0RFQworI2luY2x1ZGUgIi4uL3V0aWxzL3ZkZWNfcHJvZmlsZS5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZpZGVvX3NpbmsvdmlkZW8uaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvbmZpZ3MuaD4KKyNpbmNsdWRlICIuLi91dGlscy9jb25maWdfcGFyc2VyLmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvZmlybXdhcmUuaCIKKyNpbmNsdWRlICIuLi8uLi8uLi9jb21tb24vY2hpcHMvZGVjb2Rlcl9jcHVfdmVyX2luZm8uaCIKKyNpbmNsdWRlICIuLi91dGlscy92ZGVjX3Y0bDJfYnVmZmVyX29wcy5oIgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItbWVtMm1lbS5oPgorI2luY2x1ZGUgIi4uL3V0aWxzL3ZkZWNfZmVhdHVyZS5oIgorCisjZGVmaW5lIE1JWF9TVFJFQU1fU1VQUE9SVAorCisjaW5jbHVkZSAidnZwOS5oIgorCisjZGVmaW5lIFZQOV8xMEJfTU1VX0RXCisvKiNkZWZpbmUgU1VQUE9SVF9GQl9ERUNPRElORyovCisvKiNkZWZpbmUgRkJfREVDT0RJTkdfVEVTVF9TQ0hFRFVMRSovCisKKyNkZWZpbmUgQ09fTVZfQ09NUFJFU1MKKyNkZWZpbmUgSFdfTUFTS19GUk9OVCAgICAweDEKKyNkZWZpbmUgSFdfTUFTS19CQUNLICAgICAweDIKKworI2RlZmluZSBWUDlEX01QUF9SRUZJTkZPX1RCTF9BQ0NDT05GSUcgICAgICAgICAgICAgMHgzNDQyCisjZGVmaW5lIFZQOURfTVBQX1JFRklORk9fREFUQSAgICAgICAgICAgICAgICAgICAgICAweDM0NDMKKyNkZWZpbmUgVlA5RF9NUFBfUkVGX1NDQUxFX0VOQkwgICAgICAgICAgICAgICAgICAgIDB4MzQ0MQorI2RlZmluZSBIRVZDX01QUkVEX0NUUkw0ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMjRjCisjZGVmaW5lIEhFVkNfQ01fSEVBREVSX1NUQVJUX0FERFIgICAgICAgICAgICAgICAgICAweDM2MjgKKyNkZWZpbmUgSEVWQ19EQkxLX0NGR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzUwYgorI2RlZmluZSBIRVZDRF9NUFBfQU5DMkFYSV9UQkxfREFUQSAgICAgICAgICAgICAgICAgMHgzNDY0CisjZGVmaW5lIEhFVkNfU0FPX01NVV9WSDFfQUREUiAgICAgICAgICAgICAgICAgICAgICAweDM2M2IKKyNkZWZpbmUgSEVWQ19TQU9fTU1VX1ZIMF9BRERSICAgICAgICAgICAgICAgICAgICAgIDB4MzYzYQorI2RlZmluZSBIRVZDX1NBT19NTVVfVkgwX0FERFIyICAgICAgICAgICAgICAgICAgICAgMHgzNjRkCisjZGVmaW5lIEhFVkNfU0FPX01NVV9WSDFfQUREUjIgICAgICAgICAgICAgICAgICAgICAweDM2NGUKKyNkZWZpbmUgSEVWQ19NVl9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzEwZAorI2RlZmluZSBIRVZDX1FQX0lORk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMTM3CisjZGVmaW5lIEhFVkNfU0tJUF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMxMzYKKworI2RlZmluZSBIRVZDX1NBT19DVFJMOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNjJkCisjZGVmaW5lIEhFVkNfQ01fSEVBREVSX1NUQVJUX0FERFIyICAgICAgICAgICAgICAgICAweDM2NGEKKyNkZWZpbmUgSEVWQ19TQU9fTU1VX0RNQV9DVFJMMiAgICAgICAgICAgICAgICAgICAgIDB4MzY0YworI2RlZmluZSBIRVZDX1NBT19NTVVfVkgwX0FERFIyICAgICAgICAgICAgICAgICAgICAgMHgzNjRkCisjZGVmaW5lIEhFVkNfU0FPX01NVV9WSDFfQUREUjIgICAgICAgICAgICAgICAgICAgICAweDM2NGUKKyNkZWZpbmUgSEVWQ19TQU9fTU1VX1NUQVRVUzIgICAgICAgICAgICAgICAgICAgICAgIDB4MzY1MAorI2RlZmluZSBIRVZDX0RXX1ZIMF9BREREUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNjVlCisjZGVmaW5lIEhFVkNfRFdfVkgxX0FERERSICAgICAgICAgICAgICAgICAgICAgICAgICAweDM2NWYKKworI2RlZmluZSBWUDlfMTBCX0RFQ19JRExFICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBWUDlfMTBCX0RFQ19GUkFNRV9IRUFERVIgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBWUDlfMTBCX0RFQ19TTElDRV9TRUdNRU5UICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBWUDlfMTBCX0RFQ09ERV9TTElDRSAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgVlA5XzEwQl9ESVNDQVJEX05BTCAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgVlA5X0RVTVBfTE1FTSAgICAgICAgICAgICAgICA3CisjZGVmaW5lIEhFVkNfREVDUElDX0RBVEFfRE9ORSAgICAgICAgICAgIDB4YQorI2RlZmluZSBIRVZDX0RFQ1BJQ19EQVRBX0VSUk9SICAgICAgICAgICAgMHhiCisjZGVmaW5lIEhFVkNfTkFMX0RFQ09ERV9ET05FICAgICAgICAgICAgMHhlCisjZGVmaW5lIEhFVkNfREVDT0RFX0JVRkVNUFRZICAgICAgICAweDIwCisjZGVmaW5lIEhFVkNfREVDT0RFX1RJTUVPVVQgICAgICAgICAweDIxCisjZGVmaW5lIEhFVkNfU0VBUkNIX0JVRkVNUFRZICAgICAgICAweDIyCisjZGVmaW5lIEhFVkNfREVDT0RFX09WRVJfU0laRSAgICAgICAweDIzCisjZGVmaW5lIEhFVkNfUzJfREVDT0RJTkdfRE9ORSAgICAgICAweDUwCisjZGVmaW5lIFZQOV9IRUFEX1BBUlNFUl9ET05FICAgICAgICAgICAgMHhmMAorI2RlZmluZSBWUDlfSEVBRF9TRUFSQ0hfRE9ORSAgICAgICAgICAweGYxCisjZGVmaW5lIFZQOV9FT1MgICAgICAgICAgICAgICAgICAgICAgICAweGYyCisjZGVmaW5lIEhFVkNfQUNUSU9OX0RPTkUgICAgICAgICAgICAgICAgMHhmZgorCisjZGVmaW5lIFZGX1BPT0xfU0laRSAgICAgICAgMzIKKworI3VuZGVmIHByX2luZm8KKyNkZWZpbmUgcHJfaW5mbyBwcmludGsKKworI2RlZmluZSBERUNPREVfTU9ERV9TSU5HTEUJCSgoMHg4MCA8PCAyNCkgfCAwKQorI2RlZmluZSBERUNPREVfTU9ERV9NVUxUSV9TVFJFQU1CQVNFCSgoMHg4MCA8PCAyNCkgfCAxKQorI2RlZmluZSBERUNPREVfTU9ERV9NVUxUSV9GUkFNRUJBU0UJKCgweDgwIDw8IDI0KSB8IDIpCisjZGVmaW5lIERFQ09ERV9NT0RFX1NJTkdMRV9MT1dfTEFURU5DWSAoKDB4ODAgPDwgMjQpIHwgMykKKyNkZWZpbmUgREVDT0RFX01PREVfTVVMVElfRlJBTUVCQVNFX05PSEVBRCAoKDB4ODAgPDwgMjQpIHwgNCkKKworI2RlZmluZSAgVlA5X1RSSUdHRVJfRlJBTUVfRE9ORQkJMHgxMDAKKyNkZWZpbmUgIFZQOV9UUklHR0VSX0ZSQU1FX0VOQUJMRQkweDIwMAorCisjZGVmaW5lIE1WX01FTV9VTklUIDB4MjQwCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSAicGFyc2VyX2NtZC5oIgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2RlZmluZSBQQVJTRVJfQ01EX1NLSVBfQ0ZHXzAgMHgwMDAwMDkwYgorCisjZGVmaW5lIFBBUlNFUl9DTURfU0tJUF9DRkdfMSAweDFiMTQxNDBmCisKKyNkZWZpbmUgUEFSU0VSX0NNRF9TS0lQX0NGR18yIDB4MDAxYjE5MTAKKworI2RlZmluZSBQQVJTRVJfQ01EX05VTUJFUiAzNworCisvKiNkZWZpbmUgSEVWQ19QSUNfU1RSVUNUX1NVUFBPUlQqLworLyogdG8gcmVtb3ZlLCBmaXggYnVpbGQgZXJyb3IgKi8KKworLyojZGVmaW5lIENPREVDX01NX0ZMQUdTX0ZPUl9WREVDT0RFUiAgMCovCisKKyNkZWZpbmUgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorI2RlZmluZSBTVVBQT1JUXzEwQklUCisvKiAjZGVmaW5lIEVSUk9SX0hBTkRMRV9ERUJVRyAqLworCisjaWZuZGVmIFNUQVRfS1RIUkVBRAorI2RlZmluZSBTVEFUX0tUSFJFQUQgMHg0MAorI2VuZGlmCisKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisjZGVmaW5lIE1BWF9ERUNPREVfSU5TVEFOQ0VfTlVNICAgICA5CisjZGVmaW5lIE1VTFRJX0RSSVZFUl9OQU1FICJhbW12ZGVjX3ZwOSIKKworc3RhdGljIHVuc2lnbmVkIGludCBtYXhfZGVjb2RlX2luc3RhbmNlX251bQorCQkJCT0gTUFYX0RFQ09ERV9JTlNUQU5DRV9OVU07CitzdGF0aWMgdW5zaWduZWQgaW50IGRlY29kZV9mcmFtZV9jb3VudFtNQVhfREVDT0RFX0lOU1RBTkNFX05VTV07CitzdGF0aWMgdW5zaWduZWQgaW50IGRpc3BsYXlfZnJhbWVfY291bnRbTUFYX0RFQ09ERV9JTlNUQU5DRV9OVU1dOworc3RhdGljIHVuc2lnbmVkIGludCBtYXhfcHJvY2Vzc190aW1lW01BWF9ERUNPREVfSU5TVEFOQ0VfTlVNXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnVuX2NvdW50W01BWF9ERUNPREVfSU5TVEFOQ0VfTlVNXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW5wdXRfZW1wdHlbTUFYX0RFQ09ERV9JTlNUQU5DRV9OVU1dOworc3RhdGljIHVuc2lnbmVkIGludCBub3RfcnVuX3JlYWR5W01BWF9ERUNPREVfSU5TVEFOQ0VfTlVNXTsKKworc3RhdGljIHUzMiBkZWNvZGVfdGltZW91dF92YWwgPSAyMDA7CitzdGF0aWMgaW50IHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwgPSAweDgwMDA7CitzdGF0aWMgdTMyIHdvcmtfYnVmX3NpemU7CisKK3N0YXRpYyB1MzIgZm9yY2VfcHRzX3Vuc3RhYmxlOworCitzdGF0aWMgdTMyIG12X2J1Zl9tYXJnaW47CisKK3N0YXRpYyB1MzIgbXZfYnVmX2R5bmFtaWNfYWxsb2M7CisKKy8qIERPVUJMRV9XUklURV9NT0RFIGlzIGVuYWJsZWQgb25seSB3aGVuIE5WMjEgOCBiaXQgb3V0cHV0IGlzIG5lZWRlZCAqLworLyogZG91YmxlX3dyaXRlX21vZGU6CisgKgkwLCBubyBkb3VibGUgd3JpdGU7CisgKgkxLCAxOjEgcmF0aW87CisgKgkyLCAoMS80KTooMS80KSByYXRpbzsKKyAqCTMsICgxLzQpOigxLzQpIHJhdGlvLCB3aXRoIGJvdGggY29tcHJlc3NlZCBmcmFtZSBpbmNsdWRlZAorICoJNCwgKDEvMik6KDEvMikgcmF0aW87CisgKgk4LCAoMS84KTooMS84KSByYXRpbzsKKyAqCTB4MTAsIGRvdWJsZSB3cml0ZSBvbmx5CisgKgkweDEwMCwgaWYgPiAxMDgwcCx1c2UgbW9kZSA0LGVsc2UgdXNlIG1vZGUgMTsKKyAqCTB4MjAwLCBpZiA+IDEwODBwLHVzZSBtb2RlIDIsZWxzZSB1c2UgbW9kZSAxOworICoJMHgzMDAsIGlmID4gNzIwcCwgdXNlIG1vZGUgNCwgZWxzZSB1c2UgbW9kZSAxOworICovCitzdGF0aWMgdTMyIGRvdWJsZV93cml0ZV9tb2RlOworCisjZGVmaW5lIERSSVZFUl9OQU1FICJhbXZkZWNfdnA5IgorI2RlZmluZSBEUklWRVJfSEVBREVSX05BTUUgImFtdmRlY192cDlfaGVhZGVyIgorCisKKyNkZWZpbmUgUFVUX0lOVEVSVkFMICAgICAgICAoSFovMTAwKQorI2RlZmluZSBFUlJPUl9TWVNURU1fUkVTRVRfQ09VTlQgICAyMDAKKworI2RlZmluZSBQVFNfTk9STUFMICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUFRTX05PTkVfUkVGX1VTRV9EVVJBVElPTiAxCisKKyNkZWZpbmUgUFRTX01PREVfU1dJVENISU5HX1RIUkVTSE9MRCAgICAgICAgICAgMworI2RlZmluZSBQVFNfTU9ERV9TV0lUQ0hJTkdfUkVDT1ZFUllfVEhSRUFTSE9MRCAzCisKKyNkZWZpbmUgRFVSMlBUUyh4KSAoKHgpKjkwLzk2KQorCitzdHJ1Y3QgVlA5RGVjb2Rlcl9zOworc3RhdGljIGludCB2dnA5X3ZmX3N0YXRlcyhzdHJ1Y3QgdmZyYW1lX3N0YXRlcyAqc3RhdGVzLCB2b2lkICopOworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyAqdnZwOV92Zl9wZWVrKHZvaWQgKik7CitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2dnA5X3ZmX2dldCh2b2lkICopOworc3RhdGljIHZvaWQgdnZwOV92Zl9wdXQoc3RydWN0IHZmcmFtZV9zICosIHZvaWQgKik7CitzdGF0aWMgaW50IHZ2cDlfZXZlbnRfY2IoaW50IHR5cGUsIHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGVfZGF0YSk7CisKK3N0YXRpYyBpbnQgdnZwOV9zdG9wKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSk7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorc3RhdGljIHMzMiB2dnA5X2luaXQoc3RydWN0IHZkZWNfcyAqdmRlYyk7CisjZWxzZQorc3RhdGljIHMzMiB2dnA5X2luaXQoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgdnZwOV9wcm90X2luaXQoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLCB1MzIgbWFzayk7CitzdGF0aWMgaW50IHZ2cDlfbG9jYWxfaW5pdChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpOworc3RhdGljIHZvaWQgdnZwOV9wdXRfdGltZXJfZnVuYyhzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpOworc3RhdGljIHZvaWQgZHVtcF9kYXRhKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwgaW50IHNpemUpOworc3RhdGljIHVuc2lnbmVkIGNoYXIgZ2V0X2RhdGFfY2hlY2tfc3VtCisJKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwgaW50IHNpemUpOworc3RhdGljIHZvaWQgZHVtcF9waWNfbGlzdChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpOworc3RhdGljIGludCB2cDlfYWxsb2NfbW11KAorCQlzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksCisJCWludCBjdXJfYnVmX2lkeCwKKwkJaW50IHBpY193aWR0aCwKKwkJaW50IHBpY19oZWlnaHQsCisJCXVuc2lnbmVkIHNob3J0IGJpdF9kZXB0aCwKKwkJdW5zaWduZWQgaW50ICptbXVfaW5kZXhfYWRyKTsKKyNpZmRlZiBWUDlfMTBCX01NVV9EVworaW50IHZwOV9hbGxvY19tbXVfZHcoCisJc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLAorCWludCBjdXJfYnVmX2lkeCwKKwlpbnQgcGljX3dpZHRoLAorCWludCBwaWNfaGVpZ2h0LAorCXVuc2lnbmVkIHNob3J0IGJpdF9kZXB0aCwKKwl1bnNpZ25lZCBpbnQgKm1tdV9pbmRleF9hZHIpOworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyIHZ2cDlfZGVjX2lkW10gPSAidnZwOS1kZXYiOworCisjZGVmaW5lIFBST1ZJREVSX05BTUUgICAiZGVjb2Rlci52cDkiCisjZGVmaW5lIE1VTFRJX0lOU1RBTkNFX1BST1ZJREVSX05BTUUgICAgInZkZWMudnA5IgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHZmcmFtZV9vcGVyYXRpb25zX3MgdnZwOV92Zl9wcm92aWRlciA9IHsKKwkucGVlayA9IHZ2cDlfdmZfcGVlaywKKwkuZ2V0ID0gdnZwOV92Zl9nZXQsCisJLnB1dCA9IHZ2cDlfdmZfcHV0LAorCS5ldmVudF9jYiA9IHZ2cDlfZXZlbnRfY2IsCisJLnZmX3N0YXRlcyA9IHZ2cDlfdmZfc3RhdGVzLAorfTsKKworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcHJvdmlkZXJfcyB2dnA5X3ZmX3Byb3Y7CisKK3N0YXRpYyB1MzIgYml0X2RlcHRoX2x1bWE7CitzdGF0aWMgdTMyIGJpdF9kZXB0aF9jaHJvbWE7CitzdGF0aWMgdTMyIGZyYW1lX3dpZHRoOworc3RhdGljIHUzMiBmcmFtZV9oZWlnaHQ7CitzdGF0aWMgdTMyIHZpZGVvX3NpZ25hbF90eXBlOworCitzdGF0aWMgdTMyIG9uX25vX2tleWZyYW1lX3NraXBlZDsKKworI2RlZmluZSBQUk9CX1NJWkUgICAgKDQ5NiAqIDIgKiA0KQorI2RlZmluZSBQUk9CX0JVRl9TSVpFICAgICgweDUwMDApCisjZGVmaW5lIENPVU5UX0JVRl9TSVpFICAgKDB4MzAwICogNCAqIDQpCisvKmNvbXB1dGVfbG9zbGVzc19jb21wX2JvZHlfc2l6ZSg0MDk2LCAyMzA0LCAxKSA9IDE4ODc0MzY4KDB4MTIwMDAwMCkqLworI2RlZmluZSBNQVhfRlJBTUVfNEtfTlVNIDB4MTIwMAorI2RlZmluZSBNQVhfRlJBTUVfOEtfTlVNIDB4NDgwMAorCisjZGVmaW5lIEhFVkNfQVNTSVNUX01NVV9NQVBfQUREUiAgICAgICAgICAgICAgICAgICAweDMwMDkKKy8vIGJpdFszMToyMF0gLS0gZmJfcmVhZF9sY3VfeQorLy8gUkVBRCBvbmx5Ly8gYml0WzE5OjhdICAtLSBmYl9yZWFkX2xjdV94CisvLyBSRUFEIG9ubHkvLyBiaXRbN10gICAgIC0tIGZiX3JlYWRfbGN1X2xhdGNoCisvLyBiaXRbNjo1XSAgIC0tIHJlc2VydmVkCisvLyBiaXRbNF0gIC0tIGZiX2Rpc2FibGVfd3JfaXFpdF9idWYKKy8vIGJpdFszXSAgLS0gZmJfcmVhZF9hdnMyX2VuYWJsZQorLy8gYml0WzJdICAtLSBmYl9yZWFkX3ZwOV9lbmFibGUKKy8vIGJpdFsxXSAgLS0gZmJfYXZzMl9lbmFibGUKKy8vIGJpdFswXSAgLS0gZmJfdnA5X2VuYWJsZQorI2RlZmluZSBIRVZDX0FTU0lTVF9IRURfRkJfQ1RMICAgICAgICAgICAgICAgICAgICAgMHgzMDBjCisvLyBbMzE6MTZdIGhlaWdodC8vIFsxNTowXSB3aWR0aAorI2RlZmluZSBIRVZDX0FTU0lTVF9QSUNfU0laRV9GQl9SRUFEICAgICAgICAgICAgICAgMHgzMDBkCisjZGVmaW5lIEhFVkNfQVNTSVNUX01NVV9NQVBfQUREUjIgICAgICAgICAgICAgICAgICAweDMwMGUKKworCisjaWZkZWYgU1VQUE9SVF9GQl9ERUNPRElORworLyogcmVnaXN0ZXIgZGVmaW5lICovCisjZGVmaW5lIEhFVkNfQVNTSVNUX0hFRF9GQl9XX0NUTCAgICAgICAgICAgICAgICAgICAweDMwMDYKKyNkZWZpbmUgSEVWQ19BU1NJU1RfSEVEX0ZCX1JfQ1RMICAgICAgICAgICAgICAgICAgIDB4MzAwNworI2RlZmluZSBIRVZDX0FTU0lTVF9IRURfRkJfQUREUiAgICAgICAgICAgICAgICAgICAgMHgzMDA4CisjZGVmaW5lIEhFVkNfQVNTSVNUX0ZCX01NVV9NQVBfQUREUiAgICAgICAgICAgICAgICAweDMwMGEKKyNkZWZpbmUgSEVWQ19BU1NJU1RfRkJEX01NVV9NQVBfQUREUiAgICAgICAgICAgICAgIDB4MzAwYgorCisKKyNkZWZpbmUgTUFYX1NUQUdFX1BBR0VfTlVNIDB4MTIwMAorI2RlZmluZSBTVEFHRV9NTVVfTUFQX1NJWkUgKE1BWF9TVEFHRV9QQUdFX05VTSAqIDQpCisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQgZGl2X3IzMihpbnQ2NF90IG0sIGludCBuKQoreworLyoKKyAqcmV0dXJuIChpbnQpKG0vbikKKyAqLworI2lmbmRlZiBDT05GSUdfQVJNNjQKKwlpbnQ2NF90IHF1ID0gMDsKKwlxdSA9IGRpdl9zNjQobSwgbik7CisJcmV0dXJuIChpbnQpcXU7CisjZWxzZQorCXJldHVybiAoaW50KShtL24pOworI2VuZGlmCit9CisKKy8qVVNFX0JVRl9CTE9DSyovCitzdHJ1Y3QgQlVGX3MgeworCWludCBpbmRleDsKKwl1bnNpZ25lZCBpbnQgYWxsb2NfZmxhZzsKKwkvKmJ1ZmZlciAqLworCXVuc2lnbmVkIGludCBjbWFfcGFnZV9jb3VudDsKKwl1bnNpZ25lZCBsb25nIGFsbG9jX2FkZHI7CisJdW5zaWduZWQgbG9uZyBzdGFydF9hZHI7CisJdW5zaWduZWQgaW50IHNpemU7CisKKwl1bnNpZ25lZCBpbnQgZnJlZV9zdGFydF9hZHI7CisJdWxvbmcgdjRsX3JlZl9idWZfYWRkcjsKKwl1bG9uZwloZWFkZXJfYWRkcjsKKwl1MzIgCWhlYWRlcl9zaXplOworCXUzMglsdW1hX3NpemU7CisJdWxvbmcJY2hyb21hX2FkZHI7CisJdTMyCWNocm9tYV9zaXplOworfSAvKkJVRl90ICovOworCitzdHJ1Y3QgTVZCVUZfcyB7CisJdW5zaWduZWQgbG9uZyBzdGFydF9hZHI7CisJdW5zaWduZWQgaW50IHNpemU7CisJaW50IHVzZWRfZmxhZzsKK30gLypNVkJVRl90ICovOworCisJLyogI3VuZGVmIEJVRk1HUl9PTkxZIHRvIGVuYWJsZSBoYXJkd2FyZSBjb25maWd1cmF0aW9uICovCisKKy8qI2RlZmluZSBURVNUX1dSX1BUUl9JTkMqLworLyojZGVmaW5lIFdSX1BUUl9JTkNfTlVNIDEyOCovCisjZGVmaW5lIFdSX1BUUl9JTkNfTlVNIDEKKworI2RlZmluZSBTSU1VTEFUSU9OCisjZGVmaW5lIERPU19QUk9KRUNUCisjdW5kZWYgTUVNT1JZX01BUF9JTl9SRUFMX0NISVAKKworLyojdW5kZWYgRE9TX1BST0pFQ1QqLworLyojZGVmaW5lIE1FTU9SWV9NQVBfSU5fUkVBTF9DSElQKi8KKworLyojZGVmaW5lIEJVRkZFUl9NR1JfT05MWSovCisvKiNkZWZpbmUgQ09ORklHX0hFVkNfQ0xLX0ZPUkNFRF9PTiovCisvKiNkZWZpbmUgRU5BQkxFX1NXQVBfVEVTVCovCisjZGVmaW5lICAgTUNSQ0NfRU5BQkxFCisKKyNkZWZpbmUgVlA5X0xQRl9MVkxfVVBEQVRFCisvKiNkZWZpbmUgREJHX0xGX1BSSU5UKi8KKworI2lmZGVmIFZQOV8xMEJfTlYyMQorI2Vsc2UKKyNkZWZpbmUgTE9TTEVTU19DT01QUkVTU19NT0RFCisjZW5kaWYKKworI2RlZmluZSBET1VCTEVfV1JJVEVfWVNUQVJUX1RFTVAgMHgwMjAwMDAwMAorI2RlZmluZSBET1VCTEVfV1JJVEVfQ1NUQVJUX1RFTVAgMHgwMjkwMDAwMAorCisjZGVmaW5lIFZQOV9ERUJVR19CVUZNR1IgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBWUDlfREVCVUdfQlVGTUdSX01PUkUgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgVlA5X0RFQlVHX0JVRk1HUl9ERVRBSUwgICAgICAgICAgICAweDA0CisjZGVmaW5lIFZQOV9ERUJVR19PVVRfUFRTICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBWUDlfREVCVUdfU0VORF9QQVJBTV9XSVRIX1JFRyAgICAgIDB4MTAwCisjZGVmaW5lIFZQOV9ERUJVR19NRVJHRSAgICAgICAgICAgICAgICAgICAgMHgyMDAKKyNkZWZpbmUgVlA5X0RFQlVHX0RCR19MRl9QUklOVCAgICAgICAgICAgICAweDQwMAorI2RlZmluZSBWUDlfREVCVUdfUkVHICAgICAgICAgICAgICAgICAgICAgIDB4ODAwCisjZGVmaW5lIFZQOV9ERUJVR18yX1NUQUdFICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFZQOV9ERUJVR18yX1NUQUdFX01PUkUgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFZQOV9ERUJVR19RT1NfSU5GTyAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFZQOV9ERUJVR19ESVNfTE9DX0VSUk9SX1BST0MgICAgICAgMHgxMDAwMAorI2RlZmluZSBWUDlfREVCVUdfRElTX1NZU19FUlJPUl9QUk9DICAgMHgyMDAwMAorI2RlZmluZSBWUDlfREVCVUdfRFVNUF9QSUNfTElTVCAgICAgICAweDQwMDAwCisjZGVmaW5lIFZQOV9ERUJVR19UUklHX1NMSUNFX1NFR01FTlRfUFJPQyAweDgwMDAwCisjZGVmaW5lIFZQOV9ERUJVR19OT19UUklHR0VSX0ZSQU1FICAgICAgIDB4MTAwMDAwCisjZGVmaW5lIFZQOV9ERUJVR19MT0FEX1VDT0RFX0ZST01fRklMRSAgIDB4MjAwMDAwCisjZGVmaW5lIFZQOV9ERUJVR19GT1JDRV9TRU5EX0FHQUlOICAgICAgIDB4NDAwMDAwCisjZGVmaW5lIFZQOV9ERUJVR19EVU1QX0RBVEEgICAgICAgICAgICAgIDB4ODAwMDAwCisjZGVmaW5lIFZQOV9ERUJVR19DQUNIRSAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMAorI2RlZmluZSBWUDlfREVCVUdfQ0FDSEVfSElUX1JBVEUgICAgICAgICAweDIwMDAwMDAKKyNkZWZpbmUgSUdOT1JFX1BBUkFNX0ZST01fQ09ORklHICAgICAgICAgMHg4MDAwMDAwCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorI2RlZmluZSBQUklOVF9GTEFHX0VSUk9SCQkweDAKKyNkZWZpbmUgUFJJTlRfRkxBR19WNExfREVUQUlMCQkweDEwMDAwMDAwCisjZGVmaW5lIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMJCTB4MjAwMDAwMDAKKyNkZWZpbmUgUFJJTlRfRkxBR19WREVDX0RFVEFJTAkJMHg0MDAwMDAwMAorI2RlZmluZSBQUklOVF9GTEFHX1ZERUNfREFUQQkJMHg4MDAwMDAwMAorI2VuZGlmCitzdGF0aWMgdTMyIGZvcmNlX2J1ZnNwZWM7CitzdGF0aWMgdTMyIGRlYnVnOworc3RhdGljIGJvb2wgaXNfcmVzZXQ7CisvKmZvciBkZWJ1ZyovCisvKgorCXVkZWJ1Z19mbGFnOgorCWJpdCAwLCBlbmFibGUgdWNvZGUgcHJpbnQKKwliaXQgMSwgZW5hYmxlIHVjb2RlIGRldGFpbCBwcmludAorCWJpdCBbMzE6MTZdIG5vdCAwLCBwb3MgdG8gZHVtcCBsbWVtCisJCWJpdCAyLCBwb3AgYml0cyB0byBsbWVtCisJCWJpdCBbMTE6OF0sIHByZS1wb3AgYml0cyBmb3IgYWxpZ25tZW50ICh3aGVuIGJpdCAyIGlzIDEpCisqLworc3RhdGljIHUzMiB1ZGVidWdfZmxhZzsKKy8qCisJd2hlbiB1ZGVidWdfZmxhZ1sxOjBdIGlzIG5vdCAwCisJdWRlYnVnX3BhdXNlX3BvcyBub3QgMCwKKwkJcGF1c2UgcG9zaXRpb24KKyovCitzdGF0aWMgdTMyIHVkZWJ1Z19wYXVzZV9wb3M7CisvKgorCXdoZW4gdWRlYnVnX2ZsYWdbMTowXSBpcyBub3QgMAorCWFuZCB1ZGVidWdfcGF1c2VfcG9zIGlzIG5vdCAwLAorCQlwYXVzZSBvbmx5IHdoZW4gREVCVUdfUkVHMiBpcyBlcXVhbCB0byB0aGlzIHZhbAorKi8KK3N0YXRpYyB1MzIgdWRlYnVnX3BhdXNlX3ZhbDsKKworc3RhdGljIHUzMiB1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeDsKKworc3RhdGljIHUzMiB3aXRob3V0X2Rpc3BsYXlfbW9kZTsKKworc3RhdGljIHUzMiB2NGxfYml0c3RyZWFtX2lkX2VuYWJsZSA9IDE7CisKKy8qCisgKlszOjBdIDA6IGRlZmF1bHQgdXNlIGNvbmZpZyBmcm9tIG9teC4KKyAqICAgICAgMTogZm9yY2UgZW5hYmxlIGZlbmNlLgorICogICAgICAyOiBkaXNhYmxlIGZlbmNlLgorICpbNzo0XSAwOiBmZW5jZSB1c2UgZm9yIGRyaXZlci4KKyAqICAgICAgMTogZmVuY2UgZmQgdXNlIGZvciBhcHAuCisgKi8KK3N0YXRpYyB1MzIgZm9yY2VfY29uZmlnX2ZlbmNlOworCisjZGVmaW5lIERFQlVHX1JFRworI2lmZGVmIERFQlVHX1JFRwordm9pZCBXUklURV9WUkVHX0RCRzIodW5zaWduZWQgaW50IGFkciwgdW5zaWduZWQgaW50IHZhbCkKK3sKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfUkVHKQorCQlwcl9pbmZvKCIlcygleCwgJXgpXG4iLCBfX2Z1bmNfXywgYWRyLCB2YWwpOworCWlmIChhZHIgIT0gMCkKKwkJV1JJVEVfVlJFRyhhZHIsIHZhbCk7Cit9CisKKyN1bmRlZiBXUklURV9WUkVHCisjZGVmaW5lIFdSSVRFX1ZSRUcgV1JJVEVfVlJFR19EQkcyCisjZW5kaWYKKworI2RlZmluZSBGUkFNRV9DTlRfV0lORE9XX1NJWkUgNTkKKyNkZWZpbmUgUkFURV9DT1JSRUNUSU9OX1RIUkVTSE9MRCA1CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworVlA5IGJ1ZmZlciBtYW5hZ2VtZW50IHN0YXJ0CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFXzEwODBQICAweDEwMDAwCisjZGVmaW5lIE1NVV9DT01QUkVTU19IRUFERVJfU0laRV80SyAgMHg0ODAwMAorI2RlZmluZSBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfOEsgIDB4MTIwMDAwCisKKworLy8jZGVmaW5lIE1NVV9DT01QUkVTU19IRUFERVJfU0laRSAgMHg0ODAwMAorLy8jZGVmaW5lIE1NVV9DT01QUkVTU19IRUFERVJfU0laRV9EVyAgMHg0ODAwMAorLy8jZGVmaW5lIE1NVV9DT01QUkVTU184S19IRUFERVJfU0laRSAgKE1NVV9DT01QUkVTU19IRUFERVJfU0laRSAqIDQpCisKKyNkZWZpbmUgTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFICAweDQ4MDAwCisjZGVmaW5lIE1NVV9DT01QUkVTU19IRUFERVJfU0laRV9EVyAgMHg0ODAwMAorI2RlZmluZSBNTVVfQ09NUFJFU1NfOEtfSEVBREVSX1NJWkUgIChNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkUgKiA0KQorCisjZGVmaW5lIE1BWF9TSVpFXzhLICg4MTkyICogNDYwOCkKKyNkZWZpbmUgTUFYX1NJWkVfNEsgKDQwOTYgKiAyMzA0KQorI2RlZmluZSBNQVhfU0laRV8ySyAoMTkyMCAqIDEwODgpCisjZGVmaW5lIElTXzhLX1NJWkUodywgaCkJKCgodykgKiAoaCkpID4gTUFYX1NJWkVfNEspCisjZGVmaW5lIElTXzRLX1NJWkUodywgaCkgICgoKHcpICogKGgpKSA+ICgxOTIwKjEwODgpKQorCisjZGVmaW5lIElOVkFMSURfSURYIC0xICAvKiBJbnZhbGlkIGJ1ZmZlciBpbmRleC4qLworCisjZGVmaW5lIFJQTV9CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMAorI2RlZmluZSBSUE1fRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyODAKKwordW5pb24gcGFyYW1fdSB7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgc2hvcnQgZGF0YVtSUE1fRU5EIC0gUlBNX0JFR0lOXTsKKwl9IGw7CisJc3RydWN0IHsKKwkJLyogZnJvbSB1Y29kZSBsbWVtLCBkbyBub3QgY2hhbmdlIHRoaXMgc3RydWN0ICovCisJCXVuc2lnbmVkIHNob3J0IHByb2ZpbGU7CisJCXVuc2lnbmVkIHNob3J0IHNob3dfZXhpc3RpbmdfZnJhbWU7CisJCXVuc2lnbmVkIHNob3J0IGZyYW1lX3RvX3Nob3dfaWR4OworCQl1bnNpZ25lZCBzaG9ydCBmcmFtZV90eXBlOyAvKjEgYml0Ki8KKwkJdW5zaWduZWQgc2hvcnQgc2hvd19mcmFtZTsgLyoxIGJpdCovCisJCXVuc2lnbmVkIHNob3J0IGVycm9yX3Jlc2lsaWVudF9tb2RlOyAvKjEgYml0Ki8KKwkJdW5zaWduZWQgc2hvcnQgaW50cmFfb25seTsgLyoxIGJpdCovCisJCXVuc2lnbmVkIHNob3J0IGRpc3BsYXlfc2l6ZV9wcmVzZW50OyAvKjEgYml0Ki8KKwkJdW5zaWduZWQgc2hvcnQgcmVzZXRfZnJhbWVfY29udGV4dDsKKwkJdW5zaWduZWQgc2hvcnQgcmVmcmVzaF9mcmFtZV9mbGFnczsKKwkJdW5zaWduZWQgc2hvcnQgd2lkdGg7CisJCXVuc2lnbmVkIHNob3J0IGhlaWdodDsKKwkJdW5zaWduZWQgc2hvcnQgZGlzcGxheV93aWR0aDsKKwkJdW5zaWduZWQgc2hvcnQgZGlzcGxheV9oZWlnaHQ7CisJLyoKKwkgKmJpdFsxMTo4XSAtIHJlZl9mcmFtZV9pbmZvXzAgKHJlZigzLWJpdHMpLCByZWZfZnJhbWVfc2lnbl9iaWFzKDEtYml0KSkKKwkgKmJpdFs3OjRdICAtIHJlZl9mcmFtZV9pbmZvXzEgKHJlZigzLWJpdHMpLCByZWZfZnJhbWVfc2lnbl9iaWFzKDEtYml0KSkKKwkgKmJpdFszOjBdICAtIHJlZl9mcmFtZV9pbmZvXzIgKHJlZigzLWJpdHMpLCByZWZfZnJhbWVfc2lnbl9iaWFzKDEtYml0KSkKKwkgKi8KKwkJdW5zaWduZWQgc2hvcnQgcmVmX2luZm87CisJCS8qCisJCSAqYml0WzJdOiBzYW1lX2ZyYW1lX3NpemUwCisJCSAqYml0WzFdOiBzYW1lX2ZyYW1lX3NpemUxCisJCSAqYml0WzBdOiBzYW1lX2ZyYW1lX3NpemUyCisJCSAqLworCQl1bnNpZ25lZCBzaG9ydCBzYW1lX2ZyYW1lX3NpemU7CisKKwkJdW5zaWduZWQgc2hvcnQgbW9kZV9yZWZfZGVsdGFfZW5hYmxlZDsKKwkJdW5zaWduZWQgc2hvcnQgcmVmX2RlbHRhc1s0XTsKKwkJdW5zaWduZWQgc2hvcnQgbW9kZV9kZWx0YXNbMl07CisJCXVuc2lnbmVkIHNob3J0IGZpbHRlcl9sZXZlbDsKKwkJdW5zaWduZWQgc2hvcnQgc2hhcnBuZXNzX2xldmVsOworCQl1bnNpZ25lZCBzaG9ydCBiaXRfZGVwdGg7CisJCXVuc2lnbmVkIHNob3J0IHNlZ19xdWFudF9pbmZvWzhdOworCQl1bnNpZ25lZCBzaG9ydCBzZWdfZW5hYmxlZDsKKwkJdW5zaWduZWQgc2hvcnQgc2VnX2Fic19kZWx0YTsKKwkJLyogYml0IDE1OiBmZWF0dXJlIGVuYWJsZWQ7IGJpdCA4LCBzaWduOyBiaXRbNTowXSwgZGF0YSAqLworCQl1bnNpZ25lZCBzaG9ydCBzZWdfbGZfaW5mb1s4XTsKKwl9IHA7Cit9OworCisKK3N0cnVjdCB2cHhfY29kZWNfZnJhbWVfYnVmZmVyX3MgeworCXVpbnQ4X3QgKmRhdGE7ICAvKio8IFBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyICovCisJc2l6ZV90IHNpemU7ICAvKio8IFNpemUgb2YgZGF0YSBpbiBieXRlcyAqLworCXZvaWQgKnByaXY7ICAvKio8IEZyYW1lJ3MgcHJpdmF0ZSBkYXRhICovCit9OworCitlbnVtIHZweF9jb2xvcl9zcGFjZV90IHsKKwlWUFhfQ1NfVU5LTk9XTiAgICA9IDAsICAvKio8IFVua25vd24gKi8KKwlWUFhfQ1NfQlRfNjAxICAgICA9IDEsICAvKio8IEJULjYwMSAqLworCVZQWF9DU19CVF83MDkgICAgID0gMiwgIC8qKjwgQlQuNzA5ICovCisJVlBYX0NTX1NNUFRFXzE3MCAgPSAzLCAgLyoqPCBTTVBURS4xNzAgKi8KKwlWUFhfQ1NfU01QVEVfMjQwICA9IDQsICAvKio8IFNNUFRFLjI0MCAqLworCVZQWF9DU19CVF8yMDIwICAgID0gNSwgIC8qKjwgQlQuMjAyMCAqLworCVZQWF9DU19SRVNFUlZFRCAgID0gNiwgIC8qKjwgUmVzZXJ2ZWQgKi8KKwlWUFhfQ1NfU1JHQiAgICAgICA9IDcgICAvKio8IHNSR0IgKi8KK307IC8qKjwgYWxpYXMgZm9yIGVudW0gdnB4X2NvbG9yX3NwYWNlICovCisKK2VudW0gdnB4X2JpdF9kZXB0aF90IHsKKwlWUFhfQklUU184ICA9ICA4LCAgLyoqPCAgOCBiaXRzICovCisJVlBYX0JJVFNfMTAgPSAxMCwgIC8qKjwgMTAgYml0cyAqLworCVZQWF9CSVRTXzEyID0gMTIsICAvKio8IDEyIGJpdHMgKi8KK307CisKKyNkZWZpbmUgTUFYX1NMSUNFX05VTSAxMDI0CitzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyB7CisJaW50IGluZGV4OworCWludCBCVUZfaW5kZXg7CisJaW50IG12X2J1Zl9pbmRleDsKKwlpbnQgY29tcF9ib2R5X3NpemU7CisJaW50IGJ1Zl9zaXplOworCWludCB2Zl9yZWY7CisJaW50IHlfY2FudmFzX2luZGV4OworCWludCB1dl9jYW52YXNfaW5kZXg7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCXN0cnVjdCBjYW52YXNfY29uZmlnX3MgY2FudmFzX2NvbmZpZ1syXTsKKyNlbmRpZgorCWludCBkZWNvZGVfaWR4OworCWludCBzbGljZV90eXBlOworCWludCBzdHJlYW1fb2Zmc2V0OworCXUzMiBwdHM7CisJdTY0IHB0czY0OworCXU2NCB0aW1lc3RhbXA7CisJdWludDhfdCBlcnJvcl9tYXJrOworCS8qKi8KKwlpbnQgc2xpY2VfaWR4OworCS8qYnVmZmVyKi8KKwl1bnNpZ25lZCBsb25nIGhlYWRlcl9hZHI7CisjaWZkZWYgVlA5XzEwQl9NTVVfRFcKKwl1bnNpZ25lZCBsb25nIGhlYWRlcl9kd19hZHI7CisjZW5kaWYKKwl1bnNpZ25lZCBsb25nIG1wcmVkX212X3dyX3N0YXJ0X2FkZHI7CisJaW50IG12X3NpemU7CisJLyp1bnNpZ25lZCBsb25nIG1jX3lfYWRyOworCSAqdW5zaWduZWQgbG9uZyBtY191X3ZfYWRyOworCSAqLworCXVuc2lnbmVkIGludCBkd195X2FkcjsKKwl1bnNpZ25lZCBpbnQgZHdfdV92X2FkcjsKKwl1MzIJbHVtYV9zaXplOworCXUzMgljaHJvbWFfc2l6ZTsKKwlpbnQgbWNfY2FudmFzX3k7CisJaW50IG1jX2NhbnZhc191X3Y7CisKKwlpbnQgbGN1X3RvdGFsOworCS8qKi8KKwlpbnQgICB5X3dpZHRoOworCWludCAgIHlfaGVpZ2h0OworCWludCAgIHlfY3JvcF93aWR0aDsKKwlpbnQgICB5X2Nyb3BfaGVpZ2h0OworCWludCAgIHlfc3RyaWRlOworCisJaW50ICAgdXZfd2lkdGg7CisJaW50ICAgdXZfaGVpZ2h0OworCWludCAgIHV2X2Nyb3Bfd2lkdGg7CisJaW50ICAgdXZfY3JvcF9oZWlnaHQ7CisJaW50ICAgdXZfc3RyaWRlOworCisJaW50ICAgYWxwaGFfd2lkdGg7CisJaW50ICAgYWxwaGFfaGVpZ2h0OworCWludCAgIGFscGhhX3N0cmlkZTsKKworCXVpbnQ4X3QgKnlfYnVmZmVyOworCXVpbnQ4X3QgKnVfYnVmZmVyOworCXVpbnQ4X3QgKnZfYnVmZmVyOworCXVpbnQ4X3QgKmFscGhhX2J1ZmZlcjsKKworCXVpbnQ4X3QgKmJ1ZmZlcl9hbGxvYzsKKwlpbnQgYnVmZmVyX2FsbG9jX3N6OworCWludCBib3JkZXI7CisJaW50IGZyYW1lX3NpemU7CisJaW50IHN1YnNhbXBsaW5nX3g7CisJaW50IHN1YnNhbXBsaW5nX3k7CisJdW5zaWduZWQgaW50IGJpdF9kZXB0aDsKKwllbnVtIHZweF9jb2xvcl9zcGFjZV90IGNvbG9yX3NwYWNlOworCisJaW50IGNvcnJ1cHRlZDsKKwlpbnQgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBjbWFfYWxsb2NfYWRkcjsKKworCWludCBkb3VibGVfd3JpdGVfbW9kZTsKKworCS8qIHBpY3R1cmUgcW9zIGluZm9tYXRpb24qLworCWludCBtYXhfcXA7CisJaW50IGF2Z19xcDsKKwlpbnQgbWluX3FwOworCWludCBtYXhfc2tpcDsKKwlpbnQgYXZnX3NraXA7CisJaW50IG1pbl9za2lwOworCWludCBtYXhfbXY7CisJaW50IG1pbl9tdjsKKwlpbnQgYXZnX212OworCisJdTMyIGh3X2RlY29kZV90aW1lOworCXUzMiBmcmFtZV9zaXplMjsgLy8gRm9yIGZyYW1lIGJhc2UgbW9kZQorCisJLyogdmRlYyBzeW5jLiAqLworCXN0cnVjdCBkbWFfZmVuY2UgKmZlbmNlOworCisJLyogaGRyMTAgcGx1cyBkYXRhICovCisJdTMyIGhkcjEwcF9kYXRhX3NpemU7CisJY2hhciAqaGRyMTBwX2RhdGFfYnVmOworfSBQSUNfQlVGRkVSX0NPTkZJRzsKKworZW51bSBCSVRTVFJFQU1fUFJPRklMRSB7CisJUFJPRklMRV8wLAorCVBST0ZJTEVfMSwKKwlQUk9GSUxFXzIsCisJUFJPRklMRV8zLAorCU1BWF9QUk9GSUxFUworfTsKKworZW51bSBGUkFNRV9UWVBFIHsKKwlLRVlfRlJBTUUgPSAwLAorCUlOVEVSX0ZSQU1FID0gMSwKKwlGUkFNRV9UWVBFUywKK307CisKK2VudW0gUkVGRVJFTkNFX01PREUgeworCVNJTkdMRV9SRUZFUkVOQ0UgICAgICA9IDAsCisJQ09NUE9VTkRfUkVGRVJFTkNFICAgID0gMSwKKwlSRUZFUkVOQ0VfTU9ERV9TRUxFQ1QgPSAyLAorCVJFRkVSRU5DRV9NT0RFUyAgICAgICA9IDMsCit9OworCisjZGVmaW5lIE5PTkUgICAgICAgICAgIC0xCisjZGVmaW5lIElOVFJBX0ZSQU1FICAgICAwCisjZGVmaW5lIExBU1RfRlJBTUUgICAgICAxCisjZGVmaW5lIEdPTERFTl9GUkFNRSAgICAyCisjZGVmaW5lIEFMVFJFRl9GUkFNRSAgICAzCisjZGVmaW5lIE1BWF9SRUZfRlJBTUVTICA0CisKKyNkZWZpbmUgUkVGU19QRVJfRlJBTUUgMworCisjZGVmaW5lIFJFRl9GUkFNRVNfTE9HMiAzCisjZGVmaW5lIFJFRl9GUkFNRVMgKDEgPDwgUkVGX0ZSQU1FU19MT0cyKQorI2RlZmluZSBSRUZfRlJBTUVTXzRLICg2KQorCisvKjQgc2NyYXRjaCBmcmFtZXMgZm9yIHRoZSBuZXcgZnJhbWVzIHRvIHN1cHBvcnQgYSBtYXhpbXVtIG9mIDQgY29yZXMgZGVjb2RpbmcKKyAqaW4gcGFyYWxsZWwsIDMgZm9yIHNjYWxlZCByZWZlcmVuY2VzIG9uIHRoZSBlbmNvZGVyLgorICpUT0RPKGhrdWFuZyk6IEFkZCBvbmRlbWFuZCBmcmFtZSBidWZmZXJzIGluc3RlYWQgb2YgaGFyZGNvZGluZyB0aGUgbnVtYmVyCisgKiAvLyBvZiBmcmFtZWJ1ZmZlcnMuCisgKlRPRE8oamtvbGVzemFyKTogVGhlc2UgMyBleHRyYSByZWZlcmVuY2VzIGNvdWxkIHByb2JhYmx5IGNvbWUgZnJvbSB0aGUKKyAqbm9ybWFsIHJlZmVyZW5jZSBwb29sLgorICovCisjZGVmaW5lIEZSQU1FX0JVRkZFUlMgKFJFRl9GUkFNRVMgKyAxNikKKyNkZWZpbmUgSEVBREVSX0ZSQU1FX0JVRkZFUlMgKEZSQU1FX0JVRkZFUlMpCisjZGVmaW5lIE1BWF9CVUZfTlVNIChGUkFNRV9CVUZGRVJTKQorI2RlZmluZSBNVl9CVUZGRVJfTlVNCUZSQU1FX0JVRkZFUlMKKyNpZmRlZiBTVVBQT1JUX0ZCX0RFQ09ESU5HCisjZGVmaW5lIFNUQUdFX01BWF9CVUZGRVJTCQkxNgorI2Vsc2UKKyNkZWZpbmUgU1RBR0VfTUFYX0JVRkZFUlMJCTAKKyNlbmRpZgorCisjZGVmaW5lIEZSQU1FX0NPTlRFWFRTX0xPRzIgMgorI2RlZmluZSBGUkFNRV9DT05URVhUUyAoMSA8PCBGUkFNRV9DT05URVhUU19MT0cyKQorLypidWZmZXIgKyBoZWFkZXIgYnVmZmVyICsgd29ya3NwYWNlKi8KKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisjZGVmaW5lIE1BWF9CTU1VX0JVRkZFUl9OVU0gKEZSQU1FX0JVRkZFUlMgKyBIRUFERVJfRlJBTUVfQlVGRkVSUyArIDEpCisjZGVmaW5lIFZGX0JVRkZFUl9JRFgobikgKG4pCisjZGVmaW5lIEhFQURFUl9CVUZGRVJfSURYKG4pIChGUkFNRV9CVUZGRVJTICsgbikKKyNkZWZpbmUgV09SS19TUEFDRV9CVUZfSUQgKEZSQU1FX0JVRkZFUlMgKyBIRUFERVJfRlJBTUVfQlVGRkVSUykKKyNlbHNlCisjZGVmaW5lIE1BWF9CTU1VX0JVRkZFUl9OVU0gXAorCShGUkFNRV9CVUZGRVJTICsgSEVBREVSX0ZSQU1FX0JVRkZFUlMgKyBNVl9CVUZGRVJfTlVNICsgMSkKKyNkZWZpbmUgVkZfQlVGRkVSX0lEWChuKSAobikKKyNkZWZpbmUgSEVBREVSX0JVRkZFUl9JRFgobikgKEZSQU1FX0JVRkZFUlMgKyBuKQorI2RlZmluZSBNVl9CVUZGRVJfSURYKG4pIChGUkFNRV9CVUZGRVJTICsgSEVBREVSX0ZSQU1FX0JVRkZFUlMgKyBuKQorI2RlZmluZSBXT1JLX1NQQUNFX0JVRl9JRCBcCisJKEZSQU1FX0JVRkZFUlMgKyBIRUFERVJfRlJBTUVfQlVGRkVSUyArIE1WX0JVRkZFUl9OVU0pCisjZW5kaWYKKworc3RydWN0IFJlZkNudEJ1ZmZlcl9zIHsKKwlpbnQgcmVmX2NvdW50OworCS8qTVZfUkVGICptdnM7Ki8KKwlpbnQgbWlfcm93czsKKwlpbnQgbWlfY29sczsKKwlzdHJ1Y3QgdnB4X2NvZGVjX2ZyYW1lX2J1ZmZlcl9zIHJhd19mcmFtZV9idWZmZXI7CisJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgYnVmOworCisvKlRoZSBGb2xsb3dpbmcgdmFyaWFibGVzIHdpbGwgb25seSBiZSB1c2VkIGluIGZyYW1lIHBhcmFsbGVsIGRlY29kZS4KKyAqCisgKmZyYW1lX3dvcmtlcl9vd25lciBpbmRpY2F0ZXMgd2hpY2ggRnJhbWVXb3JrZXIgb3ducyB0aGlzIGJ1ZmZlci4gTlVMTCBtZWFucworICp0aGF0IG5vIEZyYW1lV29ya2VyIG93bnMsIG9yIGlzIGRlY29kaW5nLCB0aGlzIGJ1ZmZlci4KKyAqVlA5V29ya2VyICpmcmFtZV93b3JrZXJfb3duZXI7CisgKgorICpyb3cgYW5kIGNvbCBpbmRpY2F0ZSB3aGljaCBwb3NpdGlvbiBmcmFtZSBoYXMgYmVlbiBkZWNvZGVkIHRvIGluIHJlYWwKKyAqcGl4ZWwgdW5pdC4gVGhleSBhcmUgcmVzZXQgdG8gLTEgd2hlbiBkZWNvZGluZyBiZWdpbnMgYW5kIHNldCB0byBJTlRfTUFYCisgKndoZW4gdGhlIGZyYW1lIGlzIGZ1bGx5IGRlY29kZWQuCisgKi8KKwlpbnQgcm93OworCWludCBjb2w7CisKKwlpbnQgc2hvd19mcmFtZTsKK30gUmVmQ250QnVmZmVyOworCitzdHJ1Y3QgUmVmQnVmZmVyX3MgeworLypUT0RPKGRrb3ZhbGV2KTogaWR4IGlzIG5vdCByZWFsbHkgcmVxdWlyZWQgYW5kIHNob3VsZCBiZSByZW1vdmVkLCBub3cgaXQKKyAqaXMgdXNlZCBpbiB2cDlfb255eGRfaWYuYworICovCisJaW50IGlkeDsKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqYnVmOworCS8qc3RydWN0IHNjYWxlX2ZhY3RvcnMgc2Y7Ki8KK30gUmVmQnVmZmVyOworCitzdHJ1Y3QgSW50ZXJuYWxGcmFtZUJ1ZmZlcl9zIHsKKwl1aW50OF90ICpkYXRhOworCXNpemVfdCBzaXplOworCWludCBpbl91c2U7Cit9IEludGVybmFsRnJhbWVCdWZmZXI7CisKK3N0cnVjdCBJbnRlcm5hbEZyYW1lQnVmZmVyTGlzdF9zIHsKKwlpbnQgbnVtX2ludGVybmFsX2ZyYW1lX2J1ZmZlcnM7CisJc3RydWN0IEludGVybmFsRnJhbWVCdWZmZXJfcyAqaW50X2ZiOworfSBJbnRlcm5hbEZyYW1lQnVmZmVyTGlzdDsKKworc3RydWN0IEJ1ZmZlclBvb2xfcyB7CisvKlByb3RlY3QgQnVmZmVyUG9vbCBmcm9tIGJlaW5nIGFjY2Vzc2VkIGJ5IHNldmVyYWwgRnJhbWVXb3JrZXJzIGF0CisgKnRoZSBzYW1lIHRpbWUgZHVyaW5nIGZyYW1lIHBhcmFsbGVsIGRlY29kZS4KKyAqVE9ETyhoa3VhbmcpOiBUcnkgdG8gdXNlIGF0b21pYyB2YXJpYWJsZSBpbnN0ZWFkIG9mIGxvY2tpbmcgdGhlIHdob2xlIHBvb2wuCisgKgorICpQcml2YXRlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBmcmFtZSBidWZmZXIgY2FsbGJhY2tzLgorICp2b2lkICpjYl9wcml2OworICoKKyAqdnB4X2dldF9mcmFtZV9idWZmZXJfY2JfZm5fdCBnZXRfZmJfY2I7CisgKnZweF9yZWxlYXNlX2ZyYW1lX2J1ZmZlcl9jYl9mbl90IHJlbGVhc2VfZmJfY2I7CisgKi8KKworCXN0cnVjdCBSZWZDbnRCdWZmZXJfcyBmcmFtZV9idWZzW0ZSQU1FX0JVRkZFUlNdOworCisvKkZyYW1lIGJ1ZmZlcnMgYWxsb2NhdGVkIGludGVybmFsbHkgYnkgdGhlIGNvZGVjLiovCisJc3RydWN0IEludGVybmFsRnJhbWVCdWZmZXJMaXN0X3MgaW50X2ZyYW1lX2J1ZmZlcnM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGlubG9ja190IGxvY2s7CisKK30gQnVmZmVyUG9vbDsKKworI2RlZmluZSBsb2NrX2J1ZmZlcl9wb29sKHBvb2wsIGZsYWdzKSBcCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwb29sLT5sb2NrLCBmbGFncykKKworI2RlZmluZSB1bmxvY2tfYnVmZmVyX3Bvb2wocG9vbCwgZmxhZ3MpIFwKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgZmxhZ3MpCisKK3N0cnVjdCBWUDlfQ29tbW9uX3MgeworCWVudW0gdnB4X2NvbG9yX3NwYWNlX3QgY29sb3Jfc3BhY2U7CisJaW50IHdpZHRoOworCWludCBoZWlnaHQ7CisJaW50IGRpc3BsYXlfd2lkdGg7CisJaW50IGRpc3BsYXlfaGVpZ2h0OworCWludCBsYXN0X3dpZHRoOworCWludCBsYXN0X2hlaWdodDsKKworCWludCBzdWJzYW1wbGluZ194OworCWludCBzdWJzYW1wbGluZ195OworCisJaW50IHVzZV9oaWdoYml0ZGVwdGg7LypNYXJrcyBpZiB3ZSBuZWVkIHRvIHVzZSAxNmJpdCBmcmFtZSBidWZmZXJzLiovCisKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqZnJhbWVfdG9fc2hvdzsKKwlzdHJ1Y3QgUmVmQ250QnVmZmVyX3MgKnByZXZfZnJhbWU7CisKKwkvKlRPRE8oaGt1YW5nKTogQ29tYmluZSB0aGlzIHdpdGggY3VyX2J1ZiBpbiBtYWNyb2Jsb2NrZC4qLworCXN0cnVjdCBSZWZDbnRCdWZmZXJfcyAqY3VyX2ZyYW1lOworCisJaW50IHJlZl9mcmFtZV9tYXBbUkVGX0ZSQU1FU107IC8qIG1hcHMgZmJfaWR4IHRvIHJlZmVyZW5jZSBzbG90ICovCisKKwkvKlByZXBhcmUgcmVmX2ZyYW1lX21hcCBmb3IgdGhlIG5leHQgZnJhbWUuCisJICpPbmx5IHVzZWQgaW4gZnJhbWUgcGFyYWxsZWwgZGVjb2RlLgorCSAqLworCWludCBuZXh0X3JlZl9mcmFtZV9tYXBbUkVGX0ZSQU1FU107CisKKwkvKiBUT0RPKGprb2xlc3phcik6IGNvdWxkIGV4cGFuZCBhY3RpdmVfcmVmX2lkeCB0byA0LAorCSAqd2l0aCAwIGFzIGludHJhLCBhbmQgcm9sbCBuZXdfZmJfaWR4IGludG8gaXQuCisJICovCisKKwkvKkVhY2ggZnJhbWUgY2FuIHJlZmVyZW5jZSBSRUZTX1BFUl9GUkFNRSBidWZmZXJzKi8KKwlzdHJ1Y3QgUmVmQnVmZmVyX3MgZnJhbWVfcmVmc1tSRUZTX1BFUl9GUkFNRV07CisKKwlpbnQgcHJldl9mYl9pZHg7CisJaW50IG5ld19mYl9pZHg7CisJaW50IGN1cl9mYl9pZHhfbW11OworCS8qbGFzdCBmcmFtZSdzIGZyYW1lIHR5cGUgZm9yIG1vdGlvbiBzZWFyY2gqLworCWVudW0gRlJBTUVfVFlQRSBsYXN0X2ZyYW1lX3R5cGU7CisJZW51bSBGUkFNRV9UWVBFIGZyYW1lX3R5cGU7CisKKwlpbnQgc2hvd19mcmFtZTsKKwlpbnQgbGFzdF9zaG93X2ZyYW1lOworCWludCBzaG93X2V4aXN0aW5nX2ZyYW1lOworCisJLypGbGFnIHNpZ25hbGluZyB0aGF0IHRoZSBmcmFtZSBpcyBlbmNvZGVkIHVzaW5nIG9ubHkgSU5UUkEgbW9kZXMuKi8KKwl1aW50OF90IGludHJhX29ubHk7CisJdWludDhfdCBsYXN0X2ludHJhX29ubHk7CisKKwlpbnQgYWxsb3dfaGlnaF9wcmVjaXNpb25fbXY7CisKKwkvKkZsYWcgc2lnbmFsaW5nIHRoYXQgdGhlIGZyYW1lIGNvbnRleHQgc2hvdWxkIGJlIHJlc2V0IHRvIGRlZmF1bHQKKwkgKnZhbHVlcy4gMCBvciAxIGltcGxpZXMgZG9uJ3QgcmVzZXQsIDIgcmVzZXQganVzdCB0aGUgY29udGV4dAorCSAqc3BlY2lmaWVkIGluIHRoZSAgZnJhbWUgaGVhZGVyLCAzIHJlc2V0IGFsbCBjb250ZXh0cy4KKwkgKi8KKwlpbnQgcmVzZXRfZnJhbWVfY29udGV4dDsKKworCS8qTUJzLCBtYl9yb3dzL2NvbHMgaXMgaW4gMTYtcGl4ZWwgdW5pdHM7IG1pX3Jvd3MvY29scyBpcyBpbgorCSAqCU1PREVfSU5GTyAoOC1waXhlbCkgdW5pdHMuCisJICovCisJaW50IE1CczsKKwlpbnQgbWJfcm93cywgbWlfcm93czsKKwlpbnQgbWJfY29scywgbWlfY29sczsKKwlpbnQgbWlfc3RyaWRlOworCisJLypXaGV0aGVyIHRvIHVzZSBwcmV2aW91cyBmcmFtZSdzIG1vdGlvbiB2ZWN0b3JzIGZvciBwcmVkaWN0aW9uLiovCisJaW50IHVzZV9wcmV2X2ZyYW1lX212czsKKworCWludCByZWZyZXNoX2ZyYW1lX2NvbnRleHQ7ICAgIC8qIFR3byBzdGF0ZSAwID0gTk8sIDEgPSBZRVMgKi8KKworCWludCByZWZfZnJhbWVfc2lnbl9iaWFzW01BWF9SRUZfRlJBTUVTXTsgICAgLyogVHdvIHN0YXRlIDAsIDEgKi8KKworCS8qc3RydWN0IGxvb3BmaWx0ZXIgbGY7Ki8KKwkvKnN0cnVjdCBzZWdtZW50YXRpb24gc2VnOyovCisKKwkvKlRPRE8oaGt1YW5nKTpSZW1vdmUgdGhpcyBhcyBpdCBpcyB0aGUgc2FtZSBhcyBmcmFtZV9wYXJhbGxlbF9kZWNvZGUqLworCS8qIGluIHBiaS4qLworCWludCBmcmFtZV9wYXJhbGxlbF9kZWNvZGU7ICAvKiBmcmFtZS1iYXNlZCB0aHJlYWRpbmcuKi8KKworCS8qQ29udGV4dCBwcm9iYWJpbGl0aWVzIGZvciByZWZlcmVuY2UgZnJhbWUgcHJlZGljdGlvbiovCisJLypNVl9SRUZFUkVOQ0VfRlJBTUUgY29tcF9maXhlZF9yZWY7Ki8KKwkvKk1WX1JFRkVSRU5DRV9GUkFNRSBjb21wX3Zhcl9yZWZbMl07Ki8KKwllbnVtIFJFRkVSRU5DRV9NT0RFIHJlZmVyZW5jZV9tb2RlOworCisJLypGUkFNRV9DT05URVhUICpmYzsgKi8gLyogdGhpcyBmcmFtZSBlbnRyb3B5ICovCisJLypGUkFNRV9DT05URVhUICpmcmFtZV9jb250ZXh0czsgKi8gIC8qRlJBTUVfQ09OVEVYVFMqLworCS8qdW5zaWduZWQgaW50ICBmcmFtZV9jb250ZXh0X2lkeDsgKi8vKiBDb250ZXh0IHRvIHVzZS91cGRhdGUgKi8KKwkvKkZSQU1FX0NPVU5UUyBjb3VudHM7Ki8KKworCXVuc2lnbmVkIGludCBjdXJyZW50X3ZpZGVvX2ZyYW1lOworCWVudW0gQklUU1RSRUFNX1BST0ZJTEUgcHJvZmlsZTsKKworCWVudW0gdnB4X2JpdF9kZXB0aF90IGJpdF9kZXB0aDsKKworCWludCBlcnJvcl9yZXNpbGllbnRfbW9kZTsKKwlpbnQgZnJhbWVfcGFyYWxsZWxfZGVjb2RpbmdfbW9kZTsKKworCWludCBieXRlX2FsaWdubWVudDsKKwlpbnQgc2tpcF9sb29wX2ZpbHRlcjsKKworCS8qRXh0ZXJuYWwgQnVmZmVyUG9vbCBwYXNzZWQgZnJvbSBvdXRzaWRlLiovCisJc3RydWN0IEJ1ZmZlclBvb2xfcyAqYnVmZmVyX3Bvb2w7CisKKwlpbnQgYWJvdmVfY29udGV4dF9hbGxvY19jb2xzOworfTsKKworc3RhdGljIHZvaWQgc2V0X2NhbnZhcyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksCisJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnBpY19jb25maWcpOworc3RhdGljIGludCBwcmVwYXJlX2Rpc3BsYXlfYnVmKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwKKwkJCQkJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnBpY19jb25maWcpOworCitzdGF0aWMgdm9pZCBmaWxsX2ZyYW1lX2luZm8oc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLAorCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpmcmFtZSwKKwl1bnNpZ25lZCBpbnQgZnJhbWVzaXplLAorCXVuc2lnbmVkIGludCBwdHMpOworCitzdGF0aWMgc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKmdldF9mcmFtZV9uZXdfYnVmZmVyKHN0cnVjdCBWUDlfQ29tbW9uX3MgKmNtKQoreworCXJldHVybiAmY20tPmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzW2NtLT5uZXdfZmJfaWR4XS5idWY7Cit9CisKK3N0YXRpYyB2b2lkIHJlZl9jbnRfZmIoc3RydWN0IFJlZkNudEJ1ZmZlcl9zICpidWZzLCBpbnQgKmlkeCwgaW50IG5ld19pZHgpCit7CisJY29uc3QgaW50IHJlZl9pbmRleCA9ICppZHg7CisKKwlpZiAocmVmX2luZGV4ID49IDAgJiYgYnVmc1tyZWZfaW5kZXhdLnJlZl9jb3VudCA+IDApIHsKKwkJYnVmc1tyZWZfaW5kZXhdLnJlZl9jb3VudC0tOworCQkvKnByX2luZm8oIltNTVUgREVCVUcgMl0gZGVjIHJlZl9jb3VudFslZF0gOiAlZFxyXG4iLAorCQkgKgkJcmVmX2luZGV4LCBidWZzW3JlZl9pbmRleF0ucmVmX2NvdW50KTsKKwkJICovCisJfQorCisJKmlkeCA9IG5ld19pZHg7CisKKwlidWZzW25ld19pZHhdLnJlZl9jb3VudCsrOworCS8qcHJfaW5mbygiW01NVSBERUJVRyAzXSBpbmMgcmVmX2NvdW50WyVkXSA6ICVkXHJcbiIsCisJICoJCQluZXdfaWR4LCBidWZzW25ld19pZHhdLnJlZl9jb3VudCk7CisJICovCit9CisKK2ludCB2cDlfcmVsZWFzZV9mcmFtZV9idWZmZXIoc3RydWN0IHZweF9jb2RlY19mcmFtZV9idWZmZXJfcyAqZmIpCit7CisJc3RydWN0IEludGVybmFsRnJhbWVCdWZmZXJfcyAqY29uc3QgaW50X2ZiID0KKwkJCQkoc3RydWN0IEludGVybmFsRnJhbWVCdWZmZXJfcyAqKWZiLT5wcml2OworCWlmIChpbnRfZmIpCisJCWludF9mYi0+aW5fdXNlID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCAgY29tcHV0ZV9sb3NsZXNzX2NvbXBfYm9keV9zaXplKGludCB3aWR0aCwgaW50IGhlaWdodCwKKwkJCQl1aW50OF90IGlzX2JpdF9kZXB0aF8xMCk7CisKK3N0YXRpYyB2b2lkIHNldHVwX2Rpc3BsYXlfc2l6ZShzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjbSwgdW5pb24gcGFyYW1fdSAqcGFyYW1zLAorCQkJCQkJaW50IHByaW50X2hlYWRlcl9pbmZvKQoreworCWNtLT5kaXNwbGF5X3dpZHRoID0gY20tPndpZHRoOworCWNtLT5kaXNwbGF5X2hlaWdodCA9IGNtLT5oZWlnaHQ7CisJaWYgKHBhcmFtcy0+cC5kaXNwbGF5X3NpemVfcHJlc2VudCkgeworCQlpZiAocHJpbnRfaGVhZGVyX2luZm8pCisJCQlwcl9pbmZvKCIgKiAxLWJpdCBkaXNwbGF5X3NpemVfcHJlc2VudCByZWFkIDogMVxuIik7CisJCWNtLT5kaXNwbGF5X3dpZHRoID0gcGFyYW1zLT5wLmRpc3BsYXlfd2lkdGg7CisJCWNtLT5kaXNwbGF5X2hlaWdodCA9IHBhcmFtcy0+cC5kaXNwbGF5X2hlaWdodDsKKwkJLyp2cDlfcmVhZF9mcmFtZV9zaXplKHJiLCAmY20tPmRpc3BsYXlfd2lkdGgsCisJCSAqCQkJCQkmY20tPmRpc3BsYXlfaGVpZ2h0KTsKKwkJICovCisJfSBlbHNlIHsKKwkJaWYgKHByaW50X2hlYWRlcl9pbmZvKQorCQkJcHJfaW5mbygiICogMS1iaXQgZGlzcGxheV9zaXplX3ByZXNlbnQgcmVhZCA6IDBcbiIpOworCX0KK30KKworCit1aW50OF90IHByaW50X2hlYWRlcl9pbmZvID0gMDsKKworc3RydWN0IGJ1ZmZfcyB7CisJdTMyIGJ1Zl9zdGFydDsKKwl1MzIgYnVmX3NpemU7CisJdTMyIGJ1Zl9lbmQ7Cit9IGJ1ZmZfdDsKKworc3RydWN0IEJ1ZmZJbmZvX3MgeworCXUzMiBtYXhfd2lkdGg7CisJdTMyIG1heF9oZWlnaHQ7CisJdTMyIHN0YXJ0X2FkcjsKKwl1MzIgZW5kX2FkcjsKKwlzdHJ1Y3QgYnVmZl9zIGlwcDsKKwlzdHJ1Y3QgYnVmZl9zIHNhb19hYnY7CisJc3RydWN0IGJ1ZmZfcyBzYW9fdmI7CisJc3RydWN0IGJ1ZmZfcyBzaG9ydF90ZXJtX3JwczsKKwlzdHJ1Y3QgYnVmZl9zIHZwczsKKwlzdHJ1Y3QgYnVmZl9zIHNwczsKKwlzdHJ1Y3QgYnVmZl9zIHBwczsKKwlzdHJ1Y3QgYnVmZl9zIHNhb191cDsKKwlzdHJ1Y3QgYnVmZl9zIHN3YXBfYnVmOworCXN0cnVjdCBidWZmX3Mgc3dhcF9idWYyOworCXN0cnVjdCBidWZmX3Mgc2NhbGVsdXQ7CisJc3RydWN0IGJ1ZmZfcyBkYmxrX3BhcmE7CisJc3RydWN0IGJ1ZmZfcyBkYmxrX2RhdGE7CisJc3RydWN0IGJ1ZmZfcyBzZWdfbWFwOworCXN0cnVjdCBidWZmX3MgbW11X3ZiaDsKKwlzdHJ1Y3QgYnVmZl9zIGNtX2hlYWRlcjsKKyNpZmRlZiBWUDlfMTBCX01NVV9EVworCXN0cnVjdCBidWZmX3MgbW11X3ZiaF9kdzsKKwlzdHJ1Y3QgYnVmZl9zIGNtX2hlYWRlcl9kdzsKKyNlbmRpZgorCXN0cnVjdCBidWZmX3MgbXByZWRfYWJvdmU7CisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCXN0cnVjdCBidWZmX3MgbXByZWRfbXY7CisjZW5kaWYKKwlzdHJ1Y3QgYnVmZl9zIHJwbTsKKwlzdHJ1Y3QgYnVmZl9zIGxtZW07Cit9IEJ1ZmZJbmZvX3Q7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorI2RlZmluZSBERUNfUkVTVUxUX05PTkUgICAgICAgICAgICAgMAorI2RlZmluZSBERUNfUkVTVUxUX0RPTkUgICAgICAgICAgICAgMQorI2RlZmluZSBERUNfUkVTVUxUX0FHQUlOICAgICAgICAgICAgMgorI2RlZmluZSBERUNfUkVTVUxUX0NPTkZJR19QQVJBTSAgICAgMworI2RlZmluZSBERUNfUkVTVUxUX0VSUk9SICAgICAgICAgICAgNAorI2RlZmluZSBERUNfSU5JVF9QSUNMSVNUCQkJNQorI2RlZmluZSBERUNfVU5JTklUX1BJQ0xJU1QJCQk2CisjZGVmaW5lIERFQ19SRVNVTFRfR0VUX0RBVEEgICAgICAgICA3CisjZGVmaW5lIERFQ19SRVNVTFRfR0VUX0RBVEFfUkVUUlkgICA4CisjZGVmaW5lIERFQ19SRVNVTFRfRU9TICAgICAgICAgICAgICA5CisjZGVmaW5lIERFQ19SRVNVTFRfRk9SQ0VfRVhJVCAgICAgICAxMAorI2RlZmluZSBERUNfUkVTVUxUX05FRURfTU9SRV9CVUZGRVIJMTEKKyNkZWZpbmUgREVDX1Y0TDJfQ09OVElOVUVfREVDT0RJTkcgIDE4CisKKyNkZWZpbmUgREVDX1MxX1JFU1VMVF9OT05FICAgICAgICAgIDAKKyNkZWZpbmUgREVDX1MxX1JFU1VMVF9ET05FICAgICAgICAgIDEKKyNkZWZpbmUgREVDX1MxX1JFU1VMVF9GT1JDRV9FWElUICAgICAgIDIKKyNkZWZpbmUgREVDX1MxX1JFU1VMVF9URVNUX1RSSUdHRVJfRE9ORQkweGYwCisKKyNpZmRlZiBGQl9ERUNPRElOR19URVNUX1NDSEVEVUxFCisjZGVmaW5lIFRFU1RfU0VUX05PTkUgICAgICAgIDAKKyNkZWZpbmUgVEVTVF9TRVRfUElDX0RPTkUgICAgMQorI2RlZmluZSBURVNUX1NFVF9TMl9ET05FICAgICAyCisjZW5kaWYKKworc3RhdGljIHZvaWQgdnA5X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKyNlbmRpZgorc3RydWN0IGxvb3BfZmlsdGVyX2luZm9fbjsKK3N0cnVjdCBsb29wZmlsdGVyOworc3RydWN0IHNlZ21lbnRhdGlvbjsKKworI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKK3N0YXRpYyB2b2lkIG1wcmVkX3Byb2Nlc3Moc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKTsKK3N0YXRpYyB2b2lkIHZwOV9zMV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKK3N0cnVjdCBzdGFnZV9idWZfcyB7CisJaW50IGluZGV4OworCXVuc2lnbmVkIHNob3J0IHJwbVtSUE1fRU5EIC0gUlBNX0JFR0lOXTsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm90X3J1bjJfcmVhZHlbTUFYX0RFQ09ERV9JTlNUQU5DRV9OVU1dOworCitzdGF0aWMgdW5zaWduZWQgaW50IHJ1bjJfY291bnRbTUFYX0RFQ09ERV9JTlNUQU5DRV9OVU1dOworCisjaWZkZWYgRkJfREVDT0RJTkdfVEVTVF9TQ0hFRFVMRQordTMyIHN0YWdlX2J1Zl9udW07IC8qID0gMTY7Ki8KKyNlbHNlCit1MzIgc3RhZ2VfYnVmX251bTsKKyNlbmRpZgorI2VuZGlmCisKK3N0cnVjdCB2cDlfZmVuY2VfdmZfdCB7CisJdTMyIHVzZWRfc2l6ZTsKKwlzdHJ1Y3QgdmZyYW1lX3MgKmZlbmNlX3ZmW1ZGX1BPT0xfU0laRV07Cit9OworCitzdHJ1Y3QgVlA5RGVjb2Rlcl9zIHsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJdW5zaWduZWQgY2hhciBpbmRleDsKKworCXN0cnVjdCBkZXZpY2UgKmNtYV9kZXY7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2OworCXZvaWQgKCp2ZGVjX2NiKShzdHJ1Y3QgdmRlY19zICosIHZvaWQgKik7CisJdm9pZCAqdmRlY19jYl9hcmc7CisJc3RydWN0IHZmcmFtZV9jaHVua19zICpjaHVuazsKKwlpbnQgZGVjX3Jlc3VsdDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVjeWNsZV9tbXVfd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc2V0X2Nsa193b3JrOworCXUzMiBzdGFydF9zaGlmdF9ieXRlczsKKworCXN0cnVjdCBCdWZmSW5mb19zIHdvcmtfc3BhY2VfYnVmX3N0b3JlOworCXVuc2lnbmVkIGxvbmcgYnVmX3N0YXJ0OworCXUzMiBidWZfc2l6ZTsKKwl1MzIgY21hX2FsbG9jX2NvdW50OworCXVuc2lnbmVkIGxvbmcgY21hX2FsbG9jX2FkZHI7CisJdWludDhfdCBlb3M7CisJdW5zaWduZWQgbG9uZyBpbnQgc3RhcnRfcHJvY2Vzc190aW1lOworCXVuc2lnbmVkIGxhc3RfbGN1X2lkeDsKKwlpbnQgZGVjb2RlX3RpbWVvdXRfY291bnQ7CisJdW5zaWduZWQgdGltZW91dF9udW07CisJaW50IHNhdmVfYnVmZmVyX21vZGU7CisKKwlpbnQgZG91YmxlX3dyaXRlX21vZGU7CisjZW5kaWYKKwlsb25nIHVzZWRfNGtfbnVtOworCisJdW5zaWduZWQgY2hhciBtX2luc19mbGFnOworCWNoYXIgKnByb3ZpZGVyX25hbWU7CisJdW5pb24gcGFyYW1fdSBwYXJhbTsKKwlpbnQgZnJhbWVfY291bnQ7CisJaW50IHBpY19jb3VudDsKKwl1MzIgc3RhdDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwl1MzIgZnJhbWVfZHVyOworCXUzMiBmcmFtZV9hcjsKKwlpbnQgZmF0YWxfZXJyb3I7CisJdWludDhfdCBpbml0X2ZsYWc7CisJdWludDhfdCBmaXJzdF9zY19jaGVja2VkOworCXVpbnQ4X3QgcHJvY2Vzc19idXN5OworI2RlZmluZSBQUk9DX1NUQVRFX0lOSVQJCQkwCisjZGVmaW5lIFBST0NfU1RBVEVfREVDT0RFU0xJQ0UJMQorI2RlZmluZSBQUk9DX1NUQVRFX1NFTkRBR0FJTgkyCisJdWludDhfdCBwcm9jZXNzX3N0YXRlOworCXUzMiB1Y29kZV9wYXVzZV9wb3M7CisKKwlpbnQgc2hvd19mcmFtZV9udW07CisJc3RydWN0IGJ1ZmZfcyBtY19idWZfc3BlYzsKKwlzdHJ1Y3QgZGVjX3N5c2luZm8gdnZwOV9hbXN0cmVhbV9kZWNfaW5mbzsKKwl2b2lkICpycG1fYWRkcjsKKwl2b2lkICpsbWVtX2FkZHI7CisJZG1hX2FkZHJfdCBycG1fcGh5X2FkZHI7CisJZG1hX2FkZHJfdCBsbWVtX3BoeV9hZGRyOworCXVuc2lnbmVkIHNob3J0ICpsbWVtX3B0cjsKKwl1bnNpZ25lZCBzaG9ydCAqZGVidWdfcHRyOworCisJdm9pZCAqcHJvYl9idWZmZXJfYWRkcjsKKwl2b2lkICpjb3VudF9idWZmZXJfYWRkcjsKKwlkbWFfYWRkcl90IHByb2JfYnVmZmVyX3BoeV9hZGRyOworCWRtYV9hZGRyX3QgY291bnRfYnVmZmVyX3BoeV9hZGRyOworCisJdm9pZCAqZnJhbWVfbW11X21hcF9hZGRyOworCWRtYV9hZGRyX3QgZnJhbWVfbW11X21hcF9waHlfYWRkcjsKKyNpZmRlZiBWUDlfMTBCX01NVV9EVworCXZvaWQgKmZyYW1lX21tdV9kd19tYXBfYWRkcjsKKwlkbWFfYWRkcl90IGZyYW1lX21tdV9kd19tYXBfcGh5X2FkZHI7CisjZW5kaWYKKwl1bnNpZ25lZCBpbnQgdXNlX2NtYV9mbGFnOworCisJc3RydWN0IEJVRl9zIG1fQlVGW01BWF9CVUZfTlVNXTsKKwlzdHJ1Y3QgTVZCVUZfcyBtX212X0JVRltNVl9CVUZGRVJfTlVNXTsKKwl1MzIgdXNlZF9idWZfbnVtOworCURFQ0xBUkVfS0ZJRk8obmV3ZnJhbWVfcSwgc3RydWN0IHZmcmFtZV9zICosIFZGX1BPT0xfU0laRSk7CisJREVDTEFSRV9LRklGTyhkaXNwbGF5X3EsIHN0cnVjdCB2ZnJhbWVfcyAqLCBWRl9QT09MX1NJWkUpOworCURFQ0xBUkVfS0ZJRk8ocGVuZGluZ19xLCBzdHJ1Y3QgdmZyYW1lX3MgKiwgVkZfUE9PTF9TSVpFKTsKKwlzdHJ1Y3QgdmZyYW1lX3MgdmZwb29sW1ZGX1BPT0xfU0laRV07CisJdTMyIHZmX3ByZV9jb3VudDsKKwl1MzIgdmZfZ2V0X2NvdW50OworCXUzMiB2Zl9wdXRfY291bnQ7CisJaW50IGJ1Zl9udW07CisJaW50IHBpY19udW07CisJaW50IGxjdV9zaXplX2xvZzI7CisJdW5zaWduZWQgaW50IGxvc2xlc3NfY29tcF9ib2R5X3NpemU7CisJdTMyIHZpZGVvX3NpZ25hbF90eXBlOworCisJaW50IHB0c19tb2RlOworCWludCBsYXN0X2xvb2t1cF9wdHM7CisJaW50IGxhc3RfcHRzOworCXU2NCBsYXN0X2xvb2t1cF9wdHNfdXM2NDsKKwl1NjQgbGFzdF9wdHNfdXM2NDsKKwl1NjQgc2hpZnRfYnl0ZV9jb3VudDsKKworCXUzMiBwdHNfdW5zdGFibGU7CisJdTMyIGZyYW1lX2NudF93aW5kb3c7CisJdTMyIHB0czEsIHB0czI7CisJdTMyIGxhc3RfZHVyYXRpb247CisJdTMyIGR1cmF0aW9uX2Zyb21fcHRzX2RvbmU7CisJYm9vbCB2cDlfZmlyc3RfcHRzX3JlYWR5OworCisJdTMyIHNoaWZ0X2J5dGVfY291bnRfbG87CisJdTMyIHNoaWZ0X2J5dGVfY291bnRfaGk7CisJaW50IHB0c19tb2RlX3N3aXRjaGluZ19jb3VudDsKKwlpbnQgcHRzX21vZGVfcmVjb3ZlcnlfY291bnQ7CisKKwlib29sIGdldF9mcmFtZV9kdXI7CisJdTMyIHNhdmVkX3Jlc29sdXRpb247CisKKwkvKiovCisJc3RydWN0IFZQOV9Db21tb25fcyBjb21tb247CisJc3RydWN0IFJlZkNudEJ1ZmZlcl9zICpjdXJfYnVmOworCWludCByZWZyZXNoX2ZyYW1lX2ZsYWdzOworCXVpbnQ4X3QgbmVlZF9yZXN5bmM7CisJdWludDhfdCBob2xkX3JlZl9idWY7CisJdWludDhfdCByZWFkeV9mb3JfbmV3X2RhdGE7CisJc3RydWN0IEJ1ZmZlclBvb2xfcyB2cDlfYnVmZmVyX3Bvb2w7CisKKwlzdHJ1Y3QgQnVmZkluZm9fcyAqd29ya19zcGFjZV9idWY7CisKKwlzdHJ1Y3QgYnVmZl9zICptY19idWY7CisKKwl1bnNpZ25lZCBpbnQgZnJhbWVfd2lkdGg7CisJdW5zaWduZWQgaW50IGZyYW1lX2hlaWdodDsKKworCXVuc2lnbmVkIHNob3J0ICpycG1fcHRyOworCWludCAgICAgaW5pdF9waWNfdzsKKwlpbnQgICAgIGluaXRfcGljX2g7CisJaW50ICAgICBsY3VfdG90YWw7CisJaW50ICAgICBsY3Vfc2l6ZTsKKworCWludCAgICAgc2xpY2VfdHlwZTsKKworCWludCBza2lwX2ZsYWc7CisJaW50IGRlY29kZV9pZHg7CisJaW50IHNsaWNlX2lkeDsKKwl1aW50OF90IGhhc19rZXlmcmFtZTsKKwl1aW50OF90IHdhaXRfYnVmOworCXVpbnQ4X3QgZXJyb3JfZmxhZzsKKworCS8qIGJpdCAwLCBmb3IgZGVjb2Rpbmc7IGJpdCAxLCBmb3IgZGlzcGxheWluZyAqLworCXVpbnQ4X3QgaWdub3JlX2J1Zm1ncl9lcnJvcjsKKwlpbnQgUEJfc2tpcF9tb2RlOworCWludCBQQl9za2lwX2NvdW50X2FmdGVyX2RlY29kaW5nOworCS8qaHcqLworCisJLypsZiovCisJaW50IGRlZmF1bHRfZmlsdF9sdmw7CisJc3RydWN0IGxvb3BfZmlsdGVyX2luZm9fbiAqbGZpOworCXN0cnVjdCBsb29wZmlsdGVyICpsZjsKKwlzdHJ1Y3Qgc2VnbWVudGF0aW9uICpzZWdfNGxmOworCS8qKi8KKwlzdHJ1Y3QgdmRlY19pbmZvICpndnM7CisKKwl1MzIgcHJlX3N0cmVhbV9vZmZzZXQ7CisKKwl1bnNpZ25lZCBpbnQgZGVjX3N0YXR1czsKKwl1MzIgbGFzdF9wdXRfaWR4OworCWludCBuZXdfZnJhbWVfZGlzcGxheWVkOworCXZvaWQgKm1tdV9ib3g7CisJdm9pZCAqYm1tdV9ib3g7CisJaW50IG1tdV9lbmFibGU7CisjaWZkZWYgVlA5XzEwQl9NTVVfRFcKKwl2b2lkICptbXVfYm94X2R3OworCWludCBkd19tbXVfZW5hYmxlOworI2VuZGlmCisJc3RydWN0IHZmcmFtZV9tYXN0ZXJfZGlzcGxheV9jb2xvdXJfcyB2Zl9kcDsKKwlzdHJ1Y3QgZmlybXdhcmVfcyAqZnc7CisJaW50IG1heF9waWNfdzsKKwlpbnQgbWF4X3BpY19oOworI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKKwlpbnQgZGVjX3MxX3Jlc3VsdDsKKwlpbnQgczFfdGVzdF9jbWQ7CisJc3RydWN0IHdvcmtfc3RydWN0IHMxX3dvcms7CisJaW50IHVzZWRfc3RhZ2VfYnVmX251bTsKKwlpbnQgczFfcG9zOworCWludCBzMl9wb3M7CisJdm9pZCAqc3RhZ2VfbW11X21hcF9hZGRyOworCWRtYV9hZGRyX3Qgc3RhZ2VfbW11X21hcF9waHlfYWRkcjsKKwlzdHJ1Y3Qgc3RhZ2VfYnVmX3MgKnMxX2J1ZjsKKwlzdHJ1Y3Qgc3RhZ2VfYnVmX3MgKnMyX2J1ZjsKKwlzdHJ1Y3Qgc3RhZ2VfYnVmX3MgKnN0YWdlX2J1ZnMKKwkJW1NUQUdFX01BWF9CVUZGRVJTXTsKKwl1bnNpZ25lZCBjaGFyIHJ1bjJfYnVzeTsKKworCWludCBzMV9tdl9idWZfaW5kZXg7CisJaW50IHMxX212X2J1Zl9pbmRleF9wcmU7CisJaW50IHMxX212X2J1Zl9pbmRleF9wcmVfcHJlOworCXVuc2lnbmVkIGxvbmcgczFfbXByZWRfbXZfd3Jfc3RhcnRfYWRkcjsKKwl1bnNpZ25lZCBsb25nIHMxX21wcmVkX212X3dyX3N0YXJ0X2FkZHJfcHJlOworCXVuc2lnbmVkIHNob3J0IHMxX2ludHJhX29ubHk7CisJdW5zaWduZWQgc2hvcnQgczFfZnJhbWVfdHlwZTsKKwl1bnNpZ25lZCBzaG9ydCBzMV93aWR0aDsKKwl1bnNpZ25lZCBzaG9ydCBzMV9oZWlnaHQ7CisJdW5zaWduZWQgc2hvcnQgczFfbGFzdF9zaG93X2ZyYW1lOworCXVuaW9uIHBhcmFtX3UgczFfcGFyYW07CisJdTggYmFja19ub3RfcnVuX3JlYWR5OworI2VuZGlmCisJaW50IG5lZWRfY2FjaGVfc2l6ZTsKKwl1NjQgc2Nfc3RhcnRfdGltZTsKKwlib29sIHBvc3Rwcm9jX2RvbmU7CisJaW50IGxvd19sYXRlbmN5X2ZsYWc7CisJYm9vbCBub19oZWFkOworCWJvb2wgcGljX2xpc3RfaW5pdF9kb25lOworCWJvb2wgcGljX2xpc3RfaW5pdF9kb25lMjsKKwlib29sIGlzX3VzZWRfdjRsOworCXZvaWQgKnY0bDJfY3R4OworCWJvb2wgdjRsX3BhcmFtc19wYXJzZWQ7CisJaW50IGZyYW1laW5mb19lbmFibGU7CisJc3RydWN0IHZmcmFtZV9xb3NfcyB2ZnJhbWVfcW9zOworCXUzMiBtZW1fbWFwX21vZGU7CisJdTMyIGR5bmFtaWNfYnVmX251bV9tYXJnaW47CisJc3RydWN0IHZmcmFtZV9zIHZmcmFtZV9kdW1teTsKKwl1MzIgcmVzX2NoX2ZsYWc7CisJLypzdHJ1Y3QgVlA5RGVjb2Rlcl9zIHZwOV9kZWNvZGVyOyovCisJdW5pb24gcGFyYW1fdSB2cDlfcGFyYW07CisJaW50IHNpZGViaW5kX3R5cGU7CisJaW50IHNpZGViaW5kX2NoYW5uZWxfaWQ7CisJYm9vbCBlbmFibGVfZmVuY2U7CisJaW50IGZlbmNlX3VzYWdlOworCXUzMiBmcmFtZV9tb2RlX3B0c19zYXZlW0ZSQU1FX0JVRkZFUlNdOworCXU2NCBmcmFtZV9tb2RlX3B0czY0X3NhdmVbRlJBTUVfQlVGRkVSU107CisJaW50IHJ1bl9yZWFkeV9taW5fYnVmX251bTsKKwlpbnQgb25lX3BhY2thZ2VfZnJhbWVfY250OworCWludCBidWZmZXJfd3JhcFtGUkFNRV9CVUZGRVJTXTsKKwlpbnQgbGFzdF93aWR0aDsKKwlpbnQgbGFzdF9oZWlnaHQ7CisJdTMyIGVycm9yX2ZyYW1lX3dpZHRoOworCXUzMiBlcnJvcl9mcmFtZV9oZWlnaHQ7CisJdTMyIGVuZGlhbjsKKwl1bG9uZyBmYl90b2tlbjsKKwlzdHJ1Y3QgdnA5X2ZlbmNlX3ZmX3QgZmVuY2VfdmZfczsKKwlzdHJ1Y3QgbXV0ZXggZmVuY2VfbXV0ZXg7CisJZG1hX2FkZHJfdCByZG1hX3BoeV9hZHI7CisJdW5zaWduZWQgKnJkbWFfYWRyOworCXN0cnVjdCB0cmFjZV9kZWNvZGVyX25hbWUgdHJhY2U7Cit9OworCitzdGF0aWMgaW50IHZwOV9wcmludChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksCisJaW50IGZsYWcsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworI2RlZmluZSBIRVZDX1BSSU5UX0JVRgkJNTEyCisJdW5zaWduZWQgY2hhciBidWZbSEVWQ19QUklOVF9CVUZdOworCWludCBsZW4gPSAwOworCisJaWYgKHBiaSA9PSBOVUxMIHx8CisJCShmbGFnID09IDApIHx8CisJCShkZWJ1ZyAmIGZsYWcpKSB7CisJCXZhX2xpc3QgYXJnczsKKworCQl2YV9zdGFydChhcmdzLCBmbXQpOworCQlpZiAocGJpKQorCQkJbGVuID0gc3ByaW50ZihidWYsICJbJWRdIiwgcGJpLT5pbmRleCk7CisJCXZzbnByaW50ZihidWYgKyBsZW4sIEhFVkNfUFJJTlRfQlVGIC0gbGVuLCBmbXQsIGFyZ3MpOworCQlwcl9kZWJ1ZygiJXMiLCBidWYpOworCQl2YV9lbmQoYXJncyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlzX292ZXJzaXplKGludCB3LCBpbnQgaCkKK3sKKwlpbnQgbWF4ID0gKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKT8KKwkJTUFYX1NJWkVfOEsgOiBNQVhfU0laRV80SzsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1RCkKKwkJbWF4ID0gTUFYX1NJWkVfMks7CisKKwlpZiAodyA8PSAwIHx8IGggPD0gMCkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoaCAhPSAwICYmICh3ID4gbWF4IC8gaCkpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50IHZ2cDlfbW11X2NvbXByZXNzX2hlYWRlcl9zaXplKGludCB3LCBpbnQgaCkKK3sKKwlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKSAmJgorCQlJU184S19TSVpFKHcsIGgpKQorCQlyZXR1cm4gKE1NVV9DT01QUkVTU19IRUFERVJfU0laRV84Syk7CisJaWYgKElTXzRLX1NJWkUodywgaCkpCisJCXJldHVybiAoTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFXzRLKTsKKwlyZXR1cm4gKE1NVV9DT01QUkVTU19IRUFERVJfU0laRV8xMDgwUCk7Cit9CisKKy8qI2RlZmluZSBGUkFNRV9NTVVfTUFQX1NJWkUgIChNQVhfRlJBTUVfNEtfTlVNICogNCkqLworc3RhdGljIGludCB2dnA5X2ZyYW1lX21tdV9tYXBfc2l6ZShzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJaWYgKChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkgJiYKKwkJSVNfOEtfU0laRShwYmktPm1heF9waWNfdywgcGJpLT5tYXhfcGljX2gpKQorCQlyZXR1cm4gKE1BWF9GUkFNRV84S19OVU0gPDwgMik7CisKKwlyZXR1cm4gKE1BWF9GUkFNRV80S19OVU0gPDwgMik7Cit9CisKK3N0YXRpYyBpbnQgdjRsX2FsbG9jX2FuZF9jb25maWdfcGljKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljKTsKKworc3RhdGljIHZvaWQgcmVzaXplX2NvbnRleHRfYnVmZmVycyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksCisJc3RydWN0IFZQOV9Db21tb25fcyAqY20sIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKwlpZiAoY20tPndpZHRoICE9IHdpZHRoIHx8IGNtLT5oZWlnaHQgIT0gaGVpZ2h0KSB7CisJCS8qIHRvIGRvIC4uKi8KKwkJaWYgKHBiaSAhPSBOVUxMKSB7CisJCQlwYmktPnZwOV9maXJzdF9wdHNfcmVhZHkgPSAwOworCQkJcGJpLT5kdXJhdGlvbl9mcm9tX3B0c19kb25lID0gMDsKKwkJfQorCQlwcl9pbmZvKCIlcyAoJWQsJWQpPT4oJWQsJWQpXHJcbiIsIF9fZnVuY19fLAorCQkJY20tPndpZHRoLCBjbS0+aGVpZ2h0LAorCQkJd2lkdGgsIGhlaWdodCk7CisJCWNtLT53aWR0aCA9IHdpZHRoOworCQljbS0+aGVpZ2h0ID0gaGVpZ2h0OworCX0KKwkvKgorCSAqaWYgKGNtLT5jdXJfZnJhbWUtPm12cyA9PSBOVUxMIHx8CisJICoJY20tPm1pX3Jvd3MgPiBjbS0+Y3VyX2ZyYW1lLT5taV9yb3dzIHx8CisJICoJY20tPm1pX2NvbHMgPiBjbS0+Y3VyX2ZyYW1lLT5taV9jb2xzKSB7CisJICoJcmVzaXplX212X2J1ZmZlcihjbSk7CisJICp9CisJICovCit9CisKK3N0YXRpYyBpbnQgdmFsaWRfcmVmX2ZyYW1lX3NpemUoaW50IHJlZl93aWR0aCwgaW50IHJlZl9oZWlnaHQsCisJCQkJaW50IHRoaXNfd2lkdGgsIGludCB0aGlzX2hlaWdodCkgeworCXJldHVybiAyICogdGhpc193aWR0aCA+PSByZWZfd2lkdGggJiYKKwkJMiAqIHRoaXNfaGVpZ2h0ID49IHJlZl9oZWlnaHQgJiYKKwkJdGhpc193aWR0aCA8PSAxNiAqIHJlZl93aWR0aCAmJgorCQl0aGlzX2hlaWdodCA8PSAxNiAqIHJlZl9oZWlnaHQ7Cit9CisKKy8qCisgKnN0YXRpYyBpbnQgdmFsaWRfcmVmX2ZyYW1lX2ltZ19mbXQoZW51bSB2cHhfYml0X2RlcHRoX3QgcmVmX2JpdF9kZXB0aCwKKyAqCQkJCQlpbnQgcmVmX3hzcywgaW50IHJlZl95c3MsCisgKgkJCQkJZW51bSB2cHhfYml0X2RlcHRoX3QgdGhpc19iaXRfZGVwdGgsCisgKgkJCQkJaW50IHRoaXNfeHNzLCBpbnQgdGhpc195c3MpIHsKKyAqCXJldHVybiByZWZfYml0X2RlcHRoID09IHRoaXNfYml0X2RlcHRoICYmIHJlZl94c3MgPT0gdGhpc194c3MgJiYKKyAqCQlyZWZfeXNzID09IHRoaXNfeXNzOworICp9CisgKi8KKworCitzdGF0aWMgaW50IHNldHVwX2ZyYW1lX3NpemUoCisJCXN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwKKwkJc3RydWN0IFZQOV9Db21tb25fcyAqY20sIHVuaW9uIHBhcmFtX3UgKnBhcmFtcywKKwkJdW5zaWduZWQgaW50ICptbXVfaW5kZXhfYWRyLAorCQl1bnNpZ25lZCBpbnQgKm1tdV9kd19pbmRleF9hZHIsCisJCWludCBwcmludF9oZWFkZXJfaW5mbykgeworCWludCB3aWR0aCwgaGVpZ2h0OworCXN0cnVjdCBCdWZmZXJQb29sX3MgKiBjb25zdCBwb29sID0gY20tPmJ1ZmZlcl9wb29sOworCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICp5YmY7CisJaW50IHJldCA9IDA7CisKKwl3aWR0aCA9IHBhcmFtcy0+cC53aWR0aDsKKwloZWlnaHQgPSBwYXJhbXMtPnAuaGVpZ2h0OworCWlmIChpc19vdmVyc2l6ZSh3aWR0aCwgaGVpZ2h0KSkgeworCQlwYmktPmVycm9yX2ZyYW1lX3dpZHRoID0gd2lkdGg7CisJCXBiaS0+ZXJyb3JfZnJhbWVfaGVpZ2h0ID0gaGVpZ2h0OworCQl2cDlfcHJpbnQocGJpLCAwLCAiJXMsIEVycm9yOiBJbnZhbGlkIGZyYW1lIHNpemVcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwYmktPmVycm9yX2ZyYW1lX3dpZHRoID0gMDsKKwlwYmktPmVycm9yX2ZyYW1lX2hlaWdodCA9IDA7CisKKwkvKnZwOV9yZWFkX2ZyYW1lX3NpemUocmIsICZ3aWR0aCwgJmhlaWdodCk7Ki8KKwlpZiAocHJpbnRfaGVhZGVyX2luZm8pCisJCXByX2luZm8oIiAqIDE2LWJpdHMgdyByZWFkIDogJWQgKHdpZHRoIDogJWQpXG4iLCB3aWR0aCwgaGVpZ2h0KTsKKwlpZiAocHJpbnRfaGVhZGVyX2luZm8pCisJCXByX2luZm8KKwkJKCIgKiAxNi1iaXRzIGggcmVhZCA6ICVkIChoZWlnaHQgOiAlZClcbiIsIHdpZHRoLCBoZWlnaHQpOworCisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9QSUNUVVJFX1NJWkUsIChoZWlnaHQgPDwgMTYpIHwgd2lkdGgpOworI2lmZGVmIFZQOV8xMEJfSEVEX0ZCCisJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9QSUNfU0laRV9GQl9SRUFELCAoaGVpZ2h0IDw8IDE2KSB8IHdpZHRoKTsKKyNlbmRpZgorCWlmIChwYmktPm1tdV9lbmFibGUgJiYgKChwYmktPmRvdWJsZV93cml0ZV9tb2RlICYgMHgxMCkgPT0gMCkpIHsKKwkJcmV0ID0gdnA5X2FsbG9jX21tdShwYmksCisJCQljbS0+bmV3X2ZiX2lkeCwKKwkJCXBhcmFtcy0+cC53aWR0aCwKKwkJCXBhcmFtcy0+cC5oZWlnaHQsCisJCQlwYXJhbXMtPnAuYml0X2RlcHRoLAorCQkJbW11X2luZGV4X2Fkcik7CisJCWlmIChyZXQgIT0gMCkgeworCQkJcHJfZXJyKCJjYW4ndCBhbGxvYyBuZWVkIG1tdTEsaWR4ICVkIHJldCA9JWRcbiIsCisJCQkJY20tPm5ld19mYl9pZHgsCisJCQkJcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJY20tPmN1cl9mYl9pZHhfbW11ID0gY20tPm5ld19mYl9pZHg7CisJfQorI2lmZGVmIFZQOV8xMEJfTU1VX0RXCisJaWYgKHBiaS0+ZHdfbW11X2VuYWJsZSAmJiAobW11X2R3X2luZGV4X2FkciAhPSBOVUxMKSkgeworCQlyZXQgPSB2cDlfYWxsb2NfbW11X2R3KHBiaSwgY20tPm5ld19mYl9pZHgsCisJCQlwYXJhbXMtPnAud2lkdGgsIHBhcmFtcy0+cC5oZWlnaHQsCisJCQlwYXJhbXMtPnAuYml0X2RlcHRoLCBtbXVfZHdfaW5kZXhfYWRyKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQkJcHJfZXJyKCJjYW4ndCBhbGxvYyBuZWVkIG1tdTEgZHcsaWR4ICVkIHJldCA9JWRcbiIsCisJCQkJCWNtLT5uZXdfZmJfaWR4LAorCQkJCQlyZXQpOworCQkJCXJldHVybiByZXQ7CisJCX0KKwl9CisjZW5kaWYKKwlyZXNpemVfY29udGV4dF9idWZmZXJzKHBiaSwgY20sIHdpZHRoLCBoZWlnaHQpOworCXNldHVwX2Rpc3BsYXlfc2l6ZShjbSwgcGFyYW1zLCBwcmludF9oZWFkZXJfaW5mbyk7CisjaWYgMAorCWxvY2tfYnVmZmVyX3Bvb2wocG9vbCk7CisJaWYgKHZwOV9yZWFsbG9jX2ZyYW1lX2J1ZmZlcigKKwkJZ2V0X2ZyYW1lX25ld19idWZmZXIoY20pLCBjbS0+d2lkdGgsIGNtLT5oZWlnaHQsCisJCWNtLT5zdWJzYW1wbGluZ194LCBjbS0+c3Vic2FtcGxpbmdfeSwKKyNpZiBDT05GSUdfVlA5X0hJR0hCSVRERVBUSAorCQljbS0+dXNlX2hpZ2hiaXRkZXB0aCwKKyNlbmRpZgorCQlWUDlfREVDX0JPUkRFUl9JTl9QSVhFTFMsCisJCWNtLT5ieXRlX2FsaWdubWVudCwKKwkJJnBvb2wtPmZyYW1lX2J1ZnNbY20tPm5ld19mYl9pZHhdLnJhd19mcmFtZV9idWZmZXIsCisJCXBvb2wtPmdldF9mYl9jYiwgcG9vbC0+Y2JfcHJpdikpIHsKKwkJdW5sb2NrX2J1ZmZlcl9wb29sKHBvb2wpOworCQl2cHhfaW50ZXJuYWxfZXJyb3IoJmNtLT5lcnJvciwgVlBYX0NPREVDX01FTV9FUlJPUiwKKwkJCSJGYWlsZWQgdG8gYWxsb2NhdGUgZnJhbWUgYnVmZmVyIik7CisJfQorCXVubG9ja19idWZmZXJfcG9vbChwb29sKTsKKyNlbHNlCisJLyogcG9ydGluZyAqLworCXliZiA9IGdldF9mcmFtZV9uZXdfYnVmZmVyKGNtKTsKKwlpZiAoIXliZikKKwkJcmV0dXJuIC0xOworCisJeWJmLT55X2Nyb3Bfd2lkdGggPSB3aWR0aDsKKwl5YmYtPnlfY3JvcF9oZWlnaHQgPSBoZWlnaHQ7CisJeWJmLT5iaXRfZGVwdGggPSBwYXJhbXMtPnAuYml0X2RlcHRoOworI2VuZGlmCisJcG9vbC0+ZnJhbWVfYnVmc1tjbS0+bmV3X2ZiX2lkeF0uYnVmLnN1YnNhbXBsaW5nX3ggPSBjbS0+c3Vic2FtcGxpbmdfeDsKKwlwb29sLT5mcmFtZV9idWZzW2NtLT5uZXdfZmJfaWR4XS5idWYuc3Vic2FtcGxpbmdfeSA9IGNtLT5zdWJzYW1wbGluZ195OworCXBvb2wtPmZyYW1lX2J1ZnNbY20tPm5ld19mYl9pZHhdLmJ1Zi5iaXRfZGVwdGggPQorCQkJCQkJKHVuc2lnbmVkIGludCljbS0+Yml0X2RlcHRoOworCXBvb2wtPmZyYW1lX2J1ZnNbY20tPm5ld19mYl9pZHhdLmJ1Zi5jb2xvcl9zcGFjZSA9IGNtLT5jb2xvcl9zcGFjZTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNldHVwX2ZyYW1lX3NpemVfd2l0aF9yZWZzKAorCQlzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksCisJCXN0cnVjdCBWUDlfQ29tbW9uX3MgKmNtLAorCQl1bmlvbiBwYXJhbV91ICpwYXJhbXMsCisJCXVuc2lnbmVkIGludCAqbW11X2luZGV4X2FkciwKKwkJdW5zaWduZWQgaW50ICptbXVfZHdfaW5kZXhfYWRyLAorCQlpbnQgcHJpbnRfaGVhZGVyX2luZm8pIHsKKworCWludCB3aWR0aCwgaGVpZ2h0OworCWludCBmb3VuZCA9IDAsIGk7CisJaW50IGhhc192YWxpZF9yZWZfZnJhbWUgPSAwOworCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICp5YmY7CisJc3RydWN0IEJ1ZmZlclBvb2xfcyAqIGNvbnN0IHBvb2wgPSBjbS0+YnVmZmVyX3Bvb2w7CisJaW50IHJldCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgUkVGU19QRVJfRlJBTUU7ICsraSkgeworCQlpZiAoKHBhcmFtcy0+cC5zYW1lX2ZyYW1lX3NpemUgPj4KKwkJCQkoUkVGU19QRVJfRlJBTUUgLSBpIC0gMSkpICYgMHgxKSB7CisJCQlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqY29uc3QgYnVmID0KKwkJCQkJCQljbS0+ZnJhbWVfcmVmc1tpXS5idWY7CisJCQkvKmlmIChwcmludF9oZWFkZXJfaW5mbykKKwkJCSAqCXByX2luZm8KKwkJCSAqCSgiMS1iaXQgc2FtZV9mcmFtZV9zaXplWyVkXSByZWFkIDogMVxuIiwgaSk7CisJCQkgKi8KKwkJCQl3aWR0aCA9IGJ1Zi0+eV9jcm9wX3dpZHRoOworCQkJCWhlaWdodCA9IGJ1Zi0+eV9jcm9wX2hlaWdodDsKKwkJCS8qaWYgKHByaW50X2hlYWRlcl9pbmZvKQorCQkJICoJcHJfaW5mbworCQkJICoJKCIgLSBzYW1lX2ZyYW1lX3NpemUgd2lkdGggOiAlZFxuIiwgd2lkdGgpOworCQkJICovCisJCQkvKmlmIChwcmludF9oZWFkZXJfaW5mbykKKwkJCSAqCXByX2luZm8KKwkJCSAqCSgiIC0gc2FtZV9mcmFtZV9zaXplIGhlaWdodCA6ICVkXG4iLCBoZWlnaHQpOworCQkJICovCisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCS8qaWYgKHByaW50X2hlYWRlcl9pbmZvKQorCQkJICoJcHJfaW5mbworCQkJICoJKCIxLWJpdCBzYW1lX2ZyYW1lX3NpemVbJWRdIHJlYWQgOiAwXG4iLCBpKTsKKwkJCSAqLworCQl9CisJfQorCisJaWYgKCFmb3VuZCkgeworCQkvKnZwOV9yZWFkX2ZyYW1lX3NpemUocmIsICZ3aWR0aCwgJmhlaWdodCk7Ki8KKwkJd2lkdGggPSBwYXJhbXMtPnAud2lkdGg7CisJCWhlaWdodCA9IHBhcmFtcy0+cC5oZWlnaHQ7CisJCS8qaWYgKHByaW50X2hlYWRlcl9pbmZvKQorCQkgKglwcl9pbmZvCisJCSAqCSgiICogMTYtYml0cyB3IHJlYWQgOiAlZCAod2lkdGggOiAlZClcbiIsCisJCSAqCQl3aWR0aCwgaGVpZ2h0KTsKKwkJICppZiAocHJpbnRfaGVhZGVyX2luZm8pCisJCSAqCXByX2luZm8KKwkJICoJKCIgKiAxNi1iaXRzIGggcmVhZCA6ICVkIChoZWlnaHQgOiAlZClcbiIsCisJCSAqCQl3aWR0aCwgaGVpZ2h0KTsKKwkJICovCisJfQorCisJaWYgKGlzX292ZXJzaXplKHdpZHRoLCBoZWlnaHQpKSB7CisJCXBiaS0+ZXJyb3JfZnJhbWVfd2lkdGggPSB3aWR0aDsKKwkJcGJpLT5lcnJvcl9mcmFtZV9oZWlnaHQgPSBoZWlnaHQ7CisJCXZwOV9wcmludChwYmksIDAsICIlcywgRXJyb3I6IEludmFsaWQgZnJhbWUgc2l6ZVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLTE7CisJfQorCXBiaS0+ZXJyb3JfZnJhbWVfd2lkdGggPSAwOworCXBiaS0+ZXJyb3JfZnJhbWVfaGVpZ2h0ID0gMDsKKworCXBhcmFtcy0+cC53aWR0aCA9IHdpZHRoOworCXBhcmFtcy0+cC5oZWlnaHQgPSBoZWlnaHQ7CisKKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX1BJQ1RVUkVfU0laRSwgKGhlaWdodCA8PCAxNikgfCB3aWR0aCk7CisJaWYgKHBiaS0+bW11X2VuYWJsZSAmJiAoKHBiaS0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDEwKSA9PSAwKSkgeworCQkvKmlmKGNtLT5wcmV2X2ZiX2lkeCA+PSAwKSByZWxlYXNlX3VudXNlZF80ayhjbS0+cHJldl9mYl9pZHgpOworCQkgKmNtLT5wcmV2X2ZiX2lkeCA9IGNtLT5uZXdfZmJfaWR4OworCQkgKi8KKwkvKglwcl9pbmZvCisJICoJKCJbREVCVUcgREVCVUddQmVmb3JlIGFsbG9jX21tdSwKKwkgKglwcmV2X2ZiX2lkeCA6ICVkLCBuZXdfZmJfaWR4IDogJWRcclxuIiwKKwkgKgljbS0+cHJldl9mYl9pZHgsIGNtLT5uZXdfZmJfaWR4KTsKKwkgKi8KKwkJcmV0ID0gdnA5X2FsbG9jX21tdShwYmksIGNtLT5uZXdfZmJfaWR4LAorCQkJCXBhcmFtcy0+cC53aWR0aCwgcGFyYW1zLT5wLmhlaWdodCwKKwkJcGFyYW1zLT5wLmJpdF9kZXB0aCwgbW11X2luZGV4X2Fkcik7CisJCWlmIChyZXQgIT0gMCkgeworCQkJcHJfZXJyKCJjYW4ndCBhbGxvYyBuZWVkIG1tdSxpZHggJWRcclxuIiwKKwkJCQljbS0+bmV3X2ZiX2lkeCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWNtLT5jdXJfZmJfaWR4X21tdSA9IGNtLT5uZXdfZmJfaWR4OworCX0KKyNpZmRlZiBWUDlfMTBCX01NVV9EVworCWlmIChwYmktPmR3X21tdV9lbmFibGUgJiYgKG1tdV9kd19pbmRleF9hZHIgIT0gTlVMTCkpIHsKKwkJcmV0ID0gdnA5X2FsbG9jX21tdV9kdyhwYmksIGNtLT5uZXdfZmJfaWR4LAorCQkJcGFyYW1zLT5wLndpZHRoLCBwYXJhbXMtPnAuaGVpZ2h0LAorCQkJcGFyYW1zLT5wLmJpdF9kZXB0aCwgbW11X2R3X2luZGV4X2Fkcik7CisJCWlmIChyZXQgIT0gMCkgeworCQkJcHJfZXJyKCJjYW4ndCBhbGxvYyBuZWVkIG1tdSBkdyxpZHggJWRcclxuIiwKKwkJCQljbS0+bmV3X2ZiX2lkeCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorI2VuZGlmCisJLypDaGVjayB0byBtYWtlIHN1cmUgYXQgbGVhc3Qgb25lIG9mIGZyYW1lcyB0aGF0IHRoaXMgZnJhbWUgcmVmZXJlbmNlcworCSAqaGFzIHZhbGlkIGRpbWVuc2lvbnMuCisJICovCisJZm9yIChpID0gMDsgaSA8IFJFRlNfUEVSX0ZSQU1FOyArK2kpIHsKKwkJc3RydWN0IFJlZkJ1ZmZlcl9zICogY29uc3QgcmVmX2ZyYW1lID0gJmNtLT5mcmFtZV9yZWZzW2ldOworCisJCWhhc192YWxpZF9yZWZfZnJhbWUgfD0KKwkJCXZhbGlkX3JlZl9mcmFtZV9zaXplKHJlZl9mcmFtZS0+YnVmLT55X2Nyb3Bfd2lkdGgsCisJCQlyZWZfZnJhbWUtPmJ1Zi0+eV9jcm9wX2hlaWdodCwKKwkJCXdpZHRoLCBoZWlnaHQpOworCX0KKwlpZiAoIWhhc192YWxpZF9yZWZfZnJhbWUpIHsKKwkJcHJfZXJyKCJFcnJvcjogUmVmZXJlbmNlZCBmcmFtZSBoYXMgaW52YWxpZCBzaXplXHJcbiIpOworCQlyZXR1cm4gLTE7CisJfQorI2lmIDAKKwlmb3IgKGkgPSAwOyBpIDwgUkVGU19QRVJfRlJBTUU7ICsraSkgeworCQkJc3RydWN0IFJlZkJ1ZmZlcl9zICogY29uc3QgcmVmX2ZyYW1lID0KKwkJCQkJCQkmY20tPmZyYW1lX3JlZnNbaV07CisJCQlpZiAoIXZhbGlkX3JlZl9mcmFtZV9pbWdfZm10KAorCQkJCXJlZl9mcmFtZS0+YnVmLT5iaXRfZGVwdGgsCisJCQkJcmVmX2ZyYW1lLT5idWYtPnN1YnNhbXBsaW5nX3gsCisJCQkJcmVmX2ZyYW1lLT5idWYtPnN1YnNhbXBsaW5nX3ksCisJCQkJY20tPmJpdF9kZXB0aCwKKwkJCQljbS0+c3Vic2FtcGxpbmdfeCwKKwkJCQljbS0+c3Vic2FtcGxpbmdfeSkpCisJCQkJcHJfZXJyCisJCQkJKCJSZWZlcmVuY2VkIGZyYW1lIGluY29tcGF0aWJsZSBjb2xvciBmbXRcclxuIik7CisJCQkJcmV0dXJuIC0xOworCX0KKyNlbmRpZgorCXJlc2l6ZV9jb250ZXh0X2J1ZmZlcnMocGJpLCBjbSwgd2lkdGgsIGhlaWdodCk7CisJc2V0dXBfZGlzcGxheV9zaXplKGNtLCBwYXJhbXMsIHByaW50X2hlYWRlcl9pbmZvKTsKKworI2lmIDAKKwlsb2NrX2J1ZmZlcl9wb29sKHBvb2wpOworCWlmICh2cDlfcmVhbGxvY19mcmFtZV9idWZmZXIoCisJCWdldF9mcmFtZV9uZXdfYnVmZmVyKGNtKSwgY20tPndpZHRoLCBjbS0+aGVpZ2h0LAorCQljbS0+c3Vic2FtcGxpbmdfeCwgY20tPnN1YnNhbXBsaW5nX3ksCisjaWYgQ09ORklHX1ZQOV9ISUdIQklUREVQVEgKKwkJY20tPnVzZV9oaWdoYml0ZGVwdGgsCisjZW5kaWYKKwkJVlA5X0RFQ19CT1JERVJfSU5fUElYRUxTLAorCQljbS0+Ynl0ZV9hbGlnbm1lbnQsCisJCSZwb29sLT5mcmFtZV9idWZzW2NtLT5uZXdfZmJfaWR4XS5yYXdfZnJhbWVfYnVmZmVyLAorCQlwb29sLT5nZXRfZmJfY2IsCisJCXBvb2wtPmNiX3ByaXYpKSB7CisJCXVubG9ja19idWZmZXJfcG9vbChwb29sKTsKKwkJdnB4X2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIFZQWF9DT0RFQ19NRU1fRVJST1IsCisJCSJGYWlsZWQgdG8gYWxsb2NhdGUgZnJhbWUgYnVmZmVyIik7CisJfQorCXVubG9ja19idWZmZXJfcG9vbChwb29sKTsKKyNlbHNlCisJLyogcG9ydGluZyAqLworCXliZiA9IGdldF9mcmFtZV9uZXdfYnVmZmVyKGNtKTsKKwlpZiAoIXliZikKKwkJcmV0dXJuIC0xOworCisJeWJmLT55X2Nyb3Bfd2lkdGggPSB3aWR0aDsKKwl5YmYtPnlfY3JvcF9oZWlnaHQgPSBoZWlnaHQ7CisJeWJmLT5iaXRfZGVwdGggPSBwYXJhbXMtPnAuYml0X2RlcHRoOworI2VuZGlmCisJcG9vbC0+ZnJhbWVfYnVmc1tjbS0+bmV3X2ZiX2lkeF0uYnVmLnN1YnNhbXBsaW5nX3ggPSBjbS0+c3Vic2FtcGxpbmdfeDsKKwlwb29sLT5mcmFtZV9idWZzW2NtLT5uZXdfZmJfaWR4XS5idWYuc3Vic2FtcGxpbmdfeSA9IGNtLT5zdWJzYW1wbGluZ195OworCXBvb2wtPmZyYW1lX2J1ZnNbY20tPm5ld19mYl9pZHhdLmJ1Zi5iaXRfZGVwdGggPQorCQkJCQkJKHVuc2lnbmVkIGludCljbS0+Yml0X2RlcHRoOworCXBvb2wtPmZyYW1lX2J1ZnNbY20tPm5ld19mYl9pZHhdLmJ1Zi5jb2xvcl9zcGFjZSA9IGNtLT5jb2xvcl9zcGFjZTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgY2xvc2VfdG8oaW50IGEsIGludCBiLCBpbnQgbSkKK3sKKwlyZXR1cm4gKGFicyhhIC0gYikgPCBtKSA/IHRydWUgOiBmYWxzZTsKK30KKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKK3N0YXRpYyBpbnQgdnA5X3ByaW50X2NvbnQoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLAorCWludCBmbGFnLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZltIRVZDX1BSSU5UX0JVRl07CisJaW50IGxlbiA9IDA7CisKKwlpZiAocGJpID09IE5VTEwgfHwKKwkJKGZsYWcgPT0gMCkgfHwKKwkJKGRlYnVnICYgZmxhZykpIHsKKwkJdmFfbGlzdCBhcmdzOworCisJCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJCXZzbnByaW50ZihidWYgKyBsZW4sIEhFVkNfUFJJTlRfQlVGIC0gbGVuLCBmbXQsIGFyZ3MpOworCQlwcl9kZWJ1ZygiJXMiLCBidWYpOworCQl2YV9lbmQoYXJncyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0cmlnZ2VyX3NjaGVkdWxlKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlpZiAocGJpLT5pc191c2VkX3Y0bCkgeworCQlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKHBiaS0+djRsMl9jdHgpOworCisJCWlmIChjdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSAmJgorCQkJIXBiaS0+djRsX3BhcmFtc19wYXJzZWQpCisJCQl2ZGVjX3Y0bF93cml0ZV9mcmFtZV9zeW5jKGN0eCk7CisJfQorCisJaWYgKHBiaS0+dmRlY19jYikKKwkJcGJpLT52ZGVjX2NiKGh3X3RvX3ZkZWMocGJpKSwgcGJpLT52ZGVjX2NiX2FyZyk7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0X3Byb2Nlc3NfdGltZShzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJaWYgKHBiaS0+c3RhcnRfcHJvY2Vzc190aW1lKSB7CisJCXVuc2lnbmVkIHByb2Nlc3NfdGltZSA9CisJCQkxMDAwICogKGppZmZpZXMgLSBwYmktPnN0YXJ0X3Byb2Nlc3NfdGltZSkgLyBIWjsKKwkJcGJpLT5zdGFydF9wcm9jZXNzX3RpbWUgPSAwOworCQlpZiAocHJvY2Vzc190aW1lID4gbWF4X3Byb2Nlc3NfdGltZVtwYmktPmluZGV4XSkKKwkJCW1heF9wcm9jZXNzX3RpbWVbcGJpLT5pbmRleF0gPSBwcm9jZXNzX3RpbWU7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdGFydF9wcm9jZXNzX3RpbWUoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCXBiaS0+c3RhcnRfcHJvY2Vzc190aW1lID0gamlmZmllczsKKwlwYmktPmRlY29kZV90aW1lb3V0X2NvdW50ID0gMDsKKwlwYmktPmxhc3RfbGN1X2lkeCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVvdXRfcHJvY2VzcyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJcGJpLT50aW1lb3V0X251bSsrOworCWFtaGV2Y19zdG9wKCk7CisJdnA5X3ByaW50KHBiaSwKKwkJMCwgIiVzIGRlY29kZXIgdGltZW91dFxuIiwgX19mdW5jX18pOworCisJcGJpLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworCXJlc2V0X3Byb2Nlc3NfdGltZShwYmkpOworCXZkZWNfc2NoZWR1bGVfd29yaygmcGJpLT53b3JrKTsKK30KKworc3RhdGljIHUzMiBnZXRfdmFsaWRfZG91YmxlX3dyaXRlX21vZGUoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCXUzMiBkdyA9ICgoZG91YmxlX3dyaXRlX21vZGUgJiAweDgwMDAwMDAwKSA9PSAwKSA/CisJCXBiaS0+ZG91YmxlX3dyaXRlX21vZGUgOgorCQkoZG91YmxlX3dyaXRlX21vZGUgJiAweDdmZmZmZmZmKTsKKwlpZiAoZHcgJiAweDIwKSB7CisJCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX1QzKQorCQkJJiYgKChkdyAmIDB4ZikgPT0gMiB8fCAoZHcgJiAweGYpID09IDMpKSB7CisJCQlwcl9pbmZvKCJNTVUgZG91ZWJsZSB3cml0ZSAxOjQgbm90IHN1cHBvcnRlZCAhISFcbiIpOworCQkJZHcgPSAwOworCQl9CisJfQorCXJldHVybiBkdzsKK30KKworc3RhdGljIGludCBnZXRfZG91YmxlX3dyaXRlX21vZGUoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCXUzMiB2YWxpZF9kd19tb2RlID0gZ2V0X3ZhbGlkX2RvdWJsZV93cml0ZV9tb2RlKHBiaSk7CisJdTMyIGR3OworCWludCB3LCBoOworCXN0cnVjdCBWUDlfQ29tbW9uX3MgKmNtID0gJnBiaS0+Y29tbW9uOworCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpjdXJfcGljX2NvbmZpZzsKKworCWlmIChwYmktPmlzX3VzZWRfdjRsKSB7CisJCXVuc2lnbmVkIGludCBvdXQ7CisKKwkJdmRlY192NGxfZ2V0X2R3X21vZGUocGJpLT52NGwyX2N0eCwgJm91dCk7CisJCWR3ID0gb3V0OworCQlyZXR1cm4gZHc7CisJfQorCisJLyogbWFzayBmb3Igc3VwcG9ydGluZyBkb3VibGUgd3JpdGUgdmFsdWUgYmlnZ2VyIHRoYW4gMHgxMDAgKi8KKwlpZiAodmFsaWRfZHdfbW9kZSAmIDB4ZmZmZmZmMDApIHsKKwkJaWYgKCFjbS0+Y3VyX2ZyYW1lKQorCQkJcmV0dXJuIDE7LypubyB2YWxpZCBmcmFtZSwqLworCQljdXJfcGljX2NvbmZpZyA9ICZjbS0+Y3VyX2ZyYW1lLT5idWY7CisJCXcgPSBjdXJfcGljX2NvbmZpZy0+eV9jcm9wX3dpZHRoOworCQloID0gY3VyX3BpY19jb25maWctPnlfY3JvcF9oZWlnaHQ7CisKKwkJZHcgPSAweDE7IC8qMToxKi8KKwkJc3dpdGNoICh2YWxpZF9kd19tb2RlKSB7CisJCWNhc2UgMHgxMDA6CisJCQlpZiAodyA+IDE5MjAgJiYgaCA+IDEwODgpCisJCQkJZHcgPSAweDQ7IC8qMToyKi8KKwkJCWJyZWFrOworCQljYXNlIDB4MjAwOgorCQkJaWYgKHcgPiAxOTIwICYmIGggPiAxMDg4KQorCQkJCWR3ID0gMHgyOyAvKjE6NCovCisJCQlicmVhazsKKwkJY2FzZSAweDMwMDoKKwkJCWlmICh3ID4gMTI4MCAmJiBoID4gNzIwKQorCQkJCWR3ID0gMHg0OyAvKjE6MiovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiBkdzsKKwl9CisKKwlyZXR1cm4gdmFsaWRfZHdfbW9kZTsKK30KKworLyogZm9yIGRvdWJsZSB3cml0ZSBidWYgYWxsb2MgKi8KK3N0YXRpYyBpbnQgZ2V0X2RvdWJsZV93cml0ZV9tb2RlX2luaXQoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCXUzMiB2YWxpZF9kd19tb2RlID0gZ2V0X3ZhbGlkX2RvdWJsZV93cml0ZV9tb2RlKHBiaSk7CisJdTMyIGR3OworCWludCB3ID0gcGJpLT5pbml0X3BpY193OworCWludCBoID0gcGJpLT5pbml0X3BpY19oOworCisJZHcgPSAweDE7IC8qMToxKi8KKwlzd2l0Y2ggKHZhbGlkX2R3X21vZGUpIHsKKwljYXNlIDB4MTAwOgorCQlpZiAodyA+IDE5MjAgJiYgaCA+IDEwODgpCisJCQlkdyA9IDB4NDsgLyoxOjIqLworCQlicmVhazsKKwljYXNlIDB4MjAwOgorCQlpZiAodyA+IDE5MjAgJiYgaCA+IDEwODgpCisJCQlkdyA9IDB4MjsgLyoxOjQqLworCQlicmVhazsKKwljYXNlIDB4MzAwOgorCQlpZiAodyA+IDEyODAgJiYgaCA+IDcyMCkKKwkJCWR3ID0gMHg0OyAvKjE6MiovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWR3ID0gdmFsaWRfZHdfbW9kZTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBkdzsKK30KKyNlbmRpZgorCisvLyNkZWZpbmUJTUFYXzRLX05VTQkJMHgxMjAwCisKKy8qIHJldHVybiBwYWdlIG51bWJlciAqLworc3RhdGljIGludCB2cDlfbW11X3BhZ2VfbnVtKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwKKwkJaW50IHcsIGludCBoLCBpbnQgc2F2ZV9tb2RlKQoreworCWludCBwaWN0dXJlX3NpemU7CisJaW50IGN1cl9tbXVfNGtfbnVtYmVyLCBtYXhfZnJhbWVfbnVtOworCisJcGljdHVyZV9zaXplID0gY29tcHV0ZV9sb3NsZXNzX2NvbXBfYm9keV9zaXplKHcsIGgsIHNhdmVfbW9kZSk7CisJY3VyX21tdV80a19udW1iZXIgPSAoKHBpY3R1cmVfc2l6ZSArIChQQUdFX1NJWkUgLSAxKSkgPj4gUEFHRV9TSElGVCk7CisKKwltYXhfZnJhbWVfbnVtID0gKHZ2cDlfZnJhbWVfbW11X21hcF9zaXplKHBiaSkgPj4gMik7CisKKwlpZiAoY3VyX21tdV80a19udW1iZXIgPiBtYXhfZnJhbWVfbnVtKSB7CisJCXByX2Vycigib3ZlciBtYXggISEgY3VyX21tdV80a19udW1iZXIgMHgleCB3aWR0aCAlZCBoZWlnaHQgJWRcbiIsCisJCQljdXJfbW11XzRrX251bWJlciwgdywgaCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gY3VyX21tdV80a19udW1iZXI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZXJuYWxfY29tcF9idWYqIHY0bGZiX3RvX2ljb21wX2J1ZigKKwkJc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLAorCQlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIpCit7CisJc3RydWN0IGFtbF92aWRlb19kZWNfYnVmICphbWxfZmIgPSBOVUxMOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqIHY0bDJfY3R4ID0gcGJpLT52NGwyX2N0eDsKKworCWFtbF9mYiA9IGNvbnRhaW5lcl9vZihmYiwgc3RydWN0IGFtbF92aWRlb19kZWNfYnVmLCBmcmFtZV9idWZmZXIpOworCXJldHVybiAmdjRsMl9jdHgtPmNvbXBfYnVmc1thbWxfZmItPmludGVybmFsX2luZGV4XTsKK30KKworc3RhdGljIHN0cnVjdCBpbnRlcm5hbF9jb21wX2J1ZiogaW5kZXhfdG9faWNvbXBfYnVmKAorCQlzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgYW1sX3ZpZGVvX2RlY19idWYgKmFtbF9mYiA9IE5VTEw7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICogdjRsMl9jdHggPSBwYmktPnY0bDJfY3R4OworCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9IE5VTEw7CisKKwlmYiA9IChzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqKQorCQlwYmktPm1fQlVGW2luZGV4XS52NGxfcmVmX2J1Zl9hZGRyOworCWFtbF9mYiA9IGNvbnRhaW5lcl9vZihmYiwgc3RydWN0IGFtbF92aWRlb19kZWNfYnVmLCBmcmFtZV9idWZmZXIpOworCXJldHVybiAmdjRsMl9jdHgtPmNvbXBfYnVmc1thbWxfZmItPmludGVybmFsX2luZGV4XTsKK30KKworaW50IHZwOV9hbGxvY19tbXUoCisJc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLAorCWludCBjdXJfYnVmX2lkeCwKKwlpbnQgcGljX3dpZHRoLAorCWludCBwaWNfaGVpZ2h0LAorCXVuc2lnbmVkIHNob3J0IGJpdF9kZXB0aCwKKwl1bnNpZ25lZCBpbnQgKm1tdV9pbmRleF9hZHIpCit7CisJaW50IHJldDsKKwlpbnQgYml0X2RlcHRoXzEwID0gKGJpdF9kZXB0aCA9PSBWUFhfQklUU18xMCk7CisJaW50IGN1cl9tbXVfNGtfbnVtYmVyOworCisJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShwYmkpID09IDB4MTApCisJCXJldHVybiAwOworCisJaWYgKGJpdF9kZXB0aCA+PSBWUFhfQklUU18xMikgeworCQlwYmktPmZhdGFsX2Vycm9yID0gREVDT0RFUl9GQVRBTF9FUlJPUl9TSVpFX09WRVJGTE9XOworCQlwcl9lcnIoImZhdGFsX2Vycm9yLCB1biBzdXBwb3J0IGJpdCBkZXB0aCAxMiFcblxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwljdXJfbW11XzRrX251bWJlciA9IHZwOV9tbXVfcGFnZV9udW0ocGJpLAorCQkJCXBpY193aWR0aCwKKwkJCQlwaWNfaGVpZ2h0LAorCQkJCWJpdF9kZXB0aF8xMCk7CisJaWYgKGN1cl9tbXVfNGtfbnVtYmVyIDwgMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKHBiaS0+aXNfdXNlZF92NGwpIHsKKwkJc3RydWN0IGludGVybmFsX2NvbXBfYnVmICppYnVmID0KKwkJCWluZGV4X3RvX2ljb21wX2J1ZihwYmksIGN1cl9idWZfaWR4KTsKKworCQlyZXQgPSBkZWNvZGVyX21tdV9ib3hfYWxsb2NfaWR4KAorCQkJCWlidWYtPm1tdV9ib3gsCisJCQkJaWJ1Zi0+aW5kZXgsCisJCQkJaWJ1Zi0+ZnJhbWVfYnVmZmVyX3NpemUsCisJCQkJbW11X2luZGV4X2Fkcik7CisJfSBlbHNlIHsKKwkJQVRSQUNFX0NPVU5URVIocGJpLT50cmFjZS5kZWNvZGVfaGVhZGVyX21lbW9yeV90aW1lX25hbWUsIFRSQUNFX0hFQURFUl9NRU1PUllfU1RBUlQpOworCQlyZXQgPSBkZWNvZGVyX21tdV9ib3hfYWxsb2NfaWR4KAorCQkJCXBiaS0+bW11X2JveCwKKwkJCQljdXJfYnVmX2lkeCwKKwkJCQljdXJfbW11XzRrX251bWJlciwKKwkJCQltbXVfaW5kZXhfYWRyKTsKKwkJQVRSQUNFX0NPVU5URVIocGJpLT50cmFjZS5kZWNvZGVfaGVhZGVyX21lbW9yeV90aW1lX25hbWUsIFRSQUNFX0hFQURFUl9NRU1PUllfRU5EKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgVlA5XzEwQl9NTVVfRFcKK2ludCB2cDlfYWxsb2NfbW11X2R3KAorCXN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwKKwlpbnQgY3VyX2J1Zl9pZHgsCisJaW50IHBpY193aWR0aCwKKwlpbnQgcGljX2hlaWdodCwKKwl1bnNpZ25lZCBzaG9ydCBiaXRfZGVwdGgsCisJdW5zaWduZWQgaW50ICptbXVfaW5kZXhfYWRyKQoreworCWludCByZXQ7CisJaW50IGJpdF9kZXB0aF8xMCA9IChiaXRfZGVwdGggPT0gVlBYX0JJVFNfMTApOworCWludCBjdXJfbW11XzRrX251bWJlcjsKKworCWlmIChwYmktPmlzX3VzZWRfdjRsKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKHBiaSkgPT0gMHgxMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoYml0X2RlcHRoID49IFZQWF9CSVRTXzEyKSB7CisJCXBiaS0+ZmF0YWxfZXJyb3IgPSBERUNPREVSX0ZBVEFMX0VSUk9SX1NJWkVfT1ZFUkZMT1c7CisJCXByX2VycigiZmF0YWxfZXJyb3IsIHVuIHN1cHBvcnQgYml0IGRlcHRoIDEyIVxuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWN1cl9tbXVfNGtfbnVtYmVyID0gdnA5X21tdV9wYWdlX251bShwYmksCisJCQkJcGljX3dpZHRoLAorCQkJCXBpY19oZWlnaHQsCisJCQkJYml0X2RlcHRoXzEwKTsKKwlpZiAoY3VyX21tdV80a19udW1iZXIgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlyZXQgPSBkZWNvZGVyX21tdV9ib3hfYWxsb2NfaWR4KAorCQkJcGJpLT5tbXVfYm94X2R3LAorCQkJY3VyX2J1Zl9pZHgsCisJCQljdXJfbW11XzRrX251bWJlciwKKwkJCW1tdV9pbmRleF9hZHIpOworCisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmCisKKyNpZm5kZWYgTVZfVVNFX0ZJWEVEX0JVRgorc3RhdGljIHZvaWQgZGVhbGxvY19tdl9idWZzKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTVZfQlVGRkVSX05VTTsgaSsrKSB7CisJCWlmIChwYmktPm1fbXZfQlVGW2ldLnN0YXJ0X2FkcikgeworCQkJaWYgKGRlYnVnKQorCQkJCXByX2luZm8oCisJCQkJImRlYWxsb2MgbXYgYnVmKCVkKSBhZHIgJWxkIHNpemUgMHgleCB1c2VkX2ZsYWcgJWRcbiIsCisJCQkJaSwgcGJpLT5tX212X0JVRltpXS5zdGFydF9hZHIsCisJCQkJcGJpLT5tX212X0JVRltpXS5zaXplLAorCQkJCXBiaS0+bV9tdl9CVUZbaV0udXNlZF9mbGFnKTsKKwkJCWRlY29kZXJfYm1tdV9ib3hfZnJlZV9pZHgoCisJCQkJcGJpLT5ibW11X2JveCwKKwkJCQlNVl9CVUZGRVJfSURYKGkpKTsKKwkJCXBiaS0+bV9tdl9CVUZbaV0uc3RhcnRfYWRyID0gMDsKKwkJCXBiaS0+bV9tdl9CVUZbaV0uc2l6ZSA9IDA7CisJCQlwYmktPm1fbXZfQlVGW2ldLnVzZWRfZmxhZyA9IDA7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgYWxsb2NfbXZfYnVmKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwKKwlpbnQgaSwgaW50IHNpemUpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAocGJpLT5tX212X0JVRltpXS5zdGFydF9hZHIgJiYKKwkJc2l6ZSA+IHBiaS0+bV9tdl9CVUZbaV0uc2l6ZSkgeworCQlkZWFsbG9jX212X2J1ZnMocGJpKTsKKwl9IGVsc2UgaWYgKHBiaS0+bV9tdl9CVUZbaV0uc3RhcnRfYWRyKQorCQlyZXR1cm4gMDsKKworCWlmIChkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkKKwkJKHBiaS0+Ym1tdV9ib3gsCisJCU1WX0JVRkZFUl9JRFgoaSksIHNpemUsCisJCURSSVZFUl9OQU1FLAorCQkmcGJpLT5tX212X0JVRltpXS5zdGFydF9hZHIpIDwgMCkgeworCQlwYmktPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciA9IDA7CisJCXJldCA9IC0xOworCX0gZWxzZSB7CisJCXBiaS0+bV9tdl9CVUZbaV0uc2l6ZSA9IHNpemU7CisJCXBiaS0+bV9tdl9CVUZbaV0udXNlZF9mbGFnID0gMDsKKwkJcmV0ID0gMDsKKwkJaWYgKGRlYnVnKSB7CisJCQlwcl9pbmZvKAorCQkJIk1WIEJ1ZmZlciAlZDogc3RhcnRfYWRyICVweCBzaXplICV4XG4iLAorCQkJaSwKKwkJCSh2b2lkICopcGJpLT5tX212X0JVRltpXS5zdGFydF9hZHIsCisJCQlwYmktPm1fbXZfQlVGW2ldLnNpemUpOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY2FsX212X2J1Zl9zaXplKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwgaW50IHBpY193aWR0aCwgaW50IHBpY19oZWlnaHQpCit7CisJaW50IGxjdV9zaXplID0gNjQ7IC8qZml4ZWQgNjQqLworCWludCBwaWNfd2lkdGhfNjQgPSAocGljX3dpZHRoICsgNjMpICYgKH4weDNmKTsKKwlpbnQgcGljX2hlaWdodF8zMiA9IChwaWNfaGVpZ2h0ICsgMzEpICYgKH4weDFmKTsKKwlpbnQgcGljX3dpZHRoX2xjdSAgPSAocGljX3dpZHRoXzY0ICUgbGN1X3NpemUpID8KKwkJCQlwaWNfd2lkdGhfNjQgLyBsY3Vfc2l6ZSAgKyAxCisJCQkJOiBwaWNfd2lkdGhfNjQgLyBsY3Vfc2l6ZTsKKwlpbnQgcGljX2hlaWdodF9sY3UgPSAocGljX2hlaWdodF8zMiAlIGxjdV9zaXplKSA/CisJCQkJcGljX2hlaWdodF8zMiAvIGxjdV9zaXplICsgMQorCQkJCTogcGljX2hlaWdodF8zMiAvIGxjdV9zaXplOworCWludCBsY3VfdG90YWwgICAgICAgPSBwaWNfd2lkdGhfbGN1ICogcGljX2hlaWdodF9sY3U7CisJaW50IHNpemVfYSA9IGxjdV90b3RhbCAqIDM2ICogMTY7CisJaW50IHNpemVfYiA9IHBpY193aWR0aF9sY3UgKiAxNiAqCisJCSgocGljX2hlaWdodF9sY3UgPj4gMykgKyAocGljX2hlaWdodF9sY3UgJiAweDcpKTsKKwlpbnQgc2l6ZSA9IChzaXplX2EgKyBzaXplX2IgKyAweGZmZmYpICYKKwkJKH4weGZmZmYpOworCisJcmV0dXJuIHNpemU7Cit9CisKKworc3RhdGljIGludCBpbml0X212X2J1Zl9saXN0KHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlpbnQgaTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgY291bnQgPSBNVl9CVUZGRVJfTlVNOworCWludCBwaWNfd2lkdGggPSBwYmktPmluaXRfcGljX3c7CisJaW50IHBpY19oZWlnaHQgPSBwYmktPmluaXRfcGljX2g7CisJaW50IHNpemUgPSBjYWxfbXZfYnVmX3NpemUocGJpLCBwaWNfd2lkdGgsIHBpY19oZWlnaHQpOworCisJaWYgKG12X2J1Zl9keW5hbWljX2FsbG9jKQorCQlyZXR1cm4gMDsKKworCWlmIChtdl9idWZfbWFyZ2luID4gMCkKKwkJY291bnQgPSBSRUZfRlJBTUVTICsgbXZfYnVmX21hcmdpbjsKKworCWlmIChwYmktPmluaXRfcGljX3cgPiAyMDQ4ICYmIHBiaS0+aW5pdF9waWNfaCA+IDEwODgpCisJCWNvdW50ID0gUkVGX0ZSQU1FU180SyArIG12X2J1Zl9tYXJnaW47CisKKwlpZiAoZGVidWcpIHsKKwkJcHJfaW5mbygiJXMgdzolZCwgaDolZCwgY291bnQ6ICVkXG4iLAorCQlfX2Z1bmNfXywgcGJpLT5pbml0X3BpY193LCBwYmktPmluaXRfcGljX2gsIGNvdW50KTsKKwl9CisKKwlmb3IgKGkgPSAwOworCQlpIDwgY291bnQgJiYgaSA8IE1WX0JVRkZFUl9OVU07IGkrKykgeworCQlpZiAoYWxsb2NfbXZfYnVmKHBiaSwgaSwgc2l6ZSkgPCAwKSB7CisJCQlyZXQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X212X2J1ZihzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksCisJCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpwaWNfY29uZmlnKQoreworCWludCBpOworCWludCByZXQgPSAtMTsKKwlpZiAobXZfYnVmX2R5bmFtaWNfYWxsb2MpIHsKKwkJdW5pb24gcGFyYW1fdSAqcGFyYW1zID0gJnBiaS0+dnA5X3BhcmFtOworCQlpbnQgc2l6ZSA9IGNhbF9tdl9idWZfc2l6ZShwYmksCisJCQlwYXJhbXMtPnAud2lkdGgsIHBhcmFtcy0+cC5oZWlnaHQpOworCQlmb3IgKGkgPSAwOyBpIDwgTVZfQlVGRkVSX05VTTsgaSsrKSB7CisJCQlpZiAocGJpLT5tX212X0JVRltpXS5zdGFydF9hZHIgPT0gMCkgeworCQkJCXJldCA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGkgPT0gTVZfQlVGRkVSX05VTSkgeworCQkJcHJfaW5mbygKKwkJCSIlczogRXJyb3IsIG12IGJ1ZiBNVl9CVUZGRVJfTlVNIGlzIG5vdCBlbm91Z2hcbiIsCisJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJaWYgKGFsbG9jX212X2J1ZihwYmksIHJldCwgc2l6ZSkgPj0gMCkgeworCQkJcGljX2NvbmZpZy0+bXZfYnVmX2luZGV4ID0gcmV0OworCQkJcGljX2NvbmZpZy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkciA9CisJCQkJKHBiaS0+bV9tdl9CVUZbcmV0XS5zdGFydF9hZHIgKyAweGZmZmYpICYKKwkJCQkofjB4ZmZmZik7CisJCQlwaWNfY29uZmlnLT5tdl9zaXplID0gc2l6ZTsKKworCQkJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0JVRk1HUl9NT1JFKQorCQkJCXByX2luZm8oCisJCQkJIiVzIGFsbG9jID0+ICVkICglbGQpIHNpemUgMHgleFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0LAorCQkJCXBpY19jb25maWctPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIsCisJCQkJcGljX2NvbmZpZy0+bXZfc2l6ZSk7CisJCX0gZWxzZSB7CisJCQlwcl9pbmZvKAorCQkJIiVzOiBFcnJvciwgbXYgYnVmIGFsbG9jIGZhaWxcbiIsCisJCQlfX2Z1bmNfXyk7CisJCX0KKwkJcmV0dXJuIHJldDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTVZfQlVGRkVSX05VTTsgaSsrKSB7CisJCWlmIChwYmktPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciAmJgorCQkJcGJpLT5tX212X0JVRltpXS51c2VkX2ZsYWcgPT0gMCkgeworCQkJcGJpLT5tX212X0JVRltpXS51c2VkX2ZsYWcgPSAxOworCQkJcmV0ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHJldCA+PSAwKSB7CisJCXBpY19jb25maWctPm12X2J1Zl9pbmRleCA9IHJldDsKKwkJcGljX2NvbmZpZy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkciA9CisJCQkocGJpLT5tX212X0JVRltyZXRdLnN0YXJ0X2FkciArIDB4ZmZmZikgJgorCQkJKH4weGZmZmYpOworCQlwaWNfY29uZmlnLT5tdl9zaXplID0gcGJpLT5tX212X0JVRltyZXRdLnNpemU7CisJCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19CVUZNR1JfTU9SRSkKKwkJCXByX2luZm8oCisJCQkiJXMgPT4gJWQgKCVseCkgc2l6ZSAweCV4XG4iLAorCQkJX19mdW5jX18sIHJldCwKKwkJCXBpY19jb25maWctPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIsCisJCQlwaWNfY29uZmlnLT5tdl9zaXplKTsKKwl9IGVsc2UgeworCQlwcl9pbmZvKAorCQkiJXM6IEVycm9yLCBtdiBidWYgaXMgbm90IGVub3VnaFxuIiwKKwkJX19mdW5jX18pOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBwdXRfbXZfYnVmKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwKKwkJCQlpbnQgKm12X2J1Zl9pbmRleCkKK3sKKwlpbnQgaSA9ICptdl9idWZfaW5kZXg7CisJaWYgKGkgPj0gTVZfQlVGRkVSX05VTSkgeworCQlpZiAoZGVidWcgJiBWUDlfREVCVUdfQlVGTUdSX01PUkUpCisJCQlwcl9pbmZvKAorCQkJIiVzOiBpbmRleCAlZCBiZXlvbmQgcmFuZ2VcbiIsCisJCQlfX2Z1bmNfXywgaSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAobXZfYnVmX2R5bmFtaWNfYWxsb2MpIHsKKwkJaWYgKHBiaS0+bV9tdl9CVUZbaV0uc3RhcnRfYWRyKSB7CisJCQlpZiAoZGVidWcpCisJCQkJcHJfaW5mbygKKwkJCQkiZGVhbGxvYyBtdiBidWYoJWQpIGFkciAlbGQgc2l6ZSAweCV4IHVzZWRfZmxhZyAlZFxuIiwKKwkJCQlpLCBwYmktPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciwKKwkJCQlwYmktPm1fbXZfQlVGW2ldLnNpemUsCisJCQkJcGJpLT5tX212X0JVRltpXS51c2VkX2ZsYWcpOworCQkJZGVjb2Rlcl9ibW11X2JveF9mcmVlX2lkeCgKKwkJCQlwYmktPmJtbXVfYm94LAorCQkJCU1WX0JVRkZFUl9JRFgoaSkpOworCQkJcGJpLT5tX212X0JVRltpXS5zdGFydF9hZHIgPSAwOworCQkJcGJpLT5tX212X0JVRltpXS5zaXplID0gMDsKKwkJCXBiaS0+bV9tdl9CVUZbaV0udXNlZF9mbGFnID0gMDsKKwkJfQorCQkqbXZfYnVmX2luZGV4ID0gLTE7CisJCXJldHVybjsKKwl9CisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0JVRk1HUl9NT1JFKQorCQlwcl9pbmZvKAorCQkiJXMoJWQpOiB1c2VkX2ZsYWcoJWQpXG4iLAorCQlfX2Z1bmNfXywgaSwKKwkJcGJpLT5tX212X0JVRltpXS51c2VkX2ZsYWcpOworCisJKm12X2J1Zl9pbmRleCA9IC0xOworCWlmIChwYmktPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciAmJgorCQlwYmktPm1fbXZfQlVGW2ldLnVzZWRfZmxhZykKKwkJcGJpLT5tX212X0JVRltpXS51c2VkX2ZsYWcgPSAwOworfQorCitzdGF0aWMgdm9pZAlwdXRfdW5fdXNlZF9tdl9idWZzKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjb25zdCBjbSA9ICZwYmktPmNvbW1vbjsKKwlzdHJ1Y3QgUmVmQ250QnVmZmVyX3MgKmNvbnN0IGZyYW1lX2J1ZnMgPSBjbS0+YnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnM7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHBiaS0+dXNlZF9idWZfbnVtOyArK2kpIHsKKyNpZiAwCisJCWlmICgoZnJhbWVfYnVmc1tpXS5yZWZfY291bnQgPT0gMCkgJiYKKwkJCShmcmFtZV9idWZzW2ldLmJ1Zi5pbmRleCAhPSAtMSkgJiYKKwkJCShmcmFtZV9idWZzW2ldLmJ1Zi5tdl9idWZfaW5kZXggPj0gMCkKKwkJCSkKKyNlbHNlCisJCWlmICgoJmZyYW1lX2J1ZnNbaV0gIT0gY20tPnByZXZfZnJhbWUpICYmCisJCQkoZnJhbWVfYnVmc1tpXS5idWYuaW5kZXggIT0gLTEpICYmCisJCQkoZnJhbWVfYnVmc1tpXS5idWYubXZfYnVmX2luZGV4ID49IDApCisJCQkpCisjZW5kaWYKKworCQkJcHV0X212X2J1ZihwYmksICZmcmFtZV9idWZzW2ldLmJ1Zi5tdl9idWZfaW5kZXgpOworCX0KK30KKworI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKK3N0YXRpYyBib29sIG12X2J1Zl9hdmFpbGFibGUoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCWludCBpOworCWJvb2wgcmV0ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTVZfQlVGRkVSX05VTTsgaSsrKSB7CisJCWlmIChwYmktPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciAmJgorCQkJcGJpLT5tX212X0JVRltpXS51c2VkX2ZsYWcgPT0gMCkgeworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgU1VQUE9SVF9GQl9ERUNPRElORworc3RhdGljIHZvaWQgaW5pdF9zdGFnZV9idWYoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCXVpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgU1RBR0VfTUFYX0JVRkZFUlMKKwkJJiYgaSA8IHN0YWdlX2J1Zl9udW07IGkrKykgeworCQlwYmktPnN0YWdlX2J1ZnNbaV0gPQorCQkJdm1hbGxvYyhzaXplb2Yoc3RydWN0IHN0YWdlX2J1Zl9zKSk7CisJCWlmIChwYmktPnN0YWdlX2J1ZnNbaV0gPT0gTlVMTCkgeworCQkJdnA5X3ByaW50KHBiaSwKKwkJCQkwLCAiJXMgdm1hbGxvYyBmYWlsXG4iLCBfX2Z1bmNfXyk7CisJCQlicmVhazsKKwkJfQorCQlwYmktPnN0YWdlX2J1ZnNbaV0tPmluZGV4ID0gaTsKKwl9CisJcGJpLT51c2VkX3N0YWdlX2J1Zl9udW0gPSBpOworCXBiaS0+czFfcG9zID0gMDsKKwlwYmktPnMyX3BvcyA9IDA7CisJcGJpLT5zMV9idWYgPSBOVUxMOworCXBiaS0+czJfYnVmID0gTlVMTDsKKwlwYmktPnMxX212X2J1Zl9pbmRleCA9IEZSQU1FX0JVRkZFUlM7CisJcGJpLT5zMV9tdl9idWZfaW5kZXhfcHJlID0gRlJBTUVfQlVGRkVSUzsKKwlwYmktPnMxX212X2J1Zl9pbmRleF9wcmVfcHJlID0gRlJBTUVfQlVGRkVSUzsKKworCWlmIChwYmktPnVzZWRfc3RhZ2VfYnVmX251bSA+IDApCisJCXZwOV9wcmludChwYmksCisJCQkwLCAiJXMgMiBzdGFnZSBkZWNvZGluZyBidWYgJWRcbiIsCisJCQlfX2Z1bmNfXywKKwkJCXBiaS0+dXNlZF9zdGFnZV9idWZfbnVtKTsKK30KKworc3RhdGljIHZvaWQgdW5pbml0X3N0YWdlX2J1ZihzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHBiaS0+dXNlZF9zdGFnZV9idWZfbnVtOyBpKyspIHsKKwkJaWYgKHBiaS0+c3RhZ2VfYnVmc1tpXSkKKwkJCXZmcmVlKHBiaS0+c3RhZ2VfYnVmc1tpXSk7CisJCXBiaS0+c3RhZ2VfYnVmc1tpXSA9IE5VTEw7CisJfQorCXBiaS0+dXNlZF9zdGFnZV9idWZfbnVtID0gMDsKKwlwYmktPnMxX3BvcyA9IDA7CisJcGJpLT5zMl9wb3MgPSAwOworCXBiaS0+czFfYnVmID0gTlVMTDsKKwlwYmktPnMyX2J1ZiA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3MxX2J1ZigKKwlzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJc3RydWN0IHN0YWdlX2J1Zl9zICpidWYgPSBOVUxMOworCWludCByZXQgPSAtMTsKKwlpbnQgYnVmX3BhZ2VfbnVtID0gTUFYX1NUQUdFX1BBR0VfTlVNOworCWludCBuZXh0X3MxX3BvcyA9IHBiaS0+czFfcG9zICsgMTsKKworCWlmIChuZXh0X3MxX3BvcyA+PSBwYmktPnVzZWRfc3RhZ2VfYnVmX251bSkKKwkJbmV4dF9zMV9wb3MgPSAwOworCWlmIChuZXh0X3MxX3BvcyA9PSBwYmktPnMyX3BvcykgeworCQlwYmktPnMxX2J1ZiA9IE5VTEw7CisJCXJldHVybiByZXQ7CisJfQorCisJYnVmID0gcGJpLT5zdGFnZV9idWZzW3BiaS0+czFfcG9zXTsKKwlyZXQgPSBkZWNvZGVyX21tdV9ib3hfYWxsb2NfaWR4KAorCQlwYmktPm1tdV9ib3gsCisJCWJ1Zi0+aW5kZXgsCisJCWJ1Zl9wYWdlX251bSwKKwkJcGJpLT5zdGFnZV9tbXVfbWFwX2FkZHIpOworCWlmIChyZXQgPCAwKSB7CisJCXZwOV9wcmludChwYmksIDAsCisJCQkiJXMgZGVjb2Rlcl9tbXVfYm94X2FsbG9jIGZhaWwgZm9yIGluZGV4ICVkIChzMV9wb3MgJWQgczJfcG9zICVkKVxuIiwKKwkJCV9fZnVuY19fLCBidWYtPmluZGV4LAorCQkJcGJpLT5zMV9wb3MsIHBiaS0+czJfcG9zKTsKKwkJYnVmID0gTlVMTDsKKwl9IGVsc2UgeworCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfMl9TVEFHRSwKKwkJCSIlcyBkZWNvZGVyX21tdV9ib3hfYWxsb2MgJWQgcGFnZSBmb3IgaW5kZXggJWQgKHMxX3BvcyAlZCBzMl9wb3MgJWQpXG4iLAorCQkJX19mdW5jX18sIGJ1Zl9wYWdlX251bSwgYnVmLT5pbmRleCwKKwkJCXBiaS0+czFfcG9zLCBwYmktPnMyX3Bvcyk7CisJfQorCXBiaS0+czFfYnVmID0gYnVmOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGluY19zMV9wb3Moc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCXN0cnVjdCBzdGFnZV9idWZfcyAqYnVmID0KKwkJcGJpLT5zdGFnZV9idWZzW3BiaS0+czFfcG9zXTsKKworCWludCB1c2VkX3BhZ2VfbnVtID0KKyNpZmRlZiBGQl9ERUNPRElOR19URVNUX1NDSEVEVUxFCisJCU1BWF9TVEFHRV9QQUdFX05VTS8yOworI2Vsc2UKKwkJKFJFQURfVlJFRyhIRVZDX0FTU0lTVF9IRURfRkJfV19DVEwpID4+IDE2KTsKKyNlbmRpZgorCWRlY29kZXJfbW11X2JveF9mcmVlX2lkeF90YWlsKHBiaS0+bW11X2JveCwKKwkJRlJBTUVfQlVGRkVSUyArIGJ1Zi0+aW5kZXgsIHVzZWRfcGFnZV9udW0pOworCisJcGJpLT5zMV9wb3MrKzsKKwlpZiAocGJpLT5zMV9wb3MgPj0gcGJpLT51c2VkX3N0YWdlX2J1Zl9udW0pCisJCXBiaS0+czFfcG9zID0gMDsKKworCXZwOV9wcmludChwYmksIFZQOV9ERUJVR18yX1NUQUdFLAorCQkiJXMgKHVzZWRfcGFnZV9udW0gJWQpIGZvciBpbmRleCAlZCAoczFfcG9zICVkIHMyX3BvcyAlZClcbiIsCisJCV9fZnVuY19fLCB1c2VkX3BhZ2VfbnVtLCBidWYtPmluZGV4LAorCQlwYmktPnMxX3BvcywgcGJpLT5zMl9wb3MpOworfQorCisjZGVmaW5lIHMyX2J1Zl9hdmFpbGFibGUocGJpKSAocGJpLT5zMV9wb3MgIT0gcGJpLT5zMl9wb3MpCisKK3N0YXRpYyBpbnQgZ2V0X3MyX2J1ZigKKwlzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJaW50IHJldCA9IC0xOworCXN0cnVjdCBzdGFnZV9idWZfcyAqYnVmID0gTlVMTDsKKwlpZiAoczJfYnVmX2F2YWlsYWJsZShwYmkpKSB7CisJCWJ1ZiA9IHBiaS0+c3RhZ2VfYnVmc1twYmktPnMyX3Bvc107CisJCXZwOV9wcmludChwYmksIFZQOV9ERUJVR18yX1NUQUdFLAorCQkJIiVzIGZvciBpbmRleCAlZCAoczFfcG9zICVkIHMyX3BvcyAlZClcbiIsCisJCQlfX2Z1bmNfXywgYnVmLT5pbmRleCwKKwkJCXBiaS0+czFfcG9zLCBwYmktPnMyX3Bvcyk7CisJCXBiaS0+czJfYnVmID0gYnVmOworCQlyZXQgPSAwOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpbmNfczJfcG9zKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlzdHJ1Y3Qgc3RhZ2VfYnVmX3MgKmJ1ZiA9CisJCXBiaS0+c3RhZ2VfYnVmc1twYmktPnMyX3Bvc107CisJZGVjb2Rlcl9tbXVfYm94X2ZyZWVfaWR4KHBiaS0+bW11X2JveCwKKwkJRlJBTUVfQlVGRkVSUyArIGJ1Zi0+aW5kZXgpOworCXBiaS0+czJfcG9zKys7CisJaWYgKHBiaS0+czJfcG9zID49IHBiaS0+dXNlZF9zdGFnZV9idWZfbnVtKQorCQlwYmktPnMyX3BvcyA9IDA7CisJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHXzJfU1RBR0UsCisJCSIlcyBmb3IgaW5kZXggJWQgKHMxX3BvcyAlZCBzMl9wb3MgJWQpXG4iLAorCQlfX2Z1bmNfXywgYnVmLT5pbmRleCwKKwkJcGJpLT5zMV9wb3MsIHBiaS0+czJfcG9zKTsKK30KKworc3RhdGljIGludCBnZXRfZnJlZV9zdGFnZV9idWZfbnVtKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlpbnQgbnVtOworCWlmIChwYmktPnMxX3BvcyA+PSBwYmktPnMyX3BvcykKKwkJbnVtID0gcGJpLT51c2VkX3N0YWdlX2J1Zl9udW0gLQorCQkJKHBiaS0+czFfcG9zIC0gcGJpLT5zMl9wb3MpIC0gMTsKKwllbHNlCisJCW51bSA9IChwYmktPnMyX3BvcyAtIHBiaS0+czFfcG9zKSAtIDE7CisJcmV0dXJuIG51bTsKK30KKworI2lmbmRlZiBGQl9ERUNPRElOR19URVNUX1NDSEVEVUxFCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGZiX2NvcmVfc3Bpbl9sb2NrKTsKKworc3RhdGljIHU4IGlzX3MyX2RlY29kaW5nX2ZpbmlzaGVkKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwkvKiB0byBkbzogVkxTSSByZXZpZXcKKwkJY29tcGxldGlvbiBvZiBsYXN0IExDVSBkZWNvZGluZyBpbiBCQUNLCisJICovCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X3MxX2RlY29kaW5nKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwkvKiB0byBkbzogVkxTSSByZXZpZXcKKwkgYWZ0ZXIgcGFyc2VyLCBob3cgdG8gc3RhcnQgTENVIGRlY29kaW5nIGluIEJBQ0sKKwkqLworfQorCitzdGF0aWMgdm9pZCBmYl9yZXNldF9jb3JlKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHUzMiBtYXNrKQoreworCS8qIHRvIGRvOiBWTFNJIHJldmlldworCQkxLiBob3cgdG8gZGlzY29ubmVjdCBETUMgZm9yIEZST05UIGFuZCBCQUNLCisJCTIuIHJlc2V0IGJpdCAxMywgMjQsIEZST05UIG9yIEJBQ0sgPz8KKwkqLworCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgcmVzZXRfYml0cyA9IDA7CisJaWYgKG1hc2sgJiBIV19NQVNLX0ZST05UKQorCQlXUklURV9WUkVHKEhFVkNfU1RSRUFNX0NPTlRST0wsIDApOworCXNwaW5fbG9ja19pcnFzYXZlKCZmYl9jb3JlX3NwaW5fbG9jaywgZmxhZ3MpOworCWNvZGVjX2RtY2J1c193cml0ZShETUNfUkVRX0NUUkwsCisJCWNvZGVjX2RtY2J1c19yZWFkKERNQ19SRVFfQ1RSTCkgJiAofigxIDw8IDQpKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmJfY29yZV9zcGluX2xvY2ssIGZsYWdzKTsKKworCXdoaWxlICghKGNvZGVjX2RtY2J1c19yZWFkKERNQ19DSEFOX1NUUykKKwkJJiAoMSA8PCA0KSkpCisJCTsKKworCWlmICgobWFzayAmIEhXX01BU0tfRlJPTlQpICYmCisJCWlucHV0X2ZyYW1lX2Jhc2VkKHZkZWMpKQorCQlXUklURV9WUkVHKEhFVkNfU1RSRUFNX0NPTlRST0wsIDApOworCisJCS8qCisJICogMjogYXNzaXN0CisJICogMzogcGFyc2VyCisJICogNDogcGFyc2VyX3N0YXRlCisJICogODogZGJsaworCSAqIDExOm1jcHUKKwkgKiAxMjpjY3B1CisJICogMTM6ZGRyCisJICogMTQ6aXFpdAorCSAqIDE1OmlwcAorCSAqIDE3OnFkY3QKKwkgKiAxODptcHJlZAorCSAqIDE5OnNhbworCSAqIDI0OmhldmNfYWZpZm8KKwkgKi8KKwlpZiAobWFzayAmIEhXX01BU0tfRlJPTlQpIHsKKwkJcmVzZXRfYml0cyA9CisJCSgxPDwzKXwoMTw8NCl8KDE8PDExKXwKKwkJKDE8PDEyKXwoMTw8MTgpOworCX0KKwlpZiAobWFzayAmIEhXX01BU0tfQkFDSykgeworCQlyZXNldF9iaXRzID0KKwkJKDE8PDgpfCgxPDwxMyl8KDE8PDE0KXwoMTw8MTUpfAorCQkoMTw8MTcpfCgxPDwxOSl8KDE8PDI0KTsKKwl9CisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQzLCByZXNldF9iaXRzKTsKKyNpZiAwCisJCSgxPDwzKXwoMTw8NCl8KDE8PDgpfCgxPDwxMSl8CisJCSgxPDwxMil8KDE8PDEzKXwoMTw8MTQpfCgxPDwxNSl8CisJCSgxPDwxNyl8KDE8PDE4KXwoMTw8MTkpfCgxPDwyNCk7CisjZW5kaWYKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDMsIDApOworCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmJfY29yZV9zcGluX2xvY2ssIGZsYWdzKTsKKwljb2RlY19kbWNidXNfd3JpdGUoRE1DX1JFUV9DVFJMLAorCQljb2RlY19kbWNidXNfcmVhZChETUNfUkVRX0NUUkwpIHwgKDEgPDwgNCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZiX2NvcmVfc3Bpbl9sb2NrLCBmbGFncyk7CisKK30KKyNlbmRpZgorCisjZW5kaWYKKworc3RhdGljIHZvaWQgaW5pdF9waWNfbGlzdF9odyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpOworCitzdGF0aWMgaW50IGdldF9mcmVlX2ZiKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjb25zdCBjbSA9ICZwYmktPmNvbW1vbjsKKwlzdHJ1Y3QgUmVmQ250QnVmZmVyX3MgKmNvbnN0IGZyYW1lX2J1ZnMgPSBjbS0+YnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnM7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2tfYnVmZmVyX3Bvb2woY20tPmJ1ZmZlcl9wb29sLCBmbGFncyk7CisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0JVRk1HUl9NT1JFKSB7CisJCWZvciAoaSA9IDA7IGkgPCBwYmktPnVzZWRfYnVmX251bTsgKytpKSB7CisJCQlwcl9pbmZvKCIlczolZCwgcmVmX2NvdW50ICVkIHZmX3JlZiAlZCBpbmRleCAlZFxyXG4iLAorCQkJX19mdW5jX18sIGksIGZyYW1lX2J1ZnNbaV0ucmVmX2NvdW50LAorCQkJZnJhbWVfYnVmc1tpXS5idWYudmZfcmVmLAorCQkJZnJhbWVfYnVmc1tpXS5idWYuaW5kZXgpOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBwYmktPnVzZWRfYnVmX251bTsgKytpKSB7CisJCWlmICgoZnJhbWVfYnVmc1tpXS5yZWZfY291bnQgPT0gMCkgJiYKKwkJCShmcmFtZV9idWZzW2ldLmJ1Zi52Zl9yZWYgPT0gMCkgJiYKKwkJCShmcmFtZV9idWZzW2ldLmJ1Zi5pbmRleCAhPSAtMSkgJiYKKwkJCShjbS0+Y3VyX2ZyYW1lICE9ICZmcmFtZV9idWZzW2ldKQorCQkJKQorCQkJYnJlYWs7CisJfQorCWlmIChpICE9IHBiaS0+dXNlZF9idWZfbnVtKSB7CisJCWZyYW1lX2J1ZnNbaV0ucmVmX2NvdW50ID0gMTsKKwkJLypwcl9pbmZvKCJbTU1VIERFQlVHIDFdIHNldCByZWZfY291bnRbJWRdIDogJWRcclxuIiwKKwkJCQkJaSwgZnJhbWVfYnVmc1tpXS5yZWZfY291bnQpOyovCisJfSBlbHNlIHsKKwkJLyogUmVzZXQgaSB0byBiZSBJTlZBTElEX0lEWCB0byBpbmRpY2F0ZQorCQkJbm8gZnJlZSBidWZmZXIgZm91bmQqLworCQlpID0gSU5WQUxJRF9JRFg7CisJfQorCisJdW5sb2NrX2J1ZmZlcl9wb29sKGNtLT5idWZmZXJfcG9vbCwgZmxhZ3MpOworCXJldHVybiBpOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfaGlkZV9mcmFtZV90aW1lc3RhbXAoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCXN0cnVjdCBSZWZDbnRCdWZmZXJfcyAqY29uc3QgZnJhbWVfYnVmcyA9CisJCXBiaS0+Y29tbW9uLmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHBiaS0+dXNlZF9idWZfbnVtOyArK2kpIHsKKwkJaWYgKCghZnJhbWVfYnVmc1tpXS5zaG93X2ZyYW1lKSAmJgorCQkJKCFmcmFtZV9idWZzW2ldLmJ1Zi52Zl9yZWYpICYmCisJCQkoZnJhbWVfYnVmc1tpXS5idWYuQlVGX2luZGV4ICE9IC0xKSkgeworCQkJZnJhbWVfYnVmc1tpXS5idWYudGltZXN0YW1wID0gcGJpLT5jaHVuay0+dGltZXN0YW1wOworCQkJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHX09VVF9QVFMsCisJCQkJIiVzLCB1cGRhdGUgJWQgaGlkZSBmcmFtZSB0czogJWxsZFxuIiwKKwkJCQlfX2Z1bmNfXywgaSwgZnJhbWVfYnVmc1tpXS5idWYudGltZXN0YW1wKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBnZXRfZnJlZV9mYl9pZHgoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCWludCBpOworCXN0cnVjdCBWUDlfQ29tbW9uX3MgKmNvbnN0IGNtID0gJnBiaS0+Y29tbW9uOworCXN0cnVjdCBSZWZDbnRCdWZmZXJfcyAqY29uc3QgZnJhbWVfYnVmcyA9IGNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmczsKKworCWZvciAoaSA9IDA7IGkgPCBwYmktPnVzZWRfYnVmX251bTsgKytpKSB7CisJCWlmICgoZnJhbWVfYnVmc1tpXS5yZWZfY291bnQgPT0gMCkgJiYKKwkJCShmcmFtZV9idWZzW2ldLmJ1Zi52Zl9yZWYgPT0gMCkpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCB2NGxfZ2V0X2ZyZWVfZmIoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCXN0cnVjdCBWUDlfQ29tbW9uX3MgKmNvbnN0IGNtID0gJnBiaS0+Y29tbW9uOworCXN0cnVjdCBSZWZDbnRCdWZmZXJfcyAqY29uc3QgZnJhbWVfYnVmcyA9IGNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmczsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKiB2NGwgPSBwYmktPnY0bDJfY3R4OworCXN0cnVjdCB2NGxfYnVmZl9wb29sICpwb29sID0gJnY0bC0+Y2FwX3Bvb2w7CisJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnBpYyA9IE5VTEw7CisJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKmZyZWVfcGljID0gTlVMTDsKKwl1bG9uZyBmbGFnczsKKwlpbnQgaWR4LCBpOworCisJbG9ja19idWZmZXJfcG9vbChjbS0+YnVmZmVyX3Bvb2wsIGZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBwb29sLT5pbjsgKytpKSB7CisJCXUzMiBzdGF0ZSA9IChwb29sLT5zZXFbaV0gPj4gMTYpOworCQl1MzIgaW5kZXggPSAocG9vbC0+c2VxW2ldICYgMHhmZmZmKTsKKworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgVjRMX0NBUF9CVUZGX0lOX0RFQzoKKwkJCXBpYyA9ICZmcmFtZV9idWZzW2ldLmJ1ZjsKKwkJCWlmICgoZnJhbWVfYnVmc1tpXS5yZWZfY291bnQgPT0gMCkgJiYKKwkJCQkocGljLT52Zl9yZWYgPT0gMCkgJiYKKwkJCQkocGljLT5pbmRleCAhPSAtMSkgJiYKKwkJCQlwaWMtPmNtYV9hbGxvY19hZGRyKSB7CisJCQkJZnJlZV9waWMgPSBwaWM7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBWNExfQ0FQX0JVRkZfSU5fTTJNOgorCQkJaWR4ID0gZ2V0X2ZyZWVfZmJfaWR4KHBiaSk7CisJCQlwaWMgPSAmZnJhbWVfYnVmc1tpZHhdLmJ1ZjsKKwkJCXBpYy0+eV9jcm9wX3dpZHRoID0gcGJpLT5mcmFtZV93aWR0aDsKKwkJCXBpYy0+eV9jcm9wX2hlaWdodCA9IHBiaS0+ZnJhbWVfaGVpZ2h0OworCQkJcGJpLT5idWZmZXJfd3JhcFtpZHhdID0gaW5kZXg7CisJCQlpZiAoIXY0bF9hbGxvY19hbmRfY29uZmlnX3BpYyhwYmksIHBpYykpIHsKKwkJCQlzZXRfY2FudmFzKHBiaSwgcGljKTsKKwkJCQlpbml0X3BpY19saXN0X2h3KHBiaSk7CisJCQkJZnJlZV9waWMgPSBwaWM7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGZyZWVfcGljKSB7CisJCQlmcmFtZV9idWZzW2ldLnJlZl9jb3VudCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChmcmVlX3BpYyAmJiBwYmktPmNodW5rKSB7CisJCWZyZWVfcGljLT50aW1lc3RhbXAgPSBwYmktPmNodW5rLT50aW1lc3RhbXA7CisJCXVwZGF0ZV9oaWRlX2ZyYW1lX3RpbWVzdGFtcChwYmkpOworCX0KKworCXVubG9ja19idWZmZXJfcG9vbChjbS0+YnVmZmVyX3Bvb2wsIGZsYWdzKTsKKworCWlmIChmcmVlX3BpYykgeworCQlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPQorCQkJKHN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICopCisJCQlwYmktPm1fQlVGW2ldLnY0bF9yZWZfYnVmX2FkZHI7CisKKwkJZmItPnN0YXR1cyA9IEZCX1NUX0RFQ09ERVI7CisJfQorCisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX09VVF9QVFMpIHsKKwkJaWYgKGZyZWVfcGljKSB7CisJCQlwcl9kZWJ1ZygiJXMsIGlkeDogJWQsIHRzOiAlbGxkXG4iLAorCQkJCV9fZnVuY19fLCBmcmVlX3BpYy0+aW5kZXgsIGZyZWVfcGljLT50aW1lc3RhbXApOworCQl9IGVsc2UgeworCQkJcHJfZGVidWcoIiVzLCB2cDkgZ2V0IGZyZWUgcGljIG51bGxcbiIsIF9fZnVuY19fKTsKKwkJfQorCX0KKworCXJldHVybiBmcmVlX3BpYyA/IGZyZWVfcGljLT5pbmRleCA6IElOVkFMSURfSURYOworfQorCitzdGF0aWMgaW50IGdldF9mcmVlX2J1Zl9jb3VudChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJc3RydWN0IFZQOV9Db21tb25fcyAqY29uc3QgY20gPSAmcGJpLT5jb21tb247CisJc3RydWN0IFJlZkNudEJ1ZmZlcl9zICpjb25zdCBmcmFtZV9idWZzID0gY20tPmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShwYmktPnY0bDJfY3R4KTsKKwlpbnQgaSwgZnJlZV9idWZfY291bnQgPSAwOworCisJaWYgKHBiaS0+aXNfdXNlZF92NGwpIHsKKwkJZm9yIChpID0gMDsgaSA8IHBiaS0+dXNlZF9idWZfbnVtOyArK2kpIHsKKwkJCWlmICgoZnJhbWVfYnVmc1tpXS5yZWZfY291bnQgPT0gMCkgJiYKKwkJCQkoZnJhbWVfYnVmc1tpXS5idWYudmZfcmVmID09IDApICYmCisJCQkJZnJhbWVfYnVmc1tpXS5idWYuY21hX2FsbG9jX2FkZHIpIHsKKwkJCQlmcmVlX2J1Zl9jb3VudCsrOworCQkJfQorCQl9CisKKwkJaWYgKGN0eC0+Y2FwX3Bvb2wuZGVjIDwgcGJpLT51c2VkX2J1Zl9udW0pIHsKKwkJCWZyZWVfYnVmX2NvdW50ICs9CisJCQkJdjRsMl9tMm1fbnVtX2RzdF9idWZzX3JlYWR5KGN0eC0+bTJtX2N0eCk7CisJCX0KKworCQkvKiB0cmlnZ2VyIHRvIHBhcnNlIGhlYWQgZGF0YS4gKi8KKwkJaWYgKCFwYmktPnY0bF9wYXJhbXNfcGFyc2VkKSB7CisJCQlmcmVlX2J1Zl9jb3VudCA9IHBiaS0+cnVuX3JlYWR5X21pbl9idWZfbnVtOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IHBiaS0+dXNlZF9idWZfbnVtOyArK2kpIHsKKwkJCWlmICgoZnJhbWVfYnVmc1tpXS5yZWZfY291bnQgPT0gMCkgJiYKKwkJCQkoZnJhbWVfYnVmc1tpXS5idWYudmZfcmVmID09IDApICYmCisJCQkJKGZyYW1lX2J1ZnNbaV0uYnVmLmluZGV4ICE9IC0xKSkKKwkJCQlmcmVlX2J1Zl9jb3VudCsrOworCQl9CisJfQorCisJcmV0dXJuIGZyZWVfYnVmX2NvdW50OworfQorCitzdGF0aWMgdm9pZCBkZWNyZWFzZV9yZWZfY291bnQoaW50IGlkeCwgc3RydWN0IFJlZkNudEJ1ZmZlcl9zICpjb25zdCBmcmFtZV9idWZzLAorCQkJCQlzdHJ1Y3QgQnVmZmVyUG9vbF9zICpjb25zdCBwb29sKQoreworCWlmIChpZHggPj0gMCkgeworCQktLWZyYW1lX2J1ZnNbaWR4XS5yZWZfY291bnQ7CisJCS8qcHJfaW5mbygiW01NVSBERUJVRyA3XSBkZWMgcmVmX2NvdW50WyVkXSA6ICVkXHJcbiIsIGlkeCwKKwkJICoJZnJhbWVfYnVmc1tpZHhdLnJlZl9jb3VudCk7CisJCSAqLworCQkvKkEgd29ya2VyIG1heSBvbmx5IGdldCBhIGZyZWUgZnJhbWVidWZmZXIgaW5kZXggd2hlbgorCQkgKmNhbGxpbmcgZ2V0X2ZyZWVfZmIuIEJ1dCB0aGUgcHJpdmF0ZSBidWZmZXIgaXMgbm90IHNldCB1cAorCQkgKnVudGlsIGZpbmlzaCBkZWNvZGluZyBoZWFkZXIuIFNvIGFueSBlcnJvciBoYXBwZW5zIGR1cmluZworCQkgKmRlY29kaW5nIGhlYWRlciwgdGhlIGZyYW1lX2J1ZnMgd2lsbCBub3QgaGF2ZSB2YWxpZCBwcml2CisJCSAqYnVmZmVyLgorCQkgKi8KKworCQlpZiAoZnJhbWVfYnVmc1tpZHhdLnJlZl9jb3VudCA9PSAwICYmCisJCQlmcmFtZV9idWZzW2lkeF0ucmF3X2ZyYW1lX2J1ZmZlci5wcml2KQorCQkJdnA5X3JlbGVhc2VfZnJhbWVfYnVmZmVyCisJCQkoJmZyYW1lX2J1ZnNbaWR4XS5yYXdfZnJhbWVfYnVmZmVyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGdlbmVyYXRlX25leHRfcmVmX2ZyYW1lcyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJc3RydWN0IFZQOV9Db21tb25fcyAqY29uc3QgY20gPSAmcGJpLT5jb21tb247CisJc3RydWN0IFJlZkNudEJ1ZmZlcl9zICpmcmFtZV9idWZzID0gY20tPmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzOworCXN0cnVjdCBCdWZmZXJQb29sX3MgKmNvbnN0IHBvb2wgPSBjbS0+YnVmZmVyX3Bvb2w7CisJaW50IG1hc2ssIHJlZl9pbmRleCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIEdlbmVyYXRlIG5leHRfcmVmX2ZyYW1lX21hcC4qLworCWxvY2tfYnVmZmVyX3Bvb2wocG9vbCwgZmxhZ3MpOworCWZvciAobWFzayA9IHBiaS0+cmVmcmVzaF9mcmFtZV9mbGFnczsgbWFzazsgbWFzayA+Pj0gMSkgeworCQlpZiAobWFzayAmIDEpIHsKKwkJCWNtLT5uZXh0X3JlZl9mcmFtZV9tYXBbcmVmX2luZGV4XSA9IGNtLT5uZXdfZmJfaWR4OworCQkJKytmcmFtZV9idWZzW2NtLT5uZXdfZmJfaWR4XS5yZWZfY291bnQ7CisJCQkvKnByX2luZm8oIltNTVUgREVCVUcgNF0gaW5jIHJlZl9jb3VudFslZF0gOiAlZFxyXG4iLAorCQkJICpjbS0+bmV3X2ZiX2lkeCwgZnJhbWVfYnVmc1tjbS0+bmV3X2ZiX2lkeF0ucmVmX2NvdW50KTsKKwkJCSAqLworCQl9IGVsc2UKKwkJCWNtLT5uZXh0X3JlZl9mcmFtZV9tYXBbcmVmX2luZGV4XSA9CisJCQkJY20tPnJlZl9mcmFtZV9tYXBbcmVmX2luZGV4XTsKKwkJLyogQ3VycmVudCB0aHJlYWQgaG9sZHMgdGhlIHJlZmVyZW5jZSBmcmFtZS4qLworCQlpZiAoY20tPnJlZl9mcmFtZV9tYXBbcmVmX2luZGV4XSA+PSAwKSB7CisJCQkrK2ZyYW1lX2J1ZnNbY20tPnJlZl9mcmFtZV9tYXBbcmVmX2luZGV4XV0ucmVmX2NvdW50OworCQkJLypwcl9pbmZvCisJCQkgKigiW01NVSBERUJVRyA1XSBpbmMgcmVmX2NvdW50WyVkXSA6ICVkXHJcbiIsCisJCQkgKmNtLT5yZWZfZnJhbWVfbWFwW3JlZl9pbmRleF0sCisJCQkgKmZyYW1lX2J1ZnNbY20tPnJlZl9mcmFtZV9tYXBbcmVmX2luZGV4XV0ucmVmX2NvdW50KTsKKwkJCSAqLworCQl9CisJCSsrcmVmX2luZGV4OworCX0KKworCWZvciAoOyByZWZfaW5kZXggPCBSRUZfRlJBTUVTOyArK3JlZl9pbmRleCkgeworCQljbS0+bmV4dF9yZWZfZnJhbWVfbWFwW3JlZl9pbmRleF0gPQorCQkJY20tPnJlZl9mcmFtZV9tYXBbcmVmX2luZGV4XTsKKwkJLyogQ3VycmVudCB0aHJlYWQgaG9sZHMgdGhlIHJlZmVyZW5jZSBmcmFtZS4qLworCQlpZiAoY20tPnJlZl9mcmFtZV9tYXBbcmVmX2luZGV4XSA+PSAwKSB7CisJCQkrK2ZyYW1lX2J1ZnNbY20tPnJlZl9mcmFtZV9tYXBbcmVmX2luZGV4XV0ucmVmX2NvdW50OworCQkJLypwcl9pbmZvKCJbTU1VIERFQlVHIDZdIGluYyByZWZfY291bnRbJWRdIDogJWRcclxuIiwKKwkJCSAqY20tPnJlZl9mcmFtZV9tYXBbcmVmX2luZGV4XSwKKwkJCSAqZnJhbWVfYnVmc1tjbS0+cmVmX2ZyYW1lX21hcFtyZWZfaW5kZXhdXS5yZWZfY291bnQpOworCQkJICovCisJCX0KKwl9CisJdW5sb2NrX2J1ZmZlcl9wb29sKHBvb2wsIGZsYWdzKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHJlZnJlc2hfcmVmX2ZyYW1lcyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCisKK3sKKwlzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjb25zdCBjbSA9ICZwYmktPmNvbW1vbjsKKwlzdHJ1Y3QgQnVmZmVyUG9vbF9zICpwb29sID0gY20tPmJ1ZmZlcl9wb29sOworCXN0cnVjdCBSZWZDbnRCdWZmZXJfcyAqZnJhbWVfYnVmcyA9IGNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmczsKKwlpbnQgbWFzaywgcmVmX2luZGV4ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9ja19idWZmZXJfcG9vbChwb29sLCBmbGFncyk7CisJZm9yIChtYXNrID0gcGJpLT5yZWZyZXNoX2ZyYW1lX2ZsYWdzOyBtYXNrOyBtYXNrID4+PSAxKSB7CisJCWNvbnN0IGludCBvbGRfaWR4ID0gY20tPnJlZl9mcmFtZV9tYXBbcmVmX2luZGV4XTsKKwkJLypDdXJyZW50IHRocmVhZCByZWxlYXNlcyB0aGUgaG9sZGluZyBvZiByZWZlcmVuY2UgZnJhbWUuKi8KKwkJZGVjcmVhc2VfcmVmX2NvdW50KG9sZF9pZHgsIGZyYW1lX2J1ZnMsIHBvb2wpOworCisJCS8qUmVsZWFzZSB0aGUgcmVmZXJlbmNlIGZyYW1lIGluIHJlZmVyZW5jZSBtYXAuKi8KKwkJaWYgKChtYXNrICYgMSkgJiYgb2xkX2lkeCA+PSAwKQorCQkJZGVjcmVhc2VfcmVmX2NvdW50KG9sZF9pZHgsIGZyYW1lX2J1ZnMsIHBvb2wpOworCQljbS0+cmVmX2ZyYW1lX21hcFtyZWZfaW5kZXhdID0KKwkJCWNtLT5uZXh0X3JlZl9mcmFtZV9tYXBbcmVmX2luZGV4XTsKKwkJKytyZWZfaW5kZXg7CisJfQorCisJLypDdXJyZW50IHRocmVhZCByZWxlYXNlcyB0aGUgaG9sZGluZyBvZiByZWZlcmVuY2UgZnJhbWUuKi8KKwlmb3IgKDsgcmVmX2luZGV4IDwgUkVGX0ZSQU1FUyAmJiAhY20tPnNob3dfZXhpc3RpbmdfZnJhbWU7CisJCSsrcmVmX2luZGV4KSB7CisJCWNvbnN0IGludCBvbGRfaWR4ID0gY20tPnJlZl9mcmFtZV9tYXBbcmVmX2luZGV4XTsKKworCQlkZWNyZWFzZV9yZWZfY291bnQob2xkX2lkeCwgZnJhbWVfYnVmcywgcG9vbCk7CisJCWNtLT5yZWZfZnJhbWVfbWFwW3JlZl9pbmRleF0gPQorCQkJY20tPm5leHRfcmVmX2ZyYW1lX21hcFtyZWZfaW5kZXhdOworCX0KKwl1bmxvY2tfYnVmZmVyX3Bvb2wocG9vbCwgZmxhZ3MpOworCXJldHVybjsKK30KKworaW50IHZwOV9idWZtZ3JfcHJvY2VzcyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksIHVuaW9uIHBhcmFtX3UgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjb25zdCBjbSA9ICZwYmktPmNvbW1vbjsKKwlzdHJ1Y3QgQnVmZmVyUG9vbF9zICpwb29sID0gY20tPmJ1ZmZlcl9wb29sOworCXN0cnVjdCBSZWZDbnRCdWZmZXJfcyAqZnJhbWVfYnVmcyA9IGNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmczsKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljID0gTlVMTDsKKwlpbnQgaTsKKwlpbnQgcmV0OworCisJcGJpLT5yZWFkeV9mb3JfbmV3X2RhdGEgPSAwOworCisJaWYgKChwYmktPmhhc19rZXlmcmFtZSA9PSAwKSAmJgorCQkocGFyYW1zLT5wLmZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKSAmJgorCQkoIXBhcmFtcy0+cC5pbnRyYV9vbmx5KSl7CisJCW9uX25vX2tleWZyYW1lX3NraXBlZCsrOworCQlwcl9pbmZvKCJ2cDlfYnVmbWdyX3Byb2Nlc3Mgbm8ga2V5IGZyYW1lIHJldHVyblxuIik7CisJCXJldHVybiAtMjsKKwl9CisJcGJpLT5oYXNfa2V5ZnJhbWUgPSAxOworCW9uX25vX2tleWZyYW1lX3NraXBlZCA9IDA7CisjaWYgMAorCWlmIChwYmktPm1tdV9lbmFibGUpIHsKKwkJaWYgKCFwYmktPm1faW5zX2ZsYWcpCisJCQlwYmktPnVzZWRfNGtfbnVtID0gKFJFQURfVlJFRyhIRVZDX1NBT19NTVVfU1RBVFVTKSA+PiAxNik7CisJCWlmIChjbS0+cHJldl9mYl9pZHggPj0gMCkgeworCQkJZGVjb2Rlcl9tbXVfYm94X2ZyZWVfaWR4X3RhaWwocGJpLT5tbXVfYm94LAorCQkJY20tPnByZXZfZmJfaWR4LCBwYmktPnVzZWRfNGtfbnVtKTsKKwkJfQorCX0KKyNlbmRpZgorCWlmIChjbS0+bmV3X2ZiX2lkeCA+PSAwCisJCSYmIGZyYW1lX2J1ZnNbY20tPm5ld19mYl9pZHhdLnJlZl9jb3VudCA9PSAwKXsKKwkJdnA5X3JlbGVhc2VfZnJhbWVfYnVmZmVyCisJCQkoJmZyYW1lX2J1ZnNbY20tPm5ld19mYl9pZHhdLnJhd19mcmFtZV9idWZmZXIpOworCX0KKwkvKnByX2luZm8oIkJlZm9yZSBnZXRfZnJlZV9mYiwgcHJldl9mYl9pZHggOiAlZCwgbmV3X2ZiX2lkeCA6ICVkXHJcbiIsCisJCWNtLT5wcmV2X2ZiX2lkeCwgY20tPm5ld19mYl9pZHgpOyovCisjaWZuZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwlwdXRfdW5fdXNlZF9tdl9idWZzKHBiaSk7CisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0JVRk1HUl9ERVRBSUwpCisJCWR1bXBfcGljX2xpc3QocGJpKTsKKyNlbmRpZgorCWNtLT5uZXdfZmJfaWR4ID0gcGJpLT5pc191c2VkX3Y0bCA/CisJCXY0bF9nZXRfZnJlZV9mYihwYmkpIDoKKwkJZ2V0X2ZyZWVfZmIocGJpKTsKKwlpZiAoY20tPm5ld19mYl9pZHggPT0gSU5WQUxJRF9JRFgpIHsKKwkJcHJfaW5mbygiZ2V0X2ZyZWVfZmIgZXJyb3JcclxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKyNpZm5kZWYgTVZfVVNFX0ZJWEVEX0JVRgorI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKKwlpZiAocGJpLT51c2VkX3N0YWdlX2J1Zl9udW0gPT0gMCkgeworI2VuZGlmCisJCWlmIChnZXRfbXZfYnVmKHBiaSwKKwkJCSZwb29sLT5mcmFtZV9idWZzW2NtLT5uZXdfZmJfaWR4XS4KKwkJCWJ1ZikgPCAwKSB7CisJCQlwcl9pbmZvKCJnZXRfbXZfYnVmIGZhaWxcclxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0JVRk1HUl9ERVRBSUwpCisJCQlkdW1wX3BpY19saXN0KHBiaSk7CisjaWZkZWYgU1VQUE9SVF9GQl9ERUNPRElORworCX0KKyNlbmRpZgorI2VuZGlmCisJY20tPmN1cl9mcmFtZSA9ICZwb29sLT5mcmFtZV9idWZzW2NtLT5uZXdfZmJfaWR4XTsKKwkvKmlmIChkZWJ1ZyAmIFZQOV9ERUJVR19CVUZNR1IpCisJCXByX2luZm8oIltWUDkgREVCVUddJXMoZ2V0X2ZyZWVfZmIpOiAlZFxyXG4iLCBfX2Z1bmNfXywKKwkJCQljbS0+bmV3X2ZiX2lkeCk7Ki8KKworCXBiaS0+Y3VyX2J1ZiA9ICZmcmFtZV9idWZzW2NtLT5uZXdfZmJfaWR4XTsKKwlpZiAocGJpLT5tbXVfZW5hYmxlKSB7CisJCS8qIG1vdmVkIHRvIGFmdGVyIHBpY3R1cmUgc2l6ZSByZWFkeQorCQkgKmFsbG9jX21tdShjbSwgcGFyYW1zLT5wLndpZHRoLCBwYXJhbXMtPnAuaGVpZ2h0LAorCQkgKnBhcmFtcy0+cC5iaXRfZGVwdGgsIHBiaS0+ZnJhbWVfbW11X21hcF9hZGRyKTsKKwkJICovCisJCWNtLT5wcmV2X2ZiX2lkeCA9IGNtLT5uZXdfZmJfaWR4OworCX0KKwkvKnJlYWRfdW5jb21wcmVzc2VkX2hlYWRlcigpKi8KKwljbS0+bGFzdF9mcmFtZV90eXBlID0gY20tPmZyYW1lX3R5cGU7CisJY20tPmxhc3RfaW50cmFfb25seSA9IGNtLT5pbnRyYV9vbmx5OworCWNtLT5wcm9maWxlID0gcGFyYW1zLT5wLnByb2ZpbGU7CisJaWYgKGNtLT5wcm9maWxlID49IE1BWF9QUk9GSUxFUykgeworCQlwcl9lcnIoIkVycm9yOiBVbnN1cHBvcnRlZCBwcm9maWxlICVkXHJcbiIsIGNtLT5wcm9maWxlKTsKKwkJcmV0dXJuIC0xOworCX0KKwljbS0+c2hvd19leGlzdGluZ19mcmFtZSA9IHBhcmFtcy0+cC5zaG93X2V4aXN0aW5nX2ZyYW1lOworCWlmIChjbS0+c2hvd19leGlzdGluZ19mcmFtZSkgeworCQkvKiBTaG93IGFuIGV4aXN0aW5nIGZyYW1lIGRpcmVjdGx5LiovCisJCWludCBmcmFtZV90b19zaG93X2lkeCA9IHBhcmFtcy0+cC5mcmFtZV90b19zaG93X2lkeDsKKwkJaW50IGZyYW1lX3RvX3Nob3c7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCWlmIChmcmFtZV90b19zaG93X2lkeCA+PSBSRUZfRlJBTUVTKSB7CisJCQlwcl9pbmZvKCJmcmFtZV90b19zaG93X2lkeCAlZCBleGNlZWQgbWF4IGluZGV4XHJcbiIsCisJCQkJCWZyYW1lX3RvX3Nob3dfaWR4KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWZyYW1lX3RvX3Nob3cgPSBjbS0+cmVmX2ZyYW1lX21hcFtmcmFtZV90b19zaG93X2lkeF07CisJCS8qcHJfaW5mbygiZnJhbWVfdG9fc2hvdyAlZFxyXG4iLCBmcmFtZV90b19zaG93KTsqLworCQlsb2NrX2J1ZmZlcl9wb29sKHBvb2wsIGZsYWdzKTsKKwkJaWYgKGZyYW1lX3RvX3Nob3cgPCAwIHx8CisJCQlmcmFtZV9idWZzW2ZyYW1lX3RvX3Nob3ddLnJlZl9jb3VudCA8IDEpIHsKKwkJCXVubG9ja19idWZmZXJfcG9vbChwb29sLCBmbGFncyk7CisJCQlwcl9lcnIKKwkJCSgiRXJyb3I6QnVmZmVyICVkIGRvZXMgbm90IGNvbnRhaW4gYSBkZWNvZGVkIGZyYW1lIiwKKwkJCWZyYW1lX3RvX3Nob3cpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJcmVmX2NudF9mYihmcmFtZV9idWZzLCAmY20tPm5ld19mYl9pZHgsIGZyYW1lX3RvX3Nob3cpOworCQl1bmxvY2tfYnVmZmVyX3Bvb2wocG9vbCwgZmxhZ3MpOworCQlwYmktPnJlZnJlc2hfZnJhbWVfZmxhZ3MgPSAwOworCQkvKmNtLT5sZi5maWx0ZXJfbGV2ZWwgPSAwOyovCisJCWNtLT5zaG93X2ZyYW1lID0gMTsKKwkJY20tPmN1cl9mcmFtZS0+c2hvd19mcmFtZSA9IDE7CisKKwkJLyoKKwkJICppZiAocGJpLT5mcmFtZV9wYXJhbGxlbF9kZWNvZGUpIHsKKwkJICoJZm9yIChpID0gMDsgaSA8IFJFRl9GUkFNRVM7ICsraSkKKwkJICoJCWNtLT5uZXh0X3JlZl9mcmFtZV9tYXBbaV0gPQorCQkgKgkJY20tPnJlZl9mcmFtZV9tYXBbaV07CisJCSAqfQorCQkgKi8KKwkJLyogZG8gbm90IGRlY29kZSwgc2VhcmNoIG5leHQgc3RhcnQgY29kZSAqLworCQlyZXR1cm4gMTsKKwl9CisJY20tPmZyYW1lX3R5cGUgPSBwYXJhbXMtPnAuZnJhbWVfdHlwZTsKKwljbS0+c2hvd19mcmFtZSA9IHBhcmFtcy0+cC5zaG93X2ZyYW1lOworCWNtLT5iaXRfZGVwdGggPSBwYXJhbXMtPnAuYml0X2RlcHRoOworCWNtLT5lcnJvcl9yZXNpbGllbnRfbW9kZSA9IHBhcmFtcy0+cC5lcnJvcl9yZXNpbGllbnRfbW9kZTsKKwljbS0+Y3VyX2ZyYW1lLT5zaG93X2ZyYW1lID0gY20tPnNob3dfZnJhbWU7CisKKwlpZiAoY20tPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKSB7CisJCXBiaS0+cmVmcmVzaF9mcmFtZV9mbGFncyA9ICgxIDw8IFJFRl9GUkFNRVMpIC0gMTsKKworCQlmb3IgKGkgPSAwOyBpIDwgUkVGU19QRVJfRlJBTUU7ICsraSkgeworCQkJY20tPmZyYW1lX3JlZnNbaV0uaWR4ID0gSU5WQUxJRF9JRFg7CisJCQljbS0+ZnJhbWVfcmVmc1tpXS5idWYgPSBOVUxMOworCQl9CisjaWZkZWYgVlA5XzEwQl9NTVVfRFcKKwkJcmV0ID0gc2V0dXBfZnJhbWVfc2l6ZShwYmksCisJCQljbSwgcGFyYW1zLAorCQkJcGJpLT5mcmFtZV9tbXVfbWFwX2FkZHIsCisJCQlwYmktPmZyYW1lX21tdV9kd19tYXBfYWRkciwKKwkJCXByaW50X2hlYWRlcl9pbmZvKTsKKyNlbHNlCisJCXJldCA9IHNldHVwX2ZyYW1lX3NpemUocGJpLAorCQkJY20sIHBhcmFtcywKKwkJCXBiaS0+ZnJhbWVfbW11X21hcF9hZGRyLAorCQkJTlVMTCwKKwkJCXByaW50X2hlYWRlcl9pbmZvKTsKKyNlbmRpZgorCQlpZiAocmV0KQorCQkJcmV0dXJuIC0xOworCQlpZiAocGJpLT5uZWVkX3Jlc3luYykgeworCQkJbWVtc2V0KCZjbS0+cmVmX2ZyYW1lX21hcCwgLTEsCisJCQkJc2l6ZW9mKGNtLT5yZWZfZnJhbWVfbWFwKSk7CisJCQlwYmktPm5lZWRfcmVzeW5jID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCWNtLT5pbnRyYV9vbmx5ID0gY20tPnNob3dfZnJhbWUgPyAwIDogcGFyYW1zLT5wLmludHJhX29ubHk7CisJCS8qaWYgKHByaW50X2hlYWRlcl9pbmZvKSB7CisJCSAqCWlmIChjbS0+c2hvd19mcmFtZSkKKwkJICoJCXByX2luZm8KKwkJICoJCSgiaW50cmFfb25seSBzZXQgdG8gMCBiZWNhdXNlIG9mIHNob3dfZnJhbWVcbiIpOworCQkgKgllbHNlCisJCSAqCQlwcl9pbmZvCisJCSAqCQkoIjEtYml0IGludHJhX29ubHkgcmVhZDogJWRcbiIsIGNtLT5pbnRyYV9vbmx5KTsKKwkJICp9CisJCSAqLworCisKKwkJY20tPnJlc2V0X2ZyYW1lX2NvbnRleHQgPSBjbS0+ZXJyb3JfcmVzaWxpZW50X21vZGUgPworCQkJMCA6IHBhcmFtcy0+cC5yZXNldF9mcmFtZV9jb250ZXh0OworCQlpZiAocHJpbnRfaGVhZGVyX2luZm8pIHsKKwkJCWlmIChjbS0+ZXJyb3JfcmVzaWxpZW50X21vZGUpCisJCQkJcHJfaW5mbworCQkJCSgicmVzZXQgdG8gMCBlcnJvcl9yZXNpbGllbnRfbW9kZVxuIik7CisJCWVsc2UKKwkJCXByX2luZm8KKwkJCQkoIiAqIDItYml0cyByZXNldF9mcmFtZV9jb250ZXh0IHJlYWQgOiAlZFxuIiwKKwkJCQljbS0+cmVzZXRfZnJhbWVfY29udGV4dCk7CisJCX0KKworCQlpZiAoY20tPmludHJhX29ubHkpIHsKKwkJCWlmIChjbS0+cHJvZmlsZSA+IFBST0ZJTEVfMCkgeworCQkJCS8qcmVhZF9iaXRkZXB0aF9jb2xvcnNwYWNlX3NhbXBsaW5nKGNtLAorCQkJCSAqCXJiLCBwcmludF9oZWFkZXJfaW5mbyk7CisJCQkJICovCisJCQl9IGVsc2UgeworCQkJCS8qTk9URTogVGhlIGludHJhLW9ubHkgZnJhbWUgaGVhZGVyCisJCQkJICpkb2VzIG5vdCBpbmNsdWRlIHRoZSBzcGVjaWZpY2F0aW9uCisJCQkJICpvZiBlaXRoZXIgdGhlIGNvbG9yIGZvcm1hdCBvcgorCQkJCSAqY29sb3Igc3ViLXNhbXBsaW5nCisJCQkJICppbiBwcm9maWxlIDAuIFZQOSBzcGVjaWZpZXMgdGhhdCB0aGUgZGVmYXVsdAorCQkJCSAqY29sb3IgZm9ybWF0IHNob3VsZCBiZSBZVVYgNDoyOjAgaW4gdGhpcworCQkJCSAqY2FzZSAobm9ybWF0aXZlKS4KKwkJCQkgKi8KKwkJCQljbS0+Y29sb3Jfc3BhY2UgPSBWUFhfQ1NfQlRfNjAxOworCQkJCWNtLT5zdWJzYW1wbGluZ195ID0gY20tPnN1YnNhbXBsaW5nX3ggPSAxOworCQkJCWNtLT5iaXRfZGVwdGggPSBWUFhfQklUU184OworCQkJCWNtLT51c2VfaGlnaGJpdGRlcHRoID0gMDsKKwkJCX0KKworCQkJcGJpLT5yZWZyZXNoX2ZyYW1lX2ZsYWdzID0KKwkJCQlwYXJhbXMtPnAucmVmcmVzaF9mcmFtZV9mbGFnczsKKwkJCS8qaWYgKHByaW50X2hlYWRlcl9pbmZvKQorCQkJICoJcHJfaW5mbygiKiVkLWJpdHMgcmVmcmVzaF9mcmFtZSByZWFkOjB4JXhcbiIsCisJCQkgKglSRUZfRlJBTUVTLCBwYmktPnJlZnJlc2hfZnJhbWVfZmxhZ3MpOworCQkJICovCisjaWZkZWYgVlA5XzEwQl9NTVVfRFcKKwkJCXJldCA9IHNldHVwX2ZyYW1lX3NpemUocGJpLAorCQkJCWNtLAorCQkJCXBhcmFtcywKKwkJCQlwYmktPmZyYW1lX21tdV9tYXBfYWRkciwKKwkJCQlwYmktPmZyYW1lX21tdV9kd19tYXBfYWRkciwKKwkJCQlwcmludF9oZWFkZXJfaW5mbyk7CisjZWxzZQorCQkJcmV0ID0gc2V0dXBfZnJhbWVfc2l6ZShwYmksCisJCQkJY20sCisJCQkJcGFyYW1zLAorCQkJCXBiaS0+ZnJhbWVfbW11X21hcF9hZGRyLAorCQkJCU5VTEwsCisJCQkJcHJpbnRfaGVhZGVyX2luZm8pOworI2VuZGlmCisJCQlpZiAocmV0KQorCQkJCXJldHVybiAtMTsKKwkJCWlmIChwYmktPm5lZWRfcmVzeW5jKSB7CisJCQkJbWVtc2V0KCZjbS0+cmVmX2ZyYW1lX21hcCwgLTEsCisJCQkJCXNpemVvZihjbS0+cmVmX2ZyYW1lX21hcCkpOworCQkJCXBiaS0+bmVlZF9yZXN5bmMgPSAwOworCQkJfQorCQl9IGVsc2UgaWYgKHBiaS0+bmVlZF9yZXN5bmMgIT0gMSkgeyAgLyogU2tpcCBpZiBuZWVkIHJlc3luYyAqLworCQkJcGJpLT5yZWZyZXNoX2ZyYW1lX2ZsYWdzID0KKwkJCQkJcGFyYW1zLT5wLnJlZnJlc2hfZnJhbWVfZmxhZ3M7CisJCQlpZiAocHJpbnRfaGVhZGVyX2luZm8pCisJCQkJcHJfaW5mbworCQkJCSgiKiVkLWJpdHMgcmVmcmVzaF9mcmFtZSByZWFkOjB4JXhcbiIsCisJCQkJUkVGX0ZSQU1FUywgcGJpLT5yZWZyZXNoX2ZyYW1lX2ZsYWdzKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBSRUZTX1BFUl9GUkFNRTsgKytpKSB7CisJCQkJY29uc3QgaW50IHJlZiA9CisJCQkJCShwYXJhbXMtPnAucmVmX2luZm8gPj4KKwkJCQkJKCgoUkVGU19QRVJfRlJBTUUtaS0xKSo0KSsxKSkKKwkJCQkJJiAweDc7CisJCQkJY29uc3QgaW50IGlkeCA9CisJCQkJCWNtLT5yZWZfZnJhbWVfbWFwW3JlZl07CisJCQkJc3RydWN0IFJlZkJ1ZmZlcl9zICogY29uc3QgcmVmX2ZyYW1lID0KKwkJCQkJJmNtLT5mcmFtZV9yZWZzW2ldOworCQkJCWlmIChwcmludF9oZWFkZXJfaW5mbykKKwkJCQkJcHJfaW5mbygiKiVkLWJpdHMgcmVmWyVkXXJlYWQ6JWRcbiIsCisJCQkJCQlSRUZfRlJBTUVTX0xPRzIsIGksIHJlZik7CisJCQkJcmVmX2ZyYW1lLT5pZHggPSBpZHg7CisJCQkJcmVmX2ZyYW1lLT5idWYgPSAmZnJhbWVfYnVmc1tpZHhdLmJ1ZjsKKwkJCQljbS0+cmVmX2ZyYW1lX3NpZ25fYmlhc1tMQVNUX0ZSQU1FICsgaV0KKwkJCQk9IChwYXJhbXMtPnAucmVmX2luZm8gPj4KKwkJCQkoKFJFRlNfUEVSX0ZSQU1FLWktMSkqNCkpICYgMHgxOworCQkJCWlmIChwcmludF9oZWFkZXJfaW5mbykKKwkJCQkJcHJfaW5mbygiMWJpdCByZWZfZnJhbWVfc2lnbl9iaWFzIik7CisJCQkJLypwcl9pbmZvCisJCQkJICooIiVkcmVhZDogJWRcbiIsCisJCQkJICpMQVNUX0ZSQU1FK2ksCisJCQkJICpjbS0+cmVmX2ZyYW1lX3NpZ25fYmlhcworCQkJCSAqW0xBU1RfRlJBTUUgKyBpXSk7CisJCQkJICovCisJCQkJLypwcl9pbmZvCisJCQkJICooIltWUDkgREVCVUddJXMoZ2V0IHJlZik6JWRcclxuIiwKKwkJCQkgKl9fZnVuY19fLCByZWZfZnJhbWUtPmlkeCk7CisJCQkJICovCisKKwkJCX0KKyNpZmRlZiBWUDlfMTBCX01NVV9EVworCQkJcmV0ID0gc2V0dXBfZnJhbWVfc2l6ZV93aXRoX3JlZnMoCisJCQkJcGJpLAorCQkJCWNtLAorCQkJCXBhcmFtcywKKwkJCQlwYmktPmZyYW1lX21tdV9tYXBfYWRkciwKKwkJCQlwYmktPmZyYW1lX21tdV9kd19tYXBfYWRkciwKKwkJCQlwcmludF9oZWFkZXJfaW5mbyk7CisjZWxzZQorCQkJcmV0ID0gc2V0dXBfZnJhbWVfc2l6ZV93aXRoX3JlZnMoCisJCQkJcGJpLAorCQkJCWNtLAorCQkJCXBhcmFtcywKKwkJCQlwYmktPmZyYW1lX21tdV9tYXBfYWRkciwKKwkJCQlOVUxMLAorCQkJCXByaW50X2hlYWRlcl9pbmZvKTsKKyNlbmRpZgorCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gLTE7CisJCQlmb3IgKGkgPSAwOyBpIDwgUkVGU19QRVJfRlJBTUU7ICsraSkgeworCQkJCS8qc3RydWN0IFJlZkJ1ZmZlcl9zICpjb25zdCByZWZfYnVmID0KKwkJCQkgKiZjbS0+ZnJhbWVfcmVmc1tpXTsKKwkJCQkgKi8KKwkJCQkvKiB0byBkbzoKKwkJCQkgKnZwOV9zZXR1cF9zY2FsZV9mYWN0b3JzX2Zvcl9mcmFtZQorCQkJCSAqLworCQkJfQorCQl9CisJfQorCisJcGljID0gZ2V0X2ZyYW1lX25ld19idWZmZXIoY20pOworCWlmICghcGljKQorCQlyZXR1cm4gLTE7CisKKwlwaWMtPmJpdF9kZXB0aCA9IGNtLT5iaXRfZGVwdGg7CisJcGljLT5jb2xvcl9zcGFjZSA9IGNtLT5jb2xvcl9zcGFjZTsKKwlwaWMtPnNsaWNlX3R5cGUgPSBjbS0+ZnJhbWVfdHlwZTsKKworCWlmIChwYmktPm5lZWRfcmVzeW5jKSB7CisJCXByX2VycgorCQkoIkVycm9yOiBLZXlmcmFtZS9pbnRyYS1vbmx5IGZyYW1lIHJlcXVpcmVkIHRvIHJlc2V0XHJcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWdlbmVyYXRlX25leHRfcmVmX2ZyYW1lcyhwYmkpOworCXBiaS0+aG9sZF9yZWZfYnVmID0gMTsKKworI2lmIDAKKwlpZiAoZnJhbWVfaXNfaW50cmFfb25seShjbSkgfHwgY20tPmVycm9yX3Jlc2lsaWVudF9tb2RlKQorCQl2cDlfc2V0dXBfcGFzdF9pbmRlcGVuZGVuY2UoY20pOworCXNldHVwX2xvb3BmaWx0ZXIoJmNtLT5sZiwgcmIsIHByaW50X2hlYWRlcl9pbmZvKTsKKwlzZXR1cF9xdWFudGl6YXRpb24oY20sICZwYmktPm1iLCByYiwgcHJpbnRfaGVhZGVyX2luZm8pOworCXNldHVwX3NlZ21lbnRhdGlvbigmY20tPnNlZywgcmIsIHByaW50X2hlYWRlcl9pbmZvKTsKKwlzZXR1cF9zZWdtZW50YXRpb25fZGVxdWFudChjbSwgcHJpbnRfaGVhZGVyX2luZm8pOworCisJc2V0dXBfdGlsZV9pbmZvKGNtLCByYiwgcHJpbnRfaGVhZGVyX2luZm8pOworCXN6ID0gdnA5X3JiX3JlYWRfbGl0ZXJhbChyYiwgMTYpOworCWlmIChwcmludF9oZWFkZXJfaW5mbykKKwkJcHJfaW5mbygiICogMTYtYml0cyBzaXplIHJlYWQgOiAlZCAoMHgleClcbiIsIHN6LCBzeik7CisKKwlpZiAoc3ogPT0gMCkKKwkJdnB4X2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIFZQWF9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorCQkiSW52YWxpZCBoZWFkZXIgc2l6ZSIpOworI2VuZGlmCisJLyplbmQgcmVhZF91bmNvbXByZXNzZWRfaGVhZGVyKCkqLworCWNtLT51c2VfcHJldl9mcmFtZV9tdnMgPSAhY20tPmVycm9yX3Jlc2lsaWVudF9tb2RlICYmCisJCQljbS0+d2lkdGggPT0gY20tPmxhc3Rfd2lkdGggJiYKKwkJCWNtLT5oZWlnaHQgPT0gY20tPmxhc3RfaGVpZ2h0ICYmCisJCQkhY20tPmxhc3RfaW50cmFfb25seSAmJgorCQkJY20tPmxhc3Rfc2hvd19mcmFtZSAmJgorCQkJKGNtLT5sYXN0X2ZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKTsKKworCS8qcHJfaW5mbworCSAqKCJzZXQgdXNlX3ByZXZfZnJhbWVfbXZzIHRvICVkIChsYXN0X3dpZHRoICVkIGxhc3RfaGVpZ2h0ICVkIiwKKwkgKmNtLT51c2VfcHJldl9mcmFtZV9tdnMsIGNtLT5sYXN0X3dpZHRoLCBjbS0+bGFzdF9oZWlnaHQpOworCSAqcHJfaW5mbworCSAqKCIgbGFzdF9pbnRyYV9vbmx5ICVkIGxhc3Rfc2hvd19mcmFtZSAlZCBsYXN0X2ZyYW1lX3R5cGUgJWQpXG4iLAorCSAqY20tPmxhc3RfaW50cmFfb25seSwgY20tPmxhc3Rfc2hvd19mcmFtZSwgY20tPmxhc3RfZnJhbWVfdHlwZSk7CisJICovCisKKwlpZiAocGJpLT5lbmFibGVfZmVuY2UgJiYgY20tPnNob3dfZnJhbWUpIHsKKwkJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnBpYyA9ICZjbS0+Y3VyX2ZyYW1lLT5idWY7CisJCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKHBiaSk7CisKKwkJLyogY3JlYXRlIGZlbmNlIGZvciBlYWNoIGJ1ZmZlcnMuICovCisJCXJldCA9IHZkZWNfdGltZWxpbmVfY3JlYXRlX2ZlbmNlKHZkZWMtPnN5bmMpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJcGljLT5mZW5jZQkJPSB2ZGVjLT5zeW5jLT5mZW5jZTsKKwkJcGljLT5iaXRfZGVwdGgJCT0gY20tPmJpdF9kZXB0aDsKKwkJcGljLT5zbGljZV90eXBlCQk9IGNtLT5mcmFtZV90eXBlOworCQlwaWMtPnN0cmVhbV9vZmZzZXQJPSBwYmktPnByZV9zdHJlYW1fb2Zmc2V0OworCisJCWlmIChwYmktPmNodW5rKSB7CisJCQlwaWMtPnB0cwk9IHBiaS0+Y2h1bmstPnB0czsKKwkJCXBpYy0+cHRzNjQJPSBwYmktPmNodW5rLT5wdHM2NDsKKwkJCXBpYy0+dGltZXN0YW1wCT0gcGJpLT5jaHVuay0+dGltZXN0YW1wOworCQl9CisKKwkJLyogcG9zdCB2aWRlbyB2ZnJhbWUuICovCisJCXByZXBhcmVfZGlzcGxheV9idWYocGJpLCBwaWMpOworCX0KKworCXJldHVybiAwOworfQorCisKK3ZvaWQgc3dhcF9mcmFtZV9idWZmZXJzKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlpbnQgcmVmX2luZGV4ID0gMDsKKwlzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjb25zdCBjbSA9ICZwYmktPmNvbW1vbjsKKwlzdHJ1Y3QgQnVmZmVyUG9vbF9zICpjb25zdCBwb29sID0gY20tPmJ1ZmZlcl9wb29sOworCXN0cnVjdCBSZWZDbnRCdWZmZXJfcyAqY29uc3QgZnJhbWVfYnVmcyA9IGNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXJlZnJlc2hfcmVmX2ZyYW1lcyhwYmkpOworCXBiaS0+aG9sZF9yZWZfYnVmID0gMDsKKwljbS0+ZnJhbWVfdG9fc2hvdyA9IGdldF9mcmFtZV9uZXdfYnVmZmVyKGNtKTsKKworCWlmIChjbS0+ZnJhbWVfdG9fc2hvdykgeworCQkvKmlmICghcGJpLT5mcmFtZV9wYXJhbGxlbF9kZWNvZGUgfHwgIWNtLT5zaG93X2ZyYW1lKSB7Ki8KKwkJbG9ja19idWZmZXJfcG9vbChwb29sLCBmbGFncyk7CisJCS0tZnJhbWVfYnVmc1tjbS0+bmV3X2ZiX2lkeF0ucmVmX2NvdW50OworCQkvKnByX2luZm8oIltNTVUgREVCVUcgOF0gZGVjIHJlZl9jb3VudFslZF0gOiAlZFxyXG4iLCBjbS0+bmV3X2ZiX2lkeCwKKwkJICoJZnJhbWVfYnVmc1tjbS0+bmV3X2ZiX2lkeF0ucmVmX2NvdW50KTsKKwkJICovCisJCXVubG9ja19idWZmZXJfcG9vbChwb29sLCBmbGFncyk7CisJCS8qfSovCisJfQorCisJLypJbnZhbGlkYXRlIHRoZXNlIHJlZmVyZW5jZXMgdW50aWwgdGhlIG5leHQgZnJhbWUgc3RhcnRzLiovCisJZm9yIChyZWZfaW5kZXggPSAwOyByZWZfaW5kZXggPCAzOyByZWZfaW5kZXgrKykKKwkJY20tPmZyYW1lX3JlZnNbcmVmX2luZGV4XS5pZHggPSAtMTsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIGNoZWNrX3Jlc3luYyh2cHhfY29kZWNfYWxnX3ByaXZfdCAqY29uc3QgY3R4LAorCQkJCWNvbnN0IHN0cnVjdCBWUDlEZWNvZGVyX3MgKmNvbnN0IHBiaSkKK3sKKwkvKiBDbGVhciByZXN5bmMgZmxhZyBpZiB3b3JrZXIgZ290IGEga2V5IGZyYW1lIG9yIGludHJhIG9ubHkgZnJhbWUuKi8KKwlpZiAoY3R4LT5uZWVkX3Jlc3luYyA9PSAxICYmIHBiaS0+bmVlZF9yZXN5bmMgPT0gMCAmJgorCQkocGJpLT5jb21tb24uaW50cmFfb25seSB8fCBwYmktPmNvbW1vbi5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkpCisJCWN0eC0+bmVlZF9yZXN5bmMgPSAwOworfQorI2VuZGlmCisKK2ludCB2cDlfZ2V0X3Jhd19mcmFtZShzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksIHN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpzZCkKK3sKKwlzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjb25zdCBjbSA9ICZwYmktPmNvbW1vbjsKKwlpbnQgcmV0ID0gLTE7CisKKwlpZiAocGJpLT5yZWFkeV9mb3JfbmV3X2RhdGEgPT0gMSkKKwkJcmV0dXJuIHJldDsKKworCXBiaS0+cmVhZHlfZm9yX25ld19kYXRhID0gMTsKKworCS8qIG5vIHJhdyBmcmFtZSB0byBzaG93ISEhICovCisJaWYgKCFjbS0+c2hvd19mcmFtZSkKKwkJcmV0dXJuIHJldDsKKworCS8qIG1heSBub3QgYmUgZ2V0IGJ1ZmYgaW4gdjRsMiAqLworCWlmICghY20tPmZyYW1lX3RvX3Nob3cpCisJCXJldHVybiByZXQ7CisKKwlwYmktPnJlYWR5X2Zvcl9uZXdfZGF0YSA9IDE7CisKKwkqc2QgPSAqY20tPmZyYW1lX3RvX3Nob3c7CisJcmV0ID0gMDsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCB2cDlfYnVmbWdyX2luaXQoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLCBzdHJ1Y3QgQnVmZkluZm9fcyAqYnVmX3NwZWNfaSwKKwkJc3RydWN0IGJ1ZmZfcyAqbWNfYnVmX2kpIHsKKwlzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjbSA9ICZwYmktPmNvbW1vbjsKKworCS8qbWVtc2V0KHBiaSwgMCwgc2l6ZW9mKHN0cnVjdCBWUDlEZWNvZGVyX3MpKTsqLworCXBiaS0+ZnJhbWVfY291bnQgPSAwOworCXBiaS0+cGljX2NvdW50ID0gMDsKKwlwYmktPnByZV9zdHJlYW1fb2Zmc2V0ID0gMDsKKwljbS0+YnVmZmVyX3Bvb2wgPSAmcGJpLT52cDlfYnVmZmVyX3Bvb2w7CisJc3Bpbl9sb2NrX2luaXQoJmNtLT5idWZmZXJfcG9vbC0+bG9jayk7CisJY20tPnByZXZfZmJfaWR4ID0gSU5WQUxJRF9JRFg7CisJY20tPm5ld19mYl9pZHggPSBJTlZBTElEX0lEWDsKKwlwYmktPnVzZWRfNGtfbnVtID0gLTE7CisJY20tPmN1cl9mYl9pZHhfbW11ID0gSU5WQUxJRF9JRFg7CisJcHJfZGVidWcKKwkoIkFmdGVyIHZwOV9idWZtZ3JfaW5pdCwgcHJldl9mYl9pZHggOiAlZCwgbmV3X2ZiX2lkeCA6ICVkXHJcbiIsCisJCWNtLT5wcmV2X2ZiX2lkeCwgY20tPm5ld19mYl9pZHgpOworCXBiaS0+bmVlZF9yZXN5bmMgPSAxOworCS8qIEluaXRpYWxpemUgdGhlIHJlZmVyZW5jZXMgdG8gbm90IHBvaW50IHRvIGFueSBmcmFtZSBidWZmZXJzLiovCisJbWVtc2V0KCZjbS0+cmVmX2ZyYW1lX21hcCwgLTEsIHNpemVvZihjbS0+cmVmX2ZyYW1lX21hcCkpOworCW1lbXNldCgmY20tPm5leHRfcmVmX2ZyYW1lX21hcCwgLTEsIHNpemVvZihjbS0+bmV4dF9yZWZfZnJhbWVfbWFwKSk7CisJY20tPmN1cnJlbnRfdmlkZW9fZnJhbWUgPSAwOworCXBiaS0+cmVhZHlfZm9yX25ld19kYXRhID0gMTsKKworCS8qIHByaXZhdGUgaW5pdCAqLworCXBiaS0+d29ya19zcGFjZV9idWYgPSBidWZfc3BlY19pOworCWlmICghcGJpLT5tbXVfZW5hYmxlKQorCQlwYmktPm1jX2J1ZiA9IG1jX2J1Zl9pOworCisJcGJpLT5ycG1fYWRkciA9IE5VTEw7CisJcGJpLT5sbWVtX2FkZHIgPSBOVUxMOworCisJcGJpLT51c2VfY21hX2ZsYWcgPSAwOworCXBiaS0+ZGVjb2RlX2lkeCA9IDA7CisJcGJpLT5zbGljZV9pZHggPSAwOworCS8qaW50IG1fdWlNYXhDVVdpZHRoID0gMTw8NzsqLworCS8qaW50IG1fdWlNYXhDVUhlaWdodCA9IDE8PDc7Ki8KKwlwYmktPmhhc19rZXlmcmFtZSA9IDA7CisJcGJpLT5za2lwX2ZsYWcgPSAwOworCXBiaS0+d2FpdF9idWYgPSAwOworCXBiaS0+ZXJyb3JfZmxhZyA9IDA7CisKKwlwYmktPnB0c19tb2RlID0gUFRTX05PUk1BTDsKKwlwYmktPmxhc3RfcHRzID0gMDsKKwlwYmktPmxhc3RfbG9va3VwX3B0cyA9IDA7CisJcGJpLT5sYXN0X3B0c191czY0ID0gMDsKKwlwYmktPmxhc3RfbG9va3VwX3B0c191czY0ID0gMDsKKwlwYmktPnNoaWZ0X2J5dGVfY291bnQgPSAwOworCXBiaS0+c2hpZnRfYnl0ZV9jb3VudF9sbyA9IDA7CisJcGJpLT5zaGlmdF9ieXRlX2NvdW50X2hpID0gMDsKKwlwYmktPnB0c19tb2RlX3N3aXRjaGluZ19jb3VudCA9IDA7CisJcGJpLT5wdHNfbW9kZV9yZWNvdmVyeV9jb3VudCA9IDA7CisKKwlwYmktPmJ1Zl9udW0gPSAwOworCXBiaS0+cGljX251bSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHZwOV9idWZtZ3JfcG9zdHByb2Moc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKHBiaSk7CisJc3RydWN0IFZQOV9Db21tb25fcyAqY20gPSAmcGJpLT5jb21tb247CisJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3Mgc2Q7CisKKwlpZiAocGJpLT5wb3N0cHJvY19kb25lKQorCQlyZXR1cm4gMDsKKwlwYmktPnBvc3Rwcm9jX2RvbmUgPSAxOworCXN3YXBfZnJhbWVfYnVmZmVycyhwYmkpOworCWlmICghY20tPnNob3dfZXhpc3RpbmdfZnJhbWUpIHsKKwkJY20tPmxhc3Rfc2hvd19mcmFtZSA9IGNtLT5zaG93X2ZyYW1lOworCQljbS0+cHJldl9mcmFtZSA9IGNtLT5jdXJfZnJhbWU7CisjaWYgMAorCWlmIChjbS0+c2VnLmVuYWJsZWQgJiYgIXBiaS0+ZnJhbWVfcGFyYWxsZWxfZGVjb2RlKQorCQl2cDlfc3dhcF9jdXJyZW50X2FuZF9sYXN0X3NlZ19tYXAoY20pOworI2VuZGlmCisJfQorCWNtLT5sYXN0X3dpZHRoID0gY20tPndpZHRoOworCWNtLT5sYXN0X2hlaWdodCA9IGNtLT5oZWlnaHQ7CisJcGJpLT5sYXN0X3dpZHRoID0gY20tPndpZHRoOworCXBiaS0+bGFzdF9oZWlnaHQgPSBjbS0+aGVpZ2h0OworCisJaWYgKGNtLT5zaG93X2ZyYW1lKQorCQljbS0+Y3VycmVudF92aWRlb19mcmFtZSsrOworCisJaWYgKHZwOV9nZXRfcmF3X2ZyYW1lKHBiaSwgJnNkKSA9PSAwKSB7CisJCS8qcHJfaW5mbygiRGlzcGxheSBmcmFtZSBpbmRleCAlZFxyXG4iLCBzZC5pbmRleCk7Ki8KKwkJc2Quc3RyZWFtX29mZnNldCA9IHBiaS0+cHJlX3N0cmVhbV9vZmZzZXQ7CisKKwkJaWYgKHBiaS0+ZW5hYmxlX2ZlbmNlKSB7CisJCQlpbnQgaSwgaiwgdXNlZF9zaXplLCByZXQ7CisJCQlpbnQgc2lnbmVkX2NvdW50ID0gMDsKKwkJCXN0cnVjdCB2ZnJhbWVfcyAqc2lnbmVkX2ZlbmNlW1ZGX1BPT0xfU0laRV07CisJCQkvKiBub3RpZnkgc2lnbmFsIHRvIHdha2UgdXAgd3Egb2YgZmVuY2UuICovCisJCQl2ZGVjX3RpbWVsaW5lX2luY3JlYXNlKHZkZWMtPnN5bmMsIDEpOworCQkJbXV0ZXhfbG9jaygmcGJpLT5mZW5jZV9tdXRleCk7CisJCQl1c2VkX3NpemUgPSBwYmktPmZlbmNlX3ZmX3MudXNlZF9zaXplOworCQkJaWYgKHVzZWRfc2l6ZSkgeworCQkJCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgVkZfUE9PTF9TSVpFICYmIGogPCB1c2VkX3NpemU7IGkrKykgeworCQkJCQlpZiAocGJpLT5mZW5jZV92Zl9zLmZlbmNlX3ZmW2ldICE9IE5VTEwpIHsKKwkJCQkJCXJldCA9IGRtYV9mZW5jZV9nZXRfc3RhdHVzKHBiaS0+ZmVuY2VfdmZfcy5mZW5jZV92ZltpXS0+ZmVuY2UpOworCQkJCQkJaWYgKHJldCA9PSAxKSB7CisJCQkJCQkJc2lnbmVkX2ZlbmNlW3NpZ25lZF9jb3VudF0gPSBwYmktPmZlbmNlX3ZmX3MuZmVuY2VfdmZbaV07CisJCQkJCQkJcGJpLT5mZW5jZV92Zl9zLmZlbmNlX3ZmW2ldID0gTlVMTDsKKwkJCQkJCQlwYmktPmZlbmNlX3ZmX3MudXNlZF9zaXplLS07CisJCQkJCQkJc2lnbmVkX2NvdW50Kys7CisJCQkJCQl9CisJCQkJCQlqKys7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQltdXRleF91bmxvY2soJnBiaS0+ZmVuY2VfbXV0ZXgpOworCQkJaWYgKHNpZ25lZF9jb3VudCAhPSAwKSB7CisJCQkJZm9yIChpID0gMDsgaSA8IHNpZ25lZF9jb3VudDsgaSsrKQorCQkJCQl2dnA5X3ZmX3B1dChzaWduZWRfZmVuY2VbaV0sIHZkZWMpOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJlcGFyZV9kaXNwbGF5X2J1ZihwYmksICZzZCk7CisJCX0KKworCQlwYmktPnByZV9zdHJlYW1fb2Zmc2V0ID0gUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCk7CisJfQorCisvKiBlbHNlCisgKgkJcHJfaW5mbworICoJCSgiTm90IGRpc3BsYXkgdGhpcyBmcmFtZSxyZWFkeV9mb3JfbmV3X2RhdGElZCBzaG93X2ZyYW1lJWRcclxuIiwKKyAqCQlwYmktPnJlYWR5X2Zvcl9uZXdfZGF0YSwgY20tPnNob3dfZnJhbWUpOworICovCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqVlA5IGJ1ZmZlciBtYW5hZ2VtZW50IGVuZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisKKyNkZWZpbmUgSEVWQ19DTV9CT0RZX1NUQVJUX0FERFIgICAgICAgICAgICAgICAgICAgIDB4MzYyNgorI2RlZmluZSBIRVZDX0NNX0JPRFlfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgMHgzNjI3CisjZGVmaW5lIEhFVkNfQ01fSEVBREVSX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgICAweDM2MjkKKyNkZWZpbmUgSEVWQ19DTV9IRUFERVJfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgIDB4MzYyYgorCisjZGVmaW5lIEhFVkNfQ01fQk9EWV9MRU5HVEgyICAgICAgICAgICAgICAgICAgICAgICAweDM2NjMKKyNkZWZpbmUgSEVWQ19DTV9IRUFERVJfT0ZGU0VUMiAgICAgICAgICAgICAgICAgICAgIDB4MzY2NAorI2RlZmluZSBIRVZDX0NNX0hFQURFUl9MRU5HVEgyICAgICAgICAgICAgICAgICAgICAgMHgzNjY1CisjZGVmaW5lIExPU0xFU1NfQ09NUFJFU1NfTU9ERQorCisvKiNkZWZpbmUgREVDT01QX0hFQURSX1NVUkdFTlQqLworI2lmZGVmIFZQOV8xMEJfTlYyMQorc3RhdGljIHUzMiBtZW1fbWFwX21vZGUgPSAyICAvKiAwOmxpbmVhciAxOjMyeDMyIDI6NjR4MzIqLworI2Vsc2UKK3N0YXRpYyB1MzIgbWVtX21hcF9tb2RlOyAvKiAwOmxpbmVhciAxOjMyeDMyIDI6NjR4MzIgOyBtOGJhYnkgdGVzdDE5MDIgKi8KKyNlbmRpZgorc3RhdGljIHUzMiBlbmFibGVfbWVtX3NhdmluZyA9IDE7CitzdGF0aWMgdTMyIGZvcmNlX3dfaDsKKworc3RhdGljIHUzMiBmb3JjZV9mcHM7CisKKworY29uc3QgdTMyIHZwOV92ZXJzaW9uID0gMjAxNjAyMTAxOworc3RhdGljIHUzMiBkZWJ1ZzsKK3N0YXRpYyB1MzIgcmFkcjsKK3N0YXRpYyB1MzIgcnZhbDsKK3N0YXRpYyB1MzIgcG9wX3Nob3J0czsKK3N0YXRpYyB1MzIgZGJnX2NtZDsKK3N0YXRpYyB1MzIgZGJnX3NraXBfZGVjb2RlX2luZGV4OworCisvKgorICogYml0IDB+MywgZm9yIEhFVkNEX0lQUF9BWElJRl9DT05GSUcgZW5kaWFuIGNvbmZpZworICogYml0IDh+MjMsIGZvciBIRVZDX1NBT19DVFJMMSBlbmRpYW4gY29uZmlnCisgKi8KK3N0YXRpYyB1MzIgZW5kaWFuOworI2RlZmluZSBIRVZDX0NPTkZJR19CSUdfRU5ESUFOICAgICAoKDB4ODgwIDw8IDgpIHwgMHg4KQorI2RlZmluZSBIRVZDX0NPTkZJR19MSVRUTEVfRU5ESUFOICAoKDB4ZmYwIDw8IDgpIHwgMHhmKQorCisjaWZkZWYgRVJST1JfSEFORExFX0RFQlVHCitzdGF0aWMgdTMyIGRiZ19uYWxfc2tpcF9mbGFnOworCQkvKiBiaXRbMF0sIHNraXAgdnBzOyBiaXRbMV0sIHNraXAgc3BzOyBiaXRbMl0sIHNraXAgcHBzICovCitzdGF0aWMgdTMyIGRiZ19uYWxfc2tpcF9jb3VudDsKKyNlbmRpZgorLypmb3IgZGVidWcqLworc3RhdGljIHUzMiBkZWNvZGVfcGljX2JlZ2luOworc3RhdGljIHVpbnQgc2xpY2VfcGFyc2VfYmVnaW47CitzdGF0aWMgdTMyIHN0ZXA7CitzdGF0aWMgdTMyIHZwOV9tYXhfcGljX3c7CitzdGF0aWMgdTMyIHZwOV9tYXhfcGljX2g7CitzdGF0aWMgdTMyIGR5bmFtaWNfYnVmX251bV9tYXJnaW47CisKK3N0YXRpYyB1MzIgYnVmX2FsbG9jX2RlcHRoID0gMTA7CitzdGF0aWMgdTMyIGJ1Zl9hbGxvY19zaXplOworLyoKKyAqYml0WzBdOiAwLAorICogICAgYml0WzFdOiAwLCBhbHdheXMgcmVsZWFzZSBjbWEgYnVmZmVyIHdoZW4gc3RvcAorICogICAgYml0WzFdOiAxLCBuZXZlciByZWxlYXNlIGNtYSBidWZmZXIgd2hlbiBzdG9wCisgKmJpdFswXTogMSwgd2hlbiBzdG9wLCByZWxlYXNlIGNtYSBidWZmZXIgaWYgYmxhY2tvdXQgaXMgMTsKKyAqZG8gbm90IHJlbGVhc2UgY21hIGJ1ZmZlciBpcyBibGFja291dCBpcyBub3QgMQorICoKKyAqYml0WzJdOiAwLCB3aGVuIHN0YXJ0IGRlY29kaW5nLCBjaGVjayBjdXJyZW50IGRpc3BsYXllZCBidWZmZXIKKyAqCSAob25seSBmb3IgYnVmZmVyIGRlY29kZWQgYnkgdnA5KSBpZiBibGFja291dCBpcyAwCisgKgkgMSwgZG8gbm90IGNoZWNrIGN1cnJlbnQgZGlzcGxheWVkIGJ1ZmZlcgorICoKKyAqYml0WzNdOiAxLCBpZiBibGFja291dCBpcyBub3QgMSwgZG8gbm90IHJlbGVhc2UgY3VycmVudAorICoJCQlkaXNwbGF5ZWQgY21hIGJ1ZmZlciBhbHdheXMuCisgKi8KKy8qIHNldCB0byAxIGZvciBmYXN0IHBsYXk7CisgKglzZXQgdG8gOCBmb3Igb3RoZXIgY2FzZSBvZiAia2VlcCBsYXN0IGZyYW1lIgorICovCitzdGF0aWMgdTMyIGJ1ZmZlcl9tb2RlID0gMTsKKy8qIGJ1ZmZlcl9tb2RlX2RiZzogZGVidWcgb25seSovCitzdGF0aWMgdTMyIGJ1ZmZlcl9tb2RlX2RiZyA9IDB4ZmZmZjAwMDA7CisvKiovCisKKy8qCisgKmJpdCAwLCAxOiBvbmx5IGRpc3BsYXkgSSBwaWN0dXJlOworICpiaXQgMSwgMTogb25seSBkZWNvZGUgSSBwaWN0dXJlOworICovCitzdGF0aWMgdTMyIGlfb25seV9mbGFnOworCitzdGF0aWMgdTMyIGxvd19sYXRlbmN5X2ZsYWc7CisKK3N0YXRpYyB1MzIgbm9faGVhZDsKKworc3RhdGljIHUzMiBtYXhfZGVjb2RpbmdfdGltZTsKKy8qCisgKmVycm9yIGhhbmRsaW5nCisgKi8KKy8qZXJyb3JfaGFuZGxlX3BvbGljeToKKyAqYml0IDA6IDAsIGF1dG8gc2tpcCBlcnJvcl9za2lwX25hbF9jb3VudCBuYWxzIGJlZm9yZSBlcnJvciByZWNvdmVyeTsKKyAqMSwgc2tpcCBlcnJvcl9za2lwX25hbF9jb3VudCBuYWxzIGJlZm9yZSBlcnJvciByZWNvdmVyeTsKKyAqYml0IDEgKHZhbGlkIG9ubHkgd2hlbiBiaXQwID09IDEpOgorICoxLCB3YWl0IHZwcy9zcHMvcHBzIGFmdGVyIGVycm9yIHJlY292ZXJ5OworICpiaXQgMiAodmFsaWQgb25seSB3aGVuIGJpdDAgPT0gMCk6CisgKjAsIGF1dG8gc2VhcmNoIGFmdGVyIGVycm9yIHJlY292ZXJ5ICh2cDlfcmVjb3ZlcigpIGNhbGxlZCk7CisgKjEsIG1hbnVhbCBzZWFyY2ggYWZ0ZXIgZXJyb3IgcmVjb3ZlcnkKKyAqKGNoYW5nZSB0byBhdXRvIHNlYXJjaCBhZnRlciBnZXQgSURSOiBXUklURV9WUkVHKE5BTF9TRUFSQ0hfQ1RMLCAweDIpKQorICoKKyAqYml0IDQ6IDAsIHNldCBlcnJvcl9tYXJrIGFmdGVyIHJlc2V0L3JlY292ZXIKKyAqICAgIDEsIGRvIG5vdCBzZXQgZXJyb3JfbWFyayBhZnRlciByZXNldC9yZWNvdmVyCisgKmJpdCA1OiAwLCBjaGVjayB0b3RhbCBsY3UgZm9yIGV2ZXJ5IHBpY3R1cmUKKyAqICAgIDEsIGRvIG5vdCBjaGVjayB0b3RhbCBsY3UKKyAqCisgKi8KKworc3RhdGljIHUzMiBlcnJvcl9oYW5kbGVfcG9saWN5OworLypzdGF0aWMgdTMyIHBhcnNlcl9zZWlfZW5hYmxlID0gMTsqLworI2RlZmluZSBNQVhfQlVGX05VTV9OT1JNQUwgICAgIDEyCisjZGVmaW5lIE1BWF9CVUZfTlVNX0xFU1MgICAxMAorc3RhdGljIHUzMiBtYXhfYnVmX251bSA9IE1BWF9CVUZfTlVNX05PUk1BTDsKKyNkZWZpbmUgTUFYX0JVRl9OVU1fU0FWRV9CVUYgIDgKKworc3RhdGljIHUzMiBydW5fcmVhZHlfbWluX2J1Zl9udW0gPSAyOworCisKK3N0YXRpYyBERUZJTkVfTVVURVgodnZwOV9tdXRleCk7CisjaWZuZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICpjbWFfZGV2OworI2VuZGlmCisKKyNkZWZpbmUgSEVWQ19ERUNfU1RBVFVTX1JFRyAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzAKKyNkZWZpbmUgSEVWQ19SUE1fQlVGRkVSICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzEKKyNkZWZpbmUgSEVWQ19TSE9SVF9URVJNX1JQUyAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzIKKyNkZWZpbmUgVlA5X0FEQVBUX1BST0JfUkVHICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzMKKyNkZWZpbmUgVlA5X01NVV9NQVBfQlVGRkVSICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzQKKyNkZWZpbmUgSEVWQ19QUFNfQlVGRkVSICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzUKKy8vI2RlZmluZSBIRVZDX1NBT19VUCAgICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfNgorI2RlZmluZSBIRVZDX1NUUkVBTV9TV0FQX0JVRkZFUiAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfNworI2RlZmluZSBIRVZDX1NUUkVBTV9TV0FQX0JVRkZFUjIgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfOAorI2RlZmluZSBWUDlfUFJPQl9TV0FQX0JVRkZFUiAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfOQorI2RlZmluZSBWUDlfQ09VTlRfU1dBUF9CVUZGRVIgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfQQorI2RlZmluZSBWUDlfU0VHX01BUF9CVUZGRVIgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfQgorLy8jZGVmaW5lIEhFVkNfU0NBTEVMVVQgICAgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9ECisjZGVmaW5lIEhFVkNfV0FJVF9GTEFHICAgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9FCisjZGVmaW5lIFJQTV9DTURfUkVHICAgICAgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9GCisjZGVmaW5lIExNRU1fRFVNUF9BRFIgICAgICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfRgorI2RlZmluZSBIRVZDX1NUUkVBTV9TV0FQX1RFU1QgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfTAorI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKyNkZWZpbmUgSEVWQ19ERUNPREVfQ09VTlQgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9NCisjZGVmaW5lIEhFVkNfREVDT0RFX1NJWkUJCUhFVkNfQVNTSVNUX1NDUkFUQ0hfTgorI2Vsc2UKKyNkZWZpbmUgSEVWQ19ERUNPREVfUElDX0JFR0lOX1JFRyBIRVZDX0FTU0lTVF9TQ1JBVENIX00KKyNkZWZpbmUgSEVWQ19ERUNPREVfUElDX05VTV9SRUcgICBIRVZDX0FTU0lTVF9TQ1JBVENIX04KKyNlbmRpZgorI2RlZmluZSBERUJVR19SRUcxICAgICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0cKKyNkZWZpbmUgREVCVUdfUkVHMiAgICAgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9ICisKKworLyoKKyAqdWNvZGUgcGFyc2VyL3NlYXJjaCBjb250cm9sCisgKmJpdCAwOiAgMCwgaGVhZGVyIGF1dG8gcGFyc2U7IDEsIGhlYWRlciBtYW51YWwgcGFyc2UKKyAqYml0IDE6ICAwLCBhdXRvIHNraXAgZm9yIG5vbmVzZWFtbGVzcyBzdHJlYW07IDEsIG5vIHNraXAKKyAqYml0IFszOjJdOiB2YWxpZCB3aGVuIGJpdDE9PTA7CisgKjAsIGF1dG8gc2tpcCBuYWwgYmVmb3JlIGZpcnN0IHZwcy9zcHMvcHBzL2lkcjsKKyAqMSwgYXV0byBza2lwIG5hbCBiZWZvcmUgZmlyc3QgdnBzL3Nwcy9wcHMKKyAqMiwgYXV0byBza2lwIG5hbCBiZWZvcmUgZmlyc3QgIHZwcy9zcHMvcHBzLAorICoJYW5kIG5vdCBkZWNvZGUgdW50aWwgdGhlIGZpcnN0IEkgc2xpY2UgKHdpdGggc2xpY2UgYWRkcmVzcyBvZiAwKQorICoKKyAqMywgYXV0byBza2lwIGJlZm9yZSBmaXJzdCBJIHNsaWNlIChuYWxfdHlwZSA+PTE2ICYmIG5hbF90eXBlPD0yMSkKKyAqYml0IFsxNTo0XSBuYWwgc2tpcCBjb3VudCAodmFsaWQgd2hlbiBiaXQwID09IDEgKG1hbnVhbCBtb2RlKSApCisgKmJpdCBbMTZdOiBmb3IgTkFMX1VOSVRfRU9TIHdoZW4gYml0MCBpcyAwOgorICoJMCwgc2VuZCBTRUFSQ0hfRE9ORSB0byBhcm0gOyAgMSwgZG8gbm90IHNlbmQgU0VBUkNIX0RPTkUgdG8gYXJtCisgKmJpdCBbMTddOiBmb3IgTkFMX1NFSSB3aGVuIGJpdDAgaXMgMDoKKyAqCTAsIGRvIG5vdCBwYXJzZSBTRUkgaW4gdWNvZGU7IDEsIHBhcnNlIFNFSSBpbiB1Y29kZQorICpiaXQgWzMxOjIwXTogdXNlZCBieSB1Y29kZSBmb3IgZGVidWcgcHVycG9zZQorICovCisjZGVmaW5lIE5BTF9TRUFSQ0hfQ1RMICAgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9JCisJLypbMzE6MjRdIGNoaXAgZmVhdHVyZQorCQkzMTogMCwgdXNlIE1CT1gxOyAxLCB1c2UgTUJPWDAKKwkqLworI2RlZmluZSBERUNPREVfTU9ERSAgICAgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9KCisjZGVmaW5lIERFQ09ERV9TVE9QX1BPUyAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfSworCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorI2RlZmluZSBSUE1fQlVGX1NJWkUgKDB4NDAwICogMikKKyNlbHNlCisjZGVmaW5lIFJQTV9CVUZfU0laRSAoMHg4MCoyKQorI2VuZGlmCisjZGVmaW5lIExNRU1fQlVGX1NJWkUgKDB4NDAwICogMikKKworLy8jZGVmaW5lIFZCSF9CVUZfU0laRSAoMiAqIDE2ICogMjMwNCkKKy8vI2RlZmluZSBWQkhfQlVGX0NPVU5UIDQKKworCS8qbW11X3ZiaCBidWYgaXMgdXNlZCBieSBIRVZDX1NBT19NTVVfVkgwX0FERFIsIEhFVkNfU0FPX01NVV9WSDFfQUREUiovCisjZGVmaW5lIFZCSF9CVUZfU0laRV8xMDgwUCAweDMwMDAKKyNkZWZpbmUgVkJIX0JVRl9TSVpFXzRLIDB4NTAwMAorI2RlZmluZSBWQkhfQlVGX1NJWkVfOEsgMHhhMDAwCisjZGVmaW5lIFZCSF9CVUZfU0laRShidWZzcGVjKSAoYnVmc3BlYy0+bW11X3ZiaC5idWZfc2l6ZSAvIDIpCisJLyptbXVfdmJoX2R3IGJ1ZiBpcyB1c2VkIGJ5IEhFVkNfU0FPX01NVV9WSDBfQUREUjIsSEVWQ19TQU9fTU1VX1ZIMV9BRERSMiwKKwkJSEVWQ19EV19WSDBfQURERFIsIEhFVkNfRFdfVkgxX0FERERSKi8KKyNkZWZpbmUgRFdfVkJIX0JVRl9TSVpFXzEwODBQIChWQkhfQlVGX1NJWkVfMTA4MFAgKiAyKQorI2RlZmluZSBEV19WQkhfQlVGX1NJWkVfNEsgKFZCSF9CVUZfU0laRV80SyAqIDIpCisjZGVmaW5lIERXX1ZCSF9CVUZfU0laRV84SyAoVkJIX0JVRl9TSVpFXzhLICogMikKKyNkZWZpbmUgRFdfVkJIX0JVRl9TSVpFKGJ1ZnNwZWMpIChidWZzcGVjLT5tbXVfdmJoX2R3LmJ1Zl9zaXplIC8gNCkKKworLyogbmVjZXNzYXJ5IDRLIHBhZ2Ugc2l6ZSBhbGlnbiBmb3IgdDcvdDMgZGVjb2RlciBhbmQgYWZ0ZXIgKi8KKyNkZWZpbmUgV09SS0JVRl9BTElHTihhZGRyKSAoQUxJR04oYWRkciwgUEFHRV9TSVpFKSkKKworI2RlZmluZSBXT1JLX0JVRl9TUEVDX05VTSA2CitzdGF0aWMgc3RydWN0IEJ1ZmZJbmZvX3MgYW12dnA5X3dvcmtidWZmX3NwZWNbV09SS19CVUZfU1BFQ19OVU1dID0geworCXsKKwkJLyogOE0gYnl0ZXMgKi8KKwkJLm1heF93aWR0aCA9IDE5MjAsCisJCS5tYXhfaGVpZ2h0ID0gMTA4OCwKKwkJLmlwcCA9IHsKKwkJCS8qIElQUCB3b3JrIHNwYWNlIGNhbGN1bGF0aW9uIDoKKwkJCSAqICAgNDA5NiAqIChZK0NiQ3IrRmxhZ3MpID0gMTJrLCByb3VuZCB0byAxNmsKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg0MDAwLAorCQl9LAorCQkuc2FvX2FidiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MzAwMDAsCisJCX0sCisJCS5zYW9fdmIgPSB7CisJCQkuYnVmX3NpemUgPSAweDMwMDAwLAorCQl9LAorCQkuc2hvcnRfdGVybV9ycHMgPSB7CisJCQkvKiBTSE9SVF9URVJNX1JQUyAtIE1heCA2NCBzZXQsIDE2IGVudHJ5IGV2ZXJ5IHNldCwKKwkJCSAqICAgdG90YWwgNjR4MTZ4MiA9IDIwNDggYnl0ZXMgKDB4ODAwKQorCQkJICovCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnZwcyA9IHsKKwkJCS8qIFZQUyBTVE9SRSBBUkVBIC0gTWF4IDE2IFZQUywgZWFjaCBoYXMgMHg4MCBieXRlcywKKwkJCSAqICAgdG90YWwgMHgwODAwIGJ5dGVzCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc3BzID0geworCQkJLyogU1BTIFNUT1JFIEFSRUEgLSBNYXggMTYgU1BTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLAorCQkJICogICB0b3RhbCAweDA4MDAgYnl0ZXMKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5wcHMgPSB7CisJCQkvKiBQUFMgU1RPUkUgQVJFQSAtIE1heCA2NCBQUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsCisJCQkgKiAgIHRvdGFsIDB4MjAwMCBieXRlcworCQkJICovCisJCQkuYnVmX3NpemUgPSAweDIwMDAsCisJCX0sCisJCS5zYW9fdXAgPSB7CisJCQkvKiBTQU8gVVAgU1RPUkUgQVJFQSAtIE1heCA2NDAoMTAyNDAvMTYpIExDVSwKKwkJCSAqICAgZWFjaCBoYXMgMTYgYnl0ZXMgdG90YWwgMHgyODAwIGJ5dGVzCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4MjgwMCwKKwkJfSwKKwkJLnN3YXBfYnVmID0geworCQkJLyogMjU2Y3ljbGV4NjRiaXQgPSAySyBieXRlcyAweDgwMAorCQkJICogICAob25seSAxNDQgY3ljbGVzIHZhbGlkKQorCQkJICovCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnN3YXBfYnVmMiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc2NhbGVsdXQgPSB7CisJCQkvKiBzdXBwb3J0IHVwIHRvIDMyIFNDQUxFTFVUIDEwMjR4MzIgPQorCQkJICogICAzMktieXRlcyAoMHg4MDAwKQorCQkJICovCisJCQkuYnVmX3NpemUgPSAweDgwMDAsCisJCX0sCisJCS5kYmxrX3BhcmEgPSB7CisJCQkvKiBEQkxLIC0+IE1heCAyNTYoNDA5Ni8xNikgTENVLAorCQkJICplYWNoIHBhcmEgMTAyNGJ5dGVzKHRvdGFsOjB4NDAwMDApLAorCQkJICpkYXRhIDEwMjRieXRlcyh0b3RhbDoweDQwMDAwKQorCQkJICovCisJCQkuYnVmX3NpemUgPSAweDgwMDAwLAorCQl9LAorCQkuZGJsa19kYXRhID0geworCQkJLmJ1Zl9zaXplID0gMHg4MDAwMCwKKwkJfSwKKwkJLnNlZ19tYXAgPSB7CisJCS8qNDA5NngyMzA0LzY0LzY0ICoyNCA9IDB4ZDgwMCBCeXRlcyovCisJCQkuYnVmX3NpemUgPSAweGQ4MDAsCisJCX0sCisJCS5tbXVfdmJoID0geworCQkJLmJ1Zl9zaXplID0gMHg1MDAwLCAvKjIqMTYqKG1vcmUgdGhhbiAyMzA0KS80LCA0SyovCisJCX0sCisjaWYgMAorCQkuY21faGVhZGVyID0geworCQkJLyphZGQgb25lIGZvciBrZWVwZXIuKi8KKwkJCS5idWZfc2l6ZSA9IE1NVV9DT01QUkVTU19IRUFERVJfU0laRSAqCisJCQkJCQkoRlJBTUVfQlVGRkVSUyArIDEpLAorCQkJLyogMHg0NDAwMCA9ICgoMTA4OCoyKjEwMjQqNCkvMzIvNCkqKDMyLzgpICovCisJCX0sCisjZW5kaWYKKwkJLm1wcmVkX2Fib3ZlID0geworCQkJLmJ1Zl9zaXplID0gMHgxMDAwMCwgLyogMiAqIHNpemUgb2YgaGV2YyovCisJCX0sCisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCQkubXByZWRfbXYgPSB7LyogMTA4MHAsIDB4NDAwMDAgcGVyIGJ1ZmZlciAqLworCQkJLmJ1Zl9zaXplID0gMHg0MDAwMCAqIEZSQU1FX0JVRkZFUlMsCisJCX0sCisjZW5kaWYKKwkJLnJwbSA9IHsKKwkJCS5idWZfc2l6ZSA9IFJQTV9CVUZfU0laRSwKKwkJfSwKKwkJLmxtZW0gPSB7CisJCQkuYnVmX3NpemUgPSAweDQwMCAqIDIsCisJCX0KKwl9LAorCXsKKwkJLm1heF93aWR0aCA9IDQwOTYsCisJCS5tYXhfaGVpZ2h0ID0gMjMwNCwKKwkJLmlwcCA9IHsKKwkJCS8qIElQUCB3b3JrIHNwYWNlIGNhbGN1bGF0aW9uIDoKKwkJCSAqICAgNDA5NiAqIChZK0NiQ3IrRmxhZ3MpID0gMTJrLCByb3VuZCB0byAxNmsKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg0MDAwLAorCQl9LAorCQkuc2FvX2FidiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MzAwMDAsCisJCX0sCisJCS5zYW9fdmIgPSB7CisJCQkuYnVmX3NpemUgPSAweDMwMDAwLAorCQl9LAorCQkuc2hvcnRfdGVybV9ycHMgPSB7CisJCQkvKiBTSE9SVF9URVJNX1JQUyAtIE1heCA2NCBzZXQsIDE2IGVudHJ5IGV2ZXJ5IHNldCwKKwkJCSAqICAgdG90YWwgNjR4MTZ4MiA9IDIwNDggYnl0ZXMgKDB4ODAwKQorCQkJICovCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnZwcyA9IHsKKwkJCS8qIFZQUyBTVE9SRSBBUkVBIC0gTWF4IDE2IFZQUywgZWFjaCBoYXMgMHg4MCBieXRlcywKKwkJCSAqICAgdG90YWwgMHgwODAwIGJ5dGVzCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc3BzID0geworCQkJLyogU1BTIFNUT1JFIEFSRUEgLSBNYXggMTYgU1BTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLAorCQkJICogICB0b3RhbCAweDA4MDAgYnl0ZXMKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5wcHMgPSB7CisJCQkvKiBQUFMgU1RPUkUgQVJFQSAtIE1heCA2NCBQUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsCisJCQkgKiAgIHRvdGFsIDB4MjAwMCBieXRlcworCQkJICovCisJCQkuYnVmX3NpemUgPSAweDIwMDAsCisJCX0sCisJCS5zYW9fdXAgPSB7CisJCQkvKiBTQU8gVVAgU1RPUkUgQVJFQSAtIE1heCA2NDAoMTAyNDAvMTYpIExDVSwKKwkJCSAqICAgZWFjaCBoYXMgMTYgYnl0ZXMgdG90YWwgMHgyODAwIGJ5dGVzCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4MjgwMCwKKwkJfSwKKwkJLnN3YXBfYnVmID0geworCQkJLyogMjU2Y3ljbGV4NjRiaXQgPSAySyBieXRlcyAweDgwMAorCQkJICogICAob25seSAxNDQgY3ljbGVzIHZhbGlkKQorCQkJICovCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnN3YXBfYnVmMiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc2NhbGVsdXQgPSB7CisJCQkvKiBzdXBwb3J0IHVwIHRvIDMyIFNDQUxFTFVUIDEwMjR4MzIgPSAzMktieXRlcworCQkJICogICAoMHg4MDAwKQorCQkJICovCisJCQkuYnVmX3NpemUgPSAweDgwMDAsCisJCX0sCisJCS5kYmxrX3BhcmEgPSB7CisJCQkvKiBEQkxLIC0+IE1heCAyNTYoNDA5Ni8xNikgTENVLAorCQkJICplYWNoIHBhcmEgMTAyNGJ5dGVzKHRvdGFsOjB4NDAwMDApLAorCQkJICpkYXRhIDEwMjRieXRlcyh0b3RhbDoweDQwMDAwKQorCQkJICovCisJCQkuYnVmX3NpemUgPSAweDgwMDAwLAorCQl9LAorCQkuZGJsa19kYXRhID0geworCQkJLmJ1Zl9zaXplID0gMHg4MDAwMCwKKwkJfSwKKwkJLnNlZ19tYXAgPSB7CisJCQkvKjQwOTZ4MjMwNC82NC82NCAqMjQgPSAweGQ4MDAgQnl0ZXMqLworCQkJLmJ1Zl9zaXplID0gMHhkODAwLAorCQl9LAorCQkubW11X3ZiaCA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4NTAwMCwvKjIqMTYqKG1vcmUgdGhhbiAyMzA0KS80LCA0SyovCisJCX0sCisjaWYgMAorCQkuY21faGVhZGVyID0geworCQkJLyphZGQgb25lIGZvciBrZWVwZXIuKi8KKwkJCS5idWZfc2l6ZSA9IE1NVV9DT01QUkVTU19IRUFERVJfU0laRSAqCisJCQkJCQkoRlJBTUVfQlVGRkVSUyArIDEpLAorCQkJLyogMHg0NDAwMCA9ICgoMTA4OCoyKjEwMjQqNCkvMzIvNCkqKDMyLzgpICovCisJCX0sCisjZW5kaWYKKwkJLm1wcmVkX2Fib3ZlID0geworCQkJLmJ1Zl9zaXplID0gMHgxMDAwMCwgLyogMiAqIHNpemUgb2YgaGV2YyovCisJCX0sCisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCQkubXByZWRfbXYgPSB7CisJCQkvKiAuYnVmX3NpemUgPSAweDEwMDAwMCoxNiwKKwkJCSAqIC8vNGsyayAsIDB4MTAwMDAwIHBlciBidWZmZXIKKwkJCSAqLworCQkJLyogNDA5NngyMzA0ICwgMHgxMjAwMDAgcGVyIGJ1ZmZlciAqLworCQkJLmJ1Zl9zaXplID0gMHgxMjAwMDAgKiBGUkFNRV9CVUZGRVJTLAorCQl9LAorI2VuZGlmCisJCS5ycG0gPSB7CisJCQkuYnVmX3NpemUgPSBSUE1fQlVGX1NJWkUsCisJCX0sCisJCS5sbWVtID0geworCQkJLmJ1Zl9zaXplID0gMHg0MDAgKiAyLAorCQl9CisJfSwKKwl7CisJCS5tYXhfd2lkdGggPSA0MDk2KjIsCisJCS5tYXhfaGVpZ2h0ID0gMjMwNCoyLAorCQkuaXBwID0geworCQkJLy8gSVBQIHdvcmsgc3BhY2UgY2FsY3VsYXRpb24gOiA0MDk2ICogKFkrQ2JDcitGbGFncykgPSAxMmssIHJvdW5kIHRvIDE2aworCQkJLmJ1Zl9zaXplID0gMHg0MDAwKjIsCisJCX0sCisJCS5zYW9fYWJ2ID0geworCQkJLmJ1Zl9zaXplID0gMHgzMDAwMCoyLAorCQl9LAorCQkuc2FvX3ZiID0geworCQkJLmJ1Zl9zaXplID0gMHgzMDAwMCoyLAorCQl9LAorCQkuc2hvcnRfdGVybV9ycHMgPSB7CisJCQkvLyBTSE9SVF9URVJNX1JQUyAtIE1heCA2NCBzZXQsIDE2IGVudHJ5IGV2ZXJ5IHNldCwgdG90YWwgNjR4MTZ4MiA9IDIwNDggYnl0ZXMgKDB4ODAwKQorCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS52cHMgPSB7CisJCQkvLyBWUFMgU1RPUkUgQVJFQSAtIE1heCAxNiBWUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsIHRvdGFsIDB4MDgwMCBieXRlcworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zcHMgPSB7CisJCQkvLyBTUFMgU1RPUkUgQVJFQSAtIE1heCAxNiBTUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsIHRvdGFsIDB4MDgwMCBieXRlcworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5wcHMgPSB7CisJCQkvLyBQUFMgU1RPUkUgQVJFQSAtIE1heCA2NCBQUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsIHRvdGFsIDB4MjAwMCBieXRlcworCQkJLmJ1Zl9zaXplID0gMHgyMDAwLAorCQl9LAorCQkuc2FvX3VwID0geworCQkJLy8gU0FPIFVQIFNUT1JFIEFSRUEgLSBNYXggNjQwKDEwMjQwLzE2KSBMQ1UsIGVhY2ggaGFzIDE2IGJ5dGVzIHRvdGFsIDB4MjgwMCBieXRlcworCQkJLmJ1Zl9zaXplID0gMHgyODAwKjIsCisJCX0sCisJCS5zd2FwX2J1ZiA9IHsKKwkJCS8vIDI1NmN5Y2xleDY0Yml0ID0gMksgYnl0ZXMgMHg4MDAgKG9ubHkgMTQ0IGN5Y2xlcyB2YWxpZCkKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc3dhcF9idWYyID0geworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zY2FsZWx1dCA9IHsKKwkJCS8vIHN1cHBvcnQgdXAgdG8gMzIgU0NBTEVMVVQgMTAyNHgzMiA9IDMyS2J5dGVzICgweDgwMDApCisJCQkuYnVmX3NpemUgPSAweDgwMDAqMiwKKwkJfSwKKwkJLmRibGtfcGFyYSA9IHsKKwkJCS8vIERCTEsgLT4gTWF4IDI1Nig0MDk2LzE2KSBMQ1UsIGVhY2ggcGFyYSAxMDI0Ynl0ZXModG90YWw6MHg0MDAwMCksIGRhdGEgMTAyNGJ5dGVzKHRvdGFsOjB4NDAwMDApCisJCQkuYnVmX3NpemUgPSAweDgwMDAwKjIsCisJCX0sCisJCS5kYmxrX2RhdGEgPSB7CisJCQkuYnVmX3NpemUgPSAweDgwMDAwKjIsCisJCX0sCisJCS5zZWdfbWFwID0geworCQkJLyo0MDk2eDIzMDQvNjQvNjQgKjI0ID0gMHhkODAwIEJ5dGVzKi8KKwkJCS5idWZfc2l6ZSA9IDB4ZDgwMCo0LAorCQl9LAorCQkubW11X3ZiaCA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4NTAwMCoyLCAvLzIqMTYqKG1vcmUgdGhhbiAyMzA0KS80LCA0SworCQl9LAorI2lmIDAKKwkJLmNtX2hlYWRlciA9IHsKKwkJCS8vLmJ1Zl9zaXplID0gTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFKjgsIC8vIDB4NDQwMDAgPSAoKDEwODgqMioxMDI0KjQpLzMyLzQpKigzMi84KQorCQkJLmJ1Zl9zaXplID0gTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFKjE2LCAvLyAweDQ0MDAwID0gKCgxMDg4KjIqMTAyNCo0KS8zMi80KSooMzIvOCkKKwkJfSwKKyNlbmRpZgorCQkubXByZWRfYWJvdmUgPSB7CisJCQkuYnVmX3NpemUgPSAweDEwMDAwKjIsIC8qIDIgKiBzaXplIG9mIGhldmMqLworCQl9LAorI2lmZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwkJLm1wcmVkX212ID0geworCQkJLy80azJrICwgMHgxMDAwMDAgcGVyIGJ1ZmZlciAqLworCQkJLyogNDA5NngyMzA0ICwgMHgxMjAwMDAgcGVyIGJ1ZmZlciAqLworCQkJLmJ1Zl9zaXplID0gMHgxMjAwMDAgKiBGUkFNRV9CVUZGRVJTICogNCwKKwkJfSwKKyNlbmRpZgorCQkucnBtID0geworCQkJLmJ1Zl9zaXplID0gUlBNX0JVRl9TSVpFLAorCQl9LAorCQkubG1lbSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4NDAwICogMiwKKwkJfQorCX0sCisJeworCQkvKiA4TSBieXRlcyAqLworCQkubWF4X3dpZHRoID0gMTkyMCwKKwkJLm1heF9oZWlnaHQgPSAxMDg4LAorCQkuaXBwID0geworCQkJLyogSVBQIHdvcmsgc3BhY2UgY2FsY3VsYXRpb24gOgorCQkJICogICA0MDk2ICogKFkrQ2JDcitGbGFncykgPSAxMmssIHJvdW5kIHRvIDE2aworCQkJICovCisJCQkuYnVmX3NpemUgPSAweDFlMDAsCisJCX0sCisJCS5zYW9fYWJ2ID0geworCQkJLmJ1Zl9zaXplID0gMCwKKwkJfSwKKwkJLnNhb192YiA9IHsKKwkJCS5idWZfc2l6ZSA9IDAsCisJCX0sCisJCS5zaG9ydF90ZXJtX3JwcyA9IHsKKwkJCS8qIFNIT1JUX1RFUk1fUlBTIC0gTWF4IDY0IHNldCwgMTYgZW50cnkgZXZlcnkgc2V0LAorCQkJICogICB0b3RhbCA2NHgxNngyID0gMjA0OCBieXRlcyAoMHg4MDApCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkudnBzID0geworCQkJLyogVlBTIFNUT1JFIEFSRUEgLSBNYXggMTYgVlBTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLAorCQkJICogICB0b3RhbCAweDA4MDAgYnl0ZXMKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zcHMgPSB7CisJCQkvKiBTUFMgU1RPUkUgQVJFQSAtIE1heCAxNiBTUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsCisJCQkgKiAgIHRvdGFsIDB4MDgwMCBieXRlcworCQkJICovCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnBwcyA9IHsKKwkJCS8qIFBQUyBTVE9SRSBBUkVBIC0gTWF4IDY0IFBQUywgZWFjaCBoYXMgMHg4MCBieXRlcywKKwkJCSAqICAgdG90YWwgMHgyMDAwIGJ5dGVzCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4MjAwMCwKKwkJfSwKKwkJLnNhb191cCA9IHsKKwkJCS8qIFNBTyBVUCBTVE9SRSBBUkVBIC0gTWF4IDY0MCgxMDI0MC8xNikgTENVLAorCQkJICogICBlYWNoIGhhcyAxNiBieXRlcyB0b3RhbCAweDI4MDAgYnl0ZXMKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMCwKKwkJfSwKKwkJLnN3YXBfYnVmID0geworCQkJLyogMjU2Y3ljbGV4NjRiaXQgPSAySyBieXRlcyAweDgwMAorCQkJICogICAob25seSAxNDQgY3ljbGVzIHZhbGlkKQorCQkJICovCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnN3YXBfYnVmMiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc2NhbGVsdXQgPSB7CisJCQkvKiBzdXBwb3J0IHVwIHRvIDMyIFNDQUxFTFVUIDEwMjR4MzIgPQorCQkJICogICAzMktieXRlcyAoMHg4MDAwKQorCQkJICovCisJCQkuYnVmX3NpemUgPSAwLAorCQl9LAorCQkuZGJsa19wYXJhID0geworCQkJLyogREJMSyAtPiBNYXggMjU2KDQwOTYvMTYpIExDVSwKKwkJCSAqZWFjaCBwYXJhIDEwMjRieXRlcyh0b3RhbDoweDQwMDAwKSwKKwkJCSAqZGF0YSAxMDI0Ynl0ZXModG90YWw6MHg0MDAwMCkKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg0OTAwMCwKKwkJfSwKKwkJLmRibGtfZGF0YSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4NDkwMDAsCisJCX0sCisJCS5zZWdfbWFwID0geworCQkvKjQwOTZ4MjMwNC82NC82NCAqMjQgPSAweGQ4MDAgQnl0ZXMqLworCQkJLmJ1Zl9zaXplID0gMHgzMDAwLCAvLzB4MmZkMCwKKwkJfSwKKwkJLm1tdV92YmggPSB7CisJCQkuYnVmX3NpemUgPSBWQkhfQlVGX1NJWkVfMTA4MFAsIC8qMioxNioobW9yZSB0aGFuIDIzMDQpLzQsIDRLKi8KKwkJfSwKKyNpZiAwCisJCS5jbV9oZWFkZXIgPSB7CisJCQkvKmFkZCBvbmUgZm9yIGtlZXBlci4qLworCQkJLmJ1Zl9zaXplID0gTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFICoKKwkJCQkJCShGUkFNRV9CVUZGRVJTICsgMSksCisJCQkvKiAweDQ0MDAwID0gKCgxMDg4KjIqMTAyNCo0KS8zMi80KSooMzIvOCkgKi8KKwkJfSwKKyNlbmRpZgorI2lmZGVmIFZQOV8xMEJfTU1VX0RXCisJCS5tbXVfdmJoX2R3ID0geworCQkJLmJ1Zl9zaXplID0gRFdfVkJIX0JVRl9TSVpFXzEwODBQLCAvL1ZCSF9CVUZfU0laRSAqIFZCSF9CVUZfQ09VTlQsIC8vMioxNioobW9yZSB0aGFuIDIzMDQpLzQsIDRLCisJCX0sCisjaWYgMAorCQkuY21faGVhZGVyX2R3ID0geworCQkJLmJ1Zl9zaXplID0gTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFX0RXICogMTYsIC8vIDB4NDQwMDAgPSAoKDEwODgqMioxMDI0KjQpLzMyLzQpKigzMi84KQorCQl9LAorI2VuZGlmCisjZW5kaWYKKwkJLm1wcmVkX2Fib3ZlID0geworCQkJLmJ1Zl9zaXplID0gMHgyMjAwLCAvLzB4MjFjMCwgLyogMiAqIHNpemUgb2YgaGV2YyovCisJCX0sCisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCQkubXByZWRfbXYgPSB7LyogMTA4MHAsIDB4NDAwMDAgcGVyIGJ1ZmZlciAqLworCQkJLmJ1Zl9zaXplID0gMHg0ODIwMCAqIEZSQU1FX0JVRkZFUlMsCisJCX0sCisjZW5kaWYKKwkJLnJwbSA9IHsKKwkJCS5idWZfc2l6ZSA9IFJQTV9CVUZfU0laRSwKKwkJfSwKKwkJLmxtZW0gPSB7CisJCQkuYnVmX3NpemUgPSAweDQwMCAqIDIsCisJCX0KKwl9LAorCXsKKwkJLm1heF93aWR0aCA9IDQwOTYsCisJCS5tYXhfaGVpZ2h0ID0gMjMwNCwKKwkJLmlwcCA9IHsKKwkJCS8qIElQUCB3b3JrIHNwYWNlIGNhbGN1bGF0aW9uIDoKKwkJCSAqICAgNDA5NiAqIChZK0NiQ3IrRmxhZ3MpID0gMTJrLCByb3VuZCB0byAxNmsKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg0MDAwLAorCQl9LAorCQkuc2FvX2FidiA9IHsKKwkJCS5idWZfc2l6ZSA9IDAsCisJCX0sCisJCS5zYW9fdmIgPSB7CisJCQkuYnVmX3NpemUgPSAwLAorCQl9LAorCQkuc2hvcnRfdGVybV9ycHMgPSB7CisJCQkvKiBTSE9SVF9URVJNX1JQUyAtIE1heCA2NCBzZXQsIDE2IGVudHJ5IGV2ZXJ5IHNldCwKKwkJCSAqICAgdG90YWwgNjR4MTZ4MiA9IDIwNDggYnl0ZXMgKDB4ODAwKQorCQkJICovCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnZwcyA9IHsKKwkJCS8qIFZQUyBTVE9SRSBBUkVBIC0gTWF4IDE2IFZQUywgZWFjaCBoYXMgMHg4MCBieXRlcywKKwkJCSAqICAgdG90YWwgMHgwODAwIGJ5dGVzCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc3BzID0geworCQkJLyogU1BTIFNUT1JFIEFSRUEgLSBNYXggMTYgU1BTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLAorCQkJICogICB0b3RhbCAweDA4MDAgYnl0ZXMKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5wcHMgPSB7CisJCQkvKiBQUFMgU1RPUkUgQVJFQSAtIE1heCA2NCBQUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsCisJCQkgKiAgIHRvdGFsIDB4MjAwMCBieXRlcworCQkJICovCisJCQkuYnVmX3NpemUgPSAweDIwMDAsCisJCX0sCisJCS5zYW9fdXAgPSB7CisJCQkvKiBTQU8gVVAgU1RPUkUgQVJFQSAtIE1heCA2NDAoMTAyNDAvMTYpIExDVSwKKwkJCSAqICAgZWFjaCBoYXMgMTYgYnl0ZXMgdG90YWwgMHgyODAwIGJ5dGVzCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDAsCisJCX0sCisJCS5zd2FwX2J1ZiA9IHsKKwkJCS8qIDI1NmN5Y2xleDY0Yml0ID0gMksgYnl0ZXMgMHg4MDAKKwkJCSAqICAgKG9ubHkgMTQ0IGN5Y2xlcyB2YWxpZCkKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zd2FwX2J1ZjIgPSB7CisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNjYWxlbHV0ID0geworCQkJLyogc3VwcG9ydCB1cCB0byAzMiBTQ0FMRUxVVCAxMDI0eDMyID0gMzJLYnl0ZXMKKwkJCSAqICAgKDB4ODAwMCkKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMCwKKwkJfSwKKwkJLmRibGtfcGFyYSA9IHsKKwkJCS8qIERCTEsgLT4gTWF4IDI1Nig0MDk2LzE2KSBMQ1UsCisJCQkgKmVhY2ggcGFyYSAxMDI0Ynl0ZXModG90YWw6MHg0MDAwMCksCisJCQkgKmRhdGEgMTAyNGJ5dGVzKHRvdGFsOjB4NDAwMDApCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4NTI4MDAsCisJCX0sCisJCS5kYmxrX2RhdGEgPSB7CisJCQkuYnVmX3NpemUgPSAweDUyODAwLAorCQl9LAorCQkuc2VnX21hcCA9IHsKKwkJCS8qNDA5NngyMzA0LzY0LzY0ICoyNCA9IDB4ZDgwMCBCeXRlcyovCisJCQkuYnVmX3NpemUgPSAweGQ4MDAsCisJCX0sCisJCS5tbXVfdmJoID0geworCQkJLmJ1Zl9zaXplID0gVkJIX0JVRl9TSVpFXzRLLC8qMioxNioobW9yZSB0aGFuIDIzMDQpLzQsIDRLKi8KKwkJfSwKKyNpZiAwCisJCS5jbV9oZWFkZXIgPSB7CisJCQkvKmFkZCBvbmUgZm9yIGtlZXBlci4qLworCQkJLmJ1Zl9zaXplID0gTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFICoKKwkJCQkJCShGUkFNRV9CVUZGRVJTICsgMSksCisJCQkvKiAweDQ0MDAwID0gKCgxMDg4KjIqMTAyNCo0KS8zMi80KSooMzIvOCkgKi8KKwkJfSwKKyNlbmRpZgorI2lmZGVmIFZQOV8xMEJfTU1VX0RXCisJCS5tbXVfdmJoX2R3ID0geworCQkJLmJ1Zl9zaXplID0gRFdfVkJIX0JVRl9TSVpFXzRLLCAvL1ZCSF9CVUZfU0laRSAqIFZCSF9CVUZfQ09VTlQsIC8vMioxNioobW9yZSB0aGFuIDIzMDQpLzQsIDRLCisJCX0sCisjaWYgMAorCQkuY21faGVhZGVyX2R3ID0geworCQkJLmJ1Zl9zaXplID0gTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFX0RXICogMTYsIC8vIDB4NDQwMDAgPSAoKDEwODgqMioxMDI0KjQpLzMyLzQpKigzMi84KQorCQl9LAorI2VuZGlmCisjZW5kaWYKKwkJLm1wcmVkX2Fib3ZlID0geworCQkJLmJ1Zl9zaXplID0gMHg0ODAwLCAvKiAyICogc2l6ZSBvZiBoZXZjKi8KKwkJfSwKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJCS5tcHJlZF9tdiA9IHsKKwkJCS8qIC5idWZfc2l6ZSA9IDB4MTAwMDAwKjE2LAorCQkJICogLy80azJrICwgMHgxMDAwMDAgcGVyIGJ1ZmZlcgorCQkJICovCisJCQkvKiA0MDk2eDIzMDQgLCAweDEyMDAwMCBwZXIgYnVmZmVyICovCisJCQkuYnVmX3NpemUgPSAweDE0NTQwMCAqIEZSQU1FX0JVRkZFUlMsCisJCX0sCisjZW5kaWYKKwkJLnJwbSA9IHsKKwkJCS5idWZfc2l6ZSA9IFJQTV9CVUZfU0laRSwKKwkJfSwKKwkJLmxtZW0gPSB7CisJCQkuYnVmX3NpemUgPSAweDQwMCAqIDIsCisJCX0KKwl9LAorCXsKKwkJLm1heF93aWR0aCA9IDQwOTYqMiwKKwkJLm1heF9oZWlnaHQgPSAyMzA0KjIsCisJCS5pcHAgPSB7CisJCQkvLyBJUFAgd29yayBzcGFjZSBjYWxjdWxhdGlvbiA6IDQwOTYgKiAoWStDYkNyK0ZsYWdzKSA9IDEyaywgcm91bmQgdG8gMTZrCisJCQkuYnVmX3NpemUgPSAweDQwMDAqMiwKKwkJfSwKKwkJLnNhb19hYnYgPSB7CisJCQkuYnVmX3NpemUgPSAwLAorCQl9LAorCQkuc2FvX3ZiID0geworCQkJLmJ1Zl9zaXplID0gMCwKKwkJfSwKKwkJLnNob3J0X3Rlcm1fcnBzID0geworCQkJLy8gU0hPUlRfVEVSTV9SUFMgLSBNYXggNjQgc2V0LCAxNiBlbnRyeSBldmVyeSBzZXQsIHRvdGFsIDY0eDE2eDIgPSAyMDQ4IGJ5dGVzICgweDgwMCkKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkudnBzID0geworCQkJLy8gVlBTIFNUT1JFIEFSRUEgLSBNYXggMTYgVlBTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLCB0b3RhbCAweDA4MDAgYnl0ZXMKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc3BzID0geworCQkJLy8gU1BTIFNUT1JFIEFSRUEgLSBNYXggMTYgU1BTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLCB0b3RhbCAweDA4MDAgYnl0ZXMKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkucHBzID0geworCQkJLy8gUFBTIFNUT1JFIEFSRUEgLSBNYXggNjQgUFBTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLCB0b3RhbCAweDIwMDAgYnl0ZXMKKwkJCS5idWZfc2l6ZSA9IDB4MjAwMCwKKwkJfSwKKwkJLnNhb191cCA9IHsKKwkJCS8vIFNBTyBVUCBTVE9SRSBBUkVBIC0gTWF4IDY0MCgxMDI0MC8xNikgTENVLCBlYWNoIGhhcyAxNiBieXRlcyB0b3RhbCAweDI4MDAgYnl0ZXMKKwkJCS5idWZfc2l6ZSA9IDAsCisJCX0sCisJCS5zd2FwX2J1ZiA9IHsKKwkJCS8vIDI1NmN5Y2xleDY0Yml0ID0gMksgYnl0ZXMgMHg4MDAgKG9ubHkgMTQ0IGN5Y2xlcyB2YWxpZCkKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc3dhcF9idWYyID0geworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zY2FsZWx1dCA9IHsKKwkJCS8vIHN1cHBvcnQgdXAgdG8gMzIgU0NBTEVMVVQgMTAyNHgzMiA9IDMyS2J5dGVzICgweDgwMDApCisJCQkuYnVmX3NpemUgPSAwLAorCQl9LAorCQkuZGJsa19wYXJhID0geworCQkJLy8gREJMSyAtPiBNYXggMjU2KDQwOTYvMTYpIExDVSwgZWFjaCBwYXJhIDEwMjRieXRlcyh0b3RhbDoweDQwMDAwKSwgZGF0YSAxMDI0Ynl0ZXModG90YWw6MHg0MDAwMCkKKwkJCS5idWZfc2l6ZSA9IDB4YTQ4MDAsCisJCX0sCisJCS5kYmxrX2RhdGEgPSB7CisJCQkuYnVmX3NpemUgPSAweGE0ODAwLAorCQl9LAorCQkuc2VnX21hcCA9IHsKKwkJCS8qNDA5NngyMzA0LzY0LzY0ICoyNCA9IDB4ZDgwMCBCeXRlcyovCisJCQkuYnVmX3NpemUgPSAweDM2MDAwLAorCQl9LAorCQkubW11X3ZiaCA9IHsKKwkJCS5idWZfc2l6ZSA9IFZCSF9CVUZfU0laRV84SywgLy8yKjE2Kihtb3JlIHRoYW4gMjMwNCkvNCwgNEsKKwkJfSwKKyNpZiAwCisJCS5jbV9oZWFkZXIgPSB7CisJCQkvLy5idWZfc2l6ZSA9IE1NVV9DT01QUkVTU19IRUFERVJfU0laRSo4LCAvLyAweDQ0MDAwID0gKCgxMDg4KjIqMTAyNCo0KS8zMi80KSooMzIvOCkKKwkJCS5idWZfc2l6ZSA9IE1NVV9DT01QUkVTU19IRUFERVJfU0laRSoxNiwgLy8gMHg0NDAwMCA9ICgoMTA4OCoyKjEwMjQqNCkvMzIvNCkqKDMyLzgpCisJCX0sCisjZW5kaWYKKyNpZmRlZiBWUDlfMTBCX01NVV9EVworCQkubW11X3ZiaF9kdyA9IHsKKwkJCS5idWZfc2l6ZSA9IERXX1ZCSF9CVUZfU0laRV84SywgLy9WQkhfQlVGX1NJWkUgKiBWQkhfQlVGX0NPVU5ULCAvLzIqMTYqKG1vcmUgdGhhbiAyMzA0KS80LCA0SworCQl9LAorI2lmIDAKKwkJLmNtX2hlYWRlcl9kdyA9IHsKKwkJCS5idWZfc2l6ZSA9IE1NVV9DT01QUkVTU19IRUFERVJfU0laRV9EVyAqIDE2LCAvLyAweDQ0MDAwID0gKCgxMDg4KjIqMTAyNCo0KS8zMi80KSooMzIvOCkKKwkJfSwKKyNlbmRpZgorI2VuZGlmCisJCS5tcHJlZF9hYm92ZSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4OTAwMCwKKwkJfSwKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJCS5tcHJlZF9tdiA9IHsKKwkJCS8vNGsyayAsIDB4MTAwMDAwIHBlciBidWZmZXIgKi8KKwkJCS8qIDQwOTZ4MjMwNCAsIDB4MTIwMDAwIHBlciBidWZmZXIgKi8KKwkJCS5idWZfc2l6ZSA9IDB4NTE0ODAwICogRlJBTUVfQlVGRkVSUywKKwkJfSwKKyNlbmRpZgorCQkucnBtID0geworCQkJLmJ1Zl9zaXplID0gUlBNX0JVRl9TSVpFLAorCQl9LAorCQkubG1lbSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4NDAwICogMiwKKwkJfQorCX0KK307CisKKworLypMb3NsZXNzIGNvbXByZXNzaW9uIGJvZHkgYnVmZmVyIHNpemUgNEsgcGVyIDY0eDMyIChqdCkqLworc3RhdGljIGludCBjb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCQkJCXVpbnQ4X3QgaXNfYml0X2RlcHRoXzEwKQoreworCWludCAgICAgd2lkdGhfeDY0OworCWludCAgICAgaGVpZ2h0X3gzMjsKKwlpbnQgICAgIGJzaXplOworCisJd2lkdGhfeDY0ID0gd2lkdGggKyA2MzsKKwl3aWR0aF94NjQgPj49IDY7CisJaGVpZ2h0X3gzMiA9IGhlaWdodCArIDMxOworCWhlaWdodF94MzIgPj49IDU7CisJYnNpemUgPSAoaXNfYml0X2RlcHRoXzEwPzQwOTY6MzIwMCkqd2lkdGhfeDY0KmhlaWdodF94MzI7CisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0JVRk1HUl9NT1JFKQorCQlwcl9pbmZvKCIlcyglZCwlZCwlZCk9PiVkXG4iLAorCQkJX19mdW5jX18sIHdpZHRoLCBoZWlnaHQsCisJCQlpc19iaXRfZGVwdGhfMTAsIGJzaXplKTsKKworCXJldHVybiAgYnNpemU7Cit9CisKKy8qIExvc2xlc3MgY29tcHJlc3Npb24gaGVhZGVyIGJ1ZmZlciBzaXplIDMyYnl0ZXMgcGVyIDEyOHg2NCAoanQpKi8KK3N0YXRpYyBpbnQgY29tcHV0ZV9sb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworCWludCAgICAgd2lkdGhfeDEyODsKKwlpbnQgICAgIGhlaWdodF94NjQ7CisJaW50ICAgICBoc2l6ZTsKKworCXdpZHRoX3gxMjggPSB3aWR0aCArIDEyNzsKKwl3aWR0aF94MTI4ID4+PSA3OworCWhlaWdodF94NjQgPSBoZWlnaHQgKyA2MzsKKwloZWlnaHRfeDY0ID4+PSA2OworCisJaHNpemUgPSAzMiAqIHdpZHRoX3gxMjggKiBoZWlnaHRfeDY0OworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19CVUZNR1JfTU9SRSkKKwkJcHJfaW5mbygiJXMoJWQsJWQpPT4lZFxuIiwKKwkJCV9fZnVuY19fLCB3aWR0aCwgaGVpZ2h0LAorCQkJaHNpemUpOworCisJcmV0dXJuICBoc2l6ZTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9idWZmX3NwZWMoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLAorCXN0cnVjdCBCdWZmSW5mb19zICpidWZfc3BlYykKK3sKKwl2b2lkICptZW1fc3RhcnRfdmlydDsKKworCWJ1Zl9zcGVjLT5pcHAuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c3RhcnRfYWRyKTsKKwlidWZfc3BlYy0+c2FvX2Fidi5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5pcHAuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPmlwcC5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPnNhb192Yi5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5zYW9fYWJ2LmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5zYW9fYWJ2LmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+c2hvcnRfdGVybV9ycHMuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c2FvX3ZiLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5zYW9fdmIuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT52cHMuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c2hvcnRfdGVybV9ycHMuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnNob3J0X3Rlcm1fcnBzLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+c3BzLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnZwcy5idWZfc3RhcnQgKyBidWZfc3BlYy0+dnBzLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+cHBzLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnNwcy5idWZfc3RhcnQgKyBidWZfc3BlYy0+c3BzLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+c2FvX3VwLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnBwcy5idWZfc3RhcnQgKyBidWZfc3BlYy0+cHBzLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+c3dhcF9idWYuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c2FvX3VwLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5zYW9fdXAuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5zd2FwX2J1ZjIuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c3dhcF9idWYuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnN3YXBfYnVmLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+c2NhbGVsdXQuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c3dhcF9idWYyLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5zd2FwX2J1ZjIuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5kYmxrX3BhcmEuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c2NhbGVsdXQuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnNjYWxlbHV0LmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+ZGJsa19kYXRhLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc3RhcnQgKyBidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+c2VnX21hcC5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5kYmxrX2RhdGEuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPmRibGtfZGF0YS5idWZfc2l6ZSk7CisJaWYgKHBiaSA9PSBOVUxMIHx8IHBiaS0+bW11X2VuYWJsZSkgeworCQlidWZfc3BlYy0+bW11X3ZiaC5idWZfc3RhcnQgID0KKwkJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnNlZ19tYXAuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnNlZ19tYXAuYnVmX3NpemUpOworI2lmZGVmIFZQOV8xMEJfTU1VX0RXCisJCWlmIChwYmkgPT0gTlVMTCB8fCBwYmktPmR3X21tdV9lbmFibGUpIHsKKwkJCWJ1Zl9zcGVjLT5tbXVfdmJoX2R3LmJ1Zl9zdGFydCAgPQorCQkJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPm1tdV92YmguYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPm1tdV92YmguYnVmX3NpemUpOworCQkJYnVmX3NwZWMtPm1wcmVkX2Fib3ZlLmJ1Zl9zdGFydCA9CisJCQkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+bW11X3ZiaF9kdy5idWZfc3RhcnQgKyBidWZfc3BlYy0+bW11X3ZiaF9kdy5idWZfc2l6ZSk7CisJCX0gZWxzZSB7CisJCQlidWZfc3BlYy0+bXByZWRfYWJvdmUuYnVmX3N0YXJ0ID0KKwkJCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5tbXVfdmJoLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5tbXVfdmJoLmJ1Zl9zaXplKTsKKwkJfQorI2Vsc2UKKwkJYnVmX3NwZWMtPm1wcmVkX2Fib3ZlLmJ1Zl9zdGFydCA9CisJCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5tbXVfdmJoLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5tbXVfdmJoLmJ1Zl9zaXplKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCWJ1Zl9zcGVjLT5tcHJlZF9hYm92ZS5idWZfc3RhcnQgPQorCQkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c2VnX21hcC5idWZfc3RhcnQgKyBidWZfc3BlYy0+c2VnX21hcC5idWZfc2l6ZSk7CisJfQorI2lmZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwlidWZfc3BlYy0+bXByZWRfbXYuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+bXByZWRfYWJvdmUuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPm1wcmVkX2Fib3ZlLmJ1Zl9zaXplKTsKKworCWJ1Zl9zcGVjLT5ycG0uYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+bXByZWRfbXYuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPm1wcmVkX212LmJ1Zl9zaXplKTsKKyNlbHNlCisJYnVmX3NwZWMtPnJwbS5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5tcHJlZF9hYm92ZS5idWZfc3RhcnQgKyBidWZfc3BlYy0+bXByZWRfYWJvdmUuYnVmX3NpemUpOworI2VuZGlmCisJYnVmX3NwZWMtPmxtZW0uYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+cnBtLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5ycG0uYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5lbmRfYWRyID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+bG1lbS5idWZfc3RhcnQgKyBidWZfc3BlYy0+bG1lbS5idWZfc2l6ZSk7CisKKwlpZiAoIXBiaSkKKwkJcmV0dXJuOworCisJaWYgKCF2ZGVjX3NlY3VyZShod190b192ZGVjKHBiaSkpKSB7CisJCW1lbV9zdGFydF92aXJ0ID0KKwkJCWNvZGVjX21tX3BoeXNfdG9fdmlydChidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zdGFydCk7CisJCWlmIChtZW1fc3RhcnRfdmlydCkgeworCQkJbWVtc2V0KG1lbV9zdGFydF92aXJ0LCAwLAorCQkJCWJ1Zl9zcGVjLT5kYmxrX3BhcmEuYnVmX3NpemUpOworCQkJY29kZWNfbW1fZG1hX2ZsdXNoKG1lbV9zdGFydF92aXJ0LAorCQkJCWJ1Zl9zcGVjLT5kYmxrX3BhcmEuYnVmX3NpemUsCisJCQkJRE1BX1RPX0RFVklDRSk7CisJCX0gZWxzZSB7CisJCQltZW1fc3RhcnRfdmlydCA9IGNvZGVjX21tX3ZtYXAoCisJCQkJYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc3RhcnQsCisJCQkJYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc2l6ZSk7CisJCQlpZiAobWVtX3N0YXJ0X3ZpcnQpIHsKKwkJCQltZW1zZXQobWVtX3N0YXJ0X3ZpcnQsIDAsCisJCQkJCWJ1Zl9zcGVjLT5kYmxrX3BhcmEuYnVmX3NpemUpOworCQkJCWNvZGVjX21tX2RtYV9mbHVzaChtZW1fc3RhcnRfdmlydCwKKwkJCQkJYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc2l6ZSwKKwkJCQkJRE1BX1RPX0RFVklDRSk7CisJCQkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcihtZW1fc3RhcnRfdmlydCk7CisJCQl9IGVsc2UgeworCQkJCS8qbm90IHZpcnQgZm9yIHR2cCBwbGF5aW5nLAorCQkJCW1heSBuZWVkIGNsZWFyIG9uIHVjb2RlLiovCisJCQkJcHJfZXJyKCJtZW1fc3RhcnRfdmlydCBmYWlsZWRcbiIpOworCQkJfQorCQl9CisJfQorCisJaWYgKGRlYnVnKSB7CisJCXByX2luZm8oIiVzIHdvcmtzcGFjZSAoJXggJXgpIHNpemUgPSAleFxuIiwgX19mdW5jX18sCisJCQkgICBidWZfc3BlYy0+c3RhcnRfYWRyLCBidWZfc3BlYy0+ZW5kX2FkciwKKwkJCSAgIGJ1Zl9zcGVjLT5lbmRfYWRyIC0gYnVmX3NwZWMtPnN0YXJ0X2Fkcik7CisJfQorCisJaWYgKGRlYnVnKSB7CisJCXByX2luZm8oImlwcC5idWZfc3RhcnQgICAgICAgICAgICAgOiV4XG4iLAorCQkJICAgYnVmX3NwZWMtPmlwcC5idWZfc3RhcnQpOworCQlwcl9pbmZvKCJzYW9fYWJ2LmJ1Zl9zdGFydCAgICAgICAgICA6JXhcbiIsCisJCQkgICBidWZfc3BlYy0+c2FvX2Fidi5idWZfc3RhcnQpOworCQlwcl9pbmZvKCJzYW9fdmIuYnVmX3N0YXJ0ICAgICAgICAgIDoleFxuIiwKKwkJCSAgIGJ1Zl9zcGVjLT5zYW9fdmIuYnVmX3N0YXJ0KTsKKwkJcHJfaW5mbygic2hvcnRfdGVybV9ycHMuYnVmX3N0YXJ0ICA6JXhcbiIsCisJCQkgICBidWZfc3BlYy0+c2hvcnRfdGVybV9ycHMuYnVmX3N0YXJ0KTsKKwkJcHJfaW5mbygidnBzLmJ1Zl9zdGFydCAgICAgICAgICAgICA6JXhcbiIsCisJCQkgICBidWZfc3BlYy0+dnBzLmJ1Zl9zdGFydCk7CisJCXByX2luZm8oInNwcy5idWZfc3RhcnQgICAgICAgICAgICAgOiV4XG4iLAorCQkJICAgYnVmX3NwZWMtPnNwcy5idWZfc3RhcnQpOworCQlwcl9pbmZvKCJwcHMuYnVmX3N0YXJ0ICAgICAgICAgICAgIDoleFxuIiwKKwkJCSAgIGJ1Zl9zcGVjLT5wcHMuYnVmX3N0YXJ0KTsKKwkJcHJfaW5mbygic2FvX3VwLmJ1Zl9zdGFydCAgICAgICAgICA6JXhcbiIsCisJCQkgICBidWZfc3BlYy0+c2FvX3VwLmJ1Zl9zdGFydCk7CisJCXByX2luZm8oInN3YXBfYnVmLmJ1Zl9zdGFydCAgICAgICAgOiV4XG4iLAorCQkJICAgYnVmX3NwZWMtPnN3YXBfYnVmLmJ1Zl9zdGFydCk7CisJCXByX2luZm8oInN3YXBfYnVmMi5idWZfc3RhcnQgICAgICAgOiV4XG4iLAorCQkJICAgYnVmX3NwZWMtPnN3YXBfYnVmMi5idWZfc3RhcnQpOworCQlwcl9pbmZvKCJzY2FsZWx1dC5idWZfc3RhcnQgICAgICAgIDoleFxuIiwKKwkJCSAgIGJ1Zl9zcGVjLT5zY2FsZWx1dC5idWZfc3RhcnQpOworCQlwcl9pbmZvKCJkYmxrX3BhcmEuYnVmX3N0YXJ0ICAgICAgIDoleFxuIiwKKwkJCSAgIGJ1Zl9zcGVjLT5kYmxrX3BhcmEuYnVmX3N0YXJ0KTsKKwkJcHJfaW5mbygiZGJsa19kYXRhLmJ1Zl9zdGFydCAgICAgICA6JXhcbiIsCisJCQkgICBidWZfc3BlYy0+ZGJsa19kYXRhLmJ1Zl9zdGFydCk7CisJCXByX2luZm8oInNlZ19tYXAuYnVmX3N0YXJ0ICAgICAgIDoleFxuIiwKKwkJCWJ1Zl9zcGVjLT5zZWdfbWFwLmJ1Zl9zdGFydCk7CisJaWYgKHBiaS0+bW11X2VuYWJsZSkgeworCQlwcl9pbmZvKCJtbXVfdmJoLmJ1Zl9zdGFydCAgICAgOiV4XG4iLAorCQkJYnVmX3NwZWMtPm1tdV92YmguYnVmX3N0YXJ0KTsKKyNpZmRlZiBWUDlfMTBCX01NVV9EVworCQlpZiAocGJpLT5kd19tbXVfZW5hYmxlKSB7CisJCQlwcl9pbmZvKCJtbXVfdmJoX2R3LmJ1Zl9zdGFydCAgICAgOiV4IiwKKwkJCQlidWZfc3BlYy0+bW11X3ZiaF9kdy5idWZfc3RhcnQpOworI2lmIDAKKwkJCXByX2luZm8oImNtX2hlYWRlcl9kdy5idWZfc3RhcnQgICAgIDoleCIsCisJCQkJYnVmX3NwZWMtPm1tdV92YmhfZHcuYnVmX3N0YXJ0KTsKKyNlbmRpZgorCQl9CisjZW5kaWYKKwl9CisJCXByX2luZm8oIm1wcmVkX2Fib3ZlLmJ1Zl9zdGFydCAgICAgOiV4XG4iLAorCQkJICAgYnVmX3NwZWMtPm1wcmVkX2Fib3ZlLmJ1Zl9zdGFydCk7CisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCQlwcl9pbmZvKCJtcHJlZF9tdi5idWZfc3RhcnQgICAgICAgIDoleFxuIiwKKwkJCSAgIGJ1Zl9zcGVjLT5tcHJlZF9tdi5idWZfc3RhcnQpOworI2VuZGlmCisJCWlmICgoZGVidWcgJiBWUDlfREVCVUdfU0VORF9QQVJBTV9XSVRIX1JFRykgPT0gMCkgeworCQkJcHJfaW5mbygicnBtLmJ1Zl9zdGFydCAgICAgICAgICAgICA6JXhcbiIsCisJCQkJICAgYnVmX3NwZWMtPnJwbS5idWZfc3RhcnQpOworCQl9CisJfQorfQorCisvKiBjYWNoZV91dGlsLmMgKi8KKyNkZWZpbmUgICBUSE9ESVlJTF9NQ1JDQ19DQU5WQVNfQUxHWCAgICA0CisKK3N0YXRpYyB1MzIgbWNyY2NfY2FjaGVfYWxnX2ZsYWcgPSBUSE9ESVlJTF9NQ1JDQ19DQU5WQVNfQUxHWDsKKworc3RhdGljIHZvaWQgbWNyY2NfcGVyZmNvdW50X3Jlc2V0KHZvaWQpCit7CisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0NBQ0hFKQorCQlwcl9pbmZvKCJbY2FjaGVfdXRpbC5jXSBFbnRlcmVkIG1jcmNjX3BlcmZjb3VudF9yZXNldC4uLlxuIik7CisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkweDEpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpMHgwKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB1bnNpZ25lZCByYXdfbWNyX2NudF90b3RhbF9wcmV2Oworc3RhdGljIHVuc2lnbmVkIGhpdF9tY3JfMF9jbnRfdG90YWxfcHJldjsKK3N0YXRpYyB1bnNpZ25lZCBoaXRfbWNyXzFfY250X3RvdGFsX3ByZXY7CitzdGF0aWMgdW5zaWduZWQgYnlwX21jcl9jbnRfbmNoY2Fudl90b3RhbF9wcmV2Oworc3RhdGljIHVuc2lnbmVkIGJ5cF9tY3JfY250X25jaG91dHdpbl90b3RhbF9wcmV2OworCitzdGF0aWMgdm9pZCBtY3JjY19nZXRfaGl0cmF0ZSh1bnNpZ25lZCByZXNldF9wcmUpCit7CisJdW5zaWduZWQgZGVsdGFfaGl0X21jcl8wX2NudDsKKwl1bnNpZ25lZCBkZWx0YV9oaXRfbWNyXzFfY250OworCXVuc2lnbmVkIGRlbHRhX3Jhd19tY3JfY250OworCXVuc2lnbmVkIGRlbHRhX21jcl9jbnRfbmNoY2FudjsKKwl1bnNpZ25lZCBkZWx0YV9tY3JfY250X25jaG91dHdpbjsKKworCXVuc2lnbmVkIHRtcDsKKwl1bnNpZ25lZCByYXdfbWNyX2NudDsKKwl1bnNpZ25lZCBoaXRfbWNyX2NudDsKKwl1bnNpZ25lZCBieXBfbWNyX2NudF9uY2hvdXR3aW47CisJdW5zaWduZWQgYnlwX21jcl9jbnRfbmNoY2FudjsKKwlpbnQgaGl0cmF0ZTsKKwlpZiAocmVzZXRfcHJlKSB7CisJCXJhd19tY3JfY250X3RvdGFsX3ByZXYgPSAwOworCQloaXRfbWNyXzBfY250X3RvdGFsX3ByZXYgPSAwOworCQloaXRfbWNyXzFfY250X3RvdGFsX3ByZXYgPSAwOworCQlieXBfbWNyX2NudF9uY2hjYW52X3RvdGFsX3ByZXYgPSAwOworCQlieXBfbWNyX2NudF9uY2hvdXR3aW5fdG90YWxfcHJldiA9IDA7CisJfQorCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19DQUNIRSkKKwkJcHJfaW5mbygiW2NhY2hlX3V0aWwuY10gRW50ZXJlZCBtY3JjY19nZXRfaGl0cmF0ZS4uLlxuIik7CisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHgwPDwxKSk7CisJcmF3X21jcl9jbnQgPSBSRUFEX1ZSRUcoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9EQVRBKTsKKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDE8PDEpKTsKKwloaXRfbWNyX2NudCA9IFJFQURfVlJFRyhIRVZDRF9NQ1JDQ19QRVJGTU9OX0RBVEEpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4Mjw8MSkpOworCWJ5cF9tY3JfY250X25jaG91dHdpbiA9IFJFQURfVlJFRyhIRVZDRF9NQ1JDQ19QRVJGTU9OX0RBVEEpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4Mzw8MSkpOworCWJ5cF9tY3JfY250X25jaGNhbnYgPSBSRUFEX1ZSRUcoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9EQVRBKTsKKworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19DQUNIRSkKKwkJcHJfaW5mbygicmF3X21jcl9jbnRfdG90YWw6ICVkXG4iLAorCQkJcmF3X21jcl9jbnQpOworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19DQUNIRSkKKwkJcHJfaW5mbygiaGl0X21jcl9jbnRfdG90YWw6ICVkXG4iLAorCQkJaGl0X21jcl9jbnQpOworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19DQUNIRSkKKwkJcHJfaW5mbygiYnlwX21jcl9jbnRfbmNob3V0d2luX3RvdGFsOiAlZFxuIiwKKwkJCWJ5cF9tY3JfY250X25jaG91dHdpbik7CisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0NBQ0hFKQorCQlwcl9pbmZvKCJieXBfbWNyX2NudF9uY2hjYW52X3RvdGFsOiAlZFxuIiwKKwkJCWJ5cF9tY3JfY250X25jaGNhbnYpOworCisJZGVsdGFfcmF3X21jcl9jbnQgPSByYXdfbWNyX2NudCAtCisJCXJhd19tY3JfY250X3RvdGFsX3ByZXY7CisJZGVsdGFfbWNyX2NudF9uY2hjYW52ID0gYnlwX21jcl9jbnRfbmNoY2FudiAtCisJCWJ5cF9tY3JfY250X25jaGNhbnZfdG90YWxfcHJldjsKKwlkZWx0YV9tY3JfY250X25jaG91dHdpbiA9IGJ5cF9tY3JfY250X25jaG91dHdpbiAtCisJCWJ5cF9tY3JfY250X25jaG91dHdpbl90b3RhbF9wcmV2OworCXJhd19tY3JfY250X3RvdGFsX3ByZXYgPSByYXdfbWNyX2NudDsKKwlieXBfbWNyX2NudF9uY2hjYW52X3RvdGFsX3ByZXYgPSBieXBfbWNyX2NudF9uY2hjYW52OworCWJ5cF9tY3JfY250X25jaG91dHdpbl90b3RhbF9wcmV2ID0gYnlwX21jcl9jbnRfbmNob3V0d2luOworCisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHg0PDwxKSk7CisJdG1wID0gUkVBRF9WUkVHKEhFVkNEX01DUkNDX1BFUkZNT05fREFUQSk7CisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0NBQ0hFKQorCQlwcl9pbmZvKCJtaXNzX21jcl8wX2NudF90b3RhbDogJWRcbiIsIHRtcCk7CisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHg1PDwxKSk7CisJdG1wID0gUkVBRF9WUkVHKEhFVkNEX01DUkNDX1BFUkZNT05fREFUQSk7CisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0NBQ0hFKQorCQlwcl9pbmZvKCJtaXNzX21jcl8xX2NudF90b3RhbDogJWRcbiIsIHRtcCk7CisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHg2PDwxKSk7CisJdG1wID0gUkVBRF9WUkVHKEhFVkNEX01DUkNDX1BFUkZNT05fREFUQSk7CisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0NBQ0hFKQorCQlwcl9pbmZvKCJoaXRfbWNyXzBfY250X3RvdGFsOiAlZFxuIiwgdG1wKTsKKwlkZWx0YV9oaXRfbWNyXzBfY250ID0gdG1wIC0gaGl0X21jcl8wX2NudF90b3RhbF9wcmV2OworCWhpdF9tY3JfMF9jbnRfdG90YWxfcHJldiA9IHRtcDsKKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDc8PDEpKTsKKwl0bXAgPSBSRUFEX1ZSRUcoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9EQVRBKTsKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEUpCisJCXByX2luZm8oImhpdF9tY3JfMV9jbnRfdG90YWw6ICVkXG4iLCB0bXApOworCWRlbHRhX2hpdF9tY3JfMV9jbnQgPSB0bXAgLSBoaXRfbWNyXzFfY250X3RvdGFsX3ByZXY7CisJaGl0X21jcl8xX2NudF90b3RhbF9wcmV2ID0gdG1wOworCisJaWYgKGRlbHRhX3Jhd19tY3JfY250ICE9IDApIHsKKwkJaGl0cmF0ZSA9IDEwMCAqIGRlbHRhX2hpdF9tY3JfMF9jbnQKKwkJCS8gZGVsdGFfcmF3X21jcl9jbnQ7CisJCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19DQUNIRSkKKwkJCXByX2luZm8oIkNBTlYwX0hJVF9SQVRFIDogJWRcbiIsIGhpdHJhdGUpOworCQloaXRyYXRlID0gMTAwICogZGVsdGFfaGl0X21jcl8xX2NudAorCQkJLyBkZWx0YV9yYXdfbWNyX2NudDsKKwkJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0NBQ0hFKQorCQkJcHJfaW5mbygiQ0FOVjFfSElUX1JBVEUgOiAlZFxuIiwgaGl0cmF0ZSk7CisJCWhpdHJhdGUgPSAxMDAgKiBkZWx0YV9tY3JfY250X25jaGNhbnYKKwkJCS8gZGVsdGFfcmF3X21jcl9jbnQ7CisJCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19DQUNIRSkKKwkJCXByX2luZm8oIk5PTkNBQ0hfQ0FOVl9CWVBfUkFURSA6ICVkXG4iLCBoaXRyYXRlKTsKKwkJaGl0cmF0ZSA9IDEwMCAqIGRlbHRhX21jcl9jbnRfbmNob3V0d2luCisJCQkvIGRlbHRhX3Jhd19tY3JfY250OworCQlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEUpCisJCQlwcl9pbmZvKCJDQUNIRV9PVVRXSU5fQllQX1JBVEUgOiAlZFxuIiwgaGl0cmF0ZSk7CisJfQorCisKKwlpZiAocmF3X21jcl9jbnQgIT0gMCkgeworCQloaXRyYXRlID0gMTAwICogaGl0X21jcl9jbnQgLyByYXdfbWNyX2NudDsKKwkJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0NBQ0hFKQorCQkJcHJfaW5mbygiTUNSQ0NfSElUX1JBVEUgOiAlZFxuIiwgaGl0cmF0ZSk7CisJCWhpdHJhdGUgPSAxMDAgKiAoYnlwX21jcl9jbnRfbmNob3V0d2luICsgYnlwX21jcl9jbnRfbmNoY2FudikKKwkJCS8gcmF3X21jcl9jbnQ7CisJCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19DQUNIRSkKKwkJCXByX2luZm8oIk1DUkNDX0JZUF9SQVRFIDogJWRcbiIsIGhpdHJhdGUpOworCX0gZWxzZSB7CisJCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19DQUNIRSkKKwkJCXByX2luZm8oIk1DUkNDX0hJVF9SQVRFIDogbmFcbiIpOworCQlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEUpCisJCQlwcl9pbmZvKCJNQ1JDQ19CWVBfUkFURSA6IG5hXG4iKTsKKwl9CisJcmV0dXJuOworfQorCisKK3N0YXRpYyB2b2lkIGRlY29tcF9wZXJmY291bnRfcmVzZXQodm9pZCkKK3sKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEUpCisJCXByX2luZm8oIltjYWNoZV91dGlsLmNdIEVudGVyZWQgZGVjb21wX3BlcmZjb3VudF9yZXNldC4uLlxuIik7CisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KTB4MSk7CisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KTB4MCk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBkZWNvbXBfZ2V0X2hpdHJhdGUodm9pZCkKK3sKKwl1bnNpZ25lZCAgIHJhd19tY3JfY250OworCXVuc2lnbmVkICAgaGl0X21jcl9jbnQ7CisJaW50ICAgICAgaGl0cmF0ZTsKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEUpCisJCXByX2luZm8oIltjYWNoZV91dGlsLmNdIEVudGVyZWQgZGVjb21wX2dldF9oaXRyYXRlLi4uXG4iKTsKKwlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4MDw8MSkpOworCXJhd19tY3JfY250ID0gUkVBRF9WUkVHKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9EQVRBKTsKKwlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4MTw8MSkpOworCWhpdF9tY3JfY250ID0gUkVBRF9WUkVHKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9EQVRBKTsKKworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19DQUNIRSkKKwkJcHJfaW5mbygiaGNhY2hlX3Jhd19jbnRfdG90YWw6ICVkXG4iLCByYXdfbWNyX2NudCk7CisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0NBQ0hFKQorCQlwcl9pbmZvKCJoY2FjaGVfaGl0X2NudF90b3RhbDogJWRcbiIsIGhpdF9tY3JfY250KTsKKworCWlmIChyYXdfbWNyX2NudCAhPSAwKSB7CisJCWhpdHJhdGUgPSBoaXRfbWNyX2NudCAqIDEwMCAvIHJhd19tY3JfY250OworCQlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEUpCisJCQlwcl9pbmZvKCJERUNPTVBfSENBQ0hFX0hJVF9SQVRFIDogJWRcbiIsIGhpdHJhdGUpOworCX0gZWxzZSB7CisJCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19DQUNIRSkKKwkJCXByX2luZm8oIkRFQ09NUF9IQ0FDSEVfSElUX1JBVEUgOiBuYVxuIik7CisJfQorCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHgyPDwxKSk7CisJcmF3X21jcl9jbnQgPSBSRUFEX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9QRVJGTU9OX0RBVEEpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHgzPDwxKSk7CisJaGl0X21jcl9jbnQgPSBSRUFEX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9QRVJGTU9OX0RBVEEpOworCisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0NBQ0hFKQorCQlwcl9pbmZvKCJkY2FjaGVfcmF3X2NudF90b3RhbDogJWRcbiIsIHJhd19tY3JfY250KTsKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEUpCisJCXByX2luZm8oImRjYWNoZV9oaXRfY250X3RvdGFsOiAlZFxuIiwgaGl0X21jcl9jbnQpOworCisJaWYgKHJhd19tY3JfY250ICE9IDApIHsKKwkJaGl0cmF0ZSA9IGhpdF9tY3JfY250ICogMTAwIC8gcmF3X21jcl9jbnQ7CisJCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19DQUNIRSkKKwkJCXByX2luZm8oIkRFQ09NUF9EQ0FDSEVfSElUX1JBVEUgOiAlZFxuIiwgaGl0cmF0ZSk7CisJfSBlbHNlIHsKKwkJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0NBQ0hFKQorCQkJcHJfaW5mbygiREVDT01QX0RDQUNIRV9ISVRfUkFURSA6IG5hXG4iKTsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBkZWNvbXBfZ2V0X2NvbXByYXRlKHZvaWQpCit7CisJdW5zaWduZWQgICByYXdfdWNvbXBfY250OworCXVuc2lnbmVkICAgZmFzdF9jb21wX2NudDsKKwl1bnNpZ25lZCAgIHNsb3dfY29tcF9jbnQ7CisJaW50ICAgICAgY29tcHJhdGU7CisKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEUpCisJCXByX2luZm8oIltjYWNoZV91dGlsLmNdIEVudGVyZWQgZGVjb21wX2dldF9jb21wcmF0ZS4uLlxuIik7CisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDQ8PDEpKTsKKwlmYXN0X2NvbXBfY250ID0gUkVBRF9WUkVHKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9EQVRBKTsKKwlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4NTw8MSkpOworCXNsb3dfY29tcF9jbnQgPSBSRUFEX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9QRVJGTU9OX0RBVEEpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHg2PDwxKSk7CisJcmF3X3Vjb21wX2NudCA9IFJFQURfVlJFRyhIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fREFUQSk7CisKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEUpCisJCXByX2luZm8oImRlY29tcF9mYXN0X2NvbXBfdG90YWw6ICVkXG4iLCBmYXN0X2NvbXBfY250KTsKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEUpCisJCXByX2luZm8oImRlY29tcF9zbG93X2NvbXBfdG90YWw6ICVkXG4iLCBzbG93X2NvbXBfY250KTsKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEUpCisJCXByX2luZm8oImRlY29tcF9yYXdfdW5jb21wX3RvdGFsOiAlZFxuIiwgcmF3X3Vjb21wX2NudCk7CisKKwlpZiAocmF3X3Vjb21wX2NudCAhPSAwKSB7CisJCWNvbXByYXRlID0gKGZhc3RfY29tcF9jbnQgKyBzbG93X2NvbXBfY250KQorCQkqIDEwMCAvIHJhd191Y29tcF9jbnQ7CisJCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19DQUNIRSkKKwkJCXByX2luZm8oIkRFQ09NUF9DT01QX1JBVElPIDogJWRcbiIsIGNvbXByYXRlKTsKKwl9IGVsc2UgeworCQlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEUpCisJCQlwcl9pbmZvKCJERUNPTVBfQ09NUF9SQVRJTyA6IG5hXG4iKTsKKwl9CisJcmV0dXJuOworfQorLyogY2FjaGVfdXRpbC5jIGVuZCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKnZwOV9wcm9iIGRlZmluZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworI2RlZmluZSBWUDlfUEFSVElUSU9OX1NUQVJUICAgICAgMAorI2RlZmluZSBWUDlfUEFSVElUSU9OX1NJWkVfU1RFUCAgKDMgKiA0KQorI2RlZmluZSBWUDlfUEFSVElUSU9OX09ORV9TSVpFICAgKDQgKiBWUDlfUEFSVElUSU9OX1NJWkVfU1RFUCkKKyNkZWZpbmUgVlA5X1BBUlRJVElPTl9LRVlfU1RBUlQgIDAKKyNkZWZpbmUgVlA5X1BBUlRJVElPTl9QX1NUQVJUICAgIFZQOV9QQVJUSVRJT05fT05FX1NJWkUKKyNkZWZpbmUgVlA5X1BBUlRJVElPTl9TSVpFICAgICAgICgyICogVlA5X1BBUlRJVElPTl9PTkVfU0laRSkKKyNkZWZpbmUgVlA5X1NLSVBfU1RBUlQgICAgICAgICAgIChWUDlfUEFSVElUSU9OX1NUQVJUICsgVlA5X1BBUlRJVElPTl9TSVpFKQorI2RlZmluZSBWUDlfU0tJUF9TSVpFICAgICAgICAgICAgNCAvKiBvbmx5IHVzZSAzKi8KKyNkZWZpbmUgVlA5X1RYX01PREVfU1RBUlQgICAgICAgIChWUDlfU0tJUF9TVEFSVCtWUDlfU0tJUF9TSVpFKQorI2RlZmluZSBWUDlfVFhfTU9ERV84XzBfT0ZGU0VUICAgMAorI2RlZmluZSBWUDlfVFhfTU9ERV84XzFfT0ZGU0VUICAgMQorI2RlZmluZSBWUDlfVFhfTU9ERV8xNl8wX09GRlNFVCAgMgorI2RlZmluZSBWUDlfVFhfTU9ERV8xNl8xX09GRlNFVCAgNAorI2RlZmluZSBWUDlfVFhfTU9ERV8zMl8wX09GRlNFVCAgNgorI2RlZmluZSBWUDlfVFhfTU9ERV8zMl8xX09GRlNFVCAgOQorI2RlZmluZSBWUDlfVFhfTU9ERV9TSVpFICAgICAgICAgMTIKKyNkZWZpbmUgVlA5X0NPRUZfU1RBUlQgICAgICAgICAgIChWUDlfVFhfTU9ERV9TVEFSVCtWUDlfVFhfTU9ERV9TSVpFKQorI2RlZmluZSBWUDlfQ09FRl9CQU5EXzBfT0ZGU0VUICAgMAorI2RlZmluZSBWUDlfQ09FRl9CQU5EXzFfT0ZGU0VUICAgKFZQOV9DT0VGX0JBTkRfMF9PRkZTRVQgKyAzICogMyArIDEpCisjZGVmaW5lIFZQOV9DT0VGX0JBTkRfMl9PRkZTRVQgICAoVlA5X0NPRUZfQkFORF8xX09GRlNFVCArIDYgKiAzKQorI2RlZmluZSBWUDlfQ09FRl9CQU5EXzNfT0ZGU0VUICAgKFZQOV9DT0VGX0JBTkRfMl9PRkZTRVQgKyA2ICogMykKKyNkZWZpbmUgVlA5X0NPRUZfQkFORF80X09GRlNFVCAgIChWUDlfQ09FRl9CQU5EXzNfT0ZGU0VUICsgNiAqIDMpCisjZGVmaW5lIFZQOV9DT0VGX0JBTkRfNV9PRkZTRVQgICAoVlA5X0NPRUZfQkFORF80X09GRlNFVCArIDYgKiAzKQorI2RlZmluZSBWUDlfQ09FRl9TSVpFX09ORV9TRVQgICAgMTAwIC8qICgoMyArNSo2KSozICsgMSBwYWRkaW5nKSovCisjZGVmaW5lIFZQOV9DT0VGXzRYNF9TVEFSVCAgICAgICAoVlA5X0NPRUZfU1RBUlQgKyAwICogVlA5X0NPRUZfU0laRV9PTkVfU0VUKQorI2RlZmluZSBWUDlfQ09FRl84WDhfU1RBUlQgICAgICAgKFZQOV9DT0VGX1NUQVJUICsgNCAqIFZQOV9DT0VGX1NJWkVfT05FX1NFVCkKKyNkZWZpbmUgVlA5X0NPRUZfMTZYMTZfU1RBUlQgICAgIChWUDlfQ09FRl9TVEFSVCArIDggKiBWUDlfQ09FRl9TSVpFX09ORV9TRVQpCisjZGVmaW5lIFZQOV9DT0VGXzMyWDMyX1NUQVJUICAgICAoVlA5X0NPRUZfU1RBUlQgKyAxMiAqIFZQOV9DT0VGX1NJWkVfT05FX1NFVCkKKyNkZWZpbmUgVlA5X0NPRUZfU0laRV9QTEFORSAgICAgICgyICogVlA5X0NPRUZfU0laRV9PTkVfU0VUKQorI2RlZmluZSBWUDlfQ09FRl9TSVpFICAgICAgICAgICAgKDQgKiAyICogMiAqIFZQOV9DT0VGX1NJWkVfT05FX1NFVCkKKyNkZWZpbmUgVlA5X0lOVEVSX01PREVfU1RBUlQgICAgIChWUDlfQ09FRl9TVEFSVCtWUDlfQ09FRl9TSVpFKQorI2RlZmluZSBWUDlfSU5URVJfTU9ERV9TSVpFICAgICAgMjQgLyogb25seSB1c2UgMjEgKCAjKjcpKi8KKyNkZWZpbmUgVlA5X0lOVEVSUF9TVEFSVCAgICAgICAgIChWUDlfSU5URVJfTU9ERV9TVEFSVCtWUDlfSU5URVJfTU9ERV9TSVpFKQorI2RlZmluZSBWUDlfSU5URVJQX1NJWkUgICAgICAgICAgOAorI2RlZmluZSBWUDlfSU5UUkFfSU5URVJfU1RBUlQgICAgKFZQOV9JTlRFUlBfU1RBUlQrVlA5X0lOVEVSUF9TSVpFKQorI2RlZmluZSBWUDlfSU5UUkFfSU5URVJfU0laRSAgICAgNAorI2RlZmluZSBWUDlfSU5URVJQX0lOVFJBX0lOVEVSX1NUQVJUICBWUDlfSU5URVJQX1NUQVJUCisjZGVmaW5lIFZQOV9JTlRFUlBfSU5UUkFfSU5URVJfU0laRSAgIChWUDlfSU5URVJQX1NJWkUgKyBWUDlfSU5UUkFfSU5URVJfU0laRSkKKyNkZWZpbmUgVlA5X0NPTVBfSU5URVJfU1RBUlQgICAgIFwKKwkJKFZQOV9JTlRFUlBfSU5UUkFfSU5URVJfU1RBUlQrVlA5X0lOVEVSUF9JTlRSQV9JTlRFUl9TSVpFKQorI2RlZmluZSBWUDlfQ09NUF9JTlRFUl9TSVpFICAgICAgNQorI2RlZmluZSBWUDlfQ09NUF9SRUZfU1RBUlQgICAgICAgKFZQOV9DT01QX0lOVEVSX1NUQVJUK1ZQOV9DT01QX0lOVEVSX1NJWkUpCisjZGVmaW5lIFZQOV9DT01QX1JFRl9TSVpFICAgICAgICA1CisjZGVmaW5lIFZQOV9TSU5HTEVfUkVGX1NUQVJUICAgICAoVlA5X0NPTVBfUkVGX1NUQVJUK1ZQOV9DT01QX1JFRl9TSVpFKQorI2RlZmluZSBWUDlfU0lOR0xFX1JFRl9TSVpFICAgICAgMTAKKyNkZWZpbmUgVlA5X1JFRl9NT0RFX1NUQVJUICAgICAgIFZQOV9DT01QX0lOVEVSX1NUQVJUCisjZGVmaW5lIFZQOV9SRUZfTU9ERV9TSVpFICAgICAgICBcCisJCShWUDlfQ09NUF9JTlRFUl9TSVpFK1ZQOV9DT01QX1JFRl9TSVpFK1ZQOV9TSU5HTEVfUkVGX1NJWkUpCisjZGVmaW5lIFZQOV9JRl9ZX01PREVfU1RBUlQgICAgICAoVlA5X1JFRl9NT0RFX1NUQVJUK1ZQOV9SRUZfTU9ERV9TSVpFKQorI2RlZmluZSBWUDlfSUZfWV9NT0RFX1NJWkUgICAgICAgMzYKKyNkZWZpbmUgVlA5X0lGX1VWX01PREVfU1RBUlQgICAgIChWUDlfSUZfWV9NT0RFX1NUQVJUK1ZQOV9JRl9ZX01PREVfU0laRSkKKyNkZWZpbmUgVlA5X0lGX1VWX01PREVfU0laRSAgICAgIDkyIC8qIG9ubHkgdXNlIDkwKi8KKyNkZWZpbmUgVlA5X01WX0pPSU5UU19TVEFSVCAgICAgIChWUDlfSUZfVVZfTU9ERV9TVEFSVCtWUDlfSUZfVVZfTU9ERV9TSVpFKQorI2RlZmluZSBWUDlfTVZfSk9JTlRTX1NJWkUgICAgICAgMworI2RlZmluZSBWUDlfTVZfU0lHTl8wX1NUQVJUICAgICAgKFZQOV9NVl9KT0lOVFNfU1RBUlQrVlA5X01WX0pPSU5UU19TSVpFKQorI2RlZmluZSBWUDlfTVZfU0lHTl8wX1NJWkUgICAgICAgMQorI2RlZmluZSBWUDlfTVZfQ0xBU1NFU18wX1NUQVJUICAgKFZQOV9NVl9TSUdOXzBfU1RBUlQrVlA5X01WX1NJR05fMF9TSVpFKQorI2RlZmluZSBWUDlfTVZfQ0xBU1NFU18wX1NJWkUgICAgMTAKKyNkZWZpbmUgVlA5X01WX0NMQVNTMF8wX1NUQVJUICAgIChWUDlfTVZfQ0xBU1NFU18wX1NUQVJUK1ZQOV9NVl9DTEFTU0VTXzBfU0laRSkKKyNkZWZpbmUgVlA5X01WX0NMQVNTMF8wX1NJWkUgICAgIDEKKyNkZWZpbmUgVlA5X01WX0JJVFNfMF9TVEFSVCAgICAgIChWUDlfTVZfQ0xBU1MwXzBfU1RBUlQrVlA5X01WX0NMQVNTMF8wX1NJWkUpCisjZGVmaW5lIFZQOV9NVl9CSVRTXzBfU0laRSAgICAgICAxMAorI2RlZmluZSBWUDlfTVZfU0lHTl8xX1NUQVJUICAgICAgKFZQOV9NVl9CSVRTXzBfU1RBUlQrVlA5X01WX0JJVFNfMF9TSVpFKQorI2RlZmluZSBWUDlfTVZfU0lHTl8xX1NJWkUgICAgICAgMQorI2RlZmluZSBWUDlfTVZfQ0xBU1NFU18xX1NUQVJUICAgXAorCQkJKFZQOV9NVl9TSUdOXzFfU1RBUlQrVlA5X01WX1NJR05fMV9TSVpFKQorI2RlZmluZSBWUDlfTVZfQ0xBU1NFU18xX1NJWkUgICAgMTAKKyNkZWZpbmUgVlA5X01WX0NMQVNTMF8xX1NUQVJUICAgIFwKKwkJCShWUDlfTVZfQ0xBU1NFU18xX1NUQVJUK1ZQOV9NVl9DTEFTU0VTXzFfU0laRSkKKyNkZWZpbmUgVlA5X01WX0NMQVNTMF8xX1NJWkUgICAgIDEKKyNkZWZpbmUgVlA5X01WX0JJVFNfMV9TVEFSVCAgICAgIFwKKwkJCShWUDlfTVZfQ0xBU1MwXzFfU1RBUlQrVlA5X01WX0NMQVNTMF8xX1NJWkUpCisjZGVmaW5lIFZQOV9NVl9CSVRTXzFfU0laRSAgICAgICAxMAorI2RlZmluZSBWUDlfTVZfQ0xBU1MwX0ZQXzBfU1RBUlQgXAorCQkJKFZQOV9NVl9CSVRTXzFfU1RBUlQrVlA5X01WX0JJVFNfMV9TSVpFKQorI2RlZmluZSBWUDlfTVZfQ0xBU1MwX0ZQXzBfU0laRSAgOQorI2RlZmluZSBWUDlfTVZfQ0xBU1MwX0ZQXzFfU1RBUlQgXAorCQkJKFZQOV9NVl9DTEFTUzBfRlBfMF9TVEFSVCtWUDlfTVZfQ0xBU1MwX0ZQXzBfU0laRSkKKyNkZWZpbmUgVlA5X01WX0NMQVNTMF9GUF8xX1NJWkUgIDkKKyNkZWZpbmUgVlA5X01WX0NMQVNTMF9IUF8wX1NUQVJUIFwKKwkJCShWUDlfTVZfQ0xBU1MwX0ZQXzFfU1RBUlQrVlA5X01WX0NMQVNTMF9GUF8xX1NJWkUpCisjZGVmaW5lIFZQOV9NVl9DTEFTUzBfSFBfMF9TSVpFICAyCisjZGVmaW5lIFZQOV9NVl9DTEFTUzBfSFBfMV9TVEFSVCBcCisJCQkoVlA5X01WX0NMQVNTMF9IUF8wX1NUQVJUK1ZQOV9NVl9DTEFTUzBfSFBfMF9TSVpFKQorI2RlZmluZSBWUDlfTVZfQ0xBU1MwX0hQXzFfU0laRSAgMgorI2RlZmluZSBWUDlfTVZfU1RBUlQgICAgICAgICAgICAgVlA5X01WX0pPSU5UU19TVEFSVAorI2RlZmluZSBWUDlfTVZfU0laRSAgICAgICAgICAgICAgNzIgLypvbmx5IHVzZSA2OSovCisKKyNkZWZpbmUgVlA5X1RPVEFMX1NJWkUgICAgICAgICAgIChWUDlfTVZfU1RBUlQgKyBWUDlfTVZfU0laRSkKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoJdnA5X2NvdW50X21lbSBkZWZpbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKyNkZWZpbmUgVlA5X0NPRUZfQ09VTlRfU1RBUlQgICAgICAgICAgIDAKKyNkZWZpbmUgVlA5X0NPRUZfQ09VTlRfQkFORF8wX09GRlNFVCAgIDAKKyNkZWZpbmUgVlA5X0NPRUZfQ09VTlRfQkFORF8xX09GRlNFVCAgIFwKKwkJCShWUDlfQ09FRl9DT1VOVF9CQU5EXzBfT0ZGU0VUICsgMyo1KQorI2RlZmluZSBWUDlfQ09FRl9DT1VOVF9CQU5EXzJfT0ZGU0VUICAgXAorCQkJKFZQOV9DT0VGX0NPVU5UX0JBTkRfMV9PRkZTRVQgKyA2KjUpCisjZGVmaW5lIFZQOV9DT0VGX0NPVU5UX0JBTkRfM19PRkZTRVQgICBcCisJCQkoVlA5X0NPRUZfQ09VTlRfQkFORF8yX09GRlNFVCArIDYqNSkKKyNkZWZpbmUgVlA5X0NPRUZfQ09VTlRfQkFORF80X09GRlNFVCAgIFwKKwkJCShWUDlfQ09FRl9DT1VOVF9CQU5EXzNfT0ZGU0VUICsgNio1KQorI2RlZmluZSBWUDlfQ09FRl9DT1VOVF9CQU5EXzVfT0ZGU0VUICAgXAorCQkJKFZQOV9DT0VGX0NPVU5UX0JBTkRfNF9PRkZTRVQgKyA2KjUpCisjZGVmaW5lIFZQOV9DT0VGX0NPVU5UX1NJWkVfT05FX1NFVCAgICAxNjUgLyogKCgzICs1KjYpKjUgKi8KKyNkZWZpbmUgVlA5X0NPRUZfQ09VTlRfNFg0X1NUQVJUICAgICAgIFwKKwkoVlA5X0NPRUZfQ09VTlRfU1RBUlQgKyAwKlZQOV9DT0VGX0NPVU5UX1NJWkVfT05FX1NFVCkKKyNkZWZpbmUgVlA5X0NPRUZfQ09VTlRfOFg4X1NUQVJUICAgICAgIFwKKwkoVlA5X0NPRUZfQ09VTlRfU1RBUlQgKyA0KlZQOV9DT0VGX0NPVU5UX1NJWkVfT05FX1NFVCkKKyNkZWZpbmUgVlA5X0NPRUZfQ09VTlRfMTZYMTZfU1RBUlQgICAgIFwKKwkoVlA5X0NPRUZfQ09VTlRfU1RBUlQgKyA4KlZQOV9DT0VGX0NPVU5UX1NJWkVfT05FX1NFVCkKKyNkZWZpbmUgVlA5X0NPRUZfQ09VTlRfMzJYMzJfU1RBUlQgICAgIFwKKwkoVlA5X0NPRUZfQ09VTlRfU1RBUlQgKyAxMipWUDlfQ09FRl9DT1VOVF9TSVpFX09ORV9TRVQpCisjZGVmaW5lIFZQOV9DT0VGX0NPVU5UX1NJWkVfUExBTkUgICAgICAoMiAqIFZQOV9DT0VGX0NPVU5UX1NJWkVfT05FX1NFVCkKKyNkZWZpbmUgVlA5X0NPRUZfQ09VTlRfU0laRSAgICAgICAgICAgICg0ICogMiAqIDIgKiBWUDlfQ09FRl9DT1VOVF9TSVpFX09ORV9TRVQpCisKKyNkZWZpbmUgVlA5X0lOVFJBX0lOVEVSX0NPVU5UX1NUQVJUICAgIFwKKwkoVlA5X0NPRUZfQ09VTlRfU1RBUlQrVlA5X0NPRUZfQ09VTlRfU0laRSkKKyNkZWZpbmUgVlA5X0lOVFJBX0lOVEVSX0NPVU5UX1NJWkUgICAgICg0KjIpCisjZGVmaW5lIFZQOV9DT01QX0lOVEVSX0NPVU5UX1NUQVJUICAgICBcCisJKFZQOV9JTlRSQV9JTlRFUl9DT1VOVF9TVEFSVCtWUDlfSU5UUkFfSU5URVJfQ09VTlRfU0laRSkKKyNkZWZpbmUgVlA5X0NPTVBfSU5URVJfQ09VTlRfU0laRSAgICAgICg1KjIpCisjZGVmaW5lIFZQOV9DT01QX1JFRl9DT1VOVF9TVEFSVCAgICAgICBcCisJKFZQOV9DT01QX0lOVEVSX0NPVU5UX1NUQVJUK1ZQOV9DT01QX0lOVEVSX0NPVU5UX1NJWkUpCisjZGVmaW5lIFZQOV9DT01QX1JFRl9DT1VOVF9TSVpFICAgICAgICAoNSoyKQorI2RlZmluZSBWUDlfU0lOR0xFX1JFRl9DT1VOVF9TVEFSVCAgICAgXAorCShWUDlfQ09NUF9SRUZfQ09VTlRfU1RBUlQrVlA5X0NPTVBfUkVGX0NPVU5UX1NJWkUpCisjZGVmaW5lIFZQOV9TSU5HTEVfUkVGX0NPVU5UX1NJWkUgICAgICAoMTAqMikKKyNkZWZpbmUgVlA5X1RYX01PREVfQ09VTlRfU1RBUlQgICAgICAgIFwKKwkoVlA5X1NJTkdMRV9SRUZfQ09VTlRfU1RBUlQrVlA5X1NJTkdMRV9SRUZfQ09VTlRfU0laRSkKKyNkZWZpbmUgVlA5X1RYX01PREVfQ09VTlRfU0laRSAgICAgICAgICgxMioyKQorI2RlZmluZSBWUDlfU0tJUF9DT1VOVF9TVEFSVCAgICAgICAgICAgXAorCShWUDlfVFhfTU9ERV9DT1VOVF9TVEFSVCtWUDlfVFhfTU9ERV9DT1VOVF9TSVpFKQorI2RlZmluZSBWUDlfU0tJUF9DT1VOVF9TSVpFICAgICAgICAgICAgKDMqMikKKyNkZWZpbmUgVlA5X01WX1NJR05fMF9DT1VOVF9TVEFSVCAgICAgIFwKKwkoVlA5X1NLSVBfQ09VTlRfU1RBUlQrVlA5X1NLSVBfQ09VTlRfU0laRSkKKyNkZWZpbmUgVlA5X01WX1NJR05fMF9DT1VOVF9TSVpFICAgICAgICgxKjIpCisjZGVmaW5lIFZQOV9NVl9TSUdOXzFfQ09VTlRfU1RBUlQgICAgICBcCisJKFZQOV9NVl9TSUdOXzBfQ09VTlRfU1RBUlQrVlA5X01WX1NJR05fMF9DT1VOVF9TSVpFKQorI2RlZmluZSBWUDlfTVZfU0lHTl8xX0NPVU5UX1NJWkUgICAgICAgKDEqMikKKyNkZWZpbmUgVlA5X01WX0JJVFNfMF9DT1VOVF9TVEFSVCAgICAgIFwKKwkoVlA5X01WX1NJR05fMV9DT1VOVF9TVEFSVCtWUDlfTVZfU0lHTl8xX0NPVU5UX1NJWkUpCisjZGVmaW5lIFZQOV9NVl9CSVRTXzBfQ09VTlRfU0laRSAgICAgICAoMTAqMikKKyNkZWZpbmUgVlA5X01WX0JJVFNfMV9DT1VOVF9TVEFSVCAgICAgIFwKKwkoVlA5X01WX0JJVFNfMF9DT1VOVF9TVEFSVCtWUDlfTVZfQklUU18wX0NPVU5UX1NJWkUpCisjZGVmaW5lIFZQOV9NVl9CSVRTXzFfQ09VTlRfU0laRSAgICAgICAoMTAqMikKKyNkZWZpbmUgVlA5X01WX0NMQVNTMF9IUF8wX0NPVU5UX1NUQVJUIFwKKwkoVlA5X01WX0JJVFNfMV9DT1VOVF9TVEFSVCtWUDlfTVZfQklUU18xX0NPVU5UX1NJWkUpCisjZGVmaW5lIFZQOV9NVl9DTEFTUzBfSFBfMF9DT1VOVF9TSVpFICAoMioyKQorI2RlZmluZSBWUDlfTVZfQ0xBU1MwX0hQXzFfQ09VTlRfU1RBUlQgXAorCShWUDlfTVZfQ0xBU1MwX0hQXzBfQ09VTlRfU1RBUlQrVlA5X01WX0NMQVNTMF9IUF8wX0NPVU5UX1NJWkUpCisjZGVmaW5lIFZQOV9NVl9DTEFTUzBfSFBfMV9DT1VOVF9TSVpFICAoMioyKQorLyogU3RhcnQgbWVyZ2VfdHJlZSovCisjZGVmaW5lIFZQOV9JTlRFUl9NT0RFX0NPVU5UX1NUQVJUICAgICBcCisJKFZQOV9NVl9DTEFTUzBfSFBfMV9DT1VOVF9TVEFSVCtWUDlfTVZfQ0xBU1MwX0hQXzFfQ09VTlRfU0laRSkKKyNkZWZpbmUgVlA5X0lOVEVSX01PREVfQ09VTlRfU0laRSAgICAgICg3KjQpCisjZGVmaW5lIFZQOV9JRl9ZX01PREVfQ09VTlRfU1RBUlQgICAgICBcCisJKFZQOV9JTlRFUl9NT0RFX0NPVU5UX1NUQVJUK1ZQOV9JTlRFUl9NT0RFX0NPVU5UX1NJWkUpCisjZGVmaW5lIFZQOV9JRl9ZX01PREVfQ09VTlRfU0laRSAgICAgICAoMTAqNCkKKyNkZWZpbmUgVlA5X0lGX1VWX01PREVfQ09VTlRfU1RBUlQgICAgIFwKKwkoVlA5X0lGX1lfTU9ERV9DT1VOVF9TVEFSVCtWUDlfSUZfWV9NT0RFX0NPVU5UX1NJWkUpCisjZGVmaW5lIFZQOV9JRl9VVl9NT0RFX0NPVU5UX1NJWkUgICAgICAoMTAqMTApCisjZGVmaW5lIFZQOV9QQVJUSVRJT05fUF9DT1VOVF9TVEFSVCAgICBcCisJKFZQOV9JRl9VVl9NT0RFX0NPVU5UX1NUQVJUK1ZQOV9JRl9VVl9NT0RFX0NPVU5UX1NJWkUpCisjZGVmaW5lIFZQOV9QQVJUSVRJT05fUF9DT1VOVF9TSVpFICAgICAoNCo0KjQpCisjZGVmaW5lIFZQOV9JTlRFUlBfQ09VTlRfU1RBUlQgICAgICAgICBcCisJKFZQOV9QQVJUSVRJT05fUF9DT1VOVF9TVEFSVCtWUDlfUEFSVElUSU9OX1BfQ09VTlRfU0laRSkKKyNkZWZpbmUgVlA5X0lOVEVSUF9DT1VOVF9TSVpFICAgICAgICAgICg0KjMpCisjZGVmaW5lIFZQOV9NVl9KT0lOVFNfQ09VTlRfU1RBUlQgICAgICBcCisJKFZQOV9JTlRFUlBfQ09VTlRfU1RBUlQrVlA5X0lOVEVSUF9DT1VOVF9TSVpFKQorI2RlZmluZSBWUDlfTVZfSk9JTlRTX0NPVU5UX1NJWkUgICAgICAgKDEgKiA0KQorI2RlZmluZSBWUDlfTVZfQ0xBU1NFU18wX0NPVU5UX1NUQVJUICAgXAorCShWUDlfTVZfSk9JTlRTX0NPVU5UX1NUQVJUK1ZQOV9NVl9KT0lOVFNfQ09VTlRfU0laRSkKKyNkZWZpbmUgVlA5X01WX0NMQVNTRVNfMF9DT1VOVF9TSVpFICAgICgxKjExKQorI2RlZmluZSBWUDlfTVZfQ0xBU1MwXzBfQ09VTlRfU1RBUlQgICAgXAorCShWUDlfTVZfQ0xBU1NFU18wX0NPVU5UX1NUQVJUK1ZQOV9NVl9DTEFTU0VTXzBfQ09VTlRfU0laRSkKKyNkZWZpbmUgVlA5X01WX0NMQVNTMF8wX0NPVU5UX1NJWkUgICAgICgxKjIpCisjZGVmaW5lIFZQOV9NVl9DTEFTU0VTXzFfQ09VTlRfU1RBUlQgICBcCisJKFZQOV9NVl9DTEFTUzBfMF9DT1VOVF9TVEFSVCtWUDlfTVZfQ0xBU1MwXzBfQ09VTlRfU0laRSkKKyNkZWZpbmUgVlA5X01WX0NMQVNTRVNfMV9DT1VOVF9TSVpFICAgICgxKjExKQorI2RlZmluZSBWUDlfTVZfQ0xBU1MwXzFfQ09VTlRfU1RBUlQgICAgXAorCShWUDlfTVZfQ0xBU1NFU18xX0NPVU5UX1NUQVJUK1ZQOV9NVl9DTEFTU0VTXzFfQ09VTlRfU0laRSkKKyNkZWZpbmUgVlA5X01WX0NMQVNTMF8xX0NPVU5UX1NJWkUgICAgICgxKjIpCisjZGVmaW5lIFZQOV9NVl9DTEFTUzBfRlBfMF9DT1VOVF9TVEFSVCBcCisJKFZQOV9NVl9DTEFTUzBfMV9DT1VOVF9TVEFSVCtWUDlfTVZfQ0xBU1MwXzFfQ09VTlRfU0laRSkKKyNkZWZpbmUgVlA5X01WX0NMQVNTMF9GUF8wX0NPVU5UX1NJWkUgICgzKjQpCisjZGVmaW5lIFZQOV9NVl9DTEFTUzBfRlBfMV9DT1VOVF9TVEFSVCBcCisJKFZQOV9NVl9DTEFTUzBfRlBfMF9DT1VOVF9TVEFSVCtWUDlfTVZfQ0xBU1MwX0ZQXzBfQ09VTlRfU0laRSkKKyNkZWZpbmUgVlA5X01WX0NMQVNTMF9GUF8xX0NPVU5UX1NJWkUgICgzKjQpCisKKworI2RlZmluZSBEQ19QUkVEICAgIDAgICAgICAgLyogQXZlcmFnZSBvZiBhYm92ZSBhbmQgbGVmdCBwaXhlbHMqLworI2RlZmluZSBWX1BSRUQgICAgIDEgICAgICAgLyogVmVydGljYWwqLworI2RlZmluZSBIX1BSRUQgICAgIDIgICAgICAgLyogSG9yaXpvbnRhbCovCisjZGVmaW5lIEQ0NV9QUkVEICAgMyAgICAgICAvKkRpcmVjdGlvbmFsIDQ1IGRlZyA9IHJvdW5kKGFyY3RhbigxLzEpICogMTgwL3BpKSovCisjZGVmaW5lIEQxMzVfUFJFRCAgNCAgICAgICAvKiBEaXJlY3Rpb25hbCAxMzUgZGVnID0gMTgwIC0gNDUqLworI2RlZmluZSBEMTE3X1BSRUQgIDUgICAgICAgLyogRGlyZWN0aW9uYWwgMTE3IGRlZyA9IDE4MCAtIDYzKi8KKyNkZWZpbmUgRDE1M19QUkVEICA2ICAgICAgIC8qIERpcmVjdGlvbmFsIDE1MyBkZWcgPSAxODAgLSAyNyovCisjZGVmaW5lIEQyMDdfUFJFRCAgNyAgICAgICAvKiBEaXJlY3Rpb25hbCAyMDcgZGVnID0gMTgwICsgMjcqLworI2RlZmluZSBENjNfUFJFRCAgIDggICAgICAgLypEaXJlY3Rpb25hbCA2MyBkZWcgPSByb3VuZChhcmN0YW4oMi8xKSAqIDE4MC9waSkqLworI2RlZmluZSBUTV9QUkVEICAgIDkgICAgICAgLypUcnVlLW1vdGlvbiovCisKK2ludCBjbGlwX3Byb2IoaW50IHApCit7CisJcmV0dXJuIChwID4gMjU1KSA/IDI1NSA6IChwIDwgMSkgPyAxIDogcDsKK30KKworI2RlZmluZSBST1VORF9QT1dFUl9PRl9UV08odmFsdWUsIG4pIFwKKwkoKCh2YWx1ZSkgKyAoMSA8PCAoKG4pIC0gMSkpKSA+PiAobikpCisKKyNkZWZpbmUgTU9ERV9NVl9DT1VOVF9TQVQgMjAKK3N0YXRpYyBjb25zdCBpbnQgY291bnRfdG9fdXBkYXRlX2ZhY3RvcltNT0RFX01WX0NPVU5UX1NBVCArIDFdID0geworCTAsIDYsIDEyLCAxOSwgMjUsIDMyLCAzOCwgNDQsIDUxLCA1NywgNjQsCisJNzAsIDc2LCA4MywgODksIDk2LCAxMDIsIDEwOCwgMTE1LCAxMjEsIDEyOAorfTsKKwordm9pZCAgIHZwOV90cmVlX21lcmdlX3Byb2JzKHVuc2lnbmVkIGludCAqcHJldl9wcm9iLCB1bnNpZ25lZCBpbnQgKmN1cl9wcm9iLAorCWludCBjb2VmX25vZGVfc3RhcnQsIGludCB0cmVlX2xlZnQsIGludCB0cmVlX3JpZ2h0LCBpbnQgdHJlZV9pLAorCWludCBub2RlKSB7CisKKwlpbnQgcHJvYl8zMiwgcHJvYl9yZXMsIHByb2Jfc2hpZnQ7CisJaW50IHByZV9wcm9iLCBuZXdfcHJvYjsKKwlpbnQgZGVuLCBtX2NvdW50LCBnZXRfcHJvYiwgZmFjdG9yOworCisJcHJvYl8zMiA9IHByZXZfcHJvYltjb2VmX25vZGVfc3RhcnQgLyA0ICogMl07CisJcHJvYl9yZXMgPSBjb2VmX25vZGVfc3RhcnQgJiAzOworCXByb2Jfc2hpZnQgPSBwcm9iX3JlcyAqIDg7CisJcHJlX3Byb2IgPSAocHJvYl8zMiA+PiBwcm9iX3NoaWZ0KSAmIDB4ZmY7CisKKwlkZW4gPSB0cmVlX2xlZnQgKyB0cmVlX3JpZ2h0OworCisJaWYgKGRlbiA9PSAwKQorCQluZXdfcHJvYiA9IHByZV9wcm9iOworCWVsc2UgeworCQltX2NvdW50ID0gKGRlbiA8IE1PREVfTVZfQ09VTlRfU0FUKSA/CisJCQlkZW4gOiBNT0RFX01WX0NPVU5UX1NBVDsKKwkJZ2V0X3Byb2IgPSBjbGlwX3Byb2IoCisJCQkJZGl2X3IzMigoKGludDY0X3QpdHJlZV9sZWZ0ICogMjU2ICsgKGRlbiA+PiAxKSksCisJCQkJZGVuKSk7CisJCS8qd2VpZ2h0ZWRfcHJvYiovCisJCWZhY3RvciA9IGNvdW50X3RvX3VwZGF0ZV9mYWN0b3JbbV9jb3VudF07CisJCW5ld19wcm9iID0gUk9VTkRfUE9XRVJfT0ZfVFdPKHByZV9wcm9iICogKDI1NiAtIGZhY3RvcikKKwkJCQkrIGdldF9wcm9iICogZmFjdG9yLCA4KTsKKwl9CisJY3VyX3Byb2JbY29lZl9ub2RlX3N0YXJ0IC8gNCAqIDJdID0gKGN1cl9wcm9iW2NvZWZfbm9kZV9zdGFydCAvIDQgKiAyXQorCQkJJiAofigweGZmIDw8IHByb2Jfc2hpZnQpKSkgfCAobmV3X3Byb2IgPDwgcHJvYl9zaGlmdCk7CisKKwkvKnByX2luZm8oIiAtIFslZF1bJWRdIDB4JTAyWCAtLT4gMHglMDJYICgweCVYIDB4JVgpICglWClcbiIsCisJICp0cmVlX2ksIG5vZGUsIHByZV9wcm9iLCBuZXdfcHJvYiwgdHJlZV9sZWZ0LCB0cmVlX3JpZ2h0LAorCSAqY3VyX3Byb2JbY29lZl9ub2RlX3N0YXJ0LzQqMl0pOworCSAqLworfQorCisKKy8qdm9pZCBhZGFwdF9jb2VmX3Byb2JzKHZvaWQpKi8KK3ZvaWQgYWRhcHRfY29lZl9wcm9icyhpbnQgcGljX2NvdW50LCBpbnQgcHJldl9rZiwgaW50IGN1cl9rZiwgaW50IHByZV9mYywKKwl1bnNpZ25lZCBpbnQgKnByZXZfcHJvYiwgdW5zaWduZWQgaW50ICpjdXJfcHJvYiwgdW5zaWduZWQgaW50ICpjb3VudCkKK3sKKwkvKiA4MCAqIDY0Yml0cyA9IDB4RjAwICggdXNlIDB4MTAwMCA0SyBieXRlcykKKwkgKnVuc2lnbmVkIGludCBwcmV2X3Byb2JbNDk2KjJdOworCSAqdW5zaWduZWQgaW50IGN1cl9wcm9iWzQ5NioyXTsKKwkgKjB4MzAwICogMTI4Yml0cyA9IDB4MzAwMCAoMzJLIEJ5dGVzKQorCSAqdW5zaWduZWQgaW50IGNvdW50WzB4MzAwKjRdOworCSAqLworCisJaW50IHR4X3NpemUsIGNvZWZfdHhfc2l6ZV9zdGFydCwgY29lZl9jb3VudF90eF9zaXplX3N0YXJ0OworCWludCBwbGFuZSwgY29lZl9wbGFuZV9zdGFydCwgY29lZl9jb3VudF9wbGFuZV9zdGFydDsKKwlpbnQgdHlwZSwgY29lZl90eXBlX3N0YXJ0LCBjb2VmX2NvdW50X3R5cGVfc3RhcnQ7CisJaW50IGJhbmQsIGNvZWZfYmFuZF9zdGFydCwgY29lZl9jb3VudF9iYW5kX3N0YXJ0OworCWludCBjeHRfbnVtOworCWludCBjeHQsIGNvZWZfY3h0X3N0YXJ0LCBjb2VmX2NvdW50X2N4dF9zdGFydDsKKwlpbnQgbm9kZSwgY29lZl9ub2RlX3N0YXJ0LCBjb2VmX2NvdW50X25vZGVfc3RhcnQ7CisKKwlpbnQgdHJlZV9pLCB0cmVlX2xlZnQsIHRyZWVfcmlnaHQ7CisJaW50IG12ZF9pOworCisJaW50IGNvdW50X3NhdCA9IDI0OworCS8qaW50IHVwZGF0ZV9mYWN0b3IgPSAxMTI7Ki8gLypJZiBDT0VGX01BWF9VUERBVEVfRkFDVE9SX0FGVEVSX0tFWSwKKwkgKnVzZSAxMjgKKwkgKi8KKwkvKiBJZiBDT0VGX01BWF9VUERBVEVfRkFDVE9SX0FGVEVSX0tFWSwgdXNlIDEyOCovCisJLyppbnQgdXBkYXRlX2ZhY3RvciA9IChwaWNfY291bnQgPT0gMSkgPyAxMjggOiAxMTI7Ki8KKwlpbnQgdXBkYXRlX2ZhY3RvciA9ICAgY3VyX2tmID8gMTEyIDoKKwkJCXByZXZfa2YgPyAxMjggOiAxMTI7CisKKwlpbnQgcHJvYl8zMjsKKwlpbnQgcHJvYl9yZXM7CisJaW50IHByb2Jfc2hpZnQ7CisJaW50IHByZV9wcm9iOworCisJaW50IG51bSwgZGVuOworCWludCBnZXRfcHJvYjsKKwlpbnQgbV9jb3VudDsKKwlpbnQgZmFjdG9yOworCisJaW50IG5ld19wcm9iOworCisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX01FUkdFKQorCQlwcl9pbmZvCisJKCJcbiAjI2FkYXB0X2NvZWZfcHJvYnMgKHByZV9mYyA6ICVkICxwcmV2X2tmIDogJWQsY3VyX2tmIDogJWQpIyNcblxuIiwKKwlwcmVfZmMsIHByZXZfa2YsIGN1cl9rZik7CisKKwkvKmFkYXB0X2NvZWZfcHJvYnMqLworCWZvciAodHhfc2l6ZSA9IDA7IHR4X3NpemUgPCA0OyB0eF9zaXplKyspIHsKKwkJY29lZl90eF9zaXplX3N0YXJ0ID0gVlA5X0NPRUZfU1RBUlQKKwkJCSsgdHhfc2l6ZSAqIDQgKiBWUDlfQ09FRl9TSVpFX09ORV9TRVQ7CisJCWNvZWZfY291bnRfdHhfc2l6ZV9zdGFydCA9IFZQOV9DT0VGX0NPVU5UX1NUQVJUCisJCQkrIHR4X3NpemUgKiA0ICogVlA5X0NPRUZfQ09VTlRfU0laRV9PTkVfU0VUOworCQljb2VmX3BsYW5lX3N0YXJ0ID0gY29lZl90eF9zaXplX3N0YXJ0OworCQljb2VmX2NvdW50X3BsYW5lX3N0YXJ0ID0gY29lZl9jb3VudF90eF9zaXplX3N0YXJ0OworCQlmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCAyOyBwbGFuZSsrKSB7CisJCQljb2VmX3R5cGVfc3RhcnQgPSBjb2VmX3BsYW5lX3N0YXJ0OworCQkJY29lZl9jb3VudF90eXBlX3N0YXJ0ID0gY29lZl9jb3VudF9wbGFuZV9zdGFydDsKKwkJCWZvciAodHlwZSA9IDA7IHR5cGUgPCAyOyB0eXBlKyspIHsKKwkJCQljb2VmX2JhbmRfc3RhcnQgPSBjb2VmX3R5cGVfc3RhcnQ7CisJCQkJY29lZl9jb3VudF9iYW5kX3N0YXJ0ID0gY29lZl9jb3VudF90eXBlX3N0YXJ0OworCQkJCWZvciAoYmFuZCA9IDA7IGJhbmQgPCA2OyBiYW5kKyspIHsKKwkJCQkJaWYgKGJhbmQgPT0gMCkKKwkJCQkJCWN4dF9udW0gPSAzOworCQkJCQllbHNlCisJCQkJCQljeHRfbnVtID0gNjsKKwkJCQkJY29lZl9jeHRfc3RhcnQgPSBjb2VmX2JhbmRfc3RhcnQ7CisJCQkJCWNvZWZfY291bnRfY3h0X3N0YXJ0ID0KKwkJCQkJCWNvZWZfY291bnRfYmFuZF9zdGFydDsKKwkJCQkJZm9yIChjeHQgPSAwOyBjeHQgPCBjeHRfbnVtOyBjeHQrKykgeworCQkJCQkJY29uc3QgaW50IG4wID0KKwkJCQkJCWNvdW50W2NvZWZfY291bnRfY3h0X3N0YXJ0XTsKKwkJCQkJCWNvbnN0IGludCBuMSA9CisJCQkJCQljb3VudFtjb2VmX2NvdW50X2N4dF9zdGFydCArIDFdOworCQkJCQkJY29uc3QgaW50IG4yID0KKwkJCQkJCWNvdW50W2NvZWZfY291bnRfY3h0X3N0YXJ0ICsgMl07CisJCQkJCQljb25zdCBpbnQgbmVvYiA9CisJCQkJCQljb3VudFtjb2VmX2NvdW50X2N4dF9zdGFydCArIDNdOworCQkJCQkJY29uc3QgaW50IG5uZW9iID0KKwkJCQkJCWNvdW50W2NvZWZfY291bnRfY3h0X3N0YXJ0ICsgNF07CisJCQkJCQljb25zdCB1bnNpZ25lZCBpbnQKKwkJCQkJCWJyYW5jaF9jdFszXVsyXSA9IHsKKwkJCQkJCXsgbmVvYiwgbm5lb2IgfSwKKwkJCQkJCXsgbjAsIG4xICsgbjIgfSwKKwkJCQkJCXsgbjEsIG4yIH0KKwkJCQkJCX07CisJCQkJCQljb2VmX25vZGVfc3RhcnQgPQorCQkJCQkJCWNvZWZfY3h0X3N0YXJ0OworCQkJCQkJZm9yCisJCQkJCQkobm9kZSA9IDA7IG5vZGUgPCAzOyBub2RlKyspIHsKKwkJCQkJCQlwcm9iXzMyID0KKwkJCQkJCQlwcmV2X3Byb2JbCisJCQkJCQkJY29lZl9ub2RlX3N0YXJ0CisJCQkJCQkJLyA0ICogMl07CisJCQkJCQkJcHJvYl9yZXMgPQorCQkJCQkJCWNvZWZfbm9kZV9zdGFydCAmIDM7CisJCQkJCQkJcHJvYl9zaGlmdCA9CisJCQkJCQkJcHJvYl9yZXMgKiA4OworCQkJCQkJCXByZV9wcm9iID0KKwkJCQkJCQkocHJvYl8zMiA+PiBwcm9iX3NoaWZ0KQorCQkJCQkJCSYgMHhmZjsKKworCQkJCQkJCS8qZ2V0X2JpbmFyeV9wcm9iKi8KKwkJCQkJCQludW0gPQorCQkJCQkJCWJyYW5jaF9jdFtub2RlXVswXTsKKwkJCQkJCQlkZW4gPQorCQkJCQkJCWJyYW5jaF9jdFtub2RlXVswXSArCisJCQkJCQkJIGJyYW5jaF9jdFtub2RlXVsxXTsKKwkJCQkJCQltX2NvdW50ID0gKGRlbiA8CisJCQkJCQkJY291bnRfc2F0KQorCQkJCQkJCT8gZGVuIDogY291bnRfc2F0OworCisJCQkJCQkJZ2V0X3Byb2IgPQorCQkJCQkJCShkZW4gPT0gMCkgPyAxMjh1IDoKKwkJCQkJCQljbGlwX3Byb2IoCisJCQkJCQkJZGl2X3IzMigoKGludDY0X3QpCisJCQkJCQkJbnVtICogMjU2CisJCQkJCQkJKyAoZGVuID4+IDEpKSwKKwkJCQkJCQlkZW4pKTsKKworCQkJCQkJCWZhY3RvciA9CisJCQkJCQkJdXBkYXRlX2ZhY3RvciAqIG1fY291bnQKKwkJCQkJCQkvIGNvdW50X3NhdDsKKwkJCQkJCQluZXdfcHJvYiA9CisJCQkJCQkJUk9VTkRfUE9XRVJfT0ZfVFdPCisJCQkJCQkJKHByZV9wcm9iICoKKwkJCQkJCQkoMjU2IC0gZmFjdG9yKSArCisJCQkJCQkJZ2V0X3Byb2IgKiBmYWN0b3IsIDgpOworCisJCQkJCQkJY3VyX3Byb2JbY29lZl9ub2RlX3N0YXJ0CisJCQkJCQkJLyA0ICogMl0gPQorCQkJCQkJCShjdXJfcHJvYgorCQkJCQkJCVtjb2VmX25vZGVfc3RhcnQKKwkJCQkJCQkvIDQgKiAyXSAmICh+KDB4ZmYgPDwKKwkJCQkJCQlwcm9iX3NoaWZ0KSkpIHwKKwkJCQkJCQkobmV3X3Byb2IgPDwKKwkJCQkJCQlwcm9iX3NoaWZ0KTsKKworCQkJCQkJCWNvZWZfbm9kZV9zdGFydCArPSAxOworCQkJCQkJfQorCisJCQkJCQljb2VmX2N4dF9zdGFydCA9CisJCQkJCQkJY29lZl9jeHRfc3RhcnQgKyAzOworCQkJCQkJY29lZl9jb3VudF9jeHRfc3RhcnQgPQorCQkJCQkJCWNvZWZfY291bnRfY3h0X3N0YXJ0CisJCQkJCQkJKyA1OworCQkJCQl9CisJCQkJCWlmIChiYW5kID09IDApIHsKKwkJCQkJCWNvZWZfYmFuZF9zdGFydCArPSAxMDsKKwkJCQkJCWNvZWZfY291bnRfYmFuZF9zdGFydCArPSAxNTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWNvZWZfYmFuZF9zdGFydCArPSAxODsKKwkJCQkJCWNvZWZfY291bnRfYmFuZF9zdGFydCArPSAzMDsKKwkJCQkJfQorCQkJCX0KKwkJCQljb2VmX3R5cGVfc3RhcnQgKz0gVlA5X0NPRUZfU0laRV9PTkVfU0VUOworCQkJCWNvZWZfY291bnRfdHlwZV9zdGFydCArPQorCQkJCQlWUDlfQ09FRl9DT1VOVF9TSVpFX09ORV9TRVQ7CisJCQl9CisJCQljb2VmX3BsYW5lX3N0YXJ0ICs9IDIgKiBWUDlfQ09FRl9TSVpFX09ORV9TRVQ7CisJCQljb2VmX2NvdW50X3BsYW5lX3N0YXJ0ICs9CisJCQkJCTIgKiBWUDlfQ09FRl9DT1VOVF9TSVpFX09ORV9TRVQ7CisJCX0KKwl9CisKKwlpZiAoY3VyX2tmID09IDApIHsKKwkJLyptb2RlX212X21lcmdlX3Byb2JzIC0gbWVyZ2VfaW50cmFfaW50ZXJfcHJvYiovCisJCWZvciAoY29lZl9jb3VudF9ub2RlX3N0YXJ0ID0gVlA5X0lOVFJBX0lOVEVSX0NPVU5UX1NUQVJUOworCQljb2VmX2NvdW50X25vZGVfc3RhcnQgPCAoVlA5X01WX0NMQVNTMF9IUF8xX0NPVU5UX1NUQVJUICsKKwkJVlA5X01WX0NMQVNTMF9IUF8xX0NPVU5UX1NJWkUpOwljb2VmX2NvdW50X25vZGVfc3RhcnQgKz0gMikgeworCisJCQlpZiAoY29lZl9jb3VudF9ub2RlX3N0YXJ0ID09CisJCQkJVlA5X0lOVFJBX0lOVEVSX0NPVU5UX1NUQVJUKSB7CisJCQkJaWYgKGRlYnVnICYgVlA5X0RFQlVHX01FUkdFKQorCQkJCQlwcl9pbmZvKCIgIyBtZXJnZV9pbnRyYV9pbnRlcl9wcm9iXG4iKTsKKwkJCQljb2VmX25vZGVfc3RhcnQgPSBWUDlfSU5UUkFfSU5URVJfU1RBUlQ7CisJCQl9IGVsc2UgaWYgKGNvZWZfY291bnRfbm9kZV9zdGFydCA9PQorCQkJCVZQOV9DT01QX0lOVEVSX0NPVU5UX1NUQVJUKSB7CisJCQkJaWYgKGRlYnVnICYgVlA5X0RFQlVHX01FUkdFKQorCQkJCQlwcl9pbmZvKCIgIyBtZXJnZV9jb21wX2ludGVyX3Byb2JcbiIpOworCQkJCWNvZWZfbm9kZV9zdGFydCA9IFZQOV9DT01QX0lOVEVSX1NUQVJUOworCQkJfQorCQkJLyoKKwkJCSAqZWxzZSBpZiAoY29lZl9jb3VudF9ub2RlX3N0YXJ0ID09CisJCQkgKglWUDlfQ09NUF9SRUZfQ09VTlRfU1RBUlQpIHsKKwkJCSAqCXByX2luZm8oIiAjIG1lcmdlX2NvbXBfaW50ZXJfcHJvYlxuIik7CisJCQkgKgljb2VmX25vZGVfc3RhcnQgPSBWUDlfQ09NUF9SRUZfU1RBUlQ7CisJCQkgKn0KKwkJCSAqZWxzZSBpZiAoY29lZl9jb3VudF9ub2RlX3N0YXJ0ID09CisJCQkgKglWUDlfU0lOR0xFX1JFRl9DT1VOVF9TVEFSVCkgeworCQkJICoJcHJfaW5mbygiICMgbWVyZ2VfY29tcF9pbnRlcl9wcm9iXG4iKTsKKwkJCSAqCWNvZWZfbm9kZV9zdGFydCA9IFZQOV9TSU5HTEVfUkVGX1NUQVJUOworCQkJICp9CisJCQkgKi8KKwkJCWVsc2UgaWYgKGNvZWZfY291bnRfbm9kZV9zdGFydCA9PQorCQkJCVZQOV9UWF9NT0RFX0NPVU5UX1NUQVJUKSB7CisJCQkJaWYgKGRlYnVnICYgVlA5X0RFQlVHX01FUkdFKQorCQkJCQlwcl9pbmZvKCIgIyBtZXJnZV90eF9tb2RlX3Byb2JzXG4iKTsKKwkJCQljb2VmX25vZGVfc3RhcnQgPSBWUDlfVFhfTU9ERV9TVEFSVDsKKwkJCX0gZWxzZSBpZiAoY29lZl9jb3VudF9ub2RlX3N0YXJ0ID09CisJCQkJVlA5X1NLSVBfQ09VTlRfU1RBUlQpIHsKKwkJCQlpZiAoZGVidWcgJiBWUDlfREVCVUdfTUVSR0UpCisJCQkJCXByX2luZm8oIiAjIG1lcmdlX3NraXBfcHJvYnNcbiIpOworCQkJCWNvZWZfbm9kZV9zdGFydCA9IFZQOV9TS0lQX1NUQVJUOworCQkJfSBlbHNlIGlmIChjb2VmX2NvdW50X25vZGVfc3RhcnQgPT0KKwkJCQlWUDlfTVZfU0lHTl8wX0NPVU5UX1NUQVJUKSB7CisJCQkJaWYgKGRlYnVnICYgVlA5X0RFQlVHX01FUkdFKQorCQkJCQlwcl9pbmZvKCIgIyBtZXJnZV9zaWduXzBcbiIpOworCQkJCWNvZWZfbm9kZV9zdGFydCA9IFZQOV9NVl9TSUdOXzBfU1RBUlQ7CisJCQl9IGVsc2UgaWYgKGNvZWZfY291bnRfbm9kZV9zdGFydCA9PQorCQkJCVZQOV9NVl9TSUdOXzFfQ09VTlRfU1RBUlQpIHsKKwkJCQlpZiAoZGVidWcgJiBWUDlfREVCVUdfTUVSR0UpCisJCQkJCXByX2luZm8oIiAjIG1lcmdlX3NpZ25fMVxuIik7CisJCQkJY29lZl9ub2RlX3N0YXJ0ID0gVlA5X01WX1NJR05fMV9TVEFSVDsKKwkJCX0gZWxzZSBpZiAoY29lZl9jb3VudF9ub2RlX3N0YXJ0ID09CisJCQkJVlA5X01WX0JJVFNfMF9DT1VOVF9TVEFSVCkgeworCQkJCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19NRVJHRSkKKwkJCQkJcHJfaW5mbygiICMgbWVyZ2VfYml0c18wXG4iKTsKKwkJCQljb2VmX25vZGVfc3RhcnQgPSBWUDlfTVZfQklUU18wX1NUQVJUOworCQkJfSBlbHNlIGlmIChjb2VmX2NvdW50X25vZGVfc3RhcnQgPT0KKwkJCQlWUDlfTVZfQklUU18xX0NPVU5UX1NUQVJUKSB7CisJCQkJaWYgKGRlYnVnICYgVlA5X0RFQlVHX01FUkdFKQorCQkJCQlwcl9pbmZvKCIgIyBtZXJnZV9iaXRzXzFcbiIpOworCQkJCWNvZWZfbm9kZV9zdGFydCA9IFZQOV9NVl9CSVRTXzFfU1RBUlQ7CisJCQl9IGVsc2UgaWYgKGNvZWZfY291bnRfbm9kZV9zdGFydCA9PQorCQkJCQlWUDlfTVZfQ0xBU1MwX0hQXzBfQ09VTlRfU1RBUlQpIHsKKwkJCQlpZiAoZGVidWcgJiBWUDlfREVCVUdfTUVSR0UpCisJCQkJCXByX2luZm8oIiAjIG1lcmdlX2NsYXNzMF9ocFxuIik7CisJCQkJY29lZl9ub2RlX3N0YXJ0ID0gVlA5X01WX0NMQVNTMF9IUF8wX1NUQVJUOworCQkJfQorCisKKwkJZGVuID0gY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0XSArCisJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAxXTsKKworCQlwcm9iXzMyID0gcHJldl9wcm9iW2NvZWZfbm9kZV9zdGFydCAvIDQgKiAyXTsKKwkJcHJvYl9yZXMgPSBjb2VmX25vZGVfc3RhcnQgJiAzOworCQlwcm9iX3NoaWZ0ID0gcHJvYl9yZXMgKiA4OworCQlwcmVfcHJvYiA9IChwcm9iXzMyID4+IHByb2Jfc2hpZnQpICYgMHhmZjsKKworCQlpZiAoZGVuID09IDApCisJCQluZXdfcHJvYiA9IHByZV9wcm9iOworCQllbHNlIHsKKwkJCW1fY291bnQgPSAoZGVuIDwgTU9ERV9NVl9DT1VOVF9TQVQpID8KKwkJCQlkZW4gOiBNT0RFX01WX0NPVU5UX1NBVDsKKwkJCWdldF9wcm9iID0KKwkJCQljbGlwX3Byb2IoCisJCQkJZGl2X3IzMigoKGludDY0X3QpY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0XQorCQkJCSogMjU2ICsgKGRlbiA+PiAxKSksCisJCQkJZGVuKSk7CisJCQkvKndlaWdodGVkX3Byb2IqLworCQkJZmFjdG9yID0gY291bnRfdG9fdXBkYXRlX2ZhY3RvclttX2NvdW50XTsKKwkJCW5ld19wcm9iID0KKwkJCQlST1VORF9QT1dFUl9PRl9UV08ocHJlX3Byb2IgKiAoMjU2IC0gZmFjdG9yKQorCQkJCSsgZ2V0X3Byb2IgKiBmYWN0b3IsIDgpOworCQl9CisJCWN1cl9wcm9iW2NvZWZfbm9kZV9zdGFydCAvIDQgKiAyXSA9CisJCQkoY3VyX3Byb2JbY29lZl9ub2RlX3N0YXJ0IC8gNCAqIDJdICYKKwkJCSh+KDB4ZmYgPDwgcHJvYl9zaGlmdCkpKQorCQkJfCAobmV3X3Byb2IgPDwgcHJvYl9zaGlmdCk7CisKKwkJY29lZl9ub2RlX3N0YXJ0ID0gY29lZl9ub2RlX3N0YXJ0ICsgMTsKKwl9CisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX01FUkdFKQorCQlwcl9pbmZvKCIgIyBtZXJnZV92cDlfaW50ZXJfbW9kZV90cmVlXG4iKTsKKwljb2VmX25vZGVfc3RhcnQgPSBWUDlfSU5URVJfTU9ERV9TVEFSVDsKKwljb2VmX2NvdW50X25vZGVfc3RhcnQgPSBWUDlfSU5URVJfTU9ERV9DT1VOVF9TVEFSVDsKKwlmb3IgKHRyZWVfaSA9IDA7IHRyZWVfaSA8IDc7IHRyZWVfaSsrKSB7CisJCWZvciAobm9kZSA9IDA7IG5vZGUgPCAzOyBub2RlKyspIHsKKwkJCXN3aXRjaCAobm9kZSkgeworCQkJY2FzZSAyOgorCQkJCXRyZWVfbGVmdCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMV07CisJCQkJdHJlZV9yaWdodCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgM107CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJdHJlZV9sZWZ0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAwXTsKKwkJCQl0cmVlX3JpZ2h0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAxXQorCQkJCSsgY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgM107CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXRyZWVfbGVmdCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMl07CisJCQkJdHJlZV9yaWdodCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMF0KKwkJCQkrIGNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDFdCisJCQkJKyBjb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAzXTsKKwkJCQlicmVhazsKKworCQkJfQorCisJCQl2cDlfdHJlZV9tZXJnZV9wcm9icyhwcmV2X3Byb2IsIGN1cl9wcm9iLAorCQkJCWNvZWZfbm9kZV9zdGFydCwgdHJlZV9sZWZ0LCB0cmVlX3JpZ2h0LAorCQkJCXRyZWVfaSwgbm9kZSk7CisKKwkJCWNvZWZfbm9kZV9zdGFydCA9IGNvZWZfbm9kZV9zdGFydCArIDE7CisJCX0KKwkJY29lZl9jb3VudF9ub2RlX3N0YXJ0ID0gY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgNDsKKwl9CisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX01FUkdFKQorCQlwcl9pbmZvKCIgIyBtZXJnZV92cDlfaW50cmFfbW9kZV90cmVlXG4iKTsKKwljb2VmX25vZGVfc3RhcnQgPSBWUDlfSUZfWV9NT0RFX1NUQVJUOworCWNvZWZfY291bnRfbm9kZV9zdGFydCA9IFZQOV9JRl9ZX01PREVfQ09VTlRfU1RBUlQ7CisJZm9yICh0cmVlX2kgPSAwOyB0cmVlX2kgPCAxNDsgdHJlZV9pKyspIHsKKwkJZm9yIChub2RlID0gMDsgbm9kZSA8IDk7IG5vZGUrKykgeworCQkJc3dpdGNoIChub2RlKSB7CisJCQljYXNlIDg6CisJCQkJdHJlZV9sZWZ0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrRDE1M19QUkVEXTsKKwkJCQl0cmVlX3JpZ2h0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrRDIwN19QUkVEXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNzoKKwkJCQl0cmVlX2xlZnQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtENjNfUFJFRF07CisJCQkJdHJlZV9yaWdodCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K0QyMDdfUFJFRF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtEMTUzX1BSRURdOworCQkJCWJyZWFrOworCQkJY2FzZSA2OgorCQkJCXRyZWVfbGVmdCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgRDQ1X1BSRURdOworCQkJCXRyZWVfcmlnaHQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtEMjA3X1BSRURdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrRDE1M19QUkVEXSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K0Q2M19QUkVEXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNToKKwkJCQl0cmVlX2xlZnQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtEMTM1X1BSRURdOworCQkJCXRyZWVfcmlnaHQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtEMTE3X1BSRURdOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCXRyZWVfbGVmdCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K0hfUFJFRF07CisJCQkJdHJlZV9yaWdodCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K0QxMTdfUFJFRF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtEMTM1X1BSRURdOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCXRyZWVfbGVmdCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K0hfUFJFRF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtEMTE3X1BSRURdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrRDEzNV9QUkVEXTsKKwkJCQl0cmVlX3JpZ2h0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrRDQ1X1BSRURdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrRDIwN19QUkVEXSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K0QxNTNfUFJFRF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtENjNfUFJFRF07CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJdHJlZV9sZWZ0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrVl9QUkVEXTsKKwkJCQl0cmVlX3JpZ2h0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrSF9QUkVEXSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K0QxMTdfUFJFRF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtEMTM1X1BSRURdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrRDQ1X1BSRURdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrRDIwN19QUkVEXSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K0QxNTNfUFJFRF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtENjNfUFJFRF07CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJdHJlZV9sZWZ0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrVE1fUFJFRF07CisJCQkJdHJlZV9yaWdodCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K1ZfUFJFRF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtIX1BSRURdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrRDExN19QUkVEXSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K0QxMzVfUFJFRF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtENDVfUFJFRF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtEMjA3X1BSRURdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrRDE1M19QUkVEXSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K0Q2M19QUkVEXTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJdHJlZV9sZWZ0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrRENfUFJFRF07CisJCQkJdHJlZV9yaWdodCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K1RNX1BSRURdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrVl9QUkVEXSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K0hfUFJFRF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtEMTE3X1BSRURdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrRDEzNV9QUkVEXSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K0Q0NV9QUkVEXSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K0QyMDdfUFJFRF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtEMTUzX1BSRURdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrRDYzX1BSRURdOworCQkJCWJyZWFrOworCisJCQkJfQorCisJCQl2cDlfdHJlZV9tZXJnZV9wcm9icyhwcmV2X3Byb2IsIGN1cl9wcm9iLAorCQkJCWNvZWZfbm9kZV9zdGFydCwgdHJlZV9sZWZ0LCB0cmVlX3JpZ2h0LAorCQkJCXRyZWVfaSwgbm9kZSk7CisKKwkJCWNvZWZfbm9kZV9zdGFydCA9IGNvZWZfbm9kZV9zdGFydCArIDE7CisJCX0KKwkJY29lZl9jb3VudF9ub2RlX3N0YXJ0ID0gY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMTA7CisJfQorCisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX01FUkdFKQorCQlwcl9pbmZvKCIgIyBtZXJnZV92cDlfcGFydGl0aW9uX3RyZWVcbiIpOworCWNvZWZfbm9kZV9zdGFydCA9IFZQOV9QQVJUSVRJT05fUF9TVEFSVDsKKwljb2VmX2NvdW50X25vZGVfc3RhcnQgPSBWUDlfUEFSVElUSU9OX1BfQ09VTlRfU1RBUlQ7CisJZm9yICh0cmVlX2kgPSAwOyB0cmVlX2kgPCAxNjsgdHJlZV9pKyspIHsKKwkJZm9yIChub2RlID0gMDsgbm9kZSA8IDM7IG5vZGUrKykgeworCQkJc3dpdGNoIChub2RlKSB7CisJCQljYXNlIDI6CisJCQkJdHJlZV9sZWZ0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAyXTsKKwkJCQl0cmVlX3JpZ2h0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAzXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQl0cmVlX2xlZnQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDFdOworCQkJCXRyZWVfcmlnaHQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDJdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAzXTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJdHJlZV9sZWZ0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAwXTsKKwkJCQl0cmVlX3JpZ2h0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAxXSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMl0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDNdOworCQkJCWJyZWFrOworCisJCQl9CisKKwkJCXZwOV90cmVlX21lcmdlX3Byb2JzKHByZXZfcHJvYiwgY3VyX3Byb2IsCisJCQkJY29lZl9ub2RlX3N0YXJ0LAorCQkJCXRyZWVfbGVmdCwgdHJlZV9yaWdodCwgdHJlZV9pLCBub2RlKTsKKworCQkJY29lZl9ub2RlX3N0YXJ0ID0gY29lZl9ub2RlX3N0YXJ0ICsgMTsKKwkJfQorCQljb2VmX2NvdW50X25vZGVfc3RhcnQgPSBjb2VmX2NvdW50X25vZGVfc3RhcnQgKyA0OworCX0KKworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19NRVJHRSkKKwkJcHJfaW5mbygiICMgbWVyZ2VfdnA5X3N3aXRjaGFibGVfaW50ZXJwX3RyZWVcbiIpOworCWNvZWZfbm9kZV9zdGFydCA9IFZQOV9JTlRFUlBfU1RBUlQ7CisJY29lZl9jb3VudF9ub2RlX3N0YXJ0ID0gVlA5X0lOVEVSUF9DT1VOVF9TVEFSVDsKKwlmb3IgKHRyZWVfaSA9IDA7IHRyZWVfaSA8IDQ7IHRyZWVfaSsrKSB7CisJCWZvciAobm9kZSA9IDA7IG5vZGUgPCAyOyBub2RlKyspIHsKKwkJCXN3aXRjaCAobm9kZSkgeworCQkJY2FzZSAxOgorCQkJCXRyZWVfbGVmdCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMV07CisJCQkJdHJlZV9yaWdodCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMl07CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXRyZWVfbGVmdCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMF07CisJCQkJdHJlZV9yaWdodCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMV0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDJdOworCQkJCWJyZWFrOworCisJCQl9CisKKwkJCXZwOV90cmVlX21lcmdlX3Byb2JzKHByZXZfcHJvYiwgY3VyX3Byb2IsCisJCQkJY29lZl9ub2RlX3N0YXJ0LAorCQkJCXRyZWVfbGVmdCwgdHJlZV9yaWdodCwgdHJlZV9pLCBub2RlKTsKKworCQkJY29lZl9ub2RlX3N0YXJ0ID0gY29lZl9ub2RlX3N0YXJ0ICsgMTsKKwkJfQorCQljb2VmX2NvdW50X25vZGVfc3RhcnQgPSBjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAzOworCX0KKworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19NRVJHRSkKKwkJcHJfaW5mbygiIyBtZXJnZV92cDlfbXZfam9pbnRfdHJlZVxuIik7CisJY29lZl9ub2RlX3N0YXJ0ID0gVlA5X01WX0pPSU5UU19TVEFSVDsKKwljb2VmX2NvdW50X25vZGVfc3RhcnQgPSBWUDlfTVZfSk9JTlRTX0NPVU5UX1NUQVJUOworCWZvciAodHJlZV9pID0gMDsgdHJlZV9pIDwgMTsgdHJlZV9pKyspIHsKKwkJZm9yIChub2RlID0gMDsgbm9kZSA8IDM7IG5vZGUrKykgeworCQkJc3dpdGNoIChub2RlKSB7CisJCQljYXNlIDI6CisJCQkJdHJlZV9sZWZ0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAyXTsKKwkJCQl0cmVlX3JpZ2h0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAzXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQl0cmVlX2xlZnQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDFdOworCQkJCXRyZWVfcmlnaHQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDJdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAzXTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJdHJlZV9sZWZ0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAwXTsKKwkJCQl0cmVlX3JpZ2h0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAxXSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMl0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDNdOworCQkJCWJyZWFrOworCQkJfQorCisJCQl2cDlfdHJlZV9tZXJnZV9wcm9icyhwcmV2X3Byb2IsIGN1cl9wcm9iLAorCQkJCWNvZWZfbm9kZV9zdGFydCwKKwkJCQl0cmVlX2xlZnQsIHRyZWVfcmlnaHQsIHRyZWVfaSwgbm9kZSk7CisKKwkJCWNvZWZfbm9kZV9zdGFydCA9IGNvZWZfbm9kZV9zdGFydCArIDE7CisJCX0KKwkJY29lZl9jb3VudF9ub2RlX3N0YXJ0ID0gY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgNDsKKwl9CisKKwlmb3IgKG12ZF9pID0gMDsgbXZkX2kgPCAyOyBtdmRfaSsrKSB7CisJCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19NRVJHRSkKKwkJCXByX2luZm8oIiAjIG1lcmdlX3ZwOV9tdl9jbGFzc190cmVlIFslZF0gIC1cbiIsIG12ZF9pKTsKKwkJY29lZl9ub2RlX3N0YXJ0ID0KKwkJCW12ZF9pID8gVlA5X01WX0NMQVNTRVNfMV9TVEFSVCA6IFZQOV9NVl9DTEFTU0VTXzBfU1RBUlQ7CisJCWNvZWZfY291bnRfbm9kZV9zdGFydCA9CisJCQltdmRfaSA/IFZQOV9NVl9DTEFTU0VTXzFfQ09VTlRfU1RBUlQKKwkJCTogVlA5X01WX0NMQVNTRVNfMF9DT1VOVF9TVEFSVDsKKwkJdHJlZV9pID0gMDsKKwkJZm9yIChub2RlID0gMDsgbm9kZSA8IDEwOyBub2RlKyspIHsKKwkJCXN3aXRjaCAobm9kZSkgeworCQkJY2FzZSA5OgorCQkJCXRyZWVfbGVmdCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgOV07CisJCQkJdHJlZV9yaWdodCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMTBdOworCQkJCWJyZWFrOworCQkJY2FzZSA4OgorCQkJCXRyZWVfbGVmdCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgN107CisJCQkJdHJlZV9yaWdodCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgOF07CisJCQkJYnJlYWs7CisJCQljYXNlIDc6CisJCQkJdHJlZV9sZWZ0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyA3XSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgOF07CisJCQkJdHJlZV9yaWdodCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgOV0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDEwXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNjoKKwkJCQl0cmVlX2xlZnQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDZdOworCQkJCXRyZWVfcmlnaHQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDddICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyA4XSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgOV0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDEwXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNToKKwkJCQl0cmVlX2xlZnQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDRdOworCQkJCXRyZWVfcmlnaHQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDVdOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCXRyZWVfbGVmdCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgNF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDVdOworCQkJCXRyZWVfcmlnaHQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDZdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyA3XSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgOF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDldICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAxMF07CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJdHJlZV9sZWZ0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAyXTsKKwkJCQl0cmVlX3JpZ2h0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAzXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQl0cmVlX2xlZnQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDJdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAzXTsKKwkJCQl0cmVlX3JpZ2h0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyA0XSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgNV0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDZdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyA3XSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgOF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDldICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAxMF07CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJdHJlZV9sZWZ0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAxXTsKKwkJCQl0cmVlX3JpZ2h0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAyXSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgM10gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDRdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyA1XSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgNl0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDddICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyA4XSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgOV0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDEwXTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJdHJlZV9sZWZ0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAwXTsKKwkJCQl0cmVlX3JpZ2h0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAxXSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMl0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDNdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyA0XSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgNV0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDZdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyA3XSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgOF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDldICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAxMF07CisJCQkJYnJlYWs7CisKKwkJCX0KKworCQkJdnA5X3RyZWVfbWVyZ2VfcHJvYnMocHJldl9wcm9iLCBjdXJfcHJvYiwKKwkJCQljb2VmX25vZGVfc3RhcnQsIHRyZWVfbGVmdCwgdHJlZV9yaWdodCwKKwkJCQl0cmVlX2ksIG5vZGUpOworCisJCQljb2VmX25vZGVfc3RhcnQgPSBjb2VmX25vZGVfc3RhcnQgKyAxOworCQl9CisKKwkJaWYgKGRlYnVnICYgVlA5X0RFQlVHX01FUkdFKQorCQkJcHJfaW5mbygiICMgbWVyZ2VfdnA5X212X2NsYXNzMF90cmVlIFslZF0gIC1cbiIsIG12ZF9pKTsKKwkJY29lZl9ub2RlX3N0YXJ0ID0KKwkJCW12ZF9pID8gVlA5X01WX0NMQVNTMF8xX1NUQVJUIDogVlA5X01WX0NMQVNTMF8wX1NUQVJUOworCQljb2VmX2NvdW50X25vZGVfc3RhcnQgPQorCQkJbXZkX2kgPyBWUDlfTVZfQ0xBU1MwXzFfQ09VTlRfU1RBUlQgOgorCQkJVlA5X01WX0NMQVNTMF8wX0NPVU5UX1NUQVJUOworCQl0cmVlX2kgPSAwOworCQlub2RlID0gMDsKKwkJdHJlZV9sZWZ0ID0gY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMF07CisJCXRyZWVfcmlnaHQgPSBjb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAxXTsKKworCQl2cDlfdHJlZV9tZXJnZV9wcm9icyhwcmV2X3Byb2IsIGN1cl9wcm9iLCBjb2VmX25vZGVfc3RhcnQsCisJCQl0cmVlX2xlZnQsIHRyZWVfcmlnaHQsIHRyZWVfaSwgbm9kZSk7CisJCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19NRVJHRSkKKwkJCXByX2luZm8oIiAjIG1lcmdlX3ZwOV9tdl9mcF90cmVlX2NsYXNzMF9mcCBbJWRdICAtXG4iLAorCQkJCW12ZF9pKTsKKwkJY29lZl9ub2RlX3N0YXJ0ID0KKwkJCW12ZF9pID8gVlA5X01WX0NMQVNTMF9GUF8xX1NUQVJUIDoKKwkJCVZQOV9NVl9DTEFTUzBfRlBfMF9TVEFSVDsKKwkJY29lZl9jb3VudF9ub2RlX3N0YXJ0ID0KKwkJCW12ZF9pID8gVlA5X01WX0NMQVNTMF9GUF8xX0NPVU5UX1NUQVJUIDoKKwkJCVZQOV9NVl9DTEFTUzBfRlBfMF9DT1VOVF9TVEFSVDsKKwkJZm9yICh0cmVlX2kgPSAwOyB0cmVlX2kgPCAzOyB0cmVlX2krKykgeworCQkJZm9yIChub2RlID0gMDsgbm9kZSA8IDM7IG5vZGUrKykgeworCQkJCXN3aXRjaCAobm9kZSkgeworCQkJCWNhc2UgMjoKKwkJCQkJdHJlZV9sZWZ0ID0KKwkJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMl07CisJCQkJCXRyZWVfcmlnaHQgPQorCQkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAzXTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAxOgorCQkJCQl0cmVlX2xlZnQgPQorCQkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAxXTsKKwkJCQkJdHJlZV9yaWdodCA9CisJCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDJdCisJCQkJCSsgY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgM107CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXRyZWVfbGVmdCA9CisJCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDBdOworCQkJCQl0cmVlX3JpZ2h0ID0KKwkJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMV0KKwkJCQkJKyBjb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAyXQorCQkJCQkrIGNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDNdOworCQkJCQlicmVhazsKKworCQkJCX0KKworCQkJCXZwOV90cmVlX21lcmdlX3Byb2JzKHByZXZfcHJvYiwgY3VyX3Byb2IsCisJCQkJCWNvZWZfbm9kZV9zdGFydCwgdHJlZV9sZWZ0LCB0cmVlX3JpZ2h0LAorCQkJCQl0cmVlX2ksIG5vZGUpOworCisJCQkJY29lZl9ub2RlX3N0YXJ0ID0gY29lZl9ub2RlX3N0YXJ0ICsgMTsKKwkJCX0KKwkJCWNvZWZfY291bnRfbm9kZV9zdGFydCA9IGNvZWZfY291bnRfbm9kZV9zdGFydCArIDQ7CisJCX0KKworCX0gLyogZm9yIG12ZF9pIChtdmRfeSBvciBtdmRfeCkqLworfQorCit9CisKK3N0YXRpYyB2b2lkIHVuaW5pdF9tbXVfYnVmZmVycyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisjaWZuZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwlkZWFsbG9jX212X2J1ZnMocGJpKTsKKyNlbmRpZgorCWlmIChwYmktPm1tdV9ib3gpIHsKKwkJZGVjb2Rlcl9tbXVfYm94X2ZyZWUocGJpLT5tbXVfYm94KTsKKwkJcGJpLT5tbXVfYm94ID0gTlVMTDsKKwl9CisjaWZkZWYgVlA5XzEwQl9NTVVfRFcKKwlpZiAocGJpLT5tbXVfYm94X2R3KSB7CisJCWRlY29kZXJfbW11X2JveF9mcmVlKHBiaS0+bW11X2JveF9kdyk7CisJCXBiaS0+bW11X2JveF9kdyA9IE5VTEw7CisJfQorI2VuZGlmCisJaWYgKHBiaS0+Ym1tdV9ib3gpIHsKKwkJZGVjb2Rlcl9ibW11X2JveF9mcmVlKHBiaS0+Ym1tdV9ib3gpOworCQlwYmktPmJtbXVfYm94ID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY2FsY19sdWNfcXVhbnRpdHkodTMyIHcsIHUzMiBoKQoreworCWludCBsY3Vfc2l6ZSA9IDY0OyAvKmZpeGVkIDY0Ki8KKwlpbnQgcGljX3dpZHRoXzY0ID0gKHcgKyA2MykgJiAofjB4M2YpOworCWludCBwaWNfaGVpZ2h0XzMyID0gKGggKyAzMSkgJiAofjB4MWYpOworCWludCBwaWNfd2lkdGhfbGN1ICA9IChwaWNfd2lkdGhfNjQgJSBsY3Vfc2l6ZSkgPworCQlwaWNfd2lkdGhfNjQgLyBsY3Vfc2l6ZSAgKyAxIDogcGljX3dpZHRoXzY0IC8gbGN1X3NpemU7CisJaW50IHBpY19oZWlnaHRfbGN1ID0gKHBpY19oZWlnaHRfMzIgJSBsY3Vfc2l6ZSkgPworCQlwaWNfaGVpZ2h0XzMyIC8gbGN1X3NpemUgKyAxIDogcGljX2hlaWdodF8zMiAvIGxjdV9zaXplOworCisJcmV0dXJuIHBpY193aWR0aF9sY3UgKiBwaWNfaGVpZ2h0X2xjdTsKK30KKworLyogcmV0dXJuIGluIE1CICovCitzdGF0aWMgaW50IHZwOV9tYXhfbW11X2J1Zl9zaXplKGludCBtYXhfdywgaW50IG1heF9oKQoreworCWludCBidWZfc2l6ZSA9IDQ4OworCisJaWYgKChtYXhfdyAqIG1heF9oID4gMTI4MCo3MzYpICYmCisJCShtYXhfdyAqIG1heF9oIDw9IDE5MjAqMTA4OCkpIHsKKwkJYnVmX3NpemUgPSAxMjsKKwl9IGVsc2UgaWYgKChtYXhfdyAqIG1heF9oID4gMCkgJiYKKwkJKG1heF93ICogbWF4X2ggPD0gMTI4MCo3MzYpKSB7CisJCWJ1Zl9zaXplID0gNDsKKwl9CisKKwlyZXR1cm4gYnVmX3NpemU7Cit9CisKK3N0YXRpYyBpbnQgdjRsX2FsbG9jX2FuZF9jb25maWdfcGljKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljKQoreworCWludCByZXQgPSAtMTsKKwlpbnQgaSA9IHBpYy0+aW5kZXg7CisJaW50IGR3X21vZGUgPSBnZXRfZG91YmxlX3dyaXRlX21vZGVfaW5pdChwYmkpOworCWludCBsY3VfdG90YWwgPSBjYWxjX2x1Y19xdWFudGl0eShwYmktPmZyYW1lX3dpZHRoLCBwYmktPmZyYW1lX2hlaWdodCk7CisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCXUzMiBtcHJlZF9tdl9lbmQgPSBwYmktPndvcmtfc3BhY2VfYnVmLT5tcHJlZF9tdi5idWZfc3RhcnQgKworCQlwYmktPndvcmtfc3BhY2VfYnVmLT5tcHJlZF9tdi5idWZfc2l6ZTsKKwlpbnQgbXZfc2l6ZSA9IGNhbF9tdl9idWZfc2l6ZShwYmksIHBiaS0+ZnJhbWVfd2lkdGgsIHBiaS0+ZnJhbWVfaGVpZ2h0KTsKKyNlbmRpZgorCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqIGN0eCA9IChzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKilwYmktPnY0bDJfY3R4OworCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9IE5VTEw7CisKKwlpZiAoaSA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBjdHgtPmZiX29wcy5hbGxvYygmY3R4LT5mYl9vcHMsIHBiaS0+ZmJfdG9rZW4sICZmYiwgQU1MX0ZCX1JFUV9ERUMpOworCWlmIChyZXQgPCAwKSB7CisJCXZwOV9wcmludChwYmksIDAsICJbJWRdIFZQOSBnZXQgYnVmZmVyIGZhaWwuXG4iLAorCQkJKChzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikgKHBiaS0+djRsMl9jdHgpKS0+aWQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWZiLT5zdGF0dXMJPSBGQl9TVF9ERUNPREVSOworCisJaWYgKHBiaS0+bW11X2VuYWJsZSkgeworCQlzdHJ1Y3QgaW50ZXJuYWxfY29tcF9idWYgKmlidWYgPSB2NGxmYl90b19pY29tcF9idWYocGJpLCBmYik7CisKKwkJcGJpLT5tX0JVRltpXS5oZWFkZXJfYWRkciA9IGlidWYtPmhlYWRlcl9hZGRyOworCQlpZiAoZGVidWcgJiBWUDlfREVCVUdfQlVGTUdSX01PUkUpIHsKKwkJCXByX2luZm8oIk1NVSBoZWFkZXJfYWRyICVkOiAlbGRcbiIsCisJCQkJaSwgcGJpLT5tX0JVRltpXS5oZWFkZXJfYWRkcik7CisJCX0KKwl9CisKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJaWYgKChwYmktPndvcmtfc3BhY2VfYnVmLT5tcHJlZF9tdi5idWZfc3RhcnQgKworCQkoKGkgKyAxKSAqIG12X3NpemUpKQorCQk8PSBtcHJlZF9tdl9lbmQpIHsKKyNlbmRpZgorCXBiaS0+bV9CVUZbaV0udjRsX3JlZl9idWZfYWRkciA9ICh1bG9uZylmYjsKKwlwaWMtPmNtYV9hbGxvY19hZGRyID0gZmItPm0ubWVtWzBdLmFkZHI7CisJaWYgKGZiLT5udW1fcGxhbmVzID09IDEpIHsKKwkJcGJpLT5tX0JVRltpXS5zdGFydF9hZHIgPSBmYi0+bS5tZW1bMF0uYWRkcjsKKwkJcGJpLT5tX0JVRltpXS5sdW1hX3NpemUgPSBmYi0+bS5tZW1bMF0ub2Zmc2V0OworCQlwYmktPm1fQlVGW2ldLnNpemUgPSBmYi0+bS5tZW1bMF0uc2l6ZTsKKwkJZmItPm0ubWVtWzBdLmJ5dGVzX3VzZWQgPSBmYi0+bS5tZW1bMF0uc2l6ZTsKKwkJcGljLT5kd195X2FkciA9IHBiaS0+bV9CVUZbaV0uc3RhcnRfYWRyOworCQlwaWMtPmR3X3Vfdl9hZHIgPSBwaWMtPmR3X3lfYWRyICsgcGJpLT5tX0JVRltpXS5sdW1hX3NpemU7CisJCXBpYy0+bHVtYV9zaXplID0gZmItPm0ubWVtWzBdLm9mZnNldDsKKwkJcGljLT5jaHJvbWFfc2l6ZSA9IGZiLT5tLm1lbVswXS5zaXplIC0gZmItPm0ubWVtWzBdLm9mZnNldDsKKwl9IGVsc2UgaWYgKGZiLT5udW1fcGxhbmVzID09IDIpIHsKKwkJcGJpLT5tX0JVRltpXS5zdGFydF9hZHIgPSBmYi0+bS5tZW1bMF0uYWRkcjsKKwkJcGJpLT5tX0JVRltpXS5zaXplID0gZmItPm0ubWVtWzBdLnNpemU7CisJCXBiaS0+bV9CVUZbaV0uY2hyb21hX2FkZHIgPSBmYi0+bS5tZW1bMV0uYWRkcjsKKwkJcGJpLT5tX0JVRltpXS5jaHJvbWFfc2l6ZSA9IGZiLT5tLm1lbVsxXS5zaXplOworCQlmYi0+bS5tZW1bMF0uYnl0ZXNfdXNlZCA9IGZiLT5tLm1lbVswXS5zaXplOworCQlmYi0+bS5tZW1bMV0uYnl0ZXNfdXNlZCA9IGZiLT5tLm1lbVsxXS5zaXplOworCQlwaWMtPmR3X3lfYWRyID0gcGJpLT5tX0JVRltpXS5zdGFydF9hZHI7CisJCXBpYy0+ZHdfdV92X2FkciA9IHBiaS0+bV9CVUZbaV0uY2hyb21hX2FkZHI7CisJCXBpYy0+bHVtYV9zaXplID0gZmItPm0ubWVtWzBdLnNpemU7CisJCXBpYy0+Y2hyb21hX3NpemUgPSBmYi0+bS5tZW1bMV0uc2l6ZTsKKwl9CisKKwkvKiBjb25maWcgZnJhbWUgYnVmZmVyICovCisJaWYgKHBiaS0+bW11X2VuYWJsZSkKKwkJcGljLT5oZWFkZXJfYWRyID0gcGJpLT5tX0JVRltpXS5oZWFkZXJfYWRkcjsKKworCXBpYy0+QlVGX2luZGV4CQk9IGk7CisJcGljLT5sY3VfdG90YWwJCT0gbGN1X3RvdGFsOworCXBpYy0+bWNfY2FudmFzX3kJPSBwaWMtPmluZGV4OworCXBpYy0+bWNfY2FudmFzX3Vfdgk9IHBpYy0+aW5kZXg7CisKKwlpZiAoZHdfbW9kZSAmIDB4MTApIHsKKwkJcGljLT5tY19jYW52YXNfeSA9IChwaWMtPmluZGV4IDw8IDEpOworCQlwaWMtPm1jX2NhbnZhc191X3YgPSAocGljLT5pbmRleCA8PCAxKSArIDE7CisJfQorCisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCXBpYy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkciA9CisJCXBiaS0+d29ya19zcGFjZV9idWYtPm1wcmVkX212LmJ1Zl9zdGFydCArCisJCShwaWMtPmluZGV4ICogbXZfc2l6ZSk7CisJcGljLT5tdl9zaXplID0gbXZfc2l6ZTsKKyNlbmRpZgorCWlmIChkZWJ1ZykgeworCQlwcl9pbmZvKCIlcyBpbmRleCAlZCBCVUZfaW5kZXggJWQgIiwKKwkJCV9fZnVuY19fLCBwaWMtPmluZGV4LAorCQkJcGljLT5CVUZfaW5kZXgpOworCQlwcl9pbmZvKCJjb21wX2JvZHlfc2l6ZSAleCBjb21wX2J1Zl9zaXplICV4ICIsCisJCQlwaWMtPmNvbXBfYm9keV9zaXplLAorCQkJcGljLT5idWZfc2l6ZSk7CisJCXByX2luZm8oIm1wcmVkX212X3dyX3N0YXJ0X2FkciAlbGRcbiIsCisJCQlwaWMtPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIpOworCQlwcl9pbmZvKCJkd195X2FkciAlZCwgcGljX2NvbmZpZy0+ZHdfdV92X2FkciA9JWRcbiIsCisJCQlwaWMtPmR3X3lfYWRyLAorCQkJcGljLT5kd191X3ZfYWRyKTsKKwl9CisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCX0KKyNlbmRpZgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3BpYyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksCisJCQkJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnBpY19jb25maWcpCit7CisJaW50IHJldCA9IC0xOworCWludCBpOworCWludCBwaWNfd2lkdGggPSBwYmktPmluaXRfcGljX3c7CisJaW50IHBpY19oZWlnaHQgPSBwYmktPmluaXRfcGljX2g7CisJaW50IGxjdV9zaXplID0gNjQ7IC8qZml4ZWQgNjQqLworCWludCBwaWNfd2lkdGhfNjQgPSAocGljX3dpZHRoICsgNjMpICYgKH4weDNmKTsKKwlpbnQgcGljX2hlaWdodF8zMiA9IChwaWNfaGVpZ2h0ICsgMzEpICYgKH4weDFmKTsKKwlpbnQgcGljX3dpZHRoX2xjdSAgPSAocGljX3dpZHRoXzY0ICUgbGN1X3NpemUpID8KKwkJCQlwaWNfd2lkdGhfNjQgLyBsY3Vfc2l6ZSAgKyAxCisJCQkJOiBwaWNfd2lkdGhfNjQgLyBsY3Vfc2l6ZTsKKwlpbnQgcGljX2hlaWdodF9sY3UgPSAocGljX2hlaWdodF8zMiAlIGxjdV9zaXplKSA/CisJCQkJcGljX2hlaWdodF8zMiAvIGxjdV9zaXplICsgMQorCQkJCTogcGljX2hlaWdodF8zMiAvIGxjdV9zaXplOworCWludCBsY3VfdG90YWwgICAgICAgPSBwaWNfd2lkdGhfbGN1ICogcGljX2hlaWdodF9sY3U7CisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCXUzMiBtcHJlZF9tdl9lbmQgPSBwYmktPndvcmtfc3BhY2VfYnVmLT5tcHJlZF9tdi5idWZfc3RhcnQgKworCQkJcGJpLT53b3JrX3NwYWNlX2J1Zi0+bXByZWRfbXYuYnVmX3NpemU7CisJaW50IG12X3NpemUgPSBjYWxfbXZfYnVmX3NpemUocGJpLCBwYmktPmluaXRfcGljX3csIHBiaS0+aW5pdF9waWNfaCk7CisjZW5kaWYKKwl1MzIgeV9hZHIgPSAwOworCWludCBidWZfc2l6ZSA9IDA7CisKKwlpbnQgbG9zbGVzc19jb21wX2hlYWRlcl9zaXplID0KKwkJCWNvbXB1dGVfbG9zbGVzc19jb21wX2hlYWRlcl9zaXplKHBpY193aWR0aCwKKwkJCXBpY19oZWlnaHQpOworCWludCBsb3NsZXNzX2NvbXBfYm9keV9zaXplID0gY29tcHV0ZV9sb3NsZXNzX2NvbXBfYm9keV9zaXplKHBpY193aWR0aCwKKwkJCXBpY19oZWlnaHQsIGJ1Zl9hbGxvY19kZXB0aCA9PSAxMCk7CisJaW50IG1jX2J1ZmZlcl9zaXplID0gbG9zbGVzc19jb21wX2hlYWRlcl9zaXplICsgbG9zbGVzc19jb21wX2JvZHlfc2l6ZTsKKwlpbnQgbWNfYnVmZmVyX3NpemVfaCA9IChtY19idWZmZXJfc2l6ZSArIDB4ZmZmZikgPj4gMTY7CisJaW50IG1jX2J1ZmZlcl9zaXplX3VfdiA9IDA7CisJaW50IG1jX2J1ZmZlcl9zaXplX3Vfdl9oID0gMDsKKwlpbnQgZHdfbW9kZSA9IGdldF9kb3VibGVfd3JpdGVfbW9kZV9pbml0KHBiaSk7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMocGJpKTsKKworCXBiaS0+bGN1X3RvdGFsID0gbGN1X3RvdGFsOworCisJaWYgKGR3X21vZGUgJiYgKGR3X21vZGUgJiAweDIwKSA9PSAwKSB7CisJCWludCBwaWNfd2lkdGhfZHcgPSBwaWNfd2lkdGggLworCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhkd19tb2RlICYgMHhmKTsKKwkJaW50IHBpY19oZWlnaHRfZHcgPSBwaWNfaGVpZ2h0IC8KKwkJCWdldF9kb3VibGVfd3JpdGVfcmF0aW8oZHdfbW9kZSAmIDB4Zik7CisKKwkJaW50IHBpY193aWR0aF82NF9kdyA9IChwaWNfd2lkdGhfZHcgKyA2MykgJiAofjB4M2YpOworCQlpbnQgcGljX2hlaWdodF8zMl9kdyA9IChwaWNfaGVpZ2h0X2R3ICsgMzEpICYgKH4weDFmKTsKKwkJaW50IHBpY193aWR0aF9sY3VfZHcgID0gKHBpY193aWR0aF82NF9kdyAlIGxjdV9zaXplKSA/CisJCQkJCXBpY193aWR0aF82NF9kdyAvIGxjdV9zaXplICArIDEKKwkJCQkJOiBwaWNfd2lkdGhfNjRfZHcgLyBsY3Vfc2l6ZTsKKwkJaW50IHBpY19oZWlnaHRfbGN1X2R3ID0gKHBpY19oZWlnaHRfMzJfZHcgJSBsY3Vfc2l6ZSkgPworCQkJCQlwaWNfaGVpZ2h0XzMyX2R3IC8gbGN1X3NpemUgKyAxCisJCQkJCTogcGljX2hlaWdodF8zMl9kdyAvIGxjdV9zaXplOworCQlpbnQgbGN1X3RvdGFsX2R3ICAgICAgID0gcGljX3dpZHRoX2xjdV9kdyAqIHBpY19oZWlnaHRfbGN1X2R3OworCQltY19idWZmZXJfc2l6ZV91X3YgPSBsY3VfdG90YWxfZHcgKiBsY3Vfc2l6ZSAqIGxjdV9zaXplIC8gMjsKKwkJbWNfYnVmZmVyX3NpemVfdV92X2ggPSAobWNfYnVmZmVyX3NpemVfdV92ICsgMHhmZmZmKSA+PiAxNjsKKwkJLyo2NGsgYWxpZ25tZW50Ki8KKwkJYnVmX3NpemUgPSAoKG1jX2J1ZmZlcl9zaXplX3Vfdl9oIDw8IDE2KSAqIDMpOworCQlidWZfc2l6ZSA9ICgoYnVmX3NpemUgKyAweGZmZmYpID4+IDE2KSA8PCAxNjsKKwl9CisKKwlpZiAobWNfYnVmZmVyX3NpemUgJiAweGZmZmYpIC8qNjRrIGFsaWdubWVudCovCisJCW1jX2J1ZmZlcl9zaXplX2ggKz0gMTsKKwlpZiAoKCFwYmktPm1tdV9lbmFibGUpICYmICgoZHdfbW9kZSAmIDB4MTApID09IDApKQorCQlidWZfc2l6ZSArPSAobWNfYnVmZmVyX3NpemVfaCA8PCAxNik7CisKKwlpZiAocGJpLT5tbXVfZW5hYmxlKSB7CisJCXBpY19jb25maWctPmhlYWRlcl9hZHIgPSBkZWNvZGVyX2JtbXVfYm94X2dldF9waHlfYWRkcigKKwkJCXBiaS0+Ym1tdV9ib3gsIEhFQURFUl9CVUZGRVJfSURYKHBpY19jb25maWctPmluZGV4KSk7CisKKwkJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0JVRk1HUl9NT1JFKSB7CisJCQlwcl9pbmZvKCJNTVUgaGVhZGVyX2FkciAlZDogJWxkXG4iLAorCQkJCXBpY19jb25maWctPmluZGV4LCBwaWNfY29uZmlnLT5oZWFkZXJfYWRyKTsKKwkJfQorI2lmZGVmIFZQOV8xMEJfTU1VX0RXCisJCWlmIChwYmktPmR3X21tdV9lbmFibGUpIHsKKwkJCXBpY19jb25maWctPmhlYWRlcl9kd19hZHIgPSBwaWNfY29uZmlnLT5oZWFkZXJfYWRyICsKKwkJCQl2dnA5X21tdV9jb21wcmVzc19oZWFkZXJfc2l6ZShwYmktPmluaXRfcGljX3csIHBiaS0+aW5pdF9waWNfaCk7CisKKwkJCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19CVUZNR1JfTU9SRSkgeworCQkJCXByX2luZm8oIk1NVSBoZWFkZXJfZHdfYWRyICVkOiAlbGQgc2l6ZSAweCV4XG4iLAorCQkJCQlwaWNfY29uZmlnLT5pbmRleCwgcGljX2NvbmZpZy0+aGVhZGVyX2R3X2FkciwKKwkJCQkJdnZwOV9tbXVfY29tcHJlc3NfaGVhZGVyX3NpemUocGJpLT5pbml0X3BpY193LCBwYmktPmluaXRfcGljX2gpKTsKKwkJCX0KKwkJfQorI2VuZGlmCisJfQorCWkgPSBwaWNfY29uZmlnLT5pbmRleDsKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJaWYgKChwYmktPndvcmtfc3BhY2VfYnVmLT5tcHJlZF9tdi5idWZfc3RhcnQgKworCQkoKGkgKyAxKSAqIG12X3NpemUpKQorCQk8PSBtcHJlZF9tdl9lbmQKKwkpIHsKKyNlbmRpZgorCQlpZiAoYnVmX3NpemUgPiAwKSB7CisJCQlyZXQgPSBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkocGJpLT5ibW11X2JveCwKKwkJCQkJVkZfQlVGRkVSX0lEWChpKSwKKwkJCQkJYnVmX3NpemUsIERSSVZFUl9OQU1FLAorCQkJCQkmcGljX2NvbmZpZy0+Y21hX2FsbG9jX2FkZHIpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlwcl9pbmZvKAorCQkJCQkiZGVjb2Rlcl9ibW11X2JveF9hbGxvY19idWZfcGh5IGlkeCAlZCBzaXplICVkIGZhaWxcbiIsCisJCQkJCVZGX0JVRkZFUl9JRFgoaSksCisJCQkJCWJ1Zl9zaXplCisJCQkJCSk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKworCQkJaWYgKHBiaS0+ZW5hYmxlX2ZlbmNlKSB7CisJCQkJLy9tbS0+ZmVuY2VfcmVmX3JlbGVhc2UgPSB2ZGVjX2ZlbmNlX2J1ZmZlcl9jb3VudF9kZWNyZWFzZTsKKwkJCQl2ZGVjX2ZlbmNlX2J1ZmZlcl9jb3VudF9pbmNyZWFzZSgodWxvbmcpdmRlYy0+c3luYyk7CisJCQkJSU5JVF9MSVNUX0hFQUQoJnZkZWMtPnN5bmMtPnJlbGVhc2VfY2FsbGJhY2tbVkZfQlVGRkVSX0lEWChpKV0ubm9kZSk7CisJCQkJZGVjb2Rlcl9ibW11X2JveF9hZGRfY2FsbGJhY2tfZnVuYyhwYmktPmJtbXVfYm94LCBWRl9CVUZGRVJfSURYKGkpLCAodm9pZCAqKSZ2ZGVjLT5zeW5jLT5yZWxlYXNlX2NhbGxiYWNrW1ZGX0JVRkZFUl9JRFgoaSldKTsKKwkJCX0KKworCQkJaWYgKHBpY19jb25maWctPmNtYV9hbGxvY19hZGRyKQorCQkJCXlfYWRyID0gcGljX2NvbmZpZy0+Y21hX2FsbG9jX2FkZHI7CisJCQllbHNlIHsKKwkJCQlwcl9pbmZvKAorCQkJCQkiZGVjb2Rlcl9ibW11X2JveF9hbGxvY19idWZfcGh5IGlkeCAlZCBzaXplICVkIHJldHVybiBudWxsXG4iLAorCQkJCQlWRl9CVUZGRVJfSURYKGkpLAorCQkJCQlidWZfc2l6ZQorCQkJCQkpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCQl7CisJCQkvKmVuc3VyZSBnZXRfcGljX2J5X1BPQygpCisJCQlub3QgZ2V0IHRoZSBidWZmZXIgbm90IGRlY29kZWQqLworCQkJcGljX2NvbmZpZy0+QlVGX2luZGV4ID0gaTsKKwkJCXBpY19jb25maWctPmxjdV90b3RhbCA9IGxjdV90b3RhbDsKKworCQkJcGljX2NvbmZpZy0+Y29tcF9ib2R5X3NpemUgPSBsb3NsZXNzX2NvbXBfYm9keV9zaXplOworCQkJcGljX2NvbmZpZy0+YnVmX3NpemUgPSBidWZfc2l6ZTsKKworCQkJcGljX2NvbmZpZy0+bWNfY2FudmFzX3kgPSBwaWNfY29uZmlnLT5pbmRleDsKKwkJCXBpY19jb25maWctPm1jX2NhbnZhc191X3YgPSBwaWNfY29uZmlnLT5pbmRleDsKKwkJCWlmIChkd19tb2RlICYgMHgxMCkgeworCQkJCXBpY19jb25maWctPmR3X3lfYWRyID0geV9hZHI7CisJCQkJcGljX2NvbmZpZy0+ZHdfdV92X2FkciA9IHlfYWRyICsKKwkJCQkJKChtY19idWZmZXJfc2l6ZV91X3ZfaCA8PCAxNikgPDwgMSk7CisKKwkJCQlwaWNfY29uZmlnLT5tY19jYW52YXNfeSA9CisJCQkJCShwaWNfY29uZmlnLT5pbmRleCA8PCAxKTsKKwkJCQlwaWNfY29uZmlnLT5tY19jYW52YXNfdV92ID0KKwkJCQkJKHBpY19jb25maWctPmluZGV4IDw8IDEpICsgMTsKKwkJCX0gZWxzZSBpZiAoZHdfbW9kZSAmJiAoKGR3X21vZGUgJiAweDIwKSA9PSAwKSkgeworCQkJCXBpY19jb25maWctPmR3X3lfYWRyID0geV9hZHI7CisJCQkJcGljX2NvbmZpZy0+ZHdfdV92X2FkciA9IHBpY19jb25maWctPmR3X3lfYWRyICsKKwkJCQkoKG1jX2J1ZmZlcl9zaXplX3Vfdl9oIDw8IDE2KSA8PCAxKTsKKwkJCX0KKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJCQlwaWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyID0KKwkJCXBiaS0+d29ya19zcGFjZV9idWYtPm1wcmVkX212LmJ1Zl9zdGFydCArCisJCQkJCShwaWNfY29uZmlnLT5pbmRleCAqIG12X3NpemUpOworCQkJcGljX2NvbmZpZy0+bXZfc2l6ZSA9IG12X3NpemU7CisjZW5kaWYKKwkJCWlmIChkZWJ1ZykgeworCQkJCXByX2luZm8KKwkJCQkoIiVzIGluZGV4ICVkIEJVRl9pbmRleCAlZCAiLAorCQkJCV9fZnVuY19fLCBwaWNfY29uZmlnLT5pbmRleCwKKwkJCQlwaWNfY29uZmlnLT5CVUZfaW5kZXgpOworCQkJCXByX2luZm8KKwkJCQkoImNvbXBfYm9keV9zaXplICV4IGNvbXBfYnVmX3NpemUgJXggIiwKKwkJCQlwaWNfY29uZmlnLT5jb21wX2JvZHlfc2l6ZSwKKwkJCQlwaWNfY29uZmlnLT5idWZfc2l6ZSk7CisJCQkJcHJfaW5mbworCQkJCSgibXByZWRfbXZfd3Jfc3RhcnRfYWRyICVsZFxuIiwKKwkJCQlwaWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyKTsKKwkJCQlwcl9pbmZvKCJkd195X2FkciAlZCwgcGljX2NvbmZpZy0+ZHdfdV92X2FkciA9JWRcbiIsCisJCQkJCXBpY19jb25maWctPmR3X3lfYWRyLAorCQkJCQlwaWNfY29uZmlnLT5kd191X3ZfYWRyKTsKKwkJCX0KKwkJCXJldCA9IDA7CisJCX0KKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJfQorI2VuZGlmCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgdm9pZCBpbml0X3BpY19saXN0KHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjbSA9ICZwYmktPmNvbW1vbjsKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljX2NvbmZpZzsKKwl1MzIgaGVhZGVyX3NpemU7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMocGJpKTsKKworCWlmICghcGJpLT5pc191c2VkX3Y0bCAmJiBwYmktPm1tdV9lbmFibGUgJiYgKChwYmktPmRvdWJsZV93cml0ZV9tb2RlICYgMHgxMCkgPT0gMCkpIHsKKwkJaGVhZGVyX3NpemUgPSB2dnA5X21tdV9jb21wcmVzc19oZWFkZXJfc2l6ZSgKKwkJCXBiaS0+bWF4X3BpY193LCBwYmktPm1heF9waWNfaCk7CisjaWZkZWYgVlA5XzEwQl9NTVVfRFcKKwkJaWYgKHBiaS0+ZHdfbW11X2VuYWJsZSkKKwkJCWhlYWRlcl9zaXplIDw8PSAxOworI2VuZGlmCisJCS8qYWxsb2MgVlA5IGNvbXByZXNzIGhlYWRlciBmaXJzdCovCisJCWZvciAoaSA9IDA7IGkgPCBwYmktPnVzZWRfYnVmX251bTsgaSsrKSB7CisJCQl1bnNpZ25lZCBsb25nIGJ1Zl9hZGRyOworCQkJaWYgKGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeQorCQkJCShwYmktPmJtbXVfYm94LAorCQkJCUhFQURFUl9CVUZGRVJfSURYKGkpLCBoZWFkZXJfc2l6ZSwKKwkJCQlEUklWRVJfSEVBREVSX05BTUUsCisJCQkJJmJ1Zl9hZGRyKSA8IDApIHsKKwkJCQlwcl9pbmZvKCIlcyBtYWxsb2MgY29tcHJlc3MgaGVhZGVyIGZhaWxlZCAlZFxuIiwKKwkJCQlEUklWRVJfSEVBREVSX05BTUUsIGkpOworCQkJCXBiaS0+ZmF0YWxfZXJyb3IgfD0gREVDT0RFUl9GQVRBTF9FUlJPUl9OT19NRU07CisJCQkJcmV0dXJuOworCQkJfQorCQkJaWYgKHBiaS0+ZW5hYmxlX2ZlbmNlKSB7CisJCQkJdmRlY19mZW5jZV9idWZmZXJfY291bnRfaW5jcmVhc2UoKHVsb25nKXZkZWMtPnN5bmMpOworCQkJCUlOSVRfTElTVF9IRUFEKCZ2ZGVjLT5zeW5jLT5yZWxlYXNlX2NhbGxiYWNrW0hFQURFUl9CVUZGRVJfSURYKGkpXS5ub2RlKTsKKwkJCQlkZWNvZGVyX2JtbXVfYm94X2FkZF9jYWxsYmFja19mdW5jKHBiaS0+Ym1tdV9ib3gsIEhFQURFUl9CVUZGRVJfSURYKGkpLCAodm9pZCAqKSZ2ZGVjLT5zeW5jLT5yZWxlYXNlX2NhbGxiYWNrW0hFQURFUl9CVUZGRVJfSURYKGkpXSk7CisJCQkJLy9tbS0+ZmVuY2VfcmVmX3JlbGVhc2UgPSB2ZGVjX2ZlbmNlX2J1ZmZlcl9jb3VudF9kZWNyZWFzZTsKKwkJCX0KKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgcGJpLT51c2VkX2J1Zl9udW07IGkrKykgeworCQlwaWNfY29uZmlnID0gJmNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmc1tpXS5idWY7CisJCXBpY19jb25maWctPmluZGV4ID0gaTsKKwkJcGljX2NvbmZpZy0+QlVGX2luZGV4ID0gLTE7CisJCXBpY19jb25maWctPm12X2J1Zl9pbmRleCA9IC0xOworCQlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJCXBpY19jb25maWctPnlfY2FudmFzX2luZGV4ID0gLTE7CisJCQlwaWNfY29uZmlnLT51dl9jYW52YXNfaW5kZXggPSAtMTsKKwkJfQorCQlwaWNfY29uZmlnLT55X2Nyb3Bfd2lkdGggPSBwYmktPmluaXRfcGljX3c7CisJCXBpY19jb25maWctPnlfY3JvcF9oZWlnaHQgPSBwYmktPmluaXRfcGljX2g7CisJCXBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlID0gZ2V0X2RvdWJsZV93cml0ZV9tb2RlKHBiaSk7CisKKwkJaWYgKCFwYmktPmlzX3VzZWRfdjRsKSB7CisJCQlpZiAoY29uZmlnX3BpYyhwYmksIHBpY19jb25maWcpIDwgMCkgeworCQkJCWlmIChkZWJ1ZykKKwkJCQkJcHJfaW5mbygiQ29uZmlnX3BpYyAlZCBmYWlsXG4iLAorCQkJCQkJcGljX2NvbmZpZy0+aW5kZXgpOworCQkJCXBpY19jb25maWctPmluZGV4ID0gLTE7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSAmJgorCQkJKHBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlICYgMHgyMCkgPT0gMCkgeworCQkJCXNldF9jYW52YXMocGJpLCBwaWNfY29uZmlnKTsKKwkJCX0KKwkJfQorCX0KKwlmb3IgKDsgaSA8IHBiaS0+dXNlZF9idWZfbnVtOyBpKyspIHsKKwkJcGljX2NvbmZpZyA9ICZjbS0+YnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnNbaV0uYnVmOworCQlwaWNfY29uZmlnLT5pbmRleCA9IC0xOworCQlwaWNfY29uZmlnLT5CVUZfaW5kZXggPSAtMTsKKwkJcGljX2NvbmZpZy0+bXZfYnVmX2luZGV4ID0gLTE7CisJCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQkJcGljX2NvbmZpZy0+eV9jYW52YXNfaW5kZXggPSAtMTsKKwkJCXBpY19jb25maWctPnV2X2NhbnZhc19pbmRleCA9IC0xOworCQl9CisJfQorCXByX2luZm8oIiVzIG9rLCB1c2VkX2J1Zl9udW0gPSAlZFxuIiwKKwkJX19mdW5jX18sIHBiaS0+dXNlZF9idWZfbnVtKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9waWNfbGlzdF9odyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJaW50IGk7CisJc3RydWN0IFZQOV9Db21tb25fcyAqY20gPSAmcGJpLT5jb21tb247CisJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnBpY19jb25maWc7CisJLypXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9DT05GX0FERFIsIDB4MCk7Ki8KKwlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9DT05GX0FERFIsCisJCSgweDEgPDwgMSkgfCAoMHgxIDw8IDIpKTsKKworCWZvciAoaSA9IDA7IGkgPCBwYmktPnVzZWRfYnVmX251bTsgaSsrKSB7CisJCXBpY19jb25maWcgPSAmY20tPmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzW2ldLmJ1ZjsKKwkJaWYgKHBpY19jb25maWctPmluZGV4IDwgMCkKKwkJCWJyZWFrOworCisJCWlmIChwYmktPm1tdV9lbmFibGUgJiYgKChwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MTApID09IDApKSB7CisJCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9EQVRBLAorCQkJCXBpY19jb25maWctPmhlYWRlcl9hZHIgPj4gNSk7CisJCX0gZWxzZSB7CisJCQkvKldSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0NNRF9BRERSLAorCQkJICoJcGljX2NvbmZpZy0+bWNfeV9hZHIKKwkJCSAqCXwgKHBpY19jb25maWctPm1jX2NhbnZhc195IDw8IDgpIHwgMHgxKTsKKwkJCSAqLworCQkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DMkFYSV9UQkxfREFUQSwKKwkJCQlwaWNfY29uZmlnLT5kd195X2FkciA+PiA1KTsKKwkJfQorI2lmbmRlZiBMT1NMRVNTX0NPTVBSRVNTX01PREUKKwkJLypXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9DTURfQUREUiwKKwkJICoJcGljX2NvbmZpZy0+bWNfdV92X2FkcgorCQkgKgl8IChwaWNfY29uZmlnLT5tY19jYW52YXNfdV92IDw8IDgpfCAweDEpOworCQkgKi8KKwkJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0RBVEEsCisJCQkJcGljX2NvbmZpZy0+aGVhZGVyX2FkciA+PiA1KTsKKyNlbHNlCisJCWlmIChwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MTApIHsKKwkJCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9EQVRBLAorCQkJCXBpY19jb25maWctPmR3X3Vfdl9hZHIgPj4gNSk7CisJCX0KKyNlbmRpZgorCX0KKwlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9DT05GX0FERFIsIDB4MSk7CisKKwkvKlplcm8gb3V0IGNhbnZhcyByZWdpc3RlcnMgaW4gSVBQIC0tIGF2b2lkIHNpbXVsYXRpb24gWCovCisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwKKwkJCSgwIDw8IDgpIHwgKDAgPDwgMSkgfCAxKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIsIDApOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3BpY19saXN0KHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjb25zdCBjbSA9ICZwYmktPmNvbW1vbjsKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljX2NvbmZpZzsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgRlJBTUVfQlVGRkVSUzsgaSsrKSB7CisJCXBpY19jb25maWcgPSAmY20tPmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzW2ldLmJ1ZjsKKwkJdnA5X3ByaW50KHBiaSwgMCwKKwkJCSJCdWYoJWQpIGluZGV4ICVkIG12X2J1Zl9pbmRleCAlZCByZWZfY291bnQgJWQgdmZfcmVmICVkIGRlY19pZHggJWQgc2xpY2VfdHlwZSAlZCB3L2ggJWQvJWQgYWRyOiAleFxuIiwKKwkJCWksCisJCQlwaWNfY29uZmlnLT5pbmRleCwKKyNpZm5kZWYgTVZfVVNFX0ZJWEVEX0JVRgorCQkJcGljX2NvbmZpZy0+bXZfYnVmX2luZGV4LAorI2Vsc2UKKwkJCS0xLAorI2VuZGlmCisJCQljbS0+YnVmZmVyX3Bvb2wtPgorCQkJZnJhbWVfYnVmc1tpXS5yZWZfY291bnQsCisJCQlwaWNfY29uZmlnLT52Zl9yZWYsCisJCQlwaWNfY29uZmlnLT5kZWNvZGVfaWR4LAorCQkJcGljX2NvbmZpZy0+c2xpY2VfdHlwZSwKKwkJCXBpY19jb25maWctPnlfY3JvcF93aWR0aCwKKwkJCXBpY19jb25maWctPnlfY3JvcF9oZWlnaHQsCisJCQlwaWNfY29uZmlnLT5jbWFfYWxsb2NfYWRkcgorCQkJKTsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19waWNfc2l6ZShzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksIHVuc2lnbmVkIHNob3J0IGJpdF9kZXB0aCkKK3sKKyNpZmRlZiBMT1NMRVNTX0NPTVBSRVNTX01PREUKKwl1bnNpZ25lZCBpbnQgZGF0YTMyOworI2VuZGlmCisJaW50IGxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSwgbG9zbGVzc19jb21wX2JvZHlfc2l6ZTsKKwlzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjbSA9ICZwYmktPmNvbW1vbjsKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqY3VyX3BpY19jb25maWcgPSAmY20tPmN1cl9mcmFtZS0+YnVmOworCisJZnJhbWVfd2lkdGggPSBjdXJfcGljX2NvbmZpZy0+eV9jcm9wX3dpZHRoOworCWZyYW1lX2hlaWdodCA9IGN1cl9waWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0OworCWN1cl9waWNfY29uZmlnLT5iaXRfZGVwdGggPSBiaXRfZGVwdGg7CisJY3VyX3BpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlID0gZ2V0X2RvdWJsZV93cml0ZV9tb2RlKHBiaSk7CisJbG9zbGVzc19jb21wX2hlYWRlcl9zaXplID0KKwkJY29tcHV0ZV9sb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUoY3VyX3BpY19jb25maWctPnlfY3JvcF93aWR0aCwKKwkJY3VyX3BpY19jb25maWctPnlfY3JvcF9oZWlnaHQpOworCWxvc2xlc3NfY29tcF9ib2R5X3NpemUgPQorCQljb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemUoY3VyX3BpY19jb25maWctPnlfY3JvcF93aWR0aCwKKwkJY3VyX3BpY19jb25maWctPnlfY3JvcF9oZWlnaHQsIChiaXRfZGVwdGggPT0gVlBYX0JJVFNfMTApKTsKKwljdXJfcGljX2NvbmZpZy0+Y29tcF9ib2R5X3NpemUgPSBsb3NsZXNzX2NvbXBfYm9keV9zaXplOworI2lmZGVmIExPU0xFU1NfQ09NUFJFU1NfTU9ERQorCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMNSk7CisJaWYgKGJpdF9kZXB0aCA9PSBWUFhfQklUU18xMCkKKwkJZGF0YTMyICY9IH4oMSA8PCA5KTsKKwllbHNlCisJCWRhdGEzMiB8PSAoMSA8PCA5KTsKKworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDUsIGRhdGEzMik7CisKKwlpZiAocGJpLT5tbXVfZW5hYmxlKSB7CisJCS8qYml0WzRdIDogcGFnZWRfbWVtX21vZGUqLworCQlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMSwgKDB4MSA8PCA0KSk7CisJfSBlbHNlIHsKKwkvKmJpdFszXSBzbWVtIG1kb2UqLworCQlpZiAoYml0X2RlcHRoID09IFZQWF9CSVRTXzEwKQorCQkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDEsICgwIDw8IDMpKTsKKwkJZWxzZQorCQkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDEsICgxIDw8IDMpKTsKKwl9CisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA8IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwyLCAobG9zbGVzc19jb21wX2JvZHlfc2l6ZSA+PiA1KSk7CisJLypXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMywoMHhmZjw8MjApIHwgKDB4ZmY8PDEwKSB8IDB4ZmYpOyovCisJV1JJVEVfVlJFRyhIRVZDX0NNX0JPRFlfTEVOR1RILCBsb3NsZXNzX2NvbXBfYm9keV9zaXplKTsKKwlXUklURV9WUkVHKEhFVkNfQ01fSEVBREVSX09GRlNFVCwgbG9zbGVzc19jb21wX2JvZHlfc2l6ZSk7CisJV1JJVEVfVlJFRyhIRVZDX0NNX0hFQURFUl9MRU5HVEgsIGxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSk7CisJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShwYmkpICYgMHgxMCkKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDEsIDB4MSA8PCAzMSk7CisjZWxzZQorCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLCAweDEgPDwgMzEpOworI2VuZGlmCisjaWZkZWYgVlA5XzEwQl9NTVVfRFcKKwlpZiAocGJpLT5kd19tbXVfZW5hYmxlKSB7CisJCS8qbG9zbGVzc19jb21wX2hlYWRlcl9zaXplX2R3IHNhbWUgYXMgbG9zbGVzc19jb21wX2hlYWRlcl9zaXplKi8KKwkJV1JJVEVfVlJFRyhIRVZDX0NNX0JPRFlfTEVOR1RIMiwgbG9zbGVzc19jb21wX2JvZHlfc2l6ZSk7CisJCVdSSVRFX1ZSRUcoSEVWQ19DTV9IRUFERVJfT0ZGU0VUMiwgbG9zbGVzc19jb21wX2JvZHlfc2l6ZSk7CisJCVdSSVRFX1ZSRUcoSEVWQ19DTV9IRUFERVJfTEVOR1RIMiwgbG9zbGVzc19jb21wX2hlYWRlcl9zaXplKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfbWNfYnVmZmVyKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwgdW5zaWduZWQgc2hvcnQgYml0X2RlcHRoKQoreworCWludCBpOworCXN0cnVjdCBWUDlfQ29tbW9uX3MgKmNtID0gJnBiaS0+Y29tbW9uOworCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpjdXJfcGljX2NvbmZpZyA9ICZjbS0+Y3VyX2ZyYW1lLT5idWY7CisJdWludDhfdCBzY2FsZV9lbmFibGUgPSAwOworCisJaWYgKGRlYnVnJlZQOV9ERUJVR19CVUZNR1JfTU9SRSkKKwkJcHJfaW5mbygiY29uZmlnX21jX2J1ZmZlciBlbnRlcmVkIC4uLi4uXG4iKTsKKworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfQUNDQ09ORklHX0FERFIsCisJCQkoMCA8PCA4KSB8ICgwIDw8IDEpIHwgMSk7CisJZm9yIChpID0gMDsgaSA8IFJFRlNfUEVSX0ZSQU1FOyArK2kpIHsKKwkJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnBpY19jb25maWcgPSBjbS0+ZnJhbWVfcmVmc1tpXS5idWY7CisJCWlmICghcGljX2NvbmZpZykKKwkJCWNvbnRpbnVlOworCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUiwKKwkJKHBpY19jb25maWctPm1jX2NhbnZhc191X3YgPDwgMTYpCisJCXwgKHBpY19jb25maWctPm1jX2NhbnZhc191X3YgPDwgOCkKKwkJfCBwaWNfY29uZmlnLT5tY19jYW52YXNfeSk7CisJCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19CVUZNR1JfTU9SRSkKKwkJCXByX2luZm8oInJlZmlkICV4IG1jX2NhbnZhc191X3YgJXggbWNfY2FudmFzX3kgJXhcbiIsCisJCQkJaSwgcGljX2NvbmZpZy0+bWNfY2FudmFzX3VfdiwKKwkJCQlwaWNfY29uZmlnLT5tY19jYW52YXNfeSk7CisJfQorCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfQUNDQ09ORklHX0FERFIsCisJCQkoMTYgPDwgOCkgfCAoMCA8PCAxKSB8IDEpOworCWZvciAoaSA9IDA7IGkgPCBSRUZTX1BFUl9GUkFNRTsgKytpKSB7CisJCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpwaWNfY29uZmlnID0gY20tPmZyYW1lX3JlZnNbaV0uYnVmOworCQlpZiAoIXBpY19jb25maWcpCisJCQljb250aW51ZTsKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIsCisJCQkocGljX2NvbmZpZy0+bWNfY2FudmFzX3VfdiA8PCAxNikKKwkJCXwgKHBpY19jb25maWctPm1jX2NhbnZhc191X3YgPDwgOCkKKwkJCXwgcGljX2NvbmZpZy0+bWNfY2FudmFzX3kpOworCX0KKworCS8qYXV0b19pbmMgc3RhcnQgaW5kZXg6MCBmaWVsZDowKi8KKwlXUklURV9WUkVHKFZQOURfTVBQX1JFRklORk9fVEJMX0FDQ0NPTkZJRywgMHgxIDw8IDIpOworCS8qaW5kZXggMDpsYXN0IDE6Z29sZGVuIDI6YWx0cmVmKi8KKwlmb3IgKGkgPSAwOyBpIDwgUkVGU19QRVJfRlJBTUU7IGkrKykgeworCQlpbnQgcmVmX3BpY19ib2R5X3NpemU7CisJCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpwaWNfY29uZmlnID0gY20tPmZyYW1lX3JlZnNbaV0uYnVmOworCQlpZiAoIXBpY19jb25maWcpCisJCQljb250aW51ZTsKKwkJV1JJVEVfVlJFRyhWUDlEX01QUF9SRUZJTkZPX0RBVEEsIHBpY19jb25maWctPnlfY3JvcF93aWR0aCk7CisJCVdSSVRFX1ZSRUcoVlA5RF9NUFBfUkVGSU5GT19EQVRBLCBwaWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0KTsKKworCWlmIChwaWNfY29uZmlnLT55X2Nyb3Bfd2lkdGggIT0gY3VyX3BpY19jb25maWctPnlfY3JvcF93aWR0aCB8fAorCQlwaWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0ICE9IGN1cl9waWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0KSB7CisJCXNjYWxlX2VuYWJsZSB8PSAoMSA8PCBpKTsKKwl9CisJcmVmX3BpY19ib2R5X3NpemUgPQorCQljb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemUocGljX2NvbmZpZy0+eV9jcm9wX3dpZHRoLAorCQlwaWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0LCAoYml0X2RlcHRoID09IFZQWF9CSVRTXzEwKSk7CisJV1JJVEVfVlJFRyhWUDlEX01QUF9SRUZJTkZPX0RBVEEsCisJCShwaWNfY29uZmlnLT55X2Nyb3Bfd2lkdGggPDwgMTQpCisJCS8gY3VyX3BpY19jb25maWctPnlfY3JvcF93aWR0aCk7CisJV1JJVEVfVlJFRyhWUDlEX01QUF9SRUZJTkZPX0RBVEEsCisJCShwaWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0IDw8IDE0KQorCQkvIGN1cl9waWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0KTsKKwlpZiAocGJpLT5tbXVfZW5hYmxlKQorCQlXUklURV9WUkVHKFZQOURfTVBQX1JFRklORk9fREFUQSwgMCk7CisJZWxzZQorCQlXUklURV9WUkVHKFZQOURfTVBQX1JFRklORk9fREFUQSwgcmVmX3BpY19ib2R5X3NpemUgPj4gNSk7CisJfQorCVdSSVRFX1ZSRUcoVlA5RF9NUFBfUkVGX1NDQUxFX0VOQkwsIHNjYWxlX2VuYWJsZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX21wcmVkX2h3KHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwl1bnNpZ25lZCBpbnQgZGF0YTMyOworCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfTVBSRURfQ1RSTDQpOworCWRhdGEzMiAmPSAgKH4oMSA8PCA2KSk7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0NUUkw0LCBkYXRhMzIpOworfQorCitzdGF0aWMgdm9pZCBjb25maWdfbXByZWRfaHcoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCXN0cnVjdCBWUDlfQ29tbW9uX3MgKmNtID0gJnBiaS0+Y29tbW9uOworCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpjdXJfcGljX2NvbmZpZyA9ICZjbS0+Y3VyX2ZyYW1lLT5idWY7CisJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKmxhc3RfZnJhbWVfcGljX2NvbmZpZyA9CisJCQkJCQkmY20tPnByZXZfZnJhbWUtPmJ1ZjsKKworCXVuc2lnbmVkIGludCBkYXRhMzI7CisJaW50ICAgICBtcHJlZF9jdXJyX2xjdV94OworCWludCAgICAgbXByZWRfY3Vycl9sY3VfeTsKKwlpbnQgICAgIG1wcmVkX212X3JkX2VuZF9hZGRyOworCisKKwltcHJlZF9tdl9yZF9lbmRfYWRkciA9IGxhc3RfZnJhbWVfcGljX2NvbmZpZy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkcgorCQkJKyBsYXN0X2ZyYW1lX3BpY19jb25maWctPm12X3NpemU7CisJCQkvLysgKGxhc3RfZnJhbWVfcGljX2NvbmZpZy0+bGN1X3RvdGFsICogTVZfTUVNX1VOSVQpOworCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfTVBSRURfQ1VSUl9MQ1UpOworCW1wcmVkX2N1cnJfbGN1X3ggICA9IGRhdGEzMiAmIDB4ZmZmZjsKKwltcHJlZF9jdXJyX2xjdV95ICAgPSAoZGF0YTMyID4+IDE2KSAmIDB4ZmZmZjsKKworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19CVUZNR1IpCisJCXByX2luZm8oImN1ciBwaWNfY29uZmlnIGluZGV4ICVkICBjb2wgcGljX2NvbmZpZyBpbmRleCAlZFxuIiwKKwkJCWN1cl9waWNfY29uZmlnLT5pbmRleCwgbGFzdF9mcmFtZV9waWNfY29uZmlnLT5pbmRleCk7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0NUUkwzLCAweDI0MTIyNDEyKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfQUJWX1NUQVJUX0FERFIsCisJCQlwYmktPndvcmtfc3BhY2VfYnVmLT5tcHJlZF9hYm92ZS5idWZfc3RhcnQpOworCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfTVBSRURfQ1RSTDQpOworCisJZGF0YTMyICY9ICAofigxIDw8IDYpKTsKKwlkYXRhMzIgfD0gKGNtLT51c2VfcHJldl9mcmFtZV9tdnMgPDwgNik7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0NUUkw0LCBkYXRhMzIpOworCisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX01WX1dSX1NUQVJUX0FERFIsCisJCQljdXJfcGljX2NvbmZpZy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkcik7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX01WX1dQVFIsIGN1cl9waWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9NVl9SRF9TVEFSVF9BRERSLAorCQkJbGFzdF9mcmFtZV9waWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfUlBUUiwKKwkJCWxhc3RfZnJhbWVfcGljX2NvbmZpZy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkcik7CisJLypkYXRhMzIgPSAoKHBiaS0+bGN1X3hfbnVtIC0gcGJpLT50aWxlX3dpZHRoX2xjdSkqTVZfTUVNX1VOSVQpOyovCisJLypXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfV1JfUk9XX0pVTVAsZGF0YTMyKTsqLworCS8qV1JJVEVfVlJFRyhIRVZDX01QUkVEX01WX1JEX1JPV19KVU1QLGRhdGEzMik7Ki8KKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfUkRfRU5EX0FERFIsIG1wcmVkX212X3JkX2VuZF9hZGRyKTsKKworfQorCitzdGF0aWMgdm9pZCBjb25maWdfc2FvX2h3KHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwgdW5pb24gcGFyYW1fdSAqcGFyYW1zKQoreworCXN0cnVjdCBWUDlfQ29tbW9uX3MgKmNtID0gJnBiaS0+Y29tbW9uOworCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpwaWNfY29uZmlnID0gJmNtLT5jdXJfZnJhbWUtPmJ1ZjsKKworCXVuc2lnbmVkIGludCBkYXRhMzI7CisJaW50IGxjdV9zaXplID0gNjQ7CisJaW50IG1jX2J1ZmZlcl9zaXplX3VfdiA9CisJCXBpY19jb25maWctPmxjdV90b3RhbCAqIGxjdV9zaXplKmxjdV9zaXplLzI7CisJaW50IG1jX2J1ZmZlcl9zaXplX3Vfdl9oID0KKwkJKG1jX2J1ZmZlcl9zaXplX3VfdiArIDB4ZmZmZikgPj4gMTY7Lyo2NGsgYWxpZ25tZW50Ki8KKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKiB2NGwyX2N0eCA9IHBiaS0+djRsMl9jdHg7CisKKwlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKHBiaSkgJiYKKwkJKGdldF9kb3VibGVfd3JpdGVfbW9kZShwYmkpICYgMHgyMCkgPT0gMCkgeworCQlXUklURV9WUkVHKEhFVkNfU0FPX1lfU1RBUlRfQUREUiwgcGljX2NvbmZpZy0+ZHdfeV9hZHIpOworCQlXUklURV9WUkVHKEhFVkNfU0FPX0NfU1RBUlRfQUREUiwgcGljX2NvbmZpZy0+ZHdfdV92X2Fkcik7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fWV9XUFRSLCBwaWNfY29uZmlnLT5kd195X2Fkcik7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ19XUFRSLCBwaWNfY29uZmlnLT5kd191X3ZfYWRyKTsKKwl9IGVsc2UgeworCQlpZiAoIXBiaS0+ZHdfbW11X2VuYWJsZSkgeworCQkJV1JJVEVfVlJFRyhIRVZDX1NBT19ZX1NUQVJUX0FERFIsIDB4ZmZmZmZmZmYpOworCQkJV1JJVEVfVlJFRyhIRVZDX1NBT19DX1NUQVJUX0FERFIsIDB4ZmZmZmZmZmYpOworCQl9CisJfQorCWlmIChwYmktPm1tdV9lbmFibGUpCisJCVdSSVRFX1ZSRUcoSEVWQ19DTV9IRUFERVJfU1RBUlRfQUREUiwgcGljX2NvbmZpZy0+aGVhZGVyX2Fkcik7CisKKwlpZiAocGJpLT5pc191c2VkX3Y0bCkgeworCQlXUklURV9WUkVHKEhFVkNfU0FPX1lfTEVOR1RILCBwaWNfY29uZmlnLT5sdW1hX3NpemUpOworCQlXUklURV9WUkVHKEhFVkNfU0FPX0NfTEVOR1RILCBwaWNfY29uZmlnLT5jaHJvbWFfc2l6ZSk7CisJCWlmIChkZWJ1ZyAmIFBSSU5UX0ZMQUdfVjRMX0RFVEFJTCkgeworCQkJcHJfaW5mbygiWyVkXSBjb25maWcgcGljLCBpZDogJWQsIFk6KCV4LCAlZCkgQzooJXgsICVkKS5cbiIsCisJCQkJdjRsMl9jdHgtPmlkLCBwaWNfY29uZmlnLT5pbmRleCwKKwkJCQlwaWNfY29uZmlnLT5kd195X2FkciwgcGljX2NvbmZpZy0+bHVtYV9zaXplLAorCQkJCXBpY19jb25maWctPmR3X3Vfdl9hZHIsIHBpY19jb25maWctPmNocm9tYV9zaXplKTsKKwkJfQorCX0gZWxzZSB7CisjaWZkZWYgVlA5XzEwQl9NTVVfRFcKKwkJaWYgKHBiaS0+ZHdfbW11X2VuYWJsZSkgeworCQkJV1JJVEVfVlJFRyhIRVZDX0NNX0hFQURFUl9TVEFSVF9BRERSMiwgcGljX2NvbmZpZy0+aGVhZGVyX2R3X2Fkcik7CisJCX0KKyNlbmRpZgorCQlkYXRhMzIgPSAobWNfYnVmZmVyX3NpemVfdV92X2ggPDwgMTYpIDw8IDE7CisJCS8qcHJfaW5mbygiZGF0YTMyPSV4LG1jX2J1ZmZlcl9zaXplX3Vfdl9oPSV4LGxjdV90b3RhbD0leFxuIiwKKwkJCWRhdGEzMiwgbWNfYnVmZmVyX3NpemVfdV92X2gsIHBpY19jb25maWctPmxjdV90b3RhbCk7Ki8KKworCQlXUklURV9WUkVHKEhFVkNfU0FPX1lfTEVOR1RILCBkYXRhMzIpOworCisJCWRhdGEzMiA9IChtY19idWZmZXJfc2l6ZV91X3ZfaCA8PCAxNik7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ19MRU5HVEgsIGRhdGEzMik7CisJfQorCisjaWZkZWYgVlA5XzEwQl9OVjIxCisjaWZkZWYgRE9TX1BST0pFQ1QKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDEpOworCWRhdGEzMiAmPSAofjB4MzAwMCk7CisJLypbMTM6MTJdIGF4aV9hZm9ybWF0LCAwLUxpbmVhciwgMS0zMngzMiwgMi02NHgzMiovCisJZGF0YTMyIHw9IChwYmktPm1lbV9tYXBfbW9kZSA8PCAxMik7CisJZGF0YTMyICY9ICh+MHgzKTsKKwlkYXRhMzIgfD0gMHgxOyAvKiBbMV06ZHdfZGlzYWJsZSBbMF06Y21fZGlzYWJsZSovCisJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMMSwgZGF0YTMyKTsKKwkvKlsyMzoyMl0gZHdfdjFfY3RybCBbMjE6MjBdIGR3X3YwX2N0cmwgWzE5OjE4XSBkd19oMV9jdHJsCisJICoJWzE3OjE2XSBkd19oMF9jdHJsCisJICovCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkw1KTsKKwkvKnNldCB0aGVtIGFsbCAwIGZvciBIMjY1X05WMjEgKG5vIGRvd24tc2NhbGUpKi8KKwlkYXRhMzIgJj0gfigweGZmIDw8IDE2KTsKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw1LCBkYXRhMzIpOworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDRF9JUFBfQVhJSUZfQ09ORklHKTsKKwlkYXRhMzIgJj0gKH4weDMwKTsKKwkvKls1OjRdIGFkZHJlc3NfZm9ybWF0IDAwOmxpbmVhciAwMTozMngzMiAxMDo2NHgzMiovCisJZGF0YTMyIHw9IChwYmktPm1lbV9tYXBfbW9kZSA8PCA0KTsKKwlXUklURV9WUkVHKEhFVkNEX0lQUF9BWElJRl9DT05GSUcsIGRhdGEzMik7CisjZWxzZQorCS8qbThiYWJ5IHRlc3QxOTAyKi8KKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDEpOworCWRhdGEzMiAmPSAofjB4MzAwMCk7CisJLypbMTM6MTJdIGF4aV9hZm9ybWF0LCAwLUxpbmVhciwgMS0zMngzMiwgMi02NHgzMiovCisJZGF0YTMyIHw9IChwYmktPm1lbV9tYXBfbW9kZSA8PCAxMik7CisJZGF0YTMyICY9ICh+MHhmZjApOworCS8qZGF0YTMyIHw9IDB4NjcwOyovIC8qQmlnLUVuZGlhbiBwZXIgNjQtYml0Ki8KKwlkYXRhMzIgfD0gMHg4ODA7ICAvKi5CaWctRW5kaWFuIHBlciA2NC1iaXQgKi8KKwlkYXRhMzIgJj0gKH4weDMpOworCWRhdGEzMiB8PSAweDE7IC8qWzFdOmR3X2Rpc2FibGUgWzBdOmNtX2Rpc2FibGUqLworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDEsIGRhdGEzMik7CisJLyogWzIzOjIyXSBkd192MV9jdHJsIFsyMToyMF0gZHdfdjBfY3RybAorCSAqWzE5OjE4XSBkd19oMV9jdHJsIFsxNzoxNl0gZHdfaDBfY3RybAorCSAqLworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMNSk7CisJLyogc2V0IHRoZW0gYWxsIDAgZm9yIEgyNjVfTlYyMSAobm8gZG93bi1zY2FsZSkqLworCWRhdGEzMiAmPSB+KDB4ZmYgPDwgMTYpOworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDUsIGRhdGEzMik7CisKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ0RfSVBQX0FYSUlGX0NPTkZJRyk7CisJZGF0YTMyICY9ICh+MHgzMCk7CisJLypbNTo0XSBhZGRyZXNzX2Zvcm1hdCAwMDpsaW5lYXIgMDE6MzJ4MzIgMTA6NjR4MzIqLworCWRhdGEzMiB8PSAocGJpLT5tZW1fbWFwX21vZGUgPDwgNCk7CisJZGF0YTMyICY9ICh+MHhGKTsKKwlkYXRhMzIgfD0gMHg4OyAvKkJpZy1FbmRpYW4gcGVyIDY0LWJpdCovCisJV1JJVEVfVlJFRyhIRVZDRF9JUFBfQVhJSUZfQ09ORklHLCBkYXRhMzIpOworI2VuZGlmCisjZWxzZQorCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMMSk7CisJZGF0YTMyICY9ICh+KDMgPDwgMTQpKTsKKwlkYXRhMzIgfD0gKDIgPDwgMTQpOwkvKiBsaW5lIGFsaWduIHdpdGggNjQqLworCisJZGF0YTMyICY9ICh+MHgzMDAwKTsKKwkvKiBbMTM6MTJdIGF4aV9hZm9ybWF0LCAwLUxpbmVhciwgMS0zMngzMiwgMi02NHgzMiAqLworCWRhdGEzMiB8PSAocGJpLT5tZW1fbWFwX21vZGUgPDwgMTIpOworCisJZGF0YTMyICY9ICh+MHhmZjApOworI2lmZGVmIFZQOV8xMEJfTU1VX0RXCisJaWYgKHBiaS0+ZHdfbW11X2VuYWJsZSA9PSAwKQorCQlkYXRhMzIgfD0gKChwYmktPmVuZGlhbiA+PiA4KSAmIDB4ZmZmKTsJLyogQmlnLUVuZGlhbiBwZXIgNjQtYml0ICovCisjZWxzZQorCWRhdGEzMiB8PSAoKHBiaS0+ZW5kaWFuID4+IDgpICYgMHhmZmYpOworI2VuZGlmCisJZGF0YTMyICY9ICh+MHgzKTsgCQkvKlsxXTpkd19kaXNhYmxlIFswXTpjbV9kaXNhYmxlKi8KKwlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKHBiaSkgPT0gMCkKKwkJZGF0YTMyIHw9IDB4MjsgLypkaXNhYmxlIGRvdWJsZSB3cml0ZSovCisJZWxzZSBpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKHBiaSkgJiAweDEwKQorCQlkYXRhMzIgfD0gMHgxOyAvKmRpc2FibGUgY20qLworCSBpZiAgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQSkgeyAvKiA+PSBHMTJBIGR3IHdyaXRlIGNvbnRyb2wgKi8KKwkJdW5zaWduZWQgaW50IGRhdGE7CisJCWRhdGEgPSBSRUFEX1ZSRUcoSEVWQ19EQkxLX0NGR0IpOworCQlkYXRhICY9ICh+MHgzMDApOyAvKls4XTpmaXJzdCB3cml0ZSBlbmFibGUgKGNvbXByZXNzKSAgWzldOmRvdWJsZSB3cml0ZSBlbmFibGUgKHVuY29tcHJlc3MpKi8KKwkJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShwYmkpID09IDApCisJCQlkYXRhIHw9ICgweDEgPDwgOCk7IC8qZW5hYmxlIGZpcnN0IHdyaXRlKi8KKwkJZWxzZSBpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKHBiaSkgJiAweDEwKQorCQkJZGF0YSB8PSAoMHgxIDw8IDkpOyAvKmRvdWJsZSB3cml0ZSBvbmx5Ki8KKwkJZWxzZQorCQkJZGF0YSB8PSAoKDB4MSA8PCA4KSAgfCgweDEgPDwgOSkpOworCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkdCLCBkYXRhKTsKKwl9CisKKwkvKiBzd2FwIHV2ICovCisJaWYgKHBiaS0+aXNfdXNlZF92NGwpIHsKKwkJaWYgKCh2NGwyX2N0eC0+cV9kYXRhW0FNTF9RX0RBVEFfRFNUXS5mbXQtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfTlYyMSkgfHwKKwkJCSh2NGwyX2N0eC0+cV9kYXRhW0FNTF9RX0RBVEFfRFNUXS5mbXQtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfTlYyMU0pKQorCQkJZGF0YTMyICY9IH4oMSA8PCA4KTsgLyogTlYyMSAqLworCQllbHNlCisJCQlkYXRhMzIgfD0gKDEgPDwgOCk7IC8qIE5WMTIgKi8KKwl9CisKKwkvKgorCSogIFszMToyNF0gYXJfZmlmbzFfYXhpX3RocmVkCisJKiAgWzIzOjE2XSBhcl9maWZvMF9heGlfdGhyZWQKKwkqICBbMTU6MTRdIGF4aV9saW5lYWxpZ24sIDAtMTZieXRlcywgMS0zMmJ5dGVzLCAyLTY0Ynl0ZXMKKwkqICBbMTM6MTJdIGF4aV9hZm9ybWF0LCAwLUxpbmVhciwgMS0zMngzMiwgMi02NHgzMgorCSogIFsxMTowOF0gYXhpX2xlbmRpYW5fQworCSogIFswNzowNF0gYXhpX2xlbmRpYW5fWQorCSogIFszXSAgICAgcmVzZXJ2ZWQKKwkqICBbMl0gICAgIGNsa19mb3JjZW9uCisJKiAgWzFdICAgICBkd19kaXNhYmxlOmRpc2FibGUgZG91YmxlIHdyaXRlIG91dHB1dAorCSogIFswXSAgICAgY21fZGlzYWJsZTpkaXNhYmxlIGNvbXByZXNzIG91dHB1dAorCSovCisJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMMSwgZGF0YTMyKTsKKworCWlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUocGJpKSAmIDB4MTApIHsKKwkJLyogWzIzOjIyXSBkd192MV9jdHJsCisJCSAqWzIxOjIwXSBkd192MF9jdHJsCisJCSAqWzE5OjE4XSBkd19oMV9jdHJsCisJCSAqWzE3OjE2XSBkd19oMF9jdHJsCisJCSAqLworCQlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDUpOworCQkvKnNldCB0aGVtIGFsbCAwIGZvciBIMjY1X05WMjEgKG5vIGRvd24tc2NhbGUpKi8KKwkJZGF0YTMyICY9IH4oMHhmZiA8PCAxNik7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDUsIGRhdGEzMik7CisJfSBlbHNlIHsKKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDcpCisJCQlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkwyNiwgMCk7CisKKwkJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkw1KTsKKwkJZGF0YTMyICY9ICh+KDB4ZmYgPDwgMTYpKTsKKwkJaWYgKChnZXRfZG91YmxlX3dyaXRlX21vZGUocGJpKSAmIDB4ZikgPT0gOCB8fAorCQkJKGdldF9kb3VibGVfd3JpdGVfbW9kZShwYmkpICYgMHhmKSA9PSA5KSB7CisJCQlkYXRhMzIgfD0gKDB4ZmYgPDwgMTYpOworCQkJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMMjYsIDB4Zik7CisJCX0gZWxzZSBpZiAoKGdldF9kb3VibGVfd3JpdGVfbW9kZShwYmkpICYgMHhmKSA9PSAyIHx8CisJCQkoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKHBiaSkgJiAweGYpID09IDMpCisJCQlkYXRhMzIgfD0gKDB4ZmYgPDwgMTYpOworCQllbHNlIGlmICgoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKHBiaSkgJiAweGYpID09IDQpCisJCQlkYXRhMzIgfD0gKDB4MzMgPDwgMTYpOworCQlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw1LCBkYXRhMzIpOworCX0KKworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDRF9JUFBfQVhJSUZfQ09ORklHKTsKKwlkYXRhMzIgJj0gKH4weDMwKTsKKwkvKiBbNTo0XSAgICAtLSBhZGRyZXNzX2Zvcm1hdCAwMDpsaW5lYXIgMDE6MzJ4MzIgMTA6NjR4MzIgKi8KKwlkYXRhMzIgfD0gKHBiaS0+bWVtX21hcF9tb2RlIDw8IDQpOworCWRhdGEzMiAmPSAofjB4Zik7CisJZGF0YTMyIHw9IChwYmktPmVuZGlhbiAmIDB4Zik7ICAvKiB2YWxpZCBvbmx5IHdoZW4gZG91YmxlIHdyaXRlIG9ubHkgKi8KKworCS8qIHN3YXAgdXYgKi8KKwlpZiAocGJpLT5pc191c2VkX3Y0bCkgeworCQlpZiAoKHY0bDJfY3R4LT5xX2RhdGFbQU1MX1FfREFUQV9EU1RdLmZtdC0+Zm91cmNjID09IFY0TDJfUElYX0ZNVF9OVjIxKSB8fAorCQkJKHY0bDJfY3R4LT5xX2RhdGFbQU1MX1FfREFUQV9EU1RdLmZtdC0+Zm91cmNjID09IFY0TDJfUElYX0ZNVF9OVjIxTSkpCisJCQlkYXRhMzIgfD0gKDEgPDwgMTIpOyAvKiBOVjIxICovCisJCWVsc2UKKwkJCWRhdGEzMiAmPSB+KDEgPDwgMTIpOyAvKiBOVjEyICovCisJfQorCWRhdGEzMiAmPSAofigzIDw8IDgpKTsKKwlkYXRhMzIgfD0gKDIgPDwgOCk7CQkvKiBsaW5lIGFsaWduIHdpdGggNjQgZm9yIGR3IG9ubHkgKi8KKwkvKgorCSogWzM6MF0gICBsaXR0bGVfZW5kaWFuCisJKiBbNTo0XSAgIGFkZHJlc3NfZm9ybWF0IDAwOmxpbmVhciAwMTozMngzMiAxMDo2NHgzMgorCSogWzc6Nl0gICByZXNlcnZlZAorCSogWzk6OF0gICBMaW5lYXJfTGluZUFsaWdubWVudCAwMDoxNmJ5dGUgMDE6MzJieXRlIDEwOjY0Ynl0ZQorCSogWzExOjEwXSByZXNlcnZlZAorCSogWzEyXSAgICBDYkNyX2J5dGVfc3dhcAorCSogWzMxOjEzXSByZXNlcnZlZAorCSovCisJV1JJVEVfVlJFRyhIRVZDRF9JUFBfQVhJSUZfQ09ORklHLCBkYXRhMzIpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHZwOV9jb25maWdfd29ya19zcGFjZV9odyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksIHUzMiBtYXNrKQoreworCXN0cnVjdCBCdWZmSW5mb19zICpidWZfc3BlYyA9IHBiaS0+d29ya19zcGFjZV9idWY7CisJdW5zaWduZWQgaW50IGRhdGEzMiwgZGF0YV90bXA7CisJaW50IGxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSwgbG9zbGVzc19jb21wX2JvZHlfc2l6ZTsKKworCWlmIChkZWJ1ZyAmJiBwYmktPmluaXRfZmxhZyA9PSAwKQorCQlwcl9pbmZvKCIlcyB3ICVkIGggJWQgJXggJXggJXggJXggJXggJXggJXggJXggJXggJXggJXggJXhcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWJ1Zl9zcGVjLT5tYXhfd2lkdGgsCisJCQlidWZfc3BlYy0+bWF4X2hlaWdodCwKKwkJCWJ1Zl9zcGVjLT5pcHAuYnVmX3N0YXJ0LAorCQkJYnVmX3NwZWMtPnN0YXJ0X2FkciwKKwkJCWJ1Zl9zcGVjLT5zaG9ydF90ZXJtX3Jwcy5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+dnBzLmJ1Zl9zdGFydCwKKwkJCWJ1Zl9zcGVjLT5zcHMuYnVmX3N0YXJ0LAorCQkJYnVmX3NwZWMtPnBwcy5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+c2FvX3VwLmJ1Zl9zdGFydCwKKwkJCWJ1Zl9zcGVjLT5zd2FwX2J1Zi5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+c3dhcF9idWYyLmJ1Zl9zdGFydCwKKwkJCWJ1Zl9zcGVjLT5zY2FsZWx1dC5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zdGFydCwKKwkJCWJ1Zl9zcGVjLT5kYmxrX2RhdGEuYnVmX3N0YXJ0KTsKKworCWlmIChtYXNrICYgSFdfTUFTS19GUk9OVCkgeworCQlpZiAoKGRlYnVnICYgVlA5X0RFQlVHX1NFTkRfUEFSQU1fV0lUSF9SRUcpID09IDApCisJCQlXUklURV9WUkVHKEhFVkNfUlBNX0JVRkZFUiwgKHUzMilwYmktPnJwbV9waHlfYWRkcik7CisKKwkJV1JJVEVfVlJFRyhIRVZDX1NIT1JUX1RFUk1fUlBTLAorCQkJYnVmX3NwZWMtPnNob3J0X3Rlcm1fcnBzLmJ1Zl9zdGFydCk7CisJCS8qV1JJVEVfVlJFRyhIRVZDX1ZQU19CVUZGRVIsIGJ1Zl9zcGVjLT52cHMuYnVmX3N0YXJ0KTsqLworCQkvKldSSVRFX1ZSRUcoSEVWQ19TUFNfQlVGRkVSLCBidWZfc3BlYy0+c3BzLmJ1Zl9zdGFydCk7Ki8KKwkJV1JJVEVfVlJFRyhIRVZDX1BQU19CVUZGRVIsIGJ1Zl9zcGVjLT5wcHMuYnVmX3N0YXJ0KTsKKwkJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9TV0FQX0JVRkZFUiwKKwkJCWJ1Zl9zcGVjLT5zd2FwX2J1Zi5idWZfc3RhcnQpOworCQlXUklURV9WUkVHKEhFVkNfU1RSRUFNX1NXQVBfQlVGRkVSMiwKKwkJCWJ1Zl9zcGVjLT5zd2FwX2J1ZjIuYnVmX3N0YXJ0KTsKKwkJV1JJVEVfVlJFRyhMTUVNX0RVTVBfQURSLCAodTMyKXBiaS0+bG1lbV9waHlfYWRkcik7CisKKwl9CisKKwlpZiAoKG1hc2sgJiBIV19NQVNLX0JBQ0spID09IDApCisJCXJldHVybjsKKworI2lmZGVmIExPU0xFU1NfQ09NUFJFU1NfTU9ERQorCWxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSA9CisJCWNvbXB1dGVfbG9zbGVzc19jb21wX2hlYWRlcl9zaXplKHBiaS0+aW5pdF9waWNfdywKKwkJcGJpLT5pbml0X3BpY19oKTsKKwlsb3NsZXNzX2NvbXBfYm9keV9zaXplID0KKwkJY29tcHV0ZV9sb3NsZXNzX2NvbXBfYm9keV9zaXplKHBiaS0+aW5pdF9waWNfdywKKwkJcGJpLT5pbml0X3BpY19oLCBidWZfYWxsb2NfZGVwdGggPT0gMTApOworI2VuZGlmCisJV1JJVEVfVlJFRyhIRVZDRF9JUFBfTElORUJVRkZfQkFTRSwKKwkJYnVmX3NwZWMtPmlwcC5idWZfc3RhcnQpOworCS8vV1JJVEVfVlJFRyhIRVZDX1NBT19VUCwgYnVmX3NwZWMtPnNhb191cC5idWZfc3RhcnQpOworCS8vV1JJVEVfVlJFRyhIRVZDX1NDQUxFTFVULCBidWZfc3BlYy0+c2NhbGVsdXQuYnVmX3N0YXJ0KTsKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKSB7CisJCS8qIGNmZ19hZGRyX2FkcCovCisJCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGR0UsIGJ1Zl9zcGVjLT5kYmxrX3BhcmEuYnVmX3N0YXJ0KTsKKwkJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0JVRk1HUl9NT1JFKQorCQkJcHJfaW5mbygiV3JpdGUgSEVWQ19EQkxLX0NGR0VcbiIpOworCX0KKwkvKiBjZmdfcF9hZGRyICovCisJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHNCwgYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc3RhcnQpOworCisJLyogY2ZnX2RfYWRkciAqLworCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGRzUsIGJ1Zl9zcGVjLT5kYmxrX2RhdGEuYnVmX3N0YXJ0KTsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkgeworCQkgLyoKKwkgICAgICogZGF0YTMyID0gKFJFQURfVlJFRyhQX0hFVkNfREJMS19DRkczKT4+OCkgJiAweGZmOyAvLyB4aW8gbGVmdCBvZmZzZXQsIGRlZmF1bHQgaXMgMHg0MAorCSAgICAgKiBkYXRhMzIgPSBkYXRhMzIgKiAyOworCSAgICAgKiBkYXRhMzIgPSAoUkVBRF9WUkVHKFBfSEVWQ19EQkxLX0NGRzMpPj4xNikgJiAweGZmOyAvLyBhZHAgbGVmdCBvZmZzZXQsIGRlZmF1bHQgaXMgMHgwNDAKKwkgICAgICogZGF0YTMyID0gZGF0YTMyICogMjsKKwkgICAgICovCisJCWlmIChidWZfc3BlYy0+bWF4X3dpZHRoIDw9IDQwOTYgJiYgYnVmX3NwZWMtPm1heF9oZWlnaHQgPD0gMjMwNCkKKwkJCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGRzMsIDB4NDA0MDEwKTsgLy9kZWZhdWx0IHZhbHVlCisJCWVsc2UKKwkJCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGRzMsIDB4ODA4MDIwKTsgLy8gbWFrZSBsZWZ0IHN0b3JhZ2UgMiB4IDRrXQorCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfQlVGTUdSX01PUkUsCisJCQkiSEVWQ19EQkxLX0NGRzMgPSAleFxuIiwgUkVBRF9WUkVHKEhFVkNfREJMS19DRkczKSk7CisJfQorI2lmZGVmIExPU0xFU1NfQ09NUFJFU1NfTU9ERQorCWlmIChwYmktPm1tdV9lbmFibGUpIHsKKwkJLypiaXRbNF0gOiBwYWdlZF9tZW1fbW9kZSovCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLCAoMHgxIDw8IDQpKTsKKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA8IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpCisJCQlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMiwgMCk7CisJfSBlbHNlIHsKKwkJLyppZihjdXJfcGljX2NvbmZpZy0+Yml0X2RlcHRoID09IFZQWF9CSVRTXzEwKQorCQkgKglXUklURV9WUkVHKFBfSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLCAoMDw8MykpOworCQkgKi8KKwkJLypiaXRbM10gc21lbSBtZG9lKi8KKwkJLyplbHNlIFdSSVRFX1ZSRUcoUF9IRVZDRF9NUFBfREVDT01QX0NUTDEsICgxPDwzKSk7Ki8KKwkJLypiaXRbM10gc21lbSBtZG9lKi8KKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDIsCisJCQkobG9zbGVzc19jb21wX2JvZHlfc2l6ZSA+PiA1KSk7CisJfQorCS8qV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDIsCisJCShsb3NsZXNzX2NvbXBfYm9keV9zaXplID4+IDUpKTsqLworCS8qV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDMsCisJCSgweGZmPDwyMCkgfCAoMHhmZjw8MTApIHwgMHhmZik7Ki8KKwkvKjgtYml0IG1vZGUgKi8KKwlXUklURV9WUkVHKEhFVkNfQ01fQk9EWV9MRU5HVEgsIGxvc2xlc3NfY29tcF9ib2R5X3NpemUpOworCVdSSVRFX1ZSRUcoSEVWQ19DTV9IRUFERVJfT0ZGU0VULCBsb3NsZXNzX2NvbXBfYm9keV9zaXplKTsKKwlXUklURV9WUkVHKEhFVkNfQ01fSEVBREVSX0xFTkdUSCwgbG9zbGVzc19jb21wX2hlYWRlcl9zaXplKTsKKworCWlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUocGJpKSAmIDB4MTApCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLCAweDEgPDwgMzEpOworI2Vsc2UKKwlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMSwgMHgxIDw8IDMxKTsKKyNlbmRpZgorCisJaWYgKHBiaS0+bW11X2VuYWJsZSkgeworCQlXUklURV9WUkVHKEhFVkNfU0FPX01NVV9WSDBfQUREUiwgYnVmX3NwZWMtPm1tdV92YmguYnVmX3N0YXJ0KTsKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19NTVVfVkgxX0FERFIsIGJ1Zl9zcGVjLT5tbXVfdmJoLmJ1Zl9zdGFydAorCQkJCSsgVkJIX0JVRl9TSVpFKGJ1Zl9zcGVjKSk7CisJCS8qZGF0YTMyID0gUkVBRF9WUkVHKFBfSEVWQ19TQU9fQ1RSTDkpOyovCisJCS8qZGF0YTMyIHw9IDB4MTsqLworCQkvKldSSVRFX1ZSRUcoUF9IRVZDX1NBT19DVFJMOSwgZGF0YTMyKTsqLworCisJCS8qIHVzZSBIRVZDX0NNX0hFQURFUl9TVEFSVF9BRERSICovCisJCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMNSk7CisJCWRhdGEzMiB8PSAoMTw8MTApOworCQlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw1LCBkYXRhMzIpOworCX0KKyNpZmRlZiBWUDlfMTBCX01NVV9EVworCWlmIChwYmktPmR3X21tdV9lbmFibGUpIHsKKwkJZGF0YV90bXAgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDkpOworCQlkYXRhX3RtcCB8PSAoMTw8MTApOworCQlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw5LCBkYXRhX3RtcCk7CisKKwkJV1JJVEVfVlJFRyhIRVZDX0NNX0JPRFlfTEVOR1RIMiwgbG9zbGVzc19jb21wX2JvZHlfc2l6ZSk7CisJCVdSSVRFX1ZSRUcoSEVWQ19DTV9IRUFERVJfT0ZGU0VUMiwgbG9zbGVzc19jb21wX2JvZHlfc2l6ZSk7CisJCVdSSVRFX1ZSRUcoSEVWQ19DTV9IRUFERVJfTEVOR1RIMiwgbG9zbGVzc19jb21wX2hlYWRlcl9zaXplKTsKKworCQlXUklURV9WUkVHKEhFVkNfU0FPX01NVV9WSDBfQUREUjIsIGJ1Zl9zcGVjLT5tbXVfdmJoX2R3LmJ1Zl9zdGFydCk7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fTU1VX1ZIMV9BRERSMiwgYnVmX3NwZWMtPm1tdV92YmhfZHcuYnVmX3N0YXJ0CisJCQkrIERXX1ZCSF9CVUZfU0laRShidWZfc3BlYykpOworCisJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1RCkgeworCQkJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShwYmkpICYgMHgyMCkgeworCQkJCVdSSVRFX1ZSRUcoSEVWQ19EV19WSDBfQURERFIsCisJCQkJCWJ1Zl9zcGVjLT5tbXVfdmJoX2R3LmJ1Zl9zdGFydCArIERXX1ZCSF9CVUZfU0laRShidWZfc3BlYykgKiAyKTsKKwkJCQlXUklURV9WUkVHKEhFVkNfRFdfVkgxX0FERERSLAorCQkJCQlidWZfc3BlYy0+bW11X3ZiaF9kdy5idWZfc3RhcnQgKyBEV19WQkhfQlVGX1NJWkUoYnVmX3NwZWMpICogMyk7CisJCQl9CisJCX0KKwkJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkw1KTsKKwkJLyogdXNlIEhFVkNfQ01fSEVBREVSX1NUQVJUX0FERFIgKi8KKwkJZGF0YTMyIHw9ICgxPDwxNSk7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDUsIGRhdGEzMik7CisJfQorI2VuZGlmCisKKwkvKiBjb25maWcgbXByZWQgYXhpIGJ1cnN0IHRocmVzaG9sZCAqLworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9DVFJMMywgMHgyNDEyMjQxMik7CisKKyNpZmRlZiBDT19NVl9DT01QUkVTUworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3KSB7CisJICAgIGRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX01QUkVEX0NUUkw0KTsKKwkgICAgZGF0YTMyIHw9ICAoMSA8PCAxKTsKKwkgICAgV1JJVEVfVlJFRyhIRVZDX01QUkVEX0NUUkw0LCBkYXRhMzIpOworCX0KKyNlbmRpZgorCisJV1JJVEVfVlJFRyhWUDlfU0VHX01BUF9CVUZGRVIsIGJ1Zl9zcGVjLT5zZWdfbWFwLmJ1Zl9zdGFydCk7CisKKwlXUklURV9WUkVHKExNRU1fRFVNUF9BRFIsICh1MzIpcGJpLT5sbWVtX3BoeV9hZGRyKTsKKworCVdSSVRFX1ZSRUcoVlA5X1BST0JfU1dBUF9CVUZGRVIsIHBiaS0+cHJvYl9idWZmZXJfcGh5X2FkZHIpOworCVdSSVRFX1ZSRUcoVlA5X0NPVU5UX1NXQVBfQlVGRkVSLCBwYmktPmNvdW50X2J1ZmZlcl9waHlfYWRkcik7CisJaWYgKHBiaS0+bW11X2VuYWJsZSkgeworCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKQorCQkJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9NTVVfTUFQX0FERFIsIHBiaS0+ZnJhbWVfbW11X21hcF9waHlfYWRkcik7CisJCWVsc2UKKwkJCVdSSVRFX1ZSRUcoVlA5X01NVV9NQVBfQlVGRkVSLCBwYmktPmZyYW1lX21tdV9tYXBfcGh5X2FkZHIpOworCX0KKyNpZmRlZiBWUDlfMTBCX01NVV9EVworCWlmIChwYmktPmR3X21tdV9lbmFibGUpIHsKKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDVEKSB7CisJCQlXUklURV9WUkVHKEhFVkNfU0FPX01NVV9ETUFfQ1RSTDIsIHBiaS0+ZnJhbWVfbW11X2R3X21hcF9waHlfYWRkcik7CisJCQkvL1dSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTU1VX01BUF9BRERSMiwgcGJpLT5mcmFtZV9tbXVfZHdfbWFwX3BoeV9hZGRyKTsKKwkJfSBlbHNlIHsKKwkJCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTU1VX01BUF9BRERSMiwgcGJpLT5mcmFtZV9tbXVfZHdfbWFwX3BoeV9hZGRyKTsKKwkJfQorCQlXUklURV9WUkVHKEhFVkNfU0FPX1lfU1RBUlRfQUREUiwgMCk7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ19TVEFSVF9BRERSLCAwKTsKKyNpZmRlZiBWUDlfMTBCX0hFRF9GQgorCQlXUklURV9WUkVHKEhFVkNfQVNTSVNUX0ZCX01NVV9NQVBfQUREUjIsIEZCX0ZSQU1FX01NVV9NQVBfQUREUik7CisJI2lmZGVmIFZQOV8xMEJfSEVEX1NBTUVfRkIKKwkJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9GQkRfTU1VX01BUF9BRERSMiwgRkJfRlJBTUVfTU1VX01BUF9BRERSKTsKKwkjZW5kaWYKKyNlbmRpZgorCX0KKyNlbmRpZgorfQorCisKKyNpZmRlZiBWUDlfTFBGX0xWTF9VUERBVEUKKy8qCisgKiBEZWZpbmVzLCBkZWNsYXJhdGlvbnMsIHN1Yi1mdW5jdGlvbnMgZm9yIHZwOSBkZS1ibG9jayBsb29wCisJZmlsdGVyIFRoci9MdmwgdGFibGUgdXBkYXRlCisgKiAtIHN0cnVjdCBzZWdtZW50YXRpb24gaXMgZm9yIGxvb3AgZmlsdGVyIG9ubHkgKHJlbW92ZWQgc29tZXRoaW5nKQorICogLSBmdW5jdGlvbiAidnA5X2xvb3BfZmlsdGVyX2luaXQiIGFuZCAidnA5X2xvb3BfZmlsdGVyX2ZyYW1lX2luaXQiIHdpbGwKKwliZSBpbnN0YW50aWF0ZWQgaW4gQ19FbnRyeQorICogLSB2cDlfbG9vcF9maWx0ZXJfaW5pdCBydW4gb25jZSBiZWZvcmUgZGVjb2Rpbmcgc3RhcnQKKyAqIC0gdnA5X2xvb3BfZmlsdGVyX2ZyYW1lX2luaXQgcnVuIGJlZm9yZSBldmVyeSBmcmFtZSBkZWNvZGluZyBzdGFydAorICogLSBzZXQgdmlkZW8gZm9ybWF0IHRvIFZQOSBpcyBpbiB2cDlfbG9vcF9maWx0ZXJfaW5pdAorICovCisjZGVmaW5lIE1BWF9MT09QX0ZJTFRFUiA2MworI2RlZmluZSBNQVhfUkVGX0xGX0RFTFRBUyA0CisjZGVmaW5lIE1BWF9NT0RFX0xGX0RFTFRBUyAyCisvKiNkZWZpbmUgSU5UUkFfRlJBTUUgMCovCisvKiNkZWZpbmUgTEFTVF9GUkFNRSAxKi8KKy8qI2RlZmluZSBNQVhfUkVGX0ZSQU1FUyA0Ki8KKyNkZWZpbmUgU0VHTUVOVF9ERUxUQURBVEEgICAwCisjZGVmaW5lIFNFR01FTlRfQUJTREFUQSAgICAgMQorI2RlZmluZSBNQVhfU0VHTUVOVFMgICAgIDgKKy8qLiNkZWZpbmUgU0VHX1RSRUVfUFJPQlMgICAoTUFYX1NFR01FTlRTLTEpKi8KKy8qbm8gdXNlIGZvciBsb29wIGZpbHRlciwgaWYgdGhpcyBzdHJ1Y3QgZm9yIGNvbW1vbiB1c2UsIHBscyBhZGQgaXQgYmFjayovCisvKiNkZWZpbmUgUFJFRElDVElPTl9QUk9CUyAzKi8KKy8qIG5vIHVzZSBmb3IgbG9vcCBmaWx0ZXIsIGlmIHRoaXMgc3RydWN0IGZvciBjb21tb24gdXNlLCBwbHMgYWRkIGl0IGJhY2sqLworCitlbnVtIFNFR19MVkxfRkVBVFVSRVMgeworCVNFR19MVkxfQUxUX1EgPSAwLCAvKlVzZSBhbHRlcm5hdGUgUXVhbnRpemVyIC4uLi4qLworCVNFR19MVkxfQUxUX0xGID0gMSwgLypVc2UgYWx0ZXJuYXRlIGxvb3AgZmlsdGVyIHZhbHVlLi4uKi8KKwlTRUdfTFZMX1JFRl9GUkFNRSA9IDIsIC8qT3B0aW9uYWwgU2VnbWVudCByZWZlcmVuY2UgZnJhbWUqLworCVNFR19MVkxfU0tJUCA9IDMsICAvKk9wdGlvbmFsIFNlZ21lbnQgKDAsMCkgKyBza2lwIG1vZGUqLworCVNFR19MVkxfTUFYID0gNCAgICAvKk51bWJlciBvZiBmZWF0dXJlcyBzdXBwb3J0ZWQqLworfTsKKworc3RydWN0IHNlZ21lbnRhdGlvbiB7CisJdWludDhfdCBlbmFibGVkOworCXVpbnQ4X3QgdXBkYXRlX21hcDsKKwl1aW50OF90IHVwZGF0ZV9kYXRhOworCXVpbnQ4X3QgYWJzX2RlbHRhOworCXVpbnQ4X3QgdGVtcG9yYWxfdXBkYXRlOworCisJLypubyB1c2UgZm9yIGxvb3AgZmlsdGVyLCBpZiB0aGlzIHN0cnVjdAorCSAqZm9yIGNvbW1vbiB1c2UsIHBscyBhZGQgaXQgYmFjaworCSAqLworCS8qdnA5X3Byb2IgdHJlZV9wcm9ic1tTRUdfVFJFRV9QUk9CU107ICovCisJLyogbm8gdXNlIGZvciBsb29wIGZpbHRlciwgaWYgdGhpcyBzdHJ1Y3QKKwkgKglmb3IgY29tbW9uIHVzZSwgcGxzIGFkZCBpdCBiYWNrCisJICovCisJLyp2cDlfcHJvYiBwcmVkX3Byb2JzW1BSRURJQ1RJT05fUFJPQlNdOyovCisKKwlpbnQxNl90IGZlYXR1cmVfZGF0YVtNQVhfU0VHTUVOVFNdW1NFR19MVkxfTUFYXTsKKwl1bnNpZ25lZCBpbnQgZmVhdHVyZV9tYXNrW01BWF9TRUdNRU5UU107Cit9OworCitzdHJ1Y3QgbG9vcF9maWx0ZXJfdGhyZXNoIHsKKwl1aW50OF90IG1ibGltOworCXVpbnQ4X3QgbGltOworCXVpbnQ4X3QgaGV2X3RocjsKK307CisKK3N0cnVjdCBsb29wX2ZpbHRlcl9pbmZvX24geworCXN0cnVjdCBsb29wX2ZpbHRlcl90aHJlc2ggbGZ0aHJbTUFYX0xPT1BfRklMVEVSICsgMV07CisJdWludDhfdCBsdmxbTUFYX1NFR01FTlRTXVtNQVhfUkVGX0ZSQU1FU11bTUFYX01PREVfTEZfREVMVEFTXTsKK307CisKK3N0cnVjdCBsb29wZmlsdGVyIHsKKwlpbnQgZmlsdGVyX2xldmVsOworCisJaW50IHNoYXJwbmVzc19sZXZlbDsKKwlpbnQgbGFzdF9zaGFycG5lc3NfbGV2ZWw7CisKKwl1aW50OF90IG1vZGVfcmVmX2RlbHRhX2VuYWJsZWQ7CisJdWludDhfdCBtb2RlX3JlZl9kZWx0YV91cGRhdGU7CisKKwkvKjAgPSBJbnRyYSwgTGFzdCwgR0YsIEFSRiovCisJc2lnbmVkIGNoYXIgcmVmX2RlbHRhc1tNQVhfUkVGX0xGX0RFTFRBU107CisJc2lnbmVkIGNoYXIgbGFzdF9yZWZfZGVsdGFzW01BWF9SRUZfTEZfREVMVEFTXTsKKworCS8qMCA9IFpFUk9fTVYsIE1WKi8KKwlzaWduZWQgY2hhciBtb2RlX2RlbHRhc1tNQVhfTU9ERV9MRl9ERUxUQVNdOworCXNpZ25lZCBjaGFyIGxhc3RfbW9kZV9kZWx0YXNbTUFYX01PREVfTEZfREVMVEFTXTsKK307CisKK3N0YXRpYyBpbnQgdnA5X2NsYW1wKGludCB2YWx1ZSwgaW50IGxvdywgaW50IGhpZ2gpCit7CisJcmV0dXJuIHZhbHVlIDwgbG93ID8gbG93IDogKHZhbHVlID4gaGlnaCA/IGhpZ2ggOiB2YWx1ZSk7Cit9CisKK2ludCBzZWdmZWF0dXJlX2FjdGl2ZShzdHJ1Y3Qgc2VnbWVudGF0aW9uICpzZWcsCisJCQlpbnQgc2VnbWVudF9pZCwKKwkJCWVudW0gU0VHX0xWTF9GRUFUVVJFUyBmZWF0dXJlX2lkKSB7CisJcmV0dXJuIHNlZy0+ZW5hYmxlZCAmJgorCQkoc2VnLT5mZWF0dXJlX21hc2tbc2VnbWVudF9pZF0gJiAoMSA8PCBmZWF0dXJlX2lkKSk7Cit9CisKK2ludCBnZXRfc2VnZGF0YShzdHJ1Y3Qgc2VnbWVudGF0aW9uICpzZWcsIGludCBzZWdtZW50X2lkLAorCQkJCWVudW0gU0VHX0xWTF9GRUFUVVJFUyBmZWF0dXJlX2lkKSB7CisJcmV0dXJuIHNlZy0+ZmVhdHVyZV9kYXRhW3NlZ21lbnRfaWRdW2ZlYXR1cmVfaWRdOworfQorCitzdGF0aWMgdm9pZCB2cDlfdXBkYXRlX3NoYXJwbmVzcyhzdHJ1Y3QgbG9vcF9maWx0ZXJfaW5mb19uICpsZmksCisJCQkJCWludCBzaGFycG5lc3NfbHZsKQoreworCWludCBsdmw7CisJLypGb3IgZWFjaCBwb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIGxvb3AgZmlsdGVyIGZpbGwgb3V0IGxpbWl0cyovCisJZm9yIChsdmwgPSAwOyBsdmwgPD0gTUFYX0xPT1BfRklMVEVSOyBsdmwrKykgeworCQkvKlNldCBsb29wIGZpbHRlciBwYXJhbWV0ZXJzIHRoYXQgY29udHJvbCBzaGFycG5lc3MuKi8KKwkJaW50IGJsb2NrX2luc2lkZV9saW1pdCA9IGx2bCA+PiAoKHNoYXJwbmVzc19sdmwgPiAwKSArCisJCQkJCShzaGFycG5lc3NfbHZsID4gNCkpOworCisJCWlmIChzaGFycG5lc3NfbHZsID4gMCkgeworCQkJaWYgKGJsb2NrX2luc2lkZV9saW1pdCA+ICg5IC0gc2hhcnBuZXNzX2x2bCkpCisJCQkJYmxvY2tfaW5zaWRlX2xpbWl0ID0gKDkgLSBzaGFycG5lc3NfbHZsKTsKKwkJfQorCisJCWlmIChibG9ja19pbnNpZGVfbGltaXQgPCAxKQorCQkJYmxvY2tfaW5zaWRlX2xpbWl0ID0gMTsKKworCQlsZmktPmxmdGhyW2x2bF0ubGltID0gKHVpbnQ4X3QpYmxvY2tfaW5zaWRlX2xpbWl0OworCQlsZmktPmxmdGhyW2x2bF0ubWJsaW0gPSAodWludDhfdCkoMiAqIChsdmwgKyAyKSArCisJCQkJYmxvY2tfaW5zaWRlX2xpbWl0KTsKKwl9Cit9CisKKy8qaW5zdGFudGlhdGUgdGhpcyBmdW5jdGlvbiBvbmNlIHdoZW4gZGVjb2RlIGlzIHN0YXJ0ZWQqLwordm9pZCB2cDlfbG9vcF9maWx0ZXJfaW5pdChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJc3RydWN0IGxvb3BfZmlsdGVyX2luZm9fbiAqbGZpID0gcGJpLT5sZmk7CisJc3RydWN0IGxvb3BmaWx0ZXIgKmxmID0gcGJpLT5sZjsKKwlzdHJ1Y3Qgc2VnbWVudGF0aW9uICpzZWdfNGxmID0gcGJpLT5zZWdfNGxmOworCWludCBpOworCXVuc2lnbmVkIGludCBkYXRhMzI7CisKKwltZW1zZXQobGZpLCAwLCBzaXplb2Yoc3RydWN0IGxvb3BfZmlsdGVyX2luZm9fbikpOworCW1lbXNldChsZiwgMCwgc2l6ZW9mKHN0cnVjdCBsb29wZmlsdGVyKSk7CisJbWVtc2V0KHNlZ180bGYsIDAsIHNpemVvZihzdHJ1Y3Qgc2VnbWVudGF0aW9uKSk7CisJbGYtPnNoYXJwbmVzc19sZXZlbCA9IDA7IC8qaW5pdCB0byAwICovCisJLyppbml0IGxpbWl0cyBmb3IgZ2l2ZW4gc2hhcnBuZXNzKi8KKwl2cDlfdXBkYXRlX3NoYXJwbmVzcyhsZmksIGxmLT5zaGFycG5lc3NfbGV2ZWwpOworCWxmLT5sYXN0X3NoYXJwbmVzc19sZXZlbCA9IGxmLT5zaGFycG5lc3NfbGV2ZWw7CisJLyppbml0IGhldiB0aHJlc2hvbGQgY29uc3QgdmVjdG9ycyAoYWN0dWFsbHkgbm8gdXNlKQorCSAqZm9yIChpID0gMDsgaSA8PSBNQVhfTE9PUF9GSUxURVI7IGkrKykKKwkgKglsZmktPmxmdGhyW2ldLmhldl90aHIgPSAodWludDhfdCkoaSA+PiA0KTsKKwkgKi8KKworCS8qV3JpdGUgdG8gcmVnaXN0ZXIqLworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCXVuc2lnbmVkIGludCB0aHI7CisKKwkJdGhyID0gKChsZmktPmxmdGhyW2kgKiAyICsgMV0ubGltICYgMHgzZik8PDgpIHwKKwkJCShsZmktPmxmdGhyW2kgKiAyICsgMV0ubWJsaW0gJiAweGZmKTsKKwkJdGhyID0gKHRocjw8MTYpIHwgKChsZmktPmxmdGhyW2kqMl0ubGltICYgMHgzZik8PDgpIHwKKwkJCShsZmktPmxmdGhyW2kgKiAyXS5tYmxpbSAmIDB4ZmYpOworCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkc5LCB0aHIpOworCX0KKworCS8qdmlkZW8gZm9ybWF0IGlzIFZQOSovCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKSB7CisJCWRhdGEzMiA9ICgweDMgPDwgMTQpIHwgLy8gKGR3IGZpZm8gdGhyZXMgciBhbmQgYikKKwkJKDB4MyA8PCAxMikgfCAvLyAoZHcgZmlmbyB0aHJlcyByIG9yIGIpCisJCSgweDMgPDwgMTApIHwgLy8gKGR3IGZpZm8gdGhyZXMgbm90IHIvYikKKwkJKDB4MyA8PCA4KSB8IC8vIDFzdC8ybmQgd3JpdGUgYm90aCBlbmFibGUKKwkJKDB4MSA8PCAwKTsgLy8gdnA5IHZpZGVvIGZvcm1hdAorCQlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKHBiaSkgPT0gMHgxMCkKKwkJCSBkYXRhMzIgJj0gKH4weDEwMCk7CisJfSBlbHNlIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpIHsKKwkJZGF0YTMyID0gKDB4NTcgPDwgOCkgfCAgLyoxc3QvMm5kIHdyaXRlIGJvdGggZW5hYmxlKi8KKwkJCSgweDEgIDw8IDApOyAvKnZwOSB2aWRlbyBmb3JtYXQqLworCQlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKHBiaSkgPT0gMHgxMCkKKwkJCSBkYXRhMzIgJj0gKH4weDEwMCk7CisJfSBlbHNlCisJCWRhdGEzMiA9IDB4NDA0MDAwMDE7CisKKwlXUklURV9WUkVHKEhFVkNfREJMS19DRkdCLCBkYXRhMzIpOworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19CVUZNR1JfTU9SRSkKKwkJcHJfaW5mbygiW0RCTEsgREVCVUddIENGR0IgOiAweCV4XG4iLCBkYXRhMzIpOworfQorCS8qIHBlcmZvcm0gdGhpcyBmdW5jdGlvbiBwZXIgZnJhbWUqLwordm9pZCB2cDlfbG9vcF9maWx0ZXJfZnJhbWVfaW5pdChzdHJ1Y3Qgc2VnbWVudGF0aW9uICpzZWcsCisJCXN0cnVjdCBsb29wX2ZpbHRlcl9pbmZvX24gKmxmaSwgc3RydWN0IGxvb3BmaWx0ZXIgKmxmLAorCQlpbnQgZGVmYXVsdF9maWx0X2x2bCkgeworCWludCBpOworCWludCBzZWdfaWQ7CisJLypuX3NoaWZ0IGlzIHRoZSBtdWx0aXBsaWVyIGZvciBsZl9kZWx0YXMKKwkgKnRoZSBtdWx0aXBsaWVyIGlzIDEgZm9yIHdoZW4gZmlsdGVyX2x2bCBpcyBiZXR3ZWVuIDAgYW5kIDMxOworCSAqMiB3aGVuIGZpbHRlcl9sdmwgaXMgYmV0d2VlbiAzMiBhbmQgNjMKKwkgKi8KKwljb25zdCBpbnQgc2NhbGUgPSAxIDw8IChkZWZhdWx0X2ZpbHRfbHZsID4+IDUpOworCisJLyp1cGRhdGUgbGltaXRzIGlmIHNoYXJwbmVzcyBoYXMgY2hhbmdlZCovCisJaWYgKGxmLT5sYXN0X3NoYXJwbmVzc19sZXZlbCAhPSBsZi0+c2hhcnBuZXNzX2xldmVsKSB7CisJCXZwOV91cGRhdGVfc2hhcnBuZXNzKGxmaSwgbGYtPnNoYXJwbmVzc19sZXZlbCk7CisJCWxmLT5sYXN0X3NoYXJwbmVzc19sZXZlbCA9IGxmLT5zaGFycG5lc3NfbGV2ZWw7CisKKwkvKldyaXRlIHRvIHJlZ2lzdGVyKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgdGhyOworCisJCXRociA9ICgobGZpLT5sZnRocltpICogMiArIDFdLmxpbSAmIDB4M2YpIDw8IDgpCisJCQl8IChsZmktPmxmdGhyW2kgKiAyICsgMV0ubWJsaW0gJiAweGZmKTsKKwkJdGhyID0gKHRociA8PCAxNikgfCAoKGxmaS0+bGZ0aHJbaSAqIDJdLmxpbSAmIDB4M2YpIDw8IDgpCisJCQl8IChsZmktPmxmdGhyW2kgKiAyXS5tYmxpbSAmIDB4ZmYpOworCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkc5LCB0aHIpOworCQl9CisJfQorCisJZm9yIChzZWdfaWQgPSAwOyBzZWdfaWQgPCBNQVhfU0VHTUVOVFM7IHNlZ19pZCsrKSB7LypNQVhfU0VHTUVOVFMgPSA4Ki8KKwkJaW50IGx2bF9zZWcgPSBkZWZhdWx0X2ZpbHRfbHZsOworCisJCWlmIChzZWdmZWF0dXJlX2FjdGl2ZShzZWcsIHNlZ19pZCwgU0VHX0xWTF9BTFRfTEYpKSB7CisJCQljb25zdCBpbnQgZGF0YSA9IGdldF9zZWdkYXRhKHNlZywgc2VnX2lkLAorCQkJCQkJU0VHX0xWTF9BTFRfTEYpOworCQkJbHZsX3NlZyA9IHZwOV9jbGFtcChzZWctPmFic19kZWx0YSA9PSBTRUdNRU5UX0FCU0RBVEEgPworCQkJCWRhdGEgOiBkZWZhdWx0X2ZpbHRfbHZsICsgZGF0YSwKKwkJCQkwLCBNQVhfTE9PUF9GSUxURVIpOworI2lmZGVmIERCR19MRl9QUklOVAorCXByX2luZm8oInNlZ2ZlYXR1cmVfYWN0aXZlISEhc2VnX2lkPSVkLGx2bF9zZWc9JWRcbiIsIHNlZ19pZCwgbHZsX3NlZyk7CisjZW5kaWYKKwl9CisKKwlpZiAoIWxmLT5tb2RlX3JlZl9kZWx0YV9lbmFibGVkKSB7CisJCS8qd2UgY291bGQgZ2V0IHJpZCBvZiB0aGlzIGlmIHdlIGFzc3VtZSB0aGF0IGRlbHRhcyBhcmUgc2V0IHRvCisJCSAqemVybyB3aGVuIG5vdCBpbiB1c2U7IGVuY29kZXIgYWx3YXlzIHVzZXMgZGVsdGFzCisJCSAqLworCQltZW1zZXQobGZpLT5sdmxbc2VnX2lkXSwgbHZsX3NlZywgc2l6ZW9mKGxmaS0+bHZsW3NlZ19pZF0pKTsKKwl9IGVsc2UgeworCQlpbnQgcmVmLCBtb2RlOworCQljb25zdCBpbnQgaW50cmFfbHZsID0gbHZsX3NlZyArCWxmLT5yZWZfZGVsdGFzW0lOVFJBX0ZSQU1FXQorCQkJCQkqIHNjYWxlOworI2lmZGVmIERCR19MRl9QUklOVAorCXByX2luZm8oIkxGX1BSSU5UOnZwOV9sb29wX2ZpbHRlcl9mcmFtZV9pbml0LHNlZ19pZD0lZFxuIiwgc2VnX2lkKTsKKwlwcl9pbmZvKCJyZWZfZGVsdGFzW0lOVFJBX0ZSQU1FXT0lZFxuIiwgbGYtPnJlZl9kZWx0YXNbSU5UUkFfRlJBTUVdKTsKKyNlbmRpZgorCQlsZmktPmx2bFtzZWdfaWRdW0lOVFJBX0ZSQU1FXVswXSA9CisJCQkJdnA5X2NsYW1wKGludHJhX2x2bCwgMCwgTUFYX0xPT1BfRklMVEVSKTsKKworCQlmb3IgKHJlZiA9IExBU1RfRlJBTUU7IHJlZiA8IE1BWF9SRUZfRlJBTUVTOyArK3JlZikgeworCQkJLyogTEFTVF9GUkFNRSA9IDEsIE1BWF9SRUZfRlJBTUVTID0gNCovCisJCQlmb3IgKG1vZGUgPSAwOyBtb2RlIDwgTUFYX01PREVfTEZfREVMVEFTOyArK21vZGUpIHsKKwkJCQkvKk1BWF9NT0RFX0xGX0RFTFRBUyA9IDIqLworCQkJCWNvbnN0IGludCBpbnRlcl9sdmwgPQorCQkJCQlsdmxfc2VnICsgbGYtPnJlZl9kZWx0YXNbcmVmXSAqIHNjYWxlCisJCQkJCSsgbGYtPm1vZGVfZGVsdGFzW21vZGVdICogc2NhbGU7CisjaWZkZWYgREJHX0xGX1BSSU5UCisjZW5kaWYKKwkJCQlsZmktPmx2bFtzZWdfaWRdW3JlZl1bbW9kZV0gPQorCQkJCQl2cDlfY2xhbXAoaW50ZXJfbHZsLCAwLAorCQkJCQlNQVhfTE9PUF9GSUxURVIpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworI2lmZGVmIERCR19MRl9QUklOVAorCS8qcHJpbnQgb3V0IHRoci9sdmwgdGFibGUgcGVyIGZyYW1lKi8KKwlmb3IgKGkgPSAwOyBpIDw9IE1BWF9MT09QX0ZJTFRFUjsgaSsrKSB7CisJCXByX2luZm8oIkxGX1BSSU5UOiglZCl0aHI9JWQsYmxpbT0lZCxsaW09JWRcbiIsCisJCQlpLCBsZmktPmxmdGhyW2ldLmhldl90aHIsIGxmaS0+bGZ0aHJbaV0ubWJsaW0sCisJCQlsZmktPmxmdGhyW2ldLmxpbSk7CisJfQorCWZvciAoc2VnX2lkID0gMDsgc2VnX2lkIDwgTUFYX1NFR01FTlRTOyBzZWdfaWQrKykgeworCQlwcl9pbmZvKCJMRl9QUklOVDpsdmwoc2VnX2lkPSVkKShtb2RlPTAsJWQsJWQsJWQsJWQpXG4iLAorCQkJc2VnX2lkLCBsZmktPmx2bFtzZWdfaWRdWzBdWzBdLAorCQkJbGZpLT5sdmxbc2VnX2lkXVsxXVswXSwgbGZpLT5sdmxbc2VnX2lkXVsyXVswXSwKKwkJCWxmaS0+bHZsW3NlZ19pZF1bM11bMF0pOworCQlwcl9pbmZvKCJpKG1vZGU9MSwlZCwlZCwlZCwlZClcbiIsIGxmaS0+bHZsW3NlZ19pZF1bMF1bMV0sCisJCQlsZmktPmx2bFtzZWdfaWRdWzFdWzFdLCBsZmktPmx2bFtzZWdfaWRdWzJdWzFdLAorCQkJbGZpLT5sdmxbc2VnX2lkXVszXVsxXSk7CisJfQorI2VuZGlmCisKKwkvKldyaXRlIHRvIHJlZ2lzdGVyICovCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJdW5zaWduZWQgaW50IGxldmVsOworCisJCWxldmVsID0gKChsZmktPmx2bFtpID4+IDFdWzNdW2kgJiAxXSAmIDB4M2YpIDw8IDI0KSB8CisJCQkoKGxmaS0+bHZsW2kgPj4gMV1bMl1baSAmIDFdICYgMHgzZikgPDwgMTYpIHwKKwkJCSgobGZpLT5sdmxbaSA+PiAxXVsxXVtpICYgMV0gJiAweDNmKSA8PCA4KSB8CisJCQkobGZpLT5sdmxbaSA+PiAxXVswXVtpICYgMV0gJiAweDNmKTsKKwkJaWYgKCFkZWZhdWx0X2ZpbHRfbHZsKQorCQkJbGV2ZWwgPSAwOworCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkdBLCBsZXZlbCk7CisJfQorfQorLyogVlA5X0xQRl9MVkxfVVBEQVRFICovCisjZW5kaWYKKworc3RhdGljIHZvaWQgdnA5X2luaXRfZGVjb2Rlcl9odyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksIHUzMiBtYXNrKQoreworCXVuc2lnbmVkIGludCBkYXRhMzI7CisJaW50IGk7CisJY29uc3QgdW5zaWduZWQgc2hvcnQgcGFyc2VyX2NtZFtQQVJTRVJfQ01EX05VTUJFUl0gPSB7CisJCTB4MDQwMSwgMHg4NDAxLCAweDA4MDAsIDB4MDQwMiwgMHg5MDAyLCAweDE0MjMsCisJCTB4OENDMywgMHgxNDIzLCAweDg4MDQsIDB4OTgyNSwgMHgwODAwLCAweDA0RkUsCisJCTB4ODQwNiwgMHg4NDExLCAweDE4MDAsIDB4ODQwOCwgMHg4NDA5LCAweDhDMkEsCisJCTB4OUMyQiwgMHgxQzAwLCAweDg0MEYsIDB4ODQwNywgMHg4MDAwLCAweDg0MDgsCisJCTB4MjAwMCwgMHhBODAwLCAweDg0MTAsIDB4MDRERSwgMHg4NDBDLCAweDg0MEQsCisJCTB4QUMwMCwgMHhBMDAwLCAweDA4QzAsIDB4MDhFMCwgMHhBNDBFLCAweEZDMDAsCisJCTB4N0MwMAorCX07CisjaWYgMAorCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpIHsKKwkJLyogU2V0IE1DUiBmZXRjaCBwcmlvcml0aWVzKi8KKwkJZGF0YTMyID0gMHgxIHwgKDB4MSA8PCAyKSB8ICgweDEgPDwzKSB8CisJCQkoMjQgPDwgNCkgfCAoMzIgPDwgMTEpIHwgKDI0IDw8IDE4KSB8ICgzMiA8PCAyNSk7CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9BWElVUkdfQ1RMLCBkYXRhMzIpOworCX0KKyNlbmRpZgorCS8qaWYgKGRlYnVnICYgVlA5X0RFQlVHX0JVRk1HUl9NT1JFKQorCQlwcl9pbmZvKCIlc1xuIiwgX19mdW5jX18pOyovCisJaWYgKG1hc2sgJiBIV19NQVNLX0ZST05UKSB7CisJCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BBUlNFUl9JTlRfQ09OVFJPTCk7CisjaWYgMQorCQkvKiBzZXQgYml0IDMxfjI5IHRvIDMgaWYgSEVWQ19TVFJFQU1fRklGT19DVExbMjldIGlzIDEgKi8KKwkJZGF0YTMyICY9IH4oNyA8PCAyOSk7CisJCWRhdGEzMiB8PSAoMyA8PCAyOSk7CisjZW5kaWYKKwkJZGF0YTMyID0gZGF0YTMyIHwKKwkJKDEgPDwgMjQpIHwvKnN0cmVhbV9idWZmZXJfZW1wdHlfaW50X2FtcmlzY19lbmFibGUqLworCQkoMSA8PCAyMikgfC8qc3RyZWFtX2ZpZm9fZW1wdHlfaW50X2FtcmlzY19lbmFibGUqLworCQkoMSA8PCA3KSB8LypkZWNfZG9uZV9pbnRfY3B1X2VuYWJsZSovCisJCSgxIDw8IDQpIHwvKnN0YXJ0Y29kZV9mb3VuZF9pbnRfY3B1X2VuYWJsZSovCisJCSgwIDw8IDMpIHwvKnN0YXJ0Y29kZV9mb3VuZF9pbnRfYW1yaXNjX2VuYWJsZSovCisJCSgxIDw8IDApICAgIC8qcGFyc2VyX2ludF9lbmFibGUqLworCQk7CisjaWZkZWYgU1VQUE9SVF9GQl9ERUNPRElORworI2lmbmRlZiBGQl9ERUNPRElOR19URVNUX1NDSEVEVUxFCisJCS8qZmVkX2ZiX3NsaWNlX2RvbmVfaW50X2NwdV9lbmFibGUqLworCQlpZiAocGJpLT51c2VkX3N0YWdlX2J1Zl9udW0gPiAwKQorCQkJZGF0YTMyIHw9ICgxIDw8IDEwKTsKKyNlbmRpZgorI2VuZGlmCisJCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfSU5UX0NPTlRST0wsIGRhdGEzMik7CisKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9TVEFUVVMpOworCWRhdGEzMiA9IGRhdGEzMiB8CisJKDAgPDwgMSkgfC8qZW11bGF0aW9uX2NoZWNrX29mZiBWUDkKKwkJZG8gbm90IGhhdmUgZW11bGF0aW9uKi8KKwkoMSA8PCAwKS8qc3RhcnRjb2RlX2NoZWNrX29uKi8KKwk7CisJV1JJVEVfVlJFRyhIRVZDX1NISUZUX1NUQVRVUywgZGF0YTMyKTsKKwlXUklURV9WUkVHKEhFVkNfU0hJRlRfQ09OVFJPTCwKKwkoMCA8PCAxNCkgfCAvKmRpc2FibGVfc3RhcnRfY29kZV9wcm90ZWN0Ki8KKwkoMSA8PCAxMCkgfCAvKmxlbmd0aF96ZXJvX3N0YXJ0Y29kZV9lbiBmb3IgVlA5Ki8KKwkoMSA8PCA5KSB8IC8qbGVuZ3RoX3ZhbGlkX3N0YXJ0Y29kZV9lbiBmb3IgVlA5Ki8KKwkoMyA8PCA2KSB8IC8qc2Z0X3ZhbGlkX3dyX3Bvc2l0aW9uKi8KKwkoMiA8PCA0KSB8IC8qZW11bGF0ZV9jb2RlX2xlbmd0aF9zdWJfMSovCisJKDMgPDwgMSkgfCAvKnN0YXJ0X2NvZGVfbGVuZ3RoX3N1Yl8xCisJVlA5IHVzZSAweDAwMDAwMDAxIGFzIHN0YXJ0Y29kZSAoNCBCeXRlcykqLworCSgxIDw8IDApICAgLypzdHJlYW1fc2hpZnRfZW5hYmxlKi8KKwkpOworCisJV1JJVEVfVlJFRyhIRVZDX0NBQkFDX0NPTlRST0wsCisJCSgxIDw8IDApLypjYWJhY19lbmFibGUqLworCSk7CisKKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0NPUkVfQ09OVFJPTCwKKwkJKDEgPDwgMCkvKiBoZXZjX3BhcnNlcl9jb3JlX2Nsa19lbiovCisJKTsKKworCisJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCAwKTsKKworCX0KKworCWlmIChtYXNrICYgSFdfTUFTS19CQUNLKSB7CisJCS8qSW5pdGlhbCBJUUlUX1NDQUxFTFVUIG1lbW9yeQorCQktLSBqdXN0IHRvIGF2b2lkIFggaW4gc2ltdWxhdGlvbiovCisJCWlmIChpc19yZG1hX2VuYWJsZSgpKQorCQkJcmRtYV9iYWNrX2VuZF93b3JrKHBiaS0+cmRtYV9waHlfYWRyLCBSRE1BX1NJWkUpOworCQllbHNlIHsKKwkJCVdSSVRFX1ZSRUcoSEVWQ19JUUlUX1NDQUxFTFVUX1dSX0FERFIsIDApOy8qY2ZnX3BfYWRkciovCisJCQlmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorCQkJCVdSSVRFX1ZSRUcoSEVWQ19JUUlUX1NDQUxFTFVUX0RBVEEsIDApOworCQl9CisJfQorCisJaWYgKG1hc2sgJiBIV19NQVNLX0ZST05UKSB7CisJCXUzMiBkZWNvZGVfbW9kZTsKKyNpZmRlZiBFTkFCTEVfU1dBUF9URVNUCisJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9TV0FQX1RFU1QsIDEwMCk7CisjZWxzZQorCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fU1dBUF9URVNULCAwKTsKKyNlbmRpZgorI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwkJaWYgKCFwYmktPm1faW5zX2ZsYWcpIHsKKwkJCWlmIChwYmktPmxvd19sYXRlbmN5X2ZsYWcpCisJCQkJZGVjb2RlX21vZGUgPSBERUNPREVfTU9ERV9TSU5HTEVfTE9XX0xBVEVOQ1k7CisJCQllbHNlCisJCQkJZGVjb2RlX21vZGUgPSBERUNPREVfTU9ERV9TSU5HTEU7CisJCX0gZWxzZSBpZiAodmRlY19mcmFtZV9iYXNlZChod190b192ZGVjKHBiaSkpKQorCQkJZGVjb2RlX21vZGUgPSBwYmktPm5vX2hlYWQgPworCQkJCURFQ09ERV9NT0RFX01VTFRJX0ZSQU1FQkFTRV9OT0hFQUQgOgorCQkJCURFQ09ERV9NT0RFX01VTFRJX0ZSQU1FQkFTRTsKKwkJZWxzZQorCQkJZGVjb2RlX21vZGUgPSBERUNPREVfTU9ERV9NVUxUSV9TVFJFQU1CQVNFOworI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKKyNpZm5kZWYgRkJfREVDT0RJTkdfVEVTVF9TQ0hFRFVMRQorCQlpZiAocGJpLT51c2VkX3N0YWdlX2J1Zl9udW0gPiAwKQorCQkJZGVjb2RlX21vZGUgfD0gKDB4MDEgPDwgMjQpOworI2VuZGlmCisjZW5kaWYKKwkJV1JJVEVfVlJFRyhERUNPREVfTU9ERSwgZGVjb2RlX21vZGUpOworCQlXUklURV9WUkVHKEhFVkNfREVDT0RFX1NJWkUsIDApOworCQlXUklURV9WUkVHKEhFVkNfREVDT0RFX0NPVU5ULCAwKTsKKyNlbHNlCisJV1JJVEVfVlJFRyhERUNPREVfTU9ERSwgREVDT0RFX01PREVfU0lOR0xFKTsKKwlXUklURV9WUkVHKEhFVkNfREVDT0RFX1BJQ19CRUdJTl9SRUcsIDApOworCVdSSVRFX1ZSRUcoSEVWQ19ERUNPREVfUElDX05VTV9SRUcsIDB4N2ZmZmZmZmYpOyAvKnRvIHJlbW92ZSovCisjZW5kaWYKKwkvKlNlbmQgcGFyc2VyX2NtZCovCisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9DTURfV1JJVEUsICgxIDw8IDE2KSB8ICgwIDw8IDApKTsKKwlmb3IgKGkgPSAwOyBpIDwgUEFSU0VSX0NNRF9OVU1CRVI7IGkrKykKKwkJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9DTURfV1JJVEUsIHBhcnNlcl9jbWRbaV0pOworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfQ01EX1NLSVBfMCwgUEFSU0VSX0NNRF9TS0lQX0NGR18wKTsKKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0NNRF9TS0lQXzEsIFBBUlNFUl9DTURfU0tJUF9DRkdfMSk7CisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9DTURfU0tJUF8yLCBQQVJTRVJfQ01EX1NLSVBfQ0ZHXzIpOworCisKKwkJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9JRl9DT05UUk9MLAorCQkJLyogICgxIDw8IDgpIHwqLyAvKnNhb19zd19wcmVkX2VuYWJsZSovCisJCQkoMSA8PCA1KSB8IC8qcGFyc2VyX3Nhb19pZl9lbiovCisJCQkoMSA8PCAyKSB8IC8qcGFyc2VyX21wcmVkX2lmX2VuKi8KKwkJCSgxIDw8IDApIC8qcGFyc2VyX3NjYWxlcl9pZl9lbiovCisJCSk7CisJfQorCisJaWYgKG1hc2sgJiBIV19NQVNLX0JBQ0spIHsKKwkJLypDaGFuZ2VkIHRvIFN0YXJ0IE1QUkVEIGluIG1pY3JvY29kZSovCisJCS8qCisJCXByX2luZm8oIlt0ZXN0LmNdIFN0YXJ0IE1QUkVEXG4iKTsKKwkJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0lOVF9TVEFUVVMsCisJCSgxPDwzMSkKKwkJKTsKKwkJKi8KKwkJV1JJVEVfVlJFRyhIRVZDRF9JUFBfVE9QX0NOVEwsCisJCQkoMCA8PCAxKSB8IC8qZW5hYmxlIGlwcCovCisJCQkoMSA8PCAwKSAgIC8qc29mdHdhcmUgcmVzZXQgaXBwIGFuZCBtcHAqLworCQkpOworCQlXUklURV9WUkVHKEhFVkNEX0lQUF9UT1BfQ05UTCwKKwkJCSgxIDw8IDEpIHwgLyplbmFibGUgaXBwKi8KKwkJCSgwIDw8IDApICAgLypzb2Z0d2FyZSByZXNldCBpcHAgYW5kIG1wcCovCisJCSk7CisJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShwYmkpICYgMHgxMCkgeworCQkvKkVuYWJsZSBOVjIxIHJlZmVyZW5jZSByZWFkIG1vZGUgZm9yIE1DKi8KKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDEsIDB4MSA8PCAzMSk7CisJfQorCisJCS8qSW5pdGlhbGl6ZSBtY3JjYyBhbmQgZGVjb21wIHBlcmYgY291bnRlcnMqLworCQlpZiAobWNyY2NfY2FjaGVfYWxnX2ZsYWcgJiYKKwkJCXBiaS0+aW5pdF9mbGFnID09IDApIHsKKwkJCW1jcmNjX3BlcmZjb3VudF9yZXNldCgpOworCQkJZGVjb21wX3BlcmZjb3VudF9yZXNldCgpOworCQl9CisJfQorCXJldHVybjsKK30KKworCisjaWZkZWYgQ09ORklHX0hFVkNfQ0xLX0ZPUkNFRF9PTgorc3RhdGljIHZvaWQgY29uZmlnX3ZwOV9jbGtfZm9yY2VkX29uKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHJkYXRhMzI7CisJLypJUUlUKi8KKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfSVFJVF9DTEtfUlNUX0NUUkwpOworCVdSSVRFX1ZSRUcoSEVWQ19JUUlUX0NMS19SU1RfQ1RSTCwgcmRhdGEzMiB8ICgweDEgPDwgMikpOworCisJLyogREJMSyovCisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX0RCTEtfQ0ZHMCk7CisJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHMCwgcmRhdGEzMiB8ICgweDEgPDwgMikpOworCisJLyogU0FPKi8KKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkwxKTsKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkwxLCByZGF0YTMyIHwgKDB4MSA8PCAyKSk7CisKKwkvKk1QUkVEKi8KKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfTVBSRURfQ1RSTDEpOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9DVFJMMSwgcmRhdGEzMiB8ICgweDEgPDwgMjQpKTsKKworCS8qIFBBUlNFUiovCisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NUUkVBTV9DT05UUk9MKTsKKwlXUklURV9WUkVHKEhFVkNfU1RSRUFNX0NPTlRST0wsIHJkYXRhMzIgfCAoMHgxIDw8IDE1KSk7CisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NISUZUX0NPTlRST0wpOworCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9DT05UUk9MLCByZGF0YTMyIHwgKDB4MSA8PCAxNSkpOworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19DQUJBQ19DT05UUk9MKTsKKwlXUklURV9WUkVHKEhFVkNfQ0FCQUNfQ09OVFJPTCwgcmRhdGEzMiB8ICgweDEgPDwgMTMpKTsKKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0NPUkVfQ09OVFJPTCk7CisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9DT1JFX0NPTlRST0wsIHJkYXRhMzIgfCAoMHgxIDw8IDE1KSk7CisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BBUlNFUl9JTlRfQ09OVFJPTCk7CisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9JTlRfQ09OVFJPTCwgcmRhdGEzMiB8ICgweDEgPDwgMTUpKTsKKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0lGX0NPTlRST0wpOworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfSUZfQ09OVFJPTCwKKwkJCXJkYXRhMzIgfCAoMHgxIDw8IDYpIHwgKDB4MSA8PCAzKSB8ICgweDEgPDwgMSkpOworCisJLypJUFAqLworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ0RfSVBQX0RZTkNMS0dBVEVfQ09ORklHKTsKKwlXUklURV9WUkVHKEhFVkNEX0lQUF9EWU5DTEtHQVRFX0NPTkZJRywgcmRhdGEzMiB8IDB4ZmZmZmZmZmYpOworCisJLyogTUNSQ0MqLworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMSk7CisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwxLCByZGF0YTMyIHwgKDB4MSA8PCAzKSk7Cit9CisjZW5kaWYKKworCisjaWZkZWYgTUNSQ0NfRU5BQkxFCitzdGF0aWMgdm9pZCBkdW1wX2hpdF9yYXRlKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEVfSElUX1JBVEUpIHsKKwkJbWNyY2NfZ2V0X2hpdHJhdGUocGJpLT5tX2luc19mbGFnKTsKKwkJZGVjb21wX2dldF9oaXRyYXRlKCk7CisJCWRlY29tcF9nZXRfY29tcHJhdGUoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkICBjb25maWdfbWNyY2NfYXhpX2h3KHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwl1bnNpZ25lZCBpbnQgcmRhdGEzMjsKKwl1bnNpZ25lZCBzaG9ydCBpc19pbnRlcjsKKwkvKnByX2luZm8oIkVudGVyZWQgY29uZmlnX21jcmNjX2F4aV9ody4uLlxuIik7Ki8KKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDEsIDB4Mik7LyogcmVzZXQgbWNyY2MqLworCWlzX2ludGVyID0gKChwYmktPmNvbW1vbi5mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkgJiYKKwkJCSghcGJpLT5jb21tb24uaW50cmFfb25seSkpID8gMSA6IDA7CisJaWYgKCFpc19pbnRlcikgeyAvKiBJLVBJQyovCisJCS8qcmVtb3ZlIHJlc2V0IC0tIGRpc2FibGVzIGNsb2NrKi8KKwkJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwxLCAweDApOworCQlyZXR1cm47CisJfQorCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKSB7CisJCW1jcmNjX2dldF9oaXRyYXRlKHBiaS0+bV9pbnNfZmxhZyk7CisJCWRlY29tcF9nZXRfaGl0cmF0ZSgpOworCQlkZWNvbXBfZ2V0X2NvbXByYXRlKCk7CisJfQorCisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwKKwkJCSgwIDw8IDgpIHwgKDEgPDwgMSkgfCAwKTsKKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUik7CisJcmRhdGEzMiA9IHJkYXRhMzIgJiAweGZmZmY7CisJcmRhdGEzMiA9IHJkYXRhMzIgfCAocmRhdGEzMiA8PCAxNik7CisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwyLCByZGF0YTMyKTsKKwkvKlByb2dyYW1tZSBjYW52YXMxICovCisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIpOworCXJkYXRhMzIgPSByZGF0YTMyICYgMHhmZmZmOworCXJkYXRhMzIgPSByZGF0YTMyIHwgKHJkYXRhMzIgPDwgMTYpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMywgcmRhdGEzMik7CisJLyplbmFibGUgbWNyY2MgcHJvZ3Jlc3NpdmUtbW9kZSovCisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwxLCAweGZmMCk7Cit9CisKK3N0YXRpYyB2b2lkICBjb25maWdfbWNyY2NfYXhpX2h3X25ldyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJdTMyIGN1cnJfcGljbnVtID0gLTE7CisJdTMyIGxhc3RyZWZfcGljbnVtID0gLTE7CisJdTMyIGdvbGRlbnJlZl9waWNudW0gPSAtMTsKKwl1MzIgYWx0cmVmX3BpY251bSA9IC0xOworCisJdTMyIGxhc3RyZWZfZGVsdGFfcGljbnVtOworCXUzMiBnb2xkZW5yZWZfZGVsdGFfcGljbnVtOworCXUzMiBhbHRyZWZfZGVsdGFfcGljbnVtOworCisJdTMyIHJkYXRhMzI7CisKKwl1MzIgbGFzdGNhbnZhczsKKwl1MzIgZ29sZGVuY2FudmFzOworCXUzMiBhbHRyZWZjYW52YXM7CisKKwl1MTYgaXNfaW50ZXI7CisJdTE2IGxhc3RyZWZfaW5yZWY7CisJdTE2IGdvbGRlbnJlZl9pbnJlZjsKKwl1MTYgYWx0cmVmX2lucmVmOworCisJdTMyIHJlZmNhbnZhc19hcnJheVszXSwgdXRtcDsKKwlpbnQgZGVsdGFwaWNudW1fYXJyYXlbM10sIHRtcDsKKworCXN0cnVjdCBWUDlfQ29tbW9uX3MgKmNtID0gJnBiaS0+Y29tbW9uOworCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpjdXJfcGljX2NvbmZpZworCQk9ICZjbS0+Y3VyX2ZyYW1lLT5idWY7CisJY3Vycl9waWNudW0gPSBjdXJfcGljX2NvbmZpZy0+ZGVjb2RlX2lkeDsKKwlpZiAoY20tPmZyYW1lX3JlZnNbMF0uYnVmKQorCQlsYXN0cmVmX3BpY251bSA9IGNtLT5mcmFtZV9yZWZzWzBdLmJ1Zi0+ZGVjb2RlX2lkeDsKKwlpZiAoY20tPmZyYW1lX3JlZnNbMV0uYnVmKQorCQlnb2xkZW5yZWZfcGljbnVtID0gY20tPmZyYW1lX3JlZnNbMV0uYnVmLT5kZWNvZGVfaWR4OworCWlmIChjbS0+ZnJhbWVfcmVmc1syXS5idWYpCisJCWFsdHJlZl9waWNudW0gPSBjbS0+ZnJhbWVfcmVmc1syXS5idWYtPmRlY29kZV9pZHg7CisKKwlsYXN0cmVmX2RlbHRhX3BpY251bSA9IChsYXN0cmVmX3BpY251bSA+PSBjdXJyX3BpY251bSkgPworCQkobGFzdHJlZl9waWNudW0gLSBjdXJyX3BpY251bSkgOiAoY3Vycl9waWNudW0gLSBsYXN0cmVmX3BpY251bSk7CisJZ29sZGVucmVmX2RlbHRhX3BpY251bSA9IChnb2xkZW5yZWZfcGljbnVtID49IGN1cnJfcGljbnVtKSA/CisJCShnb2xkZW5yZWZfcGljbnVtIC0gY3Vycl9waWNudW0pIDoKKwkJKGN1cnJfcGljbnVtIC0gZ29sZGVucmVmX3BpY251bSk7CisJYWx0cmVmX2RlbHRhX3BpY251bSA9CisJCShhbHRyZWZfcGljbnVtID49IGN1cnJfcGljbnVtKSA/CisJCShhbHRyZWZfcGljbnVtIC0gY3Vycl9waWNudW0pIDogKGN1cnJfcGljbnVtIC0gYWx0cmVmX3BpY251bSk7CisKKwlsYXN0cmVmX2lucmVmID0gKGNtLT5mcmFtZV9yZWZzWzBdLmlkeCAhPSBJTlZBTElEX0lEWCkgPyAxIDogMDsKKwlnb2xkZW5yZWZfaW5yZWYgPSAoY20tPmZyYW1lX3JlZnNbMV0uaWR4ICE9IElOVkFMSURfSURYKSA/IDEgOiAwOworCWFsdHJlZl9pbnJlZiA9IChjbS0+ZnJhbWVfcmVmc1syXS5pZHggIT0gSU5WQUxJRF9JRFgpID8gMSA6IDA7CisKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEUpCisJCXByX2luZm8oIiVzLS0wLS1sYXN0cmVmX2lucmVmOiVkIGdvbGRlbnJlZl9pbnJlZjolZCBhbHRyZWZfaW5yZWY6JWRcbiIsCisJCQlfX2Z1bmNfXywgbGFzdHJlZl9pbnJlZiwgZ29sZGVucmVmX2lucmVmLCBhbHRyZWZfaW5yZWYpOworCisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwxLCAweDIpOyAvKiByZXNldCBtY3JjYyAqLworCisJaXNfaW50ZXIgPSAoKHBiaS0+Y29tbW9uLmZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKQorCQkmJiAoIXBiaS0+Y29tbW9uLmludHJhX29ubHkpKSA/IDEgOiAwOworCisJaWYgKCFpc19pbnRlcikgeyAvKiBJLVBJQyAqLworCQkvKiByZW1vdmUgcmVzZXQgLS0gZGlzYWJsZXMgY2xvY2sgKi8KKwkJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwxLCAweDApOworCQlyZXR1cm47CisJfQorCisJaWYgKCFwYmktPm1faW5zX2ZsYWcpCisJCWR1bXBfaGl0X3JhdGUocGJpKTsKKworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfQUNDQ09ORklHX0FERFIsICgwIDw8IDgpIHwgKDE8PDEpIHwgMCk7CisJbGFzdGNhbnZhcyA9IFJFQURfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIpOworCWdvbGRlbmNhbnZhcyA9IFJFQURfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIpOworCWFsdHJlZmNhbnZhcyA9IFJFQURfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIpOworCisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0NBQ0hFKQorCQlwcl9pbmZvKCJbdGVzdC5jXSBsYXN0cmVmX2NhbnY6JXggZ29sZGVucmVmX2NhbnY6JXggYWx0cmVmX2NhbnY6JXhcbiIsCisJCQlsYXN0Y2FudmFzLCBnb2xkZW5jYW52YXMsIGFsdHJlZmNhbnZhcyk7CisKKwlhbHRyZWZfaW5yZWYgPSAoKGFsdHJlZl9pbnJlZiA9PSAxKSAmJgorCQkJKGFsdHJlZmNhbnZhcyAhPSAoZ29sZGVucmVmX2lucmVmCisJCQk/IGdvbGRlbmNhbnZhcyA6IDB4ZmZmZmZmZmYpKSAmJgorCQkJKGFsdHJlZmNhbnZhcyAhPSAobGFzdHJlZl9pbnJlZiA/CisJCQlsYXN0Y2FudmFzIDogMHhmZmZmZmZmZikpKSA/IDEgOiAwOworCWdvbGRlbnJlZl9pbnJlZiA9ICgoZ29sZGVucmVmX2lucmVmID09IDEpICYmCisJCShnb2xkZW5jYW52YXMgIT0gKGxhc3RyZWZfaW5yZWYgPworCQlsYXN0Y2FudmFzIDogMHhmZmZmZmZmZikpKSA/IDEgOiAwOworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19DQUNIRSkKKwkJcHJfaW5mbygiW3Rlc3QuY10tLTEtLWxhc3RyZWZfaW5yZWY6JWQgZ29sZGVucmVmX2lucmVmOiVkIGFsdHJlZl9pbnJlZjolZFxuIiwKKwkJCWxhc3RyZWZfaW5yZWYsIGdvbGRlbnJlZl9pbnJlZiwgYWx0cmVmX2lucmVmKTsKKworCWFsdHJlZl9kZWx0YV9waWNudW0gPSBhbHRyZWZfaW5yZWYgPyBhbHRyZWZfZGVsdGFfcGljbnVtIDogMHg3ZmZmZmZmZjsKKwlnb2xkZW5yZWZfZGVsdGFfcGljbnVtID0gZ29sZGVucmVmX2lucmVmID8KKwkJZ29sZGVucmVmX2RlbHRhX3BpY251bSA6IDB4N2ZmZmZmZmY7CisJbGFzdHJlZl9kZWx0YV9waWNudW0gPSBsYXN0cmVmX2lucmVmID8KKwkJbGFzdHJlZl9kZWx0YV9waWNudW0gOiAweDdmZmZmZmZmOworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19DQUNIRSkKKwkJcHJfaW5mbygiW3Rlc3QuY10tLTEtLWxhc3RyZWZfZGVsdGFfcGljbnVtOiVkIGdvbGRlbnJlZl9kZWx0YV9waWNudW06JWQgYWx0cmVmX2RlbHRhX3BpY251bTolZFxuIiwKKwkJCWxhc3RyZWZfZGVsdGFfcGljbnVtLCBnb2xkZW5yZWZfZGVsdGFfcGljbnVtLAorCQkJYWx0cmVmX2RlbHRhX3BpY251bSk7CisJLypBUlJBWSBTT1JUIEhFUkUgREVMVEEvQ0FOVkFTIEFSUkFZIFNPUlQgLS0gdXNlIERFTFRBKi8KKworCXJlZmNhbnZhc19hcnJheVswXSA9IGxhc3RjYW52YXM7CisJcmVmY2FudmFzX2FycmF5WzFdID0gZ29sZGVuY2FudmFzOworCXJlZmNhbnZhc19hcnJheVsyXSA9IGFsdHJlZmNhbnZhczsKKworCWRlbHRhcGljbnVtX2FycmF5WzBdID0gbGFzdHJlZl9kZWx0YV9waWNudW07CisJZGVsdGFwaWNudW1fYXJyYXlbMV0gPSBnb2xkZW5yZWZfZGVsdGFfcGljbnVtOworCWRlbHRhcGljbnVtX2FycmF5WzJdID0gYWx0cmVmX2RlbHRhX3BpY251bTsKKworCS8qIHNvcnQwIDogMi10by0xICovCisJaWYgKGRlbHRhcGljbnVtX2FycmF5WzJdIDwgZGVsdGFwaWNudW1fYXJyYXlbMV0pIHsKKwkJdXRtcCA9IHJlZmNhbnZhc19hcnJheVsyXTsKKwkJcmVmY2FudmFzX2FycmF5WzJdID0gcmVmY2FudmFzX2FycmF5WzFdOworCQlyZWZjYW52YXNfYXJyYXlbMV0gPSB1dG1wOworCQl0bXAgPSBkZWx0YXBpY251bV9hcnJheVsyXTsKKwkJZGVsdGFwaWNudW1fYXJyYXlbMl0gPSBkZWx0YXBpY251bV9hcnJheVsxXTsKKwkJZGVsdGFwaWNudW1fYXJyYXlbMV0gPSB0bXA7CisJfQorCS8qIHNvcnQxIDogMS10by0wICovCisJaWYgKGRlbHRhcGljbnVtX2FycmF5WzFdIDwgZGVsdGFwaWNudW1fYXJyYXlbMF0pIHsKKwkJdXRtcCA9IHJlZmNhbnZhc19hcnJheVsxXTsKKwkJcmVmY2FudmFzX2FycmF5WzFdID0gcmVmY2FudmFzX2FycmF5WzBdOworCQlyZWZjYW52YXNfYXJyYXlbMF0gPSB1dG1wOworCQl0bXAgPSBkZWx0YXBpY251bV9hcnJheVsxXTsKKwkJZGVsdGFwaWNudW1fYXJyYXlbMV0gPSBkZWx0YXBpY251bV9hcnJheVswXTsKKwkJZGVsdGFwaWNudW1fYXJyYXlbMF0gPSB0bXA7CisJfQorCS8qIHNvcnQyIDogMi10by0xICovCisJaWYgKGRlbHRhcGljbnVtX2FycmF5WzJdIDwgZGVsdGFwaWNudW1fYXJyYXlbMV0pIHsKKwkJdXRtcCA9IHJlZmNhbnZhc19hcnJheVsyXTsgIHJlZmNhbnZhc19hcnJheVsyXSA9CisJCQlyZWZjYW52YXNfYXJyYXlbMV07IHJlZmNhbnZhc19hcnJheVsxXSA9ICB1dG1wOworCQl0bXAgID0gZGVsdGFwaWNudW1fYXJyYXlbMl07IGRlbHRhcGljbnVtX2FycmF5WzJdID0KKwkJCWRlbHRhcGljbnVtX2FycmF5WzFdOyBkZWx0YXBpY251bV9hcnJheVsxXSA9IHRtcDsKKwl9CisJaWYgKG1jcmNjX2NhY2hlX2FsZ19mbGFnID09CisJCVRIT0RJWUlMX01DUkNDX0NBTlZBU19BTEdYKSB7IC8qMDkvMTUvMjAxNyovCisJCS8qIGxvd2VzdCBkZWx0YV9waWNudW0gKi8KKwkJcmRhdGEzMiA9IHJlZmNhbnZhc19hcnJheVswXTsKKwkJcmRhdGEzMiA9IHJkYXRhMzIgJiAweGZmZmY7CisJCXJkYXRhMzIgPSByZGF0YTMyIHwgKHJkYXRhMzIgPDwgMTYpOworCQlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDIsIHJkYXRhMzIpOworCisJCS8qIDJuZC1sb3dlc3QgZGVsdGFfcGljbnVtICovCisJCXJkYXRhMzIgPSByZWZjYW52YXNfYXJyYXlbMV07CisJCXJkYXRhMzIgPSByZGF0YTMyICYgMHhmZmZmOworCQlyZGF0YTMyID0gcmRhdGEzMiB8IChyZGF0YTMyIDw8IDE2KTsKKwkJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwzLCByZGF0YTMyKTsKKwl9IGVsc2UgeworCQkvKiBwcmV2aW91cyB2ZXJzaW9uIC0tIExBU1QvR09MREVOIEFMV0FZUyAtLSBiZWZvcmUgMDkvMTMvMjAxNyovCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfQUNDQ09ORklHX0FERFIsCisJCQkoMCA8PCA4KSB8ICgxPDwxKSB8IDApOworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUik7CisJCXJkYXRhMzIgPSByZGF0YTMyICYgMHhmZmZmOworCQlyZGF0YTMyID0gcmRhdGEzMiB8IChyZGF0YTMyIDw8IDE2KTsKKwkJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwyLCByZGF0YTMyKTsKKworCQkvKiBQcm9ncmFtbWUgY2FudmFzMSAqLworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUik7CisJCXJkYXRhMzIgPSByZGF0YTMyICYgMHhmZmZmOworCQlyZGF0YTMyID0gcmRhdGEzMiB8IChyZGF0YTMyIDw8IDE2KTsKKwkJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwzLCByZGF0YTMyKTsKKwl9CisKKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDEsIDB4ZmYwKTsgLyogZW5hYmxlIG1jcmNjIHByb2dyZXNzaXZlLW1vZGUgKi8KKwlyZXR1cm47Cit9CisKKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkIGZyZWVfbGZfYnVmKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlpZiAocGJpLT5sZmkpCisJCXZmcmVlKHBiaS0+bGZpKTsKKwlpZiAocGJpLT5sZikKKwkJdmZyZWUocGJpLT5sZik7CisJaWYgKHBiaS0+c2VnXzRsZikKKwkJdmZyZWUocGJpLT5zZWdfNGxmKTsKKwlwYmktPmxmaSA9IE5VTEw7CisJcGJpLT5sZiA9IE5VTEw7CisJcGJpLT5zZWdfNGxmID0gTlVMTDsKK30KKworc3RhdGljIGludCBhbGxvY19sZl9idWYoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCXBiaS0+bGZpID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IGxvb3BfZmlsdGVyX2luZm9fbikpOworCXBiaS0+bGYgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgbG9vcGZpbHRlcikpOworCXBiaS0+c2VnXzRsZiA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZWdtZW50YXRpb24pKTsKKwlpZiAocGJpLT5sZmkgPT0gTlVMTCB8fCBwYmktPmxmID09IE5VTEwgfHwgcGJpLT5zZWdfNGxmID09IE5VTEwpIHsKKwkJZnJlZV9sZl9idWYocGJpKTsKKwkJcHJfZXJyKCJbdGVzdC5jXSB2cDlfbG9vcF9maWx0ZXIgaW5pdCBtYWxsb2MgZXJyb3IhISFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2cDlfbG9jYWxfdW5pbml0KHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlwYmktPnJwbV9wdHIgPSBOVUxMOworCXBiaS0+bG1lbV9wdHIgPSBOVUxMOworCWlmIChwYmktPnJwbV9hZGRyKSB7CisJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQkJUlBNX0JVRl9TSVpFLAorCQkJCQlwYmktPnJwbV9hZGRyLAorCQkJCQlwYmktPnJwbV9waHlfYWRkcik7CisJCXBiaS0+cnBtX2FkZHIgPSBOVUxMOworCX0KKwlpZiAocGJpLT5sbWVtX2FkZHIpIHsKKwkJaWYgKHBiaS0+bG1lbV9waHlfYWRkcikKKwkJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlMTUVNX0JVRl9TSVpFLCBwYmktPmxtZW1fYWRkciwKKwkJCQlwYmktPmxtZW1fcGh5X2FkZHIpOworCQlwYmktPmxtZW1fYWRkciA9IE5VTEw7CisJfQorCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKSAmJgorCQkodmRlY19zZWN1cmUoaHdfdG9fdmRlYyhwYmkpKSkpIHsKKwkJdGVlX3ZwOV9wcm9iX2ZyZWUoKHUzMilwYmktPnByb2JfYnVmZmVyX3BoeV9hZGRyKTsKKwkJcGJpLT5wcm9iX2J1ZmZlcl9waHlfYWRkciA9IDA7CisJCXBiaS0+Y291bnRfYnVmZmVyX3BoeV9hZGRyID0gMDsKKwkJcGJpLT5wcm9iX2J1ZmZlcl9hZGRyID0gTlVMTDsKKwkJcGJpLT5jb3VudF9idWZmZXJfYWRkciA9IE5VTEw7CisJfSBlbHNlIHsKKwkJaWYgKHBiaS0+cHJvYl9idWZmZXJfYWRkcikgeworCQkJaWYgKHBiaS0+cHJvYl9idWZmZXJfcGh5X2FkZHIpCisJCQkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCQlQUk9CX0JVRl9TSVpFLCBwYmktPnByb2JfYnVmZmVyX2FkZHIsCisJCQkJCXBiaS0+cHJvYl9idWZmZXJfcGh5X2FkZHIpOworCisJCQlwYmktPnByb2JfYnVmZmVyX2FkZHIgPSBOVUxMOworCQl9CisJCWlmIChwYmktPmNvdW50X2J1ZmZlcl9hZGRyKSB7CisJCQlpZiAocGJpLT5jb3VudF9idWZmZXJfcGh5X2FkZHIpCisJCQkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCQlDT1VOVF9CVUZfU0laRSwgcGJpLT5jb3VudF9idWZmZXJfYWRkciwKKwkJCQkJcGJpLT5jb3VudF9idWZmZXJfcGh5X2FkZHIpOworCisJCQlwYmktPmNvdW50X2J1ZmZlcl9hZGRyID0gTlVMTDsKKwkJfQorCX0KKwlpZiAocGJpLT5tbXVfZW5hYmxlKSB7CisJCXUzMiBtbXVfbWFwX3NpemUgPSB2dnA5X2ZyYW1lX21tdV9tYXBfc2l6ZShwYmkpOworCQlpZiAocGJpLT5mcmFtZV9tbXVfbWFwX2FkZHIpIHsKKwkJCWlmIChwYmktPmZyYW1lX21tdV9tYXBfcGh5X2FkZHIpCisJCQkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCQltbXVfbWFwX3NpemUsCisJCQkJCXBiaS0+ZnJhbWVfbW11X21hcF9hZGRyLAorCQkJCQlwYmktPmZyYW1lX21tdV9tYXBfcGh5X2FkZHIpOworCQkJcGJpLT5mcmFtZV9tbXVfbWFwX2FkZHIgPSBOVUxMOworCQl9CisJfQorCisjaWZkZWYgVlA5XzEwQl9NTVVfRFcKKwlpZiAocGJpLT5kd19tbXVfZW5hYmxlKSB7CisJCXUzMiBkd19tbXVfbWFwX3NpemUgPSB2dnA5X2ZyYW1lX21tdV9tYXBfc2l6ZShwYmkpOworCQlpZiAocGJpLT5mcmFtZV9tbXVfZHdfbWFwX2FkZHIpIHsKKwkJCWlmIChwYmktPmZyYW1lX21tdV9kd19tYXBfcGh5X2FkZHIpCisJCQkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCQlkd19tbXVfbWFwX3NpemUsCisJCQkJCXBiaS0+ZnJhbWVfbW11X2R3X21hcF9hZGRyLAorCQkJCQlwYmktPmZyYW1lX21tdV9kd19tYXBfcGh5X2FkZHIpOworCQkJcGJpLT5mcmFtZV9tbXVfZHdfbWFwX2FkZHIgPSBOVUxMOworCQl9CisJfQorI2VuZGlmCisKKyNpZmRlZiBTVVBQT1JUX0ZCX0RFQ09ESU5HCisJaWYgKHBiaS0+c3RhZ2VfbW11X21hcF9hZGRyKSB7CisJCWlmIChwYmktPnN0YWdlX21tdV9tYXBfcGh5X2FkZHIpCisJCQlkbWFfZnJlZV9jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJU1RBR0VfTU1VX01BUF9TSVpFICogU1RBR0VfTUFYX0JVRkZFUlMsCisJCQkJcGJpLT5zdGFnZV9tbXVfbWFwX2FkZHIsCisJCQkJCXBiaS0+c3RhZ2VfbW11X21hcF9waHlfYWRkcik7CisJCXBiaS0+c3RhZ2VfbW11X21hcF9hZGRyID0gTlVMTDsKKwl9CisKKwl1bmluaXRfc3RhZ2VfYnVmKHBiaSk7CisjZW5kaWYKKworI2lmZGVmIFZQOV9MUEZfTFZMX1VQREFURQorCWZyZWVfbGZfYnVmKHBiaSk7CisjZW5kaWYKKwlpZiAocGJpLT5ndnMpCisJCXZmcmVlKHBiaS0+Z3ZzKTsKKwlwYmktPmd2cyA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgdnA5X2xvY2FsX2luaXQoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCWludCByZXQgPSAtMTsKKwkvKmludCBsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUsIGxvc2xlc3NfY29tcF9ib2R5X3NpemU7Ki8KKworCXN0cnVjdCBCdWZmSW5mb19zICpjdXJfYnVmX2luZm8gPSBOVUxMOworCisJbWVtc2V0KCZwYmktPnBhcmFtLCAwLCBzaXplb2YodW5pb24gcGFyYW1fdSkpOworCW1lbXNldCgmcGJpLT5jb21tb24sIDAsIHNpemVvZihzdHJ1Y3QgVlA5X0NvbW1vbl9zKSk7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCWN1cl9idWZfaW5mbyA9ICZwYmktPndvcmtfc3BhY2VfYnVmX3N0b3JlOworCWlmIChmb3JjZV9idWZzcGVjKSB7CisJCW1lbWNweShjdXJfYnVmX2luZm8sICZhbXZ2cDlfd29ya2J1ZmZfc3BlY1tmb3JjZV9idWZzcGVjICYgMHhmXSwKKwkJc2l6ZW9mKHN0cnVjdCBCdWZmSW5mb19zKSk7CisJCXByX2luZm8oImZvcmNlIGJ1ZmZlciBzcGVjICVkXG4iLCBmb3JjZV9idWZzcGVjICYgMHhmKTsKKwl9IGVsc2UgeworCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDw9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UTTIgJiYgIWlzX2NwdV90bTJfcmV2YigpKSB7CisJCQlpZiAodmRlY19pc19zdXBwb3J0XzRrKCkpIHsKKwkJCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpIHsKKwkJCQkJbWVtY3B5KGN1cl9idWZfaW5mbywgJmFtdnZwOV93b3JrYnVmZl9zcGVjWzJdLAkvKiA4ayAqLworCQkJCQlzaXplb2Yoc3RydWN0IEJ1ZmZJbmZvX3MpKTsKKwkJCQl9IGVsc2UKKwkJCQkJbWVtY3B5KGN1cl9idWZfaW5mbywgJmFtdnZwOV93b3JrYnVmZl9zcGVjWzFdLAkvKiA0ayAqLworCQkJCQlzaXplb2Yoc3RydWN0IEJ1ZmZJbmZvX3MpKTsKKwkJCX0gZWxzZQorCQkJCW1lbWNweShjdXJfYnVmX2luZm8sICZhbXZ2cDlfd29ya2J1ZmZfc3BlY1swXSwvKiAxMDgwcCAqLworCQkJCXNpemVvZihzdHJ1Y3QgQnVmZkluZm9fcykpOworCQl9IGVsc2UgeyAvL2dldF9jcHVfbWFqb3JfaWQoKSA+IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UTTIgfHwgaXNfY3B1X3RtMl9yZXZiKCkKKwkJCWlmICh2ZGVjX2lzX3N1cHBvcnRfNGsoKSkgeworCQkJCW1lbWNweShjdXJfYnVmX2luZm8sICZhbXZ2cDlfd29ya2J1ZmZfc3BlY1s1XSwJLyogOGsgKi8KKwkJCQlzaXplb2Yoc3RydWN0IEJ1ZmZJbmZvX3MpKTsKKwkJCX0gZWxzZQorCQkJCW1lbWNweShjdXJfYnVmX2luZm8sICZhbXZ2cDlfd29ya2J1ZmZfc3BlY1szXSwvKiAxMDgwcCAqLworCQkJCXNpemVvZihzdHJ1Y3QgQnVmZkluZm9fcykpOworCQl9CisJfQorCisJY3VyX2J1Zl9pbmZvLT5zdGFydF9hZHIgPSBwYmktPmJ1Zl9zdGFydDsKKwlpZiAoIXBiaS0+bW11X2VuYWJsZSkKKwkJcGJpLT5tY19idWZfc3BlYy5idWZfZW5kID0gcGJpLT5idWZfc3RhcnQgKyBwYmktPmJ1Zl9zaXplOworI2VuZGlmCisKKwlpbml0X2J1ZmZfc3BlYyhwYmksIGN1cl9idWZfaW5mbyk7CisJdnA5X2J1Zm1ncl9pbml0KHBiaSwgY3VyX2J1Zl9pbmZvLCBOVUxMKTsKKworCS8qIHZwOV9tYXhfcGljX3cvaCBmb3IgZGVidWcgKi8KKwlwYmktPmluaXRfcGljX3cgPSAodnA5X21heF9waWNfdykgPyB2cDlfbWF4X3BpY193OgorCQkoKHBiaS0+bWF4X3BpY193KSA/IHBiaS0+bWF4X3BpY193IDogcGJpLT53b3JrX3NwYWNlX2J1Zi0+bWF4X3dpZHRoKTsKKwlwYmktPmluaXRfcGljX2ggPSAodnA5X21heF9waWNfaCkgPyB2cDlfbWF4X3BpY19oOgorCQkoKHBiaS0+bWF4X3BpY19oKSA/IHBiaS0+bWF4X3BpY19oIDogcGJpLT53b3JrX3NwYWNlX2J1Zi0+bWF4X2hlaWdodCk7CisKKwkvKiB2aWRlbyBpcyBub3Qgc3VwcG9ydCB1bmFsaWduZWQgd2l0aCA2NCBpbiB0bDEKKwkqKiB2ZGVjIGNhbnZhcyBtb2RlIHdpbGwgYmUgbGluZWFyIHdoZW4gZHVtcCB5dXYgaXMgc2V0CisJKi8KKwlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQSkgJiYKKwkJKHBiaS0+ZG91YmxlX3dyaXRlX21vZGUgIT0gMCkgJiYKKwkJKCgocGJpLT5tYXhfcGljX3cgJSA2NCkgIT0gMCkgfHwKKwkJKHBiaS0+dnZwOV9hbXN0cmVhbV9kZWNfaW5mby53aWR0aCAlIDY0KSAhPSAwKSkgeworCQlpZiAoaHdfdG9fdmRlYyhwYmkpLT5jYW52YXNfbW9kZSAhPQorCQkJQ0FOVkFTX0JMS01PREVfTElORUFSKQorCQkJcGJpLT5tZW1fbWFwX21vZGUgPSAyOworCQllbHNlIHsKKwkJCXBiaS0+bWVtX21hcF9tb2RlID0gMDsKKwkJCXByX2luZm8oInZkZWMgYmxrbW9kIGxpbmVhciwgZm9yY2UgbWVtX21hcF9tb2RlIDBcbiIpOworCQl9CisJfQorCisjaWZuZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwlpZiAoIXBiaS0+aXNfdXNlZF92NGwpIHsKKwkJaWYgKGluaXRfbXZfYnVmX2xpc3QocGJpKSA8IDApIHsKKwkJCXByX2VycigiJXM6IGluaXRfbXZfYnVmX2xpc3QgZmFpbFxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorI2VuZGlmCisJaWYgKHBiaS0+c2F2ZV9idWZmZXJfbW9kZSkKKwkJcGJpLT51c2VkX2J1Zl9udW0gPSBNQVhfQlVGX05VTV9TQVZFX0JVRjsKKwllbHNlIHsKKwkJaWYgKHBiaS0+aXNfdXNlZF92NGwpCisJCQlwYmktPnVzZWRfYnVmX251bSA9IDUgKyBwYmktPmR5bmFtaWNfYnVmX251bV9tYXJnaW47CisJCWVsc2UKKwkJCXBiaS0+dXNlZF9idWZfbnVtID0gbWF4X2J1Zl9udW07CisJfQorCisJaWYgKHBiaS0+dXNlZF9idWZfbnVtID4gTUFYX0JVRl9OVU0pCisJCXBiaS0+dXNlZF9idWZfbnVtID0gTUFYX0JVRl9OVU07CisJaWYgKHBiaS0+dXNlZF9idWZfbnVtID4gRlJBTUVfQlVGRkVSUykKKwkJcGJpLT51c2VkX2J1Zl9udW0gPSBGUkFNRV9CVUZGRVJTOworCisJcGJpLT5wdHNfdW5zdGFibGUgPSAoKHVuc2lnbmVkIGxvbmcpKHBiaS0+dnZwOV9hbXN0cmVhbV9kZWNfaW5mby5wYXJhbSkKKwkJCSYgMHg0MCkgPj4gNjsKKworCWlmICgoZGVidWcgJiBWUDlfREVCVUdfU0VORF9QQVJBTV9XSVRIX1JFRykgPT0gMCkgeworCQlwYmktPnJwbV9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlSUE1fQlVGX1NJWkUsCisJCQkJJnBiaS0+cnBtX3BoeV9hZGRyLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHBiaS0+cnBtX2FkZHIgPT0gTlVMTCkgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFsbG9jIHJwbSBidWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXBiaS0+cnBtX3B0ciA9IHBiaS0+cnBtX2FkZHI7CisJfQorCisJcGJpLT5sbWVtX2FkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJTE1FTV9CVUZfU0laRSwKKwkJCSZwYmktPmxtZW1fcGh5X2FkZHIsIEdGUF9LRVJORUwpOworCWlmIChwYmktPmxtZW1fYWRkciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvYyBsbWVtIGJ1ZmZlclxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLTE7CisJfQorCXBiaS0+bG1lbV9wdHIgPSBwYmktPmxtZW1fYWRkcjsKKworCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKSAmJgorCQkodmRlY19zZWN1cmUoaHdfdG9fdmRlYyhwYmkpKSkpIHsKKwkJdTMyIHByb2JfYWRkciwgaWQ7CisJCWlkID0gdGVlX3ZwOV9wcm9iX21hbGxvYygmcHJvYl9hZGRyKTsKKwkJaWYgKHByb2JfYWRkciA8PSAwKQorCQkJcHJfZXJyKCIlcywgdGVlWyVkXSBtYWxsb2MgcHJvYiBidWYgZmFpbGVkXG4iLCBfX2Z1bmNfXywgaWQpOworCQllbHNlIHsKKwkJCXBiaS0+cHJvYl9idWZmZXJfcGh5X2FkZHIgPSBwcm9iX2FkZHI7CisJCQlwYmktPmNvdW50X2J1ZmZlcl9waHlfYWRkciA9IHBiaS0+cHJvYl9idWZmZXJfcGh5X2FkZHIgKyBQUk9CX0JVRl9TSVpFOworCQl9CisJCXBiaS0+cHJvYl9idWZmZXJfYWRkciA9IE5VTEw7CisJCXBiaS0+Y291bnRfYnVmZmVyX2FkZHIgPSBOVUxMOworCX0gZWxzZSB7CisJCXBiaS0+cHJvYl9idWZmZXJfYWRkciA9IGRtYV9hbGxvY19jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJCVBST0JfQlVGX1NJWkUsCisJCQkJCSZwYmktPnByb2JfYnVmZmVyX3BoeV9hZGRyLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHBiaS0+cHJvYl9idWZmZXJfYWRkciA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgcHJvYl9idWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQltZW1zZXQocGJpLT5wcm9iX2J1ZmZlcl9hZGRyLCAwLCBQUk9CX0JVRl9TSVpFKTsKKwkJcGJpLT5jb3VudF9idWZmZXJfYWRkciA9IGRtYV9hbGxvY19jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJCUNPVU5UX0JVRl9TSVpFLAorCQkJCQkmcGJpLT5jb3VudF9idWZmZXJfcGh5X2FkZHIsIEdGUF9LRVJORUwpOworCQlpZiAocGJpLT5jb3VudF9idWZmZXJfYWRkciA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgY291bnRfYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbWVtc2V0KHBiaS0+Y291bnRfYnVmZmVyX2FkZHIsIDAsIENPVU5UX0JVRl9TSVpFKTsKKwl9CisKKwlpZiAocGJpLT5tbXVfZW5hYmxlKSB7CisJCXUzMiBtbXVfbWFwX3NpemUgPSB2dnA5X2ZyYW1lX21tdV9tYXBfc2l6ZShwYmkpOworCQlwYmktPmZyYW1lX21tdV9tYXBfYWRkciA9CisJCQlkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCW1tdV9tYXBfc2l6ZSwKKwkJCQkmcGJpLT5mcmFtZV9tbXVfbWFwX3BoeV9hZGRyLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHBiaS0+ZnJhbWVfbW11X21hcF9hZGRyID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvYyBjb3VudF9idWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQltZW1zZXQocGJpLT5mcmFtZV9tbXVfbWFwX2FkZHIsIDAsIENPVU5UX0JVRl9TSVpFKTsKKwl9CisjaWZkZWYgVlA5XzEwQl9NTVVfRFcKKwlpZiAocGJpLT5kd19tbXVfZW5hYmxlKSB7CisJCXUzMiBkd19tbXVfbWFwX3NpemUgPSB2dnA5X2ZyYW1lX21tdV9tYXBfc2l6ZShwYmkpOworCQlwYmktPmZyYW1lX21tdV9kd19tYXBfYWRkciA9CisJCQlkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCWR3X21tdV9tYXBfc2l6ZSwKKwkJCQkmcGJpLT5mcmFtZV9tbXVfZHdfbWFwX3BoeV9hZGRyLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHBiaS0+ZnJhbWVfbW11X2R3X21hcF9hZGRyID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvYyBjb3VudF9idWZmZXIgbW11IGR3XG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbWVtc2V0KHBiaS0+ZnJhbWVfbW11X2R3X21hcF9hZGRyLCAwLCBDT1VOVF9CVUZfU0laRSk7CisJfQorI2VuZGlmCisjaWZkZWYgU1VQUE9SVF9GQl9ERUNPRElORworCWlmIChwYmktPm1faW5zX2ZsYWcgJiYgc3RhZ2VfYnVmX251bSA+IDApIHsKKwkJcGJpLT5zdGFnZV9tbXVfbWFwX2FkZHIgPQorCQkJZG1hX2FsbG9jX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlTVEFHRV9NTVVfTUFQX1NJWkUgKiBTVEFHRV9NQVhfQlVGRkVSUywKKwkJCQkmcGJpLT5zdGFnZV9tbXVfbWFwX3BoeV9hZGRyLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHBiaS0+c3RhZ2VfbW11X21hcF9hZGRyID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvYyBjb3VudF9idWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQltZW1zZXQocGJpLT5zdGFnZV9tbXVfbWFwX2FkZHIsCisJCQkwLCBTVEFHRV9NTVVfTUFQX1NJWkUgKiBTVEFHRV9NQVhfQlVGRkVSUyk7CisKKwkJaW5pdF9zdGFnZV9idWYocGJpKTsKKwl9CisjZW5kaWYKKworCXJldCA9IDA7CisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgTWFpbGJveCBjb21tYW5kCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENNRF9GSU5JU0hFRCAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ01EX0FMTE9DX1ZJRVcgICAgICAgICAgICAgMQorI2RlZmluZSBDTURfRlJBTUVfRElTUExBWSAgICAgICAgICAzCisjZGVmaW5lIENNRF9ERUJVRyAgICAgICAgICAgICAgICAgIDEwCisKKworI2RlZmluZSBERUNPREVfQlVGRkVSX05VTV9NQVggICAgMzIKKyNkZWZpbmUgRElTUExBWV9CVUZGRVJfTlVNICAgICAgIDYKKworI2RlZmluZSB2aWRlb19kb21haW5fYWRkcihhZHIpIChhZHImMHg3ZmZmZmZmZikKKyNkZWZpbmUgREVDT0RFUl9XT1JLX1NQQUNFX1NJWkUgMHg4MDAwMDAKKworI2RlZmluZSBzcGVjMmNhbnZhcyh4KSAgXAorCSgoKHgpLT51dl9jYW52YXNfaW5kZXggPDwgMTYpIHwgXAorCSAoKHgpLT51dl9jYW52YXNfaW5kZXggPDwgOCkgIHwgXAorCSAoKHgpLT55X2NhbnZhc19pbmRleCA8PCAwKSkKKworCitzdGF0aWMgdm9pZCBzZXRfY2FudmFzKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljX2NvbmZpZykKK3sKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhwYmkpOworCWludCBjYW52YXNfdyA9IEFMSUdOKHBpY19jb25maWctPnlfY3JvcF93aWR0aCwgNjQpLzQ7CisJaW50IGNhbnZhc19oID0gQUxJR04ocGljX2NvbmZpZy0+eV9jcm9wX2hlaWdodCwgMzIpLzQ7CisJaW50IGJsa21vZGUgPSBwYmktPm1lbV9tYXBfbW9kZTsKKwkvKkNBTlZBU19CTEtNT0RFXzY0WDMyKi8KKwlpZgkocGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGUpIHsKKwkJY2FudmFzX3cgPSBwaWNfY29uZmlnLT55X2Nyb3Bfd2lkdGgJLworCQkJCWdldF9kb3VibGVfd3JpdGVfcmF0aW8oCisJCQkJCXBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlICYgMHhmKTsKKwkJY2FudmFzX2ggPSBwaWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0IC8KKwkJCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKAorCQkJCQlwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4Zik7CisKKwkJLyogc2FvIGN0cmwxIHJlZyBhbGlnbmxpbmUgd2l0aCA2NCwgYWxpZ24gd2l0aCA2NCAqLworCQljYW52YXNfdyA9IEFMSUdOKGNhbnZhc193LCA2NCk7CisJCWNhbnZhc19oID0gQUxJR04oY2FudmFzX2gsIDMyKTsKKworCQlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJCWlmIChwaWNfY29uZmlnLT55X2NhbnZhc19pbmRleCA9PSAtMSkKKwkJCQlwaWNfY29uZmlnLT55X2NhbnZhc19pbmRleCA9CisJCQkJCXZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX0hFVkMsIHZkZWMtPmlkKTsKKwkJCWlmIChwaWNfY29uZmlnLT51dl9jYW52YXNfaW5kZXggPT0gLTEpCisJCQkJcGljX2NvbmZpZy0+dXZfY2FudmFzX2luZGV4ID0KKwkJCQkJdmRlYy0+Z2V0X2NhbnZhc19leChDT1JFX01BU0tfSEVWQywgdmRlYy0+aWQpOworCQl9IGVsc2UgeworCQkJcGljX2NvbmZpZy0+eV9jYW52YXNfaW5kZXggPSAxMjggKyBwaWNfY29uZmlnLT5pbmRleCAqIDI7CisJCQlwaWNfY29uZmlnLT51dl9jYW52YXNfaW5kZXggPSAxMjggKyBwaWNfY29uZmlnLT5pbmRleCAqIDIgKyAxOworCQl9CisKKwkJY29uZmlnX2Nhdl9sdXRfZXgocGljX2NvbmZpZy0+eV9jYW52YXNfaW5kZXgsCisJCQlwaWNfY29uZmlnLT5kd195X2FkciwgY2FudmFzX3csIGNhbnZhc19oLAorCQkJQ0FOVkFTX0FERFJfTk9XUkFQLCBibGttb2RlLCBwYmktPmlzX3VzZWRfdjRsID8gMCA6IDcsIFZERUNfSEVWQyk7CisJCWNvbmZpZ19jYXZfbHV0X2V4KHBpY19jb25maWctPnV2X2NhbnZhc19pbmRleCwKKwkJCXBpY19jb25maWctPmR3X3Vfdl9hZHIsCWNhbnZhc193LCBjYW52YXNfaCwKKwkJCUNBTlZBU19BRERSX05PV1JBUCwgYmxrbW9kZSwgcGJpLT5pc191c2VkX3Y0bCA/IDAgOiA3LCBWREVDX0hFVkMpOworCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQlwaWNfY29uZmlnLT5jYW52YXNfY29uZmlnWzBdLnBoeV9hZGRyID0KKwkJCQlwaWNfY29uZmlnLT5kd195X2FkcjsKKwkJcGljX2NvbmZpZy0+Y2FudmFzX2NvbmZpZ1swXS53aWR0aCA9CisJCQkJY2FudmFzX3c7CisJCXBpY19jb25maWctPmNhbnZhc19jb25maWdbMF0uaGVpZ2h0ID0KKwkJCQljYW52YXNfaDsKKwkJcGljX2NvbmZpZy0+Y2FudmFzX2NvbmZpZ1swXS5ibG9ja19tb2RlID0KKwkJCQlibGttb2RlOworCQlwaWNfY29uZmlnLT5jYW52YXNfY29uZmlnWzBdLmVuZGlhbiA9IHBiaS0+aXNfdXNlZF92NGwgPyAwIDogNzsKKworCQlwaWNfY29uZmlnLT5jYW52YXNfY29uZmlnWzFdLnBoeV9hZGRyID0KKwkJCQlwaWNfY29uZmlnLT5kd191X3ZfYWRyOworCQlwaWNfY29uZmlnLT5jYW52YXNfY29uZmlnWzFdLndpZHRoID0KKwkJCQljYW52YXNfdzsKKwkJcGljX2NvbmZpZy0+Y2FudmFzX2NvbmZpZ1sxXS5oZWlnaHQgPQorCQkJCWNhbnZhc19oOworCQlwaWNfY29uZmlnLT5jYW52YXNfY29uZmlnWzFdLmJsb2NrX21vZGUgPQorCQkJCWJsa21vZGU7CisJCXBpY19jb25maWctPmNhbnZhc19jb25maWdbMV0uZW5kaWFuID0gcGJpLT5pc191c2VkX3Y0bCA/IDAgOiA3OworI2VuZGlmCisJfQorfQorCisKK3N0YXRpYyB2b2lkIHNldF9mcmFtZV9pbmZvKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwgc3RydWN0IHZmcmFtZV9zICp2ZikKK3sKKwl1bnNpZ25lZCBpbnQgYXIgPSBESVNQX1JBVElPX0FTUEVDVF9SQVRJT19NQVg7CisJdmYtPmR1cmF0aW9uID0gcGJpLT5mcmFtZV9kdXI7CisJdmYtPmR1cmF0aW9uX3B1bGxkb3duID0gMDsKKwl2Zi0+ZmxhZyA9IDA7CisJdmYtPnByb3AubWFzdGVyX2Rpc3BsYXlfY29sb3VyID0gcGJpLT52Zl9kcDsKKwl2Zi0+c2lnbmFsX3R5cGUgPSBwYmktPnZpZGVvX3NpZ25hbF90eXBlOworCWlmICh2Zi0+Y29tcFdpZHRoICYmIHZmLT5jb21wSGVpZ2h0KQorCQlwYmktPmZyYW1lX2FyID0gdmYtPmNvbXBIZWlnaHQgKiAweDEwMCAvIHZmLT5jb21wV2lkdGg7CisJYXIgPSBtaW5fdCh1MzIsIGFyLCBESVNQX1JBVElPX0FTUEVDVF9SQVRJT19NQVgpOworCXZmLT5yYXRpb19jb250cm9sID0gKGFyIDw8IERJU1BfUkFUSU9fQVNQRUNUX1JBVElPX0JJVCk7CisJdmYtPnNhcl93aWR0aCA9IDE7CisJdmYtPnNhcl9oZWlnaHQgPSAxOworCisJaWYgKHBiaS0+aXNfdXNlZF92NGwgJiYgcGJpLT52Zl9kcC5wcmVzZW50X2ZsYWcpIHsKKwkJc3RydWN0IGFtbF92ZGVjX2hkcl9pbmZvcyBoZHI7CisJCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikocGJpLT52NGwyX2N0eCk7CisKKwkJbWVtc2V0KCZoZHIsIDAsIHNpemVvZihoZHIpKTsKKwkJaGRyLnNpZ25hbF90eXBlID0gdmYtPnNpZ25hbF90eXBlOworCQloZHIuY29sb3JfcGFybXMgPSBwYmktPnZmX2RwOworCisJCWhkci5jb2xvcl9wYXJtcy5sdW1pbmFuY2VbMF0gPSBoZHIuY29sb3JfcGFybXMubHVtaW5hbmNlWzBdIC8gMTAwMDA7CisKKwkJdmRlY192NGxfc2V0X2hkcl9pbmZvcyhjdHgsICZoZHIpOworCX0KKworCWlmICgocGJpLT5jaHVuayAhPSBOVUxMKSAmJiAocGJpLT5jaHVuay0+aGRyMTBwX2RhdGFfYnVmICE9IE5VTEwpCisJCSYmIChwYmktPmNodW5rLT5oZHIxMHBfZGF0YV9zaXplICE9IDApKSB7CisJCWlmIChwYmktPmNodW5rLT5oZHIxMHBfZGF0YV9zaXplIDw9IDEyOCkgeworCQkJY2hhciAqbmV3X2J1ZjsKKwkJCWludCBpID0gMDsKKwkJCW5ld19idWYgPSBremFsbG9jKHBiaS0+Y2h1bmstPmhkcjEwcF9kYXRhX3NpemUsIEdGUF9BVE9NSUMpOworCisJCQlpZiAobmV3X2J1ZikgeworCQkJCW1lbWNweShuZXdfYnVmLCBwYmktPmNodW5rLT5oZHIxMHBfZGF0YV9idWYsIHBiaS0+Y2h1bmstPmhkcjEwcF9kYXRhX3NpemUpOworCQkJCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19CVUZNR1JfTU9SRSkgeworCQkJCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfQlVGTUdSX01PUkUsCisJCQkJCQkiaGRyMTBwIGRhdGE6IChzaXplICVkKVxuIiwKKwkJCQkJCXBiaS0+Y2h1bmstPmhkcjEwcF9kYXRhX3NpemUpOworCQkJCQlmb3IgKGkgPSAwOyBpIDwgcGJpLT5jaHVuay0+aGRyMTBwX2RhdGFfc2l6ZTsgaSsrKSB7CisJCQkJCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfQlVGTUdSX01PUkUsCisJCQkJCQkJIiUwMnggIiwgcGJpLT5jaHVuay0+aGRyMTBwX2RhdGFfYnVmW2ldKTsKKwkJCQkJCWlmICgoKGkgKyAxKSAmIDB4ZikgPT0gMCkKKwkJCQkJCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfQlVGTUdSX01PUkUsICJcbiIpOworCQkJCQl9CisJCQkJCXZwOV9wcmludChwYmksIFZQOV9ERUJVR19CVUZNR1JfTU9SRSwgIlxuIik7CisJCQkJfQorCisJCQkJdmYtPmhkcjEwcF9kYXRhX3NpemUgPSBwYmktPmNodW5rLT5oZHIxMHBfZGF0YV9zaXplOworCQkJCXZmLT5oZHIxMHBfZGF0YV9idWYgPSBuZXdfYnVmOworCQkJfSBlbHNlIHsKKwkJCQl2cDlfcHJpbnQocGJpLCAwLCAiJXM6aGRyMTBwIGRhdGEgdnphbGxvYyBzaXplKCVkKSBmYWlsXG4iLAorCQkJCQlfX2Z1bmNfXywgcGJpLT5jaHVuay0+aGRyMTBwX2RhdGFfc2l6ZSk7CisJCQkJdmYtPmhkcjEwcF9kYXRhX3NpemUgPSBwYmktPmNodW5rLT5oZHIxMHBfZGF0YV9zaXplOworCQkJCXZmLT5oZHIxMHBfZGF0YV9idWYgPSBuZXdfYnVmOworCQkJfQorCQl9CisKKwkJdmZyZWUocGJpLT5jaHVuay0+aGRyMTBwX2RhdGFfYnVmKTsKKwkJcGJpLT5jaHVuay0+aGRyMTBwX2RhdGFfYnVmID0gTlVMTDsKKwkJcGJpLT5jaHVuay0+aGRyMTBwX2RhdGFfc2l6ZSA9IDA7CisJfQorCisJdmYtPnNpZGViaW5kX3R5cGUgPSBwYmktPnNpZGViaW5kX3R5cGU7CisJdmYtPnNpZGViaW5kX2NoYW5uZWxfaWQgPSBwYmktPnNpZGViaW5kX2NoYW5uZWxfaWQ7Cit9CisKK3N0YXRpYyBpbnQgdnZwOV92Zl9zdGF0ZXMoc3RydWN0IHZmcmFtZV9zdGF0ZXMgKnN0YXRlcywgdm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSA9IChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICopb3BfYXJnOworCisJc3RhdGVzLT52Zl9wb29sX3NpemUgPSBWRl9QT09MX1NJWkU7CisJc3RhdGVzLT5idWZfZnJlZV9udW0gPSBrZmlmb19sZW4oJnBiaS0+bmV3ZnJhbWVfcSk7CisJc3RhdGVzLT5idWZfYXZhaWxfbnVtID0ga2ZpZm9fbGVuKCZwYmktPmRpc3BsYXlfcSk7CisKKwlpZiAoc3RlcCA9PSAyKQorCQlzdGF0ZXMtPmJ1Zl9hdmFpbF9udW0gPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2dnA5X3ZmX3BlZWsodm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCB2ZnJhbWVfcyAqdmZbMl0gPSB7MCwgMH07CisJc3RydWN0IFZQOURlY29kZXJfcyAqcGJpID0gKHN0cnVjdCBWUDlEZWNvZGVyX3MgKilvcF9hcmc7CisKKwlpZiAoc3RlcCA9PSAyKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChrZmlmb19sZW4oJnBiaS0+ZGlzcGxheV9xKSA+IFZGX1BPT0xfU0laRSkgeworCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfQlVGTUdSLAorCQkJImtmaWZvIGxlbjolZCBpbnZhaWxkLCBwZWVrIGVycm9yXG4iLAorCQkJa2ZpZm9fbGVuKCZwYmktPmRpc3BsYXlfcSkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoa2ZpZm9fb3V0X3BlZWsoJnBiaS0+ZGlzcGxheV9xLCAodm9pZCAqKSZ2ZiwgMikpIHsKKwkJaWYgKHZmWzFdKSB7CisJCQl2ZlswXS0+bmV4dF92Zl9wdHNfdmFsaWQgPSB0cnVlOworCQkJdmZbMF0tPm5leHRfdmZfcHRzID0gdmZbMV0tPnB0czsKKwkJfSBlbHNlCisJCQl2ZlswXS0+bmV4dF92Zl9wdHNfdmFsaWQgPSBmYWxzZTsKKwkJcmV0dXJuIHZmWzBdOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2dnA5X3ZmX2dldCh2b2lkICpvcF9hcmcpCit7CisJc3RydWN0IHZmcmFtZV9zICp2ZjsKKwlzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkgPSAoc3RydWN0IFZQOURlY29kZXJfcyAqKW9wX2FyZzsKKworCWlmIChzdGVwID09IDIpCisJCXJldHVybiBOVUxMOworCWVsc2UgaWYgKHN0ZXAgPT0gMSkKKwkJCXN0ZXAgPSAyOworCisJaWYgKGtmaWZvX2dldCgmcGJpLT5kaXNwbGF5X3EsICZ2ZikpIHsKKwkJc3RydWN0IHZmcmFtZV9zICpuZXh0X3ZmID0gTlVMTDsKKwkJdWludDhfdCBpbmRleCA9IHZmLT5pbmRleCAmIDB4ZmY7CisJCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UuZGlzcF9xX25hbWUsIGtmaWZvX2xlbigmcGJpLT5kaXNwbGF5X3EpKTsKKwkJaWYgKGluZGV4IDwgcGJpLT51c2VkX2J1Zl9udW0gfHwKKwkJCSh2Zi0+dHlwZSAmIFZJRFRZUEVfVjRMX0VPUykpIHsKKwkJCXZmLT5pbmRleF9kaXNwID0gcGJpLT52Zl9nZXRfY291bnQ7CisJCQlwYmktPnZmX2dldF9jb3VudCsrOworCQkJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0JVRk1HUikKKwkJCQlwcl9pbmZvKCIlcyBpZHg6ICVkLCB0eXBlIDB4JXggdy9oICVkLyVkLCBwdHMgJWQsICVsbGQsIHRzOiAlbGxkXG4iLAorCQkJCQlfX2Z1bmNfXywgaW5kZXgsIHZmLT50eXBlLAorCQkJCQl2Zi0+d2lkdGgsIHZmLT5oZWlnaHQsCisJCQkJCXZmLT5wdHMsCisJCQkJCXZmLT5wdHNfdXM2NCwKKwkJCQkJdmYtPnRpbWVzdGFtcCk7CisKKwkJCWlmIChrZmlmb19wZWVrKCZwYmktPmRpc3BsYXlfcSwgJm5leHRfdmYpICYmIG5leHRfdmYpIHsKKwkJCQl2Zi0+bmV4dF92Zl9wdHNfdmFsaWQgPSB0cnVlOworCQkJCXZmLT5uZXh0X3ZmX3B0cyA9IG5leHRfdmYtPnB0czsKKwkJCX0gZWxzZQorCQkJCXZmLT5uZXh0X3ZmX3B0c192YWxpZCA9IGZhbHNlOworCisJCQlyZXR1cm4gdmY7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgdnZwOV92Zl9wdXQoc3RydWN0IHZmcmFtZV9zICp2Ziwgdm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSA9IChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICopb3BfYXJnOworCXVpbnQ4X3QgaW5kZXg7CisKKwlpZiAodmYgPT0gKCZwYmktPnZmcmFtZV9kdW1teSkpCisJCXJldHVybjsKKworCWlmICghdmYpCisJCXJldHVybjsKKworCWlmIChwYmktPmVuYWJsZV9mZW5jZSAmJiB2Zi0+ZmVuY2UpIHsKKwkJaW50IHJldCwgaTsKKworCQltdXRleF9sb2NrKCZwYmktPmZlbmNlX211dGV4KTsKKwkJcmV0ID0gZG1hX2ZlbmNlX2dldF9zdGF0dXModmYtPmZlbmNlKTsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgVkZfUE9PTF9TSVpFOyBpKyspIHsKKwkJCQlpZiAocGJpLT5mZW5jZV92Zl9zLmZlbmNlX3ZmW2ldID09IE5VTEwpIHsKKwkJCQkJcGJpLT5mZW5jZV92Zl9zLmZlbmNlX3ZmW2ldID0gdmY7CisJCQkJCXBiaS0+ZmVuY2VfdmZfcy51c2VkX3NpemUrKzsKKwkJCQkJbXV0ZXhfdW5sb2NrKCZwYmktPmZlbmNlX211dGV4KTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCQltdXRleF91bmxvY2soJnBiaS0+ZmVuY2VfbXV0ZXgpOworCX0KKworCWluZGV4ID0gdmYtPmluZGV4ICYgMHhmZjsKKworCWlmIChwYmktPmVuYWJsZV9mZW5jZSAmJiB2Zi0+ZmVuY2UpIHsKKwkJdmRlY19mZW5jZV9wdXQodmYtPmZlbmNlKTsKKwkJdmYtPmZlbmNlID0gTlVMTDsKKwl9CisKKwlpZiAodmYtPmhkcjEwcF9kYXRhX2J1ZikgeworCQlrZnJlZSh2Zi0+aGRyMTBwX2RhdGFfYnVmKTsKKwkJdmYtPmhkcjEwcF9kYXRhX2J1ZiA9IE5VTEw7CisJCXZmLT5oZHIxMHBfZGF0YV9zaXplID0gMDsKKwl9CisKKwlrZmlmb19wdXQoJnBiaS0+bmV3ZnJhbWVfcSwgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwlBVFJBQ0VfQ09VTlRFUihwYmktPnRyYWNlLm5ld19xX25hbWUsIGtmaWZvX2xlbigmcGJpLT5uZXdmcmFtZV9xKSk7CisJcGJpLT52Zl9wdXRfY291bnQrKzsKKworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19CVUZNR1IpCisJCXByX2luZm8oIiVzIGlkeDogJWQsIHR5cGUgMHgleCB3L2ggJWQvJWQsIHB0cyAlZCwgJWxsZCwgdHM6ICVsbGRcbiIsCisJCQlfX2Z1bmNfXywgaW5kZXgsIHZmLT50eXBlLAorCQkJdmYtPndpZHRoLCB2Zi0+aGVpZ2h0LAorCQkJdmYtPnB0cywKKwkJCXZmLT5wdHNfdXM2NCwKKwkJCXZmLT50aW1lc3RhbXApOworCisJaWYgKGluZGV4IDwgcGJpLT51c2VkX2J1Zl9udW0pIHsKKwkJc3RydWN0IFZQOV9Db21tb25fcyAqY20gPSAmcGJpLT5jb21tb247CisJCXN0cnVjdCBCdWZmZXJQb29sX3MgKnBvb2wgPSBjbS0+YnVmZmVyX3Bvb2w7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJbG9ja19idWZmZXJfcG9vbChwb29sLCBmbGFncyk7CisJCWlmIChwb29sLT5mcmFtZV9idWZzW2luZGV4XS5idWYudmZfcmVmID4gMCkKKwkJCXBvb2wtPmZyYW1lX2J1ZnNbaW5kZXhdLmJ1Zi52Zl9yZWYtLTsKKworCQlpZiAocGJpLT53YWl0X2J1ZikKKwkJCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTUJPWDBfSVJRX1JFRywKKwkJCQkJCTB4MSk7CisJCXBiaS0+bGFzdF9wdXRfaWR4ID0gaW5kZXg7CisJCXBiaS0+bmV3X2ZyYW1lX2Rpc3BsYXllZCsrOworCQl1bmxvY2tfYnVmZmVyX3Bvb2wocG9vbCwgZmxhZ3MpOworI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKKwkJaWYgKHBiaS0+dXNlZF9zdGFnZV9idWZfbnVtID4gMCAmJgorCQkJcGJpLT5iYWNrX25vdF9ydW5fcmVhZHkpCisJCQl0cmlnZ2VyX3NjaGVkdWxlKHBiaSk7CisjZW5kaWYKKwl9CisKK30KKworc3RhdGljIGludCB2dnA5X2V2ZW50X2NiKGludCB0eXBlLCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlX2RhdGEpCit7CisJc3RydWN0IFZQOURlY29kZXJfcyAqcGJpID0gKHN0cnVjdCBWUDlEZWNvZGVyX3MgKilwcml2YXRlX2RhdGE7CisKKwlpZiAodHlwZSAmIFZGUkFNRV9FVkVOVF9SRUNFSVZFUl9SRVNFVCkgeworI2lmIDAKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlhbWhldmNfc3RvcCgpOworI2lmbmRlZiBDT05GSUdfQU1MT0dJQ19QT1NUX1BST0NFU1NfTUFOQUdFUgorCQl2Zl9saWdodF91bnJlZ19wcm92aWRlcigmdnZwOV92Zl9wcm92KTsKKyNlbmRpZgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGJpLT5sb2NrLCBmbGFncyk7CisJCXZ2cDlfbG9jYWxfaW5pdCgpOworCQl2dnA5X3Byb3RfaW5pdCgpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYmktPmxvY2ssIGZsYWdzKTsKKyNpZm5kZWYgQ09ORklHX0FNTE9HSUNfUE9TVF9QUk9DRVNTX01BTkFHRVIKKwkJdmZfcmVnX3Byb3ZpZGVyKCZ2dnA5X3ZmX3Byb3YpOworI2VuZGlmCisJCWFtaGV2Y19zdGFydCgpOworI2VuZGlmCisJfSBlbHNlIGlmICh0eXBlICYgVkZSQU1FX0VWRU5UX1JFQ0VJVkVSX1JFUV9TVEFURSkgeworCQlzdHJ1Y3QgcHJvdmlkZXJfc3RhdGVfcmVxX3MgKnJlcSA9CisJCQkoc3RydWN0IHByb3ZpZGVyX3N0YXRlX3JlcV9zICopZGF0YTsKKwkJaWYgKHJlcS0+cmVxX3R5cGUgPT0gUkVRX1NUQVRFX1NFQ1VSRSkKKwkJCXJlcS0+cmVxX3Jlc3VsdFswXSA9IHZkZWNfc2VjdXJlKGh3X3RvX3ZkZWMocGJpKSk7CisJCWVsc2UKKwkJCXJlcS0+cmVxX3Jlc3VsdFswXSA9IDB4ZmZmZmZmZmY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaW5jX3ZmX3JlZihzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjbSA9ICZwYmktPmNvbW1vbjsKKworCWNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmc1tpbmRleF0uYnVmLnZmX3JlZisrOworCisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0JVRk1HUl9NT1JFKQorCQlwcl9pbmZvKCIlcyBpbmRleCA9ICVkIG5ldyB2Zl9yZWYgPSAlZFxyXG4iLAorCQkJX19mdW5jX18sIGluZGV4LAorCQkJY20tPmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzW2luZGV4XS5idWYudmZfcmVmKTsKK30KKworc3RhdGljIGludCBmcmFtZV9kdXJhdGlvbl9hZGFwdChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksIHN0cnVjdCB2ZnJhbWVfcyAqdmYsIHUzMiB2YWxpZCkKK3sKKwl1MzIgb2xkX2R1cmF0aW9uLCBwdHNfZHVyYXRpb24gPSAwOworCXUzMiBwdHMgPSB2Zi0+cHRzOworCisJaWYgKHBiaS0+Z2V0X2ZyYW1lX2R1ciA9PSB0cnVlKQorCQlyZXR1cm4gdHJ1ZTsKKworCXBiaS0+ZnJhbWVfY250X3dpbmRvdysrOworCWlmICghKHBiaS0+dnA5X2ZpcnN0X3B0c19yZWFkeSA9PSAxKSkgeworCQlpZiAodmFsaWQpIHsKKwkJCXBiaS0+cHRzMSA9IHB0czsKKwkJCXBiaS0+ZnJhbWVfY250X3dpbmRvdyA9IDA7CisJCQlwYmktPmR1cmF0aW9uX2Zyb21fcHRzX2RvbmUgPSAwOworCQkJcGJpLT52cDlfZmlyc3RfcHRzX3JlYWR5ID0gMTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChwdHMgPCBwYmktPnB0czEpIHsKKwkJCWlmIChwYmktPmZyYW1lX2NudF93aW5kb3cgPiBGUkFNRV9DTlRfV0lORE9XX1NJWkUpIHsKKwkJCQlwYmktPnB0czEgPSBwdHM7CisJCQkJcGJpLT5mcmFtZV9jbnRfd2luZG93ID0gMDsKKwkJCX0KKwkJfQorCisJCWlmICh2YWxpZCAmJiAocGJpLT5mcmFtZV9jbnRfd2luZG93ID4gRlJBTUVfQ05UX1dJTkRPV19TSVpFKSAmJgorCQkJKHB0cyA+IHBiaS0+cHRzMSkgJiYgKHBiaS0+ZHVyYXRpb25fZnJvbV9wdHNfZG9uZSA9PSAwKSkgeworCQkJCW9sZF9kdXJhdGlvbiA9IHBiaS0+ZnJhbWVfZHVyOworCQkJCXBiaS0+cHRzMiA9IHB0czsKKwkJCQlwdHNfZHVyYXRpb24gPSAoKChwYmktPnB0czIgLSBwYmktPnB0czEpICogMTYpIC8KKwkJCQkJKHBiaS0+ZnJhbWVfY250X3dpbmRvdyAqIDE1KSk7CisKKwkJCWlmIChjbG9zZV90byhwdHNfZHVyYXRpb24sIG9sZF9kdXJhdGlvbiwgMjAwMCkpIHsKKwkJCQlwYmktPmZyYW1lX2R1ciA9IHB0c19kdXJhdGlvbjsKKwkJCQlpZiAoKGRlYnVnICYgVlA5X0RFQlVHX09VVF9QVFMpICE9IDApCisJCQkJCXByX2luZm8oInVzZSBjYWxjIGR1cmF0aW9uICVkXG4iLCBwdHNfZHVyYXRpb24pOworCQkJfQorCisJCQlpZiAocGJpLT5kdXJhdGlvbl9mcm9tX3B0c19kb25lID09IDApIHsKKwkJCQlpZiAoY2xvc2VfdG8ocHRzX2R1cmF0aW9uLCBvbGRfZHVyYXRpb24sIFJBVEVfQ09SUkVDVElPTl9USFJFU0hPTEQpKSB7CisJCQkJCXBiaS0+ZHVyYXRpb25fZnJvbV9wdHNfZG9uZSA9IDE7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKCFjbG9zZV90byhwdHNfZHVyYXRpb24sCisJCQkJCQkgb2xkX2R1cmF0aW9uLCAxMDAwKSAmJgorCQkJCQkJIWNsb3NlX3RvKHB0c19kdXJhdGlvbiwKKwkJCQkJCXBiaS0+ZnJhbWVfZHVyLCAxMDAwKSAmJgorCQkJCQkJY2xvc2VfdG8ocHRzX2R1cmF0aW9uLAorCQkJCQkJcGJpLT5sYXN0X2R1cmF0aW9uLCAyMDApKSB7CisJCQkJCQkvKiBmcmFtZV9kdXIgbXVzdAorCQkJCQkJICogIHdyb25nLHJlY292ZXIgaXQuCisJCQkJCQkgKi8KKwkJCQkJCXBiaS0+ZnJhbWVfZHVyID0gcHRzX2R1cmF0aW9uOworCQkJCQl9CisJCQkJCXBiaS0+cHRzMSA9IHBiaS0+cHRzMjsKKwkJCQkJcGJpLT5mcmFtZV9jbnRfd2luZG93ID0gMDsKKwkJCQkJcGJpLT5kdXJhdGlvbl9mcm9tX3B0c19kb25lID0gMDsKKwkJCQl9CisJCQl9CisJCQlwYmktPmxhc3RfZHVyYXRpb24gPSBwdHNfZHVyYXRpb247CisJCX0KKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV92Zl9tZW1oYW5kbGUoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLAorCXN0cnVjdCB2ZnJhbWVfcyAqdmYsIHN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpwaWMpCit7CisJdmYtPm1lbV9oYW5kbGUgPSBOVUxMOworCXZmLT5tZW1faGVhZF9oYW5kbGUgPSBOVUxMOworCXZmLT5tZW1fZHdfaGFuZGxlID0gTlVMTDsKKworCS8qIGtlZXBlciBub3QgbmVlZGVkIGZvciB2NGwgc29sdXRpb24gKi8KKwlpZiAocGJpLT5pc191c2VkX3Y0bCkKKwkJcmV0dXJuOworCisJaWYgKHZmLT50eXBlICYgVklEVFlQRV9TQ0FUVEVSKSB7CisKKyNpZmRlZiBWUDlfMTBCX01NVV9EVworCQlpZiAocGljLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MjApIHsKKwkJCXZmLT5tZW1faGFuZGxlID0KKwkJCQlkZWNvZGVyX21tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJCXBiaS0+bW11X2JveF9kdywgcGljLT5pbmRleCk7CisJCQl2Zi0+bWVtX2hlYWRfaGFuZGxlID0KKwkJCQlkZWNvZGVyX2JtbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCQlwYmktPmJtbXVfYm94LAorCQkJCQlIRUFERVJfQlVGRkVSX0lEWChwaWMtPkJVRl9pbmRleCkpOworCQkJdmYtPm1lbV9kd19oYW5kbGUgPSBOVUxMOworCQl9IGVsc2UKKyNlbmRpZgorCQl7CisJCXZmLT5tZW1faGFuZGxlID0KKwkJCWRlY29kZXJfbW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCQlwYmktPm1tdV9ib3gsIHBpYy0+aW5kZXgpOworCQl2Zi0+bWVtX2hlYWRfaGFuZGxlID0KKwkJCWRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJcGJpLT5ibW11X2JveCwKKwkJCQlIRUFERVJfQlVGRkVSX0lEWChwaWMtPkJVRl9pbmRleCkpOworCQlpZiAocGJpLT5kb3VibGVfd3JpdGVfbW9kZSA9PSAzKQorCQkJdmYtPm1lbV9kd19oYW5kbGUgPQorCQkJCWRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJCXBiaS0+Ym1tdV9ib3gsCisJCQkJCVZGX0JVRkZFUl9JRFgocGljLT5CVUZfaW5kZXgpKTsKKwkJZWxzZQorCQkJdmYtPm1lbV9kd19oYW5kbGUgPSBOVUxMOworCQl9CisJfSBlbHNlIHsKKwkJdmYtPm1lbV9oYW5kbGUgPQorCQkJZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCQlwYmktPmJtbXVfYm94LCBWRl9CVUZGRVJfSURYKHBpYy0+QlVGX2luZGV4KSk7CisJCXZmLT5tZW1faGVhZF9oYW5kbGUgPSBOVUxMOworCQl2Zi0+bWVtX2R3X2hhbmRsZSA9IE5VTEw7CisJCS8qdmYtPm1lbV9oZWFkX2hhbmRsZSA9CisJCSAqZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJICpoZXZjLT5ibW11X2JveCwgVkZfQlVGRkVSX0lEWChCVUZfaW5kZXgpKTsKKwkJICovCisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGJpX3VwZGF0ZV9ndnMoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLAorCQkJCSAgc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnBpY19jb25maWcpCit7CisJaWYgKHBiaS0+Z3ZzLT5mcmFtZV9oZWlnaHQgIT0gcGljX2NvbmZpZy0+eV9jcm9wX2hlaWdodCkgeworCQlwYmktPmd2cy0+ZnJhbWVfd2lkdGggPSBwaWNfY29uZmlnLT55X2Nyb3Bfd2lkdGg7CisJCXBiaS0+Z3ZzLT5mcmFtZV9oZWlnaHQgPSBwaWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0OworCX0KKwlpZiAocGJpLT5ndnMtPmZyYW1lX2R1ciAhPSBwYmktPmZyYW1lX2R1cikgeworCQlwYmktPmd2cy0+ZnJhbWVfZHVyID0gcGJpLT5mcmFtZV9kdXI7CisJCWlmIChwYmktPmZyYW1lX2R1ciAhPSAwKQorCQkJcGJpLT5ndnMtPmZyYW1lX3JhdGUgPSAoKDk2MDAwICogMTAgLyBwYmktPmZyYW1lX2R1cikgJSAxMCkgPCA1ID8KKwkJCQkJOTYwMDAgLyBwYmktPmZyYW1lX2R1ciA6ICg5NjAwMCAvIHBiaS0+ZnJhbWVfZHVyICsxKTsKKwkJZWxzZQorCQkJcGJpLT5ndnMtPmZyYW1lX3JhdGUgPSAtMTsKKwl9CisJcGJpLT5ndnMtPnN0YXR1cyA9IHBiaS0+c3RhdCB8IHBiaS0+ZmF0YWxfZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgcHJlcGFyZV9kaXNwbGF5X2J1ZihzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksCisJCQkJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnBpY19jb25maWcpCit7CisJc3RydWN0IHZmcmFtZV9zICp2ZiA9IE5VTEw7CisJc3RydWN0IHZkZWNfcyAqcHZkZWMgPSBod190b192ZGVjKHBiaSk7CisJaW50IHN0cmVhbV9vZmZzZXQgPSBwaWNfY29uZmlnLT5zdHJlYW1fb2Zmc2V0OworCXVuc2lnbmVkIHNob3J0IHNsaWNlX3R5cGUgPSBwaWNfY29uZmlnLT5zbGljZV90eXBlOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqIHY0bDJfY3R4ID0gcGJpLT52NGwyX2N0eDsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPSBOVUxMOworCXVsb25nIG52X29yZGVyID0gVklEVFlQRV9WSVVfTlYyMTsKKwl1MzIgcHRzX3ZhbGlkID0gMCwgcHRzX3VzNjRfdmFsaWQgPSAwOworCXUzMiBwdHNfc2F2ZTsKKwl1NjQgcHRzX3VzNjRfc2F2ZTsKKwl1MzIgZnJhbWVfc2l6ZSA9IDA7CisJaW50IGkgPSAwOworCisKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfQlVGTUdSKQorCQlwcl9pbmZvKCIlcyBpbmRleCA9ICVkXHJcbiIsIF9fZnVuY19fLCBwaWNfY29uZmlnLT5pbmRleCk7CisJaWYgKGtmaWZvX2dldCgmcGJpLT5uZXdmcmFtZV9xLCAmdmYpID09IDApIHsKKwkJcHJfaW5mbygiZmF0YWwgZXJyb3IsIG5vIGF2YWlsYWJsZSBidWZmZXIgc2xvdC4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHN3YXAgdXYgKi8KKwlpZiAocGJpLT5pc191c2VkX3Y0bCkgeworCQlpZiAoKHY0bDJfY3R4LT5jYXBfcGl4X2ZtdCA9PSBWNEwyX1BJWF9GTVRfTlYxMikgfHwKKwkJCSh2NGwyX2N0eC0+Y2FwX3BpeF9mbXQgPT0gVjRMMl9QSVhfRk1UX05WMTJNKSkKKwkJCW52X29yZGVyID0gVklEVFlQRV9WSVVfTlYxMjsKKwl9CisKKwlpZiAocGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGUgJiYKKwkJKHBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlICYgMHgyMCkgPT0gMCkKKwkJc2V0X2NhbnZhcyhwYmksIHBpY19jb25maWcpOworCisJZGlzcGxheV9mcmFtZV9jb3VudFtwYmktPmluZGV4XSsrOworCWlmICh2ZikgeworCQlpZiAoIWZvcmNlX3B0c191bnN0YWJsZSkgeworCQkJaWYgKChwaWNfY29uZmlnLT5wdHMgPT0gMCkgfHwgKChwaWNfY29uZmlnLT5wdHMgPD0gcGJpLT5sYXN0X3B0cykgJiYKKwkJCQkocGljX2NvbmZpZy0+cHRzNjQgPD0gcGJpLT5sYXN0X3B0c191czY0KSkpIHsKKwkJCQlmb3IgKGkgPSAoRlJBTUVfQlVGRkVSUyAtIDEpOyBpID4gMDsgaS0tKSB7CisJCQkJCWlmICgocGJpLT5sYXN0X3B0cyA9PSBwYmktPmZyYW1lX21vZGVfcHRzX3NhdmVbaV0pIHx8CisJCQkJCQkocGJpLT5sYXN0X3B0c191czY0ID09IHBiaS0+ZnJhbWVfbW9kZV9wdHM2NF9zYXZlW2ldKSkgeworCQkJCQkJcGljX2NvbmZpZy0+cHRzID0gcGJpLT5mcmFtZV9tb2RlX3B0c19zYXZlW2kgLSAxXTsKKwkJCQkJCXBpY19jb25maWctPnB0czY0ID0gcGJpLT5mcmFtZV9tb2RlX3B0czY0X3NhdmVbaSAtIDFdOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKChpID09IDApIHx8IChwaWNfY29uZmlnLT5wdHMgPD0gcGJpLT5sYXN0X3B0cykpIHsKKwkJCQkJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHX09VVF9QVFMsCisJCQkJCQkibm8gZm91bmQgcHRzICVkLCBzZXQgMC4gJWQsICVkXG4iLAorCQkJCQkJaSwgcGljX2NvbmZpZy0+cHRzLCBwYmktPmxhc3RfcHRzKTsKKwkJCQkJcGljX2NvbmZpZy0+cHRzID0gMDsKKwkJCQkJcGljX2NvbmZpZy0+cHRzNjQgPSAwOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChwYmktPmlzX3VzZWRfdjRsKSB7CisJCQl2Zi0+djRsX21lbV9oYW5kbGUKKwkJCQk9IHBiaS0+bV9CVUZbcGljX2NvbmZpZy0+QlVGX2luZGV4XS52NGxfcmVmX2J1Zl9hZGRyOworCQkJZmIgPSAoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKil2Zi0+djRsX21lbV9oYW5kbGU7CisJCQlpZiAocGJpLT5tbXVfZW5hYmxlKSB7CisJCQkJdmYtPm1tX2JveC5ibW11X2JveAk9IHBiaS0+Ym1tdV9ib3g7CisJCQkJdmYtPm1tX2JveC5ibW11X2lkeAk9IEhFQURFUl9CVUZGRVJfSURYKHBiaS0+YnVmZmVyX3dyYXBbcGljX2NvbmZpZy0+QlVGX2luZGV4XSk7CisJCQkJdmYtPm1tX2JveC5tbXVfYm94CT0gcGJpLT5tbXVfYm94OworCQkJCXZmLT5tbV9ib3gubW11X2lkeAk9IHBiaS0+YnVmZmVyX3dyYXBbcGljX2NvbmZpZy0+aW5kZXhdOworCQkJfQorCQl9CisKKwkJaWYgKHBiaS0+ZW5hYmxlX2ZlbmNlKSB7CisJCQkvKiBmaWxsIGZlbmNlIGluZm9ybWF0aW9uLiAqLworCQkJaWYgKHBiaS0+ZmVuY2VfdXNhZ2UgPT0gRkVOQ0VfVVNFX0ZPUl9EUklWRVIpCisJCQkJdmYtPmZlbmNlCT0gcGljX2NvbmZpZy0+ZmVuY2U7CisJCX0KKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwkJaWYgKHZkZWNfZnJhbWVfYmFzZWQocHZkZWMpKSB7CisJCQl2Zi0+cHRzID0gcGljX2NvbmZpZy0+cHRzOworCQkJdmYtPnB0c191czY0ID0gcGljX2NvbmZpZy0+cHRzNjQ7CisKKwkJCWlmIChwYmktPmlzX3VzZWRfdjRsICYmIHY0bF9iaXRzdHJlYW1faWRfZW5hYmxlKQorCQkJCXZmLT50aW1lc3RhbXAgPSBwaWNfY29uZmlnLT50aW1lc3RhbXA7CisJCQllbHNlCisJCQkJdmYtPnRpbWVzdGFtcCA9IHBpY19jb25maWctPnB0czY0OworCisJCQlpZiAodmYtPnB0cyAhPSAwIHx8IHZmLT5wdHNfdXM2NCAhPSAwKSB7CisJCQkJcHRzX3ZhbGlkID0gMTsKKwkJCQlwdHNfdXM2NF92YWxpZCA9IDE7CisJCQl9IGVsc2UgeworCQkJCXB0c192YWxpZCA9IDA7CisJCQkJcHRzX3VzNjRfdmFsaWQgPSAwOworCQkJfQorCQl9IGVsc2UKKyNlbmRpZgorCQkvKiBpZiAocHRzX2xvb2t1cF9vZmZzZXQoUFRTX1RZUEVfVklERU8sCisJCSAqICAgc3RyZWFtX29mZnNldCwgJnZmLT5wdHMsIDApICE9IDApIHsKKwkJICovCisJCWlmICgocHZkZWMtPnZidWYubm9fcGFyc2VyID09IDApIHx8IChwdmRlYy0+dmJ1Zi51c2VfcHRzc2VydikpIHsKKwkJCWlmIChwdHNfbG9va3VwX29mZnNldF91czY0CisJCQkJKFBUU19UWVBFX1ZJREVPLCBzdHJlYW1fb2Zmc2V0LCAmdmYtPnB0cywKKwkJCQkmZnJhbWVfc2l6ZSwgMCwKKwkJCQkmdmYtPnB0c191czY0KSAhPSAwKSB7CisjaWZkZWYgREVCVUdfUFRTCisJCQkJcGJpLT5wdHNfbWlzc2VkKys7CisjZW5kaWYKKwkJCQl2Zi0+cHRzID0gMDsKKwkJCQl2Zi0+cHRzX3VzNjQgPSAwOworCQkJCXB0c192YWxpZCA9IDA7CisJCQkJcHRzX3VzNjRfdmFsaWQgPSAwOworCQkJfSBlbHNlIHsKKyNpZmRlZiBERUJVR19QVFMKKwkJCQlwYmktPnB0c19oaXQrKzsKKyNlbmRpZgorCQkJCXB0c192YWxpZCA9IDE7CisJCQkJcHRzX3VzNjRfdmFsaWQgPSAxOworCQkJfQorCQl9CisKKwkJZmlsbF9mcmFtZV9pbmZvKHBiaSwgcGljX2NvbmZpZywgZnJhbWVfc2l6ZSwgdmYtPnB0cyk7CisKKwkJcHRzX3NhdmUgPSB2Zi0+cHRzOworCQlwdHNfdXM2NF9zYXZlID0gdmYtPnB0c191czY0OworCQlpZiAocGJpLT5pc191c2VkX3Y0bCB8fCBwYmktPnB0c191bnN0YWJsZSkgeworCQkJZnJhbWVfZHVyYXRpb25fYWRhcHQocGJpLCB2ZiwgcHRzX3ZhbGlkKTsKKwkJCWlmIChwYmktPmR1cmF0aW9uX2Zyb21fcHRzX2RvbmUpIHsKKwkJCQlwYmktPnB0c19tb2RlID0gUFRTX05PTkVfUkVGX1VTRV9EVVJBVElPTjsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHB0c192YWxpZCB8fCBwdHNfdXM2NF92YWxpZCkKKwkJCQkJcGJpLT5wdHNfbW9kZSA9IFBUU19OT1JNQUw7CisJCQl9CisJCX0KKworCQlpZiAoKHBiaS0+cHRzX21vZGUgPT0gUFRTX05PUk1BTCkgJiYgKHZmLT5wdHMgIT0gMCkKKwkJCSYmIHBiaS0+Z2V0X2ZyYW1lX2R1cikgeworCQkJaW50IHB0c19kaWZmID0gKGludCl2Zi0+cHRzIC0gcGJpLT5sYXN0X2xvb2t1cF9wdHM7CisKKwkJCWlmIChwdHNfZGlmZiA8IDApIHsKKwkJCQlwYmktPnB0c19tb2RlX3N3aXRjaGluZ19jb3VudCsrOworCQkJCXBiaS0+cHRzX21vZGVfcmVjb3ZlcnlfY291bnQgPSAwOworCisJCQkJaWYgKHBiaS0+cHRzX21vZGVfc3dpdGNoaW5nX2NvdW50ID49CisJCQkJCVBUU19NT0RFX1NXSVRDSElOR19USFJFU0hPTEQpIHsKKwkJCQkJcGJpLT5wdHNfbW9kZSA9CisJCQkJCQlQVFNfTk9ORV9SRUZfVVNFX0RVUkFUSU9OOworCQkJCQlwcl9pbmZvCisJCQkJCSgiSEVWQzogc3dpdGNoIHRvIG5fZCBtb2RlLlxuIik7CisJCQkJfQorCisJCQl9IGVsc2UgeworCQkJCWludCBwID0gUFRTX01PREVfU1dJVENISU5HX1JFQ09WRVJZX1RIUkVBU0hPTEQ7CisKKwkJCQlwYmktPnB0c19tb2RlX3JlY292ZXJ5X2NvdW50Kys7CisJCQkJaWYgKHBiaS0+cHRzX21vZGVfcmVjb3ZlcnlfY291bnQgPiBwKSB7CisJCQkJCXBiaS0+cHRzX21vZGVfc3dpdGNoaW5nX2NvdW50ID0gMDsKKwkJCQkJcGJpLT5wdHNfbW9kZV9yZWNvdmVyeV9jb3VudCA9IDA7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKHZmLT5wdHMgIT0gMCkKKwkJCXBiaS0+bGFzdF9sb29rdXBfcHRzID0gdmYtPnB0czsKKworCQlpZiAoKHBiaS0+cHRzX21vZGUgPT0gUFRTX05PTkVfUkVGX1VTRV9EVVJBVElPTikKKwkJCSYmIChzbGljZV90eXBlICE9IEtFWV9GUkFNRSkpCisJCQl2Zi0+cHRzID0gcGJpLT5sYXN0X3B0cyArIERVUjJQVFMocGJpLT5mcmFtZV9kdXIpOworCQlwYmktPmxhc3RfcHRzID0gdmYtPnB0czsKKworCQlpZiAodmYtPnB0c191czY0ICE9IDApCisJCQlwYmktPmxhc3RfbG9va3VwX3B0c191czY0ID0gdmYtPnB0c191czY0OworCisJCWlmICgocGJpLT5wdHNfbW9kZSA9PSBQVFNfTk9ORV9SRUZfVVNFX0RVUkFUSU9OKQorCQkJJiYgKHNsaWNlX3R5cGUgIT0gS0VZX0ZSQU1FKSkgeworCQkJdmYtPnB0c191czY0ID0KKwkJCQlwYmktPmxhc3RfcHRzX3VzNjQgKworCQkJCShEVVIyUFRTKHBiaS0+ZnJhbWVfZHVyKSAqIDEwMCAvIDkpOworCQl9CisJCXBiaS0+bGFzdF9wdHNfdXM2NCA9IHZmLT5wdHNfdXM2NDsKKworCQlpZiAocGJpLT5wdHNfbW9kZSA9PSBQVFNfTk9ORV9SRUZfVVNFX0RVUkFUSU9OKSB7CisJCQl2Zi0+ZGlzcF9wdHMgPSB2Zi0+cHRzOworCQkJdmYtPmRpc3BfcHRzX3VzNjQgPSB2Zi0+cHRzX3VzNjQ7CisJCQl2Zi0+cHRzID0gcHRzX3NhdmU7CisJCQl2Zi0+cHRzX3VzNjQgPSBwdHNfdXM2NF9zYXZlOworCQl9IGVsc2UgeworCQkJdmYtPmRpc3BfcHRzID0gMDsKKwkJCXZmLT5kaXNwX3B0c191czY0ID0gMDsKKwkJfQorCisJCXZmLT5pbmRleCA9IDB4ZmYwMCB8IHBpY19jb25maWctPmluZGV4OworCisJCWlmIChwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MTApIHsKKwkJCS8qIGRvdWJsZSB3cml0ZSBvbmx5ICovCisJCQl2Zi0+Y29tcEJvZHlBZGRyID0gMDsKKwkJCXZmLT5jb21wSGVhZEFkZHIgPSAwOworI2lmZGVmIFZQOV8xMEJfTU1VX0RXCisJCQl2Zi0+ZHdCb2R5QWRkciA9IDA7CisJCQl2Zi0+ZHdIZWFkQWRkciA9IDA7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCWlmIChwYmktPm1tdV9lbmFibGUpIHsKKwkJCQl2Zi0+Y29tcEJvZHlBZGRyID0gMDsKKwkJCQl2Zi0+Y29tcEhlYWRBZGRyID0gcGljX2NvbmZpZy0+aGVhZGVyX2FkcjsKKyNpZmRlZiBWUDlfMTBCX01NVV9EVworCQkJCXZmLT5kd0JvZHlBZGRyID0gMDsKKwkJCQl2Zi0+ZHdIZWFkQWRkciA9IDA7CisJCQkJaWYgKHBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlICYgMHgyMCkgeworCQkJCQl1MzIgbW9kZSA9IHBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlICYgMHhmOworCQkJCQlpZiAobW9kZSA9PSA1IHx8IG1vZGUgPT0gMykKKwkJCQkJCXZmLT5kd0hlYWRBZGRyID0gcGljX2NvbmZpZy0+aGVhZGVyX2R3X2FkcjsKKwkJCQkJZWxzZSBpZiAoKG1vZGUgPT0gMSB8fCBtb2RlID09IDIgfHwgbW9kZSA9PSA0KQorCQkJCQkmJiAoZGVidWcgJiBWUDlfREVCVUdfT1VUX1BUUykgPT0gMCkgeworCQkJCQkJdmYtPmNvbXBIZWFkQWRkciA9IHBpY19jb25maWctPmhlYWRlcl9kd19hZHI7CisJCQkJCQlwcl9kZWJ1ZygiVXNlIGR3IG1tdSBmb3IgZGlzcGxheVxuIik7CisJCQkJCX0KKwkJCQl9CisjZW5kaWYKKwkJCX0gZWxzZSB7CisJCQkJLyp2Zi0+Y29tcEJvZHlBZGRyID0gcGljX2NvbmZpZy0+bWNfeV9hZHI7CisJCQkJICp2Zi0+Y29tcEhlYWRBZGRyID0gcGljX2NvbmZpZy0+bWNfeV9hZHIgKworCQkJCSAqcGljX2NvbmZpZy0+Y29tcF9ib2R5X3NpemU7ICovCisJCQkJLypoZWFkIGFkciovCisJCQl9CisJCQl2Zi0+Y2FudmFzMEFkZHIgPSB2Zi0+Y2FudmFzMUFkZHIgPSAwOworCQl9CisJCWlmIChwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSAmJgorCQkJKHBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlICYgMHgyMCkgPT0gMCkgeworCQkJdmYtPnR5cGUgPSBWSURUWVBFX1BST0dSRVNTSVZFIHwKKwkJCQlWSURUWVBFX1ZJVV9GSUVMRDsKKwkJCXZmLT50eXBlIHw9IG52X29yZGVyOworCQkJaWYgKChwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSA9PSAzIHx8CisJCQkJcGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGUgPT0gNSkgJiYKKwkJCQkoIUlTXzhLX1NJWkUocGljX2NvbmZpZy0+eV9jcm9wX3dpZHRoLAorCQkJCXBpY19jb25maWctPnlfY3JvcF9oZWlnaHQpKSkgeworCQkJCXZmLT50eXBlIHw9IFZJRFRZUEVfQ09NUFJFU1M7CisJCQkJaWYgKHBiaS0+bW11X2VuYWJsZSkKKwkJCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9TQ0FUVEVSOworCQkJfQorI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwkJCWlmIChwYmktPm1faW5zX2ZsYWcpIHsKKwkJCQl2Zi0+Y2FudmFzMEFkZHIgPSB2Zi0+Y2FudmFzMUFkZHIgPSAtMTsKKwkJCQl2Zi0+cGxhbmVfbnVtID0gMjsKKwkJCQl2Zi0+Y2FudmFzMF9jb25maWdbMF0gPQorCQkJCQlwaWNfY29uZmlnLT5jYW52YXNfY29uZmlnWzBdOworCQkJCXZmLT5jYW52YXMwX2NvbmZpZ1sxXSA9CisJCQkJCXBpY19jb25maWctPmNhbnZhc19jb25maWdbMV07CisJCQkJdmYtPmNhbnZhczFfY29uZmlnWzBdID0KKwkJCQkJcGljX2NvbmZpZy0+Y2FudmFzX2NvbmZpZ1swXTsKKwkJCQl2Zi0+Y2FudmFzMV9jb25maWdbMV0gPQorCQkJCQlwaWNfY29uZmlnLT5jYW52YXNfY29uZmlnWzFdOworCisJCQl9IGVsc2UKKyNlbmRpZgorCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9CisJCQkJCXNwZWMyY2FudmFzKHBpY19jb25maWcpOworCQl9IGVsc2UgeworCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0gMDsKKwkJCXZmLT50eXBlID0gVklEVFlQRV9DT01QUkVTUyB8IFZJRFRZUEVfVklVX0ZJRUxEOworCQkJaWYgKHBiaS0+bW11X2VuYWJsZSkKKwkJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX1NDQVRURVI7CisJCX0KKworCQlzd2l0Y2ggKHBpY19jb25maWctPmJpdF9kZXB0aCkgeworCQljYXNlIFZQWF9CSVRTXzg6CisJCQl2Zi0+Yml0ZGVwdGggPSBCSVRERVBUSF9ZOCB8CisJCQkJQklUREVQVEhfVTggfCBCSVRERVBUSF9WODsKKwkJCWJyZWFrOworCQljYXNlIFZQWF9CSVRTXzEwOgorCQljYXNlIFZQWF9CSVRTXzEyOgorCQkJdmYtPmJpdGRlcHRoID0gQklUREVQVEhfWTEwIHwKKwkJCQlCSVRERVBUSF9VMTAgfCBCSVRERVBUSF9WMTA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXZmLT5iaXRkZXB0aCA9IEJJVERFUFRIX1kxMCB8CisJCQkJQklUREVQVEhfVTEwIHwgQklUREVQVEhfVjEwOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCh2Zi0+dHlwZSAmIFZJRFRZUEVfQ09NUFJFU1MpID09IDApCisJCQl2Zi0+Yml0ZGVwdGggPQorCQkJCUJJVERFUFRIX1k4IHwgQklUREVQVEhfVTggfCBCSVRERVBUSF9WODsKKwkJaWYgKHBpY19jb25maWctPmJpdF9kZXB0aCA9PSBWUFhfQklUU184KQorCQkJdmYtPmJpdGRlcHRoIHw9IEJJVERFUFRIX1NBVklOR19NT0RFOworCisJCXZmLT53aWR0aCA9IHBpY19jb25maWctPnlfY3JvcF93aWR0aCAvCisJCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKAorCQkJCXBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlICYgMHhmKTsKKwkJdmYtPmhlaWdodCA9IHBpY19jb25maWctPnlfY3JvcF9oZWlnaHQgLworCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbygKKwkJCQlwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4Zik7CisJCWlmIChmb3JjZV93X2ggIT0gMCkgeworCQkJdmYtPndpZHRoID0gKGZvcmNlX3dfaCA+PiAxNikgJiAweGZmZmY7CisJCQl2Zi0+aGVpZ2h0ID0gZm9yY2Vfd19oICYgMHhmZmZmOworCQl9CisJCWlmICgocGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDIwKSAmJgorCQkJKChwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4ZikgPT0gMiB8fAorCQkJKHBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlICYgMHhmKSA9PSA0KSkgeworCQkJdmYtPmNvbXBXaWR0aCA9IHBpY19jb25maWctPnlfY3JvcF93aWR0aCAvCisJCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbygKKwkJCQkJcGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweGYpOworCQkJdmYtPmNvbXBIZWlnaHQgPSBwaWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0IC8KKwkJCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKAorCQkJCQlwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4Zik7CisJCX0gZWxzZSB7CisJCQl2Zi0+Y29tcFdpZHRoID0gcGljX2NvbmZpZy0+eV9jcm9wX3dpZHRoOworCQkJdmYtPmNvbXBIZWlnaHQgPSBwaWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0OworCQl9CisJCXNldF9mcmFtZV9pbmZvKHBiaSwgdmYpOworCQlpZiAoZm9yY2VfZnBzICYgMHgxMDApIHsKKwkJCXUzMiByYXRlID0gZm9yY2VfZnBzICYgMHhmZjsKKworCQkJaWYgKHJhdGUpCisJCQkJdmYtPmR1cmF0aW9uID0gOTYwMDAvcmF0ZTsKKwkJCWVsc2UKKwkJCQl2Zi0+ZHVyYXRpb24gPSAwOworCQl9CisJCXVwZGF0ZV92Zl9tZW1oYW5kbGUocGJpLCB2ZiwgcGljX2NvbmZpZyk7CisJCWlmICh2ZGVjX3N0cmVhbV9iYXNlZChwdmRlYykgJiYgKCFwdmRlYy0+dmJ1Zi51c2VfcHRzc2VydikpIHsKKwkJCXZmLT5wdHNfdXM2NCA9IHN0cmVhbV9vZmZzZXQ7CisJCQl2Zi0+cHRzID0gMDsKKwkJfQorCQlpZiAoKGRlYnVnICYgVlA5X0RFQlVHX09VVF9QVFMpICE9IDApIHsKKwkJCXByX2luZm8KKwkJCSgiVlA5IGRlYyBvdXQgcHRzOiBwdHNfbW9kZT0lZCxkdXI9JWQscHRzKCVkLCVsbGQsJWxsZCkoJWQsJWxsZClcbiIsCisJCQlwYmktPnB0c19tb2RlLCBwYmktPmZyYW1lX2R1ciwgdmYtPnB0cywKKwkJCXZmLT5wdHNfdXM2NCwgdmYtPnRpbWVzdGFtcCwgcHRzX3NhdmUsCisJCQlwdHNfdXM2NF9zYXZlKTsKKwkJfQorCQlpZiAoIShwaWNfY29uZmlnLT55X2Nyb3Bfd2lkdGggPT0gMTk2CisJCSYmIHBpY19jb25maWctPnlfY3JvcF9oZWlnaHQgPT0gMTk2CisJCSYmIChkZWJ1ZyAmIFZQOV9ERUJVR19OT19UUklHR0VSX0ZSQU1FKSA9PSAwCisJCSYmIChnZXRfY3B1X21ham9yX2lkKCkgPCBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVFhMWCkpKSB7CisJCQlzdHJ1Y3QgdmRlY19pbmZvIHRtcDR4OworCisJCQlpbmNfdmZfcmVmKHBiaSwgcGljX2NvbmZpZy0+aW5kZXgpOworCQkJZGVjb2Rlcl9kb19mcmFtZV9jaGVjayhwdmRlYywgdmYpOworCQkJdmRlY192ZnJhbWVfcmVhZHkocHZkZWMsIHZmKTsKKwkJCWtmaWZvX3B1dCgmcGJpLT5kaXNwbGF5X3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCQlBVFJBQ0VfQ09VTlRFUihwYmktPnRyYWNlLnB0c19uYW1lLCB2Zi0+cHRzKTsKKwkJCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UubmV3X3FfbmFtZSwga2ZpZm9fbGVuKCZwYmktPm5ld2ZyYW1lX3EpKTsKKwkJCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UuZGlzcF9xX25hbWUsIGtmaWZvX2xlbigmcGJpLT5kaXNwbGF5X3EpKTsKKwkJCXBiaS0+dmZfcHJlX2NvdW50Kys7CisJCQlwYmlfdXBkYXRlX2d2cyhwYmksIHBpY19jb25maWcpOworCQkJLypjb3VudCBpbmZvKi8KKwkJCXZkZWNfY291bnRfaW5mbyhwYmktPmd2cywgMCwgc3RyZWFtX29mZnNldCk7CisJCQlpZiAoc3RyZWFtX29mZnNldCkgeworCQkJCWlmIChzbGljZV90eXBlID09IEtFWV9GUkFNRSkgeworCQkJCQlwYmktPmd2cy0+aV9kZWNvZGVkX2ZyYW1lcysrOworCQkJCX0gZWxzZSBpZiAoc2xpY2VfdHlwZSA9PSBJTlRFUl9GUkFNRSkgeworCQkJCQlwYmktPmd2cy0+cF9kZWNvZGVkX2ZyYW1lcysrOworCQkJCX0gZWxzZSBpZiAoc2xpY2VfdHlwZSA9PSBGUkFNRV9UWVBFUykgeworCQkJCQlwYmktPmd2cy0+Yl9kZWNvZGVkX2ZyYW1lcysrOworCQkJCX0KKwkJCX0KKwkJCW1lbWNweSgmdG1wNHgsIHBiaS0+Z3ZzLCBzaXplb2Yoc3RydWN0IHZkZWNfaW5mbykpOworCQkJdG1wNHguYml0X2RlcHRoX2x1bWEgPSBwYmktPnZwOV9wYXJhbS5wLmJpdF9kZXB0aDsKKwkJCXRtcDR4LmJpdF9kZXB0aF9jaHJvbWEgPSBwYmktPnZwOV9wYXJhbS5wLmJpdF9kZXB0aDsKKwkJCXRtcDR4LmRvdWJsZV93cml0ZV9tb2RlID0gcGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGU7CisJCQl2ZGVjX2ZpbGxfdmRlY19mcmFtZShwdmRlYywgJnBiaS0+dmZyYW1lX3FvcywgJnRtcDR4LAorCQkJCXZmLCBwaWNfY29uZmlnLT5od19kZWNvZGVfdGltZSk7CisJCQlwdmRlYy0+dmRlY19mcHNfZGV0ZWMocHZkZWMtPmlkKTsKKwkJCWlmICh3aXRob3V0X2Rpc3BsYXlfbW9kZSA9PSAwKSB7CisJCQkJaWYgKHBiaS0+aXNfdXNlZF92NGwpIHsKKwkJCQkJaWYgKHY0bDJfY3R4LT5pc19zdHJlYW1fb2ZmKSB7CisJCQkJCQl2dnA5X3ZmX3B1dCh2dnA5X3ZmX2dldChwYmkpLCBwYmkpOworCQkJCQl9IGVsc2UgeworCQkJCQkJZmItPnRhc2stPnN1Ym1pdChmYi0+dGFzaywgVEFTS19UWVBFX0RFQyk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIocGJpLT5wcm92aWRlcl9uYW1lLAorCQkJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1ZGUkFNRV9SRUFEWSwgTlVMTCk7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJdnZwOV92Zl9wdXQodnZwOV92Zl9nZXQocGJpKSwgcGJpKTsKKwkJfSBlbHNlIHsKKwkJCXBiaS0+c3RhdCB8PSBWUDlfVFJJR0dFUl9GUkFNRV9ET05FOworCQkJaGV2Y19zb3VyY2VfY2hhbmdlZChWRk9STUFUX1ZQOSwgMTk2LCAxOTYsIDMwKTsKKwkJCXByX2RlYnVnKCJbJXMgJWRdIGRyb3AgdHJpZ2dlciBmcmFtZSB3aWR0aCAlZCBoZWlnaHQgJWQgIHN0YXRlIDB4JXhcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fLCB2Zi0+d2lkdGgsCisJCQkJdmYtPmhlaWdodCwgcGJpLT5zdGF0KTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5vdGlmeV92NGxfZW9zKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IFZQOURlY29kZXJfcyAqaHcgPSAoc3RydWN0IFZQOURlY29kZXJfcyAqKXZkZWMtPnByaXZhdGU7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPSAoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisJc3RydWN0IHZmcmFtZV9zICp2ZiA9ICZody0+dmZyYW1lX2R1bW15OworCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9IE5VTEw7CisJaW50IGluZGV4ID0gSU5WQUxJRF9JRFg7CisJdWxvbmcgZXhwaXJlczsKKworCWlmIChody0+ZW9zKSB7CisJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCWV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMDAwKTsKKwkJCXdoaWxlIChJTlZBTElEX0lEWCA9PSAoaW5kZXggPSB2NGxfZ2V0X2ZyZWVfZmIoaHcpKSkgeworCQkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGV4cGlyZXMpIHx8CisJCQkJCXY0bDJfbTJtX251bV9kc3RfYnVmc19yZWFkeShjdHgtPm0ybV9jdHgpKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKGluZGV4ID09IElOVkFMSURfSURYKSB7CisJCQkJY3R4LT5mYl9vcHMucXVlcnkoJmN0eC0+ZmJfb3BzLCAmaHctPmZiX3Rva2VuKTsKKwkJCQlpZiAoY3R4LT5mYl9vcHMuYWxsb2MoJmN0eC0+ZmJfb3BzLCBody0+ZmJfdG9rZW4sICZmYiwgQU1MX0ZCX1JFUV9ERUMpIDwgMCkgeworCQkJCQlwcl9lcnIoIlslZF0gRU9TIGdldCBmcmVlIGJ1ZmYgZmFpbC5cbiIsIGN0eC0+aWQpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJfQorCQl9CisKKwkJdmYtPnR5cGUJCXw9IFZJRFRZUEVfVjRMX0VPUzsKKwkJdmYtPnRpbWVzdGFtcAkJPSBVTE9OR19NQVg7CisJCXZmLT5mbGFnCQk9IFZGUkFNRV9GTEFHX0VNUFRZX0ZSQU1FX1Y0TDsKKwkJdmYtPnY0bF9tZW1faGFuZGxlCT0gKGluZGV4ID09IElOVkFMSURfSURYKSA/ICh1bG9uZylmYiA6CisJCQkJCWh3LT5tX0JVRltpbmRleF0udjRsX3JlZl9idWZfYWRkcjsKKwkJZmIgPSAoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKil2Zi0+djRsX21lbV9oYW5kbGU7CisKKwkJdmRlY192ZnJhbWVfcmVhZHkodmRlYywgdmYpOworCQlrZmlmb19wdXQoJmh3LT5kaXNwbGF5X3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisKKwkJaWYgKGh3LT5pc191c2VkX3Y0bCkKKwkJCWZiLT50YXNrLT5zdWJtaXQoZmItPnRhc2ssIFRBU0tfVFlQRV9ERUMpOworCQllbHNlCisJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIodmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfVkZSQU1FX1JFQURZLCBOVUxMKTsKKworCQlwcl9pbmZvKCJbJWRdIFZQOSBFT1Mgbm90aWZ5LlxuIiwgKGh3LT5pc191c2VkX3Y0bCk/Y3R4LT5pZDp2ZGVjLT5pZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9ycG1fcGFyYW0odW5pb24gcGFyYW1fdSAqcGFyYW1zKQoreworCWludCBpOworCXVuc2lnbmVkIGludCBkYXRhMzI7CisKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfQlVGTUdSKQorCQlwcl9pbmZvKCJlbnRlciAlc1xyXG4iLCBfX2Z1bmNfXyk7CisJZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7CisJCWRvIHsKKwkJCWRhdGEzMiA9IFJFQURfVlJFRyhSUE1fQ01EX1JFRyk7CisJCQkvKnByX2luZm8oIiV4XG4iLCBkYXRhMzIpOyovCisJCX0gd2hpbGUgKChkYXRhMzIgJiAweDEwMDAwKSA9PSAwKTsKKwkJcGFyYW1zLT5sLmRhdGFbaV0gPSBkYXRhMzImMHhmZmZmOworCQkvKnByX2luZm8oIiV4XG4iLCBkYXRhMzIpOyovCisJCVdSSVRFX1ZSRUcoUlBNX0NNRF9SRUcsIDApOworCX0KKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfQlVGTUdSKQorCQlwcl9pbmZvKCJsZWF2ZSAlc1xyXG4iLCBfX2Z1bmNfXyk7Cit9CitzdGF0aWMgdm9pZCBkZWJ1Z19idWZmZXJfbWdyX21vcmUoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCWludCBpOworCisJaWYgKCEoZGVidWcgJiBWUDlfREVCVUdfQlVGTUdSX01PUkUpKQorCQlyZXR1cm47CisJcHJfaW5mbygidnA5X3BhcmFtOiAoJWQpXG4iLCBwYmktPnNsaWNlX2lkeCk7CisJZm9yIChpID0gMDsgaSA8IChSUE1fRU5ELVJQTV9CRUdJTik7IGkrKykgeworCQlwcl9pbmZvKCIlMDR4ICIsIHBiaS0+dnA5X3BhcmFtLmwuZGF0YVtpXSk7CisJCWlmICgoKGkgKyAxKSAmIDB4ZikgPT0gMCkKKwkJCXByX2luZm8oIlxuIik7CisJfQorCXByX2luZm8oIj09PT09PT09PT09PT1wYXJhbT09PT09PT09PT1cclxuIik7CisJcHJfaW5mbygicHJvZmlsZSAgICAgICAgICAgICAgICV4XHJcbiIsIHBiaS0+dnA5X3BhcmFtLnAucHJvZmlsZSk7CisJcHJfaW5mbygic2hvd19leGlzdGluZ19mcmFtZSAgICV4XHJcbiIsCisJcGJpLT52cDlfcGFyYW0ucC5zaG93X2V4aXN0aW5nX2ZyYW1lKTsKKwlwcl9pbmZvKCJmcmFtZV90b19zaG93X2lkeCAgICAgJXhcclxuIiwKKwlwYmktPnZwOV9wYXJhbS5wLmZyYW1lX3RvX3Nob3dfaWR4KTsKKwlwcl9pbmZvKCJmcmFtZV90eXBlICAgICAgICAgICAgJXhcclxuIiwgcGJpLT52cDlfcGFyYW0ucC5mcmFtZV90eXBlKTsKKwlwcl9pbmZvKCJzaG93X2ZyYW1lICAgICAgICAgICAgJXhcclxuIiwgcGJpLT52cDlfcGFyYW0ucC5zaG93X2ZyYW1lKTsKKwlwcl9pbmZvKCJlLnIuci5vLnJfcmVzaWxpZW50X21vZGUgICV4XHJcbiIsCisJcGJpLT52cDlfcGFyYW0ucC5lcnJvcl9yZXNpbGllbnRfbW9kZSk7CisJcHJfaW5mbygiaW50cmFfb25seSAgICAgICAgICAgICV4XHJcbiIsIHBiaS0+dnA5X3BhcmFtLnAuaW50cmFfb25seSk7CisJcHJfaW5mbygiZGlzcGxheV9zaXplX3ByZXNlbnQgICV4XHJcbiIsCisJcGJpLT52cDlfcGFyYW0ucC5kaXNwbGF5X3NpemVfcHJlc2VudCk7CisJcHJfaW5mbygicmVzZXRfZnJhbWVfY29udGV4dCAgICV4XHJcbiIsCisJcGJpLT52cDlfcGFyYW0ucC5yZXNldF9mcmFtZV9jb250ZXh0KTsKKwlwcl9pbmZvKCJyZWZyZXNoX2ZyYW1lX2ZsYWdzICAgJXhcclxuIiwKKwlwYmktPnZwOV9wYXJhbS5wLnJlZnJlc2hfZnJhbWVfZmxhZ3MpOworCXByX2luZm8oImJpdF9kZXB0aCAgICAgICAgICAgICAleFxyXG4iLCBwYmktPnZwOV9wYXJhbS5wLmJpdF9kZXB0aCk7CisJcHJfaW5mbygid2lkdGggICAgICAgICAgICAgICAgICV4XHJcbiIsIHBiaS0+dnA5X3BhcmFtLnAud2lkdGgpOworCXByX2luZm8oImhlaWdodCAgICAgICAgICAgICAgICAleFxyXG4iLCBwYmktPnZwOV9wYXJhbS5wLmhlaWdodCk7CisJcHJfaW5mbygiZGlzcGxheV93aWR0aCAgICAgICAgICV4XHJcbiIsIHBiaS0+dnA5X3BhcmFtLnAuZGlzcGxheV93aWR0aCk7CisJcHJfaW5mbygiZGlzcGxheV9oZWlnaHQgICAgICAgICV4XHJcbiIsIHBiaS0+dnA5X3BhcmFtLnAuZGlzcGxheV9oZWlnaHQpOworCXByX2luZm8oInJlZl9pbmZvICAgICAgICAgICAgICAleFxyXG4iLCBwYmktPnZwOV9wYXJhbS5wLnJlZl9pbmZvKTsKKwlwcl9pbmZvKCJzYW1lX2ZyYW1lX3NpemUgICAgICAgJXhcclxuIiwgcGJpLT52cDlfcGFyYW0ucC5zYW1lX2ZyYW1lX3NpemUpOworCWlmICghKGRlYnVnICYgVlA5X0RFQlVHX0RCR19MRl9QUklOVCkpCisJCXJldHVybjsKKwlwcl9pbmZvKCJtb2RlX3JlZl9kZWx0YV9lbmFibGVkOiAweCV4XHJcbiIsCisJcGJpLT52cDlfcGFyYW0ucC5tb2RlX3JlZl9kZWx0YV9lbmFibGVkKTsKKwlwcl9pbmZvKCJzaGFycG5lc3NfbGV2ZWw6IDB4JXhcclxuIiwKKwlwYmktPnZwOV9wYXJhbS5wLnNoYXJwbmVzc19sZXZlbCk7CisJcHJfaW5mbygicmVmX2RlbHRhczogMHgleCwgMHgleCwgMHgleCwgMHgleFxyXG4iLAorCXBiaS0+dnA5X3BhcmFtLnAucmVmX2RlbHRhc1swXSwgcGJpLT52cDlfcGFyYW0ucC5yZWZfZGVsdGFzWzFdLAorCXBiaS0+dnA5X3BhcmFtLnAucmVmX2RlbHRhc1syXSwgcGJpLT52cDlfcGFyYW0ucC5yZWZfZGVsdGFzWzNdKTsKKwlwcl9pbmZvKCJtb2RlX2RlbHRhczogMHgleCwgMHgleFxyXG4iLCBwYmktPnZwOV9wYXJhbS5wLm1vZGVfZGVsdGFzWzBdLAorCXBiaS0+dnA5X3BhcmFtLnAubW9kZV9kZWx0YXNbMV0pOworCXByX2luZm8oImZpbHRlcl9sZXZlbDogMHgleFxyXG4iLCBwYmktPnZwOV9wYXJhbS5wLmZpbHRlcl9sZXZlbCk7CisJcHJfaW5mbygic2VnX2VuYWJsZWQ6IDB4JXhcclxuIiwgcGJpLT52cDlfcGFyYW0ucC5zZWdfZW5hYmxlZCk7CisJcHJfaW5mbygic2VnX2Fic19kZWx0YTogMHgleFxyXG4iLCBwYmktPnZwOV9wYXJhbS5wLnNlZ19hYnNfZGVsdGEpOworCXByX2luZm8oInNlZ19sZl9mZWF0dXJlX2VuYWJsZWQ6IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleFxyXG4iLAorCShwYmktPnZwOV9wYXJhbS5wLnNlZ19sZl9pbmZvWzBdPj4xNSAmIDEpLAorCShwYmktPnZwOV9wYXJhbS5wLnNlZ19sZl9pbmZvWzFdPj4xNSAmIDEpLAorCShwYmktPnZwOV9wYXJhbS5wLnNlZ19sZl9pbmZvWzJdPj4xNSAmIDEpLAorCShwYmktPnZwOV9wYXJhbS5wLnNlZ19sZl9pbmZvWzNdPj4xNSAmIDEpLAorCShwYmktPnZwOV9wYXJhbS5wLnNlZ19sZl9pbmZvWzRdPj4xNSAmIDEpLAorCShwYmktPnZwOV9wYXJhbS5wLnNlZ19sZl9pbmZvWzVdPj4xNSAmIDEpLAorCShwYmktPnZwOV9wYXJhbS5wLnNlZ19sZl9pbmZvWzZdPj4xNSAmIDEpLAorCShwYmktPnZwOV9wYXJhbS5wLnNlZ19sZl9pbmZvWzddPj4xNSAmIDEpKTsKKwlwcl9pbmZvKCJzZWdfbGZfZmVhdHVyZV9kYXRhOiAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXhcclxuIiwKKwkocGJpLT52cDlfcGFyYW0ucC5zZWdfbGZfaW5mb1swXSAmIDB4MTNmKSwKKwkocGJpLT52cDlfcGFyYW0ucC5zZWdfbGZfaW5mb1sxXSAmIDB4MTNmKSwKKwkocGJpLT52cDlfcGFyYW0ucC5zZWdfbGZfaW5mb1syXSAmIDB4MTNmKSwKKwkocGJpLT52cDlfcGFyYW0ucC5zZWdfbGZfaW5mb1szXSAmIDB4MTNmKSwKKwkocGJpLT52cDlfcGFyYW0ucC5zZWdfbGZfaW5mb1s0XSAmIDB4MTNmKSwKKwkocGJpLT52cDlfcGFyYW0ucC5zZWdfbGZfaW5mb1s1XSAmIDB4MTNmKSwKKwkocGJpLT52cDlfcGFyYW0ucC5zZWdfbGZfaW5mb1s2XSAmIDB4MTNmKSwKKwkocGJpLT52cDlfcGFyYW0ucC5zZWdfbGZfaW5mb1s3XSAmIDB4MTNmKSk7CisKK30KKworc3RhdGljIGludCByZWN5Y2xlX21tdV9idWZfdGFpbChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksCisJCWJvb2wgY2hlY2tfZG1hKQoreworCXN0cnVjdCBWUDlfQ29tbW9uX3MgKmNvbnN0IGNtID0gJnBiaS0+Y29tbW9uOworCisJaWYgKHBiaS0+dXNlZF80a19udW0gPT0gLTEpIHsKKwkJcGJpLT51c2VkXzRrX251bSA9CisJCQlSRUFEX1ZSRUcoSEVWQ19TQU9fTU1VX1NUQVRVUykgPj4gMTY7CisJfQorCXZwOV9wcmludChwYmksIFZQOV9ERUJVR19CVUZNR1JfTU9SRSwKKwkJInBpYyBpbmRleCAlZCBwYWdlX3N0YXJ0ICVkXG4iLAorCQljbS0+Y3VyX2ZiX2lkeF9tbXUsIHBiaS0+dXNlZF80a19udW0pOworCisJaWYgKGNoZWNrX2RtYSkKKwkJaGV2Y19tbXVfZG1hX2NoZWNrKGh3X3RvX3ZkZWMocGJpKSk7CisKKwlpZiAocGJpLT5pc191c2VkX3Y0bCkgeworCQlpbnQgaW5kZXggPSBjbS0+Y3VyX2ZiX2lkeF9tbXU7CisJCXN0cnVjdCBpbnRlcm5hbF9jb21wX2J1ZiAqaWJ1ZiA9CisJCQlpbmRleF90b19pY29tcF9idWYocGJpLCBpbmRleCk7CisKKwkJZGVjb2Rlcl9tbXVfYm94X2ZyZWVfaWR4X3RhaWwoCisJCQkJaWJ1Zi0+bW11X2JveCwKKwkJCQlpYnVmLT5pbmRleCwKKwkJCQlwYmktPnVzZWRfNGtfbnVtKTsKKwl9IGVsc2UgeworCQlkZWNvZGVyX21tdV9ib3hfZnJlZV9pZHhfdGFpbCgKKwkJCQlwYmktPm1tdV9ib3gsCisJCQkJY20tPmN1cl9mYl9pZHhfbW11LAorCQkJCXBiaS0+dXNlZF80a19udW0pOworCX0KKworCWNtLT5jdXJfZmJfaWR4X21tdSA9IElOVkFMSURfSURYOworCXBiaS0+dXNlZF80a19udW0gPSAtMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2cDlfcmVjeWNsZV9tbXVfYnVmX3RhaWwoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCXN0cnVjdCBWUDlfQ29tbW9uX3MgKmNvbnN0IGNtID0gJnBiaS0+Y29tbW9uOworCWlmIChwYmktPmRvdWJsZV93cml0ZV9tb2RlICYgMHgxMCkKKwkJcmV0dXJuOworCWlmIChjbS0+Y3VyX2ZiX2lkeF9tbXUgIT0gSU5WQUxJRF9JRFgpIHsKKwkJcmVjeWNsZV9tbXVfYnVmX3RhaWwocGJpLAorCQkJKChwYmktPnVzZWRfNGtfbnVtID09IC0xKSAmJgorCQkJcGJpLT5tX2luc19mbGFnKSA/IDEgOiAwKTsKKwl9Cit9CisKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCitzdGF0aWMgdm9pZCB2cDlfcmVjeWNsZV9tbXVfYnVmKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjb25zdCBjbSA9ICZwYmktPmNvbW1vbjsKKworCWlmIChwYmktPmlzX3VzZWRfdjRsKQorCQlyZXR1cm47CisKKwlpZiAocGJpLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MTApCisJCXJldHVybjsKKwlpZiAoY20tPmN1cl9mYl9pZHhfbW11ICE9IElOVkFMSURfSURYKSB7CisJCWRlY29kZXJfbW11X2JveF9mcmVlX2lkeChwYmktPm1tdV9ib3gsCisJCQljbS0+Y3VyX2ZiX2lkeF9tbXUpOworCisJCWNtLT5jdXJfZmJfaWR4X21tdSA9IElOVkFMSURfSURYOworCQlwYmktPnVzZWRfNGtfbnVtID0gLTE7CisJfQorfQorCit2b2lkIHZwOV9yZWN5Y2xlX21tdV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkgPSBjb250YWluZXJfb2Yod29yaywKKwkJc3RydWN0IFZQOURlY29kZXJfcywgcmVjeWNsZV9tbXVfd29yayk7CisKKwlpZiAocGJpKQorCQl2cDlfcmVjeWNsZV9tbXVfYnVmKHBiaSk7Cit9CisjZW5kaWYKKworCitzdGF0aWMgdm9pZCBkZWNfYWdhaW5fcHJvY2VzcyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJYW1oZXZjX3N0b3AoKTsKKwlwYmktPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0FHQUlOOworCWlmIChwYmktPnByb2Nlc3Nfc3RhdGUgPT0KKwkJUFJPQ19TVEFURV9ERUNPREVTTElDRSkgeworCQlwYmktPnByb2Nlc3Nfc3RhdGUgPQorCQlQUk9DX1NUQVRFX1NFTkRBR0FJTjsKKwkJaWYgKHBiaS0+bW11X2VuYWJsZSkgeworCQkJLyoKKwkJCSAqIEJlY2F1c2UgdnA5X3JlY3ljbGVfbW11X2J1ZiBoYXMgc2xlZXAgZnVuY3Rpb24sd2UgY2FuJ3QKKwkJCSAqIGNhbGwgaXQgZGlyZWN0bHkuIFVzZSBhIHJlY3ljbGVfbW11X3dvcmsgdG8gc3Vic3RpdHVkZSBpdC4KKwkJCSAqLworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZwYmktPnJlY3ljbGVfbW11X3dvcmspOworCQl9CisJfQorCXJlc2V0X3Byb2Nlc3NfdGltZShwYmkpOworCXZkZWNfc2NoZWR1bGVfd29yaygmcGJpLT53b3JrKTsKK30KKworaW50IGNvbnRpbnVlX2RlY29kaW5nKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlpbnQgcmV0OworCWludCBpOworCXN0cnVjdCBWUDlfQ29tbW9uX3MgKmNvbnN0IGNtID0gJnBiaS0+Y29tbW9uOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShwYmktPnY0bDJfY3R4KTsKKwlkZWJ1Z19idWZmZXJfbWdyX21vcmUocGJpKTsKKworCWlmIChwYmktPmlzX3VzZWRfdjRsICYmIGN0eC0+cGFyYW1fc2V0c19mcm9tX3Vjb2RlKQorCQlwYmktPnJlc19jaF9mbGFnID0gMDsKKwliaXRfZGVwdGhfbHVtYSA9IHBiaS0+dnA5X3BhcmFtLnAuYml0X2RlcHRoOworCWJpdF9kZXB0aF9jaHJvbWEgPSBwYmktPnZwOV9wYXJhbS5wLmJpdF9kZXB0aDsKKworCWlmICgocGJpLT52cDlfcGFyYW0ucC5iaXRfZGVwdGggPj0gVlBYX0JJVFNfMTApICYmCisJCShnZXRfZG91YmxlX3dyaXRlX21vZGUocGJpKSA9PSAweDEwKSkgeworCQlwYmktPmZhdGFsX2Vycm9yIHw9IERFQ09ERVJfRkFUQUxfRVJST1JfU0laRV9PVkVSRkxPVzsKKwkJcHJfZXJyKCJmYXRhbCBlcnIsIGJpdF9kZXB0aCAlZCwgdW5zdXBwb3J0IGR3IDB4MTBcbiIsCisJCQlwYmktPnZwOV9wYXJhbS5wLmJpdF9kZXB0aCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAocGJpLT5wcm9jZXNzX3N0YXRlICE9IFBST0NfU1RBVEVfU0VOREFHQUlOKSB7CisJCXJldCA9IHZwOV9idWZtZ3JfcHJvY2VzcyhwYmksICZwYmktPnZwOV9wYXJhbSk7CisJCWlmICghcGJpLT5tX2luc19mbGFnKQorCQkJcGJpLT5zbGljZV9pZHgrKzsKKwl9IGVsc2UgeworCQl1bmlvbiBwYXJhbV91ICpwYXJhbXMgPSAmcGJpLT52cDlfcGFyYW07CisJCWlmIChwYmktPm1tdV9lbmFibGUgJiYgKChwYmktPmRvdWJsZV93cml0ZV9tb2RlICYgMHgxMCkgPT0gMCkpIHsKKwkJCXJldCA9IHZwOV9hbGxvY19tbXUocGJpLAorCQkJCWNtLT5uZXdfZmJfaWR4LAorCQkJCXBhcmFtcy0+cC53aWR0aCwKKwkJCQlwYXJhbXMtPnAuaGVpZ2h0LAorCQkJCXBhcmFtcy0+cC5iaXRfZGVwdGgsCisJCQkJcGJpLT5mcmFtZV9tbXVfbWFwX2FkZHIpOworCQkJaWYgKHJldCA+PSAwKQorCQkJCWNtLT5jdXJfZmJfaWR4X21tdSA9IGNtLT5uZXdfZmJfaWR4OworCQkJZWxzZQorCQkJCXByX2VycigiY2FuJ3QgYWxsb2MgbmVlZCBtbXUxLGlkeCAlZCByZXQgPSVkXG4iLAorCQkJCQljbS0+bmV3X2ZiX2lkeCwKKwkJCQkJcmV0KTsKKworI2lmZGVmIFZQOV8xMEJfTU1VX0RXCisJCQlpZiAocGJpLT5kd19tbXVfZW5hYmxlICYmICgocGJpLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MTApID09IDApKSB7CisJCQkJcmV0ID0gdnA5X2FsbG9jX21tdV9kdyhwYmksCisJCQkJCWNtLT5uZXdfZmJfaWR4LAorCQkJCQlwYXJhbXMtPnAud2lkdGgsCisJCQkJCXBhcmFtcy0+cC5oZWlnaHQsCisJCQkJCXBhcmFtcy0+cC5iaXRfZGVwdGgsCisJCQkJCXBiaS0+ZnJhbWVfbW11X2R3X21hcF9hZGRyKTsKKwkJCQlpZiAocmV0IDwgMCkKKwkJCQkJcHJfZXJyKCJjYW4ndCBhbGxvYyBuZWVkIGR3IG1tdTEsaWR4ICVkIHJldCA9JWRcbiIsCisJCQkJCQljbS0+bmV3X2ZiX2lkeCwKKwkJCQkJCXJldCk7CisJCQl9CisjZW5kaWYKKworCQl9IGVsc2UgeworCQkJcmV0ID0gMDsKKwkJfQorCQlXUklURV9WUkVHKEhFVkNfUEFSU0VSX1BJQ1RVUkVfU0laRSwKKwkJKHBhcmFtcy0+cC5oZWlnaHQgPDwgMTYpIHwgcGFyYW1zLT5wLndpZHRoKTsKKwl9CisJaWYgKHJldCA8IDApIHsKKwkJcHJfaW5mbygidnA5X2J1Zm1ncl9wcm9jZXNzPT4gJWQsIFZQOV8xMEJfRElTQ0FSRF9OQUxcclxuIiwKKwkJIHJldCk7CisJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgVlA5XzEwQl9ESVNDQVJEX05BTCk7CisJCWNtLT5zaG93X2ZyYW1lID0gMDsKKwkJaWYgKHBiaS0+bW11X2VuYWJsZSkgeworCQkJQVRSQUNFX0NPVU5URVIocGJpLT50cmFjZS5kZWNvZGVfaGVhZGVyX21lbW9yeV90aW1lX25hbWUsIFRSQUNFX0hFQURFUl9NRU1PUllfU1RBUlQpOworCQkJdnA5X3JlY3ljbGVfbW11X2J1ZihwYmkpOworCQkJQVRSQUNFX0NPVU5URVIocGJpLT50cmFjZS5kZWNvZGVfaGVhZGVyX21lbW9yeV90aW1lX25hbWUsIFRSQUNFX0hFQURFUl9NRU1PUllfRU5EKTsKKwkJfQorI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwkJaWYgKHBiaS0+bV9pbnNfZmxhZykgeworCQkJcGJpLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKKwkJCWlmIChwYmktPnVzZWRfc3RhZ2VfYnVmX251bSA9PSAwKQorI2VuZGlmCisJCQkJYW1oZXZjX3N0b3AoKTsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmcGJpLT53b3JrKTsKKwkJfQorI2VuZGlmCisJCXJldHVybiByZXQ7CisJfSBlbHNlIGlmIChyZXQgPT0gMCkgeworCQlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqY3VyX3BpY19jb25maWcKKwkJCT0gJmNtLT5jdXJfZnJhbWUtPmJ1ZjsKKwkJY3VyX3BpY19jb25maWctPmRlY29kZV9pZHggPSBwYmktPmZyYW1lX2NvdW50OworCisJCWlmIChwYmktPnByb2Nlc3Nfc3RhdGUgIT0gUFJPQ19TVEFURV9TRU5EQUdBSU4pIHsKKwkJCWlmICghcGJpLT5tX2luc19mbGFnKSB7CisJCQkJcGJpLT5mcmFtZV9jb3VudCsrOworCQkJCWRlY29kZV9mcmFtZV9jb3VudFtwYmktPmluZGV4XQorCQkJCQk9IHBiaS0+ZnJhbWVfY291bnQ7CisJCQl9CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQkJaWYgKHBiaS0+Y2h1bmspIHsKKwkJCQljdXJfcGljX2NvbmZpZy0+cHRzID0gcGJpLT5jaHVuay0+cHRzOworCQkJCWN1cl9waWNfY29uZmlnLT5wdHM2NCA9IHBiaS0+Y2h1bmstPnB0czY0OworCisJCQkJaWYgKHBiaS0+aXNfdXNlZF92NGwgJiYgIXY0bF9iaXRzdHJlYW1faWRfZW5hYmxlKQorCQkJCQljdXJfcGljX2NvbmZpZy0+cHRzNjQgPSBwYmktPmNodW5rLT50aW1lc3RhbXA7CisJCQl9CisjZW5kaWYKKwkJfQorCQkvKnByX2luZm8oIkRlY29kZSBGcmFtZSBEYXRhICVkXG4iLCBwYmktPmZyYW1lX2NvdW50KTsqLworCQlBVFJBQ0VfQ09VTlRFUihwYmktPnRyYWNlLmRlY29kZV9oZWFkZXJfbWVtb3J5X3RpbWVfbmFtZSwgVFJBQ0VfSEVBREVSX1JFR0lTVEVSX1NUQVJUKTsKKwkJY29uZmlnX3BpY19zaXplKHBiaSwgcGJpLT52cDlfcGFyYW0ucC5iaXRfZGVwdGgpOworCisJCWlmICgocGJpLT5jb21tb24uZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUpCisJCQkmJiAoIXBiaS0+Y29tbW9uLmludHJhX29ubHkpKSB7CisJCQljb25maWdfbWNfYnVmZmVyKHBiaSwgcGJpLT52cDlfcGFyYW0ucC5iaXRfZGVwdGgpOworI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKKwkJCWlmIChwYmktPnVzZWRfc3RhZ2VfYnVmX251bSA9PSAwKQorI2VuZGlmCisJCQkJY29uZmlnX21wcmVkX2h3KHBiaSk7CisJCX0gZWxzZSB7CisjaWZkZWYgU1VQUE9SVF9GQl9ERUNPRElORworCQkJaWYgKHBiaS0+dXNlZF9zdGFnZV9idWZfbnVtID09IDApCisjZW5kaWYKKwkJCQljbGVhcl9tcHJlZF9odyhwYmkpOworCQl9CisKKyNpZmRlZiBNQ1JDQ19FTkFCTEUKKwkJaWYgKG1jcmNjX2NhY2hlX2FsZ19mbGFnKQorCQkJY29uZmlnX21jcmNjX2F4aV9od19uZXcocGJpKTsKKwkJZWxzZQorCQkJY29uZmlnX21jcmNjX2F4aV9odyhwYmkpOworI2VuZGlmCisJCWNvbmZpZ19zYW9faHcocGJpLCAmcGJpLT52cDlfcGFyYW0pOworCisjaWZkZWYgVlA5X0xQRl9MVkxfVVBEQVRFCisJCS8qCisJCSogR2V0IGxvb3AgZmlsdGVyIHJlbGF0ZWQgcGljdHVyZSBsZXZlbCBwYXJhbWV0ZXJzIGZyb20gUGFyc2VyCisJCSovCisJCXBiaS0+bGYtPm1vZGVfcmVmX2RlbHRhX2VuYWJsZWQgPSBwYmktPnZwOV9wYXJhbS5wLm1vZGVfcmVmX2RlbHRhX2VuYWJsZWQ7CisJCXBiaS0+bGYtPnNoYXJwbmVzc19sZXZlbCA9IHBiaS0+dnA5X3BhcmFtLnAuc2hhcnBuZXNzX2xldmVsOworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQkJcGJpLT5sZi0+cmVmX2RlbHRhc1tpXSA9IHBiaS0+dnA5X3BhcmFtLnAucmVmX2RlbHRhc1tpXTsKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkJCXBiaS0+bGYtPm1vZGVfZGVsdGFzW2ldID0gcGJpLT52cDlfcGFyYW0ucC5tb2RlX2RlbHRhc1tpXTsKKwkJcGJpLT5kZWZhdWx0X2ZpbHRfbHZsID0gcGJpLT52cDlfcGFyYW0ucC5maWx0ZXJfbGV2ZWw7CisJCXBiaS0+c2VnXzRsZi0+ZW5hYmxlZCA9IHBiaS0+dnA5X3BhcmFtLnAuc2VnX2VuYWJsZWQ7CisJCXBiaS0+c2VnXzRsZi0+YWJzX2RlbHRhID0gcGJpLT52cDlfcGFyYW0ucC5zZWdfYWJzX2RlbHRhOworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1NFR01FTlRTOyBpKyspCisJCQlwYmktPnNlZ180bGYtPmZlYXR1cmVfbWFza1tpXSA9IChwYmktPnZwOV9wYXJhbS5wLnNlZ19sZl9pbmZvW2ldICYKKwkJCTB4ODAwMCkgPyAoMSA8PCBTRUdfTFZMX0FMVF9MRikgOiAwOworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1NFR01FTlRTOyBpKyspCisJCQlwYmktPnNlZ180bGYtPmZlYXR1cmVfZGF0YVtpXVtTRUdfTFZMX0FMVF9MRl0KKwkJCT0gKHBiaS0+dnA5X3BhcmFtLnAuc2VnX2xmX2luZm9baV0KKwkJCSYgMHgxMDApID8gLShwYmktPnZwOV9wYXJhbS5wLnNlZ19sZl9pbmZvW2ldCisJCQkmIDB4M2YpIDogKHBiaS0+dnA5X3BhcmFtLnAuc2VnX2xmX2luZm9baV0gJiAweDNmKTsKKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQSkgeworCQkJLypTZXQgcGlwZWxpbmUgbW9kZSovCisJCQl1aW50MzJfdCBscGZfZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfREJMS19DRkdCKTsKKwkJCS8qZGJsayBwaXBlbGluZSBtb2RlPTEgZm9yIHBlcmZvcm1hbmNlKi8KKwkJCWlmIChwYmktPnZwOV9wYXJhbS5wLndpZHRoID49IDEyODApCisJCQkJbHBmX2RhdGEzMiB8PSAoMHgxIDw8IDQpOworCQkJZWxzZQorCQkJCWxwZl9kYXRhMzIgJj0gfigweDMgPDwgNCk7CisJCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkdCLCBscGZfZGF0YTMyKTsKKwkJfQorCQkvKgorCQkqIFVwZGF0ZSBsb29wIGZpbHRlciBUaHIvTHZsIHRhYmxlIGZvciBldmVyeSBmcmFtZQorCQkqLworCQkvKnByX2luZm8KKwkJKCJ2cDlfbG9vcF9maWx0ZXIgKHJ1biBiZWZvcmUgZXZlcnkgZnJhbWUgZGVjb2Rpbmcgc3RhcnQpXG4iKTsqLworCQl2cDlfbG9vcF9maWx0ZXJfZnJhbWVfaW5pdChwYmktPnNlZ180bGYsCisJCQlwYmktPmxmaSwgcGJpLT5sZiwgcGJpLT5kZWZhdWx0X2ZpbHRfbHZsKTsKKyNlbmRpZgorCQkvKnByX2luZm8oIkhFVkNfREVDX1NUQVRVU19SRUcgPD0gVlA5XzEwQl9ERUNPREVfU0xJQ0VcbiIpOyovCisJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgVlA5XzEwQl9ERUNPREVfU0xJQ0UpOworCX0gZWxzZSB7CisJCXByX2luZm8oIlNraXAgc2VhcmNoIG5leHQgc3RhcnQgY29kZVxuIik7CisJCWNtLT5wcmV2X2ZiX2lkeCA9IElOVkFMSURfSURYOworCQkvKnNraXAsIHNlYXJjaCBuZXh0IHN0YXJ0IGNvZGUqLworCQlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIFZQOV8xMEJfREVDT0RFX1NMSUNFKTsKKwl9CisJcGJpLT5wcm9jZXNzX3N0YXRlID0gUFJPQ19TVEFURV9ERUNPREVTTElDRTsKKwlpZiAocGJpLT5tbXVfZW5hYmxlICYmICgocGJpLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MTApID09IDApKSB7CisJCWlmIChwYmktPmxhc3RfcHV0X2lkeCA8IHBiaS0+dXNlZF9idWZfbnVtKSB7CisJCQlzdHJ1Y3QgUmVmQ250QnVmZmVyX3MgKmZyYW1lX2J1ZnMgPQorCQkJCWNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmczsKKwkJCWludCBpID0gcGJpLT5sYXN0X3B1dF9pZHg7CisJCQkvKmZyZWUgbm90IHVzZWQgYnVmZmVycy4qLworCQkJaWYgKChmcmFtZV9idWZzW2ldLnJlZl9jb3VudCA9PSAwKSAmJgorCQkJCShmcmFtZV9idWZzW2ldLmJ1Zi52Zl9yZWYgPT0gMCkgJiYKKwkJCQkoZnJhbWVfYnVmc1tpXS5idWYuaW5kZXggIT0gLTEpKSB7CisJCQkJaWYgKHBiaS0+aXNfdXNlZF92NGwpIHsKKwkJCQkJc3RydWN0IGludGVybmFsX2NvbXBfYnVmICppYnVmID0KKwkJCQkJCWluZGV4X3RvX2ljb21wX2J1ZihwYmksIGkpOworCQkJCQlBVFJBQ0VfQ09VTlRFUihwYmktPnRyYWNlLmRlY29kZV9oZWFkZXJfbWVtb3J5X3RpbWVfbmFtZSwgVFJBQ0VfSEVBREVSX01FTU9SWV9TVEFSVCk7CisJCQkJCWRlY29kZXJfbW11X2JveF9mcmVlX2lkeChpYnVmLT5tbXVfYm94LCBpYnVmLT5pbmRleCk7CisJCQkJCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UuZGVjb2RlX2hlYWRlcl9tZW1vcnlfdGltZV9uYW1lLCBUUkFDRV9IRUFERVJfTUVNT1JZX0VORCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJQVRSQUNFX0NPVU5URVIocGJpLT50cmFjZS5kZWNvZGVfaGVhZGVyX21lbW9yeV90aW1lX25hbWUsIFRSQUNFX0hFQURFUl9NRU1PUllfU1RBUlQpOworCQkJCQlkZWNvZGVyX21tdV9ib3hfZnJlZV9pZHgocGJpLT5tbXVfYm94LCBpKTsKKwkJCQkJQVRSQUNFX0NPVU5URVIocGJpLT50cmFjZS5kZWNvZGVfaGVhZGVyX21lbW9yeV90aW1lX25hbWUsIFRSQUNFX0hFQURFUl9NRU1PUllfRU5EKTsKKworI2lmZGVmIFZQOV8xMEJfTU1VX0RXCisJCQkJCWlmIChwYmktPmR3X21tdV9lbmFibGUpCisJCQkJCQlkZWNvZGVyX21tdV9ib3hfZnJlZV9pZHgocGJpLT5tbXVfYm94X2R3LCBpKTsKKyNlbmRpZgorCisJCQkJfQorCQkJfQorCQkJcGJpLT5sYXN0X3B1dF9pZHggPSAtMTsKKwkJfQorCX0KKwlBVFJBQ0VfQ09VTlRFUihwYmktPnRyYWNlLmRlY29kZV9oZWFkZXJfbWVtb3J5X3RpbWVfbmFtZSwgVFJBQ0VfSEVBREVSX1JFR0lTVEVSX0VORCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZmlsbF9mcmFtZV9pbmZvKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqZnJhbWUsCisJdW5zaWduZWQgaW50IGZyYW1lc2l6ZSwKKwl1bnNpZ25lZCBpbnQgcHRzKQoreworCXN0cnVjdCB2ZnJhbWVfcW9zX3MgKnZmcmFtZV9xb3MgPSAmcGJpLT52ZnJhbWVfcW9zOworCisJaWYgKGZyYW1lLT5zbGljZV90eXBlID09IEtFWV9GUkFNRSkKKwkJdmZyYW1lX3Fvcy0+dHlwZSA9IDE7CisJZWxzZSBpZiAoZnJhbWUtPnNsaWNlX3R5cGUgPT0gSU5URVJfRlJBTUUpCisJCXZmcmFtZV9xb3MtPnR5cGUgPSAyOworLyoKKyNkZWZpbmUgU0hPV19RT1NfSU5GTworKi8KKwlpZiAoaW5wdXRfZnJhbWVfYmFzZWQoaHdfdG9fdmRlYyhwYmkpKSkKKwkJdmZyYW1lX3Fvcy0+c2l6ZSA9IGZyYW1lLT5mcmFtZV9zaXplMjsKKwllbHNlCisJCXZmcmFtZV9xb3MtPnNpemUgPSBmcmFtZXNpemU7CisJdmZyYW1lX3Fvcy0+cHRzID0gcHRzOworI2lmZGVmIFNIT1dfUU9TX0lORk8KKwl2cDlfcHJpbnQocGJpLCAwLCAic2xpY2U6JWRcbiIsIGZyYW1lLT5zbGljZV90eXBlKTsKKyNlbmRpZgorCXZmcmFtZV9xb3MtPm1heF9tdiA9IGZyYW1lLT5tYXhfbXY7CisJdmZyYW1lX3Fvcy0+YXZnX212ID0gZnJhbWUtPmF2Z19tdjsKKwl2ZnJhbWVfcW9zLT5taW5fbXYgPSBmcmFtZS0+bWluX212OworI2lmZGVmIFNIT1dfUU9TX0lORk8KKwl2cDlfcHJpbnQocGJpLCAwLCAibXY6IG1heDolZCwgIGF2ZzolZCwgbWluOiVkXG4iLAorCQkJdmZyYW1lX3Fvcy0+bWF4X212LAorCQkJdmZyYW1lX3Fvcy0+YXZnX212LAorCQkJdmZyYW1lX3Fvcy0+bWluX212KTsKKyNlbmRpZgorCXZmcmFtZV9xb3MtPm1heF9xcCA9IGZyYW1lLT5tYXhfcXA7CisJdmZyYW1lX3Fvcy0+YXZnX3FwID0gZnJhbWUtPmF2Z19xcDsKKwl2ZnJhbWVfcW9zLT5taW5fcXAgPSBmcmFtZS0+bWluX3FwOworI2lmZGVmIFNIT1dfUU9TX0lORk8KKwl2cDlfcHJpbnQocGJpLCAwLCAicXA6IG1heDolZCwgIGF2ZzolZCwgbWluOiVkXG4iLAorCQkJdmZyYW1lX3Fvcy0+bWF4X3FwLAorCQkJdmZyYW1lX3Fvcy0+YXZnX3FwLAorCQkJdmZyYW1lX3Fvcy0+bWluX3FwKTsKKyNlbmRpZgorCXZmcmFtZV9xb3MtPm1heF9za2lwID0gZnJhbWUtPm1heF9za2lwOworCXZmcmFtZV9xb3MtPmF2Z19za2lwID0gZnJhbWUtPmF2Z19za2lwOworCXZmcmFtZV9xb3MtPm1pbl9za2lwID0gZnJhbWUtPm1pbl9za2lwOworI2lmZGVmIFNIT1dfUU9TX0lORk8KKwl2cDlfcHJpbnQocGJpLCAwLCAic2tpcDogbWF4OiVkLAlhdmc6JWQsIG1pbjolZFxuIiwKKwkJCXZmcmFtZV9xb3MtPm1heF9za2lwLAorCQkJdmZyYW1lX3Fvcy0+YXZnX3NraXAsCisJCQl2ZnJhbWVfcW9zLT5taW5fc2tpcCk7CisjZW5kaWYKKwl2ZnJhbWVfcW9zLT5udW0rKzsKK30KKworLyogb25seSB3aGVuIHdlIGRlY29kZWQgb25lIGZpZWxkIG9yIG9uZSBmcmFtZSwKK3dlIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gZ2V0IHFvcyBpbmZvKi8KK3N0YXRpYyB2b2lkIGdldF9waWN0dXJlX3Fvc19pbmZvKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqZnJhbWUgPSAmcGJpLT5jdXJfYnVmLT5idWY7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMocGJpKTsKKworCWlmICghZnJhbWUpCisJCXJldHVybjsKKwlpZiAodmRlYy0+bXZmcm0pIHsKKwkJZnJhbWUtPmZyYW1lX3NpemUyID0gdmRlYy0+bXZmcm0tPmZyYW1lX3NpemU7CisJCWZyYW1lLT5od19kZWNvZGVfdGltZSA9CisJCWxvY2FsX2Nsb2NrKCkgLSB2ZGVjLT5tdmZybS0+aHdfZGVjb2RlX3N0YXJ0OworCX0KKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPCBBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQSkgeworCQl1bnNpZ25lZCBjaGFyIGFbM107CisJCXVuc2lnbmVkIGNoYXIgaSwgaiwgdDsKKwkJdW5zaWduZWQgbG9uZyAgZGF0YTsKKworCQlkYXRhID0gUkVBRF9WUkVHKEhFVkNfTVZfSU5GTyk7CisJCWlmIChmcmFtZS0+c2xpY2VfdHlwZSA9PSBLRVlfRlJBTUUpCisJCQlkYXRhID0gMDsKKwkJYVswXSA9IGRhdGEgJiAweGZmOworCQlhWzFdID0gKGRhdGEgPj4gOCkgJiAweGZmOworCQlhWzJdID0gKGRhdGEgPj4gMTYpICYgMHhmZjsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlmb3IgKGogPSBpKzE7IGogPCAzOyBqKyspIHsKKwkJCQlpZiAoYVtqXSA8IGFbaV0pIHsKKwkJCQkJdCA9IGFbal07CisJCQkJCWFbal0gPSBhW2ldOworCQkJCQlhW2ldID0gdDsKKwkJCQl9IGVsc2UgaWYgKGFbal0gPT0gYVtpXSkgeworCQkJCQlhW2ldKys7CisJCQkJCXQgPSBhW2pdOworCQkJCQlhW2pdID0gYVtpXTsKKwkJCQkJYVtpXSA9IHQ7CisJCQkJfQorCQkJfQorCQl9CisJCWZyYW1lLT5tYXhfbXYgPSBhWzJdOworCQlmcmFtZS0+YXZnX212ID0gYVsxXTsKKwkJZnJhbWUtPm1pbl9tdiA9IGFbMF07CisKKwkJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHX1FPU19JTkZPLAorCQkJIm12IGRhdGEgJXggIGFbMF09ICV4IGFbMV09ICV4IGFbMl09ICV4XG4iLAorCQkJZGF0YSwgYVswXSwgYVsxXSwgYVsyXSk7CisKKwkJZGF0YSA9IFJFQURfVlJFRyhIRVZDX1FQX0lORk8pOworCQlhWzBdID0gZGF0YSAmIDB4MWY7CisJCWFbMV0gPSAoZGF0YSA+PiA4KSAmIDB4M2Y7CisJCWFbMl0gPSAoZGF0YSA+PiAxNikgJiAweDdmOworCisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCWZvciAoaiA9IGkrMTsgaiA8IDM7IGorKykgeworCQkJCWlmIChhW2pdIDwgYVtpXSkgeworCQkJCQl0ID0gYVtqXTsKKwkJCQkJYVtqXSA9IGFbaV07CisJCQkJCWFbaV0gPSB0OworCQkJCX0gZWxzZSBpZiAoYVtqXSA9PSBhW2ldKSB7CisJCQkJCWFbaV0rKzsKKwkJCQkJdCA9IGFbal07CisJCQkJCWFbal0gPSBhW2ldOworCQkJCQlhW2ldID0gdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJZnJhbWUtPm1heF9xcCA9IGFbMl07CisJCWZyYW1lLT5hdmdfcXAgPSBhWzFdOworCQlmcmFtZS0+bWluX3FwID0gYVswXTsKKworCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfUU9TX0lORk8sCisJCQkicXAgZGF0YSAleCAgYVswXT0gJXggYVsxXT0gJXggYVsyXT0gJXhcbiIsCisJCQlkYXRhLCBhWzBdLCBhWzFdLCBhWzJdKTsKKworCQlkYXRhID0gUkVBRF9WUkVHKEhFVkNfU0tJUF9JTkZPKTsKKwkJYVswXSA9IGRhdGEgJiAweDFmOworCQlhWzFdID0gKGRhdGEgPj4gOCkgJiAweDNmOworCQlhWzJdID0gKGRhdGEgPj4gMTYpICYgMHg3ZjsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlmb3IgKGogPSBpKzE7IGogPCAzOyBqKyspIHsKKwkJCQlpZiAoYVtqXSA8IGFbaV0pIHsKKwkJCQkJdCA9IGFbal07CisJCQkJCWFbal0gPSBhW2ldOworCQkJCQlhW2ldID0gdDsKKwkJCQl9IGVsc2UgaWYgKGFbal0gPT0gYVtpXSkgeworCQkJCQlhW2ldKys7CisJCQkJCXQgPSBhW2pdOworCQkJCQlhW2pdID0gYVtpXTsKKwkJCQkJYVtpXSA9IHQ7CisJCQkJfQorCQkJfQorCQl9CisJCWZyYW1lLT5tYXhfc2tpcCA9IGFbMl07CisJCWZyYW1lLT5hdmdfc2tpcCA9IGFbMV07CisJCWZyYW1lLT5taW5fc2tpcCA9IGFbMF07CisKKwkJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHX1FPU19JTkZPLAorCQkJInNraXAgZGF0YSAleCAgYVswXT0gJXggYVsxXT0gJXggYVsyXT0gJXhcbiIsCisJCQlkYXRhLCBhWzBdLCBhWzFdLCBhWzJdKTsKKwl9IGVsc2UgeworCQl1aW50MzJfdCBibGs4OF95X2NvdW50OworCQl1aW50MzJfdCBibGs4OF9jX2NvdW50OworCQl1aW50MzJfdCBibGsyMl9tdl9jb3VudDsKKwkJdWludDMyX3QgcmRhdGEzMjsKKwkJaW50MzJfdCBtdl9oaTsKKwkJaW50MzJfdCBtdl9sbzsKKwkJdWludDMyX3QgcmRhdGEzMl9sOworCQl1aW50MzJfdCBtdnhfTDBfaGk7CisJCXVpbnQzMl90IG12eV9MMF9oaTsKKwkJdWludDMyX3QgbXZ4X0wxX2hpOworCQl1aW50MzJfdCBtdnlfTDFfaGk7CisJCWludDY0X3QgdmFsdWU7CisJCXVpbnQ2NF90IHRlbXBfdmFsdWU7CisJCWludCBwaWNfbnVtYmVyID0gZnJhbWUtPmRlY29kZV9pZHg7CisKKwkJZnJhbWUtPm1heF9tdiA9IDA7CisJCWZyYW1lLT5hdmdfbXYgPSAwOworCQlmcmFtZS0+bWluX212ID0gMDsKKworCQlmcmFtZS0+bWF4X3NraXAgPSAwOworCQlmcmFtZS0+YXZnX3NraXAgPSAwOworCQlmcmFtZS0+bWluX3NraXAgPSAwOworCisJCWZyYW1lLT5tYXhfcXAgPSAwOworCQlmcmFtZS0+YXZnX3FwID0gMDsKKwkJZnJhbWUtPm1pbl9xcCA9IDA7CisKKwkJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHX1FPU19JTkZPLCAic2xpY2VfdHlwZTolZCwgcG9jOiVkXG4iLAorCQkJZnJhbWUtPnNsaWNlX3R5cGUsCisJCQlwaWNfbnVtYmVyKTsKKworCQkvKiBzZXQgcmRfaWR4IHRvIDAgKi8KKwkJV1JJVEVfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0NUUkwsIDApOworCisJCWJsazg4X3lfY291bnQgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkJaWYgKGJsazg4X3lfY291bnQgPT0gMCkgeworCisJCXZwOV9wcmludChwYmksIFZQOV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBOTyBEYXRhIHlldC5cbiIsCisJCQlwaWNfbnVtYmVyKTsKKworCQkJLyogcmVzZXQgYWxsIGNvdW50cyAqLworCQkJV1JJVEVfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0NUUkwsICgxPDw4KSk7CisJCQlyZXR1cm47CisJCX0KKwkJLyogcXBfeV9zdW0gKi8KKwkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCisJCXZwOV9wcmludChwYmksIFZQOV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBZIFFQIEFWRyA6ICVkICglZC8lZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyL2Jsazg4X3lfY291bnQsCisJCQlyZGF0YTMyLCBibGs4OF95X2NvdW50KTsKKworCQlmcmFtZS0+YXZnX3FwID0gcmRhdGEzMi9ibGs4OF95X2NvdW50OworCQkvKiBpbnRyYV95X2NvdW50ICovCisJCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKworCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gWSBpbnRyYSByYXRlIDogJWQlYyAoJWQpXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMioxMDAvYmxrODhfeV9jb3VudCwKKwkJCSclJywgcmRhdGEzMik7CisKKwkJLyogc2tpcHBlZF95X2NvdW50ICovCisJCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKworCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gWSBza2lwcGVkIHJhdGUgOiAlZCVjICglZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyKjEwMC9ibGs4OF95X2NvdW50LAorCQkJJyUnLCByZGF0YTMyKTsKKworCQlmcmFtZS0+YXZnX3NraXAgPSByZGF0YTMyKjEwMC9ibGs4OF95X2NvdW50OworCQkvKiBjb2VmZl9ub25femVyb195X2NvdW50ICovCisJCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKworCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gWSBaRVJPX0NvZWZmIHJhdGUgOiAlZCVjICglZClcbiIsCisJCQlwaWNfbnVtYmVyLCAoMTAwIC0gcmRhdGEzMioxMDAvKGJsazg4X3lfY291bnQqMSkpLAorCQkJJyUnLCByZGF0YTMyKTsKKworCQkvKiBibGs2Nl9jX2NvdW50ICovCisJCWJsazg4X2NfY291bnQgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkJaWYgKGJsazg4X2NfY291bnQgPT0gMCkgeworCQkJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHX1FPU19JTkZPLAorCQkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBOTyBEYXRhIHlldC5cbiIsCisJCQkJcGljX251bWJlcik7CisJCQkvKiByZXNldCBhbGwgY291bnRzICovCisJCQlXUklURV9WUkVHKEhFVkNfUElDX1FVQUxJVFlfQ1RSTCwgKDE8PDgpKTsKKwkJCXJldHVybjsKKwkJfQorCQkvKiBxcF9jX3N1bSAqLworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisKKwkJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHX1FPU19JTkZPLAorCQkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBDIFFQIEFWRyA6ICVkICglZC8lZClcbiIsCisJCQkJcGljX251bWJlciwgcmRhdGEzMi9ibGs4OF9jX2NvdW50LAorCQkJCXJkYXRhMzIsIGJsazg4X2NfY291bnQpOworCisJCS8qIGludHJhX2NfY291bnQgKi8KKwkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCisJCXZwOV9wcmludChwYmksIFZQOV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBDIGludHJhIHJhdGUgOiAlZCVjICglZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyKjEwMC9ibGs4OF9jX2NvdW50LAorCQkJJyUnLCByZGF0YTMyKTsKKworCQkvKiBza2lwcGVkX2N1X2NfY291bnQgKi8KKwkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCisJCXZwOV9wcmludChwYmksIFZQOV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBDIHNraXBwZWQgcmF0ZSA6ICVkJWMgKCVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzIqMTAwL2Jsazg4X2NfY291bnQsCisJCQknJScsIHJkYXRhMzIpOworCisJCS8qIGNvZWZmX25vbl96ZXJvX2NfY291bnQgKi8KKwkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCisJCXZwOV9wcmludChwYmksIFZQOV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBDIFpFUk9fQ29lZmYgcmF0ZSA6ICVkJWMgKCVkKVxuIiwKKwkJCXBpY19udW1iZXIsICgxMDAgLSByZGF0YTMyKjEwMC8oYmxrODhfY19jb3VudCoxKSksCisJCQknJScsIHJkYXRhMzIpOworCisJCS8qIDEnaDAsIHFwX2NfbWF4WzY6MF0sIDEnaDAsIHFwX2NfbWluWzY6MF0sCisJCTEnaDAsIHFwX3lfbWF4WzY6MF0sIDEnaDAsIHFwX3lfbWluWzY6MF0gKi8KKwkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCisJCXZwOV9wcmludChwYmksIFZQOV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBZIFFQIG1pbiA6ICVkXG4iLAorCQkJcGljX251bWJlciwgKHJkYXRhMzI+PjApJjB4ZmYpOworCisJCWZyYW1lLT5taW5fcXAgPSAocmRhdGEzMj4+MCkmMHhmZjsKKworCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gWSBRUCBtYXggOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIChyZGF0YTMyPj44KSYweGZmKTsKKworCQlmcmFtZS0+bWF4X3FwID0gKHJkYXRhMzI+PjgpJjB4ZmY7CisKKwkJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIEMgUVAgbWluIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCAocmRhdGEzMj4+MTYpJjB4ZmYpOworCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gQyBRUCBtYXggOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIChyZGF0YTMyPj4yNCkmMHhmZik7CisKKwkJLyogYmxrMjJfbXZfY291bnQgKi8KKwkJYmxrMjJfbXZfY291bnQgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkJaWYgKGJsazIyX212X2NvdW50ID09IDApIHsKKwkJCXZwOV9wcmludChwYmksIFZQOV9ERUJVR19RT1NfSU5GTywKKwkJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTk8gTVYgRGF0YSB5ZXQuXG4iLAorCQkJCXBpY19udW1iZXIpOworCQkJLyogcmVzZXQgYWxsIGNvdW50cyAqLworCQkJV1JJVEVfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0NUUkwsICgxPDw4KSk7CisJCQlyZXR1cm47CisJCX0KKwkJLyogbXZ5X0wxX2NvdW50WzM5OjMyXSwgbXZ4X0wxX2NvdW50WzM5OjMyXSwKKwkJbXZ5X0wwX2NvdW50WzM5OjMyXSwgbXZ4X0wwX2NvdW50WzM5OjMyXSAqLworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJCS8qIHNob3VsZCBhbGwgYmUgMHgwMCBvciAweGZmICovCisJCXZwOV9wcmludChwYmksIFZQOV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNViBBVkcgSGlnaCBCaXRzOiAweCVYXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMik7CisKKwkJbXZ4X0wwX2hpID0gKChyZGF0YTMyPj4wKSYweGZmKTsKKwkJbXZ5X0wwX2hpID0gKChyZGF0YTMyPj44KSYweGZmKTsKKwkJbXZ4X0wxX2hpID0gKChyZGF0YTMyPj4xNikmMHhmZik7CisJCW12eV9MMV9oaSA9ICgocmRhdGEzMj4+MjQpJjB4ZmYpOworCisJCS8qIG12eF9MMF9jb3VudFszMTowXSAqLworCQlyZGF0YTMyX2wgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkJdGVtcF92YWx1ZSA9IG12eF9MMF9oaTsKKwkJdGVtcF92YWx1ZSA9ICh0ZW1wX3ZhbHVlIDw8IDMyKSB8IHJkYXRhMzJfbDsKKworCQlpZiAobXZ4X0wwX2hpICYgMHg4MCkKKwkJCXZhbHVlID0gMHhGRkZGRkZGMDAwMDAwMDAwIHwgdGVtcF92YWx1ZTsKKwkJZWxzZQorCQkJdmFsdWUgPSB0ZW1wX3ZhbHVlOworCisJCXZhbHVlID0gZGl2X3M2NCh2YWx1ZSwgYmxrMjJfbXZfY291bnQpOworCisJCXZwOV9wcmludChwYmksIFZQOV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVlhfTDAgQVZHIDogJWQgKCVsbGQvJWQpXG4iLAorCQkJcGljX251bWJlciwgKGludCl2YWx1ZSwKKwkJCXZhbHVlLCBibGsyMl9tdl9jb3VudCk7CisKKwkJZnJhbWUtPmF2Z19tdiA9IHZhbHVlOworCisJCS8qIG12eV9MMF9jb3VudFszMTowXSAqLworCQlyZGF0YTMyX2wgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkJdGVtcF92YWx1ZSA9IG12eV9MMF9oaTsKKwkJdGVtcF92YWx1ZSA9ICh0ZW1wX3ZhbHVlIDw8IDMyKSB8IHJkYXRhMzJfbDsKKworCQlpZiAobXZ5X0wwX2hpICYgMHg4MCkKKwkJCXZhbHVlID0gMHhGRkZGRkZGMDAwMDAwMDAwIHwgdGVtcF92YWx1ZTsKKwkJZWxzZQorCQkJdmFsdWUgPSB0ZW1wX3ZhbHVlOworCisJCXZwOV9wcmludChwYmksIFZQOV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVllfTDAgQVZHIDogJWQgKCVsbGQvJWQpXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMl9sL2JsazIyX212X2NvdW50LAorCQkJdmFsdWUsIGJsazIyX212X2NvdW50KTsKKworCQkvKiBtdnhfTDFfY291bnRbMzE6MF0gKi8KKwkJcmRhdGEzMl9sID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJCXRlbXBfdmFsdWUgPSBtdnhfTDFfaGk7CisJCXRlbXBfdmFsdWUgPSAodGVtcF92YWx1ZSA8PCAzMikgfCByZGF0YTMyX2w7CisJCWlmIChtdnhfTDFfaGkgJiAweDgwKQorCQkJdmFsdWUgPSAweEZGRkZGRkYwMDAwMDAwMDAgfCB0ZW1wX3ZhbHVlOworCQllbHNlCisJCQl2YWx1ZSA9IHRlbXBfdmFsdWU7CisKKwkJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWF9MMSBBVkcgOiAlZCAoJWxsZC8lZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyX2wvYmxrMjJfbXZfY291bnQsCisJCQl2YWx1ZSwgYmxrMjJfbXZfY291bnQpOworCisJCS8qIG12eV9MMV9jb3VudFszMTowXSAqLworCQlyZGF0YTMyX2wgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkJdGVtcF92YWx1ZSA9IG12eV9MMV9oaTsKKwkJdGVtcF92YWx1ZSA9ICh0ZW1wX3ZhbHVlIDw8IDMyKSB8IHJkYXRhMzJfbDsKKwkJaWYgKG12eV9MMV9oaSAmIDB4ODApCisJCQl2YWx1ZSA9IDB4RkZGRkZGRjAwMDAwMDAwMCB8IHRlbXBfdmFsdWU7CisJCWVsc2UKKwkJCXZhbHVlID0gdGVtcF92YWx1ZTsKKworCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZZX0wxIEFWRyA6ICVkICglbGxkLyVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzJfbC9ibGsyMl9tdl9jb3VudCwKKwkJCXZhbHVlLCBibGsyMl9tdl9jb3VudCk7CisKKwkJLyoge212eF9MMF9tYXgsIG12eF9MMF9taW59IC8vIGZvcm1hdCA6IHtzaWduLCBhYnNbMTQ6MF19ICAqLworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJCW12X2hpID0gKHJkYXRhMzI+PjE2KSYweGZmZmY7CisJCWlmIChtdl9oaSAmIDB4ODAwMCkKKwkJCW12X2hpID0gMHg4MDAwIC0gbXZfaGk7CisKKwkJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWF9MMCBNQVggOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIG12X2hpKTsKKworCQlmcmFtZS0+bWF4X212ID0gbXZfaGk7CisKKwkJbXZfbG8gPSAocmRhdGEzMj4+MCkmMHhmZmZmOworCQlpZiAobXZfbG8gJiAweDgwMDApCisJCQltdl9sbyA9IDB4ODAwMCAtIG12X2xvOworCisJCXZwOV9wcmludChwYmksIFZQOV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVlhfTDAgTUlOIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9sbyk7CisKKwkJZnJhbWUtPm1pbl9tdiA9IG12X2xvOworCisJCS8qIHttdnlfTDBfbWF4LCBtdnlfTDBfbWlufSAqLworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJCW12X2hpID0gKHJkYXRhMzI+PjE2KSYweGZmZmY7CisJCWlmIChtdl9oaSAmIDB4ODAwMCkKKwkJCW12X2hpID0gMHg4MDAwIC0gbXZfaGk7CisKKwkJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWV9MMCBNQVggOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIG12X2hpKTsKKworCQltdl9sbyA9IChyZGF0YTMyPj4wKSYweGZmZmY7CisJCWlmIChtdl9sbyAmIDB4ODAwMCkKKwkJCW12X2xvID0gMHg4MDAwIC0gbXZfbG87CisKKwkJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWV9MMCBNSU4gOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIG12X2xvKTsKKworCQkvKiB7bXZ4X0wxX21heCwgbXZ4X0wxX21pbn0gKi8KKwkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCQltdl9oaSA9IChyZGF0YTMyPj4xNikmMHhmZmZmOworCQlpZiAobXZfaGkgJiAweDgwMDApCisJCQltdl9oaSA9IDB4ODAwMCAtIG12X2hpOworCisJCXZwOV9wcmludChwYmksIFZQOV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVlhfTDEgTUFYIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9oaSk7CisKKwkJbXZfbG8gPSAocmRhdGEzMj4+MCkmMHhmZmZmOworCQlpZiAobXZfbG8gJiAweDgwMDApCisJCQltdl9sbyA9IDB4ODAwMCAtIG12X2xvOworCisJCXZwOV9wcmludChwYmksIFZQOV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVlhfTDEgTUlOIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9sbyk7CisKKwkJLyoge212eV9MMV9tYXgsIG12eV9MMV9taW59ICovCisJCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkJbXZfaGkgPSAocmRhdGEzMj4+MTYpJjB4ZmZmZjsKKwkJaWYgKG12X2hpICYgMHg4MDAwKQorCQkJbXZfaGkgPSAweDgwMDAgLSBtdl9oaTsKKworCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZZX0wxIE1BWCA6ICVkXG4iLAorCQkJcGljX251bWJlciwgbXZfaGkpOworCisJCW12X2xvID0gKHJkYXRhMzI+PjApJjB4ZmZmZjsKKwkJaWYgKG12X2xvICYgMHg4MDAwKQorCQkJbXZfbG8gPSAweDgwMDAgLSBtdl9sbzsKKworCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZZX0wxIE1JTiA6ICVkXG4iLAorCQkJcGljX251bWJlciwgbXZfbG8pOworCisJCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9DVFJMKTsKKworCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gQWZ0ZXIgUmVhZCA6IFZERUNfUElDX1FVQUxJVFlfQ1RSTCA6IDB4JXhcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyKTsKKworCQkvKiByZXNldCBhbGwgY291bnRzICovCisJCVdSSVRFX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9DVFJMLCAoMTw8OCkpOworCX0KK30KKworc3RhdGljIHZvaWQgdnZwOV9nZXRfY29tcF9idWZfaW5mbyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksCisJCQkJCXN0cnVjdCB2ZGVjX2NvbXBfYnVmX2luZm8gKmluZm8pCit7CisJdTE2IGJpdF9kZXB0aCA9IHBiaS0+cGFyYW0ucC5iaXRfZGVwdGg7CisKKwlpbmZvLT5tYXhfc2l6ZSA9IHZwOV9tYXhfbW11X2J1Zl9zaXplKAorCQkJcGJpLT5tYXhfcGljX3csCisJCQlwYmktPm1heF9waWNfaCk7CisJaW5mby0+aGVhZGVyX3NpemUgPSB2dnA5X21tdV9jb21wcmVzc19oZWFkZXJfc2l6ZSgKKwkJCXBiaS0+ZnJhbWVfd2lkdGgsCisJCQlwYmktPmZyYW1lX2hlaWdodCk7CisJaW5mby0+ZnJhbWVfYnVmZmVyX3NpemUgPSB2cDlfbW11X3BhZ2VfbnVtKAorCQkJcGJpLCBwYmktPmZyYW1lX3dpZHRoLAorCQkJcGJpLT5mcmFtZV9oZWlnaHQsCisJCQliaXRfZGVwdGggPT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgdnZwOV9nZXRfcHNfaW5mbyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksIHN0cnVjdCBhbWxfdmRlY19wc19pbmZvcyAqcHMpCit7CisJcHMtPnZpc2libGVfd2lkdGggCT0gcGJpLT5mcmFtZV93aWR0aDsKKwlwcy0+dmlzaWJsZV9oZWlnaHQgCT0gcGJpLT5mcmFtZV9oZWlnaHQ7CisJcHMtPmNvZGVkX3dpZHRoIAk9IEFMSUdOKHBiaS0+ZnJhbWVfd2lkdGgsIDY0KTsKKwlwcy0+Y29kZWRfaGVpZ2h0IAk9IEFMSUdOKHBiaS0+ZnJhbWVfaGVpZ2h0LCA2NCk7CisJcHMtPmRwYl9zaXplIAkJPSBwYmktPnVzZWRfYnVmX251bTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgdjRsX3Jlc19jaGFuZ2Uoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShwYmktPnY0bDJfY3R4KTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChjdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSAmJgorCQlwYmktPnJlc19jaF9mbGFnID09IDApIHsKKwkJc3RydWN0IGFtbF92ZGVjX3BzX2luZm9zIHBzOworCQlzdHJ1Y3QgdmRlY19jb21wX2J1Zl9pbmZvIGNvbXA7CisKKwkJaWYgKChwYmktPmxhc3Rfd2lkdGggIT0gMCAmJgorCQkJcGJpLT5sYXN0X2hlaWdodCAhPSAwKSAmJgorCQkJKHBiaS0+ZnJhbWVfd2lkdGggIT0gcGJpLT5sYXN0X3dpZHRoIHx8CisJCQlwYmktPmZyYW1lX2hlaWdodCAhPSBwYmktPmxhc3RfaGVpZ2h0KSkgeworCisJCQl2cDlfcHJpbnQocGJpLCAwLCAiJXMgKCVkLCVkKT0+KCVkLCVkKVxyXG4iLCBfX2Z1bmNfXywgcGJpLT5sYXN0X3dpZHRoLAorCQkJCXBiaS0+bGFzdF9oZWlnaHQsIHBiaS0+ZnJhbWVfd2lkdGgsIHBiaS0+ZnJhbWVfaGVpZ2h0KTsKKworCQkJaWYgKGdldF92YWxpZF9kb3VibGVfd3JpdGVfbW9kZShwYmkpICE9IDE2KSB7CisJCQkJdnZwOV9nZXRfY29tcF9idWZfaW5mbyhwYmksICZjb21wKTsKKwkJCQl2ZGVjX3Y0bF9zZXRfY29tcF9idWZfaW5mbyhjdHgsICZjb21wKTsKKwkJCX0KKworCQkJdnZwOV9nZXRfcHNfaW5mbyhwYmksICZwcyk7CisJCQl2ZGVjX3Y0bF9zZXRfcHNfaW5mb3MoY3R4LCAmcHMpOworCQkJdmRlY192NGxfcmVzX2NoX2V2ZW50KGN0eCk7CisKKwkJCXBiaS0+aW5pdF9waWNfdyA9IHBiaS0+ZnJhbWVfd2lkdGg7CisJCQlwYmktPmluaXRfcGljX2ggPSBwYmktPmZyYW1lX2hlaWdodDsKKwkJCWluaXRfbXZfYnVmX2xpc3QocGJpKTsKKworCQkJcGJpLT52NGxfcGFyYW1zX3BhcnNlZCA9IGZhbHNlOworCQkJcGJpLT5yZXNfY2hfZmxhZyA9IDE7CisJCQljdHgtPnY0bF9yZXNvbHV0aW9uX2NoYW5nZSA9IDE7CisJCQlwYmktPmVvcyA9IDE7CisJCQl2cDlfYnVmbWdyX3Bvc3Rwcm9jKHBiaSk7CisJCQkvL2RlbF90aW1lcl9zeW5jKCZwYmktPnRpbWVyKTsKKwkJCW5vdGlmeV92NGxfZW9zKGh3X3RvX3ZkZWMocGJpKSk7CisJCQlyZXQgPSAxOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaXJxcmV0dXJuX3QgdnZwOV9pc3JfdGhyZWFkX2ZuKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IFZQOURlY29kZXJfcyAqcGJpID0gKHN0cnVjdCBWUDlEZWNvZGVyX3MgKilkYXRhOworCXVuc2lnbmVkIGludCBkZWNfc3RhdHVzID0gcGJpLT5kZWNfc3RhdHVzOworCWludCBpOworCisJLyppZiAocGJpLT53YWl0X2J1ZikKKwkgKglwcl9pbmZvKCJzZXQgd2FpdF9idWYgdG8gMFxyXG4iKTsKKwkgKi8KKworCWlmIChkZWNfc3RhdHVzID09IFZQOV9IRUFEX1BBUlNFUl9ET05FKSB7CisJCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9JU1JfVEhSRUFEX0hFQURfU1RBUlQpOworCX0KKwllbHNlIGlmIChkZWNfc3RhdHVzID09IEhFVkNfREVDUElDX0RBVEFfRE9ORSkgeworCQlBVFJBQ0VfQ09VTlRFUihwYmktPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX1RIUkVBRF9QSUNfRE9ORV9TVEFSVCk7CisJfQorCisJaWYgKHBiaS0+ZW9zKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJcGJpLT53YWl0X2J1ZiA9IDA7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKKyNpZmRlZiBGQl9ERUNPRElOR19URVNUX1NDSEVEVUxFCisJaWYgKHBiaS0+czFfdGVzdF9jbWQgPT0gVEVTVF9TRVRfUElDX0RPTkUpCisJCWRlY19zdGF0dXMgPSBIRVZDX0RFQ1BJQ19EQVRBX0RPTkU7CisJZWxzZSBpZiAocGJpLT5zMV90ZXN0X2NtZCA9PSBURVNUX1NFVF9TMl9ET05FCisJCSYmIGRlY19zdGF0dXMgPT0gSEVWQ19ERUNQSUNfREFUQV9ET05FKQorCQlkZWNfc3RhdHVzID0gSEVWQ19TMl9ERUNPRElOR19ET05FOworCXBiaS0+czFfdGVzdF9jbWQgPSBURVNUX1NFVF9OT05FOworI2Vsc2UKKwkvKmlmIChpcnEgIT0gVkRFQ19JUlFfMCkKKwkJZGVjX3N0YXR1cyA9IEhFVkNfUzJfREVDT0RJTkdfRE9ORTsqLworI2VuZGlmCisJaWYgKGRlY19zdGF0dXMgPT0gSEVWQ19TMl9ERUNPRElOR19ET05FKSB7CisJCXBiaS0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZwYmktPndvcmspOworI2lmZGVmIEZCX0RFQ09ESU5HX1RFU1RfU0NIRURVTEUKKwkJYW1oZXZjX3N0b3AoKTsKKwkJcGJpLT5kZWNfczFfcmVzdWx0ID0gREVDX1MxX1JFU1VMVF9ET05FOworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJnBiaS0+czFfd29yayk7CisjZW5kaWYKKwl9IGVsc2UKKyNlbmRpZgorCWlmICgoZGVjX3N0YXR1cyA9PSBIRVZDX05BTF9ERUNPREVfRE9ORSkgfHwKKwkJCShkZWNfc3RhdHVzID09IEhFVkNfU0VBUkNIX0JVRkVNUFRZKSB8fAorCQkJKGRlY19zdGF0dXMgPT0gSEVWQ19ERUNPREVfQlVGRU1QVFkpCisJCSkgeworCQlpZiAocGJpLT5tX2luc19mbGFnKSB7CisJCQlyZXNldF9wcm9jZXNzX3RpbWUocGJpKTsKKwkJCWlmICghdmRlY19mcmFtZV9iYXNlZChod190b192ZGVjKHBiaSkpKQorCQkJCWRlY19hZ2Fpbl9wcm9jZXNzKHBiaSk7CisJCQllbHNlIHsKKwkJCQlpZiAocGJpLT5jb21tb24uc2hvd19leGlzdGluZ19mcmFtZSkgeworCQkJCQlwYmktPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7DQorCQkJCQlhbWhldmNfc3RvcCgpOw0KKwkJCQkJdmRlY19zY2hlZHVsZV93b3JrKCZwYmktPndvcmspOw0KKwkJCQl9DQorCQkJCWVsc2Ugew0KKwkJCQkJcGJpLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9HRVRfREFUQTsNCisJCQkJCXZkZWNfc2NoZWR1bGVfd29yaygmcGJpLT53b3JrKTsNCisJCQkJfQ0KKwkJCX0KKwkJfQorCQlwYmktPnByb2Nlc3NfYnVzeSA9IDA7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9IGVsc2UgaWYgKGRlY19zdGF0dXMgPT0gSEVWQ19ERUNQSUNfREFUQV9ET05FKSB7CisJCWlmIChwYmktPm1faW5zX2ZsYWcpIHsKKwkJCWdldF9waWN0dXJlX3Fvc19pbmZvKHBiaSk7CisjaWZkZWYgU1VQUE9SVF9GQl9ERUNPRElORworCQkJaWYgKHBiaS0+dXNlZF9zdGFnZV9idWZfbnVtID4gMCkgeworCQkJCXJlc2V0X3Byb2Nlc3NfdGltZShwYmkpOworCQkJCWluY19zMV9wb3MocGJpKTsKKwkJCQl0cmlnZ2VyX3NjaGVkdWxlKHBiaSk7CisjaWZkZWYgRkJfREVDT0RJTkdfVEVTVF9TQ0hFRFVMRQorCQkJCXBiaS0+czFfdGVzdF9jbWQgPSBURVNUX1NFVF9TMl9ET05FOworI2Vsc2UKKwkJCQlhbWhldmNfc3RvcCgpOworCQkJCXBiaS0+ZGVjX3MxX3Jlc3VsdCA9IERFQ19TMV9SRVNVTFRfRE9ORTsKKwkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJnBiaS0+czFfd29yayk7CisjZW5kaWYKKwkJCX0gZWxzZQorI2VuZGlmCisJCQl7CisJCQkJcmVzZXRfcHJvY2Vzc190aW1lKHBiaSk7CisJCQkJaWYgKHBiaS0+dmZfcHJlX2NvdW50ID09IDAgfHwgcGJpLT5sb3dfbGF0ZW5jeV9mbGFnKQorCQkJCQl2cDlfYnVmbWdyX3Bvc3Rwcm9jKHBiaSk7CisKKwkJCQlwYmktPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJCQkJYW1oZXZjX3N0b3AoKTsKKwkJCQlpZiAobWNyY2NfY2FjaGVfYWxnX2ZsYWcpCisJCQkJCWR1bXBfaGl0X3JhdGUocGJpKTsKKwkJCQlBVFJBQ0VfQ09VTlRFUihwYmktPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX1RIUkVBRF9FRE4pOworCQkJCXZkZWNfc2NoZWR1bGVfd29yaygmcGJpLT53b3JrKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChwYmktPmxvd19sYXRlbmN5X2ZsYWcpIHsKKwkJCQl2cDlfYnVmbWdyX3Bvc3Rwcm9jKHBiaSk7CisJCQkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCBIRVZDX0FDVElPTl9ET05FKTsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9NVUxUSV9ERUMKKwkJCQl2ZGVjX3Byb2ZpbGUoaHdfdG9fdmRlYyhwYmkpLCBWREVDX1BST0ZJTEVfRVZFTlRfQ0IpOworCQkJCWlmIChkZWJ1ZyAmIFBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwpCisJCQkJCXByX2luZm8oIiVzIFZQOSBmcmFtZSBkb25lIFxuIiwgX19mdW5jX18pOworI2VuZGlmCisJCQl9CisJCX0KKworCQlwYmktPnByb2Nlc3NfYnVzeSA9IDA7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisjZW5kaWYKKworCWlmIChkZWNfc3RhdHVzID09IFZQOV9FT1MpIHsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCWlmIChwYmktPm1faW5zX2ZsYWcpCisJCQlyZXNldF9wcm9jZXNzX3RpbWUocGJpKTsKKyNlbmRpZgorCisJCXByX2luZm8oIlZQOV9FT1MsIGZsdXNoIGJ1ZmZlclxyXG4iKTsKKworCQl2cDlfYnVmbWdyX3Bvc3Rwcm9jKHBiaSk7CisKKwkJcHJfaW5mbygic2VuZCBWUDlfMTBCX0RJU0NBUkRfTkFMXHJcbiIpOworCQlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIFZQOV8xMEJfRElTQ0FSRF9OQUwpOworCQlwYmktPnByb2Nlc3NfYnVzeSA9IDA7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQlpZiAocGJpLT5tX2luc19mbGFnKSB7CisJCQlwYmktPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJCQlhbWhldmNfc3RvcCgpOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZwYmktPndvcmspOworCQl9CisjZW5kaWYKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0gZWxzZSBpZiAoZGVjX3N0YXR1cyA9PSBIRVZDX0RFQ09ERV9PVkVSX1NJWkUpIHsKKwkJcHJfaW5mbygidnA5ICBkZWNvZGUgb3ZlcnNpemUgISFcbiIpOworCQlkZWJ1ZyB8PSAoVlA5X0RFQlVHX0RJU19MT0NfRVJST1JfUFJPQyB8CisJCQlWUDlfREVCVUdfRElTX1NZU19FUlJPUl9QUk9DKTsKKwkJcGJpLT5mYXRhbF9lcnJvciB8PSBERUNPREVSX0ZBVEFMX0VSUk9SX1NJWkVfT1ZFUkZMT1c7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCWlmIChwYmktPm1faW5zX2ZsYWcpCisJCXJlc2V0X3Byb2Nlc3NfdGltZShwYmkpOworI2VuZGlmCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAoZGVjX3N0YXR1cyAhPSBWUDlfSEVBRF9QQVJTRVJfRE9ORSkgeworCQlwYmktPnByb2Nlc3NfYnVzeSA9IDA7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAocGJpLT5tX2luc19mbGFnICYmCisJCQkhZ2V0X2ZyZWVfYnVmX2NvdW50KHBiaSkpIHsKKwkJcGJpLT5ydW5fcmVhZHlfbWluX2J1Zl9udW0gPSBwYmktPm9uZV9wYWNrYWdlX2ZyYW1lX2NudCArIDE7CisJCXByX2VycigibmVlZCBidWZmZXIsIG9uZSBwYWNrYWdlIGZyYW1lIGNvdW50ID0gJWRcbiIsIHBiaS0+b25lX3BhY2thZ2VfZnJhbWVfY250ICsgMSk7CisJCXBiaS0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfTkVFRF9NT1JFX0JVRkZFUjsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZwYmktPndvcmspOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJcGJpLT5vbmVfcGFja2FnZV9mcmFtZV9jbnQrKzsKKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9NVUxUSV9ERUMKKwlpZiAocGJpLT5tX2luc19mbGFnID09MCAmJiBwYmktPmxvd19sYXRlbmN5X2ZsYWcpIHsKKwkJdmRlY19wcm9maWxlKGh3X3RvX3ZkZWMocGJpKSwgVkRFQ19QUk9GSUxFX0VWRU5UX1JVTik7CisJCWlmIChkZWJ1ZyAmIFBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwpCisJCQlwcl9pbmZvKCIlcyBWUDkgZnJhbWUgaGVhZGVyIGZvdW5kIFxuIiwgX19mdW5jX18pOworCX0KKyNlbmRpZgorCWlmIChwYmktPm1faW5zX2ZsYWcpCisJCXJlc2V0X3Byb2Nlc3NfdGltZShwYmkpOworI2VuZGlmCisJaWYgKHBiaS0+cHJvY2Vzc19zdGF0ZSAhPSBQUk9DX1NUQVRFX1NFTkRBR0FJTgorI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKKwkJJiYgcGJpLT51c2VkX3N0YWdlX2J1Zl9udW0gPT0gMAorI2VuZGlmCisJCSkgeworCQlpZiAocGJpLT5tbXVfZW5hYmxlKSB7CisJCQlBVFJBQ0VfQ09VTlRFUihwYmktPnRyYWNlLmRlY29kZV9oZWFkZXJfbWVtb3J5X3RpbWVfbmFtZSwgVFJBQ0VfSEVBREVSX01FTU9SWV9TVEFSVCk7CisJCQl2cDlfcmVjeWNsZV9tbXVfYnVmX3RhaWwocGJpKTsKKwkJCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UuZGVjb2RlX2hlYWRlcl9tZW1vcnlfdGltZV9uYW1lLCBUUkFDRV9IRUFERVJfTUVNT1JZX0VORCk7CisJCX0KKworCQlpZiAocGJpLT5mcmFtZV9jb3VudCA+IDApCisJCQl2cDlfYnVmbWdyX3Bvc3Rwcm9jKHBiaSk7CisJfQorCisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX1NFTkRfUEFSQU1fV0lUSF9SRUcpIHsKKwkJZ2V0X3JwbV9wYXJhbSgmcGJpLT52cDlfcGFyYW0pOworCX0gZWxzZSB7CisjaWZkZWYgU1VQUE9SVF9GQl9ERUNPRElORworCQlpZiAocGJpLT51c2VkX3N0YWdlX2J1Zl9udW0gPiAwKSB7CisJCQlyZXNldF9wcm9jZXNzX3RpbWUocGJpKTsKKwkJCWdldF9zMV9idWYocGJpKTsKKworCQkJaWYgKGdldF9tdl9idWYocGJpLAorCQkJCSZwYmktPnMxX212X2J1Zl9pbmRleCwKKwkJCQkmcGJpLT5zMV9tcHJlZF9tdl93cl9zdGFydF9hZGRyCisJCQkJKSA8IDApIHsKKwkJCQl2cDlfcHJpbnQocGJpLCAwLAorCQkJCQkiJXM6IEVycm9yIGdldF9tdl9idWYgZmFpbFxuIiwKKwkJCQkJX19mdW5jX18pOworCQkJfQorCisJCQlpZiAocGJpLT5zMV9idWYgPT0gTlVMTCkgeworCQkJCXZwOV9wcmludChwYmksIDAsCisJCQkJCSIlczogRXJyb3IgZ2V0X3MxX2J1ZiBmYWlsXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQkJcGJpLT5wcm9jZXNzX2J1c3kgPSAwOworCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCX0KKworCQkJZm9yIChpID0gMDsgaSA8IChSUE1fRU5EIC0gUlBNX0JFR0lOKTsgaSArPSA0KSB7CisJCQkJaW50IGlpOworCQkJCWZvciAoaWkgPSAwOyBpaSA8IDQ7IGlpKyspIHsKKwkJCQkJcGJpLT5zMV9idWYtPnJwbVtpICsgMyAtIGlpXSA9CisJCQkJCQlwYmktPnJwbV9wdHJbaSArIDMgLSBpaV07CisJCQkJCXBiaS0+czFfcGFyYW0ubC5kYXRhW2kgKyBpaV0gPQorCQkJCQkJcGJpLT5ycG1fcHRyW2kgKyAzIC0gaWldOworCQkJCX0KKwkJCX0KKworCQkJbXByZWRfcHJvY2VzcyhwYmkpOworI2lmZGVmIEZCX0RFQ09ESU5HX1RFU1RfU0NIRURVTEUKKwkJCXBiaS0+ZGVjX3MxX3Jlc3VsdCA9CisJCQkJREVDX1MxX1JFU1VMVF9URVNUX1RSSUdHRVJfRE9ORTsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmcGJpLT5zMV93b3JrKTsKKyNlbHNlCisJCQlXUklURV9WUkVHKEhFVkNfQVNTSVNUX0ZCX01NVV9NQVBfQUREUiwKKwkJCQlwYmktPnN0YWdlX21tdV9tYXBfcGh5X2FkZHIgKworCQkJCXBiaS0+czFfYnVmLT5pbmRleCAqIFNUQUdFX01NVV9NQVBfU0laRSk7CisKKwkJCXN0YXJ0X3MxX2RlY29kaW5nKHBiaSk7CisjZW5kaWYKKwkJCXN0YXJ0X3Byb2Nlc3NfdGltZShwYmkpOworCQkJcGJpLT5wcm9jZXNzX2J1c3kgPSAwOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9IGVsc2UKKyNlbmRpZgorCQl7CisJCQlBVFJBQ0VfQ09VTlRFUihwYmktPnRyYWNlLmRlY29kZV9oZWFkZXJfbWVtb3J5X3RpbWVfbmFtZSwgVFJBQ0VfSEVBREVSX1JQTV9TVEFSVCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgKFJQTV9FTkQgLSBSUE1fQkVHSU4pOyBpICs9IDQpIHsKKwkJCQlpbnQgaWk7CisJCQkJZm9yIChpaSA9IDA7IGlpIDwgNDsgaWkrKykKKwkJCQkJcGJpLT52cDlfcGFyYW0ubC5kYXRhW2kgKyBpaV0gPQorCQkJCQkJcGJpLT5ycG1fcHRyW2kgKyAzIC0gaWldOworCQkJfQorCQkJQVRSQUNFX0NPVU5URVIocGJpLT50cmFjZS5kZWNvZGVfaGVhZGVyX21lbW9yeV90aW1lX25hbWUsIFRSQUNFX0hFQURFUl9SUE1fRU5EKTsKKwkJfQorCX0KKworCWlmIChwYmktPmlzX3VzZWRfdjRsKSB7CisJCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikocGJpLT52NGwyX2N0eCk7CisKKwkJcGJpLT5mcmFtZV93aWR0aCA9IHBiaS0+dnA5X3BhcmFtLnAud2lkdGg7CisJCXBiaS0+ZnJhbWVfaGVpZ2h0ID0gcGJpLT52cDlfcGFyYW0ucC5oZWlnaHQ7CisKKwkJaWYgKCFwYmktPmhhc19rZXlmcmFtZSAmJgorCQkJKChwYmktPmZyYW1lX3dpZHRoID09IDApIHx8CisJCQkocGJpLT5mcmFtZV9oZWlnaHQgPT0gMCkpKSB7CisJCQljb250aW51ZV9kZWNvZGluZyhwYmkpOworCQkJcGJpLT5wb3N0cHJvY19kb25lID0gMDsKKwkJCXBiaS0+cHJvY2Vzc19idXN5ID0gMDsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCisJCWlmICghdjRsX3Jlc19jaGFuZ2UocGJpKSkgeworCQkJaWYgKGN0eC0+cGFyYW1fc2V0c19mcm9tX3Vjb2RlICYmICFwYmktPnY0bF9wYXJhbXNfcGFyc2VkKSB7CisJCQkJc3RydWN0IGFtbF92ZGVjX3BzX2luZm9zIHBzOworCQkJCXN0cnVjdCB2ZGVjX2NvbXBfYnVmX2luZm8gY29tcDsKKworCQkJCXByX2RlYnVnKCJzZXQgdWNvZGUgcGFyc2VcbiIpOworCQkJCWlmIChnZXRfdmFsaWRfZG91YmxlX3dyaXRlX21vZGUocGJpKSAhPSAxNikgeworCQkJCQl2dnA5X2dldF9jb21wX2J1Zl9pbmZvKHBiaSwgJmNvbXApOworCQkJCQl2ZGVjX3Y0bF9zZXRfY29tcF9idWZfaW5mbyhjdHgsICZjb21wKTsKKwkJCQl9CisKKwkJCQl2dnA5X2dldF9wc19pbmZvKHBiaSwgJnBzKTsKKwkJCQkvKm5vdGljZSB0aGUgdjRsMiBjb2RlYy4qLworCQkJCXZkZWNfdjRsX3NldF9wc19pbmZvcyhjdHgsICZwcyk7CisKKwkJCQlwYmktPmluaXRfcGljX3cgPSBwYmktPmZyYW1lX3dpZHRoOworCQkJCXBiaS0+aW5pdF9waWNfaCA9IHBiaS0+ZnJhbWVfaGVpZ2h0OworCQkJCWluaXRfbXZfYnVmX2xpc3QocGJpKTsKKworCQkJCXBiaS0+djRsX3BhcmFtc19wYXJzZWQJPSB0cnVlOworCQkJCXBiaS0+cG9zdHByb2NfZG9uZSA9IDA7CisJCQkJcGJpLT5wcm9jZXNzX2J1c3kgPSAwOworCQkJCWRlY19hZ2Fpbl9wcm9jZXNzKHBiaSk7CisJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJfQorCQl9IGVsc2UgeworCQkJcGJpLT5wb3N0cHJvY19kb25lID0gMDsKKwkJCXBiaS0+cHJvY2Vzc19idXN5ID0gMDsKKwkJCWRlY19hZ2Fpbl9wcm9jZXNzKHBiaSk7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKwl9CisKKwljb250aW51ZV9kZWNvZGluZyhwYmkpOworCXBiaS0+cG9zdHByb2NfZG9uZSA9IDA7CisJcGJpLT5wcm9jZXNzX2J1c3kgPSAwOworCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCWlmIChwYmktPm1faW5zX2ZsYWcpCisJCXN0YXJ0X3Byb2Nlc3NfdGltZShwYmkpOworI2VuZGlmCisJQVRSQUNFX0NPVU5URVIocGJpLT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9USFJFQURfSEVBRF9FTkQpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IHZ2cDlfaXNyKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IGRlY19zdGF0dXM7CisJc3RydWN0IFZQOURlY29kZXJfcyAqcGJpID0gKHN0cnVjdCBWUDlEZWNvZGVyX3MgKilkYXRhOworCXVuc2lnbmVkIGludCBhZGFwdF9wcm9iX3N0YXR1czsKKwl1aW50IGRlYnVnX3RhZzsKKworCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTUJPWDBfQ0xSX1JFRywgMSk7CisKKwlkZWNfc3RhdHVzID0gUkVBRF9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcpOworCWlmIChkZWNfc3RhdHVzID09IFZQOV9IRUFEX1BBUlNFUl9ET05FKSB7CisJCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9JU1JfSEVBRF9ET05FKTsKKwl9CisJZWxzZSBpZiAoZGVjX3N0YXR1cyA9PSBIRVZDX0RFQ1BJQ19EQVRBX0RPTkUpIHsKKwkJQVRSQUNFX0NPVU5URVIocGJpLT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9QSUNfRE9ORSk7CisJfQorCisJYWRhcHRfcHJvYl9zdGF0dXMgPSBSRUFEX1ZSRUcoVlA5X0FEQVBUX1BST0JfUkVHKTsKKwlpZiAoIXBiaSkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCWlmIChwYmktPmluaXRfZmxhZyA9PSAwKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJaWYgKHBiaS0+cHJvY2Vzc19idXN5KS8qb24gcHJvY2Vzcy4qLworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJcGJpLT5kZWNfc3RhdHVzID0gZGVjX3N0YXR1czsKKwlwYmktPnByb2Nlc3NfYnVzeSA9IDE7CisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0JVRk1HUikKKwkJcHJfaW5mbygidnA5IGlzciAoJWQpIGRlYyBzdGF0dXMgID0gMHgleCwgbGN1IDB4JXggc2hpZnRieXRlIDB4JXggKCV4ICV4IGxldiAleCwgd3IgJXgsIHJkICV4KVxuIiwKKwkJCWlycSwKKwkJCWRlY19zdGF0dXMsIFJFQURfVlJFRyhIRVZDX1BBUlNFUl9MQ1VfU1RBUlQpLAorCQkJUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCksCisJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fU1RBUlRfQUREUiksCisJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fRU5EX0FERFIpLAorCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0xFVkVMKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9XUl9QVFIpLAorCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1JEX1BUUikKKwkJKTsKKyNpZmRlZiBTVVBQT1JUX0ZCX0RFQ09ESU5HCisJLyppZiAoaXJxICE9IFZERUNfSVJRXzApCisJCXJldHVybiBJUlFfV0FLRV9USFJFQUQ7Ki8KKyNlbmRpZgorCisJZGVidWdfdGFnID0gUkVBRF9IUkVHKERFQlVHX1JFRzEpOworCWlmIChkZWJ1Z190YWcgJiAweDEwMDAwKSB7CisJCXByX2luZm8oIkxNRU08dGFnICV4PjpcbiIsIFJFQURfSFJFRyhERUJVR19SRUcxKSk7CisJCWZvciAoaSA9IDA7IGkgPCAweDQwMDsgaSArPSA0KSB7CisJCQlpbnQgaWk7CisJCQlpZiAoKGkgJiAweGYpID09IDApCisJCQkJcHJfaW5mbygiJTAzeDogIiwgaSk7CisJCQlmb3IgKGlpID0gMDsgaWkgPCA0OyBpaSsrKSB7CisJCQkJcHJfaW5mbygiJTA0eCAiLAorCQkJCQkgICBwYmktPmxtZW1fcHRyW2kgKyAzIC0gaWldKTsKKwkJCX0KKwkJCWlmICgoKGkgKyBpaSkgJiAweGYpID09IDApCisJCQkJcHJfaW5mbygiXG4iKTsKKwkJfQorCisJCWlmICgodWRlYnVnX3BhdXNlX3BvcyA9PSAoZGVidWdfdGFnICYgMHhmZmZmKSkgJiYKKwkJCSh1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeCA9PSAwIHx8CisJCQl1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeCA9PSBwYmktPnNsaWNlX2lkeCkgJiYKKwkJCSh1ZGVidWdfcGF1c2VfdmFsID09IDAgfHwKKwkJCXVkZWJ1Z19wYXVzZV92YWwgPT0gUkVBRF9IUkVHKERFQlVHX1JFRzIpKSkKKwkJCXBiaS0+dWNvZGVfcGF1c2VfcG9zID0gdWRlYnVnX3BhdXNlX3BvczsKKwkJZWxzZSBpZiAoZGVidWdfdGFnICYgMHgyMDAwMCkKKwkJCXBiaS0+dWNvZGVfcGF1c2VfcG9zID0gMHhmZmZmZmZmZjsKKwkJaWYgKHBiaS0+dWNvZGVfcGF1c2VfcG9zKQorCQkJcmVzZXRfcHJvY2Vzc190aW1lKHBiaSk7CisJCWVsc2UKKwkJCVdSSVRFX0hSRUcoREVCVUdfUkVHMSwgMCk7CisJfSBlbHNlIGlmIChkZWJ1Z190YWcgIT0gMCkgeworCQlwcl9pbmZvKAorCQkJImRiZyV4OiAleCBsY3UgJXhcbiIsIFJFQURfSFJFRyhERUJVR19SRUcxKSwKKwkJCSAgIFJFQURfSFJFRyhERUJVR19SRUcyKSwKKwkJCSAgIFJFQURfVlJFRyhIRVZDX1BBUlNFUl9MQ1VfU1RBUlQpKTsKKwkJaWYgKCh1ZGVidWdfcGF1c2VfcG9zID09IChkZWJ1Z190YWcgJiAweGZmZmYpKSAmJgorCQkJKHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4ID09IDAgfHwKKwkJCXVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4ID09IHBiaS0+c2xpY2VfaWR4KSAmJgorCQkJKHVkZWJ1Z19wYXVzZV92YWwgPT0gMCB8fAorCQkJdWRlYnVnX3BhdXNlX3ZhbCA9PSBSRUFEX0hSRUcoREVCVUdfUkVHMikpKQorCQkJcGJpLT51Y29kZV9wYXVzZV9wb3MgPSB1ZGVidWdfcGF1c2VfcG9zOworCQlpZiAocGJpLT51Y29kZV9wYXVzZV9wb3MpCisJCQlyZXNldF9wcm9jZXNzX3RpbWUocGJpKTsKKwkJZWxzZQorCQkJV1JJVEVfSFJFRyhERUJVR19SRUcxLCAwKTsKKwkJcGJpLT5wcm9jZXNzX2J1c3kgPSAwOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCWlmICghcGJpLT5tX2luc19mbGFnKSB7CisjZW5kaWYKKwkJaWYgKHBiaS0+ZXJyb3JfZmxhZyA9PSAxKSB7CisJCQlwYmktPmVycm9yX2ZsYWcgPSAyOworCQkJcGJpLT5wcm9jZXNzX2J1c3kgPSAwOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9IGVsc2UgaWYgKHBiaS0+ZXJyb3JfZmxhZyA9PSAzKSB7CisJCQlwYmktPnByb2Nlc3NfYnVzeSA9IDA7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKworCQlpZiAoZ2V0X2ZyZWVfYnVmX2NvdW50KHBiaSkgPD0gMCkgeworCQkJLyoKKwkJCWlmIChwYmktPndhaXRfYnVmID09IDApCisJCQkJcHJfaW5mbygic2V0IHdhaXRfYnVmIHRvIDFcclxuIik7CisJCQkqLworCQkJcGJpLT53YWl0X2J1ZiA9IDE7CisJCQlwYmktPnByb2Nlc3NfYnVzeSA9IDA7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJfQorI2VuZGlmCisJaWYgKChhZGFwdF9wcm9iX3N0YXR1cyAmIDB4ZmYpID09IDB4ZmQpIHsKKwkJc3RydWN0IFZQOV9Db21tb25fcyAqY29uc3QgY20gPSAmcGJpLT5jb21tb247CisJCWludCBwcmVfZmMgPSAwOworCisJCWlmIChwYmktPm1faW5zX2ZsYWcpCisJCQkJcmVzZXRfcHJvY2Vzc190aW1lKHBiaSk7CisKKwkJaWYgKChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpICYmCisJCQkodmRlY19zZWN1cmUoaHdfdG9fdmRlYyhwYmkpKSkpIHsKKwkJCXByZV9mYyA9ICgoY20tPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKSB8fCAoY20tPmludHJhX29ubHkpKSA/IDAgOiAxOworCQkJdGVlX3ZwOV9wcm9iX3Byb2Nlc3MocHJlX2ZjLCBjbS0+bGFzdF9mcmFtZV90eXBlLAorCQkJCWFkYXB0X3Byb2Jfc3RhdHVzLCAodW5zaWduZWQgaW50KXBiaS0+cHJvYl9idWZmZXJfcGh5X2FkZHIpOworCQl9IGVsc2UgeworCQkJdWludDhfdCAqcHJldl9wcm9iX2IsICpjdXJfcHJvYl9iLCAqY291bnRfYjsKKworCQkJLypWUDlfUkVRX0FEQVBUX1BST0IqLworCQkJcHJlX2ZjID0gKChjbS0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpIHx8IChjbS0+aW50cmFfb25seSkpOworCQkJcHJldl9wcm9iX2IgPSAoKHVpbnQ4X3QgKilwYmktPnByb2JfYnVmZmVyX2FkZHIpICsKKwkJCQkoKGFkYXB0X3Byb2Jfc3RhdHVzID4+IDgpICogMHgxMDAwKTsKKwkJCWN1cl9wcm9iX2IgPSAoKHVpbnQ4X3QgKilwYmktPnByb2JfYnVmZmVyX2FkZHIpICsgMHg0MDAwOworCQkJY291bnRfYiA9ICh1aW50OF90ICopcGJpLT5jb3VudF9idWZmZXJfYWRkcjsKKworCQkJYWRhcHRfY29lZl9wcm9icyhwYmktPnBpY19jb3VudCwKKwkJCQkoY20tPmxhc3RfZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpLAorCQkJCXByZV9mYywgKGFkYXB0X3Byb2Jfc3RhdHVzID4+IDgpLAorCQkJCSh1bnNpZ25lZCBpbnQgKilwcmV2X3Byb2JfYiwKKwkJCQkodW5zaWduZWQgaW50ICopY3VyX3Byb2JfYiwgKHVuc2lnbmVkIGludCAqKWNvdW50X2IpOworCisJCQltZW1jcHkocHJldl9wcm9iX2IsIGN1cl9wcm9iX2IsIFBST0JfU0laRSk7CisJCX0KKworCQlXUklURV9WUkVHKFZQOV9BREFQVF9QUk9CX1JFRywgMCk7CisJCXBiaS0+cGljX2NvdW50ICs9IDE7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQlpZiAocGJpLT5tX2luc19mbGFnKQorCQkJc3RhcnRfcHJvY2Vzc190aW1lKHBiaSk7CisjZW5kaWYKKwl9CisJQVRSQUNFX0NPVU5URVIocGJpLT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9FTkQpOworCXJldHVybiBJUlFfV0FLRV9USFJFQUQ7Cit9CisKK3N0YXRpYyB2b2lkIHZwOV9zZXRfY2xrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkgPSBjb250YWluZXJfb2Yod29yaywKKwkJc3RydWN0IFZQOURlY29kZXJfcywgc2V0X2Nsa193b3JrKTsKKwlpbnQgZnBzID0gOTYwMDAgLyBwYmktPmZyYW1lX2R1cjsKKworCWlmIChoZXZjX3NvdXJjZV9jaGFuZ2VkKFZGT1JNQVRfVlA5LAorCQlmcmFtZV93aWR0aCwgZnJhbWVfaGVpZ2h0LCBmcHMpID4gMCkKKwkJcGJpLT5zYXZlZF9yZXNvbHV0aW9uID0gZnJhbWVfd2lkdGggKgorCQlmcmFtZV9oZWlnaHQgKiBmcHM7Cit9CisKK3N0YXRpYyB2b2lkIHZ2cDlfcHV0X3RpbWVyX2Z1bmMoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworCXN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSA9IGNvbnRhaW5lcl9vZih0aW1lciwKKwkJc3RydWN0IFZQOURlY29kZXJfcywgdGltZXIpOworCWVudW0gcmVjZXZpdmVyX3N0YXJ0X2Ugc3RhdGUgPSBSRUNFSVZFUl9JTkFDVElWRTsKKwl1aW50OF90IGVtcHR5X2ZsYWc7CisJdW5zaWduZWQgaW50IGJ1Zl9sZXZlbDsKKworCWlmIChwYmktPm1faW5zX2ZsYWcpIHsKKwkJaWYgKGh3X3RvX3ZkZWMocGJpKS0+bmV4dF9zdGF0dXMKKwkJCT09IFZERUNfU1RBVFVTX0RJU0NPTk5FQ1RFRCAmJgorCQkJIXBiaS0+aXNfdXNlZF92NGwpIHsKKyNpZmRlZiBTVVBQT1JUX0ZCX0RFQ09ESU5HCisJCQlpZiAocGJpLT5ydW4yX2J1c3kpCisJCQkJcmV0dXJuOworCisJCQlwYmktPmRlY19zMV9yZXN1bHQgPSBERUNfUzFfUkVTVUxUX0ZPUkNFX0VYSVQ7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJnBiaS0+czFfd29yayk7CisjZW5kaWYKKwkJCXBiaS0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRk9SQ0VfRVhJVDsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmcGJpLT53b3JrKTsKKwkJCXByX2RlYnVnKAorCQkJInZkZWMgcmVxdWVzdGVkIHRvIGJlIGRpc2Nvbm5lY3RlZFxuIik7CisJCQlyZXR1cm47CisJCX0KKwl9CisJaWYgKHBiaS0+aW5pdF9mbGFnID09IDApIHsKKwkJaWYgKHBiaS0+c3RhdCAmIFNUQVRfVElNRVJfQVJNKSB7CisJCQl0aW1lci0+ZXhwaXJlcyA9IGppZmZpZXMgKyBQVVRfSU5URVJWQUw7CisJCQlhZGRfdGltZXIoJnBiaS0+dGltZXIpOworCQl9CisJCXJldHVybjsKKwl9CisJaWYgKHBiaS0+bV9pbnNfZmxhZyA9PSAwKSB7CisJCWlmICh2Zl9nZXRfcmVjZWl2ZXIocGJpLT5wcm92aWRlcl9uYW1lKSkgeworCQkJc3RhdGUgPQorCQkJCXZmX25vdGlmeV9yZWNlaXZlcihwYmktPnByb3ZpZGVyX25hbWUsCisJCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9RVVJFWV9TVEFURSwKKwkJCQkJTlVMTCk7CisJCQlpZiAoKHN0YXRlID09IFJFQ0VJVkVSX1NUQVRFX05VTEwpCisJCQkJfHwgKHN0YXRlID09IFJFQ0VJVkVSX1NUQVRFX05PTkUpKQorCQkJCXN0YXRlID0gUkVDRUlWRVJfSU5BQ1RJVkU7CisJCX0gZWxzZQorCQkJc3RhdGUgPSBSRUNFSVZFUl9JTkFDVElWRTsKKworCQllbXB0eV9mbGFnID0gKFJFQURfVlJFRyhIRVZDX1BBUlNFUl9JTlRfU1RBVFVTKSA+PiA2KSAmIDB4MTsKKwkJLyogZXJyb3Igd2F0Y2hkb2cgKi8KKwkJaWYgKGVtcHR5X2ZsYWcgPT0gMCkgeworCQkJLyogZGVjb2RlciBoYXMgaW5wdXQgKi8KKwkJCWlmICgoZGVidWcgJiBWUDlfREVCVUdfRElTX0xPQ19FUlJPUl9QUk9DKSA9PSAwKSB7CisKKwkJCQlidWZfbGV2ZWwgPSBSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fTEVWRUwpOworCQkJCS8qIHJlY2VpdmVyIGhhcyBubyBidWZmZXIgdG8gcmVjeWNsZSAqLworCQkJCWlmICgoc3RhdGUgPT0gUkVDRUlWRVJfSU5BQ1RJVkUpICYmCisJCQkJCShrZmlmb19pc19lbXB0eSgmcGJpLT5kaXNwbGF5X3EpICYmCisJCQkJCSBidWZfbGV2ZWwgPiAweDIwMCkKKwkJCQkJKSB7CisJCQkJCQlXUklURV9WUkVHCisJCQkJCQkoSEVWQ19BU1NJU1RfTUJPWDBfSVJRX1JFRywKKwkJCQkJCSAweDEpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKChkZWJ1ZyAmIFZQOV9ERUJVR19ESVNfU1lTX0VSUk9SX1BST0MpID09IDApIHsKKwkJCQkvKiByZWNlaXZlciBoYXMgbm8gYnVmZmVyIHRvIHJlY3ljbGUgKi8KKwkJCQkvKmlmICgoc3RhdGUgPT0gUkVDRUlWRVJfSU5BQ1RJVkUpICYmCisJCQkJICoJKGtmaWZvX2lzX2VtcHR5KCZwYmktPmRpc3BsYXlfcSkpKSB7CisJCQkJICpwcl9pbmZvKCJ2cDkgc29tZXRoaW5nIGVycm9yLG5lZWQgcmVzZXRcbiIpOworCQkJCSAqfQorCQkJCSAqLworCQkJfQorCQl9CisJfQorI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwllbHNlIHsKKwkJaWYgKAorCQkJKGRlY29kZV90aW1lb3V0X3ZhbCA+IDApICYmCisJCQkocGJpLT5zdGFydF9wcm9jZXNzX3RpbWUgPiAwKSAmJgorCQkJKCgxMDAwICogKGppZmZpZXMgLSBwYmktPnN0YXJ0X3Byb2Nlc3NfdGltZSkgLyBIWikKKwkJCQk+IGRlY29kZV90aW1lb3V0X3ZhbCkKKwkJKSB7CisJCQlpbnQgY3VycmVudF9sY3VfaWR4ID0KKwkJCQlSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfTENVX1NUQVJUKQorCQkJCSYgMHhmZmZmZmY7CisJCQlpZiAocGJpLT5sYXN0X2xjdV9pZHggPT0gY3VycmVudF9sY3VfaWR4KSB7CisJCQkJaWYgKHBiaS0+ZGVjb2RlX3RpbWVvdXRfY291bnQgPiAwKQorCQkJCQlwYmktPmRlY29kZV90aW1lb3V0X2NvdW50LS07CisJCQkJaWYgKHBiaS0+ZGVjb2RlX3RpbWVvdXRfY291bnQgPT0gMCkgeworCQkJCQlpZiAoaW5wdXRfZnJhbWVfYmFzZWQoCisJCQkJCQlod190b192ZGVjKHBiaSkpIHx8CisJCQkJCShSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fTEVWRUwpID4gMHgyMDApKQorCQkJCQkJdGltZW91dF9wcm9jZXNzKHBiaSk7CisJCQkJCWVsc2UgeworCQkJCQkJdnA5X3ByaW50KHBiaSwgMCwKKwkJCQkJCQkidGltZW91dCAmIGVtcHR5LCBhZ2FpblxuIik7CisJCQkJCQlkZWNfYWdhaW5fcHJvY2VzcyhwYmkpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlzdGFydF9wcm9jZXNzX3RpbWUocGJpKTsKKwkJCQlwYmktPmxhc3RfbGN1X2lkeCA9IGN1cnJlbnRfbGN1X2lkeDsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCisJaWYgKChwYmktPnVjb2RlX3BhdXNlX3BvcyAhPSAwKSAmJgorCQkocGJpLT51Y29kZV9wYXVzZV9wb3MgIT0gMHhmZmZmZmZmZikgJiYKKwkJdWRlYnVnX3BhdXNlX3BvcyAhPSBwYmktPnVjb2RlX3BhdXNlX3BvcykgeworCQlwYmktPnVjb2RlX3BhdXNlX3BvcyA9IDA7CisJCVdSSVRFX0hSRUcoREVCVUdfUkVHMSwgMCk7CisJfQorI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfRk9SQ0VfU0VORF9BR0FJTikgeworCQlwcl9pbmZvKAorCQkiRm9yY2UgU2VuZCBBZ2FpblxyXG4iKTsKKwkJZGVidWcgJj0gflZQOV9ERUJVR19GT1JDRV9TRU5EX0FHQUlOOworCQlyZXNldF9wcm9jZXNzX3RpbWUocGJpKTsKKwkJcGJpLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKwkJaWYgKHBiaS0+cHJvY2Vzc19zdGF0ZSA9PQorCQkJUFJPQ19TVEFURV9ERUNPREVTTElDRSkgeworCQkJaWYgKHBiaS0+bW11X2VuYWJsZSkKKwkJCQl2cDlfcmVjeWNsZV9tbXVfYnVmKHBiaSk7CisJCQlwYmktPnByb2Nlc3Nfc3RhdGUgPQorCQkJUFJPQ19TVEFURV9TRU5EQUdBSU47CisJCX0KKwkJYW1oZXZjX3N0b3AoKTsKKworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJnBiaS0+d29yayk7CisJfQorCisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0RVTVBfREFUQSkgeworCQlkZWJ1ZyAmPSB+VlA5X0RFQlVHX0RVTVBfREFUQTsKKwkJdnA5X3ByaW50KHBiaSwgMCwKKwkJCSIlczogY2h1bmsgc2l6ZSAweCV4IG9mZiAweCV4IHN1bSAweCV4XG4iLAorCQkJX19mdW5jX18sCisJCQlwYmktPmNodW5rLT5zaXplLAorCQkJcGJpLT5jaHVuay0+b2Zmc2V0LAorCQkJZ2V0X2RhdGFfY2hlY2tfc3VtKHBiaSwgcGJpLT5jaHVuay0+c2l6ZSkKKwkJCSk7CisJCWR1bXBfZGF0YShwYmksIHBiaS0+Y2h1bmstPnNpemUpOworCX0KKyNlbmRpZgorCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19EVU1QX1BJQ19MSVNUKSB7CisJCWR1bXBfcGljX2xpc3QocGJpKTsKKwkJZGVidWcgJj0gflZQOV9ERUJVR19EVU1QX1BJQ19MSVNUOworCX0KKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfVFJJR19TTElDRV9TRUdNRU5UX1BST0MpIHsKKwkJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9NQk9YMF9JUlFfUkVHLCAweDEpOworCQlkZWJ1ZyAmPSB+VlA5X0RFQlVHX1RSSUdfU0xJQ0VfU0VHTUVOVF9QUk9DOworCX0KKwkvKmlmIChkZWJ1ZyAmIFZQOV9ERUJVR19IV19SRVNFVCkgeworCX0qLworCisJaWYgKHJhZHIgIT0gMCkgeworCQlpZiAocnZhbCAhPSAwKSB7CisJCQlXUklURV9WUkVHKHJhZHIsIHJ2YWwpOworCQkJcHJfaW5mbygiV1JJVEVfVlJFRygleCwleClcbiIsIHJhZHIsIHJ2YWwpOworCQl9IGVsc2UKKwkJCXByX2luZm8oIlJFQURfVlJFRygleCk9JXhcbiIsIHJhZHIsIFJFQURfVlJFRyhyYWRyKSk7CisJCXJ2YWwgPSAwOworCQlyYWRyID0gMDsKKwl9CisJaWYgKHBvcF9zaG9ydHMgIT0gMCkgeworCQlpbnQgaTsKKwkJdTMyIHN1bSA9IDA7CisKKwkJcHJfaW5mbygicG9wIHN0cmVhbSAweCV4IHNob3J0c1xyXG4iLCBwb3Bfc2hvcnRzKTsKKwkJZm9yIChpID0gMDsgaSA8IHBvcF9zaG9ydHM7IGkrKykgeworCQkJdTMyIGRhdGEgPQorCQkJKFJFQURfSFJFRyhIRVZDX1NISUZURURfREFUQSkgPj4gMTYpOworCQkJV1JJVEVfSFJFRyhIRVZDX1NISUZUX0NPTU1BTkQsCisJCQkoMTw8Nyl8MTYpOworCQkJaWYgKChpICYgMHhmKSA9PSAwKQorCQkJCXByX2luZm8oIiUwNHg6IiwgaSk7CisJCQlwcl9pbmZvKCIlMDR4ICIsIGRhdGEpOworCQkJaWYgKCgoaSArIDEpICYgMHhmKSA9PSAwKQorCQkJCXByX2luZm8oIlxyXG4iKTsKKwkJCXN1bSArPSBkYXRhOworCQl9CisJCXByX2luZm8oIlxyXG5zdW0gPSAleFxyXG4iLCBzdW0pOworCQlwb3Bfc2hvcnRzID0gMDsKKwl9CisJaWYgKGRiZ19jbWQgIT0gMCkgeworCQlpZiAoZGJnX2NtZCA9PSAxKSB7CisJCQl1MzIgZGlzcF9sYWRkcjsKKworCQkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hCQiAmJgorCQkJCWdldF9kb3VibGVfd3JpdGVfbW9kZShwYmkpID09IDApIHsKKwkJCQlkaXNwX2xhZGRyID0KKwkJCQkJUkVBRF9WQ0JVU19SRUcoQUZCQ19CT0RZX0JBRERSKSA8PCA0OworCQkJfSBlbHNlIHsKKwkJCQlzdHJ1Y3QgY2FudmFzX3MgY3VyX2NhbnZhczsKKworCQkJCWNhbnZhc19yZWFkKChSRUFEX1ZDQlVTX1JFRyhWRDFfSUYwX0NBTlZBUzApCisJCQkJCSYgMHhmZiksICZjdXJfY2FudmFzKTsKKwkJCQlkaXNwX2xhZGRyID0gY3VyX2NhbnZhcy5hZGRyOworCQkJfQorCQkJcHJfaW5mbygiY3VycmVudCBkaXNwbGF5ZWQgYnVmZmVyIGFkZHJlc3MgJXhcclxuIiwKKwkJCQlkaXNwX2xhZGRyKTsKKwkJfQorCQlkYmdfY21kID0gMDsKKwl9CisJLypkb24ndCBjaGFuZ2VkIGF0IHN0YXJ0LiovCisJaWYgKHBiaS0+Z2V0X2ZyYW1lX2R1ciAmJiBwYmktPnNob3dfZnJhbWVfbnVtID4gNjAgJiYKKwkJcGJpLT5mcmFtZV9kdXIgPiAwICYmIHBiaS0+c2F2ZWRfcmVzb2x1dGlvbiAhPQorCQlmcmFtZV93aWR0aCAqIGZyYW1lX2hlaWdodCAqCisJCQkoOTYwMDAgLyBwYmktPmZyYW1lX2R1cikpCisJCXZkZWNfc2NoZWR1bGVfd29yaygmcGJpLT5zZXRfY2xrX3dvcmspOworCisJdGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgUFVUX0lOVEVSVkFMOworCWFkZF90aW1lcih0aW1lcik7Cit9CisKKworaW50IHZ2cDlfZGVjX3N0YXR1cyhzdHJ1Y3QgdmRlY19zICp2ZGVjLCBzdHJ1Y3QgdmRlY19pbmZvICp2c3RhdHVzKQoreworCXN0cnVjdCBWUDlEZWNvZGVyX3MgKnZwOSA9CisJCShzdHJ1Y3QgVlA5RGVjb2Rlcl9zICopdmRlYy0+cHJpdmF0ZTsKKworCWlmICghdnA5KQorCQlyZXR1cm4gLTE7CisKKwl2c3RhdHVzLT5mcmFtZV93aWR0aCA9IGZyYW1lX3dpZHRoOworCXZzdGF0dXMtPmZyYW1lX2hlaWdodCA9IGZyYW1lX2hlaWdodDsKKwlpZiAodnA5LT5lcnJvcl9mcmFtZV93aWR0aCAmJgorCQl2cDktPmVycm9yX2ZyYW1lX2hlaWdodCkgeworCQl2c3RhdHVzLT5mcmFtZV93aWR0aCA9IHZwOS0+ZXJyb3JfZnJhbWVfd2lkdGg7CisJCXZzdGF0dXMtPmZyYW1lX2hlaWdodCA9IHZwOS0+ZXJyb3JfZnJhbWVfaGVpZ2h0OworCX0KKworCWlmICh2cDktPmZyYW1lX2R1ciAhPSAwKQorCQl2c3RhdHVzLT5mcmFtZV9yYXRlID0gKCg5NjAwMCAqIDEwIC8gdnA5LT5mcmFtZV9kdXIpICUgMTApIDwgNSA/CisJCQkJOTYwMDAgLyB2cDktPmZyYW1lX2R1ciA6ICg5NjAwMCAvIHZwOS0+ZnJhbWVfZHVyICsxKTsKKwllbHNlCisJCXZzdGF0dXMtPmZyYW1lX3JhdGUgPSAtMTsKKwl2c3RhdHVzLT5lcnJvcl9jb3VudCA9IDA7CisJdnN0YXR1cy0+c3RhdHVzID0gdnA5LT5zdGF0IHwgdnA5LT5mYXRhbF9lcnJvcjsKKwl2c3RhdHVzLT5mcmFtZV9kdXIgPSB2cDktPmZyYW1lX2R1cjsKKwl2c3RhdHVzLT5iaXRfcmF0ZSA9IHZwOS0+Z3ZzLT5iaXRfcmF0ZTsKKwl2c3RhdHVzLT5mcmFtZV9kYXRhID0gdnA5LT5ndnMtPmZyYW1lX2RhdGE7CisJdnN0YXR1cy0+dG90YWxfZGF0YSA9IHZwOS0+Z3ZzLT50b3RhbF9kYXRhOworCXZzdGF0dXMtPmZyYW1lX2NvdW50ID0gdnA5LT5ndnMtPmZyYW1lX2NvdW50OworCXZzdGF0dXMtPmVycm9yX2ZyYW1lX2NvdW50ID0gdnA5LT5ndnMtPmVycm9yX2ZyYW1lX2NvdW50OworCXZzdGF0dXMtPmRyb3BfZnJhbWVfY291bnQgPSB2cDktPmd2cy0+ZHJvcF9mcmFtZV9jb3VudDsKKwl2c3RhdHVzLT5pX2RlY29kZWRfZnJhbWVzID0gdnA5LT5ndnMtPmlfZGVjb2RlZF9mcmFtZXM7CisJdnN0YXR1cy0+aV9sb3N0X2ZyYW1lcyA9IHZwOS0+Z3ZzLT5pX2xvc3RfZnJhbWVzOworCXZzdGF0dXMtPmlfY29uY2VhbGVkX2ZyYW1lcyA9IHZwOS0+Z3ZzLT5pX2NvbmNlYWxlZF9mcmFtZXM7CisJdnN0YXR1cy0+cF9kZWNvZGVkX2ZyYW1lcyA9IHZwOS0+Z3ZzLT5wX2RlY29kZWRfZnJhbWVzOworCXZzdGF0dXMtPnBfbG9zdF9mcmFtZXMgPSB2cDktPmd2cy0+cF9sb3N0X2ZyYW1lczsKKwl2c3RhdHVzLT5wX2NvbmNlYWxlZF9mcmFtZXMgPSB2cDktPmd2cy0+cF9jb25jZWFsZWRfZnJhbWVzOworCXZzdGF0dXMtPmJfZGVjb2RlZF9mcmFtZXMgPSB2cDktPmd2cy0+Yl9kZWNvZGVkX2ZyYW1lczsKKwl2c3RhdHVzLT5iX2xvc3RfZnJhbWVzID0gdnA5LT5ndnMtPmJfbG9zdF9mcmFtZXM7CisJdnN0YXR1cy0+Yl9jb25jZWFsZWRfZnJhbWVzID0gdnA5LT5ndnMtPmJfY29uY2VhbGVkX2ZyYW1lczsKKwl2c3RhdHVzLT50b3RhbF9kYXRhID0gdnA5LT5ndnMtPnRvdGFsX2RhdGE7CisJdnN0YXR1cy0+c2FtcF9jbnQgPSB2cDktPmd2cy0+c2FtcF9jbnQ7CisJdnN0YXR1cy0+b2Zmc2V0ID0gdnA5LT5ndnMtPm9mZnNldDsKKwlzbnByaW50Zih2c3RhdHVzLT52ZGVjX25hbWUsIHNpemVvZih2c3RhdHVzLT52ZGVjX25hbWUpLAorCQkiJXMiLCBEUklWRVJfTkFNRSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCB2dnA5X3NldF9pc3Jlc2V0KHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBpc3Jlc2V0KQoreworCWlzX3Jlc2V0ID0gaXNyZXNldDsKKwlyZXR1cm4gMDsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIFZQOV9ERUNPREVfSU5JVCh2b2lkKQoreworCS8qIGVuYWJsZSB2cDkgY2xvY2tzICovCisJV1JJVEVfVlJFRyhET1NfR0NMS19FTjMsIDB4ZmZmZmZmZmYpOworCS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCS8qIFBvd2VyIE9OIEhFVkMgKi8KKwkvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwkvKiBQb3dlcnVwIEhFVkMgKi8KKwlXUklURV9WUkVHKEFPX1JUSV9HRU5fUFdSX1NMRUVQMCwKKwkJCVJFQURfVlJFRyhBT19SVElfR0VOX1BXUl9TTEVFUDApICYgKH4oMHgzIDw8IDYpKSk7CisJV1JJVEVfVlJFRyhET1NfTUVNX1BEX0hFVkMsIDB4MCk7CisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQzLCBSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMykgfCAoMHgzZmZmZiA8PCAyKSk7CisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQzLCBSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMykgJiAofigweDNmZmZmIDw8IDIpKSk7CisJLyogcmVtb3ZlIGlzb2xhdGlvbnMgKi8KKwlXUklURV9WUkVHKEFPX1JUSV9HRU5fUFdSX0lTTzAsCisJCQlSRUFEX1ZSRUcoQU9fUlRJX0dFTl9QV1JfSVNPMCkgJiAofigweDMgPDwgMTApKSk7CisKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB2dnA5X3Byb3RfaW5pdChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksIHUzMiBtYXNrKQoreworCXVuc2lnbmVkIGludCBkYXRhMzI7CisJLyogVlA5X0RFQ09ERV9JTklUKCk7ICovCisJdnA5X2NvbmZpZ193b3JrX3NwYWNlX2h3KHBiaSwgbWFzayk7CisJaWYgKG1hc2sgJiBIV19NQVNLX0JBQ0spCisJCWluaXRfcGljX2xpc3RfaHcocGJpKTsKKworCXZwOV9pbml0X2RlY29kZXJfaHcocGJpLCBtYXNrKTsKKworI2lmZGVmIFZQOV9MUEZfTFZMX1VQREFURQorCWlmIChtYXNrICYgSFdfTUFTS19CQUNLKQorCQl2cDlfbG9vcF9maWx0ZXJfaW5pdChwYmkpOworI2VuZGlmCisKKwlpZiAoKG1hc2sgJiBIV19NQVNLX0ZST05UKSA9PSAwKQorCQlyZXR1cm47CisjaWYgMQorCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19CVUZNR1JfTU9SRSkKKwkJcHJfaW5mbygiJXNcbiIsIF9fZnVuY19fKTsKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fQ09OVFJPTCk7CisJZGF0YTMyID0gZGF0YTMyIHwKKwkJKDEgPDwgMCkvKnN0cmVhbV9mZXRjaF9lbmFibGUqLworCQk7CisJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9DT05UUk9MLCBkYXRhMzIpOworCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQSkgeworCSAgICBpZiAoZGVidWcgJiBWUDlfREVCVUdfQlVGTUdSKQorCSAgICAgICAgcHJfaW5mbygiW3Rlc3QuY10gQ29uZmlnIFNUUkVBTV9GSUZPX0NUTFxuIik7CisJICAgIGRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NUUkVBTV9GSUZPX0NUTCk7CisJICAgIGRhdGEzMiA9IGRhdGEzMiB8CisJICAgICAgICAgICAgICgxIDw8IDI5KSAvLyBzdHJlYW1fZmlmb19ob2xlCisJICAgICAgICAgICAgIDsKKwkgICAgV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9GSUZPX0NUTCwgZGF0YTMyKTsKKwl9CisjaWYgMAorCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NISUZUX1NUQVJUQ09ERSk7CisJaWYgKGRhdGEzMiAhPSAweDAwMDAwMTAwKSB7CisJCXByX2luZm8oInZwOSBwcm90IGluaXQgZXJyb3IgJWRcbiIsIF9fTElORV9fKTsKKwkJcmV0dXJuOworCX0KKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9FTVVMQVRFQ09ERSk7CisJaWYgKGRhdGEzMiAhPSAweDAwMDAwMzAwKSB7CisJCXByX2luZm8oInZwOSBwcm90IGluaXQgZXJyb3IgJWRcbiIsIF9fTElORV9fKTsKKwkJcmV0dXJuOworCX0KKwlXUklURV9WUkVHKEhFVkNfU0hJRlRfU1RBUlRDT0RFLCAweDEyMzQ1Njc4KTsKKwlXUklURV9WUkVHKEhFVkNfU0hJRlRfRU1VTEFURUNPREUsIDB4OWFiY2RlZjApOworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NISUZUX1NUQVJUQ09ERSk7CisJaWYgKGRhdGEzMiAhPSAweDEyMzQ1Njc4KSB7CisJCXByX2luZm8oInZwOSBwcm90IGluaXQgZXJyb3IgJWRcbiIsIF9fTElORV9fKTsKKwkJcmV0dXJuOworCX0KKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9FTVVMQVRFQ09ERSk7CisJaWYgKGRhdGEzMiAhPSAweDlhYmNkZWYwKSB7CisJCXByX2luZm8oInZwOSBwcm90IGluaXQgZXJyb3IgJWRcbiIsIF9fTElORV9fKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9TVEFSVENPREUsIDB4MDAwMDAwMDAxKTsKKwlXUklURV9WUkVHKEhFVkNfU0hJRlRfRU1VTEFURUNPREUsIDB4MDAwMDAzMDApOworI2VuZGlmCisKKworCisJV1JJVEVfVlJFRyhIRVZDX1dBSVRfRkxBRywgMSk7CisKKwkvKiBXUklURV9WUkVHKEhFVkNfTVBTUiwgMSk7ICovCisKKwkvKiBjbGVhciBtYWlsYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTUJPWDBfQ0xSX1JFRywgMSk7CisKKwkvKiBlbmFibGUgbWFpbGJveCBpbnRlcnJ1cHQgKi8KKwlXUklURV9WUkVHKEhFVkNfQVNTSVNUX01CT1gwX01BU0ssIDEpOworCisJLyogZGlzYWJsZSBQU0NBTEUgZm9yIGhhcmR3YXJlIHNoYXJpbmcgKi8KKwlXUklURV9WUkVHKEhFVkNfUFNDQUxFX0NUUkwsIDApOworCisJV1JJVEVfVlJFRyhERUJVR19SRUcxLCAweDApOworCS8qY2hlY2sgdnBzL3Nwcy9wcHMvaS1zbGljZSBpbiB1Y29kZSovCisJV1JJVEVfVlJFRyhOQUxfU0VBUkNIX0NUTCwgMHg4KTsKKworCVdSSVRFX1ZSRUcoREVDT0RFX1NUT1BfUE9TLCB1ZGVidWdfZmxhZyk7CisjaWZkZWYgU1VQUE9SVF9GQl9ERUNPRElORworI2lmbmRlZiBGQl9ERUNPRElOR19URVNUX1NDSEVEVUxFCisJaWYgKHBiaS0+dXNlZF9zdGFnZV9idWZfbnVtID4gMCkgeworCQlpZiAobWFzayAmIEhXX01BU0tfRlJPTlQpIHsKKwkJCWRhdGEzMiA9IFJFQURfVlJFRygKKwkJCQlIRVZDX0FTU0lTVF9IRURfRkJfV19DVEwpOworCQkJZGF0YTMyID0gZGF0YTMyIHwKKwkJCQkoMSA8PCAwKSAvKmhlZF9mYl93cl9lbiovCisJCQkJOworCQkJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9IRURfRkJfV19DVEwsCisJCQkJZGF0YTMyKTsKKwkJfQorCQlpZiAobWFzayAmIEhXX01BU0tfQkFDSykgeworCQkJZGF0YTMyID0gUkVBRF9WUkVHKAorCQkJCUhFVkNfQVNTSVNUX0hFRF9GQl9SX0NUTCk7CisJCQl3aGlsZSAoZGF0YTMyICYgKDEgPDwgNykpIHsKKwkJCQkvKndhaXQgZmluaXNoKi8KKwkJCQlkYXRhMzIgPSBSRUFEX1ZSRUcoCisJCQkJCUhFVkNfQVNTSVNUX0hFRF9GQl9SX0NUTCk7CisJCQl9CisJCQlkYXRhMzIgJj0gKH4oMHgxIDw8IDApKTsKKwkJCS8qaGVkX2ZiX3JkX2FkZHJfYXV0b19yZCovCisJCQlkYXRhMzIgJj0gKH4oMHgxIDw8IDEpKTsKKwkJCS8qcmRfaWQgPSAwLCBoZWRfcmRfbWFwX2F1dG9faGFsdF9udW0sCisJCQlhZnRlciB3ciAyIHJlYWR5LCB0aGVuIHN0YXJ0IHJlYWRpbmcqLworCQkJZGF0YTMyIHw9ICgweDIgPDwgMTYpOworCQkJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9IRURfRkJfUl9DVEwsCisJCQkJZGF0YTMyKTsKKworCQkJZGF0YTMyIHw9ICgweDEgPDwgMTEpOyAvKmhlZF9yZF9tYXBfYXV0b19oYWx0X2VuKi8KKwkJCWRhdGEzMiB8PSAoMHgxIDw8IDEpOyAvKmhlZF9mYl9yZF9hZGRyX2F1dG9fcmQqLworCQkJZGF0YTMyIHw9ICgweDEgPDwgMCk7IC8qaGVkX2ZiX3JkX2VuKi8KKwkJCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfSEVEX0ZCX1JfQ1RMLAorCQkJCWRhdGEzMik7CisJCX0KKworCX0KKyNlbmRpZgorI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgdnZwOV9sb2NhbF9pbml0KHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlpbnQgaTsKKwlpbnQgcmV0OworCWludCB3aWR0aCwgaGVpZ2h0OworCWlmIChhbGxvY19sZl9idWYocGJpKSA8IDApCisJCXJldHVybiAtMTsKKworCXBiaS0+Z3ZzID0gdnphbGxvYyhzaXplb2Yoc3RydWN0IHZkZWNfaW5mbykpOworCWlmIChOVUxMID09IHBiaS0+Z3ZzKSB7CisJCXByX2luZm8oInRoZSBzdHJ1Y3Qgb2YgdmRlYyBzdGF0dXMgbWFsbG9jIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXZkZWNfc2V0X3ZmcmFtZV9jb21tKGh3X3RvX3ZkZWMocGJpKSwgRFJJVkVSX05BTUUpOworI2lmZGVmIERFQlVHX1BUUworCXBiaS0+cHRzX21pc3NlZCA9IDA7CisJcGJpLT5wdHNfaGl0ID0gMDsKKyNlbmRpZgorCXBiaS0+bmV3X2ZyYW1lX2Rpc3BsYXllZCA9IDA7CisJcGJpLT5sYXN0X3B1dF9pZHggPSAtMTsKKwlwYmktPnNhdmVkX3Jlc29sdXRpb24gPSAwOworCXBiaS0+Z2V0X2ZyYW1lX2R1ciA9IGZhbHNlOworCW9uX25vX2tleWZyYW1lX3NraXBlZCA9IDA7CisJcGJpLT5kdXJhdGlvbl9mcm9tX3B0c19kb25lID0gMDsKKwlwYmktPnZwOV9maXJzdF9wdHNfcmVhZHkgPSAwOworCXBiaS0+ZnJhbWVfY250X3dpbmRvdyA9IDA7CisJd2lkdGggPSBwYmktPnZ2cDlfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGg7CisJaGVpZ2h0ID0gcGJpLT52dnA5X2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodDsKKwlwYmktPmZyYW1lX2R1ciA9CisJCShwYmktPnZ2cDlfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSA9PQorCQkgMCkgPyAzMjAwIDogcGJpLT52dnA5X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGU7CisJaWYgKHdpZHRoICYmIGhlaWdodCkKKwkJcGJpLT5mcmFtZV9hciA9IGhlaWdodCAqIDB4MTAwIC8gd2lkdGg7CisvKgorICpUT0RPOkZPUiBWRVJTSU9OCisgKi8KKwlwcl9pbmZvKCJ2cDk6IHZlciAoJWQsJWQpIGRlY2luZm86ICVkeCVkIHJhdGU9JWRcbiIsIHZwOV92ZXJzaW9uLAorCQkgICAwLCB3aWR0aCwgaGVpZ2h0LCBwYmktPmZyYW1lX2R1cik7CisKKwlpZiAocGJpLT5mcmFtZV9kdXIgPT0gMCkKKwkJcGJpLT5mcmFtZV9kdXIgPSA5NjAwMCAvIDI0OworCisJSU5JVF9LRklGTyhwYmktPmRpc3BsYXlfcSk7CisJSU5JVF9LRklGTyhwYmktPm5ld2ZyYW1lX3EpOworCisKKwlmb3IgKGkgPSAwOyBpIDwgVkZfUE9PTF9TSVpFOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IHZmcmFtZV9zICp2ZiA9ICZwYmktPnZmcG9vbFtpXTsKKworCQlwYmktPnZmcG9vbFtpXS5pbmRleCA9IC0xOworCQlrZmlmb19wdXQoJnBiaS0+bmV3ZnJhbWVfcSwgdmYpOworCX0KKworCisJcmV0ID0gdnA5X2xvY2FsX2luaXQocGJpKTsKKworCWlmICghcGJpLT5wdHNfdW5zdGFibGUpIHsKKwkJcGJpLT5wdHNfdW5zdGFibGUgPQorCQkocGJpLT52dnA5X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgPT0gMCk/MTowOworCQlwcl9pbmZvKCJzZXQgcHRzIHVuc3RhYmxlXG4iKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCitzdGF0aWMgczMyIHZ2cDlfaW5pdChzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSA9IChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICopdmRlYy0+cHJpdmF0ZTsKKyNlbHNlCitzdGF0aWMgczMyIHZ2cDlfaW5pdChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisjZW5kaWYKKwlpbnQgcmV0OworCWludCBmd19zaXplID0gMHgxMDAwICogMTY7CisJc3RydWN0IGZpcm13YXJlX3MgKmZ3ID0gTlVMTDsKKworCXBiaS0+c3RhdCB8PSBTVEFUX1RJTUVSX0lOSVQ7CisKKwlpZiAodnZwOV9sb2NhbF9pbml0KHBiaSkgPCAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJZncgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgZmlybXdhcmVfcykgKyBmd19zaXplKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZncpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChnZXRfZmlybXdhcmVfZGF0YShWSURFT19ERUNfVlA5X01NVSwgZnctPmRhdGEpIDwgMCkgeworCQlwcl9lcnIoImdldCBmaXJtd2FyZSBmYWlsLlxuIik7CisJCXZmcmVlKGZ3KTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZ3LT5sZW4gPSBmd19zaXplOworCisJSU5JVF9XT1JLKCZwYmktPnNldF9jbGtfd29yaywgdnA5X3NldF9jbGspOworCXRpbWVyX3NldHVwKCZwYmktPnRpbWVyLCB2dnA5X3B1dF90aW1lcl9mdW5jLCAwKTsKKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlpZiAocGJpLT5tX2luc19mbGFnKSB7CisJCXBiaS0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBQVVRfSU5URVJWQUw7CisKKwkJLyphZGRfdGltZXIoJnBiaS0+dGltZXIpOworCisJCXBiaS0+c3RhdCB8PSBTVEFUX1RJTUVSX0FSTTsKKwkJcGJpLT5zdGF0IHw9IFNUQVRfSVNSX1JFRzsqLworCisJCUlOSVRfV09SSygmcGJpLT53b3JrLCB2cDlfd29yayk7CisJCUlOSVRfV09SSygmcGJpLT5yZWN5Y2xlX21tdV93b3JrLCB2cDlfcmVjeWNsZV9tbXVfd29yayk7CisjaWZkZWYgU1VQUE9SVF9GQl9ERUNPRElORworCQlpZiAocGJpLT51c2VkX3N0YWdlX2J1Zl9udW0gPiAwKQorCQkJSU5JVF9XT1JLKCZwYmktPnMxX3dvcmssIHZwOV9zMV93b3JrKTsKKyNlbmRpZgorCQlwYmktPmZ3ID0gZnc7CisKKwkJLyogcGljdHVyZSBsaXN0IGluaXQuKi8KKwkJcGJpLT5kZWNfcmVzdWx0ID0gREVDX0lOSVRfUElDTElTVDsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZwYmktPndvcmspOworCisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCWFtaGV2Y19lbmFibGUoKTsKKworCWluaXRfcGljX2xpc3QocGJpKTsKKworCXJldCA9IGFtaGV2Y19sb2FkbWNfZXgoVkZPUk1BVF9WUDksIE5VTEwsIGZ3LT5kYXRhKTsKKwlpZiAocmV0IDwgMCkgeworCQlhbWhldmNfZGlzYWJsZSgpOworCQl2ZnJlZShmdyk7CisJCXByX2VycigiVlA5OiB0aGUgJXMgZncgbG9hZGluZyBmYWlsZWQsIGVycjogJXhcbiIsCisJCQl0ZWVfZW5hYmxlZCgpID8gIlRFRSIgOiAibG9jYWwiLCByZXQpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXZmcmVlKGZ3KTsKKworCXBiaS0+c3RhdCB8PSBTVEFUX01DX0xPQUQ7CisKKwkvKiBlbmFibGUgQU1SSVNDIHNpZGUgcHJvdG9jb2wgKi8KKwl2dnA5X3Byb3RfaW5pdChwYmksIEhXX01BU0tfRlJPTlQgfCBIV19NQVNLX0JBQ0spOworCisJaWYgKHZkZWNfcmVxdWVzdF90aHJlYWRlZF9pcnEoVkRFQ19JUlFfMCwKKwkJCQl2dnA5X2lzciwKKwkJCQl2dnA5X2lzcl90aHJlYWRfZm4sCisJCQkJSVJRRl9PTkVTSE9ULC8qcnVuIHRocmVhZCBvbiB0aGlzIGlycSBkaXNhYmxlZCovCisJCQkJInZ2cDktaXJxIiwgKHZvaWQgKilwYmkpKSB7CisJCXByX2luZm8oInZ2cDkgaXJxIHJlZ2lzdGVyIGVycm9yLlxuIik7CisJCWFtaGV2Y19kaXNhYmxlKCk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXBiaS0+c3RhdCB8PSBTVEFUX0lTUl9SRUc7CisKKwlwYmktPnByb3ZpZGVyX25hbWUgPSBQUk9WSURFUl9OQU1FOworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlpZiAoIXBiaS0+aXNfdXNlZF92NGwpIHsKKwkJdmZfcHJvdmlkZXJfaW5pdCgmdnZwOV92Zl9wcm92LCBQUk9WSURFUl9OQU1FLAorCQkJCQkmdnZwOV92Zl9wcm92aWRlciwgcGJpKTsKKwkJdmZfcmVnX3Byb3ZpZGVyKCZ2dnA5X3ZmX3Byb3YpOworCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoUFJPVklERVJfTkFNRSwgVkZSQU1FX0VWRU5UX1BST1ZJREVSX1NUQVJULCBOVUxMKTsKKwkJaWYgKHBiaS0+ZnJhbWVfZHVyICE9IDApIHsKKwkJCWlmICghaXNfcmVzZXQpCisJCQkJdmZfbm90aWZ5X3JlY2VpdmVyKHBiaS0+cHJvdmlkZXJfbmFtZSwKKwkJCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9GUl9ISU5ULAorCQkJCQkJKHZvaWQgKikKKwkJCQkJCSgodW5zaWduZWQgbG9uZylwYmktPmZyYW1lX2R1cikpOworCQl9CisJfQorI2Vsc2UKKwl2Zl9wcm92aWRlcl9pbml0KCZ2dnA5X3ZmX3Byb3YsIFBST1ZJREVSX05BTUUsICZ2dnA5X3ZmX3Byb3ZpZGVyLAorCQkJCQkgcGJpKTsKKwl2Zl9yZWdfcHJvdmlkZXIoJnZ2cDlfdmZfcHJvdik7CisJdmZfbm90aWZ5X3JlY2VpdmVyKFBST1ZJREVSX05BTUUsIFZGUkFNRV9FVkVOVF9QUk9WSURFUl9TVEFSVCwgTlVMTCk7CisJaWYgKCFpc19yZXNldCkKKwkJdmZfbm90aWZ5X3JlY2VpdmVyKFBST1ZJREVSX05BTUUsIFZGUkFNRV9FVkVOVF9QUk9WSURFUl9GUl9ISU5ULAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZylwYmktPmZyYW1lX2R1cikpOworI2VuZGlmCisJcGJpLT5zdGF0IHw9IFNUQVRfVkZfSE9PSzsKKworCXBiaS0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBQVVRfSU5URVJWQUw7CisJYWRkX3RpbWVyKCZwYmktPnRpbWVyKTsKKworCXBiaS0+c3RhdCB8PSBTVEFUX1ZERUNfUlVOOworCisJcGJpLT5zdGF0IHw9IFNUQVRfVElNRVJfQVJNOworCisJYW1oZXZjX3N0YXJ0KCk7CisKKwlwYmktPmluaXRfZmxhZyA9IDE7CisJcGJpLT5wcm9jZXNzX2J1c3kgPSAwOworCXByX2luZm8oIiVkLCB2dnA5X2luaXQsIFJQPTB4JXhcbiIsCisJCV9fTElORV9fLCBSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm12cDlfc3RvcChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJcGJpLT5pbml0X2ZsYWcgPSAwOworCisJaWYgKHBiaS0+c3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJYW1oZXZjX3N0b3AoKTsKKwkJcGJpLT5zdGF0ICY9IH5TVEFUX1ZERUNfUlVOOworCX0KKwlpZiAocGJpLT5zdGF0ICYgU1RBVF9JU1JfUkVHKSB7CisJCXZkZWNfZnJlZV9pcnEoVkRFQ19JUlFfMCwgKHZvaWQgKilwYmkpOworCQlwYmktPnN0YXQgJj0gflNUQVRfSVNSX1JFRzsKKwl9CisJaWYgKHBiaS0+c3RhdCAmIFNUQVRfVElNRVJfQVJNKSB7CisJCWRlbF90aW1lcl9zeW5jKCZwYmktPnRpbWVyKTsKKwkJcGJpLT5zdGF0ICY9IH5TVEFUX1RJTUVSX0FSTTsKKwl9CisKKwlpZiAoIXBiaS0+aXNfdXNlZF92NGwgJiYgKHBiaS0+c3RhdCAmIFNUQVRfVkZfSE9PSykpIHsKKwkJaWYgKCFpc19yZXNldCkKKwkJCXZmX25vdGlmeV9yZWNlaXZlcihwYmktPnByb3ZpZGVyX25hbWUsCisJCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9GUl9FTkRfSElOVCwKKwkJCQkJTlVMTCk7CisKKwkJdmZfdW5yZWdfcHJvdmlkZXIoJnZ2cDlfdmZfcHJvdik7CisJCXBiaS0+c3RhdCAmPSB+U1RBVF9WRl9IT09LOworCX0KKwl2cDlfbG9jYWxfdW5pbml0KHBiaSk7CisJcmVzZXRfcHJvY2Vzc190aW1lKHBiaSk7CisJY2FuY2VsX3dvcmtfc3luYygmcGJpLT53b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZwYmktPnJlY3ljbGVfbW11X3dvcmspOworI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKKwlpZiAocGJpLT51c2VkX3N0YWdlX2J1Zl9udW0gPiAwKQorCQljYW5jZWxfd29ya19zeW5jKCZwYmktPnMxX3dvcmspOworI2VuZGlmCisJY2FuY2VsX3dvcmtfc3luYygmcGJpLT5zZXRfY2xrX3dvcmspOworCXVuaW5pdF9tbXVfYnVmZmVycyhwYmkpOworCWlmIChwYmktPmZ3KQorCQl2ZnJlZShwYmktPmZ3KTsKKwlwYmktPmZ3ID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2dnA5X3N0b3Aoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCisJcGJpLT5pbml0X2ZsYWcgPSAwOworCXBiaS0+Zmlyc3Rfc2NfY2hlY2tlZCA9IDA7CisJaWYgKHBiaS0+c3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJYW1oZXZjX3N0b3AoKTsKKwkJcGJpLT5zdGF0ICY9IH5TVEFUX1ZERUNfUlVOOworCX0KKworCWlmIChwYmktPnN0YXQgJiBTVEFUX0lTUl9SRUcpIHsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCWlmICghcGJpLT5tX2luc19mbGFnKQorI2VuZGlmCisJCQlXUklURV9WUkVHKEhFVkNfQVNTSVNUX01CT1gwX01BU0ssIDApOworCQl2ZGVjX2ZyZWVfaXJxKFZERUNfSVJRXzAsICh2b2lkICopcGJpKTsKKwkJcGJpLT5zdGF0ICY9IH5TVEFUX0lTUl9SRUc7CisJfQorCisJaWYgKHBiaS0+c3RhdCAmIFNUQVRfVElNRVJfQVJNKSB7CisJCWRlbF90aW1lcl9zeW5jKCZwYmktPnRpbWVyKTsKKwkJcGJpLT5zdGF0ICY9IH5TVEFUX1RJTUVSX0FSTTsKKwl9CisKKwlpZiAoIXBiaS0+aXNfdXNlZF92NGwgJiYgKHBiaS0+c3RhdCAmIFNUQVRfVkZfSE9PSykpIHsKKwkJaWYgKCFpc19yZXNldCkKKwkJCXZmX25vdGlmeV9yZWNlaXZlcihwYmktPnByb3ZpZGVyX25hbWUsCisJCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9GUl9FTkRfSElOVCwKKwkJCQkJTlVMTCk7CisKKwkJdmZfdW5yZWdfcHJvdmlkZXIoJnZ2cDlfdmZfcHJvdik7CisJCXBiaS0+c3RhdCAmPSB+U1RBVF9WRl9IT09LOworCX0KKwl2cDlfbG9jYWxfdW5pbml0KHBiaSk7CisKKwljYW5jZWxfd29ya19zeW5jKCZwYmktPnNldF9jbGtfd29yayk7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCWlmIChwYmktPm1faW5zX2ZsYWcpIHsKKyNpZmRlZiBTVVBQT1JUX0ZCX0RFQ09ESU5HCisJCWlmIChwYmktPnVzZWRfc3RhZ2VfYnVmX251bSA+IDApCisJCQljYW5jZWxfd29ya19zeW5jKCZwYmktPnMxX3dvcmspOworI2VuZGlmCisJCWNhbmNlbF93b3JrX3N5bmMoJnBiaS0+d29yayk7CisJCWNhbmNlbF93b3JrX3N5bmMoJnBiaS0+cmVjeWNsZV9tbXVfd29yayk7CisJfSBlbHNlCisJCWFtaGV2Y19kaXNhYmxlKCk7CisjZWxzZQorCWFtaGV2Y19kaXNhYmxlKCk7CisjZW5kaWYKKwl1bmluaXRfbW11X2J1ZmZlcnMocGJpKTsKKworCXZmcmVlKHBiaS0+ZncpOworCXBiaS0+ZncgPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtdmRlY192cDlfbW11X2luaXQoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCWludCB0dnBfZmxhZyA9IHZkZWNfc2VjdXJlKGh3X3RvX3ZkZWMocGJpKSkgPworCQlDT0RFQ19NTV9GTEFHU19UVlAgOiAwOworCWludCBidWZfc2l6ZSA9IHZwOV9tYXhfbW11X2J1Zl9zaXplKHBiaS0+bWF4X3BpY193LCBwYmktPm1heF9waWNfaCk7CisKKwlwYmktPm5lZWRfY2FjaGVfc2l6ZSA9IGJ1Zl9zaXplICogU1pfMU07CisJcGJpLT5zY19zdGFydF90aW1lID0gZ2V0X2ppZmZpZXNfNjQoKTsKKwlpZiAocGJpLT5tbXVfZW5hYmxlICYmICFwYmktPmlzX3VzZWRfdjRsKSB7CisJCXBiaS0+bW11X2JveCA9IGRlY29kZXJfbW11X2JveF9hbGxvY19ib3goRFJJVkVSX05BTUUsCisJCQlwYmktPmluZGV4LCBGUkFNRV9CVUZGRVJTLAorCQkJcGJpLT5uZWVkX2NhY2hlX3NpemUsCisJCQl0dnBfZmxhZworCQkJKTsKKwkJaWYgKCFwYmktPm1tdV9ib3gpIHsKKwkJCXByX2VycigidnA5IGFsbG9jIG1tdSBib3ggZmFpbGVkISFcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorI2lmZGVmIFZQOV8xMEJfTU1VX0RXCisJaWYgKHBiaS0+ZHdfbW11X2VuYWJsZSAmJiAhcGJpLT5pc191c2VkX3Y0bCkgeworCQlwYmktPm1tdV9ib3hfZHcgPSBkZWNvZGVyX21tdV9ib3hfYWxsb2NfYm94KERSSVZFUl9OQU1FLAorCQkJcGJpLT5pbmRleCwgRlJBTUVfQlVGRkVSUywKKwkJCXBiaS0+bmVlZF9jYWNoZV9zaXplLAorCQkJdHZwX2ZsYWcKKwkJCSk7CisJCWlmICghcGJpLT5tbXVfYm94X2R3KSB7CisJCQlwcl9lcnIoInZwOSBhbGxvYyBtbXUgZHcgYm94IGZhaWxlZCEhXG4iKTsKKwkJfQorCX0KKyNlbmRpZgorCXBiaS0+Ym1tdV9ib3ggPSBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2JveCgKKwkJCURSSVZFUl9OQU1FLAorCQkJcGJpLT5pbmRleCwKKwkJCU1BWF9CTU1VX0JVRkZFUl9OVU0sCisJCQk0ICsgUEFHRV9TSElGVCwKKwkJCUNPREVDX01NX0ZMQUdTX0NNQV9DTEVBUiB8CisJCQlDT0RFQ19NTV9GTEFHU19GT1JfVkRFQ09ERVIgfAorCQkJdHZwX2ZsYWcpOworCWlmICghcGJpLT5ibW11X2JveCkgeworCQlwcl9lcnIoInZwOSBhbGxvYyBibW11IGJveCBmYWlsZWQhIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpnSGV2YzsKKworc3RhdGljIGludCBhbXZkZWNfdnA5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHZkZWNfcyAqcGRhdGEgPSAqKHN0cnVjdCB2ZGVjX3MgKiopcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IEJVRl9zIEJVRltNQVhfQlVGX05VTV07CisJc3RydWN0IFZQOURlY29kZXJfcyAqcGJpOworCWludCByZXQ7CisjaWZuZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlpbnQgaTsKKyNlbmRpZgorCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPCBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hMIHx8CisJCWdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVFhMIHx8CisJCWdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDUpIHsKKwkJcHJfaW5mbygidnA5IHVuc3VwcG9ydGVkIG9uIGNwdSAweCV4XG4iLCBnZXRfY3B1X21ham9yX2lkKCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwltdXRleF9sb2NrKCZ2dnA5X211dGV4KTsKKwlwYmkgPSB2emFsbG9jKHNpemVvZihzdHJ1Y3QgVlA5RGVjb2Rlcl9zKSk7CisJaWYgKHBiaSA9PSBOVUxMKSB7CisJCXByX2luZm8oIlxuYW12ZGVjX3ZwOSBkZXZpY2UgZGF0YSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCW11dGV4X3VubG9jaygmdnZwOV9tdXRleCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWdIZXZjID0gcGJpOworCW1lbWNweSgmQlVGWzBdLCAmcGJpLT5tX0JVRlswXSwgc2l6ZW9mKHN0cnVjdCBCVUZfcykgKiBNQVhfQlVGX05VTSk7CisJbWVtc2V0KHBiaSwgMCwgc2l6ZW9mKHN0cnVjdCBWUDlEZWNvZGVyX3MpKTsKKwltZW1jcHkoJnBiaS0+bV9CVUZbMF0sICZCVUZbMF0sIHNpemVvZihzdHJ1Y3QgQlVGX3MpICogTUFYX0JVRl9OVU0pOworCisJcGJpLT5pbml0X2ZsYWcgPSAwOworCXBiaS0+Zmlyc3Rfc2NfY2hlY2tlZD0gMDsKKworCWlmICghdmRlY19pc19zdXBwb3J0XzRrKCkpIHsKKwkJcGJpLT5tYXhfcGljX3cgPSAxOTIwOworCQlwYmktPm1heF9waWNfaCA9IDEwODg7CisJfSBlbHNlIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPCBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKSB7CisJCXBiaS0+bWF4X3BpY193ID0gNDA5NjsKKwkJcGJpLT5tYXhfcGljX2ggPSAyMzA0OworCX0gZWxzZSB7CisJCXBiaS0+bWF4X3BpY193ID0gODE5MjsKKwkJcGJpLT5tYXhfcGljX2ggPSA0NjA4OworCX0KKwlpZiAocGRhdGEtPnN5c19pbmZvKSB7CisJCXBiaS0+dnZwOV9hbXN0cmVhbV9kZWNfaW5mbyA9ICpwZGF0YS0+c3lzX2luZm87CisJCWlmICgocGJpLT52dnA5X2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoICE9IDApICYmCisJCQkocGJpLT52dnA5X2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodCAhPSAwKSkgeworCQkJcGJpLT5tYXhfcGljX3cgPSBwYmktPnZ2cDlfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGg7CisJCQlwYmktPm1heF9waWNfaCA9IHBiaS0+dnZwOV9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQ7CisJCX0KKwl9IGVsc2UgeworCQlwYmktPnZ2cDlfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGggPSAwOworCQlwYmktPnZ2cDlfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0ID0gMDsKKwkJcGJpLT52dnA5X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgPSAzMDsKKwl9CisKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJcGJpLT5lb3MgPSAwOworCXBiaS0+c3RhcnRfcHJvY2Vzc190aW1lID0gMDsKKwlwYmktPnRpbWVvdXRfbnVtID0gMDsKKyNlbmRpZgorCXBiaS0+ZmF0YWxfZXJyb3IgPSAwOworCXBiaS0+c2hvd19mcmFtZV9udW0gPSAwOworCWlmIChwZGF0YSA9PSBOVUxMKSB7CisJCXByX2luZm8oIlxuYW12ZGVjX3ZwOSBtZW1vcnkgcmVzb3VyY2UgdW5kZWZpbmVkLlxuIik7CisJCXZmcmVlKHBiaSk7CisJCW11dGV4X3VubG9jaygmdnZwOV9tdXRleCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlwYmktPm1faW5zX2ZsYWcgPSAwOworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlwYmktPnBsYXRmb3JtX2RldiA9IHBkZXY7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGRhdGEpOworI2VuZGlmCisJcGJpLT5kb3VibGVfd3JpdGVfbW9kZSA9IGRvdWJsZV93cml0ZV9tb2RlOworCXBiaS0+bW11X2VuYWJsZSA9IDE7CisjaWZkZWYgVlA5XzEwQl9NTVVfRFcKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNUQpIHsKKwkJcGJpLT5kd19tbXVfZW5hYmxlID0KKwkJCShnZXRfZG91YmxlX3dyaXRlX21vZGUocGJpKSAmIDB4MjApID8gMSA6IDA7CisJfSBlbHNlIHsKKwkJcGJpLT5kd19tbXVfZW5hYmxlID0gMDsKKwl9CisjZW5kaWYKKwlpZiAoYW12ZGVjX3ZwOV9tbXVfaW5pdChwYmkpIDwgMCkgeworCQl2ZnJlZShwYmkpOworCQltdXRleF91bmxvY2soJnZ2cDlfbXV0ZXgpOworCQlwcl9lcnIoInZwOSBhbGxvYyBibW11IGJveCBmYWlsZWQhIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXQgPSBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkocGJpLT5ibW11X2JveCwgV09SS19TUEFDRV9CVUZfSUQsCisJCQl3b3JrX2J1Zl9zaXplLCBEUklWRVJfTkFNRSwgJnBkYXRhLT5tZW1fc3RhcnQpOworCWlmIChyZXQgPCAwKSB7CisJCXVuaW5pdF9tbXVfYnVmZmVycyhwYmkpOworCQl2ZnJlZShwYmkpOworCQltdXRleF91bmxvY2soJnZ2cDlfbXV0ZXgpOworCQlyZXR1cm4gcmV0OworCX0KKwlwYmktPmJ1Zl9zaXplID0gd29ya19idWZfc2l6ZTsKKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlwYmktPmJ1Zl9zdGFydCA9IHBkYXRhLT5tZW1fc3RhcnQ7CisjZWxzZQorCWlmICghcGJpLT5tbXVfZW5hYmxlKQorCQlwYmktPm1jX2J1Zl9zcGVjLmJ1Zl9lbmQgPSBwZGF0YS0+bWVtX3N0YXJ0ICsgcGJpLT5idWZfc2l6ZTsKKworCWZvciAoaSA9IDA7IGkgPCBXT1JLX0JVRl9TUEVDX05VTTsgaSsrKQorCQlhbXZ2cDlfd29ya2J1ZmZfc3BlY1tpXS5zdGFydF9hZHIgPSBwZGF0YS0+bWVtX3N0YXJ0OworI2VuZGlmCisKKworCWlmIChkZWJ1ZykgeworCQlwcl9pbmZvKCI9PT1WUDkgZGVjb2RlciBtZW0gcmVzb3VyY2UgMHglbHggc2l6ZSAweCV4XG4iLAorCQkJICAgcGRhdGEtPm1lbV9zdGFydCwgcGJpLT5idWZfc2l6ZSk7CisJfQorCXBiaS0+bm9faGVhZCA9IG5vX2hlYWQ7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCXBiaS0+Y21hX2RldiA9IHBkYXRhLT5jbWFfZGV2OworI2Vsc2UKKwljbWFfZGV2ID0gcGRhdGEtPmNtYV9kZXY7CisjZW5kaWYKKwkvKiBjb25maWcgZW5kaWFuICovCisJcGJpLT5lbmRpYW4gPSBIRVZDX0NPTkZJR19MSVRUTEVfRU5ESUFOOworCWlmIChpc19zdXBwb3J0X3ZkZWNfY2FudmFzKCkpCisJCXBiaS0+ZW5kaWFuID0gSEVWQ19DT05GSUdfQklHX0VORElBTjsKKwlpZiAoZW5kaWFuKQorCQlwYmktPmVuZGlhbiA9IGVuZGlhbjsKKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlwZGF0YS0+cHJpdmF0ZSA9IHBiaTsKKwlwZGF0YS0+ZGVjX3N0YXR1cyA9IHZ2cDlfZGVjX3N0YXR1czsKKwlwZGF0YS0+c2V0X2lzcmVzZXQgPSB2dnA5X3NldF9pc3Jlc2V0OworCWlzX3Jlc2V0ID0gMDsKKwlpZiAodnZwOV9pbml0KHBkYXRhKSA8IDApIHsKKyNlbHNlCisJaWYgKHZ2cDlfaW5pdChwYmkpIDwgMCkgeworI2VuZGlmCisJCXByX2luZm8oIlxuYW12ZGVjX3ZwOSBpbml0IGZhaWxlZC5cbiIpOworCQl2cDlfbG9jYWxfdW5pbml0KHBiaSk7CisJCXVuaW5pdF9tbXVfYnVmZmVycyhwYmkpOworCQl2ZnJlZShwYmkpOworCQlwZGF0YS0+ZGVjX3N0YXR1cyA9IE5VTEw7CisJCW11dGV4X3VubG9jaygmdnZwOV9tdXRleCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkvKnNldCB0aGUgbWF4IGNsayBmb3Igc21vb3RoIHBsYXlpbmcuLi4qLworCWhldmNfc291cmNlX2NoYW5nZWQoVkZPUk1BVF9WUDksCisJCQk0MDk2LCAyMDQ4LCA2MCk7CisJbXV0ZXhfdW5sb2NrKCZ2dnA5X211dGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2ZGVjX2ZlbmNlX3JlbGVhc2Uoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLAorCQkJICAgICAgIHN0cnVjdCB2ZGVjX3N5bmMgKnN5bmMpCit7CisJdWxvbmcgZXhwaXJlczsKKworCS8qIG5vdGlmeSBzaWduYWwgdG8gd2FrZSB1cCBhbGwgZmVuY2VzLiAqLworCXZkZWNfdGltZWxpbmVfaW5jcmVhc2Uoc3luYywgVkZfUE9PTF9TSVpFKTsKKworCWV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMDAwKTsKKwl3aGlsZSAoIWNoZWNrX29ianNfYWxsX3NpZ25hbGVkKHN5bmMpKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGV4cGlyZXMpKSB7CisJCQlwcl9lcnIoIndhaXQgZmVuY2Ugc2lnbmFsZWQgdGltZW91dC5cbiIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBkZWNyZWFzZXMgcmVmY250IG9mIHRpbWVsaW5lLiAqLworCXZkZWNfdGltZWxpbmVfcHV0KHN5bmMpOworfQorCitzdGF0aWMgaW50IGFtdmRlY192cDlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IFZQOURlY29kZXJfcyAqcGJpID0gZ0hldmM7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMocGJpKTsKKwlpbnQgaTsKKworCWlmIChkZWJ1ZykKKwkJcHJfaW5mbygiYW12ZGVjX3ZwOV9yZW1vdmVcbiIpOworCisJbXV0ZXhfbG9jaygmdnZwOV9tdXRleCk7CisKKwl2dnA5X3N0b3AocGJpKTsKKworCWhldmNfc291cmNlX2NoYW5nZWQoVkZPUk1BVF9WUDksIDAsIDAsIDApOworCisJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCWZvciAoaSA9IDA7IGkgPCBGUkFNRV9CVUZGRVJTOyBpKyspIHsKKwkJCXZkZWMtPmZyZWVfY2FudmFzX2V4KHBiaS0+Y29tbW9uLmJ1ZmZlcl9wb29sLT4KKwkJCQlmcmFtZV9idWZzW2ldLmJ1Zi55X2NhbnZhc19pbmRleCwgdmRlYy0+aWQpOworCQkJdmRlYy0+ZnJlZV9jYW52YXNfZXgocGJpLT5jb21tb24uYnVmZmVyX3Bvb2wtPgorCQkJCWZyYW1lX2J1ZnNbaV0uYnVmLnV2X2NhbnZhc19pbmRleCwgdmRlYy0+aWQpOworCQl9CisJfQorCisjaWZkZWYgREVCVUdfUFRTCisJcHJfaW5mbygicHRzIG1pc3NlZCAlbGQsIHB0cyBoaXQgJWxkLCBkdXJhdGlvbiAlZFxuIiwKKwkJICAgcGJpLT5wdHNfbWlzc2VkLCBwYmktPnB0c19oaXQsIHBiaS0+ZnJhbWVfZHVyKTsKKyNlbmRpZgorCW1lbV9tYXBfbW9kZSA9IDA7CisKKwlpZiAocGJpLT5lbmFibGVfZmVuY2UpCisJCXZkZWNfZmVuY2VfcmVsZWFzZShwYmksIHZkZWMtPnN5bmMpOworCisJdmZyZWUocGJpKTsKKwltdXRleF91bmxvY2soJnZ2cDlfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhbXZkZWNfdnA5X2RyaXZlciA9IHsKKwkucHJvYmUgPSBhbXZkZWNfdnA5X3Byb2JlLAorCS5yZW1vdmUgPSBhbXZkZWNfdnA5X3JlbW92ZSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZCA9IGFtaGV2Y19zdXNwZW5kLAorCS5yZXN1bWUgPSBhbWhldmNfcmVzdW1lLAorI2VuZGlmCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGNvZGVjX3Byb2ZpbGVfdCBhbXZkZWNfdnA5X3Byb2ZpbGUgPSB7CisJLm5hbWUgPSAidnA5IiwKKwkucHJvZmlsZSA9ICIiCit9OworCitzdGF0aWMgc3RydWN0IGNvZGVjX3Byb2ZpbGVfdCBhbXZkZWNfdnA5X3Byb2ZpbGVfbXVsdDsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgZ2V0X2RhdGFfY2hlY2tfc3VtCisJKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwgaW50IHNpemUpCit7CisJaW50IGpqOworCWludCBzdW0gPSAwOworCXU4ICpkYXRhID0gTlVMTDsKKworCWlmICh2ZGVjX3NlY3VyZShod190b192ZGVjKHBiaSkpKQorCQlyZXR1cm4gMDsKKworCWlmICghcGJpLT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJZGF0YSA9IGNvZGVjX21tX3ZtYXAocGJpLT5jaHVuay0+YmxvY2stPnN0YXJ0ICsKKwkJCXBiaS0+Y2h1bmstPm9mZnNldCwgc2l6ZSk7CisJZWxzZQorCQlkYXRhID0gKCh1OCAqKXBiaS0+Y2h1bmstPmJsb2NrLT5zdGFydF92aXJ0KSArCisJCQlwYmktPmNodW5rLT5vZmZzZXQ7CisKKwlmb3IgKGpqID0gMDsgamogPCBzaXplOyBqaisrKQorCQlzdW0gKz0gZGF0YVtqal07CisKKwl2cDlfcHJpbnQocGJpLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkiJXM6IHNpemUgMHgleCBzdW0gMHgleCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAuLiAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQlfX2Z1bmNfXywgc2l6ZSwgc3VtLAorCQkoc2l6ZSA8IDEpID8gMCA6IGRhdGFbMF0sCisJCShzaXplIDwgMikgPyAwIDogZGF0YVsxXSwKKwkJKHNpemUgPCAzKSA/IDAgOiBkYXRhWzJdLAorCQkoc2l6ZSA8IDQpID8gMCA6IGRhdGFbM10sCisJCShzaXplIDwgNSkgPyAwIDogZGF0YVs0XSwKKwkJKHNpemUgPCA2KSA/IDAgOiBkYXRhWzVdLAorCQkoc2l6ZSA8IDQpID8gMCA6IGRhdGFbc2l6ZSAtIDRdLAorCQkoc2l6ZSA8IDMpID8gMCA6IGRhdGFbc2l6ZSAtIDNdLAorCQkoc2l6ZSA8IDIpID8gMCA6IGRhdGFbc2l6ZSAtIDJdLAorCQkoc2l6ZSA8IDEpID8gMCA6IGRhdGFbc2l6ZSAtIDFdKTsKKworCWlmICghcGJpLT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcihkYXRhKTsKKwlyZXR1cm4gc3VtOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2RhdGEoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLCBpbnQgc2l6ZSkKK3sKKwlpbnQgamo7CisJdTggKmRhdGEgPSBOVUxMOworCWludCBwYWRkaW5nX3NpemUgPSBwYmktPmNodW5rLT5vZmZzZXQgJgorCQkoVkRFQ19GSUZPX0FMSUdOIC0gMSk7CisKKwlpZiAoIXBiaS0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCWRhdGEgPSBjb2RlY19tbV92bWFwKHBiaS0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQlwYmktPmNodW5rLT5vZmZzZXQsIHNpemUpOworCWVsc2UKKwkJZGF0YSA9ICgodTggKilwYmktPmNodW5rLT5ibG9jay0+c3RhcnRfdmlydCkgKworCQkJcGJpLT5jaHVuay0+b2Zmc2V0OworCisJdnA5X3ByaW50KHBiaSwgMCwgInBhZGRpbmc6ICIpOworCWZvciAoamogPSBwYWRkaW5nX3NpemU7IGpqID4gMDsgamotLSkKKwkJdnA5X3ByaW50X2NvbnQocGJpLAorCQkJMCwKKwkJCSIlMDJ4ICIsICooZGF0YSAtIGpqKSk7CisJdnA5X3ByaW50X2NvbnQocGJpLCAwLCAiZGF0YSBhZHIgJXBcbiIsCisJCWRhdGEpOworCisJZm9yIChqaiA9IDA7IGpqIDwgc2l6ZTsgamorKykgeworCQlpZiAoKGpqICYgMHhmKSA9PSAwKQorCQkJdnA5X3ByaW50KHBiaSwKKwkJCQkwLAorCQkJCSIlMDZ4OiIsIGpqKTsKKwkJdnA5X3ByaW50X2NvbnQocGJpLAorCQkJMCwKKwkJCSIlMDJ4ICIsIGRhdGFbampdKTsKKwkJaWYgKCgoamogKyAxKSAmIDB4ZikgPT0gMCkKKwkJCXZwOV9wcmludChwYmksCisJCQkgMCwKKwkJCQkiXG4iKTsKKwl9CisJdnA5X3ByaW50KHBiaSwKKwkgMCwKKwkJIlxuIik7CisKKwlpZiAoIXBiaS0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIoZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIHZwOV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkgPSBjb250YWluZXJfb2Yod29yaywKKwkJc3RydWN0IFZQOURlY29kZXJfcywgd29yayk7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMocGJpKTsKKwkvKiBmaW5pc2hlZCBkZWNvZGluZyBvbmUgZnJhbWUgb3IgZXJyb3IsCisJICogbm90aWZ5IHZkZWMgY29yZSB0byBzd2l0Y2ggY29udGV4dAorCSAqLworCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9XT1JLRVJfU1RBUlQpOworCWlmIChwYmktPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9BR0FJTikKKwkJQVRSQUNFX0NPVU5URVIocGJpLT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX1dPUktFUl9BR0FJTik7CisJdnA5X3ByaW50KHBiaSwgUFJJTlRfRkxBR19WREVDX0RFVEFJTCwKKwkJIiVzIGRlY19yZXN1bHQgJWQgJXggJXggJXhcbiIsCisJCV9fZnVuY19fLAorCQlwYmktPmRlY19yZXN1bHQsCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9MRVZFTCksCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9XUl9QVFIpLAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSKSk7CisKKwlpZiAocGJpLT5kZWNfcmVzdWx0ID09IERFQ19JTklUX1BJQ0xJU1QpIHsKKwkJaW5pdF9waWNfbGlzdChwYmkpOworCQlwYmktPnBpY19saXN0X2luaXRfZG9uZSA9IHRydWU7CisJCXJldHVybjsKKwl9CisKKwlpZiAocGJpLT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfTkVFRF9NT1JFX0JVRkZFUikgeworCQlyZXNldF9wcm9jZXNzX3RpbWUocGJpKTsKKwkJaWYgKCFnZXRfZnJlZV9idWZfY291bnQocGJpKSkgeworCQkJcGJpLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ORUVEX01PUkVfQlVGRkVSOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZwYmktPndvcmspOworCQl9IGVsc2UgeworCQkJaW50IGk7CisKKwkJCWlmIChwYmktPm1tdV9lbmFibGUpCisJCQkJdnA5X3JlY3ljbGVfbW11X2J1Zl90YWlsKHBiaSk7CisKKwkJCWlmIChwYmktPmZyYW1lX2NvdW50ID4gMCkKKwkJCQl2cDlfYnVmbWdyX3Bvc3Rwcm9jKHBiaSk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCAoUlBNX0VORCAtIFJQTV9CRUdJTik7IGkgKz0gNCkgeworCQkJCWludCBpaTsKKwkJCQlmb3IgKGlpID0gMDsgaWkgPCA0OyBpaSsrKQorCQkJCQlwYmktPnZwOV9wYXJhbS5sLmRhdGFbaSArIGlpXSA9CisJCQkJCQlwYmktPnJwbV9wdHJbaSArIDMgLSBpaV07CisJCQl9CisJCQljb250aW51ZV9kZWNvZGluZyhwYmkpOworCQkJcGJpLT5wb3N0cHJvY19kb25lID0gMDsKKwkJCXBiaS0+cHJvY2Vzc19idXN5ID0gMDsKKworCQkJc3RhcnRfcHJvY2Vzc190aW1lKHBiaSk7CisJCX0KKwkJcmV0dXJuOworCX0KKworCWlmICgoKHBiaS0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0dFVF9EQVRBKSB8fAorCQkocGJpLT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfR0VUX0RBVEFfUkVUUlkpKQorCQkmJiAoaHdfdG9fdmRlYyhwYmkpLT5uZXh0X3N0YXR1cyAhPQorCQlWREVDX1NUQVRVU19ESVNDT05ORUNURUQpKSB7CisJCWlmICghdmRlY19oYXNfbW9yZV9pbnB1dCh2ZGVjKSkgeworCQkJcGJpLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9FT1M7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJnBiaS0+d29yayk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAocGJpLT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfR0VUX0RBVEEpIHsKKwkJCXZwOV9wcmludChwYmksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkJIiVzIERFQ19SRVNVTFRfR0VUX0RBVEEgJXggJXggJXhcbiIsCisJCQkJX19mdW5jX18sCisJCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0xFVkVMKSwKKwkJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fV1JfUFRSKSwKKwkJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSKSk7CisJCQl2ZGVjX3ZmcmFtZV9kaXJ0eSh2ZGVjLCBwYmktPmNodW5rKTsKKwkJCXZkZWNfY2xlYW5faW5wdXQodmRlYyk7CisJCX0KKworCQlpZiAoZ2V0X2ZyZWVfYnVmX2NvdW50KHBiaSkgPj0KKwkJCXBiaS0+cnVuX3JlYWR5X21pbl9idWZfbnVtKSB7CisJCQlpbnQgcjsKKwkJCWludCBkZWNvZGVfc2l6ZTsKKwkJCXIgPSB2ZGVjX3ByZXBhcmVfaW5wdXQodmRlYywgJnBiaS0+Y2h1bmspOworCQkJaWYgKHIgPCAwKSB7CisJCQkJcGJpLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9HRVRfREFUQV9SRVRSWTsKKworCQkJCXZwOV9wcmludChwYmksCisJCQkJCVBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsCisJCQkJCSJhbXZkZWNfdmgyNjU6IEluc3VmZmljaWVudCBkYXRhXG4iKTsKKworCQkJCXZkZWNfc2NoZWR1bGVfd29yaygmcGJpLT53b3JrKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlwYmktPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX05PTkU7CisJCQl2cDlfcHJpbnQocGJpLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJCSIlczogY2h1bmsgc2l6ZSAweCV4IHN1bSAweCV4XG4iLAorCQkJCV9fZnVuY19fLCByLAorCQkJCShkZWJ1ZyAmIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMpID8KKwkJCQlnZXRfZGF0YV9jaGVja19zdW0ocGJpLCByKSA6IDAKKwkJCQkpOworCisJCQlpZiAoZGVidWcgJiBQUklOVF9GTEFHX1ZERUNfREFUQSkKKwkJCQlkdW1wX2RhdGEocGJpLCBwYmktPmNodW5rLT5zaXplKTsKKworCQkJZGVjb2RlX3NpemUgPSBwYmktPmNodW5rLT5zaXplICsKKwkJCQkocGJpLT5jaHVuay0+b2Zmc2V0ICYgKFZERUNfRklGT19BTElHTiAtIDEpKTsKKworCQkJV1JJVEVfVlJFRyhIRVZDX0RFQ09ERV9TSVpFLAorCQkJCVJFQURfVlJFRyhIRVZDX0RFQ09ERV9TSVpFKSArIGRlY29kZV9zaXplKTsKKworCQkJdmRlY19lbmFibGVfaW5wdXQodmRlYyk7CisKKwkJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgSEVWQ19BQ1RJT05fRE9ORSk7CisKKwkJCXN0YXJ0X3Byb2Nlc3NfdGltZShwYmkpOworCisJCX0gZWxzZXsKKwkJCXBiaS0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfR0VUX0RBVEFfUkVUUlk7CisKKwkJCXZwOV9wcmludChwYmksIFBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsCisJCQkJImFtdmRlY192aDI2NTogSW5zdWZmaWNpZW50IGRhdGFcbiIpOworCisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJnBiaS0+d29yayk7CisJCX0KKwkJcmV0dXJuOworCX0gZWxzZSBpZiAocGJpLT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfRE9ORSkgeworI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKKwkJaWYgKHBiaS0+dXNlZF9zdGFnZV9idWZfbnVtID4gMCkgeworI2lmbmRlZiBGQl9ERUNPRElOR19URVNUX1NDSEVEVUxFCisJCQlpZiAoIWlzX3MyX2RlY29kaW5nX2ZpbmlzaGVkKHBiaSkpIHsKKwkJCQl2cDlfcHJpbnQocGJpLCBQUklOVF9GTEFHX1ZERUNfREVUQUlMLAorCQkJCQkiczIgZGVjb2Rpbmcgbm90IGRvbmUsIGNoZWNrIGFnYWluIGxhdGVyXG4iKTsKKwkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJnBiaS0+d29yayk7CisJCQl9CisjZW5kaWYKKwkJCWluY19zMl9wb3MocGJpKTsKKwkJCWlmIChtY3JjY19jYWNoZV9hbGdfZmxhZykKKwkJCQlkdW1wX2hpdF9yYXRlKHBiaSk7CisJCX0KKyNlbmRpZgorCQkvKiBpZiAoIXBiaS0+Y3R4X3ZhbGlkKQorCQkJcGJpLT5jdHhfdmFsaWQgPSAxOyAqLworCQlwYmktPnNsaWNlX2lkeCsrOworCQlwYmktPmZyYW1lX2NvdW50Kys7CisJCXBiaS0+cHJvY2Vzc19zdGF0ZSA9IFBST0NfU1RBVEVfSU5JVDsKKwkJZGVjb2RlX2ZyYW1lX2NvdW50W3BiaS0+aW5kZXhdID0gcGJpLT5mcmFtZV9jb3VudDsKKworCQlpZiAocGJpLT5tbXVfZW5hYmxlKQorCQkJcGJpLT51c2VkXzRrX251bSA9CisJCQkJKFJFQURfVlJFRyhIRVZDX1NBT19NTVVfU1RBVFVTKSA+PiAxNik7CisJCXZwOV9wcmludChwYmksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkiJXMgKD09PT4gJWQpIGRlY19yZXN1bHQgJWQgJXggJXggJXggc2hpZnRieXRlcyAweCV4IGRlY2J5dGVzIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywKKwkJCXBiaS0+ZnJhbWVfY291bnQsCisJCQlwYmktPmRlY19yZXN1bHQsCisJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fTEVWRUwpLAorCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1dSX1BUUiksCisJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpLAorCQkJUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCkgLQorCQkJcGJpLT5zdGFydF9zaGlmdF9ieXRlcworCQkJKTsKKwkJdmRlY192ZnJhbWVfZGlydHkoaHdfdG9fdmRlYyhwYmkpLCBwYmktPmNodW5rKTsKKwl9IGVsc2UgaWYgKHBiaS0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0FHQUlOKSB7CisJCS8qCisJCQlzdHJlYW0gYmFzZTogc3RyZWFtIGJ1ZiBlbXB0eSBvciB0aW1lb3V0CisJCQlmcmFtZSBiYXNlOiB2ZGVjX3ByZXBhcmVfaW5wdXQgZmFpbAorCQkqLworCQlpZiAoIXZkZWNfaGFzX21vcmVfaW5wdXQodmRlYykpIHsKKwkJCXBiaS0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRU9TOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZwYmktPndvcmspOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIGlmIChwYmktPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9FT1MpIHsKKwkJdnA5X3ByaW50KHBiaSwgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCSIlczogZW5kIG9mIHN0cmVhbVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcGJpLT5lb3MgPSAxOworCQl2cDlfYnVmbWdyX3Bvc3Rwcm9jKHBiaSk7CisKKwkJbm90aWZ5X3Y0bF9lb3MoaHdfdG9fdmRlYyhwYmkpKTsKKworCQl2ZGVjX3ZmcmFtZV9kaXJ0eShod190b192ZGVjKHBiaSksIHBiaS0+Y2h1bmspOworCX0gZWxzZSBpZiAocGJpLT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfRk9SQ0VfRVhJVCkgeworCQl2cDlfcHJpbnQocGJpLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJIiVzOiBmb3JjZSBleGl0XG4iLAorCQkJX19mdW5jX18pOworCQlpZiAocGJpLT5zdGF0ICYgU1RBVF9WREVDX1JVTikgeworCQkJYW1oZXZjX3N0b3AoKTsKKwkJCXBiaS0+c3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwkJfQorCisJCWlmIChwYmktPnN0YXQgJiBTVEFUX0lTUl9SRUcpIHsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCQlpZiAoIXBiaS0+bV9pbnNfZmxhZykKKyNlbmRpZgorCQkJCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTUJPWDBfTUFTSywgMCk7CisJCQl2ZGVjX2ZyZWVfaXJxKFZERUNfSVJRXzAsICh2b2lkICopcGJpKTsKKwkJCXBiaS0+c3RhdCAmPSB+U1RBVF9JU1JfUkVHOworCQl9CisJfQorCWlmIChwYmktPnN0YXQgJiBTVEFUX1ZERUNfUlVOKSB7CisJCWFtaGV2Y19zdG9wKCk7CisJCXBiaS0+c3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwl9CisKKwlpZiAocGJpLT5zdGF0ICYgU1RBVF9USU1FUl9BUk0pIHsKKwkJZGVsX3RpbWVyX3N5bmMoJnBiaS0+dGltZXIpOworCQlwYmktPnN0YXQgJj0gflNUQVRfVElNRVJfQVJNOworCX0KKwkvKiBtYXJrIGl0c2VsZiBoYXMgYWxsIEhXIHJlc291cmNlIHJlbGVhc2VkIGFuZCBpbnB1dCByZWxlYXNlZCAqLworCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9XT1JLRVJfRU5EKTsKKyNpZmRlZiBTVVBQT1JUX0ZCX0RFQ09ESU5HCisJaWYgKHBiaS0+dXNlZF9zdGFnZV9idWZfbnVtID4gMCkKKwkJdmRlY19jb3JlX2ZpbmlzaF9ydW4oaHdfdG9fdmRlYyhwYmkpLCBDT1JFX01BU0tfSEVWQ19CQUNLKTsKKwllbHNlCisJCXZkZWNfY29yZV9maW5pc2hfcnVuKGh3X3RvX3ZkZWMocGJpKSwgQ09SRV9NQVNLX1ZERUNfMQorCQkJCXwgQ09SRV9NQVNLX0hFVkMKKwkJCQl8IENPUkVfTUFTS19IRVZDX0ZST05UCisJCQkJfCBDT1JFX01BU0tfSEVWQ19CQUNLCisJCQkJKTsKKyNlbHNlCisJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKQorCQl2ZGVjX2NvcmVfZmluaXNoX3J1bih2ZGVjLCBDT1JFX01BU0tfSEVWQyk7CisJZWxzZQorCQl2ZGVjX2NvcmVfZmluaXNoX3J1bihod190b192ZGVjKHBiaSksIENPUkVfTUFTS19WREVDXzEKKwkJCQkJfCBDT1JFX01BU0tfSEVWQyk7CisjZW5kaWYKKwl0cmlnZ2VyX3NjaGVkdWxlKHBiaSk7Cit9CisKK3N0YXRpYyBpbnQgdnA5X2h3X2N0eF9yZXN0b3JlKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwkvKiBuZXcgdG8gZG8gLi4uICovCisjaWYgKCFkZWZpbmVkIFNVUFBPUlRfRkJfREVDT0RJTkcpCisJdnZwOV9wcm90X2luaXQocGJpLCBIV19NQVNLX0ZST05UIHwgSFdfTUFTS19CQUNLKTsKKyNlbGlmIChkZWZpbmVkIEZCX0RFQ09ESU5HX1RFU1RfU0NIRURVTEUpCisJdnZwOV9wcm90X2luaXQocGJpLCBIV19NQVNLX0ZST05UIHwgSFdfTUFTS19CQUNLKTsKKyNlbHNlCisJaWYgKHBiaS0+dXNlZF9zdGFnZV9idWZfbnVtID4gMCkKKwkJdnZwOV9wcm90X2luaXQocGJpLCBIV19NQVNLX0ZST05UKTsKKwllbHNlCisJCXZ2cDlfcHJvdF9pbml0KHBiaSwgSFdfTUFTS19GUk9OVCB8IEhXX01BU0tfQkFDSyk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2wgaXNfYXZhbGlhYmxlX2J1ZmZlcihzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJc3RydWN0IFZQOV9Db21tb25fcyAqY29uc3QgY20gPSAmcGJpLT5jb21tb247CisJc3RydWN0IFJlZkNudEJ1ZmZlcl9zICpjb25zdCBmcmFtZV9idWZzID0gY20tPmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShwYmktPnY0bDJfY3R4KTsKKwlpbnQgaSwgZnJlZV9jb3VudCA9IDA7CisKKwlpZiAoY3R4LT5jYXBfcG9vbC5kZWMgPCBwYmktPnVzZWRfYnVmX251bSkgeworCQlmcmVlX2NvdW50ID0gdjRsMl9tMm1fbnVtX2RzdF9idWZzX3JlYWR5KGN0eC0+bTJtX2N0eCk7CisJCWlmIChmcmVlX2NvdW50ICYmCisJCQkhY3R4LT5mYl9vcHMucXVlcnkoJmN0eC0+ZmJfb3BzLCAmcGJpLT5mYl90b2tlbikpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBwYmktPnVzZWRfYnVmX251bTsgKytpKSB7CisJCWlmICgoZnJhbWVfYnVmc1tpXS5yZWZfY291bnQgPT0gMCkgJiYKKwkJCShmcmFtZV9idWZzW2ldLmJ1Zi52Zl9yZWYgPT0gMCkgJiYKKwkJCWZyYW1lX2J1ZnNbaV0uYnVmLmNtYV9hbGxvY19hZGRyKSB7CisJCQlmcmVlX2NvdW50Kys7CisJCX0KKwl9CisKKwlyZXR1cm4gZnJlZV9jb3VudCA8IHBiaS0+cnVuX3JlYWR5X21pbl9idWZfbnVtID8gMCA6IDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJ1bl9yZWFkeShzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1bnNpZ25lZCBsb25nIG1hc2spCit7CisJc3RydWN0IFZQOURlY29kZXJfcyAqcGJpID0KKwkJKHN0cnVjdCBWUDlEZWNvZGVyX3MgKil2ZGVjLT5wcml2YXRlOworCWludCB0dnAgPSB2ZGVjX3NlY3VyZShod190b192ZGVjKHBiaSkpID8KKwkJQ09ERUNfTU1fRkxBR1NfVFZQIDogMDsKKwl1bnNpZ25lZCBsb25nIHJldCA9IDA7CisKKwlpZiAoIShwYmktPnBpY19saXN0X2luaXRfZG9uZSAmJiBwYmktPnBpY19saXN0X2luaXRfZG9uZTIpIHx8IHBiaS0+ZW9zKQorCQlyZXR1cm4gcmV0OworCWlmICghcGJpLT5maXJzdF9zY19jaGVja2VkICYmIHBiaS0+bW11X2VuYWJsZSkgeworCQlpbnQgc2l6ZTsKKwkJdm9pZCAqIG1tdV9ib3g7CisKKwkJaWYgKHBiaS0+aXNfdXNlZF92NGwpIHsKKwkJCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKHBiaS0+djRsMl9jdHgpOworCQkJbW11X2JveCA9IGN0eC0+bW11X2JveDsKKwkJfSBlbHNlCisJCQltbXVfYm94ID0gcGJpLT5tbXVfYm94OworCisJCXNpemUgPSBkZWNvZGVyX21tdV9ib3hfc2NfY2hlY2sobW11X2JveCwgdHZwKTsKKwkJcGJpLT5maXJzdF9zY19jaGVja2VkID0gMTsKKwkJdnA5X3ByaW50KHBiaSwgMCwgInZwOSBjYWNoZWQ9JWQgIG5lZWRfc2l6ZT0lZCBzcGVlZD0gJWQgbXNcbiIsCisJCQlzaXplLCAocGJpLT5uZWVkX2NhY2hlX3NpemUgPj4gUEFHRV9TSElGVCksCisJCQkoaW50KShnZXRfamlmZmllc182NCgpIC0gcGJpLT5zY19zdGFydF90aW1lKSAqIDEwMDAvSFopOworCX0KKworI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKKwlpZiAocGJpLT51c2VkX3N0YWdlX2J1Zl9udW0gPiAwKSB7CisJCWlmIChtYXNrICYgQ09SRV9NQVNLX0hFVkNfRlJPTlQpIHsKKwkJCWlmIChnZXRfZnJlZV9zdGFnZV9idWZfbnVtKHBiaSkgPiAwCisJCQkJJiYgbXZfYnVmX2F2YWlsYWJsZShwYmkpKQorCQkJCXJldCB8PSBDT1JFX01BU0tfSEVWQ19GUk9OVDsKKwkJfQorCQlpZiAobWFzayAmIENPUkVfTUFTS19IRVZDX0JBQ0spIHsKKwkJCWlmIChzMl9idWZfYXZhaWxhYmxlKHBiaSkgJiYKKwkJCQkoZ2V0X2ZyZWVfYnVmX2NvdW50KHBiaSkgPj0KKwkJCQlwYmktPnJ1bl9yZWFkeV9taW5fYnVmX251bSkpIHsKKwkJCQlyZXQgfD0gQ09SRV9NQVNLX0hFVkNfQkFDSzsKKwkJCQlwYmktPmJhY2tfbm90X3J1bl9yZWFkeSA9IDA7CisJCQl9IGVsc2UKKwkJCQlwYmktPmJhY2tfbm90X3J1bl9yZWFkeSA9IDE7CisjaWYgMAorCQkJaWYgKGdldF9mcmVlX2J1Zl9jb3VudChwYmkpIDwKKwkJCQlydW5fcmVhZHlfbWluX2J1Zl9udW0pCisJCQkJZHVtcF9waWNfbGlzdChwYmkpOworI2VuZGlmCisJCX0KKwl9IGVsc2UgaWYgKGdldF9mcmVlX2J1Zl9jb3VudChwYmkpID49CisJCXBiaS0+cnVuX3JlYWR5X21pbl9idWZfbnVtKQorCQlyZXQgPSBDT1JFX01BU0tfVkRFQ18xIHwgQ09SRV9NQVNLX0hFVkMKKwkJCXwgQ09SRV9NQVNLX0hFVkNfRlJPTlQKKwkJCXwgQ09SRV9NQVNLX0hFVkNfQkFDSzsKKworCWlmIChyZXQgJiBDT1JFX01BU0tfSEVWQ19GUk9OVCkKKwkJbm90X3J1bl9yZWFkeVtwYmktPmluZGV4XSA9IDA7CisJZWxzZQorCQlub3RfcnVuX3JlYWR5W3BiaS0+aW5kZXhdKys7CisKKwlpZiAocmV0ICYgQ09SRV9NQVNLX0hFVkNfQkFDSykKKwkJbm90X3J1bjJfcmVhZHlbcGJpLT5pbmRleF0gPSAwOworCWVsc2UKKwkJbm90X3J1bjJfcmVhZHlbcGJpLT5pbmRleF0rKzsKKworCXZwOV9wcmludChwYmksCisJCVBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsICIlcyBtYXNrICVseD0+JWx4ICglZCAlZCAlZCAlZClcclxuIiwKKwkJX19mdW5jX18sIG1hc2ssIHJldCwKKwkJZ2V0X2ZyZWVfc3RhZ2VfYnVmX251bShwYmkpLAorCQltdl9idWZfYXZhaWxhYmxlKHBiaSksCisJCXMyX2J1Zl9hdmFpbGFibGUocGJpKSwKKwkJZ2V0X2ZyZWVfYnVmX2NvdW50KHBiaSkKKwkJKTsKKworCXJldHVybiByZXQ7CisKKyNlbHNlCisJaWYgKGdldF9mcmVlX2J1Zl9jb3VudChwYmkpID49CisJCXBiaS0+cnVuX3JlYWR5X21pbl9idWZfbnVtKSB7CisJCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkKKwkJCXJldCA9IENPUkVfTUFTS19IRVZDOworCQllbHNlCisJCQlyZXQgPSBDT1JFX01BU0tfVkRFQ18xIHwgQ09SRV9NQVNLX0hFVkM7CisJfQorCisJaWYgKHBiaS0+aXNfdXNlZF92NGwpIHsKKwkJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShwYmktPnY0bDJfY3R4KTsKKworCQlpZiAoY3R4LT5wYXJhbV9zZXRzX2Zyb21fdWNvZGUpIHsKKwkJCWlmIChwYmktPnY0bF9wYXJhbXNfcGFyc2VkKSB7CisJCQkJaWYgKGN0eC0+Y2FwX3Bvb2wuZGVjIDwgcGJpLT51c2VkX2J1Zl9udW0pIHsKKwkJCQkJaWYgKGlzX2F2YWxpYWJsZV9idWZmZXIocGJpKSkKKwkJCQkJCXJldCA9IENPUkVfTUFTS19IRVZDOworCQkJCQllbHNlCisJCQkJCQlyZXQgPSAwOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGN0eC0+djRsX3Jlc29sdXRpb25fY2hhbmdlKQorCQkJCQlyZXQgPSAwOworCQkJfQorCQl9IGVsc2UgaWYgKGN0eC0+Y2FwX3Bvb2wuaW4gPCBjdHgtPmRwYl9zaXplKSB7CisJCQlpZiAodjRsMl9tMm1fbnVtX2RzdF9idWZzX3JlYWR5KGN0eC0+bTJtX2N0eCkgPAorCQkJCXBiaS0+cnVuX3JlYWR5X21pbl9idWZfbnVtKQorCQkJCXJldCA9IDA7CisJCX0KKwl9CisKKwlpZiAocmV0KQorCQlub3RfcnVuX3JlYWR5W3BiaS0+aW5kZXhdID0gMDsKKwllbHNlCisJCW5vdF9ydW5fcmVhZHlbcGJpLT5pbmRleF0rKzsKKworCXZwOV9wcmludChwYmksCisJCVBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsICIlcyBtYXNrICVseD0+JWx4XHJcbiIsCisJCV9fZnVuY19fLCBtYXNrLCByZXQpOworCXJldHVybiByZXQ7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgdnA5X2ZyYW1lX21vZGVfcHRzX3NhdmUoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCWludCBpID0gMDsKKworCWlmIChwYmktPmNodW5rID09IE5VTEwpCisJICAgICAgIHJldHVybjsKKwl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfT1VUX1BUUywKKwkgICAgICAgInJ1biBmcm9udDogcHRzICVkLCBwdHM2NCAlbGxkLCB0czogJWxsZFxuIiwKKwkgICAgICAgcGJpLT5jaHVuay0+cHRzLCBwYmktPmNodW5rLT5wdHM2NCwgcGJpLT5jaHVuay0+dGltZXN0YW1wKTsKKwlmb3IgKGkgPSAoRlJBTUVfQlVGRkVSUyAtIDEpOyBpID4gMDsgaS0tKSB7CisJCXBiaS0+ZnJhbWVfbW9kZV9wdHNfc2F2ZVtpXSA9IHBiaS0+ZnJhbWVfbW9kZV9wdHNfc2F2ZVtpIC0gMV07CisJCXBiaS0+ZnJhbWVfbW9kZV9wdHM2NF9zYXZlW2ldID0gcGJpLT5mcmFtZV9tb2RlX3B0czY0X3NhdmVbaSAtIDFdOworCX0KKwlwYmktPmZyYW1lX21vZGVfcHRzX3NhdmVbMF0gPSBwYmktPmNodW5rLT5wdHM7CisJcGJpLT5mcmFtZV9tb2RlX3B0czY0X3NhdmVbMF0gPSBwYmktPmNodW5rLT5wdHM2NDsKKworCWlmIChwYmktPmlzX3VzZWRfdjRsICYmICF2NGxfYml0c3RyZWFtX2lkX2VuYWJsZSkKKwkJcGJpLT5mcmFtZV9tb2RlX3B0czY0X3NhdmVbMF0gPSBwYmktPmNodW5rLT50aW1lc3RhbXA7Cit9CisKK3N0YXRpYyB2b2lkIHJ1bl9mcm9udChzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSA9CisJCShzdHJ1Y3QgVlA5RGVjb2Rlcl9zICopdmRlYy0+cHJpdmF0ZTsKKwlpbnQgcmV0LCBzaXplOworCisJcnVuX2NvdW50W3BiaS0+aW5kZXhdKys7CisJLyogcGJpLT5jaHVuayA9IHZkZWNfcHJlcGFyZV9pbnB1dCh2ZGVjKTsgKi8KKyNpZiAoIWRlZmluZWQgU1VQUE9SVF9GQl9ERUNPRElORykKKwloZXZjX3Jlc2V0X2NvcmUodmRlYyk7CisjZWxpZiAoZGVmaW5lZCBGQl9ERUNPRElOR19URVNUX1NDSEVEVUxFKQorCWhldmNfcmVzZXRfY29yZSh2ZGVjKTsKKyNlbHNlCisJaWYgKHBiaS0+dXNlZF9zdGFnZV9idWZfbnVtID4gMCkKKwkJZmJfcmVzZXRfY29yZSh2ZGVjLCBIV19NQVNLX0ZST05UKTsKKwllbHNlCisJCWhldmNfcmVzZXRfY29yZSh2ZGVjKTsKKyNlbmRpZgorCisJc2l6ZSA9IHZkZWNfcHJlcGFyZV9pbnB1dCh2ZGVjLCAmcGJpLT5jaHVuayk7CisJaWYgKHNpemUgPCAwKSB7CisJCWlucHV0X2VtcHR5W3BiaS0+aW5kZXhdKys7CisKKwkJcGJpLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKworCQl2cDlfcHJpbnQocGJpLCBQUklOVF9GTEFHX1ZERUNfREVUQUlMLAorCQkJImFtbXZkZWNfdmgyNjU6IEluc3VmZmljaWVudCBkYXRhXG4iKTsKKworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJnBiaS0+d29yayk7CisJCXJldHVybjsKKwl9CisKKwlpbnB1dF9lbXB0eVtwYmktPmluZGV4XSA9IDA7CisJcGJpLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9OT05FOworCXBiaS0+c3RhcnRfc2hpZnRfYnl0ZXMgPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKTsKKworCXZwOV9mcmFtZV9tb2RlX3B0c19zYXZlKHBiaSk7CisKKwlpZiAoZGVidWcgJiBQUklOVF9GTEFHX1ZERUNfU1RBVFVTKSB7CisJCWludCBpaTsKKwkJdnA5X3ByaW50KHBiaSwgMCwKKwkJCSIlcyAoJWQpOiBzaXplIDB4JXggKDB4JXggMHgleCkgc3VtIDB4JXggKCV4ICV4ICV4ICV4ICV4KSBieXRlcyAweCV4IiwKKwkJCV9fZnVuY19fLAorCQkJcGJpLT5mcmFtZV9jb3VudCwgc2l6ZSwKKwkJCXBiaS0+Y2h1bmsgPyBwYmktPmNodW5rLT5zaXplIDogMCwKKwkJCXBiaS0+Y2h1bmsgPyBwYmktPmNodW5rLT5vZmZzZXQgOiAwLAorCQkJcGJpLT5jaHVuayA/ICgodmRlY19mcmFtZV9iYXNlZCh2ZGVjKSAmJgorCQkJKGRlYnVnICYgUFJJTlRfRkxBR19WREVDX1NUQVRVUykpID8KKwkJCWdldF9kYXRhX2NoZWNrX3N1bShwYmksIHNpemUpIDogMCkgOiAwLAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fU1RBUlRfQUREUiksCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9FTkRfQUREUiksCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9MRVZFTCksCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9XUl9QVFIpLAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSKSwKKwkJcGJpLT5zdGFydF9zaGlmdF9ieXRlcyk7CisKKwkJaWYgKCF2ZGVjX3NlY3VyZShod190b192ZGVjKHBiaSkpICYmCisJCQl2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpICYmIHBiaS0+Y2h1bmspIHsKKwkJCXU4ICpkYXRhID0gTlVMTDsKKworCQkJaWYgKCFwYmktPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQkJCWRhdGEgPSBjb2RlY19tbV92bWFwKHBiaS0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQkJCXBiaS0+Y2h1bmstPm9mZnNldCwgOCk7CisJCQllbHNlCisJCQkJZGF0YSA9ICgodTggKilwYmktPmNodW5rLT5ibG9jay0+c3RhcnRfdmlydCkgKworCQkJCQlwYmktPmNodW5rLT5vZmZzZXQ7CisKKwkJCXZwOV9wcmludF9jb250KHBiaSwgMCwgImRhdGEgYWRyICVwOiIsCisJCQkJZGF0YSk7CisJCQlmb3IgKGlpID0gMDsgaWkgPCA4OyBpaSsrKQorCQkJCXZwOV9wcmludF9jb250KHBiaSwgMCwgIiUwMnggIiwKKwkJCQkJZGF0YVtpaV0pOworCisJCQlpZiAoIXBiaS0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcihkYXRhKTsKKwkJfQorCQl2cDlfcHJpbnRfY29udChwYmksIDAsICJcclxuIik7CisJfQorCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UuZGVjb2RlX3J1bl90aW1lX25hbWUsIFRSQUNFX1JVTl9MT0FESU5HX0ZXX1NUQVJUKTsKKwlpZiAodmRlYy0+bWNfbG9hZGVkKSB7CisJLypmaXJtd2FyZSBoYXZlIGxvYWQgYmVmb3JlLAorCSAgYW5kIG5vdCBjaGFuZ2VzIHRvIGFub3RoZXIuCisJICBpZ25vcmUgcmVsb2FkLgorCSovCisJfSBlbHNlIHsKKwkJCXJldCA9IGFtaGV2Y19sb2FkbWNfZXgoVkZPUk1BVF9WUDksIE5VTEwsIHBiaS0+ZnctPmRhdGEpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCWFtaGV2Y19kaXNhYmxlKCk7CisJCQl2cDlfcHJpbnQocGJpLCBQUklOVF9GTEFHX0VSUk9SLAorCQkJCSJWUDk6IHRoZSAlcyBmdyBsb2FkaW5nIGZhaWxlZCwgZXJyOiAleFxuIiwKKwkJCQl0ZWVfZW5hYmxlZCgpID8gIlRFRSIgOiAibG9jYWwiLCByZXQpOworCQkJcGJpLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9GT1JDRV9FWElUOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZwYmktPndvcmspOworCQkJcmV0dXJuOworCQl9CisJCXZkZWMtPm1jX2xvYWRlZCA9IDE7CisJCXZkZWMtPm1jX3R5cGUgPSBWRk9STUFUX1ZQOTsKKwl9CisJQVRSQUNFX0NPVU5URVIocGJpLT50cmFjZS5kZWNvZGVfcnVuX3RpbWVfbmFtZSwgVFJBQ0VfUlVOX0xPQURJTkdfRldfRU5EKTsKKworCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UuZGVjb2RlX3J1bl90aW1lX25hbWUsIFRSQUNFX1JVTl9MT0FESU5HX1JFU1RPUkVfU1RBUlQpOworCWlmICh2cDlfaHdfY3R4X3Jlc3RvcmUocGJpKSA8IDApIHsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZwYmktPndvcmspOworCQlyZXR1cm47CisJfQorCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UuZGVjb2RlX3J1bl90aW1lX25hbWUsIFRSQUNFX1JVTl9MT0FESU5HX1JFU1RPUkVfRU5EKTsKKwl2ZGVjX2VuYWJsZV9pbnB1dCh2ZGVjKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgSEVWQ19BQ1RJT05fRE9ORSk7CisKKwlpZiAodmRlY19mcmFtZV9iYXNlZCh2ZGVjKSkgeworCQlpZiAoZGVidWcgJiBQUklOVF9GTEFHX1ZERUNfREFUQSkKKwkJCWR1bXBfZGF0YShwYmksIHBiaS0+Y2h1bmstPnNpemUpOworCisJCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5ULCAwKTsKKwkJc2l6ZSA9IHBiaS0+Y2h1bmstPnNpemUgKworCQkJKHBiaS0+Y2h1bmstPm9mZnNldCAmIChWREVDX0ZJRk9fQUxJR04gLSAxKSk7CisJCWlmICh2ZGVjLT5tdmZybSkKKwkJCXZkZWMtPm12ZnJtLT5mcmFtZV9zaXplID0gcGJpLT5jaHVuay0+c2l6ZTsKKwl9CisJV1JJVEVfVlJFRyhIRVZDX0RFQ09ERV9TSVpFLCBzaXplKTsKKwlXUklURV9WUkVHKEhFVkNfREVDT0RFX0NPVU5ULCBwYmktPnNsaWNlX2lkeCk7CisJcGJpLT5pbml0X2ZsYWcgPSAxOworCisJdnA5X3ByaW50KHBiaSwgUFJJTlRfRkxBR19WREVDX0RFVEFJTCwKKwkJIiVzOiBzdGFydCBoZXZjICgleCAleCAleClcbiIsCisJCV9fZnVuY19fLAorCQlSRUFEX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRyksCisJCVJFQURfVlJFRyhIRVZDX01QQ19FKSwKKwkJUkVBRF9WUkVHKEhFVkNfTVBTUikpOworCisJc3RhcnRfcHJvY2Vzc190aW1lKHBiaSk7CisJbW9kX3RpbWVyKCZwYmktPnRpbWVyLCBqaWZmaWVzKTsKKwlwYmktPnN0YXQgfD0gU1RBVF9USU1FUl9BUk07CisJcGJpLT5zdGF0IHw9IFNUQVRfSVNSX1JFRzsKKwlhbWhldmNfc3RhcnQoKTsKKwlwYmktPnN0YXQgfD0gU1RBVF9WREVDX1JVTjsKK30KKworI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKK3N0YXRpYyB2b2lkIG1wcmVkX3Byb2Nlc3Moc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCXVuaW9uIHBhcmFtX3UgKnBhcmFtcyA9ICZwYmktPnMxX3BhcmFtOworCXVuc2lnbmVkIGNoYXIgdXNlX3ByZXZfZnJhbWVfbXZzID0KKwkJIXBhcmFtcy0+cC5lcnJvcl9yZXNpbGllbnRfbW9kZSAmJgorCQlwYXJhbXMtPnAud2lkdGggPT0gcGJpLT5zMV93aWR0aCAmJgorCQlwYXJhbXMtPnAuaGVpZ2h0ID09IHBiaS0+czFfaGVpZ2h0ICYmCisJCSFwYmktPnMxX2ludHJhX29ubHkgJiYKKwkJcGJpLT5zMV9sYXN0X3Nob3dfZnJhbWUgJiYKKwkJKHBiaS0+czFfZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUpOworCXBiaS0+czFfd2lkdGggPSBwYXJhbXMtPnAud2lkdGg7CisJcGJpLT5zMV9oZWlnaHQgPSBwYXJhbXMtPnAuaGVpZ2h0OworCXBiaS0+czFfZnJhbWVfdHlwZSA9IHBhcmFtcy0+cC5mcmFtZV90eXBlOworCXBiaS0+czFfaW50cmFfb25seSA9CisJCShwYXJhbXMtPnAuc2hvd19mcmFtZSB8fAorCQlwYXJhbXMtPnAuc2hvd19leGlzdGluZ19mcmFtZSkKKwkJPyAwIDogcGFyYW1zLT5wLmludHJhX29ubHk7CisJaWYgKChwYmktPnMxX2ZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKQorCQkmJiAoIXBiaS0+czFfaW50cmFfb25seSkpIHsKKwkJdW5zaWduZWQgaW50IGRhdGEzMjsKKwkJaW50IG1wcmVkX212X3JkX2VuZF9hZGRyOworCisJCW1wcmVkX212X3JkX2VuZF9hZGRyID0KKwkJCXBiaS0+czFfbXByZWRfbXZfd3Jfc3RhcnRfYWRkcl9wcmUKKwkJCSsgKHBiaS0+bGN1X3RvdGFsICogTVZfTUVNX1VOSVQpOworCisJCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9DVFJMMywgMHgyNDEyMjQxMik7CisJCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9BQlZfU1RBUlRfQUREUiwKKwkJCXBiaS0+d29ya19zcGFjZV9idWYtPgorCQkJbXByZWRfYWJvdmUuYnVmX3N0YXJ0KTsKKworCQlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19NUFJFRF9DVFJMNCk7CisKKwkJZGF0YTMyICY9ICAofigxIDw8IDYpKTsKKwkJZGF0YTMyIHw9ICh1c2VfcHJldl9mcmFtZV9tdnMgPDwgNik7CisJCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9DVFJMNCwgZGF0YTMyKTsKKworCQlXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfV1JfU1RBUlRfQUREUiwKKwkJCQlwYmktPnMxX21wcmVkX212X3dyX3N0YXJ0X2FkZHIpOworCQlXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfV1BUUiwKKwkJCXBiaS0+czFfbXByZWRfbXZfd3Jfc3RhcnRfYWRkcik7CisKKwkJV1JJVEVfVlJFRyhIRVZDX01QUkVEX01WX1JEX1NUQVJUX0FERFIsCisJCQlwYmktPnMxX21wcmVkX212X3dyX3N0YXJ0X2FkZHJfcHJlKTsKKwkJV1JJVEVfVlJFRyhIRVZDX01QUkVEX01WX1JQVFIsCisJCQlwYmktPnMxX21wcmVkX212X3dyX3N0YXJ0X2FkZHJfcHJlKTsKKworCQlXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfUkRfRU5EX0FERFIsCisJCQltcHJlZF9tdl9yZF9lbmRfYWRkcik7CisKKwl9IGVsc2UKKwkJY2xlYXJfbXByZWRfaHcocGJpKTsKKworCWlmICghcGFyYW1zLT5wLnNob3dfZXhpc3RpbmdfZnJhbWUpIHsKKwkJcGJpLT5zMV9tcHJlZF9tdl93cl9zdGFydF9hZGRyX3ByZSA9CisJCQlwYmktPnMxX21wcmVkX212X3dyX3N0YXJ0X2FkZHI7CisJCXBiaS0+czFfbGFzdF9zaG93X2ZyYW1lID0KKwkJCXBhcmFtcy0+cC5zaG93X2ZyYW1lOworCQlpZiAocGJpLT5zMV9tdl9idWZfaW5kZXhfcHJlX3ByZSAhPSBNVl9CVUZGRVJfTlVNKQorCQkJcHV0X212X2J1ZihwYmksICZwYmktPnMxX212X2J1Zl9pbmRleF9wcmVfcHJlKTsKKwkJcGJpLT5zMV9tdl9idWZfaW5kZXhfcHJlX3ByZSA9CisJCQlwYmktPnMxX212X2J1Zl9pbmRleF9wcmU7CisJCXBiaS0+czFfbXZfYnVmX2luZGV4X3ByZSA9IHBiaS0+czFfbXZfYnVmX2luZGV4OworCX0gZWxzZQorCQlwdXRfbXZfYnVmKHBiaSwgJnBiaS0+czFfbXZfYnVmX2luZGV4KTsKK30KKworc3RhdGljIHZvaWQgdnA5X3MxX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICpzMV93b3JrKQoreworCXN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSA9IGNvbnRhaW5lcl9vZihzMV93b3JrLAorCQlzdHJ1Y3QgVlA5RGVjb2Rlcl9zLCBzMV93b3JrKTsKKwl2cDlfcHJpbnQocGJpLCBQUklOVF9GTEFHX1ZERUNfREVUQUlMLAorCQkiJXMgZGVjX3MxX3Jlc3VsdCAlZFxuIiwKKwkJX19mdW5jX18sCisJCXBiaS0+ZGVjX3MxX3Jlc3VsdCk7CisKKyNpZmRlZiBGQl9ERUNPRElOR19URVNUX1NDSEVEVUxFCisJaWYgKHBiaS0+ZGVjX3MxX3Jlc3VsdCA9PQorCQlERUNfUzFfUkVTVUxUX1RFU1RfVFJJR0dFUl9ET05FKSB7CisJCXBiaS0+czFfdGVzdF9jbWQgPSBURVNUX1NFVF9QSUNfRE9ORTsKKwkJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9NQk9YMF9JUlFfUkVHLCAweDEpOworCX0KKyNlbmRpZgorCWlmIChwYmktPmRlY19zMV9yZXN1bHQgPT0gREVDX1MxX1JFU1VMVF9ET05FIHx8CisJCXBiaS0+ZGVjX3MxX3Jlc3VsdCA9PSBERUNfUzFfUkVTVUxUX0ZPUkNFX0VYSVQpIHsKKworCQl2ZGVjX2NvcmVfZmluaXNoX3J1bihod190b192ZGVjKHBiaSksCisJCQlDT1JFX01BU0tfSEVWQ19GUk9OVCk7CisKKwkJdHJpZ2dlcl9zY2hlZHVsZShwYmkpOworCQkvKnBiaS0+ZGVjX3MxX3Jlc3VsdCA9IERFQ19TMV9SRVNVTFRfTk9ORTsqLworCX0KKworfQorCitzdGF0aWMgdm9pZCBydW5fYmFjayhzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSA9CisJCShzdHJ1Y3QgVlA5RGVjb2Rlcl9zICopdmRlYy0+cHJpdmF0ZTsKKwlpbnQgaTsKKwlydW4yX2NvdW50W3BiaS0+aW5kZXhdKys7CisJaWYgKGRlYnVnICYgUFJJTlRfRkxBR19WREVDX1NUQVRVUykgeworCQl2cDlfcHJpbnQocGJpLCAwLAorCQkJIiVzIiwgX19mdW5jX18pOworCX0KKwlwYmktPnJ1bjJfYnVzeSA9IDE7CisjaWZuZGVmIEZCX0RFQ09ESU5HX1RFU1RfU0NIRURVTEUKKwlmYl9yZXNldF9jb3JlKHZkZWMsIEhXX01BU0tfQkFDSyk7CisKKwl2dnA5X3Byb3RfaW5pdChwYmksIEhXX01BU0tfQkFDSyk7CisjZW5kaWYKKwl2cDlfcmVjeWNsZV9tbXVfYnVmX3RhaWwocGJpKTsKKworCWlmIChwYmktPmZyYW1lX2NvdW50ID4gMCkKKwkJdnA5X2J1Zm1ncl9wb3N0cHJvYyhwYmkpOworCisJaWYgKGdldF9zMl9idWYocGJpKSA+PSAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCAoUlBNX0VORCAtIFJQTV9CRUdJTik7IGkgKz0gNCkgeworCQkJaW50IGlpOworCQkJZm9yIChpaSA9IDA7IGlpIDwgNDsgaWkrKykKKwkJCQlwYmktPnZwOV9wYXJhbS5sLmRhdGFbaSArIGlpXSA9CisJCQkJCXBiaS0+czJfYnVmLT5ycG1baSArIDMgLSBpaV07CisJCX0KKyNpZm5kZWYgRkJfREVDT0RJTkdfVEVTVF9TQ0hFRFVMRQorCQlXUklURV9WUkVHKEhFVkNfQVNTSVNUX0ZCRF9NTVVfTUFQX0FERFIsCisJCQlwYmktPnN0YWdlX21tdV9tYXBfcGh5X2FkZHIgKworCQkJcGJpLT5zMl9idWYtPmluZGV4ICogU1RBR0VfTU1VX01BUF9TSVpFKTsKKyNlbmRpZgorCQljb250aW51ZV9kZWNvZGluZyhwYmkpOworCX0KKwlwYmktPnJ1bjJfYnVzeSA9IDA7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgcnVuKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHVuc2lnbmVkIGxvbmcgbWFzaywKKwl2b2lkICgqY2FsbGJhY2spKHN0cnVjdCB2ZGVjX3MgKiwgdm9pZCAqKSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSA9CisJCShzdHJ1Y3QgVlA5RGVjb2Rlcl9zICopdmRlYy0+cHJpdmF0ZTsKKwlBVFJBQ0VfQ09VTlRFUihwYmktPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfUlVOX1NUQVJUKTsKKwl2cDlfcHJpbnQocGJpLAorCQlQUklOVF9GTEFHX1ZERUNfREVUQUlMLCAiJXMgbWFzayAlbHhcclxuIiwKKwkJX19mdW5jX18sIG1hc2spOworCisJaWYgKHZkZWMtPm12ZnJtKQorCQl2ZGVjLT5tdmZybS0+aHdfZGVjb2RlX3N0YXJ0ID0gbG9jYWxfY2xvY2soKTsKKwlydW5fY291bnRbcGJpLT5pbmRleF0rKzsKKwlwYmktPnZkZWNfY2JfYXJnID0gYXJnOworCXBiaS0+dmRlY19jYiA9IGNhbGxiYWNrOworCXBiaS0+b25lX3BhY2thZ2VfZnJhbWVfY250ID0gMDsKKyNpZmRlZiBTVVBQT1JUX0ZCX0RFQ09ESU5HCisJaWYgKChtYXNrICYgQ09SRV9NQVNLX0hFVkMpIHx8CisJCShtYXNrICYgQ09SRV9NQVNLX0hFVkNfRlJPTlQpKQorCQlydW5fZnJvbnQodmRlYyk7CisKKwlpZiAoKHBiaS0+dXNlZF9zdGFnZV9idWZfbnVtID4gMCkKKwkJJiYgKG1hc2sgJiBDT1JFX01BU0tfSEVWQ19CQUNLKSkKKwkJcnVuX2JhY2sodmRlYyk7CisjZWxzZQorCXJ1bl9mcm9udCh2ZGVjKTsKKyNlbmRpZgorCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9SVU5fRU5EKTsKKworfQorCitzdGF0aWMgdm9pZCAgdnA5X2RlY29kZXJfY3R4X3Jlc2V0KHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhwYmkpOworCXN0cnVjdCBWUDlfQ29tbW9uX3MgKmNvbnN0IGNtID0gJnBiaS0+Y29tbW9uOworCXN0cnVjdCBSZWZDbnRCdWZmZXJfcyAqY29uc3QgZnJhbWVfYnVmcyA9IGNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmczsKKwlzdHJ1Y3QgQnVmZmVyUG9vbF9zICpidWZmZXJfcG9vbCA9IGNtLT5idWZmZXJfcG9vbDsKKwlpbnQgaTsKKworCWNtLT5idWZmZXJfcG9vbCA9IGJ1ZmZlcl9wb29sOworCisJZm9yIChpID0gMDsgaSA8IEZSQU1FX0JVRkZFUlM7ICsraSkgeworCQlmcmFtZV9idWZzW2ldLmJ1Zi5pbmRleAkJPSBpOworCQlmcmFtZV9idWZzW2ldLnJlZl9jb3VudAkJPSAwOworCQlmcmFtZV9idWZzW2ldLmJ1Zi52Zl9yZWYJPSAwOworCQlmcmFtZV9idWZzW2ldLmJ1Zi5kZWNvZGVfaWR4CT0gMDsKKwkJZnJhbWVfYnVmc1tpXS5idWYuY21hX2FsbG9jX2FkZHIgPSAwOworCQlmcmFtZV9idWZzW2ldLmJ1Zi5CVUZfaW5kZXgJPSAtMTsKKwkJZnJhbWVfYnVmc1tpXS5idWYuc2xpY2VfdHlwZQk9IDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE1WX0JVRkZFUl9OVU07ICsraSkgeworCQlwYmktPm1fbXZfQlVGW2ldLnVzZWRfZmxhZyA9IDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEZSQU1FX0JVRkZFUlM7IGkrKykgeworCQlwYmktPmJ1ZmZlcl93cmFwW2ldID0gaTsKKwl9CisKKwlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJZm9yIChpID0gMDsgaSA8IEZSQU1FX0JVRkZFUlM7IGkrKykgeworCQkJdmRlYy0+ZnJlZV9jYW52YXNfZXgKKwkJCQkocGJpLT5jb21tb24uYnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnNbaV0uYnVmLnlfY2FudmFzX2luZGV4LAorCQkJCXZkZWMtPmlkKTsKKwkJCXZkZWMtPmZyZWVfY2FudmFzX2V4CisJCQkJKHBiaS0+Y29tbW9uLmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzW2ldLmJ1Zi51dl9jYW52YXNfaW5kZXgsCisJCQkJdmRlYy0+aWQpOworCQl9CisJfQorCisJcGJpLT5pbml0X2ZsYWcJCT0gMDsKKwlwYmktPmZpcnN0X3NjX2NoZWNrZWQJPSAwOworCXBiaS0+ZmF0YWxfZXJyb3IJPSAwOworCXBiaS0+c2hvd19mcmFtZV9udW0JPSAwOworCXBiaS0+ZW9zCQk9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0KHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IFZQOURlY29kZXJfcyAqcGJpID0KKwkJKHN0cnVjdCBWUDlEZWNvZGVyX3MgKil2ZGVjLT5wcml2YXRlOworCisJY2FuY2VsX3dvcmtfc3luYygmcGJpLT5zZXRfY2xrX3dvcmspOworCWNhbmNlbF93b3JrX3N5bmMoJnBiaS0+d29yayk7CisJaWYgKHBiaS0+c3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJYW1oZXZjX3N0b3AoKTsKKwkJcGJpLT5zdGF0ICY9IH5TVEFUX1ZERUNfUlVOOworCX0KKworCWlmIChwYmktPnN0YXQgJiBTVEFUX1RJTUVSX0FSTSkgeworCQlkZWxfdGltZXJfc3luYygmcGJpLT50aW1lcik7CisJCXBiaS0+c3RhdCAmPSB+U1RBVF9USU1FUl9BUk07CisJfQorCisJcmVzZXRfcHJvY2Vzc190aW1lKHBiaSk7CisKKwl2cDlfbG9jYWxfdW5pbml0KHBiaSk7CisJaWYgKHZ2cDlfbG9jYWxfaW5pdChwYmkpIDwgMCkKKwkJdnA5X3ByaW50KHBiaSwgMCwgIiVzIGxvY2FsX2luaXQgZmFpbGVkIFxyXG4iLCBfX2Z1bmNfXyk7CisKKwl2cDlfZGVjb2Rlcl9jdHhfcmVzZXQocGJpKTsKKworCXZwOV9wcmludChwYmksIDAsICIlc1xyXG4iLCBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB2cDlfaXJxX2NiKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBpcnEpCit7CisJc3RydWN0IFZQOURlY29kZXJfcyAqcGJpID0KKwkJKHN0cnVjdCBWUDlEZWNvZGVyX3MgKil2ZGVjLT5wcml2YXRlOworCXJldHVybiB2dnA5X2lzcigwLCBwYmkpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgdnA5X3RocmVhZGVkX2lycV9jYihzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgaXJxKQoreworCXN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSA9CisJCShzdHJ1Y3QgVlA5RGVjb2Rlcl9zICopdmRlYy0+cHJpdmF0ZTsKKwlyZXR1cm4gdnZwOV9pc3JfdGhyZWFkX2ZuKDAsIHBiaSk7Cit9CisKK3N0YXRpYyB2b2lkIHZwOV9kdW1wX3N0YXRlKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IFZQOURlY29kZXJfcyAqcGJpID0KKwkJKHN0cnVjdCBWUDlEZWNvZGVyX3MgKil2ZGVjLT5wcml2YXRlOworCXN0cnVjdCBWUDlfQ29tbW9uX3MgKmNvbnN0IGNtID0gJnBiaS0+Y29tbW9uOworCWludCBpOworCXZwOV9wcmludChwYmksIDAsICI9PT09PT0gJXNcbiIsIF9fZnVuY19fKTsKKworCXZwOV9wcmludChwYmksIDAsCisJCSJ3aWR0aC9oZWlnaHQgKCVkLyVkKSwgdXNlZF9idWZfbnVtICVkIHZpZGVvX3NpZ25hbF90eXBlIDB4JXhcbiIsCisJCWNtLT53aWR0aCwKKwkJY20tPmhlaWdodCwKKwkJcGJpLT51c2VkX2J1Zl9udW0sCisJCXBiaS0+dmlkZW9fc2lnbmFsX3R5cGUKKwkJKTsKKworCXZwOV9wcmludChwYmksIDAsCisJCSJpc19mcmFtZWJhc2UoJWQpLCBlb3MgJWQsIGRlY19yZXN1bHQgMHgleCBkZWNfZnJtICVkIGRpc3BfZnJtICVkIHJ1biAlZCBub3RfcnVuX3JlYWR5ICVkIGlucHV0X2VtcHR5ICVkIGxvd19sYXRlbmN5ICVkIG5vX2hlYWQgJWQgXG4iLAorCQlpbnB1dF9mcmFtZV9iYXNlZCh2ZGVjKSwKKwkJcGJpLT5lb3MsCisJCXBiaS0+ZGVjX3Jlc3VsdCwKKwkJZGVjb2RlX2ZyYW1lX2NvdW50W3BiaS0+aW5kZXhdLAorCQlkaXNwbGF5X2ZyYW1lX2NvdW50W3BiaS0+aW5kZXhdLAorCQlydW5fY291bnRbcGJpLT5pbmRleF0sCisJCW5vdF9ydW5fcmVhZHlbcGJpLT5pbmRleF0sCisJCWlucHV0X2VtcHR5W3BiaS0+aW5kZXhdLAorCQlwYmktPmxvd19sYXRlbmN5X2ZsYWcsCisJCXBiaS0+bm9faGVhZAorCQkpOworCisJaWYgKCFwYmktPmlzX3VzZWRfdjRsICYmIHZmX2dldF9yZWNlaXZlcih2ZGVjLT52Zl9wcm92aWRlcl9uYW1lKSkgeworCQllbnVtIHJlY2V2aXZlcl9zdGFydF9lIHN0YXRlID0KKwkJdmZfbm90aWZ5X3JlY2VpdmVyKHZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfUVVSRVlfU1RBVEUsCisJCQlOVUxMKTsKKwkJdnA5X3ByaW50KHBiaSwgMCwKKwkJCSJcbnJlY2VpdmVyKCVzKSBzdGF0ZSAlZFxuIiwKKwkJCXZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQlzdGF0ZSk7CisJfQorCisJdnA5X3ByaW50KHBiaSwgMCwKKwkiJXMsIG5ld3EoJWQvJWQpLCBkaXNwcSglZC8lZCksIHZmIHByZXBhcmUvZ2V0L3B1dCAoJWQvJWQvJWQpLCBmcmVlX2J1Zl9jb3VudCAlZCAobWluICVkIGZvciBydW5fcmVhZHkpXG4iLAorCV9fZnVuY19fLAorCWtmaWZvX2xlbigmcGJpLT5uZXdmcmFtZV9xKSwKKwlWRl9QT09MX1NJWkUsCisJa2ZpZm9fbGVuKCZwYmktPmRpc3BsYXlfcSksCisJVkZfUE9PTF9TSVpFLAorCXBiaS0+dmZfcHJlX2NvdW50LAorCXBiaS0+dmZfZ2V0X2NvdW50LAorCXBiaS0+dmZfcHV0X2NvdW50LAorCWdldF9mcmVlX2J1Zl9jb3VudChwYmkpLAorCXBiaS0+cnVuX3JlYWR5X21pbl9idWZfbnVtCisJKTsKKworCWR1bXBfcGljX2xpc3QocGJpKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQlVGX05VTTsgaSsrKSB7CisJCXZwOV9wcmludChwYmksIDAsCisJCQkibXZfQnVmKCVkKSBzdGFydF9hZHIgMHgleCBzaXplIDB4JXggdXNlZCAlZFxuIiwKKwkJCWksCisJCQlwYmktPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciwKKwkJCXBiaS0+bV9tdl9CVUZbaV0uc2l6ZSwKKwkJCXBiaS0+bV9tdl9CVUZbaV0udXNlZF9mbGFnKTsKKwl9CisKKwl2cDlfcHJpbnQocGJpLCAwLAorCQkiSEVWQ19ERUNfU1RBVFVTX1JFRz0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRykpOworCXZwOV9wcmludChwYmksIDAsCisJCSJIRVZDX01QQ19FPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX01QQ19FKSk7CisJdnA5X3ByaW50KHBiaSwgMCwKKwkJIkRFQ09ERV9NT0RFPTB4JXhcbiIsCisJCVJFQURfVlJFRyhERUNPREVfTU9ERSkpOworCXZwOV9wcmludChwYmksIDAsCisJCSJOQUxfU0VBUkNIX0NUTD0weCV4XG4iLAorCQlSRUFEX1ZSRUcoTkFMX1NFQVJDSF9DVEwpKTsKKwl2cDlfcHJpbnQocGJpLCAwLAorCQkiSEVWQ19QQVJTRVJfTENVX1NUQVJUPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX1BBUlNFUl9MQ1VfU1RBUlQpKTsKKwl2cDlfcHJpbnQocGJpLCAwLAorCQkiSEVWQ19ERUNPREVfU0laRT0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19ERUNPREVfU0laRSkpOworCXZwOV9wcmludChwYmksIDAsCisJCSJIRVZDX1NISUZUX0JZVEVfQ09VTlQ9MHgleFxuIiwKKwkJUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCkpOworCXZwOV9wcmludChwYmksIDAsCisJCSJIRVZDX1NUUkVBTV9TVEFSVF9BRERSPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9TVEFSVF9BRERSKSk7CisJdnA5X3ByaW50KHBiaSwgMCwKKwkJIkhFVkNfU1RSRUFNX0VORF9BRERSPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9FTkRfQUREUikpOworCXZwOV9wcmludChwYmksIDAsCisJCSJIRVZDX1NUUkVBTV9MRVZFTD0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fTEVWRUwpKTsKKwl2cDlfcHJpbnQocGJpLCAwLAorCQkiSEVWQ19TVFJFQU1fV1JfUFRSPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9XUl9QVFIpKTsKKwl2cDlfcHJpbnQocGJpLCAwLAorCQkiSEVWQ19TVFJFQU1fUkRfUFRSPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIpKTsKKwl2cDlfcHJpbnQocGJpLCAwLAorCQkiUEFSU0VSX1ZJREVPX1JQPTB4JXhcbiIsCisJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF9ycCkpOworCXZwOV9wcmludChwYmksIDAsCisJCSJQQVJTRVJfVklERU9fV1A9MHgleFxuIiwKKwkJU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3dwKSk7CisKKwlpZiAoaW5wdXRfZnJhbWVfYmFzZWQodmRlYykgJiYKKwkJKGRlYnVnICYgUFJJTlRfRkxBR19WREVDX0RBVEEpCisJCSkgeworCQlpbnQgamo7CisJCWlmIChwYmktPmNodW5rICYmIHBiaS0+Y2h1bmstPmJsb2NrICYmCisJCQlwYmktPmNodW5rLT5zaXplID4gMCkgeworCQkJdTggKmRhdGEgPSBOVUxMOworCisJCQlpZiAoIXBiaS0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQkJZGF0YSA9IGNvZGVjX21tX3ZtYXAoCisJCQkJCXBiaS0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQkJCXBiaS0+Y2h1bmstPm9mZnNldCwKKwkJCQkJcGJpLT5jaHVuay0+c2l6ZSk7CisJCQllbHNlCisJCQkJZGF0YSA9ICgodTggKilwYmktPmNodW5rLT5ibG9jay0+c3RhcnRfdmlydCkKKwkJCQkJKyBwYmktPmNodW5rLT5vZmZzZXQ7CisJCQl2cDlfcHJpbnQocGJpLCAwLAorCQkJCSJmcmFtZSBkYXRhIHNpemUgMHgleFxuIiwKKwkJCQlwYmktPmNodW5rLT5zaXplKTsKKwkJCWZvciAoamogPSAwOyBqaiA8IHBiaS0+Y2h1bmstPnNpemU7IGpqKyspIHsKKwkJCQlpZiAoKGpqICYgMHhmKSA9PSAwKQorCQkJCQl2cDlfcHJpbnQocGJpLCAwLAorCQkJCQkJIiUwNng6IiwgamopOworCQkJCXZwOV9wcmludF9jb250KHBiaSwgMCwKKwkJCQkJIiUwMnggIiwgZGF0YVtqal0pOworCQkJCWlmICgoKGpqICsgMSkgJiAweGYpID09IDApCisJCQkJCXZwOV9wcmludF9jb250KHBiaSwgMCwKKwkJCQkJCSJcbiIpOworCQkJfQorCisJCQlpZiAoIXBiaS0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcihkYXRhKTsKKwkJfQorCX0KKworfQorCitzdGF0aWMgaW50IGFtbXZkZWNfdnA5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHZkZWNfcyAqcGRhdGEgPSAqKHN0cnVjdCB2ZGVjX3MgKiopcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaW50IHJldDsKKwlpbnQgY29uZmlnX3ZhbDsKKwlpbnQgdHJhbnNmZXJfdmFsOworCXN0cnVjdCB2ZnJhbWVfY29udGVudF9saWdodF9sZXZlbF9zIGNvbnRlbnRfbGlnaHRfbGV2ZWw7CisJc3RydWN0IHZmcmFtZV9tYXN0ZXJfZGlzcGxheV9jb2xvdXJfcyB2Zl9kcDsKKwlzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkgPSBOVUxMOworCWludCBpOworCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA8IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWEwgfHwKKwkJZ2V0X2NwdV9tYWpvcl9pZCgpID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UWEwgfHwKKwkJZ2V0X2NwdV9tYWpvcl9pZCgpID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNSkgeworCQlwcl9pbmZvKCJ2cDkgdW5zdXBwb3J0ZWQgb24gY3B1IDB4JXhcbiIsIGdldF9jcHVfbWFqb3JfaWQoKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKworCWlmIChwZGF0YSA9PSBOVUxMKSB7CisJCXByX2luZm8oIlxuYW1tdmRlY192cDkgbWVtb3J5IHJlc291cmNlIHVuZGVmaW5lZC5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJLypwYmkgPSAoc3RydWN0IFZQOURlY29kZXJfcyAqKWRldm1fa3phbGxvYygmcGRldi0+ZGV2LAorCQlzaXplb2Yoc3RydWN0IFZQOURlY29kZXJfcyksIEdGUF9LRVJORUwpOyovCisJbWVtc2V0KCZ2Zl9kcCwgMCwgc2l6ZW9mKHN0cnVjdCB2ZnJhbWVfbWFzdGVyX2Rpc3BsYXlfY29sb3VyX3MpKTsKKwlwYmkgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgVlA5RGVjb2Rlcl9zKSk7CisJaWYgKHBiaSA9PSBOVUxMKSB7CisJCXByX2luZm8oIlxuYW1tdmRlY192cDkgZGV2aWNlIGRhdGEgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KHBiaSwgMCwgc2l6ZW9mKHN0cnVjdCBWUDlEZWNvZGVyX3MpKTsKKworCS8qIHRoZSBjdHggZnJvbSB2NGwyIGRyaXZlci4gKi8KKwlwYmktPnY0bDJfY3R4ID0gcGRhdGEtPnByaXZhdGU7CisKKwlwZGF0YS0+cHJpdmF0ZSA9IHBiaTsKKwlwZGF0YS0+ZGVjX3N0YXR1cyA9IHZ2cDlfZGVjX3N0YXR1czsKKwkvKiBwZGF0YS0+c2V0X3RyaWNrbW9kZSA9IHNldF90cmlja21vZGU7ICovCisJcGRhdGEtPnJ1bl9yZWFkeSA9IHJ1bl9yZWFkeTsKKwlwZGF0YS0+cnVuID0gcnVuOworCXBkYXRhLT5yZXNldCA9IHJlc2V0OworCXBkYXRhLT5pcnFfaGFuZGxlciA9IHZwOV9pcnFfY2I7CisJcGRhdGEtPnRocmVhZGVkX2lycV9oYW5kbGVyID0gdnA5X3RocmVhZGVkX2lycV9jYjsKKwlwZGF0YS0+ZHVtcF9zdGF0ZSA9IHZwOV9kdW1wX3N0YXRlOworCisJcGJpLT5pbmRleCA9IHBkZXYtPmlkOworCisJaWYgKGlzX3JkbWFfZW5hYmxlKCkpIHsKKwkJcGJpLT5yZG1hX2FkciA9IGRtYV9hbGxvY19jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksIFJETUFfU0laRSwgJnBiaS0+cmRtYV9waHlfYWRyLCBHRlBfS0VSTkVMKTsKKwkJZm9yIChpID0gMDsgaSA8IFNDQUxFTFVUX0RBVEFfV1JJVEVfTlVNOyBpKyspIHsKKwkJCXBiaS0+cmRtYV9hZHJbaSAqIDRdID0gSEVWQ19JUUlUX1NDQUxFTFVUX1dSX0FERFIgJiAweGZmZjsKKwkJCXBiaS0+cmRtYV9hZHJbaSAqIDQgKyAxXSA9IGk7CisJCQlwYmktPnJkbWFfYWRyW2kgKiA0ICsgMl0gPSBIRVZDX0lRSVRfU0NBTEVMVVRfREFUQSAmIDB4ZmZmOworCQkJcGJpLT5yZG1hX2FkcltpICogNCArIDNdID0gMDsKKwkJCWlmIChpID09IFNDQUxFTFVUX0RBVEFfV1JJVEVfTlVNIC0gMSkgeworCQkJCXBiaS0+cmRtYV9hZHJbaSAqIDQgKyAyXSA9IChIRVZDX0lRSVRfU0NBTEVMVVRfREFUQSAmIDB4ZmZmKSB8IDB4MjAwMDA7CisJCQl9CisJCX0KKwl9CisKKwlzbnByaW50ZihwYmktPnRyYWNlLnZkZWNfbmFtZSwgc2l6ZW9mKHBiaS0+dHJhY2UudmRlY19uYW1lKSwKKwkJInZwOS0lZCIsIHBiaS0+aW5kZXgpOworCXNucHJpbnRmKHBiaS0+dHJhY2UucHRzX25hbWUsIHNpemVvZihwYmktPnRyYWNlLnB0c19uYW1lKSwKKwkJIiVzLXB0cyIsIHBiaS0+dHJhY2UudmRlY19uYW1lKTsKKwlzbnByaW50ZihwYmktPnRyYWNlLm5ld19xX25hbWUsIHNpemVvZihwYmktPnRyYWNlLm5ld19xX25hbWUpLAorCQkiJXMtbmV3ZnJhbWVfcSIsIHBiaS0+dHJhY2UudmRlY19uYW1lKTsKKwlzbnByaW50ZihwYmktPnRyYWNlLmRpc3BfcV9uYW1lLCBzaXplb2YocGJpLT50cmFjZS5kaXNwX3FfbmFtZSksCisJCSIlcy1kaXNwZnJhbWVfcSIsIHBiaS0+dHJhY2UudmRlY19uYW1lKTsKKwlzbnByaW50ZihwYmktPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIHNpemVvZihwYmktPnRyYWNlLmRlY29kZV90aW1lX25hbWUpLAorCQkiZGVjb2Rlcl90aW1lJWQiLCBwZGV2LT5pZCk7CisJc25wcmludGYocGJpLT50cmFjZS5kZWNvZGVfcnVuX3RpbWVfbmFtZSwgc2l6ZW9mKHBiaS0+dHJhY2UuZGVjb2RlX3J1bl90aW1lX25hbWUpLAorCQkiZGVjb2Rlcl9ydW5fdGltZSVkIiwgcGRldi0+aWQpOworCXNucHJpbnRmKHBiaS0+dHJhY2UuZGVjb2RlX2hlYWRlcl9tZW1vcnlfdGltZV9uYW1lLCBzaXplb2YocGJpLT50cmFjZS5kZWNvZGVfaGVhZGVyX21lbW9yeV90aW1lX25hbWUpLAorCQkJImRlY29kZXJfaGVhZGVyX3RpbWUlZCIsIHBkZXYtPmlkKTsKKworCWlmIChwZGF0YS0+dXNlX3ZmbV9wYXRoKQorCQlzbnByaW50ZihwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwgVkRFQ19QUk9WSURFUl9OQU1FX1NJWkUsCisJCQlWRk1fREVDX1BST1ZJREVSX05BTUUpOworCWVsc2UKKwkJc25wcmludGYocGRhdGEtPnZmX3Byb3ZpZGVyX25hbWUsIFZERUNfUFJPVklERVJfTkFNRV9TSVpFLAorCQkJTVVMVElfSU5TVEFOQ0VfUFJPVklERVJfTkFNRSAiLiUwMngiLCBwZGV2LT5pZCAmIDB4ZmYpOworCisJcGJpLT5wcm92aWRlcl9uYW1lID0gcGRhdGEtPnZmX3Byb3ZpZGVyX25hbWU7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGRhdGEpOworCisJcGJpLT5wbGF0Zm9ybV9kZXYgPSBwZGV2OworCXBiaS0+dmlkZW9fc2lnbmFsX3R5cGUgPSAwOworCXBiaS0+bV9pbnNfZmxhZyA9IDE7CisJaWYgKCF2ZGVjX2lzX3N1cHBvcnRfNGsoKSkgeworCQlwYmktPm1heF9waWNfdyA9IDE5MjA7CisJCXBiaS0+bWF4X3BpY19oID0gMTA4ODsKKwl9IGVsc2UgaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA8IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpIHsKKwkJcGJpLT5tYXhfcGljX3cgPSA0MDk2OworCQlwYmktPm1heF9waWNfaCA9IDIzMDQ7CisJfSBlbHNlIHsKKwkJcGJpLT5tYXhfcGljX3cgPSA4MTkyOworCQlwYmktPm1heF9waWNfaCA9IDQ2MDg7CisJfQorCisJaWYgKChkZWJ1ZyAmIElHTk9SRV9QQVJBTV9GUk9NX0NPTkZJRykgPT0gMCAmJgorCQkJcGRhdGEtPmNvbmZpZ19sZW4pIHsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCWludCB2cDlfYnVmX3dpZHRoID0gMDsKKwkJaW50IHZwOV9idWZfaGVpZ2h0ID0gMDsKKwkJLyp1c2UgcHRyIGNvbmZpZyBmb3IgZG91YmVsX3dyaXRlX21vZGUsIGV0YyovCisJCXZwOV9wcmludChwYmksIDAsICJwZGF0YS0+Y29uZmlnPSVzXG4iLCBwZGF0YS0+Y29uZmlnKTsKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJ2cDlfZG91YmxlX3dyaXRlX21vZGUiLAorCQkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJcGJpLT5kb3VibGVfd3JpdGVfbW9kZSA9IGNvbmZpZ192YWw7CisJCWVsc2UKKwkJCXBiaS0+ZG91YmxlX3dyaXRlX21vZGUgPSBkb3VibGVfd3JpdGVfbW9kZTsKKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgInNhdmVfYnVmZmVyX21vZGUiLAorCQkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJcGJpLT5zYXZlX2J1ZmZlcl9tb2RlID0gY29uZmlnX3ZhbDsKKwkJZWxzZQorCQkJcGJpLT5zYXZlX2J1ZmZlcl9tb2RlID0gMDsKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJ2cDlfYnVmX3dpZHRoIiwKKwkJCQkmY29uZmlnX3ZhbCkgPT0gMCkgeworCQkJdnA5X2J1Zl93aWR0aCA9IGNvbmZpZ192YWw7CisJCX0KKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJ2cDlfYnVmX2hlaWdodCIsCisJCQkJJmNvbmZpZ192YWwpID09IDApIHsKKwkJCXZwOV9idWZfaGVpZ2h0ID0gY29uZmlnX3ZhbDsKKwkJfQorCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAibm9faGVhZCIsCisJCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlwYmktPm5vX2hlYWQgPSBjb25maWdfdmFsOworCQllbHNlCisJCQlwYmktPm5vX2hlYWQgPSBub19oZWFkOworCisJCS8qdXNlIHB0ciBjb25maWcgZm9yIG1heF9waWNfdywgZXRjKi8KKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJ2cDlfbWF4X3BpY193IiwKKwkJCQkmY29uZmlnX3ZhbCkgPT0gMCkgeworCQkJCXBiaS0+bWF4X3BpY193ID0gY29uZmlnX3ZhbDsKKwkJfQorCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgInZwOV9tYXhfcGljX2giLAorCQkJCSZjb25maWdfdmFsKSA9PSAwKSB7CisJCQkJcGJpLT5tYXhfcGljX2ggPSBjb25maWdfdmFsOworCQl9CisKKwkJaWYgKChwYmktPm1heF9waWNfdyAqIHBiaS0+bWF4X3BpY19oKQorCQkJPCAodnA5X2J1Zl93aWR0aCAqIHZwOV9idWZfaGVpZ2h0KSkgeworCQkJcGJpLT5tYXhfcGljX3cgPSB2cDlfYnVmX3dpZHRoOworCQkJcGJpLT5tYXhfcGljX2ggPSB2cDlfYnVmX2hlaWdodDsKKwkJCXZwOV9wcmludChwYmksIDAsICJ1c2UgYnVmIHJlc29sdXRpb25cbiIpOworCQl9CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJzaWRlYmluZF90eXBlIiwKKwkJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCXBiaS0+c2lkZWJpbmRfdHlwZSA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJzaWRlYmluZF9jaGFubmVsX2lkIiwKKwkJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCXBiaS0+c2lkZWJpbmRfY2hhbm5lbF9pZCA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV92NGxfY29kZWNfZW5hYmxlIiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJcGJpLT5pc191c2VkX3Y0bCA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV92NGxfYnVmZmVyX21hcmdpbiIsCisJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCXBiaS0+ZHluYW1pY19idWZfbnVtX21hcmdpbiA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV92NGxfY2FudmFzX21lbV9tb2RlIiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJcGJpLT5tZW1fbWFwX21vZGUgPSBjb25maWdfdmFsOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLAorCQkJInBhcm1fZW5hYmxlX2ZlbmNlIiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJcGJpLT5lbmFibGVfZmVuY2UgPSBjb25maWdfdmFsOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLAorCQkJInBhcm1fZmVuY2VfdXNhZ2UiLAorCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlwYmktPmZlbmNlX3VzYWdlID0gY29uZmlnX3ZhbDsKKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywKKwkJCSJwYXJtX3Y0bF9sb3dfbGF0ZW5jeV9tb2RlIiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJcGJpLT5sb3dfbGF0ZW5jeV9mbGFnID0gY29uZmlnX3ZhbDsKKyNlbmRpZgorCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIkhEUlN0YXRpY0luZm8iLAorCQkJCSZ2Zl9kcC5wcmVzZW50X2ZsYWcpID09IDAKKwkJCQkmJiB2Zl9kcC5wcmVzZW50X2ZsYWcgPT0gMSkgeworCQkJZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgInNpZ25hbF90eXBlIiwKKwkJCQkJJnBiaS0+dmlkZW9fc2lnbmFsX3R5cGUpOworCQkJZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm1HLngiLAorCQkJCQkmdmZfZHAucHJpbWFyaWVzWzBdWzBdKTsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtRy55IiwKKwkJCQkJJnZmX2RwLnByaW1hcmllc1swXVsxXSk7CisJCQlnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAibUIueCIsCisJCQkJCSZ2Zl9kcC5wcmltYXJpZXNbMV1bMF0pOworCQkJZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm1CLnkiLAorCQkJCQkmdmZfZHAucHJpbWFyaWVzWzFdWzFdKTsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtUi54IiwKKwkJCQkJJnZmX2RwLnByaW1hcmllc1syXVswXSk7CisJCQlnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAibVIueSIsCisJCQkJCSZ2Zl9kcC5wcmltYXJpZXNbMl1bMV0pOworCQkJZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm1XLngiLAorCQkJCQkmdmZfZHAud2hpdGVfcG9pbnRbMF0pOworCQkJZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm1XLnkiLAorCQkJCQkmdmZfZHAud2hpdGVfcG9pbnRbMV0pOworCQkJZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm1NYXhETCIsCisJCQkJCSZ2Zl9kcC5sdW1pbmFuY2VbMF0pOworCQkJZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm1NaW5ETCIsCisJCQkJCSZ2Zl9kcC5sdW1pbmFuY2VbMV0pOworCQkJdmZfZHAuY29udGVudF9saWdodF9sZXZlbC5wcmVzZW50X2ZsYWcgPSAxOworCQkJZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm1NYXhDTEwiLAorCQkJCQkmY29udGVudF9saWdodF9sZXZlbC5tYXhfY29udGVudCk7CisJCQlnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAibU1heEZBTEwiLAorCQkJCQkmY29udGVudF9saWdodF9sZXZlbC5tYXhfcGljX2F2ZXJhZ2UpOworCisJCQlnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAibVRyYW5zZmVyIiwKKwkJCQkJJnRyYW5zZmVyX3ZhbCk7CisKKwkJCWlmICh0cmFuc2Zlcl92YWwgPT0gMCkKKwkJCQl0cmFuc2Zlcl92YWwgPSAxNjsKKworCQkJdnA5X3ByaW50KHBiaSwgMCwgInRyYW5zZmVyX3ZhbD0lZFxuIix0cmFuc2Zlcl92YWwpOworCisJCQl2Zl9kcC5jb250ZW50X2xpZ2h0X2xldmVsID0gY29udGVudF9saWdodF9sZXZlbDsKKwkJCWlmICghcGJpLT52aWRlb19zaWduYWxfdHlwZSkgeworCQkJCXBiaS0+dmlkZW9fc2lnbmFsX3R5cGUgPSAoMSA8PCAyOSkKKwkJCQkJfCAoNSA8PCAyNikJLyogdW5zcGVjaWZpZWQgKi8KKwkJCQkJfCAoMCA8PCAyNSkJLyogbGltaXQgKi8KKwkJCQkJfCAoMSA8PCAyNCkJLyogY29sb3IgYXZhaWxhYmxlICovCisJCQkJCXwgKDkgPDwgMTYpCS8qIDIwMjAgKi8KKwkJCQkJfCAodHJhbnNmZXJfdmFsIDw8IDgpCS8qIDIwODQgKi8KKwkJCQkJfCAoOSA8PCAwKTsJLyogMjAyMCAqLworCQkJfQorCQl9CisJCXBiaS0+dmZfZHAgPSB2Zl9kcDsKKwl9IGVsc2UgeworCQlpZiAocGRhdGEtPnN5c19pbmZvKSB7CisJCQlwYmktPnZ2cDlfYW1zdHJlYW1fZGVjX2luZm8gPSAqcGRhdGEtPnN5c19pbmZvOworCQkJaWYgKChwYmktPnZ2cDlfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGggIT0gMCkgJiYKKwkJCQkocGJpLT52dnA5X2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodCAhPSAwKSkgeworCQkJCXBiaS0+bWF4X3BpY193ID0gcGJpLT52dnA5X2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoOworCQkJCXBiaS0+bWF4X3BpY19oID0gcGJpLT52dnA5X2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodDsKKwkJCX0KKwkJfQorCQkvKnBiaS0+dnZwOV9hbXN0cmVhbV9kZWNfaW5mby53aWR0aCA9IDA7CisJCXBiaS0+dnZwOV9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQgPSAwOworCQlwYmktPnZ2cDlfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSA9IDMwOyovCisJCXBiaS0+ZG91YmxlX3dyaXRlX21vZGUgPSBkb3VibGVfd3JpdGVfbW9kZTsKKwl9CisKKwlpZiAoIXBiaS0+aXNfdXNlZF92NGwpIHsKKwkJdmZfcHJvdmlkZXJfaW5pdCgmcGRhdGEtPnZmcmFtZV9wcm92aWRlciwgcGRhdGEtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQkmdnZwOV92Zl9wcm92aWRlciwgcGJpKTsKKwl9CisKKwlpZiAobm9faGVhZCAmIDB4MTApIHsKKwkJcGJpLT5ub19oZWFkID0gKG5vX2hlYWQgJiAweGYpOworCX0KKworCXBiaS0+ZW5kaWFuID0gSEVWQ19DT05GSUdfTElUVExFX0VORElBTjsKKwlpZiAoIXBiaS0+aXNfdXNlZF92NGwpIHsKKwkJcGJpLT5tZW1fbWFwX21vZGUgPSBtZW1fbWFwX21vZGU7CisJCWlmIChpc19zdXBwb3J0X3ZkZWNfY2FudmFzKCkpCisJCQlwYmktPmVuZGlhbiA9IEhFVkNfQ09ORklHX0JJR19FTkRJQU47CisJfQorCWlmIChlbmRpYW4pCisJCXBiaS0+ZW5kaWFuID0gZW5kaWFuOworCisJaWYgKHBiaS0+aXNfdXNlZF92NGwpCisJCXBiaS0+cnVuX3JlYWR5X21pbl9idWZfbnVtID0gcnVuX3JlYWR5X21pbl9idWZfbnVtIC0gMSA7CisJZWxzZQorCQlwYmktPnJ1bl9yZWFkeV9taW5fYnVmX251bSA9IHJ1bl9yZWFkeV9taW5fYnVmX251bTsKKworCWlmIChpc19vdmVyc2l6ZShwYmktPm1heF9waWNfdywgcGJpLT5tYXhfcGljX2gpKSB7CisJCXByX2Vycigib3ZlciBzaXplOiAlZHglZCwgcHJvYmUgZmFpbGVkXG4iLAorCQkJcGJpLT5tYXhfcGljX3csIHBiaS0+bWF4X3BpY19oKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChmb3JjZV9jb25maWdfZmVuY2UpIHsKKwkJcGJpLT5lbmFibGVfZmVuY2UgPSB0cnVlOworCQlwYmktPmZlbmNlX3VzYWdlID0KKwkJCShmb3JjZV9jb25maWdfZmVuY2UgPj4gNCkgJiAweGY7CisJCWlmIChmb3JjZV9jb25maWdfZmVuY2UgJiAweDIpCisJCQlwYmktPmVuYWJsZV9mZW5jZSA9IGZhbHNlOworCQl2cDlfcHJpbnQocGJpLCAwLCAiZW5hYmxlIGZlbmNlOiAlZCwgZmVuY2UgdXNhZ2U6ICVkXG4iLAorCQkJcGJpLT5lbmFibGVfZmVuY2UsIHBiaS0+ZmVuY2VfdXNhZ2UpOworCX0KKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPCBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hMIHx8CisJCXBiaS0+ZG91YmxlX3dyaXRlX21vZGUgPT0gMHgxMCkKKwkJcGJpLT5tbXVfZW5hYmxlID0gMDsKKwllbHNlCisJCXBiaS0+bW11X2VuYWJsZSA9IDE7CisKKyNpZmRlZiBWUDlfMTBCX01NVV9EVworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1RCkgeworCQlwYmktPmR3X21tdV9lbmFibGUgPQorCQkJKGdldF9kb3VibGVfd3JpdGVfbW9kZShwYmkpICYgMHgyMCkgPyAxIDogMDsKKwl9IGVsc2UgeworCQlwYmktPmR3X21tdV9lbmFibGUgPSAwOworCX0KKyNlbmRpZgorCXZpZGVvX3NpZ25hbF90eXBlID0gcGJpLT52aWRlb19zaWduYWxfdHlwZTsKKworCWlmIChwZGF0YS0+c3lzX2luZm8pIHsKKwkJcGJpLT52dnA5X2Ftc3RyZWFtX2RlY19pbmZvID0gKnBkYXRhLT5zeXNfaW5mbzsKKwl9IGVsc2UgeworCQlwYmktPnZ2cDlfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGggPSAwOworCQlwYmktPnZ2cDlfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0ID0gMDsKKwkJcGJpLT52dnA5X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgPSAzMDsKKwl9CisKKwlwYmktPmxvd19sYXRlbmN5X2ZsYWcgPSAxOworCXZwOV9wcmludChwYmksIDAsCisJCQkibm9faGVhZCAlZCAgbG93X2xhdGVuY3kgJWQsIHNpZ25hbF90eXBlIDB4JXhcbiIsCisJCQlwYmktPm5vX2hlYWQsIHBiaS0+bG93X2xhdGVuY3lfZmxhZywgcGJpLT52aWRlb19zaWduYWxfdHlwZSk7CisjaWYgMAorCXBiaS0+YnVmX3N0YXJ0ID0gcGRhdGEtPm1lbV9zdGFydDsKKwlwYmktPmJ1Zl9zaXplID0gcGRhdGEtPm1lbV9lbmQgLSBwZGF0YS0+bWVtX3N0YXJ0ICsgMTsKKyNlbHNlCisJaWYgKGFtdmRlY192cDlfbW11X2luaXQocGJpKSA8IDApIHsKKwkJcHJfZXJyKCJ2cDkgYWxsb2MgYm1tdSBib3ggZmFpbGVkISFcbiIpOworCQkvKiBkZXZtX2tmcmVlKCZwZGV2LT5kZXYsICh2b2lkICopcGJpKTsgKi8KKwkJdmZyZWUoKHZvaWQgKilwYmkpOworCQlwZGF0YS0+ZGVjX3N0YXR1cyA9IE5VTEw7CisJCXJldHVybiAtMTsKKwl9CisKKwlwYmktPmNtYV9hbGxvY19jb3VudCA9IFBBR0VfQUxJR04od29ya19idWZfc2l6ZSkgLyBQQUdFX1NJWkU7CisJcmV0ID0gZGVjb2Rlcl9ibW11X2JveF9hbGxvY19idWZfcGh5KHBiaS0+Ym1tdV9ib3gsIFdPUktfU1BBQ0VfQlVGX0lELAorCQkJcGJpLT5jbWFfYWxsb2NfY291bnQgKiBQQUdFX1NJWkUsIERSSVZFUl9OQU1FLAorCQkJJnBiaS0+Y21hX2FsbG9jX2FkZHIpOworCWlmIChyZXQgPCAwKSB7CisJCXVuaW5pdF9tbXVfYnVmZmVycyhwYmkpOworCQkvKiBkZXZtX2tmcmVlKCZwZGV2LT5kZXYsICh2b2lkICopcGJpKTsgKi8KKwkJdmZyZWUoKHZvaWQgKilwYmkpOworCQlwZGF0YS0+ZGVjX3N0YXR1cyA9IE5VTEw7CisJCXJldHVybiByZXQ7CisJfQorCXBiaS0+YnVmX3N0YXJ0ID0gcGJpLT5jbWFfYWxsb2NfYWRkcjsKKwlwYmktPmJ1Zl9zaXplID0gd29ya19idWZfc2l6ZTsKKyNlbmRpZgorCisJcGJpLT5pbml0X2ZsYWcgPSAwOworCXBiaS0+Zmlyc3Rfc2NfY2hlY2tlZCA9IDA7CisJcGJpLT5mYXRhbF9lcnJvciA9IDA7CisJcGJpLT5zaG93X2ZyYW1lX251bSA9IDA7CisKKwlpZiAoZGVidWcpIHsKKwkJcHJfaW5mbygiPT09VlA5IGRlY29kZXIgbWVtIHJlc291cmNlIDB4JWx4IHNpemUgMHgleFxuIiwKKwkJCSAgIHBiaS0+YnVmX3N0YXJ0LAorCQkJICAgcGJpLT5idWZfc2l6ZSk7CisJfQorCisJcGJpLT5jbWFfZGV2ID0gcGRhdGEtPmNtYV9kZXY7CisKKwltdXRleF9pbml0KCZwYmktPmZlbmNlX211dGV4KTsKKworCWlmIChwYmktPmVuYWJsZV9mZW5jZSkgeworCQlwZGF0YS0+c3luYyA9IHZkZWNfc3luY19nZXQoKTsKKwkJaWYgKCFwZGF0YS0+c3luYykgeworCQkJdnA5X3ByaW50KHBiaSwgMCwgImFsbG9jIGZlbmNlIHRpbWVsaW5lIGVycm9yXG4iKTsKKwkJCXZwOV9sb2NhbF91bmluaXQocGJpKTsKKwkJCXVuaW5pdF9tbXVfYnVmZmVycyhwYmkpOworCQkJLyogZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCAodm9pZCAqKXBiaSk7ICovCisJCQl2ZnJlZSgodm9pZCAqKXBiaSk7CisJCQlwZGF0YS0+ZGVjX3N0YXR1cyA9IE5VTEw7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJcGRhdGEtPnN5bmMtPnVzYWdlID0gcGJpLT5mZW5jZV91c2FnZTsKKwkJdmRlY190aW1lbGluZV9jcmVhdGUocGRhdGEtPnN5bmMsIERSSVZFUl9OQU1FKTsKKwl9CisKKwlpZiAodnZwOV9pbml0KHBkYXRhKSA8IDApIHsKKwkJcHJfaW5mbygiXG5hbXZkZWNfdnA5IGluaXQgZmFpbGVkLlxuIik7CisJCXZkZWNfdGltZWxpbmVfcHV0KHBkYXRhLT5zeW5jKTsKKwkJdnA5X2xvY2FsX3VuaW5pdChwYmkpOworCQl1bmluaXRfbW11X2J1ZmZlcnMocGJpKTsKKwkJLyogZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCAodm9pZCAqKXBiaSk7ICovCisJCXZmcmVlKCh2b2lkICopcGJpKTsKKwkJcGRhdGEtPmRlY19zdGF0dXMgPSBOVUxMOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJdmRlY19zZXRfcHJlcGFyZV9sZXZlbChwZGF0YSwgc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCk7CisJaGV2Y19zb3VyY2VfY2hhbmdlZChWRk9STUFUX1ZQOSwKKwkJCTQwOTYsIDIwNDgsIDYwKTsKKyNpZmRlZiBTVVBQT1JUX0ZCX0RFQ09ESU5HCisJaWYgKHBiaS0+dXNlZF9zdGFnZV9idWZfbnVtID4gMCkKKwkJdmRlY19jb3JlX3JlcXVlc3QocGRhdGEsCisJCQlDT1JFX01BU0tfSEVWQ19GUk9OVCB8IENPUkVfTUFTS19IRVZDX0JBQ0spOworCWVsc2UKKwkJdmRlY19jb3JlX3JlcXVlc3QocGRhdGEsIENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQworCQkJfCBDT1JFX01BU0tfSEVWQ19GUk9OVCB8IENPUkVfTUFTS19IRVZDX0JBQ0sKKwkJCQkJfCBDT1JFX01BU0tfQ09NQklORSk7CisjZWxzZQorCWlmIChwZGF0YS0+cGFyYWxsZWxfZGVjID09IDEpCisJCXZkZWNfY29yZV9yZXF1ZXN0KHBkYXRhLCBDT1JFX01BU0tfSEVWQyk7CisJZWxzZQorCQl2ZGVjX2NvcmVfcmVxdWVzdChwZGF0YSwgQ09SRV9NQVNLX1ZERUNfMSB8IENPUkVfTUFTS19IRVZDCisJCQkJCXwgQ09SRV9NQVNLX0NPTUJJTkUpOworI2VuZGlmCisJcGJpLT5waWNfbGlzdF9pbml0X2RvbmUyID0gdHJ1ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtbXZkZWNfdnA5X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSA9IChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICopCisJCSgoKHN0cnVjdCB2ZGVjX3MgKikocGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldikpKS0+cHJpdmF0ZSk7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMocGJpKTsKKwlpbnQgaTsKKwlpZiAoZGVidWcpCisJCXByX2luZm8oImFtdmRlY192cDlfcmVtb3ZlXG4iKTsKKworCXZtdnA5X3N0b3AocGJpKTsKKworI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKKwl2ZGVjX2NvcmVfcmVsZWFzZShod190b192ZGVjKHBiaSksIENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQworCQl8IENPUkVfTUFTS19IRVZDX0ZST05UIHwgQ09SRV9NQVNLX0hFVkNfQkFDSworCQkpOworI2Vsc2UKKwlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpCisJCXZkZWNfY29yZV9yZWxlYXNlKGh3X3RvX3ZkZWMocGJpKSwgQ09SRV9NQVNLX0hFVkMpOworCWVsc2UKKwkJdmRlY19jb3JlX3JlbGVhc2UoaHdfdG9fdmRlYyhwYmkpLCBDT1JFX01BU0tfVkRFQ18xIHwgQ09SRV9NQVNLX0hFVkMpOworI2VuZGlmCisJdmRlY19zZXRfc3RhdHVzKGh3X3RvX3ZkZWMocGJpKSwgVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEKTsKKworCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQlmb3IgKGkgPSAwOyBpIDwgRlJBTUVfQlVGRkVSUzsgaSsrKSB7CisJCQl2ZGVjLT5mcmVlX2NhbnZhc19leAorCQkJCShwYmktPmNvbW1vbi5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmc1tpXS5idWYueV9jYW52YXNfaW5kZXgsCisJCQkJdmRlYy0+aWQpOworCQkJdmRlYy0+ZnJlZV9jYW52YXNfZXgKKwkJCQkocGJpLT5jb21tb24uYnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnNbaV0uYnVmLnV2X2NhbnZhc19pbmRleCwKKwkJCQl2ZGVjLT5pZCk7CisJCX0KKwl9CisKKwlpZiAocGJpLT5lbmFibGVfZmVuY2UpCisJCXZkZWNfZmVuY2VfcmVsZWFzZShwYmksIHZkZWMtPnN5bmMpOworCisjaWZkZWYgREVCVUdfUFRTCisJcHJfaW5mbygicHRzIG1pc3NlZCAlbGQsIHB0cyBoaXQgJWxkLCBkdXJhdGlvbiAlZFxuIiwKKwkJICAgcGJpLT5wdHNfbWlzc2VkLCBwYmktPnB0c19oaXQsIHBiaS0+ZnJhbWVfZHVyKTsKKyNlbmRpZgorCW1lbV9tYXBfbW9kZSA9IDA7CisKKwkvKiBkZXZtX2tmcmVlKCZwZGV2LT5kZXYsICh2b2lkICopcGJpKTsgKi8KKwlpZiAoaXNfcmRtYV9lbmFibGUoKSkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLCBSRE1BX1NJWkUsIHBiaS0+cmRtYV9hZHIsIHBiaS0+cmRtYV9waHlfYWRyKTsKKwl2ZnJlZSgodm9pZCAqKXBiaSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFtbXZkZWNfdnA5X2RyaXZlciA9IHsKKwkucHJvYmUgPSBhbW12ZGVjX3ZwOV9wcm9iZSwKKwkucmVtb3ZlID0gYW1tdmRlY192cDlfcmVtb3ZlLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kID0gYW1oZXZjX3N1c3BlbmQsCisJLnJlc3VtZSA9IGFtaGV2Y19yZXN1bWUsCisjZW5kaWYKKwkuZHJpdmVyID0geworCQkubmFtZSA9IE1VTFRJX0RSSVZFUl9OQU1FLAorCX0KK307CisjZW5kaWYKK3N0YXRpYyBzdHJ1Y3QgbWNvbmZpZyB2cDlfY29uZmlnc1tdID0geworCU1DX1BVMzIoImJpdF9kZXB0aF9sdW1hIiwgJmJpdF9kZXB0aF9sdW1hKSwKKwlNQ19QVTMyKCJiaXRfZGVwdGhfY2hyb21hIiwgJmJpdF9kZXB0aF9jaHJvbWEpLAorCU1DX1BVMzIoImZyYW1lX3dpZHRoIiwgJmZyYW1lX3dpZHRoKSwKKwlNQ19QVTMyKCJmcmFtZV9oZWlnaHQiLCAmZnJhbWVfaGVpZ2h0KSwKKwlNQ19QVTMyKCJkZWJ1ZyIsICZkZWJ1ZyksCisJTUNfUFUzMigicmFkciIsICZyYWRyKSwKKwlNQ19QVTMyKCJydmFsIiwgJnJ2YWwpLAorCU1DX1BVMzIoInBvcF9zaG9ydHMiLCAmcG9wX3Nob3J0cyksCisJTUNfUFUzMigiZGJnX2NtZCIsICZkYmdfY21kKSwKKwlNQ19QVTMyKCJkYmdfc2tpcF9kZWNvZGVfaW5kZXgiLCAmZGJnX3NraXBfZGVjb2RlX2luZGV4KSwKKwlNQ19QVTMyKCJlbmRpYW4iLCAmZW5kaWFuKSwKKwlNQ19QVTMyKCJzdGVwIiwgJnN0ZXApLAorCU1DX1BVMzIoInVkZWJ1Z19mbGFnIiwgJnVkZWJ1Z19mbGFnKSwKKwlNQ19QVTMyKCJkZWNvZGVfcGljX2JlZ2luIiwgJmRlY29kZV9waWNfYmVnaW4pLAorCU1DX1BVMzIoInNsaWNlX3BhcnNlX2JlZ2luIiwgJnNsaWNlX3BhcnNlX2JlZ2luKSwKKwlNQ19QVTMyKCJpX29ubHlfZmxhZyIsICZpX29ubHlfZmxhZyksCisJTUNfUFUzMigiZXJyb3JfaGFuZGxlX3BvbGljeSIsICZlcnJvcl9oYW5kbGVfcG9saWN5KSwKKwlNQ19QVTMyKCJidWZfYWxsb2NfZGVwdGgiLCAmYnVmX2FsbG9jX2RlcHRoKSwKKwlNQ19QVTMyKCJidWZfYWxsb2Nfc2l6ZSIsICZidWZfYWxsb2Nfc2l6ZSksCisJTUNfUFUzMigiYnVmZmVyX21vZGUiLCAmYnVmZmVyX21vZGUpLAorCU1DX1BVMzIoImJ1ZmZlcl9tb2RlX2RiZyIsICZidWZmZXJfbW9kZV9kYmcpLAorCU1DX1BVMzIoIm1heF9idWZfbnVtIiwgJm1heF9idWZfbnVtKSwKKwlNQ19QVTMyKCJkeW5hbWljX2J1Zl9udW1fbWFyZ2luIiwgJmR5bmFtaWNfYnVmX251bV9tYXJnaW4pLAorCU1DX1BVMzIoIm1lbV9tYXBfbW9kZSIsICZtZW1fbWFwX21vZGUpLAorCU1DX1BVMzIoImRvdWJsZV93cml0ZV9tb2RlIiwgJmRvdWJsZV93cml0ZV9tb2RlKSwKKwlNQ19QVTMyKCJlbmFibGVfbWVtX3NhdmluZyIsICZlbmFibGVfbWVtX3NhdmluZyksCisJTUNfUFUzMigiZm9yY2Vfd19oIiwgJmZvcmNlX3dfaCksCisJTUNfUFUzMigiZm9yY2VfZnBzIiwgJmZvcmNlX2ZwcyksCisJTUNfUFUzMigibWF4X2RlY29kaW5nX3RpbWUiLCAmbWF4X2RlY29kaW5nX3RpbWUpLAorCU1DX1BVMzIoIm9uX25vX2tleWZyYW1lX3NraXBlZCIsICZvbl9ub19rZXlmcmFtZV9za2lwZWQpLAorCU1DX1BVMzIoInN0YXJ0X2RlY29kZV9idWZfbGV2ZWwiLCAmc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCksCisJTUNfUFUzMigiZGVjb2RlX3RpbWVvdXRfdmFsIiwgJmRlY29kZV90aW1lb3V0X3ZhbCksCisJTUNfUFUzMigidnA5X21heF9waWNfdyIsICZ2cDlfbWF4X3BpY193KSwKKwlNQ19QVTMyKCJ2cDlfbWF4X3BpY19oIiwgJnZwOV9tYXhfcGljX2gpLAorfTsKK3N0YXRpYyBzdHJ1Y3QgbWNvbmZpZ19ub2RlIHZwOV9ub2RlOworCitzdGF0aWMgaW50IF9faW5pdCBhbXZkZWNfdnA5X2RyaXZlcl9pbml0X21vZHVsZSh2b2lkKQoreworCisJc3RydWN0IEJ1ZmZJbmZvX3MgKnBfYnVmX2luZm87CisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDw9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UTTIgJiYgIWlzX2NwdV90bTJfcmV2YigpKSB7CisJCWlmICh2ZGVjX2lzX3N1cHBvcnRfNGsoKSkgeworCQkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKQorCQkJCXBfYnVmX2luZm8gPSAmYW12dnA5X3dvcmtidWZmX3NwZWNbMl07CisJCQllbHNlCisJCQkJcF9idWZfaW5mbyA9ICZhbXZ2cDlfd29ya2J1ZmZfc3BlY1sxXTsKKwkJfSBlbHNlCisJCQlwX2J1Zl9pbmZvID0gJmFtdnZwOV93b3JrYnVmZl9zcGVjWzBdOworCX0gZWxzZSB7IC8vZ2V0X2NwdV9tYWpvcl9pZCgpID4gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RNMiB8fCBpc19jcHVfdG0yX3JldmIoKQorCQlpZiAodmRlY19pc19zdXBwb3J0XzRrKCkpCisJCQlwX2J1Zl9pbmZvID0gJmFtdnZwOV93b3JrYnVmZl9zcGVjWzVdOworCQllbHNlCisJCQlwX2J1Zl9pbmZvID0gJmFtdnZwOV93b3JrYnVmZl9zcGVjWzRdOworCX0KKworCWluaXRfYnVmZl9zcGVjKE5VTEwsIHBfYnVmX2luZm8pOworCXdvcmtfYnVmX3NpemUgPQorCQkocF9idWZfaW5mby0+ZW5kX2FkciAtIHBfYnVmX2luZm8tPnN0YXJ0X2FkcgorCQkgKyAweGZmZmYpICYgKH4weGZmZmYpOworCisJcHJfZGVidWcoImFtdmRlY192cDkgbW9kdWxlIGluaXRcbiIpOworCisJZXJyb3JfaGFuZGxlX3BvbGljeSA9IDA7CisKKyNpZmRlZiBFUlJPUl9IQU5ETEVfREVCVUcKKwlkYmdfbmFsX3NraXBfZmxhZyA9IDA7CisJZGJnX25hbF9za2lwX2NvdW50ID0gMDsKKyNlbmRpZgorCXVkZWJ1Z19mbGFnID0gMDsKKwlkZWNvZGVfcGljX2JlZ2luID0gMDsKKwlzbGljZV9wYXJzZV9iZWdpbiA9IDA7CisJc3RlcCA9IDA7CisJYnVmX2FsbG9jX3NpemUgPSAwOworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlpZiAocGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhbW12ZGVjX3ZwOV9kcml2ZXIpKQorCQlwcl9lcnIoImZhaWxlZCB0byByZWdpc3RlciBhbW12ZGVjX3ZwOSBkcml2ZXJcbiIpOworCisjZW5kaWYKKwlpZiAocGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhbXZkZWNfdnA5X2RyaXZlcikpIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gcmVnaXN0ZXIgYW12ZGVjX3ZwOSBkcml2ZXJcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTCB8fAorCQlnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RYTCB8fAorCQlnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1KSB7CisJCWFtdmRlY192cDlfcHJvZmlsZS5uYW1lID0gInZwOV91bnN1cHBvcnQiOworCX0gZWxzZSBpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKSAmJgorCQkoZ2V0X2NwdV9tYWpvcl9pZCgpICE9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNUQpKSB7CisJCWFtdmRlY192cDlfcHJvZmlsZS5wcm9maWxlID0KKwkJCSI4aywgMTBiaXQsIGR3cml0ZSwgY29tcHJlc3NlZCwgZmVuY2UsIHY0bC11dm0iOworCX0gZWxzZSB7CisJCWlmICh2ZGVjX2lzX3N1cHBvcnRfNGsoKSkKKwkJCWFtdmRlY192cDlfcHJvZmlsZS5wcm9maWxlID0KKwkJCQkiNGssIDEwYml0LCBkd3JpdGUsIGNvbXByZXNzZWQsIGZlbmNlLCB2NGwtdXZtIjsKKwkJZWxzZQorCQkJYW12ZGVjX3ZwOV9wcm9maWxlLnByb2ZpbGUgPQorCQkJCSIxMGJpdCwgZHdyaXRlLCBjb21wcmVzc2VkLCBmZW5jZSwgdjRsLXV2bSI7CisJfQorCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQSkKKwkJbWF4X2J1Zl9udW0gPSBNQVhfQlVGX05VTV9MRVNTOworCisJdmNvZGVjX3Byb2ZpbGVfcmVnaXN0ZXIoJmFtdmRlY192cDlfcHJvZmlsZSk7CisJYW12ZGVjX3ZwOV9wcm9maWxlX211bHQgPSBhbXZkZWNfdnA5X3Byb2ZpbGU7CisJYW12ZGVjX3ZwOV9wcm9maWxlX211bHQubmFtZSA9ICJtdnA5IjsKKwl2Y29kZWNfcHJvZmlsZV9yZWdpc3RlcigmYW12ZGVjX3ZwOV9wcm9maWxlX211bHQpOworCUlOSVRfUkVHX05PREVfQ09ORklHUygibWVkaWEuZGVjb2RlciIsICZ2cDlfbm9kZSwKKwkJInZwOSIsIHZwOV9jb25maWdzLCBDT05GSUdfRk9SX1JXKTsKKwl2Y29kZWNfZmVhdHVyZV9yZWdpc3RlcihWRk9STUFUX1ZQOSwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFtdmRlY192cDlfZHJpdmVyX3JlbW92ZV9tb2R1bGUodm9pZCkKK3sKKwlwcl9kZWJ1ZygiYW12ZGVjX3ZwOSBtb2R1bGUgcmVtb3ZlLlxuIik7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhbW12ZGVjX3ZwOV9kcml2ZXIpOworI2VuZGlmCisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFtdmRlY192cDlfZHJpdmVyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK21vZHVsZV9wYXJhbShiaXRfZGVwdGhfbHVtYSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGJpdF9kZXB0aF9sdW1hLCAiXG4gYW12ZGVjX3ZwOSBiaXRfZGVwdGhfbHVtYVxuIik7CisKK21vZHVsZV9wYXJhbShiaXRfZGVwdGhfY2hyb21hLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoYml0X2RlcHRoX2Nocm9tYSwgIlxuIGFtdmRlY192cDkgYml0X2RlcHRoX2Nocm9tYVxuIik7CisKK21vZHVsZV9wYXJhbShmcmFtZV93aWR0aCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZyYW1lX3dpZHRoLCAiXG4gYW12ZGVjX3ZwOSBmcmFtZV93aWR0aFxuIik7CisKK21vZHVsZV9wYXJhbShmcmFtZV9oZWlnaHQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmcmFtZV9oZWlnaHQsICJcbiBhbXZkZWNfdnA5IGZyYW1lX2hlaWdodFxuIik7CisKK21vZHVsZV9wYXJhbShkZWJ1ZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiXG4gYW12ZGVjX3ZwOSBkZWJ1Z1xuIik7CisKK21vZHVsZV9wYXJhbShyYWRyLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocmFkciwgIlxuIHJhZHJcbiIpOworCittb2R1bGVfcGFyYW0ocnZhbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJ2YWwsICJcbiBydmFsXG4iKTsKKworbW9kdWxlX3BhcmFtKHBvcF9zaG9ydHMsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhwb3Bfc2hvcnRzLCAiXG4gcnZhbFxuIik7CisKK21vZHVsZV9wYXJhbShkYmdfY21kLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGJnX2NtZCwgIlxuIGRiZ19jbWRcbiIpOworCittb2R1bGVfcGFyYW0oZGJnX3NraXBfZGVjb2RlX2luZGV4LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGJnX3NraXBfZGVjb2RlX2luZGV4LCAiXG4gZGJnX3NraXBfZGVjb2RlX2luZGV4XG4iKTsKKworbW9kdWxlX3BhcmFtKGVuZGlhbiwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuZGlhbiwgIlxuIHJ2YWxcbiIpOworCittb2R1bGVfcGFyYW0oc3RlcCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHN0ZXAsICJcbiBhbXZkZWNfdnA5IHN0ZXBcbiIpOworCittb2R1bGVfcGFyYW0oZGVjb2RlX3BpY19iZWdpbiwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlY29kZV9waWNfYmVnaW4sICJcbiBhbXZkZWNfdnA5IGRlY29kZV9waWNfYmVnaW5cbiIpOworCittb2R1bGVfcGFyYW0oc2xpY2VfcGFyc2VfYmVnaW4sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhzbGljZV9wYXJzZV9iZWdpbiwgIlxuIGFtdmRlY192cDkgc2xpY2VfcGFyc2VfYmVnaW5cbiIpOworCittb2R1bGVfcGFyYW0oaV9vbmx5X2ZsYWcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhpX29ubHlfZmxhZywgIlxuIGFtdmRlY192cDkgaV9vbmx5X2ZsYWdcbiIpOworCittb2R1bGVfcGFyYW0obG93X2xhdGVuY3lfZmxhZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGxvd19sYXRlbmN5X2ZsYWcsICJcbiBhbXZkZWNfdnA5IGxvd19sYXRlbmN5X2ZsYWdcbiIpOworCittb2R1bGVfcGFyYW0obm9faGVhZCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vX2hlYWQsICJcbiBhbXZkZWNfdnA5IG5vX2hlYWRcbiIpOworCittb2R1bGVfcGFyYW0oZXJyb3JfaGFuZGxlX3BvbGljeSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVycm9yX2hhbmRsZV9wb2xpY3ksICJcbiBhbXZkZWNfdnA5IGVycm9yX2hhbmRsZV9wb2xpY3lcbiIpOworCittb2R1bGVfcGFyYW0oYnVmX2FsbG9jX2RlcHRoLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoYnVmX2FsbG9jX2RlcHRoLCAiXG4gYnVmX2FsbG9jX2RlcHRoXG4iKTsKKworbW9kdWxlX3BhcmFtKGJ1Zl9hbGxvY19zaXplLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoYnVmX2FsbG9jX3NpemUsICJcbiBidWZfYWxsb2Nfc2l6ZVxuIik7CisKK21vZHVsZV9wYXJhbShidWZmZXJfbW9kZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGJ1ZmZlcl9tb2RlLCAiXG4gYnVmZmVyX21vZGVcbiIpOworCittb2R1bGVfcGFyYW0oYnVmZmVyX21vZGVfZGJnLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoYnVmZmVyX21vZGVfZGJnLCAiXG4gYnVmZmVyX21vZGVfZGJnXG4iKTsKKy8qVVNFX0JVRl9CTE9DSyovCittb2R1bGVfcGFyYW0obWF4X2J1Zl9udW0sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfYnVmX251bSwgIlxuIG1heF9idWZfbnVtXG4iKTsKKworbW9kdWxlX3BhcmFtKGR5bmFtaWNfYnVmX251bV9tYXJnaW4sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkeW5hbWljX2J1Zl9udW1fbWFyZ2luLCAiXG4gZHluYW1pY19idWZfbnVtX21hcmdpblxuIik7CisKK21vZHVsZV9wYXJhbShtdl9idWZfbWFyZ2luLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobXZfYnVmX21hcmdpbiwgIlxuIG12X2J1Zl9tYXJnaW5cbiIpOworCittb2R1bGVfcGFyYW0obXZfYnVmX2R5bmFtaWNfYWxsb2MsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhtdl9idWZfZHluYW1pY19hbGxvYywgIlxuIG12X2J1Zl9keW5hbWljX2FsbG9jXG4iKTsKKworbW9kdWxlX3BhcmFtKHJ1bl9yZWFkeV9taW5fYnVmX251bSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJ1bl9yZWFkeV9taW5fYnVmX251bSwgIlxuIHJ1bl9yZWFkeV9taW5fYnVmX251bVxuIik7CisKKy8qKi8KKworbW9kdWxlX3BhcmFtKG1lbV9tYXBfbW9kZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG1lbV9tYXBfbW9kZSwgIlxuIG1lbV9tYXBfbW9kZVxuIik7CisKKyNpZmRlZiBTVVBQT1JUXzEwQklUCittb2R1bGVfcGFyYW0oZG91YmxlX3dyaXRlX21vZGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkb3VibGVfd3JpdGVfbW9kZSwgIlxuIGRvdWJsZV93cml0ZV9tb2RlXG4iKTsKKworbW9kdWxlX3BhcmFtKGVuYWJsZV9tZW1fc2F2aW5nLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlX21lbV9zYXZpbmcsICJcbiBlbmFibGVfbWVtX3NhdmluZ1xuIik7CisKK21vZHVsZV9wYXJhbShmb3JjZV93X2gsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV93X2gsICJcbiBmb3JjZV93X2hcbiIpOworI2VuZGlmCisKK21vZHVsZV9wYXJhbShmb3JjZV9mcHMsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9mcHMsICJcbiBmb3JjZV9mcHNcbiIpOworCittb2R1bGVfcGFyYW0obWF4X2RlY29kaW5nX3RpbWUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfZGVjb2RpbmdfdGltZSwgIlxuIG1heF9kZWNvZGluZ190aW1lXG4iKTsKKworbW9kdWxlX3BhcmFtKG9uX25vX2tleWZyYW1lX3NraXBlZCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG9uX25vX2tleWZyYW1lX3NraXBlZCwgIlxuIG9uX25vX2tleWZyYW1lX3NraXBlZFxuIik7CisKK21vZHVsZV9wYXJhbShtY3JjY19jYWNoZV9hbGdfZmxhZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG1jcmNjX2NhY2hlX2FsZ19mbGFnLCAiXG4gbWNyY2NfY2FjaGVfYWxnX2ZsYWdcbiIpOworCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorbW9kdWxlX3BhcmFtKHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwsCisJCSJcbiB2cDkgc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbFxuIik7CisKK21vZHVsZV9wYXJhbShkZWNvZGVfdGltZW91dF92YWwsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkZWNvZGVfdGltZW91dF92YWwsCisJIlxuIHZwOSBkZWNvZGVfdGltZW91dF92YWxcbiIpOworCittb2R1bGVfcGFyYW0odnA5X21heF9waWNfdywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHZwOV9tYXhfcGljX3csICJcbiB2cDlfbWF4X3BpY193XG4iKTsKKworbW9kdWxlX3BhcmFtKHZwOV9tYXhfcGljX2gsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh2cDlfbWF4X3BpY19oLCAiXG4gdnA5X21heF9waWNfaFxuIik7CisKK21vZHVsZV9wYXJhbV9hcnJheShkZWNvZGVfZnJhbWVfY291bnQsIHVpbnQsCisJJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGRpc3BsYXlfZnJhbWVfY291bnQsIHVpbnQsCisJJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtX2FycmF5KG1heF9wcm9jZXNzX3RpbWUsIHVpbnQsCisJJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtX2FycmF5KHJ1bl9jb3VudCwgdWludCwKKwkmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCittb2R1bGVfcGFyYW1fYXJyYXkoaW5wdXRfZW1wdHksIHVpbnQsCisJJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtX2FycmF5KG5vdF9ydW5fcmVhZHksIHVpbnQsCisJJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKyNlbmRpZgorCisjaWZkZWYgU1VQUE9SVF9GQl9ERUNPRElORworbW9kdWxlX3BhcmFtX2FycmF5KG5vdF9ydW4yX3JlYWR5LCB1aW50LAorCSZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisKK21vZHVsZV9wYXJhbV9hcnJheShydW4yX2NvdW50LCB1aW50LAorCSZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisKK21vZHVsZV9wYXJhbShzdGFnZV9idWZfbnVtLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3RhZ2VfYnVmX251bSwgIlxuIGFtdmRlY19oMjY1IHN0YWdlX2J1Zl9udW1cbiIpOworI2VuZGlmCittb2R1bGVfcGFyYW0oZm9yY2VfYnVmc3BlYywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2J1ZnNwZWMsICJcbiBhbXZkZWNfaDI2NSBmb3JjZV9idWZzcGVjXG4iKTsKKworbW9kdWxlX3BhcmFtKHVkZWJ1Z19mbGFnLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModWRlYnVnX2ZsYWcsICJcbiBhbXZkZWNfaDI2NSB1ZGVidWdfZmxhZ1xuIik7CisKK21vZHVsZV9wYXJhbSh1ZGVidWdfcGF1c2VfcG9zLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModWRlYnVnX3BhdXNlX3BvcywgIlxuIHVkZWJ1Z19wYXVzZV9wb3NcbiIpOworCittb2R1bGVfcGFyYW0odWRlYnVnX3BhdXNlX3ZhbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHVkZWJ1Z19wYXVzZV92YWwsICJcbiB1ZGVidWdfcGF1c2VfdmFsXG4iKTsKKworbW9kdWxlX3BhcmFtKHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModWRlYnVnX3BhdXNlX2RlY29kZV9pZHgsICJcbiB1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeFxuIik7CisKK21vZHVsZV9wYXJhbSh3aXRob3V0X2Rpc3BsYXlfbW9kZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHdpdGhvdXRfZGlzcGxheV9tb2RlLCAiXG4gd2l0aG91dF9kaXNwbGF5X21vZGVcbiIpOworCittb2R1bGVfcGFyYW0oZm9yY2VfY29uZmlnX2ZlbmNlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2VfY29uZmlnX2ZlbmNlLCAiXG4gZm9yY2UgZW5hYmxlIGZlbmNlXG4iKTsKKworbW9kdWxlX3BhcmFtKGZvcmNlX3B0c191bnN0YWJsZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX3B0c191bnN0YWJsZSwgIlxuIGZvcmNlX3B0c191bnN0YWJsZVxuIik7CisKK21vZHVsZV9wYXJhbSh2NGxfYml0c3RyZWFtX2lkX2VuYWJsZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHY0bF9iaXRzdHJlYW1faWRfZW5hYmxlLCAiXG4gdjRsX2JpdHN0cmVhbV9pZF9lbmFibGVcbiIpOworCittb2R1bGVfaW5pdChhbXZkZWNfdnA5X2RyaXZlcl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChhbXZkZWNfdnA5X2RyaXZlcl9yZW1vdmVfbW9kdWxlKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTUxPR0lDIHZwOSBWaWRlbyBEZWNvZGVyIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdnA5L3Z2cDkuaCBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci92cDkvdnZwOS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYjlkMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdnA5L3Z2cDkuaApAQCAtMCwwICsxLDIzIEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL2FtcG9ydHMvdnZwOS5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgVlZQOV9ICisjZGVmaW5lIFZWUDlfSAorCit2b2lkIGFkYXB0X2NvZWZfcHJvYnMoaW50IHBpY19jb3VudCwgaW50IHByZXZfa2YsIGludCBjdXJfa2YsIGludCBwcmVfZmMsCit1bnNpZ25lZCBpbnQgKnByZXZfcHJvYiwgdW5zaWduZWQgaW50ICpjdXJfcHJvYiwgdW5zaWduZWQgaW50ICpjb3VudCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlcl92NGwvTWFrZWZpbGUgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZTk0ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL01ha2VmaWxlCkBAIC0wLDAgKzEsOSBAQAorb2JqLXkJKz0JbXBlZzEyLworb2JqLXkJKz0JbXBlZzQvCitvYmoteQkrPQloMjY0X211bHRpLworb2JqLXkJKz0JaDI2NS8KK29iai15CSs9CXZwOS8KK29iai15CSs9CW1qcGVnLworb2JqLXkJKz0JYXZzMi8KK29iai15CSs9CWF2c19tdWx0aS8KK29iai15CSs9CXZhdjEvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL2F2czIvTWFrZWZpbGUgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL2F2czIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk5NTA2NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlcl92NGwvYXZzMi9NYWtlZmlsZQpAQCAtMCwwICsxLDIgQEAKK29iai0kKENPTkZJR19BTUxPR0lDX01FRElBX1ZERUNfQVZTMikgKz0gYW12ZGVjX2F2czJfdjRsLm8KK2FtdmRlY19hdnMyX3Y0bC1vYmpzICs9IHZhdnMyLm8gYXZzMl9idWZtZ3IubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC9hdnMyL2F2czJfYnVmbWdyLmMgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL2F2czIvYXZzMl9idWZtZ3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWMzMTMyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC9hdnMyL2F2czJfYnVmbWdyLmMKQEAgLTAsMCArMSwyMjA1IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorKiBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqCisqIERlc2NyaXB0aW9uOgorKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy9hbXN0cmVhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmZvcm1hdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZnJhbWVfc3luYy9wdHNzZXJ2Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jYW52YXMvY2FudmFzLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3Byb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3JlY2VpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtY29udGlndW91cy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvdGVlLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC90ZWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC9jbG9jay5oPgorI2luY2x1ZGUgIi4uLy4uLy4uL3N0cmVhbV9pbnB1dC9hbXBvcnRzL2FtcG9ydHNfcHJpdi5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29kZWNfbW0uaD4KKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL2RlY29kZXJfbW11X2JveC5oIgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvZGVjb2Rlcl9ibW11X2JveC5oIgorI2luY2x1ZGUgImF2czJfZ2xvYmFsLmgiCisKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL3ZkZWNfcmVnLmg+CisjaW5jbHVkZSAiLi4vLi4vZGVjb2Rlci91dGlscy92ZGVjLmgiCisjaW5jbHVkZSAiLi4vLi4vZGVjb2Rlci91dGlscy9hbXZkZWMuaCIKKworI3VuZGVmIHByX2luZm8KKyNkZWZpbmUgcHJfaW5mbyBwcmludGsKKworI2RlZmluZSBhc3NlcnQoY2hrX2NvbmQpIHtcCisJaWYgKCEoY2hrX2NvbmQpKVwKKwkJcHJfaW5mbygiZXJyb3IgbGluZSAlZFxuIiwgX19MSU5FX18pO1wKKwl3aGlsZSAoIShjaGtfY29uZCkpXAorCQk7XAorfQorCitpbnQxNl90IGdldF9wYXJhbSh1aW50MTZfdCB2YWx1ZSwgaW50OF90ICpwcmludF9pbmZvKQoreworCWlmIChpc19hdnMyX3ByaW50X3BhcmFtKCkpCisJCXByX2luZm8oIiVzID0gJXhcbiIsIHByaW50X2luZm8sIHZhbHVlKTsKKwlyZXR1cm4gKGludDE2X3QpdmFsdWU7Cit9CisKK3ZvaWQgcmVhZEFsZkNvZWZmKHN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjLCBzdHJ1Y3QgQUxGUGFyYW1fcyAqQWxmcCkKK3sKKwlpbnQzMl90IHBvczsKKwl1bmlvbiBwYXJhbV91ICpycG1fcGFyYW0gPSAmYXZzMl9kZWMtPnBhcmFtOworCisJaW50MzJfdCBmID0gMCwgc3ltYm9sLCBwcmVfc3ltYm9sZTsKKwljb25zdCBpbnQzMl90IG51bUNvZWZmID0gKGludDMyX3QpQUxGX01BWF9OVU1fQ09FRjsKKworCXN3aXRjaCAoQWxmcC0+Y29tcG9uZW50SUQpIHsKKwljYXNlIEFMRl9DYjoKKwljYXNlIEFMRl9DcjogeworCQlmb3IgKHBvcyA9IDA7IHBvcyA8IG51bUNvZWZmOyBwb3MrKykgeworCQkJaWYgKEFsZnAtPmNvbXBvbmVudElEID09IEFMRl9DYikKKwkJCQlBbGZwLT5jb2VmZm11bHRpWzBdW3Bvc10gPQorCQkJCQlnZXRfcGFyYW0oCisJCQkJCXJwbV9wYXJhbS0+YWxmLmFsZl9jYl9jb2VmZm11bHRpW3Bvc10sCisJCQkJCSJDaHJvbWEgQUxGIGNvZWZmaWNpZW50cyIpOworCQkJZWxzZQorCQkJCUFsZnAtPmNvZWZmbXVsdGlbMF1bcG9zXSA9CisJCQkJCWdldF9wYXJhbSgKKwkJCQkJcnBtX3BhcmFtLT5hbGYuYWxmX2NyX2NvZWZmbXVsdGlbcG9zXSwKKwkJCQkJIkNocm9tYSBBTEYgY29lZmZpY2llbnRzIik7CisjaWYgQ2hlY2tfQml0c3RyZWFtCisJCQlpZiAocG9zIDw9IDcpCisJCQkJYXNzZXJ0KEFsZnAtPmNvZWZmbXVsdGlbMF1bcG9zXSA+PSAtNjQKKwkJCQkJJiYgQWxmcC0+Y29lZmZtdWx0aVswXVtwb3NdIDw9IDYzKTsKKwkJCWlmIChwb3MgPT0gOCkKKwkJCQlhc3NlcnQoQWxmcC0+Y29lZmZtdWx0aVswXVtwb3NdID49IC0xMDg4CisJCQkJCSYmIEFsZnAtPmNvZWZmbXVsdGlbMF1bcG9zXSA8PSAxMDcxKTsKKyNlbmRpZgorCQl9CisJfQorCWJyZWFrOworCWNhc2UgQUxGX1k6IHsKKwkJaW50MzJfdCByZWdpb25fZGlzdGFuY2VfaWR4ID0gMDsKKwkJQWxmcC0+ZmlsdGVyc19wZXJfZ3JvdXAgPQorCQkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+YWxmLmFsZl9maWx0ZXJzX251bV9tXzEsCisJCQkJIkFMRl9maWx0ZXJfbnVtYmVyX21pbnVzXzEiKTsKKyNpZiBDaGVja19CaXRzdHJlYW0KKwkJYXNzZXJ0KEFsZnAtPmZpbHRlcnNfcGVyX2dyb3VwID49IDAKKwkJCSYmIEFsZnAtPmZpbHRlcnNfcGVyX2dyb3VwIDw9IDE1KTsKKyNlbmRpZgorCQlBbGZwLT5maWx0ZXJzX3Blcl9ncm91cCA9IEFsZnAtPmZpbHRlcnNfcGVyX2dyb3VwICsgMTsKKworCQltZW1zZXQoQWxmcC0+ZmlsdGVyUGF0dGVybiwgMCwgTk9fVkFSX0JJTlMgKiBzaXplb2YoaW50MzJfdCkpOworCQlwcmVfc3ltYm9sZSA9IDA7CisJCXN5bWJvbCA9IDA7CisJCWZvciAoZiA9IDA7IGYgPCBBbGZwLT5maWx0ZXJzX3Blcl9ncm91cDsgZisrKSB7CisJCQlpZiAoZiA+IDApIHsKKwkJCQlpZiAoQWxmcC0+ZmlsdGVyc19wZXJfZ3JvdXAgIT0gMTYpIHsKKwkJCQkJc3ltYm9sID0KKwkJCQkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+YWxmLnJlZ2lvbl9kaXN0YW5jZQorCQkJCQkJW3JlZ2lvbl9kaXN0YW5jZV9pZHgrK10sCisJCQkJCQkiUmVnaW9uIGRpc3RhbmNlIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJc3ltYm9sID0gMTsKKwkJCQl9CisJCQkJQWxmcC0+ZmlsdGVyUGF0dGVybltzeW1ib2wgKyBwcmVfc3ltYm9sZV0gPSAxOworCQkJCXByZV9zeW1ib2xlID0gc3ltYm9sICsgcHJlX3N5bWJvbGU7CisJCQl9CisKKwkJCWZvciAocG9zID0gMDsgcG9zIDwgbnVtQ29lZmY7IHBvcysrKSB7CisJCQkJQWxmcC0+Y29lZmZtdWx0aVtmXVtwb3NdID0KKwkJCQlnZXRfcGFyYW0oCisJCQkJCXJwbV9wYXJhbS0+YWxmLmFsZl95X2NvZWZmbXVsdGlbZl1bcG9zXSwKKwkJCQkJIkx1bWEgQUxGIGNvZWZmaWNpZW50cyIpOworI2lmIENoZWNrX0JpdHN0cmVhbQorCQkJCWlmIChwb3MgPD0gNykKKwkJCQkJYXNzZXJ0KAorCQkJCQkJQWxmcC0+Y29lZmZtdWx0aVtmXVtwb3NdCisJCQkJCQk+PSAtNjQgJiYKKwkJCQkJCUFsZnAtPmNvZWZmbXVsdGlbZl1bcG9zXQorCQkJCQkJPD0gNjMpOworCQkJCWlmIChwb3MgPT0gOCkKKwkJCQkJYXNzZXJ0KAorCQkJCQkJQWxmcC0+Y29lZmZtdWx0aVtmXVtwb3NdCisJCQkJCQk+PSAtMTA4OCAmJgorCQkJCQkJQWxmcC0+Y29lZmZtdWx0aVtmXVtwb3NdCisJCQkJCQk8PSAxMDcxKTsKKyNlbmRpZgorCisJCQl9CisJCX0KKworI2lmIENoZWNrX0JpdHN0cmVhbQorCQlhc3NlcnQocHJlX3N5bWJvbGUgPj0gMCAmJiBwcmVfc3ltYm9sZSA8PSAxNSk7CisKKyNlbmRpZgorCX0KKwlicmVhazsKKwlkZWZhdWx0OiB7CisJCXByX2luZm8oIk5vdCBhIGxlZ2FsIGNvbXBvbmVudCBJRFxuIik7CisJCWFzc2VydCgwKTsKKwkJcmV0dXJuOyAvKiBleGl0KC0xKTsqLworCX0KKwl9Cit9CisKK3ZvaWQgUmVhZF9BTEZfcGFyYW0oc3RydWN0IGF2czJfZGVjb2RlciAqYXZzMl9kZWMpCit7CisJc3RydWN0IGlucF9wYXIgICAgKmlucHV0ID0gJmF2czJfZGVjLT5pbnB1dDsKKwlzdHJ1Y3QgSW1hZ2VQYXJhbWV0ZXJzX3MgICAgKmltZyA9ICZhdnMyX2RlYy0+aW1nOworCXVuaW9uIHBhcmFtX3UgKnJwbV9wYXJhbSA9ICZhdnMyX2RlYy0+cGFyYW07CisJaW50MzJfdCBjb21wSWR4OworCWlmIChpbnB1dC0+YWxmX2VuYWJsZSkgeworCQlpbWctPnBpY19hbGZfb25bMF0gPQorCQkJZ2V0X3BhcmFtKAorCQkJcnBtX3BhcmFtLT5hbGYucGljdHVyZV9hbGZfZW5hYmxlX1ksCisJCQkiYWxmX3BpY19mbGFnX1kiKTsKKwkJaW1nLT5waWNfYWxmX29uWzFdID0KKwkJCWdldF9wYXJhbSgKKwkJCXJwbV9wYXJhbS0+YWxmLnBpY3R1cmVfYWxmX2VuYWJsZV9DYiwKKwkJCSJhbGZfcGljX2ZsYWdfQ2IiKTsKKwkJaW1nLT5waWNfYWxmX29uWzJdID0KKwkJCWdldF9wYXJhbSgKKwkJCXJwbV9wYXJhbS0+YWxmLnBpY3R1cmVfYWxmX2VuYWJsZV9DciwKKwkJCSJhbGZfcGljX2ZsYWdfQ3IiKTsKKworCQlhdnMyX2RlYy0+bV9hbGZQaWN0dXJlUGFyYW1bQUxGX1ldLmFsZl9mbGFnCisJCQk9IGltZy0+cGljX2FsZl9vbltBTEZfWV07CisJCWF2czJfZGVjLT5tX2FsZlBpY3R1cmVQYXJhbVtBTEZfQ2JdLmFsZl9mbGFnCisJCQk9IGltZy0+cGljX2FsZl9vbltBTEZfQ2JdOworCQlhdnMyX2RlYy0+bV9hbGZQaWN0dXJlUGFyYW1bQUxGX0NyXS5hbGZfZmxhZworCQkJPSBpbWctPnBpY19hbGZfb25bQUxGX0NyXTsKKwkJaWYgKGltZy0+cGljX2FsZl9vblswXQorCQkJfHwgaW1nLT5waWNfYWxmX29uWzFdCisJCQl8fCBpbWctPnBpY19hbGZfb25bMl0pIHsKKwkJCWZvciAoY29tcElkeCA9IDA7CisJCQkJY29tcElkeCA8IE5VTV9BTEZfQ09NUE9ORU5UOworCQkJCWNvbXBJZHgrKykgeworCQkJCWlmIChpbWctPnBpY19hbGZfb25bY29tcElkeF0pIHsKKwkJCQkJcmVhZEFsZkNvZWZmKAorCQkJCQlhdnMyX2RlYywKKwkJCQkJJmF2czJfZGVjLT5tX2FsZlBpY3R1cmVQYXJhbVtjb21wSWR4XSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCit9CisKK3ZvaWQgR2V0X1NlcXVlbmNlSGVhZGVyKHN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjKQoreworCXN0cnVjdCBpbnBfcGFyICAgICppbnB1dCA9ICZhdnMyX2RlYy0+aW5wdXQ7CisJc3RydWN0IEltYWdlUGFyYW1ldGVyc19zICAgICppbWcgPSAmYXZzMl9kZWMtPmltZzsKKwlzdHJ1Y3QgVmlkZW9fQ29tX2RhdGFfcyAqaGMgPSAmYXZzMl9kZWMtPmhjOworCXN0cnVjdCBWaWRlb19EZWNfZGF0YV9zICpoZCA9ICZhdnMyX2RlYy0+aGQ7CisJdW5pb24gcGFyYW1fdSAqcnBtX3BhcmFtID0gJmF2czJfZGVjLT5wYXJhbTsKKwkvKmludDMyX3QgaSwgajsqLworCisJLypmcHJfaW5mbyhzdGRvdXQsICJTZXF1ZW5jZSBIZWFkZXJcbiIpOyovCisJLyptZW1jcHkoY3VyclN0cmVhbS0+c3RyZWFtQnVmZmVyLCBidWYsIGxlbmd0aCk7Ki8KKwkvKmN1cnJTdHJlYW0tPmNvZGVfbGVuID0gY3VyclN0cmVhbS0+Yml0c3RyZWFtX2xlbmd0aCA9IGxlbmd0aDsqLworCS8qY3VyclN0cmVhbS0+cmVhZF9sZW4gPSBjdXJyU3RyZWFtLT5mcmFtZV9iaXRvZmZzZXQgPSAoc3RhcnRjb2RlcG9zICsKKwkgIDEpICogODsqLworCisJaW5wdXQtPnByb2ZpbGVfaWQgICAgICAgICAgID0KKwkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5wcm9maWxlX2lkLCAicHJvZmlsZV9pZCIpOworCWlucHV0LT5sZXZlbF9pZCAgICAgICAgICAgICA9CisJCWdldF9wYXJhbShycG1fcGFyYW0tPnAubGV2ZWxfaWQsICJsZXZlbF9pZCIpOworCWhkLT5wcm9ncmVzc2l2ZV9zZXF1ZW5jZSAgICAgICAgPQorCQlnZXRfcGFyYW0oCisJCQlycG1fcGFyYW0tPnAucHJvZ3Jlc3NpdmVfc2VxdWVuY2UsCisJCQkicHJvZ3Jlc3NpdmVfc2VxdWVuY2UiKTsKKyNpZiBJTlRFUkxBQ0VfQ09ESU5HCisJaGQtPmlzX2ZpZWxkX3NlcXVlbmNlICAgICAgICAgICA9CisJCWdldF9wYXJhbSgKKwkJCXJwbV9wYXJhbS0+cC5pc19maWVsZF9zZXF1ZW5jZSwKKwkJCSJmaWVsZF9jb2RlZF9zZXF1ZW5jZSIpOworI2VuZGlmCisjaWYgSEFMRl9QSVhFTF9DT01QRU5TQVRJT04gfHwgSEFMRl9QSVhFTF9DSFJPTUEKKwlpbWctPmlzX2ZpZWxkX3NlcXVlbmNlID0gaGQtPmlzX2ZpZWxkX3NlcXVlbmNlOworI2VuZGlmCisJaGQtPmhvcml6b250YWxfc2l6ZSA9CisJCWdldF9wYXJhbShycG1fcGFyYW0tPnAuaG9yaXpvbnRhbF9zaXplLCAiaG9yaXpvbnRhbF9zaXplIik7CisJaGQtPnZlcnRpY2FsX3NpemUgPQorCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLnZlcnRpY2FsX3NpemUsICJ2ZXJ0aWNhbF9zaXplIik7CisJaW5wdXQtPmNocm9tYV9mb3JtYXQgICAgICAgICAgICAgICA9CisJCWdldF9wYXJhbShycG1fcGFyYW0tPnAuY2hyb21hX2Zvcm1hdCwgImNocm9tYV9mb3JtYXQiKTsKKwlpbnB1dC0+b3V0cHV0X2JpdF9kZXB0aCA9IDg7CisJaW5wdXQtPnNhbXBsZV9iaXRfZGVwdGggPSA4OworCWhkLT5zYW1wbGVfcHJlY2lzaW9uID0gMTsKKwlpZiAoaW5wdXQtPnByb2ZpbGVfaWQgPT0gQkFTRUxJTkUxMF9QUk9GSUxFKSB7IC8qIDEwYml0IHByb2ZpbGUgKDB4NTIpKi8KKwkJaW5wdXQtPm91dHB1dF9iaXRfZGVwdGggPQorCQkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5zYW1wbGVfcHJlY2lzaW9uLAorCQkJInNhbXBsZV9wcmVjaXNpb24iKTsKKwkJaW5wdXQtPm91dHB1dF9iaXRfZGVwdGggPQorCQkJNiArIChpbnB1dC0+b3V0cHV0X2JpdF9kZXB0aCkgKiAyOworCQlpbnB1dC0+c2FtcGxlX2JpdF9kZXB0aCA9CisJCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLmVuY29kaW5nX3ByZWNpc2lvbiwKKwkJCSJlbmNvZGluZ19wcmVjaXNpb24iKTsKKwkJaW5wdXQtPnNhbXBsZV9iaXRfZGVwdGggPQorCQkJNiArIChpbnB1dC0+c2FtcGxlX2JpdF9kZXB0aCkgKiAyOworCX0gZWxzZSB7IC8qIG90aGVyIHByb2ZpbGUqLworCQloZC0+c2FtcGxlX3ByZWNpc2lvbiA9CisJCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLnNhbXBsZV9wcmVjaXNpb24sCisJCQkJInNhbXBsZV9wcmVjaXNpb24iKTsKKwl9CisJaGQtPmFzcGVjdF9yYXRpb19pbmZvcm1hdGlvbiAgICA9CisJCWdldF9wYXJhbShycG1fcGFyYW0tPnAuYXNwZWN0X3JhdGlvX2luZm9ybWF0aW9uLAorCQkJImFzcGVjdF9yYXRpb19pbmZvcm1hdGlvbiIpOworCWhkLT5mcmFtZV9yYXRlX2NvZGUgICAgICAgICAgICAgPQorCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLmZyYW1lX3JhdGVfY29kZSwgImZyYW1lX3JhdGVfY29kZSIpOworCisJaGQtPmJpdF9yYXRlX2xvd2VyICAgICAgICAgICAgICA9CisJCWdldF9wYXJhbShycG1fcGFyYW0tPnAuYml0X3JhdGVfbG93ZXIsICJiaXRfcmF0ZV9sb3dlciIpOworCS8qaGQtPm1hcmtlcl9iaXQgICAgICAgICAgICAgICAgICA9IGdldF9wYXJhbShycG1fcGFyYW0tPnAubWFya2VyX2JpdCwKKwkgKiAibWFya2VyIGJpdCIpOyovCisJLypDSEVDS01BUktFUkJJVCovCisJaGQtPmJpdF9yYXRlX3VwcGVyICAgICAgICAgICAgICA9CisJCWdldF9wYXJhbShycG1fcGFyYW0tPnAuYml0X3JhdGVfdXBwZXIsICJiaXRfcmF0ZV91cHBlciIpOworCWhkLT5sb3dfZGVsYXkgICAgICAgICAgICAgICAgICAgPQorCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLmxvd19kZWxheSwgImxvd19kZWxheSIpOworCS8qaGQtPm1hcmtlcl9iaXQgICAgICAgICAgICAgICAgICA9CisJCWdldF9wYXJhbShycG1fcGFyYW0tPnAubWFya2VyX2JpdDIsCisJICJtYXJrZXIgYml0Iik7Ki8KKwkvKkNIRUNLTUFSS0VSQklUKi8KKyNpZiBNMzQ4MF9URU1QT1JBTF9TQ0FMQUJMRQorCWhkLT50ZW1wb3JhbF9pZF9leGlzdF9mbGFnICAgICAgPQorCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLnRlbXBvcmFsX2lkX2V4aXN0X2ZsYWcsCisJCQkidGVtcG9yYWxfaWQgZXhpc3QgZmxhZyIpOyAvKmdldAorCQlFeHRlbnRpb24gRmxhZyovCisjZW5kaWYKKwkvKnVfdigxOCwgImJidiBidWZmZXIgc2l6ZSIpOyovCisJaW5wdXQtPmdfdWlNYXhTaXplSW5CaXQgICAgICAgICA9CisJCWdldF9wYXJhbShycG1fcGFyYW0tPnAuZ191aU1heFNpemVJbkJpdCwKKwkJIkxhcmdlc3QgQ29kaW5nIEJsb2NrIFNpemUiKTsKKworCisJLypoZC0+YmFja2dyb3VuZF9waWN0dXJlX2VuYWJsZSA9IDB4MDEgXgorCQkoZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5hdnMyX3NlcV9mbGFncywKKwkJImJhY2tncm91bmRfcGljdHVyZV9kaXNhYmxlIikKKwkJPj4gQkFDS0dST1VORF9QSUNUVVJFX0RJU0FCTEVfQklUKSAmIDB4MTsqLworCS8qcmFpbj8/PyovCisJaGQtPmJhY2tncm91bmRfcGljdHVyZV9lbmFibGUgPSAweDAxIF4KKwkJKChnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLmF2czJfc2VxX2ZsYWdzLAorCQkiYmFja2dyb3VuZF9waWN0dXJlX2Rpc2FibGUiKQorCQk+PiBCQUNLR1JPVU5EX1BJQ1RVUkVfRElTQUJMRV9CSVQpICYgMHgxKTsKKworCisJaGQtPmJfZG1oX2VuYWJsZWQgICAgICAgICAgID0gMTsKKworCWhkLT5iX21ocHNraXBfZW5hYmxlZCAgICAgICA9CisJCWdldF9wYXJhbShycG1fcGFyYW0tPnAuYXZzMl9zZXFfZmxhZ3MgPj4gQl9NSFBTS0lQX0VOQUJMRURfQklULAorCQkJIm1ocHNraXAgZW5hYmxlZCIpICYgMHgxOworCWhkLT5kaHBfZW5hYmxlZCAgICAgICAgICAgICA9CisJCWdldF9wYXJhbShycG1fcGFyYW0tPnAuYXZzMl9zZXFfZmxhZ3MgPj4gREhQX0VOQUJMRURfQklULAorCQkJImRocCBlbmFibGVkIikgJiAweDE7CisJaGQtPndzbV9lbmFibGVkICAgICAgICAgICAgID0KKwkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5hdnMyX3NlcV9mbGFncyA+PiBXU01fRU5BQkxFRF9CSVQsCisJCQkid3NtIGVuYWJsZWQiKSAmIDB4MTsKKworCWltZy0+aW50ZXJfYW1wX2VuYWJsZSAgICAgICA9CisJCWdldF9wYXJhbShycG1fcGFyYW0tPnAuYXZzMl9zZXFfZmxhZ3MgPj4gSU5URVJfQU1QX0VOQUJMRV9CSVQsCisJCQkiQXN5bW1ldHJpYyBNb3Rpb24gUGFydGl0aW9ucyIpICYgMHgxOworCWlucHV0LT51c2VOU1FUICAgICAgICAgICAgICA9CisJCWdldF9wYXJhbShycG1fcGFyYW0tPnAuYXZzMl9zZXFfZmxhZ3MgPj4gVVNFTlNRVF9CSVQsCisJCQkidXNlTlNRVCIpICYgMHgxOworCWlucHV0LT51c2VTRElQICAgICAgICAgICAgICA9CisJCWdldF9wYXJhbShycG1fcGFyYW0tPnAuYXZzMl9zZXFfZmxhZ3MgPj4gVVNFU0RJUF9CSVQsCisJCQkidXNlTlNJUCIpICYgMHgxOworCisJaGQtPmJfc2VjVF9lbmFibGVkICAgICAgICAgID0KKwkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5hdnMyX3NlcV9mbGFncyA+PiBCX1NFQ1RfRU5BQkxFRF9CSVQsCisJCQkic2VjVCBlbmFibGVkIikgJiAweDE7CisKKwlpbnB1dC0+c2FvX2VuYWJsZSAgICAgICAgICAgPQorCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLmF2czJfc2VxX2ZsYWdzID4+IFNBT19FTkFCTEVfQklULAorCQkJIlNBTyBFbmFibGUgRmxhZyIpICYgMHgxOworCWlucHV0LT5hbGZfZW5hYmxlICAgICAgICAgICA9CisJCWdldF9wYXJhbShycG1fcGFyYW0tPnAuYXZzMl9zZXFfZmxhZ3MgPj4gQUxGX0VOQUJMRV9CSVQsCisJCQkiQUxGIEVuYWJsZSBGbGFnIikgJiAweDE7CisJaGQtPmJfcG12cl9lbmFibGVkICAgICAgICAgID0KKwkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5hdnMyX3NlcV9mbGFncyA+PiBCX1BNVlJfRU5BQkxFRF9CSVQsCisJCQkicG12ciBlbmFibGVkIikgJiAweDE7CisKKworCWhkLT5nb3Bfc2l6ZSA9IGdldF9wYXJhbShycG1fcGFyYW0tPnAubnVtX29mX1JQUywKKwkJIm51bV9vZl9SUFMiKTsKKyNpZiBDaGVja19CaXRzdHJlYW0KKwkvKmFzc2VydChoZC0+Z29wX3NpemU8PTMyKTsqLworI2VuZGlmCisKKwlpZiAoaGQtPmxvd19kZWxheSA9PSAwKSB7CisJCWhkLT5waWN0dXJlX3Jlb3JkZXJfZGVsYXkgID0KKwkJCWdldF9wYXJhbShycG1fcGFyYW0tPnAucGljdHVyZV9yZW9yZGVyX2RlbGF5LAorCQkJInBpY3R1cmVfcmVvcmRlcl9kZWxheSIpOworCX0KKworCWlucHV0LT5jcm9zc1NsaWNlTG9vcEZpbHRlciAgICA9CisJCWdldF9wYXJhbShycG1fcGFyYW0tPnAuYXZzMl9zZXFfZmxhZ3MKKwkJCT4+IENST1NTU0xJQ0VMT09QRklMVEVSX0JJVCwKKwkJCSJDcm9zcyBMb29wIEZpbHRlciBGbGFnIikgJiAweDE7CisKKyNpZiBCQ0JSCisJaWYgKChpbnB1dC0+cHJvZmlsZV9pZCA9PSBTQ0VORV9QUk9GSUxFIHx8CisJCWlucHV0LT5wcm9maWxlX2lkID09IFNDRU5FMTBfUFJPRklMRSkgJiYKKwkJaGQtPmJhY2tncm91bmRfcGljdHVyZV9lbmFibGUpIHsKKwkJaGQtPmJjYnJfZW5hYmxlID0gdV92KDEsCisJCQkiYmxvY2tfY29tcG9zZWRfYmFja2dyb3VuZF9waWN0dXJlX2VuYWJsZSIpOworCQl1X3YoMSwgInJlc2VydmVkIGJpdHMiKTsKKwl9IGVsc2UgeworCQloZC0+YmNicl9lbmFibGUgPSAwOworCQl1X3YoMiwgInJlc2VydmVkIGJpdHMiKTsKKwl9CisjZWxzZQorCS8qdV92KDIsICJyZXNlcnZlZCBiaXRzIik7Ki8KKyNlbmRpZgorCisJaW1nLT53aWR0aCAgICAgICAgICA9IGhkLT5ob3Jpem9udGFsX3NpemU7CisJaW1nLT5oZWlnaHQgICAgICAgICA9IGhkLT52ZXJ0aWNhbF9zaXplOworCWltZy0+d2lkdGhfY3IgICAgICAgPSAoaW1nLT53aWR0aCA+PiAxKTsKKworCWlmIChpbnB1dC0+Y2hyb21hX2Zvcm1hdCA9PSAxKSB7CisJCWltZy0+aGVpZ2h0X2NyCisJCT0gKGltZy0+aGVpZ2h0ID4+IDEpOworCX0KKworCWltZy0+UGljV2lkdGhJbk1icyAgPSBpbWctPndpZHRoIC8gTUlOX0NVX1NJWkU7CisJaW1nLT5QaWNIZWlnaHRJbk1icyA9IGltZy0+aGVpZ2h0IC8gTUlOX0NVX1NJWkU7CisJaW1nLT5QaWNTaXplSW5NYnMgICA9IGltZy0+UGljV2lkdGhJbk1icyAqIGltZy0+UGljSGVpZ2h0SW5NYnM7CisJaW1nLT5idWZfY3ljbGUgICAgICA9IGlucHV0LT5idWZfY3ljbGUgKyAxOworCWltZy0+bWF4X21iX25yICAgICAgPSAoaW1nLT53aWR0aCAqIGltZy0+aGVpZ2h0KQorCQkvIChNSU5fQ1VfU0laRSAqIE1JTl9DVV9TSVpFKTsKKworI2lmZGVmIEFNTAorYXZzMl9kZWMtPmxjdV9zaXplID0KKwlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLmxjdV9zaXplLCAibGN1X3NpemUiKTsKK2F2czJfZGVjLT5sY3Vfc2l6ZSA9IDE8PChhdnMyX2RlYy0+bGN1X3NpemUpOworI2VuZGlmCitoYy0+c2VxX2hlYWRlcisrOworfQorCisKK3ZvaWQgR2V0X0lfUGljdHVyZV9IZWFkZXIoc3RydWN0IGF2czJfZGVjb2RlciAqYXZzMl9kZWMpCit7CisJc3RydWN0IEltYWdlUGFyYW1ldGVyc19zICAgICppbWcgPSAmYXZzMl9kZWMtPmltZzsKKwlzdHJ1Y3QgVmlkZW9fRGVjX2RhdGFfcyAqaGQgPSAmYXZzMl9kZWMtPmhkOworCXVuaW9uIHBhcmFtX3UgKnJwbV9wYXJhbSA9ICZhdnMyX2RlYy0+cGFyYW07CisKKyNpZiBSRDE1MDFfRklYX0JHIC8qLy9Mb25nZmVpLldhbmdAbWVkaWF0ZWsuY29tKi8KKwloZC0+YmFja2dyb3VuZF9waWN0dXJlX2ZsYWcgPSAwOworCWhkLT5iYWNrZ3JvdW5kX3BpY3R1cmVfb3V0cHV0X2ZsYWcgPSAwOworCWltZy0+dHlwZWIgPSAwOworI2VuZGlmCisKKwloZC0+dGltZV9jb2RlX2ZsYWcgICAgICAgPQorCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLnRpbWVfY29kZV9mbGFnLAorCQkidGltZV9jb2RlX2ZsYWciKTsKKworCWlmIChoZC0+dGltZV9jb2RlX2ZsYWcpIHsKKwkJaGQtPnRpbWVfY29kZSAgICAgICAgPQorCQkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC50aW1lX2NvZGUsCisJCQkidGltZV9jb2RlIik7CisJfQorCWlmIChoZC0+YmFja2dyb3VuZF9waWN0dXJlX2VuYWJsZSkgeworCQloZC0+YmFja2dyb3VuZF9waWN0dXJlX2ZsYWcgPQorCQkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5iYWNrZ3JvdW5kX3BpY3R1cmVfZmxhZywKKwkJCSJiYWNrZ3JvdW5kX3BpY3R1cmVfZmxhZyIpOworCisJCWlmIChoZC0+YmFja2dyb3VuZF9waWN0dXJlX2ZsYWcpIHsKKwkJCWltZy0+dHlwZWIgPQorCQkJCUJBQ0tHUk9VTkRfSU1HOworCQl9IGVsc2UgeworCQkJaW1nLT50eXBlYiA9IDA7CisJCX0KKworCQlpZiAoaW1nLT50eXBlYiA9PSBCQUNLR1JPVU5EX0lNRykgeworCQkJaGQtPmJhY2tncm91bmRfcGljdHVyZV9vdXRwdXRfZmxhZyA9CisJCQkJZ2V0X3BhcmFtKAorCQkJCXJwbV9wYXJhbS0+cC5iYWNrZ3JvdW5kX3BpY3R1cmVfb3V0cHV0X2ZsYWcsCisJCQkJImJhY2tncm91bmRfcGljdHVyZV9vdXRwdXRfZmxhZyIpOworCQl9CisJfQorCisKKwl7CisJCWltZy0+Y29kaW5nX29yZGVyICAgICAgICAgPQorCQkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5jb2Rpbmdfb3JkZXIsCisJCQkiY29kaW5nX29yZGVyIik7CisKKworCisjaWYgTTM0ODBfVEVNUE9SQUxfU0NBTEFCTEUKKwkJaWYgKGhkLT50ZW1wb3JhbF9pZF9leGlzdF9mbGFnID09IDEpIHsKKwkJCWhkLT5jdXJfbGF5ZXIgPQorCQkJCWdldF9wYXJhbShycG1fcGFyYW0tPnAuY3VyX2xheWVyLAorCQkJCSJ0ZW1wb3JhbF9pZCIpOworCQl9CisjZW5kaWYKKyNpZiBSRDE1MDFfRklYX0JHICAvKkxvbmdmZWkuV2FuZ0BtZWRpYXRlay5jb20qLworCQlpZiAoaGQtPmxvd19kZWxheSA9PSAwCisJCQkmJiAhKGhkLT5iYWNrZ3JvdW5kX3BpY3R1cmVfZmxhZyAmJgorCQkhaGQtPmJhY2tncm91bmRfcGljdHVyZV9vdXRwdXRfZmxhZykpIHsgLypjZHAqLworI2Vsc2UKKwkJCWlmIChoZC0+bG93X2RlbGF5ID09IDAgJiYKKwkJCSAgICAhKGhkLT5iYWNrZ3JvdW5kX3BpY3R1cmVfZW5hYmxlICYmCisJCQkgICAgICAhaGQtPmJhY2tncm91bmRfcGljdHVyZV9vdXRwdXRfZmxhZykpIHsgLypjZHAqLworI2VuZGlmCisJCQkJaGQtPmRpc3BsYXlkZWxheSA9CisJCQkJCWdldF9wYXJhbShycG1fcGFyYW0tPnAuZGlzcGxheWRlbGF5LAorCQkJCQkicGljdHVyZV9vdXRwdXRfZGVsYXkiKTsKKwkJCX0KKworCQl9CisJCXsKKwkJCWludDMyX3QgUlBTX2lkeDsvKiA9IChpbWctPmNvZGluZ19vcmRlci0xKSAlIGdvcF9zaXplOyovCisJCQlpbnQzMl90IHByZWRpY3Q7CisJCQlpbnQzMl90IGo7CisJCQlwcmVkaWN0ID0KKwkJCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLnByZWRpY3QsCisJCQkJInVzZSBSQ1MgaW4gU1BTIik7CisJCQkvKmlmIChwcmVkaWN0KSB7Ki8KKwkJCVJQU19pZHggPQorCQkJCWdldF9wYXJhbShycG1fcGFyYW0tPnAuUlBTX2lkeCwKKwkJCQkicHJlZGljdCBmb3IgUkNTIik7CisJCQkvKiAgICBoZC0+Y3Vycl9SUFMgPSBoZC0+ZGVjb2RfUlBTW1JQU19pZHhdOyovCisJCQkvKn0gZWxzZSB7Ki8KKwkJCS8qZ29wIHNpemUxNiovCisJCQloZC0+Y3Vycl9SUFMucmVmZXJkX2J5X290aGVycyA9CisJCQkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5yZWZlcmRfYnlfb3RoZXJzX2N1ciwKKwkJCQkicmVmZXJlZCBieSBvdGhlcnMiKTsKKwkJCWhkLT5jdXJyX1JQUy5udW1fb2ZfcmVmID0KKwkJCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLm51bV9vZl9yZWZfY3VyLAorCQkJCSJudW0gb2YgcmVmZXJlbmNlIHBpY3R1cmUiKTsKKwkJCWZvciAoaiA9IDA7IGogPCBoZC0+Y3Vycl9SUFMubnVtX29mX3JlZjsgaisrKSB7CisJCQkJaGQtPmN1cnJfUlBTLnJlZl9waWNbal0gPQorCQkJCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLnJlZl9waWNfY3VyW2pdLAorCQkJCQkiZGVsdGEgQ09JIG9mIHJlZiBwaWMiKTsKKwkJCX0KKwkJCWhkLT5jdXJyX1JQUy5udW1fdG9fcmVtb3ZlID0KKwkJCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLm51bV90b19yZW1vdmVfY3VyLAorCQkJCSJudW0gb2YgcmVtb3ZlZCBwaWN0dXJlIik7CisjaWZkZWYgU0FOSVRZX0NIRUNLCisJCQlpZiAoaGQtPmN1cnJfUlBTLm51bV90b19yZW1vdmUgPiBNQVhSRUYpCXsKKwkJCQloZC0+Y3Vycl9SUFMubnVtX3RvX3JlbW92ZSA9IE1BWFJFRjsKKwkJCQlwcl9pbmZvKCJXYXJuaW5nLCAlczogbnVtX3RvX3JlbW92ZSAlZCBiZXlvbmQgcmFuZ2UsIGZvcmNlIHRvIE1BWFJFRlxuIiwKKwkJCQkJX19mdW5jX18sIGhkLT5jdXJyX1JQUy5udW1fdG9fcmVtb3ZlKTsKKwkJCX0KKyNlbmRpZgorCisJCQlmb3IgKGogPSAwOyBqIDwgaGQtPmN1cnJfUlBTLm51bV90b19yZW1vdmU7IGorKykgeworCQkJCWhkLT5jdXJyX1JQUy5yZW1vdmVfcGljW2pdID0KKwkJCQkJZ2V0X3BhcmFtKAorCQkJCQlycG1fcGFyYW0tPnAucmVtb3ZlX3BpY19jdXJbal0sCisJCQkJCSJkZWx0YSBDT0kgb2YgcmVtb3ZlZCBwaWMiKTsKKwkJCX0KKwkJCS8qdV92KDEsICJtYXJrZXIgYml0Iik7Ki8KKworCQkJLyp9Ki8KKwkJfQorCQkvKnh5amkgMTIuMjMqLworCQlpZiAoaGQtPmxvd19kZWxheSkgeworCQkJLyp1ZV92KAorCQkJImJidiBjaGVjayB0aW1lcyIpOyovCisJCX0KKworCQloZC0+cHJvZ3Jlc3NpdmVfZnJhbWUgPQorCQkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5wcm9ncmVzc2l2ZV9mcmFtZSwKKwkJCSJwcm9ncmVzc2l2ZV9mcmFtZSIpOworCisJCWlmICghaGQtPnByb2dyZXNzaXZlX2ZyYW1lKSB7CisJCQlpbWctPnBpY3R1cmVfc3RydWN0dXJlICAgPQorCQkJCWdldF9wYXJhbShycG1fcGFyYW0tPnAucGljdHVyZV9zdHJ1Y3R1cmUsCisJCQkJInBpY3R1cmVfc3RydWN0dXJlIik7CisJCX0gZWxzZSB7CisJCQlpbWctPnBpY3R1cmVfc3RydWN0dXJlCisJCQkJPSAxOworCQl9CisKKwkJaGQtPnRvcF9maWVsZF9maXJzdCA9CisJCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLnRvcF9maWVsZF9maXJzdCwKKwkJCSJ0b3BfZmllbGRfZmlyc3QiKTsKKwkJaGQtPnJlcGVhdF9maXJzdF9maWVsZCA9CisJCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLnJlcGVhdF9maXJzdF9maWVsZCwKKwkJCSJyZXBlYXRfZmlyc3RfZmllbGQiKTsKKyNpZiBJTlRFUkxBQ0VfQ09ESU5HCisJCWlmIChoZC0+aXNfZmllbGRfc2VxdWVuY2UpIHsKKwkJCWhkLT5pc190b3BfZmllbGQgICAgICAgICA9CisJCQkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5pc190b3BfZmllbGQsCisJCQkJImlzX3RvcF9maWVsZCIpOworI2lmIEhBTEZfUElYRUxfQ09NUEVOU0FUSU9OIHx8IEhBTEZfUElYRUxfQ0hST01BCisJCQlpbWctPmlzX3RvcF9maWVsZCAgICAgICA9IGhkLT5pc190b3BfZmllbGQ7CisjZW5kaWYKKwkJfQorI2VuZGlmCisKKworCWltZy0+cXAgICAgICAgICAgICAgICAgPSBoZC0+cGljdHVyZV9xcDsKKworCWltZy0+dHlwZSAgICAgICAgICAgICAgPSBJX0lNRzsKKworfQorCisvKgorICogRnVuY3Rpb246cGIgcGljdHVyZSBoZWFkZXIKKyAqIElucHV0OgorICogT3V0cHV0OgorICogUmV0dXJuOgorICogQXR0ZW50aW9uOgorICovCisKK3ZvaWQgR2V0X1BCX1BpY3R1cmVfSGVhZGVyKHN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjKQoreworCXN0cnVjdCBJbWFnZVBhcmFtZXRlcnNfcyAgICAqaW1nID0gJmF2czJfZGVjLT5pbWc7CisJc3RydWN0IFZpZGVvX0RlY19kYXRhX3MgKmhkID0gJmF2czJfZGVjLT5oZDsKKwl1bmlvbiBwYXJhbV91ICpycG1fcGFyYW0gPSAmYXZzMl9kZWMtPnBhcmFtOworCisKKwkvKnVfdigzMiwgImJidiBkZWxheSIpOyovCisKKwloZC0+cGljdHVyZV9jb2RpbmdfdHlwZSAgICAgICAgICAgICAgICA9CisJCWdldF9wYXJhbShycG1fcGFyYW0tPnAucGljdHVyZV9jb2RpbmdfdHlwZSwKKwkJInBpY3R1cmVfY29kaW5nX3R5cGUiKTsKKworCWlmIChoZC0+YmFja2dyb3VuZF9waWN0dXJlX2VuYWJsZSAmJgorCQkoaGQtPnBpY3R1cmVfY29kaW5nX3R5cGUgPT0gMSB8fAorCQkJaGQtPnBpY3R1cmVfY29kaW5nX3R5cGUgPT0gMykpIHsKKwkJaWYgKGhkLT5waWN0dXJlX2NvZGluZ190eXBlID09IDEpIHsKKwkJCWhkLT5iYWNrZ3JvdW5kX3ByZWRfZmxhZyAgICAgICA9CisJCQkJZ2V0X3BhcmFtKAorCQkJCXJwbV9wYXJhbS0+cC5iYWNrZ3JvdW5kX3ByZWRfZmxhZywKKwkJCQkiYmFja2dyb3VuZF9wcmVkX2ZsYWciKTsKKwkJfSBlbHNlIHsKKwkJCWhkLT5iYWNrZ3JvdW5kX3ByZWRfZmxhZyA9IDA7CisJCX0KKwkJaWYgKGhkLT5iYWNrZ3JvdW5kX3ByZWRfZmxhZyA9PSAwKSB7CisKKwkJCWhkLT5iYWNrZ3JvdW5kX3JlZmVyZW5jZV9lbmFibGUgPQorCQkJCWdldF9wYXJhbSgKKwkJCQlycG1fcGFyYW0tPgorCQkJCXAuYmFja2dyb3VuZF9yZWZlcmVuY2VfZW5hYmxlLAorCQkJCSJiYWNrZ3JvdW5kX3JlZmVyZW5jZV9lbmFibGUiKTsKKworCQl9IGVsc2UgeworI2lmIFJEMTcwX0ZJWF9CRworCQkJaGQtPmJhY2tncm91bmRfcmVmZXJlbmNlX2VuYWJsZSA9IDE7CisjZWxzZQorCQkJaGQtPmJhY2tncm91bmRfcmVmZXJlbmNlX2VuYWJsZSA9IDA7CisjZW5kaWYKKwkJfQorCisJfSBlbHNlIHsKKwkJaGQtPmJhY2tncm91bmRfcHJlZF9mbGFnID0gMDsKKwkJaGQtPmJhY2tncm91bmRfcmVmZXJlbmNlX2VuYWJsZSA9IDA7CisJfQorCisKKworCWlmIChoZC0+cGljdHVyZV9jb2RpbmdfdHlwZSA9PSAxKSB7CisJCWltZy0+dHlwZSA9CisJCQlQX0lNRzsKKwl9IGVsc2UgaWYgKGhkLT5waWN0dXJlX2NvZGluZ190eXBlID09IDMpIHsKKwkJaW1nLT50eXBlID0KKwkJCUZfSU1HOworCX0gZWxzZSB7CisJCWltZy0+dHlwZSA9CisJCQlCX0lNRzsKKwl9CisKKworCWlmIChoZC0+cGljdHVyZV9jb2RpbmdfdHlwZSA9PSAxICYmCisJCWhkLT5iYWNrZ3JvdW5kX3ByZWRfZmxhZykgeworCQlpbWctPnR5cGViID0gQlBfSU1HOworCX0gZWxzZSB7CisJCWltZy0+dHlwZWIgPSAwOworCX0KKworCisJeworCQlpbWctPmNvZGluZ19vcmRlciAgICAgICAgID0KKwkJCWdldF9wYXJhbSgKKwkJCXJwbV9wYXJhbS0+cC5jb2Rpbmdfb3JkZXIsCisJCQkiY29kaW5nX29yZGVyIik7CisKKworI2lmIE0zNDgwX1RFTVBPUkFMX1NDQUxBQkxFCisJCWlmIChoZC0+dGVtcG9yYWxfaWRfZXhpc3RfZmxhZyA9PSAxKSB7CisJCQloZC0+Y3VyX2xheWVyID0KKwkJCQlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLmN1cl9sYXllciwKKwkJCQkidGVtcG9yYWxfaWQiKTsKKwkJfQorI2VuZGlmCisKKwkJaWYgKGhkLT5sb3dfZGVsYXkgPT0gMCkgeworCQkJaGQtPmRpc3BsYXlkZWxheSAgICAgID0KKwkJCWdldF9wYXJhbShycG1fcGFyYW0tPnAuZGlzcGxheWRlbGF5LAorCQkJImRpc3BsYXlkZWxheSIpOworCQl9CisJfQorCXsKKwkJaW50MzJfdCBSUFNfaWR4Oy8qID0gKGltZy0+Y29kaW5nX29yZGVyLTEpICUgZ29wX3NpemU7Ki8KKwkJaW50MzJfdCBwcmVkaWN0OworCQlwcmVkaWN0ICAgID0KKwkJCWdldF9wYXJhbShycG1fcGFyYW0tPnAucHJlZGljdCwKKwkJCSJ1c2UgUlBTIGluIFNQUyIpOworCQlpZiAocHJlZGljdCkgeworCQkJUlBTX2lkeCA9CisJCQkJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5SUFNfaWR4LAorCQkJCSJwcmVkaWN0IGZvciBSUFMiKTsKKwkJCWhkLT5jdXJyX1JQUyA9IGhkLT5kZWNvZF9SUFNbUlBTX2lkeF07CisJCX0gLyplbHNlKi8KKwkJeworCQkJLypnb3Agc2l6ZTE2Ki8KKwkJCWludDMyX3QgajsKKwkJCWhkLT5jdXJyX1JQUy5yZWZlcmRfYnlfb3RoZXJzID0KKwkJCQlnZXRfcGFyYW0oCisJCQkJcnBtX3BhcmFtLT5wLnJlZmVyZF9ieV9vdGhlcnNfY3VyLAorCQkJCSJyZWZlcmVkIGJ5IG90aGVycyIpOworCQkJaGQtPmN1cnJfUlBTLm51bV9vZl9yZWYgPQorCQkJCWdldF9wYXJhbSgKKwkJCQlycG1fcGFyYW0tPnAubnVtX29mX3JlZl9jdXIsCisJCQkJIm51bSBvZiByZWZlcmVuY2UgcGljdHVyZSIpOworCQkJZm9yIChqID0gMDsgaiA8IGhkLT5jdXJyX1JQUy5udW1fb2ZfcmVmOyBqKyspIHsKKwkJCQloZC0+Y3Vycl9SUFMucmVmX3BpY1tqXSA9CisJCQkJCWdldF9wYXJhbSgKKwkJCQkJcnBtX3BhcmFtLT5wLnJlZl9waWNfY3VyW2pdLAorCQkJCQkiZGVsdGEgQ09JIG9mIHJlZiBwaWMiKTsKKwkJCX0KKwkJCWhkLT5jdXJyX1JQUy5udW1fdG9fcmVtb3ZlID0KKwkJCQlnZXRfcGFyYW0oCisJCQkJcnBtX3BhcmFtLT5wLm51bV90b19yZW1vdmVfY3VyLAorCQkJCSJudW0gb2YgcmVtb3ZlZCBwaWN0dXJlIik7CisjaWZkZWYgU0FOSVRZX0NIRUNLCisJCQlpZiAoaGQtPmN1cnJfUlBTLm51bV90b19yZW1vdmUgPiBNQVhSRUYpCXsKKwkJCQloZC0+Y3Vycl9SUFMubnVtX3RvX3JlbW92ZSA9IE1BWFJFRjsKKwkJCQlwcl9pbmZvKCJXYXJuaW5nLCAlczogbnVtX3RvX3JlbW92ZSAlZCBiZXlvbmQgcmFuZ2UsIGZvcmNlIHRvIE1BWFJFRlxuIiwKKwkJCQkJX19mdW5jX18sIGhkLT5jdXJyX1JQUy5udW1fdG9fcmVtb3ZlKTsKKwkJCX0KKyNlbmRpZgorCQkJZm9yIChqID0gMDsKKwkJCQlqIDwgaGQtPmN1cnJfUlBTLm51bV90b19yZW1vdmU7IGorKykgeworCQkJCWhkLT5jdXJyX1JQUy5yZW1vdmVfcGljW2pdID0KKwkJCQlnZXRfcGFyYW0oCisJCQkJCXJwbV9wYXJhbS0+cC5yZW1vdmVfcGljX2N1cltqXSwKKwkJCQkJImRlbHRhIENPSSBvZiByZW1vdmVkIHBpYyIpOworCQkJfQorCQkJLyp1X3YoMSwgIm1hcmtlciBiaXQiKTsqLworCisJCX0KKwl9CisJLyp4eWppIDEyLjIzKi8KKwlpZiAoaGQtPmxvd19kZWxheSkgeworCQkvKnVlX3YoCisJCSJiYnYgY2hlY2sgdGltZXMiKTsqLworCX0KKworCWhkLT5wcm9ncmVzc2l2ZV9mcmFtZSAgICAgICA9CisJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5wcm9ncmVzc2l2ZV9mcmFtZSwKKwkJInByb2dyZXNzaXZlX2ZyYW1lIik7CisKKwlpZiAoIWhkLT5wcm9ncmVzc2l2ZV9mcmFtZSkgeworCQlpbWctPnBpY3R1cmVfc3RydWN0dXJlICA9CisJCWdldF9wYXJhbShycG1fcGFyYW0tPnAucGljdHVyZV9zdHJ1Y3R1cmUsCisJCQkicGljdHVyZV9zdHJ1Y3R1cmUiKTsKKwl9IGVsc2UgeworCQlpbWctPnBpY3R1cmVfc3RydWN0dXJlICA9IDE7CisJfQorCisJaGQtPnRvcF9maWVsZF9maXJzdCAgICAgICAgID0KKwlnZXRfcGFyYW0ocnBtX3BhcmFtLT5wLnRvcF9maWVsZF9maXJzdCwKKwkJInRvcF9maWVsZF9maXJzdCIpOworCWhkLT5yZXBlYXRfZmlyc3RfZmllbGQgICAgICA9CisJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5yZXBlYXRfZmlyc3RfZmllbGQsCisJCSJyZXBlYXRfZmlyc3RfZmllbGQiKTsKKyNpZiBJTlRFUkxBQ0VfQ09ESU5HCisJaWYgKGhkLT5pc19maWVsZF9zZXF1ZW5jZSkgeworCQloZC0+aXNfdG9wX2ZpZWxkICAgICAgICA9CisJCWdldF9wYXJhbShycG1fcGFyYW0tPnAuaXNfdG9wX2ZpZWxkLAorCQkJImlzX3RvcF9maWVsZCIpOworI2lmIEhBTEZfUElYRUxfQ09NUEVOU0FUSU9OIHx8IEhBTEZfUElYRUxfQ0hST01BCisJCWltZy0+aXNfdG9wX2ZpZWxkID0gaGQtPmlzX3RvcF9maWVsZDsKKyNlbmRpZgorCQkvKnVfdigxLCAicmVzZXJ2ZWQgYml0IGZvciBpbnRlcmxhY2UgY29kaW5nIik7Ki8KKwl9CisjZW5kaWYKKworI2lmIENoZWNrX0JpdHN0cmVhbQorCS8qYXNzZXJ0KGhkLT5waWN0dXJlX3FwPj0wJiZoZC0+cGljdHVyZV9xcDw9KDYzICsgOCAqCisJICAoaW5wdXQtPnNhbXBsZV9iaXRfZGVwdGggLSA4KSkpOyovCisjZW5kaWYKKworCWltZy0+cmFuZG9tX2FjY2Vzc19kZWNvZGFibGVfZmxhZyA9CisJZ2V0X3BhcmFtKHJwbV9wYXJhbS0+cC5yYW5kb21fYWNjZXNzX2RlY29kYWJsZV9mbGFnLAorCQkicmFuZG9tX2FjY2Vzc19kZWNvZGFibGVfZmxhZyIpOworCisJaW1nLT5xcCAgICAgICAgICAgICAgICA9IGhkLT5waWN0dXJlX3FwOworfQorCisKKworCit2b2lkIGNhbGNfcGljdHVyZV9kaXN0YW5jZShzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYykKK3sKKwlzdHJ1Y3QgSW1hZ2VQYXJhbWV0ZXJzX3MgICAgKmltZyA9ICZhdnMyX2RlYy0+aW1nOworCXN0cnVjdCBWaWRlb19Db21fZGF0YV9zICpoYyA9ICZhdnMyX2RlYy0+aGM7CisJc3RydWN0IFZpZGVvX0RlY19kYXRhX3MgKmhkID0gJmF2czJfZGVjLT5oZDsKKwkvKgorCXVuaW9uIHBhcmFtX3UgKnJwbV9wYXJhbSA9ICZhdnMyX2RlYy0+cGFyYW07CisKKwlmb3IgUE9DIG1vZGUgMDoKKwl1aW50MzJfdCAgICAgICAgTWF4UGljRGlzdGFuY2VMc2IgPSAoMSA8PCA4KTsKKwkgKi8KKwlpZiAoaW1nLT5jb2Rpbmdfb3JkZXIgIDwgIGltZy0+UHJldlBpY0Rpc3RhbmNlTHNiKQorCisJeworCQlpbnQzMl90IGksIGo7CisKKwkJaGMtPnRvdGFsX2ZyYW1lcysrOworCQlmb3IgKGkgPSAwOyBpIDwgYXZzMl9kZWMtPnJlZl9tYXhidWZmZXI7IGkrKykgeworCQkJaWYgKAorCQkJCWF2czJfZGVjLT5mcmVmW2ldLT5pbWd0cl9md1JlZkRpc3RhbmNlCisJCQkJPj0gMCkgeworCQkJCWF2czJfZGVjLT5mcmVmW2ldLT4KKwkJCQlpbWd0cl9md1JlZkRpc3RhbmNlIC09IDI1NjsKKwkJCQlhdnMyX2RlYy0+ZnJlZltpXS0+CisJCQkJaW1nY29pX3JlZiAtPSAyNTY7CisJCQl9CisjaWYgUkQxNzBfRklYX0JHCisJZm9yIChqID0gMDsgaiA8IE1BWFJFRjsgaisrKSB7CisjZWxzZQorCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisjZW5kaWYKKwkJCWF2czJfZGVjLT5mcmVmW2ldLT5yZWZfcG9jW2pdIC09IDI1NjsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgYXZzMl9kZWMtPm91dHByaW50LmJ1ZmZlcl9udW07IGkrKykgeworCQlhdnMyX2RlYy0+b3V0cHJpbnQuc3Rkb3V0ZGF0YVtpXS5mcmFtZW51bSAtPSAyNTY7CisJCWF2czJfZGVjLT5vdXRwcmludC5zdGRvdXRkYXRhW2ldLnRyIC09IDI1NjsKKwl9CisKKwloZC0+bGFzdF9vdXRwdXQgLT0gMjU2OworCWhkLT5jdXJyX0lEUnRyIC09IDI1NjsKKwloZC0+Y3Vycl9JRFJjb2kgLT0gMjU2OworCWhkLT5uZXh0X0lEUnRyIC09IDI1NjsKKwloZC0+bmV4dF9JRFJjb2kgLT0gMjU2OworCX0KKwlpZiAoaGQtPmxvd19kZWxheSA9PSAwKSB7CisJCWltZy0+dHIgPSBpbWctPmNvZGluZ19vcmRlciArCisJCWhkLT5kaXNwbGF5ZGVsYXkgLSBoZC0+cGljdHVyZV9yZW9yZGVyX2RlbGF5OworCX0gZWxzZSB7CisJCWltZy0+dHIgPQorCQlpbWctPmNvZGluZ19vcmRlcjsKKwl9CisKKyNpZiBSRU1PVkVfVU5VU0VECisJaW1nLT5waWNfZGlzdGFuY2UgPSBpbWctPnRyOworI2Vsc2UKKwlpbWctPnBpY19kaXN0YW5jZSA9IGltZy0+dHIgJSAyNTY7CisjZW5kaWYKKwloYy0+cGljdHVyZV9kaXN0YW5jZSA9IGltZy0+cGljX2Rpc3RhbmNlOworCit9CisKK2ludDMyX3QgYXZzMl9pbml0X2dsb2JhbF9idWZmZXJzKHN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjKQoreworCXN0cnVjdCBpbnBfcGFyICAgICppbnB1dCA9ICZhdnMyX2RlYy0+aW5wdXQ7CisJc3RydWN0IEltYWdlUGFyYW1ldGVyc19zICAgICppbWcgPSAmYXZzMl9kZWMtPmltZzsKKwlzdHJ1Y3QgVmlkZW9fQ29tX2RhdGFfcyAqaGMgPSAmYXZzMl9kZWMtPmhjOworCisJaW50MzJfdCByZWZudW07CisKKwlpbnQzMl90IG1lbW9yeV9zaXplID0gMDsKKwkvKgoraW50MzJfdCBpbWdfaGVpZ2h0ID0gKGhkLT52ZXJ0aWNhbF9zaXplICsgaW1nLT5hdXRvX2Nyb3BfYm90dG9tKTsKKwkgKi8KKwlpbWctPmJ1Zl9jeWNsZSA9IGlucHV0LT5idWZfY3ljbGUgKyAxOworCisJaW1nLT5idWZfY3ljbGUgKj0gMjsKKworCWhjLT5iYWNrZ3JvdW5kX3JlZiA9IGhjLT5iYWNrZ3JvdW5kUmVmZXJlbmNlRnJhbWU7CisKKwlmb3IgKHJlZm51bSA9IDA7IHJlZm51bSA8IFJFRl9NQVhCVUZGRVI7IHJlZm51bSsrKSB7CisJCWF2czJfZGVjLT5mcmVmW3JlZm51bV0gPSAmYXZzMl9kZWMtPmZybV9wb29sW3JlZm51bV07CisKKwkJLyovL2F2czJfZGVjLT5mcmVmW2ldIG1lbW9yeSBhbGxvY2F0aW9uKi8KKwkJaWYgKGlzX2F2czJfcHJpbnRfYnVmbWdyX2RldGFpbCgpKQorCQkJcHJfaW5mbygiW3RdIGF2czJfZGVjLT5mcmVmWyVkXUAweCVwXG4iLAorCQkJcmVmbnVtLCBhdnMyX2RlYy0+ZnJlZltyZWZudW1dKTsKKwkJYXZzMl9kZWMtPmZyZWZbcmVmbnVtXS0+aW1nY29pX3JlZiA9IC0yNTc7CisJCWF2czJfZGVjLT5mcmVmW3JlZm51bV0tPmlzX291dHB1dCA9IC0xOworCQlhdnMyX2RlYy0+ZnJlZltyZWZudW1dLT5yZWZlcmVkX2J5X290aGVycyA9IC0xOworCQlhdnMyX2RlYy0+ZnJlZltyZWZudW1dLT4KKwkJCWltZ3RyX2Z3UmVmRGlzdGFuY2UgPSAtMjU2OworCQlpbml0X2ZyYW1lX3QoYXZzMl9kZWMtPmZyZWZbcmVmbnVtXSk7CisjaWZkZWYgQU1MCisJCWF2czJfZGVjLT5mcmVmW3JlZm51bV0tPmluZGV4ID0gcmVmbnVtOworI2VuZGlmCisJfQorI2lmZGVmIEFNTAorCWF2czJfZGVjLT5mX2JnID0gTlVMTDsKKworCWF2czJfZGVjLT5tX2JnID0gJmF2czJfZGVjLT5mcm1fcG9vbFtSRUZfTUFYQlVGRkVSXTsKKwkJLyovLy9hdnMyX2RlYy0+ZnJlZltpXSBtZW1vcnkgYWxsb2NhdGlvbiovCisJaWYgKGlzX2F2czJfcHJpbnRfYnVmbWdyX2RldGFpbCgpKQorCQlwcl9pbmZvKCJbdF0gYXZzMl9kZWMtPm1fYmdAMHglcFxuIiwKKwkJYXZzMl9kZWMtPm1fYmcpOworCWF2czJfZGVjLT5tX2JnLT5pbWdjb2lfcmVmID0gLTI1NzsKKwlhdnMyX2RlYy0+bV9iZy0+aXNfb3V0cHV0ID0gLTE7CisJYXZzMl9kZWMtPm1fYmctPnJlZmVyZWRfYnlfb3RoZXJzID0gLTE7CisJYXZzMl9kZWMtPm1fYmctPmltZ3RyX2Z3UmVmRGlzdGFuY2UgPSAtMjU2OworCWluaXRfZnJhbWVfdChhdnMyX2RlYy0+bV9iZyk7CisJYXZzMl9kZWMtPm1fYmctPmluZGV4ID0gcmVmbnVtOworI2VuZGlmCisKKyNpZiBCQ0JSCisJLyppbml0IEJDQlIgcmVsYXRlZCovCisJaW1nLT5pTnVtQ1VzSW5GcmFtZSA9CisJCSgoaW1nLT53aWR0aCArIE1BWF9DVV9TSVpFIC0gMSkgLyBNQVhfQ1VfU0laRSkKKwkJKiAoKGltZy0+aGVpZ2h0ICsgTUFYX0NVX1NJWkUgLSAxKQorCQkvIE1BWF9DVV9TSVpFKTsKKwkvKmltZy0+QkxDVWlkeCA9ICAoaW50MzJfdCopIGNhbGxvYygKKwkgIGltZy0+aU51bUNVc0luRnJhbWUsIHNpemVvZihpbnQzMl90KSk7Ki8KKwkvKm1lbXNldCggaW1nLT5CTENVaWR4LCAwLCBpbWctPmlOdW1DVXNJbkZyYW1lKTsqLworI2VuZGlmCisJcmV0dXJuIG1lbW9yeV9zaXplOworfQorCisjaWZkZWYgQU1MCitzdGF0aWMgdm9pZCBmcmVlX3VudXNlZF9idWZmZXJzKHN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjKQoreworCXN0cnVjdCBpbnBfcGFyICAgICppbnB1dCA9ICZhdnMyX2RlYy0+aW5wdXQ7CisJc3RydWN0IEltYWdlUGFyYW1ldGVyc19zICAgICppbWcgPSAmYXZzMl9kZWMtPmltZzsKKwlzdHJ1Y3QgVmlkZW9fQ29tX2RhdGFfcyAqaGMgPSAmYXZzMl9kZWMtPmhjOworCisJaW50MzJfdCByZWZudW07CisKKwlpbWctPmJ1Zl9jeWNsZSA9IGlucHV0LT5idWZfY3ljbGUgKyAxOworCisJaW1nLT5idWZfY3ljbGUgKj0gMjsKKworCWhjLT5iYWNrZ3JvdW5kX3JlZiA9IGhjLT5iYWNrZ3JvdW5kUmVmZXJlbmNlRnJhbWU7CisKKwlmb3IgKHJlZm51bSA9IDA7IHJlZm51bSA8IFJFRl9NQVhCVUZGRVI7IHJlZm51bSsrKSB7CisjaWZuZGVmIE5PX0RJU1BMQVkKKwkJaWYgKGF2czJfZGVjLT5mcmVmW3JlZm51bV0tPnZmX3JlZiA+IDAgfHwKKwkJCWF2czJfZGVjLT5mcmVmW3JlZm51bV0tPnRvX3ByZXBhcmVfZGlzcCkKKwkJCWNvbnRpbnVlOworI2VuZGlmCisJCWlmIChpc19hdnMyX3ByaW50X2J1Zm1ncl9kZXRhaWwoKSkKKwkJCXByX2luZm8oIiVzW3RdIGF2czJfZGVjLT5mcmVmWyVkXUAweCVwXG4iLAorCQkJX19mdW5jX18sIHJlZm51bSwgYXZzMl9kZWMtPmZyZWZbcmVmbnVtXSk7CisJCWF2czJfZGVjLT5mcmVmW3JlZm51bV0tPmltZ2NvaV9yZWYgPSAtMjU3OworCQlhdnMyX2RlYy0+ZnJlZltyZWZudW1dLT5pc19vdXRwdXQgPSAtMTsKKwkJYXZzMl9kZWMtPmZyZWZbcmVmbnVtXS0+cmVmZXJlZF9ieV9vdGhlcnMgPSAtMTsKKwkJYXZzMl9kZWMtPmZyZWZbcmVmbnVtXS0+CisJCQlpbWd0cl9md1JlZkRpc3RhbmNlID0gLTI1NjsKKwkJbWVtc2V0KGF2czJfZGVjLT5mcmVmW3JlZm51bV0tPnJlZl9wb2MsIDAsCisJCQlzaXplb2YoYXZzMl9kZWMtPmZyZWZbcmVmbnVtXS0+cmVmX3BvYykpOworCX0KKwlhdnMyX2RlYy0+Zl9iZyA9IE5VTEw7CisKKwlpZiAoaXNfYXZzMl9wcmludF9idWZtZ3JfZGV0YWlsKCkpCisJCXByX2luZm8oIiVzW3RdIGF2czJfZGVjLT5tX2JnQDB4JXBcbiIsCisJCV9fZnVuY19fLCBhdnMyX2RlYy0+bV9iZyk7CisJYXZzMl9kZWMtPm1fYmctPmltZ2NvaV9yZWYgPSAtMjU3OworCWF2czJfZGVjLT5tX2JnLT5pc19vdXRwdXQgPSAtMTsKKwlhdnMyX2RlYy0+bV9iZy0+cmVmZXJlZF9ieV9vdGhlcnMgPSAtMTsKKwlhdnMyX2RlYy0+bV9iZy0+aW1ndHJfZndSZWZEaXN0YW5jZSA9IC0yNTY7CisJbWVtc2V0KGF2czJfZGVjLT5tX2JnLT5yZWZfcG9jLCAwLAorCQlzaXplb2YoYXZzMl9kZWMtPm1fYmctPnJlZl9wb2MpKTsKKworI2lmIEJDQlIKKwkvKmluaXQgQkNCUiByZWxhdGVkKi8KKwlpbWctPmlOdW1DVXNJbkZyYW1lID0KKwkJKChpbWctPndpZHRoICsgTUFYX0NVX1NJWkUgLSAxKSAvIE1BWF9DVV9TSVpFKQorCQkqICgoaW1nLT5oZWlnaHQgKyBNQVhfQ1VfU0laRSAtIDEpCisJCS8gTUFYX0NVX1NJWkUpOworCS8qaW1nLT5CTENVaWR4ID0gIChpbnQzMl90KikgY2FsbG9jKAorCSAgaW1nLT5pTnVtQ1VzSW5GcmFtZSwgc2l6ZW9mKGludDMyX3QpKTsqLworCS8qbWVtc2V0KCBpbWctPkJMQ1VpZHgsIDAsIGltZy0+aU51bUNVc0luRnJhbWUpOyovCisjZW5kaWYKK30KKyNlbmRpZgorCit2b2lkIGluaXRfZnJhbWVfdChzdHJ1Y3QgYXZzMl9mcmFtZV9zICpjdXJyZnJlZikKK3sKKwltZW1zZXQoY3VycmZyZWYsIDAsIHNpemVvZihzdHJ1Y3QgYXZzMl9mcmFtZV9zKSk7CisJY3VycmZyZWYtPmltZ2NvaV9yZWYgICAgICAgICAgPSAtMjU3OworCWN1cnJmcmVmLT5pc19vdXRwdXQgICAgICAgICAgID0gLTE7CisJY3VycmZyZWYtPnJlZmVyZWRfYnlfb3RoZXJzICAgPSAtMTsKKwljdXJyZnJlZi0+aW1ndHJfZndSZWZEaXN0YW5jZSA9IC0yNTY7CisJbWVtc2V0KGN1cnJmcmVmLT5yZWZfcG9jLCAwLCBzaXplb2YoY3VycmZyZWYtPnJlZl9wb2MpKTsKK30KKwordm9pZCBnZXRfcmVmZXJlbmNlX2xpc3RfaW5mbyhzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYywgaW50OF90ICpzdHIpCit7CisJc3RydWN0IEltYWdlUGFyYW1ldGVyc19zICAgICppbWcgPSAmYXZzMl9kZWMtPmltZzsKKwlzdHJ1Y3QgVmlkZW9fQ29tX2RhdGFfcyAqaGMgPSAmYXZzMl9kZWMtPmhjOworCisJaW50OF90IHN0cl90bXBbMTZdOworCWludDMyX3QgaTsKKwkvKiBpbnQzMl90IHBvYyA9IGhjLT5mX3JlYy0+aW1ndHJfZndSZWZEaXN0YW5jZTsKKwkgIGZyZWQuY2hpdUBtZWRpYXRlay5jb20qLworCisJaWYgKGltZy0+bnVtX29mX3JlZmVyZW5jZXMgPiAwKSB7CisJCXN0cmNweShzdHIsICJbIik7CisJCWZvciAoaSA9IDA7IGkgPCBpbWctPm51bV9vZl9yZWZlcmVuY2VzOyBpKyspIHsKKyNpZiBSRDE1MTBfRklYX0JHCisJCQlpZiAoaW1nLT50eXBlID09IEJfSU1HKSB7CisJCQkJc3ByaW50ZihzdHJfdG1wLCAiJTRkICAgICIsCisJCQkJCWhjLT5mX3JlYy0+CisJCQkJCXJlZl9wb2NbCisJCQkJCWltZy0+bnVtX29mX3JlZmVyZW5jZXMgLSAxIC0gaV0pOworCQkJfSBlbHNlIHsKKwkJCQlzcHJpbnRmKHN0cl90bXAsICIlNGQgICAgIiwKKwkJCQkJaGMtPmZfcmVjLT5yZWZfcG9jW2ldKTsKKwkJCX0KKyNlbHNlCisJCQlzcHJpbnRmKHN0cl90bXAsICIlNGQgICAgICIsCisJCQkJYXZzMl9kZWMtPmZyZWZbaV0tPmltZ3RyX2Z3UmVmRGlzdGFuY2UpOworI2VuZGlmCisKKwkJCXN0cl90bXBbNV0gPSAnXDAnOworCQkJc3RyY2F0KHN0ciwgc3RyX3RtcCk7CisJCX0KKwkJc3RyY2F0KHN0ciwgIl0iKTsKKwl9IGVsc2UgeworCQlzdHJbMF0gPSAnXDAnOworCX0KK30KKwordm9pZCBwcmVwYXJlX1JlZkluZm8oc3RydWN0IGF2czJfZGVjb2RlciAqYXZzMl9kZWMpCit7CisJc3RydWN0IEltYWdlUGFyYW1ldGVyc19zICAgICppbWcgPSAmYXZzMl9kZWMtPmltZzsKKwlzdHJ1Y3QgVmlkZW9fQ29tX2RhdGFfcyAqaGMgPSAmYXZzMl9kZWMtPmhjOworCXN0cnVjdCBWaWRlb19EZWNfZGF0YV9zICpoZCA9ICZhdnMyX2RlYy0+aGQ7CisKKwlpbnQzMl90IGksIGo7CisJaW50MzJfdCBpaTsKKwlzdHJ1Y3QgYXZzMl9mcmFtZV9zICp0bXBfZnJlZjsKKworCS8qdXBkYXRlIElEUiBmcmFtZSovCisJaWYgKGltZy0+dHIgPiBoZC0+bmV4dF9JRFJ0ciAmJiBoZC0+Y3Vycl9JRFJ0ciAhPSBoZC0+bmV4dF9JRFJ0cikgeworCQloZC0+Y3Vycl9JRFJ0ciAgPSBoZC0+bmV4dF9JRFJ0cjsKKwkJaGQtPmN1cnJfSURSY29pID0gaGQtPm5leHRfSURSY29pOworCX0KKwkvKiByZS1vcmRlciB0aGUgcmVmIGJ1ZmZlciBhY2NvcmRpbmcgdG8gUlBTKi8KKwlpbWctPm51bV9vZl9yZWZlcmVuY2VzID0gaGQtPmN1cnJfUlBTLm51bV9vZl9yZWY7CisKKyNpZiAxCisJLypyYWluKi8KKwlpZiAoaXNfYXZzMl9wcmludF9idWZtZ3JfZGV0YWlsKCkpIHsKKwkJcHJfaW5mbygiJXM6IGNvZGluZ19vcmRlciBpcyAlZCwgY3Vycl9JRFJjb2kgaXMgJWRcbiIsCisJCV9fZnVuY19fLCBpbWctPmNvZGluZ19vcmRlciwgaGQtPmN1cnJfSURSY29pKTsKKwkJZm9yIChpaSA9IDA7IGlpIDwgTUFYUkVGOyBpaSsrKSB7CisJCQlwcl9pbmZvKCJyZWZfcGljKCVkKT0lZFxuIiwKKwkJCWlpLCBoZC0+Y3Vycl9SUFMucmVmX3BpY1tpaV0pOworCX0KKwlmb3IgKGlpID0gMDsgaWkgPCBhdnMyX2RlYy0+cmVmX21heGJ1ZmZlcjsgaWkrKykgeworCQlwcl9pbmZvKAorCQkJImZyZWZbJWRdOiBpbmRleCAlZCBpbWdjb2lfcmVmICVkIGltZ3RyX2Z3UmVmRGlzdGFuY2UgJWRcbiIsCisJCQlpaSwgYXZzMl9kZWMtPmZyZWZbaWldLT5pbmRleCwKKwkJCWF2czJfZGVjLT5mcmVmW2lpXS0+aW1nY29pX3JlZiwKKwkJCWF2czJfZGVjLT5mcmVmW2lpXS0+aW1ndHJfZndSZWZEaXN0YW5jZSk7CisJfQorCX0KKyNlbmRpZgorCisJZm9yIChpID0gMDsgaSA8IGhkLT5jdXJyX1JQUy5udW1fb2ZfcmVmOyBpKyspIHsKKwkJLyppbnQzMl90IGFjY3VtdWxhdGUgPSAwOyovCisJCS8qIGNvcHkgdG1wX2ZyZWYgZnJvbSBhdnMyX2RlYy0+ZnJlZltpXSAqLworCQl0bXBfZnJlZiA9IGF2czJfZGVjLT5mcmVmW2ldOworCisjaWYgUkVNT1ZFX1VOVVNFRAorCQlmb3IgKGogPSBpOyBqIDwgYXZzMl9kZWMtPnJlZl9tYXhidWZmZXI7IGorKykgeworCQkJLyovLy8vLy8vLy8vLy8vdG8gYmUgbW9kaWZpZWQgIElEUiovCisJCQlpZiAoYXZzMl9kZWMtPmZyZWZbal0tPmltZ2NvaV9yZWYgPT0KKwkJCQlpbWctPmNvZGluZ19vcmRlciAtCisJCQkJaGQtPmN1cnJfUlBTLnJlZl9waWNbaV0pIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorI2Vsc2UKKworCQlmb3IgKGogPSBpOyBqIDwgYXZzMl9kZWMtPnJlZl9tYXhidWZmZXI7IGorKykgeworCQkJLyovLy8vLy8vLy8vLy8vdG8gYmUgbW9kaWZpZWQgIElEUiovCisJCQlpbnQzMl90IGsgLCB0bXBfdHI7CisJCQlmb3IgKGsgPSAwOyBrIDwgYXZzMl9kZWMtPnJlZl9tYXhidWZmZXI7IGsrKykgeworCQkJCWlmICgoKGludDMyX3QpaW1nLT5jb2Rpbmdfb3JkZXIgLQorCQkJCQkoaW50MzJfdCloZC0+Y3Vycl9SUFMucmVmX3BpY1tpXSkgPT0KKwkJCQkJYXZzMl9kZWMtPmZyZWZba10tPmltZ2NvaV9yZWYgJiYKKwkJCQkJYXZzMl9kZWMtPmZyZWZba10tPmltZ2NvaV9yZWYgPj0gLTI1NikgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoayA9PSBhdnMyX2RlYy0+cmVmX21heGJ1ZmZlcikgeworCQkJCXRtcF90ciA9CisJCQkJLTEtMTsKKwkJCX0gZWxzZSB7CisJCQkJdG1wX3RyID0KKwkJCQkJYXZzMl9kZWMtPmZyZWZba10tPmltZ3RyX2Z3UmVmRGlzdGFuY2U7CisJCQl9CisJCQlpZiAodG1wX3RyIDwgaGQtPmN1cnJfSURSdHIpIHsKKwkJCQloZC0+Y3Vycl9SUFMucmVmX3BpY1tpXSA9CisJCQkJCWltZy0+Y29kaW5nX29yZGVyIC0gaGQtPmN1cnJfSURSY29pOworCisJCQkJZm9yIChrID0gMDsgayA8IGk7IGsrKykgeworCQkJCQlpZiAoaGQtPmN1cnJfUlBTLnJlZl9waWNba10gPT0KKwkJCQkJCWhkLT5jdXJyX1JQUy5yZWZfcGljW2ldKSB7CisJCQkJCQlhY2N1bXVsYXRlKys7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChhdnMyX2RlYy0+ZnJlZltqXS0+aW1nY29pX3JlZiA9PQorCQkJCWltZy0+Y29kaW5nX29yZGVyIC0gaGQtPmN1cnJfUlBTLnJlZl9waWNbaV0pIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoaiA9PSBhdnMyX2RlYy0+cmVmX21heGJ1ZmZlciB8fCBhY2N1bXVsYXRlKQorCQkJaW1nLT5udW1fb2ZfcmVmZXJlbmNlcy0tOworI2VuZGlmCisJCWlmIChqICE9IGF2czJfZGVjLT5yZWZfbWF4YnVmZmVyKSB7CisJCQkvKiBjb3B5IGF2czJfZGVjLT5mcmVmW2ldIGZyb20gYXZzMl9kZWMtPmZyZWZbal0gKi8KKwkJCWF2czJfZGVjLT5mcmVmW2ldID0gYXZzMl9kZWMtPmZyZWZbal07CisJCQkvKiBjb3B5IGF2czJfZGVjLT5mcmVmW2pdIGZyb20gZmVyZlt0bXBdICovCisJCQlhdnMyX2RlYy0+ZnJlZltqXSA9IHRtcF9mcmVmOworCQkJaWYgKGlzX2F2czJfcHJpbnRfYnVmbWdyX2RldGFpbCgpKSB7CisJCQkJcHJfaW5mbygiJXMsIHN3aXRjaCAlZCAlZDogIiwgX19mdW5jX18sIGksIGopOworCQkJCWZvciAoaWkgPSAwOyBpaSA8IGhkLT5jdXJyX1JQUy5udW1fb2ZfcmVmCisJCQkJfHwgaWkgPD0gajsgaWkrKykKKwkJCQkJcHJfaW5mbygiJWQgIiwKKwkJCQkJYXZzMl9kZWMtPmZyZWZbaWldLT5pbmRleCk7CisJCQkJcHJfaW5mbygiXG4iKTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoaW1nLT50eXBlID09IEJfSU1HICYmCisJCShhdnMyX2RlYy0+ZnJlZlswXS0+aW1ndHJfZndSZWZEaXN0YW5jZSA8PSBpbWctPnRyCisJCXx8IGF2czJfZGVjLT5mcmVmWzFdLT5pbWd0cl9md1JlZkRpc3RhbmNlID49IGltZy0+dHIpKSB7CisKKwkJcHJfaW5mbygid3JvbmcgcmVmZXJlbmNlIGNvbmZpZ3VyYXRpb24gZm9yIEIgZnJhbWVcbiIpOworCQlwcl9pbmZvKAorCQkJImZyZWYwIGltZ3RyX2Z3UmVmRGlzdGFuY2UgJWQsIGZyZWYxIGltZ3RyX2Z3UmVmRGlzdGFuY2UgJWQsIGltZy0+dHIgJWRcbiIsCisJCQkJYXZzMl9kZWMtPmZyZWZbMF0tPmltZ3RyX2Z3UmVmRGlzdGFuY2UsCisJCQkJYXZzMl9kZWMtPmZyZWZbMV0tPmltZ3RyX2Z3UmVmRGlzdGFuY2UsCisJCQkJaW1nLT50cik7CisJCWhjLT5mX3JlYy0+ZXJyb3JfbWFyayA9IDE7CisJCWF2czJfZGVjLT5idWZtZ3JfZXJyb3JfZmxhZyA9IDE7CisJCXJldHVybjsgLyogZXhpdCgtMSk7Ki8KKwkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJfQorCisjaWYgIUZJWF9QUk9GSUxFX0xFVkVMX0RQQl9SUFNfMQorCS8qIGRlbGV0ZSB0aGUgZnJhbWUgdGhhdCB3aWxsIG5ldmVyIGJlIHVzZWQqLworCWZvciAoaSA9IDA7IGkgPCBoZC0+Y3Vycl9SUFMubnVtX3RvX3JlbW92ZTsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBhdnMyX2RlYy0+cmVmX21heGJ1ZmZlcjsgaisrKSB7CisJCQlpZiAoYXZzMl9kZWMtPmZyZWZbal0tPmltZ2NvaV9yZWYgPj0gLTI1NgorCQkJCSYmIGF2czJfZGVjLT5mcmVmW2pdLT5pbWdjb2lfcmVmCisJCQkJPT0gaW1nLT5jb2Rpbmdfb3JkZXIgLQorCQkJCWhkLT5jdXJyX1JQUy5yZW1vdmVfcGljW2ldKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGogPCBhdnMyX2RlYy0+cmVmX21heGJ1ZmZlciAmJgorCQkJaiA+PSBpbWctPm51bV9vZl9yZWZlcmVuY2VzKSB7CisJCQlhdnMyX2RlYy0+ZnJlZltqXS0+aW1nY29pX3JlZiA9IC0yNTc7CisjaWYgTTM0ODBfVEVNUE9SQUxfU0NBTEFCTEUKKwkJCWF2czJfZGVjLT5mcmVmW2pdLT50ZW1wb3JhbF9pZCA9IC0xOworI2VuZGlmCisJCQlpZiAoYXZzMl9kZWMtPmZyZWZbal0tPmlzX291dHB1dCA9PSAtMSkgeworCQkJCWF2czJfZGVjLT5mcmVmW2pdLT4KKwkJCQlpbWd0cl9md1JlZkRpc3RhbmNlID0gLTI1NjsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCisJLyogYWRkIGludGVyLXZpZXcgcmVmZXJlbmNlIHBpY3R1cmUqLworCisJLyogICBhZGQgY3VycmVudCBmcmFtZSB0byByZWYgYnVmZmVyKi8KKwlmb3IgKGkgPSAwOyBpIDwgYXZzMl9kZWMtPnJlZl9tYXhidWZmZXI7IGkrKykgeworCQlpZiAoKGF2czJfZGVjLT5mcmVmW2ldLT5pbWdjb2lfcmVmIDwgLTI1NgorCQkJfHwgYWJzKGF2czJfZGVjLT5mcmVmW2ldLT4KKwkJCQlpbWd0cl9md1JlZkRpc3RhbmNlIC0gaW1nLT50cikgPj0gMTI4KQorCQkJCSYmIGF2czJfZGVjLT5mcmVmW2ldLT5pc19vdXRwdXQgPT0gLTEKKwkJCQkmJiBhdnMyX2RlYy0+ZnJlZltpXS0+YmdfZmxhZyA9PSAwCisjaWZuZGVmIE5PX0RJU1BMQVkKKwkJCQkmJiBhdnMyX2RlYy0+ZnJlZltpXS0+dmZfcmVmID09IDAKKwkJCQkmJiBhdnMyX2RlYy0+ZnJlZltpXS0+dG9fcHJlcGFyZV9kaXNwID09IDAKKyNlbmRpZgorCQkJCSkgeworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGkgPT0gYXZzMl9kZWMtPnJlZl9tYXhidWZmZXIpIHsKKwkJcHJfaW5mbygKKwkJCSIlcywgd2FybmluZywgbm8gZW5vdWdoIGJ1ZlxuIiwKKwkJCV9fZnVuY19fKTsKKwkJaS0tOworCX0KKworCWhjLT5mX3JlYyAgICAgICAgPSBhdnMyX2RlYy0+ZnJlZltpXTsKKwloYy0+Y3VycmVudEZyYW1lID0gaGMtPmZfcmVjLT5yZWY7CisJaGMtPmZfcmVjLT5pbWd0cl9md1JlZkRpc3RhbmNlID0gaW1nLT50cjsKKwloYy0+Zl9yZWMtPmltZ2NvaV9yZWYgPSBpbWctPmNvZGluZ19vcmRlcjsKKyNpZiBNMzQ4MF9URU1QT1JBTF9TQ0FMQUJMRQorCWhjLT5mX3JlYy0+dGVtcG9yYWxfaWQgPSBoZC0+Y3VyX2xheWVyOworI2VuZGlmCisJaGMtPmZfcmVjLT5pc19vdXRwdXQgPSAxOworI2lmZGVmIEFNTAorCWhjLT5mX3JlYy0+ZXJyb3JfbWFyayA9IDA7CisJaGMtPmZfcmVjLT5kZWNvZGVkX2xjdSA9IDA7CisJaGMtPmZfcmVjLT5zbGljZV90eXBlID0gaW1nLT50eXBlOworI2VuZGlmCisJaGMtPmZfcmVjLT5yZWZlcmVkX2J5X290aGVycyA9IGhkLT5jdXJyX1JQUy5yZWZlcmRfYnlfb3RoZXJzOworCWlmIChpc19hdnMyX3ByaW50X2J1Zm1ncl9kZXRhaWwoKSkKKwkJcHJfaW5mbygKKwkJCSIlcywgc2V0IGZfcmVjIChjdXJfcGljKSA8PSBmcmVmWyVkXSBpbWctPnRyICVkIGNvZGluZ19vcmRlciAlZCBpbWdfdHlwZSAlZFxuIiwKKwkJCV9fZnVuY19fLCBpLCBpbWctPnRyLCBpbWctPmNvZGluZ19vcmRlciwKKwkJCWltZy0+dHlwZSk7CisKKwlpZiAoaW1nLT50eXBlICE9IEJfSU1HKSB7CisJCWZvciAoaiA9IDA7CisJCQlqIDwgaW1nLT5udW1fb2ZfcmVmZXJlbmNlczsgaisrKSB7CisJCQloYy0+Zl9yZWMtPnJlZl9wb2Nbal0gPQorCQkJYXZzMl9kZWMtPmZyZWZbal0tPmltZ3RyX2Z3UmVmRGlzdGFuY2U7CisJCX0KKwl9IGVsc2UgeworCQloYy0+Zl9yZWMtPnJlZl9wb2NbMF0gPQorCQkJYXZzMl9kZWMtPmZyZWZbMV0tPmltZ3RyX2Z3UmVmRGlzdGFuY2U7CisJCWhjLT5mX3JlYy0+cmVmX3BvY1sxXSA9CisJCQlhdnMyX2RlYy0+ZnJlZlswXS0+aW1ndHJfZndSZWZEaXN0YW5jZTsKKwl9CisKKyNpZiBNMzQ4MF9URU1QT1JBTF9TQ0FMQUJMRQorCisJZm9yIChqID0gaW1nLT5udW1fb2ZfcmVmZXJlbmNlczsKKwkJaiA8IDQ7IGorKykgeworCQkvKiovCisJCWhjLT5mX3JlYy0+cmVmX3BvY1tqXSA9IDA7CisJfQorCisJaWYgKGltZy0+dHlwZSA9PSBJTlRSQV9JTUcpIHsKKwkJaW50MzJfdCBsOworCQlmb3IgKGwgPSAwOyBsIDwgNDsgbCsrKSB7CisJCQloYy0+Zl9yZWMtPnJlZl9wb2NbbF0KKwkJCT0gaW1nLT50cjsKKwkJfQorCX0KKworI2VuZGlmCisKKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi8KKwkvKiB1cGRhdGEgcmVmIHBvaW50ZXIqLworCisJaWYgKGltZy0+dHlwZSAhPSBJX0lNRykgeworCisJCWltZy0+aW1ndHJfbmV4dF9QID0gaW1nLT50eXBlID09IEJfSU1HID8KKwkJCWF2czJfZGVjLT5mcmVmWzBdLT5pbWd0cl9md1JlZkRpc3RhbmNlIDogaW1nLT50cjsKKwkJaWYgKGltZy0+dHlwZSA9PSBCX0lNRykgeworCQkJaGQtPnRydG1wID0gYXZzMl9kZWMtPmZyZWZbMF0tPmltZ3RyX2Z3UmVmRGlzdGFuY2U7CisJCQlhdnMyX2RlYy0+ZnJlZlswXS0+aW1ndHJfZndSZWZEaXN0YW5jZSA9CisJCQlhdnMyX2RlYy0+ZnJlZlsxXS0+aW1ndHJfZndSZWZEaXN0YW5jZTsKKwkJfQorCX0KKyNpZiAxCisJLypyYWluKi8KKwlpZiAoaXNfYXZzMl9wcmludF9idWZtZ3JfZGV0YWlsKCkpIHsKKwkJZm9yIChpaSA9IDA7IGlpIDwgYXZzMl9kZWMtPnJlZl9tYXhidWZmZXI7IGlpKyspIHsKKwkJCXByX2luZm8oCisJCQkiZnJlZlslZF06IGluZGV4ICVkIGltZ2NvaV9yZWYgJWQgaW1ndHJfZndSZWZEaXN0YW5jZSAlZCByZWZlcmVkICVkLCBpc19vdXQgJWQsIGJnICVkLCB2Zl9yZWYgJWQgcmVmX3BvcyglZCwlZCwlZCwlZCwlZCwlZCwlZClcbiIsCisJCQlpaSwgYXZzMl9kZWMtPmZyZWZbaWldLT5pbmRleCwKKwkJCWF2czJfZGVjLT5mcmVmW2lpXS0+aW1nY29pX3JlZiwKKwkJCWF2czJfZGVjLT5mcmVmW2lpXS0+aW1ndHJfZndSZWZEaXN0YW5jZSwKKwkJCWF2czJfZGVjLT5mcmVmW2lpXS0+cmVmZXJlZF9ieV9vdGhlcnMsCisJCQlhdnMyX2RlYy0+ZnJlZltpaV0tPmlzX291dHB1dCwKKwkJCWF2czJfZGVjLT5mcmVmW2lpXS0+YmdfZmxhZywKKwkJCWF2czJfZGVjLT5mcmVmW2lpXS0+dmZfcmVmLAorCQkJYXZzMl9kZWMtPmZyZWZbaWldLT5yZWZfcG9jWzBdLAorCQkJYXZzMl9kZWMtPmZyZWZbaWldLT5yZWZfcG9jWzFdLAorCQkJYXZzMl9kZWMtPmZyZWZbaWldLT5yZWZfcG9jWzJdLAorCQkJYXZzMl9kZWMtPmZyZWZbaWldLT5yZWZfcG9jWzNdLAorCQkJYXZzMl9kZWMtPmZyZWZbaWldLT5yZWZfcG9jWzRdLAorCQkJYXZzMl9kZWMtPmZyZWZbaWldLT5yZWZfcG9jWzVdLAorCQkJYXZzMl9kZWMtPmZyZWZbaWldLT5yZWZfcG9jWzZdCisJCSk7CisJfQorCX0KKyNlbmRpZgorfQorCitpbnQzMl90IGluaXRfZnJhbWUoc3RydWN0IGF2czJfZGVjb2RlciAqYXZzMl9kZWMpCit7CisJc3RydWN0IEltYWdlUGFyYW1ldGVyc19zICAgICppbWcgPSAmYXZzMl9kZWMtPmltZzsKKwlzdHJ1Y3QgVmlkZW9fQ29tX2RhdGFfcyAqaGMgPSAmYXZzMl9kZWMtPmhjOworCXN0cnVjdCBWaWRlb19EZWNfZGF0YV9zICpoZCA9ICZhdnMyX2RlYy0+aGQ7CisKKworI2lmIFJEMTUxMF9GSVhfQkcKKwlpZiAoaW1nLT50eXBlID09IElfSU1HICYmCisJCWltZy0+dHlwZWIgPT0gQkFDS0dST1VORF9JTUcpIHsgLypHL0dCIGZyYW1lKi8KKwkJaW1nLT5udW1fb2ZfcmVmZXJlbmNlcyA9IDA7CisJfSBlbHNlIGlmIChpbWctPnR5cGUgPT0gUF9JTUcgJiYgaW1nLT50eXBlYiA9PSBCUF9JTUcpIHsKKwkJLyogb25seSBvbmUgcmVmZXJlbmNlIGZyYW1lKEdcR0IpIGZvciBTIGZyYW1lKi8KKwkJaW1nLT5udW1fb2ZfcmVmZXJlbmNlcyA9IDE7CisJfQorI2VuZGlmCisKKwlpZiAoaW1nLT50eXBlYiA9PSBCQUNLR1JPVU5EX0lNRyAmJgorCQloZC0+YmFja2dyb3VuZF9waWN0dXJlX291dHB1dF9mbGFnID09IDApIHsKKwkJaGMtPmN1cnJlbnRGcmFtZSA9IGhjLT5iYWNrZ3JvdW5kX3JlZjsKKyNpZmRlZiBBTUwKKwkJaGMtPmN1cl9waWMgPSBhdnMyX2RlYy0+bV9iZzsKKyNlbmRpZgorCX0gZWxzZSB7CisJCXByZXBhcmVfUmVmSW5mbyhhdnMyX2RlYyk7CisjaWZkZWYgQU1MCisJCWhjLT5jdXJfcGljID0gaGMtPmZfcmVjOworI2VuZGlmCisJfQorCisKKyNpZmRlZiBGSVhfQ0hST01BX0ZJRUxEX01WX0JLX0RJU1QKKwlpZiAoaW1nLT50eXBlYiA9PSBCQUNLR1JPVU5EX0lNRworCQkmJiBpbWctPmlzX2ZpZWxkX3NlcXVlbmNlKSB7CisJCWF2czJfZGVjLT5ia19pbWdfaXNfdG9wX2ZpZWxkCisJCQk9IGltZy0+aXNfdG9wX2ZpZWxkOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCit2b2lkIGRlbGV0ZV90cmJ1ZmZlcihzdHJ1Y3Qgb3V0ZGF0YV9zICpkYXRhLCBpbnQzMl90IHBvcykKK3sKKwlpbnQzMl90IGk7CisJZm9yIChpID0gcG9zOworCQlpIDwgZGF0YS0+YnVmZmVyX251bSAtIDE7IGkrKykgeworCQlkYXRhLT5zdGRvdXRkYXRhW2ldID0KKwkJZGF0YS0+c3Rkb3V0ZGF0YVtpICsgMV07CisJfQorCWRhdGEtPmJ1ZmZlcl9udW0tLTsKK30KKworI2lmIFJEMTcwX0ZJWF9CRwordm9pZCBmbHVzaERQQihzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYykKK3sKKwlzdHJ1Y3QgVmlkZW9fRGVjX2RhdGFfcyAqaGQgPSAmYXZzMl9kZWMtPmhkOworCWludCBqLCB0bXBfbWluLCBpLCBwb3MgPSAtMTsKKwlpbnQgc2VhcmNoX3RpbWVzID0gYXZzMl9kZWMtPm91dHByaW50LmJ1ZmZlcl9udW07CisKKwl0bXBfbWluID0gMSA8PCAyMDsKKwlpID0gMCwgaiA9IDA7CisJcG9zID0gLTE7CisKKwlmb3IgKGogPSAwOyBqIDwgc2VhcmNoX3RpbWVzOyBqKyspIHsKKwkJcG9zID0gLTE7CisJCXRtcF9taW4gPSAoMSA8PCAyMCk7CisJCS8qc2VhcmNoIGZvciBtaW4gcG9pIHBpY3R1cmUgdG8gZGlzcGxheSovCisJCWZvciAoaSA9IDA7IGkgPCBhdnMyX2RlYy0+b3V0cHJpbnQuYnVmZmVyX251bTsgaSsrKSB7CisJCQlpZiAoYXZzMl9kZWMtPm91dHByaW50LnN0ZG91dGRhdGFbaV0udHIgPCB0bXBfbWluKSB7CisJCQkJcG9zID0gaTsKKwkJCQl0bXBfbWluID0gYXZzMl9kZWMtPm91dHByaW50LnN0ZG91dGRhdGFbaV0udHI7CisJCQl9CisJCX0KKworCQlpZiAocG9zICE9IC0xKSB7CisJCQloZC0+bGFzdF9vdXRwdXQgPSBhdnMyX2RlYy0+b3V0cHJpbnQuc3Rkb3V0ZGF0YVtwb3NdLnRyOworCQkJcmVwb3J0X2ZyYW1lKGF2czJfZGVjLCAmYXZzMl9kZWMtPm91dHByaW50LCBwb3MpOworCQkJaWYgKGF2czJfZGVjLT5vdXRwcmludC5zdGRvdXRkYXRhW3Bvc10udHlwZWIKKwkJCQk9PSBCQUNLR1JPVU5EX0lNRyAmJgorCQkJYXZzMl9kZWMtPm91dHByaW50LnN0ZG91dGRhdGFbcG9zXS4KKwkJCWJhY2tncm91bmRfcGljdHVyZV9vdXRwdXRfZmxhZworCQkJPT0gMCkgeworCQkJCS8qd3JpdGVfR0JfZnJhbWUoaGQtPnBfb3V0X2JhY2tncm91bmQpOyovCisJCQl9IGVsc2UgeworCQkJCXdyaXRlX2ZyYW1lKGF2czJfZGVjLAorCQkJCQlhdnMyX2RlYy0+b3V0cHJpbnQuc3Rkb3V0ZGF0YVtwb3NdLnRyKTsKKwkJCX0KKworCQkJZGVsZXRlX3RyYnVmZmVyKCZhdnMyX2RlYy0+b3V0cHJpbnQsIHBvcyk7CisJCX0KKwl9CisKKwkvKmNsZWFyIGRwYiBpbmZvKi8KKwlmb3IgKGogPSAwOyBqIDwgUkVGX01BWEJVRkZFUjsgaisrKSB7CisJCWF2czJfZGVjLT5mcmVmW2pdLT5pbWd0cl9md1JlZkRpc3RhbmNlID0gLTI1NjsKKwkJYXZzMl9kZWMtPmZyZWZbal0tPmltZ2NvaV9yZWYgPSAtMjU3OworCQlhdnMyX2RlYy0+ZnJlZltqXS0+dGVtcG9yYWxfaWQgPSAtMTsKKwkJYXZzMl9kZWMtPmZyZWZbal0tPnJlZmVyZWRfYnlfb3RoZXJzID0gMDsKKwl9Cit9CisjZW5kaWYKKworCisKKyNpZiBNMzQ4MF9URU1QT1JBTF9TQ0FMQUJMRQordm9pZCBjbGVhblJlZk1WQnVmUmVmKGludCBwb3MpCit7CisjaWYgMAorCWludCBrLCB4LCB5OworCS8qcmUtaW5pdCBtdmJ1ZiovCisJZm9yIChrID0gMDsgayA8IDI7IGsrKykgeworCQlmb3IgKHkgPSAwOyB5IDwgaW1nLT5oZWlnaHQgLyBNSU5fQkxPQ0tfU0laRTsgeSsrKSB7CisJCQlmb3IgKHggPSAwOyB4IDwgaW1nLT53aWR0aCAvIE1JTl9CTE9DS19TSVpFOyB4KyspCisJCQkJZnJlZltwb3NdLT5tdmJ1Zlt5XVt4XVtrXSA9IDA7CisKKwkJfQorCX0KKwkvKnJlLWluaXQgcmVmYnVmKi8KKwlmb3IgKHkgPSAwOyB5IDwgaW1nLT5oZWlnaHQgLyBNSU5fQkxPQ0tfU0laRTsgeSsrKSB7CisJCWZvciAoeCA9IDA7IHggPCBpbWctPndpZHRoIC8gTUlOX0JMT0NLX1NJWkUgOyB4KyspCisJCQlmcmVmW3Bvc10tPnJlZmJ1Zlt5XVt4XSA9IC0xOworCisJfQorI2VuZGlmCit9CisjZW5kaWYKKworc3RhdGljIGludCBmcmFtZV9wb3N0cHJvY2Vzc2luZyhzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYykKK3sKKwlzdHJ1Y3QgSW1hZ2VQYXJhbWV0ZXJzX3MgICAgKmltZyA9ICZhdnMyX2RlYy0+aW1nOworCXN0cnVjdCBWaWRlb19Db21fZGF0YV9zICpoYyA9ICZhdnMyX2RlYy0+aGM7CisJc3RydWN0IFZpZGVvX0RlY19kYXRhX3MgKmhkID0gJmF2czJfZGVjLT5oZDsKKworCWludDMyX3QgcG9pbnRlcl90bXAgPSBhdnMyX2RlYy0+b3V0cHJpbnQuYnVmZmVyX251bTsKKwlpbnQzMl90IGk7CisJc3RydWN0IFNURE9VVF9EQVRBX3MgKnBfb3V0ZGF0YTsKKyNpZiBSRDE2MF9GSVhfQkcKKwlpbnQzMl90IGosIHRtcF9taW4sIG91dHB1dF9jdXJfZGVjX3BpYywgcG9zID0gLTE7CisJaW50MzJfdCBzZWFyY2hfdGltZXMgPSBhdnMyX2RlYy0+b3V0cHJpbnQuYnVmZmVyX251bTsKKyNlbmRpZgorCS8qcGljIGRpc3QgYnkgR3JhbmR2aWV3IFNlbWkuIEAgWzA2LTA3LTIwIDE1OjI1XSovCisJaW1nLT5QcmV2UGljRGlzdGFuY2VMc2IgPSAoaW1nLT5jb2Rpbmdfb3JkZXIgJSAyNTYpOworCisJcG9pbnRlcl90bXAgPSBhdnMyX2RlYy0+b3V0cHJpbnQuYnVmZmVyX251bTsKKwlwX291dGRhdGEgICA9ICZhdnMyX2RlYy0+b3V0cHJpbnQuc3Rkb3V0ZGF0YVtwb2ludGVyX3RtcF07CisKKwlwX291dGRhdGEtPnR5cGUgPSBpbWctPnR5cGU7CisJcF9vdXRkYXRhLT50eXBlYiA9IGltZy0+dHlwZWI7CisJcF9vdXRkYXRhLT5mcmFtZW51bSA9IGltZy0+dHI7CisJcF9vdXRkYXRhLT50ciA9IGltZy0+dHI7CisjaWYgMCAvKmRlZiBPUkkqLworCXBfb3V0ZGF0YS0+cXAgPSBpbWctPnFwOworI2Vsc2UKKwlwX291dGRhdGEtPnFwID0gMDsKKyNlbmRpZgorCS8qcF9vdXRkYXRhLT5zbnJfeSA9IHNuci0+c25yX3k7Ki8KKwkvKnBfb3V0ZGF0YS0+c25yX3UgPSBzbnItPnNucl91OyovCisJLypwX291dGRhdGEtPnNucl92ID0gc25yLT5zbnJfdjsqLworCXBfb3V0ZGF0YS0+dG1wX3RpbWUgPSBoZC0+dG1wX3RpbWU7CisJcF9vdXRkYXRhLT5waWN0dXJlX3N0cnVjdHVyZSA9IGltZy0+cGljdHVyZV9zdHJ1Y3R1cmU7CisJLypwX291dGRhdGEtPmN1cnJfZnJhbWVfYml0cyA9CisJICBTdGF0Qml0c1B0ci0+Y3Vycl9mcmFtZV9iaXRzOyovCisJLypwX291dGRhdGEtPmVtdWxhdGVfYml0cyA9IFN0YXRCaXRzUHRyLT5lbXVsYXRlX2JpdHM7Ki8KKyNpZiBSRDE1MDFfRklYX0JHCisJcF9vdXRkYXRhLT5iYWNrZ3JvdW5kX3BpY3R1cmVfb3V0cHV0X2ZsYWcKKwkJPSBoZC0+YmFja2dyb3VuZF9waWN0dXJlX291dHB1dF9mbGFnOworCQkvKkxvbmdmZWkuV2FuZ0BtZWRpYXRlay5jb20qLworI2VuZGlmCisKKyNpZiBSRDE2MF9GSVhfQkcKKwlwX291dGRhdGEtPnBpY3R1cmVfcmVvcmRlcl9kZWxheSA9IGhkLT5waWN0dXJlX3Jlb3JkZXJfZGVsYXk7CisjZW5kaWYKKwlhdnMyX2RlYy0+b3V0cHJpbnQuYnVmZmVyX251bSsrOworCisjaWYgUkQxNzBfRklYX0JHCisJc2VhcmNoX3RpbWVzID0gYXZzMl9kZWMtPm91dHByaW50LmJ1ZmZlcl9udW07CisjZW5kaWYKKwkvKiByZWNvcmQgdGhlIHJlZmVyZW5jZSBsaXN0Ki8KKwlzdHJjcHkocF9vdXRkYXRhLT5zdHJfcmVmZXJlbmNlX2xpc3QsIGhjLT5zdHJfbGlzdF9yZWZlcmVuY2UpOworCisjaWYgIVJFRl9PVVRQVVQKKwkjZXJyb3IgIiEhIVJFRl9PVVRQVVQgc2hvdWxkIGJlIDEiCisJZm9yIChpID0gMDsgaSA8IGF2czJfZGVjLT5vdXRwcmludC5idWZmZXJfbnVtOyBpKyspIHsKKwkJbWluX3RyKGF2czJfZGVjLT5vdXRwcmludCwgJnBvcyk7CisJCWlmIChhdnMyX2RlYy0+b3V0cHJpbnQuc3Rkb3V0ZGF0YVtwb3NdLnRyIDwgaW1nLT50cgorCQkJfHwgYXZzMl9kZWMtPm91dHByaW50LnN0ZG91dGRhdGFbcG9zXS50cgorCQkJPT0gKGhkLT5sYXN0X291dHB1dCArIDEpKSB7CisJCQloZC0+bGFzdF9vdXRwdXQgPSBhdnMyX2RlYy0+b3V0cHJpbnQuc3Rkb3V0ZGF0YVtwb3NdLnRyOworCQkJcmVwb3J0X2ZyYW1lKGF2czJfZGVjLCAmYXZzMl9kZWMtPm91dHByaW50LCBwb3MpOworI2lmIDAgLypkZWYgT1JJKi8KKwkJCXdyaXRlX2ZyYW1lKGhkLT5wX291dCwKKwkJCWF2czJfZGVjLT5vdXRwcmludC5zdGRvdXRkYXRhW3Bvc10udHIpOworI2VuZGlmCisJCQlkZWxldGVfdHJidWZmZXIoJmF2czJfZGVjLT5vdXRwcmludCwgcG9zKTsKKwkJCWktLTsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJfQorI2Vsc2UKKyNpZiBSRDE2MF9GSVhfQkcgLypMb25nZmVpLldhbmdAbWVkaWF0ZWsuY29tKi8KKwl0bXBfbWluID0gMSA8PCAyMDsKKwlpID0gMCwgaiA9IDA7CisJb3V0cHV0X2N1cl9kZWNfcGljID0gMDsKKwlwb3MgPSAtMTsKKwlmb3IgKGogPSAwOyBqIDwgc2VhcmNoX3RpbWVzOyBqKyspIHsKKwkJcG9zID0gLTE7CisJCXRtcF9taW4gPSAoMSA8PCAyMCk7CisJCS8qc2VhcmNoIGZvciBtaW4gcG9pIHBpY3R1cmUgdG8gZGlzcGxheSovCisJCWZvciAoaSA9IDA7IGkgPCBhdnMyX2RlYy0+b3V0cHJpbnQuYnVmZmVyX251bTsgaSsrKSB7CisJCQlpZiAoKGF2czJfZGVjLT5vdXRwcmludC5zdGRvdXRkYXRhW2ldLnRyIDwgdG1wX21pbikgJiYKKwkJCQkoKGF2czJfZGVjLT5vdXRwcmludC5zdGRvdXRkYXRhW2ldLnRyCisJCQkJKyBhdnMyX2RlYy0+b3V0cHJpbnQuc3Rkb3V0ZGF0YVtpXS4KKwkJCQkJcGljdHVyZV9yZW9yZGVyX2RlbGF5KQorCQkJCTw9IChpbnQzMl90KWltZy0+Y29kaW5nX29yZGVyKSkgeworCQkJCXBvcyA9IGk7CisJCQkJdG1wX21pbiA9IGF2czJfZGVjLT5vdXRwcmludC5zdGRvdXRkYXRhW2ldLnRyOworCQkJfQorCQl9CisKKwkJaWYgKCgwID09IGhkLT5kaXNwbGF5ZGVsYXkpICYmICgwID09IG91dHB1dF9jdXJfZGVjX3BpYykpIHsKKwkJCWlmIChpbWctPnRyIDw9IHRtcF9taW4pCXsvKmZyZWQuY2hpdUBtZWRpYXRlay5jb20qLworCQkJCS8qb3V0cHV0IGN1cnJlbnQgZGVjb2RlIHBpY3R1cmUKKwkJCQkgIHJpZ2h0IG5vdyovCisJCQkJcG9zID0gYXZzMl9kZWMtPm91dHByaW50LmJ1ZmZlcl9udW0gLSAxOworCQkJCW91dHB1dF9jdXJfZGVjX3BpYyA9IDE7CisJCQl9CisJCX0KKwkJaWYgKHBvcyAhPSAtMSkgeworCQkJaGQtPmxhc3Rfb3V0cHV0ID0gYXZzMl9kZWMtPm91dHByaW50LnN0ZG91dGRhdGFbcG9zXS50cjsKKwkJCXJlcG9ydF9mcmFtZShhdnMyX2RlYywgJmF2czJfZGVjLT5vdXRwcmludCwgcG9zKTsKKyNpZiAxIC8qZGVmIE9SSSovCisJCQlpZiAoYXZzMl9kZWMtPm91dHByaW50LnN0ZG91dGRhdGFbcG9zXS50eXBlYgorCQkJCT09IEJBQ0tHUk9VTkRfSU1HICYmCisJCQkJYXZzMl9kZWMtPm91dHByaW50LnN0ZG91dGRhdGFbcG9zXS4KKwkJCQliYWNrZ3JvdW5kX3BpY3R1cmVfb3V0cHV0X2ZsYWcgPT0gMCkgeworCQkJCS8qKi8KKwkJCQkvKiovCisJCQl9IGVsc2UgeworCQkJCXdyaXRlX2ZyYW1lKGF2czJfZGVjLAorCQkJCWF2czJfZGVjLT5vdXRwcmludC5zdGRvdXRkYXRhW3Bvc10udHIpOworCQkJfQorI2VuZGlmCisJCQlkZWxldGVfdHJidWZmZXIoJmF2czJfZGVjLT5vdXRwcmludCwgcG9zKTsKKwkJfQorCisJfQorCisjZWxzZQorCSNlcnJvciAiISEhUkQxNjBfRklYX0JHIHNob3VsZCBiZSBkZWZpbmVkIgorCWlmIChpbWctPmNvZGluZ19vcmRlciArCisJCSh1aW50MzJfdCloYy0+dG90YWxfZnJhbWVzICogMjU2ID49CisJCSh1aW50MzJfdCloZC0+cGljdHVyZV9yZW9yZGVyX2RlbGF5KSB7CisJCWludDMyX3QgdG1wX21pbiwgcG9zID0gLTE7CisJCXRtcF9taW4gPSAxIDw8IDIwOworCisJCWZvciAoaSA9IDA7IGkgPAorCQkJYXZzMl9kZWMtPm91dHByaW50LmJ1ZmZlcl9udW07IGkrKykgeworCQkJaWYgKGF2czJfZGVjLT5vdXRwcmludC5zdGRvdXRkYXRhW2ldLnRyCisJCQkJPCB0bXBfbWluICYmCisJCQkJYXZzMl9kZWMtPm91dHByaW50LnN0ZG91dGRhdGFbaV0udHIKKwkJCQk+PSBoZC0+bGFzdF9vdXRwdXQpIHsKKwkJCQkvKkdCIGhhcyB0aGUgc2FtZSAidHIiIHdpdGggImxhc3Rfb3V0cHV0IiovCisJCQkJcG9zID0gaTsKKwkJCQl0bXBfbWluID0KKwkJCQlhdnMyX2RlYy0+b3V0cHJpbnQuc3Rkb3V0ZGF0YVtpXS50cjsKKwkJCX0KKwkJfQorCisJCWlmIChwb3MgIT0gLTEpIHsKKwkJCWhkLT5sYXN0X291dHB1dCA9IGF2czJfZGVjLT5vdXRwcmludC5zdGRvdXRkYXRhW3Bvc10udHI7CisJCQlyZXBvcnRfZnJhbWUoYXZzMl9kZWMsICZhdnMyX2RlYy0+b3V0cHJpbnQsIHBvcyk7CisjaWYgUkQxNTAxX0ZJWF9CRworCQkJaWYgKGF2czJfZGVjLT5vdXRwcmludC5zdGRvdXRkYXRhW3Bvc10udHlwZWIKKwkJCQk9PSBCQUNLR1JPVU5EX0lNRyAmJiBhdnMyX2RlYy0+CisJCQkJb3V0cHJpbnQuc3Rkb3V0ZGF0YVtwb3NdLgorCQkJCWJhY2tncm91bmRfcGljdHVyZV9vdXRwdXRfZmxhZyA9PSAwKSB7CisjZWxzZQorCQkJCWlmIChhdnMyX2RlYy0+b3V0cHJpbnQuc3Rkb3V0ZGF0YVtwb3NdLnR5cGViCisJCQkJCT09IEJBQ0tHUk9VTkRfSU1HICYmCisJCQkJCWhkLT5iYWNrZ3JvdW5kX3BpY3R1cmVfb3V0cHV0X2ZsYWcKKwkJCQkJPT0gMCkgeworI2VuZGlmCisJCQkJCXdyaXRlX0dCX2ZyYW1lKAorCQkJCQkJaGQtPnBfb3V0X2JhY2tncm91bmQpOworCQkJCX0gZWxzZSB7CisJCQkJCXdyaXRlX2ZyYW1lKGF2czJfZGVjLAorCQkJCQlhdnMyX2RlYy0+b3V0cHJpbnQuc3Rkb3V0ZGF0YVtwb3NdLnRyKTsKKwkJCQl9CisJCQkJZGVsZXRlX3RyYnVmZmVyKCZhdnMyX2RlYy0+b3V0cHJpbnQsIHBvcyk7CisKKwkJCX0KKworCQl9CisjZW5kaWYKKyNlbmRpZgorCXJldHVybiBwb3M7CisKKwl9CisKK3ZvaWQgd3JpdGVfZnJhbWUoc3RydWN0IGF2czJfZGVjb2RlciAqYXZzMl9kZWMsIGludDMyX3QgcG9zKQoreworCWludDMyX3QgajsKKworCWlmIChpc19hdnMyX3ByaW50X2J1Zm1ncl9kZXRhaWwoKSkKKwkJcHJfaW5mbygiJXMocG9zID0gJWQpXG4iLCBfX2Z1bmNfXywgcG9zKTsKKworCWZvciAoaiA9IDA7IGogPCBhdnMyX2RlYy0+cmVmX21heGJ1ZmZlcjsgaisrKSB7CisJCWlmIChhdnMyX2RlYy0+ZnJlZltqXS0+aW1ndHJfZndSZWZEaXN0YW5jZSA9PSBwb3MpIHsKKwkJCWF2czJfZGVjLT5mcmVmW2pdLT5pbWd0cl9md1JlZkRpc3RhbmNlX2JhayA9IHBvczsKKwkJCWF2czJfZGVjLT5mcmVmW2pdLT5pc19vdXRwdXQgPSAtMTsKKwkJCWF2czJfZGVjLT5mcmVmW2pdLT50b19wcmVwYXJlX2Rpc3AgPQorCQkJCWF2czJfZGVjLT50b19wcmVwYXJlX2Rpc3BfY291bnQrKzsKKwkJCWlmIChhdnMyX2RlYy0+ZnJlZltqXS0+cmVmZXJlZF9ieV9vdGhlcnMgPT0gMAorCQkJCXx8IGF2czJfZGVjLT5mcmVmW2pdLT5pbWdjb2lfcmVmCisJCQkJPT0gLTI1NykgeworCQkJCWF2czJfZGVjLT5mcmVmW2pdLT5pbWd0cl9md1JlZkRpc3RhbmNlCisJCQkJCT0gLTI1NjsKKwkJCQlhdnMyX2RlYy0+ZnJlZltqXS0+aW1nY29pX3JlZiA9IC0yNTc7CisjaWYgTTM0ODBfVEVNUE9SQUxfU0NBTEFCTEUKKwkJCQlhdnMyX2RlYy0+ZnJlZltqXS0+dGVtcG9yYWxfaWQgPSAtMTsKKyNlbmRpZgorCQkJCWlmIChpc19hdnMyX3ByaW50X2J1Zm1ncl9kZXRhaWwoKSkKKwkJCQkJcHJfaW5mbygiJXMsIGZyZWYgaW5kZXggJWRcbiIsCisJCQkJCQkgX19mdW5jX18sIGopOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qcmFpbj8/Pywgb3V0ZGF0YSAqZGF0YSovCit2b2lkIHJlcG9ydF9mcmFtZShzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYywKKwlzdHJ1Y3Qgb3V0ZGF0YV9zICpkYXRhLCBpbnQzMl90IHBvcykKK3sKKwlzdHJ1Y3QgSW1hZ2VQYXJhbWV0ZXJzX3MgICAgKmltZyA9ICZhdnMyX2RlYy0+aW1nOworCXN0cnVjdCBWaWRlb19Db21fZGF0YV9zICpoYyA9ICZhdnMyX2RlYy0+aGM7CisJc3RydWN0IFZpZGVvX0RlY19kYXRhX3MgKmhkID0gJmF2czJfZGVjLT5oZDsKKworCWludDhfdCAqRnJtZmxkOworCWludDhfdCBGcm1bXSA9ICJGUk0iOworCWludDhfdCBGbGRbXSA9ICJGTEQiOworCXN0cnVjdCBTVERPVVRfREFUQV9zICpwX3N0ZG91dGRhdGEKKwk9ICZkYXRhLT5zdGRvdXRkYXRhW3Bvc107CisJY29uc3QgaW50OF90ICp0eXA7CisKKyNpZiAwCisJaWYgKGlucHV0LT5NRDVFbmFibGUgJiAweDAyKSB7CisJCXNwcmludGYoTUQ1c3RyLCAiJTA4WCUwOFglMDhYJTA4WFwwIiwKKwkJCQlwX3N0ZG91dGRhdGEtPkRlY01ENVZhbHVlWzBdLAorCQkJCXBfc3Rkb3V0ZGF0YS0+RGVjTUQ1VmFsdWVbMV0sCisJCQkJcF9zdGRvdXRkYXRhLT5EZWNNRDVWYWx1ZVsyXSwKKwkJCQlwX3N0ZG91dGRhdGEtPkRlY01ENVZhbHVlWzNdKTsKKwl9IGVsc2UgeworCQltZW1zZXQoTUQ1dmFsLCAwLCAxNik7CisJCW1lbXNldChNRDVzdHIsIDAsIDMzKTsKKwl9CisjZW5kaWYKKworCWlmIChwX3N0ZG91dGRhdGEtPgorCQlwaWN0dXJlX3N0cnVjdHVyZSkgeworCQlGcm1mbGQgPSBGcm07CisJfSBlbHNlIHsKKwkJRnJtZmxkID0gRmxkOworCX0KKyNpZiBJTlRFUkxBQ0VfQ09ESU5HCisJaWYgKGltZy0+aXNfZmllbGRfc2VxdWVuY2UpIHsgLypyY3M/PyovCisJCUZybWZsZCA9IEZsZDsKKwl9CisjZW5kaWYKKwlpZiAoKHBfc3Rkb3V0ZGF0YS0+dHIgKyBoYy0+dG90YWxfZnJhbWVzICogMjU2KQorCSAgICA9PSBoZC0+ZW5kX1NlcVRyKSB7ICAgLyogSSBwaWN0dXJlKi8KKwkJLyppZiAoIGltZy0+bmV3X3NlcXVlbmNlX2ZsYWcgPT0gMSApKi8KKwkJeworCQkJaW1nLT5zZXF1ZW5jZV9lbmRfZmxhZyA9IDA7CisJCQkvKmZwcmludGYoc3Rkb3V0LCAiU2VxdWVuY2UKKwkJCSAgRW5kXG5cbiIpOyovCisJCX0KKwl9CisJaWYgKChwX3N0ZG91dGRhdGEtPnRyICsgaGMtPnRvdGFsX2ZyYW1lcyAqIDI1NikKKwkJPT0gaGQtPm5leHRfSURSdHIpIHsKKyNpZiAhUkQxNzBfRklYX0JHCisJCWlmIChoZC0+dmVjX2ZsYWcpIC8qKi8KKyNlbmRpZgorCQl7CisJCQloZC0+dmVjX2ZsYWcgPSAwOworCQkJLypmcHJpbnRmKHN0ZG91dCwgIlZpZGVvIEVkaXQKKwkJCSAgQ29kZVxuIik7Ki8KKwkJfQorCX0KKworCWlmIChwX3N0ZG91dGRhdGEtPnR5cGViID09IEJBQ0tHUk9VTkRfSU1HKSB7CisJCXR5cCA9IChoZC0+YmFja2dyb3VuZF9waWN0dXJlX291dHB1dF9mbGFnICE9IDApID8gIkciIDogIkdCIjsKKwl9IGVsc2UgeworI2lmIFJFTU9WRV9VTlVTRUQKKwkJdHlwID0gKHBfc3Rkb3V0ZGF0YS0+dHlwZSA9PSBJTlRSQV9JTUcpCisJCQk/ICJJIiA6IChwX3N0ZG91dGRhdGEtPnR5cGUgPT0gSU5URVJfSU1HKSA/CisJCQkoKHBfc3Rkb3V0ZGF0YS0+dHlwZWIgPT0gQlBfSU1HKSA/ICJTIiA6ICJQIikKKwkJCTogKHBfc3Rkb3V0ZGF0YS0+dHlwZSA9PSBGX0lNRyA/ICJGIiA6ICJCIik7CisjZWxzZQorCQl0eXAgPSAocF9zdGRvdXRkYXRhLT50eXBlID09IElOVFJBX0lNRykgPyAiSSIgOgorCQkJKHBfc3Rkb3V0ZGF0YS0+dHlwZSA9PSBJTlRFUl9JTUcpID8KKwkJCSgocF9zdGRvdXRkYXRhLT50eXBlID09IEJQX0lNRykgPyAiUyIgOiAiUCIpCisJCQk6IChwX3N0ZG91dGRhdGEtPnR5cGUgPT0gRl9JTUcgPyAiRiIgOiAiQiIpOworI2VuZGlmCisJfQorCisjaWYgMAorCS8qcmFpbj8/PyovCisJcHJfaW5mbygiJTNkKCVzKSAgJTNkICU1ZCAlNy40ZiAlNy40ZiAlNy40ZiAlNWRcdFx0JXMgJThkICU2ZFx0JXMiLAorCQkJcF9zdGRvdXRkYXRhLT5mcmFtZW51bSArIGhjLT50b3RhbF9mcmFtZXMgKiAyNTYsCisJCQl0eXAsIHBfc3Rkb3V0ZGF0YS0+dHIgKyBoYy0+dG90YWxfZnJhbWVzICogMjU2LAorCQkJcF9zdGRvdXRkYXRhLT5xcCwgcF9zdGRvdXRkYXRhLT5zbnJfeSwKKwkJCXBfc3Rkb3V0ZGF0YS0+c25yX3UsIHBfc3Rkb3V0ZGF0YS0+c25yX3YsCisJCQlwX3N0ZG91dGRhdGEtPnRtcF90aW1lLCBGcm1mbGQsCisJCQlwX3N0ZG91dGRhdGEtPmN1cnJfZnJhbWVfYml0cywKKwkJCXBfc3Rkb3V0ZGF0YS0+ZW11bGF0ZV9iaXRzLAorCQkJIiIpOworI2VuZGlmCisJaWYgKGlzX2F2czJfcHJpbnRfYnVmbWdyX2RldGFpbCgpKQorCQlwcl9pbmZvKCIgJXNcbiIsIHBfc3Rkb3V0ZGF0YS0+c3RyX3JlZmVyZW5jZV9saXN0KTsKKworCS8qZmZsdXNoKHN0ZG91dCk7Ki8KKwloZC0+RnJhbWVOdW0rKzsKK30KKwordm9pZCBhdnMyX3ByZXBhcmVfaGVhZGVyKHN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjLCBpbnQzMl90IHN0YXJ0X2NvZGUpCit7CisJc3RydWN0IEltYWdlUGFyYW1ldGVyc19zICAgICppbWcgPSAmYXZzMl9kZWMtPmltZzsKKwlzdHJ1Y3QgVmlkZW9fRGVjX2RhdGFfcyAqaGQgPSAmYXZzMl9kZWMtPmhkOworCisJc3dpdGNoIChzdGFydF9jb2RlKSB7CisJY2FzZSBTRVFVRU5DRV9IRUFERVJfQ09ERToKKwkJaW1nLT5uZXdfc2VxdWVuY2VfZmxhZyA9IDE7CisJCWlmIChpc19hdnMyX3ByaW50X2J1Zm1ncl9kZXRhaWwoKSkKKwkJCXByX2luZm8oIlNFUVVFTkNFXG4iKTsKKyNpZmRlZiBUT19DSEVDSworI2lmIFNFUV9DSEFOR0VfQ0hFQ0tFUgorCQlpZiAoc2VxX2NoZWNrZXJfYnVmID09IE5VTEwpIHsKKwkJCXNlcV9jaGVja2VyX2J1ZiA9IG1hbGxvYyhsZW5ndGgpOworCQkJc2VxX2NoZWNrZXJfbGVuZ3RoID0gbGVuZ3RoOworCQkJbWVtY3B5KHNlcV9jaGVja2VyX2J1ZiwgQnVmLCBsZW5ndGgpOworCQl9IGVsc2UgeworCQkJaWYgKChzZXFfY2hlY2tlcl9sZW5ndGggIT0gbGVuZ3RoKSB8fAorCQkJCShtZW1jbXAoc2VxX2NoZWNrZXJfYnVmLCBCdWYsIGxlbmd0aCkgIT0gMCkpIHsKKwkJCQlmcmVlKHNlcV9jaGVja2VyX2J1Zik7CisJCQkJLypmcHJpbnRmKHN0ZG91dCwKKwkJCQkgICJOb24tY29uZm9ybWFuY2UKKwkJCQkgIHN0cmVhbTogc2VxdWVuY2UKKwkJCQkgIGhlYWRlciBjYW5ub3QgY2hhbmdlCisJCQkJICAhIVxuIik7Ki8KKyNpZiBSRDE3MF9GSVhfQkcKKwkJCQlzZXFfY2hlY2tlcl9idWYgPSBOVUxMOworCQkJCXNlcV9jaGVja2VyX2xlbmd0aCA9IDA7CisJCQkJc2VxX2NoZWNrZXJfYnVmID0gbWFsbG9jKGxlbmd0aCk7CisJCQkJc2VxX2NoZWNrZXJfbGVuZ3RoID0gbGVuZ3RoOworCQkJCW1lbWNweShzZXFfY2hlY2tlcl9idWYsIEJ1ZiwgbGVuZ3RoKTsKKyNlbmRpZgorCQkJfQorCisKKwkJfQorI2VuZGlmCisjaWYgUkQxNzBfRklYX0JHCisJCWlmIChpbnB1dC0+YWxmX2VuYWJsZQorCQkJJiYgYWxmUGFyQWxsY29hdGVkID09IDEpIHsKKwkJCVJlbGVhc2VBbGZHbG9iYWxCdWZmZXIoKTsKKwkJCWFsZlBhckFsbGNvYXRlZCA9IDA7CisJCX0KKyNlbmRpZgorLypUT19DSEVDSyovCisjZW5kaWYKKyNpZiBGSVhfRkxVU0hfRFBCX0JZX0xGCisJCWlmIChoZC0+dmVjX2ZsYWcpIHsKKwkJCWludDMyX3QgazsKKwkJCWlmIChpc19hdnMyX3ByaW50X2J1Zm1ncl9kZXRhaWwoKSkKKwkJCQlwcl9pbmZvKCJ2ZWNfZmxhZyBpcyAxLCBmbHVzaERQQiBhbmQgcmVpbml0IGJ1Z21nclxuIik7CisKKwkJCWZsdXNoRFBCKGF2czJfZGVjKTsKKwkJCWZvciAoayA9IDA7IGsgPCBhdnMyX2RlYy0+cmVmX21heGJ1ZmZlcjsgaysrKQorCQkJCWNsZWFuUmVmTVZCdWZSZWYoayk7CisKKwkJCWhkLT52ZWNfZmxhZyA9IDA7CisjaWZkZWYgQU1MCisJCQlmcmVlX3VudXNlZF9idWZmZXJzKGF2czJfZGVjKTsKKyNlbHNlCisJCQlmcmVlX2dsb2JhbF9idWZmZXJzKGF2czJfZGVjKTsKKyNlbmRpZgorCQkJaW1nLT5udW1iZXIgPSAwOworCQkJaW1nLT5QcmV2UGljRGlzdGFuY2VMc2IgPSAwOworCQkJYXZzMl9kZWMtPmluaXRfaHdfZmxhZyA9IDA7CisJCX0KKyNlbmRpZgorCisjaWYgRklYX1NFUV9FTkRfRkxVU0hfRFBCX0JZX0xGCisJCWlmIChpbWctPm5ld19zZXF1ZW5jZV9mbGFnCisJCQkmJiBpbWctPnNlcXVlbmNlX2VuZF9mbGFnKSB7CisJCQlpbnQzMl90IGs7CisJCQlpZiAoaXNfYXZzMl9wcmludF9idWZtZ3JfZGV0YWlsKCkpCisJCQkJcHJfaW5mbygKKwkJCQkibmV3X3NlcXVlbmNlX2ZsYWcgYWZ0ZXIgc2VxdWVuY2VfZW5kX2ZsYWcsIGZsdXNoRFBCIGFuZCByZWluaXQgYnVnbWdyXG4iKTsKKwkJCWZsdXNoRFBCKGF2czJfZGVjKTsKKwkJCWZvciAoayA9IDA7IGsgPCBhdnMyX2RlYy0+cmVmX21heGJ1ZmZlcjsgaysrKQorCQkJCWNsZWFuUmVmTVZCdWZSZWYoayk7CisKKyNpZmRlZiBBTUwKKwkJCWZyZWVfdW51c2VkX2J1ZmZlcnMoYXZzMl9kZWMpOworI2Vsc2UKKwkJCWZyZWVfZ2xvYmFsX2J1ZmZlcnMoYXZzMl9kZWMpOworI2VuZGlmCisJCQlpbWctPm51bWJlciA9IDA7CisJCQlpbWctPlByZXZQaWNEaXN0YW5jZUxzYiA9IDA7CisJCQlhdnMyX2RlYy0+aW5pdF9od19mbGFnID0gMDsKKwkJfQorI2VuZGlmCisJCWltZy0+c2VxX2hlYWRlcl9pbmRpY2F0ZSA9IDE7CisJCWJyZWFrOworCWNhc2UgSV9QSUNUVVJFX1NUQVJUX0NPREU6CisJCWlmIChpc19hdnMyX3ByaW50X2J1Zm1ncl9kZXRhaWwoKSkKKwkJCXByX2luZm8oIlBJQy1JXG4iKTsKKwkJR2V0X1NlcXVlbmNlSGVhZGVyKGF2czJfZGVjKTsKKwkJR2V0X0lfUGljdHVyZV9IZWFkZXIoYXZzMl9kZWMpOworCQljYWxjX3BpY3R1cmVfZGlzdGFuY2UoYXZzMl9kZWMpOworCQlSZWFkX0FMRl9wYXJhbShhdnMyX2RlYyk7CisJCWlmICghaW1nLT5zZXFfaGVhZGVyX2luZGljYXRlKSB7CisJCQlpbWctPkJfZGlzY2FyZF9mbGFnID0gMTsKKwkJCS8qZnByaW50ZihzdGRvdXQsICIgICAgSQorCQkJICAlM2RcdFx0RElEU0NBUkQhIVxuIiwKKwkJCSAgaW1nLT50cik7Ki8KKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgUEJfUElDVFVSRV9TVEFSVF9DT0RFOgorCQlpZiAoaXNfYXZzMl9wcmludF9idWZtZ3JfZGV0YWlsKCkpCisJCQlwcl9pbmZvKCJQSUMtUEJcbiIpOworCQlHZXRfU2VxdWVuY2VIZWFkZXIoYXZzMl9kZWMpOworCQlHZXRfUEJfUGljdHVyZV9IZWFkZXIoYXZzMl9kZWMpOworCQljYWxjX3BpY3R1cmVfZGlzdGFuY2UoYXZzMl9kZWMpOworCQlSZWFkX0FMRl9wYXJhbShhdnMyX2RlYyk7CisJCS8qIHhpYW96aGVuIHpoZW5nLCAyMDA3MTAwOSovCisJCWlmICghaW1nLT5zZXFfaGVhZGVyX2luZGljYXRlKSB7CisJCQlpbWctPkJfZGlzY2FyZF9mbGFnID0gMTsKKworCQkJaWYgKGltZy0+dHlwZSA9PSBQX0lNRykgeworCQkJCS8qZnByaW50ZihzdGRvdXQsICIgICAgUAorCQkJCSAgJTNkXHRcdERJRFNDQVJEISFcbiIsCisJCQkJICBpbWctPnRyKTsqLworCQkJfQorCQkJaWYgKGltZy0+dHlwZSA9PSBGX0lNRykgeworCQkJCS8qZnByaW50ZihzdGRvdXQsICIgICAgRgorCQkJCSAgJTNkXHRcdERJRFNDQVJEISFcbiIsCisJCQkJICBpbWctPnRyKTsqLworCQkJfSBlbHNlIHsKKwkJCQkvKmZwcmludGYoc3Rkb3V0LCAiICAgIEIKKwkJCQkgICUzZFx0XHRESURTQ0FSRCEhXG4iLAorCQkJCSAgaW1nLT50cik7Ki8KKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaW1nLT5zZXFfaGVhZGVyX2luZGljYXRlID09IDEKKwkJCSYmIGltZy0+dHlwZSAhPSBCX0lNRykgeworCQkJaW1nLT5CX2Rpc2NhcmRfZmxhZyA9IDA7CisJCX0KKwkJaWYgKGltZy0+dHlwZSA9PSBCX0lNRyAmJiBpbWctPkJfZGlzY2FyZF9mbGFnID09IDEKKwkJCSYmICFpbWctPnJhbmRvbV9hY2Nlc3NfZGVjb2RhYmxlX2ZsYWcpIHsKKwkJCS8qZnByaW50ZihzdGRvdXQsICIgICAgQgorCQkJICAlM2RcdFx0RElEU0NBUkQhIVxuIiwKKwkJCSAgaW1nLT50cik7Ki8KKwkJCWJyZWFrOworCQl9CisKKwkJYnJlYWs7CisJY2FzZSBTRVFVRU5DRV9FTkRfQ09ERToKKwkJaWYgKGlzX2F2czJfcHJpbnRfYnVmbWdyX2RldGFpbCgpKQorCQkJcHJfaW5mbygiU0VRVUVOQ0VfRU5EX0NPREVcbiIpOworI2lmZGVmIFRPX0NIRUNLCisjaWYgU0VRX0NIQU5HRV9DSEVDS0VSCisJCWlmIChzZXFfY2hlY2tlcl9idWYgIT0gTlVMTCkgeworCQkJZnJlZShzZXFfY2hlY2tlcl9idWYpOworCQkJc2VxX2NoZWNrZXJfYnVmID0gTlVMTDsKKwkJCXNlcV9jaGVja2VyX2xlbmd0aCA9IDA7CisJCX0KKyNlbmRpZgorI2VuZGlmCitpbWctPm5ld19zZXF1ZW5jZV9mbGFnID0gMTsKK2ltZy0+c2VxdWVuY2VfZW5kX2ZsYWcgPSAxOworYnJlYWs7CisJY2FzZSBWSURFT19FRElUX0NPREU6CisJCWlmIChpc19hdnMyX3ByaW50X2J1Zm1ncl9kZXRhaWwoKSkKKwkJCXByX2luZm8oIlZJREVPX0VESVRfQ09ERVxuIik7CisJCS8qdmlkZW9fZWRpdF9jb2RlX2RhdGEoQnVmLCBzdGFydGNvZGVwb3MsIGxlbmd0aCk7Ki8KKwkJaGQtPnZlY19mbGFnID0gMTsKKyNpZmRlZiBUT19DSEVDSworI2lmIFNFUV9DSEFOR0VfQ0hFQ0tFUgorCQlpZiAoc2VxX2NoZWNrZXJfYnVmICE9IE5VTEwpIHsKKwkJCWZyZWUoc2VxX2NoZWNrZXJfYnVmKTsKKwkJCXNlcV9jaGVja2VyX2J1ZiA9IE5VTEw7CisJCQlzZXFfY2hlY2tlcl9sZW5ndGggPSAwOworCQl9CisjZW5kaWYKKyNlbmRpZgorCiticmVhazsKKwl9Cit9CisKKyNpZmRlZiBBTUwKK3N0YXRpYyB1aW50MzJfdCBsb2cyaSh1aW50MzJfdCB2YWwpCit7CisJdWludDMyX3QgcmV0ID0gLTE7CisJd2hpbGUgKHZhbCAhPSAwKSB7CisJCXZhbCA+Pj0gMTsKKwkJcmV0Kys7CisJfQorCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworaW50MzJfdCBhdnMyX3Byb2Nlc3NfaGVhZGVyKHN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjKQoreworCXN0cnVjdCBpbnBfcGFyICAgICppbnB1dCA9ICZhdnMyX2RlYy0+aW5wdXQ7CisJc3RydWN0IEltYWdlUGFyYW1ldGVyc19zICAgICppbWcgPSAmYXZzMl9kZWMtPmltZzsKKwlzdHJ1Y3QgVmlkZW9fRGVjX2RhdGFfcyAqaGQgPSAmYXZzMl9kZWMtPmhkOworCWludDMyX3QgbGN1X3hfbnVtX2RpdjsKKwlpbnQzMl90IGxjdV95X251bV9kaXY7CisKKwlpbnQzMl90IE44X1NpemVTY2FsZTsKKwkvKnByX2luZm8oIiVzXG4iLCBfX2Z1bmNfXyk7Ki8KKwl7CisJCU44X1NpemVTY2FsZSA9IDE7CisKKwkJaWYgKGhkLT5ob3Jpem9udGFsX3NpemUgJQorCQkJKE1JTl9DVV9TSVpFICogTjhfU2l6ZVNjYWxlKSAhPSAwKSB7CisJCQlpbWctPmF1dG9fY3JvcF9yaWdodCA9CisJCQkJKE1JTl9DVV9TSVpFICogTjhfU2l6ZVNjYWxlKSAtCisJCQkJKGhkLT5ob3Jpem9udGFsX3NpemUgJQorCQkJCShNSU5fQ1VfU0laRSAqIE44X1NpemVTY2FsZSkpOworCQl9IGVsc2UKKwkJCWltZy0+YXV0b19jcm9wX3JpZ2h0ID0gMDsKKworI2lmICFJTlRFUkxBQ0VfQ09ESU5HCisJCWlmIChoZC0+cHJvZ3Jlc3NpdmVfc2VxdWVuY2UpIC8qKi8KKyNlbmRpZgorCQl7CisJCQlpZiAoaGQtPnZlcnRpY2FsX3NpemUgJQorCQkJCShNSU5fQ1VfU0laRSAqIE44X1NpemVTY2FsZSkgIT0gMCkgeworCQkJCWltZy0+YXV0b19jcm9wX2JvdHRvbSA9CisJCQkJKE1JTl9DVV9TSVpFICogTjhfU2l6ZVNjYWxlKSAtCisJCQkJKGhkLT52ZXJ0aWNhbF9zaXplICUKKwkJCQkoTUlOX0NVX1NJWkUgKiBOOF9TaXplU2NhbGUpKTsKKwkJCX0gZWxzZQorCQkJCWltZy0+YXV0b19jcm9wX2JvdHRvbSA9IDA7CisJCX0KKworCQkvKiBSZWluaXQgcGFyYW1ldGVycyAoTk9URTogbmVlZCB0byBkbworCQkgIGJlZm9yZSBpbml0X2ZyYW1lIC8vKi8KKwkJaW1nLT53aWR0aCAgICAgICAgICA9CisJCQkoaGQtPmhvcml6b250YWxfc2l6ZSArIGltZy0+YXV0b19jcm9wX3JpZ2h0KTsKKwkJaW1nLT5oZWlnaHQgICAgICAgICA9CisJCQkoaGQtPnZlcnRpY2FsX3NpemUgKyBpbWctPmF1dG9fY3JvcF9ib3R0b20pOworCQlpbWctPndpZHRoX2NyICAgICAgID0gKGltZy0+d2lkdGggPj4gMSk7CisKKwkJaWYgKGlucHV0LT5jaHJvbWFfZm9ybWF0ID09IDEpCisJCQlpbWctPmhlaWdodF9jciAgICAgID0gKGltZy0+aGVpZ2h0ID4+IDEpOworCisJCWltZy0+UGljV2lkdGhJbk1icyAgPSBpbWctPndpZHRoIC8gTUlOX0NVX1NJWkU7CisJCWltZy0+UGljSGVpZ2h0SW5NYnMgPSBpbWctPmhlaWdodCAvIE1JTl9DVV9TSVpFOworCQlpbWctPlBpY1NpemVJbk1icyAgID0gaW1nLT5QaWNXaWR0aEluTWJzICogaW1nLT5QaWNIZWlnaHRJbk1iczsKKwkJaW1nLT5tYXhfbWJfbnIgICAgICA9IChpbWctPndpZHRoICogaW1nLT5oZWlnaHQpIC8KKwkJCShNSU5fQ1VfU0laRSAqIE1JTl9DVV9TSVpFKTsKKwl9CisKKwlpZiAoaW1nLT5uZXdfc2VxdWVuY2VfZmxhZyAmJiBpbWctPnNlcXVlbmNlX2VuZF9mbGFnKSB7CisjaWYgMC8qUkQxNzBfRklYX0JHIC8vKi8KKwkJaW50MzJfdCBrOworCQlmbHVzaERQQigpOworCQlmb3IgKGsgPSAwOyBrIDwgYXZzMl9kZWMtPnJlZl9tYXhidWZmZXI7IGsrKykKKwkJCWNsZWFuUmVmTVZCdWZSZWYoayk7CisKKwkJZnJlZV9nbG9iYWxfYnVmZmVycygpOworCQlpbWctPm51bWJlciA9IDA7CisjZW5kaWYKKwkJaGQtPmVuZF9TZXFUciA9IGltZy0+dHI7CisJCWltZy0+c2VxdWVuY2VfZW5kX2ZsYWcgPSAwOworCX0KKwlpZiAoaW1nLT5uZXdfc2VxdWVuY2VfZmxhZykgeworCQloZC0+bmV4dF9JRFJ0ciA9IGltZy0+dHI7CisJCWhkLT5uZXh0X0lEUmNvaSA9IGltZy0+Y29kaW5nX29yZGVyOworCQlpbWctPm5ld19zZXF1ZW5jZV9mbGFnID0gMDsKKwl9CisjaWYgMC8qUkQxNzBfRklYX0JHKi8KKwlpZiAoaGQtPnZlY19mbGFnKSB7CisJCWludDMyX3QgazsKKwkJZmx1c2hEUEIoKTsKKwkJZm9yIChrID0gMDsgayA8IGF2czJfZGVjLT5yZWZfbWF4YnVmZmVyOyBrKyspCisJCQljbGVhblJlZk1WQnVmUmVmKGspOworCisJCWhkLT52ZWNfZmxhZyA9IDA7CisJCWZyZWVfZ2xvYmFsX2J1ZmZlcnMoKTsKKwkJaW1nLT5udW1iZXIgPSAwOworCX0KKyNlbmRpZgorLyogYWxsb2NhdGUgbWVtb3J5IGZvciBmcmFtZSBidWZmZXJzKi8KKyNpZiAwCisvKiBjYWxsZWQgaW4gdmF2czIuYyovCisJaWYgKGltZy0+bnVtYmVyID09IDApCisJCWF2czJfaW5pdF9nbG9iYWxfYnVmZmVycyhhdnMyX2RlYyk7CisjZW5kaWYKKwlpbWctPmN1cnJlbnRfbWJfbnIgPSAwOworCisJaW5pdF9mcmFtZShhdnMyX2RlYyk7CisKKwlpbWctPnR5cGVzID0gaW1nLT50eXBlOyAgIC8qIGpsemhlbmcgNy4xNSovCisKKwlpZiAoaW1nLT50eXBlICE9IEJfSU1HKSB7CisJCWhkLT5wcmVfaW1nX3R5cGUgPSBpbWctPnR5cGU7CisJCWhkLT5wcmVfaW1nX3R5cGVzID0gaW1nLT50eXBlczsKKwl9CisKKyNpZmRlZiBBTUwKKwlhdnMyX2RlYy0+bGN1X3NpemVfbG9nMiA9IGxvZzJpKGF2czJfZGVjLT5sY3Vfc2l6ZSk7CisJbGN1X3hfbnVtX2RpdiA9IChpbWctPndpZHRoL2F2czJfZGVjLT5sY3Vfc2l6ZSk7CisJbGN1X3lfbnVtX2RpdiA9IChpbWctPmhlaWdodC9hdnMyX2RlYy0+bGN1X3NpemUpOworCWF2czJfZGVjLT5sY3VfeF9udW0gPSAoKGltZy0+d2lkdGggJSBhdnMyX2RlYy0+bGN1X3NpemUpID09IDApID8KKwkJbGN1X3hfbnVtX2RpdiA6IGxjdV94X251bV9kaXYrMTsKKwlhdnMyX2RlYy0+bGN1X3lfbnVtID0gKChpbWctPmhlaWdodCAlIGF2czJfZGVjLT5sY3Vfc2l6ZSkgPT0gMCkgPworCQlsY3VfeV9udW1fZGl2IDogbGN1X3lfbnVtX2RpdisxOworCWF2czJfZGVjLT5sY3VfdG90YWwgPSBhdnMyX2RlYy0+bGN1X3hfbnVtKmF2czJfZGVjLT5sY3VfeV9udW07CisjZW5kaWYKKwlyZXR1cm4gU09QOworfQorCitpbnQgYXZzMl9wb3N0X3Byb2Nlc3Moc3RydWN0IGF2czJfZGVjb2RlciAqYXZzMl9kZWMpCit7CisJc3RydWN0IEltYWdlUGFyYW1ldGVyc19zICAgICppbWcgPSAmYXZzMl9kZWMtPmltZzsKKwlzdHJ1Y3QgVmlkZW9fQ29tX2RhdGFfcyAqaGMgPSAmYXZzMl9kZWMtPmhjOworCXN0cnVjdCBWaWRlb19EZWNfZGF0YV9zICpoZCA9ICZhdnMyX2RlYy0+aGQ7CisJaW50MzJfdCBpOworCWludCByZXQ7CisJaWYgKGltZy0+dHlwZWIgPT0gQkFDS0dST1VORF9JTUcgJiYgaGQtPmJhY2tncm91bmRfcGljdHVyZV9lbmFibGUpIHsKKyNpZmRlZiBBTUwKKwkJZm9yIChpID0gMDsgaSA8IGF2czJfZGVjLT5yZWZfbWF4YnVmZmVyOyBpKyspIHsKKwkJCWlmIChhdnMyX2RlYy0+ZnJlZltpXS0+YmdfZmxhZyAhPSAwKSB7CisJCQkJYXZzMl9kZWMtPmZyZWZbaV0tPmJnX2ZsYWcgPSAwOworCQkJCWlmIChpc19hdnMyX3ByaW50X2J1Zm1ncl9kZXRhaWwoKSkKKwkJCQkJcHJfaW5mbygKKwkJCQkJImNsZWFyIG9sZCBCQUNLR1JPVU5EX0lNRyBmb3IgaW5kZXggJWRcclxuIiwKKwkJCQkJYXZzMl9kZWMtPmZyZWZbaV0tPmluZGV4KTsKKwkJCX0KKwkJfQorCQlpZiAoaXNfYXZzMl9wcmludF9idWZtZ3JfZGV0YWlsKCkpCisJCQlwcl9pbmZvKAorCQkJInBvc3RfcHJvY2Vzczogc2V0IEJBQ0tHUk9VTkRfSU1HIGZsYWcgZm9yICVkXHJcbiIsCisJCQloYy0+Y3VyX3BpYy0+aW5kZXgpOworCQlhdnMyX2RlYy0+Zl9iZyA9IGhjLT5jdXJfcGljOworCQloYy0+Y3VyX3BpYy0+YmdfZmxhZyA9IDE7CisjZW5kaWYKKwl9CisKKyNpZiBCQ0JSCisJaWYgKGhkLT5iYWNrZ3JvdW5kX3BpY3R1cmVfZW5hYmxlCisJCSYmIGhkLT5iY2JyX2VuYWJsZSAmJiBpbWctPm51bWJlciA+IDApCisJCXVwZGF0ZUJnUmVmZXJlbmNlKCk7CisjZW5kaWYKKworCWlmIChpbWctPnR5cGViID09IEJBQ0tHUk9VTkRfSU1HICYmCisJCWhkLT5iYWNrZ3JvdW5kX3BpY3R1cmVfb3V0cHV0X2ZsYWcgPT0gMCkKKwkJaGQtPmJhY2tncm91bmRfbnVtYmVyKys7CisKKwlpZiAoaW1nLT50eXBlID09IEJfSU1HKSB7CisJCWF2czJfZGVjLT5mcmVmWzBdLT5pbWd0cl9md1JlZkRpc3RhbmNlCisJCT0gaGQtPnRydG1wOworCX0KKworCS8qIHJlY29yZCB0aGUgcmVmZXJlbmNlIGxpc3QgaW5mb3JtYXRpb24qLworCWdldF9yZWZlcmVuY2VfbGlzdF9pbmZvKGF2czJfZGVjLCBhdnMyX2RlYy0+aGMuc3RyX2xpc3RfcmVmZXJlbmNlKTsKKworCS8qcHJfaW5mbygiJXNcbiIsIF9fZnVuY19fKTsqLworCXJldCA9IGZyYW1lX3Bvc3Rwcm9jZXNzaW5nKGF2czJfZGVjKTsKKworI2lmIEZJWF9QUk9GSUxFX0xFVkVMX0RQQl9SUFNfMQorCS8qIGRlbGV0ZSB0aGUgZnJhbWUgdGhhdCB3aWxsIG5ldmVyIGJlIHVzZWQqLworCXsKKwkJaW50MzJfdCBpLCBqOworCQlpZiAoaXNfYXZzMl9wcmludF9idWZtZ3JfZGV0YWlsKCkpIHsKKwkJCXByX2luZm8oCisJCQkJIiVzLCBjb2Rpbmdfb3JkZXIgJWQgdG8gcmVtb3ZlICVkIGJ1ZjogIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlpbWctPmNvZGluZ19vcmRlciwKKwkJCQloZC0+Y3Vycl9SUFMubnVtX3RvX3JlbW92ZSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgaGQtPmN1cnJfUlBTLm51bV90b19yZW1vdmU7IGkrKykKKwkJCQlwcl9pbmZvKCIlZCAiLCBoZC0+Y3Vycl9SUFMucmVtb3ZlX3BpY1tpXSk7CisJCQlwcl9pbmZvKCJcbiIpOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBoZC0+Y3Vycl9SUFMubnVtX3RvX3JlbW92ZTsgaSsrKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgYXZzMl9kZWMtPnJlZl9tYXhidWZmZXI7IGorKykgeworCisJCQkJaWYgKGF2czJfZGVjLT5mcmVmW2pdLT5pbWdjb2lfcmVmID49IC0yNTYKKwkJCQkJJiYgYXZzMl9kZWMtPmZyZWZbal0tPmltZ2NvaV9yZWYgPT0KKwkJCQkJaW1nLT5jb2Rpbmdfb3JkZXIgLQorCQkJCQloZC0+Y3Vycl9SUFMucmVtb3ZlX3BpY1tpXSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaiA8IGF2czJfZGVjLT5yZWZfbWF4YnVmZmVyKSB7IC8qKi8KKyNpZiBGSVhfUlBTX1BJQ1RVUkVfUkVNT1ZFCisvKiBMYWJlbCBuZXcgZnJhbWVzIGFzICJ1bi1yZWZlcmVuY2VkIiAqLworCQkJCWF2czJfZGVjLT5mcmVmW2pdLT5yZWZlcmVkX2J5X290aGVycyA9IDA7CisKKwkJCQkvKiByZW1vdmUgZnJhbWVzIHdoaWNoIGhhdmUgYmVlbiBvdXRwdXR0ZWQgKi8KKwkJCQlpZiAoYXZzMl9kZWMtPmZyZWZbal0tPmlzX291dHB1dCA9PSAtMSkgeworCQkJCQlhdnMyX2RlYy0+ZnJlZltqXS0+CisJCQkJCWltZ3RyX2Z3UmVmRGlzdGFuY2UgPSAtMjU2OworCQkJCQlhdnMyX2RlYy0+ZnJlZltqXS0+aW1nY29pX3JlZiA9IC0yNTc7CisJCQkJCWF2czJfZGVjLT5mcmVmW2pdLT50ZW1wb3JhbF9pZCA9IC0xOworCisJCQkJfQorI2Vsc2UKKwkJCQlhdnMyX2RlYy0+ZnJlZltqXS0+aW1nY29pX3JlZiA9IC0yNTc7CisjaWYgTTM0ODBfVEVNUE9SQUxfU0NBTEFCTEUKKwkJCQlhdnMyX2RlYy0+ZnJlZltqXS0+dGVtcG9yYWxfaWQgPSAtMTsKKyNlbmRpZgorCQkJCWlmIChhdnMyX2RlYy0+ZnJlZltqXS0+aXNfb3V0cHV0ID09IC0xKSB7CisJCQkJCWF2czJfZGVjLT5mcmVmW2pdLT5pbWd0cl9md1JlZkRpc3RhbmNlCisJCQkJCQk9IC0yNTY7CisJCQkJfQorI2VuZGlmCisJCQl9CisJCX0KKwl9CisjZW5kaWYKKworCisJLyohIFRPIDE5LjExLjIwMDEgS25vd24gUHJvYmxlbTogZm9yIGluaXRfZnJhbWUKKwkgKiB3ZSBoYXZlIHRvIGtub3cgdGhlIHBpY3R1cmUgdHlwZSBvZiB0aGUKKwkgKiBhY3R1YWwgZnJhbWUqLworCS8qISBpbiBjYXNlIHRoZSBmaXJzdCBzbGljZSBvZiB0aGUgUC1GcmFtZQorCSAqIGZvbGxvd2luZyB0aGUgSS1GcmFtZSB3YXMgbG9zdCB3ZSBkZWNvZGUgdGhpcworCSAqIFAtRnJhbWUgYnV0ISBkbyBub3Qgd3JpdGUgaXQgYmVjYXVzZSBpdAorCSAqIHdhcworCSAqIGFzc3VtZWQgdG8gYmUgYW4gSS1GcmFtZSBpbiBpbml0X2ZyYW1lLlNvIHdlCisJICogZm9yY2UgdGhlIGRlY29kZXIgdG8qLworCS8qISBndWVzcyB0aGUgcmlnaHQgcGljdHVyZSB0eXBlLiBUaGlzIGlzIGEgaGFjaworCSAqIGEgc2hvdWxkIGJlIHJlbW92ZWQgYnkgdGhlIHRpbWUgdGhlcmUgaXMgYQorCSAqIGNsZWFuKi8KKwkvKiEgc29sdXRpb24gd2hlcmUgd2UgZG8gbm90IGhhdmUgdG8ga25vdyB0aGUKKwkgKiBwaWN0dXJlIHR5cGUgZm9yIHRoZSBmdW5jdGlvbiBpbml0X2ZyYW1lLiovCisJLyohIEVuZCBUTyAxOS4xMS4yMDAxLy9Mb3UqLworCisJeworCQlpZiAoaW1nLT50eXBlID09IElfSU1HIHx8CisJCQlpbWctPnR5cGUgPT0gUF9JTUcgfHwKKwkJCWltZy0+dHlwZSA9PSBGX0lNRykKKwkJCWltZy0+bnVtYmVyKys7CisJCWVsc2UgeworCQkJaGMtPkJmcmFtZV9jdHIrKzsgIC8qIEIKKwkJCQkJICAgICAgcGljdHVyZXMqLworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgaW5pdF9hdnMyX2RlY29kZXIoc3RydWN0IGF2czJfZGVjb2RlciAqYXZzMl9kZWMpCit7CisJaW50MzJfdCBpLCBqLCBrOworCisJc3RydWN0IGlucF9wYXIgICAgKmlucHV0ID0gJmF2czJfZGVjLT5pbnB1dDsKKwlzdHJ1Y3QgSW1hZ2VQYXJhbWV0ZXJzX3MgICAgKmltZyA9ICZhdnMyX2RlYy0+aW1nOworCXN0cnVjdCBWaWRlb19Db21fZGF0YV9zICpoYyA9ICZhdnMyX2RlYy0+aGM7CisJc3RydWN0IFZpZGVvX0RlY19kYXRhX3MgKmhkID0gJmF2czJfZGVjLT5oZDsKKwlpZiAoaXNfYXZzMl9wcmludF9idWZtZ3JfZGV0YWlsKCkpCisJCXByX2luZm8oIlt0XSBzdHJ1Y3QgYXZzMl9kZWMgQDB4JXBcbiIsIGF2czJfZGVjKTsKKwltZW1zZXQoYXZzMl9kZWMsIDAsIHNpemVvZihzdHJ1Y3QgYXZzMl9kZWNvZGVyKSk7CisjaWZkZWYgQU1MCisJYXZzMl9kZWMtPnRvX3ByZXBhcmVfZGlzcF9jb3VudCA9IDE7CisjZW5kaWYKKwkvKgorCSAqIEFMRlBhcmFtIGluaXQKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCWF2czJfZGVjLT5tX2FsZlBpY3R1cmVQYXJhbVtpXS5hbGZfZmxhZyA9IDA7IC8qMSovCisJCWF2czJfZGVjLT5tX2FsZlBpY3R1cmVQYXJhbVtpXS5udW1fY29lZmYgPSA5OyAvKjEqLworCQlhdnMyX2RlYy0+bV9hbGZQaWN0dXJlUGFyYW1baV0uZmlsdGVyc19wZXJfZ3JvdXAgPSAzOyAgLyoxKi8KKwkJYXZzMl9kZWMtPm1fYWxmUGljdHVyZVBhcmFtW2ldLmNvbXBvbmVudElEID0gaTsgLyoxKi8KKwkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKKwkJCWF2czJfZGVjLT5tX2FsZlBpY3R1cmVQYXJhbVtpXS5maWx0ZXJQYXR0ZXJuW2pdCT0gMDsKKwkJCS8qMTYqLworCQl9CisJCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7CisJCQlmb3IgKGsgPSAwOyBrIDwgOTsgaysrKSB7CisJCQkJYXZzMl9kZWMtPgorCQkJCW1fYWxmUGljdHVyZVBhcmFtW2ldLmNvZWZmbXVsdGlbal1ba10gPSAwOworCQkJCS8qMTYqOSovCisJCQl9CisJCX0KKwl9CisKKwlpbWctPnNlcV9oZWFkZXJfaW5kaWNhdGUgPSAwOworCWltZy0+Ql9kaXNjYXJkX2ZsYWcgPSAwOworCisJaGQtPmVvcyA9IDA7CisKKwlpZiAoaW5wdXQtPnJlZl9waWNfb3JkZXIpIHsgICAvKnJlZiBvcmRlciovCisJCWhkLT5kZWNfcmVmX251bSA9IDA7CisJfQorCisJLyoKKwltZW1zZXQoZ19sb2cyc2l6ZSwgLTEsIE1BWF9DVV9TSVpFICsgMSk7CisJYyA9IDI7CisJZm9yIChrID0gNDsgayA8PSBNQVhfQ1VfU0laRTsgayAqPSAyKSB7CisJCWdfbG9nMnNpemVba10gPSBjOworCQljKys7CisJfQorCSAqLworCisJYXZzMl9kZWMtPm91dHByaW50LmJ1ZmZlcl9udW0gPSAwOworCisJaGQtPmxhc3Rfb3V0cHV0ID0gLTE7CisJaGQtPmVuZF9TZXFUciA9IC0xOworCWhkLT5jdXJyX0lEUnRyID0gMDsKKwloZC0+Y3Vycl9JRFJjb2kgPSAwOworCWhkLT5uZXh0X0lEUnRyID0gMDsKKwloZC0+bmV4dF9JRFJjb2kgPSAwOworCS8qIEFsbG9jYXRlIFNsaWNlIGRhdGEgc3RydWN0Ki8KKwlpbWctPm51bWJlciA9IDA7CisJaW1nLT50eXBlID0gSV9JTUc7CisKKwlpbWctPmltZ3RyX25leHRfUCA9IDA7CisKKwlpbWctPmltZ2NvaV9uZXh0X3JlZiA9IDA7CisKKworCWltZy0+bnVtX29mX3JlZmVyZW5jZXMgPSAwOworCWhjLT5zZXFfaGVhZGVyID0gMDsKKworCWltZy0+bmV3X3NlcXVlbmNlX2ZsYWcgICA9IDE7CisKKwloZC0+dmVjX2ZsYWcgPSAwOworCisJaGQtPkZyYW1lTnVtID0gMDsKKworCS8qIEIgcGljdHVyZXMqLworCWhjLT5CZnJhbWVfY3RyID0gMDsKKwloYy0+dG90YWxfZnJhbWVzID0gMDsKKworCS8qIHRpbWUgZm9yIHRvdGFsIGRlY29kaW5nIHNlc3Npb24qLworCWhjLT50b3RfdGltZSA9IDA7CisKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC9hdnMyL2F2czJfZ2xvYmFsLmggYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL2F2czIvYXZzMl9nbG9iYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWY4NWJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC9hdnMyL2F2czJfZ2xvYmFsLmgKQEAgLTAsMCArMSwxNjg3IEBACisvKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIEJTRAorICogTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgcGFydHkKKyAqIGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMgYXJlCisgKiBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNiwgQXVkaW8gVmlkZW8gY29kaW5nIFN0YW5kYXJkIFdvcmtncm91cCBvZiBDaGluYQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgQXVkaW8gVmlkZW8gY29kaW5nIFN0YW5kYXJkIFdvcmtncm91cCBvZiBDaGluYQorICogICAgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heWJlCisgKiAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKworCisKKy8qCisgKiBGaWxlIG5hbWU6IGdsb2JhbC5oCisgKiBGdW5jdGlvbjogIGdsb2JhbCBkZWZpbml0aW9ucyBmb3IgZm9yIEFWUyBkZWNvZGVyLgorICoKKyAqLworCisjaWZuZGVmIF9HTE9CQUxfSF8KKyNkZWZpbmUgX0dMT0JBTF9IXworCisvKiAjaW5jbHVkZSA8c3RkaW8uaD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyE8IGZvciBGSUxFICovCisvKiAjaW5jbHVkZSA8c3RkbGliLmg+ICovCisKKyNkZWZpbmUgQU1MCisjZGVmaW5lIFNBTklUWV9DSEVDSworI3VuZGVmIE5PX0RJU1BMQVkKKworLyogI2luY2x1ZGUgImRlZmluZS5oIiAqLworI2RlZmluZSBSRCAgICAgICIxOS4yIgorI2RlZmluZSBWRVJTSU9OICIxOS4yIgorCisjZGVmaW5lIFJFU0VSVkVEX1BST0ZJTEVfSUQgICAgICAweDI0CisjZGVmaW5lIEJBU0VMSU5FX1BJQ1RVUkVfUFJPRklMRSAxOAorI2RlZmluZSBCQVNFTElORV9QUk9GSUxFICAgICAgICAgMzIgIC8qIDB4MjAgKi8KKyNkZWZpbmUgQkFTRUxJTkUxMF9QUk9GSUxFICAgICAgIDM0ICAvKiAweDIyICovCisKKworI2RlZmluZSBTQ0VORV9QUk9GSUxFICAgICAgICAgICAgNDggIC8qIDB4MjEgKi8KKyNkZWZpbmUgU0NFTkUxMF9QUk9GSUxFICAgICAgICAgIDUwICAvKiAweDIzICovCisKKyNkZWZpbmUgVFJBQ0UgICAgICAgICAgICAgICAgICAgIDAgLyogITwgMDpUcmFjZSBvZmYgMTpUcmFjZSBvbiAqLworCisKKy8qIFR5cGUgZGVmaW5pdGlvbnMgYW5kIGZpbGUgb3BlcmF0aW9uIGZvciBXaW5kb3dzL0xpbnV4CisgKiBBbGwgZmlsZSBvcGVyYXRpb25zIGZvciB3aW5kb3dzIGFyZSByZXBsYWNlZCB3aXRoIG5hdGl2ZSAoRklMRSAqKSBvcGVyYXRpb25zCisgKiBGYWxlaSBMVU8gKGZhbGVpLmx1b0B2aXBsLmljdC5hYy5jbikKKyAqICovCisKKyNkZWZpbmUgX0ZJTEVfT0ZGU0VUX0JJVFMgNjQgICAgICAgLyogZm9yIDY0IGJpdCBmc2Vla28gKi8KKyNkZWZpbmUgZnNlZWsgZnNlZWtvCisKKyNkZWZpbmUgaW50MTYgaW50MTZfdAorI2RlZmluZSBpbnQ2NCBpbnQ2NF90CisKKy8qIC8vLy8vLy8vLy8vLy8vLy8vLyBidWcgZml4IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisjZGVmaW5lIEFMRlNsaWNlRml4ICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXUklURU5CSVRfRklYICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRklYX1BST0ZJTEVfTEVWRUxfRFBCX1JQU18xICAgICAgICAxCisjZGVmaW5lIEZJWF9QUk9GSUxFX0xFVkVMX0RQQl9SUFNfMiAgICAgICAgMQorI2RlZmluZSBGSVhfUlBTX1BJQ1RVUkVfUkVNT1ZFICAgICAgICAgICAgIDEgICAvKiBmbGx1b0Bwa3UuZWR1LmNuICovCisjZGVmaW5lIE12X0NsaXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgIC8qIHl1cXVhbmhlQGhpc2lsaWNvbi5jb20gKi8KKyNkZWZpbmUgUkVNT1ZFX1VOVVNFRCAgICAgICAgICAgICAgICAgICAgICAxICAgLyogeXVxdWFuaGVAaGlzaWxpY29uLmNvbSAqLworI2RlZmluZSBTQU9fSGVpZ2h0X0ZpeCAgICAgICAgICAgICAgICAgICAgIDEgICAvKiB5dXF1YW5oZUBoaXNpbGljb24uY29tICovCisjZGVmaW5lIEJfQkFDS0dST1VORF9GaXggICAgICAgICAgICAgICAgICAgMSAgIC8qIHl1cXVhbmhlQGhpc2lsaWNvbi5jb20gKi8KKyNkZWZpbmUgQ2hlY2tfQml0c3RyZWFtICAgICAgICAgICAgICAgICAgICAxICAgLyogeXVxdWFuaGVAaGlzaWxpY29uLmNvbSAqLworI2RlZmluZSBXcV9wYXJhbV9DbGlwICAgICAgICAgICAgICAgICAgICAgIDEgICAvKiB5dXF1YW5oZUBoaXNpbGljb24uY29tICovCisgICAgLyogbHVvZmFsZWkgZmxsdW9AcGt1LmVkdS5jbiAsIHdscTE1QG1haWxzLnRzaW5naHVhLmVkdS5jbiAsCisgICAgTG9uZ2ZlaS5XYW5nQG1lZGlhdGVrLmNvbSAqLworI2RlZmluZSBSRDE1MDFfRklYX0JHICAgICAgICAgICAgICAgICAgICAgIDEKKyAgICAvKiB5dXF1YW5oZUBoaXNpbGljb24uY29tIDsgaGUteXVhbi5saW5AbXN0YXJzZW1pLmNvbSAqLworI2RlZmluZSBNdl9SYW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyAgICAgLyogTG9uZ2ZlaS5XYW5nQG1lZGlhdGVrLmNvbSA7ZnJlZC5jaGl1QG1lZGlhdGVrLmNvbQorICAgICBqaWUxMjIyLmNoZW5Ac2Ftc3VuZy5jb20gKi8KKyNkZWZpbmUgUkQxNjBfRklYX0JHICAgICAgICAgICAgICAgICAgICAgICAxCisgICAgIC8qIFlfS19UdUBub3ZhdGVrLmNvbS50dywgaGUteXVhbi5saW5AbXN0YXJzZW1pLmNvbSwKKyAgICAgdmljdG9yLmh1YW5nQG1vbnRhZ2UtdGVjaC5jb20gTTQwNDEgKi8KKyNkZWZpbmUgUkQxNjAxX0ZJWF9CRyAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNFUV9DSEFOR0VfQ0hFQ0tFUiAgICAgICAgICAgICAgICAgMSAgICAvKiBoZS15dWFuLmxpbkBtc3RhcnNlbWkuY29tICovCisjZGVmaW5lIE00MTQwX0VORF9PRl9TTElDRV9DSEVDS0VSICAgICAgICAgMSAgICAvKiBoZS15dWFuLmxpbkBtc3RhcnNlbWkuY29tICovCisgICAgIC8qIHdscTE1QG1haWxzLnRzaW5naHVhLmVkdS5jbiAqLworI2RlZmluZSBNdl9jaGVja19idWcgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU0FPX0FTU0VSVElPTl9GSVggICAgICAgICAgICAgICAgICAxICAgIC8qIGZyZWQuY2hpdUBtZWRpYXRlay5jb20gKi8KKyNkZWZpbmUgRklFTERfSE9SSV9NVl9OT19TQ0FMRV9GSVggICAgICAgICAxICAgIC8qIGZyZWQuY2hpdUBtZWRpYXRlay5jb20gKi8KKyNkZWZpbmUgUkQxNzBfRklYX0JHICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEZJWF9DSFJPTUFfRklFTERfTVZfQktfRElTVCAgICAgICAgMQorI2RlZmluZSBGSVhfTFVNQV9GSUVMRF9NVl9CS19ESVNUICAgICAgICAgIDEKKyNkZWZpbmUgRklYX0NIUk9NQV9GSUVMRF9NVl9DTElQICAgICAgICAgICAxCisjaWYgMQorI2RlZmluZSBGSVhfRkxVU0hfRFBCX0JZX0xGICAgICAgICAgICAgICAgIDEgICAgLyogZnJlZC5jaGl1QG1lZGlhdGVrLmNvbSAqLworI2RlZmluZSBGSVhfU0VRX0VORF9GTFVTSF9EUEJfQllfTEYgICAgICAgIDEgICAvKiBmcmVkLmNoaXVAbWVkaWF0ZWsuY29tICovCisjZWxzZQorI2RlZmluZSBGSVhfRkxVU0hfRFBCX0JZX0xGICAgICAgICAgICAgICAgIDAgICAgLyogZnJlZC5jaGl1QG1lZGlhdGVrLmNvbSAqLworI2RlZmluZSBGSVhfU0VRX0VORF9GTFVTSF9EUEJfQllfTEYgICAgICAgIDAgICAvKiBmcmVkLmNoaXVAbWVkaWF0ZWsuY29tICovCisjZW5kaWYKKyNkZWZpbmUgUkQxOTFfRklYX0JVRyAgICAgICAgICAgICAgICAgICAgICAxICAvKiB5dXF1YW5oZUBoc2lsaWNvbi5jb20gKi8KKyNkZWZpbmUgU1lNX01WX1NDQUxFX0ZJWCAgICAgICAgICAgICAgICAgICAxLyogcGVpc29uZy5jaGVuQGJyb2FkY29tLmNvbSAqLworI2RlZmluZSBCVUdfMTBCSVRfUkVGSU5FUVAgICAgICAgICAgICAgICAgIDAgLyogd2FuZ3poZW55dSAqLworCisKKworI2lmIFJEMTkxX0ZJWF9CVUcKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBVlMyIG1hY3JvcyBzdGFydAorICoqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElOVEVSTEFDRV9DT0RJTkcgICAgICAgICAgICAgICAgICAgMQorI2lmIElOVEVSTEFDRV9DT0RJTkcgIC8qIE0zNTMxOiBNViBzY2FsaW5nIGNvbXBlbnNhdGlvbiAqLworLyogTHVtYSBjb21wb25lbnQgKi8KKyNkZWZpbmUgSEFMRl9QSVhFTF9DT01QRU5TQVRJT04gICAgICAgICAgICAxIC8qIGNvbW1vbiBmdW5jdGlvbnMgZGVmaW5pdGlvbiAqLworI2RlZmluZSBIQUxGX1BJWEVMX0NPTVBFTlNBVElPTl9QTVYgICAgICAgIDEgLyogc3BhY2lhbCBNViBwcmVkaWN0aW9uICovCisjZGVmaW5lIEhBTEZfUElYRUxfQ09NUEVOU0FUSU9OX0RJUkVDVCAgICAgMSAvKiBCIGRpcmVjdCBtb2RlICovCisgIC8qIE1WIGRlcml2YXRpb24gbWV0aG9kIDEsIHdlaWdodGVkIFBfc2tpcCBtb2RlICovCisjZGVmaW5lIEhBTEZfUElYRUxfQ09NUEVOU0FUSU9OX00xICAgICAgICAgMQorICAvKiBNMSByZWxhdGVkIHdpdGggbXYtc2NhbGluZyBmdW5jdGlvbiAqLworI2RlZmluZSBIQUxGX1BJWEVMX0NPTVBFTlNBVElPTl9NMV9GVUNUSU9OIDEKKyNkZWZpbmUgSEFMRl9QSVhFTF9DT01QRU5TQVRJT05fTVZEICAgICAgICAxIC8qIE1WIHNjYWxpbmcgZnJvbSBGVy0+QlcgKi8KKy8qIENocm9tYSBjb21wb25lbnRzICovCisgIC8qIGNocm9tYSBNViBpcyBzY2FsZWQgd2l0aCBsdW1hIE1WIGZvciA0OjI6MCBmb3JtYXQgKi8KKyNkZWZpbmUgSEFMRl9QSVhFTF9DSFJPTUEgICAgICAgICAgICAgICAgICAxCisgIC8qIGhhbGYgcGl4ZWwgY29tcGVuc2F0aW9uIGZvciBwIHNraXAvZGlyZWN0ICovCisjZGVmaW5lIEhBTEZfUElYRUxfUFNLSVAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlRFUkxBQ0VfQ09ESU5HX0ZJWCAgICAgICAgICAgICAgIDEgLyogSExTIGZpeCAqLworI2RlZmluZSBPVVRQVVRfSU5URVJMQUNFX01FUkdFRF9QSUMgICAgICAgIDEKKworI2VuZGlmCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0FWUzIgMTBiaXQvMTJiaXQgcHJvZmlsZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2RlZmluZSBEQkZJWF8xMGJpdCAgICAgICAgICAgICAgMQorCisjZGVmaW5lIEJVR18xMGJpdCAgICAgICAgICAgICAgMQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQVZTMiBISUdIIExFVkVMIFNZTlRBWAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisjZGVmaW5lIEFWUzJfSERSX0hMUyAgICAgICAgICAgICAxCisgLyogQVZTMiBIRFIgdGVjaG5vbG9neSAvL3l1cXVhbmhlQGhpc2lsaWNvbi5jb20gKi8KKyNkZWZpbmUgQVZTMl9IRFJfVGVjICAgICAgICAgICAgICAgICAgICAgICAxCisjaWYgQVZTMl9IRFJfVGVjCisjZGVmaW5lIEhEUl9DSFJPTUFfREVMVEFfUVAgICAgICAgICAgICAgICAgMSAvKiBNMzkwNSAqLworI2RlZmluZSBIRFJfQURQVElWRV9VVl9ERUxUQSAgICAgICAgICAgICAgICAgIDEKKyNlbmRpZgorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitBVlMyIFMyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisjZGVmaW5lIEFWUzJfUzJfRkFTVE1PREVERUNJU0lPTiAxCisjZGVmaW5lIFJEMTUxMF9GSVhfQkcgICAgICAgICAgICAxICAgICAgLyogMjAxNjA3MTQsIGZsbHVvQHBrdS5lZHUuY24gKi8KKworCisvKiAvLy8vLy8vLy8vLy8vLy8vLy8gcHJlZGljdGlvbiB0ZWNobmlxdWVzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisjZGVmaW5lIExBTV8yTGV2ZWxfVFUgICAgICAgICAgICAwLjgKKworCisjZGVmaW5lIERJUkVDVElPTiAgICAgICAgICAgICAgICA0CisjZGVmaW5lIERTX0ZPUldBUkQgICAgICAgICAgICAgICA0CisjZGVmaW5lIERTX0JBQ0tXQVJEICAgICAgICAgICAgICAyCisjZGVmaW5lIERTX1NZTSAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIERTX0JJRCAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgTUhfUFNLSVBfTlVNICAgICAgICAgICAgIDQKKyNkZWZpbmUgTlVNX09GRlNFVCAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQklEX1BfRlNUICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQklEX1BfU05EICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgRldfUF9GU1QgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgRldfUF9TTkQgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgV1BNX05VTSAgICAgICAgICAgICAgICAgIDMKKyAgICAgIC8qIE0zMzMwIGNoYW5nZXMgaXQgdG8gMiwgdGhlIG9yaWdpbmFsIHZhbHVlIGlzIDMgKi8KKyNkZWZpbmUgTUFYX01WUF9DQU5EX05VTSAgICAgICAgIDIKKworI2RlZmluZSBETUhfTU9ERV9OVU0gICAgICAgICAgICAgNSAgICAgLyogTnVtYmVyIG9mIERNSCBtb2RlICovCisjZGVmaW5lIFRIX01FICAgICAgICAgICAgICAgICAgICAwICAgICAvKiBUaHJlc2hvbGQgb2YgTUUgKi8KKworI2RlZmluZSBNVl9TQ0FMRSAgICAgICAgICAgICAgICAgMQorCisvKiAvLy8vLyByZWZlcmVuY2UgcGljdHVyZSBtYW5hZ2VtZW50IC8vICovCisjZGVmaW5lIEZJWF9NQVhfUkVGICAgICAgICAgICAgICAxICAgICAvKiBGYWxlaSBMVU8sIGZsbHVvQHBrdS5lZHUuY24gKi8KKyNpZiBGSVhfTUFYX1JFRgorICAgICAgLyogbWF4aW11bSBudW1iZXIgb2YgcmVmZXJlbmNlIGZyYW1lIGZvciBlYWNoIGZyYW1lICovCisjZGVmaW5lIE1BWFJFRiAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIE1BWEdPUCAgICAgICAgICAgICAgICAgICAzMgorI2VuZGlmCisKKy8qICNkZWZpbmUgUkVGX01BWEJVRkZFUiAgICAgICAgICAgIDcgKi8KKy8qIG1vcmUgYnVmZmVyZXMgZm9yIGRpc3BsYXlpbmcgYW5kIGJhY2tncm91bmQgKi8KKy8qICNkZWZpbmUgUkVGX01BWEJVRkZFUiAgICAgICAgICAgIDE1ICovCisjaWYgMQorI2RlZmluZSBSRUZfTUFYQlVGRkVSICAgICAgICAgICAgMjMKKyNkZWZpbmUgUkVGX0JVRkZFUiAgMTYKKyNlbHNlCisjaWYgUkQxNzBfRklYX0JHCisjZGVmaW5lIFJFRl9NQVhCVUZGRVIgICAgICAgICAgICAxNgorI2Vsc2UKKyNkZWZpbmUgUkVGX01BWEJVRkZFUiAgICAgICAgICAgIDcKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBUT19QT1JUSU5HCisgICAgLyogYmxvY2stY29tcG9zZWQgYmFja2dyb3VuZCByZWZlcmVuY2UsIGZhbmdkb25nQG1haWwudXN0Yy5lZHUuY24gKi8KKyNkZWZpbmUgQkNCUiAgICAgICAgICAgICAgICAgICAgIDEKKyNlbHNlCisjZGVmaW5lIEJDQlIgICAgMAorI2VuZGlmCisvKiBvbmUgbW9yZSBidWZmZXIgZm9yIGJhY2tncm91bmQgd2hlbiBiYWNrZ3JvdW5kX3BpY3R1cmVfb3V0cHV0X2ZsYWcgaXMgMCovCisjZGVmaW5lIEFWUzJfTUFYX0JVRkZFUl9OVU0gICAgICAgICAgICAgICAoUkVGX01BWEJVRkZFUiArIDEpCisKKy8qIC8vLy8vLy8vLy8vLy8vLy8vQWRhcHRpdmUgTG9vcCBGaWx0ZXIvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworI2RlZmluZSBOVU1fQUxGX0NPRUZGX0NUWCAgICAgICAgMQorI2RlZmluZSBOVU1fQUxGX0xDVV9DVFggICAgICAgICAgNAorCisjZGVmaW5lIExBTUJEQV9TQ0FMRV9MVU1BICAgICAgICgxLjApCisjZGVmaW5lIExBTUJEQV9TQ0FMRV9DSFJPTUEgICAgICgxLjApCisKKworCisvKiAvLy8vLy8vLy8vLy8vLy8vLy8gZW50cm9weSBjb2RpbmcgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKyAgIC8qIE0zMDkwOiBNYWtlIHN1cmUgcnMxIHdpbGwgbm90IG92ZXJmbG93IGZvciA4LWJpdCB1bnNpZ24gY2hhciAqLworI2RlZmluZSBOVU5fVkFMVUVfQk9VTkQgICAgICAgICAgMjU0CisjZGVmaW5lIEVuY29kZXJfQllQQVNTX0ZpbmFsICAgICAxICAgIC8qIE0zNDg0ICovCisjZGVmaW5lIERlY29kZXJfQnlwYXNzX0FubmV4ICAgICAwICAgIC8qIE0zNDg0ICovCisjZGVmaW5lIERlY29kZXJfRmluYWxfQW5uZXggICAgICAwICAgIC8qIE0zNTQwICovCisKKworLyogLy8vLy8vLy8vLy8vLy8vLy8vIGNvZWZmaWNpZW50IGNvZGluZyAvLy8vLyAqLworICAgICAvKiBNMzAzNSBzaXplIG9mIGFuIGNvZWZmaWNpZW50IGdyb3VwLCA0eDQgKi8KKyNkZWZpbmUgQ0dfU0laRSAgICAgICAgICAgICAgICAgIDE2CisKKyNkZWZpbmUgU1dBUCh4LCB5KSB7XAorCSh5KSA9ICh5KSBeICh4KTtcCisJKHgpID0gKHkpIF4gKHgpO1wKKwkoeSkgPSAoeCkgXiAoeSk7XAorfQorCisvKiAvLy8vLy8vLy8vLy8vLy8vLy8gZW5jb2RlciBvcHRpbWl6YXRpb24gLy8vLy8vLyAqLworI2RlZmluZSBUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKworI2RlZmluZSBNMzYyNE1ETE9HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXNlcnZlZCAqLworCisjZGVmaW5lIFREUkRPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE0zNTI4ICovCisvKiAjZGVmaW5lIEZJWF9URFJET19CRyAgMSAgLy8gZmxsdW9AcGt1LmVkdS5jbiwgMjAxNjAzMTgvLyAqLworI2RlZmluZSBSQVRFQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNMzU4MCBNMzYyNyBNMzY4OSAqLworI2RlZmluZSBBUVBPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNMzYyMyAqLworI2RlZmluZSBBUVBPTTM2OTQgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFRUE9NNDA2MyAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVFQT00zNzYyICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBCR1FQTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNNDA2MSAqLworI2lmIEJHUVBPCisjZGVmaW5lIExPTkdSRUZFUkVOQ0UgICAgICAgICAgICAgICAgICAgICAgIDMyCisjZW5kaWYKKworLyogI2RlZmluZSBSRVBPUlQgKi8KKy8qIC8vLy8vLy8vLy8vLy8vLy8vLyBRdWFudGl6YXRpb24gICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKyAvKiBBZGFwdGl2ZSBmcmVxdWVuY3kgd2VpZ2h0aW5nIHF1YW50aXphdGlvbiAqLworI2RlZmluZSBGUkVRVUVOQ1lfV0VJR0hUSU5HX1FVQU5USVpBVElPTiAgICAxCisjaWYgRlJFUVVFTkNZX1dFSUdIVElOR19RVUFOVElaQVRJT04KKyNkZWZpbmUgQ0hST01BX0RFTFRBX1FQICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBV1FfV0VJR0hUSU5HICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFXUV9MQVJHRV9CTE9DS19FTkFCTEUgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ09VTlRfQklUX09WRVJIRUFEICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBV1FfTEFSR0VfQkxPQ0tfRVhUX01BUFBJTkcgICAgICAgICAxCisjZW5kaWYKKworI2RlZmluZSBRdWFudENsaXAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFF1YW50TWF0cml4Q2xpcEZpeCAgICAgICAgICAgICAgICAgIDEgIC8qIDIwMTYwNDE4LCBmbGx1QHBrdS5lZHUuY24gKi8KKworI2RlZmluZSBXUV9NQVRSSVhfRkNEICAgICAgICAgICAgICAgICAgICAgICAxCisjaWYgIVdRX01BVFJJWF9GQ0QKKyNkZWZpbmUgV1FfRkxBVEJBU0VfSU5CSVQgIDcKKyNlbHNlCisjZGVmaW5lIFdRX0ZMQVRCQVNFX0lOQklUICA2CisjZW5kaWYKKworCisjZGVmaW5lIFJFRklORURfUVAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworCisvKiAvLy8vLy8vLy8vLy8vLy8vLy8gZGVsdGEgUVAgLy8vLy8gKi8KKyAgICAgIC8qIE0zMTIyOiB0aGUgbWluaW11bSBkUVAgdW5pdCBpcyBNYWNybyBibG9jayAqLworI2RlZmluZSBNQl9EUVAgICAgICAgICAgICAgICAgICAgIDEKKyAgICAgIC8qIE0zMTIyOiAxIHJlcHJlc2VudHMgbGVmdCBwcmVkaWN0aW9uCisgICAgICBhbmQgMCByZXByZXNlbnRzIHByZXZpb3VzIHByZWRpY3Rpb24gKi8KKyNkZWZpbmUgTEVGVF9QUkVESUNUSU9OICAgICAgICAgICAxCisKKworLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1NBTy8vLy8vLy8vLyAqLworI2RlZmluZSBOVU1fQk9fT0ZGU0VUICAgICAgICAgICAgIDMyCisjZGVmaW5lIE1BWF9OVU1fU0FPX0NMQVNTRVMgICAgICAgMzIKKyNkZWZpbmUgTlVNX1NBT19CT19DTEFTU0VTX0xPRzIgICA1CisjZGVmaW5lIE5VTV9TQU9fQk9fQ0xBU1NFU19JTl9CSVQgNQorI2RlZmluZSBNQVhfRE9VQkxFICAgICAgICAgICAgICAgICgxLjdlICsgMzA4KQorI2RlZmluZSBOVU1fU0FPX0VPX1RZUEVTX0xPRzIgICAgIDIKKyNkZWZpbmUgTlVNX1NBT19CT19DTEFTU0VTICAgICAgICAoMTw8TlVNX1NBT19CT19DTEFTU0VTX0xPRzIpCisjZGVmaW5lIFNBT19SQVRFX1RIUiAgICAgICAgICAgICAgMC43NQorI2RlZmluZSBTQU9fUkFURV9DSFJPTUFfVEhSICAgICAgIDEKKyNkZWZpbmUgU0FPX1NISUZUX1BJWF9OVU0gICAgICAgICA0CisKKyNkZWZpbmUgU0FPX1BBUkFfQ1JPU1NfU0xJQ0UgICAgICAxCisjZGVmaW5lIFNBT19NVUxTTElDRV9GVFJfRklYICAgICAgMQorCisvKiAvLy8vLy8vLy8vLy8vLy8vLy8vIFRyYW5zZm9ybSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKyNkZWZpbmUgU0VDX1RSX1NJWkUgICAgICAgICAgICAgICA0CisgICAvKiBhcHBseSBzZWNUIHRvIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA4eDggYmxvY2ssICovCisjZGVmaW5lIFNFQ19UUl9NSU5fQklUU0laRSAgICAgICAgMworCisjZGVmaW5lIEJVR0ZJWEVEX0NPTUJJTkVEX1NUX0JEICAgMQorCisvKiAvLy8vLy8vLy8vLy8vLy8vLy8vIFNjYWxhYmxlIC8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworI2RlZmluZSBNMzQ4MF9URU1QT1JBTF9TQ0FMQUJMRSAgIDEKKyNkZWZpbmUgVEVNUE9SQUxfTUFYTEVWRUwgICAgICAgICA4CisjZGVmaW5lIFRFTVBPUkFMX01BWExFVkVMX0JJVCAgICAgMworCisKKworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFWUzIgbWFjcm9zIGVuZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2RlZmluZSBDSFJPTUEgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTFVNQV84eDggICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIE5VTV9CTE9DS19UWVBFUyAgICAgICAgICAgOAorCisjaWYgKCFkZWZpbmVkIGNsYW1wKQorICAgICAvKiAhPCBjbGFtcCBhIHRvIHRoZSByYW5nZSBvZiBbYjtjXSAqLworI2RlZmluZSBjbGFtcChhLCBiLCBjKSAoKGEpIDwgKGIpID8gKGIpIDogKChhKSA+IChjKSA/IChjKSA6IChhKSkpCisjZW5kaWYKKworCS8qIFBPQzIwMDMwMSBtb3ZlZCBmcm9tIGRlZmluZXMuaCAqLworI2RlZmluZSBMT0cyX01BWF9GUkFNRV9OVU1fTUlOVVM0ICAgIDQKKwkvKiAhPCBieXRlcyBmb3Igb25lIGZyYW1lICovCisjZGVmaW5lIE1BWF9DT0RFRF9GUkFNRV9TSVpFICAgICAgICAgMTUwMDAwMDAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEZMQUdTIGFuZCBERUZJTkVTIGZvciBuZXcgY2hyb21hIGludHJhIHByZWRpY3Rpb24sIER6dW5nIEhvYW5nICovCisvKiBUaHJlc2hvbGQgdmFsdWVzIHRvIHplcm8gb3V0IHF1YW50aXplZCB0cmFuc2Zvcm0gY29lZmZpY2llbnRzLiAqLworLyogUmVjb21tZW5kIHRoYXQgX0NIUk9NQV9DT0VGRl9DT1NUXyBiZSBsb3cgdG8gaW1wcm92ZSBjaHJvbWEgcXVhbGl0eSAqLworI2RlZmluZSBfTFVNQV9DT0VGRl9DT1NUXyAgICAgICAgIDQgLyogITwgdGhyZXNob2xkIGZvciBsdW1hIGNvZWZmcyAqLworICAvKiAhPCBOdW1iZXIgb2YgcGl4ZWxzIHBhZGRlZCBhcm91bmQgdGhlIHJlZmVyZW5jZSBmcmFtZSAoPj00KSAqLworI2RlZmluZSBJTUdfUEFEX1NJWkUgICAgICAgICAgICAgIDY0CisKKyNkZWZpbmUgT1VUU1RSSU5HX1NJWkUgICAgICAgICAgICAyNTUKKworCS8qICE8IGFicyBtYWNybywgZmFzdGVyIHRoYW4gcHJvY2VkdXJlICovCisjZGVmaW5lIGFic20oQSkgKChBKSA8ICgwKSA/ICgtKEEpKSA6IChBKSkKKyAgICAvKiAhPCB1c2VkIGZvciBzdGFydCB2YWx1ZSBmb3Igc29tZSB2YXJpYWJsZXMgKi8KKyNkZWZpbmUgTUFYX1ZBTFVFICAgICAgICAgICAgICAgIDk5OTk5OQorCisjZGVmaW5lIENsaXAxKGEpICAgICAoKGEpID4gMjU1ID8gMjU1OigoYSkgPCAwID8gMCA6IChhKSkpCisjZGVmaW5lIENsaXAzKG1pbiwgbWF4LCB2YWwpICgoKHZhbCkgPCAobWluKSkgP1wKKwkJKG1pbikgOiAoKCh2YWwpID4gKG1heCkpID8gKG1heCkgOiAodmFsKSkpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBibG9jayBzaXplIG9mIGJsb2NrIHRyYW5zZm9ybWVkIGJ5IEFWUyAqLworI2RlZmluZSBQU0tJUERJUkVDVCAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUDJOWDJOICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFAyTlhOICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBQTlgyTiAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUEhPUl9VUCAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFBIT1JfRE9XTiAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBQVkVSX0xFRlQgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgUFZFUl9SSUdIVCAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFBOWE4gICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBJOE1CICAgICAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgSTE2TUIgICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBJQkxPQ0sgICAgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIEluTnhOTUIgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgSU54bk5NQiAgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBNQVhNT0RFICAgICAgICAgICAgICAgICAgIDE0ICAgLyogYWRkIHl1cWggMjAxMzA4MjQgKi8KKyNkZWZpbmUgIExBTUJEQV9BQ0NVUkFDWV9CSVRTICAgICAxNgorI2RlZmluZSAgTEFNQkRBX0ZBQ1RPUihsYW1iZGEpICgoaW50KSgoZG91YmxlKSgxIDw8IExBTUJEQV9BQ0NVUkFDWV9CSVRTKVwKKwkJKiBsYW1iZGEgKyAwLjUpKQorI2RlZmluZSAgV0VJR0hURURfQ09TVChmYWN0b3IsIGJpdHMpICgoKGZhY3RvcikgKiAoYml0cykpXAorCQk+PiBMQU1CREFfQUNDVVJBQ1lfQklUUykKKyNkZWZpbmUgIE1WX0NPU1QoZiwgcywgY3gsIGN5LCBweCwgcHkpIChXRUlHSFRFRF9DT1NUKGYsIG12Yml0c1soKGN4KSA8PCAocykpXAorCQktIHB4XSArCW12Yml0c1soKGN5KSA8PCAocykpIC0gcHldKSkKKyNkZWZpbmUgIFJFRl9DT1NUKGYsIHJlZikgICAgICAgICAgICAgIChXRUlHSFRFRF9DT1NUKGYsIHJlZmJpdHNbKHJlZildKSkKKworI2RlZmluZSAgQldEX0lEWChyZWYpICAgICAgICAgICAgICAgICAoKChyZWYpIDwgMikgPyAxIC0gKHJlZikgOiAocmVmKSkKKyNkZWZpbmUgIFJFRl9DT1NUX0ZXRChmLCByZWYpIChXRUlHSFRFRF9DT1NUKGYsXAorCQkoKGltZy0+bnVtX3JlZl9waWNfYWN0aXZlX2Z3ZF9taW51czEgPT0gMCkgP1wKKwkJCTAgOiByZWZiaXRzWyhyZWYpXSkpKQorI2RlZmluZSAgUkVGX0NPU1RfQldEKGYsIGVmKSAoV0VJR0hURURfQ09TVChmLFwKKwkJKChpbWctPm51bV9yZWZfcGljX2FjdGl2ZV9id2RfbWludXMxID09IDApID9cCisJCQkwIDogQldEX0lEWChyZWZiaXRzW3JlZl0pKSkpCisKKyNkZWZpbmUgSVNfSU5UUkEoTUIpICgoTUIpLT5jdVR5cGUgPT0gSThNQiB8fFwKKwkoTUIpLT5jdVR5cGUgPT0gSTE2TUIgfHxcCisJKE1CKS0+Y3VUeXBlID09IEluTnhOTUIgfHwgKE1CKS0+Y3VUeXBlID09IElOeG5OTUIpCisjZGVmaW5lIElTX0lOVEVSKE1CKSAoKE1CKS0+Y3VUeXBlICE9IEk4TUIgJiZcCisJKE1CKS0+Y3VUeXBlICE9IEkxNk1CICYmIChNQiktPmN1VHlwZSAhPSBJbk54Tk1CXAorCSYmIChNQiktPmN1VHlwZSAhPSBJTnhuTk1CKQorI2RlZmluZSBJU19JTlRFUk1WKE1CKSAoKE1CKS0+Y3VUeXBlICE9IEk4TUIgJiZcCisJKE1CKS0+Y3VUeXBlICE9IEkxNk1CICYmIChNQiktPmN1VHlwZSAhPSBJbk54Tk1CICYmXAorCShNQiktPmN1VHlwZSAhPSBJTnhuTk1CICYmIChNQiktPmN1VHlwZSAhPSAwKQorCisKKyNkZWZpbmUgSVNfRElSRUNUKE1CKSAoKE1CKS0+Y3VUeXBlID09IFBTS0lQRElSRUNUICYmIChpbWctPnR5cGUgPT0gQl9JTUcpKQorI2RlZmluZSBJU19QX1NLSVAoTUIpICgoTUIpLT5jdVR5cGUgPT0gUFNLSVBESVJFQ1QgJiZcCisJKCgoaW1nLT50eXBlID09IEZfSU1HKSkgfHwgKChpbWctPnR5cGUgPT0gUF9JTUcpKSkpCisjZGVmaW5lIElTX1A4eDgoTUIpICAoKE1CKS0+Y3VUeXBlID09IFBOWE4pCisKKy8qIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgcmFuZ2UgKi8KKyNkZWZpbmUgTUlOX1FQICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1BWF9RUCAgICAgICAgICAgICAgICAgICAgICAgNjMKKyNkZWZpbmUgU0hJRlRfUVAgICAgICAgICAgICAgICAgICAgICAxMQorCisvKiBQaWN0dXJlIHR5cGVzICovCisjZGVmaW5lIElOVFJBX0lNRyAgICAgICAgICAgICAgICAgICAgMCAgIC8qICE8IEkgZnJhbWUgKi8KKyNkZWZpbmUgSU5URVJfSU1HICAgICAgICAgICAgICAgICAgICAxICAgLyogITwgUCBmcmFtZSAqLworI2RlZmluZSBCX0lNRyAgICAgICAgICAgICAgICAgICAgICAgIDIgICAvKiAhPCBCIGZyYW1lICovCisjZGVmaW5lIElfSU1HICAgICAgICAgICAgICAgICAgICAgICAgMCAgIC8qICE8IEkgZnJhbWUgKi8KKyNkZWZpbmUgUF9JTUcgICAgICAgICAgICAgICAgICAgICAgICAxICAgLyogITwgUCBmcmFtZSAqLworI2RlZmluZSBGX0lNRyAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qICE8IEYgZnJhbWUgKi8KKworI2RlZmluZSBCQUNLR1JPVU5EX0lNRyAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBCUF9JTUcgICAgICAgICAgICAgICAgICAgICAgIDUKKworCisvKiBEaXJlY3QgTW9kZSB0eXBlcyAqLworI2RlZmluZSBNSU5fQ1VfU0laRSAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgTUlOX0JMT0NLX1NJWkUgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1JTl9DVV9TSVpFX0lOX0JJVCAgICAgICAgICAgMworI2RlZmluZSBNSU5fQkxPQ0tfU0laRV9JTl9CSVQgICAgICAgIDIKKyNkZWZpbmUgQkxPQ0tfTVVMVElQTEUgICAgICAgICAgICAgIChNSU5fQ1VfU0laRS8oTUlOX0JMT0NLX1NJWkUpKQorI2RlZmluZSBNQVhfQ1VfU0laRSAgICAgICAgICAgICAgICAgIDY0CisjZGVmaW5lIE1BWF9DVV9TSVpFX0lOX0JJVCAgICAgICAgICAgNgorI2RlZmluZSBCNFg0X0lOX0JJVCAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQjhYOF9JTl9CSVQgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIEIxNlgxNl9JTl9CSVQgICAgICAgICAgICAgICAgNAorI2RlZmluZSBCMzJYMzJfSU5fQklUICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQjY0WDY0X0lOX0JJVCAgICAgICAgICAgICAgICA2CisgICAgLyogITwgIyBsdW1hIGludHJhIHByZWRpY3Rpb24gbW9kZXMgKi8KKyNkZWZpbmUgTlVNX0lOVFJBX1BNT0RFICAgICAgICAgICAgICAzMworICAgIC8qIG51bWJlciBvZiBsdW1hIG1vZGVzIGZvciBmdWxsIFJEIHNlYXJjaCAqLworI2RlZmluZSBOVU1fTU9ERV9GVUxMX1JEICAgICAgICAgICAgIDkKKyAgICAvKiAhPCAjY2hyb21hIGludHJhIHByZWRpY3Rpb24gbW9kZXMgKi8KKyNkZWZpbmUgTlVNX0lOVFJBX1BNT0RFX0NIUk9NQSAgICAgICA1CisKKy8qIGx1bWEgaW50cmEgcHJlZGljdGlvbiBtb2RlcyAqLworCisjZGVmaW5lIERDX1BSRUQgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQTEFORV9QUkVEICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQklfUFJFRCAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFZFUlRfUFJFRCAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgSE9SX1BSRUQgICAgICAgICAgICAgICAgICAgICAyNAorCisKKy8qIGNocm9tYSBpbnRyYSBwcmVkaWN0aW9uIG1vZGVzICovCisjZGVmaW5lIERNX1BSRURfQyAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBEQ19QUkVEX0MgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSE9SX1BSRURfQyAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFZFUlRfUFJFRF9DICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBCSV9QUkVEX0MgICAgICAgICAgICAgICAgICAgIDQKKworI2RlZmluZSBFT1MgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiAhPCBFbmQgT2YgU2VxdWVuY2UgKi8KKwkvKiAhPCBTdGFydCBPZiBQaWN0dXJlICovCisjZGVmaW5lIFNPUCAgICAgICAgICAgICAgICAgICAgICAgICAgMgorCisjZGVmaW5lIERFQ09ESU5HX09LICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTRUFSQ0hfU1lOQyAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVDT0RFX01CICAgICAgICAgICAgICAgICAgICAxCisKKyNpZm5kZWYgbWF4CisgIC8qICE8IE1hY3JvIHJldHVybmluZyBtYXggdmFsdWUgKi8KKyNkZWZpbmUgbWF4KGEsIGIpICAgICAgICAgICAgICAgICAgICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCisgIC8qICE8IE1hY3JvIHJldHVybmluZyBtaW4gdmFsdWUgKi8KKyNkZWZpbmUgbWluKGEsIGIpICAgICAgICAgICAgICAgICAgICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCisjZW5kaWYKKworCisjZGVmaW5lIFhZX01JTl9QTVYgICAgICAgICAgICAgICAgICAgMQorI2lmIFhZX01JTl9QTVYKKyNkZWZpbmUgTVZQUkVEX3h5X01JTiAgICAgICAgICAgICAgICAwCisjZWxzZQorI2RlZmluZSBNVlBSRURfTUVESUFOICAgICAgICAgICAgICAgIDAKKyNlbmRpZgorI2RlZmluZSBNVlBSRURfTCAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTVZQUkVEX1UgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIE1WUFJFRF9VUiAgICAgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIERVQUwgICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBGT1JXQVJEICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQkFDS1dBUkQgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNZTSAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBCSUQgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgSU5UUkEgICAgICAgICAgICAgICAgICAgICAgICAtMQorCisjZGVmaW5lIEJVRl9DWUNMRSAgICAgICAgICAgICAgICAgICAgNQorCisjZGVmaW5lIFJPSV9NMzI2NCAgICAgICAgICAgICAgICAgICAgMSAgICAgIC8qIFJPSSBJbmZvcm1hdGlvbiBFbmNvZGluZyAqLworCisjZGVmaW5lIFBpY0V4dGVuc2lvbkRhdGEgICAgICAgICAgICAgMQorCisKKyNkZWZpbmUgUkVGX09VVFBVVCAgICAgICAgICAgICAgICAgICAxICAvKiBNMzMzNyAqLworCisKKy8qIE1WIHNjYWxpbmcgMTQgYml0ICovCisjZGVmaW5lIE1VTFRJICAgICAgICAgICAgICAgICAgICAgICAgMTYzODQKKyNkZWZpbmUgSEFMRl9NVUxUSSAgICAgICAgICAgICAgICAgICA4MTkyCisjZGVmaW5lIE9GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgMTQKKy8qIGVuZCBvZiBNViBzY2FsaW5nICovCisgLyogc3RvcmUgdGhlIG1pZGRsZSBwaXhlbCdzIG12IGluIGEgbW90aW9uIGluZm9ybWF0aW9uIHVuaXQgKi8KKyNkZWZpbmUgTVZfREVDSU1BVElPTl9GQUNUT1IgICAgICAgICA0CisKKy8qIEJVR0ZJWF9BVkFJTEFCSUxJVFlfSU5UUkEgKi8KKyNkZWZpbmUgTkVJR0hCT1JfSU5UUkFfTEVGVCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBORUlHSEJPUl9JTlRSQV9VUCAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE5FSUdIQk9SX0lOVFJBX1VQX1JJR0hUICAgICAgICAgICAgIDIKKyNkZWZpbmUgTkVJR0hCT1JfSU5UUkFfVVBfTEVGVCAgICAgICAgICAgICAgMworI2RlZmluZSBORUlHSEJPUl9JTlRSQV9MRUZUX0RPV04gICAgICAgICAgICA0CisvKiBlbmQgb2YgQlVHRklYX0FWQUlMQUJJTElUWV9JTlRSQSAqLworCisvKiBlbmQgI2luY2x1ZGUgImRlZmluZS5oIiAqLworCisvKiNpbmNsdWRlICJjb21tb25TdHJ1Y3R1cmVzLmgiKi8KKworLyp0eXBlZGVmIHVpbnQxNl90IGJ5dGU7Ki8gICAgLyogITwgYnl0ZSB0eXBlIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgYnl0ZSB1aW50MTZfdAorI2RlZmluZSBwZWxfdCBieXRlCisKK2VudW0gQml0Q291bnRUeXBlX2UgeworCUJJVFNfSEVBREVSLAorCUJJVFNfVE9UQUxfTUIsCisJQklUU19NQl9NT0RFLAorCUJJVFNfSU5URVJfTUIsCisJQklUU19DQlBfTUIsCisJQklUU19DQlAwMV9NQiwKKwlCSVRTX0NPRUZGX1lfTUIsCisJQklUU19DT0VGRl9VVl9NQiwKKwlCSVRTX0RFTFRBX1FVQU5UX01CLAorCUJJVFNfU0FPX01CLAorCU1BWF9CSVRDT1VOVEVSX01CCit9OworCisKK2VudW0gU0FPRU9DbGFzc2VzIHsKKy8qIEVPIEdyb3VwcywgdGhlIGFzc2lnbm1lbnRzIGRlcGVuZGVkIG9uCitob3cgeW91IGltcGxlbWVudCB0aGUgZWRnZVR5cGUgY2FsY3VsYXRpb24gKi8KKwlTQU9fQ0xBU1NfRU9fRlVMTF9WQUxMRVkgPSAwLAorCVNBT19DTEFTU19FT19IQUxGX1ZBTExFWSA9IDEsCisJU0FPX0NMQVNTX0VPX1BMQUlOICAgICAgID0gMiwKKwlTQU9fQ0xBU1NfRU9fSEFMRl9QRUFLICAgPSAzLAorCVNBT19DTEFTU19FT19GVUxMX1BFQUsgICA9IDQsCisJU0FPX0NMQVNTX0JPICAgICAgICAgICAgID0gNSwKKwlOVU1fU0FPX0VPX0NMQVNTRVMgPSBTQU9fQ0xBU1NfQk8sCisJTlVNX1NBT19PRkZTRVQKK307CisKK3N0cnVjdCBTQU9zdGF0ZGF0YSB7CisJaW50MzJfdCBkaWZmW01BWF9OVU1fU0FPX0NMQVNTRVNdOworCWludDMyX3QgIGNvdW50W01BWF9OVU1fU0FPX0NMQVNTRVNdOworfTsKKworc3RydWN0IENvcHlSaWdodF9zIHsKKwlpbnQzMl90IGV4dGVuc2lvbl9pZDsKKwlpbnQzMl90IGNvcHlyaWdodF9mbGFnOworCWludDMyX3QgY29weXJpZ2h0X2lkOworCWludDMyX3Qgb3JpZ2luYWxfb3JfY29weTsKKwlpbnQzMl90IHJlc2VydmVkOworCWludDMyX3QgY29weXJpZ2h0X251bWJlcjsKK307CisKK3N0cnVjdCBDYW1lcmFQYXJhbXRlcnNfcyB7CisJaW50MzJfdCByZXNlcnZlZDsKKwlpbnQzMl90IGNhbWVyYV9pZDsKKwlpbnQzMl90IGhlaWdodF9vZl9pbWFnZV9kZXZpY2U7CisJaW50MzJfdCBmb2NhbF9sZW5ndGg7CisJaW50MzJfdCBmX251bWJlcjsKKwlpbnQzMl90IHZlcnRpY2FsX2FuZ2xlX29mX3ZpZXc7CisJaW50MzJfdCBjYW1lcmFfcG9zaXRpb25feDsKKwlpbnQzMl90IGNhbWVyYV9wb3NpdGlvbl95OworCWludDMyX3QgY2FtZXJhX3Bvc2l0aW9uX3o7CisJaW50MzJfdCBjYW1lcmFfZGlyZWN0aW9uX3g7CisJaW50MzJfdCBjYW1lcmFfZGlyZWN0aW9uX3k7CisJaW50MzJfdCBjYW1lcmFfZGlyZWN0aW9uX3o7CisJaW50MzJfdCBpbWFnZV9wbGFuZV92ZXJ0aWNhbF94OworCWludDMyX3QgaW1hZ2VfcGxhbmVfdmVydGljYWxfeTsKKwlpbnQzMl90IGltYWdlX3BsYW5lX3ZlcnRpY2FsX3o7Cit9OworCisvKiAhIFNOUlBhcmFtZXRlcnMgKi8KK3N0cnVjdCBTTlJQYXJhbWV0ZXJzX3MgeworCWRvdWJsZSBzbnJfeTsgICAgICAgICAgICAgICAvKiAhPCBjdXJyZW50IFkgU05SICovCisJZG91YmxlIHNucl91OyAgICAgICAgICAgICAgIC8qICE8IGN1cnJlbnQgVSBTTlIgKi8KKwlkb3VibGUgc25yX3Y7ICAgICAgICAgICAgICAgLyogITwgY3VycmVudCBWIFNOUiAqLworCWRvdWJsZSBzbnJfeTE7ICAgICAgICAgICAgICAvKiAhPCBTTlIgWShkQikgZmlyc3QgZnJhbWUgKi8KKwlkb3VibGUgc25yX3UxOyAgICAgICAgICAgICAgLyogITwgU05SIFUoZEIpIGZpcnN0IGZyYW1lICovCisJZG91YmxlIHNucl92MTsgICAgICAgICAgICAgIC8qICE8IFNOUiBWKGRCKSBmaXJzdCBmcmFtZSAqLworCWRvdWJsZSBzbnJfeWE7ICAgICAgICAgICAgICAvKiAhPCBBdmVyYWdlIFNOUiBZKGRCKSByZW1haW5pbmcgZnJhbWVzICovCisJZG91YmxlIHNucl91YTsgICAgICAgICAgICAgIC8qICE8IEF2ZXJhZ2UgU05SIFUoZEIpIHJlbWFpbmluZyBmcmFtZXMgKi8KKwlkb3VibGUgc25yX3ZhOyAgICAgICAgICAgICAgLyogITwgQXZlcmFnZSBTTlIgVihkQikgcmVtYWluaW5nIGZyYW1lcyAqLworI2lmIElOVEVSTEFDRV9DT0RJTkcKKwlkb3VibGUgaV9zbnJfeWE7ICAgICAgICAgICAgICAgLyogITwgY3VycmVudCBZIFNOUiAqLworCWRvdWJsZSBpX3Nucl91YTsgICAgICAgICAgICAgICAvKiAhPCBjdXJyZW50IFUgU05SICovCisJZG91YmxlIGlfc25yX3ZhOyAgICAgICAgICAgICAgIC8qICE8IGN1cnJlbnQgViBTTlIgKi8KKyNlbmRpZgorfTsKKworLyogc2lnbmFsIHRvIG5vaXNlIHJhdGlvIHBhcmFtZXRlcnMgKi8KKworLyogISBjb2RpbmdVbml0ICovCitzdHJ1Y3QgY29kaW5nVW5pdCB7CisJdWludDMyX3QgICAgICAgIHVpX01iQml0U2l6ZTsKKwlpbnQzMl90ICAgICAgICAgICAgICAgICB1aUJpdFNpemU7ICAgICAgICAgICAgLyogc2l6ZSBvZiBNQiAqLworCS8qICE8IG51bWJlciBvZiBjdXJyZW50IHN5bnRheCBlbGVtZW50ICovCisJaW50MzJfdCAgICAgICAgICAgICAgICAgY3VyclNFbnI7CisJaW50MzJfdCAgICAgICAgICAgICAgICAgc2xpY2VfbnI7CisJaW50MzJfdCAgICAgICAgICAgICAgICAgZGVsdGFfcXVhbnQ7ICAgICAgICAgIC8qICE8IGZvciByYXRlIGNvbnRyb2wgKi8KKwlpbnQzMl90ICAgICAgICAgICAgICAgICBkZWx0YV9xcDsKKwlpbnQzMl90ICAgICAgICAgICAgICAgICBxcDsKKwlpbnQzMl90ICAgICAgICAgICAgICAgICBiaXRjb3VudGVyW01BWF9CSVRDT1VOVEVSX01CXTsKKwlzdHJ1Y3QgY29kaW5nVW5pdAorCSptYl9hdmFpbGFibGVbM11bM107IC8qITwgcG9pbnRlciB0byBuZWlnaGJvcmluZyBNQnMKKwkJaW4gYSAzeDMgd2luZG93IG9mIGN1cnJlbnQgTUIsIHdoaWNoIGlzIGxvY2F0ZWQgYXQgWzFdWzFdIFxuCisJCU5VTEwgcG9pbnRlciBpZGVudGlmaWVzIG5laWdoYm9yaW5nIE1CcyB3aGljaCBhcmUgdW5hdmFpbGFibGUgKi8KKwkvKiBzb21lIHN0b3JhZ2Ugb2YgY29kaW5nVW5pdCBzeW50YXggZWxlbWVudHMgZm9yIGdsb2JhbCBhY2Nlc3MgKi8KKwlpbnQzMl90ICAgICAgICAgICAgICAgICBjdVR5cGU7CisJaW50MzJfdCAgICAgICAgICAgICAgICAgd2VpZ2h0ZWRfc2tpcG1vZGU7CisKKwlpbnQzMl90ICAgICAgICAgICAgICAgICBtZF9kaXJlY3Rza2lwX21vZGU7CisKKwlpbnQzMl90ICAgICAgICAgICAgICAgICB0cmFuc19zaXplOworCWludAorCS8qICE8IGluZGljZXMgY29ycmVzcG9uZCB0byBbZm9ydyxiYWNrd11bYmxvY2tfeV1bYmxvY2tfeF1beCx5LCBkbWhdICovCisJbXZkWzJdW0JMT0NLX01VTFRJUExFXVtCTE9DS19NVUxUSVBMRV1bM107CisKKwlpbnQzMl90ICBpbnRyYV9wcmVkX21vZGVzW0JMT0NLX01VTFRJUExFICogQkxPQ0tfTVVMVElQTEVdOworCWludDMyX3QgIHJlYWxfaW50cmFfcHJlZF9tb2Rlc1tCTE9DS19NVUxUSVBMRSAqIEJMT0NLX01VTFRJUExFXTsKKwlpbnQzMl90ICBsX2lwcmVkX21vZGU7CisJaW50MzJfdCAgY2JwLCBjYnBfYmxrOworCXVpbnQzMl90IGNicF9iaXRzOworCisJaW50MzJfdCAgICAgICAgICAgICAgICAgYjhtb2RlWzRdOworCWludDMyX3QgICAgICAgICAgICAgICAgIGI4cGRpcls0XTsKKyAgICAgIC8qICE8IGNocm9tYSBpbnRyYSBwcmVkaWN0aW9uIG1vZGUgKi8KKwlpbnQzMl90ICAgICAgICAgICAgICAgICBjX2lwcmVkX21vZGU7CisKKyAgIC8qICE8IHBvaW50ZXIgdG8gbmVpZ2hib3JpbmcgTUIgKEFFQykgKi8KKwlzdHJ1Y3QgY29kaW5nVW5pdCAgICptYl9hdmFpbGFibGVfdXA7CisJIC8qICE8IHBvaW50ZXIgdG8gbmVpZ2hib3JpbmcgTUIgKEFFQykgKi8KKwlzdHJ1Y3QgY29kaW5nVW5pdCAgICptYl9hdmFpbGFibGVfbGVmdDsKKwlpbnQzMl90ICAgICAgICAgICAgICAgICBtYkFkZHJBLCBtYkFkZHJCLCBtYkFkZHJDLCBtYkFkZHJEOworICAgICAgIC8qICE8YWRkZWQgYnkgbXosIDIwMDguMDQgKi8KKwlpbnQzMl90ICAgICAgICAgICAgICAgICBzbGljZV9zZXRfaW5kZXg7CisgICAgIC8qIGFkZGVkIGJ5IG16LCAyMDA4LjA0ICovCisJaW50MzJfdCAgICAgICAgICAgICAgICAgc2xpY2VfaGVhZGVyX2ZsYWc7CisJaW50MzJfdCAgICAgICAgICAgICAgICAgc2xpY2VxcDsgICAgICAgICAvKiBhZGRlZCBieSBteiwgMjAwOC4wNCAqLworI2lmIE1CX0RRUAorCWludDMyX3QgICAgICAgICAgICAgICAgIHByZXZpb3VzZV9xcDsKKwlpbnQzMl90ICAgICAgICAgICAgICAgICBsZWZ0X2N1X3FwOworI2VuZGlmCisJaW50MzJfdCAgICAgICAgICAgICAgICAgYmxvY2tfYXZhaWxhYmxlX3VwOworCWludDMyX3QgICAgICAgICAgICAgICAgIGJsb2NrX2F2YWlsYWJsZV9sZWZ0OworCit9OworCisKKy8qIGltYWdlIHBhcmFtZXRlcnMgKi8KK3N0cnVjdCBzeW50YXhlbGVtZW50Oworc3RydWN0IHNsaWNlOworc3RydWN0IGFsZmRhdGFwYXJ0Oworc3RydWN0IFNBT0Jsa1BhcmFtX3MgeworCWludDMyX3QgbW9kZUlkYzsgLyogTkVXLCBNRVJHRSwgT0ZGICovCisJLyogTkVXOiBFT18wLCBFT185MCwgRU9fMTM1LCBFT180NSwgQk8uIE1FUkdFOiBsZWZ0LCBhYm92ZSAqLworCWludDMyX3QgdHlwZUlkYzsKKwlpbnQzMl90IHN0YXJ0QmFuZDsgLyogQk86IHN0YXJ0aW5nIGJhbmQgaW5kZXggKi8KKwlpbnQzMl90IHN0YXJ0QmFuZDI7CisJaW50MzJfdCBkZWx0YWJhbmQ7CisJaW50MzJfdCBvZmZzZXRbTUFYX05VTV9TQU9fQ0xBU1NFU107Cit9Oworc3RydWN0IEFMRlBhcmFtX3MgeworCWludDMyX3QgYWxmX2ZsYWc7CisJaW50MzJfdCBudW1fY29lZmY7CisJaW50MzJfdCBmaWx0ZXJzX3Blcl9ncm91cDsKKwlpbnQzMl90IGNvbXBvbmVudElEOworCWludDMyX3QgZmlsdGVyUGF0dGVyblsxNl07IC8qICpmaWx0ZXJQYXR0ZXJuOyAqLworCWludDMyX3QgY29lZmZtdWx0aVsxNl1bOV07IC8qICoqY29lZmZtdWx0aTsgKi8KK307CisKK2VudW0gQUxGQ29tcG9uZW50SUQgeworCUFMRl9ZID0gMCwKKwlBTEZfQ2IsCisJQUxGX0NyLAorCU5VTV9BTEZfQ09NUE9ORU5UCit9Oworc3RydWN0IEFMRl9BUFNfcyB7CisJaW50MzJfdCB1c2VkZmxhZzsKKwlpbnQzMl90IGN1cl9udW1iZXI7CisJaW50MzJfdCBtYXhfbnVtYmVyOworCXN0cnVjdCBBTEZQYXJhbV9zIGFsZl9wYXJbTlVNX0FMRl9DT01QT05FTlRdOworfTsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGZyYW1lIGRhdGEKKyAqLworc3RydWN0IGF2czJfZnJhbWVfcyB7CisJaW50MzJfdCBpbWdjb2lfcmVmOworCWJ5dGUgKiAqcmVmZXJlbmNlRnJhbWVbM107CisJaW50MzJfdCAqKnJlZmJ1ZjsKKwlpbnQzMl90ICoqKm12YnVmOworI2lmIDAKKwlkb3VibGUgc2FvcmF0ZVtOVU1fU0FPX0NPTVBPTkVOVFNdOworI2VuZGlmCisJYnl0ZSAqKipyZWY7CisKKwlpbnQzMl90IGltZ3RyX2Z3UmVmRGlzdGFuY2U7CisJaW50MzJfdCByZWZlcmVkX2J5X290aGVyczsKKwlpbnQzMl90IGlzX291dHB1dDsKKwlpbnQzMl90IHRvX3ByZXBhcmVfZGlzcDsKKyNpZiBNMzQ4MF9URU1QT1JBTF9TQ0FMQUJMRQorCS8qIHRlbXBvcmFsIGxldmVsIHNldHRlZCBpbiBjb25maWd1cmUgZmlsZSAqLworCWludDMyX3QgdGVtcG9yYWxfaWQ7CisjZW5kaWYKKwlieXRlICoqb25lRm9ydGhSZWZZOworI2lmIEZJWF9NQVhfUkVGCisJaW50MzJfdCByZWZfcG9jW01BWFJFRl07CisjZWxzZQorCWludDMyX3QgcmVmX3BvY1s0XTsKKyNlbmRpZgorI2lmZGVmIEFNTAorCWludDMyX3QgaW5kZXg7CisJaW50MzJfdCBtbXVfYWxsb2NfZmxhZzsKKwlpbnQzMl90IGxjdV9zaXplX2xvZzI7CisJLyp1aW50MzJfdCBoZWFkZXJfYWRyOyovCisJdWludDMyX3QgbWNfeV9hZHI7CisJdWludDMyX3QgbWNfdV92X2FkcjsKKwl1aW50MzJfdCBtY19jYW52YXNfeTsKKwl1aW50MzJfdCBtY19jYW52YXNfdV92OworCXVpbnQzMl90IG1wcmVkX212X3dyX3N0YXJ0X2FkZHI7CisJdWludDhfdCBiZ19mbGFnOworCS8qKi8KKwl1bnNpZ25lZCBsb25nIGhlYWRlcl9hZHI7CisJaW50IGJ1Zl9zaXplOworCWludCBsY3VfdG90YWw7CisJaW50IGNvbXBfYm9keV9zaXplOworCXVpbnQzMl90IGR3X3lfYWRyOworCXVpbnQzMl90IGR3X3Vfdl9hZHI7CisJaW50IHlfY2FudmFzX2luZGV4OworCWludCB1dl9jYW52YXNfaW5kZXg7CisJc3RydWN0IGNhbnZhc19jb25maWdfcyBjYW52YXNfY29uZmlnWzJdOworCWludCBkb3VibGVfd3JpdGVfbW9kZTsKKwlpbnQgYml0X2RlcHRoOworCXVuc2lnbmVkIGxvbmcgY21hX2FsbG9jX2FkZHI7CisJaW50IEJVRl9pbmRleDsKKwlpbnQgcGljX3c7CisJaW50IHBpY19oOworCWludCBzdHJlYW1fb2Zmc2V0OworCXUzMiBwdHM7CisJdTY0IHB0czY0OworCS8qKi8KKwlpbnQgdmZfcmVmOworCWludCBkZWNvZGVfaWR4OworCWludCBzbGljZV90eXBlOworCWludDMyX3QgaW1ndHJfZndSZWZEaXN0YW5jZV9iYWs7CisJaW50MzJfdCBlcnJvcl9tYXJrOworCWludDMyX3QgZGVjb2RlZF9sY3U7CisjZW5kaWYKKyNpZm5kZWYgTVZfVVNFX0ZJWEVEX0JVRgorCWludCBtdl9idWZfaW5kZXg7CisjZW5kaWYKKworCS8qIHBpY3R1cmUgcW9zIGluZm9tYXRpb24qLworCWludCBtYXhfcXA7CisJaW50IGF2Z19xcDsKKwlpbnQgbWluX3FwOworCWludCBtYXhfc2tpcDsKKwlpbnQgYXZnX3NraXA7CisJaW50IG1pbl9za2lwOworCWludCBtYXhfbXY7CisJaW50IG1pbl9tdjsKKwlpbnQgYXZnX212OworCisJdTMyIGh3X2RlY29kZV90aW1lOworCXUzMiBmcmFtZV9zaXplOyAvLyBGb3IgZnJhbWUgYmFzZSBtb2RlCisKKwljaGFyICpjdXZhX2RhdGFfYnVmOworCWludCAgY3V2YV9kYXRhX3NpemU7Cit9OworCisKK3N0cnVjdCBJbWFnZVBhcmFtZXRlcnNfcyB7CisJc3RydWN0IGNvZGluZ1VuaXQgICAgKm1iX2RhdGE7CisJaW50MzJfdCBudW1iZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogPCEgZnJhbWUgbnVtYmVyICovCisJaW50MzJfdCBudW1JUEZyYW1lczsKKworCWludDMyX3QgdHlwZTsKKwlpbnQzMl90IHR5cGViOworCWludDMyX3QgdHlwZWJfYmVmb3JlOworCisJaW50MzJfdCBxcDsgLyogPCEgcXVhbnQgZm9yIHRoZSBjdXJyZW50IGZyYW1lICovCisJaW50MzJfdCBjdXJyZW50X21iX25yOyAvKiBiaXRzdHJlYW0gb3JkZXIgKi8KKwlpbnQzMl90IGN1cnJlbnRfc2xpY2VfbnI7CisJaW50MzJfdCB0cjsgICAvKiA8ISB0ZW1wb3JhbCByZWZlcmVuY2UsIDggYml0LCAqLworCisJaW50MzJfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgLyogITwgTnVtYmVyIG9mIHBlbHMgKi8KKwlpbnQzMl90IHdpZHRoX2NyOyAgICAgICAgICAgICAgICAvKiAhPCBOdW1iZXIgb2YgcGVscyBjaHJvbWEgKi8KKwlpbnQzMl90IGhlaWdodDsgICAgICAgICAgICAgICAgICAvKiAhPCBOdW1iZXIgb2YgbGluZXMgKi8KKwlpbnQzMl90IGhlaWdodF9jcjsgICAgICAgICAgICAgICAvKiAhPCBOdW1iZXIgb2YgbGluZXMgIGNocm9tYSAqLworCWludDMyX3QgUGljV2lkdGhJbk1iczsKKwlpbnQzMl90IFBpY1NpemVJbk1iczsKKwlpbnQzMl90IGJsb2NrOF94LCBibG9jazhfeTsKKwlpbnQzMl90ICAgc3ViYmxvY2tfeDsKKwlpbnQzMl90ICAgc3ViYmxvY2tfeTsKKworCWludDMyX3QgbnVtX29mX3JlZmVyZW5jZXM7CisgICAgLyogPCEgQnVnIEZpeDogY29ycmVjdCBwaWN0dXJlIHNpemUgZm9yIG91dHB1dHRlZCByZWNvbnN0cnVjdGVkIHBpY3R1cmVzICovCisJaW50MzJfdCBhdXRvX2Nyb3BfcmlnaHQ7CisJaW50MzJfdCBhdXRvX2Nyb3BfYm90dG9tOworCWludDMyX3QgYnVmX2N5Y2xlOworCWludDMyX3QgcGljdHVyZV9zdHJ1Y3R1cmU7CisJIC8qIDwhIHBvaW50ZXIgdG8gY3VycmVudCBTbGljZSBkYXRhIHN0cnVjdCAqLworCXN0cnVjdCBzbGljZSAgICAgICAqY3VycmVudFNsaWNlOworCisJaW50MzJfdCAqKnByZWRCbG9jazsgICAgICAgICAgICAgLyogITwgY3VycmVudCBiZXN0IHByZWRpY3Rpb24gbW9kZSAqLworCWludDMyX3QgKipwcmVkQmxvY2tUbXA7CisJLyogITwgdGhlIGRpZmYgcGl4ZWwgdmFsdWVzIGJldHdlZW4gb3JnaW5hbCBpbWFnZSBhbmQgcHJlZGljdGlvbiAqLworCWludDMyX3QgKipyZXNpWTsKKwkvKiAhPCBBcnJheSBjb250YWluaW5nIHNxdWFyZSB2YWx1ZXMsdXNlZCBmb3Igc25yIGNvbXB1dGF0aW9uICovCisJaW50MzJfdCAqcXVhZDsKKworCS8qIC8vbG9jYXRpb24gb2YgY3VycmVudCBNQi8vLy8vLyAqLworCWludDMyX3QgbWJfeTsgICAgICAgICAgICAgICAgICAgIC8qICE8IGN1cnJlbnQgTUIgdmVydGljYWwgKi8KKwlpbnQzMl90IG1iX3g7ICAgICAgICAgICAgICAgICAgICAvKiAhPCBjdXJyZW50IE1CIGhvcml6b250YWwgKi8KKwlpbnQzMl90IHBpeF95OyAgICAgICAgICAgICAgICAgICAvKiAhPCBjdXJyZW50IHBpeGVsIHZlcnRpY2FsICovCisJaW50MzJfdCBwaXhfeDsgICAgICAgICAgICAgICAgICAgLyogITwgY3VycmVudCBwaXhlbCBob3Jpem9udGFsICovCisJaW50MzJfdCBwaXhfY195OyAgICAgICAgICAgICAgICAgLyogITwgY3VycmVudCBwaXhlbCBjaHJvbWEgdmVydGljYWwgKi8KKwlpbnQzMl90IHBpeF9jX3g7IC8qICE8IGN1cnJlbnQgcGl4ZWwgY2hyb21hIGhvcml6b250YWwgKi8KKworCWludDMyX3QgaW1ndHJfbmV4dF9QOworCisJaW50MzJfdCBpbWdjb2lfbmV4dF9yZWY7CisKKyAgICAvKiAhPCBHSCBpcHJlZG1vZGVbOTBdWzc0XTtwcmVkaWN0aW9uIG1vZGUgZm9yIGludGVyIGZyYW1lcyAqLworICAgIC8qIGZpeCBmcm9tIHZlciA0LjEgKi8KKwlpbnQzMl90ICoqaXByZWRtb2RlOworCWludDMyX3QgKipyZWNfaXByZWRtb2RlOworCisKKwkvKiAvLy8vLy8vLy8vLy8vL2RlY29kZXIvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworCWludDMyX3QgbWF4X21iX25yOworCWludDMyX3QgKippbnRyYV9ibG9jazsKKworCWludDMyX3QgYmxvY2tfeTsKKwlpbnQzMl90IGJsb2NrX3g7CisgICAgLyogPCEgZmluYWwgNHg0IGJsb2NrLiBFeHRlbmRlZCB0byAxNngxNiBmb3IgQVZTICovCisJaW50MzJfdCByZXNpVVZbMl1bTUFYX0NVX1NJWkVdW01BWF9DVV9TSVpFXTsKKworCWludDMyX3QgKipmd19yZWZGckFycjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDwhIFs3Ml1bODhdOyAqLworCWludDMyX3QgKipid19yZWZGckFycjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDwhIFs3Ml1bODhdOyAqLworCisJaW50MzJfdCByYW5kb21fYWNjZXNzX2RlY29kYWJsZV9mbGFnOworCisJaW50MzJfdCBzZXFfaGVhZGVyX2luZGljYXRlOworCWludDMyX3QgQl9kaXNjYXJkX2ZsYWc7CisKKwkvKiBCIHBpY3R1cmVzICovCisJdWludDMyX3QgcGljX2Rpc3RhbmNlOworCisJdWludDMyX3QgY29kaW5nX29yZGVyOworCisJdWludDMyX3QgUHJldlBpY0Rpc3RhbmNlTHNiOworCWludDMyX3QgQ3VyclBpY0Rpc3RhbmNlTXNiOworCisJaW50MzJfdCBQaWNIZWlnaHRJbk1iczsKKworCWludDMyX3QgdHlwZXM7CisKKwlpbnQzMl90IG5ld19zZXF1ZW5jZV9mbGFnOworCWludDMyX3Qgc2VxdWVuY2VfZW5kX2ZsYWc7ICAgICAgICAgICAgLyogPCEgcm01MmtfcjIgKi8KKworCWludDMyX3QgY3VycmVudF9zbGljZV9zZXRfaW5kZXg7ICAgICAgICAgIC8qIDwhIGFkZGVkIGJ5IG16LCAyMDA4LjA0ICovCisJaW50MzJfdCBjdXJyZW50X3NsaWNlX2hlYWRlcl9mbGFnOyAgICAgICAgLyogPCEgYWRkZWQgYnkgbXosIDIwMDguMDQgKi8KKwlpbnQzMl90IHNsaWNlX3NldF9xcFs2NF07ICAgICAgICAgICAgIC8qIDwhIGFkZGVkIGJ5IG16LCAyMDA4LjA0ICovCisKKworCWludDMyX3QgaW50ZXJfYW1wX2VuYWJsZTsKKworCS8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL2VuY29kZXIvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworCisJLyogaW50MzJfdCBuYl9yZWZlcmVuY2VzOyAgICAgLy8hPCByZXBsYWNlZCBieSAibnVtX29mX3JlZmVyZW5jZXMiICovCisKKwlpbnQzMl90IGZyYW1lcmF0ZTsKKworCWludDMyX3QgKioqcHJlZEJsb2NrWTsgICAgICAgIC8qICE8IGFsbCA5IHByZWRpY3Rpb24gbW9kZXMgKi8KKyAgICAgLyogITwgbmV3IGNocm9tYSA4eDggaW50cmEgcHJlZGljdGlvbiBtb2RlcyAqLworCWludDMyX3QgKioqKnByZWRCbG9ja1VWOworCisJaW50MzJfdCAqKkNvZWZmX2FsbDsvKiBxeXUgMDgyMSAqLworCisJc3RydWN0IHN5bnRheGVsZW1lbnQgICAqTUJfU3ludGF4RWxlbWVudHM7IC8qICE8IGJ5IG9saXZlciAwNjEyICovCisKKwkvKiBCIHBpY3R1cmVzICovCisKKwlpbnQzMl90IGJfZnJhbWVfdG9fY29kZTsKKwlpbnQzMl90IG51bV9yZWZfcGljX2FjdGl2ZV9md2RfbWludXMxOworCWludDMyX3QgbnVtX3JlZl9waWNfYWN0aXZlX2J3ZF9taW51czE7CisJaW50MzJfdCBtdl9yYW5nZV9mbGFnOworCisJdWludDMyX3QgZnJhbWVfbnVtOyAgIC8qIGZyYW1lX251bSBmb3IgdGhpcyBmcmFtZSAqLworCWludDMyX3Qgc2xpY2Vfb2Zmc2V0OworCS8qIHRoZSBmb2xsb3dpbmcgYXJlIHNlbnQgaW4gdGhlIHNsaWNlIGhlYWRlciAqLworCWludDMyX3QgTm9SZXNpZHVlRGlyZWN0OworCWludDMyX3QgY29kZWRfbWJfbnI7CisJaW50MzJfdCBwcm9ncmVzc2l2ZV9mcmFtZTsKKwlpbnQzMl90IHRjX3Jlc2VydmVfYml0OworCSAvKiB0aGUgbGFzdCBNQiBubyBpbiBjdXJyZW50IHNsaWNlLiAgICAgIFl1bGogMjAwNC4wNy4xNSAqLworCWludDMyX3QgbWJfbm9fY3VyclNsaWNlTGFzdE1COworCWludDMyX3QgU2VxaGVhZGVyX2ZsYWc7ICAgICAvKiBBZGRlZCBieSBjancsIDIwMDcwMzI3ICovCisJaW50MzJfdCBFbmNvZGVFbmRfZmxhZzsgICAgICAgICAvKiBDYXJtZW4sIDIwMDcvMTIvMTkgKi8KKworCXVpbnQxNl90IGJidl9kZWxheTsKKworCWludDMyX3QgdG1wX2Z3QlNraXBNdltESVJFQ1RJT04gKyAxXVsyXTsKKwlpbnQzMl90IHRtcF9id0JTa2lwTXZbRElSRUNUSU9OICsgMV1bMl07CisKKwlpbnQzMl90IHRtcF9wcmVmX2ZzdFtNSF9QU0tJUF9OVU0gKyBOVU1fT0ZGU0VUICsgMV07CisJaW50MzJfdCB0bXBfcHJlZl9zbmRbTUhfUFNLSVBfTlVNICsgTlVNX09GRlNFVCArIDFdOworCWludDMyX3QgdG1wX2ZzdFBTa2lwTXZbTUhfUFNLSVBfTlVNICsgTlVNX09GRlNFVCArIDFdWzNdOworCWludDMyX3QgdG1wX3NuZFBTa2lwTXZbTUhfUFNLSVBfTlVNICsgTlVNX09GRlNFVCArIDFdWzNdOworI2lmIEJDQlIKK2J5dGUgKm9yZ19yZWZfeTsKK2J5dGUgKm9yZ19yZWZfdTsKK2J5dGUgKm9yZ19yZWZfdjsKK2ludDMyX3QgICpCTENVaWR4OworaW50MzJfdCAgKkRRUExpc3Q7CitpbnQzMl90ICBpTnVtQ1VzSW5GcmFtZTsKKworYnl0ZSAqb3JnX3JlZjJfeTsKK2J5dGUgKm9yZ19yZWYyX3U7CitieXRlICpvcmdfcmVmMl92OworaW50MzJfdCAgcmVmMk51bTsKKyNlbmRpZgorLyogLy8vLy8vLy8vLy8vLy9TQU8gcGFyYW1ldGVyLy8vLy8vLy8vLy8vLy8vLy8vICovCitkb3VibGUgICAgICAgICpjdXJfc2FvcmF0ZTsKKyNpZiAwCitpbnQzMl90ICAgICAgICAgICAgc2xpY2Vfc2FvX29uW05VTV9TQU9fQ09NUE9ORU5UU107CisjZW5kaWYKK2ludDMyX3QgICAgICAgICAgICBwaWNfYWxmX29uW05VTV9BTEZfQ09NUE9ORU5UXTsKK3N0cnVjdCBhbGZkYXRhcGFydCAgICpkcF9BTEY7CisKKyNpZiBJTlRFUkxBQ0VfQ09ESU5HCitpbnQzMl90IGlzX2ZpZWxkX3NlcXVlbmNlOworaW50MzJfdCBpc190b3BfZmllbGQ7CisjZW5kaWYKKworCit9OworCisKKworLyogISBzdHJ1Y3QgZm9yIGNvbnRleHQgbWFuYWdlbWVudCAqLworc3RydWN0IEJpQ29udGV4dFR5cGVfcyB7CisJdWludDhfdCBNUFM7ICAgLyogMSBiaXQgKi8KKwl1aW50MzJfdCAgTEdfUE1QUzsgLyogMTAgYml0cyAqLworCXVpbnQ4X3QgY3ljbm87ICAvKiAyIGJpdHMgKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRCBhIHQgYSAgICB0IHkgcCBlIHMgICBmIG8gciAgQSBFIEMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCitzdHJ1Y3QgcGl4X3BvcyB7CisJaW50MzJfdCBhdmFpbGFibGU7ICAgLyogQUJDRCAqLworCWludDMyX3QgbWJfYWRkcjsgICAgLyogTUIgcG9zaXRpb24gKi8KKwlpbnQzMl90IHg7CisJaW50MzJfdCB5OworCWludDMyX3QgcG9zX3g7ICAgICAvKiA0eDQgeC1wb3MgKi8KKwlpbnQzMl90IHBvc195OworfTsKKworCisKK3N0cnVjdCBTVERPVVRfREFUQV9zIHsKKwlpbnQzMl90IHR5cGU7CisJaW50MzJfdCB0eXBlYjsKKworCWludDMyX3QgICBmcmFtZW51bTsKKwlpbnQzMl90ICAgdHI7CisJaW50MzJfdCAgIHFwOworCWRvdWJsZSBzbnJfeTsKKwlkb3VibGUgc25yX3U7CisJZG91YmxlIHNucl92OworCWludDMyX3QgICB0bXBfdGltZTsKKwlpbnQzMl90ICAgcGljdHVyZV9zdHJ1Y3R1cmU7CisJaW50MzJfdCAgIGN1cnJfZnJhbWVfYml0czsKKwlpbnQzMl90ICAgZW11bGF0ZV9iaXRzOworCisJdWludDMyX3QgRGVjTUQ1VmFsdWVbNF07CisjaWYgUkQxNTAxX0ZJWF9CRworaW50MzJfdCBiYWNrZ3JvdW5kX3BpY3R1cmVfb3V0cHV0X2ZsYWc7LyogTG9uZ2ZlaS5XYW5nQG1lZGlhdGVrLmNvbSAqLworI2VuZGlmCisjaWYgUkQxNjBfRklYX0JHCitpbnQzMl90IHBpY3R1cmVfcmVvcmRlcl9kZWxheTsKKyNlbmRpZgoraW50OF90IHN0cl9yZWZlcmVuY2VfbGlzdFsxMjhdOyAgLyogcmVmZXJlbmNlIGxpc3QgaW5mb3JtYXRpb24gKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDIE8gTiBUIEUgWCBUIFMgICBGIE8gUiAgIFQgTSBMICAgUyBZIE4gVCBBIFggICBFIEwgRSBNIEUgTiBUIFMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKyNkZWZpbmUgTlVNX0N1VHlwZV9DVFggICAgICAgICAgICAgICgxMSArIDEwKQorI2RlZmluZSBOVU1fQjhfVFlQRV9DVFggICAgICAgICAgICAgIDkKKyNkZWZpbmUgTlVNX01WRF9DVFggICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIE5VTV9QTVZfSURYX0NUWCAgICAgICAgICAgICAxMAorI2RlZmluZSBOVU1fUkVGX05PX0NUWCAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgTlVNX0RFTFRBX1FQX0NUWCAgICAgICAgICAgICA0CisjZGVmaW5lIE5VTV9JTlRFUl9ESVJfQ1RYICAgICAgICAgICAxOAorI2RlZmluZSBOVU1fSU5URVJfRElSX0RIUF9DVFggICAgICAgICAgIDMKKyNkZWZpbmUgTlVNX0I4X1RZUEVfREhQX0NUWCAgICAgICAgICAgICAxCisjZGVmaW5lIE5VTV9BTVBfQ1RYICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBOVU1fQ19JTlRSQV9NT0RFX0NUWCAgICAgICAgIDQKKyNkZWZpbmUgTlVNX0NCUF9DVFggICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE5VTV9CQ0JQX0NUWCAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBOVU1fTUFQX0NUWCAgICAgICAgICAgICAgICAgMTcKKyNkZWZpbmUgTlVNX0xBU1RfQ1RYICAgICAgICAgICAgICAgIDE3CisKKyNkZWZpbmUgTlVNX0lOVFJBX01PREVfQ1RYICAgICAgICAgICA3CisKKyNkZWZpbmUgTlVNX0FCU19DVFggICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIE5VTV9UVV9DVFggICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBOVU1fU1BMSVRfQ1RYICAgICAgICAgICAgICAgIDggIC8qIENVIGRlcHRoICovCisjaWYgQkNCUgorI2RlZmluZSBOVU1fQkdCTENPS19DVFggICAgICAgICAgICAgIDEKKyNlbmRpZgorCisjZGVmaW5lIE5VTV9CUlBfQ1RYICAgICAgICAgICAgICAgICAgOAorCisKKyNkZWZpbmUgTlVNX0xBU1RfQ0dfQ1RYX0xVTUEgICAgICAgIDEyCisjZGVmaW5lIE5VTV9MQVNUX0NHX0NUWF9DSFJPTUEgICAgICAgNgorI2RlZmluZSBOVU1fU0lHQ0dfQ1RYX0xVTUEgICAgICAgICAgIDIKKyNkZWZpbmUgTlVNX1NJR0NHX0NUWF9DSFJPTUEgICAgICAgICAxCisjZGVmaW5lIE5VTV9MQVNUX1BPU19DVFhfTFVNQSAgIDU2CisjZGVmaW5lIE5VTV9MQVNUX1BPU19DVFhfQ0hST01BIDE2CisjZGVmaW5lIE5VTV9MQVNUX0NHX0NUWCAoTlVNX0xBU1RfQ0dfQ1RYX0xVTUEgKyBOVU1fTEFTVF9DR19DVFhfQ0hST01BKQorI2RlZmluZSBOVU1fU0lHQ0dfQ1RYIChOVU1fU0lHQ0dfQ1RYX0xVTUEgKyBOVU1fU0lHQ0dfQ1RYX0NIUk9NQSkKKyNkZWZpbmUgTlVNX0xBU1RfUE9TX0NUWCAoTlVNX0xBU1RfUE9TX0NUWF9MVU1BICsgTlVNX0xBU1RfUE9TX0NUWF9DSFJPTUEpCisjZGVmaW5lIE5VTV9TQU9fTUVSR0VfRkxBR19DVFggICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBOVU1fU0FPX01PREVfQ1RYICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTlVNX1NBT19PRkZTRVRfQ1RYICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIE5VTV9JTlRFUl9ESVJfTUlOX0NUWCAgICAgICAgIDIKKworLyplbmQgI2luY2x1ZGUgImNvbW1vblN0cnVjdHVyZXMuaCIqLworCisvKiNpbmNsdWRlICJjb21tb25WYXJpYWJsZXMuaCIqLworCisvKgorZXh0ZXJuIHN0cnVjdCBDYW1lcmFQYXJhbXRlcnNfcyAqY2FtZXJhOworZXh0ZXJuIHN0cnVjdCBTTlJQYXJhbWV0ZXJzX3MgKnNucjsKK2V4dGVybiBzdHJ1Y3QgSW1hZ2VQYXJhbWV0ZXJzX3MgKmltZzsKKyAqLworCisvKiBhdnMyX2ZyYW1lX3QgKmZyZWZbUkVGX01BWEJVRkZFUl07ICovCisKKworI2RlZmluZSBFVF9TSVpFIDMwMCAgICAgIC8qICE8IHNpemUgb2YgZXJyb3IgdGV4dCBidWZmZXIgKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGNvbW1vbiBkYXRhCisgKi8KK3N0cnVjdCBWaWRlb19Db21fZGF0YV9zIHsKKwlpbnQzMl90ICAgQmZyYW1lX2N0cjsKKworCS8qIEZJTEUgKnBfbG9nOyAgICAgICAgICAgICAgICAgICAgIC8vITwgU05SIGZpbGUgKi8KKwkvKiBGSUxFICpwX3RyYWNlOyAgICAgICAgICAgICAgICAgICAvLyE8IFRyYWNlIGZpbGUgKi8KKworCWludDMyX3QgICB0b3RfdGltZTsKKworCS8qIFRzaW5naHVhIGZvciBwaWN0dXJlX2Rpc3RhbmNlICAyMDA3MDEgKi8KKwlpbnQzMl90ICAgcGljdHVyZV9kaXN0YW5jZTsKKworCS8qIE0zMTc4IFBLVSBSZWZlcmVuY2UgTWFuYWdlICovCisJaW50MzJfdCAgIGNvZGluZ19vcmRlcjsKKwkvKiAhPCBjdXJyZW50IGVuY29kaW5nL2RlY29kaW5nIGZyYW1lIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgYXZzMl9mcmFtZV9zICpmX3JlYzsKKwlpbnQzMl90ICAgc2VxX2hlYWRlcjsKKyAgICAvKiAhPCBBcnJheSBmb3IgcmVmZXJlbmNlIGZyYW1lcyBvZiBlYWNoIGJsb2NrICovCisJaW50MzJfdCAgICAqKnJlZkZyQXJyOworCWludDMyX3QgICAgKipwX3NuZF9yZWZGckFycjsKKworCWJ5dGUgICoqKmN1cnJlbnRGcmFtZTsgLyogW3l1dl1baGVpZ2h0XVt3aWR0aF0gKi8KKyNpZmRlZiBBTUwKKwlzdHJ1Y3QgYXZzMl9mcmFtZV9zICpjdXJfcGljOyAvKmVpdGhlciBmX3JlYyBvciBtX2JnKi8KKyNlbmRpZgorCWJ5dGUgICAqKmJhY2tncm91bmRSZWZlcmVuY2VGcmFtZVszXTsKKwlieXRlICAqKipiYWNrZ3JvdW5kX3JlZjsKKworCisJaW50MzJfdCAgdG90YWxfZnJhbWVzOworCisJLyogbXZfcmFuZ2UsIDIwMDcxMDA5ICovCisJaW50MzJfdCAgTWluX1ZfTVY7CisJaW50MzJfdCAgTWF4X1ZfTVY7CisJaW50MzJfdCAgTWluX0hfTVY7CisJaW50MzJfdCAgTWF4X0hfTVY7CisJLyogITwgYnVmZmVyIGZvciBlcnJvciBtZXNzYWdlIGZvciBleGl0IHdpdGggZXJyb3Iodm9pZCkgKi8KKwlpbnQ4X3QgZXJyb3J0ZXh0W0VUX1NJWkVdOworCWludDhfdCBzdHJfbGlzdF9yZWZlcmVuY2VbMTI4XTsKKworCit9OworLyogZXh0ZXJuIFZpZGVvX0NvbV9kYXRhICpoYzsgKi8KKworCisvKmVuZCAjaW5jbHVkZSAiY29tbW9uVmFyaWFibGVzLmgiKi8KKy8qICNkZWZpbmUgVVNFX1BBUkFNX1RYVCAqLworLyoKKyNpZiBGSVhfQ0hST01BX0ZJRUxEX01WX0JLX0RJU1QKK2ludDhfdCBia19pbWdfaXNfdG9wX2ZpZWxkOworI2VuZGlmCisqLworLyogdm9pZCB3cml0ZV9HQl9mcmFtZShGSUxFICpwX2RlYyk7ICovCisKKyNpZiAhRklYX01BWF9SRUYKKyNkZWZpbmUgTUFYUkVGICAgIDQKKyNkZWZpbmUgTUFYR09QICAgIDMyCisjZW5kaWYKKworc3RydWN0IFN0YXRCaXRzIHsKKwlpbnQzMl90ICAgY3Vycl9mcmFtZV9iaXRzOworCWludDMyX3QgICBwcmV2X2ZyYW1lX2JpdHM7CisJaW50MzJfdCAgIGVtdWxhdGVfYml0czsKKwlpbnQzMl90ICAgcHJldl9lbXVsYXRlX2JpdHM7CisJaW50MzJfdCAgIGxhc3RfdW5pdF9iaXRzOworCWludDMyX3QgICBiaXRyYXRlOworCWludDMyX3QgICB0b3RhbF9iaXRyYXRlWzEwMDBdOworCWludDMyX3QgICBjb2RlZF9waWNfbnVtOworCWludDMyX3QgICB0aW1lX3M7Cit9OworCitzdHJ1Y3QgcmVmZXJlbmNlX21hbmFnZW1lbnQgeworCWludDMyX3QgcG9jOworCWludDMyX3QgcXBfb2Zmc2V0OworCWludDMyX3QgbnVtX29mX3JlZjsKKwlpbnQzMl90IHJlZmVyZF9ieV9vdGhlcnM7CisJaW50MzJfdCByZWZfcGljW01BWFJFRl07CisJaW50MzJfdCBwcmVkaWN0OworCWludDMyX3QgZGVsdGFSUFM7CisJaW50MzJfdCBudW1fdG9fcmVtb3ZlOworCWludDMyX3QgcmVtb3ZlX3BpY1tNQVhSRUZdOworfTsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGRlYyBkYXRhCisgKi8KK3N0cnVjdCBWaWRlb19EZWNfZGF0YV9zIHsKKwlieXRlICoqYmFja2dyb3VuZF9mcmFtZVszXTsKKwlpbnQzMl90IGJhY2tncm91bmRfcmVmZXJlbmNlX2VuYWJsZTsKKworCWludDMyX3QgYmFja2dyb3VuZF9waWN0dXJlX2ZsYWc7CisJaW50MzJfdCBiYWNrZ3JvdW5kX3BpY3R1cmVfb3V0cHV0X2ZsYWc7CisJaW50MzJfdCBiYWNrZ3JvdW5kX3BpY3R1cmVfZW5hYmxlOworCisJaW50MzJfdCBiYWNrZ3JvdW5kX251bWJlcjsKKworI2lmIEJDQlIKKwlpbnQzMl90IGJjYnJfZW5hYmxlOworI2VuZGlmCisKKwlpbnQzMl90IGRlbXVsYXRlX2VuYWJsZTsKKwlpbnQzMl90IGN1cnJlbnRiaXRvZmZzZXQ7CisKKwlpbnQzMl90IGFzcGVjdF9yYXRpb19pbmZvcm1hdGlvbjsKKwlpbnQzMl90IGZyYW1lX3JhdGVfY29kZTsKKwlpbnQzMl90IGJpdF9yYXRlX2xvd2VyOworCWludDMyX3QgYml0X3JhdGVfdXBwZXI7CisJaW50MzJfdCAgbWFya2VyX2JpdDsKKworCWludDMyX3QgdmlkZW9fZm9ybWF0OworCWludDMyX3QgY29sb3JfZGVzY3JpcHRpb247CisJaW50MzJfdCBjb2xvcl9wcmltYXJpZXM7CisJaW50MzJfdCB0cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3M7CisJaW50MzJfdCBtYXRyaXhfY29lZmZpY2llbnRzOworCisJaW50MzJfdCBwcm9ncmVzc2l2ZV9zZXF1ZW5jZTsKKyNpZiBJTlRFUkxBQ0VfQ09ESU5HCitpbnQzMl90IGlzX2ZpZWxkX3NlcXVlbmNlOworI2VuZGlmCitpbnQzMl90IGxvd19kZWxheTsKK2ludDMyX3QgaG9yaXpvbnRhbF9zaXplOworaW50MzJfdCB2ZXJ0aWNhbF9zaXplOworaW50MzJfdCBzYW1wbGVfcHJlY2lzaW9uOworaW50MzJfdCB2aWRlb19yYW5nZTsKKworaW50MzJfdCBkaXNwbGF5X2hvcml6b250YWxfc2l6ZTsKK2ludDMyX3QgZGlzcGxheV92ZXJ0aWNhbF9zaXplOworaW50MzJfdCBURF9tb2RlOworaW50MzJfdCB2aWV3X3BhY2tpbmdfbW9kZTsKK2ludDMyX3Qgdmlld19yZXZlcnNlOworCitpbnQzMl90IGJfcG12cl9lbmFibGVkOworaW50MzJfdCBkaHBfZW5hYmxlZDsKK2ludDMyX3QgYl9kbWhfZW5hYmxlZDsKK2ludDMyX3QgYl9taHBza2lwX2VuYWJsZWQ7CitpbnQzMl90IHdzbV9lbmFibGVkOworaW50MzJfdCBiX3NlY1RfZW5hYmxlZDsKKworaW50MzJfdCB0bXBfdGltZTsKK2ludDMyX3QgRnJhbWVOdW07CitpbnQzMl90IGVvczsKK2ludDMyX3QgcHJlX2ltZ190eXBlOworaW50MzJfdCBwcmVfaW1nX3R5cGVzOworLyogaW50MzJfdCBwcmVfc3RyX3ZlYzsgKi8KK2ludDMyX3QgcHJlX2ltZ190cjsKK2ludDMyX3QgcHJlX2ltZ19xcDsKK2ludDMyX3QgcHJlX3RtcF90aW1lOworaW50MzJfdCBSZWZQaWNFeGlzdDsgICAvKiAyMDA3MTIyNCAqLworaW50MzJfdCBCZ1JlZlBpY0V4aXN0OworaW50MzJfdCBkZWNfcmVmX251bTsgICAgICAgICAgICAgICAgLyogcmVmIG9yZGVyICovCisKKy8qIHZpZGVvIGVkaXQgY29kZSAqLyAvKiBNMTk1NiBieSBHcmFuZHZpZXcgMjAwNi4xMi4xMiAqLworaW50MzJfdCB2ZWNfZmxhZzsKKworLyogQ29weXJpZ2h0X2V4dGVuc2lvbih2b2lkKSBoZWFkZXIgKi8KK2ludDMyX3QgY29weXJpZ2h0X2ZsYWc7CitpbnQzMl90IGNvcHlyaWdodF9pZGVudGlmaWVyOworaW50MzJfdCBvcmlnaW5hbF9vcl9jb3B5OworaW50NjRfdCBjb3B5cmlnaHRfbnVtYmVyXzE7CitpbnQ2NF90IGNvcHlyaWdodF9udW1iZXJfMjsKK2ludDY0X3QgY29weXJpZ2h0X251bWJlcl8zOworLyogQ2FtZXJhX3BhcmFtZXRlcnNfZXh0ZW5zaW9uICovCitpbnQzMl90IGNhbWVyYV9pZDsKK2ludDMyX3QgaGVpZ2h0X29mX2ltYWdlX2RldmljZTsKK2ludDMyX3QgZm9jYWxfbGVuZ3RoOworaW50MzJfdCBmX251bWJlcjsKK2ludDMyX3QgdmVydGljYWxfYW5nbGVfb2ZfdmlldzsKK2ludDMyX3QgY2FtZXJhX3Bvc2l0aW9uX3hfdXBwZXI7CitpbnQzMl90IGNhbWVyYV9wb3NpdGlvbl94X2xvd2VyOworaW50MzJfdCBjYW1lcmFfcG9zaXRpb25feV91cHBlcjsKK2ludDMyX3QgY2FtZXJhX3Bvc2l0aW9uX3lfbG93ZXI7CitpbnQzMl90IGNhbWVyYV9wb3NpdGlvbl96X3VwcGVyOworaW50MzJfdCBjYW1lcmFfcG9zaXRpb25fel9sb3dlcjsKK2ludDMyX3QgY2FtZXJhX2RpcmVjdGlvbl94OworaW50MzJfdCBjYW1lcmFfZGlyZWN0aW9uX3k7CitpbnQzMl90IGNhbWVyYV9kaXJlY3Rpb25fejsKK2ludDMyX3QgaW1hZ2VfcGxhbmVfdmVydGljYWxfeDsKK2ludDMyX3QgaW1hZ2VfcGxhbmVfdmVydGljYWxfeTsKK2ludDMyX3QgaW1hZ2VfcGxhbmVfdmVydGljYWxfejsKKworI2lmIEFWUzJfSERSX0hMUworLyogbWFzdGVyaW5nX2Rpc3BsYXlfYW5kX2NvbnRlbnRfbWV0YWRhdGFfZXh0ZW5zaW9uKHZvaWQpIGhlYWRlciAqLworaW50MzJfdCBkaXNwbGF5X3ByaW1hcmllc194MDsKK2ludDMyX3QgZGlzcGxheV9wcmltYXJpZXNfeTA7CitpbnQzMl90IGRpc3BsYXlfcHJpbWFyaWVzX3gxOworaW50MzJfdCBkaXNwbGF5X3ByaW1hcmllc195MTsKK2ludDMyX3QgZGlzcGxheV9wcmltYXJpZXNfeDI7CitpbnQzMl90IGRpc3BsYXlfcHJpbWFyaWVzX3kyOworaW50MzJfdCB3aGl0ZV9wb2ludF94OworaW50MzJfdCB3aGl0ZV9wb2ludF95OworaW50MzJfdCBtYXhfZGlzcGxheV9tYXN0ZXJpbmdfbHVtaW5hbmNlOworaW50MzJfdCBtaW5fZGlzcGxheV9tYXN0ZXJpbmdfbHVtaW5hbmNlOworaW50MzJfdCBtYXhpbXVtX2NvbnRlbnRfbGlnaHRfbGV2ZWw7CitpbnQzMl90IG1heGltdW1fZnJhbWVfYXZlcmFnZV9saWdodF9sZXZlbDsKKyNlbmRpZgorCisvKiBJX3BpY3R1cmVzX2hlYWRlcih2b2lkKSAqLworaW50MzJfdCB0b3BfZmllbGRfZmlyc3Q7CitpbnQzMl90IHJlcGVhdF9maXJzdF9maWVsZDsKK2ludDMyX3QgcHJvZ3Jlc3NpdmVfZnJhbWU7CisjaWYgSU5URVJMQUNFX0NPRElORworaW50MzJfdCBpc190b3BfZmllbGQ7CisjZW5kaWYKKy8qIGludDMyX3QgZml4ZWRfcGljdHVyZV9xcDsgICAvL3F5dSAwOTI3ICovCitpbnQzMl90IHBpY3R1cmVfcXA7CitpbnQzMl90IGZpeGVkX3BpY3R1cmVfcXA7CitpbnQzMl90IHRpbWVfY29kZV9mbGFnOworaW50MzJfdCB0aW1lX2NvZGU7CitpbnQzMl90IGxvb3BfZmlsdGVyX2Rpc2FibGU7CitpbnQzMl90IGxvb3BfZmlsdGVyX3BhcmFtZXRlcl9mbGFnOworLyogaW50MzJfdCBhbHBoYV9vZmZzZXQ7ICovCisvKiBpbnQzMl90IGJldGFfb2Zmc2V0OyAqLworCisvKiBQYl9waWN0dXJlX2hlYWRlcih2b2lkKSAqLworaW50MzJfdCBwaWN0dXJlX2NvZGluZ190eXBlOworCisvKnBpY3R1cmVfZGlzcGxheV9leHRlbnNpb24odm9pZCkqLworaW50MzJfdCBmcmFtZV9jZW50cmVfaG9yaXpvbnRhbF9vZmZzZXRbNF07CitpbnQzMl90IGZyYW1lX2NlbnRyZV92ZXJ0aWNhbF9vZmZzZXRbNF07CisKKy8qIHNsaWNlX2hlYWRlcih2b2lkKSAqLworaW50MzJfdCBpbWdfd2lkdGg7CitpbnQzMl90IHNsaWNlX3ZlcnRpY2FsX3Bvc2l0aW9uOworaW50MzJfdCBzbGljZV92ZXJ0aWNhbF9wb3NpdGlvbl9leHRlbnNpb247CitpbnQzMl90IGZpeGVkX3NsaWNlX3FwOworaW50MzJfdCBzbGljZV9xcDsKK2ludDMyX3Qgc2xpY2VfaG9yaXpvbnRhbF9wb3NpdG9uOyAgICAgICAvKiBhZGRlZCBieSBteiwgMjAwOC4wNCAqLworaW50MzJfdCBzbGljZV9ob3Jpem9udGFsX3Bvc2l0b25fZXh0ZW5zaW9uOworCitpbnQzMl90IFN0YXJ0Q29kZVBvc2l0aW9uOworaW50MzJfdCBiYWNrZ3JvdW5kX3ByZWRfZmxhZzsKKworCisvKiBSZWZlcmVuY2UgTWFuYWdlICovCitpbnQzMl90IGRpc3BsYXlkZWxheTsKK2ludDMyX3QgcGljdHVyZV9yZW9yZGVyX2RlbGF5OworI2lmIE0zNDgwX1RFTVBPUkFMX1NDQUxBQkxFCitpbnQzMl90IHRlbXBvcmFsX2lkX2V4aXN0X2ZsYWc7CisjZW5kaWYKKworaW50MzJfdCBnb3Bfc2l6ZTsKK3N0cnVjdCByZWZlcmVuY2VfbWFuYWdlbWVudCBkZWNvZF9SUFNbTUFYR09QXTsKK3N0cnVjdCByZWZlcmVuY2VfbWFuYWdlbWVudCBjdXJyX1JQUzsKK2ludDMyX3QgbGFzdF9vdXRwdXQ7CitpbnQzMl90IHRydG1wOworI2lmIE0zNDgwX1RFTVBPUkFMX1NDQUxBQkxFCitpbnQzMl90IGN1cl9sYXllcjsKKyNlbmRpZgorCisvKiBBZGFwdGl2ZSBmcmVxdWVuY3kgd2VpZ2h0aW5nIHF1YW50aXphdGlvbiAqLworI2lmIEZSRVFVRU5DWV9XRUlHSFRJTkdfUVVBTlRJWkFUSU9OCitpbnQzMl90IHdlaWdodF9xdWFudF9lbmFibGVfZmxhZzsKK2ludDMyX3QgbG9hZF9zZXFfd2VpZ2h0X3F1YW50X2RhdGFfZmxhZzsKKworaW50MzJfdCBwaWNfd2VpZ2h0X3F1YW50X2VuYWJsZV9mbGFnOworaW50MzJfdCBwaWNfd2VpZ2h0X3F1YW50X2RhdGFfaW5kZXg7CitpbnQzMl90IHdlaWdodGluZ19xdWFudF9wYXJhbTsKK2ludDMyX3Qgd2VpZ2h0aW5nX3F1YW50X21vZGVsOworaW50MTZfdCBxdWFudF9wYXJhbV91bmRldGFpbFs2XTsgICAgICAvKiBNMjE0OCAyMDA3LTA5ICovCitpbnQxNl90IHF1YW50X3BhcmFtX2RldGFpbFs2XTsgICAgICAgIC8qIE0yMTQ4IDIwMDctMDkgKi8KK2ludDMyX3QgV2VpZ2h0UXVhbnRFbmFibGU7ICAgICAgICAgICAgICAvKiBNMjE0OCAyMDA3LTA5ICovCitpbnQzMl90IG1iX2FkYXB0X3dxX2Rpc2FibGU7ICAgICAgICAgICAgLyogTTIzMzEgMjAwOC0wNCAqLworaW50MzJfdCBtYl93cV9tb2RlOyAgICAgICAgICAgICAgICAgICAgIC8qIE0yMzMxIDIwMDgtMDQgKi8KKyNpZiBDSFJPTUFfREVMVEFfUVAKK2ludDMyX3QgY2hyb21hX3F1YW50X3BhcmFtX2Rpc2FibGU7CitpbnQzMl90IGNocm9tYV9xdWFudF9wYXJhbV9kZWx0YV91OworaW50MzJfdCBjaHJvbWFfcXVhbnRfcGFyYW1fZGVsdGFfdjsKKyNlbmRpZgorCitpbnQzMl90IGJfcHJlX2RlY19pbnRyYV9pbWc7CitpbnQzMl90IHByZV9kZWNfaW1nX3R5cGU7CitpbnQzMl90IEN1cnJlbnRTY2VuZU1vZGVsOworI2VuZGlmCisKK2ludDMyX3QgY3Vycl9JRFJjb2k7CitpbnQzMl90IGN1cnJfSURSdHI7CitpbnQzMl90IG5leHRfSURSdHI7CitpbnQzMl90IG5leHRfSURSY29pOworaW50MzJfdCBlbmRfU2VxVHI7CisKKyNpZiBNQl9EUVAKK2ludDMyX3QgbGFzdFFQOworLyogRklMRSAqIHRlc3RRUDsgKi8KKyNlbmRpZgorCit9OworLyogZXh0ZXJuIFZpZGVvX0RlY19kYXRhICpoZDsgKi8KKworc3RydWN0IERlY29kaW5nRW52aXJvbm1lbnRfcyB7CisJdWludDMyX3QgICAgRGJ1ZmZlcjsKKwlpbnQzMl90ICAgICAgICAgICAgIERiaXRzX3RvX2dvOworCXVpbnQ4X3QgICAgICAgICAgICAqRGNvZGVzdHJtOworCWludDMyX3QgICAgICAgICAgICAgKkRjb2Rlc3RybV9sZW47Cit9OworCisvKiBhZGRlZCBhdCBybTUyayB2ZXJzaW9uICovCisKK3N0cnVjdCBpbnBfcGFyOworCisKKworLyogISBTbGljZSAqLworc3RydWN0IHNsaWNlIHsKKwlpbnQzMl90ICAgICAgICAgICAgICAgICBwaWN0dXJlX2lkOworCWludDMyX3QgICAgICAgICAgICAgICAgIHFwOworCWludDMyX3QgICAgICAgICAgICAgICAgIHBpY3R1cmVfdHlwZTsgLyogITwgcGljdHVyZSB0eXBlICovCisJaW50MzJfdCAgICAgICAgICAgICAgICAgc3RhcnRfbWJfbnI7CisJIC8qICE8IG51bWJlciBvZiBkaWZmZXJlbnQgcGFydGl0aW9ucyAqLworCWludDMyX3QgICAgICAgICAgICAgICAgIG1heF9wYXJ0X25yOworCisJLyogYWRkZWQgYnkgbHpoYW5nICovCisJLyogITwgcG9pbnRlciB0byBzdHJ1Y3Qgb2YgY29udGV4dCBtb2RlbHMgZm9yIHVzZSBpbiBBRUMgKi8KKwlzdHJ1Y3QgU3ludGF4SW5mb0NvbnRleHRzX3MgICpzeW5fY3R4OworfTsKKworc3RydWN0IGFsZmRhdGFwYXJ0IHsKKwlzdHJ1Y3QgQml0c3RyZWFtX3MgICAgICAgICAgICpiaXRzdHJlYW07CisJc3RydWN0IERlY29kaW5nRW52aXJvbm1lbnRfcyBkZV9BRUM7CisJc3RydWN0IFN5bnRheEluZm9Db250ZXh0c19zICAqc3luX2N0eDsKK307CisvKiBzdGF0aWMgaW50MzJfdCBhbGZQYXJBbGxjb2F0ZWQgPSAwOyAqLworCisvKiBpbnB1dCBwYXJhbWV0ZXJzIGZyb20gY29uZmlndXJhdGlvbiBmaWxlICovCitzdHJ1Y3QgaW5wX3BhciB7CisJaW50MzJfdCAgIGJ1Zl9jeWNsZTsgICAgICAgICAgICAgICAgIC8qIDwhIEZyYW1lIGJ1ZmZlciBzaXplICovCisJaW50MzJfdCAgIHJlZl9waWNfb3JkZXI7ICAgICAgICAgICAgIC8qIDwhIHJlZiBvcmRlciAqLworCWludDMyX3QgICBvdXRwdXRfZGVjX3BpYzsgICAgICAgICAgICAvKiA8ISBvdXRwdXRfZGVjX3BpYyAqLworCWludDMyX3QgICBwcm9maWxlX2lkOworCWludDMyX3QgICBsZXZlbF9pZDsKKwlpbnQzMl90ICAgY2hyb21hX2Zvcm1hdDsKKwlpbnQzMl90ICAgZ191aU1heFNpemVJbkJpdDsKKwlpbnQzMl90ICAgYWxwaGFfY19vZmZzZXQ7CisJaW50MzJfdCAgIGJldGFfb2Zmc2V0OworCWludDMyX3QgICB1c2VOU1FUOworI2lmIE1CX0RRUAorCWludDMyX3QgICB1c2VEUVA7CisjZW5kaWYKKwlpbnQzMl90ICAgdXNlU0RJUDsKKwlpbnQzMl90IHNhb19lbmFibGU7CisjaWYgTTM0ODBfVEVNUE9SQUxfU0NBTEFCTEUKKwlpbnQzMl90IHRlbXBvcmFsX2lkX2V4aXN0X2ZsYWc7CisjZW5kaWYKKwlpbnQzMl90IGFsZl9lbmFibGU7CisKKwlpbnQzMl90IGNyb3NzU2xpY2VMb29wRmlsdGVyOworCisJaW50MzJfdCAgIHNhbXBsZV9iaXRfZGVwdGg7ICAvKiBzYW1wbGUgYml0IGRlcHRoICovCisgIC8qIGRlY29kZWQgZmlsZSBiaXQgZGVwdGggKGFzc3VtaW5nIG91dHB1dF9iaXRfZGVwdGggaXMKKyAgbGVzcyBvciBlcXVhbCB0byBzYW1wbGVfYml0X2RlcHRoKSAqLworCWludDMyX3QgICBvdXRwdXRfYml0X2RlcHRoOworCisKKwlpbnQzMl90IE1ENUVuYWJsZTsKKworI2lmIE9VVFBVVF9JTlRFUkxBQ0VfTUVSR0VEX1BJQworCWludDMyX3Qgb3V0cHV0X2ludGVybGFjZV9tZXJnZWRfcGljdHVyZTsKKyNlbmRpZgorCit9OworCisvKiBleHRlcm4gc3RydWN0IGlucF9wYXIgKmlucHV0OyAqLworCitzdHJ1Y3Qgb3V0ZGF0YV9zIHsKKyNpZiBSRDE3MF9GSVhfQkcKKwlzdHJ1Y3QgU1RET1VUX0RBVEFfcyBzdGRvdXRkYXRhW1JFRl9NQVhCVUZGRVJdOworI2Vsc2UKKwlzdHJ1Y3QgU1RET1VUX0RBVEFfcyBzdGRvdXRkYXRhWzhdOworI2VuZGlmCisJaW50MzJfdCAgICAgICAgIGJ1ZmZlcl9udW07Cit9OworLyogb3V0ZGF0YSBvdXRwcmludDsgKi8KKworI2RlZmluZSBQQVlMT0FEX1RZUEVfSURFUlAgOAorCitzdHJ1Y3QgQml0c3RyZWFtX3MgKkFsbG9jQml0c3RyZWFtKHZvaWQpOwordm9pZCBGcmVlQml0c3RyZWFtKHZvaWQpOworI2lmIFRSQUNFCit2b2lkIHRyYWNlYml0czIoY29uc3QgaW50OF90ICp0cmFjZV9zdHIsIGludDMyX3QgbGVuLCBpbnQzMl90IGluZm8pOworI2VuZGlmCisKKy8qIGludDMyX3QgICBkaXJlY3RfbXZbNDVdWzgwXVs0XVs0XVszXTsgLy8gb25seSB0byB2ZXJpZnkgcmVzdWx0ICovCisKKyNkZWZpbmUgSV9QSUNUVVJFX1NUQVJUX0NPREUgICAgMHhCMworI2RlZmluZSBQQl9QSUNUVVJFX1NUQVJUX0NPREUgICAweEI2CisjZGVmaW5lIFNMSUNFX1NUQVJUX0NPREVfTUlOICAgIDB4MDAKKyNkZWZpbmUgU0xJQ0VfU1RBUlRfQ09ERV9NQVggICAgMHg4RgorI2RlZmluZSBVU0VSX0RBVEFfU1RBUlRfQ09ERSAgICAweEIyCisjZGVmaW5lIFNFUVVFTkNFX0hFQURFUl9DT0RFICAgIDB4QjAKKyNkZWZpbmUgRVhURU5TSU9OX1NUQVJUX0NPREUgICAgMHhCNQorI2RlZmluZSBTRVFVRU5DRV9FTkRfQ09ERSAgICAgICAweEIxCisjZGVmaW5lIFZJREVPX0VESVRfQ09ERSAgICAgICAgIDB4QjcKKworCisjZGVmaW5lIFNFUVVFTkNFX0RJU1BMQVlfRVhURU5TSU9OX0lEICAgICAgICAgICAgMgorI2RlZmluZSBDT1BZUklHSFRfRVhURU5TSU9OX0lEICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQ0FNRVJBUEFSQU1FVEVSU19FWFRFTlNJT05fSUQgICAgICAgICAgICAxMQorI2RlZmluZSBQSUNUVVJFX0RJU1BMQVlfRVhURU5TSU9OX0lEICAgICAgICAgICAgIDcKKyNpZiBNMzQ4MF9URU1QT1JBTF9TQ0FMQUJMRQorI2RlZmluZSBURU1QT1JBTF9TQ0FMQUJMRV9FWFRFTlNJT05fSUQgICAgICAgICAgIDMKKyNlbmRpZgorCisjaWYgUk9JX00zMjY0CisjaWYgUkQxNTAxX0ZJWF9CRworI2RlZmluZSBMT0NBVElPTl9EQVRBX0VYVEVOU0lPTl9JRCAgICAgICAgICAgICAgIDEyCisjZWxzZQorI2RlZmluZSBMT0NBVElPTl9EQVRBX0VYVEVOU0lPTl9JRCAgICAgICAgICAgICAgIDE1CisjZW5kaWYKKyNlbmRpZgorCisjaWYgQVZTMl9IRFJfSExTCisjZGVmaW5lIE1BU1RFUklOR19ESVNQTEFZX0FORF9DT05URU5UX01FVEFEQVRBX0VYVEVOU0lPTiAgICAgMTAKKyNlbmRpZgorCit2b2lkIG1hbGxvY19zbGljZSh2b2lkKTsKK3ZvaWQgZnJlZV9zbGljZSh2b2lkKTsKKworCit2b2lkIHJlYWRfaXByZWRfbW9kZXModm9pZCk7CisKK2ludDMyX3QgIEFFQ19zdGFydGNvZGVfZm9sbG93cyhpbnQzMl90IGVvc19iaXQpOworCisvKiBleHRlcm4gdWludDMyX3QgbWF4X3ZhbHVlX3M7ICovCisKKy8qQ29tQWRhcHRpdmVMb29wRmlsdGVyLmgqLworI2RlZmluZSBBTEZfTUFYX05VTV9DT0VGICAgICAgIDkKKyNkZWZpbmUgTk9fVkFSX0JJTlMgICAgICAgICAgICAxNgorCisKKyNkZWZpbmUgUlBNX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwCisjZGVmaW5lIEFMRl9CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4MAorI2RlZmluZSBSUE1fRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyODAKKwordW5pb24gcGFyYW1fdSB7CisJc3RydWN0IHsKKwkJdWludDE2X3QgZGF0YVtSUE1fRU5EIC0gUlBNX0JFR0lOXTsKKwl9IGw7CisJc3RydWN0IHsKKwkJLypzZXF1ZW5jZSovCisJCXVpbnQxNl90IHByb2ZpbGVfaWQ7CisJCXVpbnQxNl90IGxldmVsX2lkOworCQl1aW50MTZfdCBwcm9ncmVzc2l2ZV9zZXF1ZW5jZTsKKwkJdWludDE2X3QgaXNfZmllbGRfc2VxdWVuY2U7CisJCXVpbnQxNl90IGhvcml6b250YWxfc2l6ZTsKKwkJdWludDE2X3QgdmVydGljYWxfc2l6ZTsKKwkJdWludDE2X3QgY2hyb21hX2Zvcm1hdDsKKwkJdWludDE2X3Qgc2FtcGxlX3ByZWNpc2lvbjsKKwkJdWludDE2X3QgZW5jb2RpbmdfcHJlY2lzaW9uOworCQl1aW50MTZfdCBhc3BlY3RfcmF0aW9faW5mb3JtYXRpb247CisJCXVpbnQxNl90IGZyYW1lX3JhdGVfY29kZTsKKwkJdWludDE2X3QgYml0X3JhdGVfbG93ZXI7CisJCXVpbnQxNl90IGJpdF9yYXRlX3VwcGVyOworCQl1aW50MTZfdCBsb3dfZGVsYXk7CisJCXVpbnQxNl90IHRlbXBvcmFsX2lkX2V4aXN0X2ZsYWc7CisJCXVpbnQxNl90IGdfdWlNYXhTaXplSW5CaXQ7CisKKyNkZWZpbmUgQkFDS0dST1VORF9QSUNUVVJFX0RJU0FCTEVfQklUICAgICAgICAgMTEKKyNkZWZpbmUgQl9NSFBTS0lQX0VOQUJMRURfQklUICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgREhQX0VOQUJMRURfQklUICAgICAgICAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgV1NNX0VOQUJMRURfQklUICAgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBJTlRFUl9BTVBfRU5BQkxFX0JJVCAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFVTRU5TUVRfQklUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgVVNFU0RJUF9CSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBCX1NFQ1RfRU5BQkxFRF9CSVQgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFNBT19FTkFCTEVfQklUICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQUxGX0VOQUJMRV9CSVQgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBCX1BNVlJfRU5BQkxFRF9CSVQgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENST1NTU0xJQ0VMT09QRklMVEVSX0JJVCAgICAgICAgICAgICAgIDAKKwkJdWludDE2X3QgYXZzMl9zZXFfZmxhZ3M7CisKKwkJdWludDE2X3QgbnVtX29mX1JQUzsKKwkJdWludDE2X3QgcGljdHVyZV9yZW9yZGVyX2RlbGF5OworCQkvKlBJQyovCisJCXVpbnQxNl90IHRpbWVfY29kZV9mbGFnOworCQl1aW50MTZfdCB0aW1lX2NvZGU7CisJCXVpbnQxNl90IGJhY2tncm91bmRfcGljdHVyZV9mbGFnOworCQl1aW50MTZfdCBiYWNrZ3JvdW5kX3BpY3R1cmVfb3V0cHV0X2ZsYWc7CisJCXVpbnQxNl90IGNvZGluZ19vcmRlcjsKKwkJdWludDE2X3QgY3VyX2xheWVyOworCQl1aW50MTZfdCBkaXNwbGF5ZGVsYXk7IC8qPz8/Ki8KKwkJdWludDE2X3QgcHJlZGljdDsgICAgIC8qPz8/Ki8KKwkJdWludDE2X3QgUlBTX2lkeDsgICAgICAvKj8/PyovCisJCXVpbnQxNl90IHJlZmVyZF9ieV9vdGhlcnNfY3VyOworCQl1aW50MTZfdCBudW1fb2ZfcmVmX2N1cjsKKwkJdWludDE2X3QgcmVmX3BpY19jdXJbOF07CisJCXVpbnQxNl90IG51bV90b19yZW1vdmVfY3VyOworCQl1aW50MTZfdCByZW1vdmVfcGljX2N1cls4XTsKKwkJdWludDE2X3QgcHJvZ3Jlc3NpdmVfZnJhbWU7CisJCXVpbnQxNl90IHBpY3R1cmVfc3RydWN0dXJlOworCQl1aW50MTZfdCB0b3BfZmllbGRfZmlyc3Q7CisJCXVpbnQxNl90IHJlcGVhdF9maXJzdF9maWVsZDsKKwkJdWludDE2X3QgaXNfdG9wX2ZpZWxkOworCisJCXVpbnQxNl90IHBpY3R1cmVfY29kaW5nX3R5cGU7CisJCXVpbnQxNl90IGJhY2tncm91bmRfcHJlZF9mbGFnOworCQl1aW50MTZfdCBiYWNrZ3JvdW5kX3JlZmVyZW5jZV9lbmFibGU7CisJCXVpbnQxNl90IHJhbmRvbV9hY2Nlc3NfZGVjb2RhYmxlX2ZsYWc7CisJCXVpbnQxNl90IGxjdV9zaXplOworCQl1aW50MTZfdCBhbHBoYV9jX29mZnNldDsKKwkJdWludDE2X3QgYmV0YV9vZmZzZXQ7CisJCXVpbnQxNl90IGNocm9tYV9xdWFudF9wYXJhbV9kZWx0YV9jYjsKKwkJdWludDE2X3QgY2hyb21hX3F1YW50X3BhcmFtX2RlbHRhX2NyOworCQl1aW50MTZfdCBsb29wX2ZpbHRlcl9kaXNhYmxlOworCisJCXVpbnQxNl90IHZpZGVvX3NpZ25hbF90eXBlOworCQl1aW50MTZfdCBjb2xvcl9kZXNjcmlwdGlvbjsKKwkJdWludDE2X3QgZGlzcGxheV9wcmltYXJpZXNfeFszXTsKKwkJdWludDE2X3QgZGlzcGxheV9wcmltYXJpZXNfeVszXTsKKwkJdWludDE2X3Qgd2hpdGVfcG9pbnRfeDsKKwkJdWludDE2X3Qgd2hpdGVfcG9pbnRfeTsKKwkJdWludDE2X3QgbWF4X2Rpc3BsYXlfbWFzdGVyaW5nX2x1bWluYW5jZTsKKwkJdWludDE2X3QgbWluX2Rpc3BsYXlfbWFzdGVyaW5nX2x1bWluYW5jZTsKKwkJdWludDE2X3QgbWF4X2NvbnRlbnRfbGlnaHRfbGV2ZWw7CisJCXVpbnQxNl90IG1heF9waWN0dXJlX2F2ZXJhZ2VfbGlnaHRfbGV2ZWw7CisJfSBwOworCXN0cnVjdCB7CisJCXVpbnQxNl90IHBhZGRpbmdbQUxGX0JFR0lOIC0gUlBNX0JFR0lOXTsKKwkJdWludDE2X3QgcGljdHVyZV9hbGZfZW5hYmxlX1k7CisJCXVpbnQxNl90IHBpY3R1cmVfYWxmX2VuYWJsZV9DYjsKKwkJdWludDE2X3QgcGljdHVyZV9hbGZfZW5hYmxlX0NyOworCQl1aW50MTZfdCBhbGZfZmlsdGVyc19udW1fbV8xOworCQl1aW50MTZfdCByZWdpb25fZGlzdGFuY2VbMTZdOworCQl1aW50MTZfdCBhbGZfY2JfY29lZmZtdWx0aVs5XTsKKwkJdWludDE2X3QgYWxmX2NyX2NvZWZmbXVsdGlbOV07CisJCXVpbnQxNl90IGFsZl95X2NvZWZmbXVsdGlbMTZdWzldOworCX0gYWxmOworfTsKKworCitzdHJ1Y3QgYXZzMl9kZWNvZGVyIHsKKwl1aW50OF90IGluaXRfaHdfZmxhZzsKKwlzdHJ1Y3QgaW5wX3BhciAgIGlucHV0OworCXN0cnVjdCBJbWFnZVBhcmFtZXRlcnNfcyAgaW1nOworCXN0cnVjdCBWaWRlb19Db21fZGF0YV9zICBoYzsKKwlzdHJ1Y3QgVmlkZW9fRGVjX2RhdGFfcyAgaGQ7CisJdW5pb24gcGFyYW1fdSBwYXJhbTsKKwlzdHJ1Y3QgYXZzMl9mcmFtZV9zIGZybV9wb29sW0FWUzJfTUFYX0JVRkZFUl9OVU1dOworCXN0cnVjdCBhdnMyX2ZyYW1lX3MgKmZyZWZbUkVGX01BWEJVRkZFUl07CisjaWZkZWYgQU1MCisJLyp1c2VkIGZvciBiYWNrZ3JvdW5kCisJd2hlbiBiYWNrZ3JvdW5kX3BpY3R1cmVfb3V0cHV0X2ZsYWcgaXMgMCovCisJc3RydWN0IGF2czJfZnJhbWVfcyAqbV9iZzsKKwkvKmN1cnJlbnQgYmFja2dyb3VuZCBwaWN0dXJlLCBldGhlciBtX2JnIG9yIGZyZWZbLi5dKi8KKwlzdHJ1Y3QgYXZzMl9mcmFtZV9zICpmX2JnOworI2VuZGlmCisJc3RydWN0IG91dGRhdGFfcyBvdXRwcmludDsKKwl1aW50MzJfdCBjbV9oZWFkZXJfc3RhcnQ7CisJc3RydWN0IEFMRlBhcmFtX3MgbV9hbGZQaWN0dXJlUGFyYW1bTlVNX0FMRl9DT01QT05FTlRdOworI2lmZGVmIEZJWF9DSFJPTUFfRklFTERfTVZfQktfRElTVAorCWludDhfdCBia19pbWdfaXNfdG9wX2ZpZWxkOworI2VuZGlmCisjaWZkZWYgQU1MCisJaW50MzJfdCBsY3Vfc2l6ZTsKKwlpbnQzMl90IGxjdV9zaXplX2xvZzI7CisJaW50MzJfdCBsY3VfeF9udW07CisJaW50MzJfdCBsY3VfeV9udW07CisJaW50MzJfdCBsY3VfdG90YWw7CisJaW50MzJfdCByZWZfbWF4YnVmZmVyOworCWludDMyX3QgdG9fcHJlcGFyZV9kaXNwX2NvdW50OworCWludDhfdCBidWZtZ3JfZXJyb3JfZmxhZzsKKyNlbmRpZgorfTsKKworCitleHRlcm4gdm9pZCB3cml0ZV9mcmFtZShzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYywgaW50MzJfdCBwb3MpOworZXh0ZXJuIHZvaWQgaW5pdF9mcmFtZV90KHN0cnVjdCBhdnMyX2ZyYW1lX3MgKmN1cnJmcmVmKTsKK2V4dGVybiB2b2lkIHJlcG9ydF9mcmFtZShzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYywKKwlzdHJ1Y3Qgb3V0ZGF0YV9zICpkYXRhLCBpbnQzMl90IHBvcyk7CisKK2V4dGVybiBpbnQgYXZzMl9wb3N0X3Byb2Nlc3Moc3RydWN0IGF2czJfZGVjb2RlciAqYXZzMl9kZWMpOworZXh0ZXJuIHZvaWQgYXZzMl9wcmVwYXJlX2hlYWRlcihzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYywKKwlpbnQzMl90IHN0YXJ0X2NvZGUpOworZXh0ZXJuIGludDMyX3QgYXZzMl9wcm9jZXNzX2hlYWRlcihzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYyk7CisKK2V4dGVybiB2b2lkIGluaXRfYXZzMl9kZWNvZGVyKHN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjKTsKKworZXh0ZXJuIGludDMyX3QgYXZzMl9pbml0X2dsb2JhbF9idWZmZXJzKHN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjKTsKKworZXh0ZXJuIGJvb2wgaXNfYXZzMl9wcmludF9wYXJhbSh2b2lkKTsKK2V4dGVybiBib29sIGlzX2F2czJfcHJpbnRfYnVmbWdyX2RldGFpbCh2b2lkKTsKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL2F2czIvdmF2czIuYyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlcl92NGwvYXZzMi92YXZzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNWZmZGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL2F2czIvdmF2czIuYwpAQCAtMCwwICsxLDgzNzUgQEAKKyAvKgorICogZHJpdmVycy9hbWxvZ2ljL2FtcG9ydHMvYXZzMi5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy9hbXN0cmVhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmZvcm1hdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZnJhbWVfc3luYy9wdHNzZXJ2Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9mcmFtZV9zeW5jL3RzeW5jLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jYW52YXMvY2FudmFzLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3Byb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3JlY2VpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtY29udGlndW91cy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvdGVlLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC90ZWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC9jbG9jay5oPgorI2luY2x1ZGUgIi4uLy4uLy4uL3N0cmVhbV9pbnB1dC9hbXBvcnRzL2FtcG9ydHNfcHJpdi5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29kZWNfbW0uaD4KKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL2RlY29kZXJfbW11X2JveC5oIgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvZGVjb2Rlcl9ibW11X2JveC5oIgorI2luY2x1ZGUgImF2czJfZ2xvYmFsLmgiCisKKyNkZWZpbmUgTUVNX05BTUUgImNvZGVjX2F2czIiCisvKiAjaW5jbHVkZSA8bWFjaC9hbV9yZWdzLmg+ICovCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy92ZGVjX3JlZy5oPgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvdmRlYy5oIgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvYW12ZGVjLmgiCisKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZpZGVvX3NpbmsvdmlkZW8uaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvbmZpZ3MuaD4KKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL2NvbmZpZ19wYXJzZXIuaCIKKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL2Zpcm13YXJlLmgiCisjaW5jbHVkZSAiLi4vLi4vLi4vY29tbW9uL2NoaXBzL2RlY29kZXJfY3B1X3Zlcl9pbmZvLmgiCisjaW5jbHVkZSAiLi4vLi4vZGVjb2Rlci91dGlscy92ZGVjX2ZlYXR1cmUuaCIKKworCisjZGVmaW5lIElfT05MWV9TVVBQT1JUCisjZGVmaW5lIE1JWF9TVFJFQU1fU1VQUE9SVAorI2RlZmluZSBHMTJBX0JSSU5HVVBfREVCVUcKKyNkZWZpbmUgQ09OU1RSQUlOX01BWF9CVUZfTlVNCisKKyNkZWZpbmUgQ09fTVZfQ09NUFJFU1MKKworI2luY2x1ZGUgInZhdnMyLmgiCisjZGVmaW5lIEhFVkNfU0hJRlRfTEVOR1RIX1BST1RFQ1QgICAgICAgICAgICAgICAgICAweDMxM2EKKyNkZWZpbmUgSEVWQ19NUFJFRF9DVFJMNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzI0YworI2RlZmluZSBIRVZDX01QUkVEX0NUUkw5ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMjViCisjZGVmaW5lIEhFVkNfREJMS19DRkdEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM1MGQKKyNkZWZpbmUgSEVWQ19DTV9IRUFERVJfU1RBUlRfQUREUiAgICAgICAgICAgICAgICAgIDB4MzYyOAorI2RlZmluZSBIRVZDX0RCTEtfQ0ZHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNTBiCisjZGVmaW5lIEhFVkNEX01QUF9BTkMyQVhJX1RCTF9EQVRBICAgICAgICAgICAgICAgICAweDM0NjQKKyNkZWZpbmUgSEVWQ19TQU9fTU1VX1ZIMV9BRERSICAgICAgICAgICAgICAgICAgICAgIDB4MzYzYgorI2RlZmluZSBIRVZDX1NBT19NTVVfVkgwX0FERFIgICAgICAgICAgICAgICAgICAgICAgMHgzNjNhCisKKworLyoKKyAqIEFWUzJfREVDX1NUQVRVUyBkZWZpbmUKKyovCisvKmludGVybmFsKi8KKyNkZWZpbmUgQVZTMl9ERUNfSURMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVZTMl9TRVFVRU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVZTMl9JX1BJQ1RVUkUgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVZTMl9QQl9QSUNUVVJFICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQVZTMl9ESVNDQVJEX1NUQVJUQ09ERSAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQVZTMl9ESVNDQVJEX05BTCAgICAgICAgICAgICAgICAgICAgICAgIDQKKworI2RlZmluZSBBVlMyX1NMSUNFX0RFQ09ESU5HICAgICAgICAgICAgICAgICAgICAgNgorCisjZGVmaW5lIFNXQVBfSU5fQ01EICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIFNXQVBfT1VUX0NNRCAgICAgICAgICAgICAgICAgICAgICAgICAweDExCisjZGVmaW5lIFNXQVBfT1VUSU5fQ01EICAgICAgICAgICAgICAgICAgICAgICAweDEyCisjZGVmaW5lIFNXQVBfRE9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEzCisjZGVmaW5lIFNXQVBfUE9TVF9JTklUICAgICAgICAgICAgICAgICAgICAgICAweDE0CisKKy8qaGVhZCovCisjZGVmaW5lIEFWUzJfSEVBRF9TRVFfUkVBRFkgICAgICAgICAgICAgICAgICAweDIxCisjZGVmaW5lIEFWUzJfSEVBRF9QSUNfSV9SRUFEWSAgICAgICAgICAgICAgICAweDIyCisjZGVmaW5lIEFWUzJfSEVBRF9QSUNfUEJfUkVBRFkgICAgICAgICAgICAgICAweDIzCisjZGVmaW5lIEFWUzJfSEVBRF9TRVFfRU5EX1JFQURZICAgICAgICAgICAgICAweDI0CisjZGVmaW5lIEFWUzJfU1RBUlRDT0RFX1NFQVJDSF9ET05FICAgICAgICAgICAweDI1CisKKy8qcGljIGRvbmUqLworI2RlZmluZSBIRVZDX0RFQ1BJQ19EQVRBX0RPTkUgICAgICAgMHgzMAorI2RlZmluZSBIRVZDX0RFQ1BJQ19EQVRBX0VSUk9SICAgICAgMHgzMQorI2RlZmluZSBIRVZDX05BTF9ERUNPREVfRE9ORSAgICAgICAgMHgzMgorI2RlZmluZSBBVlMyX0RFQ09ERV9CVUZFTVBUWSAgICAgICAgMHgzMworI2RlZmluZSBBVlMyX0RFQ09ERV9USU1FT1VUICAgICAgICAgMHgzNAorI2RlZmluZSBBVlMyX0RFQ09ERV9PVkVSX1NJWkUgICAgICAgMHgzNQorI2RlZmluZSBBVlMyX0VPUyAgICAgICAgICAgICAgICAgICAgMHgzNgorCisvKmNtZCovCisjZGVmaW5lIEFWUzJfMTBCX0RJU0NBUkRfTkFMICAgICAgICAgICAgICAgICAweGYwCisjZGVmaW5lIEFWUzJfU0VBUkNIX05FV19QSUMgICAgICAgICAgICAgICAgICAweGYxCisjZGVmaW5lIEFWUzJfQUNUSU9OX0VSUk9SICAgICAgICAgICAgICAgICAgICAweGZlCisjZGVmaW5lIEhFVkNfQUNUSU9OX0VSUk9SICAgICAgICAgICAgICAgICAgICAweGZlCisjZGVmaW5lIEFWUzJfQUNUSU9OX0RPTkUgICAgICAgICAgICAgICAgICAgICAweGZmCisvKkFWUzJfREVDX1NUQVRVUyBlbmQqLworCisKKyNkZWZpbmUgVkZfUE9PTF9TSVpFICAgICAgICAzMgorCisjdW5kZWYgcHJfaW5mbworI2RlZmluZSBwcl9pbmZvIHByaW50aworCisjZGVmaW5lIERFQ09ERV9NT0RFX1NJTkdMRQkJCQkoMCB8ICgweDgwIDw8IDI0KSkKKyNkZWZpbmUgREVDT0RFX01PREVfTVVMVElfU1RSRUFNQkFTRQkoMSB8ICgweDgwIDw8IDI0KSkKKyNkZWZpbmUgREVDT0RFX01PREVfTVVMVElfRlJBTUVCQVNFCQkoMiB8ICgweDgwIDw8IDI0KSkKKworCisjZGVmaW5lICBWUDlfVFJJR0dFUl9GUkFNRV9ET05FCQkweDEwMAorI2RlZmluZSAgVlA5X1RSSUdHRVJfRlJBTUVfRU5BQkxFCTB4MjAwCisKKy8qI2RlZmluZSBNVl9NRU1fVU5JVCAweDI0MCovCisjZGVmaW5lIE1WX01FTV9VTklUIDB4MjAwCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEluY2x1ZGUgInBhcnNlcl9jbWQuaCIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFBBUlNFUl9DTURfU0tJUF9DRkdfMCAweDAwMDAwOTBiCisKKyNkZWZpbmUgUEFSU0VSX0NNRF9TS0lQX0NGR18xIDB4MWIxNDE0MGYKKworI2RlZmluZSBQQVJTRVJfQ01EX1NLSVBfQ0ZHXzIgMHgwMDFiMTkxMAorCisKKyNkZWZpbmUgUEFSU0VSX0NNRF9OVU1CRVIgMzcKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHBhcnNlcl9jbWRbUEFSU0VSX0NNRF9OVU1CRVJdID0geworMHgwNDAxLAorMHg4NDAxLAorMHgwODAwLAorMHgwNDAyLAorMHg5MDAyLAorMHgxNDIzLAorMHg4Q0MzLAorMHgxNDIzLAorMHg4ODA0LAorMHg5ODI1LAorMHgwODAwLAorMHgwNEZFLAorMHg4NDA2LAorMHg4NDExLAorMHgxODAwLAorMHg4NDA4LAorMHg4NDA5LAorMHg4QzJBLAorMHg5QzJCLAorMHgxQzAwLAorMHg4NDBGLAorMHg4NDA3LAorMHg4MDAwLAorMHg4NDA4LAorMHgyMDAwLAorMHhBODAwLAorMHg4NDEwLAorMHgwNERFLAorMHg4NDBDLAorMHg4NDBELAorMHhBQzAwLAorMHhBMDAwLAorMHgwOEMwLAorMHgwOEUwLAorMHhBNDBFLAorMHhGQzAwLAorMHg3QzAwCit9OworCitzdGF0aWMgaW50MzJfdCBnX1dxTURlZmF1bHQ0eDRbMTZdID0geworCTY0LCAgICAgNjQsICAgICA2NCwgICAgIDY4LAorCTY0LCAgICAgNjQsICAgICA2OCwgICAgIDcyLAorCTY0LCAgICAgNjgsICAgICA3NiwgICAgIDgwLAorCTcyLCAgICAgNzYsICAgICA4NCwgICAgIDk2Cit9OworCisKK3N0YXRpYyBpbnQzMl90IGdfV3FNRGVmYXVsdDh4OFs2NF0gPSB7CisJNjQsICAgICA2NCwgICAgIDY0LCAgICAgNjQsICAgICA2OCwgICAgIDY4LCAgICAgNzIsICAgICA3NiwKKwk2NCwgICAgIDY0LCAgICAgNjQsICAgICA2OCwgICAgIDcyLCAgICAgNzYsICAgICA4NCwgICAgIDkyLAorCTY0LCAgICAgNjQsICAgICA2OCwgICAgIDcyLCAgICAgNzYsICAgICA4MCwgICAgIDg4LCAgICAgMTAwLAorCTY0LCAgICAgNjgsICAgICA3MiwgICAgIDgwLCAgICAgODQsICAgICA5MiwgICAgIDEwMCwgICAgMTEyLAorCTY4LCAgICAgNzIsICAgICA4MCwgICAgIDg0LCAgICAgOTIsICAgICAxMDQsICAgIDExMiwgICAgMTI4LAorCTc2LCAgICAgODAsICAgICA4NCwgICAgIDkyLCAgICAgMTA0LCAgICAxMTYsICAgIDEzMiwgICAgMTUyLAorCTk2LCAgICAgMTAwLCAgICAxMDQsICAgIDExNiwgICAgMTI0LCAgICAxNDAsICAgIDE2NCwgICAgMTg4LAorCTEwNCwgICAgMTA4LCAgICAxMTYsICAgIDEyOCwgICAgMTUyLCAgICAxNzIsICAgIDE5MiwgICAgMjE2Cit9OworLyojZGVmaW5lIEhFVkNfUElDX1NUUlVDVF9TVVBQT1JUKi8KKy8qIHRvIHJlbW92ZSwgZml4IGJ1aWxkIGVycm9yICovCisKKy8qI2RlZmluZSBDT0RFQ19NTV9GTEFHU19GT1JfVkRFQ09ERVIgIDAqLworCisjZGVmaW5lIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKy8qICNkZWZpbmUgRVJST1JfSEFORExFX0RFQlVHICovCisKKyNpZm5kZWYgU1RBVF9LVEhSRUFECisjZGVmaW5lIFNUQVRfS1RIUkVBRCAweDQwCisjZW5kaWYKKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKyNkZWZpbmUgTUFYX0RFQ09ERV9JTlNUQU5DRV9OVU0gICAgIDEyCisjZGVmaW5lIE1VTFRJX0RSSVZFUl9OQU1FICJhbW12ZGVjX2F2czJfdjRsIgorCisjZGVmaW5lIGxvY2tfYnVmZmVyKGRlYywgZmxhZ3MpIFwKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRlYy0+YnVmZmVyX2xvY2ssIGZsYWdzKQorCisjZGVmaW5lIHVubG9ja19idWZmZXIoZGVjLCBmbGFncykgXAorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZWMtPmJ1ZmZlcl9sb2NrLCBmbGFncykKKworc3RhdGljIHUzMiBkZWJ1Z19tYXNrID0gMHhmZmZmZmZmZjsKKyNkZWZpbmUgZ2V0X2RiZ19mbGFnKGRlYykgKChkZWJ1Z19tYXNrICYgKDEgPDwgZGVjLT5pbmRleCkpID8gZGVidWcgOiAwKQorCitzdGF0aWMgdW5zaWduZWQgaW50IG1heF9kZWNvZGVfaW5zdGFuY2VfbnVtCisJCQkJPSBNQVhfREVDT0RFX0lOU1RBTkNFX05VTTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVjb2RlX2ZyYW1lX2NvdW50W01BWF9ERUNPREVfSU5TVEFOQ0VfTlVNXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGlzcGxheV9mcmFtZV9jb3VudFtNQVhfREVDT0RFX0lOU1RBTkNFX05VTV07CitzdGF0aWMgdW5zaWduZWQgaW50IG1heF9wcm9jZXNzX3RpbWVbTUFYX0RFQ09ERV9JTlNUQU5DRV9OVU1dOworc3RhdGljIHVuc2lnbmVkIGludCBydW5fY291bnRbTUFYX0RFQ09ERV9JTlNUQU5DRV9OVU1dOworc3RhdGljIHVuc2lnbmVkIGludCBpbnB1dF9lbXB0eVtNQVhfREVDT0RFX0lOU1RBTkNFX05VTV07CitzdGF0aWMgdW5zaWduZWQgaW50IG5vdF9ydW5fcmVhZHlbTUFYX0RFQ09ERV9JTlNUQU5DRV9OVU1dOworCisjaWZkZWYgRzEyQV9CUklOR1VQX0RFQlVHCitzdGF0aWMgdTMyIGRlY29kZV90aW1lb3V0X3ZhbCA9IDIwMDsKKyNlbHNlCitzdGF0aWMgdTMyIGRlY29kZV90aW1lb3V0X3ZhbCA9IDIwMDsKKyNlbmRpZgorc3RhdGljIGludCBzdGFydF9kZWNvZGVfYnVmX2xldmVsID0gMHg4MDAwOworI2lmZGVmIEFWUzJfMTBCX01NVQorc3RhdGljIHUzMiB3b3JrX2J1Zl9zaXplOyAvKiA9IDI0ICogMTAyNCAqIDEwMjQqLzsKKyNlbHNlCitzdGF0aWMgdTMyIHdvcmtfYnVmX3NpemUgPSAzMiAqIDEwMjQgKiAxMDI0OworI2VuZGlmCisKK3N0YXRpYyB1MzIgbXZfYnVmX21hcmdpbjsKK3N0YXRpYyBpbnQgcHJlX2RlY29kZV9idWZfbGV2ZWwgPSAweDEwMDA7CitzdGF0aWMgdTMyIGFnYWluX3RocmVzaG9sZDsKKworCisvKiBET1VCTEVfV1JJVEVfTU9ERSBpcyBlbmFibGVkIG9ubHkgd2hlbiBOVjIxIDggYml0IG91dHB1dCBpcyBuZWVkZWQgKi8KKy8qIGRvdWJsZV93cml0ZV9tb2RlOgorICoJMCwgbm8gZG91YmxlIHdyaXRlOworICoJMSwgMToxIHJhdGlvOworICoJMiwgKDEvNCk6KDEvNCkgcmF0aW87CisgKgkzLCAoMS80KTooMS80KSByYXRpbywgd2l0aCBib3RoIGNvbXByZXNzZWQgZnJhbWUgaW5jbHVkZWQKKyAqCTQsICgxLzIpOigxLzIpIHJhdGlvOworICoJOCwgKDEvOCk6KDEvOCkgcmF0aW87CisgKgkweDEwLCBkb3VibGUgd3JpdGUgb25seQorICoJMHgxMDAsIGlmID4gMTA4MHAsdXNlIG1vZGUgNCxlbHNlIHVzZSBtb2RlIDE7CisgKgkweDIwMCwgaWYgPiAxMDgwcCx1c2UgbW9kZSAyLGVsc2UgdXNlIG1vZGUgMTsKKyAqCTB4MzAwLCBpZiA+IDcyMHAsIHVzZSBtb2RlIDQsIGVsc2UgdXNlIG1vZGUgMTsKKyAqLworc3RhdGljIHUzMiBkb3VibGVfd3JpdGVfbW9kZTsKK3N0YXRpYyB1MzIgd2l0aG91dF9kaXNwbGF5X21vZGU7CisKK3N0YXRpYyB1MzIgbXZfYnVmX2R5bmFtaWNfYWxsb2M7CisjZGVmaW5lIERSSVZFUl9OQU1FICJhbXZkZWNfYXZzMl92NGwiCisjZGVmaW5lIERSSVZFUl9IRUFERVJfTkFNRSAiYW12ZGVjX2F2czJfaGVhZGVyIgorCisKKyNkZWZpbmUgUFVUX0lOVEVSVkFMICAgICAgICAoSFovMTAwKQorI2RlZmluZSBFUlJPUl9TWVNURU1fUkVTRVRfQ09VTlQgICAyMDAKKworI2RlZmluZSBQVFNfTk9STUFMICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUFRTX05PTkVfUkVGX1VTRV9EVVJBVElPTiAxCisKKyNkZWZpbmUgUFRTX01PREVfU1dJVENISU5HX1RIUkVTSE9MRCAgICAgICAgICAgMworI2RlZmluZSBQVFNfTU9ERV9TV0lUQ0hJTkdfUkVDT1ZFUllfVEhSRUFTSE9MRCAzCisKKyNkZWZpbmUgRFVSMlBUUyh4KSAoKHgpKjkwLzk2KQorCitzdHJ1Y3QgQVZTMkRlY29kZXJfczsKK3N0YXRpYyBpbnQgdmF2czJfdmZfc3RhdGVzKHN0cnVjdCB2ZnJhbWVfc3RhdGVzICpzdGF0ZXMsIHZvaWQgKik7CitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2YXZzMl92Zl9wZWVrKHZvaWQgKik7CitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2YXZzMl92Zl9nZXQodm9pZCAqKTsKK3N0YXRpYyB2b2lkIHZhdnMyX3ZmX3B1dChzdHJ1Y3QgdmZyYW1lX3MgKiwgdm9pZCAqKTsKK3N0YXRpYyBpbnQgdmF2czJfZXZlbnRfY2IoaW50IHR5cGUsIHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGVfZGF0YSk7CitzdGF0aWMgdm9pZCBzZXRfdmZyYW1lKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMsCisJc3RydWN0IHZmcmFtZV9zICp2Ziwgc3RydWN0IGF2czJfZnJhbWVfcyAqcGljLCB1OCBkdW1teSk7CitzdGF0aWMgczMyIHZhdnMyX2luaXQoc3RydWN0IHZkZWNfcyAqdmRlYyk7CitzdGF0aWMgdm9pZCB2YXZzMl9wcm90X2luaXQoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYyk7CitzdGF0aWMgaW50IHZhdnMyX2xvY2FsX2luaXQoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYyk7CitzdGF0aWMgdm9pZCB2YXZzMl9wdXRfdGltZXJfZnVuYyhzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpOworc3RhdGljIHZvaWQgZHVtcF9kYXRhKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMsIGludCBzaXplKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGdldF9kYXRhX2NoZWNrX3N1bQorCShzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjLCBpbnQgc2l6ZSk7CitzdGF0aWMgdm9pZCBkdW1wX3BpY19saXN0KHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMpOworCitzdGF0aWMgY29uc3QgY2hhciB2YXZzMl9kZWNfaWRbXSA9ICJ2YXZzMi1kZXYiOworCisjZGVmaW5lIFBST1ZJREVSX05BTUUgICAiZGVjb2Rlci5hdnMyIgorI2RlZmluZSBNVUxUSV9JTlNUQU5DRV9QUk9WSURFUl9OQU1FICAgICJ2ZGVjLmF2czIiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmZyYW1lX29wZXJhdGlvbnNfcyB2YXZzMl92Zl9wcm92aWRlciA9IHsKKwkucGVlayA9IHZhdnMyX3ZmX3BlZWssCisJLmdldCA9IHZhdnMyX3ZmX2dldCwKKwkucHV0ID0gdmF2czJfdmZfcHV0LAorCS5ldmVudF9jYiA9IHZhdnMyX2V2ZW50X2NiLAorCS52Zl9zdGF0ZXMgPSB2YXZzMl92Zl9zdGF0ZXMsCit9OworCitzdGF0aWMgc3RydWN0IHZmcmFtZV9wcm92aWRlcl9zIHZhdnMyX3ZmX3Byb3Y7CisKK3N0YXRpYyB1MzIgYml0X2RlcHRoX2x1bWE7CitzdGF0aWMgdTMyIGJpdF9kZXB0aF9jaHJvbWE7CitzdGF0aWMgdTMyIGZyYW1lX3dpZHRoOworc3RhdGljIHUzMiBmcmFtZV9oZWlnaHQ7CitzdGF0aWMgdTMyIHZpZGVvX3NpZ25hbF90eXBlOworc3RhdGljIHUzMiBwdHNfdW5zdGFibGU7CitzdGF0aWMgdTMyIG9uX25vX2tleWZyYW1lX3NraXBlZDsKKworc3RhdGljIHUzMiBmb3JjZV92aWRlb19zaWduYWxfdHlwZTsKK3N0YXRpYyB1MzIgZW5hYmxlX2ZvcmNlX3ZpZGVvX3NpZ25hbF90eXBlOworI2RlZmluZSBWSURFT19TSUdOQUxfVFlQRV9BVkFJTEFCTEVfTUFTSwkweDIwMDAwMDAwCisjZGVmaW5lIEhEUl9DVVZBX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2aWRlb19mb3JtYXRfbmFtZXNbXSA9IHsKKwkiY29tcG9uZW50IiwgIlBBTCIsICJOVFNDIiwgIlNFQ0FNIiwKKwkiTUFDIiwgInVuc3BlY2lmaWVkIiwgIlJlc2VydmVkIiwgIlJlc2VydmVkIgorfTsKKworc3RhdGljIGlubGluZSBpbnQgZGl2X3IzMihpbnQ2NF90IG0sIGludCBuKQoreworLyoKK3JldHVybiAoaW50KShtL24pCisqLworI2lmbmRlZiBDT05GSUdfQVJNNjQKKwlpbnQ2NF90IHF1ID0gMDsKKwlxdSA9IGRpdl9zNjQobSwgbik7CisJcmV0dXJuIChpbnQpcXU7CisjZWxzZQorCXJldHVybiAoaW50KShtL24pOworI2VuZGlmCit9CisKK2VudW0gdnB4X2JpdF9kZXB0aF90IHsKKwlBVlMyX0JJVFNfOCAgPSAgOCwgIC8qKjwgIDggYml0cyAqLworCUFWUzJfQklUU18xMCA9IDEwLCAgLyoqPCAxMCBiaXRzICovCisJQVZTMl9CSVRTXzEyID0gMTIsICAvKio8IDEyIGJpdHMgKi8KK307CisKKy8qVVNFX0JVRl9CTE9DSyovCitzdHJ1Y3QgQlVGX3MgeworCWludCBpbmRleDsKKwl1bnNpZ25lZCBpbnQgYWxsb2NfZmxhZzsKKwkvKmJ1ZmZlciAqLworCXVuc2lnbmVkIGludCBjbWFfcGFnZV9jb3VudDsKKwl1bnNpZ25lZCBsb25nIGFsbG9jX2FkZHI7CisJdW5zaWduZWQgbG9uZyBzdGFydF9hZHI7CisJdW5zaWduZWQgaW50IHNpemU7CisKKwl1bnNpZ25lZCBpbnQgZnJlZV9zdGFydF9hZHI7Cit9IC8qQlVGX3QgKi87CisKK3N0cnVjdCBNVkJVRl9zIHsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X2FkcjsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwlpbnQgdXNlZF9mbGFnOworfSAvKk1WQlVGX3QgKi87CisKKwkvKiAjdW5kZWYgQlVGTUdSX09OTFkgdG8gZW5hYmxlIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gKi8KKworLyojZGVmaW5lIFRFU1RfV1JfUFRSX0lOQyovCisjZGVmaW5lIFdSX1BUUl9JTkNfTlVNIDEyOAorCisjZGVmaW5lIFNJTVVMQVRJT04KKyNkZWZpbmUgRE9TX1BST0pFQ1QKKyN1bmRlZiBNRU1PUllfTUFQX0lOX1JFQUxfQ0hJUAorCisvKiN1bmRlZiBET1NfUFJPSkVDVCovCisvKiNkZWZpbmUgTUVNT1JZX01BUF9JTl9SRUFMX0NISVAqLworCisvKiNkZWZpbmUgQlVGRkVSX01HUl9PTkxZKi8KKy8qI2RlZmluZSBDT05GSUdfSEVWQ19DTEtfRk9SQ0VEX09OKi8KKy8qI2RlZmluZSBFTkFCTEVfU1dBUF9URVNUKi8KKworI2lmZGVmIEFWUzJfMTBCX05WMjEKKyNkZWZpbmUgTUVNX01BUF9NT0RFIDIgIC8qIDA6bGluZWFyIDE6MzJ4MzIgMjo2NHgzMiovCisjZWxzZQorI2RlZmluZSBNRU1fTUFQX01PREUgMCAgLyogMDpsaW5lYXIgMTozMngzMiAyOjY0eDMyKi8KKyNlbmRpZgorCisjaWZkZWYgQVZTMl8xMEJfTlYyMQorI2Vsc2UKKyNkZWZpbmUgTE9TTEVTU19DT01QUkVTU19NT0RFCisjZW5kaWYKKworI2RlZmluZSBET1VCTEVfV1JJVEVfWVNUQVJUX1RFTVAgMHgwMjAwMDAwMAorI2RlZmluZSBET1VCTEVfV1JJVEVfQ1NUQVJUX1RFTVAgMHgwMjkwMDAwMAorCisjZGVmaW5lIEFWUzJfREJHX0JVRk1HUiAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEFWUzJfREJHX0JVRk1HUl9NT1JFICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEFWUzJfREJHX0JVRk1HUl9ERVRBSUwgICAgICAgICAgICAweDA0CisjZGVmaW5lIEFWUzJfREJHX0lSUV9FVkVOVCAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIEFWUzJfREJHX09VVF9QVFMgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIEFWUzJfREJHX1BSSU5UX1NPVVJDRV9MSU5FICAgICAgICAweDIwCisjZGVmaW5lIEFWUzJfREJHX1BSSU5UX1BBUkFNICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIEFWUzJfREJHX1BSSU5UX1BJQ19MSVNUICAgICAgICAgICAweDgwCisjZGVmaW5lIEFWUzJfREJHX1NFTkRfUEFSQU1fV0lUSF9SRUcgICAgICAweDEwMAorI2RlZmluZSBBVlMyX0RCR19NRVJHRSAgICAgICAgICAgICAgICAgICAgMHgyMDAKKyNkZWZpbmUgQVZTMl9EQkdfREJHX0xGX1BSSU5UICAgICAgICAgICAgIDB4NDAwCisjZGVmaW5lIEFWUzJfREJHX1JFRyAgICAgICAgICAgICAgICAgICAgICAweDgwMAorI2RlZmluZSBBVlMyX0RCR19QSUNfTEVBSyAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIEFWUzJfREJHX1BJQ19MRUFLX1dBSVQgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgQVZTMl9EQkdfSERSX0lORk8gICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBBVlMyX0RCR19IRFJfREFUQSAgICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIEFWUzJfREJHX0RJU19MT0NfRVJST1JfUFJPQyAgICAgICAweDEwMDAwCisjZGVmaW5lIEFWUzJfREJHX0RJU19TWVNfRVJST1JfUFJPQyAgIDB4MjAwMDAKKyNkZWZpbmUgQVZTMl9EQkdfRFVNUF9QSUNfTElTVCAgICAgICAweDQwMDAwCisjZGVmaW5lIEFWUzJfREJHX1RSSUdfU0xJQ0VfU0VHTUVOVF9QUk9DIDB4ODAwMDAKKyNkZWZpbmUgQVZTMl9EQkdfRk9SQ0VfVU5DT01QUkVTUyAgICAgICAweDEwMDAwMAorI2RlZmluZSBBVlMyX0RCR19MT0FEX1VDT0RFX0ZST01fRklMRSAgIDB4MjAwMDAwCisjZGVmaW5lIEFWUzJfREJHX0ZPUkNFX1NFTkRfQUdBSU4gICAgICAgMHg0MDAwMDAKKyNkZWZpbmUgQVZTMl9EQkdfRFVNUF9EQVRBICAgICAgICAgICAgICAweDgwMDAwMAorI2RlZmluZSBBVlMyX0RCR19EVU1QX0xNRU1fQlVGICAgICAgICAgMHgxMDAwMDAwCisjZGVmaW5lIEFWUzJfREJHX0RVTVBfUlBNX0JVRiAgICAgICAgICAweDIwMDAwMDAKKyNkZWZpbmUgQVZTMl9EQkdfQ0FDSEUgICAgICAgICAgICAgICAgIDB4NDAwMDAwMAorI2RlZmluZSBJR05PUkVfUEFSQU1fRlJPTV9DT05GSUcgICAgICAgICAweDgwMDAwMDAKKy8qTVVMVElfSU5TVEFOQ0VfU1VQUE9SVCovCisjZGVmaW5lIFBSSU5UX0ZMQUdfRVJST1IJCQkJMAorI2RlZmluZSBQUklOVF9GTEFHX1ZERUNfU1RBVFVTICAgICAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgUFJJTlRfRkxBR19WREVDX0RFVEFJTCAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIFBSSU5UX0ZMQUdfVkRFQ19EQVRBICAgICAgICAgICAgIDB4ODAwMDAwMDAKKworI2RlZmluZSBQUklOVF9MSU5FKCkgXAorCWRvIHsgXAorCQlpZiAoZGVidWcgJiBBVlMyX0RCR19QUklOVF9TT1VSQ0VfTElORSlcCisJCQlwcl9pbmZvKCIlcyBsaW5lICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pO1wKKwl9IHdoaWxlICgwKQorCitzdGF0aWMgdTMyIGRlYnVnOworCitzdGF0aWMgdTMyIGRlYnVnX2FnYWluOworCitib29sIGlzX2F2czJfcHJpbnRfcGFyYW0odm9pZCkKK3sKKwlib29sIHJldCA9IGZhbHNlOworCWlmIChkZWJ1ZyAmIEFWUzJfREJHX1BSSU5UX1BBUkFNKQorCQlyZXQgPSB0cnVlOworCXJldHVybiByZXQ7Cit9CisKK2Jvb2wgaXNfYXZzMl9wcmludF9idWZtZ3JfZGV0YWlsKHZvaWQpCit7CisJYm9vbCByZXQgPSBmYWxzZTsKKwlpZiAoZGVidWcgJiBBVlMyX0RCR19CVUZNR1JfREVUQUlMKQorCQlyZXQgPSB0cnVlOworCXJldHVybiByZXQ7Cit9CitzdGF0aWMgYm9vbCBpc19yZXNldDsKKy8qZm9yIGRlYnVnKi8KK3N0YXRpYyB1MzIgZm9yY2VfYnVmc3BlYzsKKy8qCisJdWRlYnVnX2ZsYWc6CisJYml0IDAsIGVuYWJsZSB1Y29kZSBwcmludAorCWJpdCAxLCBlbmFibGUgdWNvZGUgZGV0YWlsIHByaW50CisJYml0IFszMToxNl0gbm90IDAsIHBvcyB0byBkdW1wIGxtZW0KKwkJYml0IDIsIHBvcCBiaXRzIHRvIGxtZW0KKwkJYml0IFsxMTo4XSwgcHJlLXBvcCBiaXRzIGZvciBhbGlnbm1lbnQgKHdoZW4gYml0IDIgaXMgMSkKKyovCitzdGF0aWMgdTMyIHVkZWJ1Z19mbGFnOworLyoKKwl3aGVuIHVkZWJ1Z19mbGFnWzE6MF0gaXMgbm90IDAKKwl1ZGVidWdfcGF1c2VfcG9zIG5vdCAwLAorCQlwYXVzZSBwb3NpdGlvbgorKi8KK3N0YXRpYyB1MzIgdWRlYnVnX3BhdXNlX3BvczsKKy8qCisJd2hlbiB1ZGVidWdfZmxhZ1sxOjBdIGlzIG5vdCAwCisJYW5kIHVkZWJ1Z19wYXVzZV9wb3MgaXMgbm90IDAsCisJCXBhdXNlIG9ubHkgd2hlbiBERUJVR19SRUcyIGlzIGVxdWFsIHRvIHRoaXMgdmFsCisqLworc3RhdGljIHUzMiB1ZGVidWdfcGF1c2VfdmFsOworCitzdGF0aWMgdTMyIHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4OworCitzdGF0aWMgdTMyIGZvcmNlX2Rpc3BfcGljX2luZGV4OworCisjZGVmaW5lIEFVWF9CVUZfQUxJR04oYWRyKSAoKGFkciArIDB4ZikgJiAofjB4ZikpCitzdGF0aWMgdTMyIGN1dmFfYnVmX3NpemUgPSA1MTI7CisKKyNkZWZpbmUgREVCVUdfUkVHCisjaWZkZWYgREVCVUdfUkVHCitzdGF0aWMgdm9pZCBXUklURV9WUkVHX0RCRzIodW5zaWduZWQgYWRyLCB1bnNpZ25lZCB2YWwpCit7CisJaWYgKGRlYnVnICYgQVZTMl9EQkdfUkVHKQorCQlwcl9pbmZvKCIlcygleCwgJXgpXG4iLCBfX2Z1bmNfXywgYWRyLCB2YWwpOworCWlmIChhZHIgIT0gMCkKKwkJV1JJVEVfVlJFRyhhZHIsIHZhbCk7Cit9CisKKyN1bmRlZiBXUklURV9WUkVHCisjZGVmaW5lIFdSSVRFX1ZSRUcgV1JJVEVfVlJFR19EQkcyCisjZW5kaWYKKworCisvLyNpZmRlZiBBVlMyXzEwQl9NTVUKKy8vI2RlZmluZSBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkUgIDB4NDgwMDAKKy8vI2RlZmluZSBNTVVfQ09NUFJFU1NfOEtfSEVBREVSX1NJWkUgIDB4NDgwMDAqNAorLy8jZW5kaWYKKyNkZWZpbmUgTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFXzEwODBQICAweDEwMDAwCisjZGVmaW5lIE1NVV9DT01QUkVTU19IRUFERVJfU0laRV80SyAgMHg0ODAwMAorI2RlZmluZSBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfOEsgIDB4MTIwMDAwCisKKyNkZWZpbmUgSU5WQUxJRF9JRFggLTEgIC8qIEludmFsaWQgYnVmZmVyIGluZGV4LiovCisKKworI2RlZmluZSBGUkFNRV9CVUZGRVJTIChBVlMyX01BWF9CVUZGRVJfTlVNKQorI2RlZmluZSBIRUFERVJfRlJBTUVfQlVGRkVSUyAoRlJBTUVfQlVGRkVSUykKKyNkZWZpbmUgTUFYX0JVRl9OVU0gKEZSQU1FX0JVRkZFUlMpCisKKyNkZWZpbmUgRlJBTUVfQ09OVEVYVFNfTE9HMiAyCisjZGVmaW5lIEZSQU1FX0NPTlRFWFRTICgxIDw8IEZSQU1FX0NPTlRFWFRTX0xPRzIpCisvKmJ1ZmZlciArIGhlYWRlciBidWZmZXIgKyB3b3Jrc3BhY2UqLworI3VuZGVmIE1WX1VTRV9GSVhFRF9CVUYKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisjZGVmaW5lIE1BWF9CTU1VX0JVRkZFUl9OVU0gKChGUkFNRV9CVUZGRVJTICsgSEVBREVSX0ZSQU1FX0JVRkZFUlMgKyAxKSsxKQorI2RlZmluZSBWRl9CVUZGRVJfSURYKG4pIChuKQorI2RlZmluZSBIRUFERVJfQlVGRkVSX0lEWChuKSAoRlJBTUVfQlVGRkVSUyArIG4rMSkKKyNkZWZpbmUgV09SS19TUEFDRV9CVUZfSUQgKEZSQU1FX0JVRkZFUlMgKyBIRUFERVJfRlJBTUVfQlVGRkVSUysxKQorI2Vsc2UKKyNkZWZpbmUgTUFYX0JNTVVfQlVGRkVSX05VTSAoKChGUkFNRV9CVUZGRVJTKjIpK0hFQURFUl9GUkFNRV9CVUZGRVJTKzEpKzEpCisjZGVmaW5lIFZGX0JVRkZFUl9JRFgobikgKG4pCisjZGVmaW5lIEhFQURFUl9CVUZGRVJfSURYKG4pIChGUkFNRV9CVUZGRVJTICsgbisxKQorI2RlZmluZSBNVl9CVUZGRVJfSURYKG4pICgoRlJBTUVfQlVGRkVSUyAqIDIpICsgbisxKQorI2RlZmluZSBXT1JLX1NQQUNFX0JVRl9JRCAoKEZSQU1FX0JVRkZFUlMgKiAyKSArIEhFQURFUl9GUkFNRV9CVUZGRVJTKzEpCisjZW5kaWYKKworI2RlZmluZSBDT19NVl9CVUZfU0laRV8xMDgwUCAgMHgzZmMwMAorI2RlZmluZSBDT19NVl9CVUZfU0laRV80SyAgICAgMHgxMjAwMDAKKyNkZWZpbmUgQ09fTVZfQlVGX1NJWkVfOEsgICAgIDB4NDgwMDAwCisvKgorc3RhdGljIHZvaWQgc2V0X2NhbnZhcyhzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjLAorCXN0cnVjdCBhdnMyX2ZyYW1lX3MgKnBpYyk7CitpbnQgYXZzMl9wcmVwYXJlX2Rpc3BsYXlfYnVmKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMsCisJCQkJCWludCBwb3MpOworKi8KKworCitzdHJ1Y3QgYnVmZl9zIHsKKwl1MzIgYnVmX3N0YXJ0OworCXUzMiBidWZfc2l6ZTsKKwl1MzIgYnVmX2VuZDsKK307CisKK3N0cnVjdCBCdWZmSW5mb19zIHsKKwl1MzIgbWF4X3dpZHRoOworCXUzMiBtYXhfaGVpZ2h0OworCXUzMiBzdGFydF9hZHI7CisJdTMyIGVuZF9hZHI7CisJc3RydWN0IGJ1ZmZfcyBpcHA7CisJc3RydWN0IGJ1ZmZfcyBzYW9fYWJ2OworCXN0cnVjdCBidWZmX3Mgc2FvX3ZiOworCXN0cnVjdCBidWZmX3Mgc2hvcnRfdGVybV9ycHM7CisJc3RydWN0IGJ1ZmZfcyByY3M7CisJc3RydWN0IGJ1ZmZfcyBzcHM7CisJc3RydWN0IGJ1ZmZfcyBwcHM7CisJc3RydWN0IGJ1ZmZfcyBzYW9fdXA7CisJc3RydWN0IGJ1ZmZfcyBzd2FwX2J1ZjsKKwlzdHJ1Y3QgYnVmZl9zIHN3YXBfYnVmMjsKKwlzdHJ1Y3QgYnVmZl9zIHNjYWxlbHV0OworCXN0cnVjdCBidWZmX3MgZGJsa19wYXJhOworCXN0cnVjdCBidWZmX3MgZGJsa19kYXRhOworCXN0cnVjdCBidWZmX3MgZGJsa19kYXRhMjsKKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwlzdHJ1Y3QgYnVmZl9zIG1tdV92Ymg7CisJc3RydWN0IGJ1ZmZfcyBjbV9oZWFkZXI7CisjZW5kaWYKKwlzdHJ1Y3QgYnVmZl9zIG1wcmVkX2Fib3ZlOworI2lmZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwlzdHJ1Y3QgYnVmZl9zIG1wcmVkX212OworI2VuZGlmCisJc3RydWN0IGJ1ZmZfcyBycG07CisJc3RydWN0IGJ1ZmZfcyBsbWVtOworfTsKKworI2RlZmluZSBERUNfUkVTVUxUX05PTkUgICAgICAgICAgICAgMAorI2RlZmluZSBERUNfUkVTVUxUX0RPTkUgICAgICAgICAgICAgMQorI2RlZmluZSBERUNfUkVTVUxUX0FHQUlOICAgICAgICAgICAgMgorI2RlZmluZSBERUNfUkVTVUxUX0NPTkZJR19QQVJBTSAgICAgMworI2RlZmluZSBERUNfUkVTVUxUX0VSUk9SICAgICAgICAgICAgNAorI2RlZmluZSBERUNfSU5JVF9QSUNMSVNUCQkJNQorI2RlZmluZSBERUNfVU5JTklUX1BJQ0xJU1QJCQk2CisjZGVmaW5lIERFQ19SRVNVTFRfR0VUX0RBVEEgICAgICAgICA3CisjZGVmaW5lIERFQ19SRVNVTFRfR0VUX0RBVEFfUkVUUlkgICA4CisjZGVmaW5lIERFQ19SRVNVTFRfRU9TICAgICAgICAgICAgICA5CisjZGVmaW5lIERFQ19SRVNVTFRfRk9SQ0VfRVhJVCAgICAgICAxMAorCitzdGF0aWMgdm9pZCBhdnMyX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3N0cnVjdCBsb29wX2ZpbHRlcl9pbmZvX247CitzdHJ1Y3QgbG9vcGZpbHRlcjsKK3N0cnVjdCBzZWdtZW50YXRpb247CisKK3N0cnVjdCBBVlMyRGVjb2Rlcl9zIHsKKwlpbnQgcGljX2xpc3RfaW5pdF9mbGFnOworCXVuc2lnbmVkIGNoYXIgaW5kZXg7CisJc3BpbmxvY2tfdCBidWZmZXJfbG9jazsKKwlzdHJ1Y3QgZGV2aWNlICpjbWFfZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRmb3JtX2RldjsKKwl2b2lkICgqdmRlY19jYikoc3RydWN0IHZkZWNfcyAqLCB2b2lkICopOworCXZvaWQgKnZkZWNfY2JfYXJnOworCXN0cnVjdCB2ZnJhbWVfY2h1bmtfcyAqY2h1bms7CisJaW50IGRlY19yZXN1bHQ7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJdTMyIHN0YXJ0X3NoaWZ0X2J5dGVzOworCisJc3RydWN0IEJ1ZmZJbmZvX3Mgd29ya19zcGFjZV9idWZfc3RvcmU7CisJdW5zaWduZWQgbG9uZyBidWZfc3RhcnQ7CisJdTMyIGJ1Zl9zaXplOworCXUzMiBjbWFfYWxsb2NfY291bnQ7CisJdW5zaWduZWQgbG9uZyBjbWFfYWxsb2NfYWRkcjsKKwl1aW50OF90IGVvczsKKwl1bnNpZ25lZCBsb25nIGludCBzdGFydF9wcm9jZXNzX3RpbWU7CisJdW5zaWduZWQgbGFzdF9sY3VfaWR4OworCWludCBkZWNvZGVfdGltZW91dF9jb3VudDsKKwl1bnNpZ25lZCB0aW1lb3V0X251bTsKKworCWludCBkb3VibGVfd3JpdGVfbW9kZTsKKworCXVuc2lnbmVkIGNoYXIgbV9pbnNfZmxhZzsKKwljaGFyICpwcm92aWRlcl9uYW1lOworCWludCBmcmFtZV9jb3VudDsKKwl1MzIgc3RhdDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwl1MzIgZnJhbWVfZHVyOworCXUzMiBmcmFtZV9hcjsKKwlpbnQgZmF0YWxfZXJyb3I7CisJdWludDhfdCBpbml0X2ZsYWc7CisJdWludDhfdCBmaXJzdF9zY19jaGVja2VkOworCXVpbnQ4X3QgcHJvY2Vzc19idXN5OworI2RlZmluZSBQUk9DX1NUQVRFX0lOSVQJCQkwCisjZGVmaW5lIFBST0NfU1RBVEVfSEVBRF9ET05FCTEKKyNkZWZpbmUgUFJPQ19TVEFURV9ERUNPRElORwkJMgorI2RlZmluZSBQUk9DX1NUQVRFX0hFQURfQUdBSU4JMworI2RlZmluZSBQUk9DX1NUQVRFX0RFQ09ERV9BR0FJTgk0CisjZGVmaW5lIFBST0NfU1RBVEVfVEVTVDEJCTUKKwl1aW50OF90IHByb2Nlc3Nfc3RhdGU7CisJdTMyIHVjb2RlX3BhdXNlX3BvczsKKworCWludCBzaG93X2ZyYW1lX251bTsKKyNpZm5kZWYgQVZTMl8xMEJfTU1VCisJc3RydWN0IGJ1ZmZfcyBtY19idWZfc3BlYzsKKyNlbmRpZgorCXN0cnVjdCBkZWNfc3lzaW5mbyB2YXZzMl9hbXN0cmVhbV9kZWNfaW5mbzsKKwl2b2lkICpycG1fYWRkcjsKKwl2b2lkICpsbWVtX2FkZHI7CisJZG1hX2FkZHJfdCBycG1fcGh5X2FkZHI7CisJZG1hX2FkZHJfdCBsbWVtX3BoeV9hZGRyOworCXVuc2lnbmVkIHNob3J0ICpsbWVtX3B0cjsKKwl1bnNpZ25lZCBzaG9ydCAqZGVidWdfcHRyOworCisJdTMyIGN1dmFfc2l6ZTsKKwl2b2lkICpjdXZhX2FkZHI7CisJZG1hX2FkZHJfdCBjdXZhX3BoeV9hZGRyOworCisjaWYgMQorCS8qQVZTMl8xMEJfTU1VKi8KKwl2b2lkICpmcmFtZV9tbXVfbWFwX2FkZHI7CisJZG1hX2FkZHJfdCBmcmFtZV9tbXVfbWFwX3BoeV9hZGRyOworI2VuZGlmCisJdW5zaWduZWQgaW50IHVzZV9jbWFfZmxhZzsKKworCXN0cnVjdCBCVUZfcyBtX0JVRltNQVhfQlVGX05VTV07CisJc3RydWN0IE1WQlVGX3MgbV9tdl9CVUZbTUFYX0JVRl9OVU1dOworCXUzMiB1c2VkX2J1Zl9udW07CisJREVDTEFSRV9LRklGTyhuZXdmcmFtZV9xLCBzdHJ1Y3QgdmZyYW1lX3MgKiwgVkZfUE9PTF9TSVpFKTsKKwlERUNMQVJFX0tGSUZPKGRpc3BsYXlfcSwgc3RydWN0IHZmcmFtZV9zICosIFZGX1BPT0xfU0laRSk7CisJREVDTEFSRV9LRklGTyhwZW5kaW5nX3EsIHN0cnVjdCB2ZnJhbWVfcyAqLCBWRl9QT09MX1NJWkUpOworCXN0cnVjdCB2ZnJhbWVfcyB2ZnBvb2xbVkZfUE9PTF9TSVpFXTsKKwlhdG9taWNfdCB2Zl9wcmVfY291bnQ7CisJYXRvbWljX3QgdmZfZ2V0X2NvdW50OworCWF0b21pY190IHZmX3B1dF9jb3VudDsKKwlpbnQgYnVmX251bTsKKwl1bnNpZ25lZCBpbnQgbG9zbGVzc19jb21wX2JvZHlfc2l6ZTsKKworCXUzMiB2aWRlb19zaWduYWxfdHlwZTsKKwl1MzIgdmlkZW9fb3JpX3NpZ25hbF90eXBlOworCisJaW50IHB0c19tb2RlOworCWludCBsYXN0X2xvb2t1cF9wdHM7CisJaW50IGxhc3RfcHRzOworCXU2NCBsYXN0X2xvb2t1cF9wdHNfdXM2NDsKKwl1NjQgbGFzdF9wdHNfdXM2NDsKKwl1NjQgc2hpZnRfYnl0ZV9jb3VudDsKKwl1MzIgc2hpZnRfYnl0ZV9jb3VudF9sbzsKKwl1MzIgc2hpZnRfYnl0ZV9jb3VudF9oaTsKKwlpbnQgcHRzX21vZGVfc3dpdGNoaW5nX2NvdW50OworCWludCBwdHNfbW9kZV9yZWNvdmVyeV9jb3VudDsKKworCWJvb2wgZ2V0X2ZyYW1lX2R1cjsKKwl1MzIgc2F2ZWRfcmVzb2x1dGlvbjsKKworCS8qKi8KKwlpbnQgcmVmcmVzaF9mcmFtZV9mbGFnczsKKwl1aW50OF90IGhvbGRfcmVmX2J1ZjsKKwlzdHJ1Y3QgQnVmZkluZm9fcyAqd29ya19zcGFjZV9idWY7CisjaWZuZGVmIEFWUzJfMTBCX01NVQorCXN0cnVjdCBidWZmX3MgKm1jX2J1ZjsKKyNlbmRpZgorCXVuc2lnbmVkIGludCBmcmFtZV93aWR0aDsKKwl1bnNpZ25lZCBpbnQgZnJhbWVfaGVpZ2h0OworCisJdW5zaWduZWQgc2hvcnQgKnJwbV9wdHI7CisJaW50ICAgICBpbml0X3BpY193OworCWludCAgICAgaW5pdF9waWNfaDsKKworCWludCAgICAgc2xpY2VfdHlwZTsKKworCWludCBkZWNvZGVfaWR4OworCWludCBzbGljZV9pZHg7CisJdWludDhfdCB3YWl0X2J1ZjsKKwl1aW50OF90IGVycm9yX2ZsYWc7CisJdW5zaWduZWQgaW50IGJ1Zm1ncl9lcnJvcl9jb3VudDsKKworCS8qIGJpdCAwLCBmb3IgZGVjb2Rpbmc7IGJpdCAxLCBmb3IgZGlzcGxheWluZyAqLworCXVpbnQ4X3QgaWdub3JlX2J1Zm1ncl9lcnJvcjsKKwl1aW50OF90IHNraXBfUEJfYmVmb3JlX0k7CisJaW50IFBCX3NraXBfbW9kZTsKKwlpbnQgUEJfc2tpcF9jb3VudF9hZnRlcl9kZWNvZGluZzsKKwkvKmh3Ki8KKworCS8qKi8KKwlzdHJ1Y3QgdmRlY19pbmZvICpndnM7CisKKworCXVuc2lnbmVkIGludCBkZWNfc3RhdHVzOworCXUzMiBsYXN0X3B1dF9pZHg7CisJaW50IG5ld19mcmFtZV9kaXNwbGF5ZWQ7CisJdm9pZCAqbW11X2JveDsKKwl2b2lkICpibW11X2JveDsKKwlzdHJ1Y3QgdmZyYW1lX21hc3Rlcl9kaXNwbGF5X2NvbG91cl9zIHZmX2RwOworCXN0cnVjdCBmaXJtd2FyZV9zICpmdzsKKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwlpbnQgY3VyX2ZiX2lkeF9tbXU7CisJbG9uZyB1c2VkXzRrX251bTsKKyNlbmRpZgorCXN0cnVjdCBhdnMyX2RlY29kZXIgYXZzMl9kZWM7CisjZGVmaW5lIEFMRl9OVU1fQklUX1NISUZUICAgICAgNgorI2RlZmluZSBOT19WQVJfQklOUyAgICAgICAgICAgIDE2CisJaW50MzJfdCBtX2ZpbHRlckNvZWZmU3ltWzE2XVs5XTsKKwlpbnQzMl90IG1fdmFySW5kVGFiW05PX1ZBUl9CSU5TXTsKKworCXN0cnVjdCB2ZnJhbWVfcyB2ZnJhbWVfZHVtbXk7CisJCS8qIHN0YXJ0X2RlY29kaW5nX2ZsYWcsCisJCQliaXQgMCwgU0VRIHJlYWR5CisJCQliaXQgMSwgSSByZWFkeQorCQkqLworCXVuc2lnbmVkIGNoYXIgc3RhcnRfZGVjb2RpbmdfZmxhZzsKKwl1aW50MzJfdCBtcHJlZF9hYnZfc3RhcnRfYWRkcjsKKwl1aW50MzJfdCBtcHJlZF9hYnZfc3RhcnRfYWRkcl9iYWs7CisJdTggbmV4dF9hZ2Fpbl9mbGFnOworCXUzMiBwcmVfcGFyc2VyX3dyX3B0cjsKKwlpbnQgbmVlZF9jYWNoZV9zaXplOworCXU2NCBzY19zdGFydF90aW1lOworI2lmZGVmIElfT05MWV9TVVBQT1JUCisJdTMyIGlfb25seTsKKyNlbmRpZgorCWludCBmcmFtZWluZm9fZW5hYmxlOworCXN0cnVjdCB2ZnJhbWVfcW9zX3MgdmZyYW1lX3FvczsKKwl1MzIgZHluYW1pY19idWZfbWFyZ2luOworCWludCBzaWRlYmluZF90eXBlOworCWludCBzaWRlYmluZF9jaGFubmVsX2lkOworCXUzMiBlbmRpYW47CisJY2hhciB2ZGVjX25hbWVbMzJdOworCWNoYXIgcHRzX25hbWVbMzJdOworCWNoYXIgbmV3X3FfbmFtZVszMl07CisJY2hhciBkaXNwX3FfbmFtZVszMl07CisJZG1hX2FkZHJfdCByZG1hX3BoeV9hZHI7CisJdW5zaWduZWQgKnJkbWFfYWRyOworCWludCBoZHJfZmxhZzsKK307CisKK3N0YXRpYyBpbnQgIGNvbXB1dGVfbG9zbGVzc19jb21wX2JvZHlfc2l6ZSgKKwkJc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCQl1aW50OF90IGlzX2JpdF9kZXB0aF8xMCk7CisKK3N0YXRpYyBpbnQgYXZzMl9wcmludChzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjLAorCWludCBmbGFnLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyNkZWZpbmUgSEVWQ19QUklOVF9CVUYJCTI1NgorCXVuc2lnbmVkIGNoYXIgYnVmW0hFVkNfUFJJTlRfQlVGXTsKKwlpbnQgbGVuID0gMDsKKwlpZiAoZGVjID09IE5VTEwgfHwKKwkJKGZsYWcgPT0gMCkgfHwKKwkJKGRlYnVnICYgZmxhZykpIHsKKwkJdmFfbGlzdCBhcmdzOworCQl2YV9zdGFydChhcmdzLCBmbXQpOworCQlpZiAoZGVjKQorCQkJbGVuID0gc3ByaW50ZihidWYsICJbJWRdIiwgZGVjLT5pbmRleCk7CisJCXZzbnByaW50ZihidWYgKyBsZW4sIEhFVkNfUFJJTlRfQlVGIC0gbGVuLCBmbXQsIGFyZ3MpOworCQlwcl9pbmZvKCIlcyIsIGJ1Zik7CisJCXZhX2VuZChhcmdzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXZzMl9wcmludF9jb250KHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMsCisJaW50IGZsYWcsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXVuc2lnbmVkIGNoYXIgYnVmW0hFVkNfUFJJTlRfQlVGXTsKKwlpbnQgbGVuID0gMDsKKwlpZiAoZGVjID09IE5VTEwgfHwKKwkJKGZsYWcgPT0gMCkgfHwKKwkJKGRlYnVnICYgZmxhZykpIHsKKwkJdmFfbGlzdCBhcmdzOworCQl2YV9zdGFydChhcmdzLCBmbXQpOworCQl2c25wcmludGYoYnVmICsgbGVuLCBIRVZDX1BSSU5UX0JVRiAtIGxlbiwgZm10LCBhcmdzKTsKKwkJcHJfaW5mbygiJXMiLCBidWYpOworCQl2YV9lbmQoYXJncyk7CisJfQorCXJldHVybiAwOworfQorCisjZGVmaW5lIFBST0JfU0laRSAgICAoNDk2ICogMiAqIDQpCisjZGVmaW5lIFBST0JfQlVGX1NJWkUgICAgKDB4NTAwMCkKKyNkZWZpbmUgQ09VTlRfQlVGX1NJWkUgICAoMHgzMDAgKiA0ICogNCkKKy8qY29tcHV0ZV9sb3NsZXNzX2NvbXBfYm9keV9zaXplKDQwOTYsIDIzMDQsIDEpID0gMTg4NzQzNjgoMHgxMjAwMDAwKSovCisjZGVmaW5lIE1BWF9GUkFNRV80S19OVU0gMHgxMjAwCisjZGVmaW5lIE1BWF9GUkFNRV84S19OVU0gMHg0ODAwCisjZGVmaW5lIE1BWF9TSVpFXzRLICg0MDk2ICogMjMwNCkKKyNkZWZpbmUgSVNfOEtfU0laRSh3LCBoKQkoKCh3KSAqIChoKSkgPiBNQVhfU0laRV80SykKKyNkZWZpbmUgSVNfNEtfU0laRSh3LCBoKSAgKCgodykgKiAoaCkpID4gKDE5MjAqMTA4OCkpCisKK3N0YXRpYyBpbnQgZ2V0X2ZyYW1lX21tdV9tYXBfc2l6ZShzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpICYmCisJCShJU184S19TSVpFKGRlYy0+aW5pdF9waWNfdywgZGVjLT5pbml0X3BpY19oKSkpCisJCXJldHVybiAoTUFYX0ZSQU1FXzhLX05VTSAqIDQpOworCXJldHVybiAoTUFYX0ZSQU1FXzRLX05VTSAqIDQpOworfQorCitzdGF0aWMgaW50IGdldF9jb21wcmVzc19oZWFkZXJfc2l6ZShzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpICYmCisJCShJU184S19TSVpFKGRlYy0+aW5pdF9waWNfdywgZGVjLT5pbml0X3BpY19oKSkpCisJCXJldHVybiBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfOEs7CisJZWxzZSBpZiAoSVNfNEtfU0laRShkZWMtPmluaXRfcGljX3csIGRlYy0+aW5pdF9waWNfaCkpCisJCXJldHVybiBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfNEs7CisJcmV0dXJuIE1NVV9DT01QUkVTU19IRUFERVJfU0laRV8xMDgwUDsKK30KKworc3RhdGljIHZvaWQgcmVzZXRfcHJvY2Vzc190aW1lKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMpCit7CisJaWYgKGRlYy0+c3RhcnRfcHJvY2Vzc190aW1lKSB7CisJCXVuc2lnbmVkIHByb2Nlc3NfdGltZSA9CisJCQkxMDAwICogKGppZmZpZXMgLSBkZWMtPnN0YXJ0X3Byb2Nlc3NfdGltZSkgLyBIWjsKKwkJZGVjLT5zdGFydF9wcm9jZXNzX3RpbWUgPSAwOworCQlpZiAocHJvY2Vzc190aW1lID4gbWF4X3Byb2Nlc3NfdGltZVtkZWMtPmluZGV4XSkKKwkJCW1heF9wcm9jZXNzX3RpbWVbZGVjLT5pbmRleF0gPSBwcm9jZXNzX3RpbWU7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdGFydF9wcm9jZXNzX3RpbWUoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYykKK3sKKwlkZWMtPnN0YXJ0X3Byb2Nlc3NfdGltZSA9IGppZmZpZXM7CisJZGVjLT5kZWNvZGVfdGltZW91dF9jb3VudCA9IDA7CisJZGVjLT5sYXN0X2xjdV9pZHggPSAwOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfZGVjb2RlZF9waWMoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYyk7CisKK3N0YXRpYyB2b2lkIHRpbWVvdXRfcHJvY2VzcyhzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCXN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjID0gJmRlYy0+YXZzMl9kZWM7CisJc3RydWN0IGF2czJfZnJhbWVfcyAqY3VyX3BpYyA9IGF2czJfZGVjLT5oYy5jdXJfcGljOworCWRlYy0+dGltZW91dF9udW0rKzsKKwlhbWhldmNfc3RvcCgpOworCWF2czJfcHJpbnQoZGVjLAorCQkwLCAiJXMgZGVjb2RlciB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CisJaWYgKGN1cl9waWMpCisJCWN1cl9waWMtPmVycm9yX21hcmsgPSAxOworCWRlYy0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwl1cGRhdGVfZGVjb2RlZF9waWMoZGVjKTsKKwlyZXNldF9wcm9jZXNzX3RpbWUoZGVjKTsKKwl2ZGVjX3NjaGVkdWxlX3dvcmsoJmRlYy0+d29yayk7Cit9CisKK3N0YXRpYyB1MzIgZ2V0X3ZhbGlkX2RvdWJsZV93cml0ZV9tb2RlKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMpCit7CisJcmV0dXJuIChkZWMtPm1faW5zX2ZsYWcgJiYKKwkJKChkb3VibGVfd3JpdGVfbW9kZSAmIDB4ODAwMDAwMDApID09IDApKSA/CisJCWRlYy0+ZG91YmxlX3dyaXRlX21vZGUgOgorCQkoZG91YmxlX3dyaXRlX21vZGUgJiAweDdmZmZmZmZmKTsKK30KKworc3RhdGljIGludCBnZXRfZG91YmxlX3dyaXRlX21vZGUoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYykKK3sKKwl1MzIgdmFsaWRfZHdfbW9kZSA9IGdldF92YWxpZF9kb3VibGVfd3JpdGVfbW9kZShkZWMpOworCWludCB3ID0gZGVjLT5hdnMyX2RlYy5pbWcud2lkdGg7CisJaW50IGggPSBkZWMtPmF2czJfZGVjLmltZy5oZWlnaHQ7CisJdTMyIGR3ID0gMHgxOyAvKjE6MSovCisJc3dpdGNoICh2YWxpZF9kd19tb2RlKSB7CisJY2FzZSAweDEwMDoKKwkJaWYgKHcgPiAxOTIwICYmIGggPiAxMDg4KQorCQkJZHcgPSAweDQ7IC8qMToyKi8KKwkJYnJlYWs7CisJY2FzZSAweDIwMDoKKwkJaWYgKHcgPiAxOTIwICYmIGggPiAxMDg4KQorCQkJZHcgPSAweDI7IC8qMTo0Ki8KKwkJYnJlYWs7CisJY2FzZSAweDMwMDoKKwkJaWYgKHcgPiAxMjgwICYmIGggPiA3MjApCisJCQlkdyA9IDB4NDsgLyoxOjIqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkdyA9IHZhbGlkX2R3X21vZGU7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gZHc7Cit9CisKKy8qIGZvciBkb3VibGUgd3JpdGUgYnVmIGFsbG9jICovCitzdGF0aWMgaW50IGdldF9kb3VibGVfd3JpdGVfbW9kZV9pbml0KHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMpCit7CisJdTMyIHZhbGlkX2R3X21vZGUgPSBnZXRfdmFsaWRfZG91YmxlX3dyaXRlX21vZGUoZGVjKTsKKwl1MzIgZHc7CisJaW50IHcgPSBkZWMtPmluaXRfcGljX3c7CisJaW50IGggPSBkZWMtPmluaXRfcGljX2g7CisKKwlkdyA9IDB4MTsgLyoxOjEqLworCXN3aXRjaCAodmFsaWRfZHdfbW9kZSkgeworCWNhc2UgMHgxMDA6CisJCWlmICh3ID4gMTkyMCAmJiBoID4gMTA4OCkKKwkJCWR3ID0gMHg0OyAvKjE6MiovCisJCWJyZWFrOworCWNhc2UgMHgyMDA6CisJCWlmICh3ID4gMTkyMCAmJiBoID4gMTA4OCkKKwkJCWR3ID0gMHgyOyAvKjE6NCovCisJCWJyZWFrOworCWNhc2UgMHgzMDA6CisJCWlmICh3ID4gMTI4MCAmJiBoID4gNzIwKQorCQkJZHcgPSAweDQ7IC8qMToyKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZHcgPSB2YWxpZF9kd19tb2RlOworCQlicmVhazsKKwl9CisJcmV0dXJuIGR3OworfQorCisvLyNkZWZpbmUJTUFYXzRLX05VTQkJMHgxMjAwCisjaWZkZWYgQVZTMl8xMEJfTU1VCitpbnQgYXZzMl9hbGxvY19tbXUoCisJc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYywKKwlpbnQgY3VyX2J1Zl9pZHgsCisJaW50IHBpY193aWR0aCwKKwlpbnQgcGljX2hlaWdodCwKKwl1bnNpZ25lZCBzaG9ydCBiaXRfZGVwdGgsCisJdW5zaWduZWQgaW50ICptbXVfaW5kZXhfYWRyKQoreworCWludCBiaXRfZGVwdGhfMTAgPSAoYml0X2RlcHRoID09IEFWUzJfQklUU18xMCk7CisJaW50IHBpY3R1cmVfc2l6ZTsKKwlpbnQgY3VyX21tdV80a19udW1iZXIsIG1heF9mcmFtZV9udW07CisjaWZkZWYgRFlOQU1JQ19BTExPQ19IRUFECisJdW5zaWduZWQgbG9uZyBidWZfYWRkcjsKKwlzdHJ1Y3QgYXZzMl9mcmFtZV9zICpwaWMgPSBkZWMtPmF2czJfZGVjLmhjLmN1cl9waWM7CisJaWYgKHBpYy0+aGVhZGVyX2FkciA9PSAwKSB7CisJCWlmIChkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkKKwkJCQkoZGVjLT5ibW11X2JveCwKKwkJCQlIRUFERVJfQlVGRkVSX0lEWChjdXJfYnVmX2lkeCksCisJCQkJZ2V0X2NvbXByZXNzX2hlYWRlcl9zaXplKGRlYyksCisJCQkJRFJJVkVSX0hFQURFUl9OQU1FLAorCQkJCSZidWZfYWRkcikgPCAwKXsKKwkJCWF2czJfcHJpbnQoZGVjLCAwLAorCQkJCSIlcyBtYWxsb2MgY29tcHJlc3MgaGVhZGVyIGZhaWxlZCAlZFxuIiwKKwkJCQlEUklWRVJfSEVBREVSX05BTUUsIGN1cl9idWZfaWR4KTsKKwkJCWRlYy0+ZmF0YWxfZXJyb3IgfD0gREVDT0RFUl9GQVRBTF9FUlJPUl9OT19NRU07CisJCQlyZXR1cm4gLTE7CisJCX0gZWxzZQorCQkJcGljLT5oZWFkZXJfYWRyID0gYnVmX2FkZHI7CisJfQorI2VuZGlmCisKKwlwaWN0dXJlX3NpemUgPSBjb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemUoCisJCWRlYywgcGljX3dpZHRoLCBwaWNfaGVpZ2h0LAorCQliaXRfZGVwdGhfMTApOworCWN1cl9tbXVfNGtfbnVtYmVyID0gKChwaWN0dXJlX3NpemUgKyAoMSA8PCAxMikgLSAxKSA+PiAxMik7CisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKQorCQltYXhfZnJhbWVfbnVtID0gTUFYX0ZSQU1FXzhLX05VTTsKKwllbHNlCisJCW1heF9mcmFtZV9udW0gPSBNQVhfRlJBTUVfNEtfTlVNOworCWlmIChjdXJfbW11XzRrX251bWJlciA+IG1heF9mcmFtZV9udW0pIHsKKwkJcHJfZXJyKCJvdmVyIG1heCAhISBjdXJfbW11XzRrX251bWJlciAweCV4IHdpZHRoICVkIGhlaWdodCAlZFxuIiwKKwkJCWN1cl9tbXVfNGtfbnVtYmVyLCBwaWNfd2lkdGgsIHBpY19oZWlnaHQpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiBkZWNvZGVyX21tdV9ib3hfYWxsb2NfaWR4KAorCQlkZWMtPm1tdV9ib3gsCisJCWN1cl9idWZfaWR4LAorCQljdXJfbW11XzRrX251bWJlciwKKwkJbW11X2luZGV4X2Fkcik7Cit9CisjZW5kaWYKKworI2lmIDAKKy8qbmRlZiBNVl9VU0VfRklYRURfQlVGKi8KK3N0YXRpYyB2b2lkIGRlYWxsb2NfbXZfYnVmcyhzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBGUkFNRV9CVUZGRVJTOyBpKyspIHsKKwkJaWYgKGRlYy0+bV9tdl9CVUZbaV0uc3RhcnRfYWRyKSB7CisJCQlpZiAoZGVidWcpCisJCQkJcHJfaW5mbygKKwkJCQkiZGVhbGxvYyBtdiBidWYoJWQpIGFkciAlbGQgc2l6ZSAweCV4IHVzZWRfZmxhZyAlZFxuIiwKKwkJCQlpLCBkZWMtPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciwKKwkJCQlkZWMtPm1fbXZfQlVGW2ldLnNpemUsCisJCQkJZGVjLT5tX212X0JVRltpXS51c2VkX2ZsYWcpOworCQkJZGVjb2Rlcl9ibW11X2JveF9mcmVlX2lkeCgKKwkJCQlkZWMtPmJtbXVfYm94LAorCQkJCU1WX0JVRkZFUl9JRFgoaSkpOworCQkJZGVjLT5tX212X0JVRltpXS5zdGFydF9hZHIgPSAwOworCQkJZGVjLT5tX212X0JVRltpXS5zaXplID0gMDsKKwkJCWRlYy0+bV9tdl9CVUZbaV0udXNlZF9mbGFnID0gMDsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBhbGxvY19tdl9idWYoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYywKKwlpbnQgaSwgaW50IHNpemUpCit7CisJaW50IHJldCA9IDA7CisJaWYgKGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeQorCQkoZGVjLT5ibW11X2JveCwKKwkJTVZfQlVGRkVSX0lEWChpKSwgc2l6ZSwKKwkJRFJJVkVSX05BTUUsCisJCSZkZWMtPm1fbXZfQlVGW2ldLnN0YXJ0X2FkcikgPCAwKSB7CisJCWRlYy0+bV9tdl9CVUZbaV0uc3RhcnRfYWRyID0gMDsKKwkJcmV0ID0gLTE7CisJfSBlbHNlIHsKKwkJZGVjLT5tX212X0JVRltpXS5zaXplID0gc2l6ZTsKKwkJZGVjLT5tX212X0JVRltpXS51c2VkX2ZsYWcgPSAwOworCQlyZXQgPSAwOworCQlpZiAoZGVidWcpIHsKKwkJCXByX2luZm8oCisJCQkiTVYgQnVmZmVyICVkOiBzdGFydF9hZHIgJXAgc2l6ZSAleFxuIiwKKwkJCWksCisJCQkodm9pZCAqKWRlYy0+bV9tdl9CVUZbaV0uc3RhcnRfYWRyLAorCQkJZGVjLT5tX212X0JVRltpXS5zaXplKTsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGluaXRfbXZfYnVmX2xpc3Qoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYykKK3sKKwlpbnQgaTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgY291bnQgPSBGUkFNRV9CVUZGRVJTOworCWludCBwaWNfd2lkdGggPSBkZWMtPmluaXRfcGljX3c7CisJaW50IHBpY19oZWlnaHQgPSBkZWMtPmluaXRfcGljX2g7CisJaW50IGxjdV9zaXplID0gNjQ7IC8qZml4ZWQgNjQqLworCWludCBwaWNfd2lkdGhfNjQgPSAocGljX3dpZHRoICsgNjMpICYgKH4weDNmKTsKKwlpbnQgcGljX2hlaWdodF8zMiA9IChwaWNfaGVpZ2h0ICsgMzEpICYgKH4weDFmKTsKKwlpbnQgcGljX3dpZHRoX2xjdSAgPSAocGljX3dpZHRoXzY0ICUgbGN1X3NpemUpID8KKwkJCQlwaWNfd2lkdGhfNjQgLyBsY3Vfc2l6ZSAgKyAxCisJCQkJOiBwaWNfd2lkdGhfNjQgLyBsY3Vfc2l6ZTsKKwlpbnQgcGljX2hlaWdodF9sY3UgPSAocGljX2hlaWdodF8zMiAlIGxjdV9zaXplKSA/CisJCQkJcGljX2hlaWdodF8zMiAvIGxjdV9zaXplICsgMQorCQkJCTogcGljX2hlaWdodF8zMiAvIGxjdV9zaXplOworCWludCBsY3VfdG90YWwgICAgICAgPSBwaWNfd2lkdGhfbGN1ICogcGljX2hlaWdodF9sY3U7CisJaW50IHNpemUgPSAoKGxjdV90b3RhbCAqIE1WX01FTV9VTklUKSArIDB4ZmZmZikgJgorCQkofjB4ZmZmZik7CisJaWYgKG12X2J1Zl9tYXJnaW4gPiAwKQorCQljb3VudCA9IGRlYy0+YXZzMl9kZWMucmVmX21heGJ1ZmZlciArIG12X2J1Zl9tYXJnaW47CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJaWYgKGFsbG9jX212X2J1ZihkZWMsIGksIHNpemUpIDwgMCkgeworCQkJcmV0ID0gLTE7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorI2lmIDAKKworc3RhdGljIGludCBnZXRfbXZfYnVmKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMsCisJCQkJc3RydWN0IGF2czJfZnJhbWVfcyAqcGljKQoreworCWludCBpOworCWludCByZXQgPSAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgRlJBTUVfQlVGRkVSUzsgaSsrKSB7CisJCWlmIChkZWMtPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciAmJgorCQkJZGVjLT5tX212X0JVRltpXS51c2VkX2ZsYWcgPT0gMCkgeworCQkJZGVjLT5tX212X0JVRltpXS51c2VkX2ZsYWcgPSAxOworCQkJcmV0ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHJldCA+PSAwKSB7CisJCXBpYy0+bXZfYnVmX2luZGV4ID0gcmV0OworCQlwaWMtPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIgPQorCQkJKGRlYy0+bV9tdl9CVUZbcmV0XS5zdGFydF9hZHIgKyAweGZmZmYpICYKKwkJCSh+MHhmZmZmKTsKKwkJaWYgKGRlYnVnICYgQVZTMl9EQkdfQlVGTUdSX01PUkUpCisJCQlwcl9pbmZvKAorCQkJIiVzID0+ICVkICglZCkgc2l6ZSAweCV4XG4iLAorCQkJX19mdW5jX18sIHJldCwKKwkJCXBpYy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkciwKKwkJCWRlYy0+bV9tdl9CVUZbcmV0XS5zaXplKTsKKwl9IGVsc2UgeworCQlwcl9pbmZvKAorCQkiJXM6IEVycm9yLCBtdiBidWYgaXMgbm90IGVub3VnaFxuIiwKKwkJX19mdW5jX18pOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBwdXRfbXZfYnVmKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMsCisJCQkJc3RydWN0IGF2czJfZnJhbWVfcyAqcGljKQoreworCWludCBpID0gcGljLT5tdl9idWZfaW5kZXg7CisJaWYgKGkgPj0gRlJBTUVfQlVGRkVSUykgeworCQlpZiAoZGVidWcgJiBBVlMyX0RCR19CVUZNR1JfTU9SRSkKKwkJCXByX2luZm8oCisJCQkiJXM6IGluZGV4ICVkIGJleW9uZCByYW5nZVxuIiwKKwkJCV9fZnVuY19fLCBpKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZGVidWcgJiBBVlMyX0RCR19CVUZNR1JfTU9SRSkKKwkJcHJfaW5mbygKKwkJIiVzKCVkKTogdXNlZF9mbGFnKCVkKVxuIiwKKwkJX19mdW5jX18sIGksCisJCWRlYy0+bV9tdl9CVUZbaV0udXNlZF9mbGFnKTsKKworCXBpYy0+bXZfYnVmX2luZGV4ID0gLTE7CisJaWYgKGRlYy0+bV9tdl9CVUZbaV0uc3RhcnRfYWRyICYmCisJCWRlYy0+bV9tdl9CVUZbaV0udXNlZF9mbGFnKQorCQlkZWMtPm1fbXZfQlVGW2ldLnVzZWRfZmxhZyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCXB1dF91bl91c2VkX212X2J1ZnMoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYykKK3sKKwlzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjb25zdCBjbSA9ICZkZWMtPmNvbW1vbjsKKwlzdHJ1Y3QgUmVmQ250QnVmZmVyX3MgKmNvbnN0IGZyYW1lX2J1ZnMgPSBjbS0+YnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnM7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGRlYy0+dXNlZF9idWZfbnVtOyArK2kpIHsKKwkJaWYgKChmcmFtZV9idWZzW2ldLnJlZl9jb3VudCA9PSAwKSAmJgorCQkJKGZyYW1lX2J1ZnNbaV0uYnVmLmluZGV4ICE9IC0xKSAmJgorCQkJKGZyYW1lX2J1ZnNbaV0uYnVmLm12X2J1Zl9pbmRleCA+PSAwKQorCQkJKQorCQkJcHV0X212X2J1ZihkZWMsICZmcmFtZV9idWZzW2ldLmJ1Zik7CisJfQorfQorI2VuZGlmCisKKyNlbmRpZgorCitzdGF0aWMgaW50IGdldF9mcmVlX2J1Zl9jb3VudChzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCXN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjID0gJmRlYy0+YXZzMl9kZWM7CisJaW50IGk7CisJaW50IGNvdW50ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgYXZzMl9kZWMtPnJlZl9tYXhidWZmZXI7IGkrKykgeworCQlpZiAoKGF2czJfZGVjLT5mcmVmW2ldLT5pbWdjb2lfcmVmIDwgLTI1NgorI2lmIDAKKwkJCXx8IGFicyhhdnMyX2RlYy0+ZnJlZltpXS0+CisJCQkJaW1ndHJfZndSZWZEaXN0YW5jZSAtIGltZy0+dHIpID49IDEyOAorI2VuZGlmCisJCQkJKSAmJiBhdnMyX2RlYy0+ZnJlZltpXS0+aXNfb3V0cHV0ID09IC0xCisJCQkJJiYgYXZzMl9kZWMtPmZyZWZbaV0tPmJnX2ZsYWcgPT0gMAorI2lmbmRlZiBOT19ESVNQTEFZCisJCQkJJiYgYXZzMl9kZWMtPmZyZWZbaV0tPnZmX3JlZiA9PSAwCisJCQkJJiYgYXZzMl9kZWMtPmZyZWZbaV0tPnRvX3ByZXBhcmVfZGlzcCA9PSAwCisjZW5kaWYKKwkJCQkpIHsKKwkJCWNvdW50Kys7CisJCX0KKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNpZmRlZiBDT05TVFJBSU5fTUFYX0JVRl9OVU0KK3N0YXRpYyBpbnQgZ2V0X3ZmX3JlZl9vbmx5X2J1Zl9jb3VudChzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCXN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjID0gJmRlYy0+YXZzMl9kZWM7CisJaW50IGk7CisJaW50IGNvdW50ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgYXZzMl9kZWMtPnJlZl9tYXhidWZmZXI7IGkrKykgeworCQlpZiAoKGF2czJfZGVjLT5mcmVmW2ldLT5pbWdjb2lfcmVmIDwgLTI1NgorI2lmIDAKKwkJCXx8IGFicyhhdnMyX2RlYy0+ZnJlZltpXS0+CisJCQkJaW1ndHJfZndSZWZEaXN0YW5jZSAtIGltZy0+dHIpID49IDEyOAorI2VuZGlmCisJCQkJKSAmJiBhdnMyX2RlYy0+ZnJlZltpXS0+aXNfb3V0cHV0ID09IC0xCisJCQkJJiYgYXZzMl9kZWMtPmZyZWZbaV0tPmJnX2ZsYWcgPT0gMAorI2lmbmRlZiBOT19ESVNQTEFZCisJCQkJJiYgYXZzMl9kZWMtPmZyZWZbaV0tPnZmX3JlZiA+IDAKKwkJCQkmJiBhdnMyX2RlYy0+ZnJlZltpXS0+dG9fcHJlcGFyZV9kaXNwID09IDAKKyNlbmRpZgorCQkJCSkgeworCQkJY291bnQrKzsKKwkJfQorCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBnZXRfdXNlZF9idWZfY291bnQoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYykKK3sKKwlzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYyA9ICZkZWMtPmF2czJfZGVjOworCWludCBpOworCWludCBjb3VudCA9IDA7CisJZm9yIChpID0gMDsgaSA8IGF2czJfZGVjLT5yZWZfbWF4YnVmZmVyOyBpKyspIHsKKwkJaWYgKChhdnMyX2RlYy0+ZnJlZltpXS0+aW1nY29pX3JlZiA+PSAtMjU2CisjaWYgMAorCQkJfHwgYWJzKGF2czJfZGVjLT5mcmVmW2ldLT4KKwkJCQlpbWd0cl9md1JlZkRpc3RhbmNlIC0gaW1nLT50cikgPj0gMTI4CisjZW5kaWYKKwkJCQkpIHx8IGF2czJfZGVjLT5mcmVmW2ldLT5pc19vdXRwdXQgIT0gLTEKKwkJCQl8fCBhdnMyX2RlYy0+ZnJlZltpXS0+YmdfZmxhZyAhPSAwCisjaWZuZGVmIE5PX0RJU1BMQVkKKwkJCQl8fCBhdnMyX2RlYy0+ZnJlZltpXS0+dmZfcmVmICE9IDAKKwkJCQl8fCBhdnMyX2RlYy0+ZnJlZltpXS0+dG9fcHJlcGFyZV9kaXNwICE9IDAKKyNlbmRpZgorCQkJCSkgeworCQkJY291bnQrKzsKKwkJfQorCX0KKworCXJldHVybiBjb3VudDsKK30KKyNlbmRpZgorCitpbnQgYXZzMl9idWZtZ3JfaW5pdChzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjLCBzdHJ1Y3QgQnVmZkluZm9fcyAqYnVmX3NwZWNfaSwKKwkJc3RydWN0IGJ1ZmZfcyAqbWNfYnVmX2kpIHsKKworCWRlYy0+ZnJhbWVfY291bnQgPSAwOworI2lmZGVmIEFWUzJfMTBCX01NVQorCWRlYy0+dXNlZF80a19udW0gPSAtMTsKKwlkZWMtPmN1cl9mYl9pZHhfbW11ID0gSU5WQUxJRF9JRFg7CisjZW5kaWYKKworCisJLyogcHJpdmF0ZSBpbml0ICovCisJZGVjLT53b3JrX3NwYWNlX2J1ZiA9IGJ1Zl9zcGVjX2k7CisjaWZuZGVmIEFWUzJfMTBCX01NVQorCWRlYy0+bWNfYnVmID0gbWNfYnVmX2k7CisjZW5kaWYKKwlkZWMtPnJwbV9hZGRyID0gTlVMTDsKKwlkZWMtPmxtZW1fYWRkciA9IE5VTEw7CisKKwlkZWMtPnVzZV9jbWFfZmxhZyA9IDA7CisJZGVjLT5kZWNvZGVfaWR4ID0gMDsKKwlkZWMtPnNsaWNlX2lkeCA9IDA7CisJLyppbnQgbV91aU1heENVV2lkdGggPSAxPDw3OyovCisJLyppbnQgbV91aU1heENVSGVpZ2h0ID0gMTw8NzsqLworCWRlYy0+d2FpdF9idWYgPSAwOworCWRlYy0+ZXJyb3JfZmxhZyA9IDA7CisJZGVjLT5za2lwX1BCX2JlZm9yZV9JID0gMDsKKworCWRlYy0+cHRzX21vZGUgPSBQVFNfTk9STUFMOworCWRlYy0+bGFzdF9wdHMgPSAwOworCWRlYy0+bGFzdF9sb29rdXBfcHRzID0gMDsKKwlkZWMtPmxhc3RfcHRzX3VzNjQgPSAwOworCWRlYy0+bGFzdF9sb29rdXBfcHRzX3VzNjQgPSAwOworCWRlYy0+c2hpZnRfYnl0ZV9jb3VudCA9IDA7CisJZGVjLT5zaGlmdF9ieXRlX2NvdW50X2xvID0gMDsKKwlkZWMtPnNoaWZ0X2J5dGVfY291bnRfaGkgPSAwOworCWRlYy0+cHRzX21vZGVfc3dpdGNoaW5nX2NvdW50ID0gMDsKKwlkZWMtPnB0c19tb2RlX3JlY292ZXJ5X2NvdW50ID0gMDsKKworCWRlYy0+YnVmX251bSA9IDA7CisKKwlkZWMtPmJ1Zm1ncl9lcnJvcl9jb3VudCA9IDA7CisJcmV0dXJuIDA7Cit9CisKKworCisjZGVmaW5lIEhFVkNfQ01fQk9EWV9TVEFSVF9BRERSICAgICAgICAgICAgICAgICAgICAweDM2MjYKKyNkZWZpbmUgSEVWQ19DTV9CT0RZX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgIDB4MzYyNworI2RlZmluZSBIRVZDX0NNX0hFQURFUl9MRU5HVEggICAgICAgICAgICAgICAgICAgICAgMHgzNjI5CisjZGVmaW5lIEhFVkNfQ01fSEVBREVSX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAweDM2MmIKKworI2RlZmluZSBMT1NMRVNTX0NPTVBSRVNTX01PREUKKworLyojZGVmaW5lIERFQ09NUF9IRUFEUl9TVVJHRU5UKi8KKworc3RhdGljIHUzMiBtZW1fbWFwX21vZGU7IC8qIDA6bGluZWFyIDE6MzJ4MzIgMjo2NHgzMiA7IG04YmFieSB0ZXN0MTkwMiAqLworc3RhdGljIHUzMiBlbmFibGVfbWVtX3NhdmluZyA9IDE7CitzdGF0aWMgdTMyIGZvcmNlX3dfaDsKKworc3RhdGljIHUzMiBmb3JjZV9mcHM7CisKKworY29uc3QgdTMyIGF2czJfdmVyc2lvbiA9IDIwMTYwMjEwMTsKK3N0YXRpYyB1MzIgZGVidWc7CitzdGF0aWMgdTMyIHJhZHI7CitzdGF0aWMgdTMyIHJ2YWw7CitzdGF0aWMgdTMyIHBvcF9zaG9ydHM7CitzdGF0aWMgdTMyIGRiZ19jbWQ7CitzdGF0aWMgdTMyIGRiZ19za2lwX2RlY29kZV9pbmRleDsKKy8qCisgKiBiaXQgMH4zLCBmb3IgSEVWQ0RfSVBQX0FYSUlGX0NPTkZJRyBlbmRpYW4gY29uZmlnCisgKiBiaXQgOH4yMywgZm9yIEhFVkNfU0FPX0NUUkwxIGVuZGlhbiBjb25maWcKKyAqLworc3RhdGljIHUzMiBlbmRpYW47CisjZGVmaW5lIEhFVkNfQ09ORklHX0JJR19FTkRJQU4gICAgICgoMHg4ODAgPDwgOCkgfCAweDgpCisjZGVmaW5lIEhFVkNfQ09ORklHX0xJVFRMRV9FTkRJQU4gICgoMHhmZjAgPDwgOCkgfCAweGYpCisKKyNpZmRlZiBFUlJPUl9IQU5ETEVfREVCVUcKK3N0YXRpYyB1MzIgZGJnX25hbF9za2lwX2ZsYWc7CisJCS8qIGJpdFswXSwgc2tpcCB2cHM7IGJpdFsxXSwgc2tpcCBzcHM7IGJpdFsyXSwgc2tpcCBwcHMgKi8KK3N0YXRpYyB1MzIgZGJnX25hbF9za2lwX2NvdW50OworI2VuZGlmCisvKmZvciBkZWJ1ZyovCitzdGF0aWMgdTMyIGRlY29kZV9waWNfYmVnaW47CitzdGF0aWMgdWludCBzbGljZV9wYXJzZV9iZWdpbjsKK3N0YXRpYyB1MzIgc3RlcDsKKyNpZmRlZiBNSVhfU1RSRUFNX1NVUFBPUlQKK3N0YXRpYyB1MzIgYnVmX2FsbG9jX3dpZHRoID0gNDA5NjsKK3N0YXRpYyB1MzIgYnVmX2FsbG9jX2hlaWdodCA9IDIzMDQ7CisKK3N0YXRpYyB1MzIgZHluYW1pY19idWZfbnVtX21hcmdpbjsKKyNlbHNlCitzdGF0aWMgdTMyIGJ1Zl9hbGxvY193aWR0aDsKK3N0YXRpYyB1MzIgYnVmX2FsbG9jX2hlaWdodDsKK3N0YXRpYyB1MzIgZHluYW1pY19idWZfbnVtX21hcmdpbiA9IDc7CisjZW5kaWYKKyNpZmRlZiBDT05TVFJBSU5fTUFYX0JVRl9OVU0KK3N0YXRpYyB1MzIgcnVuX3JlYWR5X21heF92Zl9vbmx5X251bTsKK3N0YXRpYyB1MzIgcnVuX3JlYWR5X2Rpc3BsYXlfcV9udW07CisJLyowOiBub3QgY2hlY2sKKwkgIDB4ZmY6IGF2czJfZGVjLnJlZl9tYXhidWZmZXIKKwkgICovCitzdGF0aWMgdTMyIHJ1bl9yZWFkeV9tYXhfYnVmX251bSA9IDB4ZmY7CisjZW5kaWYKK3N0YXRpYyB1MzIgYnVmX2FsbG9jX2RlcHRoID0gMTA7CitzdGF0aWMgdTMyIGJ1Zl9hbGxvY19zaXplOworLyoKK2JpdFswXTogMCwKKyAgICBiaXRbMV06IDAsIGFsd2F5cyByZWxlYXNlIGNtYSBidWZmZXIgd2hlbiBzdG9wCisgICAgYml0WzFdOiAxLCBuZXZlciByZWxlYXNlIGNtYSBidWZmZXIgd2hlbiBzdG9wCitiaXRbMF06IDEsIHdoZW4gc3RvcCwgcmVsZWFzZSBjbWEgYnVmZmVyIGlmIGJsYWNrb3V0IGlzIDE7CitkbyBub3QgcmVsZWFzZSBjbWEgYnVmZmVyIGlzIGJsYWNrb3V0IGlzIG5vdCAxCisKK2JpdFsyXTogMCwgd2hlbiBzdGFydCBkZWNvZGluZywgY2hlY2sgY3VycmVudCBkaXNwbGF5ZWQgYnVmZmVyCisJIChvbmx5IGZvciBidWZmZXIgZGVjb2RlZCBieSB2cDkpIGlmIGJsYWNrb3V0IGlzIDAKKwkgMSwgZG8gbm90IGNoZWNrIGN1cnJlbnQgZGlzcGxheWVkIGJ1ZmZlcgorCitiaXRbM106IDEsIGlmIGJsYWNrb3V0IGlzIG5vdCAxLCBkbyBub3QgcmVsZWFzZSBjdXJyZW50CisJCQlkaXNwbGF5ZWQgY21hIGJ1ZmZlciBhbHdheXMuCisqLworLyogc2V0IHRvIDEgZm9yIGZhc3QgcGxheTsKKwlzZXQgdG8gOCBmb3Igb3RoZXIgY2FzZSBvZiAia2VlcCBsYXN0IGZyYW1lIgorKi8KK3N0YXRpYyB1MzIgYnVmZmVyX21vZGUgPSAxOworLyogYnVmZmVyX21vZGVfZGJnOiBkZWJ1ZyBvbmx5Ki8KK3N0YXRpYyB1MzIgYnVmZmVyX21vZGVfZGJnID0gMHhmZmZmMDAwMDsKKy8qKi8KKworLyoKK2JpdCAwLCAxOiBvbmx5IGRpc3BsYXkgSSBwaWN0dXJlOworYml0IDEsIDE6IG9ubHkgZGVjb2RlIEkgcGljdHVyZTsKKyovCitzdGF0aWMgdTMyIGlfb25seV9mbGFnOworCisKK3N0YXRpYyB1MzIgbWF4X2RlY29kaW5nX3RpbWU7CisvKgorZXJyb3IgaGFuZGxpbmcKKyovCisvKmVycm9yX2hhbmRsZV9wb2xpY3k6CitiaXQgMDogc2VhcmNoIHNlcSBhZ2FpbiBpZiBidWZmZXIgbWdyIGVycm9yIG9jY3VyCisJKGJ1ZmZlciBtZ3IgZXJyb3IgY291bnQgbmVlZCBiaWcgdGhhbgorCXJlX3NlYXJjaF9zZXFfdGhyZXNob2xkKQorYml0IDE6ICAxLCBkaXNwbGF5IGZyb20gSSBwaWN0dXJlOworCQkwLCBkaXNwbGF5IGZyb20gYW55IGNvcnJlY3QgcGljCisqLworCitzdGF0aWMgdTMyIGVycm9yX2hhbmRsZV9wb2xpY3kgPSAxOworLyoKK3JlX3NlYXJjaF9zZXFfdGhyZXNob2xkOgorCWJpdCA3fjA6IGJ1ZmZlciBtZ3IgZXJyb3IgcmVzZWFyY2ggc2VxIGNvdW50CisJYml0IDE1fjg6IGZyYW1lIGNvdW50IHRocmVzaG9sZAorKi8KK3N0YXRpYyB1MzIgcmVfc2VhcmNoX3NlcV90aHJlc2hvbGQgPSAweDgwMDsgLyoweDg7Ki8KKy8qc3RhdGljIHUzMiBwYXJzZXJfc2VpX2VuYWJsZSA9IDE7Ki8KKworc3RhdGljIHUzMiBtYXhfYnVmX251bSA9IChSRUZfQlVGRkVSICsgMSk7CisKK3N0YXRpYyB1MzIgcnVuX3JlYWR5X21pbl9idWZfbnVtID0gMjsKKworc3RhdGljIERFRklORV9NVVRFWCh2YXZzMl9tdXRleCk7CisKKyNkZWZpbmUgSEVWQ19ERUNfU1RBVFVTX1JFRyAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzAKKyNkZWZpbmUgSEVWQ19SUE1fQlVGRkVSICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzEKKyNkZWZpbmUgQVZTMl9BTEZfU1dBUF9CVUZGRVIgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzIKKyNkZWZpbmUgSEVWQ19SQ1NfQlVGRkVSICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzMKKyNkZWZpbmUgSEVWQ19TUFNfQlVGRkVSICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzQKKyNkZWZpbmUgSEVWQ19QUFNfQlVGRkVSICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzUKKy8vI2RlZmluZSBIRVZDX1NBT19VUCAgICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfNgorI2lmZGVmIEFWUzJfMTBCX01NVQorI2RlZmluZSBBVlMyX01NVV9NQVBfQlVGRkVSICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfNworI2Vsc2UKKyNkZWZpbmUgSEVWQ19TVFJFQU1fU1dBUF9CVUZGRVIgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzcKKyNlbmRpZgorI2RlZmluZSBIRVZDX1NUUkVBTV9TV0FQX0JVRkZFUjIgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfOAorLyoKKyNkZWZpbmUgVlA5X1BST0JfU1dBUF9CVUZGRVIgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzkKKyNkZWZpbmUgVlA5X0NPVU5UX1NXQVBfQlVGRkVSICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0EKKyNkZWZpbmUgVlA5X1NFR19NQVBfQlVGRkVSICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0IKKyovCisvLyNkZWZpbmUgSEVWQ19TQ0FMRUxVVCAgICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0QKKyNkZWZpbmUgQVZTMl9DVVZBX0FEUiAgICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0EKKyNkZWZpbmUgQVZTMl9DVVZBX0RBVEFfU0laRSAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0IKKworI2RlZmluZSBIRVZDX1dBSVRfRkxBRyAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfRQorI2RlZmluZSBSUE1fQ01EX1JFRyAgICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfRgorI2RlZmluZSBMTUVNX0RVTVBfQURSICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfOQorI2RlZmluZSBIRVZDX1NUUkVBTV9TV0FQX1RFU1QgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfTAorLyohISEqLworI2RlZmluZSBIRVZDX0RFQ09ERV9DT1VOVCAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX00KKyNkZWZpbmUgSEVWQ19ERUNPREVfU0laRQkJSEVWQ19BU1NJU1RfU0NSQVRDSF9OCisjZGVmaW5lIERFQlVHX1JFRzEgICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfRworI2RlZmluZSBERUJVR19SRUcyICAgICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0gKKworCisvKgordWNvZGUgcGFyc2VyL3NlYXJjaCBjb250cm9sCitiaXQgMDogIDAsIGhlYWRlciBhdXRvIHBhcnNlOyAxLCBoZWFkZXIgbWFudWFsIHBhcnNlCitiaXQgMTogIDAsIGF1dG8gc2tpcCBmb3Igbm9uZXNlYW1sZXNzIHN0cmVhbTsgMSwgbm8gc2tpcAorYml0IFszOjJdOiB2YWxpZCB3aGVuIGJpdDE9PTA7CiswLCBhdXRvIHNraXAgbmFsIGJlZm9yZSBmaXJzdCB2cHMvc3BzL3Bwcy9pZHI7CisxLCBhdXRvIHNraXAgbmFsIGJlZm9yZSBmaXJzdCB2cHMvc3BzL3BwcworMiwgYXV0byBza2lwIG5hbCBiZWZvcmUgZmlyc3QgIHZwcy9zcHMvcHBzLAorCWFuZCBub3QgZGVjb2RlIHVudGlsIHRoZSBmaXJzdCBJIHNsaWNlICh3aXRoIHNsaWNlIGFkZHJlc3Mgb2YgMCkKKworMywgYXV0byBza2lwIGJlZm9yZSBmaXJzdCBJIHNsaWNlIChuYWxfdHlwZSA+PTE2ICYmIG5hbF90eXBlPD0yMSkKK2JpdCBbMTU6NF0gbmFsIHNraXAgY291bnQgKHZhbGlkIHdoZW4gYml0MCA9PSAxIChtYW51YWwgbW9kZSkgKQorYml0IFsxNl06IGZvciBOQUxfVU5JVF9FT1Mgd2hlbiBiaXQwIGlzIDA6CisJMCwgc2VuZCBTRUFSQ0hfRE9ORSB0byBhcm0gOyAgMSwgZG8gbm90IHNlbmQgU0VBUkNIX0RPTkUgdG8gYXJtCitiaXQgWzE3XTogZm9yIE5BTF9TRUkgd2hlbiBiaXQwIGlzIDA6CisJMCwgZG8gbm90IHBhcnNlIFNFSSBpbiB1Y29kZTsgMSwgcGFyc2UgU0VJIGluIHVjb2RlCitiaXQgWzMxOjIwXTogdXNlZCBieSB1Y29kZSBmb3IgZGVidWcgcHVycG9zZQorKi8KKyNkZWZpbmUgTkFMX1NFQVJDSF9DVEwgICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0kKKwkvKkRFQ09ERV9NT0RFOiBzZXQgYmVmb3JlIHN0YXJ0IGRlY29kZXIKKwkJYml0IDd+MDogZGVjb2RlIG1vZGUKKwkJYml0IDIzfjE2OiBzdGFydF9kZWNvZGluZ19mbGFnCisJCQliaXQgWzBdICAgLSBTRVFfcmVhZHkKKwkJCWJpdCBbMjoxXSAtIEkgUGljdHVyZSBDb3VudAorCQliaXQgMzF+MjQ6IGNoaXAgZmVhdHVyZQorCSovCisjZGVmaW5lIERFQ09ERV9NT0RFICAgICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0oKKyNkZWZpbmUgREVDT0RFX1NUT1BfUE9TICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9LCisJLypyZWFkIG9ubHkqLworI2RlZmluZSBDVVJfTkFMX1VOSVRfVFlQRSAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0oKKworI2RlZmluZSBSUE1fQlVGX1NJWkUgKDB4NjAwICogMikKKyNkZWZpbmUgTE1FTV9CVUZfU0laRSAoMHg2MDAgKiAyKQorCisJLyptbXVfdmJoIGJ1ZiBpcyB1c2VkIGJ5IEhFVkNfU0FPX01NVV9WSDBfQUREUiwgSEVWQ19TQU9fTU1VX1ZIMV9BRERSKi8KKyNkZWZpbmUgVkJIX0JVRl9TSVpFXzEwODBQIDB4MzAwMAorI2RlZmluZSBWQkhfQlVGX1NJWkVfNEsgMHg1MDAwCisjZGVmaW5lIFZCSF9CVUZfU0laRV84SyAweGEwMDAKKyNkZWZpbmUgVkJIX0JVRl9TSVpFKGJ1ZnNwZWMpIChidWZzcGVjLT5tbXVfdmJoLmJ1Zl9zaXplIC8gMikKKwkvKm1tdV92YmhfZHcgYnVmIGlzIHVzZWQgYnkgSEVWQ19TQU9fTU1VX1ZIMF9BRERSMixIRVZDX1NBT19NTVVfVkgxX0FERFIyLAorCQlIRVZDX0RXX1ZIMF9BREREUiwgSEVWQ19EV19WSDFfQURERFIqLworI2RlZmluZSBEV19WQkhfQlVGX1NJWkVfMTA4MFAgKFZCSF9CVUZfU0laRV8xMDgwUCAqIDIpCisjZGVmaW5lIERXX1ZCSF9CVUZfU0laRV80SyAoVkJIX0JVRl9TSVpFXzRLICogMikKKyNkZWZpbmUgRFdfVkJIX0JVRl9TSVpFXzhLIChWQkhfQlVGX1NJWkVfOEsgKiAyKQorI2RlZmluZSBEV19WQkhfQlVGX1NJWkUoYnVmc3BlYykgKGJ1ZnNwZWMtPm1tdV92YmhfZHcuYnVmX3NpemUgLyA0KQorCisvKiBuZWNlc3NhcnkgNEsgcGFnZSBzaXplIGFsaWduIGZvciB0Ny90MyBkZWNvZGVyIGFuZCBhZnRlciAqLworI2RlZmluZSBXT1JLQlVGX0FMSUdOKGFkZHIpIChBTElHTihhZGRyLCBQQUdFX1NJWkUpKQorCisjZGVmaW5lIFdPUktfQlVGX1NQRUNfTlVNIDYKK3N0YXRpYyBzdHJ1Y3QgQnVmZkluZm9fcyBhbXZhdnMyX3dvcmtidWZmX3NwZWNbV09SS19CVUZfU1BFQ19OVU1dID0geworCXsKKwkJLyogOE0gYnl0ZXMgKi8KKwkJLm1heF93aWR0aCA9IDE5MjAsCisJCS5tYXhfaGVpZ2h0ID0gMTA4OCwKKwkJLmlwcCA9IHsKKwkJCS8qIElQUCB3b3JrIHNwYWNlIGNhbGN1bGF0aW9uIDoKKwkJCSAgIDQwOTYgKiAoWStDYkNyK0ZsYWdzKSA9IDEyaywgcm91bmQgdG8gMTZrICovCisJCQkuYnVmX3NpemUgPSAweDQwMDAsCisJCX0sCisJCS5zYW9fYWJ2ID0geworCQkJLmJ1Zl9zaXplID0gMHgzMDAwMCwKKwkJfSwKKwkJLnNhb192YiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MzAwMDAsCisJCX0sCisJCS5zaG9ydF90ZXJtX3JwcyA9IHsKKwkJCS8qIFNIT1JUX1RFUk1fUlBTIC0gTWF4IDY0IHNldCwgMTYgZW50cnkgZXZlcnkgc2V0LAorCQkJICAgdG90YWwgNjR4MTZ4MiA9IDIwNDggYnl0ZXMgKDB4ODAwKSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5yY3MgPSB7CisJCQkvKiBSQ1MgU1RPUkUgQVJFQSAtIE1heCAzMiBSQ1MsIGVhY2ggaGFzIDMyIGJ5dGVzLAorCQkJCXRvdGFsIDB4MDQwMCBieXRlcyAqLworCQkJLmJ1Zl9zaXplID0gMHg0MDAsCisJCX0sCisJCS5zcHMgPSB7CisJCQkvKiBTUFMgU1RPUkUgQVJFQSAtIE1heCAxNiBTUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsCisJCQl0b3RhbCAweDA4MDAgYnl0ZXMqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5wcHMgPSB7CisJCQkvKlBQUyBTVE9SRSBBUkVBIC0gTWF4IDY0IFBQUywgZWFjaCBoYXMgMHg4MCBieXRlcywKKwkJCXRvdGFsIDB4MjAwMCBieXRlcyovCisJCQkuYnVmX3NpemUgPSAweDIwMDAsCisJCX0sCisJCS5zYW9fdXAgPSB7CisJCQkvKiBTQU8gVVAgU1RPUkUgQVJFQSAtIE1heCA2NDAoMTAyNDAvMTYpIExDVSwKKwkJCSAgIGVhY2ggaGFzIDE2IGJ5dGVzIHRvdGFsIDB4MjgwMCBieXRlcyAqLworCQkJLmJ1Zl9zaXplID0gMHgyODAwLAorCQl9LAorCQkuc3dhcF9idWYgPSB7CisJCQkvKiAyNTZjeWNsZXg2NGJpdCA9IDJLIGJ5dGVzIDB4ODAwCisJCQkgICAob25seSAxNDQgY3ljbGVzIHZhbGlkKSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zd2FwX2J1ZjIgPSB7CisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNjYWxlbHV0ID0geworCQkJLyogc3VwcG9ydCB1cCB0byAzMiBTQ0FMRUxVVCAxMDI0eDMyID0KKwkJCSAgIDMyS2J5dGVzICgweDgwMDApICovCisJCQkuYnVmX3NpemUgPSAweDgwMDAsCisJCX0sCisJCS5kYmxrX3BhcmEgPSB7CisJCQkvKiBEQkxLIC0+IE1heCAyNTYoNDA5Ni8xNikgTENVLAorCQkJZWFjaCBwYXJhIDEwMjRieXRlcyh0b3RhbDoweDQwMDAwKSwKKwkJCWRhdGEgMTAyNGJ5dGVzKHRvdGFsOjB4NDAwMDApKi8KKwkJCS5idWZfc2l6ZSA9IDB4NDAwMDAsCisJCX0sCisJCS5kYmxrX2RhdGEgPSB7CisJCQkuYnVmX3NpemUgPSAweDQwMDAwLAorCQl9LAorCQkuZGJsa19kYXRhMiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4NDAwMDAsCisJCX0sCisjaWZkZWYgQVZTMl8xMEJfTU1VCisJCS5tbXVfdmJoID0geworCQkJLmJ1Zl9zaXplID0gMHg1MDAwLCAvKjIqMTYqKG1vcmUgdGhhbiAyMzA0KS80LCA0SyovCisJCX0sCisjaWYgMAorCQkuY21faGVhZGVyID0geworCQkJLyphZGQgb25lIGZvciBrZWVwZXIuKi8KKwkJCS5idWZfc2l6ZSA9IE1NVV9DT01QUkVTU19IRUFERVJfU0laRSAqCisJCQkJCQkoRlJBTUVfQlVGRkVSUyArIDEpLAorCQkJLyogMHg0NDAwMCA9ICgoMTA4OCoyKjEwMjQqNCkvMzIvNCkqKDMyLzgpICovCisJCX0sCisjZW5kaWYKKyNlbmRpZgorCQkubXByZWRfYWJvdmUgPSB7CisJCQkuYnVmX3NpemUgPSAweDgwMDAsIC8qIDIgKiBzaXplIG9mIGhldmMqLworCQl9LAorI2lmZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwkJLm1wcmVkX212ID0gey8qIDEwODBwLCAweDQwMDAwIHBlciBidWZmZXIgKi8KKwkJCS5idWZfc2l6ZSA9IDB4NDAwMDAgKiBGUkFNRV9CVUZGRVJTLAorCQl9LAorI2VuZGlmCisJCS5ycG0gPSB7CisJCQkuYnVmX3NpemUgPSBSUE1fQlVGX1NJWkUsCisJCX0sCisJCS5sbWVtID0geworCQkJLmJ1Zl9zaXplID0gMHg0MDAgKiAyLAorCQl9CisJfSwKKwl7CisJCS5tYXhfd2lkdGggPSA0MDk2LAorCQkubWF4X2hlaWdodCA9IDIzMDQsCisJCS5pcHAgPSB7CisJCQkvKiBJUFAgd29yayBzcGFjZSBjYWxjdWxhdGlvbiA6CisJCQkgICA0MDk2ICogKFkrQ2JDcitGbGFncykgPSAxMmssIHJvdW5kIHRvIDE2ayAqLworCQkJLmJ1Zl9zaXplID0gMHg0MDAwLAorCQl9LAorCQkuc2FvX2FidiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MzAwMDAsCisJCX0sCisJCS5zYW9fdmIgPSB7CisJCQkuYnVmX3NpemUgPSAweDMwMDAwLAorCQl9LAorCQkuc2hvcnRfdGVybV9ycHMgPSB7CisJCQkvKiBTSE9SVF9URVJNX1JQUyAtIE1heCA2NCBzZXQsIDE2IGVudHJ5IGV2ZXJ5IHNldCwKKwkJCSAgIHRvdGFsIDY0eDE2eDIgPSAyMDQ4IGJ5dGVzICgweDgwMCkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkucmNzID0geworCQkJLyogUkNTIFNUT1JFIEFSRUEgLSBNYXggMTYgUkNTLCBlYWNoIGhhcyAzMiBieXRlcywKKwkJCXRvdGFsIDB4MDQwMCBieXRlcyAqLworCQkJLmJ1Zl9zaXplID0gMHg0MDAsCisJCX0sCisJCS5zcHMgPSB7CisJCQkvKiBTUFMgU1RPUkUgQVJFQSAtIE1heCAxNiBTUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsCisJCQkgICB0b3RhbCAweDA4MDAgYnl0ZXMgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkucHBzID0geworCQkJLyogUFBTIFNUT1JFIEFSRUEgLSBNYXggNjQgUFBTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLAorCQkJICAgdG90YWwgMHgyMDAwIGJ5dGVzICovCisJCQkuYnVmX3NpemUgPSAweDIwMDAsCisJCX0sCisJCS5zYW9fdXAgPSB7CisJCQkvKiBTQU8gVVAgU1RPUkUgQVJFQSAtIE1heCA2NDAoMTAyNDAvMTYpIExDVSwKKwkJCSAgIGVhY2ggaGFzIDE2IGJ5dGVzIHRvdGFsIDB4MjgwMCBieXRlcyAqLworCQkJLmJ1Zl9zaXplID0gMHgyODAwLAorCQl9LAorCQkuc3dhcF9idWYgPSB7CisJCQkvKiAyNTZjeWNsZXg2NGJpdCA9IDJLIGJ5dGVzIDB4ODAwCisJCQkgICAob25seSAxNDQgY3ljbGVzIHZhbGlkKSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zd2FwX2J1ZjIgPSB7CisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNjYWxlbHV0ID0geworCQkJLyogc3VwcG9ydCB1cCB0byAzMiBTQ0FMRUxVVCAxMDI0eDMyID0gMzJLYnl0ZXMKKwkJCSAgICgweDgwMDApICovCisJCQkuYnVmX3NpemUgPSAweDgwMDAsCisJCX0sCisJCS5kYmxrX3BhcmEgPSB7CisJCQkvKiBEQkxLIC0+IE1heCAyNTYoNDA5Ni8xNikgTENVLAorCQkJZWFjaCBwYXJhIDEwMjRieXRlcyh0b3RhbDoweDQwMDAwKSwKKwkJCWRhdGEgMTAyNGJ5dGVzKHRvdGFsOjB4NDAwMDApKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwMDAsCisJCX0sCisJCS5kYmxrX2RhdGEgPSB7CisJCQkvKkRCTEsgLT4gTWF4IDI1Nig0MDk2LzE2KSBMQ1UsCisJCQllYWNoIHBhcmEgMTAyNGJ5dGVzKHRvdGFsOjB4NDAwMDApLAorCQkJZGF0YSAxMDI0Ynl0ZXModG90YWw6MHg0MDAwMCkqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAwMCwKKwkJfSwKKwkJLmRibGtfZGF0YTIgPSB7CisJCQkuYnVmX3NpemUgPSAweDgwMDAwLAorCQl9LAorI2lmZGVmIEFWUzJfMTBCX01NVQorCQkubW11X3ZiaCA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4NTAwMCwvKjIqMTYqKG1vcmUgdGhhbiAyMzA0KS80LCA0SyovCisJCX0sCisjaWYgMAorCQkuY21faGVhZGVyID0geworCQkJLyphZGQgb25lIGZvciBrZWVwZXIuKi8KKwkJCS5idWZfc2l6ZSA9IE1NVV9DT01QUkVTU19IRUFERVJfU0laRSAqCisJCQkJCQkoRlJBTUVfQlVGRkVSUyArIDEpLAorCQkJLyogMHg0NDAwMCA9ICgoMTA4OCoyKjEwMjQqNCkvMzIvNCkqKDMyLzgpICovCisJCX0sCisjZW5kaWYKKyNlbmRpZgorCQkubXByZWRfYWJvdmUgPSB7CisJCQkuYnVmX3NpemUgPSAweDEwMDAwLCAvKiAyICogc2l6ZSBvZiBoZXZjKi8KKwkJfSwKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJCS5tcHJlZF9tdiA9IHsKKwkJCS8qIC5idWZfc2l6ZSA9IDB4MTAwMDAwKjE2LAorCQkJLy80azJrICwgMHgxMDAwMDAgcGVyIGJ1ZmZlciAqLworCQkJLyogNDA5NngyMzA0ICwgMHgxMjAwMDAgcGVyIGJ1ZmZlciAqLworCQkJLmJ1Zl9zaXplID0gMHgxMjAwMDAgKiBGUkFNRV9CVUZGRVJTLAorCQl9LAorI2VuZGlmCisJCS5ycG0gPSB7CisJCQkuYnVmX3NpemUgPSBSUE1fQlVGX1NJWkUsCisJCX0sCisJCS5sbWVtID0geworCQkJLmJ1Zl9zaXplID0gMHg0MDAgKiAyLAorCQl9CisJfSwKKwl7CisJCS5tYXhfd2lkdGggPSA0MDk2ICogMiwKKwkJLm1heF9oZWlnaHQgPSAyMzA0ICogMiwKKwkJLmlwcCA9IHsKKwkJLypJUFAgd29yayBzcGFjZSBjYWxjdWxhdGlvbiA6IDQwOTYgKiAoWStDYkNyK0ZsYWdzKSA9IDEyaywKKwkJcm91bmQgdG8gMTZrKi8KKwkJCS5idWZfc2l6ZSA9IDB4NDAwMCAqIDIsCisJCX0sCisJCS5zYW9fYWJ2ID0geworCQkJLmJ1Zl9zaXplID0gMHgzMDAwMCAqIDIsCisJCX0sCisJCS5zYW9fdmIgPSB7CisJCQkuYnVmX3NpemUgPSAweDMwMDAwICogMiwKKwkJfSwKKwkJLnNob3J0X3Rlcm1fcnBzID0geworCQkvKlNIT1JUX1RFUk1fUlBTIC0gTWF4IDY0IHNldCwgMTYgZW50cnkgZXZlcnkgc2V0LAorCQkJdG90YWwgNjR4MTZ4MiA9IDIwNDggYnl0ZXMgKDB4ODAwKSovCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnJjcyA9IHsKKwkJLypSQ1MgU1RPUkUgQVJFQSAtIE1heCAxNiBSQ1MsIGVhY2ggaGFzIDMyIGJ5dGVzLAorCQl0b3RhbCAweDA0MDAgYnl0ZXMqLworCQkJLmJ1Zl9zaXplID0gMHg0MDAsCisJCX0sCisJCS5zcHMgPSB7CisJCS8qU1BTIFNUT1JFIEFSRUEgLSBNYXggMTYgU1BTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLAorCQkJdG90YWwgMHgwODAwIGJ5dGVzKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkucHBzID0geworCQkvKlBQUyBTVE9SRSBBUkVBIC0gTWF4IDY0IFBQUywgZWFjaCBoYXMgMHg4MCBieXRlcywgdG90YWwKKwkJCTB4MjAwMCBieXRlcyovCisJCQkuYnVmX3NpemUgPSAweDIwMDAsCisJCX0sCisJCS5zYW9fdXAgPSB7CisJCS8qU0FPIFVQIFNUT1JFIEFSRUEgLSBNYXggNjQwKDEwMjQwLzE2KSBMQ1UsIGVhY2ggaGFzIDE2IGJ5dGVzIGkKKwkJCQl0b3RhbCAweDI4MDAgYnl0ZXMqLworCQkJLmJ1Zl9zaXplID0gMHgyODAwICogMiwKKwkJfSwKKwkJLnN3YXBfYnVmID0geworCQkvKjI1NmN5Y2xleDY0Yml0ID0gMksgYnl0ZXMgMHg4MDAgKG9ubHkgMTQ0IGN5Y2xlcyB2YWxpZCkqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zd2FwX2J1ZjIgPSB7CisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNjYWxlbHV0ID0geworCQkvKnN1cHBvcnQgdXAgdG8gMzIgU0NBTEVMVVQgMTAyNHgzMiA9IDMyS2J5dGVzICgweDgwMDApKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwMCAqIDIsCisJCX0sCisJCS5kYmxrX3BhcmEgID0geworCQkJLmJ1Zl9zaXplID0gMHg0MDAwMCAqIDIsCisJCX0sCisJCS5kYmxrX2RhdGEgID0geworCQkJLmJ1Zl9zaXplID0gMHg4MDAwMCAqIDIsCisJCX0sCisJCS5kYmxrX2RhdGEyID0geworCQkJLmJ1Zl9zaXplID0gMHg4MDAwMCAqIDIsCisJCX0sCisjaWZkZWYgQVZTMl8xMEJfTU1VCisJCS5tbXVfdmJoID0geworCQkgIC5idWZfc2l6ZSA9IDB4NTAwMCAqIDIsIC8qMioxNioyMzA0LzQsIDRLKi8KKwkJfSwKKyNpZiAwCisJCS5jbV9oZWFkZXIgPSB7CisJCQkvKjB4NDQwMDAgPSAoKDEwODgqMioxMDI0KjQpLzMyLzQpKigzMi84KSovCisJCQkuYnVmX3NpemUgPSBNTVVfQ09NUFJFU1NfOEtfSEVBREVSX1NJWkUgKiAxNywKKwkJfSwKKyNlbmRpZgorI2VuZGlmCisJCS5tcHJlZF9hYm92ZSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4ODAwMCAqIDIsCisJCX0sCisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCQkubXByZWRfbXYgPSB7CisJCQkvKjRrMmsgLCAweDEwMDAwMCBwZXIgYnVmZmVyKi8KKwkJCS5idWZfc2l6ZSA9IDB4MTIwMDAwICogRlJBTUVfQlVGRkVSUyAqIDQsCisJCX0sCisjZW5kaWYKKwkJLnJwbSA9IHsKKwkJCS5idWZfc2l6ZSA9IFJQTV9CVUZfU0laRSwKKwkJfSwKKwkJLmxtZW0gPSB7CisJCQkuYnVmX3NpemUgPSAweDQwMCAqIDIsCisJCX0KKwl9LAorCXsKKwkJLyogOE0gYnl0ZXMgKi8KKwkJLm1heF93aWR0aCA9IDE5MjAsCisJCS5tYXhfaGVpZ2h0ID0gMTA4OCwKKwkJLmlwcCA9IHsKKwkJCS8qIElQUCB3b3JrIHNwYWNlIGNhbGN1bGF0aW9uIDoKKwkJCSAgIDQwOTYgKiAoWStDYkNyK0ZsYWdzKSA9IDEyaywgcm91bmQgdG8gMTZrICovCisJCQkuYnVmX3NpemUgPSAweDFlMDAsCisJCX0sCisJCS5zYW9fYWJ2ID0geworCQkJLmJ1Zl9zaXplID0gMCwKKwkJfSwKKwkJLnNhb192YiA9IHsKKwkJCS5idWZfc2l6ZSA9IDAsCisJCX0sCisJCS5zaG9ydF90ZXJtX3JwcyA9IHsKKwkJCS8qIFNIT1JUX1RFUk1fUlBTIC0gTWF4IDY0IHNldCwgMTYgZW50cnkgZXZlcnkgc2V0LAorCQkJICAgdG90YWwgNjR4MTZ4MiA9IDIwNDggYnl0ZXMgKDB4ODAwKSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5yY3MgPSB7CisJCQkvKiBSQ1MgU1RPUkUgQVJFQSAtIE1heCAzMiBSQ1MsIGVhY2ggaGFzIDMyIGJ5dGVzLAorCQkJCXRvdGFsIDB4MDQwMCBieXRlcyAqLworCQkJLmJ1Zl9zaXplID0gMHg0MDAsCisJCX0sCisJCS5zcHMgPSB7CisJCQkvKiBTUFMgU1RPUkUgQVJFQSAtIE1heCAxNiBTUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsCisJCQl0b3RhbCAweDA4MDAgYnl0ZXMqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5wcHMgPSB7CisJCQkvKlBQUyBTVE9SRSBBUkVBIC0gTWF4IDY0IFBQUywgZWFjaCBoYXMgMHg4MCBieXRlcywKKwkJCXRvdGFsIDB4MjAwMCBieXRlcyovCisJCQkuYnVmX3NpemUgPSAweDIwMDAsCisJCX0sCisJCS5zYW9fdXAgPSB7CisJCQkvKiBTQU8gVVAgU1RPUkUgQVJFQSAtIE1heCA2NDAoMTAyNDAvMTYpIExDVSwKKwkJCSAgIGVhY2ggaGFzIDE2IGJ5dGVzIHRvdGFsIDB4MjgwMCBieXRlcyAqLworCQkJLmJ1Zl9zaXplID0gMHgyODAwLAorCQl9LAorCQkuc3dhcF9idWYgPSB7CisJCQkvKiAyNTZjeWNsZXg2NGJpdCA9IDJLIGJ5dGVzIDB4ODAwCisJCQkgICAob25seSAxNDQgY3ljbGVzIHZhbGlkKSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zd2FwX2J1ZjIgPSB7CisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNjYWxlbHV0ID0geworCQkJLyogc3VwcG9ydCB1cCB0byAzMiBTQ0FMRUxVVCAxMDI0eDMyID0KKwkJCSAgIDMyS2J5dGVzICgweDgwMDApICovCisJCQkuYnVmX3NpemUgPSAwLAorCQl9LAorCQkuZGJsa19wYXJhID0geworCQkJLyogREJMSyAtPiBNYXggMjU2KDQwOTYvMTYpIExDVSwKKwkJCWVhY2ggcGFyYSAxMDI0Ynl0ZXModG90YWw6MHg0MDAwMCksCisJCQlkYXRhIDEwMjRieXRlcyh0b3RhbDoweDQwMDAwKSovCisJCQkuYnVmX3NpemUgPSAweDNkMDAsIC8vMHgzYzgwLAorCQl9LAorCQkuZGJsa19kYXRhID0geworCQkJLmJ1Zl9zaXplID0gMHg2MjgwMCwKKwkJfSwKKwkJLmRibGtfZGF0YTIgPSB7CisJCQkuYnVmX3NpemUgPSAweDYyODAwLAorCQl9LAorI2lmZGVmIEFWUzJfMTBCX01NVQorCQkubW11X3ZiaCA9IHsKKwkJCS5idWZfc2l6ZSA9IFZCSF9CVUZfU0laRV8xMDgwUCwgLyoyKjE2Kihtb3JlIHRoYW4gMjMwNCkvNCwgNEsqLworCQl9LAorI2lmIDAKKwkJLmNtX2hlYWRlciA9IHsKKwkJCS8qYWRkIG9uZSBmb3Iga2VlcGVyLiovCisJCQkuYnVmX3NpemUgPSBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkUgKgorCQkJCQkJKEZSQU1FX0JVRkZFUlMgKyAxKSwKKwkJCS8qIDB4NDQwMDAgPSAoKDEwODgqMioxMDI0KjQpLzMyLzQpKigzMi84KSAqLworCQl9LAorI2VuZGlmCisjZW5kaWYKKwkJLm1wcmVkX2Fib3ZlID0geworCQkJLmJ1Zl9zaXplID0gMHgxZTAwLCAvKiAyICogc2l6ZSBvZiBoZXZjKi8KKwkJfSwKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJCS5tcHJlZF9tdiA9IHsvKiAxMDgwcCwgMHg0MDAwMCBwZXIgYnVmZmVyICovCisJCQkuYnVmX3NpemUgPSBDT19NVl9CVUZfU0laRV8xMDgwUCAqIEZSQU1FX0JVRkZFUlMsCisJCX0sCisjZW5kaWYKKwkJLnJwbSA9IHsKKwkJCS5idWZfc2l6ZSA9IFJQTV9CVUZfU0laRSwKKwkJfSwKKwkJLmxtZW0gPSB7CisJCQkuYnVmX3NpemUgPSAweDQwMCAqIDIsCisJCX0KKwl9LAorCXsKKwkJLm1heF93aWR0aCA9IDQwOTYsCisJCS5tYXhfaGVpZ2h0ID0gMjMwNCwKKwkJLmlwcCA9IHsKKwkJCS8qIElQUCB3b3JrIHNwYWNlIGNhbGN1bGF0aW9uIDoKKwkJCSAgIDQwOTYgKiAoWStDYkNyK0ZsYWdzKSA9IDEyaywgcm91bmQgdG8gMTZrICovCisJCQkuYnVmX3NpemUgPSAweDQwMDAsCisJCX0sCisJCS5zYW9fYWJ2ID0geworCQkJLmJ1Zl9zaXplID0gMCwKKwkJfSwKKwkJLnNhb192YiA9IHsKKwkJCS5idWZfc2l6ZSA9IDAsCisJCX0sCisJCS5zaG9ydF90ZXJtX3JwcyA9IHsKKwkJCS8qIFNIT1JUX1RFUk1fUlBTIC0gTWF4IDY0IHNldCwgMTYgZW50cnkgZXZlcnkgc2V0LAorCQkJICAgdG90YWwgNjR4MTZ4MiA9IDIwNDggYnl0ZXMgKDB4ODAwKSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5yY3MgPSB7CisJCQkvKiBSQ1MgU1RPUkUgQVJFQSAtIE1heCAxNiBSQ1MsIGVhY2ggaGFzIDMyIGJ5dGVzLAorCQkJdG90YWwgMHgwNDAwIGJ5dGVzICovCisJCQkuYnVmX3NpemUgPSAweDQwMCwKKwkJfSwKKwkJLnNwcyA9IHsKKwkJCS8qIFNQUyBTVE9SRSBBUkVBIC0gTWF4IDE2IFNQUywgZWFjaCBoYXMgMHg4MCBieXRlcywKKwkJCSAgIHRvdGFsIDB4MDgwMCBieXRlcyAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5wcHMgPSB7CisJCQkvKiBQUFMgU1RPUkUgQVJFQSAtIE1heCA2NCBQUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsCisJCQkgICB0b3RhbCAweDIwMDAgYnl0ZXMgKi8KKwkJCS5idWZfc2l6ZSA9IDB4MjAwMCwKKwkJfSwKKwkJLnNhb191cCA9IHsKKwkJCS8qIFNBTyBVUCBTVE9SRSBBUkVBIC0gTWF4IDY0MCgxMDI0MC8xNikgTENVLAorCQkJICAgZWFjaCBoYXMgMTYgYnl0ZXMgdG90YWwgMHgyODAwIGJ5dGVzICovCisJCQkuYnVmX3NpemUgPSAwLAorCQl9LAorCQkuc3dhcF9idWYgPSB7CisJCQkvKiAyNTZjeWNsZXg2NGJpdCA9IDJLIGJ5dGVzIDB4ODAwCisJCQkgICAob25seSAxNDQgY3ljbGVzIHZhbGlkKSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zd2FwX2J1ZjIgPSB7CisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNjYWxlbHV0ID0geworCQkJLyogc3VwcG9ydCB1cCB0byAzMiBTQ0FMRUxVVCAxMDI0eDMyID0gMzJLYnl0ZXMKKwkJCSAgICgweDgwMDApICovCisJCQkuYnVmX3NpemUgPSAwLAorCQl9LAorCQkuZGJsa19wYXJhID0geworCQkJLyogREJMSyAtPiBNYXggMjU2KDQwOTYvMTYpIExDVSwKKwkJCWVhY2ggcGFyYSAxMDI0Ynl0ZXModG90YWw6MHg0MDAwMCksCisJCQlkYXRhIDEwMjRieXRlcyh0b3RhbDoweDQwMDAwKSovCisJCQkuYnVmX3NpemUgPSAweDgxMDAsIC8vMHg4MDgwLAorCQl9LAorCQkuZGJsa19kYXRhID0geworCQkJLypEQkxLIC0+IE1heCAyNTYoNDA5Ni8xNikgTENVLAorCQkJZWFjaCBwYXJhIDEwMjRieXRlcyh0b3RhbDoweDQwMDAwKSwKKwkJCWRhdGEgMTAyNGJ5dGVzKHRvdGFsOjB4NDAwMDApKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODg4MDAsCisJCX0sCisJCS5kYmxrX2RhdGEyID0geworCQkJLmJ1Zl9zaXplID0gMHg4ODgwMCwKKwkJfSwKKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwkJLm1tdV92YmggPSB7CisJCQkuYnVmX3NpemUgPSBWQkhfQlVGX1NJWkVfNEssLyoyKjE2Kihtb3JlIHRoYW4gMjMwNCkvNCwgNEsqLworCQl9LAorI2lmIDAKKwkJLmNtX2hlYWRlciA9IHsKKwkJCS8qYWRkIG9uZSBmb3Iga2VlcGVyLiovCisJCQkuYnVmX3NpemUgPSBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkUgKgorCQkJCQkJKEZSQU1FX0JVRkZFUlMgKyAxKSwKKwkJCS8qIDB4NDQwMDAgPSAoKDEwODgqMioxMDI0KjQpLzMyLzQpKigzMi84KSAqLworCQl9LAorI2VuZGlmCisjZW5kaWYKKwkJLm1wcmVkX2Fib3ZlID0geworCQkJLmJ1Zl9zaXplID0gMHg0MDAwLCAvKiAyICogc2l6ZSBvZiBoZXZjKi8KKwkJfSwKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJCS5tcHJlZF9tdiA9IHsKKwkJCS8qIC5idWZfc2l6ZSA9IDB4MTAwMDAwKjE2LAorCQkJLy80azJrICwgMHgxMDAwMDAgcGVyIGJ1ZmZlciAqLworCQkJLyogNDA5NngyMzA0ICwgMHgxMjAwMDAgcGVyIGJ1ZmZlciAqLworCQkJLmJ1Zl9zaXplID0gQ09fTVZfQlVGX1NJWkVfNEsgKiBGUkFNRV9CVUZGRVJTLAorCQl9LAorI2VuZGlmCisJCS5ycG0gPSB7CisJCQkuYnVmX3NpemUgPSBSUE1fQlVGX1NJWkUsCisJCX0sCisJCS5sbWVtID0geworCQkJLmJ1Zl9zaXplID0gMHg0MDAgKiAyLAorCQl9CisJfSwKKwl7CisJCS5tYXhfd2lkdGggPSA0MDk2ICogMiwKKwkJLm1heF9oZWlnaHQgPSAyMzA0ICogMiwKKwkJLmlwcCA9IHsKKwkJLypJUFAgd29yayBzcGFjZSBjYWxjdWxhdGlvbiA6IDQwOTYgKiAoWStDYkNyK0ZsYWdzKSA9IDEyaywKKwkJcm91bmQgdG8gMTZrKi8KKwkJCS5idWZfc2l6ZSA9IDB4NDAwMCAqIDIsCisJCX0sCisJCS5zYW9fYWJ2ID0geworCQkJLmJ1Zl9zaXplID0gMCwKKwkJfSwKKwkJLnNhb192YiA9IHsKKwkJCS5idWZfc2l6ZSA9IDAsCisJCX0sCisJCS5zaG9ydF90ZXJtX3JwcyA9IHsKKwkJLypTSE9SVF9URVJNX1JQUyAtIE1heCA2NCBzZXQsIDE2IGVudHJ5IGV2ZXJ5IHNldCwKKwkJCXRvdGFsIDY0eDE2eDIgPSAyMDQ4IGJ5dGVzICgweDgwMCkqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5yY3MgPSB7CisJCS8qUkNTIFNUT1JFIEFSRUEgLSBNYXggMTYgUkNTLCBlYWNoIGhhcyAzMiBieXRlcywKKwkJdG90YWwgMHgwNDAwIGJ5dGVzKi8KKwkJCS5idWZfc2l6ZSA9IDB4NDAwLAorCQl9LAorCQkuc3BzID0geworCQkvKlNQUyBTVE9SRSBBUkVBIC0gTWF4IDE2IFNQUywgZWFjaCBoYXMgMHg4MCBieXRlcywKKwkJCXRvdGFsIDB4MDgwMCBieXRlcyovCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnBwcyA9IHsKKwkJLypQUFMgU1RPUkUgQVJFQSAtIE1heCA2NCBQUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsIHRvdGFsCisJCQkweDIwMDAgYnl0ZXMqLworCQkJLmJ1Zl9zaXplID0gMHgyMDAwLAorCQl9LAorCQkuc2FvX3VwID0geworCQkvKlNBTyBVUCBTVE9SRSBBUkVBIC0gTWF4IDY0MCgxMDI0MC8xNikgTENVLCBlYWNoIGhhcyAxNiBieXRlcyBpCisJCQkJdG90YWwgMHgyODAwIGJ5dGVzKi8KKwkJCS5idWZfc2l6ZSA9IDAsCisJCX0sCisJCS5zd2FwX2J1ZiA9IHsKKwkJLyoyNTZjeWNsZXg2NGJpdCA9IDJLIGJ5dGVzIDB4ODAwIChvbmx5IDE0NCBjeWNsZXMgdmFsaWQpKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc3dhcF9idWYyID0geworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zY2FsZWx1dCA9IHsKKwkJLypzdXBwb3J0IHVwIHRvIDMyIFNDQUxFTFVUIDEwMjR4MzIgPSAzMktieXRlcyAoMHg4MDAwKSovCisJCQkuYnVmX3NpemUgPSAwLAorCQl9LAorCQkuZGJsa19wYXJhICA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MTAxMDAsIC8vMHgxMDA4MCwKKwkJfSwKKwkJLmRibGtfZGF0YSAgPSB7CisJCQkuYnVmX3NpemUgPSAweDExMDgwMCwKKwkJfSwKKwkJLmRibGtfZGF0YTIgPSB7CisJCQkuYnVmX3NpemUgPSAweDExMDgwMCwKKwkJfSwKKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwkJLm1tdV92YmggPSB7CisJCSAgLmJ1Zl9zaXplID0gVkJIX0JVRl9TSVpFXzhLLCAvKjIqMTYqMjMwNC80LCA0SyovCisJCX0sCisjaWYgMAorCQkuY21faGVhZGVyID0geworCQkJLyoweDQ0MDAwID0gKCgxMDg4KjIqMTAyNCo0KS8zMi80KSooMzIvOCkqLworCQkJLmJ1Zl9zaXplID0gTU1VX0NPTVBSRVNTXzhLX0hFQURFUl9TSVpFICogMTcsCisJCX0sCisjZW5kaWYKKyNlbmRpZgorCQkubXByZWRfYWJvdmUgPSB7CisJCQkuYnVmX3NpemUgPSAweDgwMDAsCisJCX0sCisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCQkubXByZWRfbXYgPSB7CisJCQkvKjRrMmsgLCAweDEwMDAwMCBwZXIgYnVmZmVyKi8KKwkJCS5idWZfc2l6ZSA9IENPX01WX0JVRl9TSVpFXzhLICogRlJBTUVfQlVGRkVSUywKKwkJfSwKKyNlbmRpZgorCQkucnBtID0geworCQkJLmJ1Zl9zaXplID0gUlBNX0JVRl9TSVpFLAorCQl9LAorCQkubG1lbSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4NDAwICogMiwKKwkJfQorCX0KK307CisKKyNkZWZpbmUgSVNfOEtfU0laRSh3LCBoKSAgKCgodykgKiAoaCkpID4gTUFYX1NJWkVfNEspCisjZGVmaW5lIElTXzRLX1NJWkUodywgaCkgICgoKHcpICogKGgpKSA+ICgxOTIwKjEwODgpKQorI2lmbmRlZiBNVl9VU0VfRklYRURfQlVGCitzdGF0aWMgdWludDMyX3QgZ2V0X212X2J1Zl9zaXplKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworCXN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjID0gJmRlYy0+YXZzMl9kZWM7CisJdWludDMyX3Qgc2l6ZTsKKwlpZiAobXZfYnVmX2R5bmFtaWNfYWxsb2MgPT0gMSkgeworCQlpbnQgbXZfbWVtX3VuaXQgPQorCQkJYXZzMl9kZWMtPmxjdV9zaXplX2xvZzIgPT0gNiA/IDB4MjAwIDogYXZzMl9kZWMtPmxjdV9zaXplX2xvZzIgPT0KKwkJCTUgPyAweDgwIDogMHgyMDsKKwkJaW50IGV4dGVuZGVkX3BpY193aWR0aCA9ICh3aWR0aCArIGF2czJfZGVjLT5sY3Vfc2l6ZSAtMSkKKwkJCQkmICh+KGF2czJfZGVjLT5sY3Vfc2l6ZSAtIDEpKTsKKwkJaW50IGV4dGVuZGVkX3BpY19oZWlnaHQgPSAoaGVpZ2h0ICsgYXZzMl9kZWMtPmxjdV9zaXplIC0xKQorCQkJCSYgKH4oYXZzMl9kZWMtPmxjdV9zaXplIC0gMSkpOworCQlpbnQgbGN1X3hfbnVtID0gZXh0ZW5kZWRfcGljX3dpZHRoIC8gYXZzMl9kZWMtPmxjdV9zaXplOworCQlpbnQgbGN1X3lfbnVtID0gZXh0ZW5kZWRfcGljX2hlaWdodCAvIGF2czJfZGVjLT5sY3Vfc2l6ZTsKKwkJaW50IG5ld19zaXplID0gIGxjdV94X251bSAqIGxjdV95X251bSAqIG12X21lbV91bml0OworCQlzaXplID0gKG5ld19zaXplICsgMHhmZmZmKSAmICh+MHhmZmZmKTsKKworCX0gZWxzZSB7CisJCWlmIChJU184S19TSVpFKHdpZHRoLCBoZWlnaHQpKQorCQkJc2l6ZSA9IENPX01WX0JVRl9TSVpFXzhLOworCQllbHNlIGlmIChJU180S19TSVpFKHdpZHRoLCBoZWlnaHQpKQorCQkJc2l6ZSA9IENPX01WX0JVRl9TSVpFXzRLOworCQllbHNlCisJCQlzaXplID0gQ09fTVZfQlVGX1NJWkVfMTA4MFA7CisJfQorCXJldHVybiBzaXplOworfQorI2VuZGlmCisKKy8qTG9zbGVzcyBjb21wcmVzc2lvbiBib2R5IGJ1ZmZlciBzaXplIDRLIHBlciA2NHgzMiAoanQpKi8KK3N0YXRpYyBpbnQgIGNvbXB1dGVfbG9zbGVzc19jb21wX2JvZHlfc2l6ZShzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjLAorCWludCB3aWR0aCwgaW50IGhlaWdodCwKKwl1aW50OF90IGlzX2JpdF9kZXB0aF8xMCkKK3sKKwlpbnQgICAgIHdpZHRoX3g2NDsKKwlpbnQgICAgIGhlaWdodF94MzI7CisJaW50ICAgICBic2l6ZTsKKwl3aWR0aF94NjQgPSB3aWR0aCArIDYzOworCXdpZHRoX3g2NCA+Pj0gNjsKKwloZWlnaHRfeDMyID0gaGVpZ2h0ICsgMzE7CisJaGVpZ2h0X3gzMiA+Pj0gNTsKKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwkgYnNpemUgPSAoaXNfYml0X2RlcHRoXzEwID8gNDA5NiA6IDMyMDApCisJCSogd2lkdGhfeDY0ICogaGVpZ2h0X3gzMjsKKyNlbHNlCisJIGJzaXplID0gKGlzX2JpdF9kZXB0aF8xMCA/IDQwOTYgOiAzMDcyKQorCQkqIHdpZHRoX3g2NCAqIGhlaWdodF94MzI7CisjZW5kaWYKKwlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX01PUkUsCisJCSIlcyglZCwlZCwlZCk9PiVkXG4iLAorCQlfX2Z1bmNfXywgd2lkdGgsIGhlaWdodCwKKwkJaXNfYml0X2RlcHRoXzEwLCBic2l6ZSk7CisKKwlyZXR1cm4gIGJzaXplOworfQorCisvKiBMb3NsZXNzIGNvbXByZXNzaW9uIGhlYWRlciBidWZmZXIgc2l6ZSAzMmJ5dGVzIHBlciAxMjh4NjQgKGp0KSovCitzdGF0aWMgIGludCAgY29tcHV0ZV9sb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYywKKwlpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisJaW50ICAgICB3aWR0aF94MTI4OworCWludCAgICAgaGVpZ2h0X3g2NDsKKwlpbnQgICAgIGhzaXplOworCXdpZHRoX3gxMjggPSB3aWR0aCArIDEyNzsKKwl3aWR0aF94MTI4ID4+PSA3OworCWhlaWdodF94NjQgPSBoZWlnaHQgKyA2MzsKKwloZWlnaHRfeDY0ID4+PSA2OworCisJaHNpemUgPSAzMiAqIHdpZHRoX3gxMjggKiBoZWlnaHRfeDY0OworCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1JfTU9SRSwKKwkJIiVzKCVkLCVkKT0+JWRcbiIsCisJCV9fZnVuY19fLCB3aWR0aCwgaGVpZ2h0LAorCQloc2l6ZSk7CisKKwlyZXR1cm4gIGhzaXplOworfQorCitzdGF0aWMgdm9pZCBpbml0X2J1ZmZfc3BlYyhzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjLAorCXN0cnVjdCBCdWZmSW5mb19zICpidWZfc3BlYykKK3sKKwl2b2lkICptZW1fc3RhcnRfdmlydDsKKworCWJ1Zl9zcGVjLT5pcHAuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c3RhcnRfYWRyKTsKKwlidWZfc3BlYy0+c2FvX2Fidi5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5pcHAuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPmlwcC5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPnNhb192Yi5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5zYW9fYWJ2LmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5zYW9fYWJ2LmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+c2hvcnRfdGVybV9ycHMuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c2FvX3ZiLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5zYW9fdmIuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5yY3MuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c2hvcnRfdGVybV9ycHMuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnNob3J0X3Rlcm1fcnBzLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+c3BzLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnJjcy5idWZfc3RhcnQgKyBidWZfc3BlYy0+cmNzLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+cHBzLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnNwcy5idWZfc3RhcnQgKyBidWZfc3BlYy0+c3BzLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+c2FvX3VwLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnBwcy5idWZfc3RhcnQgKyBidWZfc3BlYy0+cHBzLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+c3dhcF9idWYuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c2FvX3VwLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5zYW9fdXAuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5zd2FwX2J1ZjIuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c3dhcF9idWYuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnN3YXBfYnVmLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+c2NhbGVsdXQuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c3dhcF9idWYyLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5zd2FwX2J1ZjIuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5kYmxrX3BhcmEuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c2NhbGVsdXQuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnNjYWxlbHV0LmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+ZGJsa19kYXRhLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc3RhcnQgKyBidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+ZGJsa19kYXRhMi5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5kYmxrX2RhdGEuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPmRibGtfZGF0YS5idWZfc2l6ZSk7CisjaWZkZWYgQVZTMl8xMEJfTU1VCisJYnVmX3NwZWMtPm1tdV92YmguYnVmX3N0YXJ0ICA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPmRibGtfZGF0YTIuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPmRibGtfZGF0YTIuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5tcHJlZF9hYm92ZS5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5tbXVfdmJoLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5tbXVfdmJoLmJ1Zl9zaXplKTsKKyNlbHNlCisJYnVmX3NwZWMtPm1wcmVkX2Fib3ZlLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPmRibGtfZGF0YTIuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPmRibGtfZGF0YTIuYnVmX3NpemUpOworI2VuZGlmCisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCWJ1Zl9zcGVjLT5tcHJlZF9tdi5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5tcHJlZF9hYm92ZS5idWZfc3RhcnQgKyBidWZfc3BlYy0+bXByZWRfYWJvdmUuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5ycG0uYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+bXByZWRfbXYuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPm1wcmVkX212LmJ1Zl9zaXplKTsKKyNlbHNlCisJYnVmX3NwZWMtPnJwbS5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5tcHJlZF9hYm92ZS5idWZfc3RhcnQgKyBidWZfc3BlYy0+bXByZWRfYWJvdmUuYnVmX3NpemUpOworI2VuZGlmCisJYnVmX3NwZWMtPmxtZW0uYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+cnBtLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5ycG0uYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5lbmRfYWRyID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+bG1lbS5idWZfc3RhcnQgKyBidWZfc3BlYy0+bG1lbS5idWZfc2l6ZSk7CisKKwlpZiAoZGVjKSB7CisJCW1lbV9zdGFydF92aXJ0ID0KKwkJCWNvZGVjX21tX3BoeXNfdG9fdmlydChidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zdGFydCk7CisJCWlmIChtZW1fc3RhcnRfdmlydCkgeworCQkJbWVtc2V0KG1lbV9zdGFydF92aXJ0LCAwLCBidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zaXplKTsKKwkJCWNvZGVjX21tX2RtYV9mbHVzaChtZW1fc3RhcnRfdmlydCwKKwkJCQlidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zaXplLAorCQkJCURNQV9UT19ERVZJQ0UpOworCQl9IGVsc2UgeworCQkJLypub3QgdmlydCBmb3IgdHZwIHBsYXlpbmcsCisJCQltYXkgbmVlZCBjbGVhciBvbiB1Y29kZS4qLworCQkJcHJfZXJyKCJtZW1fc3RhcnRfdmlydCBmYWlsZWRcbiIpOworCQl9CisJCWlmIChkZWJ1ZykgeworCQkJcHJfaW5mbygiJXMgd29ya3NwYWNlICgleCAleCkgc2l6ZSA9ICV4XG4iLCBfX2Z1bmNfXywKKwkJCQlidWZfc3BlYy0+c3RhcnRfYWRyLCBidWZfc3BlYy0+ZW5kX2FkciwKKwkJCQlidWZfc3BlYy0+ZW5kX2FkciAtIGJ1Zl9zcGVjLT5zdGFydF9hZHIpOworCQl9CisJCWlmIChkZWJ1ZykgeworCQkJcHJfaW5mbygiaXBwLmJ1Zl9zdGFydCAgICAgICAgICAgICA6JXhcbiIsCisJCQkJICAgYnVmX3NwZWMtPmlwcC5idWZfc3RhcnQpOworCQkJcHJfaW5mbygic2FvX2Fidi5idWZfc3RhcnQgICAgICAgICAgOiV4XG4iLAorCQkJCSAgIGJ1Zl9zcGVjLT5zYW9fYWJ2LmJ1Zl9zdGFydCk7CisJCQlwcl9pbmZvKCJzYW9fdmIuYnVmX3N0YXJ0ICAgICAgICAgIDoleFxuIiwKKwkJCQkgICBidWZfc3BlYy0+c2FvX3ZiLmJ1Zl9zdGFydCk7CisJCQlwcl9pbmZvKCJzaG9ydF90ZXJtX3Jwcy5idWZfc3RhcnQgIDoleFxuIiwKKwkJCQkgICBidWZfc3BlYy0+c2hvcnRfdGVybV9ycHMuYnVmX3N0YXJ0KTsKKwkJCXByX2luZm8oInJjcy5idWZfc3RhcnQgICAgICAgICAgICAgOiV4XG4iLAorCQkJCSAgIGJ1Zl9zcGVjLT5yY3MuYnVmX3N0YXJ0KTsKKwkJCXByX2luZm8oInNwcy5idWZfc3RhcnQgICAgICAgICAgICAgOiV4XG4iLAorCQkJCSAgIGJ1Zl9zcGVjLT5zcHMuYnVmX3N0YXJ0KTsKKwkJCXByX2luZm8oInBwcy5idWZfc3RhcnQgICAgICAgICAgICAgOiV4XG4iLAorCQkJCSAgIGJ1Zl9zcGVjLT5wcHMuYnVmX3N0YXJ0KTsKKwkJCXByX2luZm8oInNhb191cC5idWZfc3RhcnQgICAgICAgICAgOiV4XG4iLAorCQkJCSAgIGJ1Zl9zcGVjLT5zYW9fdXAuYnVmX3N0YXJ0KTsKKwkJCXByX2luZm8oInN3YXBfYnVmLmJ1Zl9zdGFydCAgICAgICAgOiV4XG4iLAorCQkJCSAgIGJ1Zl9zcGVjLT5zd2FwX2J1Zi5idWZfc3RhcnQpOworCQkJcHJfaW5mbygic3dhcF9idWYyLmJ1Zl9zdGFydCAgICAgICA6JXhcbiIsCisJCQkJICAgYnVmX3NwZWMtPnN3YXBfYnVmMi5idWZfc3RhcnQpOworCQkJcHJfaW5mbygic2NhbGVsdXQuYnVmX3N0YXJ0ICAgICAgICA6JXhcbiIsCisJCQkJICAgYnVmX3NwZWMtPnNjYWxlbHV0LmJ1Zl9zdGFydCk7CisJCQlwcl9pbmZvKCJkYmxrX3BhcmEuYnVmX3N0YXJ0ICAgICAgIDoleFxuIiwKKwkJCQkgICBidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zdGFydCk7CisJCQlwcl9pbmZvKCJkYmxrX2RhdGEuYnVmX3N0YXJ0ICAgICAgIDoleFxuIiwKKwkJCQkgICBidWZfc3BlYy0+ZGJsa19kYXRhLmJ1Zl9zdGFydCk7CisJCQlwcl9pbmZvKCJkYmxrX2RhdGEyLmJ1Zl9zdGFydCAgICAgICA6JXhcbiIsCisJCQkJICAgYnVmX3NwZWMtPmRibGtfZGF0YTIuYnVmX3N0YXJ0KTsKKwkjaWZkZWYgQVZTMl8xMEJfTU1VCisJCQlwcl9pbmZvKCJtbXVfdmJoLmJ1Zl9zdGFydCAgICAgOiV4XG4iLAorCQkJCWJ1Zl9zcGVjLT5tbXVfdmJoLmJ1Zl9zdGFydCk7CisJI2VuZGlmCisJCQlwcl9pbmZvKCJtcHJlZF9hYm92ZS5idWZfc3RhcnQgICAgIDoleFxuIiwKKwkJCQkgICBidWZfc3BlYy0+bXByZWRfYWJvdmUuYnVmX3N0YXJ0KTsKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJCQlwcl9pbmZvKCJtcHJlZF9tdi5idWZfc3RhcnQgICAgICAgIDoleFxuIiwKKwkJCQkgICBidWZfc3BlYy0+bXByZWRfbXYuYnVmX3N0YXJ0KTsKKyNlbmRpZgorCQkJaWYgKChkZWJ1ZyAmIEFWUzJfREJHX1NFTkRfUEFSQU1fV0lUSF9SRUcpID09IDApIHsKKwkJCQlwcl9pbmZvKCJycG0uYnVmX3N0YXJ0ICAgICAgICAgICAgIDoleFxuIiwKKwkJCQkJICAgYnVmX3NwZWMtPnJwbS5idWZfc3RhcnQpOworCQkJfQorCQl9CisJfQorCit9CisKK3N0YXRpYyB2b2lkIHVuaW5pdF9tbXVfYnVmZmVycyhzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworI2lmIDAKKy8qbmRlZiBNVl9VU0VfRklYRURfQlVGKi8KKwlkZWFsbG9jX212X2J1ZnMoZGVjKTsKKyNlbmRpZgorCWRlY29kZXJfbW11X2JveF9mcmVlKGRlYy0+bW11X2JveCk7CisJZGVjLT5tbXVfYm94ID0gTlVMTDsKKworCWlmIChkZWMtPmJtbXVfYm94KQorCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWUoZGVjLT5ibW11X2JveCk7CisJZGVjLT5ibW11X2JveCA9IE5VTEw7Cit9CisKKyNpZm5kZWYgQVZTMl8xMEJfTU1VCitzdGF0aWMgdm9pZCBpbml0X2J1Zl9saXN0KHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMpCit7CisJaW50IGk7CisJaW50IGJ1Zl9zaXplOworCWludCBtY19idWZmZXJfZW5kID0gZGVjLT5tY19idWYtPmJ1Zl9zdGFydCArIGRlYy0+bWNfYnVmLT5idWZfc2l6ZTsKKwlkZWMtPnVzZWRfYnVmX251bSA9IG1heF9idWZfbnVtOworCisJaWYgKGRlYy0+dXNlZF9idWZfbnVtID4gTUFYX0JVRl9OVU0pCisJCWRlYy0+dXNlZF9idWZfbnVtID0gTUFYX0JVRl9OVU07CisJaWYgKGJ1Zl9hbGxvY19zaXplID4gMCkgeworCQlidWZfc2l6ZSA9IGJ1Zl9hbGxvY19zaXplOworCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSLAorCQkJIltCdWZmZXIgTWFuYWdlbWVudF0gaW5pdF9idWZfbGlzdDpcbiIpOworCX0gZWxzZSB7CisJCWludCBwaWNfd2lkdGggPSBkZWMtPmluaXRfcGljX3c7CisJCWludCBwaWNfaGVpZ2h0ID0gZGVjLT5pbml0X3BpY19oOworCisJLypTVVBQT1JUXzEwQklUKi8KKwlpbnQgbG9zbGVzc19jb21wX2hlYWRlcl9zaXplID0gY29tcHV0ZV9sb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUKKwkJCShkZWMsIHBpY193aWR0aCwgcGljX2hlaWdodCk7CisJaW50IGxvc2xlc3NfY29tcF9ib2R5X3NpemUgPSBjb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemUKKwkJCShkZWMsIHBpY193aWR0aCwgcGljX2hlaWdodCwgYnVmX2FsbG9jX2RlcHRoID09IDEwKTsKKwlpbnQgbWNfYnVmZmVyX3NpemUgPSBsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUKKwkJKyBsb3NsZXNzX2NvbXBfYm9keV9zaXplOworCWludCBtY19idWZmZXJfc2l6ZV9oID0gKG1jX2J1ZmZlcl9zaXplICsgMHhmZmZmKT4+MTY7CisKKwlpbnQgZHdfbW9kZSA9IGdldF9kb3VibGVfd3JpdGVfbW9kZV9pbml0KGRlYyk7CisKKwlpZiAoZHdfbW9kZSkgeworCQlpbnQgcGljX3dpZHRoX2R3ID0gcGljX3dpZHRoIC8KKwkJCWdldF9kb3VibGVfd3JpdGVfcmF0aW8oZHdfbW9kZSk7CisJCWludCBwaWNfaGVpZ2h0X2R3ID0gcGljX2hlaWdodCAvCisJCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKGR3X21vZGUpOworCQlpbnQgbGN1X3NpemUgPSA2NDsgLypmaXhlZCA2NCovCisJCWludCBwaWNfd2lkdGhfNjQgPSAocGljX3dpZHRoX2R3ICsgNjMpICYgKH4weDNmKTsKKwkJaW50IHBpY19oZWlnaHRfMzIgPSAocGljX2hlaWdodF9kdyArIDMxKSAmICh+MHgxZik7CisJCWludCBwaWNfd2lkdGhfbGN1ICA9CisJCQkocGljX3dpZHRoXzY0ICUgbGN1X3NpemUpID8gcGljX3dpZHRoXzY0IC8gbGN1X3NpemUKKwkJCSsgMSA6IHBpY193aWR0aF82NCAvIGxjdV9zaXplOworCQlpbnQgcGljX2hlaWdodF9sY3UgPQorCQkJKHBpY19oZWlnaHRfMzIgJSBsY3Vfc2l6ZSkgPyBwaWNfaGVpZ2h0XzMyIC8gbGN1X3NpemUKKwkJCSsgMSA6IHBpY19oZWlnaHRfMzIgLyBsY3Vfc2l6ZTsKKwkJaW50IGxjdV90b3RhbCAgICAgICA9IHBpY193aWR0aF9sY3UgKiBwaWNfaGVpZ2h0X2xjdTsKKwkJaW50IG1jX2J1ZmZlcl9zaXplX3VfdiA9IGxjdV90b3RhbCAqIGxjdV9zaXplICogbGN1X3NpemUgLyAyOworCQlpbnQgbWNfYnVmZmVyX3NpemVfdV92X2ggPSAobWNfYnVmZmVyX3NpemVfdV92ICsgMHhmZmZmKSA+PiAxNjsKKwkJCS8qNjRrIGFsaWdubWVudCovCisJCWJ1Zl9zaXplID0gKChtY19idWZmZXJfc2l6ZV91X3ZfaCA8PCAxNikgKiAzKTsKKwl9IGVsc2UKKwkJYnVmX3NpemUgPSAwOworCisJaWYgKG1jX2J1ZmZlcl9zaXplICYgMHhmZmZmKSB7IC8qNjRrIGFsaWdubWVudCovCisJCW1jX2J1ZmZlcl9zaXplX2ggKz0gMTsKKwl9CisJaWYgKChkd19tb2RlICYgMHgxMCkgPT0gMCkKKwkJYnVmX3NpemUgKz0gKG1jX2J1ZmZlcl9zaXplX2ggPDwgMTYpOworCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSLAorCQkJImluaXRfYnVmX2xpc3QgbnVtICVkICh3aWR0aCAlZCBoZWlnaHQgJWQpOlxuIiwKKwkJCSBkZWMtPnVzZWRfYnVmX251bSwgcGljX3dpZHRoLCBwaWNfaGVpZ2h0KTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZGVjLT51c2VkX2J1Zl9udW07IGkrKykgeworCQlpZiAoKChpICsgMSkgKiBidWZfc2l6ZSkgPiBkZWMtPm1jX2J1Zi0+YnVmX3NpemUpCisJCQlkZWMtPnVzZV9jbWFfZmxhZyA9IDE7CisjaWZuZGVmIEFWUzJfMTBCX01NVQorCQlkZWMtPm1fQlVGW2ldLmFsbG9jX2ZsYWcgPSAwOworCQlkZWMtPm1fQlVGW2ldLmluZGV4ID0gaTsKKworCQlkZWMtPnVzZV9jbWFfZmxhZyA9IDE7CisJCWlmIChkZWMtPnVzZV9jbWFfZmxhZykgeworCQkJZGVjLT5tX0JVRltpXS5jbWFfcGFnZV9jb3VudCA9CisJCQkJCVBBR0VfQUxJR04oYnVmX3NpemUpIC8gUEFHRV9TSVpFOworCQkJaWYgKGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeShkZWMtPmJtbXVfYm94LAorCQkJCQlWRl9CVUZGRVJfSURYKGkpLCBidWZfc2l6ZSwgRFJJVkVSX05BTUUsCisJCQkJCSZkZWMtPm1fQlVGW2ldLmFsbG9jX2FkZHIpIDwgMCkgeworCQkJCWRlYy0+bV9CVUZbaV0uY21hX3BhZ2VfY291bnQgPSAwOworCQkJCWlmIChpIDw9IDUpIHsKKwkJCQkJZGVjLT5mYXRhbF9lcnJvciB8PQorCQkJCQlERUNPREVSX0ZBVEFMX0VSUk9SX05PX01FTTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQlkZWMtPm1fQlVGW2ldLnN0YXJ0X2FkciA9ICBkZWMtPm1fQlVGW2ldLmFsbG9jX2FkZHI7CisJCX0gZWxzZSB7CisJCQlkZWMtPm1fQlVGW2ldLmNtYV9wYWdlX2NvdW50ID0gMDsKKwkJCWRlYy0+bV9CVUZbaV0uYWxsb2NfYWRkciA9IDA7CisJCQlkZWMtPm1fQlVGW2ldLnN0YXJ0X2FkciA9CisJCQkJZGVjLT5tY19idWYtPmJ1Zl9zdGFydCArIGkgKiBidWZfc2l6ZTsKKwkJfQorCQlkZWMtPm1fQlVGW2ldLnNpemUgPSBidWZfc2l6ZTsKKwkJZGVjLT5tX0JVRltpXS5mcmVlX3N0YXJ0X2FkciA9IGRlYy0+bV9CVUZbaV0uc3RhcnRfYWRyOworCisJCWlmICgoKGRlYy0+bV9CVUZbaV0uc3RhcnRfYWRyICsgYnVmX3NpemUpID4gbWNfYnVmZmVyX2VuZCkKKwkJCSYmIChkZWMtPm1fQlVGW2ldLmFsbG9jX2FkZHIgPT0gMCkpIHsKKwkJCWlmIChkZWJ1ZykgeworCQkJCWF2czJfcHJpbnQoZGVjLCAwLAorCQkJCSJNYXggbWMgYnVmZmVyIG9yIG1wcmVkX212IGJ1ZmZlciBpcyB1c2VkXG4iKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUiwKKwkJCSJCdWZmZXIgJWQ6IHN0YXJ0X2FkciAlcCBzaXplICV4XG4iLCBpLAorCQkJICAgKHZvaWQgKilkZWMtPm1fQlVGW2ldLnN0YXJ0X2FkciwKKwkJCSAgIGRlYy0+bV9CVUZbaV0uc2l6ZSk7CisjZW5kaWYKKwl9CisJZGVjLT5idWZfbnVtID0gaTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGNvbmZpZ19waWMoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYywKKwkJCQlzdHJ1Y3QgYXZzMl9mcmFtZV9zICpwaWMsIGludDMyX3QgbGN1X3NpemVfbG9nMikKK3sKKwlpbnQgcmV0ID0gLTE7CisJaW50IGk7CisJaW50IHBpY193aWR0aCA9IGRlYy0+aW5pdF9waWNfdzsKKwlpbnQgcGljX2hlaWdodCA9IGRlYy0+aW5pdF9waWNfaDsKKwkvKnN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjID0gJmRlYy0+YXZzMl9kZWM7CisJaW50MzJfdCBsY3Vfc2l6ZV9sb2cyID0gYXZzMl9kZWMtPmxjdV9zaXplX2xvZzI7Ki8KKwlpbnQzMl90IGxjdV9zaXplID0gMSA8PCBsY3Vfc2l6ZV9sb2cyOworCWludCBwaWNfd2lkdGhfNjQgPSAocGljX3dpZHRoICsgNjMpICYgKH4weDNmKTsKKwlpbnQgcGljX2hlaWdodF8zMiA9IChwaWNfaGVpZ2h0ICsgMzEpICYgKH4weDFmKTsKKwlpbnQgcGljX3dpZHRoX2xjdSAgPSAocGljX3dpZHRoXzY0ICUgbGN1X3NpemUpID8KKwkJCQlwaWNfd2lkdGhfNjQgLyBsY3Vfc2l6ZSAgKyAxCisJCQkJOiBwaWNfd2lkdGhfNjQgLyBsY3Vfc2l6ZTsKKwlpbnQgcGljX2hlaWdodF9sY3UgPSAocGljX2hlaWdodF8zMiAlIGxjdV9zaXplKSA/CisJCQkJcGljX2hlaWdodF8zMiAvIGxjdV9zaXplICsgMQorCQkJCTogcGljX2hlaWdodF8zMiAvIGxjdV9zaXplOworCWludCBsY3VfdG90YWwgICAgICAgPSBwaWNfd2lkdGhfbGN1ICogcGljX2hlaWdodF9sY3U7CisjaWYgMAorCWludDMyX3QgTVZfTUVNX1VOSVQgPQorCQkobGN1X3NpemVfbG9nMiA9PSA2KSA/IDB4MjAwIDoKKwkJKChsY3Vfc2l6ZV9sb2cyID09IDUpID8gMHg4MCA6IDB4MjApOworI2VuZGlmCisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCXUzMiBtcHJlZF9tdl9lbmQgPSBkZWMtPndvcmtfc3BhY2VfYnVmLT5tcHJlZF9tdi5idWZfc3RhcnQgKworCQkJZGVjLT53b3JrX3NwYWNlX2J1Zi0+bXByZWRfbXYuYnVmX3NpemU7CisjZW5kaWYKKwl1MzIgeV9hZHIgPSAwOworCWludCBidWZfc2l6ZSA9IDA7CisKKwlpbnQgbG9zbGVzc19jb21wX2hlYWRlcl9zaXplID0KKwkJCWNvbXB1dGVfbG9zbGVzc19jb21wX2hlYWRlcl9zaXplKAorCQkJZGVjLCBwaWNfd2lkdGgsIHBpY19oZWlnaHQpOworCWludCBsb3NsZXNzX2NvbXBfYm9keV9zaXplID0gY29tcHV0ZV9sb3NsZXNzX2NvbXBfYm9keV9zaXplKAorCQkJZGVjLCBwaWNfd2lkdGgsCisJCQlwaWNfaGVpZ2h0LCBidWZfYWxsb2NfZGVwdGggPT0gMTApOworCWludCBtY19idWZmZXJfc2l6ZSA9IGxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSArIGxvc2xlc3NfY29tcF9ib2R5X3NpemU7CisJaW50IG1jX2J1ZmZlcl9zaXplX2ggPSAobWNfYnVmZmVyX3NpemUgKyAweGZmZmYpID4+IDE2OworCWludCBtY19idWZmZXJfc2l6ZV91X3YgPSAwOworCWludCBtY19idWZmZXJfc2l6ZV91X3ZfaCA9IDA7CisJaW50IGR3X21vZGUgPSBnZXRfZG91YmxlX3dyaXRlX21vZGVfaW5pdChkZWMpOworCisJaWYgKGR3X21vZGUpIHsKKwkJaW50IHBpY193aWR0aF9kdyA9IHBpY193aWR0aCAvCisJCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKGR3X21vZGUpOworCQlpbnQgcGljX2hlaWdodF9kdyA9IHBpY19oZWlnaHQgLworCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhkd19tb2RlKTsKKwkJaW50IHBpY193aWR0aF82NF9kdyA9IChwaWNfd2lkdGhfZHcgKyA2MykgJiAofjB4M2YpOworCQlpbnQgcGljX2hlaWdodF8zMl9kdyA9IChwaWNfaGVpZ2h0X2R3ICsgMzEpICYgKH4weDFmKTsKKwkJaW50IHBpY193aWR0aF9sY3VfZHcgID0gKHBpY193aWR0aF82NF9kdyAlIGxjdV9zaXplKSA/CisJCQkJCXBpY193aWR0aF82NF9kdyAvIGxjdV9zaXplICArIDEKKwkJCQkJOiBwaWNfd2lkdGhfNjRfZHcgLyBsY3Vfc2l6ZTsKKwkJaW50IHBpY19oZWlnaHRfbGN1X2R3ID0gKHBpY19oZWlnaHRfMzJfZHcgJSBsY3Vfc2l6ZSkgPworCQkJCQlwaWNfaGVpZ2h0XzMyX2R3IC8gbGN1X3NpemUgKyAxCisJCQkJCTogcGljX2hlaWdodF8zMl9kdyAvIGxjdV9zaXplOworCQlpbnQgbGN1X3RvdGFsX2R3ICAgICAgID0gcGljX3dpZHRoX2xjdV9kdyAqIHBpY19oZWlnaHRfbGN1X2R3OworCisJCW1jX2J1ZmZlcl9zaXplX3VfdiA9IGxjdV90b3RhbF9kdyAqIGxjdV9zaXplICogbGN1X3NpemUgLyAyOworCQltY19idWZmZXJfc2l6ZV91X3ZfaCA9IChtY19idWZmZXJfc2l6ZV91X3YgKyAweGZmZmYpID4+IDE2OworCQkvKjY0ayBhbGlnbm1lbnQqLworCQlidWZfc2l6ZSA9ICgobWNfYnVmZmVyX3NpemVfdV92X2ggPDwgMTYpICogMyk7CisJCWJ1Zl9zaXplID0gKChidWZfc2l6ZSArIDB4ZmZmZikgPj4gMTYpIDw8IDE2OworCX0KKwlpZiAobWNfYnVmZmVyX3NpemUgJiAweGZmZmYpIC8qNjRrIGFsaWdubWVudCovCisJCW1jX2J1ZmZlcl9zaXplX2ggKz0gMTsKKyNpZm5kZWYgQVZTMl8xMEJfTU1VCisJaWYgKChkd19tb2RlICYgMHgxMCkgPT0gMCkKKwkJYnVmX3NpemUgKz0gKG1jX2J1ZmZlcl9zaXplX2ggPDwgMTYpOworI2VuZGlmCisKKyNpZmRlZiBBVlMyXzEwQl9NTVUKKyNpZm5kZWYgRFlOQU1JQ19BTExPQ19IRUFECisJcGljLT5oZWFkZXJfYWRyID0gZGVjb2Rlcl9ibW11X2JveF9nZXRfcGh5X2FkZHIoCisJCQlkZWMtPmJtbXVfYm94LCBIRUFERVJfQlVGRkVSX0lEWChwaWMtPmluZGV4KSk7CisKKwlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX01PUkUsCisJCSJidWZfc2l6ZSAlZCwgTU1VIGhlYWRlcl9hZHIgJWQ6ICVsZFxuIiwKKwkJYnVmX3NpemUsIHBpYy0+aW5kZXgsIHBpYy0+aGVhZGVyX2Fkcik7CisjZW5kaWYKKyNlbmRpZgorCisJaSA9IHBpYy0+aW5kZXg7CisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorI2lmZGVmIEcxMkFfQlJJTkdVUF9ERUJVRworCWlmICgxKSB7CisjZWxzZQorCWlmICgoZGVjLT53b3JrX3NwYWNlX2J1Zi0+bXByZWRfbXYuYnVmX3N0YXJ0ICsKKwkJKCgoaSArIDEpICogbGN1X3RvdGFsKSAqIE1WX01FTV9VTklUKSkKKwkJPD0gbXByZWRfbXZfZW5kCisJKSB7CisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBBVlMyXzEwQl9NTVUKKwkJaWYgKGRlYnVnKSB7CisJCQlwcl9lcnIoInN0YXJ0ICV4ICAuc2l6ZT0lZFxuIiwKKwkJCQlkZWMtPm1jX2J1Zl9zcGVjLmJ1Zl9zdGFydCArIGkgKiBidWZfc2l6ZSwKKwkJCQlidWZfc2l6ZSk7CisJCX0KKyNlbmRpZgorI2lmbmRlZiBBVlMyXzEwQl9NTVUKKwkJZm9yIChpID0gMDsgaSA8IGRlYy0+YnVmX251bTsgaSsrKSB7CisJCQl5X2FkciA9ICgoZGVjLT5tX0JVRltpXS5mcmVlX3N0YXJ0X2FkcgorCQkJCSsgMHhmZmZmKSA+PiAxNikgPDwgMTY7CisJCQkvKjY0ayBhbGlnbm1lbnQqLworCQkJaWYgKCh5X2FkcitidWZfc2l6ZSkgPD0JKGRlYy0+bV9CVUZbaV0uc3RhcnRfYWRyKworCQkJCWRlYy0+bV9CVUZbaV0uc2l6ZSkpIHsKKwkJCQlkZWMtPm1fQlVGW2ldLmZyZWVfc3RhcnRfYWRyID0KKwkJCQkJeV9hZHIgKyBidWZfc2l6ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoaSA8IGRlYy0+YnVmX251bSkKKyNlbHNlCisJCS8qaWYgKChkZWMtPm1jX2J1Zi0+YnVmX3N0YXJ0ICsgKGkgKyAxKSAqIGJ1Zl9zaXplKSA8CisJCQlkZWMtPm1jX2J1Zi0+YnVmX2VuZCkKKwkJCXlfYWRyID0gZGVjLT5tY19idWYtPmJ1Zl9zdGFydCArIGkgKiBidWZfc2l6ZTsKKwkJZWxzZSB7Ki8KKwkJaWYgKGJ1Zl9zaXplID4gMCAmJiBwaWMtPmNtYV9hbGxvY19hZGRyID09IDApIHsKKwkJCXJldCA9IGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeShkZWMtPmJtbXVfYm94LAorCQkJCQlWRl9CVUZGRVJfSURYKGkpLAorCQkJCQlidWZfc2l6ZSwgRFJJVkVSX05BTUUsCisJCQkJCSZwaWMtPmNtYV9hbGxvY19hZGRyKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJYXZzMl9wcmludChkZWMsIDAsCisJCQkJCSJkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkgaWR4ICVkIHNpemUgJWQgZmFpbFxuIiwKKwkJCQkJVkZfQlVGRkVSX0lEWChpKSwKKwkJCQkJYnVmX3NpemUKKwkJCQkJKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCisJCQlpZiAocGljLT5jbWFfYWxsb2NfYWRkcikKKwkJCQl5X2FkciA9IHBpYy0+Y21hX2FsbG9jX2FkZHI7CisJCQllbHNlIHsKKwkJCQlhdnMyX3ByaW50KGRlYywgMCwKKwkJCQkJImRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeSBpZHggJWQgc2l6ZSAlZCByZXR1cm4gbnVsbFxuIiwKKwkJCQkJVkZfQlVGRkVSX0lEWChpKSwKKwkJCQkJYnVmX3NpemUKKwkJCQkJKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKyNlbmRpZgorCQl7CisJCQkvKmVuc3VyZSBnZXRfcGljX2J5X1BPQygpCisJCQlub3QgZ2V0IHRoZSBidWZmZXIgbm90IGRlY29kZWQqLworCQkJcGljLT5CVUZfaW5kZXggPSBpOworCQkJcGljLT5sY3VfdG90YWwgPSBsY3VfdG90YWw7CisKKwkJCXBpYy0+Y29tcF9ib2R5X3NpemUgPSBsb3NsZXNzX2NvbXBfYm9keV9zaXplOworCQkJcGljLT5idWZfc2l6ZSA9IGJ1Zl9zaXplOworI2lmbmRlZiBBVlMyXzEwQl9NTVUKKwkJCXBpYy0+bWNfeV9hZHIgPSB5X2FkcjsKKyNlbmRpZgorCQkJcGljLT5tY19jYW52YXNfeSA9IHBpYy0+aW5kZXg7CisJCQlwaWMtPm1jX2NhbnZhc191X3YgPSBwaWMtPmluZGV4OworI2lmbmRlZiBBVlMyXzEwQl9NTVUKKwkJCWlmIChkd19tb2RlICYgMHgxMCkgeworCQkJCXBpYy0+bWNfdV92X2FkciA9IHlfYWRyICsKKwkJCQkoKG1jX2J1ZmZlcl9zaXplX3Vfdl9oIDw8IDE2KSA8PCAxKTsKKworCQkJCXBpYy0+bWNfY2FudmFzX3kgPQorCQkJCQkocGljLT5pbmRleCA8PCAxKTsKKwkJCQlwaWMtPm1jX2NhbnZhc191X3YgPQorCQkJCQkocGljLT5pbmRleCA8PCAxKSArIDE7CisKKwkJCQlwaWMtPmR3X3lfYWRyID0geV9hZHI7CisJCQkJcGljLT5kd191X3ZfYWRyID0gcGljLT5tY191X3ZfYWRyOworCQkJfSBlbHNlCisjZW5kaWYKKwkJCWlmIChkd19tb2RlKSB7CisJCQkJcGljLT5kd195X2FkciA9IHlfYWRyCisjaWZuZGVmIEFWUzJfMTBCX01NVQorCQkJCSsgKG1jX2J1ZmZlcl9zaXplX2ggPDwgMTYpCisjZW5kaWYKKwkJCQk7CisJCQkJcGljLT5kd191X3ZfYWRyID0gcGljLT5kd195X2FkciArCisJCQkJCSgobWNfYnVmZmVyX3NpemVfdV92X2ggPDwgMTYpIDw8IDEpOworI2lmZGVmIEFWUzJfMTBCX01NVQorCQkJCXBpYy0+bWNfeV9hZHIgPSBwaWMtPmR3X3lfYWRyOworCQkJCXBpYy0+bWNfdV92X2FkciA9IHBpYy0+ZHdfdV92X2FkcjsKKyNlbmRpZgorCQkJfQorI2lmZGVmIE1WX1VTRV9GSVhFRF9CVUYKKyNpZmRlZiBHMTJBX0JSSU5HVVBfREVCVUcKKwkJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkgeworCQkJCXBpYy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkciA9CisJCQkJZGVjLT53b3JrX3NwYWNlX2J1Zi0+bXByZWRfbXYuYnVmX3N0YXJ0ICsKKwkJCQkJKHBpYy0+aW5kZXggKiAweDEyMDAwMCAqIDQpOworCQkJfSBlbHNlIHsKKwkJCQlwaWMtPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIgPQorCQkJCWRlYy0+d29ya19zcGFjZV9idWYtPm1wcmVkX212LmJ1Zl9zdGFydCArCisJCQkJCShwaWMtPmluZGV4ICogMHgxMjAwMDApOworCQkJfQorI2Vsc2UKKwkJCXBpYy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkciA9CisJCQlkZWMtPndvcmtfc3BhY2VfYnVmLT5tcHJlZF9tdi5idWZfc3RhcnQgKworCQkJCQkoKHBpYy0+aW5kZXggKiBsY3VfdG90YWwpCisJCQkJCSogTVZfTUVNX1VOSVQpOworI2VuZGlmCisjZW5kaWYKKwkJCWlmIChkZWJ1ZykgeworCQkJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1IsCisJCQkJIiVzIGluZGV4ICVkIEJVRl9pbmRleCAlZCBtY195X2FkciAleCAiLAorCQkJCV9fZnVuY19fLCBwaWMtPmluZGV4LAorCQkJCXBpYy0+QlVGX2luZGV4LAorCQkJCXBpYy0+bWNfeV9hZHIpOworCQkJCWF2czJfcHJpbnRfY29udChkZWMsIEFWUzJfREJHX0JVRk1HUiwKKwkJCQkiY29tcF9ib2R5X3NpemUgJXggY29tcF9idWZfc2l6ZSAleCAiLAorCQkJCXBpYy0+Y29tcF9ib2R5X3NpemUsCisJCQkJcGljLT5idWZfc2l6ZSk7CisJCQkJYXZzMl9wcmludF9jb250KGRlYywgQVZTMl9EQkdfQlVGTUdSLAorCQkJCSJtcHJlZF9tdl93cl9zdGFydF9hZHIgJWRcbiIsCisJCQkJcGljLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyKTsKKwkJCQlhdnMyX3ByaW50X2NvbnQoZGVjLCBBVlMyX0RCR19CVUZNR1IsCisJCQkJCSJkd195X2FkciAlZCwgcGljLT5kd191X3ZfYWRyID0lZFxuIiwKKwkJCQkJcGljLT5kd195X2FkciwKKwkJCQkJcGljLT5kd191X3ZfYWRyKTsKKwkJCX0KKwkJCXJldCA9IDA7CisJCX0KKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJfSBlbHNlIHsKKwkJYXZzMl9wcmludChkZWMsIDAsCisJCQkibXYgYnVmZmVyIGFsbG9jIGZhaWwgJXggPiAleFxuIiwKKwkJZGVjLT53b3JrX3NwYWNlX2J1Zi0+bXByZWRfbXYuYnVmX3N0YXJ0ICsKKwkJKCgoaSArIDEpICogbGN1X3RvdGFsKSAqIE1WX01FTV9VTklUKSwKKwkJbXByZWRfbXZfZW5kKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpbml0X3BpY19saXN0KHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMsCisJaW50MzJfdCBsY3Vfc2l6ZV9sb2cyKQoreworCWludCBpOworCXN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjID0gJmRlYy0+YXZzMl9kZWM7CisJc3RydWN0IGF2czJfZnJhbWVfcyAqcGljOworI2lmZGVmIEFWUzJfMTBCX01NVQorCXVuc2lnbmVkIGxvbmcgYnVmX2FkZHIxOworCS8qYWxsb2MgQVZTMiBjb21wcmVzcyBoZWFkZXIgZmlyc3QqLworCQlpZiAoZGVjb2Rlcl9ibW11X2JveF9hbGxvY19idWZfcGh5CisJCQkJKGRlYy0+Ym1tdV9ib3gsCisJCQkJSEVBREVSX0JVRkZFUl9JRFgoLTEpLCBnZXRfY29tcHJlc3NfaGVhZGVyX3NpemUoZGVjKSwKKwkJCQlEUklWRVJfSEVBREVSX05BTUUsCisJCQkJJmJ1Zl9hZGRyMSkgPCAwKXsKKwkJCWF2czJfcHJpbnQoZGVjLCAwLAorCQkJCSIlcyBtYWxsb2MgY29tcHJlc3MgaGVhZGVyIGZhaWxlZCAlZFxuIiwKKwkJCQlEUklWRVJfSEVBREVSX05BTUUsIC0xKTsKKwkJCWRlYy0+ZmF0YWxfZXJyb3IgfD0gREVDT0RFUl9GQVRBTF9FUlJPUl9OT19NRU07CisJCQlyZXR1cm47CisJCX0KKyNpZm5kZWYgRFlOQU1JQ19BTExPQ19IRUFECisJZm9yIChpID0gMDsgaSA8IGRlYy0+dXNlZF9idWZfbnVtOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBidWZfYWRkcjsKKwkJaWYgKGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeQorCQkJCShkZWMtPmJtbXVfYm94LAorCQkJCUhFQURFUl9CVUZGRVJfSURYKGkpLCBnZXRfY29tcHJlc3NfaGVhZGVyX3NpemUoZGVjKSwKKwkJCQlEUklWRVJfSEVBREVSX05BTUUsCisJCQkJJmJ1Zl9hZGRyKSA8IDApeworCQkJYXZzMl9wcmludChkZWMsIDAsCisJCQkJIiVzIG1hbGxvYyBjb21wcmVzcyBoZWFkZXIgZmFpbGVkICVkXG4iLAorCQkJCURSSVZFUl9IRUFERVJfTkFNRSwgaSk7CisJCQlkZWMtPmZhdGFsX2Vycm9yIHw9IERFQ09ERVJfRkFUQUxfRVJST1JfTk9fTUVNOworCQkJcmV0dXJuOworCQl9CisJfQorI2VuZGlmCisjZW5kaWYKKwlkZWMtPmZyYW1lX2hlaWdodCA9IGF2czJfZGVjLT5pbWcuaGVpZ2h0OworCWRlYy0+ZnJhbWVfd2lkdGggPSBhdnMyX2RlYy0+aW1nLndpZHRoOworCisJZm9yIChpID0gMDsgaSA8IGRlYy0+dXNlZF9idWZfbnVtOyBpKyspIHsKKwkJaWYgKGkgPT0gKGRlYy0+dXNlZF9idWZfbnVtIC0gMSkpCisJCQlwaWMgPSBhdnMyX2RlYy0+bV9iZzsKKwkJZWxzZQorCQkJcGljID0gYXZzMl9kZWMtPmZyZWZbaV07CisJCXBpYy0+aW5kZXggPSBpOworCQlwaWMtPkJVRl9pbmRleCA9IC0xOworCQlwaWMtPm12X2J1Zl9pbmRleCA9IC0xOworCQlpZiAoY29uZmlnX3BpYyhkZWMsIHBpYywgbGN1X3NpemVfbG9nMikgPCAwKSB7CisJCQlpZiAoZGVidWcpCisJCQkJYXZzMl9wcmludChkZWMsIDAsCisJCQkJCSJDb25maWdfcGljICVkIGZhaWxcbiIsCisJCQkJCXBpYy0+aW5kZXgpOworCQkJcGljLT5pbmRleCA9IC0xOworCQkJYnJlYWs7CisJCX0KKwkJcGljLT5waWNfdyA9IGF2czJfZGVjLT5pbWcud2lkdGg7CisJCXBpYy0+cGljX2ggPSBhdnMyX2RlYy0+aW1nLmhlaWdodDsKKwl9CisJZm9yICg7IGkgPCBkZWMtPnVzZWRfYnVmX251bTsgaSsrKSB7CisJCWlmIChpID09IChkZWMtPnVzZWRfYnVmX251bSAtIDEpKQorCQkJcGljID0gYXZzMl9kZWMtPm1fYmc7CisJCWVsc2UKKwkJCXBpYyA9IGF2czJfZGVjLT5mcmVmW2ldOworCQlwaWMtPmluZGV4ID0gLTE7CisJCXBpYy0+QlVGX2luZGV4ID0gLTE7CisJCXBpYy0+bXZfYnVmX2luZGV4ID0gLTE7CisJfQorCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1IsCisJCSIlcyBvaywgdXNlZF9idWZfbnVtID0gJWRcbiIsCisJCV9fZnVuY19fLCBkZWMtPnVzZWRfYnVmX251bSk7CisJZGVjLT5waWNfbGlzdF9pbml0X2ZsYWcgPSAxOworfQorCisKK3N0YXRpYyB2b2lkIGluaXRfcGljX2xpc3RfaHcoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYyA9ICZkZWMtPmF2czJfZGVjOworCXN0cnVjdCBhdnMyX2ZyYW1lX3MgKnBpYzsKKwkvKldSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0NPTkZfQUREUiwgMHgwKTsqLworI2lmIDAKKwlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9DT05GX0FERFIsCisJCSgweDEgPDwgMSkgfCAoMHgxIDw8IDIpKTsKKworI2lmZGVmIERVQUxfQ09SRV82NAorCVdSSVRFX1ZSRUcoSEVWQzJfSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0NPTkZfQUREUiwKKwkJKDB4MSA8PCAxKSB8ICgweDEgPDwgMikpOworI2VuZGlmCisjZW5kaWYKKwlmb3IgKGkgPSAwOyBpIDwgZGVjLT51c2VkX2J1Zl9udW07IGkrKykgeworCQlpZiAoaSA9PSAoZGVjLT51c2VkX2J1Zl9udW0gLSAxKSkKKwkJCXBpYyA9IGF2czJfZGVjLT5tX2JnOworCQllbHNlCisJCQlwaWMgPSBhdnMyX2RlYy0+ZnJlZltpXTsKKwkJaWYgKHBpYy0+aW5kZXggPCAwKQorCQkJYnJlYWs7CisjaWZkZWYgQVZTMl8xMEJfTU1VCisJLypXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9DTURfQUREUiwKKwkJcGljLT5oZWFkZXJfYWRyCisJCXwgKHBpYy0+bWNfY2FudmFzX3kgPDwgOCl8MHgxKTsqLworCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9DT05GX0FERFIsCisJCQkoMHgxIDw8IDEpIHwgKHBpYy0+aW5kZXggPDwgOCkpOworCisjaWZkZWYgRFVBTF9DT1JFXzY0CisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hMWDIpCisJCVdSSVRFX1ZSRUcoSEVWQzJfTVBQX0FOQzJBWElfVEJMX0NPTkZfQUREUiwKKwkJCSgweDEgPDwgMSkgfCAocGljLT5pbmRleCA8PCA4KSk7CisJZWxzZQorCQlXUklURV9WUkVHKEhFVkMyX0hFVkNEX01QUF9BTkMyQVhJX1RCTF9DT05GX0FERFIsCisJCQkoMHgxIDw8IDEpIHwgKHBpYy0+aW5kZXggPDwgOCkpOworI2VuZGlmCisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DMkFYSV9UQkxfREFUQSwgcGljLT5oZWFkZXJfYWRyID4+IDUpOworI2Vsc2UKKwkvKldSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0NNRF9BRERSLAorCQlwaWMtPm1jX3lfYWRyCisJCXwgKHBpYy0+bWNfY2FudmFzX3kgPDwgOCkgfCAweDEpOyovCisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DMkFYSV9UQkxfREFUQSwgcGljLT5tY195X2FkciA+PiA1KTsKKyNlbmRpZgorI2lmbmRlZiBMT1NMRVNTX0NPTVBSRVNTX01PREUKKwkvKldSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0NNRF9BRERSLAorCQlwaWMtPm1jX3Vfdl9hZHIKKwkJfCAocGljLT5tY19jYW52YXNfdV92IDw8IDgpfCAweDEpOyovCisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DMkFYSV9UQkxfREFUQSwgcGljLT5tY191X3ZfYWRyID4+IDUpOworI2VuZGlmCisjaWZkZWYgRFVBTF9DT1JFXzY0CisjaWZkZWYgQVZTMl8xMEJfTU1VCisJV1JJVEVfVlJFRyhIRVZDMl9IRVZDRF9NUFBfQU5DMkFYSV9UQkxfREFUQSwKKwkJcGljLT5oZWFkZXJfYWRyID4+IDUpOworI2Vsc2UKKwlXUklURV9WUkVHKEhFVkMyX0hFVkNEX01QUF9BTkMyQVhJX1RCTF9EQVRBLAorCQlwaWMtPm1jX3lfYWRyID4+IDUpOworI2VuZGlmCisjaWZuZGVmIExPU0xFU1NfQ09NUFJFU1NfTU9ERQorCVdSSVRFX1ZSRUcoSEVWQzJfSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0RBVEEsCisJCXBpYy0+bWNfdV92X2FkciA+PiA1KTsKKyNlbmRpZgorLypEVUFMX0NPUkVfNjQqLworI2VuZGlmCisJfQorCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0NPTkZfQUREUiwgMHgxKTsKKyNpZmRlZiBEVUFMX0NPUkVfNjQKKwlXUklURV9WUkVHKEhFVkMyX0hFVkNEX01QUF9BTkMyQVhJX1RCTF9DT05GX0FERFIsCisJCTB4MSk7CisjZW5kaWYKKwkvKlplcm8gb3V0IGNhbnZhcyByZWdpc3RlcnMgaW4gSVBQIC0tIGF2b2lkIHNpbXVsYXRpb24gWCovCisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwKKwkJCSgwIDw8IDgpIHwgKDAgPDwgMSkgfCAxKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUiwgMCk7CisjaWZkZWYgRFVBTF9DT1JFXzY0CisJCVdSSVRFX1ZSRUcoSEVWQzJfSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSLCAwKTsKKyNlbmRpZgorCX0KK30KKworCitzdGF0aWMgdm9pZCBkdW1wX3BpY19saXN0KHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMpCit7CisJaW50IGlpOworCXN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjID0gJmRlYy0+YXZzMl9kZWM7CisJZm9yIChpaSA9IDA7IGlpIDwgYXZzMl9kZWMtPnJlZl9tYXhidWZmZXI7IGlpKyspIHsKKwkJYXZzMl9wcmludChkZWMsIDAsCisJCSJmcmVmWyVkXTogaW5kZXggJWQgZGVjb2RlX2lkICVkIG12YnVmICVkIGltZ2NvaV9yZWYgJWQgaW1ndHJfZndSZWZEaXN0YW5jZSAlZCByZWZlcmVkICVkLCBwcmUgJWQgaXNfb3V0ICVkLCBiZyAlZCwgdmZfcmVmICVkIGVycm9yICVkIGxjdSAlZCByZWZfcG9zKCVkLCVkLCVkLCVkLCVkLCVkLCVkKVxuIiwKKwkJaWksIGF2czJfZGVjLT5mcmVmW2lpXS0+aW5kZXgsCisJCWF2czJfZGVjLT5mcmVmW2lpXS0+ZGVjb2RlX2lkeCwKKwkJYXZzMl9kZWMtPmZyZWZbaWldLT5tdl9idWZfaW5kZXgsCisJCWF2czJfZGVjLT5mcmVmW2lpXS0+aW1nY29pX3JlZiwKKwkJYXZzMl9kZWMtPmZyZWZbaWldLT5pbWd0cl9md1JlZkRpc3RhbmNlLAorCQlhdnMyX2RlYy0+ZnJlZltpaV0tPnJlZmVyZWRfYnlfb3RoZXJzLAorCQlhdnMyX2RlYy0+ZnJlZltpaV0tPnRvX3ByZXBhcmVfZGlzcCwKKwkJYXZzMl9kZWMtPmZyZWZbaWldLT5pc19vdXRwdXQsCisJCWF2czJfZGVjLT5mcmVmW2lpXS0+YmdfZmxhZywKKwkJYXZzMl9kZWMtPmZyZWZbaWldLT52Zl9yZWYsCisJCWF2czJfZGVjLT5mcmVmW2lpXS0+ZXJyb3JfbWFyaywKKwkJYXZzMl9kZWMtPmZyZWZbaWldLT5kZWNvZGVkX2xjdSwKKwkJYXZzMl9kZWMtPmZyZWZbaWldLT5yZWZfcG9jWzBdLAorCQlhdnMyX2RlYy0+ZnJlZltpaV0tPnJlZl9wb2NbMV0sCisJCWF2czJfZGVjLT5mcmVmW2lpXS0+cmVmX3BvY1syXSwKKwkJYXZzMl9kZWMtPmZyZWZbaWldLT5yZWZfcG9jWzNdLAorCQlhdnMyX2RlYy0+ZnJlZltpaV0tPnJlZl9wb2NbNF0sCisJCWF2czJfZGVjLT5mcmVmW2lpXS0+cmVmX3BvY1s1XSwKKwkJYXZzMl9kZWMtPmZyZWZbaWldLT5yZWZfcG9jWzZdCisJCSk7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIGludCBjb25maWdfbWNfYnVmZmVyKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMpCit7CisJaW50MzJfdCBpOworCXN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjID0gJmRlYy0+YXZzMl9kZWM7CisJc3RydWN0IGF2czJfZnJhbWVfcyAqcGljOworCXN0cnVjdCBhdnMyX2ZyYW1lX3MgKmN1cl9waWMgPSBhdnMyX2RlYy0+aGMuY3VyX3BpYzsKKworCS8qaWYgKGF2czJfZGVjLT5pbWcudHlwZSA9PSBJX0lNRykKKwlyZXR1cm4gMDsKKwkqLworCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1JfREVUQUlMLAorCQkiRW50ZXJlZCBjb25maWdfbWNfYnVmZmVyLi4uLlxuIik7CisJaWYgKGF2czJfZGVjLT5mX2JnICE9IE5VTEwpIHsKKwkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUl9ERVRBSUwsCisJCQkiY29uZmlnX21jX2J1ZmZlciBmb3IgYmFja2dyb3VuZCAoY2FudmFzX3kgJWQsIGNhbnZhc191X3YgJWQpXG4iLAorCQlhdnMyX2RlYy0+Zl9iZy0+bWNfY2FudmFzX3ksIGF2czJfZGVjLT5mX2JnLT5tY19jYW52YXNfdV92KTsKKwkJLypXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0FDQ0NPTkZJR19BRERSLAorCQkJKDcgPDwgOCkgfCAoMDw8MSkgfCAxKTsgICAgTDA6QkcgKi8KKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwKKwkJCSgxNSA8PCA4KSB8ICgwPDwxKSB8IDEpOyAgIC8qIEwwOkJHKi8KKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIsCisJCQkoYXZzMl9kZWMtPmZfYmctPm1jX2NhbnZhc191X3YgPDwgMTYpIHwKKwkJCShhdnMyX2RlYy0+Zl9iZy0+bWNfY2FudmFzX3VfdiA8PCA4KSB8CisJCQlhdnMyX2RlYy0+Zl9iZy0+bWNfY2FudmFzX3kpOworCQkvKldSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfQUNDQ09ORklHX0FERFIsCisJCQkoMjMgPDwgOCkgfCAoMDw8MSkgfCAxKTsgICBMMTpCRyovCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfQUNDQ09ORklHX0FERFIsCisJCQkoMzEgPDwgOCkgfCAoMDw8MSkgfCAxKTsgIC8qIEwxOkJHKi8KKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIsCisJCQkoYXZzMl9kZWMtPmZfYmctPm1jX2NhbnZhc191X3YgPDwgMTYpIHwKKwkJCShhdnMyX2RlYy0+Zl9iZy0+bWNfY2FudmFzX3VfdiA8PCA4KSB8CisJCQlhdnMyX2RlYy0+Zl9iZy0+bWNfY2FudmFzX3kpOworCX0KKworCWlmIChhdnMyX2RlYy0+aW1nLnR5cGUgPT0gSV9JTUcpCisJCXJldHVybiAwOworCisJaWYgKGF2czJfZGVjLT5pbWcudHlwZSA9PSBQX0lNRykgeworCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX0RFVEFJTCwKKwkJCSJjb25maWdfbWNfYnVmZmVyIGZvciBQX0lNRywgaW1nIHR5cGUgJWRcbiIsCisJCQlhdnMyX2RlYy0+aW1nLnR5cGUpOworCQkvKnJlZmVyIHRvIHByZXBhcmVfUmVmSW5mbygpKi8KKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwKKwkJCSgwIDw8IDgpIHwgKDA8PDEpIHwgMSk7CisJCWZvciAoaSA9IDA7IGkgPCBhdnMyX2RlYy0+aW1nLm51bV9vZl9yZWZlcmVuY2VzOyBpKyspIHsKKwkJCXBpYyA9IGF2czJfZGVjLT5mcmVmW2ldOworCQkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIsCisJCQkocGljLT5tY19jYW52YXNfdV92IDw8IDE2KSB8CisJCQkocGljLT5tY19jYW52YXNfdV92IDw8IDgpIHwKKwkJCXBpYy0+bWNfY2FudmFzX3kpOworCisJCQlpZiAocGljLT5lcnJvcl9tYXJrKQorCQkJCWN1cl9waWMtPmVycm9yX21hcmsgPSAxOworCisJCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX0RFVEFJTCwKKwkJCQkicmVmaWQgJXggbWNfY2FudmFzX3VfdiAleCBtY19jYW52YXNfeSAleCBlcnJvcl9tYXJrICV4XG4iLAorCQkJCWksIHBpYy0+bWNfY2FudmFzX3VfdiwgcGljLT5tY19jYW52YXNfeSwKKwkJCQlwaWMtPmVycm9yX21hcmspOworCQl9CisJfSBlbHNlIGlmIChhdnMyX2RlYy0+aW1nLnR5cGUgPT0gRl9JTUcpIHsKKwkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUl9ERVRBSUwsCisJCQkiY29uZmlnX21jX2J1ZmZlciBmb3IgRl9JTUcsIGltZyB0eXBlICVkXG4iLAorCQkJYXZzMl9kZWMtPmltZy50eXBlKTsKKwkJLypyZWZlciB0byBwcmVwYXJlX1JlZkluZm8oKSovCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfQUNDQ09ORklHX0FERFIsCisJCQkoMCA8PCA4KSB8ICgwPDwxKSB8IDEpOworCQlmb3IgKGkgPSAwOyBpIDwgYXZzMl9kZWMtPmltZy5udW1fb2ZfcmVmZXJlbmNlczsgaSsrKSB7CisJCQlwaWMgPSBhdnMyX2RlYy0+ZnJlZltpXTsKKwkJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSLAorCQkJCShwaWMtPm1jX2NhbnZhc191X3YgPDwgMTYpIHwKKwkJCQkocGljLT5tY19jYW52YXNfdV92IDw8IDgpIHwKKwkJCQlwaWMtPm1jX2NhbnZhc195KTsKKworCQkJaWYgKHBpYy0+ZXJyb3JfbWFyaykKKwkJCQljdXJfcGljLT5lcnJvcl9tYXJrID0gMTsKKworCQkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUl9ERVRBSUwsCisJCQkJInJlZmlkICV4IG1jX2NhbnZhc191X3YgJXggbWNfY2FudmFzX3kgJXggZXJyb3JfbWFyayAleFxuIiwKKwkJCQlpLCBwaWMtPm1jX2NhbnZhc191X3YsIHBpYy0+bWNfY2FudmFzX3ksCisJCQkJcGljLT5lcnJvcl9tYXJrKTsKKwkJfQorCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0FDQ0NPTkZJR19BRERSLAorCQkJKDE2IDw8IDgpIHwgKDA8PDEpIHwgMSk7CisJCWZvciAoaSA9IDA7IGkgPCBhdnMyX2RlYy0+aW1nLm51bV9vZl9yZWZlcmVuY2VzOyBpKyspIHsKKwkJCXBpYyA9IGF2czJfZGVjLT5mcmVmW2ldOworCQkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIsCisJCQkJKHBpYy0+bWNfY2FudmFzX3VfdiA8PCAxNikgfAorCQkJCShwaWMtPm1jX2NhbnZhc191X3YgPDwgOCkgfAorCQkJCXBpYy0+bWNfY2FudmFzX3kpOworCQkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUl9ERVRBSUwsCisJCQkJInJlZmlkICV4IG1jX2NhbnZhc191X3YgJXggbWNfY2FudmFzX3kgJXhcbiIsCisJCQkJaSwgcGljLT5tY19jYW52YXNfdV92LCBwaWMtPm1jX2NhbnZhc195KTsKKwkJfQorCX0gZWxzZSB7CisJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1JfREVUQUlMLAorCQkJImNvbmZpZ19tY19idWZmZXIgZm9yIEJfSU1HXG4iKTsKKwkJLypyZWZlciB0byBwcmVwYXJlX1JlZkluZm8oKSovCisJCXBpYyA9IGF2czJfZGVjLT5mcmVmWzFdOworCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0FDQ0NPTkZJR19BRERSLAorCQkJKDAgPDwgOCkgfCAoMDw8MSkgfCAxKTsKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIsCisJCQkocGljLT5tY19jYW52YXNfdV92IDw8IDE2KSB8CisJCQkocGljLT5tY19jYW52YXNfdV92IDw8IDgpIHwKKwkJCXBpYy0+bWNfY2FudmFzX3kpOworCisJCWlmIChwaWMtPmVycm9yX21hcmspCisJCQljdXJfcGljLT5lcnJvcl9tYXJrID0gMTsKKworCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX0RFVEFJTCwKKwkJCSJyZWZpZCAleCBtY19jYW52YXNfdV92ICV4IG1jX2NhbnZhc195ICV4IGVycm9yX21hcmsgJXhcbiIsCisJCQkxLCBwaWMtPm1jX2NhbnZhc191X3YsIHBpYy0+bWNfY2FudmFzX3ksCisJCQlwaWMtPmVycm9yX21hcmspOworCisJCXBpYyA9IGF2czJfZGVjLT5mcmVmWzBdOworCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0FDQ0NPTkZJR19BRERSLAorCQkJKDE2IDw8IDgpIHwgKDA8PDEpIHwgMSk7CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSLAorCQkJKHBpYy0+bWNfY2FudmFzX3Vfdjw8MTYpIHwKKwkJCShwaWMtPm1jX2NhbnZhc191X3Y8PDgpIHwKKwkJCXBpYy0+bWNfY2FudmFzX3kpOworCisJCWlmIChwaWMtPmVycm9yX21hcmspCisJCQljdXJfcGljLT5lcnJvcl9tYXJrID0gMTsKKworCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX0RFVEFJTCwKKwkJCSJyZWZpZCAleCBtY19jYW52YXNfdV92ICV4IG1jX2NhbnZhc195ICV4IGVycm9yX21hcmsgJXhcbiIsCisJCQkwLCBwaWMtPm1jX2NhbnZhc191X3YsIHBpYy0+bWNfY2FudmFzX3ksCisJCQlwaWMtPmVycm9yX21hcmspOworCX0KKwlyZXR1cm4gMDsKK30KKyNpZiAwCitzdGF0aWMgdm9pZCBtY3JjY19nZXRfaGl0cmF0ZSh2b2lkKQoreworCXUzMiB0bXA7CisJdTMyIHJhd19tY3JfY250OworCXUzMiBoaXRfbWNyX2NudDsKKwl1MzIgYnlwX21jcl9jbnRfbmNob3V0d2luOworCXUzMiBieXBfbWNyX2NudF9uY2hjYW52OworCWludCBoaXRyYXRlOworCisJaWYgKGRlYnVnICYgQVZTMl9EQkdfQ0FDSEUpCisJCXByX2luZm8oIltjYWNoZV91dGlsLmNdIEVudGVyZWQgbWNyY2NfZ2V0X2hpdHJhdGUuLi5cbiIpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4MDw8MSkpOworCXJhd19tY3JfY250ID0gUkVBRF9WUkVHKEhFVkNEX01DUkNDX1BFUkZNT05fREFUQSk7CisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHgxPDwxKSk7CisJaGl0X21jcl9jbnQgPSBSRUFEX1ZSRUcoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9EQVRBKTsKKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDI8PDEpKTsKKwlieXBfbWNyX2NudF9uY2hvdXR3aW4gPSBSRUFEX1ZSRUcoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9EQVRBKTsKKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDM8PDEpKTsKKwlieXBfbWNyX2NudF9uY2hjYW52ID0gUkVBRF9WUkVHKEhFVkNEX01DUkNDX1BFUkZNT05fREFUQSk7CisKKwlpZiAoZGVidWcgJiBBVlMyX0RCR19DQUNIRSkgeworCQlwcl9pbmZvKCJyYXdfbWNyX2NudF90b3RhbDogJWRcbiIscmF3X21jcl9jbnQpOworCQlwcl9pbmZvKCJoaXRfbWNyX2NudF90b3RhbDogJWRcbiIsaGl0X21jcl9jbnQpOworCQlwcl9pbmZvKCJieXBfbWNyX2NudF9uY2hvdXR3aW5fdG90YWw6ICVkXG4iLGJ5cF9tY3JfY250X25jaG91dHdpbik7CisJCXByX2luZm8oImJ5cF9tY3JfY250X25jaGNhbnZfdG90YWw6ICVkXG4iLGJ5cF9tY3JfY250X25jaGNhbnYpOworCX0KKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDQ8PDEpKTsKKwl0bXAgPSBSRUFEX1ZSRUcoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9EQVRBKTsKKwlpZiAoZGVidWcgJiBBVlMyX0RCR19DQUNIRSkKKwkJcHJfaW5mbygibWlzc19tY3JfMF9jbnRfdG90YWw6ICVkXG4iLCB0bXApOworCisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHg1PDwxKSk7CisJdG1wID0gUkVBRF9WUkVHKEhFVkNEX01DUkNDX1BFUkZNT05fREFUQSk7CisJaWYgKGRlYnVnICYgQVZTMl9EQkdfQ0FDSEUpCisJCXByX2luZm8oIm1pc3NfbWNyXzFfY250X3RvdGFsOiAlZFxuIiwgdG1wKTsKKworCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4Njw8MSkpOworCXRtcCA9IFJFQURfVlJFRyhIRVZDRF9NQ1JDQ19QRVJGTU9OX0RBVEEpOworCWlmIChkZWJ1ZyAmIEFWUzJfREJHX0NBQ0hFKQorCQlwcl9pbmZvKCJoaXRfbWNyXzBfY250X3RvdGFsOiAlZFxuIix0bXApOworCisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHg3PDwxKSk7CisJdG1wPSBSRUFEX1ZSRUcoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9EQVRBKTsKKwlpZiAoZGVidWcgJiBBVlMyX0RCR19DQUNIRSkKKwkJcHJfaW5mbygiaGl0X21jcl8xX2NudF90b3RhbDogJWRcbiIsdG1wKTsKKworCWlmIChyYXdfbWNyX2NudCAhPSAwKSB7CisJCWhpdHJhdGUgPSAoaGl0X21jcl9jbnQgLyByYXdfbWNyX2NudCkgKiAxMDA7CisJCWlmIChkZWJ1ZyAmIEFWUzJfREJHX0NBQ0hFKQorCQkJcHJfaW5mbygiTUNSQ0NfSElUX1JBVEUgOiAlZFxuIiwgaGl0cmF0ZSk7CisJCWhpdHJhdGUgPSAoKGJ5cF9tY3JfY250X25jaG91dHdpbiArIGJ5cF9tY3JfY250X25jaGNhbnYpCisJCQkvcmF3X21jcl9jbnQpICogMTAwOworCQlpZiAoZGVidWcgJiBBVlMyX0RCR19DQUNIRSkKKwkJCXByX2luZm8oIk1DUkNDX0JZUF9SQVRFIDogJWRcbiIsIGhpdHJhdGUpOworCX0gZWxzZSBpZiAoZGVidWcgJiBBVlMyX0RCR19DQUNIRSkgeworCQkJcHJfaW5mbygiTUNSQ0NfSElUX1JBVEUgOiBuYVxuIik7CisJCQlwcl9pbmZvKCJNQ1JDQ19CWVBfUkFURSA6IG5hXG4iKTsKKwl9CisJcmV0dXJuOworfQorCisKK3N0YXRpYyB2b2lkICBkZWNvbXBfZ2V0X2hpdHJhdGUodm9pZCkKK3sKKwl1MzIgcmF3X21jcl9jbnQ7CisJdTMyIGhpdF9tY3JfY250OworCWludCBoaXRyYXRlOworCisJaWYgKGRlYnVnICYgQVZTMl9EQkdfQ0FDSEUpCisJCXByX2luZm8oIltjYWNoZV91dGlsLmNdIEVudGVyZWQgZGVjb21wX2dldF9oaXRyYXRlLi4uXG4iKTsKKwlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4MDw8MSkpOworCXJhd19tY3JfY250ID0gUkVBRF9WUkVHKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9EQVRBKTsKKwlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4MTw8MSkpOworCWhpdF9tY3JfY250ID0gUkVBRF9WUkVHKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9EQVRBKTsKKworCWlmIChkZWJ1ZyAmIEFWUzJfREJHX0NBQ0hFKSB7CisJCXByX2luZm8oImhjYWNoZV9yYXdfY250X3RvdGFsOiAlZFxuIixyYXdfbWNyX2NudCk7CisJCXByX2luZm8oImhjYWNoZV9oaXRfY250X3RvdGFsOiAlZFxuIixoaXRfbWNyX2NudCk7CisJfQorCWlmIChyYXdfbWNyX2NudCAhPSAwKSB7CisJCWhpdHJhdGUgPSAoaGl0X21jcl9jbnQgLyByYXdfbWNyX2NudCkgKiAxMDA7CisJCWlmIChkZWJ1ZyAmIEFWUzJfREJHX0NBQ0hFKQorCQkJcHJfaW5mbygiREVDT01QX0hDQUNIRV9ISVRfUkFURSA6ICVkXG4iLCBoaXRyYXRlKTsKKwl9IGVsc2UgeworCQlpZiAoZGVidWcgJiBBVlMyX0RCR19DQUNIRSkKKwkJCXByX2luZm8oIkRFQ09NUF9IQ0FDSEVfSElUX1JBVEUgOiBuYVxuIik7CisJfQorCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHgyPDwxKSk7CisJcmF3X21jcl9jbnQgPSBSRUFEX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9QRVJGTU9OX0RBVEEpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHgzPDwxKSk7CisJaGl0X21jcl9jbnQgPSBSRUFEX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9QRVJGTU9OX0RBVEEpOworCisJaWYgKGRlYnVnICYgQVZTMl9EQkdfQ0FDSEUpIHsKKwkJcHJfaW5mbygiZGNhY2hlX3Jhd19jbnRfdG90YWw6ICVkXG4iLCByYXdfbWNyX2NudCk7CisJCXByX2luZm8oImRjYWNoZV9oaXRfY250X3RvdGFsOiAlZFxuIiwgaGl0X21jcl9jbnQpOworCX0KKwlpZiAocmF3X21jcl9jbnQgIT0gMCkgeworCQloaXRyYXRlID0gKGhpdF9tY3JfY250IC8gcmF3X21jcl9jbnQpICogMTAwOworCQlpZiAoZGVidWcgJiBBVlMyX0RCR19DQUNIRSkKKwkJCXByX2luZm8oIkRFQ09NUF9EQ0FDSEVfSElUX1JBVEUgOiAlZFxuIiwgaGl0cmF0ZSk7CisJfSBlbHNlIGlmIChkZWJ1ZyAmIEFWUzJfREJHX0NBQ0hFKSB7CisJCXByX2luZm8oIkRFQ09NUF9EQ0FDSEVfSElUX1JBVEUgOiBuYVxuIik7CisJfQorcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBkZWNvbXBfZ2V0X2NvbXByYXRlKHZvaWQpCit7CisJdTMyIHJhd191Y29tcF9jbnQ7CisJdTMyIGZhc3RfY29tcF9jbnQ7CisJdTMyIHNsb3dfY29tcF9jbnQ7CisJaW50IGNvbXByYXRlOworCisJaWYgKGRlYnVnICYgQVZTMl9EQkdfQ0FDSEUpCisJCXByX2luZm8oIltjYWNoZV91dGlsLmNdIEVudGVyZWQgZGVjb21wX2dldF9jb21wcmF0ZS4uLlxuIik7CisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDQ8PDEpKTsKKwlmYXN0X2NvbXBfY250ID0gUkVBRF9WUkVHKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9EQVRBKTsKKwlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4NTw8MSkpOworCXNsb3dfY29tcF9jbnQgPSBSRUFEX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9QRVJGTU9OX0RBVEEpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHg2PDwxKSk7CisJcmF3X3Vjb21wX2NudCA9IFJFQURfVlJFRyhIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fREFUQSk7CisJaWYgKGRlYnVnICYgQVZTMl9EQkdfQ0FDSEUpIHsKKwkJcHJfaW5mbygiZGVjb21wX2Zhc3RfY29tcF90b3RhbDogJWRcbiIsIGZhc3RfY29tcF9jbnQpOworCQlwcl9pbmZvKCJkZWNvbXBfc2xvd19jb21wX3RvdGFsOiAlZFxuIiwgc2xvd19jb21wX2NudCk7CisJCXByX2luZm8oImRlY29tcF9yYXdfdW5jb21wX3RvdGFsOiAlZFxuIiwgcmF3X3Vjb21wX2NudCk7CisJfQorCisJaWYgKHJhd191Y29tcF9jbnQgIT0gMCkgeworCQljb21wcmF0ZSA9ICgoZmFzdF9jb21wX2NudCArIHNsb3dfY29tcF9jbnQpCisJCQkvIHJhd191Y29tcF9jbnQpICogMTAwOworCQlpZiAoZGVidWcgJiBBVlMyX0RCR19DQUNIRSkKKwkJCXByX2luZm8oIkRFQ09NUF9DT01QX1JBVElPIDogJWRcbiIsIGNvbXByYXRlKTsKKwl9IGVsc2UgaWYgKGRlYnVnICYgQVZTMl9EQkdfQ0FDSEUpIHsKKwkJCXByX2luZm8oIkRFQ09NUF9DT01QX1JBVElPIDogbmFcbiIpOworCX0KKwlyZXR1cm47Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgY29uZmlnX21jcmNjX2F4aV9odyhzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCXVpbnQzMl90IHJkYXRhMzI7CisJdWludDMyX3QgcmRhdGEzMl8yOworCXN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjID0gJmRlYy0+YXZzMl9kZWM7CisKKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDEsIDB4Mik7IC8qIHJlc2V0IG1jcmNjKi8KKworCWlmIChhdnMyX2RlYy0+aW1nLnR5cGUgPT0gSV9JTUcpIHsgLyogSS1QSUMqLworCQkvKiByZW1vdmUgcmVzZXQgLS0gZGlzYWJsZXMgY2xvY2sgKi8KKwkJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwxLCAweDApOworCQlyZXR1cm47CisJfQorLyoKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpIHsKKwkJbWNyY2NfZ2V0X2hpdHJhdGUoKTsKKwkJZGVjb21wX2dldF9oaXRyYXRlKCk7CisJCWRlY29tcF9nZXRfY29tcHJhdGUoKTsKKwl9CisqLworCWlmICgoYXZzMl9kZWMtPmltZy50eXBlID09IEJfSU1HKSB8fAorCQkoYXZzMl9kZWMtPmltZy50eXBlID09IEZfSU1HKSkgeyAvKkItUElDIG9yIEZfUElDKi8KKwkJLypQcm9ncmFtbWUgY2FudmFzMCAqLworCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0FDQ0NPTkZJR19BRERSLAorCQkJKDAgPDwgOCkgfCAoMCA8PCAxKSB8IDApOworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUik7CisJCXJkYXRhMzIgPSByZGF0YTMyICYgMHhmZmZmOworCQlyZGF0YTMyID0gcmRhdGEzMiB8IChyZGF0YTMyIDw8IDE2KTsKKwkJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwyLCByZGF0YTMyKTsKKworCQkvKlByb2dyYW1tZSBjYW52YXMxICovCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfQUNDQ09ORklHX0FERFIsCisJCQkoMTYgPDwgOCkgfCAoMSA8PCAxKSB8IDApOworCQlyZGF0YTMyXzIgPSBSRUFEX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSKTsKKwkJcmRhdGEzMl8yID0gcmRhdGEzMl8yICYgMHhmZmZmOworCQlyZGF0YTMyXzIgPSByZGF0YTMyXzIgfCAocmRhdGEzMl8yIDw8IDE2KTsKKwkJaWYgKHJkYXRhMzIgPT0gcmRhdGEzMl8yKSB7CisJCQlyZGF0YTMyXzIgPQorCQkJCVJFQURfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIpOworCQkJcmRhdGEzMl8yID0gcmRhdGEzMl8yICYgMHhmZmZmOworCQkJcmRhdGEzMl8yID0gcmRhdGEzMl8yIHwgKHJkYXRhMzJfMiA8PCAxNik7CisJCX0KKwkJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwzLCByZGF0YTMyXzIpOworCX0gZWxzZSB7IC8qIFAtUElDICovCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfQUNDQ09ORklHX0FERFIsCisJCQkoMCA8PCA4KSB8ICgxIDw8IDEpIHwgMCk7CisJCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSKTsKKwkJcmRhdGEzMiA9IHJkYXRhMzIgJiAweGZmZmY7CisJCXJkYXRhMzIgPSByZGF0YTMyIHwgKHJkYXRhMzIgPDwgMTYpOworCQlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDIsIHJkYXRhMzIpOworCisJCS8qUHJvZ3JhbW1lIGNhbnZhczEqLworCQlyZGF0YTMyID0KKwkJCVJFQURfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIpOworCQlyZGF0YTMyID0gcmRhdGEzMiAmIDB4ZmZmZjsKKwkJcmRhdGEzMiA9IHJkYXRhMzIgfCAocmRhdGEzMiA8PCAxNik7CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMywgcmRhdGEzMik7CisJfQorCS8qZW5hYmxlIG1jcmNjIHByb2dyZXNzaXZlLW1vZGUgKi8KKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDEsIDB4ZmYwKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19tcHJlZF9odyhzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCXVpbnQzMl90IGRhdGEzMjsKKwlzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYyA9ICZkZWMtPmF2czJfZGVjOworCXN0cnVjdCBhdnMyX2ZyYW1lX3MgKmN1cl9waWMgPSBhdnMyX2RlYy0+aGMuY3VyX3BpYzsKKwlzdHJ1Y3QgYXZzMl9mcmFtZV9zICpjb2xfcGljID0gYXZzMl9kZWMtPmZyZWZbMF07CisJaW50MzJfdCBtcHJlZF9tdl9yZF9zdGFydF9hZGRyOworCWludDMyX3QgbXByZWRfY3Vycl9sY3VfeDsKKwlpbnQzMl90IG1wcmVkX2N1cnJfbGN1X3k7CisJaW50MzJfdCBtcHJlZF9tdl9yZF9lbmRfYWRkcjsKKwlpbnQzMl90IGFib3ZlX2VuOworCWludDMyX3QgbXZfd3JfZW47CisJaW50MzJfdCBtdl9yZF9lbjsKKwlpbnQzMl90IGNvbF9pc0ludHJhOworCWludCBtdl9tZW1fdW5pdDsKKwlpZiAoYXZzMl9kZWMtPmltZy50eXBlICE9IElfSU1HKSB7CisJCWFib3ZlX2VuID0gMTsKKwkJbXZfd3JfZW4gPSAxOworCQltdl9yZF9lbiA9IDE7CisJCWNvbF9pc0ludHJhID0gMDsKKwl9IGVsc2UgeworCQlhYm92ZV9lbiA9IDE7CisJCW12X3dyX2VuID0gMTsKKwkJbXZfcmRfZW4gPSAwOworCQljb2xfaXNJbnRyYSA9IDA7CisJfQorCisJbXByZWRfbXZfcmRfc3RhcnRfYWRkciA9CisJCWNvbF9waWMtPm1wcmVkX212X3dyX3N0YXJ0X2FkZHI7CisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfTVBSRURfQ1VSUl9MQ1UpOworCW1wcmVkX2N1cnJfbGN1X3ggPSBkYXRhMzIgJiAweGZmZmY7CisJbXByZWRfY3Vycl9sY3VfeSA9IChkYXRhMzIgPj4gMTYpICYgMHhmZmZmOworCisJbXZfbWVtX3VuaXQgPSBhdnMyX2RlYy0+bGN1X3NpemVfbG9nMiA9PSA2ID8KKwkJMHgyMDAgOiAoYXZzMl9kZWMtPmxjdV9zaXplX2xvZzIgPT0gNSA/CisJCQkweDgwIDogMHgyMCk7CisKKwltcHJlZF9tdl9yZF9lbmRfYWRkciA9CisJCW1wcmVkX212X3JkX3N0YXJ0X2FkZHIgKworCQkoKGF2czJfZGVjLT5sY3VfeF9udW0gKgorCQlhdnMyX2RlYy0+bGN1X3lfbnVtKSAqIG12X21lbV91bml0KTsKKworCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1JfREVUQUlMLAorCQkiY3VyIHBpYyBpbmRleCAlZCAgY29sIHBpYyBpbmRleCAlZFxuIiwKKwkJY3VyX3BpYy0+aW5kZXgsIGNvbF9waWMtPmluZGV4KTsKKworCisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX01WX1dSX1NUQVJUX0FERFIsCisJCWN1cl9waWMtPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIpOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9NVl9SRF9TVEFSVF9BRERSLAorCQljb2xfcGljLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyKTsKKwlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX0RFVEFJTCwKKwkJIltNUFJFRCBDT19NVl0gd3JpdGUgMHgleCAgcmVhZCAweCV4XG4iLAorCQljdXJfcGljLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyLAorCQljb2xfcGljLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyKTsKKworCWRhdGEzMiA9CisJCSgoYXZzMl9kZWMtPmJrX2ltZ19pc190b3BfZmllbGQpIDw8IDEzKSB8CisJCSgoYXZzMl9kZWMtPmhkLmJhY2tncm91bmRfcGljdHVyZV9lbmFibGUgJiAxKSA8PCAxMikgfAorCQkoKGF2czJfZGVjLT5oZC5jdXJyX1JQUy5udW1fb2ZfcmVmICYgNykgPDwgOCkgfAorCQkoKGF2czJfZGVjLT5oZC5iX3BtdnJfZW5hYmxlZCAmIDEpIDw8IDYpIHwKKwkJKChhdnMyX2RlYy0+aW1nLmlzX3RvcF9maWVsZCAmIDEpIDw8IDUpIHwKKwkJKChhdnMyX2RlYy0+aW1nLmlzX2ZpZWxkX3NlcXVlbmNlICYgMSkgPDwgNCkgfAorCQkoKGF2czJfZGVjLT5pbWcudHlwZWIgJiA3KSA8PCAxKSB8CisJCShhdnMyX2RlYy0+aGQuYmFja2dyb3VuZF9yZWZlcmVuY2VfZW5hYmxlICYgMHgxKTsKKwlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX0RFVEFJTCwKKwkJIkhFVkNfTVBSRURfQ1RSTDkgPD0gMHgleChudW0gb2YgcmVmICVkKVxuIiwKKwkJZGF0YTMyLCBhdnMyX2RlYy0+aGQuY3Vycl9SUFMubnVtX29mX3JlZik7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0NUUkw5LCBkYXRhMzIpOworCisJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUl9ERVRBSUwsCisJCSIlczogZGlzICVkICVkICVkICVkICVkICVkICVkIGZyZWYwX3JlZl9wb2MgJWQgJWQgJWQgJWQgJWQgJWQgJWRcbiIsCisJCV9fZnVuY19fLAorCQlhdnMyX2RlYy0+ZnJlZlswXS0+aW1ndHJfZndSZWZEaXN0YW5jZSwKKwkJYXZzMl9kZWMtPmZyZWZbMV0tPmltZ3RyX2Z3UmVmRGlzdGFuY2UsCisJCWF2czJfZGVjLT5mcmVmWzJdLT5pbWd0cl9md1JlZkRpc3RhbmNlLAorCQlhdnMyX2RlYy0+ZnJlZlszXS0+aW1ndHJfZndSZWZEaXN0YW5jZSwKKwkJYXZzMl9kZWMtPmZyZWZbNF0tPmltZ3RyX2Z3UmVmRGlzdGFuY2UsCisJCWF2czJfZGVjLT5mcmVmWzVdLT5pbWd0cl9md1JlZkRpc3RhbmNlLAorCQlhdnMyX2RlYy0+ZnJlZls2XS0+aW1ndHJfZndSZWZEaXN0YW5jZSwKKwkJYXZzMl9kZWMtPmZyZWZbMF0tPnJlZl9wb2NbMF0sCisJCWF2czJfZGVjLT5mcmVmWzBdLT5yZWZfcG9jWzFdLAorCQlhdnMyX2RlYy0+ZnJlZlswXS0+cmVmX3BvY1syXSwKKwkJYXZzMl9kZWMtPmZyZWZbMF0tPnJlZl9wb2NbM10sCisJCWF2czJfZGVjLT5mcmVmWzBdLT5yZWZfcG9jWzRdLAorCQlhdnMyX2RlYy0+ZnJlZlswXS0+cmVmX3BvY1s1XSwKKwkJYXZzMl9kZWMtPmZyZWZbMF0tPnJlZl9wb2NbNl0KKwkJKTsKKwlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX0RFVEFJTCwKKwkJInBpY19kaXN0YW5jZSAlZCwgaW1ndHJfbmV4dF9QICVkXG4iLAorCQlhdnMyX2RlYy0+aW1nLnBpY19kaXN0YW5jZSwgYXZzMl9kZWMtPmltZy5pbWd0cl9uZXh0X1ApOworCisKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfQ1VSX1BPQywgYXZzMl9kZWMtPmltZy5waWNfZGlzdGFuY2UpOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9DT0xfUE9DLCBhdnMyX2RlYy0+aW1nLmltZ3RyX25leHRfUCk7CisKKwkvKmJlbG93IE1QUkVEIFJlZl9QT0NfeHhfTHggcmVnaXN0ZXJzCisJCW11c3QgZm9sbG93IFJlZl9QT0NfeHhfTDAgLT4KKwkJUmVmX1BPQ194eF9MMSBpbiBwYWlyIHdyaXRlIG9yZGVyISEhKi8KKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDBfUkVGMDBfUE9DLAorCQlhdnMyX2RlYy0+ZnJlZlswXS0+aW1ndHJfZndSZWZEaXN0YW5jZSk7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wxX1JFRjAwX1BPQywKKwkJYXZzMl9kZWMtPmZyZWZbMF0tPnJlZl9wb2NbMF0pOworCisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wwX1JFRjAxX1BPQywKKwkJYXZzMl9kZWMtPmZyZWZbMV0tPmltZ3RyX2Z3UmVmRGlzdGFuY2UpOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMV9SRUYwMV9QT0MsCisJCWF2czJfZGVjLT5mcmVmWzBdLT5yZWZfcG9jWzFdKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMF9SRUYwMl9QT0MsCisJCWF2czJfZGVjLT5mcmVmWzJdLT5pbWd0cl9md1JlZkRpc3RhbmNlKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDFfUkVGMDJfUE9DLAorCQlhdnMyX2RlYy0+ZnJlZlswXS0+cmVmX3BvY1syXSk7CisKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDBfUkVGMDNfUE9DLAorCQlhdnMyX2RlYy0+ZnJlZlszXS0+aW1ndHJfZndSZWZEaXN0YW5jZSk7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wxX1JFRjAzX1BPQywKKwkJYXZzMl9kZWMtPmZyZWZbMF0tPnJlZl9wb2NbM10pOworCisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wwX1JFRjA0X1BPQywKKwkJYXZzMl9kZWMtPmZyZWZbNF0tPmltZ3RyX2Z3UmVmRGlzdGFuY2UpOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMV9SRUYwNF9QT0MsCisJCWF2czJfZGVjLT5mcmVmWzBdLT5yZWZfcG9jWzRdKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMF9SRUYwNV9QT0MsCisJCWF2czJfZGVjLT5mcmVmWzVdLT5pbWd0cl9md1JlZkRpc3RhbmNlKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDFfUkVGMDVfUE9DLAorCQlhdnMyX2RlYy0+ZnJlZlswXS0+cmVmX3BvY1s1XSk7CisKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDBfUkVGMDZfUE9DLAorCQlhdnMyX2RlYy0+ZnJlZls2XS0+aW1ndHJfZndSZWZEaXN0YW5jZSk7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wxX1JFRjA2X1BPQywKKwkJYXZzMl9kZWMtPmZyZWZbMF0tPnJlZl9wb2NbNl0pOworCisKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfUkRfRU5EX0FERFIsCisJCW1wcmVkX212X3JkX2VuZF9hZGRyKTsKK30KKworc3RhdGljIHZvaWQgY29uZmlnX2RibGtfaHcoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYykKK3sKKwkvKgorCSogUGljdHVyZSBsZXZlbCBkZS1ibG9jayBwYXJhbWV0ZXIgY29uZmlndXJhdGlvbiBoZXJlCisJKi8KKwlzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYyA9ICZkZWMtPmF2czJfZGVjOworCXVuaW9uIHBhcmFtX3UgKnJwbV9wYXJhbSA9ICZhdnMyX2RlYy0+cGFyYW07CisJdWludDMyX3QgZGF0YTMyOworCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfREJMS19DRkcxKTsKKwlkYXRhMzIgPSAoKChkYXRhMzIgPj4gMjApICYgMHhmZmYpIDw8IDIwKSB8CisJCSgoKGF2czJfZGVjLT5pbnB1dC5zYW1wbGVfYml0X2RlcHRoID09IDEwKQorCQk/IDB4YSA6IDB4MCkgPDwgMTYpIHwgICAvKlsxNiArOiA0XToge2x1bWFfYmRbMTowXSwKKwkJCQkJCQljaHJvbWFfYmRbMTowXX0qLworCQkoKChkYXRhMzIgPj4gMikgJiAweDNmZmYpIDw8IDIpIHwKKwkJKCgocnBtX3BhcmFtLT5wLmxjdV9zaXplID09IDYpCisJCT8gMCA6IChycG1fcGFyYW0tPnAubGN1X3NpemUgPT0gNSkKKwkJPyAxIDogMikgPDwgMCk7LypbIDAgKzogMl06IGxjdV9zaXplKi8KKwlXUklURV9WUkVHKEhFVkNfREJMS19DRkcxLCBkYXRhMzIpOworCisJZGF0YTMyID0gKGF2czJfZGVjLT5pbWcuaGVpZ2h0IDw8IDE2KSB8CisJCWF2czJfZGVjLT5pbWcud2lkdGg7CisJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHMiwgZGF0YTMyKTsKKwkvKgorCVsyNyArOiAxXTogY3Jvc3Nfc2xpY2VfbG9vcGZpbHRlcl9lbmFibGVfZmxhZworCVsyNiArOiAxXTogbG9vcF9maWx0ZXJfZGlzYWJsZQorCVsyNSArOiAxXTogdXNlTlNRVAorCVsyMiArOiAzXTogaW1ndHlwZQorCVsxNyArOiA1XTogYWxwaGFfY19vZmZzZXQgKC04fjgpCisJWzEyICs6IDVdOiBiZXRhX29mZnNldCAoLTh+OCkKKwlbIDYgKzogNl06IGNocm9tYV9xdWFudF9wYXJhbV9kZWx0YV91ICgtMTZ+MTYpCisJWyAwICs6IDZdOiBjaHJvbWFfcXVhbnRfcGFyYW1fZGVsdGFfdiAoLTE2fjE2KQorCSovCisJZGF0YTMyID0gKChhdnMyX2RlYy0+aW5wdXQuY3Jvc3NTbGljZUxvb3BGaWx0ZXIKKwkJJiAweDEpIDw8IDI3KSB8CisJKChycG1fcGFyYW0tPnAubG9vcF9maWx0ZXJfZGlzYWJsZSAmIDB4MSkgPDwgMjYpIHwKKwkoKGF2czJfZGVjLT5pbnB1dC51c2VOU1FUICYgMHgxKSA8PCAyNSkgfAorCSgoYXZzMl9kZWMtPmltZy50eXBlICYgMHg3KSA8PCAyMikgfAorCSgocnBtX3BhcmFtLT5wLmFscGhhX2Nfb2Zmc2V0ICYgMHgxZikgPDwgMTcpIHwKKwkoKHJwbV9wYXJhbS0+cC5iZXRhX29mZnNldCAmIDB4MWYpIDw8IDEyKSB8CisJKChycG1fcGFyYW0tPnAuY2hyb21hX3F1YW50X3BhcmFtX2RlbHRhX2NiICYgMHgzZikgPDwgNikgfAorCSgocnBtX3BhcmFtLT5wLmNocm9tYV9xdWFudF9wYXJhbV9kZWx0YV9jciAmIDB4M2YpIDw8IDApOworCisJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHOSwgZGF0YTMyKTsKKwlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX0RFVEFJTCwKKwkJIltjXSBjZmdEQkxLOiBjcm9zc3NsaWNlKCVkKSxsZmRpc2FibGUoJWQpLGJpdERlcHRoKCVkKSxsY3VTaXplKCVkKSxOU1FUKCVkKVxuIiwKKwkJYXZzMl9kZWMtPmlucHV0LmNyb3NzU2xpY2VMb29wRmlsdGVyLAorCQlycG1fcGFyYW0tPnAubG9vcF9maWx0ZXJfZGlzYWJsZSwKKwkJYXZzMl9kZWMtPmlucHV0LnNhbXBsZV9iaXRfZGVwdGgsCisJCWF2czJfZGVjLT5sY3Vfc2l6ZSwKKwkJYXZzMl9kZWMtPmlucHV0LnVzZU5TUVQpOworCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1JfREVUQUlMLAorCQkiW2NdIGNmZ0RCTEs6IGFscGhhQ09mZnNldCglZCksYmV0YU9mZnNldCglZCkscXVhbnREZWx0YUNiKCVkKSxxdWFudERlbHRhQ3IoJWQpXG4iLAorCQlycG1fcGFyYW0tPnAuYWxwaGFfY19vZmZzZXQsCisJCXJwbV9wYXJhbS0+cC5iZXRhX29mZnNldCwKKwkJcnBtX3BhcmFtLT5wLmNocm9tYV9xdWFudF9wYXJhbV9kZWx0YV9jYiwKKwkJcnBtX3BhcmFtLT5wLmNocm9tYV9xdWFudF9wYXJhbV9kZWx0YV9jcik7CisJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUl9ERVRBSUwsCisJCSJbY10gY2ZnREJMSzogLmRvbmUuXG4iKTsKK30KKworc3RhdGljIHZvaWQgY29uZmlnX3Nhb19odyhzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCXVpbnQzMl90IGRhdGEzMjsKKwlzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYyA9ICZkZWMtPmF2czJfZGVjOworCXN0cnVjdCBhdnMyX2ZyYW1lX3MgKmN1cl9waWMgPSBhdnMyX2RlYy0+aGMuY3VyX3BpYzsKKworCWludCBsY3Vfc2l6ZSA9IDY0OworCWludCBtY19idWZmZXJfc2l6ZV91X3YgPQorCQljdXJfcGljLT5sY3VfdG90YWwgKiBsY3Vfc2l6ZSpsY3Vfc2l6ZS8yOworCWludCBtY19idWZmZXJfc2l6ZV91X3ZfaCA9CisJCShtY19idWZmZXJfc2l6ZV91X3YgKyAweGZmZmYpID4+IDE2Oy8qNjRrIGFsaWdubWVudCovCisKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDApOworCWRhdGEzMiAmPSAofjB4Zik7CisJZGF0YTMyIHw9IGF2czJfZGVjLT5sY3Vfc2l6ZV9sb2cyOworCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1JfREVUQUlMLAorCQkiJXMsIGxjdV9zaXplX2xvZzIgPSAlZCwgY29uZmlnIEhFVkNfU0FPX0NUUkwwIDB4JXhcbiIsCisJCV9fZnVuY19fLAorCQlhdnMyX2RlYy0+bGN1X3NpemVfbG9nMiwKKwkJZGF0YTMyKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDAsIGRhdGEzMik7CisKKyNpZm5kZWYgQVZTMl8xMEJfTU1VCisJaWYgKChnZXRfZG91YmxlX3dyaXRlX21vZGUoZGVjKSAmIDB4MTApID09IDApCisJCVdSSVRFX1ZSRUcoSEVWQ19DTV9CT0RZX1NUQVJUX0FERFIsIGN1cl9waWMtPm1jX3lfYWRyKTsKKyNlbmRpZgorCWlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUoZGVjKSkgeworCQlXUklURV9WUkVHKEhFVkNfU0FPX1lfU1RBUlRfQUREUiwgY3VyX3BpYy0+ZHdfeV9hZHIpOworCQlXUklURV9WUkVHKEhFVkNfU0FPX0NfU1RBUlRfQUREUiwgY3VyX3BpYy0+ZHdfdV92X2Fkcik7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fWV9XUFRSLCBjdXJfcGljLT5kd195X2Fkcik7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ19XUFRSLCBjdXJfcGljLT5kd191X3ZfYWRyKTsKKwl9IGVsc2UgeworCQlXUklURV9WUkVHKEhFVkNfU0FPX1lfU1RBUlRfQUREUiwgMHhmZmZmZmZmZik7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ19TVEFSVF9BRERSLCAweGZmZmZmZmZmKTsKKwl9CisjaWZkZWYgQVZTMl8xMEJfTU1VCisJV1JJVEVfVlJFRyhIRVZDX0NNX0hFQURFUl9TVEFSVF9BRERSLCBjdXJfcGljLT5oZWFkZXJfYWRyKTsKKyNlbmRpZgorCWRhdGEzMiA9IChtY19idWZmZXJfc2l6ZV91X3ZfaCA8PCAxNikgPDwgMTsKKwkvKnByX2luZm8oImRhdGEzMj0leCxtY19idWZmZXJfc2l6ZV91X3ZfaD0leCxsY3VfdG90YWw9JXhcbiIsCisJCWRhdGEzMiwgbWNfYnVmZmVyX3NpemVfdV92X2gsIGN1cl9waWMtPmxjdV90b3RhbCk7Ki8KKwlXUklURV9WUkVHKEhFVkNfU0FPX1lfTEVOR1RILCBkYXRhMzIpOworCisJZGF0YTMyID0gKG1jX2J1ZmZlcl9zaXplX3Vfdl9oIDw8IDE2KTsKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NfTEVOR1RILCBkYXRhMzIpOworCisjaWZkZWYgQVZTMl8xMEJfTlYyMQorI2lmZGVmIERPU19QUk9KRUNUCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkwxKTsKKwlkYXRhMzIgJj0gKH4weDMwMDApOworCS8qWzEzOjEyXSBheGlfYWZvcm1hdCwgMC1MaW5lYXIsIDEtMzJ4MzIsIDItNjR4MzIqLworCWRhdGEzMiB8PSAoTUVNX01BUF9NT0RFIDw8IDEyKTsKKwlkYXRhMzIgJj0gKH4weDMpOworCWRhdGEzMiB8PSAweDE7IC8qIFsxXTpkd19kaXNhYmxlIFswXTpjbV9kaXNhYmxlKi8KKworCS8qCisJKiAgWzMxOjI0XSBhcl9maWZvMV9heGlfdGhyZWQKKwkqICBbMjM6MTZdIGFyX2ZpZm8wX2F4aV90aHJlZAorCSogIFsxNToxNF0gYXhpX2xpbmVhbGlnbiwgMC0xNmJ5dGVzLCAxLTMyYnl0ZXMsIDItNjRieXRlcworCSogIFsxMzoxMl0gYXhpX2Fmb3JtYXQsIDAtTGluZWFyLCAxLTMyeDMyLCAyLTY0eDMyCisJKiAgWzExOjA4XSBheGlfbGVuZGlhbl9DCisJKiAgWzA3OjA0XSBheGlfbGVuZGlhbl9ZCisJKiAgWzNdICAgICByZXNlcnZlZAorCSogIFsyXSAgICAgY2xrX2ZvcmNlb24KKwkqICBbMV0gICAgIGR3X2Rpc2FibGU6ZGlzYWJsZSBkb3VibGUgd3JpdGUgb3V0cHV0CisJKiAgWzBdICAgICBjbV9kaXNhYmxlOmRpc2FibGUgY29tcHJlc3Mgb3V0cHV0CisJKi8KKwlkYXRhMzIgJj0gKH4oMyA8PCAxNCkpOworCWRhdGEzMiB8PSAoMiA8PCAxNCk7CisKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkwxLCBkYXRhMzIpOworCS8qWzIzOjIyXSBkd192MV9jdHJsIFsyMToyMF0gZHdfdjBfY3RybCBbMTk6MThdIGR3X2gxX2N0cmwKKwkJWzE3OjE2XSBkd19oMF9jdHJsKi8KKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDUpOworCS8qc2V0IHRoZW0gYWxsIDAgZm9yIEgyNjVfTlYyMSAobm8gZG93bi1zY2FsZSkqLworCWRhdGEzMiAmPSB+KDB4ZmYgPDwgMTYpOworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDUsIGRhdGEzMik7CisJYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ0RfSVBQX0FYSUlGX0NPTkZJRyk7CisJZGF0YTMyICY9ICh+MHgzMCk7CisJLypbNTo0XSBhZGRyZXNzX2Zvcm1hdCAwMDpsaW5lYXIgMDE6MzJ4MzIgMTA6NjR4MzIqLworCWRhdGEzMiB8PSAoTUVNX01BUF9NT0RFIDw8IDQpOworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX0FYSUlGX0NPTkZJRywgZGF0YTMyKTsKKyNlbHNlCisJLyptOGJhYnkgdGVzdDE5MDIqLworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMMSk7CisJZGF0YTMyICY9ICh+MHgzMDAwKTsKKwkvKlsxMzoxMl0gYXhpX2Fmb3JtYXQsIDAtTGluZWFyLCAxLTMyeDMyLCAyLTY0eDMyKi8KKwlkYXRhMzIgfD0gKE1FTV9NQVBfTU9ERSA8PCAxMik7CisJZGF0YTMyICY9ICh+MHhmZjApOworCS8qZGF0YTMyIHw9IDB4NjcwOyovIC8qQmlnLUVuZGlhbiBwZXIgNjQtYml0Ki8KKwlkYXRhMzIgfD0gMHg4ODA7ICAvKi5CaWctRW5kaWFuIHBlciA2NC1iaXQgKi8KKwlkYXRhMzIgJj0gKH4weDMpOworCWRhdGEzMiB8PSAweDE7IC8qWzFdOmR3X2Rpc2FibGUgWzBdOmNtX2Rpc2FibGUqLworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDEsIGRhdGEzMik7CisJLyogWzIzOjIyXSBkd192MV9jdHJsIFsyMToyMF0gZHdfdjBfY3RybAorCVsxOToxOF0gZHdfaDFfY3RybCBbMTc6MTZdIGR3X2gwX2N0cmwqLworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMNSk7CisJLyogc2V0IHRoZW0gYWxsIDAgZm9yIEgyNjVfTlYyMSAobm8gZG93bi1zY2FsZSkqLworCWRhdGEzMiAmPSB+KDB4ZmYgPDwgMTYpOworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDUsIGRhdGEzMik7CisKKwkvKgorCSogWzM6MF0gICBsaXR0bGVfZW5kaWFuCisJKiBbNTo0XSAgIGFkZHJlc3NfZm9ybWF0IDAwOmxpbmVhciAwMTozMngzMiAxMDo2NHgzMgorCSogWzc6Nl0gICByZXNlcnZlZAorCSogWzk6OF0gICBMaW5lYXJfTGluZUFsaWdubWVudCAwMDoxNmJ5dGUgMDE6MzJieXRlIDEwOjY0Ynl0ZQorCSogWzExOjEwXSByZXNlcnZlZAorCSogWzEyXSAgICBDYkNyX2J5dGVfc3dhcAorCSogWzMxOjEzXSByZXNlcnZlZAorCSovCisKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ0RfSVBQX0FYSUlGX0NPTkZJRyk7CisJZGF0YTMyICY9ICh+MHgzMCk7CisJLypbNTo0XSBhZGRyZXNzX2Zvcm1hdCAwMDpsaW5lYXIgMDE6MzJ4MzIgMTA6NjR4MzIqLworCWRhdGEzMiB8PSAoTUVNX01BUF9NT0RFIDw8IDQpOworCWRhdGEzMiAmPSAofjB4Rik7CisJZGF0YTMyIHw9IDB4ODsgLypCaWctRW5kaWFuIHBlciA2NC1iaXQqLworCisJZGF0YTMyICY9ICh+KDMgPDwgOCkpOworCWRhdGEzMiB8PSAoMiA8PCA4KTsKKwlXUklURV9WUkVHKEhFVkNEX0lQUF9BWElJRl9DT05GSUcsIGRhdGEzMik7CisjZW5kaWYKKyNlbHNlCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkwxKTsKKwlkYXRhMzIgJj0gKH4oMyA8PCAxNCkpOworCWRhdGEzMiB8PSAoMiA8PCAxNCk7CS8qIGxpbmUgYWxpZ24gd2l0aCA2NCovCisJZGF0YTMyICY9ICh+MHgzMDAwKTsKKwlkYXRhMzIgfD0gKE1FTV9NQVBfTU9ERSA8PCAxMik7CS8qIFsxMzoxMl0gYXhpX2Fmb3JtYXQsIDAtTGluZWFyLAorCQkJCSAgIDEtMzJ4MzIsIDItNjR4MzIgKi8KKwlkYXRhMzIgJj0gKH4weGZmMCk7CisJZGF0YTMyIHw9ICgoZGVjLT5lbmRpYW4gPj4gOCkgJiAweGZmZik7CS8qIGRhdGEzMiB8PSAweDY3MDsgQmlnLUVuZGlhbiBwZXIgNjQtYml0ICovCisJZGF0YTMyICY9ICh+MHgzKTsgLypbMV06ZHdfZGlzYWJsZSBbMF06Y21fZGlzYWJsZSovCisjaWYgMAorCWlmICAoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpIHsKKwkJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShkZWMpID09IDApCisJCQlkYXRhMzIgfD0gMHgyOyAvKmRpc2FibGUgZG91YmxlIHdyaXRlKi8KKyNpZm5kZWYgQVZTMl8xMEJfTU1VCisJCWVsc2UKKwkJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShkZWMpICYgMHgxMCkKKwkJCWRhdGEzMiB8PSAweDE7IC8qZGlzYWJsZSBjbSovCisjZW5kaWYKKwl9CisjZW5kaWYKKwlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGRlYykgPT0gMCkKKwkJZGF0YTMyIHw9IDB4MjsgLypkaXNhYmxlIGRvdWJsZSB3cml0ZSovCisJZWxzZSBpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGRlYykgJiAweDEwKQorCQlkYXRhMzIgfD0gMHgxOyAvKmRpc2FibGUgY20qLworCisJLyoKKwkqICBbMzE6MjRdIGFyX2ZpZm8xX2F4aV90aHJlZAorCSogIFsyMzoxNl0gYXJfZmlmbzBfYXhpX3RocmVkCisJKiAgWzE1OjE0XSBheGlfbGluZWFsaWduLCAwLTE2Ynl0ZXMsIDEtMzJieXRlcywgMi02NGJ5dGVzCisJKiAgWzEzOjEyXSBheGlfYWZvcm1hdCwgMC1MaW5lYXIsIDEtMzJ4MzIsIDItNjR4MzIKKwkqICBbMTE6MDhdIGF4aV9sZW5kaWFuX0MKKwkqICBbMDc6MDRdIGF4aV9sZW5kaWFuX1kKKwkqICBbM10gICAgIHJlc2VydmVkCisJKiAgWzJdICAgICBjbGtfZm9yY2VvbgorCSogIFsxXSAgICAgZHdfZGlzYWJsZTpkaXNhYmxlIGRvdWJsZSB3cml0ZSBvdXRwdXQKKwkqICBbMF0gICAgIGNtX2Rpc2FibGU6ZGlzYWJsZSBjb21wcmVzcyBvdXRwdXQKKwkqLworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDEsIGRhdGEzMik7CisKKwlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGRlYykgJiAweDEwKSB7CisJCS8qIFsyMzoyMl0gZHdfdjFfY3RybAorCQlbMjE6MjBdIGR3X3YwX2N0cmwKKwkJWzE5OjE4XSBkd19oMV9jdHJsCisJCVsxNzoxNl0gZHdfaDBfY3RybAorCQkqLworCQlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDUpOworCQkvKnNldCB0aGVtIGFsbCAwIGZvciBIMjY1X05WMjEgKG5vIGRvd24tc2NhbGUpKi8KKwkJZGF0YTMyICY9IH4oMHhmZiA8PCAxNik7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDUsIGRhdGEzMik7CisJfSBlbHNlIHsKKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDcpCisJCQlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkwyNiwgMCk7CisKKwkJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkw1KTsKKwkJZGF0YTMyICY9ICh+KDB4ZmYgPDwgMTYpKTsKKwkJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShkZWMpID09IDggfHwKKwkJCWdldF9kb3VibGVfd3JpdGVfbW9kZShkZWMpID09IDkpIHsKKwkJCWRhdGEzMiB8PSAoMHhmZjw8MTYpOworCQkJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMMjYsIDB4Zik7CisJCX0gZWxzZSBpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGRlYykgPT0gMiB8fAorCQkJZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGRlYykgPT0gMykKKwkJCWRhdGEzMiB8PSAoMHhmZjw8MTYpOworCQllbHNlIGlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUoZGVjKSA9PSA0KQorCQkJZGF0YTMyIHw9ICgweDMzPDwxNik7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDUsIGRhdGEzMik7CisJfQorCisJLyoKKwkqIFszOjBdICAgbGl0dGxlX2VuZGlhbgorCSogWzU6NF0gICBhZGRyZXNzX2Zvcm1hdCAwMDpsaW5lYXIgMDE6MzJ4MzIgMTA6NjR4MzIKKwkqIFs3OjZdICAgcmVzZXJ2ZWQKKwkqIFs5OjhdICAgTGluZWFyX0xpbmVBbGlnbm1lbnQgMDA6MTZieXRlIDAxOjMyYnl0ZSAxMDo2NGJ5dGUKKwkqIFsxMToxMF0gcmVzZXJ2ZWQKKwkqIFsxMl0gICAgQ2JDcl9ieXRlX3N3YXAKKwkqIFszMToxM10gcmVzZXJ2ZWQKKwkqLworCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNEX0lQUF9BWElJRl9DT05GSUcpOworCWRhdGEzMiAmPSAofjB4MzApOworCS8qIFs1OjRdICAgIC0tIGFkZHJlc3NfZm9ybWF0IDAwOmxpbmVhciAwMTozMngzMiAxMDo2NHgzMiAqLworCWRhdGEzMiB8PSAobWVtX21hcF9tb2RlIDw8IDQpOworCWRhdGEzMiAmPSAofjB4Rik7CisJZGF0YTMyIHw9IChkZWMtPmVuZGlhbiAmIDB4Zik7ICAvKiB2YWxpZCBvbmx5IHdoZW4gZG91YmxlIHdyaXRlIG9ubHkgKi8KKwkvKmRhdGEzMiB8PSAweDg7Ki8JCS8qIEJpZy1FbmRpYW4gcGVyIDY0LWJpdCAqLworCWRhdGEzMiAmPSAofigzIDw8IDgpKTsKKwlkYXRhMzIgfD0gKDIgPDwgOCk7CQkvKiBsaW5lIGFsaWduIHdpdGggNjQgZm9yIGR3IG9ubHkgKi8KKwlXUklURV9WUkVHKEhFVkNEX0lQUF9BWElJRl9DT05GSUcsIGRhdGEzMik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgcmVjb25zdHJ1Y3RDb2VmZmljaWVudHMoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYywKKwlzdHJ1Y3QgQUxGUGFyYW1fcyAqYWxmUGFyYW0pCit7CisJaW50MzJfdCBnLCBzdW0sIGksIGNvZWZmUHJlZDsKKwlmb3IgKGcgPSAwOyBnIDwgYWxmUGFyYW0tPmZpbHRlcnNfcGVyX2dyb3VwOyBnKyspIHsKKwkJc3VtID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IGFsZlBhcmFtLT5udW1fY29lZmYgLSAxOyBpKyspIHsKKwkJCXN1bSArPSAoMiAqIGFsZlBhcmFtLT5jb2VmZm11bHRpW2ddW2ldKTsKKwkJCWRlYy0+bV9maWx0ZXJDb2VmZlN5bVtnXVtpXSA9CisJCQlhbGZQYXJhbS0+Y29lZmZtdWx0aVtnXVtpXTsKKwkJCS8qcHJfaW5mbygiW3RdIGRlYy0+bV9maWx0ZXJDb2VmZlN5bVslZF1bJWRdPTB4JXhcbiIsCisJCQlnLCBpLCBkZWMtPm1fZmlsdGVyQ29lZmZTeW1bZ11baV0pOyovCisJCX0KKwkJY29lZmZQcmVkID0gKDEgPDwgQUxGX05VTV9CSVRfU0hJRlQpIC0gc3VtOworCQlkZWMtPm1fZmlsdGVyQ29lZmZTeW1bZ11bYWxmUGFyYW0tPm51bV9jb2VmZiAtIDFdCisJCT0gY29lZmZQcmVkICsKKwkJYWxmUGFyYW0tPmNvZWZmbXVsdGlbZ11bYWxmUGFyYW0tPm51bV9jb2VmZiAtIDFdOworCQkvKnByX2luZm8oIlt0XSBkZWMtPm1fZmlsdGVyQ29lZmZTeW1bJWRdWyVkXT0weCV4XG4iLAorCQlnLCAoYWxmUGFyYW0tPm51bV9jb2VmZiAtIDEpLAorCQlkZWMtPm1fZmlsdGVyQ29lZmZTeW1bZ11bYWxmUGFyYW0tPm51bV9jb2VmZiAtIDFdKTsqLworCX0KK30KKworc3RhdGljIHZvaWQgcmVjb25zdHJ1Y3RDb2VmSW5mbyhzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjLAorCWludDMyX3QgY29tcElkeCwgc3RydWN0IEFMRlBhcmFtX3MgKmFsZlBhcmFtKQoreworCWludDMyX3QgaTsKKwlpZiAoY29tcElkeCA9PSBBTEZfWSkgeworCQlpZiAoYWxmUGFyYW0tPmZpbHRlcnNfcGVyX2dyb3VwID4gMSkgeworCQkJZm9yIChpID0gMTsgaSA8IE5PX1ZBUl9CSU5TOyArK2kpIHsKKwkJCQlpZiAoYWxmUGFyYW0tPmZpbHRlclBhdHRlcm5baV0pCisJCQkJCWRlYy0+bV92YXJJbmRUYWJbaV0gPQorCQkJCQkJZGVjLT5tX3ZhckluZFRhYltpIC0gMV0gKyAxOworCQkJCWVsc2UKKwkJCQkJZGVjLT5tX3ZhckluZFRhYltpXSA9CisJCQkJCQlkZWMtPm1fdmFySW5kVGFiW2kgLSAxXTsKKwkJCX0KKwkJfQorCX0KKwlyZWNvbnN0cnVjdENvZWZmaWNpZW50cyhkZWMsIGFsZlBhcmFtKTsKK30KKworc3RhdGljIHZvaWQgY29uZmlnX2FsZl9odyhzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCS8qCisJKiBQaWN0dXJlIGxldmVsIEFMRiBwYXJhbWV0ZXIgY29uZmlndXJhdGlvbiBoZXJlCisJKi8KKwl1aW50MzJfdCBkYXRhMzI7CisJaW50MzJfdCBpLCBqOworCWludDMyX3QgbV9maWx0ZXJzX3Blcl9ncm91cDsKKwlzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYyA9ICZkZWMtPmF2czJfZGVjOworCXN0cnVjdCBBTEZQYXJhbV9zICptX2FsZlBpY3R1cmVQYXJhbV95ID0KKwkJJmF2czJfZGVjLT5tX2FsZlBpY3R1cmVQYXJhbVswXTsKKwlzdHJ1Y3QgQUxGUGFyYW1fcyAqbV9hbGZQaWN0dXJlUGFyYW1fY2IgPQorCQkmYXZzMl9kZWMtPm1fYWxmUGljdHVyZVBhcmFtWzFdOworCXN0cnVjdCBBTEZQYXJhbV9zICptX2FsZlBpY3R1cmVQYXJhbV9jciA9CisJCSZhdnMyX2RlYy0+bV9hbGZQaWN0dXJlUGFyYW1bMl07CisKKwlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX0RFVEFJTCwKKwkJIlt0XWFsZnksY2lkeCglZCksZmxhZyglZCksZmlsdGVyc19wZXJfZ3JvdXAoJWQpLGZpbHRlclBhdHRlcm5bMF09MHgleCxbMTVdPTB4JXhcbiIsCisJCW1fYWxmUGljdHVyZVBhcmFtX3ktPmNvbXBvbmVudElELAorCQltX2FsZlBpY3R1cmVQYXJhbV95LT5hbGZfZmxhZywKKwkJbV9hbGZQaWN0dXJlUGFyYW1feS0+ZmlsdGVyc19wZXJfZ3JvdXAsCisJCW1fYWxmUGljdHVyZVBhcmFtX3ktPmZpbHRlclBhdHRlcm5bMF0sCisJCW1fYWxmUGljdHVyZVBhcmFtX3ktPmZpbHRlclBhdHRlcm5bMTVdKTsKKwlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX0RFVEFJTCwKKwkJIlt0XWFsZnksbnVtX2NvZWZmKCVkKSxjb2VmZm11bHRpWzBdWzBdPTB4JXgsWzBdWzFdPTB4JXgsWzFdWzBdPTB4JXgsWzFdWzFdPTB4JXhcbiIsCisJCW1fYWxmUGljdHVyZVBhcmFtX3ktPm51bV9jb2VmZiwKKwkJbV9hbGZQaWN0dXJlUGFyYW1feS0+Y29lZmZtdWx0aVswXVswXSwKKwkJbV9hbGZQaWN0dXJlUGFyYW1feS0+Y29lZmZtdWx0aVswXVsxXSwKKwkJbV9hbGZQaWN0dXJlUGFyYW1feS0+Y29lZmZtdWx0aVsxXVswXSwKKwkJbV9hbGZQaWN0dXJlUGFyYW1feS0+Y29lZmZtdWx0aVsxXVsxXSk7CisKKwkvKkNyKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJZGVjLT5tX3ZhckluZFRhYltpXSA9IDA7CisJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisJCWZvciAoaSA9IDA7IGkgPCA5OyBpKyspCisJCQlkZWMtPm1fZmlsdGVyQ29lZmZTeW1bal1baV0gPSAwOworCXJlY29uc3RydWN0Q29lZkluZm8oZGVjLCAyLCBtX2FsZlBpY3R1cmVQYXJhbV9jcik7CisJZGF0YTMyID0KKwkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bNF0gJiAweGYpIDw8IDI4KSB8CisJCSgoZGVjLT5tX2ZpbHRlckNvZWZmU3ltWzBdWzNdICYgMHg3ZikgPDwgMjEpIHwKKwkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bMl0gJiAweDdmKSA8PCAxNCkgfAorCQkoKGRlYy0+bV9maWx0ZXJDb2VmZlN5bVswXVsxXSAmIDB4N2YpIDw8IDcpIHwKKwkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bMF0gJiAweDdmKSA8PCAwKTsKKwlXUklURV9WUkVHKEhFVkNfREJMS19DRkdELCBkYXRhMzIpOworCWRhdGEzMiA9CisJCSgoZGVjLT5tX2ZpbHRlckNvZWZmU3ltWzBdWzhdICYgMHg3ZikgPDwgMjQpIHwKKwkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bN10gJiAweDdmKSA8PCAxNykgfAorCQkoKGRlYy0+bV9maWx0ZXJDb2VmZlN5bVswXVs2XSAmIDB4N2YpIDw8IDEwKSB8CisJCSgoZGVjLT5tX2ZpbHRlckNvZWZmU3ltWzBdWzVdICYgMHg3ZikgPDwgMykgfAorCQkoKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bNF0gPj4gNCkgJiAweDcpIDw8ICAwKTsKKwlXUklURV9WUkVHKEhFVkNfREJMS19DRkdELCBkYXRhMzIpOworCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1JfREVUQUlMLAorCQkiW2NdIHBpY19hbGZfb25fY3IoJWQpLCBhbGZfY3JfY29lZiglZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZClcbiIsCisJCW1fYWxmUGljdHVyZVBhcmFtX2NyLT5hbGZfZmxhZywKKwkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltWzBdWzBdLAorCQlkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bMV0sCisJCWRlYy0+bV9maWx0ZXJDb2VmZlN5bVswXVsyXSwKKwkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltWzBdWzNdLAorCQlkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bNF0sCisJCWRlYy0+bV9maWx0ZXJDb2VmZlN5bVswXVs1XSwKKwkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltWzBdWzZdLAorCQlkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bN10sCisJCWRlYy0+bV9maWx0ZXJDb2VmZlN5bVswXVs4XSk7CisKKwkvKiBDYiovCisJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisJCWZvciAoaSA9IDA7IGkgPCA5OyBpKyspCisJCQlkZWMtPm1fZmlsdGVyQ29lZmZTeW1bal1baV0gPSAwOworCXJlY29uc3RydWN0Q29lZkluZm8oZGVjLCAxLCBtX2FsZlBpY3R1cmVQYXJhbV9jYik7CisJZGF0YTMyID0KKwkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bNF0gJiAweGYpIDw8IDI4KSB8CisJCSgoZGVjLT5tX2ZpbHRlckNvZWZmU3ltWzBdWzNdICYgMHg3ZikgPDwgMjEpIHwKKwkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bMl0gJiAweDdmKSA8PCAxNCkgfAorCQkoKGRlYy0+bV9maWx0ZXJDb2VmZlN5bVswXVsxXSAmIDB4N2YpIDw8IDcpIHwKKwkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bMF0gJiAweDdmKSA8PCAwKTsKKwlXUklURV9WUkVHKEhFVkNfREJMS19DRkdELCBkYXRhMzIpOworCWRhdGEzMiA9CisJCSgoZGVjLT5tX2ZpbHRlckNvZWZmU3ltWzBdWzhdICYgMHg3ZikgPDwgMjQpIHwKKwkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bN10gJiAweDdmKSA8PCAxNykgfAorCQkoKGRlYy0+bV9maWx0ZXJDb2VmZlN5bVswXVs2XSAmIDB4N2YpIDw8IDEwKSB8CisJCSgoZGVjLT5tX2ZpbHRlckNvZWZmU3ltWzBdWzVdICYgMHg3ZikgPDwgMykgfAorCQkoKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bNF0gPj4gNCkgJiAweDcpIDw8IDApOworCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGR0QsIGRhdGEzMik7CisJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUl9ERVRBSUwsCisJCSJbY10gcGljX2FsZl9vbl9jYiglZCksIGFsZl9jYl9jb2VmKCVkICVkICVkICVkICVkICVkICVkICVkICVkKVxuIiwKKwkJbV9hbGZQaWN0dXJlUGFyYW1fY2ItPmFsZl9mbGFnLAorCQlkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bMF0sCisJCWRlYy0+bV9maWx0ZXJDb2VmZlN5bVswXVsxXSwKKwkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltWzBdWzJdLAorCQlkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bM10sCisJCWRlYy0+bV9maWx0ZXJDb2VmZlN5bVswXVs0XSwKKwkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltWzBdWzVdLAorCQlkZWMtPm1fZmlsdGVyQ29lZmZTeW1bMF1bNl0sCisJCWRlYy0+bV9maWx0ZXJDb2VmZlN5bVswXVs3XSwKKwkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltWzBdWzhdKTsKKworCS8qIFkqLworCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorCQlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQorCQkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltW2pdW2ldID0gMDsKKwlyZWNvbnN0cnVjdENvZWZJbmZvKGRlYywgMCwgbV9hbGZQaWN0dXJlUGFyYW1feSk7CisJZGF0YTMyID0KKwkJKChkZWMtPm1fdmFySW5kVGFiWzddICYgMHhmKSA8PCAyOCkgfAorCQkoKGRlYy0+bV92YXJJbmRUYWJbNl0gJiAweGYpIDw8IDI0KSB8CisJCSgoZGVjLT5tX3ZhckluZFRhYls1XSAmIDB4ZikgPDwgMjApIHwKKwkJKChkZWMtPm1fdmFySW5kVGFiWzRdICYgMHhmKSA8PCAxNikgfAorCQkoKGRlYy0+bV92YXJJbmRUYWJbM10gJiAweGYpIDw8IDEyKSB8CisJCSgoZGVjLT5tX3ZhckluZFRhYlsyXSAmIDB4ZikgPDwgOCkgfAorCQkoKGRlYy0+bV92YXJJbmRUYWJbMV0gJiAweGYpIDw8IDQpIHwKKwkJKChkZWMtPm1fdmFySW5kVGFiWzBdICYgMHhmKSA8PCAwKTsKKwlXUklURV9WUkVHKEhFVkNfREJMS19DRkdELCBkYXRhMzIpOworCWRhdGEzMiA9ICgoZGVjLT5tX3ZhckluZFRhYlsxNV0gJiAweGYpIDw8IDI4KSB8CisJCSgoZGVjLT5tX3ZhckluZFRhYlsxNF0gJiAweGYpIDw8IDI0KSB8CisJCSgoZGVjLT5tX3ZhckluZFRhYlsxM10gJiAweGYpIDw8IDIwKSB8CisJCSgoZGVjLT5tX3ZhckluZFRhYlsxMl0gJiAweGYpIDw8IDE2KSB8CisJCSgoZGVjLT5tX3ZhckluZFRhYlsxMV0gJiAweGYpIDw8IDEyKSB8CisJCSgoZGVjLT5tX3ZhckluZFRhYlsxMF0gJiAweGYpIDw8IDgpIHwKKwkJKChkZWMtPm1fdmFySW5kVGFiWzldICYgMHhmKSA8PCA0KSB8CisJCSgoZGVjLT5tX3ZhckluZFRhYls4XSAmIDB4ZikgPDwgMCk7CisJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHRCwgZGF0YTMyKTsKKwlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX0RFVEFJTCwKKwkJIltjXSBwaWNfYWxmX29uX3koJWQpLCBhbGZfeV90YWIoJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQpXG4iLAorCQltX2FsZlBpY3R1cmVQYXJhbV95LT5hbGZfZmxhZywKKwkJZGVjLT5tX3ZhckluZFRhYlswXSwKKwkJZGVjLT5tX3ZhckluZFRhYlsxXSwKKwkJZGVjLT5tX3ZhckluZFRhYlsyXSwKKwkJZGVjLT5tX3ZhckluZFRhYlszXSwKKwkJZGVjLT5tX3ZhckluZFRhYls0XSwKKwkJZGVjLT5tX3ZhckluZFRhYls1XSwKKwkJZGVjLT5tX3ZhckluZFRhYls2XSwKKwkJZGVjLT5tX3ZhckluZFRhYls3XSwKKwkJZGVjLT5tX3ZhckluZFRhYls4XSwKKwkJZGVjLT5tX3ZhckluZFRhYls5XSwKKwkJZGVjLT5tX3ZhckluZFRhYlsxMF0sCisJCWRlYy0+bV92YXJJbmRUYWJbMTFdLAorCQlkZWMtPm1fdmFySW5kVGFiWzEyXSwKKwkJZGVjLT5tX3ZhckluZFRhYlsxM10sCisJCWRlYy0+bV92YXJJbmRUYWJbMTRdLAorCQlkZWMtPm1fdmFySW5kVGFiWzE1XSk7CisKKwltX2ZpbHRlcnNfcGVyX2dyb3VwID0KKwkJKG1fYWxmUGljdHVyZVBhcmFtX3ktPmFsZl9mbGFnID09IDApID8KKwkJMSA6IG1fYWxmUGljdHVyZVBhcmFtX3ktPmZpbHRlcnNfcGVyX2dyb3VwOworCWZvciAoaSA9IDA7IGkgPCBtX2ZpbHRlcnNfcGVyX2dyb3VwOyBpKyspIHsKKwkJZGF0YTMyID0KKwkJCSgoZGVjLT5tX2ZpbHRlckNvZWZmU3ltW2ldWzRdICYgMHhmKSA8PCAyOCkgfAorCQkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1baV1bM10gJiAweDdmKSA8PCAyMSkgfAorCQkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1baV1bMl0gJiAweDdmKSA8PCAxNCkgfAorCQkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1baV1bMV0gJiAweDdmKSA8PCA3KSB8CisJCQkoKGRlYy0+bV9maWx0ZXJDb2VmZlN5bVtpXVswXSAmIDB4N2YpIDw8IDApOworCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkdELCBkYXRhMzIpOworCQlkYXRhMzIgPQorCQkJLypbMzFdIGxhc3QgaW5kaWNhdGlvbiovCisJCQkoKGkgPT0gbV9maWx0ZXJzX3Blcl9ncm91cC0xKSA8PCAzMSkgfAorCQkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1baV1bOF0gJiAweDdmKSA8PCAyNCkgfAorCQkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1baV1bN10gJiAweDdmKSA8PCAxNykgfAorCQkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1baV1bNl0gJiAweDdmKSA8PCAxMCkgfAorCQkJKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1baV1bNV0gJiAweDdmKSA8PCAzKSB8CisJCQkoKChkZWMtPm1fZmlsdGVyQ29lZmZTeW1baV1bNF0gPj4gNCkgJiAweDcpIDw8IDApOworCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkdELCBkYXRhMzIpOworCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX0RFVEFJTCwKKwkJCSJbY10gYWxmX3lfY29lZlslZF0oJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQpXG4iLAorCQkJaSwgZGVjLT5tX2ZpbHRlckNvZWZmU3ltW2ldWzBdLAorCQkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltW2ldWzFdLAorCQkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltW2ldWzJdLAorCQkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltW2ldWzNdLAorCQkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltW2ldWzRdLAorCQkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltW2ldWzVdLAorCQkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltW2ldWzZdLAorCQkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltW2ldWzddLAorCQkJZGVjLT5tX2ZpbHRlckNvZWZmU3ltW2ldWzhdKTsKKwl9CisJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUl9ERVRBSUwsCisJCSJbY10gY2ZnQUxGIC5kb25lLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19vdGhlcl9odyhzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCXVpbnQzMl90IGRhdGEzMjsKKwlzdHJ1Y3QgYXZzMl9kZWNvZGVyICphdnMyX2RlYyA9ICZkZWMtPmF2czJfZGVjOworCXN0cnVjdCBhdnMyX2ZyYW1lX3MgKmN1cl9waWMgPSBhdnMyX2RlYy0+aGMuY3VyX3BpYzsKKwlpbnQgYml0X2RlcHRoID0gY3VyX3BpYy0+Yml0X2RlcHRoOworCWludCBsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUgPQorCQljb21wdXRlX2xvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSgKKwkJZGVjLCBjdXJfcGljLT5waWNfdywKKwkJY3VyX3BpYy0+cGljX2gpOworCWludCBsb3NsZXNzX2NvbXBfYm9keV9zaXplID0KKwkJY29tcHV0ZV9sb3NsZXNzX2NvbXBfYm9keV9zaXplKAorCQlkZWMsIGN1cl9waWMtPnBpY193LAorCQljdXJfcGljLT5waWNfaCwgKGJpdF9kZXB0aCA9PSBBVlMyX0JJVFNfMTApKTsKKwljdXJfcGljLT5jb21wX2JvZHlfc2l6ZSA9IGxvc2xlc3NfY29tcF9ib2R5X3NpemU7CisKKyNpZmRlZiBMT1NMRVNTX0NPTVBSRVNTX01PREUKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDUpOworCWlmIChiaXRfZGVwdGggPT0gQVZTMl9CSVRTXzEwKQorCQlkYXRhMzIgJj0gfigxIDw8IDkpOworCWVsc2UKKwkJZGF0YTMyIHw9ICgxIDw8IDkpOworCisJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMNSwgZGF0YTMyKTsKKworI2lmZGVmIEFWUzJfMTBCX01NVQorCS8qYml0WzRdIDogcGFnZWRfbWVtX21vZGUqLworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLCAoMHgxIDw8IDQpKTsKKyNlbHNlCisJLypiaXRbM10gc21lbSBtZG9lKi8KKwlpZiAoYml0X2RlcHRoID09IEFWUzJfQklUU18xMCkKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDEsICgwIDw8IDMpKTsKKwllbHNlCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLCAoMSA8PCAzKSk7CisjZW5kaWYKKwlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMiwgKGxvc2xlc3NfY29tcF9ib2R5X3NpemUgPj4gNSkpOworCS8qV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDMsKDB4ZmY8PDIwKSB8ICgweGZmPDwxMCkgfCAweGZmKTsqLworCVdSSVRFX1ZSRUcoSEVWQ19DTV9CT0RZX0xFTkdUSCwgbG9zbGVzc19jb21wX2JvZHlfc2l6ZSk7CisJV1JJVEVfVlJFRyhIRVZDX0NNX0hFQURFUl9PRkZTRVQsIGxvc2xlc3NfY29tcF9ib2R5X3NpemUpOworCVdSSVRFX1ZSRUcoSEVWQ19DTV9IRUFERVJfTEVOR1RILCBsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUpOworI2Vsc2UKKwlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMSwgMHgxIDw8IDMxKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdTMyIGluaXRfY3V2YV9zaXplOworc3RhdGljIGludCBjdXZhX2RhdGFfaXNfYXZhaWJsZShzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCXUzMiByZWdfdmFsOworCisJcmVnX3ZhbCA9IFJFQURfVlJFRyhBVlMyX0NVVkFfREFUQV9TSVpFKTsKKwlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX01PUkUsCisJCSIlczpyZWdfdmFsOiAldSBcbiIsCisJCV9fZnVuY19fLCByZWdfdmFsKTsKKwlpZiAocmVnX3ZhbCAhPSAwICYmIHJlZ192YWwgIT0gaW5pdF9jdXZhX3NpemUpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19jdXZhX2J1ZihzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCVdSSVRFX1ZSRUcoQVZTMl9DVVZBX0FEUiwgZGVjLT5jdXZhX3BoeV9hZGRyKTsKKwlpbml0X2N1dmFfc2l6ZSA9IChkZWMtPmN1dmFfc2l6ZSA+PiA0KSA8PCAxNjsKKwlXUklURV9WUkVHKEFWUzJfQ1VWQV9EQVRBX1NJWkUsIGluaXRfY3V2YV9zaXplKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2N1dmFfZGF0YShzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCWludCBpOworCXVuc2lnbmVkIHNob3J0ICpjdXZhX2FkcjsKKwl1bnNpZ25lZCBpbnQgc2l6ZV9yZWdfdmFsID0KKwkJUkVBRF9WUkVHKEFWUzJfQ1VWQV9EQVRBX1NJWkUpOworCXVuc2lnbmVkIGludCBjdXZhX2NvdW50ID0gMDsKKwlpbnQgY3V2YV9zaXplID0gMDsKKwlzdHJ1Y3QgYXZzMl9mcmFtZV9zICpwaWMgPSBkZWMtPmF2czJfZGVjLmhjLmN1cl9waWM7CisJaWYgKHBpYyA9PSBOVUxMIHx8IDAgPT0gY3V2YV9kYXRhX2lzX2F2YWlibGUoZGVjKSkgeworCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfSERSX0lORk8sCisJCSIlczpwaWMgMHglcCBvciBkYXRhIG5vdCBhdmFpYmxlXG4iLAorCQlfX2Z1bmNfXywgcGljKTsKKwkJcmV0dXJuOworCX0KKworCWN1dmFfYWRyID0gKHVuc2lnbmVkIHNob3J0ICopZGVjLT5jdXZhX2FkZHI7CisJY3V2YV9jb3VudCA9ICgoc2l6ZV9yZWdfdmFsID4+IDE2KSA8PCA0KSA+PiAxOworCWN1dmFfc2l6ZSA9IGRlYy0+Y3V2YV9zaXplOworCWRlYy0+aGRyX2ZsYWcgfD0gSERSX0NVVkFfTUFTSzsKKworCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1JfTU9SRSwKKwkJCSIlczpwaWMgMHglcCBjdXZhX2NvdW50KCVkKSBjdXZhX3NpemUoJWQpIGhkcl9mbGFnIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgcGljLCBjdXZhX2NvdW50LCBjdXZhX3NpemUsIGRlYy0+aGRyX2ZsYWcpOworCWlmIChjdXZhX3NpemUgPiAwICYmIGN1dmFfY291bnQgPiAwKSB7CisJCWludCBuZXdfc2l6ZTsKKwkJY2hhciAqbmV3X2J1ZjsKKworCQluZXdfc2l6ZSA9IGN1dmFfc2l6ZTsKKwkJbmV3X2J1ZiA9IHZ6YWxsb2MobmV3X3NpemUpOworCQlpZiAobmV3X2J1ZikgeworCQkJdW5zaWduZWQgY2hhciAqcCA9IG5ld19idWY7CisJCQlpbnQgbGVuID0gMDsKKwkJCXBpYy0+Y3V2YV9kYXRhX2J1ZiA9IG5ld19idWY7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBjdXZhX2NvdW50OyBpICs9IDQpIHsKKwkJCQlpbnQgajsKKworCQkJCWZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKwkJCQkJdW5zaWduZWQgc2hvcnQgYWEgPSBjdXZhX2FkcltpICsgMyAtIGpdOworCQkJCQkqcCA9IGFhICYgMHhmZjsKKwkJCQkJcCsrOworCQkJCQlsZW4rKzsKKwkJCQl9CisJCQl9CisJCQlpZiAobGVuID4gMCkgeworCQkJCXBpYy0+Y3V2YV9kYXRhX3NpemUgPSBsZW47CisJCQl9CisKKwkJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1JfTU9SRSwKKwkJCQkiY3V2YTogKHNpemUgJWQpXG4iLAorCQkJCXBpYy0+Y3V2YV9kYXRhX3NpemUpOworCQkJaWYgKGdldF9kYmdfZmxhZyhkZWMpICYgQVZTMl9EQkdfSERSX0RBVEEpIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgcGljLT5jdXZhX2RhdGFfc2l6ZTsgaSsrKSB7CisJCQkJCXByX2luZm8oIiUwMnggIiwgcGljLT5jdXZhX2RhdGFfYnVmW2ldKTsKKwkJCQkJaWYgKCgoaSArIDEpICYgMHhmKSA9PSAwKQorCQkJCQkJcHJfaW5mbygiXG4iKTsKKwkJCQl9CisJCQkJcHJfaW5mbygiXG4iKTsKKwkJCX0KKworCQl9IGVsc2UgeworCQkJYXZzMl9wcmludChkZWMsIDAsICJuZXcgYnVmIGFsbG9jIGZhaWxlZFxuIik7CisJCQlpZiAocGljLT5jdXZhX2RhdGFfYnVmKQorCQkJCXZmcmVlKHBpYy0+Y3V2YV9kYXRhX2J1Zik7CisJCQlwaWMtPmN1dmFfZGF0YV9idWYgPSBOVUxMOworCQkJcGljLT5jdXZhX2RhdGFfc2l6ZSA9IDA7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfY3V2YV9kYXRhKHN0cnVjdCBhdnMyX2ZyYW1lX3MgKnBpYykKK3sKKwlpZiAocGljID09IE5VTEwpCisJCXJldHVybjsKKwlpZiAocGljLT5jdXZhX2RhdGFfYnVmKSB7CisJCXZmcmVlKHBpYy0+Y3V2YV9kYXRhX2J1Zik7CisJfQorCXBpYy0+Y3V2YV9kYXRhX2J1ZiA9IE5VTEw7CisJcGljLT5jdXZhX2RhdGFfc2l6ZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGF2czJfY29uZmlnX3dvcmtfc3BhY2VfaHcoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYykKK3sKKwlzdHJ1Y3QgQnVmZkluZm9fcyAqYnVmX3NwZWMgPSBkZWMtPndvcmtfc3BhY2VfYnVmOworI2lmZGVmIExPU0xFU1NfQ09NUFJFU1NfTU9ERQorCWludCBsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUgPQorCQljb21wdXRlX2xvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSgKKwkJZGVjLCBkZWMtPmluaXRfcGljX3csCisJCWRlYy0+aW5pdF9waWNfaCk7CisJaW50IGxvc2xlc3NfY29tcF9ib2R5X3NpemUgPQorCQljb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemUoZGVjLAorCQlkZWMtPmluaXRfcGljX3csCisJCWRlYy0+aW5pdF9waWNfaCwgYnVmX2FsbG9jX2RlcHRoID09IDEwKTsKKyNlbmRpZgorI2lmZGVmIEFWUzJfMTBCX01NVQorCXVuc2lnbmVkIGludCBkYXRhMzI7CisjZW5kaWYKKwlpZiAoZGVidWcgJiYgZGVjLT5pbml0X2ZsYWcgPT0gMCkKKwkJYXZzMl9wcmludChkZWMsIDAsCisJCQkiJXMgJXggJXggJXggJXggJXggJXggJXggJXggJXggJXggJXggJXggJXhcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWJ1Zl9zcGVjLT5pcHAuYnVmX3N0YXJ0LAorCQkJYnVmX3NwZWMtPnN0YXJ0X2FkciwKKwkJCWJ1Zl9zcGVjLT5zaG9ydF90ZXJtX3Jwcy5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+cmNzLmJ1Zl9zdGFydCwKKwkJCWJ1Zl9zcGVjLT5zcHMuYnVmX3N0YXJ0LAorCQkJYnVmX3NwZWMtPnBwcy5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+c2FvX3VwLmJ1Zl9zdGFydCwKKwkJCWJ1Zl9zcGVjLT5zd2FwX2J1Zi5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+c3dhcF9idWYyLmJ1Zl9zdGFydCwKKwkJCWJ1Zl9zcGVjLT5zY2FsZWx1dC5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zdGFydCwKKwkJCWJ1Zl9zcGVjLT5kYmxrX2RhdGEuYnVmX3N0YXJ0LAorCQkJYnVmX3NwZWMtPmRibGtfZGF0YTIuYnVmX3N0YXJ0KTsKKwlXUklURV9WUkVHKEhFVkNEX0lQUF9MSU5FQlVGRl9CQVNFLCBidWZfc3BlYy0+aXBwLmJ1Zl9zdGFydCk7CisJaWYgKChkZWJ1ZyAmIEFWUzJfREJHX1NFTkRfUEFSQU1fV0lUSF9SRUcpID09IDApCisJCVdSSVRFX1ZSRUcoSEVWQ19SUE1fQlVGRkVSLCAodTMyKWRlYy0+cnBtX3BoeV9hZGRyKTsKKwlXUklURV9WUkVHKEFWUzJfQUxGX1NXQVBfQlVGRkVSLCBidWZfc3BlYy0+c2hvcnRfdGVybV9ycHMuYnVmX3N0YXJ0KTsKKwlXUklURV9WUkVHKEhFVkNfUkNTX0JVRkZFUiwgYnVmX3NwZWMtPnJjcy5idWZfc3RhcnQpOworCVdSSVRFX1ZSRUcoSEVWQ19TUFNfQlVGRkVSLCBidWZfc3BlYy0+c3BzLmJ1Zl9zdGFydCk7CisJV1JJVEVfVlJFRyhIRVZDX1BQU19CVUZGRVIsIGJ1Zl9zcGVjLT5wcHMuYnVmX3N0YXJ0KTsKKwkvL1dSSVRFX1ZSRUcoSEVWQ19TQU9fVVAsIGJ1Zl9zcGVjLT5zYW9fdXAuYnVmX3N0YXJ0KTsKKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwlXUklURV9WUkVHKEFWUzJfTU1VX01BUF9CVUZGRVIsIGRlYy0+ZnJhbWVfbW11X21hcF9waHlfYWRkcik7CisjZWxzZQorCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fU1dBUF9CVUZGRVIsIGJ1Zl9zcGVjLT5zd2FwX2J1Zi5idWZfc3RhcnQpOworI2VuZGlmCisJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9TV0FQX0JVRkZFUjIsIGJ1Zl9zcGVjLT5zd2FwX2J1ZjIuYnVmX3N0YXJ0KTsKKwkvL1dSSVRFX1ZSRUcoSEVWQ19TQ0FMRUxVVCwgYnVmX3NwZWMtPnNjYWxlbHV0LmJ1Zl9zdGFydCk7CisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpIHsKKwkJaWYgKGJ1Zl9zcGVjLT5tYXhfd2lkdGggPD0gNDA5NiAmJiBidWZfc3BlYy0+bWF4X2hlaWdodCA8PSAyMzA0KQorCQkJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHMywgMHg0MDQwMTApOyAvL2RlZmF1bHQgdmFsdWUKKwkJZWxzZQorCQkJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHMywgMHg4MDgwMjApOyAvLyBtYWtlIGxlZnQgc3RvcmFnZSAyIHggNGtdCisJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1IsCisJCQkiSEVWQ19EQkxLX0NGRzMgPSAleFxuIiwgUkVBRF9WUkVHKEhFVkNfREJMS19DRkczKSk7CisJfQorCisJLyogY2ZnX3BfYWRkciAqLworCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGRzQsIGJ1Zl9zcGVjLT5kYmxrX3BhcmEuYnVmX3N0YXJ0KTsKKwkvKiBjZmdfZF9hZGRyICovCisJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHNSwgYnVmX3NwZWMtPmRibGtfZGF0YS5idWZfc3RhcnQpOworCisJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHRSwgYnVmX3NwZWMtPmRibGtfZGF0YTIuYnVmX3N0YXJ0KTsKKworI2lmZGVmIExPU0xFU1NfQ09NUFJFU1NfTU9ERQorCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMNSk7CisjaWYgMQorCWRhdGEzMiAmPSB+KDE8PDkpOworI2Vsc2UKKwlpZiAocGFyYW1zLT5wLmJpdF9kZXB0aCAhPSAweDAwKQorCQlkYXRhMzIgJj0gfigxPDw5KTsKKwllbHNlCisJCWRhdGEzMiB8PSAoMTw8OSk7CisjZW5kaWYKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw1LCBkYXRhMzIpOworI2lmZGVmIEFWUzJfMTBCX01NVQorCS8qYml0WzRdIDogcGFnZWRfbWVtX21vZGUqLworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLCAoMHgxIDw8IDQpKTsKKwlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMiwgMCk7CisjZWxzZQorCS8qIGJpdFszXSBzbWVtIG1vZGUqLworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLCAoMDw8MykpOworCisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDIsIChsb3NsZXNzX2NvbXBfYm9keV9zaXplID4+IDUpKTsKKyNlbmRpZgorCS8qV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDIsKGxvc2xlc3NfY29tcF9ib2R5X3NpemUgPj4gNSkpOyovCisJLypXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMywoMHhmZjw8MjApIHwgKDB4ZmY8PDEwKSB8IDB4ZmYpOyovCisvKjgtYml0IG1vZGUgKi8KKwlXUklURV9WUkVHKEhFVkNfQ01fQk9EWV9MRU5HVEgsIGxvc2xlc3NfY29tcF9ib2R5X3NpemUpOworCVdSSVRFX1ZSRUcoSEVWQ19DTV9IRUFERVJfT0ZGU0VULCBsb3NsZXNzX2NvbXBfYm9keV9zaXplKTsKKwlXUklURV9WUkVHKEhFVkNfQ01fSEVBREVSX0xFTkdUSCwgbG9zbGVzc19jb21wX2hlYWRlcl9zaXplKTsKKyNlbHNlCisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDEsIDB4MSA8PCAzMSk7CisjZW5kaWYKKworI2lmZGVmIEFWUzJfMTBCX01NVQorCVdSSVRFX1ZSRUcoSEVWQ19TQU9fTU1VX1ZIMF9BRERSLCBidWZfc3BlYy0+bW11X3ZiaC5idWZfc3RhcnQpOworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fTU1VX1ZIMV9BRERSLCBidWZfc3BlYy0+bW11X3ZiaC5idWZfc3RhcnQKKwkJCSsgVkJIX0JVRl9TSVpFKGJ1Zl9zcGVjKSk7CisJLypkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDkpOyovCisJLypkYXRhMzIgfD0gMHgxOyovCisJLypXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw5LCBkYXRhMzIpOyovCisKKwkvKiB1c2UgSEVWQ19DTV9IRUFERVJfU1RBUlRfQUREUiAqLworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMNSk7CisJZGF0YTMyIHw9ICgxPDwxMCk7CisjaWYgMQorCWlmIChkZWJ1ZyAmIEFWUzJfREJHX0ZPUkNFX1VOQ09NUFJFU1MpCisJCWRhdGEzMiB8PSAweDgwOworI2VuZGlmCisJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMNSwgZGF0YTMyKTsKKworI2VuZGlmCisKKwlXUklURV9WUkVHKExNRU1fRFVNUF9BRFIsICh1MzIpZGVjLT5sbWVtX3BoeV9hZGRyKTsKKyNpZiAxCisvKk1VTFRJX0lOU1RBTkNFX1NVUFBPUlQqLworCS8qbmV3IGFkZGVkIGluIHNpbXVsYXRpb24/Pz8qLworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9BQlZfU1RBUlRfQUREUiwgYnVmX3NwZWMtPm1wcmVkX2Fib3ZlLmJ1Zl9zdGFydCk7CisjZW5kaWYKKyNpZmRlZiBDT19NVl9DT01QUkVTUworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3KSB7CisJICAgIGRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX01QUkVEX0NUUkw0KTsKKwkgICAgZGF0YTMyIHw9ICAoMSA8PCAxKTsKKwkgICAgV1JJVEVfVlJFRyhIRVZDX01QUkVEX0NUUkw0LCBkYXRhMzIpOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBkZWNvbXBfcGVyZmNvdW50X3Jlc2V0KHZvaWQpCit7CisJaWYgKGRlYnVnICYgQVZTMl9EQkdfQ0FDSEUpCisJCXByX2luZm8oIltjYWNoZV91dGlsLmNdIEVudGVyZWQgZGVjb21wX3BlcmZjb3VudF9yZXNldC4uLlxuIik7CisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KTB4MSk7CisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KTB4MCk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBtY3JjY19wZXJmY291bnRfcmVzZXQodm9pZCkKK3sKKwlpZiAoZGVidWcgJiBBVlMyX0RCR19DQUNIRSkKKwkJcHJfaW5mbygiW2NhY2hlX3V0aWwuY10gRW50ZXJlZCBtY3JjY19wZXJmY291bnRfcmVzZXQuLi5cbiIpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpMHgxKTsKKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KTB4MCk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBhdnMyX2luaXRfZGVjb2Rlcl9odyhzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCXVuc2lnbmVkIGludCBkYXRhMzI7CisJdW5zaWduZWQgaW50IGRlY29kZV9tb2RlOworCWludCBpOworCisJLyppZiAoZGVidWcgJiBBVlMyX0RCR19CVUZNR1JfTU9SRSkKKwkJcHJfaW5mbygiJXNcbiIsIF9fZnVuY19fKTsqLworCQlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfSU5UX0NPTlRST0wpOworI2lmIDEKKwkJLyogc2V0IGJpdCAzMX4yOSB0byAzIGlmIEhFVkNfU1RSRUFNX0ZJRk9fQ1RMWzI5XSBpcyAxICovCisJCWRhdGEzMiAmPSB+KDcgPDwgMjkpOworCQlkYXRhMzIgfD0gKDMgPDwgMjkpOworI2VuZGlmCisJCWRhdGEzMiA9IGRhdGEzMiB8CisJCSgxIDw8IDI0KSB8LypzdHJlYW1fYnVmZmVyX2VtcHR5X2ludF9hbXJpc2NfZW5hYmxlKi8KKwkJKDEgPDwgMjIpIHwvKnN0cmVhbV9maWZvX2VtcHR5X2ludF9hbXJpc2NfZW5hYmxlKi8KKwkJKDEgPDwgNykgfC8qZGVjX2RvbmVfaW50X2NwdV9lbmFibGUqLworCQkoMSA8PCA0KSB8LypzdGFydGNvZGVfZm91bmRfaW50X2NwdV9lbmFibGUqLworCQkoMCA8PCAzKSB8LypzdGFydGNvZGVfZm91bmRfaW50X2FtcmlzY19lbmFibGUqLworCQkoMSA8PCAwKSAgICAvKnBhcnNlcl9pbnRfZW5hYmxlKi8KKwkJOworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfSU5UX0NPTlRST0wsIGRhdGEzMik7CisKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9TVEFUVVMpOworCWRhdGEzMiA9IGRhdGEzMiB8CisJKDAgPDwgMSkgfC8qZW11bGF0aW9uX2NoZWNrX29mZiBWUDkKKwkJZG8gbm90IGhhdmUgZW11bGF0aW9uKi8KKwkoMSA8PCAwKS8qc3RhcnRjb2RlX2NoZWNrX29uKi8KKwk7CisJV1JJVEVfVlJFRyhIRVZDX1NISUZUX1NUQVRVUywgZGF0YTMyKTsKKwlXUklURV9WUkVHKEhFVkNfU0hJRlRfQ09OVFJPTCwKKwkJKDYgPDwgMjApIHwgLyogZW11X3B1c2hfYml0cyAgKDYtYml0cyBmb3IgQVZTMikqLworCQkoMCA8PCAxOSkgfCAvKiBlbXVfM19lbmFibGUsIG1heWJlIHR1cm5lZCBvbiBpbiBtaWNyb2NvZGUqLworCQkoMCA8PCAxOCkgfCAvKiBlbXVfMl9lbmFibGUsIG1heWJlIHR1cm5lZCBvbiBpbiBtaWNyb2NvZGUqLworCQkoMCA8PCAxNykgfCAvKiBlbXVfMV9lbmFibGUsIG1heWJlIHR1cm5lZCBvbiBpbiBtaWNyb2NvZGUqLworCQkoMCA8PCAxNikgfCAvKiBlbXVfMF9lbmFibGUsIG1heWJlIHR1cm5lZCBvbiBpbiBtaWNyb2NvZGUqLworCQkoMCA8PCAxNCkgfCAvKmRpc2FibGVfc3RhcnRfY29kZV9wcm90ZWN0Ki8KKwkJKDMgPDwgNikgfCAvKiBzZnRfdmFsaWRfd3JfcG9zaXRpb24qLworCQkoMiA8PCA0KSB8IC8qIGVtdWxhdGVfY29kZV9sZW5ndGhfc3ViXzEqLworCQkoMiA8PCAxKSB8IC8qIHN0YXJ0X2NvZGVfbGVuZ3RoX3N1Yl8xKi8KKwkJKDEgPDwgMCkgICAvKiBzdHJlYW1fc2hpZnRfZW5hYmxlKi8KKwkJKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9MRU5HVEhfUFJPVEVDVCwKKwkJKDAgPDwgMzApIHwgICAvKmRhdGFfcHJvdGVjdF9maWxsXzAwX2VuYWJsZSovCisJCSgxIDw8IDI5KSAgICAgLypkYXRhX3Byb3RlY3RfZmlsbF9mZl9lbmFibGUqLworCQkpOworCVdSSVRFX1ZSRUcoSEVWQ19DQUJBQ19DT05UUk9MLAorCQkoMSA8PCAwKS8qY2FiYWNfZW5hYmxlKi8KKwkpOworCisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9DT1JFX0NPTlRST0wsCisJCSgxIDw8IDApLyogaGV2Y19wYXJzZXJfY29yZV9jbGtfZW4qLworCSk7CisKKworCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgMCk7CisKKwkvKkluaXRpYWwgSVFJVF9TQ0FMRUxVVCBtZW1vcnkgLS0ganVzdCB0byBhdm9pZCBYIGluIHNpbXVsYXRpb24qLworCWlmIChpc19yZG1hX2VuYWJsZSgpKQorCQlyZG1hX2JhY2tfZW5kX3dvcmsoZGVjLT5yZG1hX3BoeV9hZHIsIFJETUFfU0laRSk7CisJZWxzZSB7CisJCVdSSVRFX1ZSRUcoSEVWQ19JUUlUX1NDQUxFTFVUX1dSX0FERFIsIDApOy8qY2ZnX3BfYWRkciovCisJCWZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisJCQlXUklURV9WUkVHKEhFVkNfSVFJVF9TQ0FMRUxVVF9EQVRBLCAwKTsKKwl9CisKKyNpZmRlZiBFTkFCTEVfU1dBUF9URVNUCisJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9TV0FQX1RFU1QsIDEwMCk7CisjZWxzZQorCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fU1dBUF9URVNULCAwKTsKKyNlbmRpZgorCWlmICghZGVjLT5tX2luc19mbGFnKQorCQlkZWNvZGVfbW9kZSA9IERFQ09ERV9NT0RFX1NJTkdMRTsKKwllbHNlIGlmICh2ZGVjX2ZyYW1lX2Jhc2VkKGh3X3RvX3ZkZWMoZGVjKSkpCisJCWRlY29kZV9tb2RlID0gREVDT0RFX01PREVfTVVMVElfRlJBTUVCQVNFOworCWVsc2UKKwkJZGVjb2RlX21vZGUgPSBERUNPREVfTU9ERV9NVUxUSV9TVFJFQU1CQVNFOworCWlmIChkZWMtPmF2czJfZGVjLmJ1Zm1ncl9lcnJvcl9mbGFnICYmCisJCShlcnJvcl9oYW5kbGVfcG9saWN5ICYgMHgxKSkgeworCQlkZWMtPmJ1Zm1ncl9lcnJvcl9jb3VudCsrOworCQlkZWMtPmF2czJfZGVjLmJ1Zm1ncl9lcnJvcl9mbGFnID0gMDsKKwkJaWYgKGRlYy0+YnVmbWdyX2Vycm9yX2NvdW50ID4KKwkJCShyZV9zZWFyY2hfc2VxX3RocmVzaG9sZCAmIDB4ZmYpCisJCQkmJiBkZWMtPmZyYW1lX2NvdW50ID4KKwkJCSgocmVfc2VhcmNoX3NlcV90aHJlc2hvbGQgPj4gOCkgJiAweGZmKSkgeworCQkJc3RydWN0IGF2czJfZGVjb2RlciAqYXZzMl9kZWMgPSAmZGVjLT5hdnMyX2RlYzsKKwkJCWRlYy0+c3RhcnRfZGVjb2RpbmdfZmxhZyA9IDA7CisJCQlhdnMyX2RlYy0+aGQudmVjX2ZsYWcgPSAxOworCQkJZGVjLT5za2lwX1BCX2JlZm9yZV9JID0gMTsKKwkJCWF2czJfcHJpbnQoZGVjLCAwLAorCQkJCSIhIUJ1Zm1nciBlcnJvciwgc2VhcmNoIHNlcSBhZ2FpbiAoMHgleCAlZCAlZClcbiIsCisJCQkJZXJyb3JfaGFuZGxlX3BvbGljeSwKKwkJCQlkZWMtPmZyYW1lX2NvdW50LAorCQkJCWRlYy0+YnVmbWdyX2Vycm9yX2NvdW50KTsKKwkJCWRlYy0+YnVmbWdyX2Vycm9yX2NvdW50ID0gMDsKKwkJfQorCX0KKwlkZWNvZGVfbW9kZSB8PSAoZGVjLT5zdGFydF9kZWNvZGluZ19mbGFnIDw8IDE2KTsKKworCVdSSVRFX1ZSRUcoREVDT0RFX01PREUsIGRlY29kZV9tb2RlKTsKKwlXUklURV9WUkVHKEhFVkNfREVDT0RFX1NJWkUsIDApOworCVdSSVRFX1ZSRUcoSEVWQ19ERUNPREVfQ09VTlQsIDApOworCisJLypTZW5kIHBhcnNlcl9jbWQqLworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfQ01EX1dSSVRFLCAoMSA8PCAxNikgfCAoMCA8PCAwKSk7CisJZm9yIChpID0gMDsgaSA8IFBBUlNFUl9DTURfTlVNQkVSOyBpKyspCisJCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfQ01EX1dSSVRFLCBwYXJzZXJfY21kW2ldKTsKKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0NNRF9TS0lQXzAsIFBBUlNFUl9DTURfU0tJUF9DRkdfMCk7CisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9DTURfU0tJUF8xLCBQQVJTRVJfQ01EX1NLSVBfQ0ZHXzEpOworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfQ01EX1NLSVBfMiwgUEFSU0VSX0NNRF9TS0lQX0NGR18yKTsKKworCisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9JRl9DT05UUk9MLAorCQkoMSA8PCA5KSB8IC8qIHBhcnNlcl9hbGZfaWZfZW4qLworCQkvKiAgKDEgPDwgOCkgfCovIC8qc2FvX3N3X3ByZWRfZW5hYmxlKi8KKwkJKDEgPDwgNSkgfCAvKnBhcnNlcl9zYW9faWZfZW4qLworCQkoMSA8PCAyKSB8IC8qcGFyc2VyX21wcmVkX2lmX2VuKi8KKwkJKDEgPDwgMCkgLypwYXJzZXJfc2NhbGVyX2lmX2VuKi8KKwkpOworCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9JTlRfU1RBVFVTLCAoMTw8MzEpKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfUkVTVUxUXzMsIDB4ZmZmZmZmZmYpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfTVBSRURfQUJWX1NUQVJUX0FERFIpOworCisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQzLCAoMTw8MTgpKTsgLyogcmVzZXQgbXByZWQgKi8KKwlXUklURV9WUkVHKERPU19TV19SRVNFVDMsIDApOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9BQlZfU1RBUlRfQUREUiwgZGF0YTMyKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfQUJWX1NUQVJUX0FERFIsIGRhdGEzMik7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0FCVl9TVEFSVF9BRERSLCBkYXRhMzIpOworI2VuZGlmCisJLypFbmQgb2YgTXVsdGktaW5zdGFuY2UqLworCS8qQ2hhbmdlZCB0byBTdGFydCBNUFJFRCBpbiBtaWNyb2NvZGUqLworCS8qCisJcHJfaW5mbygiW3Rlc3QuY10gU3RhcnQgTVBSRURcbiIpOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9JTlRfU1RBVFVTLAorCSgxPDwzMSkKKwkpOworCSovCisKKwkvKkFWUzIgZGVmYXVsdCBzZXFfd3FfbWF0cml4IGNvbmZpZyovCisKKwlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX01PUkUsCisJCSJDb25maWcgQVZTMiBkZWZhdWx0IHNlcV93cV9tYXRyaXggLi4uXG4iKTsKKwkvKjR4NCovCisJIC8qIGRlZmF1bHQgc2VxX3dxX21hdHJpeF80eDQgYmVnaW4gYWRkcmVzcyovCisJV1JJVEVfVlJFRyhIRVZDX0lRSVRfU0NBTEVMVVRfV1JfQUREUiwgNjQpOworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQlXUklURV9WUkVHKEhFVkNfSVFJVF9TQ0FMRUxVVF9EQVRBLCBnX1dxTURlZmF1bHQ0eDRbaV0pOworCisJLyo4eDgqLworCS8qZGVmYXVsdCBzZXFfd3FfbWF0cml4Xzh4OCBiZWdpbiBhZGRyZXNzKi8KKwlXUklURV9WUkVHKEhFVkNfSVFJVF9TQ0FMRUxVVF9XUl9BRERSLCAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKwkJV1JJVEVfVlJFRyhIRVZDX0lRSVRfU0NBTEVMVVRfREFUQSwgZ19XcU1EZWZhdWx0OHg4W2ldKTsKKworCisJV1JJVEVfVlJFRyhIRVZDRF9JUFBfVE9QX0NOVEwsCisJCSgwIDw8IDEpIHwgLyplbmFibGUgaXBwKi8KKwkJKDEgPDwgMCkgICAvKnNvZnR3YXJlIHJlc2V0IGlwcCBhbmQgbXBwKi8KKwkpOworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX1RPUF9DTlRMLAorCQkoMSA8PCAxKSB8IC8qZW5hYmxlIGlwcCovCisJCSgwIDw8IDApICAgLypzb2Z0d2FyZSByZXNldCBpcHAgYW5kIG1wcCovCisJKTsKKyNpZiAwCisvKkFWUzJfMTBCX05WMjEqLworCS8qRW5hYmxlIE5WMjEgcmVmZXJlbmNlIHJlYWQgbW9kZSBmb3IgTUMqLworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLCAweDEgPDwgMzEpOworI2VuZGlmCisJLyogSW5pdCBkYmxrKi8KKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19EQkxLX0NGR0IpOworCWRhdGEzMiB8PSAoMiA8PCAwKTsKKwkvKiBbMzowXSBjZmdfdmlkZW9fdHlwZSAtPiBBVlMyKi8KKworCWRhdGEzMiAmPSAofjB4MzAwKTsgLypbOF06Zmlyc3Qgd3JpdGUgZW5hYmxlIChjb21wcmVzcykKKwkJCQkJWzldOmRvdWJsZSB3cml0ZSBlbmFibGUgKHVuY29tcHJlc3MpKi8KKwlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGRlYykgPT0gMCkKKwkJZGF0YTMyIHw9ICgweDEgPDwgOCk7IC8qZW5hYmxlIGZpcnN0IHdyaXRlKi8KKwllbHNlIGlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUoZGVjKSA9PSAweDEwKQorCQlkYXRhMzIgfD0gKDB4MSA8PCA5KTsgLypkb3VibGUgd3JpdGUgb25seSovCisJZWxzZQorCQlkYXRhMzIgfD0gKCgweDEgPDwgOCkgfCAoMHgxIDw8IDkpKTsKKwlXUklURV9WUkVHKEhFVkNfREJMS19DRkdCLCBkYXRhMzIpOworCisJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHMCwgKDEgPDwgMCkpOyAvKiBbMF0gcnN0X3N5bmMqLworCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1JfTU9SRSwKKwkJIkJpdHN0cmVhbSBsZXZlbCBJbml0IGZvciBEQkxLIC5Eb25lLlxuIik7CisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpIHsKKwkgICAgbWNyY2NfcGVyZmNvdW50X3Jlc2V0KCk7CisJICAgIGRlY29tcF9wZXJmY291bnRfcmVzZXQoKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKworI2lmZGVmIENPTkZJR19IRVZDX0NMS19GT1JDRURfT04KK3N0YXRpYyB2b2lkIGNvbmZpZ19hdnMyX2Nsa19mb3JjZWRfb24odm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgcmRhdGEzMjsKKwkvKklRSVQqLworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19JUUlUX0NMS19SU1RfQ1RSTCk7CisJV1JJVEVfVlJFRyhIRVZDX0lRSVRfQ0xLX1JTVF9DVFJMLCByZGF0YTMyIHwgKDB4MSA8PCAyKSk7CisKKwkvKiBEQkxLKi8KKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfREJMS19DRkcwKTsKKwlXUklURV9WUkVHKEhFVkNfREJMS19DRkcwLCByZGF0YTMyIHwgKDB4MSA8PCAyKSk7CisKKwkvKiBTQU8qLworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDEpOworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDEsIHJkYXRhMzIgfCAoMHgxIDw8IDIpKTsKKworCS8qTVBSRUQqLworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19NUFJFRF9DVFJMMSk7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0NUUkwxLCByZGF0YTMyIHwgKDB4MSA8PCAyNCkpOworCisJLyogUEFSU0VSKi8KKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0NPTlRST0wpOworCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fQ09OVFJPTCwgcmRhdGEzMiB8ICgweDEgPDwgMTUpKTsKKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0hJRlRfQ09OVFJPTCk7CisJV1JJVEVfVlJFRyhIRVZDX1NISUZUX0NPTlRST0wsIHJkYXRhMzIgfCAoMHgxIDw8IDE1KSk7CisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX0NBQkFDX0NPTlRST0wpOworCVdSSVRFX1ZSRUcoSEVWQ19DQUJBQ19DT05UUk9MLCByZGF0YTMyIHwgKDB4MSA8PCAxMykpOworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfQ09SRV9DT05UUk9MKTsKKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0NPUkVfQ09OVFJPTCwgcmRhdGEzMiB8ICgweDEgPDwgMTUpKTsKKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0lOVF9DT05UUk9MKTsKKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0lOVF9DT05UUk9MLCByZGF0YTMyIHwgKDB4MSA8PCAxNSkpOworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfSUZfQ09OVFJPTCk7CisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9JRl9DT05UUk9MLAorCQkJcmRhdGEzMiB8ICgweDEgPDwgNikgfCAoMHgxIDw8IDMpIHwgKDB4MSA8PCAxKSk7CisKKwkvKklQUCovCisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDRF9JUFBfRFlOQ0xLR0FURV9DT05GSUcpOworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX0RZTkNMS0dBVEVfQ09ORklHLCByZGF0YTMyIHwgMHhmZmZmZmZmZik7CisKKwkvKiBNQ1JDQyovCisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDRF9NQ1JDQ19DVEwxKTsKKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDEsIHJkYXRhMzIgfCAoMHgxIDw8IDMpKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBhdnMyX2xvY2FsX3VuaW5pdChzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCWRlYy0+cnBtX3B0ciA9IE5VTEw7CisJZGVjLT5sbWVtX3B0ciA9IE5VTEw7CisJaWYgKGRlYy0+cnBtX2FkZHIpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCQkJUlBNX0JVRl9TSVpFLCBkZWMtPnJwbV9hZGRyLAorCQkJCQkJZGVjLT5ycG1fcGh5X2FkZHIpOworCQlkZWMtPnJwbV9hZGRyID0gTlVMTDsKKwl9CisKKwlpZiAoZGVjLT5jdXZhX2FkZHIpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCWRlYy0+Y3V2YV9zaXplLCBkZWMtPmN1dmFfYWRkciwKKwkJCQkJZGVjLT5jdXZhX3BoeV9hZGRyKTsKKwkJZGVjLT5jdXZhX2FkZHIgPSBOVUxMOworCX0KKworCWlmIChkZWMtPmxtZW1fYWRkcikgeworCQkJaWYgKGRlYy0+bG1lbV9waHlfYWRkcikKKwkJCQlkbWFfZnJlZV9jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJCQlMTUVNX0JVRl9TSVpFLCBkZWMtPmxtZW1fYWRkciwKKwkJCQkJCWRlYy0+bG1lbV9waHlfYWRkcik7CisJCWRlYy0+bG1lbV9hZGRyID0gTlVMTDsKKwl9CisKKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwlpZiAoZGVjLT5mcmFtZV9tbXVfbWFwX2FkZHIpIHsKKwkJaWYgKGRlYy0+ZnJhbWVfbW11X21hcF9waHlfYWRkcikKKwkJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlnZXRfZnJhbWVfbW11X21hcF9zaXplKGRlYyksIGRlYy0+ZnJhbWVfbW11X21hcF9hZGRyLAorCQkJCQlkZWMtPmZyYW1lX21tdV9tYXBfcGh5X2FkZHIpOworCQlkZWMtPmZyYW1lX21tdV9tYXBfYWRkciA9IE5VTEw7CisJfQorI2VuZGlmCisJaWYgKGRlYy0+Z3ZzKQorCQl2ZnJlZShkZWMtPmd2cyk7CisJZGVjLT5ndnMgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGF2czJfbG9jYWxfaW5pdChzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCWludCByZXQgPSAtMTsKKwkvKmludCBsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUsIGxvc2xlc3NfY29tcF9ib2R5X3NpemU7Ki8KKworCXN0cnVjdCBCdWZmSW5mb19zICpjdXJfYnVmX2luZm8gPSBOVUxMOworCisJY3VyX2J1Zl9pbmZvID0gJmRlYy0+d29ya19zcGFjZV9idWZfc3RvcmU7CisJaWYgKGZvcmNlX2J1ZnNwZWMpIHsKKwkJbWVtY3B5KGN1cl9idWZfaW5mbywgJmFtdmF2czJfd29ya2J1ZmZfc3BlY1tmb3JjZV9idWZzcGVjICYgMHhmXSwKKwkJc2l6ZW9mKHN0cnVjdCBCdWZmSW5mb19zKSk7CisJCXByX2luZm8oImZvcmNlIGJ1ZmZlciBzcGVjICVkXG4iLCBmb3JjZV9idWZzcGVjICYgMHhmKTsKKwl9IGVsc2UgeworCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDw9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UTTIgJiYgIWlzX2NwdV90bTJfcmV2YigpKSB7CisJCQlpZiAodmRlY19pc19zdXBwb3J0XzRrKCkpIHsKKwkJCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpCisJCQkJCW1lbWNweShjdXJfYnVmX2luZm8sICZhbXZhdnMyX3dvcmtidWZmX3NwZWNbMl0sCS8qIDhrICovCisJCQkJCXNpemVvZihzdHJ1Y3QgQnVmZkluZm9fcykpOworCQkJCWVsc2UKKwkJCQkJbWVtY3B5KGN1cl9idWZfaW5mbywgJmFtdmF2czJfd29ya2J1ZmZfc3BlY1sxXSwJLyogNGsgKi8KKwkJCQkJc2l6ZW9mKHN0cnVjdCBCdWZmSW5mb19zKSk7CisJCQl9IGVsc2UKKwkJCQltZW1jcHkoY3VyX2J1Zl9pbmZvLCAmYW12YXZzMl93b3JrYnVmZl9zcGVjWzBdLC8qIDEwODBwICovCisJCQkJc2l6ZW9mKHN0cnVjdCBCdWZmSW5mb19zKSk7CisJCX0gZWxzZSB7IC8vZ2V0X2NwdV9tYWpvcl9pZCgpID4gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RNMiB8fCBpc19jcHVfdG0yX3JldmIoKQorCQkJaWYgKHZkZWNfaXNfc3VwcG9ydF80aygpKSB7CisJCQkJbWVtY3B5KGN1cl9idWZfaW5mbywgJmFtdmF2czJfd29ya2J1ZmZfc3BlY1s1XSwJLyogOGsgKi8KKwkJCQlzaXplb2Yoc3RydWN0IEJ1ZmZJbmZvX3MpKTsKKwkJCX0gZWxzZQorCQkJCW1lbWNweShjdXJfYnVmX2luZm8sICZhbXZhdnMyX3dvcmtidWZmX3NwZWNbM10sLyogMTA4MHAgKi8KKwkJCQlzaXplb2Yoc3RydWN0IEJ1ZmZJbmZvX3MpKTsKKwkJfQorCX0KKworCWN1cl9idWZfaW5mby0+c3RhcnRfYWRyID0gZGVjLT5idWZfc3RhcnQ7CisjaWZuZGVmIEFWUzJfMTBCX01NVQorCWRlYy0+bWNfYnVmX3NwZWMuYnVmX2VuZCA9IGRlYy0+YnVmX3N0YXJ0ICsgZGVjLT5idWZfc2l6ZTsKKyNlbmRpZgorCisJaW5pdF9idWZmX3NwZWMoZGVjLCBjdXJfYnVmX2luZm8pOworCisJaW5pdF9hdnMyX2RlY29kZXIoJmRlYy0+YXZzMl9kZWMpOworCisjaWZkZWYgQVZTMl8xMEJfTU1VCisJYXZzMl9idWZtZ3JfaW5pdChkZWMsIGN1cl9idWZfaW5mbywgTlVMTCk7CisjZWxzZQorCWRlYy0+bWNfYnVmX3NwZWMuYnVmX3N0YXJ0ID0gKGN1cl9idWZfaW5mby0+ZW5kX2FkciArIDB4ZmZmZikKKwkgICAgJiAofjB4ZmZmZik7CisJZGVjLT5tY19idWZfc3BlYy5idWZfc2l6ZSA9IChkZWMtPm1jX2J1Zl9zcGVjLmJ1Zl9lbmQKKwkgICAgLSBkZWMtPm1jX2J1Zl9zcGVjLmJ1Zl9zdGFydCk7CisJaWYgKGRlYnVnKSB7CisJCXByX2VycigiZGVjLT5tY19idWZfc3BlYy5idWZfc3RhcnQgJXgtJXhcbiIsCisJCQlkZWMtPm1jX2J1Zl9zcGVjLmJ1Zl9zdGFydCwKKwkJCWRlYy0+bWNfYnVmX3NwZWMuYnVmX3N0YXJ0ICsKKwkJCWRlYy0+bWNfYnVmX3NwZWMuYnVmX3NpemUpOworCX0KKwlhdnMyX2J1Zm1ncl9pbml0KGRlYywgY3VyX2J1Zl9pbmZvLCAmZGVjLT5tY19idWZfc3BlYyk7CisjZW5kaWYKKworCWlmICghdmRlY19pc19zdXBwb3J0XzRrKCkKKwkJJiYgKGJ1Zl9hbGxvY193aWR0aCA+IDE5MjAgJiYgIGJ1Zl9hbGxvY19oZWlnaHQgPiAxMDg4KSkgeworCQlidWZfYWxsb2Nfd2lkdGggPSAxOTIwOworCQlidWZfYWxsb2NfaGVpZ2h0ID0gMTA4ODsKKwl9IGVsc2UgaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKSB7CisJCWJ1Zl9hbGxvY193aWR0aCA9IDgxOTI7CisJCWJ1Zl9hbGxvY19oZWlnaHQgPSA0NjA4OworCX0KKwlkZWMtPmluaXRfcGljX3cgPSBidWZfYWxsb2Nfd2lkdGggPyBidWZfYWxsb2Nfd2lkdGggOgorCQkoZGVjLT52YXZzMl9hbXN0cmVhbV9kZWNfaW5mby53aWR0aCA/CisJCWRlYy0+dmF2czJfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGggOgorCQlkZWMtPndvcmtfc3BhY2VfYnVmLT5tYXhfd2lkdGgpOworCWRlYy0+aW5pdF9waWNfaCA9IGJ1Zl9hbGxvY19oZWlnaHQgPyBidWZfYWxsb2NfaGVpZ2h0IDoKKwkJKGRlYy0+dmF2czJfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0ID8KKwkJZGVjLT52YXZzMl9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQgOgorCQlkZWMtPndvcmtfc3BhY2VfYnVmLT5tYXhfaGVpZ2h0KTsKKyNpZiAwCisvKm5kZWYgTVZfVVNFX0ZJWEVEX0JVRiovCisJaWYgKGluaXRfbXZfYnVmX2xpc3QoZGVjKSA8IDApIHsKKwkJcHJfZXJyKCIlczogaW5pdF9tdl9idWZfbGlzdCBmYWlsXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtMTsKKwl9CisjZW5kaWYKKworI2lmbmRlZiBBVlMyXzEwQl9NTVUKKwlpbml0X2J1Zl9saXN0KGRlYyk7CisjZWxzZQorCWRlYy0+dXNlZF9idWZfbnVtID0gbWF4X2J1Zl9udW0gKyBkZWMtPmR5bmFtaWNfYnVmX21hcmdpbjsKKwlpZiAoZGVjLT51c2VkX2J1Zl9udW0gPiBNQVhfQlVGX05VTSkKKwkJZGVjLT51c2VkX2J1Zl9udW0gPSBNQVhfQlVGX05VTTsKKwlpZiAoZGVjLT51c2VkX2J1Zl9udW0gPiBGUkFNRV9CVUZGRVJTKQorCQlkZWMtPnVzZWRfYnVmX251bSA9IEZSQU1FX0JVRkZFUlM7CisjZW5kaWYKKwlkZWMtPmF2czJfZGVjLnJlZl9tYXhidWZmZXIgPSBkZWMtPnVzZWRfYnVmX251bSAtIDE7CisJLyppbml0X3BpY19saXN0KGRlYyk7Ki8KKworCXB0c191bnN0YWJsZSA9ICgodW5zaWduZWQgbG9uZykoZGVjLT52YXZzMl9hbXN0cmVhbV9kZWNfaW5mby5wYXJhbSkKKwkJCSYgMHg0MCkgPj4gNjsKKworCWlmICgoZGVidWcgJiBBVlMyX0RCR19TRU5EX1BBUkFNX1dJVEhfUkVHKSA9PSAwKSB7CisJCWRlYy0+cnBtX2FkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJUlBNX0JVRl9TSVpFLAorCQkJJmRlYy0+cnBtX3BoeV9hZGRyLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGRlYy0+cnBtX2FkZHIgPT0gTlVMTCkgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFsbG9jIHJwbSBidWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSLAorCQkJInJwbV9waHlfYWRkciAleFxuIiwgKHUzMikgZGVjLT5ycG1fcGh5X2FkZHIpOworCQlkZWMtPnJwbV9wdHIgPSBkZWMtPnJwbV9hZGRyOworCX0KKworCWlmIChjdXZhX2J1Zl9zaXplID4gMCkgeworCQlkZWMtPmN1dmFfc2l6ZSA9IEFVWF9CVUZfQUxJR04oY3V2YV9idWZfc2l6ZSk7CisKKwkJZGVjLT5jdXZhX2FkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCWRlYy0+Y3V2YV9zaXplLCAmZGVjLT5jdXZhX3BoeV9hZGRyLCBHRlBfS0VSTkVMKTsKKwkgICAgICAgIGF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1IsCisJCQkiJXMsIGN1dmFfc2l6ZSA9ICVkIGN1dmFfcGh5X2FkZHIgJXggZGVjLT5jdXZhX2FkZHIgPSAlcHhcbiIsCisJCQlfX2Z1bmNfXywgZGVjLT5jdXZhX3NpemUsICh1MzIpZGVjLT5jdXZhX3BoeV9hZGRyLCBkZWMtPmN1dmFfYWRkcik7CisJCWlmIChkZWMtPmN1dmFfYWRkciA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgY3V2YSBidWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWRlYy0+bG1lbV9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCUxNRU1fQlVGX1NJWkUsCisJCQkmZGVjLT5sbWVtX3BoeV9hZGRyLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGVjLT5sbWVtX2FkZHIgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgbG1lbSBidWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZQorCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSLAorCQkJIiVzLCBsbWVtX3BoeV9hZGRyICV4XG4iLAorCQkJX19mdW5jX18sICh1MzIpZGVjLT5sbWVtX3BoeV9hZGRyKTsKKy8qCisJZGVjLT5sbWVtX3BoeV9hZGRyID0gZG1hX21hcF9zaW5nbGUoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQlkZWMtPmxtZW1fYWRkciwgTE1FTV9CVUZfU0laRSwgRE1BX0JJRElSRUNUSU9OQUwpOworCWlmIChkbWFfbWFwcGluZ19lcnJvcihhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCWRlYy0+bG1lbV9waHlfYWRkcikpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIG1hcCBsbWVtIGJ1ZmZlclxuIiwgX19mdW5jX18pOworCQlrZnJlZShkZWMtPmxtZW1fYWRkcik7CisJCWRlYy0+bG1lbV9hZGRyID0gTlVMTDsKKwkJcmV0dXJuIC0xOworCX0KKyovCisJZGVjLT5sbWVtX3B0ciA9IGRlYy0+bG1lbV9hZGRyOworCisKKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwlkZWMtPmZyYW1lX21tdV9tYXBfYWRkciA9IGRtYV9hbGxvY19jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJZ2V0X2ZyYW1lX21tdV9tYXBfc2l6ZShkZWMpLAorCQkJCSZkZWMtPmZyYW1lX21tdV9tYXBfcGh5X2FkZHIsIEdGUF9LRVJORUwpOworCWlmIChkZWMtPmZyYW1lX21tdV9tYXBfYWRkciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvYyBjb3VudF9idWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1zZXQoZGVjLT5mcmFtZV9tbXVfbWFwX2FkZHIsIDAsIGdldF9mcmFtZV9tbXVfbWFwX3NpemUoZGVjKSk7CisvKglkZWMtPmZyYW1lX21tdV9tYXBfcGh5X2FkZHIgPSBkbWFfbWFwX3NpbmdsZShhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJZGVjLT5mcmFtZV9tbXVfbWFwX2FkZHIsIEZSQU1FX01NVV9NQVBfU0laRSwgRE1BX0JJRElSRUNUSU9OQUwpOworCWlmIChkbWFfbWFwcGluZ19lcnJvcihhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJZGVjLT5mcmFtZV9tbXVfbWFwX3BoeV9hZGRyKSkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gbWFwIGNvdW50X2J1ZmZlclxuIiwgX19mdW5jX18pOworCQlrZnJlZShkZWMtPmZyYW1lX21tdV9tYXBfYWRkcik7CisJCWRlYy0+ZnJhbWVfbW11X21hcF9hZGRyID0gTlVMTDsKKwkJcmV0dXJuIC0xOworCX0qLworI2VuZGlmCisKKwlyZXQgPSAwOworCXJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE1haWxib3ggY29tbWFuZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBDTURfRklOSVNIRUQgICAgICAgICAgICAgICAwCisjZGVmaW5lIENNRF9BTExPQ19WSUVXICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ01EX0ZSQU1FX0RJU1BMQVkgICAgICAgICAgMworI2RlZmluZSBDTURfREVCVUcgICAgICAgICAgICAgICAgICAxMAorCisKKyNkZWZpbmUgREVDT0RFX0JVRkZFUl9OVU1fTUFYICAgIDMyCisjZGVmaW5lIERJU1BMQVlfQlVGRkVSX05VTSAgICAgICA2CisKKyNkZWZpbmUgdmlkZW9fZG9tYWluX2FkZHIoYWRyKSAoYWRyJjB4N2ZmZmZmZmYpCisjZGVmaW5lIERFQ09ERVJfV09SS19TUEFDRV9TSVpFIDB4ODAwMDAwCisKKyNkZWZpbmUgc3BlYzJjYW52YXMoeCkgIFwKKwkoKCh4KS0+dXZfY2FudmFzX2luZGV4IDw8IDE2KSB8IFwKKwkgKCh4KS0+dXZfY2FudmFzX2luZGV4IDw8IDgpICB8IFwKKwkgKCh4KS0+eV9jYW52YXNfaW5kZXggPDwgMCkpCisKKworc3RhdGljIHZvaWQgc2V0X2NhbnZhcyhzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjLAorCXN0cnVjdCBhdnMyX2ZyYW1lX3MgKnBpYykKK3sKKwlpbnQgY2FudmFzX3cgPSBBTElHTihwaWMtPnBpY193LCA2NCkvNDsKKwlpbnQgY2FudmFzX2ggPSBBTElHTihwaWMtPnBpY19oLCAzMikvNDsKKwlpbnQgYmxrbW9kZSA9IG1lbV9tYXBfbW9kZTsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhkZWMpOworCS8qQ0FOVkFTX0JMS01PREVfNjRYMzIqLworCWlmCShwaWMtPmRvdWJsZV93cml0ZV9tb2RlKSB7CisJCWNhbnZhc193ID0gcGljLT5waWNfdwkvCisJCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhwaWMtPmRvdWJsZV93cml0ZV9tb2RlKTsKKwkJY2FudmFzX2ggPSBwaWMtPnBpY19oIC8KKwkJCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKHBpYy0+ZG91YmxlX3dyaXRlX21vZGUpOworCQkvKnNhb19jcnRsMSBhbGlnbmVkIHdpdGggNjQqLworCQljYW52YXNfdyA9IEFMSUdOKGNhbnZhc193LCA2NCk7CisJCWNhbnZhc19oID0gQUxJR04oY2FudmFzX2gsIDMyKTsKKworCQlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJCWlmIChwaWMtPnlfY2FudmFzX2luZGV4ID09IC0xKQorCQkJCXBpYy0+eV9jYW52YXNfaW5kZXggPSB2ZGVjLT5nZXRfY2FudmFzX2V4KENPUkVfTUFTS19IRVZDLCB2ZGVjLT5pZCk7CisJCQlpZiAocGljLT51dl9jYW52YXNfaW5kZXggPT0gLTEpCisJCQkJcGljLT51dl9jYW52YXNfaW5kZXggPSB2ZGVjLT5nZXRfY2FudmFzX2V4KENPUkVfTUFTS19IRVZDLCB2ZGVjLT5pZCk7CisJCX0gZWxzZSB7CisJCQlwaWMtPnlfY2FudmFzX2luZGV4ID0gMTI4ICsgcGljLT5pbmRleCAqIDI7CisJCQlwaWMtPnV2X2NhbnZhc19pbmRleCA9IDEyOCArIHBpYy0+aW5kZXggKiAyICsgMTsKKwkJfQorCisJCWNvbmZpZ19jYXZfbHV0X2V4KHBpYy0+eV9jYW52YXNfaW5kZXgsCisJCQlwaWMtPmR3X3lfYWRyLCBjYW52YXNfdywgY2FudmFzX2gsCisJCQlDQU5WQVNfQUREUl9OT1dSQVAsIGJsa21vZGUsIDB4NywgVkRFQ19IRVZDKTsKKwkJY29uZmlnX2Nhdl9sdXRfZXgocGljLT51dl9jYW52YXNfaW5kZXgsCisJCQlwaWMtPmR3X3Vfdl9hZHIsCWNhbnZhc193LCBjYW52YXNfaCwKKwkJCUNBTlZBU19BRERSX05PV1JBUCwgYmxrbW9kZSwgMHg3LCBWREVDX0hFVkMpOworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwkJcGljLT5jYW52YXNfY29uZmlnWzBdLnBoeV9hZGRyID0KKwkJCQlwaWMtPmR3X3lfYWRyOworCQlwaWMtPmNhbnZhc19jb25maWdbMF0ud2lkdGggPQorCQkJCWNhbnZhc193OworCQlwaWMtPmNhbnZhc19jb25maWdbMF0uaGVpZ2h0ID0KKwkJCQljYW52YXNfaDsKKwkJcGljLT5jYW52YXNfY29uZmlnWzBdLmJsb2NrX21vZGUgPQorCQkJCWJsa21vZGU7CisJCXBpYy0+Y2FudmFzX2NvbmZpZ1swXS5lbmRpYW4gPSA3OworCisJCXBpYy0+Y2FudmFzX2NvbmZpZ1sxXS5waHlfYWRkciA9CisJCQkJcGljLT5kd191X3ZfYWRyOworCQlwaWMtPmNhbnZhc19jb25maWdbMV0ud2lkdGggPQorCQkJCWNhbnZhc193OworCQlwaWMtPmNhbnZhc19jb25maWdbMV0uaGVpZ2h0ID0KKwkJCQljYW52YXNfaDsKKwkJcGljLT5jYW52YXNfY29uZmlnWzFdLmJsb2NrX21vZGUgPQorCQkJCWJsa21vZGU7CisJCXBpYy0+Y2FudmFzX2NvbmZpZ1sxXS5lbmRpYW4gPSA3OworI2VuZGlmCisJfSBlbHNlIHsKKwkjaWZuZGVmIEFWUzJfMTBCX01NVQorCQlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJCWlmIChwaWMtPnlfY2FudmFzX2luZGV4ID09IC0xKQorCQkJCXBpYy0+eV9jYW52YXNfaW5kZXggPSB2ZGVjLT5nZXRfY2FudmFzX2V4KENPUkVfTUFTS19IRVZDLCB2ZGVjLT5pZCk7CisJCQlpZiAocGljLT51dl9jYW52YXNfaW5kZXggPT0gLTEpCisJCQkJcGljLT51dl9jYW52YXNfaW5kZXggPSB2ZGVjLT5nZXRfY2FudmFzX2V4KENPUkVfTUFTS19IRVZDLCB2ZGVjLT5pZCk7CisJCX0gZWxzZSB7CisJCQlwaWMtPnlfY2FudmFzX2luZGV4ID0gMTI4ICsgcGljLT5pbmRleDsKKwkJCXBpYy0+dXZfY2FudmFzX2luZGV4ID0gMTI4ICsgcGljLT5pbmRleDsKKwkJfQorCisJCWNvbmZpZ19jYXZfbHV0X2V4KHBpYy0+eV9jYW52YXNfaW5kZXgsCisJCQlwaWMtPm1jX3lfYWRyLCBjYW52YXNfdywgY2FudmFzX2gsCisJCQlDQU5WQVNfQUREUl9OT1dSQVAsIGJsa21vZGUsIDB4NywgVkRFQ19IRVZDKTsKKwkJY29uZmlnX2Nhdl9sdXRfZXgocGljLT51dl9jYW52YXNfaW5kZXgsCisJCXBpYy0+bWNfdV92X2FkciwJY2FudmFzX3csIGNhbnZhc19oLAorCQkJQ0FOVkFTX0FERFJfTk9XUkFQLCBibGttb2RlLCAweDcsIFZERUNfSEVWQyk7CisJI2VuZGlmCisJfQorfQorCitzdGF0aWMgdm9pZCBzZXRfZnJhbWVfaW5mbyhzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjLCBzdHJ1Y3QgdmZyYW1lX3MgKnZmKQoreworCXVuc2lnbmVkIGludCBhcjsKKworCXZmLT5kdXJhdGlvbiA9IGRlYy0+ZnJhbWVfZHVyOworCXZmLT5kdXJhdGlvbl9wdWxsZG93biA9IDA7CisJdmYtPmZsYWcgPSAwOworCXZmLT5wcm9wLm1hc3Rlcl9kaXNwbGF5X2NvbG91ciA9IGRlYy0+dmZfZHA7CisJaWYgKGRlYy0+aGRyX2ZsYWcgJiBIRFJfQ1VWQV9NQVNLKQorCQlkZWMtPnZpZGVvX3NpZ25hbF90eXBlIHw9IDEgPDwgMzE7CisJdmYtPnNpZ25hbF90eXBlID0gZGVjLT52aWRlb19zaWduYWxfdHlwZTsKKworCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19IRFJfSU5GTywKKwkJCSJzaWduYWxfdHlwZXNpZ25hbF90eXBlIDB4JXggXG4iLAorCQkJdmYtPnNpZ25hbF90eXBlKTsKKworCWFyID0gbWluX3QodTMyLCBkZWMtPmZyYW1lX2FyLCBESVNQX1JBVElPX0FTUEVDVF9SQVRJT19NQVgpOworCXZmLT5yYXRpb19jb250cm9sID0gKGFyIDw8IERJU1BfUkFUSU9fQVNQRUNUX1JBVElPX0JJVCk7CisKKwl2Zi0+c2lkZWJpbmRfdHlwZSA9IGRlYy0+c2lkZWJpbmRfdHlwZTsKKwl2Zi0+c2lkZWJpbmRfY2hhbm5lbF9pZCA9IGRlYy0+c2lkZWJpbmRfY2hhbm5lbF9pZDsKKworCXJldHVybjsKK30KKworc3RhdGljIGludCB2YXZzMl92Zl9zdGF0ZXMoc3RydWN0IHZmcmFtZV9zdGF0ZXMgKnN0YXRlcywgdm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMgPSAoc3RydWN0IEFWUzJEZWNvZGVyX3MgKilvcF9hcmc7CisKKwlzdGF0ZXMtPnZmX3Bvb2xfc2l6ZSA9IFZGX1BPT0xfU0laRTsKKwlzdGF0ZXMtPmJ1Zl9mcmVlX251bSA9IGtmaWZvX2xlbigmZGVjLT5uZXdmcmFtZV9xKTsKKwlzdGF0ZXMtPmJ1Zl9hdmFpbF9udW0gPSBrZmlmb19sZW4oJmRlYy0+ZGlzcGxheV9xKTsKKworCWlmIChzdGVwID09IDIpCisJCXN0YXRlcy0+YnVmX2F2YWlsX251bSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZhdnMyX3ZmX3BlZWsodm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCB2ZnJhbWVfcyAqdmY7CisJc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYyA9IChzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqKW9wX2FyZzsKKwlpZiAoc3RlcCA9PSAyKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChmb3JjZV9kaXNwX3BpY19pbmRleCAmIDB4MTAwKSB7CisJCWlmIChmb3JjZV9kaXNwX3BpY19pbmRleCAmIDB4MjAwKQorCQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiAmZGVjLT52ZnJhbWVfZHVtbXk7CisJfQorCisJaWYgKGtmaWZvX3BlZWsoJmRlYy0+ZGlzcGxheV9xLCAmdmYpKQorCQlyZXR1cm4gdmY7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBhdnMyX2ZyYW1lX3MgKmdldF9waWNfYnlfaW5kZXgoCisJc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYywgaW50IGluZGV4KQoreworCWludCBpOworCXN0cnVjdCBhdnMyX2ZyYW1lX3MgKnBpYyA9IE5VTEw7CisJaWYgKGluZGV4ID09IChkZWMtPnVzZWRfYnVmX251bSAtIDEpKQorCQlwaWMgPSBkZWMtPmF2czJfZGVjLm1fYmc7CisJZWxzZSBpZiAoaW5kZXggPj0gMAkmJiBpbmRleCA8IGRlYy0+dXNlZF9idWZfbnVtKSB7CisJCWZvciAoaSA9IDA7IGkgPCBkZWMtPnVzZWRfYnVmX251bTsgaSsrKSB7CisJCQlpZiAoZGVjLT5hdnMyX2RlYy5mcmVmW2ldLT5pbmRleCA9PSBpbmRleCkKKwkJCQlwaWMgPSBkZWMtPmF2czJfZGVjLmZyZWZbaV07CisJCX0KKwl9CisJcmV0dXJuIHBpYzsKK30KKworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyAqdmF2czJfdmZfZ2V0KHZvaWQgKm9wX2FyZykKK3sKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmOworCXN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMgPSAoc3RydWN0IEFWUzJEZWNvZGVyX3MgKilvcF9hcmc7CisJaWYgKHN0ZXAgPT0gMikKKwkJcmV0dXJuIE5VTEw7CisJZWxzZSBpZiAoc3RlcCA9PSAxKQorCQkJc3RlcCA9IDI7CisKKwlpZiAoZm9yY2VfZGlzcF9waWNfaW5kZXggJiAweDEwMCkgeworCQlpbnQgaWR4ID0gZm9yY2VfZGlzcF9waWNfaW5kZXggJiAweGZmOworCQlzdHJ1Y3QgYXZzMl9mcmFtZV9zICpwaWMgPSBOVUxMOworCQlpZiAoaWR4ID49IDAKKwkJCSYmIGlkeCA8IGRlYy0+YXZzMl9kZWMucmVmX21heGJ1ZmZlcikKKwkJCXBpYyA9IGdldF9waWNfYnlfaW5kZXgoZGVjLCBpZHgpOworCQlpZiAocGljID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKGZvcmNlX2Rpc3BfcGljX2luZGV4ICYgMHgyMDApCisJCQlyZXR1cm4gTlVMTDsKKworCQl2ZiA9ICZkZWMtPnZmcmFtZV9kdW1teTsKKworCQlzZXRfdmZyYW1lKGRlYywgdmYsIHBpYywgMSk7CisKKwkJZm9yY2VfZGlzcF9waWNfaW5kZXggfD0gMHgyMDA7CisJCXJldHVybiB2ZjsKKwl9CisKKwlpZiAoa2ZpZm9fZ2V0KCZkZWMtPmRpc3BsYXlfcSwgJnZmKSkgeworCQl1aW50OF90IGluZGV4ID0gdmYtPmluZGV4ICYgMHhmZjsKKwkJQVRSQUNFX0NPVU5URVIoZGVjLT5kaXNwX3FfbmFtZSwga2ZpZm9fbGVuKCZkZWMtPmRpc3BsYXlfcSkpOworCQlpZiAoaW5kZXggPCBkZWMtPnVzZWRfYnVmX251bSkgeworCQkJc3RydWN0IGF2czJfZnJhbWVfcyAqcGljID0gZ2V0X3BpY19ieV9pbmRleChkZWMsIGluZGV4KTsKKwkJCWlmIChwaWMgPT0gTlVMTCAmJgorCQkJCShkZWJ1ZyAmIEFWUzJfREJHX1BJQ19MRUFLKSkgeworCQkJCWludCBpOworCQkJCWF2czJfcHJpbnQoZGVjLCAwLAorCQkJCSIlcyBlcnJvciBpbmRleCAweCV4IHBpYyBub3QgZXhpc3RcbiIsCisJCQkJX19mdW5jX18sIGluZGV4KTsKKwkJCQlkdW1wX3BpY19saXN0KGRlYyk7CisJCQkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJCQkJcGljID0gZ2V0X3BpY19ieV9pbmRleChkZWMsIGluZGV4KTsKKwkJCQkJcHJfaW5mbygicGljID0gJXBcbiIsIHBpYyk7CisJCQkJfQorCisJCQlpZiAoZGVidWcgJiBBVlMyX0RCR19QSUNfTEVBSykKKwkJCQlkZWJ1ZyB8PSBBVlMyX0RCR19QSUNfTEVBS19XQUlUOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJdmYtPmluZGV4X2Rpc3AgPSBhdG9taWNfcmVhZCgmZGVjLT52Zl9nZXRfY291bnQpOworCQlhdG9taWNfYWRkKDEsICZkZWMtPnZmX2dldF9jb3VudCk7CisJCWlmIChwaWMpCisJCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSLAorCQkJIiVzIGluZGV4IDB4JXggcG9zICVkIGdldGNvdW50ICVkIHR5cGUgMHgleCB3L2ggJWQvJWQsIHB0cyAlZCwgJWxsZFxuIiwKKwkJCV9fZnVuY19fLCBpbmRleCwKKwkJCXBpYy0+aW1ndHJfZndSZWZEaXN0YW5jZV9iYWssCisJCQlkZWMtPnZmX2dldF9jb3VudCwKKwkJCXZmLT50eXBlLAorCQkJdmYtPndpZHRoLCB2Zi0+aGVpZ2h0LAorCQkJdmYtPnB0cywKKwkJCXZmLT5wdHNfdXM2NCk7CisJCXJldHVybiB2ZjsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgdmF2czJfdmZfcHV0KHN0cnVjdCB2ZnJhbWVfcyAqdmYsIHZvaWQgKm9wX2FyZykKK3sKKwlzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjID0gKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICopb3BfYXJnOworCXVpbnQ4X3QgaW5kZXg7CisKKwlpZiAodmYgPT0gKCZkZWMtPnZmcmFtZV9kdW1teSkpCisJCXJldHVybjsKKworCWlmICghdmYpCisJCXJldHVybjsKKworCWluZGV4ID0gdmYtPmluZGV4ICYgMHhmZjsKKworCWtmaWZvX3B1dCgmZGVjLT5uZXdmcmFtZV9xLCAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCUFUUkFDRV9DT1VOVEVSKGRlYy0+bmV3X3FfbmFtZSwga2ZpZm9fbGVuKCZkZWMtPm5ld2ZyYW1lX3EpKTsKKwlhdG9taWNfYWRkKDEsICZkZWMtPnZmX3B1dF9jb3VudCk7CisJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUiwKKwkJIiVzIGluZGV4IHB1dGNvdW50IDB4JXggJWRcbiIsCisJCV9fZnVuY19fLCB2Zi0+aW5kZXgsCisJCWRlYy0+dmZfcHV0X2NvdW50KTsKKworCWlmIChpbmRleCA8IGRlYy0+dXNlZF9idWZfbnVtKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXN0cnVjdCBhdnMyX2ZyYW1lX3MgKnBpYzsKKworCQlsb2NrX2J1ZmZlcihkZWMsIGZsYWdzKTsKKwkJcGljID0gZ2V0X3BpY19ieV9pbmRleChkZWMsIGluZGV4KTsKKwkJaWYgKHBpYyAmJiBwaWMtPnZmX3JlZiA+IDApCisJCQlwaWMtPnZmX3JlZi0tOworCQllbHNlIHsKKwkJCWlmIChwaWMpCisJCQkJYXZzMl9wcmludChkZWMsIDAsCisJCQkJCSIlcywgZXJyb3IgcGljIChpbmRleCAlZCkgdmZfcmVmIGlzICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgaW5kZXgsIHBpYy0+dmZfcmVmKTsKKwkJCWVsc2UKKwkJCQlhdnMyX3ByaW50KGRlYywgMCwKKwkJCQkJIiVzLCBlcnJvciBwaWMgKGluZGV4ICVkKSBpcyBOVUxMXG4iLAorCQkJCQlfX2Z1bmNfXywgaW5kZXgpOworCQl9CisJCWlmIChkZWMtPndhaXRfYnVmKQorCQkJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9NQk9YMF9JUlFfUkVHLAorCQkJCQkJMHgxKTsKKwkJZGVjLT5sYXN0X3B1dF9pZHggPSBpbmRleDsKKwkJZGVjLT5uZXdfZnJhbWVfZGlzcGxheWVkKys7CisJCXVubG9ja19idWZmZXIoZGVjLCBmbGFncyk7CisJfQorCit9CisKK3N0YXRpYyBpbnQgdmF2czJfZXZlbnRfY2IoaW50IHR5cGUsIHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGVfZGF0YSkKK3sKKwlzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjID0gKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICopcHJpdmF0ZV9kYXRhOworCisJaWYgKHR5cGUgJiBWRlJBTUVfRVZFTlRfUkVDRUlWRVJfUkVRX1NUQVRFKSB7CisJCXN0cnVjdCBwcm92aWRlcl9zdGF0ZV9yZXFfcyAqcmVxID0KKwkJCShzdHJ1Y3QgcHJvdmlkZXJfc3RhdGVfcmVxX3MgKilkYXRhOworCQlpZiAocmVxLT5yZXFfdHlwZSA9PSBSRVFfU1RBVEVfU0VDVVJFKQorCQkJcmVxLT5yZXFfcmVzdWx0WzBdID0gdmRlY19zZWN1cmUoaHdfdG9fdmRlYyhkZWMpKTsKKwkJZWxzZQorCQkJcmVxLT5yZXFfcmVzdWx0WzBdID0gMHhmZmZmZmZmZjsKKwl9IGVsc2UgaWYgKHR5cGUgJiBWRlJBTUVfRVZFTlRfUkVDRUlWRVJfR0VUX0FVWF9EQVRBKSB7CisJCXN0cnVjdCBwcm92aWRlcl9hdXhfcmVxX3MgKnJlcSA9CisJCQkoc3RydWN0IHByb3ZpZGVyX2F1eF9yZXFfcyAqKWRhdGE7CisJCXVuc2lnbmVkIGNoYXIgaW5kZXg7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXN0cnVjdCBhdnMyX2ZyYW1lX3MgKnBpYzsKKworCQlpZiAoIXJlcS0+dmYpIHsKKwkJCXJlcS0+YXV4X3NpemUgPSBhdG9taWNfcmVhZCgmZGVjLT52Zl9wdXRfY291bnQpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbG9ja19idWZmZXIoZGVjLCBmbGFncyk7CisJCWluZGV4ID0gcmVxLT52Zi0+aW5kZXggJiAweGZmOworCQlyZXEtPmF1eF9idWYgPSBOVUxMOworCQlyZXEtPmF1eF9zaXplID0gMDsKKwkJcmVxLT5mb3JtYXQgPSBWRk9STUFUX0FWUzI7CisJCWlmIChpbmRleCA8IGRlYy0+dXNlZF9idWZfbnVtKSB7CisJCQlwaWMgPSBnZXRfcGljX2J5X2luZGV4KGRlYywgaW5kZXgpOworCQkJcmVxLT5hdXhfYnVmID0gcGljLT5jdXZhX2RhdGFfYnVmOworCQkJcmVxLT5hdXhfc2l6ZSA9IHBpYy0+Y3V2YV9kYXRhX3NpemU7CisJCX0KKwkJdW5sb2NrX2J1ZmZlcihkZWMsIGZsYWdzKTsKKworCQlhdnMyX3ByaW50KGRlYywgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJIiVzIHBpYyAweCVwIGluZGV4ICVkID0+c2l6ZSAlZFxuIiwKKwkJX19mdW5jX18sIHBpYywgaW5kZXgsIHJlcS0+YXV4X3NpemUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGF2czJfZnJhbWVfcyAqZ2V0X2Rpc3BfcGljKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMpCit7CisJc3RydWN0IGF2czJfZGVjb2RlciAqYXZzMl9kZWMgPSAmZGVjLT5hdnMyX2RlYzsKKwlzdHJ1Y3QgYXZzMl9mcmFtZV9zICpwaWMgPSBOVUxMOworCWludDMyX3QgajsKKwlpbnQzMl90IHByZV9kaXNwX2NvdW50X21pbiA9IDB4N2ZmZmZmZmY7CisJZm9yIChqID0gMDsgaiA8IGF2czJfZGVjLT5yZWZfbWF4YnVmZmVyOyBqKyspIHsKKwkJaWYgKGF2czJfZGVjLT5mcmVmW2pdLT50b19wcmVwYXJlX2Rpc3AgJiYKKwkJCWF2czJfZGVjLT5mcmVmW2pdLT50b19wcmVwYXJlX2Rpc3AgPAorCQkJcHJlX2Rpc3BfY291bnRfbWluKSB7CisJCQlwcmVfZGlzcF9jb3VudF9taW4gPQorCQkJCWF2czJfZGVjLT5mcmVmW2pdLT50b19wcmVwYXJlX2Rpc3A7CisJCQlwaWMgPSBhdnMyX2RlYy0+ZnJlZltqXTsKKwkJfQorCX0KKwlpZiAocGljKQorCQlwaWMtPnRvX3ByZXBhcmVfZGlzcCA9IDA7CisKKwlyZXR1cm4gcGljOworCit9CisKKworCitzdGF0aWMgdm9pZCBmaWxsX2ZyYW1lX2luZm8oc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYywKKwlzdHJ1Y3QgYXZzMl9mcmFtZV9zICpwaWMsIHVuc2lnbmVkIGludCBmcmFtZXNpemUsIHVuc2lnbmVkIGludCBwdHMpCit7CisJc3RydWN0IHZmcmFtZV9xb3NfcyAqdmZyYW1lX3FvcyA9ICZkZWMtPnZmcmFtZV9xb3M7CisKKwlpZiAocGljLT5zbGljZV90eXBlID09IElfSU1HKQorCQl2ZnJhbWVfcW9zLT50eXBlID0gMTsKKwllbHNlIGlmIChwaWMtPnNsaWNlX3R5cGUgPT0gUF9JTUcpCisJCXZmcmFtZV9xb3MtPnR5cGUgPSAyOworCWVsc2UgaWYgKHBpYy0+c2xpY2VfdHlwZSA9PSBCX0lNRykKKwkJdmZyYW1lX3Fvcy0+dHlwZSA9IDM7CisvKgorI2RlZmluZSBTSE9XX1FPU19JTkZPCisqLworCWlmIChpbnB1dF9mcmFtZV9iYXNlZChod190b192ZGVjKGRlYykpKQorCQl2ZnJhbWVfcW9zLT5zaXplID0gcGljLT5mcmFtZV9zaXplOworCWVsc2UKKwkJdmZyYW1lX3Fvcy0+c2l6ZSA9IGZyYW1lc2l6ZTsKKwl2ZnJhbWVfcW9zLT5wdHMgPSBwdHM7CisjaWZkZWYgU0hPV19RT1NfSU5GTworCWF2czJfcHJpbnQoZGVjLCAwLCAic2xpY2U6JWRcbiIsIHBpYy0+c2xpY2VfdHlwZSk7CisjZW5kaWYKKworCisJdmZyYW1lX3Fvcy0+bWF4X212ID0gcGljLT5tYXhfbXY7CisJdmZyYW1lX3Fvcy0+YXZnX212ID0gcGljLT5hdmdfbXY7CisJdmZyYW1lX3Fvcy0+bWluX212ID0gcGljLT5taW5fbXY7CisjaWZkZWYgU0hPV19RT1NfSU5GTworCWF2czJfcHJpbnQoZGVjLCAwLCAibXY6IG1heDolZCwgIGF2ZzolZCwgbWluOiVkXG4iLAorCQkJdmZyYW1lX3Fvcy0+bWF4X212LAorCQkJdmZyYW1lX3Fvcy0+YXZnX212LAorCQkJdmZyYW1lX3Fvcy0+bWluX212KTsKKyNlbmRpZgorCisJdmZyYW1lX3Fvcy0+bWF4X3FwID0gcGljLT5tYXhfcXA7CisJdmZyYW1lX3Fvcy0+YXZnX3FwID0gcGljLT5hdmdfcXA7CisJdmZyYW1lX3Fvcy0+bWluX3FwID0gcGljLT5taW5fcXA7CisjaWZkZWYgU0hPV19RT1NfSU5GTworCWF2czJfcHJpbnQoZGVjLCAwLCAicXA6IG1heDolZCwgIGF2ZzolZCwgbWluOiVkXG4iLAorCQkJdmZyYW1lX3Fvcy0+bWF4X3FwLAorCQkJdmZyYW1lX3Fvcy0+YXZnX3FwLAorCQkJdmZyYW1lX3Fvcy0+bWluX3FwKTsKKyNlbmRpZgorCisJdmZyYW1lX3Fvcy0+bWF4X3NraXAgPSBwaWMtPm1heF9za2lwOworCXZmcmFtZV9xb3MtPmF2Z19za2lwID0gcGljLT5hdmdfc2tpcDsKKwl2ZnJhbWVfcW9zLT5taW5fc2tpcCA9IHBpYy0+bWluX3NraXA7CisjaWZkZWYgU0hPV19RT1NfSU5GTworCWF2czJfcHJpbnQoZGVjLCAwLCAic2tpcDogbWF4OiVkLAlhdmc6JWQsIG1pbjolZFxuIiwKKwkJCXZmcmFtZV9xb3MtPm1heF9za2lwLAorCQkJdmZyYW1lX3Fvcy0+YXZnX3NraXAsCisJCQl2ZnJhbWVfcW9zLT5taW5fc2tpcCk7CisjZW5kaWYKKworCXZmcmFtZV9xb3MtPm51bSsrOworCit9CisKK3N0YXRpYyB2b2lkIHNldF92ZnJhbWUoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYywKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmLCBzdHJ1Y3QgYXZzMl9mcmFtZV9zICpwaWMsIHU4IGR1bW15KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHN0cmVhbV9vZmZzZXQ7CisJdW5zaWduZWQgaW50IGZyYW1lX3NpemUgPSAwOworCWludCBwdHNfZGlzY29udGludWU7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoZGVjKTsKKwlzdHJlYW1fb2Zmc2V0ID0gcGljLT5zdHJlYW1fb2Zmc2V0OworCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1IsCisJCSIlcyBpbmRleCA9ICVkIHBvcyA9ICVkXHJcbiIsCisJCV9fZnVuY19fLCBwaWMtPmluZGV4LAorCQlwaWMtPmltZ3RyX2Z3UmVmRGlzdGFuY2UpOworCisJaWYgKHBpYy0+ZG91YmxlX3dyaXRlX21vZGUpCisJCXNldF9jYW52YXMoZGVjLCBwaWMpOworCisJZGlzcGxheV9mcmFtZV9jb3VudFtkZWMtPmluZGV4XSsrOworCisJaWYgKCFkdW1teSkgeworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwkJaWYgKHZkZWNfZnJhbWVfYmFzZWQodmRlYykpIHsKKwkJCXZmLT5wdHMgPSBwaWMtPnB0czsKKwkJCXZmLT5wdHNfdXM2NCA9IHBpYy0+cHRzNjQ7CisJCX0gZWxzZSB7CisjZW5kaWYKKwkJCWlmICgodmRlYy0+dmJ1Zi5ub19wYXJzZXIgPT0gMCkgfHwgKHZkZWMtPnZidWYudXNlX3B0c3NlcnYpKSB7CisJCQkvKiBpZiAocHRzX2xvb2t1cF9vZmZzZXQoUFRTX1RZUEVfVklERU8sCisJCQkgICBzdHJlYW1fb2Zmc2V0LCAmdmYtPnB0cywgMCkgIT0gMCkgeyAqLworCQkJCWlmIChwdHNfbG9va3VwX29mZnNldF91czY0CisJCQkJCShQVFNfVFlQRV9WSURFTywgc3RyZWFtX29mZnNldCwKKwkJCQkJJnZmLT5wdHMsICZmcmFtZV9zaXplLCAwLAorCQkJCQkgJnZmLT5wdHNfdXM2NCkgIT0gMCkgeworI2lmZGVmIERFQlVHX1BUUworCQkJCQlkZWMtPnB0c19taXNzZWQrKzsKKyNlbmRpZgorCQkJCQl2Zi0+cHRzID0gMDsKKwkJCQkJdmYtPnB0c191czY0ID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKyNpZmRlZiBERUJVR19QVFMKKwkJZWxzZQorCQkJZGVjLT5wdHNfaGl0Kys7CisjZW5kaWYKKwkJaWYgKHB0c191bnN0YWJsZSkKKwkJCWRlYy0+cHRzX21vZGUgPSBQVFNfTk9ORV9SRUZfVVNFX0RVUkFUSU9OOworCisJCWZpbGxfZnJhbWVfaW5mbyhkZWMsIHBpYywgZnJhbWVfc2l6ZSwgdmYtPnB0cyk7CisKKwkJaWYgKChkZWMtPnB0c19tb2RlID09IFBUU19OT1JNQUwpICYmICh2Zi0+cHRzICE9IDApCisJCQkmJiBkZWMtPmdldF9mcmFtZV9kdXIpIHsKKwkJCWludCBwdHNfZGlmZiA9IChpbnQpdmYtPnB0cyAtIGRlYy0+bGFzdF9sb29rdXBfcHRzOworCisJCQlpZiAocHRzX2RpZmYgPCAwKSB7CisJCQkJZGVjLT5wdHNfbW9kZV9zd2l0Y2hpbmdfY291bnQrKzsKKwkJCQlkZWMtPnB0c19tb2RlX3JlY292ZXJ5X2NvdW50ID0gMDsKKworCQkJCWlmIChkZWMtPnB0c19tb2RlX3N3aXRjaGluZ19jb3VudCA+PQorCQkJCQlQVFNfTU9ERV9TV0lUQ0hJTkdfVEhSRVNIT0xEKSB7CisJCQkJCWRlYy0+cHRzX21vZGUgPQorCQkJCQkJUFRTX05PTkVfUkVGX1VTRV9EVVJBVElPTjsKKwkJCQkJcHJfaW5mbworCQkJCQkoIkhFVkM6IHN3aXRjaCB0byBuX2QgbW9kZS5cbiIpOworCQkJCX0KKworCQkJfSBlbHNlIHsKKwkJCQlpbnQgcCA9IFBUU19NT0RFX1NXSVRDSElOR19SRUNPVkVSWV9USFJFQVNIT0xEOworCQkJCWRlYy0+cHRzX21vZGVfcmVjb3ZlcnlfY291bnQrKzsKKwkJCQlpZiAoZGVjLT5wdHNfbW9kZV9yZWNvdmVyeV9jb3VudCA+IHApIHsKKwkJCQkJZGVjLT5wdHNfbW9kZV9zd2l0Y2hpbmdfY291bnQgPSAwOworCQkJCQlkZWMtPnB0c19tb2RlX3JlY292ZXJ5X2NvdW50ID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKworCQlwdHNfZGlzY29udGludWUgPQorCQkJKGFicyhkZWMtPmxhc3RfcHRzICAtIHZmLT5wdHMpID49CisJCQkgdHN5bmNfdnB0c19kaXNjb250aW51aXR5X21hcmdpbigpKTsKKworCQlpZiAodmYtPnB0cyAhPSAwKQorCQkJZGVjLT5sYXN0X2xvb2t1cF9wdHMgPSB2Zi0+cHRzOworI2lmIDEKKwkJaWYgKChkZWMtPnB0c19tb2RlID09IFBUU19OT05FX1JFRl9VU0VfRFVSQVRJT04pCisJCQkmJiAoKHBpYy0+c2xpY2VfdHlwZSAhPSBJX0lNRykgfHwgKCFwdHNfZGlzY29udGludWUgJiYKKwkJCSFmaXJzdF9wdHNfY2hlY2tpbl9jb21wbGV0ZShQVFNfVFlQRV9BVURJTykpKSkKKwkJCXZmLT5wdHMgPSBkZWMtPmxhc3RfcHRzICsgRFVSMlBUUyhkZWMtPmZyYW1lX2R1cik7CisjZW5kaWYKKwkJZGVjLT5sYXN0X3B0cyA9IHZmLT5wdHM7CisKKwkJaWYgKHZmLT5wdHNfdXM2NCAhPSAwKQorCQkJZGVjLT5sYXN0X2xvb2t1cF9wdHNfdXM2NCA9IHZmLT5wdHNfdXM2NDsKKworI2lmIDEKKwkJaWYgKChkZWMtPnB0c19tb2RlID09IFBUU19OT05FX1JFRl9VU0VfRFVSQVRJT04pCisJCQkmJiAoKHBpYy0+c2xpY2VfdHlwZSAhPSBJX0lNRykgfHwgKCFwdHNfZGlzY29udGludWUgJiYKKwkJCSFmaXJzdF9wdHNfY2hlY2tpbl9jb21wbGV0ZShQVFNfVFlQRV9BVURJTykpKSkgeworCQkJdmYtPnB0c191czY0ID0KKwkJCQlkZWMtPmxhc3RfcHRzX3VzNjQgKworCQkJCShEVVIyUFRTKGRlYy0+ZnJhbWVfZHVyKSAqIDEwMCAvIDkpOworCQl9CisjZW5kaWYKKwkJZGVjLT5sYXN0X3B0c191czY0ID0gdmYtPnB0c191czY0OworCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfT1VUX1BUUywKKwkJCSJhdnMyIGRlYyBvdXQgcHRzOiB2Zi0+cHRzPSVkLCB2Zi0+cHRzX3VzNjQgPSAlbGxkXG4iLAorCQkJdmYtPnB0cywgdmYtPnB0c191czY0KTsKKwkJfQorCisJCXZmLT5pbmRleCA9IDB4ZmYwMCB8IHBpYy0+aW5kZXg7CisKKwkJaWYgKHBpYy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDEwKSB7CisJCQkvKiBkb3VibGUgd3JpdGUgb25seSAqLworCQkJdmYtPmNvbXBCb2R5QWRkciA9IDA7CisJCQl2Zi0+Y29tcEhlYWRBZGRyID0gMDsKKwkJfSBlbHNlIHsKKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwkJdmYtPmNvbXBCb2R5QWRkciA9IDA7CisJCXZmLT5jb21wSGVhZEFkZHIgPSBwaWMtPmhlYWRlcl9hZHI7CisjZWxzZQorCQl2Zi0+Y29tcEJvZHlBZGRyID0gcGljLT5tY195X2FkcjsgLypib2R5IGFkciovCisJCXZmLT5jb21wSGVhZEFkZHIgPSBwaWMtPm1jX3lfYWRyICsKKwkJCQkJcGljLT5jb21wX2JvZHlfc2l6ZTsKKwkJLypoZWFkIGFkciovCisjZW5kaWYKKwkJfQorCQlpZiAocGljLT5kb3VibGVfd3JpdGVfbW9kZSkgeworCQkJdmYtPnR5cGUgPSBWSURUWVBFX1BST0dSRVNTSVZFIHwKKwkJCQlWSURUWVBFX1ZJVV9GSUVMRDsKKwkJCXZmLT50eXBlIHw9IFZJRFRZUEVfVklVX05WMjE7CisJCQlpZiAocGljLT5kb3VibGVfd3JpdGVfbW9kZSA9PSAzKSB7CisJCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9DT01QUkVTUzsKKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwkJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX1NDQVRURVI7CisjZW5kaWYKKwkJCX0KKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCQlpZiAoZGVjLT5tX2luc19mbGFnKSB7CisJCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IC0xOworCQkJCQl2Zi0+cGxhbmVfbnVtID0gMjsKKwkJCQkJdmYtPmNhbnZhczBfY29uZmlnWzBdID0KKwkJCQkJCXBpYy0+Y2FudmFzX2NvbmZpZ1swXTsKKwkJCQkJdmYtPmNhbnZhczBfY29uZmlnWzFdID0KKwkJCQkJCXBpYy0+Y2FudmFzX2NvbmZpZ1sxXTsKKworCQkJCQl2Zi0+Y2FudmFzMV9jb25maWdbMF0gPQorCQkJCQkJcGljLT5jYW52YXNfY29uZmlnWzBdOworCQkJCQl2Zi0+Y2FudmFzMV9jb25maWdbMV0gPQorCQkJCQkJcGljLT5jYW52YXNfY29uZmlnWzFdOworCisJCQl9IGVsc2UKKyNlbmRpZgorCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9CisJCQkJCXNwZWMyY2FudmFzKHBpYyk7CisJCX0gZWxzZSB7CisJCQl2Zi0+Y2FudmFzMEFkZHIgPSB2Zi0+Y2FudmFzMUFkZHIgPSAwOworCQkJdmYtPnR5cGUgPSBWSURUWVBFX0NPTVBSRVNTIHwgVklEVFlQRV9WSVVfRklFTEQ7CisjaWZkZWYgQVZTMl8xMEJfTU1VCisJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX1NDQVRURVI7CisjZW5kaWYKKwkJfQorCisJCXN3aXRjaCAocGljLT5iaXRfZGVwdGgpIHsKKwkJY2FzZSBBVlMyX0JJVFNfODoKKwkJCXZmLT5iaXRkZXB0aCA9IEJJVERFUFRIX1k4IHwKKwkJCQlCSVRERVBUSF9VOCB8IEJJVERFUFRIX1Y4OworCQkJYnJlYWs7CisJCWNhc2UgQVZTMl9CSVRTXzEwOgorCQljYXNlIEFWUzJfQklUU18xMjoKKwkJCXZmLT5iaXRkZXB0aCA9IEJJVERFUFRIX1kxMCB8CisJCQkJQklUREVQVEhfVTEwIHwgQklUREVQVEhfVjEwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl2Zi0+Yml0ZGVwdGggPSBCSVRERVBUSF9ZMTAgfAorCQkJCUJJVERFUFRIX1UxMCB8IEJJVERFUFRIX1YxMDsKKwkJCWJyZWFrOworCQl9CisJCWlmICgodmYtPnR5cGUgJiBWSURUWVBFX0NPTVBSRVNTKSA9PSAwKQorCQkJdmYtPmJpdGRlcHRoID0KKwkJCQlCSVRERVBUSF9ZOCB8IEJJVERFUFRIX1U4IHwgQklUREVQVEhfVjg7CisJCWlmIChwaWMtPmJpdF9kZXB0aCA9PSBBVlMyX0JJVFNfOCkKKwkJCXZmLT5iaXRkZXB0aCB8PSBCSVRERVBUSF9TQVZJTkdfTU9ERTsKKworCQlzZXRfZnJhbWVfaW5mbyhkZWMsIHZmKTsKKwkJLyogaWYoKHZmLT53aWR0aCE9cGljLT53aWR0aCl8CisJCQkodmYtPmhlaWdodCE9cGljLT5oZWlnaHQpKSAqLworCQkvKiBwcl9pbmZvKCJhYWE6ICVkLyVkLCAlZC8lZFxuIiwKKwkJICAgdmYtPndpZHRoLHZmLT5oZWlnaHQsIHBpYy0+d2lkdGgsCisJCQlwaWMtPmhlaWdodCk7ICovCisJCXZmLT53aWR0aCA9IHBpYy0+cGljX3cgLworCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhwaWMtPmRvdWJsZV93cml0ZV9tb2RlKTsKKwkJdmYtPmhlaWdodCA9IHBpYy0+cGljX2ggLworCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhwaWMtPmRvdWJsZV93cml0ZV9tb2RlKTsKKwkJaWYgKGZvcmNlX3dfaCAhPSAwKSB7CisJCQl2Zi0+d2lkdGggPSAoZm9yY2Vfd19oID4+IDE2KSAmIDB4ZmZmZjsKKwkJCXZmLT5oZWlnaHQgPSBmb3JjZV93X2ggJiAweGZmZmY7CisJCX0KKwkJdmYtPmNvbXBXaWR0aCA9IHBpYy0+cGljX3c7CisJCXZmLT5jb21wSGVpZ2h0ID0gcGljLT5waWNfaDsKKwkJaWYgKGZvcmNlX2ZwcyAmIDB4MTAwKSB7CisJCQl1MzIgcmF0ZSA9IGZvcmNlX2ZwcyAmIDB4ZmY7CisJCQlpZiAocmF0ZSkKKwkJCQl2Zi0+ZHVyYXRpb24gPSA5NjAwMC9yYXRlOworCQkJZWxzZQorCQkJCXZmLT5kdXJhdGlvbiA9IDA7CisJCX0KKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwkJaWYgKHZmLT50eXBlICYgVklEVFlQRV9TQ0FUVEVSKSB7CisJCQl2Zi0+bWVtX2hhbmRsZSA9IGRlY29kZXJfbW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCQlkZWMtPm1tdV9ib3gsCisJCQkJcGljLT5pbmRleCk7CisJCQl2Zi0+bWVtX2hlYWRfaGFuZGxlID0gZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCQlkZWMtPmJtbXVfYm94LAorCQkJCUhFQURFUl9CVUZGRVJfSURYKHBpYy0+aW5kZXgpKTsKKwkJfSBlbHNlIHsKKwkJCXZmLT5tZW1faGFuZGxlID0gZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCQlkZWMtPmJtbXVfYm94LAorCQkJCVZGX0JVRkZFUl9JRFgocGljLT5pbmRleCkpOworCQkJdmYtPm1lbV9oZWFkX2hhbmRsZSA9IGRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJZGVjLT5ibW11X2JveCwKKwkJCQlIRUFERVJfQlVGRkVSX0lEWChwaWMtPmluZGV4KSk7CisJCX0KKyNlbHNlCisJCXZmLT5tZW1faGFuZGxlID0gZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCWRlYy0+Ym1tdV9ib3gsCisJCQlWRl9CVUZGRVJfSURYKHBpYy0+aW5kZXgpKTsKKyNlbmRpZgorCWlmICghdmRlYy0+dmJ1Zi51c2VfcHRzc2VydiAmJiB2ZGVjX3N0cmVhbV9iYXNlZCh2ZGVjKSkgeworCQl2Zi0+cHRzX3VzNjQgPSBzdHJlYW1fb2Zmc2V0OworCQl2Zi0+cHRzID0gMDsKKwl9CisJaWYgKCFkdW1teSkgeworCQlsb2NrX2J1ZmZlcihkZWMsIGZsYWdzKTsKKwkJcGljLT52Zl9yZWYgPSAxOworCQl1bmxvY2tfYnVmZmVyKGRlYywgZmxhZ3MpOworCX0KKwlhdG9taWNfYWRkKDEsICZkZWMtPnZmX3ByZV9jb3VudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWNfdXBkYXRlX2d2cyhzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCWlmIChkZWMtPmd2cy0+ZnJhbWVfaGVpZ2h0ICE9IGRlYy0+ZnJhbWVfaGVpZ2h0KSB7CisJCWRlYy0+Z3ZzLT5mcmFtZV93aWR0aCA9IGRlYy0+ZnJhbWVfd2lkdGg7CisJCWRlYy0+Z3ZzLT5mcmFtZV9oZWlnaHQgPSBkZWMtPmZyYW1lX2hlaWdodDsKKwl9CisJaWYgKGRlYy0+Z3ZzLT5mcmFtZV9kdXIgIT0gZGVjLT5mcmFtZV9kdXIpIHsKKwkJZGVjLT5ndnMtPmZyYW1lX2R1ciA9IGRlYy0+ZnJhbWVfZHVyOworCQlpZiAoZGVjLT5mcmFtZV9kdXIgIT0gMCkKKwkJCWRlYy0+Z3ZzLT5mcmFtZV9yYXRlID0gKCg5NjAwMCAqIDEwIC8gZGVjLT5mcmFtZV9kdXIpICUgMTApIDwgNSA/CisJCQkJCTk2MDAwIC8gZGVjLT5mcmFtZV9kdXIgOiAoOTYwMDAgLyBkZWMtPmZyYW1lX2R1ciArMSk7CisJCWVsc2UKKwkJCWRlYy0+Z3ZzLT5mcmFtZV9yYXRlID0gLTE7CisJfQorCWRlYy0+Z3ZzLT5zdGF0dXMgPSBkZWMtPnN0YXQgfCBkZWMtPmZhdGFsX2Vycm9yOworfQorCitzdGF0aWMgaW50IGF2czJfcHJlcGFyZV9kaXNwbGF5X2J1ZihzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworI2lmbmRlZiBOT19ESVNQTEFZCisJc3RydWN0IHZmcmFtZV9zICp2ZiA9IE5VTEw7CisJLyp1bnNpZ25lZCBzaG9ydCBzbGljZV90eXBlOyovCisJc3RydWN0IGF2czJfZnJhbWVfcyAqcGljOworCXN0cnVjdCB2ZGVjX3MgKnB2ZGVjID0gaHdfdG9fdmRlYyhkZWMpOworCXdoaWxlICgxKSB7CisJCXBpYyA9IGdldF9kaXNwX3BpYyhkZWMpOworCQlpZiAocGljID09IE5VTEwpCisJCQlicmVhazsKKworCQlpZiAoZm9yY2VfZGlzcF9waWNfaW5kZXggJiAweDEwMCkgeworCQkJLypyZWN5Y2xlIGRpcmVjdGx5Ki8KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHBpYy0+ZXJyb3JfbWFyaykgeworCQkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUl9ERVRBSUwsCisJCQkJIiEhIWVycm9yIHBpYywgc2tpcFxuIiwKKwkJCQkwKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGRlYy0+c3RhcnRfZGVjb2RpbmdfZmxhZyAhPSAwKSB7CisJCQlpZiAoZGVjLT5za2lwX1BCX2JlZm9yZV9JICYmCisJCQkJcGljLT5zbGljZV90eXBlICE9IElfSU1HKSB7CisJCQkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUl9ERVRBSUwsCisJCQkJCSIhISFzbGljZSB0eXBlICVkIChub3QgSSkgc2tpcFxuIiwKKwkJCQkJMCwgcGljLT5zbGljZV90eXBlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWRlYy0+c2tpcF9QQl9iZWZvcmVfSSA9IDA7CisJCX0KKworCQlpZiAoa2ZpZm9fZ2V0KCZkZWMtPm5ld2ZyYW1lX3EsICZ2ZikgPT0gMCkgeworCQkJcHJfaW5mbygiZmF0YWwgZXJyb3IsIG5vIGF2YWlsYWJsZSBidWZmZXIgc2xvdC4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmICh2ZikgeworCQkJc3RydWN0IHZkZWNfaW5mbyB0bXA0eDsKKwkJCWludCBzdHJlYW1fb2Zmc2V0ID0gcGljLT5zdHJlYW1fb2Zmc2V0OworCQkJc2V0X3ZmcmFtZShkZWMsIHZmLCBwaWMsIDApOworCQkJZGVjb2Rlcl9kb19mcmFtZV9jaGVjayhwdmRlYywgdmYpOworCQkJdmRlY192ZnJhbWVfcmVhZHkocHZkZWMsIHZmKTsKKwkJCWtmaWZvX3B1dCgmZGVjLT5kaXNwbGF5X3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCQlBVFJBQ0VfQ09VTlRFUihkZWMtPnB0c19uYW1lLCB2Zi0+dGltZXN0YW1wKTsKKwkJCUFUUkFDRV9DT1VOVEVSKGRlYy0+bmV3X3FfbmFtZSwga2ZpZm9fbGVuKCZkZWMtPm5ld2ZyYW1lX3EpKTsKKwkJCUFUUkFDRV9DT1VOVEVSKGRlYy0+ZGlzcF9xX25hbWUsIGtmaWZvX2xlbigmZGVjLT5kaXNwbGF5X3EpKTsKKworCQkJZGVjX3VwZGF0ZV9ndnMoZGVjKTsKKwkJCS8qY291bnQgaW5mbyovCisJCQl2ZGVjX2NvdW50X2luZm8oZGVjLT5ndnMsIDAsIHN0cmVhbV9vZmZzZXQpOworCQlpZiAoc3RyZWFtX29mZnNldCkgeworCQkJaWYgKHBpYy0+c2xpY2VfdHlwZSA9PSBJX0lNRykgeworCQkJCWRlYy0+Z3ZzLT5pX2RlY29kZWRfZnJhbWVzKys7CisJCQl9IGVsc2UgaWYgKHBpYy0+c2xpY2VfdHlwZSA9PSBQX0lNRykgeworCQkJCWRlYy0+Z3ZzLT5wX2RlY29kZWRfZnJhbWVzKys7CisJCQl9IGVsc2UgaWYgKHBpYy0+c2xpY2VfdHlwZSA9PSBCX0lNRykgeworCQkJCWRlYy0+Z3ZzLT5iX2RlY29kZWRfZnJhbWVzKys7CisJCQl9CisJCX0KKwkJCW1lbWNweSgmdG1wNHgsIGRlYy0+Z3ZzLCBzaXplb2Yoc3RydWN0IHZkZWNfaW5mbykpOworCQkJdG1wNHguYml0X2RlcHRoX2x1bWEgPSBiaXRfZGVwdGhfbHVtYTsKKwkJCXRtcDR4LmJpdF9kZXB0aF9jaHJvbWEgPSBiaXRfZGVwdGhfY2hyb21hOworCQkJdG1wNHguZG91YmxlX3dyaXRlX21vZGUgPSBwaWMtPmRvdWJsZV93cml0ZV9tb2RlOworCQkJdmRlY19maWxsX3ZkZWNfZnJhbWUocHZkZWMsICZkZWMtPnZmcmFtZV9xb3MsICZ0bXA0eCwgdmYsIHBpYy0+aHdfZGVjb2RlX3RpbWUpOworCQkJcHZkZWMtPnZkZWNfZnBzX2RldGVjKHB2ZGVjLT5pZCk7CisJCQlpZiAod2l0aG91dF9kaXNwbGF5X21vZGUgPT0gMCkgeworCQkJCXZmX25vdGlmeV9yZWNlaXZlcihkZWMtPnByb3ZpZGVyX25hbWUsCisJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1ZGUkFNRV9SRUFEWSwgTlVMTCk7CisJCQl9IGVsc2UKKwkJCQl2YXZzMl92Zl9wdXQodmF2czJfdmZfZ2V0KGRlYyksIGRlYyk7CisJCX0KKwl9CisvKiFOT19ESVNQTEFZKi8KKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnZXRfcnBtX3BhcmFtKHVuaW9uIHBhcmFtX3UgKnBhcmFtcykKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgZGF0YTMyOworCWlmIChkZWJ1ZyAmIEFWUzJfREJHX0JVRk1HUikKKwkJcHJfaW5mbygiZW50ZXIgJXNcclxuIiwgX19mdW5jX18pOworCWZvciAoaSA9IDA7IGkgPCAoUlBNX0VORCAtIFJQTV9CRUdJTik7IGkrKykgeworCQlkbyB7CisJCQlkYXRhMzIgPSBSRUFEX1ZSRUcoUlBNX0NNRF9SRUcpOworCQkJLypwcl9pbmZvKCIleFxuIiwgZGF0YTMyKTsqLworCQl9IHdoaWxlICgoZGF0YTMyICYgMHgxMDAwMCkgPT0gMCk7CisJCXBhcmFtcy0+bC5kYXRhW2ldID0gZGF0YTMyJjB4ZmZmZjsKKwkJLypwcl9pbmZvKCIleFxuIiwgZGF0YTMyKTsqLworCQlXUklURV9WUkVHKFJQTV9DTURfUkVHLCAwKTsKKwl9CisJaWYgKGRlYnVnICYgQVZTMl9EQkdfQlVGTUdSKQorCQlwcl9pbmZvKCJsZWF2ZSAlc1xyXG4iLCBfX2Z1bmNfXyk7Cit9CitzdGF0aWMgdm9pZCBkZWJ1Z19idWZmZXJfbWdyX21vcmUoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYykKK3sKKwlpbnQgaTsKKwlpZiAoIShkZWJ1ZyAmIEFWUzJfREJHX0JVRk1HUl9NT1JFKSkKKwkJcmV0dXJuOworCXByX2luZm8oImF2czJfcGFyYW06ICglZClcbiIsIGRlYy0+YXZzMl9kZWMuaW1nLm51bWJlcik7CisJZm9yIChpID0gMDsgaSA8IChSUE1fRU5ELVJQTV9CRUdJTik7IGkrKykgeworCQlwcl9pbmZvKCIlMDR4ICIsIGRlYy0+YXZzMl9kZWMucGFyYW0ubC5kYXRhW2ldKTsKKwkJaWYgKCgoaSArIDEpICYgMHhmKSA9PSAwKQorCQkJcHJfaW5mbygiXG4iKTsKKwl9Cit9CisKKyNpZmRlZiBBVlMyXzEwQl9NTVUKK3N0YXRpYyB2b2lkIGF2czJfcmVjeWNsZV9tbXVfYnVmX3RhaWwoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYykKK3sKKwlpZiAoZGVjLT5jdXJfZmJfaWR4X21tdSAhPSBJTlZBTElEX0lEWCkgeworCQlpZiAoZGVjLT51c2VkXzRrX251bSA9PSAtMSkgeworCQkJZGVjLT51c2VkXzRrX251bSA9CisJCQkoUkVBRF9WUkVHKEhFVkNfU0FPX01NVV9TVEFUVVMpID4+IDE2KTsKKwkJCWlmIChkZWMtPm1faW5zX2ZsYWcpCisJCQkJaGV2Y19tbXVfZG1hX2NoZWNrKGh3X3RvX3ZkZWMoZGVjKSk7CisJCQlkZWNvZGVyX21tdV9ib3hfZnJlZV9pZHhfdGFpbChkZWMtPm1tdV9ib3gsCisJCQlkZWMtPmN1cl9mYl9pZHhfbW11LCBkZWMtPnVzZWRfNGtfbnVtKTsKKwkJfQorCQlkZWMtPmN1cl9mYl9pZHhfbW11ID0gSU5WQUxJRF9JRFg7CisJCWRlYy0+dXNlZF80a19udW0gPSAtMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGF2czJfcmVjeWNsZV9tbXVfYnVmKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMpCit7CisJaWYgKGRlYy0+Y3VyX2ZiX2lkeF9tbXUgIT0gSU5WQUxJRF9JRFgpIHsKKwkJZGVjb2Rlcl9tbXVfYm94X2ZyZWVfaWR4KGRlYy0+bW11X2JveCwKKwkJCWRlYy0+Y3VyX2ZiX2lkeF9tbXUpOworCisJCWRlYy0+Y3VyX2ZiX2lkeF9tbXUgPSBJTlZBTElEX0lEWDsKKwkJZGVjLT51c2VkXzRrX251bSA9IC0xOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBkZWNfYWdhaW5fcHJvY2VzcyhzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCWFtaGV2Y19zdG9wKCk7CisJZGVjLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKwlpZiAoZGVjLT5wcm9jZXNzX3N0YXRlID09CisJCVBST0NfU1RBVEVfREVDT0RJTkcpIHsKKwkJZGVjLT5wcm9jZXNzX3N0YXRlID0KKwkJUFJPQ19TVEFURV9ERUNPREVfQUdBSU47CisJfSBlbHNlIGlmIChkZWMtPnByb2Nlc3Nfc3RhdGUgPT0KKwkJUFJPQ19TVEFURV9IRUFEX0RPTkUpIHsKKwkJZGVjLT5wcm9jZXNzX3N0YXRlID0KKwkJUFJPQ19TVEFURV9IRUFEX0FHQUlOOworCX0KKwlkZWMtPm5leHRfYWdhaW5fZmxhZyA9IDE7CisJcmVzZXRfcHJvY2Vzc190aW1lKGRlYyk7CisJdmRlY19zY2hlZHVsZV93b3JrKCZkZWMtPndvcmspOworfQorCitzdGF0aWMgdWludDMyX3QgbG9nMmkodWludDMyX3QgdmFsKQoreworCXVpbnQzMl90IHJldCA9IC0xOworCXdoaWxlICh2YWwgIT0gMCkgeworCQl2YWwgPj49IDE7CisJCXJldCsrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBjaGVja19waWNfZXJyb3Ioc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYywKKwlzdHJ1Y3QgYXZzMl9mcmFtZV9zICpwaWMpCit7CisJaWYgKHBpYy0+ZGVjb2RlZF9sY3UgPT0gMCkgeworCQlwaWMtPmRlY29kZWRfbGN1ID0KKwkJCShSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfTENVX1NUQVJUKQorCQkJCQkmIDB4ZmZmZmZmKSArIDE7CisJfQorCWlmIChwaWMtPmRlY29kZWRfbGN1ICE9IGRlYy0+YXZzMl9kZWMubGN1X3RvdGFsKSB7CisJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1IsCisJCQkiJXMgZXJyb3IgcGljKGluZGV4ICVkIGltZ3RyX2Z3UmVmRGlzdGFuY2UgJWQpIGRlY29kZWQgbGN1ICVkICh0b3RhbCAlZClcbiIsCisJCQlfX2Z1bmNfXywgcGljLT5pbmRleCwgcGljLT5pbWd0cl9md1JlZkRpc3RhbmNlLAorCQkJcGljLT5kZWNvZGVkX2xjdSwgZGVjLT5hdnMyX2RlYy5sY3VfdG90YWwpOworCQlwaWMtPmVycm9yX21hcmsgPSAxOworCX0gZWxzZSB7CisJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1JfTU9SRSwKKwkJCSIlcyBwaWMoaW5kZXggJWQgaW1ndHJfZndSZWZEaXN0YW5jZSAlZCkgZGVjb2RlZCBsY3UgJWQgKHRvdGFsICVkKVxuIiwKKwkJCV9fZnVuY19fLCBwaWMtPmluZGV4LCBwaWMtPmltZ3RyX2Z3UmVmRGlzdGFuY2UsCisJCQlwaWMtPmRlY29kZWRfbGN1LCBkZWMtPmF2czJfZGVjLmxjdV90b3RhbCk7CisKKwl9Cit9CitzdGF0aWMgdm9pZCB1cGRhdGVfZGVjb2RlZF9waWMoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYykKK3sKKwlzdHJ1Y3QgYXZzMl9mcmFtZV9zICpwaWMgPSBkZWMtPmF2czJfZGVjLmhjLmN1cl9waWM7CisJaWYgKHBpYykgeworCQlkZWMtPmF2czJfZGVjLmhjLmN1cl9waWMtPmRlY29kZWRfbGN1ID0KKwkJCShSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfTENVX1NUQVJUKQorCQkJCQkmIDB4ZmZmZmZmKSArIDE7CisJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1JfTU9SRSwKKwkJCSIlcyBwaWMoaW5kZXggJWQgaW1ndHJfZndSZWZEaXN0YW5jZSAlZCkgZGVjb2RlZCBsY3UgJWQgKHRvdGFsICVkKVxuIiwKKwkJCV9fZnVuY19fLCBwaWMtPmluZGV4LCBwaWMtPmltZ3RyX2Z3UmVmRGlzdGFuY2UsCisJCQlwaWMtPmRlY29kZWRfbGN1LCBkZWMtPmF2czJfZGVjLmxjdV90b3RhbCk7CisJfQorfQorLyogK1tTRV0gW0JVR11bQlVHLTE3MTQ2M11bY2h1YW5xaS53YW5nXTogZ2V0IGZyYW1lIHJhdGUgYnkgdmlkZW8gc2VxdWV1ZSovCitzdGF0aWMgaW50IGdldF9mcmFtZV9yYXRlKHVuaW9uIHBhcmFtX3UgKnBhcmFtcywgc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYykKK3sKKwlpbnQgdG1wID0gMDsKKworCXN3aXRjaCAocGFyYW1zLT5wLmZyYW1lX3JhdGVfY29kZSkgeworCWNhc2UgMToKKwljYXNlIDI6CisJCXRtcCA9IDI0OworCQlicmVhazsKKwljYXNlIDM6CisJCXRtcCA9ICAyNTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCWNhc2UgNToKKwkJdG1wID0gIDMwOworCQlicmVhazsKKwljYXNlIDY6CisJCXRtcCA9ICA1MDsKKwkJYnJlYWs7CisJY2FzZSA3OgorCWNhc2UgODoKKwkJdG1wID0gIDYwOworCQlicmVhazsKKwljYXNlIDk6CisJCXRtcCA9ICAxMDA7CisJCWJyZWFrOworCWNhc2UgMTA6CisJCXRtcCA9IDEyMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdG1wID0gIDI1OworCQlicmVhazsKKwl9CisKKwlpZiAoIXBhcmFtcy0+cC5wcm9ncmVzc2l2ZV9zZXF1ZW5jZSkKKwkJdG1wID0gdG1wIC8gMjsKKwlkZWMtPmZyYW1lX2R1ciA9IGRpdl91NjQoOTYwMDBVTEwsIHRtcCk7CisJZGVjLT5nZXRfZnJhbWVfZHVyID0gdHJ1ZTsKKwkvKmF2czJfcHJpbnQoZGVjLCAwLCAiYXZzMiBmcmFtZV9kdXI6JWQscHJvZ3Jlc3NpdmU6JWRcbiIsIGRlYy0+ZnJhbWVfZHVyLCBwYXJhbXMtPnAucHJvZ3Jlc3NpdmVfc2VxdWVuY2UpOyovCisJcmV0dXJuIDA7Cit9CisKKworI2RlZmluZSBIRVZDX01WX0lORk8gICAweDMxMGQKKyNkZWZpbmUgSEVWQ19RUF9JTkZPICAgMHgzMTM3CisjZGVmaW5lIEhFVkNfU0tJUF9JTkZPIDB4MzEzNgorCisvKiBvbmx5IHdoZW4gd2UgZGVjb2RlZCBvbmUgZmllbGQgb3Igb25lIGZyYW1lLAord2UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBnZXQgcW9zIGluZm8qLworc3RhdGljIHZvaWQgZ2V0X3BpY3R1cmVfcW9zX2luZm8oc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYykKK3sKKwlzdHJ1Y3QgYXZzMl9mcmFtZV9zICpwaWN0dXJlID0gZGVjLT5hdnMyX2RlYy5oYy5jdXJfcGljOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGRlYyk7CisJaWYgKCFwaWN0dXJlKSB7CisJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1JfTU9SRSwKKwkJCSIlcyBkZWNvZGUgcGljdHVyZSBpcyBub25lIGV4aXN0XG4iKTsKKworCQlyZXR1cm47CisJfQorCWlmICh2ZGVjLT5tdmZybSkgeworCQlwaWN0dXJlLT5mcmFtZV9zaXplID0gdmRlYy0+bXZmcm0tPmZyYW1lX3NpemU7CisJCXBpY3R1cmUtPmh3X2RlY29kZV90aW1lID0KKwkJbG9jYWxfY2xvY2soKSAtIHZkZWMtPm12ZnJtLT5od19kZWNvZGVfc3RhcnQ7CisJfQorCisvKgorI2RlZmluZSBERUJVR19RT1MKKyovCisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpIHsKKwkJdW5zaWduZWQgY2hhciBhWzNdOworCQl1bnNpZ25lZCBjaGFyIGksIGosIHQ7CisJCXVuc2lnbmVkIGxvbmcgIGRhdGE7CisKKwkJZGF0YSA9IFJFQURfVlJFRyhIRVZDX01WX0lORk8pOworCQlpZiAocGljdHVyZS0+c2xpY2VfdHlwZSA9PSBJX0lNRykKKwkJCWRhdGEgPSAwOworCQlhWzBdID0gZGF0YSAmIDB4ZmY7CisJCWFbMV0gPSAoZGF0YSA+PiA4KSAmIDB4ZmY7CisJCWFbMl0gPSAoZGF0YSA+PiAxNikgJiAweGZmOworCisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCQlmb3IgKGogPSBpKzE7IGogPCAzOyBqKyspIHsKKwkJCQlpZiAoYVtqXSA8IGFbaV0pIHsKKwkJCQkJdCA9IGFbal07CisJCQkJCWFbal0gPSBhW2ldOworCQkJCQlhW2ldID0gdDsKKwkJCQl9IGVsc2UgaWYgKGFbal0gPT0gYVtpXSkgeworCQkJCQlhW2ldKys7CisJCQkJCXQgPSBhW2pdOworCQkJCQlhW2pdID0gYVtpXTsKKwkJCQkJYVtpXSA9IHQ7CisJCQkJfQorCQkJfQorCQlwaWN0dXJlLT5tYXhfbXYgPSBhWzJdOworCQlwaWN0dXJlLT5hdmdfbXYgPSBhWzFdOworCQlwaWN0dXJlLT5taW5fbXYgPSBhWzBdOworI2lmZGVmIERFQlVHX1FPUworCQlhdnMyX3ByaW50KGRlYywgMCwgIm12IGRhdGEgJXggIGFbMF09ICV4IGFbMV09ICV4IGFbMl09ICV4XG4iLAorCQkJZGF0YSwgYVswXSwgYVsxXSwgYVsyXSk7CisjZW5kaWYKKworCQlkYXRhID0gUkVBRF9WUkVHKEhFVkNfUVBfSU5GTyk7CisJCWFbMF0gPSBkYXRhICYgMHgxZjsKKwkJYVsxXSA9IChkYXRhID4+IDgpICYgMHgzZjsKKwkJYVsyXSA9IChkYXRhID4+IDE2KSAmIDB4N2Y7CisKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCWZvciAoaiA9IGkrMTsgaiA8IDM7IGorKykgeworCQkJCWlmIChhW2pdIDwgYVtpXSkgeworCQkJCQl0ID0gYVtqXTsKKwkJCQkJYVtqXSA9IGFbaV07CisJCQkJCWFbaV0gPSB0OworCQkJCX0gZWxzZSBpZiAoYVtqXSA9PSBhW2ldKSB7CisJCQkJCWFbaV0rKzsKKwkJCQkJdCA9IGFbal07CisJCQkJCWFbal0gPSBhW2ldOworCQkJCQlhW2ldID0gdDsKKwkJCQl9CisJCQl9CisJCXBpY3R1cmUtPm1heF9xcCA9IGFbMl07CisJCXBpY3R1cmUtPmF2Z19xcCA9IGFbMV07CisJCXBpY3R1cmUtPm1pbl9xcCA9IGFbMF07CisjaWZkZWYgREVCVUdfUU9TCisJCWF2czJfcHJpbnQoZGVjLCAwLCAicXAgZGF0YSAleCAgYVswXT0gJXggYVsxXT0gJXggYVsyXT0gJXhcbiIsCisJCQlkYXRhLCBhWzBdLCBhWzFdLCBhWzJdKTsKKyNlbmRpZgorCisJCWRhdGEgPSBSRUFEX1ZSRUcoSEVWQ19TS0lQX0lORk8pOworCQlhWzBdID0gZGF0YSAmIDB4MWY7CisJCWFbMV0gPSAoZGF0YSA+PiA4KSAmIDB4M2Y7CisJCWFbMl0gPSAoZGF0YSA+PiAxNikgJiAweDdmOworCisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCQlmb3IgKGogPSBpKzE7IGogPCAzOyBqKyspIHsKKwkJCQlpZiAoYVtqXSA8IGFbaV0pIHsKKwkJCQkJdCA9IGFbal07CisJCQkJCWFbal0gPSBhW2ldOworCQkJCQlhW2ldID0gdDsKKwkJCQl9IGVsc2UgaWYgKGFbal0gPT0gYVtpXSkgeworCQkJCQlhW2ldKys7CisJCQkJCXQgPSBhW2pdOworCQkJCQlhW2pdID0gYVtpXTsKKwkJCQkJYVtpXSA9IHQ7CisJCQkJfQorCQkJfQorCQlwaWN0dXJlLT5tYXhfc2tpcCA9IGFbMl07CisJCXBpY3R1cmUtPmF2Z19za2lwID0gYVsxXTsKKwkJcGljdHVyZS0+bWluX3NraXAgPSBhWzBdOworCisjaWZkZWYgREVCVUdfUU9TCisJCWF2czJfcHJpbnQoZGVjLCAwLAorCQkJInNraXAgZGF0YSAleCAgYVswXT0gJXggYVsxXT0gJXggYVsyXT0gJXhcbiIsCisJCQlkYXRhLCBhWzBdLCBhWzFdLCBhWzJdKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCXVpbnQzMl90IGJsazg4X3lfY291bnQ7CisJCXVpbnQzMl90IGJsazg4X2NfY291bnQ7CisJCXVpbnQzMl90IGJsazIyX212X2NvdW50OworCQl1aW50MzJfdCByZGF0YTMyOworCQlpbnQzMl90IG12X2hpOworCQlpbnQzMl90IG12X2xvOworCQl1aW50MzJfdCByZGF0YTMyX2w7CisJCXVpbnQzMl90IG12eF9MMF9oaTsKKwkJdWludDMyX3QgbXZ5X0wwX2hpOworCQl1aW50MzJfdCBtdnhfTDFfaGk7CisJCXVpbnQzMl90IG12eV9MMV9oaTsKKwkJaW50NjRfdCB2YWx1ZTsKKwkJdWludDY0X3QgdGVtcF92YWx1ZTsKKyNpZmRlZiBERUJVR19RT1MKKwkJaW50IHBpY19udW1iZXIgPSAwOworI2VuZGlmCisKKwkJcGljdHVyZS0+bWF4X212ID0gMDsKKwkJcGljdHVyZS0+YXZnX212ID0gMDsKKwkJcGljdHVyZS0+bWluX212ID0gMDsKKworCQlwaWN0dXJlLT5tYXhfc2tpcCA9IDA7CisJCXBpY3R1cmUtPmF2Z19za2lwID0gMDsKKwkJcGljdHVyZS0+bWluX3NraXAgPSAwOworCisJCXBpY3R1cmUtPm1heF9xcCA9IDA7CisJCXBpY3R1cmUtPmF2Z19xcCA9IDA7CisJCXBpY3R1cmUtPm1pbl9xcCA9IDA7CisKKworCisjaWZkZWYgREVCVUdfUU9TCisJCWF2czJfcHJpbnQoZGVjLCAwLCAic2xpY2VfdHlwZTolZCwgcG9jOiVkXG4iLAorCQkJcGljdHVyZS0+c2xpY2VfdHlwZSwKKwkJCXBpY19udW1iZXIpOworI2VuZGlmCisJCS8qIHNldCByZF9pZHggdG8gMCAqLworCSAgICBXUklURV9WUkVHKEhFVkNfUElDX1FVQUxJVFlfQ1RSTCwgMCk7CisKKwkgICAgYmxrODhfeV9jb3VudCA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCSAgICBpZiAoYmxrODhfeV9jb3VudCA9PSAwKSB7CisjaWZkZWYgREVCVUdfUU9TCisJCQlhdnMyX3ByaW50KGRlYywgMCwKKwkJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTk8gRGF0YSB5ZXQuXG4iLAorCQkJCXBpY19udW1iZXIpOworI2VuZGlmCisJCQkvKiByZXNldCBhbGwgY291bnRzICovCisJCQlXUklURV9WUkVHKEhFVkNfUElDX1FVQUxJVFlfQ1RSTCwgKDE8PDgpKTsKKwkJCXJldHVybjsKKwkgICAgfQorCQkvKiBxcF95X3N1bSAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisjaWZkZWYgREVCVUdfUU9TCisJICAgIGF2czJfcHJpbnQoZGVjLCAwLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIFkgUVAgQVZHIDogJWQgKCVkLyVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzIvYmxrODhfeV9jb3VudCwKKwkJCXJkYXRhMzIsIGJsazg4X3lfY291bnQpOworI2VuZGlmCisJCXBpY3R1cmUtPmF2Z19xcCA9IHJkYXRhMzIvYmxrODhfeV9jb3VudDsKKwkJLyogaW50cmFfeV9jb3VudCAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisjaWZkZWYgREVCVUdfUU9TCisJICAgIGF2czJfcHJpbnQoZGVjLCAwLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIFkgaW50cmEgcmF0ZSA6ICVkJWMgKCVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzIqMTAwL2Jsazg4X3lfY291bnQsCisJCQknJScsIHJkYXRhMzIpOworI2VuZGlmCisJCS8qIHNraXBwZWRfeV9jb3VudCAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisjaWZkZWYgREVCVUdfUU9TCisJICAgIGF2czJfcHJpbnQoZGVjLCAwLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIFkgc2tpcHBlZCByYXRlIDogJWQlYyAoJWQpXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMioxMDAvYmxrODhfeV9jb3VudCwKKwkJCSclJywgcmRhdGEzMik7CisjZW5kaWYKKwkJcGljdHVyZS0+YXZnX3NraXAgPSByZGF0YTMyKjEwMC9ibGs4OF95X2NvdW50OworCQkvKiBjb2VmZl9ub25femVyb195X2NvdW50ICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgYXZzMl9wcmludChkZWMsIDAsCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gWSBaRVJPX0NvZWZmIHJhdGUgOiAlZCVjICglZClcbiIsCisJCQlwaWNfbnVtYmVyLCAoMTAwIC0gcmRhdGEzMioxMDAvKGJsazg4X3lfY291bnQqMSkpLAorCQkJJyUnLCByZGF0YTMyKTsKKyNlbmRpZgorCQkvKiBibGs2Nl9jX2NvdW50ICovCisJICAgIGJsazg4X2NfY291bnQgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkgICAgaWYgKGJsazg4X2NfY291bnQgPT0gMCkgeworI2lmZGVmIERFQlVHX1FPUworCQkJYXZzMl9wcmludChkZWMsIDAsCisJCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE5PIERhdGEgeWV0LlxuIiwKKwkJCQlwaWNfbnVtYmVyKTsKKyNlbmRpZgorCQkJLyogcmVzZXQgYWxsIGNvdW50cyAqLworCQkJV1JJVEVfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0NUUkwsICgxPDw4KSk7CisJCQlyZXR1cm47CisJICAgIH0KKwkJLyogcXBfY19zdW0gKi8KKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworI2lmZGVmIERFQlVHX1FPUworCSAgICBhdnMyX3ByaW50KGRlYywgMCwKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBDIFFQIEFWRyA6ICVkICglZC8lZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyL2Jsazg4X2NfY291bnQsCisJCQlyZGF0YTMyLCBibGs4OF9jX2NvdW50KTsKKyNlbmRpZgorCQkvKiBpbnRyYV9jX2NvdW50ICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgYXZzMl9wcmludChkZWMsIDAsCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gQyBpbnRyYSByYXRlIDogJWQlYyAoJWQpXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMioxMDAvYmxrODhfY19jb3VudCwKKwkJCSclJywgcmRhdGEzMik7CisjZW5kaWYKKwkJLyogc2tpcHBlZF9jdV9jX2NvdW50ICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgYXZzMl9wcmludChkZWMsIDAsCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gQyBza2lwcGVkIHJhdGUgOiAlZCVjICglZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyKjEwMC9ibGs4OF9jX2NvdW50LAorCQkJJyUnLCByZGF0YTMyKTsKKyNlbmRpZgorCQkvKiBjb2VmZl9ub25femVyb19jX2NvdW50ICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgYXZzMl9wcmludChkZWMsIDAsCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gQyBaRVJPX0NvZWZmIHJhdGUgOiAlZCVjICglZClcbiIsCisJCQlwaWNfbnVtYmVyLCAoMTAwIC0gcmRhdGEzMioxMDAvKGJsazg4X2NfY291bnQqMSkpLAorCQkJJyUnLCByZGF0YTMyKTsKKyNlbmRpZgorCisJCS8qIDEnaDAsIHFwX2NfbWF4WzY6MF0sIDEnaDAsIHFwX2NfbWluWzY6MF0sCisJCTEnaDAsIHFwX3lfbWF4WzY6MF0sIDEnaDAsIHFwX3lfbWluWzY6MF0gKi8KKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworI2lmZGVmIERFQlVHX1FPUworCSAgICBhdnMyX3ByaW50KGRlYywgMCwgIltQaWN0dXJlICVkIFF1YWxpdHldIFkgUVAgbWluIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCAocmRhdGEzMj4+MCkmMHhmZik7CisjZW5kaWYKKwkJcGljdHVyZS0+bWluX3FwID0gKHJkYXRhMzI+PjApJjB4ZmY7CisKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgYXZzMl9wcmludChkZWMsIDAsICJbUGljdHVyZSAlZCBRdWFsaXR5XSBZIFFQIG1heCA6ICVkXG4iLAorCQkJcGljX251bWJlciwgKHJkYXRhMzI+PjgpJjB4ZmYpOworI2VuZGlmCisJCXBpY3R1cmUtPm1heF9xcCA9IChyZGF0YTMyPj44KSYweGZmOworCisjaWZkZWYgREVCVUdfUU9TCisJICAgIGF2czJfcHJpbnQoZGVjLCAwLCAiW1BpY3R1cmUgJWQgUXVhbGl0eV0gQyBRUCBtaW4gOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIChyZGF0YTMyPj4xNikmMHhmZik7CisJICAgIGF2czJfcHJpbnQoZGVjLCAwLCAiW1BpY3R1cmUgJWQgUXVhbGl0eV0gQyBRUCBtYXggOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIChyZGF0YTMyPj4yNCkmMHhmZik7CisjZW5kaWYKKworCQkvKiBibGsyMl9tdl9jb3VudCAqLworCSAgICBibGsyMl9tdl9jb3VudCA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCSAgICBpZiAoYmxrMjJfbXZfY291bnQgPT0gMCkgeworI2lmZGVmIERFQlVHX1FPUworCQkJYXZzMl9wcmludChkZWMsIDAsCisJCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE5PIE1WIERhdGEgeWV0LlxuIiwKKwkJCQlwaWNfbnVtYmVyKTsKKyNlbmRpZgorCQkJLyogcmVzZXQgYWxsIGNvdW50cyAqLworCQkJV1JJVEVfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0NUUkwsICgxPDw4KSk7CisJCQlyZXR1cm47CisJICAgIH0KKwkJLyogbXZ5X0wxX2NvdW50WzM5OjMyXSwgbXZ4X0wxX2NvdW50WzM5OjMyXSwKKwkJbXZ5X0wwX2NvdW50WzM5OjMyXSwgbXZ4X0wwX2NvdW50WzM5OjMyXSAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJICAgIC8qIHNob3VsZCBhbGwgYmUgMHgwMCBvciAweGZmICovCisjaWZkZWYgREVCVUdfUU9TCisJICAgIGF2czJfcHJpbnQoZGVjLCAwLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE1WIEFWRyBIaWdoIEJpdHM6IDB4JVhcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyKTsKKyNlbmRpZgorCSAgICBtdnhfTDBfaGkgPSAoKHJkYXRhMzI+PjApJjB4ZmYpOworCSAgICBtdnlfTDBfaGkgPSAoKHJkYXRhMzI+PjgpJjB4ZmYpOworCSAgICBtdnhfTDFfaGkgPSAoKHJkYXRhMzI+PjE2KSYweGZmKTsKKwkgICAgbXZ5X0wxX2hpID0gKChyZGF0YTMyPj4yNCkmMHhmZik7CisKKwkJLyogbXZ4X0wwX2NvdW50WzMxOjBdICovCisJICAgIHJkYXRhMzJfbCA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCQl0ZW1wX3ZhbHVlID0gbXZ4X0wwX2hpOworCQl0ZW1wX3ZhbHVlID0gKHRlbXBfdmFsdWUgPDwgMzIpIHwgcmRhdGEzMl9sOworCisJCWlmIChtdnhfTDBfaGkgJiAweDgwKQorCQkJdmFsdWUgPSAweEZGRkZGRkYwMDAwMDAwMDAgfCB0ZW1wX3ZhbHVlOworCQllbHNlCisJCQl2YWx1ZSA9IHRlbXBfdmFsdWU7CisJCSB2YWx1ZSA9IGRpdl9zNjQodmFsdWUsIGJsazIyX212X2NvdW50KTsKKyNpZmRlZiBERUJVR19RT1MKKwkJYXZzMl9wcmludChkZWMsIDAsCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZYX0wwIEFWRyA6ICVkICglbGxkLyVkKVxuIiwKKwkJCXBpY19udW1iZXIsIChpbnQpdmFsdWUsCisJCQl2YWx1ZSwgYmxrMjJfbXZfY291bnQpOworI2VuZGlmCisJCXBpY3R1cmUtPmF2Z19tdiA9IHZhbHVlOworCisJCS8qIG12eV9MMF9jb3VudFszMTowXSAqLworCSAgICByZGF0YTMyX2wgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkJdGVtcF92YWx1ZSA9IG12eV9MMF9oaTsKKwkJdGVtcF92YWx1ZSA9ICh0ZW1wX3ZhbHVlIDw8IDMyKSB8IHJkYXRhMzJfbDsKKworCQlpZiAobXZ5X0wwX2hpICYgMHg4MCkKKwkJCXZhbHVlID0gMHhGRkZGRkZGMDAwMDAwMDAwIHwgdGVtcF92YWx1ZTsKKwkJZWxzZQorCQkJdmFsdWUgPSB0ZW1wX3ZhbHVlOworI2lmZGVmIERFQlVHX1FPUworCSAgICBhdnMyX3ByaW50KGRlYywgMCwKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVllfTDAgQVZHIDogJWQgKCVsbGQvJWQpXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMl9sL2JsazIyX212X2NvdW50LAorCQkJdmFsdWUsIGJsazIyX212X2NvdW50KTsKKyNlbmRpZgorCisJCS8qIG12eF9MMV9jb3VudFszMTowXSAqLworCSAgICByZGF0YTMyX2wgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkJdGVtcF92YWx1ZSA9IG12eF9MMV9oaTsKKwkJdGVtcF92YWx1ZSA9ICh0ZW1wX3ZhbHVlIDw8IDMyKSB8IHJkYXRhMzJfbDsKKwkJaWYgKG12eF9MMV9oaSAmIDB4ODApCisJCQl2YWx1ZSA9IDB4RkZGRkZGRjAwMDAwMDAwMCB8IHRlbXBfdmFsdWU7CisJCWVsc2UKKwkJCXZhbHVlID0gdGVtcF92YWx1ZTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgYXZzMl9wcmludChkZWMsIDAsCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZYX0wxIEFWRyA6ICVkICglbGxkLyVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzJfbC9ibGsyMl9tdl9jb3VudCwKKwkJCXZhbHVlLCBibGsyMl9tdl9jb3VudCk7CisjZW5kaWYKKworCQkvKiBtdnlfTDFfY291bnRbMzE6MF0gKi8KKwkgICAgcmRhdGEzMl9sID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJCXRlbXBfdmFsdWUgPSBtdnlfTDFfaGk7CisJCXRlbXBfdmFsdWUgPSAodGVtcF92YWx1ZSA8PCAzMikgfCByZGF0YTMyX2w7CisJCWlmIChtdnlfTDFfaGkgJiAweDgwKQorCQkJdmFsdWUgPSAweEZGRkZGRkYwMDAwMDAwMDAgfCB0ZW1wX3ZhbHVlOworCQllbHNlCisJCQl2YWx1ZSA9IHRlbXBfdmFsdWU7CisjaWZkZWYgREVCVUdfUU9TCisJICAgIGF2czJfcHJpbnQoZGVjLCAwLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWV9MMSBBVkcgOiAlZCAoJWxsZC8lZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyX2wvYmxrMjJfbXZfY291bnQsCisJCQl2YWx1ZSwgYmxrMjJfbXZfY291bnQpOworI2VuZGlmCisKKwkJLyoge212eF9MMF9tYXgsIG12eF9MMF9taW59IC8vIGZvcm1hdCA6IHtzaWduLCBhYnNbMTQ6MF19ICAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJICAgIG12X2hpID0gKHJkYXRhMzI+PjE2KSYweGZmZmY7CisJICAgIGlmIChtdl9oaSAmIDB4ODAwMCkKKwkJCW12X2hpID0gMHg4MDAwIC0gbXZfaGk7CisjaWZkZWYgREVCVUdfUU9TCisJICAgIGF2czJfcHJpbnQoZGVjLCAwLCAiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZYX0wwIE1BWCA6ICVkXG4iLAorCQkJcGljX251bWJlciwgbXZfaGkpOworI2VuZGlmCisJCXBpY3R1cmUtPm1heF9tdiA9IG12X2hpOworCisJICAgIG12X2xvID0gKHJkYXRhMzI+PjApJjB4ZmZmZjsKKwkgICAgaWYgKG12X2xvICYgMHg4MDAwKQorCQkJbXZfbG8gPSAweDgwMDAgLSBtdl9sbzsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgYXZzMl9wcmludChkZWMsIDAsICJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVlhfTDAgTUlOIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9sbyk7CisjZW5kaWYKKwkJcGljdHVyZS0+bWluX212ID0gbXZfbG87CisKKyNpZmRlZiBERUJVR19RT1MKKwkJLyoge212eV9MMF9tYXgsIG12eV9MMF9taW59ICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkgICAgbXZfaGkgPSAocmRhdGEzMj4+MTYpJjB4ZmZmZjsKKwkgICAgaWYgKG12X2hpICYgMHg4MDAwKQorCQkJbXZfaGkgPSAweDgwMDAgLSBtdl9oaTsKKwkgICAgYXZzMl9wcmludChkZWMsIDAsICJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVllfTDAgTUFYIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9oaSk7CisKKworCSAgICBtdl9sbyA9IChyZGF0YTMyPj4wKSYweGZmZmY7CisJICAgIGlmIChtdl9sbyAmIDB4ODAwMCkKKwkJCW12X2xvID0gMHg4MDAwIC0gbXZfbG87CisKKwkgICAgYXZzMl9wcmludChkZWMsIDAsICJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVllfTDAgTUlOIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9sbyk7CisKKworCQkvKiB7bXZ4X0wxX21heCwgbXZ4X0wxX21pbn0gKi8KKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCSAgICBtdl9oaSA9IChyZGF0YTMyPj4xNikmMHhmZmZmOworCSAgICBpZiAobXZfaGkgJiAweDgwMDApCisJCQltdl9oaSA9IDB4ODAwMCAtIG12X2hpOworCisJICAgIGF2czJfcHJpbnQoZGVjLCAwLCAiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZYX0wxIE1BWCA6ICVkXG4iLAorCQkJcGljX251bWJlciwgbXZfaGkpOworCisKKwkgICAgbXZfbG8gPSAocmRhdGEzMj4+MCkmMHhmZmZmOworCSAgICBpZiAobXZfbG8gJiAweDgwMDApCisJCQltdl9sbyA9IDB4ODAwMCAtIG12X2xvOworCisJICAgIGF2czJfcHJpbnQoZGVjLCAwLCAiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZYX0wxIE1JTiA6ICVkXG4iLAorCQkJcGljX251bWJlciwgbXZfbG8pOworCisKKwkJLyoge212eV9MMV9tYXgsIG12eV9MMV9taW59ICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkgICAgbXZfaGkgPSAocmRhdGEzMj4+MTYpJjB4ZmZmZjsKKwkgICAgaWYgKG12X2hpICYgMHg4MDAwKQorCQkJbXZfaGkgPSAweDgwMDAgLSBtdl9oaTsKKworCSAgICBhdnMyX3ByaW50KGRlYywgMCwgIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWV9MMSBNQVggOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIG12X2hpKTsKKworCSAgICBtdl9sbyA9IChyZGF0YTMyPj4wKSYweGZmZmY7CisJICAgIGlmIChtdl9sbyAmIDB4ODAwMCkKKwkJCW12X2xvID0gMHg4MDAwIC0gbXZfbG87CisKKwkgICAgYXZzMl9wcmludChkZWMsIDAsICJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVllfTDEgTUlOIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9sbyk7CisjZW5kaWYKKworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfQ1RSTCk7CisjaWZkZWYgREVCVUdfUU9TCisJICAgIGF2czJfcHJpbnQoZGVjLCAwLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIEFmdGVyIFJlYWQgOiBWREVDX1BJQ19RVUFMSVRZX0NUUkwgOiAweCV4XG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMik7CisjZW5kaWYKKwkJLyogcmVzZXQgYWxsIGNvdW50cyAqLworCSAgICBXUklURV9WUkVHKEhFVkNfUElDX1FVQUxJVFlfQ1RSTCwgKDE8PDgpKTsKKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB2YXZzMl9pc3JfdGhyZWFkX2ZuKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYyA9IChzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqKWRhdGE7CisJdW5zaWduZWQgaW50IGRlY19zdGF0dXMgPSBkZWMtPmRlY19zdGF0dXM7CisJaW50IGksIHJldDsKKwlpbnQzMl90IHN0YXJ0X2NvZGUgPSAwOworCisJLyppZiAoZGVjLT53YWl0X2J1ZikKKwkJcHJfaW5mbygic2V0IHdhaXRfYnVmIHRvIDBcclxuIik7CisJKi8KKworCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1JfTU9SRSwKKwkJIiVzIGRlY29kZV9zdGF0dXMgMHgleCBwcm9jZXNzX3N0YXRlICVkIGxjdSAweCV4XG4iLAorCQlfX2Z1bmNfXywgZGVjX3N0YXR1cywgZGVjLT5wcm9jZXNzX3N0YXRlLAorCQlSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfTENVX1NUQVJUKSk7CisKKyNpZm5kZWYgRzEyQV9CUklOR1VQX0RFQlVHCisJaWYgKGRlYy0+ZW9zKSB7CisJCVBSSU5UX0xJTkUoKTsKKwkJZ290byBpcnFfaGFuZGxlZF9leGl0OworCX0KKyNlbmRpZgorCWRlYy0+d2FpdF9idWYgPSAwOworCWlmIChkZWNfc3RhdHVzID09IEFWUzJfREVDT0RFX0JVRkVNUFRZKSB7CisJCVBSSU5UX0xJTkUoKTsKKwkJaWYgKGRlYy0+bV9pbnNfZmxhZykgeworCQkJcmVzZXRfcHJvY2Vzc190aW1lKGRlYyk7CisJCQlpZiAoIXZkZWNfZnJhbWVfYmFzZWQoaHdfdG9fdmRlYyhkZWMpKSkKKwkJCQlkZWNfYWdhaW5fcHJvY2VzcyhkZWMpOworCQkJZWxzZSB7CisJCQkJZGVjLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworCQkJCXJlc2V0X3Byb2Nlc3NfdGltZShkZWMpOworCQkJCWFtaGV2Y19zdG9wKCk7CisJCQkJdmRlY19zY2hlZHVsZV93b3JrKCZkZWMtPndvcmspOworCQkJfQorCQl9CisJCWdvdG8gaXJxX2hhbmRsZWRfZXhpdDsKKwl9IGVsc2UgaWYgKGRlY19zdGF0dXMgPT0gSEVWQ19ERUNQSUNfREFUQV9ET05FKSB7CisJCVBSSU5UX0xJTkUoKTsKKwkJZGVjLT5zdGFydF9kZWNvZGluZ19mbGFnIHw9IDB4MzsKKwkJaWYgKGRlYy0+bV9pbnNfZmxhZykgeworCQkJc2V0X2N1dmFfZGF0YShkZWMpOworCQkJdXBkYXRlX2RlY29kZWRfcGljKGRlYyk7CisJCQlnZXRfcGljdHVyZV9xb3NfaW5mbyhkZWMpOworCQkJcmVzZXRfcHJvY2Vzc190aW1lKGRlYyk7CisJCQlkZWMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJCQlhbWhldmNfc3RvcCgpOworI2lmIDAgLypkZWYgQVZTMl8xMEJfTU1VKi8KKwkJCWlmIChkZWMtPm1faW5zX2ZsYWcpIHsKKwkJCQkvKmF2czJfcmVjeWNsZV9tbXVfYnVmX3RhaWwoZGVjKTsqLworCQkJCWRlYy0+dXNlZF80a19udW0gPQorCQkJCQkoUkVBRF9WUkVHKEhFVkNfU0FPX01NVV9TVEFUVVMpID4+IDE2KTsKKwkJCX0KKyNlbmRpZgorCisjaWYgMAorCQkJLyprZWVwIGhhcmR3YXJlIHN0YXRlKi8KKwkJCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9JTlRfU1RBVFVTLCAoMTw8MzEpKTsKKwkJCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfUkVTVUxUXzMsIDB4ZmZmZmZmZmYpOworCQkJZGVjLT5tcHJlZF9hYnZfc3RhcnRfYWRkciA9CisJCQkJUkVBRF9WUkVHKEhFVkNfTVBSRURfQUJWX1NUQVJUX0FERFIpOworCQkJLyoqLworI2VuZGlmCisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmRlYy0+d29yayk7CisJCX0KKwkJZ290byBpcnFfaGFuZGxlZF9leGl0OworCX0KKwlQUklOVF9MSU5FKCk7CisjaWYgMAorCWlmIChkZWNfc3RhdHVzID09IEFWUzJfRU9TKSB7CisJCWlmIChkZWMtPm1faW5zX2ZsYWcpCisJCQlyZXNldF9wcm9jZXNzX3RpbWUoZGVjKTsKKworCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSLAorCQkJIkFWUzJfRU9TLCBmbHVzaCBidWZmZXJcclxuIik7CisKKwkJYXZzMl9wb3N0X3Byb2Nlc3MoJmRlYy0+YXZzMl9kZWMpOworCQlhdnMyX3ByZXBhcmVfZGlzcGxheV9idWYoZGVjKTsKKworCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSLAorCQkJInNlbmQgQVZTMl8xMEJfRElTQ0FSRF9OQUxcclxuIik7CisJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgQVZTMl8xMEJfRElTQ0FSRF9OQUwpOworCQlpZiAoZGVjLT5tX2luc19mbGFnKSB7CisJCQl1cGRhdGVfZGVjb2RlZF9waWMoZGVjKTsKKwkJCWRlYy0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwkJCWFtaGV2Y19zdG9wKCk7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmRlYy0+d29yayk7CisJCX0KKwkJZ290byBpcnFfaGFuZGxlZF9leGl0OworCX0gZWxzZQorI2VuZGlmCisJaWYgKGRlY19zdGF0dXMgPT0gQVZTMl9ERUNPREVfT1ZFUl9TSVpFKSB7CisJCWF2czJfcHJpbnQoZGVjLCAwLAorCQkJImF2czIgIGRlY29kZSBvdmVyc2l6ZSAhIVxuIik7CisJCWRlYnVnIHw9IChBVlMyX0RCR19ESVNfTE9DX0VSUk9SX1BST0MgfAorCQkJQVZTMl9EQkdfRElTX1NZU19FUlJPUl9QUk9DKTsKKwkJZGVjLT5mYXRhbF9lcnJvciB8PSBERUNPREVSX0ZBVEFMX0VSUk9SX1NJWkVfT1ZFUkZMT1c7CisJCWlmIChkZWMtPm1faW5zX2ZsYWcpCisJCQlyZXNldF9wcm9jZXNzX3RpbWUoZGVjKTsKKwkJZ290byBpcnFfaGFuZGxlZF9leGl0OworCX0KKwlQUklOVF9MSU5FKCk7CisKKwlpZiAoZGVjLT5tX2luc19mbGFnKQorCQlyZXNldF9wcm9jZXNzX3RpbWUoZGVjKTsKKworCWlmIChkZWNfc3RhdHVzID09IEFWUzJfSEVBRF9TRVFfUkVBRFkpCisJCXN0YXJ0X2NvZGUgPSBTRVFVRU5DRV9IRUFERVJfQ09ERTsKKwllbHNlIGlmIChkZWNfc3RhdHVzID09IEFWUzJfSEVBRF9QSUNfSV9SRUFEWSkKKwkJc3RhcnRfY29kZSA9IElfUElDVFVSRV9TVEFSVF9DT0RFOworCWVsc2UgaWYgKGRlY19zdGF0dXMgPT0gQVZTMl9IRUFEX1BJQ19QQl9SRUFEWSkKKwkJc3RhcnRfY29kZSA9IFBCX1BJQ1RVUkVfU1RBUlRfQ09ERTsKKwllbHNlIGlmIChkZWNfc3RhdHVzID09IEFWUzJfU1RBUlRDT0RFX1NFQVJDSF9ET05FKQorCQkvKlNFUVVFTkNFX0VORF9DT0RFLCBWSURFT19FRElUX0NPREUqLworCQlzdGFydF9jb2RlID0gUkVBRF9WUkVHKENVUl9OQUxfVU5JVF9UWVBFKTsKKworCWlmIChkZWMtPnByb2Nlc3Nfc3RhdGUgPT0KKwkJCVBST0NfU1RBVEVfSEVBRF9BR0FJTgorCQkJKSB7CisJCWlmICgoc3RhcnRfY29kZSA9PSBJX1BJQ1RVUkVfU1RBUlRfQ09ERSkKKwkJfHwgKHN0YXJ0X2NvZGUgPT0gUEJfUElDVFVSRV9TVEFSVF9DT0RFKSkgeworCQkJYXZzMl9wcmludChkZWMsIDAsCisJCQkJIlBST0NfU1RBVEVfSEVBRF9BR0FJTiBlcnJvciwgc3RhcnRfY29kZSAweCV4ISEhXHJcbiIsCisJCQkJc3RhcnRfY29kZSk7CisJCQlnb3RvIGlycV9oYW5kbGVkX2V4aXQ7CisJCX0gZWxzZSB7CisJCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSLAorCQkJCSJQUk9DX1NUQVRFX0hFQURfQUdBSU4sIHN0YXJ0X2NvZGUgMHgleFxyXG4iLAorCQkJCXN0YXJ0X2NvZGUpOworCQkJZGVjLT5wcm9jZXNzX3N0YXRlID0gUFJPQ19TVEFURV9IRUFEX0RPTkU7CisJCQlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIEFWUzJfQUNUSU9OX0RPTkUpOworCQkJZ290byBpcnFfaGFuZGxlZF9leGl0OworCQl9CisJfSBlbHNlIGlmIChkZWMtPnByb2Nlc3Nfc3RhdGUgPT0KKwkJCVBST0NfU1RBVEVfREVDT0RFX0FHQUlOKSB7CisJCWlmICgoc3RhcnRfY29kZSA9PSBJX1BJQ1RVUkVfU1RBUlRfQ09ERSkKKwkJfHwgKHN0YXJ0X2NvZGUgPT0gUEJfUElDVFVSRV9TVEFSVF9DT0RFKSkgeworCQkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUiwKKwkJCQkiUFJPQ19TVEFURV9ERUNPREVfQUdBSU49PiBkZWNvZGVfc2xpY2UsIHN0YXJ0X2NvZGUgMHgleFxyXG4iLAorCQkJCXN0YXJ0X2NvZGUpOworCQkJZ290byBkZWNvZGVfc2xpY2U7CisJCX0gZWxzZSB7CisJCQlhdnMyX3ByaW50KGRlYywgMCwKKwkJCQkiUFJPQ19TVEFURV9ERUNPREVfQUdBSU4sIHN0YXJ0X2NvZGUgMHgleCEhIVxyXG4iLAorCQkJCXN0YXJ0X2NvZGUpOworCQkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCBBVlMyX0FDVElPTl9ET05FKTsKKwkJCWdvdG8gaXJxX2hhbmRsZWRfZXhpdDsKKwkJfQorCX0KKworCWlmICgoc3RhcnRfY29kZSA9PSBJX1BJQ1RVUkVfU1RBUlRfQ09ERSkKKwkJfHwgKHN0YXJ0X2NvZGUgPT0gUEJfUElDVFVSRV9TVEFSVF9DT0RFKQorCQl8fCAoc3RhcnRfY29kZSA9PSBTRVFVRU5DRV9FTkRfQ09ERSkKKwkJfHwgKHN0YXJ0X2NvZGUgPT0gVklERU9fRURJVF9DT0RFKSkgeworCQlQUklOVF9MSU5FKCk7CisKKwkJaWYgKGRlYy0+YXZzMl9kZWMuaGMuY3VyX3BpYyAhPSBOVUxMKSB7CisJCQlpbnQzMl90IGlpOworI2lmZGVmIEFWUzJfMTBCX01NVQorCQkJYXZzMl9yZWN5Y2xlX21tdV9idWZfdGFpbChkZWMpOworI2VuZGlmCisJCQljaGVja19waWNfZXJyb3IoZGVjLCBkZWMtPmF2czJfZGVjLmhjLmN1cl9waWMpOworCQkJYXZzMl9wb3N0X3Byb2Nlc3MoJmRlYy0+YXZzMl9kZWMpOworCisJCQlpZiAoZGVidWcgJiBBVlMyX0RCR19QUklOVF9QSUNfTElTVCkKKwkJCQlkdW1wX3BpY19saXN0KGRlYyk7CisKKwkJCWF2czJfcHJlcGFyZV9kaXNwbGF5X2J1ZihkZWMpOworCQkJZGVjLT5hdnMyX2RlYy5oYy5jdXJfcGljID0gTlVMTDsKKwkJCWZvciAoaWkgPSAwOyBpaSA8IGRlYy0+YXZzMl9kZWMucmVmX21heGJ1ZmZlcjsKKwkJCQkJaWkrKykgeworCQkJCXN0cnVjdCBhdnMyX2ZyYW1lX3MgKnBpYyA9CisJCQkJCWRlYy0+YXZzMl9kZWMuZnJlZltpaV07CisJCQkJaWYgKHBpYy0+YmdfZmxhZyA9PSAwICYmCisJCQkJCXBpYy0+aXNfb3V0cHV0ID09IC0xICYmCisJCQkJCXBpYy0+bW11X2FsbG9jX2ZsYWcgJiYKKwkJCQkJcGljLT52Zl9yZWYgPT0gMCkgeworCQkJCQlpZiAocGljLT5yZWZlcmVkX2J5X290aGVycyA9PSAwKSB7CisjaWZkZWYgQVZTMl8xMEJfTU1VCisJCQkJCQlwaWMtPm1tdV9hbGxvY19mbGFnID0gMDsKKwkJCQkJCS8qcmVsZWFzZV9idWZmZXJfNGsoCisJCQkJCQlkZWMtPmF2czJfZGVjLmZyZWZbaWldLT5pbmRleCk7Ki8KKwkJCQkJCWRlY29kZXJfbW11X2JveF9mcmVlX2lkeChkZWMtPm1tdV9ib3gsCisJCQkJCQkJcGljLT5pbmRleCk7CisjaWZkZWYgRFlOQU1JQ19BTExPQ19IRUFECisJCQkJCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWVfaWR4KAorCQkJCQkJCWRlYy0+Ym1tdV9ib3gsCisJCQkJCQkJSEVBREVSX0JVRkZFUl9JRFgocGljLT5pbmRleCkpOworCQkJCQkJcGljLT5oZWFkZXJfYWRyID0gMDsKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwkJCQkJCWRlY29kZXJfYm1tdV9ib3hfZnJlZV9pZHgoCisJCQkJCQkJZGVjLT5ibW11X2JveCwKKwkJCQkJCQlNVl9CVUZGRVJfSURYKHBpYy0+aW5kZXgpKTsKKwkJCQkJCXBpYy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkciA9IDA7CisjZW5kaWYKKwkJCQkJfQorCQkJCQkvKgorCQkJCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWVfaWR4KAorCQkJCQkJZGVjLT5ibW11X2JveCwKKwkJCQkJCVZGX0JVRkZFUl9JRFgocGljLT5pbmRleCkpOworCQkJCQlkZWMtPmNtYV9hbGxvY19hZGRyID0gMDsqLworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmICgoZGVjX3N0YXR1cyA9PSBBVlMyX0hFQURfUElDX0lfUkVBRFkpCisJCXx8IChkZWNfc3RhdHVzID09IEFWUzJfSEVBRF9QSUNfUEJfUkVBRFkpKSB7CisJCVBSSU5UX0xJTkUoKTsKKworCQlpZiAoZGVidWcgJiBBVlMyX0RCR19TRU5EX1BBUkFNX1dJVEhfUkVHKSB7CisJCQlnZXRfcnBtX3BhcmFtKAorCQkJCSZkZWMtPmF2czJfZGVjLnBhcmFtKTsKKwkJfSBlbHNlIHsKKworCQkJZm9yIChpID0gMDsgaSA8IChSUE1fRU5EIC0gUlBNX0JFR0lOKTsgaSArPSA0KSB7CisJCQkJaW50IGlpOworCQkJCWZvciAoaWkgPSAwOyBpaSA8IDQ7IGlpKyspCisJCQkJCWRlYy0+YXZzMl9kZWMucGFyYW0ubC5kYXRhW2kgKyBpaV0gPQorCQkJCQkJZGVjLT5ycG1fcHRyW2kgKyAzIC0gaWldOworCQkJICAgfQorCQl9CisjaWZkZWYgU0FOSVRZX0NIRUNLCisJCWlmIChkZWMtPmF2czJfZGVjLnBhcmFtLnAubnVtX29mX3JlZl9jdXIgPgorCQkJZGVjLT5hdnMyX2RlYy5yZWZfbWF4YnVmZmVyKSB7CisJCQlwcl9pbmZvKCJXYXJuaW5nOiBXcm9uZyBudW1fb2ZfcmVmX2N1ciAlZCwgZm9yY2UgdG8gJWRcbiIsCisJCQkJZGVjLT5hdnMyX2RlYy5wYXJhbS5wLm51bV9vZl9yZWZfY3VyLAorCQkJCWRlYy0+YXZzMl9kZWMucmVmX21heGJ1ZmZlcik7CisJCQlkZWMtPmF2czJfZGVjLnBhcmFtLnAubnVtX29mX3JlZl9jdXIgPQorCQkJCWRlYy0+YXZzMl9kZWMucmVmX21heGJ1ZmZlcjsKKwkJfQorI2VuZGlmCisJCVBSSU5UX0xJTkUoKTsKKworCQlkZWJ1Z19idWZmZXJfbWdyX21vcmUoZGVjKTsKKwkJZ2V0X2ZyYW1lX3JhdGUoJmRlYy0+YXZzMl9kZWMucGFyYW0sIGRlYyk7CisKKyNpZiAxIC8vIFRoZSB2aWRlb19zaWduYWxfdHlwZSBpcyB0eXBlIG9mIHVpbnQxNl90IGFuZCByZXN1bHQgZmFsc2UsIHNvIGNvbW1lbnQgaXQgb3V0LgorCQlpZiAoZGVjLT5hdnMyX2RlYy5wYXJhbS5wLnZpZGVvX3NpZ25hbF90eXBlCisJCQkJJiAoMTw8MzApKSB7CisJCQl1bmlvbiBwYXJhbV91ICpwUGFyYTsKKworCQkJYXZzMl9wcmludChkZWMsIDAsCisJCQkJCSJhdnMyIEhEUiBtZXRhIGRhdGEgcHJlc2VudFxuIik7CisJCQlwUGFyYSA9ICZkZWMtPmF2czJfZGVjLnBhcmFtOworCisJCQkvKmNsZWFuIHRoaXMgZmxhZyovCisJCQlwUGFyYS0+cC52aWRlb19zaWduYWxfdHlwZQorCQkJCSY9IH4oMTw8MzApOworCisJCQlkZWMtPnZmX2RwLnByZXNlbnRfZmxhZyA9IDE7CisKKwkJCWRlYy0+dmZfZHAud2hpdGVfcG9pbnRbMF0KKwkJCQk9IHBQYXJhLT5wLndoaXRlX3BvaW50X3g7CisJCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfSERSX0lORk8sCisJCQkJIndoaXRlX3BvaW50WzBdOjB4JXhcbiIsCisJCQkJZGVjLT52Zl9kcC53aGl0ZV9wb2ludFswXSk7CisKKwkJCWRlYy0+dmZfZHAud2hpdGVfcG9pbnRbMV0KKwkJCQk9IHBQYXJhLT5wLndoaXRlX3BvaW50X3k7CisJCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfSERSX0lORk8sCisJCQkJIndoaXRlX3BvaW50WzFdOjB4JXhcbiIsCisJCQkJZGVjLT52Zl9kcC53aGl0ZV9wb2ludFsxXSk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCQlkZWMtPnZmX2RwLnByaW1hcmllc1tpXVswXQorCQkJCQk9IHBQYXJhLT5wLmRpc3BsYXlfcHJpbWFyaWVzX3hbaV07CisJCQkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0hEUl9JTkZPLAorCQkJCQkicHJpbWFyaWVzWyVkXVswXToweCV4XG4iLAorCQkJCQlpLAorCQkJCQlkZWMtPnZmX2RwLnByaW1hcmllc1tpXVswXSk7CisJCQl9CisKKwkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCQlkZWMtPnZmX2RwLnByaW1hcmllc1tpXVsxXQorCQkJCQk9IHBQYXJhLT5wLmRpc3BsYXlfcHJpbWFyaWVzX3lbaV07CisJCQkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0hEUl9JTkZPLAorCQkJCQkicHJpbWFyaWVzWyVkXVsxXToweCV4XG4iLAorCQkJCQlpLAorCQkJCQlkZWMtPnZmX2RwLnByaW1hcmllc1tpXVsxXSk7CisJCQl9CisKKwkJCWRlYy0+dmZfZHAubHVtaW5hbmNlWzBdCisJCQkJPSBwUGFyYS0+cC5tYXhfZGlzcGxheV9tYXN0ZXJpbmdfbHVtaW5hbmNlOworCQkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0hEUl9JTkZPLAorCQkJCSJsdW1pbmFuY2VbMF06MHgleFxuIiwKKwkJCQlkZWMtPnZmX2RwLmx1bWluYW5jZVswXSk7CisKKwkJCWRlYy0+dmZfZHAubHVtaW5hbmNlWzFdCisJCQkJPSBwUGFyYS0+cC5taW5fZGlzcGxheV9tYXN0ZXJpbmdfbHVtaW5hbmNlOworCQkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0hEUl9JTkZPLAorCQkJCSJsdW1pbmFuY2VbMV06MHgleFxuIiwKKwkJCQlkZWMtPnZmX2RwLmx1bWluYW5jZVsxXSk7CisKKworCQkJZGVjLT52Zl9kcC5jb250ZW50X2xpZ2h0X2xldmVsLnByZXNlbnRfZmxhZworCQkJCT0gMTsKKwkJCWRlYy0+dmZfZHAuY29udGVudF9saWdodF9sZXZlbC5tYXhfY29udGVudAorCQkJCT0gcFBhcmEtPnAubWF4X2NvbnRlbnRfbGlnaHRfbGV2ZWw7CisJCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfSERSX0lORk8sCisJCQkJIm1heF9jb250ZW50OjB4JXhcbiIsCisJCQkJZGVjLT52Zl9kcC5jb250ZW50X2xpZ2h0X2xldmVsLm1heF9jb250ZW50KTsKKworCQkJZGVjLT52Zl9kcC5jb250ZW50X2xpZ2h0X2xldmVsLm1heF9waWNfYXZlcmFnZQorCQkJCT0gcFBhcmEtPnAubWF4X3BpY3R1cmVfYXZlcmFnZV9saWdodF9sZXZlbDsKKworCQkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0hEUl9JTkZPLAorCQkJCSJtYXhfcGljX2F2ZXJhZ2U6MHgleFxuIiwKKwkJCQlkZWMtPnZmX2RwLmNvbnRlbnRfbGlnaHRfbGV2ZWwubWF4X3BpY19hdmVyYWdlKTsKKwkJfQorI2VuZGlmCisKKworCQlpZiAoZGVjLT52aWRlb19vcmlfc2lnbmFsX3R5cGUgIT0KKwkJCSgoZGVjLT5hdnMyX2RlYy5wYXJhbS5wLnZpZGVvX3NpZ25hbF90eXBlIDw8IDE2KQorCQkJfCBkZWMtPmF2czJfZGVjLnBhcmFtLnAuY29sb3JfZGVzY3JpcHRpb24pKSB7CisJCQl1MzIgdiA9IGRlYy0+YXZzMl9kZWMucGFyYW0ucC52aWRlb19zaWduYWxfdHlwZTsKKwkJCXUzMiBjID0gZGVjLT5hdnMyX2RlYy5wYXJhbS5wLmNvbG9yX2Rlc2NyaXB0aW9uOworCQkJdTMyIGNvbnZlcnRfYyA9IGM7CisKKwkJCWlmICh2ICYgMHgyMDAwKSB7CisJCQkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0hEUl9JTkZPLAorCQkJCQkidmlkZW9fc2lnbmFsX3R5cGUgcHJlc2VudDpcbiIpOworCQkJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19IRFJfSU5GTywKKwkJCQkJIiAlcyAlc1xuIiwKKwkJCQkJdmlkZW9fZm9ybWF0X25hbWVzWyh2ID4+IDEwKSAmIDddLAorCQkJCQkoKHYgPj4gOSkgJiAxKSA/CisJCQkJCQkiZnVsbF9yYW5nZSIgOiAibGltaXRlZCIpOworCQkJCWlmICh2ICYgMHgxMDApIHsKKwkJCQkJdTMyIHRyYW5zZmVyOworCQkJCQl1MzIgbWF4dHJpeDsKKworCQkJCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfSERSX0lORk8sCisJCQkJCQkiY29sb3JfZGVzY3JpcHRpb24gcHJlc2VudDpcbiIpOworCQkJCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfSERSX0lORk8sCisJCQkJCQkiY29sb3JfcHJpbWFyaWUgPSAlZFxuIiwKKwkJCQkJCXYgJiAweGZmKTsKKwkJCQkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0hEUl9JTkZPLAorCQkJCQkJInRyYW5zZmVyX2NoYXJhY3RlcmlzdGljID0gJWRcbiIsCisJCQkJCQkoYyA+PiA4KSAmIDB4ZmYpOworCQkJCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfSERSX0lORk8sCisJCQkJCQkiICBtYXRyaXhfY29lZmZpY2llbnQgPSAlZFxuIiwKKwkJCQkJCWMgJiAweGZmKTsKKworCQkJCQl0cmFuc2ZlciA9IChjID4+IDgpICYgMHhGRjsKKwkJCQkJaWYgKHRyYW5zZmVyID49IDE1KQorCQkJCQkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0hEUl9JTkZPLAorCQkJCQkJCSJ1bnN1cHBvcnQgdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNcbiIpOworCQkJCQllbHNlIGlmICh0cmFuc2ZlciAgPT0gMTQpCisJCQkJCQl0cmFuc2ZlciA9IDE4OyAvKiBITEcgKi8KKwkJCQkJZWxzZSBpZiAodHJhbnNmZXIgPT0gMTMpCisJCQkJCQl0cmFuc2ZlciA9IDMyOworCQkJCQllbHNlIGlmICh0cmFuc2ZlciA9PSAxMikKKwkJCQkJCXRyYW5zZmVyID0gMTY7CisJCQkJCWVsc2UgaWYgKHRyYW5zZmVyID09IDExKQorCQkJCQkJdHJhbnNmZXIgPSAxNTsKKworCQkJCQltYXh0cml4ID0gYyAmIDB4RkY7CisJCQkJCWlmIChtYXh0cml4ID49IDEwKQorCQkJCQkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0hEUl9JTkZPLAorCQkJCQkJCSJ1bnN1cHBvcnQgbWF0cml4X2NvZWZmaWNpZW50XG4iKTsKKwkJCQkJZWxzZSBpZiAobWF4dHJpeCA9PSA5KQorCQkJCQkJbWF4dHJpeCA9IDEwOworCQkJCQllbHNlIGlmIChtYXh0cml4ID09IDgpCisJCQkJCQltYXh0cml4ID0gOTsKKworCQkJCQljb252ZXJ0X2MgPSAodHJhbnNmZXIgPDwgOCkgfCAobWF4dHJpeCk7CisKKwkJCQkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0hEUl9JTkZPLAorCQkJCQkJIiBjb252ZXJlZCBjOjB4JXhcbiIsCisJCQkJCQljb252ZXJ0X2MpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGVuYWJsZV9mb3JjZV92aWRlb19zaWduYWxfdHlwZSkKKwkJCQlkZWMtPnZpZGVvX3NpZ25hbF90eXBlCisJCQkJCT0gZm9yY2VfdmlkZW9fc2lnbmFsX3R5cGU7CisJCQllbHNlIHsKKwkJCQlkZWMtPnZpZGVvX3NpZ25hbF90eXBlCisJCQkJCT0gKHYgPDwgMTYpIHwgY29udmVydF9jOworCisJCQkJZGVjLT52aWRlb19vcmlfc2lnbmFsX3R5cGUKKwkJCQkJPSAodiA8PCAxNikgfCBjOworCQkJfQorCisJCQl2aWRlb19zaWduYWxfdHlwZSA9IGRlYy0+dmlkZW9fc2lnbmFsX3R5cGU7CisJCX0KKwl9CisjaWYgMAorCWlmICgoZGVidWdfYWdhaW4gJiAweDQpICYmCisJCWRlYy0+cHJvY2Vzc19zdGF0ZSA9PQorCQlQUk9DX1NUQVRFX0lOSVQpIHsKKwkJaWYgKHN0YXJ0X2NvZGUgPT0gUEJfUElDVFVSRV9TVEFSVF9DT0RFKSB7CisJCQlkZWMtPnByb2Nlc3Nfc3RhdGUgPSBQUk9DX1NUQVRFX1RFU1QxOworCQkJZGVjX2FnYWluX3Byb2Nlc3MoZGVjKTsKKwkJCWdvdG8gaXJxX2hhbmRsZWRfZXhpdDsKKwkJfQorCX0KKyNlbmRpZgorCVBSSU5UX0xJTkUoKTsKKwlhdnMyX3ByZXBhcmVfaGVhZGVyKCZkZWMtPmF2czJfZGVjLCBzdGFydF9jb2RlKTsKKworCWlmIChzdGFydF9jb2RlID09IFNFUVVFTkNFX0hFQURFUl9DT0RFIHx8CisJCXN0YXJ0X2NvZGUgPT0gVklERU9fRURJVF9DT0RFIHx8CisJCXN0YXJ0X2NvZGUgPT0gU0VRVUVOQ0VfRU5EX0NPREUpIHsKKwkJaWYgKGRlYy0+bV9pbnNfZmxhZyAmJgorCQkJdmRlY19mcmFtZV9iYXNlZChod190b192ZGVjKGRlYykpKQorCQkJZGVjLT5zdGFydF9kZWNvZGluZ19mbGFnIHw9IDB4MTsKKwkJZGVjLT5wcm9jZXNzX3N0YXRlID0gUFJPQ19TVEFURV9IRUFEX0RPTkU7CisJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgQVZTMl9BQ1RJT05fRE9ORSk7CisJfSBlbHNlIGlmIChzdGFydF9jb2RlID09IElfUElDVFVSRV9TVEFSVF9DT0RFIHx8CisJCXN0YXJ0X2NvZGUgPT0gUEJfUElDVFVSRV9TVEFSVF9DT0RFKSB7CisJCXJldCA9IDA7CisJCWlmIChkZWMtPnBpY19saXN0X2luaXRfZmxhZyA9PSAwKSB7CisJCQlpbnQzMl90IGxjdV9zaXplX2xvZzIgPQorCQkJCWxvZzJpKGRlYy0+YXZzMl9kZWMucGFyYW0ucC5sY3Vfc2l6ZSk7CisKKwkJCWF2czJfaW5pdF9nbG9iYWxfYnVmZmVycygmZGVjLT5hdnMyX2RlYyk7CisJCQkJLyphdnMyX2RlYy0+bV9iZy0+aW5kZXggaXMKKwkJCQlzZXQgdG8gZGVjLT51c2VkX2J1Zl9udW0gLSAxKi8KKwkJCWluaXRfcGljX2xpc3QoZGVjLCBsY3Vfc2l6ZV9sb2cyKTsKKwkJCWluaXRfcGljX2xpc3RfaHcoZGVjKTsKKwkJfQorCQlyZXQgPSBhdnMyX3Byb2Nlc3NfaGVhZGVyKCZkZWMtPmF2czJfZGVjKTsKKwkJaWYgKCFkZWMtPm1faW5zX2ZsYWcpCisJCQlkZWMtPnNsaWNlX2lkeCsrOworCisJCWlmIChkZWMtPm1faW5zX2ZsYWcgJiYgcmV0CisJCQkmJiBkZWMtPmF2czJfZGVjLmhjLmN1cl9waWMtPmN1dmFfZGF0YV9idWYgIT0gTlVMTCkKKwkJCXJlbGVhc2VfY3V2YV9kYXRhKGRlYy0+YXZzMl9kZWMuaGMuY3VyX3BpYyk7CisKKwkJUFJJTlRfTElORSgpOworI2lmZGVmIElfT05MWV9TVVBQT1JUCisJCWlmICgoc3RhcnRfY29kZSA9PSBQQl9QSUNUVVJFX1NUQVJUX0NPREUpICYmCisJCQkoZGVjLT5pX29ubHkgJiAweDIpKQorCQkJcmV0ID0gLTI7CisjZW5kaWYKKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwkJaWYgKHJldCA+PSAwKSB7CisJCQlyZXQgPSBhdnMyX2FsbG9jX21tdShkZWMsCisJCQkJZGVjLT5hdnMyX2RlYy5oYy5jdXJfcGljLT5pbmRleCwKKwkJCQlkZWMtPmF2czJfZGVjLmltZy53aWR0aCwKKwkJCQlkZWMtPmF2czJfZGVjLmltZy5oZWlnaHQsCisJCQkJZGVjLT5hdnMyX2RlYy5pbnB1dC5zYW1wbGVfYml0X2RlcHRoLAorCQkJCWRlYy0+ZnJhbWVfbW11X21hcF9hZGRyKTsKKwkJCWlmIChyZXQgPj0gMCkgeworCQkJCWRlYy0+Y3VyX2ZiX2lkeF9tbXUgPQorCQkJCQlkZWMtPmF2czJfZGVjLmhjLmN1cl9waWMtPmluZGV4OworCQkJCWRlYy0+YXZzMl9kZWMuaGMuY3VyX3BpYy0+bW11X2FsbG9jX2ZsYWcgPSAxOworCQkJfSBlbHNlCisJCQkJcHJfZXJyKCJjYW4ndCBhbGxvYyBuZWVkIG1tdTEsaWR4ICVkIHJldCA9JWRcbiIsCisJCQkJCWRlYy0+YXZzMl9kZWMuaGMuY3VyX3BpYy0+aW5kZXgsCisJCQkJCXJldCk7CisJCX0KKyNlbmRpZgorCisjaWZuZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwkJaWYgKHJldCA+PSAwICYmCisJCQlkZWMtPmF2czJfZGVjLmhjLmN1cl9waWMtPgorCQkJbXByZWRfbXZfd3Jfc3RhcnRfYWRkciA9PSAwKSB7CisJCQl1bnNpZ25lZCBsb25nIGJ1Zl9hZGRyOworCQkJdW5zaWduZWQgbXZfYnVmX3NpemUgPSBnZXRfbXZfYnVmX3NpemUoCisJCQkJZGVjLAorCQkJCWRlYy0+YXZzMl9kZWMuaGMuY3VyX3BpYy0+cGljX3csCisJCQkJZGVjLT5hdnMyX2RlYy5oYy5jdXJfcGljLT5waWNfaCk7CisJCQlpbnQgaSA9IGRlYy0+YXZzMl9kZWMuaGMuY3VyX3BpYy0+aW5kZXg7CisJCQkvKmlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkKKwkJCQltdl9idWZfc2l6ZSA9IDB4MTIwMDAwICogNDsqLworCQkJaWYgKGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeQorCQkJKGRlYy0+Ym1tdV9ib3gsCisJCQlNVl9CVUZGRVJfSURYKGkpLAorCQkJbXZfYnVmX3NpemUsCisJCQlEUklWRVJfTkFNRSwKKwkJCSZidWZfYWRkcikgPCAwKQorCQkJCXJldCA9IC0xOworCQkJZWxzZQorCQkJCWRlYy0+YXZzMl9kZWMuaGMuY3VyX3BpYy0+CisJCQkJbXByZWRfbXZfd3Jfc3RhcnRfYWRkcgorCQkJCT0gYnVmX2FkZHI7CisJCX0KKyNlbmRpZgorCQlpZiAocmV0IDwgMCkgeworCQkJYXZzMl9wcmludChkZWMsIEFWUzJfREJHX0JVRk1HUiwKKwkJCQkiYXZzMl9idWZtZ3JfcHJvY2Vzcz0+ICVkLCBBVlMyXzEwQl9ESVNDQVJEX05BTFxyXG4iLAorCQkJIHJldCk7CisJCQlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIEFWUzJfMTBCX0RJU0NBUkRfTkFMKTsKKwkjaWZkZWYgQVZTMl8xMEJfTU1VCisJCQlhdnMyX3JlY3ljbGVfbW11X2J1ZihkZWMpOworCSNlbmRpZgorCQkJaWYgKGRlYy0+bV9pbnNfZmxhZykgeworCQkJCWRlYy0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwkJCQlhbWhldmNfc3RvcCgpOworCQkJCXZkZWNfc2NoZWR1bGVfd29yaygmZGVjLT53b3JrKTsKKwkJCX0KKworCQkJZ290byBpcnFfaGFuZGxlZF9leGl0OworCQl9IGVsc2UgeworCQkJUFJJTlRfTElORSgpOworCQkJZGVjLT5hdnMyX2RlYy5oYy5jdXJfcGljLT5zdHJlYW1fb2Zmc2V0ID0KKwkJCVJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpOworCQkJLyoKKwkJCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpjdXJfcGljCisJCQkJPSAmY20tPmN1cl9mcmFtZS0+YnVmOworCQkJY3VyX3BpYy0+ZGVjb2RlX2lkeCA9IGRlYy0+ZnJhbWVfY291bnQ7CisJCQkqLworCQkJaWYgKCFkZWMtPm1faW5zX2ZsYWcpIHsKKwkJCQlkZWMtPmZyYW1lX2NvdW50Kys7CisJCQkJZGVjb2RlX2ZyYW1lX2NvdW50W2RlYy0+aW5kZXhdCisJCQkJCT0gZGVjLT5mcmFtZV9jb3VudDsKKwkJCX0KKwkJCS8qTVVMVElfSU5TVEFOQ0VfU1VQUE9SVCovCisJCQlpZiAoZGVjLT5jaHVuaykgeworCQkJCWRlYy0+YXZzMl9kZWMuaGMuY3VyX3BpYy0+cHRzID0KKwkJCQlkZWMtPmNodW5rLT5wdHM7CisJCQkJZGVjLT5hdnMyX2RlYy5oYy5jdXJfcGljLT5wdHM2NCA9CisJCQkJZGVjLT5jaHVuay0+cHRzNjQ7CisJCQl9CisJCQkvKiovCisJCQlkZWMtPmF2czJfZGVjLmhjLmN1cl9waWMtPmJpdF9kZXB0aAorCQkJCT0gZGVjLT5hdnMyX2RlYy5pbnB1dC5zYW1wbGVfYml0X2RlcHRoOworCQkJZGVjLT5hdnMyX2RlYy5oYy5jdXJfcGljLT5kb3VibGVfd3JpdGVfbW9kZQorCQkJCT0gZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGRlYyk7CitkZWNvZGVfc2xpY2U6CisJCQlQUklOVF9MSU5FKCk7CisKKwkJCWNvbmZpZ19tY19idWZmZXIoZGVjKTsKKwkJCWNvbmZpZ19tY3JjY19heGlfaHcoZGVjKTsKKwkJCWNvbmZpZ19tcHJlZF9odyhkZWMpOworCQkJY29uZmlnX2RibGtfaHcoZGVjKTsKKwkJCWNvbmZpZ19zYW9faHcoZGVjKTsKKwkJCWNvbmZpZ19hbGZfaHcoZGVjKTsKKwkJCWNvbmZpZ19vdGhlcl9odyhkZWMpOworCisJCQlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX01PUkUsCisJCQkJIj0+ZnJlZjAgaW1ndHJfZndSZWZEaXN0YW5jZSAlZCwgZnJlZjEgaW1ndHJfZndSZWZEaXN0YW5jZSAlZCwgZGlzMi9kaXMzL2RpczQgJWQgJWQgJWQgIGltZy0+dHIgJWRcbiIsCisJCQkgICAgZGVjLT5hdnMyX2RlYy5mcmVmWzBdLT5pbWd0cl9md1JlZkRpc3RhbmNlLAorCQkJICAgIGRlYy0+YXZzMl9kZWMuZnJlZlsxXS0+aW1ndHJfZndSZWZEaXN0YW5jZSwKKwkJCWRlYy0+YXZzMl9kZWMuZnJlZlsyXS0+aW1ndHJfZndSZWZEaXN0YW5jZSwKKwkJCWRlYy0+YXZzMl9kZWMuZnJlZlszXS0+aW1ndHJfZndSZWZEaXN0YW5jZSwKKwkJCWRlYy0+YXZzMl9kZWMuZnJlZls0XS0+aW1ndHJfZndSZWZEaXN0YW5jZSwKKwkJCWRlYy0+YXZzMl9kZWMuaW1nLnRyKTsKKworCQkJaWYgKChkZWJ1Z19hZ2FpbiAmIDB4MikgJiYKKwkJCQlkZWMtPnByb2Nlc3Nfc3RhdGUgPT0KKwkJCQlQUk9DX1NUQVRFX0lOSVQpIHsKKwkJCQlkZWMtPnByb2Nlc3Nfc3RhdGUgPSBQUk9DX1NUQVRFX0RFQ09ESU5HOworCQkJCWRlY19hZ2Fpbl9wcm9jZXNzKGRlYyk7CisJCQkJZ290byBpcnFfaGFuZGxlZF9leGl0OworCQkJfQorCisJCQlkZWMtPnByb2Nlc3Nfc3RhdGUgPSBQUk9DX1NUQVRFX0RFQ09ESU5HOworCisJCQlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIEFWUzJfQUNUSU9OX0RPTkUpOworCisJCX0KKworCQlpZiAoZGVjLT5tX2luc19mbGFnKQorCQkJc3RhcnRfcHJvY2Vzc190aW1lKGRlYyk7CisJfQoraXJxX2hhbmRsZWRfZXhpdDoKKwlQUklOVF9MSU5FKCk7CisJZGVjLT5wcm9jZXNzX2J1c3kgPSAwOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IHZhdnMyX2lzcihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCWludCBpOworCXVuc2lnbmVkIGludCBkZWNfc3RhdHVzOworCXN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMgPSAoc3RydWN0IEFWUzJEZWNvZGVyX3MgKilkYXRhOworCXVpbnQgZGVidWdfdGFnOworCisJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9NQk9YMF9DTFJfUkVHLCAxKTsKKworCWRlY19zdGF0dXMgPSBSRUFEX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRyk7CisKKwlpZiAoIWRlYykKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCWlmIChkZWMtPmluaXRfZmxhZyA9PSAwKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJaWYgKGRlYy0+cHJvY2Vzc19idXN5KS8qb24gcHJvY2Vzcy4qLworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJZGVjLT5kZWNfc3RhdHVzID0gZGVjX3N0YXR1czsKKwlkZWMtPnByb2Nlc3NfYnVzeSA9IDE7CisJaWYgKGRlYnVnICYgQVZTMl9EQkdfSVJRX0VWRU5UKQorCQlhdnMyX3ByaW50KGRlYywgMCwKKwkJCSJhdnMyIGlzciBkZWMgc3RhdHVzICA9IDB4JXgsIGxjdSAweCV4IHNoaWZ0Ynl0ZSAweCV4ICgleCAleCBsZXYgJXgsIHdyICV4LCByZCAleClcbiIsCisJCQlkZWNfc3RhdHVzLCBSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfTENVX1NUQVJUKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpLAorCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1NUQVJUX0FERFIpLAorCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0VORF9BRERSKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9MRVZFTCksCisJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fV1JfUFRSKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIpCisJCSk7CisKKwlkZWJ1Z190YWcgPSBSRUFEX0hSRUcoREVCVUdfUkVHMSk7CisJaWYgKGRlYnVnX3RhZyAmIDB4MTAwMDApIHsKKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoCisJCQlhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQlkZWMtPmxtZW1fcGh5X2FkZHIsCisJCQlMTUVNX0JVRl9TSVpFLAorCQkJRE1BX0ZST01fREVWSUNFKTsKKworCQlwcl9pbmZvKCJMTUVNPHRhZyAleD46XG4iLCBSRUFEX0hSRUcoREVCVUdfUkVHMSkpOworCQlmb3IgKGkgPSAwOyBpIDwgMHg0MDA7IGkgKz0gNCkgeworCQkJaW50IGlpOworCQkJaWYgKChpICYgMHhmKSA9PSAwKQorCQkJCXByX2luZm8oIiUwM3g6ICIsIGkpOworCQkJZm9yIChpaSA9IDA7IGlpIDwgNDsgaWkrKykgeworCQkJCXByX2luZm8oIiUwNHggIiwKKwkJCQkJICAgZGVjLT5sbWVtX3B0cltpICsgMyAtIGlpXSk7CisJCQl9CisJCQlpZiAoKChpICsgaWkpICYgMHhmKSA9PSAwKQorCQkJCXByX2luZm8oIlxuIik7CisJCX0KKworCQlpZiAoKCh1ZGVidWdfcGF1c2VfcG9zICYgMHhmZmZmKQorCQkJPT0gKGRlYnVnX3RhZyAmIDB4ZmZmZikpICYmCisJCQkodWRlYnVnX3BhdXNlX2RlY29kZV9pZHggPT0gMCB8fAorCQkJdWRlYnVnX3BhdXNlX2RlY29kZV9pZHggPT0gZGVjLT5kZWNvZGVfaWR4KSAmJgorCQkJKHVkZWJ1Z19wYXVzZV92YWwgPT0gMCB8fAorCQkJdWRlYnVnX3BhdXNlX3ZhbCA9PSBSRUFEX0hSRUcoREVCVUdfUkVHMikpKSB7CisJCQl1ZGVidWdfcGF1c2VfcG9zICY9IDB4ZmZmZjsKKwkJCWRlYy0+dWNvZGVfcGF1c2VfcG9zID0gdWRlYnVnX3BhdXNlX3BvczsKKwkJfSBlbHNlIGlmIChkZWJ1Z190YWcgJiAweDIwMDAwKQorCQkJZGVjLT51Y29kZV9wYXVzZV9wb3MgPSAweGZmZmZmZmZmOworCQlpZiAoZGVjLT51Y29kZV9wYXVzZV9wb3MpCisJCQlyZXNldF9wcm9jZXNzX3RpbWUoZGVjKTsKKwkJZWxzZQorCQkJV1JJVEVfSFJFRyhERUJVR19SRUcxLCAwKTsKKwl9IGVsc2UgaWYgKGRlYnVnX3RhZyAhPSAwKSB7CisJCXByX2luZm8oCisJCQkiZGJnJXg6ICV4IGxjdSAleFxuIiwgUkVBRF9IUkVHKERFQlVHX1JFRzEpLAorCQkJICAgUkVBRF9IUkVHKERFQlVHX1JFRzIpLAorCQkJICAgUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0xDVV9TVEFSVCkpOworCQlpZiAoKCh1ZGVidWdfcGF1c2VfcG9zICYgMHhmZmZmKQorCQkJPT0gKGRlYnVnX3RhZyAmIDB4ZmZmZikpICYmCisJCQkodWRlYnVnX3BhdXNlX2RlY29kZV9pZHggPT0gMCB8fAorCQkJdWRlYnVnX3BhdXNlX2RlY29kZV9pZHggPT0gZGVjLT5kZWNvZGVfaWR4KSAmJgorCQkJKHVkZWJ1Z19wYXVzZV92YWwgPT0gMCB8fAorCQkJdWRlYnVnX3BhdXNlX3ZhbCA9PSBSRUFEX0hSRUcoREVCVUdfUkVHMikpKSB7CisJCQl1ZGVidWdfcGF1c2VfcG9zICY9IDB4ZmZmZjsKKwkJCWRlYy0+dWNvZGVfcGF1c2VfcG9zID0gdWRlYnVnX3BhdXNlX3BvczsKKwkJfQorCQlpZiAoZGVjLT51Y29kZV9wYXVzZV9wb3MpCisJCQlyZXNldF9wcm9jZXNzX3RpbWUoZGVjKTsKKwkJZWxzZQorCQkJV1JJVEVfSFJFRyhERUJVR19SRUcxLCAwKTsKKwkJZGVjLT5wcm9jZXNzX2J1c3kgPSAwOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKCFkZWMtPm1faW5zX2ZsYWcpIHsKKwkJaWYgKGRlYy0+ZXJyb3JfZmxhZyA9PSAxKSB7CisJCQlkZWMtPmVycm9yX2ZsYWcgPSAyOworCQkJZGVjLT5wcm9jZXNzX2J1c3kgPSAwOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9IGVsc2UgaWYgKGRlYy0+ZXJyb3JfZmxhZyA9PSAzKSB7CisJCQlkZWMtPnByb2Nlc3NfYnVzeSA9IDA7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKworCQlpZiAoKGRlYy0+cGljX2xpc3RfaW5pdF9mbGFnKSAmJgorCQkJZ2V0X2ZyZWVfYnVmX2NvdW50KGRlYykgPD0gMCkgeworCQkJLyoKKwkJCWlmIChkZWMtPndhaXRfYnVmID09IDApCisJCQkJcHJfaW5mbygic2V0IHdhaXRfYnVmIHRvIDFcclxuIik7CisJCQkqLworCQkJZGVjLT53YWl0X2J1ZiA9IDE7CisJCQlkZWMtPnByb2Nlc3NfYnVzeSA9IDA7CisJCQlpZiAoZGVidWcgJiBBVlMyX0RCR19JUlFfRVZFTlQpCisJCQkJYXZzMl9wcmludChkZWMsIDAsICJ3YWl0X2J1ZlxuIik7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0gZWxzZSBpZiAoZm9yY2VfZGlzcF9waWNfaW5kZXgpIHsKKwkJCWRlYy0+cHJvY2Vzc19idXN5ID0gMDsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCX0KKwlyZXR1cm4gSVJRX1dBS0VfVEhSRUFEOworfQorCitzdGF0aWMgdm9pZCB2YXZzMl9wdXRfdGltZXJfZnVuYyhzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpCit7CisJc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYyA9IGNvbnRhaW5lcl9vZih0aW1lciwKKwkJc3RydWN0IEFWUzJEZWNvZGVyX3MsIHRpbWVyKTsKKwl1aW50OF90IGVtcHR5X2ZsYWc7CisJdW5zaWduZWQgaW50IGJ1Zl9sZXZlbDsKKworCWVudW0gcmVjZXZpdmVyX3N0YXJ0X2Ugc3RhdGUgPSBSRUNFSVZFUl9JTkFDVElWRTsKKwlpZiAoZGVjLT5tX2luc19mbGFnKSB7CisJCWlmIChod190b192ZGVjKGRlYyktPm5leHRfc3RhdHVzCisJCQk9PSBWREVDX1NUQVRVU19ESVNDT05ORUNURUQpIHsKKwkJCWRlYy0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRk9SQ0VfRVhJVDsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmZGVjLT53b3JrKTsKKwkJCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1IsCisJCQkJInZkZWMgcmVxdWVzdGVkIHRvIGJlIGRpc2Nvbm5lY3RlZFxuIik7CisJCQlyZXR1cm47CisJCX0KKwl9CisJaWYgKGRlYy0+aW5pdF9mbGFnID09IDApIHsKKwkJaWYgKGRlYy0+c3RhdCAmIFNUQVRfVElNRVJfQVJNKSB7CisJCQl0aW1lci0+ZXhwaXJlcyA9IGppZmZpZXMgKyBQVVRfSU5URVJWQUw7CisJCQlhZGRfdGltZXIoJmRlYy0+dGltZXIpOworCQl9CisJCXJldHVybjsKKwl9CisJaWYgKGRlYy0+bV9pbnNfZmxhZyA9PSAwKSB7CisJCWlmICh2Zl9nZXRfcmVjZWl2ZXIoZGVjLT5wcm92aWRlcl9uYW1lKSkgeworCQkJc3RhdGUgPQorCQkJCXZmX25vdGlmeV9yZWNlaXZlcihkZWMtPnByb3ZpZGVyX25hbWUsCisJCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9RVVJFWV9TVEFURSwKKwkJCQkJTlVMTCk7CisJCQlpZiAoKHN0YXRlID09IFJFQ0VJVkVSX1NUQVRFX05VTEwpCisJCQkJfHwgKHN0YXRlID09IFJFQ0VJVkVSX1NUQVRFX05PTkUpKQorCQkJCXN0YXRlID0gUkVDRUlWRVJfSU5BQ1RJVkU7CisJCX0gZWxzZQorCQkJc3RhdGUgPSBSRUNFSVZFUl9JTkFDVElWRTsKKworCQllbXB0eV9mbGFnID0gKFJFQURfVlJFRyhIRVZDX1BBUlNFUl9JTlRfU1RBVFVTKSA+PiA2KSAmIDB4MTsKKwkJLyogZXJyb3Igd2F0Y2hkb2cgKi8KKwkJaWYgKGVtcHR5X2ZsYWcgPT0gMCkgeworCQkJLyogZGVjb2RlciBoYXMgaW5wdXQgKi8KKwkJCWlmICgoZGVidWcgJiBBVlMyX0RCR19ESVNfTE9DX0VSUk9SX1BST0MpID09IDApIHsKKworCQkJCWJ1Zl9sZXZlbCA9IFJFQURfVlJFRyhIRVZDX1NUUkVBTV9MRVZFTCk7CisJCQkJLyogcmVjZWl2ZXIgaGFzIG5vIGJ1ZmZlciB0byByZWN5Y2xlICovCisJCQkJaWYgKChzdGF0ZSA9PSBSRUNFSVZFUl9JTkFDVElWRSkgJiYKKwkJCQkJKGtmaWZvX2lzX2VtcHR5KCZkZWMtPmRpc3BsYXlfcSkgJiYKKwkJCQkJIGJ1Zl9sZXZlbCA+IDB4MjAwKQorCQkJCQkpIHsKKwkJCQkJCVdSSVRFX1ZSRUcKKwkJCQkJCShIRVZDX0FTU0lTVF9NQk9YMF9JUlFfUkVHLAorCQkJCQkJIDB4MSk7CisJCQkJfQorCQkJfQorCisJCQlpZiAoKGRlYnVnICYgQVZTMl9EQkdfRElTX1NZU19FUlJPUl9QUk9DKSA9PSAwKSB7CisJCQkJLyogcmVjZWl2ZXIgaGFzIG5vIGJ1ZmZlciB0byByZWN5Y2xlICovCisJCQkJLyppZiAoKHN0YXRlID09IFJFQ0VJVkVSX0lOQUNUSVZFKSAmJgorCQkJCQkoa2ZpZm9faXNfZW1wdHkoJmRlYy0+ZGlzcGxheV9xKSkpIHsKKwkJCQlwcl9pbmZvKCJhdnMyIHNvbWV0aGluZyBlcnJvcixuZWVkIHJlc2V0XG4iKTsKKwkJCQl9Ki8KKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmICgKKwkJCShkZWNvZGVfdGltZW91dF92YWwgPiAwKSAmJgorCQkJKGRlYy0+c3RhcnRfcHJvY2Vzc190aW1lID4gMCkgJiYKKwkJCSgoMTAwMCAqIChqaWZmaWVzIC0gZGVjLT5zdGFydF9wcm9jZXNzX3RpbWUpIC8gSFopCisJCQkJPiBkZWNvZGVfdGltZW91dF92YWwpCisJCSkgeworCQkJaW50IGN1cnJlbnRfbGN1X2lkeCA9CisJCQkJUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0xDVV9TVEFSVCkKKwkJCQkmIDB4ZmZmZmZmOworCQkJaWYgKGRlYy0+bGFzdF9sY3VfaWR4ID09IGN1cnJlbnRfbGN1X2lkeCkgeworCQkJCWlmIChkZWMtPmRlY29kZV90aW1lb3V0X2NvdW50ID4gMCkKKwkJCQkJZGVjLT5kZWNvZGVfdGltZW91dF9jb3VudC0tOworCQkJCWlmIChkZWMtPmRlY29kZV90aW1lb3V0X2NvdW50ID09IDApIHsKKwkJCQkJaWYgKGlucHV0X2ZyYW1lX2Jhc2VkKAorCQkJCQkJaHdfdG9fdmRlYyhkZWMpKSB8fAorCQkJCQkoUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0xFVkVMKSA+IDB4MjAwKSkKKwkJCQkJCXRpbWVvdXRfcHJvY2VzcyhkZWMpOworCQkJCQllbHNlIHsKKwkJCQkJCWF2czJfcHJpbnQoZGVjLCAwLAorCQkJCQkJCSJ0aW1lb3V0ICYgZW1wdHksIGFnYWluXG4iKTsKKwkJCQkJCWRlY19hZ2Fpbl9wcm9jZXNzKGRlYyk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXN0YXJ0X3Byb2Nlc3NfdGltZShkZWMpOworCQkJCWRlYy0+bGFzdF9sY3VfaWR4ID0gY3VycmVudF9sY3VfaWR4OworCQkJfQorCQl9CisJfQorCisJaWYgKChkZWMtPnVjb2RlX3BhdXNlX3BvcyAhPSAwKSAmJgorCQkoZGVjLT51Y29kZV9wYXVzZV9wb3MgIT0gMHhmZmZmZmZmZikgJiYKKwkJdWRlYnVnX3BhdXNlX3BvcyAhPSBkZWMtPnVjb2RlX3BhdXNlX3BvcykgeworCQlkZWMtPnVjb2RlX3BhdXNlX3BvcyA9IDA7CisJCVdSSVRFX0hSRUcoREVCVUdfUkVHMSwgMCk7CisJfQorCWlmIChkZWJ1ZyAmIEFWUzJfREJHX0RVTVBfREFUQSkgeworCQlkZWJ1ZyAmPSB+QVZTMl9EQkdfRFVNUF9EQVRBOworCQlhdnMyX3ByaW50KGRlYywgMCwKKwkJCSIlczogY2h1bmsgc2l6ZSAweCV4IG9mZiAweCV4IHN1bSAweCV4XG4iLAorCQkJX19mdW5jX18sCisJCQlkZWMtPmNodW5rLT5zaXplLAorCQkJZGVjLT5jaHVuay0+b2Zmc2V0LAorCQkJZ2V0X2RhdGFfY2hlY2tfc3VtKGRlYywgZGVjLT5jaHVuay0+c2l6ZSkKKwkJCSk7CisJCWR1bXBfZGF0YShkZWMsIGRlYy0+Y2h1bmstPnNpemUpOworCX0KKwlpZiAoZGVidWcgJiBBVlMyX0RCR19EVU1QX1BJQ19MSVNUKSB7CisJCWR1bXBfcGljX2xpc3QoZGVjKTsKKwkJZGVidWcgJj0gfkFWUzJfREJHX0RVTVBfUElDX0xJU1Q7CisJfQorCWlmIChkZWJ1ZyAmIEFWUzJfREJHX1RSSUdfU0xJQ0VfU0VHTUVOVF9QUk9DKSB7CisJCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTUJPWDBfSVJRX1JFRywgMHgxKTsKKwkJZGVidWcgJj0gfkFWUzJfREJHX1RSSUdfU0xJQ0VfU0VHTUVOVF9QUk9DOworCX0KKwlpZiAoZGVidWcgJiBBVlMyX0RCR19EVU1QX1JQTV9CVUYpIHsKKwkJaW50IGk7CisKKwkJcHJfaW5mbygiUlBNOlxuIik7CisJCWZvciAoaSA9IDA7IGkgPCBSUE1fQlVGX1NJWkU7IGkgKz0gNCkgeworCQkJaW50IGlpOworCQkJaWYgKChpICYgMHhmKSA9PSAwKQorCQkJCXByX2luZm8oIiUwM3g6ICIsIGkpOworCQkJZm9yIChpaSA9IDA7IGlpIDwgNDsgaWkrKykgeworCQkJCXByX2luZm8oIiUwNHggIiwKKwkJCQkJICAgZGVjLT5sbWVtX3B0cltpICsgMyAtIGlpXSk7CisJCQl9CisJCQlpZiAoKChpICsgaWkpICYgMHhmKSA9PSAwKQorCQkJCXByX2luZm8oIlxuIik7CisJCX0KKwkJZGVidWcgJj0gfkFWUzJfREJHX0RVTVBfUlBNX0JVRjsKKwl9CisJaWYgKGRlYnVnICYgQVZTMl9EQkdfRFVNUF9MTUVNX0JVRikgeworCQlpbnQgaTsKKworCQlwcl9pbmZvKCJMTUVNOlxuIik7CisJCWZvciAoaSA9IDA7IGkgPCBMTUVNX0JVRl9TSVpFOyBpICs9IDQpIHsKKwkJCWludCBpaTsKKwkJCWlmICgoaSAmIDB4ZikgPT0gMCkKKwkJCQlwcl9pbmZvKCIlMDN4OiAiLCBpKTsKKwkJCWZvciAoaWkgPSAwOyBpaSA8IDQ7IGlpKyspIHsKKwkJCQlwcl9pbmZvKCIlMDR4ICIsCisJCQkJCSAgIGRlYy0+bG1lbV9wdHJbaSArIDMgLSBpaV0pOworCQkJfQorCQkJaWYgKCgoaSArIGlpKSAmIDB4ZikgPT0gMCkKKwkJCQlwcl9pbmZvKCJcbiIpOworCQl9CisJCWRlYnVnICY9IH5BVlMyX0RCR19EVU1QX0xNRU1fQlVGOworCX0KKwkvKmlmIChkZWJ1ZyAmIEFWUzJfREJHX0hXX1JFU0VUKSB7CisJfSovCisKKwlpZiAocmFkciAhPSAwKSB7CisJCWlmIChydmFsICE9IDApIHsKKwkJCVdSSVRFX1ZSRUcocmFkciwgcnZhbCk7CisJCQlwcl9pbmZvKCJXUklURV9WUkVHKCV4LCV4KVxuIiwgcmFkciwgcnZhbCk7CisJCX0gZWxzZQorCQkJcHJfaW5mbygiUkVBRF9WUkVHKCV4KT0leFxuIiwgcmFkciwgUkVBRF9WUkVHKHJhZHIpKTsKKwkJcnZhbCA9IDA7CisJCXJhZHIgPSAwOworCX0KKwlpZiAocG9wX3Nob3J0cyAhPSAwKSB7CisJCWludCBpOworCQl1MzIgc3VtID0gMDsKKwkJcHJfaW5mbygicG9wIHN0cmVhbSAweCV4IHNob3J0c1xyXG4iLCBwb3Bfc2hvcnRzKTsKKwkJZm9yIChpID0gMDsgaSA8IHBvcF9zaG9ydHM7IGkrKykgeworCQkJdTMyIGRhdGEgPQorCQkJKFJFQURfSFJFRyhIRVZDX1NISUZURURfREFUQSkgPj4gMTYpOworCQkJV1JJVEVfSFJFRyhIRVZDX1NISUZUX0NPTU1BTkQsCisJCQkoMTw8Nyl8MTYpOworCQkJaWYgKChpICYgMHhmKSA9PSAwKQorCQkJCXByX2luZm8oIiUwNHg6IiwgaSk7CisJCQlwcl9pbmZvKCIlMDR4ICIsIGRhdGEpOworCQkJaWYgKCgoaSArIDEpICYgMHhmKSA9PSAwKQorCQkJCXByX2luZm8oIlxyXG4iKTsKKwkJCXN1bSArPSBkYXRhOworCQl9CisJCXByX2luZm8oIlxyXG5zdW0gPSAleFxyXG4iLCBzdW0pOworCQlwb3Bfc2hvcnRzID0gMDsKKwl9CisJaWYgKGRiZ19jbWQgIT0gMCkgeworCQlpZiAoZGJnX2NtZCA9PSAxKSB7CisJCQl1MzIgZGlzcF9sYWRkcjsKKwkJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYQkIgJiYKKwkJCQlnZXRfZG91YmxlX3dyaXRlX21vZGUoZGVjKSA9PSAwKSB7CisJCQkJZGlzcF9sYWRkciA9CisJCQkJCVJFQURfVkNCVVNfUkVHKEFGQkNfQk9EWV9CQUREUikgPDwgNDsKKwkJCX0gZWxzZSB7CisJCQkJc3RydWN0IGNhbnZhc19zIGN1cl9jYW52YXM7CisJCQkJY2FudmFzX3JlYWQoKFJFQURfVkNCVVNfUkVHKFZEMV9JRjBfQ0FOVkFTMCkKKwkJCQkJJiAweGZmKSwgJmN1cl9jYW52YXMpOworCQkJCWRpc3BfbGFkZHIgPSBjdXJfY2FudmFzLmFkZHI7CisJCQl9CisJCQlwcl9pbmZvKCJjdXJyZW50IGRpc3BsYXllZCBidWZmZXIgYWRkcmVzcyAleFxyXG4iLAorCQkJCWRpc3BfbGFkZHIpOworCQl9CisJCWRiZ19jbWQgPSAwOworCX0KKwkvKmRvbid0IGNoYW5nZWQgYXQgc3RhcnQuKi8KKwlpZiAoZGVjLT5nZXRfZnJhbWVfZHVyICYmIGRlYy0+c2hvd19mcmFtZV9udW0gPiA2MCAmJgorCQlkZWMtPmZyYW1lX2R1ciA+IDAgJiYgZGVjLT5zYXZlZF9yZXNvbHV0aW9uICE9CisJCWZyYW1lX3dpZHRoICogZnJhbWVfaGVpZ2h0ICoKKwkJCSg5NjAwMCAvIGRlYy0+ZnJhbWVfZHVyKSkgeworCQlpbnQgZnBzID0gOTYwMDAgLyBkZWMtPmZyYW1lX2R1cjsKKwkJaWYgKGhldmNfc291cmNlX2NoYW5nZWQoVkZPUk1BVF9BVlMyLAorCQkJZnJhbWVfd2lkdGgsIGZyYW1lX2hlaWdodCwgZnBzKSA+IDApCisJCQlkZWMtPnNhdmVkX3Jlc29sdXRpb24gPSBmcmFtZV93aWR0aCAqCisJCQlmcmFtZV9oZWlnaHQgKiBmcHM7CisJfQorCisJdGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgUFVUX0lOVEVSVkFMOworCWFkZF90aW1lcih0aW1lcik7Cit9CisKKworaW50IHZhdnMyX2RlY19zdGF0dXMoc3RydWN0IHZkZWNfcyAqdmRlYywgc3RydWN0IHZkZWNfaW5mbyAqdnN0YXR1cykKK3sKKwlzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjID0KKwkJKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICopdmRlYy0+cHJpdmF0ZTsKKworCWlmICghZGVjKQorCQlyZXR1cm4gLTE7CisKKwl2c3RhdHVzLT5mcmFtZV93aWR0aCA9IGRlYy0+ZnJhbWVfd2lkdGg7CisJdnN0YXR1cy0+ZnJhbWVfaGVpZ2h0ID0gZGVjLT5mcmFtZV9oZWlnaHQ7CisKKwlpZiAoZGVjLT5mcmFtZV9kdXIgIT0gMCkKKwkJdnN0YXR1cy0+ZnJhbWVfcmF0ZSA9ICgoOTYwMDAgKiAxMCAvIGRlYy0+ZnJhbWVfZHVyKSAlIDEwKSA8IDUgPworCQkgICAgICAgICAgICAgICAgICAgIDk2MDAwIC8gZGVjLT5mcmFtZV9kdXIgOiAoOTYwMDAgLyBkZWMtPmZyYW1lX2R1ciArMSk7CisJZWxzZQorCQl2c3RhdHVzLT5mcmFtZV9yYXRlID0gLTE7CisJdnN0YXR1cy0+ZXJyb3JfY291bnQgPSAwOworCXZzdGF0dXMtPnN0YXR1cyA9IGRlYy0+c3RhdCB8IGRlYy0+ZmF0YWxfZXJyb3I7CisJdnN0YXR1cy0+ZnJhbWVfZHVyID0gZGVjLT5mcmFtZV9kdXI7CisJdnN0YXR1cy0+Yml0X3JhdGUgPSBkZWMtPmd2cy0+Yml0X3JhdGU7CisJdnN0YXR1cy0+ZnJhbWVfZGF0YSA9IGRlYy0+Z3ZzLT5mcmFtZV9kYXRhOworCXZzdGF0dXMtPnRvdGFsX2RhdGEgPSBkZWMtPmd2cy0+dG90YWxfZGF0YTsKKwl2c3RhdHVzLT5mcmFtZV9jb3VudCA9IGRlYy0+Z3ZzLT5mcmFtZV9jb3VudDsKKwl2c3RhdHVzLT5lcnJvcl9mcmFtZV9jb3VudCA9IGRlYy0+Z3ZzLT5lcnJvcl9mcmFtZV9jb3VudDsKKwl2c3RhdHVzLT5kcm9wX2ZyYW1lX2NvdW50ID0gZGVjLT5ndnMtPmRyb3BfZnJhbWVfY291bnQ7CisJdnN0YXR1cy0+aV9kZWNvZGVkX2ZyYW1lcyA9IGRlYy0+Z3ZzLT5pX2RlY29kZWRfZnJhbWVzOworCXZzdGF0dXMtPmlfbG9zdF9mcmFtZXMgPSAgZGVjLT5ndnMtPmlfbG9zdF9mcmFtZXM7CisJdnN0YXR1cy0+aV9jb25jZWFsZWRfZnJhbWVzID0gIGRlYy0+Z3ZzLT5pX2NvbmNlYWxlZF9mcmFtZXM7CisJdnN0YXR1cy0+cF9kZWNvZGVkX2ZyYW1lcyA9ICBkZWMtPmd2cy0+cF9kZWNvZGVkX2ZyYW1lczsKKwl2c3RhdHVzLT5wX2xvc3RfZnJhbWVzID0gIGRlYy0+Z3ZzLT5wX2xvc3RfZnJhbWVzOworCXZzdGF0dXMtPnBfY29uY2VhbGVkX2ZyYW1lcyA9ICBkZWMtPmd2cy0+cF9jb25jZWFsZWRfZnJhbWVzOworCXZzdGF0dXMtPmJfZGVjb2RlZF9mcmFtZXMgPSAgZGVjLT5ndnMtPmJfZGVjb2RlZF9mcmFtZXM7CisJdnN0YXR1cy0+Yl9sb3N0X2ZyYW1lcyA9ICBkZWMtPmd2cy0+Yl9sb3N0X2ZyYW1lczsKKwl2c3RhdHVzLT5iX2NvbmNlYWxlZF9mcmFtZXMgPSAgZGVjLT5ndnMtPmJfY29uY2VhbGVkX2ZyYW1lczsKKwl2c3RhdHVzLT50b3RhbF9kYXRhID0gZGVjLT5ndnMtPnRvdGFsX2RhdGE7CisJdnN0YXR1cy0+c2FtcF9jbnQgPSBkZWMtPmd2cy0+c2FtcF9jbnQ7CisJdnN0YXR1cy0+b2Zmc2V0ID0gZGVjLT5ndnMtPm9mZnNldDsKKwlzbnByaW50Zih2c3RhdHVzLT52ZGVjX25hbWUsIHNpemVvZih2c3RhdHVzLT52ZGVjX25hbWUpLAorCQkiJXMiLCBEUklWRVJfTkFNRSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCB2YXZzMl9zZXRfaXNyZXNldChzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgaXNyZXNldCkKK3sKKwlpc19yZXNldCA9IGlzcmVzZXQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZhdnMyX3Byb3RfaW5pdChzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCXVuc2lnbmVkIGludCBkYXRhMzI7CisKKwlhdnMyX2NvbmZpZ193b3JrX3NwYWNlX2h3KGRlYyk7CisJaWYgKGRlYy0+cGljX2xpc3RfaW5pdF9mbGFnKQorCQlpbml0X3BpY19saXN0X2h3KGRlYyk7CisKKwlhdnMyX2luaXRfZGVjb2Rlcl9odyhkZWMpOworCisjaWYgMQorCWF2czJfcHJpbnQoZGVjLCBBVlMyX0RCR19CVUZNR1JfTU9SRSwKKwkJIiVzXG4iLCBfX2Z1bmNfXyk7CisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0NPTlRST0wpOworCWRhdGEzMiA9IGRhdGEzMiB8CisJCSgxIDw8IDApLypzdHJlYW1fZmV0Y2hfZW5hYmxlKi8KKwkJOworCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fQ09OVFJPTCwgZGF0YTMyKTsKKyNpZiAwCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0hJRlRfU1RBUlRDT0RFKTsKKwlpZiAoZGF0YTMyICE9IDB4MDAwMDAxMDApIHsKKwkJcHJfaW5mbygiYXZzMiBwcm90IGluaXQgZXJyb3IgJWRcbiIsIF9fTElORV9fKTsKKwkJcmV0dXJuOworCX0KKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9FTVVMQVRFQ09ERSk7CisJaWYgKGRhdGEzMiAhPSAweDAwMDAwMzAwKSB7CisJCXByX2luZm8oImF2czIgcHJvdCBpbml0IGVycm9yICVkXG4iLCBfX0xJTkVfXyk7CisJCXJldHVybjsKKwl9CisJV1JJVEVfVlJFRyhIRVZDX1NISUZUX1NUQVJUQ09ERSwgMHgxMjM0NTY3OCk7CisJV1JJVEVfVlJFRyhIRVZDX1NISUZUX0VNVUxBVEVDT0RFLCAweDlhYmNkZWYwKTsKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9TVEFSVENPREUpOworCWlmIChkYXRhMzIgIT0gMHgxMjM0NTY3OCkgeworCQlwcl9pbmZvKCJhdnMyIHByb3QgaW5pdCBlcnJvciAlZFxuIiwgX19MSU5FX18pOworCQlyZXR1cm47CisJfQorCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NISUZUX0VNVUxBVEVDT0RFKTsKKwlpZiAoZGF0YTMyICE9IDB4OWFiY2RlZjApIHsKKwkJcHJfaW5mbygiYXZzMiBwcm90IGluaXQgZXJyb3IgJWRcbiIsIF9fTElORV9fKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9TVEFSVENPREUsIDB4MDAwMDAxMDApOworCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9FTVVMQVRFQ09ERSwgMHgwMDAwMDAwMCk7CisjZW5kaWYKKworCisKKwlXUklURV9WUkVHKEhFVkNfV0FJVF9GTEFHLCAxKTsKKworCS8qIFdSSVRFX1ZSRUcoSEVWQ19NUFNSLCAxKTsgKi8KKworCS8qIGNsZWFyIG1haWxib3ggaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9NQk9YMF9DTFJfUkVHLCAxKTsKKworCS8qIGVuYWJsZSBtYWlsYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTUJPWDBfTUFTSywgMSk7CisKKwkvKiBkaXNhYmxlIFBTQ0FMRSBmb3IgaGFyZHdhcmUgc2hhcmluZyAqLworCVdSSVRFX1ZSRUcoSEVWQ19QU0NBTEVfQ1RSTCwgMCk7CisKKwlXUklURV9WUkVHKERFQlVHX1JFRzEsIDB4MCk7CisJLypjaGVjayB2cHMvc3BzL3Bwcy9pLXNsaWNlIGluIHVjb2RlKi8KKwlXUklURV9WUkVHKE5BTF9TRUFSQ0hfQ1RMLCAweDgpOworCisJV1JJVEVfVlJFRyhERUNPREVfU1RPUF9QT1MsIHVkZWJ1Z19mbGFnKTsKKworCWNvbmZpZ19jdXZhX2J1ZihkZWMpOworfQorCisjaWZkZWYgSV9PTkxZX1NVUFBPUlQKK3N0YXRpYyBpbnQgdmF2czJfc2V0X3RyaWNrbW9kZShzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1bnNpZ25lZCBsb25nIHRyaWNrbW9kZSkKK3sKKwlzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjID0KKwkJKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICopdmRlYy0+cHJpdmF0ZTsKKwlpZiAoaV9vbmx5X2ZsYWcgJiAweDEwMCkKKwkJcmV0dXJuIDA7CisJaWYgKHRyaWNrbW9kZSA9PSBUUklDS01PREVfSSB8fCB0cmlja21vZGUgPT0gVFJJQ0tNT0RFX0lfSEVWQykKKwkJZGVjLT5pX29ubHkgPSAweDM7CisJZWxzZSBpZiAodHJpY2ttb2RlID09IFRSSUNLTU9ERV9OT05FKQorCQlkZWMtPmlfb25seSA9IDB4MDsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHZhdnMyX2xvY2FsX2luaXQoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYykKK3sKKwlpbnQgaTsKKwlpbnQgcmV0OworCWludCB3aWR0aCwgaGVpZ2h0OworCisJZGVjLT5ndnMgPSB2emFsbG9jKHNpemVvZihzdHJ1Y3QgdmRlY19pbmZvKSk7CisJaWYgKE5VTEwgPT0gZGVjLT5ndnMpIHsKKwkJYXZzMl9wcmludChkZWMsIDAsCisJCQkidGhlIHN0cnVjdCBvZiB2ZGVjIHN0YXR1cyBtYWxsb2MgZmFpbGVkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisjaWZkZWYgREVCVUdfUFRTCisJZGVjLT5wdHNfbWlzc2VkID0gMDsKKwlkZWMtPnB0c19oaXQgPSAwOworI2VuZGlmCisJZGVjLT5uZXdfZnJhbWVfZGlzcGxheWVkID0gMDsKKwlkZWMtPmxhc3RfcHV0X2lkeCA9IC0xOworCWRlYy0+c2F2ZWRfcmVzb2x1dGlvbiA9IDA7CisJZGVjLT5nZXRfZnJhbWVfZHVyID0gZmFsc2U7CisJb25fbm9fa2V5ZnJhbWVfc2tpcGVkID0gMDsKKwl3aWR0aCA9IGRlYy0+dmF2czJfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGg7CisJaGVpZ2h0ID0gZGVjLT52YXZzMl9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQ7CisJZGVjLT5mcmFtZV9kdXIgPQorCQkoZGVjLT52YXZzMl9hbXN0cmVhbV9kZWNfaW5mby5yYXRlID09CisJCSAwKSA/IDM2MDAgOiBkZWMtPnZhdnMyX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGU7CisJaWYgKHdpZHRoICYmIGhlaWdodCkKKwkJZGVjLT5mcmFtZV9hciA9IGhlaWdodCAqIDB4MTAwIC8gd2lkdGg7CisvKgorVE9ETzpGT1IgVkVSU0lPTgorKi8KKwlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSLAorCQkiYXZzMjogdmVyICglZCwlZCkgZGVjaW5mbzogJWR4JWQgcmF0ZT0lZFxuIiwgYXZzMl92ZXJzaW9uLAorCQkgICAwLCB3aWR0aCwgaGVpZ2h0LCBkZWMtPmZyYW1lX2R1cik7CisKKwlpZiAoZGVjLT5mcmFtZV9kdXIgPT0gMCkKKwkJZGVjLT5mcmFtZV9kdXIgPSA5NjAwMCAvIDI0OworI2lmZGVmIElfT05MWV9TVVBQT1JUCisJaWYgKGlfb25seV9mbGFnICYgMHgxMDApCisJCWRlYy0+aV9vbmx5ID0gaV9vbmx5X2ZsYWcgJiAweGZmOworCWVsc2UgaWYgKCh1bnNpZ25lZCBsb25nKSBkZWMtPnZhdnMyX2Ftc3RyZWFtX2RlY19pbmZvLnBhcmFtCisJCSYgMHgwOCkKKwkJZGVjLT5pX29ubHkgPSAweDc7CisJZWxzZQorCQlkZWMtPmlfb25seSA9IDB4MDsKKyNlbmRpZgorCUlOSVRfS0ZJRk8oZGVjLT5kaXNwbGF5X3EpOworCUlOSVRfS0ZJRk8oZGVjLT5uZXdmcmFtZV9xKTsKKworCisJZm9yIChpID0gMDsgaSA8IFZGX1BPT0xfU0laRTsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqdmYgPSAmZGVjLT52ZnBvb2xbaV07CisJCWRlYy0+dmZwb29sW2ldLmluZGV4ID0gLTE7CisJCWtmaWZvX3B1dCgmZGVjLT5uZXdmcmFtZV9xLCB2Zik7CisJfQorCisKKwlyZXQgPSBhdnMyX2xvY2FsX2luaXQoZGVjKTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHMzMiB2YXZzMl9pbml0KHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJaW50IHJldCA9IC0xLCBzaXplID0gLTE7CisJaW50IGZ3X3NpemUgPSAweDEwMDAgKiAxNjsKKwlzdHJ1Y3QgZmlybXdhcmVfcyAqZncgPSBOVUxMOworCXN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMgPSAoc3RydWN0IEFWUzJEZWNvZGVyX3MgKil2ZGVjLT5wcml2YXRlOworCisJdGltZXJfc2V0dXAoJmRlYy0+dGltZXIsIHZhdnMyX3B1dF90aW1lcl9mdW5jLCAwKTsKKworCWRlYy0+c3RhdCB8PSBTVEFUX1RJTUVSX0lOSVQ7CisJaWYgKHZhdnMyX2xvY2FsX2luaXQoZGVjKSA8IDApCisJCXJldHVybiAtRUJVU1k7CisKKwl2ZGVjX3NldF92ZnJhbWVfY29tbSh2ZGVjLCBEUklWRVJfTkFNRSk7CisKKwlmdyA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBmaXJtd2FyZV9zKSArIGZ3X3NpemUpOworCWlmIChJU19FUlJfT1JfTlVMTChmdykpCisJCXJldHVybiAtRU5PTUVNOworCisJc2l6ZSA9IGdldF9maXJtd2FyZV9kYXRhKFZJREVPX0RFQ19BVlMyX01NVSwgZnctPmRhdGEpOworCWlmIChzaXplIDwgMCkgeworCQlwcl9lcnIoImdldCBmaXJtd2FyZSBmYWlsLlxuIik7CisJCXZmcmVlKGZ3KTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZ3LT5sZW4gPSBmd19zaXplOworCisJaWYgKGRlYy0+bV9pbnNfZmxhZykgeworCQlkZWMtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgUFVUX0lOVEVSVkFMOworCisJCS8qYWRkX3RpbWVyKCZkZWMtPnRpbWVyKTsKKworCQlkZWMtPnN0YXQgfD0gU1RBVF9USU1FUl9BUk07CisJCWRlYy0+c3RhdCB8PSBTVEFUX0lTUl9SRUc7Ki8KKworCQlJTklUX1dPUksoJmRlYy0+d29yaywgYXZzMl93b3JrKTsKKwkJZGVjLT5mdyA9IGZ3OworCisJCXJldHVybiAwOworCX0KKworCWFtaGV2Y19lbmFibGUoKTsKKworCXJldCA9IGFtaGV2Y19sb2FkbWNfZXgoVkZPUk1BVF9BVlMyLCBOVUxMLCBmdy0+ZGF0YSk7CisJaWYgKHJldCA8IDApIHsKKwkJYW1oZXZjX2Rpc2FibGUoKTsKKwkJdmZyZWUoZncpOworCQlwcl9lcnIoIkFWUzI6IHRoZSAlcyBmdyBsb2FkaW5nIGZhaWxlZCwgZXJyOiAleFxuIiwKKwkJCXRlZV9lbmFibGVkKCkgPyAiVEVFIiA6ICJsb2NhbCIsIHJldCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJdmZyZWUoZncpOworCisJZGVjLT5zdGF0IHw9IFNUQVRfTUNfTE9BRDsKKworCS8qIGVuYWJsZSBBTVJJU0Mgc2lkZSBwcm90b2NvbCAqLworCXZhdnMyX3Byb3RfaW5pdChkZWMpOworCisJaWYgKHZkZWNfcmVxdWVzdF90aHJlYWRlZF9pcnEoVkRFQ19JUlFfMCwKKwkJCQl2YXZzMl9pc3IsCisJCQkJdmF2czJfaXNyX3RocmVhZF9mbiwKKwkJCQlJUlFGX09ORVNIT1QsLypydW4gdGhyZWFkIG9uIHRoaXMgaXJxIGRpc2FibGVkKi8KKwkJCQkidmF2czItaXJxIiwgKHZvaWQgKilkZWMpKSB7CisJCXByX2luZm8oInZhdnMyIGlycSByZWdpc3RlciBlcnJvci5cbiIpOworCQlhbWhldmNfZGlzYWJsZSgpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlkZWMtPnN0YXQgfD0gU1RBVF9JU1JfUkVHOworCisJZGVjLT5wcm92aWRlcl9uYW1lID0gUFJPVklERVJfTkFNRTsKKwl2Zl9wcm92aWRlcl9pbml0KCZ2YXZzMl92Zl9wcm92LCBQUk9WSURFUl9OQU1FLAorCQkJCSZ2YXZzMl92Zl9wcm92aWRlciwgZGVjKTsKKwl2Zl9yZWdfcHJvdmlkZXIoJnZhdnMyX3ZmX3Byb3YpOworCXZmX25vdGlmeV9yZWNlaXZlcihQUk9WSURFUl9OQU1FLCBWRlJBTUVfRVZFTlRfUFJPVklERVJfU1RBUlQsIE5VTEwpOworCWlmIChkZWMtPmZyYW1lX2R1ciAhPSAwKSB7CisJCWlmICghaXNfcmVzZXQpCisJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoZGVjLT5wcm92aWRlcl9uYW1lLAorCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfRlJfSElOVCwKKwkJCQkJKHZvaWQgKikKKwkJCQkJKCh1bnNpZ25lZCBsb25nKWRlYy0+ZnJhbWVfZHVyKSk7CisJfQorCWRlYy0+c3RhdCB8PSBTVEFUX1ZGX0hPT0s7CisKKwlkZWMtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgUFVUX0lOVEVSVkFMOworCWFkZF90aW1lcigmZGVjLT50aW1lcik7CisKKwlkZWMtPnN0YXQgfD0gU1RBVF9USU1FUl9BUk07CisKKwkvKiBkZWMtPnN0YXQgfD0gU1RBVF9LVEhSRUFEOyAqLworCWRlYy0+cHJvY2Vzc19idXN5ID0gMDsKKwlhdnMyX3ByaW50KGRlYywgQVZTMl9EQkdfQlVGTUdSX01PUkUsCisJCSIlZCwgdmF2czJfaW5pdCwgUlA9MHgleFxuIiwKKwkJX19MSU5FX18sIFJFQURfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bWF2czJfc3RvcChzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqZGVjKQoreworCWRlYy0+aW5pdF9mbGFnID0gMDsKKwlkZWMtPmZpcnN0X3NjX2NoZWNrZWQgPSAwOworCWlmIChkZWMtPnN0YXQgJiBTVEFUX1RJTUVSX0FSTSkgeworCQlkZWxfdGltZXJfc3luYygmZGVjLT50aW1lcik7CisJCWRlYy0+c3RhdCAmPSB+U1RBVF9USU1FUl9BUk07CisJfQorCisJaWYgKGRlYy0+c3RhdCAmIFNUQVRfVkZfSE9PSykgeworCQlpZiAoIWlzX3Jlc2V0KQorCQkJdmZfbm90aWZ5X3JlY2VpdmVyKGRlYy0+cHJvdmlkZXJfbmFtZSwKKwkJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX0ZSX0VORF9ISU5ULAorCQkJCQlOVUxMKTsKKworCQl2Zl91bnJlZ19wcm92aWRlcigmdmF2czJfdmZfcHJvdik7CisJCWRlYy0+c3RhdCAmPSB+U1RBVF9WRl9IT09LOworCX0KKwlhdnMyX2xvY2FsX3VuaW5pdChkZWMpOworCXJlc2V0X3Byb2Nlc3NfdGltZShkZWMpOworCWNhbmNlbF93b3JrX3N5bmMoJmRlYy0+d29yayk7CisJdW5pbml0X21tdV9idWZmZXJzKGRlYyk7CisJaWYgKGRlYy0+ZncpIHsKKwkJdmZyZWUoZGVjLT5mdyk7CisJCWRlYy0+ZncgPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtdmRlY19hdnMyX21tdV9pbml0KHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMpCit7CisJaW50IHR2cF9mbGFnID0gdmRlY19zZWN1cmUoaHdfdG9fdmRlYyhkZWMpKSA/CisJCUNPREVDX01NX0ZMQUdTX1RWUCA6IDA7CisJaW50IGJ1Zl9zaXplID0gNDg7CisKKyNpZmRlZiBBVlMyXzEwQl9NTVUKKwlkZWMtPm5lZWRfY2FjaGVfc2l6ZSA9IGJ1Zl9zaXplICogU1pfMU07CisJZGVjLT5zY19zdGFydF90aW1lID0gZ2V0X2ppZmZpZXNfNjQoKTsKKwlkZWMtPm1tdV9ib3ggPSBkZWNvZGVyX21tdV9ib3hfYWxsb2NfYm94KERSSVZFUl9OQU1FLAorCQlkZWMtPmluZGV4LCBGUkFNRV9CVUZGRVJTLAorCQlkZWMtPm5lZWRfY2FjaGVfc2l6ZSwKKwkJdHZwX2ZsYWcKKwkJKTsKKwlpZiAoIWRlYy0+bW11X2JveCkgeworCQlwcl9lcnIoImF2czIgYWxsb2MgbW11IGJveCBmYWlsZWQhIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisjZW5kaWYKKwlkZWMtPmJtbXVfYm94ID0gZGVjb2Rlcl9ibW11X2JveF9hbGxvY19ib3goCisJCQlEUklWRVJfTkFNRSwKKwkJCWRlYy0+aW5kZXgsCisJCQlNQVhfQk1NVV9CVUZGRVJfTlVNLAorCQkJNCArIFBBR0VfU0hJRlQsCisJCQlDT0RFQ19NTV9GTEFHU19DTUFfQ0xFQVIgfAorCQkJQ09ERUNfTU1fRkxBR1NfRk9SX1ZERUNPREVSIHwKKwkJCXR2cF9mbGFnKTsKKwlpZiAoIWRlYy0+Ym1tdV9ib3gpIHsKKwkJcHJfZXJyKCJhdnMyIGFsbG9jIGJtbXUgYm94IGZhaWxlZCEhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IGNvZGVjX3Byb2ZpbGVfdCBhbXZkZWNfYXZzMl9wcm9maWxlID0geworCS5uYW1lID0gIkFWUzItVjRMIiwKKwkucHJvZmlsZSA9ICIiCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBnZXRfZGF0YV9jaGVja19zdW0KKwkoc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYywgaW50IHNpemUpCit7CisJaW50IGpqOworCWludCBzdW0gPSAwOworCXU4ICpkYXRhID0gTlVMTDsKKworCWlmICghZGVjLT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJZGF0YSA9IGNvZGVjX21tX3ZtYXAoZGVjLT5jaHVuay0+YmxvY2stPnN0YXJ0ICsKKwkJCWRlYy0+Y2h1bmstPm9mZnNldCwgc2l6ZSk7CisJZWxzZQorCQlkYXRhID0gKCh1OCAqKWRlYy0+Y2h1bmstPmJsb2NrLT5zdGFydF92aXJ0KSArCisJCQlkZWMtPmNodW5rLT5vZmZzZXQ7CisKKwlmb3IgKGpqID0gMDsgamogPCBzaXplOyBqaisrKQorCQlzdW0gKz0gZGF0YVtqal07CisKKwlpZiAoIWRlYy0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIoZGF0YSk7CisJcmV0dXJuIHN1bTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9kYXRhKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMsIGludCBzaXplKQoreworCWludCBqajsKKwl1OCAqZGF0YSA9IE5VTEw7CisJaW50IHBhZGRpbmdfc2l6ZSA9IGRlYy0+Y2h1bmstPm9mZnNldCAmCisJCShWREVDX0ZJRk9fQUxJR04gLSAxKTsKKworCWlmICghZGVjLT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJZGF0YSA9IGNvZGVjX21tX3ZtYXAoZGVjLT5jaHVuay0+YmxvY2stPnN0YXJ0ICsKKwkJCWRlYy0+Y2h1bmstPm9mZnNldCwgc2l6ZSk7CisJZWxzZQorCQlkYXRhID0gKCh1OCAqKWRlYy0+Y2h1bmstPmJsb2NrLT5zdGFydF92aXJ0KSArCisJCQlkZWMtPmNodW5rLT5vZmZzZXQ7CisKKwlhdnMyX3ByaW50KGRlYywgMCwgInBhZGRpbmc6ICIpOworCWZvciAoamogPSBwYWRkaW5nX3NpemU7IGpqID4gMDsgamotLSkKKwkJYXZzMl9wcmludF9jb250KGRlYywKKwkJCTAsCisJCQkiJTAyeCAiLCAqKGRhdGEgLSBqaikpOworCWF2czJfcHJpbnRfY29udChkZWMsIDAsICJkYXRhIGFkciAlcFxuIiwKKwkJZGF0YSk7CisKKwlmb3IgKGpqID0gMDsgamogPCBzaXplOyBqaisrKSB7CisJCWlmICgoamogJiAweGYpID09IDApCisJCQlhdnMyX3ByaW50KGRlYywKKwkJCQkwLAorCQkJCSIlMDZ4OiIsIGpqKTsKKwkJYXZzMl9wcmludF9jb250KGRlYywKKwkJCTAsCisJCQkiJTAyeCAiLCBkYXRhW2pqXSk7CisJCWlmICgoKGpqICsgMSkgJiAweGYpID09IDApCisJCQlhdnMyX3ByaW50KGRlYywKKwkJCSAwLAorCQkJCSJcbiIpOworCX0KKwlhdnMyX3ByaW50KGRlYywKKwkgMCwKKwkJIlxuIik7CisKKwlpZiAoIWRlYy0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIoZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGF2czJfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYyA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQlzdHJ1Y3QgQVZTMkRlY29kZXJfcywgd29yayk7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoZGVjKTsKKwkvKiBmaW5pc2hlZCBkZWNvZGluZyBvbmUgZnJhbWUgb3IgZXJyb3IsCisJICogbm90aWZ5IHZkZWMgY29yZSB0byBzd2l0Y2ggY29udGV4dAorCSAqLworCWF2czJfcHJpbnQoZGVjLCBQUklOVF9GTEFHX1ZERUNfREVUQUlMLAorCQkiJXMgZGVjX3Jlc3VsdCAlZCAleCAleCAleFxuIiwKKwkJX19mdW5jX18sCisJCWRlYy0+ZGVjX3Jlc3VsdCwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0xFVkVMKSwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1dSX1BUUiksCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIpKTsKKworCWlmICgoKGRlYy0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0dFVF9EQVRBKSB8fAorCQkoZGVjLT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfR0VUX0RBVEFfUkVUUlkpKQorCQkmJiAoaHdfdG9fdmRlYyhkZWMpLT5uZXh0X3N0YXR1cyAhPQorCQlWREVDX1NUQVRVU19ESVNDT05ORUNURUQpKSB7CisJCWlmICghdmRlY19oYXNfbW9yZV9pbnB1dCh2ZGVjKSkgeworCQkJZGVjLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9FT1M7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmRlYy0+d29yayk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoZGVjLT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfR0VUX0RBVEEpIHsKKwkJCWF2czJfcHJpbnQoZGVjLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJCSIlcyBERUNfUkVTVUxUX0dFVF9EQVRBICV4ICV4ICV4XG4iLAorCQkJCV9fZnVuY19fLAorCQkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9MRVZFTCksCisJCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1dSX1BUUiksCisJCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1JEX1BUUikpOworCQkJdmRlY192ZnJhbWVfZGlydHkodmRlYywgZGVjLT5jaHVuayk7CisJCQl2ZGVjX2NsZWFuX2lucHV0KHZkZWMpOworCQl9CisKKwkJaWYgKGdldF9mcmVlX2J1Zl9jb3VudChkZWMpID49CisJCQlydW5fcmVhZHlfbWluX2J1Zl9udW0pIHsKKwkJCWludCByOworCQkJaW50IGRlY29kZV9zaXplOworCQkJciA9IHZkZWNfcHJlcGFyZV9pbnB1dCh2ZGVjLCAmZGVjLT5jaHVuayk7CisJCQlpZiAociA8IDApIHsKKwkJCQlkZWMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0dFVF9EQVRBX1JFVFJZOworCisJCQkJYXZzMl9wcmludChkZWMsCisJCQkJCVBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsCisJCQkJCSJhbXZkZWNfdmgyNjU6IEluc3VmZmljaWVudCBkYXRhXG4iKTsKKworCQkJCXZkZWNfc2NoZWR1bGVfd29yaygmZGVjLT53b3JrKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlkZWMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX05PTkU7CisJCQlhdnMyX3ByaW50KGRlYywgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCQkiJXM6IGNodW5rIHNpemUgMHgleCBzdW0gMHgleFxuIiwKKwkJCQlfX2Z1bmNfXywgciwKKwkJCQkoZGVidWcgJiBQUklOVF9GTEFHX1ZERUNfU1RBVFVTKSA/CisJCQkJZ2V0X2RhdGFfY2hlY2tfc3VtKGRlYywgcikgOiAwCisJCQkJKTsKKwkJCWlmIChkZWJ1ZyAmIFBSSU5UX0ZMQUdfVkRFQ19EQVRBKQorCQkJCWR1bXBfZGF0YShkZWMsIGRlYy0+Y2h1bmstPnNpemUpOworCisJCQlkZWNvZGVfc2l6ZSA9IGRlYy0+Y2h1bmstPnNpemUgKworCQkJCShkZWMtPmNodW5rLT5vZmZzZXQgJiAoVkRFQ19GSUZPX0FMSUdOIC0gMSkpOworCisJCQlXUklURV9WUkVHKEhFVkNfREVDT0RFX1NJWkUsCisJCQkJUkVBRF9WUkVHKEhFVkNfREVDT0RFX1NJWkUpICsgZGVjb2RlX3NpemUpOworCisJCQl2ZGVjX2VuYWJsZV9pbnB1dCh2ZGVjKTsKKworCQkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCBBVlMyX0FDVElPTl9ET05FKTsKKworCQkJc3RhcnRfcHJvY2Vzc190aW1lKGRlYyk7CisKKwkJfSBlbHNleworCQkJZGVjLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9HRVRfREFUQV9SRVRSWTsKKworCQkJYXZzMl9wcmludChkZWMsIFBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsCisJCQkJImFtdmRlY192aDI2NTogSW5zdWZmaWNpZW50IGRhdGFcbiIpOworCisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmRlYy0+d29yayk7CisJCX0KKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoZGVjLT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfRE9ORSkgeworCQkvKiBpZiAoIWRlYy0+Y3R4X3ZhbGlkKQorCQkJZGVjLT5jdHhfdmFsaWQgPSAxOyAqLworCQlkZWMtPnNsaWNlX2lkeCsrOworCQlkZWMtPmZyYW1lX2NvdW50Kys7CisJCWRlYy0+cHJvY2Vzc19zdGF0ZSA9IFBST0NfU1RBVEVfSU5JVDsKKwkJZGVjb2RlX2ZyYW1lX2NvdW50W2RlYy0+aW5kZXhdID0gZGVjLT5mcmFtZV9jb3VudDsKKworI2lmZGVmIEFWUzJfMTBCX01NVQorCQlkZWMtPnVzZWRfNGtfbnVtID0KKwkJCShSRUFEX1ZSRUcoSEVWQ19TQU9fTU1VX1NUQVRVUykgPj4gMTYpOworI2VuZGlmCisJCWF2czJfcHJpbnQoZGVjLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJIiVzICg9PT0+ICVkKSBkZWNfcmVzdWx0ICVkICV4ICV4ICV4IHNoaWZ0Ynl0ZXMgMHgleCBkZWNieXRlcyAweCV4XG4iLAorCQkJX19mdW5jX18sCisJCQlkZWMtPmZyYW1lX2NvdW50LAorCQkJZGVjLT5kZWNfcmVzdWx0LAorCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0xFVkVMKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9XUl9QVFIpLAorCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1JEX1BUUiksCisJCQlSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpIC0KKwkJCWRlYy0+c3RhcnRfc2hpZnRfYnl0ZXMKKwkJCSk7CisJCXZkZWNfdmZyYW1lX2RpcnR5KGh3X3RvX3ZkZWMoZGVjKSwgZGVjLT5jaHVuayk7CisJfSBlbHNlIGlmIChkZWMtPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9BR0FJTikgeworCQkvKgorCQkJc3RyZWFtIGJhc2U6IHN0cmVhbSBidWYgZW1wdHkgb3IgdGltZW91dAorCQkJZnJhbWUgYmFzZTogdmRlY19wcmVwYXJlX2lucHV0IGZhaWwKKwkJKi8KKwkJaWYgKCF2ZGVjX2hhc19tb3JlX2lucHV0KHZkZWMpKSB7CisJCQlkZWMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0VPUzsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmZGVjLT53b3JrKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSBpZiAoZGVjLT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfRU9TKSB7CisJCWF2czJfcHJpbnQoZGVjLCAwLAorCQkJIiVzOiBlbmQgb2Ygc3RyZWFtXG4iLAorCQkJX19mdW5jX18pOworCQlkZWMtPmVvcyA9IDE7CisJCWlmICggZGVjLT5hdnMyX2RlYy5oYy5jdXJfcGljICE9IE5VTEwpIHsKKwkJCWNoZWNrX3BpY19lcnJvcihkZWMsIGRlYy0+YXZzMl9kZWMuaGMuY3VyX3BpYyk7CisJCQlhdnMyX3Bvc3RfcHJvY2VzcygmZGVjLT5hdnMyX2RlYyk7CisJCQlhdnMyX3ByZXBhcmVfZGlzcGxheV9idWYoZGVjKTsKKwkJfQorCQl2ZGVjX3ZmcmFtZV9kaXJ0eShod190b192ZGVjKGRlYyksIGRlYy0+Y2h1bmspOworCX0gZWxzZSBpZiAoZGVjLT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfRk9SQ0VfRVhJVCkgeworCQlhdnMyX3ByaW50KGRlYywgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCSIlczogZm9yY2UgZXhpdFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJaWYgKGRlYy0+c3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJCWFtaGV2Y19zdG9wKCk7CisJCQlkZWMtPnN0YXQgJj0gflNUQVRfVkRFQ19SVU47CisJCX0KKworCQlpZiAoZGVjLT5zdGF0ICYgU1RBVF9JU1JfUkVHKSB7CisJCQlpZiAoIWRlYy0+bV9pbnNfZmxhZykKKwkJCQlXUklURV9WUkVHKEhFVkNfQVNTSVNUX01CT1gwX01BU0ssIDApOworCQkJdmRlY19mcmVlX2lycShWREVDX0lSUV8wLCAodm9pZCAqKWRlYyk7CisJCQlkZWMtPnN0YXQgJj0gflNUQVRfSVNSX1JFRzsKKwkJfQorCX0KKworCWlmIChkZWMtPnN0YXQgJiBTVEFUX1RJTUVSX0FSTSkgeworCQlkZWxfdGltZXJfc3luYygmZGVjLT50aW1lcik7CisJCWRlYy0+c3RhdCAmPSB+U1RBVF9USU1FUl9BUk07CisJfQorCS8qIG1hcmsgaXRzZWxmIGhhcyBhbGwgSFcgcmVzb3VyY2UgcmVsZWFzZWQgYW5kIGlucHV0IHJlbGVhc2VkICovCisJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PTEpCisJCXZkZWNfY29yZV9maW5pc2hfcnVuKHZkZWMsIENPUkVfTUFTS19IRVZDKTsKKwllbHNlCisJCXZkZWNfY29yZV9maW5pc2hfcnVuKHZkZWMsIENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQyk7CisKKwlpZiAoZGVjLT52ZGVjX2NiKQorCQlkZWMtPnZkZWNfY2IoaHdfdG9fdmRlYyhkZWMpLCBkZWMtPnZkZWNfY2JfYXJnKTsKK30KKworc3RhdGljIGludCBhdnMyX2h3X2N0eF9yZXN0b3JlKHN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMpCit7CisJLyogbmV3IHRvIGRvIC4uLiAqLworCXZhdnMyX3Byb3RfaW5pdChkZWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBydW5fcmVhZHkoc3RydWN0IHZkZWNfcyAqdmRlYywgdW5zaWduZWQgbG9uZyBtYXNrKQoreworCXN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMgPQorCQkoc3RydWN0IEFWUzJEZWNvZGVyX3MgKil2ZGVjLT5wcml2YXRlOworCWludCB0dnAgPSB2ZGVjX3NlY3VyZShod190b192ZGVjKGRlYykpID8KKwkJQ09ERUNfTU1fRkxBR1NfVFZQIDogMDsKKwl1bnNpZ25lZCBsb25nIHJldCA9IDA7CisJYXZzMl9wcmludChkZWMsCisJCVBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsICIlc1xyXG4iLCBfX2Z1bmNfXyk7CisJaWYgKGRlYnVnICYgQVZTMl9EQkdfUElDX0xFQUtfV0FJVCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChkZWMtPmVvcykKKwkJcmV0dXJuIHJldDsKKwlpZiAoIWRlYy0+Zmlyc3Rfc2NfY2hlY2tlZCkgeworCQlpbnQgc2l6ZSA9IGRlY29kZXJfbW11X2JveF9zY19jaGVjayhkZWMtPm1tdV9ib3gsIHR2cCk7CisJCWRlYy0+Zmlyc3Rfc2NfY2hlY2tlZCA9IDE7CisJCWF2czJfcHJpbnQoZGVjLCAwLCAidmF2czIgY2FjaGVkPSVkICBuZWVkX3NpemU9JWQgc3BlZWQ9ICVkIG1zXG4iLAorCQkJc2l6ZSwgKGRlYy0+bmVlZF9jYWNoZV9zaXplID4+IFBBR0VfU0hJRlQpLAorCQkJCQkoaW50KShnZXRfamlmZmllc182NCgpIC0gZGVjLT5zY19zdGFydF90aW1lKSAqIDEwMDAvSFopOworCX0KKworCWlmIChkZWMtPm5leHRfYWdhaW5fZmxhZyAmJgorCQkoIXZkZWNfZnJhbWVfYmFzZWQodmRlYykpKSB7CisJCXUzMiBwYXJzZXJfd3JfcHRyID0KKwkJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCk7CisJCWlmIChwYXJzZXJfd3JfcHRyID49IGRlYy0+cHJlX3BhcnNlcl93cl9wdHIgJiYKKwkJCShwYXJzZXJfd3JfcHRyIC0gZGVjLT5wcmVfcGFyc2VyX3dyX3B0cikgPAorCQkJYWdhaW5fdGhyZXNob2xkKSB7CisJCQlpbnQgciA9IHZkZWNfc3luY19pbnB1dCh2ZGVjKTsKKwkJCWF2czJfcHJpbnQoZGVjLAorCQkJUFJJTlRfRkxBR19WREVDX0RFVEFJTCwgIiVzIGJ1ZiBsZWx2ZWw6JXhcbiIsIF9fZnVuY19fLCByKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorLyoKKwlpZiAodmRlY19zdHJlYW1fYmFzZWQodmRlYykgJiYgKGRlYy0+cGljX2xpc3RfaW5pdF9mbGFnID09IDApCisJCSYmIHByZV9kZWNvZGVfYnVmX2xldmVsICE9IDApIHsKKwkJdTMyIHJwLCB3cCwgbGV2ZWw7CisKKwkJcnAgPSBTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfcnApOworCQl3cCA9IFNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCk7CisJCWlmICh3cCA8IHJwKQorCQkJbGV2ZWwgPSB2ZGVjLT5pbnB1dC5zaXplICsgd3AgLSBycDsKKwkJZWxzZQorCQkJbGV2ZWwgPSB3cCAtIHJwOworCisJCWlmIChsZXZlbCA8IHByZV9kZWNvZGVfYnVmX2xldmVsKQorCQkJcmV0dXJuIDA7CisJfQorKi8KKworCWlmICgoZGVjLT5waWNfbGlzdF9pbml0X2ZsYWcgPT0gMCkgfHwKKwkJZ2V0X2ZyZWVfYnVmX2NvdW50KGRlYykgPj0KKwkJcnVuX3JlYWR5X21pbl9idWZfbnVtKQorCQlyZXQgPSAxOworI2lmZGVmIENPTlNUUkFJTl9NQVhfQlVGX05VTQorCWlmIChkZWMtPnBpY19saXN0X2luaXRfZmxhZykgeworCQlpZiAocnVuX3JlYWR5X21heF92Zl9vbmx5X251bSA+IDAgJiYKKwkJCWdldF92Zl9yZWZfb25seV9idWZfY291bnQoZGVjKSA+PQorCQkJcnVuX3JlYWR5X21heF92Zl9vbmx5X251bQorCQkJKQorCQkJcmV0ID0gMDsKKwkJaWYgKHJ1bl9yZWFkeV9kaXNwbGF5X3FfbnVtID4gMCAmJgorCQkJa2ZpZm9fbGVuKCZkZWMtPmRpc3BsYXlfcSkgPj0KKwkJCXJ1bl9yZWFkeV9kaXNwbGF5X3FfbnVtKQorCQkJcmV0ID0gMDsKKworCQlpZiAocnVuX3JlYWR5X21heF9idWZfbnVtID09IDB4ZmYgJiYKKwkJCWdldF91c2VkX2J1Zl9jb3VudChkZWMpID49CisJCQlkZWMtPmF2czJfZGVjLnJlZl9tYXhidWZmZXIpCisJCQlyZXQgPSAwOworCQllbHNlIGlmIChydW5fcmVhZHlfbWF4X2J1Zl9udW0gJiYKKwkJCWdldF91c2VkX2J1Zl9jb3VudChkZWMpID49CisJCQlydW5fcmVhZHlfbWF4X2J1Zl9udW0pCisJCQlyZXQgPSAwOworCX0KKyNlbmRpZgorCWlmIChyZXQpCisJCW5vdF9ydW5fcmVhZHlbZGVjLT5pbmRleF0gPSAwOworCWVsc2UKKwkJbm90X3J1bl9yZWFkeVtkZWMtPmluZGV4XSsrOworCisJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKQorCQlyZXR1cm4gcmV0ID8gQ09SRV9NQVNLX0hFVkMgOiAwOworCWVsc2UKKwkJcmV0dXJuIHJldCA/IChDT1JFX01BU0tfVkRFQ18xIHwgQ09SRV9NQVNLX0hFVkMpIDogMDsKK30KKworc3RhdGljIHZvaWQgcnVuKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHVuc2lnbmVkIGxvbmcgbWFzaywKKwl2b2lkICgqY2FsbGJhY2spKHN0cnVjdCB2ZGVjX3MgKiwgdm9pZCAqKSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMgPQorCQkoc3RydWN0IEFWUzJEZWNvZGVyX3MgKil2ZGVjLT5wcml2YXRlOworCWludCByOworCisJcnVuX2NvdW50W2RlYy0+aW5kZXhdKys7CisJZGVjLT52ZGVjX2NiX2FyZyA9IGFyZzsKKwlkZWMtPnZkZWNfY2IgPSBjYWxsYmFjazsKKwkvKiBkZWMtPmNodW5rID0gdmRlY19wcmVwYXJlX2lucHV0KHZkZWMpOyAqLworCWhldmNfcmVzZXRfY29yZSh2ZGVjKTsKKworCWlmICh2ZGVjX3N0cmVhbV9iYXNlZCh2ZGVjKSkgeworCQlkZWMtPnByZV9wYXJzZXJfd3JfcHRyID0KKwkJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCk7CisJCWRlYy0+bmV4dF9hZ2Fpbl9mbGFnID0gMDsKKwl9CisKKwlyID0gdmRlY19wcmVwYXJlX2lucHV0KHZkZWMsICZkZWMtPmNodW5rKTsKKwlpZiAociA8IDApIHsKKwkJaW5wdXRfZW1wdHlbZGVjLT5pbmRleF0rKzsKKworCQlkZWMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0FHQUlOOworCisJCWF2czJfcHJpbnQoZGVjLCBQUklOVF9GTEFHX1ZERUNfREVUQUlMLAorCQkJImFtbXZkZWNfdmgyNjU6IEluc3VmZmljaWVudCBkYXRhXG4iKTsKKworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmRlYy0+d29yayk7CisJCXJldHVybjsKKwl9CisJaW5wdXRfZW1wdHlbZGVjLT5pbmRleF0gPSAwOworCWRlYy0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfTk9ORTsKKwlkZWMtPnN0YXJ0X3NoaWZ0X2J5dGVzID0gUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCk7CisKKwlpZiAoZGVidWcgJiBQUklOVF9GTEFHX1ZERUNfU1RBVFVTKSB7CisJCWludCBpaTsKKwkJYXZzMl9wcmludChkZWMsIDAsCisJCQkiJXMgKCVkKTogc2l6ZSAweCV4ICgweCV4IDB4JXgpIHN1bSAweCV4ICgleCAleCAleCAleCAleCkgYnl0ZXMgMHgleCIsCisJCQlfX2Z1bmNfXywKKwkJCWRlYy0+ZnJhbWVfY291bnQsIHIsCisJCQlkZWMtPmNodW5rID8gZGVjLT5jaHVuay0+c2l6ZSA6IDAsCisJCQlkZWMtPmNodW5rID8gZGVjLT5jaHVuay0+b2Zmc2V0IDogMCwKKwkJCWRlYy0+Y2h1bmsgPyAoKHZkZWNfZnJhbWVfYmFzZWQodmRlYykgJiYKKwkJCShkZWJ1ZyAmIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMpKSA/CisJCQlnZXRfZGF0YV9jaGVja19zdW0oZGVjLCByKSA6IDApIDogMCwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1NUQVJUX0FERFIpLAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fRU5EX0FERFIpLAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fTEVWRUwpLAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fV1JfUFRSKSwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1JEX1BUUiksCisJCWRlYy0+c3RhcnRfc2hpZnRfYnl0ZXMpOworCQlpZiAodmRlY19mcmFtZV9iYXNlZCh2ZGVjKSAmJiBkZWMtPmNodW5rKSB7CisJCQl1OCAqZGF0YSA9IE5VTEw7CisJCQlpZiAoIWRlYy0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQkJZGF0YSA9IGNvZGVjX21tX3ZtYXAoZGVjLT5jaHVuay0+YmxvY2stPnN0YXJ0ICsKKwkJCQkJZGVjLT5jaHVuay0+b2Zmc2V0LCA4KTsKKwkJCWVsc2UKKwkJCQlkYXRhID0gKCh1OCAqKWRlYy0+Y2h1bmstPmJsb2NrLT5zdGFydF92aXJ0KSArCisJCQkJCWRlYy0+Y2h1bmstPm9mZnNldDsKKworCQkJYXZzMl9wcmludF9jb250KGRlYywgMCwgImRhdGEgYWRyICVwOiIsCisJCQkJZGF0YSk7CisJCQlmb3IgKGlpID0gMDsgaWkgPCA4OyBpaSsrKQorCQkJCWF2czJfcHJpbnRfY29udChkZWMsIDAsICIlMDJ4ICIsCisJCQkJCWRhdGFbaWldKTsKKwkJCWlmICghZGVjLT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJCQljb2RlY19tbV91bm1hcF9waHlhZGRyKGRhdGEpOworCQl9CisJCWF2czJfcHJpbnRfY29udChkZWMsIDAsICJcclxuIik7CisJfQorCWlmICh2ZGVjLT5tY19sb2FkZWQpIHsKKwkJLypmaXJtd2FyZSBoYXZlIGxvYWQgYmVmb3JlLAorCQkgIGFuZCBub3QgY2hhbmdlcyB0byBhbm90aGVyLgorCQkgIGlnbm9yZSByZWxvYWQuCisJCSovCisJfSBlbHNlIGlmIChhbWhldmNfbG9hZG1jX2V4KFZGT1JNQVRfQVZTMiwgTlVMTCwgZGVjLT5mdy0+ZGF0YSkgPCAwKSB7CisJCXZkZWMtPm1jX2xvYWRlZCA9IDA7CisJCWFtaGV2Y19kaXNhYmxlKCk7CisJCWF2czJfcHJpbnQoZGVjLCAwLAorCQkJIiVzOiBFcnJvciBhbXZkZWNfbG9hZG1jIGZhaWxcbiIsIF9fZnVuY19fKTsKKwkJZGVjLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9GT1JDRV9FWElUOworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmRlYy0+d29yayk7CisJCXJldHVybjsKKwl9IGVsc2UgeworCQl2ZGVjLT5tY19sb2FkZWQgPSAxOworCQl2ZGVjLT5tY190eXBlID0gVkZPUk1BVF9BVlMyOworCX0KKworCisJaWYgKGF2czJfaHdfY3R4X3Jlc3RvcmUoZGVjKSA8IDApIHsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZkZWMtPndvcmspOworCQlyZXR1cm47CisJfQorCisJdmRlY19lbmFibGVfaW5wdXQodmRlYyk7CisKKwlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIEFWUzJfU0VBUkNIX05FV19QSUMpOworCisJaWYgKHZkZWNfZnJhbWVfYmFzZWQodmRlYykgJiYgZGVjLT5jaHVuaykgeworCQlpZiAoZGVidWcgJiBQUklOVF9GTEFHX1ZERUNfREFUQSkKKwkJCWR1bXBfZGF0YShkZWMsIGRlYy0+Y2h1bmstPnNpemUpOworCisJCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5ULCAwKTsKKwkJciA9IGRlYy0+Y2h1bmstPnNpemUgKworCQkJKGRlYy0+Y2h1bmstPm9mZnNldCAmIChWREVDX0ZJRk9fQUxJR04gLSAxKSk7CisJCWlmICh2ZGVjLT5tdmZybSkKKwkJCXZkZWMtPm12ZnJtLT5mcmFtZV9zaXplID0gZGVjLT5jaHVuay0+c2l6ZTsKKwl9CisKKwlXUklURV9WUkVHKEhFVkNfREVDT0RFX1NJWkUsIHIpOworCVdSSVRFX1ZSRUcoSEVWQ19ERUNPREVfQ09VTlQsIGRlYy0+c2xpY2VfaWR4KTsKKwlkZWMtPmluaXRfZmxhZyA9IDE7CisKKwlhdnMyX3ByaW50KGRlYywgUFJJTlRfRkxBR19WREVDX0RFVEFJTCwKKwkJIiVzOiBzdGFydCBoZXZjICgleCAleCAleClcbiIsCisJCV9fZnVuY19fLAorCQlSRUFEX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRyksCisJCVJFQURfVlJFRyhIRVZDX01QQ19FKSwKKwkJUkVBRF9WUkVHKEhFVkNfTVBTUikpOworCisJc3RhcnRfcHJvY2Vzc190aW1lKGRlYyk7CisJbW9kX3RpbWVyKCZkZWMtPnRpbWVyLCBqaWZmaWVzKTsKKwlkZWMtPnN0YXQgfD0gU1RBVF9USU1FUl9BUk07CisJZGVjLT5zdGF0IHw9IFNUQVRfSVNSX1JFRzsKKwlpZiAodmRlYy0+bXZmcm0pCisJCXZkZWMtPm12ZnJtLT5od19kZWNvZGVfc3RhcnQgPSBsb2NhbF9jbG9jaygpOworCWFtaGV2Y19zdGFydCgpOworCWRlYy0+c3RhdCB8PSBTVEFUX1ZERUNfUlVOOworfQorCitzdGF0aWMgdm9pZCByZXNldChzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCisJc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYyA9CisJCShzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqKXZkZWMtPnByaXZhdGU7CisKKwlhdG9taWNfc2V0KCZkZWMtPnZmX3ByZV9jb3VudCwgMCk7CisJYXRvbWljX3NldCgmZGVjLT52Zl9nZXRfY291bnQsIDApOworCWF0b21pY19zZXQoJmRlYy0+dmZfcHV0X2NvdW50LCAwKTsKKworCWF2czJfcHJpbnQoZGVjLAorCQlQUklOVF9GTEFHX1ZERUNfREVUQUlMLCAiJXNcclxuIiwgX19mdW5jX18pOworCit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhdnMyX2lycV9jYihzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgaXJxKQoreworCXN0cnVjdCBBVlMyRGVjb2Rlcl9zICpkZWMgPQorCQkoc3RydWN0IEFWUzJEZWNvZGVyX3MgKil2ZGVjLT5wcml2YXRlOworCXJldHVybiB2YXZzMl9pc3IoMCwgZGVjKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGF2czJfdGhyZWFkZWRfaXJxX2NiKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBpcnEpCit7CisJc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYyA9CisJCShzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqKXZkZWMtPnByaXZhdGU7CisJcmV0dXJuIHZhdnMyX2lzcl90aHJlYWRfZm4oMCwgZGVjKTsKK30KKworc3RhdGljIHZvaWQgYXZzMl9kdW1wX3N0YXRlKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYyA9CisJCShzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqKXZkZWMtPnByaXZhdGU7CisJaW50IGk7CisJYXZzMl9wcmludChkZWMsIDAsICI9PT09PT0gJXNcbiIsIF9fZnVuY19fKTsKKworCWF2czJfcHJpbnQoZGVjLCAwLAorCQkid2lkdGgvaGVpZ2h0ICglZC8lZCksIHVzZWRfYnVmX251bSAlZFxuIiwKKwkJZGVjLT5hdnMyX2RlYy5pbWcud2lkdGgsCisJCWRlYy0+YXZzMl9kZWMuaW1nLmhlaWdodCwKKwkJZGVjLT51c2VkX2J1Zl9udW0KKwkJKTsKKworCWF2czJfcHJpbnQoZGVjLCAwLAorCQkiaXNfZnJhbWViYXNlKCVkKSwgZW9zICVkLCBkZWNfcmVzdWx0IDB4JXggZGVjX2ZybSAlZCBkaXNwX2ZybSAlZCBydW4gJWQgbm90X3J1bl9yZWFkeSAlZCBpbnB1dF9lbXB0eSAlZFxuIiwKKwkJaW5wdXRfZnJhbWVfYmFzZWQodmRlYyksCisJCWRlYy0+ZW9zLAorCQlkZWMtPmRlY19yZXN1bHQsCisJCWRlY29kZV9mcmFtZV9jb3VudFtkZWMtPmluZGV4XSwKKwkJZGlzcGxheV9mcmFtZV9jb3VudFtkZWMtPmluZGV4XSwKKwkJcnVuX2NvdW50W2RlYy0+aW5kZXhdLAorCQlub3RfcnVuX3JlYWR5W2RlYy0+aW5kZXhdLAorCQlpbnB1dF9lbXB0eVtkZWMtPmluZGV4XQorCQkpOworCisJaWYgKHZmX2dldF9yZWNlaXZlcih2ZGVjLT52Zl9wcm92aWRlcl9uYW1lKSkgeworCQllbnVtIHJlY2V2aXZlcl9zdGFydF9lIHN0YXRlID0KKwkJdmZfbm90aWZ5X3JlY2VpdmVyKHZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfUVVSRVlfU1RBVEUsCisJCQlOVUxMKTsKKwkJYXZzMl9wcmludChkZWMsIDAsCisJCQkiXG5yZWNlaXZlciglcykgc3RhdGUgJWRcbiIsCisJCQl2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJc3RhdGUpOworCX0KKworCWF2czJfcHJpbnQoZGVjLCAwLAorCSIlcywgbmV3cSglZC8lZCksIGRpc3BxKCVkLyVkKSwgdmYgcHJlcGFyZS9nZXQvcHV0ICglZC8lZC8lZCksIGZyZWVfYnVmX2NvdW50ICVkIChtaW4gJWQgZm9yIHJ1bl9yZWFkeSlcbiIsCisJX19mdW5jX18sCisJa2ZpZm9fbGVuKCZkZWMtPm5ld2ZyYW1lX3EpLAorCVZGX1BPT0xfU0laRSwKKwlrZmlmb19sZW4oJmRlYy0+ZGlzcGxheV9xKSwKKwlWRl9QT09MX1NJWkUsCisJZGVjLT52Zl9wcmVfY291bnQsCisJZGVjLT52Zl9nZXRfY291bnQsCisJZGVjLT52Zl9wdXRfY291bnQsCisJZ2V0X2ZyZWVfYnVmX2NvdW50KGRlYyksCisJcnVuX3JlYWR5X21pbl9idWZfbnVtCisJKTsKKworCWR1bXBfcGljX2xpc3QoZGVjKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQlVGX05VTTsgaSsrKSB7CisJCWF2czJfcHJpbnQoZGVjLCAwLAorCQkJIm12X0J1ZiglZCkgc3RhcnRfYWRyIDB4JXggc2l6ZSAweCV4IHVzZWQgJWRcbiIsCisJCQlpLAorCQkJZGVjLT5tX212X0JVRltpXS5zdGFydF9hZHIsCisJCQlkZWMtPm1fbXZfQlVGW2ldLnNpemUsCisJCQlkZWMtPm1fbXZfQlVGW2ldLnVzZWRfZmxhZyk7CisJfQorCisJYXZzMl9wcmludChkZWMsIDAsCisJCSJIRVZDX0RFQ19TVEFUVVNfUkVHPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHKSk7CisJYXZzMl9wcmludChkZWMsIDAsCisJCSJIRVZDX01QQ19FPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX01QQ19FKSk7CisJYXZzMl9wcmludChkZWMsIDAsCisJCSJERUNPREVfTU9ERT0weCV4XG4iLAorCQlSRUFEX1ZSRUcoREVDT0RFX01PREUpKTsKKwlhdnMyX3ByaW50KGRlYywgMCwKKwkJIk5BTF9TRUFSQ0hfQ1RMPTB4JXhcbiIsCisJCVJFQURfVlJFRyhOQUxfU0VBUkNIX0NUTCkpOworCWF2czJfcHJpbnQoZGVjLCAwLAorCQkiSEVWQ19QQVJTRVJfTENVX1NUQVJUPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX1BBUlNFUl9MQ1VfU1RBUlQpKTsKKwlhdnMyX3ByaW50KGRlYywgMCwKKwkJIkhFVkNfREVDT0RFX1NJWkU9MHgleFxuIiwKKwkJUkVBRF9WUkVHKEhFVkNfREVDT0RFX1NJWkUpKTsKKwlhdnMyX3ByaW50KGRlYywgMCwKKwkJIkhFVkNfU0hJRlRfQllURV9DT1VOVD0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKSk7CisJYXZzMl9wcmludChkZWMsIDAsCisJCSJIRVZDX1NUUkVBTV9TVEFSVF9BRERSPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9TVEFSVF9BRERSKSk7CisJYXZzMl9wcmludChkZWMsIDAsCisJCSJIRVZDX1NUUkVBTV9FTkRfQUREUj0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fRU5EX0FERFIpKTsKKwlhdnMyX3ByaW50KGRlYywgMCwKKwkJIkhFVkNfU1RSRUFNX0xFVkVMPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9MRVZFTCkpOworCWF2czJfcHJpbnQoZGVjLCAwLAorCQkiSEVWQ19TVFJFQU1fV1JfUFRSPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9XUl9QVFIpKTsKKwlhdnMyX3ByaW50KGRlYywgMCwKKwkJIkhFVkNfU1RSRUFNX1JEX1BUUj0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSKSk7CisJYXZzMl9wcmludChkZWMsIDAsCisJCSJQQVJTRVJfVklERU9fUlA9MHgleFxuIiwKKwkJU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3JwKSk7CisJYXZzMl9wcmludChkZWMsIDAsCisJCSJQQVJTRVJfVklERU9fV1A9MHgleFxuIiwKKwkJU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3dwKSk7CisKKwlpZiAoaW5wdXRfZnJhbWVfYmFzZWQodmRlYykgJiYKKwkJKGRlYnVnICYgUFJJTlRfRkxBR19WREVDX0RBVEEpCisJCSkgeworCQlpbnQgamo7CisJCWlmIChkZWMtPmNodW5rICYmIGRlYy0+Y2h1bmstPmJsb2NrICYmCisJCQlkZWMtPmNodW5rLT5zaXplID4gMCkgeworCQkJdTggKmRhdGEgPSBOVUxMOworCQkJaWYgKCFkZWMtPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQkJCWRhdGEgPSBjb2RlY19tbV92bWFwKGRlYy0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQkJCWRlYy0+Y2h1bmstPm9mZnNldCwgZGVjLT5jaHVuay0+c2l6ZSk7CisJCQllbHNlCisJCQkJZGF0YSA9ICgodTggKilkZWMtPmNodW5rLT5ibG9jay0+c3RhcnRfdmlydCkgKworCQkJCQlkZWMtPmNodW5rLT5vZmZzZXQ7CisJCQlhdnMyX3ByaW50KGRlYywgMCwKKwkJCQkiZnJhbWUgZGF0YSBzaXplIDB4JXhcbiIsCisJCQkJZGVjLT5jaHVuay0+c2l6ZSk7CisJCQlmb3IgKGpqID0gMDsgamogPCBkZWMtPmNodW5rLT5zaXplOyBqaisrKSB7CisJCQkJaWYgKChqaiAmIDB4ZikgPT0gMCkKKwkJCQkJYXZzMl9wcmludChkZWMsIDAsCisJCQkJCQkiJTA2eDoiLCBqaik7CisJCQkJYXZzMl9wcmludF9jb250KGRlYywgMCwKKwkJCQkJIiUwMnggIiwgZGF0YVtqal0pOworCQkJCWlmICgoKGpqICsgMSkgJiAweGYpID09IDApCisJCQkJCWF2czJfcHJpbnRfY29udChkZWMsIDAsCisJCQkJCQkiXG4iKTsKKwkJCX0KKworCQkJaWYgKCFkZWMtPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQkJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIoZGF0YSk7CisJCX0KKwl9CisKK30KKworc3RhdGljIGludCBhbW12ZGVjX2F2czJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdmRlY19zICpwZGF0YSA9ICooc3RydWN0IHZkZWNfcyAqKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpbnQgcmV0OworCWludCBjb25maWdfdmFsOworCWludCBpOworCXN0cnVjdCB2ZnJhbWVfY29udGVudF9saWdodF9sZXZlbF9zIGNvbnRlbnRfbGlnaHRfbGV2ZWw7CisJc3RydWN0IHZmcmFtZV9tYXN0ZXJfZGlzcGxheV9jb2xvdXJfcyB2Zl9kcDsKKwkvKnN0cnVjdCBCVUZfcyBCVUZbTUFYX0JVRl9OVU1dOyovCisJc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYyA9IE5VTEw7CisKKwlwcl9pbmZvKCIlc1xuIiwgX19mdW5jX18pOworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1RCkgeworCQlwcl9pbmZvKCIlcywgY2hpcCBpZCAlZCBpcyBub3Qgc3VwcG9ydCBhdnMyXG4iLAorCQkJX19mdW5jX18sIGdldF9jcHVfbWFqb3JfaWQoKSk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHBkYXRhID09IE5VTEwpIHsKKwkJcHJfaW5mbygiXG5hbW12ZGVjX2F2czIgbWVtb3J5IHJlc291cmNlIHVuZGVmaW5lZC5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJLypkZWMgPSAoc3RydWN0IEFWUzJEZWNvZGVyX3MgKilkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwKKwkJc2l6ZW9mKHN0cnVjdCBBVlMyRGVjb2Rlcl9zKSwgR0ZQX0tFUk5FTCk7Ki8KKwltZW1zZXQoJnZmX2RwLCAwLCBzaXplb2Yoc3RydWN0IHZmcmFtZV9tYXN0ZXJfZGlzcGxheV9jb2xvdXJfcykpOworCWRlYyA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBBVlMyRGVjb2Rlcl9zKSk7CisJbWVtc2V0KGRlYywgMCwgc2l6ZW9mKHN0cnVjdCBBVlMyRGVjb2Rlcl9zKSk7CisJaWYgKGRlYyA9PSBOVUxMKSB7CisJCXByX2luZm8oIlxuYW1tdmRlY19hdnMyIGRldmljZSBkYXRhIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlmIChwZGF0YS0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBBVlMyX01BWF9CVUZGRVJfTlVNOyBpKyspIHsKKwkJCWRlYy0+YXZzMl9kZWMuZnJtX3Bvb2xbaV0ueV9jYW52YXNfaW5kZXggPSAtMTsKKwkJCWRlYy0+YXZzMl9kZWMuZnJtX3Bvb2xbaV0udXZfY2FudmFzX2luZGV4ID0gLTE7CisJCX0KKwl9CisJcGRhdGEtPnByaXZhdGUgPSBkZWM7CisJcGRhdGEtPmRlY19zdGF0dXMgPSB2YXZzMl9kZWNfc3RhdHVzOworI2lmZGVmIElfT05MWV9TVVBQT1JUCisJcGRhdGEtPnNldF90cmlja21vZGUgPSB2YXZzMl9zZXRfdHJpY2ttb2RlOworI2VuZGlmCisJcGRhdGEtPnJ1bl9yZWFkeSA9IHJ1bl9yZWFkeTsKKwlwZGF0YS0+cnVuID0gcnVuOworCXBkYXRhLT5yZXNldCA9IHJlc2V0OworCXBkYXRhLT5pcnFfaGFuZGxlciA9IGF2czJfaXJxX2NiOworCXBkYXRhLT50aHJlYWRlZF9pcnFfaGFuZGxlciA9IGF2czJfdGhyZWFkZWRfaXJxX2NiOworCXBkYXRhLT5kdW1wX3N0YXRlID0gYXZzMl9kdW1wX3N0YXRlOworCisJLyoKKwkgKiBtZW1jcHkoJkJVRlswXSwgJmRlYy0+bV9CVUZbMF0sIHNpemVvZihzdHJ1Y3QgQlVGX3MpICogTUFYX0JVRl9OVU0pOworCSAqIG1lbXNldChkZWMsIDAsIHNpemVvZihzdHJ1Y3QgQVZTMkRlY29kZXJfcykpOworCSAqIG1lbWNweSgmZGVjLT5tX0JVRlswXSwgJkJVRlswXSwgc2l6ZW9mKHN0cnVjdCBCVUZfcykgKiBNQVhfQlVGX05VTSk7CisJICovCisKKwlkZWMtPmluZGV4ID0gcGRldi0+aWQ7CisJZGVjLT5tX2luc19mbGFnID0gMTsKKworCWlmIChpc19yZG1hX2VuYWJsZSgpKSB7CisJCWRlYy0+cmRtYV9hZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLCBSRE1BX1NJWkUgLCAmZGVjLT5yZG1hX3BoeV9hZHIsIEdGUF9LRVJORUwpOworCQlmb3IgKGkgPSAwOyBpIDwgU0NBTEVMVVRfREFUQV9XUklURV9OVU07IGkrKykgeworCQkJZGVjLT5yZG1hX2FkcltpICogNF0gPSBIRVZDX0lRSVRfU0NBTEVMVVRfV1JfQUREUiAmIDB4ZmZmOworCQkJZGVjLT5yZG1hX2FkcltpICogNCArIDFdID0gaTsKKwkJCWRlYy0+cmRtYV9hZHJbaSAqIDQgKyAyXSA9IEhFVkNfSVFJVF9TQ0FMRUxVVF9EQVRBICYgMHhmZmY7CisJCQlkZWMtPnJkbWFfYWRyW2kgKiA0ICsgM10gPSAwOworCQkJaWYgKGkgPT0gU0NBTEVMVVRfREFUQV9XUklURV9OVU0gLSAxKSB7CisJCQkJZGVjLT5yZG1hX2FkcltpICogNCArIDJdID0gKEhFVkNfSVFJVF9TQ0FMRUxVVF9EQVRBICYgMHhmZmYpIHwgMHgyMDAwMDsKKwkJCX0KKwkJfQorCX0KKworCXNucHJpbnRmKGRlYy0+dmRlY19uYW1lLCBzaXplb2YoZGVjLT52ZGVjX25hbWUpLAorCQkiYXZzMi0lZCIsIGRlYy0+aW5kZXgpOworCXNucHJpbnRmKGRlYy0+cHRzX25hbWUsIHNpemVvZihkZWMtPnB0c19uYW1lKSwKKwkJIiVzLXRpbWVzdGFtcCIsIGRlYy0+dmRlY19uYW1lKTsKKwlzbnByaW50ZihkZWMtPm5ld19xX25hbWUsIHNpemVvZihkZWMtPm5ld19xX25hbWUpLAorCQkiJXMtbmV3ZnJhbWVfcSIsIGRlYy0+dmRlY19uYW1lKTsKKwlzbnByaW50ZihkZWMtPmRpc3BfcV9uYW1lLCBzaXplb2YoZGVjLT5kaXNwX3FfbmFtZSksCisJCSIlcy1kaXNwZnJhbWVfcSIsIGRlYy0+dmRlY19uYW1lKTsKKworCWlmIChwZGF0YS0+dXNlX3ZmbV9wYXRoKSB7CisJCXNucHJpbnRmKHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lLCBWREVDX1BST1ZJREVSX05BTUVfU0laRSwKKwkJCVZGTV9ERUNfUFJPVklERVJfTkFNRSk7CisJCWRlYy0+ZnJhbWVpbmZvX2VuYWJsZSA9IDE7CisJfSBlbHNlCisJCXNucHJpbnRmKHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lLCBWREVDX1BST1ZJREVSX05BTUVfU0laRSwKKwkJCU1VTFRJX0lOU1RBTkNFX1BST1ZJREVSX05BTUUgIi4lMDJ4IiwgcGRldi0+aWQgJiAweGZmKTsKKworCXZmX3Byb3ZpZGVyX2luaXQoJnBkYXRhLT52ZnJhbWVfcHJvdmlkZXIsIHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lLAorCQkmdmF2czJfdmZfcHJvdmlkZXIsIGRlYyk7CisKKwlkZWMtPnByb3ZpZGVyX25hbWUgPSBwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwZGF0YSk7CisKKwlkZWMtPnBsYXRmb3JtX2RldiA9IHBkZXY7CisJZGVjLT52aWRlb19zaWduYWxfdHlwZSA9IDA7CisJZGVjLT52aWRlb19vcmlfc2lnbmFsX3R5cGUgPSAwOworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPCBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVFhMWCkKKwkJZGVjLT5zdGF0IHw9IFZQOV9UUklHR0VSX0ZSQU1FX0VOQUJMRTsKKyNpZiAxCisJaWYgKChkZWJ1ZyAmIElHTk9SRV9QQVJBTV9GUk9NX0NPTkZJRykgPT0gMCAmJgorCQkJcGRhdGEtPmNvbmZpZ19sZW4pIHsKKwkJLyp1c2UgcHRyIGNvbmZpZyBmb3IgZG91YmVsX3dyaXRlX21vZGUsIGV0YyovCisJCWF2czJfcHJpbnQoZGVjLCAwLCAicGRhdGEtPmNvbmZpZz0lc1xuIiwgcGRhdGEtPmNvbmZpZyk7CisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAiYXZzMl9kb3VibGVfd3JpdGVfbW9kZSIsCisJCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlkZWMtPmRvdWJsZV93cml0ZV9tb2RlID0gY29uZmlnX3ZhbDsKKwkJZWxzZQorCQkJZGVjLT5kb3VibGVfd3JpdGVfbW9kZSA9IGRvdWJsZV93cml0ZV9tb2RlOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAicGFybV92NGxfYnVmZmVyX21hcmdpbiIsCisJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWRlYy0+ZHluYW1pY19idWZfbWFyZ2luID0gY29uZmlnX3ZhbDsKKwkJZWxzZQorCQkJZGVjLT5keW5hbWljX2J1Zl9tYXJnaW4gPSAwOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAic2lkZWJpbmRfdHlwZSIsCisJCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlkZWMtPnNpZGViaW5kX3R5cGUgPSBjb25maWdfdmFsOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAic2lkZWJpbmRfY2hhbm5lbF9pZCIsCisJCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlkZWMtPnNpZGViaW5kX2NoYW5uZWxfaWQgPSBjb25maWdfdmFsOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAiSERSU3RhdGljSW5mbyIsCisJCQkJJnZmX2RwLnByZXNlbnRfZmxhZykgPT0gMAorCQkJCSYmIHZmX2RwLnByZXNlbnRfZmxhZyA9PSAxKSB7CisJCQlnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAibUcueCIsCisJCQkJCSZ2Zl9kcC5wcmltYXJpZXNbMF1bMF0pOworCQkJZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm1HLnkiLAorCQkJCQkmdmZfZHAucHJpbWFyaWVzWzBdWzFdKTsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtQi54IiwKKwkJCQkJJnZmX2RwLnByaW1hcmllc1sxXVswXSk7CisJCQlnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAibUIueSIsCisJCQkJCSZ2Zl9kcC5wcmltYXJpZXNbMV1bMV0pOworCQkJZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm1SLngiLAorCQkJCQkmdmZfZHAucHJpbWFyaWVzWzJdWzBdKTsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtUi55IiwKKwkJCQkJJnZmX2RwLnByaW1hcmllc1syXVsxXSk7CisJCQlnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAibVcueCIsCisJCQkJCSZ2Zl9kcC53aGl0ZV9wb2ludFswXSk7CisJCQlnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAibVcueSIsCisJCQkJCSZ2Zl9kcC53aGl0ZV9wb2ludFsxXSk7CisJCQlnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAibU1heERMIiwKKwkJCQkJJnZmX2RwLmx1bWluYW5jZVswXSk7CisJCQlnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAibU1pbkRMIiwKKwkJCQkJJnZmX2RwLmx1bWluYW5jZVsxXSk7CisJCQl2Zl9kcC5jb250ZW50X2xpZ2h0X2xldmVsLnByZXNlbnRfZmxhZyA9IDE7CisJCQlnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAibU1heENMTCIsCisJCQkJCSZjb250ZW50X2xpZ2h0X2xldmVsLm1heF9jb250ZW50KTsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtTWF4RkFMTCIsCisJCQkJCSZjb250ZW50X2xpZ2h0X2xldmVsLm1heF9waWNfYXZlcmFnZSk7CisJCQl2Zl9kcC5jb250ZW50X2xpZ2h0X2xldmVsID0gY29udGVudF9saWdodF9sZXZlbDsKKwkJCWRlYy0+dmlkZW9fc2lnbmFsX3R5cGUgPSAoMSA8PCAyOSkKKwkJCQkJfCAoNSA8PCAyNikJLyogdW5zcGVjaWZpZWQgKi8KKwkJCQkJfCAoMCA8PCAyNSkJLyogbGltaXQgKi8KKwkJCQkJfCAoMSA8PCAyNCkJLyogY29sb3IgYXZhaWxhYmxlICovCisJCQkJCXwgKDkgPDwgMTYpCS8qIDIwMjAgKi8KKwkJCQkJfCAoMTYgPDwgOCkJLyogMjA4NCAqLworCQkJCQl8ICg5IDw8IDApOwkvKiAyMDIwICovCisJCX0KKwkJZGVjLT52Zl9kcCA9IHZmX2RwOworCX0gZWxzZQorI2VuZGlmCisJeworCQkvKmRlYy0+dmF2czJfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGggPSAwOworCQlkZWMtPnZhdnMyX2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodCA9IDA7CisJCWRlYy0+dmF2czJfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSA9IDMwOyovCisJCWRlYy0+ZG91YmxlX3dyaXRlX21vZGUgPSBkb3VibGVfd3JpdGVfbW9kZTsKKwkJZGVjLT5keW5hbWljX2J1Zl9tYXJnaW4gPSBkeW5hbWljX2J1Zl9udW1fbWFyZ2luOworCX0KKwl2aWRlb19zaWduYWxfdHlwZSA9IGRlYy0+dmlkZW9fc2lnbmFsX3R5cGU7CisKKyNpZiAwCisJZGVjLT5idWZfc3RhcnQgPSBwZGF0YS0+bWVtX3N0YXJ0OworCWRlYy0+YnVmX3NpemUgPSBwZGF0YS0+bWVtX2VuZCAtIHBkYXRhLT5tZW1fc3RhcnQgKyAxOworI2Vsc2UKKwlpZiAoYW12ZGVjX2F2czJfbW11X2luaXQoZGVjKSA8IDApIHsKKwkJcHJfZXJyKCJhdnMyIGFsbG9jIGJtbXUgYm94IGZhaWxlZCEhXG4iKTsKKwkJLyogZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCAodm9pZCAqKWRlYyk7ICovCisJCXZmcmVlKCh2b2lkICopZGVjKTsKKwkJcmV0dXJuIC0xOworCX0KKwlkZWMtPmNtYV9hbGxvY19jb3VudCA9IFBBR0VfQUxJR04od29ya19idWZfc2l6ZSkgLyBQQUdFX1NJWkU7CisJcmV0ID0gZGVjb2Rlcl9ibW11X2JveF9hbGxvY19idWZfcGh5KGRlYy0+Ym1tdV9ib3gsIFdPUktfU1BBQ0VfQlVGX0lELAorCQkJZGVjLT5jbWFfYWxsb2NfY291bnQgKiBQQUdFX1NJWkUsIERSSVZFUl9OQU1FLAorCQkJJmRlYy0+Y21hX2FsbG9jX2FkZHIpOworCWlmIChyZXQgPCAwKSB7CisJCXVuaW5pdF9tbXVfYnVmZmVycyhkZWMpOworCQkvKiBkZXZtX2tmcmVlKCZwZGV2LT5kZXYsICh2b2lkICopZGVjKTsgKi8KKwkJdmZyZWUoKHZvaWQgKilkZWMpOworCQlyZXR1cm4gcmV0OworCX0KKwlkZWMtPmJ1Zl9zdGFydCA9IGRlYy0+Y21hX2FsbG9jX2FkZHI7CisJZGVjLT5idWZfc2l6ZSA9IHdvcmtfYnVmX3NpemU7CisjZW5kaWYKKwlkZWMtPmluaXRfZmxhZyA9IDA7CisJZGVjLT5maXJzdF9zY19jaGVja2VkID0gMDsKKwlkZWMtPmZhdGFsX2Vycm9yID0gMDsKKwlkZWMtPnNob3dfZnJhbWVfbnVtID0gMDsKKworCWlmIChkZWJ1ZykgeworCQlwcl9pbmZvKCI9PT1BVlMyIGRlY29kZXIgbWVtIHJlc291cmNlIDB4JWx4IHNpemUgMHgleFxuIiwKKwkJCSAgIGRlYy0+YnVmX3N0YXJ0LAorCQkJICAgZGVjLT5idWZfc2l6ZSk7CisJfQorCisJaWYgKHBkYXRhLT5zeXNfaW5mbykgeworCQlkZWMtPnZhdnMyX2Ftc3RyZWFtX2RlY19pbmZvID0gKnBkYXRhLT5zeXNfaW5mbzsKKwkJZGVjLT5mcmFtZV93aWR0aCA9IGRlYy0+dmF2czJfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGg7CisJCWRlYy0+ZnJhbWVfaGVpZ2h0ID0gZGVjLT52YXZzMl9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQ7CisJfSBlbHNlIHsKKwkJZGVjLT52YXZzMl9hbXN0cmVhbV9kZWNfaW5mby53aWR0aCA9IDA7CisJCWRlYy0+dmF2czJfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0ID0gMDsKKwkJZGVjLT52YXZzMl9hbXN0cmVhbV9kZWNfaW5mby5yYXRlID0gMzA7CisJfQorCisJZGVjLT5lbmRpYW4gPSBIRVZDX0NPTkZJR19MSVRUTEVfRU5ESUFOOworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3KQorCQlkZWMtPmVuZGlhbiA9IEhFVkNfQ09ORklHX0JJR19FTkRJQU47CisJaWYgKGVuZGlhbikKKwkJZGVjLT5lbmRpYW4gPSBlbmRpYW47CisKKwlkZWMtPmNtYV9kZXYgPSBwZGF0YS0+Y21hX2RldjsKKwlpZiAodmF2czJfaW5pdChwZGF0YSkgPCAwKSB7CisJCXByX2luZm8oIlxuYW12ZGVjX2F2czIgaW5pdCBmYWlsZWQuXG4iKTsKKwkJYXZzMl9sb2NhbF91bmluaXQoZGVjKTsKKwkJdW5pbml0X21tdV9idWZmZXJzKGRlYyk7CisJCS8qIGRldm1fa2ZyZWUoJnBkZXYtPmRldiwgKHZvaWQgKilkZWMpOyAqLworCQl2ZnJlZSgodm9pZCAqKWRlYyk7CisJCXBkYXRhLT5kZWNfc3RhdHVzID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXZkZWNfc2V0X3ByZXBhcmVfbGV2ZWwocGRhdGEsIHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwpOworCWhldmNfc291cmNlX2NoYW5nZWQoVkZPUk1BVF9BVlMyLAorCQkJNDA5NiwgMjA0OCwgNjApOworCWlmIChwZGF0YS0+cGFyYWxsZWxfZGVjID09IDEpCisJCXZkZWNfY29yZV9yZXF1ZXN0KHBkYXRhLCBDT1JFX01BU0tfSEVWQyk7CisJZWxzZSB7CisJCXZkZWNfY29yZV9yZXF1ZXN0KHBkYXRhLCBDT1JFX01BU0tfVkRFQ18xIHwgQ09SRV9NQVNLX0hFVkMKKwkJCQl8IENPUkVfTUFTS19DT01CSU5FKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbW12ZGVjX2F2czJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IEFWUzJEZWNvZGVyX3MgKmRlYyA9IChzdHJ1Y3QgQVZTMkRlY29kZXJfcyAqKQorCQkoKChzdHJ1Y3QgdmRlY19zICopKHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpKSktPnByaXZhdGUpOworCXN0cnVjdCB2ZGVjX3MgKnBkYXRhID0gKihzdHJ1Y3QgdmRlY19zICoqKXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBhdnMyX2RlY29kZXIgKmF2czJfZGVjID0gJmRlYy0+YXZzMl9kZWM7CisJc3RydWN0IGF2czJfZnJhbWVfcyAqcGljOworCWludCBpOworCisJaWYgKGRlYnVnKQorCQlwcl9pbmZvKCJhbXZkZWNfYXZzMl9yZW1vdmVcbiIpOworCisJdm1hdnMyX3N0b3AoZGVjKTsKKworCWlmIChwZGF0YS0+cGFyYWxsZWxfZGVjID09IDEpCisJCXZkZWNfY29yZV9yZWxlYXNlKGh3X3RvX3ZkZWMoZGVjKSwgQ09SRV9NQVNLX0hFVkMpOworCWVsc2UKKwkJdmRlY19jb3JlX3JlbGVhc2UoaHdfdG9fdmRlYyhkZWMpLCBDT1JFX01BU0tfSEVWQyk7CisKKwl2ZGVjX3NldF9zdGF0dXMoaHdfdG9fdmRlYyhkZWMpLCBWREVDX1NUQVRVU19ESVNDT05ORUNURUQpOworCWlmIChwZGF0YS0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJZm9yIChpID0gMDsgaSA8IEFWUzJfTUFYX0JVRkZFUl9OVU07IGkrKykgeworCQkJcGRhdGEtPmZyZWVfY2FudmFzX2V4KGRlYy0+YXZzMl9kZWMuZnJtX3Bvb2xbaV0ueV9jYW52YXNfaW5kZXgsIHBkYXRhLT5pZCk7CisJCQlwZGF0YS0+ZnJlZV9jYW52YXNfZXgoZGVjLT5hdnMyX2RlYy5mcm1fcG9vbFtpXS51dl9jYW52YXNfaW5kZXgsIHBkYXRhLT5pZCk7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZGVjLT51c2VkX2J1Zl9udW07IGkrKykgeworCQlpZiAoaSA9PSAoZGVjLT51c2VkX2J1Zl9udW0gLSAxKSkKKwkJCXBpYyA9IGF2czJfZGVjLT5tX2JnOworCQllbHNlCisJCQlwaWMgPSBhdnMyX2RlYy0+ZnJlZltpXTsKKwkJcmVsZWFzZV9jdXZhX2RhdGEocGljKTsKKwl9CisKKworI2lmZGVmIERFQlVHX1BUUworCXByX2luZm8oInB0cyBtaXNzZWQgJWxkLCBwdHMgaGl0ICVsZCwgZHVyYXRpb24gJWRcbiIsCisJCSAgIGRlYy0+cHRzX21pc3NlZCwgZGVjLT5wdHNfaGl0LCBkZWMtPmZyYW1lX2R1cik7CisjZW5kaWYKKwlpZiAoaXNfcmRtYV9lbmFibGUoKSkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLCBSRE1BX1NJWkUsIGRlYy0+cmRtYV9hZHIsIGRlYy0+cmRtYV9waHlfYWRyKTsKKwkvKiBkZXZtX2tmcmVlKCZwZGV2LT5kZXYsICh2b2lkICopZGVjKTsgKi8KKwl2ZnJlZSgodm9pZCAqKWRlYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFtbXZkZWNfYXZzMl9kcml2ZXIgPSB7CisJLnByb2JlID0gYW1tdmRlY19hdnMyX3Byb2JlLAorCS5yZW1vdmUgPSBhbW12ZGVjX2F2czJfcmVtb3ZlLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kID0gYW12ZGVjX3N1c3BlbmQsCisJLnJlc3VtZSA9IGFtdmRlY19yZXN1bWUsCisjZW5kaWYKKwkuZHJpdmVyID0geworCQkubmFtZSA9IE1VTFRJX0RSSVZFUl9OQU1FLAorCX0KK307CisjZW5kaWYKK3N0YXRpYyBzdHJ1Y3QgbWNvbmZpZyBhdnMyX2NvbmZpZ3NbXSA9IHsKKwlNQ19QVTMyKCJiaXRfZGVwdGhfbHVtYSIsICZiaXRfZGVwdGhfbHVtYSksCisJTUNfUFUzMigiYml0X2RlcHRoX2Nocm9tYSIsICZiaXRfZGVwdGhfY2hyb21hKSwKKwlNQ19QVTMyKCJmcmFtZV93aWR0aCIsICZmcmFtZV93aWR0aCksCisJTUNfUFUzMigiZnJhbWVfaGVpZ2h0IiwgJmZyYW1lX2hlaWdodCksCisJTUNfUFUzMigiZGVidWciLCAmZGVidWcpLAorCU1DX1BVMzIoInJhZHIiLCAmcmFkciksCisJTUNfUFUzMigicnZhbCIsICZydmFsKSwKKwlNQ19QVTMyKCJwb3Bfc2hvcnRzIiwgJnBvcF9zaG9ydHMpLAorCU1DX1BVMzIoImRiZ19jbWQiLCAmZGJnX2NtZCksCisJTUNfUFUzMigiZGJnX3NraXBfZGVjb2RlX2luZGV4IiwgJmRiZ19za2lwX2RlY29kZV9pbmRleCksCisJTUNfUFUzMigiZW5kaWFuIiwgJmVuZGlhbiksCisJTUNfUFUzMigic3RlcCIsICZzdGVwKSwKKwlNQ19QVTMyKCJ1ZGVidWdfZmxhZyIsICZ1ZGVidWdfZmxhZyksCisJTUNfUFUzMigiZGVjb2RlX3BpY19iZWdpbiIsICZkZWNvZGVfcGljX2JlZ2luKSwKKwlNQ19QVTMyKCJzbGljZV9wYXJzZV9iZWdpbiIsICZzbGljZV9wYXJzZV9iZWdpbiksCisJTUNfUFUzMigiaV9vbmx5X2ZsYWciLCAmaV9vbmx5X2ZsYWcpLAorCU1DX1BVMzIoImVycm9yX2hhbmRsZV9wb2xpY3kiLCAmZXJyb3JfaGFuZGxlX3BvbGljeSksCisJTUNfUFUzMigiYnVmX2FsbG9jX3dpZHRoIiwgJmJ1Zl9hbGxvY193aWR0aCksCisJTUNfUFUzMigiYnVmX2FsbG9jX2hlaWdodCIsICZidWZfYWxsb2NfaGVpZ2h0KSwKKwlNQ19QVTMyKCJidWZfYWxsb2NfZGVwdGgiLCAmYnVmX2FsbG9jX2RlcHRoKSwKKwlNQ19QVTMyKCJidWZfYWxsb2Nfc2l6ZSIsICZidWZfYWxsb2Nfc2l6ZSksCisJTUNfUFUzMigiYnVmZmVyX21vZGUiLCAmYnVmZmVyX21vZGUpLAorCU1DX1BVMzIoImJ1ZmZlcl9tb2RlX2RiZyIsICZidWZmZXJfbW9kZV9kYmcpLAorCU1DX1BVMzIoIm1heF9idWZfbnVtIiwgJm1heF9idWZfbnVtKSwKKwlNQ19QVTMyKCJkeW5hbWljX2J1Zl9udW1fbWFyZ2luIiwgJmR5bmFtaWNfYnVmX251bV9tYXJnaW4pLAorCU1DX1BVMzIoIm1lbV9tYXBfbW9kZSIsICZtZW1fbWFwX21vZGUpLAorCU1DX1BVMzIoImRvdWJsZV93cml0ZV9tb2RlIiwgJmRvdWJsZV93cml0ZV9tb2RlKSwKKwlNQ19QVTMyKCJlbmFibGVfbWVtX3NhdmluZyIsICZlbmFibGVfbWVtX3NhdmluZyksCisJTUNfUFUzMigiZm9yY2Vfd19oIiwgJmZvcmNlX3dfaCksCisJTUNfUFUzMigiZm9yY2VfZnBzIiwgJmZvcmNlX2ZwcyksCisJTUNfUFUzMigibWF4X2RlY29kaW5nX3RpbWUiLCAmbWF4X2RlY29kaW5nX3RpbWUpLAorCU1DX1BVMzIoIm9uX25vX2tleWZyYW1lX3NraXBlZCIsICZvbl9ub19rZXlmcmFtZV9za2lwZWQpLAorCU1DX1BVMzIoInN0YXJ0X2RlY29kZV9idWZfbGV2ZWwiLCAmc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCksCisJTUNfUFUzMigiZGVjb2RlX3RpbWVvdXRfdmFsIiwgJmRlY29kZV90aW1lb3V0X3ZhbCksCit9Oworc3RhdGljIHN0cnVjdCBtY29uZmlnX25vZGUgYXZzMl9ub2RlOworCitzdGF0aWMgaW50IF9faW5pdCBhbXZkZWNfYXZzMl9kcml2ZXJfaW5pdF9tb2R1bGUodm9pZCkKK3sKKworI2lmZGVmIEFWUzJfMTBCX01NVQorCisJc3RydWN0IEJ1ZmZJbmZvX3MgKnBfYnVmX2luZm87CisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDw9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UTTIgJiYgIWlzX2NwdV90bTJfcmV2YigpKSB7CisJCWlmICh2ZGVjX2lzX3N1cHBvcnRfNGsoKSkgeworCQkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKQorCQkJCXBfYnVmX2luZm8gPSAmYW12YXZzMl93b3JrYnVmZl9zcGVjWzJdOworCQkJZWxzZQorCQkJCXBfYnVmX2luZm8gPSAmYW12YXZzMl93b3JrYnVmZl9zcGVjWzFdOworCQl9IGVsc2UKKwkJCXBfYnVmX2luZm8gPSAmYW12YXZzMl93b3JrYnVmZl9zcGVjWzBdOworCX0gZWxzZSB7IC8vZ2V0X2NwdV9tYWpvcl9pZCgpID4gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RNMiB8fCBpc19jcHVfdG0yX3JldmIoKQorCQlpZiAodmRlY19pc19zdXBwb3J0XzRrKCkpIHsKKwkJCXBfYnVmX2luZm8gPSAmYW12YXZzMl93b3JrYnVmZl9zcGVjWzVdOworCQl9IGVsc2UKKwkJCXBfYnVmX2luZm8gPSAmYW12YXZzMl93b3JrYnVmZl9zcGVjWzNdOworCX0KKworCWluaXRfYnVmZl9zcGVjKE5VTEwsIHBfYnVmX2luZm8pOworCXdvcmtfYnVmX3NpemUgPQorCQkocF9idWZfaW5mby0+ZW5kX2FkciAtIHBfYnVmX2luZm8tPnN0YXJ0X2FkcgorCQkgKyAweGZmZmYpICYgKH4weGZmZmYpOworCisjZW5kaWYKKwlwcl9kZWJ1ZygiYW12ZGVjX2F2czIgbW9kdWxlIGluaXRcbiIpOworCisjaWZkZWYgRVJST1JfSEFORExFX0RFQlVHCisJZGJnX25hbF9za2lwX2ZsYWcgPSAwOworCWRiZ19uYWxfc2tpcF9jb3VudCA9IDA7CisjZW5kaWYKKwl1ZGVidWdfZmxhZyA9IDA7CisJZGVjb2RlX3BpY19iZWdpbiA9IDA7CisJc2xpY2VfcGFyc2VfYmVnaW4gPSAwOworCXN0ZXAgPSAwOworCWJ1Zl9hbGxvY19zaXplID0gMDsKKworCWlmIChwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFtbXZkZWNfYXZzMl9kcml2ZXIpKSB7CisJCXByX2VycigiZmFpbGVkIHRvIHJlZ2lzdGVyIGFtbXZkZWNfYXZzMiBkcml2ZXJcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA8IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKSB8fAorCQkoZ2V0X2NwdV9tYWpvcl9pZCgpID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNUQpKSB7CisJCWFtdmRlY19hdnMyX3Byb2ZpbGUubmFtZSA9ICJhdnMyX3Vuc3VwcG9ydCI7CisJfSBlbHNlIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPCBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKSB7CisJCWlmICh2ZGVjX2lzX3N1cHBvcnRfNGsoKSkKKwkJCWFtdmRlY19hdnMyX3Byb2ZpbGUucHJvZmlsZSA9CisJCQkJIjRrLCAxMGJpdCwgZHdyaXRlLCBjb21wcmVzc2VkIjsKKwkJZWxzZQorCQkJYW12ZGVjX2F2czJfcHJvZmlsZS5wcm9maWxlID0KKwkJCQkiMTBiaXQsIGR3cml0ZSwgY29tcHJlc3NlZCI7CisJfSBlbHNlIHsKKwkJLyogY3B1IGlkIGxhcmdlciB0aGFuIHNtMSBzdXBwb3J0IDhrICovCisJCWFtdmRlY19hdnMyX3Byb2ZpbGUucHJvZmlsZSA9CisJCQkJIjhrLCAxMGJpdCwgZHdyaXRlLCBjb21wcmVzc2VkIjsKKwl9CisKKwl2Y29kZWNfcHJvZmlsZV9yZWdpc3RlcigmYW12ZGVjX2F2czJfcHJvZmlsZSk7CisKKwlJTklUX1JFR19OT0RFX0NPTkZJR1MoIm1lZGlhLmRlY29kZXIiLCAmYXZzMl9ub2RlLAorCQkiYXZzMi12NGwiLCBhdnMyX2NvbmZpZ3MsIENPTkZJR19GT1JfUlcpOworCXZjb2RlY19mZWF0dXJlX3JlZ2lzdGVyKFZGT1JNQVRfQVZTMiwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFtdmRlY19hdnMyX2RyaXZlcl9yZW1vdmVfbW9kdWxlKHZvaWQpCit7CisJcHJfZGVidWcoImFtdmRlY19hdnMyIG1vZHVsZSByZW1vdmUuXG4iKTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYW1tdmRlY19hdnMyX2RyaXZlcik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCittb2R1bGVfcGFyYW0oYml0X2RlcHRoX2x1bWEsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhiaXRfZGVwdGhfbHVtYSwgIlxuIGFtdmRlY19hdnMyIGJpdF9kZXB0aF9sdW1hXG4iKTsKKworbW9kdWxlX3BhcmFtKGJpdF9kZXB0aF9jaHJvbWEsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhiaXRfZGVwdGhfY2hyb21hLCAiXG4gYW12ZGVjX2F2czIgYml0X2RlcHRoX2Nocm9tYVxuIik7CisKK21vZHVsZV9wYXJhbShmcmFtZV93aWR0aCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZyYW1lX3dpZHRoLCAiXG4gYW12ZGVjX2F2czIgZnJhbWVfd2lkdGhcbiIpOworCittb2R1bGVfcGFyYW0oZnJhbWVfaGVpZ2h0LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZnJhbWVfaGVpZ2h0LCAiXG4gYW12ZGVjX2F2czIgZnJhbWVfaGVpZ2h0XG4iKTsKKworbW9kdWxlX3BhcmFtKGRlYnVnLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJcbiBhbXZkZWNfYXZzMiBkZWJ1Z1xuIik7CisKK21vZHVsZV9wYXJhbShkZWJ1Z19hZ2FpbiwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnX2FnYWluLCAiXG4gYW12ZGVjX2F2czIgZGVidWdfYWdhaW5cbiIpOworCittb2R1bGVfcGFyYW0ocmFkciwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJhZHIsICJcbnJhZHJcbiIpOworCittb2R1bGVfcGFyYW0ocnZhbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJ2YWwsICJcbnJ2YWxcbiIpOworCittb2R1bGVfcGFyYW0ocG9wX3Nob3J0cywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBvcF9zaG9ydHMsICJcbnJ2YWxcbiIpOworCittb2R1bGVfcGFyYW0oZGJnX2NtZCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRiZ19jbWQsICJcbmRiZ19jbWRcbiIpOworCittb2R1bGVfcGFyYW0oZGJnX3NraXBfZGVjb2RlX2luZGV4LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGJnX3NraXBfZGVjb2RlX2luZGV4LCAiXG5kYmdfc2tpcF9kZWNvZGVfaW5kZXhcbiIpOworCittb2R1bGVfcGFyYW0oZW5kaWFuLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5kaWFuLCAiXG5ydmFsXG4iKTsKKworbW9kdWxlX3BhcmFtKHN0ZXAsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhzdGVwLCAiXG4gYW12ZGVjX2F2czIgc3RlcFxuIik7CisKK21vZHVsZV9wYXJhbShkZWNvZGVfcGljX2JlZ2luLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVjb2RlX3BpY19iZWdpbiwgIlxuIGFtdmRlY19hdnMyIGRlY29kZV9waWNfYmVnaW5cbiIpOworCittb2R1bGVfcGFyYW0oc2xpY2VfcGFyc2VfYmVnaW4sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhzbGljZV9wYXJzZV9iZWdpbiwgIlxuIGFtdmRlY19hdnMyIHNsaWNlX3BhcnNlX2JlZ2luXG4iKTsKKworbW9kdWxlX3BhcmFtKGlfb25seV9mbGFnLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoaV9vbmx5X2ZsYWcsICJcbiBhbXZkZWNfYXZzMiBpX29ubHlfZmxhZ1xuIik7CisKK21vZHVsZV9wYXJhbShlcnJvcl9oYW5kbGVfcG9saWN5LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZXJyb3JfaGFuZGxlX3BvbGljeSwgIlxuIGFtdmRlY19hdnMyIGVycm9yX2hhbmRsZV9wb2xpY3lcbiIpOworCittb2R1bGVfcGFyYW0ocmVfc2VhcmNoX3NlcV90aHJlc2hvbGQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhyZV9zZWFyY2hfc2VxX3RocmVzaG9sZCwgIlxuIGFtdmRlY19hdnMyIHJlX3NlYXJjaF9zZXFfdGhyZXNob2xkXG4iKTsKKworbW9kdWxlX3BhcmFtKGJ1Zl9hbGxvY193aWR0aCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGJ1Zl9hbGxvY193aWR0aCwgIlxuIGJ1Zl9hbGxvY193aWR0aFxuIik7CisKK21vZHVsZV9wYXJhbShidWZfYWxsb2NfaGVpZ2h0LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoYnVmX2FsbG9jX2hlaWdodCwgIlxuIGJ1Zl9hbGxvY19oZWlnaHRcbiIpOworCittb2R1bGVfcGFyYW0oYnVmX2FsbG9jX2RlcHRoLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoYnVmX2FsbG9jX2RlcHRoLCAiXG4gYnVmX2FsbG9jX2RlcHRoXG4iKTsKKworbW9kdWxlX3BhcmFtKGJ1Zl9hbGxvY19zaXplLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoYnVmX2FsbG9jX3NpemUsICJcbiBidWZfYWxsb2Nfc2l6ZVxuIik7CisKK21vZHVsZV9wYXJhbShidWZmZXJfbW9kZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGJ1ZmZlcl9tb2RlLCAiXG4gYnVmZmVyX21vZGVcbiIpOworCittb2R1bGVfcGFyYW0oYnVmZmVyX21vZGVfZGJnLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoYnVmZmVyX21vZGVfZGJnLCAiXG4gYnVmZmVyX21vZGVfZGJnXG4iKTsKKy8qVVNFX0JVRl9CTE9DSyovCittb2R1bGVfcGFyYW0obWF4X2J1Zl9udW0sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfYnVmX251bSwgIlxuIG1heF9idWZfbnVtXG4iKTsKKworbW9kdWxlX3BhcmFtKGR5bmFtaWNfYnVmX251bV9tYXJnaW4sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkeW5hbWljX2J1Zl9udW1fbWFyZ2luLCAiXG4gZHluYW1pY19idWZfbnVtX21hcmdpblxuIik7CisKKyNpZmRlZiBDT05TVFJBSU5fTUFYX0JVRl9OVU0KK21vZHVsZV9wYXJhbShydW5fcmVhZHlfbWF4X3ZmX29ubHlfbnVtLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocnVuX3JlYWR5X21heF92Zl9vbmx5X251bSwgIlxuIHJ1bl9yZWFkeV9tYXhfdmZfb25seV9udW1cbiIpOworCittb2R1bGVfcGFyYW0ocnVuX3JlYWR5X2Rpc3BsYXlfcV9udW0sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhydW5fcmVhZHlfZGlzcGxheV9xX251bSwgIlxuIHJ1bl9yZWFkeV9kaXNwbGF5X3FfbnVtXG4iKTsKKworbW9kdWxlX3BhcmFtKHJ1bl9yZWFkeV9tYXhfYnVmX251bSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJ1bl9yZWFkeV9tYXhfYnVmX251bSwgIlxuIHJ1bl9yZWFkeV9tYXhfYnVmX251bVxuIik7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKG12X2J1Zl9tYXJnaW4sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhtdl9idWZfbWFyZ2luLCAiXG4gbXZfYnVmX21hcmdpblxuIik7CisKK21vZHVsZV9wYXJhbShydW5fcmVhZHlfbWluX2J1Zl9udW0sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhydW5fcmVhZHlfbWluX2J1Zl9udW0sICJcbiBydW5fcmVhZHlfbWluX2J1Zl9udW1cbiIpOworCisvKiovCisKK21vZHVsZV9wYXJhbShtZW1fbWFwX21vZGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhtZW1fbWFwX21vZGUsICJcbiBtZW1fbWFwX21vZGVcbiIpOworCittb2R1bGVfcGFyYW0oZG91YmxlX3dyaXRlX21vZGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkb3VibGVfd3JpdGVfbW9kZSwgIlxuIGRvdWJsZV93cml0ZV9tb2RlXG4iKTsKKworbW9kdWxlX3BhcmFtKGVuYWJsZV9tZW1fc2F2aW5nLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlX21lbV9zYXZpbmcsICJcbiBlbmFibGVfbWVtX3NhdmluZ1xuIik7CisKK21vZHVsZV9wYXJhbShmb3JjZV93X2gsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV93X2gsICJcbiBmb3JjZV93X2hcbiIpOworCittb2R1bGVfcGFyYW0oZm9yY2VfZnBzLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2VfZnBzLCAiXG4gZm9yY2VfZnBzXG4iKTsKKworbW9kdWxlX3BhcmFtKG1heF9kZWNvZGluZ190aW1lLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2RlY29kaW5nX3RpbWUsICJcbiBtYXhfZGVjb2RpbmdfdGltZVxuIik7CisKK21vZHVsZV9wYXJhbShvbl9ub19rZXlmcmFtZV9za2lwZWQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhvbl9ub19rZXlmcmFtZV9za2lwZWQsICJcbiBvbl9ub19rZXlmcmFtZV9za2lwZWRcbiIpOworCisKK21vZHVsZV9wYXJhbShzdGFydF9kZWNvZGVfYnVmX2xldmVsLCBpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhzdGFydF9kZWNvZGVfYnVmX2xldmVsLAorCQkiXG4gYXZzMiBzdGFydF9kZWNvZGVfYnVmX2xldmVsXG4iKTsKKworbW9kdWxlX3BhcmFtKGRlY29kZV90aW1lb3V0X3ZhbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlY29kZV90aW1lb3V0X3ZhbCwKKwkiXG4gYXZzMiBkZWNvZGVfdGltZW91dF92YWxcbiIpOworCittb2R1bGVfcGFyYW1fYXJyYXkoZGVjb2RlX2ZyYW1lX2NvdW50LCB1aW50LAorCSZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisKK21vZHVsZV9wYXJhbV9hcnJheShkaXNwbGF5X2ZyYW1lX2NvdW50LCB1aW50LAorCSZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisKK21vZHVsZV9wYXJhbV9hcnJheShtYXhfcHJvY2Vzc190aW1lLCB1aW50LAorCSZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisKK21vZHVsZV9wYXJhbV9hcnJheShydW5fY291bnQsIHVpbnQsCisJJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGlucHV0X2VtcHR5LCB1aW50LAorCSZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisKK21vZHVsZV9wYXJhbV9hcnJheShub3RfcnVuX3JlYWR5LCB1aW50LAorCSZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisKK21vZHVsZV9wYXJhbSh2aWRlb19zaWduYWxfdHlwZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHZpZGVvX3NpZ25hbF90eXBlLCAiXG4gYW12ZGVjX2F2czIgdmlkZW9fc2lnbmFsX3R5cGVcbiIpOworCittb2R1bGVfcGFyYW0oZm9yY2VfdmlkZW9fc2lnbmFsX3R5cGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV92aWRlb19zaWduYWxfdHlwZSwgIlxuIGFtdmRlY19hdnMyIGZvcmNlX3ZpZGVvX3NpZ25hbF90eXBlXG4iKTsKKworbW9kdWxlX3BhcmFtKGVuYWJsZV9mb3JjZV92aWRlb19zaWduYWxfdHlwZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZV9mb3JjZV92aWRlb19zaWduYWxfdHlwZSwgIlxuIGFtdmRlY19hdnMyIGVuYWJsZV9mb3JjZV92aWRlb19zaWduYWxfdHlwZVxuIik7CisKK21vZHVsZV9wYXJhbShmb3JjZV9idWZzcGVjLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2VfYnVmc3BlYywgIlxuIGFtdmRlY19oMjY1IGZvcmNlX2J1ZnNwZWNcbiIpOworCittb2R1bGVfcGFyYW0odWRlYnVnX2ZsYWcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh1ZGVidWdfZmxhZywgIlxuIGFtdmRlY19oMjY1IHVkZWJ1Z19mbGFnXG4iKTsKKworbW9kdWxlX3BhcmFtKHVkZWJ1Z19wYXVzZV9wb3MsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh1ZGVidWdfcGF1c2VfcG9zLCAiXG4gdWRlYnVnX3BhdXNlX3Bvc1xuIik7CisKK21vZHVsZV9wYXJhbSh1ZGVidWdfcGF1c2VfdmFsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModWRlYnVnX3BhdXNlX3ZhbCwgIlxuIHVkZWJ1Z19wYXVzZV92YWxcbiIpOworCittb2R1bGVfcGFyYW0odWRlYnVnX3BhdXNlX2RlY29kZV9pZHgsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeCwgIlxuIHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4XG4iKTsKKworbW9kdWxlX3BhcmFtKHByZV9kZWNvZGVfYnVmX2xldmVsLCBpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhwcmVfZGVjb2RlX2J1Zl9sZXZlbCwKKwkJIlxuIGFtdmRlY19hdnMyIHByZV9kZWNvZGVfYnVmX2xldmVsXG4iKTsKKworbW9kdWxlX3BhcmFtKGFnYWluX3RocmVzaG9sZCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGFnYWluX3RocmVzaG9sZCwgIlxuIGFnYWluX3RocmVzaG9sZFxuIik7CisKKworbW9kdWxlX3BhcmFtKGZvcmNlX2Rpc3BfcGljX2luZGV4LCBpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9kaXNwX3BpY19pbmRleCwKKwkiXG4gYW12ZGVjX2gyNjUgZm9yY2VfZGlzcF9waWNfaW5kZXhcbiIpOworCittb2R1bGVfcGFyYW0od2l0aG91dF9kaXNwbGF5X21vZGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh3aXRob3V0X2Rpc3BsYXlfbW9kZSwgIlxuIHdpdGhvdXRfZGlzcGxheV9tb2RlXG4iKTsKKworbW9kdWxlX3BhcmFtKG12X2J1Zl9keW5hbWljX2FsbG9jLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobXZfYnVmX2R5bmFtaWNfYWxsb2MsICJcbiBtdl9idWZfZHluYW1pY19hbGxvY1xuIik7CisKK21vZHVsZV9pbml0KGFtdmRlY19hdnMyX2RyaXZlcl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChhbXZkZWNfYXZzMl9kcml2ZXJfcmVtb3ZlX21vZHVsZSk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQU1MT0dJQyBhdnMyIFZpZGVvIERlY29kZXIgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJUaW0gWWFvIDx0aW0ueWFvQGFtbG9naWMuY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC9hdnMyL3ZhdnMyLmggYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL2F2czIvdmF2czIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjUxZjYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC9hdnMyL3ZhdnMyLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9hbXBvcnRzL3ZhdnMyLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisqLworCisjaWZuZGVmIFZBVlMyX0gKKyNkZWZpbmUgVkFWUzJfSAorCisjZGVmaW5lIEFWUzJfMTBCX01NVQorI2RlZmluZSBNVl9VU0VfRklYRURfQlVGCisKK3ZvaWQgYWRhcHRfY29lZl9wcm9icyhpbnQgcGljX2NvdW50LCBpbnQgcHJldl9rZiwgaW50IGN1cl9rZiwgaW50IHByZV9mYywKK3Vuc2lnbmVkIGludCAqcHJldl9wcm9iLCB1bnNpZ25lZCBpbnQgKmN1cl9wcm9iLCB1bnNpZ25lZCBpbnQgKmNvdW50KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC9hdnNfbXVsdGkvTWFrZWZpbGUgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL2F2c19tdWx0aS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGRhM2FiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC9hdnNfbXVsdGkvTWFrZWZpbGUKQEAgLTAsMCArMSwyIEBACitvYmotJChDT05GSUdfQU1MT0dJQ19NRURJQV9WREVDX0FWU19NVUxUSSkgKz0gYW12ZGVjX21hdnNfdjRsLm8KK2FtdmRlY19tYXZzX3Y0bC1vYmpzICs9IGF2c19tdWx0aS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL2F2c19tdWx0aS9hdnNfbXVsdGkuYyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlcl92NGwvYXZzX211bHRpL2F2c19tdWx0aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZDkzODUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL2F2c19tdWx0aS9hdnNfbXVsdGkuYwpAQCAtMCwwICsxLDUwMTYgQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvYW1wb3J0cy92YXZzLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy9hbXN0cmVhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZnJhbWVfc3luYy9wdHNzZXJ2Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jYW52YXMvY2FudmFzLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3Byb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3JlY2VpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy92ZGVjX3JlZy5oPgorI2luY2x1ZGUgIi4uLy4uLy4uL3N0cmVhbV9pbnB1dC9hbXBvcnRzL3N0cmVhbWJ1Zl9yZWcuaCIKKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL2FtdmRlYy5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvcmVnaXN0ZXJzL3JlZ2lzdGVyLmg+CisjaW5jbHVkZSAiLi4vLi4vLi4vc3RyZWFtX2lucHV0L2FtcG9ydHMvYW1wb3J0c19wcml2LmgiCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvZGVjX21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgImF2c19tdWx0aS5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29uZmlncy5oPgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvZGVjb2Rlcl9tbXVfYm94LmgiCisjaW5jbHVkZSAiLi4vLi4vZGVjb2Rlci91dGlscy9kZWNvZGVyX2JtbXVfYm94LmgiCisjaW5jbHVkZSAiLi4vLi4vZGVjb2Rlci91dGlscy9maXJtd2FyZS5oIgorI2luY2x1ZGUgIi4uLy4uLy4uL2NvbW1vbi9jaGlwcy9kZWNvZGVyX2NwdV92ZXJfaW5mby5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvdGVlLmg+CisjaW5jbHVkZSAiLi4vLi4vZGVjb2Rlci91dGlscy92ZGVjX2ZlYXR1cmUuaCIKKworI2RlZmluZSBERUJVR19NVUxUSV9GTEFHICAwCisvKgorI2RlZmluZSBERUJVR19XSVRIX1NJTkdMRV9NT0RFCisjZGVmaW5lIERFQlVHX01VTFRJX1dJVEhfQVVUT01PREUKKyNkZWZpbmUgREVCVUdfTVVMVElfRlJBTUVfSU5TCisqLworCisKKyNkZWZpbmUgVVNFX0RZTkFNSUNfQlVGX05VTQorCisjZGVmaW5lIERSSVZFUl9OQU1FICJhbW12ZGVjX2F2c192NGwiCisKKworI2RlZmluZSBNVUxUSV9EUklWRVJfTkFNRSAiYW1tdmRlY19hdnNfdjRsIgorCisjZGVmaW5lIEVOQUJMRV9VU0VSX0RBVEEKKworI2lmIDEvKiBNRVNPTl9DUFVfVFlQRSA+PSBNRVNPTl9DUFVfVFlQRV9NRVNPTjYgKi8KKyNkZWZpbmUgTlYyMQorI2VuZGlmCisKKyNkZWZpbmUgVVNFX0FWU19TRVFfSU5GTworI2RlZmluZSBIQU5ETEVfQVZTX0lSUQorI2RlZmluZSBERUJVR19QVFMKKworI2RlZmluZSBDSEVDS19JTlRFUlZBTCAgICAgICAgKEhaLzEwMCkKKworI2RlZmluZSBJX1BJQ1RVUkUgICAwCisjZGVmaW5lIFBfUElDVFVSRSAgIDEKKyNkZWZpbmUgQl9QSUNUVVJFICAgMgorCisjZGVmaW5lIExNRU1fQlVGX1NJWkUgKDB4NTAwICogMikKKworLyogI2RlZmluZSBPUklfQlVGRkVSX1NUQVJUX0FERFIgICAweDgxMDAwMDAwICovCisjZGVmaW5lIE9SSV9CVUZGRVJfU1RBUlRfQUREUiAgIDB4ODAwMDAwMDAKKworI2RlZmluZSBJTlRFUkxBQ0VfRkxBRyAgICAgICAgICAweDgwCisjZGVmaW5lIFRPUF9GSUVMRF9GSVJTVF9GTEFHIDB4NDAKKworLyogcHJvdG9jb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIEFWU19QSUNfUkFUSU8gICAgICAgQVZfU0NSQVRDSF8wCisjZGVmaW5lIEFWU19QSUNfV0lEVEggICAgICBBVl9TQ1JBVENIXzEKKyNkZWZpbmUgQVZTX1BJQ19IRUlHSFQgICAgIEFWX1NDUkFUQ0hfMgorI2RlZmluZSBBVlNfRlJBTUVfUkFURSAgICAgQVZfU0NSQVRDSF8zCisKKy8qI2RlZmluZSBBVlNfRVJST1JfQ09VTlQgICAgQVZfU0NSQVRDSF82Ki8KKyNkZWZpbmUgQVZTX1NPU19DT1VOVCAgICAgQVZfU0NSQVRDSF83CisjZGVmaW5lIEFWU19CVUZGRVJJTiAgICAgICBBVl9TQ1JBVENIXzgKKyNkZWZpbmUgQVZTX0JVRkZFUk9VVCAgICAgIEFWX1NDUkFUQ0hfOQorI2RlZmluZSBBVlNfUkVQRUFUX0NPVU5UICAgIEFWX1NDUkFUQ0hfQQorI2RlZmluZSBBVlNfVElNRV9TVEFNUCAgICAgIEFWX1NDUkFUQ0hfQgorI2RlZmluZSBBVlNfT0ZGU0VUX1JFRyAgICAgIEFWX1NDUkFUQ0hfQworI2RlZmluZSBNRU1fT0ZGU0VUX1JFRyAgICAgIEFWX1NDUkFUQ0hfRgorI2RlZmluZSBBVlNfRVJST1JfUkVDT1ZFUllfTU9ERSAgIEFWX1NDUkFUQ0hfRworI2RlZmluZSBERUNPREVfUElDX0NPVU5UICAgICBBVl9TQ1JBVENIX0cKKworI2RlZmluZSBERUNPREVfTU9ERQkJQVZfU0NSQVRDSF82CisjZGVmaW5lIERFQ09ERV9NT0RFX1NJTkdMRQkJCQkJMHgwCisjZGVmaW5lIERFQ09ERV9NT0RFX01VTFRJX0ZSQU1FQkFTRQkJCTB4MQorI2RlZmluZSBERUNPREVfTU9ERV9NVUxUSV9TVFJFQU1CQVNFCQkweDIKKyNkZWZpbmUgREVDT0RFX01PREVfTVVMVElfU1RSRUFNQkFTRV9DT05UICAgMHgzCisKKyNkZWZpbmUgREVDT0RFX1NUQVRVUwlBVl9TQ1JBVENIX0gKKyNkZWZpbmUgREVDT0RFX1NUQVRVU19QSUNfRE9ORSAgICAweDEKKyNkZWZpbmUgREVDT0RFX1NUQVRVU19ERUNPREVfQlVGX0VNUFRZCTB4MgorI2RlZmluZSBERUNPREVfU1RBVFVTX1NFQVJDSF9CVUZfRU1QVFkJMHgzCisjZGVmaW5lIERFQ09ERV9TVEFUVVNfU0tJUF9QSUNfRE9ORSAgICAgMHg0CisjZGVmaW5lIERFQ09ERV9TRUFSQ0hfSEVBRAkweGZmCisKKyNkZWZpbmUgREVDT0RFX1NUT1BfUE9TCQlBVl9TQ1JBVENIX0oKKworI2RlZmluZSBERUNPREVfTE1FTV9CVUZfQURSICAgQVZfU0NSQVRDSF9JCisKKyNkZWZpbmUgREVDT0RFX0NGRyAgICAgICAgICAgIEFWX1NDUkFUQ0hfSworCisjZGVmaW5lIFZGX1BPT0xfU0laRSAgICAgICAgNjQKKyNkZWZpbmUgUFVUX0lOVEVSVkFMICAgICAgICAoSFovMTAwKQorCisjaWYgMSAvKk1FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09OOCovCisjZGVmaW5lIElOVF9BTVZFTkNPREVSIElOVF9ET1NfTUFJTEJPWF8xCisjZWxzZQorLyogI2RlZmluZSBBTVZFTkNfREVWX1ZFUlNJT04gIkFNTC1NVCIgKi8KKyNkZWZpbmUgSU5UX0FNVkVOQ09ERVIgSU5UX01BSUxCT1hfMUEKKyNlbmRpZgorCisjaWZkZWYgVVNFX0RZTkFNSUNfQlVGX05VTQorc3RhdGljIHVuc2lnbmVkIGludCBidWZfc3BlY19yZWdbXSA9IHsKKwlBVl9TQ1JBVENIXzAsCisJQVZfU0NSQVRDSF8xLAorCUFWX1NDUkFUQ0hfMiwKKwlBVl9TQ1JBVENIXzMsCisJQVZfU0NSQVRDSF83LCAvKkFWU19TT1NfQ09VTlQqLworCUFWX1NDUkFUQ0hfRCwgLypERUJVR19SRUcyKi8KKwlBVl9TQ1JBVENIX0UsIC8qREVCVUdfUkVHMSovCisJQVZfU0NSQVRDSF9NICAvKnVzZXJfZGF0YV9wb2NfbnVtYmVyKi8KK307CisjZW5kaWYKKworI2RlZmluZSBERUJVR19SRUcxCUFWX1NDUkFUQ0hfRQorI2RlZmluZSBERUJVR19SRUcyCUFWX1NDUkFUQ0hfRAorCisKK3N0YXRpYyB2b2lkIGNoZWNrX3RpbWVyX2Z1bmMoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKTsKK3N0YXRpYyB2b2lkIHZhdnNfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworCisjZGVmaW5lIERFQ19DT05UUk9MX0ZMQUdfRk9SQ0VfMjUwMF8xMDgwUF9JTlRFUkxBQ0UgMHgwMDAxCitzdGF0aWMgdTMyIGRlY19jb250cm9sID0gREVDX0NPTlRST0xfRkxBR19GT1JDRV8yNTAwXzEwODBQX0lOVEVSTEFDRTsKKworCisjZGVmaW5lIFZQUF9WRDFfUE9TVEJMRU5EICAgICAgICgxIDw8IDEwKQorCitzdGF0aWMgaW50IGRlYnVnOworc3RhdGljIHVuc2lnbmVkIGludCBkZWJ1Z19tYXNrID0gMHhmZjsKKworLypmb3IgZGVidWcqLworLyoKKwl1ZGVidWdfZmxhZzoKKwliaXQgMCwgZW5hYmxlIHVjb2RlIHByaW50CisJYml0IDEsIGVuYWJsZSB1Y29kZSBtb3JlIHByaW50CisJYml0IDMsIGVuYWJsZSB1Y2RvZGUgZGV0YWlsIHByaW50CisJYml0IFszMToxNl0gbm90IDAsIHBvcyB0byBkdW1wIGxtZW0KKwkJYml0IDIsIHBvcCBiaXRzIHRvIGxtZW0KKwkJYml0IFsxMTo4XSwgcHJlLXBvcCBiaXRzIGZvciBhbGlnbm1lbnQgKHdoZW4gYml0IDIgaXMgMSkKKworCWF2cyBvbmx5OgorCWJpdCBbOF0sIGRpc2FibGUgZW1wdHkgbXVpdGwtaW5zdGFuY2UgaGFuZGxpbmcKKwliaXQgWzldLCBlbmFibGUgd3JpdHRpbmcgb2YgVkMxX0NPTlRST0xfUkVHIGluIHVjb2RlCisqLworc3RhdGljIHUzMiB1ZGVidWdfZmxhZzsKKy8qCisJd2hlbiB1ZGVidWdfZmxhZ1sxOjBdIGlzIG5vdCAwCisJdWRlYnVnX3BhdXNlX3BvcyBub3QgMCwKKwkJcGF1c2UgcG9zaXRpb24KKyovCitzdGF0aWMgdTMyIHVkZWJ1Z19wYXVzZV9wb3M7CisvKgorCXdoZW4gdWRlYnVnX2ZsYWdbMTowXSBpcyBub3QgMAorCWFuZCB1ZGVidWdfcGF1c2VfcG9zIGlzIG5vdCAwLAorCQlwYXVzZSBvbmx5IHdoZW4gREVCVUdfUkVHMiBpcyBlcXVhbCB0byB0aGlzIHZhbAorKi8KK3N0YXRpYyB1MzIgdWRlYnVnX3BhdXNlX3ZhbDsKKworc3RhdGljIHUzMiB1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeDsKKworc3RhdGljIHUzMiB1ZGVidWdfcGF1c2VfaW5zX2lkOworCitzdGF0aWMgdTMyIGZvcmNlX2ZwczsKKworI2lmZGVmIERFQlVHX01VTFRJX0ZSQU1FX0lOUworc3RhdGljIHUzMiBkZWxheTsKKyNlbmRpZgorCitzdGF0aWMgdTMyIHN0ZXA7CisKK3N0YXRpYyB1MzIgc3RhcnRfZGVjb2RpbmdfZGVsYXk7CisKKyNkZWZpbmUgQVZTX0RFVl9OVU0gICAgICAgIDkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X2RlY29kZV9pbnN0YW5jZV9udW0gPSBBVlNfREVWX05VTTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X3Byb2Nlc3NfdGltZVtBVlNfREVWX05VTV07CitzdGF0aWMgdW5zaWduZWQgaW50IG1heF9nZXRfZnJhbWVfaW50ZXJ2YWxbQVZTX0RFVl9OVU1dOworc3RhdGljIHVuc2lnbmVkIGludCBydW5fY291bnRbQVZTX0RFVl9OVU1dOworc3RhdGljIHVuc2lnbmVkIGludCBpbnNfdWRlYnVnX2ZsYWdbQVZTX0RFVl9OVU1dOworI2lmZGVmIERFQlVHX01VTFRJX0ZSQU1FX0lOUworc3RhdGljIHVuc2lnbmVkIGludCBtYXhfcnVuX2NvdW50W0FWU19ERVZfTlVNXTsKKyNlbmRpZgorLyoKK2Vycm9yX2hhbmRsZV9wb2xpY3k6CisqLworc3RhdGljIHVuc2lnbmVkIGludCBlcnJvcl9oYW5kbGVfcG9saWN5ID0gMzsKKworc3RhdGljIHUzMiBhZ2Fpbl90aHJlc2hvbGQgPSAwOyAvKjB4NDA7Ki8KKworc3RhdGljIHVuc2lnbmVkIGludCBkZWNvZGVfdGltZW91dF92YWwgPSAyMDA7CitzdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwgPSAweDgwMDA7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorZmlybXdhcmVfc2VsCisgICAgMDogdXNlIGF2c3BfdHJhbnMgbG9uZyBjYWJhYyB1Y29kZTsKKyAgICAxOiBub3QgdXNlIGF2c3BfdHJhbnMgbG9uZyBjYWJhYyB1Y29kZQorCQlpbiB1Y29kZToKKwkJI2RlZmluZSBVU0VfRVhUX0JVRkZFUl9BU1NJR05NRU5UCisJCSN1bmRlZiBVU0VfRFlOQU1JQ19CVUZfTlVNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZmlybXdhcmVfc2VsOworc3RhdGljIGludCBkaXNhYmxlX2xvbmdjYWJhY190cmFucyA9IDE7CitzdGF0aWMgaW50IHByZV9kZWNvZGVfYnVmX2xldmVsID0gMHg4MDA7CisKKworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyAqdmF2c192Zl9wZWVrKHZvaWQgKik7CitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2YXZzX3ZmX2dldCh2b2lkICopOworc3RhdGljIHZvaWQgdmF2c192Zl9wdXQoc3RydWN0IHZmcmFtZV9zICosIHZvaWQgKik7CitzdGF0aWMgaW50IHZhdnNfdmZfc3RhdGVzKHN0cnVjdCB2ZnJhbWVfc3RhdGVzICpzdGF0ZXMsIHZvaWQgKik7CitzdGF0aWMgaW50IHZhdnNfZXZlbnRfY2IoaW50IHR5cGUsIHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGVfZGF0YSk7CisKK3N0YXRpYyBjb25zdCBjaGFyIHZhdnNfZGVjX2lkW10gPSAidmF2cy1kZXYiOworCisjZGVmaW5lIFBST1ZJREVSX05BTUUgICAiZGVjb2Rlci5hdnMiCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxvY2spOworc3RhdGljIERFRklORV9NVVRFWCh2YXZzX211dGV4KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2ZnJhbWVfb3BlcmF0aW9uc19zIHZhdnNfdmZfcHJvdmlkZXIgPSB7CisJLnBlZWsgPSB2YXZzX3ZmX3BlZWssCisJLmdldCA9IHZhdnNfdmZfZ2V0LAorCS5wdXQgPSB2YXZzX3ZmX3B1dCwKKwkuZXZlbnRfY2IgPSB2YXZzX2V2ZW50X2NiLAorCS52Zl9zdGF0ZXMgPSB2YXZzX3ZmX3N0YXRlcywKK307CisvKgorc3RhdGljIHZvaWQgKm1tX2Jsa19oYW5kbGU7CisqLworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcHJvdmlkZXJfcyB2YXZzX3ZmX3Byb3Y7CisKKyNkZWZpbmUgVkZfQlVGX05VTV9NQVggMTYKKyNpZmRlZiBERUJVR19NVUxUSV9GUkFNRV9JTlMKKyNkZWZpbmUgV09SS1NQQUNFX1NJWkUJCSgxNiAqIFNaXzFNKQorI2Vsc2UKKyNkZWZpbmUgV09SS1NQQUNFX1NJWkUJCSg0ICogU1pfMU0pCisjZW5kaWYKKyNpZmRlZiBBVlNQX0xPTkdfQ0FCQUMKKyNkZWZpbmUgTUFYX0JNTVVfQlVGRkVSX05VTQkoVkZfQlVGX05VTV9NQVggKyAyKQorI2RlZmluZSBXT1JLU1BBQ0VfU0laRV9BCQkoTUFYX0NPREVEX0ZSQU1FX1NJWkUgKyBMT0NBTF9IRUFQX1NJWkUpCisjZWxzZQorI2RlZmluZSBNQVhfQk1NVV9CVUZGRVJfTlVNCShWRl9CVUZfTlVNX01BWCArIDEpCisjZW5kaWYKKworI2RlZmluZSBSVl9BSV9CVUZGX1NUQVJUX0FERFIJIDB4MDFhMDAwMDAKKyNkZWZpbmUgTE9OR19DQUJBQ19SVl9BSV9CVUZGX1NUQVJUX0FERFIJIDB4MDAwMDAwMDAKKworLyogNCBidWZmZXJzIG5vdCBlbm91Z2ggZm9yIG11bHRpIGluYyovCitzdGF0aWMgdTMyIHZmX2J1Zl9udW0gPSA4OworLypzdGF0aWMgdTMyIHZmX2J1Zl9udW1fdXNlZDsqLworc3RhdGljIHUzMiBjYW52YXNfYmFzZSA9IDEyODsKKyNpZmRlZiBOVjIxCitzdGF0aWMgaW50CWNhbnZhc19udW0gPSAyOyAvKk5WMjEqLworI2Vsc2UKK3N0YXRpYyBpbnQJY2FudmFzX251bSA9IDM7CisjZW5kaWYKKworI2lmIDAKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgdmZwb29sW1ZGX1BPT0xfU0laRV07CisvKnN0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgdmZwb29sMltWRl9QT09MX1NJWkVdOyovCitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICpjdXJfdmZwb29sOworc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVjb3Zlcl9mbGFnOworc3RhdGljIHMzMiB2ZmJ1Zl91c2VbVkZfQlVGX05VTV9NQVhdOworc3RhdGljIHUzMiBzYXZlZF9yZXNvbHV0aW9uOworc3RhdGljIHUzMiBmcmFtZV93aWR0aCwgZnJhbWVfaGVpZ2h0LCBmcmFtZV9kdXIsIGZyYW1lX3Byb2c7CitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgcmVjeWNsZV90aW1lcjsKK3N0YXRpYyB1MzIgc3RhdDsKKyNlbmRpZgorc3RhdGljIHUzMiBidWZfc2l6ZSA9IDMyICogMTAyNCAqIDEwMjQ7CisjaWYgMAorc3RhdGljIHUzMiBidWZfb2Zmc2V0Oworc3RhdGljIHUzMiBhdmlfZmxhZzsKK3N0YXRpYyB1MzIgdmF2c19yYXRpbzsKK3N0YXRpYyB1MzIgcGljX3R5cGU7CisjZW5kaWYKK3N0YXRpYyB1MzIgcHRzX2J5X29mZnNldCA9IDE7CisjaWYgMAorc3RhdGljIHUzMiB0b3RhbF9mcmFtZTsKK3N0YXRpYyB1MzIgbmV4dF9wdHM7CitzdGF0aWMgdW5zaWduZWQgY2hhciB0aHJvd19wYl9mbGFnOworI2lmZGVmIERFQlVHX1BUUworc3RhdGljIHUzMiBwdHNfaGl0LCBwdHNfbWlzc2VkLCBwdHNfaV9oaXQsIHB0c19pX21pc3NlZDsKKyNlbmRpZgorI2VuZGlmCitzdGF0aWMgdTMyIHJhZHIsIHJ2YWw7CitzdGF0aWMgdTMyIGRiZ19jbWQ7CisjaWYgMAorc3RhdGljIHN0cnVjdCBkZWNfc3lzaW5mbyB2YXZzX2Ftc3RyZWFtX2RlY19pbmZvOworc3RhdGljIHN0cnVjdCB2ZGVjX2luZm8gKmd2czsKK3N0YXRpYyB1MzIgZnJfaGludF9zdGF0dXM7CitzdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IG5vdGlmeV93b3JrOworc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBzZXRfY2xrX3dvcms7CitzdGF0aWMgYm9vbCBpc19yZXNldDsKKyNlbmRpZgorLypzdGF0aWMgc3RydWN0IHZkZWNfcyAqdmRlYzsqLworCisjaWZkZWYgQVZTUF9MT05HX0NBQkFDCitzdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IGxvbmdfY2FiYWNfd2Rfd29yazsKK3ZvaWQgKmVzX3dyaXRlX2FkZHJfdmlydDsKK2RtYV9hZGRyX3QgZXNfd3JpdGVfYWRkcl9waHk7CisKK3ZvaWQgKmJpdHN0cmVhbV9yZWFkX3RtcDsKK2RtYV9hZGRyX3QgYml0c3RyZWFtX3JlYWRfdG1wX3BoeTsKK3ZvaWQgKmF2c3BfaGVhcF9hZHI7CitzdGF0aWMgdWludCBsb25nX2NhYmFjX2J1c3k7CisjZW5kaWYKKworI2lmIDAKKyNpZmRlZiBFTkFCTEVfVVNFUl9EQVRBCitzdGF0aWMgdm9pZCAqdXNlcl9kYXRhX2J1ZmZlcjsKK3N0YXRpYyBkbWFfYWRkcl90IHVzZXJfZGF0YV9idWZmZXJfcGh5czsKKyNlbmRpZgorc3RhdGljIERFQ0xBUkVfS0ZJRk8obmV3ZnJhbWVfcSwgc3RydWN0IHZmcmFtZV9zICosIFZGX1BPT0xfU0laRSk7CitzdGF0aWMgREVDTEFSRV9LRklGTyhkaXNwbGF5X3EsIHN0cnVjdCB2ZnJhbWVfcyAqLCBWRl9QT09MX1NJWkUpOworc3RhdGljIERFQ0xBUkVfS0ZJRk8ocmVjeWNsZV9xLCBzdHJ1Y3QgdmZyYW1lX3MgKiwgVkZfUE9PTF9TSVpFKTsKKyNlbmRpZgorc3RhdGljIGlubGluZSB1MzIgaW5kZXgyY2FudmFzKHUzMiBpbmRleCkKK3sKKwljb25zdCB1MzIgY2FudmFzX3RhYltWRl9CVUZfTlVNX01BWF0gPSB7CisJCTB4MDEwMTAwLCAweDAzMDMwMiwgMHgwNTA1MDQsIDB4MDcwNzA2LAorCQkweDA5MDkwOCwgMHgwYjBiMGEsIDB4MGQwZDBjLCAweDBmMGYwZSwKKwkJMHgxMTExMTAsIDB4MTMxMzEyLCAweDE1MTUxNCwgMHgxNzE3MTYsCisJCTB4MTkxOTE4LCAweDFiMWIxYSwgMHgxZDFkMWMsIDB4MWYxZjFlLAorCX07CisJY29uc3QgdTMyIGNhbnZhc190YWJfM1s0XSA9IHsKKwkJMHgwMTAxMDAsIDB4MDQwNDAzLCAweDA3MDcwNiwgMHgwYTBhMDkKKwl9OworCisJaWYgKGNhbnZhc19udW0gPT0gMikKKwkJcmV0dXJuIGNhbnZhc190YWJbaW5kZXhdICsgKGNhbnZhc19iYXNlIDw8IDE2KQorCQkrIChjYW52YXNfYmFzZSA8PCA4KSArIGNhbnZhc19iYXNlOworCisJcmV0dXJuIGNhbnZhc190YWJfM1tpbmRleF0gKyAoY2FudmFzX2Jhc2UgPDwgMTYpCisJCSsgKGNhbnZhc19iYXNlIDw8IDgpICsgY2FudmFzX2Jhc2U7Cit9CisKK3N0YXRpYyBjb25zdCB1MzIgZnJhbWVfcmF0ZV90YWJbMTZdID0geworCTk2MDAwIC8gMzAsCQkvKiBmb3JiaWRkZW4gKi8KKwk5NjAwMDAwMCAvIDIzOTc2LAkvKiAyNDAwMC8xMDAxICgyMy45NjcpICovCisJOTYwMDAgLyAyNCwKKwk5NjAwMCAvIDI1LAorCTk2MDAwMDAgLyAyOTk3LAkJLyogMzAwMDAvMTAwMSAoMjkuOTcpICovCisJOTYwMDAgLyAzMCwKKwk5NjAwMCAvIDUwLAorCTk2MDAwMDAgLyA1OTk0LAkJLyogNjAwMDAvMTAwMSAoNTkuOTQpICovCisJOTYwMDAgLyA2MCwKKwkvKiA+IDggcmVzZXJ2ZWQsIHVzZSAyNCAqLworCTk2MDAwIC8gMjQsIDk2MDAwIC8gMjQsIDk2MDAwIC8gMjQsIDk2MDAwIC8gMjQsCisJOTYwMDAgLyAyNCwgOTYwMDAgLyAyNCwgOTYwMDAgLyAyNAorfTsKKworI2RlZmluZSBERUNPREVfQlVGRkVSX05VTV9NQVggVkZfQlVGX05VTV9NQVgKKyNkZWZpbmUgUElDX1BUU19OVU0gNjQKK3N0cnVjdCBidWZfcG9vbF9zIHsKKwl1bnNpZ25lZCBkZXRhY2hlZDsKKwlzdHJ1Y3QgdmZyYW1lX3MgdmY7Cit9OworCisjZGVmaW5lIGJ1Zl9vZl92Zih2ZikgY29udGFpbmVyX29mKHZmLCBzdHJ1Y3QgYnVmX3Bvb2xfcywgdmYpCisKK3N0cnVjdCBwaWNfcHRzX3MgeworCXUzMiBwdHM7CisJdTY0IHB0czY0OworCXU2NCB0aW1lc3RhbXA7CisJdW5zaWduZWQgc2hvcnQgZGVjb2RlX3BpY19jb3VudDsKK307CisKK3N0cnVjdCB2ZGVjX2F2c19od19zIHsKKwlzcGlubG9ja190IGxvY2s7CisJdW5zaWduZWQgY2hhciBtX2luc19mbGFnOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRmb3JtX2RldjsKKwlERUNMQVJFX0tGSUZPKG5ld2ZyYW1lX3EsIHN0cnVjdCB2ZnJhbWVfcyAqLCBWRl9QT09MX1NJWkUpOworCURFQ0xBUkVfS0ZJRk8oZGlzcGxheV9xLCBzdHJ1Y3QgdmZyYW1lX3MgKiwgVkZfUE9PTF9TSVpFKTsKKwlERUNMQVJFX0tGSUZPKHJlY3ljbGVfcSwgc3RydWN0IHZmcmFtZV9zICosIFZGX1BPT0xfU0laRSk7CisJc3RydWN0IGJ1Zl9wb29sX3MgdmZwb29sW1ZGX1BPT0xfU0laRV07CisJczMyIHZmYnVmX3VzZVtWRl9CVUZfTlVNX01BWF07CisJdW5zaWduZWQgY2hhciBhZ2Fpbl9mbGFnOworCXVuc2lnbmVkIGNoYXIgcmVjb3Zlcl9mbGFnOworCXUzMiBmcmFtZV93aWR0aDsKKwl1MzIgZnJhbWVfaGVpZ2h0OworCXUzMiBmcmFtZV9kdXI7CisJdTMyIGZyYW1lX3Byb2c7CisJdTMyIHNhdmVkX3Jlc29sdXRpb247CisJdTMyIGF2aV9mbGFnOworCXUzMiB2YXZzX3JhdGlvOworCXUzMiBwaWNfdHlwZTsKKworCXUzMiB2Zl9idWZfbnVtX3VzZWQ7CisJdTMyIHRvdGFsX2ZyYW1lOworCXUzMiBuZXh0X3B0czsKKwl1bnNpZ25lZCBjaGFyIHRocm93X3BiX2ZsYWc7CisJc3RydWN0IHBpY19wdHNfcyBwaWNfcHRzW1BJQ19QVFNfTlVNXTsKKwlpbnQgcGljX3B0c193cl9wb3M7CisKKyNpZmRlZiBERUJVR19QVFMKKwl1MzIgcHRzX2hpdDsKKwl1MzIgcHRzX21pc3NlZDsKKwl1MzIgcHRzX2lfaGl0OworCXUzMiBwdHNfaV9taXNzZWQ7CisjZW5kaWYKKyNpZmRlZiBFTkFCTEVfVVNFUl9EQVRBCisJc3RydWN0IHdvcmtfc3RydWN0IHVzZXJkYXRhX3B1c2hfd29yazsKKwl2b2lkICp1c2VyX2RhdGFfYnVmZmVyOworCWRtYV9hZGRyX3QgdXNlcl9kYXRhX2J1ZmZlcl9waHlzOworI2VuZGlmCisJZG1hX2FkZHJfdCBsbWVtX2FkZHI7CisJdWxvbmcgbG1lbV9waHlfYWRkcjsKKworCXUzMiBidWZfb2Zmc2V0OworCisJc3RydWN0IGRlY19zeXNpbmZvIHZhdnNfYW1zdHJlYW1fZGVjX2luZm87CisJc3RydWN0IHZkZWNfaW5mbyAqZ3ZzOworCXUzMiBmcl9oaW50X3N0YXR1czsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc2V0X2Nsa193b3JrOworCWJvb2wgaXNfcmVzZXQ7CisKKwkvKmRlYnVnKi8KKwl1MzIgdWNvZGVfcGF1c2VfcG9zOworCS8qKi8KKwl1MzIgZGVjb2RlX3BpY19jb3VudDsKKwl1OCByZXNldF9kZWNvZGVfZmxhZzsKKwl1MzIgZGlzcGxheV9mcmFtZV9jb3VudDsKKwl1MzIgYnVmX3N0YXR1czsKKwl1MzIgcHJlX3BhcnNlcl93cl9wdHI7CisJCS8qCisJCWJ1ZmZlcl9zdGF0dXMgJj0gfmJ1Zl9yZWN5Y2xlX3N0YXR1cworCQkqLworCXUzMiBidWZfcmVjeWNsZV9zdGF0dXM7CisJdTMyIHNlcWluZm87CisJdTMyIGN0eF92YWxpZDsKKwl1MzIgZGVjX2NvbnRyb2w7CisJdm9pZCAqbW1fYmxrX2hhbmRsZTsKKwlzdHJ1Y3QgdmZyYW1lX2NodW5rX3MgKmNodW5rOworCXUzMiBzdGF0OworCXU4IGluaXRfZmxhZzsKKwl1bnNpZ25lZCBsb25nIGJ1Zl9zdGFydDsKKwl1MzIgYnVmX3NpemU7CisKKwl1MzIgcmVnX3NjcmF0Y2hfMDsKKwl1MzIgcmVnX3NjcmF0Y2hfMTsKKwl1MzIgcmVnX3NjcmF0Y2hfMjsKKwl1MzIgcmVnX3NjcmF0Y2hfMzsKKwl1MzIgcmVnX3NjcmF0Y2hfNDsKKwl1MzIgcmVnX3NjcmF0Y2hfNTsKKwl1MzIgcmVnX3NjcmF0Y2hfNjsKKwl1MzIgcmVnX3NjcmF0Y2hfNzsKKwl1MzIgcmVnX3NjcmF0Y2hfODsKKwl1MzIgcmVnX3NjcmF0Y2hfOTsKKwl1MzIgcmVnX3NjcmF0Y2hfQTsKKwl1MzIgcmVnX3NjcmF0Y2hfQjsKKwl1MzIgcmVnX3NjcmF0Y2hfQzsKKwl1MzIgcmVnX3NjcmF0Y2hfRDsKKwl1MzIgcmVnX3NjcmF0Y2hfRTsKKwl1MzIgcmVnX3NjcmF0Y2hfRjsKKwl1MzIgcmVnX3NjcmF0Y2hfRzsKKwl1MzIgcmVnX3NjcmF0Y2hfSDsKKwl1MzIgcmVnX3NjcmF0Y2hfSTsKKwl1MzIgcmVnX21iX3dpZHRoOworCXUzMiByZWdfdmlmZl9iaXRfY250OworCXUzMiByZWdfY2FudmFzX2FkZHI7CisJdTMyIHJlZ19kYmtyX2NhbnZhc19hZGRyOworCXUzMiByZWdfZGJrd19jYW52YXNfYWRkcjsKKwl1MzIgcmVnX2FuYzJfY2FudmFzX2FkZHI7CisJdTMyIHJlZ19hbmMwX2NhbnZhc19hZGRyOworCXUzMiByZWdfYW5jMV9jYW52YXNfYWRkcjsKKwl1MzIgcmVnX2FuYzNfY2FudmFzX2FkZHI7CisJdTMyIHJlZ19hbmM0X2NhbnZhc19hZGRyOworCXUzMiByZWdfYW5jNV9jYW52YXNfYWRkcjsKKwl1MzIgc2xpY2VfdmVyX3Bvc19waWNfdHlwZTsKKwl1MzIgdmMxX2NvbnRyb2xfcmVnOworCXUzMiBhdnNfY29fbWJfd3JfYWRkcjsKKwl1MzIgc2xpY2Vfc3RhcnRfYnl0ZV8wMTsKKwl1MzIgc2xpY2Vfc3RhcnRfYnl0ZV8yMzsKKwl1MzIgdmNvcF9jdHJsX3JlZzsKKwl1MzIgaXFpZGN0X2NvbnRyb2w7CisJdTMyIHJ2X2FpX21iX2NvdW50OworCXUzMiBzbGljZV9xcDsKKwl1MzIgZGNfc2NhbGVyOworCXUzMiBhdnNwX2lxX3dxX3BhcmFtXzAxOworCXUzMiBhdnNwX2lxX3dxX3BhcmFtXzIzOworCXUzMiBhdnNwX2lxX3dxX3BhcmFtXzQ1OworCXUzMiBhdnNfY29fbWJfcmRfYWRkcjsKKwl1MzIgZGJsa19tYl93aWRfaGVpZ2h0OworCXUzMiBtY19waWNfd19oOworCXUzMiBhdnNfY29fbWJfcndfY3RsOworCXUzMiB2bGRfZGVjb2RlX2NvbnRyb2w7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCBjaGVja190aW1lcjsKKwl1MzIgZGVjb2RlX3RpbWVvdXRfY291bnQ7CisJdW5zaWduZWQgbG9uZyBpbnQgc3RhcnRfcHJvY2Vzc190aW1lOworCXUzMiBsYXN0X3ZsZF9sZXZlbDsKKwl1MzIgZW9zOworCXUzMiBjYW52YXNfc3BlY1tERUNPREVfQlVGRkVSX05VTV9NQVhdOworCXN0cnVjdCBjYW52YXNfY29uZmlnX3MgY2FudmFzX2NvbmZpZ1tERUNPREVfQlVGRkVSX05VTV9NQVhdWzJdOworCisJczMyIHJlZnNbMl07CisJaW50IGRlY19yZXN1bHQ7CisJc3RydWN0IHRpbWVyX2xpc3QgcmVjeWNsZV90aW1lcjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgbm90aWZ5X3dvcms7CisJYXRvbWljX3QgZXJyb3JfaGFuZGxlcl9ydW47CisJc3RydWN0IHdvcmtfc3RydWN0IGZhdGFsX2Vycm9yX3dkX3dvcms7CisJdm9pZCAoKnZkZWNfY2IpKHN0cnVjdCB2ZGVjX3MgKiwgdm9pZCAqKTsKKwl2b2lkICp2ZGVjX2NiX2FyZzsKKy8qIGZvciBlcnJvciBoYW5kbGluZyAqLworCXUzMiBydW5fY291bnQ7CisJdTMyCW5vdF9ydW5fcmVhZHk7CisJdTMyCWlucHV0X2VtcHR5OworCWF0b21pY190IHByZXBhcmVfbnVtOworCWF0b21pY190IHB1dF9udW07CisJYXRvbWljX3QgcGVla19udW07CisJYXRvbWljX3QgZ2V0X251bTsKKwl1MzIgZHJvcF9mcmFtZV9jb3VudDsKKwl1MzIgYnVmZmVyX25vdF9yZWFkeTsKKwlpbnQgZnJhbWVpbmZvX2VuYWJsZTsKKwlzdHJ1Y3QgZmlybXdhcmVfcyAqZnc7CisJdTMyIG9sZF91ZGVidWdfZmxhZzsKKwl1MzIgZGVjb2RlX3N0YXR1c19za2lwX3BpY19kb25lX2ZsYWc7CisJdTMyIGRlY29kZV9kZWNvZGVfY29udF9zdGFydF9jb2RlOworCWludCB2ZGVjX3BnX2VuYWJsZV9mbGFnOworCWNoYXIgdmRlY19uYW1lWzMyXTsKKwljaGFyIHB0c19uYW1lWzMyXTsKKwljaGFyIG5ld19xX25hbWVbMzJdOworCWNoYXIgZGlzcF9xX25hbWVbMzJdOworfTsKKworc3RhdGljIHZvaWQgcmVzZXRfcHJvY2Vzc190aW1lKHN0cnVjdCB2ZGVjX2F2c19od19zICpodyk7CitzdGF0aWMgdm9pZCBzdGFydF9wcm9jZXNzX3RpbWUoc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3KTsKK3N0YXRpYyB2b2lkIHZhdnNfc2F2ZV9yZWdzKHN0cnVjdCB2ZGVjX2F2c19od19zICpodyk7CisKK3N0cnVjdCB2ZGVjX2F2c19od19zICpnaHc7CisKKyNkZWZpbmUgTVVMVElfSU5TVEFOQ0VfUFJPVklERVJfTkFNRSAgICAidmRlYy5hdnMiCisKKyNkZWZpbmUgREVDX1JFU1VMVF9OT05FICAgICAwCisjZGVmaW5lIERFQ19SRVNVTFRfRE9ORSAgICAgMQorI2RlZmluZSBERUNfUkVTVUxUX0FHQUlOICAgIDIKKyNkZWZpbmUgREVDX1JFU1VMVF9FUlJPUiAgICAzCisjZGVmaW5lIERFQ19SRVNVTFRfRk9SQ0VfRVhJVCA0CisjZGVmaW5lIERFQ19SRVNVTFRfRU9TIDUKKyNkZWZpbmUgREVDX1JFU1VMVF9HRVRfREFUQSAgICAgICAgIDYKKyNkZWZpbmUgREVDX1JFU1VMVF9HRVRfREFUQV9SRVRSWSAgIDcKKyNkZWZpbmUgREVDX1JFU1VMVF9VU0VSREFUQSAgICAgICAgIDgKKworI2RlZmluZSBERUNPREVfSUQoaHcpIChody0+bV9pbnNfZmxhZz8gaHdfdG9fdmRlYyhodyktPmlkIDogMCkKKworI2RlZmluZSBQUklOVF9GTEFHX0VSUk9SICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgUFJJTlRfRkxBR19SVU5fRkxPVyAgICAgICAgICAgMFgwMDAxCisjZGVmaW5lIFBSSU5UX0ZMQUdfREVDT0RJTkcgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBQUklOVF9GTEFHX1BUUyAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgUFJJTlRfRkxBR19WRlJBTUVfREVUQUlMCSAgMHgwMDEwCisjZGVmaW5lIFBSSU5UX0ZMQUdfVkxEX0RFVEFJTCAgICAgICAgIDB4MDAyMAorI2RlZmluZSBQUklOVF9GTEFHX0RFQ19ERVRBSUwgICAgICAgICAweDAwNDAKKyNkZWZpbmUgUFJJTlRfRkxBR19CVUZGRVJfREVUQUlMICAgICAgMHgwMDgwCisjZGVmaW5lIFBSSU5UX0ZMQUdfRk9SQ0VfRE9ORSAgICAgICAgIDB4MDEwMAorI2RlZmluZSBQUklOVF9GTEFHX0NPVU5URVIgICAgICAgICAgICAwWDAyMDAKKyNkZWZpbmUgUFJJTlRfRlJBTUVCQVNFX0RBVEEgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFBSSU5UX0ZMQUdfUEFSQV9EQVRBICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBERUJVR19GTEFHX1BSRVBBUkVfTU9SRV9JTlBVVCAweDIwMDAKKyNkZWZpbmUgREVCVUdfRkxBR19QUklOVF9SRUcgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIERFQlVHX0ZMQUdfRElTQUJMRV9USU1FT1VUICAgIDB4MTAwMDAKKyNkZWZpbmUgREVCVUdfV0FJVF9ERUNPREVfRE9ORV9XSEVOX1NUT1AgMHgyMDAwMAorI2RlZmluZSBERUJVR19QSUNfRE9ORV9XSEVOX1VDT0RFX1BBVVNFIDB4NDAwMDAKKworCisjdW5kZWYgREVCVUdfUkVHCisjaWZkZWYgREVCVUdfUkVHCitzdGF0aWMgdm9pZCBXUklURV9WUkVHX0RCRzIodW5zaWduZWQgYWRyLCB1bnNpZ25lZCB2YWwpCit7CisJaWYgKGRlYnVnICYgREVCVUdfRkxBR19QUklOVF9SRUcpCisJCXByX2luZm8oIiVzKCV4LCAleClcbiIsIF9fZnVuY19fLCBhZHIsIHZhbCk7CisJaWYgKGFkciAhPSAwKQorCQlXUklURV9WUkVHKGFkciwgdmFsKTsKK30KKworI3VuZGVmIFdSSVRFX1ZSRUcKKyNkZWZpbmUgV1JJVEVfVlJFRyBXUklURV9WUkVHX0RCRzIKKyNlbmRpZgorCisjdW5kZWYgcHJfaW5mbworI2RlZmluZSBwcl9pbmZvIHByaW50aworc3RhdGljIGludCBkZWJ1Z19wcmludChzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcsCisJaW50IGZsYWcsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworI2RlZmluZSBBVlNfUFJJTlRfQlVGCQkyNTYKKwl1bnNpZ25lZCBjaGFyIGJ1ZltBVlNfUFJJTlRfQlVGXTsKKwlpbnQgbGVuID0gMDsKKwlpbnQgaW5kZXggPSAwOworCWlmIChodykKKwkJaW5kZXggPSBody0+bV9pbnNfZmxhZyA/IERFQ09ERV9JRChodykgOiAwOworCWlmIChodyA9PSBOVUxMIHx8CisJCShmbGFnID09IDApIHx8CisJCSgoZGVidWdfbWFzayAmCisJCSgxIDw8IGluZGV4KSkKKwkJJiYgKGRlYnVnICYgZmxhZykpKSB7CisJCXZhX2xpc3QgYXJnczsKKworCQl2YV9zdGFydChhcmdzLCBmbXQpOworCQlpZiAoaHcpCisJCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIlslZF0iLCBpbmRleCk7CisJCXZzbnByaW50ZihidWYgKyBsZW4sIEFWU19QUklOVF9CVUYgLSBsZW4sIGZtdCwgYXJncyk7CisJCXByX2luZm8oIiVzIiwgYnVmKTsKKwkJdmFfZW5kKGFyZ3MpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWJ1Z19wcmludF9jb250KHN0cnVjdCB2ZGVjX2F2c19od19zICpodywKKwlpbnQgZmxhZywgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdW5zaWduZWQgY2hhciBidWZbQVZTX1BSSU5UX0JVRl07CisJaW50IGxlbiA9IDA7CisJaW50IGluZGV4ID0gMDsKKwlpZiAoaHcpCisJCWluZGV4ID0gaHctPm1faW5zX2ZsYWcgPyBERUNPREVfSUQoaHcpIDogMDsKKwlpZiAoaHcgPT0gTlVMTCB8fAorCQkoZmxhZyA9PSAwKSB8fAorCQkoKGRlYnVnX21hc2sgJgorCQkoMSA8PCBpbmRleCkpCisJCSYmIChkZWJ1ZyAmIGZsYWcpKSkgeworCQl2YV9saXN0IGFyZ3M7CisKKwkJdmFfc3RhcnQoYXJncywgZm10KTsKKwkJdnNucHJpbnRmKGJ1ZiArIGxlbiwgQVZTX1BSSU5UX0JVRiAtIGxlbiwgZm10LCBhcmdzKTsKKwkJcHJfaW5mbygiJXMiLCBidWYpOworCQl2YV9lbmQoYXJncyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhdnNfcHRzX2NoZWNrX2luKHN0cnVjdCB2ZGVjX2F2c19od19zICpodywKKwl1bnNpZ25lZCBzaG9ydCBkZWNvZGVfcGljX2NvdW50LCBzdHJ1Y3QgdmZyYW1lX2NodW5rX3MgKmNodW5rKQoreworCWlmIChjaHVuaykKKwkJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfUFRTLAorCQkJIiVzICVkICh3ciBwb3MgJWQpLCBwdHMgJWQgcHRzNjQgJWxkIHRpbWVzdGFtcCAlbGRcbiIsCisJCQlfX2Z1bmNfXywgZGVjb2RlX3BpY19jb3VudCwgaHctPnBpY19wdHNfd3JfcG9zLAorCQkJY2h1bmstPnB0cywgKHU2NCkoY2h1bmstPnB0czY0KSwgKHU2NCkoY2h1bmstPnRpbWVzdGFtcCkpOworCWVsc2UKKwkJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfUFRTLAorCQkJIiVzICVkLCBjaHVuayBpcyBudWxsXG4iLAorCQkJX19mdW5jX18sIGRlY29kZV9waWNfY291bnQpOworCisJaWYgKGNodW5rKSB7CisJCWh3LT5waWNfcHRzW2h3LT5waWNfcHRzX3dyX3Bvc10ucHRzID0gY2h1bmstPnB0czsKKwkJaHctPnBpY19wdHNbaHctPnBpY19wdHNfd3JfcG9zXS5wdHM2NCA9IGNodW5rLT5wdHM2NDsKKwkJaHctPnBpY19wdHNbaHctPnBpY19wdHNfd3JfcG9zXS50aW1lc3RhbXAgPSBjaHVuay0+dGltZXN0YW1wOworCX0gZWxzZSB7CisJCWh3LT5waWNfcHRzW2h3LT5waWNfcHRzX3dyX3Bvc10ucHRzID0gMDsKKwkJaHctPnBpY19wdHNbaHctPnBpY19wdHNfd3JfcG9zXS5wdHM2NCA9IDA7CisJCWh3LT5waWNfcHRzW2h3LT5waWNfcHRzX3dyX3Bvc10udGltZXN0YW1wID0gMDsKKwl9CisJaHctPnBpY19wdHNbaHctPnBpY19wdHNfd3JfcG9zXS5kZWNvZGVfcGljX2NvdW50CisJCT0gZGVjb2RlX3BpY19jb3VudDsKKwlody0+cGljX3B0c193cl9wb3MrKzsKKwlpZiAoaHctPnBpY19wdHNfd3JfcG9zID49IFBJQ19QVFNfTlVNKQorCQlody0+cGljX3B0c193cl9wb3MgPSAwOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfcHRzX2J1ZihzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcpCit7CisJaW50IGk7CisJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfUFRTLAorCQkJIiVzXG4iLAlfX2Z1bmNfXyk7CisJaHctPnBpY19wdHNfd3JfcG9zID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgUElDX1BUU19OVU07IGkrKykgeworCQlody0+cGljX3B0c1tody0+cGljX3B0c193cl9wb3NdLnB0cyA9IDA7CisJCWh3LT5waWNfcHRzW2h3LT5waWNfcHRzX3dyX3Bvc10ucHRzNjQgPSAwOworCQlody0+cGljX3B0c1tody0+cGljX3B0c193cl9wb3NdLnRpbWVzdGFtcCA9IDA7CisJCWh3LT5waWNfcHRzW2h3LT5waWNfcHRzX3dyX3Bvc10uZGVjb2RlX3BpY19jb3VudCA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IHNldF92ZnJhbWVfcHRzKHN0cnVjdCB2ZGVjX2F2c19od19zICpodywKKwl1bnNpZ25lZCBzaG9ydCBkZWNvZGVfcGljX2NvdW50LCBzdHJ1Y3QgdmZyYW1lX3MgKnZmKQoreworCWludCBpOworCWludCByZXQgPSAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgUElDX1BUU19OVU07IGkrKykgeworCQlpZiAoaHctPnBpY19wdHNbaV0uZGVjb2RlX3BpY19jb3VudCA9PSBkZWNvZGVfcGljX2NvdW50KSB7CisJCQl2Zi0+cHRzID0gaHctPnBpY19wdHNbaV0ucHRzOworCQkJdmYtPnB0c191czY0ID0gaHctPnBpY19wdHNbaV0ucHRzNjQ7CisJCQl2Zi0+dGltZXN0YW1wID0gaHctPnBpY19wdHNbaV0udGltZXN0YW1wOworCQkJcmV0ID0gMDsKKwkJCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX1BUUywKKwkJCQkiJXMgJWQgKHJkIHBvcyAlZCksIHB0cyAlZCBwdHM2NCAlbGQgdGltZXN0YW1wICVsZFxuIiwKKwkJCQlfX2Z1bmNfXywgZGVjb2RlX3BpY19jb3VudCwgaSwKKwkJCQl2Zi0+cHRzLCB2Zi0+cHRzX3VzNjQsIHZmLT50aW1lc3RhbXApOworCisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBhdnNfdmZfbm90aWZ5X3JlY2VpdmVyKHN0cnVjdCB2ZGVjX2F2c19od19zICpodywKKwljb25zdCBjaGFyICpwcm92aWRlcl9uYW1lLCBpbnQgZXZlbnRfdHlwZSwgdm9pZCAqZGF0YSkKK3sKKwlpZiAoaHctPm1faW5zX2ZsYWcpCisJCXZmX25vdGlmeV9yZWNlaXZlcihod190b192ZGVjKGh3KS0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCWV2ZW50X3R5cGUsIGRhdGEpOworCWVsc2UKKwkJdmZfbm90aWZ5X3JlY2VpdmVyKHByb3ZpZGVyX25hbWUsIGV2ZW50X3R5cGUsIGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBzZXRfZnJhbWVfaW5mbyhzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcsIHN0cnVjdCB2ZnJhbWVfcyAqdmYsCisJdW5zaWduZWQgaW50ICpkdXJhdGlvbikKK3sKKwlpbnQgYXIgPSAwOworCisJdW5zaWduZWQgaW50IHBpeGVsX3JhdGlvID0gUkVBRF9WUkVHKEFWU19QSUNfUkFUSU8pOworCWF0b21pY19hZGQoMSwgJmh3LT5wcmVwYXJlX251bSk7CisjaWZuZGVmIFVTRV9BVlNfU0VRX0lORk8KKwlpZiAoaHctPnZhdnNfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGggPiAwCisJCSYmIGh3LT52YXZzX2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodCA+IDApIHsKKwkJdmYtPndpZHRoID0gaHctPnZhdnNfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGg7CisJCXZmLT5oZWlnaHQgPSBody0+dmF2c19hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQ7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCXZmLT53aWR0aCA9IFJFQURfVlJFRyhBVlNfUElDX1dJRFRIKTsKKwkJdmYtPmhlaWdodCA9IFJFQURfVlJFRyhBVlNfUElDX0hFSUdIVCk7CisJCWh3LT5mcmFtZV93aWR0aCA9IHZmLT53aWR0aDsKKwkJaHctPmZyYW1lX2hlaWdodCA9IHZmLT5oZWlnaHQ7CisJCS8qIHByX2luZm8oIiVzOiAoJWQsJWQpXG4iLCBfX2Z1bmNfXyx2Zi0+d2lkdGgsIHZmLT5oZWlnaHQpOyovCisJfQorCisjaWZuZGVmIFVTRV9BVlNfU0VRX0lORk8KKwlpZiAoaHctPnZhdnNfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSA+IDApCisJCSpkdXJhdGlvbiA9IGh3LT52YXZzX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGU7CisJZWxzZQorI2VuZGlmCisJeworCQkqZHVyYXRpb24gPSBmcmFtZV9yYXRlX3RhYltSRUFEX1ZSRUcoQVZTX0ZSQU1FX1JBVEUpICYgMHhmXTsKKwkJLyogcHJfaW5mbygiJXM6IGR1cmF0aW9uID0gJWRcbiIsIF9fZnVuY19fLCAqZHVyYXRpb24pOyAqLworCQlody0+ZnJhbWVfZHVyID0gKmR1cmF0aW9uOworCQlzY2hlZHVsZV93b3JrKCZody0+bm90aWZ5X3dvcmspOworCX0KKworCWlmIChody0+dmF2c19yYXRpbyA9PSAwKSB7CisJCS8qIGFsd2F5cyBzdHJldGNoIHRvIDE2OjkgKi8KKwkJdmYtPnJhdGlvX2NvbnRyb2wgfD0gKDB4OTAgPDwKKwkJCQlESVNQX1JBVElPX0FTUEVDVF9SQVRJT19CSVQpOworCQl2Zi0+c2FyX3dpZHRoID0gMTsKKwkJdmYtPnNhcl9oZWlnaHQgPSAxOworCX0gZWxzZSB7CisJCXN3aXRjaCAocGl4ZWxfcmF0aW8pIHsKKwkJY2FzZSAxOgorCQkJdmYtPnNhcl93aWR0aCA9IDE7CisJCQl2Zi0+c2FyX2hlaWdodCA9IDE7CisJCQlhciA9ICh2Zi0+aGVpZ2h0ICogaHctPnZhdnNfcmF0aW8pIC8gdmYtPndpZHRoOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXZmLT5zYXJfd2lkdGggPSA0OworCQkJdmYtPnNhcl9oZWlnaHQgPSAzOworCQkJYXIgPSAodmYtPmhlaWdodCAqIDMgKiBody0+dmF2c19yYXRpbykgLyAodmYtPndpZHRoICogNCk7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJdmYtPnNhcl93aWR0aCA9IDE2OworCQkJdmYtPnNhcl9oZWlnaHQgPSA5OworCQkJYXIgPSAodmYtPmhlaWdodCAqIDkgKiBody0+dmF2c19yYXRpbykgLyAodmYtPndpZHRoICogMTYpOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCXZmLT5zYXJfd2lkdGggPSAyMjE7CisJCQl2Zi0+c2FyX2hlaWdodCA9IDEwMDsKKwkJCWFyID0gKHZmLT5oZWlnaHQgKiAxMDAgKiBody0+dmF2c19yYXRpbykgLyAodmYtPndpZHRoICoKKwkJCQkJMjIxKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdmYtPnNhcl93aWR0aCA9IDE7CisJCQl2Zi0+c2FyX2hlaWdodCA9IDE7CisJCQlhciA9ICh2Zi0+aGVpZ2h0ICogaHctPnZhdnNfcmF0aW8pIC8gdmYtPndpZHRoOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlhciA9IG1pbihhciwgRElTUF9SQVRJT19BU1BFQ1RfUkFUSU9fTUFYKTsKKworCXZmLT5yYXRpb19jb250cm9sID0gKGFyIDw8IERJU1BfUkFUSU9fQVNQRUNUX1JBVElPX0JJVCk7CisJLyp2Zi0+cmF0aW9fY29udHJvbCB8PSBESVNQX1JBVElPX0ZPUkNFQ09ORklHIHwgRElTUF9SQVRJT19LRUVQUkFUSU87ICovCisKKwl2Zi0+ZmxhZyA9IDA7CisJYnVmX29mX3ZmKHZmKS0+ZGV0YWNoZWQgPSAwOworCit9CisKKyNpZmRlZiBFTkFCTEVfVVNFUl9EQVRBCisKKy8qc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCB1c2VyZGF0YV9wdXNoX3dvcms7Ki8KKy8qCisjZGVmaW5lIERVTVBfTEFTVF9SRVBPUlRFRF9VU0VSX0RBVEEKKyovCitzdGF0aWMgdm9pZCB1c2VyZGF0YV9wdXNoX3Byb2Nlc3Moc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3KQoreworCXVuc2lnbmVkIGludCB1c2VyX2RhdGFfZmxhZ3M7CisJdW5zaWduZWQgaW50IHVzZXJfZGF0YV93cDsKKwl1bnNpZ25lZCBpbnQgdXNlcl9kYXRhX2xlbmd0aDsKKwlzdHJ1Y3QgdXNlcmRhdGFfcG9jX2luZm9fdCB1c2VyX2RhdGFfcG9jOworI2lmZGVmIERVTVBfTEFTVF9SRVBPUlRFRF9VU0VSX0RBVEEKKwlpbnQgdXNlcl9kYXRhX2xlbjsKKwlpbnQgd3Bfc3RhcnQ7CisJdW5zaWduZWQgY2hhciAqcGRhdGE7CisJaW50IG5MZWZ0OworI2VuZGlmCisKKwl1c2VyX2RhdGFfZmxhZ3MgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9OKTsKKwl1c2VyX2RhdGFfd3AgPSAodXNlcl9kYXRhX2ZsYWdzID4+IDE2KSAmIDB4ZmZmZjsKKwl1c2VyX2RhdGFfbGVuZ3RoID0gdXNlcl9kYXRhX2ZsYWdzICYgMHg3ZmZmOworCisjaWZkZWYgRFVNUF9MQVNUX1JFUE9SVEVEX1VTRVJfREFUQQorCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCWh3LT51c2VyX2RhdGFfYnVmZmVyX3BoeXMsIFVTRVJfREFUQV9TSVpFLAorCQkJRE1BX0ZST01fREVWSUNFKTsKKworCWlmICh1c2VyX2RhdGFfbGVuZ3RoICYgMHgwNykKKwkJdXNlcl9kYXRhX2xlbiA9ICh1c2VyX2RhdGFfbGVuZ3RoICsgOCkgJiAweEZGRkZGRkY4OworCWVsc2UKKwkJdXNlcl9kYXRhX2xlbiA9IHVzZXJfZGF0YV9sZW5ndGg7CisKKwlpZiAodXNlcl9kYXRhX3dwID49IHVzZXJfZGF0YV9sZW4pIHsKKwkJd3Bfc3RhcnQgPSB1c2VyX2RhdGFfd3AgLSB1c2VyX2RhdGFfbGVuOworCisJCXBkYXRhID0gKHVuc2lnbmVkIGNoYXIgKilody0+dXNlcl9kYXRhX2J1ZmZlcjsKKwkJcGRhdGEgKz0gd3Bfc3RhcnQ7CisJCW5MZWZ0ID0gdXNlcl9kYXRhX2xlbjsKKwkJd2hpbGUgKG5MZWZ0ID49IDgpIHsKKwkJCXByX2luZm8oIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCQlwZGF0YVswXSwgcGRhdGFbMV0sIHBkYXRhWzJdLCBwZGF0YVszXSwKKwkJCQlwZGF0YVs0XSwgcGRhdGFbNV0sIHBkYXRhWzZdLCBwZGF0YVs3XSk7CisJCQluTGVmdCAtPSA4OworCQkJcGRhdGEgKz0gODsKKwkJfQorCX0gZWxzZSB7CisJCXdwX3N0YXJ0ID0gdXNlcl9kYXRhX3dwICsKKwkJCVVTRVJfREFUQV9TSVpFIC0gdXNlcl9kYXRhX2xlbjsKKworCQlwZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopaHctPnVzZXJfZGF0YV9idWZmZXI7CisJCXBkYXRhICs9IHdwX3N0YXJ0OworCQluTGVmdCA9IFVTRVJfREFUQV9TSVpFIC0gd3Bfc3RhcnQ7CisKKwkJd2hpbGUgKG5MZWZ0ID49IDgpIHsKKwkJCXByX2luZm8oIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCQlwZGF0YVswXSwgcGRhdGFbMV0sIHBkYXRhWzJdLCBwZGF0YVszXSwKKwkJCQlwZGF0YVs0XSwgcGRhdGFbNV0sIHBkYXRhWzZdLCBwZGF0YVs3XSk7CisJCQluTGVmdCAtPSA4OworCQkJcGRhdGEgKz0gODsKKwkJfQorCisJCXBkYXRhID0gKHVuc2lnbmVkIGNoYXIgKilody0+dXNlcl9kYXRhX2J1ZmZlcjsKKwkJbkxlZnQgPSB1c2VyX2RhdGFfd3A7CisJCXdoaWxlIChuTGVmdCA+PSA4KSB7CisJCQlwcl9pbmZvKCIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQkJcGRhdGFbMF0sIHBkYXRhWzFdLCBwZGF0YVsyXSwgcGRhdGFbM10sCisJCQkJcGRhdGFbNF0sIHBkYXRhWzVdLCBwZGF0YVs2XSwgcGRhdGFbN10pOworCQkJbkxlZnQgLT0gODsKKwkJCXBkYXRhICs9IDg7CisJCX0KKwl9CisjZW5kaWYKKworLyoKKwlwcl9pbmZvKCJwb2NpbmZvIDB4JXgsIHBvYyAlZCwgd3AgMHgleCwgbGVuICVkXG4iLAorCQkgICBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9MKSwgUkVBRF9WUkVHKEFWX1NDUkFUQ0hfTSksCisJCSAgIHVzZXJfZGF0YV93cCwgdXNlcl9kYXRhX2xlbmd0aCk7CisqLworCXVzZXJfZGF0YV9wb2MucG9jX2luZm8gPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9MKTsKKwl1c2VyX2RhdGFfcG9jLnBvY19udW1iZXIgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9NKTsKKworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9OLCAwKTsKKy8qCisJd2FrZXVwX3VzZXJkYXRhX3BvbGwodXNlcl9kYXRhX3BvYywgdXNlcl9kYXRhX3dwLAorCQkJCSh1bnNpZ25lZCBsb25nKWh3LT51c2VyX2RhdGFfYnVmZmVyLAorCQkJCVVTRVJfREFUQV9TSVpFLCB1c2VyX2RhdGFfbGVuZ3RoKTsKKyovCit9CisKK3N0YXRpYyB2b2lkIHVzZXJkYXRhX3B1c2hfZG9fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3ID0KKwljb250YWluZXJfb2Yod29yaywgc3RydWN0IHZkZWNfYXZzX2h3X3MsIHVzZXJkYXRhX3B1c2hfd29yayk7CisJdXNlcmRhdGFfcHVzaF9wcm9jZXNzKGh3KTsKK30KKworc3RhdGljIHU4IFVzZXJEYXRhSGFuZGxlcihzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcpCit7CisJdW5zaWduZWQgaW50IHVzZXJfZGF0YV9mbGFnczsKKworCXVzZXJfZGF0YV9mbGFncyA9IFJFQURfVlJFRyhBVl9TQ1JBVENIX04pOworCWlmICh1c2VyX2RhdGFfZmxhZ3MgJiAoMSA8PCAxNSkpIHsJLyogZGF0YSByZWFkeSAqLworCQlpZiAoaHctPm1faW5zX2ZsYWcpIHsKKwkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9VU0VSREFUQTsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJcmV0dXJuIDE7CisJCX0gZWxzZQorCQkJc2NoZWR1bGVfd29yaygmaHctPnVzZXJkYXRhX3B1c2hfd29yayk7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKKworc3RhdGljIGlubGluZSB2b2lkIGF2c191cGRhdGVfZ3ZzKHN0cnVjdCB2ZGVjX2F2c19od19zICpodykKK3sKKwlpZiAoaHctPmd2cy0+ZnJhbWVfaGVpZ2h0ICE9IGh3LT5mcmFtZV9oZWlnaHQpIHsKKwkJaHctPmd2cy0+ZnJhbWVfd2lkdGggPSBody0+ZnJhbWVfd2lkdGg7CisJCWh3LT5ndnMtPmZyYW1lX2hlaWdodCA9IGh3LT5mcmFtZV9oZWlnaHQ7CisJfQorCWlmIChody0+Z3ZzLT5mcmFtZV9kdXIgIT0gaHctPmZyYW1lX2R1cikgeworCQlody0+Z3ZzLT5mcmFtZV9kdXIgPSBody0+ZnJhbWVfZHVyOworCQlpZiAoaHctPmZyYW1lX2R1ciAhPSAwKQorCQkJaHctPmd2cy0+ZnJhbWVfcmF0ZSA9ICgoOTYwMDAgKiAxMCAvIGh3LT5mcmFtZV9kdXIpICUgMTApIDwgNSA/CisJCQkJCTk2MDAwIC8gaHctPmZyYW1lX2R1ciA6ICg5NjAwMCAvIGh3LT5mcmFtZV9kdXIgKzEpOworCQllbHNlCisJCQlody0+Z3ZzLT5mcmFtZV9yYXRlID0gLTE7CisJfQorCisJaHctPmd2cy0+c3RhdHVzID0gaHctPnN0YXQ7CisJaHctPmd2cy0+ZXJyb3JfY291bnQgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9DKTsKKwlody0+Z3ZzLT5kcm9wX2ZyYW1lX2NvdW50ID0gaHctPmRyb3BfZnJhbWVfY291bnQ7CisKK30KKworI2lmZGVmIEhBTkRMRV9BVlNfSVJRCitzdGF0aWMgaXJxcmV0dXJuX3QgdmF2c19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorI2Vsc2UKK3N0YXRpYyB2b2lkIHZhdnNfaXNyKHZvaWQpCisjZW5kaWYKK3sKKwlXUklURV9WUkVHKEFTU0lTVF9NQk9YMV9DTFJfUkVHLCAxKTsKKworCXJldHVybiBJUlFfV0FLRV9USFJFQUQ7Cit9CisvKgorICpzdGF0aWMgaW50IHJ1bl9mbGFnID0gMTsKKyAqc3RhdGljIGludCBzdGVwX2ZsYWc7CisgKi8KK3N0YXRpYyBpbnQgZXJyb3JfcmVjb3ZlcnlfbW9kZTsgICAvKjA6IGJsb2NreSAgMTogbW9zYWljKi8KKy8qCisgKnN0YXRpYyB1aW50IGVycm9yX3dhdGNoZG9nX3RocmVzaG9sZD0xMDsKKyAqc3RhdGljIHVpbnQgZXJyb3Jfd2F0Y2hkb2dfY291bnQ7CisgKnN0YXRpYyB1aW50IGVycm9yX3dhdGNoZG9nX2J1Zl90aHJlc2hvbGQgPSAweDQwMDAwMDA7CisgKi8KKworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyAqdmF2c192Zl9wZWVrKHZvaWQgKm9wX2FyZykKK3sKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmOworCXN0cnVjdCB2ZGVjX2F2c19od19zICpodyA9CisJKHN0cnVjdCB2ZGVjX2F2c19od19zICopb3BfYXJnOworCWF0b21pY19hZGQoMSwgJmh3LT5wZWVrX251bSk7CisJaWYgKHN0ZXAgPT0gMikKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGh3LT5yZWNvdmVyX2ZsYWcpCisJCXJldHVybiBOVUxMOworCisJaWYgKGtmaWZvX3BlZWsoJmh3LT5kaXNwbGF5X3EsICZ2ZikpIHsKKwkJaWYgKHZmKSB7CisJCQlpZiAoZm9yY2VfZnBzICYgMHgxMDApIHsKKwkJCQl1MzIgcmF0ZSA9IGZvcmNlX2ZwcyAmIDB4ZmY7CisKKwkJCQlpZiAocmF0ZSkKKwkJCQkJdmYtPmR1cmF0aW9uID0gOTYwMDAvcmF0ZTsKKwkJCQllbHNlCisJCQkJCXZmLT5kdXJhdGlvbiA9IDA7CisJCQl9CisKKwkJfQorCQlyZXR1cm4gdmY7CisJfQorCisJcmV0dXJuIE5VTEw7CisKK30KKworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyAqdmF2c192Zl9nZXQodm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCB2ZnJhbWVfcyAqdmY7CisJc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3ID0KKwkoc3RydWN0IHZkZWNfYXZzX2h3X3MgKilvcF9hcmc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChody0+cmVjb3Zlcl9mbGFnKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChzdGVwID09IDIpCisJCXJldHVybiBOVUxMOworCWVsc2UgaWYgKHN0ZXAgPT0gMSkKKwkJc3RlcCA9IDI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCWlmIChrZmlmb19nZXQoJmh3LT5kaXNwbGF5X3EsICZ2ZikpIHsKKwkJaWYgKHZmKSB7CisJCQl2Zi0+aW5kZXhfZGlzcCA9IGF0b21pY19yZWFkKCZody0+Z2V0X251bSk7CisJCQlhdG9taWNfYWRkKDEsICZody0+Z2V0X251bSk7CisJCQlpZiAoZm9yY2VfZnBzICYgMHgxMDApIHsKKwkJCQl1MzIgcmF0ZSA9IGZvcmNlX2ZwcyAmIDB4ZmY7CisKKwkJCQlpZiAocmF0ZSkKKwkJCQkJdmYtPmR1cmF0aW9uID0gOTYwMDAvcmF0ZTsKKwkJCQllbHNlCisJCQkJCXZmLT5kdXJhdGlvbiA9IDA7CisJCQl9CisKKwkJCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX1ZGUkFNRV9ERVRBSUwsCisJCQkJIiVzLCBpbmRleCA9ICVkLCB3ICVkIGggJWQsIHR5cGUgMHgleCBkZXRhY2hlZCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQl2Zi0+aW5kZXgsCisJCQkJdmYtPndpZHRoLAorCQkJCXZmLT5oZWlnaHQsCisJCQkJdmYtPnR5cGUsCisJCQkJYnVmX29mX3ZmKHZmKS0+ZGV0YWNoZWQpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHZmOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gTlVMTDsKKworfQorCitzdGF0aWMgdm9pZCB2YXZzX3ZmX3B1dChzdHJ1Y3QgdmZyYW1lX3MgKnZmLCB2b2lkICpvcF9hcmcpCit7CisJaW50IGk7CisJc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3ID0KKwkoc3RydWN0IHZkZWNfYXZzX2h3X3MgKilvcF9hcmc7CisKKwlpZiAodmYpIHsKKwkJYXRvbWljX2FkZCgxLCAmaHctPnB1dF9udW0pOworCQlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19WRlJBTUVfREVUQUlMLAorCQkJIiVzLCBpbmRleCA9ICVkLCB3ICVkIGggJWQsIHR5cGUgMHgleCBkZXRhY2hlZCAweCV4XG4iLAorCQkJX19mdW5jX18sCisJCQl2Zi0+aW5kZXgsCisJCQl2Zi0+d2lkdGgsCisJCQl2Zi0+aGVpZ2h0LAorCQkJdmYtPnR5cGUsCisJCQlidWZfb2ZfdmYodmYpLT5kZXRhY2hlZCk7CisJfQorCWlmIChody0+cmVjb3Zlcl9mbGFnKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgVkZfUE9PTF9TSVpFOyBpKyspIHsKKwkJaWYgKHZmID09ICZody0+dmZwb29sW2ldLnZmKQorCQkJYnJlYWs7CisJfQorCWlmIChpIDwgVkZfUE9PTF9TSVpFKQorCisJCWtmaWZvX3B1dCgmaHctPnJlY3ljbGVfcSwgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKworfQorCitzdGF0aWMgaW50IHZhdnNfZXZlbnRfY2IoaW50IHR5cGUsIHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGVfZGF0YSkKK3sKKwlzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcgPSAoc3RydWN0IHZkZWNfYXZzX2h3X3MgKilwcml2YXRlX2RhdGE7CisKKwlpZiAodHlwZSAmIFZGUkFNRV9FVkVOVF9SRUNFSVZFUl9SRVFfU1RBVEUpIHsKKwkJc3RydWN0IHByb3ZpZGVyX3N0YXRlX3JlcV9zICpyZXEgPQorCQkJKHN0cnVjdCBwcm92aWRlcl9zdGF0ZV9yZXFfcyAqKWRhdGE7CisJCWlmIChyZXEtPnJlcV90eXBlID09IFJFUV9TVEFURV9TRUNVUkUpCisJCQlyZXEtPnJlcV9yZXN1bHRbMF0gPSB2ZGVjX3NlY3VyZShod190b192ZGVjKGh3KSk7CisJCWVsc2UKKwkJCXJlcS0+cmVxX3Jlc3VsdFswXSA9IDB4ZmZmZmZmZmY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmF2c19kZWNfc3RhdHVzKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHN0cnVjdCB2ZGVjX2luZm8gKnZzdGF0dXMpCit7CisJc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3ID0KKwkoc3RydWN0IHZkZWNfYXZzX2h3X3MgKil2ZGVjLT5wcml2YXRlOworCS8qaWYgKCEoaHctPnN0YXQgJiBTVEFUX1ZERUNfUlVOKSkKKwkJcmV0dXJuIC0xOyovCisJaWYgKCFodykKKwkJcmV0dXJuIC0xOworCisJdnN0YXR1cy0+ZnJhbWVfd2lkdGggPSBody0+ZnJhbWVfd2lkdGg7CisJdnN0YXR1cy0+ZnJhbWVfaGVpZ2h0ID0gaHctPmZyYW1lX2hlaWdodDsKKwlpZiAoaHctPmZyYW1lX2R1ciAhPSAwKQorCQl2c3RhdHVzLT5mcmFtZV9yYXRlID0gKCg5NjAwMCAqIDEwIC8gaHctPmZyYW1lX2R1cikgJSAxMCkgPCA1ID8KKwkJCQk5NjAwMCAvIGh3LT5mcmFtZV9kdXIgOiAoOTYwMDAgLyBody0+ZnJhbWVfZHVyICsxKTsKKwllbHNlCisJCXZzdGF0dXMtPmZyYW1lX3JhdGUgPSAtMTsKKwl2c3RhdHVzLT5lcnJvcl9jb3VudCA9IFJFQURfVlJFRyhBVl9TQ1JBVENIX0MpOworCXZzdGF0dXMtPnN0YXR1cyA9IGh3LT5zdGF0OworCXZzdGF0dXMtPmJpdF9yYXRlID0gaHctPmd2cy0+Yml0X3JhdGU7CisJdnN0YXR1cy0+ZnJhbWVfZHVyID0gaHctPmZyYW1lX2R1cjsKKwl2c3RhdHVzLT5mcmFtZV9kYXRhID0gaHctPmd2cy0+ZnJhbWVfZGF0YTsKKwl2c3RhdHVzLT50b3RhbF9kYXRhID0gaHctPmd2cy0+dG90YWxfZGF0YTsKKwl2c3RhdHVzLT5mcmFtZV9jb3VudCA9IGh3LT5ndnMtPmZyYW1lX2NvdW50OworCXZzdGF0dXMtPmVycm9yX2ZyYW1lX2NvdW50ID0gaHctPmd2cy0+ZXJyb3JfZnJhbWVfY291bnQ7CisJdnN0YXR1cy0+ZHJvcF9mcmFtZV9jb3VudCA9IGh3LT5ndnMtPmRyb3BfZnJhbWVfY291bnQ7CisJdnN0YXR1cy0+aV9kZWNvZGVkX2ZyYW1lcyA9IGh3LT5ndnMtPmlfZGVjb2RlZF9mcmFtZXM7CisJdnN0YXR1cy0+aV9sb3N0X2ZyYW1lcyA9IGh3LT5ndnMtPmlfbG9zdF9mcmFtZXM7CisJdnN0YXR1cy0+aV9jb25jZWFsZWRfZnJhbWVzID0gaHctPmd2cy0+aV9jb25jZWFsZWRfZnJhbWVzOworCXZzdGF0dXMtPnBfZGVjb2RlZF9mcmFtZXMgPSBody0+Z3ZzLT5wX2RlY29kZWRfZnJhbWVzOworCXZzdGF0dXMtPnBfbG9zdF9mcmFtZXMgPSBody0+Z3ZzLT5wX2xvc3RfZnJhbWVzOworCXZzdGF0dXMtPnBfY29uY2VhbGVkX2ZyYW1lcyA9IGh3LT5ndnMtPnBfY29uY2VhbGVkX2ZyYW1lczsKKwl2c3RhdHVzLT5iX2RlY29kZWRfZnJhbWVzID0gaHctPmd2cy0+Yl9kZWNvZGVkX2ZyYW1lczsKKwl2c3RhdHVzLT5iX2xvc3RfZnJhbWVzID0gaHctPmd2cy0+Yl9sb3N0X2ZyYW1lczsKKwl2c3RhdHVzLT5iX2NvbmNlYWxlZF9mcmFtZXMgPSBody0+Z3ZzLT5iX2NvbmNlYWxlZF9mcmFtZXM7CisJdnN0YXR1cy0+dG90YWxfZGF0YSA9IGh3LT5ndnMtPnRvdGFsX2RhdGE7CisJdnN0YXR1cy0+c2FtcF9jbnQgPSBody0+Z3ZzLT5zYW1wX2NudDsKKwl2c3RhdHVzLT5vZmZzZXQgPSBody0+Z3ZzLT5vZmZzZXQ7CisJc25wcmludGYodnN0YXR1cy0+dmRlY19uYW1lLCBzaXplb2YodnN0YXR1cy0+dmRlY19uYW1lKSwKKwkJIiVzIiwgRFJJVkVSX05BTUUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmF2c19zZXRfaXNyZXNldChzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgaXNyZXNldCkKK3sKKwlzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcgPQorCShzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisKKwlody0+aXNfcmVzZXQgPSBpc3Jlc2V0OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZhdnNfdmRlY19pbmZvX2luaXQoc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3KQoreworCisJaHctPmd2cyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZGVjX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoTlVMTCA9PSBody0+Z3ZzKSB7CisJCXByX2luZm8oInRoZSBzdHJ1Y3Qgb2YgdmRlYyBzdGF0dXMgbWFsbG9jIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB2YXZzX2NhbnZhc19pbml0KHN0cnVjdCB2ZGVjX2F2c19od19zICpodykKK3sKKwlpbnQgaSwgcmV0OworCXUzMiBjYW52YXNfd2lkdGgsIGNhbnZhc19oZWlnaHQ7CisJdTMyIGRlY2J1Zl9zaXplLCBkZWNidWZfeV9zaXplLCBkZWNidWZfdXZfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGJ1Zl9zdGFydDsKKwlpbnQgbmVlZF9hbGxvY19idWZfbnVtOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBOVUxMOworCisJaWYgKGh3LT5tX2luc19mbGFnKQorCQl2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisKKwlpZiAoYnVmX3NpemUgPD0gMHgwMDQwMDAwMCkgeworCQkvKiBTRCBvbmx5ICovCisJCWNhbnZhc193aWR0aCA9IDc2ODsKKwkJY2FudmFzX2hlaWdodCA9IDU3NjsKKwkJZGVjYnVmX3lfc2l6ZSA9IDB4ODAwMDA7CisJCWRlY2J1Zl91dl9zaXplID0gMHgyMDAwMDsKKwkJZGVjYnVmX3NpemUgPSAweDEwMDAwMDsKKwl9IGVsc2UgeworCQkvKiBIRCAmIFNEICovCisJCWNhbnZhc193aWR0aCA9IDE5MjA7CisJCWNhbnZhc19oZWlnaHQgPSAxMDg4OworCQlkZWNidWZfeV9zaXplID0gMHgyMDAwMDA7CisJCWRlY2J1Zl91dl9zaXplID0gMHg4MDAwMDsKKwkJZGVjYnVmX3NpemUgPSAweDMwMDAwMDsKKwl9CisKKyNpZmRlZiBBVlNQX0xPTkdfQ0FCQUMKKwluZWVkX2FsbG9jX2J1Zl9udW0gPSBody0+dmZfYnVmX251bV91c2VkICsgMjsKKyNlbHNlCisJbmVlZF9hbGxvY19idWZfbnVtID0gaHctPnZmX2J1Zl9udW1fdXNlZCArIDE7CisjZW5kaWYKKwlmb3IgKGkgPSAwOyBpIDwgbmVlZF9hbGxvY19idWZfbnVtOyBpKyspIHsKKworCQlpZiAoaSA9PSAobmVlZF9hbGxvY19idWZfbnVtIC0gMSkpCisJCQlkZWNidWZfc2l6ZSA9IFdPUktTUEFDRV9TSVpFOworI2lmZGVmIEFWU1BfTE9OR19DQUJBQworCQllbHNlIGlmIChpID09IChuZWVkX2FsbG9jX2J1Zl9udW0gLSAyKSkKKwkJCWRlY2J1Zl9zaXplID0gV09SS1NQQUNFX1NJWkVfQTsKKyNlbmRpZgorCQlyZXQgPSBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkoaHctPm1tX2Jsa19oYW5kbGUsIGksCisJCQkJZGVjYnVmX3NpemUsIERSSVZFUl9OQU1FLCAmYnVmX3N0YXJ0KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlpZiAoaSA9PSAobmVlZF9hbGxvY19idWZfbnVtIC0gMSkpIHsKKwkJCWlmIChmaXJtd2FyZV9zZWwgPT0gMSkKKwkJCQlody0+YnVmX29mZnNldCA9IGJ1Zl9zdGFydCAtCisJCQkJCVJWX0FJX0JVRkZfU1RBUlRfQUREUjsKKwkJCWVsc2UKKwkJCQlody0+YnVmX29mZnNldCA9IGJ1Zl9zdGFydCAtCisJCQkJCUxPTkdfQ0FCQUNfUlZfQUlfQlVGRl9TVEFSVF9BRERSOworCQkJY29udGludWU7CisJCX0KKyNpZmRlZiBBVlNQX0xPTkdfQ0FCQUMKKwkJZWxzZSBpZiAoaSA9PSAobmVlZF9hbGxvY19idWZfbnVtIC0gMikpIHsKKwkJCWF2c3BfaGVhcF9hZHIgPSBjb2RlY19tbV9waHlzX3RvX3ZpcnQoYnVmX3N0YXJ0KTsKKwkJCWNvbnRpbnVlOworCQl9CisjZW5kaWYKKwkJaWYgKGh3LT5tX2luc19mbGFnKSB7CisJCQl1bnNpZ25lZCBjYW52YXM7CisKKwkJCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQkJCXVuc2lnbmVkIHRtcDsKKwkJCQlpZiAoY2FudmFzX3UoaHctPmNhbnZhc19zcGVjW2ldKSA9PSAweGZmKSB7CisJCQkJCXRtcCA9CisJCQkJCQl2ZGVjLT5nZXRfY2FudmFzX2V4KENPUkVfTUFTS19WREVDXzEsIHZkZWMtPmlkKTsKKwkJCQkJaHctPmNhbnZhc19zcGVjW2ldICY9IH4oMHhmZmZmIDw8IDgpOworCQkJCQlody0+Y2FudmFzX3NwZWNbaV0gfD0gdG1wIDw8IDg7CisJCQkJCWh3LT5jYW52YXNfc3BlY1tpXSB8PSB0bXAgPDwgMTY7CisJCQkJfQorCQkJCWlmIChjYW52YXNfeShody0+Y2FudmFzX3NwZWNbaV0pID09IDB4ZmYpIHsKKwkJCQkJdG1wID0KKwkJCQkJCXZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX1ZERUNfMSwgdmRlYy0+aWQpOworCQkJCQlody0+Y2FudmFzX3NwZWNbaV0gJj0gfjB4ZmY7CisJCQkJCWh3LT5jYW52YXNfc3BlY1tpXSB8PSB0bXA7CisJCQkJfQorCQkJCWNhbnZhcyA9IGh3LT5jYW52YXNfc3BlY1tpXTsKKwkJCX0gZWxzZSB7CisJCQkJY2FudmFzID0gdmRlYy0+Z2V0X2NhbnZhcyhpLCAyKTsKKwkJCQlody0+Y2FudmFzX3NwZWNbaV0gPSBjYW52YXM7CisJCQl9CisKKwkJCWh3LT5jYW52YXNfY29uZmlnW2ldWzBdLnBoeV9hZGRyID0KKwkJCWJ1Zl9zdGFydDsKKwkJCWh3LT5jYW52YXNfY29uZmlnW2ldWzBdLndpZHRoID0KKwkJCWNhbnZhc193aWR0aDsKKwkJCWh3LT5jYW52YXNfY29uZmlnW2ldWzBdLmhlaWdodCA9CisJCQljYW52YXNfaGVpZ2h0OworCQkJaHctPmNhbnZhc19jb25maWdbaV1bMF0uYmxvY2tfbW9kZSA9CisJCQlDQU5WQVNfQkxLTU9ERV8zMlgzMjsKKworCQkJaHctPmNhbnZhc19jb25maWdbaV1bMV0ucGh5X2FkZHIgPQorCQkJYnVmX3N0YXJ0ICsgZGVjYnVmX3lfc2l6ZTsKKwkJCWh3LT5jYW52YXNfY29uZmlnW2ldWzFdLndpZHRoID0KKwkJCWNhbnZhc193aWR0aDsKKwkJCWh3LT5jYW52YXNfY29uZmlnW2ldWzFdLmhlaWdodCA9CisJCQljYW52YXNfaGVpZ2h0IC8gMjsKKwkJCWh3LT5jYW52YXNfY29uZmlnW2ldWzFdLmJsb2NrX21vZGUgPQorCQkJQ0FOVkFTX0JMS01PREVfMzJYMzI7CisKKwkJfSBlbHNlIHsKKyNpZmRlZiBOVjIxCisJCQljb25maWdfY2F2X2x1dF9leChjYW52YXNfYmFzZSArIGNhbnZhc19udW0gKiBpICsgMCwKKwkJCQkJYnVmX3N0YXJ0LAorCQkJCQljYW52YXNfd2lkdGgsIGNhbnZhc19oZWlnaHQsCisJCQkJCUNBTlZBU19BRERSX05PV1JBUCwKKwkJCQkJQ0FOVkFTX0JMS01PREVfMzJYMzIsIDAsIFZERUNfMSk7CisJCQljb25maWdfY2F2X2x1dF9leChjYW52YXNfYmFzZSArIGNhbnZhc19udW0gKiBpICsgMSwKKwkJCQkJYnVmX3N0YXJ0ICsKKwkJCQkJZGVjYnVmX3lfc2l6ZSwgY2FudmFzX3dpZHRoLAorCQkJCQljYW52YXNfaGVpZ2h0IC8gMiwKKwkJCQkJQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJCQlDQU5WQVNfQkxLTU9ERV8zMlgzMiwgMCwgVkRFQ18xKTsKKyNlbHNlCisJCQljb25maWdfY2F2X2x1dF9leChjYW52YXNfbnVtICogaSArIDAsCisJCQkJCWJ1Zl9zdGFydCwKKwkJCQkJY2FudmFzX3dpZHRoLCBjYW52YXNfaGVpZ2h0LAorCQkJCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCQkJCUNBTlZBU19CTEtNT0RFXzMyWDMyLCAwLCBWREVDXzEpOworCQkJY29uZmlnX2Nhdl9sdXRfZXgoY2FudmFzX251bSAqIGkgKyAxLAorCQkJCQlidWZfc3RhcnQgKworCQkJCQlkZWNidWZfeV9zaXplLCBjYW52YXNfd2lkdGggLyAyLAorCQkJCQljYW52YXNfaGVpZ2h0IC8gMiwKKwkJCQkJQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJCQlDQU5WQVNfQkxLTU9ERV8zMlgzMiwgMCwgVkRFQ18xKTsKKwkJCWNvbmZpZ19jYXZfbHV0X2V4KGNhbnZhc19udW0gKiBpICsgMiwKKwkJCQkJYnVmX3N0YXJ0ICsKKwkJCQkJZGVjYnVmX3lfc2l6ZSArIGRlY2J1Zl91dl9zaXplLAorCQkJCQljYW52YXNfd2lkdGggLyAyLCBjYW52YXNfaGVpZ2h0IC8gMiwKKwkJCQkJQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJCQlDQU5WQVNfQkxLTU9ERV8zMlgzMiwgMCwgVkRFQ18xKTsKKyNlbmRpZgorCQkJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfVkZSQU1FX0RFVEFJTCwKKwkJCQkiY2FudmFzIGNvbmZpZyAlZCwgYWRkciAlcFxuIiwgaSwKKwkJCQkJICAgKHZvaWQgKilidWZfc3RhcnQpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2YXZzX3JlY292ZXIoc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3KQoreworCXZhdnNfY2FudmFzX2luaXQoaHcpOworCisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAoMSA8PCA3KSB8ICgxIDw8IDYpIHwgKDEgPDwgNCkpOworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgMCk7CisKKwlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMCk7CisKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsICgxIDw8IDcpIHwgKDEgPDwgNikgfCAoMSA8PCA0KSk7CisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAwKTsKKworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgKDEgPDwgOSkgfCAoMSA8PCA4KSk7CisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAwKTsKKworCWlmIChmaXJtd2FyZV9zZWwgPT0gMSkgeworCQlXUklURV9WUkVHKFBPV0VSX0NUTF9WTEQsIDB4MTApOworCQlXUklURV9WUkVHX0JJVFMoVkxEX01FTV9WSUZJRk9fQ09OVFJPTCwgMiwKKwkJCU1FTV9GSUZPX0NOVF9CSVQsIDIpOworCQlXUklURV9WUkVHX0JJVFMoVkxEX01FTV9WSUZJRk9fQ09OVFJPTCwgOCwKKwkJCU1FTV9MRVZFTF9DTlRfQklULCA2KTsKKwl9CisKKworCWlmIChmaXJtd2FyZV9zZWwgPT0gMCkgeworCQkvKiBmaXhlZCBjYW52YXMgaW5kZXggKi8KKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzAsIGNhbnZhc19iYXNlKTsKKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzEsIGh3LT52Zl9idWZfbnVtX3VzZWQpOworCX0gZWxzZSB7CisJCWludCBpaTsKKyNpZm5kZWYgVVNFX0RZTkFNSUNfQlVGX05VTQorCQlmb3IgKGlpID0gMDsgaWkgPCA0OyBpaSsrKSB7CisJCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfMCArIGlpLAorCQkJCShjYW52YXNfYmFzZSArIGNhbnZhc19udW0gKiBpaSkgfAorCQkJCSgoY2FudmFzX2Jhc2UgKyBjYW52YXNfbnVtICogaWkgKyAxKQorCQkJCQk8PCA4KSB8CisJCQkJKChjYW52YXNfYmFzZSArIGNhbnZhc19udW0gKiBpaSArIDEpCisJCQkJCTw8IDE2KQorCQkJKTsKKwkJfQorI2Vsc2UKKwkJZm9yIChpaSA9IDA7IGlpIDwgaHctPnZmX2J1Zl9udW1fdXNlZDsgaWkgKz0gMikgeworCQkJV1JJVEVfVlJFRyhidWZfc3BlY19yZWdbaWkgPj4gMV0sCisJCQkJKGNhbnZhc19iYXNlICsgY2FudmFzX251bSAqIGlpKSB8CisJCQkJKChjYW52YXNfYmFzZSArIGNhbnZhc19udW0gKiBpaSArIDEpCisJCQkJCTw8IDgpIHwKKwkJCQkoKGNhbnZhc19iYXNlICsgY2FudmFzX251bSAqIGlpICsgMikKKwkJCQkJPDwgMTYpIHwKKwkJCQkoKGNhbnZhc19iYXNlICsgY2FudmFzX251bSAqIGlpICsgMykKKwkJCQkJPDwgMjQpCisJCQkpOworCQl9CisjZW5kaWYKKwl9CisKKwkvKiBub3RpZnkgdWNvZGUgdGhlIGJ1ZmZlciBvZmZzZXQgKi8KKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfRiwgaHctPmJ1Zl9vZmZzZXQpOworCisJLyogZGlzYWJsZSBQU0NBTEUgZm9yIGhhcmR3YXJlIHNoYXJpbmcgKi8KKwlXUklURV9WUkVHKFBTQ0FMRV9DVFJMLCAwKTsKKworI2lmbmRlZiBVU0VfRFlOQU1JQ19CVUZfTlVNCisJV1JJVEVfVlJFRyhBVlNfU09TX0NPVU5ULCAwKTsKKyNlbmRpZgorCVdSSVRFX1ZSRUcoQVZTX0JVRkZFUklOLCAwKTsKKwlXUklURV9WUkVHKEFWU19CVUZGRVJPVVQsIDApOworCWlmIChlcnJvcl9yZWNvdmVyeV9tb2RlKQorCQlXUklURV9WUkVHKEFWU19FUlJPUl9SRUNPVkVSWV9NT0RFLCAwKTsKKwllbHNlCisJCVdSSVRFX1ZSRUcoQVZTX0VSUk9SX1JFQ09WRVJZX01PREUsIDEpOworCS8qIGNsZWFyIG1haWxib3ggaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfQ0xSX1JFRywgMSk7CisKKwkvKiBlbmFibGUgbWFpbGJveCBpbnRlcnJ1cHQgKi8KKwlXUklURV9WUkVHKEFTU0lTVF9NQk9YMV9NQVNLLCAxKTsKKyNpZm5kZWYgVVNFX0RZTkFNSUNfQlVGX05VTQkJCQkvKiBkZWYgREVCVUdfVUNPREUgKi8KKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfRCwgMCk7CisjZW5kaWYKKworI2lmZGVmIE5WMjEKKwlTRVRfVlJFR19NQVNLKE1ERUNfUElDX0RDX0NUUkwsIDEgPDwgMTcpOworI2VuZGlmCisJU0VUX1ZSRUdfTUFTSyhNREVDX1BJQ19EQ19DVFJMLCAxIDw8IDE2KTsKKworI2lmZGVmIFBJQ19EQ19ORUVEX0NMRUFSCisJQ0xFQVJfVlJFR19NQVNLKE1ERUNfUElDX0RDX0NUUkwsIDEgPDwgMzEpOworI2VuZGlmCisKKyNpZmRlZiBBVlNQX0xPTkdfQ0FCQUMKKwlpZiAoZmlybXdhcmVfc2VsID09IDApIHsKKwkJV1JJVEVfVlJFRyhMT05HX0NBQkFDX0RFU19BRERSLCBlc193cml0ZV9hZGRyX3BoeSk7CisJCVdSSVRFX1ZSRUcoTE9OR19DQUJBQ19SRVEsIDApOworCQlXUklURV9WUkVHKExPTkdfQ0FCQUNfUElDX1NJWkUsIDApOworCQlXUklURV9WUkVHKExPTkdfQ0FCQUNfU1JDX0FERFIsIDApOworCX0KKyNlbmRpZgorCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF81LCAwKTsKKworfQorCisjZGVmaW5lIE1CWV9NQlggICAgICAgICAgICAgICAgIE1CX01PVElPTl9NT0RFIC8qMHhjMDcqLworI2RlZmluZSBBVlNfQ09fTUJfV1JfQUREUiAgICAgICAgMHhjMzgKKyNkZWZpbmUgQVZTX0NPX01CX1JXX0NUTCAgICAgICAgIDB4YzNkCisjZGVmaW5lIEFWU19DT19NQl9SRF9BRERSICAgICAgICAweGMzOQorI2RlZmluZSBBVlNQX0lRX1dRX1BBUkFNXzAxICAgICAgICAgICAgICAgICAgICAgICAgMHgwZTE5CisjZGVmaW5lIEFWU1BfSVFfV1FfUEFSQU1fMjMgICAgICAgICAgICAgICAgICAgICAgICAweDBlMWEKKyNkZWZpbmUgQVZTUF9JUV9XUV9QQVJBTV80NSAgICAgICAgICAgICAgICAgICAgICAgIDB4MGUxYgorCitzdGF0aWMgdm9pZCB2YXZzX3NhdmVfcmVncyhzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcpCit7CisJaHctPnJlZ19zY3JhdGNoXzAgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF8wKTsKKwlody0+cmVnX3NjcmF0Y2hfMSA9IFJFQURfVlJFRyhBVl9TQ1JBVENIXzEpOworCWh3LT5yZWdfc2NyYXRjaF8yID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfMik7CisJaHctPnJlZ19zY3JhdGNoXzMgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF8zKTsKKwlody0+cmVnX3NjcmF0Y2hfNCA9IFJFQURfVlJFRyhBVl9TQ1JBVENIXzQpOworCWh3LT5yZWdfc2NyYXRjaF81ID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfNSk7CisJaHctPnJlZ19zY3JhdGNoXzYgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF82KTsKKwlody0+cmVnX3NjcmF0Y2hfNyA9IFJFQURfVlJFRyhBVl9TQ1JBVENIXzcpOworCWh3LT5yZWdfc2NyYXRjaF84ID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfOCk7CisJaHctPnJlZ19zY3JhdGNoXzkgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF85KTsKKwlody0+cmVnX3NjcmF0Y2hfQSA9IFJFQURfVlJFRyhBVl9TQ1JBVENIX0EpOworCWh3LT5yZWdfc2NyYXRjaF9CID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfQik7CisJaHctPnJlZ19zY3JhdGNoX0MgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9DKTsKKwlody0+cmVnX3NjcmF0Y2hfRCA9IFJFQURfVlJFRyhBVl9TQ1JBVENIX0QpOworCWh3LT5yZWdfc2NyYXRjaF9FID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfRSk7CisJaHctPnJlZ19zY3JhdGNoX0YgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9GKTsKKwlody0+cmVnX3NjcmF0Y2hfRyA9IFJFQURfVlJFRyhBVl9TQ1JBVENIX0cpOworCWh3LT5yZWdfc2NyYXRjaF9IID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfSCk7CisJaHctPnJlZ19zY3JhdGNoX0kgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9JKTsKKworCWh3LT5yZWdfbWJfd2lkdGggPSBSRUFEX1ZSRUcoTUJfV0lEVEgpOworCWh3LT5yZWdfdmlmZl9iaXRfY250ID0gUkVBRF9WUkVHKFZJRkZfQklUX0NOVCk7CisKKwlody0+cmVnX2NhbnZhc19hZGRyID0gUkVBRF9WUkVHKFJFQ19DQU5WQVNfQUREUik7CisJaHctPnJlZ19kYmtyX2NhbnZhc19hZGRyID0gUkVBRF9WUkVHKERCS1JfQ0FOVkFTX0FERFIpOworCWh3LT5yZWdfZGJrd19jYW52YXNfYWRkciA9IFJFQURfVlJFRyhEQktXX0NBTlZBU19BRERSKTsKKwlody0+cmVnX2FuYzJfY2FudmFzX2FkZHIgPSBSRUFEX1ZSRUcoQU5DMl9DQU5WQVNfQUREUik7CisJaHctPnJlZ19hbmMwX2NhbnZhc19hZGRyID0gUkVBRF9WUkVHKEFOQzBfQ0FOVkFTX0FERFIpOworCWh3LT5yZWdfYW5jMV9jYW52YXNfYWRkciA9IFJFQURfVlJFRyhBTkMxX0NBTlZBU19BRERSKTsKKwlody0+cmVnX2FuYzNfY2FudmFzX2FkZHIgPSBSRUFEX1ZSRUcoQU5DM19DQU5WQVNfQUREUik7CisJaHctPnJlZ19hbmM0X2NhbnZhc19hZGRyID0gUkVBRF9WUkVHKEFOQzRfQ0FOVkFTX0FERFIpOworCWh3LT5yZWdfYW5jNV9jYW52YXNfYWRkciA9IFJFQURfVlJFRyhBTkM1X0NBTlZBU19BRERSKTsKKworCWh3LT5zbGljZV92ZXJfcG9zX3BpY190eXBlID0gUkVBRF9WUkVHKFNMSUNFX1ZFUl9QT1NfUElDX1RZUEUpOworCisJaHctPnZjMV9jb250cm9sX3JlZyA9IFJFQURfVlJFRyhWQzFfQ09OVFJPTF9SRUcpOworCWh3LT5hdnNfY29fbWJfd3JfYWRkciA9IFJFQURfVlJFRyhBVlNfQ09fTUJfV1JfQUREUik7CisJaHctPnNsaWNlX3N0YXJ0X2J5dGVfMDEgPSBSRUFEX1ZSRUcoU0xJQ0VfU1RBUlRfQllURV8wMSk7CisJaHctPnNsaWNlX3N0YXJ0X2J5dGVfMjMgPSBSRUFEX1ZSRUcoU0xJQ0VfU1RBUlRfQllURV8yMyk7CisJaHctPnZjb3BfY3RybF9yZWcgPSBSRUFEX1ZSRUcoVkNPUF9DVFJMX1JFRyk7CisJaHctPmlxaWRjdF9jb250cm9sID0gUkVBRF9WUkVHKElRSURDVF9DT05UUk9MKTsKKwlody0+cnZfYWlfbWJfY291bnQgPSBSRUFEX1ZSRUcoUlZfQUlfTUJfQ09VTlQpOworCWh3LT5zbGljZV9xcCA9IFJFQURfVlJFRyhTTElDRV9RUCk7CisKKwlody0+ZGNfc2NhbGVyID0gUkVBRF9WUkVHKERDX1NDQUxFUik7CisJaHctPmF2c3BfaXFfd3FfcGFyYW1fMDEgPSBSRUFEX1ZSRUcoQVZTUF9JUV9XUV9QQVJBTV8wMSk7CisJaHctPmF2c3BfaXFfd3FfcGFyYW1fMjMgPSBSRUFEX1ZSRUcoQVZTUF9JUV9XUV9QQVJBTV8yMyk7CisJaHctPmF2c3BfaXFfd3FfcGFyYW1fNDUgPSBSRUFEX1ZSRUcoQVZTUF9JUV9XUV9QQVJBTV80NSk7CisJaHctPmF2c19jb19tYl9yZF9hZGRyID0gUkVBRF9WUkVHKEFWU19DT19NQl9SRF9BRERSKTsKKwlody0+ZGJsa19tYl93aWRfaGVpZ2h0ID0gUkVBRF9WUkVHKERCTEtfTUJfV0lEX0hFSUdIVCk7CisJaHctPm1jX3BpY193X2ggPSBSRUFEX1ZSRUcoTUNfUElDX1dfSCk7CisJaHctPmF2c19jb19tYl9yd19jdGwgPSBSRUFEX1ZSRUcoQVZTX0NPX01CX1JXX0NUTCk7CisKKwlody0+dmxkX2RlY29kZV9jb250cm9sID0gUkVBRF9WUkVHKFZMRF9ERUNPREVfQ09OVFJPTCk7Cit9CisKK3N0YXRpYyB2b2lkIHZhdnNfcmVzdG9yZV9yZWdzKHN0cnVjdCB2ZGVjX2F2c19od19zICpodykKK3sKKwlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19ERUNPRElORywKKwkJIiVzIHNjcmF0Y2hfOCAoQVZTX0JVRkZFUklOKSAweCV4LCBkZWNvZGVfcGljX2NvdW50ID0gJWRcbiIsCisJCV9fZnVuY19fLCBody0+cmVnX3NjcmF0Y2hfOCwgaHctPmRlY29kZV9waWNfY291bnQpOworCisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzAsIGh3LT5yZWdfc2NyYXRjaF8wKTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfMSwgaHctPnJlZ19zY3JhdGNoXzEpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8yLCBody0+cmVnX3NjcmF0Y2hfMik7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzMsIGh3LT5yZWdfc2NyYXRjaF8zKTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfNCwgaHctPnJlZ19zY3JhdGNoXzQpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF81LCBody0+cmVnX3NjcmF0Y2hfNSk7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzYsIGh3LT5yZWdfc2NyYXRjaF82KTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfNywgaHctPnJlZ19zY3JhdGNoXzcpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF84LCBody0+cmVnX3NjcmF0Y2hfOCk7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzksIGh3LT5yZWdfc2NyYXRjaF85KTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfQSwgaHctPnJlZ19zY3JhdGNoX0EpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9CLCBody0+cmVnX3NjcmF0Y2hfQik7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0MsIGh3LT5yZWdfc2NyYXRjaF9DKTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfRCwgaHctPnJlZ19zY3JhdGNoX0QpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9FLCBody0+cmVnX3NjcmF0Y2hfRSk7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0YsIGh3LT5yZWdfc2NyYXRjaF9GKTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfRywgaHctPnJlZ19zY3JhdGNoX0cpOworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9ILCBody0+cmVnX3NjcmF0Y2hfSCk7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0ksIGh3LT5yZWdfc2NyYXRjaF9JKTsKKworCVdSSVRFX1ZSRUcoTUJfV0lEVEgsIGh3LT5yZWdfbWJfd2lkdGgpOworCVdSSVRFX1ZSRUcoVklGRl9CSVRfQ05ULCBody0+cmVnX3ZpZmZfYml0X2NudCk7CisKKwlXUklURV9WUkVHKFJFQ19DQU5WQVNfQUREUiwgaHctPnJlZ19jYW52YXNfYWRkcik7CisgICAgV1JJVEVfVlJFRyhEQktSX0NBTlZBU19BRERSLCBody0+cmVnX2Ria3JfY2FudmFzX2FkZHIpOworICAgIFdSSVRFX1ZSRUcoREJLV19DQU5WQVNfQUREUiwgaHctPnJlZ19kYmt3X2NhbnZhc19hZGRyKTsKKyAgICBXUklURV9WUkVHKEFOQzJfQ0FOVkFTX0FERFIsIGh3LT5yZWdfYW5jMl9jYW52YXNfYWRkcik7CisgICAgV1JJVEVfVlJFRyhBTkMwX0NBTlZBU19BRERSLCBody0+cmVnX2FuYzBfY2FudmFzX2FkZHIpOworICAgIFdSSVRFX1ZSRUcoQU5DMV9DQU5WQVNfQUREUiwgaHctPnJlZ19hbmMxX2NhbnZhc19hZGRyKTsKKyAgICBXUklURV9WUkVHKEFOQzNfQ0FOVkFTX0FERFIsIGh3LT5yZWdfYW5jM19jYW52YXNfYWRkcik7CisgICAgV1JJVEVfVlJFRyhBTkM0X0NBTlZBU19BRERSLCBody0+cmVnX2FuYzRfY2FudmFzX2FkZHIpOworICAgIFdSSVRFX1ZSRUcoQU5DNV9DQU5WQVNfQUREUiwgaHctPnJlZ19hbmM1X2NhbnZhc19hZGRyKTsKKworICAgIFdSSVRFX1ZSRUcoU0xJQ0VfVkVSX1BPU19QSUNfVFlQRSwgaHctPnNsaWNlX3Zlcl9wb3NfcGljX3R5cGUpOworCisgICAgV1JJVEVfVlJFRyhWQzFfQ09OVFJPTF9SRUcsIGh3LT52YzFfY29udHJvbF9yZWcpOworICAgIFdSSVRFX1ZSRUcoQVZTX0NPX01CX1dSX0FERFIsIGh3LT5hdnNfY29fbWJfd3JfYWRkcik7CisgICAgV1JJVEVfVlJFRyhTTElDRV9TVEFSVF9CWVRFXzAxLCBody0+c2xpY2Vfc3RhcnRfYnl0ZV8wMSk7CisgICAgV1JJVEVfVlJFRyhTTElDRV9TVEFSVF9CWVRFXzIzLCBody0+c2xpY2Vfc3RhcnRfYnl0ZV8yMyk7CisgICAgV1JJVEVfVlJFRyhWQ09QX0NUUkxfUkVHLCBody0+dmNvcF9jdHJsX3JlZyk7CisgICAgV1JJVEVfVlJFRyhJUUlEQ1RfQ09OVFJPTCwgaHctPmlxaWRjdF9jb250cm9sKTsKKyAgICBXUklURV9WUkVHKFJWX0FJX01CX0NPVU5ULCBody0+cnZfYWlfbWJfY291bnQpOworICAgIFdSSVRFX1ZSRUcoU0xJQ0VfUVAsIGh3LT5zbGljZV9xcCk7CisKKyAgICBXUklURV9WUkVHKERDX1NDQUxFUiwgaHctPmRjX3NjYWxlcik7CisgICAgV1JJVEVfVlJFRyhBVlNQX0lRX1dRX1BBUkFNXzAxLCBody0+YXZzcF9pcV93cV9wYXJhbV8wMSk7CisgICAgV1JJVEVfVlJFRyhBVlNQX0lRX1dRX1BBUkFNXzIzLCBody0+YXZzcF9pcV93cV9wYXJhbV8yMyk7CisgICAgV1JJVEVfVlJFRyhBVlNQX0lRX1dRX1BBUkFNXzQ1LCBody0+YXZzcF9pcV93cV9wYXJhbV80NSk7CisgICAgV1JJVEVfVlJFRyhBVlNfQ09fTUJfUkRfQUREUiwgaHctPmF2c19jb19tYl9yZF9hZGRyKTsKKyAgICBXUklURV9WUkVHKERCTEtfTUJfV0lEX0hFSUdIVCwgaHctPmRibGtfbWJfd2lkX2hlaWdodCk7CisgICAgV1JJVEVfVlJFRyhNQ19QSUNfV19ILCBody0+bWNfcGljX3dfaCk7CisgICAgV1JJVEVfVlJFRyhBVlNfQ09fTUJfUldfQ1RMLCBody0+YXZzX2NvX21iX3J3X2N0bCk7CisKKyAgICBXUklURV9WUkVHKFZMRF9ERUNPREVfQ09OVFJPTCwgaHctPnZsZF9kZWNvZGVfY29udHJvbCk7CisKK30KKworc3RhdGljIGludCB2YXZzX3Byb3RfaW5pdChzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcpCit7CisJaW50IHIgPSAwOworI2lmIERFQlVHX01VTFRJX0ZMQUcgPiAwCisJaWYgKGh3LT5kZWNvZGVfcGljX2NvdW50ID09IDApIHsKKyNlbmRpZgorI2lmIDEgLyogTUVTT05fQ1BVX1RZUEUgPj0gTUVTT05fQ1BVX1RZUEVfTUVTT042ICovCisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAoMSA8PCA3KSB8ICgxIDw8IDYpIHwgKDEgPDwgNCkpOworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgMCk7CisKKwlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMCk7CisKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsICgxIDw8IDcpIHwgKDEgPDwgNikgfCAoMSA8PCA0KSk7CisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAwKTsKKworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgKDEgPDwgOSkgfCAoMSA8PCA4KSk7CisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAwKTsKKworI2Vsc2UKKwlXUklURV9SRVNFVF9SRUcoUkVTRVQwX1JFR0lTVEVSLAorCQkJCSAgIFJFU0VUX0lRSURDVCB8IFJFU0VUX01DIHwgUkVTRVRfVkxEX1BBUlQpOworCVJFQURfUkVTRVRfUkVHKFJFU0VUMF9SRUdJU1RFUik7CisJV1JJVEVfUkVTRVRfUkVHKFJFU0VUMF9SRUdJU1RFUiwKKwkJCQkgICBSRVNFVF9JUUlEQ1QgfCBSRVNFVF9NQyB8IFJFU0VUX1ZMRF9QQVJUKTsKKworCVdSSVRFX1JFU0VUX1JFRyhSRVNFVDJfUkVHSVNURVIsIFJFU0VUX1BJQ19EQyB8IFJFU0VUX0RCTEspOworI2VuZGlmCisjaWYgREVCVUdfTVVMVElfRkxBRyA+IDAKKwl9CisjZW5kaWYKKwkvKioqKioqKioqKioqKioqKiogcmVzZXQgdmxkICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlXUklURV9WUkVHKFBPV0VSX0NUTF9WTEQsIDB4MTApOworCVdSSVRFX1ZSRUdfQklUUyhWTERfTUVNX1ZJRklGT19DT05UUk9MLCAyLCBNRU1fRklGT19DTlRfQklULCAyKTsKKwlXUklURV9WUkVHX0JJVFMoVkxEX01FTV9WSUZJRk9fQ09OVFJPTCwJOCwgTUVNX0xFVkVMX0NOVF9CSVQsIDYpOworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCWlmIChody0+bV9pbnNfZmxhZykgeworCQlpbnQgaTsKKwkJaWYgKGh3LT5kZWNvZGVfcGljX2NvdW50ID09IDApIHsKKwkJCXIgPSB2YXZzX2NhbnZhc19pbml0KGh3KTsKKyNpZm5kZWYgVVNFX0RZTkFNSUNfQlVGX05VTQorCQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8wICsgaSwKKwkJCQkJaHctPmNhbnZhc19zcGVjW2ldCisJCQkJKTsKKwkJCX0KKyNlbHNlCisJCQlmb3IgKGkgPSAwOyBpIDwgaHctPnZmX2J1Zl9udW1fdXNlZDsgaSsrKQorCQkJCVdSSVRFX1ZSRUcoYnVmX3NwZWNfcmVnW2ldLCAwKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBody0+dmZfYnVmX251bV91c2VkOyBpICs9IDIpIHsKKwkJCQlXUklURV9WUkVHKGJ1Zl9zcGVjX3JlZ1tpID4+IDFdLAorCQkJCQkoaHctPmNhbnZhc19zcGVjW2ldICYgMHhmZmZmKSB8CisJCQkJCSgoaHctPmNhbnZhc19zcGVjW2kgKyAxXSAmIDB4ZmZmZikKKwkJCQkJCTw8IDE2KQorCQkJCSk7CisJCQkJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfREVDT0RJTkcsCisJCQkJCSIlcyBXUklURV9WUkVHKDB4JXgsIDB4JXgpXG4iLAorCQkJCQlfX2Z1bmNfXywgYnVmX3NwZWNfcmVnW2kgPj4gMV0sIFJFQURfVlJFRyhidWZfc3BlY19yZWdbaSA+PiAxXSkpOworCQkJfQorI2VuZGlmCisJCX0gZWxzZQorCQkJdmF2c19yZXN0b3JlX3JlZ3MoaHcpOworCisJCWZvciAoaSA9IDA7IGkgPCBody0+dmZfYnVmX251bV91c2VkOyBpKyspIHsKKwkJCWNvbmZpZ19jYXZfbHV0X2V4KGNhbnZhc195KGh3LT5jYW52YXNfc3BlY1tpXSksCisJCQkJaHctPmNhbnZhc19jb25maWdbaV1bMF0ucGh5X2FkZHIsCisJCQkJaHctPmNhbnZhc19jb25maWdbaV1bMF0ud2lkdGgsCisJCQkJaHctPmNhbnZhc19jb25maWdbaV1bMF0uaGVpZ2h0LAorCQkJCUNBTlZBU19BRERSX05PV1JBUCwKKwkJCQlody0+Y2FudmFzX2NvbmZpZ1tpXVswXS5ibG9ja19tb2RlLAorCQkJCTAsIFZERUNfMSk7CisKKwkJCWNvbmZpZ19jYXZfbHV0X2V4KGNhbnZhc191KGh3LT5jYW52YXNfc3BlY1tpXSksCisJCQkJaHctPmNhbnZhc19jb25maWdbaV1bMV0ucGh5X2FkZHIsCisJCQkJaHctPmNhbnZhc19jb25maWdbaV1bMV0ud2lkdGgsCisJCQkJaHctPmNhbnZhc19jb25maWdbaV1bMV0uaGVpZ2h0LAorCQkJCUNBTlZBU19BRERSX05PV1JBUCwKKwkJCQlody0+Y2FudmFzX2NvbmZpZ1tpXVsxXS5ibG9ja19tb2RlLAorCQkJCTAsIFZERUNfMSk7CisJCX0KKwl9IGVsc2UgeworCQlyID0gdmF2c19jYW52YXNfaW5pdChodyk7CisjaWZkZWYgTlYyMQorCQlpZiAoZmlybXdhcmVfc2VsID09IDApIHsKKwkJCS8qIGZpeGVkIGNhbnZhcyBpbmRleCAqLworCQkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzAsIGNhbnZhc19iYXNlKTsKKwkJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8xLCBody0+dmZfYnVmX251bV91c2VkKTsKKwkJfSBlbHNlIHsKKwkJCWludCBpaTsKKyNpZm5kZWYgVVNFX0RZTkFNSUNfQlVGX05VTQorCQkJZm9yIChpaSA9IDA7IGlpIDwgNDsgaWkrKykgeworCQkJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8wICsgaWksCisJCQkJCShjYW52YXNfYmFzZSArIGNhbnZhc19udW0gKiBpaSkgfAorCQkJCQkoKGNhbnZhc19iYXNlICsgY2FudmFzX251bSAqIGlpICsgMSkKKwkJCQkJCTw8IDgpIHwKKwkJCQkJKChjYW52YXNfYmFzZSArIGNhbnZhc19udW0gKiBpaSArIDEpCisJCQkJCQk8PCAxNikKKwkJCQkpOworCQkJfQorI2Vsc2UKKwkJZm9yIChpaSA9IDA7IGlpIDwgaHctPnZmX2J1Zl9udW1fdXNlZDsgaWkgKz0gMikgeworCQkJV1JJVEVfVlJFRyhidWZfc3BlY19yZWdbaWkgPj4gMV0sCisJCQkJKGNhbnZhc19iYXNlICsgY2FudmFzX251bSAqIGlpKSB8CisJCQkJKChjYW52YXNfYmFzZSArIGNhbnZhc19udW0gKiBpaSArIDEpCisJCQkJCTw8IDgpIHwKKwkJCQkoKGNhbnZhc19iYXNlICsgY2FudmFzX251bSAqIGlpICsgMikKKwkJCQkJPDwgMTYpIHwKKwkJCQkoKGNhbnZhc19iYXNlICsgY2FudmFzX251bSAqIGlpICsgMykKKwkJCQkJPDwgMjQpCisJCQkpOworCQl9CisjZW5kaWYKKwkJCS8qCisJCQkgKldSSVRFX1ZSRUcoQVZfU0NSQVRDSF8wLCAweDAxMDEwMCk7CisJCQkgKldSSVRFX1ZSRUcoQVZfU0NSQVRDSF8xLCAweDA0MDQwMyk7CisJCQkgKldSSVRFX1ZSRUcoQVZfU0NSQVRDSF8yLCAweDA3MDcwNik7CisJCQkgKldSSVRFX1ZSRUcoQVZfU0NSQVRDSF8zLCAweDBhMGEwOSk7CisJCQkgKi8KKwkJfQorI2Vsc2UKKwkJLyogaW5kZXggdiA8PCAxNiB8IHUgPDwgOCB8IHkgKi8KKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzAsIDB4MDIwMTAwKTsKKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzEsIDB4MDUwNDAzKTsKKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzIsIDB4MDgwNzA2KTsKKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzMsIDB4MGIwYTA5KTsKKyNlbmRpZgorCX0KKwkvKiBub3RpZnkgdWNvZGUgdGhlIGJ1ZmZlciBvZmZzZXQgKi8KKwlpZiAoaHctPmRlY29kZV9waWNfY291bnQgPT0gMCkKKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0YsIGh3LT5idWZfb2Zmc2V0KTsKKworCS8qIGRpc2FibGUgUFNDQUxFIGZvciBoYXJkd2FyZSBzaGFyaW5nICovCisJV1JJVEVfVlJFRyhQU0NBTEVfQ1RSTCwgMCk7CisKKwlpZiAoaHctPmRlY29kZV9waWNfY291bnQgPT0gMCkgeworI2lmbmRlZiBVU0VfRFlOQU1JQ19CVUZfTlVNCisJCVdSSVRFX1ZSRUcoQVZTX1NPU19DT1VOVCwgMCk7CisjZW5kaWYKKwkJV1JJVEVfVlJFRyhBVlNfQlVGRkVSSU4sIDApOworCQlXUklURV9WUkVHKEFWU19CVUZGRVJPVVQsIDApOworCX0KKwlpZiAoZXJyb3JfcmVjb3ZlcnlfbW9kZSkKKwkJV1JJVEVfVlJFRyhBVlNfRVJST1JfUkVDT1ZFUllfTU9ERSwgMCk7CisJZWxzZQorCQlXUklURV9WUkVHKEFWU19FUlJPUl9SRUNPVkVSWV9NT0RFLCAxKTsKKwkvKiBjbGVhciBtYWlsYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoQVNTSVNUX01CT1gxX0NMUl9SRUcsIDEpOworCisJLyogZW5hYmxlIG1haWxib3ggaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfTUFTSywgMSk7CisjaWZuZGVmIFVTRV9EWU5BTUlDX0JVRl9OVU0JCQkJLyogZGVmIERFQlVHX1VDT0RFICovCisJaWYgKGh3LT5kZWNvZGVfcGljX2NvdW50ID09IDApCisJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9ELCAwKTsKKyNlbmRpZgorCisjaWZkZWYgTlYyMQorCVNFVF9WUkVHX01BU0soTURFQ19QSUNfRENfQ1RSTCwgMSA8PCAxNyk7CisjZW5kaWYKKwkvKiBWNEwyX1BJWF9GTVRfTlYyMSAgVjRMMl9QSVhfRk1UX05WMjFNICovCisJU0VUX1ZSRUdfTUFTSyhNREVDX1BJQ19EQ19DVFJMLCAxIDw8IDE2KTsKKworI2lmZGVmIFBJQ19EQ19ORUVEX0NMRUFSCisJQ0xFQVJfVlJFR19NQVNLKE1ERUNfUElDX0RDX0NUUkwsIDEgPDwgMzEpOworI2VuZGlmCisJaWYgKGh3LT5tX2luc19mbGFnICYmIHN0YXJ0X2RlY29kaW5nX2RlbGF5ID4gMCkKKwkJbXNsZWVwKHN0YXJ0X2RlY29kaW5nX2RlbGF5KTsKKworCS8vcHJfaW5mbygiKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrK1xuIik7CisJLy9wcl9pbmZvKCIrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrXG4iKTsKKwkvL3ByX2luZm8oIisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKytcbiIpOworI2lmZGVmIEFWU1BfTE9OR19DQUJBQworCWlmIChmaXJtd2FyZV9zZWwgPT0gMCkgeworCQlXUklURV9WUkVHKExPTkdfQ0FCQUNfREVTX0FERFIsIGVzX3dyaXRlX2FkZHJfcGh5KTsKKwkJV1JJVEVfVlJFRyhMT05HX0NBQkFDX1JFUSwgMCk7CisJCVdSSVRFX1ZSRUcoTE9OR19DQUJBQ19QSUNfU0laRSwgMCk7CisJCVdSSVRFX1ZSRUcoTE9OR19DQUJBQ19TUkNfQUREUiwgMCk7CisJfQorI2VuZGlmCisKKyNpZmRlZiBFTkFCTEVfVVNFUl9EQVRBCisJaWYgKGh3LT5kZWNvZGVfcGljX2NvdW50ID09IDApIHsKKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX04sICh1MzIpKGh3LT51c2VyX2RhdGFfYnVmZmVyX3BoeXMgLSBody0+YnVmX29mZnNldCkpOworCQlwcl9kZWJ1ZygiQVZfU0NSQVRDSF9OID0gMHgleFxuIiwgUkVBRF9WUkVHKEFWX1NDUkFUQ0hfTikpOworCX0gZWxzZQorCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfTiwgMCk7CisjZW5kaWYKKwlpZiAoaHctPm1faW5zX2ZsYWcpIHsKKwkJaWYgKHZkZWNfZnJhbWVfYmFzZWQoaHdfdG9fdmRlYyhodykpKQorCQkJV1JJVEVfVlJFRyhERUNPREVfTU9ERSwgREVDT0RFX01PREVfTVVMVElfRlJBTUVCQVNFKTsKKwkJZWxzZSB7CisJCQlpZiAoaHctPmRlY29kZV9zdGF0dXNfc2tpcF9waWNfZG9uZV9mbGFnKSB7CisJCQkJV1JJVEVfVlJFRyhERUNPREVfQ0ZHLCBody0+ZGVjb2RlX2RlY29kZV9jb250X3N0YXJ0X2NvZGUpOworCQkJCVdSSVRFX1ZSRUcoREVDT0RFX01PREUsIERFQ09ERV9NT0RFX01VTFRJX1NUUkVBTUJBU0VfQ09OVCk7CisJCQl9IGVsc2UKKwkJCQlXUklURV9WUkVHKERFQ09ERV9NT0RFLCBERUNPREVfTU9ERV9NVUxUSV9TVFJFQU1CQVNFKTsKKwkJfQorCQlXUklURV9WUkVHKERFQ09ERV9MTUVNX0JVRl9BRFIsICh1MzIpaHctPmxtZW1fcGh5X2FkZHIpOworCX0gZWxzZQorCQlXUklURV9WUkVHKERFQ09ERV9NT0RFLCBERUNPREVfTU9ERV9TSU5HTEUpOworCisJaWYgKGluc191ZGVidWdfZmxhZ1tERUNPREVfSUQoaHcpXSAmJgorCQkoaW5zX3VkZWJ1Z19mbGFnW0RFQ09ERV9JRChodyldID4+IDE2KSA9PSBody0+ZGVjb2RlX3BpY19jb3VudCkgeworCQlXUklURV9WUkVHKERFQ09ERV9TVE9QX1BPUywKKwkJCWluc191ZGVidWdfZmxhZ1tERUNPREVfSUQoaHcpXSAmIDB4ZmZmZik7CisJfQorCWVsc2UKKwkJV1JJVEVfVlJFRyhERUNPREVfU1RPUF9QT1MsIHVkZWJ1Z19mbGFnKTsKKwlody0+b2xkX3VkZWJ1Z19mbGFnID0gdWRlYnVnX2ZsYWc7CisKKwlyZXR1cm4gcjsKK30KKworCisjaWZkZWYgQVZTUF9MT05HX0NBQkFDCitzdGF0aWMgdW5zaWduZWQgY2hhciBlc193cml0ZV9hZGRyW01BWF9DT0RFRF9GUkFNRV9TSVpFXSAgX19hbGlnbmVkKDY0KTsKKyNlbmRpZgorc3RhdGljIHZvaWQgdmF2c19sb2NhbF9pbml0KHN0cnVjdCB2ZGVjX2F2c19od19zICpodykKK3sKKwlpbnQgaTsKKworCWh3LT52Zl9idWZfbnVtX3VzZWQgPSB2Zl9idWZfbnVtOworCisJaHctPnZhdnNfcmF0aW8gPSBody0+dmF2c19hbXN0cmVhbV9kZWNfaW5mby5yYXRpbzsKKworCWh3LT5hdmlfZmxhZyA9ICh1bnNpZ25lZCBsb25nKSBody0+dmF2c19hbXN0cmVhbV9kZWNfaW5mby5wYXJhbTsKKworCWh3LT5mcmFtZV93aWR0aCA9IGh3LT5mcmFtZV9oZWlnaHQgPSBody0+ZnJhbWVfZHVyID0gaHctPmZyYW1lX3Byb2cgPSAwOworCisJaHctPnRocm93X3BiX2ZsYWcgPSAxOworCisJaHctPnRvdGFsX2ZyYW1lID0gMDsKKwlody0+c2F2ZWRfcmVzb2x1dGlvbiA9IDA7CisJaHctPm5leHRfcHRzID0gMDsKKworI2lmZGVmIERFQlVHX1BUUworCWh3LT5wdHNfaGl0ID0gaHctPnB0c19taXNzZWQgPSBody0+cHRzX2lfaGl0ID0gaHctPnB0c19pX21pc3NlZCA9IDA7CisjZW5kaWYKKwlJTklUX0tGSUZPKGh3LT5kaXNwbGF5X3EpOworCUlOSVRfS0ZJRk8oaHctPnJlY3ljbGVfcSk7CisJSU5JVF9LRklGTyhody0+bmV3ZnJhbWVfcSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVkZfUE9PTF9TSVpFOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IHZmcmFtZV9zICp2ZiA9ICZody0+dmZwb29sW2ldLnZmOworCisJCWh3LT52ZnBvb2xbaV0udmYuaW5kZXggPSBody0+dmZfYnVmX251bV91c2VkOworCQlody0+dmZwb29sW2ldLnZmLmJ1ZldpZHRoID0gMTkyMDsKKwkJaHctPnZmcG9vbFtpXS5kZXRhY2hlZCA9IDA7CisJCWtmaWZvX3B1dCgmaHctPm5ld2ZyYW1lX3EsIHZmKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGh3LT52Zl9idWZfbnVtX3VzZWQ7IGkrKykKKwkJaHctPnZmYnVmX3VzZVtpXSA9IDA7CisKKwkvKmN1cl92ZnBvb2wgPSB2ZnBvb2w7Ki8KKworCWlmIChody0+cmVjb3Zlcl9mbGFnID09IDEpCisJCXJldHVybjsKKworCWlmIChody0+bW1fYmxrX2hhbmRsZSkgeworCQlwcl9pbmZvKCJkZWNvZGVyX2JtbXVfYm94X2ZyZWVcbiIpOworCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWUoaHctPm1tX2Jsa19oYW5kbGUpOworCQlody0+bW1fYmxrX2hhbmRsZSA9IE5VTEw7CisJfQorCisJaHctPm1tX2Jsa19oYW5kbGUgPSBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2JveCgKKwkJRFJJVkVSX05BTUUsCisJCTAsCisJCU1BWF9CTU1VX0JVRkZFUl9OVU0sCisJCTQgKyBQQUdFX1NISUZULAorCQlDT0RFQ19NTV9GTEFHU19DTUFfQ0xFQVIgfAorCQlDT0RFQ19NTV9GTEFHU19GT1JfVkRFQ09ERVIpOworCWlmIChody0+bW1fYmxrX2hhbmRsZSA9PSBOVUxMKQorCQlwcl9pbmZvKCJFcnJvciwgZGVjb2Rlcl9ibW11X2JveF9hbGxvY19ib3ggZmFpbFxuIik7CisKK30KKworc3RhdGljIGludCB2YXZzX3ZmX3N0YXRlcyhzdHJ1Y3QgdmZyYW1lX3N0YXRlcyAqc3RhdGVzLCB2b2lkICpvcF9hcmcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcgPQorCShzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqKW9wX2FyZzsKKworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKKwlzdGF0ZXMtPnZmX3Bvb2xfc2l6ZSA9IFZGX1BPT0xfU0laRTsKKwlzdGF0ZXMtPmJ1Zl9mcmVlX251bSA9IGtmaWZvX2xlbigmaHctPm5ld2ZyYW1lX3EpOworCXN0YXRlcy0+YnVmX2F2YWlsX251bSA9IGtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSk7CisJc3RhdGVzLT5idWZfcmVjeWNsZV9udW0gPSBrZmlmb19sZW4oJmh3LT5yZWN5Y2xlX3EpOworCWlmIChzdGVwID09IDIpCisJCXN0YXRlcy0+YnVmX2F2YWlsX251bSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfUE9TVF9QUk9DRVNTX01BTkFHRVIKK3N0YXRpYyB2b2lkIHZhdnNfcHBtZ3JfcmVzZXQodm9pZCkKK3sKKwl2Zl9ub3RpZnlfcmVjZWl2ZXIoUFJPVklERVJfTkFNRSwgVkZSQU1FX0VWRU5UX1BST1ZJREVSX1JFU0VULCBOVUxMKTsKKworCXZhdnNfbG9jYWxfaW5pdChnaHcpOworCisJcHJfaW5mbygidmF2czogdmZfcHBtZ3JfcmVzZXRcbiIpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHZhdnNfbG9jYWxfcmVzZXQoc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3KQoreworCW11dGV4X2xvY2soJnZhdnNfbXV0ZXgpOworCWh3LT5yZWNvdmVyX2ZsYWcgPSAxOworCXByX2luZm8oImVycm9yLCBsb2NhbCByZXNldFxuIik7CisJYW12ZGVjX3N0b3AoKTsKKwltc2xlZXAoMTAwKTsKKwlhdnNfdmZfbm90aWZ5X3JlY2VpdmVyKGh3LCBQUk9WSURFUl9OQU1FLCBWRlJBTUVfRVZFTlRfUFJPVklERVJfUkVTRVQsIE5VTEwpOworCXZhdnNfbG9jYWxfaW5pdChodyk7CisJdmF2c19yZWNvdmVyKGh3KTsKKworI2lmZGVmIEVOQUJMRV9VU0VSX0RBVEEKKwlyZXNldF91c2VyZGF0YV9maWZvKDEpOworI2VuZGlmCisKKwlhbXZkZWNfc3RhcnQoKTsKKwlody0+cmVjb3Zlcl9mbGFnID0gMDsKKyNpZiAwCisJZXJyb3Jfd2F0Y2hkb2dfY291bnQgPSAwOworCisJcHJfaW5mbygicGMgJXggc3RyZWFtIGJ1ZiB3cCAleCBycCAleCBsZXZlbCAleFxuIiwKKwkJUkVBRF9WUkVHKE1QQ19FKSwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1dQKSwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKSk7CisjZW5kaWYKKworCisKKwltdXRleF91bmxvY2soJnZhdnNfbXV0ZXgpOworfQorCisjaWYgMAorc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBmYXRhbF9lcnJvcl93ZF93b3JrOworc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBub3RpZnlfd29yazsKK3N0YXRpYyBhdG9taWNfdCBlcnJvcl9oYW5kbGVyX3J1biA9IEFUT01JQ19JTklUKDApOworI2VuZGlmCitzdGF0aWMgdm9pZCB2YXZzX2ZhdGFsX2Vycm9yX2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB2ZGVjX2F2c19od19zICpodyA9CisJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB2ZGVjX2F2c19od19zLCBmYXRhbF9lcnJvcl93ZF93b3JrKTsKKwlpZiAoZGVidWcgJiBBVlNfREVCVUdfT0xEX0VSUk9SX0hBTkRMRSkgeworCQltdXRleF9sb2NrKCZ2YXZzX211dGV4KTsKKwkJcHJfaW5mbygidmF2cyBmYXRhbCBlcnJvciByZXNldCAhXG4iKTsKKwkJYW12ZGVjX3N0b3AoKTsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19QT1NUX1BST0NFU1NfTUFOQUdFUgorCQl2YXZzX3BwbWdyX3Jlc2V0KCk7CisjZWxzZQorCQl2Zl9saWdodF91bnJlZ19wcm92aWRlcigmdmF2c192Zl9wcm92KTsKKwkJdmF2c19sb2NhbF9pbml0KGh3KTsKKwkJdmZfcmVnX3Byb3ZpZGVyKCZ2YXZzX3ZmX3Byb3YpOworI2VuZGlmCisJCXZhdnNfcmVjb3Zlcihodyk7CisJCWFtdmRlY19zdGFydCgpOworCQltdXRleF91bmxvY2soJnZhdnNfbXV0ZXgpOworCX0gZWxzZSB7CisJCXByX2luZm8oImF2cyBmYXRhbF9lcnJvcl9oYW5kbGVyXG4iKTsKKwkJdmF2c19sb2NhbF9yZXNldChodyk7CisJfQorCWF0b21pY19zZXQoJmh3LT5lcnJvcl9oYW5kbGVyX3J1biwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHZhdnNfbm90aWZ5X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB2ZGVjX2F2c19od19zICpodyA9CisJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB2ZGVjX2F2c19od19zLCBub3RpZnlfd29yayk7CisJaWYgKGh3LT5mcl9oaW50X3N0YXR1cyA9PSBWREVDX05FRURfSElOVCkgeworCQlhdnNfdmZfbm90aWZ5X3JlY2VpdmVyKGh3LCBQUk9WSURFUl9OQU1FICwKKwkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9GUl9ISU5UICwKKwkJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKWh3LT5mcmFtZV9kdXIpKTsKKwkJaHctPmZyX2hpbnRfc3RhdHVzID0gVkRFQ19ISU5URUQ7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgYXZzX3NldF9jbGsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB2ZGVjX2F2c19od19zICpodyA9CisJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB2ZGVjX2F2c19od19zLCBzZXRfY2xrX3dvcmspOworCWlmIChody0+ZnJhbWVfZHVyID4gMCAmJiBody0+c2F2ZWRfcmVzb2x1dGlvbiAhPQorCQlody0+ZnJhbWVfd2lkdGggKiBody0+ZnJhbWVfaGVpZ2h0ICogKDk2MDAwIC8gaHctPmZyYW1lX2R1cikpIHsKKwkJaW50IGZwcyA9IDk2MDAwIC8gaHctPmZyYW1lX2R1cjsKKworCQlody0+c2F2ZWRfcmVzb2x1dGlvbiA9IGh3LT5mcmFtZV93aWR0aCAqIGh3LT5mcmFtZV9oZWlnaHQgKiBmcHM7CisJCWlmIChmaXJtd2FyZV9zZWwgPT0gMCAmJgorCQkJKGRlYnVnICYgQVZTX0RFQlVHX1VTRV9GVUxMX1NQRUVEKSkgeworCQkJdmRlY19zb3VyY2VfY2hhbmdlZChWRk9STUFUX0FWUywKKwkJCQk0MDk2LCAyMDQ4LCA2MCk7CisJCX0gZWxzZSB7CisJCQl2ZGVjX3NvdXJjZV9jaGFuZ2VkKFZGT1JNQVRfQVZTLAorCQkJaHctPmZyYW1lX3dpZHRoLCBody0+ZnJhbWVfaGVpZ2h0LCBmcHMpOworCQl9CisKKwl9Cit9CisKKyNpZmRlZiBERUJVR19NVUxUSV9XSVRIX0FVVE9NT0RFCitpbnQgZGVsYXlfY291bnQgPSAwOworI2VuZGlmCitzdGF0aWMgdm9pZCB2YXZzX3B1dF90aW1lcl9mdW5jKHN0cnVjdCB0aW1lcl9saXN0ICphcmcpCit7CisJc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3ID0gY29udGFpbmVyX29mKGFyZywKKwkJc3RydWN0IHZkZWNfYXZzX2h3X3MsIHJlY3ljbGVfdGltZXIpOworCXN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciA9ICZody0+cmVjeWNsZV90aW1lcjsKKworI2lmbmRlZiBIQU5ETEVfQVZTX0lSUQorCXZhdnNfaXNyKCk7CisjZW5kaWYKKyNpZmRlZiBERUJVR19NVUxUSV9XSVRIX0FVVE9NT0RFCisJaWYgKGRlbGF5X2NvdW50ID4gMCkgeworCQlpZiAoZGVsYXlfY291bnQgPT0gMSkKKwkJCWFtdmRlY19zdGFydCgpOworCQlkZWxheV9jb3VudC0tOworCX0KKyNlbmRpZgorCWlmIChSRUFEX1ZSRUcoQVZTX1NPU19DT1VOVCkpIHsKKwkJaWYgKCFlcnJvcl9yZWNvdmVyeV9tb2RlKSB7CisjaWYgMAorCQkJaWYgKGRlYnVnICYgQVZTX0RFQlVHX09MRF9FUlJPUl9IQU5ETEUpIHsKKwkJCQltdXRleF9sb2NrKCZ2YXZzX211dGV4KTsKKwkJCQlwcl9pbmZvKCJ2YXZzIGZhdGFsIGVycm9yIHJlc2V0ICFcbiIpOworCQkJCWFtdmRlY19zdG9wKCk7CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfUE9TVF9QUk9DRVNTX01BTkFHRVIKKwkJCQl2YXZzX3BwbWdyX3Jlc2V0KCk7CisjZWxzZQorCQkJCXZmX2xpZ2h0X3VucmVnX3Byb3ZpZGVyKCZ2YXZzX3ZmX3Byb3YpOworCQkJCXZhdnNfbG9jYWxfaW5pdCgpOworCQkJCXZmX3JlZ19wcm92aWRlcigmdmF2c192Zl9wcm92KTsKKyNlbmRpZgorCQkJCXZhdnNfcmVjb3ZlcigpOworCQkJCWFtdmRlY19zdGFydCgpOworCQkJCW11dGV4X3VubG9jaygmdmF2c19tdXRleCk7CisJCQl9IGVsc2UgeworCQkJCXZhdnNfbG9jYWxfcmVzZXQoKTsKKwkJCX0KKyNlbHNlCisJCQlpZiAoIWF0b21pY19yZWFkKCZody0+ZXJyb3JfaGFuZGxlcl9ydW4pKSB7CisJCQkJYXRvbWljX3NldCgmaHctPmVycm9yX2hhbmRsZXJfcnVuLCAxKTsKKwkJCQlwcl9pbmZvKCJBVlNfU09TX0NPVU5UID0gJWRcbiIsCisJCQkJCVJFQURfVlJFRyhBVlNfU09TX0NPVU5UKSk7CisJCQkJcHJfaW5mbygiV1AgPSAweCV4LCBSUCA9IDB4JXgsIExFVkVMID0gMHgleCwgQVZBSUwgPSAweCV4LCBDVVJfUFRSID0gMHgleFxuIiwKKwkJCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1dQKSwKKwkJCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSwKKwkJCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKSwKKwkJCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0JZVEVTX0FWQUlMKSwKKwkJCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0NVUlJfUFRSKSk7CisJCQkJc2NoZWR1bGVfd29yaygmaHctPmZhdGFsX2Vycm9yX3dkX3dvcmspOworCQkJfQorI2VuZGlmCisJCX0KKwl9CisjaWYgMAorCWlmIChsb25nX2NhYmFjX2J1c3kgPT0gMCAmJgorCQllcnJvcl93YXRjaGRvZ190aHJlc2hvbGQgPiAwICYmCisJCWtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSkgPT0gMCAmJgorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpID4KKwkJZXJyb3Jfd2F0Y2hkb2dfYnVmX3RocmVzaG9sZCkgeworCQlwcl9pbmZvKCJuZXdxICVkIGRpc3BxICVkIHJlY3lxICVkXHJcbiIsCisJCQlrZmlmb19sZW4oJmh3LT5uZXdmcmFtZV9xKSwKKwkJCWtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSksCisJCQlrZmlmb19sZW4oJmh3LT5yZWN5Y2xlX3EpKTsKKwkJcHJfaW5mbygicGMgJXggc3RyZWFtIGJ1ZiB3cCAleCBycCAleCBsZXZlbCAleFxuIiwKKwkJCVJFQURfVlJFRyhNUENfRSksCisJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSwKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCkpOworCQllcnJvcl93YXRjaGRvZ19jb3VudCsrOworCQlpZiAoZXJyb3Jfd2F0Y2hkb2dfY291bnQgPj0gZXJyb3Jfd2F0Y2hkb2dfdGhyZXNob2xkKQorCQkJdmF2c19sb2NhbF9yZXNldCgpOworCX0gZWxzZQorCQllcnJvcl93YXRjaGRvZ19jb3VudCA9IDA7CisjZW5kaWYKKwlpZiAocmFkciAhPSAwKSB7CisJCWlmIChydmFsICE9IDApIHsKKwkJCVdSSVRFX1ZSRUcocmFkciwgcnZhbCk7CisJCQlwcl9pbmZvKCJXUklURV9WUkVHKCV4LCV4KVxuIiwgcmFkciwgcnZhbCk7CisJCX0gZWxzZQorCQkJcHJfaW5mbygiUkVBRF9WUkVHKCV4KT0leFxuIiwgcmFkciwgUkVBRF9WUkVHKHJhZHIpKTsKKwkJcnZhbCA9IDA7CisJCXJhZHIgPSAwOworCX0KKwlpZiAoKGh3LT51Y29kZV9wYXVzZV9wb3MgIT0gMCkgJiYKKwkJKGh3LT51Y29kZV9wYXVzZV9wb3MgIT0gMHhmZmZmZmZmZikgJiYKKwkJdWRlYnVnX3BhdXNlX3BvcyAhPSBody0+dWNvZGVfcGF1c2VfcG9zKSB7CisJCWh3LT51Y29kZV9wYXVzZV9wb3MgPSAwOworCQlXUklURV9WUkVHKERFQlVHX1JFRzEsIDApOworCX0KKworCWlmICgha2ZpZm9faXNfZW1wdHkoJmh3LT5yZWN5Y2xlX3EpICYmIChSRUFEX1ZSRUcoQVZTX0JVRkZFUklOKSA9PSAwKSkgeworCQlzdHJ1Y3QgdmZyYW1lX3MgKnZmOworCisJCWlmIChrZmlmb19nZXQoJmh3LT5yZWN5Y2xlX3EsICZ2ZikpIHsKKwkJCWlmICgodmYtPmluZGV4IDwgaHctPnZmX2J1Zl9udW1fdXNlZCkgJiYKKwkJCSAoLS1ody0+dmZidWZfdXNlW3ZmLT5pbmRleF0gPT0gMCkpIHsKKwkJCQlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19ERUNPRElORywKKwkJCQkJIiVzIFdSSVRFX1ZSRUcoQVZTX0JVRkZFUklOLCAweCV4KSBmb3IgdmYgaW5kZXggb2YgJWRcbiIsCisJCQkJCV9fZnVuY19fLAorCQkJCQl+KDEgPDwgdmYtPmluZGV4KSwgdmYtPmluZGV4KTsKKwkJCQlXUklURV9WUkVHKEFWU19CVUZGRVJJTiwgfigxIDw8IHZmLT5pbmRleCkpOworCQkJCXZmLT5pbmRleCA9IGh3LT52Zl9idWZfbnVtX3VzZWQ7CisJCQl9CisJCQkJa2ZpZm9fcHV0KCZody0+bmV3ZnJhbWVfcSwKKwkJCQkJCSAgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwkJfQorCisJfQorCisJc2NoZWR1bGVfd29yaygmaHctPnNldF9jbGtfd29yayk7CisKKwl0aW1lci0+ZXhwaXJlcyA9IGppZmZpZXMgKyBQVVRfSU5URVJWQUw7CisKKwlhZGRfdGltZXIodGltZXIpOworfQorCisjaWZkZWYgQVZTUF9MT05HX0NBQkFDCisKK3N0YXRpYyB2b2lkIGxvbmdfY2FiYWNfZG9fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3ID0gZ3c7CisjaWZkZWYgUEVSRk9STUFOQ0VfREVCVUcKKwlwcl9pbmZvKCJlbnRlciAlcyBidWYgbGV2ZWwgKG5ldyAlZCwgZGlzcGxheSAlZCwgcmVjeWNsZSAlZClcclxuIiwKKwkJX19mdW5jX18sCisJCWtmaWZvX2xlbigmaHctPm5ld2ZyYW1lX3EpLAorCQlrZmlmb19sZW4oJmh3LT5kaXNwbGF5X3EpLAorCQlrZmlmb19sZW4oJmh3LT5yZWN5Y2xlX3EpCisJCSk7CisjZW5kaWYKKwltdXRleF9sb2NrKCZ2YXZzX211dGV4KTsKKwlsb25nX2NhYmFjX2J1c3kgPSAxOworCXdoaWxlIChSRUFEX1ZSRUcoTE9OR19DQUJBQ19SRVEpKSB7CisJCWlmIChwcm9jZXNzX2xvbmdfY2FiYWMoKSA8IDApIHsKKwkJCXN0YXR1cyA9IC0xOworCQkJYnJlYWs7CisJCX0KKwl9CisJbG9uZ19jYWJhY19idXN5ID0gMDsKKwltdXRleF91bmxvY2soJnZhdnNfbXV0ZXgpOworI2lmZGVmIFBFUkZPUk1BTkNFX0RFQlVHCisJcHJfaW5mbygiZXhpdCAlcyBidWYgbGV2ZWwgKG5ldyAlZCwgZGlzcGxheSAlZCwgcmVjeWNsZSAlZClcclxuIiwKKwkJX19mdW5jX18sCisJCWtmaWZvX2xlbigmaHctPm5ld2ZyYW1lX3EpLAorCQlrZmlmb19sZW4oJmh3LT5kaXNwbGF5X3EpLAorCQlrZmlmb19sZW4oJmh3LT5yZWN5Y2xlX3EpCisJCSk7CisjZW5kaWYKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlwcl9pbmZvKCJ0cmFuc2NvZGluZyBlcnJvciwgbG9jYWwgcmVzZXRcclxuIik7CisJCXZhdnNfbG9jYWxfcmVzZXQoaHcpOworCX0KKworfQorI2VuZGlmCisKKyNpZmRlZiBBVlNQX0xPTkdfQ0FCQUMKK3N0YXRpYyB2b2lkIGluaXRfYXZzcF9sb25nX2NhYmFjX2J1Zih2b2lkKQoreworI2lmIDAKKwllc193cml0ZV9hZGRyX3BoeSA9ICh1bnNpZ25lZCBsb25nKWNvZGVjX21tX2FsbG9jX2Zvcl9kbWEoCisJCSJ2YXZzIiwKKwkJUEFHRV9BTElHTihNQVhfQ09ERURfRlJBTUVfU0laRSkvUEFHRV9TSVpFLAorCQkwLCBDT0RFQ19NTV9GTEFHU19ETUFfQ1BVKTsKKwllc193cml0ZV9hZGRyX3ZpcnQgPSBjb2RlY19tbV9waHlzX3RvX3ZpcnQoZXNfd3JpdGVfYWRkcl9waHkpOworCisjZWxpZiAwCisJZXNfd3JpdGVfYWRkcl92aXJ0ID0KKwkJKHZvaWQgKilkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkgTUFYX0NPREVEX0ZSQU1FX1NJWkUsICZlc193cml0ZV9hZGRyX3BoeSwKKwkJR0ZQX0tFUk5FTCk7CisjZWxzZQorCS8qZXNfd3JpdGVfYWRkcl92aXJ0ID0ga21hbGxvYyhNQVhfQ09ERURfRlJBTUVfU0laRSwgR0ZQX0tFUk5FTCk7CisJICoJZXNfd3JpdGVfYWRkcl92aXJ0ID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsCisJICoJZ2V0X29yZGVyKE1BWF9DT0RFRF9GUkFNRV9TSVpFKSk7CisJICovCisJZXNfd3JpdGVfYWRkcl92aXJ0ID0gJmVzX3dyaXRlX2FkZHJbMF07CisJaWYgKGVzX3dyaXRlX2FkZHJfdmlydCA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvYyBlc193cml0ZV9hZGRyX3ZpcnQgYnVmZmVyXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJZXNfd3JpdGVfYWRkcl9waHkgPSBkbWFfbWFwX3NpbmdsZShhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQllc193cml0ZV9hZGRyX3ZpcnQsCisJCQlNQVhfQ09ERURfRlJBTUVfU0laRSwgRE1BX0JJRElSRUNUSU9OQUwpOworCWlmIChkbWFfbWFwcGluZ19lcnJvcihhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQllc193cml0ZV9hZGRyX3BoeSkpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIG1hcCBlc193cml0ZV9hZGRyX3ZpcnQgYnVmZmVyXG4iLAorCQkJX19mdW5jX18pOworCQkvKmtmcmVlKGVzX3dyaXRlX2FkZHJfdmlydCk7Ki8KKwkJZXNfd3JpdGVfYWRkcl92aXJ0ID0gTlVMTDsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisKKyNpZmRlZiBCSVRTVFJFQU1fUkVBRF9UTVBfTk9fQ0FDSEUKKwliaXRzdHJlYW1fcmVhZF90bXAgPQorCQkodm9pZCAqKWRtYV9hbGxvY19jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQlTVkFfU1RSRUFNX0JVRl9TSVpFLCAmYml0c3RyZWFtX3JlYWRfdG1wX3BoeSwKKwkJCSBHRlBfS0VSTkVMKTsKKworI2Vsc2UKKworCWJpdHN0cmVhbV9yZWFkX3RtcCA9IGttYWxsb2MoU1ZBX1NUUkVBTV9CVUZfU0laRSwgR0ZQX0tFUk5FTCk7CisJCS8qYml0c3RyZWFtX3JlYWRfdG1wID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsCisJCSAqZ2V0X29yZGVyKE1BWF9DT0RFRF9GUkFNRV9TSVpFKSk7CisJCSAqLworCWlmIChiaXRzdHJlYW1fcmVhZF90bXAgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgYml0c3RyZWFtX3JlYWRfdG1wIGJ1ZmZlclxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWJpdHN0cmVhbV9yZWFkX3RtcF9waHkgPSBkbWFfbWFwX3NpbmdsZShhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQliaXRzdHJlYW1fcmVhZF90bXAsCisJCQlTVkFfU1RSRUFNX0JVRl9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCWlmIChkbWFfbWFwcGluZ19lcnJvcihhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQliaXRzdHJlYW1fcmVhZF90bXBfcGh5KSkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gbWFwIHJwbSBidWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJa2ZyZWUoYml0c3RyZWFtX3JlYWRfdG1wKTsKKwkJYml0c3RyZWFtX3JlYWRfdG1wID0gTlVMTDsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorfQorI2VuZGlmCisKKworc3RhdGljIHMzMiB2YXZzX2luaXQoc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3KQoreworCWludCByZXQsIHNpemUgPSAtMTsKKwlzdHJ1Y3QgZmlybXdhcmVfcyAqZnc7CisJdTMyIGZ3X3NpemUgPSAweDEwMDAgKiAxNjsKKwkvKmNoYXIgKmJ1ZiA9IHZtYWxsb2MoMHgxMDAwICogMTYpOworCisJaWYgKElTX0VSUl9PUl9OVUxMKGJ1ZikpCisJCXJldHVybiAtRU5PTUVNOworCSovCisJZncgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgZmlybXdhcmVfcykgKyBmd19zaXplKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZncpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByX2luZm8oInZhdnNfaW5pdFxuIik7CisJLy9pbml0X3RpbWVyKCZody0+cmVjeWNsZV90aW1lcik7CisKKwkvL2h3LT5zdGF0IHw9IFNUQVRfVElNRVJfSU5JVDsKKworCS8vYW12ZGVjX2VuYWJsZSgpOworCisJLy92ZGVjX2VuYWJsZV9ETUMoTlVMTCk7CisKKwl2YXZzX2xvY2FsX2luaXQoaHcpOworCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hNKQorCQlzaXplID0gZ2V0X2Zpcm13YXJlX2RhdGEoVklERU9fREVDX0FWU19NVUxUSSwgZnctPmRhdGEpOworCWVsc2UgeworCQlpZiAoZmlybXdhcmVfc2VsID09IDEpCisJCQlzaXplID0gZ2V0X2Zpcm13YXJlX2RhdGEoVklERU9fREVDX0FWU19OT0NBQkFDLCBmdy0+ZGF0YSk7CisjaWZkZWYgQVZTUF9MT05HX0NBQkFDCisJCWVsc2UgeworCQkJaW5pdF9hdnNwX2xvbmdfY2FiYWNfYnVmKCk7CisJCQlzaXplID0gZ2V0X2Zpcm13YXJlX2RhdGEoVklERU9fREVDX0FWU19NVUxUSSwgZnctPmRhdGEpOworCQl9CisjZW5kaWYKKwl9CisKKwlpZiAoc2l6ZSA8IDApIHsKKwkJYW12ZGVjX2Rpc2FibGUoKTsKKwkJcHJfZXJyKCJnZXQgZmlybXdhcmUgZmFpbC4iKTsKKwkJdmZyZWUoZncpOworCQlyZXR1cm4gLTE7CisJfQorCisJZnctPmxlbiA9IHNpemU7CisJaHctPmZ3ID0gZnc7CisKKwlpZiAoaHctPm1faW5zX2ZsYWcpIHsKKwkJdGltZXJfc2V0dXAoJmh3LT5jaGVja190aW1lciwgY2hlY2tfdGltZXJfZnVuYywgMCk7CisJCS8vaW5pdF90aW1lcigmaHctPmNoZWNrX3RpbWVyKTsKKwkJLy9ody0+Y2hlY2tfdGltZXIuZGF0YSA9ICh1bG9uZykgaHc7CisJCS8vaHctPmNoZWNrX3RpbWVyLmZ1bmN0aW9uID0gY2hlY2tfdGltZXJfZnVuYzsKKwkJaHctPmNoZWNrX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgQ0hFQ0tfSU5URVJWQUw7CisKKworCQkvL2FkZF90aW1lcigmaHctPmNoZWNrX3RpbWVyKTsKKwkJaHctPnN0YXQgfD0gU1RBVF9USU1FUl9BUk07CisKKwkJSU5JVF9XT1JLKCZody0+d29yaywgdmF2c193b3JrKTsKKworCQlody0+ZncgPSBmdzsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hNKQorCQlyZXQgPSBhbXZkZWNfbG9hZG1jX2V4KFZGT1JNQVRfQVZTLCBOVUxMLCBmdy0+ZGF0YSk7CisJZWxzZSBpZiAoZmlybXdhcmVfc2VsID09IDEpCisJCXJldCA9IGFtdmRlY19sb2FkbWNfZXgoVkZPUk1BVF9BVlMsICJhdnNfbm9fY2FiYWMiLCBmdy0+ZGF0YSk7CisJZWxzZQorCQlyZXQgPSBhbXZkZWNfbG9hZG1jX2V4KFZGT1JNQVRfQVZTLCBOVUxMLCBmdy0+ZGF0YSk7CisKKwlpZiAocmV0IDwgMCkgeworCQlhbXZkZWNfZGlzYWJsZSgpOworCQkvKnZmcmVlKGJ1Zik7Ki8KKwkJcHJfZXJyKCJBVlM6IHRoZSAlcyBmdyBsb2FkaW5nIGZhaWxlZCwgZXJyOiAleFxuIiwKKwkJCXRlZV9lbmFibGVkKCkgPyAiVEVFIiA6ICJsb2NhbCIsIHJldCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyp2ZnJlZShidWYpOyovCisKKwlody0+c3RhdCB8PSBTVEFUX01DX0xPQUQ7CisKKworCS8qIGVuYWJsZSBBTVJJU0Mgc2lkZSBwcm90b2NvbCAqLworCXJldCA9IHZhdnNfcHJvdF9pbml0KGh3KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworI2lmZGVmIEhBTkRMRV9BVlNfSVJRCisJaWYgKHZkZWNfcmVxdWVzdF9pcnEoVkRFQ19JUlFfMSwgdmF2c19pc3IsCisJCQkidmF2cy1pcnEiLCAodm9pZCAqKWh3KSkgeworCQlhbXZkZWNfZGlzYWJsZSgpOworCQlwcl9pbmZvKCJ2YXZzIGlycSByZWdpc3RlciBlcnJvci5cbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisjZW5kaWYKKworCWh3LT5zdGF0IHw9IFNUQVRfSVNSX1JFRzsKKworI2lmZGVmIENPTkZJR19BTUxPR0lDX1BPU1RfUFJPQ0VTU19NQU5BR0VSCisJdmZfcHJvdmlkZXJfaW5pdCgmdmF2c192Zl9wcm92LCBQUk9WSURFUl9OQU1FLCAmdmF2c192Zl9wcm92aWRlciwgaHcpOworCXZmX3JlZ19wcm92aWRlcigmdmF2c192Zl9wcm92KTsKKwlhdnNfdmZfbm90aWZ5X3JlY2VpdmVyKGh3LCBQUk9WSURFUl9OQU1FLCBWRlJBTUVfRVZFTlRfUFJPVklERVJfU1RBUlQsIE5VTEwpOworI2Vsc2UKKwl2Zl9wcm92aWRlcl9pbml0KCZ2YXZzX3ZmX3Byb3YsIFBST1ZJREVSX05BTUUsICZ2YXZzX3ZmX3Byb3ZpZGVyLCBodyk7CisJdmZfcmVnX3Byb3ZpZGVyKCZ2YXZzX3ZmX3Byb3YpOworI2VuZGlmCisKKwlpZiAoaHctPnZhdnNfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSAhPSAwKSB7CisJCWlmICghaHctPmlzX3Jlc2V0KQorCQkJYXZzX3ZmX25vdGlmeV9yZWNlaXZlcihodywgUFJPVklERVJfTkFNRSwKKwkJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX0ZSX0hJTlQsCisJCQkJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKQorCQkJCQlody0+dmF2c19hbXN0cmVhbV9kZWNfaW5mby5yYXRlKSk7CisJCWh3LT5mcl9oaW50X3N0YXR1cyA9IFZERUNfSElOVEVEOworCX0gZWxzZQorCQlody0+ZnJfaGludF9zdGF0dXMgPSBWREVDX05FRURfSElOVDsKKworCWh3LT5zdGF0IHw9IFNUQVRfVkZfSE9PSzsKKworCXRpbWVyX3NldHVwKCZody0+cmVjeWNsZV90aW1lciwgdmF2c19wdXRfdGltZXJfZnVuYywgMCk7CisJLy9ody0+cmVjeWNsZV90aW1lci5kYXRhID0gKHVsb25nKShodyk7CisJLy9ody0+cmVjeWNsZV90aW1lci5mdW5jdGlvbiA9IHZhdnNfcHV0X3RpbWVyX2Z1bmM7CisJaHctPnJlY3ljbGVfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBQVVRfSU5URVJWQUw7CisKKwlhZGRfdGltZXIoJmh3LT5yZWN5Y2xlX3RpbWVyKTsKKworCWh3LT5zdGF0IHw9IFNUQVRfVElNRVJfQVJNOworCisjaWZkZWYgQVZTUF9MT05HX0NBQkFDCisJaWYgKGZpcm13YXJlX3NlbCA9PSAwKQorCQlJTklUX1dPUksoJmxvbmdfY2FiYWNfd2Rfd29yaywgbG9uZ19jYWJhY19kb193b3JrKTsKKyNlbmRpZgorCXZkZWNfc291cmNlX2NoYW5nZWQoVkZPUk1BVF9BVlMsCisJCQkJCTE5MjAsIDEwODAsIDMwKTsKKyNpZmRlZiBERUJVR19NVUxUSV9XSVRIX0FVVE9NT0RFCisJaWYgKHN0YXJ0X2RlY29kaW5nX2RlbGF5ID09IDApCisJCWFtdmRlY19zdGFydCgpOworCWVsc2UKKwkJZGVsYXlfY291bnQgPSBzdGFydF9kZWNvZGluZ19kZWxheS8xMDsKKyNlbHNlCisJYW12ZGVjX3N0YXJ0KCk7CisjZW5kaWYKKwlody0+c3RhdCB8PSBTVEFUX1ZERUNfUlVOOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtdmRlY19hdnNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdmRlY19zICpwZGF0YSA9ICooc3RydWN0IHZkZWNfcyAqKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcgPSBOVUxMOworCisJaWYgKHBkYXRhID09IE5VTEwpIHsKKwkJcHJfaW5mbygiYW12ZGVjX2F2cyBtZW1vcnkgcmVzb3VyY2UgdW5kZWZpbmVkLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWh3ID0gKHN0cnVjdCB2ZGVjX2F2c19od19zICopdnphbGxvYyhzaXplb2Yoc3RydWN0IHZkZWNfYXZzX2h3X3MpKTsKKwlpZiAoaHcgPT0gTlVMTCkgeworCQlwcl9pbmZvKCJcbmFtbXZkZWNfYXZzIGRlY29kZXIgZHJpdmVyIGFsbG9jIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlwZGF0YS0+cHJpdmF0ZSA9IGh3OworCWdodyA9IGh3OworCWF0b21pY19zZXQoJmh3LT5lcnJvcl9oYW5kbGVyX3J1biwgMCk7CisJaHctPm1faW5zX2ZsYWcgPSAwOworCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hNIHx8IGRpc2FibGVfbG9uZ2NhYmFjX3RyYW5zKQorCQlmaXJtd2FyZV9zZWwgPSAxOworCisJaWYgKGZpcm13YXJlX3NlbCA9PSAxKSB7CisjaWZuZGVmIFVTRV9EWU5BTUlDX0JVRl9OVU0KKwkJdmZfYnVmX251bSA9IDQ7CisjZW5kaWYKKwkJY2FudmFzX2Jhc2UgPSAwOworCQljYW52YXNfbnVtID0gMzsKKwl9IGVsc2UgeworCisJCWNhbnZhc19iYXNlID0gMTI4OworCQljYW52YXNfbnVtID0gMjsgLypOVjIxKi8KKwl9CisKKworCWlmIChwZGF0YS0+c3lzX2luZm8pCisJCWh3LT52YXZzX2Ftc3RyZWFtX2RlY19pbmZvID0gKnBkYXRhLT5zeXNfaW5mbzsKKworCXByX2luZm8oIiVzICglZCwlZCkgJWRcbiIsIF9fZnVuY19fLCBody0+dmF2c19hbXN0cmVhbV9kZWNfaW5mby53aWR0aCwKKwkJICAgaHctPnZhdnNfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0LCBody0+dmF2c19hbXN0cmVhbV9kZWNfaW5mby5yYXRlKTsKKworCXBkYXRhLT5kZWNfc3RhdHVzID0gdmF2c19kZWNfc3RhdHVzOworCXBkYXRhLT5zZXRfaXNyZXNldCA9IHZhdnNfc2V0X2lzcmVzZXQ7CisJaHctPmlzX3Jlc2V0ID0gMDsKKworCXBkYXRhLT51c2VyX2RhdGFfcmVhZCA9IE5VTEw7CisJcGRhdGEtPnJlc2V0X3VzZXJkYXRhX2ZpZm8gPSBOVUxMOworCisJdmF2c192ZGVjX2luZm9faW5pdChodyk7CisKKyNpZmRlZiBFTkFCTEVfVVNFUl9EQVRBCisJaWYgKE5VTEwgPT0gaHctPnVzZXJfZGF0YV9idWZmZXIpIHsKKwkJaHctPnVzZXJfZGF0YV9idWZmZXIgPQorCQkJZG1hX2FsbG9jX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlVU0VSX0RBVEFfU0laRSwKKwkJCQkmaHctPnVzZXJfZGF0YV9idWZmZXJfcGh5cywgR0ZQX0tFUk5FTCk7CisJCWlmICghaHctPnVzZXJfZGF0YV9idWZmZXIpIHsKKwkJCXByX2luZm8oIiVzOiBDYW4gbm90IGFsbG9jYXRlIGh3LT51c2VyX2RhdGFfYnVmZmVyXG4iLAorCQkJCSAgIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXByX2RlYnVnKCJody0+dXNlcl9kYXRhX2J1ZmZlciA9IDB4JXAsIGh3LT51c2VyX2RhdGFfYnVmZmVyX3BoeXMgPSAweCV4XG4iLAorCQkJaHctPnVzZXJfZGF0YV9idWZmZXIsICh1MzIpaHctPnVzZXJfZGF0YV9idWZmZXJfcGh5cyk7CisJfQorI2VuZGlmCisJSU5JVF9XT1JLKCZody0+c2V0X2Nsa193b3JrLCBhdnNfc2V0X2Nsayk7CisJaWYgKHZhdnNfaW5pdChodykgPCAwKSB7CisJCXByX2luZm8oImFtdmRlY19hdnMgaW5pdCBmYWlsZWQuXG4iKTsKKwkJa2ZyZWUoaHctPmd2cyk7CisJCWh3LT5ndnMgPSBOVUxMOworCQlwZGF0YS0+ZGVjX3N0YXR1cyA9IE5VTEw7CisJCWlmIChody0+ZncpCisJCQl2ZnJlZShody0+ZncpOworCQlody0+ZncgPSBOVUxMOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJLyp2ZGVjID0gcGRhdGE7Ki8KKworCUlOSVRfV09SSygmaHctPmZhdGFsX2Vycm9yX3dkX3dvcmssIHZhdnNfZmF0YWxfZXJyb3JfaGFuZGxlcik7CisJYXRvbWljX3NldCgmaHctPmVycm9yX2hhbmRsZXJfcnVuLCAwKTsKKyNpZmRlZiBFTkFCTEVfVVNFUl9EQVRBCisJSU5JVF9XT1JLKCZody0+dXNlcmRhdGFfcHVzaF93b3JrLCB1c2VyZGF0YV9wdXNoX2RvX3dvcmspOworI2VuZGlmCisJSU5JVF9XT1JLKCZody0+bm90aWZ5X3dvcmssIHZhdnNfbm90aWZ5X3dvcmspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW12ZGVjX2F2c19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcgPSBnaHc7CisKKwljYW5jZWxfd29ya19zeW5jKCZody0+ZmF0YWxfZXJyb3Jfd2Rfd29yayk7CisJYXRvbWljX3NldCgmaHctPmVycm9yX2hhbmRsZXJfcnVuLCAwKTsKKyNpZmRlZiBFTkFCTEVfVVNFUl9EQVRBCisJY2FuY2VsX3dvcmtfc3luYygmaHctPnVzZXJkYXRhX3B1c2hfd29yayk7CisjZW5kaWYKKwljYW5jZWxfd29ya19zeW5jKCZody0+bm90aWZ5X3dvcmspOworCWNhbmNlbF93b3JrX3N5bmMoJmh3LT5zZXRfY2xrX3dvcmspOworCWlmIChody0+c3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJYW12ZGVjX3N0b3AoKTsKKwkJaHctPnN0YXQgJj0gflNUQVRfVkRFQ19SVU47CisJfQorCisJaWYgKGh3LT5zdGF0ICYgU1RBVF9JU1JfUkVHKSB7CisJCXZkZWNfZnJlZV9pcnEoVkRFQ19JUlFfMSwgKHZvaWQgKil2YXZzX2RlY19pZCk7CisJCWh3LT5zdGF0ICY9IH5TVEFUX0lTUl9SRUc7CisJfQorCisJaWYgKGh3LT5zdGF0ICYgU1RBVF9USU1FUl9BUk0pIHsKKwkJZGVsX3RpbWVyX3N5bmMoJmh3LT5yZWN5Y2xlX3RpbWVyKTsKKwkJaHctPnN0YXQgJj0gflNUQVRfVElNRVJfQVJNOworCX0KKyNpZmRlZiBBVlNQX0xPTkdfQ0FCQUMKKwlpZiAoZmlybXdhcmVfc2VsID09IDApIHsKKwkJbXV0ZXhfbG9jaygmdmF2c19tdXRleCk7CisJCWNhbmNlbF93b3JrX3N5bmMoJmxvbmdfY2FiYWNfd2Rfd29yayk7CisJCW11dGV4X3VubG9jaygmdmF2c19tdXRleCk7CisKKwkJaWYgKGVzX3dyaXRlX2FkZHJfdmlydCkgeworI2lmIDAKKwkJCWNvZGVjX21tX2ZyZWVfZm9yX2RtYSgidmF2cyIsIGVzX3dyaXRlX2FkZHJfcGh5KTsKKyNlbHNlCisJCQlkbWFfdW5tYXBfc2luZ2xlKGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQllc193cml0ZV9hZGRyX3BoeSwKKwkJCQlNQVhfQ09ERURfRlJBTUVfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwkJCS8qa2ZyZWUoZXNfd3JpdGVfYWRkcl92aXJ0KTsqLworCQkJZXNfd3JpdGVfYWRkcl92aXJ0ID0gTlVMTDsKKyNlbmRpZgorCQl9CisKKyNpZmRlZiBCSVRTVFJFQU1fUkVBRF9UTVBfTk9fQ0FDSEUKKwkJaWYgKGJpdHN0cmVhbV9yZWFkX3RtcCkgeworCQkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCVNWQV9TVFJFQU1fQlVGX1NJWkUsIGJpdHN0cmVhbV9yZWFkX3RtcCwKKwkJCQliaXRzdHJlYW1fcmVhZF90bXBfcGh5KTsKKwkJCWJpdHN0cmVhbV9yZWFkX3RtcCA9IE5VTEw7CisJCX0KKyNlbHNlCisJCWlmIChiaXRzdHJlYW1fcmVhZF90bXApIHsKKwkJCWRtYV91bm1hcF9zaW5nbGUoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCWJpdHN0cmVhbV9yZWFkX3RtcF9waHksCisJCQkJU1ZBX1NUUkVBTV9CVUZfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwkJCWtmcmVlKGJpdHN0cmVhbV9yZWFkX3RtcCk7CisJCQliaXRzdHJlYW1fcmVhZF90bXAgPSBOVUxMOworCQl9CisjZW5kaWYKKwl9CisjZW5kaWYKKwlpZiAoaHctPnN0YXQgJiBTVEFUX1ZGX0hPT0spIHsKKwkJaWYgKGh3LT5mcl9oaW50X3N0YXR1cyA9PSBWREVDX0hJTlRFRCAmJiAhaHctPmlzX3Jlc2V0KQorCQkJYXZzX3ZmX25vdGlmeV9yZWNlaXZlcihodywgUFJPVklERVJfTkFNRSwKKwkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfRlJfRU5EX0hJTlQsIE5VTEwpOworCQlody0+ZnJfaGludF9zdGF0dXMgPSBWREVDX05PX05FRURfSElOVDsKKwkJdmZfdW5yZWdfcHJvdmlkZXIoJnZhdnNfdmZfcHJvdik7CisJCWh3LT5zdGF0ICY9IH5TVEFUX1ZGX0hPT0s7CisJfQorCisjaWZkZWYgRU5BQkxFX1VTRVJfREFUQQorCWlmIChody0+dXNlcl9kYXRhX2J1ZmZlciAhPSBOVUxMKSB7CisJCWRtYV9mcmVlX2NvaGVyZW50KAorCQkJYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJVVNFUl9EQVRBX1NJWkUsCisJCQlody0+dXNlcl9kYXRhX2J1ZmZlciwKKwkJCWh3LT51c2VyX2RhdGFfYnVmZmVyX3BoeXMpOworCQlody0+dXNlcl9kYXRhX2J1ZmZlciA9IE5VTEw7CisJCWh3LT51c2VyX2RhdGFfYnVmZmVyX3BoeXMgPSAwOworCX0KKyNlbmRpZgorCisJaWYgKGh3LT5mdykgeworCQl2ZnJlZShody0+ZncpOworCQlody0+ZncgPSBOVUxMOworCX0KKworCS8vYW12ZGVjX2Rpc2FibGUoKTsKKwkvL3ZkZWNfZGlzYWJsZV9ETUMoTlVMTCk7CisKKwlody0+cGljX3R5cGUgPSAwOworCWlmIChody0+bW1fYmxrX2hhbmRsZSkgeworCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWUoaHctPm1tX2Jsa19oYW5kbGUpOworCQlody0+bW1fYmxrX2hhbmRsZSA9IE5VTEw7CisJfQorI2lmZGVmIERFQlVHX1BUUworCXByX2RlYnVnKCJwdHMgaGl0ICVkLCBwdHMgbWlzc2VkICVkLCBpIGhpdCAlZCwgbWlzc2VkICVkXG4iLCBody0+cHRzX2hpdCwKKwkJICAgaHctPnB0c19taXNzZWQsIGh3LT5wdHNfaV9oaXQsIGh3LT5wdHNfaV9taXNzZWQpOworCXByX2RlYnVnKCJ0b3RhbCBmcmFtZSAlZCwgaHctPmF2aV9mbGFnICVkLCByYXRlICVkXG4iLCBody0+dG90YWxfZnJhbWUsIGh3LT5hdmlfZmxhZywKKwkJICAgaHctPnZhdnNfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSk7CisjZW5kaWYKKwlrZnJlZShody0+Z3ZzKTsKKwlody0+Z3ZzID0gTlVMTDsKKwl2ZnJlZShodyk7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIDAKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFtdmRlY19hdnNfZHJpdmVyID0geworCS5wcm9iZSA9IGFtdmRlY19hdnNfcHJvYmUsCisJLnJlbW92ZSA9IGFtdmRlY19hdnNfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJJVkVSX05BTUUsCisJfQorfTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCByZWN5Y2xlX2ZyYW1lcyhzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBydW5fcmVhZHkoc3RydWN0IHZkZWNfcyAqdmRlYywgdW5zaWduZWQgbG9uZyBtYXNrKQoreworCXN0cnVjdCB2ZGVjX2F2c19od19zICpodyA9CisJKHN0cnVjdCB2ZGVjX2F2c19od19zICopdmRlYy0+cHJpdmF0ZTsKKwlpbnQgcmV0ID0gMTsKKwl1bnNpZ25lZCBidWZfYnVzeV9tYXNrID0gKDEgPDwgaHctPnZmX2J1Zl9udW1fdXNlZCkgLSAxOworI2lmZGVmIERFQlVHX01VTFRJX0ZSQU1FX0lOUworCWlmICgoREVDT0RFX0lEKGh3KSA9PSAwKSAmJiBydW5fY291bnRbMF0gPiBydW5fY291bnRbMV0gJiYKKwkJcnVuX2NvdW50WzFdIDwgbWF4X3J1bl9jb3VudFsxXSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKERFQ09ERV9JRChodykgPT0gMSkgJiYgcnVuX2NvdW50WzFdID49IHJ1bl9jb3VudFswXSAmJgorCQlydW5fY291bnRbMF0gPCBtYXhfcnVuX2NvdW50WzBdKQorCQlyZXR1cm4gMDsKKworCWlmIChtYXhfcnVuX2NvdW50W0RFQ09ERV9JRChodyldID4gMCAmJgorCQlydW5fY291bnRbREVDT0RFX0lEKGh3KV0gPj0gbWF4X3J1bl9jb3VudFtERUNPREVfSUQoaHcpXSkKKwkJcmV0dXJuIDA7CisjZW5kaWYKKwlpZiAodmRlY19zdHJlYW1fYmFzZWQodmRlYykgJiYgKGh3LT5pbml0X2ZsYWcgPT0gMCkKKwkJJiYgcHJlX2RlY29kZV9idWZfbGV2ZWwgIT0gMCkgeworCQl1MzIgcnAsIHdwLCBsZXZlbDsKKworCQlycCA9IFNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF9ycCk7CisJCXdwID0gU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3dwKTsKKwkJaWYgKHdwIDwgcnApCisJCQlsZXZlbCA9IHZkZWMtPmlucHV0LnNpemUgKyB3cCAtIHJwOworCQllbHNlCisJCQlsZXZlbCA9IHdwIC0gcnA7CisKKwkJaWYgKGxldmVsIDwgcHJlX2RlY29kZV9idWZfbGV2ZWwpIHsKKwkJCWh3LT5ub3RfcnVuX3JlYWR5Kys7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmIChody0+cmVzZXRfZGVjb2RlX2ZsYWcgPT0gMCAmJgorCQlody0+YWdhaW5fZmxhZyA9PSAwICYmCisJCShody0+YnVmX3N0YXR1cyAmIGJ1Zl9idXN5X21hc2spID09IGJ1Zl9idXN5X21hc2spIHsKKwkJcmVjeWNsZV9mcmFtZXMoaHcpOworCQlpZiAoaHctPmJ1Zl9yZWN5Y2xlX3N0YXR1cyA9PSAwKQorCQkJcmV0ID0gMDsKKwl9CisKKwlpZiAoYWdhaW5fdGhyZXNob2xkID4gMCAmJgorCQlody0+cHJlX3BhcnNlcl93cl9wdHIgIT0gMCAmJgorCQlody0+YWdhaW5fZmxhZyAmJgorCQkoIXZkZWNfZnJhbWVfYmFzZWQodmRlYykpKSB7CisJCXUzMiBwYXJzZXJfd3JfcHRyID0KKwkJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF9ycCk7CisJCWlmIChwYXJzZXJfd3JfcHRyID49IGh3LT5wcmVfcGFyc2VyX3dyX3B0ciAmJgorCQkJKHBhcnNlcl93cl9wdHIgLSBody0+cHJlX3BhcnNlcl93cl9wdHIpIDwKKwkJCWFnYWluX3RocmVzaG9sZCkgeworCQkJaW50IHIgPSB2ZGVjX3N5bmNfaW5wdXQodmRlYyk7CisJCQkJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfVkZSQU1FX0RFVEFJTCwKKwkJCQkJIiVzIGJ1ZiBsZWx2ZWw6JXhcbiIsICBfX2Z1bmNfXywgcik7CisJCQlyZXQgPSAwOworCQl9CisJfQorCisJaWYgKHJldCkKKwkJaHctPm5vdF9ydW5fcmVhZHkgPSAwOworCWVsc2UKKwkJaHctPm5vdF9ydW5fcmVhZHkrKzsKKworCWlmIChyZXQgIT0gMCkgeworCQlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpCisJCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpKENPUkVfTUFTS19WREVDXzEpOworCQllbHNlCisJCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpKENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQyk7CisJfSBlbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2YXZzX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB2ZGVjX2F2c19od19zICpodyA9CisJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB2ZGVjX2F2c19od19zLCB3b3JrKTsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisJaWYgKGh3LT5kZWNfcmVzdWx0ICE9IERFQ19SRVNVTFRfQUdBSU4pCisJCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX1JVTl9GTE9XLAorCSJhbW12ZGVjX2F2czogdmF2c193b3JrLHJlc3VsdD0lZCxzdGF0dXM9JWRcbiIsCisJaHctPmRlY19yZXN1bHQsIGh3X3RvX3ZkZWMoaHcpLT5uZXh0X3N0YXR1cyk7CisJaHctPmFnYWluX2ZsYWcgPSAwOworCWlmIChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX1VTRVJEQVRBKSB7CisJCXVzZXJkYXRhX3B1c2hfcHJvY2Vzcyhodyk7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfRE9ORSkgeworCisJCWlmICghaHctPmN0eF92YWxpZCkKKwkJCWh3LT5jdHhfdmFsaWQgPSAxOworI2lmZGVmIERFQlVHX01VTFRJX0ZSQU1FX0lOUworCQkJbXNsZWVwKGRlbGF5KTsKKyNlbmRpZgorCQl2ZGVjX3ZmcmFtZV9kaXJ0eShod190b192ZGVjKGh3KSwgaHctPmNodW5rKTsKKwl9IGVsc2UgaWYgKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfQUdBSU4KKwkmJiAoaHdfdG9fdmRlYyhodyktPm5leHRfc3RhdHVzICE9CisJCVZERUNfU1RBVFVTX0RJU0NPTk5FQ1RFRCkpIHsKKwkJLyoKKwkJCXN0cmVhbSBiYXNlOiBzdHJlYW0gYnVmIGVtcHR5IG9yIHRpbWVvdXQKKwkJCWZyYW1lIGJhc2U6IHZkZWNfcHJlcGFyZV9pbnB1dCBmYWlsCisJCSovCisJCWh3LT5hZ2Fpbl9mbGFnID0gMTsKKwkJaWYgKCF2ZGVjX2hhc19tb3JlX2lucHV0KGh3X3RvX3ZkZWMoaHcpKSkgeworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0VPUzsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJcmV0dXJuOworCQl9CisJfSAgZWxzZSBpZiAoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9HRVRfREFUQQorCQkmJiAoaHdfdG9fdmRlYyhodyktPm5leHRfc3RhdHVzICE9CisJCVZERUNfU1RBVFVTX0RJU0NPTk5FQ1RFRCkpIHsKKwkJaWYgKCF2ZGVjX2hhc19tb3JlX2lucHV0KGh3X3RvX3ZkZWMoaHcpKSkgeworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0VPUzsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJcmV0dXJuOworCQl9CisJCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX1ZMRF9ERVRBSUwsCisJCSIlcyBERUNfUkVTVUxUX0dFVF9EQVRBICV4ICV4ICV4XG4iLAorCQlfX2Z1bmNfXywKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKSwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1dQKSwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSk7CisJCXZkZWNfdmZyYW1lX2RpcnR5KGh3X3RvX3ZkZWMoaHcpLCBody0+Y2h1bmspOworCQl2ZGVjX2NsZWFuX2lucHV0KGh3X3RvX3ZkZWMoaHcpKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9GT1JDRV9FWElUKSB7CisJCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX0VSUk9SLAorCQkiJXM6IGZvcmNlIGV4aXRcbiIsIF9fZnVuY19fKTsKKwkJaWYgKGh3LT5zdGF0ICYgU1RBVF9JU1JfUkVHKSB7CisJCQlhbXZkZWNfc3RvcCgpOworCQkJLypkaXNhYmxlIG1ib3ggaW50ZXJydXB0ICovCisJCQlXUklURV9WUkVHKEFTU0lTVF9NQk9YMV9NQVNLLCAwKTsKKwkJCXZkZWNfZnJlZV9pcnEoVkRFQ19JUlFfMSwgKHZvaWQgKilodyk7CisJCQlody0+c3RhdCAmPSB+U1RBVF9JU1JfUkVHOworCQl9CisJfSBlbHNlIGlmIChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0VPUykgeworCQlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19ERUNPRElORywKKwkJCSIlczogZW5kIG9mIHN0cmVhbVxuIiwgX19mdW5jX18pOworCQlpZiAoaHctPnN0YXQgJiBTVEFUX1ZERUNfUlVOKSB7CisJCQlhbXZkZWNfc3RvcCgpOworCQkJaHctPnN0YXQgJj0gflNUQVRfVkRFQ19SVU47CisJCX0KKwkJaHctPmVvcyA9IDE7CisJCXZkZWNfdmZyYW1lX2RpcnR5KGh3X3RvX3ZkZWMoaHcpLCBody0+Y2h1bmspOworCQl2ZGVjX2NsZWFuX2lucHV0KGh3X3RvX3ZkZWMoaHcpKTsKKwl9CisJaWYgKGh3LT5zdGF0ICYgU1RBVF9WREVDX1JVTikgeworI2lmIERFQlVHX01VTFRJX0ZMQUcgPT0gMQorI2Vsc2UKKwkJYW12ZGVjX3N0b3AoKTsKKyNlbmRpZgorCQlody0+c3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwl9CisJLyp3YWl0X3ZtbXBlZzEyX3NlYXJjaF9kb25lKGh3KTsqLworCWlmIChody0+c3RhdCAmIFNUQVRfVElNRVJfQVJNKSB7CisJCWRlbF90aW1lcl9zeW5jKCZody0+Y2hlY2tfdGltZXIpOworCQlody0+c3RhdCAmPSB+U1RBVF9USU1FUl9BUk07CisJfQorCWlmIChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0RPTkUpCisJCWh3LT5idWZfcmVjeWNsZV9zdGF0dXMgPSAwOworCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX1JVTl9GTE9XLCAid29yayBlbmQgJWRcbiIsIGh3LT5kZWNfcmVzdWx0KTsKKwlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpCisJCXZkZWNfY29yZV9maW5pc2hfcnVuKGh3X3RvX3ZkZWMoaHcpLCBDT1JFX01BU0tfVkRFQ18xKTsKKwllbHNlCisJCXZkZWNfY29yZV9maW5pc2hfcnVuKGh3X3RvX3ZkZWMoaHcpLCBDT1JFX01BU0tfVkRFQ18xIHwgQ09SRV9NQVNLX0hFVkMpOworCisJaWYgKGh3LT52ZGVjX2NiKSB7CisJCWh3LT52ZGVjX2NiKGh3X3RvX3ZkZWMoaHcpLCBody0+dmRlY19jYl9hcmcpOworCQlkZWJ1Z19wcmludChodywgMHg4MDAwMCwKKwkJIiVzOlxuIiwgX19mdW5jX18pOworCX0KK30KKworCitzdGF0aWMgdm9pZCByZXNldF9wcm9jZXNzX3RpbWUoc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3KQoreworCWlmICghaHctPm1faW5zX2ZsYWcpCisJCXJldHVybjsKKwlpZiAoaHctPnN0YXJ0X3Byb2Nlc3NfdGltZSkgeworCQl1bnNpZ25lZCBwcm9jZXNzX3RpbWUgPQorCQkJMTAwMCAqIChqaWZmaWVzIC0gaHctPnN0YXJ0X3Byb2Nlc3NfdGltZSkgLyBIWjsKKwkJaHctPnN0YXJ0X3Byb2Nlc3NfdGltZSA9IDA7CisJCWlmIChwcm9jZXNzX3RpbWUgPiBtYXhfcHJvY2Vzc190aW1lW0RFQ09ERV9JRChodyldKQorCQkJbWF4X3Byb2Nlc3NfdGltZVtERUNPREVfSUQoaHcpXSA9IHByb2Nlc3NfdGltZTsKKwl9Cit9CitzdGF0aWMgdm9pZCBzdGFydF9wcm9jZXNzX3RpbWUoc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3KQoreworCWh3LT5kZWNvZGVfdGltZW91dF9jb3VudCA9IDI7CisJaHctPnN0YXJ0X3Byb2Nlc3NfdGltZSA9IGppZmZpZXM7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9kZWNvZGluZ19lcnJvcihzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmOworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IFZGX1BPT0xfU0laRTsgaSsrKSB7CisJCXZmID0gJmh3LT52ZnBvb2xbaV0udmY7CisJCWlmICh2Zi0+aW5kZXggPCBody0+dmZfYnVmX251bV91c2VkKSB7CisJCQlody0+dmZwb29sW2ldLmRldGFjaGVkID0gMTsKKwkJCWh3LT52ZmJ1Zl91c2VbdmYtPmluZGV4XSA9IDA7CisJCX0KKwl9CisJaWYgKGVycm9yX2hhbmRsZV9wb2xpY3kgJiAweDIpIHsKKwkJd2hpbGUgKCFrZmlmb19pc19lbXB0eSgmaHctPmRpc3BsYXlfcSkpIHsKKwkJCWlmIChrZmlmb19nZXQoJmh3LT5kaXNwbGF5X3EsICZ2ZikpIHsKKwkJCQlpZiAoYnVmX29mX3ZmKHZmKS0+ZGV0YWNoZWQgIT0wKSB7CisJCQkJCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX0RFQ09ESU5HLAorCQkJCQkJIiVzIHJlY3ljbGUgJWQgPT4gbmV3ZnJhbWVfcVxuIiwKKwkJCQkJCV9fZnVuY19fLAorCQkJCQkJdmYtPmluZGV4KTsKKwkJCQkJdmYtPmluZGV4ID0gaHctPnZmX2J1Zl9udW1fdXNlZDsKKwkJCQkJYnVmX29mX3ZmKHZmKS0+ZGV0YWNoZWQgPSAwOworCQkJCQlrZmlmb19wdXQoJmh3LT5uZXdmcmFtZV9xLAorCQkJCQkJKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwkJCQl9CisJCQl9CisKKwkJfQorCX0KKwljbGVhcl9wdHNfYnVmKGh3KTsKKwlody0+ZGVjb2RlX3BpY19jb3VudCA9IDA7CisJaHctPnJlc2V0X2RlY29kZV9mbGFnID0gMTsKKwlody0+cHJlX3BhcnNlcl93cl9wdHIgPSAwOworCWh3LT5idWZfc3RhdHVzID0gMDsKKwlody0+dGhyb3dfcGJfZmxhZyA9IDE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCB0aW1lb3V0X3Byb2Nlc3Moc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3KQoreworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGh3KTsKKwlhbXZkZWNfc3RvcCgpOworCWlmIChlcnJvcl9oYW5kbGVfcG9saWN5ICYgMHgxKSB7CisJCWhhbmRsZV9kZWNvZGluZ19lcnJvcihodyk7CisJfSBlbHNlIHsKKwkJdmF2c19zYXZlX3JlZ3MoaHcpOworCisJCS8vaWYgKGh3LT5kZWNvZGVfcGljX2NvdW50ID09IDApCisJCWh3LT5kZWNvZGVfcGljX2NvdW50Kys7CisJCWlmICgoaHctPmRlY29kZV9waWNfY291bnQgJiAweGZmZmYpID09IDApIHsKKwkJLyptYWtlIHVjb2RlIGRvIG5vdCBoYW5kbGUgaXQgYXMgZmlyc3QgcGljdHVyZSovCisJCQlody0+ZGVjb2RlX3BpY19jb3VudCsrOworCQl9CisJfQorCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworCisJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfRVJST1IsCisJIiVzIGRlY29kZXIgdGltZW91dCwgc3RhdHVzPSVkLCBsZXZlbD0lZCwgYml0X2NudD0weCV4XG4iLAorCV9fZnVuY19fLCB2ZGVjLT5zdGF0dXMsIFJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCksIFJFQURfVlJFRyhWSUZGX0JJVF9DTlQpKTsKKwlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworfQorCisKK3N0YXRpYyB2b2lkIHJlY3ljbGVfZnJhbWVfYnVmZmVyaW4oc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3KQoreworCWlmICgha2ZpZm9faXNfZW1wdHkoJmh3LT5yZWN5Y2xlX3EpICYmIChSRUFEX1ZSRUcoQVZTX0JVRkZFUklOKSA9PSAwKSkgeworCQlzdHJ1Y3QgdmZyYW1lX3MgKnZmOworCisJCWlmIChrZmlmb19nZXQoJmh3LT5yZWN5Y2xlX3EsICZ2ZikpIHsKKwkJCWlmIChidWZfb2ZfdmYodmYpLT5kZXRhY2hlZCkgeworCQkJCWRlYnVnX3ByaW50KGh3LCAwLAorCQkJCQkiJXMgcmVjeWNsZSBkZXRhY2hlZCB2ZiwgaW5kZXg9JWQgZGV0Y2hlZCAlZCB1c2VkICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgdmYtPmluZGV4LAorCQkJCQlidWZfb2ZfdmYodmYpLT5kZXRhY2hlZCwKKwkJCQkJaHctPnZmYnVmX3VzZVt2Zi0+aW5kZXhdKTsKKwkJCX0KKwkJCWlmICgodmYtPmluZGV4IDwgaHctPnZmX2J1Zl9udW1fdXNlZCkgJiYKKwkJCQkoYnVmX29mX3ZmKHZmKS0+ZGV0YWNoZWQgPT0gMCkgJiYKKwkJCSAoLS1ody0+dmZidWZfdXNlW3ZmLT5pbmRleF0gPT0gMCkpIHsKKwkJCQlody0+YnVmX3JlY3ljbGVfc3RhdHVzIHw9ICgxIDw8IHZmLT5pbmRleCk7CisJCQkJV1JJVEVfVlJFRyhBVlNfQlVGRkVSSU4sIH4oMSA8PCB2Zi0+aW5kZXgpKTsKKwkJCQlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19ERUNPRElORywKKwkJCQkJIiVzIFdSSVRFX1ZSRUcoQVZTX0JVRkZFUklOLCAweCV4KSBmb3IgdmYgaW5kZXggb2YgJWQgPT4gYnVmX3JlY3ljbGVfc3RhdHVzIDB4JXhcbiIsCisJCQkJCV9fZnVuY19fLAorCQkJCQlSRUFEX1ZSRUcoQVZTX0JVRkZFUklOKSwgdmYtPmluZGV4LAorCQkJCQlody0+YnVmX3JlY3ljbGVfc3RhdHVzKTsKKwkJCX0KKwkJCXZmLT5pbmRleCA9IGh3LT52Zl9idWZfbnVtX3VzZWQ7CisJCQlidWZfb2ZfdmYodmYpLT5kZXRhY2hlZCA9IDA7CisJCQlrZmlmb19wdXQoJmh3LT5uZXdmcmFtZV9xLAorCQkJCQkgIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCX0KKworCX0KKworfQorCitzdGF0aWMgdm9pZCByZWN5Y2xlX2ZyYW1lcyhzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcpCit7CisJd2hpbGUgKCFrZmlmb19pc19lbXB0eSgmaHctPnJlY3ljbGVfcSkpIHsKKwkJc3RydWN0IHZmcmFtZV9zICp2ZjsKKworCQlpZiAoa2ZpZm9fZ2V0KCZody0+cmVjeWNsZV9xLCAmdmYpKSB7CisJCQlpZiAoYnVmX29mX3ZmKHZmKS0+ZGV0YWNoZWQpIHsKKwkJCQlkZWJ1Z19wcmludChodywgMCwKKwkJCQkJIiVzIHJlY3ljbGUgZGV0YWNoZWQgdmYsIGluZGV4PSVkIGRldGNoZWQgJWQgdXNlZCAlZFxuIiwKKwkJCQkJX19mdW5jX18sIHZmLT5pbmRleCwKKwkJCQkJYnVmX29mX3ZmKHZmKS0+ZGV0YWNoZWQsCisJCQkJCWh3LT52ZmJ1Zl91c2VbdmYtPmluZGV4XSk7CisJCQl9CisKKworCQkJaWYgKCh2Zi0+aW5kZXggPCBody0+dmZfYnVmX251bV91c2VkKSAmJgorCQkJCShidWZfb2ZfdmYodmYpLT5kZXRhY2hlZCA9PSAwKSAmJgorCQkJICgtLWh3LT52ZmJ1Zl91c2VbdmYtPmluZGV4XSA9PSAwKSkgeworCQkJCWh3LT5idWZfcmVjeWNsZV9zdGF0dXMgfD0gKDEgPDwgdmYtPmluZGV4KTsKKwkJCQlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19ERUNPRElORywKKwkJCQkJIiVzIGZvciB2ZiBpbmRleCBvZiAlZCA9PiBidWZfcmVjeWNsZV9zdGF0dXMgMHgleFxuIiwKKwkJCQkJX19mdW5jX18sCisJCQkJCXZmLT5pbmRleCwKKwkJCQkJaHctPmJ1Zl9yZWN5Y2xlX3N0YXR1cyk7CisJCQl9CisJCQl2Zi0+aW5kZXggPSBody0+dmZfYnVmX251bV91c2VkOworCQkJYnVmX29mX3ZmKHZmKS0+ZGV0YWNoZWQgPSAwOworCQkJa2ZpZm9fcHV0KCZody0+bmV3ZnJhbWVfcSwKKwkJCQkoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQl9CisKKwl9CisKK30KKworCitzdGF0aWMgdm9pZCBjaGVja190aW1lcl9mdW5jKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKK3sKKwlzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcgPSBjb250YWluZXJfb2YodGltZXIsCisJCXN0cnVjdCB2ZGVjX2F2c19od19zLCBjaGVja190aW1lcik7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaHcpOworCXVuc2lnbmVkIGludCB0aW1lb3V0X3ZhbCA9IGRlY29kZV90aW1lb3V0X3ZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGh3LT5tX2luc19mbGFnICYmCisJCShkZWJ1ZyAmCisJCURFQlVHX1dBSVRfREVDT0RFX0RPTkVfV0hFTl9TVE9QKSA9PSAwICYmCisJCXZkZWMtPm5leHRfc3RhdHVzID09CisJCVZERUNfU1RBVFVTX0RJU0NPTk5FQ1RFRCkgeworCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRk9SQ0VfRVhJVDsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCWRlYnVnX3ByaW50KGh3LAorCQkJMCwgInZkZWMgcmVxdWVzdGVkIHRvIGJlIGRpc2Nvbm5lY3RlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKnJlY3ljbGUqLworCWlmICghaHctPm1faW5zX2ZsYWcpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKKwkJcmVjeWNsZV9mcmFtZV9idWZmZXJpbihodyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKKwl9CisKKwlpZiAoaHctPm1faW5zX2ZsYWcpIHsKKwkJaWYgKChSRUFEX1ZSRUcoQVZfU0NSQVRDSF81KSAmIDB4ZikgIT0gMCAmJgorCQkJKFJFQURfVlJFRyhBVl9TQ1JBVENIXzUpICYgMHhmZjAwKSAhPSAwKXsKKwkJCS8qdWNvZGUgYnVmZmVyIGVtcHR5Ki8KKwkJCWlmICgoa2ZpZm9fbGVuKCZody0+cmVjeWNsZV9xKSA9PSAwKSAmJgorCQkJCShrZmlmb19sZW4oJmh3LT5kaXNwbGF5X3EpID09IDApKSB7CisJCQkJZGVidWdfcHJpbnQoaHcsCisJCQkJCTAsICJBVl9TQ1JBVENIXzU9MHgleCwgcmVjb3ZlciB1Y29kZSBidWZmZXJfc3RhdHVzXG4iLAorCQkJCQlSRUFEX1ZSRUcoQVZfU0NSQVRDSF81KSk7CisJCQkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzUsIDB4MTApOworCQkJCS8qbGV0IHVjb2RlIHRvIHJlY292ZXIgYnVmZmVyX3N0YXR1cyovCisJCQl9CisJCX0KKwl9CisJaWYgKHJhZHIgIT0gMCkgeworCQlpZiAocnZhbCAhPSAwKSB7CisJCQlXUklURV9WUkVHKHJhZHIsIHJ2YWwpOworCQkJcHJfaW5mbygiV1JJVEVfVlJFRygleCwleClcbiIsIHJhZHIsIHJ2YWwpOworCQl9IGVsc2UKKwkJCXByX2luZm8oIlJFQURfVlJFRygleCk9JXhcbiIsIHJhZHIsIFJFQURfVlJFRyhyYWRyKSk7CisJCXJ2YWwgPSAwOworCQlyYWRyID0gMDsKKwl9CisKKwlpZiAodWRlYnVnX2ZsYWcgIT0gaHctPm9sZF91ZGVidWdfZmxhZykgeworCQlXUklURV9WUkVHKERFQ09ERV9TVE9QX1BPUywgdWRlYnVnX2ZsYWcpOworCQlody0+b2xkX3VkZWJ1Z19mbGFnID0gdWRlYnVnX2ZsYWc7CisJfQorCWlmIChkYmdfY21kICE9IDApIHsKKwkJaWYgKGRiZ19jbWQgPT0gMSkgeworCQkJaW50IHIgPSB2ZGVjX3N5bmNfaW5wdXQodmRlYyk7CisJCQlkYmdfY21kID0gMDsKKwkJCXByX2luZm8oCisJCQkJInZkZWNfc3luY19pbnB1dD0+MHgleCwgKGxldiAleCwgd3AgJXggcnAgJXgsIHBycCAleCwgcHdwICV4KVxuIiwKKwkJCQlyLAorCQkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCksCisJCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1dQKSwKKwkJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApLAorCQkJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF9ycCksCisJCQkJU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3dwKSk7CisJCX0KKwl9CisKKwlpZiAoKGRlYnVnICYgREVCVUdfRkxBR19ESVNBQkxFX1RJTUVPVVQpID09IDAgJiYKKwkJKHRpbWVvdXRfdmFsID4gMCkgJiYKKwkJKGh3LT5zdGFydF9wcm9jZXNzX3RpbWUgPiAwKSAmJgorCQkoKDEwMDAgKiAoamlmZmllcyAtIGh3LT5zdGFydF9wcm9jZXNzX3RpbWUpIC8gSFopCisJCQkJPiB0aW1lb3V0X3ZhbCkpIHsKKwkJaWYgKGh3LT5sYXN0X3ZsZF9sZXZlbCA9PSBSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpKSB7CisJCQlpZiAoaHctPmRlY29kZV90aW1lb3V0X2NvdW50ID4gMCkKKwkJCQlody0+ZGVjb2RlX3RpbWVvdXRfY291bnQtLTsKKwkJCWlmIChody0+ZGVjb2RlX3RpbWVvdXRfY291bnQgPT0gMCkKKwkJCQl0aW1lb3V0X3Byb2Nlc3MoaHcpOworCQl9CisJCWh3LT5sYXN0X3ZsZF9sZXZlbCA9IFJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCk7CisJfQorCisJaWYgKFJFQURfVlJFRyhBVlNfU09TX0NPVU5UKSkgeworCQlpZiAoIWVycm9yX3JlY292ZXJ5X21vZGUpIHsKKwkJCWFtdmRlY19zdG9wKCk7CisJCQlpZiAoZXJyb3JfaGFuZGxlX3BvbGljeSAmIDB4MSkgeworCQkJCWhhbmRsZV9kZWNvZGluZ19lcnJvcihodyk7CisJCQl9IGVsc2UgeworCQkJCXZhdnNfc2F2ZV9yZWdzKGh3KTsKKworCQkJCS8vaWYgKGh3LT5kZWNvZGVfcGljX2NvdW50ID09IDApCisJCQkJaHctPmRlY29kZV9waWNfY291bnQrKzsKKwkJCQlpZiAoKGh3LT5kZWNvZGVfcGljX2NvdW50ICYgMHhmZmZmKSA9PSAwKSB7CisJCQkJLyptYWtlIHVjb2RlIGRvIG5vdCBoYW5kbGUgaXQgYXMgZmlyc3QgcGljdHVyZSovCisJCQkJCWh3LT5kZWNvZGVfcGljX2NvdW50Kys7CisJCQkJfQorCQkJfQorCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisKKwkJCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX0VSUk9SLAorCQkJIiVzIGRlY29kZXIgZXJyb3IsIHN0YXR1cz0lZCwgbGV2ZWw9JWQsIEFWU19TT1NfQ09VTlQ9MHgleFxuIiwKKwkJCV9fZnVuY19fLCB2ZGVjLT5zdGF0dXMsIFJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCksCisJCQlSRUFEX1ZSRUcoQVZTX1NPU19DT1VOVCkpOworCQkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQl9CisJfQorCisJaWYgKChody0+dWNvZGVfcGF1c2VfcG9zICE9IDApICYmCisJCShody0+dWNvZGVfcGF1c2VfcG9zICE9IDB4ZmZmZmZmZmYpICYmCisJCXVkZWJ1Z19wYXVzZV9wb3MgIT0gaHctPnVjb2RlX3BhdXNlX3BvcykgeworCQlody0+dWNvZGVfcGF1c2VfcG9zID0gMDsKKwkJV1JJVEVfVlJFRyhERUJVR19SRUcxLCAwKTsKKwl9CisKKwlpZiAodmRlYy0+bmV4dF9zdGF0dXMgPT0gVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEKSB7CisJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9GT1JDRV9FWElUOworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJcHJfaW5mbygidmRlYyByZXF1ZXN0ZWQgdG8gYmUgZGlzY29ubmVjdGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW1vZF90aW1lcigmaHctPmNoZWNrX3RpbWVyLCBqaWZmaWVzICsgQ0hFQ0tfSU5URVJWQUwpOworfQorCitzdGF0aWMgaW50IGF2c19od19jdHhfcmVzdG9yZShzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqaHcpCit7CisJLyppbnQgciA9IDA7Ki8KKwl2YXZzX3Byb3RfaW5pdChodyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgZ2V0X2RhdGFfY2hlY2tfc3VtCisJKHN0cnVjdCB2ZGVjX2F2c19od19zICpodywgaW50IHNpemUpCit7CisJaW50IGpqOworCWludCBzdW0gPSAwOworCXU4ICpkYXRhID0gTlVMTDsKKworCWlmICghaHctPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQlkYXRhID0gY29kZWNfbW1fdm1hcChody0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQlody0+Y2h1bmstPm9mZnNldCwgc2l6ZSk7CisJZWxzZQorCQlkYXRhID0gKCh1OCAqKWh3LT5jaHVuay0+YmxvY2stPnN0YXJ0X3ZpcnQpICsKKwkJCWh3LT5jaHVuay0+b2Zmc2V0OworCisJZm9yIChqaiA9IDA7IGpqIDwgc2l6ZTsgamorKykKKwkJc3VtICs9IGRhdGFbampdOworCisJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIoZGF0YSk7CisJcmV0dXJuIHN1bTsKK30KKworc3RhdGljIHZvaWQgcnVuKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHVuc2lnbmVkIGxvbmcgbWFzaywKK3ZvaWQgKCpjYWxsYmFjaykoc3RydWN0IHZkZWNfcyAqLCB2b2lkICopLAorCQl2b2lkICphcmcpCit7CisJc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3ID0KKwkoc3RydWN0IHZkZWNfYXZzX2h3X3MgKil2ZGVjLT5wcml2YXRlOworCWludCBzYXZlX3JlZzsKKwlpbnQgc2l6ZSwgcmV0OworCWlmICghaHctPnZkZWNfcGdfZW5hYmxlX2ZsYWcpIHsKKwkJaHctPnZkZWNfcGdfZW5hYmxlX2ZsYWcgPSAxOworCQlhbXZkZWNfZW5hYmxlKCk7CisJfQorCXNhdmVfcmVnID0gUkVBRF9WUkVHKFBPV0VSX0NUTF9WTEQpOworCS8qIHJlc2V0IGV2ZXJ5dGhpbmcgZXhjZXB0IERPU19UT1BbMV0gYW5kIEFQQl9DQlVTWzBdKi8KKwlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19SVU5fRkxPVywicnVuIGluXG4iKTsKKwlpZiAodmRlY19zdHJlYW1fYmFzZWQodmRlYykpIHsKKwkJaHctPnByZV9wYXJzZXJfd3JfcHRyID0KKwkJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCk7CisJfQorI2lmIDEKKyNpZiBERUJVR19NVUxUSV9GTEFHID4gMAorCWlmIChody0+ZGVjb2RlX3BpY19jb3VudCA9PSAwKSB7CisjZW5kaWYKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsIDB4ZmZmZmZmZjApOworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgMCk7CisJV1JJVEVfVlJFRyhQT1dFUl9DVExfVkxELCBzYXZlX3JlZyk7CisJaHctPnJ1bl9jb3VudCsrOworCXJ1bl9jb3VudFtERUNPREVfSUQoaHcpXSA9IGh3LT5ydW5fY291bnQ7CisJdmRlY19yZXNldF9jb3JlKHZkZWMpOworI2lmIERFQlVHX01VTFRJX0ZMQUcgPiAwCisJfQorI2VuZGlmCisjZWxzZQorCXZkZWNfcmVzZXRfY29yZSh2ZGVjKTsKKyNlbmRpZgorCWh3LT52ZGVjX2NiX2FyZyA9IGFyZzsKKwlody0+dmRlY19jYiA9IGNhbGxiYWNrOworCisJc2l6ZSA9IHZkZWNfcHJlcGFyZV9pbnB1dCh2ZGVjLCAmaHctPmNodW5rKTsKKwlpZiAoZGVidWcgJiBERUJVR19GTEFHX1BSRVBBUkVfTU9SRV9JTlBVVCkgeworCQlpZiAoc2l6ZSA8IHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwpIHsKKwkJCS8qZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfVkxEX0RFVEFJTCwKKwkJCQkiREVDX1JFU1VMVF9BR0FJTiAleCAleCAleFxuIiwKKwkJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpLAorCQkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19XUCksCisJCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSk7Ki8KKworCQkJaHctPmlucHV0X2VtcHR5Kys7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfQUdBSU47CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChzaXplIDwgMCkgeworCQkJaHctPmlucHV0X2VtcHR5Kys7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfQUdBSU47CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlpZiAoaW5wdXRfZnJhbWVfYmFzZWQodmRlYykpIHsKKwkJdTggKmRhdGEgPSBOVUxMOworCisJCWlmICghaHctPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQkJZGF0YSA9IGNvZGVjX21tX3ZtYXAoaHctPmNodW5rLT5ibG9jay0+c3RhcnQgKworCQkJCWh3LT5jaHVuay0+b2Zmc2V0LCBzaXplKTsKKwkJZWxzZQorCQkJZGF0YSA9ICgodTggKilody0+Y2h1bmstPmJsb2NrLT5zdGFydF92aXJ0KSArCisJCQkJaHctPmNodW5rLT5vZmZzZXQ7CisKKwkJaWYgKGRlYnVnICYgUFJJTlRfRkxBR19SVU5fRkxPVworCQkJKSB7CisJCQlkZWJ1Z19wcmludChodywgMCwKKwkJCSIlcyBkZWNvZGVfcGljX2NvdW50ICVkIGJ1Zl9yZWN5Y2xlX3N0YXR1cyAweCV4OiBzaXplIDB4JXggc3VtIDB4JXggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggLi4gJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCV9fZnVuY19fLCBody0+ZGVjb2RlX3BpY19jb3VudCwKKwkJCWh3LT5idWZfcmVjeWNsZV9zdGF0dXMsCisJCQlzaXplLCBnZXRfZGF0YV9jaGVja19zdW0oaHcsIHNpemUpLAorCQkJZGF0YVswXSwgZGF0YVsxXSwgZGF0YVsyXSwgZGF0YVszXSwKKwkJCWRhdGFbNF0sIGRhdGFbNV0sIGRhdGFbc2l6ZSAtIDRdLAorCQkJZGF0YVtzaXplIC0gM10sCWRhdGFbc2l6ZSAtIDJdLAorCQkJZGF0YVtzaXplIC0gMV0pOworCQl9CisJCWlmIChkZWJ1ZyAmIFBSSU5UX0ZSQU1FQkFTRV9EQVRBCisJCQkpIHsKKwkJCWludCBqajsKKworCQkJZm9yIChqaiA9IDA7IGpqIDwgc2l6ZTsgamorKykgeworCQkJCWlmICgoamogJiAweGYpID09IDApCisJCQkJCWRlYnVnX3ByaW50KGh3LAorCQkJCQlQUklOVF9GUkFNRUJBU0VfREFUQSwKKwkJCQkJCSIlMDZ4OiIsIGpqKTsKKwkJCQlkZWJ1Z19wcmludChodywKKwkJCQlQUklOVF9GUkFNRUJBU0VfREFUQSwKKwkJCQkJIiUwMnggIiwgZGF0YVtqal0pOworCQkJCWlmICgoKGpqICsgMSkgJiAweGYpID09IDApCisJCQkJCWRlYnVnX3ByaW50KGh3LAorCQkJCQlQUklOVF9GUkFNRUJBU0VfREFUQSwKKwkJCQkJCSJcbiIpOworCQkJfQorCQl9CisKKwkJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQljb2RlY19tbV91bm1hcF9waHlhZGRyKGRhdGEpOworCX0gZWxzZQorCQlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19SVU5fRkxPVywKKwkJCSIlcyBkZWNvZGVfcGljX2NvdW50ICVkIGJ1Zl9yZWN5Y2xlX3N0YXR1cyAweCV4OiAleCAleCAleCAleCAleCBzaXplIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWh3LT5kZWNvZGVfcGljX2NvdW50LAorCQkJaHctPmJ1Zl9yZWN5Y2xlX3N0YXR1cywKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCksCisJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSwKKwkJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF9ycCksCisJCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApLAorCQkJc2l6ZSk7CisKKworCWh3LT5pbnB1dF9lbXB0eSA9IDA7CisJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfUlVOX0ZMT1csCisJIiVzLCVkLCBzaXplPSVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHNpemUpOworCisJLyp2ZGVjX2VuYWJsZV9pbnB1dCh2ZGVjKTsKKwkJbmVlZCBydW4gYWZ0ZXIgVkMxX0NPTlRST0xfUkVHIGlzIGNvbmZpZ3VyZWQKKwkqLworCWh3LT5pbml0X2ZsYWcgPSAxOworCisJaWYgKGh3LT5jaHVuaykKKwkJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfUlVOX0ZMT1csCisJCSJpbnB1dCBjaHVuayBvZmZzZXQgJWQsIHNpemUgJWRcbiIsCisJCQlody0+Y2h1bmstPm9mZnNldCwgaHctPmNodW5rLT5zaXplKTsKKworCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9OT05FOworCS8qdmRlYy0+bWNfbG9hZGVkID0gMDsqLworCWlmICh2ZGVjLT5tY19sb2FkZWQpIHsKKwkvKmZpcm13YXJlIGhhdmUgbG9hZCBiZWZvcmUsCisJICBhbmQgbm90IGNoYW5nZXMgdG8gYW5vdGhlci4KKwkgIGlnbm9yZSByZWxvYWQuCisJKi8KKwl9IGVsc2UgeworCQlyZXQgPSBhbXZkZWNfdmRlY19sb2FkbWNfYnVmX2V4KFZGT1JNQVRfQVZTLCAiYXZzX211bHRpIiwgdmRlYywKKwkJCWh3LT5mdy0+ZGF0YSwgaHctPmZ3LT5sZW4pOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCJbJWRdICVzOiB0aGUgJXMgZncgbG9hZGluZyBmYWlsZWQsIGVycjogJXhcbiIsIHZkZWMtPmlkLAorCQkJCWh3LT5mdy0+bmFtZSwgdGVlX2VuYWJsZWQoKSA/ICJURUUiIDogImxvY2FsIiwgcmV0KTsKKwkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9GT1JDRV9FWElUOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQlyZXR1cm47CisJCX0KKwkJdmRlYy0+bWNfbG9hZGVkID0gMTsKKwkJdmRlYy0+bWNfdHlwZSA9IFZGT1JNQVRfQVZTOworCX0KKwlpZiAoYXZzX2h3X2N0eF9yZXN0b3JlKGh3KSA8IDApIHsKKwkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0VSUk9SOworCQlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19FUlJPUiwKKwkJImFtbXZkZWNfYXZzOiBlcnJvciBIVyBjb250ZXh0IHJlc3RvcmVcbiIpOworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJCVRoaXMgY29uZmlndXJlYXRpb24gb2YgVkMxX0NPTlRST0xfUkVHIHdpbGwKKwkJcG9wIGJpdHMgKGV2ZW4gbm8gZGF0YSBpbiB0aGUgc3RyZWFtIGJ1ZmZlcikgaWYgaW5wdXQgaXMgZW5hYmxlZCwKKwkJc28gaXQgY2FuIG9ubHkgYmUgY29uZmlndXJlZCBiZWZvcmUgdmRlY19lbmFibGVfaW5wdXQoKSBpcyBjYWxsZWQuCisJCVNvIG1vdmUgdGhpcyBjb2RlIGZyb20gdWNvZGUgdG8gaGVyZQorCSovCisjZGVmaW5lIERJU0FCTEVfREJMS19IQ01EICAgMAorI2RlZmluZSBESVNBQkxFX01DX0hDTUQgMAorCVdSSVRFX1ZSRUcoVkMxX0NPTlRST0xfUkVHLCAoRElTQUJMRV9EQkxLX0hDTUQ8PDYpIHwKKwkJKERJU0FCTEVfTUNfSENNRDw8NSkgfCAoMSA8PCA3KSB8ICgweGMgPDw4KSB8ICgxPDwxNCkpOworCWlmICh2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpKSB7CisJCQlzaXplID0gaHctPmNodW5rLT5zaXplICsKKwkJCQkoaHctPmNodW5rLT5vZmZzZXQgJiAoVkRFQ19GSUZPX0FMSUdOIC0gMSkpOworCQl9CisKKworCXZkZWNfZW5hYmxlX2lucHV0KHZkZWMpOworCS8qKi8KKworCS8qd21iKCk7Ki8KKwlody0+c3RhdCB8PSBTVEFUX01DX0xPQUQ7CisJaHctPmxhc3RfdmxkX2xldmVsID0gMDsKKworCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX0RFQ09ESU5HLAorCQkiJXMgUkVBRF9WUkVHKEFWU19CVUZGRVJJTik9MHgleCwgcmVjeWNsZV9xIG51bSAlZFxuIiwKKwkJX19mdW5jX18sIFJFQURfVlJFRyhBVlNfQlVGRkVSSU4pLAorCQlrZmlmb19sZW4oJmh3LT5yZWN5Y2xlX3EpKTsKKworCVdSSVRFX1ZSRUcoVklGRl9CSVRfQ05ULCBzaXplICogOCk7CisJaWYgKGh3LT5yZXNldF9kZWNvZGVfZmxhZykKKwkJV1JJVEVfVlJFRyhERUNPREVfU1RBVFVTLCAwKTsKKwllbHNlIHsKKwkJcmVjeWNsZV9mcmFtZXMoaHcpOworCQlhdnNfcHRzX2NoZWNrX2luKGh3LAorCQkJaHctPmRlY29kZV9waWNfY291bnQgJiAweGZmZmYsCisJCQlody0+Y2h1bmspOworCisJCVdSSVRFX1ZSRUcoREVDT0RFX1NUQVRVUywKKwkJCShody0+ZGVjb2RlX3BpY19jb3VudCAmIDB4ZmZmZikgfAorCQkJKCh+aHctPmJ1Zl9yZWN5Y2xlX3N0YXR1cykgPDwgMTYpKTsKKwl9CisKKwlody0+cmVzZXRfZGVjb2RlX2ZsYWcgPSAwOworCS8vaHctPmRlY29kZV9zdGF0dXNfc2tpcF9waWNfZG9uZV9mbGFnID0gMDsKKwlzdGFydF9wcm9jZXNzX3RpbWUoaHcpOworI2lmIERFQlVHX01VTFRJX0ZMQUcgPT0gMQorCWlmIChody0+ZGVjb2RlX3BpY19jb3VudCA+IDApCisJCVdSSVRFX1ZSRUcoREVDT0RFX1NUQVRVUywgMHhmZik7CisJZWxzZQorI2VuZGlmCisJYW12ZGVjX3N0YXJ0KCk7CisJaHctPnN0YXQgfD0gU1RBVF9WREVDX1JVTjsKKworCWh3LT5zdGF0IHw9IFNUQVRfVElNRVJfQVJNOworCisJbW9kX3RpbWVyKCZody0+Y2hlY2tfdGltZXIsIGppZmZpZXMgKyBDSEVDS19JTlRFUlZBTCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0KHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB2bWF2c19pc3JfdGhyZWFkX2ZuKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBpcnEpCit7CisJCXN0cnVjdCB2ZGVjX2F2c19od19zICpodyA9CisJCQkoc3RydWN0IHZkZWNfYXZzX2h3X3MgKil2ZGVjLT5wcml2YXRlOworCQl1MzIgcmVnOworCQlzdHJ1Y3QgdmZyYW1lX3MgKnZmID0gTlVMTDsKKwkJdTMyIGR1cjsKKwkJdTMyIHJlcGVhdF9jb3VudDsKKwkJdTMyIHBpY3R1cmVfdHlwZTsKKwkJdTMyIGJ1ZmZlcl9pbmRleDsKKwkJdTMyIGZyYW1lX3NpemU7CisJCWJvb2wgZm9yY2VfaW50ZXJsYWNlZF9mcmFtZSA9IGZhbHNlOworCQl1bnNpZ25lZCBpbnQgcHRzLCBwdHNfdmFsaWQgPSAwLCBvZmZzZXQgPSAwOworCQl1NjQgcHRzX3VzNjQ7CisJCXUzMiBkZWJ1Z190YWc7CisJCXUzMiBidWZmZXJfc3RhdHVzX2RlYnVnOworCQkvL3N0cnVjdCB2ZGVjX2F2c19od19zICpodyA9IChzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqKWRldl9pZDsKKworCQkvKmlmIChkZWJ1ZyAmIEFWU19ERUJVR19VQ09ERSkgeworCQkJaWYgKFJFQURfVlJFRyhBVl9TQ1JBVENIX0UpICE9IDApIHsKKwkJCQlwcl9pbmZvKCJkYmcleDogJXhcbiIsIFJFQURfVlJFRyhBVl9TQ1JBVENIX0UpLAorCQkJCQkgICBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9EKSk7CisJCQkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0UsIDApOworCQkJfQorCQl9Ki8KKworCQlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19SVU5fRkxPVywgIlJFQURfVlJFRyhBVlNfQlVGRkVST1VUKSAweCV4LCBSRUFEX1ZSRUcoREVDT0RFX1NUQVRVUykgMHgleCBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9OKSAweCV4LCBSRUFEX1ZSRUcoREVCVUdfUkVHMSkgMHgleFxuIiwKKwkJCQlSRUFEX1ZSRUcoQVZTX0JVRkZFUk9VVCksUkVBRF9WUkVHKERFQ09ERV9TVEFUVVMpLCBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9OKSwgUkVBRF9WUkVHKERFQlVHX1JFRzEpKTsKKworCQlkZWJ1Z190YWcgPSBSRUFEX1ZSRUcoREVCVUdfUkVHMSk7CisJCWJ1ZmZlcl9zdGF0dXNfZGVidWcgPSBkZWJ1Z190YWcgPj4gMTY7CisJCWRlYnVnX3RhZyAmPSAweGZmZmY7CisJCS8qIGlmIChkZWJ1Z190YWcgJiAweDEwMDAwKSB7CisJCQlpbnQgaTsKKwkJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KAorCQkJCWFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlody0+bG1lbV9waHlfYWRkciwKKwkJCQlMTUVNX0JVRl9TSVpFLAorCQkJCURNQV9GUk9NX0RFVklDRSk7CisKKwkJCWRlYnVnX3ByaW50KGh3LCAwLAorCQkJCSJMTUVNPHRhZyAleD46XG4iLCBkZWJ1Z190YWcpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgMHg0MDA7IGkgKz0gNCkgeworCQkJCWludCBpaTsKKwkJCQl1bnNpZ25lZCBzaG9ydCAqbG1lbV9wdHIgPSBody0+bG1lbV9hZGRyOworCQkJCWlmICgoaSAmIDB4ZikgPT0gMCkKKwkJCQkJZGVidWdfcHJpbnRfY29udChodywgMCwgIiUwM3g6ICIsIGkpOworCQkJCWZvciAoaWkgPSAwOyBpaSA8IDQ7IGlpKyspIHsKKwkJCQkJZGVidWdfcHJpbnRfY29udChodywgMCwgIiUwNHggIiwKKwkJCQkJCSAgIGxtZW1fcHRyW2kgKyAzIC0gaWldKTsKKwkJCQl9CisJCQkJaWYgKCgoaSArIGlpKSAmIDB4ZikgPT0gMCkKKwkJCQkJZGVidWdfcHJpbnRfY29udChodywgMCwgIlxuIik7CisJCQl9CisKKwkJCWlmICgoKHVkZWJ1Z19wYXVzZV9wb3MgJiAweGZmZmYpCisJCQkJPT0gKGRlYnVnX3RhZyAmIDB4ZmZmZikpICYmCisJCQkJKHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4ID09IDAgfHwKKwkJCQl1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeCA9PSBody0+ZGVjb2RlX3BpY19jb3VudCkgJiYKKwkJCQkodWRlYnVnX3BhdXNlX3ZhbCA9PSAwIHx8CisJCQkJdWRlYnVnX3BhdXNlX3ZhbCA9PSBSRUFEX1ZSRUcoREVCVUdfUkVHMikpKSB7CisJCQkJdWRlYnVnX3BhdXNlX3BvcyAmPSAweGZmZmY7CisJCQkJaHctPnVjb2RlX3BhdXNlX3BvcyA9IHVkZWJ1Z19wYXVzZV9wb3M7CisJCQl9CisJCQllbHNlIGlmIChkZWJ1Z190YWcgJiAweDIwMDAwKQorCQkJCWh3LT51Y29kZV9wYXVzZV9wb3MgPSAweGZmZmZmZmZmOworCQkJaWYgKGh3LT51Y29kZV9wYXVzZV9wb3MpCisJCQkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwkJCWVsc2UKKwkJCQlXUklURV9WUkVHKERFQlVHX1JFRzEsIDApOworCQl9IGVsc2UqLyBpZiAoZGVidWdfdGFnICE9IDApIHsKKwkJCWRlYnVnX3ByaW50KGh3LCAxLAorCQkJCSJkYmcleDogJXggYnVmZmVyX3N0YXR1cyAweCV4IGwvdy9yICV4ICV4ICV4IGJpdGNudCAleCBBVkFJTCAleFxuIiwKKwkJCQlkZWJ1Z190YWcsCisJCQkJUkVBRF9WUkVHKERFQlVHX1JFRzIpLAorCQkJCWJ1ZmZlcl9zdGF0dXNfZGVidWcsCisJCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKSwKKwkJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApLAorCQkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCksCisJCQkJUkVBRF9WUkVHKFZJRkZfQklUX0NOVCksCisJCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0JZVEVTX0FWQUlMKSk7CisKKwkJCWlmICgoKHVkZWJ1Z19wYXVzZV9wb3MgJiAweGZmZmYpCisJCQkJPT0gKGRlYnVnX3RhZyAmIDB4ZmZmZikpICYmCisJCQkJKHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4ID09IDAgfHwKKwkJCQl1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeCA9PSBody0+ZGVjb2RlX3BpY19jb3VudCkgJiYKKwkJCQkodWRlYnVnX3BhdXNlX3ZhbCA9PSAwIHx8CisJCQkJdWRlYnVnX3BhdXNlX3ZhbCA9PSBSRUFEX1ZSRUcoREVCVUdfUkVHMikpICYmCisJCQkJKHVkZWJ1Z19wYXVzZV9pbnNfaWQgPT0gMCB8fAorCQkJCQlERUNPREVfSUQoaHcpID09ICh1ZGVidWdfcGF1c2VfaW5zX2lkIC0xKSkpIHsKKwkJCQl1ZGVidWdfcGF1c2VfcG9zICY9IDB4ZmZmZjsKKwkJCQlody0+dWNvZGVfcGF1c2VfcG9zID0gdWRlYnVnX3BhdXNlX3BvczsKKwkJCQlpZiAoZGVidWcgJiBERUJVR19QSUNfRE9ORV9XSEVOX1VDT0RFX1BBVVNFKSB7CisJCQkJCWh3LT5kZWNvZGVfcGljX2NvdW50Kys7CisJCQkJCWlmICgoaHctPmRlY29kZV9waWNfY291bnQgJiAweGZmZmYpID09IDApIHsKKwkJCQkJCS8qbWFrZSB1Y29kZSBkbyBub3QgaGFuZGxlIGl0IGFzIGZpcnN0IHBpY3R1cmUqLworCQkJCQkJaHctPmRlY29kZV9waWNfY291bnQrKzsKKwkJCQkJfQorCQkJCQlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCQkJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwkJCQkJYW12ZGVjX3N0b3AoKTsKKwkJCQkJdmF2c19zYXZlX3JlZ3MoaHcpOworCQkJCQlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19ERUNPRElORywKKwkJCQkJCSIlcyB1Y29kZSBwYXVzZSwgZm9yY2UgZG9uZSwgZGVjb2RlX3BpY19jb3VudCA9ICVkLCBiaXRfY250PTB4JXhcbiIsCisJCQkJCQlfX2Z1bmNfXywKKwkJCQkJCWh3LT5kZWNvZGVfcGljX2NvdW50LAorCQkJCQkJUkVBRF9WUkVHKFZJRkZfQklUX0NOVCkpOworCQkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJCX0KKwkJCX0KKwkJCWlmIChody0+dWNvZGVfcGF1c2VfcG9zKQorCQkJCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisJCQllbHNlCisJCQkJV1JJVEVfVlJFRyhERUJVR19SRUcxLCAwKTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfSBlbHNlIHsKKwkJCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX0RFQ09ESU5HLAorCQkJCSIlcyBkZWNvZGVfc3RhdHVzIDB4JXgsIGJ1ZmZlcl9zdGF0dXMgMHgleFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlSRUFEX1ZSRUcoREVDT0RFX1NUQVRVUyksCisJCQkJYnVmZmVyX3N0YXR1c19kZWJ1Zyk7CisJCX0KKworI2lmZGVmIEFWU1BfTE9OR19DQUJBQworCQlpZiAoZmlybXdhcmVfc2VsID09IDAgJiYgUkVBRF9WUkVHKExPTkdfQ0FCQUNfUkVRKSkgeworI2lmZGVmIFBFUkZPUk1BTkNFX0RFQlVHCisJCQlwcl9pbmZvKCIlczpzY2hlZHVsZSBsb25nX2NhYmFjX3dkX3dvcmtcclxuIiwgX19mdW5jX18pOworI2VuZGlmCisJCQlwcl9pbmZvKCJzY2hlZHVsZSBsb25nX2NhYmFjX3dkX3dvcmsgYW5kIHJlcXVlc3RlZCBmcm9tICVkXG4iLAorCQkJCShSRUFEX1ZSRUcoTE9OR19DQUJBQ19SRVEpID4+IDgpJjB4RkYpOworCQkJc2NoZWR1bGVfd29yaygmbG9uZ19jYWJhY193ZF93b3JrKTsKKwkJfQorI2VuZGlmCisKKyNpZmRlZiBFTkFCTEVfVVNFUl9EQVRBCisJCWlmIChVc2VyRGF0YUhhbmRsZXIoaHcpKQorCQkJcmV0dXJuIElSUV9IQU5ETEVEOworI2VuZGlmCisJCXJlZyA9IFJFQURfVlJFRyhBVlNfQlVGRkVST1VUKTsKKwkJaWYgKHJlZykgeworCQkJdW5zaWduZWQgc2hvcnQgZGVjb2RlX3BpY19jb3VudAorCQkJCT0gUkVBRF9WUkVHKERFQ09ERV9QSUNfQ09VTlQpOworCQkJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfREVDT0RJTkcsICJBVlNfQlVGRkVST1VUPTB4JXggZGVjb2RlX3BpY19jb3VudCAlZFxuIiwKKwkJCQlyZWcsIGRlY29kZV9waWNfY291bnQpOworCQkJaWYgKHB0c19ieV9vZmZzZXQpIHsKKwkJCQlvZmZzZXQgPSBSRUFEX1ZSRUcoQVZTX09GRlNFVF9SRUcpOworCQkJCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX0RFQ09ESU5HLCAiQVZTIE9GRlNFVD0leFxuIiwgb2Zmc2V0KTsKKwkJCQlpZiAoKHZkZWMtPnZidWYubm9fcGFyc2VyID09IDApIHx8ICh2ZGVjLT52YnVmLnVzZV9wdHNzZXJ2KSkgeworCQkJCQlpZiAocHRzX2xvb2t1cF9vZmZzZXRfdXM2NChQVFNfVFlQRV9WSURFTywgb2Zmc2V0LCAmcHRzLAorCQkJCQkJJmZyYW1lX3NpemUsIDAsICZwdHNfdXM2NCkgPT0gMCkgeworCQkJCQkJcHRzX3ZhbGlkID0gMTsKKyNpZmRlZiBERUJVR19QVFMKKwkJCQkJCWh3LT5wdHNfaGl0Kys7CisjZW5kaWYKKwkJCQkJfSBlbHNlIHsKKyNpZmRlZiBERUJVR19QVFMKKwkJCQkJCWh3LT5wdHNfbWlzc2VkKys7CisjZW5kaWYKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJcmVwZWF0X2NvdW50ID0gUkVBRF9WUkVHKEFWU19SRVBFQVRfQ09VTlQpOworI2lmZGVmIFVTRV9EWU5BTUlDX0JVRl9OVU0KKwkJCWJ1ZmZlcl9pbmRleCA9CisJCQkJKChyZWcgJiAweDcpICsKKwkJCQkoKChyZWcgPj4gOCkgJiAweDMpIDw8IDMpIC0gMSkgJiAweDFmOworI2Vsc2UKKwkJCWlmIChmaXJtd2FyZV9zZWwgPT0gMCkKKwkJCQlidWZmZXJfaW5kZXggPQorCQkJCQkoKHJlZyAmIDB4NykgKworCQkJCQkoKChyZWcgPj4gOCkgJiAweDMpIDw8IDMpIC0gMSkgJiAweDFmOworCQkJZWxzZQorCQkJCWJ1ZmZlcl9pbmRleCA9CisJCQkJCSgocmVnICYgMHg3KSAtIDEpICYgMzsKKyNlbmRpZgorCQkJcGljdHVyZV90eXBlID0gKHJlZyA+PiAzKSAmIDc7CisjaWZkZWYgREVCVUdfUFRTCisJCQlpZiAocGljdHVyZV90eXBlID09IElfUElDVFVSRSkgeworCQkJCS8qIHByX2luZm8oIkkgb2Zmc2V0IDB4JXgsIHB0c192YWxpZCAlZFxuIiwKKwkJCQkgKgkgb2Zmc2V0LCBwdHNfdmFsaWQpOworCQkJCSAqLworCQkJCWlmICghcHRzX3ZhbGlkKQorCQkJCQlody0+cHRzX2lfbWlzc2VkKys7CisJCQkJZWxzZQorCQkJCQlody0+cHRzX2lfaGl0Kys7CisJCQl9CisjZW5kaWYKKworCQkJaWYgKChkZWNfY29udHJvbCAmIERFQ19DT05UUk9MX0ZMQUdfRk9SQ0VfMjUwMF8xMDgwUF9JTlRFUkxBQ0UpCisJCQkJJiYgaHctPmZyYW1lX3dpZHRoID09IDE5MjAgJiYgaHctPmZyYW1lX2hlaWdodCA9PSAxMDgwKSB7CisJCQkJZm9yY2VfaW50ZXJsYWNlZF9mcmFtZSA9IHRydWU7CisJCQl9CisKKwkJCWlmIChody0+dGhyb3dfcGJfZmxhZyAmJiBwaWN0dXJlX3R5cGUgIT0gSV9QSUNUVVJFKSB7CisKKwkJCQlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19ERUNPRElORywKKwkJCQkJIiVzIFdSSVRFX1ZSRUcoQVZTX0JVRkZFUklOLCAweCV4KSBmb3IgdGhyb3dpbmcgcGljdHVyZSB3aXRoIHR5cGUgb2YgJWRcbiIsCisJCQkJCV9fZnVuY19fLAorCQkJCQl+KDEgPDwgYnVmZmVyX2luZGV4KSwgcGljdHVyZV90eXBlKTsKKworCQkJCVdSSVRFX1ZSRUcoQVZTX0JVRkZFUklOLCB+KDEgPDwgYnVmZmVyX2luZGV4KSk7CisJCQl9IGVsc2UgaWYgKHJlZyAmIElOVEVSTEFDRV9GTEFHIHx8IGZvcmNlX2ludGVybGFjZWRfZnJhbWUpIHsJLyogaW50ZXJsYWNlICovCisJCQkJaHctPnRocm93X3BiX2ZsYWcgPSAwOworCisJCQkJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfVkZSQU1FX0RFVEFJTCwKKwkJCQkJImludGVybGFjZSwgcGljdHVyZSB0eXBlICVkXG4iLAorCQkJCQkJICAgcGljdHVyZV90eXBlKTsKKworCQkJCWlmIChrZmlmb19nZXQoJmh3LT5uZXdmcmFtZV9xLCAmdmYpID09IDApIHsKKwkJCQkJcHJfaW5mbworCQkJCQkoImZhdGFsIGVycm9yLCBubyBhdmFpbGFibGUgYnVmZmVyIHNsb3QuIik7CisJCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCQl9CisJCQkJc2V0X2ZyYW1lX2luZm8oaHcsIHZmLCAmZHVyKTsKKwkJCQl2Zi0+YnVmV2lkdGggPSAxOTIwOworCQkJCWh3LT5waWNfdHlwZSA9IDI7CisJCQkJaWYgKChwaWN0dXJlX3R5cGUgPT0gSV9QSUNUVVJFKSAmJiBwdHNfdmFsaWQpIHsKKwkJCQkJdmYtPnB0cyA9IHB0czsKKwkJCQkJdmYtPnB0c191czY0ID0gcHRzX3VzNjQ7CisJCQkJCWlmICgocmVwZWF0X2NvdW50ID4gMSkgJiYgaHctPmF2aV9mbGFnKSB7CisJCQkJCQkvKiBody0+bmV4dF9wdHMgPSBwdHMgKworCQkJCQkJICoJIChody0+dmF2c19hbXN0cmVhbV9kZWNfaW5mby5yYXRlICoKKwkJCQkJCSAqCSByZXBlYXRfY291bnQgPj4gMSkqMTUvMTY7CisJCQkJCQkgKi8KKwkJCQkJCWh3LT5uZXh0X3B0cyA9CisJCQkJCQkJcHRzICsKKwkJCQkJCQkoZHVyICogcmVwZWF0X2NvdW50ID4+IDEpICoKKwkJCQkJCQkxNSAvIDE2OworCQkJCQl9IGVsc2UKKwkJCQkJCWh3LT5uZXh0X3B0cyA9IDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJdmYtPnB0cyA9IGh3LT5uZXh0X3B0czsKKwkJCQkJaWYgKHZmLT5wdHMgPT0gMCkgeworCQkJCQkJdmYtPnB0c191czY0ID0gMDsKKwkJCQkJfQorCQkJCQlpZiAoKHJlcGVhdF9jb3VudCA+IDEpICYmIGh3LT5hdmlfZmxhZykgeworCQkJCQkJLyogdmYtPmR1cmF0aW9uID0KKwkJCQkJCSAqCSBody0+dmF2c19hbXN0cmVhbV9kZWNfaW5mby5yYXRlICoKKwkJCQkJCSAqCSByZXBlYXRfY291bnQgPj4gMTsKKwkJCQkJCSAqLworCQkJCQkJdmYtPmR1cmF0aW9uID0gZHVyICogcmVwZWF0X2NvdW50ID4+IDE7CisJCQkJCQlpZiAoaHctPm5leHRfcHRzICE9IDApIHsKKwkJCQkJCQlody0+bmV4dF9wdHMgKz0KKwkJCQkJCQkJKCh2Zi0+ZHVyYXRpb24pIC0KKwkJCQkJCQkJICgodmYtPmR1cmF0aW9uKSA+PiA0KSk7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvKiB2Zi0+ZHVyYXRpb24gPQorCQkJCQkJICoJIGh3LT52YXZzX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgPj4gMTsKKwkJCQkJCSAqLworCQkJCQkJdmYtPmR1cmF0aW9uID0gZHVyID4+IDE7CisJCQkJCQlody0+bmV4dF9wdHMgPSAwOworCQkJCQl9CisJCQkJfQorCQkJCXZmLT5zaWduYWxfdHlwZSA9IDA7CisJCQkJdmYtPmluZGV4ID0gYnVmZmVyX2luZGV4OworCQkJCXZmLT5kdXJhdGlvbl9wdWxsZG93biA9IDA7CisJCQkJaWYgKGZvcmNlX2ludGVybGFjZWRfZnJhbWUpIHsKKwkJCQkJdmYtPnR5cGUgPSBWSURUWVBFX0lOVEVSTEFDRV9UT1A7CisJCQkJfWVsc2V7CisJCQkJCXZmLT50eXBlID0KKwkJCQkJKHJlZyAmIFRPUF9GSUVMRF9GSVJTVF9GTEFHKQorCQkJCQk/IFZJRFRZUEVfSU5URVJMQUNFX1RPUAorCQkJCQk6IFZJRFRZUEVfSU5URVJMQUNFX0JPVFRPTTsKKwkJCQkJfQorI2lmZGVmIE5WMjEKKwkJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX1ZJVV9OVjIxOworI2VuZGlmCisJCQkJaWYgKGh3LT5tX2luc19mbGFnKSB7CisJCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IC0xOworCQkJCQl2Zi0+cGxhbmVfbnVtID0gMjsKKworCQkJCQl2Zi0+Y2FudmFzMF9jb25maWdbMF0gPSBody0+Y2FudmFzX2NvbmZpZ1tidWZmZXJfaW5kZXhdWzBdOworCQkJCQl2Zi0+Y2FudmFzMF9jb25maWdbMV0gPSBody0+Y2FudmFzX2NvbmZpZ1tidWZmZXJfaW5kZXhdWzFdOworCisJCQkJCXZmLT5jYW52YXMxX2NvbmZpZ1swXSA9IGh3LT5jYW52YXNfY29uZmlnW2J1ZmZlcl9pbmRleF1bMF07CisJCQkJCXZmLT5jYW52YXMxX2NvbmZpZ1sxXSA9IGh3LT5jYW52YXNfY29uZmlnW2J1ZmZlcl9pbmRleF1bMV07CisJCQkJfSBlbHNlCisJCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9CisJCQkJCQlpbmRleDJjYW52YXMoYnVmZmVyX2luZGV4KTsKKwkJCQl2Zi0+dHlwZV9vcmlnaW5hbCA9IHZmLT50eXBlOworCisJCQkJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfVkZSQU1FX0RFVEFJTCwKKwkJCQkJImJ1ZmZlcl9pbmRleCAlZCwgY2FudmFzIGFkZHIgJXhcbiIsCisJCQkJCQkgICBidWZmZXJfaW5kZXgsIHZmLT5jYW52YXMwQWRkcik7CisJCQkJdmYtPnB0cyA9IChwdHNfdmFsaWQpP3B0czowOworCQkJCS8vdmYtPnB0c191czY0ID0gKHB0c192YWxpZCkgPyBwdHNfdXM2NCA6IDA7CisJCQkJaHctPnZmYnVmX3VzZVtidWZmZXJfaW5kZXhdKys7CisJCQkJdmYtPm1lbV9oYW5kbGUgPQorCQkJCQlkZWNvZGVyX2JtbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCQkJaHctPm1tX2Jsa19oYW5kbGUsCisJCQkJCQlidWZmZXJfaW5kZXgpOworCisJCQkJaWYgKGh3LT5tX2luc19mbGFnICYmIHZkZWNfZnJhbWVfYmFzZWQoaHdfdG9fdmRlYyhodykpKQorCQkJCQlzZXRfdmZyYW1lX3B0cyhodywgZGVjb2RlX3BpY19jb3VudCwgdmYpOworCisJCQkJaWYgKHZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpICYmICghdmRlYy0+dmJ1Zi51c2VfcHRzc2VydikpIHsKKwkJCQkJdmYtPnB0c191czY0ID0KKwkJCQkJCSgoKHU2NCl2Zi0+ZHVyYXRpb24gPDwgMzIpICYgMHhmZmZmZmZmZjAwMDAwMDAwKSB8IG9mZnNldDsKKwkJCQkJdmYtPnB0cyA9IDA7CisJCQkJfQorCisJCQkJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfUFRTLAorCQkJCQkiaW50ZXJsYWNlMSB2Zi0+cHRzID0gJWQsIHZmLT5wdHNfdXM2NCA9ICVsbGQsIHB0c192YWxpZCA9ICVkXG4iLCB2Zi0+cHRzLCB2Zi0+cHRzX3VzNjQsIHB0c192YWxpZCk7CisJCQkJdmRlY192ZnJhbWVfcmVhZHkodmRlYywgdmYpOworCQkJCWtmaWZvX3B1dCgmaHctPmRpc3BsYXlfcSwgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwkJCQlBVFJBQ0VfQ09VTlRFUihody0+cHRzX25hbWUsIHZmLT50aW1lc3RhbXApOworCQkJCWF2c192Zl9ub3RpZnlfcmVjZWl2ZXIoaHcsIFBST1ZJREVSX05BTUUsCisJCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfVkZSQU1FX1JFQURZLAorCQkJCQkJTlVMTCk7CisKKwkJCQlpZiAoa2ZpZm9fZ2V0KCZody0+bmV3ZnJhbWVfcSwgJnZmKSA9PSAwKSB7CisJCQkJCXByX2luZm8oImZhdGFsIGVycm9yLCBubyBhdmFpbGFibGUgYnVmZmVyIHNsb3QuIik7CisJCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCQkJCQl9CisJCQkJc2V0X2ZyYW1lX2luZm8oaHcsIHZmLCAmZHVyKTsKKwkJCQl2Zi0+YnVmV2lkdGggPSAxOTIwOworCQkJCWlmIChmb3JjZV9pbnRlcmxhY2VkX2ZyYW1lKQorCQkJCQl2Zi0+cHRzID0gMDsKKwkJCQllbHNlCisJCQkJdmYtPnB0cyA9IGh3LT5uZXh0X3B0czsKKworCQkJCWlmICh2Zi0+cHRzID09IDApIHsKKwkJCQkJdmYtPnB0c191czY0ID0gMDsKKwkJCQl9CisKKwkJCQlpZiAoKHJlcGVhdF9jb3VudCA+IDEpICYmIGh3LT5hdmlfZmxhZykgeworCQkJCQkvKiB2Zi0+ZHVyYXRpb24gPSBody0+dmF2c19hbXN0cmVhbV9kZWNfaW5mby5yYXRlICoKKwkJCQkJICoJIHJlcGVhdF9jb3VudCA+PiAxOworCQkJCQkgKi8KKwkJCQkJdmYtPmR1cmF0aW9uID0gZHVyICogcmVwZWF0X2NvdW50ID4+IDE7CisJCQkJCWlmIChody0+bmV4dF9wdHMgIT0gMCkgeworCQkJCQkJaHctPm5leHRfcHRzICs9CisJCQkJCQkJKCh2Zi0+ZHVyYXRpb24pIC0KKwkJCQkJCQkgKCh2Zi0+ZHVyYXRpb24pID4+IDQpKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCS8qIHZmLT5kdXJhdGlvbiA9IGh3LT52YXZzX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUKKwkJCQkJICoJID4+IDE7CisJCQkJCSAqLworCQkJCQl2Zi0+ZHVyYXRpb24gPSBkdXIgPj4gMTsKKwkJCQkJaHctPm5leHRfcHRzID0gMDsKKwkJCQl9CisJCQkJdmYtPnNpZ25hbF90eXBlID0gMDsKKwkJCQl2Zi0+aW5kZXggPSBidWZmZXJfaW5kZXg7CisJCQkJdmYtPmR1cmF0aW9uX3B1bGxkb3duID0gMDsKKwkJCQlpZiAoZm9yY2VfaW50ZXJsYWNlZF9mcmFtZSkgeworCQkJCQl2Zi0+dHlwZSA9IFZJRFRZUEVfSU5URVJMQUNFX0JPVFRPTTsKKwkJCQl9IGVsc2UgeworCQkJCQkJCXZmLT50eXBlID0KKwkJCQkJCQkocmVnICYgVE9QX0ZJRUxEX0ZJUlNUX0ZMQUcpID8KKwkJCQkJCQlWSURUWVBFX0lOVEVSTEFDRV9CT1RUT00gOgorCQkJCQkJCVZJRFRZUEVfSU5URVJMQUNFX1RPUDsKKwkJCQkJCX0KKyNpZmRlZiBOVjIxCisJCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9WSVVfTlYyMTsKKyNlbmRpZgorCQkJCWlmIChody0+bV9pbnNfZmxhZykgeworCQkJCQl2Zi0+Y2FudmFzMEFkZHIgPSB2Zi0+Y2FudmFzMUFkZHIgPSAtMTsKKwkJCQkJdmYtPnBsYW5lX251bSA9IDI7CisKKwkJCQkJdmYtPmNhbnZhczBfY29uZmlnWzBdID0gaHctPmNhbnZhc19jb25maWdbYnVmZmVyX2luZGV4XVswXTsKKwkJCQkJdmYtPmNhbnZhczBfY29uZmlnWzFdID0gaHctPmNhbnZhc19jb25maWdbYnVmZmVyX2luZGV4XVsxXTsKKworCQkJCQl2Zi0+Y2FudmFzMV9jb25maWdbMF0gPSBody0+Y2FudmFzX2NvbmZpZ1tidWZmZXJfaW5kZXhdWzBdOworCQkJCQl2Zi0+Y2FudmFzMV9jb25maWdbMV0gPSBody0+Y2FudmFzX2NvbmZpZ1tidWZmZXJfaW5kZXhdWzFdOworCQkJCX0gZWxzZQorCQkJCQl2Zi0+Y2FudmFzMEFkZHIgPSB2Zi0+Y2FudmFzMUFkZHIgPQorCQkJCQkJaW5kZXgyY2FudmFzKGJ1ZmZlcl9pbmRleCk7CisJCQkJdmYtPnR5cGVfb3JpZ2luYWwgPSB2Zi0+dHlwZTsKKwkJCQl2Zi0+cHRzX3VzNjQgPSAwOworCQkJCWh3LT52ZmJ1Zl91c2VbYnVmZmVyX2luZGV4XSsrOworCQkJCXZmLT5tZW1faGFuZGxlID0KKwkJCQkJZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCQkJCWh3LT5tbV9ibGtfaGFuZGxlLAorCQkJCQkJYnVmZmVyX2luZGV4KTsKKworCQkJCWlmIChody0+bV9pbnNfZmxhZyAmJiB2ZGVjX2ZyYW1lX2Jhc2VkKGh3X3RvX3ZkZWMoaHcpKSkKKwkJCQkJc2V0X3ZmcmFtZV9wdHMoaHcsIGRlY29kZV9waWNfY291bnQsIHZmKTsKKworCQkJCWlmICh2ZGVjX3N0cmVhbV9iYXNlZCh2ZGVjKSAmJiAoIXZkZWMtPnZidWYudXNlX3B0c3NlcnYpKSB7CisJCQkJCXZmLT5wdHNfdXM2NCA9ICh1NjQpLTE7CisJCQkJCXZmLT5wdHMgPSAwOworCQkJCX0KKwkJCQlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19QVFMsCisJCQkJCSJpbnRlcmxhY2UyIHZmLT5wdHMgPSAlZCwgdmYtPnB0c191czY0ID0gJWxsZCwgcHRzX3ZhbGlkID0gJWRcbiIsIHZmLT5wdHMsIHZmLT5wdHNfdXM2NCwgcHRzX3ZhbGlkKTsKKwkJCQl2ZGVjX3ZmcmFtZV9yZWFkeSh2ZGVjLCB2Zik7CisJCQkJa2ZpZm9fcHV0KCZody0+ZGlzcGxheV9xLCAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQkJCUFUUkFDRV9DT1VOVEVSKGh3LT5wdHNfbmFtZSwgdmYtPnRpbWVzdGFtcCk7CisJCQkJYXZzX3ZmX25vdGlmeV9yZWNlaXZlcihodywgUFJPVklERVJfTkFNRSwKKwkJCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9WRlJBTUVfUkVBRFksCisJCQkJCQlOVUxMKTsKKwkJCQlody0+dG90YWxfZnJhbWUrKzsKKwkJCX0gZWxzZSB7CS8qIHByb2dyZXNzaXZlICovCisJCQkJaHctPnRocm93X3BiX2ZsYWcgPSAwOworCisJCQkJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfVkZSQU1FX0RFVEFJTCwKKwkJCQkJInByb2dyZXNzaXZlIHBpY3R1cmUgdHlwZSAlZFxuIiwKKwkJCQkJCSAgIHBpY3R1cmVfdHlwZSk7CisJCQkJaWYgKGtmaWZvX2dldCgmaHctPm5ld2ZyYW1lX3EsICZ2ZikgPT0gMCkgeworCQkJCQlwcl9pbmZvCisJCQkJCSgiZmF0YWwgZXJyb3IsIG5vIGF2YWlsYWJsZSBidWZmZXIgc2xvdC4iKTsKKwkJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJCX0KKwkJCQlzZXRfZnJhbWVfaW5mbyhodywgdmYsICZkdXIpOworCQkJCXZmLT5idWZXaWR0aCA9IDE5MjA7CisJCQkJaHctPnBpY190eXBlID0gMTsKKworCQkJCWlmICgocGljdHVyZV90eXBlID09IElfUElDVFVSRSkgJiYgcHRzX3ZhbGlkKSB7CisJCQkJCXZmLT5wdHMgPSBwdHM7CisJCQkJCWlmICgocmVwZWF0X2NvdW50ID4gMSkgJiYgaHctPmF2aV9mbGFnKSB7CisJCQkJCQkvKiBody0+bmV4dF9wdHMgPSBwdHMgKworCQkJCQkJICoJIChody0+dmF2c19hbXN0cmVhbV9kZWNfaW5mby5yYXRlICoKKwkJCQkJCSAqCSByZXBlYXRfY291bnQpKjE1LzE2OworCQkJCQkJICovCisJCQkJCQlody0+bmV4dF9wdHMgPQorCQkJCQkJCXB0cyArCisJCQkJCQkJKGR1ciAqIHJlcGVhdF9jb3VudCkgKiAxNSAvIDE2OworCQkJCQl9IGVsc2UKKwkJCQkJCWh3LT5uZXh0X3B0cyA9IDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJdmYtPnB0cyA9IGh3LT5uZXh0X3B0czsKKwkJCQkJaWYgKHZmLT5wdHMgPT0gMCkgeworCQkJCQkJdmYtPnB0c191czY0ID0gMDsKKwkJCQkJfQorCQkJCQlpZiAoKHJlcGVhdF9jb3VudCA+IDEpICYmIGh3LT5hdmlfZmxhZykgeworCQkJCQkJLyogdmYtPmR1cmF0aW9uID0KKwkJCQkJCSAqCSBody0+dmF2c19hbXN0cmVhbV9kZWNfaW5mby5yYXRlICoKKwkJCQkJCSAqCSByZXBlYXRfY291bnQ7CisJCQkJCQkgKi8KKwkJCQkJCXZmLT5kdXJhdGlvbiA9IGR1ciAqIHJlcGVhdF9jb3VudDsKKwkJCQkJCWlmIChody0+bmV4dF9wdHMgIT0gMCkgeworCQkJCQkJCWh3LT5uZXh0X3B0cyArPQorCQkJCQkJCQkoKHZmLT5kdXJhdGlvbikgLQorCQkJCQkJCQkgKCh2Zi0+ZHVyYXRpb24pID4+IDQpKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8qIHZmLT5kdXJhdGlvbiA9CisJCQkJCQkgKgkgaHctPnZhdnNfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZTsKKwkJCQkJCSAqLworCQkJCQkJdmYtPmR1cmF0aW9uID0gZHVyOworCQkJCQkJaHctPm5leHRfcHRzID0gMDsKKwkJCQkJfQorCQkJCX0KKwkJCQl2Zi0+c2lnbmFsX3R5cGUgPSAwOworCQkJCXZmLT5pbmRleCA9IGJ1ZmZlcl9pbmRleDsKKwkJCQl2Zi0+ZHVyYXRpb25fcHVsbGRvd24gPSAwOworCQkJCXZmLT50eXBlID0gVklEVFlQRV9QUk9HUkVTU0lWRSB8IFZJRFRZUEVfVklVX0ZJRUxEOworI2lmZGVmIE5WMjEKKwkJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX1ZJVV9OVjIxOworI2VuZGlmCisJCQkJaWYgKGh3LT5tX2luc19mbGFnKSB7CisJCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IC0xOworCQkJCQl2Zi0+cGxhbmVfbnVtID0gMjsKKworCQkJCQl2Zi0+Y2FudmFzMF9jb25maWdbMF0gPSBody0+Y2FudmFzX2NvbmZpZ1tidWZmZXJfaW5kZXhdWzBdOworCQkJCQl2Zi0+Y2FudmFzMF9jb25maWdbMV0gPSBody0+Y2FudmFzX2NvbmZpZ1tidWZmZXJfaW5kZXhdWzFdOworCisJCQkJCXZmLT5jYW52YXMxX2NvbmZpZ1swXSA9IGh3LT5jYW52YXNfY29uZmlnW2J1ZmZlcl9pbmRleF1bMF07CisJCQkJCXZmLT5jYW52YXMxX2NvbmZpZ1sxXSA9IGh3LT5jYW52YXNfY29uZmlnW2J1ZmZlcl9pbmRleF1bMV07CisJCQkJfSBlbHNlCisJCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9CisJCQkJCQlpbmRleDJjYW52YXMoYnVmZmVyX2luZGV4KTsKKwkJCQl2Zi0+dHlwZV9vcmlnaW5hbCA9IHZmLT50eXBlOworCisJCQkJdmYtPnB0cyA9IChwdHNfdmFsaWQpP3B0czowOworCQkJCS8vdmYtPnB0c191czY0ID0gKHB0c192YWxpZCkgPyBwdHNfdXM2NCA6IDA7CisJCQkJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfVkZSQU1FX0RFVEFJTCwKKwkJCQkJImJ1ZmZlcl9pbmRleCAlZCwgY2FudmFzIGFkZHIgJXhcbiIsCisJCQkJCQkgICBidWZmZXJfaW5kZXgsIHZmLT5jYW52YXMwQWRkcik7CisJCQkJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfUFRTLAorCQkJCQkicHJvZ3Jlc3NpdmUgdmYtPnB0cyA9ICVkLCB2Zi0+cHRzX3VzNjQgPSAlbGxkLCBwdHNfdmFsaWQgPSAlZFxuIiwgdmYtPnB0cywgdmYtPnB0c191czY0LCBwdHNfdmFsaWQpOworCQkJCWh3LT52ZmJ1Zl91c2VbYnVmZmVyX2luZGV4XSsrOworCQkJCXZmLT5tZW1faGFuZGxlID0KKwkJCQkJZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCQkJCWh3LT5tbV9ibGtfaGFuZGxlLAorCQkJCQkJYnVmZmVyX2luZGV4KTsKKworCQkJCWlmIChody0+bV9pbnNfZmxhZyAmJiB2ZGVjX2ZyYW1lX2Jhc2VkKGh3X3RvX3ZkZWMoaHcpKSkKKwkJCQkJc2V0X3ZmcmFtZV9wdHMoaHcsIGRlY29kZV9waWNfY291bnQsIHZmKTsKKworCQkJCWlmICh2ZGVjX3N0cmVhbV9iYXNlZCh2ZGVjKSAmJiAoIXZkZWMtPnZidWYudXNlX3B0c3NlcnYpKSB7CisJCQkJCXZmLT5wdHNfdXM2NCA9CisJCQkJCQkoKCh1NjQpdmYtPmR1cmF0aW9uIDw8IDMyKSAmIDB4ZmZmZmZmZmYwMDAwMDAwMCkgfCBvZmZzZXQ7CisJCQkJCXZmLT5wdHMgPSAwOworCQkJCX0KKwkJCQlkZWNvZGVyX2RvX2ZyYW1lX2NoZWNrKGh3X3RvX3ZkZWMoaHcpLCB2Zik7CisJCQkJdmRlY192ZnJhbWVfcmVhZHkodmRlYywgdmYpOworCQkJCWtmaWZvX3B1dCgmaHctPmRpc3BsYXlfcSwgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwkJCQlBVFJBQ0VfQ09VTlRFUihody0+cHRzX25hbWUsIHZmLT50aW1lc3RhbXApOworCQkJCUFUUkFDRV9DT1VOVEVSKGh3LT5uZXdfcV9uYW1lLCBrZmlmb19sZW4oJmh3LT5uZXdmcmFtZV9xKSk7CisJCQkJQVRSQUNFX0NPVU5URVIoaHctPmRpc3BfcV9uYW1lLCBrZmlmb19sZW4oJmh3LT5kaXNwbGF5X3EpKTsKKwkJCQlhdnNfdmZfbm90aWZ5X3JlY2VpdmVyKGh3LCBQUk9WSURFUl9OQU1FLAorCQkJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1ZGUkFNRV9SRUFEWSwKKwkJCQkJCU5VTEwpOworCQkJCWh3LT50b3RhbF9mcmFtZSsrOworCQkJfQorCisJCQkvKmNvdW50IGluZm8qLworCQkJdmRlY19jb3VudF9pbmZvKGh3LT5ndnMsIDAsIG9mZnNldCk7CisJCQlpZiAob2Zmc2V0KSB7CisJCQkJaWYgKHBpY3R1cmVfdHlwZSA9PSBJX1BJQ1RVUkUpIHsKKwkJCQkJaHctPmd2cy0+aV9kZWNvZGVkX2ZyYW1lcysrOworCQkJCX0gZWxzZSBpZiAocGljdHVyZV90eXBlID09IFBfUElDVFVSRSkgeworCQkJCQlody0+Z3ZzLT5wX2RlY29kZWRfZnJhbWVzKys7CisJCQkJfSBlbHNlIGlmIChwaWN0dXJlX3R5cGUgPT0gQl9QSUNUVVJFKSB7CisJCQkJCWh3LT5ndnMtPmJfZGVjb2RlZF9mcmFtZXMrKzsKKwkJCQl9CisJCQl9CisJCQlhdnNfdXBkYXRlX2d2cyhodyk7CisJCQl2ZGVjX2ZpbGxfdmRlY19mcmFtZShod190b192ZGVjKGh3KSwgTlVMTCwgaHctPmd2cywgdmYsIDApOworCisJCQkvKiBwcl9pbmZvKCJQaWNUeXBlID0gJWQsIFBUUyA9IDB4JXhcbiIsCisJCQkgKgkgcGljdHVyZV90eXBlLCB2Zi0+cHRzKTsKKwkJCSAqLworCQkJV1JJVEVfVlJFRyhBVlNfQlVGRkVST1VULCAwKTsKKwkJfQorCQkvL1dSSVRFX1ZSRUcoQVNTSVNUX01CT1gxX0NMUl9SRUcsIDEpOworCisKKwkJaWYgKGh3LT5tX2luc19mbGFnKSB7CisJCQl1MzIgc3RhdHVzX3JlZyA9IFJFQURfVlJFRyhERUNPREVfU1RBVFVTKTsKKwkJCXUzMiBkZWNvZGVfc3RhdHVzID0gc3RhdHVzX3JlZyAmIDB4ZmY7CisJCQlpZiAoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9ET05FIHx8CisJCQkJaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9BR0FJTikgeworCQkJCWRlYnVnX3ByaW50KGh3LCBQUklOVF9GTEFHX0RFQ09ESU5HLAorCQkJCQkiJXMgISEhIFJFQURfVlJFRyhERUNPREVfU1RBVFVTKSA9IDB4JXgsIGRlY29kZV9zdGF0dXMgMHgleCwgYnVmX3N0YXR1cyAweCV4LCBkZWNfcmVzdWx0ID0gMHgleCwgZGVjb2RlX3BpY19jb3VudCA9ICVkIGJpdF9jbnQ9MHgleFxuIiwKKwkJCQkJX19mdW5jX18sIHN0YXR1c19yZWcsIGRlY29kZV9zdGF0dXMsCisJCQkJCWh3LT5idWZfc3RhdHVzLAorCQkJCQlody0+ZGVjX3Jlc3VsdCwgaHctPmRlY29kZV9waWNfY291bnQsCisJCQkJCVJFQURfVlJFRyhWSUZGX0JJVF9DTlQpKTsKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQl9IGVsc2UgaWYgKGRlY29kZV9zdGF0dXMgPT0gREVDT0RFX1NUQVRVU19QSUNfRE9ORSB8fAorCQkJCWRlY29kZV9zdGF0dXMgPT0gREVDT0RFX1NUQVRVU19TS0lQX1BJQ19ET05FKSB7CisJCQkJaHctPmJ1Zl9zdGF0dXMgPSAoc3RhdHVzX3JlZyA+PiAxNikgJiAweGZmZmY7CisJCQkJaWYgKGRlY29kZV9zdGF0dXMgPT0gREVDT0RFX1NUQVRVU19TS0lQX1BJQ19ET05FKSB7CisJCQkJCWh3LT5kZWNvZGVfc3RhdHVzX3NraXBfcGljX2RvbmVfZmxhZyA9IDE7CisJCQkJCWh3LT5kZWNvZGVfZGVjb2RlX2NvbnRfc3RhcnRfY29kZSA9IChzdGF0dXNfcmVnID4+IDgpICYgMHhmZjsKKwkJCQl9IGVsc2UKKwkJCQkJaHctPmRlY29kZV9zdGF0dXNfc2tpcF9waWNfZG9uZV9mbGFnID0gMDsKKwkJCQlody0+ZGVjb2RlX3BpY19jb3VudCsrOworCQkJCWlmICgoaHctPmRlY29kZV9waWNfY291bnQgJiAweGZmZmYpID09IDApIHsKKwkJCQkJLyptYWtlIHVjb2RlIGRvIG5vdCBoYW5kbGUgaXQgYXMgZmlyc3QgcGljdHVyZSovCisJCQkJCWh3LT5kZWNvZGVfcGljX2NvdW50Kys7CisJCQkJfQorCQkJCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisJCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisjaWYgREVCVUdfTVVMVElfRkxBRyA9PSAxCisJCQkJV1JJVEVfVlJFRyhERUNPREVfU1RBVFVTLCAwKTsKKyNlbHNlCisJCQkJYW12ZGVjX3N0b3AoKTsKKyNlbmRpZgorCQkJCXZhdnNfc2F2ZV9yZWdzKGh3KTsKKwkJCQlkZWJ1Z19wcmludChodywgUFJJTlRfRkxBR19ERUNPRElORywKKwkJCQkJIiVzICVzLCBSRUFEX1ZSRUcoREVDT0RFX1NUQVRVUykgPSAweCV4LCBkZWNvZGVfc3RhdHVzIDB4JXgsIGJ1Zl9zdGF0dXMgMHgleCwgZGVjX3Jlc3VsdCA9IDB4JXgsIGRlY29kZV9waWNfY291bnQgPSAlZCwgYml0X2NudD0weCV4XG4iLAorCQkJCQlfX2Z1bmNfXywKKwkJCQkJKGRlY29kZV9zdGF0dXMgPT0gREVDT0RFX1NUQVRVU19QSUNfRE9ORSkgPworCQkJCQkiREVDT0RFX1NUQVRVU19QSUNfRE9ORSIgOiAiREVDT0RFX1NUQVRVU19TS0lQX1BJQ19ET05FIiwKKwkJCQkJc3RhdHVzX3JlZywgZGVjb2RlX3N0YXR1cywKKwkJCQkJaHctPmJ1Zl9zdGF0dXMsCisJCQkJCWh3LT5kZWNfcmVzdWx0LCBody0+ZGVjb2RlX3BpY19jb3VudCwKKwkJCQkJUkVBRF9WUkVHKFZJRkZfQklUX0NOVCkpOworCQkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCX0gZWxzZSBpZiAoZGVjb2RlX3N0YXR1cyA9PSBERUNPREVfU1RBVFVTX0RFQ09ERV9CVUZfRU1QVFkgfHwKKwkJCQlkZWNvZGVfc3RhdHVzID09IERFQ09ERV9TVEFUVVNfU0VBUkNIX0JVRl9FTVBUWSkgeworCQkJCWh3LT5idWZfc3RhdHVzID0gKHN0YXR1c19yZWcgPj4gMTYpICYgMHhmZmZmOworCQkJCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisjaWYgREVCVUdfTVVMVElfRkxBRyA9PSAxCisJCQkJV1JJVEVfVlJFRyhERUNPREVfU1RBVFVTLCAwKTsKKyNlbHNlCisJCQkJYW12ZGVjX3N0b3AoKTsKKyNlbmRpZgorCQkJCWlmICh2ZGVjX2ZyYW1lX2Jhc2VkKGh3X3RvX3ZkZWMoaHcpKSkgeworCQkJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwkJCQkJLy9pZiAoaHctPmRlY29kZV9waWNfY291bnQgPT0gMCkgeworCQkJCQkJaHctPmRlY29kZV9waWNfY291bnQrKzsKKwkJCQkJLy99CisJCQkJCWlmICgoaHctPmRlY29kZV9waWNfY291bnQgJiAweGZmZmYpID09IDApIHsKKwkJCQkJLyptYWtlIHVjb2RlIGRvIG5vdCBoYW5kbGUgaXQgYXMgZmlyc3QgcGljdHVyZSovCisJCQkJCQlody0+ZGVjb2RlX3BpY19jb3VudCsrOworCQkJCQl9CisJCQkJCXZhdnNfc2F2ZV9yZWdzKGh3KTsKKwkJCQl9IGVsc2UKKwkJCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0FHQUlOOworCisJCQkJZGVidWdfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfREVDT0RJTkcsCisJCQkJCSIlcyBCVUZfRU1QVFksIFJFQURfVlJFRyhERUNPREVfU1RBVFVTKSA9IDB4JXgsIGRlY29kZV9zdGF0dXMgMHgleCwgYnVmX3N0YXR1cyAweCV4LCBzY3JhdGNoXzggKEFWU19CVUZGRVJJTikgMHgleCwgZGVjX3Jlc3VsdCA9IDB4JXgsIGRlY29kZV9waWNfY291bnQgPSAlZCwgYml0X2NudD0weCV4LCBody0+ZGVjb2RlX3N0YXR1c19za2lwX3BpY19kb25lX2ZsYWcgPSAlZCwgaHctPmRlY29kZV9kZWNvZGVfY29udF9zdGFydF9jb2RlID0gMHgleFxuIiwKKwkJCQkJX19mdW5jX18sIHN0YXR1c19yZWcsIGRlY29kZV9zdGF0dXMsCisJCQkJCWh3LT5idWZfc3RhdHVzLAorCQkJCQlody0+cmVnX3NjcmF0Y2hfOCwKKwkJCQkJaHctPmRlY19yZXN1bHQsIGh3LT5kZWNvZGVfcGljX2NvdW50LAorCQkJCQlSRUFEX1ZSRUcoVklGRl9CSVRfQ05UKSwgaHctPmRlY29kZV9zdGF0dXNfc2tpcF9waWNfZG9uZV9mbGFnLCBody0+ZGVjb2RlX2RlY29kZV9jb250X3N0YXJ0X2NvZGUpOworCQkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCX0KKwkJfQorCisKKyNpZmRlZiBIQU5ETEVfQVZTX0lSUQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisjZWxzZQorCQlyZXR1cm47CisjZW5kaWYKK30KKworc3RhdGljIGlycXJldHVybl90IHZtYXZzX2lzcihzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgaXJxKQoreworCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfQ0xSX1JFRywgMSk7CisKKwlyZXR1cm4gSVJRX1dBS0VfVEhSRUFEOworCS8vcmV0dXJuIHZhdnNfaXNyKDAsIGh3KTsKKworfQorCitzdGF0aWMgdm9pZCB2bWF2c19kdW1wX3N0YXRlKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3ID0KKwkoc3RydWN0IHZkZWNfYXZzX2h3X3MgKil2ZGVjLT5wcml2YXRlOworCWludCBpOworCWRlYnVnX3ByaW50KGh3LCAwLAorCQkiPT09PT09ICVzXG4iLCBfX2Z1bmNfXyk7CisKKwlkZWJ1Z19wcmludChodywgMCwKKwkJIndpZHRoL2hlaWdodCAoJWQvJWQpLCBkdXIgJWRcbiIsCisJCWh3LT5mcmFtZV93aWR0aCwKKwkJaHctPmZyYW1lX2hlaWdodCwKKwkJaHctPmZyYW1lX2R1cgorCQkpOworCisJZGVidWdfcHJpbnQoaHcsIDAsCisJCSJpc19mcmFtZWJhc2UoJWQpLCBkZWNvZGVfc3RhdHVzIDB4JXgsIGJ1Zl9zdGF0dXMgMHgleCwgYnVmX3JlY3ljbGVfc3RhdHVzIDB4JXgsIHRocm93ICVkLCBlb3MgJWQsIHN0YXRlIDB4JXgsIGRlY19yZXN1bHQgMHgleCBkZWNfZnJtICVkIGRpc3BfZnJtICVkIHJ1biAlZCBub3RfcnVuX3JlYWR5ICVkIGlucHV0X2VtcHR5ICVkXG4iLAorCQl2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpLAorCQlSRUFEX1ZSRUcoREVDT0RFX1NUQVRVUykgJiAweGZmLAorCQlody0+YnVmX3N0YXR1cywKKwkJaHctPmJ1Zl9yZWN5Y2xlX3N0YXR1cywKKwkJaHctPnRocm93X3BiX2ZsYWcsCisJCWh3LT5lb3MsCisJCWh3LT5zdGF0LAorCQlody0+ZGVjX3Jlc3VsdCwKKwkJaHctPmRlY29kZV9waWNfY291bnQsCisJCWh3LT5kaXNwbGF5X2ZyYW1lX2NvdW50LAorCQlody0+cnVuX2NvdW50LAorCQlody0+bm90X3J1bl9yZWFkeSwKKwkJaHctPmlucHV0X2VtcHR5CisJCSk7CisKKwlpZiAodmZfZ2V0X3JlY2VpdmVyKHZkZWMtPnZmX3Byb3ZpZGVyX25hbWUpKSB7CisJCWVudW0gcmVjZXZpdmVyX3N0YXJ0X2Ugc3RhdGUgPQorCQl2Zl9ub3RpZnlfcmVjZWl2ZXIodmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9RVVJFWV9TVEFURSwKKwkJCU5VTEwpOworCQlkZWJ1Z19wcmludChodywgMCwKKwkJCSJcbnJlY2VpdmVyKCVzKSBzdGF0ZSAlZFxuIiwKKwkJCXZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQlzdGF0ZSk7CisJfQorCisJZGVidWdfcHJpbnQoaHcsIDAsCisJIiVzLCBuZXdxKCVkLyVkKSwgZGlzcHEoJWQvJWQpcmVjeWNsZXEoJWQvJWQpIGRyb3AgJWQgdmYgcGVlayAlZCwgcHJlcGFyZS9nZXQvcHV0ICglZC8lZC8lZClcbiIsCisJX19mdW5jX18sCisJa2ZpZm9fbGVuKCZody0+bmV3ZnJhbWVfcSksCisJVkZfUE9PTF9TSVpFLAorCWtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSksCisJVkZfUE9PTF9TSVpFLAorCWtmaWZvX2xlbigmaHctPnJlY3ljbGVfcSksCisJVkZfUE9PTF9TSVpFLAorCWh3LT5kcm9wX2ZyYW1lX2NvdW50LAorCWh3LT5wZWVrX251bSwKKwlody0+cHJlcGFyZV9udW0sCisJaHctPmdldF9udW0sCisJaHctPnB1dF9udW0KKwkpOworCisJZGVidWdfcHJpbnQoaHcsIDAsICJ2ZmJ1Zl91c2U6XG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgaHctPnZmX2J1Zl9udW1fdXNlZDsgaSsrKQorCQlkZWJ1Z19wcmludChodywgMCwgIiVkOiB2Zl9idWZfdXNlICVkXG4iLAorCQkJaSwgaHctPnZmYnVmX3VzZVtpXSk7CisKKwlkZWJ1Z19wcmludChodywgMCwKKwkJIkRFQ09ERV9TVEFUVVM9MHgleFxuIiwKKwkJUkVBRF9WUkVHKERFQ09ERV9TVEFUVVMpKTsKKwlkZWJ1Z19wcmludChodywgMCwKKwkJIk1QQ19FPTB4JXhcbiIsCisJCVJFQURfVlJFRyhNUENfRSkpOworCWRlYnVnX3ByaW50KGh3LCAwLAorCQkiREVDT0RFX01PREU9MHgleFxuIiwKKwkJUkVBRF9WUkVHKERFQ09ERV9NT0RFKSk7CisJZGVidWdfcHJpbnQoaHcsIDAsCisJCSJ3YWl0X2J1Zl9zdGF0dXMsIEFWX1NDUkFUQ0hfNT0weCV4XG4iLAorCQlSRUFEX1ZSRUcoQVZfU0NSQVRDSF81KSk7CisJZGVidWdfcHJpbnQoaHcsIDAsCisJCSJNQllfTUJYPTB4JXhcbiIsCisJCVJFQURfVlJFRyhNQllfTUJYKSk7CisJZGVidWdfcHJpbnQoaHcsIDAsCisJCSJWSUZGX0JJVF9DTlQ9MHgleFxuIiwKKwkJUkVBRF9WUkVHKFZJRkZfQklUX0NOVCkpOworCWRlYnVnX3ByaW50KGh3LCAwLAorCQkiVkxEX01FTV9WSUZJRk9fTEVWRUw9MHgleFxuIiwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKSk7CisJZGVidWdfcHJpbnQoaHcsIDAsCisJCSJWTERfTUVNX1ZJRklGT19XUD0weCV4XG4iLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApKTsKKwlkZWJ1Z19wcmludChodywgMCwKKwkJIlZMRF9NRU1fVklGSUZPX1JQPTB4JXhcbiIsCisJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCkpOworCWRlYnVnX3ByaW50KGh3LCAwLAorCQkiUEFSU0VSX1ZJREVPX1JQPTB4JXhcbiIsCisJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF9ycCkpOworCWRlYnVnX3ByaW50KGh3LCAwLAorCQkiUEFSU0VSX1ZJREVPX1dQPTB4JXhcbiIsCisJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCkpOworCisJaWYgKHZkZWNfZnJhbWVfYmFzZWQodmRlYykgJiYKKwkJKGRlYnVnICYJUFJJTlRfRlJBTUVCQVNFX0RBVEEpCisJCSkgeworCQlpbnQgamo7CisJCWlmIChody0+Y2h1bmsgJiYgaHctPmNodW5rLT5ibG9jayAmJgorCQkJaHctPmNodW5rLT5zaXplID4gMCkgeworCQkJdTggKmRhdGEgPSBOVUxMOworCisJCQlpZiAoIWh3LT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJCQlkYXRhID0gY29kZWNfbW1fdm1hcChody0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQkJCWh3LT5jaHVuay0+b2Zmc2V0LCBody0+Y2h1bmstPnNpemUpOworCQkJZWxzZQorCQkJCWRhdGEgPSAoKHU4ICopaHctPmNodW5rLT5ibG9jay0+c3RhcnRfdmlydCkKKwkJCQkJKyBody0+Y2h1bmstPm9mZnNldDsKKworCQkJZGVidWdfcHJpbnQoaHcsIDAsCisJCQkJImZyYW1lIGRhdGEgc2l6ZSAweCV4XG4iLAorCQkJCWh3LT5jaHVuay0+c2l6ZSk7CisJCQlmb3IgKGpqID0gMDsgamogPCBody0+Y2h1bmstPnNpemU7IGpqKyspIHsKKwkJCQlpZiAoKGpqICYgMHhmKSA9PSAwKQorCQkJCQlkZWJ1Z19wcmludChodywKKwkJCQkJUFJJTlRfRlJBTUVCQVNFX0RBVEEsCisJCQkJCQkiJTA2eDoiLCBqaik7CisJCQkJZGVidWdfcHJpbnRfY29udChodywKKwkJCQlQUklOVF9GUkFNRUJBU0VfREFUQSwKKwkJCQkJIiUwMnggIiwgZGF0YVtqal0pOworCQkJCWlmICgoKGpqICsgMSkgJiAweGYpID09IDApCisJCQkJCWRlYnVnX3ByaW50X2NvbnQoaHcsCisJCQkJCVBSSU5UX0ZSQU1FQkFTRV9EQVRBLAorCQkJCQkJIlxuIik7CisJCQl9CisKKwkJCWlmICghaHctPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQkJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIoZGF0YSk7CisJCX0KKwl9CisKK30KKworIGludCBhbW12ZGVjX2F2c19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB2ZGVjX3MgKnBkYXRhID0gKihzdHJ1Y3QgdmRlY19zICoqKXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCB2ZGVjX2F2c19od19zICpodyA9IE5VTEw7CisJaW50IHIgPSAwOworCisJaWYgKHZkZWNfZ2V0X2RlYnVnX2ZsYWdzKCkgJiAweDgpCisJCXJldHVybiBhbXZkZWNfYXZzX3Byb2JlKHBkZXYpOworCisJcHJfaW5mbygiYW1tdmRlY19hdnMgcHJvYmUgc3RhcnQuXG4iKTsKKworCWlmIChwZGF0YSA9PSBOVUxMKSB7CisJCXByX2luZm8oImFtbXZkZWNfYXZzIHBsYXRmb3JtIGRhdGEgdW5kZWZpbmVkLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWh3ID0gKHN0cnVjdCB2ZGVjX2F2c19od19zICopdnphbGxvYyhzaXplb2Yoc3RydWN0IHZkZWNfYXZzX2h3X3MpKTsKKwlpZiAoaHcgPT0gTlVMTCkgeworCQlwcl9pbmZvKCJcbmFtbXZkZWNfYXZzIGRlY29kZXIgZHJpdmVyIGFsbG9jIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvKmF0b21pY19zZXQoJmh3LT5lcnJvcl9oYW5kbGVyX3J1biwgMCk7Ki8KKwlody0+bV9pbnNfZmxhZyA9IDE7CisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWE0gfHwgZGlzYWJsZV9sb25nY2FiYWNfdHJhbnMpCisJCWZpcm13YXJlX3NlbCA9IDE7CisKKwlpZiAoZmlybXdhcmVfc2VsID09IDEpIHsKKyNpZm5kZWYgVVNFX0RZTkFNSUNfQlVGX05VTQorCQl2Zl9idWZfbnVtID0gNDsKKyNlbmRpZgorCQljYW52YXNfYmFzZSA9IDA7CisJCWNhbnZhc19udW0gPSAzOworCX0gZWxzZSB7CisJCXByX2luZm8oIkVycm9yLCBkbyBub3Qgc3VwcG9ydCBsb25nY2FiYWMgd29yayBhcm91bmQhISEiKTsKKwkJciA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3IxOworCX0KKworCWlmIChwZGF0YS0+c3lzX2luZm8pCisJCWh3LT52YXZzX2Ftc3RyZWFtX2RlY19pbmZvID0gKnBkYXRhLT5zeXNfaW5mbzsKKworCWh3LT5pc19yZXNldCA9IDA7CisJcGRhdGEtPnVzZXJfZGF0YV9yZWFkID0gTlVMTDsKKwlwZGF0YS0+cmVzZXRfdXNlcmRhdGFfZmlmbyA9IE5VTEw7CisKKwlwZGF0YS0+cHJpdmF0ZSA9IGh3OworCXBkYXRhLT5kZWNfc3RhdHVzID0gdmF2c19kZWNfc3RhdHVzOworCXBkYXRhLT5zZXRfaXNyZXNldCA9IHZhdnNfc2V0X2lzcmVzZXQ7CisJcGRhdGEtPnJ1bl9yZWFkeSA9IHJ1bl9yZWFkeTsKKwlwZGF0YS0+cnVuID0gcnVuOworCXBkYXRhLT5yZXNldCA9IHJlc2V0OworCXBkYXRhLT5pcnFfaGFuZGxlciA9IHZtYXZzX2lzcjsKKwlwZGF0YS0+dGhyZWFkZWRfaXJxX2hhbmRsZXIgPSB2bWF2c19pc3JfdGhyZWFkX2ZuOworCXBkYXRhLT5kdW1wX3N0YXRlID0gdm1hdnNfZHVtcF9zdGF0ZTsKKworCXNucHJpbnRmKGh3LT52ZGVjX25hbWUsIHNpemVvZihody0+dmRlY19uYW1lKSwKKwkJImF2cy0lZCIsIHBkZXYtPmlkKTsKKwlzbnByaW50Zihody0+cHRzX25hbWUsIHNpemVvZihody0+cHRzX25hbWUpLAorCQkiJXMtdGltZXN0YW1wIiwgaHctPnZkZWNfbmFtZSk7CisJc25wcmludGYoaHctPm5ld19xX25hbWUsIHNpemVvZihody0+bmV3X3FfbmFtZSksCisJCSIlcy1uZXdmcmFtZV9xIiwgaHctPnZkZWNfbmFtZSk7CisJc25wcmludGYoaHctPmRpc3BfcV9uYW1lLCBzaXplb2YoaHctPmRpc3BfcV9uYW1lKSwKKwkJIiVzLWRpc3BmcmFtZV9xIiwgaHctPnZkZWNfbmFtZSk7CisKKwl2YXZzX3ZkZWNfaW5mb19pbml0KGh3KTsKKworI2lmZGVmIEVOQUJMRV9VU0VSX0RBVEEKKwlpZiAoTlVMTCA9PSBody0+dXNlcl9kYXRhX2J1ZmZlcikgeworCQlody0+dXNlcl9kYXRhX2J1ZmZlciA9CisJCQlkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCVVTRVJfREFUQV9TSVpFLAorCQkJCSZody0+dXNlcl9kYXRhX2J1ZmZlcl9waHlzLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFody0+dXNlcl9kYXRhX2J1ZmZlcikgeworCQkJcHJfaW5mbygiJXM6IENhbiBub3QgYWxsb2NhdGUgaHctPnVzZXJfZGF0YV9idWZmZXJcbiIsCisJCQkJICAgX19mdW5jX18pOworCQkJciA9IC1FTk9NRU07CisJCQlnb3RvIGVycm9yMjsKKwkJfQorCQlwcl9kZWJ1ZygiaHctPnVzZXJfZGF0YV9idWZmZXIgPSAweCVwLCBody0+dXNlcl9kYXRhX2J1ZmZlcl9waHlzID0gMHgleFxuIiwKKwkJCWh3LT51c2VyX2RhdGFfYnVmZmVyLCAodTMyKWh3LT51c2VyX2RhdGFfYnVmZmVyX3BoeXMpOworCX0KKyNlbmRpZgorCS8qaHctPmxtZW1fYWRkciA9IGttYWxsb2MoTE1FTV9CVUZfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKGh3LT5sbWVtX2FkZHIgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgbG1lbSBidWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKwlody0+bG1lbV9waHlfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJaHctPmxtZW1fYWRkciwgTE1FTV9CVUZfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQlody0+bG1lbV9waHlfYWRkcikpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIG1hcCBsbWVtIGJ1ZmZlclxuIiwgX19mdW5jX18pOworCQlrZnJlZShody0+bG1lbV9hZGRyKTsKKwkJaHctPmxtZW1fYWRkciA9IE5VTEw7CisJCXJldHVybiAtMTsKKwl9Ki8KKwkvKklOSVRfV09SSygmaHctPnNldF9jbGtfd29yaywgYXZzX3NldF9jbGspOyovCisJaHctPmxtZW1fYWRkciA9IChkbWFfYWRkcl90KWRtYV9hbGxvY19jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJICAgICAgICAgICAgICAgTE1FTV9CVUZfU0laRSwgKGRtYV9hZGRyX3QgKikmaHctPmxtZW1fcGh5X2FkZHIsIEdGUF9LRVJORUwpOworCWlmIChody0+bG1lbV9hZGRyID09IDApIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFsbG9jIGxtZW0gYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJCXIgPSAtMTsKKwkJZ290byBlcnJvcjM7CisJfQorCisJaWYgKHZhdnNfaW5pdChodykgPCAwKSB7CisJCXByX2luZm8oImFtdmRlY19hdnMgaW5pdCBmYWlsZWQuXG4iKTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3I0OworCX0KKworCS8qSU5JVF9XT1JLKCZody0+ZmF0YWxfZXJyb3Jfd2Rfd29yaywgdmF2c19mYXRhbF9lcnJvcl9oYW5kbGVyKTsKKwlhdG9taWNfc2V0KCZody0+ZXJyb3JfaGFuZGxlcl9ydW4sIDApOyovCisjaWYgMAorI2lmZGVmIEVOQUJMRV9VU0VSX0RBVEEKKwlJTklUX1dPUksoJmh3LT51c2VyZGF0YV9wdXNoX3dvcmssIHVzZXJkYXRhX3B1c2hfZG9fd29yayk7CisjZW5kaWYKKyNlbmRpZgorCUlOSVRfV09SSygmaHctPm5vdGlmeV93b3JrLCB2YXZzX25vdGlmeV93b3JrKTsKKworCWlmIChwZGF0YS0+dXNlX3ZmbV9wYXRoKSB7CisJCXNucHJpbnRmKHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lLCBWREVDX1BST1ZJREVSX05BTUVfU0laRSwKKwkJCSAgICBWRk1fREVDX1BST1ZJREVSX05BTUUpOworCQlody0+ZnJhbWVpbmZvX2VuYWJsZSA9IDE7CisJfQorCWVsc2UKKwkJc25wcmludGYocGRhdGEtPnZmX3Byb3ZpZGVyX25hbWUsIFZERUNfUFJPVklERVJfTkFNRV9TSVpFLAorCQkJTVVMVElfSU5TVEFOQ0VfUFJPVklERVJfTkFNRSAiLiUwMngiLCBwZGV2LT5pZCAmIDB4ZmYpOworCWlmIChwZGF0YS0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBERUNPREVfQlVGRkVSX05VTV9NQVg7IGkrKykKKwkJCWh3LT5jYW52YXNfc3BlY1tpXSA9IDB4ZmZmZmZmOworCX0KKwl2Zl9wcm92aWRlcl9pbml0KCZwZGF0YS0+dmZyYW1lX3Byb3ZpZGVyLCBwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJJnZhdnNfdmZfcHJvdmlkZXIsIGh3KTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBkYXRhKTsKKworCWh3LT5wbGF0Zm9ybV9kZXYgPSBwZGV2OworCisJdmRlY19zZXRfcHJlcGFyZV9sZXZlbChwZGF0YSwgc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCk7CisKKwl2ZGVjX3NldF92ZnJhbWVfY29tbShwZGF0YSwgRFJJVkVSX05BTUUpOworCisJaWYgKHBkYXRhLT5wYXJhbGxlbF9kZWMgPT0gMSkKKwkJdmRlY19jb3JlX3JlcXVlc3QocGRhdGEsIENPUkVfTUFTS19WREVDXzEpOworCWVsc2UgeworCQl2ZGVjX2NvcmVfcmVxdWVzdChwZGF0YSwgQ09SRV9NQVNLX1ZERUNfMSB8IENPUkVfTUFTS19IRVZDCisJCQkJCXwgQ09SRV9NQVNLX0NPTUJJTkUpOworCX0KKworCS8qSU5JVF9XT1JLKCZody0+dXNlcmRhdGFfcHVzaF93b3JrLCB1c2VyZGF0YV9wdXNoX2RvX3dvcmspOyovCisKKwlyZXR1cm4gMDsKKworZXJyb3I0OgorCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJTE1FTV9CVUZfU0laRSwgKHZvaWQgKilody0+bG1lbV9hZGRyLAorCQlody0+bG1lbV9waHlfYWRkcik7CitlcnJvcjM6CisJZG1hX2ZyZWVfY29oZXJlbnQoCisJCWFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJVVNFUl9EQVRBX1NJWkUsCisJCWh3LT51c2VyX2RhdGFfYnVmZmVyLAorCQlody0+dXNlcl9kYXRhX2J1ZmZlcl9waHlzKTsKK2Vycm9yMjoKKwlrZnJlZShody0+Z3ZzKTsKKwlody0+Z3ZzID0gTlVMTDsKKwlwZGF0YS0+ZGVjX3N0YXR1cyA9IE5VTEw7CitlcnJvcjE6CisJdmZyZWUoaHcpOworCXJldHVybiByOworfQorCisgaW50IGFtbXZkZWNfYXZzX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCisJaWYgKHZkZWNfZ2V0X2RlYnVnX2ZsYWdzKCkgJiAweDgpCisJCXJldHVybiBhbXZkZWNfYXZzX3JlbW92ZShwZGV2KTsKKwllbHNlIHsKKwkJc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3ID0KKwkJCShzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqKQorCQkJKCgoc3RydWN0IHZkZWNfcyAqKShwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KSkpLT5wcml2YXRlKTsKKwkJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaHcpOworCQlpbnQgaTsKKworCQlpZiAoaHctPnN0YXQgJiBTVEFUX1ZERUNfUlVOKSB7CisJCQlhbXZkZWNfc3RvcCgpOworCQkJaHctPnN0YXQgJj0gflNUQVRfVkRFQ19SVU47CisJCX0KKworCQlpZiAoaHctPnN0YXQgJiBTVEFUX0lTUl9SRUcpIHsKKwkJCXZkZWNfZnJlZV9pcnEoVkRFQ19JUlFfMSwgKHZvaWQgKilodyk7CisJCQlody0+c3RhdCAmPSB+U1RBVF9JU1JfUkVHOworCQl9CisKKwkJaWYgKGh3LT5zdGF0ICYgU1RBVF9USU1FUl9BUk0pIHsKKwkJCWRlbF90aW1lcl9zeW5jKCZody0+Y2hlY2tfdGltZXIpOworCQkJaHctPnN0YXQgJj0gflNUQVRfVElNRVJfQVJNOworCQl9CisKKwkJY2FuY2VsX3dvcmtfc3luYygmaHctPndvcmspOworCQljYW5jZWxfd29ya19zeW5jKCZody0+bm90aWZ5X3dvcmspOworCisJCWlmIChody0+bW1fYmxrX2hhbmRsZSkgeworCQkJZGVjb2Rlcl9ibW11X2JveF9mcmVlKGh3LT5tbV9ibGtfaGFuZGxlKTsKKwkJCWh3LT5tbV9ibGtfaGFuZGxlID0gTlVMTDsKKwkJfQorCQlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpCisJCQl2ZGVjX2NvcmVfcmVsZWFzZShod190b192ZGVjKGh3KSwgQ09SRV9NQVNLX1ZERUNfMSk7CisJCWVsc2UKKwkJCXZkZWNfY29yZV9yZWxlYXNlKGh3X3RvX3ZkZWMoaHcpLCBDT1JFX01BU0tfVkRFQ18xIHwgQ09SRV9NQVNLX0hFVkMpOworCQl2ZGVjX3NldF9zdGF0dXMoaHdfdG9fdmRlYyhodyksIFZERUNfU1RBVFVTX0RJU0NPTk5FQ1RFRCk7CisKKwkJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgREVDT0RFX0JVRkZFUl9OVU1fTUFYOyBpKyspIHsKKwkJCQl2ZGVjLT5mcmVlX2NhbnZhc19leChjYW52YXNfeShody0+Y2FudmFzX3NwZWNbaV0pLCB2ZGVjLT5pZCk7CisJCQkJdmRlYy0+ZnJlZV9jYW52YXNfZXgoY2FudmFzX3UoaHctPmNhbnZhc19zcGVjW2ldKSwgdmRlYy0+aWQpOworCQkJfQorCQl9CisJI2lmZGVmIEVOQUJMRV9VU0VSX0RBVEEKKwkJaWYgKGh3LT51c2VyX2RhdGFfYnVmZmVyICE9IE5VTEwpIHsKKwkJCWRtYV9mcmVlX2NvaGVyZW50KAorCQkJCWFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlVU0VSX0RBVEFfU0laRSwKKwkJCQlody0+dXNlcl9kYXRhX2J1ZmZlciwKKwkJCQlody0+dXNlcl9kYXRhX2J1ZmZlcl9waHlzKTsKKwkJCWh3LT51c2VyX2RhdGFfYnVmZmVyID0gTlVMTDsKKwkJCWh3LT51c2VyX2RhdGFfYnVmZmVyX3BoeXMgPSAwOworCQl9CisJI2VuZGlmCisJCS8qaWYgKGh3LT5sbWVtX2FkZHIpIHsKKwkJCWRtYV91bm1hcF9zaW5nbGUoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCWh3LT5sbWVtX3BoeV9hZGRyLCBMTUVNX0JVRl9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCQkJa2ZyZWUoaHctPmxtZW1fYWRkcik7CisJCQlody0+bG1lbV9hZGRyID0gTlVMTDsKKwkJfSovCisJaWYgKGh3LT5sbWVtX2FkZHIpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCQlMTUVNX0JVRl9TSVpFLCAodm9pZCAqKWh3LT5sbWVtX2FkZHIsCisJCQkJCWh3LT5sbWVtX3BoeV9hZGRyKTsKKwkJaHctPmxtZW1fYWRkciA9IDA7CisJfQorCisJCWlmIChody0+ZncpIHsKKwkJCXZmcmVlKGh3LT5mdyk7CisJCQlody0+ZncgPSBOVUxMOworCQl9CisKKwkJcHJfaW5mbygiYW1tdmRlY19hdnMgcmVtb3ZlZC5cbiIpOworCQlpZiAoaHctPmd2cykgeworCQkJa2ZyZWUoaHctPmd2cyk7CisJCQlody0+Z3ZzID0gTlVMTDsKKwkJfQorCisJCXZmcmVlKGh3KTsKKwkJcmV0dXJuIDA7CisJfQorfQorCisKKyNpZmRlZiBERUJVR19NVUxUSV9XSVRIX0FVVE9NT0RFCitzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpnZXRfdmJ1Zih2b2lkKTsKK3MzMiBlc3BhcnNlcl9pbml0KHN0cnVjdCBzdHJlYW1fYnVmX3MgKmJ1Ziwgc3RydWN0IHZkZWNfcyAqdmRlYyk7CisKKworc3RhdGljIHMzMiB2YXZzX2luaXQyKHN0cnVjdCB2ZGVjX2F2c19od19zICpodykKK3sKKwlpbnQgIHNpemUgPSAtMTsKKwlzdHJ1Y3QgZmlybXdhcmVfcyAqZnc7CisJdTMyIGZ3X3NpemUgPSAweDEwMDAgKiAxNjsKKworCWZ3ID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IGZpcm13YXJlX3MpICsgZndfc2l6ZSk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGZ3KSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcl9pbmZvKCJ2YXZzX2luaXRcbiIpOworCisJYW12ZGVjX2VuYWJsZSgpOworCisKKwl2YXZzX2xvY2FsX2luaXQoaHcpOworCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hNKQorCQlzaXplID0gZ2V0X2Zpcm13YXJlX2RhdGEoVklERU9fREVDX0FWU19NVUxUSSwgZnctPmRhdGEpOworCWVsc2UgeworCQlpZiAoZmlybXdhcmVfc2VsID09IDEpCisJCQlzaXplID0gZ2V0X2Zpcm13YXJlX2RhdGEoVklERU9fREVDX0FWU19OT0NBQkFDLCBmdy0+ZGF0YSk7CisjaWZkZWYgQVZTUF9MT05HX0NBQkFDCisJCWVsc2UgeworCQkJaW5pdF9hdnNwX2xvbmdfY2FiYWNfYnVmKCk7CisJCQlzaXplID0gZ2V0X2Zpcm13YXJlX2RhdGEoVklERU9fREVDX0FWU19NVUxUSSwgZnctPmRhdGEpOworCQl9CisjZW5kaWYKKwl9CisKKwlpZiAoc2l6ZSA8IDApIHsKKwkJYW12ZGVjX2Rpc2FibGUoKTsKKwkJcHJfZXJyKCJnZXQgZmlybXdhcmUgZmFpbC4iKTsKKwkJLyp2ZnJlZShidWYpOyovCisJCXJldHVybiAtMTsKKwl9CisKKwlmdy0+bGVuID0gc2l6ZTsKKwlody0+ZncgPSBmdzsKKwlpZiAoaHctPm1faW5zX2ZsYWcpIHsKKwkJaW5pdF90aW1lcigmaHctPmNoZWNrX3RpbWVyKTsKKwkJaHctPmNoZWNrX3RpbWVyLmRhdGEgPSAodWxvbmcpIGh3OworCQlody0+Y2hlY2tfdGltZXIuZnVuY3Rpb24gPSBjaGVja190aW1lcl9mdW5jOworCQlody0+Y2hlY2tfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBDSEVDS19JTlRFUlZBTDsKKworCisJCS8vYWRkX3RpbWVyKCZody0+Y2hlY2tfdGltZXIpOworCQlody0+c3RhdCB8PSBTVEFUX1RJTUVSX0FSTTsKKworCQlJTklUX1dPUksoJmh3LT53b3JrLCB2YXZzX3dvcmspOworCisJCWh3LT5mdyA9IGZ3OworCX0KKwlyZXR1cm4gMDsKK30KKwordW5zaWduZWQgaW50IGRlYnVnX2ZsYWcyOworc3RhdGljIGludCB2YXZzX3Byb3RfaW5pdDIoc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3LCB1bnNpZ25lZCBjaGFyIHBvc3RfZmxhZykKK3sKKwlpbnQgciA9IDA7CisJLyoKKwkgKiAyOiBhc3Npc3QKKwkgKiAzOiB2bGRfcmVzZXQKKwkgKiA0OiB2bGRfcGFydF9yZXNldAorCSAqIDU6IHZmaWZvIHJlc2V0CisJICogNjogaXFpZGN0CisJICogNzogbWMKKwkgKiA4OiBkYmxrCisJICogOTogcGljX2RjCisJICogMTA6IHBzYworCSAqIDExOiBtY3B1CisJICogMTI6IGNjcHUKKwkgKiAxMzogZGRyCisJICogMTQ6IGFmaWZvCisJICovCisJdW5zaWduZWQgY2hhciBydW5fZmxhZzsKKyNpZmRlZiBPT08KKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsICgxIDw8IDcpIHwgKDEgPDwgNikgLyp8ICgxIDw8IDQpKi8pOworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgMCk7CisKKwlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMCk7CisKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsICgxIDw8IDcpIHwgKDEgPDwgNikgLyp8ICgxIDw8IDQpKi8pOworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgMCk7CisKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsICgxIDw8IDkpIHwgKDEgPDwgOCkpOworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgMCk7CisjZW5kaWYKKwkvKioqKioqKioqKioqKioqKiogcmVzZXQgdmxkICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBPT08KKwlXUklURV9WUkVHKFBPV0VSX0NUTF9WTEQsIDB4MTApOworCVdSSVRFX1ZSRUdfQklUUyhWTERfTUVNX1ZJRklGT19DT05UUk9MLCAyLCBNRU1fRklGT19DTlRfQklULCAyKTsKKwlXUklURV9WUkVHX0JJVFMoVkxEX01FTV9WSUZJRk9fQ09OVFJPTCwJOCwgTUVNX0xFVkVMX0NOVF9CSVQsIDYpOworI2VuZGlmCisgICBpZiAoc3RhcnRfZGVjb2RpbmdfZGVsYXkgJiAweDgwMDAwKQorCQltc2xlZXAoc3RhcnRfZGVjb2RpbmdfZGVsYXkmMHhmZmZmKTsKKworaWYgKGRlYnVnX2ZsYWcyICYgMHgxKQorCXJ1bl9mbGFnID0gcG9zdF9mbGFnOworZWxzZQorCXJ1bl9mbGFnID0gIXBvc3RfZmxhZzsKK2lmIChydW5fZmxhZykgeworCWlmIChody0+bV9pbnNfZmxhZykgeworCQlpbnQgaTsKKwkJaWYgKGh3LT5kZWNvZGVfcGljX2NvdW50ID09IDApIHsKKwkJCXIgPSB2YXZzX2NhbnZhc19pbml0KGh3KTsKKyNpZm5kZWYgVVNFX0RZTkFNSUNfQlVGX05VTQorCQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8wICsgaSwKKwkJCQkJaHctPmNhbnZhc19zcGVjW2ldCisJCQkJKTsKKwkJCX0KKyNlbHNlCisJCWZvciAoaSA9IDA7IGkgPCBody0+dmZfYnVmX251bV91c2VkOyBpICs9IDIpIHsKKwkJCVdSSVRFX1ZSRUcoYnVmX3NwZWNfcmVnW2kgPj4gMV0sCisJCQkJKGh3LT5jYW52YXNfc3BlY1tpXSAmIDB4ZmZmZikgfAorCQkJCSgoaHctPmNhbnZhc19zcGVjW2kgKyAxXSAmIDB4ZmZmZikKKwkJCQkJPDwgMTYpCisJCQkpOworCQl9CisjZW5kaWYKKwkJfSBlbHNlCisJCQl2YXZzX3Jlc3RvcmVfcmVncyhodyk7CisKKwkJZm9yIChpID0gMDsgaSA8IGh3LT52Zl9idWZfbnVtX3VzZWQ7IGkrKykgeworCQkJY29uZmlnX2Nhdl9sdXRfZXgoY2FudmFzX3koaHctPmNhbnZhc19zcGVjW2ldKSwKKwkJCQlody0+Y2FudmFzX2NvbmZpZ1tpXVswXS5waHlfYWRkciwKKwkJCQlody0+Y2FudmFzX2NvbmZpZ1tpXVswXS53aWR0aCwKKwkJCQlody0+Y2FudmFzX2NvbmZpZ1tpXVswXS5oZWlnaHQsCisJCQkJQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJCWh3LT5jYW52YXNfY29uZmlnW2ldWzBdLmJsb2NrX21vZGUsCisJCQkJMCwgVkRFQ18xKTsKKworCQkJY29uZmlnX2Nhdl9sdXRfZXgoY2FudmFzX3UoaHctPmNhbnZhc19zcGVjW2ldKSwKKwkJCQlody0+Y2FudmFzX2NvbmZpZ1tpXVsxXS5waHlfYWRkciwKKwkJCQlody0+Y2FudmFzX2NvbmZpZ1tpXVsxXS53aWR0aCwKKwkJCQlody0+Y2FudmFzX2NvbmZpZ1tpXVsxXS5oZWlnaHQsCisJCQkJQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJCWh3LT5jYW52YXNfY29uZmlnW2ldWzFdLmJsb2NrX21vZGUsCisJCQkJMCwgVkRFQ18xKTsKKwkJfQorCX0KK30KKworaWYgKGRlYnVnX2ZsYWcyICYgMHgyKQorCXJ1bl9mbGFnID0gcG9zdF9mbGFnOworZWxzZQorCXJ1bl9mbGFnID0gIXBvc3RfZmxhZzsKK2lmIChydW5fZmxhZykgeworCisJLyogbm90aWZ5IHVjb2RlIHRoZSBidWZmZXIgb2Zmc2V0ICovCisJaWYgKGh3LT5kZWNvZGVfcGljX2NvdW50ID09IDApCisJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9GLCBody0+YnVmX29mZnNldCk7CisjaWZkZWYgT09PCisJLyogZGlzYWJsZSBQU0NBTEUgZm9yIGhhcmR3YXJlIHNoYXJpbmcgKi8KKwlXUklURV9WUkVHKFBTQ0FMRV9DVFJMLCAwKTsKKyNlbmRpZgorCX0KKwlpZiAoc3RhcnRfZGVjb2RpbmdfZGVsYXkgJiAweDQwMDAwKQorCQltc2xlZXAoc3RhcnRfZGVjb2RpbmdfZGVsYXkmMHhmZmZmKTsKKworCWlmIChkZWJ1Z19mbGFnMiAmIDB4NCkKKwkJcnVuX2ZsYWcgPSBwb3N0X2ZsYWc7CisJZWxzZQorCQlydW5fZmxhZyA9ICFwb3N0X2ZsYWc7CisJaWYgKHJ1bl9mbGFnKSB7CisJaWYgKGh3LT5kZWNvZGVfcGljX2NvdW50ID09IDApIHsKKyNpZm5kZWYgVVNFX0RZTkFNSUNfQlVGX05VTQorCQlXUklURV9WUkVHKEFWU19TT1NfQ09VTlQsIDApOworI2VuZGlmCisJCVdSSVRFX1ZSRUcoQVZTX0JVRkZFUklOLCAwKTsKKwkJV1JJVEVfVlJFRyhBVlNfQlVGRkVST1VULCAwKTsKKwl9CisJaWYgKGVycm9yX3JlY292ZXJ5X21vZGUpCisJCVdSSVRFX1ZSRUcoQVZTX0VSUk9SX1JFQ09WRVJZX01PREUsIDApOworCWVsc2UKKwkJV1JJVEVfVlJFRyhBVlNfRVJST1JfUkVDT1ZFUllfTU9ERSwgMSk7CisJLyogY2xlYXIgbWFpbGJveCBpbnRlcnJ1cHQgKi8KKwlXUklURV9WUkVHKEFTU0lTVF9NQk9YMV9DTFJfUkVHLCAxKTsKKworCS8qIGVuYWJsZSBtYWlsYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoQVNTSVNUX01CT1gxX01BU0ssIDEpOworfQorCitpZiAoZGVidWdfZmxhZzIgJiAweDgpCisJcnVuX2ZsYWcgPSBwb3N0X2ZsYWc7CitlbHNlCisJcnVuX2ZsYWcgPSAhcG9zdF9mbGFnOworaWYgKHJ1bl9mbGFnKSB7CisKKyNpZm5kZWYgVVNFX0RZTkFNSUNfQlVGX05VTQkJCQkvKiBkZWYgREVCVUdfVUNPREUgKi8KKwlpZiAoaHctPmRlY29kZV9waWNfY291bnQgPT0gMCkKKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0QsIDApOworI2VuZGlmCisJaWYgKHN0YXJ0X2RlY29kaW5nX2RlbGF5ICYgMHgxMDAwMCkKKwkJbXNsZWVwKHN0YXJ0X2RlY29kaW5nX2RlbGF5JjB4ZmZmZik7CisjaWZkZWYgTlYyMQorCVNFVF9WUkVHX01BU0soTURFQ19QSUNfRENfQ1RSTCwgMSA8PCAxNyk7CisjZW5kaWYKKwkvKiBWNEwyX1BJWF9GTVRfTlYyMSAgVjRMMl9QSVhfRk1UX05WMjFNICovCisJU0VUX1ZSRUdfTUFTSyhNREVDX1BJQ19EQ19DVFJMLCAxIDw8IDE2KTsKKworCWlmIChzdGFydF9kZWNvZGluZ19kZWxheSAmIDB4MjAwMDApCisJCW1zbGVlcChzdGFydF9kZWNvZGluZ19kZWxheSYweGZmZmYpOworCisKKyNpZmRlZiBQSUNfRENfTkVFRF9DTEVBUgorCUNMRUFSX1ZSRUdfTUFTSyhNREVDX1BJQ19EQ19DVFJMLCAxIDw8IDMxKTsKKyNlbmRpZgorfQoraWYgKGRlYnVnX2ZsYWcyICYgMHgxMCkKKwlydW5fZmxhZyA9IHBvc3RfZmxhZzsKK2Vsc2UKKwlydW5fZmxhZyA9ICFwb3N0X2ZsYWc7CitpZiAocnVuX2ZsYWcpIHsKKyNpZmRlZiBFTkFCTEVfVVNFUl9EQVRBCisJaWYgKGZpcm13YXJlX3NlbCA9PSAwKSB7CisJCXByX2luZm8oIiEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEgZmlybXdhcmVfc2VsIGlzIDBcbiIpOworCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfTiwgKHUzMikoaHctPnVzZXJfZGF0YV9idWZmZXJfcGh5cyAtIGh3LT5idWZfb2Zmc2V0KSk7CisJCXByX2RlYnVnKCJBVl9TQ1JBVENIX04gPSAweCV4XG4iLCBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9OKSk7CisJfQorI2VuZGlmCit9CisKK2lmIChkZWJ1Z19mbGFnMiAmIDB4MjApCisJcnVuX2ZsYWcgPSBwb3N0X2ZsYWc7CitlbHNlCisJcnVuX2ZsYWcgPSAhcG9zdF9mbGFnOworaWYgKHJ1bl9mbGFnKSB7CisJaWYgKGh3LT5tX2luc19mbGFnKSB7CisJCWlmICh2ZGVjX2ZyYW1lX2Jhc2VkKGh3X3RvX3ZkZWMoaHcpKSkKKwkJCVdSSVRFX1ZSRUcoREVDT0RFX01PREUsIERFQ09ERV9NT0RFX01VTFRJX0ZSQU1FQkFTRSk7CisJCWVsc2UKKwkJCVdSSVRFX1ZSRUcoREVDT0RFX01PREUsIERFQ09ERV9NT0RFX01VTFRJX1NUUkVBTUJBU0UpOworCQlXUklURV9WUkVHKERFQ09ERV9MTUVNX0JVRl9BRFIsICh1MzIpaHctPmxtZW1fcGh5X2FkZHIpOworCX0gZWxzZQorCQlXUklURV9WUkVHKERFQ09ERV9NT0RFLCBERUNPREVfTU9ERV9TSU5HTEUpOworCVdSSVRFX1ZSRUcoREVDT0RFX1NUT1BfUE9TLCB1ZGVidWdfZmxhZyk7CisJaHctPm9sZF91ZGVidWdfZmxhZyA9IHVkZWJ1Z19mbGFnOworfQorCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBpbml0X2h3KHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3ID0KKwkoc3RydWN0IHZkZWNfYXZzX2h3X3MgKil2ZGVjLT5wcml2YXRlOworCWludCByZXQ7CisJcHJfaW5mbygiJXMsICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTSkKKwkJcmV0ID0gYW12ZGVjX2xvYWRtY19leChWRk9STUFUX0FWUywgTlVMTCwgaHctPmZ3LT5kYXRhKTsKKwllbHNlIGlmIChmaXJtd2FyZV9zZWwgPT0gMSkKKwkJcmV0ID0gYW12ZGVjX2xvYWRtY19leChWRk9STUFUX0FWUywgImF2c19ub19jYWJhYyIsIGh3LT5mdy0+ZGF0YSk7CisJZWxzZQorCQlyZXQgPSBhbXZkZWNfbG9hZG1jX2V4KFZGT1JNQVRfQVZTLCBOVUxMLCBody0+ZnctPmRhdGEpOworCisJaWYgKHJldCA8IDApIHsKKwkJYW12ZGVjX2Rpc2FibGUoKTsKKwkJLyp2ZnJlZShidWYpOyovCisJCXByX2VycigiQVZTOiB0aGUgJXMgZncgbG9hZGluZyBmYWlsZWQsIGVycjogJXhcbiIsCisJCQl0ZWVfZW5hYmxlZCgpID8gIlRFRSIgOiAibG9jYWwiLCByZXQpOworCX0KKwlwcl9pbmZvKCIlcywgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwkvKnZmcmVlKGJ1Zik7Ki8KKworCWh3LT5zdGF0IHw9IFNUQVRfTUNfTE9BRDsKKworCS8qIGVuYWJsZSBBTVJJU0Mgc2lkZSBwcm90b2NvbCAqLworCXJldCA9IHZhdnNfcHJvdF9pbml0MihodywgMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybjsKKwlwcl9pbmZvKCIlcywgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKK30KKworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBydW5fcmVhZHkyKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgcnVuMihzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1bnNpZ25lZCBsb25nIG1hc2ssCit2b2lkICgqY2FsbGJhY2spKHN0cnVjdCB2ZGVjX3MgKiwgdm9pZCAqKSwKKwkJdm9pZCAqYXJnKQoreworCXN0cnVjdCB2ZGVjX2F2c19od19zICpodyA9CisJKHN0cnVjdCB2ZGVjX2F2c19od19zICopdmRlYy0+cHJpdmF0ZTsKKwlwcl9pbmZvKCIlcywgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwl2YXZzX3Byb3RfaW5pdDIoaHcsIDEpOworCisJdmRlY19zb3VyY2VfY2hhbmdlZChWRk9STUFUX0FWUywKKwkJCQkJMTkyMCwgMTA4MCwgMzApOworCisJYW12ZGVjX3N0YXJ0KCk7CisKKwlody0+c3RhdCB8PSBTVEFUX1ZERUNfUlVOOworCXByX2luZm8oIiVzICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCit9CisKK3N0YXRpYyBpbnQgYW1tdmRlY19hdnNfcHJvYmUyKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHZkZWNfcyAqcGRhdGEgPSAqKHN0cnVjdCB2ZGVjX3MgKiopcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3ID0gTlVMTDsKKworCXByX2luZm8oImFtbXZkZWNfYXZzIHByb2JlIHN0YXJ0LlxuIik7CisKKwlpZiAocGRhdGEgPT0gTlVMTCkgeworCQlwcl9pbmZvKCJhbW12ZGVjX2F2cyBwbGF0Zm9ybSBkYXRhIHVuZGVmaW5lZC5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcHJfaW5mbygiJXMgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlodyA9IChzdHJ1Y3QgdmRlY19hdnNfaHdfcyAqKXZ6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZGVjX2F2c19od19zKSk7CisJaWYgKGh3ID09IE5VTEwpIHsKKwkJcHJfaW5mbygiXG5hbW12ZGVjX2F2cyBkZWNvZGVyIGRyaXZlciBhbGxvYyBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcHJfaW5mbygiJXMgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJLyphdG9taWNfc2V0KCZody0+ZXJyb3JfaGFuZGxlcl9ydW4sIDApOyovCisJaHctPm1faW5zX2ZsYWcgPSAxOworCXByX2luZm8oIiVzICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hNIHx8IGRpc2FibGVfbG9uZ2NhYmFjX3RyYW5zKQorCQlmaXJtd2FyZV9zZWwgPSAxOworCXByX2luZm8oIiVzICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJaWYgKGZpcm13YXJlX3NlbCA9PSAxKSB7CisjaWZuZGVmIFVTRV9EWU5BTUlDX0JVRl9OVU0KKwkJdmZfYnVmX251bSA9IDQ7CisjZW5kaWYKKwkJY2FudmFzX2Jhc2UgPSAwOworCQljYW52YXNfbnVtID0gMzsKKwl9IGVsc2UgeworCQlwcl9pbmZvKCJFcnJvciwgZG8gbm90IHN1cHBvcnQgbG9uZ2NhYmFjIHdvcmsgYXJvdW5kISEhIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlwcl9pbmZvKCIlcyAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCWlmIChwZGF0YS0+c3lzX2luZm8pCisJCWh3LT52YXZzX2Ftc3RyZWFtX2RlY19pbmZvID0gKnBkYXRhLT5zeXNfaW5mbzsKKwlwcl9pbmZvKCIlcyAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCWh3LT5pc19yZXNldCA9IDA7CisJcGRhdGEtPnVzZXJfZGF0YV9yZWFkID0gTlVMTDsKKwlwZGF0YS0+cmVzZXRfdXNlcmRhdGFfZmlmbyA9IE5VTEw7CisKKwlwcl9pbmZvKCIlcyAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCXBkYXRhLT5wcml2YXRlID0gaHc7CisJcGRhdGEtPmRlY19zdGF0dXMgPSB2YXZzX2RlY19zdGF0dXM7CisJcGRhdGEtPnNldF9pc3Jlc2V0ID0gdmF2c19zZXRfaXNyZXNldDsKKwlwZGF0YS0+cnVuX3JlYWR5ID0gcnVuX3JlYWR5MjsKKwlwZGF0YS0+cnVuID0gcnVuMjsKKwlwZGF0YS0+cmVzZXQgPSByZXNldDsKKwlwZGF0YS0+aXJxX2hhbmRsZXIgPSB2bWF2c19pc3I7CisJcGRhdGEtPnRocmVhZGVkX2lycV9oYW5kbGVyID0gdm1hdnNfaXNyX3RocmVhZF9mbjsKKwlwZGF0YS0+ZHVtcF9zdGF0ZSA9IHZtYXZzX2R1bXBfc3RhdGU7CisKKwlwcl9pbmZvKCIlcyAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCXZhdnNfdmRlY19pbmZvX2luaXQoaHcpOworCisJcHJfaW5mbygiJXMgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKyNpZmRlZiBFTkFCTEVfVVNFUl9EQVRBCisJaWYgKE5VTEwgPT0gaHctPnVzZXJfZGF0YV9idWZmZXIpIHsKKwkJaHctPnVzZXJfZGF0YV9idWZmZXIgPQorCQkJZG1hX2FsbG9jX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlVU0VSX0RBVEFfU0laRSwKKwkJCQkmaHctPnVzZXJfZGF0YV9idWZmZXJfcGh5cywgR0ZQX0tFUk5FTCk7CisJCWlmICghaHctPnVzZXJfZGF0YV9idWZmZXIpIHsKKwkJCXByX2luZm8oIiVzOiBDYW4gbm90IGFsbG9jYXRlIGh3LT51c2VyX2RhdGFfYnVmZmVyXG4iLAorCQkJCSAgIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXByX2RlYnVnKCJody0+dXNlcl9kYXRhX2J1ZmZlciA9IDB4JXAsIGh3LT51c2VyX2RhdGFfYnVmZmVyX3BoeXMgPSAweCV4XG4iLAorCQkJaHctPnVzZXJfZGF0YV9idWZmZXIsICh1MzIpaHctPnVzZXJfZGF0YV9idWZmZXJfcGh5cyk7CisJfQorI2VuZGlmCisJaHctPmxtZW1fYWRkciA9IGttYWxsb2MoTE1FTV9CVUZfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKGh3LT5sbWVtX2FkZHIgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgbG1lbSBidWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKwlody0+bG1lbV9waHlfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJaHctPmxtZW1fYWRkciwgTE1FTV9CVUZfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQlody0+bG1lbV9waHlfYWRkcikpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIG1hcCBsbWVtIGJ1ZmZlclxuIiwgX19mdW5jX18pOworCQlrZnJlZShody0+bG1lbV9hZGRyKTsKKwkJaHctPmxtZW1fYWRkciA9IE5VTEw7CisJCXJldHVybiAtMTsKKwl9CisKKwlwcl9pbmZvKCIlcyAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCS8qSU5JVF9XT1JLKCZody0+c2V0X2Nsa193b3JrLCBhdnNfc2V0X2Nsayk7Ki8KKworCXByX2luZm8oIiVzICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJaWYgKHZhdnNfaW5pdDIoaHcpIDwgMCkgeworCQlwcl9pbmZvKCJhbXZkZWNfYXZzIGluaXQgZmFpbGVkLlxuIik7CisJCWtmcmVlKGh3LT5ndnMpOworCQlody0+Z3ZzID0gTlVMTDsKKwkJcGRhdGEtPmRlY19zdGF0dXMgPSBOVUxMOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJLyp2ZGVjID0gcGRhdGE7Ki8KKwlwcl9pbmZvKCIlcywgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKK2lmIChody0+bV9pbnNfZmxhZykgeworCUlOSVRfV09SSygmaHctPm5vdGlmeV93b3JrLCB2YXZzX25vdGlmeV93b3JrKTsKKyNpZiAxCisJaWYgKHBkYXRhLT51c2VfdmZtX3BhdGgpIHsKKwkJc25wcmludGYocGRhdGEtPnZmX3Byb3ZpZGVyX25hbWUsIFZERUNfUFJPVklERVJfTkFNRV9TSVpFLAorCQkJICAgIFZGTV9ERUNfUFJPVklERVJfTkFNRSk7CisJCWh3LT5mcmFtZWluZm9fZW5hYmxlID0gMTsKKwl9CisJZWxzZQorCQlzbnByaW50ZihwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwgVkRFQ19QUk9WSURFUl9OQU1FX1NJWkUsCisJCQlNVUxUSV9JTlNUQU5DRV9QUk9WSURFUl9OQU1FICIuJTAyeCIsIHBkZXYtPmlkICYgMHhmZik7CisJaWYgKHBkYXRhLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IERFQ09ERV9CVUZGRVJfTlVNX01BWDsgaSsrKQorCQkJaHctPmNhbnZhc19zcGVjW2ldID0gMHhmZmZmZmY7CisJfQorCXZmX3Byb3ZpZGVyX2luaXQoJnBkYXRhLT52ZnJhbWVfcHJvdmlkZXIsIHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lLAorCQkmdmF2c192Zl9wcm92aWRlciwgaHcpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGRhdGEpOworCisJaHctPnBsYXRmb3JtX2RldiA9IHBkZXY7CisKKwl2ZGVjX3NldF9wcmVwYXJlX2xldmVsKHBkYXRhLCBzdGFydF9kZWNvZGVfYnVmX2xldmVsKTsKKworCWlmIChwZGF0YS0+cGFyYWxsZWxfZGVjID09IDEpCisJCXZkZWNfY29yZV9yZXF1ZXN0KHBkYXRhLCBDT1JFX01BU0tfVkRFQ18xKTsKKwllbHNlIHsKKwkJdmRlY19jb3JlX3JlcXVlc3QocGRhdGEsIENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQworCQkJCQl8IENPUkVfTUFTS19DT01CSU5FKTsKKwl9CisJcHJfaW5mbygiJXMsICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworI2VuZGlmCit9ZWxzZXsKKwkvKklOSVRfV09SSygmaHctPmZhdGFsX2Vycm9yX3dkX3dvcmssIHZhdnNfZmF0YWxfZXJyb3JfaGFuZGxlcik7CisJYXRvbWljX3NldCgmaHctPmVycm9yX2hhbmRsZXJfcnVuLCAwKTsqLworI2lmZGVmIEVOQUJMRV9VU0VSX0RBVEEKKwlJTklUX1dPUksoJmh3LT51c2VyZGF0YV9wdXNoX3dvcmssIHVzZXJkYXRhX3B1c2hfZG9fd29yayk7CisjZW5kaWYKKwlJTklUX1dPUksoJmh3LT5ub3RpZnlfd29yaywgdmF2c19ub3RpZnlfd29yayk7Cit9CisKKwlpbml0X2h3KHBkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbW12ZGVjX2F2c19yZW1vdmUyKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHZkZWNfYXZzX2h3X3MgKmh3ID0gZ2h3OworCisJY2FuY2VsX3dvcmtfc3luYygmaHctPmZhdGFsX2Vycm9yX3dkX3dvcmspOworCWF0b21pY19zZXQoJmh3LT5lcnJvcl9oYW5kbGVyX3J1biwgMCk7CisjaWZkZWYgRU5BQkxFX1VTRVJfREFUQQorCWNhbmNlbF93b3JrX3N5bmMoJmh3LT51c2VyZGF0YV9wdXNoX3dvcmspOworI2VuZGlmCisJY2FuY2VsX3dvcmtfc3luYygmaHctPm5vdGlmeV93b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZody0+c2V0X2Nsa193b3JrKTsKKwlpZiAoaHctPnN0YXQgJiBTVEFUX1ZERUNfUlVOKSB7CisJCWFtdmRlY19zdG9wKCk7CisJCWh3LT5zdGF0ICY9IH5TVEFUX1ZERUNfUlVOOworCX0KKworCWlmIChody0+c3RhdCAmIFNUQVRfSVNSX1JFRykgeworCQl2ZGVjX2ZyZWVfaXJxKFZERUNfSVJRXzEsICh2b2lkICopdmF2c19kZWNfaWQpOworCQlody0+c3RhdCAmPSB+U1RBVF9JU1JfUkVHOworCX0KKworCWlmIChody0+c3RhdCAmIFNUQVRfVElNRVJfQVJNKSB7CisJCWRlbF90aW1lcl9zeW5jKCZody0+cmVjeWNsZV90aW1lcik7CisJCWh3LT5zdGF0ICY9IH5TVEFUX1RJTUVSX0FSTTsKKwl9CisjaWZkZWYgQVZTUF9MT05HX0NBQkFDCisJaWYgKGZpcm13YXJlX3NlbCA9PSAwKSB7CisJCW11dGV4X2xvY2soJnZhdnNfbXV0ZXgpOworCQljYW5jZWxfd29ya19zeW5jKCZsb25nX2NhYmFjX3dkX3dvcmspOworCQltdXRleF91bmxvY2soJnZhdnNfbXV0ZXgpOworCisJCWlmIChlc193cml0ZV9hZGRyX3ZpcnQpIHsKKyNpZiAwCisJCQljb2RlY19tbV9mcmVlX2Zvcl9kbWEoInZhdnMiLCBlc193cml0ZV9hZGRyX3BoeSk7CisjZWxzZQorCQkJZG1hX3VubWFwX3NpbmdsZShhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJZXNfd3JpdGVfYWRkcl9waHksCisJCQkJTUFYX0NPREVEX0ZSQU1FX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJCQkvKmtmcmVlKGVzX3dyaXRlX2FkZHJfdmlydCk7Ki8KKwkJCWVzX3dyaXRlX2FkZHJfdmlydCA9IE5VTEw7CisjZW5kaWYKKwkJfQorCisjaWZkZWYgQklUU1RSRUFNX1JFQURfVE1QX05PX0NBQ0hFCisJCWlmIChiaXRzdHJlYW1fcmVhZF90bXApIHsKKwkJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlTVkFfU1RSRUFNX0JVRl9TSVpFLCBiaXRzdHJlYW1fcmVhZF90bXAsCisJCQkJYml0c3RyZWFtX3JlYWRfdG1wX3BoeSk7CisJCQliaXRzdHJlYW1fcmVhZF90bXAgPSBOVUxMOworCQl9CisjZWxzZQorCQlpZiAoYml0c3RyZWFtX3JlYWRfdG1wKSB7CisJCQlkbWFfdW5tYXBfc2luZ2xlKGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQliaXRzdHJlYW1fcmVhZF90bXBfcGh5LAorCQkJCVNWQV9TVFJFQU1fQlVGX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJCQlrZnJlZShiaXRzdHJlYW1fcmVhZF90bXApOworCQkJYml0c3RyZWFtX3JlYWRfdG1wID0gTlVMTDsKKwkJfQorI2VuZGlmCisJfQorI2VuZGlmCisJaWYgKGh3LT5zdGF0ICYgU1RBVF9WRl9IT09LKSB7CisJCWlmIChody0+ZnJfaGludF9zdGF0dXMgPT0gVkRFQ19ISU5URUQgJiYgIWh3LT5pc19yZXNldCkKKwkJCWF2c192Zl9ub3RpZnlfcmVjZWl2ZXIoaHcsIFBST1ZJREVSX05BTUUsCisJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX0ZSX0VORF9ISU5ULCBOVUxMKTsKKwkJaHctPmZyX2hpbnRfc3RhdHVzID0gVkRFQ19OT19ORUVEX0hJTlQ7CisJCXZmX3VucmVnX3Byb3ZpZGVyKCZ2YXZzX3ZmX3Byb3YpOworCQlody0+c3RhdCAmPSB+U1RBVF9WRl9IT09LOworCX0KKworI2lmZGVmIEVOQUJMRV9VU0VSX0RBVEEKKwlpZiAoaHctPnVzZXJfZGF0YV9idWZmZXIgIT0gTlVMTCkgeworCQlkbWFfZnJlZV9jb2hlcmVudCgKKwkJCWFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCVVTRVJfREFUQV9TSVpFLAorCQkJaHctPnVzZXJfZGF0YV9idWZmZXIsCisJCQlody0+dXNlcl9kYXRhX2J1ZmZlcl9waHlzKTsKKwkJaHctPnVzZXJfZGF0YV9idWZmZXIgPSBOVUxMOworCQlody0+dXNlcl9kYXRhX2J1ZmZlcl9waHlzID0gMDsKKwl9CisjZW5kaWYKKworCWlmIChody0+ZncpIHsKKwkJdmZyZWUoaHctPmZ3KTsKKwkJaHctPmZ3ID0gTlVMTDsKKwl9CisKKwlhbXZkZWNfZGlzYWJsZSgpOworCS8qdmRlY19kaXNhYmxlX0RNQyhOVUxMKTsqLworCisJaHctPnBpY190eXBlID0gMDsKKwlpZiAoaHctPm1tX2Jsa19oYW5kbGUpIHsKKwkJZGVjb2Rlcl9ibW11X2JveF9mcmVlKGh3LT5tbV9ibGtfaGFuZGxlKTsKKwkJaHctPm1tX2Jsa19oYW5kbGUgPSBOVUxMOworCX0KKyNpZmRlZiBERUJVR19QVFMKKwlwcl9kZWJ1ZygicHRzIGhpdCAlZCwgcHRzIG1pc3NlZCAlZCwgaSBoaXQgJWQsIG1pc3NlZCAlZFxuIiwgaHctPnB0c19oaXQsCisJCSAgIGh3LT5wdHNfbWlzc2VkLCBody0+cHRzX2lfaGl0LCBody0+cHRzX2lfbWlzc2VkKTsKKwlwcl9kZWJ1ZygidG90YWwgZnJhbWUgJWQsIGh3LT5hdmlfZmxhZyAlZCwgcmF0ZSAlZFxuIiwgaHctPnRvdGFsX2ZyYW1lLCBody0+YXZpX2ZsYWcsCisJCSAgIGh3LT52YXZzX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUpOworI2VuZGlmCisJa2ZyZWUoaHctPmd2cyk7CisJaHctPmd2cyA9IE5VTEw7CisJdmZyZWUoaHcpOworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFtbXZkZWNfYXZzX2RyaXZlciA9IHsKKyNpZmRlZiBERUJVR19NVUxUSV9XSVRIX0FVVE9NT0RFCisJLnByb2JlID0gYW1tdmRlY19hdnNfcHJvYmUyLAorCS5yZW1vdmUgPSBhbW12ZGVjX2F2c19yZW1vdmUyLAorI2Vsc2UKKwkucHJvYmUgPSBhbW12ZGVjX2F2c19wcm9iZSwKKwkucmVtb3ZlID0gYW1tdmRlY19hdnNfcmVtb3ZlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBhbXZkZWNfc3VzcGVuZCwKKwkucmVzdW1lID0gYW12ZGVjX3Jlc3VtZSwKKyNlbmRpZgorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gTVVMVElfRFJJVkVSX05BTUUsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBjb2RlY19wcm9maWxlX3QgYW1tdmRlY19hdnNfcHJvZmlsZSA9IHsKKwkubmFtZSA9ICJBVlMtVjRMIiwKKwkucHJvZmlsZSA9ICIiCit9OworCitzdGF0aWMgc3RydWN0IG1jb25maWcgbWF2c19jb25maWdzW10gPSB7CisJLypNQ19QVTMyKCJzdGF0IiwgJnN0YXQpLAorCU1DX1BVMzIoImRlYnVnX2ZsYWciLCAmZGVidWdfZmxhZyksCisJTUNfUFUzMigiZXJyb3JfcmVjb3ZlcnlfbW9kZSIsICZlcnJvcl9yZWNvdmVyeV9tb2RlKSwKKwlNQ19QVTMyKCJody0+cGljX3R5cGUiLCAmaHctPnBpY190eXBlKSwKKwlNQ19QVTMyKCJyYWRyIiwgJnJhZHIpLAorCU1DX1BVMzIoInZmX2J1Zl9udW0iLCAmdmZfYnVmX251bSksCisJTUNfUFUzMigidmZfYnVmX251bV91c2VkIiwgJnZmX2J1Zl9udW1fdXNlZCksCisJTUNfUFUzMigiY2FudmFzX2Jhc2UiLCAmY2FudmFzX2Jhc2UpLAorCU1DX1BVMzIoImZpcm13YXJlX3NlbCIsICZmaXJtd2FyZV9zZWwpLAorCSovCit9Oworc3RhdGljIHN0cnVjdCBtY29uZmlnX25vZGUgbWF2c19ub2RlOworCisKK3N0YXRpYyBpbnQgX19pbml0IGFtbXZkZWNfYXZzX2RyaXZlcl9pbml0X21vZHVsZSh2b2lkKQoreworCXByX2RlYnVnKCJhbW12ZGVjX2F2cyBtb2R1bGUgaW5pdFxuIik7CisKKwlpZiAocGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhbW12ZGVjX2F2c19kcml2ZXIpKSB7CisJCXByX2VycigiZmFpbGVkIHRvIHJlZ2lzdGVyIGFtbXZkZWNfYXZzIGRyaXZlclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYQkIpCisJCWFtbXZkZWNfYXZzX3Byb2ZpbGUucHJvZmlsZSA9ICJtYXZzKyI7CisKKwl2Y29kZWNfcHJvZmlsZV9yZWdpc3RlcigmYW1tdmRlY19hdnNfcHJvZmlsZSk7CisJSU5JVF9SRUdfTk9ERV9DT05GSUdTKCJtZWRpYS5kZWNvZGVyIiwgJm1hdnNfbm9kZSwKKwkJIm1hdnMtdjRsIiwgbWF2c19jb25maWdzLCBDT05GSUdfRk9SX1JXKTsKKwl2Y29kZWNfZmVhdHVyZV9yZWdpc3RlcihWRk9STUFUX0FWUywgMSk7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgdm9pZCBfX2V4aXQgYW1tdmRlY19hdnNfZHJpdmVyX3JlbW92ZV9tb2R1bGUodm9pZCkKK3sKKwlwcl9kZWJ1ZygiYW1tdmRlY19hdnMgbW9kdWxlIHJlbW92ZS5cbiIpOworCisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFtbXZkZWNfYXZzX2RyaXZlcik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKK21vZHVsZV9wYXJhbShzdGF0LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3RhdCwgIlxuIGFtdmRlY19hdnMgc3RhdFxuIik7CisqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICptb2R1bGVfcGFyYW0ocnVuX2ZsYWcsIHVpbnQsIDA2NjQpOworICpNT0RVTEVfUEFSTV9ERVNDKHJ1bl9mbGFnLCAiXG4gcnVuX2ZsYWdcbiIpOworICoKKyAqbW9kdWxlX3BhcmFtKHN0ZXBfZmxhZywgdWludCwgMDY2NCk7CisgKk1PRFVMRV9QQVJNX0RFU0Moc3RlcF9mbGFnLCAiXG4gc3RlcF9mbGFnXG4iKTsKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK21vZHVsZV9wYXJhbShzdGVwLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3RlcCwgIlxuIHN0ZXBcbiIpOworCittb2R1bGVfcGFyYW0oZGVidWcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIlxuIGRlYnVnXG4iKTsKKworbW9kdWxlX3BhcmFtKGRlYnVnX21hc2ssIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1Z19tYXNrLCAiXG4gZGVidWdfbWFza1xuIik7CisKK21vZHVsZV9wYXJhbShlcnJvcl9yZWNvdmVyeV9tb2RlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZXJyb3JfcmVjb3ZlcnlfbW9kZSwgIlxuIGVycm9yX3JlY292ZXJ5X21vZGVcbiIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKm1vZHVsZV9wYXJhbShlcnJvcl93YXRjaGRvZ190aHJlc2hvbGQsIHVpbnQsIDA2NjQpOworICpNT0RVTEVfUEFSTV9ERVNDKGVycm9yX3dhdGNoZG9nX3RocmVzaG9sZCwgIlxuIGVycm9yX3dhdGNoZG9nX3RocmVzaG9sZFxuIik7CisgKgorICptb2R1bGVfcGFyYW0oZXJyb3Jfd2F0Y2hkb2dfYnVmX3RocmVzaG9sZCwgdWludCwgMDY2NCk7CisgKk1PRFVMRV9QQVJNX0RFU0MoZXJyb3Jfd2F0Y2hkb2dfYnVmX3RocmVzaG9sZCwKKyAqCQkJIlxuIGVycm9yX3dhdGNoZG9nX2J1Zl90aHJlc2hvbGRcbiIpOworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworLyoKK21vZHVsZV9wYXJhbShwaWNfdHlwZSwgdWludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBpY190eXBlLCAiXG4gYW1kZWNfdmFzIHBpY3R1cmUgdHlwZVxuIik7CisqLworbW9kdWxlX3BhcmFtKHJhZHIsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhyYWRyLCAiXG5yYWRyXG4iKTsKKworbW9kdWxlX3BhcmFtKHJ2YWwsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhydmFsLCAiXG5ydmFsXG4iKTsKKworbW9kdWxlX3BhcmFtKGRiZ19jbWQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkYmdfY21kLCAiXG4gZGJnX2NtZFxuIik7CisKK21vZHVsZV9wYXJhbSh2Zl9idWZfbnVtLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModmZfYnVmX251bSwgIlxudmZfYnVmX251bVxuIik7CisKKy8qCittb2R1bGVfcGFyYW0odmZfYnVmX251bV91c2VkLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModmZfYnVmX251bV91c2VkLCAiXG52Zl9idWZfbnVtX3VzZWRcbiIpOworKi8KK21vZHVsZV9wYXJhbShjYW52YXNfYmFzZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNhbnZhc19iYXNlLCAiXG5jYW52YXNfYmFzZVxuIik7CisKKworbW9kdWxlX3BhcmFtKGZpcm13YXJlX3NlbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZpcm13YXJlX3NlbCwgIlxuIGZpcm13YXJlX3NlbFxuIik7CisKK21vZHVsZV9wYXJhbShkaXNhYmxlX2xvbmdjYWJhY190cmFucywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVfbG9uZ2NhYmFjX3RyYW5zLCAiXG4gZGlzYWJsZV9sb25nY2FiYWNfdHJhbnNcbiIpOworCittb2R1bGVfcGFyYW0oZGVjX2NvbnRyb2wsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkZWNfY29udHJvbCwgIlxuIGFtdmRlY192YXZzIGRlY29kZXIgY29udHJvbFxuIik7CisKK21vZHVsZV9wYXJhbShzdGFydF9kZWNvZGVfYnVmX2xldmVsLCBpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhzdGFydF9kZWNvZGVfYnVmX2xldmVsLAorCQkiXG4gYXZzIHN0YXJ0X2RlY29kZV9idWZfbGV2ZWxcbiIpOworCittb2R1bGVfcGFyYW0oZGVjb2RlX3RpbWVvdXRfdmFsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVjb2RlX3RpbWVvdXRfdmFsLAorCSJcbiBhdnMgZGVjb2RlX3RpbWVvdXRfdmFsXG4iKTsKKworbW9kdWxlX3BhcmFtKGVycm9yX2hhbmRsZV9wb2xpY3ksIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhlcnJvcl9oYW5kbGVfcG9saWN5LAorCSJcbiBhdnMgZXJyb3JfaGFuZGxlX3BvbGljeVxuIik7CisKK21vZHVsZV9wYXJhbShhZ2Fpbl90aHJlc2hvbGQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhhZ2Fpbl90aHJlc2hvbGQsICJcbiBhZ2Fpbl90aHJlc2hvbGRcbiIpOworCittb2R1bGVfcGFyYW0odWRlYnVnX2ZsYWcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh1ZGVidWdfZmxhZywgIlxuIGFtdmRlY19oMjY1IHVkZWJ1Z19mbGFnXG4iKTsKKworbW9kdWxlX3BhcmFtKHVkZWJ1Z19wYXVzZV9wb3MsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh1ZGVidWdfcGF1c2VfcG9zLCAiXG4gdWRlYnVnX3BhdXNlX3Bvc1xuIik7CisKK21vZHVsZV9wYXJhbSh1ZGVidWdfcGF1c2VfdmFsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModWRlYnVnX3BhdXNlX3ZhbCwgIlxuIHVkZWJ1Z19wYXVzZV92YWxcbiIpOworCittb2R1bGVfcGFyYW0odWRlYnVnX3BhdXNlX2RlY29kZV9pZHgsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeCwgIlxuIHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4XG4iKTsKKworbW9kdWxlX3BhcmFtKHVkZWJ1Z19wYXVzZV9pbnNfaWQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh1ZGVidWdfcGF1c2VfaW5zX2lkLCAiXG4gdWRlYnVnX3BhdXNlX2luc19pZFxuIik7CisKK21vZHVsZV9wYXJhbShzdGFydF9kZWNvZGluZ19kZWxheSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0X2RlY29kaW5nX2RlbGF5LCAiXG4gc3RhcnRfZGVjb2RpbmdfZGVsYXlcbiIpOworCittb2R1bGVfcGFyYW0ocHJlX2RlY29kZV9idWZfbGV2ZWwsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHByZV9kZWNvZGVfYnVmX2xldmVsLAorCQkJCSJcbiBhbW12ZGVjX21hdnMgcHJlX2RlY29kZV9idWZfbGV2ZWxcbiIpOworCisKKyNpZmRlZiBERUJVR19NVUxUSV9XSVRIX0FVVE9NT0RFCittb2R1bGVfcGFyYW0oZGVidWdfZmxhZzIsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1Z19mbGFnMiwgIlxuIGRlYnVnX2ZsYWcyXG4iKTsKKyNlbmRpZgorbW9kdWxlX3BhcmFtKGZvcmNlX2ZwcywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2ZwcywgIlxuIGZvcmNlX2Zwc1xuIik7CisKKyNpZmRlZiBERUJVR19NVUxUSV9GUkFNRV9JTlMKK21vZHVsZV9wYXJhbShkZWxheSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlbGF5LCAiXG4gZGVsYXlcbiIpOworCittb2R1bGVfcGFyYW1fYXJyYXkobWF4X3J1bl9jb3VudCwgdWludCwgJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworI2VuZGlmCisKK21vZHVsZV9wYXJhbV9hcnJheShpbnNfdWRlYnVnX2ZsYWcsIHVpbnQsICZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisKK21vZHVsZV9wYXJhbV9hcnJheShtYXhfcHJvY2Vzc190aW1lLCB1aW50LCAmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCittb2R1bGVfcGFyYW1fYXJyYXkocnVuX2NvdW50LCB1aW50LCAmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCittb2R1bGVfcGFyYW1fYXJyYXkobWF4X2dldF9mcmFtZV9pbnRlcnZhbCwgdWludCwKKwkmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCisKK21vZHVsZV9pbml0KGFtbXZkZWNfYXZzX2RyaXZlcl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChhbW12ZGVjX2F2c19kcml2ZXJfcmVtb3ZlX21vZHVsZSk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQU1MT0dJQyBBVlMgVmlkZW8gRGVjb2RlciBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlFpIFdhbmcgPHFpLndhbmdAYW1sb2dpYy5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL2F2c19tdWx0aS9hdnNfbXVsdGkuaCBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlcl92NGwvYXZzX211bHRpL2F2c19tdWx0aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MjJiNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL2F2c19tdWx0aS9hdnNfbXVsdGkuaApAQCAtMCwwICsxLDkwIEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorKiBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqCisqIERlc2NyaXB0aW9uOgorKi8KKyNpZm5kZWYgQVZTX0hfCisjZGVmaW5lIEFWU19IXworCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfQVZTUF9MT05HX0NBQkFDCisjZGVmaW5lIEFWU1BfTE9OR19DQUJBQworI2VuZGlmCisvKiNkZWZpbmUgQklUU1RSRUFNX1JFQURfVE1QX05PX0NBQ0hFKi8KKworI2lmZGVmIEFWU1BfTE9OR19DQUJBQworI2RlZmluZSBNQVhfQ09ERURfRlJBTUVfU0laRSAxNTAwMDAwICAgICAgICAgLyohPCBieXRlcyBmb3Igb25lIGZyYW1lKi8KKyNkZWZpbmUgTE9DQUxfSEVBUF9TSVpFICAgICgxMDI0KjEwMjQqMTApCisvKgorICojZGVmaW5lIE1BWF9DT0RFRF9GUkFNRV9TSVpFICAyNDAwMDAKKyAqI2RlZmluZSBNQVhfQ09ERURfRlJBTUVfU0laRSAgNzAwMDAwCisgKi8KKyNkZWZpbmUgU1ZBX1NUUkVBTV9CVUZfU0laRSAxMDI0CisKK2V4dGVybiB2b2lkICplc193cml0ZV9hZGRyX3ZpcnQ7CitleHRlcm4gZG1hX2FkZHJfdCBlc193cml0ZV9hZGRyX3BoeTsKKworZXh0ZXJuIHZvaWQgKmJpdHN0cmVhbV9yZWFkX3RtcDsKK2V4dGVybiBkbWFfYWRkcl90IGJpdHN0cmVhbV9yZWFkX3RtcF9waHk7CitleHRlcm4gdm9pZCAqYXZzcF9oZWFwX2FkcjsKKworaW50IGF2c19nZXRfZGVidWdfZmxhZyh2b2lkKTsKKworaW50IHByb2Nlc3NfbG9uZ19jYWJhYyh2b2lkKTsKKworLyogYml0IFs2XSAtIHNraXBfbW9kZV9mbGFnCisgKiBiaXQgWzU6NF0gLSBwaWN0dXJlX3R5cGUKKyAqIGJpdCBbM10gLSBwaWN0dXJlX3N0cnVjdHVyZSAoMC1GaWVsZCwgMS1GcmFtZSkKKyAqIGJpdCBbMl0gLSBmaXhlZF9waWN0dXJlX3FwCisgKiBiaXQgWzFdIC0gcHJvZ3Jlc3NpdmVfc2VxdWVuY2UKKyAqIGJpdCBbMF0gLSBhY3RpdmUKKyAqLworI2RlZmluZSBMT05HX0NBQkFDX1JFUSAgICAgICAgQVZfU0NSQVRDSF9LCisjZGVmaW5lIExPTkdfQ0FCQUNfU1JDX0FERFIgICBBVl9TQ1JBVENIX0gKKyNkZWZpbmUgTE9OR19DQUJBQ19ERVNfQUREUiAgIEFWX1NDUkFUQ0hfSQorLyogYml0WzMxOjE2XSAtIHZlcnRpY2FsX3NpemUKKyAqIGJpdFsxNTowXSAtIGhvcml6b250YWxfc2l6ZQorICovCisjZGVmaW5lIExPTkdfQ0FCQUNfUElDX1NJWkUgICBBVl9TQ1JBVENIX0oKKworI2VuZGlmCisKKy8qCisgKiNkZWZpbmUgUEVSRk9STUFOQ0VfREVCVUcKKyAqI2RlZmluZSBEVU1QX0RFQlVHCisgKi8KKyNkZWZpbmUgQVZTX0RFQlVHX1BSSU5UICAgICAgICAgMHgwMQorI2RlZmluZSBBVlNfREVCVUdfT0xEX0VSUk9SX0hBTkRMRQkweDEwCisjZGVmaW5lIEFWU19ERUJVR19VU0VfRlVMTF9TUEVFRCAweDgwCisjZGVmaW5lIEFFQ19EVU1QCQkJCTB4MTAwCisjZGVmaW5lIFNUUkVBTV9JTkZPX0RVTVAJCTB4MjAwCisjZGVmaW5lIFNMSUNFX0lORk9fRFVNUAkJCTB4NDAwCisjZGVmaW5lIE1CX0lORk9fRFVNUAkJCTB4ODAwCisjZGVmaW5lIE1CX05VTV9EVU1QCQkJCTB4MTAwMAorI2RlZmluZSBCTE9DS19OVU1fRFVNUAkJCTB4MjAwMAorI2RlZmluZSBDT0VGRl9EVU1QCQkJCTB4NDAwMAorI2RlZmluZSBFU19EVU1QCQkJCQkweDgwMDAKKyNkZWZpbmUgRFFVQU5UX0RVTVAJCQkJMHgxMDAwMAorI2RlZmluZSBTVFJFQU1fSU5GT19EVU1QX01PUkUgICAweDIwMDAwCisjZGVmaW5lIFNUUkVBTV9JTkZPX0RVTVBfTU9SRTIgIDB4NDAwMDAKKworZXh0ZXJuIHZvaWQgKmVzX3dyaXRlX2FkZHJfdmlydDsKK2V4dGVybiB2b2lkICpiaXRzdHJlYW1fcmVhZF90bXA7CitleHRlcm4gZG1hX2FkZHJfdCBiaXRzdHJlYW1fcmVhZF90bXBfcGh5OworaW50IHJlYWRfYml0c3RyZWFtKHVuc2lnbmVkIGNoYXIgKkJ1ZiwgaW50IHNpemUpOworaW50IHVfdihpbnQgTGVuSW5CaXRzLCBjaGFyICp0cmFjZXN0cmluZyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC9oMjY0X211bHRpL01ha2VmaWxlIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC9oMjY0X211bHRpL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZjJjNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL2gyNjRfbXVsdGkvTWFrZWZpbGUKQEAgLTAsMCArMSwyIEBACitvYmotJChDT05GSUdfQU1MT0dJQ19NRURJQV9WREVDX0gyNjRfTVVMVEkpICs9IGFtdmRlY19taDI2NF92NGwubworYW12ZGVjX21oMjY0X3Y0bC1vYmpzICs9IHZtaDI2NC5vIGgyNjRfZHBiLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlcl92NGwvaDI2NF9tdWx0aS9oMjY0X2RwYi5jIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC9oMjY0X211bHRpL2gyNjRfZHBiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFiMDk3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlcl92NGwvaDI2NF9tdWx0aS9oMjY0X2RwYi5jCkBAIC0wLDAgKzEsNjAzNiBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE3IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyogbW9yZSBkZXRhaWxzLgorKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKgorKiBEZXNjcmlwdGlvbjoKKyovCisjZGVmaW5lIERFQlVHCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy92ZGVjX3JlZy5oPgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvdmRlYy5oIgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvYW12ZGVjLmgiCisKKyNpbmNsdWRlICJoMjY0X2RwYi5oIgorCisjZGVmaW5lIEZSQU1FX05VTV9NQVhfU0laRSAweDEwMDAwCisKKyN1bmRlZiBwcl9pbmZvCisjZGVmaW5lIHByX2luZm8gcHJpbnRrCitpbnQgZHBiX3ByaW50KGludCBpbmRleCwgaW50IGRlYnVnX2ZsYWcsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCWlmICgoKGgyNjRfZGVidWdfZmxhZyAmIGRlYnVnX2ZsYWcpICYmCisJCSgoMSA8PCBpbmRleCkgJiBoMjY0X2RlYnVnX21hc2spKQorCQl8fCAoZGVidWdfZmxhZyA9PSBQUklOVF9GTEFHX0VSUk9SKSkgeworCQl1bnNpZ25lZCBjaGFyICpidWYgPSBremFsbG9jKDUxMiwgR0ZQX0FUT01JQyk7CisJCWludCBsZW4gPSAwOworCQl2YV9saXN0IGFyZ3M7CisKKwkJaWYgKCFidWYpCisJCQlyZXR1cm4gMDsKKworCQl2YV9zdGFydChhcmdzLCBmbXQpOworCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVkOiAiLCBpbmRleCk7CisJCXZzbnByaW50ZihidWYgKyBsZW4sIDUxMi1sZW4sIGZtdCwgYXJncyk7CisJCXByX2RlYnVnKCIlcyIsIGJ1Zik7CisJCXZhX2VuZChhcmdzKTsKKwkJa2ZyZWUoYnVmKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBkcGJfcHJpbnRfY29udChpbnQgaW5kZXgsIGludCBkZWJ1Z19mbGFnLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwlpZiAoKChoMjY0X2RlYnVnX2ZsYWcgJiBkZWJ1Z19mbGFnKSAmJgorCQkoKDEgPDwgaW5kZXgpICYgaDI2NF9kZWJ1Z19tYXNrKSkKKwkJfHwgKGRlYnVnX2ZsYWcgPT0gUFJJTlRfRkxBR19FUlJPUikpIHsKKwkJdW5zaWduZWQgY2hhciAqYnVmID0ga3phbGxvYyg1MTIsIEdGUF9BVE9NSUMpOworCQlpbnQgbGVuID0gMDsKKwkJdmFfbGlzdCBhcmdzOworCisJCWlmICghYnVmKQorCQkJcmV0dXJuIDA7CisKKwkJdmFfc3RhcnQoYXJncywgZm10KTsKKwkJdnNucHJpbnRmKGJ1ZiArIGxlbiwgNTEyLWxlbiwgZm10LCBhcmdzKTsKKwkJcHJfaW5mbygiJXMiLCBidWYpOworCQl2YV9lbmQoYXJncyk7CisJCWtmcmVlKGJ1Zik7CisJfQorCXJldHVybiAwOworfQorCit1bnNpZ25lZCBjaGFyIGRwYl9pc19kZWJ1ZyhpbnQgaW5kZXgsIGludCBkZWJ1Z19mbGFnKQoreworCWlmICgoKGgyNjRfZGVidWdfZmxhZyAmIGRlYnVnX2ZsYWcpICYmCisJCSgoMSA8PCBpbmRleCkgJiBoMjY0X2RlYnVnX21hc2spKQorCQl8fCAoZGVidWdfZmxhZyA9PSBQUklOVF9GTEFHX0VSUk9SKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQ0hFQ0tfVkFMSUQobGlzdF9zaXplLCBtYXJrKSB7XAorCWlmIChsaXN0X3NpemUgPiBNQVhfTElTVF9TSVpFIHx8IGxpc3Rfc2l6ZSA8IDApIHsgXAorCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19FUlJPUiwgXAorCQkiJXMoJWQpOiBsaXN0WHNpemVbJWRdICVkIGlzIGxhcmdlciB0aGFuIG1heCBzaXplXHJcbiIsXAorCQlfX2Z1bmNfXywgX19MSU5FX18sIG1hcmssIGxpc3Rfc2l6ZSk7XAorCQlsaXN0X3NpemUgPSAwOyBcCisJCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnID0gX19MSU5FX187XAorCX0gXAorCX0KKworc3RhdGljIHN0cnVjdCBEZWNSZWZQaWNNYXJraW5nX3MKKwlkdW1teV9kZWNfcmVmX3BpY19tYXJraW5nX2J1ZmZlcgorCVtERUNfUkVGX1BJQ19NQVJLSU5HX0JVRkZFUl9OVU1fTUFYXTsKK3N0YXRpYyBzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlIGR1bW15X3BpYzsKK3N0YXRpYyBzdHJ1Y3QgRnJhbWVTdG9yZSBkdW1teV9mczsKK3N0YXRpYyBzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpnZXRfbmV3X3BpYygKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiwKKwllbnVtIFBpY3R1cmVTdHJ1Y3R1cmUgc3RydWN0dXJlLCB1bnNpZ25lZCBjaGFyIGlzX291dHB1dCk7CisKKworc3RhdGljIHZvaWQgaW5pdF9kdW1teV9mcyh2b2lkKQoreworCWR1bW15X2ZzLmZyYW1lID0gJmR1bW15X3BpYzsKKwlkdW1teV9mcy50b3BfZmllbGQgPSAmZHVtbXlfcGljOworCWR1bW15X2ZzLmJvdHRvbV9maWVsZCA9ICZkdW1teV9waWM7CisKKwlkdW1teV9waWMudG9wX2ZpZWxkID0gJmR1bW15X3BpYzsKKwlkdW1teV9waWMuYm90dG9tX2ZpZWxkID0gJmR1bW15X3BpYzsKKwlkdW1teV9waWMuZnJhbWUgPSAmZHVtbXlfcGljOworCisJZHVtbXlfcGljLmRlY19yZWZfcGljX21hcmtpbmdfYnVmZmVyID0KKwkJJmR1bW15X2RlY19yZWZfcGljX21hcmtpbmdfYnVmZmVyWzBdOworfQorCitlbnVtIHsKKwlMSVNUXzAgPSAwLAorCUxJU1RfMSA9IDEsCisJQklfUFJFRCA9IDIsCisJQklfUFJFRF9MMCA9IDMsCisJQklfUFJFRF9MMSA9IDQKK307CisKK3ZvaWQgcmVmX3BpY19saXN0X3Jlb3JkZXJpbmcoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIsCisJCQkJc3RydWN0IFNsaWNlICpjdXJyU2xpY2UpCit7CisJLyogc3RydWN0IFZpZGVvUGFyYW1ldGVycyAqcF9WaWQgPSBjdXJyU2xpY2UtPnBfVmlkOworCSAqICAgYnl0ZSBkUF9uciA9IGFzc2lnblNFMnBhcnRpdGlvbltjdXJyU2xpY2UtPmRwX21vZGVdW1NFX0hFQURFUl07CisJICogICBEYXRhUGFydGl0aW9uICpwYXJ0aXRpb24gPSAmKGN1cnJTbGljZS0+cGFydEFycltkUF9ucl0pOworCSAqICAgQml0c3RyZWFtICpjdXJyU3RyZWFtID0gcGFydGl0aW9uLT5iaXRzdHJlYW07CisJICovCisJaW50IGksIGosIHZhbDsKKwl1bnNpZ25lZCBzaG9ydCAqcmVvcmRlcl9jbWQgPQorCQkmcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLm1tY28ubDBfcmVvcmRlcl9jbWRbMF07CisJLyogYWxsb2NfcmVmX3BpY19saXN0X3Jlb3JkZXJpbmdfYnVmZmVyKGN1cnJTbGljZSk7ICovCisJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJIiVzXG4iLCBfX2Z1bmNfXyk7CisJaWYgKGN1cnJTbGljZS0+c2xpY2VfdHlwZSAhPSBJX1NMSUNFICYmCisJCWN1cnJTbGljZS0+c2xpY2VfdHlwZSAhPSBTSV9TTElDRSkgeworCQkvKiB2YWwgPSBjdXJyU2xpY2UtPnJlZl9waWNfbGlzdF9yZW9yZGVyaW5nX2ZsYWdbTElTVF8wXSA9CisJCSAqCXJlYWRfdV8xICgiU0g6IHJlZl9waWNfbGlzdF9yZW9yZGVyaW5nX2ZsYWdfbDAiLAorCQkgKgkJY3VyclN0cmVhbSwgJnBfRGVjLT5Vc2VkQml0cyk7CisJCSAqLworCQlpZiAocmVvcmRlcl9jbWRbMF0gIT0gMykgeworCQkJdmFsID0gY3VyclNsaWNlLT4KKwkJCQlyZWZfcGljX2xpc3RfcmVvcmRlcmluZ19mbGFnW0xJU1RfMF0gPSAxOworCQl9IGVsc2UgeworCQkJdmFsID0gY3VyclNsaWNlLT4KKwkJCQlyZWZfcGljX2xpc3RfcmVvcmRlcmluZ19mbGFnW0xJU1RfMF0gPSAwOworCQl9CisJCWlmICh2YWwpIHsKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkiJXMsIHJlZl9waWNfbGlzdF9yZW9yZGVyaW5nX2ZsYWdbTElTVF8wXSBpcyAxXG4iLAorCQkJCV9fZnVuY19fKTsKKworCQkJaiA9IDA7CisJCQlpID0gMDsKKwkJCWRvIHsKKwkJCQl2YWwgPSBjdXJyU2xpY2UtPgorCQkJCW1vZGlmaWNhdGlvbl9vZl9waWNfbnVtc19pZGNbTElTVF8wXVtpXSA9CisJCQkJCSAgICAgIHJlb3JkZXJfY21kW2orK107CisJCQkJLyogcmVhZF91ZV92KAorCQkJCSAqCSJTSDogbW9kaWZpY2F0aW9uX29mX3BpY19udW1zX2lkY19sMCIsCisJCQkJICoJY3VyclN0cmVhbSwgJnBfRGVjLT5Vc2VkQml0cyk7CisJCQkJICovCisJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkJIiVkKCVkKTp2YWwgJXhcbiIsIGksIGosIHZhbCk7CisJCQkJaWYgKGogPj0gNjYpIHsKKwkJCQkJY3VyclNsaWNlLT4KKwkJCQkJcmVmX3BpY19saXN0X3Jlb3JkZXJpbmdfZmxhZ1tMSVNUXzBdID0KKwkJCQkJMDsgLyogYnkgcmFpbiAqLworCQkJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQkJCVBSSU5UX0ZMQUdfRVJST1IsCisJCQkJCQkiJXMgZXJyb3JcbiIsIF9fZnVuY19fKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmICh2YWwgPT0gMCB8fCB2YWwgPT0gMSkgeworCQkJCQljdXJyU2xpY2UtPgorCQkJCQlhYnNfZGlmZl9waWNfbnVtX21pbnVzMVtMSVNUXzBdW2ldID0KKwkJCQkJcmVvcmRlcl9jbWRbaisrXTsKKwkJCQkJLyogcmVhZF91ZV92KCJTSDogIgorCQkJCQkgKiJhYnNfZGlmZl9waWNfbnVtX21pbnVzMV9sMCIsCisJCQkJCSAqY3VyclN0cmVhbSwgJnBfRGVjLT5Vc2VkQml0cyk7CisJCQkJCSAqLworCQkJCX0gZWxzZSB7CisJCQkJCWlmICh2YWwgPT0gMikgeworCQkJCQkJY3VyclNsaWNlLT4KKwkJCQkJCWxvbmdfdGVybV9waWNfaWR4W0xJU1RfMF1baV0gPQorCQkJCQkJcmVvcmRlcl9jbWRbaisrXTsKKwkJCQkJCS8qIHJlYWRfdWVfdigKKwkJCQkJCSAqIlNIOiBsb25nX3Rlcm1fcGljX2lkeF9sMCIsCisJCQkJCQkgKmN1cnJTdHJlYW0sCisJCQkJCQkgKiZwX0RlYy0+VXNlZEJpdHMpOworCQkJCQkJICovCisJCQkJCX0KKwkJCQl9CisJCQkJaSsrOworCQkJCS8qIGFzc2VydCAoaT5jdXJyU2xpY2UtPgorCQkJCSAqCW51bV9yZWZfaWR4X2FjdGl2ZVtMSVNUXzBdKTsKKwkJCQkgKi8KKwkJCQlpZiAoCisKKy8qCisgKgkJCQkgICAgIGk+Y3VyclNsaWNlLT5udW1fcmVmX2lkeF9hY3RpdmVbTElTVF8wXSB8fAorICovCisJCQkJCWkgPj0gUkVPUkRFUklOR19DT01NQU5EX01BWF9TSVpFKSB7CisJCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJCQkJIiVzIGVycm9yICVkICVkXG4iLAorCQkJCQkJX19mdW5jX18sIGksCisJCQkJCQljdXJyU2xpY2UtPgorCQkJCQkJbnVtX3JlZl9pZHhfYWN0aXZlW0xJU1RfMF0pOworCQkJCQljdXJyU2xpY2UtPgorCQkJCQlyZWZfcGljX2xpc3RfcmVvcmRlcmluZ19mbGFnW0xJU1RfMF0gPQorCQkJCQkwOyAvKiBieSByYWluICovCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAoaiA+PSA2NikgeworCQkJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQkJCVBSSU5UX0ZMQUdfRVJST1IsICIlcyBlcnJvclxuIiwKKwkJCQkJCV9fZnVuY19fKTsKKwkJCQkJY3VyclNsaWNlLT4KKwkJCQkJcmVmX3BpY19saXN0X3Jlb3JkZXJpbmdfZmxhZ1tMSVNUXzBdID0KKwkJCQkJMDsgLyogYnkgcmFpbiAqLworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0gd2hpbGUgKHZhbCAhPSAzKTsKKwkJfQorCX0KKworCWlmIChjdXJyU2xpY2UtPnNsaWNlX3R5cGUgPT0gQl9TTElDRSkgeworCQlyZW9yZGVyX2NtZCA9ICZwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubW1jby5sMV9yZW9yZGVyX2NtZFswXTsKKwkJLyogdmFsID0gY3VyclNsaWNlLT5yZWZfcGljX2xpc3RfcmVvcmRlcmluZ19mbGFnW0xJU1RfMV0KKwkJICo9IHJlYWRfdV8xICgiU0g6IHJlZl9waWNfbGlzdF9yZW9yZGVyaW5nX2ZsYWdfbDEiLAorCQkgKmN1cnJTdHJlYW0sCisJCSAqJnBfRGVjLT5Vc2VkQml0cyk7CisJCSAqLworCisJCWlmIChyZW9yZGVyX2NtZFswXSAhPSAzKSB7CisJCQl2YWwgPQorCQkJY3VyclNsaWNlLT5yZWZfcGljX2xpc3RfcmVvcmRlcmluZ19mbGFnW0xJU1RfMV0gPSAxOworCQl9IGVsc2UgeworCQkJdmFsID0KKwkJCWN1cnJTbGljZS0+cmVmX3BpY19saXN0X3Jlb3JkZXJpbmdfZmxhZ1tMSVNUXzFdID0gMDsKKwkJfQorCisJCWlmICh2YWwpIHsKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkiJXMsIHJlZl9waWNfbGlzdF9yZW9yZGVyaW5nX2ZsYWdbTElTVF8xXSBpcyAxXG4iLAorCQkJCV9fZnVuY19fKTsKKworCQkJaiA9IDA7CisJCQlpID0gMDsKKwkJCWRvIHsKKwkJCQl2YWwgPSBjdXJyU2xpY2UtPgorCQkJCW1vZGlmaWNhdGlvbl9vZl9waWNfbnVtc19pZGNbTElTVF8xXVtpXSA9CisJCQkJcmVvcmRlcl9jbWRbaisrXTsKKwkJCQkvKiByZWFkX3VlX3YoCisJCQkJICoiU0g6IG1vZGlmaWNhdGlvbl9vZl9waWNfbnVtc19pZGNfbDEiLAorCQkJCSAqY3VyclN0cmVhbSwKKwkJCQkgKiZwX0RlYy0+VXNlZEJpdHMpOworCQkJCSAqLworCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJCSIlZCglZCk6dmFsICV4XG4iLAorCQkJCQlpLCBqLCB2YWwpOworCQkJCWlmIChqID49IDY2KSB7CisJCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQkJUFJJTlRfRkxBR19FUlJPUiwgIiVzIGVycm9yXG4iLAorCQkJCQkJX19mdW5jX18pOworCQkJCQljdXJyU2xpY2UtPgorCQkJCQlyZWZfcGljX2xpc3RfcmVvcmRlcmluZ19mbGFnW0xJU1RfMV0gPQorCQkJCQkwOyAgLyogYnkgcmFpbiAqLworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKHZhbCA9PSAwIHx8IHZhbCA9PSAxKSB7CisJCQkJCWN1cnJTbGljZS0+CisJCQkJCWFic19kaWZmX3BpY19udW1fbWludXMxW0xJU1RfMV1baV0gPQorCQkJCQkJcmVvcmRlcl9jbWRbaisrXTsKKwkJCQkJLyogcmVhZF91ZV92KAorCQkJCQkgKiJTSDogYWJzX2RpZmZfcGljX251bV9taW51czFfbDEiLAorCQkJCQkgKmN1cnJTdHJlYW0sICZwX0RlYy0+VXNlZEJpdHMpOworCQkJCQkgKi8KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAodmFsID09IDIpIHsKKwkJCQkJCWN1cnJTbGljZS0+CisJCQkJCQlsb25nX3Rlcm1fcGljX2lkeFtMSVNUXzFdW2ldID0KKwkJCQkJCXJlb3JkZXJfY21kW2orK107CisJCQkJCQkvKiByZWFkX3VlX3YoCisJCQkJCQkgKiJTSDogbG9uZ190ZXJtX3BpY19pZHhfbDEiLAorCQkJCQkJICpjdXJyU3RyZWFtLAorCQkJCQkJIComcF9EZWMtPlVzZWRCaXRzKTsKKwkJCQkJCSAqLworCQkJCQl9CisJCQkJfQorCQkJCWkrKzsKKwkJCQkvKiBhc3NlcnQoaT5jdXJyU2xpY2UtPgorCQkJCSAqCW51bV9yZWZfaWR4X2FjdGl2ZVtMSVNUXzFdKTsKKwkJCQkgKi8KKwkJCQlpZiAoCisJCQkJLyppPmN1cnJTbGljZS0+bnVtX3JlZl9pZHhfYWN0aXZlW0xJU1RfMV0gfHwgKi8KKwkJCQkJaSA+PSBSRU9SREVSSU5HX0NPTU1BTkRfTUFYX1NJWkUpIHsKKwkJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJCQkiJXMgZXJyb3IgJWQgJWRcbiIsCisJCQkJCQlfX2Z1bmNfXywgaSwKKwkJCQkJCWN1cnJTbGljZS0+CisJCQkJCQludW1fcmVmX2lkeF9hY3RpdmVbTElTVF8wXSk7CisJCQkJCWN1cnJTbGljZS0+CisJCQkJCXJlZl9waWNfbGlzdF9yZW9yZGVyaW5nX2ZsYWdbTElTVF8xXSA9CisJCQkJCTA7ICAvKiBieSByYWluICovCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAoaiA+PSA2NikgeworCQkJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQkJCVBSSU5UX0ZMQUdfRVJST1IsCisJCQkJCQkiJXMgZXJyb3JcbiIsIF9fZnVuY19fKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSB3aGlsZSAodmFsICE9IDMpOworCQl9CisJfQorCisJLyogc2V0IHJlZmVyZW5jZSBpbmRleCBvZiByZWR1bmRhbnQgc2xpY2VzLiAqLworCS8qCisJICppZiAoY3VyclNsaWNlLT5yZWR1bmRhbnRfcGljX2NudCAmJgorCSAqKGN1cnJTbGljZS0+c2xpY2VfdHlwZSAhPSBJX1NMSUNFKSkKKwkgKnsKKwkgKiAgY3VyclNsaWNlLT5yZWR1bmRhbnRfc2xpY2VfcmVmX2lkeCA9CisJICoJY3VyclNsaWNlLT5hYnNfZGlmZl9waWNfbnVtX21pbnVzMVtMSVNUXzBdWzBdICsgMTsKKwkgKn0KKwkgKi8KK30KKwordm9pZCBzbGljZV9wcmVwYXJlKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLAorCQlzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiLAorCQlzdHJ1Y3QgVmlkZW9QYXJhbWV0ZXJzICpwX1ZpZCwKKwkJc3RydWN0IFNQU1BhcmFtZXRlcnMgKnNwcywgc3RydWN0IFNsaWNlICpwU2xpY2UpCit7CisJaW50IGksIGo7CisJLyogcF9WaWQtPmFjdGl2ZV9zcHMgPSBzcHM7ICovCisJdW5zaWduZWQgc2hvcnQgKm1tY29fY21kID0gJnBfSDI2NF9EcGItPmRwYl9wYXJhbS5tbWNvLm1tY29fY21kWzBdOworCS8qIGZvciBkZWNvZGVfcG9jICovCisJc3BzLT5waWNfb3JkZXJfY250X3R5cGUgPQorCQlwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW1BJQ19PUkRFUl9DTlRfVFlQRV07CisJc3BzLT5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgPQorCQlwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW0xPRzJfTUFYX1BJQ19PUkRFUl9DTlRfTFNCXSAtIDQ7CisJc3BzLT5udW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlID0KKwkJcF9IMjY0X0RwYi0+CisJCWRwYl9wYXJhbS5sLmRhdGFbTlVNX1JFRl9GUkFNRVNfSU5fUElDX09SREVSX0NOVF9DWUNMRV07CisJZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorCQlzcHMtPm9mZnNldF9mb3JfcmVmX2ZyYW1lW2ldID0KKwkJCShzaG9ydCkgcF9IMjY0X0RwYi0+CisJCQlkcGJfcGFyYW0ubW1jby5vZmZzZXRfZm9yX3JlZl9mcmFtZV9iYXNlW2ldOworCXNwcy0+b2Zmc2V0X2Zvcl9ub25fcmVmX3BpYyA9CisJCShzaG9ydCkgcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtPRkZTRVRfRk9SX05PTl9SRUZfUElDXTsKKwlzcHMtPm9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZCA9CisJCShzaG9ydCkgcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YQorCQlbT0ZGU0VUX0ZPUl9UT1BfVE9fQk9UVE9NX0ZJRUxEXTsKKworCXBTbGljZS0+ZnJhbWVfbnVtID0gcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmRwYi5mcmFtZV9udW07CisJcFNsaWNlLT5pZHJfZmxhZyA9CisJCShwX0gyNjRfRHBiLT5kcGJfcGFyYW0uZHBiLk5BTF9pbmZvX21tY28gJiAweDFmKQorCQk9PSA1ID8gMSA6IDA7CisJcFNsaWNlLT5uYWxfcmVmZXJlbmNlX2lkYyA9CisJCShwX0gyNjRfRHBiLT5kcGJfcGFyYW0uZHBiLk5BTF9pbmZvX21tY28gPj4gNSkKKwkJJiAweDM7CisJcFNsaWNlLT5waWNfb3JkZXJfY250X2xzYiA9CisJCXBfSDI2NF9EcGItPmRwYl9wYXJhbS5kcGIucGljX29yZGVyX2NudF9sc2I7CisJcFNsaWNlLT5maWVsZF9waWNfZmxhZyA9IDA7CisJcFNsaWNlLT5ib3R0b21fZmllbGRfZmxhZyA9IDA7CisJcFNsaWNlLT5kZWx0YV9waWNfb3JkZXJfY250X2JvdHRvbSA9IHZhbCgKKwkJcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmRwYi5kZWx0YV9waWNfb3JkZXJfY250X2JvdHRvbSk7CisJcFNsaWNlLT5kZWx0YV9waWNfb3JkZXJfY250WzBdID0gdmFsKAorCQlwX0gyNjRfRHBiLT5kcGJfcGFyYW0uZHBiLmRlbHRhX3BpY19vcmRlcl9jbnRfMCk7CisJcFNsaWNlLT5kZWx0YV9waWNfb3JkZXJfY250WzFdID0gdmFsKAorCQlwX0gyNjRfRHBiLT5kcGJfcGFyYW0uZHBiLmRlbHRhX3BpY19vcmRlcl9jbnRfMSk7CisKKwlwX1ZpZC0+bGFzdF9oYXNfbW1jb181ID0gMDsKKwkvKiBsYXN0IG1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uIGlzIDUgKi8KKwlwX1ZpZC0+bGFzdF9waWNfYm90dG9tX2ZpZWxkID0gMDsKKwlwX1ZpZC0+bWF4X2ZyYW1lX251bSA9IDEgPDwKKwkocF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtMT0cyX01BWF9GUkFNRV9OVU1dKTsKKworCS8qKi8KKwlwU2xpY2UtPnN0cnVjdHVyZSA9IChwX0gyNjRfRHBiLT4KKwkJZHBiX3BhcmFtLmwuZGF0YVtORVdfUElDVFVSRV9TVFJVQ1RVUkVdID09IDMpID8KKwkJRlJBTUUgOiBwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW05FV19QSUNUVVJFX1NUUlVDVFVSRV07CisJaWYgKHBTbGljZS0+c3RydWN0dXJlID09IEZSQU1FKSB7CisJCXBTbGljZS0+ZmllbGRfcGljX2ZsYWcgPSAwOworCQlwU2xpY2UtPmJvdHRvbV9maWVsZF9mbGFnID0gMDsKKwl9IGVsc2UgeworCQlwU2xpY2UtPmZpZWxkX3BpY19mbGFnID0gMTsKKwkJaWYgKHBTbGljZS0+c3RydWN0dXJlID09IFRPUF9GSUVMRCkKKwkJCXBTbGljZS0+Ym90dG9tX2ZpZWxkX2ZsYWcgPSAwOworCQllbHNlCisJCQlwU2xpY2UtPmJvdHRvbV9maWVsZF9mbGFnID0gMTsKKwl9CisJcFNsaWNlLT5waWNfc3RydWN0ID0gcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtQSUNUVVJFX1NUUlVDVF07CisKKwlzcHMtPm51bV9yZWZfZnJhbWVzID0gcF9IMjY0X0RwYi0+CisJCWRwYl9wYXJhbS5sLmRhdGFbTUFYX1JFRkVSRU5DRV9GUkFNRV9OVU1dOworCXNwcy0+cHJvZmlsZV9pZGMgPQorCQkgKHBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbUFJPRklMRV9JRENfTU1DT10gPj4gOCkgJiAweGZmOworCS8qc3BzLT5tYXhfZHBiX3NpemUgPSBwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW01BWF9EUEJfU0laRV07Ki8KKwlpZiAocFNsaWNlLT5pZHJfZmxhZykgeworCQlwU2xpY2UtPmxvbmdfdGVybV9yZWZlcmVuY2VfZmxhZyA9IG1tY29fY21kWzBdICYgMTsKKwkJcFNsaWNlLT5ub19vdXRwdXRfb2ZfcHJpb3JfcGljc19mbGFnID0gKG1tY29fY21kWzBdID4+IDEpICYgMTsKKwkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJIklEUjogbG9uZ190ZXJtX3JlZmVyZW5jZV9mbGFnICVkIG5vX291dHB1dF9vZl9wcmlvcl9waWNzX2ZsYWcgJWRcclxuIiwKKwkJcFNsaWNlLT5sb25nX3Rlcm1fcmVmZXJlbmNlX2ZsYWcsCisJCXBTbGljZS0+bm9fb3V0cHV0X29mX3ByaW9yX3BpY3NfZmxhZyk7CisKKwkJcF9IMjY0X0RwYi0+bG9uZ190ZXJtX3JlZmVyZW5jZV9mbGFnID0gcFNsaWNlLT5sb25nX3Rlcm1fcmVmZXJlbmNlX2ZsYWc7CisKKwkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJImlkciBzZXQgcHJlX2ZyYW1lX251bSglZCkgdG8gZnJhbWVfbnVtICglZClcbiIsCisJCXBfVmlkLT5wcmVfZnJhbWVfbnVtLCBwU2xpY2UtPmZyYW1lX251bSk7CisKKwkJcF9WaWQtPnByZV9mcmFtZV9udW0gPSBwU2xpY2UtPmZyYW1lX251bTsKKwl9IGVsc2UgaWYgKHBfSDI2NF9EcGItPm1EUEIuZmlyc3RfcGljX2RvbmUgPT0gMCkgeworCQkvKiBieSByYWluCisJCSBoYW5kbGUgdGhlIGNhc2Ugd2hlbiBmaXJzdCBzbGljZSBpcyBJIGluc3RlYWQgb2YgSURSCisJCSovCisJCXBfVmlkLT5wcmVfZnJhbWVfbnVtID0gcFNsaWNlLT5mcmFtZV9udW07CisJfQorCS8qIHBTbGljZS0+YWRhcHRpdmVfcmVmX3BpY19idWZmZXJpbmdfZmxhZzsgKi8KKwlzcHMtPmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgPQorCQlwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW0xPRzJfTUFYX0ZSQU1FX05VTV0gLSA0OworCXNwcy0+ZnJhbWVfbnVtX2dhcF9hbGxvd2VkID0gcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtGUkFNRV9OVU1fR0FQX0FMTE9XRURdOworCisJcF9WaWQtPm5vbl9jb25mb3JtaW5nX3N0cmVhbSA9CisJCXBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbTk9OX0NPTkZPUk1JTkdfU1RSRUFNXTsKKwlwX1ZpZC0+cmVjb3ZlcnlfcG9pbnQgPQorCQlwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW1JFQ09WRVJZX1BPSU5UXTsKKwlzd2l0Y2ggKHBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbU0xJQ0VfVFlQRV0pIHsKKwljYXNlIElfU2xpY2U6CisJCXBTbGljZS0+c2xpY2VfdHlwZSA9IElfU0xJQ0U7CisJCWJyZWFrOworCWNhc2UgUF9TbGljZToKKwkJcFNsaWNlLT5zbGljZV90eXBlID0gUF9TTElDRTsKKwkJYnJlYWs7CisJY2FzZSBCX1NsaWNlOgorCQlwU2xpY2UtPnNsaWNlX3R5cGUgPSBCX1NMSUNFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwU2xpY2UtPnNsaWNlX3R5cGUgPSBOVU1fU0xJQ0VfVFlQRVM7CisJCWJyZWFrOworCX0KKworCXBTbGljZS0+bnVtX3JlZl9pZHhfYWN0aXZlW0xJU1RfMF0gPQorCQlwX0gyNjRfRHBiLT5kcGJfcGFyYW0uZHBiLm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgKworCQkxOworCS8qIHBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbUFBTX05VTV9SRUZfSURYX0wwX0FDVElWRV9NSU5VUzFdOyAqLworCXBTbGljZS0+bnVtX3JlZl9pZHhfYWN0aXZlW0xJU1RfMV0gPQorCQlwX0gyNjRfRHBiLT5kcGJfcGFyYW0uZHBiLm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgKworCQkxOworCS8qIHBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbUFBTX05VTV9SRUZfSURYX0wxX0FDVElWRV9NSU5VUzFdOyAqLworCisJcFNsaWNlLT5wX1ZpZCA9IHBfVmlkOworCXBTbGljZS0+cF9EcGIgPSBwX0RwYjsKKwkvKgorCXBfSDI2NF9EcGItPmNvbG9jYXRlZF9idWZfc2l6ZSA9CisJCXBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbRlJBTUVfU0laRV9JTl9NQl0gKiA5NjsqLworCXBTbGljZS0+Zmlyc3RfbWJfaW5fc2xpY2UgPQorCQlwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW0ZJUlNUX01CX0lOX1NMSUNFXTsKKwlwU2xpY2UtPm1vZGVfOHg4X2ZsYWdzID0gcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtNT0RFXzhYOF9GTEFHU107CisJcFNsaWNlLT5waWN0dXJlX3N0cnVjdHVyZV9tbWNvID0KKwkJcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmRwYi5waWN0dXJlX3N0cnVjdHVyZV9tbWNvOworCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJIiVzIHNsaWNlX3R5cGUgaXMgJWQsIG51bV9yZWZfaWR4X2FjdGl2ZVswLDFdPSVkLCVkIG5hbF9yZWZlcmVuY2VfaWRjICVkIHBpYyBzdHJ1Y3QgMHgleChtbWNvIHN0cnUgMHgleClcbiIsCisJCSAgX19mdW5jX18sIHBTbGljZS0+c2xpY2VfdHlwZSwKKwkJICBwU2xpY2UtPm51bV9yZWZfaWR4X2FjdGl2ZVtMSVNUXzBdLAorCQkgIHBTbGljZS0+bnVtX3JlZl9pZHhfYWN0aXZlW0xJU1RfMV0sCisJCSAgcFNsaWNlLT5uYWxfcmVmZXJlbmNlX2lkYywKKwkJICBwU2xpY2UtPnN0cnVjdHVyZSwKKwkJICBwU2xpY2UtPnBpY3R1cmVfc3RydWN0dXJlX21tY28pOworI2lmZGVmIEVSUk9SX0NIRUNLCisJaWYgKHBTbGljZS0+bnVtX3JlZl9pZHhfYWN0aXZlW0xJU1RfMF0gPj0gTUFYX0xJU1RfU0laRSkgeworCQlwU2xpY2UtPm51bV9yZWZfaWR4X2FjdGl2ZVtMSVNUXzBdID0gTUFYX0xJU1RfU0laRSAtIDE7CisJCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnID0gX19MSU5FX187CisJfQorCWlmIChwU2xpY2UtPm51bV9yZWZfaWR4X2FjdGl2ZVtMSVNUXzFdID49IE1BWF9MSVNUX1NJWkUpIHsKKwkJcFNsaWNlLT5udW1fcmVmX2lkeF9hY3RpdmVbTElTVF8xXSA9IE1BWF9MSVNUX1NJWkUgLSAxOworCQlwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyA9IF9fTElORV9fOworCX0KKyNlbmRpZgorCisjaWYgMQorCS8qIGRlY19yZWZfcGljX21hcmtpbmdfYnVmZmVyICovCisJcFNsaWNlLT5hZGFwdGl2ZV9yZWZfcGljX2J1ZmZlcmluZ19mbGFnID0gMDsKKwlpZiAocFNsaWNlLT5uYWxfcmVmZXJlbmNlX2lkYykgeworCQlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IDQ0OyBqKyspIHsKKwkJCXVuc2lnbmVkIHNob3J0IHZhbDsKKwkJCXN0cnVjdCBEZWNSZWZQaWNNYXJraW5nX3MgKnRtcF9kcnBtID0KKwkJCQkmcFNsaWNlLT5kZWNfcmVmX3BpY19tYXJraW5nX2J1ZmZlcltqXTsKKwkJCW1lbXNldCh0bXBfZHJwbSwgMCwgc2l6ZW9mKHN0cnVjdCBEZWNSZWZQaWNNYXJraW5nX3MpKTsKKwkJCXZhbCA9IHRtcF9kcnBtLT4KKwkJCQltZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbiA9CisJCQkJCW1tY29fY21kW2krK107CisJCQl0bXBfZHJwbS0+TmV4dCA9IE5VTEw7CisJCQlpZiAoaiA+IDApIHsKKwkJCQlwU2xpY2UtPgorCQkJCWRlY19yZWZfcGljX21hcmtpbmdfYnVmZmVyW2ogLSAxXS5OZXh0ID0KKwkJCQkJdG1wX2RycG07CisJCQl9CisJCQlpZiAodmFsID09IDAgfHwgaSA+PSA0NCkKKwkJCQlicmVhazsKKwkJCXBTbGljZS0+YWRhcHRpdmVfcmVmX3BpY19idWZmZXJpbmdfZmxhZyA9IDE7CisJCQlpZiAoKHZhbCA9PSAxKSB8fCAodmFsID09IDMpKSB7CisJCQkJdG1wX2RycG0tPmRpZmZlcmVuY2Vfb2ZfcGljX251bXNfbWludXMxID0KKwkJCQkJbW1jb19jbWRbaSsrXTsKKwkJCX0KKwkJCWlmICh2YWwgPT0gMikKKwkJCQl0bXBfZHJwbS0+bG9uZ190ZXJtX3BpY19udW0gPSBtbWNvX2NtZFtpKytdOworCQkJaWYgKGkgPj0gNDQpCisJCQkJYnJlYWs7CisJCQlpZiAoKHZhbCA9PSAzKSB8fCAodmFsID09IDYpKQorCQkJCXRtcF9kcnBtLT5sb25nX3Rlcm1fZnJhbWVfaWR4ID0gbW1jb19jbWRbaSsrXTsKKwkJCWlmICh2YWwgPT0gNCkgeworCQkJCXRtcF9kcnBtLT5tYXhfbG9uZ190ZXJtX2ZyYW1lX2lkeF9wbHVzMSA9CisJCQkJCW1tY29fY21kW2krK107CisJCQl9CisJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJImRlY19yZWZfcGljX21hcmtpbmdfYnVmZmVyWyVkXTpvcGVyYXRpb24gJXggZGlmZl9waWNfbWludXMxICV4IGxvbmdfcGljX251bSAleCBsb25nX2ZyYW1lX2lkeCAleCBtYXhfbG9uZ19mcmFtZV9pZHhfcGx1czEgJXhcbiIsCisJCQkJaiwKKwkJCQl0bXBfZHJwbS0+bWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24sCisJCQkJdG1wX2RycG0tPmRpZmZlcmVuY2Vfb2ZfcGljX251bXNfbWludXMxLAorCQkJCXRtcF9kcnBtLT5sb25nX3Rlcm1fcGljX251bSwKKwkJCQl0bXBfZHJwbS0+bG9uZ190ZXJtX2ZyYW1lX2lkeCwKKwkJCQl0bXBfZHJwbS0+bWF4X2xvbmdfdGVybV9mcmFtZV9pZHhfcGx1czEpOworCQl9CisJfQorCisJcmVmX3BpY19saXN0X3Jlb3JkZXJpbmcocF9IMjY0X0RwYiwgcFNsaWNlKTsKKyNlbmRpZgorCisJLypWVUkqLworCXBfSDI2NF9EcGItPnZ1aV9zdGF0dXMgPSBwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW1ZVSV9TVEFUVVNdOworCXBfSDI2NF9EcGItPmFzcGVjdF9yYXRpb19pZGMgPQorCQlwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW0FTUEVDVF9SQVRJT19JRENdOworCXBfSDI2NF9EcGItPmFzcGVjdF9yYXRpb19zYXJfd2lkdGggPQorCQlwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW0FTUEVDVF9SQVRJT19TQVJfV0lEVEhdOworCXBfSDI2NF9EcGItPmFzcGVjdF9yYXRpb19zYXJfaGVpZ2h0ID0KKwkJcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtBU1BFQ1RfUkFUSU9fU0FSX0hFSUdIVF07CisKKwlwX0gyNjRfRHBiLT5maXhlZF9mcmFtZV9yYXRlX2ZsYWcgPSBwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhWworCQlGSVhFRF9GUkFNRV9SQVRFX0ZMQUddOworCXBfSDI2NF9EcGItPm51bV91bml0c19pbl90aWNrID0KKwkJcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtOVU1fVU5JVFNfSU5fVElDS107CisJcF9IMjY0X0RwYi0+dGltZV9zY2FsZSA9IHBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbVElNRV9TQ0FMRV0gfAorCQkocF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtUSU1FX1NDQUxFICsgMV0gPDwgMTYpOworCisJcF9IMjY0X0RwYi0+Yml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcgPQorCQkocF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtTUFNfRkxBR1MyXSA+PiAzKSAmIDB4MTsKKwlwX0gyNjRfRHBiLT5udW1fcmVvcmRlcl9mcmFtZXMgPQorCQlwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW05VTV9SRU9SREVSX0ZSQU1FU107CisJcF9IMjY0X0RwYi0+bWF4X2RlY19mcmFtZV9idWZmZXJpbmcgPQorCQlwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW01BWF9CVUZGRVJfRlJBTUVdOworCisJLyoqLworCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCSIlcyByZXR1cm5cbiIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIHZvaWQgZGVjb2RlX3BvYyhzdHJ1Y3QgVmlkZW9QYXJhbWV0ZXJzICpwX1ZpZCwgc3RydWN0IFNsaWNlICpwU2xpY2UpCit7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSBjb250YWluZXJfb2YocF9WaWQsCisJCQkJCXN0cnVjdCBoMjY0X2RwYl9zdHJ1LCBtVmlkZW8pOworCXN0cnVjdCBTUFNQYXJhbWV0ZXJzICphY3RpdmVfc3BzID0gcF9WaWQtPmFjdGl2ZV9zcHM7CisJaW50IGk7CisJLyogZm9yIFBPQyBtb2RlIDA6ICovCisJdW5zaWduZWQgaW50IE1heFBpY09yZGVyQ250THNiID0gKDEgPDwKKwkJKGFjdGl2ZV9zcHMtPmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCArIDQpKTsKKworCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQlQUklOVF9GTEFHX0RFQlVHX1BPQywKKwkJIiVzOnBpY19vcmRlcl9jbnRfdHlwZSAlZCwgaWRyX2ZsYWcgJWQgbGFzdF9oYXNfbW1jb181ICVkIGxhc3RfcGljX2JvdHRvbV9maWVsZCAlZCBwaWNfb3JkZXJfY250X2xzYiAlZCBQcmV2UGljT3JkZXJDbnRMc2IgJWRcclxuIiwKKwkJX19mdW5jX18sCisJCWFjdGl2ZV9zcHMtPnBpY19vcmRlcl9jbnRfdHlwZSwKKwkJcFNsaWNlLT5pZHJfZmxhZywKKwkJcF9WaWQtPmxhc3RfaGFzX21tY29fNSwKKwkJcF9WaWQtPmxhc3RfcGljX2JvdHRvbV9maWVsZCwKKwkJcFNsaWNlLT5waWNfb3JkZXJfY250X2xzYiwKKwkJcF9WaWQtPlByZXZQaWNPcmRlckNudExzYgorCSk7CisKKwlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19ERUJVR19QT0MsCisJIiVzOmZpZWxkX3BpY19mbGFnICVkLCBib3R0b21fZmllbGRfZmxhZyAlZCBmcmFtZV9udW0gJWQgUHJldmlvdXNGcmFtZU51bSAlZCBQcmV2aW91c0ZyYW1lTnVtT2Zmc2V0ICVkIGF4X2ZyYW1lX251bSAlZCBudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlICVkIG9mZnNldF9mb3Jfbm9uX3JlZl9waWMgJWRcclxuIiwKKwkJX19mdW5jX18sCisJCXBTbGljZS0+ZmllbGRfcGljX2ZsYWcsCisJCXBTbGljZS0+Ym90dG9tX2ZpZWxkX2ZsYWcsCisJCXBTbGljZS0+ZnJhbWVfbnVtLAorCQlwX1ZpZC0+UHJldmlvdXNGcmFtZU51bSwKKwkJcF9WaWQtPlByZXZpb3VzRnJhbWVOdW1PZmZzZXQsCisJCXBfVmlkLT5tYXhfZnJhbWVfbnVtLAorCQlhY3RpdmVfc3BzLT5udW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlLAorCQlhY3RpdmVfc3BzLT5vZmZzZXRfZm9yX25vbl9yZWZfcGljCisJKTsKKworCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RFQlVHX1BPQywKKwkiJXM6IGRlbHRhX3BpY19vcmRlcl9jbnQgJWQgJWQgbmFsX3JlZmVyZW5jZV9pZGMgJWRcclxuIiwKKwlfX2Z1bmNfXywKKwlwU2xpY2UtPmRlbHRhX3BpY19vcmRlcl9jbnRbMF0sIHBTbGljZS0+ZGVsdGFfcGljX29yZGVyX2NudFsxXSwKKwlwU2xpY2UtPm5hbF9yZWZlcmVuY2VfaWRjCisJKTsKKworCisJc3dpdGNoIChhY3RpdmVfc3BzLT5waWNfb3JkZXJfY250X3R5cGUpIHsKKwljYXNlIDA6IC8qIFBPQyBNT0RFIDAgKi8KKwkJLyogMXN0ICovCisJCWlmIChwU2xpY2UtPmlkcl9mbGFnKSB7CisJCQlwX1ZpZC0+UHJldlBpY09yZGVyQ250TXNiID0gMDsKKwkJCXBfVmlkLT5QcmV2UGljT3JkZXJDbnRMc2IgPSAwOworCQl9IGVsc2UgeworCQkJaWYgKHBfVmlkLT5sYXN0X2hhc19tbWNvXzUpIHsKKwkJCQlpZiAocF9WaWQtPmxhc3RfcGljX2JvdHRvbV9maWVsZCkgeworCQkJCQlwX1ZpZC0+UHJldlBpY09yZGVyQ250TXNiID0gMDsKKwkJCQkJcF9WaWQtPlByZXZQaWNPcmRlckNudExzYiA9IDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJcF9WaWQtPlByZXZQaWNPcmRlckNudE1zYiA9IDA7CisJCQkJCXBfVmlkLT5QcmV2UGljT3JkZXJDbnRMc2IgPQorCQkJCQkJcFNsaWNlLT50b3Bwb2M7CisJCQkJfQorCQkJfQorCQl9CisJCS8qIENhbGN1bGF0ZSB0aGUgTVNCcyBvZiBjdXJyZW50IHBpY3R1cmUgKi8KKwkJaWYgKHBTbGljZS0+cGljX29yZGVyX2NudF9sc2IgPCBwX1ZpZC0+UHJldlBpY09yZGVyQ250THNiICYmCisJCSAgICAocF9WaWQtPlByZXZQaWNPcmRlckNudExzYiAtIHBTbGljZS0+cGljX29yZGVyX2NudF9sc2IpID49CisJCSAgICAoTWF4UGljT3JkZXJDbnRMc2IgLyAyKSkKKwkJCXBTbGljZS0+UGljT3JkZXJDbnRNc2IgPSBwX1ZpZC0+UHJldlBpY09yZGVyQ250TXNiICsKKwkJCQkJTWF4UGljT3JkZXJDbnRMc2I7CisJCWVsc2UgaWYgKHBTbGljZS0+cGljX29yZGVyX2NudF9sc2IgPgorCQkJCXBfVmlkLT5QcmV2UGljT3JkZXJDbnRMc2IgJiYKKwkJCSAocFNsaWNlLT5waWNfb3JkZXJfY250X2xzYiAtCisJCQkJcF9WaWQtPlByZXZQaWNPcmRlckNudExzYikgID4KKwkJCQkgKE1heFBpY09yZGVyQ250THNiIC8gMikpCisJCQlwU2xpY2UtPlBpY09yZGVyQ250TXNiID0gcF9WaWQtPlByZXZQaWNPcmRlckNudE1zYiAtCisJCQkJCU1heFBpY09yZGVyQ250THNiOworCQllbHNlCisJCQlwU2xpY2UtPlBpY09yZGVyQ250TXNiID0gcF9WaWQtPlByZXZQaWNPcmRlckNudE1zYjsKKworCQkvKiAybmQgKi8KKwkJaWYgKHBTbGljZS0+ZmllbGRfcGljX2ZsYWcgPT0gMCkgeworCQkJLyogZnJhbWUgcGl4ICovCisJCQlwU2xpY2UtPnRvcHBvYyA9IHBTbGljZS0+UGljT3JkZXJDbnRNc2IgKworCQkJCQlwU2xpY2UtPnBpY19vcmRlcl9jbnRfbHNiOworCQkJcFNsaWNlLT5ib3R0b21wb2MgPSBwU2xpY2UtPnRvcHBvYyArCisJCQkJCXBTbGljZS0+ZGVsdGFfcGljX29yZGVyX2NudF9ib3R0b207CisJCQlwU2xpY2UtPlRoaXNQT0MgPSBwU2xpY2UtPmZyYW1lcG9jID0KKwkJCQkocFNsaWNlLT50b3Bwb2MgPCBwU2xpY2UtPmJvdHRvbXBvYykgPworCQkJCSBwU2xpY2UtPnRvcHBvYyA6IHBTbGljZS0+Ym90dG9tcG9jOworCQkJCQkvKiBQT0MyMDAzMDEgKi8KKwkJfSBlbHNlIGlmIChwU2xpY2UtPmJvdHRvbV9maWVsZF9mbGFnID09IDApIHsKKwkJCS8qIHRvcCBmaWVsZCAqLworCQkJcFNsaWNlLT5UaGlzUE9DID0gcFNsaWNlLT50b3Bwb2MgPQorCQkJCXBTbGljZS0+UGljT3JkZXJDbnRNc2IgKworCQkJCXBTbGljZS0+cGljX29yZGVyX2NudF9sc2I7CisJCX0gZWxzZSB7CisJCQkvKiBib3R0b20gZmllbGQgKi8KKwkJCXBTbGljZS0+VGhpc1BPQyA9IHBTbGljZS0+Ym90dG9tcG9jID0KKwkJCQlwU2xpY2UtPlBpY09yZGVyQ250TXNiICsKKwkJCQlwU2xpY2UtPnBpY19vcmRlcl9jbnRfbHNiOworCQl9CisJCXBTbGljZS0+ZnJhbWVwb2MgPSBwU2xpY2UtPlRoaXNQT0M7CisKKwkJcF9WaWQtPlRoaXNQT0MgPSBwU2xpY2UtPlRoaXNQT0M7CisKKwkJLyogaWYgKCBwU2xpY2UtPmZyYW1lX251bSAhPSBwX1ZpZC0+UHJldmlvdXNGcmFtZU51bSkKKwkJICoJU2VlbXMgcmVkdW5kYW50CisJCSAqLworCQlwX1ZpZC0+UHJldmlvdXNGcmFtZU51bSA9IHBTbGljZS0+ZnJhbWVfbnVtOworCisJCWlmIChwU2xpY2UtPm5hbF9yZWZlcmVuY2VfaWRjKSB7CisJCQlwX1ZpZC0+UHJldlBpY09yZGVyQ250THNiID0gcFNsaWNlLT5waWNfb3JkZXJfY250X2xzYjsKKwkJCXBfVmlkLT5QcmV2UGljT3JkZXJDbnRNc2IgPSBwU2xpY2UtPlBpY09yZGVyQ250TXNiOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIDE6IC8qIFBPQyBNT0RFIDEgKi8KKwkJLyogMXN0ICovCisJCWlmIChwU2xpY2UtPmlkcl9mbGFnKSB7CisJCQlwX1ZpZC0+RnJhbWVOdW1PZmZzZXQgPSAwOyAgIC8qIGZpcnN0IHBpeCBvZiBJRFJHT1AgKi8KKwkJCWlmIChwU2xpY2UtPmZyYW1lX251bSkKKwkJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJCQkiZnJhbWVfbnVtIG5vdCBlcXVhbCB0byB6ZXJvIGluIElEUiBwaWN0dXJlICVkIiwKKwkJCQkJLTEwMjApOworCQl9IGVsc2UgeworCQkJaWYgKHBfVmlkLT5sYXN0X2hhc19tbWNvXzUpIHsKKwkJCQlwX1ZpZC0+UHJldmlvdXNGcmFtZU51bU9mZnNldCA9IDA7CisJCQkJcF9WaWQtPlByZXZpb3VzRnJhbWVOdW0gPSAwOworCQkJfQorCQkJaWYgKHBTbGljZS0+ZnJhbWVfbnVtIDwgcF9WaWQtPlByZXZpb3VzRnJhbWVOdW0pIHsKKwkJCQkvKiBub3QgZmlyc3QgcGl4IG9mIElEUkdPUCAqLworCQkJCXBfVmlkLT5GcmFtZU51bU9mZnNldCA9CisJCQkJCXBfVmlkLT5QcmV2aW91c0ZyYW1lTnVtT2Zmc2V0ICsKKwkJCQkJCXBfVmlkLT5tYXhfZnJhbWVfbnVtOworCQkJfSBlbHNlIHsKKwkJCQlwX1ZpZC0+RnJhbWVOdW1PZmZzZXQgPQorCQkJCQlwX1ZpZC0+UHJldmlvdXNGcmFtZU51bU9mZnNldDsKKwkJCX0KKwkJfQorCisJCS8qIDJuZCAqLworCQlpZiAoYWN0aXZlX3Nwcy0+bnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSkKKwkJCXBTbGljZS0+QWJzRnJhbWVOdW0gPQorCQkJCXBfVmlkLT5GcmFtZU51bU9mZnNldCArIHBTbGljZS0+ZnJhbWVfbnVtOworCQllbHNlCisJCQlwU2xpY2UtPkFic0ZyYW1lTnVtID0gMDsKKwkJaWYgKCghcFNsaWNlLT5uYWxfcmVmZXJlbmNlX2lkYykgJiYgcFNsaWNlLT5BYnNGcmFtZU51bSA+IDApCisJCQlwU2xpY2UtPkFic0ZyYW1lTnVtLS07CisKKwkJLyogM3JkICovCisJCXBfVmlkLT5FeHBlY3RlZERlbHRhUGVyUGljT3JkZXJDbnRDeWNsZSA9IDA7CisKKwkJaWYgKGFjdGl2ZV9zcHMtPm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUpCisJCQlmb3IgKGkgPSAwOyBpIDwgKGludCkgYWN0aXZlX3Nwcy0+CisJCQkJbnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZTsgaSsrKSB7CisJCQkJcF9WaWQtPkV4cGVjdGVkRGVsdGFQZXJQaWNPcmRlckNudEN5Y2xlICs9CisJCQkJCWFjdGl2ZV9zcHMtPm9mZnNldF9mb3JfcmVmX2ZyYW1lW2ldOworCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQlQUklOVF9GTEFHX0RFQlVHX1BPQywKKwkJCQkJIiVzOiBvZmZzZXRfZm9yX3JlZl9mcmFtZSAlZFxyXG4iLAorCQkJCQlfX2Z1bmNfXywKKwkJCQkJYWN0aXZlX3Nwcy0+CisJCQkJCW9mZnNldF9mb3JfcmVmX2ZyYW1lW2ldKTsKKwkJCX0KKworCQlpZiAocFNsaWNlLT5BYnNGcmFtZU51bSkgeworCQkJcF9WaWQtPlBpY09yZGVyQ250Q3ljbGVDbnQgPQorCQkJCShwU2xpY2UtPkFic0ZyYW1lTnVtIC0gMSkgLworCQkJCWFjdGl2ZV9zcHMtPgorCQkJCW51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGU7CisJCQlwX1ZpZC0+RnJhbWVOdW1JblBpY09yZGVyQ250Q3ljbGUgPQorCQkJCShwU2xpY2UtPkFic0ZyYW1lTnVtIC0gMSkgJQorCQkJCWFjdGl2ZV9zcHMtPgorCQkJCW51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGU7CisJCQlwX1ZpZC0+RXhwZWN0ZWRQaWNPcmRlckNudCA9CisJCQkJcF9WaWQtPlBpY09yZGVyQ250Q3ljbGVDbnQgKgorCQkJCXBfVmlkLT5FeHBlY3RlZERlbHRhUGVyUGljT3JkZXJDbnRDeWNsZTsKKwkJCWZvciAoaSA9IDA7IGkgPD0gKGludClwX1ZpZC0+CisJCQkJRnJhbWVOdW1JblBpY09yZGVyQ250Q3ljbGU7IGkrKykgeworCQkJCXBfVmlkLT5FeHBlY3RlZFBpY09yZGVyQ250ICs9CisJCQkJCWFjdGl2ZV9zcHMtPm9mZnNldF9mb3JfcmVmX2ZyYW1lW2ldOworCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQlQUklOVF9GTEFHX0RFQlVHX1BPQywKKwkJCQkJIiVzOiBvZmZzZXRfZm9yX3JlZl9mcmFtZSAlZFxyXG4iLAorCQkJCQlfX2Z1bmNfXywKKwkJCQkJYWN0aXZlX3Nwcy0+CisJCQkJCW9mZnNldF9mb3JfcmVmX2ZyYW1lW2ldKTsKKwkJCX0KKwkJfSBlbHNlCisJCQlwX1ZpZC0+RXhwZWN0ZWRQaWNPcmRlckNudCA9IDA7CisKKwkJaWYgKCFwU2xpY2UtPm5hbF9yZWZlcmVuY2VfaWRjKQorCQkJcF9WaWQtPkV4cGVjdGVkUGljT3JkZXJDbnQgKz0KKwkJCQlhY3RpdmVfc3BzLT5vZmZzZXRfZm9yX25vbl9yZWZfcGljOworCisJCWlmIChwU2xpY2UtPmZpZWxkX3BpY19mbGFnID09IDApIHsKKwkJCS8qIGZyYW1lIHBpeCAqLworCQkJcFNsaWNlLT50b3Bwb2MgPSBwX1ZpZC0+RXhwZWN0ZWRQaWNPcmRlckNudCArCisJCQkJcFNsaWNlLT5kZWx0YV9waWNfb3JkZXJfY250WzBdOworCQkJcFNsaWNlLT5ib3R0b21wb2MgPSBwU2xpY2UtPnRvcHBvYyArCisJCQkJYWN0aXZlX3Nwcy0+b2Zmc2V0X2Zvcl90b3BfdG9fYm90dG9tX2ZpZWxkICsKKwkJCQlwU2xpY2UtPmRlbHRhX3BpY19vcmRlcl9jbnRbMV07CisJCQlwU2xpY2UtPlRoaXNQT0MgPSBwU2xpY2UtPmZyYW1lcG9jID0KKwkJCQkocFNsaWNlLT50b3Bwb2MgPCBwU2xpY2UtPmJvdHRvbXBvYykgPworCQkJCXBTbGljZS0+dG9wcG9jIDogcFNsaWNlLT5ib3R0b21wb2M7CisJCQkJLyogUE9DMjAwMzAxICovCisJCX0gZWxzZSBpZiAocFNsaWNlLT5ib3R0b21fZmllbGRfZmxhZyA9PSAwKSB7CisJCQkvKiB0b3AgZmllbGQgKi8KKwkJCXBTbGljZS0+VGhpc1BPQyA9IHBTbGljZS0+dG9wcG9jID0KKwkJCQlwX1ZpZC0+RXhwZWN0ZWRQaWNPcmRlckNudCArCisJCQkJcFNsaWNlLT5kZWx0YV9waWNfb3JkZXJfY250WzBdOworCQl9IGVsc2UgeworCQkJLyogYm90dG9tIGZpZWxkICovCisJCQlwU2xpY2UtPlRoaXNQT0MgPSBwU2xpY2UtPmJvdHRvbXBvYyA9CisJCQkJcF9WaWQtPkV4cGVjdGVkUGljT3JkZXJDbnQgKworCQkJCWFjdGl2ZV9zcHMtPm9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZCArCisJCQkJcFNsaWNlLT5kZWx0YV9waWNfb3JkZXJfY250WzBdOworCQl9CisJCXBTbGljZS0+ZnJhbWVwb2MgPSBwU2xpY2UtPlRoaXNQT0M7CisKKwkJcF9WaWQtPlByZXZpb3VzRnJhbWVOdW0gPSBwU2xpY2UtPmZyYW1lX251bTsKKwkJcF9WaWQtPlByZXZpb3VzRnJhbWVOdW1PZmZzZXQgPSBwX1ZpZC0+RnJhbWVOdW1PZmZzZXQ7CisKKwkJYnJlYWs7CisKKworCWNhc2UgMjogLyogUE9DIE1PREUgMiAqLworCQlpZiAocFNsaWNlLT5pZHJfZmxhZykgeyAvKiBJRFIgcGljdHVyZSAqLworCQkJcF9WaWQtPkZyYW1lTnVtT2Zmc2V0ID0gMDsgICAvKiBmaXJzdCBwaXggb2YgSURSR09QICovCisJCQlwU2xpY2UtPlRoaXNQT0MgPSBwU2xpY2UtPmZyYW1lcG9jID0gcFNsaWNlLT50b3Bwb2MgPQorCQkJCXBTbGljZS0+Ym90dG9tcG9jID0gMDsKKwkJCWlmIChwU2xpY2UtPmZyYW1lX251bSkKKwkJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJCQkiZnJhbWVfbnVtIG5vdCBlcXVhbCB0byB6ZXJvIGluIElEUiBwaWN0dXJlICVkIiwKKwkJCQkJLTEwMjApOworCQl9IGVsc2UgeworCQkJaWYgKHBfVmlkLT5sYXN0X2hhc19tbWNvXzUpIHsKKwkJCQlwX1ZpZC0+UHJldmlvdXNGcmFtZU51bSA9IDA7CisJCQkJcF9WaWQtPlByZXZpb3VzRnJhbWVOdW1PZmZzZXQgPSAwOworCQkJfQorCQkJaWYgKHBTbGljZS0+ZnJhbWVfbnVtIDwgcF9WaWQtPlByZXZpb3VzRnJhbWVOdW0pCisJCQkJcF9WaWQtPkZyYW1lTnVtT2Zmc2V0ID0KKwkJCQkJcF9WaWQtPlByZXZpb3VzRnJhbWVOdW1PZmZzZXQgKworCQkJCQlwX1ZpZC0+bWF4X2ZyYW1lX251bTsKKwkJCWVsc2UKKwkJCQlwX1ZpZC0+RnJhbWVOdW1PZmZzZXQgPQorCQkJCQlwX1ZpZC0+UHJldmlvdXNGcmFtZU51bU9mZnNldDsKKworCQkJcFNsaWNlLT5BYnNGcmFtZU51bSA9IHBfVmlkLT5GcmFtZU51bU9mZnNldCArCisJCQkJcFNsaWNlLT5mcmFtZV9udW07CisJCQlpZiAoIXBTbGljZS0+bmFsX3JlZmVyZW5jZV9pZGMpCisJCQkJcFNsaWNlLT5UaGlzUE9DID0KKwkJCQkJKDIgKiBwU2xpY2UtPkFic0ZyYW1lTnVtIC0gMSk7CisJCQllbHNlCisJCQkJcFNsaWNlLT5UaGlzUE9DID0gKDIgKiBwU2xpY2UtPkFic0ZyYW1lTnVtKTsKKworCQkJaWYgKHBTbGljZS0+ZmllbGRfcGljX2ZsYWcgPT0gMCkKKwkJCQlwU2xpY2UtPnRvcHBvYyA9IHBTbGljZS0+Ym90dG9tcG9jID0KKwkJCQkJcFNsaWNlLT5mcmFtZXBvYyA9IHBTbGljZS0+VGhpc1BPQzsKKwkJCWVsc2UgaWYgKHBTbGljZS0+Ym90dG9tX2ZpZWxkX2ZsYWcgPT0gMCkKKwkJCQlwU2xpY2UtPnRvcHBvYyA9IHBTbGljZS0+ZnJhbWVwb2MgPQorCQkJCXBTbGljZS0+VGhpc1BPQzsKKwkJCWVsc2UKKwkJCQlwU2xpY2UtPmJvdHRvbXBvYyA9IHBTbGljZS0+ZnJhbWVwb2MgPQorCQkJCXBTbGljZS0+VGhpc1BPQzsKKwkJfQorCisJCXBfVmlkLT5QcmV2aW91c0ZyYW1lTnVtID0gcFNsaWNlLT5mcmFtZV9udW07CisJCXBfVmlkLT5QcmV2aW91c0ZyYW1lTnVtT2Zmc2V0ID0gcF9WaWQtPkZyYW1lTnVtT2Zmc2V0OworCQlicmVhazsKKworCisJZGVmYXVsdDoKKwkJLyogZXJyb3IgbXVzdCBvY2N1cnMgKi8KKwkJLyogYXNzZXJ0KCAxPT0wICk7ICovCisJCWJyZWFrOworCX0KK30KKwordm9pZCBmaWxsX2ZyYW1lX251bV9nYXAoc3RydWN0IFZpZGVvUGFyYW1ldGVycyAqcF9WaWQsIHN0cnVjdCBTbGljZSAqY3VyclNsaWNlKQoreworCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0KKwkJY29udGFpbmVyX29mKHBfVmlkLCBzdHJ1Y3QgaDI2NF9kcGJfc3RydSwgbVZpZGVvKTsKKwlzdHJ1Y3QgU1BTUGFyYW1ldGVycyAqYWN0aXZlX3NwcyA9IHBfVmlkLT5hY3RpdmVfc3BzOworCWludCBDdXJyRnJhbWVOdW07CisJaW50IFVudXNlZFNob3J0VGVybUZyYW1lTnVtOworCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnBpY3R1cmUgPSBOVUxMOworCWludCB0bXAxID0gY3VyclNsaWNlLT5kZWx0YV9waWNfb3JkZXJfY250WzBdOworCWludCB0bXAyID0gY3VyclNsaWNlLT5kZWx0YV9waWNfb3JkZXJfY250WzFdOworCWludCByZXQ7CisKKwljdXJyU2xpY2UtPmRlbHRhX3BpY19vcmRlcl9jbnRbMF0gPQorCQljdXJyU2xpY2UtPmRlbHRhX3BpY19vcmRlcl9jbnRbMV0gPSAwOworCisJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJIkEgZ2FwIGluIGZyYW1lIG51bWJlciBpcyBmb3VuZCwgdHJ5IHRvIGZpbGwgaXQuKHByZV9mcmFtZV9udW0gJWQsIG1heF9mcmFtZV9udW0gJWRcbiIsCisJCXBfVmlkLT5wcmVfZnJhbWVfbnVtLCBwX1ZpZC0+bWF4X2ZyYW1lX251bQorCSk7CisKKwlVbnVzZWRTaG9ydFRlcm1GcmFtZU51bSA9IChwX1ZpZC0+cHJlX2ZyYW1lX251bSArIDEpCisJCSUgcF9WaWQtPm1heF9mcmFtZV9udW07CisJQ3VyckZyYW1lTnVtID0gY3VyclNsaWNlLT5mcmFtZV9udW07IC8qcF9WaWQtPmZyYW1lX251bTsqLworCisJd2hpbGUgKEN1cnJGcmFtZU51bSAhPSBVbnVzZWRTaG9ydFRlcm1GcmFtZU51bSkgeworCQkvKnByX2VycigiQ3VyckZyYW1lTnVtID0gJWQsIFVudXNlZFNob3J0VGVybUZyYW1lTnVtID0gJWRcbiIsIEN1cnJGcmFtZU51bSwgVW51c2VkU2hvcnRUZXJtRnJhbWVOdW0pOyovCisJCS8qcGljdHVyZSA9IGFsbG9jX3N0b3JhYmxlX3BpY3R1cmUKKwkJICoocF9WaWQsIEZSQU1FLCBwX1ZpZC0+d2lkdGgsCisJCSAqcF9WaWQtPmhlaWdodCwKKwkJICpwX1ZpZC0+d2lkdGhfY3IsCisJCSAqcF9WaWQtPmhlaWdodF9jciwgMSk7CisJCSAqLworCQlwaWN0dXJlID0gZ2V0X25ld19waWMocF9IMjY0X0RwYiwKKwkJCXBfSDI2NF9EcGItPm1TbGljZS5zdHJ1Y3R1cmUsCisJCS8qcF9WaWQtPndpZHRoLCBwX1ZpZC0+aGVpZ2h0LAorCQkgKnBfVmlkLT53aWR0aF9jciwKKwkJcF9WaWQtPmhlaWdodF9jciwqLyAxKTsKKworCQlpZiAocGljdHVyZSA9PSBOVUxMKSB7CisJCQlzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiID0gJnBfSDI2NF9EcGItPm1EUEI7CisKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRVJST1IsCisJCQkJIiVzIEVycm9yOiBnZXRfbmV3X3BpYyByZXR1cm4gTlVMTFxyXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCS8qaDI2NF9kZWJ1Z19mbGFnIHw9IFBSSU5UX0ZMQUdfRFVNUF9EUEI7Ki8KKwkJCWR1bXBfZHBiKHBfRHBiLCAwKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXBpY3R1cmUtPmNvbG9jYXRlZF9idWZfaW5kZXggPSAtMTsKKwkJcGljdHVyZS0+YnVmX3NwZWNfbnVtID0gLTE7CisJCXBpY3R1cmUtPmJ1Zl9zcGVjX2lzX2FsbG9jZWQgPSAwOworCisJCXBpY3R1cmUtPmNvZGVkX2ZyYW1lID0gMTsKKwkJcGljdHVyZS0+cGljX251bSA9IFVudXNlZFNob3J0VGVybUZyYW1lTnVtOworCQlwaWN0dXJlLT5mcmFtZV9udW0gPSBVbnVzZWRTaG9ydFRlcm1GcmFtZU51bTsKKwkJcGljdHVyZS0+bm9uX2V4aXN0aW5nID0gMTsKKwkJcGljdHVyZS0+aXNfb3V0cHV0ID0gMTsKKwkJcGljdHVyZS0+dXNlZF9mb3JfcmVmZXJlbmNlID0gMTsKKwkJcGljdHVyZS0+YWRhcHRpdmVfcmVmX3BpY19idWZmZXJpbmdfZmxhZyA9IDA7CisJCSNpZiAoTVZDX0VYVEVOU0lPTl9FTkFCTEUpCisJCXBpY3R1cmUtPnZpZXdfaWQgPSBjdXJyU2xpY2UtPnZpZXdfaWQ7CisJCSNlbmRpZgorCisJCWN1cnJTbGljZS0+ZnJhbWVfbnVtID0gVW51c2VkU2hvcnRUZXJtRnJhbWVOdW07CisJCWlmIChhY3RpdmVfc3BzLT5waWNfb3JkZXJfY250X3R5cGUgIT0gMCkgeworCQkJLypkZWNvZGVfcG9jKHBfVmlkLCBwX1ZpZC0+cHBTbGljZUxpc3RbMF0pOyovCisJCQlkZWNvZGVfcG9jKCZwX0gyNjRfRHBiLT5tVmlkZW8sICZwX0gyNjRfRHBiLT5tU2xpY2UpOworCQl9CisJCXBpY3R1cmUtPnRvcF9wb2MgICAgPSBjdXJyU2xpY2UtPnRvcHBvYzsKKwkJcGljdHVyZS0+Ym90dG9tX3BvYyA9IGN1cnJTbGljZS0+Ym90dG9tcG9jOworCQlwaWN0dXJlLT5mcmFtZV9wb2MgID0gY3VyclNsaWNlLT5mcmFtZXBvYzsKKwkJcGljdHVyZS0+cG9jICAgICAgICA9IGN1cnJTbGljZS0+ZnJhbWVwb2M7CisKKwkJcmV0ID0gc3RvcmVfcGljdHVyZV9pbl9kcGIocF9IMjY0X0RwYiwgcGljdHVyZSwgMCk7CisJCWlmIChyZXQgPT0gLTEpIHsKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRVJST1IsCisJCQkJIiVzIEVycm9yOiBzdG9yZV9waWN0dXJlX2luX2RwYiBmYWlsZWQsIGJyZWFrXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJlbGVhc2VfcGljdHVyZShwX0gyNjRfRHBiLCBwaWN0dXJlKTsKKwkJCWJ1Zm1ncl9mb3JjZV9yZWNvdmVyKHBfSDI2NF9EcGIpOworCQkJcmV0dXJuOworCQl9IGVsc2UgaWYgKHJldCA9PSAtMikKKwkJCXJlbGVhc2VfcGljdHVyZShwX0gyNjRfRHBiLCBwaWN0dXJlKTsKKworCQlwaWN0dXJlID0gTlVMTDsKKwkJcF9WaWQtPnByZV9mcmFtZV9udW0gPSBVbnVzZWRTaG9ydFRlcm1GcmFtZU51bTsKKwkJVW51c2VkU2hvcnRUZXJtRnJhbWVOdW0gPQorCQkJKFVudXNlZFNob3J0VGVybUZyYW1lTnVtICsgMSkgJQorCQkJcF9WaWQtPm1heF9mcmFtZV9udW07CisJfQorCWN1cnJTbGljZS0+ZGVsdGFfcGljX29yZGVyX2NudFswXSA9IHRtcDE7CisJY3VyclNsaWNlLT5kZWx0YV9waWNfb3JkZXJfY250WzFdID0gdG1wMjsKKwljdXJyU2xpY2UtPmZyYW1lX251bSA9IEN1cnJGcmFtZU51bTsKK30KKwordm9pZCBkcGJfaW5pdF9nbG9iYWwoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIsCisJaW50IGlkLCBpbnQgYWN0dWFsX2RwYl9zaXplLCBpbnQgbWF4X3JlZmVyZW5jZV9zaXplKQoreworCWludCBpOworCisJaW5pdF9kdW1teV9mcygpOworCisJbWVtc2V0KCZwX0gyNjRfRHBiLT5tRFBCLCAwLCBzaXplb2Yoc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyKSk7CisKKwltZW1zZXQoJnBfSDI2NF9EcGItPm1TbGljZSwgMCwgc2l6ZW9mKHN0cnVjdCBTbGljZSkpOworCW1lbXNldCgmcF9IMjY0X0RwYi0+bVZpZGVvLCAwLCBzaXplb2Yoc3RydWN0IFZpZGVvUGFyYW1ldGVycykpOworCW1lbXNldCgmcF9IMjY0X0RwYi0+bVNQUywgMCwgc2l6ZW9mKHN0cnVjdCBTUFNQYXJhbWV0ZXJzKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRFBCX1NJWkVfTUFYOyBpKyspIHsKKwkJbWVtc2V0KCYocF9IMjY0X0RwYi0+bUZyYW1lU3RvcmVbaV0pLCAwLAorCQkJc2l6ZW9mKHN0cnVjdCBGcmFtZVN0b3JlKSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE1BWF9QSUNfQlVGX05VTTsgaSsrKSB7CisJCW1lbXNldCgmKHBfSDI2NF9EcGItPm1fUElDW2ldKSwgMCwKKwkJCXNpemVvZihzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlKSk7CisJCXBfSDI2NF9EcGItPm1fUElDW2ldLmluZGV4ID0gaTsKKwl9CisJcF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCA9IGlkOworCisgICAgLyogbWFrZSBzdXJlIGRwYl9pbml0X2dsb2JhbAorICAgICAqY2FuIGJlIGNhbGxlZCBkdXJpbmcgZGVjb2RpbmcKKyAgICAgKihpbiBERUNPREVfU1RBVEVfSURMRSBvciBERUNPREVfU1RBVEVfUkVBRFkgc3RhdGUpCisgICAgICovCisJcF9IMjY0X0RwYi0+bURQQi5zaXplID0gYWN0dWFsX2RwYl9zaXplOworCXBfSDI2NF9EcGItPm1heF9yZWZlcmVuY2Vfc2l6ZSA9IG1heF9yZWZlcmVuY2Vfc2l6ZTsKKwlwX0gyNjRfRHBiLT5wb2NfZXZlbl9vZGRfZmxhZyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfcGljdHVyZShzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiwKKwkJCSBzdHJ1Y3QgU2xpY2UgKmN1cnJTbGljZSwKKwkJCSBzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpkZWNfcGljdHVyZSkKK3sKKwkvKiBzdHJ1Y3QgVmlkZW9QYXJhbWV0ZXJzICpwX1ZpZCA9ICYocF9IMjY0X0RwYi0+bVZpZGVvKTsgKi8KKwlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkgICIlcyBkZWNfcGljdHVyZSAlcFxuIiwgX19mdW5jX18sIGRlY19waWN0dXJlKTsKKwlkZWNfcGljdHVyZS0+dG9wX3BvYyA9IGN1cnJTbGljZS0+dG9wcG9jOworCWRlY19waWN0dXJlLT5ib3R0b21fcG9jID0gY3VyclNsaWNlLT5ib3R0b21wb2M7CisJZGVjX3BpY3R1cmUtPmZyYW1lX3BvYyA9IGN1cnJTbGljZS0+ZnJhbWVwb2M7CisJc3dpdGNoIChjdXJyU2xpY2UtPnN0cnVjdHVyZSkgeworCWNhc2UgVE9QX0ZJRUxEOiB7CisJCWRlY19waWN0dXJlLT5wb2MgPSBjdXJyU2xpY2UtPnRvcHBvYzsKKwkJLyogcF9WaWQtPm51bWJlciAqPSAyOyAqLworCQlicmVhazsKKwl9CisJY2FzZSBCT1RUT01fRklFTEQ6IHsKKwkJZGVjX3BpY3R1cmUtPnBvYyA9IGN1cnJTbGljZS0+Ym90dG9tcG9jOworCQkvKiBwX1ZpZC0+bnVtYmVyID0gcF9WaWQtPm51bWJlciAqIDIgKyAxOyAqLworCQlicmVhazsKKwl9CisJY2FzZSBGUkFNRTogeworCQlkZWNfcGljdHVyZS0+cG9jID0gY3VyclNsaWNlLT5mcmFtZXBvYzsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkgICJwX1ZpZC0+c3RydWN0dXJlIG5vdCBpbml0aWFsaXplZCAlZFxuIiwgMjM1KTsKKwl9CisKKwkvKiBkZWNfcGljdHVyZS0+c2xpY2VfdHlwZSA9IHBfVmlkLT50eXBlOyAqLworCWRlY19waWN0dXJlLT51c2VkX2Zvcl9yZWZlcmVuY2UgPSAoY3VyclNsaWNlLT5uYWxfcmVmZXJlbmNlX2lkYyAhPSAwKTsKKwlkZWNfcGljdHVyZS0+aWRyX2ZsYWcgPSBjdXJyU2xpY2UtPmlkcl9mbGFnOworCWRlY19waWN0dXJlLT5ub19vdXRwdXRfb2ZfcHJpb3JfcGljc19mbGFnID0KKwkJY3VyclNsaWNlLT5ub19vdXRwdXRfb2ZfcHJpb3JfcGljc19mbGFnOworCWRlY19waWN0dXJlLT5sb25nX3Rlcm1fcmVmZXJlbmNlX2ZsYWcgPQorCQljdXJyU2xpY2UtPmxvbmdfdGVybV9yZWZlcmVuY2VfZmxhZzsKKyNpZiAxCisJZGVjX3BpY3R1cmUtPmFkYXB0aXZlX3JlZl9waWNfYnVmZmVyaW5nX2ZsYWcgPQorCQljdXJyU2xpY2UtPmFkYXB0aXZlX3JlZl9waWNfYnVmZmVyaW5nX2ZsYWc7CisJZGVjX3BpY3R1cmUtPmRlY19yZWZfcGljX21hcmtpbmdfYnVmZmVyID0KKwkJJmN1cnJTbGljZS0+ZGVjX3JlZl9waWNfbWFya2luZ19idWZmZXJbMF07CisjZW5kaWYKKwkvKiBjdXJyU2xpY2UtPmRlY19yZWZfcGljX21hcmtpbmdfYnVmZmVyICAgPSBOVUxMOyAqLworCisJLyogZGVjX3BpY3R1cmUtPm1iX2FmZl9mcmFtZV9mbGFnID0gY3VyclNsaWNlLT5tYl9hZmZfZnJhbWVfZmxhZzsgKi8KKwkvKiBkZWNfcGljdHVyZS0+UGljV2lkdGhJbk1icyAgICAgPSBwX1ZpZC0+UGljV2lkdGhJbk1iczsgKi8KKworCS8qIHBfVmlkLT5nZXRfbWJfYmxvY2tfcG9zID0KKwkgKglkZWNfcGljdHVyZS0+bWJfYWZmX2ZyYW1lX2ZsYWcgPyBnZXRfbWJfYmxvY2tfcG9zX21iYWZmIDoKKwkgKglnZXRfbWJfYmxvY2tfcG9zX25vcm1hbDsKKwkgKi8KKwkvKiBwX1ZpZC0+Z2V0TmVpZ2hib3VyICAgICA9CisJICoJZGVjX3BpY3R1cmUtPm1iX2FmZl9mcmFtZV9mbGFnID8gZ2V0QWZmTmVpZ2hib3VyIDoKKwkgKglnZXROb25BZmZOZWlnaGJvdXI7CisJICovCisKKwlkZWNfcGljdHVyZS0+cGljX251bSAgID0gY3VyclNsaWNlLT5mcmFtZV9udW07CisJZGVjX3BpY3R1cmUtPmZyYW1lX251bSA9IGN1cnJTbGljZS0+ZnJhbWVfbnVtOworCisJLyogZGVjX3BpY3R1cmUtPnJlY292ZXJ5X2ZyYW1lID0KKwkgKgkodW5zaWduZWQgaW50KSAoKGludCkgY3VyclNsaWNlLT5mcmFtZV9udW0gPT0KKwkgKglwX1ZpZC0+cmVjb3ZlcnlfZnJhbWVfbnVtKTsKKwkgKi8KKworCWRlY19waWN0dXJlLT5jb2RlZF9mcmFtZSA9IChjdXJyU2xpY2UtPnN0cnVjdHVyZSA9PSBGUkFNRSk7CisKKwkvKiBkZWNfcGljdHVyZS0+Y2hyb21hX2Zvcm1hdF9pZGMgPSBhY3RpdmVfc3BzLT5jaHJvbWFfZm9ybWF0X2lkYzsgKi8KKworCS8qIGRlY19waWN0dXJlLT5mcmFtZV9tYnNfb25seV9mbGFnID0KKwkgKglhY3RpdmVfc3BzLT5mcmFtZV9tYnNfb25seV9mbGFnOworCSAqLworCS8qIGRlY19waWN0dXJlLT5mcmFtZV9jcm9wcGluZ19mbGFnID0KKwkgKglhY3RpdmVfc3BzLT5mcmFtZV9jcm9wcGluZ19mbGFnOworCSAqLworCisJaWYgKChjdXJyU2xpY2UtPnBpY3R1cmVfc3RydWN0dXJlX21tY28gJiAweDMpID09IDMpIHsKKwkJZGVjX3BpY3R1cmUtPm1iX2FmZl9mcmFtZV9mbGFnID0gMTsKKwkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSIlcywgcGljdHVyZV9zdHJ1Y3R1cmVfbW1jbyBpcyAleCwgc2V0IG1iX2FmZl9mcmFtZV9mbGFnIHRvIDFcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWN1cnJTbGljZS0+cGljdHVyZV9zdHJ1Y3R1cmVfbW1jbyk7CisJfQorCisJaWYgKGN1cnJTbGljZS0+cGljX3N0cnVjdCA8IFBJQ19JTlZBTElEKSB7CisJCWRlY19waWN0dXJlLT5waWNfc3RydWN0ID0gY3VyclNsaWNlLT5waWNfc3RydWN0OworCX0gZWxzZSB7CisJCWRlY19waWN0dXJlLT5waWNfc3RydWN0ID0gUElDX0lOVkFMSUQ7CisJfQorCisJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSAgIiVzIHBpY19zdHJ1Y3QgPSAlZFxuIiwgX19mdW5jX18sIGRlY19waWN0dXJlLT5waWNfc3RydWN0KTsKK30KKwordm9pZCBkdW1wX3BpYyhzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYikKK3sKKwlpbnQgaWk7CisJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqcGljOworCWZvciAoaWkgPSAwOyBpaSA8IE1BWF9QSUNfQlVGX05VTTsgaWkrKykgeworCQlwaWMgPSAmKHBfSDI2NF9EcGItPm1fUElDW2lpXSk7CisJCWlmIChwaWMtPmlzX3VzZWQpIHsKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCAwLAorCQkJCSJwaWMoJWQsJWQpIHBvYyAlZCBpc191c2VkICVkIGJ1ZnNwZWMgJWQgY29sYnVmICVkIGZvcl9yZWYgJWQgbG9uZ190ZXJtICVkIHByZV9vdXQgJWQgb3V0cHV0ICVkIG5vbmV4aXN0ICVkIGRhdGFfZmxhZyAweCV4XG4iLAorCQkJCWlpLCBwaWMtPmluZGV4LAorCQkJCXBpYy0+cG9jLAorCQkJCXBpYy0+aXNfdXNlZCwKKwkJCQlwaWMtPmJ1Zl9zcGVjX251bSwKKwkJCQlwaWMtPmNvbG9jYXRlZF9idWZfaW5kZXgsCisJCQkJcGljLT51c2VkX2Zvcl9yZWZlcmVuY2UsCisJCQkJcGljLT5pc19sb25nX3Rlcm0sCisJCQkJcGljLT5wcmVfb3V0cHV0LAorCQkJCXBpYy0+aXNfb3V0cHV0LAorCQkJCXBpYy0+bm9uX2V4aXN0aW5nLAorCQkJCXBpYy0+ZGF0YV9mbGFnKTsKKwkJfQorCX0KK30KKworLyoKK3N0YXRpYyB2b2lkIGlzX3BpY191c2VkX2J5X2RwYihzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiwKKwlzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpwaWMpCit7CisJc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYiA9ICZwX0gyNjRfRHBiLT5tRFBCOworCXVuc2lnbmVkIGk7CisJZm9yIChpID0gMDsgaSA8IHBfRHBiLT51c2VkX3NpemU7IGkrKykgeworCQlpZiAocF9EcGItPmZzW2ldLT50b3BfZmllbGQgPT0gcGljIHx8CisJCQlwX0RwYi0+ZnNbaV0tPmJvdHRvbV9maWVsZCA9PSBwaWMgfHwKKwkJCXBfRHBiLT5mc1tpXS0+ZnJhbWUgPT0gcGljCisJCQkpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPCBwX0RwYi0+dXNlZF9zaXplKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKyovCisKK3N0YXRpYyBzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpnZXRfbmV3X3BpYyhzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiwKKwkJZW51bSBQaWN0dXJlU3RydWN0dXJlIHN0cnVjdHVyZSwgdW5zaWduZWQgY2hhciBpc19vdXRwdXQpCit7CisJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqcyA9IE5VTEw7CisJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqcGljOworCXN0cnVjdCBWaWRlb1BhcmFtZXRlcnMgKnBfVmlkID0gJihwX0gyNjRfRHBiLT5tVmlkZW8pOworCS8qIHJlY3ljbGUgdW4tdXNlZCBwaWMgKi8KKwlpbnQgaWkgPSAwOworCisJZm9yIChpaSA9IDA7IGlpIDwgTUFYX1BJQ19CVUZfTlVNOyBpaSsrKSB7CisJCXBpYyA9ICYocF9IMjY0X0RwYi0+bV9QSUNbaWldKTsKKwkJaWYgKHBpYy0+aXNfdXNlZCA9PSAwKSB7CisJCQlwaWMtPmlzX3VzZWQgPSAxOworCQkJcyA9IHBpYzsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHMpIHsKKwkJcy0+YnVmX3NwZWNfaXNfYWxsb2NlZCA9IDA7CisJCXMtPnBpY19udW0gICA9IDA7CisJCXMtPmZyYW1lX251bSA9IDA7CisJCXMtPmxvbmdfdGVybV9mcmFtZV9pZHggPSAwOworCQlzLT5sb25nX3Rlcm1fcGljX251bSAgID0gMDsKKwkJcy0+dXNlZF9mb3JfcmVmZXJlbmNlICA9IDA7CisJCXMtPmlzX2xvbmdfdGVybSAgICAgICAgPSAwOworCQlzLT5ub25fZXhpc3RpbmcgICAgICAgID0gMDsKKwkJcy0+aXNfb3V0cHV0ICAgICAgICAgICA9IDA7CisJCXMtPnByZV9vdXRwdXQgICAgICAgICAgPSAwOworCQlzLT5tYXhfc2xpY2VfaWQgICAgICAgID0gMDsKKwkJcy0+ZGF0YV9mbGFnICY9IH4oRVJST1JfRkxBRyB8IE5PRElTUF9GTEFHKTsKKyNpZiAoTVZDX0VYVEVOU0lPTl9FTkFCTEUpCisJCXMtPnZpZXdfaWQgPSAtMTsKKyNlbmRpZgorCisJCXMtPnN0cnVjdHVyZSA9IHN0cnVjdHVyZTsKKworI2lmIDAKKwkJcy0+c2l6ZV94ID0gc2l6ZV94OworCQlzLT5zaXplX3kgPSBzaXplX3k7CisJCXMtPnNpemVfeF9jciA9IHNpemVfeF9jcjsKKwkJcy0+c2l6ZV95X2NyID0gc2l6ZV95X2NyOworCQlzLT5zaXplX3hfbTEgPSBzaXplX3ggLSAxOworCQlzLT5zaXplX3lfbTEgPSBzaXplX3kgLSAxOworCQlzLT5zaXplX3hfY3JfbTEgPSBzaXplX3hfY3IgLSAxOworCQlzLT5zaXplX3lfY3JfbTEgPSBzaXplX3lfY3IgLSAxOworCisJCXMtPnRvcF9maWVsZCAgICA9IHBfVmlkLT5ub19yZWZlcmVuY2VfcGljdHVyZTsKKwkJcy0+Ym90dG9tX2ZpZWxkID0gcF9WaWQtPm5vX3JlZmVyZW5jZV9waWN0dXJlOworCQlzLT5mcmFtZSAgICAgICAgPSBwX1ZpZC0+bm9fcmVmZXJlbmNlX3BpY3R1cmU7CisjZW5kaWYKKwkJLyogcy0+ZGVjX3JlZl9waWNfbWFya2luZ19idWZmZXIgPSBOVUxMOyAqLworCisJCXMtPmNvZGVkX2ZyYW1lICA9IDA7CisJCXMtPm1iX2FmZl9mcmFtZV9mbGFnICA9IDA7CisKKwkJcy0+dG9wX3BvYyA9IHMtPmJvdHRvbV9wb2MgPSBzLT5wb2MgPSAwOworCQlzLT5zZWlIYXNUb25lX21hcHBpbmcgPSAwOworCQlzLT5mcmFtZV9tYnNfb25seV9mbGFnID0gcF9WaWQtPmFjdGl2ZV9zcHMtPmZyYW1lX21ic19vbmx5X2ZsYWc7CisKKwkJaWYgKCFwX1ZpZC0+YWN0aXZlX3Nwcy0+ZnJhbWVfbWJzX29ubHlfZmxhZyAmJgorCQkJc3RydWN0dXJlICE9IEZSQU1FKSB7CisJCQlpbnQgaSwgajsKKworCQkJZm9yIChqID0gMDsgaiA8IE1BWF9OVU1fU0xJQ0VTOyBqKyspIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCQkJCS8qIHMtPmxpc3RYW2pdW2ldID0KKwkJCQkJICpjYWxsb2MoTUFYX0xJU1RfU0laRSwKKwkJCQkJICpzaXplb2YgKHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKikpOworCQkJCQkgKisxIGZvciByZW9yZGVyaW5nICAgPz8/CisKKwkJCQkJICppZiAoTlVMTCA9PSBzLT5saXN0WFtqXVtpXSkKKwkJCQkJICpub19tZW1fZXhpdCgiYWxsb2Nfc3RvcmFibGVfcGljdHVyZToKKwkJCQkJICpzLT5saXN0WFtpXSIpOworCQkJCQkgKi8KKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UKKwkJcF9IMjY0X0RwYi0+YnVmX2FsbG9jX2ZhaWwgPSAxOworCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkiJXMgJXBcbiIsIF9fZnVuY19fLCBzKTsKKwlyZXR1cm4gczsKK30KKworc3RhdGljIHZvaWQgZnJlZV9waWN0dXJlKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLAorCQkJIHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnBpYykKK3sKKwlpZiAocGljID09IE5VTEwgfHwgcGljLT5pbmRleCA8IDAgfHwKKwkJcGljLT5pbmRleCA+PSBNQVhfUElDX0JVRl9OVU0pCisJCXJldHVybjsKKwlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJIiVzICVwICVkXG4iLCBfX2Z1bmNfXywgcGljLCBwaWMtPmluZGV4KTsKKwkvKiBhc3NlcnQocGljLT5pbmRleDxNQVhfUElDX0JVRl9OVU0pOyAqLworCXBfSDI2NF9EcGItPm1fUElDW3BpYy0+aW5kZXhdLmlzX3VzZWQgPSAwOworfQorCitzdGF0aWMgdm9pZCBnZW5fZmllbGRfcmVmX2lkcyhzdHJ1Y3QgVmlkZW9QYXJhbWV0ZXJzICpwX1ZpZCwKKwkJCSAgICAgIHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnApCit7CisJaW50IGksIGo7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSBjb250YWluZXJfb2YocF9WaWQsCisJCQkJCXN0cnVjdCBoMjY0X2RwYl9zdHJ1LCBtVmlkZW8pOworCS8qICEgR2VuZXJhdGUgRnJhbWUgcGFyYW1ldGVycyBmcm9tIGZpZWxkIGluZm9ybWF0aW9uLiAqLworCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJCSIlc1xuIiwgX19mdW5jX18pOworCisJLyogY29weSB0aGUgbGlzdDsgKi8KKwlmb3IgKGogPSAwOyBqIDwgcF9WaWQtPmlTbGljZU51bU9mQ3VyclBpYzsgaisrKSB7CisJCWlmIChwLT5saXN0WFtqXVtMSVNUXzBdKSB7CisJCQlwLT5saXN0WHNpemVbal1bTElTVF8wXSA9CisJCQkJcF9WaWQtPnBwU2xpY2VMaXN0W2pdLT5saXN0WHNpemVbTElTVF8wXTsKKwkJCWZvciAoaSA9IDA7IGkgPCBwLT5saXN0WHNpemVbal1bTElTVF8wXTsgaSsrKQorCQkJCXAtPmxpc3RYW2pdW0xJU1RfMF1baV0gPQorCQkJCXBfVmlkLT5wcFNsaWNlTGlzdFtqXS0+bGlzdFhbTElTVF8wXVtpXTsKKwkJfQorCQlpZiAocC0+bGlzdFhbal1bTElTVF8xXSkgeworCQkJcC0+bGlzdFhzaXplW2pdW0xJU1RfMV0gPQorCQkJCXBfVmlkLT5wcFNsaWNlTGlzdFtqXS0+bGlzdFhzaXplW0xJU1RfMV07CisJCQlmb3IgKGkgPSAwOyBpIDwgcC0+bGlzdFhzaXplW2pdW0xJU1RfMV07IGkrKykKKwkJCQlwLT5saXN0WFtqXVtMSVNUXzFdW2ldID0KKwkJCQlwX1ZpZC0+cHBTbGljZUxpc3Rbal0tPmxpc3RYW0xJU1RfMV1baV07CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfZHBiKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLCBpbnQgdHlwZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgVmlkZW9QYXJhbWV0ZXJzICpwX1ZpZCAgPSAmcF9IMjY0X0RwYi0+bVZpZGVvOworCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIgPSAmcF9IMjY0X0RwYi0+bURQQjsKKwlzdHJ1Y3QgU1BTUGFyYW1ldGVycyAqYWN0aXZlX3NwcyA9ICZwX0gyNjRfRHBiLT5tU1BTOworCisJcF9WaWQtPmFjdGl2ZV9zcHMgPSBhY3RpdmVfc3BzOworCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCSIlc1xuIiwgX19mdW5jX18pOworCisJcF9EcGItPnBfVmlkID0gcF9WaWQ7CisJaWYgKHBfRHBiLT5pbml0X2RvbmUpIHsKKwkJLyogZnJlZV9kcGIocF9EcGIpOyAqLworCQlpZiAocF9WaWQtPm5vX3JlZmVyZW5jZV9waWN0dXJlKSB7CisJCQlmcmVlX3BpY3R1cmUocF9IMjY0X0RwYiwgcF9WaWQtPm5vX3JlZmVyZW5jZV9waWN0dXJlKTsKKwkJCXBfVmlkLT5ub19yZWZlcmVuY2VfcGljdHVyZSA9IE5VTEw7CisJCX0KKwkJcF9EcGItPmluaXRfZG9uZSA9IDA7CisJfQorCisJLyogcF9EcGItPnNpemUgPSAxMDsgLy9hY3RpdmVfc3BzLT5tYXhfZHBiX3NpemU7IC8vMTY7CisJICogICBnZXREcGJTaXplKHBfVmlkLCBhY3RpdmVfc3BzKSArCisJICoJcF9WaWQtPnBfSW5wLT5kcGJfcGx1c1t0eXBlPT0yPyAxOiAwXTsKKwkgKiAgIHBfRHBiLT5zaXplID0gYWN0aXZlX3Nwcy0+bWF4X2RwYl9zaXplOyAvLzE2OworCSAqICAgZ2V0RHBiU2l6ZShwX1ZpZCwgYWN0aXZlX3NwcykgKworCSAqCXBfVmlkLT5wX0lucC0+ZHBiX3BsdXNbdHlwZT09Mj8gMTogMF07CisJICogICBwX0RwYi0+c2l6ZSBpbml0aWFsemllIGluIHZoMjY0LmMKKwkgKi8KKwlwX0RwYi0+bnVtX3JlZl9mcmFtZXMgPSBhY3RpdmVfc3BzLT5udW1fcmVmX2ZyYW1lczsKKwkvKiBwX0RwYi0+bnVtX3JlZl9mcmFtZXMgaW5pdGlhbHppZSBpbiB2aDI2NC5jICovCisJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJICAiJXMgZHBiX3NpemUgaXMgJWQgIG51bV9yZWZfZnJhbWVzID0gJWQgKCVkKVxuIiwKKwkJICBfX2Z1bmNfXywgcF9EcGItPnNpemUsCisJCSAgcF9EcGItPm51bV9yZWZfZnJhbWVzLAorCQkgIGFjdGl2ZV9zcHMtPm51bV9yZWZfZnJhbWVzKTsKKwlpZiAoYWN0aXZlX3Nwcy0+bnVtX3JlZl9mcmFtZXMgPT0gMHhmZmZmKSB7CisJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCAwLAorCQkgICIhISFXYXJuaW5nLCBudW1fcmVmX2ZyYW1lcyA9ICVkIGlzIGludmFsaWRcbiIsCisJCSAgYWN0aXZlX3Nwcy0+bnVtX3JlZl9mcmFtZXMpOworCX0KKworI2lmIDAKKwkvKiA/Pz8gKi8KKyNpZiAoTVZDX0VYVEVOU0lPTl9FTkFCTEUpCisJaWYgKCh1bnNpZ25lZCBpbnQpYWN0aXZlX3Nwcy0+bWF4X2RlY19mcmFtZV9idWZmZXJpbmcgPAorCSAgICBhY3RpdmVfc3BzLT5udW1fcmVmX2ZyYW1lcykgeworI2Vsc2UKKwlpZiAocF9EcGItPnNpemUgPCBhY3RpdmVfc3BzLT5udW1fcmVmX2ZyYW1lcykgeworI2VuZGlmCisJCWVycm9yKAorCQkiRFBCIHNpemUgYXQgc3BlY2lmaWVkIGxldmVsIGlzIHNtYWxsZXIgdGhhbiB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiByZWZlcmVuY2UgZnJhbWVzLiBUaGlzIGlzIG5vdCBhbGxvd2VkLlxuIiwKKwkJMTAwMCk7CisJfQorI2VuZGlmCisKKwlwX0RwYi0+dXNlZF9zaXplID0gMDsKKwlwX0RwYi0+bGFzdF9waWN0dXJlID0gTlVMTDsKKworCXBfRHBiLT5yZWZfZnJhbWVzX2luX2J1ZmZlciA9IDA7CisJcF9EcGItPmx0cmVmX2ZyYW1lc19pbl9idWZmZXIgPSAwOworCisjaWYgMAorCXBfRHBiLT5mcyA9IGNhbGxvYyhwX0RwYi0+c2l6ZSwgc2l6ZW9mKHN0cnVjdCBGcmFtZVN0b3JlICopKTsKKwlpZiAoTlVMTCA9PSBwX0RwYi0+ZnMpCisJCW5vX21lbV9leGl0KCJpbml0X2RwYjogcF9EcGItPmZzIik7CisKKwlwX0RwYi0+ZnNfcmVmID0gY2FsbG9jKHBfRHBiLT5zaXplLCBzaXplb2Yoc3RydWN0IEZyYW1lU3RvcmUgKikpOworCWlmIChOVUxMID09IHBfRHBiLT5mc19yZWYpCisJCW5vX21lbV9leGl0KCJpbml0X2RwYjogcF9EcGItPmZzX3JlZiIpOworCisJcF9EcGItPmZzX2x0cmVmID0gY2FsbG9jKHBfRHBiLT5zaXplLCBzaXplb2Yoc3RydWN0IEZyYW1lU3RvcmUgKikpOworCWlmIChOVUxMID09IHBfRHBiLT5mc19sdHJlZikKKwkJbm9fbWVtX2V4aXQoImluaXRfZHBiOiBwX0RwYi0+ZnNfbHRyZWYiKTsKKyNlbmRpZgorCisjaWYgKE1WQ19FWFRFTlNJT05fRU5BQkxFKQorCXBfRHBiLT5mc19pbHJlZiA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IEZyYW1lU3RvcmUgKikpOworCWlmIChOVUxMID09IHBfRHBiLT5mc19pbHJlZikKKwkJbm9fbWVtX2V4aXQoImluaXRfZHBiOiBwX0RwYi0+ZnNfaWxyZWYiKTsKKyNlbmRpZgorCisJZm9yIChpID0gMDsgaSA8IHBfRHBiLT5zaXplOyBpKyspIHsKKwkJcF9EcGItPmZzW2ldID0gJihwX0gyNjRfRHBiLT5tRnJhbWVTdG9yZVtpXSk7CisJCS8qIGFsbG9jX2ZyYW1lX3N0b3JlKCk7ICovCisJCXBfRHBiLT5mc1tpXS0+aW5kZXggICAgICAgPSBpOworCQlwX0RwYi0+ZnNfcmVmW2ldICAgPSBOVUxMOworCQlwX0RwYi0+ZnNfbHRyZWZbaV0gPSBOVUxMOworCQlwX0RwYi0+ZnNbaV0tPmxheWVyX2lkID0gMDsgLyogTVZDX0lOSVRfVklFV19JRDsgKi8KKyNpZiAoTVZDX0VYVEVOU0lPTl9FTkFCTEUpCisJCXBfRHBiLT5mc1tpXS0+dmlld19pZCA9IE1WQ19JTklUX1ZJRVdfSUQ7CisJCXBfRHBiLT5mc1tpXS0+aW50ZXJfdmlld19mbGFnWzBdID0KKwkJCXBfRHBiLT5mc1tpXS0+aW50ZXJfdmlld19mbGFnWzFdID0gMDsKKwkJcF9EcGItPmZzW2ldLT5hbmNob3JfcGljX2ZsYWdbMF0gPQorCQkJcF9EcGItPmZzW2ldLT5hbmNob3JfcGljX2ZsYWdbMV0gPSAwOworI2VuZGlmCisJfQorI2lmIChNVkNfRVhURU5TSU9OX0VOQUJMRSkKKwlpZiAodHlwZSA9PSAyKSB7CisJCXBfRHBiLT5mc19pbHJlZlswXSA9IGFsbG9jX2ZyYW1lX3N0b3JlKCk7CisJCS8qIFRoZXNlIG1heSBuZWVkIHNvbWUgY2xlYW51cHMgKi8KKwkJcF9EcGItPmZzX2lscmVmWzBdLT52aWV3X2lkID0gTVZDX0lOSVRfVklFV19JRDsKKwkJcF9EcGItPmZzX2lscmVmWzBdLT5pbnRlcl92aWV3X2ZsYWdbMF0gPQorCQkJcF9EcGItPmZzX2lscmVmWzBdLT5pbnRlcl92aWV3X2ZsYWdbMV0gPSAwOworCQlwX0RwYi0+ZnNfaWxyZWZbMF0tPmFuY2hvcl9waWNfZmxhZ1swXSA9CisJCQlwX0RwYi0+ZnNfaWxyZWZbMF0tPmFuY2hvcl9waWNfZmxhZ1sxXSA9IDA7CisJCS8qIGdpdmVuIHRoYXQgdGhpcyBpcyBpbiBhIGRpZmZlcmVudCBidWZmZXIsCisJCSAqCWRvIHdlIGV2ZW4gbmVlZCBwcm9jX2ZsYWcgYW55bW9yZT8KKwkJICovCisJfSBlbHNlCisJCXBfRHBiLT5mc19pbHJlZlswXSA9IE5VTEw7CisjZW5kaWYKKworCS8qCisJICpmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCSAqeworCSAqY3VyclNsaWNlLT5saXN0WFtpXSA9CisJICoJY2FsbG9jKE1BWF9MSVNUX1NJWkUsIHNpemVvZiAoc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqKSk7CisJICoJKzEgZm9yIHJlb3JkZXJpbmcKKwkgKmlmIChOVUxMID09IGN1cnJTbGljZS0+bGlzdFhbaV0pCisJICpub19tZW1fZXhpdCgiaW5pdF9kcGI6IGN1cnJTbGljZS0+bGlzdFhbaV0iKTsKKwkgKn0KKwkgKi8KKwkvKiBhbGxvY2F0ZSBhIGR1bW15IHN0b3JhYmxlIHBpY3R1cmUgKi8KKwlpZiAoIXBfVmlkLT5ub19yZWZlcmVuY2VfcGljdHVyZSkgeworCQlwX1ZpZC0+bm9fcmVmZXJlbmNlX3BpY3R1cmUgPSBnZXRfbmV3X3BpYyhwX0gyNjRfRHBiLAorCQkJCQkgICAgICBGUkFNRSwKKwkJLypwX1ZpZC0+d2lkdGgsIHBfVmlkLT5oZWlnaHQsCisJCSAqcF9WaWQtPndpZHRoX2NyLCBwX1ZpZC0+aGVpZ2h0X2NyLAorCQkgKi8KKwkJMSk7CisJCXBfVmlkLT5ub19yZWZlcmVuY2VfcGljdHVyZS0+dG9wX2ZpZWxkID0KKwkJCXBfVmlkLT5ub19yZWZlcmVuY2VfcGljdHVyZTsKKwkJcF9WaWQtPm5vX3JlZmVyZW5jZV9waWN0dXJlLT5ib3R0b21fZmllbGQgPQorCQkJcF9WaWQtPm5vX3JlZmVyZW5jZV9waWN0dXJlOworCQlwX1ZpZC0+bm9fcmVmZXJlbmNlX3BpY3R1cmUtPmZyYW1lID0KKwkJCXBfVmlkLT5ub19yZWZlcmVuY2VfcGljdHVyZTsKKwl9CisJcF9EcGItPmxhc3Rfb3V0cHV0X3BvYyA9IElOVF9NSU47CisKKyNpZiAoTVZDX0VYVEVOU0lPTl9FTkFCTEUpCisJcF9EcGItPmxhc3Rfb3V0cHV0X3ZpZXdfaWQgPSAtMTsKKyNlbmRpZgorCisJcF9WaWQtPmxhc3RfaGFzX21tY29fNSA9IDA7CisKKwlpbml0X2NvbG9jYXRlX2J1ZihwX0gyNjRfRHBiLCBwX0gyNjRfRHBiLT5tYXhfcmVmZXJlbmNlX3NpemUpOworCisJcF9EcGItPmluaXRfZG9uZSA9IDE7CisKKyNpZiAwCisvKiA/Pz8gKi8KKwkvKiBwaWN0dXJlIGVycm9yIGNvbmNlYWxtZW50ICovCisJaWYgKHBfVmlkLT5jb25jZWFsX21vZGUgIT0gMCAmJiAhcF9WaWQtPmxhc3Rfb3V0X2ZzKQorCQlwX1ZpZC0+bGFzdF9vdXRfZnMgPSBhbGxvY19mcmFtZV9zdG9yZSgpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGRwYl9zcGxpdF9maWVsZChzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiwKKwkJCSAgICBzdHJ1Y3QgRnJhbWVTdG9yZSAqZnMpCit7CisJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqZnNfdG9wID0gTlVMTCwgKmZzX2J0bSA9IE5VTEw7CisJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqZnJhbWUgPSBmcy0+ZnJhbWU7CisKKwlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkiJXMgJXAgJXBcbiIsIF9fZnVuY19fLCBmcywgZnJhbWUpOworCisJZnMtPnBvYyA9IGZyYW1lLT5wb2M7CisKKwlpZiAoIWZyYW1lLT5mcmFtZV9tYnNfb25seV9mbGFnKSB7CisJCWZzX3RvcCA9IGZzLT50b3BfZmllbGQgPSBnZXRfbmV3X3BpYyhwX0gyNjRfRHBiLAorCQkJVE9QX0ZJRUxELAorCQkJLyogZnJhbWUtPnNpemVfeCwgZnJhbWUtPnNpemVfeSwKKwkJCSAqZnJhbWUtPnNpemVfeF9jciwgZnJhbWUtPnNpemVfeV9jciwKKwkJCSAqLworCQkJMSk7CisJCWZzX2J0bSA9IGZzLT5ib3R0b21fZmllbGQgPSBnZXRfbmV3X3BpYyhwX0gyNjRfRHBiLAorCQkJQk9UVE9NX0ZJRUxELAorCQkJLypmcmFtZS0+c2l6ZV94LCBmcmFtZS0+c2l6ZV95LAorCQkJICpmcmFtZS0+c2l6ZV94X2NyLCBmcmFtZS0+c2l6ZV95X2NyLAorCQkJICovCisJCQkxKTsKKwkJaWYgKGZzX3RvcCA9PSBOVUxMIHx8IGZzX2J0bSA9PSBOVUxMKQorCQkJcmV0dXJuOworI2lmIDEKKy8qIHJhaW4gKi8KKwkJZnNfdG9wLT5idWZfc3BlY19udW0gPSBmcmFtZS0+YnVmX3NwZWNfbnVtOworCQlmc19idG0tPmJ1Zl9zcGVjX251bSA9IGZyYW1lLT5idWZfc3BlY19udW07CisKKwkJZnNfdG9wLT5jb2xvY2F0ZWRfYnVmX2luZGV4ID0gZnJhbWUtPmNvbG9jYXRlZF9idWZfaW5kZXg7CisJCWZzX2J0bS0+Y29sb2NhdGVkX2J1Zl9pbmRleCA9IGZyYW1lLT5jb2xvY2F0ZWRfYnVmX2luZGV4OworCisJCWZzX3RvcC0+ZGF0YV9mbGFnID0gZnJhbWUtPmRhdGFfZmxhZzsKKwkJZnNfYnRtLT5kYXRhX2ZsYWcgPSBmcmFtZS0+ZGF0YV9mbGFnOworI2VuZGlmCisJCWZzX3RvcC0+cG9jID0gZnJhbWUtPnRvcF9wb2M7CisJCWZzX2J0bS0+cG9jID0gZnJhbWUtPmJvdHRvbV9wb2M7CisKKyNpZiAoTVZDX0VYVEVOU0lPTl9FTkFCTEUpCisJCWZzX3RvcC0+dmlld19pZCA9IGZyYW1lLT52aWV3X2lkOworCQlmc19idG0tPnZpZXdfaWQgPSBmcmFtZS0+dmlld19pZDsKKyNlbmRpZgorCisJCWZzX3RvcC0+ZnJhbWVfcG9jID0gIGZyYW1lLT5mcmFtZV9wb2M7CisKKwkJZnNfdG9wLT5ib3R0b21fcG9jID0gZnNfYnRtLT5ib3R0b21fcG9jID0gIGZyYW1lLT5ib3R0b21fcG9jOworCQlmc190b3AtPnRvcF9wb2MgICAgPSBmc19idG0tPnRvcF9wb2MgICAgPSAgZnJhbWUtPnRvcF9wb2M7CisJCWZzX2J0bS0+ZnJhbWVfcG9jICA9IGZyYW1lLT5mcmFtZV9wb2M7CisKKwkJZnNfdG9wLT51c2VkX2Zvcl9yZWZlcmVuY2UgPSBmc19idG0tPnVzZWRfZm9yX3JlZmVyZW5jZQorCQkJCQkgICAgID0gZnJhbWUtPnVzZWRfZm9yX3JlZmVyZW5jZTsKKwkJZnNfdG9wLT5pc19sb25nX3Rlcm0gPSBmc19idG0tPmlzX2xvbmdfdGVybQorCQkJCSAgICAgICA9IGZyYW1lLT5pc19sb25nX3Rlcm07CisJCWZzLT5sb25nX3Rlcm1fZnJhbWVfaWR4ID0gZnNfdG9wLT5sb25nX3Rlcm1fZnJhbWVfaWR4CisJCQkJCSAgPSBmc19idG0tPmxvbmdfdGVybV9mcmFtZV9pZHgKKwkJCQkJICAgID0gZnJhbWUtPmxvbmdfdGVybV9mcmFtZV9pZHg7CisKKwkJZnNfdG9wLT5jb2RlZF9mcmFtZSA9IGZzX2J0bS0+Y29kZWRfZnJhbWUgPSAxOworCQlmc190b3AtPm1iX2FmZl9mcmFtZV9mbGFnID0gZnNfYnRtLT5tYl9hZmZfZnJhbWVfZmxhZworCQkJCQkgICAgPSBmcmFtZS0+bWJfYWZmX2ZyYW1lX2ZsYWc7CisKKwkJZnJhbWUtPnRvcF9maWVsZCAgICA9IGZzX3RvcDsKKwkJZnJhbWUtPmJvdHRvbV9maWVsZCA9IGZzX2J0bTsKKwkJZnJhbWUtPmZyYW1lICAgICAgICAgPSBmcmFtZTsKKwkJZnNfdG9wLT5ib3R0b21fZmllbGQgPSBmc19idG07CisJCWZzX3RvcC0+ZnJhbWUgICAgICAgID0gZnJhbWU7CisJCWZzX3RvcC0+dG9wX2ZpZWxkID0gZnNfdG9wOworCQlmc19idG0tPnRvcF9maWVsZCA9IGZzX3RvcDsKKwkJZnNfYnRtLT5mcmFtZSAgICAgPSBmcmFtZTsKKwkJZnNfYnRtLT5ib3R0b21fZmllbGQgPSBmc19idG07CisKKyNpZiAoTVZDX0VYVEVOU0lPTl9FTkFCTEUpCisJCWZzX3RvcC0+dmlld19pZCA9IGZzX2J0bS0+dmlld19pZCA9IGZzLT52aWV3X2lkOworCQlmc190b3AtPmludGVyX3ZpZXdfZmxhZyA9IGZzLT5pbnRlcl92aWV3X2ZsYWdbMF07CisJCWZzX2J0bS0+aW50ZXJfdmlld19mbGFnID0gZnMtPmludGVyX3ZpZXdfZmxhZ1sxXTsKKyNlbmRpZgorCisJCWZzX3RvcC0+Y2hyb21hX2Zvcm1hdF9pZGMgPSBmc19idG0tPmNocm9tYV9mb3JtYXRfaWRjID0KKwkJCQkJCSAgICBmcmFtZS0+Y2hyb21hX2Zvcm1hdF9pZGM7CisJCWZzX3RvcC0+aUNvZGluZ1R5cGUgPSBmc19idG0tPmlDb2RpbmdUeXBlID0gZnJhbWUtPmlDb2RpbmdUeXBlOworCX0gZWxzZSB7CisJCWZzLT50b3BfZmllbGQgICAgICAgPSBOVUxMOworCQlmcy0+Ym90dG9tX2ZpZWxkICAgID0gTlVMTDsKKwkJZnJhbWUtPnRvcF9maWVsZCAgICA9IE5VTEw7CisJCWZyYW1lLT5ib3R0b21fZmllbGQgPSBOVUxMOworCQlmcmFtZS0+ZnJhbWUgPSBmcmFtZTsKKwl9CisKK30KKworCitzdGF0aWMgdm9pZCBkcGJfY29tYmluZV9maWVsZChzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiwKKwkJCSAgICAgIHN0cnVjdCBGcmFtZVN0b3JlICpmcykKK3sKKworCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkiJXNcbiIsIF9fZnVuY19fKTsKKworCWlmICghZnMtPmZyYW1lKSB7CisJCWZzLT5mcmFtZSA9IGdldF9uZXdfcGljKHBfSDI2NF9EcGIsCisJCQlGUkFNRSwKKwkJCS8qIGZzLT50b3BfZmllbGQtPnNpemVfeCwgZnMtPnRvcF9maWVsZC0+c2l6ZV95KjIsCisJCQkgKmZzLT50b3BfZmllbGQtPnNpemVfeF9jciwgZnMtPnRvcF9maWVsZC0+c2l6ZV95X2NyKjIsCisJCQkgKi8KKwkJCTEpOworCX0KKwlpZiAoIWZzLT5mcmFtZSkKKwkJcmV0dXJuOworI2lmIDEKKy8qIHJhaW4gKi8KKwlmcy0+ZnJhbWUtPmJ1Zl9zcGVjX251bSA9IGZzLT50b3BfZmllbGQtPmJ1Zl9zcGVjX251bTsKKwlmcy0+ZnJhbWUtPmNvbG9jYXRlZF9idWZfaW5kZXggPSBmcy0+dG9wX2ZpZWxkLT5jb2xvY2F0ZWRfYnVmX2luZGV4OworCWZzLT5mcmFtZS0+ZGF0YV9mbGFnID0gZnMtPnRvcF9maWVsZC0+ZGF0YV9mbGFnOworCWZzLT5mcmFtZS0+c2xpY2VfdHlwZSA9IGZzLT50b3BfZmllbGQtPnNsaWNlX3R5cGU7CisJaWYgKGZzLT5ib3R0b21fZmllbGQpCisJCWZzLT5mcmFtZS0+ZGF0YV9mbGFnIHw9IChmcy0+Ym90dG9tX2ZpZWxkLT5kYXRhX2ZsYWcgJiAweGYwKTsKKyNlbmRpZgorCisJaWYgKGZzLT5ib3R0b21fZmllbGQpIHsKKwkJZnMtPnBvYyA9IGZzLT5mcmFtZS0+cG9jID0gZnMtPmZyYW1lLT5mcmFtZV9wb2MgPSBpbWluKAorCQkJCWZzLT50b3BfZmllbGQtPnBvYywgZnMtPmJvdHRvbV9maWVsZC0+cG9jKTsKKworCQlmcy0+Ym90dG9tX2ZpZWxkLT5mcmFtZV9wb2MgPSBmcy0+dG9wX2ZpZWxkLT5mcmFtZV9wb2MgPSBmcy0+ZnJhbWUtPnBvYzsKKworCQlmcy0+Ym90dG9tX2ZpZWxkLT50b3BfcG9jID0gZnMtPmZyYW1lLT50b3BfcG9jID0gZnMtPnRvcF9maWVsZC0+cG9jOworCQlmcy0+dG9wX2ZpZWxkLT5ib3R0b21fcG9jID0gZnMtPmZyYW1lLT5ib3R0b21fcG9jID0KKwkJCQlmcy0+Ym90dG9tX2ZpZWxkLT5wb2M7CisKKwkJZnMtPmZyYW1lLT51c2VkX2Zvcl9yZWZlcmVuY2UgPSAoZnMtPnRvcF9maWVsZC0+dXNlZF9mb3JfcmVmZXJlbmNlICYmCisJCQkJCQkgZnMtPmJvdHRvbV9maWVsZC0+dXNlZF9mb3JfcmVmZXJlbmNlKTsKKwkJZnMtPmZyYW1lLT5pc19sb25nX3Rlcm0gPSAoZnMtPnRvcF9maWVsZC0+aXNfbG9uZ190ZXJtICYmCisJCQkJCSAgIGZzLT5ib3R0b21fZmllbGQtPmlzX2xvbmdfdGVybSk7CisJfQorCisJaWYgKGZzLT5mcmFtZS0+aXNfbG9uZ190ZXJtKQorCQlmcy0+ZnJhbWUtPmxvbmdfdGVybV9mcmFtZV9pZHggPSBmcy0+bG9uZ190ZXJtX2ZyYW1lX2lkeDsKKworCWZzLT5mcmFtZS0+dG9wX2ZpZWxkICAgID0gZnMtPnRvcF9maWVsZDsKKwlpZiAoZnMtPmJvdHRvbV9maWVsZCkKKwkJZnMtPmZyYW1lLT5ib3R0b21fZmllbGQgPSBmcy0+Ym90dG9tX2ZpZWxkOworCWZzLT5mcmFtZS0+ZnJhbWUgPSBmcy0+ZnJhbWU7CisKKwlmcy0+ZnJhbWUtPmNvZGVkX2ZyYW1lID0gMDsKKworCWZzLT5mcmFtZS0+Y2hyb21hX2Zvcm1hdF9pZGMgPSBmcy0+dG9wX2ZpZWxkLT5jaHJvbWFfZm9ybWF0X2lkYzsKKwlmcy0+ZnJhbWUtPmZyYW1lX2Nyb3BwaW5nX2ZsYWcgPSBmcy0+dG9wX2ZpZWxkLT5mcmFtZV9jcm9wcGluZ19mbGFnOworCWlmIChmcy0+ZnJhbWUtPmZyYW1lX2Nyb3BwaW5nX2ZsYWcpIHsKKwkJZnMtPmZyYW1lLT5mcmFtZV9jcm9wX3RvcF9vZmZzZXQgPQorCQkJZnMtPnRvcF9maWVsZC0+ZnJhbWVfY3JvcF90b3Bfb2Zmc2V0OworCQlmcy0+ZnJhbWUtPmZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCA9CisJCQlmcy0+dG9wX2ZpZWxkLT5mcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQ7CisJCWZzLT5mcmFtZS0+ZnJhbWVfY3JvcF9sZWZ0X29mZnNldCA9CisJCQlmcy0+dG9wX2ZpZWxkLT5mcmFtZV9jcm9wX2xlZnRfb2Zmc2V0OworCQlmcy0+ZnJhbWUtPmZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0ID0KKwkJCWZzLT50b3BfZmllbGQtPmZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0OworCX0KKwlpZiAoZnMtPmJvdHRvbV9maWVsZCkgeworCQlmcy0+dG9wX2ZpZWxkLT5mcmFtZSA9IGZzLT5ib3R0b21fZmllbGQtPmZyYW1lID0gZnMtPmZyYW1lOworCQlmcy0+dG9wX2ZpZWxkLT50b3BfZmllbGQgPSBmcy0+dG9wX2ZpZWxkOworCQlmcy0+dG9wX2ZpZWxkLT5ib3R0b21fZmllbGQgPSBmcy0+Ym90dG9tX2ZpZWxkOworCQlmcy0+Ym90dG9tX2ZpZWxkLT50b3BfZmllbGQgPSBmcy0+dG9wX2ZpZWxkOworCQlmcy0+Ym90dG9tX2ZpZWxkLT5ib3R0b21fZmllbGQgPSBmcy0+Ym90dG9tX2ZpZWxkOworCX0KKworCS8qKi8KKyNpZiAoTVZDX0VYVEVOU0lPTl9FTkFCTEUpCisJZnMtPmZyYW1lLT52aWV3X2lkID0gZnMtPnZpZXdfaWQ7CisjZW5kaWYKKwlmcy0+ZnJhbWUtPmlDb2RpbmdUeXBlID0gZnMtPnRvcF9maWVsZC0+aUNvZGluZ1R5cGU7CisJaWYgKGZzLT5ib3R0b21fZmllbGQgJiYgZnMtPnRvcF9maWVsZC0+cG9jIDwgZnMtPmJvdHRvbV9maWVsZC0+cG9jKSB7CisJCWZzLT5wdHMgPSBmcy0+dG9wX2ZpZWxkLT5wdHM7CisJCWZzLT5wdHM2NCA9IGZzLT50b3BfZmllbGQtPnB0czY0OworCQkvKlNXUEwtNzEwNSBmaXggKi8KKwkJaWYgKChmcy0+ZnJhbWUtPnNsaWNlX3R5cGUgPT0gQl9TTElDRSkKKwkJCSYmICghZnMtPmJvdHRvbV9maWVsZC0+cHRzKSAmJighZnMtPmJvdHRvbV9maWVsZC0+cHRzNjQpKSB7CisJCQlmcy0+cHRzID0gIDA7CisJCQlmcy0+cHRzNjQgPSAwOworCQl9CisJCWZzLT5vZmZzZXRfZGVsaW1pdGVyID0gZnMtPnRvcF9maWVsZC0+b2Zmc2V0X2RlbGltaXRlcjsKKwkJZnMtPmRlY29kZWRfZnJhbWVfc2l6ZSA9IGZzLT50b3BfZmllbGQtPnBpY19zaXplICsgZnMtPmJvdHRvbV9maWVsZC0+cGljX3NpemU7CisJfSBlbHNlIGlmIChmcy0+Ym90dG9tX2ZpZWxkKSB7CisJCWZzLT5wdHMgPSBmcy0+Ym90dG9tX2ZpZWxkLT5wdHM7CisJCWZzLT5wdHM2NCA9IGZzLT5ib3R0b21fZmllbGQtPnB0czY0OworCQlmcy0+b2Zmc2V0X2RlbGltaXRlciA9IGZzLT5ib3R0b21fZmllbGQtPm9mZnNldF9kZWxpbWl0ZXI7CisJCWZzLT5kZWNvZGVkX2ZyYW1lX3NpemUgPSBmcy0+dG9wX2ZpZWxkLT5waWNfc2l6ZSArIGZzLT5ib3R0b21fZmllbGQtPnBpY19zaXplOworCX0KKwkvKiBGSUVMRF9DT0RJTkcgOyovCit9CisKK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZV9mcmFtZV9ubyhzdHJ1Y3QgVmlkZW9QYXJhbWV0ZXJzICpwX1ZpZCwKKwkJCSAgICAgICBzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpwKQoreworI2lmIDAKKy8qID8/PyAqLworCUlucHV0UGFyYW1ldGVycyAqcF9JbnAgPSBwX1ZpZC0+cF9JbnA7CisJLyogY2FsY3VsYXRlIGZyYW1lIG51bWJlciAqLworCWludCBwc25yUE9DID0gcF9WaWQtPmFjdGl2ZV9zcHMtPm1iX2FkYXB0aXZlX2ZyYW1lX2ZpZWxkX2ZsYWcgPworCQlwLT5wb2MgLyAocF9JbnAtPnBvY19zY2FsZSkgOiBwLT5wb2MgLyAocF9JbnAtPnBvY19zY2FsZSk7CisKKwlpZiAocHNuclBPQyA9PSAwKSB7IC8qICYmIHBfVmlkLT5wc25yX251bWJlcikgKi8KKwkJcF9WaWQtPmlkcl9wc25yX251bWJlciA9CisJCXBfVmlkLT5nX25GcmFtZSAqIHBfVmlkLT5yZWZfcG9jX2dhcCAvIChwX0lucC0+cG9jX3NjYWxlKTsKKwl9CisJcF9WaWQtPnBzbnJfbnVtYmVyID0gaW1heChwX1ZpZC0+cHNucl9udW1iZXIsCisJCXBfVmlkLT5pZHJfcHNucl9udW1iZXIgKyBwc25yUE9DKTsKKworCXBfVmlkLT5mcmFtZV9ubyA9IHBfVmlkLT5pZHJfcHNucl9udW1iZXIgKyBwc25yUE9DOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGluc2VydF9waWN0dXJlX2luX2RwYihzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiwKKwkJCQkgIHN0cnVjdCBGcmFtZVN0b3JlICpmcywKKwkJCQkgIHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnAsCisJCQkJICB1bnNpZ25lZCBjaGFyIGRhdGFfZmxhZykKK3sKKwlzdHJ1Y3QgdmRlY19mcmFtZXNfcyAqbXZmcm0gPSBwX0gyNjRfRHBiLT52ZGVjLT5tdmZybTsKKwlzdHJ1Y3QgVmlkZW9QYXJhbWV0ZXJzICpwX1ZpZCA9ICZwX0gyNjRfRHBiLT5tVmlkZW87CisJLyogSW5wdXRQYXJhbWV0ZXJzICpwX0lucCA9IHBfVmlkLT5wX0lucDsKKwkgKiAgIGRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJICoJImluc2VydCAoJXMpIHBpYyB3aXRoIGZyYW1lX251bSAjJWQsIHBvYyAlZFxuIiwKKwkgKgkocC0+c3RydWN0dXJlID09IEZSQU1FKT8iRlJBTUUiOgorCSAqCShwLT5zdHJ1Y3R1cmUgPT0gVE9QX0ZJRUxEKT8iVE9QX0ZJRUxEIjoKKwkgKgkiQk9UVE9NX0ZJRUxEIiwgcC0+cGljX251bSwgcC0+cG9jKTsKKwkgKiAgIGFzc2VydCAocCE9TlVMTCk7CisJICogICBhc3NlcnQgKGZzIT1OVUxMKTsKKwkgKi8KKwlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkiJXMgJXAgJXBcbiIsIF9fZnVuY19fLCBmcywgcCk7CisJcF9IMjY0X0RwYi0+ZHBiX2ZyYW1lX2NvdW50Kys7CisJZnMtPmRwYl9mcmFtZV9jb3VudCA9IHBfSDI2NF9EcGItPmRwYl9mcmFtZV9jb3VudDsKKyNpZiAxCisvKiByYWluICovCisvKiBwLT5idWZfc3BlY19udW0gPSBmcy0+aW5kZXg7ICovCisJcC0+ZGF0YV9mbGFnID0gZGF0YV9mbGFnOworCWZzLT5kYXRhX2ZsYWcgfD0gZGF0YV9mbGFnOworCWZzLT5idWZfc3BlY19udW0gPSBwLT5idWZfc3BlY19udW07CisJZnMtPmNvbG9jYXRlZF9idWZfaW5kZXggPSBwLT5jb2xvY2F0ZWRfYnVmX2luZGV4OworI2VuZGlmCisJcC0+c2xpY2VfdHlwZSA9IHBfSDI2NF9EcGItPm1TbGljZS5zbGljZV90eXBlOworCXN3aXRjaCAocC0+c3RydWN0dXJlKSB7CisJY2FzZSBGUkFNRToKKwkJZnMtPmZyYW1lID0gcDsKKwkJZnMtPmlzX3VzZWQgPSAzOworCQlmcy0+c2xpY2VfdHlwZSA9IHAtPnNsaWNlX3R5cGU7CisJCWZzLT5mcmFtZV9zaXplID0gcC0+ZnJhbWVfc2l6ZTsKKwkJZnMtPm9mZnNldF9kZWxpbWl0ZXIgPSBwLT5vZmZzZXRfZGVsaW1pdGVyOworCQlmcy0+ZGVjb2RlZF9mcmFtZV9zaXplID0gcC0+cGljX3NpemU7CisJCWlmIChwLT51c2VkX2Zvcl9yZWZlcmVuY2UpIHsKKwkJCWZzLT5pc19yZWZlcmVuY2UgPSAzOworCQkJZnMtPmlzX29yaWdfcmVmZXJlbmNlID0gMzsKKwkJCWlmIChwLT5pc19sb25nX3Rlcm0pIHsKKwkJCQlmcy0+aXNfbG9uZ190ZXJtID0gMzsKKwkJCQlmcy0+bG9uZ190ZXJtX2ZyYW1lX2lkeCA9CisJCQkJCXAtPmxvbmdfdGVybV9mcmFtZV9pZHg7CisJCQl9CisJCX0KKwkJZnMtPnB0cyA9IHAtPnB0czsKKwkJZnMtPnB0czY0ID0gcC0+cHRzNjQ7CisJCWZzLT5sYXllcl9pZCA9IHAtPmxheWVyX2lkOworI2lmIChNVkNfRVhURU5TSU9OX0VOQUJMRSkKKwkJZnMtPnZpZXdfaWQgPSBwLT52aWV3X2lkOworCQlmcy0+aW50ZXJfdmlld19mbGFnWzBdID0gZnMtPmludGVyX3ZpZXdfZmxhZ1sxXSA9CisJCQlwLT5pbnRlcl92aWV3X2ZsYWc7CisJCWZzLT5hbmNob3JfcGljX2ZsYWdbMF0gPSBmcy0+YW5jaG9yX3BpY19mbGFnWzFdID0KKwkJCXAtPmFuY2hvcl9waWNfZmxhZzsKKyNlbmRpZgorCQkvKiBnZW5lcmF0ZSBmaWVsZCB2aWV3cyAqLworCQkvKiByZXR1cm47ICovCisJCWRwYl9zcGxpdF9maWVsZChwX0gyNjRfRHBiLCBmcyk7CisJCS8qIHJldHVybjsgKi8KKwkJYnJlYWs7CisJY2FzZSBUT1BfRklFTEQ6CisJCWZzLT50b3BfZmllbGQgPSBwOworCQlmcy0+aXNfdXNlZCB8PSAxOworCQlmcy0+bGF5ZXJfaWQgPSBwLT5sYXllcl9pZDsKKwkJaWYgKGZzLT5mcmFtZV9zaXplID09IDApIHsKKwkJCWZzLT5zbGljZV90eXBlID0gcC0+c2xpY2VfdHlwZTsKKy8vCQkJZnMtPnB0cyA9IHAtPnB0czsKKy8vCQkJZnMtPnB0czY0ID0gcC0+cHRzNjQ7CisJCX0KKwkJZnMtPmZyYW1lX3NpemUgKz0gcC0+ZnJhbWVfc2l6ZTsKKyNpZiAoTVZDX0VYVEVOU0lPTl9FTkFCTEUpCisJCWZzLT52aWV3X2lkID0gcC0+dmlld19pZDsKKwkJZnMtPmludGVyX3ZpZXdfZmxhZ1swXSA9IHAtPmludGVyX3ZpZXdfZmxhZzsKKwkJZnMtPmFuY2hvcl9waWNfZmxhZ1swXSA9IHAtPmFuY2hvcl9waWNfZmxhZzsKKyNlbmRpZgorCQlpZiAocC0+dXNlZF9mb3JfcmVmZXJlbmNlKSB7CisJCQlmcy0+aXNfcmVmZXJlbmNlIHw9IDE7CisJCQlmcy0+aXNfb3JpZ19yZWZlcmVuY2UgfD0gMTsKKwkJCWlmIChwLT5pc19sb25nX3Rlcm0pIHsKKwkJCQlmcy0+aXNfbG9uZ190ZXJtIHw9IDE7CisJCQkJZnMtPmxvbmdfdGVybV9mcmFtZV9pZHggPQorCQkJCQlwLT5sb25nX3Rlcm1fZnJhbWVfaWR4OworCQkJfQorCQl9CisJCWlmIChmcy0+aXNfdXNlZCA9PSAzKSB7CisJCQkvKiBnZW5lcmF0ZSBmcmFtZSB2aWV3ICovCisJCQlkcGJfY29tYmluZV9maWVsZChwX0gyNjRfRHBiLCBmcyk7CisJCX0gZWxzZSB7CisJCQlmcy0+cG9jID0gcC0+cG9jOworCQl9CisJCWdlbl9maWVsZF9yZWZfaWRzKHBfVmlkLCBwKTsKKwkJYnJlYWs7CisJY2FzZSBCT1RUT01fRklFTEQ6CisJCWZzLT5ib3R0b21fZmllbGQgPSBwOworCQlmcy0+aXNfdXNlZCB8PSAyOworCQlmcy0+bGF5ZXJfaWQgPSBwLT5sYXllcl9pZDsKKwkJaWYgKGZzLT5mcmFtZV9zaXplID09IDApIHsKKwkJCWZzLT5zbGljZV90eXBlID0gcC0+c2xpY2VfdHlwZTsKKy8vCQkJZnMtPnB0cyA9IHAtPnB0czsKKy8vCQkJZnMtPnB0czY0ID0gcC0+cHRzNjQ7CisJCX0KKwkJZnMtPmZyYW1lX3NpemUgKz0gcC0+ZnJhbWVfc2l6ZTsKKyNpZiAoTVZDX0VYVEVOU0lPTl9FTkFCTEUpCisJCWZzLT52aWV3X2lkID0gcC0+dmlld19pZDsKKwkJZnMtPmludGVyX3ZpZXdfZmxhZ1sxXSA9IHAtPmludGVyX3ZpZXdfZmxhZzsKKwkJZnMtPmFuY2hvcl9waWNfZmxhZ1sxXSA9IHAtPmFuY2hvcl9waWNfZmxhZzsKKyNlbmRpZgorCQlpZiAocC0+dXNlZF9mb3JfcmVmZXJlbmNlKSB7CisJCQlmcy0+aXNfcmVmZXJlbmNlIHw9IDI7CisJCQlmcy0+aXNfb3JpZ19yZWZlcmVuY2UgfD0gMjsKKwkJCWlmIChwLT5pc19sb25nX3Rlcm0pIHsKKwkJCQlmcy0+aXNfbG9uZ190ZXJtIHw9IDI7CisJCQkJZnMtPmxvbmdfdGVybV9mcmFtZV9pZHggPQorCQkJCQlwLT5sb25nX3Rlcm1fZnJhbWVfaWR4OworCQkJfQorCQl9CisJCWlmIChmcy0+aXNfdXNlZCA9PSAzKSB7CisJCQkvKiBnZW5lcmF0ZSBmcmFtZSB2aWV3ICovCisJCQlkcGJfY29tYmluZV9maWVsZChwX0gyNjRfRHBiLCBmcyk7CisJCX0gZWxzZSB7CisJCQlmcy0+cG9jID0gcC0+cG9jOworCQl9CisJCWdlbl9maWVsZF9yZWZfaWRzKHBfVmlkLCBwKTsKKwkJYnJlYWs7CisJfQorCWZzLT5mcmFtZV9udW0gPSBwLT5waWNfbnVtOworCWZzLT5yZWNvdmVyeV9mcmFtZSA9IHAtPnJlY292ZXJ5X2ZyYW1lOworCisJZnMtPmlzX291dHB1dCA9IHAtPmlzX291dHB1dDsKKwlmcy0+cHJlX291dHB1dCA9IHAtPnByZV9vdXRwdXQ7CisKKwkvKiBwaWN0dXJlIHFvcyBpbmZvbWF0aW9uKi8KKwlmcy0+bWF4X212ID0gcC0+bWF4X212OworCWZzLT5hdmdfbXYgPSBwLT5hdmdfbXY7CisJZnMtPm1pbl9tdiA9IHAtPm1pbl9tdjsKKworCWZzLT5tYXhfcXAgPSBwLT5tYXhfcXA7CisJZnMtPmF2Z19xcCA9IHAtPmF2Z19xcDsKKwlmcy0+bWluX3FwID0gcC0+bWluX3FwOworCisJZnMtPm1heF9za2lwID0gcC0+bWF4X3NraXA7CisJZnMtPmF2Z19za2lwID0gcC0+YXZnX3NraXA7CisJZnMtPm1pbl9za2lwID0gcC0+bWluX3NraXA7CisKKwlpZiAoZnMtPmlzX3VzZWQgPT0gMykgeworCQljYWxjdWxhdGVfZnJhbWVfbm8ocF9WaWQsIHApOworI2lmIDAKKy8qID8/PyAqLworCWlmICgtMSAhPSBwX1ZpZC0+cF9yZWYgJiYgIXBfSW5wLT5zaWxlbnQpCisJCWZpbmRfc25yKHBfVmlkLCBmcy0+ZnJhbWUsICZwX1ZpZC0+cF9yZWYpOworI2VuZGlmCisJLy9mcy0+cHRzID0gcC0+cHRzOworCS8vZnMtPnB0czY0ID0gcC0+cHRzNjQ7CisJfQorCWlmICgoZnMtPmZyYW1lICE9IE5VTEwpICYmCisJCSgoZnMtPmJvdHRvbV9maWVsZCAhPSBOVUxMKSB8fCAoZnMtPnRvcF9maWVsZCAhPSBOVUxMKSkpIHsKKwkJZnMtPmxhc3RfZmllbGRfdGltZXN0YW1wID0gZnMtPnRpbWVzdGFtcDsKKwkJZnMtPnRpbWVzdGFtcCA9IHAtPnRpbWVzdGFtcDsKKwl9IGVsc2UgeworCQlmcy0+dGltZXN0YW1wID0gcC0+dGltZXN0YW1wOworCX0KKwlpZiAobXZmcm0pIHsKKwkJZnMtPmZyYW1lX3NpemUyID0gbXZmcm0tPmZyYW1lX3NpemU7CisJCWZzLT5od19kZWNvZGVfdGltZSA9IG12ZnJtLT5od19kZWNvZGVfdGltZTsKKwl9Cit9CisKK3ZvaWQgcmVzZXRfZnJhbWVfc3RvcmUoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIsCisJCQkgICAgICBzdHJ1Y3QgRnJhbWVTdG9yZSAqZikKK3sKKwlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkiJXNcbiIsIF9fZnVuY19fKTsKKworCWlmIChmKSB7CisJCWlmIChmLT5mcmFtZSkgeworCQkJZnJlZV9waWN0dXJlKHBfSDI2NF9EcGIsIGYtPmZyYW1lKTsKKwkJCWYtPmZyYW1lID0gTlVMTDsKKwkJfQorCQlpZiAoZi0+dG9wX2ZpZWxkKSB7CisJCQlmcmVlX3BpY3R1cmUocF9IMjY0X0RwYiwgZi0+dG9wX2ZpZWxkKTsKKwkJCWYtPnRvcF9maWVsZCA9IE5VTEw7CisJCX0KKwkJaWYgKGYtPmJvdHRvbV9maWVsZCkgeworCQkJZnJlZV9waWN0dXJlKHBfSDI2NF9EcGIsIGYtPmJvdHRvbV9maWVsZCk7CisJCQlmLT5ib3R0b21fZmllbGQgPSBOVUxMOworCQl9CisKKwkJLyoqLworCQlmLT5pc191c2VkICAgICAgPSAwOworCQlmLT5pc19yZWZlcmVuY2UgPSAwOworCQlmLT5pc19sb25nX3Rlcm0gPSAwOworCQlmLT5pc19vcmlnX3JlZmVyZW5jZSA9IDA7CisKKwkJZi0+aXNfb3V0cHV0ID0gMDsKKwkJZi0+cHJlX291dHB1dCA9IDA7CisJCWYtPnNob3dfZnJhbWUgICA9IGZhbHNlOworCisJCWYtPmZyYW1lICAgICAgICA9IE5VTEw7CisJCWYtPnRvcF9maWVsZCAgICA9IE5VTEw7CisJCWYtPmJvdHRvbV9maWVsZCA9IE5VTEw7CisKKwkJLyogZnJlZShmKTsgKi8KKwl9Cit9CisKK3ZvaWQgdW5tYXJrX2Zvcl9yZWZlcmVuY2Uoc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYiwKKwkJCQkgc3RydWN0IEZyYW1lU3RvcmUgKmZzKQoreworCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gY29udGFpbmVyX29mKHBfRHBiLAorCQkJCXN0cnVjdCBoMjY0X2RwYl9zdHJ1LCBtRFBCKTsKKwlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkiJXMgJXAgJXAgJXAgJXBcbiIsIF9fZnVuY19fLAorCQlmcywgZnMtPmZyYW1lLCBmcy0+dG9wX2ZpZWxkLCBmcy0+Ym90dG9tX2ZpZWxkKTsKKwkvKiByZXR1cm47ICovCisJaWYgKGZzLT5pc191c2VkICYgMSkgeworCQlpZiAoZnMtPnRvcF9maWVsZCkKKwkJCWZzLT50b3BfZmllbGQtPnVzZWRfZm9yX3JlZmVyZW5jZSA9IDA7CisJfQorCWlmIChmcy0+aXNfdXNlZCAmIDIpIHsKKwkJaWYgKGZzLT5ib3R0b21fZmllbGQpCisJCQlmcy0+Ym90dG9tX2ZpZWxkLT51c2VkX2Zvcl9yZWZlcmVuY2UgPSAwOworCX0KKwlpZiAoZnMtPmlzX3VzZWQgPT0gMykgeworCQlpZiAoZnMtPnRvcF9maWVsZCAmJiBmcy0+Ym90dG9tX2ZpZWxkKSB7CisJCQlmcy0+dG9wX2ZpZWxkLT51c2VkX2Zvcl9yZWZlcmVuY2UgPSAwOworCQkJZnMtPmJvdHRvbV9maWVsZC0+dXNlZF9mb3JfcmVmZXJlbmNlID0gMDsKKwkJfQorCQlmcy0+ZnJhbWUtPnVzZWRfZm9yX3JlZmVyZW5jZSA9IDA7CisJfQorCisJZnMtPmlzX3JlZmVyZW5jZSA9IDA7CisKK30KKworc3RhdGljIHZvaWQgdW5tYXJrX2Zvcl9sb25nX3Rlcm1fcmVmZXJlbmNlKHN0cnVjdCBGcmFtZVN0b3JlICpmcykKK3sKKwlpZiAoZnMtPmlzX3VzZWQgJiAxKSB7CisJCWlmIChmcy0+dG9wX2ZpZWxkKSB7CisJCQlmcy0+dG9wX2ZpZWxkLT51c2VkX2Zvcl9yZWZlcmVuY2UgPSAwOworCQkJZnMtPnRvcF9maWVsZC0+aXNfbG9uZ190ZXJtID0gMDsKKwkJfQorCX0KKwlpZiAoZnMtPmlzX3VzZWQgJiAyKSB7CisJCWlmIChmcy0+Ym90dG9tX2ZpZWxkKSB7CisJCQlmcy0+Ym90dG9tX2ZpZWxkLT51c2VkX2Zvcl9yZWZlcmVuY2UgPSAwOworCQkJZnMtPmJvdHRvbV9maWVsZC0+aXNfbG9uZ190ZXJtID0gMDsKKwkJfQorCX0KKwlpZiAoZnMtPmlzX3VzZWQgPT0gMykgeworCQlpZiAoZnMtPnRvcF9maWVsZCAmJiBmcy0+Ym90dG9tX2ZpZWxkKSB7CisJCQlmcy0+dG9wX2ZpZWxkLT51c2VkX2Zvcl9yZWZlcmVuY2UgPSAwOworCQkJZnMtPnRvcF9maWVsZC0+aXNfbG9uZ190ZXJtID0gMDsKKwkJCWZzLT5ib3R0b21fZmllbGQtPnVzZWRfZm9yX3JlZmVyZW5jZSA9IDA7CisJCQlmcy0+Ym90dG9tX2ZpZWxkLT5pc19sb25nX3Rlcm0gPSAwOworCQl9CisJCWZzLT5mcmFtZS0+dXNlZF9mb3JfcmVmZXJlbmNlID0gMDsKKwkJZnMtPmZyYW1lLT5pc19sb25nX3Rlcm0gPSAwOworCX0KKworCWZzLT5pc19yZWZlcmVuY2UgPSAwOworCWZzLT5pc19sb25nX3Rlcm0gPSAwOworfQorCitpbnQgZ2V0X2xvbmdfdGVybV9mbGFnX2J5X2J1Zl9zcGVjX251bShzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiwKKwlpbnQgYnVmX3NwZWNfbnVtKQoreworCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIgPSAmcF9IMjY0X0RwYi0+bURQQjsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+dXNlZF9zaXplOyBpKyspIHsKKwkJaWYgKHBfRHBiLT5mc1tpXS0+YnVmX3NwZWNfbnVtID09IGJ1Zl9zcGVjX251bSkKKwkJCXJldHVybiBwX0RwYi0+ZnNbaV0tPmlzX2xvbmdfdGVybTsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfcGljX251bShzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgU2xpY2UgKmN1cnJTbGljZSA9ICZwX0gyNjRfRHBiLT5tU2xpY2U7CisJc3RydWN0IFZpZGVvUGFyYW1ldGVycyAqcF9WaWQgPSBjdXJyU2xpY2UtPnBfVmlkOworCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIgPSBjdXJyU2xpY2UtPnBfRHBiOworCXN0cnVjdCBTUFNQYXJhbWV0ZXJzICphY3RpdmVfc3BzID0gcF9WaWQtPmFjdGl2ZV9zcHM7CisJaW50IGFkZF90b3AgPSAwLCBhZGRfYm90dG9tID0gMDsKKwlpbnQgbWF4X2ZyYW1lX251bSA9IDEgPDwgKGFjdGl2ZV9zcHMtPmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgKyA0KTsKKworCWlmIChjdXJyU2xpY2UtPnN0cnVjdHVyZSA9PSBGUkFNRSkgeworCQlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnJlZl9mcmFtZXNfaW5fYnVmZmVyOyBpKyspIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0gPT0gTlVMTCB8fAorCQkJCXBfRHBiLT5mc19yZWZbaV0tPmZyYW1lID09IE5VTEwpIHsKKwkJCQlwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyA9IF9fTElORV9fOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmCisJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+aXNfdXNlZCA9PSAzKSB7CisJCQkJaWYgKChwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZS0+CisJCQkJCXVzZWRfZm9yX3JlZmVyZW5jZSkgJiYKKwkJCQkgICAgKCFwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZS0+CisJCQkJCWlzX2xvbmdfdGVybSkpIHsKKwkJCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0tPmZyYW1lX251bSA+CisJCQkJCQljdXJyU2xpY2UtPmZyYW1lX251bSkgeworCQkJCQkJcF9EcGItPmZzX3JlZltpXS0+CisJCQkJCQlmcmFtZV9udW1fd3JhcCA9CisJCQkJCQlwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZV9udW0KKwkJCQkJCQktIG1heF9mcmFtZV9udW07CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwX0RwYi0+ZnNfcmVmW2ldLT4KKwkJCQkJCWZyYW1lX251bV93cmFwID0KKwkJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmZyYW1lX251bTsKKwkJCQkJfQorCQkJCQlwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZS0+cGljX251bSA9CisJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmZyYW1lX251bV93cmFwOworCQkJCX0KKwkJCX0KKwkJfQorCQkvKiB1cGRhdGUgbG9uZ190ZXJtX3BpY19udW0gKi8KKwkJZm9yIChpID0gMDsgaSA8IHBfRHBiLT5sdHJlZl9mcmFtZXNfaW5fYnVmZmVyOyBpKyspIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJaWYgKHBfRHBiLT5mc19sdHJlZltpXSA9PSBOVUxMIHx8CisJCQkJcF9EcGItPmZzX2x0cmVmW2ldLT5mcmFtZSA9PSBOVUxMKSB7CisJCQkJcF9IMjY0X0RwYi0+ZHBiX2Vycm9yX2ZsYWcgPSBfX0xJTkVfXzsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNlbmRpZgorCQkJaWYgKHBfRHBiLT5mc19sdHJlZltpXS0+aXNfdXNlZCA9PSAzKSB7CisJCQkJaWYgKHBfRHBiLT5mc19sdHJlZltpXS0+ZnJhbWUtPmlzX2xvbmdfdGVybSkgeworCQkJCQlwX0RwYi0+ZnNfbHRyZWZbaV0tPmZyYW1lLT4KKwkJCQkJCWxvbmdfdGVybV9waWNfbnVtID0KKwkJCQkJCXBfRHBiLT5mc19sdHJlZltpXS0+ZnJhbWUtPgorCQkJCQkJCWxvbmdfdGVybV9mcmFtZV9pZHg7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWYgKGN1cnJTbGljZS0+c3RydWN0dXJlID09IFRPUF9GSUVMRCkgeworCQkJYWRkX3RvcCAgICA9IDE7CisJCQlhZGRfYm90dG9tID0gMDsKKwkJfSBlbHNlIHsKKwkJCWFkZF90b3AgICAgPSAwOworCQkJYWRkX2JvdHRvbSA9IDE7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnJlZl9mcmFtZXNfaW5fYnVmZmVyOyBpKyspIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0gPT0gTlVMTCkgeworCQkJCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnID0gX19MSU5FX187CisJCQkJY29udGludWU7CisJCQl9CisjZW5kaWYKKwkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldLT5pc19yZWZlcmVuY2UpIHsKKwkJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+ZnJhbWVfbnVtID4gY3VyclNsaWNlLT4KKwkJCQkJZnJhbWVfbnVtKSB7CisJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmZyYW1lX251bV93cmFwID0KKwkJCQkJcF9EcGItPmZzX3JlZltpXS0+ZnJhbWVfbnVtIC0KKwkJCQkJbWF4X2ZyYW1lX251bTsKKwkJCQl9IGVsc2UgeworCQkJCQlwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZV9udW1fd3JhcCA9CisJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmZyYW1lX251bTsKKwkJCQl9CisJCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0tPmlzX3JlZmVyZW5jZSAmIDEpIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkCisJCQkJCQk9PSBOVUxMKSB7CisJCQkJCQlwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyA9CisJCQkJCQkJX19MSU5FX187CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorI2VuZGlmCisJCQkJCXBfRHBiLT5mc19yZWZbaV0tPnRvcF9maWVsZC0+CisJCQkJCXBpY19udW0gPSAoMiAqIHBfRHBiLT5mc19yZWZbaV0tPgorCQkJCQkJZnJhbWVfbnVtX3dyYXApICsgYWRkX3RvcDsKKwkJCQl9CisJCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0tPmlzX3JlZmVyZW5jZSAmIDIpIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+Ym90dG9tX2ZpZWxkCisJCQkJCQk9PSBOVUxMKSB7CisJCQkJCQlwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyA9CisJCQkJCQkJX19MSU5FX187CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorI2VuZGlmCisJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmJvdHRvbV9maWVsZC0+CisJCQkJCXBpY19udW0gPSAoMiAqIHBfRHBiLT5mc19yZWZbaV0tPgorCQkJCQkJZnJhbWVfbnVtX3dyYXApICsgYWRkX2JvdHRvbTsKKwkJCQl9CisJCQl9CisJCX0KKwkJLyogdXBkYXRlIGxvbmdfdGVybV9waWNfbnVtICovCisJCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+bHRyZWZfZnJhbWVzX2luX2J1ZmZlcjsgaSsrKSB7CisjaWZkZWYgRVJST1JfQ0hFQ0sKKwkJCWlmIChwX0RwYi0+ZnNfbHRyZWZbaV0gPT0gTlVMTCkgeworCQkJCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnID0gX19MSU5FX187CisJCQkJY29udGludWU7CisJCQl9CisjZW5kaWYKKwkJCWlmIChwX0RwYi0+ZnNfbHRyZWZbaV0tPmlzX2xvbmdfdGVybSAmIDEpIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJCWlmIChwX0RwYi0+ZnNfbHRyZWZbaV0tPnRvcF9maWVsZCA9PSBOVUxMKSB7CisJCQkJCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnID0gX19MSU5FX187CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKyNlbmRpZgorCQkJCXBfRHBiLT5mc19sdHJlZltpXS0+dG9wX2ZpZWxkLT4KKwkJCQkJbG9uZ190ZXJtX3BpY19udW0gPSAyICoKKwkJCQkJcF9EcGItPmZzX2x0cmVmW2ldLT50b3BfZmllbGQtPgorCQkJCQlsb25nX3Rlcm1fZnJhbWVfaWR4ICsgYWRkX3RvcDsKKwkJCX0KKwkJCWlmIChwX0RwYi0+ZnNfbHRyZWZbaV0tPmlzX2xvbmdfdGVybSAmIDIpIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJCWlmIChwX0RwYi0+ZnNfbHRyZWZbaV0tPmJvdHRvbV9maWVsZCA9PSBOVUxMKSB7CisJCQkJCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnID0gX19MSU5FX187CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKyNlbmRpZgorCQkJCXBfRHBiLT5mc19sdHJlZltpXS0+Ym90dG9tX2ZpZWxkLT4KKwkJCQkJbG9uZ190ZXJtX3BpY19udW0gPSAyICoKKwkJCQkJcF9EcGItPmZzX2x0cmVmW2ldLT5ib3R0b21fZmllbGQtPgorCQkJCQlsb25nX3Rlcm1fZnJhbWVfaWR4ICsgYWRkX2JvdHRvbTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2ZyYW1lX2Zyb21fZHBiKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLCBpbnQgcG9zKQoreworCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIgPSAmcF9IMjY0X0RwYi0+bURQQjsKKwlzdHJ1Y3QgRnJhbWVTdG9yZSAqZnMgPSBwX0RwYi0+ZnNbcG9zXTsKKwlzdHJ1Y3QgRnJhbWVTdG9yZSAqdG1wOworCXVuc2lnbmVkIGludCBpOworCisJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJIiVzIHBvcyAlZCAlcFxuIiwgX19mdW5jX18sIHBvcywgZnMpOworCisJLyogZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkgKgkicmVtb3ZlIGZyYW1lIHdpdGggZnJhbWVfbnVtICMlZFxuIiwgZnMtPmZyYW1lX251bSk7CisJICovCisJc3dpdGNoIChmcy0+aXNfdXNlZCkgeworCWNhc2UgMzoKKwkJZnJlZV9waWN0dXJlKHBfSDI2NF9EcGIsIGZzLT5mcmFtZSk7CisJCWZyZWVfcGljdHVyZShwX0gyNjRfRHBiLCBmcy0+dG9wX2ZpZWxkKTsKKwkJZnJlZV9waWN0dXJlKHBfSDI2NF9EcGIsIGZzLT5ib3R0b21fZmllbGQpOworCQlmcy0+ZnJhbWUgPSBOVUxMOworCQlmcy0+dG9wX2ZpZWxkID0gTlVMTDsKKwkJZnMtPmJvdHRvbV9maWVsZCA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJZnJlZV9waWN0dXJlKHBfSDI2NF9EcGIsIGZzLT5ib3R0b21fZmllbGQpOworCQlmcy0+Ym90dG9tX2ZpZWxkID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlmcmVlX3BpY3R1cmUocF9IMjY0X0RwYiwgZnMtPnRvcF9maWVsZCk7CisJCWZzLT50b3BfZmllbGQgPSBOVUxMOworCQlicmVhazsKKwljYXNlIDA6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkgICJpbnZhbGlkIGZyYW1lIHN0b3JlIHR5cGUgJXgiLCA1MDApOworCX0KKwlmcy0+ZGF0YV9mbGFnID0gMDsKKwlmcy0+aXNfdXNlZCA9IDA7CisJZnMtPmlzX2xvbmdfdGVybSA9IDA7CisJZnMtPmlzX3JlZmVyZW5jZSA9IDA7CisJZnMtPmlzX29yaWdfcmVmZXJlbmNlID0gMDsKKwlmcy0+ZnJhbWVfc2l6ZSA9IDA7CisJLyogbW92ZSBlbXB0eSBmcmFtZXN0b3JlIHRvIGVuZCBvZiBidWZmZXIgKi8KKwl0bXAgPSBwX0RwYi0+ZnNbcG9zXTsKKworCWZvciAoaSA9IHBvczsgaSA8IHBfRHBiLT51c2VkX3NpemUgLSAxOyBpKyspCisJCXBfRHBiLT5mc1tpXSA9IHBfRHBiLT5mc1tpICsgMV07CisJcF9EcGItPmZzW3BfRHBiLT51c2VkX3NpemUgLSAxXSA9IHRtcDsKKworCWlmIChwX0RwYi0+dXNlZF9zaXplKQorCQlwX0RwYi0+dXNlZF9zaXplLS07Cit9CisKK2ludCBpc191c2VkX2Zvcl9yZWZlcmVuY2Uoc3RydWN0IEZyYW1lU3RvcmUgKmZzKQoreworCWlmIChmcy0+aXNfcmVmZXJlbmNlKQorCQlyZXR1cm4gMTsKKworCWlmIChmcy0+aXNfdXNlZCA9PSAzKSB7IC8qIGZyYW1lICovCisJCWlmIChmcy0+ZnJhbWUtPnVzZWRfZm9yX3JlZmVyZW5jZSkKKwkJCXJldHVybiAxOworCX0KKworCWlmIChmcy0+aXNfdXNlZCAmIDEpIHsgLyogdG9wIGZpZWxkICovCisJCWlmIChmcy0+dG9wX2ZpZWxkKSB7CisJCQlpZiAoZnMtPnRvcF9maWVsZC0+dXNlZF9mb3JfcmVmZXJlbmNlKQorCQkJCXJldHVybiAxOworCQl9CisJfQorCisJaWYgKGZzLT5pc191c2VkICYgMikgeyAvKiBib3R0b20gZmllbGQgKi8KKwkJaWYgKGZzLT5ib3R0b21fZmllbGQpIHsKKwkJCWlmIChmcy0+Ym90dG9tX2ZpZWxkLT51c2VkX2Zvcl9yZWZlcmVuY2UpCisJCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVtb3ZlX3VudXNlZF9mcmFtZV9mcm9tX2RwYihzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiID0gJnBfSDI2NF9EcGItPm1EUEI7CisJLyogY2hlY2sgZm9yIGZyYW1lcyB0aGF0IHdlcmUgYWxyZWFkeSBvdXRwdXQgYW5kIG5vIGxvbmdlcgorCSAqCXVzZWQgZm9yIHJlZmVyZW5jZQorCSAqLworCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+dXNlZF9zaXplOyBpKyspIHsKKwkJaWYgKCghaXNfdXNlZF9mb3JfcmVmZXJlbmNlKHBfRHBiLT5mc1tpXSkpICYmCisJCSAgICAocF9EcGItPmZzW2ldLT5jb2xvY2F0ZWRfYnVmX2luZGV4ID49IDApKSB7CisJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSJyZWxlYXNlX2NvbG9jYXRlX2J1ZlslZF0gZm9yIGZzWyVkXVxuIiwKKwkJCXBfRHBiLT5mc1tpXS0+Y29sb2NhdGVkX2J1Zl9pbmRleCwgaSk7CisKKwkJCXJlbGVhc2VfY29sb2NhdGVfYnVmKHBfSDI2NF9EcGIsCisJCQkJcF9EcGItPmZzW2ldLT5jb2xvY2F0ZWRfYnVmX2luZGV4KTsgLyogcmFpbiAqLworCQkJcF9EcGItPmZzW2ldLT5jb2xvY2F0ZWRfYnVmX2luZGV4ID0gLTE7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnVzZWRfc2l6ZTsgaSsrKSB7CisJCWlmIChwX0RwYi0+ZnNbaV0tPmlzX291dHB1dCAmJgorCQkJKCFpc191c2VkX2Zvcl9yZWZlcmVuY2UocF9EcGItPmZzW2ldKSkpIHsKKwkJCXJlbGVhc2VfYnVmX3NwZWNfbnVtKHBfSDI2NF9EcGItPnZkZWMsCisJCQkJcF9EcGItPmZzW2ldLT5idWZfc3BlY19udW0pOworCQkJcF9EcGItPmZzW2ldLT5idWZfc3BlY19udW0gPSAtMTsKKwkJCXJlbW92ZV9mcmFtZV9mcm9tX2RwYihwX0gyNjRfRHBiLCBpKTsKKworCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLCAiJXNbJWRdXG4iLAorCQkJCV9fZnVuY19fLCBpKTsKKworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdW5tYXJrX29uZV9lcnJvcl9vdXRfZnJhbWUoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIpCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgaTsKKwlzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiID0gJnBfSDI2NF9EcGItPm1EUEI7CisKKwlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnVzZWRfc2l6ZTsgaSsrKSB7CisJCWlmIChwX0RwYi0+ZnNbaV0tPmlzX291dHB1dCAmJgorCQkJKChwX0RwYi0+ZnNbaV0tPmRhdGFfZmxhZyAmIEVSUk9SX0ZMQUcpIHx8CisJCQkocF9EcGItPmZzW2ldLT5kYXRhX2ZsYWcgJiBOVUxMX0ZMQUcpKQorCQkJKSB7CisJCQl1bm1hcmtfZm9yX3JlZmVyZW5jZShwX0RwYiwgcF9EcGItPmZzW2ldKTsKKworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdW5tYXJrX29uZV9vdXRfZnJhbWUoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIpCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgaTsKKwlzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiID0gJnBfSDI2NF9EcGItPm1EUEI7CisKKwlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnVzZWRfc2l6ZTsgaSsrKSB7CisJCWlmIChwX0RwYi0+ZnNbaV0tPmlzX291dHB1dCkgeworCQkJdW5tYXJrX2Zvcl9yZWZlcmVuY2UocF9EcGIsIHBfRHBiLT5mc1tpXSk7CisKKwkJCXJldCA9IDE7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKy8qCisJZm9yY2VfZmxhZywKKwkJMSwgcmVtb3ZlIG9uZSBlcnJvciBidWYgKGlzX291dCBpcyAxKSBpZiB0aGVyZSBpcyBubyB1bi11c2VkIGJ1ZgorCQkyLCByZW1vdmUgb25lIGJ1ZiAoaXNfb3V0IGlzIDEpIGlmIHRoZXJlIGlzIG5vIHVuLXVzZWQgYnVmCisqLwordm9pZCBidWZtZ3JfaDI2NF9yZW1vdmVfdW51c2VkX2ZyYW1lKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLAorCXU4IGZvcmNlX2ZsYWcpCit7CisJc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYiA9ICZwX0gyNjRfRHBiLT5tRFBCOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGNoYXIgcmVtb3ZlZF9mbGFnID0gMDsKKwlkbyB7CisJCXJldCA9IHJlbW92ZV91bnVzZWRfZnJhbWVfZnJvbV9kcGIocF9IMjY0X0RwYik7CisJCWlmIChyZXQgIT0gMCkKKwkJCXJlbW92ZWRfZmxhZyA9IDE7CisJfSB3aGlsZSAocmV0ICE9IDApOworCWlmIChyZW1vdmVkX2ZsYWcpIHsKKwkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsICIlc1xyXG4iLCBfX2Z1bmNfXyk7CisJCWR1bXBfZHBiKHBfRHBiLCAwKTsKKwl9IGVsc2UgaWYgKGZvcmNlX2ZsYWcgPT0gMikgeworCQlpZiAodW5tYXJrX29uZV9vdXRfZnJhbWUocF9IMjY0X0RwYikpIHsKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCTAsICIlcywgV2Fybm5pbmcsIGZvcmNlIHVubWFyayBvbmUgZnJhbWVcclxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQl1cGRhdGVfcmVmX2xpc3QocF9EcGIpOworCQkJcmVtb3ZlX3VudXNlZF9mcmFtZV9mcm9tX2RwYihwX0gyNjRfRHBiKTsKKwkJCWR1bXBfZHBiKHBfRHBiLCAwKTsKKwkJfQorCX0gZWxzZSBpZiAoZm9yY2VfZmxhZyA9PSAxKSB7CisJCWlmICh1bm1hcmtfb25lX2Vycm9yX291dF9mcmFtZShwX0gyNjRfRHBiKSkgeworCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJMCwgIiVzLCB1bm1hcmsgZXJyb3IgZnJhbWVcclxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQl1cGRhdGVfcmVmX2xpc3QocF9EcGIpOworCQkJcmVtb3ZlX3VudXNlZF9mcmFtZV9mcm9tX2RwYihwX0gyNjRfRHBiKTsKKwkJCWR1bXBfZHBiKHBfRHBiLCAwKTsKKwkJfQorCX0KK30KKworI2lmZGVmIE9VVFBVVF9CVUZGRVJfSU5fQworaW50IGlzX3RoZXJlX3VudXNlZF9mcmFtZV9mcm9tX2RwYihzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiKQoreworCXVuc2lnbmVkIGludCBpOworCisJLyogY2hlY2sgZm9yIGZyYW1lcyB0aGF0IHdlcmUgYWxyZWFkeSBvdXRwdXQgYW5kIG5vIGxvbmdlcgorCSAqIHVzZWQgZm9yIHJlZmVyZW5jZQorCSAqLworCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+dXNlZF9zaXplOyBpKyspIHsKKwkJaWYgKHBfRHBiLT5mc1tpXS0+aXNfb3V0cHV0ICYmCisJCQkoIWlzX3VzZWRfZm9yX3JlZmVyZW5jZShwX0RwYi0+ZnNbaV0pKSkgeworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgZ2V0X3NtYWxsZXN0X3BvYyhzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiLCBpbnQgKnBvYywKKwkJCSAgICAgaW50ICpwb3MpCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9IGNvbnRhaW5lcl9vZihwX0RwYiwKKwkJCQlzdHJ1Y3QgaDI2NF9kcGJfc3RydSwgbURQQik7CisJc3RydWN0IHZkZWNfcyAqdmRlYz0gKHN0cnVjdCB2ZGVjX3MgKilwX0gyNjRfRHBiLT52ZGVjOworCXZvaWQgKnAgPSB2aDI2NF9nZXRfYnVmc3BlY19sb2NrKHZkZWMpOworCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsICIlc1xuIiwgX19mdW5jX18pOworCWlmIChwX0RwYi0+dXNlZF9zaXplIDwgMSkgeworCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJICAiQ2Fubm90IGRldGVybWluZSBzbWFsbGVzdCBQT0MsIERQQiBlbXB0eS4gJWRcbiIsCisJCQkgMTUwKTsKKwl9CisKKwkqcG9zID0gLTE7CisJKnBvYyA9IElOVF9NQVg7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuOworCXNwaW5fbG9ja19pcnFzYXZlKHAsIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnVzZWRfc2l6ZTsgaSsrKSB7CisjaWZkZWYgT1VUUFVUX0JVRkZFUl9JTl9DCisJCS8qIHJhaW4gKi8KKwkJaWYgKCgqcG9jID4gcF9EcGItPmZzW2ldLT5wb2MpICYmCisJCQkoIXBfRHBiLT5mc1tpXS0+aXNfb3V0cHV0KSAmJgorCQkJKCFwX0RwYi0+ZnNbaV0tPnByZV9vdXRwdXQpKSB7CisjZWxzZQorCQlpZiAoKCpwb2MgPiBwX0RwYi0+ZnNbaV0tPnBvYykgJiYgKCFwX0RwYi0+ZnNbaV0tPmlzX291dHB1dCkpIHsKKyNlbmRpZgorCQkJKnBvYyA9IHBfRHBiLT5mc1tpXS0+cG9jOworCQkJKnBvcyA9IGk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShwLCBmbGFncyk7Cit9CisKK2ludCBvdXRwdXRfZnJhbWVzKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLCB1bnNpZ25lZCBjaGFyIGZsdXNoX2ZsYWcpCit7CisJaW50IHBvYywgcG9zOworCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIgPSAmcF9IMjY0X0RwYi0+bURQQjsKKwlpbnQgaTsKKwlpbnQgbm9uZV9kaXNwbGF5ZWRfbnVtID0gMDsKKwl1bnNpZ25lZCBjaGFyIGZhc3Rfb3V0cHV0X2ZsYWcgPSAwOworCisJLyoKKwkgKiBXaGVuIHRoZSBzZWkgZGF0YShkdiBkYXRhKSBhZnRlciB0aGUgUElDIGRvbmUgYW5kIG5vIGZsdXNoLAorCSAqIGl0IGlzIG5lY2Vzc2FyeSB0byBvdXRwdXQgYSBmcmFtZSBvZiBkYXRhIHVudGlsCisJICogdGhlIG51bWJlciBvZiBmcmFtZXMgbm90IGRpc3BsYXllZCBpcyBncmVhdGVyIHRoYW4gdGhlIHJlb3JkZXIuCisJICovCisJaWYgKChwX0gyNjRfRHBiLT53YWl0X2F1eF9kYXRhX2ZsYWcpICYmICghZmx1c2hfZmxhZykpIHsKKwkJaW50IG5vX291dHB1dF9udW0gPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+dXNlZF9zaXplOyBpKyspIHsKKwkJCWlmICgoIXBfRHBiLT5mc1tpXS0+aXNfb3V0cHV0KSAmJgorCQkJCSghcF9EcGItPmZzW2ldLT5wcmVfb3V0cHV0KSAmJgorCQkJCSgocF9EcGItPmZzW2ldLT5pc191c2VkID09IDMpIHx8CisJCQkJKHBfRHBiLT5mc1tpXS0+ZGF0YV9mbGFnICYgRVJST1JfRkxBRykpKQorCQkJCW5vX291dHB1dF9udW0rKzsKKwkJfQorCisJCWlmIChub19vdXRwdXRfbnVtIDw9IHBfSDI2NF9EcGItPnJlb3JkZXJfb3V0cHV0KQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFmbHVzaF9mbGFnKSB7CisJCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+dXNlZF9zaXplOyBpKyspIHsKKwkJCWlmICgoIXBfRHBiLT5mc1tpXS0+aXNfb3V0cHV0KSAmJgorCQkJCSghcF9EcGItPmZzW2ldLT5wcmVfb3V0cHV0KSAmJigocF9EcGItPmZzW2ldLT5pc191c2VkID09IDMKKwkJCQl8fHBfRHBiLT5mc1tpXS0+ZGF0YV9mbGFnICYgRVJST1JfRkxBRyApKSkgIHsKKwkJCQlub25lX2Rpc3BsYXllZF9udW0rKzsKKwkJCQlpZiAoKHBfSDI2NF9EcGItPmZpcnN0X2luc2VydF9mcmFtZSA9PSBGaXJzdEluc2VydEZybV9JRExFIHx8CisJCQkJCXBfSDI2NF9EcGItPmZpcnN0X2luc2VydF9mcmFtZSA9PSBGaXJzdEluc2VydEZybV9SRVNFVCkKKwkJCQkJJiYgIChwX0RwYi0+ZnNbaV0tPmlzX3VzZWQgPT0gMykKKwkJCQkJJiYgKHBfRHBiLT5sYXN0X291dHB1dF9wb2MgPT0gSU5UX01JTikpIHsKKwkJCQkJaWYgKHBfSDI2NF9EcGItPmZpcnN0X2luc2VydF9mcmFtZSA9PSBGaXJzdEluc2VydEZybV9JRExFKQorCQkJCQkJZmFzdF9vdXRwdXRfZmxhZyA9IDE7CisJCQkJCXBfSDI2NF9EcGItPmZpcnN0X2luc2VydF9mcmFtZSA9IEZpcnN0SW5zZXJ0RnJtX09VVDsKKwkJCQkJcF9IMjY0X0RwYi0+Zmlyc3Rfb3V0cHV0X3BvYyA9IHBfRHBiLT5mc1tpXS0+cG9jOworCQkJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJCQkJIiVzIGZpcnN0IGluc2VydCBmcmFtZSBpICVkICBwb2MgJWQgZnJhbWVfbnVtICV4XG4iLAorCQkJCQkJX19mdW5jX18sIGksIHBfRHBiLT5mc1tpXS0+cG9jLCAgcF9EcGItPmZzW2ldLT5mcmFtZV9udW0pOworCQkJCX0KKworCQkJCS8qY2hlY2sgcG9jIGV2ZW4vb2RkKi8KKwkJCQlpZiAocF9IMjY0X0RwYi0+cG9jX2V2ZW5fb2RkX2ZsYWcgPT0gMCAmJgorCQkJCQlwX0gyNjRfRHBiLT5kZWNvZGVfcGljX2NvdW50ID49IDMpCisJCQkJCXBfSDI2NF9EcGItPnBvY19ldmVuX29kZF9mbGFnID0gMjsKKwkJCQlpZiAocF9EcGItPmZzW2ldLT5wb2MgJiAweDEpCisJCQkJCXBfSDI2NF9EcGItPnBvY19ldmVuX29kZF9mbGFnID0gMTsKKwkJCQkvKiovCisKKwkJCQlpZiAoKHBfSDI2NF9EcGItPmZhc3Rfb3V0cHV0X2VuYWJsZSAmIDB4MSkgJiYKKwkJCQkJKHBfRHBiLT5mc1tpXS0+ZGF0YV9mbGFnICYgSURSX0ZMQUcpKQorCQkJCQlmYXN0X291dHB1dF9mbGFnID0gMTsKKwkJCQlpZiAoKHBfSDI2NF9EcGItPmZhc3Rfb3V0cHV0X2VuYWJsZSAmIDB4MikgJiYKKwkJCQkJKChwX0RwYi0+ZnNbaV0tPnBvYyAtCisJCQkJCQlwX0RwYi0+bGFzdF9vdXRwdXRfcG9jKQorCQkJCQk9PSAxKSkKKwkJCQkJZmFzdF9vdXRwdXRfZmxhZyA9IDE7CisJCQkJaWYgKChwX0gyNjRfRHBiLT5mYXN0X291dHB1dF9lbmFibGUgJiAweDQpICYmCisJCQkJCShwX0gyNjRfRHBiLT5wb2NfZXZlbl9vZGRfZmxhZyA9PSAyKSAmJgorCQkJCQkgKHBfRHBiLT5mc1tpXS0+aXNfdXNlZCA9PSAzKSAmJgorCQkJCQkoKHBfRHBiLT5mc1tpXS0+cG9jIC0KKwkJCQkJCXBfRHBiLT5sYXN0X291dHB1dF9wb2MpCisJCQkJCT09IDIpKQorCQkJCQlmYXN0X291dHB1dF9mbGFnID0gMTsKKwkJCX0KKwkJfQorCQlpZiAoZmFzdF9vdXRwdXRfZmxhZykKKwkJCTsKKwkJZWxzZSBpZiAobm9uZV9kaXNwbGF5ZWRfbnVtIDwKKwkJCXBfSDI2NF9EcGItPnJlb3JkZXJfb3V0cHV0KQorCQkJcmV0dXJuIDA7CisJfQorCisJZ2V0X3NtYWxsZXN0X3BvYyhwX0RwYiwgJnBvYywgJnBvcyk7CisKKwlpZiAocG9zID09IC0xKQorCQlyZXR1cm4gMDsKKyNpZiAwCisJaWYgKGlzX3VzZWRfZm9yX3JlZmVyZW5jZShwX0RwYi0+ZnNbcG9zXSkpCisJCXJldHVybiAwOworI2VuZGlmCisJaWYgKHBfSDI2NF9EcGItPmZpcnN0X2luc2VydF9mcmFtZSA9PSBGaXJzdEluc2VydEZybV9PVVQpIHsKKwkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSIlcyBwb3MgJWQgcG9zLT5wb2MgJWQgIGZpcnN0X291dHB1dF9wb2MgJWQgXG4iLAorCQkJX19mdW5jX18sIHBvcywgcF9EcGItPmZzW3Bvc10tPnBvYywgcF9IMjY0X0RwYi0+Zmlyc3Rfb3V0cHV0X3BvYyk7CisKKwkJaWYgKHBfRHBiLT5mc1twb3NdLT5wb2MgPCBwX0gyNjRfRHBiLT5maXJzdF9vdXRwdXRfcG9jKQorCQkJcF9EcGItPmZzW3Bvc10tPmRhdGFfZmxhZyB8PSBOT0RJU1BfRkxBRzsKKwkJZWxzZSBpZiAocF9EcGItPmxhc3Rfb3V0cHV0X3BvYyAhPSBJTlRfTUlOKQorCQkJcF9IMjY0X0RwYi0+Zmlyc3RfaW5zZXJ0X2ZyYW1lID0gRmlyc3RJbnNlcnRGcm1fU0tJUERPTkU7CisKKwkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSIlcyBmaXJzdF9pbnNlcnRfZnJhbWUgJWQgXG4iLCBfX2Z1bmNfXywgcF9IMjY0X0RwYi0+Zmlyc3RfaW5zZXJ0X2ZyYW1lKTsKKwl9CisJaWYgKHByZXBhcmVfZGlzcGxheV9idWYocF9IMjY0X0RwYi0+dmRlYywgcF9EcGItPmZzW3Bvc10pID49IDApIHsKKwkJaWYgKCFwX0gyNjRfRHBiLT53aXRob3V0X2Rpc3BsYXlfbW9kZSAmJgorCQkJCXBfRHBiLT5mc1twb3NdLT5zaG93X2ZyYW1lICE9IGZhbHNlKQorCQkJcF9EcGItPmZzW3Bvc10tPnByZV9vdXRwdXQgPSAxOworCX0gZWxzZSB7CisJCWlmIChoMjY0X2RlYnVnX2ZsYWcgJiBQUklOVF9GTEFHX0RQQl9ERVRBSUwpIHsKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCAwLAorCQkJIiVzWyVkXSBwb2M6JWQgbGFzdF9vdXRwdXRfcG9jOiVkIHBvY19ldmVuX29kZF9mbGFnOiVkXG4iLAorCQkJX19mdW5jX18sIHBvcywgcG9jLAorCQkJcF9EcGItPmxhc3Rfb3V0cHV0X3BvYywKKwkJCXBfSDI2NF9EcGItPnBvY19ldmVuX29kZF9mbGFnKTsKKwkJCWR1bXBfZHBiKHBfRHBiLCAxKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJIiVzWyVkXSBwb2MgJWQgbGFzdF9vdXRwdXRfcG9jICVkIHBvY19ldmVuX29kZF9mbGFnICVkXG4iLAorCQlfX2Z1bmNfXywgcG9zLCBwb2MsCisJCXBfRHBiLT5sYXN0X291dHB1dF9wb2MsCisJCXBfSDI2NF9EcGItPnBvY19ldmVuX29kZF9mbGFnKTsKKworCXBfRHBiLT5sYXN0X291dHB1dF9wb2MgPSBwb2M7CisJcmV0dXJuIDE7CisKK30KKworCit2b2lkIGZsdXNoX2RwYihzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYikKK3sKKwkvKiBzdHJ1Y3QgVmlkZW9QYXJhbWV0ZXJzICpwX1ZpZCA9IHBfRHBiLT5wX1ZpZDsgKi8KKwlzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiID0gJnBfSDI2NF9EcGItPm1EUEI7CisJdW5zaWduZWQgaW50IGk7CisKKwlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkiJXNcbiIsIF9fZnVuY19fKTsKKworCS8qIGRpYWdub3N0aWNzICovCisJLyogZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJICpQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJICoiRmx1c2ggcmVtYWluaW5nIGZyYW1lcyBmcm9tIHRoZSBkcGIuIgorCSAqInBfRHBiLT5zaXplID0gJWQsIHBfRHBiLT51c2VkX3NpemUgPSAlZFxuIiwKKwkgKnBfRHBiLT5zaXplLCBwX0RwYi0+dXNlZF9zaXplKTsKKwkgKi8KKworCWlmICghcF9EcGItPmluaXRfZG9uZSkKKwkJcmV0dXJuOworLyogIGlmKHBfVmlkLT5jb25jZWFsX21vZGUgPT0gMCkgKi8KKyNpZiAwCisvKiA/Pz8gKi8KKwlpZiAocF9WaWQtPmNvbmNlYWxfbW9kZSAhPSAwKQorCQljb25jZWFsX25vbl9yZWZfcGljcyhwX0RwYiwgMCk7CisjZW5kaWYKKwkvKiBtYXJrIGFsbCBmcmFtZXMgdW51c2VkICovCisJZm9yIChpID0gMDsgaSA8IHBfRHBiLT51c2VkX3NpemU7IGkrKykgeworI2lmIE1WQ19FWFRFTlNJT05fRU5BQkxFCisJCWFzc2VydChwX0RwYi0+ZnNbaV0tPnZpZXdfaWQgPT0gcF9EcGItPmxheWVyX2lkKTsKKyNlbmRpZgorCQl1bm1hcmtfZm9yX3JlZmVyZW5jZShwX0RwYiwgcF9EcGItPmZzW2ldKTsKKworCX0KKworCXdoaWxlIChyZW1vdmVfdW51c2VkX2ZyYW1lX2Zyb21fZHBiKHBfSDI2NF9EcGIpKQorCQk7CisKKwkvKiBvdXRwdXQgZnJhbWVzIGluIFBPQyBvcmRlciAqLworCXdoaWxlIChvdXRwdXRfZnJhbWVzKHBfSDI2NF9EcGIsIDEpKQorCQk7CisKKworCXBfRHBiLT5sYXN0X291dHB1dF9wb2MgPSBJTlRfTUlOOworfQorCitzdGF0aWMgaW50IGlzX3Nob3J0X3Rlcm1fcmVmZXJlbmNlKHN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIsCisJCQkJICAgc3RydWN0IEZyYW1lU3RvcmUgKmZzKQoreworCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gY29udGFpbmVyX29mKHBfRHBiLAorCQkJc3RydWN0IGgyNjRfZHBiX3N0cnUsIG1EUEIpOworCWlmIChmcy0+aXNfdXNlZCA9PSAzKSB7IC8qIGZyYW1lICovCisJCWlmICgoZnMtPmZyYW1lLT51c2VkX2Zvcl9yZWZlcmVuY2UpICYmCisJCQkoIWZzLT5mcmFtZS0+aXNfbG9uZ190ZXJtKSkgeworCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLCAiW1slcyAxXV0iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJaWYgKGZzLT5pc191c2VkICYgMSkgeyAvKiB0b3AgZmllbGQgKi8KKwkJaWYgKGZzLT50b3BfZmllbGQpIHsKKwkJCWlmICgoZnMtPnRvcF9maWVsZC0+dXNlZF9mb3JfcmVmZXJlbmNlKSAmJgorCQkJCSghZnMtPnRvcF9maWVsZC0+aXNfbG9uZ190ZXJtKSkgeworCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwgIltbJXMgMl1dIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoZnMtPmlzX3VzZWQgJiAyKSB7IC8qIGJvdHRvbSBmaWVsZCAqLworCQlpZiAoZnMtPmJvdHRvbV9maWVsZCkgeworCQkJaWYgKChmcy0+Ym90dG9tX2ZpZWxkLT51c2VkX2Zvcl9yZWZlcmVuY2UpICYmCisJCQkgICAgKCFmcy0+Ym90dG9tX2ZpZWxkLT5pc19sb25nX3Rlcm0pKSB7CisJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLCAiW1slcyAzXV0iLAorCQkJCV9fZnVuY19fKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc19sb25nX3Rlcm1fcmVmZXJlbmNlKHN0cnVjdCBGcmFtZVN0b3JlICpmcykKK3sKKworCWlmIChmcy0+aXNfdXNlZCA9PSAzKSB7IC8qIGZyYW1lICovCisJCWlmICgoZnMtPmZyYW1lLT51c2VkX2Zvcl9yZWZlcmVuY2UpICYmCisJCQkoZnMtPmZyYW1lLT5pc19sb25nX3Rlcm0pKSB7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCWlmIChmcy0+aXNfdXNlZCAmIDEpIHsgLyogdG9wIGZpZWxkICovCisJCWlmIChmcy0+dG9wX2ZpZWxkKSB7CisJCQlpZiAoKGZzLT50b3BfZmllbGQtPnVzZWRfZm9yX3JlZmVyZW5jZSkgJiYKKwkJCQkoZnMtPnRvcF9maWVsZC0+aXNfbG9uZ190ZXJtKSkgeworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCisJaWYgKGZzLT5pc191c2VkICYgMikgeyAvKiBib3R0b20gZmllbGQgKi8KKwkJaWYgKGZzLT5ib3R0b21fZmllbGQpIHsKKwkJCWlmICgoZnMtPmJvdHRvbV9maWVsZC0+dXNlZF9mb3JfcmVmZXJlbmNlKSAmJgorCQkJICAgIChmcy0+Ym90dG9tX2ZpZWxkLT5pc19sb25nX3Rlcm0pKSB7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgdXBkYXRlX3JlZl9saXN0KHN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIpCit7CisJdW5zaWduZWQgaW50IGksIGo7CisKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9IGNvbnRhaW5lcl9vZihwX0RwYiwKKwkJc3RydWN0IGgyNjRfZHBiX3N0cnUsIG1EUEIpOworCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCSIlcyAoJWQsICVkKVxuIiwgX19mdW5jX18sIHBfRHBiLT5zaXplLCBwX0RwYi0+dXNlZF9zaXplKTsKKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IHBfRHBiLT51c2VkX3NpemU7IGkrKykgeworI2lmIDEKKwkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSAgImZzWyVkXTogZnMgJXAgZnJhbWUgJXAgaXNfcmVmZXJlbmNlICVkICVkICVkXG4iLAorCQkJICBpLCBwX0RwYi0+ZnNbaV0sIHBfRHBiLT5mc1tpXS0+ZnJhbWUsCisJCQkgIHBfRHBiLT5mc1tpXS0+ZnJhbWUgIT0gTlVMTCA/CisJCQkgIHBfRHBiLT5mc1tpXS0+ZnJhbWUtPnVzZWRfZm9yX3JlZmVyZW5jZSA6IDAsCisJCQkgIHBfRHBiLT5mc1tpXS0+dG9wX2ZpZWxkICE9IE5VTEwgPworCQkJICBwX0RwYi0+ZnNbaV0tPnRvcF9maWVsZC0+dXNlZF9mb3JfcmVmZXJlbmNlIDoKKwkJCSAgMCwKKwkJCSAgcF9EcGItPmZzW2ldLT5ib3R0b21fZmllbGQgIT0gTlVMTCA/CisJCQkgIHBfRHBiLT5mc1tpXS0+Ym90dG9tX2ZpZWxkLT51c2VkX2Zvcl9yZWZlcmVuY2UgOiAwKTsKKyNlbmRpZgorCQlpZiAoaXNfc2hvcnRfdGVybV9yZWZlcmVuY2UocF9EcGIsIHBfRHBiLT5mc1tpXSkpIHsKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSJmc19yZWZbJWRdPWZzWyVkXTogZnMgJXBcbiIsIGosIGksIHBfRHBiLT5mc1tpXSk7CisJCQlwX0RwYi0+ZnNfcmVmW2orK10gPSBwX0RwYi0+ZnNbaV07CisJCX0KKwl9CisKKwlwX0RwYi0+cmVmX2ZyYW1lc19pbl9idWZmZXIgPSBqOworCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCSIlcyBkcGIgc2l6ZSBpcyAlZCwgJWRcbiIsIF9fZnVuY19fLCBwX0RwYi0+c2l6ZSwgaik7CisJd2hpbGUgKGogPCBwX0RwYi0+c2l6ZSkgeworCQkvKiBkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkgKiJmc19yZWZbJWRdPW51bGxcbiIsIGopOworCQkgKi8KKwkJcF9EcGItPmZzX3JlZltqKytdID0gTlVMTDsKKwl9CisjaWZkZWYgRVJST1JfQ0hFQ0sKKwlmb3IgKGkgPSAwOyBpIDwgRFBCX1NJWkVfTUFYOyBpKyspIHsKKwkJaWYgKHBfRHBiLT5mc19yZWZbaV0gPT0gTlVMTCkKKwkJCXBfRHBiLT5mc19yZWZbaV0gPSAmZHVtbXlfZnM7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9sdHJlZl9saXN0KHN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIpCit7CisJdW5zaWduZWQgaW50IGksIGo7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSBjb250YWluZXJfb2YocF9EcGIsCisJCXN0cnVjdCBoMjY0X2RwYl9zdHJ1LCBtRFBCKTsKKworCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCSIlc1xuIiwgX19mdW5jX18pOworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgcF9EcGItPnVzZWRfc2l6ZTsgaSsrKSB7CisJCWlmIChpc19sb25nX3Rlcm1fcmVmZXJlbmNlKHBfRHBiLT5mc1tpXSkpCisJCQlwX0RwYi0+ZnNfbHRyZWZbaisrXSA9IHBfRHBiLT5mc1tpXTsKKwl9CisKKwlwX0RwYi0+bHRyZWZfZnJhbWVzX2luX2J1ZmZlciA9IGo7CisKKwl3aGlsZSAoaiA8IHBfRHBiLT5zaXplKQorCQlwX0RwYi0+ZnNfbHRyZWZbaisrXSA9IE5VTEw7CisjaWZkZWYgRVJST1JfQ0hFQ0sKKwlmb3IgKGkgPSAwOyBpIDwgRFBCX1NJWkVfTUFYOyBpKyspIHsKKwkJaWYgKHBfRHBiLT5mc19sdHJlZltpXSA9PSBOVUxMKQorCQkJcF9EcGItPmZzX2x0cmVmW2ldID0gJmR1bW15X2ZzOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBpZHJfbWVtb3J5X21hbmFnZW1lbnQoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIsCisJCQkJICBzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpwKQoreworCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIgPSAmcF9IMjY0X0RwYi0+bURQQjsKKworCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJIiVzIHJlZl9mcmFtZXNfaW5fYnVmZmVyICVkIGx0cmVmX2ZyYW1lc19pbl9idWZmZXIgJWRcbiIsCisJX19mdW5jX18sIHBfRHBiLT5yZWZfZnJhbWVzX2luX2J1ZmZlciwKKwlwX0RwYi0+bHRyZWZfZnJhbWVzX2luX2J1ZmZlcik7CisKKworCWlmIChwLT5ub19vdXRwdXRfb2ZfcHJpb3JfcGljc19mbGFnKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnVzZWRfc2l6ZTsgaSsrKSB7CisJCQl1bm1hcmtfZm9yX3JlZmVyZW5jZShwX0RwYiwgcF9EcGItPmZzW2ldKTsKKwkJCWlmIChwX0RwYi0+ZnNbaV0tPmlzX2xvbmdfdGVybSkKKwkJCQl1bm1hcmtfZm9yX2xvbmdfdGVybV9yZWZlcmVuY2UocF9EcGItPmZzW2ldKTsKKwkJCWlmICghcF9EcGItPmZzW2ldLT5pc19vdXRwdXQgJiYgIXBfRHBiLT5mc1tpXS0+cHJlX291dHB1dCkKKwkJCQlzZXRfZnJhbWVfb3V0cHV0X2ZsYWcocF9IMjY0X0RwYiwgaSk7CisJCX0KKyNpZiAwCisJCS8qPz8/Ki8KKwkJLyogZnJlZSBhbGwgc3RvcmVkIHBpY3R1cmVzICovCisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+dXNlZF9zaXplOyBpKyspIHsKKwkJCS8qIHJlc2V0IGFsbCByZWZlcmVuY2Ugc2V0dGluZ3MKKwkJCSAqIGZyZWVfZnJhbWVfc3RvcmUocF9EcGItPmZzW2ldKTsKKwkJCSAqIHBfRHBiLT5mc1tpXSA9IGFsbG9jX2ZyYW1lX3N0b3JlKCk7CisJCQkgKi8KKwkJCXJlc2V0X2ZyYW1lX3N0b3JlKHBfSDI2NF9EcGIsIHBfRHBiLT5mc1tpXSk7IC8qID8/PyAqLworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+cmVmX2ZyYW1lc19pbl9idWZmZXI7IGkrKykKKwkJCXBfRHBiLT5mc19yZWZbaV0gPSBOVUxMOworCQlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPmx0cmVmX2ZyYW1lc19pbl9idWZmZXI7IGkrKykKKwkJCXBfRHBiLT5mc19sdHJlZltpXSA9IE5VTEw7CisJCXBfRHBiLT51c2VkX3NpemUgPSAwOworI2VuZGlmCisJfSBlbHNlIHsKKwkJZmx1c2hfZHBiKHBfSDI2NF9EcGIpOworCX0KKwlwX0RwYi0+bGFzdF9waWN0dXJlID0gTlVMTDsKKworCXVwZGF0ZV9yZWZfbGlzdChwX0RwYik7CisJdXBkYXRlX2x0cmVmX2xpc3QocF9EcGIpOworCXBfRHBiLT5sYXN0X291dHB1dF9wb2MgPSBJTlRfTUlOOworCisJaWYgKHAtPmxvbmdfdGVybV9yZWZlcmVuY2VfZmxhZykgeworCQlwX0RwYi0+bWF4X2xvbmdfdGVybV9waWNfaWR4ID0gMDsKKwkJcC0+aXNfbG9uZ190ZXJtICAgICAgICAgICA9IDE7CisJCXAtPmxvbmdfdGVybV9mcmFtZV9pZHggICAgPSAwOworCX0gZWxzZSB7CisJCXBfRHBiLT5tYXhfbG9uZ190ZXJtX3BpY19pZHggPSAtMTsKKwkJcC0+aXNfbG9uZ190ZXJtICAgICAgICAgICA9IDA7CisJfQorCisjaWYgKE1WQ19FWFRFTlNJT05fRU5BQkxFKQorCXBfRHBiLT5sYXN0X291dHB1dF92aWV3X2lkID0gLTE7CisjZW5kaWYKKworfQorCitzdGF0aWMgdm9pZCBzbGlkaW5nX3dpbmRvd19tZW1vcnlfbWFuYWdlbWVudCgKKwkJc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYiwKKwkJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqcCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9IGNvbnRhaW5lcl9vZihwX0RwYiwKKwkJc3RydWN0IGgyNjRfZHBiX3N0cnUsIG1EUEIpOworCXVuc2lnbmVkIGNoYXIgc2xpZGVfZmxhZyA9IDA7CisJdW5zaWduZWQgaW50IHNsaWRpbmdfbWFyZ2luID0gaW1heCgKKwkJMSwgcF9EcGItPm51bV9yZWZfZnJhbWVzKSAtIHBfRHBiLT5sdHJlZl9mcmFtZXNfaW5fYnVmZmVyOworCS8qIGFzc2VydCAoIXAtPmlkcl9mbGFnKTsgKi8KKwlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCSIlcyByZWZfZnJhbWVzX2luX2J1ZmZlciAlZCBsdHJlZl9mcmFtZXNfaW5fYnVmZmVyICVkXG4iLAorCV9fZnVuY19fLCBwX0RwYi0+cmVmX2ZyYW1lc19pbl9idWZmZXIsCisJcF9EcGItPmx0cmVmX2ZyYW1lc19pbl9idWZmZXIpOworCS8qIGlmIHRoaXMgaXMgYSByZWZlcmVuY2UgcGljIHdpdGggc2xpZGluZyB3aW5kb3csCisJICAgdW5tYXJrIGZpcnN0IHJlZiBmcmFtZSAqLworCWlmIChwX0RwYi0+cmVmX2ZyYW1lc19pbl9idWZmZXIgPT0gc2xpZGluZ19tYXJnaW4pCisJCXNsaWRlX2ZsYWcgPSAxOworCS8qZWxzZSBpZiAoKGgyNjRfZXJyb3JfcHJvY19wb2xpY3kgJiAweDgpICYmCisJCShwX0RwYi0+cmVmX2ZyYW1lc19pbl9idWZmZXIgPiBzbGlkaW5nX21hcmdpbikpCisJCXNsaWRlX2ZsYWcgPSAxOyovCisKKwlpZiAoc2xpZGVfZmxhZykgeworCQlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnVzZWRfc2l6ZTsgaSsrKSB7CisJCQlpZiAocF9EcGItPmZzW2ldLT5pc19yZWZlcmVuY2UgJiYKKwkJCQkoIShwX0RwYi0+ZnNbaV0tPmlzX2xvbmdfdGVybSkpKSB7CisJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLCAidW5tYXJrICVkXG4iLCBpKTsKKwkJCQl1bm1hcmtfZm9yX3JlZmVyZW5jZShwX0RwYiwgcF9EcGItPmZzW2ldKTsKKwkJCQl1cGRhdGVfcmVmX2xpc3QocF9EcGIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcC0+aXNfbG9uZ190ZXJtID0gMDsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfbnVtX3JlZihzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiKQoreworCWlmICgoaW50KShwX0RwYi0+bHRyZWZfZnJhbWVzX2luX2J1ZmZlciArCisJCQlwX0RwYi0+cmVmX2ZyYW1lc19pbl9idWZmZXIpID4KKwkJCWltYXgoMSwgcF9EcGItPm51bV9yZWZfZnJhbWVzKSkgeworCQlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9IGNvbnRhaW5lcl9vZihwX0RwYiwKKwkJCQkJIHN0cnVjdCBoMjY0X2RwYl9zdHJ1LCBtRFBCKTsKKwkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSAgIk1heC4gbnVtYmVyIG9mIHJlZmVyZW5jZSBmcmFtZXMgZXhjZWVkZWQuIEludmFsaWQgc3RyZWFtLiBsdCAlZCByZWYgJWQgbXVtX3JlZiAlZFxuIiwKKwkJCSAgcF9EcGItPmx0cmVmX2ZyYW1lc19pbl9idWZmZXIsCisJCQkgIHBfRHBiLT5yZWZfZnJhbWVzX2luX2J1ZmZlciwKKwkJCSAgcF9EcGItPm51bV9yZWZfZnJhbWVzKTsKKwl9Cit9CisKK3ZvaWQgZHVtcF9kcGIoc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYiwgdTggZm9yY2UpCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgY2hhciAqYnVmID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgYnVmX3NpemUgPSA1MTIsIGxlbiA9IDA7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPQorCQljb250YWluZXJfb2YocF9EcGIsIHN0cnVjdCBoMjY0X2RwYl9zdHJ1LCBtRFBCKTsKKworI2RlZmluZSBEUEJfU1RSQ0FUKGFyZ3MuLi4pICBkbyB7CVwKKwkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwJXAorCQkJYnVmX3NpemUgLSBsZW4sICMjYXJncyk7XAorCX0gd2hpbGUgKDApCisKKwlpZiAoKGgyNjRfZGVidWdfZmxhZyAmIFBSSU5UX0ZMQUdfRFVNUF9EUEIpID09IDAgJiYKKwkJZm9yY2UgPT0gMCkKKwkJcmV0dXJuOworCisJYnVmID0ga3phbGxvYyhidWZfc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnVzZWRfc2l6ZTsgaSsrKSB7CisJCWxlbiA9IDA7CisJCW1lbXNldChidWYsIDAsIGJ1Zl9zaXplKTsKKwkJRFBCX1NUUkNBVCgiZm49JWQgIGlzX3VzZWQgJWQgIiwKKwkJCXBfRHBiLT5mc1tpXS0+ZnJhbWVfbnVtLAorCQkJcF9EcGItPmZzW2ldLT5pc191c2VkKTsKKworCQlpZiAocF9EcGItPmZzW2ldLT5pc191c2VkICYgMSkgeworCQkJaWYgKHBfRHBiLT5mc1tpXS0+dG9wX2ZpZWxkKQorCQkJCURQQl9TVFJDQVQoIlQ6IHBvYz0lZCAgcGljX251bT0lZCAiLAorCQkJCXBfRHBiLT5mc1tpXS0+dG9wX2ZpZWxkLT5wb2MsCisJCQkJcF9EcGItPmZzW2ldLT50b3BfZmllbGQtPnBpY19udW0pOworCQkJZWxzZQorCQkJCURQQl9TVFJDQVQoIlQ6IHBvYz0lZCAgIiwKKwkJCQlwX0RwYi0+ZnNbaV0tPmZyYW1lLT50b3BfcG9jKTsKKwkJfQorCQlpZiAocF9EcGItPmZzW2ldLT5pc191c2VkICYgMikgeworCQkJaWYgKHBfRHBiLT5mc1tpXS0+Ym90dG9tX2ZpZWxkKQorCQkJCURQQl9TVFJDQVQoIkI6IHBvYz0lZCAgcGljX251bT0lZCAiLAorCQkJCXBfRHBiLT5mc1tpXS0+Ym90dG9tX2ZpZWxkLT5wb2MsCisJCQkJcF9EcGItPmZzW2ldLT5ib3R0b21fZmllbGQtPnBpY19udW0pOworCQkJZWxzZQorCQkJCURQQl9TVFJDQVQoIkI6IHBvYz0lZCAgIiwKKwkJCQlwX0RwYi0+ZnNbaV0tPmZyYW1lLT5ib3R0b21fcG9jKTsKKwkJfQorCQlpZiAocF9EcGItPmZzW2ldLT5pc191c2VkID09IDMpIHsKKwkJCWlmIChwX0RwYi0+ZnNbaV0tPmZyYW1lICE9IE5VTEwpCisJCQkJRFBCX1NUUkNBVCgiRjogcG9jPSVkIHBpY19udW09JWQgIiwKKwkJCQlwX0RwYi0+ZnNbaV0tPmZyYW1lLT5wb2MsCisJCQkJcF9EcGItPmZzW2ldLT5mcmFtZS0+cGljX251bSk7CisJCQllbHNlCisJCQkJRFBCX1NUUkNBVCgiZnNbJWRdIGZyYW1lIGlzIG51bGwgIiwgaSk7CisJCX0KKwkJRFBCX1NUUkNBVCgiRzogcG9jPSVkKSAgIiwgcF9EcGItPmZzW2ldLT5wb2MpOworCQlpZiAocF9EcGItPmZzW2ldLT5pc19yZWZlcmVuY2UpCisJCQlEUEJfU1RSQ0FUKCJyZWYgKCVkKSAiLCBwX0RwYi0+ZnNbaV0tPmlzX3JlZmVyZW5jZSk7CisJCWlmIChwX0RwYi0+ZnNbaV0tPmlzX2xvbmdfdGVybSkKKwkJCURQQl9TVFJDQVQoImx0X3JlZiAoJWQpICIsIHBfRHBiLT5mc1tpXS0+aXNfcmVmZXJlbmNlKTsKKwkJaWYgKHBfRHBiLT5mc1tpXS0+aXNfb3V0cHV0KQorCQkJRFBCX1NUUkNBVCgib3V0KGRpc3BsYXllZCkgICIpOworCQlpZiAocF9EcGItPmZzW2ldLT5wcmVfb3V0cHV0KQorCQkJRFBCX1NUUkNBVCgicHJlX291dHB1dChpbiBkaXNwcSBvciBkaXNwbGF5aW5nKSAgIik7CisJCWlmIChwX0RwYi0+ZnNbaV0tPmlzX3VzZWQgPT0gMykgeworCQkJaWYgKHBfRHBiLT5mc1tpXS0+ZnJhbWUgIT0gTlVMTCAmJiBwX0RwYi0+ZnNbaV0tPmZyYW1lLT5ub25fZXhpc3RpbmcpCisJCQkJRFBCX1NUUkNBVCgibm9uX2V4aXN0aW5nICAiKTsKKwkJCWVsc2UKKwkJCQlEUEJfU1RSQ0FUKCJmc1slZF0gZnJhbWUgaXMgbnVsbCAiLCBpKTsKKwkJfQorCQlEUEJfU1RSQ0FUKCJkcGJfZnJhbWVfY291bnQgJWQgICIsCisJCQlwX0RwYi0+ZnNbaV0tPmRwYl9mcmFtZV9jb3VudCk7CisKKyNpZiAoTVZDX0VYVEVOU0lPTl9FTkFCTEUpCisJCWlmIChwX0RwYi0+ZnNbaV0tPmlzX3JlZmVyZW5jZSkKKwkJCURQQl9TVFJDQVQoInZpZXdfaWQgKCVkKSAiLCBwX0RwYi0+ZnNbaV0tPnZpZXdfaWQpOworI2VuZGlmCisJCWlmIChwX0RwYi0+ZnNbaV0tPmRhdGFfZmxhZykgeworCQkJRFBCX1NUUkNBVCgiZGF0YV9mbGFnKDB4JXgpIiwKKwkJCXBfRHBiLT5mc1tpXS0+ZGF0YV9mbGFnKTsKKwkJfQorCQlEUEJfU1RSQ0FUKCIgYnVmc3BlYyAlZFxuIiwKKwkJCXBfRHBiLT5mc1tpXS0+YnVmX3NwZWNfbnVtKTsKKwkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIDAsICIlcyIsIGJ1Zik7CisJfQorCisJa2ZyZWUoYnVmKTsKK30KKworLyohCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBcYnJpZWYKKyAqICAgIGFkYXB0aXZlIG1lbW9yeSBtYW5hZ2VtZW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK3N0YXRpYyBpbnQgZ2V0X3BpY19udW1feChzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpwLAorCQkJIGludCBkaWZmZXJlbmNlX29mX3BpY19udW1zX21pbnVzMSkKK3sKKwlpbnQgY3VyclBpY051bTsKKworCWlmIChwLT5zdHJ1Y3R1cmUgPT0gRlJBTUUpCisJCWN1cnJQaWNOdW0gPSBwLT5mcmFtZV9udW07CisJZWxzZQorCQljdXJyUGljTnVtID0gMiAqIHAtPmZyYW1lX251bSArIDE7CisKKwlyZXR1cm4gY3VyclBpY051bSAtIChkaWZmZXJlbmNlX29mX3BpY19udW1zX21pbnVzMSArIDEpOworfQorCisvKiEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFxicmllZgorICogICAgQWRhcHRpdmUgTWVtb3J5IE1hbmFnZW1lbnQ6IE1hcmsgc2hvcnQgdGVybSBwaWN0dXJlIHVudXNlZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGF0aWMgdm9pZCBtbV91bm1hcmtfc2hvcnRfdGVybV9mb3JfcmVmZXJlbmNlKHN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlcgorCQkqcF9EcGIsIHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnAsCisJCWludCBkaWZmZXJlbmNlX29mX3BpY19udW1zX21pbnVzMSkKK3sKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9CisJCWNvbnRhaW5lcl9vZihwX0RwYiwgc3RydWN0IGgyNjRfZHBiX3N0cnUsIG1EUEIpOworCWludCBwaWNOdW1YOworCisJdW5zaWduZWQgaW50IGk7CisKKwlwaWNOdW1YID0gZ2V0X3BpY19udW1feChwLCBkaWZmZXJlbmNlX29mX3BpY19udW1zX21pbnVzMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnJlZl9mcmFtZXNfaW5fYnVmZmVyOyBpKyspIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQlpZiAocF9EcGItPmZzX3JlZltpXSA9PSBOVUxMKSB7CisJCQlwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyA9IF9fTElORV9fOworCQkJY29udGludWU7CisJCX0KKyNlbmRpZgorCQlpZiAocC0+c3RydWN0dXJlID09IEZSQU1FKSB7CisJCQlpZiAoKHBfRHBiLT5mc19yZWZbaV0tPmlzX3JlZmVyZW5jZSA9PSAzKSAmJgorCQkJICAgIChwX0RwYi0+ZnNfcmVmW2ldLT5pc19sb25nX3Rlcm0gPT0gMCkpIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZSA9PSBOVUxMKSB7CisJCQkJCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnID0gX19MSU5FX187CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKyNlbmRpZgorCQkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZS0+cGljX251bSA9PQorCQkJCQlwaWNOdW1YKSB7CisJCQkJCXVubWFya19mb3JfcmVmZXJlbmNlKHBfRHBiLAorCQkJCQkJcF9EcGItPmZzX3JlZltpXSk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoKHBfRHBiLT5mc19yZWZbaV0tPmlzX3JlZmVyZW5jZSAmIDEpICYmCisJCQkgICAgKCEocF9EcGItPmZzX3JlZltpXS0+aXNfbG9uZ190ZXJtICYgMSkpKSB7CisjaWZkZWYgRVJST1JfQ0hFQ0sKKwkJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkID09IE5VTEwpIHsKKwkJCQkJcF9IMjY0X0RwYi0+ZHBiX2Vycm9yX2ZsYWcgPSBfX0xJTkVfXzsKKwkJCQkJY29udGludWU7CisJCQkJfQorI2VuZGlmCisJCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0tPnRvcF9maWVsZC0+cGljX251bSA9PQorCQkJCQlwaWNOdW1YKSB7CisJCQkJCXBfRHBiLT5mc19yZWZbaV0tPgorCQkJCQl0b3BfZmllbGQtPnVzZWRfZm9yX3JlZmVyZW5jZSA9IDA7CisJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmlzX3JlZmVyZW5jZSAmPSAyOworCQkJCQlpZiAoKHBfRHBiLT5mc19yZWZbaV0tPmlzX3VzZWQgPT0gMykKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJCQkJJiYgcF9EcGItPmZzX3JlZltpXS0+ZnJhbWUKKyNlbmRpZgorCQkJCQkpIHsKKwkJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmZyYW1lLT4KKwkJCQkJCQl1c2VkX2Zvcl9yZWZlcmVuY2UgPSAwOworCQkJCQl9CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQlpZiAoKHBfRHBiLT5mc19yZWZbaV0tPmlzX3JlZmVyZW5jZSAmIDIpICYmCisJCQkgICAgKCEocF9EcGItPmZzX3JlZltpXS0+aXNfbG9uZ190ZXJtICYgMikpKSB7CisjaWZkZWYgRVJST1JfQ0hFQ0sKKwkJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+Ym90dG9tX2ZpZWxkID09IE5VTEwpIHsKKwkJCQkJcF9IMjY0X0RwYi0+ZHBiX2Vycm9yX2ZsYWcgPSBfX0xJTkVfXzsKKwkJCQkJY29udGludWU7CisJCQkJfQorI2VuZGlmCisJCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0tPmJvdHRvbV9maWVsZC0+cGljX251bSA9PQorCQkJCQlwaWNOdW1YKSB7CisJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmJvdHRvbV9maWVsZC0+CisJCQkJCXVzZWRfZm9yX3JlZmVyZW5jZSA9IDA7CisJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmlzX3JlZmVyZW5jZSAmPSAxOworCQkJCQlpZiAoKHBfRHBiLT5mc19yZWZbaV0tPmlzX3VzZWQgPT0gMykKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJCQkJJiYgcF9EcGItPmZzX3JlZltpXS0+ZnJhbWUKKyNlbmRpZgorCQkJCQkJKSB7CisJCQkJCQlwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZS0+CisJCQkJCQl1c2VkX2Zvcl9yZWZlcmVuY2UgPSAwOworCQkJCQl9CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKKy8qIQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogXGJyaWVmCisgKiAgICBBZGFwdGl2ZSBNZW1vcnkgTWFuYWdlbWVudDogTWFyayBsb25nIHRlcm0gcGljdHVyZSB1bnVzZWQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworc3RhdGljIHZvaWQgbW1fdW5tYXJrX2xvbmdfdGVybV9mb3JfcmVmZXJlbmNlKHN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlcgorCQkqcF9EcGIsIHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnAsIGludCBsb25nX3Rlcm1fcGljX251bSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+bHRyZWZfZnJhbWVzX2luX2J1ZmZlcjsgaSsrKSB7CisJCWlmIChwLT5zdHJ1Y3R1cmUgPT0gRlJBTUUpIHsKKwkJCWlmICgocF9EcGItPmZzX2x0cmVmW2ldLT5pc19yZWZlcmVuY2UgPT0gMykgJiYKKwkJCSAgICAocF9EcGItPmZzX2x0cmVmW2ldLT5pc19sb25nX3Rlcm0gPT0gMykpIHsKKwkJCQlpZiAocF9EcGItPmZzX2x0cmVmW2ldLT5mcmFtZS0+CisJCQkJCWxvbmdfdGVybV9waWNfbnVtID09CisJCQkJCWxvbmdfdGVybV9waWNfbnVtKSB7CisJCQkJCXVubWFya19mb3JfbG9uZ190ZXJtX3JlZmVyZW5jZSgKKwkJCQkJCXBfRHBiLT5mc19sdHJlZltpXSk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKChwX0RwYi0+ZnNfbHRyZWZbaV0tPmlzX3JlZmVyZW5jZSAmIDEpICYmCisJCQkgICAgKChwX0RwYi0+ZnNfbHRyZWZbaV0tPmlzX2xvbmdfdGVybSAmIDEpKSkgeworCQkJCWlmIChwX0RwYi0+ZnNfbHRyZWZbaV0tPnRvcF9maWVsZC0+CisJCQkJCWxvbmdfdGVybV9waWNfbnVtID09CisJCQkJCWxvbmdfdGVybV9waWNfbnVtKSB7CisJCQkJCXBfRHBiLT5mc19sdHJlZltpXS0+dG9wX2ZpZWxkLT4KKwkJCQkJCXVzZWRfZm9yX3JlZmVyZW5jZSA9IDA7CisJCQkJCXBfRHBiLT5mc19sdHJlZltpXS0+dG9wX2ZpZWxkLT4KKwkJCQkJCWlzX2xvbmdfdGVybSA9IDA7CisJCQkJCXBfRHBiLT5mc19sdHJlZltpXS0+aXNfcmVmZXJlbmNlICY9IDI7CisJCQkJCXBfRHBiLT5mc19sdHJlZltpXS0+aXNfbG9uZ190ZXJtICY9IDI7CisJCQkJCWlmIChwX0RwYi0+ZnNfbHRyZWZbaV0tPmlzX3VzZWQgPT0gMykgeworCQkJCQkJcF9EcGItPmZzX2x0cmVmW2ldLT5mcmFtZS0+CisJCQkJCQkJdXNlZF9mb3JfcmVmZXJlbmNlID0gMDsKKwkJCQkJCXBfRHBiLT5mc19sdHJlZltpXS0+ZnJhbWUtPgorCQkJCQkJCWlzX2xvbmdfdGVybSA9IDA7CisJCQkJCX0KKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJCWlmICgocF9EcGItPmZzX2x0cmVmW2ldLT5pc19yZWZlcmVuY2UgJiAyKSAmJgorCQkJICAgICgocF9EcGItPmZzX2x0cmVmW2ldLT5pc19sb25nX3Rlcm0gJiAyKSkpIHsKKwkJCQlpZiAocF9EcGItPmZzX2x0cmVmW2ldLT5ib3R0b21fZmllbGQtPgorCQkJCQlsb25nX3Rlcm1fcGljX251bSA9PQorCQkJCQlsb25nX3Rlcm1fcGljX251bSkgeworCQkJCQlwX0RwYi0+ZnNfbHRyZWZbaV0tPmJvdHRvbV9maWVsZC0+CisJCQkJCQl1c2VkX2Zvcl9yZWZlcmVuY2UgPSAwOworCQkJCQlwX0RwYi0+ZnNfbHRyZWZbaV0tPmJvdHRvbV9maWVsZC0+CisJCQkJCQlpc19sb25nX3Rlcm0gPSAwOworCQkJCQlwX0RwYi0+ZnNfbHRyZWZbaV0tPmlzX3JlZmVyZW5jZSAmPSAxOworCQkJCQlwX0RwYi0+ZnNfbHRyZWZbaV0tPmlzX2xvbmdfdGVybSAmPSAxOworCQkJCQlpZiAocF9EcGItPmZzX2x0cmVmW2ldLT5pc191c2VkID09IDMpIHsKKwkJCQkJCXBfRHBiLT5mc19sdHJlZltpXS0+ZnJhbWUtPgorCQkJCQkJCXVzZWRfZm9yX3JlZmVyZW5jZSA9IDA7CisJCQkJCQlwX0RwYi0+ZnNfbHRyZWZbaV0tPmZyYW1lLT4KKwkJCQkJCQlpc19sb25nX3Rlcm0gPSAwOworCQkJCQl9CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKKworLyohCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBcYnJpZWYKKyAqICAgIE1hcmsgYSBsb25nLXRlcm0gcmVmZXJlbmNlIGZyYW1lIG9yIGNvbXBsZW1lbnRhcnkKKyAqICAgIGZpZWxkIHBhaXIgdW51c2VkIGZvciByZWZlcmVtY2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworc3RhdGljIHZvaWQgdW5tYXJrX2xvbmdfdGVybV9mcmFtZV9mb3JfcmVmZXJlbmNlX2J5X2ZyYW1lX2lkeCgKKwlzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiLCBpbnQgbG9uZ190ZXJtX2ZyYW1lX2lkeCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+bHRyZWZfZnJhbWVzX2luX2J1ZmZlcjsgaSsrKSB7CisJCWlmIChwX0RwYi0+ZnNfbHRyZWZbaV0tPmxvbmdfdGVybV9mcmFtZV9pZHggPT0KKwkJCWxvbmdfdGVybV9mcmFtZV9pZHgpCisJCQl1bm1hcmtfZm9yX2xvbmdfdGVybV9yZWZlcmVuY2UocF9EcGItPmZzX2x0cmVmW2ldKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgdW5tYXJrMShzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiLAorCXVuc2lnbmVkIGludCBjdXJyX2ZyYW1lX251bSwgaW50IGkpCit7CisJaWYgKHBfRHBiLT5sYXN0X3BpY3R1cmUpIHsKKwkJLyppZiAoKHBfRHBiLT5sYXN0X3BpY3R1cmUgIT0gcF9EcGItPmZzX2x0cmVmW2ldKSB8fAorCQkJcF9EcGItPmxhc3RfcGljdHVyZS0+ZnJhbWVfbnVtICE9IGN1cnJfZnJhbWVfbnVtKSB7Ki8KKwkJCXVubWFya19mb3JfbG9uZ190ZXJtX3JlZmVyZW5jZShwX0RwYi0+ZnNfbHRyZWZbaV0pOworCQkvKn0gZWxzZSB7CisJCQl1bm1hcmtfZm9yX2xvbmdfdGVybV9yZWZlcmVuY2UocF9EcGItPmZzX2x0cmVmW2ldKTsKKwkJfSovCisJfQorfQorCitzdGF0aWMgdm9pZCB1bm1hcmsyKHN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIsCisJaW50IGN1cnJfcGljX251bSwgaW50IGkpCit7CisJaWYgKChwX0RwYi0+ZnNfbHRyZWZbaV0tPmZyYW1lX251bSkgIT0KKwkJKHVuc2lnbmVkIGludCkoY3Vycl9waWNfbnVtID4+IDEpKQorCQl1bm1hcmtfZm9yX2xvbmdfdGVybV9yZWZlcmVuY2UocF9EcGItPmZzX2x0cmVmW2ldKTsKK30KKworc3RhdGljIHZvaWQgdW5tYXJrM190b3Aoc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYiwKKwl1bnNpZ25lZCBpbnQgY3Vycl9mcmFtZV9udW0sIGludCBjdXJyX3BpY19udW0sIGludCBtYXJrX2N1cnJlbnQsIGludCBpKQoreworCWlmIChwX0RwYi0+ZnNfbHRyZWZbaV0tPmlzX2xvbmdfdGVybSA9PSAzKSB7CisJCXVubWFya19mb3JfbG9uZ190ZXJtX3JlZmVyZW5jZShwX0RwYi0+ZnNfbHRyZWZbaV0pOworCX0gZWxzZSB7CisJCWlmIChwX0RwYi0+ZnNfbHRyZWZbaV0tPmlzX2xvbmdfdGVybSA9PSAxKSB7CisJCQl1bm1hcmtfZm9yX2xvbmdfdGVybV9yZWZlcmVuY2UocF9EcGItPmZzX2x0cmVmW2ldKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChtYXJrX2N1cnJlbnQpCisJCQkJdW5tYXJrMShwX0RwYiwgY3Vycl9mcmFtZV9udW0sIGkpOworCQkJZWxzZQorCQkJCXVubWFyazIocF9EcGIsIGN1cnJfcGljX251bSwgaSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVubWFyazNfYm90dG9tKHN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIsCisJdW5zaWduZWQgaW50IGN1cnJfZnJhbWVfbnVtLCBpbnQgY3Vycl9waWNfbnVtLCBpbnQgbWFya19jdXJyZW50LCBpbnQgaSkKK3sKKwlpZiAocF9EcGItPmZzX2x0cmVmW2ldLT5pc19sb25nX3Rlcm0gPT0gMikgeworCQl1bm1hcmtfZm9yX2xvbmdfdGVybV9yZWZlcmVuY2UocF9EcGItPmZzX2x0cmVmW2ldKTsKKwl9IGVsc2UgeworCQlpZiAobWFya19jdXJyZW50KQorCQkJdW5tYXJrMShwX0RwYiwgY3Vycl9mcmFtZV9udW0sIGkpOworCQllbHNlCisJCQl1bm1hcmsyKHBfRHBiLCBjdXJyX3BpY19udW0sIGkpOworCX0KK30KKworc3RhdGljIHZvaWQgdW5tYXJrX2xvbmdfdGVybV9maWVsZF9mb3JfcmVmZXJlbmNlX2J5X2ZyYW1lX2lkeCgKKwlzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiLCBlbnVtIFBpY3R1cmVTdHJ1Y3R1cmUgc3RydWN0dXJlLAorCWludCBsb25nX3Rlcm1fZnJhbWVfaWR4LCBpbnQgbWFya19jdXJyZW50LCB1bnNpZ25lZCBpbnQgY3Vycl9mcmFtZV9udW0sCisJaW50IGN1cnJfcGljX251bSkKK3sKKwlzdHJ1Y3QgVmlkZW9QYXJhbWV0ZXJzICpwX1ZpZCA9IHBfRHBiLT5wX1ZpZDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIGFzc2VydChzdHJ1Y3R1cmUhPUZSQU1FKTsgKi8KKwlpZiAoY3Vycl9waWNfbnVtIDwgMCkKKwkJY3Vycl9waWNfbnVtICs9ICgyICogcF9WaWQtPm1heF9mcmFtZV9udW0pOworCisJZm9yIChpID0gMDsgaSA8IHBfRHBiLT5sdHJlZl9mcmFtZXNfaW5fYnVmZmVyOyBpKyspIHsKKwkJaWYgKHBfRHBiLT5mc19sdHJlZltpXS0+bG9uZ190ZXJtX2ZyYW1lX2lkeCA9PQorCQkJbG9uZ190ZXJtX2ZyYW1lX2lkeCkgeworCQkJaWYgKHN0cnVjdHVyZSA9PSBUT1BfRklFTEQpCisJCQkJdW5tYXJrM190b3AocF9EcGIsIGN1cnJfZnJhbWVfbnVtLAorCQkJCQljdXJyX3BpY19udW0sIG1hcmtfY3VycmVudCwgaSk7CisKKwkJCWlmIChzdHJ1Y3R1cmUgPT0gQk9UVE9NX0ZJRUxEKQorCQkJCXVubWFyazNfYm90dG9tKHBfRHBiLCBjdXJyX2ZyYW1lX251bSwKKwkJCQkJY3Vycl9waWNfbnVtLCBtYXJrX2N1cnJlbnQsIGkpOworCQl9CisJfQorfQorCisvKiEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFxicmllZgorICogICAgbWFyayBhIHBpY3R1cmUgYXMgbG9uZy10ZXJtIHJlZmVyZW5jZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGF0aWMgdm9pZCBtYXJrX3BpY19sb25nX3Rlcm0oc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYiwKKwkJCSAgICAgICBzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpwLAorCQkJICAgICAgIGludCBsb25nX3Rlcm1fZnJhbWVfaWR4LCBpbnQgcGljTnVtWCkKK3sKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9IGNvbnRhaW5lcl9vZihwX0RwYiwKKwkJCQlzdHJ1Y3QgaDI2NF9kcGJfc3RydSwgbURQQik7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGFkZF90b3AsIGFkZF9ib3R0b207CisKKwlpZiAocC0+c3RydWN0dXJlID09IEZSQU1FKSB7CisJCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+cmVmX2ZyYW1lc19pbl9idWZmZXI7IGkrKykgeworI2lmZGVmIEVSUk9SX0NIRUNLCisJCQlpZiAocF9EcGItPmZzX3JlZltpXSA9PSBOVUxMKSB7CisJCQkJcF9IMjY0X0RwYi0+ZHBiX2Vycm9yX2ZsYWcgPSBfX0xJTkVfXzsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNlbmRpZgorCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0tPmlzX3JlZmVyZW5jZSA9PSAzKSB7CisjaWZkZWYgRVJST1JfQ0hFQ0sKKwkJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+ZnJhbWUgPT0gTlVMTCkgeworCQkJCQlwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyA9IF9fTElORV9fOworCQkJCQljb250aW51ZTsKKwkJCQl9CisjZW5kaWYKKwkJCQlpZiAoKCFwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZS0+CisJCQkJCWlzX2xvbmdfdGVybSkgJiYKKwkJCQkgICAgKHBfRHBiLT5mc19yZWZbaV0tPmZyYW1lLT5waWNfbnVtID09CisJCQkJCXBpY051bVgpKSB7CisJCQkJCXBfRHBiLT5mc19yZWZbaV0tPgorCQkJCQkJbG9uZ190ZXJtX2ZyYW1lX2lkeCA9CisJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmZyYW1lLT4KKwkJCQkJCWxvbmdfdGVybV9mcmFtZV9pZHggPQorCQkJCQkJbG9uZ190ZXJtX2ZyYW1lX2lkeDsKKwkJCQkJcF9EcGItPmZzX3JlZltpXS0+ZnJhbWUtPgorCQkJCQkJbG9uZ190ZXJtX3BpY19udW0gPQorCQkJCQkJbG9uZ190ZXJtX2ZyYW1lX2lkeDsKKwkJCQkJcF9EcGItPmZzX3JlZltpXS0+ZnJhbWUtPgorCQkJCQkJaXNfbG9uZ190ZXJtID0gMTsKKworCQkJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkICYmCisJCQkJCSAgICBwX0RwYi0+ZnNfcmVmW2ldLT5ib3R0b21fZmllbGQpIHsKKwkJCQkJCXBfRHBiLT5mc19yZWZbaV0tPnRvcF9maWVsZC0+CisJCQkJCQlsb25nX3Rlcm1fZnJhbWVfaWR4ID0KKwkJCQkJCQlwX0RwYi0+ZnNfcmVmW2ldLT4KKwkJCQkJCQlib3R0b21fZmllbGQtPgorCQkJCQkJCWxvbmdfdGVybV9mcmFtZV9pZHggPQorCQkJCQkJCWxvbmdfdGVybV9mcmFtZV9pZHg7CisJCQkJCQlwX0RwYi0+ZnNfcmVmW2ldLT50b3BfZmllbGQtPgorCQkJCQkJCWxvbmdfdGVybV9waWNfbnVtID0KKwkJCQkJCQlsb25nX3Rlcm1fZnJhbWVfaWR4OworCQkJCQkJcF9EcGItPmZzX3JlZltpXS0+CisJCQkJCQkJYm90dG9tX2ZpZWxkLT4KKwkJCQkJCQlsb25nX3Rlcm1fcGljX251bSA9CisJCQkJCQkJbG9uZ190ZXJtX2ZyYW1lX2lkeDsKKworCQkJCQkJcF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkLT4KKwkJCQkJCQlpc19sb25nX3Rlcm0gPQorCQkJCQkJCXBfRHBiLT5mc19yZWZbaV0tPgorCQkJCQkJCWJvdHRvbV9maWVsZC0+CisJCQkJCQkJaXNfbG9uZ190ZXJtCisJCQkJCQkJPSAxOworCisJCQkJCX0KKwkJCQkJcF9EcGItPmZzX3JlZltpXS0+aXNfbG9uZ190ZXJtID0gMzsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJICAiV2FybmluZzogcmVmZXJlbmNlIGZyYW1lIGZvciBsb25nIHRlcm0gbWFya2luZyBub3QgZm91bmRcbiIpOworCX0gZWxzZSB7CisJCWlmIChwLT5zdHJ1Y3R1cmUgPT0gVE9QX0ZJRUxEKSB7CisJCQlhZGRfdG9wICAgID0gMTsKKwkJCWFkZF9ib3R0b20gPSAwOworCQl9IGVsc2UgeworCQkJYWRkX3RvcCAgICA9IDA7CisJCQlhZGRfYm90dG9tID0gMTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnJlZl9mcmFtZXNfaW5fYnVmZmVyOyBpKyspIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0gPT0gTlVMTCkgeworCQkJCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnID0gX19MSU5FX187CisJCQkJY29udGludWU7CisJCQl9CisjZW5kaWYKKwkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldLT5pc19yZWZlcmVuY2UgJiAxKSB7CisjaWZkZWYgRVJST1JfQ0hFQ0sKKwkJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkID09IE5VTEwpIHsKKwkJCQkJcF9IMjY0X0RwYi0+ZHBiX2Vycm9yX2ZsYWcgPSBfX0xJTkVfXzsKKwkJCQkJY29udGludWU7CisJCQkJfQorI2VuZGlmCisJCQkJaWYgKCghcF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkLT4KKwkJCQkJaXNfbG9uZ190ZXJtKSAmJgorCQkJCSAgICAocF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkLT5waWNfbnVtID09CisJCQkJCXBpY051bVgpKSB7CisJCQkJCWlmICgocF9EcGItPmZzX3JlZltpXS0+CisJCQkJCQlpc19sb25nX3Rlcm0pICYmCisJCQkJCSAgICAocF9EcGItPmZzX3JlZltpXS0+CisJCQkJCQlsb25nX3Rlcm1fZnJhbWVfaWR4ICE9CisJCQkJCQlsb25nX3Rlcm1fZnJhbWVfaWR4KSkgeworCQkJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPgorCQkJCQkJZGVjb2Rlcl9pbmRleCwKKwkJCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkJCSJXYXJuaW5nOiBhc3NpZ25pbmcgbG9uZ190ZXJtX2ZyYW1lX2lkeCBkaWZmZXJlbnQgZnJvbSBvdGhlciBmaWVsZFxuIik7CisJCQkJCX0KKworCQkJCQlwX0RwYi0+ZnNfcmVmW2ldLT4KKwkJCQkJCWxvbmdfdGVybV9mcmFtZV9pZHggPQorCQkJCQkJcF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkLT4KKwkJCQkJCWxvbmdfdGVybV9mcmFtZV9pZHgKKwkJCQkJCT0gbG9uZ190ZXJtX2ZyYW1lX2lkeDsKKwkJCQkJcF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkLT4KKwkJCQkJCWxvbmdfdGVybV9waWNfbnVtID0KKwkJCQkJCTIgKiBsb25nX3Rlcm1fZnJhbWVfaWR4ICsKKwkJCQkJCWFkZF90b3A7CisJCQkJCXBfRHBiLT5mc19yZWZbaV0tPnRvcF9maWVsZC0+CisJCQkJCQlpc19sb25nX3Rlcm0gPSAxOworCQkJCQlwX0RwYi0+ZnNfcmVmW2ldLT5pc19sb25nX3Rlcm0gfD0gMTsKKwkJCQkJaWYgKChwX0RwYi0+ZnNfcmVmW2ldLT5pc19sb25nX3Rlcm0KKwkJCQkJCT09IDMpCisjaWZkZWYgRVJST1JfQ0hFQ0sKKwkJCQkJCSYmIHBfRHBiLT5mc19yZWZbaV0tPmZyYW1lCisjZW5kaWYKKwkJCQkJCSkgeworCQkJCQkJcF9EcGItPmZzX3JlZltpXS0+ZnJhbWUtPgorCQkJCQkJCWlzX2xvbmdfdGVybSA9IDE7CisJCQkJCQlwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZS0+CisJCQkJCQkJbG9uZ190ZXJtX2ZyYW1lX2lkeCA9CisJCQkJCQkJcF9EcGItPmZzX3JlZltpXS0+CisJCQkJCQkJZnJhbWUtPgorCQkJCQkJCWxvbmdfdGVybV9waWNfbnVtID0KKwkJCQkJCQlsb25nX3Rlcm1fZnJhbWVfaWR4OworCQkJCQl9CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+aXNfcmVmZXJlbmNlICYgMikgeworI2lmZGVmIEVSUk9SX0NIRUNLCisJCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0tPmJvdHRvbV9maWVsZCA9PSBOVUxMKSB7CisJCQkJCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnID0gX19MSU5FX187CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKyNlbmRpZgorCQkJCWlmICgoIXBfRHBiLT5mc19yZWZbaV0tPmJvdHRvbV9maWVsZC0+CisJCQkJCWlzX2xvbmdfdGVybSkgJiYKKwkJCQkgICAgKHBfRHBiLT5mc19yZWZbaV0tPmJvdHRvbV9maWVsZC0+cGljX251bQorCQkJCQk9PSBwaWNOdW1YKSkgeworCQkJCQlpZiAoKHBfRHBiLT5mc19yZWZbaV0tPgorCQkJCQkJaXNfbG9uZ190ZXJtKSAmJgorCQkJCQkgICAgKHBfRHBiLT5mc19yZWZbaV0tPgorCQkJCQkJbG9uZ190ZXJtX2ZyYW1lX2lkeCAhPQorCQkJCQkJbG9uZ190ZXJtX2ZyYW1lX2lkeCkpIHsKKwkJCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT4KKwkJCQkJCWRlY29kZXJfaW5kZXgsCisJCQkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJCQkiV2FybmluZzogYXNzaWduaW5nIGxvbmdfdGVybV9mcmFtZV9pZHggZGlmZmVyZW50IGZyb20gb3RoZXIgZmllbGRcbiIpOworCQkJCQl9CisKKwkJCQkJcF9EcGItPmZzX3JlZltpXS0+CisJCQkJCQlsb25nX3Rlcm1fZnJhbWVfaWR4ID0KKwkJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmJvdHRvbV9maWVsZAorCQkJCQkJLT5sb25nX3Rlcm1fZnJhbWVfaWR4CisJCQkJCQk9IGxvbmdfdGVybV9mcmFtZV9pZHg7CisJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmJvdHRvbV9maWVsZC0+CisJCQkJCQlsb25nX3Rlcm1fcGljX251bSA9IDIgKgorCQkJCQkJbG9uZ190ZXJtX2ZyYW1lX2lkeCArCisJCQkJCQlhZGRfYm90dG9tOworCQkJCQlwX0RwYi0+ZnNfcmVmW2ldLT5ib3R0b21fZmllbGQtPgorCQkJCQkJaXNfbG9uZ190ZXJtID0gMTsKKwkJCQkJcF9EcGItPmZzX3JlZltpXS0+aXNfbG9uZ190ZXJtIHw9IDI7CisJCQkJCWlmICgocF9EcGItPmZzX3JlZltpXS0+CisJCQkJCQlpc19sb25nX3Rlcm0gPT0gMykKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJCQkJJiYgcF9EcGItPmZzX3JlZltpXS0+ZnJhbWUKKyNlbmRpZgorCQkJCQkJKSB7CisJCQkJCQlwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZS0+CisJCQkJCQkJaXNfbG9uZ190ZXJtID0gMTsKKwkJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmZyYW1lLT4KKwkJCQkJCQlsb25nX3Rlcm1fZnJhbWVfaWR4ID0KKwkJCQkJCQlwX0RwYi0+ZnNfcmVmW2ldLT4KKwkJCQkJCQlmcmFtZS0+CisJCQkJCQkJbG9uZ190ZXJtX3BpY19udW0gPQorCQkJCQkJCWxvbmdfdGVybV9mcmFtZV9pZHg7CisJCQkJCX0KKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJICAiV2FybmluZzogcmVmZXJlbmNlIGZpZWxkIGZvciBsb25nIHRlcm0gbWFya2luZyBub3QgZm91bmRcbiIpOworCX0KK30KKworCisvKiEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFxicmllZgorICogICAgQXNzaWduIGEgbG9uZyB0ZXJtIGZyYW1lIGluZGV4IHRvIGEgc2hvcnQgdGVybSBwaWN0dXJlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyB2b2lkIG1tX2Fzc2lnbl9sb25nX3Rlcm1fZnJhbWVfaWR4KHN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIsCisJCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnAsIGludCBkaWZmZXJlbmNlX29mX3BpY19udW1zX21pbnVzMSwKKwkJaW50IGxvbmdfdGVybV9mcmFtZV9pZHgpCit7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSBjb250YWluZXJfb2YocF9EcGIsCisJCQlzdHJ1Y3QgaDI2NF9kcGJfc3RydSwgbURQQik7CisJaW50IHBpY051bVggPSBnZXRfcGljX251bV94KHAsIGRpZmZlcmVuY2Vfb2ZfcGljX251bXNfbWludXMxKTsKKworCS8qIHJlbW92ZSBmcmFtZXMvZmllbGRzIHdpdGggc2FtZSBsb25nX3Rlcm1fZnJhbWVfaWR4ICovCisJaWYgKHAtPnN0cnVjdHVyZSA9PSBGUkFNRSkgeworCQl1bm1hcmtfbG9uZ190ZXJtX2ZyYW1lX2Zvcl9yZWZlcmVuY2VfYnlfZnJhbWVfaWR4KHBfRHBiLAorCQkJCWxvbmdfdGVybV9mcmFtZV9pZHgpOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGludCBpOworCQllbnVtIFBpY3R1cmVTdHJ1Y3R1cmUgc3RydWN0dXJlID0gRlJBTUU7CisKKwkJZm9yIChpID0gMDsgaSA8IHBfRHBiLT5yZWZfZnJhbWVzX2luX2J1ZmZlcjsgaSsrKSB7CisjaWZkZWYgRVJST1JfQ0hFQ0sKKwkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldID09IE5VTEwpIHsKKwkJCQlwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyA9IF9fTElORV9fOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmCisJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+aXNfcmVmZXJlbmNlICYgMSkgeworI2lmZGVmIEVSUk9SX0NIRUNLCisJCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0tPnRvcF9maWVsZCA9PSBOVUxMKSB7CisJCQkJCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnID0gX19MSU5FX187CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKyNlbmRpZgorCQkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldLT50b3BfZmllbGQtPgorCQkJCQlwaWNfbnVtID09IHBpY051bVgpIHsKKwkJCQkJc3RydWN0dXJlID0gVE9QX0ZJRUxEOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+aXNfcmVmZXJlbmNlICYgMikgeworI2lmZGVmIEVSUk9SX0NIRUNLCisJCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0tPmJvdHRvbV9maWVsZCA9PSBOVUxMKSB7CisJCQkJCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnID0gX19MSU5FX187CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKyNlbmRpZgorCQkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldLT5ib3R0b21fZmllbGQtPgorCQkJCQlwaWNfbnVtID09IHBpY051bVgpIHsKKwkJCQkJc3RydWN0dXJlID0gQk9UVE9NX0ZJRUxEOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHN0cnVjdHVyZSA9PSBGUkFNRSkgeworCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJICBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJICAiZmllbGQgZm9yIGxvbmcgdGVybSBtYXJraW5nIG5vdCBmb3VuZCAlZCIsCisJCQkJICAyMDApOworCQl9CisKKwkJdW5tYXJrX2xvbmdfdGVybV9maWVsZF9mb3JfcmVmZXJlbmNlX2J5X2ZyYW1lX2lkeChwX0RwYiwKKwkJCQlzdHJ1Y3R1cmUsCisJCQkJbG9uZ190ZXJtX2ZyYW1lX2lkeCwgMCwgMCwgcGljTnVtWCk7CisJfQorCisJbWFya19waWNfbG9uZ190ZXJtKHBfRHBiLCBwLCBsb25nX3Rlcm1fZnJhbWVfaWR4LCBwaWNOdW1YKTsKK30KKworLyohCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBcYnJpZWYKKyAqICAgIFNldCBuZXcgbWF4IGxvbmdfdGVybV9mcmFtZV9pZHgKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworc3RhdGljIHZvaWQgbW1fdXBkYXRlX21heF9sb25nX3Rlcm1fZnJhbWVfaWR4KHN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlcgorCQkqcF9EcGIsIGludCBtYXhfbG9uZ190ZXJtX2ZyYW1lX2lkeF9wbHVzMSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCXBfRHBiLT5tYXhfbG9uZ190ZXJtX3BpY19pZHggPSBtYXhfbG9uZ190ZXJtX2ZyYW1lX2lkeF9wbHVzMSAtIDE7CisKKwkvKiBjaGVjayBmb3IgaW52YWxpZCBmcmFtZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPmx0cmVmX2ZyYW1lc19pbl9idWZmZXI7IGkrKykgeworCQlpZiAocF9EcGItPmZzX2x0cmVmW2ldLT5sb25nX3Rlcm1fZnJhbWVfaWR4ID4KKwkJCXBfRHBiLT5tYXhfbG9uZ190ZXJtX3BpY19pZHgpIHsKKwkJCXVubWFya19mb3JfbG9uZ190ZXJtX3JlZmVyZW5jZShwX0RwYi0+ZnNfbHRyZWZbaV0pOworCQl9CisJfQorfQorCisKKy8qIQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogXGJyaWVmCisgKiAgICBNYXJrIGFsbCBsb25nIHRlcm0gcmVmZXJlbmNlIHBpY3R1cmVzIHVudXNlZCBmb3IgcmVmZXJlbmNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyB2b2lkIG1tX3VubWFya19hbGxfbG9uZ190ZXJtX2Zvcl9yZWZlcmVuY2Uoc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyCisJCSpwX0RwYikKK3sKKwltbV91cGRhdGVfbWF4X2xvbmdfdGVybV9mcmFtZV9pZHgocF9EcGIsIDApOworfQorCisvKiEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFxicmllZgorICogICAgTWFyayBhbGwgc2hvcnQgdGVybSByZWZlcmVuY2UgcGljdHVyZXMgdW51c2VkIGZvciByZWZlcmVuY2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworc3RhdGljIHZvaWQgbW1fdW5tYXJrX2FsbF9zaG9ydF90ZXJtX2Zvcl9yZWZlcmVuY2Uoc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyCisJCSpwX0RwYikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+cmVmX2ZyYW1lc19pbl9idWZmZXI7IGkrKykKKwkJdW5tYXJrX2Zvcl9yZWZlcmVuY2UocF9EcGIsIHBfRHBiLT5mc19yZWZbaV0pOworCXVwZGF0ZV9yZWZfbGlzdChwX0RwYik7Cit9CisKKworLyohCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBcYnJpZWYKKyAqICAgIE1hcmsgdGhlIGN1cnJlbnQgcGljdHVyZSB1c2VkIGZvciBsb25nIHRlcm0gcmVmZXJlbmNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyB2b2lkIG1tX21hcmtfY3VycmVudF9waWN0dXJlX2xvbmdfdGVybShzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIKKwkJKnBfRHBiLCBzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpwLCBpbnQgbG9uZ190ZXJtX2ZyYW1lX2lkeCkKK3sKKwkvKiByZW1vdmUgbG9uZyB0ZXJtIHBpY3R1cmVzIHdpdGggc2FtZSBsb25nX3Rlcm1fZnJhbWVfaWR4ICovCisJaWYgKHAtPnN0cnVjdHVyZSA9PSBGUkFNRSkgeworCQl1bm1hcmtfbG9uZ190ZXJtX2ZyYW1lX2Zvcl9yZWZlcmVuY2VfYnlfZnJhbWVfaWR4KHBfRHBiLAorCQkJCWxvbmdfdGVybV9mcmFtZV9pZHgpOworCX0gZWxzZSB7CisJCXVubWFya19sb25nX3Rlcm1fZmllbGRfZm9yX3JlZmVyZW5jZV9ieV9mcmFtZV9pZHgocF9EcGIsCisJCQkJcC0+c3RydWN0dXJlLCBsb25nX3Rlcm1fZnJhbWVfaWR4LAorCQkJCTEsIHAtPnBpY19udW0sIDApOworCX0KKworCXAtPmlzX2xvbmdfdGVybSA9IDE7CisJcC0+bG9uZ190ZXJtX2ZyYW1lX2lkeCA9IGxvbmdfdGVybV9mcmFtZV9pZHg7Cit9CisKK3N0YXRpYyB2b2lkIGFkYXB0aXZlX21lbW9yeV9tYW5hZ2VtZW50KHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLAorCQkJCSAgICAgICBzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpwKQoreworCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIgPSAmcF9IMjY0X0RwYi0+bURQQjsKKwlzdHJ1Y3QgRGVjUmVmUGljTWFya2luZ19zICp0bXBfZHJwbTsKKwlzdHJ1Y3QgVmlkZW9QYXJhbWV0ZXJzICpwX1ZpZCA9IHBfRHBiLT5wX1ZpZDsKKworCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJIiVzXG4iLCBfX2Z1bmNfXyk7CisJcF9WaWQtPmxhc3RfaGFzX21tY29fNSA9IDA7CisKKwkvKiBhc3NlcnQgKCFwLT5pZHJfZmxhZyk7ICovCisJLyogYXNzZXJ0IChwLT5hZGFwdGl2ZV9yZWZfcGljX2J1ZmZlcmluZ19mbGFnKTsgKi8KKworCXdoaWxlIChwLT5kZWNfcmVmX3BpY19tYXJraW5nX2J1ZmZlcikgeworCQl0bXBfZHJwbSA9IHAtPmRlY19yZWZfcGljX21hcmtpbmdfYnVmZmVyOworCQlzd2l0Y2ggKHRtcF9kcnBtLT5tZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbikgeworCQljYXNlIDA6CisJCQlpZiAodG1wX2RycG0tPk5leHQgIT0gTlVMTCkKKwkJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQkJUFJJTlRfRkxBR19FUlJPUiwKKwkJCQkJImVycm9yLCBtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbiA9IDAgbm90IGxhc3Qgb3BlcmF0aW9uIGluIGJ1ZmZlclxuIik7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJbW1fdW5tYXJrX3Nob3J0X3Rlcm1fZm9yX3JlZmVyZW5jZShwX0RwYiwgcCwKKwkJCQl0bXBfZHJwbS0+ZGlmZmVyZW5jZV9vZl9waWNfbnVtc19taW51czEpOworCQkJdXBkYXRlX3JlZl9saXN0KHBfRHBiKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQltbV91bm1hcmtfbG9uZ190ZXJtX2Zvcl9yZWZlcmVuY2UocF9EcGIsIHAsCisJCQkJdG1wX2RycG0tPmxvbmdfdGVybV9waWNfbnVtKTsKKwkJCXVwZGF0ZV9sdHJlZl9saXN0KHBfRHBiKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQltbV9hc3NpZ25fbG9uZ190ZXJtX2ZyYW1lX2lkeChwX0RwYiwgcCwKKwkJCQl0bXBfZHJwbS0+ZGlmZmVyZW5jZV9vZl9waWNfbnVtc19taW51czEsCisJCQkJdG1wX2RycG0tPmxvbmdfdGVybV9mcmFtZV9pZHgpOworCQkJdXBkYXRlX3JlZl9saXN0KHBfRHBiKTsKKwkJCXVwZGF0ZV9sdHJlZl9saXN0KHBfRHBiKTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQltbV91cGRhdGVfbWF4X2xvbmdfdGVybV9mcmFtZV9pZHgocF9EcGIsCisJCQkJdG1wX2RycG0tPm1heF9sb25nX3Rlcm1fZnJhbWVfaWR4X3BsdXMxKTsKKwkJCXVwZGF0ZV9sdHJlZl9saXN0KHBfRHBiKTsKKwkJCWJyZWFrOworCQljYXNlIDU6CisJCQltbV91bm1hcmtfYWxsX3Nob3J0X3Rlcm1fZm9yX3JlZmVyZW5jZShwX0RwYik7CisJCQltbV91bm1hcmtfYWxsX2xvbmdfdGVybV9mb3JfcmVmZXJlbmNlKHBfRHBiKTsKKwkJCXBfVmlkLT5sYXN0X2hhc19tbWNvXzUgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgNjoKKwkJCW1tX21hcmtfY3VycmVudF9waWN0dXJlX2xvbmdfdGVybShwX0RwYiwgcCwKKwkJCQl0bXBfZHJwbS0+bG9uZ190ZXJtX2ZyYW1lX2lkeCk7CisJCQljaGVja19udW1fcmVmKHBfRHBiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJUFJJTlRfRkxBR19FUlJPUiwKKwkJCQkiZXJyb3IsIGludmFsaWQgbWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24gaW4gYnVmZmVyXG4iKTsKKwkJfQorCQlwLT5kZWNfcmVmX3BpY19tYXJraW5nX2J1ZmZlciA9IHRtcF9kcnBtLT5OZXh0OworCQkvKiBmcmVlICh0bXBfZHJwbSk7ICovCisJfQorCWlmIChwX1ZpZC0+bGFzdF9oYXNfbW1jb181KSB7CisJCXAtPnBpY19udW0gPSBwLT5mcmFtZV9udW0gPSAwOworCisJCXN3aXRjaCAocC0+c3RydWN0dXJlKSB7CisJCWNhc2UgVE9QX0ZJRUxEOiB7CisJCQkvKiBwLT5wb2MgPSBwLT50b3BfcG9jID0gcF9WaWQtPnRvcHBvYyA9MDsgKi8KKwkJCXAtPnBvYyA9IHAtPnRvcF9wb2MgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBCT1RUT01fRklFTEQ6IHsKKwkJCS8qIHAtPnBvYyA9IHAtPmJvdHRvbV9wb2MgPSBwX1ZpZC0+Ym90dG9tcG9jID0gMDsgKi8KKwkJCXAtPnBvYyA9IHAtPmJvdHRvbV9wb2MgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBGUkFNRTogeworCQkJcC0+dG9wX3BvYyAgICAtPSBwLT5wb2M7CisJCQlwLT5ib3R0b21fcG9jIC09IHAtPnBvYzsKKworCQkJLyogcF9WaWQtPnRvcHBvYyA9IHAtPnRvcF9wb2M7ICovCisJCQkvKiBwX1ZpZC0+Ym90dG9tcG9jID0gcC0+Ym90dG9tX3BvYzsgKi8KKworCQkJcC0+cG9jID0gaW1pbihwLT50b3BfcG9jLCBwLT5ib3R0b21fcG9jKTsKKwkJCS8qIHBfVmlkLT5mcmFtZXBvYyA9IHAtPnBvYzsgKi8KKwkJCWJyZWFrOworCQl9CisJCX0KKwkJLyogY3VyclNsaWNlLT5UaGlzUE9DID0gcC0+cG9jOyAqLworI2lmIChNVkNfRVhURU5TSU9OX0VOQUJMRSkKKwkJaWYgKHAtPnZpZXdfaWQgPT0gMCkgeworCQkJZmx1c2hfZHBiKHBfVmlkLT5wX0RwYl9sYXllclswXSk7CisJCQlmbHVzaF9kcGIocF9WaWQtPnBfRHBiX2xheWVyWzFdKTsKKwkJfSBlbHNlIHsKKwkJCWZsdXNoX2RwYihwX0RwYik7CisJCX0KKyNlbHNlCisJCWZsdXNoX2RwYihwX0gyNjRfRHBiKTsKKyNlbmRpZgorCX0KK30KKworCitpbnQgc3RvcmVfcGljdHVyZV9pbl9kcGIoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIsCisJCQkgIHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnAsCisJCQkgIHVuc2lnbmVkIGNoYXIgZGF0YV9mbGFnKQoreworCS8qIHN0cnVjdCBWaWRlb1BhcmFtZXRlcnMgKnBfVmlkID0gcF9EcGItPnBfVmlkOyAqLworCXN0cnVjdCBWaWRlb1BhcmFtZXRlcnMgKnBfVmlkID0gJnBfSDI2NF9EcGItPm1WaWRlbzsKKwlzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiID0gJnBfSDI2NF9EcGItPm1EUEI7CisJdW5zaWduZWQgaW50IGksIGZyYW1lX291dHNpZGVfY291bnQgPSAwOworI2lmIDAKKwlpbnQgcG9jLCBwb3M7CisjZW5kaWYKKwlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkiJXMgcF9WaWQgJXBcbiIsIF9fZnVuY19fLCBwX1ZpZCk7CisKKwkvKiBwaWN0dXJlIGVycm9yIGNvbmNlYWxtZW50ICovCisKKwkvKiBkaWFnbm9zdGljcyAqLworCS8qIGRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJICoJIlN0b3JpbmcgKCVzKSBub24tcmVmIHBpYyB3aXRoIGZyYW1lX251bSAjJWRcbiIsCisJICoJKHAtPnR5cGUgPT0gRlJBTUUpPyJGUkFNRSI6KHAtPnR5cGUgPT0gVE9QX0ZJRUxEKT8KKwkgKgkiVE9QX0ZJRUxEIjoiQk9UVE9NX0ZJRUxEIiwgcC0+cGljX251bSk7CisJICovCisJLyogaWYgZnJhbWUsIGNoZWNrIGZvciBuZXcgc3RvcmUsICovCisJLyogYXNzZXJ0IChwIT1OVUxMKTsgKi8KKworCXBfVmlkLT5sYXN0X2hhc19tbWNvXzUgPSAwOworCXBfVmlkLT5sYXN0X3BpY19ib3R0b21fZmllbGQgPSAocC0+c3RydWN0dXJlID09IEJPVFRPTV9GSUVMRCk7CisJaWYgKHAtPmlkcl9mbGFnKSB7CisJCWlkcl9tZW1vcnlfbWFuYWdlbWVudChwX0gyNjRfRHBiLCBwKTsKKwkJaWYgKHBfSDI2NF9EcGItPmZpcnN0X2luc2VydF9mcmFtZSA9PSBGaXJzdEluc2VydEZybV9PVVQpCisJCQlwX0gyNjRfRHBiLT5maXJzdF9pbnNlcnRfZnJhbWUgPSBGaXJzdEluc2VydEZybV9TS0lQRE9ORTsKKyNpZiAwCisvKiA/Pz8gKi8KKwkJLyogcGljdHVyZSBlcnJvciBjb25jZWFsbWVudCAqLworCQltZW1zZXQocF9WaWQtPnBvY3NfaW5fZHBiLCAwLCBzaXplb2YoaW50KSAqIDEwMCk7CisjZW5kaWYKKwl9IGVsc2UgeworI2lmIDEKKy8qID8/PyAqLworCQkvKiBhZGFwdGl2ZSBtZW1vcnkgbWFuYWdlbWVudCAqLworCQlpZiAocC0+dXNlZF9mb3JfcmVmZXJlbmNlICYmCisJCQkocC0+YWRhcHRpdmVfcmVmX3BpY19idWZmZXJpbmdfZmxhZykpCisJCQlhZGFwdGl2ZV9tZW1vcnlfbWFuYWdlbWVudChwX0gyNjRfRHBiLCBwKTsKKyNlbmRpZgorCX0KKworCWlmICgocC0+c3RydWN0dXJlID09IFRPUF9GSUVMRCkgfHwgKHAtPnN0cnVjdHVyZSA9PSBCT1RUT01fRklFTEQpKSB7CisJCS8qIGNoZWNrIGZvciBmcmFtZSBzdG9yZSB3aXRoIHNhbWUgcGljX251bWJlciAqLworCQlpZiAocF9EcGItPmxhc3RfcGljdHVyZSkgeworCQkJaWYgKChpbnQpcF9EcGItPmxhc3RfcGljdHVyZS0+ZnJhbWVfbnVtID09CisJCQkJcC0+cGljX251bSkgeworCQkJCWlmICgoKHAtPnN0cnVjdHVyZSA9PSBUT1BfRklFTEQpICYmCisJCQkJICAgIChwX0RwYi0+bGFzdF9waWN0dXJlLT5pc191c2VkID09IDIpKSB8fAorCQkJCSAgICAoKHAtPnN0cnVjdHVyZSA9PSBCT1RUT01fRklFTEQpICYmCisJCQkJICAgIChwX0RwYi0+bGFzdF9waWN0dXJlLT5pc191c2VkID09IDEpKSkgeworCQkJCQlpZiAoKHAtPnVzZWRfZm9yX3JlZmVyZW5jZSAmJgorCQkJCQkgICAgKHBfRHBiLT5sYXN0X3BpY3R1cmUtPgorCQkJCQkJaXNfb3JpZ19yZWZlcmVuY2UgIT0gMCkpIHx8CisJCQkJCSAgICAoIXAtPnVzZWRfZm9yX3JlZmVyZW5jZSAmJgorCQkJCQkJKHBfRHBiLT5sYXN0X3BpY3R1cmUtPgorCQkJCQkJaXNfb3JpZ19yZWZlcmVuY2UgPT0gMCkpKSB7CisJCQkJCQlpbnNlcnRfcGljdHVyZV9pbl9kcGIoCisJCQkJCQkJcF9IMjY0X0RwYiwKKwkJCQkJCQlwX0RwYi0+bGFzdF9waWN0dXJlLAorCQkJCQkJCXAsIGRhdGFfZmxhZyk7CisJCQkJCQl1cGRhdGVfcmVmX2xpc3QocF9EcGIpOworCQkJCQkJdXBkYXRlX2x0cmVmX2xpc3QocF9EcGIpOworCQkJCQkJZHVtcF9kcGIocF9EcGIsIDApOworCQkJCQkJcF9EcGItPmxhc3RfcGljdHVyZSA9IE5VTEw7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkvKiB0aGlzIGlzIGEgZnJhbWUgb3IgYSBmaWVsZCB3aGljaCBoYXMgbm8gc3RvcmVkCisJICogY29tcGxlbWVudGFyeSBmaWVsZAorCSAqLworCisJLyogc2xpZGluZyB3aW5kb3csIGlmIG5lY2Vzc2FyeSAqLworCWlmICgoIXAtPmlkcl9mbGFnKSAmJiAocC0+dXNlZF9mb3JfcmVmZXJlbmNlICYmCisJCQkgICAgICAgKCFwLT5hZGFwdGl2ZV9yZWZfcGljX2J1ZmZlcmluZ19mbGFnKSkpIHsKKwkJc2xpZGluZ193aW5kb3dfbWVtb3J5X21hbmFnZW1lbnQocF9EcGIsIHApOworCX0KKworCS8qIHBpY3R1cmUgZXJyb3IgY29uY2VhbG1lbnQgKi8KKwlpZiAocF9WaWQtPmNvbmNlYWxfbW9kZSAhPSAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+c2l6ZTsgaSsrKQorCQkJaWYgKHBfRHBiLT5mc1tpXS0+aXNfcmVmZXJlbmNlKQorCQkJCXBfRHBiLT5mc1tpXS0+Y29uY2VhbG1lbnRfcmVmZXJlbmNlID0gMTsKKwl9CisKKwl3aGlsZSAocmVtb3ZlX3VudXNlZF9mcmFtZV9mcm9tX2RwYihwX0gyNjRfRHBiKSkKKwkJOworCisJd2hpbGUgKG91dHB1dF9mcmFtZXMocF9IMjY0X0RwYiwgMCkpCisJCTsKKworCS8qIGNoZWNrIGZvciBkdXBsaWNhdGUgZnJhbWUgbnVtYmVyIGluIHNob3J0IHRlcm0gcmVmZXJlbmNlIGJ1ZmZlciAqLworCWlmICgocC0+dXNlZF9mb3JfcmVmZXJlbmNlKSAmJiAoIXAtPmlzX2xvbmdfdGVybSkpIHsKKwkJZm9yIChpID0gMDsgaSA8IHBfRHBiLT5yZWZfZnJhbWVzX2luX2J1ZmZlcjsgaSsrKSB7CisjaWZkZWYgRVJST1JfQ0hFQ0sKKwkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldID09IE5VTEwpCisJCQkJY29udGludWU7CisjZW5kaWYKKwkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZV9udW0gPT0gcC0+ZnJhbWVfbnVtKSB7CisJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCSAgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJCQkgICJkdXBsaWNhdGUgZnJhbWVfbnVtIGluIHNob3J0LXRlcm0gcmVmZXJlbmNlIHBpY3R1cmUgYnVmZmVyICVkXG4iLAorCQkJCQkgICA1MDApOworCQkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldLT5kcGJfZnJhbWVfY291bnQgPT0gcF9IMjY0X0RwYi0+ZHBiX2ZyYW1lX2NvdW50KSB7CisJCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQkJCSAgMCwgImR1cGxpY2F0ZSBmcmFtZSwgbm8gaW5zZXJ0IHRvIGRwYlxuIik7CisJCQkJCXJldHVybiAtMjsKKwkJCQl9IGVsc2UgeworCQkJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQkJCSAgMCwgImR1cGxpY2F0ZSBmcmFtZV9udW0gcmVsZWFzZSBkZWZvcmUgcmVmXG4iKTsKKwkJCQkJdW5tYXJrX2Zvcl9yZWZlcmVuY2UocF9EcGIsIHBfRHBiLT5mc19yZWZbaV0pOworCQkJCQl1cGRhdGVfcmVmX2xpc3QocF9EcGIpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkvKiBzdG9yZSBhdCBlbmQgb2YgYnVmZmVyICovCisKKwlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkgICIlcyBwX0RwYi0+dXNlZF9zaXplICVkXG4iLCBfX2Z1bmNfXywgcF9EcGItPnVzZWRfc2l6ZSk7CisJaWYgKHBfRHBiLT51c2VkX3NpemUgPj0gcF9EcGItPnNpemUpIHsKKwkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQlQUklOVF9GTEFHX0VSUk9SLAorCQkJIiVzIEVycm9yOiB1c2VkX3NpemQgJWQgaXMgbGFyZ2UgdGhhbiBkcGIgc2l6ZVxyXG4iLAorCQkJX19mdW5jX18sIHBfRHBiLT51c2VkX3NpemUpOworCQkvKmgyNjRfZGVidWdfZmxhZyB8PSBQUklOVF9GTEFHX0RVTVBfRFBCOyovCisJCWR1bXBfZHBiKHBfRHBiLCAwKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWluc2VydF9waWN0dXJlX2luX2RwYihwX0gyNjRfRHBiLCBwX0RwYi0+ZnNbcF9EcGItPnVzZWRfc2l6ZV0sCisJCXAsIGRhdGFfZmxhZyk7CisKKwkvKiBwaWN0dXJlIGVycm9yIGNvbmNlYWxtZW50ICovCisJaWYgKHAtPmlkcl9mbGFnKQorCQlwX1ZpZC0+ZWFybGllcl9taXNzaW5nX3BvYyA9IDA7CisKKwlpZiAocC0+c3RydWN0dXJlICE9IEZSQU1FKQorCQlwX0RwYi0+bGFzdF9waWN0dXJlID0gcF9EcGItPmZzW3BfRHBiLT51c2VkX3NpemVdOworCWVsc2UKKwkJcF9EcGItPmxhc3RfcGljdHVyZSA9IE5VTEw7CisKKwlwX0RwYi0+dXNlZF9zaXplKys7CisjaWYgMAorLyogPz8/ICovCisJaWYgKHBfVmlkLT5jb25jZWFsX21vZGUgIT0gMCkKKwkJcF9WaWQtPnBvY3NfaW5fZHBiW3BfRHBiLT51c2VkX3NpemUgLSAxXSA9IHAtPnBvYzsKKyNlbmRpZgorCXVwZGF0ZV9yZWZfbGlzdChwX0RwYik7CisJdXBkYXRlX2x0cmVmX2xpc3QocF9EcGIpOworCisJY2hlY2tfbnVtX3JlZihwX0RwYik7CisJZm9yIChpID0gMDsgaSA8IHBfRHBiLT51c2VkX3NpemU7IGkrKykgeworCQlpZiAocF9EcGItPmZzW2ldLT5wcmVfb3V0cHV0KQorCQkJZnJhbWVfb3V0c2lkZV9jb3VudCsrOworCX0KKworCWlmIChwX0gyNjRfRHBiLT5mYXN0X291dHB1dF9lbmFibGUgPT0gSDI2NF9PVVRQVVRfTU9ERV9GQVNUKQorCQlpID0gMTsKKwllbHNlCisJCWkgPSAwOworCisJaWYgKGkgfHwgKHBfSDI2NF9EcGItPmZpcnN0X2luc2VydF9mcmFtZSA8IEZpcnN0SW5zZXJ0RnJtX1NLSVBET05FKSkgeworCQl3aGlsZSAob3V0cHV0X2ZyYW1lcyhwX0gyNjRfRHBiLCBpKSkKKwkJCTsKKwl9CisKKwlkdW1wX2RwYihwX0RwYiwgMCk7CisJcF9EcGItPmZpcnN0X3BpY19kb25lID0gMTsgLypieSByYWluKi8KKworCXJldHVybiAwOworfQorCit2b2lkIGJ1Zm1ncl9wb3N0KHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiKQoreworCS8qVmlkZW9QYXJhbWV0ZXJzICpwX1ZpZCA9IHBfRHBiLT5wX1ZpZDsqLworCXN0cnVjdCBWaWRlb1BhcmFtZXRlcnMgKnBfVmlkID0gJnBfSDI2NF9EcGItPm1WaWRlbzsKKworCWlmIChwX1ZpZC0+bGFzdF9oYXNfbW1jb181KQorCQlwX1ZpZC0+cHJlX2ZyYW1lX251bSA9IDA7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgSW5pdGlhbGl6ZSByZWZlcmVuY2UgbGlzdHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKyNkZWZpbmUgX19DT01QQVJFKGNvbnRleHQsIHAxLCBwMikgY29tcChwMSwgcDIpCisjZGVmaW5lIF9fU0hPUlRTT1JUKGxvLCBoaSwgd2lkdGgsIGNvbXAsIGNvbnRleHQpIFwKKwlzaG9ydHNvcnQobG8sIGhpLCB3aWR0aCwgY29tcCkKKyNkZWZpbmUgQ1VUT0ZGIDggICAgICAgICAgICAvKiB0ZXN0aW5nIHNob3dzIHRoYXQgdGhpcyBpcyBnb29kIHZhbHVlICovCisjZGVmaW5lIFNUS1NJWiAoOCpzaXplb2Yodm9pZCAqKSAtIDIpCisKKyN1bmRlZiBzd2FwCitzdGF0aWMgdm9pZCBzd2FwKAorCWNoYXIgKmEsCisJY2hhciAqYiwKKwlzaXplX3Qgd2lkdGgKKykKK3sKKwljaGFyIHRtcDsKKworCWlmIChhICE9IGIpCisJCS8qIERvIHRoZSBzd2FwIG9uZSBjaGFyYWN0ZXIgYXQgYSB0aW1lIHRvIGF2b2lkIHBvdGVudGlhbAorCQkgKiAgIGFsaWdubWVudCBwcm9ibGVtcy4KKwkJICovCisJCXdoaWxlICh3aWR0aC0tKSB7CisJCQl0bXAgPSAqYTsKKwkJCSphKysgPSAqYjsKKwkJCSpiKysgPSB0bXA7CisJCX0KK30KKworc3RhdGljIHZvaWQgc2hvcnRzb3J0KAorCWNoYXIgKmxvLAorCWNoYXIgKmhpLAorCXNpemVfdCB3aWR0aCwKKwlpbnQgKCpjb21wKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikKKykKK3sKKwljaGFyICpwLCAqbWF4OworCisJLyogTm90ZTogaW4gYXNzZXJ0aW9ucyBiZWxvdywgaSBhbmQgaiBhcmUgYWx3YXkgaW5zaWRlIG9yaWdpbmFsCisJICogICBib3VuZCBvZiBhcnJheSB0byBzb3J0LgorCSAqLworCisJd2hpbGUgKGhpID4gbG8pIHsKKwkJLyogQVtpXSA8PSBBW2pdIGZvciBpIDw9IGosIGogPiBoaSAqLworCQltYXggPSBsbzsKKwkJZm9yIChwID0gbG8gKyB3aWR0aDsgcCA8PSBoaTsgcCArPSB3aWR0aCkgeworCQkJLyogQVtpXSA8PSBBW21heF0gZm9yIGxvIDw9IGkgPCBwICovCisJCQlpZiAoX19DT01QQVJFKGNvbnRleHQsIHAsIG1heCkgPiAwKQorCQkJCW1heCA9IHA7CisJCQkvKiBBW2ldIDw9IEFbbWF4XSBmb3IgbG8gPD0gaSA8PSBwICovCisJCX0KKworCQkvKiBBW2ldIDw9IEFbbWF4XSBmb3IgbG8gPD0gaSA8PSBoaSAqLworCisJCXN3YXAobWF4LCBoaSwgd2lkdGgpOworCisJCS8qIEFbaV0gPD0gQVtoaV0gZm9yIGkgPD0gaGksIHNvIEFbaV0gPD0gQVtqXSBmb3IgaSA8PSBqLAorCQkgKiAgIGogPj0gaGkKKwkJICovCisKKwkJaGkgLT0gd2lkdGg7CisKKwkJLyogQVtpXSA8PSBBW2pdIGZvciBpIDw9IGosIGogPiBoaSwgbG9vcCB0b3AgY29uZGl0aW9uCisJCSAqICAgZXN0YWJsaXNoZWQKKwkJICovCisJfQorCS8qIEFbaV0gPD0gQVtqXSBmb3IgaSA8PSBqLCBqID4gbG8sIHdoaWNoIGltcGxpZXMgQVtpXSA8PSBBW2pdCisJICogICBmb3IgaSA8IGosIHNvIGFycmF5IGlzIHNvcnRlZAorCSAqLworfQorCitzdGF0aWMgdm9pZCBxc29ydCgKKwl2b2lkICpiYXNlLAorCXNpemVfdCBudW0sCisJc2l6ZV90IHdpZHRoLAorCWludCAoKmNvbXApKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKQorKQoreworCWNoYXIgKmxvLCAqaGk7ICAgICAgICAgICAgICAvKiBlbmRzIG9mIHN1Yi1hcnJheSBjdXJyZW50bHkgc29ydGluZyAqLworCWNoYXIgKm1pZDsgICAgICAgICAgICAgICAgICAvKiBwb2ludHMgdG8gbWlkZGxlIG9mIHN1YmFycmF5ICovCisJY2hhciAqbG9ndXksICpoaWd1eTsgICAgICAgIC8qIHRyYXZlbGluZyBwb2ludGVycyBmb3IgcGFydGl0aW9uIHN0ZXAgKi8KKwlzaXplX3Qgc2l6ZTsgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiB0aGUgc3ViLWFycmF5ICovCisJY2hhciAqbG9zdGtbU1RLU0laXSwgKmhpc3RrW1NUS1NJWl07CisJaW50IHN0a3B0cjsKKworLyogIHN0YWNrIGZvciBzYXZpbmcgc3ViLWFycmF5IHRvIGJlCisgKgkJCQkJcHJvY2Vzc2VkCisgKi8KKyNpZiAwCisJLyogdmFsaWRhdGlvbiBzZWN0aW9uICovCisJX1ZBTElEQVRFX1JFVFVSTl9WT0lEKGJhc2UgIT0gTlVMTCB8fCBudW0gPT0gMCwgRUlOVkFMKTsKKwlfVkFMSURBVEVfUkVUVVJOX1ZPSUQod2lkdGggPiAwLCBFSU5WQUwpOworCV9WQUxJREFURV9SRVRVUk5fVk9JRChjb21wICE9IE5VTEwsIEVJTlZBTCk7CisjZW5kaWYKKwlpZiAobnVtIDwgMikKKwkJcmV0dXJuOyAgICAgICAgICAgICAgICAgLyogbm90aGluZyB0byBkbyAqLworCisJc3RrcHRyID0gMDsgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgc3RhY2sgKi8KKworCWxvID0gKGNoYXIgKiliYXNlOworCWhpID0gKGNoYXIgKiliYXNlICsgd2lkdGggKiAobnVtIC0gMSk7ICAgICAgLyogaW5pdGlhbGl6ZSBsaW1pdHMgKi8KKworCS8qIHRoaXMgZW50cnkgcG9pbnQgaXMgZm9yIHBzZXVkby1yZWN1cnNpb24gY2FsbGluZzogc2V0dGluZworCSAqIGxvIGFuZCBoaSBhbmQganVtcGluZyB0byBoZXJlIGlzIGxpa2UgcmVjdXJzaW9uLCBidXQgc3RrcHRyIGlzCisJICogcHJlc2VydmVkLCBsb2NhbHMgYXJlbid0LCBzbyB3ZSBwcmVzZXJ2ZSBzdHVmZiBvbiB0aGUgc3RhY2sKKwkgKi8KK3JlY3Vyc2U6CisKKwlzaXplID0gKGhpIC0gbG8pIC8gd2lkdGggKyAxOyAgICAgICAgLyogbnVtYmVyIG9mIGVsJ3MgdG8gc29ydCAqLworCisJLyogYmVsb3cgYSBjZXJ0YWluIHNpemUsIGl0IGlzIGZhc3RlciB0byB1c2UgYSBPKG5eMikgc29ydGluZyBtZXRob2QgKi8KKwlpZiAoc2l6ZSA8PSBDVVRPRkYpIHsKKwkJX19TSE9SVFNPUlQobG8sIGhpLCB3aWR0aCwgY29tcCwgY29udGV4dCk7CisJfSBlbHNlIHsKKwkJLyogRmlyc3Qgd2UgcGljayBhIHBhcnRpdGlvbmluZyBlbGVtZW50LiAgVGhlIGVmZmljaWVuY3kgb2YKKwkJICogdGhlIGFsZ29yaXRobSBkZW1hbmRzIHRoYXQgd2UgZmluZCBvbmUgdGhhdCBpcyBhcHByb3hpbWF0ZWx5CisJCSAqIHRoZSBtZWRpYW4gb2YgdGhlIHZhbHVlcywgYnV0IGFsc28gdGhhdCB3ZSBzZWxlY3Qgb25lIGZhc3QuCisJCSAqIFdlIGNob29zZSB0aGUgbWVkaWFuIG9mIHRoZSBmaXJzdCwgbWlkZGxlLCBhbmQgbGFzdAorCQkgKiBlbGVtZW50cywgdG8gYXZvaWQgYmFkIHBlcmZvcm1hbmNlIGluIHRoZSBmYWNlIG9mIGFscmVhZHkKKwkJICogc29ydGVkIGRhdGEsIG9yIGRhdGEgdGhhdCBpcyBtYWRlIHVwIG9mIG11bHRpcGxlIHNvcnRlZAorCQkgKiBydW5zIGFwcGVuZGVkIHRvZ2V0aGVyLiAgVGVzdGluZyBzaG93cyB0aGF0IGEKKwkJICogbWVkaWFuLW9mLXRocmVlIGFsZ29yaXRobSBwcm92aWRlcyBiZXR0ZXIgcGVyZm9ybWFuY2UgdGhhbgorCQkgKiBzaW1wbHkgcGlja2luZyB0aGUgbWlkZGxlIGVsZW1lbnQgZm9yIHRoZSBsYXR0ZXIgY2FzZS4KKwkJICovCisKKwkJbWlkID0gbG8gKyAoc2l6ZSAvIDIpICogd2lkdGg7ICAgICAgLyogZmluZCBtaWRkbGUgZWxlbWVudCAqLworCisJCS8qIFNvcnQgdGhlIGZpcnN0LCBtaWRkbGUsIGxhc3QgZWxlbWVudHMgaW50byBvcmRlciAqLworCQlpZiAoX19DT01QQVJFKGNvbnRleHQsIGxvLCBtaWQpID4gMCkKKwkJCXN3YXAobG8sIG1pZCwgd2lkdGgpOworCQlpZiAoX19DT01QQVJFKGNvbnRleHQsIGxvLCBoaSkgPiAwKQorCQkJc3dhcChsbywgaGksIHdpZHRoKTsKKwkJaWYgKF9fQ09NUEFSRShjb250ZXh0LCBtaWQsIGhpKSA+IDApCisJCQlzd2FwKG1pZCwgaGksIHdpZHRoKTsKKworCQkvKiBXZSBub3cgd2lzaCB0byBwYXJ0aXRpb24gdGhlIGFycmF5IGludG8gdGhyZWUgcGllY2VzLCBvbmUKKwkJICogY29uc2lzdGluZyBvZiBlbGVtZW50cyA8PSBwYXJ0aXRpb24gZWxlbWVudCwgb25lIG9mIGVsZW1lbnRzCisJCSAqIGVxdWFsIHRvIHRoZSBwYXJ0aXRpb24gZWxlbWVudCwgYW5kIG9uZSBvZiBlbGVtZW50cyA+IHRoYW4KKwkJICogaXQuIFRoaXMgaXMgZG9uZSBiZWxvdzsgY29tbWVudHMgaW5kaWNhdGUgY29uZGl0aW9ucworCQkgKiBlc3RhYmxpc2hlZCBhdCBldmVyeSBzdGVwLgorCQkgKi8KKworCQlsb2d1eSA9IGxvOworCQloaWd1eSA9IGhpOworCisJCS8qIE5vdGUgdGhhdCBoaWd1eSBkZWNyZWFzZXMgYW5kIGxvZ3V5IGluY3JlYXNlcyBvbiBldmVyeQorCQkgKiAgIGl0ZXJhdGlvbiwgc28gbG9vcCBtdXN0IHRlcm1pbmF0ZS4KKwkJICovCisJCWZvciAoOzspIHsKKwkJCS8qIGxvIDw9IGxvZ3V5IDwgaGksIGxvIDwgaGlndXkgPD0gaGksCisJCQkgKiAgIEFbaV0gPD0gQVttaWRdIGZvciBsbyA8PSBpIDw9IGxvZ3V5LAorCQkJICogICBBW2ldID4gQVttaWRdIGZvciBoaWd1eSA8PSBpIDwgaGksCisJCQkgKiAgIEFbaGldID49IEFbbWlkXQorCQkJICovCisKKwkJCS8qIFRoZSBkb3VibGVkIGxvb3AgaXMgdG8gYXZvaWQgY2FsbGluZyBjb21wKG1pZCxtaWQpLAorCQkJICogICBzaW5jZSBzb21lIGV4aXN0aW5nIGNvbXBhcmlzb24gZnVuY3MgZG9uJ3Qgd29yaworCQkJICogICB3aGVuIHBhc3NlZCB0aGUgc2FtZSB2YWx1ZSBmb3IgYm90aCBwb2ludGVycy4KKwkJCSAqLworCisJCQlpZiAobWlkID4gbG9ndXkpIHsKKwkJCQlkbyAgeworCQkJCQlsb2d1eSArPSB3aWR0aDsKKwkJCQl9IHdoaWxlIChsb2d1eSA8IG1pZCAmJgorCQkJCQlfX0NPTVBBUkUoY29udGV4dCwgbG9ndXksIG1pZCkgPD0gMCk7CisJCQl9CisJCQlpZiAobWlkIDw9IGxvZ3V5KSB7CisJCQkJZG8gIHsKKwkJCQkJbG9ndXkgKz0gd2lkdGg7CisJCQkJfSB3aGlsZSAobG9ndXkgPD0gaGkgJiYKKwkJCQkJX19DT01QQVJFKGNvbnRleHQsIGxvZ3V5LCBtaWQpIDw9IDApOworCQkJfQorCisJCQkvKiBsbyA8IGxvZ3V5IDw9IGhpKzEsIEFbaV0gPD0gQVttaWRdIGZvcgorCQkJICogICBsbyA8PSBpIDwgbG9ndXksCisJCQkgKiAgIGVpdGhlciBsb2d1eSA+IGhpIG9yIEFbbG9ndXldID4gQVttaWRdCisJCQkgKi8KKworCQkJZG8gIHsKKwkJCQloaWd1eSAtPSB3aWR0aDsKKwkJCX0gd2hpbGUgKGhpZ3V5ID4gbWlkICYmCisJCQkJCV9fQ09NUEFSRShjb250ZXh0LCBoaWd1eSwgbWlkKSA+IDApOworCisJCQkvKiBsbyA8PSBoaWd1eSA8IGhpLCBBW2ldID4gQVttaWRdIGZvciBoaWd1eSA8IGkgPCBoaSwKKwkJCSAqICAgZWl0aGVyIGhpZ3V5ID09IGxvIG9yIEFbaGlndXldIDw9IEFbbWlkXQorCQkJICovCisKKwkJCWlmIChoaWd1eSA8IGxvZ3V5KQorCQkJCWJyZWFrOworCisJCQkvKiBpZiBsb2d1eSA+IGhpIG9yIGhpZ3V5ID09IGxvLCB0aGVuIHdlIHdvdWxkIGhhdmUKKwkJCSAqICAgZXhpdGVkLCBzbyBBW2xvZ3V5XSA+IEFbbWlkXSwgQVtoaWd1eV0gPD0gQVttaWRdLAorCQkJICogICBsb2d1eSA8PSBoaSwgaGlndXkgPiBsbworCQkJICovCisKKwkJCXN3YXAobG9ndXksIGhpZ3V5LCB3aWR0aCk7CisKKwkJCS8qIElmIHRoZSBwYXJ0aXRpb24gZWxlbWVudCB3YXMgbW92ZWQsIGZvbGxvdyBpdC4KKwkJCSAqICAgT25seSBuZWVkIHRvIGNoZWNrIGZvciBtaWQgPT0gaGlndXksIHNpbmNlIGJlZm9yZQorCQkJICogICB0aGUgc3dhcCwgQVtsb2d1eV0gPiBBW21pZF0gaW1wbGllcyBsb2d1eSAhPSBtaWQuCisJCQkgKi8KKworCQkJaWYgKG1pZCA9PSBoaWd1eSkKKwkJCQltaWQgPSBsb2d1eTsKKworCQkJLyogQVtsb2d1eV0gPD0gQVttaWRdLCBBW2hpZ3V5XSA+IEFbbWlkXTsgc28gY29uZGl0aW9uCisJCQkgKiAgIGF0IHRvcCBvZiBsb29wIGlzIHJlLWVzdGFibGlzaGVkCisJCQkgKi8KKwkJfQorCisJCS8qICAgICBBW2ldIDw9IEFbbWlkXSBmb3IgbG8gPD0gaSA8IGxvZ3V5LAorCQkgKiAgICAgICBBW2ldID4gQVttaWRdIGZvciBoaWd1eSA8IGkgPCBoaSwKKwkJICogICAgICAgQVtoaV0gPj0gQVttaWRdCisJCSAqICAgICAgIGhpZ3V5IDwgbG9ndXkKKwkJICogICBpbXBseWluZzoKKwkJICogICAgICAgaGlndXkgPT0gbG9ndXktMQorCQkgKiAgICAgICBvciBoaWd1eSA9PSBoaSAtIDEsIGxvZ3V5ID09IGhpICsgMSwgQVtoaV0gPT0gQVttaWRdCisJCSAqLworCisJCS8qIEZpbmQgYWRqYWNlbnQgZWxlbWVudHMgZXF1YWwgdG8gdGhlIHBhcnRpdGlvbiBlbGVtZW50LiAgVGhlCisJCSAqICAgZG91YmxlZCBsb29wIGlzIHRvIGF2b2lkIGNhbGxpbmcgY29tcChtaWQsbWlkKSwgc2luY2Ugc29tZQorCQkgKiAgIGV4aXN0aW5nIGNvbXBhcmlzb24gZnVuY3MgZG9uJ3Qgd29yayB3aGVuIHBhc3NlZCB0aGUgc2FtZQorCQkgKiAgIHZhbHVlIGZvciBib3RoIHBvaW50ZXJzLgorCQkgKi8KKworCQloaWd1eSArPSB3aWR0aDsKKwkJaWYgKG1pZCA8IGhpZ3V5KSB7CisJCQlkbyAgeworCQkJCWhpZ3V5IC09IHdpZHRoOworCQkJfSB3aGlsZSAoaGlndXkgPiBtaWQgJiYKKwkJCQlfX0NPTVBBUkUoY29udGV4dCwgaGlndXksIG1pZCkgPT0gMCk7CisJCX0KKwkJaWYgKG1pZCA+PSBoaWd1eSkgeworCQkJZG8gIHsKKwkJCQloaWd1eSAtPSB3aWR0aDsKKwkJCX0gd2hpbGUgKGhpZ3V5ID4gbG8gJiYKKwkJCQlfX0NPTVBBUkUoY29udGV4dCwgaGlndXksIG1pZCkgPT0gMCk7CisJCX0KKworCQkvKiBPSywgbm93IHdlIGhhdmUgdGhlIGZvbGxvd2luZzoKKwkJICogICAgICBoaWd1eSA8IGxvZ3V5CisJCSAqICAgICAgbG8gPD0gaGlndXkgPD0gaGkKKwkJICogICAgICBBW2ldICA8PSBBW21pZF0gZm9yIGxvIDw9IGkgPD0gaGlndXkKKwkJICogICAgICBBW2ldICA9PSBBW21pZF0gZm9yIGhpZ3V5IDwgaSA8IGxvZ3V5CisJCSAqICAgICAgQVtpXSAgPiAgQVttaWRdIGZvciBsb2d1eSA8PSBpIDwgaGkKKwkJICogICAgICBBW2hpXSA+PSBBW21pZF0KKwkJICovCisKKwkJLyogV2UndmUgZmluaXNoZWQgdGhlIHBhcnRpdGlvbiwgbm93IHdlIHdhbnQgdG8gc29ydCB0aGUKKwkJICogICBzdWJhcnJheXMgW2xvLCBoaWd1eV0gYW5kIFtsb2d1eSwgaGldLgorCQkgKiAgIFdlIGRvIHRoZSBzbWFsbGVyIG9uZSBmaXJzdCB0byBtaW5pbWl6ZSBzdGFjayB1c2FnZS4KKwkJICogICBXZSBvbmx5IHNvcnQgYXJyYXlzIG9mIGxlbmd0aCAyIG9yIG1vcmUuCisJCSAqLworCisJCWlmIChoaWd1eSAtIGxvID49IGhpIC0gbG9ndXkpIHsKKwkJCWlmIChsbyA8IGhpZ3V5KSB7CisJCQkJbG9zdGtbc3RrcHRyXSA9IGxvOworCQkJCWhpc3RrW3N0a3B0cl0gPSBoaWd1eTsKKwkJCQkrK3N0a3B0cjsKKwkJCX0gICAgICAgICAgICAgICAgICAgIC8qIHNhdmUgYmlnIHJlY3Vyc2lvbiBmb3IgbGF0ZXIgKi8KKworCQkJaWYgKGxvZ3V5IDwgaGkpIHsKKwkJCQlsbyA9IGxvZ3V5OworCQkJCWdvdG8gcmVjdXJzZTsgICAgICAgICAgLyogZG8gc21hbGwgcmVjdXJzaW9uICovCisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAobG9ndXkgPCBoaSkgeworCQkJCWxvc3RrW3N0a3B0cl0gPSBsb2d1eTsKKwkJCQloaXN0a1tzdGtwdHJdID0gaGk7CisJCQkJKytzdGtwdHI7ICAgIC8qIHNhdmUgYmlnIHJlY3Vyc2lvbiBmb3IgbGF0ZXIgKi8KKwkJCX0KKworCQkJaWYgKGxvIDwgaGlndXkpIHsKKwkJCQloaSA9IGhpZ3V5OworCQkJCWdvdG8gcmVjdXJzZTsgICAgICAgICAgLyogZG8gc21hbGwgcmVjdXJzaW9uICovCisJCQl9CisJCX0KKwl9CisKKwkvKiBXZSBoYXZlIHNvcnRlZCB0aGUgYXJyYXksIGV4Y2VwdCBmb3IgYW55IHBlbmRpbmcgc29ydHMgb24gdGhlIHN0YWNrLgorCSAqICAgQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSwgYW5kIGRvIHRoZW0uCisJICovCisKKwktLXN0a3B0cjsKKwlpZiAoc3RrcHRyID49IDApIHsKKwkJbG8gPSBsb3N0a1tzdGtwdHJdOworCQloaSA9IGhpc3RrW3N0a3B0cl07CisJCWdvdG8gcmVjdXJzZTsgICAgICAgICAgIC8qIHBvcCBzdWJhcnJheSBmcm9tIHN0YWNrICovCisJfSBlbHNlCisJCXJldHVybjsgICAgICAgICAgICAgICAgIC8qIGFsbCBzdWJhcnJheXMgZG9uZSAqLworfQorCisvKiEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFxicmllZgorICogICAgY29tcGFyZXMgdHdvIHN0b3JlZCBwaWN0dXJlcyBieSBwaWN0dXJlIG51bWJlciBmb3IgcXNvcnQgaW4KKyAqICAgIGRlc2NlbmRpbmcgb3JkZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNvbXBhcmVfcGljX2J5X3BpY19udW1fZGVzYyhjb25zdCB2b2lkICphcmcxLAorCQljb25zdCB2b2lkICphcmcyKQoreworCWludCBwaWNfbnVtMSA9ICgqKHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKiopYXJnMSktPnBpY19udW07CisJaW50IHBpY19udW0yID0gKCooc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqKilhcmcyKS0+cGljX251bTsKKworCWlmIChwaWNfbnVtMSA8IHBpY19udW0yKQorCQlyZXR1cm4gMTsKKwlpZiAocGljX251bTEgPiBwaWNfbnVtMikKKwkJcmV0dXJuIC0xOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qIQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogXGJyaWVmCisgKiAgICBjb21wYXJlcyB0d28gc3RvcmVkIHBpY3R1cmVzIGJ5IHBpY3R1cmUgbnVtYmVyIGZvciBxc29ydCBpbgorICogICAgZGVzY2VuZGluZyBvcmRlcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworc3RhdGljIGlubGluZSBpbnQgY29tcGFyZV9waWNfYnlfbHRfcGljX251bV9hc2MoY29uc3Qgdm9pZCAqYXJnMSwKKwkJY29uc3Qgdm9pZCAqYXJnMikKK3sKKwlpbnQgbG9uZ190ZXJtX3BpY19udW0xID0KKwkJKCooc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqKilhcmcxKS0+bG9uZ190ZXJtX3BpY19udW07CisJaW50IGxvbmdfdGVybV9waWNfbnVtMiA9CisJCSgqKHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKiopYXJnMiktPmxvbmdfdGVybV9waWNfbnVtOworCisJaWYgKGxvbmdfdGVybV9waWNfbnVtMSA8IGxvbmdfdGVybV9waWNfbnVtMikKKwkJcmV0dXJuIC0xOworCWlmIChsb25nX3Rlcm1fcGljX251bTEgPiBsb25nX3Rlcm1fcGljX251bTIpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qIQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogXGJyaWVmCisgKiAgICBjb21wYXJlcyB0d28gZnJhbWUgc3RvcmVzIGJ5IHBpY19udW0gZm9yIHFzb3J0IGluIGRlc2NlbmRpbmcgb3JkZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNvbXBhcmVfZnNfYnlfZnJhbWVfbnVtX2Rlc2MoY29uc3Qgdm9pZCAqYXJnMSwKKwkJY29uc3Qgdm9pZCAqYXJnMikKK3sKKwlpbnQgZnJhbWVfbnVtX3dyYXAxID0gKCooc3RydWN0IEZyYW1lU3RvcmUgKiopYXJnMSktPmZyYW1lX251bV93cmFwOworCWludCBmcmFtZV9udW1fd3JhcDIgPSAoKihzdHJ1Y3QgRnJhbWVTdG9yZSAqKilhcmcyKS0+ZnJhbWVfbnVtX3dyYXA7CisKKwlpZiAoZnJhbWVfbnVtX3dyYXAxIDwgZnJhbWVfbnVtX3dyYXAyKQorCQlyZXR1cm4gMTsKKwlpZiAoZnJhbWVfbnVtX3dyYXAxID4gZnJhbWVfbnVtX3dyYXAyKQorCQlyZXR1cm4gLTE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworCisvKiEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFxicmllZgorICogICAgY29tcGFyZXMgdHdvIGZyYW1lIHN0b3JlcyBieSBsdF9waWNfbnVtIGZvciBxc29ydCBpbiBkZXNjZW5kaW5nIG9yZGVyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGF0aWMgaW5saW5lIGludCBjb21wYXJlX2ZzX2J5X2x0X3BpY19pZHhfYXNjKGNvbnN0IHZvaWQgKmFyZzEsCisJCWNvbnN0IHZvaWQgKmFyZzIpCit7CisJaW50IGxvbmdfdGVybV9mcmFtZV9pZHgxID0KKwkJKCooc3RydWN0IEZyYW1lU3RvcmUgKiopYXJnMSktPmxvbmdfdGVybV9mcmFtZV9pZHg7CisJaW50IGxvbmdfdGVybV9mcmFtZV9pZHgyID0KKwkJKCooc3RydWN0IEZyYW1lU3RvcmUgKiopYXJnMiktPmxvbmdfdGVybV9mcmFtZV9pZHg7CisKKwlpZiAobG9uZ190ZXJtX2ZyYW1lX2lkeDEgPCBsb25nX3Rlcm1fZnJhbWVfaWR4MikKKwkJcmV0dXJuIC0xOworCWVsc2UgaWYgKGxvbmdfdGVybV9mcmFtZV9pZHgxID4gbG9uZ190ZXJtX2ZyYW1lX2lkeDIpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKworLyohCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBcYnJpZWYKKyAqICAgIGNvbXBhcmVzIHR3byBzdG9yZWQgcGljdHVyZXMgYnkgcG9jIGZvciBxc29ydCBpbiBhc2NlbmRpbmcgb3JkZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNvbXBhcmVfcGljX2J5X3BvY19hc2MoY29uc3Qgdm9pZCAqYXJnMSwgY29uc3Qgdm9pZCAqYXJnMikKK3sKKwlpbnQgcG9jMSA9ICgqKHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKiopYXJnMSktPnBvYzsKKwlpbnQgcG9jMiA9ICgqKHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKiopYXJnMiktPnBvYzsKKworCWlmIChwb2MxIDwgcG9jMikKKwkJcmV0dXJuIC0xOworCWVsc2UgaWYgKHBvYzEgPiBwb2MyKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCisKKy8qIQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogXGJyaWVmCisgKiAgICBjb21wYXJlcyB0d28gc3RvcmVkIHBpY3R1cmVzIGJ5IHBvYyBmb3IgcXNvcnQgaW4gZGVzY2VuZGluZyBvcmRlcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworc3RhdGljIGlubGluZSBpbnQgY29tcGFyZV9waWNfYnlfcG9jX2Rlc2MoY29uc3Qgdm9pZCAqYXJnMSwgY29uc3Qgdm9pZCAqYXJnMikKK3sKKwlpbnQgcG9jMSA9ICgqKHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKiopYXJnMSktPnBvYzsKKwlpbnQgcG9jMiA9ICgqKHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKiopYXJnMiktPnBvYzsKKworCWlmIChwb2MxIDwgcG9jMikKKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAocG9jMSA+IHBvYzIpCisJCXJldHVybiAtMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCisKKy8qIQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogXGJyaWVmCisgKiAgICBjb21wYXJlcyB0d28gZnJhbWUgc3RvcmVzIGJ5IHBvYyBmb3IgcXNvcnQgaW4gYXNjZW5kaW5nIG9yZGVyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGF0aWMgaW5saW5lIGludCBjb21wYXJlX2ZzX2J5X3BvY19hc2MoY29uc3Qgdm9pZCAqYXJnMSwgY29uc3Qgdm9pZCAqYXJnMikKK3sKKwlpbnQgcG9jMSA9ICgqKHN0cnVjdCBGcmFtZVN0b3JlICoqKWFyZzEpLT5wb2M7CisJaW50IHBvYzIgPSAoKihzdHJ1Y3QgRnJhbWVTdG9yZSAqKilhcmcyKS0+cG9jOworCisJaWYgKHBvYzEgPCBwb2MyKQorCQlyZXR1cm4gLTE7CisJZWxzZSBpZiAocG9jMSA+IHBvYzIpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKworLyohCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBcYnJpZWYKKyAqICAgIGNvbXBhcmVzIHR3byBmcmFtZSBzdG9yZXMgYnkgcG9jIGZvciBxc29ydCBpbiBkZXNjZW5kaW5nIG9yZGVyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGF0aWMgaW5saW5lIGludCBjb21wYXJlX2ZzX2J5X3BvY19kZXNjKGNvbnN0IHZvaWQgKmFyZzEsIGNvbnN0IHZvaWQgKmFyZzIpCit7CisJaW50IHBvYzEgPSAoKihzdHJ1Y3QgRnJhbWVTdG9yZSAqKilhcmcxKS0+cG9jOworCWludCBwb2MyID0gKCooc3RydWN0IEZyYW1lU3RvcmUgKiopYXJnMiktPnBvYzsKKworCWlmIChwb2MxIDwgcG9jMikKKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAocG9jMSA+IHBvYzIpCisJCXJldHVybiAtMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKiEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFxicmllZgorICogICAgcmV0dXJucyB0cnVlLCBpZiBwaWN0dXJlIGlzIHNob3J0IHRlcm0gcmVmZXJlbmNlIHBpY3R1cmUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzX3Nob3J0X3JlZihzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpzKQoreworI2lmZGVmIEVSUk9SX0NIRUNLCisJcmV0dXJuIChzICYmCisJCShzLT51c2VkX2Zvcl9yZWZlcmVuY2UpICYmICghKHMtPmlzX2xvbmdfdGVybSkpKTsKKyNlbHNlCisJcmV0dXJuIChzLT51c2VkX2Zvcl9yZWZlcmVuY2UpICYmICghKHMtPmlzX2xvbmdfdGVybSkpOworI2VuZGlmCit9CisKKworLyohCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBcYnJpZWYKKyAqICAgIHJldHVybnMgdHJ1ZSwgaWYgcGljdHVyZSBpcyBsb25nIHRlcm0gcmVmZXJlbmNlIHBpY3R1cmUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzX2xvbmdfcmVmKHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnMpCit7CisjaWZkZWYgRVJST1JfQ0hFQ0sKKwlyZXR1cm4gKHMgJiYKKwkJcy0+dXNlZF9mb3JfcmVmZXJlbmNlKSAmJiAocy0+aXNfbG9uZ190ZXJtKTsKKyNlbHNlCisJcmV0dXJuIChzLT51c2VkX2Zvcl9yZWZlcmVuY2UpICYmIChzLT5pc19sb25nX3Rlcm0pOworI2VuZGlmCit9CisKKy8qIQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogXGJyaWVmCisgKiAgICBJbml0aWFsaXplIHJlZmVyZW5jZSBsaXN0cyBmb3IgYSBQIFNsaWNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisvKiEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFxicmllZgorICogICAgR2VuZXJhdGVzIGEgYWx0ZXJuYXRpbmcgZmllbGQgbGlzdCBmcm9tIGEgZ2l2ZW4gRnJhbWVTdG9yZSBsaXN0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGF0aWMgdm9pZCBnZW5fcGljX2xpc3RfZnJvbV9mcmFtZV9saXN0KGVudW0gUGljdHVyZVN0cnVjdHVyZSBjdXJyU3RydWN0dXJlLAorCQlzdHJ1Y3QgRnJhbWVTdG9yZSAqKmZzX2xpc3QsIGludCBsaXN0X2lkeCwKKwkJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqKmxpc3QsCisJCWNoYXIgKmxpc3Rfc2l6ZSwgaW50IGxvbmdfdGVybSkKK3sKKwlpbnQgdG9wX2lkeCA9IDA7CisJaW50IGJvdF9pZHggPSAwOworCisJaW50ICgqaXNfcmVmKShzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpzKSA9IChsb25nX3Rlcm0pID8gaXNfbG9uZ19yZWYgOgorCQkJaXNfc2hvcnRfcmVmOworCisKKwlpZiAoY3VyclN0cnVjdHVyZSA9PSBUT1BfRklFTEQpIHsKKwkJd2hpbGUgKCh0b3BfaWR4IDwgbGlzdF9pZHgpIHx8IChib3RfaWR4IDwgbGlzdF9pZHgpKSB7CisJCQlmb3IgKDsgdG9wX2lkeCA8IGxpc3RfaWR4OyB0b3BfaWR4KyspIHsKKwkJCQlpZiAoZnNfbGlzdFt0b3BfaWR4XS0+aXNfdXNlZCAmIDEpIHsKKwkJCQkJaWYgKGlzX3JlZihmc19saXN0W3RvcF9pZHhdLT4KKwkJCQkJCXRvcF9maWVsZCkpIHsKKwkJCQkJCS8qIHNob3J0IHRlcm0gcmVmIHBpYyAqLworCQkJCQkJbGlzdFsoc2hvcnQpICpsaXN0X3NpemVdID0KKwkJCQkJCWZzX2xpc3RbdG9wX2lkeF0tPnRvcF9maWVsZDsKKwkJCQkJCSgqbGlzdF9zaXplKSsrOworCQkJCQkJdG9wX2lkeCsrOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlmb3IgKDsgYm90X2lkeCA8IGxpc3RfaWR4OyBib3RfaWR4KyspIHsKKwkJCQlpZiAoZnNfbGlzdFtib3RfaWR4XS0+aXNfdXNlZCAmIDIpIHsKKwkJCQkJaWYgKGlzX3JlZihmc19saXN0W2JvdF9pZHhdLT4KKwkJCQkJCWJvdHRvbV9maWVsZCkpIHsKKwkJCQkJCS8qIHNob3J0IHRlcm0gcmVmIHBpYyAqLworCQkJCQkJbGlzdFsoc2hvcnQpICpsaXN0X3NpemVdID0KKwkJCQkJCWZzX2xpc3RbYm90X2lkeF0tPmJvdHRvbV9maWVsZDsKKwkJCQkJCSgqbGlzdF9zaXplKSsrOworCQkJCQkJYm90X2lkeCsrOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYgKGN1cnJTdHJ1Y3R1cmUgPT0gQk9UVE9NX0ZJRUxEKSB7CisJCXdoaWxlICgodG9wX2lkeCA8IGxpc3RfaWR4KSB8fCAoYm90X2lkeCA8IGxpc3RfaWR4KSkgeworCQkJZm9yICg7IGJvdF9pZHggPCBsaXN0X2lkeDsgYm90X2lkeCsrKSB7CisJCQkJaWYgKGZzX2xpc3RbYm90X2lkeF0tPmlzX3VzZWQgJiAyKSB7CisJCQkJCWlmIChpc19yZWYoZnNfbGlzdFtib3RfaWR4XS0+CisJCQkJCQlib3R0b21fZmllbGQpKSB7CisJCQkJCQkvKiBzaG9ydCB0ZXJtIHJlZiBwaWMgKi8KKwkJCQkJCWxpc3RbKHNob3J0KSAqbGlzdF9zaXplXSA9CisJCQkJCQlmc19saXN0W2JvdF9pZHhdLT5ib3R0b21fZmllbGQ7CisJCQkJCQkoKmxpc3Rfc2l6ZSkrKzsKKwkJCQkJCWJvdF9pZHgrKzsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZm9yICg7IHRvcF9pZHggPCBsaXN0X2lkeDsgdG9wX2lkeCsrKSB7CisJCQkJaWYgKGZzX2xpc3RbdG9wX2lkeF0tPmlzX3VzZWQgJiAxKSB7CisJCQkJCWlmIChpc19yZWYoZnNfbGlzdFt0b3BfaWR4XS0+CisJCQkJCQl0b3BfZmllbGQpKSB7CisJCQkJCQkvKiBzaG9ydCB0ZXJtIHJlZiBwaWMgKi8KKwkJCQkJCWxpc3RbKHNob3J0KSAqbGlzdF9zaXplXSA9CisJCQkJCQlmc19saXN0W3RvcF9pZHhdLT50b3BfZmllbGQ7CisJCQkJCQkoKmxpc3Rfc2l6ZSkrKzsKKwkJCQkJCXRvcF9pZHgrKzsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBpbml0X2xpc3RzX3Bfc2xpY2Uoc3RydWN0IFNsaWNlICpjdXJyU2xpY2UpCit7CisJc3RydWN0IFZpZGVvUGFyYW1ldGVycyAqcF9WaWQgPSBjdXJyU2xpY2UtPnBfVmlkOworCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIgPSBjdXJyU2xpY2UtPnBfRHBiOworCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gY29udGFpbmVyX29mKHBfRHBiLAorCQkJCXN0cnVjdCBoMjY0X2RwYl9zdHJ1LCBtRFBCKTsKKworCXVuc2lnbmVkIGludCBpOworCisJaW50IGxpc3QwaWR4ID0gMDsKKwlpbnQgbGlzdGx0aWR4ID0gMDsKKworCXN0cnVjdCBGcmFtZVN0b3JlICoqZnNfbGlzdDA7CisJc3RydWN0IEZyYW1lU3RvcmUgKipmc19saXN0bHQ7CisKKyNpZiAoTVZDX0VYVEVOU0lPTl9FTkFCTEUpCisJY3VyclNsaWNlLT5saXN0aW50ZXJ2aWV3aWR4MCA9IDA7CisJY3VyclNsaWNlLT5saXN0aW50ZXJ2aWV3aWR4MSA9IDA7CisjZW5kaWYKKworCWlmIChjdXJyU2xpY2UtPnN0cnVjdHVyZSA9PSBGUkFNRSkgeworCQlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnJlZl9mcmFtZXNfaW5fYnVmZmVyOyBpKyspIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0gPT0gTlVMTCB8fAorCQkJCXBfRHBiLT5mc19yZWZbaV0tPmZyYW1lID09IE5VTEwpIHsKKwkJCQlwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyA9IF9fTElORV9fOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmCisJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+aXNfdXNlZCA9PSAzKSB7CisJCQkJaWYgKChwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZS0+CisJCQkJCXVzZWRfZm9yX3JlZmVyZW5jZSkgJiYKKwkJCQkgICAgKCFwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZS0+CisJCQkJCWlzX2xvbmdfdGVybSkpIHsKKwkJCQkJY3VyclNsaWNlLT5saXN0WFswXVtsaXN0MGlkeCsrXSA9CisJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmZyYW1lOworCQkJCX0KKwkJCX0KKwkJfQorCQkvKiBvcmRlciBsaXN0IDAgYnkgUGljTnVtICovCisJCXFzb3J0KCh2b2lkICopY3VyclNsaWNlLT5saXN0WFswXSwgbGlzdDBpZHgsCisJCQlzaXplb2Yoc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqKSwKKwkJCWNvbXBhcmVfcGljX2J5X3BpY19udW1fZGVzYyk7CisJCWN1cnJTbGljZS0+bGlzdFhzaXplWzBdID0gKGNoYXIpIGxpc3QwaWR4OworCQlDSEVDS19WQUxJRChjdXJyU2xpY2UtPmxpc3RYc2l6ZVswXSwgMCk7CisJCWlmIChoMjY0X2RlYnVnX2ZsYWcgJiBQUklOVF9GTEFHX0RQQl9ERVRBSUwpIHsKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkgICJsaXN0WFswXSAoUGljTnVtKTogIik7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGlzdDBpZHg7IGkrKykgeworCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsICIlZCAgIiwKKwkJCQkJY3VyclNsaWNlLT5saXN0WFswXVtpXS0+cGljX251bSk7CisJCQl9CisJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsICJcbiIpOworCQl9CisJCS8qIGxvbmcgdGVybSBoYW5kbGluZyAqLworCQlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPmx0cmVmX2ZyYW1lc19pbl9idWZmZXI7IGkrKykgeworCQkJaWYgKHBfRHBiLT5mc19sdHJlZltpXS0+aXNfdXNlZCA9PSAzKSB7CisJCQkJaWYgKHBfRHBiLT5mc19sdHJlZltpXS0+ZnJhbWUtPmlzX2xvbmdfdGVybSkgeworCQkJCQljdXJyU2xpY2UtPmxpc3RYWzBdW2xpc3QwaWR4KytdID0KKwkJCQkJCXBfRHBiLT5mc19sdHJlZltpXS0+ZnJhbWU7CisJCQkJfQorCQkJfQorCQl9CisJCXFzb3J0KCh2b2lkICopJmN1cnJTbGljZS0+bGlzdFhbMF1bCisJCQkoc2hvcnQpIGN1cnJTbGljZS0+bGlzdFhzaXplWzBdXSwKKwkJCWxpc3QwaWR4IC0gY3VyclNsaWNlLT5saXN0WHNpemVbMF0sCisJCQlzaXplb2Yoc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqKSwKKwkJCWNvbXBhcmVfcGljX2J5X2x0X3BpY19udW1fYXNjKTsKKwkJY3VyclNsaWNlLT5saXN0WHNpemVbMF0gPSAoY2hhcikgbGlzdDBpZHg7CisJCUNIRUNLX1ZBTElEKGN1cnJTbGljZS0+bGlzdFhzaXplWzBdLCAwKTsKKwl9IGVsc2UgeworI2lmIDAKKwkJZnNfbGlzdDAgPSBjYWxsb2MocF9EcGItPnNpemUsIHNpemVvZihzdHJ1Y3QgRnJhbWVTdG9yZSAqKSk7CisJCWlmIChmc19saXN0MCA9PSBOVUxMKQorCQkJbm9fbWVtX2V4aXQoImluaXRfbGlzdHM6IGZzX2xpc3QwIik7CisJCWZzX2xpc3RsdCA9IGNhbGxvYyhwX0RwYi0+c2l6ZSwgc2l6ZW9mKHN0cnVjdCBGcmFtZVN0b3JlICopKTsKKwkJaWYgKGZzX2xpc3RsdCA9PSBOVUxMKQorCQkJbm9fbWVtX2V4aXQoImluaXRfbGlzdHM6IGZzX2xpc3RsdCIpOworI2Vsc2UKKwkJZnNfbGlzdDAgPSAmKHBfRHBiLT5mc19saXN0MFswXSk7CisJCWZzX2xpc3RsdCA9ICYocF9EcGItPmZzX2xpc3RsdFswXSk7CisjZW5kaWYKKwkJZm9yIChpID0gMDsgaSA8IHBfRHBiLT5yZWZfZnJhbWVzX2luX2J1ZmZlcjsgaSsrKSB7CisjaWZkZWYgRVJST1JfQ0hFQ0sKKwkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldID09IE5VTEwpIHsKKwkJCQlwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyA9IF9fTElORV9fOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmCisJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+aXNfcmVmZXJlbmNlKQorCQkJCWZzX2xpc3QwW2xpc3QwaWR4KytdID0gcF9EcGItPmZzX3JlZltpXTsKKwkJfQorCisJCXFzb3J0KCh2b2lkICopZnNfbGlzdDAsIGxpc3QwaWR4LCBzaXplb2Yoc3RydWN0IEZyYW1lU3RvcmUgKiksCisJCSAgICAgIGNvbXBhcmVfZnNfYnlfZnJhbWVfbnVtX2Rlc2MpOworCisJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkgICJmc19saXN0MCAoRnJhbWVOdW0pOiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IGxpc3QwaWR4OyBpKyspIHsKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCSAgUFJJTlRfRkxBR19EUEJfREVUQUlMLCAiJWQgICIsCisJCQkJICBmc19saXN0MFtpXS0+ZnJhbWVfbnVtX3dyYXApOworCQl9CisJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkgICJcbiIpOworCisJCWN1cnJTbGljZS0+bGlzdFhzaXplWzBdID0gMDsKKwkJZ2VuX3BpY19saXN0X2Zyb21fZnJhbWVfbGlzdChjdXJyU2xpY2UtPnN0cnVjdHVyZSwgZnNfbGlzdDAsCisJCQkJCQlsaXN0MGlkeCwgY3VyclNsaWNlLT5saXN0WFswXSwKKwkJCQkJCSZjdXJyU2xpY2UtPmxpc3RYc2l6ZVswXSwgMCk7CisKKwkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSAgImxpc3RYWzBdIChQaWNOdW0pOiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IGN1cnJTbGljZS0+bGlzdFhzaXplWzBdOyBpKyspIHsKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwgIiVkICAiLAorCQkJCWN1cnJTbGljZS0+bGlzdFhbMF1baV0tPnBpY19udW0pOworCQl9CisJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkgICJcbiIpOworCisJCS8qIGxvbmcgdGVybSBoYW5kbGluZyAqLworCQlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPmx0cmVmX2ZyYW1lc19pbl9idWZmZXI7IGkrKykKKwkJCWZzX2xpc3RsdFtsaXN0bHRpZHgrK10gPSBwX0RwYi0+ZnNfbHRyZWZbaV07CisKKwkJcXNvcnQoKHZvaWQgKilmc19saXN0bHQsIGxpc3RsdGlkeCwgc2l6ZW9mKHN0cnVjdCBGcmFtZVN0b3JlICopLAorCQkgICAgICBjb21wYXJlX2ZzX2J5X2x0X3BpY19pZHhfYXNjKTsKKworCQlnZW5fcGljX2xpc3RfZnJvbV9mcmFtZV9saXN0KGN1cnJTbGljZS0+c3RydWN0dXJlLCBmc19saXN0bHQsCisJCQkJCWxpc3RsdGlkeCwgY3VyclNsaWNlLT5saXN0WFswXSwKKwkJCQkJJmN1cnJTbGljZS0+bGlzdFhzaXplWzBdLCAxKTsKKworCQkvKiBmcmVlKGZzX2xpc3QwKTsgKi8KKwkJLyogZnJlZShmc19saXN0bHQpOyAqLworCX0KKwljdXJyU2xpY2UtPmxpc3RYc2l6ZVsxXSA9IDA7CisKKworCS8qIHNldCBtYXggc2l6ZSAqLworCWN1cnJTbGljZS0+bGlzdFhzaXplWzBdID0gKGNoYXIpIGltaW4oY3VyclNsaWNlLT5saXN0WHNpemVbMF0sCisJCQljdXJyU2xpY2UtPm51bV9yZWZfaWR4X2FjdGl2ZVtMSVNUXzBdKTsKKwljdXJyU2xpY2UtPmxpc3RYc2l6ZVsxXSA9IChjaGFyKSBpbWluKGN1cnJTbGljZS0+bGlzdFhzaXplWzFdLAorCQkJY3VyclNsaWNlLT5udW1fcmVmX2lkeF9hY3RpdmVbTElTVF8xXSk7CisJQ0hFQ0tfVkFMSUQoY3VyclNsaWNlLT5saXN0WHNpemVbMF0sIDApOworCUNIRUNLX1ZBTElEKGN1cnJTbGljZS0+bGlzdFhzaXplWzFdLCAxKTsKKworCS8qIHNldCB0aGUgdW51c2VkIGxpc3QgZW50cmllcyB0byBOVUxMICovCisJZm9yIChpID0gY3VyclNsaWNlLT5saXN0WHNpemVbMF07IGkgPCAoTUFYX0xJU1RfU0laRSk7IGkrKykKKwkJY3VyclNsaWNlLT5saXN0WFswXVtpXSA9IHBfVmlkLT5ub19yZWZlcmVuY2VfcGljdHVyZTsKKwlmb3IgKGkgPSBjdXJyU2xpY2UtPmxpc3RYc2l6ZVsxXTsgaSA8IChNQVhfTElTVF9TSVpFKTsgaSsrKQorCQljdXJyU2xpY2UtPmxpc3RYWzFdW2ldID0gcF9WaWQtPm5vX3JlZmVyZW5jZV9waWN0dXJlOworCisjaWYgUFJJTlRSRUZMSVNUCisjaWYgKE1WQ19FWFRFTlNJT05fRU5BQkxFKQorCS8qIHByaW50IG91dCBmb3IgaDI2NF9kZWJ1Z19mbGFnIHB1cnBvc2UgKi8KKwlpZiAoKHBfVmlkLT5wcm9maWxlX2lkYyA9PSBNVkNfSElHSCB8fAorCQlwX1ZpZC0+cHJvZmlsZV9pZGMgPT0gU1RFUkVPX0hJR0gpICYmCisJICAgIGN1cnJTbGljZS0+Y3VycmVudF9zbGljZV9uciA9PSAwKSB7CisJCWlmIChjdXJyU2xpY2UtPmxpc3RYc2l6ZVswXSA+IDApIHsKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwgIlxuIik7CisJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJICAiICoqIChDdXJWaWV3SUQ6JWQgJWQpICVzIFJlZiBQaWMgTGlzdCAwICoqKipcbiIsCisJCQkJY3VyclNsaWNlLT52aWV3X2lkLAorCQkJCWN1cnJTbGljZS0+VGhpc1BPQywKKwkJCQljdXJyU2xpY2UtPnN0cnVjdHVyZSA9PSBGUkFNRSA/ICJGUk0iIDoKKwkJCQkgIChjdXJyU2xpY2UtPnN0cnVjdHVyZSA9PSBUT1BfRklFTEQgPworCQkJCQkiVE9QIiA6ICJCT1QiKSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgKHVuc2lnbmVkIGludCkoY3VyclNsaWNlLT4KKwkJCQlsaXN0WHNpemVbMF0pOyBpKyspIHsgLyogcmVmIGxpc3QgMCAqLworCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkiICAgJTJkIC0+IFBPQzogJTRkIFBpY051bTogJTRkIFZpZXdJRDogJWRcbiIsCisJCQkJaSwKKwkJCQljdXJyU2xpY2UtPmxpc3RYWzBdW2ldLT5wb2MsCisJCQkJY3VyclNsaWNlLT5saXN0WFswXVtpXS0+cGljX251bSwKKwkJCQljdXJyU2xpY2UtPmxpc3RYWzBdW2ldLT52aWV3X2lkKTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorI2VuZGlmCit9CisKKworLyohCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBcYnJpZWYKKyAqICAgIEluaXRpYWxpemUgcmVmZXJlbmNlIGxpc3RzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGF0aWMgdm9pZCBpbml0X21iYWZmX2xpc3RzKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLAorCQkJICAgICBzdHJ1Y3QgU2xpY2UgKmN1cnJTbGljZSkKK3sKKwl1bnNpZ25lZCBpbnQgajsKKwlpbnQgaTsKKwlzdHJ1Y3QgVmlkZW9QYXJhbWV0ZXJzICpwX1ZpZCA9ICZwX0gyNjRfRHBiLT5tVmlkZW87CisJZm9yIChpID0gMjsgaSA8IDY7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgTUFYX0xJU1RfU0laRTsgaisrKQorCQkJY3VyclNsaWNlLT5saXN0WFtpXVtqXSA9IHBfVmlkLT5ub19yZWZlcmVuY2VfcGljdHVyZTsKKwkJY3VyclNsaWNlLT5saXN0WHNpemVbaV0gPSAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBjdXJyU2xpY2UtPmxpc3RYc2l6ZVswXTsgaSsrKSB7CisjaWZkZWYgRVJST1JfQ0hFQ0sKKwkJaWYgKGN1cnJTbGljZS0+bGlzdFhbMF1baV0gPT0gTlVMTCkgeworCQkJcF9IMjY0X0RwYi0+ZHBiX2Vycm9yX2ZsYWcgPSBfX0xJTkVfXzsKKwkJCXByX2luZm8oCisJCQkiZXJyb3IgY3VyclNsaWNlLT5saXN0WFswXVslZF0gaXMgTlVMTFxyXG4iLCBpKTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKwkJY3VyclNsaWNlLT5saXN0WFsyXVsyICogaV0gPQorCQkJY3VyclNsaWNlLT5saXN0WFswXVtpXS0+dG9wX2ZpZWxkOworCQljdXJyU2xpY2UtPmxpc3RYWzJdWzIgKiBpICsgMV0gPQorCQkJY3VyclNsaWNlLT5saXN0WFswXVtpXS0+Ym90dG9tX2ZpZWxkOworCQljdXJyU2xpY2UtPmxpc3RYWzRdWzIgKiBpXSA9CisJCQljdXJyU2xpY2UtPmxpc3RYWzBdW2ldLT5ib3R0b21fZmllbGQ7CisJCWN1cnJTbGljZS0+bGlzdFhbNF1bMiAqIGkgKyAxXSA9CisJCQljdXJyU2xpY2UtPmxpc3RYWzBdW2ldLT50b3BfZmllbGQ7CisJfQorCWN1cnJTbGljZS0+bGlzdFhzaXplWzJdID0gY3VyclNsaWNlLT5saXN0WHNpemVbNF0gPQorCQljdXJyU2xpY2UtPmxpc3RYc2l6ZVswXSAqIDI7CisKKwlmb3IgKGkgPSAwOyBpIDwgY3VyclNsaWNlLT5saXN0WHNpemVbMV07IGkrKykgeworI2lmZGVmIEVSUk9SX0NIRUNLCisJCWlmIChjdXJyU2xpY2UtPmxpc3RYWzFdW2ldID09IE5VTEwpIHsKKwkJCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnID0gX19MSU5FX187CisJCQlwcl9pbmZvKAorCQkJImVycm9yIGN1cnJTbGljZS0+bGlzdFhbMV1bJWRdIGlzIE5VTExcclxuIiwgaSk7CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisJCWN1cnJTbGljZS0+bGlzdFhbM11bMiAqIGldID0KKwkJCWN1cnJTbGljZS0+bGlzdFhbMV1baV0tPnRvcF9maWVsZDsKKwkJY3VyclNsaWNlLT5saXN0WFszXVsyICogaSArIDFdID0KKwkJCWN1cnJTbGljZS0+bGlzdFhbMV1baV0tPmJvdHRvbV9maWVsZDsKKwkJY3VyclNsaWNlLT5saXN0WFs1XVsyICogaV0gPQorCQkJY3VyclNsaWNlLT5saXN0WFsxXVtpXS0+Ym90dG9tX2ZpZWxkOworCQljdXJyU2xpY2UtPmxpc3RYWzVdWzIgKiBpICsgMV0gPQorCQkJY3VyclNsaWNlLT5saXN0WFsxXVtpXS0+dG9wX2ZpZWxkOworCX0KKwljdXJyU2xpY2UtPmxpc3RYc2l6ZVszXSA9IGN1cnJTbGljZS0+bGlzdFhzaXplWzVdID0KKwkJY3VyclNsaWNlLT5saXN0WHNpemVbMV0gKiAyOworfQorCisKKworc3RhdGljIHZvaWQgaW5pdF9saXN0c19pX3NsaWNlKHN0cnVjdCBTbGljZSAqY3VyclNsaWNlKQoreworCisjaWYgKE1WQ19FWFRFTlNJT05fRU5BQkxFKQorCWN1cnJTbGljZS0+bGlzdGludGVydmlld2lkeDAgPSAwOworCWN1cnJTbGljZS0+bGlzdGludGVydmlld2lkeDEgPSAwOworI2VuZGlmCisKKwljdXJyU2xpY2UtPmxpc3RYc2l6ZVswXSA9IDA7CisJY3VyclNsaWNlLT5saXN0WHNpemVbMV0gPSAwOworfQorCitzdGF0aWMgdm9pZCBpbml0X2xpc3RzX2Jfc2xpY2Uoc3RydWN0IFNsaWNlICpjdXJyU2xpY2UpCit7CisJc3RydWN0IFZpZGVvUGFyYW1ldGVycyAqcF9WaWQgPSBjdXJyU2xpY2UtPnBfVmlkOworCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIgPSBjdXJyU2xpY2UtPnBfRHBiOworCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gY29udGFpbmVyX29mKHBfRHBiLAorCQlzdHJ1Y3QgaDI2NF9kcGJfc3RydSwgbURQQik7CisKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgajsKKworCWludCBsaXN0MGlkeCA9IDA7CisJaW50IGxpc3QwaWR4XzEgPSAwOworCWludCBsaXN0bHRpZHggPSAwOworCisJc3RydWN0IEZyYW1lU3RvcmUgKipmc19saXN0MDsKKwlzdHJ1Y3QgRnJhbWVTdG9yZSAqKmZzX2xpc3QxOworCXN0cnVjdCBGcmFtZVN0b3JlICoqZnNfbGlzdGx0OworCisjaWYgKE1WQ19FWFRFTlNJT05fRU5BQkxFKQorCWN1cnJTbGljZS0+bGlzdGludGVydmlld2lkeDAgPSAwOworCWN1cnJTbGljZS0+bGlzdGludGVydmlld2lkeDEgPSAwOworI2VuZGlmCisKKwl7CisJCS8qIEItU2xpY2UgKi8KKwkJaWYgKGN1cnJTbGljZS0+c3RydWN0dXJlID09IEZSQU1FKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnJlZl9mcmFtZXNfaW5fYnVmZmVyOyBpKyspIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldID09IE5VTEwgfHwKKwkJCQkJcF9EcGItPmZzX3JlZltpXS0+ZnJhbWUgPT0gTlVMTCkgeworCQkJCQlwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyA9IF9fTElORV9fOworCQkJCQljb250aW51ZTsKKwkJCQl9CisjZW5kaWYKKwkJCQlpZiAoKHBfRHBiLT5mc19yZWZbaV0tPmlzX3VzZWQgPT0gMykgJiYKKwkJCQkJKChwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZS0+CisJCQkJCXVzZWRfZm9yX3JlZmVyZW5jZSkgJiYKKwkJCQkJKCFwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZS0+CisJCQkJCWlzX2xvbmdfdGVybSkpICYmCisJCQkJCShjdXJyU2xpY2UtPmZyYW1lcG9jID49CisJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmZyYW1lLT5wb2MpKSB7CisJCQkJCS8qICFLUyB1c2UgPj0gZm9yIGVycm9yCisJCQkJCSAqCWNvbmNlYWxtZW50CisJCQkJCSAqLworCQkJCQljdXJyU2xpY2UtPmxpc3RYWzBdW2xpc3QwaWR4KytdID0KKwkJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmZyYW1lOworCQkJCX0KKwkJCX0KKwkJCXFzb3J0KCh2b2lkICopY3VyclNsaWNlLT5saXN0WFswXSwgbGlzdDBpZHgsCisJCQkJc2l6ZW9mKHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKiksCisJCQkJY29tcGFyZV9waWNfYnlfcG9jX2Rlc2MpOworCisJCQkvKiBnZXQgdGhlIGJhY2t3YXJkIHJlZmVyZW5jZSBwaWN0dXJlCisJCQkgKiAgIChQT0M+Y3VycmVudCBQT0MpIGluIGxpc3QwOworCQkJICovCisJCQlsaXN0MGlkeF8xID0gbGlzdDBpZHg7CisJCQlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnJlZl9mcmFtZXNfaW5fYnVmZmVyOyBpKyspIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldID09IE5VTEwgfHwKKwkJCQkJcF9EcGItPmZzX3JlZltpXS0+ZnJhbWUgPT0gTlVMTCkgeworCQkJCQlwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyA9IF9fTElORV9fOworCQkJCQljb250aW51ZTsKKwkJCQl9CisjZW5kaWYKKwkJCQlpZiAoKHBfRHBiLT5mc19yZWZbaV0tPmlzX3VzZWQgPT0gMykgJiYKKwkJCQkJKChwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZS0+CisJCQkJCXVzZWRfZm9yX3JlZmVyZW5jZSkgJiYKKwkJCQkJKCFwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZS0+CisJCQkJCWlzX2xvbmdfdGVybSkpICYmCisJCQkJCShjdXJyU2xpY2UtPmZyYW1lcG9jIDwKKwkJCQkJcF9EcGItPmZzX3JlZltpXS0+ZnJhbWUtPnBvYykpIHsKKwkJCQkJY3VyclNsaWNlLT4KKwkJCQkJbGlzdFhbMF1bbGlzdDBpZHgrK10gPQorCQkJCQkJcF9EcGItPmZzX3JlZltpXS0+ZnJhbWU7CisJCQkJfQorCQkJfQorCQkJcXNvcnQoKHZvaWQgKikmY3VyclNsaWNlLT5saXN0WFswXVtsaXN0MGlkeF8xXSwKKwkJCQlsaXN0MGlkeCAtIGxpc3QwaWR4XzEsCisJCQkJc2l6ZW9mKHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKiksCisJCQkJY29tcGFyZV9waWNfYnlfcG9jX2FzYyk7CisKKwkJCWZvciAoaiA9IDA7IGogPCBsaXN0MGlkeF8xOyBqKyspIHsKKwkJCQljdXJyU2xpY2UtPgorCQkJCWxpc3RYWzFdW2xpc3QwaWR4IC0gbGlzdDBpZHhfMSArIGpdID0KKwkJCQkJY3VyclNsaWNlLT5saXN0WFswXVtqXTsKKwkJCX0KKwkJCWZvciAoaiA9IGxpc3QwaWR4XzE7IGogPCBsaXN0MGlkeDsgaisrKSB7CisJCQkJY3VyclNsaWNlLT5saXN0WFsxXVtqIC0gbGlzdDBpZHhfMV0gPQorCQkJCQljdXJyU2xpY2UtPmxpc3RYWzBdW2pdOworCQkJfQorCisJCQljdXJyU2xpY2UtPmxpc3RYc2l6ZVswXSA9IGN1cnJTbGljZS0+bGlzdFhzaXplWzFdID0KKwkJCQkoY2hhcikgbGlzdDBpZHg7CisJCQlDSEVDS19WQUxJRChjdXJyU2xpY2UtPmxpc3RYc2l6ZVswXSwgMCk7CisJCQlDSEVDS19WQUxJRChjdXJyU2xpY2UtPmxpc3RYc2l6ZVsxXSwgMSk7CisKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkibGlzdFhbMF0gKFBpY051bSk6ICIpOworCQkJZm9yIChpID0gMDsgaSA8IGN1cnJTbGljZS0+bGlzdFhzaXplWzBdOyBpKyspIHsKKwkJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsICIlZCAgIiwKKwkJCQljdXJyU2xpY2UtPmxpc3RYWzBdW2ldLT5waWNfbnVtKTsKKwkJCX0KKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwgIlxuIik7CisJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJImxpc3RYWzFdIChQaWNOdW0pOiAiKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBjdXJyU2xpY2UtPmxpc3RYc2l6ZVsxXTsgaSsrKSB7CisJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwgIiVkICAiLAorCQkJCQljdXJyU2xpY2UtPmxpc3RYWzFdW2ldLT5waWNfbnVtKTsKKwkJCX0KKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwgIlxuIik7CisJCQkvKiBkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCSAqCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSAqCSJjdXJyU2xpY2UtPmxpc3RYWzBdIGN1cnJQb2M9JWQgKFBvYyk6ICIsCisJCQkgKglwX1ZpZC0+ZnJhbWVwb2MpOworCQkJICogICBmb3IgKGk9MDsgaTxjdXJyU2xpY2UtPmxpc3RYc2l6ZVswXTsgaSsrKSB7CisJCQkgKglkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCSAqCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkgKgkJIiVkICAiLCBjdXJyU2xpY2UtPmxpc3RYWzBdW2ldLT5wb2MpOworCQkJICogICB9CisJCQkgKiAgIGRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJICoJUFJJTlRfRkxBR19EUEJfREVUQUlMLCAiXG4iKTsKKwkJCSAqICAgZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkgKglQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkgKgkiY3VyclNsaWNlLT5saXN0WFsxXSBjdXJyUG9jPSVkIChQb2MpOiAiLAorCQkJICoJcF9WaWQtPmZyYW1lcG9jKTsKKwkJCSAqICAgZm9yIChpPTA7IGk8Y3VyclNsaWNlLT5saXN0WHNpemVbMV07IGkrKykgeworCQkJICoJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkgKglQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkgKgkiJWQgICIsCisJCQkgKgljdXJyU2xpY2UtPmxpc3RYWzFdW2ldLT5wb2MpOworCQkJICogICB9CisJCQkgKiAgIGRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJICoJUFJJTlRfRkxBR19EUEJfREVUQUlMLCAiXG4iKTsKKwkJCSAqLworCisJCQkvKiBsb25nIHRlcm0gaGFuZGxpbmcgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+bHRyZWZfZnJhbWVzX2luX2J1ZmZlcjsgaSsrKSB7CisJCQkJaWYgKHBfRHBiLT5mc19sdHJlZltpXS0+aXNfdXNlZCA9PSAzKSB7CisJCQkJCWlmIChwX0RwYi0+ZnNfbHRyZWZbaV0tPmZyYW1lLT4KKwkJCQkJCWlzX2xvbmdfdGVybSkgeworCQkJCQkJY3VyclNsaWNlLT4KKwkJCQkJCWxpc3RYWzBdW2xpc3QwaWR4XSA9CisJCQkJCQlwX0RwYi0+ZnNfbHRyZWZbaV0tPmZyYW1lOworCQkJCQkJY3VyclNsaWNlLT4KKwkJCQkJCWxpc3RYWzFdW2xpc3QwaWR4KytdID0KKwkJCQkJCXBfRHBiLT5mc19sdHJlZltpXS0+ZnJhbWU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlxc29ydCgodm9pZCAqKSZjdXJyU2xpY2UtPgorCQkJCWxpc3RYWzBdWyhzaG9ydCkgY3VyclNsaWNlLT5saXN0WHNpemVbMF1dLAorCQkJCWxpc3QwaWR4IC0gY3VyclNsaWNlLT5saXN0WHNpemVbMF0sCisJCQkJc2l6ZW9mKHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKiksCisJCQkJY29tcGFyZV9waWNfYnlfbHRfcGljX251bV9hc2MpOworCQkJcXNvcnQoKHZvaWQgKikmY3VyclNsaWNlLT4KKwkJCQlsaXN0WFsxXVsoc2hvcnQpIGN1cnJTbGljZS0+bGlzdFhzaXplWzBdXSwKKwkJCQlsaXN0MGlkeCAtIGN1cnJTbGljZS0+bGlzdFhzaXplWzBdLAorCQkJCXNpemVvZihzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICopLAorCQkJCWNvbXBhcmVfcGljX2J5X2x0X3BpY19udW1fYXNjKTsKKwkJCWN1cnJTbGljZS0+bGlzdFhzaXplWzBdID0gY3VyclNsaWNlLT5saXN0WHNpemVbMV0gPQorCQkJCShjaGFyKSBsaXN0MGlkeDsKKwkJCUNIRUNLX1ZBTElEKGN1cnJTbGljZS0+bGlzdFhzaXplWzBdLCAwKTsKKwkJCUNIRUNLX1ZBTElEKGN1cnJTbGljZS0+bGlzdFhzaXplWzFdLCAxKTsKKwkJfSBlbHNlIHsKKyNpZiAwCisJCQlmc19saXN0MCA9IGNhbGxvYyhwX0RwYi0+c2l6ZSwKKwkJCQlzaXplb2Yoc3RydWN0IEZyYW1lU3RvcmUgKikpOworCQkJaWYgKGZzX2xpc3QwID09IE5VTEwpCisJCQkJbm9fbWVtX2V4aXQoImluaXRfbGlzdHM6IGZzX2xpc3QwIik7CisJCQlmc19saXN0MSA9IGNhbGxvYyhwX0RwYi0+c2l6ZSwKKwkJCQlzaXplb2Yoc3RydWN0IEZyYW1lU3RvcmUgKikpOworCQkJaWYgKGZzX2xpc3QxID09IE5VTEwpCisJCQkJbm9fbWVtX2V4aXQoImluaXRfbGlzdHM6IGZzX2xpc3QxIik7CisJCQlmc19saXN0bHQgPSBjYWxsb2MocF9EcGItPnNpemUsCisJCQkJc2l6ZW9mKHN0cnVjdCBGcmFtZVN0b3JlICopKTsKKwkJCWlmIChmc19saXN0bHQgPT0gTlVMTCkKKwkJCQlub19tZW1fZXhpdCgiaW5pdF9saXN0czogZnNfbGlzdGx0Iik7CisjZWxzZQorCQkJZnNfbGlzdDAgPSAmKHBfRHBiLT5mc19saXN0MFswXSk7CisJCQlmc19saXN0MSA9ICYocF9EcGItPmZzX2xpc3QxWzBdKTsKKwkJCWZzX2xpc3RsdCA9ICYocF9EcGItPmZzX2xpc3RsdFswXSk7CisKKyNlbmRpZgorCQkJY3VyclNsaWNlLT5saXN0WHNpemVbMF0gPSAwOworCQkJY3VyclNsaWNlLT5saXN0WHNpemVbMV0gPSAxOworCisJCQlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnJlZl9mcmFtZXNfaW5fYnVmZmVyOyBpKyspIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldID09IE5VTEwpIHsKKwkJCQkJcF9IMjY0X0RwYi0+ZHBiX2Vycm9yX2ZsYWcgPSBfX0xJTkVfXzsKKwkJCQkJY29udGludWU7CisJCQkJfQorI2VuZGlmCisJCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0tPmlzX3VzZWQpIHsKKwkJCQkJaWYgKGN1cnJTbGljZS0+VGhpc1BPQyA+PQorCQkJCQkJcF9EcGItPmZzX3JlZltpXS0+cG9jKSB7CisJCQkJCQlmc19saXN0MFtsaXN0MGlkeCsrXSA9CisJCQkJCQkJcF9EcGItPmZzX3JlZltpXTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXFzb3J0KCh2b2lkICopZnNfbGlzdDAsIGxpc3QwaWR4LAorCQkJCXNpemVvZihzdHJ1Y3QgRnJhbWVTdG9yZSAqKSwKKwkJCQljb21wYXJlX2ZzX2J5X3BvY19kZXNjKTsKKwkJCWxpc3QwaWR4XzEgPSBsaXN0MGlkeDsKKwkJCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+cmVmX2ZyYW1lc19pbl9idWZmZXI7IGkrKykgeworI2lmZGVmIEVSUk9SX0NIRUNLCisJCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0gPT0gTlVMTCkgeworCQkJCQlwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyA9IF9fTElORV9fOworCQkJCQljb250aW51ZTsKKwkJCQl9CisjZW5kaWYKKwkJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+aXNfdXNlZCkgeworCQkJCQlpZiAoY3VyclNsaWNlLT5UaGlzUE9DIDwKKwkJCQkJCXBfRHBiLT5mc19yZWZbaV0tPnBvYykgeworCQkJCQkJZnNfbGlzdDBbbGlzdDBpZHgrK10gPQorCQkJCQkJCXBfRHBiLT5mc19yZWZbaV07CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlxc29ydCgodm9pZCAqKSZmc19saXN0MFtsaXN0MGlkeF8xXSwKKwkJCQlsaXN0MGlkeCAtIGxpc3QwaWR4XzEsCisJCQkJc2l6ZW9mKHN0cnVjdCBGcmFtZVN0b3JlICopLAorCQkJCWNvbXBhcmVfZnNfYnlfcG9jX2FzYyk7CisKKwkJCWZvciAoaiA9IDA7IGogPCBsaXN0MGlkeF8xOyBqKyspIHsKKwkJCQlmc19saXN0MVtsaXN0MGlkeCAtIGxpc3QwaWR4XzEgKyBqXSA9CisJCQkJZnNfbGlzdDBbal07CisJCQl9CisJCQlmb3IgKGogPSBsaXN0MGlkeF8xOyBqIDwgbGlzdDBpZHg7IGorKykKKwkJCQlmc19saXN0MVtqIC0gbGlzdDBpZHhfMV0gPSBmc19saXN0MFtqXTsKKworCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJCSJmc19saXN0MCBjdXJyUG9jPSVkIChQb2MpOiAiLAorCQkJCWN1cnJTbGljZS0+VGhpc1BPQyk7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGlzdDBpZHg7IGkrKykgeworCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwgIiVkICAiLAorCQkJCWZzX2xpc3QwW2ldLT5wb2MpOworCQkJfQorCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLCAiXG4iKTsKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkiZnNfbGlzdDEgY3VyclBvYz0lZCAoUG9jKTogIiwKKwkJCQljdXJyU2xpY2UtPlRoaXNQT0MpOworCQkJZm9yIChpID0gMDsgaSA8IGxpc3QwaWR4OyBpKyspIHsKKwkJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLCAiJWQgICIsCisJCQkJCWZzX2xpc3QxW2ldLT5wb2MpOworCQkJfQorCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwgIlxuIik7CisKKwkJCWN1cnJTbGljZS0+bGlzdFhzaXplWzBdID0gMDsKKwkJCWN1cnJTbGljZS0+bGlzdFhzaXplWzFdID0gMDsKKwkJCWdlbl9waWNfbGlzdF9mcm9tX2ZyYW1lX2xpc3QoY3VyclNsaWNlLT5zdHJ1Y3R1cmUsCisJCQkJCQlmc19saXN0MCwgbGlzdDBpZHgsCisJCQkJCQljdXJyU2xpY2UtPmxpc3RYWzBdLAorCQkJCQkJJmN1cnJTbGljZS0+bGlzdFhzaXplWzBdLCAwKTsKKwkJCWdlbl9waWNfbGlzdF9mcm9tX2ZyYW1lX2xpc3QoY3VyclNsaWNlLT5zdHJ1Y3R1cmUsCisJCQkJCQlmc19saXN0MSwgbGlzdDBpZHgsCisJCQkJCQljdXJyU2xpY2UtPmxpc3RYWzFdLAorCQkJCQkJJmN1cnJTbGljZS0+bGlzdFhzaXplWzFdLCAwKTsKKworCQkJLyogZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkgKglQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkgKgkiY3VyclNsaWNlLT5saXN0WFswXSBjdXJyUG9jPSVkIChQb2MpOiAiLAorCQkJICoJcF9WaWQtPmZyYW1lcG9jKTsKKwkJCSAqICBmb3IgKGk9MDsgaTxjdXJyU2xpY2UtPmxpc3RYc2l6ZVswXTsgaSsrKSB7CisJCQkgKglkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCSAqCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwgIiVkICAiLAorCQkJICoJY3VyclNsaWNlLT5saXN0WFswXVtpXS0+cG9jKTsKKwkJCSAqICB9CisJCQkgKiAgZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkgKglQUklOVF9GTEFHX0RQQl9ERVRBSUwsICJcbiIpOworCQkJICovCisJCQkvKiBkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCSAqCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSAqCSJjdXJyU2xpY2UtPmxpc3RYWzFdIGN1cnJQb2M9JWQgKFBvYyk6ICIsCisJCQkgKglwX1ZpZC0+ZnJhbWVwb2MpOworCQkJICogIGZvciAoaT0wOyBpPGN1cnJTbGljZS0+bGlzdFhzaXplWzFdOyBpKyspIHsKKwkJCSAqCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJICoJUFJJTlRfRkxBR19EUEJfREVUQUlMLCAiJWQgICIsCisJCQkgKgljdXJyU2xpY2UtPmxpc3RYWzFdW2ldLT5wb2MpOworCQkJICogIH0KKwkJCSAqICBkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCSAqCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSAqCSJcbiIpOworCQkJICovCisKKwkJCS8qIGxvbmcgdGVybSBoYW5kbGluZyAqLworCQkJZm9yIChpID0gMDsgaSA8IHBfRHBiLT5sdHJlZl9mcmFtZXNfaW5fYnVmZmVyOyBpKyspCisJCQkJZnNfbGlzdGx0W2xpc3RsdGlkeCsrXSA9IHBfRHBiLT5mc19sdHJlZltpXTsKKworCQkJcXNvcnQoKHZvaWQgKilmc19saXN0bHQsIGxpc3RsdGlkeCwKKwkJCQlzaXplb2Yoc3RydWN0IEZyYW1lU3RvcmUgKiksCisJCQkJY29tcGFyZV9mc19ieV9sdF9waWNfaWR4X2FzYyk7CisKKwkJCWdlbl9waWNfbGlzdF9mcm9tX2ZyYW1lX2xpc3QoY3VyclNsaWNlLT5zdHJ1Y3R1cmUsCisJCQkJZnNfbGlzdGx0LCBsaXN0bHRpZHgsCisJCQkJY3VyclNsaWNlLT5saXN0WFswXSwKKwkJCQkmY3VyclNsaWNlLT5saXN0WHNpemVbMF0sIDEpOworCQkJZ2VuX3BpY19saXN0X2Zyb21fZnJhbWVfbGlzdChjdXJyU2xpY2UtPnN0cnVjdHVyZSwKKwkJCQlmc19saXN0bHQsIGxpc3RsdGlkeCwKKwkJCQljdXJyU2xpY2UtPmxpc3RYWzFdLAorCQkJCSZjdXJyU2xpY2UtPmxpc3RYc2l6ZVsxXSwgMSk7CisKKwkJCS8qIGZyZWUoZnNfbGlzdDApOyAqLworCQkJLyogZnJlZShmc19saXN0MSk7ICovCisJCQkvKiBmcmVlKGZzX2xpc3RsdCk7ICovCisJCX0KKwl9CisKKwlpZiAoKGN1cnJTbGljZS0+bGlzdFhzaXplWzBdID09IGN1cnJTbGljZS0+bGlzdFhzaXplWzFdKSAmJgorCSAgICAoY3VyclNsaWNlLT5saXN0WHNpemVbMF0gPiAxKSkgeworCQkvKiBjaGVjayBpZiBsaXN0cyBhcmUgaWRlbnRpY2FsLAorCQkgKmlmIHllcyBzd2FwIGZpcnN0IHR3byBlbGVtZW50cyBvZiBjdXJyU2xpY2UtPmxpc3RYWzFdCisJCSAqLworCQlpbnQgZGlmZiA9IDA7CisKKwkJZm9yIChqID0gMDsgaiA8IGN1cnJTbGljZS0+bGlzdFhzaXplWzBdOyBqKyspIHsKKwkJCWlmIChjdXJyU2xpY2UtPmxpc3RYWzBdW2pdICE9CisJCQkJY3VyclNsaWNlLT5saXN0WFsxXVtqXSkgeworCQkJCWRpZmYgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghZGlmZikgeworCQkJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqdG1wX3MgPQorCQkJCWN1cnJTbGljZS0+bGlzdFhbMV1bMF07CisJCQljdXJyU2xpY2UtPmxpc3RYWzFdWzBdID0gY3VyclNsaWNlLT5saXN0WFsxXVsxXTsKKwkJCWN1cnJTbGljZS0+bGlzdFhbMV1bMV0gPSB0bXBfczsKKwkJfQorCX0KKworCS8qIHNldCBtYXggc2l6ZSAqLworCWN1cnJTbGljZS0+bGlzdFhzaXplWzBdID0gKGNoYXIpIGltaW4oY3VyclNsaWNlLT5saXN0WHNpemVbMF0sCisJCWN1cnJTbGljZS0+bnVtX3JlZl9pZHhfYWN0aXZlW0xJU1RfMF0pOworCWN1cnJTbGljZS0+bGlzdFhzaXplWzFdID0gKGNoYXIpIGltaW4oY3VyclNsaWNlLT5saXN0WHNpemVbMV0sCisJCWN1cnJTbGljZS0+bnVtX3JlZl9pZHhfYWN0aXZlW0xJU1RfMV0pOworCUNIRUNLX1ZBTElEKGN1cnJTbGljZS0+bGlzdFhzaXplWzBdLCAwKTsKKwlDSEVDS19WQUxJRChjdXJyU2xpY2UtPmxpc3RYc2l6ZVsxXSwgMSk7CisKKwkvKiBzZXQgdGhlIHVudXNlZCBsaXN0IGVudHJpZXMgdG8gTlVMTCAqLworCWZvciAoaSA9IGN1cnJTbGljZS0+bGlzdFhzaXplWzBdOyBpIDwgKE1BWF9MSVNUX1NJWkUpOyBpKyspCisJCWN1cnJTbGljZS0+bGlzdFhbMF1baV0gPSBwX1ZpZC0+bm9fcmVmZXJlbmNlX3BpY3R1cmU7CisJZm9yIChpID0gY3VyclNsaWNlLT5saXN0WHNpemVbMV07IGkgPCAoTUFYX0xJU1RfU0laRSk7IGkrKykKKwkJY3VyclNsaWNlLT5saXN0WFsxXVtpXSA9IHBfVmlkLT5ub19yZWZlcmVuY2VfcGljdHVyZTsKKworI2lmIFBSSU5UUkVGTElTVAorI2lmIChNVkNfRVhURU5TSU9OX0VOQUJMRSkKKwkvKiBwcmludCBvdXQgZm9yIGgyNjRfZGVidWdfZmxhZyBwdXJwb3NlICovCisJaWYgKChwX1ZpZC0+cHJvZmlsZV9pZGMgPT0gTVZDX0hJR0ggfHwKKwkgICAgcF9WaWQtPnByb2ZpbGVfaWRjID09IFNURVJFT19ISUdIKSAmJgorCSAgICBjdXJyU2xpY2UtPmN1cnJlbnRfc2xpY2VfbnIgPT0gMCkgeworCQlpZiAoKGN1cnJTbGljZS0+bGlzdFhzaXplWzBdID4gMCkgfHwKKwkJICAgIChjdXJyU2xpY2UtPmxpc3RYc2l6ZVsxXSA+IDApKQorCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLCAiXG4iKTsKKwkJaWYgKGN1cnJTbGljZS0+bGlzdFhzaXplWzBdID4gMCkgeworCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJCSIgKiogKEN1clZpZXdJRDolZCAlZCkgJXMgUmVmIFBpYyBMaXN0IDAgKioqKlxuIiwKKwkJCQljdXJyU2xpY2UtPnZpZXdfaWQsCisJCQkJY3VyclNsaWNlLT5UaGlzUE9DLAorCQkJCWN1cnJTbGljZS0+c3RydWN0dXJlID09IEZSQU1FID8gIkZSTSIgOgorCQkJCShjdXJyU2xpY2UtPnN0cnVjdHVyZSA9PSBUT1BfRklFTEQgPworCQkJCSJUT1AiIDogIkJPVCIpKTsKKwkJCWZvciAoaSA9IDA7IGkgPCAodW5zaWduZWQgaW50KShjdXJyU2xpY2UtPgorCQkJCWxpc3RYc2l6ZVswXSk7IGkrKykgeyAvKiByZWYgbGlzdCAwICovCisJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkJIiAgICUyZCAtPiBQT0M6ICU0ZCBQaWNOdW06ICU0ZCBWaWV3SUQ6ICVkXG4iLAorCQkJCQlpLAorCQkJCQljdXJyU2xpY2UtPmxpc3RYWzBdW2ldLT5wb2MsCisJCQkJCWN1cnJTbGljZS0+bGlzdFhbMF1baV0tPnBpY19udW0sCisJCQkJCWN1cnJTbGljZS0+bGlzdFhbMF1baV0tPnZpZXdfaWQpOworCQkJfQorCQl9CisJCWlmIChjdXJyU2xpY2UtPmxpc3RYc2l6ZVsxXSA+IDApIHsKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkiICoqIChDdXJWaWV3SUQ6JWQgJWQpICVzIFJlZiBQaWMgTGlzdCAxICoqKipcbiIsCisJCQkJY3VyclNsaWNlLT52aWV3X2lkLAorCQkJCWN1cnJTbGljZS0+VGhpc1BPQywKKwkJCQljdXJyU2xpY2UtPnN0cnVjdHVyZSA9PSBGUkFNRSA/ICJGUk0iIDoKKwkJCQkoY3VyclNsaWNlLT5zdHJ1Y3R1cmUgPT0gVE9QX0ZJRUxEID8gIlRPUCIgOgorCQkJCSJCT1QiKSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgKHVuc2lnbmVkIGludCkoY3VyclNsaWNlLT4KKwkJCQlsaXN0WHNpemVbMV0pOyBpKyspIHsgLyogcmVmIGxpc3QgMSAqLworCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJCSIgICAlMmQgLT4gUE9DOiAlNGQgUGljTnVtOiAlNGQJVmlld0lEOiAlZFxuIiwKKwkJCQkJaSwKKwkJCQkJY3VyclNsaWNlLT5saXN0WFsxXVtpXS0+cG9jLAorCQkJCQljdXJyU2xpY2UtPmxpc3RYWzFdW2ldLT5waWNfbnVtLAorCQkJCQljdXJyU2xpY2UtPmxpc3RYWzFdW2ldLT52aWV3X2lkKTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorI2VuZGlmCit9CisKK3N0YXRpYyBzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpnZXRfc2hvcnRfdGVybV9waWMoc3RydWN0IFNsaWNlICpjdXJyU2xpY2UsCisJCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIsIGludCBwaWNOdW0pCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSBjb250YWluZXJfb2YocF9EcGIsCisJCXN0cnVjdCBoMjY0X2RwYl9zdHJ1LCBtRFBCKTsKKwlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnJlZl9mcmFtZXNfaW5fYnVmZmVyOyBpKyspIHsKKwkJaWYgKGN1cnJTbGljZS0+c3RydWN0dXJlID09IEZSQU1FKSB7CisjaWZkZWYgRVJST1JfQ0hFQ0sKKwkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldID09IE5VTEwpIHsKKwkJCQlwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyA9IF9fTElORV9fOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmCisJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+aXNfcmVmZXJlbmNlID09IDMpIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZSA9PSBOVUxMKSB7CisJCQkJCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnID0gX19MSU5FX187CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKyNlbmRpZgorCQkJCWlmICgoIXBfRHBiLT5mc19yZWZbaV0tPmZyYW1lLT4KKwkJCQkJaXNfbG9uZ190ZXJtKSAmJgorCQkJCSAgICAocF9EcGItPmZzX3JlZltpXS0+ZnJhbWUtPgorCQkJCQlwaWNfbnVtID09IHBpY051bSkpCisJCQkJCXJldHVybiBwX0RwYi0+ZnNfcmVmW2ldLT5mcmFtZTsKKwkJCX0KKwkJfSBlbHNlIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0gPT0gTlVMTCkgeworCQkJCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnID0gX19MSU5FX187CisJCQkJY29udGludWU7CisJCQl9CisjZW5kaWYKKwkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldLT5pc19yZWZlcmVuY2UgJiAxKSB7CisjaWZkZWYgRVJST1JfQ0hFQ0sKKwkJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkID09IE5VTEwpIHsKKwkJCQkJcF9IMjY0X0RwYi0+ZHBiX2Vycm9yX2ZsYWcgPSBfX0xJTkVfXzsKKwkJCQkJY29udGludWU7CisJCQkJfQorI2VuZGlmCisJCQkJaWYgKCghcF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkLT4KKwkJCQkJaXNfbG9uZ190ZXJtKSAmJgorCQkJCSAgICAocF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkLT4KKwkJCQkJcGljX251bSA9PSBwaWNOdW0pKQorCQkJCQlyZXR1cm4gcF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkOworCQkJfQorCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0tPmlzX3JlZmVyZW5jZSAmIDIpIHsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldLT5ib3R0b21fZmllbGQgPT0gTlVMTCkgeworCQkJCQlwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyA9IF9fTElORV9fOworCQkJCQljb250aW51ZTsKKwkJCQl9CisjZW5kaWYKKwkJCQlpZiAoKCFwX0RwYi0+ZnNfcmVmW2ldLT5ib3R0b21fZmllbGQtPgorCQkJCQlpc19sb25nX3Rlcm0pICYmCisJCQkJICAgIChwX0RwYi0+ZnNfcmVmW2ldLT5ib3R0b21fZmllbGQtPgorCQkJCQlwaWNfbnVtID09IHBpY051bSkpCisJCQkJCXJldHVybiBwX0RwYi0+ZnNfcmVmW2ldLT5ib3R0b21fZmllbGQ7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gY3VyclNsaWNlLT5wX1ZpZC0+bm9fcmVmZXJlbmNlX3BpY3R1cmU7Cit9CisKKworc3RhdGljIHZvaWQgcmVvcmRlcl9zaG9ydF90ZXJtKHN0cnVjdCBTbGljZSAqY3VyclNsaWNlLCBpbnQgY3VyX2xpc3QsCisJCQkJaW50IG51bV9yZWZfaWR4X2xYX2FjdGl2ZV9taW51czEsCisJCQkJaW50IHBpY051bUxYLCBpbnQgKnJlZklkeExYKQoreworCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gY29udGFpbmVyX29mKGN1cnJTbGljZS0+cF9WaWQsCisJCQkJCXN0cnVjdCBoMjY0X2RwYl9zdHJ1LCBtVmlkZW8pOworCisJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqKlJlZlBpY0xpc3RYID0gY3VyclNsaWNlLT5saXN0WFtjdXJfbGlzdF07CisJaW50IGNJZHgsIG5JZHg7CisKKwlzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpwaWNMWDsKKworCXBpY0xYID0gZ2V0X3Nob3J0X3Rlcm1fcGljKGN1cnJTbGljZSwgY3VyclNsaWNlLT5wX0RwYiwgcGljTnVtTFgpOworCisJZm9yIChjSWR4ID0gbnVtX3JlZl9pZHhfbFhfYWN0aXZlX21pbnVzMSArIDE7IGNJZHggPiAqcmVmSWR4TFg7CisJCWNJZHgtLSkgeworCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJIiVzOiBSZWZQaWNMaXN0WFsgJWQgXSA9IFJlZlBpY0xpc3RYWyAlZCBdXG4iLAorCQkJX19mdW5jX18sIGNJZHgsIGNJZHggLSAxKTsKKwkJUmVmUGljTGlzdFhbY0lkeF0gPSBSZWZQaWNMaXN0WFtjSWR4IC0gMV07CisJfQorCisJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJIiVzOiBSZWZQaWNMaXN0WFsgJWQgXSA9IHBpYyAleCAoJWQpXG4iLCBfX2Z1bmNfXywKKwkJKnJlZklkeExYLCBwaWNMWCwgcGljTnVtTFgpOworCisJUmVmUGljTGlzdFhbKCpyZWZJZHhMWCkrK10gPSBwaWNMWDsKKworCW5JZHggPSAqcmVmSWR4TFg7CisKKwlmb3IgKGNJZHggPSAqcmVmSWR4TFg7IGNJZHggPD0gbnVtX3JlZl9pZHhfbFhfYWN0aXZlX21pbnVzMSArIDE7CisJCWNJZHgrKykgeworCQlpZiAoUmVmUGljTGlzdFhbY0lkeF0pCisJCQlpZiAoKFJlZlBpY0xpc3RYW2NJZHhdLT5pc19sb25nX3Rlcm0pIHx8CisJCQkgICAgKFJlZlBpY0xpc3RYW2NJZHhdLT5waWNfbnVtICE9IHBpY051bUxYKSkgeworCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJCSIlczogUmVmUGljTGlzdFhbICVkIF0gPSBSZWZQaWNMaXN0WFsgJWQgXVxuIiwKKwkJCQkJX19mdW5jX18sIG5JZHgsIGNJZHgpOworCQkJCVJlZlBpY0xpc3RYW25JZHgrK10gPSBSZWZQaWNMaXN0WFtjSWR4XTsKKwkJCX0KKwl9Cit9CisKKworc3RhdGljIHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKmdldF9sb25nX3Rlcm1fcGljKHN0cnVjdCBTbGljZSAqY3VyclNsaWNlLAorCQlzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiLCBpbnQgTG9uZ3Rlcm1QaWNOdW0pCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPmx0cmVmX2ZyYW1lc19pbl9idWZmZXI7IGkrKykgeworCQlpZiAoY3VyclNsaWNlLT5zdHJ1Y3R1cmUgPT0gRlJBTUUpIHsKKwkJCWlmIChwX0RwYi0+ZnNfbHRyZWZbaV0tPmlzX3JlZmVyZW5jZSA9PSAzKQorCQkJCWlmICgocF9EcGItPmZzX2x0cmVmW2ldLT5mcmFtZSkgJiYKKwkJCQkJKHBfRHBiLT5mc19sdHJlZltpXS0+ZnJhbWUtPgorCQkJCQlpc19sb25nX3Rlcm0pICYmCisJCQkJICAgIChwX0RwYi0+ZnNfbHRyZWZbaV0tPmZyYW1lLT4KKwkJCQkJbG9uZ190ZXJtX3BpY19udW0gPT0KKwkJCQkJTG9uZ3Rlcm1QaWNOdW0pKQorCQkJCQlyZXR1cm4gcF9EcGItPmZzX2x0cmVmW2ldLT5mcmFtZTsKKwkJfSBlbHNlIHsKKwkJCWlmIChwX0RwYi0+ZnNfbHRyZWZbaV0tPmlzX3JlZmVyZW5jZSAmIDEpCisJCQkJaWYgKChwX0RwYi0+ZnNfbHRyZWZbaV0tPnRvcF9maWVsZCkgJiYKKwkJCQkJKHBfRHBiLT5mc19sdHJlZltpXS0+dG9wX2ZpZWxkLT4KKwkJCQkJaXNfbG9uZ190ZXJtKSAmJgorCQkJCSAgICAocF9EcGItPmZzX2x0cmVmW2ldLT50b3BfZmllbGQtPgorCQkJCQlsb25nX3Rlcm1fcGljX251bSA9PSBMb25ndGVybVBpY051bSkpCisJCQkJCXJldHVybiBwX0RwYi0+ZnNfbHRyZWZbaV0tPnRvcF9maWVsZDsKKworCQkJaWYgKHBfRHBiLT5mc19sdHJlZltpXS0+aXNfcmVmZXJlbmNlICYgMikKKwkJCQlpZiAoKHBfRHBiLT5mc19sdHJlZltpXS0+Ym90dG9tX2ZpZWxkKSAmJgorCQkJCQkocF9EcGItPmZzX2x0cmVmW2ldLT5ib3R0b21fZmllbGQtPgorCQkJCQlpc19sb25nX3Rlcm0pICYmCisJCQkJICAgIChwX0RwYi0+ZnNfbHRyZWZbaV0tPmJvdHRvbV9maWVsZC0+CisJCQkJCWxvbmdfdGVybV9waWNfbnVtID09CisJCQkJCUxvbmd0ZXJtUGljTnVtKSkKKwkJCQkJcmV0dXJuIHBfRHBiLT5mc19sdHJlZltpXS0+CisJCQkJCQlib3R0b21fZmllbGQ7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogXGJyaWVmCisgKiAgICBSZW9yZGVyaW5nIHByb2Nlc3MgZm9yIGxvbmctdGVybSByZWZlcmVuY2UgcGljdHVyZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyB2b2lkIHJlb3JkZXJfbG9uZ190ZXJtKHN0cnVjdCBTbGljZSAqY3VyclNsaWNlLAorCQkJCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKipSZWZQaWNMaXN0WCwKKwkJCQlpbnQgbnVtX3JlZl9pZHhfbFhfYWN0aXZlX21pbnVzMSwKKwkJCSAgICAgIGludCBMb25nVGVybVBpY051bSwgaW50ICpyZWZJZHhMWCkKK3sKKwlpbnQgY0lkeCwgbklkeDsKKworCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnBpY0xYOworCisJcGljTFggPSBnZXRfbG9uZ190ZXJtX3BpYyhjdXJyU2xpY2UsIGN1cnJTbGljZS0+cF9EcGIsIExvbmdUZXJtUGljTnVtKTsKKworCWZvciAoY0lkeCA9IG51bV9yZWZfaWR4X2xYX2FjdGl2ZV9taW51czEgKyAxOyBjSWR4ID4gKnJlZklkeExYOyBjSWR4LS0pCisJCVJlZlBpY0xpc3RYW2NJZHhdID0gUmVmUGljTGlzdFhbY0lkeCAtIDFdOworCisJUmVmUGljTGlzdFhbKCpyZWZJZHhMWCkrK10gPSBwaWNMWDsKKworCW5JZHggPSAqcmVmSWR4TFg7CisKKwlmb3IgKGNJZHggPSAqcmVmSWR4TFg7IGNJZHggPD0gbnVtX3JlZl9pZHhfbFhfYWN0aXZlX21pbnVzMSArIDE7CisJCWNJZHgrKykgeworCQlpZiAoUmVmUGljTGlzdFhbY0lkeF0pIHsKKwkJCWlmICgoIVJlZlBpY0xpc3RYW2NJZHhdLT5pc19sb25nX3Rlcm0pIHx8CisJCQkgICAgKFJlZlBpY0xpc3RYW2NJZHhdLT5sb25nX3Rlcm1fcGljX251bSAhPQorCQkJCUxvbmdUZXJtUGljTnVtKSkKKwkJCQlSZWZQaWNMaXN0WFtuSWR4KytdID0gUmVmUGljTGlzdFhbY0lkeF07CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlb3JkZXJfcmVmX3BpY19saXN0KHN0cnVjdCBTbGljZSAqY3VyclNsaWNlLCBpbnQgY3VyX2xpc3QpCit7CisJaW50ICptb2RpZmljYXRpb25fb2ZfcGljX251bXNfaWRjID0KKwkJY3VyclNsaWNlLT5tb2RpZmljYXRpb25fb2ZfcGljX251bXNfaWRjW2N1cl9saXN0XTsKKwlpbnQgKmFic19kaWZmX3BpY19udW1fbWludXMxID0KKwkJY3VyclNsaWNlLT5hYnNfZGlmZl9waWNfbnVtX21pbnVzMVtjdXJfbGlzdF07CisJaW50ICpsb25nX3Rlcm1fcGljX2lkeCA9IGN1cnJTbGljZS0+bG9uZ190ZXJtX3BpY19pZHhbY3VyX2xpc3RdOworCWludCBudW1fcmVmX2lkeF9sWF9hY3RpdmVfbWludXMxID0KKwkJY3VyclNsaWNlLT5udW1fcmVmX2lkeF9hY3RpdmVbY3VyX2xpc3RdIC0gMTsKKworCXN0cnVjdCBWaWRlb1BhcmFtZXRlcnMgKnBfVmlkID0gY3VyclNsaWNlLT5wX1ZpZDsKKwlpbnQgaTsKKworCWludCBtYXhQaWNOdW0sIGN1cnJQaWNOdW0sIHBpY051bUxYTm9XcmFwLCBwaWNOdW1MWFByZWQsIHBpY051bUxYOworCWludCByZWZJZHhMWCA9IDA7CisKKwlpZiAoY3VyclNsaWNlLT5zdHJ1Y3R1cmUgPT0gRlJBTUUpIHsKKwkJbWF4UGljTnVtICA9IHBfVmlkLT5tYXhfZnJhbWVfbnVtOworCQljdXJyUGljTnVtID0gY3VyclNsaWNlLT5mcmFtZV9udW07CisJfSBlbHNlIHsKKwkJbWF4UGljTnVtICA9IDIgKiBwX1ZpZC0+bWF4X2ZyYW1lX251bTsKKwkJY3VyclBpY051bSA9IDIgKiBjdXJyU2xpY2UtPmZyYW1lX251bSArIDE7CisJfQorCisJcGljTnVtTFhQcmVkID0gY3VyclBpY051bTsKKworCWZvciAoaSA9IDA7ICBpIDwgUkVPUkRFUklOR19DT01NQU5EX01BWF9TSVpFICYmCisJCW1vZGlmaWNhdGlvbl9vZl9waWNfbnVtc19pZGNbaV0gIT0gMzsgaSsrKSB7CisJCWlmIChtb2RpZmljYXRpb25fb2ZfcGljX251bXNfaWRjW2ldID4gMykgeworCQkJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPQorCQkJY29udGFpbmVyX29mKHBfVmlkLCBzdHJ1Y3QgaDI2NF9kcGJfc3RydSwgbVZpZGVvKTsKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCVBSSU5UX0ZMQUdfRVJST1IsCisJCQkJImVycm9yLCBJbnZhbGlkIG1vZGlmaWNhdGlvbl9vZl9waWNfbnVtc19pZGMgY29tbWFuZFxuIik7CisJCQkvKmgyNjRfZGVidWdfZmxhZyA9IDB4MWY7Ki8KKwkJCWJyZWFrOworCQl9CisJCWlmIChtb2RpZmljYXRpb25fb2ZfcGljX251bXNfaWRjW2ldIDwgMikgeworCQkJaWYgKG1vZGlmaWNhdGlvbl9vZl9waWNfbnVtc19pZGNbaV0gPT0gMCkgeworCQkJCWlmIChwaWNOdW1MWFByZWQgLSAoYWJzX2RpZmZfcGljX251bV9taW51czFbaV0KKwkJCQkJKyAxKSA8IDApCisJCQkJCXBpY051bUxYTm9XcmFwID0gcGljTnVtTFhQcmVkIC0KKwkJCQkJKGFic19kaWZmX3BpY19udW1fbWludXMxW2ldICsgMSkgKworCQkJCQltYXhQaWNOdW07CisJCQkJZWxzZQorCQkJCQlwaWNOdW1MWE5vV3JhcCA9IHBpY051bUxYUHJlZCAtCisJCQkJCShhYnNfZGlmZl9waWNfbnVtX21pbnVzMVtpXSArIDEpOworCQkJfSBlbHNlIHsgLyogKG1vZGlmaWNhdGlvbl9vZl9waWNfbnVtc19pZGNbaV0gPT0gMSkgKi8KKwkJCQlpZiAocGljTnVtTFhQcmVkICsgKGFic19kaWZmX3BpY19udW1fbWludXMxW2ldCisJCQkJCSsgMSkgID49ICBtYXhQaWNOdW0pCisJCQkJCXBpY051bUxYTm9XcmFwID0gcGljTnVtTFhQcmVkICsKKwkJCQkJKGFic19kaWZmX3BpY19udW1fbWludXMxW2ldICsgMSkgLQorCQkJCQltYXhQaWNOdW07CisJCQkJZWxzZQorCQkJCQlwaWNOdW1MWE5vV3JhcCA9IHBpY051bUxYUHJlZCArCisJCQkJCShhYnNfZGlmZl9waWNfbnVtX21pbnVzMVtpXSArIDEpOworCQkJfQorCQkJcGljTnVtTFhQcmVkID0gcGljTnVtTFhOb1dyYXA7CisKKwkJCWlmIChwaWNOdW1MWE5vV3JhcCA+IGN1cnJQaWNOdW0pCisJCQkJcGljTnVtTFggPSBwaWNOdW1MWE5vV3JhcCAtIG1heFBpY051bTsKKwkJCWVsc2UKKwkJCQlwaWNOdW1MWCA9IHBpY051bUxYTm9XcmFwOworCisjaWYgKE1WQ19FWFRFTlNJT05fRU5BQkxFKQorCQkJcmVvcmRlcl9zaG9ydF90ZXJtKGN1cnJTbGljZSwgY3VyX2xpc3QsCisJCQkJCW51bV9yZWZfaWR4X2xYX2FjdGl2ZV9taW51czEsIHBpY051bUxYLAorCQkJCQkmcmVmSWR4TFgsIC0xKTsKKyNlbHNlCisJCQlyZW9yZGVyX3Nob3J0X3Rlcm0oY3VyclNsaWNlLCBjdXJfbGlzdCwKKwkJCQkJbnVtX3JlZl9pZHhfbFhfYWN0aXZlX21pbnVzMSwgcGljTnVtTFgsCisJCQkJCSZyZWZJZHhMWCk7CisjZW5kaWYKKwkJfSBlbHNlIHsgLyogKG1vZGlmaWNhdGlvbl9vZl9waWNfbnVtc19pZGNbaV0gPT0gMikgKi8KKyNpZiAoTVZDX0VYVEVOU0lPTl9FTkFCTEUpCisJCQlyZW9yZGVyX2xvbmdfdGVybShjdXJyU2xpY2UsIGN1cnJTbGljZS0+bGlzdFhbY3VyX2xpc3RdLAorCQkJCQludW1fcmVmX2lkeF9sWF9hY3RpdmVfbWludXMxLAorCQkJCQlsb25nX3Rlcm1fcGljX2lkeFtpXSwgJnJlZklkeExYLCAtMSk7CisjZWxzZQorCQkJcmVvcmRlcl9sb25nX3Rlcm0oY3VyclNsaWNlLCBjdXJyU2xpY2UtPmxpc3RYW2N1cl9saXN0XSwKKwkJCQkJbnVtX3JlZl9pZHhfbFhfYWN0aXZlX21pbnVzMSwKKwkJCQkJbG9uZ190ZXJtX3BpY19pZHhbaV0sICZyZWZJZHhMWCk7CisjZW5kaWYKKwkJfQorCisJfQorCS8qIHRoYXQncyBhIGRlZmluaXRpb24gKi8KKwljdXJyU2xpY2UtPmxpc3RYc2l6ZVtjdXJfbGlzdF0gPQorCQkoY2hhcikobnVtX3JlZl9pZHhfbFhfYWN0aXZlX21pbnVzMSArIDEpOworfQorCitzdGF0aWMgdm9pZCByZW9yZGVyX2xpc3RzKHN0cnVjdCBTbGljZSAqY3VyclNsaWNlKQoreworCXN0cnVjdCBWaWRlb1BhcmFtZXRlcnMgKnBfVmlkID0gY3VyclNsaWNlLT5wX1ZpZDsKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9IGNvbnRhaW5lcl9vZihwX1ZpZCwKKwkJc3RydWN0IGgyNjRfZHBiX3N0cnUsIG1WaWRlbyk7CisJaW50IGk7CisKKwlpZiAoKGN1cnJTbGljZS0+c2xpY2VfdHlwZSAhPSBJX1NMSUNFKSAmJgorCQkoY3VyclNsaWNlLT5zbGljZV90eXBlICE9IFNJX1NMSUNFKSkgeworCQlpZiAoY3VyclNsaWNlLT5yZWZfcGljX2xpc3RfcmVvcmRlcmluZ19mbGFnW0xJU1RfMF0pCisJCQlyZW9yZGVyX3JlZl9waWNfbGlzdChjdXJyU2xpY2UsIExJU1RfMCk7CisJCWlmIChwX1ZpZC0+bm9fcmVmZXJlbmNlX3BpY3R1cmUgPT0KKwkJICAgIGN1cnJTbGljZS0+CisJCQlsaXN0WFswXVtjdXJyU2xpY2UtPm51bV9yZWZfaWR4X2FjdGl2ZVtMSVNUXzBdIC0gMV0pIHsKKwkJCWlmIChwX1ZpZC0+bm9uX2NvbmZvcm1pbmdfc3RyZWFtKQorCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJCSJSZWZQaWNMaXN0MFsgJWQgXSBpcyBlcXVhbCB0byAnbm8gcmVmZXJlbmNlIHBpY3R1cmUnXG4iLAorCQkJCQljdXJyU2xpY2UtPgorCQkJCQludW1fcmVmX2lkeF9hY3RpdmVbTElTVF8wXSAtIDEpOworCQkJZWxzZQorCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJCSJSZWZQaWNMaXN0MCBbIG51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgXSBpcyBlcXVhbCB0byAnbm8gcmVmZXJlbmNlIHBpY3R1cmUnLCBpbnZhbGlkIGJpdHN0cmVhbSAlZFxuIiwKKwkJCQkJNTAwKTsKKwkJfQorCQkvKiB0aGF0J3MgYSBkZWZpbml0aW9uICovCisJCWN1cnJTbGljZS0+bGlzdFhzaXplWzBdID0KKwkJCShjaGFyKSBpbWluKGN1cnJTbGljZS0+bGlzdFhzaXplWzBdLAorCQkJY3VyclNsaWNlLT5udW1fcmVmX2lkeF9hY3RpdmVbTElTVF8wXSk7CisJCUNIRUNLX1ZBTElEKGN1cnJTbGljZS0+bGlzdFhzaXplWzBdLCAwKTsKKwkJaWYgKGgyNjRfZGVidWdfZmxhZyAmIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCkgeworCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJCSJsaXN0WFswXSByZW9yZGVyIChQaWNOdW0pOiAiKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBjdXJyU2xpY2UtPmxpc3RYc2l6ZVswXTsgaSsrKSB7CisJCQkJZHBiX3ByaW50X2NvbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLCAiJWQgICIsCisJCQkJCWN1cnJTbGljZS0+bGlzdFhbMF1baV0tPnBpY19udW0pOworCQkJfQorCQkJZHBiX3ByaW50X2NvbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsICJcbiIpOworCQl9CisJfQorCisJaWYgKGN1cnJTbGljZS0+c2xpY2VfdHlwZSA9PSBCX1NMSUNFKSB7CisJCWlmIChjdXJyU2xpY2UtPnJlZl9waWNfbGlzdF9yZW9yZGVyaW5nX2ZsYWdbTElTVF8xXSkKKwkJCXJlb3JkZXJfcmVmX3BpY19saXN0KGN1cnJTbGljZSwgTElTVF8xKTsKKwkJaWYgKHBfVmlkLT5ub19yZWZlcmVuY2VfcGljdHVyZSA9PQorCQkgICAgY3VyclNsaWNlLT5saXN0WFsxXVtjdXJyU2xpY2UtPgorCQkJbnVtX3JlZl9pZHhfYWN0aXZlW0xJU1RfMV0gLSAxXSkgeworCQkJaWYgKHBfVmlkLT5ub25fY29uZm9ybWluZ19zdHJlYW0pCisJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkJIlJlZlBpY0xpc3QxWyAlZCBdIGlzIGVxdWFsIHRvICdubyByZWZlcmVuY2UgcGljdHVyZSdcbiIsCisJCQkJCWN1cnJTbGljZS0+CisJCQkJCW51bV9yZWZfaWR4X2FjdGl2ZVtMSVNUXzFdIC0gMSk7CisJCQllbHNlCisJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkJIlJlZlBpY0xpc3QxIFsgbnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSBdIGlzIGVxdWFsIHRvICdubyByZWZlcmVuY2UgcGljdHVyZScsIGludmFsaWQgYml0c3RyZWFtICVkXG4iLAorCQkJCQk1MDApOworCQl9CisJCS8qIHRoYXQncyBhIGRlZmluaXRpb24gKi8KKwkJY3VyclNsaWNlLT5saXN0WHNpemVbMV0gPQorCQkJKGNoYXIpY3VyclNsaWNlLT5udW1fcmVmX2lkeF9hY3RpdmVbTElTVF8xXTsKKwkJaWYgKGgyNjRfZGVidWdfZmxhZyAmIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCkgeworCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJICAibGlzdFhbMV0gcmVvcmRlciAoUGljTnVtKTogIik7CisJCQlmb3IgKGkgPSAwOyBpIDwgY3VyclNsaWNlLT5saXN0WHNpemVbMV07IGkrKykgeworCQkJCWlmIChjdXJyU2xpY2UtPmxpc3RYWzFdW2ldKQorCQkJCQlkcGJfcHJpbnRfY29udChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLCAiJWQgICIsCisJCQkJCQljdXJyU2xpY2UtPmxpc3RYWzFdW2ldLT5waWNfbnVtKTsKKwkJCX0KKwkJCWRwYl9wcmludF9jb250KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLCAiXG4iKTsKKwkJfQorCX0KKworCS8qIGZyZWVfcmVmX3BpY19saXN0X3Jlb3JkZXJpbmdfYnVmZmVyKGN1cnJTbGljZSk7ICovCisKKwlpZiAoY3VyclNsaWNlLT5zbGljZV90eXBlID09IFBfU0xJQ0UpIHsKKyNpZiBQUklOVFJFRkxJU1QKKwkJdW5zaWduZWQgaW50IGk7CisjaWYgKE1WQ19FWFRFTlNJT05fRU5BQkxFKQorCQkvKiBwcmludCBvdXQgZm9yIGgyNjRfZGVidWdfZmxhZyBwdXJwb3NlICovCisJCWlmICgocF9WaWQtPnByb2ZpbGVfaWRjID09IE1WQ19ISUdIIHx8CisJCQlwX1ZpZC0+cHJvZmlsZV9pZGMgPT0gU1RFUkVPX0hJR0gpICYmCisJCQljdXJyU2xpY2UtPmN1cnJlbnRfc2xpY2VfbnIgPT0gMCkgeworCQkJaWYgKGN1cnJTbGljZS0+bGlzdFhzaXplWzBdID4gMAorCQkJCSYmIChoMjY0X2RlYnVnX2ZsYWcgJiBQUklOVF9GTEFHX0RQQl9ERVRBSUwpKSB7CisJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwgIlxuIik7CisJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkJICAiICoqIChGaW5hbFZpZXdJRDolZCkgJXMgUmVmIFBpYyBMaXN0IDAgKioqKlxuIiwKKwkJCQkJY3VyclNsaWNlLT52aWV3X2lkLAorCQkJCQljdXJyU2xpY2UtPnN0cnVjdHVyZSA9PSBGUkFNRSA/CisJCQkJCSJGUk0iIDoKKwkJCQkJKGN1cnJTbGljZS0+c3RydWN0dXJlID09IFRPUF9GSUVMRCA/CisJCQkJCSJUT1AiIDogIkJPVCIpKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgKHVuc2lnbmVkIGludCkoY3VyclNsaWNlLT4KKwkJCQkJbGlzdFhzaXplWzBdKTsgaSsrKSB7IC8qIHJlZiBsaXN0IDAgKi8KKwkJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJCQkiICAgJTJkIC0+IFBPQzogJTRkIFBpY051bTogJTRkIFZpZXdJRDogJWRcbiIsCisJCQkJCQlpLAorCQkJCQkJY3VyclNsaWNlLT5saXN0WFswXVtpXS0+cG9jLAorCQkJCQkJY3VyclNsaWNlLT5saXN0WFswXVtpXS0+CisJCQkJCQkJcGljX251bSwKKwkJCQkJCWN1cnJTbGljZS0+bGlzdFhbMF1baV0tPgorCQkJCQkJCXZpZXdfaWQpOworCQkJCX0KKwkJCX0KKwkJfQorI2VuZGlmCisjZW5kaWYKKwl9IGVsc2UgaWYgKGN1cnJTbGljZS0+c2xpY2VfdHlwZSA9PSBCX1NMSUNFKSB7CisjaWYgUFJJTlRSRUZMSVNUCisJCXVuc2lnbmVkIGludCBpOworI2lmIChNVkNfRVhURU5TSU9OX0VOQUJMRSkKKwkJLyogcHJpbnQgb3V0IGZvciBoMjY0X2RlYnVnX2ZsYWcgcHVycG9zZSAqLworCQlpZiAoKHBfVmlkLT5wcm9maWxlX2lkYyA9PSBNVkNfSElHSCB8fAorCQkJcF9WaWQtPnByb2ZpbGVfaWRjID09IFNURVJFT19ISUdIKSAmJgorCQkgICAgY3VyclNsaWNlLT5jdXJyZW50X3NsaWNlX25yID09IDApIHsKKwkJCWlmICgoY3VyclNsaWNlLT5saXN0WHNpemVbMF0gPiAwKSB8fAorCQkJCShjdXJyU2xpY2UtPmxpc3RYc2l6ZVsxXSA+IDApKQorCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsICJcbiIpOworCQkJaWYgKGN1cnJTbGljZS0+bGlzdFhzaXplWzBdID4gMAorCQkJCSYmIChoMjY0X2RlYnVnX2ZsYWcgJiBQUklOVF9GTEFHX0RQQl9ERVRBSUwpKSB7CisJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkJIiAqKiAoRmluYWxWaWV3SUQ6JWQpICVzIFJlZiBQaWMgTGlzdCAwICoqKipcbiIsCisJCQkJCWN1cnJTbGljZS0+dmlld19pZCwKKwkJCQkJY3VyclNsaWNlLT5zdHJ1Y3R1cmUgPT0gRlJBTUUgPworCQkJCQkiRlJNIiA6CisJCQkJCShjdXJyU2xpY2UtPnN0cnVjdHVyZSA9PSBUT1BfRklFTEQgPworCQkJCQkiVE9QIiA6ICJCT1QiKSk7CisJCQkJZm9yIChpID0gMDsgaSA8ICh1bnNpZ25lZCBpbnQpKGN1cnJTbGljZS0+CisJCQkJCWxpc3RYc2l6ZVswXSk7IGkrKykgeyAvKiByZWYgbGlzdCAwICovCisJCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJCQkJIiAgICUyZCAtPiBQT0M6ICU0ZCBQaWNOdW06ICU0ZCBWaWV3SUQ6ICVkXG4iLAorCQkJCQkJaSwKKwkJCQkJCWN1cnJTbGljZS0+bGlzdFhbMF1baV0tPnBvYywKKwkJCQkJCWN1cnJTbGljZS0+bGlzdFhbMF1baV0tPgorCQkJCQkJCXBpY19udW0sCisJCQkJCQljdXJyU2xpY2UtPmxpc3RYWzBdW2ldLT4KKwkJCQkJCQl2aWV3X2lkKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoY3VyclNsaWNlLT5saXN0WHNpemVbMV0gPiAwCisJCQkJICYmIChoMjY0X2RlYnVnX2ZsYWcgJiBQUklOVF9GTEFHX0RQQl9ERVRBSUwpKSB7CisJCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkJIiAqKiAoRmluYWxWaWV3SUQ6JWQpICVzIFJlZiBQaWMgTGlzdCAxICoqKipcbiIsCisJCQkJCWN1cnJTbGljZS0+dmlld19pZCwKKwkJCQkJY3VyclNsaWNlLT5zdHJ1Y3R1cmUgPT0gRlJBTUUgPworCQkJCQkiRlJNIiA6CisJCQkJCShjdXJyU2xpY2UtPnN0cnVjdHVyZSA9PSBUT1BfRklFTEQgPworCQkJCQkiVE9QIiA6ICJCT1QiKSk7CisJCQkJZm9yIChpID0gMDsgaSA8ICh1bnNpZ25lZCBpbnQpKGN1cnJTbGljZS0+CisJCQkJCWxpc3RYc2l6ZVsxXSk7IGkrKykgeyAvKiByZWYgbGlzdCAxICovCisJCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJCQkJIiAgICUyZCAtPiBQT0M6ICU0ZCBQaWNOdW06ICU0ZCBWaWV3SUQ6ICVkXG4iLAorCQkJCQkJaSwKKwkJCQkJCWN1cnJTbGljZS0+bGlzdFhbMV1baV0tPnBvYywKKwkJCQkJCWN1cnJTbGljZS0+bGlzdFhbMV1baV0tPgorCQkJCQkJCXBpY19udW0sCisJCQkJCQljdXJyU2xpY2UtPmxpc3RYWzFdW2ldLT4KKwkJCQkJCQl2aWV3X2lkKTsKKwkJCQl9CisJCQl9CisJCX0KKyNlbmRpZgorCisjZW5kaWYKKwl9Cit9CisKK3ZvaWQgaW5pdF9jb2xvY2F0ZV9idWYoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIsIGludCBjb3VudCkKK3sKKwlwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX21hcCA9IDA7CisJcF9IMjY0X0RwYi0+Y29sb2NhdGVkX2J1Zl9jb3VudCA9IGNvdW50OworfQorCitpbnQgYWxsb2NhdGVfY29sb2NhdGVfYnVmKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHBfSDI2NF9EcGItPmNvbG9jYXRlZF9idWZfY291bnQ7IGkrKykgeworCQlpZiAoKChwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX21hcCA+PiBpKSAmIDB4MSkgPT0gMCkgeworCQkJcF9IMjY0X0RwYi0+Y29sb2NhdGVkX2J1Zl9tYXAgfD0gKDEgPDwgaSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaSA9PSBwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX2NvdW50KSB7CisJCWkgPSAtMTsKKwkJcF9IMjY0X0RwYi0+YnVmX2FsbG9jX2ZhaWwgPSAxOworCX0KKwlyZXR1cm4gaTsKK30KKworaW50IHJlbGVhc2VfY29sb2NhdGVfYnVmKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLCBpbnQgaW5kZXgpCit7CisJaWYgKGluZGV4ID49IDApIHsKKwkJaWYgKGluZGV4ID49IHBfSDI2NF9EcGItPmNvbG9jYXRlZF9idWZfY291bnQpIHsKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0VSUk9SLAorCQkJCSIlcyBlcnJvciwgaW5kZXggJWQgaXMgYmlnZ2VyIHRoYW4gYnVmIGNvdW50ICVkXG4iLAorCQkJCV9fZnVuY19fLCBpbmRleCwKKwkJCQlwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX2NvdW50KTsKKwkJfSBlbHNlIHsKKwkJCWlmICgoKHBfSDI2NF9EcGItPmNvbG9jYXRlZF9idWZfbWFwID4+CisJCQkJaW5kZXgpICYgMHgxKSA9PSAweDEpIHsKKwkJCQlwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX21hcCAmPQorCQkJCQkofigxIDw8IGluZGV4KSk7CisJCQl9IGVsc2UgeworCQkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LAorCQkJCQlQUklOVF9GTEFHX0VSUk9SLAorCQkJCQkiJXMgZXJyb3IsIGluZGV4ICVkIGlzIG5vdCBhbGxvY2F0ZWRcbiIsCisJCQkJCV9fZnVuY19fLCBpbmRleCk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2V0X2ZyYW1lX291dHB1dF9mbGFnKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLCBpbnQgaW5kZXgpCit7CisJc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYiA9ICZwX0gyNjRfRHBiLT5tRFBCOworCisJcF9IMjY0X0RwYi0+bUZyYW1lU3RvcmVbaW5kZXhdLmlzX291dHB1dCA9IDE7CisJcF9IMjY0X0RwYi0+bUZyYW1lU3RvcmVbaW5kZXhdLnByZV9vdXRwdXQgPSAwOworCXBfSDI2NF9EcGItPm1GcmFtZVN0b3JlW2luZGV4XS5zaG93X2ZyYW1lID0gZmFsc2U7CisJZHVtcF9kcGIocF9EcGIsIDApOworfQorCisjaWYgMAordm9pZCBpbml0X29sZF9zbGljZShPbGRTbGljZVBhcmFtcyAqcF9vbGRfc2xpY2UpCit7CisJcF9vbGRfc2xpY2UtPmZpZWxkX3BpY19mbGFnID0gMDsKKwlwX29sZF9zbGljZS0+cHBzX2lkICAgICAgICAgPSBJTlRfTUFYOworCXBfb2xkX3NsaWNlLT5mcmFtZV9udW0gICAgICA9IElOVF9NQVg7CisJcF9vbGRfc2xpY2UtPm5hbF9yZWZfaWRjICAgID0gSU5UX01BWDsKKwlwX29sZF9zbGljZS0+aWRyX2ZsYWcgICAgICAgPSAwOworCisJcF9vbGRfc2xpY2UtPnBpY19vZGVyX2NudF9sc2IgICAgICAgICAgPSBVSU5UX01BWDsKKwlwX29sZF9zbGljZS0+ZGVsdGFfcGljX29kZXJfY250X2JvdHRvbSA9IElOVF9NQVg7CisKKwlwX29sZF9zbGljZS0+ZGVsdGFfcGljX29yZGVyX2NudFswXSA9IElOVF9NQVg7CisJcF9vbGRfc2xpY2UtPmRlbHRhX3BpY19vcmRlcl9jbnRbMV0gPSBJTlRfTUFYOworfQorCisKK3ZvaWQgY29weV9zbGljZV9pbmZvKHN0cnVjdCBTbGljZSAqY3VyclNsaWNlLCBPbGRTbGljZVBhcmFtcyAqcF9vbGRfc2xpY2UpCit7CisJc3RydWN0IFZpZGVvUGFyYW1ldGVycyAqcF9WaWQgPSBjdXJyU2xpY2UtPnBfVmlkOworCisJcF9vbGRfc2xpY2UtPnBwc19pZCAgICAgICAgID0gY3VyclNsaWNlLT5waWNfcGFyYW1ldGVyX3NldF9pZDsKKwlwX29sZF9zbGljZS0+ZnJhbWVfbnVtICAgICAgPSBjdXJyU2xpY2UtPmZyYW1lX251bTsKKwkvKiBwX1ZpZC0+ZnJhbWVfbnVtOyAqLworCXBfb2xkX3NsaWNlLT5maWVsZF9waWNfZmxhZyA9CisJCWN1cnJTbGljZS0+ZmllbGRfcGljX2ZsYWc7CisJLyogcF9WaWQtPmZpZWxkX3BpY19mbGFnOyAqLworCisJaWYgKGN1cnJTbGljZS0+ZmllbGRfcGljX2ZsYWcpCisJCXBfb2xkX3NsaWNlLT5ib3R0b21fZmllbGRfZmxhZyA9IGN1cnJTbGljZS0+Ym90dG9tX2ZpZWxkX2ZsYWc7CisKKwlwX29sZF9zbGljZS0+bmFsX3JlZl9pZGMgPSBjdXJyU2xpY2UtPm5hbF9yZWZlcmVuY2VfaWRjOworCXBfb2xkX3NsaWNlLT5pZHJfZmxhZyAgICA9IChieXRlKSBjdXJyU2xpY2UtPmlkcl9mbGFnOworCisJaWYgKGN1cnJTbGljZS0+aWRyX2ZsYWcpCisJCXBfb2xkX3NsaWNlLT5pZHJfcGljX2lkID0gY3VyclNsaWNlLT5pZHJfcGljX2lkOworCisJaWYgKHBfVmlkLT5hY3RpdmVfc3BzLT5waWNfb3JkZXJfY250X3R5cGUgPT0gMCkgeworCQlwX29sZF9zbGljZS0+cGljX29kZXJfY250X2xzYiA9CisJCQljdXJyU2xpY2UtPnBpY19vcmRlcl9jbnRfbHNiOworCQlwX29sZF9zbGljZS0+ZGVsdGFfcGljX29kZXJfY250X2JvdHRvbSA9CisJCQljdXJyU2xpY2UtPmRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tOworCX0KKworCWlmIChwX1ZpZC0+YWN0aXZlX3Nwcy0+cGljX29yZGVyX2NudF90eXBlID09IDEpIHsKKwkJcF9vbGRfc2xpY2UtPmRlbHRhX3BpY19vcmRlcl9jbnRbMF0gPQorCQkJY3VyclNsaWNlLT5kZWx0YV9waWNfb3JkZXJfY250WzBdOworCQlwX29sZF9zbGljZS0+ZGVsdGFfcGljX29yZGVyX2NudFsxXSA9CisJCQljdXJyU2xpY2UtPmRlbHRhX3BpY19vcmRlcl9jbnRbMV07CisJfQorI2lmIChNVkNfRVhURU5TSU9OX0VOQUJMRSkKKwlwX29sZF9zbGljZS0+dmlld19pZCA9IGN1cnJTbGljZS0+dmlld19pZDsKKwlwX29sZF9zbGljZS0+aW50ZXJfdmlld19mbGFnID0gY3VyclNsaWNlLT5pbnRlcl92aWV3X2ZsYWc7CisJcF9vbGRfc2xpY2UtPmFuY2hvcl9waWNfZmxhZyA9IGN1cnJTbGljZS0+YW5jaG9yX3BpY19mbGFnOworI2VuZGlmCisJcF9vbGRfc2xpY2UtPmxheWVyX2lkID0gY3VyclNsaWNlLT5sYXllcl9pZDsKK30KKworaW50IGlzX25ld19waWN0dXJlKFN0b3JhYmxlUGljdHVyZSAqZGVjX3BpY3R1cmUsIHN0cnVjdCBTbGljZSAqY3VyclNsaWNlLAorCQkgICBPbGRTbGljZVBhcmFtcyAqcF9vbGRfc2xpY2UpCit7CisJc3RydWN0IFZpZGVvUGFyYW1ldGVycyAqcF9WaWQgPSBjdXJyU2xpY2UtPnBfVmlkOworCisJaW50IHJlc3VsdCA9IDA7CisKKwlyZXN1bHQgfD0gKGRlY19waWN0dXJlID09IE5VTEwpOworCisJcmVzdWx0IHw9IChwX29sZF9zbGljZS0+cHBzX2lkICE9IGN1cnJTbGljZS0+cGljX3BhcmFtZXRlcl9zZXRfaWQpOworCisJcmVzdWx0IHw9IChwX29sZF9zbGljZS0+ZnJhbWVfbnVtICE9IGN1cnJTbGljZS0+ZnJhbWVfbnVtKTsKKworCXJlc3VsdCB8PSAocF9vbGRfc2xpY2UtPmZpZWxkX3BpY19mbGFnICE9IGN1cnJTbGljZS0+ZmllbGRfcGljX2ZsYWcpOworCisJaWYgKGN1cnJTbGljZS0+ZmllbGRfcGljX2ZsYWcgJiYgcF9vbGRfc2xpY2UtPmZpZWxkX3BpY19mbGFnKSB7CisJCXJlc3VsdCB8PSAocF9vbGRfc2xpY2UtPmJvdHRvbV9maWVsZF9mbGFnICE9CisJCQkJY3VyclNsaWNlLT5ib3R0b21fZmllbGRfZmxhZyk7CisJfQorCisJcmVzdWx0IHw9IChwX29sZF9zbGljZS0+bmFsX3JlZl9pZGMgIT0KKwkJCWN1cnJTbGljZS0+bmFsX3JlZmVyZW5jZV9pZGMpICYmCisJCSAgKChwX29sZF9zbGljZS0+bmFsX3JlZl9pZGMgPT0gMCkgfHwKKwkJCShjdXJyU2xpY2UtPm5hbF9yZWZlcmVuY2VfaWRjID09IDApKTsKKwlyZXN1bHQgfD0gKHBfb2xkX3NsaWNlLT5pZHJfZmxhZyAgICAhPSBjdXJyU2xpY2UtPmlkcl9mbGFnKTsKKworCWlmIChjdXJyU2xpY2UtPmlkcl9mbGFnICYmIHBfb2xkX3NsaWNlLT5pZHJfZmxhZykKKwkJcmVzdWx0IHw9IChwX29sZF9zbGljZS0+aWRyX3BpY19pZCAhPSBjdXJyU2xpY2UtPmlkcl9waWNfaWQpOworCisJaWYgKHBfVmlkLT5hY3RpdmVfc3BzLT5waWNfb3JkZXJfY250X3R5cGUgPT0gMCkgeworCQlyZXN1bHQgfD0gKHBfb2xkX3NsaWNlLT5waWNfb2Rlcl9jbnRfbHNiICE9CisJCQkgICBjdXJyU2xpY2UtPnBpY19vcmRlcl9jbnRfbHNiKTsKKwkJaWYgKHBfVmlkLT5hY3RpdmVfcHBzLT4KKwkJCWJvdHRvbV9maWVsZF9waWNfb3JkZXJfaW5fZnJhbWVfcHJlc2VudF9mbGFnICA9PSAgMSAmJgorCQkgICAgIWN1cnJTbGljZS0+ZmllbGRfcGljX2ZsYWcpIHsKKwkJCXJlc3VsdCB8PSAocF9vbGRfc2xpY2UtPmRlbHRhX3BpY19vZGVyX2NudF9ib3R0b20gIT0KKwkJCQkgICBjdXJyU2xpY2UtPmRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tKTsKKwkJfQorCX0KKworCWlmIChwX1ZpZC0+YWN0aXZlX3Nwcy0+cGljX29yZGVyX2NudF90eXBlID09IDEpIHsKKwkJaWYgKCFwX1ZpZC0+YWN0aXZlX3Nwcy0+ZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcpIHsKKwkJCXJlc3VsdCB8PSAocF9vbGRfc2xpY2UtPmRlbHRhX3BpY19vcmRlcl9jbnRbMF0gIT0KKwkJCQkgICBjdXJyU2xpY2UtPmRlbHRhX3BpY19vcmRlcl9jbnRbMF0pOworCQkJaWYgKHBfVmlkLT5hY3RpdmVfcHBzLT4KKwkJCWJvdHRvbV9maWVsZF9waWNfb3JkZXJfaW5fZnJhbWVfcHJlc2VudF9mbGFnICA9PSAgMSAmJgorCQkJICAgICFjdXJyU2xpY2UtPmZpZWxkX3BpY19mbGFnKSB7CisJCQkJcmVzdWx0IHw9IChwX29sZF9zbGljZS0+CisJCQkJCWRlbHRhX3BpY19vcmRlcl9jbnRbMV0gIT0KKwkJCQkJY3VyclNsaWNlLT5kZWx0YV9waWNfb3JkZXJfY250WzFdKTsKKwkJCX0KKwkJfQorCX0KKworI2lmIChNVkNfRVhURU5TSU9OX0VOQUJMRSkKKwlyZXN1bHQgfD0gKGN1cnJTbGljZS0+dmlld19pZCAhPSBwX29sZF9zbGljZS0+dmlld19pZCk7CisJcmVzdWx0IHw9IChjdXJyU2xpY2UtPmludGVyX3ZpZXdfZmxhZyAhPSBwX29sZF9zbGljZS0+aW50ZXJfdmlld19mbGFnKTsKKwlyZXN1bHQgfD0gKGN1cnJTbGljZS0+YW5jaG9yX3BpY19mbGFnICE9IHBfb2xkX3NsaWNlLT5hbmNob3JfcGljX2ZsYWcpOworI2VuZGlmCisJcmVzdWx0IHw9IChjdXJyU2xpY2UtPmxheWVyX2lkICE9IHBfb2xkX3NsaWNlLT5sYXllcl9pZCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKyNlbHNlCitpbnQgaXNfbmV3X3BpY3R1cmUoc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqZGVjX3BpY3R1cmUsCisJCSAgIHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLAorCQkgICBzdHJ1Y3QgT2xkU2xpY2VQYXJhbXMgKnBfb2xkX3NsaWNlKQoreworCWludCByZXQgPSAwOworCisJaWYgKHBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbRklSU1RfTUJfSU5fU0xJQ0VdID09IDApCisJCXJldCA9IDE7CisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmCisKKy8qCisqIHJlbGVhc2UgYnVmc3BlYyBhbmQgcGljIGZvciBwaWN0dXJlIG5vdCBpbiBkcGIgYnVmCisqLworaW50IHJlbGVhc2VfcGljdHVyZShzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiwKKwkJICAgc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqcGljKQoreworCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIgPSAmcF9IMjY0X0RwYi0+bURQQjsKKworCWlmIChwX0RwYi0+bGFzdF9waWN0dXJlID09IE5VTEwpIHsKKwkJaWYgKHBpYy0+Y29sb2NhdGVkX2J1Zl9pbmRleCA+PSAwKSB7CisJCQlyZWxlYXNlX2NvbG9jYXRlX2J1ZihwX0gyNjRfRHBiLAorCQkJcGljLT5jb2xvY2F0ZWRfYnVmX2luZGV4KTsKKwkJCXBpYy0+Y29sb2NhdGVkX2J1Zl9pbmRleCA9IC0xOworCQl9CisJCXJlbGVhc2VfYnVmX3NwZWNfbnVtKHBfSDI2NF9EcGItPnZkZWMsIHBpYy0+YnVmX3NwZWNfbnVtKTsKKwl9IGVsc2UgeworCQlpZiAocGljLT5idWZfc3BlY19pc19hbGxvY2VkID09IDEpCisJCQlyZWxlYXNlX2J1Zl9zcGVjX251bShwX0gyNjRfRHBiLT52ZGVjLAorCQkJCXBpYy0+YnVmX3NwZWNfbnVtKTsKKwl9CisKKwlmcmVlX3BpY3R1cmUocF9IMjY0X0RwYiwgcGljKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIEVSUk9SX0hBTkRMRV9URVNUCisvKgorKiAgcmVtb3ZlIGFsbCBwaWN0dXJlcyBpbiBkcGIgYW5kIHJlbGVhc2UgYnVmc3BlYy9waWMgb2YgdGhlbQorKi8KK3ZvaWQgcmVtb3ZlX2RwYl9waWN0dXJlcyhzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYikKK3sKKwkvKiBzdHJ1Y3QgVmlkZW9QYXJhbWV0ZXJzICpwX1ZpZCA9IHBfRHBiLT5wX1ZpZDsgKi8KKwlzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiID0gJnBfSDI2NF9EcGItPm1EUEI7CisJc3RydWN0IFNsaWNlICpjdXJyU2xpY2UgPSAmcF9IMjY0X0RwYi0+bVNsaWNlOworCXVuc2lnbmVkICBpLCBqOworCisJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoIXBfRHBiLT5pbml0X2RvbmUpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+dXNlZF9zaXplOyBpKyspIHsKKwkJaWYgKHBfRHBiLT5mc1tpXS0+Y29sb2NhdGVkX2J1Zl9pbmRleCA+PSAwKSB7CisJCQlkcGJfcHJpbnQocF9IMjY0X0RwYi0+ZGVjb2Rlcl9pbmRleCwKKwkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSJyZWxlYXNlX2NvbG9jYXRlX2J1ZlslZF0gZm9yIGZzWyVkXVxuIiwKKwkJCXBfRHBiLT5mc1tpXS0+Y29sb2NhdGVkX2J1Zl9pbmRleCwgaSk7CisKKwkJCXJlbGVhc2VfY29sb2NhdGVfYnVmKHBfSDI2NF9EcGIsCisJCQkJcF9EcGItPmZzW2ldLT5jb2xvY2F0ZWRfYnVmX2luZGV4KTsgLyogcmFpbiAqLworCQkJcF9EcGItPmZzW2ldLT5jb2xvY2F0ZWRfYnVmX2luZGV4ID0gLTE7CisJCX0KKwkJaWYgKCFwX0RwYi0+ZnNbaV0tPnByZV9vdXRwdXQpIHsKKwkJCXJlbGVhc2VfYnVmX3NwZWNfbnVtKHBfSDI2NF9EcGItPnZkZWMsCisJCQkJcF9EcGItPmZzW2ldLT5idWZfc3BlY19udW0pOworCQkJcF9EcGItPmZzW2ldLT5idWZfc3BlY19udW0gPSAtMTsKKwkJfQorCQlyZW1vdmVfZnJhbWVfZnJvbV9kcGIocF9IMjY0X0RwYiwgaSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHBfRHBiLT51c2VkX3NpemU7IGkrKykgeworCQlwX0RwYi0+ZnNfcmVmW2ldID0gTlVMTDsKKwkJcF9EcGItPmZzX2x0cmVmW2ldID0gTlVMTDsKKwkJcF9EcGItPmZzX2xpc3QwW2ldID0gTlVMTDsKKwkJcF9EcGItPmZzX2xpc3QxW2ldID0gTlVMTDsKKwkJcF9EcGItPmZzX2xpc3RsdFtpXSA9IE5VTEw7CisJfQorCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJY3VyclNsaWNlLT5saXN0WHNpemVbaV0gPSAwOworCQlmb3IgKGogPSAwOyBqIDwgKE1BWF9MSVNUX1NJWkUgKiAyKTsgaisrKQorCQkJY3VyclNsaWNlLT5saXN0WFtpXVtqXSA9IE5VTEw7CisJfQorCXBfRHBiLT5yZWZfZnJhbWVzX2luX2J1ZmZlciA9IDA7CisJcF9EcGItPmx0cmVmX2ZyYW1lc19pbl9idWZmZXIgPSAwOworCXBfRHBiLT5sYXN0X291dHB1dF9wb2MgPSBJTlRfTUlOOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGNoZWNrX2ZyYW1lX3N0b3JlX3NhbWVfcGljX251bShzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiLAorCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnAsIHN0cnVjdCBTbGljZSAqY3VyclNsaWNlKQoreworCWlmIChwX0RwYi0+bGFzdF9waWN0dXJlKSB7CisJCWlmICgoaW50KXBfRHBiLT5sYXN0X3BpY3R1cmUtPmZyYW1lX251bSA9PSBwLT5waWNfbnVtKSB7CisJCQlpZiAoKChwLT5zdHJ1Y3R1cmUgPT0gVE9QX0ZJRUxEKSAmJgorCQkJCShwX0RwYi0+bGFzdF9waWN0dXJlLT5pc191c2VkID09IDIpKSB8fAorCQkJICAgICgocC0+c3RydWN0dXJlID09IEJPVFRPTV9GSUVMRCkgJiYKKwkJCQkocF9EcGItPmxhc3RfcGljdHVyZS0+aXNfdXNlZCA9PSAxKSkpIHsKKwkJCQlpZiAoKHAtPnVzZWRfZm9yX3JlZmVyZW5jZSAmJgorCQkJCQkocF9EcGItPmxhc3RfcGljdHVyZS0+CisJCQkJCWlzX29yaWdfcmVmZXJlbmNlICE9IDApKSB8fAorCQkJCSAgICAoIXAtPnVzZWRfZm9yX3JlZmVyZW5jZSAmJgorCQkJCQkocF9EcGItPmxhc3RfcGljdHVyZS0+CisJCQkJCWlzX29yaWdfcmVmZXJlbmNlID09IDApKSkgeworCQkJCQlwLT5idWZfc3BlY19udW0gPQorCQkJCQkJcF9EcGItPmxhc3RfcGljdHVyZS0+CisJCQkJCQlidWZfc3BlY19udW07CisJCQkJCXAtPmJ1Zl9zcGVjX2lzX2FsbG9jZWQgPSAwOworCQkJCQlwLT5jb2xvY2F0ZWRfYnVmX2luZGV4ID0gcF9EcGItPgorCQkJCQkJbGFzdF9waWN0dXJlLT4KKwkJCQkJCWNvbG9jYXRlZF9idWZfaW5kZXg7CisJCQkJCWlmIChjdXJyU2xpY2UtPnN0cnVjdHVyZSA9PQorCQkJCQkJVE9QX0ZJRUxEKSB7CisJCQkJCQlwLT5ib3R0b21fcG9jID0KKwkJCQkJCQlwX0RwYi0+bGFzdF9waWN0dXJlLT4KKwkJCQkJCQlib3R0b21fZmllbGQtPnBvYzsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXAtPnRvcF9wb2MgPQorCQkJCQkJCXBfRHBiLT5sYXN0X3BpY3R1cmUtPgorCQkJCQkJCXRvcF9maWVsZC0+cG9jOworCQkJCQl9CisJCQkJCXAtPmZyYW1lX3BvYyA9IGltaW4ocC0+Ym90dG9tX3BvYywKKwkJCQkJCXAtPnRvcF9wb2MpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworaW50IGgyNjRfc2xpY2VfaGVhZGVyX3Byb2Nlc3Moc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIsIGludCAqZnJhbWVfbnVtX2dhcCkKK3sKKworCWludCBuZXdfcGljX2ZsYWcgPSAwOworCXN0cnVjdCBTbGljZSAqY3VyclNsaWNlID0gJnBfSDI2NF9EcGItPm1TbGljZTsKKwlzdHJ1Y3QgVmlkZW9QYXJhbWV0ZXJzICpwX1ZpZCA9ICZwX0gyNjRfRHBiLT5tVmlkZW87CisJc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYiA9CisJCQkJJnBfSDI2NF9EcGItPm1EUEI7CisjaWYgMAorCW5ld19waWNfZmxhZyA9IGlzX25ld19waWN0dXJlKHBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZSwKKwkJCQkgICAgICBwX0gyNjRfRHBiLAorCQkJCSAgICAgICZwX0gyNjRfRHBiLT5tVmlkZW8ub2xkX3NsaWNlKTsKKworCWlmIChuZXdfcGljX2ZsYWcpIHsgLyogbmV3IHBpY3R1cmUgKi8KKwkJaWYgKHBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZSkgeworCQkJc3RvcmVfcGljdHVyZV9pbl9kcGIocF9IMjY0X0RwYiwKKwkJCQlwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUpOworCQkJLyogZHVtcF9kcGIoJnBfSDI2NF9EcGItPm1EUEIpOyAqLworCQl9CisJfQorI2Vsc2UKKwluZXdfcGljX2ZsYWcgPSAocF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlID09IE5VTEwpOworI2VuZGlmCisJcF9IMjY0X0RwYi0+YnVmX2FsbG9jX2ZhaWwgPSAwOworCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnID0gMDsKKwlzbGljZV9wcmVwYXJlKHBfSDI2NF9EcGIsICZwX0gyNjRfRHBiLT5tRFBCLCAmcF9IMjY0X0RwYi0+bVZpZGVvLAorCQkgICAgICAmcF9IMjY0X0RwYi0+bVNQUywgJnBfSDI2NF9EcGItPm1TbGljZSk7CisKKwlpZiAocF9EcGItPm51bV9yZWZfZnJhbWVzICE9IHBfSDI2NF9EcGItPm1TUFMubnVtX3JlZl9mcmFtZXMpIHsKKwkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIDAsCisJCSJudW1fcmVmX2ZyYW1lcyBjaGFuZ2UgZnJvbSAlZCB0byAlZFxyXG4iLAorCQkJcF9EcGItPm51bV9yZWZfZnJhbWVzLCBwX0gyNjRfRHBiLT5tU1BTLm51bV9yZWZfZnJhbWVzKTsKKwkJcF9EcGItPm51bV9yZWZfZnJhbWVzID0gcF9IMjY0X0RwYi0+bVNQUy5udW1fcmVmX2ZyYW1lczsKKwl9CisJLyogaWYgKHBfVmlkLT5hY3RpdmVfc3BzICE9IHNwcykgeyAqLworCWlmIChwX0gyNjRfRHBiLT5tRFBCLmluaXRfZG9uZSA9PSAwKSB7CisJCS8qaW5pdF9nbG9iYWxfYnVmZmVycyhwX1ZpZCwgMCk7CisJCSAqCQkgKiogKiAqaWYgKCFwX1ZpZC0+bm9fb3V0cHV0X29mX3ByaW9yX3BpY3NfZmxhZykKKwkJICoqICogKnsKKwkJICoqICogKiAgICBmbHVzaF9kcGIocF9WaWQtPnBfRHBiX2xheWVyWzBdKTsKKwkJICoqICogKn0KKwkJICoqICogKmluaXRfZHBiKHBfVmlkLCBwX1ZpZC0+cF9EcGJfbGF5ZXJbMF0sIDApOworCQkgKi8KKwkJaW5pdF9kcGIocF9IMjY0X0RwYiwgMCk7CisJfQorCisKKwlpZiAobmV3X3BpY19mbGFnKSB7IC8qIG5ldyBwaWN0dXJlICovCisJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCSJjaGVjayBmcmFtZV9udW0gZ2FwOiBjdXIgZnJhbWVfbnVtICVkIHByZV9mcmFtZV9udW0gJWQgbWF4X2ZybWFlX251bSAlZFxyXG4iLAorCQljdXJyU2xpY2UtPmZyYW1lX251bSwKKwkJcF9WaWQtPnByZV9mcmFtZV9udW0sCisJCXBfVmlkLT5tYXhfZnJhbWVfbnVtKTsKKwkJaWYgKHBfVmlkLT5yZWNvdmVyeV9wb2ludCA9PSAwICYmCisJCQlwX1ZpZC0+bWF4X2ZyYW1lX251bSA8PSBGUkFNRV9OVU1fTUFYX1NJWkUgJiYKKwkJCWN1cnJTbGljZS0+ZnJhbWVfbnVtICE9IHBfVmlkLT5wcmVfZnJhbWVfbnVtICYmCisJCQljdXJyU2xpY2UtPmZyYW1lX251bSAhPQorCQkJKHBfVmlkLT5wcmVfZnJhbWVfbnVtICsgMSkgJSBwX1ZpZC0+bWF4X2ZyYW1lX251bSkgeworCQkJc3RydWN0IFNQU1BhcmFtZXRlcnMgKmFjdGl2ZV9zcHMgPSBwX1ZpZC0+YWN0aXZlX3NwczsKKwkJCS8qaWYgKGFjdGl2ZV9zcHMtPgorCQkJICpnYXBzX2luX2ZyYW1lX251bV92YWx1ZV9hbGxvd2VkX2ZsYWcKKwkJCSAqPT0gMCkgeworCQkJICogIGVycm9yKCJBbiB1bmludGVudGlvbmFsCisJCQkgKiAgbG9zcyBvZiBwaWN0dXJlcyBvY2N1cnMhIEV4aXRcbiIsCisJCQkgKiAgMTAwKTsKKwkJCSAqfQorCQkJICppZiAocF9WaWQtPmNvbmNlYWxfbW9kZSA9PSAwKQorCQkJICovCisJCQkgaWYgKGFjdGl2ZV9zcHMtPmZyYW1lX251bV9nYXBfYWxsb3dlZCkKKwkJCQlmaWxsX2ZyYW1lX251bV9nYXAocF9WaWQsIGN1cnJTbGljZSk7CisJCQkqZnJhbWVfbnVtX2dhcCA9IDE7CisJCX0KKworCQlpZiAoY3VyclNsaWNlLT5uYWxfcmVmZXJlbmNlX2lkYykgeworCQkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsCisJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJIm5hbF9yZWZlcmVuY2VfaWRjIG5vdCAwLCBzZXQgcHJlX2ZyYW1lX251bSglZCkgdG8gZnJhbWVfbnVtICglZClcbiIsCisJCQlwX1ZpZC0+cHJlX2ZyYW1lX251bSwgY3VyclNsaWNlLT5mcmFtZV9udW0pOworCQkJcF9WaWQtPnByZV9mcmFtZV9udW0gPSBjdXJyU2xpY2UtPmZyYW1lX251bTsKKwkJfQorCisJCWRlY29kZV9wb2MoJnBfSDI2NF9EcGItPm1WaWRlbywgJnBfSDI2NF9EcGItPm1TbGljZSk7CisJCXBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZSA9IGdldF9uZXdfcGljKHBfSDI2NF9EcGIsCisJCQkJCQkgcF9IMjY0X0RwYi0+bVNsaWNlLnN0cnVjdHVyZSwKKwkJCQkJCS8qcF9WaWQtPndpZHRoLCBwX1ZpZC0+aGVpZ2h0LAorCQkJCQkJICogIHBfVmlkLT53aWR0aF9jciwKKwkJCQkJCSAqICBwX1ZpZC0+aGVpZ2h0X2NyLAorCQkJCQkJICovCisJCQkJCQkgMSk7CisJCWlmIChwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUpIHsKKwkJCXUzMiBvZmZzZXRfbG8sIG9mZnNldF9oaTsKKwkJCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIgPQorCQkJCSZwX0gyNjRfRHBiLT5tRFBCOworCQkJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqcCA9CisJCQkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlOworCQkJaW5pdF9waWN0dXJlKHBfSDI2NF9EcGIsICZwX0gyNjRfRHBiLT5tU2xpY2UsCisJCQkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlKTsKKyNpZiAxCisJCQkvKiByYWluICovCisJCQlvZmZzZXRfbG8gID0KKwkJCXBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbT0ZGU0VUX0RFTElNSVRFUl9MT107CisJCQlvZmZzZXRfaGkgID0KKwkJCXBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbT0ZGU0VUX0RFTElNSVRFUl9ISV07CisJCQlwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPm9mZnNldF9kZWxpbWl0ZXIgPQorCQkJCShvZmZzZXRfbG8JfCBvZmZzZXRfaGkgPDwgMTYpOworCQkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlLT5idWZfc3BlY19udW0gID0gLTE7CisJCQlwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPgorCQkJCWNvbG9jYXRlZF9idWZfaW5kZXggPSAtMTsKKwkJCXVwZGF0ZV9waWNfbnVtKHBfSDI2NF9EcGIpOworCisJCQlpZiAoKGN1cnJTbGljZS0+c3RydWN0dXJlID09IFRPUF9GSUVMRCkgfHwKKwkJCSAgICAoY3VyclNsaWNlLT5zdHJ1Y3R1cmUgPT0gQk9UVE9NX0ZJRUxEKSkgeworCQkJCS8qIGNoZWNrIGZvciBmcmFtZSBzdG9yZSB3aXRoIHNhbWUKKwkJCQkgKiAgIHBpY19udW1iZXIKKwkJCQkgKi8KKwkJCQljaGVja19mcmFtZV9zdG9yZV9zYW1lX3BpY19udW0ocF9EcGIsIHAsCisJCQkJCWN1cnJTbGljZSk7CisJCQl9CisKKwkJCWlmIChwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPmJ1Zl9zcGVjX251bSA9PQorCQkJCS0xKSB7CisJCQkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlLT5idWZfc3BlY19udW0gPQorCQkJCQlnZXRfZnJlZV9idWZfaWR4KHBfSDI2NF9EcGItPnZkZWMpOworCQkJCWlmIChwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPmJ1Zl9zcGVjX251bQorCQkJCQk8IDApIHsKKwkJCQkJcF9IMjY0X0RwYi0+YnVmX2FsbG9jX2ZhaWwgPSAxOworCQkJCQlwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPgorCQkJCQkJYnVmX3NwZWNfaXNfYWxsb2NlZCA9IDA7CisJCQkJfSBlbHNlCisJCQkJCXBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZS0+CisJCQkJCQlidWZfc3BlY19pc19hbGxvY2VkID0gMTsKKworCQkJCWlmIChwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPgorCQkJCQl1c2VkX2Zvcl9yZWZlcmVuY2UpIHsKKwkJCQkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlLT4KKwkJCQkJCWNvbG9jYXRlZF9idWZfaW5kZXggPQorCQkJCQkJYWxsb2NhdGVfY29sb2NhdGVfYnVmKAorCQkJCQkJCXBfSDI2NF9EcGIpOworCQkJCX0KKwkJCX0KKyNlbmRpZgorCQkJaWYgKHBvc3RfcGljdHVyZV9lYXJseShwX0gyNjRfRHBiLT52ZGVjLAorCQkJCXBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZS0+YnVmX3NwZWNfbnVtKSkKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlpZiAocF9IMjY0X0RwYi0+YnVmX2FsbG9jX2ZhaWwpCisJCXJldHVybiAtMTsKKworCWlmIChwX0gyNjRfRHBiLT5tU2xpY2Uuc2xpY2VfdHlwZSA9PSBQX1NMSUNFKQorCQlpbml0X2xpc3RzX3Bfc2xpY2UoJnBfSDI2NF9EcGItPm1TbGljZSk7CisJZWxzZSBpZiAocF9IMjY0X0RwYi0+bVNsaWNlLnNsaWNlX3R5cGUgPT0gQl9TTElDRSkKKwkJaW5pdF9saXN0c19iX3NsaWNlKCZwX0gyNjRfRHBiLT5tU2xpY2UpOworCWVsc2UKKwkJaW5pdF9saXN0c19pX3NsaWNlKCZwX0gyNjRfRHBiLT5tU2xpY2UpOworCisJcmVvcmRlcl9saXN0cygmcF9IMjY0X0RwYi0+bVNsaWNlKTsKKworCWlmIChwX0gyNjRfRHBiLT5tU2xpY2Uuc3RydWN0dXJlID09IEZSQU1FKQorCQlpbml0X21iYWZmX2xpc3RzKHBfSDI2NF9EcGIsICZwX0gyNjRfRHBiLT5tU2xpY2UpOworCisJaWYgKG5ld19waWNfZmxhZykKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworZW51bSBQaWN0dXJlU3RydWN0dXJlIGdldF9jdXJfc2xpY2VfcGljdHVyZV9zdHJ1Y3QoCisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIpCit7CisJc3RydWN0IFNsaWNlICpjdXJyU2xpY2UgPSAmcF9IMjY0X0RwYi0+bVNsaWNlOworCXJldHVybiBjdXJyU2xpY2UtPnN0cnVjdHVyZTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgaXNfcGljX2luX2RwYihzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiwKKwlzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpwaWMpCit7CisJdW5zaWduZWQgY2hhciByZXQgPSAwOworCWludCBpOworCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIgPQorCQkJCSZwX0gyNjRfRHBiLT5tRFBCOworCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+dXNlZF9zaXplOyBpKyspIHsKKwkJaWYgKHBfRHBiLT5mc1tpXS0+dG9wX2ZpZWxkID09IHBpYyB8fAorCQkJcF9EcGItPmZzW2ldLT5ib3R0b21fZmllbGQgPT0gcGljIHx8CisJCQlwX0RwYi0+ZnNbaV0tPmZyYW1lID09IHBpYykgeworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK2ludCBkcGJfY2hlY2tfcmVmX2xpc3RfZXJyb3IoCisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIpCit7CisJaW50IGk7CisJLyppbnQgajsqLworCXN0cnVjdCBTbGljZSAqY3VyclNsaWNlID0gJnBfSDI2NF9EcGItPm1TbGljZTsKKwkvKiBpbiBmaXJzdCBvdXRwdXQsIGlnbm9yZSByZWYgY2hlY2sgKi8KKwlpZiAoKHBfSDI2NF9EcGItPmZpcnN0X2luc2VydF9mcmFtZSA9PSBGaXJzdEluc2VydEZybV9PVVQpICYmCisJCShwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUpICYmCisJCXBfSDI2NF9EcGItPmZpcnN0X291dHB1dF9wb2MgPiBwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPnBvYykgeworCisJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkicF9IMjY0X0RwYi0+Zmlyc3Rfb3V0cHV0X3BvYyAlZCwgcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlLT5wb2MgJWRcbiIsCisJCQlwX0gyNjRfRHBiLT5maXJzdF9vdXRwdXRfcG9jLCBwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPnBvYyk7CisJCXJldHVybiAwOworCX0KKwlpZiAoKGN1cnJTbGljZS0+c2xpY2VfdHlwZSAhPSBJX1NMSUNFKSAmJgorCQkoY3VyclNsaWNlLT5zbGljZV90eXBlICE9IFNJX1NMSUNFKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgY3VyclNsaWNlLT5saXN0WHNpemVbMF07IGkrKykgeworCQkJLypmb3IgKGogPSBpICsgMTsgaiA8IGN1cnJTbGljZS0+bGlzdFhzaXplWzBdOyBqKyspIHsKKwkJCQlpZihjdXJyU2xpY2UtPmxpc3RYWzBdW2ldLT5waWNfbnVtID09CisJCQkJCWN1cnJTbGljZS0+bGlzdFhbMF1bal0tPnBpY19udW0pCisJCQkJCXJldHVybiAxOworCQkJfSovCisJCQlpZiAoY3VyclNsaWNlLT5saXN0WFswXVtpXSA9PSBOVUxMKQorCQkJCXJldHVybiA1OworCQkJaWYgKCFpc19waWNfaW5fZHBiKHBfSDI2NF9EcGIsCisJCQkJY3VyclNsaWNlLT5saXN0WFswXVtpXSkpCisJCQkJcmV0dXJuIDE7CisJCQlpZiAoY3VyclNsaWNlLT5saXN0WFswXVtpXS0+ZnJhbWUgJiYKKwkJCQljdXJyU2xpY2UtPmxpc3RYWzBdW2ldLT5mcmFtZS0+bm9uX2V4aXN0aW5nKQorCQkJCXJldHVybiAzOworCQl9CisJfQorCisJaWYgKGN1cnJTbGljZS0+c2xpY2VfdHlwZSA9PSBCX1NMSUNFKSB7CisJCWZvciAoaSA9IDA7IGkgPCBjdXJyU2xpY2UtPmxpc3RYc2l6ZVsxXTsgaSsrKSB7CisJCQkvKmZvciAoaiA9IGkgKyAxOyBqIDwgY3VyclNsaWNlLT5saXN0WHNpemVbMV07IGorKykgeworCQkJCWlmKGN1cnJTbGljZS0+bGlzdFhbMV1baV0tPnBpY19udW0gPT0KKwkJCQkJY3VyclNsaWNlLT5saXN0WFsxXVtqXS0+cGljX251bSkKKwkJCQkJcmV0dXJuIDI7CisJCQl9CisJCQlmb3IgKGogPSAwOyBqIDwgY3VyclNsaWNlLT5saXN0WHNpemVbMF07IGorKykgeworCQkJCWlmKGN1cnJTbGljZS0+bGlzdFhbMV1baV0tPnBpY19udW0gPT0KKwkJCQkJY3VyclNsaWNlLT5saXN0WFswXVtqXS0+cGljX251bSkKKwkJCQkJcmV0dXJuIDM7CisJCQl9Ki8KKwkJCWlmIChjdXJyU2xpY2UtPmxpc3RYWzFdW2ldID09IE5VTEwpCisJCQkJcmV0dXJuIDY7CisJCQlpZiAoIWlzX3BpY19pbl9kcGIocF9IMjY0X0RwYiwKKwkJCQljdXJyU2xpY2UtPmxpc3RYWzFdW2ldKSkKKwkJCQlyZXR1cm4gMjsKKwkJCWlmIChjdXJyU2xpY2UtPmxpc3RYWzFdW2ldLT5mcmFtZSAmJgorCQkJCWN1cnJTbGljZS0+bGlzdFhbMV1baV0tPmZyYW1lLT5ub25fZXhpc3RpbmcpCisJCQkJcmV0dXJuIDQ7CisjaWYgMAorCQkJaWYgKGN1cnJTbGljZS0+bGlzdFhzaXplWzBdID09IDEgJiYKKwkJCQljdXJyU2xpY2UtPmxpc3RYc2l6ZVsxXSA9PSAxICYmCisJCQkJY3VyclNsaWNlLT5saXN0WFsxXVswXSA9PQorCQkJCWN1cnJTbGljZS0+bGlzdFhbMF1bMF0pCisJCQkJcmV0dXJuIDM7CisjZW5kaWYKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC9oMjY0X211bHRpL2gyNjRfZHBiLmggYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL2gyNjRfbXVsdGkvaDI2NF9kcGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWQxYWI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC9oMjY0X211bHRpL2gyNjRfZHBiLmgKQEAgLTAsMCArMSwxMDA4IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorKiBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqCisqIERlc2NyaXB0aW9uOgorKi8KKyNpZm5kZWYgSDI2NF9EUEJfSF8KKyNkZWZpbmUgSDI2NF9EUEJfSF8KKworI2RlZmluZSBFUlJPUl9DSEVDSworCisjZGVmaW5lIE9VVFBVVF9CVUZGRVJfSU5fQworCisjZGVmaW5lIFBSSU5UX0ZMQUdfRVJST1IgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBQUklOVF9GTEFHX1ZERUNfU1RBVFVTICAgICAgICAwWDAwMDEKKyNkZWZpbmUgUFJJTlRfRkxBR19VQ09ERV9FVlQgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFBSSU5UX0ZMQUdfTU1VX0RFVEFJTAkJMHgwMDA0CisjZGVmaW5lIFBSSU5UX0ZMQUdfRVJST1JGTEFHX0RCRwkweDAwMDgKKyNkZWZpbmUgUFJJTlRfRkxBR19EUEJfREVUQUlMICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCAgICAgICAgIDB4MDAyMAorI2RlZmluZSBQUklOVF9GTEFHX1ZERUNfREVUQUlMICAgICAgICAweDAwNDAKKyNkZWZpbmUgUFJJTlRfRkxBR19EVU1QX0RQQiAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFBSSU5UX0ZSQU1FQkFTRV9EQVRBICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBQUklOVF9GTEFHX0RFQlVHX1BPQyAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgUlJJTlRfRkxBR19SUE0gICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIERFQlVHX0RJU0FCTEVfUlVOUkVBRFlfUk1CVUYgIDB4MDgwMAorI2RlZmluZSBQUklOVF9GTEFHX0RVTVBfQlVGU1BFQyAgICAgICAweDEwMDAKKyNkZWZpbmUgUFJJTlRfRkxBR19GQ0NfU1RBVFVTICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFBSSU5UX0ZMQUdfU0VJX0RFVEFJTCAgICAgICAgIDB4NDAwMAorI2RlZmluZSBQUklOVF9GTEFHX1Y0TF9ERVRBSUwgICAgICAgICAweDgwMDAKKyNkZWZpbmUgRElTQUJMRV9FUlJPUl9IQU5ETEUgICAgICAgICAgMHgxMDAwMAorI2RlZmluZSBERUJVR19EVU1QX1NUQVQgICAgICAgICAgICAgICAweDgwMDAwCisjZGVmaW5lIERFQlVHX1RJTUVPVVRfREVDX1NUQVQgICAgICAgIDB4ODAwMDAwCisKKy8qc2V0dGluZyBjYW52YXMgbW9kZSBhbmQgZW5kaWFuLgorICBpZiB0aGlzIGZsYWcgaXMgc2V0LCB2YWx1ZSBvZiBjYW52YXMgbW9kZQorICB3aWxsIGFjY29yZGluZyB0byB0aGUgdmFsdWUgb2YgbWVtX21hcF9tb2RlLgorICBlbmRpYW4gd2lsbCBiZSBmb3JjZWQgc2V0IHRvIDAgaW4KKyAgQ0FOVkFTX0JMS01PREVfTElORUFSIG1vZGUuCisgIG90aGVyd2lzZSBwaWN0dXJlIHdpbGwgZGlzcGxheSBhYm5vcm1hbC4KKyAgaWYgdGhpcyBmbGFnIGlzIG5vdCBzZXQsIHZhbHVlIG9mIGNhbnZhcyBtb2RlCisgIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgdXNlciBzcGVhY2UgY29uZmlnLgorICBlbmRpYW4gd2lsbCBiZSBzZXQgNyBpbiBDQU5WQVNfQkxLTU9ERV9MSU5FQVIgbW9kZS4KKyovCisjZGVmaW5lIElHTk9SRV9QQVJBTV9GUk9NX0NPTkZJRyAgICAgIDB4ODAwMDAwMAorCisjZGVmaW5lIE1WQ19FWFRFTlNJT05fRU5BQkxFIDAKKyNkZWZpbmUgUFJJTlRSRUZMSVNUICAwCisKKyNkZWZpbmUgTUFYX0xJU1RfU0laRSAzMworCisjZGVmaW5lIEgyNjRfT1VUUFVUX01PREVfTk9STUFMIDB4NAorI2RlZmluZSBIMjY0X09VVFBVVF9NT0RFX0ZBU1QgICAweDgKKworLy8jZGVmaW5lIEZBTFNFIDAKKworI2RlZmluZSBIMjY0X1NMSUNFX0hFQURfRE9ORSAgICAgICAgIDB4MDEKKyNkZWZpbmUgSDI2NF9QSUNfREFUQV9ET05FICAgICAgICAgIDB4MDIKKy8qI2RlZmluZSBIMjY0X1NQU19ET05FICAgICAgICAgICAgICAgMHgwMyovCisvKiNkZWZpbmUgSDI2NF9QUFNfRE9ORSAgICAgICAgICAgICAgIDB4MDQqLworLyojZGVmaW5lIEgyNjRfU0xJQ0VfREFUQV9ET05FICAgICAgICAweDA1Ki8KKy8qI2RlZmluZSBIMjY0X0RBVEFfRU5EICAgICAgICAgICAgICAgMHgwNiovCisKKyNkZWZpbmUgSDI2NF9DT05GSUdfUkVRVUVTVCAgICAgICAgIDB4MTEKKyNkZWZpbmUgSDI2NF9EQVRBX1JFUVVFU1QgICAgICAgICAgIDB4MTIKKyNkZWZpbmUgSDI2NF9XUlJTUF9SRVFVRVNUICAgICAgICAgIDB4MTMKKyNkZWZpbmUgSDI2NF9XUlJTUF9ET05FICAgICAgICAgICAgIDB4MTQKKworI2RlZmluZSBIMjY0X0RFQ09ERV9CVUZFTVBUWSAgICAgICAgMHgyMAorI2RlZmluZSBIMjY0X0RFQ09ERV9USU1FT1VUICAgICAgICAgMHgyMQorI2RlZmluZSBIMjY0X1NFQVJDSF9CVUZFTVBUWSAgICAgICAgMHgyMgorI2RlZmluZSBIMjY0X0RFQ09ERV9PVkVSX1NJWkUgICAgICAgMHgyMworCisjZGVmaW5lIFZJREVPX1NJR05BTF9MT1cJCQkJCQkweDI2CisjZGVmaW5lIFZJREVPX1NJR05BTF9ISUdIVAkJCQkJCTB4MjcKKworCisjZGVmaW5lIEgyNjRfRklORF9ORVhUX1BJQ19OQUwgICAgICAgICAgICAgIDB4NTAKKyNkZWZpbmUgSDI2NF9GSU5EX05FWFRfRFZFTF9OQUwgICAgICAgICAgICAgMHg1MQorI2RlZmluZSBIMjY0X0FVWF9EQVRBX1JFQURZCQkJCQkweDUyCisKKyNkZWZpbmUgSDI2NF9TRUlfREFUQV9SRUFEWQkJCQkJMHg1MworI2RlZmluZSBIMjY0X1NFSV9EQVRBX0RPTkUJCQkJCTB4NTQKKworICAgIC8qIDB4OHgsIHNlYXJjaCBzdGF0ZSovCisjZGVmaW5lIEgyNjRfU1RBVEVfU0VBUkNIX0FGVEVSX1NQUyAgMHg4MAorI2RlZmluZSBIMjY0X1NUQVRFX1NFQVJDSF9BRlRFUl9QUFMgIDB4ODEKKyNkZWZpbmUgSDI2NF9TVEFURV9QQVJTRV9TTElDRV9IRUFEICAweDgyCisjZGVmaW5lIEgyNjRfU1RBVEVfU0VBUkNIX0hFQUQgICAgICAgMHg4MworICAvKiovCisjZGVmaW5lIEgyNjRfQUNUSU9OX1NFQVJDSF9IRUFEICAgICAweGYwCisjZGVmaW5lIEgyNjRfQUNUSU9OX0RFQ09ERV9TTElDRSAgICAweGYxCisjZGVmaW5lIEgyNjRfQUNUSU9OX0NPTkZJR19ET05FICAgICAweGYyCisjZGVmaW5lIEgyNjRfQUNUSU9OX0RFQ09ERV9ORVdQSUMgICAweGYzCisjZGVmaW5lIEgyNjRfQUNUSU9OX0RFQ09ERV9TVEFSVCAgICAweGZmCisKKyNkZWZpbmUgUlBNX0JFR0lOCQkJMHgwCisjZGVmaW5lIFJQTV9FTkQJCQkJMHg0MDAKKworI2RlZmluZSB2YWwocykgKHNbMF18KHNbMV08PDE2KSkKKworI2RlZmluZSBGUkFNRV9JTl9EUEIJMjQKKyNkZWZpbmUgRFBCX09GRlNFVAkJMHgxMDAKKyNkZWZpbmUgTU1DT19PRkZTRVQJCTB4MjAwCit1bmlvbiBwYXJhbSB7CisjaWYgMAorI2RlZmluZSBIX1RJTUVfU1RBTVBfU1RBUlQJMFgwMAorI2RlZmluZSBIX1RJTUVfU1RBTVBfRU5ECTBYMTcKKyNkZWZpbmUgUFRTX1pFUk9fMAkJMFgxOAorI2RlZmluZSBQVFNfWkVST18xCQkwWDE5CisjZW5kaWYKKyNkZWZpbmUgRklYRURfRlJBTUVfUkFURV9GTEFHICAgICAgICAgICAgICAgICAgIDBYMjEKKworI2RlZmluZSBPRkZTRVRfREVMSU1JVEVSX0xPICAgICAgICAgICAgICAgICAgICAgMHgyZgorI2RlZmluZSBPRkZTRVRfREVMSU1JVEVSX0hJICAgICAgICAgICAgICAgICAgICAgMHgzMAorCisKKyNkZWZpbmUgU0xJQ0VfSVBPTkxZX0JSRUFLCQkJCQkJMFg1QworI2RlZmluZSBQUkVWX01BWF9SRUZFUkVOQ0VfRlJBTUVfTlVNCQkJCQkwWDVECisjZGVmaW5lIEVPUwkJCQkJCQkJMFg1RQorI2RlZmluZSBGUkFNRV9QQUNLSU5HX1RZUEUJCQkJCQkwWDVGCisjZGVmaW5lIE9MRF9QT0NfUEFSXzEJCQkJCQkJMFg2MAorI2RlZmluZSBPTERfUE9DX1BBUl8yCQkJCQkJCTBYNjEKKyNkZWZpbmUgUFJFVl9NQlgJCQkJCQkJMFg2MgorI2RlZmluZSBQUkVWX01CWQkJCQkJCQkwWDYzCisjZGVmaW5lIEVSUk9SX1NLSVBfTUJfTlVNCQkJCQkJMFg2NAorI2RlZmluZSBFUlJPUl9NQl9TVEFUVVMJCQkJCQkJMFg2NQorI2RlZmluZSBMMF9QSUMwX1NUQVRVUwkJCQkJCQkwWDY2CisjZGVmaW5lIFRJTUVPVVRfQ09VTlRFUgkJCQkJCQkwWDY3CisjZGVmaW5lIEJVRkZFUl9TSVpFCQkJCQkJCTBYNjgKKyNkZWZpbmUgQlVGRkVSX1NJWkVfSEkJCQkJCQkJMFg2OQorI2RlZmluZSBDUk9QUElOR19MRUZUX1JJR0hUCQkJCQkJMFg2QQorI2RlZmluZSBDUk9QUElOR19UT1BfQk9UVE9NCQkJCQkJMFg2QgorI2lmIDEKKyAvKiBzcHNfZmxhZ3MyOgorICpiaXQgMywgYml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcKKyAqYml0IDIsIHBpY19zdHJ1Y3RfcHJlc2VudF9mbGFnCisgKmJpdCAxLCB2Y2xfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnCisgKmJpdCAwLCBuYWxfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnCisgKi8KKyNkZWZpbmUgU1BTX0ZMQUdTMgkJCQkJCTB4NmMKKyNkZWZpbmUgTlVNX1JFT1JERVJfRlJBTUVTCQkJCTB4NmQKKyNlbHNlCisjZGVmaW5lIFBPQ19TRUxFQ1RfTkVFRF9TV0FQCQkJCQkJMFg2QworI2RlZmluZSBQT0NfU0VMRUNUX1NXQVAJCQkJCQkJMFg2RAorI2VuZGlmCisjZGVmaW5lIE1BWF9CVUZGRVJfRlJBTUUJCQkJCQkwWDZFCisKKyNkZWZpbmUgTk9OX0NPTkZPUk1JTkdfU1RSRUFNCQkJCQkJMFg3MAorI2RlZmluZSBSRUNPVkVSWV9QT0lOVAkJCQkJCQkwWDcxCisjZGVmaW5lIFBPU1RfQ0FOVkFTCQkJCQkJCTBYNzIKKyNkZWZpbmUgUE9TVF9DQU5WQVNfSAkJCQkJCQkwWDczCisjZGVmaW5lIFNLSVBfUElDX0NPVU5UCQkJCQkJCTBYNzQKKyNkZWZpbmUgVEFSR0VUX05VTV9TQ0FMSU5HX0xJU1QJCQkJCQkwWDc1CisjZGVmaW5lIEZGX1BPU1RfT05FX0ZSQU1FCQkJCQkJMFg3NgorI2RlZmluZSBQUkVWSU9VU19CSVRfQ05UCQkJCQkJMFg3NworI2RlZmluZSBNQl9OT1RfU0hJRlRfQ09VTlQJCQkJCQkwWDc4CisjZGVmaW5lIFBJQ19TVEFUVVMJCQkJCQkJMFg3OQorI2RlZmluZSBGUkFNRV9DT1VOVEVSCQkJCQkJCTBYN0EKKyNkZWZpbmUgTkVXX1NMSUNFX1RZUEUJCQkJCQkJMFg3QgorI2RlZmluZSBORVdfUElDVFVSRV9TVFJVQ1RVUkUJCQkJCQkwWDdDCisjZGVmaW5lIE5FV19GUkFNRV9OVU0JCQkJCQkJMFg3RAorI2RlZmluZSBORVdfSURSX1BJQ19JRAkJCQkJCQkwWDdFCisjZGVmaW5lIElEUl9QSUNfSUQJCQkJCQkJMFg3RgorCisvKiBoMjY0IExPQ0FMICovCisjZGVmaW5lIE5BTF9VTklUX1RZUEUJCQkJCQkJMFg4MAorI2RlZmluZSBOQUxfUkVGX0lEQwkJCQkJCQkwWDgxCisjZGVmaW5lIFNMSUNFX1RZUEUJCQkJCQkJMFg4MgorI2RlZmluZSBMT0cyX01BWF9GUkFNRV9OVU0JCQkJCQkwWDgzCisjZGVmaW5lIEZSQU1FX01CU19PTkxZX0ZMQUcJCQkJCQkwWDg0CisjZGVmaW5lIFBJQ19PUkRFUl9DTlRfVFlQRQkJCQkJCTBYODUKKyNkZWZpbmUgTE9HMl9NQVhfUElDX09SREVSX0NOVF9MU0IJCQkJCTBYODYKKyNkZWZpbmUgUElDX09SREVSX1BSRVNFTlRfRkxBRwkJCQkJCTBYODcKKyNkZWZpbmUgUkVEVU5EQU5UX1BJQ19DTlRfUFJFU0VOVF9GTEFHCQkJCQkwWDg4CisjZGVmaW5lIFBJQ19JTklUX1FQX01JTlVTMjYJCQkJCQkwWDg5CisjZGVmaW5lIERFQkxPQ0tJTkdfRklMVEVSX0NPTlRST0xfUFJFU0VOVF9GTEFHCQkJCTBYOEEKKyNkZWZpbmUgTlVNX1NMSUNFX0dST1VQU19NSU5VUzEJCQkJCQkwWDhCCisjZGVmaW5lIE1PREVfOFg4X0ZMQUdTCQkJCQkJCTBYOEMKKyNkZWZpbmUgRU5UUk9QWV9DT0RJTkdfTU9ERV9GTEFHCQkJCQkwWDhECisjZGVmaW5lIFNMSUNFX1FVQU5UCQkJCQkJCTBYOEUKKyNkZWZpbmUgVE9UQUxfTUJfSEVJR0hUCQkJCQkJCTBYOEYKKyNkZWZpbmUgUElDVFVSRV9TVFJVQ1RVUkUJCQkJCQkwWDkwCisjZGVmaW5lIFRPUF9JTlRSQV9UWVBFCQkJCQkJCTBYOTEKKyNkZWZpbmUgUlZfQUlfU1RBVFVTCQkJCQkJCTBYOTIKKyNkZWZpbmUgQUlfUkVBRF9TVEFSVAkJCQkJCQkwWDkzCisjZGVmaW5lIEFJX1dSSVRFX1NUQVJUCQkJCQkJCTBYOTQKKyNkZWZpbmUgQUlfQ1VSX0JVRkZFUgkJCQkJCQkwWDk1CisjZGVmaW5lIEFJX0RNQV9CVUZGRVIJCQkJCQkJMFg5NgorI2RlZmluZSBBSV9SRUFEX09GRlNFVAkJCQkJCQkwWDk3CisjZGVmaW5lIEFJX1dSSVRFX09GRlNFVAkJCQkJCQkwWDk4CisjZGVmaW5lIEFJX1dSSVRFX09GRlNFVF9TQVZFCQkJCQkJMFg5OQorI2RlZmluZSBSVl9BSV9CVUZGX1NUQVJUCQkJCQkJMFg5QQorI2RlZmluZSBJX1BJQ19NQl9DT1VOVAkJCQkJCQkwWDlCCisjZGVmaW5lIEFJX1dSX0RDQUNfRE1BX0NUUkwJCQkJCQkwWDlDCisjZGVmaW5lIFNMSUNFX01CX0NPVU5UCQkJCQkJCTBYOUQKKyNkZWZpbmUgUElDVFlQRQkJCQkJCQkJMFg5RQorI2RlZmluZSBTTElDRV9HUk9VUF9NQVBfVFlQRQkJCQkJCTBYOUYKKyNkZWZpbmUgTUJfVFlQRQkJCQkJCQkJMFhBMAorI2RlZmluZSBNQl9BRkZfQURERURfRE1BCQkJCQkJMFhBMQorI2RlZmluZSBQUkVWSU9VU19NQl9UWVBFCQkJCQkJMFhBMgorI2RlZmluZSBXRUlHSFRFRF9QUkVEX0ZMQUcJCQkJCQkwWEEzCisjZGVmaW5lIFdFSUdIVEVEX0JJUFJFRF9JREMJCQkJCQkwWEE0CisvKiBiaXQgMzoyIC0gUElDVFVSRV9TVFJVQ1RVUkUKKyAqIGJpdCAxIC0gTUJfQURBUFRJVkVfRlJBTUVfRklFTERfRkxBRworICogYml0IDAgLSBGUkFNRV9NQlNfT05MWV9GTEFHCisgKi8KKyNkZWZpbmUgTUJGRl9JTkZPCQkJCQkJCTBYQTUKKyNkZWZpbmUgVE9QX0lOVFJBX1RZUEVfVE9QCQkJCQkJMFhBNgorCisjZGVmaW5lIFJWX0FJX0JVRkZfSU5DCQkJCQkJCTB4YTcKKworI2RlZmluZSBERUZBVUxUX01CX0lORk9fTE8JCQkJCQkweGE4CisKKy8qIDAgLS0gbm8gbmVlZCB0byByZWFkCisgKiAxIC0tIG5lZWQgdG8gd2FpdCBMZWZ0CisgKiAyIC0tIG5lZWQgdG8gcmVhZCBJbnRyYQorICogMyAtLSBuZWVkIHRvIHJlYWQgYmFjayBNVgorICovCisjZGVmaW5lIE5FRURfUkVBRF9UT1BfSU5GTwkJCQkJCTB4YTkKKy8qIDAgLS0gaWRsZQorICogMSAtLSB3YWl0IExlZnQKKyAqIDIgLS0gcmVhZGluZyB0b3AgSW50cmEKKyAqIDMgLS0gcmVhZGluZyBiYWNrIE1WCisgKi8KKyNkZWZpbmUgUkVBRF9UT1BfSU5GT19TVEFURQkJCQkJCTB4YWEKKyNkZWZpbmUgRENBQ19NQlgJCQkJCQkJMHhhYgorI2RlZmluZSBUT1BfTUJfSU5GT19PRkZTRVQJCQkJCQkweGFjCisjZGVmaW5lIFRPUF9NQl9JTkZPX1JEX0lEWAkJCQkJCTB4YWQKKyNkZWZpbmUgVE9QX01CX0lORk9fV1JfSURYCQkJCQkJMHhhZQorCisjZGVmaW5lIFZMRF9OT19XQUlUICAgICAwCisjZGVmaW5lIFZMRF9XQUlUX0JVRkZFUiAxCisjZGVmaW5lIFZMRF9XQUlUX0hPU1QgICAyCisjZGVmaW5lIFZMRF9XQUlUX0dBUAkzCisKKyNkZWZpbmUgVkxEX1dBSVRJTkcJCQkJCQkJMHhhZgorCisjZGVmaW5lIE1CX1hfTlVNCQkJCQkJCTB4YjAKKy8qICNkZWZpbmUgTUJfV0lEVEgJCQkJCQkJMHhiMSAqLworI2RlZmluZSBNQl9IRUlHSFQJCQkJCQkJMHhiMgorI2RlZmluZSBNQlgJCQkJCQkJCTB4YjMKKyNkZWZpbmUgVE9UQUxfTUJZCQkJCQkJCTB4YjQKKyNkZWZpbmUgSU5UUl9NU0tfU0FWRQkJCQkJCQkweGI1CisKKy8qICNkZWZpbmUgaGFzX3RpbWVfc3RhbXAJCQkJCQkweGI2ICovCisjZGVmaW5lIE5FRURfRElTQUJMRV9QUEUJCQkJCQkweGI2CisjZGVmaW5lIElTX05FV19QSUNUVVJFCQkJCQkJCTBYQjcKKyNkZWZpbmUgUFJFVl9OQUxfUkVGX0lEQwkJCQkJCTBYQjgKKyNkZWZpbmUgUFJFVl9OQUxfVU5JVF9UWVBFCQkJCQkJMFhCOQorI2RlZmluZSBGUkFNRV9NQl9DT1VOVAkJCQkJCQkwWEJBCisjZGVmaW5lIFNMSUNFX0dST1VQX1VDT0RFCQkJCQkJMFhCQgorI2RlZmluZSBTTElDRV9HUk9VUF9DSEFOR0VfUkFURQkJCQkJCTBYQkMKKyNkZWZpbmUgU0xJQ0VfR1JPVVBfQ0hBTkdFX0NZQ0xFX0xFTgkJCQkJMFhCRAorI2RlZmluZSBERUxBWV9MRU5HVEgJCQkJCQkJMFhCRQorI2RlZmluZSBQSUNUVVJFX1NUUlVDVAkJCQkJCQkwWEJGCisvKiAjZGVmaW5lIHByZV9waWN0dXJlX3N0cnVjdAkJCQkJCTB4YzAgKi8KKyNkZWZpbmUgRENBQ19QUkVWSU9VU19NQl9UWVBFCQkJCQkJMHhjMQorCisjZGVmaW5lIFRJTUVfU1RBTVAJCQkJCQkJMFhDMgorI2RlZmluZSBIX1RJTUVfU1RBTVAJCQkJCQkJMFhDMworI2RlZmluZSBWUFRTX01BUF9BRERSCQkJCQkJCTBYQzQKKyNkZWZpbmUgSF9WUFRTX01BUF9BRERSCQkJCQkJCTBYQzUKKworLyojZGVmaW5lIE1BWF9EUEJfU0laRQkJCQkJCQkwWEM2Ki8KKyNkZWZpbmUgUElDX0lOU0VSVF9GTEFHCQkJCQkJCTBYQzcKKworI2RlZmluZSBUSU1FX1NUQU1QX1NUQVJUCQkJCQkJMFhDOAorI2RlZmluZSBUSU1FX1NUQU1QX0VORAkJCQkJCQkwWERGCisKKyNkZWZpbmUgT0ZGU0VUX0ZPUl9OT05fUkVGX1BJQwkJCQkJCTBYRTAKKyNkZWZpbmUgT0ZGU0VUX0ZPUl9UT1BfVE9fQk9UVE9NX0ZJRUxECQkJCQkwWEUyCisjZGVmaW5lIE1BWF9SRUZFUkVOQ0VfRlJBTUVfTlVNCQkJCQkJMFhFNAorI2RlZmluZSBGUkFNRV9OVU1fR0FQX0FMTE9XRUQJCQkJCQkwWEU1CisjZGVmaW5lIE5VTV9SRUZfRlJBTUVTX0lOX1BJQ19PUkRFUl9DTlRfQ1lDTEUJCQkJMFhFNgorI2RlZmluZSBQUk9GSUxFX0lEQ19NTUNPCQkJCQkJMFhFNworI2RlZmluZSBMRVZFTF9JRENfTU1DTwkJCQkJCQkwWEU4CisjZGVmaW5lIEZSQU1FX1NJWkVfSU5fTUIJCQkJCQkwWEU5CisjZGVmaW5lIERFTFRBX1BJQ19PUkRFUl9BTFdBWVNfWkVST19GTEFHCQkJCTBYRUEKKyNkZWZpbmUgUFBTX05VTV9SRUZfSURYX0wwX0FDVElWRV9NSU5VUzEJCQkJMFhFQgorI2RlZmluZSBQUFNfTlVNX1JFRl9JRFhfTDFfQUNUSVZFX01JTlVTMQkJCQkwWEVDCisjZGVmaW5lIENVUlJFTlRfU1BTX0lECQkJCQkJCTBYRUQKKyNkZWZpbmUgQ1VSUkVOVF9QUFNfSUQJCQkJCQkJMFhFRQorLyogYml0IDAgLSBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IG1heSBjaGFuZ2UKKyAqIGJpdCAxIC0gcGljdHVyZSBwYXJhbWV0ZXIgc2V0IG1heSBjaGFuZ2UKKyAqIGJpdCAyIC0gbmV3IGRwYiBqdXN0IGluaXRlZAorICogYml0IDMgLSBJRFIgcGljdHVyZSBub3QgZGVjb2RlZCB5ZXQKKyAqIGJpdCA1OjQgLSAwOiBtYiBsZXZlbCBjb2RlIGxvYWRlZCAxOiBwaWN0dXJlCisgKiBsZXZlbCBjb2RlIGxvYWRlZCAyOiBzbGljZSBsZXZlbCBjb2RlIGxvYWRlZAorICovCisjZGVmaW5lIERFQ09ERV9TVEFUVVMJCQkJCQkJMFhFRgorI2RlZmluZSBGSVJTVF9NQl9JTl9TTElDRQkJCQkJCTBYRjAKKyNkZWZpbmUgUFJFVl9NQl9XSURUSAkJCQkJCQkwWEYxCisjZGVmaW5lIFBSRVZfRlJBTUVfU0laRV9JTl9NQgkJCQkJCTBYRjIKKy8qI2RlZmluZSBNQVhfUkVGRVJFTkNFX0ZSQU1FX05VTV9JTl9NRU0JCTBYRjMqLworLyogYml0IDAgLSBhc3BlY3RfcmF0aW9faW5mb19wcmVzZW50X2ZsYWcKKyAqIGJpdCAxIC0gdGltaW5nX2luZm9fcHJlc2VudF9mbGFnCisgKiBiaXQgMiAtIG5hbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcKKyAqIGJpdCAzIC0gdmNsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZworICogYml0IDQgLSBwaWNfc3RydWN0X3ByZXNlbnRfZmxhZworICogYml0IDUgLSBiaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZworICovCisjZGVmaW5lIFZVSV9TVEFUVVMJCQkJCQkJMFhGNAorI2RlZmluZSBBU1BFQ1RfUkFUSU9fSURDCQkJCQkJMFhGNQorI2RlZmluZSBBU1BFQ1RfUkFUSU9fU0FSX1dJRFRICQkJCQkJMFhGNgorI2RlZmluZSBBU1BFQ1RfUkFUSU9fU0FSX0hFSUdIVAkJCQkJCTBYRjcKKyNkZWZpbmUgTlVNX1VOSVRTX0lOX1RJQ0sJCQkJCQkwWEY4CisjZGVmaW5lIFRJTUVfU0NBTEUJCQkJCQkJMFhGQQorI2RlZmluZSBDVVJSRU5UX1BJQ19JTkZPCQkJCQkJMFhGQworI2RlZmluZSBEUEJfQlVGRkVSX0lORk8JCQkJCQkJMFhGRAorI2RlZmluZQlSRUZFUkVOQ0VfUE9PTF9JTkZPCQkJCQkJMFhGRQorI2RlZmluZSBSRUZFUkVOQ0VfTElTVF9JTkZPCQkJCQkJMFhGRgorCXN0cnVjdHsKKwkJdW5zaWduZWQgc2hvcnQgZGF0YVtSUE1fRU5ELVJQTV9CRUdJTl07CisJfSBsOworCXN0cnVjdHsKKwkJdW5zaWduZWQgc2hvcnQgZHVtcFtEUEJfT0ZGU0VUXTsKKwkJdW5zaWduZWQgc2hvcnQgZHBiX2Jhc2VbRlJBTUVfSU5fRFBCPDwzXTsKKworCQl1bnNpZ25lZCBzaG9ydCBkcGJfbWF4X2J1ZmZlcl9mcmFtZTsKKwkJdW5zaWduZWQgc2hvcnQgYWN0dWFsX2RwYl9zaXplOworCisJCXVuc2lnbmVkIHNob3J0IGNvbG9jYXRlZF9idWZfc3RhdHVzOworCisJCXVuc2lnbmVkIHNob3J0IG51bV9mb3J3YXJkX3Nob3J0X3Rlcm1fcmVmZXJlbmNlX3BpYzsKKwkJdW5zaWduZWQgc2hvcnQgbnVtX3Nob3J0X3Rlcm1fcmVmZXJlbmNlX3BpYzsKKwkJdW5zaWduZWQgc2hvcnQgbnVtX3JlZmVyZW5jZV9waWM7CisKKwkJdW5zaWduZWQgc2hvcnQgY3VycmVudF9kcGJfaW5kZXg7CisJCXVuc2lnbmVkIHNob3J0IGN1cnJlbnRfZGVjb2RlZF9mcmFtZV9udW07CisJCXVuc2lnbmVkIHNob3J0IGN1cnJlbnRfcmVmZXJlbmNlX2ZyYW1lX251bTsKKworCQl1bnNpZ25lZCBzaG9ydCBsMF9zaXplOworCQl1bnNpZ25lZCBzaG9ydCBsMV9zaXplOworCisJCS8qIFs2OjVdIDogbmFsX3JlZl9pZGMgKi8KKwkJLyogWzQ6MF0gOiBuYWxfdW5pdF90eXBlICovCisJCXVuc2lnbmVkIHNob3J0IE5BTF9pbmZvX21tY287CisKKwkJLyogWzE6MF0gOiAwMCAtIHRvcCBmaWVsZCwgMDEgLSBib3R0b20gZmllbGQsCisJCSAqICAgMTAgLSBmcmFtZSwgMTEgLSBtYmFmZiBmcmFtZQorCQkgKi8KKwkJdW5zaWduZWQgc2hvcnQgcGljdHVyZV9zdHJ1Y3R1cmVfbW1jbzsKKworCQl1bnNpZ25lZCBzaG9ydCBmcmFtZV9udW07CisJCXVuc2lnbmVkIHNob3J0IHBpY19vcmRlcl9jbnRfbHNiOworCisJCXVuc2lnbmVkIHNob3J0IG51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czE7CisJCXVuc2lnbmVkIHNob3J0IG51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czE7CisKKwkJdW5zaWduZWQgc2hvcnQgUHJldlBpY09yZGVyQ250THNiOworCQl1bnNpZ25lZCBzaG9ydCBQcmV2aW91c0ZyYW1lTnVtOworCisJCS8qIDMyIGJpdHMgdmFyaWFibGVzICovCisJCXVuc2lnbmVkIHNob3J0IGRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tWzJdOworCQl1bnNpZ25lZCBzaG9ydAlkZWx0YV9waWNfb3JkZXJfY250XzBbMl07CisJCXVuc2lnbmVkIHNob3J0IGRlbHRhX3BpY19vcmRlcl9jbnRfMVsyXTsKKworCQl1bnNpZ25lZCBzaG9ydCBQcmV2UGljT3JkZXJDbnRNc2JbMl07CisJCXVuc2lnbmVkIHNob3J0IFByZXZGcmFtZU51bU9mZnNldFsyXTsKKworCQl1bnNpZ25lZCBzaG9ydCBmcmFtZV9waWNfb3JkZXJfY250WzJdOworCQl1bnNpZ25lZCBzaG9ydCB0b3BfZmllbGRfcGljX29yZGVyX2NudFsyXTsKKwkJdW5zaWduZWQgc2hvcnQgYm90dG9tX2ZpZWxkX3BpY19vcmRlcl9jbnRbMl07CisKKwkJdW5zaWduZWQgc2hvcnQgY29sb2NhdGVkX212X2FkZHJfc3RhcnRbMl07CisJCXVuc2lnbmVkIHNob3J0IGNvbG9jYXRlZF9tdl9hZGRyX2VuZFsyXTsKKwkJdW5zaWduZWQgc2hvcnQgY29sb2NhdGVkX212X3dyX2FkZHJbMl07CisKKwkJdW5zaWduZWQgc2hvcnQgZnJhbWVfY3JvcF9sZWZ0X29mZnNldDsKKwkJdW5zaWduZWQgc2hvcnQgZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQ7CisJCXVuc2lnbmVkIHNob3J0IGZyYW1lX2Nyb3BfdG9wX29mZnNldDsKKwkJdW5zaWduZWQgc2hvcnQgZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0OworCQl1bnNpZ25lZCBzaG9ydCBjaHJvbWFfZm9ybWF0X2lkYzsKKwl9IGRwYjsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBzaG9ydCBkdW1wW01NQ09fT0ZGU0VUXTsKKworCQkvKiBhcnJheSBiYXNlIGFkZHJlc3MgZm9yIG9mZnNldF9mb3JfcmVmX2ZyYW1lICovCisJCXVuc2lnbmVkIHNob3J0IG9mZnNldF9mb3JfcmVmX2ZyYW1lX2Jhc2VbMTI4XTsKKworCQkvKiAwIC0gSW5kZXggaW4gRFBCCisJCSAqIDEgLSBQaWN0dXJlIEZsYWcKKwkJICogIFsgICAgMl0gOiAwIC0gc2hvcnQgdGVybSByZWZlcmVuY2UsCisJCSAqICAgICAgICAgICAgMSAtIGxvbmcgdGVybSByZWZlcmVuY2UKKwkJICogIFsgICAgMV0gOiBib3R0b20gZmllbGQKKwkJICogIFsgICAgMF0gOiB0b3AgZmllbGQKKwkJICogMiAtIFBpY3R1cmUgTnVtYmVyIChzaG9ydCB0ZXJtIG9yIGxvbmcgdGVybSkgbG93IDE2IGJpdHMKKwkJICogMyAtIFBpY3R1cmUgTnVtYmVyIChzaG9ydCB0ZXJtIG9yIGxvbmcgdGVybSkgaGlnaCAxNiBiaXRzCisJCSAqLworCQl1bnNpZ25lZCBzaG9ydAlyZWZlcmVuY2VfYmFzZVsxMjhdOworCisJCS8qIGNvbW1hbmQgYW5kIHBhcmFtZXRlciwgdW50aWwgY29tbWFuZCBpcyAzICovCisJCXVuc2lnbmVkIHNob3J0IGwwX3Jlb3JkZXJfY21kWzY2XTsKKwkJdW5zaWduZWQgc2hvcnQgbDFfcmVvcmRlcl9jbWRbNjZdOworCisJCS8qIGNvbW1hbmQgYW5kIHBhcmFtZXRlciwgdW50aWwgY29tbWFuZCBpcyAwICovCisJCXVuc2lnbmVkIHNob3J0IG1tY29fY21kWzQ0XTsKKworCQl1bnNpZ25lZCBzaG9ydCBsMF9iYXNlWzQwXTsKKwkJdW5zaWduZWQgc2hvcnQgbDFfYmFzZVs0MF07CisJfSBtbWNvOworCXN0cnVjdCB7CisJCS8qIGZyb20gdWNvZGUgbG1lbSwgZG8gbm90IGNoYW5nZSB0aGlzIHN0cnVjdCAqLworCX0gcDsKK307CisKKworc3RydWN0IFN0b3JhYmxlUGljdHVyZTsKK3N0cnVjdCBWaWRlb1BhcmFtZXRlcnM7CitzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXI7CisKKy8qIE5ldyBlbnVtIGZvciBmaWVsZCBwcm9jZXNzaW5nICovCitlbnVtIFBpY3R1cmVTdHJ1Y3R1cmUgeworCUZSQU1FLAorCVRPUF9GSUVMRCwKKwlCT1RUT01fRklFTEQKK307CisKK3R5cGVkZWYgZW51bSB7CisJUElDX1NJTkdMRV9GUkFNRSA9IDAsCisJUElDX1RPUCwKKwlQSUNfQk9ULAorCVBJQ19UT1BfQk9ULAorCVBJQ19CT1RfVE9QLAorCVBJQ19UT1BfQk9UX1RPUCA9IDUsCisJUElDX0JPVF9UT1BfQk9ULAorCVBJQ19ET1VCTEVfRlJBTUUsCisJUElDX1RSSVBMRV9GUkFNRSwKKwlQSUNfSU5WQUxJRCwKK30gUGljU3RydWN0X0U7CisKKyNkZWZpbmUgSV9TbGljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFBfU2xpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBCX1NsaWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgUF9TbGljZV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEJfU2xpY2VfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJX1NsaWNlXzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKKworZW51bSBTbGljZVR5cGUgeworCVBfU0xJQ0UgPSAwLAorCUJfU0xJQ0UgPSAxLAorCUlfU0xJQ0UgPSAyLAorCVNQX1NMSUNFID0gMywKKwlTSV9TTElDRSA9IDQsCisJTlVNX1NMSUNFX1RZUEVTID0gNQorfTsKKworZW51bSBQcm9maWxlSURDIHsKKwlGUkVYVF9DQVZMQzQ0NCA9IDQ0LCAgIC8qITwgWVVWIDQ6NDo0LzE0ICJDQVZMQyA0OjQ6NCIqLworCUJBU0VMSU5FICAgICAgID0gNjYsICAgLyohPCBZVVYgNDoyOjAvOCAgIkJhc2VsaW5lIiovCisJTUFJTiAgICAgICAgICAgPSA3NywgICAvKiE8IFlVViA0OjI6MC84ICAiTWFpbiIqLworCUVYVEVOREVEICAgICAgID0gODgsICAgLyohPCBZVVYgNDoyOjAvOCAgIkV4dGVuZGVkIiovCisJRlJFWFRfSFAgICAgICAgPSAxMDAsICAvKiE8IFlVViA0OjI6MC84ICAiSGlnaCIqLworCUZSRVhUX0hpMTBQICAgID0gMTEwLCAgLyohPCBZVVYgNDoyOjAvMTAgIkhpZ2ggMTAiKi8KKwlGUkVYVF9IaTQyMiAgICA9IDEyMiwgIC8qITwgWVVWIDQ6MjoyLzEwICJIaWdoIDQ6MjoyIiovCisJRlJFWFRfSGk0NDQgICAgPSAyNDQsICAvKiE8IFlVViA0OjQ6NC8xNCAiSGlnaCA0OjQ6NCIqLworCU1WQ19ISUdIICAgICAgID0gMTE4LCAgLyohPCBZVVYgNDoyOjAvOCAgIk11bHRpdmlldyBIaWdoIiovCisJU1RFUkVPX0hJR0ggICAgPSAxMjggICAvKiE8IFlVViA0OjI6MC84ICAiU3RlcmVvIEhpZ2giKi8KK307CisKK2VudW0gRmlyc3RJbnNlcnRGcm1fU3RhdGUgeworCUZpcnN0SW5zZXJ0RnJtX0lETEUgPSAwLAorCUZpcnN0SW5zZXJ0RnJtX09VVCA9IDEsCisJRmlyc3RJbnNlcnRGcm1fUkVTRVQgPSAyLAorCUZpcnN0SW5zZXJ0RnJtX1NLSVBET05FID0gMywKK307CisKKworc3RydWN0IFNQU1BhcmFtZXRlcnMgeworCXVuc2lnbmVkIGludCBwcm9maWxlX2lkYzsKKwl1bnNpZ25lZCBpbnQgbGV2ZWxfaWRjOworCWludCBwaWNfb3JkZXJfY250X3R5cGU7CisJaW50IGxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNDsKKwlpbnQgbnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZTsKKwlzaG9ydCBvZmZzZXRfZm9yX3JlZl9mcmFtZVsxMjhdOworCXNob3J0IG9mZnNldF9mb3Jfbm9uX3JlZl9waWM7CisJc2hvcnQgb2Zmc2V0X2Zvcl90b3BfdG9fYm90dG9tX2ZpZWxkOworCisJLyoqLworCWludCBmcmFtZV9tYnNfb25seV9mbGFnOworCWludCBudW1fcmVmX2ZyYW1lczsKKwlpbnQgbWF4X2RwYl9zaXplOworCWludCBsb2cyX21heF9mcmFtZV9udW1fbWludXM0OworCWludCBmcmFtZV9udW1fZ2FwX2FsbG93ZWQ7Cit9OworCisjZGVmaW5lIERFQ19SRUZfUElDX01BUktJTkdfQlVGRkVSX05VTV9NQVggICA0NQorc3RydWN0IERlY1JlZlBpY01hcmtpbmdfcyB7CisJaW50IG1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uOworCWludCBkaWZmZXJlbmNlX29mX3BpY19udW1zX21pbnVzMTsKKwlpbnQgbG9uZ190ZXJtX3BpY19udW07CisJaW50IGxvbmdfdGVybV9mcmFtZV9pZHg7CisJaW50IG1heF9sb25nX3Rlcm1fZnJhbWVfaWR4X3BsdXMxOworCXN0cnVjdCBEZWNSZWZQaWNNYXJraW5nX3MgKk5leHQ7Cit9OworCisjZGVmaW5lIFJFT1JERVJJTkdfQ09NTUFORF9NQVhfU0laRSAgICAzMworc3RydWN0IFNsaWNlIHsKKwlpbnQgZmlyc3RfbWJfaW5fc2xpY2U7CisJaW50IG1vZGVfOHg4X2ZsYWdzOworCWludCBwaWN0dXJlX3N0cnVjdHVyZV9tbWNvOworCisJaW50IGZyYW1lX251bTsKKwlpbnQgaWRyX2ZsYWc7CisJaW50IHRvcHBvYzsKKwlpbnQgYm90dG9tcG9jOworCWludCBmcmFtZXBvYzsKKwlpbnQgcGljX29yZGVyX2NudF9sc2I7CisJaW50IFBpY09yZGVyQ250TXNiOworCXVuc2lnbmVkIGNoYXIgZmllbGRfcGljX2ZsYWc7CisJdW5zaWduZWQgY2hhciBib3R0b21fZmllbGRfZmxhZzsKKwlpbnQgVGhpc1BPQzsKKwlpbnQgbmFsX3JlZmVyZW5jZV9pZGM7CisJaW50IEFic0ZyYW1lTnVtOworCWludCBkZWx0YV9waWNfb3JkZXJfY250X2JvdHRvbTsKKwlpbnQgZGVsdGFfcGljX29yZGVyX2NudFsyXTsKKworCS8qKi8KKwljaGFyIGxpc3RYc2l6ZVs2XTsKKwlzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpsaXN0WFs2XVtNQVhfTElTVF9TSVpFICogMl07CisKKwkvKiovCisJZW51bSBQaWN0dXJlU3RydWN0dXJlIHN0cnVjdHVyZTsKKwlpbnQgbG9uZ190ZXJtX3JlZmVyZW5jZV9mbGFnOworCWludCBub19vdXRwdXRfb2ZfcHJpb3JfcGljc19mbGFnOworCWludCBhZGFwdGl2ZV9yZWZfcGljX2J1ZmZlcmluZ19mbGFnOworCisJc3RydWN0IFZpZGVvUGFyYW1ldGVycyAqcF9WaWQ7CisJc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYjsKKwlpbnQgbnVtX3JlZl9pZHhfYWN0aXZlWzJdOyAgICAvKiBudW1iZXIgb2YgYXZhaWxhYmxlIGxpc3QgcmVmZXJlbmNlcyAqLworCisJLyptb2RpZmljYXRpb24qLworCWludCBzbGljZV90eXBlOyAgICAvKiBzbGljZSB0eXBlICovCisJaW50IHJlZl9waWNfbGlzdF9yZW9yZGVyaW5nX2ZsYWdbMl07CisJaW50IG1vZGlmaWNhdGlvbl9vZl9waWNfbnVtc19pZGNbMl1bUkVPUkRFUklOR19DT01NQU5EX01BWF9TSVpFXTsKKwlpbnQgYWJzX2RpZmZfcGljX251bV9taW51czFbMl1bUkVPUkRFUklOR19DT01NQU5EX01BWF9TSVpFXTsKKwlpbnQgbG9uZ190ZXJtX3BpY19pZHhbMl1bUkVPUkRFUklOR19DT01NQU5EX01BWF9TSVpFXTsKKwkvKiovCisJdW5zaWduZWQgY2hhciBkZWNfcmVmX3BpY19tYXJraW5nX2J1ZmZlcl92YWxpZDsKKwlzdHJ1Y3QgRGVjUmVmUGljTWFya2luZ19zCisJCWRlY19yZWZfcGljX21hcmtpbmdfYnVmZmVyW0RFQ19SRUZfUElDX01BUktJTkdfQlVGRkVSX05VTV9NQVhdOworCWludCBwaWNfc3RydWN0OworfTsKKworc3RydWN0IE9sZFNsaWNlUGFyYW1zIHsKKwl1bnNpZ25lZCBpbnQgZmllbGRfcGljX2ZsYWc7CisJdW5zaWduZWQgaW50IGZyYW1lX251bTsKKwlpbnQgICAgICBuYWxfcmVmX2lkYzsKKwl1bnNpZ25lZCBpbnQgcGljX29kZXJfY250X2xzYjsKKwlpbnQgICAgICBkZWx0YV9waWNfb2Rlcl9jbnRfYm90dG9tOworCWludCAgICAgIGRlbHRhX3BpY19vcmRlcl9jbnRbMl07CisJdW5zaWduZWQgY2hhciAgICAgYm90dG9tX2ZpZWxkX2ZsYWc7CisJdW5zaWduZWQgY2hhciAgICAgaWRyX2ZsYWc7CisJaW50ICAgICAgaWRyX3BpY19pZDsKKwlpbnQgICAgICBwcHNfaWQ7CisjaWYgKE1WQ19FWFRFTlNJT05fRU5BQkxFKQorCWludCAgICAgIHZpZXdfaWQ7CisJaW50ICAgICAgaW50ZXJfdmlld19mbGFnOworCWludCAgICAgIGFuY2hvcl9waWNfZmxhZzsKKyNlbmRpZgorCWludCAgICAgIGxheWVyX2lkOworfTsKKworc3RydWN0IFZpZGVvUGFyYW1ldGVycyB7CisJaW50IFByZXZQaWNPcmRlckNudE1zYjsKKwlpbnQgUHJldlBpY09yZGVyQ250THNiOworCXVuc2lnbmVkIGNoYXIgbGFzdF9oYXNfbW1jb181OworCXVuc2lnbmVkIGNoYXIgbGFzdF9waWNfYm90dG9tX2ZpZWxkOworCWludCBUaGlzUE9DOworCWludCBQcmV2aW91c0ZyYW1lTnVtOworCWludCBGcmFtZU51bU9mZnNldDsKKwlpbnQgUHJldmlvdXNGcmFtZU51bU9mZnNldDsKKwlpbnQgbWF4X2ZyYW1lX251bTsKKwl1bnNpZ25lZCBpbnQgcHJlX2ZyYW1lX251bTsKKwlpbnQgRXhwZWN0ZWREZWx0YVBlclBpY09yZGVyQ250Q3ljbGU7CisJaW50IFBpY09yZGVyQ250Q3ljbGVDbnQ7CisJaW50IEZyYW1lTnVtSW5QaWNPcmRlckNudEN5Y2xlOworCWludCBFeHBlY3RlZFBpY09yZGVyQ250OworCisJLyoqLworCXN0cnVjdCBTUFNQYXJhbWV0ZXJzICphY3RpdmVfc3BzOworCXN0cnVjdCBTbGljZSAqKnBwU2xpY2VMaXN0OworCWludCBpU2xpY2VOdW1PZkN1cnJQaWM7CisJaW50IGNvbmNlYWxfbW9kZTsKKwlpbnQgZWFybGllcl9taXNzaW5nX3BvYzsKKwlpbnQgcG9jc19pbl9kcGJbMTAwXTsKKworCXN0cnVjdCBPbGRTbGljZVBhcmFtcyBvbGRfc2xpY2U7CisJLyoqLworCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKmRlY19waWN0dXJlOworCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKm5vX3JlZmVyZW5jZV9waWN0dXJlOworCisJLyptb2RpZmljYXRpb24qLworCWludCBub25fY29uZm9ybWluZ19zdHJlYW07CisJaW50IHJlY292ZXJ5X3BvaW50OworfTsKKworc3RhdGljIGlubGluZSBpbnQgaW1pbihpbnQgYSwgaW50IGIpCit7CisJcmV0dXJuICgoYSkgPCAoYikpID8gKGEpIDogKGIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBpbWF4KGludCBhLCBpbnQgYikKK3sKKwlyZXR1cm4gKChhKSA+IChiKSkgPyAoYSkgOiAoYik7Cit9CisKKyNkZWZpbmUgTUFYX1BJQ19CVUZfTlVNIDEyOAorI2RlZmluZSBNQVhfTlVNX1NMSUNFUyA1MAorCitzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlIHsKKy8qKi8KKwlpbnQgd2lkdGg7CisJaW50IGhlaWdodDsKKworCWludCB5X2NhbnZhc19pbmRleDsKKwlpbnQgdV9jYW52YXNfaW5kZXg7CisJaW50IHZfY2FudmFzX2luZGV4OworLyoqLworCWludCBpbmRleDsKKwl1bnNpZ25lZCBjaGFyIGlzX3VzZWQ7CisKKwllbnVtIFBpY3R1cmVTdHJ1Y3R1cmUgc3RydWN0dXJlOworCisJaW50ICAgICAgICAgcG9jOworCWludCAgICAgICAgIHRvcF9wb2M7CisJaW50ICAgICAgICAgYm90dG9tX3BvYzsKKwlpbnQgICAgICAgICBmcmFtZV9wb2M7CisJdW5zaWduZWQgaW50ICBmcmFtZV9udW07CisJdW5zaWduZWQgaW50ICByZWNvdmVyeV9mcmFtZTsKKworCWludCAgICAgICAgIHBpY19udW07CisJaW50ICAgICAgICAgYnVmX3NwZWNfbnVtOworCWludCAgICAgICAgIGJ1Zl9zcGVjX2lzX2FsbG9jZWQ7CisJaW50ICAgICAgICAgY29sb2NhdGVkX2J1Zl9pbmRleDsKKwlpbnQgICAgICAgICBsb25nX3Rlcm1fcGljX251bTsKKwlpbnQgICAgICAgICBsb25nX3Rlcm1fZnJhbWVfaWR4OworCisJdW5zaWduZWQgY2hhciAgaXNfbG9uZ190ZXJtOworCWludCAgICAgICAgIHVzZWRfZm9yX3JlZmVyZW5jZTsKKwlpbnQgICAgICAgICBpc19vdXRwdXQ7CisjaWYgMQorCS8qIHJhaW4gKi8KKwlpbnQgICAgICAgICBwcmVfb3V0cHV0OworI2VuZGlmCisJaW50ICAgICAgICAgbm9uX2V4aXN0aW5nOworCWludCAgICAgICAgIHNlcGFyYXRlX2NvbG91cl9wbGFuZV9mbGFnOworCisJc2hvcnQgICAgICAgbWF4X3NsaWNlX2lkOworCisJaW50ICAgICAgICAgc2l6ZV94LCBzaXplX3ksIHNpemVfeF9jciwgc2l6ZV95X2NyOworCWludCAgICAgICAgIHNpemVfeF9tMSwgc2l6ZV95X20xLCBzaXplX3hfY3JfbTEsIHNpemVfeV9jcl9tMTsKKwlpbnQgICAgICAgICBjb2RlZF9mcmFtZTsKKwlpbnQgICAgICAgICBtYl9hZmZfZnJhbWVfZmxhZzsKKwl1bnNpZ25lZCBpbnQgUGljV2lkdGhJbk1iczsKKwl1bnNpZ25lZCBpbnQgUGljU2l6ZUluTWJzOworCWludCAgICAgICAgIGlMdW1hUGFkWSwgaUx1bWFQYWRYOworCWludCAgICAgICAgIGlDaHJvbWFQYWRZLCBpQ2hyb21hUGFkWDsKKworCS8qIGZvciBtYiBhZmYsIGlmIGZyYW1lIGZvciByZWZlcmVuY2luZyB0aGUgdG9wIGZpZWxkICovCisJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqdG9wX2ZpZWxkOworCS8qIGZvciBtYiBhZmYsIGlmIGZyYW1lIGZvciByZWZlcmVuY2luZyB0aGUgYm90dG9tIGZpZWxkICovCisJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqYm90dG9tX2ZpZWxkOworCS8qIGZvciBtYiBhZmYsIGlmIGZpZWxkIGZvciByZWZlcmVuY2luZyB0aGUgY29tYmluZWQgZnJhbWUgKi8KKwlzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpmcmFtZTsKKworCWludCAgICAgICAgIHNsaWNlX3R5cGU7CisJaW50ICAgICAgICAgaWRyX2ZsYWc7CisJaW50ICAgICAgICAgbm9fb3V0cHV0X29mX3ByaW9yX3BpY3NfZmxhZzsKKwlpbnQgICAgICAgICBsb25nX3Rlcm1fcmVmZXJlbmNlX2ZsYWc7CisJaW50ICAgICAgICAgYWRhcHRpdmVfcmVmX3BpY19idWZmZXJpbmdfZmxhZzsKKworCWludCAgICAgICAgIGNocm9tYV9mb3JtYXRfaWRjOworCWludCAgICAgICAgIGZyYW1lX21ic19vbmx5X2ZsYWc7CisJaW50ICAgICAgICAgZnJhbWVfY3JvcHBpbmdfZmxhZzsKKwlpbnQgICAgICAgICBmcmFtZV9jcm9wX2xlZnRfb2Zmc2V0OworCWludCAgICAgICAgIGZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0OworCWludCAgICAgICAgIGZyYW1lX2Nyb3BfdG9wX29mZnNldDsKKwlpbnQgICAgICAgICBmcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQ7CisJaW50ICAgICAgICAgcXA7CisJaW50ICAgICAgICAgY2hyb21hX3FwX29mZnNldFsyXTsKKwlpbnQgICAgICAgICBzbGljZV9xcF9kZWx0YTsKKwkvKiBzdG9yZXMgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IGNvbnRyb2wgb3BlcmF0aW9ucyAqLworCXN0cnVjdCBEZWNSZWZQaWNNYXJraW5nX3MgKmRlY19yZWZfcGljX21hcmtpbmdfYnVmZmVyOworCisJLyogcGljdHVyZSBlcnJvciBjb25jZWFsbWVudCAqLworCS8qaW5kaWNhdGVzIGlmIHRoaXMgaXMgYSBjb25jZWFsZWQgcGljdHVyZSAqLworCWludCAgICAgICAgIGNvbmNlYWxlZF9waWM7CisKKwkvKiB2YXJpYWJsZXMgZm9yIHRvbmUgbWFwcGluZyAqLworCWludCAgICAgICAgIHNlaUhhc1RvbmVfbWFwcGluZzsKKwlpbnQgICAgICAgICB0b25lX21hcHBpbmdfbW9kZWxfaWQ7CisJaW50ICAgICAgICAgdG9uZW1hcHBlZF9iaXRfZGVwdGg7CisJLyogaW1ncGVsKiAgICAgdG9uZV9tYXBwaW5nX2x1dDsgdG9uZSBtYXBwaW5nIGxvb2sgdXAgdGFibGUgKi8KKworCWludCAgICAgICAgIHByb2NfZmxhZzsKKyNpZiAoTVZDX0VYVEVOU0lPTl9FTkFCTEUpCisJaW50ICAgICAgICAgdmlld19pZDsKKwlpbnQgICAgICAgICBpbnRlcl92aWV3X2ZsYWc7CisJaW50ICAgICAgICAgYW5jaG9yX3BpY19mbGFnOworI2VuZGlmCisJaW50ICAgICAgICAgaUx1bWFTdHJpZGU7CisJaW50ICAgICAgICAgaUNocm9tYVN0cmlkZTsKKwlpbnQgICAgICAgICBpTHVtYUV4cGFuZGVkSGVpZ2h0OworCWludCAgICAgICAgIGlDaHJvbWFFeHBhbmRlZEhlaWdodDsKKwkvKiBpbWdwZWwgKipjdXJfaW1nWTsgZm9yIG1vcmUgZWZmaWNpZW50IGdldF9ibG9ja19sdW1hICovCisJaW50IG5vX3JlZjsKKwlpbnQgaUNvZGluZ1R5cGU7CisKKwljaGFyIGxpc3RYc2l6ZVtNQVhfTlVNX1NMSUNFU11bMl07CisJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqKmxpc3RYW01BWF9OVU1fU0xJQ0VTXVsyXTsKKwlpbnQgICAgICAgICBsYXllcl9pZDsKKwl1MzIgCSAgICAgICBvZmZzZXRfZGVsaW1pdGVyOworCXUzMiAgICAgICAgIHB0czsKKwl1NjQgICAgICAgICBwdHM2NDsKKwl1NjQgICAgICAgICB0aW1lc3RhbXA7CisJdW5zaWduZWQgY2hhciBkYXRhX2ZsYWc7CisJaW50IHBpY19zdHJ1Y3Q7CisKKwkvKiBwaWN0dXJlIHFvcyBpbmZvbWF0aW9uKi8KKwlpbnQgZnJhbWVfc2l6ZTsKKwlpbnQgbWF4X3FwOworCWludCBhdmdfcXA7CisJaW50IG1pbl9xcDsKKwlpbnQgbWF4X3NraXA7CisJaW50IGF2Z19za2lwOworCWludCBtaW5fc2tpcDsKKwlpbnQgbWF4X212OworCWludCBtaW5fbXY7CisJaW50IGF2Z19tdjsKKwl1MzIgcGljX3NpemU7Cit9OworCitzdHJ1Y3QgRnJhbWVTdG9yZSB7CisJLyogcmFpbiAqLworCWludCAgICAgIGJ1Zl9zcGVjX251bTsKKwkvKiByYWluICovCisJaW50ICAgICAgY29sb2NhdGVkX2J1Zl9pbmRleDsKKworCS8qIDA9ZW1wdHk7IDE9dG9wOyAyPWJvdHRvbTsgMz1ib3RoIGZpZWxkcyAob3IgZnJhbWUpICovCisJaW50ICAgICAgIGlzX3VzZWQ7CisJLyogMD1ub3QgdXNlZCBmb3IgcmVmOyAxPXRvcCB1c2VkOyAyPWJvdHRvbSB1c2VkOworCSAqIDM9Ym90aCBmaWVsZHMgKG9yIGZyYW1lKSB1c2VkCisJICovCisJaW50ICAgICAgIGlzX3JlZmVyZW5jZTsKKwkvKiAwPW5vdCB1c2VkIGZvciByZWY7IDE9dG9wIHVzZWQ7IDI9Ym90dG9tIHVzZWQ7CisJICogMz1ib3RoIGZpZWxkcyAob3IgZnJhbWUpIHVzZWQKKwkgKi8KKwlpbnQgICAgICAgaXNfbG9uZ190ZXJtOworCS8qIG9yaWdpbmFsIG1hcmtpbmcgYnkgbmFsX3JlZl9pZGM6IDA9bm90IHVzZWQgZm9yIHJlZjsgMT10b3AgdXNlZDsKKwkgKiAyPWJvdHRvbSB1c2VkOyAzPWJvdGggZmllbGRzIChvciBmcmFtZSkgdXNlZAorCSAqLworCWludCAgICAgICBpc19vcmlnX3JlZmVyZW5jZTsKKworCWludCAgICAgICBpc19ub25fZXhpc3RlbnQ7CisKKwl1bnNpZ25lZCBpbnQgZnJhbWVfbnVtOworCXVuc2lnbmVkIGludCByZWNvdmVyeV9mcmFtZTsKKworCWludCAgICAgICBmcmFtZV9udW1fd3JhcDsKKwlpbnQgICAgICAgbG9uZ190ZXJtX2ZyYW1lX2lkeDsKKwlpbnQgICAgICAgaXNfb3V0cHV0OworI2lmIDEKKwkvKiByYWluICovCisJaW50ICAgICAgICAgcHJlX291dHB1dDsKKwkvKiBpbmRleCBpbiBnRnJhbWVTdG9yZSAqLworCWludCAgICAgICBpbmRleDsKKyNkZWZpbmUgSV9GTEFHCQkJMHgwMQorI2RlZmluZSBJRFJfRkxBRwkJMHgwMgorI2RlZmluZSBFUlJPUl9GTEFHCQkweDEwCisjZGVmaW5lIE5VTExfRkxBRwkJMHgyMAorI2RlZmluZSBOT0RJU1BfRkxBRwkJMHg4MAorCXVuc2lnbmVkIGNoYXIgZGF0YV9mbGFnOworI2VuZGlmCisJaW50ICAgICAgIHBvYzsKKworCS8qIHBpY3R1cmUgZXJyb3IgY29uY2VhbG1lbnQgKi8KKwlpbnQgY29uY2VhbG1lbnRfcmVmZXJlbmNlOworCisJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqZnJhbWU7CisJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqdG9wX2ZpZWxkOworCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKmJvdHRvbV9maWVsZDsKKworI2lmIChNVkNfRVhURU5TSU9OX0VOQUJMRSkKKwlpbnQgICAgICAgdmlld19pZDsKKwlpbnQgICAgICAgaW50ZXJfdmlld19mbGFnWzJdOworCWludCAgICAgICBhbmNob3JfcGljX2ZsYWdbMl07CisjZW5kaWYKKwlpbnQgICAgICAgbGF5ZXJfaWQ7CisJdTMyIAkgIG9mZnNldF9kZWxpbWl0ZXI7CisJdTMyICAgICAgIHB0czsKKwl1NjQgICAgICAgcHRzNjQ7CisJdTY0ICAgICAgIHRpbWVzdGFtcDsKKworCisJLyogcGljdHVyZSBxb3MgaW5mb21hdGlvbiovCisJaW50IHNsaWNlX3R5cGU7CisJaW50IGZyYW1lX3NpemU7CisKKwlpbnQgbWF4X3FwOworCWludCBhdmdfcXA7CisJaW50IG1pbl9xcDsKKwlpbnQgbWF4X3NraXA7CisJaW50IGF2Z19za2lwOworCWludCBtaW5fc2tpcDsKKwlpbnQgbWF4X212OworCWludCBtaW5fbXY7CisJaW50IGF2Z19tdjsKKwlpbnQgZHBiX2ZyYW1lX2NvdW50OworCXUzMiBod19kZWNvZGVfdGltZTsKKwl1MzIgZnJhbWVfc2l6ZTI7IC8vIEZvciByZWNvcmRpbmcgdGhlIGNodW5rLT5zaXplIGluIGZyYW1lIG1vZGUKKwlib29sIHNob3dfZnJhbWU7CisJc3RydWN0IGRtYV9mZW5jZSAqZmVuY2U7CisJdTMyIGRlY29kZWRfZnJhbWVfc2l6ZTsKKwl1NjQgbGFzdF9maWVsZF90aW1lc3RhbXA7Cit9OworCisvKiAjZGVmaW5lIERQQl9TSVpFX01BWCAgICAgMTYgKi8KKyNkZWZpbmUgRFBCX1NJWkVfTUFYICAgICAzMgorc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyIHsKKwlzdHJ1Y3QgVmlkZW9QYXJhbWV0ZXJzICpwX1ZpZDsKKwkvKiBJbnB1dFBhcmFtZXRlcnMgKnBfSW5wOyA/Pz8gKi8KKwlzdHJ1Y3QgRnJhbWVTdG9yZSAgKmZzW0RQQl9TSVpFX01BWF07CisJc3RydWN0IEZyYW1lU3RvcmUgICpmc19yZWZbRFBCX1NJWkVfTUFYXTsKKwlzdHJ1Y3QgRnJhbWVTdG9yZSAgKmZzX2x0cmVmW0RQQl9TSVpFX01BWF07CisJLyogaW50ZXItbGF5ZXIgcmVmZXJlbmNlIChmb3IgbXVsdGktbGF5ZXJlZCBjb2RlY3MpICovCisJc3RydWN0IEZyYW1lU3RvcmUgICpmc19pbHJlZltEUEJfU0laRV9NQVhdOworCS8qKi8KKwlzdHJ1Y3QgRnJhbWVTdG9yZSAqZnNfbGlzdDBbRFBCX1NJWkVfTUFYXTsKKwlzdHJ1Y3QgRnJhbWVTdG9yZSAqZnNfbGlzdDFbRFBCX1NJWkVfTUFYXTsKKwlzdHJ1Y3QgRnJhbWVTdG9yZSAqZnNfbGlzdGx0W0RQQl9TSVpFX01BWF07CisKKwkvKiovCisJdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgaW50IHVzZWRfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgcmVmX2ZyYW1lc19pbl9idWZmZXI7CisJdW5zaWduZWQgaW50IGx0cmVmX2ZyYW1lc19pbl9idWZmZXI7CisJaW50ICAgICAgICAgICBsYXN0X291dHB1dF9wb2M7CisjaWYgKE1WQ19FWFRFTlNJT05fRU5BQkxFKQorCWludCAgICAgICAgICAgbGFzdF9vdXRwdXRfdmlld19pZDsKKyNlbmRpZgorCWludCAgICAgICAgICAgbWF4X2xvbmdfdGVybV9waWNfaWR4OworCisKKwlpbnQgICAgICAgICAgIGluaXRfZG9uZTsKKwlpbnQgICAgICAgICAgIGZpcnN0X3BpY19kb25lOyAvKmJ5IHJhaW4qLworCWludCAgICAgICAgICAgbnVtX3JlZl9mcmFtZXM7CisKKwlzdHJ1Y3QgRnJhbWVTdG9yZSAgICpsYXN0X3BpY3R1cmU7CisJdW5zaWduZWQgaW50IHVzZWRfc2l6ZV9pbDsKKwlpbnQgICAgICAgICAgbGF5ZXJfaWQ7CisKKwkvKiBEUEIgcmVsYXRlZCBmdW5jdGlvbjsgKi8KK307CisKK3N0cnVjdCBoMjY0X2RwYl9zdHJ1IHsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjOworCWludCBkZWNvZGVyX2luZGV4OworCisJdW5pb24gcGFyYW0gZHBiX3BhcmFtOworCisJaW50IGRlY29kZV9pZHg7CisJaW50IGJ1Zl9udW07CisJaW50IGN1cnJfUE9DOworCWludCByZW9yZGVyX3BpY19udW07CisJdW5zaWduZWQgaW50IGRlY19kcGJfc2l6ZTsKKwl1OCBmYXN0X291dHB1dF9lbmFibGU7CisJCS8qcG9jX2V2ZW5fZmxhZzoKKwkJIDAsIGluaXQ7IDEsIG9kZDsgMiwgZXZlbiovCisJdTggcG9jX2V2ZW5fb2RkX2ZsYWc7CisJdTMyIGRlY29kZV9waWNfY291bnQ7CisJLyoqLworCXVuc2lnbmVkIGludCBtYXhfcmVmZXJlbmNlX3NpemU7CisKKwl1bnNpZ25lZCBpbnQgY29sb2NhdGVkX2J1Zl9tYXA7CisJdW5zaWduZWQgaW50IGNvbG9jYXRlZF9idWZfY291bnQ7CisJdW5zaWduZWQgaW50IGNvbG9jYXRlZF9tdl9hZGRyX3N0YXJ0OworCXVuc2lnbmVkIGludCBjb2xvY2F0ZWRfbXZfYWRkcl9lbmQ7CisJdW5zaWduZWQgaW50IGNvbG9jYXRlZF9idWZfc2l6ZTsKKworCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciBtRFBCOworCXN0cnVjdCBTbGljZSBtU2xpY2U7CisJc3RydWN0IFZpZGVvUGFyYW1ldGVycyBtVmlkZW87CisJc3RydWN0IFNQU1BhcmFtZXRlcnMgbVNQUzsKKworCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgbV9QSUNbTUFYX1BJQ19CVUZfTlVNXTsKKwlzdHJ1Y3QgRnJhbWVTdG9yZSBtRnJhbWVTdG9yZVtEUEJfU0laRV9NQVhdOworCisJLyp2dWkqLworCXVuc2lnbmVkIGludCB2dWlfc3RhdHVzOworCXVuc2lnbmVkIGludCBudW1fdW5pdHNfaW5fdGljazsKKwl1bnNpZ25lZCBpbnQgdGltZV9zY2FsZTsKKwl1bnNpZ25lZCBpbnQgZml4ZWRfZnJhbWVfcmF0ZV9mbGFnOworCXVuc2lnbmVkIGludCBhc3BlY3RfcmF0aW9faWRjOworCXVuc2lnbmVkIGludCBhc3BlY3RfcmF0aW9fc2FyX3dpZHRoOworCXVuc2lnbmVkIGludCBhc3BlY3RfcmF0aW9fc2FyX2hlaWdodDsKKwl1OCBiaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZzsKKwl1MTYgbnVtX3Jlb3JkZXJfZnJhbWVzOworCXUxNiBtYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZzsKKworCXVuc2lnbmVkIGludCBmcmFtZV9jcm9wX2xlZnRfb2Zmc2V0OworCXVuc2lnbmVkIGludCBmcmFtZV9jcm9wX3JpZ2h0X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgZnJhbWVfY3JvcF90b3Bfb2Zmc2V0OworCXVuc2lnbmVkIGludCBmcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQ7CisJdW5zaWduZWQgaW50IGNocm9tYV9mb3JtYXRfaWRjOworCisJdW5zaWduZWQgaW50IGRlY19kcGJfc3RhdHVzOworCXVuc2lnbmVkIGludCBsYXN0X2RwYl9zdGF0dXM7CisJdW5zaWduZWQgY2hhciBidWZfYWxsb2NfZmFpbDsKKwl1bnNpZ25lZCBpbnQgZHBiX2Vycm9yX2ZsYWc7CisJdW5zaWduZWQgaW50IHJlb3JkZXJfb3V0cHV0OworCXVuc2lnbmVkIGludCBmaXJzdF9pbnNlcnRfZnJhbWU7CisJaW50IGZpcnN0X291dHB1dF9wb2M7CisJaW50IGRwYl9mcmFtZV9jb3VudDsKKwkvKiBuZWVkIHdhaXQgYXV4IGRhdGEgd2hlbiB0aGVyZSBpcyBkYXRhIGFmdGVyIHBpYyBkb25lIGluIGR2IHN0cmVhbSAqLworCWJvb2wgd2FpdF9hdXhfZGF0YV9mbGFnOworCXUzMiB3aXRob3V0X2Rpc3BsYXlfbW9kZTsKKwlpbnQgbG9uZ190ZXJtX3JlZmVyZW5jZV9mbGFnOworfTsKKworCitleHRlcm4gdW5zaWduZWQgaW50IGgyNjRfZGVidWdfZmxhZzsKK2V4dGVybiB1bnNpZ25lZCBpbnQgaDI2NF9kZWJ1Z19tYXNrOworCitpbnQgZHBiX3ByaW50KGludCBpbmRleHQsIGludCBkZWJ1Z19mbGFnLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CisKK2ludCBkcGJfcHJpbnRfY29udChpbnQgaW5kZXgsIGludCBkZWJ1Z19mbGFnLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CisKK3Vuc2lnbmVkIGNoYXIgZHBiX2lzX2RlYnVnKGludCBpbmRleCwgaW50IGRlYnVnX2ZsYWcpOworCitpbnQgcHJlcGFyZV9kaXNwbGF5X2J1ZihzdHJ1Y3QgdmRlY19zICp2ZGVjLCBzdHJ1Y3QgRnJhbWVTdG9yZSAqZnJhbWUpOworCitpbnQgcmVsZWFzZV9idWZfc3BlY19udW0oc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGJ1Zl9zcGVjX251bSk7CisKK3ZvaWQgc2V0X2ZyYW1lX291dHB1dF9mbGFnKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLCBpbnQgaW5kZXgpOworCitpbnQgaXNfdGhlcmVfdW51c2VkX2ZyYW1lX2Zyb21fZHBiKHN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIpOworCitpbnQgaDI2NF9zbGljZV9oZWFkZXJfcHJvY2VzcyhzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiwgaW50ICpmcmFtZV9udW1fZ2FwKTsKKwordm9pZCBkcGJfaW5pdF9nbG9iYWwoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIsCisJaW50IGlkLCBpbnQgYWN0dWFsX2RwYl9zaXplLCBpbnQgbWF4X3JlZmVyZW5jZV9zaXplKTsKKwordm9pZCBpbml0X2NvbG9jYXRlX2J1ZihzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiwgaW50IGNvdW50KTsKKworaW50IHJlbGVhc2VfY29sb2NhdGVfYnVmKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLCBpbnQgaW5kZXgpOworCitpbnQgZ2V0X2ZyZWVfYnVmX2lkeChzdHJ1Y3QgdmRlY19zICp2ZGVjKTsKKworaW50IHN0b3JlX3BpY3R1cmVfaW5fZHBiKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLAorCQkJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqcCwgdW5zaWduZWQgY2hhciBkYXRhX2ZsYWcpOworCitpbnQgcmVsZWFzZV9waWN0dXJlKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLAorCQkJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqcGljKTsKKwordm9pZCByZW1vdmVfZHBiX3BpY3R1cmVzKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiKTsKKwordm9pZCBidWZtZ3JfcG9zdChzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYik7CisKK3ZvaWQgYnVmbWdyX2ZvcmNlX3JlY292ZXIoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIpOworCitpbnQgZ2V0X2xvbmdfdGVybV9mbGFnX2J5X2J1Zl9zcGVjX251bShzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiwKKwlpbnQgYnVmX3NwZWNfbnVtKTsKKwordm9pZCBidWZtZ3JfaDI2NF9yZW1vdmVfdW51c2VkX2ZyYW1lKHN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiLAorCXU4IGZvcmNlX2ZsYWcpOworCit2b2lkIGZsdXNoX2RwYihzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYik7CisKK3ZvaWQgcHJpbnRfcGljX2luZm8oaW50IGRlY2luZGV4LCBjb25zdCBjaGFyICppbmZvLAorCQkJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqcGljLAorCQkJaW50IHNsaWNlX3R5cGUpOwordm9pZCBkdW1wX2RwYihzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiLCB1OCBmb3JjZSk7CisKK3ZvaWQgZHVtcF9waWMoc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIpOworCit2b2lkICogdmgyNjRfZ2V0X2J1ZnNwZWNfbG9jayhzdHJ1Y3QgdmRlY19zICp2ZGVjKTsKKworZW51bSBQaWN0dXJlU3RydWN0dXJlIGdldF9jdXJfc2xpY2VfcGljdHVyZV9zdHJ1Y3QoCisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIpOworCitpbnQgZHBiX2NoZWNrX3JlZl9saXN0X2Vycm9yKAorCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiKTsKKwordm9pZCB1bm1hcmtfZm9yX3JlZmVyZW5jZShzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiLAorCXN0cnVjdCBGcmFtZVN0b3JlICpmcyk7CisKK3ZvaWQgdXBkYXRlX3JlZl9saXN0KHN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIpOworCitpbnQgcG9zdF9waWN0dXJlX2Vhcmx5KHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBpbmRleCk7CisKK2ludCBpc191c2VkX2Zvcl9yZWZlcmVuY2Uoc3RydWN0IEZyYW1lU3RvcmUgKmZzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL2gyNjRfbXVsdGkvdmgyNjQuaCBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlcl92NGwvaDI2NF9tdWx0aS92aDI2NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOGU0YWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL2gyNjRfbXVsdGkvdmgyNjQuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL21lZGlhL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvaDI2NC92aDI2NC5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgVkgyNjRfSAorI2RlZmluZSBWSDI2NF9ICisKK2V4dGVybiBpbnQgcXVlcnlfdmlkZW9fc3RhdHVzKGludCB0eXBlLCBpbnQgKnZhbHVlKTsKKworLyogZXh0ZXJuIHMzMiB2aDI2NF9pbml0KHZvaWQpOyAqLworCitleHRlcm4gczMyIHZoMjY0X3JlbGVhc2Uodm9pZCk7CisKKyNlbmRpZiAvKiBWTVBFRzRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC9oMjY0X211bHRpL3ZtaDI2NC5jIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC9oMjY0X211bHRpL3ZtaDI2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NTM5ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL2gyNjRfbXVsdGkvdm1oMjY0LmMKQEAgLTAsMCArMSwxMTQ2NCBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9hbXBvcnRzL3ZoMjY0LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKyNkZWZpbmUgREVCVUcKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvYW1zdHJlYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2ZyYW1lX3N5bmMvcHRzc2Vydi5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY2FudmFzL2NhbnZhcy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdmZtL3ZmcmFtZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdmZtL3ZmcmFtZV9wcm92aWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdmZtL3ZmcmFtZV9yZWNlaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmZvcm1hdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZnJhbWVfc3luYy90c3luYy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLWNvbnRpZ3VvdXMuaD4KKyNpbmNsdWRlICIuLi8uLi8uLi9zdHJlYW1faW5wdXQvYW1wb3J0cy9hbXBvcnRzX3ByaXYuaCIKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvZGVjX21tLmg+CisjaW5jbHVkZSAiLi4vLi4vZGVjb2Rlci91dGlscy92ZGVjX2lucHV0LmgiCisvLyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL3RlZS5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvdGVlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQvY2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL3ZkZWNfcmVnLmg+CisjaW5jbHVkZSAiLi4vLi4vZGVjb2Rlci91dGlscy92ZGVjLmgiCisjaW5jbHVkZSAiLi4vLi4vZGVjb2Rlci91dGlscy9hbXZkZWMuaCIKKyNpbmNsdWRlICJ2aDI2NC5oIgorI2luY2x1ZGUgIi4uLy4uLy4uL3N0cmVhbV9pbnB1dC9hbXBvcnRzL3N0cmVhbWJ1Zi5oIgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jb2RlY19tbS9jb25maWdzLmg+CisjaW5jbHVkZSAiLi4vLi4vZGVjb2Rlci91dGlscy9kZWNvZGVyX21tdV9ib3guaCIKKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL2RlY29kZXJfYm1tdV9ib3guaCIKKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL2Zpcm13YXJlLmgiCisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvY29uZmlnX3BhcnNlci5oIgorI2luY2x1ZGUgIi4uLy4uLy4uL2NvbW1vbi9jaGlwcy9kZWNvZGVyX2NwdV92ZXJfaW5mby5oIgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvdmRlY192NGwyX2J1ZmZlcl9vcHMuaCIKKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItbWVtMm1lbS5oPgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvdmRlY19mZWF0dXJlLmgiCisKKyNkZWZpbmUgREVURUNUX1dST05HX01VTFRJX1NMSUNFCisKKy8qCit0byBlbmFibGUgRFYgb2YgZnJhbWUgbW9kZQorI2RlZmluZSBET0xCWV9NRVRBX1NVUFBPUlQgaW4gdWNvZGUKKyovCisKKyN1bmRlZiBwcl9pbmZvCisjZGVmaW5lIHByX2luZm8gcHJpbnRrCisjZGVmaW5lIFZERUNfRFcKKyNkZWZpbmUgREVCVUdfVUNPREUKKyNkZWZpbmUgTUVNX05BTUUgImNvZGVjX20yNjQiCisjZGVmaW5lIE1VTFRJX0lOU1RBTkNFX0ZSQU1FV09SSworLyogI2RlZmluZSBPTkVfQ09MT0NBVEVfQlVGX1BFUl9ERUNPREVfQlVGICovCisjaW5jbHVkZSAiaDI2NF9kcGIuaCIKKy8qICNkZWZpbmUgU0VORF9QQVJBTV9XSVRIX1JFRyAqLworCisjZGVmaW5lIERSSVZFUl9OQU1FICJhbW12ZGVjX2gyNjRfdjRsIgorI2RlZmluZSBEUklWRVJfSEVBREVSX05BTUUgImFtbXZkZWNfaDI2NF9oZWFkZXIiCisKKyNkZWZpbmUgQ0hFQ0tfSU5URVJWQUwgICAgICAgIChIWi8xMDApCisKKyNkZWZpbmUgU0VJX0RBVEFfU0laRQkJCSg4KjEwMjQpCisjZGVmaW5lIFNFSV9JVFVfREFUQV9TSVpFCQkoNCoxMDI0KQorCisjZGVmaW5lIFJBVEVfTUVBU1VSRV9OVU0gOAorI2RlZmluZSBSQVRFX0NPUlJFQ1RJT05fVEhSRVNIT0xEIDUKKyNkZWZpbmUgUkFURV8yMzk3X0ZQUyAgNDAwNCAgIC8qIDIzLjk3ICovCisjZGVmaW5lIFJBVEVfMjVfRlBTICAzODQwICAgLyogMjUgKi8KKyNkZWZpbmUgUkFURV8yOTk3X0ZQUyAgMzIwMyAgIC8qIDI5Ljk3ICovCisjZGVmaW5lIFJBVEVfNTk5NF9GUFMgIDE2MDEgICAvKiA1OS45NCAqLworI2RlZmluZSBSQVRFXzExOTkwX0ZQUyAgODAwICAgLyogMTE5LjkwICovCisjZGVmaW5lIERVUjJQVFMoeCkgKCh4KSo5MC85NikKKyNkZWZpbmUgUFRTMkRVUih4KSAoKHgpKjk2LzkwKQorI2RlZmluZSBEVVIyUFRTX1JFTSh4KSAoeCo5MCAtIERVUjJQVFMoeCkqOTYpCisjZGVmaW5lIEZJWF9GUkFNRV9SQVRFX0NIRUNLX0lGUkFNRV9OVU0gMgorCisjZGVmaW5lIEZJWF9GUkFNRV9SQVRFX09GRiAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEZJWF9GUkFNRV9SQVRFX09OICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEZJWF9GUkFNRV9SQVRFX1NNT09USF9DSEVDS0lORyAgICAyCisKKyNkZWZpbmUgREVDX0NPTlRST0xfRkxBR19GT1JDRV8yOTk3XzEwODBQX0lOVEVSTEFDRSAweDAwMDEKKyNkZWZpbmUgREVDX0NPTlRST0xfRkxBR19GT1JDRV8yNTAwXzU3NlBfSU5URVJMQUNFICAweDAwMDIKKyNkZWZpbmUgREVDX0NPTlRST0xfRkxBR19GT1JDRV9SQVRFXzIzOTdfRlBTX0ZJWF9GUkFNRV9SQVRFICAweDAwMTAKKyNkZWZpbmUgREVDX0NPTlRST0xfRkxBR19GT1JDRV9SQVRFXzI5OTdfRlBTX0ZJWF9GUkFNRV9SQVRFICAweDAwMjAKKworI2RlZmluZSBERUNPREVfSUQoaHcpIChod190b192ZGVjKGh3KS0+aWQpCisKKyNkZWZpbmUgUkFURV9NRUFTVVJFX05VTSA4CisjZGVmaW5lIFJBVEVfQ09SUkVDVElPTl9USFJFU0hPTEQgNQorI2RlZmluZSBSQVRFXzI0X0ZQUyAgNDAwNAkvKiAyMy45NyAqLworI2RlZmluZSBSQVRFXzI1X0ZQUyAgMzg0MAkvKiAyNSAqLworI2RlZmluZSBEVVIyUFRTKHgpICgoeCkqOTAvOTYpCisjZGVmaW5lIFBUUzJEVVIoeCkgKCh4KSo5Ni85MCkKKyNkZWZpbmUgRFVSMlBUU19SRU0oeCkgKHgqOTAgLSBEVVIyUFRTKHgpKjk2KQorI2RlZmluZSBGSVhfRlJBTUVfUkFURV9DSEVDS19JRFJGUkFNRV9OVU0gMgorCisjZGVmaW5lIEFMSUdOX1dJRFRIKHgpIChBTElHTigoeCksIDY0KSkKKyNkZWZpbmUgQUxJR05fSEVJR0hUKHgpIChBTElHTigoeCksIDMyKSkKKworI2RlZmluZSBIMjY0X0RFVl9OVU0gICAgICAgIDkKKworI2RlZmluZSBDT05TVFJBSU5fTUFYX0JVRl9OVU0KKworI2RlZmluZSBIMjY0X01NVQorI2RlZmluZSBWSURFT19TSUdOQUxfVFlQRV9BVkFJTEFCTEVfTUFTSwkweDIwMDAwMDAwCisjZGVmaW5lIElOVkFMSURfSURYIC0xICAvKiBJbnZhbGlkIGJ1ZmZlciBpbmRleC4qLworCitzdGF0aWMgaW50IG1tdV9lbmFibGU7CisvKm1tdSBkbyBub3Qgc3VwcG9ydCBtYmFmZiovCitzdGF0aWMgaW50IGZvcmNlX2VuYWJsZV9tbXUgPSAwOwordW5zaWduZWQgaW50IGgyNjRfZGVidWdfZmxhZzsgLyogMHhhMDAwMDAwMDsgKi8KK3Vuc2lnbmVkIGludCBoMjY0X2RlYnVnX21hc2sgPSAweGZmOworCS8qCisJICpoMjY0X2RlYnVnX2NtZDoKKwkgKgkweDF4eCwgZm9yY2UgZGVjb2RlciBpZCBvZiB4eCB0byBiZSBkaXNjb25uZWN0ZWQKKwkgKi8KK3Vuc2lnbmVkIGludCBoMjY0X2RlYnVnX2NtZDsKKworc3RhdGljIGludCByZWZfYl9mcmFtZV9lcnJvcl9tYXhfY291bnQgPSA1MDsKKworc3RhdGljIHVuc2lnbmVkIGludCBkZWNfY29udHJvbCA9CisJREVDX0NPTlRST0xfRkxBR19GT1JDRV8yOTk3XzEwODBQX0lOVEVSTEFDRSB8CisJREVDX0NPTlRST0xfRkxBR19GT1JDRV8yNTAwXzU3NlBfSU5URVJMQUNFOworCitzdGF0aWMgdW5zaWduZWQgaW50IGZvcmNlX3JhdGVfc3RyZWFtYmFzZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZm9yY2VfcmF0ZV9mcmFtZWJhc2U7CitzdGF0aWMgdW5zaWduZWQgaW50IGZvcmNlX2Rpc3BfYnVmc3BlY19udW07CitzdGF0aWMgdW5zaWduZWQgaW50IGZpeGVkX2ZyYW1lX3JhdGVfbW9kZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXJyb3JfcmVjb3ZlcnlfbW9kZV9pbjsKK3N0YXRpYyBpbnQgc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCA9IDB4NDAwMDsKK3N0YXRpYyBpbnQgcHJlX2RlY29kZV9idWZfbGV2ZWwgPSAweDEwMDA7CitzdGF0aWMgaW50IHN0cmVhbV9tb2RlX3N0YXJ0X251bSA9IDQ7CitzdGF0aWMgdW5zaWduZWQgaW50IGNvbG9jYXRlX29sZF9jYWw7CisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorLyp0byBtYWtlIHJlb3JkZXIgc2l6ZSBkaWZmZXJlbmNlIG9mIGJsIGFuZCBlbCBub3QgdG9vIGJpZyovCitzdGF0aWMgdW5zaWduZWQgaW50IHJlb3JkZXJfZHBiX3NpemVfbWFyZ2luX2R2ID0gMTY7CisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmVvcmRlcl9kcGJfc2l6ZV9tYXJnaW4gPSA2Oworc3RhdGljIHVuc2lnbmVkIGludCByZWZlcmVuY2VfYnVmX21hcmdpbiA9IDQ7CisKKyNpZmRlZiBDT05TVFJBSU5fTUFYX0JVRl9OVU0KK3N0YXRpYyB1MzIgcnVuX3JlYWR5X21heF92Zl9vbmx5X251bTsKK3N0YXRpYyB1MzIgcnVuX3JlYWR5X2Rpc3BsYXlfcV9udW07CisJLyowOiBub3QgY2hlY2sKKwkgIDB4ZmY6IG1EUEIuc2l6ZQorCSAgKi8KK3N0YXRpYyB1MzIgcnVuX3JlYWR5X21heF9idWZfbnVtID0gMHhmZjsKKyNlbmRpZgorCitzdGF0aWMgdTMyIHJ1bl9yZWFkeV9taW5fYnVmX251bSA9IDI7CisKKyNkZWZpbmUgVkRFQ19BU1NJU1RfQ0FOVkFTX0JMSzMyCQkweDUKKworCitzdGF0aWMgdW5zaWduZWQgaW50IG1heF9hbGxvY19idWZfY291bnQ7CitzdGF0aWMgdW5zaWduZWQgaW50IGRlY29kZV90aW1lb3V0X3ZhbCA9IDEwMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXJyb3JkYXRhX3RpbWVvdXRfdmFsID0gNTA7CitzdGF0aWMgdW5zaWduZWQgaW50IGdldF9kYXRhX3RpbWVvdXRfdmFsID0gMjAwMDsKKyNpZiAxCisvKiBIMjY0X0RBVEFfUkVRVUVTVCBkb2VzIG5vdCB3b3JrLCBkaXNhYmxlIGl0LAorZGVjb2RlIGhhcyBlcnJvciBmb3IgZGF0YSBpbiBub25lIGNvbnRpbnVvdXMgYWRkcmVzcworKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZnJhbWVfbWF4X2RhdGFfcGFja2V0OworI2Vsc2UKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZnJhbWVfbWF4X2RhdGFfcGFja2V0ID0gODsKKyNlbmRpZgorc3RhdGljIHVuc2lnbmVkIGludCByYWRyOworc3RhdGljIHVuc2lnbmVkIGludCBydmFsOworc3RhdGljIHUzMiBlbmRpYW4gPSAweGZmMDsKKworLyoKKwl1ZGVidWdfZmxhZzoKKwliaXQgMCwgZW5hYmxlIHVjb2RlIHByaW50CisJYml0IDEsIGVuYWJsZSB1Y29kZSBkZXRhaWwgcHJpbnQKKwliaXQgMywgZGlzYWJsZSB1Y29kZSB3YXRjaGRvZworCWJpdCBbMzE6MTZdIG5vdCAwLCBwb3MgdG8gZHVtcCBsbWVtCisJCWJpdCAyLCBwb3AgYml0cyB0byBsbWVtCisJCWJpdCBbMTE6OF0sIHByZS1wb3AgYml0cyBmb3IgYWxpZ25tZW50ICh3aGVuIGJpdCAyIGlzIDEpCisqLworc3RhdGljIHUzMiB1ZGVidWdfZmxhZzsKKy8qCisJd2hlbiB1ZGVidWdfZmxhZ1sxOjBdIGlzIG5vdCAwCisJdWRlYnVnX3BhdXNlX3BvcyBub3QgMCwKKwkJcGF1c2UgcG9zaXRpb24KKyovCitzdGF0aWMgdTMyIHVkZWJ1Z19wYXVzZV9wb3M7CisvKgorCXdoZW4gdWRlYnVnX2ZsYWdbMTowXSBpcyBub3QgMAorCWFuZCB1ZGVidWdfcGF1c2VfcG9zIGlzIG5vdCAwLAorCQlwYXVzZSBvbmx5IHdoZW4gREVCVUdfUkVHMiBpcyBlcXVhbCB0byB0aGlzIHZhbAorKi8KK3N0YXRpYyB1MzIgdWRlYnVnX3BhdXNlX3ZhbDsKKworc3RhdGljIHUzMiB1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeDsKKworc3RhdGljIHVuc2lnbmVkIGludCBkaXNwX3ZmcmFtZV92YWx2ZV9sZXZlbDsKKworc3RhdGljIHVuc2lnbmVkIGludCBtYXhfZGVjb2RlX2luc3RhbmNlX251bSA9IEgyNjRfREVWX05VTTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVjb2RlX2ZyYW1lX2NvdW50W0gyNjRfREVWX05VTV07CitzdGF0aWMgdW5zaWduZWQgaW50IGRpc3BsYXlfZnJhbWVfY291bnRbSDI2NF9ERVZfTlVNXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X3Byb2Nlc3NfdGltZVtIMjY0X0RFVl9OVU1dOworc3RhdGljIHVuc2lnbmVkIGludCBtYXhfZ2V0X2ZyYW1lX2ludGVydmFsW0gyNjRfREVWX05VTV07CitzdGF0aWMgdW5zaWduZWQgaW50IHJ1bl9jb3VudFtIMjY0X0RFVl9OVU1dOworc3RhdGljIHVuc2lnbmVkIGludCBpbnB1dF9lbXB0eVtIMjY0X0RFVl9OVU1dOworc3RhdGljIHVuc2lnbmVkIGludCBub3RfcnVuX3JlYWR5W0gyNjRfREVWX05VTV07CitzdGF0aWMgdW5zaWduZWQgaW50IHJlZl9mcmFtZV9tYXJrX2ZsYWdbSDI2NF9ERVZfTlVNXSA9Cit7MSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMX07CisKKyNkZWZpbmUgVkRFQ19DTE9DS19BREpVU1RfRlJBTUUgMzAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2xrX2Fkal9mcmFtZV9jb3VudDsKKworLyoKKyAqYml0WzM6MF06IDAsIHJ1biA7IDEsIHBhdXNlOyAzLCBzdGVwCisgKmJpdFs0XTogMSwgc2NoZWR1bGUgcnVuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RlcFtIMjY0X0RFVl9OVU1dOworCisjZGVmaW5lIEFVWF9CVUZfQUxJR04oYWRyKSAoKGFkciArIDB4ZikgJiAofjB4ZikpCitzdGF0aWMgdTMyIHByZWZpeF9hdXhfYnVmX3NpemUgPSAoMTYgKiAxMDI0KTsKK3N0YXRpYyB1MzIgc3VmZml4X2F1eF9idWZfc2l6ZTsKKworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCitzdGF0aWMgdTMyIGR2X3RvZ2dsZV9wcm92X25hbWU7CisKK3N0YXRpYyB1MzIgZG9sYnlfbWV0YV93aXRoX2VsOworI2VuZGlmCisKKy8qCisJYml0WzhdCisJCTA6IHVzZSBzeXNfaW5mb1tiaXQgM10KKwkJbm90IDA6dXNlIGlfb25seV9mbGFnWzc6MF0KKwkJCWJpdFs3OjBdOgorCQkJCWJpdCAwLCAxOiBvbmx5IGRpc3BsYXkgSSBwaWN0dXJlOworCQkJCWJpdCAxLCAxOiBvbmx5IGRlY29kZSBJIHBpY3R1cmU7CisqLworc3RhdGljIHVuc2lnbmVkIGludCBpX29ubHlfZmxhZzsKKworLyoKKwllcnJvcl9wcm9jX3BvbGljeToKKwliaXRbMF0gc2VuZF9lcnJvcl9mcmFtZV9mbGFnOworCQkodmFsaWQgd2hlbiBiaXRbMzFdIGlzIDEsIG90aGVyd2lzZSB1c2Ugc3lzaW5mbykKKwliaXRbMV0gZG8gbm90IGRlY29kZSBpZiBjb25maWdfZGVjb2RlX2J1ZigpIGZhaWwKKwliaXRbMl0gZm9yY2UgcmVsZWFzZSBidWYgaWYgaW4gZGVhZGxvY2sKKwliaXRbM10gZm9yY2Ugc2xpZGluZyB3aW5kb3cgcmVmX2ZyYW1lc19pbl9idWZmZXIgPiBudW1fcmVmX2ZyYW1lcworCWJpdFs0XSBjaGVjayBpbmFjdGl2ZSBvZiByZWNlaXZlcgorCWJpdFs1XSByZXNldCBidWZmbWdyIGlmIGluIGRlYWRsb2NrCisJYml0WzZdIHJlc2V0IGJ1ZmZtZ3IgaWYgYnVmc3BlYywgY29sbG9jYXRlIGJ1ZiwgcGljIGFsbG9jIGZhaWwKKwliaXRbN10gcmVzZXQgYnVmZm1nciBpZiBkcGIgZXJyb3IKKworCWJpdFs4XSBjaGVjayB0b3RhbCBtYngvbWJ5IG9mIGRlY29kZWQgZnJhbWUKKwliaXRbOV0gY2hlY2sgRVJST1JfU1RBVFVTX1JFRworCWJpdFsxMF0gY2hlY2sgcmVmZXJlbmNlIGxpc3QKKwliaXRbMTFdIG1hcmsgZXJyb3IgaWYgZHBiIGVycm9yCisJYml0WzEyXSBpX29ubHkgd2hlbiBlcnJvciBoYXBwZW4KKwliaXRbMTNdIDA6IG1hcmsgZXJyb3IgYWNjb3JkaW5nIHRvIGxhc3QgcGljLCAxOiBpZ25vcmUgbWFyayBlcnJvcgorCWJpdFsxNF0gMDogcmVzdWx0IGRvbmUgd2hlbiB0aW1lb3V0IGZyb20gdWNvZGUuIDE6IHJlc2V0IGJ1Zm1nciB3aGVuIHRpbWVvdXQuCisJYml0WzE1XSAxOiBkcGJfZnJhbWVfY291bnQgSWYgdGhlIGRwYl9mcmFtZV9jb3VudCBkaWZmZXJlbmNlIGlzIGxhcmdlLCBpdCBtb3ZlcyBvdXQgb2YgdGhlIERQQiBidWZmZXIuCisJYml0WzE2XSAxOiBjaGVjayBzbGljZSBoZWFkZXIgbnVtYmVyLgorCWJpdFsxN10gMTogSWYgdGhlIGRlY29kZWQgTWIgY291bnQgaXMgaW5zdWZmaWNpZW50IGJ1dCBncmVhdGVyIHRoYW4gdGhlIHRocmVzaG9sZCwgaXQgaXMgY29uc2lkZXJlZCB0aGUgY29ycmVjdCBmcmFtZS4KKwliaXRbMThdIDE6IHRpbWUgb3V0IHN0YXR1cywgc3RvcmUgcGljIHRvIGRwYiBidWZmZXIuCisJYml0WzE5XSAxOiBJZiBhIGxvdCBiIGZyYW1lcyBhcmUgd3JvbmcgY29uc2VjdXRpdmVseSwgdGhlIERQQiBxdWV1ZSByZXNldC4KKwliaXRbMjBdIDE6IGZpeGVkIHNvbWUgZXJyb3Igc3RyZWFtIHdpbGwgbGVhZCB0byB0aGUgZGlmZnVzaW9uIG9mIHRoZSBlcnJvciwgcmVzdWx0aW5nIHBsYXliYWNrIHN0dWNrLgorCWJpdFsyMV0gMTogZml4ZWQgRFZCIGxvb3AgcGxheWJhY2sgY2F1c2UgamV0dGVyIGlzc3VlLgorCWJpdFsyMl0gMTogSW4gc3RyZWFtaW5nIG1vZGUsIHN1cHBvcnQgZm9yIGRpc2NhcmRpbmcgZGF0YS4KKwliaXRbMjNdIDA6IHNldCBlcnJvciBmbGFnIG9uIGZyYW1lIG51bWJlciBnYXAgZXJyb3IgYW5kIGRyb3AgaXQsIDE6IGlnbm9yZSBlcnJvci4KKyovCitzdGF0aWMgdW5zaWduZWQgaW50IGVycm9yX3Byb2NfcG9saWN5ID0gMHgzZkNmYjY7IC8qMHgxZjE0Ki8KKworc3RhdGljIHVuc2lnbmVkIGludCB2NGxfZXJyb3JfcG9saWN5ID0gMHg4MDE3QzNCNTsgLy9kZWZhdWx0CisKKy8qCisJZXJyb3Jfc2tpcF9jb3VudDoKKwliaXRbMTE6MF0gZXJyb3Igc2tpcCBmcmFtZSBjb3VudAorCWJpdFsxNToxMl0gZXJyb3Igc2tpcCBpIHBpY3R1cmUgY291bnQKKyovCitzdGF0aWMgdW5zaWduZWQgaW50IGVycm9yX3NraXBfY291bnQgPSAoMHgyIDw8IDEyKSB8IDB4NDA7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZm9yY2Vfc2xpZGluZ19tYXJnaW47CisvKgorCWJpdFsxOjBdOgorCTAsIHN0YXJ0IHBsYXlpbmcgZnJvbSBhbnkgZnJhbWUKKwkxLCBzdGFydCBwbGF5aW5nIGZyb20gSSBmcmFtZQorCQliaXRbMTU6OF06IHRoZSBjb3VudCBvZiBza2lwIGZyYW1lcyBhZnRlciBmaXJzdCBJCisJMiwgc3RhcnQgcGxheWluZyBmcm9tIHNlY29uZCBJIGZyYW1lIChkZWNvZGUgZnJvbSB0aGUgZmlyc3QgSSkKKwkJYml0WzE1OjhdOiB0aGUgbWF4IGNvdW50IG9mIHNraXAgZnJhbWVzIGFmdGVyIGZpcnN0IEkKKwkzLCBzdGFydCBwbGF5aW5nIGZyb20gSURSCisqLworc3RhdGljIHVuc2lnbmVkIGludCBmaXJzdF9pX3BvbGljeSA9IDE7CisKKy8qCisJZmFzdF9vdXRwdXRfZW5hYmxlOgorCWJpdCBbMF0sIG91dHB1dCBmcmFtZSBpZiB0aGVyZSBpcyBJRFIgaW4gbGlzdAorCWJpdCBbMV0sIG91dHB1dCBmcmFtZSBpZiB0aGUgY3VycmVudCBwb2MgaXMgMSBiaWcgdGhhbiB0aGUgcHJldmlvdXMgcG9jCisJYml0IFsyXSwgaWYgZXZlbiBwb2Mgb25seSwgb3V0cHV0IGZyYW1lIGlmdGhlIGN1dXJlbnQgcG9jCisJCQlpcyAyIGJpZyB0aGFuIHRoZSBwcmV2aW91cyBwb2MKKwliaXQgWzNdLCAgaXAgb25seQorKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZmFzdF9vdXRwdXRfZW5hYmxlID0gSDI2NF9PVVRQVVRfTU9ERV9OT1JNQUw7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZW5hYmxlX2l0dV90MzUgPSAxOworCitzdGF0aWMgdW5zaWduZWQgaW50IGZybWJhc2VfY29udF9iaXRsZXZlbCA9IDB4NDA7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZnJtYmFzZV9jb250X2JpdGxldmVsMiA9IDB4MTsKKworc3RhdGljIHVuc2lnbmVkIGludCBjaGVja19zbGljZV9udW0gPSAzMDsKKworc3RhdGljIHVuc2lnbmVkIGludCBtYl9jb3VudF90aHJlc2hvbGQgPSA1OyAvKnBlcmNlbnRhZ2UqLworCisjZGVmaW5lIE1IMjY0X1VTRVJEQVRBX0VOQUJMRQorCisvKiBET1VCTEVfV1JJVEVfTU9ERSBpcyBlbmFibGVkIG9ubHkgd2hlbiBOVjIxIDggYml0IG91dHB1dCBpcyBuZWVkZWQgKi8KKy8qIGhldmMtPmRvdWJsZV93cml0ZV9tb2RlOgorCTAsIG5vIGRvdWJsZSB3cml0ZQorCTEsIDE6MSByYXRpbworCTIsICgxLzQpOigxLzQpIHJhdGlvCisJMywgKDEvNCk6KDEvNCkgcmF0aW8sIHdpdGggYm90aCBjb21wcmVzc2VkIGZyYW1lIGluY2x1ZGVkCisJNCwgKDEvMik6KDEvMikgcmF0aW8KKwkweDEwLCBkb3VibGUgd3JpdGUgb25seQorCTB4MTAwMDA6IHZkZWMgZHcgaG9yaXpvdGFsIDEvMgorCTB4MjAwMDA6IHZkZWMgZHcgaG9yaXpvdGFsL3ZlcnRpY2FsICAxLzIKKyovCitzdGF0aWMgdTMyIGRvdWJsZV93cml0ZV9tb2RlOworc3RhdGljIHUzMiB3aXRob3V0X2Rpc3BsYXlfbW9kZTsKKworc3RhdGljIGludCBsb29wX3BsYXliYWNrX3BvY190aHJlc2hvbGQgPSA0MDA7CitzdGF0aWMgaW50IHBvY190aHJlc2hvbGQgPSA1MDsKKworc3RhdGljIHUzMiBsb29rdXBfY2hlY2tfY29udXQgPSAzMDsKKworCisvKgorICpbMzowXSAwOiBkZWZhdWx0IHVzZSBjb25maWcgZnJvbSBvbXguCisgKiAgICAgIDE6IGZvcmNlIGVuYWJsZSBmZW5jZS4KKyAqICAgICAgMjogZGlzYWJsZSBmZW5jZS4KKyAqWzc6NF0gMDogZmVuY2UgdXNlIGZvciBkcml2ZXIuCisgKiAgICAgIDE6IGZlbmNlIGZkIHVzZSBmb3IgYXBwLgorICovCitzdGF0aWMgdTMyIGZvcmNlX2NvbmZpZ19mZW5jZTsKKworc3RhdGljIHUzMiBhZGp1c3RfZHBiX3NpemUgPSAxMzsKKworI2RlZmluZSBJU19WREVDX0RXKGh3KSAgKGh3LT5kb3VibGVfd3JpdGVfbW9kZSA+PiAxNiAmIDB4ZikKKworc3RhdGljIHZvaWQgdm1oMjY0X2R1bXBfc3RhdGUoc3RydWN0IHZkZWNfcyAqdmRlYyk7CisKKyNkZWZpbmUgaXNfaW5fcGFyc2luZ19zdGF0ZShzdGF0dXMpIFwKKwkJKChzdGF0dXMgPT0gSDI2NF9BQ1RJT05fU0VBUkNIX0hFQUQpIHx8IFwKKwkJCSgoc3RhdHVzICYgMHhmMCkgPT0gMHg4MCkpCisKKyNkZWZpbmUgaXNfaW50ZXJsYWNlKGZyYW1lKQlcCisJCQkoKGZyYW1lLT5mcmFtZSAmJlwKKwkJCWZyYW1lLT50b3BfZmllbGQgJiZcCisJCQlmcmFtZS0+Ym90dG9tX2ZpZWxkICYmXAorCQkJKCFmcmFtZS0+ZnJhbWUtPmNvZGVkX2ZyYW1lKSkgfHwgXAorCQkJKGZyYW1lLT5mcmFtZSAmJiBcCisJCQkgZnJhbWUtPmZyYW1lLT5jb2RlZF9mcmFtZSAmJiBcCisJCQkgKCFmcmFtZS0+ZnJhbWUtPmZyYW1lX21ic19vbmx5X2ZsYWcpICYmIFwKKwkJCSBmcmFtZS0+ZnJhbWUtPnN0cnVjdHVyZSA9PSBGUkFNRSkpCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBjbG9zZV90byhpbnQgYSwgaW50IGIsIGludCBtKQoreworCXJldHVybiAoYWJzKGEgLSBiKSA8IG0pID8gdHJ1ZSA6IGZhbHNlOworfQorCisjaWYgMAorI2RlZmluZSBoMjY0X2FsbG9jX2h3X3N0cnUoZGV2LCBzaXplLCBvcHQpIGRldm1fa3phbGxvYyhkZXYsIHNpemUsIG9wdCkKKyNkZWZpbmUgaDI2NF9mcmVlX2h3X3N0cnUoZGV2LCBodykgZGV2bV9rZnJlZShkZXYsIGh3KQorI2Vsc2UKKyNkZWZpbmUgaDI2NF9hbGxvY19od19zdHJ1KGRldiwgc2l6ZSwgb3B0KSB2emFsbG9jKHNpemUpCisjZGVmaW5lIGgyNjRfZnJlZV9od19zdHJ1KGRldiwgaHcpIHZmcmVlKGh3KQorI2VuZGlmCisKKy8qICNpZiBNRVNPTl9DUFVfVFlQRSA+PSBNRVNPTl9DUFVfVFlQRV9NRVNPTjYgKi8KKyNkZWZpbmUgTlYyMQorLyogI2VuZGlmICovCisKKy8qIDEyTSBmb3IgTDQxICovCisjZGVmaW5lIE1BWF9EUEJfQlVGRl9TSVpFICAgICAgICgxMioxMDI0KjEwMjQpCisjZGVmaW5lIERFRkFVTFRfTUVNX1NJWkUgICAgICAgICgzMioxMDI0KjEwMjQpCisjZGVmaW5lIEFWSUxfRFBCX0JVRkZfU0laRSAgICAgIDB4MDFlYzIwMDAKKworI2RlZmluZSBERUZfQlVGX1NUQVJUX0FERFIJCQkweDAwMDAwMDAwCisjZGVmaW5lIG1lbV9zcHNfYmFzZQkJCQkweDAxYzNjMDAKKyNkZWZpbmUgbWVtX3Bwc19iYXNlCQkJCTB4MDFjYmMwMAorLyojZGVmaW5lIFZfQlVGX0FERFJfT0ZGU0VUICAgICAgICAgICAgICgweDEzZTAwMCkqLwordTMyIFZfQlVGX0FERFJfT0ZGU0VUID0gMHgyMDAwMDA7CisjZGVmaW5lIERDQUNfUkVBRF9NQVJHSU4JKDY0ICogMTAyNCkKKworCisjZGVmaW5lIEVYVEVORF9TQVIgICAgICAgICAgICAgICAgICAgICAgMHhmZgorI2RlZmluZSBCVUZTUEVDX1BPT0xfU0laRQkJNjQKKyNkZWZpbmUgVkZfUE9PTF9TSVpFICAgICAgICA2NAorI2RlZmluZSBWRl9QT09MX05VTQkJCTIKKyNkZWZpbmUgTUFYX1ZGX0JVRl9OVU0gICAgICAgICAgMjcKKyNkZWZpbmUgQk1NVV9NQVhfQlVGRkVSUwkoQlVGU1BFQ19QT09MX1NJWkUgKyAzKQorI2RlZmluZSBCTU1VX1JFRl9JRFgJKEJVRlNQRUNfUE9PTF9TSVpFKQorI2RlZmluZSBCTU1VX0RQQl9JRFgJKEJVRlNQRUNfUE9PTF9TSVpFICsgMSkKKyNkZWZpbmUgQk1NVV9FWFRJRl9JRFgJKEJVRlNQRUNfUE9PTF9TSVpFICsgMikKKyNkZWZpbmUgRVhUSUZfQlVGX1NJWkUgICAoMHgxMDAwMCAqIDIpCisKKyNkZWZpbmUgSEVBREVSX0JVRkZFUl9JRFgobikgKG4pCisjZGVmaW5lIFZGX0JVRkZFUl9JRFgobikJKG4pCisKKworI2RlZmluZSBQVVRfSU5URVJWQUwgICAgICAgIChIWi8xMDApCisjZGVmaW5lIE5PX0RJU1BfV0RfQ09VTlQgICAgKDMgKiBIWiAvIFBVVF9JTlRFUlZBTCkKKworI2RlZmluZSBNTVVfTUFYX0JVRkZFUlMJQlVGU1BFQ19QT09MX1NJWkUKKyNkZWZpbmUgU1dJVENISU5HX1NUQVRFX09GRiAgICAgICAwCisjZGVmaW5lIFNXSVRDSElOR19TVEFURV9PTl9DTUQzICAgMQorI2RlZmluZSBTV0lUQ0hJTkdfU1RBVEVfT05fQ01EMSAgIDIKKworCisKKyNkZWZpbmUgSU5DUFRSKHApIHB0cl9hdG9taWNfd3JhcF9pbmMoJnApCisKKyNkZWZpbmUgU0xJQ0VfVFlQRV9JIDIKKyNkZWZpbmUgU0xJQ0VfVFlQRV9QIDUKKyNkZWZpbmUgU0xJQ0VfVFlQRV9CIDYKKworc3RydWN0IGJ1ZmZlcl9zcGVjX3MgeworCS8qCisJdXNlZDoKKwktMSwgbm9uZSBhbGxvY2F0ZWQKKwkwLCBhbGxvY2F0ZWQsIGZyZWUKKwkxLCB1c2VkIGJ5IGRwYgorCTIsIGluIGRpc3AgcXVldWU7CisJMywgaW4gZGlzcCBxdWV1ZSwgaXNvbGF0ZWQsCisJCWRvIG5vdCB1c2UgZm9yIGRwYiB3aGVuIHZmX3B1dDsKKwk0LCB0byByZWxlYXNlCisJNSwgaW4gZGlzcCBxdWV1ZSwgaXNvbGF0ZWQgKGJ1dCBub3QgdG8gcmVsZWFzZSkKKwkJZG8gbm90IHVzZSBmb3IgZHBiIHdoZW4gdmZfcHV0OworCSovCisJdW5zaWduZWQgaW50IHVzZWQ7CisJdW5zaWduZWQgaW50IGluZm8wOworCXVuc2lnbmVkIGludCBpbmZvMTsKKwl1bnNpZ25lZCBpbnQgaW5mbzI7CisJdW5zaWduZWQgaW50IHlfYWRkcjsKKwl1bnNpZ25lZCBpbnQgdV9hZGRyOworCXVuc2lnbmVkIGludCB2X2FkZHI7CisKKwlpbnQgeV9jYW52YXNfaW5kZXg7CisJaW50IHVfY2FudmFzX2luZGV4OworCWludCB2X2NhbnZhc19pbmRleDsKKworI2lmZGVmIFZERUNfRFcKKwl1bnNpZ25lZCBpbnQgdmRlY19kd195X2FkZHI7CisJdW5zaWduZWQgaW50IHZkZWNfZHdfdV9hZGRyOworCXVuc2lnbmVkIGludCB2ZGVjX2R3X3ZfYWRkcjsKKworCWludCB2ZGVjX2R3X3lfY2FudmFzX2luZGV4OworCWludCB2ZGVjX2R3X3VfY2FudmFzX2luZGV4OworCWludCB2ZGVjX2R3X3ZfY2FudmFzX2luZGV4OworI2lmZGVmIE5WMjEKKwlzdHJ1Y3QgY2FudmFzX2NvbmZpZ19zIHZkZWNfZHdfY2FudmFzX2NvbmZpZ1syXTsKKyNlbHNlCisJc3RydWN0IGNhbnZhc19jb25maWdfcyB2ZGVjX2R3X2NhbnZhc19jb25maWdbM107CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgTlYyMQorCXN0cnVjdCBjYW52YXNfY29uZmlnX3MgY2FudmFzX2NvbmZpZ1syXTsKKyNlbHNlCisJc3RydWN0IGNhbnZhc19jb25maWdfcyBjYW52YXNfY29uZmlnWzNdOworI2VuZGlmCisJdW5zaWduZWQgbG9uZyBjbWFfYWxsb2NfYWRkcjsKKwl1bnNpZ25lZCBpbnQgYnVmX2FkcjsKKyNpZmRlZglIMjY0X01NVQorCXVuc2lnbmVkIGxvbmcgYWxsb2NfaGVhZGVyX2FkZHI7CisjZW5kaWYKKwljaGFyICphdXhfZGF0YV9idWY7CisJaW50IGF1eF9kYXRhX3NpemU7CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwl1bnNpZ25lZCBjaGFyIGR2X2VuaGFuY2VfZXhpc3Q7CisjZW5kaWYKKwlpbnQgY2FudmFzX3BvczsKKwlpbnQgdmZfcmVmOworCS8qdW5zaWduZWQgaW50IGNvbXBfYm9keV9zaXplOyovCisJdW5zaWduZWQgaW50IGR3X3lfYWRyOworCXVuc2lnbmVkIGludCBkd191X3ZfYWRyOworCWludCBmc19pZHg7CisJaW50IGN0eF9idWZfaWR4OworfTsKKworI2RlZmluZSBBVVhfREFUQV9TSVpFKHBpYykgKGh3LT5idWZmZXJfc3BlY1twaWMtPmJ1Zl9zcGVjX251bV0uYXV4X2RhdGFfc2l6ZSkKKyNkZWZpbmUgQVVYX0RBVEFfQlVGKHBpYykgKGh3LT5idWZmZXJfc3BlY1twaWMtPmJ1Zl9zcGVjX251bV0uYXV4X2RhdGFfYnVmKQorI2RlZmluZSBERUxfRVhJU1QoaCwgcCkgKGgtPmJ1ZmZlcl9zcGVjW3AtPmJ1Zl9zcGVjX251bV0uZHZfZW5oYW5jZV9leGlzdCkKKworCisjZGVmaW5lIHZkZWNfZHdfc3BlYzJjYW52YXMoeCkgIFwKKwkoKCh4KS0+dmRlY19kd192X2NhbnZhc19pbmRleCA8PCAxNikgfCBcCisJICgoeCktPnZkZWNfZHdfdV9jYW52YXNfaW5kZXggPDwgOCkgIHwgXAorCSAoKHgpLT52ZGVjX2R3X3lfY2FudmFzX2luZGV4IDw8IDApKQorCisKKyNkZWZpbmUgc3BlYzJjYW52YXMoeCkgIFwKKwkoKCh4KS0+dl9jYW52YXNfaW5kZXggPDwgMTYpIHwgXAorCSAoKHgpLT51X2NhbnZhc19pbmRleCA8PCA4KSAgfCBcCisJICgoeCktPnlfY2FudmFzX2luZGV4IDw8IDApKQorCisjZGVmaW5lIEZSQU1FX0lOREVYKHZmX2luZGV4KSAodmZfaW5kZXggJiAweGZmKQorI2RlZmluZSBCVUZTUEVDX0lOREVYKHZmX2luZGV4KSAoKHZmX2luZGV4ID4+IDgpICYgMHhmZikKKyNkZWZpbmUgVkZfSU5ERVgoZnJtX2lkeCwgYnVmc3BlY19pZHgpIChmcm1faWR4IHwgKGJ1ZnNwZWNfaWR4IDw8IDgpKQorCitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2aDI2NF92Zl9wZWVrKHZvaWQgKik7CitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2aDI2NF92Zl9nZXQodm9pZCAqKTsKK3N0YXRpYyB2b2lkIHZoMjY0X3ZmX3B1dChzdHJ1Y3QgdmZyYW1lX3MgKiwgdm9pZCAqKTsKK3N0YXRpYyBpbnQgdmgyNjRfdmZfc3RhdGVzKHN0cnVjdCB2ZnJhbWVfc3RhdGVzICpzdGF0ZXMsIHZvaWQgKik7CitzdGF0aWMgaW50IHZoMjY0X2V2ZW50X2NiKGludCB0eXBlLCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlX2RhdGEpOworc3RhdGljIHZvaWQgdmgyNjRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworc3RhdGljIHZvaWQgdmgyNjRfdGltZW91dF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgdm9pZCB2aDI2NF9ub3RpZnlfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworI2lmZGVmIE1IMjY0X1VTRVJEQVRBX0VOQUJMRQorc3RhdGljIHZvaWQgdXNlcl9kYXRhX3JlYWR5X25vdGlmeV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgdm9pZCB2bWgyNjRfd2FrZXVwX3VzZXJkYXRhX3BvbGwoc3RydWN0IHZkZWNfcyAqdmRlYyk7CisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgdmgyNjRfZGVjX2lkW10gPSAidmgyNjQtZGV2IjsKKworI2RlZmluZSBQUk9WSURFUl9OQU1FICJ2ZGVjLmgyNjQiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmZyYW1lX29wZXJhdGlvbnNfcyB2Zl9wcm92aWRlcl9vcHMgPSB7CisJLnBlZWsgPSB2aDI2NF92Zl9wZWVrLAorCS5nZXQgPSB2aDI2NF92Zl9nZXQsCisJLnB1dCA9IHZoMjY0X3ZmX3B1dCwKKwkuZXZlbnRfY2IgPSB2aDI2NF9ldmVudF9jYiwKKwkudmZfc3RhdGVzID0gdmgyNjRfdmZfc3RhdGVzLAorfTsKKworI2RlZmluZSBERUNfUkVTVUxUX05PTkUgICAgICAgICAgICAgMAorI2RlZmluZSBERUNfUkVTVUxUX0RPTkUgICAgICAgICAgICAgMQorI2RlZmluZSBERUNfUkVTVUxUX0FHQUlOICAgICAgICAgICAgMgorI2RlZmluZSBERUNfUkVTVUxUX0NPTkZJR19QQVJBTSAgICAgMworI2RlZmluZSBERUNfUkVTVUxUX0dFVF9EQVRBICAgICAgICAgNAorI2RlZmluZSBERUNfUkVTVUxUX0dFVF9EQVRBX1JFVFJZICAgNQorI2RlZmluZSBERUNfUkVTVUxUX0VSUk9SICAgICAgICAgICAgNgorI2RlZmluZSBERUNfUkVTVUxUX0VPUyAgICAgICAgICAgICAgNworI2RlZmluZSBERUNfUkVTVUxUX0ZPUkNFX0VYSVQgICAgICAgOAorI2RlZmluZSBERUNfUkVTVUxUX1RJTUVPVVQJCQk5CisjZGVmaW5lIERFQ19SRVNVTFRfTkVFRF9NT1JFX0JVRkZFUiAxMAorCisKKy8qCisgKnN0YXRpYyBjb25zdCBjaGFyICpkZWNfcmVzdWx0X3N0cltdID0geworICogICAgIkRFQ19SRVNVTFRfTk9ORSAgICAgICAgIiwKKyAqICAgICJERUNfUkVTVUxUX0RPTkUgICAgICAgICIsCisgKiAgICAiREVDX1JFU1VMVF9BR0FJTiAgICAgICAiLAorICogICAgIkRFQ19SRVNVTFRfQ09ORklHX1BBUkFNIiwKKyAqICAgICJERUNfUkVTVUxUX0dFVF9EQVRBICAgICIsCisgKiAgICAiREVDX1JFU1VMVF9HRVRfREFfUkVUUlkiLAorICogICAgIkRFQ19SRVNVTFRfRVJST1IgICAgICAgIiwKKyAqfTsKKyAqLworCisjZGVmaW5lIFVDT0RFX0lQX09OTFkgMgorI2RlZmluZSBVQ09ERV9JUF9PTkxZX1BBUkFNIDEKKworI2RlZmluZSBNQ19PRkZTRVRfSEVBREVSICAgIDB4MDAwMAorI2RlZmluZSBNQ19PRkZTRVRfREFUQSAgICAgIDB4MTAwMAorI2RlZmluZSBNQ19PRkZTRVRfTU1DTyAgICAgIDB4MjAwMAorI2RlZmluZSBNQ19PRkZTRVRfTElTVCAgICAgIDB4MzAwMAorI2RlZmluZSBNQ19PRkZTRVRfU0xJQ0UgICAgIDB4NDAwMAorI2RlZmluZSBNQ19PRkZTRVRfTUFJTiAgICAgIDB4NTAwMAorCisjZGVmaW5lIE1DX1RPVEFMX1NJWkUgICAgICAgKCgyMCsxNikqU1pfMUspCisjZGVmaW5lIE1DX1NXQVBfU0laRSAgICAgICAgKDQqU1pfMUspCisjZGVmaW5lIE1PREVfRVJST1IgMAorI2RlZmluZSBNT0RFX0ZVTEwgIDEKKworI2RlZmluZSBERlNfSElHSF9USEVBU0hPTEQgMworCisjZGVmaW5lIElOSVRfRkxBR19SRUcgICAgICAgQVZfU0NSQVRDSF8yCisjZGVmaW5lIEhFQURfUEFESU5HX1JFRyAgICAgQVZfU0NSQVRDSF8zCisjZGVmaW5lIFVDT0RFX1dBVENIRE9HX1JFRyAgIEFWX1NDUkFUQ0hfNworI2RlZmluZSBMTUVNX0RVTVBfQURSICAgICAgIEFWX1NDUkFUQ0hfTAorI2RlZmluZSBERUJVR19SRUcxICAgICAgICAgIEFWX1NDUkFUQ0hfTQorI2RlZmluZSBERUJVR19SRUcyICAgICAgICAgIEFWX1NDUkFUQ0hfTgorI2RlZmluZSBGUkFNRV9DT1VOVEVSX1JFRyAgICAgICBBVl9TQ1JBVENIX0kKKyNkZWZpbmUgUlBNX0NNRF9SRUcgICAgICAgICAgQVZfU0NSQVRDSF9BCisjZGVmaW5lIEgyNjRfREVDT0RFX1NJWkUJQVZfU0NSQVRDSF9FCisjZGVmaW5lIEgyNjRfREVDT0RFX01PREUgICAgQVZfU0NSQVRDSF80CisjZGVmaW5lIEgyNjRfREVDT0RFX1NFUUlORk8JQVZfU0NSQVRDSF81CisjZGVmaW5lIEgyNjRfQVVYX0FEUiAgICAgICAgICAgIEFWX1NDUkFUQ0hfQworI2RlZmluZSBIMjY0X0FVWF9EQVRBX1NJWkUgICAgICBBVl9TQ1JBVENIX0gKKworI2RlZmluZSBIMjY0X0RFQ09ERV9JTkZPICAgICAgICAgIE00X0NPTlRST0xfUkVHIC8qIDB4YzI5ICovCisjZGVmaW5lIERQQl9TVEFUVVNfUkVHICAgICAgIEFWX1NDUkFUQ0hfSgorI2RlZmluZSBFUlJPUl9TVEFUVVNfUkVHCUFWX1NDUkFUQ0hfOQorCS8qCisJTkFMX1NFQVJDSF9DVEw6IGJpdCAwLCBlbmFibGUgaXR1X3QzNQorCU5BTF9TRUFSQ0hfQ1RMOiBiaXQgMSwgZW5hYmxlIG1tdQorCU5BTF9TRUFSQ0hfQ1RMOiBiaXQgMiwgZGV0ZWN0IGZyYW1lX21ic19vbmx5X2ZsYWcgd2hldGhlciBzd2l0Y2ggcmVzb2x1dGlvbgorCU5BTF9TRUFSQ0hfQ1RMOiBiaXQgMTUsYml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcKKwkqLworI2RlZmluZSBOQUxfU0VBUkNIX0NUTAkJQVZfU0NSQVRDSF85CisjZGVmaW5lIE1CWV9NQlggICAgICAgICAgICAgICAgIE1CX01PVElPTl9NT0RFIC8qMHhjMDcqLworCisjZGVmaW5lIERFQ09ERV9NT0RFX1NJTkdMRQkJCQkJMHgwCisjZGVmaW5lIERFQ09ERV9NT0RFX01VTFRJX0ZSQU1FQkFTRQkJCTB4MQorI2RlZmluZSBERUNPREVfTU9ERV9NVUxUSV9TVFJFQU1CQVNFCQkweDIKKyNkZWZpbmUgREVDT0RFX01PREVfTVVMVElfRFZCQUwJCQkJMHgzCisjZGVmaW5lIERFQ09ERV9NT0RFX01VTFRJX0RWRU5MCQkJCTB4NAorc3RhdGljIERFRklORV9NVVRFWCh2bWgyNjRfbXV0ZXgpOworc3RhdGljIERFRklORV9NVVRFWChyZXNldF9tdXRleCk7CisKKworCisjaWZkZWYgTUgyNjRfVVNFUkRBVEFfRU5BQkxFCisKK3N0cnVjdCBtaDI2NF91c2VyZGF0YV9yZWNvcmRfdCB7CisJc3RydWN0IHVzZXJkYXRhX21ldGFfaW5mb190IG1ldGFfaW5mbzsKKwl1MzIgcmVjX3N0YXJ0OworCXUzMiByZWNfbGVuOworfTsKKworc3RydWN0IG1oMjY0X3VkX3JlY29yZF93YWl0X25vZGVfdCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBtaDI2NF91c2VyZGF0YV9yZWNvcmRfdCB1ZF9yZWNvcmQ7Cit9OworI2RlZmluZSBVU0VSREFUQV9GSUZPX05VTSAgICAyNTYKKyNkZWZpbmUgTUFYX0ZSRUVfVVNFUkRBVEFfTk9ERVMJCTUKKworc3RydWN0IG1oMjY0X3VzZXJkYXRhX2luZm9fdCB7CisJc3RydWN0IG1oMjY0X3VzZXJkYXRhX3JlY29yZF90IHJlY29yZHNbVVNFUkRBVEFfRklGT19OVU1dOworCXU4ICpkYXRhX2J1ZjsKKwl1OCAqZGF0YV9idWZfZW5kOworCXUzMiBidWZfbGVuOworCXUzMiByZWFkX2luZGV4OworCXUzMiB3cml0ZV9pbmRleDsKKwl1MzIgbGFzdF93cDsKK307CisKKworI2VuZGlmCisKK3N0cnVjdCBtaDI2NF9mZW5jZV92Zl90IHsKKwl1MzIgdXNlZF9zaXplOworCXN0cnVjdCB2ZnJhbWVfcyAqZmVuY2VfdmZbVkZfUE9PTF9TSVpFXTsKK307CisKKworc3RydWN0IHZkZWNfaDI2NF9od19zIHsKKwlzcGlubG9ja190IGxvY2s7CisJc3BpbmxvY2tfdCBidWZzcGVjX2xvY2s7CisJaW50IGlkOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRmb3JtX2RldjsKKwl1bnNpZ25lZCBsb25nIGNtYV9hbGxvY19hZGRyOworCS8qIHN0cnVjdCBwYWdlICpjb2xsb2NhdGVfY21hX2FsbG9jX3BhZ2VzOyAqLworCXVuc2lnbmVkIGxvbmcgY29sbG9jYXRlX2NtYV9hbGxvY19hZGRyOworCisJdTMyIHByZWZpeF9hdXhfc2l6ZTsKKwl1MzIgc3VmZml4X2F1eF9zaXplOworCXZvaWQgKmF1eF9hZGRyOworCWRtYV9hZGRyX3QgYXV4X3BoeV9hZGRyOworCisJLyogYnVmZmVyIGZvciBzdG9yZSBhbGwgc2VpIGRhdGEgKi8KKwl2b2lkICpzZWlfZGF0YV9idWY7CisJdTMyCXNlaV9kYXRhX2xlbjsKKworCS8qIGJ1ZmZlciBmb3Igc3RvcmluZyBvbmUgaXR1MzUgcmVjb3JlZCAqLworCXZvaWQgKnNlaV9pdHVfZGF0YV9idWY7CisJdTMyIHNlaV9pdHVfZGF0YV9sZW47CisKKwkvKiByZWN5Y2xlIGJ1ZmZlciBmb3IgdXNlciBkYXRhIHN0b3JpbmcgYWxsIGl0dTM1IHJlY29yZHMgKi8KKwl2b2lkICpzZWlfdXNlcl9kYXRhX2J1ZmZlcjsKKwl1MzIgc2VpX3VzZXJfZGF0YV93cDsKKyNpZmRlZiBNSDI2NF9VU0VSREFUQV9FTkFCTEUKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdXNlcl9kYXRhX3JlYWR5X3dvcms7CisjZW5kaWYKKwlzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpsYXN0X2RlY19waWN0dXJlOworCisJdWxvbmcgbG1lbV9waHlfYWRkcjsKKwlkbWFfYWRkcl90IGxtZW1fYWRkcjsKKworCXZvaWQgKmJtbXVfYm94OworI2lmZGVmIEgyNjRfTU1VCisJdm9pZCAqbW11X2JveDsKKwl2b2lkICpmcmFtZV9tbXVfbWFwX2FkZHI7CisJZG1hX2FkZHJfdCBmcmFtZV9tbXVfbWFwX3BoeV9hZGRyOworCXUzMgkgaGV2Y19jdXJfYnVmX2lkeDsKKwl1MzIgbG9zbGVzc19jb21wX2JvZHlfc2l6ZTsKKwl1MzIgbG9zbGVzc19jb21wX2JvZHlfc2l6ZV9zYW87CisJdTMyIGxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZTsKKwl1MzIgbWNfYnVmZmVyX3NpemVfdV92OworCXUzMiBtY19idWZmZXJfc2l6ZV91X3ZfaDsKKwl1MzIgIGlzX2lkcl9mcmFtZTsKKwl1MzIgIGlzX25ld19waWM7CisJdTMyICBmcmFtZV9kb25lOworCXUzMiAgZnJhbWVfYnVzeTsKKwl1bnNpZ25lZCBsb25nIGV4dGlmX2FkZHI7CisJaW50IGRvdWJsZV93cml0ZV9tb2RlOworCWludCBtbXVfZW5hYmxlOworI2VuZGlmCisKKwlERUNMQVJFX0tGSUZPKG5ld2ZyYW1lX3EsIHN0cnVjdCB2ZnJhbWVfcyAqLCBWRl9QT09MX1NJWkUpOworCURFQ0xBUkVfS0ZJRk8oZGlzcGxheV9xLCBzdHJ1Y3QgdmZyYW1lX3MgKiwgVkZfUE9PTF9TSVpFKTsKKworCWludCBjdXJfcG9vbDsKKwlzdHJ1Y3QgdmZyYW1lX3MgdmZwb29sW1ZGX1BPT0xfTlVNXVtWRl9QT09MX1NJWkVdOworCXN0cnVjdCBidWZmZXJfc3BlY19zIGJ1ZmZlcl9zcGVjW0JVRlNQRUNfUE9PTF9TSVpFXTsKKwlzdHJ1Y3QgdmZyYW1lX3Mgc3dpdGNoaW5nX2ZlbnNlX3ZmOworCXN0cnVjdCBoMjY0X2RwYl9zdHJ1IGRwYjsKKwl1OCBpbml0X2ZsYWc7CisJdTggZmlyc3Rfc2NfY2hlY2tlZDsKKwl1OCBoYXNfaV9mcmFtZTsKKwl1OCBjb25maWdfYnVmbWdyX2RvbmU7CisJdTMyIG1heF9yZWZlcmVuY2Vfc2l6ZTsKKwl1MzIgZGVjb2RlX3BpY19jb3VudDsKKwl1MzIgcmVmbGlzdF9lcnJvcl9jb3VudDsKKwlpbnQgc3RhcnRfc2VhcmNoX3BvczsKKwl1MzIgcmVnX2lxaWRjdF9jb250cm9sOworCWJvb2wgcmVnX2lxaWRjdF9jb250cm9sX2luaXRfZmxhZzsKKwl1MzIgcmVnX3Zjb3BfY3RybF9yZWc7CisJdTMyIHJlZ19ydl9haV9tYl9jb3VudDsKKwl1MzIgdmxkX2RlY19jb250cm9sOworCXN0cnVjdCB2ZnJhbWVfcyB2ZnJhbWVfZHVtbXk7CisKKwl1bnNpZ25lZCBjaGFyIGJ1ZmZlcl9lbXB0eV9mbGFnOworCisJdTMyIGZyYW1lX3dpZHRoOworCXUzMiBmcmFtZV9oZWlnaHQ7CisJdTMyIGZyYW1lX2R1cjsKKwl1MzIgZnJhbWVfcHJvZzsKKwl1MzIgZnJhbWVfcGFja2luZ190eXBlOworCisJc3RydWN0IHZmcmFtZV9jaHVua19zICpjaHVuazsKKworCXUzMiBzdGF0OworCXVuc2lnbmVkIGxvbmcgYnVmX3N0YXJ0OworCXUzMiBidWZfb2Zmc2V0OworCXUzMiBidWZfc2l6ZTsKKwkvKiB1MzIgdWNvZGVfbWFwX3N0YXJ0OyAqLworCXUzMiBwdHNfb3V0c2lkZTsKKwl1MzIgc3luY19vdXRzaWRlOworCXUzMiB2aDI2NF9yYXRpbzsKKwl1MzIgdmgyNjRfcm90YXRpb247CisJdTMyIHVzZV9pZHJfZnJhbWVyYXRlOworCisJdTMyIHNlcV9pbmZvOworCXUzMiBzZXFfaW5mbzI7CisJdTMyIHZpZGVvX3NpZ25hbF9mcm9tX3Z1aTsgLyp0byBkbyAuLiAqLworCXUzMiB0aW1pbmdfaW5mb19wcmVzZW50X2ZsYWc7CisJdTMyIGZpeGVkX2ZyYW1lX3JhdGVfZmxhZzsKKwl1MzIgYml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWc7CisJdTMyIG51bV9yZW9yZGVyX2ZyYW1lczsKKwl1MzIgbWF4X2RlY19mcmFtZV9idWZmZXJpbmc7CisJdTMyIGlmcmFtZV9jb3VudDsKKwl1MzIgYXNwZWN0X3JhdGlvX2luZm87CisJdTMyIG51bV91bml0c19pbl90aWNrOworCXUzMiB0aW1lX3NjYWxlOworCXUzMiBoMjY0X2FyOworCWJvb2wgaDI2NF9maXJzdF92YWxpZF9wdHNfcmVhZHk7CisJdTMyIGgyNjRwdHMxOworCXUzMiBoMjY0cHRzMjsKKwl1MzIgcHRzX2R1cmF0aW9uOworCXUzMiBoMjY0X3B0c19jb3VudDsKKwl1MzIgZHVyYXRpb25fZnJvbV9wdHNfZG9uZTsKKwl1MzIgcHRzX3Vuc3RhYmxlOworCXUzMiB1bnN0YWJsZV9wdHM7CisJdTMyIGxhc3RfY2hlY2tvdXRfcHRzOworCXUzMiBtYXhfcmVmZXJfYnVmOworCisJczMyIHZoMjY0X3N0cmVhbV9zd2l0Y2hpbmdfc3RhdGU7CisJc3RydWN0IHZmcmFtZV9zICpwX2xhc3RfdmY7CisJdTMyIGxhc3RfcHRzOworCXUzMiBsYXN0X3B0c19yZW1haW5kZXI7CisJdTMyIGxhc3RfZHVyYXRpb247CisJdTMyIGxhc3RfbWJfd2lkdGgsIGxhc3RfbWJfaGVpZ2h0OworCWJvb2wgY2hlY2tfcHRzX2Rpc2NvbnRpbnVlOworCWJvb2wgcHRzX2Rpc2NvbnRpbnVlOworCXUzMiB3YWl0X2J1ZmZlcl9jb3VudGVyOworCXUzMiBmaXJzdF9vZmZzZXQ7CisJdTMyIGZpcnN0X3B0czsKKwl1NjQgZmlyc3RfcHRzNjQ7CisJYm9vbCBmaXJzdF9wdHNfY2FjaGVkOworCXU2NCBsYXN0X3B0czY0OworI2lmIDAKKwl2b2lkICpzZWlfZGF0YV9idWZmZXI7CisJZG1hX2FkZHJfdCBzZWlfZGF0YV9idWZmZXJfcGh5czsKKyNlbmRpZgorCisJdWludCBlcnJvcl9yZWNvdmVyeV9tb2RlOworCXVpbnQgbWJfdG90YWw7CisJdWludCBtYl93aWR0aDsKKwl1aW50IG1iX2hlaWdodDsKKworCXVpbnQgaV9vbmx5OworCWludCBza2lwX2ZyYW1lX2NvdW50OworCWJvb2wgbm9fcG9jX3Jlb3JkZXJfZmxhZzsKKwlib29sIHNlbmRfZXJyb3JfZnJhbWVfZmxhZzsKKwlkbWFfYWRkcl90IG1jX2RtYV9oYW5kbGU7CisJdm9pZCAqbWNfY3B1X2FkZHI7CisJaW50IHZoMjY0X3Jlc2V0OworCisJYXRvbWljX3QgdmgyNjRfYWN0aXZlOworCisJc3RydWN0IGRlY19zeXNpbmZvIHZoMjY0X2Ftc3RyZWFtX2RlY19pbmZvOworCisJaW50IGRlY19yZXN1bHQ7CisJdTMyIHRpbWVvdXRfcHJvY2Vzc2luZzsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgbm90aWZ5X3dvcms7CisJc3RydWN0IHdvcmtfc3RydWN0IHRpbWVvdXRfd29yazsKKwl2b2lkICgqdmRlY19jYikoc3RydWN0IHZkZWNfcyAqLCB2b2lkICopOworCXZvaWQgKnZkZWNfY2JfYXJnOworCisJc3RydWN0IHRpbWVyX2xpc3QgY2hlY2tfdGltZXI7CisKKwkvKiovCisJdW5zaWduZWQgaW50IGxhc3RfZnJhbWVfdGltZTsKKwlhdG9taWNfdCB2Zl9wcmVfY291bnQ7CisJYXRvbWljX3QgdmZfZ2V0X2NvdW50OworCWF0b21pY190IHZmX3B1dF9jb3VudDsKKworCS8qIHRpbWVvdXQgaGFuZGxlICovCisJdW5zaWduZWQgbG9uZyBpbnQgc3RhcnRfcHJvY2Vzc190aW1lOworCXVuc2lnbmVkIGludCBsYXN0X21ieV9tYng7CisJdW5zaWduZWQgaW50IGxhc3RfdmxkX2xldmVsOworCXVuc2lnbmVkIGludCBkZWNvZGVfdGltZW91dF9jb3VudDsKKwl1bnNpZ25lZCBpbnQgdGltZW91dF9udW07CisJdW5zaWduZWQgaW50IHNlYXJjaF9kYXRhZW1wdHlfbnVtOworCXVuc2lnbmVkIGludCBkZWNvZGVfdGltZW91dF9udW07CisJdW5zaWduZWQgaW50IGRlY29kZV9kYXRhZW1wdHlfbnVtOworCXVuc2lnbmVkIGludCBidWZmZXJfZW1wdHlfcmVjb3Zlcl9udW07CisKKwl1bnNpZ25lZCBnZXRfZGF0YV9jb3VudDsKKwl1bnNpZ25lZCBnZXRfZGF0YV9zdGFydF90aW1lOworCS8qKi8KKworCS8qbG9nKi8KKwl1bnNpZ25lZCBpbnQgcGFja2V0X3dyaXRlX3N1Y2Nlc3NfY291bnQ7CisJdW5zaWduZWQgaW50IHBhY2tldF93cml0ZV9FQUdBSU5fY291bnQ7CisJdW5zaWduZWQgaW50IHBhY2tldF93cml0ZV9FTk9NRU1fY291bnQ7CisJdW5zaWduZWQgaW50IHBhY2tldF93cml0ZV9FRkFVTFRfY291bnQ7CisJdW5zaWduZWQgaW50IHRvdGFsX3JlYWRfc2l6ZV9wcmU7CisJdW5zaWduZWQgaW50IHRvdGFsX3JlYWRfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZnJhbWVfY291bnRfcHJlOworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJdTggc3dpdGNoX2R2bGF5ZXJfZmxhZzsKKwl1OCBnb3RfdmFsaWRfbmFsOworI2VuZGlmCisJdTggZW9zOworCXU4IGRhdGFfZmxhZzsKKwl1MzIgbm9fZXJyb3JfY291bnQ7CisJdTMyIG5vX2Vycm9yX2lfY291bnQ7CisJLyoKKwlOT0RJU1BfRkxBRworCSovCisJdTggZGVjX2ZsYWc7CisKKwl1MzIgdWNvZGVfcGF1c2VfcG9zOworCisJdTggcmVzZXRfYnVmbWdyX2ZsYWc7CisJdTMyIHJlc2V0X2J1Zm1ncl9jb3VudDsKKwl1bG9uZyB0aW1lb3V0OworCXUzMiB0aW1lb3V0X2ZsYWc7CisJdTMyIGNmZ19wYXJhbTE7CisJdTMyIGNmZ19wYXJhbTI7CisJdTMyIGNmZ19wYXJhbTM7CisJdTMyIGNmZ19wYXJhbTQ7CisJdTMyIGNmZ19iaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZzsKKwlpbnQgdmFsdmVfY291bnQ7CisJdTggbmV4dF9hZ2Fpbl9mbGFnOworCXUzMiBwcmVfcGFyc2VyX3dyX3B0cjsKKwlzdHJ1Y3QgZmlybXdhcmVfcyAqZnc7CisJc3RydWN0IGZpcm13YXJlX3MgKmZ3X21tdTsKKyNpZmRlZiBNSDI2NF9VU0VSREFUQV9FTkFCTEUKKwkvKnVzZXIgZGF0YSovCisJc3RydWN0IG11dGV4IHVzZXJkYXRhX211dGV4OworCXN0cnVjdCBtaDI2NF91c2VyZGF0YV9pbmZvX3QgdXNlcmRhdGFfaW5mbzsKKwlzdHJ1Y3QgbWgyNjRfdXNlcmRhdGFfcmVjb3JkX3QgdWRfcmVjb3JkOworCWludCB3YWl0X2Zvcl91ZHJfc2VuZDsKKyNlbmRpZgorCXUzMiBub19tZW1fY291bnQ7CisJdTMyIGNhbnZhc19tb2RlOworCWJvb2wgaXNfdXNlZF92NGw7CisJdm9pZCAqdjRsMl9jdHg7CisJYm9vbCB2NGxfcGFyYW1zX3BhcnNlZDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3E7CisJdTMyIHJlZ19nX3N0YXR1czsKKwlzdHJ1Y3QgbXV0ZXggY2h1bmtzX211dGV4OworCWludCBuZWVkX2NhY2hlX3NpemU7CisJdTY0IHNjX3N0YXJ0X3RpbWU7CisJdTggZnJtYmFzZV9jb250X2ZsYWc7CisJc3RydWN0IHZmcmFtZV9xb3NfcyB2ZnJhbWVfcW9zOworCWludCBmcmFtZWluZm9fZW5hYmxlOworCWJvb2wgZmlyc3RfaGVhZF9jaGVja19mbGFnOworCXVuc2lnbmVkIGludCBoZWlnaHRfYXNwZWN0X3JhdGlvOworCXVuc2lnbmVkIGludCB3aWR0aF9hc3BlY3RfcmF0aW87CisJdW5zaWduZWQgaW50IGZpcnN0X2lfcG9saWN5OworCXUzMiByZW9yZGVyX2RwYl9zaXplX21hcmdpbjsKKwlib29sIHdhaXRfcmVzZXRfZG9uZV9mbGFnOworI2lmZGVmIERFVEVDVF9XUk9OR19NVUxUSV9TTElDRQorCXVuc2lnbmVkIGludCBtdWx0aV9zbGljZV9waWNfY2hlY2tfY291bnQ7CisJCQkvKiBtdWx0aV9zbGljZV9waWNfZmxhZzoKKwkJCQkwLCB1bmtub3duOworCQkJCTEsIHNpbmdsZSBzbGljZTsKKwkJCQkyLCBtdWx0aSBzbGljZQorCQkJKi8KKwl1bnNpZ25lZCBpbnQgbXVsdGlfc2xpY2VfcGljX2ZsYWc7CisJdW5zaWduZWQgaW50IHBpY3R1cmVfc2xpY2VfY291bnQ7CisJdW5zaWduZWQgaW50IGN1cl9waWN0dXJlX3NsaWNlX2NvdW50OworCXVuc2lnbmVkIGNoYXIgZm9yY2Vfc2xpY2VfYXNfcGljdHVyZV9mbGFnOworCXVuc2lnbmVkIGludCBsYXN0X3BpY3R1cmVfc2xpY2VfY291bnQ7CisJdW5zaWduZWQgaW50IGZpcnN0X3ByZV9mcmFtZV9udW07CisjZW5kaWYKKwl1MzIgcmVzX2NoX2ZsYWc7CisJdTMyIGJfZnJhbWVfZXJyb3JfY291bnQ7CisJc3RydWN0IHZkZWNfaW5mbyBndnM7CisJdTMyIGtwaV9maXJzdF9pX2NvbW1pbmc7CisJdTMyIGtwaV9maXJzdF9pX2RlY29kZWQ7CisJaW50IHNpZGViaW5kX3R5cGU7CisJaW50IHNpZGViaW5kX2NoYW5uZWxfaWQ7CisJdTMyIGxvd19sYXRlbmN5X21vZGU7CisJaW50IGlwX2ZpZWxkX2Vycm9yX2NvdW50OworCWludCBidWZmZXJfd3JhcFtCVUZTUEVDX1BPT0xfU0laRV07CisJaW50IGxvb3BfZmxhZzsKKwlpbnQgbG9vcF9sYXN0X3BvYzsKKwlib29sIGVuYWJsZV9mZW5jZTsKKwlpbnQgZmVuY2VfdXNhZ2U7CisJYm9vbCBkaXNjYXJkX2R2X2RhdGE7CisJdTMyIG1ldGFkYXRhX2NvbmZpZ19mbGFnOworCWludCB2ZGVjX3BnX2VuYWJsZV9mbGFnOworCXUzMiBzYXZlX3JlZ19mOworCXUzMiBzdGFydF9iaXRfY250OworCXUzMiByaWdodF9mcmFtZV9jb3VudDsKKwl1MzIgd3JvbmdfZnJhbWVfY291bnQ7CisJdTMyIGVycm9yX2ZyYW1lX3dpZHRoOworCXUzMiBlcnJvcl9mcmFtZV9oZWlnaHQ7CisJdWxvbmcgZmJfdG9rZW47CisJc3RydWN0IG1oMjY0X2ZlbmNlX3ZmX3QgZmVuY2VfdmZfczsKKwlzdHJ1Y3QgbXV0ZXggZmVuY2VfbXV0ZXg7CisJdTMyIG5vX2RlY29kZXJfYnVmZmVyX2ZsYWc7CisJdTMyIHZpZGVvX3NpZ25hbF90eXBlOworCWJvb2wgbmVlZF9mcmVlX2F1eF9kYXRhOworCXUzMiBlcnJvcl9wcm9jX3BvbGljeTsKKwlzdHJ1Y3QgdHJhY2VfZGVjb2Rlcl9uYW1lIHRyYWNlOworCWludCBjc2RfY2hhbmdlX2ZsYWc7Cit9OworCitzdGF0aWMgdTMyIGFnYWluX3RocmVzaG9sZDsKKworc3RhdGljIHZvaWQgdGltZW91dF9wcm9jZXNzKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcpOworc3RhdGljIHZvaWQgZHVtcF9idWZzcGVjKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcsCisJY29uc3QgY2hhciAqY2FsbGVyKTsKK3N0YXRpYyB2b2lkIGgyNjRfcmVjb25maWcoc3RydWN0IHZkZWNfaDI2NF9od19zICpodyk7CitzdGF0aWMgdm9pZCBoMjY0X3Jlc2V0X2J1Zm1ncl92NGwoc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGZsdXNoX2ZsYWcpOworc3RhdGljIHZvaWQgdmgyNjRfbG9jYWxfaW5pdChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LCBib29sIGlzX3Jlc2V0KTsKK3N0YXRpYyBpbnQgdmgyNjRfaHdfY3R4X3Jlc3RvcmUoc3RydWN0IHZkZWNfaDI2NF9od19zICpodyk7CitzdGF0aWMgaW50IHZoMjY0X3N0b3Aoc3RydWN0IHZkZWNfaDI2NF9od19zICpodyk7CitzdGF0aWMgczMyIHZoMjY0X2luaXQoc3RydWN0IHZkZWNfaDI2NF9od19zICpodyk7CitzdGF0aWMgdm9pZCBzZXRfZnJhbWVfaW5mbyhzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LCBzdHJ1Y3QgdmZyYW1lX3MgKnZmLAorCQkJdTMyIGluZGV4KTsKK3N0YXRpYyB2b2lkIHJlbGVhc2VfYXV4X2RhdGEoc3RydWN0IHZkZWNfaDI2NF9od19zICpodywKKwlpbnQgYnVmX3NwZWNfbnVtKTsKKyNpZmRlZiBFUlJPUl9IQU5ETEVfVEVTVAorc3RhdGljIHZvaWQgaDI2NF9jbGVhcl9kcGIoc3RydWN0IHZkZWNfaDI2NF9od19zICpodyk7CisjZW5kaWYKKworI2RlZmluZQkJSDI2NV9QVVRfU0FPXzRLX1NFVAkJCTB4MDMKKyNkZWZpbmUJCUgyNjVfQUJPUlRfU0FPXzRLX1NFVAkJCTB4MDQKKyNkZWZpbmUJCUgyNjVfQUJPUlRfU0FPXzRLX1NFVF9ET05FCQkweDA1CisKKyNkZWZpbmUJCVNZU19DT01NQU5ECQkJSEVWQ19BU1NJU1RfU0NSQVRDSF8wCisjZGVmaW5lCQlIMjY1X0NIRUNLX0FYSV9JTkZPX0JBU0UJSEVWQ19BU1NJU1RfU0NSQVRDSF84CisjZGVmaW5lCQlIMjY1X1NBT180S19TRVRfQkFTRQlIRVZDX0FTU0lTVF9TQ1JBVENIXzkKKyNkZWZpbmUJCUgyNjVfU0FPXzRLX1NFVF9DT1VOVAlIRVZDX0FTU0lTVF9TQ1JBVENIX0EKKyNkZWZpbmUJCUhFVkNEX01QUF9BTkMyQVhJX1RCTF9EQVRBCQkweDM0NjQKKworCisjZGVmaW5lCQlIRVZDX0NNX0hFQURFUl9TVEFSVF9BRERSCQkweDM2MjgKKyNkZWZpbmUJCUhFVkNfQ01fQk9EWV9TVEFSVF9BRERSCQkJMHgzNjI2CisjZGVmaW5lCQlIRVZDX0NNX0JPRFlfTEVOR1RICQkJMHgzNjI3CisjZGVmaW5lCQlIRVZDX0NNX0hFQURFUl9MRU5HVEgJCQkweDM2MjkKKyNkZWZpbmUJCUhFVkNfQ01fSEVBREVSX09GRlNFVAkJCTB4MzYyYgorI2RlZmluZQkJSEVWQ19TQU9fQ1RSTDkJCQkJMHgzNjJkCisjZGVmaW5lCQlIRVZDRF9NUFBfREVDT01QX0NUTDMJCQkweDM0YzQKKyNkZWZpbmUJCUhFVkNEX01QUF9WREVDX01DUl9DVEwJCQkweDM0YzgKKyNkZWZpbmUgICAgICAgICAgIEhFVkNfREJMS19DRkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM1MGIKKyNkZWZpbmUJCUhFVkNfQVNTSVNUX01NVV9NQVBfQUREUgkweDMwMDkKKworI2RlZmluZSBIMjY1X0RXX05PX1NDQUxFCisjZGVmaW5lIEgyNjVfTUVNX01BUF9NT0RFIDAgIC8qMDpsaW5lYXIgMTozMngzMiAyOjY0eDMyKi8KKyNkZWZpbmUgSDI2NV9MT1NMRVNTX0NPTVBSRVNTX01PREUKKyNkZWZpbmUgTUFYX0ZSQU1FXzRLX05VTSAweDEyMDAKKyNkZWZpbmUgRlJBTUVfTU1VX01BUF9TSVpFICAoTUFYX0ZSQU1FXzRLX05VTSAqIDQpCisKKy8qIDA6bGluZWFyIDE6MzJ4MzIgMjo2NHgzMiA7IG04YmFieSB0ZXN0MTkwMiAqLworc3RhdGljIHUzMiBtZW1fbWFwX21vZGUgPSBIMjY1X01FTV9NQVBfTU9ERTsKKworI2RlZmluZSBNQVhfU0laRV80SyAoNDA5NiAqIDIzMDQpCisjZGVmaW5lIE1BWF9TSVpFXzJLICgxOTIwICogMTA4OCkKKworCisKK3N0YXRpYyBpbnQgaXNfb3ZlcnNpemUoaW50IHcsIGludCBoKQoreworCWludCBtYXggPSBNQVhfU0laRV80SzsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1RCkKKwkJbWF4ID0gTUFYX1NJWkVfMks7CisKKwlpZiAodyA8IDAgfHwgaCA8IDApCisJCXJldHVybiB0cnVlOworCisJaWYgKGggIT0gMCAmJiAodyA+IG1heCAvIGgpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgdm1oMjY0X3VkY19maWxsX3ZwdHMoc3RydWN0IHZkZWNfaDI2NF9od19zICpodywKKwkJCQkJCWludCBmcmFtZV90eXBlLAorCQkJCQkJdTMyIHZwdHMsCisJCQkJCQl1MzIgdnB0c192YWxpZCk7CitzdGF0aWMgaW50ICBjb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemUoaW50IHdpZHRoLAorCQkJCWludCBoZWlnaHQsIGludCBiaXRfZGVwdGhfMTApOworc3RhdGljIGludCAgY29tcHV0ZV9sb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworc3RhdGljIGludCBoZXZjX2FsbG9jX21tdShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LCBpbnQgcGljX2lkeCwKKwkJaW50IHBpY193aWR0aCwgaW50IHBpY19oZWlnaHQsIHUxNiBiaXRfZGVwdGgsCisJCXVuc2lnbmVkIGludCAqbW11X2luZGV4X2FkcikgeworCWludCBjdXJfYnVmX2lkeDsKKwlpbnQgYml0X2RlcHRoXzEwID0gKGJpdF9kZXB0aCAhPSAweDAwKTsKKwlpbnQgcGljdHVyZV9zaXplOworCXUzMiBjdXJfbW11XzRrX251bWJlcjsKKworCVdSSVRFX1ZSRUcoQ1VSUl9DQU5WQVNfQ1RSTCwgcGljX2lkeDw8MjQpOworCWN1cl9idWZfaWR4ID0gUkVBRF9WUkVHKENVUlJfQ0FOVkFTX0NUUkwpJjB4ZmY7CisJcGljdHVyZV9zaXplID0gY29tcHV0ZV9sb3NsZXNzX2NvbXBfYm9keV9zaXplKHBpY193aWR0aCwKKwkJCQkJcGljX2hlaWdodCwgYml0X2RlcHRoXzEwKTsKKwljdXJfbW11XzRrX251bWJlciA9ICgocGljdHVyZV9zaXplKygxPDwxMiktMSkgPj4gMTIpOworCWRwYl9wcmludChERUNPREVfSUQoaHcpLAorCQlQUklOVF9GTEFHX01NVV9ERVRBSUwsCisJCSJhbGxvY19tbXUgbmV3X2ZiX2lkeCAlZCBwaWN0dXJlX3NpemUgJWQgY3VyX21tdV80a19udW1iZXIgJWRcbiIsCisJCWN1cl9idWZfaWR4LCBwaWN0dXJlX3NpemUsIGN1cl9tbXVfNGtfbnVtYmVyKTsKKworCWlmIChjdXJfbW11XzRrX251bWJlciA+IE1BWF9GUkFNRV80S19OVU0pIHsKKwkJcHJfZXJyKCJoZXZjX2FsbG9jX21tdSBjdXJfbW11XzRrX251bWJlciAlZCB1bnN1cHBvcnRcbiIsCisJCWN1cl9tbXVfNGtfbnVtYmVyKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiBkZWNvZGVyX21tdV9ib3hfYWxsb2NfaWR4KAorCQlody0+bW11X2JveCwKKwkJY3VyX2J1Zl9pZHgsCisJCWN1cl9tbXVfNGtfbnVtYmVyLAorCQltbXVfaW5kZXhfYWRyKTsKK30KKworc3RhdGljIGludCAgY29tcHV0ZV9sb3NsZXNzX2NvbXBfYm9keV9zaXplKGludCB3aWR0aCwKKwkJCQkJaW50IGhlaWdodCwgaW50IGJpdF9kZXB0aF8xMCkKK3sKKwlpbnQgICAgd2lkdGhfeDY0OworCWludCAgICBoZWlnaHRfeDMyOworCWludCAgICBic2l6ZTsKKworCXdpZHRoX3g2NCA9IHdpZHRoICsgNjM7CisJd2lkdGhfeDY0ID4+PSA2OworCisJaGVpZ2h0X3gzMiA9IGhlaWdodCArIDMxOworCWhlaWdodF94MzIgPj49IDU7CisKKyNpZmRlZiBIMjY0X01NVQorCWJzaXplID0gKGJpdF9kZXB0aF8xMCA/IDQwOTYgOiAzMjY0KSAqIHdpZHRoX3g2NCpoZWlnaHRfeDMyOworI2Vsc2UKKwlic2l6ZSA9IChiaXRfZGVwdGhfMTAgPyA0MDk2IDogMzA3MikgKiB3aWR0aF94NjQqaGVpZ2h0X3gzMjsKKyNlbmRpZgorCXJldHVybiBic2l6ZTsKK30KKworc3RhdGljIGludCAgY29tcHV0ZV9sb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworCWludAl3aWR0aF94NjQ7CisJaW50CXdpZHRoX3gxMjg7CisJaW50ICAgIGhlaWdodF94NjQ7CisJaW50CWhzaXplOworCisJd2lkdGhfeDY0ID0gd2lkdGggKyA2MzsKKwl3aWR0aF94NjQgPj49IDY7CisKKwl3aWR0aF94MTI4ID0gd2lkdGggKyAxMjc7CisJd2lkdGhfeDEyOCA+Pj0gNzsKKworCWhlaWdodF94NjQgPSBoZWlnaHQgKyA2MzsKKwloZWlnaHRfeDY0ID4+PSA2OworCisjaWZkZWYJSDI2NF9NTVUKKwloc2l6ZSA9IDEyOCp3aWR0aF94NjQqaGVpZ2h0X3g2NDsKKyNlbHNlCisJaHNpemUgPSAzMip3aWR0aF94MTI4KmhlaWdodF94NjQ7CisjZW5kaWYKKwlyZXR1cm4gIGhzaXplOworfQorCitzdGF0aWMgaW50IGdldF9kd19zaXplKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcsIHUzMiAqcGR3X2J1ZmZlcl9zaXplX3Vfdl9oKQoreworCWludCBwaWNfd2lkdGgsIHBpY19oZWlnaHQ7CisJaW50IGxjdV9zaXplID0gMTY7CisJaW50IGR3X2J1Zl9zaXplOworCXUzMiBkd19idWZmZXJfc2l6ZV91X3Y7CisJdTMyIGR3X2J1ZmZlcl9zaXplX3Vfdl9oOworCWludCBkd19tb2RlID0gIGh3LT5kb3VibGVfd3JpdGVfbW9kZTsKKworCXBpY193aWR0aCA9IGh3LT5mcmFtZV93aWR0aDsKKwlwaWNfaGVpZ2h0ID0gaHctPmZyYW1lX2hlaWdodDsKKworCWlmIChkd19tb2RlKSB7CisJCWludCBwaWNfd2lkdGhfZHcgPSBwaWNfd2lkdGggLworCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhody0+ZG91YmxlX3dyaXRlX21vZGUpOworCQlpbnQgcGljX2hlaWdodF9kdyA9IHBpY19oZWlnaHQgLworCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhody0+ZG91YmxlX3dyaXRlX21vZGUpOworCisJCWludCBwaWNfd2lkdGhfbGN1X2R3ID0gKHBpY193aWR0aF9kdyAlIGxjdV9zaXplKSA/CisJCQlwaWNfd2lkdGhfZHcgLyBsY3Vfc2l6ZSArIDEgOgorCQkJcGljX3dpZHRoX2R3IC8gbGN1X3NpemU7CisJCWludCBwaWNfaGVpZ2h0X2xjdV9kdyA9IChwaWNfaGVpZ2h0X2R3ICUgbGN1X3NpemUpID8KKwkJCXBpY19oZWlnaHRfZHcgLyBsY3Vfc2l6ZSArIDEgOgorCQkJcGljX2hlaWdodF9kdyAvIGxjdV9zaXplOworCQlpbnQgbGN1X3RvdGFsX2R3ID0gcGljX3dpZHRoX2xjdV9kdyAqIHBpY19oZWlnaHRfbGN1X2R3OworCisKKwkJZHdfYnVmZmVyX3NpemVfdV92ID0gbGN1X3RvdGFsX2R3ICogbGN1X3NpemUgKiBsY3Vfc2l6ZSAvIDI7CisJCWR3X2J1ZmZlcl9zaXplX3Vfdl9oID0gKGR3X2J1ZmZlcl9zaXplX3VfdiArIDB4ZmZmZikgPj4gMTY7CisJCQkvKjY0ayBhbGlnbm1lbnQqLworCQlkd19idWZfc2l6ZSA9ICgoZHdfYnVmZmVyX3NpemVfdV92X2ggPDwgMTYpICogMyk7CisJCSpwZHdfYnVmZmVyX3NpemVfdV92X2ggPSBkd19idWZmZXJfc2l6ZV91X3ZfaDsKKwl9IGVsc2UgeworCQkqcGR3X2J1ZmZlcl9zaXplX3Vfdl9oID0gMDsKKwkJZHdfYnVmX3NpemUgPSAwOworCX0KKworCXJldHVybiBkd19idWZfc2l6ZTsKK30KKworCitzdGF0aWMgdm9pZCBoZXZjX21jcl9jb25maWdfY2FudjJheGl0Ymwoc3RydWN0IHZkZWNfaDI2NF9od19zICpodywgaW50IHJlc3RvcmUpCit7CisJaW50IGksIHNpemU7CisJdTMyICAgY2FudmFzX2FkZHI7CisJdW5zaWduZWQgbG9uZyBtYWRkcjsKKwlpbnQgICAgIG51bV9idWZmID0gaHctPmRwYi5tRFBCLnNpemU7CisJaW50IGR3X3NpemUgPSAwOworCXUzMiBkd19idWZmZXJfc2l6ZV91X3ZfaDsKKwl1MzIgYmxrbW9kZSA9IGh3LT5jYW52YXNfbW9kZTsKKwlpbnQgZHdfbW9kZSA9ICBody0+ZG91YmxlX3dyaXRlX21vZGU7CisKKwljYW52YXNfYWRkciA9IEFOQzBfQ0FOVkFTX0FERFI7CisJZm9yIChpID0gMDsgaSA8IG51bV9idWZmOyBpKyspCisJCVdSSVRFX1ZSRUcoKGNhbnZhc19hZGRyICsgaSksIGkgfCAoaSA8PCA4KSB8IChpIDw8IDE2KSk7CisKKwlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9DT05GX0FERFIsICgweDEgPDwgMSkgfCAoMHgxIDw8IDIpKTsKKwlzaXplID0gaHctPmxvc2xlc3NfY29tcF9ib2R5X3NpemUgKyBody0+bG9zbGVzc19jb21wX2hlYWRlcl9zaXplOworCisKKwlkd19zaXplID0gZ2V0X2R3X3NpemUoaHcsICZkd19idWZmZXJfc2l6ZV91X3ZfaCk7CisJc2l6ZSArPSBkd19zaXplOworCWlmIChzaXplID4gMCkKKwkJc2l6ZSArPSAweDEwMDAwOworCisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfTU1VX0RFVEFJTCwKKwkJImR3X2J1ZmZlcl9zaXplX3Vfdl9oID0gJWQsIGR3X3NpemUgPSAweCV4LCBzaXplID0gMHgleFxuIiwKKwkJZHdfYnVmZmVyX3NpemVfdV92X2gsIGR3X3NpemUsIHNpemUpOworCisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfTU1VX0RFVEFJTCwKKwkJImJvZHlfc2l6ZSA9ICVkLCBoZWFkZXJfc2l6ZSA9ICVkLCBib2R5X3NpemVfc2FvID0gJWRcbiIsCisJCQkJaHctPmxvc2xlc3NfY29tcF9ib2R5X3NpemUsCisJCQkJaHctPmxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSwKKwkJCQlody0+bG9zbGVzc19jb21wX2JvZHlfc2l6ZV9zYW8pOworCisJZm9yIChpID0gMDsgaSA8IG51bV9idWZmOyBpKyspIHsKKwkJaWYgKCFyZXN0b3JlKSB7CisJCQlpZiAoZGVjb2Rlcl9ibW11X2JveF9hbGxvY19idWZfcGh5KGh3LT5ibW11X2JveCwKKwkJCQlIRUFERVJfQlVGRkVSX0lEWChpKSwgc2l6ZSwKKwkJCQlEUklWRVJfSEVBREVSX05BTUUsICZtYWRkcikgPCAwKSB7CisJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkJCSIlcyBtYWxsb2MgY29tcHJlc3MgaGVhZGVyIGZhaWxlZCAlZFxuIiwKKwkJCQkJRFJJVkVSX0hFQURFUl9OQU1FLCBpKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0gZWxzZQorCQkJbWFkZHIgPSBody0+YnVmZmVyX3NwZWNbaV0uYWxsb2NfaGVhZGVyX2FkZHI7CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0RBVEEsICBtYWRkciA+PiA1KTsKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLmFsbG9jX2hlYWRlcl9hZGRyID0gbWFkZHI7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX01NVV9ERVRBSUwsCisJCQkiJXMgOiBjYW52YXM6ICVkICBheGlhZGRyOiV4IHNpemUgMHgleFxuIiwKKwkJCV9fZnVuY19fLCBpLCAodTMyKW1hZGRyLCBzaXplKTsKKworCQlpZiAoZHdfbW9kZSkgeworCQkJdTMyIGFkZHI7CisJCQlpbnQgY2FudmFzX3c7CisJCQlpbnQgY2FudmFzX2g7CisKKwkJCWNhbnZhc193ID0gaHctPmZyYW1lX3dpZHRoIC8KKwkJCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKGh3LT5kb3VibGVfd3JpdGVfbW9kZSk7CisJCQljYW52YXNfaCA9IGh3LT5mcmFtZV9oZWlnaHQgLworCQkJCWdldF9kb3VibGVfd3JpdGVfcmF0aW8oaHctPmRvdWJsZV93cml0ZV9tb2RlKTsKKworCQkJaWYgKGh3LT5jYW52YXNfbW9kZSA9PSAwKQorCQkJCWNhbnZhc193ID0gQUxJR04oY2FudmFzX3csIDMyKTsKKwkJCWVsc2UKKwkJCQljYW52YXNfdyA9IEFMSUdOKGNhbnZhc193LCA2NCk7CisJCQljYW52YXNfaCA9IEFMSUdOKGNhbnZhc19oLCAzMik7CisKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS5kd195X2FkciA9CisJCQkJbWFkZHIgKyBody0+bG9zbGVzc19jb21wX2hlYWRlcl9zaXplOworCisJCQlody0+YnVmZmVyX3NwZWNbaV0uZHdfeV9hZHIgPQorCQkJCSgoaHctPmJ1ZmZlcl9zcGVjW2ldLmR3X3lfYWRyICsgMHhmZmZmKSA+PiAxNikKKwkJCQkJPDwgMTY7CisJCQlody0+YnVmZmVyX3NwZWNbaV0uZHdfdV92X2FkciA9CisJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLmR3X3lfYWRyCisJCQkJKyAoZHdfYnVmZmVyX3NpemVfdV92X2ggPDwgMTYpICogMjsKKworCisJCQlody0+YnVmZmVyX3NwZWNbaV0uYnVmX2FkcgorCQkJCT0gaHctPmJ1ZmZlcl9zcGVjW2ldLmR3X3lfYWRyOworCQkJYWRkciA9IGh3LT5idWZmZXJfc3BlY1tpXS5idWZfYWRyOworCisKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX01NVV9ERVRBSUwsCisJCQkJImR3X3lfYWRyID0gMHgleCwgZHdfdV92X2FkciA9IDB4JXgsIHlfYWRkciA9IDB4JXgsIHVfYWRkciA9IDB4JXgsIHZfYWRkciA9IDB4JXgsIHdpZHRoID0gJWQsIGhlaWdodCA9ICVkXG4iLAorCQkJCWh3LT5idWZmZXJfc3BlY1tpXS5kd195X2FkciwKKwkJCQlody0+YnVmZmVyX3NwZWNbaV0uZHdfdV92X2FkciwKKwkJCQlody0+YnVmZmVyX3NwZWNbaV0ueV9hZGRyLAorCQkJCWh3LT5idWZmZXJfc3BlY1tpXS51X2FkZHIsCisJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZfYWRkciwKKwkJCQljYW52YXNfdywKKwkJCQljYW52YXNfaCk7CisKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfY29uZmlnWzBdLnBoeV9hZGRyID0KKwkJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLmR3X3lfYWRyOworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMF0ud2lkdGggPSBjYW52YXNfdzsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfY29uZmlnWzBdLmhlaWdodCA9IGNhbnZhc19oOworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMF0uYmxvY2tfbW9kZSA9CisJCQkJYmxrbW9kZTsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfY29uZmlnWzBdLmVuZGlhbiA9IDc7CisKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfY29uZmlnWzFdLnBoeV9hZGRyID0KKwkJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLmR3X3Vfdl9hZHI7CisJCQlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1sxXS53aWR0aCA9IGNhbnZhc193OworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMV0uaGVpZ2h0ID0gY2FudmFzX2g7CisJCQlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1sxXS5ibG9ja19tb2RlID0KKwkJCQlibGttb2RlOworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMV0uZW5kaWFuID0gNzsKKwkJfQorCX0KKwlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9DT05GX0FERFIsIDB4MSk7CisKKwlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0FDQ0NPTkZJR19BRERSLCAoMCA8PCA4KSB8ICgwPDwxKSB8IDEpOworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUiwgMCk7CisJcmV0dXJuOworfQorc3RhdGljIHZvaWQgICAgaGV2Y19tY3JfY29uZmlnX21jX3JlZihzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3KQoreworCXUzMiBpOworCXUzMiByZWZfY2FudjsKKwlzdHJ1Y3QgU2xpY2UgKnBTbGljZSA9ICYoaHctPmRwYi5tU2xpY2UpOworCS8qUkVGTElTVFswXSovCisJZm9yIChpID0gMDsgaSA8ICh1bnNpZ25lZCBpbnQpKHBTbGljZS0+bGlzdFhzaXplWzBdKTsgaSsrKSB7CisJCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnJlZiA9IHBTbGljZS0+bGlzdFhbMF1baV07CisJCWlmIChyZWYgPT0gTlVMTCkKKwkJCXJldHVybjsKKwkJV1JJVEVfVlJFRyhDVVJSX0NBTlZBU19DVFJMLCByZWYtPmJ1Zl9zcGVjX251bTw8MjQpOworCQlyZWZfY2FudiA9IFJFQURfVlJFRyhDVVJSX0NBTlZBU19DVFJMKSYweGZmZmZmZjsKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwKKwkJCQkJKHJlZi0+YnVmX3NwZWNfbnVtICYgMHgzZikgPDwgOCk7CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSLCByZWZfY2Fudik7CisJfQorCS8qUkVGTElTVFsxXSovCisJZm9yIChpID0gMDsgaSA8ICh1bnNpZ25lZCBpbnQpKHBTbGljZS0+bGlzdFhzaXplWzFdKTsgaSsrKSB7CisJCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnJlZiA9IHBTbGljZS0+bGlzdFhbMV1baV07CisJCWlmIChyZWYgPT0gTlVMTCkKKwkJCXJldHVybjsKKwkJV1JJVEVfVlJFRyhDVVJSX0NBTlZBU19DVFJMLCByZWYtPmJ1Zl9zcGVjX251bTw8MjQpOworCQlyZWZfY2FudiA9IFJFQURfVlJFRyhDVVJSX0NBTlZBU19DVFJMKSYweGZmZmZmZjsKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwKKwkJCQkJKHJlZi0+YnVmX3NwZWNfbnVtICYgMHgzZikgPDwgOCk7CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSLCByZWZfY2Fudik7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgICBoZXZjX21jcl9jb25maWdfbWNyY2Moc3RydWN0IHZkZWNfaDI2NF9od19zICpodykKK3sKKwl1MzIgcmRhdGEzMjsKKwl1MzIgcmRhdGEzMl8yOworCXUzMiBzbGljZV90eXBlOworCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnJlZjsKKwlzdHJ1Y3QgU2xpY2UgKnBTbGljZTsKKwlzbGljZV90eXBlID0gaHctPmRwYi5tU2xpY2Uuc2xpY2VfdHlwZTsKKwlwU2xpY2UgPSAmKGh3LT5kcGIubVNsaWNlKTsKKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDEsIDB4Mik7CisJaWYgKHNsaWNlX3R5cGUgPT0gSV9TTElDRSkgeworCQlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDEsIDB4MCk7CisJCXJldHVybjsKKwl9CisJaWYgKHNsaWNlX3R5cGUgPT0gQl9TTElDRSkgeworCQlyZWYgPSBwU2xpY2UtPmxpc3RYWzBdWzBdOworCQlpZiAocmVmID09IE5VTEwpCisJCQlyZXR1cm47CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfQUNDQ09ORklHX0FERFIsCisJCQkJKChyZWYtPmJ1Zl9zcGVjX251bSAmIDB4M2YpIDw8IDgpKTsKKwkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIpOworCQlyZGF0YTMyID0gcmRhdGEzMiAmIDB4ZmZmZjsKKwkJcmRhdGEzMiA9IHJkYXRhMzIgfCAocmRhdGEzMiA8PCAxNik7CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMiwgcmRhdGEzMik7CisKKwkJcmVmID0gcFNsaWNlLT5saXN0WFsxXVswXTsKKwkJaWYgKHJlZiA9PSBOVUxMKQorCQkJcmV0dXJuOworCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0FDQ0NPTkZJR19BRERSLAorCQkJKChyZWYtPmJ1Zl9zcGVjX251bSAmIDB4M2YpIDw8IDgpKTsKKwkJcmRhdGEzMl8yID0gUkVBRF9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUik7CisJCXJkYXRhMzJfMiA9IHJkYXRhMzJfMiAmIDB4ZmZmZjsKKwkJcmRhdGEzMl8yID0gcmRhdGEzMl8yIHwgKHJkYXRhMzJfMiA8PCAxNik7CisJCWlmIChyZGF0YTMyID09IHJkYXRhMzJfMikgeworCQkJcmVmID0gcFNsaWNlLT5saXN0WFsxXVsxXTsKKwkJCWlmIChyZWYgPT0gTlVMTCkKKwkJCQlyZXR1cm47CisJCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0FDQ0NPTkZJR19BRERSLAorCQkJCSgocmVmLT5idWZfc3BlY19udW0gJiAweDNmKSA8PCA4KSk7CisJCQlyZGF0YTMyXzIgPSBSRUFEX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSKTsKKwkJCXJkYXRhMzJfMiA9IHJkYXRhMzJfMiAmIDB4ZmZmZjsKKwkJCXJkYXRhMzJfMiA9IHJkYXRhMzJfMiB8IChyZGF0YTMyXzIgPDwgMTYpOworCQl9CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMywgcmRhdGEzMl8yKTsKKwl9IGVsc2UgeyAvKlAtUElDKi8KKwkJcmVmID0gcFNsaWNlLT5saXN0WFswXVswXTsKKwkJaWYgKHJlZiA9PSBOVUxMKQorCQkJcmV0dXJuOworCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0FDQ0NPTkZJR19BRERSLAorCQkJCSgocmVmLT5idWZfc3BlY19udW0gJiAweDNmKSA8PCA4KSk7CisJCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSKTsKKwkJcmRhdGEzMiA9IHJkYXRhMzIgJiAweGZmZmY7CisJCXJkYXRhMzIgPSByZGF0YTMyIHwgKHJkYXRhMzIgPDwgMTYpOworCQlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDIsIHJkYXRhMzIpOworCisJCXJlZiA9IHBTbGljZS0+bGlzdFhbMF1bMV07CisJCWlmIChyZWYgPT0gTlVMTCkKKwkJCXJldHVybjsKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwKKwkJCQkoKHJlZi0+YnVmX3NwZWNfbnVtICYgMHgzZikgPDwgOCkpOworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUik7CisJCXJkYXRhMzIgPSByZGF0YTMyICYgMHhmZmZmOworCQlyZGF0YTMyID0gcmRhdGEzMiB8IChyZGF0YTMyIDw8IDE2KTsKKwkJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwzLCByZGF0YTMyKTsKKwl9CisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwxLCAweGZmMCk7CisJcmV0dXJuOworfQorCisKK3N0YXRpYyB2b2lkICBoZXZjX21jcl9zYW9fZ2xvYmFsX2h3X2luaXQoc3RydWN0IHZkZWNfaDI2NF9od19zICpodywKKwkJdTMyIHdpZHRoLCB1MzIgaGVpZ2h0KSB7CisJdTMyIGRhdGEzMjsKKwl1MzIgbGN1X3hfbnVtLCBsY3VfeV9udW07CisJdTMyIGxjdV90b3RhbDsKKwl1MzIgbWNfYnVmZmVyX3NpemVfdV92OworCXUzMiBtY19idWZmZXJfc2l6ZV91X3ZfaDsKKwlpbnQgIGR3X21vZGUgPSBody0+ZG91YmxlX3dyaXRlX21vZGU7CisKKwkvKmxjdV94X251bSA9ICh3aWR0aCArIDE1KSA+PiA0OyovCisJLy8gd2lkdGggbmVlZCB0byBiZSByb3VuZCB0byA2NCBwaXhlbCAtLSBjYXNlMDI2MCAxLzEwLzIwMjAKKwlsY3VfeF9udW0gPSAoKCh3aWR0aCArIDYzKSA+PiA2KSA8PCAyKTsKKwlsY3VfeV9udW0gPSAoaGVpZ2h0ICsgMTUpID4+IDQ7CisJbGN1X3RvdGFsID0gbGN1X3hfbnVtICogbGN1X3lfbnVtOworCisJaHctPm1jX2J1ZmZlcl9zaXplX3VfdiA9IG1jX2J1ZmZlcl9zaXplX3VfdiA9IGxjdV90b3RhbCoxNioxNi8yOworCWh3LT5tY19idWZmZXJfc2l6ZV91X3ZfaCA9CisJCW1jX2J1ZmZlcl9zaXplX3Vfdl9oID0gKG1jX2J1ZmZlcl9zaXplX3VfdiArIDB4ZmZmZik+PjE2OworCisJaHctPmxvc2xlc3NfY29tcF9ib2R5X3NpemUgPSAwOworCisJaHctPmxvc2xlc3NfY29tcF9ib2R5X3NpemVfc2FvID0KKwkJCWNvbXB1dGVfbG9zbGVzc19jb21wX2JvZHlfc2l6ZSh3aWR0aCwgaGVpZ2h0LCAwKTsKKwlody0+bG9zbGVzc19jb21wX2hlYWRlcl9zaXplID0KKwkJCWNvbXB1dGVfbG9zbGVzc19jb21wX2hlYWRlcl9zaXplKHdpZHRoLCBoZWlnaHQpOworCisJV1JJVEVfVlJFRyhIRVZDRF9JUFBfVE9QX0NOVEwsIDB4MSk7IC8qc3cgcmVzZXQgaXBwMTBiX3RvcCovCisJV1JJVEVfVlJFRyhIRVZDRF9JUFBfVE9QX0NOVEwsIDB4MCk7IC8qc3cgcmVzZXQgaXBwMTBiX3RvcCovCisKKwkvKiBzZXR1cCBsY3Vfc2l6ZSA9IDE2Ki8KKwlXUklURV9WUkVHKEhFVkNEX0lQUF9UT1BfTENVQ09ORklHLCAxNik7IC8qc2V0IGxjdSBzaXplID0gMTYqLworCS8qcGljX3dpZHRoL3BpY19oZWlnaHQqLworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX1RPUF9GUk1DT05GSUcsCisJCShoZWlnaHQgJiAweGZmZmYpIDw8IDE2IHwgKHdpZHRoICYgMHhmZmZmKSk7CisJLyogYml0ZGVwdGhfbHVtYSA9IDgqLworCS8qIGJpdGRlcHRoX2Nocm9tYSA9IDgqLworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX0JJVERFUFRIX0NPTkZJRywgMHgwKTsvKnNldCBiaXQtZGVwdGggOCAqLworCisjaWZkZWYJSDI2NV9MT1NMRVNTX0NPTVBSRVNTX01PREUKKwlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMSwgKDB4MSA8PCA0KSk7CisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDIsIDB4MCk7CisjZWxzZQorCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLCAweDEgPDwgMzEpOworI2VuZGlmCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNEX0lQUF9BWElJRl9DT05GSUcpOworCWRhdGEzMiAmPSAofjB4MzApOworCWRhdGEzMiB8PSAoaHctPmNhbnZhc19tb2RlIDw8IDQpOworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX0FYSUlGX0NPTkZJRywgZGF0YTMyKTsKKworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwzLAorCQkJKDB4ODAgPDwgMjApIHwgKDB4ODAgPDwgMTApIHwgKDB4ZmYpKTsKKworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX1ZERUNfTUNSX0NUTCwgMHgxIHwgKDB4MSA8PCA0KSk7CisKKwkvKmNvbWZpZyB2ZGVjOmgyNjQ6bWRlYyB0byB1c2UgaGV2YyBtY3IvbWNyY2MvZGVjb21wKi8KKwlXUklURV9WUkVHKE1ERUNfUElDX0RDX01VWF9DVFJMLAorCQkJUkVBRF9WUkVHKE1ERUNfUElDX0RDX01VWF9DVFJMKSB8IDB4MSA8PCAzMSk7CisJLyogaXBwX2VuYWJsZSovCisJV1JJVEVfVlJFRyhIRVZDRF9JUFBfVE9QX0NOVEwsIDB4MSA8PCAxKTsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpIHsKKwkJICBXUklURV9WUkVHKEhFVkNfREJMS19DRkcxLCAweDIpOyAvLyBzZXQgY3R1c2l6ZT09MTYKKwkJICBXUklURV9WUkVHKEhFVkNfREJMS19DRkcyLCAoKGhlaWdodCAmIDB4ZmZmZik8PDE2KSB8ICh3aWR0aCAmIDB4ZmZmZikpOworCQkgIGlmIChkd19tb2RlICYgMHgxMCkKKwkJCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGR0IsIDB4NDA0MDU2MDMpOworCQkgIGVsc2UgaWYgKGR3X21vZGUpCisJCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkdCLCAweDQwNDA1NzAzKTsKKwkJICBlbHNlCisJCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkdCLCAweDQwNDA1NTAzKTsKKwl9CisKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDApOworCWRhdGEzMiAmPSAofjB4Zik7CisJZGF0YTMyIHw9IDB4NDsKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkwwLCBkYXRhMzIpOworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fUElDX1NJWkUsIChoZWlnaHQgJiAweGZmZmYpIDw8IDE2IHwKKwkJCSh3aWR0aCAmIDB4ZmZmZikpOworCWRhdGEzMiAgPSAoKGxjdV94X251bS0xKSB8IChsY3VfeV9udW0tMSkgPDwgMTYpOworCisJV1JJVEVfVlJFRyhIRVZDX1NBT19QSUNfU0laRV9MQ1UsIGRhdGEzMik7CisJZGF0YTMyICA9ICAobGN1X3hfbnVtICB8IGxjdV95X251bSA8PCAxNik7CisJV1JJVEVfVlJFRyhIRVZDX1NBT19USUxFX1NJWkVfTENVLCBkYXRhMzIpOworCWRhdGEzMiA9IChtY19idWZmZXJfc2l6ZV91X3ZfaCA8PCAxNikgPDwgMTsKKwlXUklURV9WUkVHKEhFVkNfU0FPX1lfTEVOR1RILCBkYXRhMzIpOworCWRhdGEzMiA9IChtY19idWZmZXJfc2l6ZV91X3ZfaCA8PCAxNik7CisJV1JJVEVfVlJFRyhIRVZDX1NBT19DX0xFTkdUSCwgZGF0YTMyKTsKKworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMMSk7CisJZGF0YTMyICY9ICh+MHgzMDAwKTsKKwlkYXRhMzIgJj0gKH4weGZmMCk7CisJZGF0YTMyIHw9IGVuZGlhbjsJLyogQmlnLUVuZGlhbiBwZXIgNjQtYml0ICovCisKKwlpZiAoaHctPm1tdV9lbmFibGUgJiYgKGR3X21vZGUgJiAweDEwKSkKKwkJZGF0YTMyIHw9ICgoaHctPmNhbnZhc19tb2RlIDw8IDEyKSB8MSk7CisJZWxzZSBpZiAoaHctPm1tdV9lbmFibGUgJiYgZHdfbW9kZSkKKwkJZGF0YTMyIHw9ICgoaHctPmNhbnZhc19tb2RlIDw8IDEyKSk7CisJZWxzZQorCQlkYXRhMzIgfD0gKChody0+Y2FudmFzX21vZGUgPDwgMTIpfDIpOworCisJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMMSwgZGF0YTMyKTsKKworI2lmZGVmCUgyNjVfRFdfTk9fU0NBTEUKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw1LCBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDUpICYgfigweGZmIDw8IDE2KSk7CisJaWYgKGh3LT5tbXVfZW5hYmxlICYmIGR3X21vZGUpIHsKKwkJZGF0YTMyID0JUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkw1KTsKKwkJZGF0YTMyICY9ICh+KDB4ZmYgPDwgMTYpKTsKKwkJaWYgKGR3X21vZGUgPT0gMiB8fAorCQkJZHdfbW9kZSA9PSAzKQorCQkJZGF0YTMyIHw9ICgweGZmPDwxNik7CisJCWVsc2UgaWYgKGR3X21vZGUgPT0gNCkKKwkJCWRhdGEzMiB8PSAoMHgzMzw8MTYpOworCQlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw1LCBkYXRhMzIpOworCX0KKworCisjZW5kaWYKKworCisjaWZkZWYJSDI2NV9MT1NMRVNTX0NPTVBSRVNTX01PREUKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDUpOworCWRhdGEzMiB8PSAoMTw8OSk7IC8qOC1iaXQgc21lbS1tb2RlKi8KKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw1LCBkYXRhMzIpOworCisJV1JJVEVfVlJFRyhIRVZDX0NNX0JPRFlfTEVOR1RILCBody0+bG9zbGVzc19jb21wX2JvZHlfc2l6ZV9zYW8pOworCVdSSVRFX1ZSRUcoSEVWQ19DTV9IRUFERVJfT0ZGU0VULCBody0+bG9zbGVzc19jb21wX2JvZHlfc2l6ZSk7CisJV1JJVEVfVlJFRyhIRVZDX0NNX0hFQURFUl9MRU5HVEgsIGh3LT5sb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUpOworI2VuZGlmCisKKyNpZmRlZglIMjY1X0xPU0xFU1NfQ09NUFJFU1NfTU9ERQorCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDksIFJFQURfVlJFRyhIRVZDX1NBT19DVFJMOSkgfCAoMHgxIDw8IDEpKTsKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw1LCBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDUpIHwgKDB4MSA8PCAxMCkpOworI2VuZGlmCisKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw5LCBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDkpIHwgMHgxIDw8IDcpOworCisJbWVtc2V0KGh3LT5mcmFtZV9tbXVfbWFwX2FkZHIsIDAsIEZSQU1FX01NVV9NQVBfU0laRSk7CisKKwlXUklURV9WUkVHKE1ERUNfRVhUSUZfQ0ZHMCwgaHctPmV4dGlmX2FkZHIpOworCVdSSVRFX1ZSRUcoTURFQ19FWFRJRl9DRkcxLCAweDgwMDAwMDAwKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkICBoZXZjX3Nhb19zZXRfc2xpY2VfdHlwZShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LAorCQl1MzIgaXNfbmV3X3BpYywgdTMyIGlzX2lkcikKK3sKKwlody0+aXNfbmV3X3BpYyA9IGlzX25ld19waWM7CisJaHctPmlzX2lkcl9mcmFtZSA9IGlzX2lkcjsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkICBoZXZjX3Nhb19zZXRfcGljX2J1ZmZlcihzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LAorCQkJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqcGljKSB7CisJdTMyIG1jX3lfYWRyOworCXUzMiBtY191X3ZfYWRyOworCXUzMiBkd195X2FkcjsKKwl1MzIgZHdfdV92X2FkcjsKKwl1MzIgY2FudmFzX2FkZHI7CisJaW50IHJldDsKKwlpbnQgIGR3X21vZGUgPSBody0+ZG91YmxlX3dyaXRlX21vZGU7CisJaWYgKGh3LT5pc19uZXdfcGljICE9IDEpCisJCXJldHVybjsKKworCWlmIChody0+aXNfaWRyX2ZyYW1lKSB7CisJCS8qIFdpbGxpYW0gVEJEICovCisJCW1lbXNldChody0+ZnJhbWVfbW11X21hcF9hZGRyLCAwLCBGUkFNRV9NTVVfTUFQX1NJWkUpOworCX0KKworCVdSSVRFX1ZSRUcoQ1VSUl9DQU5WQVNfQ1RSTCwgcGljLT5idWZfc3BlY19udW0gPDwgMjQpOworCWNhbnZhc19hZGRyID0gUkVBRF9WUkVHKENVUlJfQ0FOVkFTX0NUUkwpJjB4ZmZmZmZmOworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0NPTkZfQUREUiwgKDB4MCA8PCAxKSB8CisJCQkoMHgwIDw8IDIpIHwgKChjYW52YXNfYWRkciAmIDB4ZmYpIDw8IDgpKTsKKwltY195X2FkciA9IFJFQURfVlJFRyhIRVZDRF9NUFBfQU5DMkFYSV9UQkxfREFUQSkgPDwgNTsKKwlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9DT05GX0FERFIsICgweDAgPDwgMSkgfAorCQkJKDB4MCA8PCAyKSB8ICgoKGNhbnZhc19hZGRyID4+IDgpICYgMHhmZikgPDwgOCkpOworCW1jX3Vfdl9hZHIgPSBSRUFEX1ZSRUcoSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0RBVEEpIDw8IDU7CisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DMkFYSV9UQkxfQ09ORl9BRERSLCAweDEpOworCisKKwlpZiAoZHdfbW9kZSkgeworCQlkd195X2FkciA9IGh3LT5idWZmZXJfc3BlY1twaWMtPmJ1Zl9zcGVjX251bV0uZHdfeV9hZHI7CisJCWR3X3Vfdl9hZHIgPSBody0+YnVmZmVyX3NwZWNbcGljLT5idWZfc3BlY19udW1dLmR3X3Vfdl9hZHI7CisJfSBlbHNlIHsKKwkJZHdfeV9hZHIgPSAwOworCQlkd191X3ZfYWRyID0gMDsKKwl9CisjaWZkZWYJSDI2NV9MT1NMRVNTX0NPTVBSRVNTX01PREUKKwlpZiAoZHdfbW9kZSkKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19ZX1NUQVJUX0FERFIsIGR3X3lfYWRyKTsKKwlXUklURV9WUkVHKEhFVkNfQ01fQk9EWV9TVEFSVF9BRERSLCBtY195X2Fkcik7CisjaWZkZWYJSDI2NF9NTVUKKwlXUklURV9WUkVHKEhFVkNfQ01fSEVBREVSX1NUQVJUX0FERFIsIG1jX3lfYWRyKTsKKyNlbHNlCisJV1JJVEVfVlJFRyhIRVZDX0NNX0hFQURFUl9TVEFSVF9BRERSLAorCQkJKG1jX3lfYWRyICsgaHctPmxvc2xlc3NfY29tcF9ib2R5X3NpemUpKTsKKyNlbmRpZgorI2Vsc2UKKwlXUklURV9WUkVHKEhFVkNfU0FPX1lfU1RBUlRfQUREUiwgbWNfeV9hZHIpOworI2VuZGlmCisKKyNpZm5kZWYgSDI2NV9MT1NMRVNTX0NPTVBSRVNTX01PREUKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NfU1RBUlRfQUREUiwgbWNfdV92X2Fkcik7CisjZWxzZQorCWlmIChkd19tb2RlKQorCQlXUklURV9WUkVHKEhFVkNfU0FPX0NfU1RBUlRfQUREUiwgZHdfdV92X2Fkcik7CisjZW5kaWYKKworI2lmbmRlZiBMT1NMRVNTX0NPTVBSRVNTX01PREUKKwlpZiAoZHdfbW9kZSkgeworCQlXUklURV9WUkVHKEhFVkNfU0FPX1lfV1BUUiwgbWNfeV9hZHIpOworCQlXUklURV9WUkVHKEhFVkNfU0FPX0NfV1BUUiwgbWNfdV92X2Fkcik7CisJfQorI2Vsc2UKKwlXUklURV9WUkVHKEhFVkNfU0FPX1lfV1BUUiwgZHdfeV9hZHIpOworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ19XUFRSLCBkd191X3ZfYWRyKTsKKyNlbmRpZgorCisJcmV0ID0gaGV2Y19hbGxvY19tbXUoaHcsIHBpYy0+YnVmX3NwZWNfbnVtLAorCQkJKGh3LT5tYl93aWR0aCA8PCA0KSwgKGh3LT5tYl9oZWlnaHQgPDwgNCksIDB4MCwKKwkJCWh3LT5mcmFtZV9tbXVfbWFwX2FkZHIpOworCWlmIChyZXQgIT0gMCkgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJUFJJTlRfRkxBR19NTVVfREVUQUlMLCAiY2FuJ3QgYWxsb2MgbmVlZCBtbXUxLGlkeCAlZCByZXQgPSVkXG4iLAorCQlwaWMtPmJ1Zl9zcGVjX251bSwKKwkJcmV0KTsKKwkJcmV0dXJuOworCX0KKworCS8qUmVzZXQgU0FPICsgRW5hYmxlIFNBTyBzbGljZV9zdGFydCovCisJaWYgKGh3LT5tbXVfZW5hYmxlICAmJiBnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpCisJCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGRzAsIDB4MSk7IC8vIHJlc2V0IGJ1ZmZlcjMyeDQgaW4gbHBmIGZvciBldmVyeSBwaWN0dXJlCisJV1JJVEVfVlJFRyhIRVZDX1NBT19JTlRfU1RBVFVTLAorCQkJUkVBRF9WUkVHKEhFVkNfU0FPX0lOVF9TVEFUVVMpIHwgMHgxIDw8IDI4KTsKKwlXUklURV9WUkVHKEhFVkNfU0FPX0lOVF9TVEFUVVMsCisJCQlSRUFEX1ZSRUcoSEVWQ19TQU9fSU5UX1NUQVRVUykgfCAweDEgPDwgMzEpOworCS8qcHJfaW5mbygiaGV2Y19zYW9fc2V0X3BpY19idWZmZXI6bWNfeV9hZHI6ICV4XG4iLCBtY195X2Fkcik7Ki8KKwkvKlNlbmQgY29vbW1hbmQgdG8gaGV2Yy1jb2RlIHRvIHN1cHBseSA0ayBidWZmZXJzIHRvIHNhbyovCisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpIHsKKwkJV1JJVEVfVlJFRyhIMjY1X1NBT180S19TRVRfQkFTRSwgKHUzMilody0+ZnJhbWVfbW11X21hcF9waHlfYWRkcik7CisJCVdSSVRFX1ZSRUcoSDI2NV9TQU9fNEtfU0VUX0NPVU5ULCBNQVhfRlJBTUVfNEtfTlVNKTsKKwl9IGVsc2UKKwkJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9NTVVfTUFQX0FERFIsICh1MzIpaHctPmZyYW1lX21tdV9tYXBfcGh5X2FkZHIpOworCVdSSVRFX1ZSRUcoU1lTX0NPTU1BTkQsIEgyNjVfUFVUX1NBT180S19TRVQpOworCWh3LT5mcmFtZV9idXN5ID0gMTsKKwlyZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQgIGhldmNfc2V0X3VudXNlZF80a19idWZmX2lkeChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LAorCQl1MzIgYnVmX3NwZWNfbnVtKSB7CisJV1JJVEVfVlJFRyhDVVJSX0NBTlZBU19DVFJMLCBidWZfc3BlY19udW08PDI0KTsKKwlody0+aGV2Y19jdXJfYnVmX2lkeCA9IFJFQURfVlJFRyhDVVJSX0NBTlZBU19DVFJMKSYweGZmOworCWRwYl9wcmludChERUNPREVfSUQoaHcpLAorCQlQUklOVF9GTEFHX01NVV9ERVRBSUwsICIgJXMgIGN1cl9idWZfaWR4ICVkICBidWZfc3BlY19udW0gJWRcbiIsCisJCV9fZnVuY19fLCBody0+aGV2Y19jdXJfYnVmX2lkeCwgYnVmX3NwZWNfbnVtKTsKKwlyZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQgIGhldmNfc2V0X2ZyYW1lX2RvbmUoc3RydWN0IHZkZWNfaDI2NF9od19zICpodykKK3sKKwl1bG9uZyB0aW1lb3V0ID0gamlmZmllcyArIEhaOworCWRwYl9wcmludChERUNPREVfSUQoaHcpLAorCQlQUklOVF9GTEFHX01NVV9ERVRBSUwsICJoZXZjX2ZyYW1lX2RvbmUuLi5zZXRcbiIpOworCXdoaWxlICgoUkVBRF9WUkVHKEhFVkNfU0FPX0lOVF9TVEFUVVMpICYgMHgxKSA9PSAwKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCVBSSU5UX0ZMQUdfTU1VX0RFVEFJTCwgIiAlcy4udGltZW91dCFcbiIsIF9fZnVuY19fKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXRpbWVvdXQgPSBqaWZmaWVzICsgSFo7CisJd2hpbGUgKFJFQURfVlJFRyhIRVZDX0NNX0NPUkVfU1RBVFVTKSAmIDB4MSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQlQUklOVF9GTEFHX01NVV9ERVRBSUwsICIgJXMgY21fY29yZS4udGltZW91dCFcbiIsIF9fZnVuY19fKTsKKwkJCWJyZWFrOworCQl9CisJfQorCVdSSVRFX1ZSRUcoSEVWQ19TQU9fSU5UX1NUQVRVUywgMHgxKTsKKwlody0+ZnJhbWVfZG9uZSA9IDE7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX2N1cl9kZWNvZGluZ19idWYoc3RydWN0IHZkZWNfaDI2NF9od19zICpodykKK3sKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9ICZody0+ZHBiOworCWlmIChwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUpIHsKKwkJcmVsZWFzZV9waWN0dXJlKHBfSDI2NF9EcGIsCisJCQlwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUpOworCQlwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPmRhdGFfZmxhZyAmPSB+RVJST1JfRkxBRzsKKwkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlID0gTlVMTDsKKwkJaWYgKGh3LT5tbXVfZW5hYmxlKQorCQkJaGV2Y19zZXRfZnJhbWVfZG9uZShodyk7CisJfQorfQorCitzdGF0aWMgdm9pZCAgaGV2Y19zYW9fd2FpdF9kb25lKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcpCit7CisJdWxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBIWjsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJUFJJTlRfRkxBR19NTVVfREVUQUlMLCAiaGV2Y19zYW9fd2FpdF9kb25lLi4uc3RhcnRcbiIpOworCXdoaWxlICgoUkVBRF9WUkVHKEhFVkNfU0FPX0lOVF9TVEFUVVMpID4+IDMxKSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQlQUklOVF9GTEFHX01NVV9ERVRBSUwsCisJCQkiaGV2Y19zYW9fd2FpdF9kb25lLi4ud2FpdCB0aW1lb3V0IVxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKwl0aW1lb3V0ID0gamlmZmllcyArIEhaOworCWlmICgoaHctPmZyYW1lX2J1c3kgPT0gMSkgJiYgKGh3LT5mcmFtZV9kb25lID09IDEpICkgeworCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgIEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKSB7CisJCVdSSVRFX1ZSRUcoU1lTX0NPTU1BTkQsIEgyNjVfQUJPUlRfU0FPXzRLX1NFVCk7CisJCQl3aGlsZSAoKFJFQURfVlJFRyhTWVNfQ09NTUFORCkgJiAweGZmKSAhPQorCQkJCQlIMjY1X0FCT1JUX1NBT180S19TRVRfRE9ORSkgeworCQkJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJCQlQUklOVF9GTEFHX01NVV9ERVRBSUwsCisJCQkJCQkid2FpdCBoMjY1X2Fib3J0X3Nhb180a19zZXRfZG9uZSB0aW1lb3V0IVxuIik7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJfQorCQl9CisJCWFtaGV2Y19zdG9wKCk7CisJCWh3LT5mcmFtZV9idXN5ID0gMDsKKwkJaHctPmZyYW1lX2RvbmUgPSAwOworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCVBSSU5UX0ZMQUdfTU1VX0RFVEFJTCwKKwkJCSJzYW8gd2FpdCBkb25lICxoZXZjIHN0b3AhXG4iKTsKKwl9CisJcmV0dXJuOworfQorc3RhdGljIHZvaWQgYnVmX3NwZWNfaW5pdChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LCBib29sIGJ1ZmZlcl9yZXNldF9mbGFnKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5idWZzcGVjX2xvY2ssIGZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBWRl9QT09MX1NJWkU7IGkrKykgeworCQlzdHJ1Y3QgdmZyYW1lX3MgKnZmID0gJmh3LT52ZnBvb2xbaHctPmN1cl9wb29sXVtpXTsKKwkJdTMyIHJlZl9pZHggPSBCVUZTUEVDX0lOREVYKHZmLT5pbmRleCk7CisJCWlmICgodmYtPmluZGV4ICE9IC0xKSAmJgorCQkJKGh3LT5idWZmZXJfc3BlY1tyZWZfaWR4XS52Zl9yZWYgPT0gMCkgJiYKKwkJCShody0+YnVmZmVyX3NwZWNbcmVmX2lkeF0udXNlZCAhPSAtMSkpIHsKKwkJCXZmLT5pbmRleCA9IC0xOworCQl9CisJfQorCisJaHctPmN1cl9wb29sKys7CisJaWYgKGh3LT5jdXJfcG9vbCA+PSBWRl9QT09MX05VTSkKKwkJaHctPmN1cl9wb29sID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBWRl9QT09MX1NJWkU7IGkrKykgeworCQlzdHJ1Y3QgdmZyYW1lX3MgKnZmID0gJmh3LT52ZnBvb2xbaHctPmN1cl9wb29sXVtpXTsKKwkJdTMyIHJlZl9pZHggPSBCVUZTUEVDX0lOREVYKHZmLT5pbmRleCk7CisJCWlmICgodmYtPmluZGV4ICE9IC0xKSAmJgorCQkJKGh3LT5idWZmZXJfc3BlY1tyZWZfaWR4XS52Zl9yZWYgPT0gMCkgJiYKKwkJCShody0+YnVmZmVyX3NwZWNbcmVmX2lkeF0udXNlZCAhPSAtMSkpIHsKKwkJCXZmLT5pbmRleCA9IC0xOworCQl9CisJfQorCS8qIGJ1ZmZlcnMgYXJlIGFsbG9jZWQgd2hlbiBlcnJvciByZXNldCwgdjRsIG11c3QgZmluZCBidWZmZXIgYnkgYnVmZmVyX3dyYXBbXSAqLworCWlmIChody0+cmVzZXRfYnVmbWdyX2ZsYWcgJiYgYnVmZmVyX3Jlc2V0X2ZsYWcpIHsKKwkJZm9yIChpID0gMDsgaSA8IEJVRlNQRUNfUE9PTF9TSVpFOyBpKyspIHsKKwkJCWlmIChody0+YnVmZmVyX3NwZWNbaV0udXNlZCA9PSAxIHx8IGh3LT5idWZmZXJfc3BlY1tpXS51c2VkID09IDIpCisJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnVzZWQgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IEJVRlNQRUNfUE9PTF9TSVpFOyBpKyspIHsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS51c2VkID0gLTE7CisJCQlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX3BvcyA9IC0xOworCQkJaHctPmJ1ZmZlcl93cmFwW2ldID0gLTE7CisJCX0KKwl9CisKKwlpZiAoZHBiX2lzX2RlYnVnKERFQ09ERV9JRChodyksCisJCVBSSU5UX0ZMQUdfRFVNUF9CVUZTUEVDKSkKKwkJZHVtcF9idWZzcGVjKGh3LCBfX2Z1bmNfXyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmJ1ZnNwZWNfbG9jaywgZmxhZ3MpOworfQorCisKKy8qaXMgYWN0aXZlIGluIGJ1ZiBtYW5hZ2VtZW50ICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBpc19idWZfc3BlY19pbl91c2Uoc3RydWN0IHZkZWNfaDI2NF9od19zICpodywKKwlpbnQgYnVmX3NwZWNfbnVtKQoreworCXVuc2lnbmVkIGNoYXIgcmV0ID0gMDsKKwlpZiAoaHctPmJ1ZmZlcl9zcGVjW2J1Zl9zcGVjX251bV0udXNlZCA9PSAxIHx8CisJCWh3LT5idWZmZXJfc3BlY1tidWZfc3BlY19udW1dLnVzZWQgPT0gMiB8fAorCQlody0+YnVmZmVyX3NwZWNbYnVmX3NwZWNfbnVtXS51c2VkID09IDMgfHwKKwkJaHctPmJ1ZmZlcl9zcGVjW2J1Zl9zcGVjX251bV0udXNlZCA9PSA1KQorCQlyZXQgPSAxOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGlzX2J1Zl9zcGVjX2luX2Rpc3BfcShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LAorCWludCBidWZfc3BlY19udW0pCit7CisJdW5zaWduZWQgY2hhciByZXQgPSAwOworCWlmIChody0+YnVmZmVyX3NwZWNbYnVmX3NwZWNfbnVtXS51c2VkID09IDIgfHwKKwkJaHctPmJ1ZmZlcl9zcGVjW2J1Zl9zcGVjX251bV0udXNlZCA9PSAzIHx8CisJCWh3LT5idWZmZXJfc3BlY1tidWZfc3BlY19udW1dLnVzZWQgPT0gNSkKKwkJcmV0ID0gMTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFsbG9jX29uZV9idWZfc3BlYyhzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LCBpbnQgaSkKK3sKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisJaWYgKGh3LT5tbXVfZW5hYmxlKSB7CisJCWlmIChody0+YnVmZmVyX3NwZWNbaV0uYWxsb2NfaGVhZGVyX2FkZHIpCisJCQlyZXR1cm4gMDsKKwkJZWxzZQorCQkJcmV0dXJuIC0xOworCX0gZWxzZSB7CisKKwkJaW50IGJ1Zl9zaXplID0gKGh3LT5tYl90b3RhbCA8PCA4KSArIChody0+bWJfdG90YWwgPDwgNyk7CisJCWludCBhZGRyOworI2lmZGVmIFZERUNfRFcKKwkJaW50IG9yaWdfYnVmX3NpemU7CisJCW9yaWdfYnVmX3NpemUgPSBidWZfc2l6ZTsKKwkJaWYgKElTX1ZERUNfRFcoaHcpID09IDEpCisJCQlidWZfc2l6ZSArPSAoaHctPm1iX3RvdGFsIDw8IDcpICsgKGh3LT5tYl90b3RhbCA8PCA2KTsKKwkJZWxzZSBpZiAoSVNfVkRFQ19EVyhodykgPT0gMikKKwkJCWJ1Zl9zaXplICs9IChody0+bWJfdG90YWwgPDwgNikgKyAoaHctPm1iX3RvdGFsIDw8IDUpOworCQllbHNlIGlmIChJU19WREVDX0RXKGh3KSA9PSA0KQorCQkJYnVmX3NpemUgKz0gKGh3LT5tYl90b3RhbCA8PCA0KSArIChody0+bWJfdG90YWwgPDwgMyk7CisJCWVsc2UgaWYgKElTX1ZERUNfRFcoaHcpID09IDgpCisJCQlidWZfc2l6ZSArPSAoaHctPm1iX3RvdGFsIDw8IDIpICsgKGh3LT5tYl90b3RhbCA8PCAxKTsKKwkJaWYgKElTX1ZERUNfRFcoaHcpKSB7CisJCQl1MzIgYWxpZ25fc2l6ZTsKKwkJCS8qIGFkZCBhbGlnbiBwYWRkaW5nIHNpemUgZm9yIGJsazY0eDMyOiAobWJfdzw8NCkqMzIsIChtYl9oPDw0KSo2NCAqLworCQkJYWxpZ25fc2l6ZSA9ICgoaHctPm1iX3dpZHRoIDw8IDkpICsgKGh3LT5tYl9oZWlnaHQgPDwgMTApKSAvIElTX1ZERUNfRFcoaHcpOworCQkJLyogZG91YmxlIGFsaWduIHBhZGRpbmcgc2l6ZSBmb3IgdXYqLworCQkJYWxpZ25fc2l6ZSA8PD0gMTsKKwkJCWJ1Zl9zaXplICs9IGFsaWduX3NpemUgKyBQQUdFX1NJWkU7CisJCX0KKyNlbmRpZgorCQlpZiAoaHctPmJ1ZmZlcl9zcGVjW2ldLmNtYV9hbGxvY19hZGRyKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeShody0+Ym1tdV9ib3gsIGksCisJCQlQQUdFX0FMSUdOKGJ1Zl9zaXplKSwgRFJJVkVSX05BTUUsCisJCQkmaHctPmJ1ZmZlcl9zcGVjW2ldLmNtYV9hbGxvY19hZGRyKSA8IDApIHsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS5jbWFfYWxsb2NfYWRkciA9IDA7CisJCQlpZiAoaHctPm5vX21lbV9jb3VudCsrID4gMykgeworCQkJCWh3LT5zdGF0IHw9IERFQ09ERVJfRkFUQUxfRVJST1JfTk9fTUVNOworCQkJCWh3LT5yZXNldF9idWZtZ3JfZmxhZyA9IDE7CisJCQl9CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSIlcywgZmFpbCB0byBhbGxvYyBidWYgZm9yIGJ1ZnNwZWMlZCwgdHJ5IGxhdGVyXG4iLAorCQkJCQlfX2Z1bmNfXywgaQorCQkJKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHsKKwkJCWh3LT5ub19tZW1fY291bnQgPSAwOworCQkJaHctPnN0YXQgJj0gfkRFQ09ERVJfRkFUQUxfRVJST1JfTk9fTUVNOworCQl9CisJCWlmICghdmRlY19zZWN1cmUodmRlYykpIHsKKwkJCS8qaW5pdCBpbnRlcm5hbCBidWYqLworCQkJY2hhciAqdG1wYnVmID0gKGNoYXIgKiljb2RlY19tbV9waHlzX3RvX3ZpcnQoaHctPmJ1ZmZlcl9zcGVjW2ldLmNtYV9hbGxvY19hZGRyKTsKKwkJCWlmICh0bXBidWYpIHsKKwkJCQltZW1zZXQodG1wYnVmLCAwLCBQQUdFX0FMSUdOKGJ1Zl9zaXplKSk7CisJCQkJY29kZWNfbW1fZG1hX2ZsdXNoKHRtcGJ1ZiwKKwkJCQkJICAgUEFHRV9BTElHTihidWZfc2l6ZSksCisJCQkJCSAgIERNQV9UT19ERVZJQ0UpOworCQkJfSBlbHNlIHsKKwkJCQl0bXBidWYgPSBjb2RlY19tbV92bWFwKGh3LT5idWZmZXJfc3BlY1tpXS5jbWFfYWxsb2NfYWRkciwgUEFHRV9BTElHTihidWZfc2l6ZSkpOworCQkJCWlmICh0bXBidWYpIHsKKwkJCQkJbWVtc2V0KHRtcGJ1ZiwgMCwgUEFHRV9BTElHTihidWZfc2l6ZSkpOworCQkJCQljb2RlY19tbV9kbWFfZmx1c2godG1wYnVmLAorCQkJCQkJICAgUEFHRV9BTElHTihidWZfc2l6ZSksCisJCQkJCQkgICBETUFfVE9fREVWSUNFKTsKKwkJCQkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcih0bXBidWYpOworCQkJCX0KKwkJCX0KKwkJfQorCQlody0+YnVmZmVyX3NwZWNbaV0uYnVmX2FkciA9CisJCWh3LT5idWZmZXJfc3BlY1tpXS5jbWFfYWxsb2NfYWRkcjsKKwkJYWRkciA9IGh3LT5idWZmZXJfc3BlY1tpXS5idWZfYWRyOworCisKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLnlfYWRkciA9IGFkZHI7CisJCWFkZHIgKz0gaHctPm1iX3RvdGFsIDw8IDg7CisJCWh3LT5idWZmZXJfc3BlY1tpXS51X2FkZHIgPSBhZGRyOworCQlody0+YnVmZmVyX3NwZWNbaV0udl9hZGRyID0gYWRkcjsKKwkJYWRkciArPSBody0+bWJfdG90YWwgPDwgNzsKKworCQlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1swXS5waHlfYWRkciA9CisJCQlody0+YnVmZmVyX3NwZWNbaV0ueV9hZGRyOworCQlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1swXS53aWR0aCA9CisJCQlody0+bWJfd2lkdGggPDwgNDsKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMF0uaGVpZ2h0ID0KKwkJCWh3LT5tYl9oZWlnaHQgPDwgNDsKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMF0uYmxvY2tfbW9kZSA9CisJCQlody0+Y2FudmFzX21vZGU7CisKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMV0ucGh5X2FkZHIgPQorCQkJCWh3LT5idWZmZXJfc3BlY1tpXS51X2FkZHI7CisJCWh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfY29uZmlnWzFdLndpZHRoID0KKwkJCQlody0+bWJfd2lkdGggPDwgNDsKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMV0uaGVpZ2h0ID0KKwkJCQlody0+bWJfaGVpZ2h0IDw8IDM7CisJCWh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfY29uZmlnWzFdLmJsb2NrX21vZGUgPQorCQkJCWh3LT5jYW52YXNfbW9kZTsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCSIlcywgYWxsb2MgYnVmIGZvciBidWZzcGVjJWRcbiIsCisJCQkJX19mdW5jX18sIGkpOworI2lmZGVmICBWREVDX0RXCisJCWlmICghSVNfVkRFQ19EVyhodykpCisJCQlyZXR1cm4gMDsKKwkJZWxzZSB7CisJCQlpbnQgd19zaGlmdCA9IDMsIGhfc2hpZnQgPSAzOworCisJCQlpZiAoSVNfVkRFQ19EVyhodykgPT0gMSkgeworCQkJCXdfc2hpZnQgPSAzOworCQkJCWhfc2hpZnQgPSA0OworCQkJfSBlbHNlIGlmIChJU19WREVDX0RXKGh3KSA9PSAyKSB7CisJCQkJd19zaGlmdCA9IDM7CisJCQkJaF9zaGlmdCA9IDM7CisJCQl9IGVsc2UgaWYgKElTX1ZERUNfRFcoaHcpID09IDQpIHsKKwkJCQl3X3NoaWZ0ID0gMjsKKwkJCQloX3NoaWZ0ID0gMjsKKwkJCX0gZWxzZSBpZiAoSVNfVkRFQ19EVyhodykgPT0gOCkgeworCQkJCXdfc2hpZnQgPSAxOworCQkJCWhfc2hpZnQgPSAxOworCQkJfQorCisJCQlhZGRyID0gaHctPmJ1ZmZlcl9zcGVjW2ldLmNtYV9hbGxvY19hZGRyICsgUEFHRV9BTElHTihvcmlnX2J1Zl9zaXplKTsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X3lfYWRkciA9IGFkZHI7CisJCQlhZGRyICs9IEFMSUdOX1dJRFRIKGh3LT5tYl93aWR0aCA8PCB3X3NoaWZ0KSAqIEFMSUdOX0hFSUdIVChody0+bWJfaGVpZ2h0IDw8IGhfc2hpZnQpOworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfdV9hZGRyID0gYWRkcjsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X3ZfYWRkciA9IGFkZHI7CisJCQlhZGRyICs9IGh3LT5tYl90b3RhbCA8PCAod19zaGlmdCArIGhfc2hpZnQgLSAxKTsKKworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfY2FudmFzX2NvbmZpZ1swXS5waHlfYWRkciA9CisJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfeV9hZGRyOworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfY2FudmFzX2NvbmZpZ1swXS53aWR0aCA9CisJCQkJQUxJR05fV0lEVEgoaHctPm1iX3dpZHRoIDw8IHdfc2hpZnQpOworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfY2FudmFzX2NvbmZpZ1swXS5oZWlnaHQgPQorCQkJCUFMSUdOX0hFSUdIVChody0+bWJfaGVpZ2h0IDw8IGhfc2hpZnQpOworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfY2FudmFzX2NvbmZpZ1swXS5ibG9ja19tb2RlID0KKwkJCQlody0+Y2FudmFzX21vZGU7CisKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X2NhbnZhc19jb25maWdbMV0ucGh5X2FkZHIgPQorCQkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X3VfYWRkcjsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X2NhbnZhc19jb25maWdbMV0ud2lkdGggPQorCQkJCUFMSUdOX1dJRFRIKGh3LT5tYl93aWR0aCA8PCB3X3NoaWZ0KTsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X2NhbnZhc19jb25maWdbMV0uaGVpZ2h0ID0KKwkJCQlBTElHTl9IRUlHSFQoaHctPm1iX2hlaWdodCA8PCAoaF9zaGlmdCAtIDEpKTsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X2NhbnZhc19jb25maWdbMV0uYmxvY2tfbW9kZSA9CisJCQkJaHctPmNhbnZhc19tb2RlOworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkiJXMsIHZkZWNfZHc6IGFsbG9jIGJ1ZiBmb3IgYnVmc3BlYyVkIGJsa21vZCAlZFxuIiwKKwkJCQkJX19mdW5jX18sIGksIGh3LT5jYW52YXNfbW9kZSk7CisJCX0KKyNlbmRpZgorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdmgyNjRfcHV0X3ZpZGVvX2ZyYW1lKHZvaWQgKnZkZWNfY3R4LCBzdHJ1Y3QgdmZyYW1lX3MgKnZmKQoreworCXZoMjY0X3ZmX3B1dCh2ZiwgdmRlY19jdHgpOworfQorCitzdGF0aWMgdm9pZCB2aDI2NF9nZXRfdmlkZW9fZnJhbWUodm9pZCAqdmRlY19jdHgsIHN0cnVjdCB2ZnJhbWVfcyAqKnZmKQoreworCSp2ZiA9IHZoMjY0X3ZmX2dldCh2ZGVjX2N0eCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGFza19vcHNfcyB0YXNrX2RlY19vcHMgPSB7CisJLnR5cGUJCT0gVEFTS19UWVBFX0RFQywKKwkuZ2V0X3ZmcmFtZQk9IHZoMjY0X2dldF92aWRlb19mcmFtZSwKKwkucHV0X3ZmcmFtZQk9IHZoMjY0X3B1dF92aWRlb19mcmFtZSwKK307CisKK3N0YXRpYyBpbnQgYWxsb2Nfb25lX2J1Zl9zcGVjX2Zyb21fcXVldWUoc3RydWN0IHZkZWNfaDI2NF9od19zICpodywgaW50IGlkeCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9zcGVjX3MgKmJzID0gJmh3LT5idWZmZXJfc3BlY1tpZHhdOworCXN0cnVjdCBjYW52YXNfY29uZmlnX3MgKnlfY2FudmFzX2NmZyA9IE5VTEw7CisJc3RydWN0IGNhbnZhc19jb25maWdfcyAqY19jYW52YXNfY2ZnID0gTlVMTDsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPSBOVUxMOworCXVuc2lnbmVkIGludCB5X2FkZHIgPSAwLCBjX2FkZHIgPSAwOworCisJaWYgKElTX0VSUl9PUl9OVUxMKGh3LT52NGwyX2N0eCkpIHsKKwkJcHJfZXJyKCJ0aGUgdjRsIGNvbnRleHQgaGFzIGVyci5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGJzLT5jbWFfYWxsb2NfYWRkcikKKwkJcmV0dXJuIDA7CisKKwljdHggPSAoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVjRMX0RFVEFJTCwKKwkJIlslZF0gJXMoKSwgdHJ5IGFsbG9jIGZyb20gdjRsIHF1ZXVlIGJ1ZiBzaXplOiAlZFxuIiwKKwkJY3R4LT5pZCwgX19mdW5jX18sCisJCShody0+bWJfdG90YWwgPDwgOCkgKyAoaHctPm1iX3RvdGFsIDw8IDcpKTsKKworCXJldCA9IGN0eC0+ZmJfb3BzLmFsbG9jKCZjdHgtPmZiX29wcywgaHctPmZiX3Rva2VuLCAmZmIsIEFNTF9GQl9SRVFfREVDKTsKKwlpZiAocmV0IDwgMCkgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WNExfREVUQUlMLAorCQkJIlslZF0gZ2V0IGZiIGZhaWwuXG4iLCBjdHgtPmlkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlicy0+Y21hX2FsbG9jX2FkZHIgPSAodW5zaWduZWQgbG9uZylmYjsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WNExfREVUQUlMLAorCQkiWyVkXSAlcygpLCBjbWEgYWxsb2MgYWRkcjogMHgleCwgb3V0ICVkIGRlYyAlZFxuIiwKKwkJY3R4LT5pZCwgX19mdW5jX18sIGJzLT5jbWFfYWxsb2NfYWRkciwKKwkJY3R4LT5jYXBfcG9vbC5vdXQsIGN0eC0+Y2FwX3Bvb2wuZGVjKTsKKworCWlmIChmYi0+bnVtX3BsYW5lcyA9PSAxKSB7CisJCXlfYWRkciA9IGZiLT5tLm1lbVswXS5hZGRyOworCQljX2FkZHIgPSBmYi0+bS5tZW1bMF0uYWRkciArIGZiLT5tLm1lbVswXS5vZmZzZXQ7CisJCWZiLT5tLm1lbVswXS5ieXRlc191c2VkID0gZmItPm0ubWVtWzBdLnNpemU7CisJfSBlbHNlIGlmIChmYi0+bnVtX3BsYW5lcyA9PSAyKSB7CisJCXlfYWRkciA9IGZiLT5tLm1lbVswXS5hZGRyOworCQljX2FkZHIgPSBmYi0+bS5tZW1bMV0uYWRkcjsKKwkJZmItPm0ubWVtWzBdLmJ5dGVzX3VzZWQgPSBmYi0+bS5tZW1bMF0uc2l6ZTsKKwkJZmItPm0ubWVtWzFdLmJ5dGVzX3VzZWQgPSBmYi0+bS5tZW1bMV0uc2l6ZTsKKwl9CisKKwlmYi0+dGFzay0+YXR0YWNoKGZiLT50YXNrLCAmdGFza19kZWNfb3BzLCBod190b192ZGVjKGh3KSk7CisJZmItPnN0YXR1cyA9IEZCX1NUX0RFQ09ERVI7CisKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WNExfREVUQUlMLAorCQkiWyVkXSAlcygpLCB5X2FkZHI6ICV4LCBzaXplOiAldVxuIiwKKwkJY3R4LT5pZCwgX19mdW5jX18sIHlfYWRkciwgZmItPm0ubWVtWzBdLnNpemUpOworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1Y0TF9ERVRBSUwsCisJCSJbJWRdICVzKCksIGNfYWRkcjogJXgsIHNpemU6ICV1XG4iLAorCQljdHgtPmlkLCBfX2Z1bmNfXywgY19hZGRyLCBmYi0+bS5tZW1bMV0uc2l6ZSk7CisKKwlicy0+eV9hZGRyID0geV9hZGRyOworCWJzLT51X2FkZHIgPSBjX2FkZHI7CisJYnMtPnZfYWRkciA9IGNfYWRkcjsKKworCXlfY2FudmFzX2NmZyA9ICZicy0+Y2FudmFzX2NvbmZpZ1swXTsKKwljX2NhbnZhc19jZmcgPSAmYnMtPmNhbnZhc19jb25maWdbMV07CisKKwl5X2NhbnZhc19jZmctPnBoeV9hZGRyCT0geV9hZGRyOworCXlfY2FudmFzX2NmZy0+d2lkdGgJPSBody0+bWJfd2lkdGggPDwgNDsKKwl5X2NhbnZhc19jZmctPmhlaWdodAk9IGh3LT5tYl9oZWlnaHQgPDwgNDsKKwl5X2NhbnZhc19jZmctPmJsb2NrX21vZGUgPSBody0+Y2FudmFzX21vZGU7CisJLy9mYi0+bS5tZW1bMF0uYnl0ZXNfdXNlZCA9IHlfY2FudmFzX2NmZy0+d2lkdGggKiB5X2NhbnZhc19jZmctPmhlaWdodDsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WNExfREVUQUlMLAorCQkiWyVkXSAlcygpLCB5X3c6ICVkLCB5X2g6ICVkXG4iLCBjdHgtPmlkLCBfX2Z1bmNfXywKKwkJeV9jYW52YXNfY2ZnLT53aWR0aCx5X2NhbnZhc19jZmctPmhlaWdodCk7CisKKwljX2NhbnZhc19jZmctPnBoeV9hZGRyCT0gY19hZGRyOworCWNfY2FudmFzX2NmZy0+d2lkdGgJPSBody0+bWJfd2lkdGggPDwgNDsKKwljX2NhbnZhc19jZmctPmhlaWdodAk9IGh3LT5tYl9oZWlnaHQgPDwgMzsKKwljX2NhbnZhc19jZmctPmJsb2NrX21vZGUgPSBody0+Y2FudmFzX21vZGU7CisJLy9mYi0+bS5tZW1bMV0uYnl0ZXNfdXNlZCA9IGNfY2FudmFzX2NmZy0+d2lkdGggKiBjX2NhbnZhc19jZmctPmhlaWdodDsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WNExfREVUQUlMLAorCQkiWyVkXSAlcygpLCBjX3c6ICVkLCBjX2g6ICVkXG4iLCBjdHgtPmlkLCBfX2Z1bmNfXywKKwkJY19jYW52YXNfY2ZnLT53aWR0aCwgY19jYW52YXNfY2ZnLT5oZWlnaHQpOworCisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVjRMX0RFVEFJTCwKKwkJIlslZF0gJXMoKSwgYWxsb2MgYnVmIGZvciBidWZzcGVjJWRcbiIsIGN0eC0+aWQsIF9fZnVuY19fLCBpZHgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgY29uZmlnX2RlY29kZV9jYW52YXMoc3RydWN0IHZkZWNfaDI2NF9od19zICpodywgaW50IGkpCit7CisJaW50IGJsa21vZGUgPSBody0+Y2FudmFzX21vZGU7CisJaW50IGVuZGlhbiA9IDA7CisKKwlpZiAoYmxrbW9kZSA9PSBDQU5WQVNfQkxLTU9ERV9MSU5FQVIpIHsKKwkJaWYgKChoMjY0X2RlYnVnX2ZsYWcgJiBJR05PUkVfUEFSQU1fRlJPTV9DT05GSUcpID09IDApCisJCQllbmRpYW4gPSA3OworCQllbHNlCisJCQllbmRpYW4gPSAwOworCX0KKworCWlmIChody0+aXNfdXNlZF92NGwpCisJCWVuZGlhbiA9IDc7CisKKwljb25maWdfY2F2X2x1dF9leChody0+YnVmZmVyX3NwZWNbaV0uCisJCXlfY2FudmFzX2luZGV4LAorCQlody0+YnVmZmVyX3NwZWNbaV0ueV9hZGRyLAorCQlody0+bWJfd2lkdGggPDwgNCwKKwkJaHctPm1iX2hlaWdodCA8PCA0LAorCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCWJsa21vZGUsCisJCWVuZGlhbiwKKwkJVkRFQ18xKTsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpIHsKKwkJV1JJVEVfVlJFRyhWREVDX0FTU0lTVF9DQU5WQVNfQkxLMzIsCisJCQkJKDEgPDwgMTEpIHwgLyogY2FudmFzX2JsazMyX3dyICovCisJCQkJKGJsa21vZGUgPDwgMTApIHwgLyogY2FudmFzX2JsazMyKi8KKwkJCQkgKDEgPDwgOCkgfCAvKiBjYW52YXNfaW5kZXhfd3IqLworCQkJCShody0+YnVmZmVyX3NwZWNbaV0ueV9jYW52YXNfaW5kZXggPDwgMCkgLyogY2FudmFzIGluZGV4Ki8KKwkJCQkpOworCX0KKworCWNvbmZpZ19jYXZfbHV0X2V4KGh3LT5idWZmZXJfc3BlY1tpXS4KKwkJdV9jYW52YXNfaW5kZXgsCisJCWh3LT5idWZmZXJfc3BlY1tpXS51X2FkZHIsCisJCWh3LT5tYl93aWR0aCA8PCA0LAorCQlody0+bWJfaGVpZ2h0IDw8IDMsCisJCUNBTlZBU19BRERSX05PV1JBUCwKKwkJYmxrbW9kZSwKKwkJZW5kaWFuLAorCQlWREVDXzEpOworCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQSkgeworCQlXUklURV9WUkVHKFZERUNfQVNTSVNUX0NBTlZBU19CTEszMiwKKwkJCQkoMSA8PCAxMSkgfAorCQkJCShibGttb2RlIDw8IDEwKSB8CisJCQkJICgxIDw8IDgpIHwKKwkJCQkoaHctPmJ1ZmZlcl9zcGVjW2ldLnVfY2FudmFzX2luZGV4IDw8IDApKTsKKwl9CisKKwlXUklURV9WUkVHKEFOQzBfQ0FOVkFTX0FERFIgKyBody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX3BvcywKKwkJc3BlYzJjYW52YXMoJmh3LT5idWZmZXJfc3BlY1tpXSkpOworCisKKyNpZmRlZiAgVkRFQ19EVworCWlmICghSVNfVkRFQ19EVyhodykpCisJCXJldHVybjsKKwllbHNlIHsKKwkJY29uZmlnX2Nhdl9sdXRfZXgoaHctPmJ1ZmZlcl9zcGVjW2ldLgorCQkJdmRlY19kd195X2NhbnZhc19pbmRleCwKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X2NhbnZhc19jb25maWdbMF0ucGh5X2FkZHIsCisJCQlody0+YnVmZmVyX3NwZWNbaV0udmRlY19kd19jYW52YXNfY29uZmlnWzBdLndpZHRoLAorCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfY2FudmFzX2NvbmZpZ1swXS5oZWlnaHQsCisJCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCQlibGttb2RlLAorCQkJZW5kaWFuLAorCQkJVkRFQ18xKTsKKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQSkgeworCQkJV1JJVEVfVlJFRyhWREVDX0FTU0lTVF9DQU5WQVNfQkxLMzIsCisJCQkJKDEgPDwgMTEpIHwKKwkJCQkoYmxrbW9kZSA8PCAxMCkgfAorCQkJCSgxIDw8IDgpIHwKKwkJCQkoaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfeV9jYW52YXNfaW5kZXggPDwgMCkpOworCQl9CisKKwkJY29uZmlnX2Nhdl9sdXRfZXgoaHctPmJ1ZmZlcl9zcGVjW2ldLgorCQkJdmRlY19kd191X2NhbnZhc19pbmRleCwKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X2NhbnZhc19jb25maWdbMV0ucGh5X2FkZHIsCisJCQlody0+YnVmZmVyX3NwZWNbaV0udmRlY19kd19jYW52YXNfY29uZmlnWzFdLndpZHRoLAorCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfY2FudmFzX2NvbmZpZ1sxXS5oZWlnaHQsCisJCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCQlibGttb2RlLAorCQkJZW5kaWFuLAorCQkJVkRFQ18xKTsKKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQSkgeworCQkJV1JJVEVfVlJFRyhWREVDX0FTU0lTVF9DQU5WQVNfQkxLMzIsCisJCQkJKDEgPDwgMTEpIHwKKwkJCQkoYmxrbW9kZSA8PCAxMCkgfAorCQkJCSgxIDw8IDgpIHwKKwkJCQkoaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfdV9jYW52YXNfaW5kZXggPDwgMCkpOworCQl9CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19kZWNvZGVfY2FudmFzX2V4KHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcsIGludCBpKQoreworCXUzMiBibGttb2RlID0gaHctPmNhbnZhc19tb2RlOworCWludCBjYW52YXNfdzsKKwlpbnQgY2FudmFzX2g7CisKKwljYW52YXNfdyA9IGh3LT5mcmFtZV93aWR0aCAvCisJCWdldF9kb3VibGVfd3JpdGVfcmF0aW8oaHctPmRvdWJsZV93cml0ZV9tb2RlKTsKKwljYW52YXNfaCA9IGh3LT5mcmFtZV9oZWlnaHQgLworCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKGh3LT5kb3VibGVfd3JpdGVfbW9kZSk7CisKKwlpZiAoaHctPmNhbnZhc19tb2RlID09IDApCisJCWNhbnZhc193ID0gQUxJR04oY2FudmFzX3csIDMyKTsKKwllbHNlCisJCWNhbnZhc193ID0gQUxJR04oY2FudmFzX3csIDY0KTsKKwljYW52YXNfaCA9IEFMSUdOKGNhbnZhc19oLCAzMik7CisKKwljb25maWdfY2F2X2x1dF9leChody0+YnVmZmVyX3NwZWNbaV0uCisJCXlfY2FudmFzX2luZGV4LAorCQlody0+YnVmZmVyX3NwZWNbaV0uZHdfeV9hZHIsCisJCWNhbnZhc193LAorCQljYW52YXNfaCwKKwkJQ0FOVkFTX0FERFJfTk9XUkFQLAorCQlibGttb2RlLAorCQk3LAorCQlWREVDX0hFVkMpOworCisJY29uZmlnX2Nhdl9sdXRfZXgoaHctPmJ1ZmZlcl9zcGVjW2ldLgorCQl1X2NhbnZhc19pbmRleCwKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLmR3X3Vfdl9hZHIsCisJCWNhbnZhc193LAorCQljYW52YXNfaCwKKwkJQ0FOVkFTX0FERFJfTk9XUkFQLAorCQlibGttb2RlLAorCQk3LAorCQlWREVDX0hFVkMpOworfQorCitzdGF0aWMgaW50IHY0bF9nZXRfZnJlZV9idWZmZXJfc3BlYyhzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEJVRlNQRUNfUE9PTF9TSVpFOyBpKyspIHsKKwkJaWYgKGh3LT5idWZmZXJfc3BlY1tpXS5jbWFfYWxsb2NfYWRkciA9PSAwKQorCQkJcmV0dXJuIGk7CisJfQorCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHY0bF9maW5kX2J1ZmZlcl9zcGVjX2lkeChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LCB1bnNpZ25lZCBpbnQgdjRsX2luZHgpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQlVGU1BFQ19QT09MX1NJWkU7IGkrKykgeworCQlpZiAoaHctPmJ1ZmZlcl93cmFwW2ldID09IHY0bF9pbmR4KQorCQkJcmV0dXJuIGk7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCB2NGxfZ2V0X2ZyZWVfYnVmX2lkeChzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcgPSAoc3RydWN0IHZkZWNfaDI2NF9od19zICopdmRlYy0+cHJpdmF0ZTsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKiB2NGwgPSBody0+djRsMl9jdHg7CisJc3RydWN0IHY0bF9idWZmX3Bvb2wgKnBvb2wgPSAmdjRsLT5jYXBfcG9vbDsKKwlzdHJ1Y3QgYnVmZmVyX3NwZWNfcyAqcGljID0gTlVMTDsKKwlpbnQgaSwgcnQsIGlkeCA9IElOVkFMSURfSURYOworCXVsb25nIGZsYWdzOworCXUzMiBzdGF0ZSA9IDAsIGluZGV4OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5idWZzcGVjX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgcG9vbC0+aW47ICsraSkgeworCQlzdGF0ZSA9IChwb29sLT5zZXFbaV0gPj4gMTYpOworCQlpbmRleCA9IChwb29sLT5zZXFbaV0gJiAweGZmZmYpOworCisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBWNExfQ0FQX0JVRkZfSU5fREVDOgorCQkJcnQgPSB2NGxfZmluZF9idWZmZXJfc3BlY19pZHgoaHcsIGluZGV4KTsKKwkJCWlmIChydCA+PSAwKSB7CisJCQkJcGljID0gJmh3LT5idWZmZXJfc3BlY1tydF07CisJCQkJaWYgKChwaWMtPnZmX3JlZiA9PSAwKSAmJgorCQkJCQkocGljLT51c2VkID09IDApICYmCisJCQkJCXBpYy0+Y21hX2FsbG9jX2FkZHIpIHsKKwkJCQkJaWR4ID0gcnQ7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVjRMX0NBUF9CVUZGX0lOX00yTToKKwkJCXJ0ID0gdjRsX2dldF9mcmVlX2J1ZmZlcl9zcGVjKGh3KTsKKwkJCWlmIChydCA+PSAwKSB7CisJCQkJcGljID0gJmh3LT5idWZmZXJfc3BlY1tydF07CisJCQkJaWYgKCFhbGxvY19vbmVfYnVmX3NwZWNfZnJvbV9xdWV1ZShodywgcnQpKSB7CisJCQkJCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYjsKKwkJCQkJY29uZmlnX2RlY29kZV9jYW52YXMoaHcsIHJ0KTsKKwkJCQkJZmIgPSAoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKilwaWMtPmNtYV9hbGxvY19hZGRyOworCQkJCQlody0+YnVmZmVyX3dyYXBbcnRdID0gZmItPmJ1Zl9pZHg7CisJCQkJCWlkeCA9IHJ0OworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaWR4ICE9IElOVkFMSURfSURYKSB7CisJCQlwaWMtPnVzZWQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmJ1ZnNwZWNfbG9jaywgZmxhZ3MpOworCisJaWYgKGlkeCA8IDApIHsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsICIlcyBmYWlsLCBzdGF0ZSAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJZm9yIChpID0gMDsgaSA8IEJVRlNQRUNfUE9PTF9TSVpFOyBpKyspIHsKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLCAiJXMsICVkXG4iLAorCQkJCV9fZnVuY19fLCBody0+YnVmZmVyX3dyYXBbaV0pOworCQl9CisJCXZtaDI2NF9kdW1wX3N0YXRlKHZkZWMpOworCX0gZWxzZSB7CisJCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9CisJCQkoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKilwaWMtPmNtYV9hbGxvY19hZGRyOworCisJCWZiLT5zdGF0dXMgPSBGQl9TVF9ERUNPREVSOworCisJCXY0bC0+YXV4X2luZm9zLmJpbmRfc2VpX2J1ZmZlcih2NGwsICZwaWMtPmF1eF9kYXRhX2J1ZiwKKwkJCSZwaWMtPmF1eF9kYXRhX3NpemUsICZwaWMtPmN0eF9idWZfaWR4KTsKKwl9CisKKwlyZXR1cm4gaWR4OworfQorCitpbnQgZ2V0X2ZyZWVfYnVmX2lkeChzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgYWRkciwgZmxhZ3M7CisJaW50IGluZGV4ID0gLTE7CisJc3RydWN0IHZkZWNfaDI2NF9od19zICpodyA9IChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKil2ZGVjLT5wcml2YXRlOworCWludCBidWZfdG90YWwgPSBCVUZTUEVDX1BPT0xfU0laRTsKKworCWlmIChody0+aXNfdXNlZF92NGwpCisJCXJldHVybiB2NGxfZ2V0X2ZyZWVfYnVmX2lkeCh2ZGVjKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZody0+YnVmc3BlY19sb2NrLCBmbGFncyk7CisJLypody0+c3RhcnRfc2VhcmNoX3BvcyA9IDA7Ki8KKwlmb3IgKGkgPSBody0+c3RhcnRfc2VhcmNoX3BvczsgaSA8IGJ1Zl90b3RhbDsgaSsrKSB7CisJCWlmIChody0+bW11X2VuYWJsZSkKKwkJCWFkZHIgPSBody0+YnVmZmVyX3NwZWNbaV0uYWxsb2NfaGVhZGVyX2FkZHI7CisJCWVsc2UKKwkJCWFkZHIgPSBody0+YnVmZmVyX3NwZWNbaV0uY21hX2FsbG9jX2FkZHI7CisKKwkJaWYgKGh3LT5idWZmZXJfc3BlY1tpXS52Zl9yZWYgPT0gMCAmJgorCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnVzZWQgPT0gMCAmJiBhZGRyKSB7CisJCQlody0+YnVmZmVyX3NwZWNbaV0udXNlZCA9IDE7CisJCQlody0+c3RhcnRfc2VhcmNoX3BvcyA9IGkrMTsKKwkJCWluZGV4ID0gaTsKKwkJCWh3LT5idWZmZXJfd3JhcFtpXSA9IGluZGV4OworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGluZGV4IDwgMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgaHctPnN0YXJ0X3NlYXJjaF9wb3M7IGkrKykgeworCQkJaWYgKGh3LT5tbXVfZW5hYmxlKQorCQkJCWFkZHIgPSBody0+YnVmZmVyX3NwZWNbaV0uYWxsb2NfaGVhZGVyX2FkZHI7CisJCQllbHNlCisJCQkJYWRkciA9IGh3LT5idWZmZXJfc3BlY1tpXS5jbWFfYWxsb2NfYWRkcjsKKworCQkJaWYgKGh3LT5idWZmZXJfc3BlY1tpXS52Zl9yZWYgPT0gMCAmJgorCQkJCWh3LT5idWZmZXJfc3BlY1tpXS51c2VkID09IDAgJiYgYWRkcikgeworCQkJCWh3LT5idWZmZXJfc3BlY1tpXS51c2VkID0gMTsKKwkJCQlody0+c3RhcnRfc2VhcmNoX3BvcyA9IGkrMTsKKwkJCQlpbmRleCA9IGk7CisJCQkJaHctPmJ1ZmZlcl93cmFwW2ldID0gaW5kZXg7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+YnVmc3BlY19sb2NrLCBmbGFncyk7CisJaWYgKGh3LT5zdGFydF9zZWFyY2hfcG9zID49IGJ1Zl90b3RhbCkKKwkJaHctPnN0YXJ0X3NlYXJjaF9wb3MgPSAwOworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkiJXMsIGJ1Zl9zcGVjX251bSAlZFxuIiwgX19mdW5jX18sIGluZGV4KTsKKworCWlmIChpbmRleCA8IDApIHsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRVJST1IsCisJCQkiJXMgZmFpbFxuIiwgX19mdW5jX18pOworCQl2bWgyNjRfZHVtcF9zdGF0ZSh2ZGVjKTsKKwl9CisKKwlpZiAoZHBiX2lzX2RlYnVnKERFQ09ERV9JRChodyksCisJCVBSSU5UX0ZMQUdfRFVNUF9CVUZTUEVDKSkKKwkJZHVtcF9idWZzcGVjKGh3LCBfX2Z1bmNfXyk7CisJcmV0dXJuIGluZGV4OworfQorCitpbnQgcmVsZWFzZV9idWZfc3BlY19udW0oc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGJ1Zl9zcGVjX251bSkKK3sKKwkvKnUzMiBjdXJfYnVmX2lkeDsqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHZkZWNfaDI2NF9od19zICpodyA9IChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKil2ZGVjLT5wcml2YXRlOworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX01NVV9ERVRBSUwsCisJCSIlcyBidWZfc3BlY19udW0gJWQgdXNlZCAlZFxuIiwKKwkJX19mdW5jX18sIGJ1Zl9zcGVjX251bSwKKwkJYnVmX3NwZWNfbnVtID4gMCA/IGh3LT5idWZmZXJfc3BlY1tidWZfc3BlY19udW1dLnVzZWQgOiAwKTsKKwlpZiAoYnVmX3NwZWNfbnVtID49IDAgJiYKKwkJYnVmX3NwZWNfbnVtIDwgQlVGU1BFQ19QT09MX1NJWkUKKwkJKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZody0+YnVmc3BlY19sb2NrLCBmbGFncyk7CisJCWh3LT5idWZmZXJfc3BlY1tidWZfc3BlY19udW1dLnVzZWQgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+YnVmc3BlY19sb2NrLCBmbGFncyk7CisJCWlmIChody0+bW11X2VuYWJsZSkgeworCQkJLypXUklURV9WUkVHKENVUlJfQ0FOVkFTX0NUUkwsIGJ1Zl9zcGVjX251bTw8MjQpOworCQkJY3VyX2J1Zl9pZHggPSBSRUFEX1ZSRUcoQ1VSUl9DQU5WQVNfQ1RSTCk7CisJCQljdXJfYnVmX2lkeCA9IGN1cl9idWZfaWR4JjB4ZmY7Ki8KKwkJCWRlY29kZXJfbW11X2JveF9mcmVlX2lkeChody0+bW11X2JveCwgYnVmX3NwZWNfbnVtKTsKKwkJfQorCQlyZWxlYXNlX2F1eF9kYXRhKGh3LCBidWZfc3BlY19udW0pOworCX0KKwlpZiAoZHBiX2lzX2RlYnVnKERFQ09ERV9JRChodyksCisJCVBSSU5UX0ZMQUdfRFVNUF9CVUZTUEVDKSkKKwkJZHVtcF9idWZzcGVjKGh3LCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19idWZfc3BlY3Moc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlpbnQgaSwgajsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcgPSAoc3RydWN0IHZkZWNfaDI2NF9od19zICopdmRlYy0+cHJpdmF0ZTsKKwlpbnQgbW9kZSA9IElTX1ZERUNfRFcoaHcpID8gMiA6IDE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmJ1ZnNwZWNfbG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDAsIGogPSAwOworCQlqIDwgaHctPmRwYi5tRFBCLnNpemUKKwkJJiYgaSA8IEJVRlNQRUNfUE9PTF9TSVpFOworCQlpKyspIHsKKwkJaW50IGNhbnZhczsKKwkJaWYgKGh3LT5idWZmZXJfc3BlY1tpXS51c2VkICE9IC0xKQorCQkJY29udGludWU7CisJCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQkJaWYgKGh3LT5idWZmZXJfc3BlY1tpXS55X2NhbnZhc19pbmRleCA9PSAtMSkKKwkJCQlody0+YnVmZmVyX3NwZWNbaV0ueV9jYW52YXNfaW5kZXggPSB2ZGVjLT5nZXRfY2FudmFzX2V4KENPUkVfTUFTS19WREVDXzEsIHZkZWMtPmlkKTsKKwkJCWlmIChody0+YnVmZmVyX3NwZWNbaV0udV9jYW52YXNfaW5kZXggPT0gLTEpIHsKKwkJCQlody0+YnVmZmVyX3NwZWNbaV0udV9jYW52YXNfaW5kZXggPSB2ZGVjLT5nZXRfY2FudmFzX2V4KENPUkVfTUFTS19WREVDXzEsIHZkZWMtPmlkKTsKKwkJCQlody0+YnVmZmVyX3NwZWNbaV0udl9jYW52YXNfaW5kZXggPSBody0+YnVmZmVyX3NwZWNbaV0udV9jYW52YXNfaW5kZXg7CisJCQl9CisjaWZkZWYgVkRFQ19EVworCQkJaWYgKElTX1ZERUNfRFcoaHcpKSB7CisJCQkJaWYgKGh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X3lfY2FudmFzX2luZGV4ID09IC0xKQorCQkJCQlody0+YnVmZmVyX3NwZWNbaV0udmRlY19kd195X2NhbnZhc19pbmRleCA9CisJCQkJCQl2ZGVjLT5nZXRfY2FudmFzX2V4KENPUkVfTUFTS19WREVDXzEsIHZkZWMtPmlkKTsKKwkJCQlpZiAoaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfdV9jYW52YXNfaW5kZXggPT0gLTEpIHsKKwkJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfdV9jYW52YXNfaW5kZXggPQorCQkJCQkJdmRlYy0+Z2V0X2NhbnZhc19leChDT1JFX01BU0tfVkRFQ18xLCB2ZGVjLT5pZCk7CisJCQkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X3ZfY2FudmFzX2luZGV4ID0KKwkJCQkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X3VfY2FudmFzX2luZGV4OworCQkJCX0KKwkJCX0KKyNlbmRpZgorCQl9IGVsc2UgeworCQkJY2FudmFzID0gdmRlYy0+Z2V0X2NhbnZhcyhqICogbW9kZSwgMik7CisJCQlody0+YnVmZmVyX3NwZWNbaV0ueV9jYW52YXNfaW5kZXggPSBjYW52YXNfeShjYW52YXMpOworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnVfY2FudmFzX2luZGV4ID0gY2FudmFzX3UoY2FudmFzKTsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS52X2NhbnZhc19pbmRleCA9IGNhbnZhc192KGNhbnZhcyk7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJCQkiY29uZmlnIGNhbnZhcyAoJWQpICV4IGZvciBidWZzcGVjICVkXHJcbiIsCisJCQkJaiwgY2FudmFzLCBpKTsKKyNpZmRlZiBWREVDX0RXCisJCSAgaWYgKElTX1ZERUNfRFcoaHcpKSB7CisJCQljYW52YXMgPSB2ZGVjLT5nZXRfY2FudmFzKGogKiBtb2RlICsgMSwgMik7CisJCQlody0+YnVmZmVyX3NwZWNbaV0udmRlY19kd195X2NhbnZhc19pbmRleCA9IGNhbnZhc195KGNhbnZhcyk7CisJCQlody0+YnVmZmVyX3NwZWNbaV0udmRlY19kd191X2NhbnZhc19pbmRleCA9IGNhbnZhc191KGNhbnZhcyk7CisJCQlody0+YnVmZmVyX3NwZWNbaV0udmRlY19kd192X2NhbnZhc19pbmRleCA9IGNhbnZhc192KGNhbnZhcyk7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJInZkZWNfZHc6IGNvbmZpZyBjYW52YXMgKCVkKSAleCBmb3IgYnVmc3BlYyAlZFxyXG4iLAorCQkJCWosIGNhbnZhcywgaSk7CisJCSAgfQorI2VuZGlmCisJCX0KKworCQlody0+YnVmZmVyX3NwZWNbaV0udXNlZCA9IDA7CisJCWh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfcG9zID0gajsKKworCisJCWorKzsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmJ1ZnNwZWNfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBjb25maWdfYnVmX3NwZWNzX2V4KHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJaW50IGksIGo7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJaW50IG1vZGUgPSBJU19WREVDX0RXKGh3KSA/IDIgOiAxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5idWZzcGVjX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwLCBqID0gMDsKKwkJaiA8IGh3LT5kcGIubURQQi5zaXplCisJCSYmIGkgPCBCVUZTUEVDX1BPT0xfU0laRTsKKwkJaSsrKSB7CisJCWludCBjYW52YXMgPSAwOworCQlpZiAoaHctPmJ1ZmZlcl9zcGVjW2ldLnVzZWQgIT0gLTEpCisJCQljb250aW51ZTsKKwkJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCQlpZiAoaHctPmJ1ZmZlcl9zcGVjW2ldLnlfY2FudmFzX2luZGV4ID09IC0xKQorCQkJCWh3LT5idWZmZXJfc3BlY1tpXS55X2NhbnZhc19pbmRleCA9IHZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX1ZERUNfMSwgdmRlYy0+aWQpOworCQkJaWYgKGh3LT5idWZmZXJfc3BlY1tpXS51X2NhbnZhc19pbmRleCA9PSAtMSkgeworCQkJCWh3LT5idWZmZXJfc3BlY1tpXS51X2NhbnZhc19pbmRleCA9IHZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX1ZERUNfMSwgdmRlYy0+aWQpOworCQkJCWh3LT5idWZmZXJfc3BlY1tpXS52X2NhbnZhc19pbmRleCA9IGh3LT5idWZmZXJfc3BlY1tpXS51X2NhbnZhc19pbmRleDsKKwkJCX0KKyNpZmRlZiBWREVDX0RXCisJCQlpZiAoSVNfVkRFQ19EVyhodykpIHsKKwkJCQlpZiAoaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfeV9jYW52YXNfaW5kZXggPT0gLTEpCisJCQkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X3lfY2FudmFzX2luZGV4ID0KKwkJCQkJCXZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX1ZERUNfMSwgdmRlYy0+aWQpOworCQkJCWlmIChody0+YnVmZmVyX3NwZWNbaV0udmRlY19kd191X2NhbnZhc19pbmRleCA9PSAtMSkgeworCQkJCQlody0+YnVmZmVyX3NwZWNbaV0udmRlY19kd191X2NhbnZhc19pbmRleCA9CisJCQkJCQl2ZGVjLT5nZXRfY2FudmFzX2V4KENPUkVfTUFTS19WREVDXzEsIHZkZWMtPmlkKTsKKwkJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfdl9jYW52YXNfaW5kZXggPQorCQkJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfdV9jYW52YXNfaW5kZXg7CisJCQkJfQorCQkJfQorI2VuZGlmCisJCX0gZWxzZSB7CisJCQljYW52YXMgPSB2ZGVjLT5nZXRfY2FudmFzKGoqIG1vZGUsIDIpOworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnlfY2FudmFzX2luZGV4ID0gY2FudmFzX3koY2FudmFzKTsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS51X2NhbnZhc19pbmRleCA9IGNhbnZhc191KGNhbnZhcyk7CisJCQlody0+YnVmZmVyX3NwZWNbaV0udl9jYW52YXNfaW5kZXggPSBjYW52YXNfdihjYW52YXMpOworCisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCQkJUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJCQkiY29uZmlnIGNhbnZhcyAoJWQpICV4IGZvciBidWZzcGVjICVkXHJcbiIsCisJCQkJaiwgY2FudmFzLCBpKTsKKyNpZmRlZiBWREVDX0RXCisJCQlpZiAoSVNfVkRFQ19EVyhodykpIHsKKwkJCQljYW52YXMgPSB2ZGVjLT5nZXRfY2FudmFzKGoqbW9kZSArIDEsIDIpOworCQkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X3lfY2FudmFzX2luZGV4ID0gY2FudmFzX3koY2FudmFzKTsKKwkJCQlody0+YnVmZmVyX3NwZWNbaV0udmRlY19kd191X2NhbnZhc19pbmRleCA9IGNhbnZhc191KGNhbnZhcyk7CisJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfdl9jYW52YXNfaW5kZXggPSBjYW52YXNfdihjYW52YXMpOworCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLAorCQkJCQlQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJCSJ2ZGVjX2R3OiBjb25maWcgY2FudmFzICglZCkgJXggZm9yIGJ1ZnNwZWMgJWRcclxuIiwKKwkJCQkJaiwgY2FudmFzLCBpKTsKKwkJCX0KKyNlbmRpZgorCQl9CisKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLnVzZWQgPSAwOworCQlody0+YnVmZmVyX3NwZWNbaV0uYWxsb2NfaGVhZGVyX2FkZHIgPSAwOworCQlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX3BvcyA9IGo7CisKKwkJaisrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+YnVmc3BlY19sb2NrLCBmbGFncyk7Cit9CisKKworc3RhdGljIHZvaWQgZGVhbGxvY19idWZfc3BlY3Moc3RydWN0IHZkZWNfaDI2NF9od19zICpodywKKwl1bnNpZ25lZCBjaGFyIHJlbGVhc2VfYWxsKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBkZWFsbG9jX2ZsYWcgPSAwOworCWZvciAoaSA9IDA7IGkgPCBCVUZTUEVDX1BPT0xfU0laRTsgaSsrKSB7CisJCWlmIChody0+YnVmZmVyX3NwZWNbaV0udXNlZCA9PSA0IHx8CisJCQlyZWxlYXNlX2FsbCkgeworCQkJZGVhbGxvY19mbGFnID0gMTsKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLAorCQkJCVBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCQkiJXMgYnVmX3NwZWNfbnVtICVkXG4iLAorCQkJCV9fZnVuY19fLCBpCisJCQkJKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlCisJCQkJKCZody0+YnVmc3BlY19sb2NrLCBmbGFncyk7CisJCQlody0+YnVmZmVyX3NwZWNbaV0udXNlZCA9IC0xOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZQorCQkJCSgmaHctPmJ1ZnNwZWNfbG9jaywgZmxhZ3MpOworCQkJcmVsZWFzZV9hdXhfZGF0YShodywgaSk7CisKKwkJCWlmICghaHctPm1tdV9lbmFibGUpIHsKKwkJCQlpZiAoaHctPmJ1ZmZlcl9zcGVjW2ldLmNtYV9hbGxvY19hZGRyKSB7CisJCQkJCWlmICghaHctPmlzX3VzZWRfdjRsKSB7CisJCQkJCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWVfaWR4KAorCQkJCQkJCWh3LT5ibW11X2JveCwKKwkJCQkJCQlpKTsKKwkJCQkJfQorCQkJCQlzcGluX2xvY2tfaXJxc2F2ZQorCQkJCQkJKCZody0+YnVmc3BlY19sb2NrLCBmbGFncyk7CisJCQkJCWh3LT5idWZmZXJfc3BlY1tpXS5jbWFfYWxsb2NfYWRkciA9IDA7CisJCQkJCWh3LT5idWZmZXJfc3BlY1tpXS5idWZfYWRyID0gMDsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZQorCQkJCQkJKCZody0+YnVmc3BlY19sb2NrLCBmbGFncyk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoaHctPmJ1ZmZlcl9zcGVjW2ldLmFsbG9jX2hlYWRlcl9hZGRyKSB7CisJCQkJCWRlY29kZXJfbW11X2JveF9mcmVlX2lkeCgKKwkJCQkJCWh3LT5tbXVfYm94LAorCQkJCQkJaSk7CisJCQkJCXNwaW5fbG9ja19pcnFzYXZlCisJCQkJCQkoJmh3LT5idWZzcGVjX2xvY2ssIGZsYWdzKTsKKwkJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLgorCQkJCQkJYWxsb2NfaGVhZGVyX2FkZHIgPSAwOworCQkJCQlody0+YnVmZmVyX3NwZWNbaV0uYnVmX2FkciA9IDA7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUKKwkJCQkJCSgmaHctPmJ1ZnNwZWNfbG9jaywgZmxhZ3MpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZiAoZGVhbGxvY19mbGFnICYmCisJCWRwYl9pc19kZWJ1ZyhERUNPREVfSUQoaHcpLAorCQlQUklOVF9GTEFHX0RVTVBfQlVGU1BFQykpCisJCWR1bXBfYnVmc3BlYyhodywgX19mdW5jX18pOworCXJldHVybjsKK30KKwordW5zaWduZWQgY2hhciBoYXZlX2ZyZWVfYnVmX3NwZWMoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJc3RydWN0IHZkZWNfaDI2NF9od19zICpodyA9IChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKil2ZGVjLT5wcml2YXRlOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqIGN0eCA9IGh3LT52NGwyX2N0eDsKKwlpbnQgY2FudmFzX3Bvc19taW4gPSBCVUZTUEVDX1BPT0xfU0laRTsKKwlpbnQgaW5kZXggPSAtMTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgYWxsb2NhdGVkX2NvdW50ID0gMDsKKworCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJc3RydWN0IGgyNjRfZHBiX3N0cnUgKmRwYiA9ICZody0+ZHBiOworCQlpbnQgZnJlZV9jb3VudCA9IDA7CisJCWludCB1c2VkX2NvdW50ID0gMDsKKworCQkvKiB0cmlnZ2VyIHRvIHBhcnNlIGhlYWQgZGF0YS4gKi8KKwkJaWYgKCFody0+djRsX3BhcmFtc19wYXJzZWQpCisJCQlyZXR1cm4gMTsKKworCQlpZiAoZHBiLT5tRFBCLnVzZWRfc2l6ZSA+PSBkcGItPm1EUEIuc2l6ZSAtIDEpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoY3R4LT5jYXBfcG9vbC5kZWMgPCBody0+ZHBiLm1EUEIuc2l6ZSkgeworCQkJaWYgKGN0eC0+ZmJfb3BzLnF1ZXJ5KCZjdHgtPmZiX29wcywgJmh3LT5mYl90b2tlbikpIHsKKwkJCQlmcmVlX2NvdW50ID0KKwkJCQkJdjRsMl9tMm1fbnVtX2RzdF9idWZzX3JlYWR5KGN0eC0+bTJtX2N0eCkgKyAxOworCQkJfQorCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IGh3LT5kcGIubURQQi5zaXplOyBpKyspIHsKKwkJCWlmIChody0+YnVmZmVyX3NwZWNbaV0udXNlZCA9PSAwICYmCisJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZmX3JlZiA9PSAwICYmCisJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNtYV9hbGxvY19hZGRyKSB7CisJCQkJZnJlZV9jb3VudCsrOworCQkJfSBlbHNlIGlmIChody0+YnVmZmVyX3NwZWNbaV0uY21hX2FsbG9jX2FkZHIpCisJCQkJdXNlZF9jb3VudCsrOworCQl9CisKKwkJQVRSQUNFX0NPVU5URVIoIlZfU1RfREVDLWZyZWVfYnVmZl9jb3VudCIsIGZyZWVfY291bnQpOworCQlBVFJBQ0VfQ09VTlRFUigiVl9TVF9ERUMtdXNlZF9idWZmX2NvdW50IiwgdXNlZF9jb3VudCk7CisKKwkJcmV0dXJuIGZyZWVfY291bnQgPj0gcnVuX3JlYWR5X21pbl9idWZfbnVtID8gMSA6IDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEJVRlNQRUNfUE9PTF9TSVpFOyBpKyspIHsKKwkJaWYgKGh3LT5tbXVfZW5hYmxlKQorCQkJYWRkciA9IGh3LT5idWZmZXJfc3BlY1tpXS5hbGxvY19oZWFkZXJfYWRkcjsKKwkJZWxzZQorCQkJYWRkciA9IGh3LT5idWZmZXJfc3BlY1tpXS5jbWFfYWxsb2NfYWRkcjsKKwkJaWYgKGh3LT5idWZmZXJfc3BlY1tpXS51c2VkID09IDAgJiYKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS52Zl9yZWYgPT0gMCkgeworCisJCQlpZiAoYWRkcikKKwkJCQlyZXR1cm4gMTsKKwkJCWlmIChody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX3BvcyA8IGNhbnZhc19wb3NfbWluKSB7CisJCQkJY2FudmFzX3Bvc19taW4gPSBody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX3BvczsKKwkJCQlpbmRleCA9IGk7CisJCQl9CisJCX0KKwkJaWYgKGFkZHIpCisJCQlhbGxvY2F0ZWRfY291bnQrKzsKKwl9CisJaWYgKGluZGV4ID49IDApIHsKKwkJbXV0ZXhfbG9jaygmdm1oMjY0X211dGV4KTsKKwkJZGVhbGxvY19idWZfc3BlY3MoaHcsIDApOworCQlpZiAobWF4X2FsbG9jX2J1Zl9jb3VudCA9PSAwIHx8CisJCQlhbGxvY2F0ZWRfY291bnQgPCBtYXhfYWxsb2NfYnVmX2NvdW50KSB7CisJCQlpZiAoYWxsb2Nfb25lX2J1Zl9zcGVjKGh3LCBpbmRleCkgPj0gMCkKKwkJCQlyZXQgPSAxOworCQl9CisJCW11dGV4X3VubG9jaygmdm1oMjY0X211dGV4KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdldF9idWZfc3BlY19ieV9jYW52YXNfcG9zKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcsCisJaW50IGNhbnZhc19wb3MpCit7CisJaW50IGk7CisJaW50IGogPSAwOworCWZvciAoaSA9IDA7IGkgPCBCVUZTUEVDX1BPT0xfU0laRTsgaSsrKSB7CisJCWlmIChody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX3BvcyA+PSAwKSB7CisJCQlpZiAoaiA9PSBjYW52YXNfcG9zKQorCQkJCXJldHVybiBpOworCQkJaisrOworCQl9CisJfQorCXJldHVybiAtMTsKK30KK3N0YXRpYyB2b2lkIHVwZGF0ZV92Zl9tZW1oYW5kbGUoc3RydWN0IHZkZWNfaDI2NF9od19zICpodywKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmLCBpbnQgaW5kZXgpCit7CisJaWYgKGluZGV4IDwgMCkgeworCQl2Zi0+bWVtX2hhbmRsZSA9IE5VTEw7CisJCXZmLT5tZW1faGVhZF9oYW5kbGUgPSBOVUxMOworCX0gZWxzZSBpZiAodmYtPnR5cGUgJiBWSURUWVBFX1NDQVRURVIpIHsKKwkJdmYtPm1lbV9oYW5kbGUgPQorCQkJZGVjb2Rlcl9tbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCWh3LT5tbXVfYm94LCBpbmRleCk7CisJCXZmLT5tZW1faGVhZF9oYW5kbGUgPQorCQkJZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCQlody0+Ym1tdV9ib3gsIEhFQURFUl9CVUZGRVJfSURYKGluZGV4KSk7CisJfSBlbHNlIHsKKwkJdmYtPm1lbV9oYW5kbGUgPQorCQkJZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCQlody0+Ym1tdV9ib3gsIFZGX0JVRkZFUl9JRFgoaW5kZXgpKTsKKwkvKgl2Zi0+bWVtX2hlYWRfaGFuZGxlID0KKwkJCWRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJaHctPmJtbXVfYm94LCBIRUFERVJfQlVGRkVSX0lEWChpbmRleCkpOyovCisJfQorCXJldHVybjsKK30KK3N0YXRpYyBpbnQgY2hlY2tfZm9yY2VfaW50ZXJsYWNlKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcsCisJc3RydWN0IEZyYW1lU3RvcmUgKmZyYW1lKQoreworCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gJmh3LT5kcGI7CisJaW50IGJGb3JjZUludGVybGFjZSA9IDA7CisJLyogbm8gZGkgaW4gc2VjdXJlIG1vZGUsIGRpc2FibGUgZm9yY2UgZGkgKi8KKwlpZiAodmRlY19zZWN1cmUoaHdfdG9fdmRlYyhodykpKQorCQlyZXR1cm4gMDsKKworCWlmIChody0+aXNfdXNlZF92NGwpCisJCXJldHVybiAwOworCisJaWYgKChkZWNfY29udHJvbCAmIERFQ19DT05UUk9MX0ZMQUdfRk9SQ0VfMjk5N18xMDgwUF9JTlRFUkxBQ0UpCisJCSYmIGh3LT5iaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZworCQkmJiAoaHctPmZyYW1lX3dpZHRoID09IDE5MjApCisJCSYmIChody0+ZnJhbWVfaGVpZ2h0ID49IDEwODApIC8qIEZvciBiZWluZyBjb21wYXRpYmxlIHdpdGggYSBmYWtlIHByb2dyZXNzaXZlIHN0cmVhbSB3aGljaCBpcyBpbnRlcmxhY2VkIGFjdHVhbGx5Ki8KKwkJJiYgKGh3LT5mcmFtZV9kdXIgPT0gMzIwMyB8fCAoaHctPmZyYW1lX2R1ciA9PSAzODQwICYmIHBfSDI2NF9EcGItPm1TUFMucHJvZmlsZV9pZGMgPT0gMTAwICYmCisJCXBfSDI2NF9EcGItPm1TUFMubGV2ZWxfaWRjID09IDQwKSkpIHsKKwkJYkZvcmNlSW50ZXJsYWNlID0gMTsKKwl9IGVsc2UgaWYgKChkZWNfY29udHJvbCAmIERFQ19DT05UUk9MX0ZMQUdfRk9SQ0VfMjUwMF81NzZQX0lOVEVSTEFDRSkKKwkJCSAmJiAoaHctPmZyYW1lX3dpZHRoID09IDcyMCkKKwkJCSAmJiAoaHctPmZyYW1lX2hlaWdodCA9PSA1NzYpCisJCQkgJiYgKGh3LT5mcmFtZV9kdXIgPT0gMzg0MCkpIHsKKwkJYkZvcmNlSW50ZXJsYWNlID0gMTsKKwl9CisJaWYgKGh3LT5pc191c2VkX3Y0bCAmJiAoYkZvcmNlSW50ZXJsYWNlID09IDApICYmIGZyYW1lLT5mcmFtZSkgeworCQliRm9yY2VJbnRlcmxhY2UgPSAoZnJhbWUtPmZyYW1lLT5tYl9hZmZfZnJhbWVfZmxhZyk/MTowOworCX0KKwlyZXR1cm4gYkZvcmNlSW50ZXJsYWNlOworfQorCitzdGF0aWMgdm9pZCBmaWxsX2ZyYW1lX2luZm8oc3RydWN0IHZkZWNfaDI2NF9od19zICpodywgc3RydWN0IEZyYW1lU3RvcmUgKmZyYW1lKQoreworCXN0cnVjdCB2ZnJhbWVfcW9zX3MgKnZmcmFtZV9xb3MgPSAmaHctPnZmcmFtZV9xb3M7CisKKwlpZiAoZnJhbWUtPnNsaWNlX3R5cGUgPT0gSV9TTElDRSkKKwkJdmZyYW1lX3Fvcy0+dHlwZSA9IDE7CisJZWxzZSBpZiAoZnJhbWUtPnNsaWNlX3R5cGUgPT0gUF9TTElDRSkKKwkJdmZyYW1lX3Fvcy0+dHlwZSA9IDI7CisJZWxzZSBpZiAoZnJhbWUtPnNsaWNlX3R5cGUgPT0gQl9TTElDRSkKKwkJdmZyYW1lX3Fvcy0+dHlwZSA9IDM7CisKKwlpZiAoaW5wdXRfZnJhbWVfYmFzZWQoaHdfdG9fdmRlYyhodykpKQorCQl2ZnJhbWVfcW9zLT5zaXplID0gZnJhbWUtPmZyYW1lX3NpemUyOworCWVsc2UKKwkJdmZyYW1lX3Fvcy0+c2l6ZSA9IGZyYW1lLT5mcmFtZV9zaXplOworCXZmcmFtZV9xb3MtPnB0cyA9IGZyYW1lLT5wdHM2NDsKKworCXZmcmFtZV9xb3MtPm1heF9tdiA9IGZyYW1lLT5tYXhfbXY7CisJdmZyYW1lX3Fvcy0+YXZnX212ID0gZnJhbWUtPmF2Z19tdjsKKwl2ZnJhbWVfcW9zLT5taW5fbXYgPSBmcmFtZS0+bWluX212OworLyoKKwlwcl9pbmZvKCJtdjogbWF4OiVkLCAgYXZnOiVkLCBtaW46JWRcbiIsCisJCXZmcmFtZV9xb3MtPm1heF9tdiwKKwkJdmZyYW1lX3Fvcy0+YXZnX212LAorCQl2ZnJhbWVfcW9zLT5taW5fbXYpOworKi8KKworCXZmcmFtZV9xb3MtPm1heF9xcCA9IGZyYW1lLT5tYXhfcXA7CisJdmZyYW1lX3Fvcy0+YXZnX3FwID0gZnJhbWUtPmF2Z19xcDsKKwl2ZnJhbWVfcW9zLT5taW5fcXAgPSBmcmFtZS0+bWluX3FwOworLyoKKwlwcl9pbmZvKCJxcDogbWF4OiVkLCAgYXZnOiVkLCBtaW46JWRcbiIsCisJCXZmcmFtZV9xb3MtPm1heF9xcCwKKwkJdmZyYW1lX3Fvcy0+YXZnX3FwLAorCQl2ZnJhbWVfcW9zLT5taW5fcXApOworKi8KKworCXZmcmFtZV9xb3MtPm1heF9za2lwID0gZnJhbWUtPm1heF9za2lwOworCXZmcmFtZV9xb3MtPmF2Z19za2lwID0gZnJhbWUtPmF2Z19za2lwOworCXZmcmFtZV9xb3MtPm1pbl9za2lwID0gZnJhbWUtPm1pbl9za2lwOworLyoKKwlwcl9pbmZvKCJza2lwOiBtYXg6JWQsICBhdmc6JWQsIG1pbjolZFxuIiwKKwkJdmZyYW1lX3Fvcy0+bWF4X3NraXAsCisJCXZmcmFtZV9xb3MtPmF2Z19za2lwLAorCQl2ZnJhbWVfcW9zLT5taW5fc2tpcCk7CisqLworCXZmcmFtZV9xb3MtPm51bSsrOworfQorCitzdGF0aWMgaW50IGlzX2lmcmFtZShzdHJ1Y3QgRnJhbWVTdG9yZSAqZnJhbWUpIHsKKworCWlmIChmcmFtZS0+ZnJhbWUgJiYgZnJhbWUtPmZyYW1lLT5zbGljZV90eXBlID09IElfU0xJQ0UpIHsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBvc3RfcHJlcGFyZV9wcm9jZXNzKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHN0cnVjdCBGcmFtZVN0b3JlICpmcmFtZSkKK3sKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJaW50IGJ1ZmZlcl9pbmRleCA9IGZyYW1lLT5idWZfc3BlY19udW07CisKKwlpZiAoYnVmZmVyX2luZGV4IDwgMCB8fCBidWZmZXJfaW5kZXggPj0gQlVGU1BFQ19QT09MX1NJWkUpIHsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkiJXMsIGJ1ZmZlcl9pbmRleCAweCV4IGlzIGJleW9uZCByYW5nZVxuIiwKKwkJCV9fZnVuY19fLCBidWZmZXJfaW5kZXgpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGZvcmNlX2Rpc3BfYnVmc3BlY19udW0gJiAweDEwMCkgeworCQkvKnJlY3ljbGUgZGlyZWN0bHkqLworCQlpZiAoaHctPmJ1ZmZlcl9zcGVjW2ZyYW1lLT5idWZfc3BlY19udW1dLnVzZWQgIT0gMyAmJgorCQkJaHctPmJ1ZmZlcl9zcGVjW2ZyYW1lLT5idWZfc3BlY19udW1dLnVzZWQgIT0gNSkKKwkJCXNldF9mcmFtZV9vdXRwdXRfZmxhZygmaHctPmRwYiwgZnJhbWUtPmluZGV4KTsKKworCQkvKm1ha2UgcHJlX291dHB1dCBub3Qgc2V0Ki8KKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoaHctPmVycm9yX3Byb2NfcG9saWN5ICYgMHgxMDAwKSB7CisJCWludCBlcnJvcl9za2lwX2lfY291bnQgPSAoZXJyb3Jfc2tpcF9jb3VudCA+PiAxMikgJiAweGY7CisJCWludCBlcnJvcl9za2lwX2ZyYW1lX2NvdW50ID0gZXJyb3Jfc2tpcF9jb3VudCAmIDB4ZmZmOworCQlpZiAoKChody0+bm9fZXJyb3JfY291bnQgPCBlcnJvcl9za2lwX2ZyYW1lX2NvdW50KQorCQkJJiYgKGVycm9yX3NraXBfaV9jb3VudCA9PSAwIHx8CisJCQlody0+bm9fZXJyb3JfaV9jb3VudCA8IGVycm9yX3NraXBfaV9jb3VudCkpCisJCQkmJiAoIShmcmFtZS0+ZGF0YV9mbGFnICYgSV9GTEFHKSkpCisJCQlmcmFtZS0+ZGF0YV9mbGFnIHw9IEVSUk9SX0ZMQUc7CisJfQorCisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRVJST1JGTEFHX0RCRywKKwkJIiVzLCBidWZmZXJfaW5kZXggMHgleCAgZnJhbWVfZXJyb3IgJXggIHBvYyAlZCBodyBlcnJvciAleCBodyBlcnJvcl9wcm9jX3BvbGljeSAleFxuIiwKKwkJX19mdW5jX18sIGJ1ZmZlcl9pbmRleCwKKwkJZnJhbWUtPmRhdGFfZmxhZyAmIEVSUk9SX0ZMQUcsCisJCWZyYW1lLT5wb2MsIGh3LT5kYXRhX2ZsYWcgJiBFUlJPUl9GTEFHLAorCQlody0+ZXJyb3JfcHJvY19wb2xpY3kpOworCisJaWYgKGZyYW1lLT5mcmFtZSA9PSBOVUxMICYmCisJCQkoKGZyYW1lLT5pc191c2VkID09IDEgJiYgZnJhbWUtPnRvcF9maWVsZCkKKwkJCXx8IChmcmFtZS0+aXNfdXNlZCA9PSAyICYmIGZyYW1lLT5ib3R0b21fZmllbGQpKSkgeworCQkJaWYgKGh3LT5pX29ubHkpIHsKKwkJCQlpZiAoZnJhbWUtPmlzX3VzZWQgPT0gMSkKKwkJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkJCQkiJXMgICBObyBib3R0b21fZmllbGQgISEgIGZyYW1lX251bSAlZCAgdXNlZCAlZFxuIiwKKwkJCQkJCV9fZnVuY19fLCBmcmFtZS0+ZnJhbWVfbnVtLCBmcmFtZS0+aXNfdXNlZCk7CisJCQkJaWYgKGZyYW1lLT5pc191c2VkID09IDIpCisJCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJCQkJIiVzICAgTm8gdG9wX2ZpZWxkICEhICBmcmFtZV9udW0gJWQgIHVzZWQgJWRcbiIsCisJCQkJCQlfX2Z1bmNfXywgZnJhbWUtPmZyYW1lX251bSwgZnJhbWUtPmlzX3VzZWQpOworCQkJfQorCQkJZWxzZSB7CisJCQkJZnJhbWUtPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOworCQkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19FUlJPUkZMQUdfREJHLAorCQkJCQkiJXMgRXJyb3IgIGZyYW1lX251bSAlZCAgdXNlZCAlZFxuIiwKKwkJCQkJX19mdW5jX18sIGZyYW1lLT5mcmFtZV9udW0sIGZyYW1lLT5pc191c2VkKTsKKwkJCX0KKwl9CisJaWYgKHZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpICYmICEoZnJhbWUtPmRhdGFfZmxhZyAmIE5PRElTUF9GTEFHKSkgeworCQlpZiAoKHZkZWMtPnZidWYubm9fcGFyc2VyID09IDApIHx8ICh2ZGVjLT52YnVmLnVzZV9wdHNzZXJ2KSkgeworCQkJaWYgKChwdHNfbG9va3VwX29mZnNldF91czY0KFBUU19UWVBFX1ZJREVPLAorCQkJCWZyYW1lLT5vZmZzZXRfZGVsaW1pdGVyLCAmZnJhbWUtPnB0cywgJmZyYW1lLT5mcmFtZV9zaXplLAorCQkJCTAsICZmcmFtZS0+cHRzNjQpID09IDApKSB7CisJCQkJaWYgKChsb29rdXBfY2hlY2tfY29udXQgJiYgKGF0b21pY19yZWFkKCZody0+dmZfcHJlX2NvdW50KSA+IGxvb2t1cF9jaGVja19jb251dCkgJiYKKwkJCQkJKGh3LT53cm9uZ19mcmFtZV9jb3VudCA+IGh3LT5yaWdodF9mcmFtZV9jb3VudCkpICYmCisJCQkJCSgoZnJhbWUtPmRlY29kZWRfZnJhbWVfc2l6ZSAqIDIgPCBmcmFtZS0+ZnJhbWVfc2l6ZSkpKSB7CisJCQkJCS8qcmVzb2x2ZSBtYW55IGZyYW1lIG9ubHkgb25lIGNoZWNrIGluIHB0cywgY2F1c2UgcGxheWJhY2sgdW5zbW9vdGggaXNzdWUqLworCQkJCQlmcmFtZS0+cHRzNjQgPSBody0+bGFzdF9wdHM2NCArRFVSMlBUUyhody0+ZnJhbWVfZHVyKSA7CisJCQkJCWZyYW1lLT5wdHMgPSBody0+bGFzdF9wdHMgKyBEVVIyUFRTKGh3LT5mcmFtZV9kdXIpOworCQkJCX0KKwkJCQlody0+cmlnaHRfZnJhbWVfY291bnQrKzsKKwkJCX0gZWxzZSB7CisJCQkJZnJhbWUtPnB0czY0ID0gaHctPmxhc3RfcHRzNjQgK0RVUjJQVFMoaHctPmZyYW1lX2R1cikgOworCQkJCWZyYW1lLT5wdHMgPSBody0+bGFzdF9wdHMgKyBEVVIyUFRTKGh3LT5mcmFtZV9kdXIpOworCQkJCWh3LT53cm9uZ19mcmFtZV9jb3VudCsrOworCQkJfQorCQl9CisKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCSIlcyBlcnJvcj0gMHgleCBwb2MgPSAlZCAgb2Zmc2V0PSAweCV4IHB0cz0gMHgleCBsYXN0X3B0cyA9MHgleCAgcHRzNjQgPSAlbGxkICBsYXN0X3B0czY0PSAlbGxkICBkdXJhdGlvbiA9ICVkXG4iLAorCQlfX2Z1bmNfXywgKGZyYW1lLT5kYXRhX2ZsYWcgJiBFUlJPUl9GTEFHKSwgZnJhbWUtPnBvYywKKwkJZnJhbWUtPm9mZnNldF9kZWxpbWl0ZXIsIGZyYW1lLT5wdHMsaHctPmxhc3RfcHRzLAorCQlmcmFtZS0+cHRzNjQsIGh3LT5sYXN0X3B0czY0LCBody0+ZnJhbWVfZHVyKTsKKwkJaHctPmxhc3RfcHRzNjQgPSBmcmFtZS0+cHRzNjQ7CisJCWh3LT5sYXN0X3B0cyA9IGZyYW1lLT5wdHM7CisJfQorCisJLyogU1dQTC0xODk3MyA5NjAwMC8xNT02NDAwLCBsZXNzIHRoYW4gMTVmcHMgY2hlY2sgKi8KKwlpZiAoKCFody0+ZHVyYXRpb25fZnJvbV9wdHNfZG9uZSkgJiYgKGh3LT5mcmFtZV9kdXIgPiA2NDAwVUxMKSkgeworCQlpZiAoKGNoZWNrX2ZvcmNlX2ludGVybGFjZShodywgZnJhbWUpKSAmJgorCQkJKGZyYW1lLT5zbGljZV90eXBlID09IElfU0xJQ0UpICYmCisJCQkoaHctPnB0c19vdXRzaWRlKSkgeworCQkJaWYgKCghaHctPmgyNjRfcHRzX2NvdW50KSB8fCAoIWh3LT5oMjY0cHRzMSkpIHsKKwkJCQlody0+aDI2NHB0czEgPSBmcmFtZS0+cHRzOworCQkJCWh3LT5oMjY0X3B0c19jb3VudCA9IDA7CisJCQl9IGVsc2UgaWYgKGZyYW1lLT5wdHMgPiBody0+aDI2NHB0czEpIHsKKwkJCQl1MzIgY2FsY19kdXIgPQorCQkJCQlQVFMyRFVSKGZyYW1lLT5wdHMgLSBody0+aDI2NHB0czEpOworCQkJCWNhbGNfZHVyID0gKChjYWxjX2R1ci9ody0+aDI2NF9wdHNfY291bnQpIDw8IDEpOworCQkJCWlmIChody0+ZnJhbWVfZHVyIDwgKGNhbGNfZHVyICsgMjAwKSAmJgorCQkJCQlody0+ZnJhbWVfZHVyID4gKGNhbGNfZHVyIC0gMjAwKSkgeworCQkJCQlody0+ZnJhbWVfZHVyID4+PSAxOworCQkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT5ub3RpZnlfd29yayk7CisJCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJCQkJImNvcnJlY3QgZnJhbWVfZHVyICVkLCBjYWxjX2R1ciAlZCwgY291bnQgJWRcbiIsCisJCQkJCQlody0+ZnJhbWVfZHVyLCAoY2FsY19kdXIgPj4gMSksIGh3LT5oMjY0X3B0c19jb3VudCk7CisJCQkJCWh3LT5kdXJhdGlvbl9mcm9tX3B0c19kb25lID0gMTsKKwkJCQkJaHctPmgyNjRfcHRzX2NvdW50ID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKwkJaHctPmgyNjRfcHRzX2NvdW50Kys7CisJfQorCisJaWYgKGZyYW1lLT5kYXRhX2ZsYWcgJiBFUlJPUl9GTEFHKSB7CisJCXZkZWNfY291bnRfaW5mbygmaHctPmd2cywgMSwgMCk7CisJCWlmIChmcmFtZS0+c2xpY2VfdHlwZSA9PSBJX1NMSUNFKSB7CisJCQlody0+Z3ZzLmlfY29uY2VhbGVkX2ZyYW1lcysrOworCQl9IGVsc2UgaWYgKGZyYW1lLT5zbGljZV90eXBlID09IFBfU0xJQ0UpIHsKKwkJCWh3LT5ndnMucF9jb25jZWFsZWRfZnJhbWVzKys7CisJCX0gZWxzZSBpZiAoZnJhbWUtPnNsaWNlX3R5cGUgPT0gQl9TTElDRSkgeworCQkJaHctPmd2cy5iX2NvbmNlYWxlZF9mcmFtZXMrKzsKKwkJfQorCQlpZiAoIWh3LT5zZW5kX2Vycm9yX2ZyYW1lX2ZsYWcpIHsKKwkJCWh3LT5ndnMuZHJvcF9mcmFtZV9jb3VudCsrOworCQkJaWYgKGZyYW1lLT5zbGljZV90eXBlID09IElfU0xJQ0UpIHsKKwkJCQlody0+Z3ZzLmlfbG9zdF9mcmFtZXMrKzsKKwkJCX0gZWxzZSBpZiAoZnJhbWUtPnNsaWNlX3R5cGUgPT0gUF9TTElDRSkgeworCQkJCWh3LT5ndnMucF9sb3N0X2ZyYW1lcysrOworCQkJfSBlbHNlIGlmIChmcmFtZS0+c2xpY2VfdHlwZSA9PSBCX1NMSUNFKSB7CisJCQkJaHctPmd2cy5iX2xvc3RfZnJhbWVzKys7CisJCQl9CisJCX0KKworCX0KKworCWlmICgoIWh3LT5lbmFibGVfZmVuY2UpICYmCisJCSgoZnJhbWUtPmRhdGFfZmxhZyAmIE5PRElTUF9GTEFHKSB8fAorCQkoZnJhbWUtPmRhdGFfZmxhZyAmIE5VTExfRkxBRykgfHwKKwkJKCghaHctPnNlbmRfZXJyb3JfZnJhbWVfZmxhZykgJiYKKwkJKGZyYW1lLT5kYXRhX2ZsYWcgJiBFUlJPUl9GTEFHKSkgfHwKKwkJKChody0+aV9vbmx5ICYgMHgxKSAmJgorCQkoIShmcmFtZS0+ZGF0YV9mbGFnICYgSV9GTEFHKSkpKSkgeworCQlmcmFtZS0+c2hvd19mcmFtZSA9IGZhbHNlOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZHBiX2lzX2RlYnVnKERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCkpIHsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkiJXMsIGZzWyVkXSBwb2MgJWQsIGJ1Zl9zcGVjX251bSAlZFxuIiwKKwkJCV9fZnVuY19fLCBmcmFtZS0+aW5kZXgsIGZyYW1lLT5wb2MsCisJCQlmcmFtZS0+YnVmX3NwZWNfbnVtKTsKKwkJcHJpbnRfcGljX2luZm8oREVDT0RFX0lEKGh3KSwgInByZWRpc19mcm0iLAorCQkJZnJhbWUtPmZyYW1lLCAtMSk7CisJCXByaW50X3BpY19pbmZvKERFQ09ERV9JRChodyksICJwcmVkaXNfdG9wIiwKKwkJCWZyYW1lLT50b3BfZmllbGQsIC0xKTsKKwkJcHJpbnRfcGljX2luZm8oREVDT0RFX0lEKGh3KSwgInByZWRpc19ib3QiLAorCQkJZnJhbWUtPmJvdHRvbV9maWVsZCwgLTEpOworCX0KKworCWZyYW1lLT5zaG93X2ZyYW1lID0gdHJ1ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBvc3RfdmlkZW9fZnJhbWUoc3RydWN0IHZkZWNfcyAqdmRlYywgc3RydWN0IEZyYW1lU3RvcmUgKmZyYW1lKQoreworCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcgPSAoc3RydWN0IHZkZWNfaDI2NF9od19zICopdmRlYy0+cHJpdmF0ZTsKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmID0gTlVMTDsKKwlpbnQgYnVmZmVyX2luZGV4ID0gZnJhbWUtPmJ1Zl9zcGVjX251bTsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKiB2NGwyX2N0eCA9IGh3LT52NGwyX2N0eDsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPSBOVUxMOworCXVsb25nIG52X29yZGVyID0gVklEVFlQRV9WSVVfTlYyMTsKKwlpbnQgYkZvcmNlSW50ZXJsYWNlID0gMDsKKwlpbnQgdmZfY291bnQgPSAxOworCWludCBpOworCisJLyogc3dhcCB1diAqLworCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJaWYgKCh2NGwyX2N0eC0+Y2FwX3BpeF9mbXQgPT0gVjRMMl9QSVhfRk1UX05WMTIpIHx8CisJCQkodjRsMl9jdHgtPmNhcF9waXhfZm10ID09IFY0TDJfUElYX0ZNVF9OVjEyTSkpCisJCQludl9vcmRlciA9IFZJRFRZUEVfVklVX05WMTI7CisJfQorCisJaWYgKCFpc19pbnRlcmxhY2UoZnJhbWUpKQorCQl2Zl9jb3VudCA9IDE7CisJZWxzZQorCQl2Zl9jb3VudCA9IDI7CisKKwliRm9yY2VJbnRlcmxhY2UgPSBjaGVja19mb3JjZV9pbnRlcmxhY2UoaHcsIGZyYW1lKTsKKwlpZiAoYkZvcmNlSW50ZXJsYWNlKQorCQl2Zl9jb3VudCA9IDI7CisKKwlpZiAoIWh3LT5lbmFibGVfZmVuY2UpCisJCWh3LT5idWZmZXJfc3BlY1tidWZmZXJfaW5kZXhdLnZmX3JlZiA9IDA7CisJZmlsbF9mcmFtZV9pbmZvKGh3LCBmcmFtZSk7CisKKwlpZiAoKGh3LT5pc191c2VkX3Y0bCkgJiYKKwkJKCh2ZGVjLT5wcm9nX29ubHkpIHx8ICghdjRsMl9jdHgtPnZwcF9pc19uZWVkKSkpCisJCXZmX2NvdW50ID0gMTsKKworCWZvciAoaSA9IDA7IGkgPCB2Zl9jb3VudDsgaSsrKSB7CisJCWlmIChrZmlmb19nZXQoJmh3LT5uZXdmcmFtZV9xLCAmdmYpID09IDAgfHwKKwkJCXZmID09IE5VTEwpIHsKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0VSUk9SLAorCQkJCSIlcyBmYXRhbCBlcnJvciwgbm8gYXZhaWxhYmxlIGJ1ZmZlciBzbG90LlxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJdmYtPmR1cmF0aW9uX3B1bGxkb3duID0gMDsKKwkJaWYgKCEoaXNfaWZyYW1lKGZyYW1lKSkgJiYgaHctPnVuc3RhYmxlX3B0cykgeworCQkJdmYtPnB0cyA9IDA7CisJCQl2Zi0+cHRzX3VzNjQgPSAwOworCQkJdmYtPnRpbWVzdGFtcCA9IDA7CisJCQl2Zi0+aW5kZXggPSBWRl9JTkRFWChmcmFtZS0+aW5kZXgsIGJ1ZmZlcl9pbmRleCk7CisJCX0gZWxzZSB7CisJCQlpZiAoKGkgPT0gMCkgJiYgKHZmX2NvdW50ID09IDIpKQorCQkJCXZmLT50aW1lc3RhbXAgPSBmcmFtZS0+bGFzdF9maWVsZF90aW1lc3RhbXA7CisJCQllbHNlCisJCQkJdmYtPnRpbWVzdGFtcCA9IGZyYW1lLT50aW1lc3RhbXA7CisJCQl2Zi0+cHRzID0gZnJhbWUtPnB0czsKKwkJCXZmLT5wdHNfdXM2NCA9IGZyYW1lLT5wdHM2NDsKKwkJCWlmICgoaSA+IDApICYmIHY0bDJfY3R4LT5zZWNvbmRfZmllbGRfcHRzX21vZGUpIHsKKwkJCQl2Zi0+dGltZXN0YW1wID0gMDsKKwkJCX0KKwkJCXZmLT5pbmRleCA9IFZGX0lOREVYKGZyYW1lLT5pbmRleCwgYnVmZmVyX2luZGV4KTsKKwkJfQorCisJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCXZmLT52NGxfbWVtX2hhbmRsZQorCQkJCT0gaHctPmJ1ZmZlcl9zcGVjW2J1ZmZlcl9pbmRleF0uY21hX2FsbG9jX2FkZHI7CisJCQlmYiA9IChzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqKXZmLT52NGxfbWVtX2hhbmRsZTsKKwkJfQorCisJCWlmIChody0+ZW5hYmxlX2ZlbmNlKSB7CisJCQkvKiBmaWxsIGZlbmNlIGluZm9ybWF0aW9uLiAqLworCQkJaWYgKGh3LT5mZW5jZV91c2FnZSA9PSBGRU5DRV9VU0VfRk9SX0RSSVZFUikKKwkJCQl2Zi0+ZmVuY2UJPSBmcmFtZS0+ZmVuY2U7CisJCX0KKworCQlpZiAoaHctPm1tdV9lbmFibGUpIHsKKwkJCWlmIChody0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDEwKSB7CisJCQkJLyogZG91YmxlIHdyaXRlIG9ubHkgKi8KKwkJCQl2Zi0+Y29tcEJvZHlBZGRyID0gMDsKKwkJCQl2Zi0+Y29tcEhlYWRBZGRyID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJLypoZWFkIGFkciovCisJCQkJdmYtPmNvbXBIZWFkQWRkciA9CisJCQkJaHctPmJ1ZmZlcl9zcGVjW2J1ZmZlcl9pbmRleF0uYWxsb2NfaGVhZGVyX2FkZHI7CisJCQkJLypib2R5IGFkciovCisJCQkJdmYtPmNvbXBCb2R5QWRkciA9IDA7CisJCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0gMDsKKwkJCX0KKworCQkJdmYtPnR5cGUgPSBWSURUWVBFX1NDQVRURVI7CisKKwkJCWlmIChody0+ZG91YmxlX3dyaXRlX21vZGUpIHsKKwkJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX1BST0dSRVNTSVZFCisJCQkJCXwgVklEVFlQRV9WSVVfRklFTEQ7CisJCQkJdmYtPnR5cGUgfD0gbnZfb3JkZXI7CisJCQkJaWYgKGh3LT5kb3VibGVfd3JpdGVfbW9kZSA9PSAzKQorCQkJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX0NPTVBSRVNTOworCisJCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0gLTE7CisJCQkJdmYtPnBsYW5lX251bSA9IDI7CisJCQkJdmYtPmNhbnZhczBfY29uZmlnWzBdID0KKwkJCQkJaHctPmJ1ZmZlcl9zcGVjW2J1ZmZlcl9pbmRleF0uCisJCQkJCQljYW52YXNfY29uZmlnWzBdOworCQkJCXZmLT5jYW52YXMwX2NvbmZpZ1sxXSA9CisJCQkJCWh3LT5idWZmZXJfc3BlY1tidWZmZXJfaW5kZXhdLgorCQkJCQkJY2FudmFzX2NvbmZpZ1sxXTsKKworCQkJCXZmLT5jYW52YXMxX2NvbmZpZ1swXSA9CisJCQkJCWh3LT5idWZmZXJfc3BlY1tidWZmZXJfaW5kZXhdLgorCQkJCQkJY2FudmFzX2NvbmZpZ1swXTsKKwkJCQl2Zi0+Y2FudmFzMV9jb25maWdbMV0gPQorCQkJCQlody0+YnVmZmVyX3NwZWNbYnVmZmVyX2luZGV4XS4KKwkJCQkJCWNhbnZhc19jb25maWdbMV07CisKKwkJCX0gZWxzZSB7CisJCQkJdmYtPnR5cGUgfD0KKwkJCQkJVklEVFlQRV9DT01QUkVTUyB8IFZJRFRZUEVfVklVX0ZJRUxEOworCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IDA7CisJCQl9CisKKwkJCXZmLT5iaXRkZXB0aCA9CisJCQkJQklUREVQVEhfWTggfCBCSVRERVBUSF9VOCB8IEJJVERFUFRIX1Y4OworCisJCQl2Zi0+Y29tcFdpZHRoID0gaHctPmZyYW1lX3dpZHRoOworCQkJdmYtPmNvbXBIZWlnaHQgPSBody0+ZnJhbWVfaGVpZ2h0OworCQl9IGVsc2UgeworCQkJdmYtPnR5cGUgPSBWSURUWVBFX1BST0dSRVNTSVZFIHwgVklEVFlQRV9WSVVfRklFTEQgfAorCQkJCW52X29yZGVyOworCisJCQl2Zi0+Y2FudmFzMEFkZHIgPSB2Zi0+Y2FudmFzMUFkZHIgPQorCQkJc3BlYzJjYW52YXMoJmh3LT5idWZmZXJfc3BlY1tidWZmZXJfaW5kZXhdKTsKKyNpZmRlZiBWREVDX0RXCisJCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3KSB7CisJCQkJaWYgKElTX1ZERUNfRFcoaHcpKQorCQkJCQl2Zi0+Y2FudmFzMEFkZHIgPSB2Zi0+Y2FudmFzMUFkZHIgPQorCQkJCQkJdmRlY19kd19zcGVjMmNhbnZhcygmaHctPmJ1ZmZlcl9zcGVjW2J1ZmZlcl9pbmRleF0pOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoSVNfVkRFQ19EVyhodykpCisJCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IC0xOworCQkJfQorI2VuZGlmCisKKwkJfQorCQlpZiAoZnJhbWUtPmRhdGFfZmxhZyAmIEVSUk9SX0ZMQUcpIHsKKwkJCXZmLT5mcmFtZV90eXBlIHw9IFY0TDJfQlVGX0ZMQUdfRVJST1I7CisJCX0KKworCQlzZXRfZnJhbWVfaW5mbyhodywgdmYsIGJ1ZmZlcl9pbmRleCk7CisJCWlmIChody0+ZGlzY2FyZF9kdl9kYXRhKSB7CisJCQl2Zi0+ZGlzY2FyZF9kdl9kYXRhID0gdHJ1ZTsKKwkJfQorCisJCWlmIChody0+bW11X2VuYWJsZSAmJiBody0+ZG91YmxlX3dyaXRlX21vZGUpIHsKKwkJCXZmLT53aWR0aCA9IGh3LT5mcmFtZV93aWR0aCAvCisJCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhody0+ZG91YmxlX3dyaXRlX21vZGUpOworCQkJdmYtPmhlaWdodCA9IGh3LT5mcmFtZV9oZWlnaHQgLworCQkJCWdldF9kb3VibGVfd3JpdGVfcmF0aW8oaHctPmRvdWJsZV93cml0ZV9tb2RlKTsKKwkJfQorCisJCWlmIChmcmFtZS0+c2xpY2VfdHlwZSA9PSBJX1NMSUNFKSB7CisJCQl2Zi0+ZnJhbWVfdHlwZSB8PSBWNEwyX0JVRl9GTEFHX0tFWUZSQU1FOworCQl9IGVsc2UgaWYgKGZyYW1lLT5zbGljZV90eXBlID09IFBfU0xJQ0UpIHsKKwkJCXZmLT5mcmFtZV90eXBlIHw9IFY0TDJfQlVGX0ZMQUdfUEZSQU1FOworCQl9IGVsc2UgaWYgKGZyYW1lLT5zbGljZV90eXBlID09IEJfU0xJQ0UpIHsKKwkJCXZmLT5mcmFtZV90eXBlIHw9IFY0TDJfQlVGX0ZMQUdfQkZSQU1FOworCQl9CisKKwkJdmYtPmZsYWcgPSAwOworCQlpZiAoZnJhbWUtPmRhdGFfZmxhZyAmIElfRkxBRykKKwkJCXZmLT5mbGFnIHw9IFZGUkFNRV9GTEFHX1NZTkNGUkFNRTsKKwkJaWYgKGZyYW1lLT5kYXRhX2ZsYWcgJiBFUlJPUl9GTEFHKQorCQkJdmYtPmZsYWcgfD0gVkZSQU1FX0ZMQUdfRVJST1JfUkVDT1ZFUlk7CisJCXVwZGF0ZV92Zl9tZW1oYW5kbGUoaHcsIHZmLCBidWZmZXJfaW5kZXgpOworCisJCWlmICghaHctPmVuYWJsZV9mZW5jZSkgeworCQkJaHctPmJ1ZmZlcl9zcGVjW2J1ZmZlcl9pbmRleF0udXNlZCA9IDI7CisJCQlody0+YnVmZmVyX3NwZWNbYnVmZmVyX2luZGV4XS52Zl9yZWYrKzsKKwkJfQorCisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkiJXMgJWQgZnJhbWUgPSAlcCB0b3BfZmllbGQgPSAlcCBib3R0b21fZmllbGQgPSAlcFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBmcmFtZS0+ZnJhbWUsCisJCQlmcmFtZS0+dG9wX2ZpZWxkLCBmcmFtZS0+Ym90dG9tX2ZpZWxkKTsKKworCQlpZiAoZnJhbWUtPmZyYW1lICE9IE5VTEwpIHsKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJIiVzICVkIGNvZGVkX2ZyYW1lID0gJWQgZnJhbWVfbWJzX29ubHlfZmxhZyA9ICVkIHN0cnVjdHVyZSA9ICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkJZnJhbWUtPmZyYW1lLT5jb2RlZF9mcmFtZSwgZnJhbWUtPmZyYW1lLT5mcmFtZV9tYnNfb25seV9mbGFnLCBmcmFtZS0+ZnJhbWUtPnN0cnVjdHVyZSk7CisJCX0KKworCQlpZiAoYkZvcmNlSW50ZXJsYWNlIHx8IGlzX2ludGVybGFjZShmcmFtZSkpIHsKKwkJCXZmLT50eXBlID0KKwkJCQlWSURUWVBFX0lOVEVSTEFDRV9GSVJTVCB8CisJCQkJbnZfb3JkZXI7CisKKwkJCWlmIChmcmFtZS0+ZnJhbWUgIT0gTlVMTCAmJgorCQkJCShmcmFtZS0+ZnJhbWUtPnBpY19zdHJ1Y3QgPT0gUElDX1RPUF9CT1QgfHwKKwkJCQlmcmFtZS0+ZnJhbWUtPnBpY19zdHJ1Y3QgPT0gUElDX0JPVF9UT1ApICYmCisJCQkJZnJhbWUtPmZyYW1lLT5jb2RlZF9mcmFtZSkgeworCQkJCWlmIChmcmFtZS0+ZnJhbWUgIT0gTlVMTCAmJiBmcmFtZS0+ZnJhbWUtPnBpY19zdHJ1Y3QgPT0gUElDX1RPUF9CT1QpIHsKKwkJCQl2Zi0+dHlwZSB8PSAoaSA9PSAwID8KKwkJCQkJVklEVFlQRV9JTlRFUkxBQ0VfVE9QIDoKKwkJCQkJVklEVFlQRV9JTlRFUkxBQ0VfQk9UVE9NKTsKKwkJCQl9IGVsc2UgaWYgKGZyYW1lLT5mcmFtZSAhPSBOVUxMICYmIGZyYW1lLT5mcmFtZS0+cGljX3N0cnVjdCA9PSBQSUNfQk9UX1RPUCkgeworCQkJCQl2Zi0+dHlwZSB8PSAoaSA9PSAwID8KKwkJCQkJVklEVFlQRV9JTlRFUkxBQ0VfQk9UVE9NIDoKKwkJCQkJVklEVFlQRV9JTlRFUkxBQ0VfVE9QKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGZyYW1lLT50b3BfZmllbGQgIT0gTlVMTCAmJiBmcmFtZS0+Ym90dG9tX2ZpZWxkICE9IE5VTEwpIHsvKnRvcCBmaXJzdCovCisJCQkJaWYgKGZyYW1lLT50b3BfZmllbGQtPnBvYyA8PSBmcmFtZS0+Ym90dG9tX2ZpZWxkLT5wb2MpCisJCQkJCXZmLT50eXBlIHw9IChpID09IDAgPworCQkJCQkJVklEVFlQRV9JTlRFUkxBQ0VfVE9QIDoKKwkJCQkJCVZJRFRZUEVfSU5URVJMQUNFX0JPVFRPTSk7CisJCQkJZWxzZQorCQkJCQl2Zi0+dHlwZSB8PSAoaSA9PSAwID8KKwkJCQkJCVZJRFRZUEVfSU5URVJMQUNFX0JPVFRPTSA6CisJCQkJCQlWSURUWVBFX0lOVEVSTEFDRV9UT1ApOworCQkJfSBlbHNlIHsKKwkJCQl2Zi0+dHlwZSB8PSAoaSA9PSAwID8KKwkJCQkJVklEVFlQRV9JTlRFUkxBQ0VfVE9QIDoKKwkJCQkJVklEVFlQRV9JTlRFUkxBQ0VfQk9UVE9NKTsKKwkJCX0KKwkJCXZmLT5kdXJhdGlvbiA9IHZmLT5kdXJhdGlvbi8yOworCQkJaWYgKGkgPT0gMSkgeworCQkJCXZmLT5wdHMgPSAwOworCQkJCXZmLT5wdHNfdXM2NCA9IDA7CisJCQl9CisKKwkJCWlmIChmcmFtZS0+ZnJhbWUpIHsKKwkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJCQkiJXMgJWQgdHlwZSA9IDB4JXggcGljX3N0cnVjdCA9ICVkIHB0cyA9IDB4JXggcHRzX3VzNjQgPSAweCVsbHggYkZvcmNlSW50ZXJsYWNlID0gJWRcbiIsCisJCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgdmYtPnR5cGUsIGZyYW1lLT5mcmFtZS0+cGljX3N0cnVjdCwKKwkJCQkJdmYtPnB0cywgdmYtPnB0c191czY0LCBiRm9yY2VJbnRlcmxhY2UpOworCQkJfQorCQl9CisKKwkJaWYgKGh3LT5pX29ubHkpIHsKKwkJCWlmICh2Zl9jb3VudCA9PSAxICYmIGZyYW1lLT5pc191c2VkID09IDEgJiYgZnJhbWUtPnRvcF9maWVsZAorCQkJCSYmIGZyYW1lLT5ib3R0b21fZmllbGQgPT0gTlVMTCAmJiBmcmFtZS0+ZnJhbWUgPT0gTlVMTCkgeworCQkJCXZmLT50eXBlID0KKwkJCQkJVklEVFlQRV9JTlRFUkxBQ0VfRklSU1QgfAorCQkJCQludl9vcmRlcjsKKwkJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX0lOVEVSTEFDRV9UT1A7CisJCQkJdmYtPmR1cmF0aW9uID0gdmYtPmR1cmF0aW9uLzI7CisJCQl9CisKKwkJCWlmICh2Zl9jb3VudCA9PSAxICYmIGZyYW1lLT5pc191c2VkID09IDIgJiYgZnJhbWUtPmJvdHRvbV9maWVsZAorCQkJCSYmIGZyYW1lLT50b3BfZmllbGQgPT0gTlVMTCAmJiBmcmFtZS0+ZnJhbWUgPT0gTlVMTCkgeworCQkJCXZmLT50eXBlID0KKwkJCQkJVklEVFlQRV9JTlRFUkxBQ0VfRklSU1QgfAorCQkJCQludl9vcmRlcjsKKwkJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX0lOVEVSTEFDRV9CT1RUT007CisJCQkJdmYtPmR1cmF0aW9uID0gdmYtPmR1cmF0aW9uLzI7CisJCQl9CisJCX0KKworCQkvKnZmLT5yYXRpb19jb250cm9sIHw9ICgweDNGRiA8PCBESVNQX1JBVElPX0FTUEVDVF9SQVRJT19CSVQpOyovCisJCXZmLT5zYXJfd2lkdGggPSBody0+d2lkdGhfYXNwZWN0X3JhdGlvOworCQl2Zi0+c2FyX2hlaWdodCA9IGh3LT5oZWlnaHRfYXNwZWN0X3JhdGlvOworCQlpZiAoIXZkZWMtPnZidWYudXNlX3B0c3NlcnYgJiYgdmRlY19zdHJlYW1fYmFzZWQodmRlYykpIHsKKwkJCS8qIG9mZnNldCBmb3IgdHNwbGF5ZXIgcHRzIGxvb2t1cCAqLworCQkJaWYgKGkgPT0gMCkgeworCQkJCXZmLT5wdHNfdXM2NCA9CisJCQkJCSgoKHU2NCl2Zi0+ZHVyYXRpb24gPDwgMzIpICYKKwkJCQkJMHhmZmZmZmZmZjAwMDAwMDAwKSB8IGZyYW1lLT5vZmZzZXRfZGVsaW1pdGVyOworCQkJCXZmLT5wdHMgPSAwOworCQkJfSBlbHNlIHsKKwkJCQl2Zi0+cHRzX3VzNjQgPSAodTY0KS0xOworCQkJCXZmLT5wdHMgPSAwOworCQkJfQorCQl9CisJCWF0b21pY19hZGQoMSwgJmh3LT52Zl9wcmVfY291bnQpOworCQl2ZGVjX3ZmcmFtZV9yZWFkeShod190b192ZGVjKGh3KSwgdmYpOworCQlpZiAoIWZyYW1lLT5zaG93X2ZyYW1lKSB7CisJCQl2aDI2NF92Zl9wdXQodmYsIHZkZWMpOworCQkJYXRvbWljX2FkZCgxLCAmaHctPnZmX2dldF9jb3VudCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChpID09IDApIHsKKwkJCXN0cnVjdCB2ZGVjX3MgKnB2ZGVjOworCQkJc3RydWN0IHZkZWNfaW5mbyB2czsKKworCQkJcHZkZWMgPSBod190b192ZGVjKGh3KTsKKwkJCW1lbXNldCgmdnMsIDAsIHNpemVvZihzdHJ1Y3QgdmRlY19pbmZvKSk7CisJCQlwdmRlYy0+ZGVjX3N0YXR1cyhwdmRlYywgJnZzKTsKKwkJCWRlY29kZXJfZG9fZnJhbWVfY2hlY2socHZkZWMsIHZmKTsKKwkJCXZkZWNfZmlsbF92ZGVjX2ZyYW1lKHB2ZGVjLCAmaHctPnZmcmFtZV9xb3MsICZ2cywgdmYsIGZyYW1lLT5od19kZWNvZGVfdGltZSk7CisKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkiWyVzOiVkXSBpX2RlY29kZWRfZnJhbWUgPSAlZCBwX2RlY29kZWRfZnJhbWUgPSAlZCBiX2RlY29kZWRfZnJhbWUgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyx2cy5pX2RlY29kZWRfZnJhbWVzLHZzLnBfZGVjb2RlZF9mcmFtZXMsdnMuYl9kZWNvZGVkX2ZyYW1lcyk7CisJCX0KKworCQlrZmlmb19wdXQoJmh3LT5kaXNwbGF5X3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5wdHNfbmFtZSwgdmYtPnRpbWVzdGFtcCk7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kaXNwX3FfbmFtZSwga2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKSk7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5uZXdfcV9uYW1lLCBrZmlmb19sZW4oJmh3LT5uZXdmcmFtZV9xKSk7CisJCXZkZWMtPnZkZWNfZnBzX2RldGVjKHZkZWMtPmlkKTsKKyNpZmRlZiBBVVhfREFUQV9DUkMKKwkJZGVjb2Rlcl9kb19hdXhfZGF0YV9jaGVjayh2ZGVjLCBody0+YnVmZmVyX3NwZWNbYnVmZmVyX2luZGV4XS5hdXhfZGF0YV9idWYsCisJCQlody0+YnVmZmVyX3NwZWNbYnVmZmVyX2luZGV4XS5hdXhfZGF0YV9zaXplKTsKKyNlbmRpZgorCisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1NFSV9ERVRBSUwsICJhdXhfZGF0YV9zaXplOiAlZCwgc2lnbmFsX3R5cGU6IDB4JXhcbiIsCisJCQlody0+YnVmZmVyX3NwZWNbYnVmZmVyX2luZGV4XS5hdXhfZGF0YV9zaXplLCBody0+dmlkZW9fc2lnbmFsX3R5cGUpOworCisJCWlmIChkcGJfaXNfZGVidWcoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19TRUlfREVUQUlMKSkgeworCQkJaW50IGkgPSAwOworCQkJUFJfSU5JVCgxMjgpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgaHctPmJ1ZmZlcl9zcGVjW2J1ZmZlcl9pbmRleF0uYXV4X2RhdGFfc2l6ZTsgaSsrKSB7CisJCQkJUFJfRklMTCgiJTAyeCAiLCBody0+YnVmZmVyX3NwZWNbYnVmZmVyX2luZGV4XS5hdXhfZGF0YV9idWZbaV0pOworCQkJCWlmICgoKGkgKyAxKSAmIDB4ZikgPT0gMCkKKwkJCQkJUFJfSU5GTyhody0+aWQpOworCQkJfQorCQkJUFJfSU5GTyhody0+aWQpOworCQl9CisKKwkJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQkJaWYgKChody0+YnVmZmVyX3NwZWNbYnVmZmVyX2luZGV4XS5hdXhfZGF0YV9zaXplID09IDApICYmCisJCQkJKGZyYW1lLT5zbGljZV90eXBlID09IElfU0xJQ0UpICYmCisJCQkJKGF0b21pY19yZWFkKCZody0+dmZfcHJlX2NvdW50KSA9PSAxKSkgeworCQkJCWh3LT5uZWVkX2ZyZWVfYXV4X2RhdGEgPSB0cnVlOworCQkJfQorCisJCQlpZiAoaHctPm5lZWRfZnJlZV9hdXhfZGF0YSkgeworCQkJCXY0bDJfY3R4LT5hdXhfaW5mb3MuZnJlZV9vbmVfc2VpX2J1ZmZlcih2NGwyX2N0eCwKKwkJCQkJJmh3LT5idWZmZXJfc3BlY1tidWZmZXJfaW5kZXhdLmF1eF9kYXRhX2J1ZiwKKwkJCQkJJmh3LT5idWZmZXJfc3BlY1tidWZmZXJfaW5kZXhdLmF1eF9kYXRhX3NpemUsCisJCQkJCWh3LT5idWZmZXJfc3BlY1tidWZmZXJfaW5kZXhdLmN0eF9idWZfaWR4KTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCFody0+ZGlzY2FyZF9kdl9kYXRhKQorCQkJCQl2NGwyX2N0eC0+YXV4X2luZm9zLmJpbmRfZHZfYnVmZmVyKHY0bDJfY3R4LAorCQkJCQkJJnZmLT5zcmNfZm10LmNvbXBfYnVmLAorCQkJCQkJJnZmLT5zcmNfZm10Lm1kX2J1Zik7CisJCQkJdXBkYXRlX3ZmcmFtZV9zcmNfZm10KHZmLAorCQkJCQlody0+YnVmZmVyX3NwZWNbYnVmZmVyX2luZGV4XS5hdXhfZGF0YV9idWYsCisJCQkJCWh3LT5idWZmZXJfc3BlY1tidWZmZXJfaW5kZXhdLmF1eF9kYXRhX3NpemUsCisJCQkJCWZhbHNlLCB2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLCBOVUxMKTsKKwkJCX0KKwkJfQorCisJCWlmICh3aXRob3V0X2Rpc3BsYXlfbW9kZSA9PSAwKSB7CisJCQlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCQkJaWYgKHY0bDJfY3R4LT5pc19zdHJlYW1fb2ZmKSB7CisJCQkJCXZoMjY0X3ZmX3B1dCh2aDI2NF92Zl9nZXQodmRlYyksIHZkZWMpOworCQkJCX0gZWxzZSB7CisJCQkJCXNldF9tZXRhX2RhdGFfdG9fdmYodmYsIFVWTV9NRVRBX0RBVEFfVkZfQkFTRV9JTkZPUywgaHctPnY0bDJfY3R4KTsKKwkJCQkJQVRSQUNFX0NPVU5URVIoIlZDX09VVF9ERUMtc3VibWl0IiwgZmItPmJ1Zl9pZHgpOworCQkJCQlmYi0+dGFzay0+c3VibWl0KGZiLT50YXNrLCBUQVNLX1RZUEVfREVDKTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIodmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1ZGUkFNRV9SRUFEWSwgTlVMTCk7CisJCX0gZWxzZQorCQkJdmgyNjRfdmZfcHV0KHZoMjY0X3ZmX2dldCh2ZGVjKSwgdmRlYyk7CisJfQorCWlmIChkcGJfaXNfZGVidWcoREVDT0RFX0lEKGh3KSwKKwkJUFJJTlRfRkxBR19EVU1QX0JVRlNQRUMpKQorCQlkdW1wX2J1ZnNwZWMoaHcsIF9fZnVuY19fKTsKKworCXJldHVybiAwOworfQorCitpbnQgcG9zdF9waWN0dXJlX2Vhcmx5KHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKmRwYl9zdHJ1ID0gJmh3LT5kcGI7CisJc3RydWN0IEZyYW1lU3RvcmUgZnM7CisJdTMyIG9mZnNldF9sbywgb2Zmc2V0X2hpOworCisJaWYgKCFody0+ZW5hYmxlX2ZlbmNlKQorCQlyZXR1cm4gMDsKKworCS8qIGNyZWF0ZSBmZW5jZSBmb3IgZWFjaCBidWZmZXJzLiAqLworCWlmICh2ZGVjX3RpbWVsaW5lX2NyZWF0ZV9mZW5jZSh2ZGVjLT5zeW5jKSkKKwkJcmV0dXJuIC0xOworCisJbWVtc2V0KCZmcywgMCwgc2l6ZW9mKGZzKSk7CisKKwlmcy5idWZfc3BlY19udW0JCT0gaW5kZXg7CisJZnMuZmVuY2UJCT0gdmRlYy0+c3luYy0+ZmVuY2U7CisJZnMuc2xpY2VfdHlwZQkJPSBkcGJfc3RydS0+bVNsaWNlLnNsaWNlX3R5cGU7CisJZnMuZHBiX2ZyYW1lX2NvdW50CT0gZHBiX3N0cnUtPmRwYl9mcmFtZV9jb3VudDsKKworCW9mZnNldF9sbyA9IGRwYl9zdHJ1LT5kcGJfcGFyYW0ubC5kYXRhW09GRlNFVF9ERUxJTUlURVJfTE9dOworCW9mZnNldF9oaSA9IGRwYl9zdHJ1LT5kcGJfcGFyYW0ubC5kYXRhW09GRlNFVF9ERUxJTUlURVJfSEldOworCWZzLm9mZnNldF9kZWxpbWl0ZXIJPSAob2Zmc2V0X2xvIHwgb2Zmc2V0X2hpIDw8IDE2KTsKKworCWlmIChody0+Y2h1bmspIHsKKwkJZnMucHRzCQk9IGh3LT5jaHVuay0+cHRzOworCQlmcy5wdHM2NAk9IGh3LT5jaHVuay0+cHRzNjQ7CisJCWZzLnRpbWVzdGFtcAk9IGh3LT5jaHVuay0+dGltZXN0YW1wOworCX0KKwlmcy5zaG93X2ZyYW1lID0gdHJ1ZTsKKwlwb3N0X3ZpZGVvX2ZyYW1lKHZkZWMsICZmcyk7CisKKwlkaXNwbGF5X2ZyYW1lX2NvdW50W0RFQ09ERV9JRChodyldKys7CisJcmV0dXJuIDA7Cit9CisKK2ludCBwcmVwYXJlX2Rpc3BsYXlfYnVmKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHN0cnVjdCBGcmFtZVN0b3JlICpmcmFtZSkKK3sKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0KKwkJKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisKKwlpZiAoaHctPmVuYWJsZV9mZW5jZSkgeworCQlpbnQgaSwgaiwgdXNlZF9zaXplLCByZXQ7CisJCWludCBzaWduZWRfY291bnQgPSAwOworCQlzdHJ1Y3QgdmZyYW1lX3MgKnNpZ25lZF9mZW5jZVtWRl9QT09MX1NJWkVdOworCisJCXBvc3RfcHJlcGFyZV9wcm9jZXNzKHZkZWMsIGZyYW1lKTsKKworCQlpZiAoIWZyYW1lLT5zaG93X2ZyYW1lKQorCQkJcHJfaW5mbygiZG8gbm90IGRpc3BsYXkuXG4iKTsKKworCQlody0+YnVmZmVyX3NwZWNbZnJhbWUtPmJ1Zl9zcGVjX251bV0udXNlZCA9IDI7CisJCWh3LT5idWZmZXJfc3BlY1tmcmFtZS0+YnVmX3NwZWNfbnVtXS52Zl9yZWYgPSAxOworCQlody0+YnVmZmVyX3NwZWNbZnJhbWUtPmJ1Zl9zcGVjX251bV0uZnNfaWR4ID0gZnJhbWUtPmluZGV4OworCisJCS8qIG5vdGlmeSBzaWduYWwgdG8gd2FrZSB1cCB3cSBvZiBmZW5jZS4gKi8KKwkJdmRlY190aW1lbGluZV9pbmNyZWFzZSh2ZGVjLT5zeW5jLCAxKTsKKworCQltdXRleF9sb2NrKCZody0+ZmVuY2VfbXV0ZXgpOworCQl1c2VkX3NpemUgPSBody0+ZmVuY2VfdmZfcy51c2VkX3NpemU7CisJCWlmICh1c2VkX3NpemUpIHsKKwkJCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgVkZfUE9PTF9TSVpFICYmIGogPCB1c2VkX3NpemU7IGkrKykgeworCQkJCWlmIChody0+ZmVuY2VfdmZfcy5mZW5jZV92ZltpXSAhPSBOVUxMKSB7CisJCQkJCXJldCA9IGRtYV9mZW5jZV9nZXRfc3RhdHVzKGh3LT5mZW5jZV92Zl9zLmZlbmNlX3ZmW2ldLT5mZW5jZSk7CisJCQkJCWlmIChyZXQgPT0gMSkgeworCQkJCQkJc2lnbmVkX2ZlbmNlW3NpZ25lZF9jb3VudF0gPSBody0+ZmVuY2VfdmZfcy5mZW5jZV92ZltpXTsKKwkJCQkJCWh3LT5mZW5jZV92Zl9zLmZlbmNlX3ZmW2ldID0gTlVMTDsKKwkJCQkJCWh3LT5mZW5jZV92Zl9zLnVzZWRfc2l6ZS0tOworCQkJCQkJc2lnbmVkX2NvdW50Kys7CisJCQkJCX0KKwkJCQkJaisrOworCQkJCX0KKwkJCX0KKwkJfQorCQltdXRleF91bmxvY2soJmh3LT5mZW5jZV9tdXRleCk7CisJCWlmIChzaWduZWRfY291bnQgIT0gMCkgeworCQkJZm9yIChpID0gMDsgaSA8IHNpZ25lZF9jb3VudDsgaSsrKQorCQkJCXZoMjY0X3ZmX3B1dChzaWduZWRfZmVuY2VbaV0sIHZkZWMpOworCQl9CisKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHBvc3RfcHJlcGFyZV9wcm9jZXNzKHZkZWMsIGZyYW1lKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKHBvc3RfdmlkZW9fZnJhbWUodmRlYywgZnJhbWUpKQorCQlyZXR1cm4gLTE7CisKKwlkaXNwbGF5X2ZyYW1lX2NvdW50W0RFQ09ERV9JRChodyldKys7CisJcmV0dXJuIDA7Cit9CisKK2ludCBub3RpZnlfdjRsX2VvcyhzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcgPSAoc3RydWN0IHZkZWNfaDI2NF9od19zICopdmRlYy0+cHJpdmF0ZTsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IChzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KTsKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmID0gJmh3LT52ZnJhbWVfZHVtbXk7CisJc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKmZiID0gTlVMTDsKKwlpbnQgaW5kZXggPSBJTlZBTElEX0lEWDsKKwl1bG9uZyBleHBpcmVzOworCisJaWYgKGh3LT5lb3MpIHsKKwkJZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDIwMDApOworCQl3aGlsZSAoIWhhdmVfZnJlZV9idWZfc3BlYyh2ZGVjKSkgeworCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZXhwaXJlcykpIHsKKwkJCQlwcl9lcnIoIlslZF0gSDI2NCBpc24ndCBlbm91Z2ggYnVmZiBmb3Igbm90aWZ5IGVvcy5cbiIsIGN0eC0+aWQpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisKKwkJaW5kZXggPSB2NGxfZ2V0X2ZyZWVfYnVmX2lkeCh2ZGVjKTsKKwkJaWYgKElOVkFMSURfSURYID09IGluZGV4KSB7CisJCQlwcl9lcnIoIlslZF0gSDI2NCBFT1MgZ2V0IGZyZWUgYnVmZiBmYWlsLlxuIiwgY3R4LT5pZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWZiID0gKHN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICopCisJCQlody0+YnVmZmVyX3NwZWNbaW5kZXhdLmNtYV9hbGxvY19hZGRyOworCisJCXZmLT50eXBlCQl8PSBWSURUWVBFX1Y0TF9FT1M7CisJCXZmLT50aW1lc3RhbXAJCT0gVUxPTkdfTUFYOworCQl2Zi0+ZmxhZwkJPSBWRlJBTUVfRkxBR19FTVBUWV9GUkFNRV9WNEw7CisJCXZmLT52NGxfbWVtX2hhbmRsZQk9ICh1bG9uZylmYjsKKworCQl2ZGVjX3ZmcmFtZV9yZWFkeSh2ZGVjLCB2Zik7CisJCWtmaWZvX3B1dCgmaHctPmRpc3BsYXlfcSwgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKworCQlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UucHRzX25hbWUsIHZmLT50aW1lc3RhbXApOworCisJCUFUUkFDRV9DT1VOVEVSKCJWQ19PVVRfREVDLXN1Ym1pdCIsIGZiLT5idWZfaWR4KTsKKwkJZmItPnRhc2stPnN1Ym1pdChmYi0+dGFzaywgVEFTS19UWVBFX0RFQyk7CisKKwkJcHJfaW5mbygiWyVkXSBIMjY0IEVPUyBub3RpZnkuXG4iLCBjdHgtPmlkKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKgorICogSGFyZHdhcmUgY29uZmlnCisgKi8KK2NoYXIgKnNsaWNlX3R5cGVfbmFtZVtdID0geworCSJQX1NMSUNFICIsCisJIkJfU0xJQ0UgIiwKKwkiSV9TTElDRSAiLAorCSJTUF9TTElDRSIsCisJIlNJX1NMSUNFIiwKK307CisKK2NoYXIgKnBpY3R1cmVfc3RydWN0dXJlX25hbWVbXSA9IHsKKwkiRlJBTUUiLAorCSJUT1BfRklFTEQiLAorCSJCT1RUT01fRklFTEQiCit9OworCit2b2lkIHByaW50X3BpY19pbmZvKGludCBkZWNpbmRleCwgY29uc3QgY2hhciAqaW5mbywKKwkJCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnBpYywKKwkJCWludCBzbGljZV90eXBlKQoreworCWlmIChwaWMpCisJCWRwYl9wcmludChkZWNpbmRleCwgUFJJTlRfRkxBR19ERUNfREVUQUlMLAorCQkiJXM6ICVzIChvcmlnaW5hbCAlcyksICVzLCBtYl9hZmZfZnJhbWVfZmxhZyAlZCAgcG9jICVkLCBwaWNfbnVtICVkLCBidWZfc3BlY19udW0gJWQgZGF0YV9mbGFnIDB4JXhcbiIsCisJCWluZm8sCisJCXBpY3R1cmVfc3RydWN0dXJlX25hbWVbcGljLT5zdHJ1Y3R1cmVdLAorCQlwaWMtPmNvZGVkX2ZyYW1lID8gIkZyYW1lIiA6ICJGaWVsZCIsCisJCShzbGljZV90eXBlIDwgMCB8fAorCQlzbGljZV90eXBlID49IChzaXplb2Yoc2xpY2VfdHlwZV9uYW1lKSAvIHNpemVvZihzbGljZV90eXBlX25hbWVbMF0pKSkgPyAiIiA6IHNsaWNlX3R5cGVfbmFtZVtzbGljZV90eXBlXSwKKwkJcGljLT5tYl9hZmZfZnJhbWVfZmxhZywKKwkJcGljLT5wb2MsCisJCXBpYy0+cGljX251bSwKKwkJcGljLT5idWZfc3BlY19udW0sCisJCXBpYy0+ZGF0YV9mbGFnKTsKK30KKworc3RhdGljIHZvaWQgcmVzZXRfcHJvY2Vzc190aW1lKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcpCit7CisJaWYgKGh3LT5zdGFydF9wcm9jZXNzX3RpbWUpIHsKKwkJdW5zaWduZWQgcHJvY2Vzc190aW1lID0KKwkJCTEwMDAgKiAoamlmZmllcyAtIGh3LT5zdGFydF9wcm9jZXNzX3RpbWUpIC8gSFo7CisJCWh3LT5zdGFydF9wcm9jZXNzX3RpbWUgPSAwOworCQlpZiAocHJvY2Vzc190aW1lID4gbWF4X3Byb2Nlc3NfdGltZVtERUNPREVfSUQoaHcpXSkKKwkJCW1heF9wcm9jZXNzX3RpbWVbREVDT0RFX0lEKGh3KV0gPSBwcm9jZXNzX3RpbWU7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdGFydF9wcm9jZXNzX3RpbWUoc3RydWN0IHZkZWNfaDI2NF9od19zICpodykKK3sKKwlody0+ZGVjb2RlX3RpbWVvdXRfY291bnQgPSAxMDsKKwlody0+c3RhcnRfcHJvY2Vzc190aW1lID0gamlmZmllczsKK30KKworc3RhdGljIHZvaWQgY29uZmlnX2F1eF9idWYoc3RydWN0IHZkZWNfaDI2NF9od19zICpodykKK3sKKwlXUklURV9WUkVHKEgyNjRfQVVYX0FEUiwgaHctPmF1eF9waHlfYWRkcik7CisJV1JJVEVfVlJFRyhIMjY0X0FVWF9EQVRBX1NJWkUsCisJCSgoaHctPnByZWZpeF9hdXhfc2l6ZSA+PiA0KSA8PCAxNikgfAorCQkoaHctPnN1ZmZpeF9hdXhfc2l6ZSA+PiA0KQorCQkpOworfQorCisvKgorKiBkdl9tZXRhX2ZsYWc6IDEsIGRvbGJ5IG1ldGEgb25seTsgMiwgbm90IGluY2x1ZGUgZG9sYnkgbWV0YQorKi8KK3N0YXRpYyB2b2lkIHNldF9hdXhfZGF0YShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LAorCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnBpYywgdW5zaWduZWQgY2hhciBzdWZmaXhfZmxhZywKKwl1bnNpZ25lZCBjaGFyIGR2X21ldGFfZmxhZywgc3RydWN0IHZkZWNfaDI2NF9od19zICpod19iKQoreworCWludCBpOworCXVuc2lnbmVkIHNob3J0ICphdXhfYWRyOworCXVuc2lnbmVkIHNpemVfcmVnX3ZhbCA9CisJCVJFQURfVlJFRyhIMjY0X0FVWF9EQVRBX1NJWkUpOworCXVuc2lnbmVkIGF1eF9jb3VudCA9IDA7CisJaW50IGF1eF9zaXplID0gMDsKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3X2J1ZiA9IGh3X2IgPyBod19iIDogaHc7CisJaWYgKHBpYyA9PSBOVUxMIHx8IHBpYy0+YnVmX3NwZWNfbnVtIDwgMCB8fCBwaWMtPmJ1Zl9zcGVjX251bSA+PSBCVUZTUEVDX1BPT0xfU0laRQorCQl8fCAoIWlzX2J1Zl9zcGVjX2luX3VzZShodywgcGljLT5idWZfc3BlY19udW0pKSkKKwkJcmV0dXJuOworCisJaWYgKHN1ZmZpeF9mbGFnKSB7CisJCWF1eF9hZHIgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCShod19idWYtPmF1eF9hZGRyICsKKwkJCWh3X2J1Zi0+cHJlZml4X2F1eF9zaXplKTsKKwkJYXV4X2NvdW50ID0KKwkJKChzaXplX3JlZ192YWwgJiAweGZmZmYpIDw8IDQpCisJCQk+PiAxOworCQlhdXhfc2l6ZSA9CisJCQlod19idWYtPnN1ZmZpeF9hdXhfc2l6ZTsKKwl9IGVsc2UgeworCQlhdXhfYWRyID0KKwkJKHVuc2lnbmVkIHNob3J0ICopaHdfYnVmLT5hdXhfYWRkcjsKKwkJYXV4X2NvdW50ID0KKwkJKChzaXplX3JlZ192YWwgPj4gMTYpIDw8IDQpCisJCQk+PiAxOworCQlhdXhfc2l6ZSA9CisJCQlod19idWYtPnByZWZpeF9hdXhfc2l6ZTsKKwl9CisJaWYgKGRwYl9pc19kZWJ1ZyhERUNPREVfSUQoaHcpLAorCQkgUFJJTlRfRkxBR19TRUlfREVUQUlMKSkgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSIlczpwb2MgJWQgb2xkIHNpemUgJWQgY291bnQgJWQsc3VmICVkIGR2X2ZsYWcgJWRcclxuIiwKKwkJCV9fZnVuY19fLCBwaWMtPnBvYywgQVVYX0RBVEFfU0laRShwaWMpLAorCQkJYXV4X2NvdW50LCBzdWZmaXhfZmxhZywgZHZfbWV0YV9mbGFnKTsKKwl9CisJaWYgKGF1eF9zaXplID4gMCAmJiBhdXhfY291bnQgPiAwKSB7CisJCWludCBoZWFkc19zaXplID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgYXV4X2NvdW50OyBpKyspIHsKKwkJCXVuc2lnbmVkIGNoYXIgdGFnID0gYXV4X2FkcltpXSA+PiA4OworCQkJaWYgKHRhZyAhPSAwICYmIHRhZyAhPSAweGZmKSB7CisJCQkJaWYgKGR2X21ldGFfZmxhZyA9PSAwKQorCQkJCQloZWFkc19zaXplICs9IDg7CisJCQkJZWxzZSBpZiAoZHZfbWV0YV9mbGFnID09IDEgJiYgdGFnID09IDB4MSkKKwkJCQkJaGVhZHNfc2l6ZSArPSA4OworCQkJCWVsc2UgaWYgKGR2X21ldGFfZmxhZyA9PSAyICYmIHRhZyAhPSAweDEpCisJCQkJCWhlYWRzX3NpemUgKz0gODsKKwkJCX0KKwkJfQorCisJCWlmIChBVVhfREFUQV9CVUYocGljKSkgeworCQkJdW5zaWduZWQgY2hhciB2YWxpZF90YWcgPSAwOworCQkJdW5zaWduZWQgY2hhciAqaCA9CisJCQkJQVVYX0RBVEFfQlVGKHBpYykgKworCQkJCUFVWF9EQVRBX1NJWkUocGljKTsKKwkJCXVuc2lnbmVkIGNoYXIgKnAgPSBoICsgODsKKwkJCWludCBsZW4gPSAwOworCQkJaW50IHBhZGRpbmdfbGVuID0gMDsKKwkJCWZvciAoaSA9IDA7IGkgPCBhdXhfY291bnQ7IGkgKz0gNCkgeworCQkJCWludCBpaTsKKwkJCQl1bnNpZ25lZCBjaGFyIHRhZyA9IGF1eF9hZHJbaSArIDNdID4+IDg7CisJCQkJaWYgKHRhZyAhPSAwICYmIHRhZyAhPSAweGZmKSB7CisJCQkJCWlmIChkdl9tZXRhX2ZsYWcgPT0gMCkKKwkJCQkJCXZhbGlkX3RhZyA9IDE7CisJCQkJCWVsc2UgaWYgKGR2X21ldGFfZmxhZyA9PSAxCisJCQkJCQkmJiB0YWcgPT0gMHgxKQorCQkJCQkJdmFsaWRfdGFnID0gMTsKKwkJCQkJZWxzZSBpZiAoZHZfbWV0YV9mbGFnID09IDIKKwkJCQkJCSYmIHRhZyAhPSAweDEpCisJCQkJCQl2YWxpZF90YWcgPSAxOworCQkJCQllbHNlCisJCQkJCQl2YWxpZF90YWcgPSAwOworCQkJCQlpZiAodmFsaWRfdGFnICYmIGxlbiA+IDApIHsKKwkJCQkJCUFVWF9EQVRBX1NJWkUocGljKSArPQorCQkJCQkJKGxlbiArIDgpOworCQkJCQkJaFswXSA9CisJCQkJCQkobGVuID4+IDI0KSAmIDB4ZmY7CisJCQkJCQloWzFdID0KKwkJCQkJCShsZW4gPj4gMTYpICYgMHhmZjsKKwkJCQkJCWhbMl0gPQorCQkJCQkJKGxlbiA+PiA4KSAmIDB4ZmY7CisJCQkJCQloWzNdID0KKwkJCQkJCShsZW4gPj4gMCkgJiAweGZmOworCQkJCQkJaFs2XSA9CisJCQkJCQkocGFkZGluZ19sZW4gPj4gOCkKKwkJCQkJCSYgMHhmZjsKKwkJCQkJCWhbN10gPQorCQkJCQkJKHBhZGRpbmdfbGVuKSAmIDB4ZmY7CisJCQkJCQloICs9IChsZW4gKyA4KTsKKwkJCQkJCXAgKz0gODsKKwkJCQkJCWxlbiA9IDA7CisJCQkJCQlwYWRkaW5nX2xlbiA9IDA7CisJCQkJCX0KKwkJCQkJaWYgKHZhbGlkX3RhZykgeworCQkJCQkJaFs0XSA9IHRhZzsKKwkJCQkJCWhbNV0gPSAwOworCQkJCQkJaFs2XSA9IDA7CisJCQkJCQloWzddID0gMDsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAodmFsaWRfdGFnKSB7CisJCQkJCWZvciAoaWkgPSAwOyBpaSA8IDQ7IGlpKyspIHsKKwkJCQkJCXVuc2lnbmVkIHNob3J0IGFhID0KKwkJCQkJCQlhdXhfYWRyW2kgKyAzCisJCQkJCQkJLSBpaV07CisJCQkJCQkqcCA9IGFhICYgMHhmZjsKKwkJCQkJCXArKzsKKwkJCQkJCWxlbisrOworCQkJCQkJLyppZiAoKGFhID4+IDgpID09IDB4ZmYpCisJCQkJCQkJcGFkZGluZ19sZW4rKzsqLworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKGxlbiA+IDApIHsKKwkJCQlBVVhfREFUQV9TSVpFKHBpYykgKz0gKGxlbiArIDgpOworCQkJCWhbMF0gPSAobGVuID4+IDI0KSAmIDB4ZmY7CisJCQkJaFsxXSA9IChsZW4gPj4gMTYpICYgMHhmZjsKKwkJCQloWzJdID0gKGxlbiA+PiA4KSAmIDB4ZmY7CisJCQkJaFszXSA9IChsZW4gPj4gMCkgJiAweGZmOworCQkJCWhbNl0gPSAocGFkZGluZ19sZW4gPj4gOCkgJiAweGZmOworCQkJCWhbN10gPSAocGFkZGluZ19sZW4pICYgMHhmZjsKKwkJCX0KKwkJCWlmIChkcGJfaXNfZGVidWcoREVDT0RFX0lEKGh3KSwKKwkJCQlQUklOVF9GTEFHX1NFSV9ERVRBSUwpKSB7CisJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkJCSJhdXg6IChzaXplICVkKSBzdWZmaXhfZmxhZyAlZFxuIiwKKwkJCQkJQVVYX0RBVEFfU0laRShwaWMpLCBzdWZmaXhfZmxhZyk7CisJCQkJZm9yIChpID0gMDsgaSA8IEFVWF9EQVRBX1NJWkUocGljKTsgaSsrKSB7CisJCQkJCWRwYl9wcmludF9jb250KERFQ09ERV9JRChodyksIDAsCisJCQkJCQkiJTAyeCAiLCBBVVhfREFUQV9CVUYocGljKVtpXSk7CisJCQkJCWlmICgoKGkgKyAxKSAmIDB4ZikgPT0gMCkKKwkJCQkJCWRwYl9wcmludF9jb250KAorCQkJCQkJREVDT0RFX0lEKGh3KSwKKwkJCQkJCQkwLCAiXG4iKTsKKwkJCQl9CisJCQkJZHBiX3ByaW50X2NvbnQoREVDT0RFX0lEKGh3KSwKKwkJCQkJMCwgIlxuIik7CisJCQl9CisJCX0KKwl9CisKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9hdXhfZGF0YShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LAorCWludCBidWZfc3BlY19udW0pCit7CisjaWYgMAorCWtmcmVlKGh3LT5idWZmZXJfc3BlY1tidWZfc3BlY19udW1dLmF1eF9kYXRhX2J1Zik7CisJaHctPmJ1ZmZlcl9zcGVjW2J1Zl9zcGVjX251bV0uYXV4X2RhdGFfYnVmID0gTlVMTDsKKwlody0+YnVmZmVyX3NwZWNbYnVmX3NwZWNfbnVtXS5hdXhfZGF0YV9zaXplID0gMDsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBkdW1wX2F1eF9idWYoc3RydWN0IHZkZWNfaDI2NF9od19zICpodykKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBzaG9ydCAqYXV4X2FkciA9CisJCSh1bnNpZ25lZCBzaG9ydCAqKQorCQlody0+YXV4X2FkZHI7CisJdW5zaWduZWQgYXV4X3NpemUgPQorCQkoUkVBRF9WUkVHKEgyNjRfQVVYX0RBVEFfU0laRSkKKwkJPj4gMTYpIDw8IDQ7CisKKwlpZiAoaHctPnByZWZpeF9hdXhfc2l6ZSA+IDApIHsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQkwLAorCQkJInByZWZpeCBhdXg6IChzaXplICVkKVxuIiwKKwkJCWF1eF9zaXplKTsKKwkJZm9yIChpID0gMDsgaSA8CisJCShhdXhfc2l6ZSA+PiAxKTsgaSsrKSB7CisJCQlkcGJfcHJpbnRfY29udChERUNPREVfSUQoaHcpLAorCQkJCTAsCisJCQkJIiUwNHggIiwKKwkJCQkqKGF1eF9hZHIgKyBpKSk7CisJCQlpZiAoKChpICsgMSkgJiAweGYpCisJCQkJPT0gMCkKKwkJCQlkcGJfcHJpbnRfY29udCgKKwkJCQlERUNPREVfSUQoaHcpLAorCQkJCTAsICJcbiIpOworCQl9CisJfQorCWlmIChody0+c3VmZml4X2F1eF9zaXplID4gMCkgeworCQlhdXhfYWRyID0gKHVuc2lnbmVkIHNob3J0ICopCisJCQkoaHctPmF1eF9hZGRyICsKKwkJCWh3LT5wcmVmaXhfYXV4X3NpemUpOworCQlhdXhfc2l6ZSA9CisJCShSRUFEX1ZSRUcoSDI2NF9BVVhfREFUQV9TSVpFKSAmIDB4ZmZmZikKKwkJCTw8IDQ7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLAorCQkJMCwKKwkJCSJzdWZmaXggYXV4OiAoc2l6ZSAlZClcbiIsCisJCQlhdXhfc2l6ZSk7CisJCWZvciAoaSA9IDA7IGkgPAorCQkoYXV4X3NpemUgPj4gMSk7IGkrKykgeworCQkJZHBiX3ByaW50X2NvbnQoREVDT0RFX0lEKGh3KSwKKwkJCQkwLAorCQkJCSIlMDR4ICIsICooYXV4X2FkciArIGkpKTsKKwkJCWlmICgoKGkgKyAxKSAmIDB4ZikgPT0gMCkKKwkJCQlkcGJfcHJpbnRfY29udChERUNPREVfSUQoaHcpLAorCQkJCTAsICJcbiIpOworCQl9CisJfQorfQorCisjaWZkZWYgVkRFQ19EVworCitzdHJ1Y3QgdmRlY19kd19wYXJhbV9zZXR7CisJY2hhciBkd194X3Nocmlua18xc3Q7CisJY2hhciBkd194X3Nocmlua18ybmQ7CisJY2hhciBkd194X3Nocmlua18zcmQ7CisJY2hhciBkd195X3Nocmlua18xc3Q7CisJY2hhciBkd195X3Nocmlua18ybmQ7CisJY2hhciBkd195X3Nocmlua18zcmQ7CisJY2hhciBkd19tZXJnZV84dG8xNjsKKwljaGFyIGR3X21lcmdlXzE2dG8zMjsKKwljaGFyIGR3X2RtYV9ibGtfbW9kZTsKKwljaGFyIGR3X2J3c2F2ZV9tb2RlOworfTsKKy8vI2RlZmluZSBGT1JfTFBERFI0X0VGRklDSUVOQ1kKKworc3RhdGljIHZvaWQgaDI2NF92ZGVjX2R3X2NmZyhzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LCBpbnQgY2FudmFzX3BvcykKK3sKKwl1MzIgZGF0YTMyID0gMCwgc3RyaWRlID0gMDsKKwlzdHJ1Y3QgdmRlY19kd19wYXJhbV9zZXQgKnAgPSBOVUxMOworCXN0cnVjdCB2ZGVjX2R3X3BhcmFtX3NldCBkd19wYXJhbV9zZXRfcG9vbFtdID0geworCQkvKngxLCB4MiwgeDMsIHkxLCB5MiwgeTMsIG04dDYsIG0xNnRvMzIgKi8KKwkJLy97MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMX0sCS8qIDEvMSwgMS8xICovCisJCXsxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxfSwJCS8qIDEvMiwgMS8xICovCisJCXsxLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAxfSwJCS8qIDEvMiwgMS8yICovCisJCS8vezEsIDAsIDAsIDEsIDEsIDAsIDAsIDAsIDAsIDF9LAkvKiAxLzQsIDEvMiAqLworCQl7MiwgMCwgMSwgMSwgMywgMCwgMCwgMSwgMCwgMX0sCQkvKiAxLzQsIDEvNCAqLworCQkvL3sxLCAxLCAxLCAwLCAxLCAxLCAxLCAxLCAwLCAxfSwJLyo+IDEwODBwIDEvOCwgMS80ICovCisJCXsxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAxfSwJCS8qPiAxMDgwcCAxLzgsIDEvOCAqLworCX07CisKKwlpZiAoSVNfVkRFQ19EVyhodykpCisJCXAgPSAmZHdfcGFyYW1fc2V0X3Bvb2xbX19mZnMoSVNfVkRFQ19EVyhodykpXTsKKwllbHNlCisJCXJldHVybjsKKworCVdSSVRFX1ZSRUcoTURFQ19ET1VCTEVXX0NGRzMsCisJCWh3LT5idWZmZXJfc3BlY1tjYW52YXNfcG9zXS52ZGVjX2R3X3lfYWRkcik7IC8vIGx1bWEgc3RhcnQgYWRkcmVzcworCVdSSVRFX1ZSRUcoTURFQ19ET1VCTEVXX0NGRzQsCisJCWh3LT5idWZmZXJfc3BlY1tjYW52YXNfcG9zXS52ZGVjX2R3X3VfYWRkcik7IC8vIGNocm9tYSBzdGFydCBhZGRyZXNzCisKKwlzdHJpZGUgPSBBTElHTl9XSURUSCgoaHctPm1iX3dpZHRoIDw8IDQpIC8gKElTX1ZERUNfRFcoaHcpKSk7CisJaWYgKChJU19WREVDX0RXKGh3KSkgPT0gMSkJLy93aWR0aCAxLzIKKwkJc3RyaWRlID4+PSAxOworCWRhdGEzMiA9IChzdHJpZGUgPDwgMTYpIHwgc3RyaWRlOworCVdSSVRFX1ZSRUcoTURFQ19ET1VCTEVXX0NGRzUsIGRhdGEzMik7IC8vIGNocm9tYSBzdHJpZGUgfCBsdW1hIHN0cmlkZQorCisJZGF0YTMyID0gMDsKKwlwLT5kd19kbWFfYmxrX21vZGUgPSBody0+Y2FudmFzX21vZGU7CisJZGF0YTMyIHw9ICgocC0+ZHdfeF9zaHJpbmtfMXN0IDw8IDAgKSB8ICAgICAvLyAxc3QgZG93bi1zY2FsZSBob3Jpem9udGFsLCAwMDpuby1zY2FsZSAwMToxLzJhdmcgMTA6bGVmdCAxMTpyaWdodAorCQkocC0+ZHdfeV9zaHJpbmtfMXN0IDw8IDIgKSB8ICAgICAvLyAxc3QgZG93bi1zY2FsZSB2ZXJ0aWNhbCwgICAwMDpuby1zY2FsZSAwMToxLzJhdmcgMTA6dXAgICAxMTpkb3duCisJCShwLT5kd194X3Nocmlua18ybmQgPDwgNCApIHwgICAgIC8vIDJuZCBkb3duLXNjYWxlIGhvcml6b250YWwsIDAwOm5vLXNjYWxlIDAxOjEvMmF2ZyAxMDpsZWZ0IDExOnJpZ2h0CisJCShwLT5kd195X3Nocmlua18ybmQgPDwgNiApIHwgICAgIC8vIDJuZCBkb3duLXNjYWxlIHZlcnRpY2FsLCAgIDAwOm5vLXNjYWxlIDAxOjEvMmF2ZyAxMDp1cCAgIDExOmRvd24KKwkJKHAtPmR3X3hfc2hyaW5rXzNyZCA8PCA4ICkgfCAgICAgLy8gM3JkIGRvd24tc2NhbGUgaG9yaXpvbnRhbCwgMDA6bm8tc2NhbGUgMDE6MS8yYXZnIDEwOmxlZnQgMTE6cmlnaHQKKwkJKHAtPmR3X3lfc2hyaW5rXzNyZCA8PCAxMCkgfCAgICAgLy8gM3JkIGRvd24tc2NhbGUgdmVydGljYWwsICAgMDA6bm8tc2NhbGUgMDE6MS8yYXZnIDEwOnVwICAgMTE6ZG93bgorCQkocC0+ZHdfbWVyZ2VfOHRvMTYgPDwgMTIgKSB8ICAgICAvLyAgOC0+MTYgaG9yaXpvbnRhbCBibG9jayBtZXJnZSBmb3IgYmV0dGVyIGRkciBlZmZpY2llbmN5CisJCShwLT5kd19tZXJnZV8xNnRvMzIgPDwgMTMpIHwgICAgIC8vIDE2LT4zMiBob3Jpem9udGFsIGJsb2NrIG1lcmdlIGZvciBiZXR0ZXIgZGRyIGVmZmljaWVuY3kKKwkJKHAtPmR3X2RtYV9ibGtfbW9kZSA8PCAxNCkgfCAgICAgLy8gRE1BIGJsb2NrIG1vZGUsIDA6bGluZWFyIDE6MzJ4MzIgMjo2NHgzMgorI2lmZGVmIEZPUl9MUEREUjRfRUZGSUNJRU5DWQorCQkoMSA8PCAxOSkgfAorI2VuZGlmCisJCShwLT5kd19id3NhdmVfbW9kZSA8PCAyMikpOyAgICAgIC8vIFNhdmUgbGluZSBidWZmZXJzIHRvIHNhdmUgYmFuZCB3aWR0aAorCVdSSVRFX1ZSRUcoTURFQ19ET1VCTEVXX0NGRzEsIGRhdGEzMik7IC8vIGFkZCBzb21lIHNwZWNpYWwgdGVzdHMgaGVyZQorCisJZGF0YTMyID0gMDsKKwlkYXRhMzIgfD0gKDEgPDwgMCkgfCAoMCA8PCAyNyk7CisJV1JJVEVfVlJFRyhNREVDX0RPVUJMRVdfQ0ZHMCwgZGF0YTMyKTsgLy8gRG91YmxlIFdyaXRlIEVuYWJsZSB8IHNvdXJjZSBmcm9tIGRibGsKKworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RFQ19ERVRBSUwsCisJCSJ2ZGVjX2RvdWJsZV93cml0ZSBtb2RlICVkXG4iLAorCQlJU19WREVDX0RXKGh3KSk7CisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCwKKwkJInBhcmFtIHslZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkfVxuIiwKKwkJcC0+ZHdfeF9zaHJpbmtfMXN0LAorCQlwLT5kd195X3Nocmlua18xc3QsCisJCXAtPmR3X3hfc2hyaW5rXzJuZCwKKwkJcC0+ZHdfeV9zaHJpbmtfMm5kLAorCQlwLT5kd194X3Nocmlua18zcmQsCisJCXAtPmR3X3lfc2hyaW5rXzNyZCwKKwkJcC0+ZHdfbWVyZ2VfOHRvMTYsCisJCXAtPmR3X21lcmdlXzE2dG8zMiwKKwkJcC0+ZHdfZG1hX2Jsa19tb2RlKTsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19ERUNfREVUQUlMLAorCQkiY2ZnMCwxLDMsNCw1ID0geyV4LCAleCwgJXgsICV4LCAleH1cbiIsCisJCVJFQURfVlJFRyhNREVDX0RPVUJMRVdfQ0ZHMCksCisJCVJFQURfVlJFRyhNREVDX0RPVUJMRVdfQ0ZHMSksCisJCVJFQURfVlJFRyhNREVDX0RPVUJMRVdfQ0ZHMyksCisJCVJFQURfVlJFRyhNREVDX0RPVUJMRVdfQ0ZHNCksCisJCVJFQURfVlJFRyhNREVDX0RPVUJMRVdfQ0ZHNSkpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGNvbmZpZ19kZWNvZGVfbW9kZShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3KQoreworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaHcpOworI2VuZGlmCisJaWYgKGlucHV0X2ZyYW1lX2Jhc2VkKGh3X3RvX3ZkZWMoaHcpKSkKKwkJV1JJVEVfVlJFRyhIMjY0X0RFQ09ERV9NT0RFLAorCQkJREVDT0RFX01PREVfTVVMVElfRlJBTUVCQVNFKTsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCWVsc2UgaWYgKHZkZWMtPnNsYXZlKQorCQlXUklURV9WUkVHKEgyNjRfREVDT0RFX01PREUsCisJCQkoaHctPmdvdF92YWxpZF9uYWwgPDwgOCkgfAorCQkJREVDT0RFX01PREVfTVVMVElfRFZCQUwpOworCWVsc2UgaWYgKHZkZWMtPm1hc3RlcikKKwkJV1JJVEVfVlJFRyhIMjY0X0RFQ09ERV9NT0RFLAorCQkJKGh3LT5nb3RfdmFsaWRfbmFsIDw8IDgpIHwKKwkJCURFQ09ERV9NT0RFX01VTFRJX0RWRU5MKTsKKyNlbmRpZgorCWVsc2UKKwkJV1JJVEVfVlJFRyhIMjY0X0RFQ09ERV9NT0RFLAorCQkJREVDT0RFX01PREVfTVVMVElfU1RSRUFNQkFTRSk7CisJV1JJVEVfVlJFRyhIMjY0X0RFQ09ERV9TRVFJTkZPLAorCQlody0+c2VxX2luZm8yKTsKKwlXUklURV9WUkVHKEhFQURfUEFESU5HX1JFRywgMCk7CisKKwlpZiAoaHctPmluaXRfZmxhZyA9PSAwKQorCQlXUklURV9WUkVHKElOSVRfRkxBR19SRUcsIDApOworCWVsc2UKKwkJV1JJVEVfVlJFRyhJTklUX0ZMQUdfUkVHLCAxKTsKK30KKworaW50IGNvbmZpZ19kZWNvZGVfYnVmKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcsIHN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnBpYykKK3sKKwkvKiBzdGF0aWMgaW50IGNvdW50ID0gMDsgKi8KKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9ICZody0+ZHBiOworCXN0cnVjdCBTbGljZSAqcFNsaWNlID0gJihwX0gyNjRfRHBiLT5tU2xpY2UpOworCXVuc2lnbmVkIGludCBjb2xvY2F0ZV9hZHJfb2Zmc2V0OworCXVuc2lnbmVkIGludCB2YWw7CisJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqbGFzdF9waWMgPSBody0+bGFzdF9kZWNfcGljdHVyZTsKKworI2lmZGVmIE9ORV9DT0xPQ0FURV9CVUZfUEVSX0RFQ09ERV9CVUYKKwlpbnQgY29sb2NhdGVfYnVmX2luZGV4OworI2VuZGlmCisjZGVmaW5lIEgyNjRfQlVGRkVSX0lORk9fSU5ERVggICAgUE1WM19YIC8qIDB4YzI0ICovCisjZGVmaW5lIEgyNjRfQlVGRkVSX0lORk9fREFUQSAgIFBNVjJfWCAgLyogMHhjMjIgKi8KKyNkZWZpbmUgSDI2NF9DVVJSRU5UX1BPQ19JRFhfUkVTRVQgTEFTVF9TTElDRV9NVl9BRERSIC8qIDB4YzMwICovCisjZGVmaW5lIEgyNjRfQ1VSUkVOVF9QT0MgICAgICAgICAgTEFTVF9NVlkgLyogMHhjMzIgc2hhcmVkIHdpdGggY29uY2VhbCBNViAqLworCisjZGVmaW5lIEgyNjRfQ09fTUJfV1JfQUREUiAgICAgICAgVkxEX0MzOCAvKiAweGMzOCAqLworLyogYml0IDMxOjMwIC0tIEwxWzBdIHBpY3R1cmUgY29kaW5nIHN0cnVjdHVyZSwKKyAqCTAwIC0gdG9wIGZpZWxkLAkwMSAtIGJvdHRvbSBmaWVsZCwKKyAqCTEwIC0gZnJhbWUsIDExIC0gbWJhZmYgZnJhbWUKKyAqICAgYml0IDI5IC0gTDFbMF0gdG9wL2JvdCBmb3IgQiBmaWVsZCBwY2l0dXJlICwgMCAtIHRvcCwgMSAtIGJvdAorICogICBiaXQgMjg6MCBoMjY0X2NvX21iX21lbV9yZF9hZGRyWzMxOjNdCisgKgktLSBvbmx5IHVzZWQgZm9yIEIgUGljdHVyZSBEaXJlY3QgbW9kZSBbMjowXSB3aWxsIHNldCB0byAzJ2IwMDAKKyAqLworI2RlZmluZSBIMjY0X0NPX01CX1JEX0FERFIgICAgICAgIFZMRF9DMzkgLyogMHhjMzkgKi8KKworLyogYml0IDE1IC0tIGZsdXNoIGNvX21iX2RhdGEgdG8gRERSIC0tIFctT25seQorICogICBiaXQgMTQgLS0gaDI2NF9jb19tYl9tZW1fd3JfYWRkciB3cml0ZSBFbmFibGUgLS0gVy1Pbmx5CisgKiAgIGJpdCAxMyAtLSBoMjY0X2NvX21iX2luZm9fd3JfcHRyIHdyaXRlIEVuYWJsZSAtLSBXLU9ubHkKKyAqICAgYml0IDkgLS0gc29mdF9yZXNldCAtLSBXLU9ubHkKKyAqICAgYml0IDggLS0gdXBnZW50CisgKiAgIGJpdCA3OjIgLS0gaDI2NF9jb19tYl9tZW1fd3JfYWRkcgorICogICBiaXQgMTowIC0tIGgyNjRfY29fbWJfaW5mb193cl9wdHIKKyAqLworI2RlZmluZSBIMjY0X0NPX01CX1JXX0NUTCAgICAgICAgIFZMRF9DM0QgLyogMHhjM2QgKi8KKyNkZWZpbmUgRENBQ19ERFJfQllURTY0X0NUTCAgICAgICAgICAgICAgICAgICAweDBlMWQKKwl1bnNpZ25lZCBsb25nIGNhbnZhc19hZHI7CisJdW5zaWduZWQgaW50IHJlZl9yZWdfdmFsOworCXVuc2lnbmVkIGludCBvbmVfcmVmX2NmZyA9IDA7CisJaW50IGgyNjRfYnVmZmVyX2luZm9fZGF0YV93cml0ZV9jb3VudDsKKwlpbnQgaSwgajsKKwl1bnNpZ25lZCBpbnQgY29sb2NhdGVfd3JfYWRyOworCXVuc2lnbmVkIGludCBjb2xvY2F0ZV9yZF9hZHI7CisJdW5zaWduZWQgY2hhciB1c2VfZGlyZWN0Xzh4ODsKKwlpbnQgY2FudmFzX3BvczsKKwljYW52YXNfcG9zID0gaHctPmJ1ZmZlcl9zcGVjW3BpYy0+YnVmX3NwZWNfbnVtXS5jYW52YXNfcG9zOworCVdSSVRFX1ZSRUcoSDI2NF9DVVJSRU5UX1BPQ19JRFhfUkVTRVQsIDApOworCVdSSVRFX1ZSRUcoSDI2NF9DVVJSRU5UX1BPQywgcGljLT5mcmFtZV9wb2MpOworCVdSSVRFX1ZSRUcoSDI2NF9DVVJSRU5UX1BPQywgcGljLT50b3BfcG9jKTsKKwlXUklURV9WUkVHKEgyNjRfQ1VSUkVOVF9QT0MsIHBpYy0+Ym90dG9tX3BvYyk7CisKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19ERUNfREVUQUlMLAorCQkiJXM6IHBpY19udW0gaXMgJWQsIHBvYyBpcyAlZCAoJWQsICVkLCAlZCksIGJ1Zl9zcGVjX251bSAlZCBjYW52YXNfcG9zICVkXG4iLAorCQlfX2Z1bmNfXywgcGljLT5waWNfbnVtLCBwaWMtPnBvYywgcGljLT5mcmFtZV9wb2MsCisJCXBpYy0+dG9wX3BvYywgcGljLT5ib3R0b21fcG9jLCBwaWMtPmJ1Zl9zcGVjX251bSwKKwkJY2FudmFzX3Bvcyk7CisJcHJpbnRfcGljX2luZm8oREVDT0RFX0lEKGh3KSwgImN1ciIsIHBpYywgcFNsaWNlLT5zbGljZV90eXBlKTsKKworI2lmZGVmIFZERUNfRFcKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3KSB7CisJCWlmIChJU19WREVDX0RXKGh3KSAmJiBwaWMtPm1iX2FmZl9mcmFtZV9mbGFnKQorCQkJV1JJVEVfVlJFRyhNREVDX0RPVUJMRVdfQ0ZHMCwKKwkJCQkoUkVBRF9WUkVHKE1ERUNfRE9VQkxFV19DRkcwKSAmICh+KDEgPDwgMzApKSkpOworCX0KKyNlbmRpZgorCVdSSVRFX1ZSRUcoQ1VSUl9DQU5WQVNfQ1RSTCwgY2FudmFzX3BvcyA8PCAyNCk7CisJY2FudmFzX2FkciA9IFJFQURfVlJFRyhDVVJSX0NBTlZBU19DVFJMKSAmIDB4ZmZmZmZmOworCisJaWYgKCFody0+bW11X2VuYWJsZSkgeworCQlXUklURV9WUkVHKFJFQ19DQU5WQVNfQUREUiwgY2FudmFzX2Fkcik7CisJCVdSSVRFX1ZSRUcoREJLUl9DQU5WQVNfQUREUiwgY2FudmFzX2Fkcik7CisJCVdSSVRFX1ZSRUcoREJLV19DQU5WQVNfQUREUiwgY2FudmFzX2Fkcik7CisjaWZkZWYgVkRFQ19EVworCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3KSB7CisJCQlXUklURV9WUkVHKE1ERUNfRE9VQkxFV19DRkcxLAorCQkJCShody0+YnVmZmVyX3NwZWNbY2FudmFzX3Bvc10udmRlY19kd195X2NhbnZhc19pbmRleCB8CisJCQkJKGh3LT5idWZmZXJfc3BlY1tjYW52YXNfcG9zXS52ZGVjX2R3X3VfY2FudmFzX2luZGV4IDw8IDgpKSk7CisJCX0gZWxzZSB7CisJCQkJaDI2NF92ZGVjX2R3X2NmZyhodywgY2FudmFzX3Bvcyk7CisJCX0KKyNlbmRpZgorCX0gZWxzZQorCQloZXZjX3Nhb19zZXRfcGljX2J1ZmZlcihodywgcGljKTsKKworCWlmIChwaWMtPm1iX2FmZl9mcmFtZV9mbGFnKQorCQlody0+YnVmZmVyX3NwZWNbcGljLT5idWZfc3BlY19udW1dLmluZm8wID0gMHhmNGMwOworCWVsc2UgaWYgKHBpYy0+c3RydWN0dXJlID09IFRPUF9GSUVMRCkKKwkJaHctPmJ1ZmZlcl9zcGVjW3BpYy0+YnVmX3NwZWNfbnVtXS5pbmZvMCA9IDB4ZjQwMDsKKwllbHNlIGlmIChwaWMtPnN0cnVjdHVyZSA9PSBCT1RUT01fRklFTEQpCisJCWh3LT5idWZmZXJfc3BlY1twaWMtPmJ1Zl9zcGVjX251bV0uaW5mbzAgPSAweGY0NDA7CisJZWxzZQorCQlody0+YnVmZmVyX3NwZWNbcGljLT5idWZfc3BlY19udW1dLmluZm8wID0gMHhmNDgwOworCisJaWYgKHBpYy0+Ym90dG9tX3BvYyA8IHBpYy0+dG9wX3BvYykKKwkJaHctPmJ1ZmZlcl9zcGVjW3BpYy0+YnVmX3NwZWNfbnVtXS5pbmZvMCB8PSAweDEwMDsKKworCWh3LT5idWZmZXJfc3BlY1twaWMtPmJ1Zl9zcGVjX251bV0uaW5mbzEgPSBwaWMtPnRvcF9wb2M7CisJaHctPmJ1ZmZlcl9zcGVjW3BpYy0+YnVmX3NwZWNfbnVtXS5pbmZvMiA9IHBpYy0+Ym90dG9tX3BvYzsKKwlXUklURV9WUkVHKEgyNjRfQlVGRkVSX0lORk9fSU5ERVgsIDE2KTsKKworCWZvciAoaiA9IDA7IGogPCBody0+ZHBiLm1EUEIuc2l6ZTsgaisrKSB7CisJCWludCBsb25nX3Rlcm1fZmxhZzsKKwkJaSA9IGdldF9idWZfc3BlY19ieV9jYW52YXNfcG9zKGh3LCBqKTsKKwkJaWYgKGkgPCAwKQorCQkJYnJlYWs7CisJCWxvbmdfdGVybV9mbGFnID0KKwkJCWdldF9sb25nX3Rlcm1fZmxhZ19ieV9idWZfc3BlY19udW0ocF9IMjY0X0RwYiwgaSk7CisJCWlmIChsb25nX3Rlcm1fZmxhZyA+IDApIHsKKwkJCWlmIChsb25nX3Rlcm1fZmxhZyAmIDB4MSkKKwkJCQlody0+YnVmZmVyX3NwZWNbaV0uaW5mbzAgfD0gKDEgPDwgNCk7CisJCQllbHNlCisJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLmluZm8wICY9IH4oMSA8PCA0KTsKKworCQkJaWYgKGxvbmdfdGVybV9mbGFnICYgMHgyKQorCQkJCWh3LT5idWZmZXJfc3BlY1tpXS5pbmZvMCB8PSAoMSA8PCA1KTsKKwkJCWVsc2UKKwkJCQlody0+YnVmZmVyX3NwZWNbaV0uaW5mbzAgJj0gfigxIDw8IDUpOworCQl9CisKKwkJaWYgKGkgPT0gcGljLT5idWZfc3BlY19udW0pCisJCQlXUklURV9WUkVHKEgyNjRfQlVGRkVSX0lORk9fREFUQSwKKwkJCQlody0+YnVmZmVyX3NwZWNbaV0uaW5mbzAgfCAweGYpOworCQllbHNlCisJCQlXUklURV9WUkVHKEgyNjRfQlVGRkVSX0lORk9fREFUQSwKKwkJCQlody0+YnVmZmVyX3NwZWNbaV0uaW5mbzApOworCQlXUklURV9WUkVHKEgyNjRfQlVGRkVSX0lORk9fREFUQSwgaHctPmJ1ZmZlcl9zcGVjW2ldLmluZm8xKTsKKwkJV1JJVEVfVlJFRyhIMjY0X0JVRkZFUl9JTkZPX0RBVEEsIGh3LT5idWZmZXJfc3BlY1tpXS5pbmZvMik7CisJfQorCisJLyogY29uZmlnIHJlZmVyZW5jZSBidWZmZXIgKi8KKwlpZiAoaHctPm1tdV9lbmFibGUpIHsKKwkJaGV2Y19tY3JfY29uZmlnX21jX3JlZihodyk7CisJCWhldmNfbWNyX2NvbmZpZ19tY3JjYyhodyk7CisJfQorCisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCwKKwkJImxpc3QwIHNpemUgJWRcbiIsIHBTbGljZS0+bGlzdFhzaXplWzBdKTsKKwlXUklURV9WUkVHKEgyNjRfQlVGRkVSX0lORk9fSU5ERVgsIDApOworCXJlZl9yZWdfdmFsID0gMDsKKwlqID0gMDsKKwloMjY0X2J1ZmZlcl9pbmZvX2RhdGFfd3JpdGVfY291bnQgPSAwOworCisJLy9kaXNhYmxlIHRoaXMgcmVhZCBjYWNoZSB3aGVuIGZyYW1lIHdpZHRoIDw9IDY0ICg0TUJzKQorCS8vSVFJRENUX0NPTlRST0wsIGJpdFsxNl0gZGNhY19kbWFfcmVhZF9jYWNoZV9kaXNhYmxlCisJaWYgKGh3LT5mcmFtZV93aWR0aCA8PSA2NCkgeworCQlTRVRfVlJFR19NQVNLKElRSURDVF9DT05UUk9MLCgxIDw8IDE2KSk7CisJCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKSkKKwkJCS8vIERpc2FibGUgRERSX0JZVEU2NF9DQUNIRQorCQkJV1JJVEVfVlJFRyhEQ0FDX0REUl9CWVRFNjRfQ1RMLAorCQkJKFJFQURfVlJFRyhEQ0FDX0REUl9CWVRFNjRfQ1RMKSAmICh+MHhmKSkgfCAweGEpOworCX0KKwllbHNlCisJCUNMRUFSX1ZSRUdfTUFTSyhJUUlEQ1RfQ09OVFJPTCwoMSA8PCAxNikpOworCisJaWYgKGxhc3RfcGljKQorCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19FUlJPUkZMQUdfREJHLAorCQkJCSJsYXN0X3BpYy0+ZGF0YV9mbGFnICV4ICAgc2xpY2VfdHlwZSAleCBsYXN0X3BpYy0+c2xpY2VfdHlwZSAleFxuIiwKKwkJCQlsYXN0X3BpYy0+ZGF0YV9mbGFnLCBwU2xpY2UtPnNsaWNlX3R5cGUsIGxhc3RfcGljLT5zbGljZV90eXBlKTsKKwlpZiAoIWh3LT5pX29ubHkgJiYgIShody0+ZXJyb3JfcHJvY19wb2xpY3kgJiAweDIwMDApICYmCisJCWxhc3RfcGljICYmIChsYXN0X3BpYy0+ZGF0YV9mbGFnICYgRVJST1JfRkxBRykKKwkJJiYgKCEobGFzdF9waWMtPnNsaWNlX3R5cGUgPT0gQl9TTElDRSkpCisJCSYmICghKHBTbGljZS0+c2xpY2VfdHlwZSA9PSBJX1NMSUNFKSkpIHsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRVJST1JGTEFHX0RCRywKKwkJCQkgICJubyBpL2lkciBlcnJvciBtYXJrXG4iKTsKKwkJaHctPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOworCQlwaWMtPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAodW5zaWduZWQgaW50KShwU2xpY2UtPmxpc3RYc2l6ZVswXSk7IGkrKykgeworCQkvKnJlZiBsaXN0IDAgKi8KKwkJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqcmVmID0gcFNsaWNlLT5saXN0WFswXVtpXTsKKwkJdW5zaWduZWQgaW50IGNmZzsKKwkJLyogYml0WzY6NV0gLSBmcmFtZS9maWVsZCBpbmZvLAorCQkgKiAwMSAtIHRvcCwgMTAgLSBib3R0b20sIDExIC0gZnJhbWUKKwkJICovCisJI2lmZGVmIEVSUk9SX0NIRUNLCisJCWlmIChyZWYgPT0gTlVMTCkgeworCQkJaHctPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOworCQkJcGljLT5kYXRhX2ZsYWcgIHw9IEVSUk9SX0ZMQUc7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19FUlJPUkZMQUdfREJHLCAiIHJlZiBsaXN0MCBOVUxMXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAoKHJlZi0+ZGF0YV9mbGFnICYgRVJST1JfRkxBRykgJiYgcmVmX2ZyYW1lX21hcmtfZmxhZ1tERUNPREVfSUQoaHcpXSkgeworCQkJaHctPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOworCQkJcGljLT5kYXRhX2ZsYWcgfD0gRVJST1JfRkxBRzsKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0VSUk9SRkxBR19EQkcsICIgcmVmIGVycm9yIG1hcmsxIFxuIik7CisJCX0KKworCQlpZiAoaHctPmVycm9yX3Byb2NfcG9saWN5ICYgMHg4MDAwMCkgeworCQkJaWYgKHJlZl9iX2ZyYW1lX2Vycm9yX21heF9jb3VudCAmJgorCQkJCXJlZi0+c2xpY2VfdHlwZSA9PSBCX1NMSUNFKSB7CisJCQkJaWYgKHJlZi0+ZGF0YV9mbGFnICYgRVJST1JfRkxBRykKKwkJCQkJaHctPmJfZnJhbWVfZXJyb3JfY291bnQrKzsKKwkJCQllbHNlCisJCQkJCWh3LT5iX2ZyYW1lX2Vycm9yX2NvdW50ID0gMDsKKwkJCQlpZiAoaHctPmJfZnJhbWVfZXJyb3JfY291bnQgPiByZWZfYl9mcmFtZV9lcnJvcl9tYXhfY291bnQpIHsKKwkJCQkJaHctPmJfZnJhbWVfZXJyb3JfY291bnQgPSAwOworCQkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCQkJCSJlcnJvciAlZCBCIGZyYW1lLCByZXNldCBkcGIgYnVmZmVyXG4iLAorCQkJCQkJcmVmX2JfZnJhbWVfZXJyb3JfbWF4X2NvdW50KTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChyZWYtPmRhdGFfZmxhZyAmIE5VTExfRkxBRykKKwkJCWh3LT5kYXRhX2ZsYWcgfD0gTlVMTF9GTEFHOworI2VuZGlmCisJCWNhbnZhc19wb3MgPSBody0+YnVmZmVyX3NwZWNbcmVmLT5idWZfc3BlY19udW1dLmNhbnZhc19wb3M7CisKKwkJaWYgKHJlZi0+c3RydWN0dXJlID09IFRPUF9GSUVMRCkKKwkJCWNmZyA9IDB4MTsKKwkJZWxzZSBpZiAocmVmLT5zdHJ1Y3R1cmUgPT0gQk9UVE9NX0ZJRUxEKQorCQkJY2ZnID0gMHgyOworCQllbHNlIC8qIEZSQU1FICovCisJCQljZmcgPSAweDM7CisKKwkJb25lX3JlZl9jZmcgPSAoY2FudmFzX3BvcyAmIDB4MWYpIHwgKGNmZyA8PCA1KTsKKwkJcmVmX3JlZ192YWwgPDw9IDg7CisJCXJlZl9yZWdfdmFsIHw9IG9uZV9yZWZfY2ZnOworCQlqKys7CisKKwkJaWYgKGogPT0gNCkgeworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCwKKwkJCQkiSDI2NF9CVUZGRVJfSU5GT19EQVRBOiAleFxuIiwgcmVmX3JlZ192YWwpOworCQkJV1JJVEVfVlJFRyhIMjY0X0JVRkZFUl9JTkZPX0RBVEEsIHJlZl9yZWdfdmFsKTsKKwkJCWgyNjRfYnVmZmVyX2luZm9fZGF0YV93cml0ZV9jb3VudCsrOworCQkJaiA9IDA7CisJCX0KKwkJcHJpbnRfcGljX2luZm8oREVDT0RFX0lEKGh3KSwgImxpc3QwIiwKKwkJCXBTbGljZS0+bGlzdFhbMF1baV0sIC0xKTsKKwl9CisJaWYgKGogIT0gMCkgeworCQl3aGlsZSAoaiAhPSA0KSB7CisJCQlyZWZfcmVnX3ZhbCA8PD0gODsKKwkJCXJlZl9yZWdfdmFsIHw9IG9uZV9yZWZfY2ZnOworCQkJaisrOworCQl9CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RFQ19ERVRBSUwsCisJCQkiSDI2NF9CVUZGRVJfSU5GT19EQVRBOiAleFxuIiwKKwkJCQkJcmVmX3JlZ192YWwpOworCQlXUklURV9WUkVHKEgyNjRfQlVGRkVSX0lORk9fREFUQSwgcmVmX3JlZ192YWwpOworCQloMjY0X2J1ZmZlcl9pbmZvX2RhdGFfd3JpdGVfY291bnQrKzsKKwl9CisJcmVmX3JlZ192YWwgPSAob25lX3JlZl9jZmcgPDwgMjQpIHwgKG9uZV9yZWZfY2ZnPDwxNikgfAorCQkJCShvbmVfcmVmX2NmZyA8PCA4KSB8IG9uZV9yZWZfY2ZnOworCWZvciAoaSA9IGgyNjRfYnVmZmVyX2luZm9fZGF0YV93cml0ZV9jb3VudDsgaSA8IDg7IGkrKykKKwkJV1JJVEVfVlJFRyhIMjY0X0JVRkZFUl9JTkZPX0RBVEEsIHJlZl9yZWdfdmFsKTsKKworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RFQ19ERVRBSUwsCisJCSJsaXN0MSBzaXplICVkXG4iLCBwU2xpY2UtPmxpc3RYc2l6ZVsxXSk7CisJV1JJVEVfVlJFRyhIMjY0X0JVRkZFUl9JTkZPX0lOREVYLCA4KTsKKwlyZWZfcmVnX3ZhbCA9IDA7CisJaiA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgKHVuc2lnbmVkIGludCkocFNsaWNlLT5saXN0WHNpemVbMV0pOyBpKyspIHsKKwkJLyogcmVmIGxpc3QgMCAqLworCQlzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpyZWYgPSBwU2xpY2UtPmxpc3RYWzFdW2ldOworCQl1bnNpZ25lZCBpbnQgY2ZnOworCQkvKiBiaXRbNjo1XSAtIGZyYW1lL2ZpZWxkIGluZm8sCisJCSAqIDAxIC0gdG9wLCAxMCAtIGJvdHRvbSwgMTEgLSBmcmFtZQorCQkgKi8KKworCSNpZmRlZiBFUlJPUl9DSEVDSworCQlpZiAocmVmID09IE5VTEwpIHsKKwkJCWh3LT5kYXRhX2ZsYWcgfD0gRVJST1JfRkxBRzsKKwkJCXBpYy0+ZGF0YV9mbGFnICB8PSBFUlJPUl9GTEFHOworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRVJST1JGTEFHX0RCRywgIiByZWYgZXJyb3IgbGlzdDEgTlVMTFxuIik7CisJCQlyZXR1cm4gLTI7CisJCX0KKwkJaWYgKChyZWYtPmRhdGFfZmxhZyAmIEVSUk9SX0ZMQUcpICYmIChyZWZfZnJhbWVfbWFya19mbGFnW0RFQ09ERV9JRChodyldKSkgeworCQkJcGljLT5kYXRhX2ZsYWcgIHw9IEVSUk9SX0ZMQUc7CisJCQlody0+ZGF0YV9mbGFnIHw9IEVSUk9SX0ZMQUc7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19FUlJPUkZMQUdfREJHLCAiIHJlZiBlcnJvciBtYXJrMlxuIik7CisJCX0KKwkJaWYgKHJlZi0+ZGF0YV9mbGFnICYgTlVMTF9GTEFHKQorCQkJaHctPmRhdGFfZmxhZyB8PSBOVUxMX0ZMQUc7CisjZW5kaWYKKwkJY2FudmFzX3BvcyA9IGh3LT5idWZmZXJfc3BlY1tyZWYtPmJ1Zl9zcGVjX251bV0uY2FudmFzX3BvczsKKwkJaWYgKHJlZi0+c3RydWN0dXJlID09IFRPUF9GSUVMRCkKKwkJCWNmZyA9IDB4MTsKKwkJZWxzZSBpZiAocmVmLT5zdHJ1Y3R1cmUgPT0gQk9UVE9NX0ZJRUxEKQorCQkJY2ZnID0gMHgyOworCQllbHNlIC8qIEZSQU1FICovCisJCQljZmcgPSAweDM7CisJCW9uZV9yZWZfY2ZnID0gKGNhbnZhc19wb3MgJiAweDFmKSB8IChjZmcgPDwgNSk7CisJCXJlZl9yZWdfdmFsIDw8PSA4OworCQlyZWZfcmVnX3ZhbCB8PSBvbmVfcmVmX2NmZzsKKwkJaisrOworCisJCWlmIChqID09IDQpIHsKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RFQ19ERVRBSUwsCisJCQkJIkgyNjRfQlVGRkVSX0lORk9fREFUQTogJXhcbiIsCisJCQkJcmVmX3JlZ192YWwpOworCQkJV1JJVEVfVlJFRyhIMjY0X0JVRkZFUl9JTkZPX0RBVEEsIHJlZl9yZWdfdmFsKTsKKwkJCWogPSAwOworCQl9CisJCXByaW50X3BpY19pbmZvKERFQ09ERV9JRChodyksICJsaXN0MSIsCisJCQlwU2xpY2UtPmxpc3RYWzFdW2ldLCAtMSk7CisJfQorCWlmIChqICE9IDApIHsKKwkJd2hpbGUgKGogIT0gNCkgeworCQkJcmVmX3JlZ192YWwgPDw9IDg7CisJCQlyZWZfcmVnX3ZhbCB8PSBvbmVfcmVmX2NmZzsKKwkJCWorKzsKKwkJfQorCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19ERUNfREVUQUlMLAorCQkiSDI2NF9CVUZGRVJfSU5GT19EQVRBOiAleFxuIiwgcmVmX3JlZ192YWwpOworCQlXUklURV9WUkVHKEgyNjRfQlVGRkVSX0lORk9fREFUQSwgcmVmX3JlZ192YWwpOworCX0KKworCS8qIGNvbmZpZ3VyZSBjby1sb2NhdGUgYnVmZmVyICovCisJd2hpbGUgKChSRUFEX1ZSRUcoSDI2NF9DT19NQl9SV19DVEwpID4+IDExKSAmIDB4MSkKKwkJOworCWlmICgocFNsaWNlLT5tb2RlXzh4OF9mbGFncyAmIDB4NCkgJiYKKwkJKHBTbGljZS0+bW9kZV84eDhfZmxhZ3MgJiAweDIpKQorCQl1c2VfZGlyZWN0Xzh4OCA9IDE7CisJZWxzZQorCQl1c2VfZGlyZWN0Xzh4OCA9IDA7CisKKyNpZm5kZWYgT05FX0NPTE9DQVRFX0JVRl9QRVJfREVDT0RFX0JVRgorCWNvbG9jYXRlX2Fkcl9vZmZzZXQgPQorCQkoKHBpYy0+c3RydWN0dXJlID09IEZSQU1FICYmIHBpYy0+bWJfYWZmX2ZyYW1lX2ZsYWcgPT0gMCkKKwkJID8gMSA6IDIpICogOTY7CisJaWYgKHVzZV9kaXJlY3RfOHg4KQorCQljb2xvY2F0ZV9hZHJfb2Zmc2V0ID4+PSAyOworCisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCwKKwkJImNvbG9jYXRlIGJ1ZiBzaXplIG9mIGVhY2ggbWIgMHgleCBmaXJzdF9tYl9pbl9zbGljZSAweCV4IGNvbG9jYXRlX2Fkcl9vZmZzZXQgMHgleFxyXG4iLAorCQljb2xvY2F0ZV9hZHJfb2Zmc2V0LCBwU2xpY2UtPmZpcnN0X21iX2luX3NsaWNlLAorCQljb2xvY2F0ZV9hZHJfb2Zmc2V0ICogcFNsaWNlLT5maXJzdF9tYl9pbl9zbGljZSk7CisKKwljb2xvY2F0ZV9hZHJfb2Zmc2V0ICo9IHBTbGljZS0+Zmlyc3RfbWJfaW5fc2xpY2U7CisKKwlpZiAoKHBpYy0+Y29sb2NhdGVkX2J1Zl9pbmRleCA+PSAwKSAmJgorCQkocGljLT5jb2xvY2F0ZWRfYnVmX2luZGV4IDwgcF9IMjY0X0RwYi0+Y29sb2NhdGVkX2J1Zl9jb3VudCkpIHsKKwkJY29sb2NhdGVfd3JfYWRyID0gcF9IMjY0X0RwYi0+Y29sb2NhdGVkX212X2FkZHJfc3RhcnQgKworCQkJKChwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX3NpemUgKgorCQkJcGljLT5jb2xvY2F0ZWRfYnVmX2luZGV4KQorCQkJPj4gKHVzZV9kaXJlY3RfOHg4ID8gMiA6IDApKTsKKwkJaWYgKChjb2xvY2F0ZV93cl9hZHIgKyBwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX3NpemUpID4KKwkJCXBfSDI2NF9EcGItPmNvbG9jYXRlZF9tdl9hZGRyX2VuZCkgeworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRVJST1IsCisJCQkJIkVycm9yLCBjb2xvY2F0ZSBidWYgaXMgbm90IGVub3VnaCwgaW5kZXggaXMgJWRcbiIsCisJCQlwaWMtPmNvbG9jYXRlZF9idWZfaW5kZXgpOworCQkJcmV0ID0gLTM7CisJCX0KKwkJdmFsID0gY29sb2NhdGVfd3JfYWRyICsgY29sb2NhdGVfYWRyX29mZnNldDsKKwkJV1JJVEVfVlJFRyhIMjY0X0NPX01CX1dSX0FERFIsIHZhbCk7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RFQ19ERVRBSUwsCisJCQkiV1JJVEVfVlJFRyhIMjY0X0NPX01CX1dSX0FERFIpID0gJXgsIGZpcnN0X21iX2luX3NsaWNlICV4IHBpY19zdHJ1Y3R1cmUgJXggIGNvbG9jYXRlX2Fkcl9vZmZzZXQgJXggbW9kZV84eDhfZmxhZ3MgJXggY29sb2NhdGVkX2J1Zl9zaXplICV4XG4iLAorCQkJdmFsLCBwU2xpY2UtPmZpcnN0X21iX2luX3NsaWNlLCBwaWMtPnN0cnVjdHVyZSwKKwkJCWNvbG9jYXRlX2Fkcl9vZmZzZXQsIHBTbGljZS0+bW9kZV84eDhfZmxhZ3MsCisJCQlwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX3NpemUpOworCX0gZWxzZSB7CisJCVdSSVRFX1ZSRUcoSDI2NF9DT19NQl9XUl9BRERSLCAweGZmZmZmZmZmKTsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCwKKwkJCSJXUklURV9WUkVHKEgyNjRfQ09fTUJfV1JfQUREUikgPSAweGZmZmZmZmZmXG4iKTsKKwl9CisjZWxzZQorCWNvbG9jYXRlX2J1Zl9pbmRleCA9IGh3LT5idWZmZXJfc3BlY1twaWMtPmJ1Zl9zcGVjX251bV0uY2FudmFzX3BvczsKKwljb2xvY2F0ZV9hZHJfb2Zmc2V0ID0KKwkoKHBpYy0+c3RydWN0dXJlID09IEZSQU1FICYmIHBpYy0+bWJfYWZmX2ZyYW1lX2ZsYWcgPT0gMCkgPyAxIDogMikgKiA5NjsKKwlpZiAodXNlX2RpcmVjdF84eDgpCisJCWNvbG9jYXRlX2Fkcl9vZmZzZXQgPj49IDI7CisKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19ERUNfREVUQUlMLAorCQkiY29sb2NhdGUgYnVmIHNpemUgb2YgZWFjaCBtYiAweCV4IGZpcnN0X21iX2luX3NsaWNlIDB4JXggY29sb2NhdGVfYWRyX29mZnNldCAweCV4XHJcbiIsCisJCWNvbG9jYXRlX2Fkcl9vZmZzZXQsIHBTbGljZS0+Zmlyc3RfbWJfaW5fc2xpY2UsCisJCWNvbG9jYXRlX2Fkcl9vZmZzZXQgKiBwU2xpY2UtPmZpcnN0X21iX2luX3NsaWNlKTsKKworCWNvbG9jYXRlX2Fkcl9vZmZzZXQgKj0gcFNsaWNlLT5maXJzdF9tYl9pbl9zbGljZTsKKworCWNvbG9jYXRlX3dyX2FkciA9IHBfSDI2NF9EcGItPmNvbG9jYXRlZF9tdl9hZGRyX3N0YXJ0ICsKKwkJKChwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX3NpemUgKiBjb2xvY2F0ZV9idWZfaW5kZXgpID4+CisJCQkodXNlX2RpcmVjdF84eDggPyAyIDogMCkpOworCisJaWYgKChjb2xvY2F0ZV93cl9hZHIgKyBwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX3NpemUpID4KKwkJcF9IMjY0X0RwYi0+Y29sb2NhdGVkX212X2FkZHJfZW5kKSB7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0VSUk9SLAorCQkiRXJyb3IsIGNvbG9jYXRlIGJ1ZiBpcyBub3QgZW5vdWdoLCBjb2wgYnVmIGluZGV4IGlzICVkXG4iLAorCQkJCWNvbG9jYXRlX2J1Zl9pbmRleCk7CisJCXJldCA9IC00OworCX0KKwl2YWwgPSBjb2xvY2F0ZV93cl9hZHIgKyBjb2xvY2F0ZV9hZHJfb2Zmc2V0OworCVdSSVRFX1ZSRUcoSDI2NF9DT19NQl9XUl9BRERSLCB2YWwpOworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RFQ19ERVRBSUwsCisJCSJXUklURV9WUkVHKEgyNjRfQ09fTUJfV1JfQUREUikgPSAleCwgZmlyc3RfbWJfaW5fc2xpY2UgJXggcGljX3N0cnVjdHVyZSAleCBjb2xvY2F0ZV9hZHJfb2Zmc2V0ICV4IG1vZGVfOHg4X2ZsYWdzICV4IGNvbG9jYXRlZF9idWZfc2l6ZSAleFxuIiwKKwkJdmFsLCBwU2xpY2UtPmZpcnN0X21iX2luX3NsaWNlLCBwaWMtPnN0cnVjdHVyZSwKKwkJY29sb2NhdGVfYWRyX29mZnNldCwgcFNsaWNlLT5tb2RlXzh4OF9mbGFncywKKwkJcF9IMjY0X0RwYi0+Y29sb2NhdGVkX2J1Zl9zaXplKTsKKyNlbmRpZgorCWlmIChwU2xpY2UtPmxpc3RYc2l6ZVsxXSA+IDApIHsKKwkJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqY29sb2NhdGVfcGljID0gcFNsaWNlLT5saXN0WFsxXVswXTsKKwkJLyogSDI2NF9DT19NQl9SRF9BRERSW2JpdCAzMTozMF0sCisJCSAqIG9yaWdpbmFsIHBpY3R1cmUgc3RydWN0dXJlIG9mIEwxWzBdLAorCQkgKiAwMCAtIHRvcCBmaWVsZCwgMDEgLSBib3R0b20gZmllbGQsCisJCSAqIDEwIC0gZnJhbWUsIDExIC0gbWJhZmYgZnJhbWUKKwkJICovCisJCWludCBsMTBfc3RydWN0dXJlLCBjdXJfc3RydWN0dXJlOworCQlpbnQgY3VyX2NvbG9jYXRlX3JlZl90eXBlOworCQkvKiBIMjY0X0NPX01CX1JEX0FERFJbYml0IDI5XSwgdG9wL2JvdCBmb3IgQiBmaWVsZCBwY2l0dXJlLAorCQkgKiAwIC0gdG9wLCAxIC0gYm90CisJCSAqLworCQl1bnNpZ25lZCBpbnQgdmFsOworCQl1bnNpZ25lZCBpbnQgY29sb2NhdGVfcmRfYWRyX29mZnNldDsKKwkJdW5zaWduZWQgaW50IG1ieV9tYng7CisJCXVuc2lnbmVkIGludCBtYnksIG1ieDsKKyNpZmRlZiBFUlJPUl9DSEVDSworCQlpZiAoY29sb2NhdGVfcGljID09IE5VTEwpIHsKKwkJCWh3LT5kYXRhX2ZsYWcgfD0gRVJST1JfRkxBRzsKKwkJCXBpYy0+ZGF0YV9mbGFnIHw9IEVSUk9SX0ZMQUc7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19FUlJPUkZMQUdfREJHLCAiIGNvbG9jYXRlIGVycm9yIHBpYyBOVUxMXG4iKTsKKwkJCXJldHVybiAtNTsKKwkJfQorCQlpZiAoY29sb2NhdGVfcGljLT5kYXRhX2ZsYWcgJiBFUlJPUl9GTEFHKSB7CisJCQlwaWMtPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOworCQkJaHctPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRVJST1JGTEFHX0RCRywgIiBjb2xvY2FyZSByZWYgZXJyb3IgbWFya1xuIik7CisJCQl9CisJCWlmIChjb2xvY2F0ZV9waWMtPmRhdGFfZmxhZyAmIE5VTExfRkxBRykKKwkJCWh3LT5kYXRhX2ZsYWcgfD0gTlVMTF9GTEFHOworI2VuZGlmCisKKwkJaWYgKGNvbG9jYXRlX3BpYy0+bWJfYWZmX2ZyYW1lX2ZsYWcpCisJCQlsMTBfc3RydWN0dXJlID0gMzsKKwkJZWxzZSB7CisJCQlpZiAoY29sb2NhdGVfcGljLT5jb2RlZF9mcmFtZSkKKwkJCQlsMTBfc3RydWN0dXJlID0gMjsKKwkJCWVsc2UKKwkJCQlsMTBfc3RydWN0dXJlID0JKGNvbG9jYXRlX3BpYy0+c3RydWN0dXJlID09CisJCQkJCUJPVFRPTV9GSUVMRCkgPwkxIDogMDsKKwkJfQorCisJCS8vQUxMRUdST19GSVgsIHBvcnRlZCBmcm9tIHNpbmdsZSBtb2RlIHVjb2RlCisJCW1ieV9tYnggPSBSRUFEX1ZSRUcoTUJZX01CWCk7CisJCW1ieSA9IHBTbGljZS0+Zmlyc3RfbWJfaW5fc2xpY2UgLyBody0+bWJfd2lkdGg7CisJCW1ieCA9IHBTbGljZS0+Zmlyc3RfbWJfaW5fc2xpY2UgJSBody0+bWJfd2lkdGg7CisJCWlmIChwaWMtPm1iX2FmZl9mcmFtZV9mbGFnKQorCQkJY3VyX3N0cnVjdHVyZSA9IDM7CisJCWVsc2UgeworCQkJaWYgKHBpYy0+Y29kZWRfZnJhbWUpCisJCQkJY3VyX3N0cnVjdHVyZSA9IDI7CisJCQllbHNlCisJCQkJY3VyX3N0cnVjdHVyZSA9IChwaWMtPnN0cnVjdHVyZSA9PQorCQkJCQlCT1RUT01fRklFTEQpID8gMSA6IDA7CisJCX0KKwkJaWYgKGN1cl9zdHJ1Y3R1cmUgPCAyKSB7CisJCQkvL2N1cnJlbnRfZmllbGRfc3RydWN0dXJlCisJCQlpZiAobDEwX3N0cnVjdHVyZSAhPSAyKSB7CisJCQkJY29sb2NhdGVfcmRfYWRyX29mZnNldCA9IHBTbGljZS0+Zmlyc3RfbWJfaW5fc2xpY2UgKiAyOworCQkJfSBlbHNlIHsKKwkJCQkvLyBmaWVsZF9yZWZfZnJvbV9mcmFtZSBjb19tdl9yZF9hZGRyIDoKKwkJCQkvLyBtYnkqMiptYl93aWR0aCArIG1ieAorCQkJCWNvbG9jYXRlX3JkX2Fkcl9vZmZzZXQgPSBtYnkgKiAyICogaHctPm1iX3dpZHRoICsgbWJ4OworCQkJfQorCisJCX0gZWxzZSB7CisJCQkvL2N1cnJlbnRfZnJhbWVfc3RydWN0dXJlCisJCQlpZiAobDEwX3N0cnVjdHVyZSA8IDIpIHsKKwkJCQkvL2NhbGN1bGF0ZV9jb19tdl9vZmZzZXRfZnJhbWVfcmVmX2ZpZWxkOgorCQkJCS8vIGZyYW1lX3JlZl9mcm9tX2ZpZWxkIGNvX212X3JkX2FkZHIgOgorCQkJCS8vIChtYnkvMiptYl93aWR0aCttYngpKjIKKwkJCQljb2xvY2F0ZV9yZF9hZHJfb2Zmc2V0ID0gKChtYnkgLyAyKSAqIGh3LT5tYl93aWR0aCArIG1ieCkgKiAyOworCQkJfSBlbHNlIGlmIChjdXJfc3RydWN0dXJlID09IDIpIHsKKwkJCQljb2xvY2F0ZV9yZF9hZHJfb2Zmc2V0ID0gcFNsaWNlLT5maXJzdF9tYl9pbl9zbGljZTsKKwkJCX0gZWxzZSB7CisJCQkJLy9tYmFmZiBmcmFtZSBjYXNlMTE5NgorCQkJCWNvbG9jYXRlX3JkX2Fkcl9vZmZzZXQgPSBwU2xpY2UtPmZpcnN0X21iX2luX3NsaWNlICogMjsKKwkJCX0KKworCQl9CisKKwkJY29sb2NhdGVfcmRfYWRyX29mZnNldCAqPSA5NjsKKwkJaWYgKHVzZV9kaXJlY3RfOHg4KQorCQkJY29sb2NhdGVfcmRfYWRyX29mZnNldCA+Pj0gMjsKKworCQlpZiAoY29sb2NhdGVfb2xkX2NhbCkKKwkJCWNvbG9jYXRlX3JkX2Fkcl9vZmZzZXQgPSBjb2xvY2F0ZV9hZHJfb2Zmc2V0OworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19ERUNfREVUQUlMLAorCQkJImZpcnN0X21iX2luX3NsaWNlIDB4JXggMHgleCAweCV4IChNQllfTUJYIHJlZyAweCV4KSB1c2VfZGlyZWN0Xzh4OCAlZCBjdXIgJWQgKG1iX2FmZl9mcmFtZV9mbGFnICVkLCBjb2RlZF9mcmFtZSAlZCBzdHJ1Y3R1cmUgJWQpIGNvbCAlZCAobWJfYWZmX2ZyYW1lX2ZsYWcgJWQsIGNvZGVkX2ZyYW1lICVkIHN0cnVjdHVyZSAlZCkgb2Zmc2V0IDB4JXggcmRvZmZzZXQgMHgleFxuIiwKKwkJCQlwU2xpY2UtPmZpcnN0X21iX2luX3NsaWNlLCBtYnksIG1ieCwgbWJ5X21ieCwgdXNlX2RpcmVjdF84eDgsCisJCQkJY3VyX3N0cnVjdHVyZSwgcGljLT5tYl9hZmZfZnJhbWVfZmxhZywgcGljLT5jb2RlZF9mcmFtZSwgcGljLT5zdHJ1Y3R1cmUsCisJCQkJbDEwX3N0cnVjdHVyZSwgY29sb2NhdGVfcGljLT5tYl9hZmZfZnJhbWVfZmxhZywgY29sb2NhdGVfcGljLT5jb2RlZF9mcmFtZSwgY29sb2NhdGVfcGljLT5zdHJ1Y3R1cmUsCisJCQkJY29sb2NhdGVfYWRyX29mZnNldCwKKwkJCQljb2xvY2F0ZV9yZF9hZHJfb2Zmc2V0KTsKKworI2lmIDAKKwkJLypjYXNlMDAxNiwgcDE2LAorCQkgKmN1cl9jb2xvY2F0ZV9yZWZfdHlwZSBzaG91bGQgYmUgY29uZmlndXJlZCBiYXNlIG9uIGN1cnJlbnQgcGljCisJCSAqLworCQlpZiAocGljLT5zdHJ1Y3R1cmUgPT0gRlJBTUUgJiYKKwkJCXBpYy0+bWJfYWZmX2ZyYW1lX2ZsYWcpCisJCQljdXJfY29sb2NhdGVfcmVmX3R5cGUgPSAwOworCQllbHNlIGlmIChwaWMtPnN0cnVjdHVyZSA9PSBCT1RUT01fRklFTEQpCisJCQljdXJfY29sb2NhdGVfcmVmX3R5cGUgPSAxOworCQllbHNlCisJCQljdXJfY29sb2NhdGVfcmVmX3R5cGUgPSAwOworI2Vsc2UKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCwKKwkJCSIgQ1VSIFRNUCBERUJVRyA6IG1iX2FmZl9mcmFtZV9mbGFnIDogJWQsIHN0cnVjdHVyZSA6ICVkIGNvZGVkX2ZyYW1lICVkXG4iLAorCQkJcGljLT5tYl9hZmZfZnJhbWVfZmxhZywKKwkJCXBpYy0+c3RydWN0dXJlLAorCQkJcGljLT5jb2RlZF9mcmFtZSk7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RFQ19ERVRBSUwsCisJCQkiIENPTCBUTVAgREVCVUcgOiBtYl9hZmZfZnJhbWVfZmxhZyA6ICVkLCBzdHJ1Y3R1cmUgOiAlZCBjb2RlZF9mcmFtZSAlZFxuIiwKKwkJCWNvbG9jYXRlX3BpYy0+bWJfYWZmX2ZyYW1lX2ZsYWcsCisJCQkJY29sb2NhdGVfcGljLT5zdHJ1Y3R1cmUsCisJCQkJY29sb2NhdGVfcGljLT5jb2RlZF9mcmFtZSk7CisJCWlmIChwaWMtPnN0cnVjdHVyZSA9PSBGUkFNRSAgfHwgcGljLT5tYl9hZmZfZnJhbWVfZmxhZykgeworCQkJY3VyX2NvbG9jYXRlX3JlZl90eXBlID0KKwkJCQkoYWJzKHBpYy0+cG9jIC0gY29sb2NhdGVfcGljLT50b3BfcG9jKQorCQkJCTwgYWJzKHBpYy0+cG9jIC0KKwkJCQljb2xvY2F0ZV9waWMtPmJvdHRvbV9wb2MpKSA/IDAgOiAxOworCQl9IGVsc2UKKwkJCWN1cl9jb2xvY2F0ZV9yZWZfdHlwZSA9CisJCQkJKGNvbG9jYXRlX3BpYy0+c3RydWN0dXJlCisJCQkJCT09IEJPVFRPTV9GSUVMRCkgPyAxIDogMDsKKyNlbmRpZgorCisjaWZuZGVmIE9ORV9DT0xPQ0FURV9CVUZfUEVSX0RFQ09ERV9CVUYKKwkJaWYgKChjb2xvY2F0ZV9waWMtPmNvbG9jYXRlZF9idWZfaW5kZXggPj0gMCkgJiYKKwkJCShjb2xvY2F0ZV9waWMtPmNvbG9jYXRlZF9idWZfaW5kZXggPAorCQkJCXBfSDI2NF9EcGItPmNvbG9jYXRlZF9idWZfY291bnQpKSB7CisJCQljb2xvY2F0ZV9yZF9hZHIgPSBwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfbXZfYWRkcl9zdGFydCArCisJCQkJKChwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX3NpemUgKgorCQkJCWNvbG9jYXRlX3BpYy0+Y29sb2NhdGVkX2J1Zl9pbmRleCkKKwkJCQk+PiAodXNlX2RpcmVjdF84eDggPyAyIDogMCkpOworCQkJaWYgKChjb2xvY2F0ZV9yZF9hZHIgKyBwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX3NpemUpID4KKwkJCQlwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfbXZfYWRkcl9lbmQpIHsKKwkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCQkJUFJJTlRfRkxBR19FUlJPUiwKKwkJCQkiRXJyb3IsIGNvbG9jYXRlIGJ1ZiBpcyBub3QgZW5vdWdoLCBpbmRleCBpcyAlZFxuIiwKKwkJCQkJY29sb2NhdGVfcGljLT5jb2xvY2F0ZWRfYnVmX2luZGV4KTsKKwkJCQlyZXQgPSAtNjsKKwkJCX0KKwkJCS8qIGJpdCAzMTozMCAtLSBMMVswXSBwaWN0dXJlIGNvZGluZyBzdHJ1Y3R1cmUsCisJCQkgKiAwMCAtIHRvcCBmaWVsZCwgMDEgLSBib3R0b20gZmllbGQsCisJCQkgKiAxMCAtIGZyYW1lLCAxMSAtIG1iYWZmIGZyYW1lCisJCQkgKiBiaXQgMjkgLSBMMVswXSB0b3AvYm90IGZvciBCIGZpZWxkIHBjaXR1cmUsCisJCQkgKiAwIC0gdG9wLCAxIC0gYm90CisJCQkgKiBiaXQgMjg6MCBoMjY0X2NvX21iX21lbV9yZF9hZGRyWzMxOjNdCisJCQkgKiAtLSBvbmx5IHVzZWQgZm9yIEIgUGljdHVyZSBEaXJlY3QgbW9kZQorCQkJICogWzI6MF0gd2lsbCBzZXQgdG8gMydiMDAwCisJCQkgKi8KKwkJCS8qICNkZWZpbmUgSDI2NF9DT19NQl9SRF9BRERSICAgICAgICBWTERfQzM5IDB4YzM5ICovCisJCQl2YWwgPSAoKGNvbG9jYXRlX3JkX2Fkcitjb2xvY2F0ZV9yZF9hZHJfb2Zmc2V0KSA+PiAzKSB8CisJCQkJKGwxMF9zdHJ1Y3R1cmUgPDwgMzApIHwKKwkJCQkoY3VyX2NvbG9jYXRlX3JlZl90eXBlIDw8IDI5KTsKKwkJCVdSSVRFX1ZSRUcoSDI2NF9DT19NQl9SRF9BRERSLCB2YWwpOworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCwKKwkJCQkiY28gaWR4ICVkLCBXUklURV9WUkVHKEgyNjRfQ09fTUJfUkRfQUREUikgPSAleCwgYWRkciAleCBMMSgwKSBwaWNfc3RydWN0dXJlICVkIG1iYWZmICVkXG4iLAorCQkJCWNvbG9jYXRlX3BpYy0+Y29sb2NhdGVkX2J1Zl9pbmRleCwKKwkJCQl2YWwsIGNvbG9jYXRlX3JkX2FkciArIGNvbG9jYXRlX3JkX2Fkcl9vZmZzZXQsCisJCQkJY29sb2NhdGVfcGljLT5zdHJ1Y3R1cmUsCisJCQkJY29sb2NhdGVfcGljLT5tYl9hZmZfZnJhbWVfZmxhZyk7CisJCX0gZWxzZSB7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19FUlJPUiwKKwkJCSJFcnJvciwgcmVmZXJlbmNlIHBpYyBoYXMgbm8gY29sb2NhdGVkIGJ1ZlxuIik7CisJCQlyZXQgPSAtNzsKKwkJfQorI2Vsc2UKKwkJY29sb2NhdGVfYnVmX2luZGV4ID0KKwkJCWh3LT5idWZmZXJfc3BlY1tjb2xvY2F0ZV9waWMtPmJ1Zl9zcGVjX251bV0uY2FudmFzX3BvczsKKwkJY29sb2NhdGVfcmRfYWRyID0gcF9IMjY0X0RwYi0+Y29sb2NhdGVkX212X2FkZHJfc3RhcnQgKworCQkJKChwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX3NpemUgKgorCQkJCWNvbG9jYXRlX2J1Zl9pbmRleCkKKwkJCQk+PiAodXNlX2RpcmVjdF84eDggPyAyIDogMCkpOworCQlpZiAoKGNvbG9jYXRlX3JkX2FkciArIHBfSDI2NF9EcGItPmNvbG9jYXRlZF9idWZfc2l6ZSkgPgorCQkJcF9IMjY0X0RwYi0+Y29sb2NhdGVkX212X2FkZHJfZW5kKSB7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19FUlJPUiwKKwkJCQkiRXJyb3IsIGNvbG9jYXRlIGJ1ZiBpcyBub3QgZW5vdWdoLCBjb2wgYnVmIGluZGV4IGlzICVkXG4iLAorCQkJCWNvbG9jYXRlX2J1Zl9pbmRleCk7CisJCQlyZXQgPSAtODsKKwkJfQorCQkvKiBiaXQgMzE6MzAgLS0gTDFbMF0gcGljdHVyZSBjb2Rpbmcgc3RydWN0dXJlLAorCQkgKiAwMCAtIHRvcCBmaWVsZCwgMDEgLSBib3R0b20gZmllbGQsCisJCSAqIDEwIC0gZnJhbWUsIDExIC0gbWJhZmYgZnJhbWUKKwkJICogYml0IDI5IC0gTDFbMF0gdG9wL2JvdCBmb3IgQiBmaWVsZCBwY2l0dXJlLAorCQkgKiAwIC0gdG9wLCAxIC0gYm90CisJCSAqIGJpdCAyODowIGgyNjRfY29fbWJfbWVtX3JkX2FkZHJbMzE6M10KKwkJICogLS0gb25seSB1c2VkIGZvciBCIFBpY3R1cmUgRGlyZWN0IG1vZGUKKwkJICogWzI6MF0gd2lsbCBzZXQgdG8gMydiMDAwCisJCSAqLworCQkvKiAjZGVmaW5lIEgyNjRfQ09fTUJfUkRfQUREUiAgICAgICAgVkxEX0MzOSAweGMzOSAqLworCQl2YWwgPSAoKGNvbG9jYXRlX3JkX2Fkcitjb2xvY2F0ZV9yZF9hZHJfb2Zmc2V0KT4+MykgfAorCQkJKGwxMF9zdHJ1Y3R1cmUgPDwgMzApIHwgKGN1cl9jb2xvY2F0ZV9yZWZfdHlwZSA8PCAyOSk7CisJCVdSSVRFX1ZSRUcoSDI2NF9DT19NQl9SRF9BRERSLCB2YWwpOworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19ERUNfREVUQUlMLAorCQkJIldSSVRFX1ZSRUcoSDI2NF9DT19NQl9SRF9BRERSKSA9ICV4LCBMMSgwKSBwaWNfc3RydWN0dXJlICVkIG1iYWZmICVkXG4iLAorCQkJdmFsLCBjb2xvY2F0ZV9waWMtPnN0cnVjdHVyZSwKKwkJCWNvbG9jYXRlX3BpYy0+bWJfYWZmX2ZyYW1lX2ZsYWcpOworI2VuZGlmCisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmgyNjRfdmZfc3RhdGVzKHN0cnVjdCB2ZnJhbWVfc3RhdGVzICpzdGF0ZXMsIHZvaWQgKm9wX2FyZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBvcF9hcmc7CisJc3RydWN0IHZkZWNfaDI2NF9od19zICpodyA9IChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKil2ZGVjLT5wcml2YXRlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5sb2NrLCBmbGFncyk7CisKKwlzdGF0ZXMtPnZmX3Bvb2xfc2l6ZSA9IFZGX1BPT0xfU0laRTsKKwlzdGF0ZXMtPmJ1Zl9mcmVlX251bSA9IGtmaWZvX2xlbigmaHctPm5ld2ZyYW1lX3EpOworCXN0YXRlcy0+YnVmX2F2YWlsX251bSA9IGtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZoMjY0X3ZmX3BlZWsodm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCB2ZnJhbWVfcyAqdmZbMl0gPSB7MCwgMH07CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IG9wX2FyZzsKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisKKwlpZiAoIWh3KQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChmb3JjZV9kaXNwX2J1ZnNwZWNfbnVtICYgMHgxMDApIHsKKwkJaWYgKGZvcmNlX2Rpc3BfYnVmc3BlY19udW0gJiAweDIwMCkKKwkJCXJldHVybiBOVUxMOworCQlyZXR1cm4gJmh3LT52ZnJhbWVfZHVtbXk7CisJfQorCisJaWYgKGtmaWZvX291dF9wZWVrKCZody0+ZGlzcGxheV9xLCAodm9pZCAqKSZ2ZiwgMikpIHsKKwkJaWYgKHZmWzFdKSB7CisJCQl2ZlswXS0+bmV4dF92Zl9wdHNfdmFsaWQgPSB0cnVlOworCQkJdmZbMF0tPm5leHRfdmZfcHRzID0gdmZbMV0tPnB0czsKKwkJfSBlbHNlCisJCQl2ZlswXS0+bmV4dF92Zl9wdHNfdmFsaWQgPSBmYWxzZTsKKwkJcmV0dXJuIHZmWzBdOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2aDI2NF92Zl9nZXQodm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCB2ZnJhbWVfcyAqdmY7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IG9wX2FyZzsKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICogdjRsMl9jdHggPSBody0+djRsMl9jdHg7CisJdWxvbmcgbnZfb3JkZXIgPSBWSURUWVBFX1ZJVV9OVjIxOworCisJaWYgKCFodykKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBzd2FwIHV2ICovCisJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQlpZiAoKHY0bDJfY3R4LT5jYXBfcGl4X2ZtdCA9PSBWNEwyX1BJWF9GTVRfTlYxMikgfHwKKwkJCSh2NGwyX2N0eC0+Y2FwX3BpeF9mbXQgPT0gVjRMMl9QSVhfRk1UX05WMTJNKSkKKwkJCW52X29yZGVyID0gVklEVFlQRV9WSVVfTlYxMjsKKwl9CisKKwlpZiAoZm9yY2VfZGlzcF9idWZzcGVjX251bSAmIDB4MTAwKSB7CisJCWludCBidWZmZXJfaW5kZXggPSBmb3JjZV9kaXNwX2J1ZnNwZWNfbnVtICYgMHhmZjsKKwkJaWYgKGZvcmNlX2Rpc3BfYnVmc3BlY19udW0gJiAweDIwMCkKKwkJCXJldHVybiBOVUxMOworCisJCXZmID0gJmh3LT52ZnJhbWVfZHVtbXk7CisJCXZmLT5kdXJhdGlvbl9wdWxsZG93biA9IDA7CisJCXZmLT5wdHMgPSAwOworCQl2Zi0+cHRzX3VzNjQgPSAwOworCQlzZXRfZnJhbWVfaW5mbyhodywgdmYsIGJ1ZmZlcl9pbmRleCk7CisJCXZmLT5mbGFnID0gMDsKKwkJaWYgKGh3LT5tbXVfZW5hYmxlKSB7CisJCQlpZiAoaHctPmRvdWJsZV93cml0ZV9tb2RlICYgMHgxMCkgeworCQkJCS8qIGRvdWJsZSB3cml0ZSBvbmx5ICovCisJCQkJdmYtPmNvbXBCb2R5QWRkciA9IDA7CisJCQkJdmYtPmNvbXBIZWFkQWRkciA9IDA7CisJCQl9IGVsc2UgeworCQkJCS8qaGVhZCBhZHIqLworCQkJCXZmLT5jb21wSGVhZEFkZHIgPQorCQkJCWh3LT5idWZmZXJfc3BlY1tidWZmZXJfaW5kZXhdLmFsbG9jX2hlYWRlcl9hZGRyOworCQkJCS8qYm9keSBhZHIqLworCQkJCXZmLT5jb21wQm9keUFkZHIgPSAwOworCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IDA7CisJCQl9CisKKwkJCXZmLT50eXBlID0gVklEVFlQRV9TQ0FUVEVSOworCisJCQlpZiAoaHctPmRvdWJsZV93cml0ZV9tb2RlKSB7CisJCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9QUk9HUkVTU0lWRQorCQkJCQl8IFZJRFRZUEVfVklVX0ZJRUxEOworCQkJCXZmLT50eXBlIHw9IG52X29yZGVyOworCQkJCWlmIChody0+ZG91YmxlX3dyaXRlX21vZGUgPT0gMykKKwkJCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9DT01QUkVTUzsKKworCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IC0xOworCQkJCXZmLT5wbGFuZV9udW0gPSAyOworCQkJCXZmLT5jYW52YXMwX2NvbmZpZ1swXSA9CisJCQkJCWh3LT5idWZmZXJfc3BlY1tidWZmZXJfaW5kZXhdLgorCQkJCQkJY2FudmFzX2NvbmZpZ1swXTsKKwkJCQl2Zi0+Y2FudmFzMF9jb25maWdbMV0gPQorCQkJCQlody0+YnVmZmVyX3NwZWNbYnVmZmVyX2luZGV4XS4KKwkJCQkJCWNhbnZhc19jb25maWdbMV07CisKKwkJCQl2Zi0+Y2FudmFzMV9jb25maWdbMF0gPQorCQkJCQlody0+YnVmZmVyX3NwZWNbYnVmZmVyX2luZGV4XS4KKwkJCQkJCWNhbnZhc19jb25maWdbMF07CisJCQkJdmYtPmNhbnZhczFfY29uZmlnWzFdID0KKwkJCQkJaHctPmJ1ZmZlcl9zcGVjW2J1ZmZlcl9pbmRleF0uCisJCQkJCQljYW52YXNfY29uZmlnWzFdOworCQkJfSBlbHNlIHsKKwkJCQl2Zi0+dHlwZSB8PQorCQkJCQlWSURUWVBFX0NPTVBSRVNTIHwgVklEVFlQRV9WSVVfRklFTEQ7CisJCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0gMDsKKwkJCX0KKwkJCXZmLT5iaXRkZXB0aCA9CisJCQkJQklUREVQVEhfWTggfCBCSVRERVBUSF9VOCB8IEJJVERFUFRIX1Y4OworCisJCQl2Zi0+Y29tcFdpZHRoID0gaHctPmZyYW1lX3dpZHRoOworCQkJdmYtPmNvbXBIZWlnaHQgPSBody0+ZnJhbWVfaGVpZ2h0OworCisJCQlpZiAoaHctPmRvdWJsZV93cml0ZV9tb2RlKSB7CisJCQkJdmYtPndpZHRoID0gaHctPmZyYW1lX3dpZHRoIC8KKwkJCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhody0+ZG91YmxlX3dyaXRlX21vZGUpOworCQkJCXZmLT5oZWlnaHQgPSBody0+ZnJhbWVfaGVpZ2h0IC8KKwkJCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhody0+ZG91YmxlX3dyaXRlX21vZGUpOworCQkJfQorCQl9IGVsc2UgeworCQkJdmYtPnR5cGUgPSBWSURUWVBFX1BST0dSRVNTSVZFIHwgVklEVFlQRV9WSVVfRklFTEQgfAorCQkJCW52X29yZGVyOworCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0KKwkJCXNwZWMyY2FudmFzKCZody0+YnVmZmVyX3NwZWNbYnVmZmVyX2luZGV4XSk7CisJCX0KKworCQkvKnZmLT5tZW1faGFuZGxlID0gZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCWh3LT5ibW11X2JveCwgYnVmZmVyX2luZGV4KTsqLworCQl1cGRhdGVfdmZfbWVtaGFuZGxlKGh3LCB2ZiwgYnVmZmVyX2luZGV4KTsKKwkJZm9yY2VfZGlzcF9idWZzcGVjX251bSB8PSAweDIwMDsKKwkJcmV0dXJuIHZmOworCX0KKworCWlmIChrZmlmb19nZXQoJmh3LT5kaXNwbGF5X3EsICZ2ZikpIHsKKwkJaW50IHRpbWUgPSBqaWZmaWVzOworCQl1bnNpZ25lZCBpbnQgZnJhbWVfaW50ZXJ2YWwgPQorCQkJMTAwMCoodGltZSAtIGh3LT5sYXN0X2ZyYW1lX3RpbWUpL0haOworCQlzdHJ1Y3QgdmZyYW1lX3MgKm5leHRfdmYgPSBOVUxMOworCQlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGlzcF9xX25hbWUsIGtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSkpOworCQlpZiAoZHBiX2lzX2RlYnVnKERFQ09ERV9JRChodyksCisJCQlQUklOVF9GTEFHX1ZERUNfREVUQUlMKSkgeworCQkJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSAmaHctPmRwYjsKKwkJCWludCBmcmFtZV9pbmRleCA9IEZSQU1FX0lOREVYKHZmLT5pbmRleCk7CisJCQlpZiAoZnJhbWVfaW5kZXggPCAwIHx8CisJCQkJCWZyYW1lX2luZGV4ID49IERQQl9TSVpFX01BWCkgeworCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJCQkJIiVzIHZmIGluZGV4IDB4JXggZXJyb3JcclxuIiwKKwkJCQkJCV9fZnVuY19fLCB2Zi0+aW5kZXgpOworCQkJfSBlbHNlIHsKKwkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WREVDX0RFVEFJTCwKKwkJCQkiJXMgYnVmX3NwZWNfbnVtICVkIHZmICVwIHBvYyAlZCBkdXIgJWQgcHRzICVkIGludGVydmFsICVkbXMsIHRzOiAlbGxkXG4iLAorCQkJCV9fZnVuY19fLCBCVUZTUEVDX0lOREVYKHZmLT5pbmRleCksIHZmLAorCQkJCXBfSDI2NF9EcGItPm1GcmFtZVN0b3JlW2ZyYW1lX2luZGV4XS5wb2MsCisJCQkJdmYtPmR1cmF0aW9uLCB2Zi0+cHRzLCBmcmFtZV9pbnRlcnZhbCwgdmYtPnRpbWVzdGFtcCk7CisJCQl9CisJCX0KKwkJaWYgKGh3LT5sYXN0X2ZyYW1lX3RpbWUgPiAwKSB7CisJCQlpZiAoZnJhbWVfaW50ZXJ2YWwgPgorCQkJCW1heF9nZXRfZnJhbWVfaW50ZXJ2YWxbREVDT0RFX0lEKGh3KV0pCisJCQkJbWF4X2dldF9mcmFtZV9pbnRlcnZhbFtERUNPREVfSUQoaHcpXQorCQkJCT0gZnJhbWVfaW50ZXJ2YWw7CisJCX0KKwkJaHctPmxhc3RfZnJhbWVfdGltZSA9IHRpbWU7CisJCXZmLT5pbmRleF9kaXNwID0gYXRvbWljX3JlYWQoJmh3LT52Zl9nZXRfY291bnQpOworCQlhdG9taWNfYWRkKDEsICZody0+dmZfZ2V0X2NvdW50KTsKKwkJaWYgKGtmaWZvX3BlZWsoJmh3LT5kaXNwbGF5X3EsICZuZXh0X3ZmKSAmJiBuZXh0X3ZmKSB7CisJCQl2Zi0+bmV4dF92Zl9wdHNfdmFsaWQgPSB0cnVlOworCQkJdmYtPm5leHRfdmZfcHRzID0gbmV4dF92Zi0+cHRzOworCQl9IGVsc2UKKwkJCXZmLT5uZXh0X3ZmX3B0c192YWxpZCA9IGZhbHNlOworCisJCXJldHVybiB2ZjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGJvb2wgdmZfdmFsaWRfY2hlY2soc3RydWN0IHZmcmFtZV9zICp2Ziwgc3RydWN0IHZkZWNfaDI2NF9od19zICpodykgeworCWludCBpLGo7CisJaWYgKGh3LT5pc191c2VkX3Y0bCkKKwkJcmV0dXJuIHRydWU7CisJZm9yIChpID0gMDsgaSA8IFZGX1BPT0xfU0laRTsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBWRl9QT09MX05VTTsgaiArKykgeworCQkJaWYgKHZmID09ICYoaHctPnZmcG9vbFtqXVtpXSkgfHwgdmYgPT0gJmh3LT52ZnJhbWVfZHVtbXkpCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsICIgaW52YWxpZCB2ZiBiZWVuIHB1dCwgdmYgPSAlcFxuIiwgdmYpOworCWZvciAoaSA9IDA7IGkgPCBWRl9QT09MX1NJWkU7IGkrKykgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJImR1bXAgdmYgWyVkXT0gJXBcbiIsICBpLCAmKGh3LT52ZnBvb2xbaHctPmN1cl9wb29sXVtpXSkpOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIHZoMjY0X3ZmX3B1dChzdHJ1Y3QgdmZyYW1lX3MgKnZmLCB2b2lkICpvcF9hcmcpCit7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IG9wX2FyZzsKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgYnVmX3NwZWNfbnVtOworCWludCBmcmFtZV9pbmRleDsKKworCWlmICh2ZiA9PSAoJmh3LT52ZnJhbWVfZHVtbXkpKQorCQlyZXR1cm47CisKKwlpZiAoIXZmKQorCQlyZXR1cm47CisKKwlpZiAodmYtPmluZGV4ID09IC0xKSB7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJIldhcm5pbmc6ICVzIHZmICVwIGludmFsaWQgaW5kZXhcclxuIiwKKwkJCV9fZnVuY19fLCB2Zik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaHctPmVuYWJsZV9mZW5jZSAmJiB2Zi0+ZmVuY2UpIHsKKwkJaW50IHJldCwgaTsKKworCQltdXRleF9sb2NrKCZody0+ZmVuY2VfbXV0ZXgpOworCQlyZXQgPSBkbWFfZmVuY2VfZ2V0X3N0YXR1cyh2Zi0+ZmVuY2UpOworCQlpZiAocmV0ID09IDApIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBWRl9QT09MX1NJWkU7IGkrKykgeworCQkJCWlmIChody0+ZmVuY2VfdmZfcy5mZW5jZV92ZltpXSA9PSBOVUxMKSB7CisJCQkJCWh3LT5mZW5jZV92Zl9zLmZlbmNlX3ZmW2ldID0gdmY7CisJCQkJCWh3LT5mZW5jZV92Zl9zLnVzZWRfc2l6ZSsrOworCQkJCQltdXRleF91bmxvY2soJmh3LT5mZW5jZV9tdXRleCk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZody0+ZmVuY2VfbXV0ZXgpOworCX0KKworCWJ1Zl9zcGVjX251bSA9IEJVRlNQRUNfSU5ERVgodmYtPmluZGV4KTsKKwlpZiAoaHctPmVuYWJsZV9mZW5jZSkKKwkJZnJhbWVfaW5kZXggPSBody0+YnVmZmVyX3NwZWNbYnVmX3NwZWNfbnVtXS5mc19pZHg7CisJZWxzZQorCQlmcmFtZV9pbmRleCA9IEZSQU1FX0lOREVYKHZmLT5pbmRleCk7CisKKwlpZiAoZnJhbWVfaW5kZXggPCAwIHx8CisJCWZyYW1lX2luZGV4ID49IERQQl9TSVpFX01BWCB8fAorCQlidWZfc3BlY19udW0gPCAwIHx8CisJCWJ1Zl9zcGVjX251bSA+PSBCVUZTUEVDX1BPT0xfU0laRSkgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSIlcyB2ZiBpbmRleCAweCV4IGVycm9yXHJcbiIsCisJCQlfX2Z1bmNfXywgdmYtPmluZGV4KTsKKwkJcmV0dXJuOworCX0KKwkJLypnZXRfYnVmX3NwZWNfaWR4X2J5X2NhbnZhc19jb25maWcoaHcsCisJCQkmdmYtPmNhbnZhczBfY29uZmlnWzBdKTsqLworCisJaWYgKGh3LT5lbmFibGVfZmVuY2UgJiYgdmYtPmZlbmNlKSB7CisJCXZkZWNfZmVuY2VfcHV0KHZmLT5mZW5jZSk7CisJCXZmLT5mZW5jZSA9IE5VTEw7CisJfQorCisJaWYgKHZmLT5tZXRhX2RhdGFfYnVmKSB7CisJCXZmLT5tZXRhX2RhdGFfYnVmID0gTlVMTDsKKwkJdmYtPm1ldGFfZGF0YV9zaXplID0gMDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmJ1ZnNwZWNfbG9jaywgZmxhZ3MpOworCWlmIChody0+YnVmZmVyX3NwZWNbYnVmX3NwZWNfbnVtXS51c2VkID09IDIpIHsKKwkJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSAmaHctPmRwYjsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCSIlcyAlcCB0byBmc1slZF0sIHBvYyAlZCBidWZfc3BlY19udW0gJWQgdXNlZCAlZCB2Zl9yZWYgJWRcbiIsCisJCV9fZnVuY19fLCB2ZiwgZnJhbWVfaW5kZXgsCisJCXBfSDI2NF9EcGItPm1GcmFtZVN0b3JlW2ZyYW1lX2luZGV4XS5wb2MsCisJCWJ1Zl9zcGVjX251bSwKKwkJaHctPmJ1ZmZlcl9zcGVjW2J1Zl9zcGVjX251bV0udXNlZCwKKwkJaHctPmJ1ZmZlcl9zcGVjW2J1Zl9zcGVjX251bV0udmZfcmVmKTsKKwkJaHctPmJ1ZmZlcl9zcGVjW2J1Zl9zcGVjX251bV0udmZfcmVmLS07CisJCWlmIChody0+YnVmZmVyX3NwZWNbYnVmX3NwZWNfbnVtXS52Zl9yZWYgPD0gMCkKKwkJCXNldF9mcmFtZV9vdXRwdXRfZmxhZygmaHctPmRwYiwgZnJhbWVfaW5kZXgpOworCX0gZWxzZSB7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkiJXMgJXAgaXNvbGF0ZWQgdmYsIGJ1Zl9zcGVjX251bSAlZCB1c2VkICVkIHZmX3JlZiAlZFxuIiwKKwkJX19mdW5jX18sIHZmLCBidWZfc3BlY19udW0sCisJCWh3LT5idWZmZXJfc3BlY1tidWZfc3BlY19udW1dLnVzZWQsCisJCWh3LT5idWZmZXJfc3BlY1tidWZfc3BlY19udW1dLnZmX3JlZik7CisJCWh3LT5idWZmZXJfc3BlY1tidWZfc3BlY19udW1dLnZmX3JlZi0tOworCQlpZiAoaHctPmJ1ZmZlcl9zcGVjW2J1Zl9zcGVjX251bV0udmZfcmVmIDw9IDApIHsKKwkJCWlmIChody0+YnVmZmVyX3NwZWNbYnVmX3NwZWNfbnVtXS51c2VkID09IDMpCisJCQkJaHctPmJ1ZmZlcl9zcGVjW2J1Zl9zcGVjX251bV0udXNlZCA9IDQ7CisJCQllbHNlIGlmIChody0+YnVmZmVyX3NwZWNbYnVmX3NwZWNfbnVtXS51c2VkID09IDUpCisJCQkJaHctPmJ1ZmZlcl9zcGVjW2J1Zl9zcGVjX251bV0udXNlZCA9IDA7CisJCX0KKwkJaWYgKGRwYl9pc19kZWJ1ZyhERUNPREVfSUQoaHcpLAorCQkJUFJJTlRfRkxBR19EVU1QX0JVRlNQRUMpKQorCQkJZHVtcF9idWZzcGVjKGh3LCBfX2Z1bmNfXyk7CisKKwl9CisKKwlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCXN0cnVjdCBidWZmZXJfc3BlY19zICpwaWMgPSAmaHctPmJ1ZmZlcl9zcGVjW2J1Zl9zcGVjX251bV07CisKKwkJaWYgKHZmLT52NGxfbWVtX2hhbmRsZSAhPSBwaWMtPmNtYV9hbGxvY19hZGRyKSB7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WNExfREVUQUlMLAorCQkJCSJIMjY0IHVwZGF0ZSBmYiBoYW5kbGUsIG9sZDolbGx4LCBuZXc6JWxseFxuIiwKKwkJCQlwaWMtPmNtYV9hbGxvY19hZGRyLCB2Zi0+djRsX21lbV9oYW5kbGUpOworCisJCQkJcGljLT5jbWFfYWxsb2NfYWRkciA9IHZmLT52NGxfbWVtX2hhbmRsZTsKKwkJfQorCX0KKworCWlmICh2ZiAmJiAodmZfdmFsaWRfY2hlY2sodmYsIGh3KSA9PSB0cnVlKSkgeworCQlhdG9taWNfYWRkKDEsICZody0+dmZfcHV0X2NvdW50KTsKKwkJa2ZpZm9fcHV0KCZody0+bmV3ZnJhbWVfcSwgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwkJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLm5ld19xX25hbWUsIGtmaWZvX2xlbigmaHctPm5ld2ZyYW1lX3EpKTsKKwl9CisjZGVmaW5lIEFTU0lTVF9NQk9YMV9JUlFfUkVHICAgIFZERUNfQVNTSVNUX01CT1gxX0lSUV9SRUcKKwlpZiAoaHctPmJ1ZmZlcl9lbXB0eV9mbGFnKQorCQlXUklURV9WUkVHKEFTU0lTVF9NQk9YMV9JUlFfUkVHLCAweDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5idWZzcGVjX2xvY2ssIGZsYWdzKTsKK30KKworCit2b2lkICogdmgyNjRfZ2V0X2J1ZnNwZWNfbG9jayhzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcgPSAoc3RydWN0IHZkZWNfaDI2NF9od19zICopdmRlYy0+cHJpdmF0ZTsKKwlpZiAoaHcpCisJCXJldHVybiAoJmh3LT5idWZzcGVjX2xvY2spOworCWVsc2UKKwkJcmV0dXJuIE5VTEw7Cit9CitzdGF0aWMgaW50IHZoMjY0X2V2ZW50X2NiKGludCB0eXBlLCB2b2lkICpkYXRhLCB2b2lkICpvcF9hcmcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gb3BfYXJnOworCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcgPSAoc3RydWN0IHZkZWNfaDI2NF9od19zICopdmRlYy0+cHJpdmF0ZTsKKworCWlmICh0eXBlICYgVkZSQU1FX0VWRU5UX1JFQ0VJVkVSX0dFVF9BVVhfREFUQSkgeworCQlzdHJ1Y3QgcHJvdmlkZXJfYXV4X3JlcV9zICpyZXEgPQorCQkJKHN0cnVjdCBwcm92aWRlcl9hdXhfcmVxX3MgKilkYXRhOworCQlpbnQgYnVmX3NwZWNfbnVtOworCisJCWlmICghcmVxLT52ZikgeworCQkJcmVxLT5hdXhfc2l6ZSA9IGF0b21pY19yZWFkKCZody0+dmZfcHV0X2NvdW50KTsKKwkJCXJldHVybiAwOworCQl9CisJCWJ1Zl9zcGVjX251bSA9IEJVRlNQRUNfSU5ERVgocmVxLT52Zi0+aW5kZXgpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmxvY2ssIGZsYWdzKTsKKwkJcmVxLT5hdXhfYnVmID0gTlVMTDsKKwkJcmVxLT5hdXhfc2l6ZSA9IDA7CisJCWlmIChidWZfc3BlY19udW0gPj0gMCAmJgorCQkJYnVmX3NwZWNfbnVtIDwgQlVGU1BFQ19QT09MX1NJWkUgJiYKKwkJCWlzX2J1Zl9zcGVjX2luX2Rpc3BfcShodywgYnVmX3NwZWNfbnVtKQorCQkJKSB7CisJCQlyZXEtPmF1eF9idWYgPQorCQkJCWh3LT5idWZmZXJfc3BlY1tidWZfc3BlY19udW1dLmF1eF9kYXRhX2J1ZjsKKwkJCXJlcS0+YXV4X3NpemUgPQorCQkJCWh3LT5idWZmZXJfc3BlY1tidWZfc3BlY19udW1dLmF1eF9kYXRhX3NpemU7CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwkJCXJlcS0+ZHZfZW5oYW5jZV9leGlzdCA9CisJCQkJaHctPmJ1ZmZlcl9zcGVjW2J1Zl9zcGVjX251bV0uZHZfZW5oYW5jZV9leGlzdDsKKyNlbHNlCisJCQlyZXEtPmR2X2VuaGFuY2VfZXhpc3QgPSAwOworI2VuZGlmCisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmxvY2ssIGZsYWdzKTsKKworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJIiVzKHR5cGUgMHgleCB2ZiBidWZfc3BlY19udW0gMHgleCk9PnNpemUgMHgleFxuIiwKKwkJX19mdW5jX18sIHR5cGUsIGJ1Zl9zcGVjX251bSwgcmVxLT5hdXhfc2l6ZSk7CisJfSBlbHNlIGlmICh0eXBlICYgVkZSQU1FX0VWRU5UX1JFQ0VJVkVSX1JFUV9TVEFURSkgeworCQlzdHJ1Y3QgcHJvdmlkZXJfc3RhdGVfcmVxX3MgKnJlcSA9CisJCQkoc3RydWN0IHByb3ZpZGVyX3N0YXRlX3JlcV9zICopZGF0YTsKKwkJaWYgKHJlcS0+cmVxX3R5cGUgPT0gUkVRX1NUQVRFX1NFQ1VSRSkKKwkJCXJlcS0+cmVxX3Jlc3VsdFswXSA9IHZkZWNfc2VjdXJlKHZkZWMpOworCQllbHNlCisJCQlyZXEtPnJlcV9yZXN1bHRbMF0gPSAweGZmZmZmZmZmOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZXRfZnJhbWVfaW5mbyhzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LCBzdHJ1Y3QgdmZyYW1lX3MgKnZmLAorCQkJCXUzMiBpbmRleCkKK3sKKwlpbnQgZW5kaWFuX3RtcDsKKwlzdHJ1Y3QgY2FudmFzX2NvbmZpZ19zICpwX2NhbnZhc19jb25maWc7CisJaW50IGZvcmNlX3JhdGUgPSBpbnB1dF9mcmFtZV9iYXNlZChod190b192ZGVjKGh3KSkgPworCQlmb3JjZV9yYXRlX2ZyYW1lYmFzZSA6IGZvcmNlX3JhdGVfc3RyZWFtYmFzZTsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkiJXMgKCVkLCVkKSBkdXIgJWQsIHZmICVwLCBpbmRleCAlZFxuIiwgX19mdW5jX18sCisJCWh3LT5mcmFtZV93aWR0aCwgaHctPmZyYW1lX2hlaWdodCwgaHctPmZyYW1lX2R1ciwgdmYsIGluZGV4KTsKKworCS8qIHNpZ25hbF90eXBlICovCisJaWYgKGh3LT52aWRlb19zaWduYWxfZnJvbV92dWkgJiBWSURFT19TSUdOQUxfVFlQRV9BVkFJTEFCTEVfTUFTSykgeworCQl2Zi0+c2lnbmFsX3R5cGUgPSBody0+dmlkZW9fc2lnbmFsX2Zyb21fdnVpOworCQlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCQlzdHJ1Y3QgYW1sX3ZkZWNfaGRyX2luZm9zIGhkcjsKKwkJCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisKKwkJCW1lbXNldCgmaGRyLCAwLCBzaXplb2YoaGRyKSk7CisJCQloZHIuc2lnbmFsX3R5cGUgPSBody0+dmlkZW9fc2lnbmFsX2Zyb21fdnVpOworCQkJdmRlY192NGxfc2V0X2hkcl9pbmZvcyhjdHgsICZoZHIpOworCQl9CisJfSBlbHNlCisJCXZmLT5zaWduYWxfdHlwZSA9IDA7CisJaHctPnZpZGVvX3NpZ25hbF90eXBlID0gdmYtPnNpZ25hbF90eXBlOworCisJdmYtPndpZHRoID0gaHctPmZyYW1lX3dpZHRoOworCXZmLT5oZWlnaHQgPSBody0+ZnJhbWVfaGVpZ2h0OworCWlmIChmb3JjZV9yYXRlKSB7CisJCWlmIChmb3JjZV9yYXRlID09IC0xKQorCQkJdmYtPmR1cmF0aW9uID0gMDsKKwkJZWxzZQorCQkJdmYtPmR1cmF0aW9uID0gOTYwMDAvZm9yY2VfcmF0ZTsKKwl9IGVsc2UKKwkJdmYtPmR1cmF0aW9uID0gaHctPmZyYW1lX2R1cjsKKwl2Zi0+cmF0aW9fY29udHJvbCA9CisJCShtaW4oaHctPmgyNjRfYXIsICh1MzIpIERJU1BfUkFUSU9fQVNQRUNUX1JBVElPX01BWCkpIDw8CisJCURJU1BfUkFUSU9fQVNQRUNUX1JBVElPX0JJVDsKKwl2Zi0+b3JpZW50YXRpb24gPSBody0+dmgyNjRfcm90YXRpb247CisKKwl2Zi0+c2lkZWJpbmRfdHlwZSA9IGh3LT5zaWRlYmluZF90eXBlOworCXZmLT5zaWRlYmluZF9jaGFubmVsX2lkID0gaHctPnNpZGViaW5kX2NoYW5uZWxfaWQ7CisKKwlpZiAoaHctPm1tdV9lbmFibGUpCisJCXJldHVybjsKKworCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IC0xOworI2lmZGVmIE5WMjEKKwl2Zi0+cGxhbmVfbnVtID0gMjsKKyNlbHNlCisJdmYtPnBsYW5lX251bSA9IDM7CisjZW5kaWYKKworCWlmIChJU19WREVDX0RXKGh3KSkgeworCQlpZiAoSVNfVkRFQ19EVyhodykgPT0gMSkKKwkJCXZmLT53aWR0aCA9IGh3LT5mcmFtZV93aWR0aCAvIDI7CisJCWVsc2UKKwkJCXZmLT53aWR0aCA9IChody0+ZnJhbWVfd2lkdGggLyBJU19WREVDX0RXKGh3KSk7CisJCXZmLT5oZWlnaHQgPSAoaHctPmZyYW1lX2hlaWdodCAvIElTX1ZERUNfRFcoaHcpKTsKKwkJcF9jYW52YXNfY29uZmlnID0gJmh3LT5idWZmZXJfc3BlY1tpbmRleF0udmRlY19kd19jYW52YXNfY29uZmlnWzBdOworCX0gZWxzZQorCQlwX2NhbnZhc19jb25maWcgPSAmaHctPmJ1ZmZlcl9zcGVjW2luZGV4XS5jYW52YXNfY29uZmlnWzBdOworCisJdmYtPmNhbnZhczBfY29uZmlnWzBdID0gcF9jYW52YXNfY29uZmlnWzBdOworCXZmLT5jYW52YXMwX2NvbmZpZ1sxXSA9IHBfY2FudmFzX2NvbmZpZ1sxXTsKKwl2Zi0+Y2FudmFzMV9jb25maWdbMF0gPSBwX2NhbnZhc19jb25maWdbMF07CisJdmYtPmNhbnZhczFfY29uZmlnWzFdID0gcF9jYW52YXNfY29uZmlnWzFdOworI2lmbmRlZiBOVjIxCisJdmYtPmNhbnZhczBfY29uZmlnWzJdID0gcF9jYW52YXNfY29uZmlnWzJdOworCXZmLT5jYW52YXMxX2NvbmZpZ1syXSA9IHBfY2FudmFzX2NvbmZpZ1syXTsKKyNlbmRpZgorCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3KSB7CisJCWVuZGlhbl90bXAgPSAoaHctPmNhbnZhc19tb2RlID09IENBTlZBU19CTEtNT0RFX0xJTkVBUikgPyA3IDogMDsKKwl9IGVsc2UgeworCQllbmRpYW5fdG1wID0gKGh3LT5jYW52YXNfbW9kZSA9PSBDQU5WQVNfQkxLTU9ERV9MSU5FQVIpID8gMCA6IDc7CisJfQorCXZmLT5jYW52YXMwX2NvbmZpZ1swXS5lbmRpYW4gPSBlbmRpYW5fdG1wOworCXZmLT5jYW52YXMwX2NvbmZpZ1sxXS5lbmRpYW4gPSBlbmRpYW5fdG1wOworCXZmLT5jYW52YXMxX2NvbmZpZ1swXS5lbmRpYW4gPSBlbmRpYW5fdG1wOworCXZmLT5jYW52YXMxX2NvbmZpZ1sxXS5lbmRpYW4gPSBlbmRpYW5fdG1wOworI2lmbmRlZiBOVjIxCisJdmYtPmNhbnZhczBfY29uZmlnWzJdLmVuZGlhbiA9IGVuZGlhbl90bXA7CisJdmYtPmNhbnZhczFfY29uZmlnWzJdLmVuZGlhbiA9IGVuZGlhbl90bXA7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgZ2V0X3BpY3R1cmVfcW9zX2luZm8oc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqcGljdHVyZSkKK3sKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpIHsKKwkJdW5zaWduZWQgY2hhciBhWzNdOworCQl1bnNpZ25lZCBjaGFyIGksIGosIHQ7CisJCXVuc2lnbmVkIGxvbmcgIGRhdGE7CisKKwkJZ2V0X3JhbmRvbV9ieXRlcygmZGF0YSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwkJaWYgKHBpY3R1cmUtPnNsaWNlX3R5cGUgPT0gSV9TTElDRSkKKwkJCWRhdGEgPSAwOworCQlhWzBdID0gZGF0YSAmIDB4ZmY7CisJCWFbMV0gPSAoZGF0YSA+PiA4KSAmIDB4ZmY7CisJCWFbMl0gPSAoZGF0YSA+PiAxNikgJiAweGZmOworCisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCQlmb3IgKGogPSBpKzE7IGogPCAzOyBqKyspIHsKKwkJCQlpZiAoYVtqXSA8IGFbaV0pIHsKKwkJCQkJdCA9IGFbal07CisJCQkJCWFbal0gPSBhW2ldOworCQkJCQlhW2ldID0gdDsKKwkJCQl9IGVsc2UgaWYgKGFbal0gPT0gYVtpXSkgeworCQkJCQlhW2ldKys7CisJCQkJCXQgPSBhW2pdOworCQkJCQlhW2pdID0gYVtpXTsKKwkJCQkJYVtpXSA9IHQ7CisJCQkJfQorCQkJfQorCQlwaWN0dXJlLT5tYXhfbXYgPSBhWzJdOworCQlwaWN0dXJlLT5hdmdfbXYgPSBhWzFdOworCQlwaWN0dXJlLT5taW5fbXYgPSBhWzBdOworCQkvKgorCQlwcl9pbmZvKCJtdiBkYXRhICV4ICBhWzBdPSAleCBhWzFdPSAleCBhWzJdPSAleFxuIiwKKwkJCWRhdGEsIGFbMF0sIGFbMV0sIGFbMl0pOworCQkqLworCisJCWdldF9yYW5kb21fYnl0ZXMoJmRhdGEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJCWFbMF0gPSBkYXRhICYgMHgxZjsKKwkJYVsxXSA9IChkYXRhID4+IDgpICYgMHgzZjsKKwkJYVsyXSA9IChkYXRhID4+IDE2KSAmIDB4N2Y7CisKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCWZvciAoaiA9IGkrMTsgaiA8IDM7IGorKykgeworCQkJCWlmIChhW2pdIDwgYVtpXSkgeworCQkJCQl0ID0gYVtqXTsKKwkJCQkJYVtqXSA9IGFbaV07CisJCQkJCWFbaV0gPSB0OworCQkJCX0gZWxzZSBpZiAoYVtqXSA9PSBhW2ldKSB7CisJCQkJCWFbaV0rKzsKKwkJCQkJdCA9IGFbal07CisJCQkJCWFbal0gPSBhW2ldOworCQkJCQlhW2ldID0gdDsKKwkJCQl9CisJCQl9CisJCXBpY3R1cmUtPm1heF9xcCA9IGFbMl07CisJCXBpY3R1cmUtPmF2Z19xcCA9IGFbMV07CisJCXBpY3R1cmUtPm1pbl9xcCA9IGFbMF07CisJCS8qCisJCXByX2luZm8oInFwIGRhdGEgJXggIGFbMF09ICV4IGFbMV09ICV4IGFbMl09ICV4XG4iLAorCQkJZGF0YSwgYVswXSwgYVsxXSwgYVsyXSk7CisJCSovCisKKwkJZ2V0X3JhbmRvbV9ieXRlcygmZGF0YSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwkJYVswXSA9IGRhdGEgJiAweDFmOworCQlhWzFdID0gKGRhdGEgPj4gOCkgJiAweDNmOworCQlhWzJdID0gKGRhdGEgPj4gMTYpICYgMHg3ZjsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJZm9yIChqID0gaSsxOyBqIDwgMzsgaisrKSB7CisJCQkJaWYgKGFbal0gPCBhW2ldKSB7CisJCQkJCXQgPSBhW2pdOworCQkJCQlhW2pdID0gYVtpXTsKKwkJCQkJYVtpXSA9IHQ7CisJCQkJfSBlbHNlIGlmIChhW2pdID09IGFbaV0pIHsKKwkJCQkJYVtpXSsrOworCQkJCQl0ID0gYVtqXTsKKwkJCQkJYVtqXSA9IGFbaV07CisJCQkJCWFbaV0gPSB0OworCQkJCX0KKwkJCX0KKwkJcGljdHVyZS0+bWF4X3NraXAgPSBhWzJdOworCQlwaWN0dXJlLT5hdmdfc2tpcCA9IGFbMV07CisJCXBpY3R1cmUtPm1pbl9za2lwID0gYVswXTsKKworCisJCS8qCisJCXByX2luZm8oInNraXAgZGF0YSAleCAgYVswXT0gJXggYVsxXT0gJXggYVsyXT0gJXhcbiIsCisJCQlkYXRhLGFbMF0sIGFbMV0sIGFbMl0pOworCQkqLworCX0gZWxzZSB7CisJCXVpbnQzMl90IGJsazg4X3lfY291bnQ7CisJCXVpbnQzMl90IGJsazg4X2NfY291bnQ7CisJCXVpbnQzMl90IGJsazIyX212X2NvdW50OworCQl1aW50MzJfdCByZGF0YTMyOworCQlpbnQzMl90IG12X2hpOworCQlpbnQzMl90IG12X2xvOworCQl1aW50MzJfdCByZGF0YTMyX2w7CisJCXVpbnQzMl90IG12eF9MMF9oaTsKKwkJdWludDMyX3QgbXZ5X0wwX2hpOworCQl1aW50MzJfdCBtdnhfTDFfaGk7CisJCXVpbnQzMl90IG12eV9MMV9oaTsKKwkJaW50NjRfdCB2YWx1ZTsKKwkJdWludDY0X3QgdGVtcF92YWx1ZTsKKy8qCisjZGVmaW5lIERFQlVHX1FPUworKi8KKyNpZmRlZiBERUJVR19RT1MKKwkJaW50IHBpY19udW1iZXIgPSBwaWN0dXJlLT5wb2M7CisjZW5kaWYKKworCQlwaWN0dXJlLT5tYXhfbXYgPSAwOworCQlwaWN0dXJlLT5hdmdfbXYgPSAwOworCQlwaWN0dXJlLT5taW5fbXYgPSAwOworCisJCXBpY3R1cmUtPm1heF9za2lwID0gMDsKKwkJcGljdHVyZS0+YXZnX3NraXAgPSAwOworCQlwaWN0dXJlLT5taW5fc2tpcCA9IDA7CisKKwkJcGljdHVyZS0+bWF4X3FwID0gMDsKKwkJcGljdHVyZS0+YXZnX3FwID0gMDsKKwkJcGljdHVyZS0+bWluX3FwID0gMDsKKworCisKKworCisJCS8qIHNldCByZF9pZHggdG8gMCAqLworCSAgICBXUklURV9WUkVHKFZERUNfUElDX1FVQUxJVFlfQ1RSTCwgMCk7CisJICAgIGJsazg4X3lfY291bnQgPSBSRUFEX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkgICAgaWYgKGJsazg4X3lfY291bnQgPT0gMCkgeworI2lmZGVmIERFQlVHX1FPUworCQkJcHJfaW5mbygiIFtQaWN0dXJlICVkIFF1YWxpdHldIE5PIERhdGEgeWV0LlxuIiwKKwkJCQlwaWNfbnVtYmVyKTsKKyNlbmRpZgorCQkJLyogcmVzZXQgYWxsIGNvdW50cyAqLworCQkJV1JJVEVfVlJFRyhWREVDX1BJQ19RVUFMSVRZX0NUUkwsICgxPDw4KSk7CisJCQlyZXR1cm47CisJICAgIH0KKwkJLyogcXBfeV9zdW0gKi8KKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhWREVDX1BJQ19RVUFMSVRZX0RBVEEpOworI2lmZGVmIERFQlVHX1FPUworCSAgICBwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gWSBRUCBBVkcgOiAlZCAoJWQvJWQpXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMi9ibGs4OF95X2NvdW50LAorCQkJcmRhdGEzMiwgYmxrODhfeV9jb3VudCk7CisjZW5kaWYKKwkJcGljdHVyZS0+YXZnX3FwID0gcmRhdGEzMi9ibGs4OF95X2NvdW50OworCQkvKiBpbnRyYV95X2NvdW50ICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9EQVRBKTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgcHJfaW5mbygiIFtQaWN0dXJlICVkIFF1YWxpdHldIFkgaW50cmEgcmF0ZSA6ICVkJWMgKCVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzIqMTAwL2Jsazg4X3lfY291bnQsCisJCQknJScsIHJkYXRhMzIpOworI2VuZGlmCisJCS8qIHNraXBwZWRfeV9jb3VudCAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKFZERUNfUElDX1FVQUxJVFlfREFUQSk7CisjaWZkZWYgREVCVUdfUU9TCisJICAgIHByX2luZm8oIiBbUGljdHVyZSAlZCBRdWFsaXR5XSBZIHNraXBwZWQgcmF0ZSA6ICVkJWMgKCVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzIqMTAwL2Jsazg4X3lfY291bnQsCisJCQknJScsIHJkYXRhMzIpOworI2VuZGlmCisJCXBpY3R1cmUtPmF2Z19za2lwID0gcmRhdGEzMioxMDAvYmxrODhfeV9jb3VudDsKKwkJLyogY29lZmZfbm9uX3plcm9feV9jb3VudCAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKFZERUNfUElDX1FVQUxJVFlfREFUQSk7CisjaWZkZWYgREVCVUdfUU9TCisJICAgIHByX2luZm8oIiBbUGljdHVyZSAlZCBRdWFsaXR5XSBZIFpFUk9fQ29lZmYgcmF0ZSA6ICVkJWMgKCVkKVxuIiwKKwkJCXBpY19udW1iZXIsICgxMDAgLSByZGF0YTMyKjEwMC8oYmxrODhfeV9jb3VudCoxKSksCisJCQknJScsIHJkYXRhMzIpOworI2VuZGlmCisJCS8qIGJsazY2X2NfY291bnQgKi8KKwkgICAgYmxrODhfY19jb3VudCA9IFJFQURfVlJFRyhWREVDX1BJQ19RVUFMSVRZX0RBVEEpOworCSAgICBpZiAoYmxrODhfY19jb3VudCA9PSAwKSB7CisjaWZkZWYgREVCVUdfUU9TCisJCQlwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gTk8gRGF0YSB5ZXQuXG4iLAorCQkJCXBpY19udW1iZXIpOworI2VuZGlmCisJCQkvKiByZXNldCBhbGwgY291bnRzICovCisJCQlXUklURV9WUkVHKFZERUNfUElDX1FVQUxJVFlfQ1RSTCwgKDE8PDgpKTsKKwkJCXJldHVybjsKKwkgICAgfQorCQkvKiBxcF9jX3N1bSAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKFZERUNfUElDX1FVQUxJVFlfREFUQSk7CisjaWZkZWYgREVCVUdfUU9TCisJICAgIHByX2luZm8oIiBbUGljdHVyZSAlZCBRdWFsaXR5XSBDIFFQIEFWRyA6ICVkICglZC8lZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyL2Jsazg4X2NfY291bnQsCisJCQlyZGF0YTMyLCBibGs4OF9jX2NvdW50KTsKKyNlbmRpZgorCQkvKiBpbnRyYV9jX2NvdW50ICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9EQVRBKTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgcHJfaW5mbygiIFtQaWN0dXJlICVkIFF1YWxpdHldIEMgaW50cmEgcmF0ZSA6ICVkJWMgKCVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzIqMTAwL2Jsazg4X2NfY291bnQsCisJCQknJScsIHJkYXRhMzIpOworI2VuZGlmCisJCS8qIHNraXBwZWRfY3VfY19jb3VudCAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKFZERUNfUElDX1FVQUxJVFlfREFUQSk7CisjaWZkZWYgREVCVUdfUU9TCisJICAgIHByX2luZm8oIiBbUGljdHVyZSAlZCBRdWFsaXR5XSBDIHNraXBwZWQgcmF0ZSA6ICVkJWMgKCVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzIqMTAwL2Jsazg4X2NfY291bnQsCisJCQknJScsIHJkYXRhMzIpOworI2VuZGlmCisJCS8qIGNvZWZmX25vbl96ZXJvX2NfY291bnQgKi8KKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhWREVDX1BJQ19RVUFMSVRZX0RBVEEpOworI2lmZGVmIERFQlVHX1FPUworCSAgICBwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gQyBaRVJPX0NvZWZmIHJhdGUgOiAlZCVjICglZClcbiIsCisJCQlwaWNfbnVtYmVyLCAoMTAwIC0gcmRhdGEzMioxMDAvKGJsazg4X2NfY291bnQqMSkpLAorCQkJJyUnLCByZGF0YTMyKTsKKyNlbmRpZgorCisJCS8qIDEnaDAsIHFwX2NfbWF4WzY6MF0sIDEnaDAsIHFwX2NfbWluWzY6MF0sCisJCTEnaDAsIHFwX3lfbWF4WzY6MF0sIDEnaDAsIHFwX3lfbWluWzY6MF0gKi8KKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhWREVDX1BJQ19RVUFMSVRZX0RBVEEpOworI2lmZGVmIERFQlVHX1FPUworCSAgICBwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gWSBRUCBtaW4gOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIChyZGF0YTMyPj4wKSYweGZmKTsKKyNlbmRpZgorCQlwaWN0dXJlLT5taW5fcXAgPSAocmRhdGEzMj4+MCkmMHhmZjsKKworI2lmZGVmIERFQlVHX1FPUworCSAgICBwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gWSBRUCBtYXggOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIChyZGF0YTMyPj44KSYweGZmKTsKKyNlbmRpZgorCQlwaWN0dXJlLT5tYXhfcXAgPSAocmRhdGEzMj4+OCkmMHhmZjsKKworI2lmZGVmIERFQlVHX1FPUworCSAgICBwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gQyBRUCBtaW4gOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIChyZGF0YTMyPj4xNikmMHhmZik7CisJICAgIHByX2luZm8oIiBbUGljdHVyZSAlZCBRdWFsaXR5XSBDIFFQIG1heCA6ICVkXG4iLAorCQkJcGljX251bWJlciwgKHJkYXRhMzI+PjI0KSYweGZmKTsKKyNlbmRpZgorCisJCS8qIGJsazIyX212X2NvdW50ICovCisJICAgIGJsazIyX212X2NvdW50ID0gUkVBRF9WUkVHKFZERUNfUElDX1FVQUxJVFlfREFUQSk7CisJICAgIGlmIChibGsyMl9tdl9jb3VudCA9PSAwKSB7CisjaWZkZWYgREVCVUdfUU9TCisJCQlwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gTk8gTVYgRGF0YSB5ZXQuXG4iLAorCQkJCXBpY19udW1iZXIpOworI2VuZGlmCisJCQkvKiByZXNldCBhbGwgY291bnRzICovCisJCQlXUklURV9WUkVHKFZERUNfUElDX1FVQUxJVFlfQ1RSTCwgKDE8PDgpKTsKKwkJCXJldHVybjsKKwkgICAgfQorCQkvKiBtdnlfTDFfY291bnRbMzk6MzJdLCBtdnhfTDFfY291bnRbMzk6MzJdLAorCQltdnlfTDBfY291bnRbMzk6MzJdLCBtdnhfTDBfY291bnRbMzk6MzJdICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkgICAgLyogc2hvdWxkIGFsbCBiZSAweDAwIG9yIDB4ZmYgKi8KKyNpZmRlZiBERUJVR19RT1MKKwkgICAgcHJfaW5mbygiIFtQaWN0dXJlICVkIFF1YWxpdHldIE1WIEFWRyBIaWdoIEJpdHM6IDB4JVhcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyKTsKKyNlbmRpZgorCSAgICBtdnhfTDBfaGkgPSAoKHJkYXRhMzI+PjApJjB4ZmYpOworCSAgICBtdnlfTDBfaGkgPSAoKHJkYXRhMzI+PjgpJjB4ZmYpOworCSAgICBtdnhfTDFfaGkgPSAoKHJkYXRhMzI+PjE2KSYweGZmKTsKKwkgICAgbXZ5X0wxX2hpID0gKChyZGF0YTMyPj4yNCkmMHhmZik7CisKKwkJLyogbXZ4X0wwX2NvdW50WzMxOjBdICovCisJICAgIHJkYXRhMzJfbCA9IFJFQURfVlJFRyhWREVDX1BJQ19RVUFMSVRZX0RBVEEpOworCQl0ZW1wX3ZhbHVlID0gbXZ4X0wwX2hpOworCQl0ZW1wX3ZhbHVlID0gKHRlbXBfdmFsdWUgPDwgMzIpIHwgcmRhdGEzMl9sOworCisJCWlmIChtdnhfTDBfaGkgJiAweDgwKQorCQkJdmFsdWUgPSAweEZGRkZGRkYwMDAwMDAwMDAgfCB0ZW1wX3ZhbHVlOworCQllbHNlCisJCQl2YWx1ZSA9IHRlbXBfdmFsdWU7CisJCXZhbHVlID0gZGl2X3M2NCh2YWx1ZSwgYmxrMjJfbXZfY291bnQpOworI2lmZGVmIERFQlVHX1FPUworCQlwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZYX0wwIEFWRyA6ICVkICglbGxkLyVkKVxuIiwKKwkJCXBpY19udW1iZXIsIChpbnQpKHZhbHVlKSwKKwkJCXZhbHVlLCBibGsyMl9tdl9jb3VudCk7CisjZW5kaWYKKwkJcGljdHVyZS0+YXZnX212ID0gdmFsdWU7CisKKwkJLyogbXZ5X0wwX2NvdW50WzMxOjBdICovCisJICAgIHJkYXRhMzJfbCA9IFJFQURfVlJFRyhWREVDX1BJQ19RVUFMSVRZX0RBVEEpOworCQl0ZW1wX3ZhbHVlID0gbXZ5X0wwX2hpOworCQl0ZW1wX3ZhbHVlID0gKHRlbXBfdmFsdWUgPDwgMzIpIHwgcmRhdGEzMl9sOworCisJCWlmIChtdnlfTDBfaGkgJiAweDgwKQorCQkJdmFsdWUgPSAweEZGRkZGRkYwMDAwMDAwMDAgfCB0ZW1wX3ZhbHVlOworCQllbHNlCisJCQl2YWx1ZSA9IHRlbXBfdmFsdWU7CisjaWZkZWYgREVCVUdfUU9TCisJICAgIHByX2luZm8oIiBbUGljdHVyZSAlZCBRdWFsaXR5XSBNVllfTDAgQVZHIDogJWQgKCVsbGQvJWQpXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMl9sL2JsazIyX212X2NvdW50LAorCQkJdmFsdWUsIGJsazIyX212X2NvdW50KTsKKyNlbmRpZgorCisJCS8qIG12eF9MMV9jb3VudFszMTowXSAqLworCSAgICByZGF0YTMyX2wgPSBSRUFEX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkJdGVtcF92YWx1ZSA9IG12eF9MMV9oaTsKKwkJdGVtcF92YWx1ZSA9ICh0ZW1wX3ZhbHVlIDw8IDMyKSB8IHJkYXRhMzJfbDsKKwkJaWYgKG12eF9MMV9oaSAmIDB4ODApCisJCQl2YWx1ZSA9IDB4RkZGRkZGRjAwMDAwMDAwMCB8IHRlbXBfdmFsdWU7CisJCWVsc2UKKwkJCXZhbHVlID0gdGVtcF92YWx1ZTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgcHJfaW5mbygiIFtQaWN0dXJlICVkIFF1YWxpdHldIE1WWF9MMSBBVkcgOiAlZCAoJWxsZC8lZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyX2wvYmxrMjJfbXZfY291bnQsCisJCQl2YWx1ZSwgYmxrMjJfbXZfY291bnQpOworI2VuZGlmCisKKwkJLyogbXZ5X0wxX2NvdW50WzMxOjBdICovCisJICAgIHJkYXRhMzJfbCA9IFJFQURfVlJFRyhWREVDX1BJQ19RVUFMSVRZX0RBVEEpOworCQl0ZW1wX3ZhbHVlID0gbXZ5X0wxX2hpOworCQl0ZW1wX3ZhbHVlID0gKHRlbXBfdmFsdWUgPDwgMzIpIHwgcmRhdGEzMl9sOworCQlpZiAobXZ5X0wxX2hpICYgMHg4MCkKKwkJCXZhbHVlID0gMHhGRkZGRkZGMDAwMDAwMDAwIHwgdGVtcF92YWx1ZTsKKwkJZWxzZQorCQkJdmFsdWUgPSB0ZW1wX3ZhbHVlOworI2lmZGVmIERFQlVHX1FPUworCSAgICBwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZZX0wxIEFWRyA6ICVkICglbGxkLyVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzJfbC9ibGsyMl9tdl9jb3VudCwKKwkJCXZhbHVlLCBibGsyMl9tdl9jb3VudCk7CisjZW5kaWYKKworCQkvKiB7bXZ4X0wwX21heCwgbXZ4X0wwX21pbn0gLy8gZm9ybWF0IDoge3NpZ24sIGFic1sxNDowXX0gICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkgICAgbXZfaGkgPSAocmRhdGEzMj4+MTYpJjB4ZmZmZjsKKwkgICAgaWYgKG12X2hpICYgMHg4MDAwKQorCQkJbXZfaGkgPSAweDgwMDAgLSBtdl9oaTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgcHJfaW5mbygiIFtQaWN0dXJlICVkIFF1YWxpdHldIE1WWF9MMCBNQVggOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIG12X2hpKTsKKyNlbmRpZgorCQlwaWN0dXJlLT5tYXhfbXYgPSBtdl9oaTsKKworCSAgICBtdl9sbyA9IChyZGF0YTMyPj4wKSYweGZmZmY7CisJICAgIGlmIChtdl9sbyAmIDB4ODAwMCkKKwkJCW12X2xvID0gMHg4MDAwIC0gbXZfbG87CisjaWZkZWYgREVCVUdfUU9TCisJICAgIHByX2luZm8oIiBbUGljdHVyZSAlZCBRdWFsaXR5XSBNVlhfTDAgTUlOIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9sbyk7CisjZW5kaWYKKwkJcGljdHVyZS0+bWluX212ID0gbXZfbG87CisKKyNpZmRlZiBERUJVR19RT1MKKwkJLyoge212eV9MMF9tYXgsIG12eV9MMF9taW59ICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkgICAgbXZfaGkgPSAocmRhdGEzMj4+MTYpJjB4ZmZmZjsKKwkgICAgaWYgKG12X2hpICYgMHg4MDAwKQorCQkJbXZfaGkgPSAweDgwMDAgLSBtdl9oaTsKKwkgICAgcHJfaW5mbygiIFtQaWN0dXJlICVkIFF1YWxpdHldIE1WWV9MMCBNQVggOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIG12X2hpKTsKKworCisJICAgIG12X2xvID0gKHJkYXRhMzI+PjApJjB4ZmZmZjsKKwkgICAgaWYgKG12X2xvICYgMHg4MDAwKQorCQkJbXZfbG8gPSAweDgwMDAgLSBtdl9sbzsKKworCSAgICBwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZZX0wwIE1JTiA6ICVkXG4iLAorCQkJcGljX251bWJlciwgbXZfbG8pOworCisKKwkJLyoge212eF9MMV9tYXgsIG12eF9MMV9taW59ICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoVkRFQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkgICAgbXZfaGkgPSAocmRhdGEzMj4+MTYpJjB4ZmZmZjsKKwkgICAgaWYgKG12X2hpICYgMHg4MDAwKQorCQkJbXZfaGkgPSAweDgwMDAgLSBtdl9oaTsKKworCSAgICBwcl9pbmZvKCIgW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZYX0wxIE1BWCA6ICVkXG4iLAorCQkJcGljX251bWJlciwgbXZfaGkpOworCisKKwkgICAgbXZfbG8gPSAocmRhdGEzMj4+MCkmMHhmZmZmOworCSAgICBpZiAobXZfbG8gJiAweDgwMDApCisJCQltdl9sbyA9IDB4ODAwMCAtIG12X2xvOworCisJICAgIHByX2luZm8oIiBbUGljdHVyZSAlZCBRdWFsaXR5XSBNVlhfTDEgTUlOIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9sbyk7CisKKworCQkvKiB7bXZ5X0wxX21heCwgbXZ5X0wxX21pbn0gKi8KKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhWREVDX1BJQ19RVUFMSVRZX0RBVEEpOworCSAgICBtdl9oaSA9IChyZGF0YTMyPj4xNikmMHhmZmZmOworCSAgICBpZiAobXZfaGkgJiAweDgwMDApCisJCQltdl9oaSA9IDB4ODAwMCAtIG12X2hpOworCisJICAgIHByX2luZm8oIiBbUGljdHVyZSAlZCBRdWFsaXR5XSBNVllfTDEgTUFYIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9oaSk7CisKKwkgICAgbXZfbG8gPSAocmRhdGEzMj4+MCkmMHhmZmZmOworCSAgICBpZiAobXZfbG8gJiAweDgwMDApCisJCQltdl9sbyA9IDB4ODAwMCAtIG12X2xvOworCisJICAgIHByX2luZm8oIiBbUGljdHVyZSAlZCBRdWFsaXR5XSBNVllfTDEgTUlOIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9sbyk7CisjZW5kaWYKKworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKFZERUNfUElDX1FVQUxJVFlfQ1RSTCk7CisjaWZkZWYgREVCVUdfUU9TCisJICAgIHByX2luZm8oIiBbUGljdHVyZSAlZCBRdWFsaXR5XSBBZnRlciBSZWFkIDogVkRFQ19QSUNfUVVBTElUWV9DVFJMIDogMHgleFxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzIpOworI2VuZGlmCisJCS8qIHJlc2V0IGFsbCBjb3VudHMgKi8KKwkgICAgV1JJVEVfVlJFRyhWREVDX1BJQ19RVUFMSVRZX0NUUkwsICgxPDw4KSk7CisJfQorfQorCitzdGF0aWMgaW50IGdldF9kZWNfZHBiX3NpemUoc3RydWN0IHZkZWNfaDI2NF9od19zICpodywgaW50IG1iX3dpZHRoLAorCQlpbnQgbWJfaGVpZ2h0LCBpbnQgbGV2ZWxfaWRjKQoreworCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gJmh3LT5kcGI7CisJaW50IHBpY19zaXplID0gbWJfd2lkdGggKiBtYl9oZWlnaHQgKiAzODQ7CisJaW50IHNpemUgPSAwLCBzaXplX3Z1aTsKKworCXN3aXRjaCAobGV2ZWxfaWRjKSB7CisJY2FzZSA5OgorCQlzaXplID0gMTUyMDY0OworCQlicmVhazsKKwljYXNlIDEwOgorCQlzaXplID0gMTUyMDY0OworCQlicmVhazsKKwljYXNlIDExOgorCQlzaXplID0gMzQ1NjAwOworCQlicmVhazsKKwljYXNlIDEyOgorCQlzaXplID0gOTEyMzg0OworCQlicmVhazsKKwljYXNlIDEzOgorCQlzaXplID0gOTEyMzg0OworCQlicmVhazsKKwljYXNlIDIwOgorCQlzaXplID0gOTEyMzg0OworCQlicmVhazsKKwljYXNlIDIxOgorCQlzaXplID0gMTgyNDc2ODsKKwkJYnJlYWs7CisJY2FzZSAyMjoKKwkJc2l6ZSA9IDMxMTA0MDA7CisJCWJyZWFrOworCWNhc2UgMzA6CisJCXNpemUgPSAzMTEwNDAwOworCQlicmVhazsKKwljYXNlIDMxOgorCQlzaXplID0gNjkxMjAwMDsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwkJc2l6ZSA9IDc4NjQzMjA7CisJCWJyZWFrOworCWNhc2UgNDA6CisJCXNpemUgPSAxMjU4MjkxMjsKKwkJYnJlYWs7CisJY2FzZSA0MToKKwkJc2l6ZSA9IDEyNTgyOTEyOworCQlicmVhazsKKwljYXNlIDQyOgorCQlzaXplID0gMTMzNjkzNDQ7CisJCWJyZWFrOworCWNhc2UgNTA6CisJCXNpemUgPSA0MjM5MzYwMDsKKwkJYnJlYWs7CisJY2FzZSA1MToKKwljYXNlIDUyOgorCWRlZmF1bHQ6CisJCXNpemUgPSA3MDc3ODg4MDsKKwkJYnJlYWs7CisJfQorCisJc2l6ZSAvPSBwaWNfc2l6ZTsKKwlzaXplID0gaW1pbihzaXplLCAxNik7CisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkJImxldmVsX2lkYyA9ICVkIHBpY19zaXplID0gJWQgc2l6ZSA9ICVkXG4iLAorCQkJCWxldmVsX2lkYywgcGljX3NpemUsIHNpemUpOworCWlmIChwX0gyNjRfRHBiLT5iaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZykgeworCQlpZiAoKGludClwX0gyNjRfRHBiLT5tYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZyA+IHNpemUpIHsKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJCSJtYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZyBsYXJnZXIgdGhhbiBNYXhEcGJTaXplLlxuIik7CisJCX0KKwkJc2l6ZV92dWkgPSBpbWF4ICgxLCBwX0gyNjRfRHBiLT5tYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZyk7CisJCWlmIChzaXplX3Z1aSA8IHNpemUpIHsKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJCSJXYXJuaW5nOiBtYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZyglZCkgaXMgbGVzcyB0aGFuIERQQiBzaXplKCVkKSBjYWxjdWxhdGVkIGZyb20gUHJvZmlsZS9MZXZlbC5cbiIsCisJCQkJc2l6ZV92dWksIHNpemUpOworCQl9CisJCXNpemUgPSBzaXplX3Z1aTsKKwl9CisKKwlzaXplICs9IDI7CS8qIG5lZWQgdHdvIG1vcmUgYnVmZmVyICovCisKKwlpZiAoIWh3LT5kaXNjYXJkX2R2X2RhdGEpICB7CisJCXNpemUgKz0gMTsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsICJkdiBzdHJlYW0gbmVlZCBvbmUgbW9yZSBidWZmZXIuXG4iKTsKKwl9CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGludCBnZXRfZGVjX2RwYl9zaXplX2FjdGl2ZShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LCB1MzIgcGFyYW0xLCB1MzIgcGFyYW00KQoreworCWludCBtYl93aWR0aCwgbWJfdG90YWw7CisJaW50IG1iX2hlaWdodCA9IDA7CisJaW50IGRlY19kcGJfc2l6ZTsKKwlpbnQgbGV2ZWxfaWRjID0gcGFyYW00ICYgMHhmZjsKKworCW1iX3dpZHRoID0gcGFyYW0xICYgMHhmZjsKKwltYl90b3RhbCA9IChwYXJhbTEgPj4gOCkgJiAweGZmZmY7CisJaWYgKCFtYl93aWR0aCAmJiBtYl90b3RhbCkgLypmb3IgNGsyayovCisJCW1iX3dpZHRoID0gMjU2OworCWlmIChtYl93aWR0aCkKKwkJbWJfaGVpZ2h0ID0gbWJfdG90YWwvbWJfd2lkdGg7CisJaWYgKG1iX3dpZHRoIDw9IDAgfHwgbWJfaGVpZ2h0IDw9IDAgfHwKKwkJaXNfb3ZlcnNpemUobWJfd2lkdGggPDwgNCwgbWJfaGVpZ2h0IDw8IDQpKSB7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJIiEhIXdyb25nIHBhcmFtMSAweCV4IG1iX3dpZHRoL21iX2hlaWdodCAoMHgleC8weCV4KSAleFxyXG4iLAorCQkJcGFyYW0xLAorCQkJbWJfd2lkdGgsCisJCQltYl9oZWlnaHQpOworCQlody0+ZXJyb3JfZnJhbWVfd2lkdGggPSBtYl93aWR0aCA8PCA0OworCQlody0+ZXJyb3JfZnJhbWVfaGVpZ2h0ID0gbWJfaGVpZ2h0IDw8IDQ7CisJCXJldHVybiAtMTsKKwl9CisJaHctPmVycm9yX2ZyYW1lX3dpZHRoID0gMDsKKwlody0+ZXJyb3JfZnJhbWVfaGVpZ2h0ID0gMDsKKworCWRlY19kcGJfc2l6ZSA9IGdldF9kZWNfZHBiX3NpemUoaHcgLCBtYl93aWR0aCwgbWJfaGVpZ2h0LCBsZXZlbF9pZGMpOworCisJaWYgKGh3LT5ub19wb2NfcmVvcmRlcl9mbGFnKQorCQlkZWNfZHBiX3NpemUgPSAxOworCisJcmV0dXJuIGRlY19kcGJfc2l6ZTsKK30KKworc3RhdGljIHZvaWQgdmgyNjRfY29uZmlnX2NhbnZzX2Zvcl9tbXUoc3RydWN0IHZkZWNfaDI2NF9od19zICpodykKK3sKKwlpbnQgaSwgajsKKworCWlmIChody0+ZG91YmxlX3dyaXRlX21vZGUpIHsKKwkJbXV0ZXhfbG9jaygmdm1oMjY0X211dGV4KTsKKwkJaWYgKGh3LT5kZWNvZGVfcGljX2NvdW50ID09IDApIHsKKwkJCWZvciAoaiA9IDA7IGogPCBody0+ZHBiLm1EUEIuc2l6ZTsgaisrKSB7CisJCQkJaSA9IGdldF9idWZfc3BlY19ieV9jYW52YXNfcG9zKGh3LCBqKTsKKwkJCQlpZiAoaSA+PSAwKQorCQkJCQljb25maWdfZGVjb2RlX2NhbnZhc19leChodywgaSk7CisJCQl9CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZ2bWgyNjRfbXV0ZXgpOworCX0KK30KKworc3RhdGljIGludCB2aDI2NF9zZXRfcGFyYW1zKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcsCisJdTMyIHBhcmFtMSwgdTMyIHBhcmFtMiwgdTMyIHBhcmFtMywgdTMyIHBhcmFtNCwgYm9vbCBidWZmZXJfcmVzZXRfZmxhZykKK3sKKwlpbnQgaSwgajsKKwlpbnQgbWJfd2lkdGgsIG1iX3RvdGFsOworCWludCBtYXhfcmVmZXJlbmNlX3NpemUsIGxldmVsX2lkYzsKKwlpbnQgbWJfaGVpZ2h0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCS8qaW50IG1iX212X2J5dGU7Ki8KKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisJdTMyIHNlcV9pbmZvMjsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgYWN0aXZlX2J1ZmZlcl9zcGVjX251bTsKKwl1bnNpZ25lZCBpbnQgYnVmX3NpemU7CisJdW5zaWduZWQgaW50IGZyYW1lX21ic19vbmx5X2ZsYWc7CisJdW5zaWduZWQgaW50IGNocm9tYV9mb3JtYXRfaWRjOworCXVuc2lnbmVkIGludCBjcm9wX2JvdHRvbSwgY3JvcF9yaWdodDsKKwl1bnNpZ25lZCBpbnQgdXNlZF9yZW9yZGVyX2RwYl9zaXplX21hcmdpbgorCQk9IGh3LT5yZW9yZGVyX2RwYl9zaXplX21hcmdpbjsKKwl1OCAqY29sb2NhdGVfdmFkZHIgPSBOVUxMOworCWludCBkZWNfZHBiX3NpemVfY2hhbmdlID0gMDsKKworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJaWYgKHZkZWMtPm1hc3RlciB8fCB2ZGVjLT5zbGF2ZSkKKwkJdXNlZF9yZW9yZGVyX2RwYl9zaXplX21hcmdpbiA9CisJCQlyZW9yZGVyX2RwYl9zaXplX21hcmdpbl9kdjsKKyNlbmRpZgorCXNlcV9pbmZvMiA9IHBhcmFtMTsKKwlody0+c2VxX2luZm8gPSBwYXJhbTI7CisKKwltYl93aWR0aCA9IHNlcV9pbmZvMiAmIDB4ZmY7CisJbWJfdG90YWwgPSAoc2VxX2luZm8yID4+IDgpICYgMHhmZmZmOworCWlmICghbWJfd2lkdGggJiYgbWJfdG90YWwpIC8qZm9yIDRrMmsqLworCQltYl93aWR0aCA9IDI1NjsKKwlpZiAobWJfd2lkdGgpCisJCW1iX2hlaWdodCA9IG1iX3RvdGFsL21iX3dpZHRoOworCWlmIChtYl93aWR0aCA8PSAwIHx8IG1iX2hlaWdodCA8PSAwIHx8CisJCWlzX292ZXJzaXplKG1iX3dpZHRoIDw8IDQsIG1iX2hlaWdodCA8PCA0KSkgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSIhISF3cm9uZyBzZXFfaW5mbzIgMHgleCBtYl93aWR0aC9tYl9oZWlnaHQgKDB4JXgvMHgleCkgJXhcclxuIiwKKwkJCXNlcV9pbmZvMiwKKwkJCW1iX3dpZHRoLAorCQkJbWJfaGVpZ2h0KTsKKwkJCWh3LT5lcnJvcl9mcmFtZV93aWR0aCA9IG1iX3dpZHRoIDw8IDQ7CisJCQlody0+ZXJyb3JfZnJhbWVfaGVpZ2h0ID0gbWJfaGVpZ2h0IDw8IDQ7CisJCXJldHVybiAtMTsKKwl9CisJaHctPmVycm9yX2ZyYW1lX3dpZHRoID0gMDsKKwlody0+ZXJyb3JfZnJhbWVfaGVpZ2h0ID0gMDsKKworCWRlY19kcGJfc2l6ZV9jaGFuZ2UgPSBody0+ZHBiLmRlY19kcGJfc2l6ZSAhPSBnZXRfZGVjX2RwYl9zaXplX2FjdGl2ZShodywgcGFyYW0xLCBwYXJhbTQpOworCisJaWYgKCgoc2VxX2luZm8yICE9IDAgJiYKKwkJaHctPnNlcV9pbmZvMiAhPSBzZXFfaW5mbzIpIHx8IGh3LT5jc2RfY2hhbmdlX2ZsYWcpICYmCisJCWh3LT5zZXFfaW5mbzIgIT0gMAorCQkpIHsKKwkJaWYgKCgoaHctPnNlcV9pbmZvMiAmIDB4ODBmZmZmZmYpICE9IChwYXJhbTEgJiAweDgwZmZmZmZmKSkgfHwgZGVjX2RwYl9zaXplX2NoYW5nZSkgeyAvKnBpY3R1cmUgc2l6ZSBjaGFuZ2VkKi8KKwkJCWgyNjRfcmVjb25maWcoaHcpOworCQl9IGVsc2UgeworCQkJLypzb21ldGluZyBjaGFuZ2VzIGFuZCBub3QgaW5jbHVkaW5nIGRwYl9zaXplLCB3aWR0aCwgaGVpZ2h0LCAuLi4qLworCQkJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSAmaHctPmRwYjsKKwkJCXUzMiByZWdfdmFsID0gcGFyYW00OworCQkJbWF4X3JlZmVyZW5jZV9zaXplID0gKHJlZ192YWwgPj4gOCkgJiAweGZmOworCQkJaHctPmRwYi5yZW9yZGVyX291dHB1dCA9IG1heF9yZWZlcmVuY2Vfc2l6ZTsKKworCQkJaHctPmNmZ19wYXJhbTEgPSBwYXJhbTE7CisJCQlody0+Y2ZnX2JpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnID0gaHctPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnOworCisJCQlody0+c2VxX2luZm8yID0gc2VxX2luZm8yOworCisJCQlpZiAocF9IMjY0X0RwYi0+Yml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcgJiYKKwkJCQlwX0gyNjRfRHBiLT5udW1fcmVvcmRlcl9mcmFtZXMgPD0gcF9IMjY0X0RwYi0+bWF4X2RlY19mcmFtZV9idWZmZXJpbmcgJiYKKwkJCQlwX0gyNjRfRHBiLT5udW1fcmVvcmRlcl9mcmFtZXMgPj0gMCkgeworCQkJCWh3LT5kcGIucmVvcmRlcl9vdXRwdXQgPSBody0+bnVtX3Jlb3JkZXJfZnJhbWVzICsgMTsKKwkJCX0KKworCQkJaHctPm1heF9yZWZlcmVuY2Vfc2l6ZSA9CisJCQkJbWF4X3JlZmVyZW5jZV9zaXplICsgcmVmZXJlbmNlX2J1Zl9tYXJnaW47CisKKwkJCWlmIChody0+bWF4X3JlZmVyZW5jZV9zaXplID4gTUFYX1ZGX0JVRl9OVU0pCisJCQkJaHctPm1heF9yZWZlcmVuY2Vfc2l6ZSA9IE1BWF9WRl9CVUZfTlVNOworCQkJaHctPmRwYi5tYXhfcmVmZXJlbmNlX3NpemUgPSBody0+bWF4X3JlZmVyZW5jZV9zaXplOworCQl9CisJfQorCisJaWYgKGh3LT5jb25maWdfYnVmbWdyX2RvbmUgPT0gMCkgeworCQlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9ICZody0+ZHBiOworCQl1MzIgcmVnX3ZhbDsKKwkJaW50IHN1Yl93aWR0aF9jID0gMCwgc3ViX2hlaWdodF9jID0gMDsKKworCQlody0+Y2ZnX3BhcmFtMSA9IHBhcmFtMTsKKwkJaHctPmNmZ19wYXJhbTIgPSBwYXJhbTI7CisJCWh3LT5jZmdfcGFyYW0zID0gcGFyYW0zOworCQlody0+Y2ZnX3BhcmFtNCA9IHBhcmFtNDsKKwkJaHctPmNmZ19iaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZyA9IGh3LT5iaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZzsKKworCQlody0+c2VxX2luZm8yID0gc2VxX2luZm8yOworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSJBVl9TQ1JBVENIXzEgPSAleCwgQVZfU0NSQVRDSF8yICV4XHJcbiIsCisJCQlzZXFfaW5mbzIsIGh3LT5zZXFfaW5mbyk7CisKKwkJZHBiX2luaXRfZ2xvYmFsKCZody0+ZHBiLAorCQkJREVDT0RFX0lEKGh3KSwgMCwgMCk7CisKKwkJcF9IMjY0X0RwYi0+ZmFzdF9vdXRwdXRfZW5hYmxlID0gZmFzdF9vdXRwdXRfZW5hYmxlOworCQkvKm1iX212X2J5dGUgPSAoc2VxX2luZm8yICYgMHg4MDAwMDAwMCkgPyAyNCA6IDk2OyovCisKKwkJaWYgKGh3LT5lbmFibGVfZmVuY2UpCisJCQlwX0gyNjRfRHBiLT5mYXN0X291dHB1dF9lbmFibGUgPSBIMjY0X09VVFBVVF9NT0RFX0ZBU1Q7CisKKyNpZiAxCisJCS8qY3JvcCovCisJCS8qIEFWX1NDUkFUQ0hfMgorCQkgICBiaXQgMTU6IGZyYW1lX21ic19vbmx5X2ZsYWcKKwkJICAgYml0IDEzLTE0OiBjaHJvbWFfZm9ybWF0X2lkYyAqLworCQlmcmFtZV9tYnNfb25seV9mbGFnID0gKGh3LT5zZXFfaW5mbyA+PiAxNSkgJiAweDAxOworCQlpZiAocF9IMjY0X0RwYi0+bVNQUy5wcm9maWxlX2lkYyAhPSAxMDAgJiYKKwkJCXBfSDI2NF9EcGItPm1TUFMucHJvZmlsZV9pZGMgIT0gMTEwICYmCisJCQlwX0gyNjRfRHBiLT5tU1BTLnByb2ZpbGVfaWRjICE9IDEyMiAmJgorCQkJcF9IMjY0X0RwYi0+bVNQUy5wcm9maWxlX2lkYyAhPSAxNDQpIHsKKwkJCXBfSDI2NF9EcGItPmNocm9tYV9mb3JtYXRfaWRjID0gMTsKKwkJfQorCQljaHJvbWFfZm9ybWF0X2lkYyA9IHBfSDI2NF9EcGItPmNocm9tYV9mb3JtYXRfaWRjOworCisJCS8qIEBBVl9TQ1JBVENIXzYuMzEtMTYgPSAgKGxlZnQgIDw8IDggfCByaWdodCApIDw8IDEKKwkJICAgQEFWX1NDUkFUQ0hfNi4xNS0wICAgPSAgKHRvcCA8PCA4ICB8IGJvdHRvbSApIDw8CisJCSAgICgyIC0gZnJhbWVfbWJzX29ubHlfZmxhZykgKi8KKworCQlzd2l0Y2ggKGNocm9tYV9mb3JtYXRfaWRjKSB7CisJCQljYXNlIDE6CisJCQkJc3ViX3dpZHRoX2MgPSAyOworCQkJCXN1Yl9oZWlnaHRfYyA9IDI7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMjoKKwkJCQlzdWJfd2lkdGhfYyA9IDI7CisJCQkJc3ViX2hlaWdodF9jID0gMTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAzOgorCQkJCXN1Yl93aWR0aF9jID0gMTsKKwkJCQlzdWJfaGVpZ2h0X2MgPSAxOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGNocm9tYV9mb3JtYXRfaWRjID09IDApIHsKKwkJCWNyb3BfcmlnaHQgPSBwX0gyNjRfRHBiLT5mcmFtZV9jcm9wX3JpZ2h0X29mZnNldDsKKwkJCWNyb3BfYm90dG9tID0gcF9IMjY0X0RwYi0+ZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0ICoKKwkJCQkoMiAtIGZyYW1lX21ic19vbmx5X2ZsYWcpOworCQl9IGVsc2UgeworCQkJY3JvcF9yaWdodCA9IHN1Yl93aWR0aF9jICogcF9IMjY0X0RwYi0+ZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQ7CisJCQljcm9wX2JvdHRvbSA9IHN1Yl9oZWlnaHRfYyAqIHBfSDI2NF9EcGItPmZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCAqCisJCQkJKDIgLSBmcmFtZV9tYnNfb25seV9mbGFnKTsKKwkJfQorCisJCXBfSDI2NF9EcGItPm1TUFMuZnJhbWVfbWJzX29ubHlfZmxhZyA9IGZyYW1lX21ic19vbmx5X2ZsYWc7CisJCWh3LT5mcmFtZV93aWR0aCA9IG1iX3dpZHRoIDw8IDQ7CisJCWh3LT5mcmFtZV9oZWlnaHQgPSBtYl9oZWlnaHQgPDwgNDsKKworCQlody0+ZnJhbWVfd2lkdGggPSBody0+ZnJhbWVfd2lkdGggLSBjcm9wX3JpZ2h0OworCQlody0+ZnJhbWVfaGVpZ2h0ID0gaHctPmZyYW1lX2hlaWdodCAtIGNyb3BfYm90dG9tOworCisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJImNocm9tYV9mb3JtYXRfaWRjID0gJWQgZnJhbWVfbWJzX29ubHlfZmxhZyAlZCwgY3JvcF9ib3R0b20gJWQsICBmcmFtZV9oZWlnaHQgJWQsXG4iLAorCQkJY2hyb21hX2Zvcm1hdF9pZGMsIGZyYW1lX21ic19vbmx5X2ZsYWcsIGNyb3BfYm90dG9tLCBody0+ZnJhbWVfaGVpZ2h0KTsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkibWJfaGVpZ2h0ICVkLGNyb3BfcmlnaHQgJWQsIGZyYW1lX3dpZHRoICVkLCBtYl93aWR0aCAlZFxuIiwKKwkJCW1iX2hlaWdodCwgY3JvcF9yaWdodCwKKwkJCWh3LT5mcmFtZV93aWR0aCwgbWJfd2lkdGgpOworCisJCWlmIChody0+ZnJhbWVfaGVpZ2h0ID09IDEwODggJiYgKGNyb3BfcmlnaHQgIT0gMCB8fCBjcm9wX2JvdHRvbSAhPSAwKSkKKwkJCWh3LT5mcmFtZV9oZWlnaHQgPSAxMDgwOworI2VuZGlmCisJCXJlZ192YWwgPSBwYXJhbTQ7CisJCWxldmVsX2lkYyA9IHJlZ192YWwgJiAweGZmOworCQlwX0gyNjRfRHBiLT5tU1BTLmxldmVsX2lkYyA9IGxldmVsX2lkYzsKKwkJbWF4X3JlZmVyZW5jZV9zaXplID0gKHJlZ192YWwgPj4gOCkgJiAweGZmOworCQlody0+ZHBiLnJlb3JkZXJfb3V0cHV0ID0gbWF4X3JlZmVyZW5jZV9zaXplOworCQlody0+ZHBiLmRlY19kcGJfc2l6ZSA9CisJCQlnZXRfZGVjX2RwYl9zaXplKGh3ICwgbWJfd2lkdGgsIG1iX2hlaWdodCwgbGV2ZWxfaWRjKTsKKwkJaWYgKCFody0+bW11X2VuYWJsZSkgeworCQkJbWJfd2lkdGggPSAobWJfd2lkdGgrMykgJiAweGZmZmZmZmZjOworCQkJbWJfaGVpZ2h0ID0gKG1iX2hlaWdodCszKSAmIDB4ZmZmZmZmZmM7CisJCX0KKwkJbWJfdG90YWwgPSBtYl93aWR0aCAqIG1iX2hlaWdodDsKKwkJaHctPm1iX3dpZHRoID0gbWJfd2lkdGg7CisJCWh3LT5tYl9oZWlnaHQgPSBtYl9oZWlnaHQ7CisJCWh3LT5tYl90b3RhbCA9IG1iX3RvdGFsOworCQlpZiAoaHctPm1tdV9lbmFibGUpCisJCQloZXZjX21jcl9zYW9fZ2xvYmFsX2h3X2luaXQoaHcsCisJCQkJKGh3LT5tYl93aWR0aCA8PCA0KSwgKGh3LT5tYl9oZWlnaHQgPDwgNCkpOworCisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJIm1iIGhlaWdodC93aWRodC90b3RhbDogJXgvJXgvJXggbGV2ZWxfaWRjICV4IG1heF9yZWZfbnVtICV4XG4iLAorCQkJbWJfaGVpZ2h0LCBtYl93aWR0aCwgbWJfdG90YWwsCisJCQlsZXZlbF9pZGMsIG1heF9yZWZlcmVuY2Vfc2l6ZSk7CisKKwkJcF9IMjY0X0RwYi0+Y29sb2NhdGVkX2J1Zl9zaXplID0gbWJfdG90YWwgKiA5NjsKKworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSJyZXN0cmljdGlvbl9mbGFnPSVkLCBtYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZz0lZCwgZGVjX2RwYl9zaXplPSVkIG51bV9yZW9yZGVyX2ZyYW1lcyAlZCB1c2VkX3Jlb3JkZXJfZHBiX3NpemVfbWFyZ2luICVkXG4iLAorCQkJaHctPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnLAorCQkJaHctPm1heF9kZWNfZnJhbWVfYnVmZmVyaW5nLAorCQkJaHctPmRwYi5kZWNfZHBiX3NpemUsCisJCQlody0+bnVtX3Jlb3JkZXJfZnJhbWVzLAorCQkJdXNlZF9yZW9yZGVyX2RwYl9zaXplX21hcmdpbik7CisKKwkJaWYgKHBfSDI2NF9EcGItPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnICYmCisJCQlwX0gyNjRfRHBiLT5udW1fcmVvcmRlcl9mcmFtZXMgPD0gcF9IMjY0X0RwYi0+bWF4X2RlY19mcmFtZV9idWZmZXJpbmcgJiYKKwkJCXBfSDI2NF9EcGItPm51bV9yZW9yZGVyX2ZyYW1lcyA+PSAwKSB7CisJCQlody0+ZHBiLnJlb3JkZXJfb3V0cHV0ID0gaHctPm51bV9yZW9yZGVyX2ZyYW1lcyArIDE7CisJCX0KKworCQlhY3RpdmVfYnVmZmVyX3NwZWNfbnVtID0KKwkJCWh3LT5kcGIuZGVjX2RwYl9zaXplCisJCQkrIHVzZWRfcmVvcmRlcl9kcGJfc2l6ZV9tYXJnaW47CisJCWh3LT5tYXhfcmVmZXJlbmNlX3NpemUgPQorCQkJbWF4X3JlZmVyZW5jZV9zaXplICsgcmVmZXJlbmNlX2J1Zl9tYXJnaW47CisKKwkJaWYgKGFjdGl2ZV9idWZmZXJfc3BlY19udW0gPiBNQVhfVkZfQlVGX05VTSkgeworCQkJYWN0aXZlX2J1ZmZlcl9zcGVjX251bSA9IE1BWF9WRl9CVUZfTlVNOworCQkJaHctPmRwYi5kZWNfZHBiX3NpemUgPSBhY3RpdmVfYnVmZmVyX3NwZWNfbnVtCisJCQkJLSB1c2VkX3Jlb3JkZXJfZHBiX3NpemVfbWFyZ2luOworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkJImFjdGl2ZV9idWZmZXJfc3BlY19udW0gaXMgbGFyZ2VyIHRoYW4gTUFYICVkLCBzZXQgZGVjX2RwYl9zaXplIHRvICVkXG4iLAorCQkJCU1BWF9WRl9CVUZfTlVNLCBody0+ZHBiLmRlY19kcGJfc2l6ZSk7CisJCX0KKworCQlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCQlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShody0+djRsMl9jdHgpOworCQkJc3RydWN0IHZkZWNfcGljX2luZm8gcGljOworCisJCQl2ZGVjX3Y0bF9nZXRfcGljX2luZm8oY3R4LCAmcGljKTsKKworCQkJYWN0aXZlX2J1ZmZlcl9zcGVjX251bSA9IHBpYy5kcGJfZnJhbWVzICsKKwkJCQlwaWMuZHBiX21hcmdpbjsKKwkJfQorCisJCWh3LT5kcGIubURQQi5zaXplID0gYWN0aXZlX2J1ZmZlcl9zcGVjX251bTsKKwkJaWYgKGh3LT5tYXhfcmVmZXJlbmNlX3NpemUgPiBNQVhfVkZfQlVGX05VTSkKKwkJCWh3LT5tYXhfcmVmZXJlbmNlX3NpemUgPSBNQVhfVkZfQlVGX05VTTsKKwkJaHctPmRwYi5tYXhfcmVmZXJlbmNlX3NpemUgPSBody0+bWF4X3JlZmVyZW5jZV9zaXplOworCisJCWlmIChody0+bm9fcG9jX3Jlb3JkZXJfZmxhZykKKwkJCWh3LT5kcGIuZGVjX2RwYl9zaXplID0gMTsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkiJXMgYWN0aXZlX2J1Zl9zcGVjX251bSAlZCBkZWNfZHBiX3NpemUgJWQgY29sbG9jYXRlX2J1Zl9udW0gJWRcclxuIiwKKwkJCV9fZnVuY19fLCBhY3RpdmVfYnVmZmVyX3NwZWNfbnVtLAorCQkJaHctPmRwYi5kZWNfZHBiX3NpemUsCisJCQlody0+bWF4X3JlZmVyZW5jZV9zaXplKTsKKworCQlpZiAoaHctPmtwaV9maXJzdF9pX2NvbW1pbmcgPT0gMCkgeworCQkJaHctPmtwaV9maXJzdF9pX2NvbW1pbmcgPSAxOworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsCisJCQkJIlt2ZGVjX2twaV1bJXNdIEZpcnN0IEkgZnJhbWUgY29tbWluZy5cbiIsIF9fZnVuY19fKTsKKwkJfQorCisJCWJ1Zl9zaXplID0gKGh3LT5tYl90b3RhbCA8PCA4KSArIChody0+bWJfdG90YWwgPDwgNyk7CisKKwkJbXV0ZXhfbG9jaygmdm1oMjY0X211dGV4KTsKKwkJaWYgKCFody0+bW11X2VuYWJsZSkgeworCQkJaWYgKCFidWZmZXJfcmVzZXRfZmxhZykKKwkJCQljb25maWdfYnVmX3NwZWNzKHZkZWMpOworCQkJaSA9IGdldF9idWZfc3BlY19ieV9jYW52YXNfcG9zKGh3LCAwKTsKKworCQkJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQkJCWlmIChpICE9IC0xKSB7CisJCQkJCXByX2luZm8oInY0bDogZGVsYXkgYWxsb2MgdGhlIGJ1ZmZlci5cbiIpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKChpICE9IC0xKSAmJiBhbGxvY19vbmVfYnVmX3NwZWMoaHcsIGkpID49IDApCisJCQkJCWNvbmZpZ19kZWNvZGVfY2FudmFzKGh3LCBpKTsKKwkJCQllbHNlCisJCQkJCXJldCA9IC0xOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGh3LT5kb3VibGVfd3JpdGVfbW9kZSkgeworCQkJCWNvbmZpZ19idWZfc3BlY3NfZXgodmRlYyk7CisJCQl9IGVsc2UgeworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZody0+YnVmc3BlY19sb2NrLCBmbGFncyk7CisJCQkJZm9yIChpID0gMCwgaiA9IDA7CisJCQkJCWogPCBhY3RpdmVfYnVmZmVyX3NwZWNfbnVtCisJCQkJCSYmIGkgPCBCVUZTUEVDX1BPT0xfU0laRTsKKwkJCQkJaSsrKSB7CisJCQkJCWlmIChody0+YnVmZmVyX3NwZWNbaV0udXNlZCAhPSAtMSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlody0+YnVmZmVyX3NwZWNbaV0udXNlZCA9IDA7CisJCQkJCWh3LT5idWZmZXJfc3BlY1tpXS4KKwkJCQkJCWFsbG9jX2hlYWRlcl9hZGRyID0gMDsKKwkJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19wb3MgPSBqOworCQkJCQlqKys7CisJCQkJfQorCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5idWZzcGVjX2xvY2ssCisJCQkJCWZsYWdzKTsKKwkJCX0KKwkJCWhldmNfbWNyX2NvbmZpZ19jYW52MmF4aXRibChodywgMCk7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZ2bWgyNjRfbXV0ZXgpOworCQlpZiAoZHBiX2lzX2RlYnVnKERFQ09ERV9JRChodyksCisJCQlQUklOVF9GTEFHX0RVTVBfQlVGU1BFQykpCisJCQlkdW1wX2J1ZnNwZWMoaHcsIF9fZnVuY19fKTsKKworI2lmZGVmIE9ORV9DT0xPQ0FURV9CVUZfUEVSX0RFQ09ERV9CVUYKKwkJYnVmX3NpemUgPSBQQUdFX0FMSUdOKAorCQkJcF9IMjY0X0RwYi0+Y29sb2NhdGVkX2J1Zl9zaXplICoKKwkJCQkJYWN0aXZlX2J1ZmZlcl9zcGVjX251bSk7CisjZWxzZQorCQlidWZfc2l6ZSA9IFBBR0VfQUxJR04oCisJCQlwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX3NpemUgKgorCQkJCQlody0+bWF4X3JlZmVyZW5jZV9zaXplKTsKKyNlbmRpZgorCisJCWlmIChkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkoaHctPmJtbXVfYm94LCBCTU1VX1JFRl9JRFgsCisJCQlidWZfc2l6ZSwgRFJJVkVSX05BTUUsCisJCQkmaHctPmNvbGxvY2F0ZV9jbWFfYWxsb2NfYWRkcikgPCAwKQorCQkJcmV0dXJuIC0xOworCQlpZiAoIXZkZWNfc2VjdXJlKHZkZWMpKSB7CisJCQkvKiBjbGVhciBmb3Igc29tZSBtb3NhaWMgcHJvYmxlbSBhZnRlciByZXNldCBidWZtZ3IgKi8KKwkJCWNvbG9jYXRlX3ZhZGRyID0gY29kZWNfbW1fdm1hcChody0+Y29sbG9jYXRlX2NtYV9hbGxvY19hZGRyLCBidWZfc2l6ZSk7CisJCQlpZiAoY29sb2NhdGVfdmFkZHIgIT0gTlVMTCkgeworCQkJCW1lbXNldChjb2xvY2F0ZV92YWRkciwgMCwgYnVmX3NpemUpOworCQkJCWNvZGVjX21tX2RtYV9mbHVzaChjb2xvY2F0ZV92YWRkciwgYnVmX3NpemUsIERNQV9UT19ERVZJQ0UpOworCQkJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIoY29sb2NhdGVfdmFkZHIpOworCQkJfQorCQl9CisKKwkJaHctPmRwYi5jb2xvY2F0ZWRfbXZfYWRkcl9zdGFydCA9CisJCQlody0+Y29sbG9jYXRlX2NtYV9hbGxvY19hZGRyOworI2lmZGVmIE9ORV9DT0xPQ0FURV9CVUZfUEVSX0RFQ09ERV9CVUYKKwkJaHctPmRwYi5jb2xvY2F0ZWRfbXZfYWRkcl9lbmQgID0KKwkJCWh3LT5kcGIuY29sb2NhdGVkX212X2FkZHJfc3RhcnQgKworCQkJKHBfSDI2NF9EcGItPmNvbG9jYXRlZF9idWZfc2l6ZSAqCisJCQlhY3RpdmVfYnVmZmVyX3NwZWNfbnVtKTsKKyNlbHNlCisJCWh3LT5kcGIuY29sb2NhdGVkX212X2FkZHJfZW5kICA9CisJCQlody0+ZHBiLmNvbG9jYXRlZF9tdl9hZGRyX3N0YXJ0ICsKKwkJCShwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX3NpemUgKgorCQkJaHctPm1heF9yZWZlcmVuY2Vfc2l6ZSk7CisjZW5kaWYKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCwKKwkJCSJjYWxsb2NhdGUgY21hLCAlbHgsICV4XG4iLAorCQkJaHctPmNvbGxvY2F0ZV9jbWFfYWxsb2NfYWRkciwKKwkJCWh3LT5kcGIuY29sb2NhdGVkX212X2FkZHJfc3RhcnQpOworCisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RFQ19ERVRBSUwsCisJCQkiY29sb2NhdGVkX212X2FkZHJfc3RhcnQgJXggY29sb2NhdGVkX212X2FkZHJfZW5kICV4XG4iLAorCQkJaHctPmRwYi5jb2xvY2F0ZWRfbXZfYWRkcl9zdGFydCwKKwkJCWh3LT5kcGIuY29sb2NhdGVkX212X2FkZHJfZW5kKTsKKwkJaWYgKCFody0+bW11X2VuYWJsZSkgeworCQkJbXV0ZXhfbG9jaygmdm1oMjY0X211dGV4KTsKKwkJCWlmIChyZXQgPj0gMCAmJiBody0+ZGVjb2RlX3BpY19jb3VudCA9PSAwKSB7CisJCQkJaW50IGJ1Zl9jbnQ7CisJCQkJLyogaDI2NF9yZWNvbmZpZzogYWxsb2MgbGF0ZXIqLworCQkJCWJ1Zl9jbnQgPSBody0+ZHBiLm1EUEIuc2l6ZTsKKworCQkJCWZvciAoaiA9IDE7IGogPCBidWZfY250OyBqKyspIHsKKwkJCQkJaSA9IGdldF9idWZfc3BlY19ieV9jYW52YXNfcG9zKGh3LCBqKTsKKworCQkJCQlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCQkJCQlwcl9pbmZvKCJ2NGw6IGRlbGF5IGFsbG9jIHRoZSBidWZmZXIuXG4iKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9IGVsc2UgaWYgKGFsbG9jX29uZV9idWZfc3BlYyhodywgaSkgPCAwKQorCQkJCQkJYnJlYWs7CisKKwkJCQkJY29uZmlnX2RlY29kZV9jYW52YXMoaHcsIGkpOworCQkJCX0KKwkJCX0KKwkJCW11dGV4X3VubG9jaygmdm1oMjY0X211dGV4KTsKKwkJfSBlbHNlIHsKKwkJCXZoMjY0X2NvbmZpZ19jYW52c19mb3JfbW11KGh3KTsKKwkJfQorCisJCWh3LT5jb25maWdfYnVmbWdyX2RvbmUgPSAxOworCisJLyplbmQgb2YgIGNvbmZpZ19idWZtZ3JfZG9uZSAqLworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHZ1aV9jb25maWcoc3RydWN0IHZkZWNfaDI2NF9od19zICpodykKK3sKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9ICZody0+ZHBiOworCWludCBhc3BlY3RfcmF0aW9faW5mb19wcmVzZW50X2ZsYWcsIGFzcGVjdF9yYXRpb19pZGM7CisJLyp0aW1lKi8KKwlody0+bnVtX3VuaXRzX2luX3RpY2sgPSBwX0gyNjRfRHBiLT5udW1fdW5pdHNfaW5fdGljazsKKwlody0+dGltZV9zY2FsZSA9IHBfSDI2NF9EcGItPnRpbWVfc2NhbGU7CisJaHctPnRpbWluZ19pbmZvX3ByZXNlbnRfZmxhZyA9IHBfSDI2NF9EcGItPnZ1aV9zdGF0dXMgJiAweDI7CisKKwlody0+Yml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcgPQorCQlwX0gyNjRfRHBiLT5iaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZzsKKwlody0+bnVtX3Jlb3JkZXJfZnJhbWVzID0KKwkJcF9IMjY0X0RwYi0+bnVtX3Jlb3JkZXJfZnJhbWVzOworCWh3LT5tYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZyA9CisJCXBfSDI2NF9EcGItPm1heF9kZWNfZnJhbWVfYnVmZmVyaW5nOworCisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJInZ1aV9jb25maWc6IHBkYiAlZCwgJWQsICVkXG4iLAorCQlwX0gyNjRfRHBiLT5iaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZywKKwkJcF9IMjY0X0RwYi0+bnVtX3Jlb3JkZXJfZnJhbWVzLAorCQlwX0gyNjRfRHBiLT5tYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZyk7CisKKwlody0+Zml4ZWRfZnJhbWVfcmF0ZV9mbGFnID0gMDsKKwlpZiAoaHctPnRpbWluZ19pbmZvX3ByZXNlbnRfZmxhZykgeworCQlody0+Zml4ZWRfZnJhbWVfcmF0ZV9mbGFnID0KKwkJCXBfSDI2NF9EcGItPmZpeGVkX2ZyYW1lX3JhdGVfZmxhZzsKKworCQlpZiAoaHctPmlzX3VzZWRfdjRsICYmIChwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW1NMSUNFX1RZUEVdID09IElfU2xpY2UpICYmCisJCQkoaHctPm51bV91bml0c19pbl90aWNrICE9IDApKSB7CisJCQlpZiAoaHctPm51bV91bml0c19pbl90aWNrICUgMTAwMSA9PSAwKSB7CisJCQkJaW50IG11bHRpcGxlID0gaHctPm51bV91bml0c19pbl90aWNrIC8gMTAwMTsKKworCQkJCWlmIChody0+dGltZV9zY2FsZSAvIG11bHRpcGxlID09IDEyMDAwMCkgeworCQkJCQlody0+ZnJhbWVfZHVyID0gUkFURV8xMTk5MF9GUFM7CisJCQkJCWlmIChody0+Zml4ZWRfZnJhbWVfcmF0ZV9mbGFnID09IDEpCisJCQkJCQlody0+ZnJhbWVfZHVyID0gUkFURV81OTk0X0ZQUzsKKwkJCQl9IGVsc2UgaWYgKGh3LT50aW1lX3NjYWxlIC8gbXVsdGlwbGUgPT0gIDYwMDAwKSB7CisJCQkJCWh3LT5mcmFtZV9kdXIgPSBSQVRFXzU5OTRfRlBTOworCQkJCQlpZiAoaHctPmZpeGVkX2ZyYW1lX3JhdGVfZmxhZyA9PSAxKQorCQkJCQkJaHctPmZyYW1lX2R1ciA9IFJBVEVfMjk5N19GUFM7CisJCQkJfSBlbHNlIGlmICgoaHctPnRpbWVfc2NhbGUgLyBtdWx0aXBsZSAgPT0gNDgwMDApICYmCisJCQkJCShody0+Zml4ZWRfZnJhbWVfcmF0ZV9mbGFnID09IDEpKSB7CisJCQkJCWh3LT5mcmFtZV9kdXIgPSBSQVRFXzIzOTdfRlBTOworCQkJCX0gZWxzZSBpZiAoaHctPnRpbWVfc2NhbGUgLyBtdWx0aXBsZSAgPT0gMzAwMDApIHsKKwkJCQkJaHctPmZyYW1lX2R1ciA9IFJBVEVfMjk5N19GUFM7CisJCQkJfSBlbHNlIGlmIChody0+dGltZV9zY2FsZSAvIG11bHRpcGxlICA9PSAyNDAwMCkgeworCQkJCQlody0+ZnJhbWVfZHVyID0gUkFURV8yMzk3X0ZQUzsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXUzMiBmcmFtZV9yYXRlID0gaHctPnRpbWVfc2NhbGUgLyBody0+bnVtX3VuaXRzX2luX3RpY2s7CisKKwkJCQlpZiAoaHctPmZpeGVkX2ZyYW1lX3JhdGVfZmxhZyA9PSAxKSB7CisJCQkJCWZyYW1lX3JhdGUgPSBmcmFtZV9yYXRlIC8gMjsKKwkJCQl9CisJCQkJaHctPmZyYW1lX2R1ciA9IDk2MDAwIC8gZnJhbWVfcmF0ZTsKKwkJCX0KKwkJfQorCisJCWlmICgoKGh3LT5udW1fdW5pdHNfaW5fdGljayAqIDEyMCkgPj0gaHctPnRpbWVfc2NhbGUgJiYKKwkJCSgoIWh3LT5zeW5jX291dHNpZGUpIHx8CisJCQkJKCFody0+ZnJhbWVfZHVyKSkpCisJCQkmJiBody0+bnVtX3VuaXRzX2luX3RpY2sgJiYgaHctPnRpbWVfc2NhbGUpIHsKKwkJCWlmIChody0+dXNlX2lkcl9mcmFtZXJhdGUgfHwKKwkJCQlody0+Zml4ZWRfZnJhbWVfcmF0ZV9mbGFnIHx8CisJCQkJIWh3LT5mcmFtZV9kdXIgfHwKKwkJCQkhaHctPmR1cmF0aW9uX2Zyb21fcHRzX2RvbmUKKwkJCQkvKnx8IHZoMjY0X3J1bm5pbmcqLykgeworCQkJCXUzMiBmcmFtZV9kdXJfZXMgPQorCQkJCWRpdl91NjQoOTYwMDBVTEwgKiAyICogaHctPm51bV91bml0c19pbl90aWNrLAorCQkJCQlody0+dGltZV9zY2FsZSk7CisJCQkJaWYgKGh3LT5mcmFtZV9kdXIgIT0gZnJhbWVfZHVyX2VzKSB7CisJCQkJCWh3LT5oMjY0X2ZpcnN0X3ZhbGlkX3B0c19yZWFkeSA9IGZhbHNlOworCQkJCQlody0+aDI2NHB0czEgPSAwOworCQkJCQlody0+aDI2NHB0czIgPSAwOworCQkJCQlody0+aDI2NF9wdHNfY291bnQgPSAwOworCQkJCQlody0+ZHVyYXRpb25fZnJvbV9wdHNfZG9uZSA9IDA7CisJCQkJCWZpeGVkX2ZyYW1lX3JhdGVfbW9kZSA9CisJCQkJCQlGSVhfRlJBTUVfUkFURV9PRkY7CisJCQkJCWh3LT5wdHNfZHVyYXRpb24gPSAwOworCQkJCQlody0+ZnJhbWVfZHVyID0gZnJhbWVfZHVyX2VzOworCQkJCQlpZiAoIWh3LT5maXhlZF9mcmFtZV9yYXRlX2ZsYWcgJiYgKHBfSDI2NF9EcGItPm1TUFMucHJvZmlsZV9pZGMgIT0gQkFTRUxJTkUpKSB7CisJCQkJCQlpZiAoZnJhbWVfZHVyX2VzID09IDc2ODApCisJCQkJCQkJaHctPmZyYW1lX2R1ciA9IGZyYW1lX2R1cl9lcyAvMjsKKwkJCQkJfQorCQkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT5ub3RpZnlfd29yayk7CisJCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLAorCQkJCQkJUFJJTlRfRkxBR19ERUNfREVUQUlMLAorCQkJCQkJImZyYW1lX2R1ciAlZCBmcm9tIHRpbWluZ19pbmZvXG4iLAorCQkJCQkJaHctPmZyYW1lX2R1cik7CisJCQkJfQorCisJCQkJLypoYWNrIHRvIGF2b2lkIHVzZSBFUyBmcmFtZSBkdXJhdGlvbiB3aGVuCisJCQkJICppdCdzIGhhbGYgb2YgdGhlIHJhdGUgZnJvbSBzeXN0ZW0gaW5mbworCQkJCSAqIHNvbWV0aW1lcyB0aGUgZW5jb2RlciBpcyBnaXZlbiBhIHdyb25nCisJCQkJICogZnJhbWUgcmF0ZSBidXQgdGhlIHN5c3RlbSBzaWRlIGluZm9ybWF0aW9uCisJCQkJICogaXMgbW9yZSByZWxpYWJsZQorCQkJCSAqaWYgKChmcmFtZV9kdXIgKiAyKSAhPSBmcmFtZV9kdXJfZXMpIHsKKwkJCQkgKiAgICBmcmFtZV9kdXIgPSBmcmFtZV9kdXJfZXM7CisJCQkJICp9CisJCQkJICovCisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19ERUNfREVUQUlMLAorCQkJIkguMjY0OiB0aW1pbmdfaW5mbyBub3QgcHJlc2VudFxuIik7CisJfQorCisJLyphc3BlY3QgcmF0aW8qLworCWFzcGVjdF9yYXRpb19pbmZvX3ByZXNlbnRfZmxhZyA9CisJCXBfSDI2NF9EcGItPnZ1aV9zdGF0dXMgJiAweDE7CisJYXNwZWN0X3JhdGlvX2lkYyA9IHBfSDI2NF9EcGItPmFzcGVjdF9yYXRpb19pZGM7CisKKwlpZiAoYXNwZWN0X3JhdGlvX2luZm9fcHJlc2VudF9mbGFnKSB7CisJCWlmIChhc3BlY3RfcmF0aW9faWRjID09IEVYVEVORF9TQVIpIHsKKwkJCWh3LT5oMjY0X2FyID0gMHgzZmY7CisJCQlody0+aGVpZ2h0X2FzcGVjdF9yYXRpbyA9CisJCQkJcF9IMjY0X0RwYi0+YXNwZWN0X3JhdGlvX3Nhcl9oZWlnaHQ7CisJCQlody0+d2lkdGhfYXNwZWN0X3JhdGlvID0KKwkJCQlwX0gyNjRfRHBiLT5hc3BlY3RfcmF0aW9fc2FyX3dpZHRoOworCQl9IGVsc2UgeworCQkJLyogcHJfaW5mbygidjI2NGRlYzogYXNwZWN0X3JhdGlvX2lkYyA9ICVkXG4iLAorCQkJICAgYXNwZWN0X3JhdGlvX2lkYyk7ICovCisKKwkJCXN3aXRjaCAoYXNwZWN0X3JhdGlvX2lkYykgeworCQkJY2FzZSAxOgorCQkJCWh3LT5oMjY0X2FyID0gMHgzZmY7CisJCQkJaHctPmhlaWdodF9hc3BlY3RfcmF0aW8gPSAxOworCQkJCWh3LT53aWR0aF9hc3BlY3RfcmF0aW8gPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCWh3LT5oMjY0X2FyID0gMHgzZmY7CisJCQkJaHctPmhlaWdodF9hc3BlY3RfcmF0aW8gPSAxMTsKKwkJCQlody0+d2lkdGhfYXNwZWN0X3JhdGlvID0gMTI7CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJaHctPmgyNjRfYXIgPSAweDNmZjsKKwkJCQlody0+aGVpZ2h0X2FzcGVjdF9yYXRpbyA9IDExOworCQkJCWh3LT53aWR0aF9hc3BlY3RfcmF0aW8gPSAxMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQlody0+aDI2NF9hciA9IDB4M2ZmOworCQkJCWh3LT5oZWlnaHRfYXNwZWN0X3JhdGlvID0gMTE7CisJCQkJaHctPndpZHRoX2FzcGVjdF9yYXRpbyA9IDE2OworCQkJCWJyZWFrOworCQkJY2FzZSA1OgorCQkJCWh3LT5oMjY0X2FyID0gMHgzZmY7CisJCQkJaHctPmhlaWdodF9hc3BlY3RfcmF0aW8gPSAzMzsKKwkJCQlody0+d2lkdGhfYXNwZWN0X3JhdGlvID0gNDA7CisJCQkJYnJlYWs7CisJCQljYXNlIDY6CisJCQkJaHctPmgyNjRfYXIgPSAweDNmZjsKKwkJCQlody0+aGVpZ2h0X2FzcGVjdF9yYXRpbyA9IDExOworCQkJCWh3LT53aWR0aF9hc3BlY3RfcmF0aW8gPSAyNDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNzoKKwkJCQlody0+aDI2NF9hciA9IDB4M2ZmOworCQkJCWh3LT5oZWlnaHRfYXNwZWN0X3JhdGlvID0gMTE7CisJCQkJaHctPndpZHRoX2FzcGVjdF9yYXRpbyA9IDIwOworCQkJCWJyZWFrOworCQkJY2FzZSA4OgorCQkJCWh3LT5oMjY0X2FyID0gMHgzZmY7CisJCQkJaHctPmhlaWdodF9hc3BlY3RfcmF0aW8gPSAxMTsKKwkJCQlody0+d2lkdGhfYXNwZWN0X3JhdGlvID0gMzI7CisJCQkJYnJlYWs7CisJCQljYXNlIDk6CisJCQkJaHctPmgyNjRfYXIgPSAweDNmZjsKKwkJCQlody0+aGVpZ2h0X2FzcGVjdF9yYXRpbyA9IDMzOworCQkJCWh3LT53aWR0aF9hc3BlY3RfcmF0aW8gPSA4MDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTA6CisJCQkJaHctPmgyNjRfYXIgPSAweDNmZjsKKwkJCQlody0+aGVpZ2h0X2FzcGVjdF9yYXRpbyA9IDExOworCQkJCWh3LT53aWR0aF9hc3BlY3RfcmF0aW8gPSAxODsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTE6CisJCQkJaHctPmgyNjRfYXIgPSAweDNmZjsKKwkJCQlody0+aGVpZ2h0X2FzcGVjdF9yYXRpbyA9IDExOworCQkJCWh3LT53aWR0aF9hc3BlY3RfcmF0aW8gPSAxNTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTI6CisJCQkJaHctPmgyNjRfYXIgPSAweDNmZjsKKwkJCQlody0+aGVpZ2h0X2FzcGVjdF9yYXRpbyA9IDMzOworCQkJCWh3LT53aWR0aF9hc3BlY3RfcmF0aW8gPSA2NDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTM6CisJCQkJaHctPmgyNjRfYXIgPSAweDNmZjsKKwkJCQlody0+aGVpZ2h0X2FzcGVjdF9yYXRpbyA9IDk5OworCQkJCWh3LT53aWR0aF9hc3BlY3RfcmF0aW8gPSAxNjA7CisJCQkJYnJlYWs7CisJCQljYXNlIDE0OgorCQkJCWh3LT5oMjY0X2FyID0gMHgzZmY7CisJCQkJaHctPmhlaWdodF9hc3BlY3RfcmF0aW8gPSAzOworCQkJCWh3LT53aWR0aF9hc3BlY3RfcmF0aW8gPSA0OworCQkJCWJyZWFrOworCQkJY2FzZSAxNToKKwkJCQlody0+aDI2NF9hciA9IDB4M2ZmOworCQkJCWh3LT5oZWlnaHRfYXNwZWN0X3JhdGlvID0gMjsKKwkJCQlody0+d2lkdGhfYXNwZWN0X3JhdGlvID0gMzsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTY6CisJCQkJaHctPmgyNjRfYXIgPSAweDNmZjsKKwkJCQlody0+aGVpZ2h0X2FzcGVjdF9yYXRpbyA9IDE7CisJCQkJaHctPndpZHRoX2FzcGVjdF9yYXRpbyA9IDI7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWlmIChody0+dmgyNjRfcmF0aW8gPj4gMTYpIHsKKwkJCQkJaHctPmgyNjRfYXIgPSAoaHctPmZyYW1lX2hlaWdodCAqCisJCQkJCQkoaHctPnZoMjY0X3JhdGlvICYgMHhmZmZmKSAqCisJCQkJCQkweDEwMCArCisJCQkJCQkoKGh3LT52aDI2NF9yYXRpbyA+PiAxNikgKgorCQkJCQkJIGh3LT5mcmFtZV93aWR0aCAvIDIpKSAvCisJCQkJCQkoKGh3LT52aDI2NF9yYXRpbyA+PiAxNikgKgorCQkJCQkJIGh3LT5mcmFtZV93aWR0aCk7CisJCQkJCWh3LT5oZWlnaHRfYXNwZWN0X3JhdGlvID0gMTsKKwkJCQkJaHctPndpZHRoX2FzcGVjdF9yYXRpbyA9IDE7CisJCQkJfSBlbHNlIHsKKwkJCQkJaHctPmgyNjRfYXIgPSAweDNmZjsKKwkJCQkJaHctPmhlaWdodF9hc3BlY3RfcmF0aW8gPSAxOworCQkJCQlody0+d2lkdGhfYXNwZWN0X3JhdGlvID0gMTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19ERUNfREVUQUlMLAorCQkJInYyNjRkZWM6IGFzcGVjdF9yYXRpbyBub3QgYXZhaWxhYmxlIGZyb20gc291cmNlXG4iKTsKKwkJaWYgKGh3LT52aDI2NF9yYXRpbyA+PiAxNikgeworCQkJLyogaGlnaCAxNiBiaXQgaXMgd2lkdGgsIGxvdyAxNiBiaXQgaXMgaGVpZ2h0ICovCisJCQlody0+aDI2NF9hciA9CisJCQkJKChody0+dmgyNjRfcmF0aW8gJiAweGZmZmYpICoKKwkJCQkJaHctPmZyYW1lX2hlaWdodCAqIDB4MTAwICsKKwkJCQkgKGh3LT52aDI2NF9yYXRpbyA+PiAxNikgKgorCQkJCSBody0+ZnJhbWVfd2lkdGggLyAyKSAvCisJCQkJKChody0+dmgyNjRfcmF0aW8gPj4gMTYpICoKKwkJCQkJaHctPmZyYW1lX3dpZHRoKTsKKwkJCWh3LT5oZWlnaHRfYXNwZWN0X3JhdGlvID0gMTsKKwkJCWh3LT53aWR0aF9hc3BlY3RfcmF0aW8gPSAxOworCQl9IGVsc2UgeworCQkJaHctPmgyNjRfYXIgPSAweDNmZjsKKwkJCWh3LT5oZWlnaHRfYXNwZWN0X3JhdGlvID0gMTsKKwkJCWh3LT53aWR0aF9hc3BlY3RfcmF0aW8gPSAxOworCQl9CisJfQorCisJaWYgKGh3LT5wdHNfdW5zdGFibGUgJiYgKGh3LT5maXhlZF9mcmFtZV9yYXRlX2ZsYWcgPT0gMCkpIHsKKwkJaWYgKCgoaHctPmZyYW1lX2R1ciA9PSBSQVRFXzIzOTdfRlBTKQorCQkmJiAoZGVjX2NvbnRyb2wKKwkJJiBERUNfQ09OVFJPTF9GTEFHX0ZPUkNFX1JBVEVfMjM5N19GUFNfRklYX0ZSQU1FX1JBVEUpKQorCQkJfHwgKChSQVRFXzI5OTdfRlBTID09CisJCQlody0+ZnJhbWVfZHVyKSAmJgorCQkoZGVjX2NvbnRyb2wgJgorCQkJREVDX0NPTlRST0xfRkxBR19GT1JDRV9SQVRFXzI5OTdfRlBTX0ZJWF9GUkFNRV9SQVRFKSkpIHsKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RFQ19ERVRBSUwsCisJCQkJImZvcmNlIGZpeCBmcmFtZSByYXRlXG4iKTsKKwkJCWh3LT5maXhlZF9mcmFtZV9yYXRlX2ZsYWcgPSAweDQwOworCQl9CisJfQorCisJLyp2aWRlb19zaWduYWxfZnJvbV92dWk6IHRvIGRvIC4uICovCit9CisKK3N0YXRpYyB2b2lkIGJ1Zm1ncl9yZWNvdmVyKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcpCit7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSAmaHctPmRwYjsKKworCWJ1Zm1ncl9oMjY0X3JlbW92ZV91bnVzZWRfZnJhbWUocF9IMjY0X0RwYiwgMik7CisJaWYgKGh3LT5lcnJvcl9wcm9jX3BvbGljeSAmIDB4MjApIHsKKwkJaWYgKCFody0+aXNfdXNlZF92NGwpCisJCQlody0+cmVzZXRfYnVmbWdyX2ZsYWcgPSAxOworCX0KK30KKwordm9pZCBidWZtZ3JfZm9yY2VfcmVjb3ZlcihzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYikKK3sKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0KKwkJY29udGFpbmVyX29mKHBfSDI2NF9EcGIsIHN0cnVjdCB2ZGVjX2gyNjRfaHdfcywgZHBiKTsKKworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAkiY2FsbCAlc1xuIiwgX19mdW5jX18pOworCisJYnVmbWdyX2gyNjRfcmVtb3ZlX3VudXNlZF9mcmFtZShwX0gyNjRfRHBiLCAyKTsKKwlody0+cmVzZXRfYnVmbWdyX2ZsYWcgPSAxOworfQorCisjaWZkZWYgQ09OU1RSQUlOX01BWF9CVUZfTlVNCitzdGF0aWMgaW50IGdldF92Zl9yZWZfb25seV9idWZfY291bnQoc3RydWN0IHZkZWNfaDI2NF9od19zICpodykKK3sKKwlpbnQgaTsKKwlpbnQgY291bnQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBCVUZTUEVDX1BPT0xfU0laRTsgaSsrKSB7CisJCWlmIChpc19idWZfc3BlY19pbl9kaXNwX3EoaHcsIGkpICYmCisJCQlody0+YnVmZmVyX3NwZWNbaV0udmZfcmVmID4gMCkKKwkJCWNvdW50Kys7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBnZXRfdXNlZF9idWZfY291bnQoc3RydWN0IHZkZWNfaDI2NF9od19zICpodykKK3sKKwlpbnQgaTsKKwlpbnQgY291bnQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBCVUZTUEVDX1BPT0xfU0laRTsgaSsrKSB7CisJCWlmIChpc19idWZfc3BlY19pbl91c2UoaHcsIGkpKQorCQkJY291bnQrKzsKKwl9CisJcmV0dXJuIGNvdW50OworfQorI2VuZGlmCisKKworc3RhdGljIGJvb2wgaXNfYnVmZmVyX2F2YWlsYWJsZShzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCWJvb2wgYnVmZmVyX2F2YWlsYWJsZSA9IDE7CisJc3RydWN0IHZkZWNfaDI2NF9od19zICpodyA9IChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKikodmRlYy0+cHJpdmF0ZSk7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSAmaHctPmRwYjsKKwlzdHJ1Y3QgRGVjb2RlZFBpY3R1cmVCdWZmZXIgKnBfRHBiID0gJnBfSDI2NF9EcGItPm1EUEI7CisJaW50IGksIGZyYW1lX291dHNpZGVfY291bnQgPSAwLCBpbm5lcl9zaXplID0gMDsKKwlpZiAoKGtmaWZvX2xlbigmaHctPm5ld2ZyYW1lX3EpIDw9IDApIHx8CisJICAgICgoaHctPmNvbmZpZ19idWZtZ3JfZG9uZSkgJiYgKCFoYXZlX2ZyZWVfYnVmX3NwZWModmRlYykpKSB8fAorCSAgICAoKHBfSDI2NF9EcGItPm1EUEIuaW5pdF9kb25lKSAmJgorCSAgICAgKHBfSDI2NF9EcGItPm1EUEIudXNlZF9zaXplID49IChwX0gyNjRfRHBiLT5tRFBCLnNpemUgLSAxKSkgJiYKKwkgICAgIChpc190aGVyZV91bnVzZWRfZnJhbWVfZnJvbV9kcGIoJnBfSDI2NF9EcGItPm1EUEIpID09IDApKSkgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WREVDX0RFVEFJTCwKKwkJIiVzLCBlbXB0eSwgbmV3cSglZCksIGZyZWVfc3BlYyglZCksIGluaXRkb24oJWQpLCB1c2VkX3NpemUoJWQvJWQpLCB1bnVzZWRfZnJfZHBiKCVkKVxuIiwKKwkJX19mdW5jX18sCisJCWtmaWZvX2xlbigmaHctPm5ld2ZyYW1lX3EpLAorCQloYXZlX2ZyZWVfYnVmX3NwZWModmRlYyksCisJCXBfSDI2NF9EcGItPm1EUEIuaW5pdF9kb25lLAorCQlwX0gyNjRfRHBiLT5tRFBCLnVzZWRfc2l6ZSwgcF9IMjY0X0RwYi0+bURQQi5zaXplLAorCQlpc190aGVyZV91bnVzZWRfZnJhbWVfZnJvbV9kcGIoJnBfSDI2NF9EcGItPm1EUEIpCisJCSk7CisJCWJ1ZmZlcl9hdmFpbGFibGUgPSAwOworCQlpZiAoZHBiX2lzX2RlYnVnKERFQ09ERV9JRChodyksCisJCQlERUJVR19ESVNBQkxFX1JVTlJFQURZX1JNQlVGKSkKKwkJCXJldHVybiBidWZmZXJfYXZhaWxhYmxlOworCisJCWlmICgoaHctPmVycm9yX3Byb2NfcG9saWN5ICYgMHg0KSAmJgorCQkJKGh3LT5lcnJvcl9wcm9jX3BvbGljeSAmIDB4OCkpIHsKKwkJCWlmICgoa2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKSA8PSAwKSAmJgorCQkJKHBfSDI2NF9EcGItPm1EUEIudXNlZF9zaXplID49CisJCQkJKHBfSDI2NF9EcGItPm1EUEIuc2l6ZSAtIDEpKSAmJgorCQkJCShwX0RwYi0+cmVmX2ZyYW1lc19pbl9idWZmZXIgPgorCQkJCShpbWF4KAorCQkJCTEsIHBfRHBiLT5udW1fcmVmX2ZyYW1lcykKKwkJCQktIHBfRHBiLT5sdHJlZl9mcmFtZXNfaW5fYnVmZmVyICsKKwkJCQlmb3JjZV9zbGlkaW5nX21hcmdpbikpKXsKKwkJCQlidWZtZ3JfcmVjb3Zlcihodyk7CisJCQl9IGVsc2UgeworCQkJCWJ1Zm1ncl9oMjY0X3JlbW92ZV91bnVzZWRfZnJhbWUocF9IMjY0X0RwYiwgMSk7CisJCQl9CisJCX0gZWxzZSBpZiAoKGh3LT5lcnJvcl9wcm9jX3BvbGljeSAmIDB4NCkgJiYKKwkJCShrZmlmb19sZW4oJmh3LT5kaXNwbGF5X3EpIDw9IDApICYmCisJCQkoKHBfSDI2NF9EcGItPm1EUEIudXNlZF9zaXplID49CisJCQkJKHBfSDI2NF9EcGItPm1EUEIuc2l6ZSAtIDEpKSB8fAorCQkJKCFoYXZlX2ZyZWVfYnVmX3NwZWModmRlYykpKSAmJgorCQkJKGh3LT5kaXNjYXJkX2R2X2RhdGEpKSB7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5idWZzcGVjX2xvY2ssIGZsYWdzKTsKKworCQkJZm9yIChpID0gMDsgaSA8IHBfRHBiLT51c2VkX3NpemU7IGkrKykgeworCQkJCWlmIChwX0RwYi0+ZnNbaV0tPnByZV9vdXRwdXQpCisJCQkJCWZyYW1lX291dHNpZGVfY291bnQrKzsKKwkJCQllbHNlIGlmIChwX0RwYi0+ZnNbaV0tPmlzX291dHB1dCAmJiAhaXNfdXNlZF9mb3JfcmVmZXJlbmNlKHBfRHBiLT5mc1tpXSkpIHsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmJ1ZnNwZWNfbG9jaywgZmxhZ3MpOworCQkJCQlidWZtZ3JfaDI2NF9yZW1vdmVfdW51c2VkX2ZyYW1lKHBfSDI2NF9EcGIsIDApOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+YnVmc3BlY19sb2NrLCBmbGFncyk7CisJCQlpbm5lcl9zaXplID0gcF9EcGItPnNpemUgLSBmcmFtZV9vdXRzaWRlX2NvdW50OworCisJCQlpZiAoaW5uZXJfc2l6ZSA+PSBwX0gyNjRfRHBiLT5kZWNfZHBiX3NpemUpIHsKKwkJCQlpZiAocF9IMjY0X0RwYi0+bURQQi51c2VkX3NpemUgPj0KKwkJCQkJcF9IMjY0X0RwYi0+bURQQi5zaXplKSB7CisJCQkJCWJ1Zm1ncl9yZWNvdmVyKGh3KTsKKwkJCQl9IGVsc2UgaWYgKHBfSDI2NF9EcGItPm1EUEIudXNlZF9zaXplID49CisJCQkJCShwX0gyNjRfRHBiLT5tRFBCLnNpemUgLSAxKSkgeworCQkJCQlpZiAoaW5uZXJfc2l6ZSA+IHBfSDI2NF9EcGItPmRlY19kcGJfc2l6ZSkgeworCQkJCQkJYnVmbWdyX3JlY292ZXIoaHcpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnVmbWdyX2gyNjRfcmVtb3ZlX3VudXNlZF9mcmFtZShwX0gyNjRfRHBiLCAwKTsKKwkJfSBlbHNlIGlmICgoaHctPmVycm9yX3Byb2NfcG9saWN5ICYgMHg4KSAmJgorCQkJKHBfRHBiLT5yZWZfZnJhbWVzX2luX2J1ZmZlciA+CisJCQkoaW1heCgKKwkJCTEsIHBfRHBiLT5udW1fcmVmX2ZyYW1lcykKKwkJCS0gcF9EcGItPmx0cmVmX2ZyYW1lc19pbl9idWZmZXIgKworCQkJZm9yY2Vfc2xpZGluZ19tYXJnaW4pKSkKKwkJCWJ1Zm1ncl9yZWNvdmVyKGh3KTsKKwkJZWxzZQorCQkJYnVmbWdyX2gyNjRfcmVtb3ZlX3VudXNlZF9mcmFtZShwX0gyNjRfRHBiLCAxKTsKKworCQlpZiAoaHctPnJlc2V0X2J1Zm1ncl9mbGFnID09IDEpCisJCQlidWZmZXJfYXZhaWxhYmxlID0gMTsKKwl9CisKKwlpZiAoaHctPmlzX3VzZWRfdjRsKQorCQlidWZmZXJfYXZhaWxhYmxlID0gaGF2ZV9mcmVlX2J1Zl9zcGVjKHZkZWMpOworCisJcmV0dXJuIGJ1ZmZlcl9hdmFpbGFibGU7Cit9CisKKyNkZWZpbmUgQVVYX1RBR19TRUkJCQkJMHgyCisKKyNkZWZpbmUgU0VJX0JVRkZFUklOR19QRVJJT0QJMAorI2RlZmluZSBTRUlfUGljVGltaW5nCQkJMQorI2RlZmluZSBTRUlfVVNFUl9EQVRBCQkJNAorI2RlZmluZSBTRUlfUkVDT1ZFUllfUE9JTlQJCTYKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjpSZWFkcyBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSBidWZmZXIKKyAqIElucHV0OgorCWJ5dGUgYnVmZmVyW10KKwkJY29udGFpbmluZyBzZWkgbWVzc2FnZSBkYXRhIGJpdHMKKwlpbnQgdG90Yml0b2Zmc2V0CisJCWJpdCBvZmZzZXQgZnJvbSBzdGFydCBvZiBwYXJ0aXRpb24KKwlpbnQgYnl0ZWNvdW50CisJCXRvdGFsIGJ5dGVzIGluIGJpdHN0cmVhbQorCWludCBudW1iaXRzCisJCW51bWJlciBvZiBiaXRzIHRvIHJlYWQKKyAqIE91dHB1dDoKKwlpbnQgKmluZm8KKyAqIFJldHVybjoKKwktMTogZmFpbGVkCisJPiAwOiB0aGUgY291bnQgb2YgYml0IHJlYWQKKyAqIEF0dGVudGlvbjoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworc3RhdGljIGludCBnZXRfYml0cyh1bnNpZ25lZCBjaGFyIGJ1ZmZlcltdLAorCQkJCQlpbnQgdG90Yml0b2Zmc2V0LAorCQkJCQlpbnQgKmluZm8sCisJCQkJCWludCBieXRlY291bnQsCisJCQkJCWludCBudW1iaXRzKQoreworCXJlZ2lzdGVyIGludCBpbmY7CisJbG9uZyBieXRlb2Zmc2V0OworCWludCBiaXRvZmZzZXQ7CisKKwlpbnQgYml0Y291bnRlciA9IG51bWJpdHM7CisKKwlieXRlb2Zmc2V0ID0gdG90Yml0b2Zmc2V0IC8gODsKKwliaXRvZmZzZXQgPSA3IC0gKHRvdGJpdG9mZnNldCAlIDgpOworCisJaW5mID0gMDsKKwl3aGlsZSAobnVtYml0cykgeworCQlpbmYgPDw9IDE7CisJCWluZiB8PSAoYnVmZmVyW2J5dGVvZmZzZXRdICYgKDB4MDEgPDwgYml0b2Zmc2V0KSkgPj4gYml0b2Zmc2V0OworCQludW1iaXRzLS07CisJCWJpdG9mZnNldC0tOworCQlpZiAoYml0b2Zmc2V0IDwgMCkgeworCQkJYnl0ZW9mZnNldCsrOworCQkJYml0b2Zmc2V0ICs9IDg7CisJCQlpZiAoYnl0ZW9mZnNldCA+IGJ5dGVjb3VudCkKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwkqaW5mbyA9IGluZjsKKworCisJcmV0dXJuIGJpdGNvdW50ZXI7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfb25lX3NlaV9yZWNvcmQoc3RydWN0IHZkZWNfaDI2NF9od19zICpodywKKwkJCQkJCQl1OCAqc2VpX2RhdGFfYnVmLAorCQkJCQkJCXU4ICpzZWlfZGF0YV9idWZfZW5kKQoreworCWludCBwYXlsb2FkX3R5cGU7CisJaW50IHBheWxvYWRfc2l6ZTsKKwl1OCAqcF9zZWk7CisJaW50IHRlbXAgPSAwOworCWludCBiaXRfb2Zmc2V0OworCWludCByZWFkX3NpemU7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSAmaHctPmRwYjsKKworCXBfc2VpID0gc2VpX2RhdGFfYnVmOworCXJlYWRfc2l6ZSA9IDA7CisJcGF5bG9hZF90eXBlID0gMDsKKwlkbyB7CisJCWlmIChwX3NlaSA+PSBzZWlfZGF0YV9idWZfZW5kKQorCQkJcmV0dXJuIHJlYWRfc2l6ZTsKKworCQlwYXlsb2FkX3R5cGUgKz0gKnBfc2VpOworCQlyZWFkX3NpemUrKzsKKwl9IHdoaWxlICgqcF9zZWkrKyA9PSAyNTUpOworCisKKwlwYXlsb2FkX3NpemUgPSAwOworCWRvIHsKKwkJaWYgKHBfc2VpID49IHNlaV9kYXRhX2J1Zl9lbmQpCisJCQlyZXR1cm4gcmVhZF9zaXplOworCisJCXBheWxvYWRfc2l6ZSArPSAqcF9zZWk7CisJCXJlYWRfc2l6ZSsrOworCX0gd2hpbGUgKCpwX3NlaSsrID09IDI1NSk7CisKKworCWlmIChwX3NlaSArIHBheWxvYWRfc2l6ZSA+IHNlaV9kYXRhX2J1Zl9lbmQpIHsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJCSIlczogcGF5bG9hZF90eXBlID0gJWQsIHBheWxvYWRfc2l6ZSA9ICVkIGlzIG92ZXJcbiIsCisJCQlfX2Z1bmNfXywgcGF5bG9hZF90eXBlLCBwYXlsb2FkX3NpemUpOworCQlyZXR1cm4gcmVhZF9zaXplOworCX0KKwliaXRfb2Zmc2V0ID0gMDsKKworCWlmIChwYXlsb2FkX3NpemUgPD0gMCkgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19EUEJfREVUQUlMLAorCQkJIiVzIHdhcm5pbmc6IHRoaXMgaXMgYSBudWxsIHNlaSBtZXNzYWdlIGZvciBwYXlsb2FkX3R5cGUgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCBwYXlsb2FkX3R5cGUpOworCQlyZXR1cm4gcmVhZF9zaXplOworCX0KKwlwX0gyNjRfRHBiLT52dWlfc3RhdHVzID0gcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtWVUlfU1RBVFVTXTsKKwlzd2l0Y2ggKHBheWxvYWRfdHlwZSkgeworCWNhc2UgU0VJX0JVRkZFUklOR19QRVJJT0Q6CisJCWJyZWFrOworCWNhc2UgU0VJX1BpY1RpbWluZzoKKwkJaWYgKHBfSDI2NF9EcGItPnZ1aV9zdGF0dXMgJiAweGMpIHsKKwkJCWludCBjcGJfcmVtb3ZhbF9kZWxheTsKKwkJCWludCBkcGJfb3V0cHV0X2RlbGF5OworCQkJdTMyIGRlbGF5X2xlbjsKKworCQkJZGVsYXlfbGVuID0gcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtERUxBWV9MRU5HVEhdOworCQkJY3BiX3JlbW92YWxfZGVsYXkKKwkJCQk9IChkZWxheV9sZW4gJiAweDFGKSArIDE7CisJCQlkcGJfb3V0cHV0X2RlbGF5CisJCQkJPSAoKGRlbGF5X2xlbiA+PiA1KSAmIDB4MUYpICsgMTsKKworCQkJZ2V0X2JpdHMocF9zZWksIGJpdF9vZmZzZXQsCisJCQkJJnRlbXAsIHBheWxvYWRfc2l6ZSwKKwkJCQlkcGJfb3V0cHV0X2RlbGF5K2NwYl9yZW1vdmFsX2RlbGF5KTsKKwkJCWJpdF9vZmZzZXQgKz0gZHBiX291dHB1dF9kZWxheStjcGJfcmVtb3ZhbF9kZWxheTsKKwkJfQorCQlpZiAocF9IMjY0X0RwYi0+dnVpX3N0YXR1cyAmIDB4MTApIHsKKwkJCWdldF9iaXRzKHBfc2VpLCBiaXRfb2Zmc2V0LCAmdGVtcCwgcGF5bG9hZF9zaXplLCA0KTsKKwkJCWJpdF9vZmZzZXQgKz0gNDsKKwkJCXBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbUElDVFVSRV9TVFJVQ1RdID0gdGVtcDsKKwkJfQorCQlicmVhazsKKwljYXNlIFNFSV9VU0VSX0RBVEE6CisJCWlmIChlbmFibGVfaXR1X3QzNSkgeworCQkJaW50IGk7CisJCQlpbnQgajsKKwkJCWludCBkYXRhX2xlbjsKKwkJCXU4ICp1c2VyX2RhdGFfYnVmOworCisJCQl1c2VyX2RhdGFfYnVmCisJCQkJPSBody0+c2VpX2l0dV9kYXRhX2J1ZiArIGh3LT5zZWlfaXR1X2RhdGFfbGVuOworCQkJLyogdXNlciBkYXRhIGxlbmd0aCBzaG91bGQgYmUgYWxpZ24gd2l0aCA4IGJ5dGVzLAorCQkJaWYgbm90LCB0aGVuIHBhZGRpbmcgd2l0aCB6ZXJvKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBwYXlsb2FkX3NpemU7IGkgKz0gOCkgeworCQkJCWlmIChody0+c2VpX2l0dV9kYXRhX2xlbiArIGkgPj0gU0VJX0lUVV9EQVRBX1NJWkUpCisJCQkJCWJyZWFrOyAvLyBBdm9pZCBvdXQtb2YtYm91bmQgd3JpdGluZworCQkJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKwkJCQkJaW50IGluZGV4OworCisJCQkJCWluZGV4ID0gaSs3LWo7CisJCQkJCWlmIChpbmRleCA+PSBwYXlsb2FkX3NpemUpCisJCQkJCQl1c2VyX2RhdGFfYnVmW2kral0gPSAwOworCQkJCQllbHNlCisJCQkJCQl1c2VyX2RhdGFfYnVmW2kral0KKwkJCQkJCQk9IHBfc2VpW2krNy1qXTsKKwkJCQl9CisJCQl9CisKKwkJCWRhdGFfbGVuID0gcGF5bG9hZF9zaXplOworCQkJaWYgKHBheWxvYWRfc2l6ZSAlIDgpCisJCQkJZGF0YV9sZW4gPSAoKHBheWxvYWRfc2l6ZSArIDgpID4+IDMpIDw8IDM7CisKKwkJCWh3LT5zZWlfaXR1X2RhdGFfbGVuICs9IGRhdGFfbGVuOworCQkJaWYgKGh3LT5zZWlfaXR1X2RhdGFfbGVuID49IFNFSV9JVFVfREFUQV9TSVpFKQorCQkJCWh3LT5zZWlfaXR1X2RhdGFfbGVuID0gU0VJX0lUVV9EQVRBX1NJWkU7CisJCQkvKgorCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkJIiVzOiB1c2VyIGRhdGEsIGFuZCBsZW4gPSAlZDpcbiIsCisJCQkJX19mdW5jX18sIGh3LT5zZWlfaXR1X2RhdGFfbGVuKTsKKwkJCSovCisJCX0KKwkJYnJlYWs7CisJY2FzZSBTRUlfUkVDT1ZFUllfUE9JTlQ6CisJCXBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbUkVDT1ZFUllfUE9JTlRdID0gMTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJlYWRfc2l6ZSArIHBheWxvYWRfc2l6ZTsKK30KKworc3RhdGljIHZvaWQgcGFyc2Vfc2VpX2RhdGEoc3RydWN0IHZkZWNfaDI2NF9od19zICpodywKKwkJCQkJCQl1OCAqc2VpX2RhdGFfYnVmLAorCQkJCQkJCWludCBsZW4pCit7CisJY2hhciAqcF9zZWk7CisJY2hhciAqcF9zZWlfZW5kOworCWludCBwYXJzZWRfc2l6ZTsKKwlpbnQgcmVhZF9zaXplOworCisKKwlwX3NlaSA9IHNlaV9kYXRhX2J1ZjsKKwlwX3NlaV9lbmQgPSBwX3NlaSArIGxlbjsKKwlwYXJzZWRfc2l6ZSA9IDA7CisJd2hpbGUgKHBhcnNlZF9zaXplIDwgbGVuKSB7CisJCXJlYWRfc2l6ZSA9IHBhcnNlX29uZV9zZWlfcmVjb3JkKGh3LCBwX3NlaSwgcF9zZWlfZW5kKTsKKwkJcF9zZWkgKz0gcmVhZF9zaXplOworCQlwYXJzZWRfc2l6ZSArPSByZWFkX3NpemU7CisJCWlmICgqcF9zZWkgPT0gMHg4MCkgeworCQkJcF9zZWkrKzsKKwkJCXBhcnNlZF9zaXplKys7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2RlY29kZWRfcGljX2Vycm9yKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcpCit7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSAmaHctPmRwYjsKKwlzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpwID0gcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlOworCXVuc2lnbmVkIG1ieV9tYnggPSBSRUFEX1ZSRUcoTUJZX01CWCk7CisJdW5zaWduZWQgbWJfdG90YWwgPSAoaHctPnNlcV9pbmZvMiA+PiA4KSAmIDB4ZmZmZjsKKwl1bnNpZ25lZCBtYl93aWR0aCA9IGh3LT5zZXFfaW5mbzIgJiAweGZmOworCXVuc2lnbmVkIGRlY29kZV9tYl9jb3VudDsKKwlpZiAoIW1iX3dpZHRoICYmIG1iX3RvdGFsKSAvKmZvciA0azJrKi8KKwkJbWJfd2lkdGggPSAyNTY7CisJZGVjb2RlX21iX2NvdW50ID0gKChtYnlfbWJ4ICYgMHhmZikgKiBtYl93aWR0aCArCisJCSgoKG1ieV9tYnggPj4gOCkgJiAweGZmKSArIDEpKTsKKwlpZiAoKG1ieV9tYnggPT0gMCkgJiYgKHBfSDI2NF9EcGItPmRlY19kcGJfc3RhdHVzICE9IEgyNjRfU0xJQ0VfSEVBRF9ET05FKSkgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSJtYnlfbWJ4IGlzIHplcm9cbiIpOworCQlyZXR1cm47CisJfQorCWlmIChnZXRfY3VyX3NsaWNlX3BpY3R1cmVfc3RydWN0KHBfSDI2NF9EcGIpICE9IEZSQU1FKQorCQltYl90b3RhbCAvPSAyOworCisJaWYgKChody0+ZXJyb3JfcHJvY19wb2xpY3kgJiAweDIwMCkgJiYKKwkJUkVBRF9WUkVHKEVSUk9SX1NUQVRVU19SRUcpICE9IDApIHsKKwkJcC0+ZGF0YV9mbGFnIHw9IEVSUk9SX0ZMQUc7CisJfQorCisJaWYgKGVycm9yX3Byb2NfcG9saWN5ICYgMHgxMDAgJiYgIShwLT5kYXRhX2ZsYWcgJiBFUlJPUl9GTEFHKSkgeworCQlpZiAoZGVjb2RlX21iX2NvdW50IDwgbWJfdG90YWwpIHsKKwkJCXAtPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOworCQkJaWYgKCgoZXJyb3JfcHJvY19wb2xpY3kgJiAweDIwMDAwKSAmJgorCQkJCWRlY29kZV9tYl9jb3VudCA+PSBtYl90b3RhbCAqICgxMDAgLSBtYl9jb3VudF90aHJlc2hvbGQpIC8gMTAwKSkgeworCQkJCXAtPmRhdGFfZmxhZyAmPSB+RVJST1JfRkxBRzsKKwkJCX0KKwkJfQorCX0KKworCWlmICgoaHctPmVycm9yX3Byb2NfcG9saWN5ICYgMHgxMDAwMDApICYmCisJCQlody0+bGFzdF9kZWNfcGljdHVyZSAmJgorCQkJCShody0+bGFzdF9kZWNfcGljdHVyZS0+c2xpY2VfdHlwZSA9PSBJX1NMSUNFKSAmJgorCQkJCShody0+ZHBiLm1TbGljZS5zbGljZV90eXBlID09IFBfU0xJQ0UpKSB7CisJCWlmICgocC0+ZGF0YV9mbGFnICYgRVJST1JfRkxBRykgJiYKKwkJCQkoZGVjb2RlX21iX2NvdW50ID49IG1iX3RvdGFsKSkgeworCQkJCWh3LT5pcF9maWVsZF9lcnJvcl9jb3VudCsrOworCQkJCWlmIChody0+aXBfZmllbGRfZXJyb3JfY291bnQgPT0gNCkgeworCQkJCQl1bnNpZ25lZCBpbnQgaTsKKwkJCQkJc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYiA9ICZwX0gyNjRfRHBiLT5tRFBCOworCQkJCQlmb3IgKGkgPSAwOyBpIDwgcF9EcGItPnJlZl9mcmFtZXNfaW5fYnVmZmVyOyBpKyspIHsKKwkJCQkJCWlmIChwX0RwYi0+ZnNfcmVmW2ldLT50b3BfZmllbGQpCisJCQkJCQkJcF9EcGItPmZzX3JlZltpXS0+dG9wX2ZpZWxkLT5kYXRhX2ZsYWcgJj0gfkVSUk9SX0ZMQUc7CisJCQkJCQlpZiAocF9EcGItPmZzX3JlZltpXS0+Ym90dG9tX2ZpZWxkKQorCQkJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmJvdHRvbV9maWVsZC0+ZGF0YV9mbGFnICY9IH5FUlJPUl9GTEFHOworCQkJCQkJaWYgKHBfRHBiLT5mc19yZWZbaV0tPmZyYW1lKQorCQkJCQkJCXBfRHBiLT5mc19yZWZbaV0tPmZyYW1lLT5kYXRhX2ZsYWcgJj0gfkVSUk9SX0ZMQUc7CisJCQkJCX0KKwkJCQkJaHctPmlwX2ZpZWxkX2Vycm9yX2NvdW50ID0gMDsKKwkJCQkJcC0+ZGF0YV9mbGFnICY9IH5FUlJPUl9GTEFHOworCQkJCQlody0+ZGF0YV9mbGFnICY9IH5FUlJPUl9GTEFHOworCQkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCQkJCSJjbGVhciBhbGwgcmVmIGZyYW1lIGVycm9yIGZsYWdcbiIpOworCQkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChody0+aXBfZmllbGRfZXJyb3JfY291bnQgPiAwKQorCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJCQkiY2xlYXIgZXJyb3IgY291bnQgJWRcbiIsIGh3LT5pcF9maWVsZF9lcnJvcl9jb3VudCk7CisJCQlody0+aXBfZmllbGRfZXJyb3JfY291bnQgPSAwOworCQl9CisJfQorCisJaWYgKHAtPmRhdGFfZmxhZyAmIEVSUk9SX0ZMQUcpIHsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRVJST1JGTEFHX0RCRywKKwkJCSIlczogZGVjb2RlIGVycm9yLCBzZXFfaW5mbzIgMHgleCwgbWJ5X21ieCAweCV4LCBtYl90b3RhbCAlZCBkZWNvZGVkIG1iX2NvdW50ICVkIEVSUk9SX1NUQVRVU19SRUcgMHgleFxuIiwKKwkJCV9fZnVuY19fLAorCQkJaHctPnNlcV9pbmZvMiwKKwkJCW1ieV9tYngsCisJCQltYl90b3RhbCwKKwkJCWRlY29kZV9tYl9jb3VudCwKKwkJCVJFQURfVlJFRyhFUlJPUl9TVEFUVVNfUkVHKQorCQkJKTsKKworCX0KK30KKworc3RhdGljIGludCB2aDI2NF9waWNfZG9uZV9wcm9jKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IHZkZWNfaDI2NF9od19zICpodyA9IChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKikodmRlYy0+cHJpdmF0ZSk7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSAmaHctPmRwYjsKKwlpbnQgcmV0OworCWludCBpOworCXN0cnVjdCBEZWNvZGVkUGljdHVyZUJ1ZmZlciAqcF9EcGIgPSAmcF9IMjY0X0RwYi0+bURQQjsKKworCWlmICh2ZGVjLT5tdmZybSkKKwkJdmRlYy0+bXZmcm0tPmh3X2RlY29kZV90aW1lID0KKwkJbG9jYWxfY2xvY2soKSAtIHZkZWMtPm12ZnJtLT5od19kZWNvZGVfc3RhcnQ7CisKKwlpZiAoaW5wdXRfZnJhbWVfYmFzZWQodmRlYykgJiYKKwkJCSghKGh3LT5pX29ubHkgJiAweDIpKSAmJgorCQkJZnJtYmFzZV9jb250X2JpdGxldmVsICE9IDAgJiYKKwkJCVJFQURfVlJFRyhWSUZGX0JJVF9DTlQpID4KKwkJCWZybWJhc2VfY29udF9iaXRsZXZlbCkgeworCQkJLypoYW5kbGUgdGhlIGNhc2U6IG11bHRpIHBpY3R1cmVzIGluIG9uZSBwYWNrZXQqLworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkiJXMgSDI2NF9QSUNfREFUQV9ET05FIGRlY29kZSBzbGljZSBjb3VudCAlZCwgY29udGludWUgKGJpdGNudCAweCV4KVxuIiwKKwkJCV9fZnVuY19fLAorCQkJaHctPmRlY29kZV9waWNfY291bnQsCisJCQlSRUFEX1ZSRUcoVklGRl9CSVRfQ05UKSk7CisJCQlody0+ZnJtYmFzZV9jb250X2ZsYWcgPSAxOworCQl9IGVsc2UKKwkJCWh3LT5mcm1iYXNlX2NvbnRfZmxhZyA9IDA7CisKKwkJaWYgKHBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZSkgeworCQkJZ2V0X3BpY3R1cmVfcW9zX2luZm8ocF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlKTsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCQkJREVMX0VYSVNUKGh3LAorCQkJCXBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZSkgPSAwOworCQkJaWYgKHZkZWMtPm1hc3RlcikgeworCQkJCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHdfYmEgPQorCQkJCShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKikKKwkJCQkJdmRlYy0+bWFzdGVyLT5wcml2YXRlOworCQkJCWlmIChod19iYS0+bGFzdF9kZWNfcGljdHVyZSkKKwkJCQkJREVMX0VYSVNUKGh3X2JhLAorCQkJCQkJaHdfYmEtPmxhc3RfZGVjX3BpY3R1cmUpCisJCQkJCQk9IDE7CisJCQl9CisjZW5kaWYKKwkJCW11dGV4X2xvY2soJmh3LT5jaHVua3NfbXV0ZXgpOworCQkJaWYgKGh3LT5jaHVuaykgeworCQkJCXBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZS0+cHRzID0KKwkJCQkJaHctPmNodW5rLT5wdHM7CisJCQkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlLT5wdHM2NCA9CisJCQkJCWh3LT5jaHVuay0+cHRzNjQ7CisJCQkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlLT50aW1lc3RhbXAgPQorCQkJCQlody0+Y2h1bmstPnRpbWVzdGFtcDsKKyNpZmRlZiBNSDI2NF9VU0VSREFUQV9FTkFCTEUKKwkJCQl2bWgyNjRfdWRjX2ZpbGxfdnB0cyhodywKKwkJCQkJcF9IMjY0X0RwYi0+bVNsaWNlLnNsaWNlX3R5cGUsCisJCQkJCWh3LT5jaHVuay0+cHRzLCAxKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwkJCX0gZWxzZSBpZiAodmRlYy0+bWFzdGVyKSB7CisJCQkJLypkdiBlbmhhbmNlIGxheWVyLAorCQkJCWRvIG5vdCBjaGVja291dCBwdHMqLworCQkJCXN0cnVjdCBTdG9yYWJsZVBpY3R1cmUgKnBpYyA9CisJCQkJCXBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZTsKKwkJCQlwaWMtPnB0cyA9IDA7CisJCQkJcGljLT5wdHM2NCA9IDA7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCQlzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpwaWMgPQorCQkJCQlwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmU7CisJCQkJdTMyIG9mZnNldCA9IHBpYy0+b2Zmc2V0X2RlbGltaXRlcjsKKwkJCQlwaWMtPnBpY19zaXplID0gKGh3LT5zdGFydF9iaXRfY250IC0gUkVBRF9WUkVHKFZJRkZfQklUX0NOVCkpID4+IDM7CisJCQkJaWYgKHB0c19waWNrb3V0X29mZnNldF91czY0KFBUU19UWVBFX1ZJREVPLAorCQkJCQlvZmZzZXQsICZwaWMtPnB0cywgMCwgJnBpYy0+cHRzNjQpKSB7CisJCQkJCXBpYy0+cHRzID0gMDsKKwkJCQkJcGljLT5wdHM2NCA9IDA7CisjaWZkZWYgTUgyNjRfVVNFUkRBVEFfRU5BQkxFCisJCQkJCXZtaDI2NF91ZGNfZmlsbF92cHRzKGh3LAorCQkJCQkJcF9IMjY0X0RwYi0+bVNsaWNlLnNsaWNlX3R5cGUsCisJCQkJCQlwaWMtPnB0cywgMCk7CisjZW5kaWYKKwkJCQl9IGVsc2UgeworI2lmZGVmIE1IMjY0X1VTRVJEQVRBX0VOQUJMRQorCQkJCQl2bWgyNjRfdWRjX2ZpbGxfdnB0cyhodywKKwkJCQkJCXBfSDI2NF9EcGItPm1TbGljZS5zbGljZV90eXBlLAorCQkJCQkJcGljLT5wdHMsIDEpOworI2VuZGlmCisJCQkJfQorCisJfQorCQkJbXV0ZXhfdW5sb2NrKCZody0+Y2h1bmtzX211dGV4KTsKKworCQkJY2hlY2tfZGVjb2RlZF9waWNfZXJyb3IoaHcpOworI2lmZGVmIEVSUk9SX0hBTkRMRV9URVNUCisJCQlpZiAoKGh3LT5kYXRhX2ZsYWcgJiBFUlJPUl9GTEFHKQorCQkJCSYmIChody0+ZXJyb3JfcHJvY19wb2xpY3kgJiAweDgwKSkgeworCQkJCXJlbGVhc2VfY3VyX2RlY29kaW5nX2J1Zihodyk7CisJCQkJaDI2NF9jbGVhcl9kcGIoaHcpOworCQkJCWh3LT5kZWNfZmxhZyA9IDA7CisJCQkJaHctPmRhdGFfZmxhZyA9IDA7CisJCQkJaHctPnNraXBfZnJhbWVfY291bnQgPSAwOworCQkJCWh3LT5oYXNfaV9mcmFtZSA9IDA7CisJCQkJaHctPm5vX2Vycm9yX2NvdW50ID0gMHhmZmY7CisJCQkJaHctPm5vX2Vycm9yX2lfY291bnQgPSAweGY7CisJCQl9IGVsc2UKKyNlbmRpZgorCQkJaWYgKGh3LT5lcnJvcl9wcm9jX3BvbGljeSAmIDB4MjAwMDAwKSB7CisJCQkJaWYgKCFody0+bG9vcF9mbGFnKSB7CisJCQkJCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+dXNlZF9zaXplOyBpKyspIHsKKwkJCQkJCWlmICgocF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlLT5wb2MgKyBsb29wX3BsYXliYWNrX3BvY190aHJlc2hvbGQgPCBwX0RwYi0+ZnNbaV0tPnBvYykgJiYKKwkJCQkJCQkJIXBfRHBiLT5mc1tpXS0+aXNfb3V0cHV0ICYmCisJCQkJCQkJCSFwX0RwYi0+ZnNbaV0tPnByZV9vdXRwdXQpIHsKKwkJCQkJCQlody0+bG9vcF9mbGFnID0gMTsKKwkJCQkJCQlody0+bG9vcF9sYXN0X3BvYyA9IHBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZS0+cG9jOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKChwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPnBvYyA+PSBody0+bG9vcF9sYXN0X3BvYyAtIHBvY190aHJlc2hvbGQpICYmCisJCQkJCQkocF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlLT5wb2MgPD0gaHctPmxvb3BfbGFzdF9wb2MgKyBwb2NfdGhyZXNob2xkKSkgeworCQkJCQkJaWYgKGh3LT5sb29wX2ZsYWcgPj0gNSkgeworCQkJCQkJCWZvciAoaSA9IDA7IGkgPCBwX0RwYi0+dXNlZF9zaXplOyBpKyspIHsKKwkJCQkJCQkJaWYgKChody0+bG9vcF9sYXN0X3BvYyArIGxvb3BfcGxheWJhY2tfcG9jX3RocmVzaG9sZCA8IHBfRHBiLT5mc1tpXS0+cG9jKSAmJgorCQkJCQkJCQkJCSFwX0RwYi0+ZnNbaV0tPmlzX291dHB1dCAmJgorCQkJCQkJCQkJCSFwX0RwYi0+ZnNbaV0tPnByZV9vdXRwdXQpIHsKKwkJCQkJCQkJCXBfRHBiLT5mc1tpXS0+aXNfb3V0cHV0ID0gMTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQlody0+bG9vcF9mbGFnID0gMDsKKwkJCQkJCX0gZWxzZQorCQkJCQkJCWh3LT5sb29wX2ZsYWcrKzsKKwkJCQkJfSBlbHNlCisJCQkJCQlody0+bG9vcF9mbGFnID0gMDsKKwkJCQl9CisJCQl9CisJCQlwX0gyNjRfRHBiLT53YWl0X2F1eF9kYXRhX2ZsYWcgPSAoKCFody0+ZGlzY2FyZF9kdl9kYXRhKSAmJiAoaHctPmZybWJhc2VfY29udF9mbGFnKSk7CisJCQkJcmV0ID0gc3RvcmVfcGljdHVyZV9pbl9kcGIocF9IMjY0X0RwYiwKKwkJCQkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlLAorCQkJCQlody0+ZGF0YV9mbGFnIHwgaHctPmRlY19mbGFnIHwKKwkJCQlwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPmRhdGFfZmxhZyk7CisKKworCisJCQlpZiAocmV0ID09IC0xKSB7CisJCQkJcmVsZWFzZV9jdXJfZGVjb2RpbmdfYnVmKGh3KTsKKwkJCQlidWZtZ3JfZm9yY2VfcmVjb3ZlcihwX0gyNjRfRHBiKTsKKwkJCX0gZWxzZSBpZiAocmV0ID09IC0yKSB7CisJCQkJcmVsZWFzZV9jdXJfZGVjb2RpbmdfYnVmKGh3KTsKKwkJCX0gZWxzZSB7CisJCQlpZiAoaHctPmRhdGFfZmxhZyAmIEVSUk9SX0ZMQUcpIHsKKwkJCQlody0+bm9fZXJyb3JfY291bnQgPSAwOworCQkJCWh3LT5ub19lcnJvcl9pX2NvdW50ID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJaHctPm5vX2Vycm9yX2NvdW50Kys7CisJCQkJaWYgKGh3LT5kYXRhX2ZsYWcgJiBJX0ZMQUcpCisJCQkJCWh3LT5ub19lcnJvcl9pX2NvdW50Kys7CisJCQl9CisJCQlpZiAoaHctPm1tdV9lbmFibGUpCisJCQkJaGV2Y19zZXRfdW51c2VkXzRrX2J1ZmZfaWR4KGh3LAorCQkJCQlwX0gyNjRfRHBiLT5tVmlkZW8uCisJCQkJCQlkZWNfcGljdHVyZS0+YnVmX3NwZWNfbnVtKTsKKwkJCWJ1Zm1ncl9wb3N0KHBfSDI2NF9EcGIpOworCQkJCWh3LT5sYXN0X2RlY19waWN0dXJlID0KKwkJCQkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlOworCQkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlID0gTlVMTDsKKwkJCS8qIGR1bXBfZHBiKCZwX0gyNjRfRHBiLT5tRFBCKTsgKi8KKwkJCWh3LT5oYXNfaV9mcmFtZSA9IDE7CisJCQlpZiAoaHctPm1tdV9lbmFibGUpCisJCQkJaGV2Y19zZXRfZnJhbWVfZG9uZShodyk7CisJCQlody0+ZGVjb2RlX3BpY19jb3VudCsrOworCQkJcF9IMjY0X0RwYi0+ZGVjb2RlX3BpY19jb3VudCA9IGh3LT5kZWNvZGVfcGljX2NvdW50OworCQkJaWYgKGh3LT5za2lwX2ZyYW1lX2NvdW50ID4gMCkgeworCQkJCS8qc2tpcCBuIGZyYW1lIGFmdGVyIGZpcnN0IEkgKi8KKwkJCQlody0+c2tpcF9mcmFtZV9jb3VudC0tOworCQkJCWlmIChody0+c2tpcF9mcmFtZV9jb3VudCA9PSAwKQorCQkJCQlody0+ZGVjX2ZsYWcgJj0gKH5OT0RJU1BfRkxBRyk7CisJCQl9IGVsc2UgaWYgKGh3LT5za2lwX2ZyYW1lX2NvdW50IDwgLTEpIHsKKwkJCQkvKnNraXAgbiBmcmFtZSBhZnRlciBmaXJzdCBJIHVudGlsIHNlY29uZCBJICovCisJCQkJaHctPnNraXBfZnJhbWVfY291bnQrKzsKKwkJCQlpZiAoaHctPnNraXBfZnJhbWVfY291bnQgPT0gLTEpCisJCQkJCWh3LT5kZWNfZmxhZyAmPSAofk5PRElTUF9GTEFHKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB2aDI2NF9pc3JfdGhyZWFkX2ZuKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBpcnEpCit7CisJaW50IGk7CisJc3RydWN0IHZkZWNfaDI2NF9od19zICpodyA9IChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKikodmRlYy0+cHJpdmF0ZSk7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSAmaHctPmRwYjsKKwl1bnNpZ25lZCBpbnQgZGVjX2RwYl9zdGF0dXMgPSBwX0gyNjRfRHBiLT5kZWNfZHBiX3N0YXR1czsKKwl1MzIgZGVidWdfdGFnOworCisJaWYgKGRlY19kcGJfc3RhdHVzID09IEgyNjRfU0xJQ0VfSEVBRF9ET05FIHx8CisJCXBfSDI2NF9EcGItPmRlY19kcGJfc3RhdHVzID09IEgyNjRfQ09ORklHX1JFUVVFU1QpIHsKKwkJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX1RIUkVBRF9IRUFEX1NUQVJUKTsKKwl9CisJZWxzZSBpZiAoZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9QSUNfREFUQV9ET05FKSB7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9USFJFQURfUElDX0RPTkVfU1RBUlQpOworCX0KKwllbHNlIGlmIChkZWNfZHBiX3N0YXR1cyA9PSBIMjY0X1NFSV9EQVRBX1JFQURZKQorCQlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9JU1JfVEhSRUFEX1NFSV9TVEFSVCk7CisJZWxzZSBpZiAoZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9BVVhfREFUQV9SRUFEWSkKKwkJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX1RIUkVBRF9BVVhfU1RBUlQpOworCisJaWYgKGRlY19kcGJfc3RhdHVzID09IEgyNjRfQ09ORklHX1JFUVVFU1QpIHsKKyNpZiAxCisJCXVuc2lnbmVkIHNob3J0ICpwID0gKHVuc2lnbmVkIHNob3J0ICopaHctPmxtZW1fYWRkcjsKKwkJZm9yIChpID0gMDsgaSA8IChSUE1fRU5ELVJQTV9CRUdJTik7IGkgKz0gNCkgeworCQkJaW50IGlpOworCQkJZm9yIChpaSA9IDA7IGlpIDwgNDsgaWkrKykgeworCQkJCXBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbaStpaV0gPQorCQkJCQlwW2krMy1paV07CisJCQkJaWYgKGRwYl9pc19kZWJ1ZyhERUNPREVfSUQoaHcpLAorCQkJCQlSUklOVF9GTEFHX1JQTSkpIHsKKwkJCQkJaWYgKCgoaSArIGlpKSAmIDB4ZikgPT0gMCkKKwkJCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLAorCQkJCQkJCTAsICIlMDR4OiIsCisJCQkJCQkJaSk7CisJCQkJCWRwYl9wcmludF9jb250KERFQ09ERV9JRChodyksCisJCQkJCQkwLCAiJTA0eCAiLAorCQkJCQkJcFtpKzMtaWldKTsKKwkJCQkJaWYgKCgoaSArIGlpICsgMSkgJiAweGYpID09IDApCisJCQkJCQlkcGJfcHJpbnRfY29udCgKKwkJCQkJCURFQ09ERV9JRChodyksCisJCQkJCQkJMCwgIlxyXG4iKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAocF9IMjY0X0RwYi0+Yml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcgIT0KKwkJCSgocF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtTUFNfRkxBR1MyXSA+PiAzKSAmIDB4MSkpIHsKKwkJCWRwYl9wcmludChwX0gyNjRfRHBiLT5kZWNvZGVyX2luZGV4LCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkJInBfSDI2NF9EcGItPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnIDB4JXgsIG5ldyAweCV4XG4iLAorCQkJCXBfSDI2NF9EcGItPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnLCAoKHBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbU1BTX0ZMQUdTMl0gPj4gMykgJiAweDEpKTsKKwkJCWh3LT5jc2RfY2hhbmdlX2ZsYWcgPSAxOworCQl9CisJCXBfSDI2NF9EcGItPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnID0KKwkJCShwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW1NQU19GTEFHUzJdID4+IDMpICYgMHgxOworCQlwX0gyNjRfRHBiLT5udW1fcmVvcmRlcl9mcmFtZXMgPQorCQkJcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtOVU1fUkVPUkRFUl9GUkFNRVNdOworCQlwX0gyNjRfRHBiLT5tYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZyA9CisJCQlwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW01BWF9CVUZGRVJfRlJBTUVdOworCisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RQQl9ERVRBSUwsCisJCQkiSDI2NF9DT05GSUdfUkVRVUVTVDogcGRiICVkLCAlZCwgJWRcbiIsCisJCQlwX0gyNjRfRHBiLT5iaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZywKKwkJCXBfSDI2NF9EcGItPm51bV9yZW9yZGVyX2ZyYW1lcywKKwkJCXBfSDI2NF9EcGItPm1heF9kZWNfZnJhbWVfYnVmZmVyaW5nKTsKKwkJaHctPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnID0KKwkJCXBfSDI2NF9EcGItPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnOworCQlody0+bnVtX3Jlb3JkZXJfZnJhbWVzID0KKwkJCXBfSDI2NF9EcGItPm51bV9yZW9yZGVyX2ZyYW1lczsKKwkJaHctPm1heF9kZWNfZnJhbWVfYnVmZmVyaW5nID0KKwkJCXBfSDI2NF9EcGItPm1heF9kZWNfZnJhbWVfYnVmZmVyaW5nOworCisJCS8qY3JvcCovCisJCXBfSDI2NF9EcGItPmNocm9tYV9mb3JtYXRfaWRjID0gcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmRwYi5jaHJvbWFfZm9ybWF0X2lkYzsKKwkJcF9IMjY0X0RwYi0+ZnJhbWVfY3JvcF9sZWZ0X29mZnNldCA9IHBfSDI2NF9EcGItPmRwYl9wYXJhbS5kcGIuZnJhbWVfY3JvcF9sZWZ0X29mZnNldDsKKwkJcF9IMjY0X0RwYi0+ZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQgPSBwX0gyNjRfRHBiLT5kcGJfcGFyYW0uZHBiLmZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0OworCQlwX0gyNjRfRHBiLT5mcmFtZV9jcm9wX3RvcF9vZmZzZXQgPSBwX0gyNjRfRHBiLT5kcGJfcGFyYW0uZHBiLmZyYW1lX2Nyb3BfdG9wX29mZnNldDsKKwkJcF9IMjY0X0RwYi0+ZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0ID0gcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmRwYi5mcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQ7CisKKwkJZHBiX3ByaW50KHBfSDI2NF9EcGItPmRlY29kZXJfaW5kZXgsIFBSSU5UX0ZMQUdfRFBCX0RFVEFJTCwKKwkJIiVzIGNocm9tYV9mb3JtYXRfaWRjICVkIGNyb3Agb2Zmc2V0OiBsZWZ0ICVkIHJpZ2h0ICVkIHRvcCAlZCBib3R0b20gJWRcbiIsCisJCV9fZnVuY19fLCBwX0gyNjRfRHBiLT5jaHJvbWFfZm9ybWF0X2lkYywKKwkJcF9IMjY0X0RwYi0+ZnJhbWVfY3JvcF9sZWZ0X29mZnNldCwKKwkJcF9IMjY0X0RwYi0+ZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQsCisJCXBfSDI2NF9EcGItPmZyYW1lX2Nyb3BfdG9wX29mZnNldCwKKwkJcF9IMjY0X0RwYi0+ZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0KTsKKyNlbmRpZgorCisJCVdSSVRFX1ZSRUcoRFBCX1NUQVRVU19SRUcsIEgyNjRfQUNUSU9OX0NPTkZJR19ET05FKTsKKwkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwkJaHctPnJlZ19pcWlkY3RfY29udHJvbCA9IFJFQURfVlJFRyhJUUlEQ1RfQ09OVFJPTCk7CisJCWh3LT5yZWdfaXFpZGN0X2NvbnRyb2xfaW5pdF9mbGFnID0gMTsKKwkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0NPTkZJR19QQVJBTTsKKyNpZmRlZiBERVRFQ1RfV1JPTkdfTVVMVElfU0xJQ0UKKwkJLypyZXN0YXJ0IGNoZWNrIGNvdW50IGFuZCBzZXQgJ3Vua25vd24nKi8KKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVUNPREVfRVZULAorCQkiJXMgTVVMVElfU0xJQ0VfREVURUNUIChjaGVja19jb3VudCAlZCBzbGljZV9jb3VudCAlZCBjdXJfc2xpY2VfY291bnQgJWQgZmxhZyAlZCksIEgyNjRfQ09ORklHX1JFUVVFU1QgPT4gcmVzdGFydCBjaGVja1xuIiwKKwkJX19mdW5jX18sCisJCWh3LT5tdWx0aV9zbGljZV9waWNfY2hlY2tfY291bnQsCisJCWh3LT5waWN0dXJlX3NsaWNlX2NvdW50LAorCQlody0+Y3VyX3BpY3R1cmVfc2xpY2VfY291bnQsCisJCWh3LT5tdWx0aV9zbGljZV9waWNfZmxhZyk7CisKKwkJaHctPm11bHRpX3NsaWNlX3BpY19jaGVja19jb3VudCA9IDA7CisJCWh3LT5tdWx0aV9zbGljZV9waWNfZmxhZyA9IDA7CisJCWh3LT5waWN0dXJlX3NsaWNlX2NvdW50ID0gMDsKKyNlbmRpZgorCQlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9JU1JfVEhSRUFEX0hFQURfRU5EKTsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJfSBlbHNlIGlmIChkZWNfZHBiX3N0YXR1cyA9PSBIMjY0X1NMSUNFX0hFQURfRE9ORSkgeworCQl1MTYgZGF0YV9oaWdodDsKKwkJdTE2IGRhdGFfbG93OworCQl1MzIgdmlkZW9fc2lnbmFsOworCisJCWludCBzbGljZV9oZWFkZXJfcHJvY2Vzc19zdGF0dXMgPSAwOworCQlpbnQgSV9mbGFnOworCQlpbnQgZnJhbWVfbnVtX2dhcCA9IDA7CisJCXVuaW9uIHBhcmFtIGRwYl9wYXJhbV9iYWs7CisJCS8qdW5zaWduZWQgY2hhciBpc19pZHI7Ki8KKwkJdW5zaWduZWQgc2hvcnQgKnAgPSAodW5zaWduZWQgc2hvcnQgKilody0+bG1lbV9hZGRyOworCQl1bnNpZ25lZCBtYl93aWR0aCA9IGh3LT5zZXFfaW5mbzIgJiAweGZmOworCQl1bnNpZ25lZCBzaG9ydCBmaXJzdF9tYl9pbl9zbGljZTsKKwkJdW5zaWduZWQgaW50IGRlY29kZV9tYl9jb3VudCwgbWJ5X21ieDsKKwkJc3RydWN0IFN0b3JhYmxlUGljdHVyZSAqcGljID0gcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlOworCQlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCQlody0+ZnJtYmFzZV9jb250X2ZsYWcgPSAwOworCisJCWlmICgocGljICE9IE5VTEwpICYmIChwaWMtPm1iX2FmZl9mcmFtZV9mbGFnID09IDEpKQorCQkJZmlyc3RfbWJfaW5fc2xpY2UgPSBwW0ZJUlNUX01CX0lOX1NMSUNFICsgM10gKiAyOworCQllbHNlCisJCQlmaXJzdF9tYl9pbl9zbGljZSA9IHBbRklSU1RfTUJfSU5fU0xJQ0UgKyAzXTsKKworI2lmZGVmIERFVEVDVF9XUk9OR19NVUxUSV9TTElDRQorCQlody0+Y3VyX3BpY3R1cmVfc2xpY2VfY291bnQrKzsKKworCQlpZiAoKGh3LT5lcnJvcl9wcm9jX3BvbGljeSAmIDB4MTAwMDApICYmCisJCQkoaHctPmN1cl9waWN0dXJlX3NsaWNlX2NvdW50ID4gMSkgJiYKKwkJCShmaXJzdF9tYl9pbl9zbGljZSA9PSAwKSAmJgorCQkJKGh3LT5tdWx0aV9zbGljZV9waWNfZmxhZyA9PSAwKSkKKwkJCQlody0+bXVsdGlfc2xpY2VfcGljX2NoZWNrX2NvdW50ID0gMDsKKworCQlpZiAoKGh3LT5lcnJvcl9wcm9jX3BvbGljeSAmIDB4MTAwMDApICYmCisJCQkoaHctPmN1cl9waWN0dXJlX3NsaWNlX2NvdW50ID4gMSkgJiYKKwkJCShody0+bXVsdGlfc2xpY2VfcGljX2ZsYWcgPT0gMSkpIHsKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJIiVzIE1VTFRJX1NMSUNFX0RFVEVDVCAoY2hlY2tfY291bnQgJWQgc2xpY2VfY291bnQgJWQgY3VyX3NsaWNlX2NvdW50ICVkIGZsYWcgJWQpLCBXUk9OR19NVUxUSV9TTElDRSBkZXRlY3RlZCwgaW5zZXJ0IHBpY3R1cmVcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWh3LT5tdWx0aV9zbGljZV9waWNfY2hlY2tfY291bnQsCisJCQlody0+cGljdHVyZV9zbGljZV9jb3VudCwKKwkJCWh3LT5jdXJfcGljdHVyZV9zbGljZV9jb3VudCwKKwkJCWh3LT5tdWx0aV9zbGljZV9waWNfZmxhZyk7CisKKwkJCW1ieV9tYnggPSBSRUFEX1ZSRUcoTUJZX01CWCk7CisJCQlkZWNvZGVfbWJfY291bnQgPSAoKG1ieV9tYnggJiAweGZmKSAqIG1iX3dpZHRoICsKKwkJCQkJKCgobWJ5X21ieCA+PiA4KSAmIDB4ZmYpICsgMSkpOworCisJCQlpZiAoZmlyc3RfbWJfaW5fc2xpY2UgPT0gZGVjb2RlX21iX2NvdW50ICYmCisJCQkJZmlyc3RfbWJfaW5fc2xpY2UgIT0gMCkgeworCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJCSIlcyBmaXJzdF9tYl9pbl9zbGljZSA9ICVkIFxuIiwKKwkJCQlfX2Z1bmNfXywgZmlyc3RfbWJfaW5fc2xpY2UpOworCisJCQkJaHctPm11bHRpX3NsaWNlX3BpY19mbGFnID0gMDsKKwkJCQlody0+bXVsdGlfc2xpY2VfcGljX2NoZWNrX2NvdW50ID0gMDsKKwkJCX0gZWxzZSBpZiAoaHctPmN1cl9waWN0dXJlX3NsaWNlX2NvdW50ID4gaHctPmxhc3RfcGljdHVyZV9zbGljZV9jb3VudCkgeworCQkJCXZoMjY0X3BpY19kb25lX3Byb2ModmRlYyk7CisJCQkJLy9pZiAocF9IMjY0X0RwYi0+bURQQi51c2VkX3NpemUgPT0gcF9IMjY0X0RwYi0+bURQQi5zaXplKSB7CisJCQkJaWYgKCFoYXZlX2ZyZWVfYnVmX3NwZWModmRlYykpIHsKKwkJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsICJkcGIgZnVsbCwgd2FpdCBidWZmZXJcbiIpOworCQkJCQlwX0gyNjRfRHBiLT5tVmlkZW8ucHJlX2ZyYW1lX251bSA9IGh3LT5maXJzdF9wcmVfZnJhbWVfbnVtOworCQkJCQlody0+bGFzdF9waWN0dXJlX3NsaWNlX2NvdW50ID0gaHctPmN1cl9waWN0dXJlX3NsaWNlX2NvdW50OworCQkJCQlody0+bm9fZGVjb2Rlcl9idWZmZXJfZmxhZyA9IDE7CisJCQkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKwkJCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQlpZiAocF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlKSB7CisJCQkJCWlmIChwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPmNvbG9jYXRlZF9idWZfaW5kZXggPj0gMCkgeworCQkJCQkJcmVsZWFzZV9jb2xvY2F0ZV9idWYocF9IMjY0X0RwYiwKKwkJCQkJCXBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZS0+Y29sb2NhdGVkX2J1Zl9pbmRleCk7CisJCQkJCQlwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPmNvbG9jYXRlZF9idWZfaW5kZXggPSAtMTsKKwkJCQkJfQorCQkJCX0KKwkJCQlyZWxlYXNlX2N1cl9kZWNvZGluZ19idWYoaHcpOworCQkJfQorCQl9CisjZW5kaWYKKworCQlody0+cmVnX2lxaWRjdF9jb250cm9sID0gUkVBRF9WUkVHKElRSURDVF9DT05UUk9MKTsKKwkJaHctPnJlZ19pcWlkY3RfY29udHJvbF9pbml0X2ZsYWcgPSAxOworCQlody0+cmVnX3Zjb3BfY3RybF9yZWcgPSBSRUFEX1ZSRUcoVkNPUF9DVFJMX1JFRyk7CisJCWh3LT5yZWdfcnZfYWlfbWJfY291bnQgPSBSRUFEX1ZSRUcoUlZfQUlfTUJfQ09VTlQpOworCQlody0+dmxkX2RlY19jb250cm9sID0gUkVBRF9WUkVHKFZMRF9ERUNPREVfQ09OVFJPTCk7CisJCWlmIChpbnB1dF9mcmFtZV9iYXNlZCh2ZGVjKSAmJgorCQkJZnJtYmFzZV9jb250X2JpdGxldmVsMiAhPSAwICYmCisJCQlSRUFEX1ZSRUcoVklGRl9CSVRfQ05UKSA8CisJCQlmcm1iYXNlX2NvbnRfYml0bGV2ZWwyICYmCisJCQlody0+Z2V0X2RhdGFfY291bnQgPj0gMHg3MDAwMDAwMCkgeworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkiJXMgSDI2NF9TTElDRV9IRUFEX0RPTkUgd2l0aCBzbWFsbCBiaXRjbnQgJWQsIGdvdG8gZW1wdHlfcHJvY1xuIiwKKwkJCV9fZnVuY19fLAorCQkJUkVBRF9WUkVHKFZJRkZfQklUX0NOVCkpOworCisJCQlnb3RvIGVtcHR5X3Byb2M7CisJCX0KKworI2lmIDAKKwkJaWYgKHBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZSA9PSBOVUxMKSB7CisJCQlpZiAoIWlzX2J1ZmZlcl9hdmFpbGFibGUodmRlYykpIHsKKwkJCQlody0+YnVmZmVyX2VtcHR5X2ZsYWcgPSAxOworCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLAorCQkJCVBSSU5UX0ZMQUdfVUNPREVfRVZULAorCQkJCSIlcywgYnVmZmVyX2VtcHR5LCBuZXdmcmFtZV9xKCVkKSwgaGF2ZV9mcmVlX2J1Zl9zcGVjKCVkKSwgaW5pdF9kb25lKCVkKSwgdXNlZF9zaXplKCVkLyVkKSwgaXNfdGhlcmVfdW51c2VkX2ZyYW1lX2Zyb21fZHBiKCVkKVxuIiwKKwkJCQkJX19mdW5jX18sCisJCQkJCWtmaWZvX2xlbigmaHctPm5ld2ZyYW1lX3EpLAorCQkJCQloYXZlX2ZyZWVfYnVmX3NwZWModmRlYyksCisJCQkJCXBfSDI2NF9EcGItPm1EUEIuaW5pdF9kb25lLAorCQkJCQlwX0gyNjRfRHBiLT5tRFBCLnVzZWRfc2l6ZSwKKwkJCQkJcF9IMjY0X0RwYi0+bURQQi5zaXplLAorCQkJCQlpc190aGVyZV91bnVzZWRfZnJhbWVfZnJvbV9kcGIoCisJCQkJCQkmcF9IMjY0X0RwYi0+bURQQikpOworCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCX0KKwkJfQorCisJCWh3LT5idWZmZXJfZW1wdHlfZmxhZyA9IDA7CisjZW5kaWYKKyNpZmRlZiBTRU5EX1BBUkFNX1dJVEhfUkVHCisJCWZvciAoaSA9IDA7IGkgPCAoUlBNX0VORC1SUE1fQkVHSU4pOyBpKyspIHsKKwkJCXVuc2lnbmVkIGludCBkYXRhMzI7CisKKwkJCWRvIHsKKwkJCQlkYXRhMzIgPSBSRUFEX1ZSRUcoUlBNX0NNRF9SRUcpOworCQkJCS8qIHByaW50aygiJXhcbiIsIGRhdGEzMik7ICovCisJCQl9IHdoaWxlICgoZGF0YTMyJjB4MTAwMDApID09IDApOworCQkJcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtpXSA9IGRhdGEzMiAmIDB4ZmZmZjsKKwkJCVdSSVRFX1ZSRUcoUlBNX0NNRF9SRUcsIDApOworCQkJLyogcHJpbnRrKCIleDoleFxuIiwgaSxkYXRhMzIpOyAqLworCQl9CisjZWxzZQorCQlkcGJfcGFyYW1fYmFrID0gcF9IMjY0X0RwYi0+ZHBiX3BhcmFtOworCQlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX2hlYWRlcl90aW1lX25hbWUsIFRSQUNFX0hFQURFUl9SUE1fU1RBUlQpOworCQlmb3IgKGkgPSAwOyBpIDwgKFJQTV9FTkQtUlBNX0JFR0lOKTsgaSArPSA0KSB7CisJCQlpbnQgaWk7CisKKwkJCWZvciAoaWkgPSAwOyBpaSA8IDQ7IGlpKyspIHsKKwkJCQlwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW2kraWldID0KKwkJCQkJcFtpKzMtaWldOworCQkJCWlmIChkcGJfaXNfZGVidWcoREVDT0RFX0lEKGh3KSwKKwkJCQkJUlJJTlRfRkxBR19SUE0pKSB7CisJCQkJCWlmICgoKGkgKyBpaSkgJiAweGYpID09IDApCisJCQkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCQkJCQkwLCAiJTA0eDoiLAorCQkJCQkJCWkpOworCQkJCQlkcGJfcHJpbnRfY29udChERUNPREVfSUQoaHcpLAorCQkJCQkJMCwgIiUwNHggIiwKKwkJCQkJCXBbaSszLWlpXSk7CisJCQkJCWlmICgoKGkgKyBpaSArIDEpICYgMHhmKSA9PSAwKQorCQkJCQkJZHBiX3ByaW50X2NvbnQoCisJCQkJCQlERUNPREVfSUQoaHcpLAorCQkJCQkJCTAsICJcclxuIik7CisJCQkJfQorCQkJfQorCQl9CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfaGVhZGVyX3RpbWVfbmFtZSwgVFJBQ0VfSEVBREVSX1JQTV9FTkQpOworI2VuZGlmCisjaWZkZWYgREVURUNUX1dST05HX01VTFRJX1NMSUNFCisKKwkJaWYgKHBfSDI2NF9EcGItPm1WaWRlby5kZWNfcGljdHVyZSAmJgorCQkJCWh3LT5tdWx0aV9zbGljZV9waWNfZmxhZyA9PSAyICYmCisJCQkJKHBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbU0xJQ0VfVFlQRV0gIT0gZHBiX3BhcmFtX2Jhay5sLmRhdGFbU0xJQ0VfVFlQRV0gfHwKKwkJCQlkcGJfcGFyYW1fYmFrLmwuZGF0YVtGSVJTVF9NQl9JTl9TTElDRV0gPiBwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW0ZJUlNUX01CX0lOX1NMSUNFXSkpIHsKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJCSJkZWNvZGUgbmV4dCBwaWMsIHNhdmUgYmVmb3JlLCBTTElDRV9UWVBFIEJBSyAlZCwgU0xJQ0VfVFlQRSAlZCwgRklSU1RfTUJfSU5fU0xJQ0UgQkFLICVkLCBGSVJTVF9NQl9JTl9TTElDRSAlZFxuIiwKKwkJCQkJZHBiX3BhcmFtX2Jhay5sLmRhdGFbU0xJQ0VfVFlQRV0sIHBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbU0xJQ0VfVFlQRV0sCisJCQkJCWRwYl9wYXJhbV9iYWsubC5kYXRhW0ZJUlNUX01CX0lOX1NMSUNFXSwgcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtGSVJTVF9NQl9JTl9TTElDRV0pOworCQkJdmgyNjRfcGljX2RvbmVfcHJvYyh2ZGVjKTsKKwkJfQorI2VuZGlmCisJCWRhdGFfbG93ID0gcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtWSURFT19TSUdOQUxfTE9XXTsKKwkJZGF0YV9oaWdodCA9IHBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbVklERU9fU0lHTkFMX0hJR0hUXTsKKworCQl2aWRlb19zaWduYWwgPSAoZGF0YV9oaWdodCA8PCAxNikgfCBkYXRhX2xvdzsKKwkJaHctPnZpZGVvX3NpZ25hbF9mcm9tX3Z1aSA9CisJCQkJCSgodmlkZW9fc2lnbmFsICYgMHhmZmZmKSA8PCA4KSB8CisJCQkJCSgodmlkZW9fc2lnbmFsICYgMHhmZjAwMDApID4+IDE2KSB8CisJCQkJCSgodmlkZW9fc2lnbmFsICYgMHgzZjAwMDAwMCkpOworCisKKwkJLypkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCQkwLAorCQkJCSJ2aWRlb19zaWduYWxfZnJvbV92dWk6MHgleCwgIgorCQkJCSJkYXRhX2xvdzoweCV4LCBkYXRhX2hpZ2h0OjB4JXhcbiIsCisJCQkJaHctPnZpZGVvX3NpZ25hbF9mcm9tX3Z1aSwKKwkJCQlkYXRhX2xvdywKKwkJCQlkYXRhX2hpZ2h0KTsqLworCisJCXBhcnNlX3NlaV9kYXRhKGh3LCBody0+c2VpX2RhdGFfYnVmLCBody0+c2VpX2RhdGFfbGVuKTsKKworCQlpZiAoaHctPmNvbmZpZ19idWZtZ3JfZG9uZSA9PSAwKSB7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJUFJJTlRfRkxBR19VQ09ERV9FVlQsCisJCQkJImNvbmZpZ19idWZtZ3Igbm90IGRvbmUsIGRpc2NhcmQgZnJhbWVcbiIpOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9IGVsc2UgaWYgKChody0+Zmlyc3RfaV9wb2xpY3kgJiAweDMpICE9IDApIHsKKwkJCXVuc2lnbmVkIGNoYXIgaXNfaV9zbGljZSA9CisJCQkJKHBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbU0xJQ0VfVFlQRV0KKwkJCQkJPT0gSV9TbGljZSkKKwkJCQk/IDEgOiAwOworCQkJdW5zaWduZWQgY2hhciBpc19pZHIgPQorCQkJKChwX0gyNjRfRHBiLT5kcGJfcGFyYW0uZHBiLk5BTF9pbmZvX21tY28gJiAweDFmKQorCQkJCT09IDUpOworCQkJaWYgKChody0+Zmlyc3RfaV9wb2xpY3kgJiAweDMpID09IDB4MykKKwkJCQlpc19pX3NsaWNlID0gaXNfaWRyOworCQkJaWYgKCFpc19pX3NsaWNlKSB7CisJCQkJaWYgKGh3LT5oYXNfaV9mcmFtZSA9PSAwKSB7CisJCQkJCWFtdmRlY19zdG9wKCk7CisJCQkJCXZkZWMtPm1jX2xvYWRlZCA9IDA7CisJCQkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworCQkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJCQlQUklOVF9GTEFHX1VDT0RFX0VWVCwKKwkJCQkJCSJoYXNfaV9mcmFtZSBpcyAwLCBkaXNjYXJkIG5vbmUgSShEUikgZnJhbWUgc2lsY2VfdHlwZSAlZCBpc19pZHIgJWRcbiIsIHBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbU0xJQ0VfVFlQRV0sIGlzX2lkcik7CisJCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChody0+c2tpcF9mcmFtZV9jb3VudCA8IDAgfHwgaXNfaWRyKSB7CisJCQkJCS8qIHNlY29uZCBJICovCisJCQkJCWh3LT5kZWNfZmxhZyAmPSAofk5PRElTUF9GTEFHKTsKKwkJCQkJaHctPnNraXBfZnJhbWVfY291bnQgPSAwOworCQkJCX0KKwkJCQlpZiAoaHctPmhhc19pX2ZyYW1lID09IDAgJiYKKwkJCQkJKCFpc19pZHIpKSB7CisJCQkJCWludCBza2lwX2NvdW50ID0KKwkJCQkJCShody0+Zmlyc3RfaV9wb2xpY3kgPj4gOCkgJiAweGZmOworCQkJCQkvKiBmaXJzdCBJIChub3QgSURSKSAqLworCQkJCQlpZiAoKGh3LT5maXJzdF9pX3BvbGljeSAmIDB4MykgPT0gMikKKwkJCQkJCWh3LT5za2lwX2ZyYW1lX2NvdW50ID0KKwkJCQkJCQktMSAtIHNraXBfY291bnQ7CisJCQkJCWVsc2UKKwkJCQkJCWh3LT5za2lwX2ZyYW1lX2NvdW50ID0KKwkJCQkJCQlza2lwX2NvdW50OworCQkJCQlpZiAoaHctPnNraXBfZnJhbWVfY291bnQgIT0gMCkKKwkJCQkJCWh3LT5kZWNfZmxhZyB8PSBOT0RJU1BfRkxBRzsKKwkJCQl9CisJCQl9CisJCX0KKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVUNPREVfRVZULAorCQkJImN1cnJlbnQgZHBiIGluZGV4ICVkLCBwb2MgJWQsIHRvcC9ib3QgcG9jICglZCwlZClcbiIsCisJCQlwX0gyNjRfRHBiLT5kcGJfcGFyYW0uZHBiLmN1cnJlbnRfZHBiX2luZGV4LAorCQkJdmFsKHBfSDI2NF9EcGItPmRwYl9wYXJhbS5kcGIuZnJhbWVfcGljX29yZGVyX2NudCksCisJCQl2YWwocF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmRwYi50b3BfZmllbGRfcGljX29yZGVyX2NudCksCisJCQl2YWwocF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmRwYi50b3BfZmllbGRfcGljX29yZGVyX2NudCkpOworCQlJX2ZsYWcgPSAocF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtTTElDRV9UWVBFXSA9PSBJX1NsaWNlKQorCQkJPyBJX0ZMQUcgOiAwOworCisJCWlmICgoaHctPmlfb25seSAmIDB4MikgJiYgKElfZmxhZyAmIElfRkxBRykpCisJCQlmbHVzaF9kcGIocF9IMjY0X0RwYik7CisKKwkJaWYgKChody0+aV9vbmx5ICYgMHgyKSAmJiAoIShJX2ZsYWcgJiBJX0ZMQUcpKSAmJgorCQkJKHBfSDI2NF9EcGItPm1TbGljZS5zdHJ1Y3R1cmUgPT0gRlJBTUUpKSB7CisJCQkJaHctPmRhdGFfZmxhZyA9IE5VTExfRkxBRzsKKwkJCQlnb3RvIHBpY19kb25lX3Byb2M7CisJCX0KKworCQlzbGljZV9oZWFkZXJfcHJvY2Vzc19zdGF0dXMgPQorCQkJaDI2NF9zbGljZV9oZWFkZXJfcHJvY2VzcyhwX0gyNjRfRHBiLCAmZnJhbWVfbnVtX2dhcCk7CisJCWlmIChody0+bW11X2VuYWJsZSkKKwkJCWhldmNfc2FvX3NldF9zbGljZV90eXBlKGh3LAorCQkJCXNsaWNlX2hlYWRlcl9wcm9jZXNzX3N0YXR1cywKKwkJCQkJaHctPmRwYi5tU2xpY2UuaWRyX2ZsYWcpOworCQl2dWlfY29uZmlnKGh3KTsKKworCQlpZiAoc2xpY2VfaGVhZGVyX3Byb2Nlc3Nfc3RhdHVzID09IC0xKSB7CisJCQlhbXZkZWNfc3RvcCgpOworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCisJCWlmIChwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUpIHsKKwkJCWludCBjZmdfcmV0ID0gMDsKKwkJCWJvb2wgZmllbGRfcGljX2ZsYWcgPSBmYWxzZTsKKwkJCXVuc2lnbmVkIG1ieV9tYnggPSBSRUFEX1ZSRUcoTUJZX01CWCk7CisJCQlzdHJ1Y3QgU3RvcmFibGVQaWN0dXJlICpwID0KKwkJCQlwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmU7CisKKwkJCWlmIChzbGljZV9oZWFkZXJfcHJvY2Vzc19zdGF0dXMgPT0gMSkgeworCQkJCWlmICghcF9IMjY0X0RwYi0+bVNQUy5mcmFtZV9tYnNfb25seV9mbGFnKSB7CisJCQkJCWZpZWxkX3BpY19mbGFnID0KKwkJCQkJCShwX0gyNjRfRHBiLT5tU2xpY2Uuc3RydWN0dXJlID09IFRPUF9GSUVMRCB8fAorCQkJCQkJcF9IMjY0X0RwYi0+bVNsaWNlLnN0cnVjdHVyZSA9PSBCT1RUT01fRklFTEQpID8KKwkJCQkJCXRydWUgOiBmYWxzZTsKKwkJCQl9CisKKwkJCQl2ZGVjX3NldF9wcm9maWxlX2xldmVsKHZkZWMsIHBfSDI2NF9EcGItPm1TUFMucHJvZmlsZV9pZGMsCisJCQkJCXBfSDI2NF9EcGItPm1TUFMubGV2ZWxfaWRjKTsKKworCQkJCWlmICghZmllbGRfcGljX2ZsYWcgJiYgKCgocF9IMjY0X0RwYi0+bVNQUy5wcm9maWxlX2lkYyA9PSBCQVNFTElORSkgJiYKKwkJCQkJKHBfSDI2NF9EcGItPmRlY19kcGJfc2l6ZSA8IDIpKSB8fAorCQkJCQkoKCh1bnNpZ25lZCBsb25nKShody0+dmgyNjRfYW1zdHJlYW1fZGVjX2luZm8KKwkJCQkJCS5wYXJhbSkpICYgMHg4KSB8fCBody0+bG93X2xhdGVuY3lfbW9kZSAmIDB4OCkpIHsKKwkJCQkJcF9IMjY0X0RwYi0+ZmFzdF9vdXRwdXRfZW5hYmxlID0KKwkJCQkJSDI2NF9PVVRQVVRfTU9ERV9GQVNUOworCQkJCX0KKwkJCQllbHNlCisJCQkJCXBfSDI2NF9EcGItPmZhc3Rfb3V0cHV0X2VuYWJsZQorCQkJCQkJCT0gZmFzdF9vdXRwdXRfZW5hYmxlOworCQkJCWlmIChody0+ZW5hYmxlX2ZlbmNlKQorCQkJCQlwX0gyNjRfRHBiLT5mYXN0X291dHB1dF9lbmFibGUgPSBIMjY0X09VVFBVVF9NT0RFX0ZBU1Q7CisKKwkJCQlody0+ZGF0YV9mbGFnID0gSV9mbGFnOworCQkJCWlmICgocF9IMjY0X0RwYi0+CisJCQkJCWRwYl9wYXJhbS5kcGIuTkFMX2luZm9fbW1jbyAmIDB4MWYpCisJCQkJCT09IDUpCisJCQkJCWh3LT5kYXRhX2ZsYWcgfD0gSURSX0ZMQUc7CisJCQkJaWYgKChwX0gyNjRfRHBiLT5kcGJfcGFyYW0ubC5kYXRhW0ZJUlNUX01CX0lOX1NMSUNFXSkgJiYgIW1ieV9tYngpIHsKKwkJCQkJcC0+ZGF0YV9mbGFnIHw9IEVSUk9SX0ZMQUc7CisJCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLAorCQkJCQkJUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCQkJCSJvbmUgc2xpY2UgZXJyb3IgaW4gbXV1bHRpLXNsaWNlICBmaXJzdF9tYiAweCV4IG1ieV9tYnggMHgleCAgc2xpY2VfdHlwZSAlZFxuIiwKKwkJCQkJCXBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLgorCQkJCQkJZGF0YVtGSVJTVF9NQl9JTl9TTElDRV0sCisJCQkJCQlSRUFEX1ZSRUcoTUJZX01CWCksCisJCQkJCQkgcC0+c2xpY2VfdHlwZSk7CisJCQkJfQorCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLAorCQkJCVBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkJIj09PT09PT09PT09PT09PT09PT4gZnJhbWUgY291bnQgJWQgdG8gc2tpcCAlZFxuIiwKKwkJCQlody0+ZGVjb2RlX3BpY19jb3VudCsxLAorCQkJCWh3LT5za2lwX2ZyYW1lX2NvdW50KTsKKwkJCQl9IGVsc2UgaWYgKGh3LT5lcnJvcl9wcm9jX3BvbGljeSAmIDB4MTAwKXsKKwkJCQkJdW5zaWduZWQgZGVjb2RlX21iX2NvdW50ID0KKwkJCQkJCSgobWJ5X21ieCAmIDB4ZmYpICogaHctPm1iX3dpZHRoICsKKwkJCQkJCSgoKG1ieV9tYnggPj4gOCkgJiAweGZmKSArIDEpKTsKKwkJCQkJaWYgKGRlY29kZV9tYl9jb3VudCA8CisJCQkJCQkoKHBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLmRhdGFbRklSU1RfTUJfSU5fU0xJQ0VdKSAqCisJCQkJCQkoMSArIHAtPm1iX2FmZl9mcmFtZV9mbGFnKSkgJiYgZGVjb2RlX21iX2NvdW50KSB7CisJCQkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCQkJCVBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkJCQkiRXJyb3IgZGV0ZWN0ISBmaXJzdF9tYiAweCV4IG1ieV9tYnggMHgleCBkZWNvZGVfbWIgMHgleFxuIiwKKwkJCQkJCXBfSDI2NF9EcGItPmRwYl9wYXJhbS5sLgorCQkJCQkJZGF0YVtGSVJTVF9NQl9JTl9TTElDRV0sCisJCQkJCQlSRUFEX1ZSRUcoTUJZX01CWCksCisJCQkJCQlkZWNvZGVfbWJfY291bnQpOworCQkJCQkJcC0+ZGF0YV9mbGFnIHw9IEVSUk9SX0ZMQUc7CisJCQkJCX0vKiBlbHNlIGlmICghcF9IMjY0X0RwYi0+ZHBiX3BhcmFtLmwuZGF0YVtGSVJTVF9NQl9JTl9TTElDRV0gJiYgZGVjb2RlX21iX2NvdW50KSB7CisJCQkJCQlwLT5kYXRhX2ZsYWcgfD0gRVJST1JfRkxBRzsKKwkJCQkJCWdvdG8gcGljX2RvbmVfcHJvYzsKKwkJCQkJfSovCisJCQkJfQorCisJCQlpZiAoIUlfZmxhZyAmJiBmcmFtZV9udW1fZ2FwICYmICFwX0gyNjRfRHBiLT5sb25nX3Rlcm1fcmVmZXJlbmNlX2ZsYWcpIHsKKwkJCQlpZiAoIShody0+ZXJyb3JfcHJvY19wb2xpY3kgJiAweDgwMDAwMCkpIHsKKwkJCQkJaHctPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOworCQkJCQlwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOworCQkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwgImZyYW1lIG51bWJlciBnYXAgZXJyb3JcbiIpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGh3LT5lcnJvcl9wcm9jX3BvbGljeSAmIDB4NDAwKSB7CisJCQkJaW50IHJldCA9IGRwYl9jaGVja19yZWZfbGlzdF9lcnJvcihwX0gyNjRfRHBiKTsKKwkJCQlpZiAocmV0ICE9IDApIHsKKwkJCQkJaHctPnJlZmxpc3RfZXJyb3JfY291bnQgKys7CisJCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJCQkJInJlZmVyZW5jZSBsaXN0IGVycm9yICVkIGZyYW1lIGNvdW50ICVkIHRvIHNraXAgJWQgcmVmbGlzdF9lcnJvcl9jb3VudCAlZFxuIiwKKwkJCQkJCXJldCwKKwkJCQkJCWh3LT5kZWNvZGVfcGljX2NvdW50KzEsCisJCQkJCQlody0+c2tpcF9mcmFtZV9jb3VudCwKKwkJCQkJCWh3LT5yZWZsaXN0X2Vycm9yX2NvdW50KTsKKworCQkJCQlwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUtPmRhdGFfZmxhZyA9IE5PRElTUF9GTEFHOworCQkJCQlpZiAoKChody0+ZXJyb3JfcHJvY19wb2xpY3kgJiAweDgwKQorCQkJCQkJJiYgKChody0+ZGVjX2ZsYWcgJgorCQkJCQkJCU5PRElTUF9GTEFHKSA9PSAwKSkgfHwoaHctPnJlZmxpc3RfZXJyb3JfY291bnQgPiA1MCkpIHsKKwkJCQkJCWh3LT5yZXNldF9idWZtZ3JfZmxhZyA9IDE7CisJCQkJCQlody0+cmVmbGlzdF9lcnJvcl9jb3VudCA9MDsKKwkJCQkJCWFtdmRlY19zdG9wKCk7CisJCQkJCQl2ZGVjLT5tY19sb2FkZWQgPSAwOworCQkJCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJCQkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCQkJfQorCQkJCX0gZWxzZQorCQkJCQlody0+cmVmbGlzdF9lcnJvcl9jb3VudCA9IDA7CisJCQl9CisJCQlpZiAoKGh3LT5lcnJvcl9wcm9jX3BvbGljeSAmIDB4ODAwKSAmJiAoIShody0+aV9vbmx5ICYgMHgyKSkKKwkJCQkmJiBwX0gyNjRfRHBiLT5kcGJfZXJyb3JfZmxhZyAhPSAwKSB7CisJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkJCSJkcGIgZXJyb3IgJWRcbiIsCisJCQkJCXBfSDI2NF9EcGItPmRwYl9lcnJvcl9mbGFnKTsKKwkJCQlody0+ZGF0YV9mbGFnIHw9IEVSUk9SX0ZMQUc7CisJCQkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlLT5kYXRhX2ZsYWcgfD0gRVJST1JfRkxBRzsKKwkJCQlpZiAoKGh3LT5lcnJvcl9wcm9jX3BvbGljeSAmIDB4ODApICYmCisJCQkJCSgoaHctPmRlY19mbGFnICYgTk9ESVNQX0ZMQUcpID09IDApKSB7CisJCQkJCWh3LT5yZXNldF9idWZtZ3JfZmxhZyA9IDE7CisJCQkJCWFtdmRlY19zdG9wKCk7CisJCQkJCXZkZWMtPm1jX2xvYWRlZCA9IDA7CisJCQkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworCQkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJCX0KKwkJCX0KKwkJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfaGVhZGVyX3RpbWVfbmFtZSwgVFJBQ0VfSEVBREVSX1JFR0lTVEVSX1NUQVJUKTsKKwkJCWNmZ19yZXQgPSBjb25maWdfZGVjb2RlX2J1ZihodywKKwkJCQlwX0gyNjRfRHBiLT5tVmlkZW8uZGVjX3BpY3R1cmUpOworCQkJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV9oZWFkZXJfdGltZV9uYW1lLCBUUkFDRV9IRUFERVJfUkVHSVNURVJfRU5EKTsKKwkJCWlmIChjZmdfcmV0IDwgMCkgeworCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0VSUk9SLAorCQkJCQkiY29uZmlnX2RlY29kZV9idWYgZmFpbCAoJWQpXG4iLAorCQkJCQljZmdfcmV0KTsKKwkJCQlpZiAoaHctPmVycm9yX3Byb2NfcG9saWN5ICYgMHgyKSB7CisJCQkJCXJlbGVhc2VfY3VyX2RlY29kaW5nX2J1Zihodyk7CisJCQkJCS8qaHctPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOyovCisJCQkJCWh3LT5yZXNldF9idWZtZ3JfZmxhZyA9IDE7CisJCQkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworCQkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJCX0gZWxzZQorCQkJCQlody0+ZGF0YV9mbGFnIHw9IEVSUk9SX0ZMQUc7CisJCQkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlLT5kYXRhX2ZsYWcgfD0gRVJST1JfRkxBRzsKKwkJCX0KKwkJfQorCisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9USFJFQURfSEVBRF9FTkQpOworCisJCWlmIChzbGljZV9oZWFkZXJfcHJvY2Vzc19zdGF0dXMgPT0gMSkKKwkJCVdSSVRFX1ZSRUcoRFBCX1NUQVRVU19SRUcsIEgyNjRfQUNUSU9OX0RFQ09ERV9ORVdQSUMpOworCQllbHNlCisJCQlXUklURV9WUkVHKERQQl9TVEFUVVNfUkVHLCBIMjY0X0FDVElPTl9ERUNPREVfU0xJQ0UpOworCQlody0+bGFzdF9tYnlfbWJ4ID0gMDsKKwkJaHctPmxhc3RfdmxkX2xldmVsID0gMDsKKwkJc3RhcnRfcHJvY2Vzc190aW1lKGh3KTsKKwl9IGVsc2UgaWYgKGRlY19kcGJfc3RhdHVzID09IEgyNjRfUElDX0RBVEFfRE9ORQorCQl8fCgoZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9EQVRBX1JFUVVFU1QpICYmIGlucHV0X2ZyYW1lX2Jhc2VkKHZkZWMpKSkgeworI2lmZGVmIERFVEVDVF9XUk9OR19NVUxUSV9TTElDRQorCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1VDT0RFX0VWVCwKKwkJCQkiJXMgTVVMVElfU0xJQ0VfREVURUNUIChjaGVja19jb3VudCAlZCBzbGljZV9jb3VudCAlZCBjdXJfc2xpY2VfY291bnQgJWQgZmxhZyAlZCksIEgyNjRfUElDX0RBVEFfRE9ORVxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlody0+bXVsdGlfc2xpY2VfcGljX2NoZWNrX2NvdW50LAorCQkJCWh3LT5waWN0dXJlX3NsaWNlX2NvdW50LAorCQkJCWh3LT5jdXJfcGljdHVyZV9zbGljZV9jb3VudCwKKwkJCQlody0+bXVsdGlfc2xpY2VfcGljX2ZsYWcpOworCisJCQkJaWYgKGh3LT5tdWx0aV9zbGljZV9waWNfY2hlY2tfY291bnQgPCBjaGVja19zbGljZV9udW0pIHsKKwkJCQkJaHctPm11bHRpX3NsaWNlX3BpY19jaGVja19jb3VudCsrOworCQkJCQlpZiAoaHctPmN1cl9waWN0dXJlX3NsaWNlX2NvdW50ICE9CisJCQkJCQlody0+cGljdHVyZV9zbGljZV9jb3VudCkgeworCQkJCQkJLypyZXN0YXJ0IGNoZWNrIGNvdW50IGFuZCBzZXQgJ3Vua25vd24nKi8KKwkJCQkJCWh3LT5tdWx0aV9zbGljZV9waWNfY2hlY2tfY291bnQgPSAwOworCQkJCQkJaHctPm11bHRpX3NsaWNlX3BpY19mbGFnID0gMDsKKwkJCQkJfQorCQkJCQlody0+cGljdHVyZV9zbGljZV9jb3VudCA9CisJCQkJCQlody0+Y3VyX3BpY3R1cmVfc2xpY2VfY291bnQ7CisJCQkJfSBlbHNlIGlmIChody0+bXVsdGlfc2xpY2VfcGljX2NoZWNrX2NvdW50ID49IGNoZWNrX3NsaWNlX251bSkgeworCQkJCQlpZiAoaHctPnBpY3R1cmVfc2xpY2VfY291bnQgPiAxKQorCQkJCQkJaHctPm11bHRpX3NsaWNlX3BpY19mbGFnID0gMjsKKwkJCQkJZWxzZQorCQkJCQkJaHctPm11bHRpX3NsaWNlX3BpY19mbGFnID0gMTsKKwkJCQl9CisjZW5kaWYKKworcGljX2RvbmVfcHJvYzoKKwkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwkJaWYgKChkZWNfZHBiX3N0YXR1cyA9PSBIMjY0X1NFQVJDSF9CVUZFTVBUWSkgfHwKKwkJCShkZWNfZHBiX3N0YXR1cyA9PSBIMjY0X0RFQ09ERV9CVUZFTVBUWSkgfHwKKwkJCShkZWNfZHBiX3N0YXR1cyA9PSBIMjY0X0RFQ09ERV9USU1FT1VUKSB8fAorCQkJKChkZWNfZHBiX3N0YXR1cyA9PSBIMjY0X0RBVEFfUkVRVUVTVCkgJiYgaW5wdXRfZnJhbWVfYmFzZWQodmRlYykpKSB7CisJCQlody0+ZGF0YV9mbGFnIHw9IEVSUk9SX0ZMQUc7CisJCQlpZiAoaHctPmRwYi5tVmlkZW8uZGVjX3BpY3R1cmUpCisJCQkJaHctPmRwYi5tVmlkZW8uZGVjX3BpY3R1cmUtPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsCisJCQkJIiVzLCBtYXJrIGVycl9mcmFtZVxuIiwgX19mdW5jX18pOworCQl9CisJCXZoMjY0X3BpY19kb25lX3Byb2ModmRlYyk7CisKKwkJaWYgKGh3LT5mcm1iYXNlX2NvbnRfZmxhZykgeworCQkJYnVmbWdyX2gyNjRfcmVtb3ZlX3VudXNlZF9mcmFtZShwX0gyNjRfRHBiLCAwKTsKKwkJCWlmICghaGF2ZV9mcmVlX2J1Zl9zcGVjKHZkZWMpKSB7CisJCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX05FRURfTU9SRV9CVUZGRVI7CisJCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJfQorCQkJLypkbyBub3QgREVDX1JFU1VMVF9HRVRfREFUQSovCisJCQlody0+Z2V0X2RhdGFfY291bnQgPSAweDdmZmZmZmZmOworCQkJV1JJVEVfVlJFRyhEUEJfU1RBVFVTX1JFRywgSDI2NF9BQ1RJT05fU0VBUkNIX0hFQUQpOworCQkJZGVjb2RlX2ZyYW1lX2NvdW50W0RFQ09ERV9JRChodyldKys7CisJCQlpZiAocF9IMjY0X0RwYi0+bVNsaWNlLnNsaWNlX3R5cGUgPT0gSV9TTElDRSkgeworCQkJCWh3LT5ndnMuaV9kZWNvZGVkX2ZyYW1lcysrOworCQkJfSBlbHNlIGlmIChwX0gyNjRfRHBiLT5tU2xpY2Uuc2xpY2VfdHlwZSA9PSBQX1NMSUNFKSB7CisJCQkJaHctPmd2cy5wX2RlY29kZWRfZnJhbWVzKys7CisJCQl9IGVsc2UgaWYgKHBfSDI2NF9EcGItPm1TbGljZS5zbGljZV90eXBlID09IEJfU0xJQ0UpIHsKKwkJCQlody0+Z3ZzLmJfZGVjb2RlZF9mcmFtZXMrKzsKKwkJCX0KKwkJCXN0YXJ0X3Byb2Nlc3NfdGltZShodyk7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKwkJYW12ZGVjX3N0b3AoKTsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkiJXMgJXMgZGVjb2RlIHNsaWNlIGNvdW50ICVkXG4iLAorCQkJX19mdW5jX18sCisJCQkoZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9QSUNfREFUQV9ET05FKSA/CisJCQkiSDI2NF9QSUNfREFUQV9ET05FIiA6CisJCQkoZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9GSU5EX05FWFRfUElDX05BTCkgPworCQkJIkgyNjRfRklORF9ORVhUX1BJQ19OQUwiIDogIkgyNjRfRklORF9ORVhUX0RWRUxfTkFMIiwKKwkJCWh3LT5kZWNvZGVfcGljX2NvdW50KTsKKwkJaWYgKGh3LT5rcGlfZmlyc3RfaV9kZWNvZGVkID09IDApIHsKKwkJCWh3LT5rcGlfZmlyc3RfaV9kZWNvZGVkID0gMTsKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1ZERUNfREVUQUlMLAorCQkJCSJbdmRlY19rcGldWyVzXSBGaXJzdCBJIGZyYW1lIGRlY29kZWQuXG4iLCBfX2Z1bmNfXyk7CisJCX0KKwkJLyogV1JJVEVfVlJFRyhEUEJfU1RBVFVTX1JFRywgSDI2NF9BQ1RJT05fU0VBUkNIX0hFQUQpOyAqLworCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCQlpZiAodmRlYy0+c2xhdmUgJiYKKwkJCWRlY19kcGJfc3RhdHVzID09IEgyNjRfRklORF9ORVhUX0RWRUxfTkFMKSB7CisJCQlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3X2VsID0KKwkJCSAoc3RydWN0IHZkZWNfaDI2NF9od19zICopKHZkZWMtPnNsYXZlLT5wcml2YXRlKTsKKwkJCWh3X2VsLT5nb3RfdmFsaWRfbmFsID0gMDsKKwkJCWh3LT5zd2l0Y2hfZHZsYXllcl9mbGFnID0gMTsKKwkJfSBlbHNlIGlmICh2ZGVjLT5tYXN0ZXIgJiYKKwkJCWRlY19kcGJfc3RhdHVzID09IEgyNjRfRklORF9ORVhUX1BJQ19OQUwpIHsKKwkJCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHdfYmwgPQorCQkJIChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKikodmRlYy0+bWFzdGVyLT5wcml2YXRlKTsKKwkJCWh3X2JsLT5nb3RfdmFsaWRfbmFsID0gMDsKKwkJCWh3LT5zd2l0Y2hfZHZsYXllcl9mbGFnID0gMTsKKwkJfSBlbHNlIHsKKwkJCWh3LT5zd2l0Y2hfZHZsYXllcl9mbGFnID0gMDsKKwkJCWh3LT5nb3RfdmFsaWRfbmFsID0gMTsKKwkJfQorI2VuZGlmCisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9USFJFQURfRUROKTsKKworCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCX0gZWxzZSBpZiAoCisJCQkoZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9GSU5EX05FWFRfUElDX05BTCkgfHwKKwkJCShkZWNfZHBiX3N0YXR1cyA9PSBIMjY0X0ZJTkRfTkVYVF9EVkVMX05BTCkpIHsKKwkJZ290byBwaWNfZG9uZV9wcm9jOworI2VuZGlmCisJfSBlbHNlIGlmIChkZWNfZHBiX3N0YXR1cyA9PSBIMjY0X0FVWF9EQVRBX1JFQURZKSB7CisJCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisJCWlmIChSRUFEX1ZSRUcoSDI2NF9BVVhfREFUQV9TSVpFKSAhPSAwKSB7CisJCQlpZiAoZHBiX2lzX2RlYnVnKERFQ09ERV9JRChodyksCisJCQkJUFJJTlRfRkxBR19TRUlfREVUQUlMKSkKKwkJCQlkdW1wX2F1eF9idWYoaHcpOworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJCQlpZiAodmRlY19mcmFtZV9iYXNlZCh2ZGVjKSkgeworCQkJCWlmIChody0+bGFzdF9kZWNfcGljdHVyZSkKKwkJCQkJc2V0X2F1eF9kYXRhKGh3LAorCQkJCQkJaHctPmxhc3RfZGVjX3BpY3R1cmUsIDAsIDAsIE5VTEwpOworCQkJfSBlbHNlIGlmICh2ZGVjLT5kb2xieV9tZXRhX3dpdGhfZWwgfHwgdmRlYy0+c2xhdmUpIHsKKwkJCQlpZiAoaHctPmxhc3RfZGVjX3BpY3R1cmUpCisJCQkJCXNldF9hdXhfZGF0YShodywgaHctPmxhc3RfZGVjX3BpY3R1cmUsCisJCQkJCQkwLCAwLCBOVUxMKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHZkZWMtPm1hc3RlcikgeworCQkJCQkJc3RydWN0IHZkZWNfaDI2NF9od19zICpod19ibCA9CisJCQkJCQkoc3RydWN0IHZkZWNfaDI2NF9od19zICopCisJCQkJCQkodmRlYy0+bWFzdGVyLT5wcml2YXRlKTsKKwkJCQkJaWYgKGh3X2JsLT5sYXN0X2RlY19waWN0dXJlICE9IE5VTEwpIHsKKwkJCQkJCXNldF9hdXhfZGF0YShod19ibCwKKwkJCQkJCQlod19ibC0+bGFzdF9kZWNfcGljdHVyZSwKKwkJCQkJCQkwLCAxLCBodyk7CisJCQkJCX0KKwkJCQkJc2V0X2F1eF9kYXRhKGh3LAorCQkJCQkJaHctPmxhc3RfZGVjX3BpY3R1cmUsCisJCQkJCQkwLCAyLCBOVUxMKTsKKwkJCQl9CisJCQl9CisjZWxzZQorCQkJaWYgKGh3LT5sYXN0X2RlY19waWN0dXJlKQorCQkJCXNldF9hdXhfZGF0YShodywKKwkJCQkJaHctPmxhc3RfZGVjX3BpY3R1cmUsIDAsIDAsIE5VTEwpOworI2VuZGlmCisJCX0KKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCQlody0+c3dpdGNoX2R2bGF5ZXJfZmxhZyA9IDA7CisJCWh3LT5nb3RfdmFsaWRfbmFsID0gMTsKKyNlbmRpZgorCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCSIlcyBIMjY0X0FVWF9EQVRBX1JFQURZXG4iLCBfX2Z1bmNfXyk7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9USFJFQURfRUROKTsKKwkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCX0gZWxzZSBpZiAoLyooZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9EQVRBX1JFUVVFU1QpIHx8Ki8KKwkJCShkZWNfZHBiX3N0YXR1cyA9PSBIMjY0X1NFQVJDSF9CVUZFTVBUWSkgfHwKKwkJCShkZWNfZHBiX3N0YXR1cyA9PSBIMjY0X0RFQ09ERV9CVUZFTVBUWSkgfHwKKwkJCShkZWNfZHBiX3N0YXR1cyA9PSBIMjY0X0RFQ09ERV9USU1FT1VUKSkgeworZW1wdHlfcHJvYzoKKwkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwkJaWYgKChody0+ZXJyb3JfcHJvY19wb2xpY3kgJiAweDQwMDAwKSAmJgorCQkJKChkZWNfZHBiX3N0YXR1cyA9PSBIMjY0X0RFQ09ERV9USU1FT1VUKSB8fAorCQkJKCFody0+ZnJtYmFzZV9jb250X2ZsYWcgJiYgKGRlY19kcGJfc3RhdHVzID09IEgyNjRfU0VBUkNIX0JVRkVNUFRZIHx8IGRlY19kcGJfc3RhdHVzID09IEgyNjRfREVDT0RFX0JVRkVNUFRZKSAmJiBpbnB1dF9mcmFtZV9iYXNlZCh2ZGVjKSkpKQorCQkJZ290byBwaWNfZG9uZV9wcm9jOworCQlpZiAoIWh3LT5mcm1iYXNlX2NvbnRfZmxhZykKKwkJCXJlbGVhc2VfY3VyX2RlY29kaW5nX2J1Zihodyk7CisKKwkJaWYgKGlucHV0X2ZyYW1lX2Jhc2VkKHZkZWMpIHx8CisJCQkoUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKSA+IDB4MjAwKSkgeworCQkJaWYgKGgyNjRfZGVidWdfZmxhZyAmCisJCQkJRElTQUJMRV9FUlJPUl9IQU5ETEUpIHsKKwkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCQlQUklOVF9GTEFHX0VSUk9SLAorCQkJCQkiJXMgZGVjb2RpbmcgZXJyb3IsIGxldmVsIDB4JXhcbiIsCisJCQkJCV9fZnVuY19fLAorCQkJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpKTsKKwkJCQlnb3RvIHNlbmRfYWdhaW47CisJCQl9CisJCQlhbXZkZWNfc3RvcCgpOworCQkJdmRlYy0+bWNfbG9hZGVkID0gMDsKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJCSIlcyAlc1xuIiwgX19mdW5jX18sCisJCQkJKGRlY19kcGJfc3RhdHVzID09IEgyNjRfU0VBUkNIX0JVRkVNUFRZKSA/CisJCQkJIkgyNjRfU0VBUkNIX0JVRkVNUFRZIiA6CisJCQkJKGRlY19kcGJfc3RhdHVzID09IEgyNjRfREVDT0RFX0JVRkVNUFRZKSA/CisJCQkJIkgyNjRfREVDT0RFX0JVRkVNUFRZIiA6CisJCQkJKGRlY19kcGJfc3RhdHVzID09IEgyNjRfREVDT0RFX1RJTUVPVVQpID8KKwkJCQkiSDI2NF9ERUNPREVfVElNRU9VVCIgOgorCQkJCSJPVEhFUiIpOworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisKKwkJCWlmIChkZWNfZHBiX3N0YXR1cyA9PSBIMjY0X1NFQVJDSF9CVUZFTVBUWSkKKwkJCQlody0+c2VhcmNoX2RhdGFlbXB0eV9udW0rKzsKKwkJCWVsc2UgaWYgKGRlY19kcGJfc3RhdHVzID09IEgyNjRfREVDT0RFX1RJTUVPVVQpIHsKKwkJCQlody0+ZGVjb2RlX3RpbWVvdXRfbnVtKys7CisJCQkJaWYgKGh3LT5lcnJvcl9wcm9jX3BvbGljeSAmIDB4NDAwMCkgeworCQkJCQlody0+ZGF0YV9mbGFnIHw9IEVSUk9SX0ZMQUc7CisJCQkJCWlmICgocF9IMjY0X0RwYi0+bGFzdF9kcGJfc3RhdHVzID09IEgyNjRfREVDT0RFX1RJTUVPVVQpIHx8CisJCQkJCQkocF9IMjY0X0RwYi0+bGFzdF9kcGJfc3RhdHVzID09IEgyNjRfUElDX0RBVEFfRE9ORSkgfHwKKwkJCQkJCSgocF9IMjY0X0RwYi0+bGFzdF9kcGJfc3RhdHVzID09IEgyNjRfU0xJQ0VfSEVBRF9ET05FKSAmJgorCQkJCQkJIChwX0gyNjRfRHBiLT5tU2xpY2Uuc2xpY2VfdHlwZSAhPSBCX1NMSUNFKSkpIHsKKwkJCQkJCSBkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCQkJCQlQUklOVF9GTEFHX0VSUk9SLCAiJXMgbGFzdCBkcGIgc3RhdHVzIDB4JXggbmVlZCBidWdtZ3IgcmVzZXQgXG4iLAorCQkJCQkJCXBfSDI2NF9EcGItPmxhc3RfZHBiX3N0YXR1cywgX19mdW5jX18pOworCQkJCQkJCWh3LT5yZXNldF9idWZtZ3JfZmxhZyA9IDE7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgaWYgKGRlY19kcGJfc3RhdHVzID09IEgyNjRfREVDT0RFX0JVRkVNUFRZKQorCQkJCWh3LT5kZWNvZGVfZGF0YWVtcHR5X251bSsrOworCQkJaWYgKCFody0+ZnJtYmFzZV9jb250X2ZsYWcpCisJCQkJaHctPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOworCisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFdSSVRFX1ZSRUcoRFBCX1NUQVRVU19SRUcsIEgyNjRfQUNUSU9OX0lOSVQpOyAqLworI2lmZGVmIERFVEVDVF9XUk9OR19NVUxUSV9TTElDRQorCQkJaWYgKGh3LT5lcnJvcl9wcm9jX3BvbGljeSAmIDB4MTAwMDApIHsKKwkJCQlwX0gyNjRfRHBiLT5tVmlkZW8ucHJlX2ZyYW1lX251bSA9IGh3LT5maXJzdF9wcmVfZnJhbWVfbnVtOworCQkJfQorCQkJaHctPmxhc3RfcGljdHVyZV9zbGljZV9jb3VudCA9IGh3LT5jdXJfcGljdHVyZV9zbGljZV9jb3VudDsKKyNlbmRpZgorCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkJIiVzIERFQ19SRVNVTFRfQUdBSU5cbiIsIF9fZnVuY19fKTsKK3NlbmRfYWdhaW46CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfQUdBSU47CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJfQorCX0gZWxzZSBpZiAoZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9EQVRBX1JFUVVFU1QpIHsKKwkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwkJaWYgKGlucHV0X2ZyYW1lX2Jhc2VkKHZkZWMpKSB7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCVBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkiJXMgSDI2NF9EQVRBX1JFUVVFU1QgKCVkKVxuIiwKKwkJCV9fZnVuY19fLCBody0+Z2V0X2RhdGFfY291bnQpOworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0dFVF9EQVRBOworCQkJaHctPnJlZ19pcWlkY3RfY29udHJvbCA9IFJFQURfVlJFRyhJUUlEQ1RfQ09OVFJPTCk7CisJCQlody0+cmVnX2lxaWRjdF9jb250cm9sX2luaXRfZmxhZyA9IDE7CisJCQlody0+Z2V0X2RhdGFfc3RhcnRfdGltZSA9IGppZmZpZXM7CisJCQlody0+Z2V0X2RhdGFfY291bnQrKzsKKwkJCWlmIChody0+Z2V0X2RhdGFfY291bnQgPj0gZnJhbWVfbWF4X2RhdGFfcGFja2V0KQorCQkJCWdvdG8gZW1wdHlfcHJvYzsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQl9IGVsc2UKKwkJCWdvdG8gZW1wdHlfcHJvYzsKKwl9IGVsc2UgaWYgKGRlY19kcGJfc3RhdHVzID09IEgyNjRfREVDT0RFX09WRVJfU0laRSkgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSJ2bWgyNjQgZGVjb2RlIG92ZXJzaXplICEhXG4iKTsKKwkJcmVsZWFzZV9jdXJfZGVjb2RpbmdfYnVmKGh3KTsKKwkJaHctPmRhdGFfZmxhZyB8PSBFUlJPUl9GTEFHOworCQlody0+c3RhdCB8PSBERUNPREVSX0ZBVEFMX0VSUk9SX1NJWkVfT1ZFUkZMT1c7CisJCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0gZWxzZSBpZiAoZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9TRUlfREFUQV9SRUFEWSkgeworCQlpbnQgYXV4X2RhdGFfbGVuOworCQlhdXhfZGF0YV9sZW4gPQorCQkJKFJFQURfVlJFRyhIMjY0X0FVWF9EQVRBX1NJWkUpID4+IDE2KSA8PCA0OworCisJCWlmIChhdXhfZGF0YV9sZW4gPiBTRUlfREFUQV9TSVpFKSB7CisJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRVJST1IsCisJCQkJCSJzZWkgZGF0YSBzaXplIG1vcmUgdGhhbiA0SzogJWQsIGRpc2NhcmRlZCBpdFxuIiwKKwkJCQkJaHctPnNlaV9pdHVfZGF0YV9sZW4pOworCQkJCWh3LT5zZWlfaXR1X2RhdGFfbGVuID0gMDsKKwkJfQorCisJCWlmIChhdXhfZGF0YV9sZW4gIT0gMCkgeworCQkJdTggKnRyYW5zX2RhdGFfYnVmOworCQkJdTggKnNlaV9kYXRhX2J1ZjsKKwkJCXU4IHN3YXBfYnl0ZTsKKworI2lmIDAKKwkJCWR1bXBfYXV4X2J1Zihodyk7CisjZW5kaWYKKwkJCXRyYW5zX2RhdGFfYnVmID0gKHU4ICopaHctPmF1eF9hZGRyOworCisJCQlpZiAodHJhbnNfZGF0YV9idWZbN10gPT0gQVVYX1RBR19TRUkpIHsKKwkJCQlpbnQgbGVmdF9sZW47CisKKwkJCQlzZWlfZGF0YV9idWYgPSAodTggKilody0+c2VpX2RhdGFfYnVmCisJCQkJCQkJKyBody0+c2VpX2RhdGFfbGVuOworCQkJCWxlZnRfbGVuID0gU0VJX0RBVEFfU0laRSAtIGh3LT5zZWlfZGF0YV9sZW47CisJCQkJaWYgKGF1eF9kYXRhX2xlbi8yIDw9IGxlZnRfbGVuKSB7CisJCQkJCWZvciAoaSA9IDA7IGkgPCBhdXhfZGF0YV9sZW4vMjsgaSsrKQorCQkJCQkJc2VpX2RhdGFfYnVmW2ldCisJCQkJCQkJPSB0cmFuc19kYXRhX2J1ZltpKjJdOworCisJCQkJCWF1eF9kYXRhX2xlbiA9IGF1eF9kYXRhX2xlbiAvIDI7CisJCQkJCWZvciAoaSA9IDA7IGkgPCBhdXhfZGF0YV9sZW47IGkgPSBpKzQpIHsKKwkJCQkJCXN3YXBfYnl0ZSA9IHNlaV9kYXRhX2J1ZltpXTsKKwkJCQkJCXNlaV9kYXRhX2J1ZltpXQorCQkJCQkJCT0gc2VpX2RhdGFfYnVmW2krM107CisJCQkJCQlzZWlfZGF0YV9idWZbaSszXSA9IHN3YXBfYnl0ZTsKKworCQkJCQkJc3dhcF9ieXRlID0gc2VpX2RhdGFfYnVmW2krMV07CisJCQkJCQlzZWlfZGF0YV9idWZbaSsxXQorCQkJCQkJCT0gc2VpX2RhdGFfYnVmW2krMl07CisJCQkJCQlzZWlfZGF0YV9idWZbaSsyXSA9IHN3YXBfYnl0ZTsKKwkJCQkJfQorCisJCQkJCWZvciAoaSA9IGF1eF9kYXRhX2xlbi0xOyBpID49IDA7IGktLSkKKwkJCQkJCWlmIChzZWlfZGF0YV9idWZbaV0gIT0gMCkKKwkJCQkJCQlicmVhazsKKworCQkJCQlody0+c2VpX2RhdGFfbGVuICs9IGkrMTsKKwkJCQl9IGVsc2UKKwkJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJCQlQUklOVF9GTEFHX0VSUk9SLAorCQkJCQkJInNlaSBkYXRhIHNpemUgJWQgYW5kIG1vcmUgdGhhbiBsZWZ0IHNwYWNlOiAlZCwgZGlzY2FyZGVkIGl0XG4iLAorCQkJCQkJaHctPnNlaV9pdHVfZGF0YV9sZW4sCisJCQkJCQlsZWZ0X2xlbik7CisJCQl9CisJCX0KKwkJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX1RIUkVBRF9FRE4pOworCQlXUklURV9WUkVHKERQQl9TVEFUVVNfUkVHLCBIMjY0X1NFSV9EQVRBX0RPTkUpOworCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKworCS8qIHVjb2RlIGRlYnVnICovCisJZGVidWdfdGFnID0gUkVBRF9WUkVHKERFQlVHX1JFRzEpOworCWlmIChkZWJ1Z190YWcgJiAweDEwMDAwKSB7CisJCXVuc2lnbmVkIHNob3J0ICpwID0gKHVuc2lnbmVkIHNob3J0ICopaHctPmxtZW1fYWRkcjsKKworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSJMTUVNPHRhZyAleD46XG4iLCBkZWJ1Z190YWcpOworCQlmb3IgKGkgPSAwOyBpIDwgMHg0MDA7IGkgKz0gNCkgeworCQkJaW50IGlpOworCQkJaWYgKChpICYgMHhmKSA9PSAwKQorCQkJCWRwYl9wcmludF9jb250KERFQ09ERV9JRChodyksIDAsCisJCQkJCSIlMDN4OiAiLCBpKTsKKwkJCWZvciAoaWkgPSAwOyBpaSA8IDQ7IGlpKyspCisJCQkJZHBiX3ByaW50X2NvbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCQkJIiUwNHggIiwgcFtpKzMtaWldKTsKKwkJCWlmICgoKGkraWkpICYgMHhmKSA9PSAwKQorCQkJCWRwYl9wcmludF9jb250KERFQ09ERV9JRChodyksIDAsCisJCQkJCSJcbiIpOworCQl9CisJCWlmICgoKHVkZWJ1Z19wYXVzZV9wb3MgJiAweGZmZmYpCisJCQk9PSAoZGVidWdfdGFnICYgMHhmZmZmKSkgJiYKKwkJCSh1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeCA9PSAwIHx8CisJCQl1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeCA9PQorCQkJaHctPmRlY29kZV9waWNfY291bnQpICYmCisJCQkodWRlYnVnX3BhdXNlX3ZhbCA9PSAwIHx8CisJCQl1ZGVidWdfcGF1c2VfdmFsID09IFJFQURfVlJFRyhERUJVR19SRUcyKSkpIHsKKwkJCXVkZWJ1Z19wYXVzZV9wb3MgJj0gMHhmZmZmOworCQkJaHctPnVjb2RlX3BhdXNlX3BvcyA9IHVkZWJ1Z19wYXVzZV9wb3M7CisJCX0KKwkJZWxzZSBpZiAoZGVidWdfdGFnICYgMHgyMDAwMCkKKwkJCWh3LT51Y29kZV9wYXVzZV9wb3MgPSAweGZmZmZmZmZmOworCQlpZiAoaHctPnVjb2RlX3BhdXNlX3BvcykKKwkJCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisJCWVsc2UKKwkJCVdSSVRFX1ZSRUcoREVCVUdfUkVHMSwgMCk7CisJfSBlbHNlIGlmIChkZWJ1Z190YWcgIT0gMCkgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19VQ09ERV9FVlQsCisJCQkiZGJnJXg6ICV4XG4iLCBkZWJ1Z190YWcsCisJCQlSRUFEX1ZSRUcoREVCVUdfUkVHMikpOworCQlpZiAoKCh1ZGVidWdfcGF1c2VfcG9zICYgMHhmZmZmKQorCQkJPT0gKGRlYnVnX3RhZyAmIDB4ZmZmZikpICYmCisJCQkodWRlYnVnX3BhdXNlX2RlY29kZV9pZHggPT0gMCB8fAorCQkJdWRlYnVnX3BhdXNlX2RlY29kZV9pZHggPT0KKwkJCWh3LT5kZWNvZGVfcGljX2NvdW50KSAmJgorCQkJKHVkZWJ1Z19wYXVzZV92YWwgPT0gMCB8fAorCQkJdWRlYnVnX3BhdXNlX3ZhbCA9PSBSRUFEX1ZSRUcoREVCVUdfUkVHMikpKSB7CisJCQl1ZGVidWdfcGF1c2VfcG9zICY9IDB4ZmZmZjsKKwkJCWh3LT51Y29kZV9wYXVzZV9wb3MgPSB1ZGVidWdfcGF1c2VfcG9zOworCQl9CisJCWlmIChody0+dWNvZGVfcGF1c2VfcG9zKQorCQkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwkJZWxzZQorCQkJV1JJVEVfVlJFRyhERUJVR19SRUcxLCAwKTsKKwl9CisJLyoqLworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IHZoMjY0X2lzcihzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgaXJxKQoreworCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcgPSAoc3RydWN0IHZkZWNfaDI2NF9od19zICopKHZkZWMtPnByaXZhdGUpOworCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gJmh3LT5kcGI7CisKKworCVdSSVRFX1ZSRUcoQVNTSVNUX01CT1gxX0NMUl9SRUcsIDEpOworCisJaWYgKCFodykKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJaWYgKGh3LT5lb3MpCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCXBfSDI2NF9EcGItPnZkZWMgPSB2ZGVjOworCXBfSDI2NF9EcGItPmRlY19kcGJfc3RhdHVzID0gUkVBRF9WUkVHKERQQl9TVEFUVVNfUkVHKTsKKworCWlmIChwX0gyNjRfRHBiLT5kZWNfZHBiX3N0YXR1cyA9PSBIMjY0X1NMSUNFX0hFQURfRE9ORSB8fAorCQlwX0gyNjRfRHBiLT5kZWNfZHBiX3N0YXR1cyA9PSBIMjY0X0NPTkZJR19SRVFVRVNUKSB7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9IRUFEX0RPTkUpOworCX0KKwllbHNlIGlmIChwX0gyNjRfRHBiLT5kZWNfZHBiX3N0YXR1cyA9PSBIMjY0X1BJQ19EQVRBX0RPTkUpIHsKKwkJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX1BJQ19ET05FKTsKKwl9CisJZWxzZSBpZiAocF9IMjY0X0RwYi0+ZGVjX2RwYl9zdGF0dXMgPT0gSDI2NF9TRUlfREFUQV9SRUFEWSkKKwkJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX1NFSV9ET05FKTsKKwllbHNlIGlmIChwX0gyNjRfRHBiLT5kZWNfZHBiX3N0YXR1cyA9PSBIMjY0X0FVWF9EQVRBX1JFQURZKQorCQlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9JU1JfQVVYX0RPTkUpOworCisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVUNPREVfRVZULAorCQkJIiVzIERQQl9TVEFUVVNfUkVHOiAweCV4LCBydW4oJWQpIGxhc3Rfc3RhdGUgKCV4KSBFUlJPUl9TVEFUVVNfUkVHIDB4JXgsIHNiICgweCV4IDB4JXggMHgleCkgYml0Y250IDB4JXggbWJ5X21ieCAweCV4XG4iLAorCQkJX19mdW5jX18sCisJCQlwX0gyNjRfRHBiLT5kZWNfZHBiX3N0YXR1cywKKwkJCXJ1bl9jb3VudFtERUNPREVfSUQoaHcpXSwKKwkJCWh3LT5kZWNfcmVzdWx0LAorCQkJUkVBRF9WUkVHKEVSUk9SX1NUQVRVU19SRUcpLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKSwKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19XUCksCisJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApLAorCQkJUkVBRF9WUkVHKFZJRkZfQklUX0NOVCksCisJCQlSRUFEX1ZSRUcoTUJZX01CWCkpOworCisJQVRSQUNFX0NPVU5URVIoIlZfU1RfREVDLWRlY29kZV9zdGF0ZSIsIHBfSDI2NF9EcGItPmRlY19kcGJfc3RhdHVzKTsKKworCWlmIChwX0gyNjRfRHBiLT5kZWNfZHBiX3N0YXR1cyA9PSBIMjY0X1dSUlNQX1JFUVVFU1QpIHsKKwkJaWYgKGh3LT5tbXVfZW5hYmxlKQorCQkJaGV2Y19zYW9fd2FpdF9kb25lKGh3KTsKKwkJV1JJVEVfVlJFRyhEUEJfU1RBVFVTX1JFRywgSDI2NF9XUlJTUF9ET05FKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9JU1JfRU5EKTsKKwlyZXR1cm4gSVJRX1dBS0VfVEhSRUFEOworCit9CisKK3N0YXRpYyB2b2lkIHRpbWVvdXRfcHJvY2VzcyhzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3KQoreworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGh3KTsKKworCS8qCisJICogSW4gdGhpcyB2ZXJ5IHRpbWVvdXQgcG9pbnQsdGhlIHZoMjY0X3dvcmsgYXJyaXZlcywKKwkgKiBvciBpbiBzb21lIGNhc2VzIHRoZSBzeXN0ZW0gYmVjb21lIHNsb3csICB0aGVuIGNvbWUKKwkgKiB0aGlzIHNlY29uZCB0aW1lb3V0LiBJbiBib3RoIGNhc2VzIHdlIHJldHVybi4KKwkgKi8KKwlpZiAod29ya19wZW5kaW5nKCZody0+d29yaykgfHwKKwkgICAgd29ya19idXN5KCZody0+d29yaykgfHwKKwkgICAgd29ya19idXN5KCZody0+dGltZW91dF93b3JrKSB8fAorCSAgICB3b3JrX3BlbmRpbmcoJmh3LT50aW1lb3V0X3dvcmspKSB7CisJCXByX2VycigiJXMgaDI2NFslZF0gd29yayBwZW5kaW5nLCBkbyBub3RoaW5nLlxuIixfX2Z1bmNfXywgdmRlYy0+aWQpOworCQlyZXR1cm47CisJfQorCisJaHctPnRpbWVvdXRfbnVtKys7CisJYW12ZGVjX3N0b3AoKTsKKwl2ZGVjLT5tY19sb2FkZWQgPSAwOworCWlmIChody0+bW11X2VuYWJsZSkgeworCQloZXZjX3NldF9mcmFtZV9kb25lKGh3KTsKKwkJaGV2Y19zYW9fd2FpdF9kb25lKGh3KTsKKwl9CisJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCVBSSU5UX0ZMQUdfRVJST1IsICIlcyBkZWNvZGVyIHRpbWVvdXQsIERQQl9TVEFUVVNfUkVHIDB4JXhcbiIsIF9fZnVuY19fLCBSRUFEX1ZSRUcoRFBCX1NUQVRVU19SRUcpKTsKKwlyZWxlYXNlX2N1cl9kZWNvZGluZ19idWYoaHcpOworCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9USU1FT1VUOworCWh3LT5kYXRhX2ZsYWcgfD0gRVJST1JfRkxBRzsKKworCWlmICh3b3JrX3BlbmRpbmcoJmh3LT53b3JrKSkKKwkJcmV0dXJuOworCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPnRpbWVvdXRfd29yayk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfYnVmc3BlYyhzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LAorCWNvbnN0IGNoYXIgKmNhbGxlcikKK3sKKwlpbnQgaTsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIiVzIGluICVzOlxuIiwgX19mdW5jX18sIGNhbGxlcik7CisJZm9yIChpID0gMDsgaSA8IEJVRlNQRUNfUE9PTF9TSVpFOyBpKyspIHsKKwkJaWYgKGh3LT5idWZmZXJfc3BlY1tpXS51c2VkID09IC0xKQorCQkJY29udGludWU7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJImJ1ZnNwZWMgKCVkKTogdXNlZCAlZCBhZHIgMHgleCglbHgpIGNhbnZhcyglZCkgdmZfcmVmKCVkKSAiLAorCQkJaSwgaHctPmJ1ZmZlcl9zcGVjW2ldLnVzZWQsCisJCQlody0+YnVmZmVyX3NwZWNbaV0uYnVmX2FkciwKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS5jbWFfYWxsb2NfYWRkciwKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfcG9zLAorCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZmX3JlZgorCQkJKTsKKyNpZmRlZiBDT05GSUdfQU1fVkRFQ19EVgorCQlkcGJfcHJpbnRfY29udChERUNPREVfSUQoaHcpLCAwLAorCQkJImR2X2VsX2V4aXN0ICVkIiwKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS5kdl9lbmhhbmNlX2V4aXN0CisJCSk7CisjZW5kaWYKKwkJZHBiX3ByaW50X2NvbnQoREVDT0RFX0lEKGh3KSwgMCwgIlxuIik7CisJfQorCit9CisKK3N0YXRpYyB2b2lkIHZtaDI2NF9kdW1wX3N0YXRlKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IHZkZWNfaDI2NF9od19zICpodyA9CisJCShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKikodmRlYy0+cHJpdmF0ZSk7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSAmaHctPmRwYjsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIj09PT09PSAlc1xuIiwgX19mdW5jX18pOworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkid2lkdGgvaGVpZ2h0ICglZC8lZCksIG51bV9yZW9yZGVyX2ZyYW1lcyAlZCBkZWNfZHBiX3NpemUgJWQgZHBiIHNpemUoYnVmc3BlYyBjb3VudCkgJWQgbWF4X3JlZmVyZW5jZV9zaXplKGNvbGxvY2F0ZSBjb3VudCkgJWQgaV9vbmx5ICVkIHNpZ25hbF90eXBlIDB4JXggc2VuZF9lcnIgJWRcbiIsCisJCWh3LT5mcmFtZV93aWR0aCwKKwkJaHctPmZyYW1lX2hlaWdodCwKKwkJaHctPm51bV9yZW9yZGVyX2ZyYW1lcywKKwkJaHctPmRwYi5kZWNfZHBiX3NpemUsCisJCWh3LT5kcGIubURQQi5zaXplLAorCQlody0+bWF4X3JlZmVyZW5jZV9zaXplLAorCQlody0+aV9vbmx5LAorCQlody0+dmlkZW9fc2lnbmFsX3R5cGUsCisJCWh3LT5zZW5kX2Vycm9yX2ZyYW1lX2ZsYWcKKwkJKTsKKworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiaXNfZnJhbWViYXNlKCVkKSwgZW9zICVkLCBzdGF0ZSAweCV4LCBkZWNfcmVzdWx0IDB4JXggZGVjX2ZybSAlZCBkaXNwX2ZybSAlZCBydW4gJWQgbm90X3J1bl9yZWFkeSAlZCBpbnB1dF9lbXB0eSAlZCBidWZtZ3JfcmVzZXRfY250ICVkIGVycm9yX2ZyYW1lX2NvdW50ID0gJWQsIGRyb3BfZnJhbWVfY291bnQgPSAlZFxuIiwKKwkJaW5wdXRfZnJhbWVfYmFzZWQodmRlYyksCisJCWh3LT5lb3MsCisJCWh3LT5zdGF0LAorCQlody0+ZGVjX3Jlc3VsdCwKKwkJZGVjb2RlX2ZyYW1lX2NvdW50W0RFQ09ERV9JRChodyldLAorCQlkaXNwbGF5X2ZyYW1lX2NvdW50W0RFQ09ERV9JRChodyldLAorCQlydW5fY291bnRbREVDT0RFX0lEKGh3KV0sCisJCW5vdF9ydW5fcmVhZHlbREVDT0RFX0lEKGh3KV0sCisJCWlucHV0X2VtcHR5W0RFQ09ERV9JRChodyldLAorCQlody0+cmVzZXRfYnVmbWdyX2NvdW50LAorCQlody0+Z3ZzLmVycm9yX2ZyYW1lX2NvdW50LAorCQlody0+Z3ZzLmRyb3BfZnJhbWVfY291bnQKKwkJKTsKKworI2lmZGVmIERFVEVDVF9XUk9OR19NVUxUSV9TTElDRQorCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIk1VTFRJX1NMSUNFX0RFVEVDVCAoY2hlY2tfY291bnQgJWQgc2xpY2VfY291bnQgJWQgY3VyX3NsaWNlX2NvdW50ICVkIGZsYWcgJWQpXG4iLAorCQlody0+bXVsdGlfc2xpY2VfcGljX2NoZWNrX2NvdW50LAorCQlody0+cGljdHVyZV9zbGljZV9jb3VudCwKKwkJaHctPmN1cl9waWN0dXJlX3NsaWNlX2NvdW50LAorCQlody0+bXVsdGlfc2xpY2VfcGljX2ZsYWcpOworI2VuZGlmCisJaWYgKCFody0+aXNfdXNlZF92NGwgJiYgdmZfZ2V0X3JlY2VpdmVyKHZkZWMtPnZmX3Byb3ZpZGVyX25hbWUpKSB7CisJCWVudW0gcmVjZXZpdmVyX3N0YXJ0X2Ugc3RhdGUgPQorCQl2Zl9ub3RpZnlfcmVjZWl2ZXIodmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9RVVJFWV9TVEFURSwKKwkJCU5VTEwpOworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSJcbnJlY2VpdmVyKCVzKSBzdGF0ZSAlZFxuIiwKKwkJCXZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQlzdGF0ZSk7CisJfQorCisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJIiVzLCBuZXdxKCVkLyVkKSwgZGlzcHEoJWQvJWQpIHZmIHByZXBhcmUvZ2V0L3B1dCAoJWQvJWQvJWQpLCBmcmVlX3NwZWMoJWQpLCBpbml0ZG9uKCVkKSwgdXNlZF9zaXplKCVkLyVkKSwgdW51c2VkX2ZyX2RwYiglZCkgIGZhc3Rfb3V0cHV0X2VuYWJsZSAleCBcbiIsCisJX19mdW5jX18sCisJa2ZpZm9fbGVuKCZody0+bmV3ZnJhbWVfcSksCisJVkZfUE9PTF9TSVpFLAorCWtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSksCisJVkZfUE9PTF9TSVpFLAorCWh3LT52Zl9wcmVfY291bnQsCisJaHctPnZmX2dldF9jb3VudCwKKwlody0+dmZfcHV0X2NvdW50LAorCWhhdmVfZnJlZV9idWZfc3BlYyh2ZGVjKSwKKwlwX0gyNjRfRHBiLT5tRFBCLmluaXRfZG9uZSwKKwlwX0gyNjRfRHBiLT5tRFBCLnVzZWRfc2l6ZSwgcF9IMjY0X0RwYi0+bURQQi5zaXplLAorCWlzX3RoZXJlX3VudXNlZF9mcmFtZV9mcm9tX2RwYigmcF9IMjY0X0RwYi0+bURQQiksCisJcF9IMjY0X0RwYi0+ZmFzdF9vdXRwdXRfZW5hYmxlCisJKTsKKworCWR1bXBfZHBiKCZwX0gyNjRfRHBiLT5tRFBCLCAxKTsKKwlkdW1wX3BpYyhwX0gyNjRfRHBiKTsKKwlkdW1wX2J1ZnNwZWMoaHcsIF9fZnVuY19fKTsKKworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiRFBCX1NUQVRVU19SRUc9MHgleFxuIiwKKwkJUkVBRF9WUkVHKERQQl9TVEFUVVNfUkVHKSk7CisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSJNUENfRT0weCV4XG4iLAorCQlSRUFEX1ZSRUcoTVBDX0UpKTsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIkgyNjRfREVDT0RFX01PREU9MHgleFxuIiwKKwkJUkVBRF9WUkVHKEgyNjRfREVDT0RFX01PREUpKTsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIk1CWV9NQlg9MHgleFxuIiwKKwkJUkVBRF9WUkVHKE1CWV9NQlgpKTsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIkgyNjRfREVDT0RFX1NJWkU9MHgleFxuIiwKKwkJUkVBRF9WUkVHKEgyNjRfREVDT0RFX1NJWkUpKTsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIlZJRkZfQklUX0NOVD0weCV4XG4iLAorCQlSRUFEX1ZSRUcoVklGRl9CSVRfQ05UKSk7CisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSJWTERfTUVNX1ZJRklGT19MRVZFTD0weCV4XG4iLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpKTsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIlZMRF9NRU1fVklGSUZPX1dQPTB4JXhcbiIsCisJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19XUCkpOworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiVkxEX01FTV9WSUZJRk9fUlA9MHgleFxuIiwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSk7CisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSJQQVJTRVJfVklERU9fUlA9MHgleFxuIiwKKwkJU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3JwKSk7CisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSJQQVJTRVJfVklERU9fV1A9MHgleFxuIiwKKwkJU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3dwKSk7CisKKwlpZiAoaW5wdXRfZnJhbWVfYmFzZWQodmRlYykgJiYKKwkJZHBiX2lzX2RlYnVnKERFQ09ERV9JRChodyksCisJCVBSSU5UX0ZSQU1FQkFTRV9EQVRBKQorCQkpIHsKKwkJaW50IGpqOworCQlpZiAoaHctPmNodW5rICYmIGh3LT5jaHVuay0+YmxvY2sgJiYKKwkJCWh3LT5jaHVuay0+c2l6ZSA+IDApIHsKKwkJCXU4ICpkYXRhID0gTlVMTDsKKworCQkJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQkJZGF0YSA9IGNvZGVjX21tX3ZtYXAoaHctPmNodW5rLT5ibG9jay0+c3RhcnQgKworCQkJCQlody0+Y2h1bmstPm9mZnNldCwgaHctPmNodW5rLT5zaXplKTsKKwkJCWVsc2UKKwkJCQlkYXRhID0gKCh1OCAqKWh3LT5jaHVuay0+YmxvY2stPnN0YXJ0X3ZpcnQpCisJCQkJCSsgaHctPmNodW5rLT5vZmZzZXQ7CisKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJCSJmcmFtZSBkYXRhIHNpemUgMHgleFxuIiwKKwkJCQlody0+Y2h1bmstPnNpemUpOworCQkJZm9yIChqaiA9IDA7IGpqIDwgaHctPmNodW5rLT5zaXplOyBqaisrKSB7CisJCQkJaWYgKChqaiAmIDB4ZikgPT0gMCkKKwkJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJCVBSSU5UX0ZSQU1FQkFTRV9EQVRBLAorCQkJCQkJIiUwNng6IiwgamopOworCQkJCWRwYl9wcmludF9jb250KERFQ09ERV9JRChodyksCisJCQkJUFJJTlRfRlJBTUVCQVNFX0RBVEEsCisJCQkJCSIlMDJ4ICIsIGRhdGFbampdKTsKKwkJCQlpZiAoKChqaiArIDEpICYgMHhmKSA9PSAwKQorCQkJCQlkcGJfcHJpbnRfY29udChERUNPREVfSUQoaHcpLAorCQkJCQlQUklOVF9GUkFNRUJBU0VfREFUQSwKKwkJCQkJCSJcbiIpOworCQkJfQorCisJCQlpZiAoIWh3LT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJCQljb2RlY19tbV91bm1hcF9waHlhZGRyKGRhdGEpOworCQl9CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGNoZWNrX3RpbWVyX2Z1bmMoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcgPSBjb250YWluZXJfb2YodGltZXIsCisJCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcywgY2hlY2tfdGltZXIpOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGh3KTsKKwlpbnQgZXJyb3Jfc2tpcF9mcmFtZV9jb3VudCA9IGVycm9yX3NraXBfY291bnQgJiAweGZmZjsKKwl1bnNpZ25lZCBpbnQgdGltZW91dF92YWwgPSBkZWNvZGVfdGltZW91dF92YWw7CisJaWYgKHRpbWVvdXRfdmFsICE9IDAgJiYKKwkJaHctPm5vX2Vycm9yX2NvdW50IDwgZXJyb3Jfc2tpcF9mcmFtZV9jb3VudCkKKwkJdGltZW91dF92YWwgPSBlcnJvcmRhdGFfdGltZW91dF92YWw7CisJaWYgKChoMjY0X2RlYnVnX2NtZCAmIDB4MTAwKSAhPSAwICYmCisJCURFQ09ERV9JRChodykgPT0gKGgyNjRfZGVidWdfY21kICYgMHhmZikpIHsKKwkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQlwcl9pbmZvKCJ2ZGVjICVkIGlzIGZvcmNlZCB0byBiZSBkaXNjb25uZWN0ZWRcbiIsCisJCQloMjY0X2RlYnVnX2NtZCAmIDB4ZmYpOworCQloMjY0X2RlYnVnX2NtZCA9IDA7CisJCXJldHVybjsKKwl9CisJaWYgKChoMjY0X2RlYnVnX2NtZCAmIDB4MjAwKSAhPSAwICYmCisJCURFQ09ERV9JRChodykgPT0gKGgyNjRfZGVidWdfY21kICYgMHhmZikpIHsKKwkJcHJfZGVidWcoInZkZWMgJWQgaXMgZm9yY2VkIHRvIHJlc2V0IGJ1Zm1nclxuIiwKKwkJCWgyNjRfZGVidWdfY21kICYgMHhmZik7CisJCWh3LT5yZXNldF9idWZtZ3JfZmxhZyA9IDE7CisJCWgyNjRfZGVidWdfY21kID0gMDsKKwkJcmV0dXJuOworCX0KKworCWlmICh2ZGVjLT5uZXh0X3N0YXR1cyA9PSBWREVDX1NUQVRVU19ESVNDT05ORUNURUQgJiYKKwkJCSFody0+aXNfdXNlZF92NGwpIHsKKwkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0ZPUkNFX0VYSVQ7CisJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQlwcl9kZWJ1ZygidmRlYyByZXF1ZXN0ZWQgdG8gYmUgZGlzY29ubmVjdGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChyYWRyICE9IDApIHsKKwkJaWYgKHJ2YWwgIT0gMCkgeworCQkJV1JJVEVfVlJFRyhyYWRyLCBydmFsKTsKKwkJCXByX2luZm8oIldSSVRFX1ZSRUcoJXgsJXgpXG4iLCByYWRyLCBydmFsKTsKKwkJfSBlbHNlCisJCQlwcl9pbmZvKCJSRUFEX1ZSRUcoJXgpPSV4XG4iLCByYWRyLCBSRUFEX1ZSRUcocmFkcikpOworCQlydmFsID0gMDsKKwkJcmFkciA9IDA7CisJfQorCisJaWYgKCgoaDI2NF9kZWJ1Z19mbGFnICYgRElTQUJMRV9FUlJPUl9IQU5ETEUpID09IDApICYmCisJCSh0aW1lb3V0X3ZhbCA+IDApICYmCisJCShody0+c3RhcnRfcHJvY2Vzc190aW1lID4gMCkgJiYKKwkJKCgxMDAwICogKGppZmZpZXMgLSBody0+c3RhcnRfcHJvY2Vzc190aW1lKSAvIEhaKQorCQkJPiB0aW1lb3V0X3ZhbCkKKwkpIHsKKwkJdTMyIGRwYl9zdGF0dXMgPSBSRUFEX1ZSRUcoRFBCX1NUQVRVU19SRUcpOworCQl1MzIgbWJ5X21ieCA9IFJFQURfVlJFRyhNQllfTUJYKTsKKwkJaWYgKChkcGJfc3RhdHVzID09IEgyNjRfQUNUSU9OX0RFQ09ERV9ORVdQSUMpIHx8CisJCQkoZHBiX3N0YXR1cyA9PSBIMjY0X0FDVElPTl9ERUNPREVfU0xJQ0UpIHx8CisJCQkoZHBiX3N0YXR1cyA9PSBIMjY0X1NFSV9EQVRBX0RPTkUpIHx8CisJCQkoZHBiX3N0YXR1cyA9PSBIMjY0X1NUQVRFX1NFQVJDSF9IRUFEKSB8fAorCQkJKGRwYl9zdGF0dXMgPT0gSDI2NF9TTElDRV9IRUFEX0RPTkUpIHx8CisJCQkoZHBiX3N0YXR1cyA9PSBIMjY0X1NFSV9EQVRBX1JFQURZKSkgeworCQkJaWYgKGgyNjRfZGVidWdfZmxhZyAmIERFQlVHX1RJTUVPVVRfREVDX1NUQVQpCisJCQkJcHJfZGVidWcoIiVzIGRwYl9zdGF0dXMgPSAweCV4IGxhc3RfbWJ5X21ieCA9ICV1IG1ieV9tYnggPSAldVxuIiwKKwkJCQlfX2Z1bmNfXywgZHBiX3N0YXR1cywgaHctPmxhc3RfbWJ5X21ieCwgbWJ5X21ieCk7CisKKwkJCWlmIChody0+bGFzdF9tYnlfbWJ4ID09IG1ieV9tYngpIHsKKwkJCQlpZiAoaHctPmRlY29kZV90aW1lb3V0X2NvdW50ID4gMCkKKwkJCQkJaHctPmRlY29kZV90aW1lb3V0X2NvdW50LS07CisJCQkJaWYgKGh3LT5kZWNvZGVfdGltZW91dF9jb3VudCA9PSAwKQorCQkJCXsKKwkJCQkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwkJCQkJdGltZW91dF9wcm9jZXNzKGh3KTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlzdGFydF9wcm9jZXNzX3RpbWUoaHcpOworCQl9IGVsc2UgaWYgKGlzX2luX3BhcnNpbmdfc3RhdGUoZHBiX3N0YXR1cykpIHsKKwkJCWlmIChody0+bGFzdF92bGRfbGV2ZWwgPT0KKwkJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpKSB7CisJCQkJaWYgKGh3LT5kZWNvZGVfdGltZW91dF9jb3VudCA+IDApCisJCQkJCWh3LT5kZWNvZGVfdGltZW91dF9jb3VudC0tOworCQkJCWlmIChody0+ZGVjb2RlX3RpbWVvdXRfY291bnQgPT0gMCkKKwkJCQl7CisJCQkJCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisJCQkJCXRpbWVvdXRfcHJvY2Vzcyhodyk7CisJCQkJfQorCQkJfQorCQl9CisJCWh3LT5sYXN0X3ZsZF9sZXZlbCA9CisJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpOworCQlody0+bGFzdF9tYnlfbWJ4ID0gbWJ5X21ieDsKKwl9CisKKwlpZiAoKGh3LT51Y29kZV9wYXVzZV9wb3MgIT0gMCkgJiYKKwkJKGh3LT51Y29kZV9wYXVzZV9wb3MgIT0gMHhmZmZmZmZmZikgJiYKKwkJdWRlYnVnX3BhdXNlX3BvcyAhPSBody0+dWNvZGVfcGF1c2VfcG9zKSB7CisJCWh3LT51Y29kZV9wYXVzZV9wb3MgPSAwOworCQlXUklURV9WUkVHKERFQlVHX1JFRzEsIDApOworCX0KKworCW1vZF90aW1lcigmaHctPmNoZWNrX3RpbWVyLCBqaWZmaWVzICsgQ0hFQ0tfSU5URVJWQUwpOworfQorCitzdGF0aWMgaW50IGRlY19zdGF0dXMoc3RydWN0IHZkZWNfcyAqdmRlYywgc3RydWN0IHZkZWNfaW5mbyAqdnN0YXR1cykKK3sKKwl1MzIgYXIsIGFyX3RtcDsKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisKKwlpZiAoIWh3KQorCQlyZXR1cm4gLTE7CisKKwl2c3RhdHVzLT5mcmFtZV93aWR0aCA9IGh3LT5mcmFtZV93aWR0aDsKKwl2c3RhdHVzLT5mcmFtZV9oZWlnaHQgPSBody0+ZnJhbWVfaGVpZ2h0OworCWlmIChody0+ZXJyb3JfZnJhbWVfd2lkdGggJiYKKwkJaHctPmVycm9yX2ZyYW1lX2hlaWdodCkgeworCQl2c3RhdHVzLT5mcmFtZV93aWR0aCA9IGh3LT5lcnJvcl9mcmFtZV93aWR0aDsKKwkJdnN0YXR1cy0+ZnJhbWVfaGVpZ2h0ID0gaHctPmVycm9yX2ZyYW1lX2hlaWdodDsKKwl9CisJaWYgKGh3LT5mcmFtZV9kdXIgIT0gMCkgeworCQl2c3RhdHVzLT5mcmFtZV9kdXIgPSBody0+ZnJhbWVfZHVyOworCQl2c3RhdHVzLT5mcmFtZV9yYXRlID0gKCg5NjAwMCAqIDEwIC8gaHctPmZyYW1lX2R1cikgJSAxMCkgPCA1ID8KKwkJICAgICAgICAgICAgICAgICAgICA5NjAwMCAvIGh3LT5mcmFtZV9kdXIgOiAoOTYwMDAgLyBody0+ZnJhbWVfZHVyICsxKTsKKwl9CisJZWxzZQorCQl2c3RhdHVzLT5mcmFtZV9yYXRlID0gLTE7CisJdnN0YXR1cy0+ZXJyb3JfY291bnQgPSBody0+Z3ZzLmVycm9yX2ZyYW1lX2NvdW50OworCXZzdGF0dXMtPnN0YXR1cyA9IGh3LT5zdGF0OworCWlmIChody0+aDI2NF9hciA9PSAweDNmZikKKwkJYXJfdG1wID0gKDB4MTAwICoKKwkJCWh3LT5mcmFtZV9oZWlnaHQgKiBody0+aGVpZ2h0X2FzcGVjdF9yYXRpbykgLworCQkJKGh3LT5mcmFtZV93aWR0aCAqIGh3LT53aWR0aF9hc3BlY3RfcmF0aW8pOworCWVsc2UKKwkJYXJfdG1wID0gaHctPmgyNjRfYXI7CisJYXIgPSBtaW5fdCh1MzIsCisJCQlhcl90bXAsCisJCQlESVNQX1JBVElPX0FTUEVDVF9SQVRJT19NQVgpOworCXZzdGF0dXMtPnJhdGlvX2NvbnRyb2wgPQorCQlhciA8PCBESVNQX1JBVElPX0FTUEVDVF9SQVRJT19CSVQ7CisKKwl2c3RhdHVzLT5lcnJvcl9mcmFtZV9jb3VudCA9IGh3LT5ndnMuZXJyb3JfZnJhbWVfY291bnQ7CisJdnN0YXR1cy0+ZHJvcF9mcmFtZV9jb3VudCA9IGh3LT5ndnMuZHJvcF9mcmFtZV9jb3VudDsKKwl2c3RhdHVzLT5mcmFtZV9jb3VudCA9IGRlY29kZV9mcmFtZV9jb3VudFtERUNPREVfSUQoaHcpXTsKKwl2c3RhdHVzLT5pX2RlY29kZWRfZnJhbWVzID0gaHctPmd2cy5pX2RlY29kZWRfZnJhbWVzOworCXZzdGF0dXMtPmlfbG9zdF9mcmFtZXMgPSBody0+Z3ZzLmlfbG9zdF9mcmFtZXM7CisJdnN0YXR1cy0+aV9jb25jZWFsZWRfZnJhbWVzID0gaHctPmd2cy5pX2NvbmNlYWxlZF9mcmFtZXM7CisJdnN0YXR1cy0+cF9kZWNvZGVkX2ZyYW1lcyA9IGh3LT5ndnMucF9kZWNvZGVkX2ZyYW1lczsKKwl2c3RhdHVzLT5wX2xvc3RfZnJhbWVzID0gaHctPmd2cy5wX2xvc3RfZnJhbWVzOworCXZzdGF0dXMtPnBfY29uY2VhbGVkX2ZyYW1lcyA9IGh3LT5ndnMucF9jb25jZWFsZWRfZnJhbWVzOworCXZzdGF0dXMtPmJfZGVjb2RlZF9mcmFtZXMgPSBody0+Z3ZzLmJfZGVjb2RlZF9mcmFtZXM7CisJdnN0YXR1cy0+Yl9sb3N0X2ZyYW1lcyA9IGh3LT5ndnMuYl9sb3N0X2ZyYW1lczsKKwl2c3RhdHVzLT5iX2NvbmNlYWxlZF9mcmFtZXMgPSBody0+Z3ZzLmJfY29uY2VhbGVkX2ZyYW1lczsKKwlzbnByaW50Zih2c3RhdHVzLT52ZGVjX25hbWUsIHNpemVvZih2c3RhdHVzLT52ZGVjX25hbWUpLAorCQkiJXMtJTAyZCIsIERSSVZFUl9OQU1FLCBody0+aWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmgyNjRfaHdfY3R4X3Jlc3RvcmUoc3RydWN0IHZkZWNfaDI2NF9od19zICpodykKK3sKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKiB2NGwyX2N0eCA9IGh3LT52NGwyX2N0eDsKKwlody0+ZnJtYmFzZV9jb250X2ZsYWcgPSAwOworCisJLyogaWYgKGh3LT5pbml0X2ZsYWcgPT0gMCkgeyAqLworCWlmIChoMjY0X2RlYnVnX2ZsYWcgJiAweDQwMDAwMDAwKSB7CisJCS8qIGlmICgxKSAqLworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJIiVzLCByZXNldCByZWdpc3RlclxuIiwgX19mdW5jX18pOworCisJCXdoaWxlIChSRUFEX1ZSRUcoRENBQ19ETUFfQ1RSTCkgJiAweDgwMDApCisJCQk7CisJCXdoaWxlIChSRUFEX1ZSRUcoTE1FTV9ETUFfQ1RSTCkgJiAweDgwMDApCisJCQk7ICAgIC8qIHJlZyBhZGRyZXNzIGlzIDB4MzUwICovCisKKyNpZiAxIC8qIE1FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09ONiAqLworCQlXUklURV9WUkVHKERPU19TV19SRVNFVDAsICgxPDw3KSB8ICgxPDw2KSB8ICgxPDw0KSk7CisJCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgMCk7CisKKwkJUkVBRF9WUkVHKERPU19TV19SRVNFVDApOworCQlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMCk7CisJCVJFQURfVlJFRyhET1NfU1dfUkVTRVQwKTsKKworCQlXUklURV9WUkVHKERPU19TV19SRVNFVDAsICgxPDw3KSB8ICgxPDw2KSB8ICgxPDw0KSk7CisJCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgMCk7CisKKwkJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAoMTw8OSkgfCAoMTw8OCkpOworCQlXUklURV9WUkVHKERPU19TV19SRVNFVDAsIDApOworCisJCVJFQURfVlJFRyhET1NfU1dfUkVTRVQwKTsKKwkJUkVBRF9WUkVHKERPU19TV19SRVNFVDApOworCQlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMCk7CisKKyNlbHNlCisJCVdSSVRFX1JFU0VUX1JFRyhSRVNFVDBfUkVHSVNURVIsCisJCQlSRVNFVF9JUUlEQ1QgfCBSRVNFVF9NQyB8IFJFU0VUX1ZMRF9QQVJUKTsKKwkJUkVBRF9SRVNFVF9SRUcoUkVTRVQwX1JFR0lTVEVSKTsKKwkJCVdSSVRFX1JFU0VUX1JFRyhSRVNFVDBfUkVHSVNURVIsCisJCQlSRVNFVF9JUUlEQ1QgfCBSRVNFVF9NQyB8IFJFU0VUX1ZMRF9QQVJUKTsKKworCQlXUklURV9SRVNFVF9SRUcoUkVTRVQyX1JFR0lTVEVSLCBSRVNFVF9QSUNfREMgfCBSRVNFVF9EQkxLKTsKKyNlbmRpZgorCQlXUklURV9WUkVHKFBPV0VSX0NUTF9WTEQsCisJCQlSRUFEX1ZSRUcoUE9XRVJfQ1RMX1ZMRCkgfCAoMCA8PCAxMCkgfAorCQkJCSgxIDw8IDkpIHwgKDEgPDwgNikpOworCX0gZWxzZSB7CisJCS8qIFdSSVRFX1ZSRUcoUE9XRVJfQ1RMX1ZMRCwKKwkJICoJUkVBRF9WUkVHKFBPV0VSX0NUTF9WTEQpIHwgKDAgPDwgMTApIHwgKDEgPDwgOSkgKTsKKwkJICovCisJCVdSSVRFX1ZSRUcoUE9XRVJfQ1RMX1ZMRCwKKwkJCVJFQURfVlJFRyhQT1dFUl9DVExfVkxEKSB8CisJCQkJKDAgPDwgMTApIHwgKDEgPDwgOSkgfCAoMSA8PCA2KSk7CisJfQorCS8qIGRpc2FibGUgUFNDQUxFIGZvciBoYXJkd2FyZSBzaGFyaW5nICovCisJV1JJVEVfVlJFRyhQU0NBTEVfQ1RSTCwgMCk7CisKKwkvKiBjbGVhciBtYWlsYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoQVNTSVNUX01CT1gxX0NMUl9SRUcsIDEpOworCisJLyogZW5hYmxlIG1haWxib3ggaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfTUFTSywgMSk7CisKKyNpZmRlZiBOVjIxCisJU0VUX1ZSRUdfTUFTSyhNREVDX1BJQ19EQ19DVFJMLCAxPDwxNyk7CisjZW5kaWYKKworCS8qIGNiY3JfbWVyZ2Vfc3dhcF9lbiAqLworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3KSB7CisJCWlmICgodjRsMl9jdHgtPnFfZGF0YVtBTUxfUV9EQVRBX0RTVF0uZm10LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX05WMjEpIHx8CisJCQkodjRsMl9jdHgtPnFfZGF0YVtBTUxfUV9EQVRBX0RTVF0uZm10LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX05WMjFNKSkKKwkJCUNMRUFSX1ZSRUdfTUFTSyhNREVDX1BJQ19EQ19DVFJMLCAxIDw8IDE2KTsKKwkJZWxzZQorCQkJU0VUX1ZSRUdfTUFTSyhNREVDX1BJQ19EQ19DVFJMLCAxIDw8IDE2KTsKKwl9IGVsc2UgeworCQlpZiAoKHY0bDJfY3R4LT5xX2RhdGFbQU1MX1FfREFUQV9EU1RdLmZtdC0+Zm91cmNjID09IFY0TDJfUElYX0ZNVF9OVjIxKSB8fAorCQkJKHY0bDJfY3R4LT5xX2RhdGFbQU1MX1FfREFUQV9EU1RdLmZtdC0+Zm91cmNjID09IFY0TDJfUElYX0ZNVF9OVjIxTSkpCisJCQlTRVRfVlJFR19NQVNLKE1ERUNfUElDX0RDX0NUUkwsIDEgPDwgMTYpOworCQllbHNlCisJCQlDTEVBUl9WUkVHX01BU0soTURFQ19QSUNfRENfQ1RSTCwgMSA8PCAxNik7CisJfQorCisJU0VUX1ZSRUdfTUFTSyhNREVDX1BJQ19EQ19DVFJMLCAweGJmIDw8IDI0KTsKKwlDTEVBUl9WUkVHX01BU0soTURFQ19QSUNfRENfQ1RSTCwgMHhiZiA8PCAyNCk7CisKKwlDTEVBUl9WUkVHX01BU0soTURFQ19QSUNfRENfQ1RSTCwgMSA8PCAzMSk7CisJaWYgKGh3LT5tbXVfZW5hYmxlKSB7CisJCVNFVF9WUkVHX01BU0soTURFQ19QSUNfRENfTVVYX0NUUkwsIDE8PDMxKTsKKwkJLyogc3cgcmVzZXQgdG8gZXh0aWYgaGFyZHdhcmUgKi8KKwkJU0VUX1ZSRUdfTUFTSyhNREVDX0VYVElGX0NGRzEsIDE8PDMwKTsKKwkJQ0xFQVJfVlJFR19NQVNLKE1ERUNfRVhUSUZfQ0ZHMSwgMTw8MzApOworCX0gZWxzZSB7CisJCUNMRUFSX1ZSRUdfTUFTSyhNREVDX1BJQ19EQ19NVVhfQ1RSTCwgMSA8PCAzMSk7CisJCVdSSVRFX1ZSRUcoTURFQ19FWFRJRl9DRkcxLCAwKTsKKwl9CisKKworI2lmIDEgLyogI2lmIE1FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09OOCAqLworCS8qIHByX2luZm8oInZoMjY0IG1lc29uOCBwcm90IGluaXRcbiIpOyAqLworCVdSSVRFX1ZSRUcoTURFQ19QSUNfRENfVEhSRVNILCAweDQwNDAzOGFhKTsKKyNlbmRpZgorCisjaWZkZWYgVkRFQ19EVworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPCBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDcpIHsKKwkJaWYgKElTX1ZERUNfRFcoaHcpKSB7CisJCQl1MzIgZGF0YSA9ICgoMSAgIDw8IDMwKSB8KDEgICA8PCAgMCkgfCgxICAgPDwgIDgpKTsKKworCQkJaWYgKElTX1ZERUNfRFcoaHcpID09IDIpCisJCQkJZGF0YSB8PSAoMSAgIDw8ICA5KTsKKwkJCVdSSVRFX1ZSRUcoTURFQ19ET1VCTEVXX0NGRzAsIGRhdGEpOyAvKiBEb3VibGUgV3JpdGUgRW5hYmxlKi8KKwkJfQorCX0KKyNlbmRpZgorCWlmIChody0+ZHBiLm1EUEIuc2l6ZSA+IDApIHsKKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzcsIChody0+bWF4X3JlZmVyZW5jZV9zaXplIDw8IDI0KSB8CisJCQkoaHctPmRwYi5tRFBCLnNpemUgPDwgMTYpIHwKKwkJCShody0+ZHBiLm1EUEIuc2l6ZSA8PCA4KSk7CisKKwkJZm9yIChqID0gMDsgaiA8IGh3LT5kcGIubURQQi5zaXplOyBqKyspIHsKKwkJCWkgPSBnZXRfYnVmX3NwZWNfYnlfY2FudmFzX3Bvcyhodywgaik7CisJCQlpZiAoaSA8IDApCisJCQkJYnJlYWs7CisKKwkJCWlmICghaHctPm1tdV9lbmFibGUgJiYKKwkJCQlody0+YnVmZmVyX3NwZWNbaV0uY21hX2FsbG9jX2FkZHIpCisJCQkJY29uZmlnX2RlY29kZV9jYW52YXMoaHcsIGkpOworCQkJaWYgKGh3LT5tbXVfZW5hYmxlICYmIGh3LT5kb3VibGVfd3JpdGVfbW9kZSkKKwkJCQljb25maWdfZGVjb2RlX2NhbnZhc19leChodywgaSk7CisJCX0KKwl9IGVsc2UgeworCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfMCwgMCk7CisJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF85LCAwKTsKKwl9CisKKwlpZiAoaHctPmluaXRfZmxhZyA9PSAwKQorCQlXUklURV9WUkVHKERQQl9TVEFUVVNfUkVHLCAwKTsKKwllbHNlCisJCVdSSVRFX1ZSRUcoRFBCX1NUQVRVU19SRUcsIEgyNjRfQUNUSU9OX0RFQ09ERV9TVEFSVCk7CisKKwlXUklURV9WUkVHKEZSQU1FX0NPVU5URVJfUkVHLCBody0+ZGVjb2RlX3BpY19jb3VudCk7CisJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzgsIGh3LT5idWZfb2Zmc2V0KTsKKwlpZiAoIXRlZV9lbmFibGVkKCkpCisJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9HLCBody0+bWNfZG1hX2hhbmRsZSk7CisKKwkvKiBody0+ZXJyb3JfcmVjb3ZlcnlfbW9kZSA9IChlcnJvcl9yZWNvdmVyeV9tb2RlICE9IDApID8KKwkgKgllcnJvcl9yZWNvdmVyeV9tb2RlIDogZXJyb3JfcmVjb3ZlcnlfbW9kZV9pbjsKKwkgKi8KKwkvKiBXUklURV9WUkVHKEFWX1NDUkFUQ0hfRiwKKwkgKgkoUkVBRF9WUkVHKEFWX1NDUkFUQ0hfRikgJiAweGZmZmZmZmMzKSApOworCSAqLworCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9GLCAoaHctPnNhdmVfcmVnX2YgJiAweGZmZmZmZmMzKSB8CisJCSgoZXJyb3JfcmVjb3ZlcnlfbW9kZV9pbiAmIDB4MSkgPDwgNCkpOworCS8qaWYgKGh3LT51Y29kZV90eXBlID09IFVDT0RFX0lQX09OTFlfUEFSQU0pCisJCVNFVF9WUkVHX01BU0soQVZfU0NSQVRDSF9GLCAxIDw8IDYpOworCWVsc2UqLworCQlDTEVBUl9WUkVHX01BU0soQVZfU0NSQVRDSF9GLCAxIDw8IDYpOworCisJV1JJVEVfVlJFRyhMTUVNX0RVTVBfQURSLCAodTMyKWh3LT5sbWVtX3BoeV9hZGRyKTsKKyNpZiAxIC8qICNpZiBNRVNPTl9DUFVfVFlQRSA+PSBNRVNPTl9DUFVfVFlQRV9NRVNPTjggKi8KKwlXUklURV9WUkVHKE1ERUNfUElDX0RDX1RIUkVTSCwgMHg0MDQwMzhhYSk7CisjZW5kaWYKKworCVdSSVRFX1ZSRUcoREVCVUdfUkVHMSwgMCk7CisJV1JJVEVfVlJFRyhERUJVR19SRUcyLCAwKTsKKworCS8qQmVjYXVzZSBDU0QgZGF0YSBpcyBub3QgZm91bmQgYXQgcGxheWJhY2sgc3RhcnQsCisJICB0aGUgSVFJRENUX0NPTlRST0wgcmVnaXN0ZXIgaXMgbm90IHNhdmVkLAorCSAgdGhlIGluaXRpYWxpemVkIHZhbHVlIDB4MjAwIG9mIElRSURDVF9DT05UUk9MIGlzIHNldCovCisJaWYgKGh3LT5pbml0X2ZsYWcgJiYgKGh3LT5yZWdfaXFpZGN0X2NvbnRyb2xfaW5pdF9mbGFnID09IDApKQorCQlXUklURV9WUkVHKElRSURDVF9DT05UUk9MLCAweDIwMCk7CisKKwlpZiAoaHctPnJlZ19pcWlkY3RfY29udHJvbCkKKwkJV1JJVEVfVlJFRyhJUUlEQ1RfQ09OVFJPTCwgaHctPnJlZ19pcWlkY3RfY29udHJvbCk7CisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCwKKwkJIklRSURDVF9DT05UUk9MID0gMHgleFxuIiwgUkVBRF9WUkVHKElRSURDVF9DT05UUk9MKSk7CisKKwlpZiAoaHctPnJlZ192Y29wX2N0cmxfcmVnKQorCQlXUklURV9WUkVHKFZDT1BfQ1RSTF9SRUcsIGh3LT5yZWdfdmNvcF9jdHJsX3JlZyk7CisJaWYgKGh3LT52bGRfZGVjX2NvbnRyb2wpCisJCVdSSVRFX1ZSRUcoVkxEX0RFQ09ERV9DT05UUk9MLCBody0+dmxkX2RlY19jb250cm9sKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bWgyNjRfc2V0X3RyaWNrbW9kZShzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1bnNpZ25lZCBsb25nIHRyaWNrbW9kZSkKK3sKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0KKwkJKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJaWYgKGlfb25seV9mbGFnICYgMHgxMDApCisJCXJldHVybiAwOworCWlmICh0cmlja21vZGUgPT0gVFJJQ0tNT0RFX0kpCisJCWh3LT5pX29ubHkgPSAweDM7CisJZWxzZSBpZiAodHJpY2ttb2RlID09IFRSSUNLTU9ERV9OT05FKQorCQlody0+aV9vbmx5ID0gMHgwOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBhbXZkZWNfZW5hYmxlX2ZsYWc7CitzdGF0aWMgdm9pZCB2aDI2NF9sb2NhbF9pbml0KHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcsIGJvb2wgaXNfcmVzZXQpCit7CisJaW50IGk7CisJaHctPmluaXRfZmxhZyA9IDA7CisJaHctPmZpcnN0X3NjX2NoZWNrZWQ9IDA7CisJaHctPmVvcyA9IDA7CisJaHctPnZhbHZlX2NvdW50ID0gMDsKKwlody0+Y29uZmlnX2J1Zm1ncl9kb25lID0gMDsKKwlody0+c3RhcnRfcHJvY2Vzc190aW1lID0gMDsKKwlody0+aGFzX2lfZnJhbWUgPSAwOworCWh3LT5ub19lcnJvcl9jb3VudCA9IDB4ZmZmOworCWh3LT5ub19lcnJvcl9pX2NvdW50ID0gMHhmOworCisJaHctPmRlY19mbGFnID0gMDsKKwlody0+ZGF0YV9mbGFnID0gMDsKKwlody0+c2tpcF9mcmFtZV9jb3VudCA9IDA7CisJaHctPnJlZ19pcWlkY3RfY29udHJvbCA9IDA7CisJaHctPnJlZ19pcWlkY3RfY29udHJvbF9pbml0X2ZsYWcgPSAwOworCWh3LT5yZWdfdmNvcF9jdHJsX3JlZyA9IDA7CisJaHctPnJlZ19ydl9haV9tYl9jb3VudCA9IDA7CisJaHctPnZsZF9kZWNfY29udHJvbCA9IDA7CisJaHctPmRlY29kZV90aW1lb3V0X2NvdW50ID0gMDsKKwlody0+bm9fbWVtX2NvdW50ID0gMDsKKwlody0+dmgyNjRfcmF0aW8gPSBody0+dmgyNjRfYW1zdHJlYW1fZGVjX2luZm8ucmF0aW87CisJLyogdmgyNjRfcmF0aW8gPSAweDEwMDsgKi8KKworCWh3LT52aDI2NF9yb3RhdGlvbiA9ICgoKHVuc2lnbmVkIGxvbmcpCisJCQlody0+dmgyNjRfYW1zdHJlYW1fZGVjX2luZm8ucGFyYW0pID4+IDE2KSAmIDB4ZmZmZjsKKworCWh3LT5mcmFtZV9wcm9nID0gMDsKKwlody0+ZnJhbWVfd2lkdGggPSBody0+dmgyNjRfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGg7CisJaHctPmZyYW1lX2hlaWdodCA9IGh3LT52aDI2NF9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQ7CisJaHctPmZyYW1lX2R1ciA9IGh3LT52aDI2NF9hbXN0cmVhbV9kZWNfaW5mby5yYXRlOworCWh3LT5wdHNfb3V0c2lkZSA9ICgodW5zaWduZWQgbG9uZykKKwkJCWh3LT52aDI2NF9hbXN0cmVhbV9kZWNfaW5mby5wYXJhbSkgJiAweDAxOworCWh3LT5zeW5jX291dHNpZGUgPSAoKHVuc2lnbmVkIGxvbmcpCisJCQlody0+dmgyNjRfYW1zdHJlYW1fZGVjX2luZm8ucGFyYW0gJiAweDAyKSA+PiAxOworCWh3LT51c2VfaWRyX2ZyYW1lcmF0ZSA9ICgodW5zaWduZWQgbG9uZykKKwkJCWh3LT52aDI2NF9hbXN0cmVhbV9kZWNfaW5mby5wYXJhbSAmIDB4MDQpID4+IDI7CisJaHctPm1heF9yZWZlcl9idWYgPSAhKCgodW5zaWduZWQgbG9uZykKKwkJCWh3LT52aDI2NF9hbXN0cmVhbV9kZWNfaW5mby5wYXJhbSAmIDB4MTApID4+IDQpOworCWlmIChody0+ZnJhbWVfZHVyIDwgOTYwMDAvOTYwKSB7CisJCS8qbW9yZSB0aGFuIDk2MGZwcyxpdCBzaG91bGQgbm90IGJlIGEgY29ycmVjdCB2YWx1ZSwKKwkJICpnaXZlIGRlZmF1bHQgMzBmcHMKKwkJICovCisJCWh3LT5mcmFtZV9kdXIgPSA5NjAwMC8zMDsKKwl9CisKKwlody0+dW5zdGFibGVfcHRzID0gKCgodW5zaWduZWQgbG9uZykgaHctPnZoMjY0X2Ftc3RyZWFtX2RlY19pbmZvLnBhcmFtICYgMHg0MCkgPj4gNik7CisKKwlody0+Zmlyc3RfaV9wb2xpY3kgPSBmaXJzdF9pX3BvbGljeTsKKworCXByX2luZm8oIkgyNjQgc3lzaW5mbzogJWR4JWQgZHVyYXRpb249JWQsIHB0c19vdXRzaWRlPSVkXG4iLAorCQlody0+ZnJhbWVfd2lkdGgsIGh3LT5mcmFtZV9oZWlnaHQsIGh3LT5mcmFtZV9kdXIsIGh3LT5wdHNfb3V0c2lkZSk7CisJcHJfZGVidWcoInN5bmNfb3V0c2lkZT0lZCwgdXNlX2lkcl9mcmFtZXJhdGU9JWQsIGlzX3VzZWRfdjRsOiAlZFxuIiwKKwkJaHctPnN5bmNfb3V0c2lkZSwgaHctPnVzZV9pZHJfZnJhbWVyYXRlLCBody0+aXNfdXNlZF92NGwpOworCisJaWYgKGlfb25seV9mbGFnICYgMHgxMDApCisJCWh3LT5pX29ubHkgPSBpX29ubHlfZmxhZyAmIDB4ZmY7CisJaWYgKGh3LT5pX29ubHkpCisJCWh3LT5kcGIuZmlyc3RfaW5zZXJ0X2ZyYW1lID0gRmlyc3RJbnNlcnRGcm1fU0tJUERPTkU7CisKKwlpZiAoKHVuc2lnbmVkIGxvbmcpIGh3LT52aDI2NF9hbXN0cmVhbV9kZWNfaW5mby5wYXJhbQorCQkmIDB4MDgpCisJCWh3LT5ub19wb2NfcmVvcmRlcl9mbGFnID0gMTsKKworCWVycm9yX3JlY292ZXJ5X21vZGVfaW4gPSAxOyAvKnVjb2RlIGNvbnRyb2w/Ki8KKwlpZiAoaHctPmVycm9yX3Byb2NfcG9saWN5ICYgMHg4MDAwMDAwMCkKKwkJaHctPnNlbmRfZXJyb3JfZnJhbWVfZmxhZyA9IGh3LT5lcnJvcl9wcm9jX3BvbGljeSAmIDB4MTsKKwllbHNlIGlmICgodW5zaWduZWQgbG9uZykgaHctPnZoMjY0X2Ftc3RyZWFtX2RlY19pbmZvLnBhcmFtICYgMHgyMCkKKwkJaHctPnNlbmRfZXJyb3JfZnJhbWVfZmxhZyA9IDA7IC8qRG9uJ3QgZGlzcGxheSBtYXJrIGVyciBmcmFtZXMqLworCisJaWYgKCFpc19yZXNldCkgeworCQlJTklUX0tGSUZPKGh3LT5kaXNwbGF5X3EpOworCQlJTklUX0tGSUZPKGh3LT5uZXdmcmFtZV9xKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgVkZfUE9PTF9TSVpFOyBpKyspIHsKKwkJCWNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqdmYgPSAmKGh3LT52ZnBvb2xbaHctPmN1cl9wb29sXVtpXSk7CisJCQlody0+dmZwb29sW2h3LT5jdXJfcG9vbF1baV0uaW5kZXggPSAtMTsgLyogVkZfQlVGX05VTTsgKi8KKwkJCWh3LT52ZnBvb2xbaHctPmN1cl9wb29sXVtpXS5idWZXaWR0aCA9IDE5MjA7CisJCQlrZmlmb19wdXQoJmh3LT5uZXdmcmFtZV9xLCB2Zik7CisJCX0KKwl9CisKKwlody0+ZHVyYXRpb25fZnJvbV9wdHNfZG9uZSA9IDA7CisKKwlody0+cF9sYXN0X3ZmID0gTlVMTDsKKwlody0+dmgyNjRfc3RyZWFtX3N3aXRjaGluZ19zdGF0ZSA9IFNXSVRDSElOR19TVEFURV9PRkY7CisJaHctPmhldmNfY3VyX2J1Zl9pZHggPSAweGZmZmY7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZody0+d2FpdF9xKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHMzMiB2aDI2NF9pbml0KHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcpCit7CisJaW50IHNpemUgPSAtMTsKKwlpbnQgZndfc2l6ZSA9IDB4MTAwMCAqIDE2OworCWludCBmd19tbXVfc2l6ZSA9IDB4MTAwMCAqIDE2OworCXN0cnVjdCBmaXJtd2FyZV9zICpmdyA9IE5VTEwsICpmd19tbXUgPSBOVUxMOworCisJLyogaW50IHRyaWNrbW9kZV9mZmZiID0gMDsgKi8KKworCS8qIHByX2luZm8oIlxudmgyNjRfaW5pdFxuIik7ICovCisJLyogaW5pdF90aW1lcigmaHctPnJlY3ljbGVfdGltZXIpOyAqLworCisJLyogdGltZXIgaW5pdCAqLworCXRpbWVyX3NldHVwKCZody0+Y2hlY2tfdGltZXIsIGNoZWNrX3RpbWVyX2Z1bmMsIDApOworCWh3LT5jaGVja190aW1lci5leHBpcmVzID0gamlmZmllcyArIENIRUNLX0lOVEVSVkFMOworCisJLyogYWRkX3RpbWVyKCZody0+Y2hlY2tfdGltZXIpOyAqLworCWh3LT5zdGF0IHw9IFNUQVRfVElNRVJfQVJNOworCWh3LT5zdGF0IHw9IFNUQVRfSVNSX1JFRzsKKworCW11dGV4X2luaXQoJmh3LT5jaHVua3NfbXV0ZXgpOworCXZoMjY0X2xvY2FsX2luaXQoaHcsIGZhbHNlKTsKKwlJTklUX1dPUksoJmh3LT53b3JrLCB2aDI2NF93b3JrKTsKKwlJTklUX1dPUksoJmh3LT5ub3RpZnlfd29yaywgdmgyNjRfbm90aWZ5X3dvcmspOworCUlOSVRfV09SSygmaHctPnRpbWVvdXRfd29yaywgdmgyNjRfdGltZW91dF93b3JrKTsKKyNpZmRlZiBNSDI2NF9VU0VSREFUQV9FTkFCTEUKKwlJTklUX1dPUksoJmh3LT51c2VyX2RhdGFfcmVhZHlfd29yaywgdXNlcl9kYXRhX3JlYWR5X25vdGlmeV93b3JrKTsKKyNlbmRpZgorCisJLyppZiAoIWFtdmRlY19lbmFibGVfZmxhZykgeworCQlhbXZkZWNfZW5hYmxlX2ZsYWcgPSB0cnVlOworCQlhbXZkZWNfZW5hYmxlKCk7CisJCWlmIChody0+bW11X2VuYWJsZSkKKwkJCWFtaGV2Y19lbmFibGUoKTsKKwl9Ki8KKwlpZiAoaHctPm1tdV9lbmFibGUpIHsKKworCQlody0+ZnJhbWVfbW11X21hcF9hZGRyID0KKwkJCQlkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCUZSQU1FX01NVV9NQVBfU0laRSwKKwkJCQkmaHctPmZyYW1lX21tdV9tYXBfcGh5X2FkZHIsIEdGUF9LRVJORUwpOworCQlpZiAoaHctPmZyYW1lX21tdV9tYXBfYWRkciA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgY291bnRfYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCWZ3ID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IGZpcm13YXJlX3MpICsgZndfc2l6ZSk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGZ3KSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzaXplID0gZ2V0X2Zpcm13YXJlX2RhdGEoVklERU9fREVDX0gyNjRfTVVMVEksIGZ3LT5kYXRhKTsKKwlpZiAoc2l6ZSA8IDApIHsKKwkJcHJfZXJyKCJnZXQgZmlybXdhcmUgZmFpbC5cbiIpOworCQl2ZnJlZShmdyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlmdy0+bGVuID0gc2l6ZTsKKwlody0+ZncgPSBmdzsKKworCWlmIChody0+bW11X2VuYWJsZSkgeworCQlmd19tbXUgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgZmlybXdhcmVfcykgKyBmd19tbXVfc2l6ZSk7CisJCWlmIChJU19FUlJfT1JfTlVMTChmd19tbXUpKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJc2l6ZSA9IGdldF9maXJtd2FyZV9kYXRhKFZJREVPX0RFQ19IMjY0X01VTFRJX01NVSwgZndfbW11LT5kYXRhKTsKKwkJaWYgKHNpemUgPCAwKSB7CisJCQlwcl9lcnIoImdldCBtbXUgZncgZmFpbC5cbiIpOworCQkJdmZyZWUoZndfbW11KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWZ3X21tdS0+bGVuID0gc2l6ZTsKKwkJaHctPmZ3X21tdSA9IGZ3X21tdTsKKwl9CisKKwlpZiAoIXRlZV9lbmFibGVkKCkpIHsKKwkJLyogLS0gdWNvZGUgbG9hZGluZyAoYW1yaXNjIGFuZCBzd2FwIGNvZGUpICovCisJCWh3LT5tY19jcHVfYWRkciA9CisJCQlkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLCBNQ19UT1RBTF9TSVpFLAorCQkJCQkmaHctPm1jX2RtYV9oYW5kbGUsIEdGUF9LRVJORUwpOworCQlpZiAoIWh3LT5tY19jcHVfYWRkcikgeworCQkJYW12ZGVjX2VuYWJsZV9mbGFnID0gZmFsc2U7CisJCQlhbXZkZWNfZGlzYWJsZSgpOworCQkJaHctPnZkZWNfcGdfZW5hYmxlX2ZsYWcgPSAwOworCQkJaWYgKGh3LT5tbXVfZW5hYmxlKQorCQkJCWFtaGV2Y19kaXNhYmxlKCk7CisJCQlwcl9pbmZvKCJ2aDI2NF9pbml0OiBDYW4gbm90IGFsbG9jYXRlIG1jIG1lbW9yeS5cbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQkvKnByX2luZm8oIjI2NCB1Y29kZSBzd2FwIGFyZWE6IHBoeWFkZHIgJXAsIGNwdSB2YWRkciAlcFxuIiwKKwkJCSh2b2lkICopaHctPm1jX2RtYV9oYW5kbGUsIGh3LT5tY19jcHVfYWRkcik7CisJCSovCisKKwkJLypyZXQgPSBhbXZkZWNfbG9hZG1jX2V4KFZGT1JNQVRfSDI2NCwgTlVMTCwgYnVmKTsqLworCisJCS8qaGVhZGVyKi8KKwkJbWVtY3B5KCh1OCAqKSBody0+bWNfY3B1X2FkZHIgKyBNQ19PRkZTRVRfSEVBREVSLAorCQkJZnctPmRhdGEgKyAweDQwMDAsIE1DX1NXQVBfU0laRSk7CisJCS8qZGF0YSovCisJCW1lbWNweSgodTggKikgaHctPm1jX2NwdV9hZGRyICsgTUNfT0ZGU0VUX0RBVEEsCisJCQlmdy0+ZGF0YSArIDB4MjAwMCwgTUNfU1dBUF9TSVpFKTsKKwkJLyptbWNvKi8KKwkJbWVtY3B5KCh1OCAqKSBody0+bWNfY3B1X2FkZHIgKyBNQ19PRkZTRVRfTU1DTywKKwkJCWZ3LT5kYXRhICsgMHg2MDAwLCBNQ19TV0FQX1NJWkUpOworCQkvKmxpc3QqLworCQltZW1jcHkoKHU4ICopIGh3LT5tY19jcHVfYWRkciArIE1DX09GRlNFVF9MSVNULAorCQkJZnctPmRhdGEgKyAweDMwMDAsIE1DX1NXQVBfU0laRSk7CisJCS8qc2xpY2UqLworCQltZW1jcHkoKHU4ICopIGh3LT5tY19jcHVfYWRkciArIE1DX09GRlNFVF9TTElDRSwKKwkJCWZ3LT5kYXRhICsgMHg1MDAwLCBNQ19TV0FQX1NJWkUpOworCQkvKm1haW4qLworCQltZW1jcHkoKHU4ICopIGh3LT5tY19jcHVfYWRkciArIE1DX09GRlNFVF9NQUlOLAorCQkJZnctPmRhdGEsIDB4MjAwMCk7CisJCS8qZGF0YSovCisJCW1lbWNweSgodTggKikgaHctPm1jX2NwdV9hZGRyICsgTUNfT0ZGU0VUX01BSU4gKyAweDIwMDAsCisJCQlmdy0+ZGF0YSArIDB4MjAwMCwgMHgxMDAwKTsKKwkJLypzbGljZSovCisJCW1lbWNweSgodTggKikgaHctPm1jX2NwdV9hZGRyICsgTUNfT0ZGU0VUX01BSU4gKyAweDMwMDAsCisJCQlmdy0+ZGF0YSArIDB4NTAwMCwgMHgxMDAwKTsKKwl9CisKKyNpZiAxIC8qICNpZmRlZiAgQlVGRkVSX01HUl9JTl9DICovCisJaHctPmxtZW1fYWRkciA9IChkbWFfYWRkcl90KWRtYV9hbGxvY19jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQlQQUdFX1NJWkUsIChkbWFfYWRkcl90ICopJmh3LT5sbWVtX3BoeV9hZGRyLCBHRlBfS0VSTkVMKTsKKworCWlmIChody0+bG1lbV9hZGRyID09IDApIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFsbG9jIGxtZW0gYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtMTsKKwl9CisJcHJfZGVidWcoIiVzLCBwaHlfYWRkcj0lbHggdmFkZHI9JXBcbiIsCisJCV9fZnVuY19fLCBody0+bG1lbV9waHlfYWRkciwgKHZvaWQgKilody0+bG1lbV9hZGRyKTsKKworCWlmIChwcmVmaXhfYXV4X2J1Zl9zaXplID4gMCB8fAorCQlzdWZmaXhfYXV4X2J1Zl9zaXplID4gMCkgeworCQl1MzIgYXV4X2J1Zl9zaXplOworCQlody0+cHJlZml4X2F1eF9zaXplID0gQVVYX0JVRl9BTElHTihwcmVmaXhfYXV4X2J1Zl9zaXplKTsKKwkJaHctPnN1ZmZpeF9hdXhfc2l6ZSA9IEFVWF9CVUZfQUxJR04oc3VmZml4X2F1eF9idWZfc2l6ZSk7CisJCWF1eF9idWZfc2l6ZSA9IGh3LT5wcmVmaXhfYXV4X3NpemUgKyBody0+c3VmZml4X2F1eF9zaXplOworCQlody0+YXV4X2FkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCQkJICBhdXhfYnVmX3NpemUsICZody0+YXV4X3BoeV9hZGRyLAorCQkJCQkJICBHRlBfS0VSTkVMKTsKKwkJaWYgKGh3LT5hdXhfYWRkciA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgcnBtIGJ1ZmZlclxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaHctPnNlaV9kYXRhX2J1ZiA9IGttYWxsb2MoU0VJX0RBVEFfU0laRSwgR0ZQX0tFUk5FTCk7CisJCWlmIChody0+c2VpX2RhdGFfYnVmID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvYyBzZWkgaXR1IGRhdGEgYnVmZmVyXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlody0+c2VpX2l0dV9kYXRhX2J1ZiA9IGttYWxsb2MoU0VJX0lUVV9EQVRBX1NJWkUsIEdGUF9LRVJORUwpOworCQlpZiAoaHctPnNlaV9pdHVfZGF0YV9idWYgPT0gTlVMTCkgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFsbG9jIHNlaSBpdHUgZGF0YSBidWZmZXJcbiIsCisJCQkJX19mdW5jX18pOworCQkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCWh3LT5wcmVmaXhfYXV4X3NpemUgKyBody0+c3VmZml4X2F1eF9zaXplLCBody0+YXV4X2FkZHIsCisJCQkJaHctPmF1eF9waHlfYWRkcik7CisJCQlody0+YXV4X2FkZHIgPSBOVUxMOworCQkJa2ZyZWUoaHctPnNlaV9kYXRhX2J1Zik7CisJCQlody0+c2VpX2RhdGFfYnVmID0gTlVMTDsKKworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaWYgKE5VTEwgPT0gaHctPnNlaV91c2VyX2RhdGFfYnVmZmVyKSB7CisJCQlody0+c2VpX3VzZXJfZGF0YV9idWZmZXIgPSBrbWFsbG9jKFVTRVJfREFUQV9TSVpFLAorCQkJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCWlmICghaHctPnNlaV91c2VyX2RhdGFfYnVmZmVyKSB7CisJCQkJcHJfaW5mbygiJXM6IENhbiBub3QgYWxsb2NhdGUgc2VpX2RhdGFfYnVmZmVyXG4iLAorCQkJCQkgICBfX2Z1bmNfXyk7CisJCQkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCQlody0+cHJlZml4X2F1eF9zaXplICsgaHctPnN1ZmZpeF9hdXhfc2l6ZSwgaHctPmF1eF9hZGRyLAorCQkJCQlody0+YXV4X3BoeV9hZGRyKTsKKwkJCQlody0+YXV4X2FkZHIgPSBOVUxMOworCQkJCWtmcmVlKGh3LT5zZWlfZGF0YV9idWYpOworCQkJCWh3LT5zZWlfZGF0YV9idWYgPSBOVUxMOworCQkJCWtmcmVlKGh3LT5zZWlfaXR1X2RhdGFfYnVmKTsKKwkJCQlody0+c2VpX2l0dV9kYXRhX2J1ZiA9IE5VTEw7CisKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlody0+c2VpX3VzZXJfZGF0YV93cCA9IDA7CisJCX0KKwl9CisvKiBCVUZGRVJfTUdSX0lOX0MgKi8KKyNlbmRpZgorCWh3LT5zdGF0IHw9IFNUQVRfTUNfTE9BRDsKKworCS8qIGFkZCBtZW1vcnkgYmFycmllciAqLworCXdtYigpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmgyNjRfc3RvcChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3KQoreworCWlmIChody0+c3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJYW12ZGVjX3N0b3AoKTsKKwkJaHctPnN0YXQgJj0gflNUQVRfVkRFQ19SVU47CisJfQorI2lmZGVmIFZERUNfRFcKKwlXUklURV9WUkVHKE1ERUNfRE9VQkxFV19DRkcwLCAwKTsKKwlXUklURV9WUkVHKE1ERUNfRE9VQkxFV19DRkcxLCAwKTsKKyNlbmRpZgorI2lmZGVmIE1IMjY0X1VTRVJEQVRBX0VOQUJMRQorCWNhbmNlbF93b3JrX3N5bmMoJmh3LT51c2VyX2RhdGFfcmVhZHlfd29yayk7CisjZW5kaWYKKwljYW5jZWxfd29ya19zeW5jKCZody0+bm90aWZ5X3dvcmspOworCWNhbmNlbF93b3JrX3N5bmMoJmh3LT50aW1lb3V0X3dvcmspOworCWNhbmNlbF93b3JrX3N5bmMoJmh3LT53b3JrKTsKKworCWlmIChody0+c3RhdCAmIFNUQVRfTUNfTE9BRCkgeworCQlpZiAoaHctPm1jX2NwdV9hZGRyICE9IE5VTEwpIHsKKwkJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQkJTUNfVE9UQUxfU0laRSwgaHctPm1jX2NwdV9hZGRyLAorCQkJCQlody0+bWNfZG1hX2hhbmRsZSk7CisJCQlody0+bWNfY3B1X2FkZHIgPSBOVUxMOworCQl9CisJCWlmIChody0+ZnJhbWVfbW11X21hcF9hZGRyICE9IE5VTEwpIHsKKwkJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlGUkFNRV9NTVVfTUFQX1NJWkUsIGh3LT5mcmFtZV9tbXVfbWFwX2FkZHIsCisJCQkJCWh3LT5mcmFtZV9tbXVfbWFwX3BoeV9hZGRyKTsKKwkJCWh3LT5mcmFtZV9tbXVfbWFwX2FkZHIgPSBOVUxMOworCQl9CisKKwl9CisJaWYgKGh3LT5zdGF0ICYgU1RBVF9JU1JfUkVHKSB7CisJCXZkZWNfZnJlZV9pcnEoVkRFQ19JUlFfMSwgKHZvaWQgKilodyk7CisJCWh3LT5zdGF0ICY9IH5TVEFUX0lTUl9SRUc7CisJfQorCWlmIChody0+bG1lbV9hZGRyKSB7CisJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCVBBR0VfU0laRSwgKHZvaWQgKilody0+bG1lbV9hZGRyLAorCQkJaHctPmxtZW1fcGh5X2FkZHIpOworCQlody0+bG1lbV9hZGRyID0gMDsKKwl9CisKKwlpZiAoaHctPmF1eF9hZGRyKSB7CisJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCWh3LT5wcmVmaXhfYXV4X3NpemUgKyBody0+c3VmZml4X2F1eF9zaXplLCBody0+YXV4X2FkZHIsCisJCQlody0+YXV4X3BoeV9hZGRyKTsKKwkJaHctPmF1eF9hZGRyID0gTlVMTDsKKwl9CisJaWYgKGh3LT5zZWlfZGF0YV9idWYgIT0gTlVMTCkgeworCQlrZnJlZShody0+c2VpX2RhdGFfYnVmKTsKKwkJaHctPnNlaV9kYXRhX2J1ZiA9IE5VTEw7CisJfQorCWlmIChody0+c2VpX2l0dV9kYXRhX2J1ZiAhPSBOVUxMKSB7CisJCWtmcmVlKGh3LT5zZWlfaXR1X2RhdGFfYnVmKTsKKwkJaHctPnNlaV9pdHVfZGF0YV9idWYgPSBOVUxMOworCX0KKwlpZiAoaHctPnNlaV91c2VyX2RhdGFfYnVmZmVyICE9IE5VTEwpIHsKKwkJa2ZyZWUoaHctPnNlaV91c2VyX2RhdGFfYnVmZmVyKTsKKwkJaHctPnNlaV91c2VyX2RhdGFfYnVmZmVyID0gTlVMTDsKKwl9CisJLyogYW12ZGVjX2Rpc2FibGUoKTsgKi8KKworCXZmcmVlKGh3LT5mdyk7CisJaHctPmZ3ID0gTlVMTDsKKworCWlmIChody0+bW11X2VuYWJsZSkgeworCQl2ZnJlZShody0+ZndfbW11KTsKKwkJaHctPmZ3X21tdSA9IE5VTEw7CisJfQorCisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSIlc1xuIiwKKwkJX19mdW5jX18pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3YWl0X3ZtaDI2NF9zZWFyY2hfZG9uZShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3KQoreworCXUzMiB2bGRfcnAgPSBSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApOworCWludCBjb3VudCA9IDA7CisJZG8geworCQl1c2xlZXBfcmFuZ2UoMTAwLCA1MDApOworCQlpZiAodmxkX3JwID09IFJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCkpCisJCQlicmVhazsKKwkJaWYgKGNvdW50ID4gMjAwMCkgeworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQlQUklOVF9GTEFHX0VSUk9SLCAiJXMgdGltZW91dCBjb3VudCAlZCB2bGRfcnAgMHgleCBWTERfTUVNX1ZJRklGT19SUCAweCV4XG4iLAorCQkJIF9fZnVuY19fLCBjb3VudCwgdmxkX3JwLCBSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApKTsKKwkJCWJyZWFrOworCQl9IGVsc2UKKwkJCXZsZF9ycCA9IFJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCk7CisJCWNvdW50Kys7CisJfSB3aGlsZSAoMSk7Cit9CisKK3N0YXRpYyB2b2lkIHZoMjY0X25vdGlmeV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0gY29udGFpbmVyX29mKHdvcmssCisJCQkJCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcywgbm90aWZ5X3dvcmspOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGh3KTsKKworCWlmIChody0+aXNfdXNlZF92NGwpCisJCXJldHVybjsKKworCWlmICh2ZGVjLT5mcl9oaW50X3N0YXRlID09IFZERUNfTkVFRF9ISU5UKSB7CisJCXZmX25vdGlmeV9yZWNlaXZlcih2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9GUl9ISU5ULAorCQkJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKWh3LT5mcmFtZV9kdXIpKTsKKwkJdmRlYy0+ZnJfaGludF9zdGF0ZSA9IFZERUNfSElOVEVEOworCX0KKworCXJldHVybjsKK30KKworI2lmZGVmIE1IMjY0X1VTRVJEQVRBX0VOQUJMRQorc3RhdGljIHZvaWQgdm1oMjY0X3Jlc2V0X3Vkcl9tZ3Ioc3RydWN0IHZkZWNfaDI2NF9od19zICpodykKK3sKKwlody0+d2FpdF9mb3JfdWRyX3NlbmQgPSAwOworCWh3LT5zZWlfaXR1X2RhdGFfbGVuID0gMDsKKwltZW1zZXQoJmh3LT51ZF9yZWNvcmQsIDAsIHNpemVvZihody0+dWRfcmVjb3JkKSk7Cit9CisKK3N0YXRpYyB2b2lkIHZtaDI2NF9jcmF0ZV91c2VyZGF0YV9tYW5hZ2VyKAorCQkJCQkJc3RydWN0IHZkZWNfaDI2NF9od19zICpodywKKwkJCQkJCXU4ICp1c2VyZGF0YV9idWYsCisJCQkJCQlpbnQgYnVmX2xlbikKK3sKKwlpZiAoaHcpIHsKKworCisJCW11dGV4X2luaXQoJmh3LT51c2VyZGF0YV9tdXRleCk7CisKKwkJbWVtc2V0KCZody0+dXNlcmRhdGFfaW5mbywgMCwKKwkJCXNpemVvZihzdHJ1Y3QgbWgyNjRfdXNlcmRhdGFfaW5mb190KSk7CisJCWh3LT51c2VyZGF0YV9pbmZvLmRhdGFfYnVmID0gdXNlcmRhdGFfYnVmOworCQlody0+dXNlcmRhdGFfaW5mby5idWZfbGVuID0gYnVmX2xlbjsKKwkJaHctPnVzZXJkYXRhX2luZm8uZGF0YV9idWZfZW5kID0gdXNlcmRhdGFfYnVmICsgYnVmX2xlbjsKKworCQl2bWgyNjRfcmVzZXRfdWRyX21ncihodyk7CisKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHZtaDI2NF9kZXN0cm95X3VzZXJkYXRhX21hbmFnZXIoc3RydWN0IHZkZWNfaDI2NF9od19zICpodykKK3sKKwlpZiAoaHcpCisJCW1lbXNldCgmaHctPnVzZXJkYXRhX2luZm8sCisJCQkJMCwKKwkJCQlzaXplb2Yoc3RydWN0IG1oMjY0X3VzZXJkYXRhX2luZm9fdCkpOworfQorCisvKgorI2RlZmluZSBEVU1QX1VTRVJEQVRBX1JFQ09SRAorKi8KKyNpZmRlZiBEVU1QX1VTRVJEQVRBX1JFQ09SRAorCisjZGVmaW5lIE1BWF9VU0VSX0RBVEFfU0laRQkJMzE0NTcyOAorc3RhdGljIHZvaWQgKnVzZXJfZGF0YV9idWY7CitzdGF0aWMgdW5zaWduZWQgY2hhciAqcGJ1Zl9zdGFydDsKK3N0YXRpYyBpbnQgdG90YWxfbGVuOworc3RhdGljIGludCBic2tpcDsKK3N0YXRpYyBpbnQgbl91c2VyZGF0YV9pZDsKKworc3RhdGljIHZvaWQgcHJpbnRfZGF0YSh1bnNpZ25lZCBjaGFyICpwZGF0YSwKKwkJCQkJCWludCBsZW4sCisJCQkJCQl1bnNpZ25lZCBpbnQgcG9jX251bWJlciwKKwkJCQkJCXVuc2lnbmVkIGludCBmbGFnLAorCQkJCQkJdW5zaWduZWQgaW50IGR1cmF0aW9uLAorCQkJCQkJdW5zaWduZWQgaW50IHZwdHMsCisJCQkJCQl1bnNpZ25lZCBpbnQgdnB0c192YWxpZCwKKwkJCQkJCWludCByZWNfaWQpCit7CisJaW50IG5MZWZ0OworCisJbkxlZnQgPSBsZW47CisjaWYgMAorCXByX2luZm8oIiVkIGxlbjolZCwgZmxhZzolZCwgZHVyOiVkLCB2cHRzOjB4JXgsIHZhbGlkOiVkLCBwb2M6JWRcbiIsCisJCQkJcmVjX2lkLAlsZW4sIGZsYWcsCisJCQkJZHVyYXRpb24sIHZwdHMsIHZwdHNfdmFsaWQsIHBvY19udW1iZXIpOworI2VuZGlmCisJcHJfaW5mbygiJWQgbGVuID0gJWQsIGZsYWcgPSAlZCwgdnB0cyA9IDB4JXhcbiIsCisJCQkJcmVjX2lkLAlsZW4sIGZsYWcsIHZwdHMpOworCisJaWYgKGxlbiA9PSA5NikgeworCQlpbnQgaTsKKwkJbkxlZnQgPSA3MjsKKwkJd2hpbGUgKG5MZWZ0ID49IDE2KSB7CisJCQlwcl9pbmZvKCIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJCXBkYXRhWzBdLCBwZGF0YVsxXSwgcGRhdGFbMl0sIHBkYXRhWzNdLAorCQkJCXBkYXRhWzRdLCBwZGF0YVs1XSwgcGRhdGFbNl0sIHBkYXRhWzddLAorCQkJCXBkYXRhWzhdLCBwZGF0YVs5XSwgcGRhdGFbMTBdLCBwZGF0YVsxMV0sCisJCQkJcGRhdGFbMTJdLCBwZGF0YVsxM10sIHBkYXRhWzE0XSwgcGRhdGFbMTVdKTsKKwkJCW5MZWZ0IC09IDE2OworCQkJcGRhdGEgKz0gMTY7CisJCX0KKworCisJCXdoaWxlIChuTGVmdCA+IDApIHsKKwkJCXByX2luZm8oIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCQlwZGF0YVswXSwgcGRhdGFbMV0sIHBkYXRhWzJdLCBwZGF0YVszXSwKKwkJCQlwZGF0YVs0XSwgcGRhdGFbNV0sIHBkYXRhWzZdLCBwZGF0YVs3XSk7CisJCQluTGVmdCAtPSA4OworCQkJcGRhdGEgKz0gODsKKwkJfQorCisJCWkgPSAwOworCQluTGVmdCA9IDk2LTcyOworCQl3aGlsZSAoaSA8IG5MZWZ0KSB7CisJCQlpZiAocGRhdGFbMF0gIT0gMCkgeworCQkJCXByX2luZm8oInNvbWUgZGF0YSBlcnJvclxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwZGF0YSsrOworCQkJaSsrOworCQl9CisJfSBlbHNlIHsKKwkJd2hpbGUgKG5MZWZ0ID49IDE2KSB7CisJCQlwcl9pbmZvKCIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJCXBkYXRhWzBdLCBwZGF0YVsxXSwgcGRhdGFbMl0sIHBkYXRhWzNdLAorCQkJCXBkYXRhWzRdLCBwZGF0YVs1XSwgcGRhdGFbNl0sIHBkYXRhWzddLAorCQkJCXBkYXRhWzhdLCBwZGF0YVs5XSwgcGRhdGFbMTBdLCBwZGF0YVsxMV0sCisJCQkJcGRhdGFbMTJdLCBwZGF0YVsxM10sIHBkYXRhWzE0XSwgcGRhdGFbMTVdKTsKKwkJCW5MZWZ0IC09IDE2OworCQkJcGRhdGEgKz0gMTY7CisJCX0KKworCisJCXdoaWxlIChuTGVmdCA+IDApIHsKKwkJCXByX2luZm8oIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCQlwZGF0YVswXSwgcGRhdGFbMV0sIHBkYXRhWzJdLCBwZGF0YVszXSwKKwkJCQlwZGF0YVs0XSwgcGRhdGFbNV0sIHBkYXRhWzZdLCBwZGF0YVs3XSk7CisJCQluTGVmdCAtPSA4OworCQkJcGRhdGEgKz0gODsKKwkJfQorCisJfQorfQorCitzdGF0aWMgdm9pZCBwdXNoX3RvX2J1ZihzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LAorCQkJCQl1OCAqcGRhdGEsCisJCQkJCWludCBsZW4sCisJCQkJCXN0cnVjdCB1c2VyZGF0YV9tZXRhX2luZm9fdCAqcG1ldGEpOworCitzdGF0aWMgdm9pZCBkdW1wX3VzZXJkYXRhX3JlY29yZChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LAorCQkJCQlzdHJ1Y3QgbWgyNjRfdXNlcmRhdGFfcmVjb3JkX3QgKnJlY29yZCkKK3sKKwlpZiAocmVjb3JkICYmIGh3KSB7CisJCXU4ICpwZGF0YTsKKworCQlwZGF0YSA9IGh3LT51c2VyZGF0YV9pbmZvLmRhdGFfYnVmICsgcmVjb3JkLT5yZWNfc3RhcnQ7CisvKgorCQlwcmludF9kYXRhKHBkYXRhLAorCQkJcmVjb3JkLT5yZWNfbGVuLAorCQkJcmVjb3JkLT5tZXRhX2luZm8uZmxhZ3MsCisJCQlyZWNvcmQtPm1ldGFfaW5mby5kdXJhdGlvbiwKKwkJCXJlY29yZC0+bWV0YV9pbmZvLnZwdHMsCisJCQlyZWNvcmQtPm1ldGFfaW5mby52cHRzX3ZhbGlkLAorCQkJbl9yZWNvcmRfaWQpOworKi8KKwkJcHVzaF90b19idWYoaHcsIHBkYXRhLCByZWNvcmQtPnJlY19sZW4sICAmcmVjb3JkLT5tZXRhX2luZm8pOworCQluX3VzZXJkYXRhX2lkKys7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHB1c2hfdG9fYnVmKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcsCisJCQkJCXU4ICpwZGF0YSwgaW50IGxlbiwKKwkJCQkJc3RydWN0IHVzZXJkYXRhX21ldGFfaW5mb190ICpwbWV0YSkKK3sKKwl1MzIgKnBMZW47CisJaW50IGluZm9fY250OworCXU4ICpwYnVmX2VuZDsKKworCWlmICghdXNlcl9kYXRhX2J1ZikKKwkJcmV0dXJuOworCisJaWYgKGJza2lwKSB7CisJCXByX2luZm8oIm92ZXIgc2l6ZSwgc2tpcFxuIik7CisJCXJldHVybjsKKwl9CisJaW5mb19jbnQgPSAwOworCXBMZW4gPSAodTMyICopcGJ1Zl9zdGFydDsKKworCSpwTGVuID0gbGVuOworCXBidWZfc3RhcnQgKz0gc2l6ZW9mKHUzMik7CisJaW5mb19jbnQrKzsKKwlwTGVuKys7CisKKwkqcExlbiA9IHBtZXRhLT5wb2NfbnVtYmVyOworCXBidWZfc3RhcnQgKz0gc2l6ZW9mKHUzMik7CisJaW5mb19jbnQrKzsKKwlwTGVuKys7CisKKwkqcExlbiA9IHBtZXRhLT5kdXJhdGlvbjsKKwlwYnVmX3N0YXJ0ICs9IHNpemVvZih1MzIpOworCWluZm9fY250Kys7CisJcExlbisrOworCisJKnBMZW4gPSBwbWV0YS0+ZmxhZ3M7CisJcGJ1Zl9zdGFydCArPSBzaXplb2YodTMyKTsKKwlpbmZvX2NudCsrOworCXBMZW4rKzsKKworCSpwTGVuID0gcG1ldGEtPnZwdHM7CisJcGJ1Zl9zdGFydCArPSBzaXplb2YodTMyKTsKKwlpbmZvX2NudCsrOworCXBMZW4rKzsKKworCSpwTGVuID0gcG1ldGEtPnZwdHNfdmFsaWQ7CisJcGJ1Zl9zdGFydCArPSBzaXplb2YodTMyKTsKKwlpbmZvX2NudCsrOworCXBMZW4rKzsKKworCisJKnBMZW4gPSBuX3VzZXJkYXRhX2lkOworCXBidWZfc3RhcnQgKz0gc2l6ZW9mKHUzMik7CisJaW5mb19jbnQrKzsKKwlwTGVuKys7CisKKworCisJcGJ1Zl9lbmQgPSAodTggKilody0+c2VpX3VzZXJfZGF0YV9idWZmZXIgKyBVU0VSX0RBVEFfU0laRTsKKwlpZiAocGRhdGEgKyBsZW4gPiBwYnVmX2VuZCkgeworCQlpbnQgZmlyc3Rfc2VjdGlvbl9sZW47CisKKwkJZmlyc3Rfc2VjdGlvbl9sZW4gPSBwYnVmX2VuZCAtIHBkYXRhOworCQltZW1jcHkocGJ1Zl9zdGFydCwgcGRhdGEsIGZpcnN0X3NlY3Rpb25fbGVuKTsKKwkJcGRhdGEgPSAodTggKilody0+c2VpX3VzZXJfZGF0YV9idWZmZXI7CisJCXBidWZfc3RhcnQgKz0gZmlyc3Rfc2VjdGlvbl9sZW47CisJCW1lbWNweShwYnVmX3N0YXJ0LCBwZGF0YSwgbGVuIC0gZmlyc3Rfc2VjdGlvbl9sZW4pOworCQlwYnVmX3N0YXJ0ICs9IGxlbiAtIGZpcnN0X3NlY3Rpb25fbGVuOworCX0gZWxzZSB7CisJCW1lbWNweShwYnVmX3N0YXJ0LCBwZGF0YSwgbGVuKTsKKwkJcGJ1Zl9zdGFydCArPSBsZW47CisJfQorCisJdG90YWxfbGVuICs9IGxlbiArIGluZm9fY250ICogc2l6ZW9mKHUzMik7CisJaWYgKHRvdGFsX2xlbiA+PSBNQVhfVVNFUl9EQVRBX1NJWkUtNDA5NikKKwkJYnNraXAgPSAxOworfQorCitzdGF0aWMgdm9pZCBzaG93X3VzZXJfZGF0YV9idWYodm9pZCkKK3sKKwl1OCAqcGJ1ZjsKKwlpbnQgbGVuOworCXVuc2lnbmVkIGludCBmbGFnOworCXVuc2lnbmVkIGludCBkdXJhdGlvbjsKKwl1bnNpZ25lZCBpbnQgdnB0czsKKwl1bnNpZ25lZCBpbnQgdnB0c192YWxpZDsKKwl1bnNpZ25lZCBpbnQgcG9jX251bWJlcjsKKwlpbnQgcmVjX2lkOworCisJcHJfaW5mbygic2hvdyB1c2VyIGRhdGEgYnVmXG4iKTsKKwlwYnVmID0gdXNlcl9kYXRhX2J1ZjsKKworCXdoaWxlIChwYnVmIDwgcGJ1Zl9zdGFydCkgeworCQl1MzIgKnBMZW47CisKKwkJcExlbiA9ICh1MzIgKilwYnVmOworCisJCWxlbiA9ICpwTGVuOworCQlwTGVuKys7CisJCXBidWYgKz0gc2l6ZW9mKHUzMik7CisKKwkJcG9jX251bWJlciA9ICpwTGVuOworCQlwTGVuKys7CisJCXBidWYgKz0gc2l6ZW9mKHUzMik7CisKKwkJZHVyYXRpb24gPSAqcExlbjsKKwkJcExlbisrOworCQlwYnVmICs9IHNpemVvZih1MzIpOworCisJCWZsYWcgPSAqcExlbjsKKwkJcExlbisrOworCQlwYnVmICs9IHNpemVvZih1MzIpOworCisJCXZwdHMgPSAqcExlbjsKKwkJcExlbisrOworCQlwYnVmICs9IHNpemVvZih1MzIpOworCisJCXZwdHNfdmFsaWQgPSAqcExlbjsKKwkJcExlbisrOworCQlwYnVmICs9IHNpemVvZih1MzIpOworCisJCXJlY19pZCA9ICpwTGVuOworCQlwTGVuKys7CisJCXBidWYgKz0gc2l6ZW9mKHUzMik7CisKKwkJcHJpbnRfZGF0YShwYnVmLCBsZW4sIHBvY19udW1iZXIsIGZsYWcsCisJCQlkdXJhdGlvbiwgdnB0cywKKwkJCXZwdHNfdmFsaWQsIHJlY19pZCk7CisJCXBidWYgKz0gbGVuOworCQltc2xlZXAoMzApOworCX0KK30KKworc3RhdGljIGludCB2bWgyNjRfaW5pdF91c2VyZGF0YV9kdW1wKHZvaWQpCit7CisJdXNlcl9kYXRhX2J1ZiA9IGttYWxsb2MoTUFYX1VTRVJfREFUQV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAodXNlcl9kYXRhX2J1ZikKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdm1oMjY0X2R1bXBfdXNlcmRhdGEodm9pZCkKK3sKKwlpZiAodXNlcl9kYXRhX2J1ZikgeworCQlzaG93X3VzZXJfZGF0YV9idWYoKTsKKwkJa2ZyZWUodXNlcl9kYXRhX2J1Zik7CisJCXVzZXJfZGF0YV9idWYgPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgdm1oMjY0X3Jlc2V0X3VzZXJfZGF0YV9idWYodm9pZCkKK3sKKwl0b3RhbF9sZW4gPSAwOworCXBidWZfc3RhcnQgPSB1c2VyX2RhdGFfYnVmOworCWJza2lwID0gMDsKKwluX3VzZXJkYXRhX2lkID0gMDsKK30KKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkIHZtaDI2NF91ZGNfZmlsbF92cHRzKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcsCisJCQkJCQlpbnQgZnJhbWVfdHlwZSwKKwkJCQkJCXUzMiB2cHRzLAorCQkJCQkJdTMyIHZwdHNfdmFsaWQpCit7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSAmaHctPmRwYjsKKworCXVuc2lnbmVkIGNoYXIgKnBkYXRhOworCXU4ICpwbWF4X3NlaV9kYXRhX2J1ZmZlcjsKKwl1OCAqc2VpX2RhdGFfYnVmOworCWludCBpOworCWludCB3cDsKKwlpbnQgZGF0YV9sZW5ndGg7CisJc3RydWN0IG1oMjY0X3VzZXJkYXRhX3JlY29yZF90ICpwX3VzZXJkYXRhX3JlYzsKKworCisjaWZkZWYgTUgyNjRfVVNFUkRBVEFfRU5BQkxFCisJc3RydWN0IHVzZXJkYXRhX21ldGFfaW5mb190IG1ldGFfaW5mbzsKKwltZW1zZXQoJm1ldGFfaW5mbywgMCwgc2l6ZW9mKG1ldGFfaW5mbykpOworI2VuZGlmCisKKwlpZiAoaHctPnNlaV9pdHVfZGF0YV9sZW4gPD0gMCkKKwkJcmV0dXJuOworCisJcGRhdGEgPSAodTggKilody0+c2VpX3VzZXJfZGF0YV9idWZmZXIgKyBody0+c2VpX3VzZXJfZGF0YV93cDsKKwlwbWF4X3NlaV9kYXRhX2J1ZmZlciA9ICh1OCAqKWh3LT5zZWlfdXNlcl9kYXRhX2J1ZmZlciArIFVTRVJfREFUQV9TSVpFOworCXNlaV9kYXRhX2J1ZiA9ICh1OCAqKWh3LT5zZWlfaXR1X2RhdGFfYnVmOworCWZvciAoaSA9IDA7IGkgPCBody0+c2VpX2l0dV9kYXRhX2xlbjsgaSsrKSB7CisJCSpwZGF0YSsrID0gc2VpX2RhdGFfYnVmW2ldOworCQlpZiAocGRhdGEgPj0gcG1heF9zZWlfZGF0YV9idWZmZXIpCisJCQlwZGF0YSA9ICh1OCAqKWh3LT5zZWlfdXNlcl9kYXRhX2J1ZmZlcjsKKwl9CisKKwlody0+c2VpX3VzZXJfZGF0YV93cCA9IChody0+c2VpX3VzZXJfZGF0YV93cAorCQkrIGh3LT5zZWlfaXR1X2RhdGFfbGVuKSAlIFVTRVJfREFUQV9TSVpFOworCWh3LT5zZWlfaXR1X2RhdGFfbGVuID0gMDsKKworI2lmZGVmIE1IMjY0X1VTRVJEQVRBX0VOQUJMRQorCW1ldGFfaW5mby5kdXJhdGlvbiA9IGh3LT5mcmFtZV9kdXI7CisJbWV0YV9pbmZvLmZsYWdzIHw9IChWRk9STUFUX0gyNjQgPDwgMyk7CisKKwltZXRhX2luZm8udnB0cyA9IHZwdHM7CisJbWV0YV9pbmZvLnZwdHNfdmFsaWQgPSB2cHRzX3ZhbGlkOworCW1ldGFfaW5mby5wb2NfbnVtYmVyID0KKwkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlLT5wb2M7CisKKworCXdwID0gaHctPnNlaV91c2VyX2RhdGFfd3A7CisKKwlpZiAoaHctPnNlaV91c2VyX2RhdGFfd3AgPiBody0+dXNlcmRhdGFfaW5mby5sYXN0X3dwKQorCQlkYXRhX2xlbmd0aCA9IHdwIC0gaHctPnVzZXJkYXRhX2luZm8ubGFzdF93cDsKKwllbHNlCisJCWRhdGFfbGVuZ3RoID0gd3AgKyBody0+dXNlcmRhdGFfaW5mby5idWZfbGVuCisJCQktIGh3LT51c2VyZGF0YV9pbmZvLmxhc3Rfd3A7CisKKwlpZiAoZGF0YV9sZW5ndGggJiAweDcpCisJCWRhdGFfbGVuZ3RoID0gKCgoZGF0YV9sZW5ndGggKyA4KSA+PiAzKSA8PCAzKTsKKworCXBfdXNlcmRhdGFfcmVjID0gJmh3LT51ZF9yZWNvcmQ7CisJcF91c2VyZGF0YV9yZWMtPm1ldGFfaW5mbyA9IG1ldGFfaW5mbzsKKwlwX3VzZXJkYXRhX3JlYy0+cmVjX3N0YXJ0ID0gaHctPnVzZXJkYXRhX2luZm8ubGFzdF93cDsKKwlwX3VzZXJkYXRhX3JlYy0+cmVjX2xlbiA9IGRhdGFfbGVuZ3RoOworCWh3LT51c2VyZGF0YV9pbmZvLmxhc3Rfd3AgPSB3cDsKKworCXBfdXNlcmRhdGFfcmVjLT5tZXRhX2luZm8uZmxhZ3MgfD0KKwkJcF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlLT5waWNfc3RydWN0IDw8IDEyOworCisJaHctPndhaXRfZm9yX3Vkcl9zZW5kID0gMTsKKwl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT51c2VyX2RhdGFfcmVhZHlfd29yayk7CisjZW5kaWYKK30KKworCitzdGF0aWMgdm9pZCB1c2VyX2RhdGFfcmVhZHlfbm90aWZ5X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcgPSBjb250YWluZXJfb2Yod29yaywKKwkJc3RydWN0IHZkZWNfaDI2NF9od19zLCB1c2VyX2RhdGFfcmVhZHlfd29yayk7CisKKworCW11dGV4X2xvY2soJmh3LT51c2VyZGF0YV9tdXRleCk7CisKKwlody0+dXNlcmRhdGFfaW5mby5yZWNvcmRzW2h3LT51c2VyZGF0YV9pbmZvLndyaXRlX2luZGV4XQorCQk9IGh3LT51ZF9yZWNvcmQ7CisJaHctPnVzZXJkYXRhX2luZm8ud3JpdGVfaW5kZXgrKzsKKwlpZiAoaHctPnVzZXJkYXRhX2luZm8ud3JpdGVfaW5kZXggPj0gVVNFUkRBVEFfRklGT19OVU0pCisJCWh3LT51c2VyZGF0YV9pbmZvLndyaXRlX2luZGV4ID0gMDsKKworCW11dGV4X3VubG9jaygmaHctPnVzZXJkYXRhX211dGV4KTsKKworI2lmZGVmIERVTVBfVVNFUkRBVEFfUkVDT1JECisJZHVtcF91c2VyZGF0YV9yZWNvcmQoaHcsICZody0+dWRfcmVjb3JkKTsKKyNlbmRpZgorCXZkZWNfd2FrZXVwX3VzZXJkYXRhX3BvbGwoaHdfdG9fdmRlYyhodykpOworCisJaHctPndhaXRfZm9yX3Vkcl9zZW5kID0gMDsKK30KKworc3RhdGljIGludCB2bWgyNjRfdXNlcl9kYXRhX3JlYWQoc3RydWN0IHZkZWNfcyAqdmRlYywKKwlzdHJ1Y3QgdXNlcmRhdGFfcGFyYW1fdCAqcHVzZXJkYXRhX3BhcmEpCit7CisJc3RydWN0IHZkZWNfaDI2NF9od19zICpodyA9IE5VTEw7CisJaW50IHJlY19yaSwgcmVjX3dpOworCWludCByZWNfbGVuOworCXU4ICpyZWNfZGF0YV9zdGFydDsKKwl1OCAqcGRlc3RfYnVmOworCXN0cnVjdCBtaDI2NF91c2VyZGF0YV9yZWNvcmRfdCAqcF91c2VyZGF0YV9yZWM7CisJdTMyIGRhdGFfc2l6ZTsKKwl1MzIgcmVzOworCWludCBjb3B5X29rID0gMTsKKworCWh3ID0gKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisKKwlwZGVzdF9idWYgPSBwdXNlcmRhdGFfcGFyYS0+cGJ1Zl9hZGRyOworCisJbXV0ZXhfbG9jaygmaHctPnVzZXJkYXRhX211dGV4KTsKKworLyoKKwlwcl9pbmZvKCJyaSA9ICVkLCB3aSA9ICVkXG4iLAorCQlsZ19wX21wZWcxMl91c2VyZGF0YV9pbmZvLT5yZWFkX2luZGV4LAorCQlsZ19wX21wZWcxMl91c2VyZGF0YV9pbmZvLT53cml0ZV9pbmRleCk7CisqLworCXJlY19yaSA9IGh3LT51c2VyZGF0YV9pbmZvLnJlYWRfaW5kZXg7CisJcmVjX3dpID0gaHctPnVzZXJkYXRhX2luZm8ud3JpdGVfaW5kZXg7CisKKwlpZiAocmVjX3JpID09IHJlY193aSkgeworCQltdXRleF91bmxvY2soJmh3LT51c2VyZGF0YV9tdXRleCk7CisJCXJldHVybiAwOworCX0KKworCXBfdXNlcmRhdGFfcmVjID0gaHctPnVzZXJkYXRhX2luZm8ucmVjb3JkcyArIHJlY19yaTsKKworCXJlY19sZW4gPSBwX3VzZXJkYXRhX3JlYy0+cmVjX2xlbjsKKwlyZWNfZGF0YV9zdGFydCA9IHBfdXNlcmRhdGFfcmVjLT5yZWNfc3RhcnQgKyBody0+dXNlcmRhdGFfaW5mby5kYXRhX2J1ZjsKKy8qCisJcHJfaW5mbygicmVjX2xlbjolZCwgcmVjX3N0YXJ0OiVkLCBidWZfbGVuOiVkXG4iLAorCQlwX3VzZXJkYXRhX3JlYy0+cmVjX2xlbiwKKwkJcF91c2VyZGF0YV9yZWMtPnJlY19zdGFydCwKKwkJcHVzZXJkYXRhX3BhcmEtPmJ1Zl9sZW4pOworKi8KKwlpZiAocmVjX2xlbiA8PSBwdXNlcmRhdGFfcGFyYS0+YnVmX2xlbikgeworCQkvKiBkdmIgdXNlciBkYXRhIGJ1ZmZlciBpcyBlbm91Z2h0IHRvCisJCWNvcHkgdGhlIHdob2xlIHJlY29yZWQuICovCisJCWRhdGFfc2l6ZSA9IHJlY19sZW47CisJCWlmIChyZWNfZGF0YV9zdGFydCArIGRhdGFfc2l6ZQorCQkJPiBody0+dXNlcmRhdGFfaW5mby5kYXRhX2J1Zl9lbmQpIHsKKwkJCWludCBmaXJzdF9zZWN0aW9uX2xlbjsKKworCQkJZmlyc3Rfc2VjdGlvbl9sZW4gPSBody0+dXNlcmRhdGFfaW5mby5idWZfbGVuIC0KKwkJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX3N0YXJ0OworCQkJcmVzID0gKHUzMiljb3B5X3RvX3VzZXIoKHZvaWQgKilwZGVzdF9idWYsCisJCQkJCQkJKHZvaWQgKilyZWNfZGF0YV9zdGFydCwKKwkJCQkJCQlmaXJzdF9zZWN0aW9uX2xlbik7CisJCQlpZiAocmVzKSB7CisJCQkJcHJfaW5mbygicDEgcmVhZCBub3QgZW5kIHJlcz0lZCwgcmVxdWVzdD0lZFxuIiwKKwkJCQkJcmVzLCBmaXJzdF9zZWN0aW9uX2xlbik7CisJCQkJY29weV9vayA9IDA7CisKKwkJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX2xlbiAtPQorCQkJCQlmaXJzdF9zZWN0aW9uX2xlbiAtIHJlczsKKwkJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX3N0YXJ0ICs9CisJCQkJCWZpcnN0X3NlY3Rpb25fbGVuIC0gcmVzOworCQkJCXB1c2VyZGF0YV9wYXJhLT5kYXRhX3NpemUgPQorCQkJCQlmaXJzdF9zZWN0aW9uX2xlbiAtIHJlczsKKwkJCX0gZWxzZSB7CisJCQkJcmVzID0gKHUzMiljb3B5X3RvX3VzZXIoCisJCQkJCSh2b2lkICopKHBkZXN0X2J1ZitmaXJzdF9zZWN0aW9uX2xlbiksCisJCQkJCSh2b2lkICopaHctPnVzZXJkYXRhX2luZm8uZGF0YV9idWYsCisJCQkJCWRhdGFfc2l6ZSAtIGZpcnN0X3NlY3Rpb25fbGVuKTsKKwkJCQlpZiAocmVzKSB7CisJCQkJCXByX2luZm8oInAyIHJlYWQgbm90IGVuZCByZXM9JWQsIHJlcXVlc3Q9JWRcbiIsCisJCQkJCQlyZXMsIGRhdGFfc2l6ZSk7CisJCQkJCWNvcHlfb2sgPSAwOworCQkJCX0KKwkJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX2xlbiAtPQorCQkJCQlkYXRhX3NpemUgLSByZXM7CisJCQkJcF91c2VyZGF0YV9yZWMtPnJlY19zdGFydCA9CisJCQkJCWRhdGFfc2l6ZSAtIGZpcnN0X3NlY3Rpb25fbGVuIC0gcmVzOworCQkJCXB1c2VyZGF0YV9wYXJhLT5kYXRhX3NpemUgPQorCQkJCQlkYXRhX3NpemUgLSByZXM7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXMgPSAodTMyKWNvcHlfdG9fdXNlcigodm9pZCAqKXBkZXN0X2J1ZiwKKwkJCQkJCQkodm9pZCAqKXJlY19kYXRhX3N0YXJ0LAorCQkJCQkJCWRhdGFfc2l6ZSk7CisJCQlpZiAocmVzKSB7CisJCQkJcHJfaW5mbygicDMgcmVhZCBub3QgZW5kIHJlcz0lZCwgcmVxdWVzdD0lZFxuIiwKKwkJCQkJcmVzLCBkYXRhX3NpemUpOworCQkJCWNvcHlfb2sgPSAwOworCQkJfQorCQkJcF91c2VyZGF0YV9yZWMtPnJlY19sZW4gLT0gZGF0YV9zaXplIC0gcmVzOworCQkJcF91c2VyZGF0YV9yZWMtPnJlY19zdGFydCArPSBkYXRhX3NpemUgLSByZXM7CisJCQlwdXNlcmRhdGFfcGFyYS0+ZGF0YV9zaXplID0gZGF0YV9zaXplIC0gcmVzOworCQl9CisKKwkJaWYgKGNvcHlfb2spIHsKKwkJCWh3LT51c2VyZGF0YV9pbmZvLnJlYWRfaW5kZXgrKzsKKwkJCWlmIChody0+dXNlcmRhdGFfaW5mby5yZWFkX2luZGV4ID49IFVTRVJEQVRBX0ZJRk9fTlVNKQorCQkJCWh3LT51c2VyZGF0YV9pbmZvLnJlYWRfaW5kZXggPSAwOworCQl9CisJfSBlbHNlIHsKKwkJLyogZHZiIHVzZXIgZGF0YSBidWZmZXIgaXMgbm90IGVub3VnaHQKKwkJdG8gY29weSB0aGUgd2hvbGUgcmVjb3JlZC4gKi8KKwkJZGF0YV9zaXplID0gcHVzZXJkYXRhX3BhcmEtPmJ1Zl9sZW47CisJCWlmIChyZWNfZGF0YV9zdGFydCArIGRhdGFfc2l6ZQorCQkJPiBody0+dXNlcmRhdGFfaW5mby5kYXRhX2J1Zl9lbmQpIHsKKwkJCWludCBmaXJzdF9zZWN0aW9uX2xlbjsKKworCQkJZmlyc3Rfc2VjdGlvbl9sZW4gPSBody0+dXNlcmRhdGFfaW5mby5idWZfbGVuIC0KKwkJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX3N0YXJ0OworCQkJcmVzID0gKHUzMiljb3B5X3RvX3VzZXIoKHZvaWQgKilwZGVzdF9idWYsCisJCQkJCQkodm9pZCAqKXJlY19kYXRhX3N0YXJ0LAorCQkJCQkJZmlyc3Rfc2VjdGlvbl9sZW4pOworCQkJaWYgKHJlcykgeworCQkJCXByX2luZm8oInA0IHJlYWQgbm90IGVuZCByZXM9JWQsIHJlcXVlc3Q9JWRcbiIsCisJCQkJCXJlcywgZmlyc3Rfc2VjdGlvbl9sZW4pOworCQkJCWNvcHlfb2sgPSAwOworCQkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfbGVuIC09CisJCQkJCWZpcnN0X3NlY3Rpb25fbGVuIC0gcmVzOworCQkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfc3RhcnQgKz0KKwkJCQkJZmlyc3Rfc2VjdGlvbl9sZW4gLSByZXM7CisJCQkJcHVzZXJkYXRhX3BhcmEtPmRhdGFfc2l6ZSA9CisJCQkJCWZpcnN0X3NlY3Rpb25fbGVuIC0gcmVzOworCQkJfSBlbHNlIHsKKwkJCQkvKiBmaXJzdCBzZWN0b24gY29weSBpcyBvayovCisJCQkJcmVzID0gKHUzMiljb3B5X3RvX3VzZXIoCisJCQkJCSh2b2lkICopKHBkZXN0X2J1ZitmaXJzdF9zZWN0aW9uX2xlbiksCisJCQkJCSh2b2lkICopaHctPnVzZXJkYXRhX2luZm8uZGF0YV9idWYsCisJCQkJCWRhdGFfc2l6ZSAtIGZpcnN0X3NlY3Rpb25fbGVuKTsKKwkJCQlpZiAocmVzKSB7CisJCQkJCXByX2luZm8oInA1IHJlYWQgbm90IGVuZCByZXM9JWQsIHJlcXVlc3Q9JWRcbiIsCisJCQkJCQlyZXMsCisJCQkJCQlkYXRhX3NpemUgLSBmaXJzdF9zZWN0aW9uX2xlbik7CisJCQkJCWNvcHlfb2sgPSAwOworCQkJCX0KKworCQkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfbGVuIC09CisJCQkJCWRhdGFfc2l6ZSAtIHJlczsKKwkJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX3N0YXJ0ID0KKwkJCQkJZGF0YV9zaXplIC0gZmlyc3Rfc2VjdGlvbl9sZW4gLSByZXM7CisJCQkJcHVzZXJkYXRhX3BhcmEtPmRhdGFfc2l6ZSA9CisJCQkJCWRhdGFfc2l6ZSAtIHJlczsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJlcyA9ICh1MzIpY29weV90b191c2VyKCh2b2lkICopcGRlc3RfYnVmLAorCQkJCQkJCSh2b2lkICopcmVjX2RhdGFfc3RhcnQsCisJCQkJCQkJZGF0YV9zaXplKTsKKwkJCWlmIChyZXMpIHsKKwkJCQlwcl9pbmZvKCJwNiByZWFkIG5vdCBlbmQgcmVzPSVkLCByZXF1ZXN0PSVkXG4iLAorCQkJCQlyZXMsIGRhdGFfc2l6ZSk7CisJCQkJY29weV9vayA9IDA7CisJCQl9CisKKwkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfbGVuIC09IGRhdGFfc2l6ZSAtIHJlczsKKwkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfc3RhcnQgKz0gZGF0YV9zaXplIC0gcmVzOworCQkJcHVzZXJkYXRhX3BhcmEtPmRhdGFfc2l6ZSA9IGRhdGFfc2l6ZSAtIHJlczsKKwkJfQorCisJCWlmIChjb3B5X29rKSB7CisJCQlody0+dXNlcmRhdGFfaW5mby5yZWFkX2luZGV4Kys7CisJCQlpZiAoaHctPnVzZXJkYXRhX2luZm8ucmVhZF9pbmRleCA+PSBVU0VSREFUQV9GSUZPX05VTSkKKwkJCQlody0+dXNlcmRhdGFfaW5mby5yZWFkX2luZGV4ID0gMDsKKwkJfQorCisJfQorCXB1c2VyZGF0YV9wYXJhLT5tZXRhX2luZm8gPSBwX3VzZXJkYXRhX3JlYy0+bWV0YV9pbmZvOworCisJaWYgKGh3LT51c2VyZGF0YV9pbmZvLnJlYWRfaW5kZXggPD0gaHctPnVzZXJkYXRhX2luZm8ud3JpdGVfaW5kZXgpCisJCXB1c2VyZGF0YV9wYXJhLT5tZXRhX2luZm8ucmVjb3Jkc19pbl9xdWUgPQorCQkJaHctPnVzZXJkYXRhX2luZm8ud3JpdGVfaW5kZXggLQorCQkJaHctPnVzZXJkYXRhX2luZm8ucmVhZF9pbmRleDsKKwllbHNlCisJCXB1c2VyZGF0YV9wYXJhLT5tZXRhX2luZm8ucmVjb3Jkc19pbl9xdWUgPQorCQkJaHctPnVzZXJkYXRhX2luZm8ud3JpdGVfaW5kZXggKworCQkJVVNFUkRBVEFfRklGT19OVU0gLQorCQkJaHctPnVzZXJkYXRhX2luZm8ucmVhZF9pbmRleDsKKworCXB1c2VyZGF0YV9wYXJhLT52ZXJzaW9uID0gKDA8PDI0fDA8PDE2fDA8PDh8MSk7CisKKwltdXRleF91bmxvY2soJmh3LT51c2VyZGF0YV9tdXRleCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgdm1oMjY0X3Jlc2V0X3VzZXJkYXRhX2ZpZm8oc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGJJbml0KQoreworCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcgPSBOVUxMOworCisJaHcgPSAoc3RydWN0IHZkZWNfaDI2NF9od19zICopdmRlYy0+cHJpdmF0ZTsKKworCWlmIChodykgeworCQltdXRleF9sb2NrKCZody0+dXNlcmRhdGFfbXV0ZXgpOworCQlwcl9pbmZvKCJ2bWgyNjRfcmVzZXRfdXNlcmRhdGFfZmlmbzogYkluaXQ6ICVkLCByaTogJWQsIHdpOiAlZFxuIiwKKwkJCWJJbml0LAorCQkJaHctPnVzZXJkYXRhX2luZm8ucmVhZF9pbmRleCwKKwkJCWh3LT51c2VyZGF0YV9pbmZvLndyaXRlX2luZGV4KTsKKwkJaHctPnVzZXJkYXRhX2luZm8ucmVhZF9pbmRleCA9IDA7CisJCWh3LT51c2VyZGF0YV9pbmZvLndyaXRlX2luZGV4ID0gMDsKKworCQlpZiAoYkluaXQpCisJCQlody0+dXNlcmRhdGFfaW5mby5sYXN0X3dwID0gMDsKKwkJbXV0ZXhfdW5sb2NrKCZody0+dXNlcmRhdGFfbXV0ZXgpOworCX0KK30KKworc3RhdGljIHZvaWQgdm1oMjY0X3dha2V1cF91c2VyZGF0YV9wb2xsKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJYW1zdHJlYW1fd2FrZXVwX3VzZXJkYXRhX3BvbGwodmRlYyk7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgaW50IHZtaDI2NF9nZXRfcHNfaW5mbyhzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LAorCXUzMiBwYXJhbTEsIHUzMiBwYXJhbTIsIHUzMiBwYXJhbTMsIHUzMiBwYXJhbTQsCisJc3RydWN0IGFtbF92ZGVjX3BzX2luZm9zICpwcykKK3sKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGh3KTsKKyNlbmRpZgorCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShody0+djRsMl9jdHgpOworCXN0cnVjdCB2ZGVjX3BpY19pbmZvIHBpYzsKKwlpbnQgbWJfd2lkdGgsIG1iX3RvdGFsOworCWludCBtYl9oZWlnaHQgPSAwOworCWludCBhY3RpdmVfYnVmZmVyX3NwZWNfbnVtLCBkZWNfZHBiX3NpemU7CisJaW50IG1heF9yZWZlcmVuY2Vfc2l6ZSAsbGV2ZWxfaWRjOworCXUzMiBmcmFtZV9tYnNfb25seV9mbGFnOworCXUzMiBjaHJvbWFfZm9ybWF0X2lkYzsKKwl1MzIgY3JvcF9ib3R0b20sIGNyb3BfcmlnaHQ7CisJaW50IHN1Yl93aWR0aF9jID0gMCwgc3ViX2hlaWdodF9jID0gMDsKKwl1MzIgZnJhbWVfd2lkdGgsIGZyYW1lX2hlaWdodDsKKwl1MzIgdXNlZF9yZW9yZGVyX2RwYl9zaXplX21hcmdpbgorCQk9IGh3LT5yZW9yZGVyX2RwYl9zaXplX21hcmdpbjsKKworCWxldmVsX2lkYyA9IHBhcmFtNCAmIDB4ZmY7CisJbWF4X3JlZmVyZW5jZV9zaXplID0gKHBhcmFtNCA+PiA4KSAmIDB4ZmY7CisJaHctPmRwYi5tU1BTLmxldmVsX2lkYyA9IGxldmVsX2lkYzsKKworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJaWYgKHZkZWMtPm1hc3RlciB8fCB2ZGVjLT5zbGF2ZSkKKwkJdXNlZF9yZW9yZGVyX2RwYl9zaXplX21hcmdpbiA9CisJCQlyZW9yZGVyX2RwYl9zaXplX21hcmdpbl9kdjsKKyNlbmRpZgorCW1iX3dpZHRoID0gcGFyYW0xICYgMHhmZjsKKwltYl90b3RhbCA9IChwYXJhbTEgPj4gOCkgJiAweGZmZmY7CisJaWYgKCFtYl93aWR0aCAmJiBtYl90b3RhbCkgLypmb3IgNGsyayovCisJCW1iX3dpZHRoID0gMjU2OworCWlmIChtYl93aWR0aCkKKwkJbWJfaGVpZ2h0ID0gbWJfdG90YWwvbWJfd2lkdGg7CisJaWYgKG1iX3dpZHRoIDw9IDAgfHwgbWJfaGVpZ2h0IDw9IDAgfHwKKwkJaXNfb3ZlcnNpemUobWJfd2lkdGggPDwgNCwgbWJfaGVpZ2h0IDw8IDQpKSB7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJIiEhIXdyb25nIHBhcmFtMSAweCV4IG1iX3dpZHRoL21iX2hlaWdodCAoMHgleC8weCV4KSAleFxyXG4iLAorCQkJcGFyYW0xLAorCQkJbWJfd2lkdGgsCisJCQltYl9oZWlnaHQpOworCQlody0+ZXJyb3JfZnJhbWVfd2lkdGggPSBtYl93aWR0aCA8PCA0OworCQlody0+ZXJyb3JfZnJhbWVfaGVpZ2h0ID0gbWJfaGVpZ2h0IDw8IDQ7CisJCXJldHVybiAtMTsKKwl9CisJaHctPmVycm9yX2ZyYW1lX3dpZHRoID0gMDsKKwlody0+ZXJyb3JfZnJhbWVfaGVpZ2h0ID0gMDsKKworCWRlY19kcGJfc2l6ZSA9IGdldF9kZWNfZHBiX3NpemUoaHcgLCBtYl93aWR0aCwgbWJfaGVpZ2h0LCBsZXZlbF9pZGMpOworCisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSJ2NGwgcmVzdHJpY3Rpb246JWQsIG1heCBidWZmZXJpbmc6JWQsIERQQiBzaXplOiVkLCByZW9yZGVyIGZyYW1lczolZCwgbWFyZ2luOiVkXG4iLAorCQlody0+Yml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcsCisJCWh3LT5tYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZywKKwkJZGVjX2RwYl9zaXplLAorCQlody0+bnVtX3Jlb3JkZXJfZnJhbWVzLAorCQl1c2VkX3Jlb3JkZXJfZHBiX3NpemVfbWFyZ2luKTsKKworCWFjdGl2ZV9idWZmZXJfc3BlY19udW0gPQorCQlkZWNfZHBiX3NpemUKKwkJKyB1c2VkX3Jlb3JkZXJfZHBiX3NpemVfbWFyZ2luOworCisJaWYgKGFjdGl2ZV9idWZmZXJfc3BlY19udW0gPiBNQVhfVkZfQlVGX05VTSkgeworCQlhY3RpdmVfYnVmZmVyX3NwZWNfbnVtID0gTUFYX1ZGX0JVRl9OVU07CisJCWRlY19kcGJfc2l6ZSA9IGFjdGl2ZV9idWZmZXJfc3BlY19udW0KKwkJCS0gdXNlZF9yZW9yZGVyX2RwYl9zaXplX21hcmdpbjsKKwl9CisKKwlody0+ZHBiLm1EUEIuc2l6ZSA9IGFjdGl2ZV9idWZmZXJfc3BlY19udW07CisKKwlpZiAoaHctPm5vX3BvY19yZW9yZGVyX2ZsYWcpCisJCWRlY19kcGJfc2l6ZSA9IDE7CisKKwkvKgorCSAqIGNyb3AKKwkgKiBBVl9TQ1JBVENIXzIKKwkgKiBiaXQgMTU6IGZyYW1lX21ic19vbmx5X2ZsYWcKKwkgKiBiaXQgMTMtMTQ6IGNocm9tYV9mb3JtYXRfaWRjCisJICovCisJaHctPnNlcV9pbmZvID0gcGFyYW0yOworCWZyYW1lX21ic19vbmx5X2ZsYWcgPSAoaHctPnNlcV9pbmZvID4+IDE1KSAmIDB4MDE7CisJaWYgKGh3LT5kcGIubVNQUy5wcm9maWxlX2lkYyAhPSAxMDAgJiYKKwkJaHctPmRwYi5tU1BTLnByb2ZpbGVfaWRjICE9IDExMCAmJgorCQlody0+ZHBiLm1TUFMucHJvZmlsZV9pZGMgIT0gMTIyICYmCisJCWh3LT5kcGIubVNQUy5wcm9maWxlX2lkYyAhPSAxNDQpIHsKKwkJaHctPmRwYi5jaHJvbWFfZm9ybWF0X2lkYyA9IDE7CisJfQorCWNocm9tYV9mb3JtYXRfaWRjID0gaHctPmRwYi5jaHJvbWFfZm9ybWF0X2lkYzsKKworCS8qCisJICogQVZfU0NSQVRDSF82IGJpdCAzMS0xNiA9ICAobGVmdCAgPDwgOCB8IHJpZ2h0ICkgPDwgMQorCSAqIEFWX1NDUkFUQ0hfNiBiaXQgMTUtMCA9ICAodG9wIDw8IDggIHwgYm90dG9tICkgPDwKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgKDIgLSBmcmFtZV9tYnNfb25seV9mbGFnKQorCSAqLworCXN3aXRjaCAoY2hyb21hX2Zvcm1hdF9pZGMpIHsKKwkJY2FzZSAxOgorCQkJc3ViX3dpZHRoX2MgPSAyOworCQkJc3ViX2hlaWdodF9jID0gMjsKKwkJCWJyZWFrOworCisJCWNhc2UgMjoKKwkJCXN1Yl93aWR0aF9jID0gMjsKKwkJCXN1Yl9oZWlnaHRfYyA9IDE7CisJCQlicmVhazsKKworCQljYXNlIDM6CisJCQlzdWJfd2lkdGhfYyA9IDE7CisJCQlzdWJfaGVpZ2h0X2MgPSAxOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCWlmIChjaHJvbWFfZm9ybWF0X2lkYyA9PSAwKSB7CisJCWNyb3BfcmlnaHQgPSBody0+ZHBiLmZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0OworCQljcm9wX2JvdHRvbSA9IGh3LT5kcGIuZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0ICoKKwkJCSgyIC0gZnJhbWVfbWJzX29ubHlfZmxhZyk7CisJfSBlbHNlIHsKKwkJY3JvcF9yaWdodCA9IHN1Yl93aWR0aF9jICogaHctPmRwYi5mcmFtZV9jcm9wX3JpZ2h0X29mZnNldDsKKwkJY3JvcF9ib3R0b20gPSBzdWJfaGVpZ2h0X2MgKiBody0+ZHBiLmZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCAqCisJCQkoMiAtIGZyYW1lX21ic19vbmx5X2ZsYWcpOworCX0KKworCWZyYW1lX3dpZHRoID0gbWJfd2lkdGggPDwgNDsKKwlmcmFtZV9oZWlnaHQgPSBtYl9oZWlnaHQgPDwgNDsKKworCWZyYW1lX3dpZHRoID0gZnJhbWVfd2lkdGggLSBjcm9wX3JpZ2h0OworCWZyYW1lX2hlaWdodCA9IGZyYW1lX2hlaWdodCAtIGNyb3BfYm90dG9tOworCisJcHMtPnByb2ZpbGUgCQk9IGxldmVsX2lkYzsKKwlwcy0+cmVmX2ZyYW1lcyAJCT0gbWF4X3JlZmVyZW5jZV9zaXplOworCXBzLT5tYl93aWR0aCAJCT0gbWJfd2lkdGg7CisJcHMtPm1iX2hlaWdodCAJCT0gbWJfaGVpZ2h0OworCXBzLT52aXNpYmxlX3dpZHRoCT0gZnJhbWVfd2lkdGg7CisJcHMtPnZpc2libGVfaGVpZ2h0CT0gZnJhbWVfaGVpZ2h0OworCXBzLT5jb2RlZF93aWR0aAkJPSBBTElHTihtYl93aWR0aCA8PCA0LCA2NCk7CisJcHMtPmNvZGVkX2hlaWdodAk9IEFMSUdOKG1iX2hlaWdodCA8PCA0LCA2NCk7CisJcHMtPmRwYl9mcmFtZXMJCT0gZGVjX2RwYl9zaXplICsgMTsgLyogKzEgZm9yIHR3byBmcmFtZXMgaW4gb25lIHBhY2tldCAqLworCXBzLT5kcGJfbWFyZ2luCQk9IHVzZWRfcmVvcmRlcl9kcGJfc2l6ZV9tYXJnaW47CisJcHMtPmRwYl9zaXplCQk9IGFjdGl2ZV9idWZmZXJfc3BlY19udW07CisJcHMtPmZpZWxkID0gZnJhbWVfbWJzX29ubHlfZmxhZyA/CisJCVY0TDJfRklFTERfTk9ORSA6IFY0TDJfRklFTERfSU5URVJMQUNFRDsKKworCS8qIHVwZGF0ZSByZW9kZXIgYW5kIG1hcmdpbiBudW0uICovCisJaWYgKGh3LT5yZXNfY2hfZmxhZykgeworCQl2ZGVjX3Y0bF9nZXRfcGljX2luZm8oY3R4LCAmcGljKTsKKwkJcHMtPmRwYl9mcmFtZXMgPSBwaWMuZHBiX2ZyYW1lczsKKwkJcHMtPmRwYl9tYXJnaW4gPSBwaWMuZHBiX21hcmdpbjsKKwl9CisKKwlpZiAoKHBzLT5kcGJfZnJhbWVzID49IDE2KSAmJiAocHMtPmNvZGVkX3dpZHRoID4gMTI4MCkgJiYKKwkJKHBzLT5jb2RlZF9oZWlnaHQgPiA3NjgpKSB7CisJCWlmIChwcy0+ZmllbGQgPT0gVjRMMl9GSUVMRF9OT05FKSB7CisJCQlwcy0+ZHBiX2ZyYW1lcyA9IGFkanVzdF9kcGJfc2l6ZTsKKwkJfSBlbHNlIHsKKwkJCXBzLT5kcGJfZnJhbWVzID0gYWRqdXN0X2RwYl9zaXplIC0gMjsKKwkJfQorCX0KKworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiUmVzOiVkeCVkLCBEUEIgc2l6ZTolZCwgbWFyZ2luOiVkLCBzY2FuOiVzXG4iLAorCQlwcy0+dmlzaWJsZV93aWR0aCwgcHMtPnZpc2libGVfaGVpZ2h0LAorCQlwcy0+ZHBiX2ZyYW1lcywgcHMtPmRwYl9tYXJnaW4sCisJCShwcy0+ZmllbGQgPT0gVjRMMl9GSUVMRF9OT05FKSA/ICJQIiA6ICJJIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2NGxfcmVzX2NoYW5nZShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LAorCQkJICB1MzIgcGFyYW0xLCB1MzIgcGFyYW0yLAorCQkJICB1MzIgcGFyYW0zLCB1MzIgcGFyYW00KQoreworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShody0+djRsMl9jdHgpOworCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gJmh3LT5kcGI7CisJaW50IHJldCA9IDA7CisJaW50IGRlY19kcGJfc2l6ZV9jaGFuZ2UgPSBody0+ZHBiLmRlY19kcGJfc2l6ZSAhPSBnZXRfZGVjX2RwYl9zaXplX2FjdGl2ZShodywgcGFyYW0xLCBwYXJhbTQpOworCisJaWYgKGN0eC0+cGFyYW1fc2V0c19mcm9tX3Vjb2RlICYmCisJCQlody0+cmVzX2NoX2ZsYWcgPT0gMCkgeworCQlpZiAoKChwYXJhbTEgIT0gMCAmJgorCQkJaHctPnNlcV9pbmZvMiAhPSBwYXJhbTEpIHx8IGh3LT5jc2RfY2hhbmdlX2ZsYWcpICYmCisJCQlody0+c2VxX2luZm8yICE9IDApIHsKKwkJCWlmICgoKGh3LT5zZXFfaW5mbzIgJiAweDgwZmZmZmZmKSAhPSAocGFyYW0xICYgMHg4MGZmZmZmZikpIHx8IGRlY19kcGJfc2l6ZV9jaGFuZ2UpIHsgLypwaWN0dXJlIHNpemUgY2hhbmdlZCovCisJCQkJc3RydWN0IGFtbF92ZGVjX3BzX2luZm9zIHBzOworCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RFQ19ERVRBSUwsCisJCQkJCSJoMjY0IHJlc19jaGFuZ2VcbiIpOworCQkJCWlmICh2bWgyNjRfZ2V0X3BzX2luZm8oaHcsIHBhcmFtMSwKKwkJCQkJcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgJnBzKSA8IDApIHsKKwkJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkJCQkic2V0IHBhcmFtZXRlcnMgZXJyb3JcbiIpOworCQkJCX0KKwkJCQlody0+djRsX3BhcmFtc19wYXJzZWQgPSBmYWxzZTsKKwkJCQl2ZGVjX3Y0bF9zZXRfcHNfaW5mb3MoY3R4LCAmcHMpOworCQkJCXZkZWNfdjRsX3Jlc19jaF9ldmVudChjdHgpOworCQkJCWh3LT5yZXNfY2hfZmxhZyA9IDE7CisJCQkJY3R4LT52NGxfcmVzb2x1dGlvbl9jaGFuZ2UgPSAxOworCQkJCWh3LT5iaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZyA9IGh3LT5jZmdfYml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWc7IC8vIHJlc3RvcmUgdGhlIG9sZCB2YWx1ZSB3aGVuIHY0bCByZXMgY2hhbmdlCisJCQkJYW12ZGVjX3N0b3AoKTsKKwkJCQlpZiAoaHctPm1tdV9lbmFibGUpCisJCQkJCWFtaGV2Y19zdG9wKCk7CisJCQkJaHctPmVvcyA9IDE7CisJCQkJZmx1c2hfZHBiKHBfSDI2NF9EcGIpOworCQkJCS8vZGVsX3RpbWVyX3N5bmMoJmh3LT5jaGVja190aW1lcik7CisJCQkJQVRSQUNFX0NPVU5URVIoIlZfU1RfREVDLXN1Ym1pdF9lb3MiLCBfX0xJTkVfXyk7CisJCQkJbm90aWZ5X3Y0bF9lb3MoaHdfdG9fdmRlYyhodykpOworCQkJCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy1zdWJtaXRfZW9zIiwgMCk7CisJCQkJcmV0ID0gMTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiByZXQ7CisKK30KKworc3RhdGljIHZvaWQgdmgyNjRfd29ya19pbXBsZW1lbnQoc3RydWN0IHZkZWNfaDI2NF9od19zICpodywKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgZnJvbSkKK3sKKwkvKiBmaW5pc2hlZCBkZWNvZGluZyBvbmUgZnJhbWUgb3IgZXJyb3IsCisJICogbm90aWZ5IHZkZWMgY29yZSB0byBzd2l0Y2ggY29udGV4dAorCSAqLworCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gJmh3LT5kcGI7CisKKwlpZiAoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9ET05FKSB7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX1dPUktFUl9TVEFSVCk7CisJfSBlbHNlIGlmIChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0FHQUlOKQorCQlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9XT1JLRVJfQUdBSU4pOworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1ZERUNfREVUQUlMLAorCQkiJXMgZGVjX3Jlc3VsdCAlZCAleCAleCAleFxuIiwKKwkJX19mdW5jX18sCisJCWh3LT5kZWNfcmVzdWx0LAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApKTsKKworCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy13b3JrX3N0YXRlIiwgaHctPmRlY19yZXN1bHQpOworCisJaWYgKCFody0+bW11X2VuYWJsZSkgeworCQltdXRleF9sb2NrKCZ2bWgyNjRfbXV0ZXgpOworCQlkZWFsbG9jX2J1Zl9zcGVjcyhodywgMCk7CisJCW11dGV4X3VubG9jaygmdm1oMjY0X211dGV4KTsKKwl9CisJaHctPnNhdmVfcmVnX2YgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9GKTsKKwlody0+ZHBiLmxhc3RfZHBiX3N0YXR1cyA9IGh3LT5kcGIuZGVjX2RwYl9zdGF0dXM7CisJaWYgKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfQ09ORklHX1BBUkFNKSB7CisJCXUzMiBwYXJhbTEgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF8xKTsKKwkJdTMyIHBhcmFtMiA9IFJFQURfVlJFRyhBVl9TQ1JBVENIXzIpOworCQl1MzIgcGFyYW0zID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfNik7CisJCXUzMiBwYXJhbTQgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9CKTsKKwkJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KTsKKworCQlpZiAoaHctPmlzX3VzZWRfdjRsICYmCisJCQljdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSkgeworCQkJaWYgKCF2NGxfcmVzX2NoYW5nZShodywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00KSkgeworCQkJCWlmICghaHctPnY0bF9wYXJhbXNfcGFyc2VkKSB7CisJCQkJCXN0cnVjdCBhbWxfdmRlY19wc19pbmZvcyBwczsKKwkJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJCQlQUklOVF9GTEFHX0RFQ19ERVRBSUwsCisJCQkJCQkiaDI2NCBwYXJzZXJlZCBjc2QgZGF0YVxuIik7CisJCQkJCWlmICh2bWgyNjRfZ2V0X3BzX2luZm8oaHcsCisJCQkJCQlwYXJhbTEsIHBhcmFtMiwKKwkJCQkJCXBhcmFtMywgcGFyYW00LCAmcHMpIDwgMCkgeworCQkJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkJCQkJInNldCBwYXJhbWV0ZXJzIGVycm9yXG4iKTsKKwkJCQkJfQorCQkJCQlody0+djRsX3BhcmFtc19wYXJzZWQgPSB0cnVlOworCQkJCQl2ZGVjX3Y0bF9zZXRfcHNfaW5mb3MoY3R4LCAmcHMpOworCisJCQkJCWFtdmRlY19zdG9wKCk7CisJCQkJCWlmIChody0+bW11X2VuYWJsZSkKKwkJCQkJCWFtaGV2Y19zdG9wKCk7CisJCQkJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX1dPUktFUl9TVEFSVCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHZoMjY0X3NldF9wYXJhbXMoaHcsIHBhcmFtMSwKKwkJCQkJCXBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIGZhbHNlKSA8IDApIHsKKwkJCQkJCWh3LT5pbml0X2ZsYWcgPSAwOworCQkJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsICJzZXQgcGFyYW1ldGVycyBlcnJvciwgaW5pdF9mbGFnOiAldVxuIiwKKwkJCQkJCQlody0+aW5pdF9mbGFnKTsKKwkJCQkJfQorCisJCQkJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF8wLCAoaHctPm1heF9yZWZlcmVuY2Vfc2l6ZTw8MjQpIHwKKwkJCQkJCShody0+ZHBiLm1EUEIuc2l6ZTw8MTYpIHwKKwkJCQkJCShody0+ZHBiLm1EUEIuc2l6ZTw8OCkpOworCQkJCQlody0+cmVzX2NoX2ZsYWcgPSAwOworCQkJCQlzdGFydF9wcm9jZXNzX3RpbWUoaHcpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHZoMjY0X3NldF9wYXJhbXMoaHcsIHBhcmFtMSwKKwkJCQlwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBmYWxzZSkgPCAwKSB7CisJCQkJCWh3LT5pbml0X2ZsYWcgPSAwOworCQkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwgInNldCBwYXJhbWV0ZXJzIGVycm9yLCBpbml0X2ZsYWc6ICV1XG4iLAorCQkJCQkJaHctPmluaXRfZmxhZyk7CisJCQkJfQorCisJCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfMCwgKGh3LT5tYXhfcmVmZXJlbmNlX3NpemU8PDI0KSB8CisJCQkJKGh3LT5kcGIubURQQi5zaXplPDwxNikgfAorCQkJCShody0+ZHBiLm1EUEIuc2l6ZTw8OCkpOworCQkJc3RhcnRfcHJvY2Vzc190aW1lKGh3KTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZQorCWlmICgoKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfR0VUX0RBVEEpIHx8CisJCShody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0dFVF9EQVRBX1JFVFJZKSkKKwkJJiYgKGh3X3RvX3ZkZWMoaHcpLT5uZXh0X3N0YXR1cyAhPQorCQlWREVDX1NUQVRVU19ESVNDT05ORUNURUQpKSB7CisJCWlmICghdmRlY19oYXNfbW9yZV9pbnB1dCh2ZGVjKSkgeworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0VPUzsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfR0VUX0RBVEEpIHsKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJCSIlcyBERUNfUkVTVUxUX0dFVF9EQVRBICV4ICV4ICV4XG4iLAorCQkJCV9fZnVuY19fLAorCQkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCksCisJCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1dQKSwKKwkJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApKTsKKwkJCW11dGV4X2xvY2soJmh3LT5jaHVua3NfbXV0ZXgpOworCQkJdmRlY192ZnJhbWVfZGlydHkodmRlYywgaHctPmNodW5rKTsKKwkJCWh3LT5jaHVuayA9IE5VTEw7CisJCQltdXRleF91bmxvY2soJmh3LT5jaHVua3NfbXV0ZXgpOworCQkJdmRlY19jbGVhbl9pbnB1dCh2ZGVjKTsKKwkJfQorCQlpZiAoKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfR0VUX0RBVEFfUkVUUlkpICYmCisJCQkoKDEwMDAgKiAoamlmZmllcyAtIGh3LT5nZXRfZGF0YV9zdGFydF90aW1lKSAvIEhaKQorCQkJPiBnZXRfZGF0YV90aW1lb3V0X3ZhbCkpIHsKKwkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJCSIlcyBERUNfUkVTVUxUX0dFVF9EQVRBX1JFVFJZIHRpbWVvdXRcbiIsCisJCQkJX19mdW5jX18pOworCQkJZ290byByZXN1bHRfZG9uZTsKKwkJfQorCQlpZiAoaXNfYnVmZmVyX2F2YWlsYWJsZSh2ZGVjKSkgeworCQkJaW50IHI7CisJCQlpbnQgZGVjb2RlX3NpemU7CisJCQlyID0gdmRlY19wcmVwYXJlX2lucHV0KHZkZWMsICZody0+Y2h1bmspOworCQkJaWYgKHIgPCAwICYmIChod190b192ZGVjKGh3KS0+bmV4dF9zdGF0dXMgIT0KKwkJCQkJCVZERUNfU1RBVFVTX0RJU0NPTk5FQ1RFRCkpIHsKKwkJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfR0VUX0RBVEFfUkVUUlk7CisKKwkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCQkJUFJJTlRfRkxBR19WREVDX0RFVEFJTCwKKwkJCQkJInZkZWNfcHJlcGFyZV9pbnB1dDogSW5zdWZmaWNpZW50IGRhdGFcbiIpOworCQkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9OT05FOworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkJIiVzOiBjaHVuayBzaXplIDB4JXhcbiIsCisJCQkJX19mdW5jX18sIGh3LT5jaHVuay0+c2l6ZSk7CisKKwkJCWlmIChkcGJfaXNfZGVidWcoREVDT0RFX0lEKGh3KSwKKwkJCQlQUklOVF9GUkFNRUJBU0VfREFUQSkpIHsKKwkJCQlpbnQgamo7CisJCQkJdTggKmRhdGEgPSBOVUxMOworCisJCQkJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQkJCWRhdGEgPSBjb2RlY19tbV92bWFwKAorCQkJCQkJaHctPmNodW5rLT5ibG9jay0+c3RhcnQgKworCQkJCQkJaHctPmNodW5rLT5vZmZzZXQsIHIpOworCQkJCWVsc2UKKwkJCQkJZGF0YSA9ICgodTggKikKKwkJCQkJCWh3LT5jaHVuay0+YmxvY2stPnN0YXJ0X3ZpcnQpCisJCQkJCQkrIGh3LT5jaHVuay0+b2Zmc2V0OworCisJCQkJZm9yIChqaiA9IDA7IGpqIDwgcjsgamorKykgeworCQkJCQlpZiAoKGpqICYgMHhmKSA9PSAwKQorCQkJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJCQlQUklOVF9GUkFNRUJBU0VfREFUQSwKKwkJCQkJCQkiJTA2eDoiLCBqaik7CisJCQkJCWRwYl9wcmludF9jb250KERFQ09ERV9JRChodyksCisJCQkJCVBSSU5UX0ZSQU1FQkFTRV9EQVRBLAorCQkJCQkJIiUwMnggIiwgZGF0YVtqal0pOworCQkJCQlpZiAoKChqaiArIDEpICYgMHhmKSA9PSAwKQorCQkJCQkJZHBiX3ByaW50X2NvbnQoREVDT0RFX0lEKGh3KSwKKwkJCQkJCVBSSU5UX0ZSQU1FQkFTRV9EQVRBLAorCQkJCQkJCSJcbiIpOworCQkJCX0KKworCQkJCWlmICghaHctPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQkJCQljb2RlY19tbV91bm1hcF9waHlhZGRyKGRhdGEpOworCQkJfQorCQkJV1JJVEVfVlJFRyhQT1dFUl9DVExfVkxELAorCQkJCVJFQURfVlJFRyhQT1dFUl9DVExfVkxEKSB8CisJCQkJCSgwIDw8IDEwKSB8ICgxIDw8IDkpIHwgKDEgPDwgNikpOworCQkJV1JJVEVfVlJFRyhIMjY0X0RFQ09ERV9JTkZPLCAoMTw8MTMpKTsKKwkJCWRlY29kZV9zaXplID0gaHctPmNodW5rLT5zaXplICsKKwkJCQkoaHctPmNodW5rLT5vZmZzZXQgJiAoVkRFQ19GSUZPX0FMSUdOIC0gMSkpOworCQkJV1JJVEVfVlJFRyhIMjY0X0RFQ09ERV9TSVpFLCBkZWNvZGVfc2l6ZSk7CisJCQlXUklURV9WUkVHKFZJRkZfQklUX0NOVCwgZGVjb2RlX3NpemUgKiA4KTsKKwkJCXZkZWNfZW5hYmxlX2lucHV0KHZkZWMpOworCisJCQlXUklURV9WUkVHKERQQl9TVEFUVVNfUkVHLCBIMjY0X0FDVElPTl9TRUFSQ0hfSEVBRCk7CisJCQlzdGFydF9wcm9jZXNzX3RpbWUoaHcpOworCQl9IGVsc2V7CisJCQlpZiAoaHdfdG9fdmRlYyhodyktPm5leHRfc3RhdHVzCisJCQkJIT0JVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEKSB7CisJCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0dFVF9EQVRBX1JFVFJZOworCQkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJfQorCQl9CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfRE9ORSB8fAorCQkJCQlody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX1RJTUVPVVQpIHsKKwkJLyogaWYgKCFody0+Y3R4X3ZhbGlkKQorCQkJaHctPmN0eF92YWxpZCA9IDE7ICovCisJCWlmICgoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9USU1FT1VUKSAmJgorCQkJCSFody0+aV9vbmx5ICYmIChody0+ZXJyb3JfcHJvY19wb2xpY3kgJiAweDIpKSB7CisJCQlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9ICZody0+ZHBiOworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkJIiVzLCBkZWNvZGUgdGltZW91dCBmbHVzaCBkcGJcbiIsCisJCQkJX19mdW5jX18pOworCQkJZmx1c2hfZHBiKHBfSDI2NF9EcGIpOworCQl9CityZXN1bHRfZG9uZToKKwkJeworCQkJaWYgKGh3LT5lcnJvcl9wcm9jX3BvbGljeSAmIDB4ODAwMCkgeworCQkJCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gJmh3LT5kcGI7CisJCQkJaW50IGk7CisJCQkJc3RydWN0IERlY29kZWRQaWN0dXJlQnVmZmVyICpwX0RwYiA9ICZwX0gyNjRfRHBiLT5tRFBCOworCisJCQkJZm9yIChpID0gMDsgaSA8IHBfRHBiLT51c2VkX3NpemU7IGkrKykgeworCQkJCQlpbnQgaV9mbGFnID0gcF9EcGItPmZzW2ldLT5ib3R0b21fZmllbGQgfHwgcF9EcGItPmZzW2ldLT50b3BfZmllbGQ7CisJCQkJCWludCB0aHJlc2hvbGQgPSAoaV9mbGFnIHx8IChody0+bWF4X3JlZmVyZW5jZV9zaXplID49IDEyKSkgPyAoKDUwICsgcF9EcGItPnVzZWRfc2l6ZSkgKiAyKSAgOiA1MCArIHBfRHBiLT51c2VkX3NpemU7CisJCQkJCWlmICgocF9EcGItPmZzW2ldLT5kcGJfZnJhbWVfY291bnQgKyB0aHJlc2hvbGQKKwkJCQkJCQk8IHBfSDI2NF9EcGItPmRwYl9mcmFtZV9jb3VudCkgJiYKKwkJCQkJCXBfRHBiLT5mc1tpXS0+aXNfcmVmZXJlbmNlICYmCisJCQkJCQkhcF9EcGItPmZzW2ldLT5pc19sb25nX3Rlcm0gJiYKKwkJCQkJCXBfRHBiLT5mc1tpXS0+aXNfb3V0cHV0KSB7CisJCQkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCQkJCQkwLAorCQkJCQkJCSJ1bm1hcmsgcmVmZXJlbmNlIGRwYl9mcmFtZV9jb3VudCBkaWZmcmVuY2UgbGFyZ2UgaW4gZHBiXG4iKTsKKwkJCQkJCXVubWFya19mb3JfcmVmZXJlbmNlKHBfRHBiLCBwX0RwYi0+ZnNbaV0pOworCQkJCQkJdXBkYXRlX3JlZl9saXN0KHBfRHBiKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQkJaWYgKGh3LT5tbXVfZW5hYmxlCisJCQkJJiYgaHctPmZyYW1lX2J1c3kgJiYgaHctPmZyYW1lX2RvbmUpIHsKKwkJCQlsb25nIHVzZWRfNGtfbnVtOworCQkJCWhldmNfc2FvX3dhaXRfZG9uZShodyk7CisJCQkJaWYgKGh3LT5oZXZjX2N1cl9idWZfaWR4ICE9IDB4ZmZmZikgeworCQkJCQl1c2VkXzRrX251bSA9CisJCQkJCShSRUFEX1ZSRUcoSEVWQ19TQU9fTU1VX1NUQVRVUykgPj4gMTYpOworCQkJCWlmICh1c2VkXzRrX251bSA+PSAwKQorCQkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCQkJUFJJTlRfRkxBR19NTVVfREVUQUlMLAorCQkJCQkicmVsZWFzZSB1bnVzZWQgYnVmICwgdXNlZF80a19udW0gJWxkIGluZGV4ICVkXG4iLAorCQkJCQl1c2VkXzRrX251bSwgaHctPmhldmNfY3VyX2J1Zl9pZHgpOworCQkJCWhldmNfbW11X2RtYV9jaGVjayhod190b192ZGVjKGh3KSk7CisJCQkJZGVjb2Rlcl9tbXVfYm94X2ZyZWVfaWR4X3RhaWwoCisJCQkJCWh3LT5tbXVfYm94LAorCQkJCQlody0+aGV2Y19jdXJfYnVmX2lkeCwKKwkJCQkJdXNlZF80a19udW0pOworCQkJCQlody0+aGV2Y19jdXJfYnVmX2lkeCA9IDB4ZmZmZjsKKwkJCQl9CisJCQl9CisJCWRlY29kZV9mcmFtZV9jb3VudFtERUNPREVfSUQoaHcpXSsrOworCQlpZiAoaHctPmRwYi5tU2xpY2Uuc2xpY2VfdHlwZSA9PSBJX1NMSUNFKSB7CisJCQlody0+Z3ZzLmlfZGVjb2RlZF9mcmFtZXMrKzsKKwkJfSBlbHNlIGlmIChody0+ZHBiLm1TbGljZS5zbGljZV90eXBlID09IFBfU0xJQ0UpIHsKKwkJCWh3LT5ndnMucF9kZWNvZGVkX2ZyYW1lcysrOworCQl9IGVsc2UgaWYgKGh3LT5kcGIubVNsaWNlLnNsaWNlX3R5cGUgPT0gQl9TTElDRSkgeworCQkJaHctPmd2cy5iX2RlY29kZWRfZnJhbWVzKys7CisJCX0KKwkJYW12ZGVjX3N0b3AoKTsKKworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCSIlcyBkZWNfcmVzdWx0ICVkICV4ICV4ICV4XG4iLAorCQkJX19mdW5jX18sCisJCQlody0+ZGVjX3Jlc3VsdCwKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCksCisJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSk7CisJCW11dGV4X2xvY2soJmh3LT5jaHVua3NfbXV0ZXgpOworCQl2ZGVjX3ZmcmFtZV9kaXJ0eShod190b192ZGVjKGh3KSwgaHctPmNodW5rKTsKKwkJaHctPmNodW5rID0gTlVMTDsKKwkJbXV0ZXhfdW5sb2NrKCZody0+Y2h1bmtzX211dGV4KTsKKwl9IGVsc2UgaWYgKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfQUdBSU4pIHsKKwkJLyoKKwkJCXN0cmVhbSBiYXNlOiBzdHJlYW0gYnVmIGVtcHR5IG9yIHRpbWVvdXQKKwkJCWZyYW1lIGJhc2U6IHZkZWNfcHJlcGFyZV9pbnB1dCBmYWlsCisJCSovCisJCWlmICghdmRlY19oYXNfbW9yZV9pbnB1dCh2ZGVjKSAmJiAoaHdfdG9fdmRlYyhodyktPm5leHRfc3RhdHVzICE9CisJCQlWREVDX1NUQVRVU19ESVNDT05ORUNURUQpICYmIChody0+bm9fZGVjb2Rlcl9idWZmZXJfZmxhZyA9PSAwKSkgeworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0VPUzsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJcmV0dXJuOworCQl9CisJCWFtdmRlY19zdG9wKCk7CisJCWlmIChody0+bW11X2VuYWJsZSkKKwkJCWFtaGV2Y19zdG9wKCk7CisJCWh3LT5ub19kZWNvZGVyX2J1ZmZlcl9mbGFnID0gMDsKKwkJaHctPm5leHRfYWdhaW5fZmxhZyA9IDE7CisJfSBlbHNlIGlmIChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0VPUykgeworCQlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9ICZody0+ZHBiOworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCSIlczogZW5kIG9mIHN0cmVhbVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJYW12ZGVjX3N0b3AoKTsKKwkJaWYgKGh3LT5tbXVfZW5hYmxlKQorCQkJYW1oZXZjX3N0b3AoKTsKKwkJaHctPmVvcyA9IDE7CisJCWZsdXNoX2RwYihwX0gyNjRfRHBiKTsKKwkJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQkJQVRSQUNFX0NPVU5URVIoIlZfU1RfREVDLXN1Ym1pdF9lb3MiLCBfX0xJTkVfXyk7CisJCQlub3RpZnlfdjRsX2Vvcyhod190b192ZGVjKGh3KSk7CisJCQlBVFJBQ0VfQ09VTlRFUigiVl9TVF9ERUMtc3VibWl0X2VvcyIsIDApOworCQl9CisJCW11dGV4X2xvY2soJmh3LT5jaHVua3NfbXV0ZXgpOworCQl2ZGVjX3ZmcmFtZV9kaXJ0eShod190b192ZGVjKGh3KSwgaHctPmNodW5rKTsKKwkJaHctPmNodW5rID0gTlVMTDsKKwkJbXV0ZXhfdW5sb2NrKCZody0+Y2h1bmtzX211dGV4KTsKKwkJdmRlY19jbGVhbl9pbnB1dCh2ZGVjKTsKKwl9IGVsc2UgaWYgKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfRk9SQ0VfRVhJVCkgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCSIlczogZm9yY2UgZXhpdFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJYW12ZGVjX3N0b3AoKTsKKwkJaWYgKGh3LT5tbXVfZW5hYmxlKQorCQkJYW1oZXZjX3N0b3AoKTsKKwkJaWYgKGh3LT5zdGF0ICYgU1RBVF9JU1JfUkVHKSB7CisJCQl2ZGVjX2ZyZWVfaXJxKFZERUNfSVJRXzEsICh2b2lkICopaHcpOworCQkJaHctPnN0YXQgJj0gflNUQVRfSVNSX1JFRzsKKwkJfQorCX0gZWxzZSBpZiAoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9ORUVEX01PUkVfQlVGRkVSKSB7CisJCXN0cnVjdCBoMjY0X2RwYl9zdHJ1ICpwX0gyNjRfRHBiID0gJmh3LT5kcGI7CisJCWJ1Zm1ncl9oMjY0X3JlbW92ZV91bnVzZWRfZnJhbWUocF9IMjY0X0RwYiwgMCk7CisJCWlmICghaGF2ZV9mcmVlX2J1Zl9zcGVjKHZkZWMpKSB7CisJCQlpZiAodmRlYy0+bmV4dF9zdGF0dXMgPT0gVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEKQorCQkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKwkJCWVsc2UKKwkJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfTkVFRF9NT1JFX0JVRkZFUjsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQl9IGVsc2UgeworCQkJaHctPmdldF9kYXRhX2NvdW50ID0gMHg3ZmZmZmZmZjsKKwkJCVdSSVRFX1ZSRUcoRFBCX1NUQVRVU19SRUcsIEgyNjRfQUNUSU9OX1NFQVJDSF9IRUFEKTsKKwkJCWRlY29kZV9mcmFtZV9jb3VudFtERUNPREVfSUQoaHcpXSsrOworCQkJaWYgKHBfSDI2NF9EcGItPm1TbGljZS5zbGljZV90eXBlID09IElfU0xJQ0UpIHsKKwkJCQlody0+Z3ZzLmlfZGVjb2RlZF9mcmFtZXMrKzsKKwkJCX0gZWxzZSBpZiAocF9IMjY0X0RwYi0+bVNsaWNlLnNsaWNlX3R5cGUgPT0gUF9TTElDRSkgeworCQkJCWh3LT5ndnMucF9kZWNvZGVkX2ZyYW1lcysrOworCQkJfSBlbHNlIGlmIChwX0gyNjRfRHBiLT5tU2xpY2Uuc2xpY2VfdHlwZSA9PSBCX1NMSUNFKSB7CisJCQkJaHctPmd2cy5iX2RlY29kZWRfZnJhbWVzKys7CisJCQl9CisJCQlzdGFydF9wcm9jZXNzX3RpbWUoaHcpOworCQl9CisJCXJldHVybjsKKwl9CisKKwlpZiAocF9IMjY0X0RwYi0+bVZpZGVvLmRlY19waWN0dXJlKSB7CisJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJIiVzLCByZWxlYXNlIGRlY29kZWQgcGljdHVyZVxuIiwgX19mdW5jX18pOworCQlyZWxlYXNlX2N1cl9kZWNvZGluZ19idWYoaHcpOworCX0KKworCVdSSVRFX1ZSRUcoQVNTSVNUX01CT1gxX01BU0ssIDApOworCWRlbF90aW1lcl9zeW5jKCZody0+Y2hlY2tfdGltZXIpOworCWh3LT5zdGF0ICY9IH5TVEFUX1RJTUVSX0FSTTsKKyNpZmRlZiBERVRFQ1RfV1JPTkdfTVVMVElfU0xJQ0UKKwlpZiAoaHctPmRlY19yZXN1bHQgIT0gREVDX1JFU1VMVF9BR0FJTikKKwkJaHctPmxhc3RfcGljdHVyZV9zbGljZV9jb3VudCA9IDA7CisjZW5kaWYKKwlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX3dvcmtfdGltZV9uYW1lLCBUUkFDRV9XT1JLX1dBSVRfU0VBUkNIX0RPTkVfU1RBUlQpOworCXdhaXRfdm1oMjY0X3NlYXJjaF9kb25lKGh3KTsKKwlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX3dvcmtfdGltZV9uYW1lLCBUUkFDRV9XT1JLX1dBSVRfU0VBUkNIX0RPTkVfRU5EKTsKKwkvKiBtYXJrIGl0c2VsZiBoYXMgYWxsIEhXIHJlc291cmNlIHJlbGVhc2VkIGFuZCBpbnB1dCByZWxlYXNlZCAqLworCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwlpZiAoaHctPnN3aXRjaF9kdmxheWVyX2ZsYWcpIHsKKwkJaWYgKHZkZWMtPnNsYXZlKQorCQkJdmRlY19zZXRfbmV4dF9zY2hlZCh2ZGVjLCB2ZGVjLT5zbGF2ZSk7CisJCWVsc2UgaWYgKHZkZWMtPm1hc3RlcikKKwkJCXZkZWNfc2V0X25leHRfc2NoZWQodmRlYywgdmRlYy0+bWFzdGVyKTsKKwl9IGVsc2UgaWYgKHZkZWMtPnNsYXZlIHx8IHZkZWMtPm1hc3RlcikKKwkJdmRlY19zZXRfbmV4dF9zY2hlZCh2ZGVjLCB2ZGVjKTsKKyNlbmRpZgorCisJaWYgKGZyb20gPT0gMSkgeworCQkvKiBUaGlzIGlzIGEgdGltZW91dCB3b3JrICovCisJCWlmICh3b3JrX3BlbmRpbmcoJmh3LT53b3JrKSkgeworCQkJLyoKKwkJCSAqIFRoZSB2aDI2NF93b3JrIGFycml2ZXMgYXQgdGhlIGxhc3Qgc2Vjb25kLAorCQkJICogZ2l2ZSBpdCBhIGNoYW5jZSB0byBoYW5kbGUgdGhlIHNjZW5hcmlvLgorCQkJICovCisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlpZiAoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9ET05FIHx8IGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfQ09ORklHX1BBUkFNKSB7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX1dPUktFUl9FTkQpOworCX0KKworCS8qIG1hcmsgaXRzZWxmIGhhcyBhbGwgSFcgcmVzb3VyY2UgcmVsZWFzZWQgYW5kIGlucHV0IHJlbGVhc2VkICovCisJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCWlmIChody0+bW11X2VuYWJsZSA9PSAwKQorCQkJdmRlY19jb3JlX2ZpbmlzaF9ydW4odmRlYywgQ09SRV9NQVNLX1ZERUNfMSk7CisJCWVsc2UKKwkJCXZkZWNfY29yZV9maW5pc2hfcnVuKHZkZWMsIENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQyk7CisJfSBlbHNlCisJCXZkZWNfY29yZV9maW5pc2hfcnVuKHZkZWMsIENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQyk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmh3LT53YWl0X3EpOworCisJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisKKwkJaWYgKGN0eC0+cGFyYW1fc2V0c19mcm9tX3Vjb2RlICYmCisJCQkhaHctPnY0bF9wYXJhbXNfcGFyc2VkKQorCQkJdmRlY192NGxfd3JpdGVfZnJhbWVfc3luYyhjdHgpOworCX0KKworCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy1jaHVua19zaXplIiwgMCk7CisKKwlpZiAoaHctPnZkZWNfY2IpCisJCWh3LT52ZGVjX2NiKGh3X3RvX3ZkZWMoaHcpLCBody0+dmRlY19jYl9hcmcpOworfQorCisKK3N0YXRpYyB2b2lkIHZoMjY0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcgPSBjb250YWluZXJfb2Yod29yaywKKwkJc3RydWN0IHZkZWNfaDI2NF9od19zLCB3b3JrKTsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisKKwl2aDI2NF93b3JrX2ltcGxlbWVudChodywgdmRlYywgMCk7Cit9CisKKworc3RhdGljIHZvaWQgdmgyNjRfdGltZW91dF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0gY29udGFpbmVyX29mKHdvcmssCisJCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcywgdGltZW91dF93b3JrKTsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisKKwlpZiAod29ya19wZW5kaW5nKCZody0+d29yaykpCisJCXJldHVybjsKKworCWh3LT50aW1lb3V0X3Byb2Nlc3NpbmcgPSAxOworCXZoMjY0X3dvcmtfaW1wbGVtZW50KGh3LCB2ZGVjLCAxKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcnVuX3JlYWR5KHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKwlib29sIHJldCA9IDA7CisJc3RydWN0IHZkZWNfaDI2NF9od19zICpodyA9CisJCShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKil2ZGVjLT5wcml2YXRlOworCWludCB0dnAgPSB2ZGVjX3NlY3VyZShod190b192ZGVjKGh3KSkgPworCQlDT0RFQ19NTV9GTEFHU19UVlAgOiAwOworCisJaWYgKGh3LT50aW1lb3V0X3Byb2Nlc3NpbmcgJiYKKwkgICAgKHdvcmtfcGVuZGluZygmaHctPndvcmspIHx8IHdvcmtfYnVzeSgmaHctPndvcmspIHx8CisJICAgIHdvcmtfcGVuZGluZygmaHctPnRpbWVvdXRfd29yaykgfHwgd29ya19idXN5KCZody0+dGltZW91dF93b3JrKSkpIHsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsCisJCQkgICJoMjY0IHdvcmsgcGVuZGluZywgbm90IHJlYWR5IGZvciBydW4uXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWh3LT50aW1lb3V0X3Byb2Nlc3NpbmcgPSAwOworCWlmICghaHctPmZpcnN0X3NjX2NoZWNrZWQgJiYgaHctPm1tdV9lbmFibGUpIHsKKwkJaW50IHNpemUgPSBkZWNvZGVyX21tdV9ib3hfc2NfY2hlY2soaHctPm1tdV9ib3gsIHR2cCk7CisJCWh3LT5maXJzdF9zY19jaGVja2VkID0xOworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSJ2bWgyNjQgY2FjaGVkPSVkICBuZWVkX3NpemU9JWQgc3BlZWQ9ICVkIG1zXG4iLAorCQkJc2l6ZSwgKGh3LT5uZWVkX2NhY2hlX3NpemUgPj4gUEFHRV9TSElGVCksCisJCQkoaW50KShnZXRfamlmZmllc182NCgpIC0gaHctPnNjX3N0YXJ0X3RpbWUpICogMTAwMC9IWik7CisJfQorCisJaWYgKHZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpICYmIChody0+aW5pdF9mbGFnID09IDApCisJCSYmIHByZV9kZWNvZGVfYnVmX2xldmVsICE9IDApIHsKKwkJdTMyIHJwLCB3cCwgbGV2ZWw7CisKKwkJcnAgPSBTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfcnApOworCQl3cCA9IFNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCk7CisJCWlmICh3cCA8IHJwKQorCQkJbGV2ZWwgPSB2ZGVjLT5pbnB1dC5zaXplICsgd3AgLSBycDsKKwkJZWxzZQorCQkJbGV2ZWwgPSB3cCAtIHJwOworCisJCWlmIChsZXZlbCA8IHByZV9kZWNvZGVfYnVmX2xldmVsKQorCQkJcmV0dXJuIDA7CisJfQorCisjaWZuZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJaWYgKHZkZWMtPm1hc3RlcikKKwkJcmV0dXJuIDA7CisjZW5kaWYKKwlpZiAoaHctPmVvcykKKwkJcmV0dXJuIDA7CisKKwlpZiAoaHctPnN0YXQgJiBERUNPREVSX0ZBVEFMX0VSUk9SX05PX01FTSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZGlzcF92ZnJhbWVfdmFsdmVfbGV2ZWwgJiYKKwkJa2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKSA+PQorCQlkaXNwX3ZmcmFtZV92YWx2ZV9sZXZlbCkgeworCQlody0+dmFsdmVfY291bnQtLTsKKwkJaWYgKGh3LT52YWx2ZV9jb3VudCA8PSAwKQorCQkJaHctPnZhbHZlX2NvdW50ID0gMjsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfQorCWlmIChody0+bmV4dF9hZ2Fpbl9mbGFnICYmCisJCSghdmRlY19mcmFtZV9iYXNlZCh2ZGVjKSkpIHsKKwkJdTMyIHBhcnNlcl93cl9wdHIgPSBTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApOworCQlpZiAocGFyc2VyX3dyX3B0ciA+PSBody0+cHJlX3BhcnNlcl93cl9wdHIgJiYKKwkJCShwYXJzZXJfd3JfcHRyIC0gaHctPnByZV9wYXJzZXJfd3JfcHRyKSA8CisJCQlhZ2Fpbl90aHJlc2hvbGQpIHsKKwkJCWludCByID0gdmRlY19zeW5jX2lucHV0KHZkZWMpOworCQkJCWRwYl9wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1ZERUNfREVUQUlMLAorCQkJCQkiJXMgYnVmIGxlbHZlbDoleFxuIiwgIF9fZnVuY19fLCByKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKGgyNjRfZGVidWdfZmxhZyAmIDB4MjAwMDAwMDApIHsKKwkJLyogcHJfaW5mbygiJXMsIGFcbiIsIF9fZnVuY19fKTsgKi8KKwkJcmV0ID0gMTsKKwl9IGVsc2UKKwkJcmV0ID0gaXNfYnVmZmVyX2F2YWlsYWJsZSh2ZGVjKTsKKworI2lmZGVmIENPTlNUUkFJTl9NQVhfQlVGX05VTQorCWlmIChyZXQgJiYgKGh3LT5kcGIubURQQi5zaXplID4gMCkpIHsgLyptYWtlIHN1cmUgaW5pdGlsaXplZCovCisJCWlmIChydW5fcmVhZHlfbWF4X3ZmX29ubHlfbnVtID4gMCAmJgorCQkJZ2V0X3ZmX3JlZl9vbmx5X2J1Zl9jb3VudChodykgPj0KKwkJCXJ1bl9yZWFkeV9tYXhfdmZfb25seV9udW0KKwkJCSkKKwkJCXJldCA9IDA7CisJCWlmIChydW5fcmVhZHlfZGlzcGxheV9xX251bSA+IDAgJiYKKwkJCWtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSkgPj0KKwkJCXJ1bl9yZWFkeV9kaXNwbGF5X3FfbnVtKQorCQkJcmV0ID0gMDsKKwkJLyphdm9pZCBtb3JlIGJ1ZmZlcnMgY29uc3VtZWQgd2hlbgorCQlzd2l0Y2hpbmcgcmVzb2x1dGlvbiovCisJCWlmIChydW5fcmVhZHlfbWF4X2J1Zl9udW0gPT0gMHhmZiAmJgorCQkJZ2V0X3VzZWRfYnVmX2NvdW50KGh3KSA+CisJCQlody0+ZHBiLm1EUEIuc2l6ZSkKKwkJCXJldCA9IDA7CisJCWVsc2UgaWYgKHJ1bl9yZWFkeV9tYXhfYnVmX251bSAmJgorCQkJZ2V0X3VzZWRfYnVmX2NvdW50KGh3KSA+PQorCQkJcnVuX3JlYWR5X21heF9idWZfbnVtKQorCQkJcmV0ID0gMDsKKwkJaWYgKHJldCA9PSAwKQorCQkJYnVmbWdyX2gyNjRfcmVtb3ZlX3VudXNlZF9mcmFtZSgmaHctPmRwYiwgMCk7CisJfQorI2VuZGlmCisJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisKKwkJaWYgKGN0eC0+cGFyYW1fc2V0c19mcm9tX3Vjb2RlKSB7CisJCQlpZiAoaHctPnY0bF9wYXJhbXNfcGFyc2VkKSB7CisJCQkJaWYgKGN0eC0+Y2FwX3Bvb2wuZGVjIDwgaHctPmRwYi5tRFBCLnNpemUpIHsKKwkJCQkJaWYgKGlzX2J1ZmZlcl9hdmFpbGFibGUodmRlYykpCisJCQkJCQlyZXQgPSAxOworCQkJCQllbHNlCisJCQkJCQlyZXQgPSAwOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGN0eC0+djRsX3Jlc29sdXRpb25fY2hhbmdlKQorCQkJCQlyZXQgPSAwOworCQkJfQorCQl9IGVsc2UgaWYgKCFjdHgtPnY0bF9jb2RlY19kcGJfcmVhZHkpIHsKKwkJCWlmICh2NGwyX20ybV9udW1fZHN0X2J1ZnNfcmVhZHkoY3R4LT5tMm1fY3R4KSA8CisJCQkJcnVuX3JlYWR5X21pbl9idWZfbnVtKQorCQkJCXJldCA9IDA7CisJCX0KKwl9CisKKwlpZiAocmV0KQorCQlub3RfcnVuX3JlYWR5W0RFQ09ERV9JRChodyldID0gMDsKKwllbHNlCisJCW5vdF9ydW5fcmVhZHlbREVDT0RFX0lEKGh3KV0rKzsKKwlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJaWYgKGh3LT5tbXVfZW5hYmxlID09IDApCisJCQlyZXR1cm4gcmV0ID8gKENPUkVfTUFTS19WREVDXzEpIDogMDsKKwkJZWxzZQorCQkJcmV0dXJuIHJldCA/IChDT1JFX01BU0tfVkRFQ18xIHwgQ09SRV9NQVNLX0hFVkMpIDogMDsKKwl9IGVsc2UKKwkJcmV0dXJuIHJldCA/IChDT1JFX01BU0tfVkRFQ18xIHwgQ09SRV9NQVNLX0hFVkMpIDogMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgZ2V0X2RhdGFfY2hlY2tfc3VtCisJKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcsIGludCBzaXplKQoreworCWludCBqajsKKwlpbnQgc3VtID0gMDsKKwl1OCAqZGF0YSA9IE5VTEw7CisKKwlpZiAoIWh3LT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJZGF0YSA9IGNvZGVjX21tX3ZtYXAoaHctPmNodW5rLT5ibG9jay0+c3RhcnQgKworCQkJaHctPmNodW5rLT5vZmZzZXQsIHNpemUpOworCWVsc2UKKwkJZGF0YSA9ICgodTggKilody0+Y2h1bmstPmJsb2NrLT5zdGFydF92aXJ0KQorCQkJKyBody0+Y2h1bmstPm9mZnNldDsKKworCWZvciAoamogPSAwOyBqaiA8IHNpemU7IGpqKyspCisJCXN1bSArPSBkYXRhW2pqXTsKKworCWlmICghaHctPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQljb2RlY19tbV91bm1hcF9waHlhZGRyKGRhdGEpOworCXJldHVybiBzdW07Cit9CisKK3N0YXRpYyB2b2lkIHJ1bihzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1bnNpZ25lZCBsb25nIG1hc2ssCisJdm9pZCAoKmNhbGxiYWNrKShzdHJ1Y3QgdmRlY19zICosIHZvaWQgKiksIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0KKwkJKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSAmaHctPmRwYjsKKwlpbnQgc2l6ZSwgcmV0ID0gLTE7CisJaWYgKCFody0+dmRlY19wZ19lbmFibGVfZmxhZykgeworCQlody0+dmRlY19wZ19lbmFibGVfZmxhZyA9IDE7CisJCWFtdmRlY19lbmFibGUoKTsKKwkJaWYgKGh3LT5tbXVfZW5hYmxlKQorCQkJYW1oZXZjX2VuYWJsZSgpOworCX0KKwlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9SVU5fU1RBUlQpOworCisJcnVuX2NvdW50W0RFQ09ERV9JRChodyldKys7CisJdmRlY19yZXNldF9jb3JlKHZkZWMpOworCWlmIChody0+bW11X2VuYWJsZSkKKwkJaGV2Y19yZXNldF9jb3JlKHZkZWMpOworCWh3LT52ZGVjX2NiX2FyZyA9IGFyZzsKKwlody0+dmRlY19jYiA9IGNhbGxiYWNrOworCisjaWZkZWYgREVURUNUX1dST05HX01VTFRJX1NMSUNFCisJaHctPmN1cl9waWN0dXJlX3NsaWNlX2NvdW50ID0gMDsKKyNlbmRpZgorCisJaWYgKGtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSkgPiBWRl9QT09MX1NJWkUpIHsKKwkJaHctPnJlc2V0X2J1Zm1ncl9mbGFnID0gMTsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkia2ZpZm8gbGVuOiVkIGludmFpbGQsIG5lZWQgYnVmbWdyIHJlc2V0XG4iLAorCQkJa2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKSk7CisJfQorCisJaWYgKHZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpKSB7CisJCWh3LT5wcmVfcGFyc2VyX3dyX3B0ciA9CisJCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApOworCQlody0+bmV4dF9hZ2Fpbl9mbGFnID0gMDsKKwl9CisKKwlpZiAoaHctPnJlc2V0X2J1Zm1ncl9mbGFnIHx8CisJCSgoaHctPmVycm9yX3Byb2NfcG9saWN5ICYgMHg0MCkgJiYKKwkJcF9IMjY0X0RwYi0+YnVmX2FsbG9jX2ZhaWwpKSB7CisJCWgyNjRfcmVzZXRfYnVmbWdyX3Y0bCh2ZGVjLCAxKTsKKwkJLy9mbGFnIG11c3QgY2xlYXIgYWZ0ZXIgcmVzZXQgZm9yIHY0bCBidWZfc3BlY19pbml0IHVzZQorCQlody0+cmVzZXRfYnVmbWdyX2ZsYWcgPSAwOworCX0KKworCWlmIChoMjY0X2RlYnVnX2NtZCAmIDB4ZjAwMCkgeworCQlpZiAoKChoMjY0X2RlYnVnX2NtZCA+PiAxMikgJiAweGYpCisJCQk9PSAoREVDT0RFX0lEKGh3KSArIDEpKSB7CisJCQloMjY0X3JlY29uZmlnKGh3KTsKKwkJCWgyNjRfZGVidWdfY21kICY9ICh+MHhmMDAwKTsKKwkJfQorCX0KKwkvKiBody0+Y2h1bmsgPSB2ZGVjX3ByZXBhcmVfaW5wdXQodmRlYyk7ICovCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwlpZiAodmRlYy0+c2xhdmUgfHwgdmRlYy0+bWFzdGVyKQorCQl2ZGVjX3NldF9mbGFnKHZkZWMsIFZERUNfRkxBR19TRUxGX0lOUFVUX0NPTlRFWFQpOworI2VuZGlmCisJc2l6ZSA9IHZkZWNfcHJlcGFyZV9pbnB1dCh2ZGVjLCAmaHctPmNodW5rKTsKKwlpZiAoKHNpemUgPCAwKSB8fAorCQkoaW5wdXRfZnJhbWVfYmFzZWQodmRlYykgJiYgaHctPmNodW5rID09IE5VTEwpKSB7CisJCWlucHV0X2VtcHR5W0RFQ09ERV9JRChodyldKys7CisJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WREVDX0RFVEFJTCwKKwkJCSJ2ZGVjX3ByZXBhcmVfaW5wdXQ6IEluc3VmZmljaWVudCBkYXRhXG4iKTsKKworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJcmV0dXJuOworCX0KKworCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy1jaHVua19zaXplIiwgc2l6ZSk7CisKKwlpbnB1dF9lbXB0eVtERUNPREVfSUQoaHcpXSA9IDA7CisKKwlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfTk9ORTsKKwlody0+Z2V0X2RhdGFfY291bnQgPSAwOworCWh3LT5jc2RfY2hhbmdlX2ZsYWcgPSAwOworI2lmIDAKKwlwcl9pbmZvKCJWTERfTUVNX1ZJRklGT19MRVZFTCA9IDB4JXgsIHJwID0gMHgleCwgd3AgPSAweCV4XG4iLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApKTsKKyNlbmRpZgorCisJaWYgKGlucHV0X2ZyYW1lX2Jhc2VkKHZkZWMpICYmICF2ZGVjX3NlY3VyZSh2ZGVjKSkgeworCQl1OCAqZGF0YSA9IE5VTEw7CisKKwkJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQlkYXRhID0gY29kZWNfbW1fdm1hcChody0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQkJaHctPmNodW5rLT5vZmZzZXQsIHNpemUpOworCQllbHNlCisJCQlkYXRhID0gKCh1OCAqKWh3LT5jaHVuay0+YmxvY2stPnN0YXJ0X3ZpcnQpCisJCQkJKyBody0+Y2h1bmstPm9mZnNldDsKKworCQlpZiAoZHBiX2lzX2RlYnVnKERFQ09ERV9JRChodyksCisJCQlQUklOVF9GTEFHX1ZERUNfU1RBVFVTKQorCQkJKSB7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSIlczogc2l6ZSAweCV4IHN1bSAweCV4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IC4uICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQlfX2Z1bmNfXywgc2l6ZSwgZ2V0X2RhdGFfY2hlY2tfc3VtKGh3LCBzaXplKSwKKwkJCWRhdGFbMF0sIGRhdGFbMV0sIGRhdGFbMl0sIGRhdGFbM10sCisJCQlkYXRhWzRdLCBkYXRhWzVdLCBkYXRhW3NpemUgLSA0XSwKKwkJCWRhdGFbc2l6ZSAtIDNdLAlkYXRhW3NpemUgLSAyXSwKKwkJCWRhdGFbc2l6ZSAtIDFdKTsKKwkJfQorCQlpZiAoZHBiX2lzX2RlYnVnKERFQ09ERV9JRChodyksCisJCQlQUklOVF9GUkFNRUJBU0VfREFUQSkKKwkJCSkgeworCQkJaW50IGpqOworCisJCQlmb3IgKGpqID0gMDsgamogPCBzaXplOyBqaisrKSB7CisJCQkJaWYgKChqaiAmIDB4ZikgPT0gMCkKKwkJCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJCVBSSU5UX0ZSQU1FQkFTRV9EQVRBLAorCQkJCQkJIiUwNng6IiwgamopOworCQkJCWRwYl9wcmludF9jb250KERFQ09ERV9JRChodyksCisJCQkJUFJJTlRfRlJBTUVCQVNFX0RBVEEsCisJCQkJCSIlMDJ4ICIsIGRhdGFbampdKTsKKwkJCQlpZiAoKChqaiArIDEpICYgMHhmKSA9PSAwKQorCQkJCQlkcGJfcHJpbnRfY29udChERUNPREVfSUQoaHcpLAorCQkJCQlQUklOVF9GUkFNRUJBU0VfREFUQSwKKwkJCQkJCSJcbiIpOworCQkJfQorCQl9CisKKwkJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQljb2RlY19tbV91bm1hcF9waHlhZGRyKGRhdGEpOworCX0gZWxzZQorCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCSIlczogJXggJXggJXggJXggJXggc2l6ZSAweCV4XG4iLAorCQkJX19mdW5jX18sCisJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1dQKSwKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCksCisJCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfcnApLAorCQkJU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3dwKSwKKwkJCXNpemUpOworCisJc3RhcnRfcHJvY2Vzc190aW1lKGh3KTsKKwlpZiAodmRlYy0+bWNfbG9hZGVkKSB7CisJCQkvKmZpcm13YXJlIGhhdmUgbG9hZCBiZWZvcmUsCisJCQkgIGFuZCBub3QgY2hhbmdlcyB0byBhbm90aGVyLgorCQkJICBpZ25vcmUgcmVsb2FkLgorCQkJKi8KKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0csIGh3LT5yZWdfZ19zdGF0dXMpOworCX0gZWxzZSB7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfcnVuX3RpbWVfbmFtZSwgVFJBQ0VfUlVOX0xPQURJTkdfRldfU1RBUlQpOworCQlyZXQgPSBhbXZkZWNfdmRlY19sb2FkbWNfZXgoVkZPUk1BVF9IMjY0LCAibWgyNjQiLCB2ZGVjLCBody0+ZnctPmRhdGEpOworCQlpZiAocmV0IDwgMCkgeworCQkJYW12ZGVjX2VuYWJsZV9mbGFnID0gZmFsc2U7CisJCQlhbXZkZWNfZGlzYWJsZSgpOworCQkJaHctPnZkZWNfcGdfZW5hYmxlX2ZsYWcgPSAwOworCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRVJST1IsCisJCQkJIk1IMjY0IHRoZSAlcyBmdyBsb2FkaW5nIGZhaWxlZCwgZXJyOiAleFxuIiwKKwkJCQl0ZWVfZW5hYmxlZCgpID8gIlRFRSIgOiAibG9jYWwiLCByZXQpOworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0ZPUkNFX0VYSVQ7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCXJldHVybjsKKwkJfQorCQl2ZGVjLT5tY190eXBlICA9IFZGT1JNQVRfSDI2NDsKKwkJaHctPnJlZ19nX3N0YXR1cyA9IFJFQURfVlJFRyhBVl9TQ1JBVENIX0cpOworCQlpZiAoaHctPm1tdV9lbmFibGUpIHsKKwkJCXJldCA9IGFtaGV2Y19sb2FkbWNfZXgoVkZPUk1BVF9IMjY0LCAibWgyNjRfbW11IiwKKwkJCQlody0+ZndfbW11LT5kYXRhKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJYW12ZGVjX2VuYWJsZV9mbGFnID0gZmFsc2U7CisJCQkJYW1oZXZjX2Rpc2FibGUoKTsKKwkJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19FUlJPUiwKKwkJCQkJIk1IMjY0X01NVSB0aGUgJXMgZncgbG9hZGluZyBmYWlsZWQsIGVycjogJXhcbiIsCisJCQkJCXRlZV9lbmFibGVkKCkgPyAiVEVFIiA6ICJsb2NhbCIsIHJldCk7CisJCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0ZPUkNFX0VYSVQ7CisJCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJdmRlYy0+bWNfdHlwZSA9ICgoMSA8PCAxNikgfCBWRk9STUFUX0gyNjQpOworCQl9CisJCXZkZWMtPm1jX2xvYWRlZCA9IDA7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfcnVuX3RpbWVfbmFtZSwgVFJBQ0VfUlVOX0xPQURJTkdfRldfRU5EKTsKKwl9CisJdm1oMjY0X3Jlc2V0X3Vkcl9tZ3IoaHcpOworCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfcnVuX3RpbWVfbmFtZSwgVFJBQ0VfUlVOX0xPQURJTkdfUkVTVE9SRV9TVEFSVCk7CisJaWYgKHZoMjY0X2h3X2N0eF9yZXN0b3JlKGh3KSA8IDApIHsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCXJldHVybjsKKwl9CisJaWYgKGVycm9yX3Byb2NfcG9saWN5ICYgMHgxMDAwMCkgeworCQlody0+Zmlyc3RfcHJlX2ZyYW1lX251bSA9IHBfSDI2NF9EcGItPm1WaWRlby5wcmVfZnJhbWVfbnVtOworCX0KKwlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX3J1bl90aW1lX25hbWUsIFRSQUNFX1JVTl9MT0FESU5HX1JFU1RPUkVfRU5EKTsKKwlpZiAoaW5wdXRfZnJhbWVfYmFzZWQodmRlYykpIHsKKwkJaW50IGRlY29kZV9zaXplID0gMDsKKworCQlkZWNvZGVfc2l6ZSA9IGh3LT5jaHVuay0+c2l6ZSArCisJCQkoaHctPmNodW5rLT5vZmZzZXQgJiAoVkRFQ19GSUZPX0FMSUdOIC0gMSkpOworCQlXUklURV9WUkVHKEgyNjRfREVDT0RFX0lORk8sICgxPDwxMykpOworCQlXUklURV9WUkVHKEgyNjRfREVDT0RFX1NJWkUsIGRlY29kZV9zaXplKTsKKwkJV1JJVEVfVlJFRyhWSUZGX0JJVF9DTlQsIGRlY29kZV9zaXplICogOCk7CisJCWlmICh2ZGVjLT5tdmZybSkKKwkJCXZkZWMtPm12ZnJtLT5mcmFtZV9zaXplID0gaHctPmNodW5rLT5zaXplOworCX0gZWxzZSB7CisJCWlmIChzaXplIDw9IDApCisJCQlzaXplID0gMHg3ZmZmZmZmZjsgLyplcnJvciBoYXBwZW4qLworCQlXUklURV9WUkVHKEgyNjRfREVDT0RFX0lORk8sICgxPDwxMykpOworCQlXUklURV9WUkVHKEgyNjRfREVDT0RFX1NJWkUsIHNpemUpOworCQlXUklURV9WUkVHKFZJRkZfQklUX0NOVCwgc2l6ZSAqIDgpOworCQlody0+c3RhcnRfYml0X2NudCA9IHNpemUgKiA4OworCX0KKwljb25maWdfYXV4X2J1Zihodyk7CisJY29uZmlnX2RlY29kZV9tb2RlKGh3KTsKKwl2ZGVjX2VuYWJsZV9pbnB1dCh2ZGVjKTsKKwlXUklURV9WUkVHKE5BTF9TRUFSQ0hfQ1RMLCAwKTsKKwlody0+c2VpX2RhdGFfbGVuID0gMDsKKwlpZiAoZW5hYmxlX2l0dV90MzUpCisJCVdSSVRFX1ZSRUcoTkFMX1NFQVJDSF9DVEwsIFJFQURfVlJFRyhOQUxfU0VBUkNIX0NUTCkgfCAweDEpOworCWlmICghaHctPmluaXRfZmxhZykgeworCQlpZiAoaHctPm1tdV9lbmFibGUpCisJCQlXUklURV9WUkVHKE5BTF9TRUFSQ0hfQ1RMLAorCQkJCQlSRUFEX1ZSRUcoTkFMX1NFQVJDSF9DVEwpIHwgMHgyKTsKKwkJZWxzZQorCQkJV1JJVEVfVlJFRyhOQUxfU0VBUkNIX0NUTCwKKwkJCQkJUkVBRF9WUkVHKE5BTF9TRUFSQ0hfQ1RMKSAmICh+MHgyKSk7CisJfQorCVdSSVRFX1ZSRUcoTkFMX1NFQVJDSF9DVEwsIFJFQURfVlJFRyhOQUxfU0VBUkNIX0NUTCkgfCAoMSA8PCAyKSB8IChody0+Yml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcgPDwgMTUpKTsKKworCWlmICh1ZGVidWdfZmxhZykKKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX0ssIHVkZWJ1Z19mbGFnKTsKKwlody0+c3RhdCB8PSBTVEFUX1RJTUVSX0FSTTsKKwltb2RfdGltZXIoJmh3LT5jaGVja190aW1lciwgamlmZmllcyArIENIRUNLX0lOVEVSVkFMKTsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpIHsKKworCQlpZiAoaHctPm1tdV9lbmFibGUpCisJCQlTRVRfVlJFR19NQVNLKFZERUNfQVNTSVNUX01NQ19DVFJMMSwgMSA8PCAzKTsKKwkJZWxzZQorCQkJQ0xFQVJfVlJFR19NQVNLKFZERUNfQVNTSVNUX01NQ19DVFJMMSwgMSA8PCAzKTsKKwl9CisJaWYgKHZkZWMtPm12ZnJtKQorCQl2ZGVjLT5tdmZybS0+aHdfZGVjb2RlX3N0YXJ0ID0gbG9jYWxfY2xvY2soKTsKKwlhbXZkZWNfc3RhcnQoKTsKKwlpZiAoaHctPm1tdV9lbmFibGUgLyomJiAhaHctPmZyYW1lX2J1c3kgJiYgIWh3LT5mcmFtZV9kb25lKi8pIHsKKwkJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9TQ1JBVENIXzAsIDB4MCk7CisJCWFtaGV2Y19zdGFydCgpOworCQlpZiAoaHctPmNvbmZpZ19idWZtZ3JfZG9uZSkgeworCQkJaGV2Y19tY3Jfc2FvX2dsb2JhbF9od19pbml0KGh3LAorCQkJCQkoaHctPm1iX3dpZHRoIDw8IDQpLCAoaHctPm1iX2hlaWdodCA8PCA0KSk7CisJCQloZXZjX21jcl9jb25maWdfY2FudjJheGl0YmwoaHcsIDEpOworCQl9CisJfQorCisJLyogaWYgKGh3LT5pbml0X2ZsYWcpIHsgKi8KKwkJV1JJVEVfVlJFRyhEUEJfU1RBVFVTX1JFRywgSDI2NF9BQ1RJT05fU0VBUkNIX0hFQUQpOworCS8qIH0gKi8KKworCWh3LT5pbml0X2ZsYWcgPSAxOworCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX1JVTl9FTkQpOworfQorCitzdGF0aWMgdm9pZCBjbGVhcl9yZWZlcl9idWZzKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcpCit7CisJaW50IGk7CisJdWxvbmcgZmxhZ3M7CisKKwlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZody0+YnVmc3BlY19sb2NrLCBmbGFncyk7CisJCWZvciAoaSA9IDA7IGkgPCBCVUZTUEVDX1BPT0xfU0laRTsgaSsrKSB7CisJCQlody0+YnVmZmVyX3NwZWNbaV0udXNlZCA9IC0xOworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLmNtYV9hbGxvY19hZGRyID0gMDsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS5idWZfYWRyID0gMDsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+YnVmc3BlY19sb2NrLCBmbGFncyk7CisJfQorCisJSU5JVF9LRklGTyhody0+ZGlzcGxheV9xKTsKKwlJTklUX0tGSUZPKGh3LT5uZXdmcmFtZV9xKTsKKworCWZvciAoaSA9IDA7IGkgPCBWRl9QT09MX1NJWkU7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKnZmID0gJihody0+dmZwb29sW2h3LT5jdXJfcG9vbF1baV0pOworCQlody0+dmZwb29sW2h3LT5jdXJfcG9vbF1baV0uaW5kZXggPSAtMTsgLyogVkZfQlVGX05VTTsgKi8KKwkJaHctPnZmcG9vbFtody0+Y3VyX3Bvb2xdW2ldLmJ1ZldpZHRoID0gMTkyMDsKKwkJa2ZpZm9fcHV0KCZody0+bmV3ZnJhbWVfcSwgdmYpOworCX0KK30KKworc3RhdGljIHZvaWQgcmVzZXQoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3ID0KKwkJKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisKKwlwcl9pbmZvKCJ2bWgyNjQgcmVzZXRcbiIpOworCisJY2FuY2VsX3dvcmtfc3luYygmaHctPndvcmspOworCWNhbmNlbF93b3JrX3N5bmMoJmh3LT5ub3RpZnlfd29yayk7CisJaWYgKGh3LT5zdGF0ICYgU1RBVF9WREVDX1JVTikgeworCQlhbXZkZWNfc3RvcCgpOworCQlpZiAoaHctPm1tdV9lbmFibGUpCisJCQlhbWhldmNfc3RvcCgpOworCQlody0+c3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwl9CisKKwlpZiAoaHctPnN0YXQgJiBTVEFUX1RJTUVSX0FSTSkgeworCQlkZWxfdGltZXJfc3luYygmaHctPmNoZWNrX3RpbWVyKTsKKwkJaHctPnN0YXQgJj0gflNUQVRfVElNRVJfQVJNOworCX0KKwlody0+ZW9zID0gMDsKKwlody0+ZGVjb2RlX3BpY19jb3VudCA9IDA7CisKKwlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCWgyNjRfcmVzZXRfYnVmbWdyX3Y0bCh2ZGVjLCAwKTsKKwljbGVhcl9yZWZlcl9idWZzKGh3KTsKKworCWF0b21pY19zZXQoJmh3LT52Zl9wcmVfY291bnQsIDApOworCWF0b21pY19zZXQoJmh3LT52Zl9nZXRfY291bnQsIDApOworCWF0b21pY19zZXQoJmh3LT52Zl9wdXRfY291bnQsIDApOworCisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsICIlc1xuIiwgX19mdW5jX18pOworfQorCitzdGF0aWMgdm9pZCBoMjY0X3JlY29uZmlnKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9ICZody0+ZHBiOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGh3KTsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkiJXNcbiIsIF9fZnVuY19fKTsKKwkvKiBhZnRlciBjYWxsaW5nIGZsdXNoX2RwYigpIGFuZCBidWZtZ3JfaDI2NF9yZW1vdmVfdW51c2VkX2ZyYW1lKCksCisJCWFsbCBidWZmZXJzIGFyZSBpbiBkaXNwbGF5IHF1ZXVlICh1c2VkID09IDIpLAorCQkJb3IgZnJlZSAodXNlZCA9PSAwKQorCSovCisJaWYgKGRwYl9pc19kZWJ1ZyhERUNPREVfSUQoaHcpLAorCQlQUklOVF9GTEFHX0RVTVBfQlVGU1BFQykpCisJCWR1bXBfYnVmc3BlYyhodywgInByZSBoMjY0X3JlY29uZmlnIik7CisKKwlmbHVzaF9kcGIocF9IMjY0X0RwYik7CisJYnVmbWdyX2gyNjRfcmVtb3ZlX3VudXNlZF9mcmFtZShwX0gyNjRfRHBiLCAwKTsKKworCWlmIChody0+Y29sbG9jYXRlX2NtYV9hbGxvY19hZGRyKSB7CisJCWRlY29kZXJfYm1tdV9ib3hfZnJlZV9pZHgoCisJCQlody0+Ym1tdV9ib3gsCisJCQlCTU1VX1JFRl9JRFgpOworCQlody0+Y29sbG9jYXRlX2NtYV9hbGxvY19hZGRyID0gMDsKKwkJaHctPmRwYi5jb2xvY2F0ZWRfbXZfYWRkcl9zdGFydCA9IDA7CisJCWh3LT5kcGIuY29sb2NhdGVkX212X2FkZHJfZW5kID0gMDsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5idWZzcGVjX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgQlVGU1BFQ19QT09MX1NJWkU7IGkrKykgeworCQlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJCXZkZWMtPmZyZWVfY2FudmFzX2V4KGh3LT5idWZmZXJfc3BlY1tpXS55X2NhbnZhc19pbmRleCwgdmRlYy0+aWQpOworCQkJdmRlYy0+ZnJlZV9jYW52YXNfZXgoaHctPmJ1ZmZlcl9zcGVjW2ldLnVfY2FudmFzX2luZGV4LCB2ZGVjLT5pZCk7CisJCQl2ZGVjLT5mcmVlX2NhbnZhc19leChody0+YnVmZmVyX3NwZWNbaV0udl9jYW52YXNfaW5kZXgsIHZkZWMtPmlkKTsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS55X2NhbnZhc19pbmRleCA9IC0xOworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnVfY2FudmFzX2luZGV4ID0gLTE7CisJCQlody0+YnVmZmVyX3NwZWNbaV0udl9jYW52YXNfaW5kZXggPSAtMTsKKyNpZmRlZiBWREVDX0RXCisJCQlpZiAoSVNfVkRFQ19EVyhodykpIHsKKwkJCQl2ZGVjLT5mcmVlX2NhbnZhc19leChody0+YnVmZmVyX3NwZWNbaV0udmRlY19kd195X2NhbnZhc19pbmRleCwgdmRlYy0+aWQpOworCQkJCXZkZWMtPmZyZWVfY2FudmFzX2V4KGh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X3VfY2FudmFzX2luZGV4LCB2ZGVjLT5pZCk7CisJCQkJdmRlYy0+ZnJlZV9jYW52YXNfZXgoaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfdl9jYW52YXNfaW5kZXgsIHZkZWMtPmlkKTsKKwkJCQlody0+YnVmZmVyX3NwZWNbaV0udmRlY19kd195X2NhbnZhc19pbmRleCA9IC0xOworCQkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X3VfY2FudmFzX2luZGV4ID0gLTE7CisJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfdl9jYW52YXNfaW5kZXggPSAtMTsKKyNlbmRpZgorCQkJfQorCQl9CisJCS8qbWFrZSBzdXJlIGJ1ZmZlcnMgbm90IHB1dCBiYWNrIHRvIGJ1Zm1nciB3aGVuCisJCQl2Zl9wdXQgaXMgY2FsbGVkKi8KKwkJaWYgKGh3LT5idWZmZXJfc3BlY1tpXS51c2VkID09IDIpCisJCQlody0+YnVmZmVyX3NwZWNbaV0udXNlZCA9IDM7CisKKwkJLyogcmVhZHkgdG8gcmVsZWFzZSAiZnJlZSBidWZmZXJzIgorCQkqLworCQlpZiAoaHctPmJ1ZmZlcl9zcGVjW2ldLnVzZWQgPT0gMCkKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS51c2VkID0gNDsKKworCQlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX3BvcyA9IC0xOworCisJCWlmIChody0+YnVmZmVyX3NwZWNbaV0udXNlZCA9PSA0ICYmCisJCQlody0+YnVmZmVyX3NwZWNbaV0udmZfcmVmICE9IDAgJiYKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS5jbWFfYWxsb2NfYWRkcikgeworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnVzZWQgPSAzOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5idWZzcGVjX2xvY2ssIGZsYWdzKTsKKwlody0+aGFzX2lfZnJhbWUgPSAwOworCWh3LT5jb25maWdfYnVmbWdyX2RvbmUgPSAwOworCisJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQltdXRleF9sb2NrKCZ2bWgyNjRfbXV0ZXgpOworCQlkZWFsbG9jX2J1Zl9zcGVjcyhodywgMSk7CisJCW11dGV4X3VubG9jaygmdm1oMjY0X211dGV4KTsKKwl9CisKKwlpZiAoZHBiX2lzX2RlYnVnKERFQ09ERV9JRChodyksCisJCVBSSU5UX0ZMQUdfRFVNUF9CVUZTUEVDKSkKKwkJZHVtcF9idWZzcGVjKGh3LCAiYWZ0ZXIgaDI2NF9yZWNvbmZpZyIpOworfQorCisjaWZkZWYgRVJST1JfSEFORExFX1RFU1QKK3N0YXRpYyB2b2lkIGgyNjRfY2xlYXJfZHBiKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcpCit7CisJaW50IGk7CisJc3RydWN0IGgyNjRfZHBiX3N0cnUgKnBfSDI2NF9EcGIgPSAmaHctPmRwYjsKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJIiVzXG4iLCBfX2Z1bmNfXyk7CisJcmVtb3ZlX2RwYl9waWN0dXJlcyhwX0gyNjRfRHBiKTsKKwlmb3IgKGkgPSAwOyBpIDwgQlVGU1BFQ19QT09MX1NJWkU7IGkrKykgeworCQkvKm1ha2Ugc3VyZSBidWZmZXJzIG5vdCBwdXQgYmFjayB0byBidWZtZ3Igd2hlbgorCQkJdmZfcHV0IGlzIGNhbGxlZCovCisJCWlmIChody0+YnVmZmVyX3NwZWNbaV0udXNlZCA9PSAyKQorCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnVzZWQgPSA1OworCX0KKworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGgyNjRfcmVzZXRfYnVmbWdyX3Y0bChzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgZmx1c2hfZmxhZykKK3sKKwl1bG9uZyB0aW1lb3V0OworCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcgPSAoc3RydWN0IHZkZWNfaDI2NF9od19zICopdmRlYy0+cHJpdmF0ZTsKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9ICZody0+ZHBiOworI2lmIDAKKwlzdHJ1Y3QgaDI2NF9kcGJfc3RydSAqcF9IMjY0X0RwYiA9ICZody0+ZHBiOworCWludCBhY3R1YWxfZHBiX3NpemUsIG1heF9yZWZlcmVuY2Vfc2l6ZTsKKwlpbnQgcmVvcmRlcl9waWNfbnVtOworCXVuc2lnbmVkIGludCBjb2xvY2F0ZWRfYnVmX3NpemU7CisJdW5zaWduZWQgaW50IGNvbG9jYXRlZF9tdl9hZGRyX3N0YXJ0OworCXVuc2lnbmVkIGludCBjb2xvY2F0ZWRfbXZfYWRkcl9lbmQ7CisJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVkZfUE9PTF9TSVpFOyBpKyspCisJCWh3LT52ZnBvb2xbaHctPmN1cl9wb29sXVtpXS5pbmRleCA9IC0xOyAvKiBWRl9CVUZfTlVNOyAqLworCisJYWN0dWFsX2RwYl9zaXplID0gcF9IMjY0X0RwYi0+bURQQi5zaXplOworCW1heF9yZWZlcmVuY2Vfc2l6ZSA9IHBfSDI2NF9EcGItPm1heF9yZWZlcmVuY2Vfc2l6ZTsKKwlyZW9yZGVyX3BpY19udW0gPSBwX0gyNjRfRHBiLT5yZW9yZGVyX3BpY19udW07CisKKwljb2xvY2F0ZWRfYnVmX3NpemUgPSBwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfYnVmX3NpemU7CisJY29sb2NhdGVkX212X2FkZHJfc3RhcnQgPSBwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfbXZfYWRkcl9zdGFydDsKKwljb2xvY2F0ZWRfbXZfYWRkcl9lbmQgID0gcF9IMjY0X0RwYi0+Y29sb2NhdGVkX212X2FkZHJfZW5kOworCisJaHctPmN1cl9wb29sKys7CisJaWYgKGh3LT5jdXJfcG9vbCA+PSBWRl9QT09MX05VTSkKKwkJaHctPmN1cl9wb29sID0gMDsKKworCUlOSVRfS0ZJRk8oaHctPmRpc3BsYXlfcSk7CisJSU5JVF9LRklGTyhody0+bmV3ZnJhbWVfcSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVkZfUE9PTF9TSVpFOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IHZmcmFtZV9zICp2ZiA9ICYoaHctPnZmcG9vbFtody0+Y3VyX3Bvb2xdW2ldKTsKKwkJaHctPnZmcG9vbFtody0+Y3VyX3Bvb2xdW2ldLmluZGV4ID0gLTE7IC8qIFZGX0JVRl9OVU07ICovCisJCWh3LT52ZnBvb2xbaHctPmN1cl9wb29sXVtpXS5idWZXaWR0aCA9IDE5MjA7CisJCWtmaWZvX3B1dCgmaHctPm5ld2ZyYW1lX3EsIHZmKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQlVGU1BFQ19QT09MX1NJWkU7IGkrKykKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLnVzZWQgPSAwOworCisJZHBiX2luaXRfZ2xvYmFsKCZody0+ZHBiLAorCQlERUNPREVfSUQoaHcpLCAwLCAwKTsKKwlwX0gyNjRfRHBiLT5tRFBCLnNpemUgPSBhY3R1YWxfZHBiX3NpemU7CisJcF9IMjY0X0RwYi0+bWF4X3JlZmVyZW5jZV9zaXplID0gbWF4X3JlZmVyZW5jZV9zaXplOworCXBfSDI2NF9EcGItPnJlb3JkZXJfcGljX251bSA9IHJlb3JkZXJfcGljX251bTsKKworCXBfSDI2NF9EcGItPmNvbG9jYXRlZF9idWZfc2l6ZSA9IGNvbG9jYXRlZF9idWZfc2l6ZTsKKwlwX0gyNjRfRHBiLT5jb2xvY2F0ZWRfbXZfYWRkcl9zdGFydCA9IGNvbG9jYXRlZF9tdl9hZGRyX3N0YXJ0OworCXBfSDI2NF9EcGItPmNvbG9jYXRlZF9tdl9hZGRyX2VuZCAgPSBjb2xvY2F0ZWRfbXZfYWRkcl9lbmQ7CisKKwlwX0gyNjRfRHBiLT5mYXN0X291dHB1dF9lbmFibGUgPSBmYXN0X291dHB1dF9lbmFibGU7CisJaHctPmhhc19pX2ZyYW1lID0gMDsKKyNlbHNlCisJbXV0ZXhfbG9jaygmcmVzZXRfbXV0ZXgpOworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCSIlcyBmcmFtZSBjb3VudCAlZCB0byBza2lwICVkXG5cbiIsCisJX19mdW5jX18sIGh3LT5kZWNvZGVfcGljX2NvdW50KzEsCisJaHctPnNraXBfZnJhbWVfY291bnQpOworCisJLyogSWYgdGhlIGNhbGxlciBpcyBmcm9tIHJlc2V0LCB0aGVuIHdlIGRvbid0IGNhbGwgZmx1c2hfZGJwICovCisJaWYgKGZsdXNoX2ZsYWcpCisJCWZsdXNoX2RwYigmaHctPmRwYik7CisKKwlpZiAoIWh3LT5pc191c2VkX3Y0bCkgeworCQl0aW1lb3V0ID0gamlmZmllcyArIEhaOworCQl3aGlsZSAoa2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKSA+IDApIHsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJCWJyZWFrOworCQkJc2NoZWR1bGUoKTsKKwkJfQorCX0KKworCWJ1Zl9zcGVjX2luaXQoaHcsIHRydWUpOworCisJdmgyNjRfbG9jYWxfaW5pdChodywgdHJ1ZSk7CisJLypody0+ZGVjb2RlX3BpY19jb3VudCA9IDA7CisJaHctPnNlcV9pbmZvMiA9IDA7Ki8KKworCWlmICh2aDI2NF9zZXRfcGFyYW1zKGh3LAorCQlody0+Y2ZnX3BhcmFtMSwKKwkJaHctPmNmZ19wYXJhbTIsCisJCWh3LT5jZmdfcGFyYW0zLAorCQlody0+Y2ZnX3BhcmFtNCwgaHctPnJlc2V0X2J1Zm1ncl9mbGFnKSA8IDApCisJCWh3LT5zdGF0IHw9IERFQ09ERVJfRkFUQUxfRVJST1JfU0laRV9PVkVSRkxPVzsKKwllbHNlCisJCWh3LT5zdGF0ICY9ICh+REVDT0RFUl9GQVRBTF9FUlJPUl9TSVpFX09WRVJGTE9XKTsKKworCS8qZHJvcCAzIGZyYW1lcyBhZnRlciByZXNldCBidWZtZ3IgaWYgYml0MCBpcyBzZXQgMSAqLworCWlmIChmaXJzdF9pX3BvbGljeSAmIDB4MDEpCisJCWh3LT5maXJzdF9pX3BvbGljeSA9ICgzIDw8IDgpIHwgZmlyc3RfaV9wb2xpY3k7CisKKwlwX0gyNjRfRHBiLT5maXJzdF9pbnNlcnRfZnJhbWUgPSBGaXJzdEluc2VydEZybV9SRVNFVDsKKworCWlmIChody0+c3RhdCAmIERFQ09ERVJfRkFUQUxfRVJST1JfU0laRV9PVkVSRkxPVykKKwkJaHctPmluaXRfZmxhZyA9IDA7CisJZWxzZQorCQlody0+aW5pdF9mbGFnID0gMTsKKworCWh3LT5yZXNldF9idWZtZ3JfY291bnQrKzsKKwltdXRleF91bmxvY2soJnJlc2V0X211dGV4KTsKKyNlbmRpZgorfQorCitpbnQgYW1tdmRlY19oMjY0X21tdV9pbml0KHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcpCit7CisJaW50IHJldCA9IC0xOworCWludCB0dnBfZmxhZyA9IHZkZWNfc2VjdXJlKGh3X3RvX3ZkZWMoaHcpKSA/CisJCUNPREVDX01NX0ZMQUdTX1RWUCA6IDA7CisJaW50IGJ1Zl9zaXplID0gNjQ7CisKKwlwcl9kZWJ1ZygiYW1tdmRlY19oMjY0X21tdV9pbml0IHR2cCA9IDB4JXggbW11X2VuYWJsZSAlZFxuIiwKKwkJCXR2cF9mbGFnLCBody0+bW11X2VuYWJsZSk7CisJaHctPm5lZWRfY2FjaGVfc2l6ZSA9IGJ1Zl9zaXplICogU1pfMU07CisJaHctPnNjX3N0YXJ0X3RpbWUgPSBnZXRfamlmZmllc182NCgpOworCWlmIChody0+bW11X2VuYWJsZSAmJiAhaHctPm1tdV9ib3gpIHsKKwkJaHctPm1tdV9ib3ggPSBkZWNvZGVyX21tdV9ib3hfYWxsb2NfYm94KERSSVZFUl9OQU1FLAorCQkJCWh3LT5pZCwKKwkJCQlNTVVfTUFYX0JVRkZFUlMsCisJCQkJaHctPm5lZWRfY2FjaGVfc2l6ZSwKKwkJCQl0dnBfZmxhZyk7CisJCWlmICghaHctPm1tdV9ib3gpIHsKKwkJCXByX2VycigiaDI2NCA0ayBhbGxvYyBtbXUgYm94IGZhaWxlZCEhXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlyZXQgPSAwOworCX0KKwlpZiAoIWh3LT5ibW11X2JveCkgeworCQlody0+Ym1tdV9ib3ggPSBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2JveCgKKwkJCURSSVZFUl9OQU1FLAorCQkJaHctPmlkLAorCQkJQk1NVV9NQVhfQlVGRkVSUywKKwkJCTQgKyBQQUdFX1NISUZULAorCQkJQ09ERUNfTU1fRkxBR1NfQ01BX0NMRUFSIHwKKwkJCUNPREVDX01NX0ZMQUdTX0ZPUl9WREVDT0RFUiB8CisJCQl0dnBfZmxhZyk7CisJCWlmIChody0+Ym1tdV9ib3gpCisJCQlyZXQgPSAwOworCX0KKwlyZXR1cm4gcmV0OworfQoraW50IGFtbXZkZWNfaDI2NF9tbXVfcmVsZWFzZShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3KQoreworCWlmIChody0+bW11X2JveCkgeworCQlkZWNvZGVyX21tdV9ib3hfZnJlZShody0+bW11X2JveCk7CisJCWh3LT5tbXVfYm94ID0gTlVMTDsKKwl9CisJaWYgKGh3LT5ibW11X2JveCkgeworCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWUoaHctPmJtbXVfYm94KTsKKwkJaHctPmJtbXVfYm94ID0gTlVMTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1tdmRlY19oMjY0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHZkZWNfcyAqcGRhdGEgPSAqKHN0cnVjdCB2ZGVjX3MgKiopcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHZkZWNfaDI2NF9od19zICpodyA9IE5VTEw7CisJY2hhciAqdG1wYnVmOworCWludCBjb25maWdfdmFsOworCisJaWYgKHBkYXRhID09IE5VTEwpIHsKKwkJcHJfaW5mbygiXG5hbW12ZGVjX2gyNjQgbWVtb3J5IHJlc291cmNlIHVuZGVmaW5lZC5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlodyA9IChzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKiloMjY0X2FsbG9jX2h3X3N0cnUoJnBkZXYtPmRldiwKKwkJc2l6ZW9mKHN0cnVjdCB2ZGVjX2gyNjRfaHdfcyksIEdGUF9LRVJORUwpOworCWlmIChodyA9PSBOVUxMKSB7CisJCXByX2luZm8oIlxuYW1tdmRlY19oMjY0IGRldmljZSBkYXRhIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWh3LT5pZCA9IHBkZXYtPmlkOworCWh3LT5wbGF0Zm9ybV9kZXYgPSBwZGV2OworCisJc25wcmludGYoaHctPnRyYWNlLnZkZWNfbmFtZSwgc2l6ZW9mKGh3LT50cmFjZS52ZGVjX25hbWUpLAorCQkiaDI2NC0lZCIsIGh3LT5pZCk7CisJc25wcmludGYoaHctPnRyYWNlLnB0c19uYW1lLCBzaXplb2YoaHctPnRyYWNlLnB0c19uYW1lKSwKKwkJIiVzLXRpbWVzdGFtcCIsIGh3LT50cmFjZS52ZGVjX25hbWUpOworCXNucHJpbnRmKGh3LT50cmFjZS5uZXdfcV9uYW1lLCBzaXplb2YoaHctPnRyYWNlLm5ld19xX25hbWUpLAorCQkiJXMtbmV3ZnJhbWVfcSIsIGh3LT50cmFjZS52ZGVjX25hbWUpOworCXNucHJpbnRmKGh3LT50cmFjZS5kaXNwX3FfbmFtZSwgc2l6ZW9mKGh3LT50cmFjZS5kaXNwX3FfbmFtZSksCisJCSIlcy1kaXNwZnJhbWVfcSIsIGh3LT50cmFjZS52ZGVjX25hbWUpOworCXNucHJpbnRmKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBzaXplb2YoaHctPnRyYWNlLmRlY29kZV90aW1lX25hbWUpLAorCQkiZGVjb2Rlcl90aW1lJWQiLCBwZGV2LT5pZCk7CisJc25wcmludGYoaHctPnRyYWNlLmRlY29kZV9ydW5fdGltZV9uYW1lLCBzaXplb2YoaHctPnRyYWNlLmRlY29kZV9ydW5fdGltZV9uYW1lKSwKKwkJImRlY29kZXJfcnVuX3RpbWUlZCIsIHBkZXYtPmlkKTsKKwlzbnByaW50Zihody0+dHJhY2UuZGVjb2RlX2hlYWRlcl90aW1lX25hbWUsIHNpemVvZihody0+dHJhY2UuZGVjb2RlX2hlYWRlcl90aW1lX25hbWUpLAorCQkiZGVjb2Rlcl9oZWFkZXJfdGltZSVkIiwgcGRldi0+aWQpOworCXNucHJpbnRmKGh3LT50cmFjZS5kZWNvZGVfd29ya190aW1lX25hbWUsIHNpemVvZihody0+dHJhY2UuZGVjb2RlX3dvcmtfdGltZV9uYW1lKSwKKwkJImRlY29kZXJfd29ya190aW1lJWQiLCBwZGV2LT5pZCk7CisKKwkvKiB0aGUgY3R4IGZyb20gdjRsMiBkcml2ZXIuICovCisJaHctPnY0bDJfY3R4ID0gcGRhdGEtPnByaXZhdGU7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwZGF0YSk7CisKKwlody0+bW11X2VuYWJsZSA9IDA7CisJaHctPmZpcnN0X2hlYWRfY2hlY2tfZmxhZyA9IDA7CisKKwlpZiAocGRhdGEtPnN5c19pbmZvKQorCQlody0+dmgyNjRfYW1zdHJlYW1fZGVjX2luZm8gPSAqcGRhdGEtPnN5c19pbmZvOworCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDUpCisJCWZvcmNlX2VuYWJsZV9tbXUgPSAxOworCisJaWYgKGZvcmNlX2VuYWJsZV9tbXUgJiYgcGRhdGEtPnN5c19pbmZvICYmCisJCSAgICAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UWExYKSAmJgorCQkgICAgKGdldF9jcHVfbWFqb3JfaWQoKSAhPSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hMWCkgJiYKKwkJCShwZGF0YS0+c3lzX2luZm8tPmhlaWdodCAqIHBkYXRhLT5zeXNfaW5mby0+d2lkdGgKKwkJCT4gMTkyMCAqIDEwODgpKQorCQkJaHctPm1tdV9lbmFibGUgPSAxOworCisJaWYgKGh3LT5tbXVfZW5hYmxlICYmCisJCShwZGF0YS0+ZnJhbWVfYmFzZV92aWRlb19wYXRoID09IEZSQU1FX0JBU0VfUEFUSF9JT05WSURFTykpIHsKKwkJaHctPm1tdV9lbmFibGUgPSAwOworCQlwcl9pbmZvKCJpb252aWRlbyBuZWVkcyBkaXNhYmxlIG1tdSwgcGF0aD0gJWQgXG4iLAorCQkJCXBkYXRhLT5mcmFtZV9iYXNlX3ZpZGVvX3BhdGgpOworCX0KKworCWlmIChhbW12ZGVjX2gyNjRfbW11X2luaXQoaHcpKSB7CisJCWgyNjRfZnJlZV9od19zdHJ1KCZwZGV2LT5kZXYsICh2b2lkICopaHcpOworCQlwcl9pbmZvKCJcbmFtbXZkZWNfaDI2NCBtbXUgYWxsb2MgZmFpbGVkIVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChwZGF0YS0+Y29uZmlnX2xlbikgeworCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwgInBkYXRhLT5jb25maWc9JXNcbiIsIHBkYXRhLT5jb25maWcpOworCQkvKnVzZSBwdHIgY29uZmlnIGZvciBkb3ViZWxfd3JpdGVfbW9kZSwgZXRjKi8KKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkibWgyNjRfZG91YmxlX3dyaXRlX21vZGUiLCAmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWh3LT5kb3VibGVfd3JpdGVfbW9kZSA9IGNvbmZpZ192YWw7CisJCWVsc2UKKwkJCWh3LT5kb3VibGVfd3JpdGVfbW9kZSA9IGRvdWJsZV93cml0ZV9tb2RlOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLAorCQkJInBhcm1fdjRsX2NvZGVjX2VuYWJsZSIsCisJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWh3LT5pc191c2VkX3Y0bCA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV92NGxfYnVmZmVyX21hcmdpbiIsCisJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWh3LT5yZW9yZGVyX2RwYl9zaXplX21hcmdpbiA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV92NGxfY2FudmFzX21lbV9tb2RlIiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJaHctPmNhbnZhc19tb2RlID0gY29uZmlnX3ZhbDsKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV92NGxfbG93X2xhdGVuY3lfbW9kZSIsCisJCQkmY29uZmlnX3ZhbCkgPT0gMCkgeworCQkJaHctPmxvd19sYXRlbmN5X21vZGUgPSAoY29uZmlnX3ZhbCAmIDEpID8gMHg4OjA7CisJCQlody0+ZW5hYmxlX2ZlbmNlID0gKGNvbmZpZ192YWwgJiAyKSA/IDEgOiAwOworCQl9CisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAic2lkZWJpbmRfdHlwZSIsCisJCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+c2lkZWJpbmRfdHlwZSA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJzaWRlYmluZF9jaGFubmVsX2lkIiwKKwkJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWh3LT5zaWRlYmluZF9jaGFubmVsX2lkID0gY29uZmlnX3ZhbDsKKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywKKwkJCSJwYXJtX2VuYWJsZV9mZW5jZSIsCisJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWh3LT5lbmFibGVfZmVuY2UgPSBjb25maWdfdmFsOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLAorCQkJInBhcm1fZmVuY2VfdXNhZ2UiLAorCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+ZmVuY2VfdXNhZ2UgPSBjb25maWdfdmFsOworCisJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLAorCQkJCSJwYXJtX3Y0bF9tZXRhZGF0YV9jb25maWdfZmxhZyIsCisJCQkJJmNvbmZpZ192YWwpID09IDApIHsKKwkJCQlody0+bWV0YWRhdGFfY29uZmlnX2ZsYWcgPSBjb25maWdfdmFsOworCQkJCWh3LT5kaXNjYXJkX2R2X2RhdGEgPSBody0+bWV0YWRhdGFfY29uZmlnX2ZsYWcgJiBWREVDX0NGR19GTEFHX0RWX05FR0FUSVZFOworCQkJCWlmIChjb25maWdfdmFsICYgVkRFQ19DRkdfRkxBR19ESVNfRVJSX1BPTElDWSkgeworCQkJCQlody0+ZXJyb3JfcHJvY19wb2xpY3kgPSB2NGxfZXJyb3JfcG9saWN5OyAvL2RlZmF1bHQKKwkJCQl9IGVsc2UgeworCQkJCQlody0+ZXJyb3JfcHJvY19wb2xpY3kgPSBlcnJvcl9wcm9jX3BvbGljeTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWh3LT5kaXNjYXJkX2R2X2RhdGEgPSAxOyAvL2RlZmF1bHQKKwkJCQlody0+ZXJyb3JfcHJvY19wb2xpY3kgPSBlcnJvcl9wcm9jX3BvbGljeTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLAorCQkJCSJuZWdhdGl2ZV9kdiIsCisJCQkJJmNvbmZpZ192YWwpID09IDApIHsKKwkJCQlody0+ZGlzY2FyZF9kdl9kYXRhID0gY29uZmlnX3ZhbDsKKwkJCX0gZWxzZSB7CisJCQkJaHctPmRpc2NhcmRfZHZfZGF0YSA9IDE7IC8vZGVmYXVsdAorCQkJfQorCQl9CisJCS8qaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV92NGxfZHVyYXRpb24iLAorCQkJJmNvbmZpZ192YWwpID09IDApCisJCQl2ZGVjX2ZyYW1lX3JhdGVfdWV2ZW50KGNvbmZpZ192YWwpOyovCisJCWlmIChody0+ZGlzY2FyZF9kdl9kYXRhKQorCQkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsICJkaXNjYXJkIGR2IGRhdGFcbiIpOworCX0gZWxzZQorCQlody0+ZG91YmxlX3dyaXRlX21vZGUgPSBkb3VibGVfd3JpdGVfbW9kZTsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1KQorCQlody0+ZG91YmxlX3dyaXRlX21vZGUgPSAzOworCisJaWYgKGZvcmNlX2NvbmZpZ19mZW5jZSkgeworCQlody0+ZW5hYmxlX2ZlbmNlID0gdHJ1ZTsKKwkJaHctPmZlbmNlX3VzYWdlID0gKGZvcmNlX2NvbmZpZ19mZW5jZSA+PiA0KSAmIDB4ZjsKKwkJaWYgKGZvcmNlX2NvbmZpZ19mZW5jZSAmIDB4MikKKwkJCWh3LT5lbmFibGVfZmVuY2UgPSBmYWxzZTsKKwkJZHBiX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkiZW5hYmxlIGZlbmNlOiAlZCwgZmVuY2UgdXNhZ2U6ICVkXG4iLAorCQkJaHctPmVuYWJsZV9mZW5jZSwgaHctPmZlbmNlX3VzYWdlKTsKKwl9CisKKwlpZiAoIWh3LT5pc191c2VkX3Y0bCkgeworCQlody0+cmVvcmRlcl9kcGJfc2l6ZV9tYXJnaW4gPSByZW9yZGVyX2RwYl9zaXplX21hcmdpbjsKKwkJaHctPmNhbnZhc19tb2RlID0gbWVtX21hcF9tb2RlOworCisJCWlmICgoaDI2NF9kZWJ1Z19mbGFnICYgSUdOT1JFX1BBUkFNX0ZST01fQ09ORklHKSA9PSAwKQorCQkJaHctPmNhbnZhc19tb2RlID0gcGRhdGEtPmNhbnZhc19tb2RlOworCX0KKworCWlmIChody0+aXNfdXNlZF92NGwgJiYgKGh3LT52NGwyX2N0eCAhPSBOVUxMKSkgeworCQlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IGh3LT52NGwyX2N0eDsKKworCQljdHgtPmF1eF9pbmZvcy5hbGxvY19idWZmZXIoY3R4LCBTRUlfVFlQRSk7CisKKwkJaWYgKCFody0+ZGlzY2FyZF9kdl9kYXRhKQorCQkJY3R4LT5hdXhfaW5mb3MuYWxsb2NfYnVmZmVyKGN0eCwgRFZfVFlQRSk7CisJfQorCisJaWYgKGh3LT5tbXVfZW5hYmxlKSB7CisJCQlody0+Y2FudmFzX21vZGUgPSBDQU5WQVNfQkxLTU9ERV9MSU5FQVI7CisJCQlody0+ZG91YmxlX3dyaXRlX21vZGUgJj0gMHhmZmZmOworCX0KKworCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNykgJiYgaHctPmVuYWJsZV9mZW5jZSkgeworCQlody0+Y2FudmFzX21vZGUgPSAxOworCX0KKworCWlmIChwZGF0YS0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBCVUZTUEVDX1BPT0xfU0laRTsgaSsrKSB7CisJCQlody0+YnVmZmVyX3NwZWNbaV0ueV9jYW52YXNfaW5kZXggPSAtMTsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS51X2NhbnZhc19pbmRleCA9IC0xOworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZfY2FudmFzX2luZGV4ID0gLTE7CisjaWZkZWYgVkRFQ19EVworCQkJaWYgKElTX1ZERUNfRFcoaHcpKSB7CisJCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfeV9jYW52YXNfaW5kZXggPSAtMTsKKwkJCQlody0+YnVmZmVyX3NwZWNbaV0udmRlY19kd191X2NhbnZhc19pbmRleCA9IC0xOworCQkJCWh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X3ZfY2FudmFzX2luZGV4ID0gLTE7CisJCQl9CisjZW5kaWYKKwkJfQorCX0KKworCWRwYl9wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiJXMgbW11X2VuYWJsZSAlZCBkb3VibGVfd3JpdGVfbW9kZSAweCV4XG4iLAorCQlfX2Z1bmNfXywgaHctPm1tdV9lbmFibGUsIGh3LT5kb3VibGVfd3JpdGVfbW9kZSk7CisKKwlwZGF0YS0+cHJpdmF0ZSA9IGh3OworCXBkYXRhLT5kZWNfc3RhdHVzID0gZGVjX3N0YXR1czsKKwlwZGF0YS0+c2V0X3RyaWNrbW9kZSA9IHZtaDI2NF9zZXRfdHJpY2ttb2RlOworCXBkYXRhLT5ydW5fcmVhZHkgPSBydW5fcmVhZHk7CisJcGRhdGEtPnJ1biA9IHJ1bjsKKwlwZGF0YS0+cmVzZXQgPSByZXNldDsKKwlwZGF0YS0+aXJxX2hhbmRsZXIgPSB2aDI2NF9pc3I7CisJcGRhdGEtPnRocmVhZGVkX2lycV9oYW5kbGVyID0gdmgyNjRfaXNyX3RocmVhZF9mbjsKKwlwZGF0YS0+ZHVtcF9zdGF0ZSA9IHZtaDI2NF9kdW1wX3N0YXRlOworCisjaWZkZWYgTUgyNjRfVVNFUkRBVEFfRU5BQkxFCisJcGRhdGEtPndha2V1cF91c2VyZGF0YV9wb2xsID0gdm1oMjY0X3dha2V1cF91c2VyZGF0YV9wb2xsOworCXBkYXRhLT51c2VyX2RhdGFfcmVhZCA9IHZtaDI2NF91c2VyX2RhdGFfcmVhZDsKKwlwZGF0YS0+cmVzZXRfdXNlcmRhdGFfZmlmbyA9IHZtaDI2NF9yZXNldF91c2VyZGF0YV9maWZvOworI2Vsc2UKKwlwZGF0YS0+d2FrZXVwX3VzZXJkYXRhX3BvbGwgPSBOVUxMOworCXBkYXRhLT51c2VyX2RhdGFfcmVhZCA9IE5VTEw7CisJcGRhdGEtPnJlc2V0X3VzZXJkYXRhX2ZpZm8gPSBOVUxMOworI2VuZGlmCisJaWYgKHBkYXRhLT51c2VfdmZtX3BhdGgpIHsKKwkJc25wcmludGYocGRhdGEtPnZmX3Byb3ZpZGVyX25hbWUsIFZERUNfUFJPVklERVJfTkFNRV9TSVpFLAorCQkJVkZNX0RFQ19QUk9WSURFUl9OQU1FKTsKKwkJaHctPmZyYW1laW5mb19lbmFibGUgPSAxOworCX0KKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCWVsc2UgaWYgKHZkZWNfZHVhbChwZGF0YSkpIHsKKwkJaWYgKGR2X3RvZ2dsZV9wcm92X25hbWUpIC8qZGVidWcgcHVycG9zZSovCisJCQlzbnByaW50ZihwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCVZERUNfUFJPVklERVJfTkFNRV9TSVpFLAorCQkJCShwZGF0YS0+bWFzdGVyKSA/IFZGTV9ERUNfRFZCTF9QUk9WSURFUl9OQU1FIDoKKwkJCQlWRk1fREVDX0RWRUxfUFJPVklERVJfTkFNRSk7CisJCWVsc2UKKwkJCXNucHJpbnRmKHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJVkRFQ19QUk9WSURFUl9OQU1FX1NJWkUsCisJCQkJKHBkYXRhLT5tYXN0ZXIpID8gVkZNX0RFQ19EVkVMX1BST1ZJREVSX05BTUUgOgorCQkJCVZGTV9ERUNfRFZCTF9QUk9WSURFUl9OQU1FKTsKKwl9CisjZW5kaWYKKwllbHNlCisJCXNucHJpbnRmKHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lLCBWREVDX1BST1ZJREVSX05BTUVfU0laRSwKKwkJCVBST1ZJREVSX05BTUUgIi4lMDJ4IiwgcGRldi0+aWQgJiAweGZmKTsKKworCWlmICghaHctPmlzX3VzZWRfdjRsKQorCQl2Zl9wcm92aWRlcl9pbml0KCZwZGF0YS0+dmZyYW1lX3Byb3ZpZGVyLCBwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCSZ2Zl9wcm92aWRlcl9vcHMsIHBkYXRhKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBkYXRhKTsKKworCWJ1Zl9zcGVjX2luaXQoaHcsIGZhbHNlKTsKKworCWh3LT5wbGF0Zm9ybV9kZXYgPSBwZGV2OworCisjaWZkZWYgRFVNUF9VU0VSREFUQV9SRUNPUkQKKwl2bWgyNjRfaW5pdF91c2VyZGF0YV9kdW1wKCk7CisJdm1oMjY0X3Jlc2V0X3VzZXJfZGF0YV9idWYoKTsKKyNlbmRpZgorCWlmIChkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkoaHctPmJtbXVfYm94LCBCTU1VX0RQQl9JRFgsCisJCVZfQlVGX0FERFJfT0ZGU0VULCBEUklWRVJfTkFNRSwgJmh3LT5jbWFfYWxsb2NfYWRkcikgPCAwKSB7CisJCWgyNjRfZnJlZV9od19zdHJ1KCZwZGV2LT5kZXYsICh2b2lkICopaHcpOworCQlwZGF0YS0+ZGVjX3N0YXR1cyA9IE5VTEw7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWh3LT5idWZfb2Zmc2V0ID0gaHctPmNtYV9hbGxvY19hZGRyIC0gREVGX0JVRl9TVEFSVF9BRERSICsKKwkJCURDQUNfUkVBRF9NQVJHSU47CisJaWYgKGh3LT5tbXVfZW5hYmxlKSB7CisJCXUzMiBleHRpZl9zaXplID0gRVhUSUZfQlVGX1NJWkU7CisJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gIEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKQorCQkJZXh0aWZfc2l6ZSA8PD0gMTsKKwkJaWYgKGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeShody0+Ym1tdV9ib3gsIEJNTVVfRVhUSUZfSURYLAorCQkJZXh0aWZfc2l6ZSwgRFJJVkVSX05BTUUsICZody0+ZXh0aWZfYWRkcikgPCAwKSB7CisJCQloMjY0X2ZyZWVfaHdfc3RydSgmcGRldi0+ZGV2LCAodm9pZCAqKWh3KTsKKwkJCXBkYXRhLT5kZWNfc3RhdHVzID0gTlVMTDsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCWlmICghdmRlY19zZWN1cmUocGRhdGEpKSB7CisjaWYgMQorCQkvKmluaXQgaW50ZXJuYWwgYnVmKi8KKwkJdG1wYnVmID0gKGNoYXIgKiljb2RlY19tbV9waHlzX3RvX3ZpcnQoaHctPmNtYV9hbGxvY19hZGRyKTsKKwkJaWYgKHRtcGJ1ZikgeworCQkJbWVtc2V0KHRtcGJ1ZiwgMCwgVl9CVUZfQUREUl9PRkZTRVQpOworCQkJY29kZWNfbW1fZG1hX2ZsdXNoKHRtcGJ1ZiwKKwkJCQlWX0JVRl9BRERSX09GRlNFVCwKKwkJCQlETUFfVE9fREVWSUNFKTsKKwkJfSBlbHNlIHsKKwkJCXRtcGJ1ZiA9IGNvZGVjX21tX3ZtYXAoaHctPmNtYV9hbGxvY19hZGRyLAorCQkJCVZfQlVGX0FERFJfT0ZGU0VUKTsKKwkJCWlmICh0bXBidWYpIHsKKwkJCQltZW1zZXQodG1wYnVmLCAwLCBWX0JVRl9BRERSX09GRlNFVCk7CisJCQkJY29kZWNfbW1fZG1hX2ZsdXNoKHRtcGJ1ZiwKKwkJCQkJVl9CVUZfQUREUl9PRkZTRVQsCisJCQkJCURNQV9UT19ERVZJQ0UpOworCQkJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIodG1wYnVmKTsKKwkJCX0KKwkJfQorI2Vsc2UKKwkJLyppbml0IHNwcy9wcHMgaW50ZXJuYWwgYnVmIDY0ayovCisJCXRtcGJ1ZiA9IChjaGFyICopY29kZWNfbW1fcGh5c190b192aXJ0KGh3LT5jbWFfYWxsb2NfYWRkcgorCQkJKyAobWVtX3Nwc19iYXNlIC0gREVGX0JVRl9TVEFSVF9BRERSKSk7CisJCW1lbXNldCh0bXBidWYsIDAsIDB4MTAwMDApOworCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQlody0+Y21hX2FsbG9jX2FkZHIgKworCQkJKG1lbV9zcHNfYmFzZSAtIERFRl9CVUZfU1RBUlRfQUREUiksCisJCQkweDEwMDAwLCBETUFfVE9fREVWSUNFKTsKKyNlbmRpZgorCX0KKwkvKiovCisKKyNpZiAwCisJaWYgKE5VTEwgPT0gaHctPnNlaV9kYXRhX2J1ZmZlcikgeworCQlody0+c2VpX2RhdGFfYnVmZmVyID0KKwkJCWRtYV9hbGxvY19jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJVVNFUl9EQVRBX1NJWkUsCisJCQkJJmh3LT5zZWlfZGF0YV9idWZmZXJfcGh5cywgR0ZQX0tFUk5FTCk7CisJCWlmICghaHctPnNlaV9kYXRhX2J1ZmZlcikgeworCQkJcHJfaW5mbygiJXM6IENhbiBub3QgYWxsb2NhdGUgc2VpX2RhdGFfYnVmZmVyXG4iLAorCQkJCSAgIF9fZnVuY19fKTsKKwkJCWFtbXZkZWNfaDI2NF9tbXVfcmVsZWFzZShodyk7CisJCQloMjY0X2ZyZWVfaHdfc3RydSgmcGRldi0+ZGV2LCAodm9pZCAqKWh3KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCS8qIHByX2luZm8oImJ1ZmZlciAweCV4LCBwaHlzIDB4JXgsIHJlbWFwIDB4JXhcbiIsCisJCSAgIHNlaV9kYXRhX2J1ZmZlciwgc2VpX2RhdGFfYnVmZmVyX3BoeXMsCisJCSAgICh1MzIpc2VpX2RhdGFfYnVmZmVyX3JlbWFwKTsgKi8KKwl9CisjZW5kaWYKKwlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwgImFtbXZkZWNfaDI2NCBtZW0tYWRkcj0lbHgsYnVmZl9vZmZzZXQ9JXgsYnVmX3N0YXJ0PSVseFxuIiwKKwkJcGRhdGEtPm1lbV9zdGFydCwgaHctPmJ1Zl9vZmZzZXQsIGh3LT5jbWFfYWxsb2NfYWRkcik7CisKKwl2ZGVjX3NvdXJjZV9jaGFuZ2VkKFZGT1JNQVRfSDI2NCwgMzg0MCwgMjE2MCwgNjApOworCisJaWYgKGh3LT5tbXVfZW5hYmxlKQorCQloZXZjX3NvdXJjZV9jaGFuZ2VkKFZGT1JNQVRfSEVWQywgMzg0MCwgMjE2MCwgNjApOworCisJaWYgKHZoMjY0X2luaXQoaHcpIDwgMCkgeworCQlwcl9pbmZvKCJcbmFtbXZkZWNfaDI2NCBpbml0IGZhaWxlZC5cbiIpOworCQlhbW12ZGVjX2gyNjRfbW11X3JlbGVhc2UoaHcpOworCQloMjY0X2ZyZWVfaHdfc3RydSgmcGRldi0+ZGV2LCAodm9pZCAqKWh3KTsKKwkJcGRhdGEtPmRlY19zdGF0dXMgPSBOVUxMOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisjaWZkZWYgTUgyNjRfVVNFUkRBVEFfRU5BQkxFCisJdm1oMjY0X2NyYXRlX3VzZXJkYXRhX21hbmFnZXIoaHcsCisJCQlody0+c2VpX3VzZXJfZGF0YV9idWZmZXIsCisJCQlVU0VSX0RBVEFfU0laRSk7CisjZW5kaWYKKworI2lmZGVmIEFVWF9EQVRBX0NSQworCXZkZWNfYXV4X2RhdGFfY2hlY2tfaW5pdChwZGF0YSk7CisjZW5kaWYKKworCXZkZWNfc2V0X3ByZXBhcmVfbGV2ZWwocGRhdGEsIHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwpOworCWlmIChwZGF0YS0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJaWYgKGh3LT5tbXVfZW5hYmxlID09IDApCisJCQl2ZGVjX2NvcmVfcmVxdWVzdChwZGF0YSwgQ09SRV9NQVNLX1ZERUNfMSk7CisJCWVsc2UgeworCQkJdmRlY19jb3JlX3JlcXVlc3QocGRhdGEsIENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQworCQkJCXwgQ09SRV9NQVNLX0NPTUJJTkUpOworCQl9CisJfSBlbHNlCisJCXZkZWNfY29yZV9yZXF1ZXN0KHBkYXRhLCBDT1JFX01BU0tfVkRFQ18xIHwgQ09SRV9NQVNLX0hFVkMKKwkJCQl8IENPUkVfTUFTS19DT01CSU5FKTsKKworCWF0b21pY19zZXQoJmh3LT52aDI2NF9hY3RpdmUsIDEpOworCXZkZWNfc2V0X3ZmcmFtZV9jb21tKHBkYXRhLCBEUklWRVJfTkFNRSk7CisJZGlzcGxheV9mcmFtZV9jb3VudFtERUNPREVfSUQoaHcpXSA9IDA7CisJZGVjb2RlX2ZyYW1lX2NvdW50W0RFQ09ERV9JRChodyldID0gMDsKKwlody0+ZHBiLndpdGhvdXRfZGlzcGxheV9tb2RlID0gd2l0aG91dF9kaXNwbGF5X21vZGU7CisJbXV0ZXhfaW5pdCgmaHctPmZlbmNlX211dGV4KTsKKwlpZiAoaHctPmVuYWJsZV9mZW5jZSkgeworCQlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisJCXBkYXRhLT5zeW5jID0gdmRlY19zeW5jX2dldCgpOworCQlpZiAoIXBkYXRhLT5zeW5jKSB7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwgImFsbG9jIGZlbmNlIHRpbWVsaW5lIGVycm9yXG4iKTsKKwkJCWFtbXZkZWNfaDI2NF9tbXVfcmVsZWFzZShodyk7CisJCQloMjY0X2ZyZWVfaHdfc3RydSgmcGRldi0+ZGV2LCAodm9pZCAqKWh3KTsKKwkJCXBkYXRhLT5kZWNfc3RhdHVzID0gTlVMTDsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCWN0eC0+c3luYyA9IHBkYXRhLT5zeW5jOworCQlwZGF0YS0+c3luYy0+dXNhZ2UgPSBody0+ZmVuY2VfdXNhZ2U7CisJCS8qIGNyZWF0IHRpbWVsaW5lLiAqLworCQl2ZGVjX3RpbWVsaW5lX2NyZWF0ZShwZGF0YS0+c3luYywgRFJJVkVSX05BTUUpOworCQl2ZGVjX3RpbWVsaW5lX2dldChwZGF0YS0+c3luYyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZkZWNfZmVuY2VfcmVsZWFzZShzdHJ1Y3QgdmRlY19oMjY0X2h3X3MgKmh3LAorCQkJICAgICAgIHN0cnVjdCB2ZGVjX3N5bmMgKnN5bmMpCit7CisJdWxvbmcgZXhwaXJlczsKKworCS8qIGNsZWFyIGRpc3BsYXkgcG9vbC4gKi8KKwljbGVhcl9yZWZlcl9idWZzKGh3KTsKKworCS8qIG5vdGlmeSBzaWduYWwgdG8gd2FrZSB1cCBhbGwgZmVuY2VzLiAqLworCXZkZWNfdGltZWxpbmVfaW5jcmVhc2Uoc3luYywgVkZfUE9PTF9TSVpFKTsKKworCWV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMDAwKTsKKwl3aGlsZSAoIWNoZWNrX29ianNfYWxsX3NpZ25hbGVkKHN5bmMpKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGV4cGlyZXMpKSB7CisJCQlwcl9lcnIoIndhaXQgZmVuY2Ugc2lnbmFsZWQgdGltZW91dC5cbiIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlwcl9pbmZvKCJmZW5jZSBzdGFydCByZWxlYXNlXG4iKTsKKworCS8qIGRlY3JlYXNlcyByZWZjbnQgb2YgdGltZWxpbmUuICovCisJdmRlY190aW1lbGluZV9wdXQoc3luYyk7Cit9CisKK3N0YXRpYyBpbnQgYW1tdmRlY19oMjY0X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB2ZGVjX2gyNjRfaHdfcyAqaHcgPQorCQkoc3RydWN0IHZkZWNfaDI2NF9od19zICopCisJCSgoKHN0cnVjdCB2ZGVjX3MgKikocGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldikpKS0+cHJpdmF0ZSk7CisJaW50IGk7CisKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisKKwlpZiAodmRlYy0+bmV4dF9zdGF0dXMgPT0gVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVECisJCQkJJiYgKHZkZWMtPnN0YXR1cyA9PSBWREVDX1NUQVRVU19BQ1RJVkUpKSB7CisJCQlkcGJfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCQkiJXMgIGZvcmNlIGV4aXQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRk9SQ0VfRVhJVDsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaHctPndhaXRfcSwKKwkJCQkodmRlYy0+c3RhdHVzID09IFZERUNfU1RBVFVTX0NPTk5FQ1RFRCksCisJCQkJbXNlY3NfdG9famlmZmllcygxMDAwKSk7ICAvKiB3YWl0IGZvciB3b3JrIGRvbmUgKi8KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQlVGU1BFQ19QT09MX1NJWkU7IGkrKykKKwkJcmVsZWFzZV9hdXhfZGF0YShodywgaSk7CisKKwlhdG9taWNfc2V0KCZody0+dmgyNjRfYWN0aXZlLCAwKTsKKworCWlmIChody0+c3RhdCAmIFNUQVRfVElNRVJfQVJNKSB7CisJCWRlbF90aW1lcl9zeW5jKCZody0+Y2hlY2tfdGltZXIpOworCQlody0+c3RhdCAmPSB+U1RBVF9USU1FUl9BUk07CisJfQorCisJdmgyNjRfc3RvcChodyk7CisjaWZkZWYgTUgyNjRfVVNFUkRBVEFfRU5BQkxFCisjaWZkZWYgRFVNUF9VU0VSREFUQV9SRUNPUkQKKwl2bWgyNjRfZHVtcF91c2VyZGF0YSgpOworI2VuZGlmCisJdm1oMjY0X2Rlc3Ryb3lfdXNlcmRhdGFfbWFuYWdlcihodyk7CisjZW5kaWYKKwkvKiB2ZGVjX3NvdXJjZV9jaGFuZ2VkKFZGT1JNQVRfSDI2NCwgMCwgMCwgMCk7ICovCisKKyNpZmRlZiBBVVhfREFUQV9DUkMKKwl2ZGVjX2F1eF9kYXRhX2NoZWNrX2V4aXQodmRlYyk7CisjZW5kaWYKKworCWF0b21pY19zZXQoJmh3LT52aDI2NF9hY3RpdmUsIDApOworCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQlpZiAoaHctPm1tdV9lbmFibGUgPT0gMCkKKwkJCXZkZWNfY29yZV9yZWxlYXNlKHZkZWMsIENPUkVfTUFTS19WREVDXzEpOworCQllbHNlCisJCQl2ZGVjX2NvcmVfcmVsZWFzZSh2ZGVjLCBDT1JFX01BU0tfVkRFQ18xIHwgQ09SRV9NQVNLX0hFVkMgfAorCQkJCUNPUkVfTUFTS19DT01CSU5FKTsKKwl9IGVsc2UKKwkJdmRlY19jb3JlX3JlbGVhc2UoaHdfdG9fdmRlYyhodyksIENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQyk7CisKKwl2ZGVjX3NldF9zdGF0dXMoaHdfdG9fdmRlYyhodyksIFZERUNfU1RBVFVTX0RJU0NPTk5FQ1RFRCk7CisJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCWZvciAoaSA9IDA7IGkgPCBCVUZTUEVDX1BPT0xfU0laRTsgaSsrKSB7CisJCQl2ZGVjLT5mcmVlX2NhbnZhc19leChody0+YnVmZmVyX3NwZWNbaV0ueV9jYW52YXNfaW5kZXgsIHZkZWMtPmlkKTsKKwkJCXZkZWMtPmZyZWVfY2FudmFzX2V4KGh3LT5idWZmZXJfc3BlY1tpXS51X2NhbnZhc19pbmRleCwgdmRlYy0+aWQpOworCQkJdmRlYy0+ZnJlZV9jYW52YXNfZXgoaHctPmJ1ZmZlcl9zcGVjW2ldLnZfY2FudmFzX2luZGV4LCB2ZGVjLT5pZCk7CisJCQlpZiAoSVNfVkRFQ19EVyhodykpIHsKKwkJCQl2ZGVjLT5mcmVlX2NhbnZhc19leChody0+YnVmZmVyX3NwZWNbaV0udmRlY19kd195X2NhbnZhc19pbmRleCwgdmRlYy0+aWQpOworCQkJCXZkZWMtPmZyZWVfY2FudmFzX2V4KGh3LT5idWZmZXJfc3BlY1tpXS52ZGVjX2R3X3VfY2FudmFzX2luZGV4LCB2ZGVjLT5pZCk7CisJCQkJdmRlYy0+ZnJlZV9jYW52YXNfZXgoaHctPmJ1ZmZlcl9zcGVjW2ldLnZkZWNfZHdfdl9jYW52YXNfaW5kZXgsIHZkZWMtPmlkKTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChody0+ZW5hYmxlX2ZlbmNlKQorCQl2ZGVjX2ZlbmNlX3JlbGVhc2UoaHcsIHZkZWMtPnN5bmMpOworCisJYW1tdmRlY19oMjY0X21tdV9yZWxlYXNlKGh3KTsKKwloMjY0X2ZyZWVfaHdfc3RydSgmcGRldi0+ZGV2LCAodm9pZCAqKWh3KTsKKwljbGtfYWRqX2ZyYW1lX2NvdW50ID0gMDsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYW1tdmRlY19oMjY0X2RyaXZlciA9IHsKKwkucHJvYmUgPSBhbW12ZGVjX2gyNjRfcHJvYmUsCisJLnJlbW92ZSA9IGFtbXZkZWNfaDI2NF9yZW1vdmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBhbXZkZWNfc3VzcGVuZCwKKwkucmVzdW1lID0gYW12ZGVjX3Jlc3VtZSwKKyNlbmRpZgorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJJVkVSX05BTUUsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBjb2RlY19wcm9maWxlX3QgYW1tdmRlY19oMjY0X3Byb2ZpbGUgPSB7CisJLm5hbWUgPSAiSC4yNjQtVjRMIiwKKwkucHJvZmlsZSA9ICIiCit9OworCitzdGF0aWMgc3RydWN0IG1jb25maWcgaG0yNjRfY29uZmlnc1tdID0geworCU1DX1BVMzIoImgyNjRfZGVidWdfZmxhZyIsICZoMjY0X2RlYnVnX2ZsYWcpLAorCU1DX1BJMzIoInN0YXJ0X2RlY29kZV9idWZfbGV2ZWwiLCAmc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCksCisJTUNfUFUzMigiZml4ZWRfZnJhbWVfcmF0ZV9tb2RlIiwgJmZpeGVkX2ZyYW1lX3JhdGVfbW9kZSksCisJTUNfUFUzMigiZGVjb2RlX3RpbWVvdXRfdmFsIiwgJmRlY29kZV90aW1lb3V0X3ZhbCksCisJTUNfUFUzMigicmVvcmRlcl9kcGJfc2l6ZV9tYXJnaW4iLCAmcmVvcmRlcl9kcGJfc2l6ZV9tYXJnaW4pLAorCU1DX1BVMzIoInJlZmVyZW5jZV9idWZfbWFyZ2luIiwgJnJlZmVyZW5jZV9idWZfbWFyZ2luKSwKKwlNQ19QVTMyKCJyYWRyIiwgJnJhZHIpLAorCU1DX1BVMzIoInJ2YWwiLCAmcnZhbCksCisJTUNfUFUzMigiaDI2NF9kZWJ1Z19tYXNrIiwgJmgyNjRfZGVidWdfbWFzayksCisJTUNfUFUzMigiaDI2NF9kZWJ1Z19jbWQiLCAmaDI2NF9kZWJ1Z19jbWQpLAorCU1DX1BJMzIoImZvcmNlX3JhdGVfc3RyZWFtYmFzZSIsICZmb3JjZV9yYXRlX3N0cmVhbWJhc2UpLAorCU1DX1BJMzIoImRlY19jb250cm9sIiwgJmRlY19jb250cm9sKSwKKwlNQ19QSTMyKCJmb3JjZV9yYXRlX2ZyYW1lYmFzZSIsICZmb3JjZV9yYXRlX2ZyYW1lYmFzZSksCisJTUNfUEkzMigiZm9yY2VfZGlzcF9idWZzcGVjX251bSIsICZmb3JjZV9kaXNwX2J1ZnNwZWNfbnVtKSwKKwlNQ19QVTMyKCJwcmVmaXhfYXV4X2J1Zl9zaXplIiwgJnByZWZpeF9hdXhfYnVmX3NpemUpLAorCU1DX1BVMzIoInN1ZmZpeF9hdXhfYnVmX3NpemUiLCAmc3VmZml4X2F1eF9idWZfc2l6ZSksCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwlNQ19QVTMyKCJyZW9yZGVyX2RwYl9zaXplX21hcmdpbl9kdiIsICZyZW9yZGVyX2RwYl9zaXplX21hcmdpbl9kdiksCisJTUNfUFUzMigiZHZfdG9nZ2xlX3Byb3ZfbmFtZSIsICZkdl90b2dnbGVfcHJvdl9uYW1lKSwKKwlNQ19QVTMyKCJkb2xieV9tZXRhX3dpdGhfZWwiLCAmZG9sYnlfbWV0YV93aXRoX2VsKSwKKyNlbmRpZgorCU1DX1BVMzIoImlfb25seV9mbGFnIiwgJmlfb25seV9mbGFnKSwKKwlNQ19QVTMyKCJmb3JjZV9yYXRlX3N0cmVhbWJhc2UiLCAmZm9yY2VfcmF0ZV9zdHJlYW1iYXNlKSwKK307CitzdGF0aWMgc3RydWN0IG1jb25maWdfbm9kZSBobTI2NF9ub2RlOworCisKK3N0YXRpYyBpbnQgX19pbml0IGFtbXZkZWNfaDI2NF9kcml2ZXJfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlwcl9pbmZvKCJhbW12ZGVjX2gyNjQgbW9kdWxlIGluaXRcbiIpOworCWlmIChwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFtbXZkZWNfaDI2NF9kcml2ZXIpKSB7CisJCXByX2luZm8oImZhaWxlZCB0byByZWdpc3RlciBhbW12ZGVjX2gyNjQgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKHZkZWNfaXNfc3VwcG9ydF80aygpKSB7CisJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RYTFgpIHsKKwkJCWFtbXZkZWNfaDI2NF9wcm9maWxlLnByb2ZpbGUgPQorCQkJCQkiNGssIGR3cml0ZSwgY29tcHJlc3NlZCwgZnJhbWVfZHYsIGZlbmNlIjsKKwkJfSBlbHNlIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYVFZCQikgeworCQkJYW1tdmRlY19oMjY0X3Byb2ZpbGUucHJvZmlsZSA9ICI0aywgZnJhbWVfZHYsIGZlbmNlIjsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1RCB8fCBpc19jcHVfczRfczgwNXgyKCkpIHsKKwkJCWFtbXZkZWNfaDI2NF9wcm9maWxlLnByb2ZpbGUgPQorCQkJCQkJImR3cml0ZSwgY29tcHJlc3NlZCwgZnJhbWVfZHYsIHY0bCI7CisJCX0gZWxzZSB7CisJCQlhbW12ZGVjX2gyNjRfcHJvZmlsZS5wcm9maWxlID0KKwkJCQkJCSJkd3JpdGUsIGNvbXByZXNzZWQsIHY0bCI7CisJCX0KKwl9CisKKwl2Y29kZWNfcHJvZmlsZV9yZWdpc3RlcigmYW1tdmRlY19oMjY0X3Byb2ZpbGUpOworCisJSU5JVF9SRUdfTk9ERV9DT05GSUdTKCJtZWRpYS5kZWNvZGVyIiwgJmhtMjY0X25vZGUsCisJCSJtaDI2NC12NGwiLCBobTI2NF9jb25maWdzLCBDT05GSUdfRk9SX1JXKTsKKwl2Y29kZWNfZmVhdHVyZV9yZWdpc3RlcihWRk9STUFUX0gyNjQsIDEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYW1tdmRlY19oMjY0X2RyaXZlcl9yZW1vdmVfbW9kdWxlKHZvaWQpCit7CisJcHJfaW5mbygiYW1tdmRlY19oMjY0IG1vZHVsZSByZW1vdmUuXG4iKTsKKworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhbW12ZGVjX2gyNjRfZHJpdmVyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCittb2R1bGVfcGFyYW0oaDI2NF9kZWJ1Z19mbGFnLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoaDI2NF9kZWJ1Z19mbGFnLCAiXG4gYW1tdmRlY19oMjY0IGgyNjRfZGVidWdfZmxhZ1xuIik7CisKK21vZHVsZV9wYXJhbShzdGFydF9kZWNvZGVfYnVmX2xldmVsLCBpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhzdGFydF9kZWNvZGVfYnVmX2xldmVsLAorCQkiXG4gYW1tdmRlY19oMjY0IHN0YXJ0X2RlY29kZV9idWZfbGV2ZWxcbiIpOworCittb2R1bGVfcGFyYW0ocHJlX2RlY29kZV9idWZfbGV2ZWwsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHByZV9kZWNvZGVfYnVmX2xldmVsLCAiXG4gYW1tdmRlY19oMjY0IHByZV9kZWNvZGVfYnVmX2xldmVsXG4iKTsKKworbW9kdWxlX3BhcmFtKGZpeGVkX2ZyYW1lX3JhdGVfbW9kZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZpeGVkX2ZyYW1lX3JhdGVfbW9kZSwgIlxuYW12ZGVjX2gyNjQgZml4ZWRfZnJhbWVfcmF0ZV9tb2RlXG4iKTsKKworbW9kdWxlX3BhcmFtKGRlY29kZV90aW1lb3V0X3ZhbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlY29kZV90aW1lb3V0X3ZhbCwgIlxuIGFtdmRlY19oMjY0IGRlY29kZV90aW1lb3V0X3ZhbFxuIik7CisKK21vZHVsZV9wYXJhbShlcnJvcmRhdGFfdGltZW91dF92YWwsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhlcnJvcmRhdGFfdGltZW91dF92YWwsICJcbiBhbXZkZWNfaDI2NCBlcnJvcmRhdGFfdGltZW91dF92YWxcbiIpOworCittb2R1bGVfcGFyYW0oZ2V0X2RhdGFfdGltZW91dF92YWwsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhnZXRfZGF0YV90aW1lb3V0X3ZhbCwgIlxuIGFtdmRlY19oMjY0IGdldF9kYXRhX3RpbWVvdXRfdmFsXG4iKTsKKworbW9kdWxlX3BhcmFtKGZyYW1lX21heF9kYXRhX3BhY2tldCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZyYW1lX21heF9kYXRhX3BhY2tldCwgIlxuIGFtdmRlY19oMjY0IGZyYW1lX21heF9kYXRhX3BhY2tldFxuIik7CisKK21vZHVsZV9wYXJhbShyZW9yZGVyX2RwYl9zaXplX21hcmdpbiwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJlb3JkZXJfZHBiX3NpemVfbWFyZ2luLCAiXG4gYW1tdmRlY19oMjY0IHJlb3JkZXJfZHBiX3NpemVfbWFyZ2luXG4iKTsKKworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCittb2R1bGVfcGFyYW0ocmVvcmRlcl9kcGJfc2l6ZV9tYXJnaW5fZHYsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhyZW9yZGVyX2RwYl9zaXplX21hcmdpbl9kdiwKKwkiXG4gYW1tdmRlY19oMjY0IHJlb3JkZXJfZHBiX3NpemVfbWFyZ2luX2R2XG4iKTsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0ocmVmZXJlbmNlX2J1Zl9tYXJnaW4sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhyZWZlcmVuY2VfYnVmX21hcmdpbiwgIlxuIGFtbXZkZWNfaDI2NCByZWZlcmVuY2VfYnVmX21hcmdpblxuIik7CisKKyNpZmRlZiBDT05TVFJBSU5fTUFYX0JVRl9OVU0KK21vZHVsZV9wYXJhbShydW5fcmVhZHlfbWF4X3ZmX29ubHlfbnVtLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocnVuX3JlYWR5X21heF92Zl9vbmx5X251bSwgIlxuIHJ1bl9yZWFkeV9tYXhfdmZfb25seV9udW1cbiIpOworCittb2R1bGVfcGFyYW0ocnVuX3JlYWR5X2Rpc3BsYXlfcV9udW0sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhydW5fcmVhZHlfZGlzcGxheV9xX251bSwgIlxuIHJ1bl9yZWFkeV9kaXNwbGF5X3FfbnVtXG4iKTsKKworbW9kdWxlX3BhcmFtKHJ1bl9yZWFkeV9tYXhfYnVmX251bSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJ1bl9yZWFkeV9tYXhfYnVmX251bSwgIlxuIHJ1bl9yZWFkeV9tYXhfYnVmX251bVxuIik7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKHJhZHIsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhyYWRyLCAiXG5yYWRyXG4iKTsKKworbW9kdWxlX3BhcmFtKHJ2YWwsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhydmFsLCAiXG5ydmFsXG4iKTsKKworbW9kdWxlX3BhcmFtKGgyNjRfZGVidWdfbWFzaywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGgyNjRfZGVidWdfbWFzaywgIlxuIGFtdmRlY19oMjY0IGgyNjRfZGVidWdfbWFza1xuIik7CisKK21vZHVsZV9wYXJhbShoMjY0X2RlYnVnX2NtZCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGgyNjRfZGVidWdfY21kLCAiXG4gYW12ZGVjX2gyNjQgaDI2NF9kZWJ1Z19jbWRcbiIpOworCittb2R1bGVfcGFyYW0oZm9yY2VfcmF0ZV9zdHJlYW1iYXNlLCBpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9yYXRlX3N0cmVhbWJhc2UsICJcbiBhbXZkZWNfaDI2NCBmb3JjZV9yYXRlX3N0cmVhbWJhc2VcbiIpOworCittb2R1bGVfcGFyYW0oZGVjX2NvbnRyb2wsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlY19jb250cm9sLCAiXG4gYW12ZGVjX2gyNjQgZGVjX2NvbnRyb2xcbiIpOworCittb2R1bGVfcGFyYW0oZm9yY2VfcmF0ZV9mcmFtZWJhc2UsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX3JhdGVfZnJhbWViYXNlLCAiXG4gYW12ZGVjX2gyNjQgZm9yY2VfcmF0ZV9mcmFtZWJhc2VcbiIpOworCittb2R1bGVfcGFyYW0oZm9yY2VfZGlzcF9idWZzcGVjX251bSwgaW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2VfZGlzcF9idWZzcGVjX251bSwgIlxuIGFtdmRlY19oMjY0IGZvcmNlX2Rpc3BfYnVmc3BlY19udW1cbiIpOworCittb2R1bGVfcGFyYW0oVl9CVUZfQUREUl9PRkZTRVQsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKFZfQlVGX0FERFJfT0ZGU0VULCAiXG4gYW12ZGVjX2gyNjQgVl9CVUZfQUREUl9PRkZTRVRcbiIpOworCittb2R1bGVfcGFyYW0ocHJlZml4X2F1eF9idWZfc2l6ZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHByZWZpeF9hdXhfYnVmX3NpemUsICJcbiBwcmVmaXhfYXV4X2J1Zl9zaXplXG4iKTsKKworbW9kdWxlX3BhcmFtKHN1ZmZpeF9hdXhfYnVmX3NpemUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhzdWZmaXhfYXV4X2J1Zl9zaXplLCAiXG4gc3VmZml4X2F1eF9idWZfc2l6ZVxuIik7CisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorbW9kdWxlX3BhcmFtKGR2X3RvZ2dsZV9wcm92X25hbWUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkdl90b2dnbGVfcHJvdl9uYW1lLCAiXG4gZHZfdG9nZ2xlX3Byb3ZfbmFtZVxuIik7CisKK21vZHVsZV9wYXJhbShkb2xieV9tZXRhX3dpdGhfZWwsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkb2xieV9tZXRhX3dpdGhfZWwsICJcbiBkb2xieV9tZXRhX3dpdGhfZWxcbiIpOworCisjZW5kaWYKKworbW9kdWxlX3BhcmFtKGZhc3Rfb3V0cHV0X2VuYWJsZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZhc3Rfb3V0cHV0X2VuYWJsZSwgIlxuIGFtdmRlY19oMjY0IGZhc3Rfb3V0cHV0X2VuYWJsZVxuIik7CisKK21vZHVsZV9wYXJhbShlcnJvcl9wcm9jX3BvbGljeSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVycm9yX3Byb2NfcG9saWN5LCAiXG4gYW12ZGVjX2gyNjQgZXJyb3JfcHJvY19wb2xpY3lcbiIpOworCittb2R1bGVfcGFyYW0odjRsX2Vycm9yX3BvbGljeSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHY0bF9lcnJvcl9wb2xpY3ksICJcbiBhbXZkZWNfaDI2NCB2NGxfZXJyb3JfcG9saWN5XG4iKTsKKworCittb2R1bGVfcGFyYW0oZXJyb3Jfc2tpcF9jb3VudCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVycm9yX3NraXBfY291bnQsICJcbiBhbXZkZWNfaDI2NCBlcnJvcl9za2lwX2NvdW50XG4iKTsKKworbW9kdWxlX3BhcmFtKGZvcmNlX3NsaWRpbmdfbWFyZ2luLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2Vfc2xpZGluZ19tYXJnaW4sICJcbiBhbXZkZWNfaDI2NCBmb3JjZV9zbGlkaW5nX21hcmdpblxuIik7CisKK21vZHVsZV9wYXJhbShpX29ubHlfZmxhZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlfb25seV9mbGFnLCAiXG4gYW12ZGVjX2gyNjQgaV9vbmx5X2ZsYWdcbiIpOworCittb2R1bGVfcGFyYW0oZmlyc3RfaV9wb2xpY3ksIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmaXJzdF9pX3BvbGljeSwgIlxuIGFtdmRlY19oMjY0IGZpcnN0X2lfcG9saWN5XG4iKTsKKworbW9kdWxlX3BhcmFtKGZybWJhc2VfY29udF9iaXRsZXZlbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZybWJhc2VfY29udF9iaXRsZXZlbCwKKwkiXG4gYW12ZGVjX2gyNjQgZnJtYmFzZV9jb250X2JpdGxldmVsXG4iKTsKKworbW9kdWxlX3BhcmFtKGZybWJhc2VfY29udF9iaXRsZXZlbDIsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmcm1iYXNlX2NvbnRfYml0bGV2ZWwyLAorCSJcbiBhbXZkZWNfaDI2NCBmcm1iYXNlX2NvbnRfYml0bGV2ZWxcbiIpOworCittb2R1bGVfcGFyYW0odWRlYnVnX2ZsYWcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh1ZGVidWdfZmxhZywgIlxuIGFtdmRlY19taDI2NCB1ZGVidWdfZmxhZ1xuIik7CisKK21vZHVsZV9wYXJhbSh1ZGVidWdfcGF1c2VfcG9zLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModWRlYnVnX3BhdXNlX3BvcywgIlxuIHVkZWJ1Z19wYXVzZV9wb3NcbiIpOworCittb2R1bGVfcGFyYW0odWRlYnVnX3BhdXNlX3ZhbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHVkZWJ1Z19wYXVzZV92YWwsICJcbiB1ZGVidWdfcGF1c2VfdmFsXG4iKTsKKworbW9kdWxlX3BhcmFtKHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModWRlYnVnX3BhdXNlX2RlY29kZV9pZHgsICJcbiB1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeFxuIik7CisKK21vZHVsZV9wYXJhbShtYXhfYWxsb2NfYnVmX2NvdW50LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2FsbG9jX2J1Zl9jb3VudCwgIlxuIGFtdmRlY19oMjY0IG1heF9hbGxvY19idWZfY291bnRcbiIpOworCittb2R1bGVfcGFyYW0oZW5hYmxlX2l0dV90MzUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhlbmFibGVfaXR1X3QzNSwgIlxuIGFtdmRlY19oMjY0IGVuYWJsZV9pdHVfdDM1XG4iKTsKKworbW9kdWxlX3BhcmFtKGVuZGlhbiwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuZGlhbiwgIlxucnZhbFxuIik7CisKK21vZHVsZV9wYXJhbShtbXVfZW5hYmxlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobW11X2VuYWJsZSwgIlxuIG1tdV9lbmFibGVcbiIpOworCittb2R1bGVfcGFyYW0oZm9yY2VfZW5hYmxlX21tdSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2VuYWJsZV9tbXUsICJcbiBmb3JjZV9lbmFibGVfbW11XG4iKTsKKworbW9kdWxlX3BhcmFtKGFnYWluX3RocmVzaG9sZCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGFnYWluX3RocmVzaG9sZCwgIlxuIGFnYWluX3RocmVzaG9sZFxuIik7CisKK21vZHVsZV9wYXJhbShzdHJlYW1fbW9kZV9zdGFydF9udW0sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhzdHJlYW1fbW9kZV9zdGFydF9udW0sICJcbiBzdHJlYW1fbW9kZV9zdGFydF9udW1cbiIpOworCittb2R1bGVfcGFyYW0oY29sb2NhdGVfb2xkX2NhbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNvbG9jYXRlX29sZF9jYWwsICJcbiBhbXZkZWNfbWgyNjQgY29sb2NhdGVfb2xkX2NhbFxuIik7CisKKy8qCittb2R1bGVfcGFyYW0odHJpZ2dlcl90YXNrLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModHJpZ2dlcl90YXNrLCAiXG4gYW12ZGVjX2gyNjQgdHJpZ2dlcl90YXNrXG4iKTsKKyovCittb2R1bGVfcGFyYW1fYXJyYXkoZGVjb2RlX2ZyYW1lX2NvdW50LCB1aW50LCAmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCittb2R1bGVfcGFyYW1fYXJyYXkoZGlzcGxheV9mcmFtZV9jb3VudCwgdWludCwgJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtX2FycmF5KG1heF9wcm9jZXNzX3RpbWUsIHVpbnQsICZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisKK21vZHVsZV9wYXJhbV9hcnJheShydW5fY291bnQsIHVpbnQsCisJJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtX2FycmF5KG5vdF9ydW5fcmVhZHksIHVpbnQsCisJJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGlucHV0X2VtcHR5LCB1aW50LAorCSZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisKK21vZHVsZV9wYXJhbV9hcnJheShtYXhfZ2V0X2ZyYW1lX2ludGVydmFsLCB1aW50LAorCSZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisKK21vZHVsZV9wYXJhbV9hcnJheShzdGVwLCB1aW50LCAmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCittb2R1bGVfcGFyYW1fYXJyYXkocmVmX2ZyYW1lX21hcmtfZmxhZywgdWludCwgJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtKGRpc3BfdmZyYW1lX3ZhbHZlX2xldmVsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGlzcF92ZnJhbWVfdmFsdmVfbGV2ZWwsICJcbiBkaXNwX3ZmcmFtZV92YWx2ZV9sZXZlbFxuIik7CisKK21vZHVsZV9wYXJhbShkb3VibGVfd3JpdGVfbW9kZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRvdWJsZV93cml0ZV9tb2RlLCAiXG4gZG91YmxlX3dyaXRlX21vZGVcbiIpOworCittb2R1bGVfcGFyYW0obWVtX21hcF9tb2RlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobWVtX21hcF9tb2RlLCAiXG4gbWVtX21hcF9tb2RlXG4iKTsKKworbW9kdWxlX3BhcmFtKHdpdGhvdXRfZGlzcGxheV9tb2RlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Mod2l0aG91dF9kaXNwbGF5X21vZGUsICJcbiB3aXRob3V0X2Rpc3BsYXlfbW9kZVxuIik7CisKK21vZHVsZV9wYXJhbShjaGVja19zbGljZV9udW0sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhjaGVja19zbGljZV9udW0sICJcbiBjaGVja19zbGljZV9udW1cbiIpOworCittb2R1bGVfcGFyYW0obWJfY291bnRfdGhyZXNob2xkLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobWJfY291bnRfdGhyZXNob2xkLCAiXG4gbWJfY291bnRfdGhyZXNob2xkXG4iKTsKKworbW9kdWxlX3BhcmFtKGxvb3BfcGxheWJhY2tfcG9jX3RocmVzaG9sZCwgaW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobG9vcF9wbGF5YmFja19wb2NfdGhyZXNob2xkLCAiXG4gbG9vcF9wbGF5YmFja19wb2NfdGhyZXNob2xkXG4iKTsKKworbW9kdWxlX3BhcmFtKHBvY190aHJlc2hvbGQsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBvY190aHJlc2hvbGQsICJcbiBwb2NfdGhyZXNob2xkXG4iKTsKKworbW9kdWxlX3BhcmFtKGZvcmNlX2NvbmZpZ19mZW5jZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2NvbmZpZ19mZW5jZSwgIlxuIGZvcmNlIGVuYWJsZSBmZW5jZVxuIik7CisKK21vZHVsZV9wYXJhbShhZGp1c3RfZHBiX3NpemUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhhZGp1c3RfZHBiX3NpemUsICJcbiBhZGp1c3QgZHBiIHNpemVcbiIpOworCittb2R1bGVfaW5pdChhbW12ZGVjX2gyNjRfZHJpdmVyX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGFtbXZkZWNfaDI2NF9kcml2ZXJfcmVtb3ZlX21vZHVsZSk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQU1MT0dJQyBIMjY0IFZpZGVvIERlY29kZXIgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL2gyNjUvTWFrZWZpbGUgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL2gyNjUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFhMzdmNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlcl92NGwvaDI2NS9NYWtlZmlsZQpAQCAtMCwwICsxLDIgQEAKK29iai0kKENPTkZJR19BTUxPR0lDX01FRElBX1ZERUNfSDI2NSkgKz0gYW12ZGVjX2gyNjVfdjRsLm8KK2FtdmRlY19oMjY1X3Y0bC1vYmpzICs9IHZoMjY1Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlcl92NGwvaDI2NS92aDI2NS5jIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC9oMjY1L3ZoMjY1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MzNmZhYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlcl92NGwvaDI2NS92aDI2NS5jCkBAIC0wLDAgKzEsMTU2ODcgQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvYW1wb3J0cy92aDI2NS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisjZGVmaW5lIERFQlVHCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL2Ftc3RyZWFtLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy92Zm9ybWF0Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9mcmFtZV9zeW5jL3B0c3NlcnYuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NhbnZhcy9jYW52YXMuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWVfcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWVfcmVjZWl2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1jb250aWd1b3VzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvdGVlLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC90ZWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC9jbG9jay5oPgorI2luY2x1ZGUgIi4uLy4uLy4uL3N0cmVhbV9pbnB1dC9hbXBvcnRzL2FtcG9ydHNfcHJpdi5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29kZWNfbW0uaD4KKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL2RlY29kZXJfbW11X2JveC5oIgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvZGVjb2Rlcl9ibW11X2JveC5oIgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvY29uZmlnX3BhcnNlci5oIgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvZmlybXdhcmUuaCIKKyNpbmNsdWRlICIuLi8uLi8uLi9jb21tb24vY2hpcHMvZGVjb2Rlcl9jcHVfdmVyX2luZm8uaCIKKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL3ZkZWNfdjRsMl9idWZmZXJfb3BzLmgiCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1tZW0ybWVtLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKworLyoKK3RvIGVuYWJsZSBEViBvZiBmcmFtZSBtb2RlCisjZGVmaW5lIERPTEJZX01FVEFfU1VQUE9SVCBpbiB1Y29kZQorKi8KKworI2RlZmluZSBIRVZDXzhLX0xGVE9GRlNFVF9GSVgKKyNkZWZpbmUgU1VQUE9SVF9MT05HX1RFUk1fUlBTCisKKy8vI2RlZmluZSBDT19NVl9DT01QUkVTUworCisjZGVmaW5lIENPTlNUUkFJTl9NQVhfQlVGX05VTQorCisjZGVmaW5lIFNXQVBfSEVWQ19VQ09ERQorI2RlZmluZSBERVRSRUZJTExfRU5BQkxFCisKKyNkZWZpbmUgQUdBSU5fSEFTX1RIUkVTSE9MRAorLyojZGVmaW5lIFRFU1RfTk9fQlVGKi8KKyNkZWZpbmUgSEVWQ19QSUNfU1RSVUNUX1NVUFBPUlQKKyNkZWZpbmUgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorI2RlZmluZSBVU0VfVU5JTklUX1NFTUEKKworCQkJLyogLmJ1Zl9zaXplID0gMHgxMDAwMDAqMTYsCisJCQkvLzRrMmsgLCAweDEwMDAwMCBwZXIgYnVmZmVyICovCisJCQkvKiA0MDk2eDIzMDQgLCAweDEyMDAwMCBwZXIgYnVmZmVyICovCisjZGVmaW5lIE1QUkVEXzhLX01WX0JVRl9TSVpFCQkoMHgxMjAwMDAqNCkKKyNkZWZpbmUgTVBSRURfNEtfTVZfQlVGX1NJWkUJCSgweDEyMDAwMCkKKyNkZWZpbmUgTVBSRURfTVZfQlVGX1NJWkUJCSgweDNmYzAwKQorCisjZGVmaW5lIE1NVV9DT01QUkVTU19IRUFERVJfU0laRV8xMDgwUCAgMHgxMDAwMAorI2RlZmluZSBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfNEsgIDB4NDgwMDAKKyNkZWZpbmUgTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFXzhLICAweDEyMDAwMAorI2RlZmluZSBEQl9OVU0gMjAKKworI2RlZmluZSBNQVhfRlJBTUVfNEtfTlVNIDB4MTIwMAorI2RlZmluZSBNQVhfRlJBTUVfOEtfTlVNICgoTUFYX0ZSQU1FXzRLX05VTSkgKiA0KQorCisvLyNkZWZpbmUgRlJBTUVfTU1VX01BUF9TSVpFICAoTUFYX0ZSQU1FXzRLX05VTSAqIDQpCisjZGVmaW5lIEgyNjVfTU1VX01BUF9CVUZGRVIgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF83CisKKyNkZWZpbmUgSEVWQ19BU1NJU1RfTU1VX01BUF9BRERSICAgICAgICAgICAgICAgICAgIDB4MzAwOQorCisjZGVmaW5lIEhFVkNfQ01fSEVBREVSX1NUQVJUX0FERFIgICAgICAgICAgICAgICAgICAweDM2MjgKKyNkZWZpbmUgSEVWQ19TQU9fTU1VX1ZIMV9BRERSICAgICAgICAgICAgICAgICAgICAgIDB4MzYzYgorI2RlZmluZSBIRVZDX1NBT19NTVVfVkgwX0FERFIgICAgICAgICAgICAgICAgICAgICAgMHgzNjNhCisKKyNkZWZpbmUgSEVWQ19EQkxLX0NGR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzUwYgorI2RlZmluZSBIRVZDRF9NUFBfREVDT01QX0FYSVVSR19DVEwgICAgICAgICAgICAgICAgMHgzNGM3CisjZGVmaW5lIFNXQVBfSEVWQ19PRkZTRVQgKDMgKiAweDEwMDApCisKKyNkZWZpbmUgTUVNX05BTUUgImNvZGVjXzI2NSIKKy8qICNpbmNsdWRlIDxtYWNoL2FtX3JlZ3MuaD4gKi8KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL3ZkZWNfcmVnLmg+CisKKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL3ZkZWMuaCIKKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL2FtdmRlYy5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdmlkZW9fc2luay92aWRlby5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29uZmlncy5oPgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvdmRlY19mZWF0dXJlLmgiCisKKyNkZWZpbmUgU0VORF9MTUVNX1dJVEhfUlBNCisjZGVmaW5lIFNVUFBPUlRfMTBCSVQKKy8qICNkZWZpbmUgRVJST1JfSEFORExFX0RFQlVHICovCisKKyNpZm5kZWYgU1RBVF9LVEhSRUFECisjZGVmaW5lIFNUQVRfS1RIUkVBRCAweDQwCisjZW5kaWYKKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKyNkZWZpbmUgTUFYX0RFQ09ERV9JTlNUQU5DRV9OVU0gICAgIDkKKyNkZWZpbmUgTVVMVElfRFJJVkVSX05BTUUgImFtbXZkZWNfaDI2NV92NGwiCisjZW5kaWYKKyNkZWZpbmUgRFJJVkVSX05BTUUgImFtdmRlY19oMjY1X3Y0bCIKKyNkZWZpbmUgRFJJVkVSX0hFQURFUl9OQU1FICJhbXZkZWNfaDI2NV9oZWFkZXIiCisKKyNkZWZpbmUgUFVUX0lOVEVSVkFMICAgICAgICAoSFovMTAwKQorI2RlZmluZSBFUlJPUl9TWVNURU1fUkVTRVRfQ09VTlQgICAyMDAKKworI2RlZmluZSBQVFNfTk9STUFMICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUFRTX05PTkVfUkVGX1VTRV9EVVJBVElPTiAxCisKKyNkZWZpbmUgUFRTX01PREVfU1dJVENISU5HX1RIUkVTSE9MRCAgICAgICAgICAgMworI2RlZmluZSBQVFNfTU9ERV9TV0lUQ0hJTkdfUkVDT1ZFUllfVEhSRUFTSE9MRCAzCisKKyNkZWZpbmUgRFVSMlBUUyh4KSAoKHgpKjkwLzk2KQorCisjZGVmaW5lIE1BWF9TSVpFXzhLICg4MTkyICogNDYwOCkKKyNkZWZpbmUgTUFYX1NJWkVfNEsgKDQwOTYgKiAyMzA0KQorI2RlZmluZSBNQVhfU0laRV8ySyAoMTkyMCAqIDEwODgpCisKKyNkZWZpbmUgSVNfOEtfU0laRSh3LCBoKSAgKCgodykgKiAoaCkpID4gTUFYX1NJWkVfNEspCisjZGVmaW5lIElTXzRLX1NJWkUodywgaCkgICgoKHcpICogKGgpKSA+ICgxOTIwKjEwODgpKQorCisjZGVmaW5lIFNFSV9Vc2VyRGF0YUlUVV9UX1QzNQk0CisjZGVmaW5lIElOVkFMSURfSURYIC0xICAvKiBJbnZhbGlkIGJ1ZmZlciBpbmRleC4qLworCitzdGF0aWMgc3RydWN0IHNlbWFwaG9yZSBoMjY1X3NlbWE7CisKK3N0cnVjdCBoZXZjX3N0YXRlX3M7CitzdGF0aWMgaW50IGhldmNfcHJpbnQoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwlpbnQgZGVidWdfZmxhZywgY29uc3QgY2hhciAqZm10LCAuLi4pOworc3RhdGljIGludCBoZXZjX3ByaW50X2NvbnQoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwlpbnQgZGVidWdfZmxhZywgY29uc3QgY2hhciAqZm10LCAuLi4pOworc3RhdGljIGludCB2aDI2NV92Zl9zdGF0ZXMoc3RydWN0IHZmcmFtZV9zdGF0ZXMgKnN0YXRlcywgdm9pZCAqKTsKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZoMjY1X3ZmX3BlZWsodm9pZCAqKTsKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZoMjY1X3ZmX2dldCh2b2lkICopOworc3RhdGljIHZvaWQgdmgyNjVfdmZfcHV0KHN0cnVjdCB2ZnJhbWVfcyAqLCB2b2lkICopOworc3RhdGljIGludCB2aDI2NV9ldmVudF9jYihpbnQgdHlwZSwgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCitzdGF0aWMgaW50IHZtaDI2NV9zdG9wKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpOworc3RhdGljIHMzMiB2aDI2NV9pbml0KHN0cnVjdCB2ZGVjX3MgKnZkZWMpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcnVuX3JlYWR5KHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHVuc2lnbmVkIGxvbmcgbWFzayk7CitzdGF0aWMgdm9pZCByZXNldF9wcm9jZXNzX3RpbWUoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Yyk7CitzdGF0aWMgdm9pZCBzdGFydF9wcm9jZXNzX3RpbWUoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Yyk7CitzdGF0aWMgdm9pZCByZXN0YXJ0X3Byb2Nlc3NfdGltZShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKTsKK3N0YXRpYyB2b2lkIHRpbWVvdXRfcHJvY2VzcyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKTsKKyNlbHNlCitzdGF0aWMgczMyIHZoMjY1X2luaXQoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Yyk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIHZoMjY1X3Byb3RfaW5pdChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKTsKK3N0YXRpYyBpbnQgdmgyNjVfbG9jYWxfaW5pdChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKTsKK3N0YXRpYyB2b2lkIHZoMjY1X2NoZWNrX3RpbWVyX2Z1bmMoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKTsKK3N0YXRpYyB2b2lkIGNvbmZpZ19kZWNvZGVfbW9kZShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKTsKKworc3RhdGljIGNvbnN0IGNoYXIgdmgyNjVfZGVjX2lkW10gPSAidmgyNjUtZGV2IjsKKworI2RlZmluZSBQUk9WSURFUl9OQU1FICAgImRlY29kZXIuaDI2NSIKKyNkZWZpbmUgTVVMVElfSU5TVEFOQ0VfUFJPVklERVJfTkFNRSAgICAidmRlYy5oMjY1IgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHZmcmFtZV9vcGVyYXRpb25zX3MgdmgyNjVfdmZfcHJvdmlkZXIgPSB7CisJLnBlZWsgPSB2aDI2NV92Zl9wZWVrLAorCS5nZXQgPSB2aDI2NV92Zl9nZXQsCisJLnB1dCA9IHZoMjY1X3ZmX3B1dCwKKwkuZXZlbnRfY2IgPSB2aDI2NV9ldmVudF9jYiwKKwkudmZfc3RhdGVzID0gdmgyNjVfdmZfc3RhdGVzLAorfTsKKworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcHJvdmlkZXJfcyB2aDI2NV92Zl9wcm92OworCitzdGF0aWMgdTMyIGJpdF9kZXB0aF9sdW1hOworc3RhdGljIHUzMiBiaXRfZGVwdGhfY2hyb21hOworc3RhdGljIHUzMiB2aWRlb19zaWduYWxfdHlwZTsKK3N0YXRpYyBpbnQgc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCA9IDB4ODAwMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVjb2RlX3RpbWVvdXRfdmFsID0gMjAwOworCitzdGF0aWMgdTMyIHJ1bl9yZWFkeV9taW5fYnVmX251bSA9IDE7CitzdGF0aWMgdTMyIGRpc2FibGVfaXBfbW9kZTsKK3N0YXRpYyB1MzIgcHJpbnRfbGN1X2Vycm9yID0gMTsKKy8qZGF0YV9yZXNlbmRfcG9saWN5OgorCWJpdCAwLCBzdHJlYW0gYmFzZSByZXNlbmQgZGF0YSB3aGVuIGRlY29kaW5nIGJ1ZiBlbXB0eQorKi8KK3N0YXRpYyB1MzIgZGF0YV9yZXNlbmRfcG9saWN5ID0gMTsKK3N0YXRpYyBpbnQgcG9jX251bV9tYXJnaW4gPSAxMDAwOworc3RhdGljIGludCBwb2NfZXJyb3JfbGltaXQgPSAzMDsKKworc3RhdGljIHUzMiBkaXJ0eV90aW1lX3RocmVzaG9sZCA9IDIwMDA7CitzdGF0aWMgdTMyIGRpcnR5X2NvdW50X3RocmVzaG9sZCA9IDIwMDsKK3N0YXRpYyB1MzIgZGlydHlfYnVmZmVyc2l6ZV90aHJlc2hvbGQgPSAweDgwMDAwMDsKKworCisjZGVmaW5lIFZJREVPX1NJR05BTF9UWVBFX0FWQUlMQUJMRV9NQVNLCTB4MjAwMDAwMDAKKy8qCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZpZGVvX2Zvcm1hdF9uYW1lc1tdID0geworCSJjb21wb25lbnQiLCAiUEFMIiwgIk5UU0MiLCAiU0VDQU0iLAorCSJNQUMiLCAidW5zcGVjaWZpZWQiLCAidW5zcGVjaWZpZWQiLCAidW5zcGVjaWZpZWQiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNvbG9yX3ByaW1hcmllc19uYW1lc1tdID0geworCSJ1bmtub3duIiwgImJ0NzA5IiwgInVuZGVmIiwgInVua25vd24iLAorCSJidDQ3MG0iLCAiYnQ0NzBiZyIsICJzbXB0ZTE3MG0iLCAic21wdGUyNDBtIiwKKwkiZmlsbSIsICJidDIwMjAiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRyYW5zZmVyX2NoYXJhY3RlcmlzdGljc19uYW1lc1tdID0geworCSJ1bmtub3duIiwgImJ0NzA5IiwgInVuZGVmIiwgInVua25vd24iLAorCSJidDQ3MG0iLCAiYnQ0NzBiZyIsICJzbXB0ZTE3MG0iLCAic21wdGUyNDBtIiwKKwkibGluZWFyIiwgImxvZzEwMCIsICJsb2czMTYiLCAiaWVjNjE5NjYtMi00IiwKKwkiYnQxMzYxZSIsICJpZWM2MTk2Ni0yLTEiLCAiYnQyMDIwLTEwIiwgImJ0MjAyMC0xMiIsCisJInNtcHRlLXN0LTIwODQiLCAic21wdGUtc3QtNDI4IgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtYXRyaXhfY29lZmZzX25hbWVzW10gPSB7CisJIkdCUiIsICJidDcwOSIsICJ1bmRlZiIsICJ1bmtub3duIiwKKwkiZmNjIiwgImJ0NDcwYmciLCAic21wdGUxNzBtIiwgInNtcHRlMjQwbSIsCisJIllDZ0NvIiwgImJ0MjAyMG5jIiwgImJ0MjAyMGMiCit9OworKi8KKyNpZmRlZiBTVVBQT1JUXzEwQklUCisjZGVmaW5lIEhFVkNfQ01fQk9EWV9TVEFSVF9BRERSICAgICAgICAgICAgICAgICAgICAweDM2MjYKKyNkZWZpbmUgSEVWQ19DTV9CT0RZX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgIDB4MzYyNworI2RlZmluZSBIRVZDX0NNX0hFQURFUl9MRU5HVEggICAgICAgICAgICAgICAgICAgICAgMHgzNjI5CisjZGVmaW5lIEhFVkNfQ01fSEVBREVSX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAweDM2MmIKKyNkZWZpbmUgSEVWQ19TQU9fQ1RSTDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzYyZAorI2RlZmluZSBMT1NMRVNTX0NPTVBSRVNTX01PREUKKy8qIERPVUJMRV9XUklURV9NT0RFIGlzIGVuYWJsZWQgb25seSB3aGVuIE5WMjEgOCBiaXQgb3V0cHV0IGlzIG5lZWRlZCAqLworLyogZG91YmxlX3dyaXRlX21vZGU6CisgKgkwLCBubyBkb3VibGUgd3JpdGU7CisgKgkxLCAxOjEgcmF0aW87CisgKgkyLCAoMS80KTooMS80KSByYXRpbzsKKyAqCTMsICgxLzQpOigxLzQpIHJhdGlvLCB3aXRoIGJvdGggY29tcHJlc3NlZCBmcmFtZSBpbmNsdWRlZAorICoJNCwgKDEvMik6KDEvMikgcmF0aW87CisgKgk1LCAoMS8yKTooMS8yKSByYXRpbywgd2l0aCBib3RoIGNvbXByZXNzZWQgZnJhbWUgaW5jbHVkZWQKKyAqCTgsICgxLzgpOigxLzgpIHJhdGlvLCAgZnJvbSB0NworICoJMHgxMCwgZG91YmxlIHdyaXRlIG9ubHkKKyAqCTB4MTAwLCBpZiA+IDEwODBwLHVzZSBtb2RlIDQsZWxzZSB1c2UgbW9kZSAxOworICoJMHgyMDAsIGlmID4gMTA4MHAsdXNlIG1vZGUgMixlbHNlIHVzZSBtb2RlIDE7CisgKgkweDMwMCwgaWYgPiA3MjBwLCB1c2UgbW9kZSA0LCBlbHNlIHVzZSBtb2RlIDE7CisgKgkweDEwMDAsaWYgPiAxMDgwcCx1c2UgbW9kZSAzLCBlbHNlIGlmID4gOTYwKjU0MCwgdXNlIG1vZGUgNCwgZWxzZSB1c2UgbW9kZSAxOworICovCitzdGF0aWMgdTMyIGRvdWJsZV93cml0ZV9tb2RlOworCisvKiNkZWZpbmUgREVDT01QX0hFQURSX1NVUkdFTlQqLworCitzdGF0aWMgdTMyIG1lbV9tYXBfbW9kZTsgLyogMDpsaW5lYXIgMTozMngzMiAyOjY0eDMyIDsgbThiYWJ5IHRlc3QxOTAyICovCitzdGF0aWMgdTMyIGVuYWJsZV9tZW1fc2F2aW5nID0gMTsKK3N0YXRpYyB1MzIgd29ya2Fyb3VuZF9lbmFibGU7CitzdGF0aWMgdTMyIGZvcmNlX3dfaDsKKyNlbmRpZgorc3RhdGljIHUzMiBmb3JjZV9mcHM7CitzdGF0aWMgdTMyIHB0c191bnN0YWJsZTsKKyNkZWZpbmUgSDI2NV9ERUJVR19CVUZNR1IgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBIMjY1X0RFQlVHX0JVRk1HUl9NT1JFICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEgyNjVfREVCVUdfREVUQUlMICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgSDI2NV9ERUJVR19SRUcgICAgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBIMjY1X0RFQlVHX01BTl9TRUFSQ0hfTkFMICAgICAgICAgICAweDEwCisjZGVmaW5lIEgyNjVfREVCVUdfTUFOX1NLSVBfTkFMICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgSDI2NV9ERUJVR19ESVNQTEFZX0NVUl9GUkFNRSAgICAgICAgMHg0MAorI2RlZmluZSBIMjY1X0RFQlVHX0ZPUkNFX0NMSyAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIEgyNjVfREVCVUdfU0VORF9QQVJBTV9XSVRIX1JFRyAgICAgIDB4MTAwCisjZGVmaW5lIEgyNjVfREVCVUdfTk9fRElTUExBWSAgICAgICAgICAgICAgIDB4MjAwCisjZGVmaW5lIEgyNjVfREVCVUdfRElTQ0FSRF9OQUwgICAgICAgICAgICAgIDB4NDAwCisjZGVmaW5lIEgyNjVfREVCVUdfT1VUX1BUUyAgICAgICAgICAgICAgICAgIDB4ODAwCisjZGVmaW5lIEgyNjVfREVCVUdfRFVNUF9QSUNfTElTVCAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBIMjY1X0RFQlVHX1BSSU5UX1NFSQkJICAgICAgICAweDIwMDAKKyNkZWZpbmUgSDI2NV9ERUJVR19QSUNfU1RSVUNUCQkJCTB4NDAwMAorI2RlZmluZSBIMjY1X0RFQlVHX0hBU19BVVhfSU5fU0xJQ0UJCQkweDgwMDAKKyNkZWZpbmUgSDI2NV9ERUJVR19ESVNfTE9DX0VSUk9SX1BST0MgICAgICAgMHgxMDAwMAorI2RlZmluZSBIMjY1X0RFQlVHX0RJU19TWVNfRVJST1JfUFJPQyAgICAgICAweDIwMDAwCisjZGVmaW5lIEgyNjVfTk9fQ0hBTkdfREVCVUdfRkxBR19JTl9DT0RFICAgIDB4NDAwMDAKKyNkZWZpbmUgSDI2NV9ERUJVR19UUklHX1NMSUNFX1NFR01FTlRfUFJPQyAgMHg4MDAwMAorI2RlZmluZSBIMjY1X0RFQlVHX0hXX1JFU0VUICAgICAgICAgICAgICAgICAweDEwMDAwMAorI2RlZmluZSBIMjY1X0NGR19DQU5WQVNfSU5fREVDT0RFICAgICAgICAgICAweDIwMDAwMAorI2RlZmluZSBIMjY1X0RFQlVHX0RWICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMAorI2RlZmluZSBIMjY1X0RFQlVHX05PX0VPU19TRUFSQ0hfRE9ORSAgICAgICAweDgwMDAwMAorI2RlZmluZSBIMjY1X0RFQlVHX05PVF9VU0VfTEFTVF9ESVNQQlVGICAgICAweDEwMDAwMDAKKyNkZWZpbmUgSDI2NV9ERUJVR19JR05PUkVfQ09ORk9STUFOQ0VfV0lORE9XCTB4MjAwMDAwMAorI2RlZmluZSBIMjY1X0RFQlVHX1dBSVRfREVDT0RFX0RPTkVfV0hFTl9TVE9QICAgMHg0MDAwMDAwCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorI2RlZmluZSBQUklOVF9GTEFHX0VSUk9SCQkweDAKKyNkZWZpbmUgSUdOT1JFX1BBUkFNX0ZST01fQ09ORklHCTB4MDgwMDAwMDAKKyNkZWZpbmUgUFJJTlRfRlJBTUVCQVNFX0RBVEEJCTB4MTAwMDAwMDAKKyNkZWZpbmUgUFJJTlRfRkxBR19WREVDX1NUQVRVUwkJMHgyMDAwMDAwMAorI2RlZmluZSBQUklOVF9GTEFHX1ZERUNfREVUQUlMCQkweDQwMDAwMDAwCisjZGVmaW5lIFBSSU5UX0ZMQUdfVjRMX0RFVEFJTAkJMHg4MDAwMDAwMAorI2VuZGlmCisKKyNkZWZpbmUgQlVGX1BPT0xfU0laRQkzMgorI2RlZmluZSBNQVhfQlVGX05VTSAyNAorI2RlZmluZSBNQVhfUkVGX1BJQ19OVU0gMjQKKyNkZWZpbmUgTUFYX1JFRl9BQ1RJVkUgIDE2CisKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisjZGVmaW5lIEJNTVVfTUFYX0JVRkZFUlMgKEJVRl9QT09MX1NJWkUgKyAxKQorI2RlZmluZSBWRl9CVUZGRVJfSURYKG4pCShuKQorI2RlZmluZSBCTU1VX1dPUktTUEFDRV9JRAkoQlVGX1BPT0xfU0laRSkKKyNlbHNlCisjZGVmaW5lIEJNTVVfTUFYX0JVRkZFUlMgKEJVRl9QT09MX1NJWkUgKyAxICsgTUFYX1JFRl9QSUNfTlVNKQorI2RlZmluZSBWRl9CVUZGRVJfSURYKG4pCShuKQorI2RlZmluZSBCTU1VX1dPUktTUEFDRV9JRAkoQlVGX1BPT0xfU0laRSkKKyNkZWZpbmUgTVZfQlVGRkVSX0lEWChuKSAoQlVGX1BPT0xfU0laRSArIDEgKyBuKQorI2VuZGlmCisKKyNkZWZpbmUgSEVWQ19NVl9JTkZPICAgMHgzMTBkCisjZGVmaW5lIEhFVkNfUVBfSU5GTyAgIDB4MzEzNworI2RlZmluZSBIRVZDX1NLSVBfSU5GTyAweDMxMzYKKworY29uc3QgdTMyIGgyNjVfdmVyc2lvbiA9IDIwMTYwMjEwMTsKK3N0YXRpYyB1MzIgZGVidWdfbWFzayA9IDB4ZmZmZmZmZmY7CitzdGF0aWMgdTMyIGxvZ19tYXNrOworc3RhdGljIHUzMiBkZWJ1ZzsKK3N0YXRpYyB1MzIgcmFkcjsKK3N0YXRpYyB1MzIgcnZhbDsKK3N0YXRpYyB1MzIgZGJnX2NtZDsKK3N0YXRpYyB1MzIgZHVtcF9uYWw7CitzdGF0aWMgdTMyIGRiZ19za2lwX2RlY29kZV9pbmRleDsKKy8qCisgKiBiaXQgMH4zLCBmb3IgSEVWQ0RfSVBQX0FYSUlGX0NPTkZJRyBlbmRpYW4gY29uZmlnCisgKiBiaXQgOH4yMywgZm9yIEhFVkNfU0FPX0NUUkwxIGVuZGlhbiBjb25maWcKKyAqLworc3RhdGljIHUzMiBlbmRpYW47CisjZGVmaW5lIEhFVkNfQ09ORklHX0JJR19FTkRJQU4gICAgICgoMHg4ODAgPDwgOCkgfCAweDgpCisjZGVmaW5lIEhFVkNfQ09ORklHX0xJVFRMRV9FTkRJQU4gICgoMHhmZjAgPDwgOCkgfCAweGYpCisKKyNpZmRlZiBFUlJPUl9IQU5ETEVfREVCVUcKK3N0YXRpYyB1MzIgZGJnX25hbF9za2lwX2ZsYWc7CisJCS8qIGJpdFswXSwgc2tpcCB2cHM7IGJpdFsxXSwgc2tpcCBzcHM7IGJpdFsyXSwgc2tpcCBwcHMgKi8KK3N0YXRpYyB1MzIgZGJnX25hbF9za2lwX2NvdW50OworI2VuZGlmCisvKmZvciBkZWJ1ZyovCitzdGF0aWMgdTMyIGZvcmNlX2J1ZnNwZWM7CisKKy8qCisJdWRlYnVnX2ZsYWc6CisJYml0IDAsIGVuYWJsZSB1Y29kZSBwcmludAorCWJpdCAxLCBlbmFibGUgdWNvZGUgZGV0YWlsIHByaW50CisJYml0IFszMToxNl0gbm90IDAsIHBvcyB0byBkdW1wIGxtZW0KKwkJYml0IDIsIHBvcCBiaXRzIHRvIGxtZW0KKwkJYml0IFsxMTo4XSwgcHJlLXBvcCBiaXRzIGZvciBhbGlnbm1lbnQgKHdoZW4gYml0IDIgaXMgMSkKKyovCitzdGF0aWMgdTMyIHVkZWJ1Z19mbGFnOworLyoKKwl3aGVuIHVkZWJ1Z19mbGFnWzE6MF0gaXMgbm90IDAKKwl1ZGVidWdfcGF1c2VfcG9zIG5vdCAwLAorCQlwYXVzZSBwb3NpdGlvbgorKi8KK3N0YXRpYyB1MzIgdWRlYnVnX3BhdXNlX3BvczsKKy8qCisJd2hlbiB1ZGVidWdfZmxhZ1sxOjBdIGlzIG5vdCAwCisJYW5kIHVkZWJ1Z19wYXVzZV9wb3MgaXMgbm90IDAsCisJCXBhdXNlIG9ubHkgd2hlbiBERUJVR19SRUcyIGlzIGVxdWFsIHRvIHRoaXMgdmFsCisqLworc3RhdGljIHUzMiB1ZGVidWdfcGF1c2VfdmFsOworCitzdGF0aWMgdTMyIHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4OworCitzdGF0aWMgdTMyIGRlY29kZV9waWNfYmVnaW47CitzdGF0aWMgdWludCBzbGljZV9wYXJzZV9iZWdpbjsKK3N0YXRpYyB1MzIgc3RlcDsKK3N0YXRpYyBib29sIGlzX3Jlc2V0OworCisjaWZkZWYgQ09OU1RSQUlOX01BWF9CVUZfTlVNCitzdGF0aWMgdTMyIHJ1bl9yZWFkeV9tYXhfdmZfb25seV9udW07CitzdGF0aWMgdTMyIHJ1bl9yZWFkeV9kaXNwbGF5X3FfbnVtOworCS8qMDogbm90IGNoZWNrCisJICAweGZmOiB3b3JrX3BpY19udW0KKwkgICovCitzdGF0aWMgdTMyIHJ1bl9yZWFkeV9tYXhfYnVmX251bSA9IDB4ZmY7CisjZW5kaWYKKworc3RhdGljIHUzMiBkeW5hbWljX2J1Zl9udW1fbWFyZ2luID0gNzsKK3N0YXRpYyB1MzIgYnVmX2FsbG9jX3dpZHRoOworc3RhdGljIHUzMiBidWZfYWxsb2NfaGVpZ2h0OworCitzdGF0aWMgdTMyIG1heF9idWZfbnVtID0gMTY7CitzdGF0aWMgdTMyIGJ1Zl9hbGxvY19zaXplOworLypzdGF0aWMgdTMyIHJlX2NvbmZpZ19waWNfZmxhZzsqLworLyoKKyAqYml0WzBdOiAwLAorICpiaXRbMV06IDAsIGFsd2F5cyByZWxlYXNlIGNtYSBidWZmZXIgd2hlbiBzdG9wCisgKmJpdFsxXTogMSwgbmV2ZXIgcmVsZWFzZSBjbWEgYnVmZmVyIHdoZW4gc3RvcAorICpiaXRbMF06IDEsIHdoZW4gc3RvcCwgcmVsZWFzZSBjbWEgYnVmZmVyIGlmIGJsYWNrb3V0IGlzIDE7CisgKmRvIG5vdCByZWxlYXNlIGNtYSBidWZmZXIgaXMgYmxhY2tvdXQgaXMgbm90IDEKKyAqCisgKmJpdFsyXTogMCwgd2hlbiBzdGFydCBkZWNvZGluZywgY2hlY2sgY3VycmVudCBkaXNwbGF5ZWQgYnVmZmVyCisgKgkgKG9ubHkgZm9yIGJ1ZmZlciBkZWNvZGVkIGJ5IGgyNjUpIGlmIGJsYWNrb3V0IGlzIDAKKyAqCSAxLCBkbyBub3QgY2hlY2sgY3VycmVudCBkaXNwbGF5ZWQgYnVmZmVyCisgKgorICpiaXRbM106IDEsIGlmIGJsYWNrb3V0IGlzIG5vdCAxLCBkbyBub3QgcmVsZWFzZSBjdXJyZW50CisgKgkJCWRpc3BsYXllZCBjbWEgYnVmZmVyIGFsd2F5cy4KKyAqLworLyogc2V0IHRvIDEgZm9yIGZhc3QgcGxheTsKKyAqCXNldCB0byA4IGZvciBvdGhlciBjYXNlIG9mICJrZWVwIGxhc3QgZnJhbWUiCisgKi8KK3N0YXRpYyB1MzIgYnVmZmVyX21vZGUgPSAxOworCisvKiBidWZmZXJfbW9kZV9kYmc6IGRlYnVnIG9ubHkqLworc3RhdGljIHUzMiBidWZmZXJfbW9kZV9kYmcgPSAweGZmZmYwMDAwOworLyoqLworLyoKKyAqYml0WzE6MF1QQl9za2lwX21vZGU6IDAsIHN0YXJ0IGRlY29kaW5nIGF0IGJlZ2luOworICoxLCBzdGFydCBkZWNvZGluZyBhZnRlciBmaXJzdCBJOworICoyLCBvbmx5IGRlY29kZSBhbmQgZGlzcGxheSBub25lIGVycm9yIHBpY3R1cmU7CisgKjMsIHN0YXJ0IGRlY29kaW5nIGFuZCBkaXNwbGF5IGFmdGVyIElEUixldGMKKyAqYml0WzMxOjE2XSBQQl9za2lwX2NvdW50X2FmdGVyX2RlY29kaW5nIChkZWNvZGluZyBidXQgbm90IGRpc3BsYXkpLAorICpvbmx5IGZvciBtb2RlIDAgYW5kIDEuCisgKi8KK3N0YXRpYyB1MzIgbmFsX3NraXBfcG9saWN5ID0gMjsKKworLyoKKyAqYml0IDAsIDE6IG9ubHkgZGlzcGxheSBJIHBpY3R1cmU7CisgKmJpdCAxLCAxOiBvbmx5IGRlY29kZSBJIHBpY3R1cmU7CisgKi8KK3N0YXRpYyB1MzIgaV9vbmx5X2ZsYWc7CitzdGF0aWMgdTMyIHNraXBfbmFsX2NvdW50ID0gNTAwOworLyoKK2JpdCAwLCBmYXN0IG91dHB1dCBmaXJzdCBJIHBpY3R1cmUKKyovCitzdGF0aWMgdTMyIGZhc3Rfb3V0cHV0X2VuYWJsZSA9IDE7CisKK3N0YXRpYyB1MzIgZnJtYmFzZV9jb250X2JpdGxldmVsID0gMHg2MDsKKworLyoKK3VzZV9jbWE6IDEsIHVzZSBib3RoIHJlc2VydmVyIG1lbW9yeSBhbmQgY21hIGZvciBidWZmZXJzCisyLCBvbmx5IHVzZSBjbWEgZm9yIGJ1ZmZlcnMKKyovCitzdGF0aWMgdTMyIHVzZV9jbWEgPSAyOworCisjZGVmaW5lIEFVWF9CVUZfQUxJR04oYWRyKSAoKGFkciArIDB4ZikgJiAofjB4ZikpCisvKgorc3RhdGljIHUzMiBwcmVmaXhfYXV4X2J1Zl9zaXplID0gKDE2ICogMTAyNCk7CitzdGF0aWMgdTMyIHN1ZmZpeF9hdXhfYnVmX3NpemU7CisqLworc3RhdGljIHUzMiBwcmVmaXhfYXV4X2J1Zl9zaXplID0gKDEyICogMTAyNCk7CitzdGF0aWMgdTMyIHN1ZmZpeF9hdXhfYnVmX3NpemUgPSAoMTIgKiAxMDI0KTsKKworc3RhdGljIHUzMiBtYXhfZGVjb2RpbmdfdGltZTsKKy8qCisgKmVycm9yIGhhbmRsaW5nCisgKi8KKy8qZXJyb3JfaGFuZGxlX3BvbGljeToKKyAqYml0IDA6IDAsIGF1dG8gc2tpcCBlcnJvcl9za2lwX25hbF9jb3VudCBuYWxzIGJlZm9yZSBlcnJvciByZWNvdmVyeTsKKyAqMSwgc2tpcCBlcnJvcl9za2lwX25hbF9jb3VudCBuYWxzIGJlZm9yZSBlcnJvciByZWNvdmVyeTsKKyAqYml0IDEgKHZhbGlkIG9ubHkgd2hlbiBiaXQwID09IDEpOgorICoxLCB3YWl0IHZwcy9zcHMvcHBzIGFmdGVyIGVycm9yIHJlY292ZXJ5OworICpiaXQgMiAodmFsaWQgb25seSB3aGVuIGJpdDAgPT0gMCk6CisgKjAsIGF1dG8gc2VhcmNoIGFmdGVyIGVycm9yIHJlY292ZXJ5IChoZXZjX3JlY292ZXIoKSBjYWxsZWQpOworICoxLCBtYW51YWwgc2VhcmNoIGFmdGVyIGVycm9yIHJlY292ZXJ5CisgKihjaGFuZ2UgdG8gYXV0byBzZWFyY2ggYWZ0ZXIgZ2V0IElEUjogV1JJVEVfVlJFRyhOQUxfU0VBUkNIX0NUTCwgMHgyKSkKKyAqCisgKmJpdCA0OiAwLCBzZXQgZXJyb3JfbWFyayBhZnRlciByZXNldC9yZWNvdmVyCisgKgkxLCBkbyBub3Qgc2V0IGVycm9yX21hcmsgYWZ0ZXIgcmVzZXQvcmVjb3ZlcgorICoKKyAqYml0IDU6IDAsIGNoZWNrIHRvdGFsIGxjdSBmb3IgZXZlcnkgcGljdHVyZQorICoJMSwgZG8gbm90IGNoZWNrIHRvdGFsIGxjdQorICoKKyAqYml0IDY6IDAsIGRvIG5vdCBjaGVjayBoZWFkIGVycm9yCisgKgkxLCBjaGVjayBoZWFkIGVycm9yCisgKgorICpiaXQgNzogMCwgYWxsb3cgdG8gcHJpbnQgb3ZlciBkZWNvZGUKKyAqICAgICAgIDEsIE5PVCBhbGxvdyB0byBwcmludCBvdmVyIGRlY29kZQorICoKKyAqYml0IDg6IDAsIHVzZSBpbnRlcmxhY2UgcG9saWN5CisgKiAgICAgICAxLCBOT1QgdXNlIGludGVybGFjZSBwb2xpY3kKKyAqYml0IDk6IDAsIGRpc2NhcmQgZGlydHkgZGF0YSBvbiBwbGF5YmFjayBzdGFydAorICogICAgICAgMSwgZG8gbm90IGRpc2NhcmQgZGlydHkgZGF0YSBvbiBwbGF5YmFjayBzdGFydAorICoKKyAqLworCitzdGF0aWMgdTMyIGVycm9yX2hhbmRsZV9wb2xpY3k7CitzdGF0aWMgdTMyIGVycm9yX3NraXBfbmFsX2NvdW50ID0gNjsKK3N0YXRpYyB1MzIgZXJyb3JfaGFuZGxlX3RocmVzaG9sZCA9IDMwOworc3RhdGljIHUzMiBlcnJvcl9oYW5kbGVfbmFsX3NraXBfdGhyZXNob2xkID0gMTA7CitzdGF0aWMgdTMyIGVycm9yX2hhbmRsZV9zeXN0ZW1fdGhyZXNob2xkID0gMzA7CitzdGF0aWMgdTMyIGludGVybGFjZV9lbmFibGUgPSAxOworc3RhdGljIHUzMiBmcl9oaW50X3N0YXR1czsKKworCS8qCisJICpwYXJzZXJfc2VpX2VuYWJsZToKKwkgKiAgYml0IDAsIHNlaTsKKwkgKiAgYml0IDEsIHNlaV9zdWZmaXggKGZpbGwgYXV4IGJ1ZikKKwkgKiAgYml0IDIsIGZpbGwgc2VpIHRvIGF1eCBidWYgKHdoZW4gYml0IDAgaXMgMSkKKwkgKiAgYml0IDgsIGRlYnVnIGZsYWcKKwkgKi8KK3N0YXRpYyB1MzIgcGFyc2VyX3NlaV9lbmFibGU7CitzdGF0aWMgdTMyIHBhcnNlcl9kb2xieV92aXNpb25fZW5hYmxlID0gMTsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorc3RhdGljIHUzMiBkb2xieV9tZXRhX3dpdGhfZWw7CitzdGF0aWMgdTMyIGRvbGJ5X2VsX2ZsdXNoX3RoID0gMjsKKyNlbmRpZgorLyogdGhpcyBpcyBvbmx5IGZvciBoMjY1IG1tdSBlbmFibGUgKi8KKworc3RhdGljIHUzMiBtbXVfZW5hYmxlID0gMTsKK3N0YXRpYyB1MzIgbW11X2VuYWJsZV9mb3JjZTsKK3N0YXRpYyB1MzIgd29ya19idWZfc2l6ZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZm9yY2VfZGlzcF9waWNfaW5kZXg7CitzdGF0aWMgdW5zaWduZWQgaW50IGRpc3BfdmZyYW1lX3ZhbHZlX2xldmVsOworc3RhdGljIGludCBwcmVfZGVjb2RlX2J1Zl9sZXZlbCA9IDB4MTAwMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGljX2xpc3RfZGVidWc7CisjaWZkZWYgSEVWQ184S19MRlRPRkZTRVRfRklYCisJLyogcGVyZm9ybWFuY2VfcHJvZmlsZTogYml0IDAsIG11bHRpIHNsaWNlIGluIHVjb2RlCisJKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGVyZm9ybWFuY2VfcHJvZmlsZSA9IDE7CisjZW5kaWYKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCitzdGF0aWMgdW5zaWduZWQgaW50IG1heF9kZWNvZGVfaW5zdGFuY2VfbnVtCisJCQkJPSBNQVhfREVDT0RFX0lOU1RBTkNFX05VTTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVjb2RlX2ZyYW1lX2NvdW50W01BWF9ERUNPREVfSU5TVEFOQ0VfTlVNXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGlzcGxheV9mcmFtZV9jb3VudFtNQVhfREVDT0RFX0lOU1RBTkNFX05VTV07CitzdGF0aWMgdW5zaWduZWQgaW50IG1heF9wcm9jZXNzX3RpbWVbTUFYX0RFQ09ERV9JTlNUQU5DRV9OVU1dOworc3RhdGljIHVuc2lnbmVkIGludCBtYXhfZ2V0X2ZyYW1lX2ludGVydmFsW01BWF9ERUNPREVfSU5TVEFOQ0VfTlVNXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnVuX2NvdW50W01BWF9ERUNPREVfSU5TVEFOQ0VfTlVNXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW5wdXRfZW1wdHlbTUFYX0RFQ09ERV9JTlNUQU5DRV9OVU1dOworc3RhdGljIHVuc2lnbmVkIGludCBub3RfcnVuX3JlYWR5W01BWF9ERUNPREVfSU5TVEFOQ0VfTlVNXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmVmX2ZyYW1lX21hcmtfZmxhZ1tNQVhfREVDT0RFX0lOU1RBTkNFX05VTV0gPQorezEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDF9OworCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfTVVMVElfREVDCitzdGF0aWMgdW5zaWduZWQgY2hhciBnZXRfaWR4KHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorc3RhdGljIHUzMiBkdl90b2dnbGVfcHJvdl9uYW1lOworCitzdGF0aWMgdTMyIGR2X2RlYnVnOworCitzdGF0aWMgdTMyIGZvcmNlX2J5cGFzc19kdmVubDsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKlszOjBdIDA6IGRlZmF1bHQgdXNlIGNvbmZpZyBmcm9tIG9teC4KKyAqICAgICAgMTogZm9yY2UgZW5hYmxlIGZlbmNlLgorICogICAgICAyOiBkaXNhYmxlIGZlbmNlLgorICpbNzo0XSAwOiBmZW5jZSB1c2UgZm9yIGRyaXZlci4KKyAqICAgICAgMTogZmVuY2UgZmQgdXNlIGZvciBhcHAuCisgKi8KK3N0YXRpYyB1MzIgZm9yY2VfY29uZmlnX2ZlbmNlOworCisvKgorICpUaGUgcGFyYW1ldGVyIHNwc19tYXhfZGVjX3BpY19idWZmZXJpbmdfbWludXMxXzArMQorICppbiBTUFMgaXMgdGhlIG1pbmltdW0gRFBCIHNpemUgcmVxdWlyZWQgZm9yIHN0cmVhbQorICoobm90ZTogdGhpcyBwYXJhbWV0ZXIgZG9lcyBub3QgaW5jbHVkZSB0aGUgZnJhbWUKKyAqY3VycmVudGx5IGJlaW5nIGRlY29kZWQpICsxIChkZWNvZGluZyB0aGUgY3VycmVudAorICpmcmFtZSkgKzEgKGRlY29kaW5nIHRoZSBjdXJyZW50IGZyYW1lIHdpbGwgb25seQorICp1cGRhdGUgcmVmcmVuY2UgZnJhbWUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgcmVmZXJlbmNlCisgKnJlbGF0aW9uLCB3aGVuIHRoZSBuZXh0IGZyYW1lIGlzIGRlY29kZWQpCisgKi8KK3N0YXRpYyB1MzIgZGV0ZWN0X3N0dWNrX2J1ZmZlcl9tYXJnaW4gPSAzOworCisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9NVUxUSV9ERUMKKyNkZWZpbmUgZ2V0X2RiZ19mbGFnKGhldmMpICgoZGVidWdfbWFzayAmICgxIDw8IGhldmMtPmluZGV4KSkgPyBkZWJ1ZyA6IDApCisjZGVmaW5lIGdldF9kYmdfZmxhZzIoaGV2YykgKChkZWJ1Z19tYXNrICYgKDEgPDwgZ2V0X2lkeChoZXZjKSkpID8gZGVidWcgOiAwKQorI2RlZmluZSBpc19sb2dfZW5hYmxlKGhldmMpICgobG9nX21hc2sgJiAoMSA8PCBoZXZjLT5pbmRleCkpID8gMSA6IDApCisjZWxzZQorI2RlZmluZSBnZXRfZGJnX2ZsYWcoaGV2YykgZGVidWcKKyNkZWZpbmUgZ2V0X2RiZ19mbGFnMihoZXZjKSBkZWJ1ZworI2RlZmluZSBpc19sb2dfZW5hYmxlKGhldmMpIChsb2dfbWFzayA/IDEgOiAwKQorI2RlZmluZSBnZXRfdmFsaWRfZG91YmxlX3dyaXRlX21vZGUoaGV2YykgZG91YmxlX3dyaXRlX21vZGUKKyNkZWZpbmUgZ2V0X2J1Zl9hbGxvY193aWR0aChoZXZjKSBidWZfYWxsb2Nfd2lkdGgKKyNkZWZpbmUgZ2V0X2J1Zl9hbGxvY19oZWlnaHQoaGV2YykgYnVmX2FsbG9jX2hlaWdodAorI2RlZmluZSBnZXRfZHluYW1pY19idWZfbnVtX21hcmdpbihoZXZjKSBkeW5hbWljX2J1Zl9udW1fbWFyZ2luCisjZW5kaWYKKyNkZWZpbmUgZ2V0X2J1ZmZlcl9tb2RlKGhldmMpIGJ1ZmZlcl9tb2RlCisKKworc3RhdGljIERFRklORV9TUElOTE9DSyhsb2NrKTsKK3N0cnVjdCB0YXNrX3N0cnVjdCAqaDI2NV90YXNrID0gTlVMTDsKKyN1bmRlZiBERUJVR19SRUcKKyNpZmRlZiBERUJVR19SRUcKK3ZvaWQgV1JJVEVfVlJFR19EQkcodW5zaWduZWQgYWRyLCB1bnNpZ25lZCB2YWwpCit7CisJaWYgKGRlYnVnICYgSDI2NV9ERUJVR19SRUcpCisJCXByX2luZm8oIiVzKCV4LCAleClcbiIsIF9fZnVuY19fLCBhZHIsIHZhbCk7CisJV1JJVEVfVlJFRyhhZHIsIHZhbCk7Cit9CisKKyN1bmRlZiBXUklURV9WUkVHCisjZGVmaW5lIFdSSVRFX1ZSRUcgV1JJVEVfVlJFR19EQkcKKyNlbmRpZgorZXh0ZXJuIHUzMiB0cmlja21vZGVfaTsKKworc3RhdGljIERFRklORV9NVVRFWCh2aDI2NV9tdXRleCk7CisKK3N0YXRpYyBERUZJTkVfTVVURVgodmgyNjVfbG9nX211dGV4KTsKKworLy9zdGF0aWMgc3RydWN0IHZkZWNfaW5mbyAqZ3ZzOworCitzdGF0aWMgdTMyIHdpdGhvdXRfZGlzcGxheV9tb2RlOworCitzdGF0aWMgdTMyIG12X2J1Zl9keW5hbWljX2FsbG9jOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKmgyNjUgYnVmZmVyIG1hbmFnZW1lbnQgaW5jbHVkZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworZW51bSBOYWxVbml0VHlwZSB7CisJTkFMX1VOSVRfQ09ERURfU0xJQ0VfVFJBSUxfTiA9IDAsCS8qIDAgKi8KKwlOQUxfVU5JVF9DT0RFRF9TTElDRV9UUkFJTF9SLAkvKiAxICovCisKKwlOQUxfVU5JVF9DT0RFRF9TTElDRV9UU0FfTiwJLyogMiAqLworCS8qIEN1cnJlbnQgbmFtZSBpbiB0aGUgc3BlYzogVFNBX1IgKi8KKwlOQUxfVU5JVF9DT0RFRF9TTElDRV9UTEEsCS8qIDMgKi8KKworCU5BTF9VTklUX0NPREVEX1NMSUNFX1NUU0FfTiwJLyogNCAqLworCU5BTF9VTklUX0NPREVEX1NMSUNFX1NUU0FfUiwJLyogNSAqLworCisJTkFMX1VOSVRfQ09ERURfU0xJQ0VfUkFETF9OLAkvKiA2ICovCisJLyogQ3VycmVudCBuYW1lIGluIHRoZSBzcGVjOiBSQURMX1IgKi8KKwlOQUxfVU5JVF9DT0RFRF9TTElDRV9ETFAsCS8qIDcgKi8KKworCU5BTF9VTklUX0NPREVEX1NMSUNFX1JBU0xfTiwJLyogOCAqLworCS8qIEN1cnJlbnQgbmFtZSBpbiB0aGUgc3BlYzogUkFTTF9SICovCisJTkFMX1VOSVRfQ09ERURfU0xJQ0VfVEZELAkvKiA5ICovCisKKwlOQUxfVU5JVF9SRVNFUlZFRF8xMCwKKwlOQUxfVU5JVF9SRVNFUlZFRF8xMSwKKwlOQUxfVU5JVF9SRVNFUlZFRF8xMiwKKwlOQUxfVU5JVF9SRVNFUlZFRF8xMywKKwlOQUxfVU5JVF9SRVNFUlZFRF8xNCwKKwlOQUxfVU5JVF9SRVNFUlZFRF8xNSwKKworCS8qIEN1cnJlbnQgbmFtZSBpbiB0aGUgc3BlYzogQkxBX1dfTFAgKi8KKwlOQUxfVU5JVF9DT0RFRF9TTElDRV9CTEEsCS8qIDE2ICovCisJLyogQ3VycmVudCBuYW1lIGluIHRoZSBzcGVjOiBCTEFfV19ETFAgKi8KKwlOQUxfVU5JVF9DT0RFRF9TTElDRV9CTEFOVCwJLyogMTcgKi8KKwlOQUxfVU5JVF9DT0RFRF9TTElDRV9CTEFfTl9MUCwJLyogMTggKi8KKwkvKiBDdXJyZW50IG5hbWUgaW4gdGhlIHNwZWM6IElEUl9XX0RMUCAqLworCU5BTF9VTklUX0NPREVEX1NMSUNFX0lEUiwJLyogMTkgKi8KKwlOQUxfVU5JVF9DT0RFRF9TTElDRV9JRFJfTl9MUCwJLyogMjAgKi8KKwlOQUxfVU5JVF9DT0RFRF9TTElDRV9DUkEsCS8qIDIxICovCisJTkFMX1VOSVRfUkVTRVJWRURfMjIsCisJTkFMX1VOSVRfUkVTRVJWRURfMjMsCisKKwlOQUxfVU5JVF9SRVNFUlZFRF8yNCwKKwlOQUxfVU5JVF9SRVNFUlZFRF8yNSwKKwlOQUxfVU5JVF9SRVNFUlZFRF8yNiwKKwlOQUxfVU5JVF9SRVNFUlZFRF8yNywKKwlOQUxfVU5JVF9SRVNFUlZFRF8yOCwKKwlOQUxfVU5JVF9SRVNFUlZFRF8yOSwKKwlOQUxfVU5JVF9SRVNFUlZFRF8zMCwKKwlOQUxfVU5JVF9SRVNFUlZFRF8zMSwKKworCU5BTF9VTklUX1ZQUywJCS8qIDMyICovCisJTkFMX1VOSVRfU1BTLAkJLyogMzMgKi8KKwlOQUxfVU5JVF9QUFMsCQkvKiAzNCAqLworCU5BTF9VTklUX0FDQ0VTU19VTklUX0RFTElNSVRFUiwJLyogMzUgKi8KKwlOQUxfVU5JVF9FT1MsCQkvKiAzNiAqLworCU5BTF9VTklUX0VPQiwJCS8qIDM3ICovCisJTkFMX1VOSVRfRklMTEVSX0RBVEEsCS8qIDM4ICovCisJTkFMX1VOSVRfU0VJLAkJLyogMzkgUHJlZml4IFNFSSAqLworCU5BTF9VTklUX1NFSV9TVUZGSVgsCS8qIDQwIFN1ZmZpeCBTRUkgKi8KKwlOQUxfVU5JVF9SRVNFUlZFRF80MSwKKwlOQUxfVU5JVF9SRVNFUlZFRF80MiwKKwlOQUxfVU5JVF9SRVNFUlZFRF80MywKKwlOQUxfVU5JVF9SRVNFUlZFRF80NCwKKwlOQUxfVU5JVF9SRVNFUlZFRF80NSwKKwlOQUxfVU5JVF9SRVNFUlZFRF80NiwKKwlOQUxfVU5JVF9SRVNFUlZFRF80NywKKwlOQUxfVU5JVF9VTlNQRUNJRklFRF80OCwKKwlOQUxfVU5JVF9VTlNQRUNJRklFRF80OSwKKwlOQUxfVU5JVF9VTlNQRUNJRklFRF81MCwKKwlOQUxfVU5JVF9VTlNQRUNJRklFRF81MSwKKwlOQUxfVU5JVF9VTlNQRUNJRklFRF81MiwKKwlOQUxfVU5JVF9VTlNQRUNJRklFRF81MywKKwlOQUxfVU5JVF9VTlNQRUNJRklFRF81NCwKKwlOQUxfVU5JVF9VTlNQRUNJRklFRF81NSwKKwlOQUxfVU5JVF9VTlNQRUNJRklFRF81NiwKKwlOQUxfVU5JVF9VTlNQRUNJRklFRF81NywKKwlOQUxfVU5JVF9VTlNQRUNJRklFRF81OCwKKwlOQUxfVU5JVF9VTlNQRUNJRklFRF81OSwKKwlOQUxfVU5JVF9VTlNQRUNJRklFRF82MCwKKwlOQUxfVU5JVF9VTlNQRUNJRklFRF82MSwKKwlOQUxfVU5JVF9VTlNQRUNJRklFRF82MiwKKwlOQUxfVU5JVF9VTlNQRUNJRklFRF82MywKKwlOQUxfVU5JVF9JTlZBTElELAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBBbXJpc2MgU29mdHdhcmUgSW50ZXJydXB0ICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgQU1SSVNDX1NUUkVBTV9FTVBUWV9SRVEgMHgwMQorI2RlZmluZSBBTVJJU0NfUEFSU0VSX1JFUSAgICAgICAweDAyCisjZGVmaW5lIEFNUklTQ19NQUlOX1JFUSAgICAgICAgIDB4MDQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBIRVZDX0RFQ19TVEFUVVMgZGVmaW5lICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgSEVWQ19ERUNfSURMRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBIRVZDX05BTF9VTklUX1ZQUyAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIEhFVkNfTkFMX1VOSVRfU1BTICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgSEVWQ19OQUxfVU5JVF9QUFMgICAgICAgICAgICAgICAgICAgIDB4MworI2RlZmluZSBIRVZDX05BTF9VTklUX0NPREVEX1NMSUNFX1NFR01FTlQgICAgMHg0CisjZGVmaW5lIEhFVkNfQ09ERURfU0xJQ0VfU0VHTUVOVF9EQVQgICAgICAgICAweDUKKyNkZWZpbmUgSEVWQ19TTElDRV9ERUNPRElORyAgICAgICAgICAgICAgICAgIDB4NgorI2RlZmluZSBIRVZDX05BTF9VTklUX1NFSSAgICAgICAgICAgICAgICAgICAgMHg3CisjZGVmaW5lIEhFVkNfU0xJQ0VfU0VHTUVOVF9ET05FICAgICAgICAgICAgICAweDgKKyNkZWZpbmUgSEVWQ19OQUxfU0VBUkNIX0RPTkUgICAgICAgICAgICAgICAgIDB4OQorI2RlZmluZSBIRVZDX0RFQ1BJQ19EQVRBX0RPTkUgICAgICAgICAgICAgICAgMHhhCisjZGVmaW5lIEhFVkNfREVDUElDX0RBVEFfRVJST1IgICAgICAgICAgICAgICAweGIKKyNkZWZpbmUgSEVWQ19TRUlfREFUICAgICAgICAgICAgICAgICAgICAgICAgIDB4YworI2RlZmluZSBIRVZDX1NFSV9EQVRfRE9ORSAgICAgICAgICAgICAgICAgICAgMHhkCisjZGVmaW5lIEhFVkNfTkFMX0RFQ09ERV9ET05FCQkJCTB4ZQorI2RlZmluZSBIRVZDX09WRVJfREVDT0RFCQkJCQkweGYKKworI2RlZmluZSBIRVZDX0RBVEFfUkVRVUVTVCAgICAgICAgICAgMHgxMgorCisjZGVmaW5lIEhFVkNfREVDT0RFX0JVRkVNUFRZICAgICAgICAweDIwCisjZGVmaW5lIEhFVkNfREVDT0RFX1RJTUVPVVQgICAgICAgICAweDIxCisjZGVmaW5lIEhFVkNfU0VBUkNIX0JVRkVNUFRZICAgICAgICAweDIyCisjZGVmaW5lIEhFVkNfREVDT0RFX09WRVJfU0laRSAgICAgICAweDIzCisjZGVmaW5lIEhFVkNfREVDT0RFX0JVRkVNUFRZMiAgICAgICAweDI0CisjZGVmaW5lIEhFVkNfRklORF9ORVhUX1BJQ19OQUwJCQkJMHg1MAorI2RlZmluZSBIRVZDX0ZJTkRfTkVYVF9EVkVMX05BTAkJCQkweDUxCisKKyNkZWZpbmUgSEVWQ19EVU1QX0xNRU0JCQkJMHgzMAorCisjZGVmaW5lIEhFVkNfNGsya182MEhaX05PVF9TVVBQT1JUCTB4ODAKKyNkZWZpbmUgSEVWQ19ESVNDQVJEX05BTCAgICAgICAgIDB4ZjAKKyNkZWZpbmUgSEVWQ19BQ1RJT05fREVDX0NPTlQgICAgIDB4ZmQKKyNkZWZpbmUgSEVWQ19BQ1RJT05fRVJST1IgICAgICAgIDB4ZmUKKyNkZWZpbmUgSEVWQ19BQ1RJT05fRE9ORSAgICAgICAgIDB4ZmYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBJbmNsdWRlICJwYXJzZXJfY21kLmgiICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUEFSU0VSX0NNRF9TS0lQX0NGR18wIDB4MDAwMDA5MGIKKworI2RlZmluZSBQQVJTRVJfQ01EX1NLSVBfQ0ZHXzEgMHgxYjE0MTQwZgorCisjZGVmaW5lIFBBUlNFUl9DTURfU0tJUF9DRkdfMiAweDAwMWIxOTEwCisKKyNkZWZpbmUgUEFSU0VSX0NNRF9OVU1CRVIgMzcKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICpoMjY1IGJ1ZmZlciBtYW5hZ2VtZW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisvKiAjZGVmaW5lIEJVRkZFUl9NR1JfT05MWSAqLworLyogI2RlZmluZSBDT05GSUdfSEVWQ19DTEtfRk9SQ0VEX09OICovCisvKiAjZGVmaW5lIEVOQUJMRV9TV0FQX1RFU1QgKi8KKyNkZWZpbmUgICBNQ1JDQ19FTkFCTEUKKyNkZWZpbmUgSU5WQUxJRF9QT0MgMHg4MDAwMDAwMAorCisjZGVmaW5lIEhFVkNfREVDX1NUQVRVU19SRUcgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF8wCisjZGVmaW5lIEhFVkNfUlBNX0JVRkZFUiAgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF8xCisjZGVmaW5lIEhFVkNfU0hPUlRfVEVSTV9SUFMgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF8yCisjZGVmaW5lIEhFVkNfVlBTX0JVRkZFUiAgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF8zCisjZGVmaW5lIEhFVkNfU1BTX0JVRkZFUiAgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF80CisjZGVmaW5lIEhFVkNfUFBTX0JVRkZFUiAgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF81CisjZGVmaW5lIEhFVkNfU0FPX1VQICAgICAgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF82CisjZGVmaW5lIEhFVkNfU1RSRUFNX1NXQVBfQlVGRkVSICAgSEVWQ19BU1NJU1RfU0NSQVRDSF83CisjZGVmaW5lIEhFVkNfU1RSRUFNX1NXQVBfQlVGRkVSMiAgSEVWQ19BU1NJU1RfU0NSQVRDSF84CisjZGVmaW5lIEhFVkNfc2FvX21lbV91bml0ICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF85CisjZGVmaW5lIEhFVkNfU0FPX0FCViAgICAgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9BCisjZGVmaW5lIEhFVkNfc2FvX3ZiX3NpemUgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9CCisjZGVmaW5lIEhFVkNfU0FPX1ZCICAgICAgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9DCisjZGVmaW5lIEhFVkNfU0NBTEVMVVQgICAgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9ECisjZGVmaW5lIEhFVkNfV0FJVF9GTEFHICAgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9FCisjZGVmaW5lIFJQTV9DTURfUkVHICAgICAgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9GCisjZGVmaW5lIExNRU1fRFVNUF9BRFIgICAgICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfRgorI2lmZGVmIEVOQUJMRV9TV0FQX1RFU1QKKyNkZWZpbmUgSEVWQ19TVFJFQU1fU1dBUF9URVNUICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0wKKyNlbmRpZgorCisvKiNkZWZpbmUgSEVWQ19ERUNPREVfUElDX0JFR0lOX1JFRyBIRVZDX0FTU0lTVF9TQ1JBVENIX00qLworLyojZGVmaW5lIEhFVkNfREVDT0RFX1BJQ19OVU1fUkVHICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9OKi8KKyNkZWZpbmUgSEVWQ19ERUNPREVfU0laRQkJSEVWQ19BU1NJU1RfU0NSQVRDSF9OCisJLypkbyBub3QgZGVmaW5lIEVOQUJMRV9TV0FQX1RFU1QqLworI2RlZmluZSBIRVZDX0FVWF9BRFIJCQlIRVZDX0FTU0lTVF9TQ1JBVENIX0wKKyNkZWZpbmUgSEVWQ19BVVhfREFUQV9TSVpFCQlIRVZDX0FTU0lTVF9TQ1JBVENIX00KKworI2RlZmluZSBERUJVR19SRUcxICAgICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0cKKyNkZWZpbmUgREVCVUdfUkVHMiAgICAgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9ICisvKgorICp1Y29kZSBwYXJzZXIvc2VhcmNoIGNvbnRyb2wKKyAqYml0IDA6ICAwLCBoZWFkZXIgYXV0byBwYXJzZTsgMSwgaGVhZGVyIG1hbnVhbCBwYXJzZQorICpiaXQgMTogIDAsIGF1dG8gc2tpcCBmb3Igbm9uZXNlYW1sZXNzIHN0cmVhbTsgMSwgbm8gc2tpcAorICpiaXQgWzM6Ml06IHZhbGlkIHdoZW4gYml0MT09MDsKKyAqMCwgYXV0byBza2lwIG5hbCBiZWZvcmUgZmlyc3QgdnBzL3Nwcy9wcHMvaWRyOworICoxLCBhdXRvIHNraXAgbmFsIGJlZm9yZSBmaXJzdCB2cHMvc3BzL3BwcworICoyLCBhdXRvIHNraXAgbmFsIGJlZm9yZSBmaXJzdCAgdnBzL3Nwcy9wcHMsCisgKglhbmQgbm90IGRlY29kZSB1bnRpbCB0aGUgZmlyc3QgSSBzbGljZSAod2l0aCBzbGljZSBhZGRyZXNzIG9mIDApCisgKgorICozLCBhdXRvIHNraXAgYmVmb3JlIGZpcnN0IEkgc2xpY2UgKG5hbF90eXBlID49MTYgJiYgbmFsX3R5cGU8PTIxKQorICpiaXQgWzE1OjRdIG5hbCBza2lwIGNvdW50ICh2YWxpZCB3aGVuIGJpdDAgPT0gMSAobWFudWFsIG1vZGUpICkKKyAqYml0IFsxNl06IGZvciBOQUxfVU5JVF9FT1Mgd2hlbiBiaXQwIGlzIDA6CisgKgkwLCBzZW5kIFNFQVJDSF9ET05FIHRvIGFybSA7ICAxLCBkbyBub3Qgc2VuZCBTRUFSQ0hfRE9ORSB0byBhcm0KKyAqYml0IFsxN106IGZvciBOQUxfU0VJIHdoZW4gYml0MCBpcyAwOgorICoJMCwgZG8gbm90IHBhcnNlL2ZldGNoIFNFSSBpbiB1Y29kZTsKKyAqCTEsIHBhcnNlL2ZldGNoIFNFSSBpbiB1Y29kZQorICpiaXQgWzE4XTogZm9yIE5BTF9TRUlfU1VGRklYIHdoZW4gYml0MCBpcyAwOgorICoJMCwgZG8gbm90IGZldGNoIE5BTF9TRUlfU1VGRklYIHRvIGF1eCBidWY7CisgKgkxLCBmZXRjaCBOQUxfU0VMX1NVRkZJWCBkYXRhIHRvIGF1eCBidWYKKyAqYml0IFsxOV06CisgKgkwLCBwYXJzZSBOQUxfU0VJIGluIHVjb2RlCisgKgkxLCBmZXRjaCBOQUxfU0VJIHRvIGF1eCBidWYKKyAqYml0IFsyMF06IGZvciBET0xCWV9WSVNJT05fTUVUQQorICoJMCwgZG8gbm90IGZldGNoIERPTEJZX1ZJU0lPTl9NRVRBIHRvIGF1eCBidWYKKyAqCTEsIGZldGNoIERPTEJZX1ZJU0lPTl9NRVRBIHRvIGF1eCBidWYKKyAqLworI2RlZmluZSBOQUxfU0VBUkNIX0NUTCAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfSQorCS8qcmVhZCBvbmx5Ki8KKyNkZWZpbmUgQ1VSX05BTF9VTklUX1RZUEUgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9KCisJLyoKKwlbMTUgOiA4XSBycHNfc2V0X2lkCisJWzcgOiAwXSBzdGFydF9kZWNvZGluZ19mbGFnCisJKi8KKyNkZWZpbmUgSEVWQ19ERUNPREVfSU5GTyAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzEKKwkvKnNldCBiZWZvcmUgc3RhcnQgZGVjb2RlciovCisjZGVmaW5lIEhFVkNfREVDT0RFX01PREUJCUhFVkNfQVNTSVNUX1NDUkFUQ0hfSgorI2RlZmluZSBIRVZDX0RFQ09ERV9NT0RFMgkJSEVWQ19BU1NJU1RfU0NSQVRDSF9ICisjZGVmaW5lIERFQ09ERV9TVE9QX1BPUyAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfSworCisjZGVmaW5lIERFQ09ERV9NT0RFX1NJTkdMRQkJCQkJMHgwCisjZGVmaW5lIERFQ09ERV9NT0RFX01VTFRJX0ZSQU1FQkFTRQkJCTB4MQorI2RlZmluZSBERUNPREVfTU9ERV9NVUxUSV9TVFJFQU1CQVNFCQkweDIKKyNkZWZpbmUgREVDT0RFX01PREVfTVVMVElfRFZCQUwJCQkJMHgzCisjZGVmaW5lIERFQ09ERV9NT0RFX01VTFRJX0RWRU5MCQkJCTB4NAorCisjZGVmaW5lIE1BWF9JTlQgMHg3RkZGRkZGRgorCisjZGVmaW5lIFJQTV9CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMAorI2RlZmluZSBtb2RpZmljYXRpb25fbGlzdF9jdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDgKKyNkZWZpbmUgUlBNX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgwCisjaWZkZWYgU1VQUE9SVF9MT05HX1RFUk1fUlBTCisvKgorICAqLworI2RlZmluZSBSUFNfRU5EICAweDgwMDAKKyNkZWZpbmUgUlBTX0xUX0JJVCAJCTE0CisjZGVmaW5lIFJQU19VU0VEX0JJVCAgICAgICAgMTMKKyNkZWZpbmUgUlBTX1NJR05fQklUICAgICAgICAxMgorCisKKyNlbHNlCisjZGVmaW5lIFJQU19FTkQJCTB4ODAwMAorI2RlZmluZSBSUFNfVVNFRF9CSVQgICAgICAgIDE0CisjZGVmaW5lIFJQU19TSUdOX0JJVCAgICAgICAgMTMKKyNlbmRpZgorLyogTUlTQ19GTEFHMCAqLworI2RlZmluZSBQQ01fTE9PUF9GSUxURVJfRElTQUJMRURfRkxBR19CSVQgICAgICAgMAorI2RlZmluZSBQQ01fRU5BQkxFX0ZMQUdfQklUICAgICAgICAgICAgIDEKKyNkZWZpbmUgTE9PUF9GSUxFUl9BQ1JPU1NfVElMRVNfRU5BQkxFRF9GTEFHX0JJVCAgICAyCisjZGVmaW5lIFBQU19MT09QX0ZJTFRFUl9BQ1JPU1NfU0xJQ0VTX0VOQUJMRURfRkxBR19CSVQgIDMKKyNkZWZpbmUgREVCTE9DS0lOR19GSUxURVJfT1ZFUlJJREVfRU5BQkxFRF9GTEFHX0JJVCA0CisjZGVmaW5lIFBQU19ERUJMT0NLSU5HX0ZJTFRFUl9ESVNBQkxFRF9GTEFHX0JJVCAgICAgNQorI2RlZmluZSBERUJMT0NLSU5HX0ZJTFRFUl9PVkVSUklERV9GTEFHX0JJVCAgICAgNgorI2RlZmluZSBTTElDRV9ERUJMT0NLSU5HX0ZJTFRFUl9ESVNBQkxFRF9GTEFHX0JJVCAgIDcKKyNkZWZpbmUgU0xJQ0VfU0FPX0xVTUFfRkxBR19CSVQgICAgICAgICAgICAgOAorI2RlZmluZSBTTElDRV9TQU9fQ0hST01BX0ZMQUdfQklUICAgICAgICAgICA5CisjZGVmaW5lIFNMSUNFX0xPT1BfRklMVEVSX0FDUk9TU19TTElDRVNfRU5BQkxFRF9GTEFHX0JJVCAxMAorCit1bmlvbiBwYXJhbV91IHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBzaG9ydCBkYXRhW1JQTV9FTkQgLSBSUE1fQkVHSU5dOworCX0gbDsKKwlzdHJ1Y3QgeworCQkvKiBmcm9tIHVjb2RlIGxtZW0sIGRvIG5vdCBjaGFuZ2UgdGhpcyBzdHJ1Y3QgKi8KKwkJdW5zaWduZWQgc2hvcnQgQ1VSX1JQU1sweDEwXTsKKwkJdW5zaWduZWQgc2hvcnQgbnVtX3JlZl9pZHhfbDBfYWN0aXZlOworCQl1bnNpZ25lZCBzaG9ydCBudW1fcmVmX2lkeF9sMV9hY3RpdmU7CisJCXVuc2lnbmVkIHNob3J0IHNsaWNlX3R5cGU7CisJCXVuc2lnbmVkIHNob3J0IHNsaWNlX3RlbXBvcmFsX212cF9lbmFibGVfZmxhZzsKKwkJdW5zaWduZWQgc2hvcnQgZGVwZW5kZW50X3NsaWNlX3NlZ21lbnRfZmxhZzsKKwkJdW5zaWduZWQgc2hvcnQgc2xpY2Vfc2VnbWVudF9hZGRyZXNzOworCQl1bnNpZ25lZCBzaG9ydCBudW1fdGl0bGVfcm93c19taW51czE7CisJCXVuc2lnbmVkIHNob3J0IHBpY193aWR0aF9pbl9sdW1hX3NhbXBsZXM7CisJCXVuc2lnbmVkIHNob3J0IHBpY19oZWlnaHRfaW5fbHVtYV9zYW1wbGVzOworCQl1bnNpZ25lZCBzaG9ydCBsb2cyX21pbl9jb2RpbmdfYmxvY2tfc2l6ZV9taW51czM7CisJCXVuc2lnbmVkIHNob3J0IGxvZzJfZGlmZl9tYXhfbWluX2NvZGluZ19ibG9ja19zaXplOworCQl1bnNpZ25lZCBzaG9ydCBsb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQ7CisJCXVuc2lnbmVkIHNob3J0IFBPQ2xzYjsKKwkJdW5zaWduZWQgc2hvcnQgY29sbG9jYXRlZF9mcm9tX2wwX2ZsYWc7CisJCXVuc2lnbmVkIHNob3J0IGNvbGxvY2F0ZWRfcmVmX2lkeDsKKwkJdW5zaWduZWQgc2hvcnQgbG9nMl9wYXJhbGxlbF9tZXJnZV9sZXZlbDsKKwkJdW5zaWduZWQgc2hvcnQgZml2ZV9taW51c19tYXhfbnVtX21lcmdlX2NhbmQ7CisJCXVuc2lnbmVkIHNob3J0IHNwc19udW1fcmVvcmRlcl9waWNzXzA7CisJCXVuc2lnbmVkIHNob3J0IG1vZGlmaWNhdGlvbl9mbGFnOworCQl1bnNpZ25lZCBzaG9ydCB0aWxlc19lbmFibGVkX2ZsYWc7CisJCXVuc2lnbmVkIHNob3J0IG51bV90aWxlX2NvbHVtbnNfbWludXMxOworCQl1bnNpZ25lZCBzaG9ydCBudW1fdGlsZV9yb3dzX21pbnVzMTsKKwkJdW5zaWduZWQgc2hvcnQgdGlsZV93aWR0aFsxMl07CisJCXVuc2lnbmVkIHNob3J0IHRpbGVfaGVpZ2h0WzhdOworCQl1bnNpZ25lZCBzaG9ydCBtaXNjX2ZsYWcwOworCQl1bnNpZ25lZCBzaG9ydCBwcHNfYmV0YV9vZmZzZXRfZGl2MjsKKwkJdW5zaWduZWQgc2hvcnQgcHBzX3RjX29mZnNldF9kaXYyOworCQl1bnNpZ25lZCBzaG9ydCBzbGljZV9iZXRhX29mZnNldF9kaXYyOworCQl1bnNpZ25lZCBzaG9ydCBzbGljZV90Y19vZmZzZXRfZGl2MjsKKwkJdW5zaWduZWQgc2hvcnQgcHBzX2NiX3FwX29mZnNldDsKKwkJdW5zaWduZWQgc2hvcnQgcHBzX2NyX3FwX29mZnNldDsKKwkJdW5zaWduZWQgc2hvcnQgZmlyc3Rfc2xpY2Vfc2VnbWVudF9pbl9waWNfZmxhZzsKKwkJdW5zaWduZWQgc2hvcnQgbV90ZW1wb3JhbElkOworCQl1bnNpZ25lZCBzaG9ydCBtX25hbFVuaXRUeXBlOworCisJCXVuc2lnbmVkIHNob3J0IHZ1aV9udW1fdW5pdHNfaW5fdGlja19oaTsKKwkJdW5zaWduZWQgc2hvcnQgdnVpX251bV91bml0c19pbl90aWNrX2xvOworCQl1bnNpZ25lZCBzaG9ydCB2dWlfdGltZV9zY2FsZV9oaTsKKwkJdW5zaWduZWQgc2hvcnQgdnVpX3RpbWVfc2NhbGVfbG87CisJCXVuc2lnbmVkIHNob3J0IGJpdF9kZXB0aDsKKwkJdW5zaWduZWQgc2hvcnQgcHJvZmlsZV9ldGM7CisJCXVuc2lnbmVkIHNob3J0IHNlaV9mcmFtZV9maWVsZF9pbmZvOworCQl1bnNpZ25lZCBzaG9ydCB2aWRlb19zaWduYWxfdHlwZTsKKwkJdW5zaWduZWQgc2hvcnQgbW9kaWZpY2F0aW9uX2xpc3RbMHgyMF07CisJCXVuc2lnbmVkIHNob3J0IGNvbmZvcm1hbmNlX3dpbmRvd19mbGFnOworCQl1bnNpZ25lZCBzaG9ydCBjb25mX3dpbl9sZWZ0X29mZnNldDsKKwkJdW5zaWduZWQgc2hvcnQgY29uZl93aW5fcmlnaHRfb2Zmc2V0OworCQl1bnNpZ25lZCBzaG9ydCBjb25mX3dpbl90b3Bfb2Zmc2V0OworCQl1bnNpZ25lZCBzaG9ydCBjb25mX3dpbl9ib3R0b21fb2Zmc2V0OworCQl1bnNpZ25lZCBzaG9ydCBjaHJvbWFfZm9ybWF0X2lkYzsKKwkJdW5zaWduZWQgc2hvcnQgY29sb3JfZGVzY3JpcHRpb247CisJCXVuc2lnbmVkIHNob3J0IGFzcGVjdF9yYXRpb19pZGM7CisJCXVuc2lnbmVkIHNob3J0IHNhcl93aWR0aDsKKwkJdW5zaWduZWQgc2hvcnQgc2FyX2hlaWdodDsKKwkJdW5zaWduZWQgc2hvcnQgc3BzX21heF9kZWNfcGljX2J1ZmZlcmluZ19taW51czFfMDsKKwl9IHA7Cit9OworCisjZGVmaW5lIFJQTV9CVUZfU0laRSAoMHg4MCoyKQorLyogbm9uIG1tdSBtb2RlIGxtZW0gc2l6ZSA6IDB4NDAwLCBtbXUgbW9kZSA6IDB4NTAwKi8KKyNkZWZpbmUgTE1FTV9CVUZfU0laRSAoMHg1MDAgKiAyKQorCitzdHJ1Y3QgYnVmZl9zIHsKKwl1MzIgYnVmX3N0YXJ0OworCXUzMiBidWZfc2l6ZTsKKwl1MzIgYnVmX2VuZDsKK307CisKK3N0cnVjdCBCdWZmSW5mb19zIHsKKwl1MzIgbWF4X3dpZHRoOworCXUzMiBtYXhfaGVpZ2h0OworCXVuc2lnbmVkIGludCBzdGFydF9hZHI7CisJdW5zaWduZWQgaW50IGVuZF9hZHI7CisJc3RydWN0IGJ1ZmZfcyBpcHA7CisJc3RydWN0IGJ1ZmZfcyBzYW9fYWJ2OworCXN0cnVjdCBidWZmX3Mgc2FvX3ZiOworCXN0cnVjdCBidWZmX3Mgc2hvcnRfdGVybV9ycHM7CisJc3RydWN0IGJ1ZmZfcyB2cHM7CisJc3RydWN0IGJ1ZmZfcyBzcHM7CisJc3RydWN0IGJ1ZmZfcyBwcHM7CisJc3RydWN0IGJ1ZmZfcyBzYW9fdXA7CisJc3RydWN0IGJ1ZmZfcyBzd2FwX2J1ZjsKKwlzdHJ1Y3QgYnVmZl9zIHN3YXBfYnVmMjsKKwlzdHJ1Y3QgYnVmZl9zIHNjYWxlbHV0OworCXN0cnVjdCBidWZmX3MgZGJsa19wYXJhOworCXN0cnVjdCBidWZmX3MgZGJsa19kYXRhOworCXN0cnVjdCBidWZmX3MgZGJsa19kYXRhMjsKKwlzdHJ1Y3QgYnVmZl9zIG1tdV92Ymg7CisJc3RydWN0IGJ1ZmZfcyBjbV9oZWFkZXI7CisJc3RydWN0IGJ1ZmZfcyBtcHJlZF9hYm92ZTsKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJc3RydWN0IGJ1ZmZfcyBtcHJlZF9tdjsKKyNlbmRpZgorCXN0cnVjdCBidWZmX3MgcnBtOworCXN0cnVjdCBidWZmX3MgbG1lbTsKK307CisKKy8vI2RlZmluZSBWQkhfQlVGX1NJWkUgKDIgKiAxNiAqIDIzMDQpCisvLyNkZWZpbmUgVkJIX0JVRl9DT1VOVCA0CisKKwkvKm1tdV92YmggYnVmIGlzIHVzZWQgYnkgSEVWQ19TQU9fTU1VX1ZIMF9BRERSLCBIRVZDX1NBT19NTVVfVkgxX0FERFIqLworI2RlZmluZSBWQkhfQlVGX1NJWkVfMTA4MFAgMHgzMDAwCisjZGVmaW5lIFZCSF9CVUZfU0laRV80SyAweDUwMDAKKyNkZWZpbmUgVkJIX0JVRl9TSVpFXzhLIDB4YTAwMAorI2RlZmluZSBWQkhfQlVGX1NJWkUoYnVmc3BlYykgKGJ1ZnNwZWMtPm1tdV92YmguYnVmX3NpemUgLyAyKQorCS8qbW11X3ZiaF9kdyBidWYgaXMgdXNlZCBieSBIRVZDX1NBT19NTVVfVkgwX0FERFIyLEhFVkNfU0FPX01NVV9WSDFfQUREUjIsCisJCUhFVkNfRFdfVkgwX0FERERSLCBIRVZDX0RXX1ZIMV9BREREUiovCisjZGVmaW5lIERXX1ZCSF9CVUZfU0laRV8xMDgwUCAoVkJIX0JVRl9TSVpFXzEwODBQICogMikKKyNkZWZpbmUgRFdfVkJIX0JVRl9TSVpFXzRLIChWQkhfQlVGX1NJWkVfNEsgKiAyKQorI2RlZmluZSBEV19WQkhfQlVGX1NJWkVfOEsgKFZCSF9CVUZfU0laRV84SyAqIDIpCisjZGVmaW5lIERXX1ZCSF9CVUZfU0laRShidWZzcGVjKSAoYnVmc3BlYy0+bW11X3ZiaF9kdy5idWZfc2l6ZSAvIDQpCisKKy8qIG5lY2Vzc2FyeSA0SyBwYWdlIHNpemUgYWxpZ24gZm9yIHQ3L3QzIGRlY29kZXIgYW5kIGFmdGVyICovCisjZGVmaW5lIFdPUktCVUZfQUxJR04oYWRkcikgKEFMSUdOKGFkZHIsIFBBR0VfU0laRSkpCisKKyNkZWZpbmUgV09SS19CVUZfU1BFQ19OVU0gNgorc3RhdGljIHN0cnVjdCBCdWZmSW5mb19zIGFtdmgyNjVfd29ya2J1ZmZfc3BlY1tXT1JLX0JVRl9TUEVDX05VTV0gPSB7CisJeworCQkvKiA4TSBieXRlcyAqLworCQkubWF4X3dpZHRoID0gMTkyMCwKKwkJLm1heF9oZWlnaHQgPSAxMDg4LAorCQkuaXBwID0geworCQkJLyogSVBQIHdvcmsgc3BhY2UgY2FsY3VsYXRpb24gOgorCQkJICogICA0MDk2ICogKFkrQ2JDcitGbGFncykgPSAxMmssIHJvdW5kIHRvIDE2aworCQkJICovCisJCQkuYnVmX3NpemUgPSAweDQwMDAsCisJCX0sCisJCS5zYW9fYWJ2ID0geworCQkJLmJ1Zl9zaXplID0gMHgzMDAwMCwKKwkJfSwKKwkJLnNhb192YiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MzAwMDAsCisJCX0sCisJCS5zaG9ydF90ZXJtX3JwcyA9IHsKKwkJCS8qIFNIT1JUX1RFUk1fUlBTIC0gTWF4IDY0IHNldCwgMTYgZW50cnkgZXZlcnkgc2V0LAorCQkJICogICB0b3RhbCA2NHgxNngyID0gMjA0OCBieXRlcyAoMHg4MDApCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkudnBzID0geworCQkJLyogVlBTIFNUT1JFIEFSRUEgLSBNYXggMTYgVlBTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLAorCQkJICogICB0b3RhbCAweDA4MDAgYnl0ZXMKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zcHMgPSB7CisJCQkvKiBTUFMgU1RPUkUgQVJFQSAtIE1heCAxNiBTUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsCisJCQkgKiAgIHRvdGFsIDB4MDgwMCBieXRlcworCQkJICovCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnBwcyA9IHsKKwkJCS8qIFBQUyBTVE9SRSBBUkVBIC0gTWF4IDY0IFBQUywgZWFjaCBoYXMgMHg4MCBieXRlcywKKwkJCSAqICAgdG90YWwgMHgyMDAwIGJ5dGVzCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4MjAwMCwKKwkJfSwKKwkJLnNhb191cCA9IHsKKwkJCS8qIFNBTyBVUCBTVE9SRSBBUkVBIC0gTWF4IDY0MCgxMDI0MC8xNikgTENVLAorCQkJICogICBlYWNoIGhhcyAxNiBieXRlcyB0b3RhbCAweDI4MDAgYnl0ZXMKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHgyODAwLAorCQl9LAorCQkuc3dhcF9idWYgPSB7CisJCQkvKiAyNTZjeWNsZXg2NGJpdCA9IDJLIGJ5dGVzIDB4ODAwCisJCQkgKiAgIChvbmx5IDE0NCBjeWNsZXMgdmFsaWQpCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc3dhcF9idWYyID0geworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zY2FsZWx1dCA9IHsKKwkJCS8qIHN1cHBvcnQgdXAgdG8gMzIgU0NBTEVMVVQgMTAyNHgzMiA9CisJCQkgKiAgIDMyS2J5dGVzICgweDgwMDApCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwMCwKKwkJfSwKKwkJLmRibGtfcGFyYSA9IHsKKyNpZmRlZiBTVVBQT1JUXzEwQklUCisJCQkuYnVmX3NpemUgPSAweDQwMDAwLAorI2Vsc2UKKwkJCS8qIERCTEsgLT4gTWF4IDI1Nig0MDk2LzE2KSBMQ1UsIGVhY2ggcGFyYQorCQkJICo1MTJieXRlcyh0b3RhbDoweDIwMDAwKSwgZGF0YSAxMDI0Ynl0ZXModG90YWw6MHg0MDAwMCkKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHgyMDAwMCwKKyNlbmRpZgorCQl9LAorCQkuZGJsa19kYXRhID0geworCQkJLmJ1Zl9zaXplID0gMHg0MDAwMCwKKwkJfSwKKwkJLmRibGtfZGF0YTIgPSB7CisJCQkuYnVmX3NpemUgPSAweDgwMDAwICogMiwKKwkJfSwgLypkYmxrIGRhdGEgZm9yIGFkYXB0ZXIqLworCQkubW11X3ZiaCA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4NTAwMCwgLyoyKjE2KjIzMDQvNCwgNEsqLworCQl9LAorI2lmIDAKKwkJLmNtX2hlYWRlciA9IHsvKiAweDQ0MDAwID0gKCgxMDg4KjIqMTAyNCo0KS8zMi80KSooMzIvOCkqLworCQkJLmJ1Zl9zaXplID0gTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFICoKKwkJCShNQVhfUkVGX1BJQ19OVU0gKyAxKSwKKwkJfSwKKyNlbmRpZgorCQkubXByZWRfYWJvdmUgPSB7CisJCQkuYnVmX3NpemUgPSAweDgwMDAsCisJCX0sCisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCQkubXByZWRfbXYgPSB7LyogMTA4MHAsIDB4NDAwMDAgcGVyIGJ1ZmZlciAqLworCQkJLmJ1Zl9zaXplID0gMHg0MDAwMCAqIE1BWF9SRUZfUElDX05VTSwKKwkJfSwKKyNlbmRpZgorCQkucnBtID0geworCQkJLmJ1Zl9zaXplID0gUlBNX0JVRl9TSVpFLAorCQl9LAorCQkubG1lbSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4NTAwICogMiwKKwkJfQorCX0sCisJeworCQkubWF4X3dpZHRoID0gNDA5NiwKKwkJLm1heF9oZWlnaHQgPSAyMDQ4LAorCQkuaXBwID0geworCQkJLyogSVBQIHdvcmsgc3BhY2UgY2FsY3VsYXRpb24gOgorCQkJICogICA0MDk2ICogKFkrQ2JDcitGbGFncykgPSAxMmssIHJvdW5kIHRvIDE2aworCQkJICovCisJCQkuYnVmX3NpemUgPSAweDQwMDAsCisJCX0sCisJCS5zYW9fYWJ2ID0geworCQkJLmJ1Zl9zaXplID0gMHgzMDAwMCwKKwkJfSwKKwkJLnNhb192YiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MzAwMDAsCisJCX0sCisJCS5zaG9ydF90ZXJtX3JwcyA9IHsKKwkJCS8qIFNIT1JUX1RFUk1fUlBTIC0gTWF4IDY0IHNldCwgMTYgZW50cnkgZXZlcnkgc2V0LAorCQkJICogICB0b3RhbCA2NHgxNngyID0gMjA0OCBieXRlcyAoMHg4MDApCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkudnBzID0geworCQkJLyogVlBTIFNUT1JFIEFSRUEgLSBNYXggMTYgVlBTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLAorCQkJICogICB0b3RhbCAweDA4MDAgYnl0ZXMKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zcHMgPSB7CisJCQkvKiBTUFMgU1RPUkUgQVJFQSAtIE1heCAxNiBTUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsCisJCQkgKiAgIHRvdGFsIDB4MDgwMCBieXRlcworCQkJICovCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnBwcyA9IHsKKwkJCS8qIFBQUyBTVE9SRSBBUkVBIC0gTWF4IDY0IFBQUywgZWFjaCBoYXMgMHg4MCBieXRlcywKKwkJCSAqICAgdG90YWwgMHgyMDAwIGJ5dGVzCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4MjAwMCwKKwkJfSwKKwkJLnNhb191cCA9IHsKKwkJCS8qIFNBTyBVUCBTVE9SRSBBUkVBIC0gTWF4IDY0MCgxMDI0MC8xNikgTENVLAorCQkJICogICBlYWNoIGhhcyAxNiBieXRlcyB0b3RhbCAweDI4MDAgYnl0ZXMKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHgyODAwLAorCQl9LAorCQkuc3dhcF9idWYgPSB7CisJCQkvKiAyNTZjeWNsZXg2NGJpdCA9IDJLIGJ5dGVzIDB4ODAwCisJCQkgKiAgIChvbmx5IDE0NCBjeWNsZXMgdmFsaWQpCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc3dhcF9idWYyID0geworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zY2FsZWx1dCA9IHsKKwkJCS8qIHN1cHBvcnQgdXAgdG8gMzIgU0NBTEVMVVQgMTAyNHgzMiA9IDMyS2J5dGVzCisJCQkgKiAgICgweDgwMDApCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwMCwKKwkJfSwKKwkJLmRibGtfcGFyYSA9IHsKKwkJCS8qIERCTEsgLT4gTWF4IDI1Nig0MDk2LzE2KSBMQ1UsIGVhY2ggcGFyYQorCQkJICogICA1MTJieXRlcyh0b3RhbDoweDIwMDAwKSwKKwkJCSAqICAgZGF0YSAxMDI0Ynl0ZXModG90YWw6MHg0MDAwMCkKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHgyMDAwMCwKKwkJfSwKKwkJLmRibGtfZGF0YSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4ODAwMDAsCisJCX0sCisJCS5kYmxrX2RhdGEyID0geworCQkJLmJ1Zl9zaXplID0gMHg4MDAwMCwKKwkJfSwgLypkYmxrIGRhdGEgZm9yIGFkYXB0ZXIqLworCQkubW11X3ZiaCA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4NTAwMCwgLyoyKjE2KjIzMDQvNCwgNEsqLworCQl9LAorI2lmIDAKKwkJLmNtX2hlYWRlciA9IHsvKjB4NDQwMDAgPSAoKDEwODgqMioxMDI0KjQpLzMyLzQpKigzMi84KSovCisJCQkuYnVmX3NpemUgPSBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkUgKgorCQkJKE1BWF9SRUZfUElDX05VTSArIDEpLAorCQl9LAorI2VuZGlmCisJCS5tcHJlZF9hYm92ZSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4ODAwMCwKKwkJfSwKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJCS5tcHJlZF9tdiA9IHsKKwkJCS8qIC5idWZfc2l6ZSA9IDB4MTAwMDAwKjE2LAorCQkJLy80azJrICwgMHgxMDAwMDAgcGVyIGJ1ZmZlciAqLworCQkJLyogNDA5NngyMzA0ICwgMHgxMjAwMDAgcGVyIGJ1ZmZlciAqLworCQkJLmJ1Zl9zaXplID0gTVBSRURfNEtfTVZfQlVGX1NJWkUgKiBNQVhfUkVGX1BJQ19OVU0sCisJCX0sCisjZW5kaWYKKwkJLnJwbSA9IHsKKwkJCS5idWZfc2l6ZSA9IFJQTV9CVUZfU0laRSwKKwkJfSwKKwkJLmxtZW0gPSB7CisJCQkuYnVmX3NpemUgPSAweDUwMCAqIDIsCisJCX0KKwl9LAorCisJeworCQkubWF4X3dpZHRoID0gNDA5NioyLAorCQkubWF4X2hlaWdodCA9IDIwNDgqMiwKKwkJLmlwcCA9IHsKKwkJCS8vIElQUCB3b3JrIHNwYWNlIGNhbGN1bGF0aW9uIDogNDA5NiAqIChZK0NiQ3IrRmxhZ3MpID0gMTJrLCByb3VuZCB0byAxNmsKKwkJCS5idWZfc2l6ZSA9IDB4NDAwMCoyLAorCQl9LAorCQkuc2FvX2FidiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MzAwMDAqMiwKKwkJfSwKKwkJLnNhb192YiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MzAwMDAqMiwKKwkJfSwKKwkJLnNob3J0X3Rlcm1fcnBzID0geworCQkJLy8gU0hPUlRfVEVSTV9SUFMgLSBNYXggNjQgc2V0LCAxNiBlbnRyeSBldmVyeSBzZXQsIHRvdGFsIDY0eDE2eDIgPSAyMDQ4IGJ5dGVzICgweDgwMCkKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkudnBzID0geworCQkJLy8gVlBTIFNUT1JFIEFSRUEgLSBNYXggMTYgVlBTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLCB0b3RhbCAweDA4MDAgYnl0ZXMKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc3BzID0geworCQkJLy8gU1BTIFNUT1JFIEFSRUEgLSBNYXggMTYgU1BTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLCB0b3RhbCAweDA4MDAgYnl0ZXMKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkucHBzID0geworCQkJLy8gUFBTIFNUT1JFIEFSRUEgLSBNYXggNjQgUFBTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLCB0b3RhbCAweDIwMDAgYnl0ZXMKKwkJCS5idWZfc2l6ZSA9IDB4MjAwMCwKKwkJfSwKKwkJLnNhb191cCA9IHsKKwkJCS8vIFNBTyBVUCBTVE9SRSBBUkVBIC0gTWF4IDY0MCgxMDI0MC8xNikgTENVLCBlYWNoIGhhcyAxNiBieXRlcyB0b3RhbCAweDI4MDAgYnl0ZXMKKwkJCS5idWZfc2l6ZSA9IDB4MjgwMCoyLAorCQl9LAorCQkuc3dhcF9idWYgPSB7CisJCQkvLyAyNTZjeWNsZXg2NGJpdCA9IDJLIGJ5dGVzIDB4ODAwIChvbmx5IDE0NCBjeWNsZXMgdmFsaWQpCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnN3YXBfYnVmMiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc2NhbGVsdXQgPSB7CisJCQkvLyBzdXBwb3J0IHVwIHRvIDMyIFNDQUxFTFVUIDEwMjR4MzIgPSAzMktieXRlcyAoMHg4MDAwKQorCQkJLmJ1Zl9zaXplID0gMHg4MDAwKjIsCisJCX0sCisJCS5kYmxrX3BhcmEgID0gey5idWZfc2l6ZSA9IDB4NDAwMDAqMiwgfSwgLy8gZGJsayBwYXJhbWV0ZXIKKwkJLmRibGtfZGF0YSAgPSB7LmJ1Zl9zaXplID0gMHg4MDAwMCoyLCB9LCAvLyBkYmxrIGRhdGEgZm9yIGxlZnQvdG9wCisJCS5kYmxrX2RhdGEyID0gey5idWZfc2l6ZSA9IDB4ODAwMDAqMiwgfSwgLy8gZGJsayBkYXRhIGZvciBhZGFwdGVyCisJCS5tbXVfdmJoID0geworCQkJLmJ1Zl9zaXplID0gMHg1MDAwKjIsIC8vMioxNioyMzA0LzQsIDRLCisJCX0sCisjaWYgMAorCQkuY21faGVhZGVyID0geworCQkJLmJ1Zl9zaXplID0gTU1VX0NPTVBSRVNTXzhLX0hFQURFUl9TSVpFICoKKwkJCQlNQVhfUkVGX1BJQ19OVU0sIAkvLyAweDQ0MDAwID0gKCgxMDg4KjIqMTAyNCo0KS8zMi80KSooMzIvOCkKKwkJfSwKKyNlbmRpZgorCQkubXByZWRfYWJvdmUgPSB7CisJCQkuYnVmX3NpemUgPSAweDgwMDAqMiwKKwkJfSwKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJCS5tcHJlZF9tdiA9IHsKKwkJCS5idWZfc2l6ZSA9IE1QUkVEXzhLX01WX0JVRl9TSVpFICogTUFYX1JFRl9QSUNfTlVNLCAvLzRrMmsgLCAweDEyMDAwMCBwZXIgYnVmZmVyCisJCX0sCisjZW5kaWYKKwkJLnJwbSA9IHsKKwkJCS5idWZfc2l6ZSA9IFJQTV9CVUZfU0laRSwKKwkJfSwKKwkJLmxtZW0gPSB7CisJCQkuYnVmX3NpemUgPSAweDUwMCAqIDIsCisJCX0sCisJfSwKKwl7CisJCS8qIDhNIGJ5dGVzICovCisJCS5tYXhfd2lkdGggPSAxOTIwLAorCQkubWF4X2hlaWdodCA9IDEwODgsCisJCS5pcHAgPSB7LypjaGVja2VkKi8KKwkJCS8qIElQUCB3b3JrIHNwYWNlIGNhbGN1bGF0aW9uIDoKKwkJCSAqICAgNDA5NiAqIChZK0NiQ3IrRmxhZ3MpID0gMTJrLCByb3VuZCB0byAxNmsKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHgxZTAwLAorCQl9LAorCQkuc2FvX2FidiA9IHsKKwkJCS5idWZfc2l6ZSA9IDAsIC8vMHgzMDAwMCwKKwkJfSwKKwkJLnNhb192YiA9IHsKKwkJCS5idWZfc2l6ZSA9IDAsIC8vMHgzMDAwMCwKKwkJfSwKKwkJLnNob3J0X3Rlcm1fcnBzID0gey8qY2hlY2tlZCovCisJCQkvKiBTSE9SVF9URVJNX1JQUyAtIE1heCA2NCBzZXQsIDE2IGVudHJ5IGV2ZXJ5IHNldCwKKwkJCSAqICAgdG90YWwgNjR4MTZ4MiA9IDIwNDggYnl0ZXMgKDB4ODAwKQorCQkJICovCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnZwcyA9IHsvKmNoZWNrZWQqLworCQkJLyogVlBTIFNUT1JFIEFSRUEgLSBNYXggMTYgVlBTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLAorCQkJICogICB0b3RhbCAweDA4MDAgYnl0ZXMKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zcHMgPSB7LypjaGVja2VkKi8KKwkJCS8qIFNQUyBTVE9SRSBBUkVBIC0gTWF4IDE2IFNQUywgZWFjaCBoYXMgMHg4MCBieXRlcywKKwkJCSAqICAgdG90YWwgMHgwODAwIGJ5dGVzCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkucHBzID0gey8qY2hlY2tlZCovCisJCQkvKiBQUFMgU1RPUkUgQVJFQSAtIE1heCA2NCBQUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsCisJCQkgKiAgIHRvdGFsIDB4MjAwMCBieXRlcworCQkJICovCisJCQkuYnVmX3NpemUgPSAweDIwMDAsCisJCX0sCisJCS5zYW9fdXAgPSB7CisJCQkvKiBTQU8gVVAgU1RPUkUgQVJFQSAtIE1heCA2NDAoMTAyNDAvMTYpIExDVSwKKwkJCSAqICAgZWFjaCBoYXMgMTYgYnl0ZXMgdG90YWwgMHgyODAwIGJ5dGVzCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDAsIC8vMHgyODAwLAorCQl9LAorCQkuc3dhcF9idWYgPSB7LypjaGVja2VkKi8KKwkJCS8qIDI1NmN5Y2xleDY0Yml0ID0gMksgYnl0ZXMgMHg4MDAKKwkJCSAqICAgKG9ubHkgMTQ0IGN5Y2xlcyB2YWxpZCkKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zd2FwX2J1ZjIgPSB7LypjaGVja2VkKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc2NhbGVsdXQgPSB7LypjaGVja2VkKi8KKwkJCS8qIHN1cHBvcnQgdXAgdG8gMzIgU0NBTEVMVVQgMTAyNHgzMiA9CisJCQkgKiAgIDMyS2J5dGVzICgweDgwMDApCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwMCwKKwkJfSwKKwkJLmRibGtfcGFyYSAgPSB7LmJ1Zl9zaXplID0gMHgxNDUwMCwgfSwgLy8gZGJsayBwYXJhbWV0ZXIKKwkJLmRibGtfZGF0YSAgPSB7LmJ1Zl9zaXplID0gMHg2MjgwMCwgfSwgLy8gZGJsayBkYXRhIGZvciBsZWZ0L3RvcAorCQkuZGJsa19kYXRhMiA9IHsuYnVmX3NpemUgPSAweDIyODAwLCB9LCAvLyBkYmxrIGRhdGEgZm9yIGFkYXB0ZXIKKwkJLm1tdV92YmggPSB7LypjaGVja2VkKi8KKwkJCS5idWZfc2l6ZSA9IFZCSF9CVUZfU0laRV8xMDgwUCwgLyoyKjE2KjIzMDQvNCwgNEsqLworCQl9LAorI2lmIDAKKwkJLmNtX2hlYWRlciA9IHsvKmNoZWNrZWQqLy8qIDB4NDQwMDAgPSAoKDEwODgqMioxMDI0KjQpLzMyLzQpKigzMi84KSovCisJCQkuYnVmX3NpemUgPSBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfMTA4MFAgKgorCQkJKE1BWF9SRUZfUElDX05VTSArIDEpLAorCQl9LAorI2VuZGlmCisJCS5tcHJlZF9hYm92ZSA9IHsvKmNoZWNrZWQqLworCQkJLmJ1Zl9zaXplID0gMHgxZTAwLAorCQl9LAorI2lmZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwkJLm1wcmVkX212ID0gey8qY2hlY2tlZCovLyogMTA4MHAsIDB4NDAwMDAgcGVyIGJ1ZmZlciAqLworCQkJLmJ1Zl9zaXplID0gTVBSRURfTVZfQlVGX1NJWkUgKiBNQVhfUkVGX1BJQ19OVU0sCisJCX0sCisjZW5kaWYKKwkJLnJwbSA9IHsvKmNoZWNrZWQqLworCQkJLmJ1Zl9zaXplID0gUlBNX0JVRl9TSVpFLAorCQl9LAorCQkubG1lbSA9IHsvKmNoZWNrZWQqLworCQkJLmJ1Zl9zaXplID0gMHg1MDAgKiAyLAorCQl9CisJfSwKKwl7CisJCS5tYXhfd2lkdGggPSA0MDk2LAorCQkubWF4X2hlaWdodCA9IDIwNDgsCisJCS5pcHAgPSB7CisJCQkvKiBJUFAgd29yayBzcGFjZSBjYWxjdWxhdGlvbiA6CisJCQkgKiAgIDQwOTYgKiAoWStDYkNyK0ZsYWdzKSA9IDEyaywgcm91bmQgdG8gMTZrCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4NDAwMCwKKwkJfSwKKwkJLnNhb19hYnYgPSB7CisJCQkuYnVmX3NpemUgPSAwLCAvLzB4MzAwMDAsCisJCX0sCisJCS5zYW9fdmIgPSB7CisJCQkuYnVmX3NpemUgPSAwLCAvLzB4MzAwMDAsCisJCX0sCisJCS5zaG9ydF90ZXJtX3JwcyA9IHsKKwkJCS8qIFNIT1JUX1RFUk1fUlBTIC0gTWF4IDY0IHNldCwgMTYgZW50cnkgZXZlcnkgc2V0LAorCQkJICogICB0b3RhbCA2NHgxNngyID0gMjA0OCBieXRlcyAoMHg4MDApCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkudnBzID0geworCQkJLyogVlBTIFNUT1JFIEFSRUEgLSBNYXggMTYgVlBTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLAorCQkJICogICB0b3RhbCAweDA4MDAgYnl0ZXMKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zcHMgPSB7CisJCQkvKiBTUFMgU1RPUkUgQVJFQSAtIE1heCAxNiBTUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsCisJCQkgKiAgIHRvdGFsIDB4MDgwMCBieXRlcworCQkJICovCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnBwcyA9IHsKKwkJCS8qIFBQUyBTVE9SRSBBUkVBIC0gTWF4IDY0IFBQUywgZWFjaCBoYXMgMHg4MCBieXRlcywKKwkJCSAqICAgdG90YWwgMHgyMDAwIGJ5dGVzCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4MjAwMCwKKwkJfSwKKwkJLnNhb191cCA9IHsKKwkJCS8qIFNBTyBVUCBTVE9SRSBBUkVBIC0gTWF4IDY0MCgxMDI0MC8xNikgTENVLAorCQkJICogICBlYWNoIGhhcyAxNiBieXRlcyB0b3RhbCAweDI4MDAgYnl0ZXMKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMCwgLy8weDI4MDAsCisJCX0sCisJCS5zd2FwX2J1ZiA9IHsKKwkJCS8qIDI1NmN5Y2xleDY0Yml0ID0gMksgYnl0ZXMgMHg4MDAKKwkJCSAqICAgKG9ubHkgMTQ0IGN5Y2xlcyB2YWxpZCkKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zd2FwX2J1ZjIgPSB7CisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNjYWxlbHV0ID0geworCQkJLyogc3VwcG9ydCB1cCB0byAzMiBTQ0FMRUxVVCAxMDI0eDMyID0gMzJLYnl0ZXMKKwkJCSAqICAgKDB4ODAwMCkKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAwLAorCQl9LAorCQkuZGJsa19wYXJhICA9IHsuYnVmX3NpemUgPSAweDE5MTAwLCB9LCAvLyBkYmxrIHBhcmFtZXRlcgorCQkuZGJsa19kYXRhICA9IHsuYnVmX3NpemUgPSAweDg4ODAwLCB9LCAvLyBkYmxrIGRhdGEgZm9yIGxlZnQvdG9wCisJCS5kYmxrX2RhdGEyID0gey5idWZfc2l6ZSA9IDB4NDg4MDAsIH0sIC8vIGRibGsgZGF0YSBmb3IgYWRhcHRlcgorCQkubW11X3ZiaCA9IHsKKwkJCS5idWZfc2l6ZSA9IFZCSF9CVUZfU0laRV80SywgLyoyKjE2KjIzMDQvNCwgNEsqLworCQl9LAorI2lmIDAKKwkJLmNtX2hlYWRlciA9IHsvKjB4NDQwMDAgPSAoKDEwODgqMioxMDI0KjQpLzMyLzQpKigzMi84KSovCisJCQkuYnVmX3NpemUgPSBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfNEsgKgorCQkJKE1BWF9SRUZfUElDX05VTSArIDEpLAorCQl9LAorI2VuZGlmCisJCS5tcHJlZF9hYm92ZSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4NDAwMCwKKwkJfSwKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJCS5tcHJlZF9tdiA9IHsKKwkJCS8qIC5idWZfc2l6ZSA9IDB4MTAwMDAwKjE2LAorCQkJLy80azJrICwgMHgxMDAwMDAgcGVyIGJ1ZmZlciAqLworCQkJLyogNDA5NngyMzA0ICwgMHgxMjAwMDAgcGVyIGJ1ZmZlciAqLworCQkJLmJ1Zl9zaXplID0gTVBSRURfNEtfTVZfQlVGX1NJWkUgKiBNQVhfUkVGX1BJQ19OVU0sCisJCX0sCisjZW5kaWYKKwkJLnJwbSA9IHsKKwkJCS5idWZfc2l6ZSA9IFJQTV9CVUZfU0laRSwKKwkJfSwKKwkJLmxtZW0gPSB7CisJCQkuYnVmX3NpemUgPSAweDUwMCAqIDIsCisJCX0KKwl9LAorCisJeworCQkubWF4X3dpZHRoID0gNDA5NioyLAorCQkubWF4X2hlaWdodCA9IDIwNDgqMiwKKwkJLmlwcCA9IHsKKwkJCS8vIElQUCB3b3JrIHNwYWNlIGNhbGN1bGF0aW9uIDogNDA5NiAqIChZK0NiQ3IrRmxhZ3MpID0gMTJrLCByb3VuZCB0byAxNmsKKwkJCS5idWZfc2l6ZSA9IDB4NDAwMCoyLAorCQl9LAorCQkuc2FvX2FidiA9IHsKKwkJCS5idWZfc2l6ZSA9IDAsIC8vMHgzMDAwMCoyLAorCQl9LAorCQkuc2FvX3ZiID0geworCQkJLmJ1Zl9zaXplID0gMCwgLy8weDMwMDAwKjIsCisJCX0sCisJCS5zaG9ydF90ZXJtX3JwcyA9IHsKKwkJCS8vIFNIT1JUX1RFUk1fUlBTIC0gTWF4IDY0IHNldCwgMTYgZW50cnkgZXZlcnkgc2V0LCB0b3RhbCA2NHgxNngyID0gMjA0OCBieXRlcyAoMHg4MDApCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnZwcyA9IHsKKwkJCS8vIFZQUyBTVE9SRSBBUkVBIC0gTWF4IDE2IFZQUywgZWFjaCBoYXMgMHg4MCBieXRlcywgdG90YWwgMHgwODAwIGJ5dGVzCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNwcyA9IHsKKwkJCS8vIFNQUyBTVE9SRSBBUkVBIC0gTWF4IDE2IFNQUywgZWFjaCBoYXMgMHg4MCBieXRlcywgdG90YWwgMHgwODAwIGJ5dGVzCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnBwcyA9IHsKKwkJCS8vIFBQUyBTVE9SRSBBUkVBIC0gTWF4IDY0IFBQUywgZWFjaCBoYXMgMHg4MCBieXRlcywgdG90YWwgMHgyMDAwIGJ5dGVzCisJCQkuYnVmX3NpemUgPSAweDIwMDAsCisJCX0sCisJCS5zYW9fdXAgPSB7CisJCQkvLyBTQU8gVVAgU1RPUkUgQVJFQSAtIE1heCA2NDAoMTAyNDAvMTYpIExDVSwgZWFjaCBoYXMgMTYgYnl0ZXMgdG90YWwgMHgyODAwIGJ5dGVzCisJCQkuYnVmX3NpemUgPSAwLCAvLzB4MjgwMCoyLAorCQl9LAorCQkuc3dhcF9idWYgPSB7CisJCQkvLyAyNTZjeWNsZXg2NGJpdCA9IDJLIGJ5dGVzIDB4ODAwIChvbmx5IDE0NCBjeWNsZXMgdmFsaWQpCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnN3YXBfYnVmMiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc2NhbGVsdXQgPSB7CisJCQkvLyBzdXBwb3J0IHVwIHRvIDMyIFNDQUxFTFVUIDEwMjR4MzIgPSAzMktieXRlcyAoMHg4MDAwKQorCQkJLmJ1Zl9zaXplID0gMHg4MDAwLCAvLzB4ODAwMCoyLAorCQl9LAorCQkuZGJsa19wYXJhICA9IHsuYnVmX3NpemUgPSAweDMyMTAwLCB9LCAvLyBkYmxrIHBhcmFtZXRlcgorCQkuZGJsa19kYXRhICA9IHsuYnVmX3NpemUgPSAweDExMDgwMCwgfSwgLy8gZGJsayBkYXRhIGZvciBsZWZ0L3RvcAorCQkuZGJsa19kYXRhMiA9IHsuYnVmX3NpemUgPSAweDkwODAwLCB9LCAvLyBkYmxrIGRhdGEgZm9yIGFkYXB0ZXIKKwkJLm1tdV92YmggPSB7CisJCQkuYnVmX3NpemUgPSBWQkhfQlVGX1NJWkVfOEssIC8vMioxNioyMzA0LzQsIDRLCisJCX0sCisjaWYgMAorCQkuY21faGVhZGVyID0geworCQkJLmJ1Zl9zaXplID0gTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFXzhLICoKKwkJCQlNQVhfUkVGX1BJQ19OVU0sIAkvLyAweDQ0MDAwID0gKCgxMDg4KjIqMTAyNCo0KS8zMi80KSooMzIvOCkKKwkJfSwKKyNlbmRpZgorCQkubXByZWRfYWJvdmUgPSB7CisJCQkuYnVmX3NpemUgPSAweDgwMDAsCisJCX0sCisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCQkubXByZWRfbXYgPSB7CisJCQkuYnVmX3NpemUgPSBNUFJFRF84S19NVl9CVUZfU0laRSAqIE1BWF9SRUZfUElDX05VTSwgLy80azJrICwgMHgxMjAwMDAgcGVyIGJ1ZmZlcgorCQl9LAorI2VuZGlmCisJCS5ycG0gPSB7CisJCQkuYnVmX3NpemUgPSBSUE1fQlVGX1NJWkUsCisJCX0sCisJCS5sbWVtID0geworCQkJLmJ1Zl9zaXplID0gMHg1MDAgKiAyLAorCQl9LAorCX0KK307CisKK3N0YXRpYyB2b2lkIGluaXRfYnVmZl9zcGVjKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsCisJc3RydWN0IEJ1ZmZJbmZvX3MgKmJ1Zl9zcGVjKQoreworCWJ1Zl9zcGVjLT5pcHAuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c3RhcnRfYWRyKTsKKwlidWZfc3BlYy0+c2FvX2Fidi5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5pcHAuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPmlwcC5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPnNhb192Yi5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5zYW9fYWJ2LmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5zYW9fYWJ2LmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+c2hvcnRfdGVybV9ycHMuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c2FvX3ZiLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5zYW9fdmIuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT52cHMuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c2hvcnRfdGVybV9ycHMuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnNob3J0X3Rlcm1fcnBzLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+c3BzLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnZwcy5idWZfc3RhcnQgKyBidWZfc3BlYy0+dnBzLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+cHBzLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnNwcy5idWZfc3RhcnQgKyBidWZfc3BlYy0+c3BzLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+c2FvX3VwLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnBwcy5idWZfc3RhcnQgKyBidWZfc3BlYy0+cHBzLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+c3dhcF9idWYuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c2FvX3VwLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5zYW9fdXAuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5zd2FwX2J1ZjIuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c3dhcF9idWYuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnN3YXBfYnVmLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+c2NhbGVsdXQuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c3dhcF9idWYyLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5zd2FwX2J1ZjIuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5kYmxrX3BhcmEuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c2NhbGVsdXQuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnNjYWxlbHV0LmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+ZGJsa19kYXRhLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc3RhcnQgKyBidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+ZGJsa19kYXRhMi5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5kYmxrX2RhdGEuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPmRibGtfZGF0YS5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPm1tdV92YmguYnVmX3N0YXJ0ICA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPmRibGtfZGF0YTIuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPmRibGtfZGF0YTIuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5tcHJlZF9hYm92ZS5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5tbXVfdmJoLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5tbXVfdmJoLmJ1Zl9zaXplKTsKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJYnVmX3NwZWMtPm1wcmVkX212LmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPm1wcmVkX2Fib3ZlLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5tcHJlZF9hYm92ZS5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPnJwbS5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5tcHJlZF9tdi5idWZfc3RhcnQgKyBidWZfc3BlYy0+bXByZWRfbXYuYnVmX3NpemUpOworI2Vsc2UKKwlidWZfc3BlYy0+cnBtLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPm1wcmVkX2Fib3ZlLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5tcHJlZF9hYm92ZS5idWZfc2l6ZSk7CisjZW5kaWYKKwlidWZfc3BlYy0+bG1lbS5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5ycG0uYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnJwbS5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPmVuZF9hZHIgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5sbWVtLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5sbWVtLmJ1Zl9zaXplKTsKKworCWlmIChoZXZjICYmIGdldF9kYmdfZmxhZzIoaGV2YykpIHsKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSIlcyB3b3Jrc3BhY2UgKCV4ICV4KSBzaXplID0gJXhcbiIsIF9fZnVuY19fLAorCQkJICAgYnVmX3NwZWMtPnN0YXJ0X2FkciwgYnVmX3NwZWMtPmVuZF9hZHIsCisJCQkgICBidWZfc3BlYy0+ZW5kX2FkciAtIGJ1Zl9zcGVjLT5zdGFydF9hZHIpOworCisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJpcHAuYnVmX3N0YXJ0ICAgICAgICAgICAgIDoleFxuIiwKKwkJCWJ1Zl9zcGVjLT5pcHAuYnVmX3N0YXJ0KTsKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJInNhb19hYnYuYnVmX3N0YXJ0ICAgICAgICAgIDoleFxuIiwKKwkJCWJ1Zl9zcGVjLT5zYW9fYWJ2LmJ1Zl9zdGFydCk7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJzYW9fdmIuYnVmX3N0YXJ0ICAgICAgICAgIDoleFxuIiwKKwkJCWJ1Zl9zcGVjLT5zYW9fdmIuYnVmX3N0YXJ0KTsKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJInNob3J0X3Rlcm1fcnBzLmJ1Zl9zdGFydCAgOiV4XG4iLAorCQkJYnVmX3NwZWMtPnNob3J0X3Rlcm1fcnBzLmJ1Zl9zdGFydCk7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJ2cHMuYnVmX3N0YXJ0ICAgICAgICAgICAgIDoleFxuIiwKKwkJCWJ1Zl9zcGVjLT52cHMuYnVmX3N0YXJ0KTsKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJInNwcy5idWZfc3RhcnQgICAgICAgICAgICAgOiV4XG4iLAorCQkJYnVmX3NwZWMtPnNwcy5idWZfc3RhcnQpOworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkicHBzLmJ1Zl9zdGFydCAgICAgICAgICAgICA6JXhcbiIsCisJCQlidWZfc3BlYy0+cHBzLmJ1Zl9zdGFydCk7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJzYW9fdXAuYnVmX3N0YXJ0ICAgICAgICAgIDoleFxuIiwKKwkJCWJ1Zl9zcGVjLT5zYW9fdXAuYnVmX3N0YXJ0KTsKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJInN3YXBfYnVmLmJ1Zl9zdGFydCAgICAgICAgOiV4XG4iLAorCQkJYnVmX3NwZWMtPnN3YXBfYnVmLmJ1Zl9zdGFydCk7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJzd2FwX2J1ZjIuYnVmX3N0YXJ0ICAgICAgIDoleFxuIiwKKwkJCWJ1Zl9zcGVjLT5zd2FwX2J1ZjIuYnVmX3N0YXJ0KTsKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJInNjYWxlbHV0LmJ1Zl9zdGFydCAgICAgICAgOiV4XG4iLAorCQkJYnVmX3NwZWMtPnNjYWxlbHV0LmJ1Zl9zdGFydCk7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJkYmxrX3BhcmEuYnVmX3N0YXJ0ICAgICAgIDoleFxuIiwKKwkJCWJ1Zl9zcGVjLT5kYmxrX3BhcmEuYnVmX3N0YXJ0KTsKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJImRibGtfZGF0YS5idWZfc3RhcnQgICAgICAgOiV4XG4iLAorCQkJYnVmX3NwZWMtPmRibGtfZGF0YS5idWZfc3RhcnQpOworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiZGJsa19kYXRhMi5idWZfc3RhcnQgICAgICAgOiV4XG4iLAorCQkJYnVmX3NwZWMtPmRibGtfZGF0YTIuYnVmX3N0YXJ0KTsKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJIm1wcmVkX2Fib3ZlLmJ1Zl9zdGFydCAgICAgOiV4XG4iLAorCQkJYnVmX3NwZWMtPm1wcmVkX2Fib3ZlLmJ1Zl9zdGFydCk7CisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkibXByZWRfbXYuYnVmX3N0YXJ0ICAgICAgICA6JXhcbiIsCisJCQkgIGJ1Zl9zcGVjLT5tcHJlZF9tdi5idWZfc3RhcnQpOworI2VuZGlmCisJCWlmICgoZ2V0X2RiZ19mbGFnMihoZXZjKQorCQkJJgorCQkJSDI2NV9ERUJVR19TRU5EX1BBUkFNX1dJVEhfUkVHKQorCQkJPT0gMCkgeworCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSJycG0uYnVmX3N0YXJ0ICAgICAgICAgICAgIDoleFxuIiwKKwkJCQkgICBidWZfc3BlYy0+cnBtLmJ1Zl9zdGFydCk7CisJCX0KKwl9CisKK30KKworZW51bSBTbGljZVR5cGUgeworCUJfU0xJQ0UsCisJUF9TTElDRSwKKwlJX1NMSUNFCit9OworCisvKlVTRV9CVUZfQkxPQ0sqLworc3RydWN0IEJVRl9zIHsKKwl1bG9uZwlzdGFydF9hZHI7CisJdTMyCXNpemU7CisJdTMyCWx1bWFfc2l6ZTsKKwl1bG9uZwloZWFkZXJfYWRkcjsKKwl1MzIgCWhlYWRlcl9zaXplOworCWludAl1c2VkX2ZsYWc7CisJdWxvbmcJdjRsX3JlZl9idWZfYWRkcjsKKwl1bG9uZwljaHJvbWFfYWRkcjsKKwl1MzIJY2hyb21hX3NpemU7Cit9IC8qQlVGX3QgKi87CisKKy8qIGxldmVsIDYsIDYuMSBtYXhpbXVtIHNsaWNlIG51bWJlciBpcyA4MDA7IG90aGVyIGlzIDIwMCAqLworI2RlZmluZSBNQVhfU0xJQ0VfTlVNIDgwMAorc3RydWN0IFBJQ19zIHsKKwlpbnQgaW5kZXg7CisJaW50IHNjYXR0ZXJfYWxsb2M7CisJaW50IEJVRl9pbmRleDsKKwlpbnQgbXZfYnVmX2luZGV4OworCWludCBQT0M7CisJaW50IGRlY29kZV9pZHg7CisJaW50IHNsaWNlX3R5cGU7CisJaW50IFJlZk51bV9MMDsKKwlpbnQgUmVmTnVtX0wxOworCWludCBudW1fcmVvcmRlcl9waWM7CisJaW50IHN0cmVhbV9vZmZzZXQ7CisJdW5zaWduZWQgY2hhciByZWZlcmVuY2VkOworCXVuc2lnbmVkIGNoYXIgb3V0cHV0X21hcms7CisJdW5zaWduZWQgY2hhciByZWNvbl9tYXJrOworCXVuc2lnbmVkIGNoYXIgb3V0cHV0X3JlYWR5OworCXVuc2lnbmVkIGNoYXIgZXJyb3JfbWFyazsKKwkvL2Rpc19tYXJrID0gMDpkaXNjYXJkIG1hcmssZGlzX21hcmsgPSAxOm5vIGRpc2NhcmQgbWFyaworCXVuc2lnbmVkIGNoYXIgZGlzX21hcms7CisJLyoqLyBpbnQgc2xpY2VfaWR4OworCWludCBtX2FpUmVmUE9DTGlzdDBbTUFYX1NMSUNFX05VTV1bMTZdOworCWludCBtX2FpUmVmUE9DTGlzdDFbTUFYX1NMSUNFX05VTV1bMTZdOworI2lmZGVmIFNVUFBPUlRfTE9OR19URVJNX1JQUworCXVuc2lnbmVkIGNoYXIgbG9uZ190ZXJtX3JlZjsKKwl1bnNpZ25lZCBjaGFyIG1fYWlSZWZMVGZsZ0xpc3QwW01BWF9TTElDRV9OVU1dWzE2XTsKKwl1bnNpZ25lZCBjaGFyIG1fYWlSZWZMVGZsZ0xpc3QxW01BWF9TTElDRV9OVU1dWzE2XTsKKyNlbmRpZgorCS8qYnVmZmVyICovCisJdW5zaWduZWQgaW50IGhlYWRlcl9hZHI7CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwl1bnNpZ25lZCBjaGFyIGR2X2VuaGFuY2VfZXhpc3Q7CisjZW5kaWYKKwljaGFyICphdXhfZGF0YV9idWY7CisJaW50IGF1eF9kYXRhX3NpemU7CisJdW5zaWduZWQgbG9uZyBjbWFfYWxsb2NfYWRkcjsKKwlzdHJ1Y3QgcGFnZSAqYWxsb2NfcGFnZXM7CisJdW5zaWduZWQgaW50IG1wcmVkX212X3dyX3N0YXJ0X2FkZHI7CisJaW50IG12X3NpemU7CisJdW5zaWduZWQgaW50IG1jX3lfYWRyOworCXVuc2lnbmVkIGludCBtY191X3ZfYWRyOworI2lmZGVmIFNVUFBPUlRfMTBCSVQKKwkvKnVuc2lnbmVkIGludCBjb21wX2JvZHlfc2l6ZTsqLworCXVuc2lnbmVkIGludCBkd195X2FkcjsKKwl1bnNpZ25lZCBpbnQgZHdfdV92X2FkcjsKKyNlbmRpZgorCXUzMglsdW1hX3NpemU7CisJdTMyCWNocm9tYV9zaXplOworCisJaW50IG1jX2NhbnZhc195OworCWludCBtY19jYW52YXNfdV92OworCWludCB3aWR0aDsKKwlpbnQgaGVpZ2h0OworCisJaW50IHlfY2FudmFzX2luZGV4OworCWludCB1dl9jYW52YXNfaW5kZXg7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCXN0cnVjdCBjYW52YXNfY29uZmlnX3MgY2FudmFzX2NvbmZpZ1syXTsKKyNlbmRpZgorI2lmZGVmIFNVUFBPUlRfMTBCSVQKKwlpbnQgbWVtX3NhdmluZ19tb2RlOworCXUzMiBiaXRfZGVwdGhfbHVtYTsKKwl1MzIgYml0X2RlcHRoX2Nocm9tYTsKKyNlbmRpZgorI2lmZGVmIExPU0xFU1NfQ09NUFJFU1NfTU9ERQorCXVuc2lnbmVkIGludCBsb3NsZXNzX2NvbXBfYm9keV9zaXplOworI2VuZGlmCisJdW5zaWduZWQgY2hhciBwaWNfc3RydWN0OworCWludCB2Zl9yZWY7CisKKwl1MzIgcHRzOworCXU2NCBwdHM2NDsKKwl1NjQgdGltZXN0YW1wOworCisJdTMyIGFzcGVjdF9yYXRpb19pZGM7CisJdTMyIHNhcl93aWR0aDsKKwl1MzIgc2FyX2hlaWdodDsKKwl1MzIgZG91YmxlX3dyaXRlX21vZGU7CisJdTMyIHZpZGVvX3NpZ25hbF90eXBlOworCXVuc2lnbmVkIHNob3J0IGNvbmZvcm1hbmNlX3dpbmRvd19mbGFnOworCXVuc2lnbmVkIHNob3J0IGNvbmZfd2luX2xlZnRfb2Zmc2V0OworCXVuc2lnbmVkIHNob3J0IGNvbmZfd2luX3JpZ2h0X29mZnNldDsKKwl1bnNpZ25lZCBzaG9ydCBjb25mX3dpbl90b3Bfb2Zmc2V0OworCXVuc2lnbmVkIHNob3J0IGNvbmZfd2luX2JvdHRvbV9vZmZzZXQ7CisJdW5zaWduZWQgc2hvcnQgY2hyb21hX2Zvcm1hdF9pZGM7CisKKwkvKiBwaWN0dXJlIHFvcyBpbmZvbWF0aW9uKi8KKwlpbnQgbWF4X3FwOworCWludCBhdmdfcXA7CisJaW50IG1pbl9xcDsKKwlpbnQgbWF4X3NraXA7CisJaW50IGF2Z19za2lwOworCWludCBtaW5fc2tpcDsKKwlpbnQgbWF4X212OworCWludCBtaW5fbXY7CisJaW50IGF2Z19tdjsKKworCXUzMiBod19kZWNvZGVfdGltZTsKKwl1MzIgZnJhbWVfc2l6ZTsgLy8gRm9yIGZyYW1lIGJhc2UgbW9kZQorCWJvb2wgaXBfbW9kZTsKKwl1MzIgaGRyMTBwX2RhdGFfc2l6ZTsKKwljaGFyICpoZHIxMHBfZGF0YV9idWY7CisJc3RydWN0IGRtYV9mZW5jZSAqZmVuY2U7CisJYm9vbCBzaG93X2ZyYW1lOworCWludCAgY3R4X2J1Zl9pZHg7Cit9IC8qUElDX3QgKi87CisKKyNkZWZpbmUgTUFYX1RJTEVfQ09MX05VTSAgICAxMAorI2RlZmluZSBNQVhfVElMRV9ST1dfTlVNICAgMjAKK3N0cnVjdCB0aWxlX3MgeworCWludCB3aWR0aDsKKwlpbnQgaGVpZ2h0OworCWludCBzdGFydF9jdV94OworCWludCBzdGFydF9jdV95OworCisJdW5zaWduZWQgaW50IHNhb192Yl9zdGFydF9hZGRyOworCXVuc2lnbmVkIGludCBzYW9fYWJ2X3N0YXJ0X2FkZHI7Cit9OworCisjZGVmaW5lIFNFSV9NQVNURVJfRElTUExBWV9DT0xPUl9NQVNLIDB4MDAwMDAwMDEKKyNkZWZpbmUgU0VJX0NPTlRFTlRfTElHSFRfTEVWRUxfTUFTSyAgMHgwMDAwMDAwMgorI2RlZmluZSBTRUlfSERSMTBQTFVTX01BU0sJCQkgIDB4MDAwMDAwMDQKKyNkZWZpbmUgU0VJX0hEUl9DVVZBX01BU0sJICAgICAgMHgwMDAwMDAwOAorCisKKyNkZWZpbmUgVkZfUE9PTF9TSVpFICAgICAgICAzMgorCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorI2RlZmluZSBERUNfUkVTVUxUX05PTkUgICAgICAgICAgICAgMAorI2RlZmluZSBERUNfUkVTVUxUX0RPTkUgICAgICAgICAgICAgMQorI2RlZmluZSBERUNfUkVTVUxUX0FHQUlOICAgICAgICAgICAgMgorI2RlZmluZSBERUNfUkVTVUxUX0NPTkZJR19QQVJBTSAgICAgMworI2RlZmluZSBERUNfUkVTVUxUX0VSUk9SICAgICAgICAgICAgNAorI2RlZmluZSBERUNfSU5JVF9QSUNMSVNUCQkJNQorI2RlZmluZSBERUNfVU5JTklUX1BJQ0xJU1QJCQk2CisjZGVmaW5lIERFQ19SRVNVTFRfR0VUX0RBVEEgICAgICAgICA3CisjZGVmaW5lIERFQ19SRVNVTFRfR0VUX0RBVEFfUkVUUlkgICA4CisjZGVmaW5lIERFQ19SRVNVTFRfRU9TICAgICAgICAgICAgICA5CisjZGVmaW5lIERFQ19SRVNVTFRfRk9SQ0VfRVhJVCAgICAgICAxMAorI2RlZmluZSBERUNfUkVTVUxUX0ZSRUVfQ0FOVkFTICAgICAgMTEKKworCitzdGF0aWMgdm9pZCB2aDI2NV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgdm9pZCB2aDI2NV90aW1lb3V0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3N0YXRpYyB2b2lkIHZoMjY1X25vdGlmeV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKKyNlbmRpZgorCitzdHJ1Y3QgZGVidWdfbG9nX3MgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1aW50OF90IGRhdGE7IC8qd2lsbCBhbGxvYyBtb3JlIHNpemUqLworfTsKKworc3RydWN0IG1oMjY1X2ZlbmNlX3ZmX3QgeworCXUzMiB1c2VkX3NpemU7CisJc3RydWN0IHZmcmFtZV9zICpmZW5jZV92ZltWRl9QT09MX1NJWkVdOworfTsKKworc3RydWN0IGhldmNfc3RhdGVfcyB7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRmb3JtX2RldjsKKwl2b2lkICgqdmRlY19jYikoc3RydWN0IHZkZWNfcyAqLCB2b2lkICopOworCXZvaWQgKnZkZWNfY2JfYXJnOworCXN0cnVjdCB2ZnJhbWVfY2h1bmtfcyAqY2h1bms7CisJaW50IGRlY19yZXN1bHQ7CisJdTMyIHRpbWVvdXRfcHJvY2Vzc2luZzsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdGltZW91dF93b3JrOworCXN0cnVjdCB3b3JrX3N0cnVjdCBub3RpZnlfd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc2V0X2Nsa193b3JrOworCS8qIHRpbWVvdXQgaGFuZGxlICovCisJdW5zaWduZWQgbG9uZyBpbnQgc3RhcnRfcHJvY2Vzc190aW1lOworCXVuc2lnbmVkIGludCBsYXN0X2xjdV9pZHg7CisJdW5zaWduZWQgaW50IGRlY29kZV90aW1lb3V0X2NvdW50OworCXVuc2lnbmVkIGludCB0aW1lb3V0X251bTsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCXVuc2lnbmVkIGNoYXIgc3dpdGNoX2R2bGF5ZXJfZmxhZzsKKwl1bnNpZ25lZCBjaGFyIG5vX3N3aXRjaF9kdmxheWVyX2NvdW50OworCXVuc2lnbmVkIGNoYXIgYnlwYXNzX2R2ZW5sX2VuYWJsZTsKKwl1bnNpZ25lZCBjaGFyIGJ5cGFzc19kdmVubDsKKyNlbmRpZgorCXVuc2lnbmVkIGNoYXIgc3RhcnRfcGFyc2VyX3R5cGU7CisJLypzdGFydF9kZWNvZGluZ19mbGFnOgorCXZwcy9wcHMvc3BzL2lkciBpbmZvIGZyb20gdWNvZGUqLworCXVuc2lnbmVkIGNoYXIgc3RhcnRfZGVjb2RpbmdfZmxhZzsKKwl1bnNpZ25lZCBjaGFyIHJwc19zZXRfaWQ7CisJdW5zaWduZWQgY2hhciBlb3M7CisJaW50IHBpY19kZWNvZGVkX2xjdV9pZHg7CisJdTggb3Zlcl9kZWNvZGU7CisJdTggZW1wdHlfZmxhZzsKKyNlbmRpZgorCXN0cnVjdCB2ZnJhbWVfcyB2ZnJhbWVfZHVtbXk7CisJY2hhciAqcHJvdmlkZXJfbmFtZTsKKwlpbnQgaW5kZXg7CisJc3RydWN0IGRldmljZSAqY21hX2RldjsKKwl1bnNpZ25lZCBjaGFyIG1faW5zX2ZsYWc7CisJdW5zaWduZWQgY2hhciBkb2xieV9lbmhhbmNlX2ZsYWc7CisJdW5zaWduZWQgbG9uZyBidWZfc3RhcnQ7CisJdTMyIGJ1Zl9zaXplOworCXUzMiBtdl9idWZfc2l6ZTsKKworCXN0cnVjdCBCdWZmSW5mb19zIHdvcmtfc3BhY2VfYnVmX3N0b3JlOworCXN0cnVjdCBCdWZmSW5mb19zICp3b3JrX3NwYWNlX2J1ZjsKKworCXU4IGF1eF9kYXRhX2RpcnR5OworCXUzMiBwcmVmaXhfYXV4X3NpemU7CisJdTMyIHN1ZmZpeF9hdXhfc2l6ZTsKKwl2b2lkICphdXhfYWRkcjsKKwl2b2lkICpycG1fYWRkcjsKKwl2b2lkICpsbWVtX2FkZHI7CisJZG1hX2FkZHJfdCBhdXhfcGh5X2FkZHI7CisJZG1hX2FkZHJfdCBycG1fcGh5X2FkZHI7CisJZG1hX2FkZHJfdCBsbWVtX3BoeV9hZGRyOworCisJdW5zaWduZWQgaW50IHBpY19saXN0X2luaXRfZmxhZzsKKwl1bnNpZ25lZCBpbnQgdXNlX2NtYV9mbGFnOworCisJdW5zaWduZWQgc2hvcnQgKnJwbV9wdHI7CisJdW5zaWduZWQgc2hvcnQgKmxtZW1fcHRyOworCXVuc2lnbmVkIHNob3J0ICpkZWJ1Z19wdHI7CisJaW50IGRlYnVnX3B0cl9zaXplOworCWludCBwaWNfdzsKKwlpbnQgcGljX2g7CisJaW50IGxjdV94X251bTsKKwlpbnQgbGN1X3lfbnVtOworCWludCBsY3VfdG90YWw7CisJaW50IGxjdV9zaXplOworCWludCBsY3Vfc2l6ZV9sb2cyOworCWludCBsY3VfeF9udW1fcHJlOworCWludCBsY3VfeV9udW1fcHJlOworCWludCBmaXJzdF9waWNfYWZ0ZXJfcmVjb3ZlcjsKKworCWludCBudW1fdGlsZV9jb2w7CisJaW50IG51bV90aWxlX3JvdzsKKwlpbnQgdGlsZV9lbmFibGVkOworCWludCB0aWxlX3g7CisJaW50IHRpbGVfeTsKKwlpbnQgdGlsZV95X3g7CisJaW50IHRpbGVfc3RhcnRfbGN1X3g7CisJaW50IHRpbGVfc3RhcnRfbGN1X3k7CisJaW50IHRpbGVfd2lkdGhfbGN1OworCWludCB0aWxlX2hlaWdodF9sY3U7CisKKwlpbnQgc2xpY2VfdHlwZTsKKwl1bnNpZ25lZCBpbnQgc2xpY2VfYWRkcjsKKwl1bnNpZ25lZCBpbnQgc2xpY2Vfc2VnbWVudF9hZGRyOworCisJdW5zaWduZWQgY2hhciBpbnRlcmxhY2VfZmxhZzsKKwl1bnNpZ25lZCBjaGFyIGN1cnJfcGljX3N0cnVjdDsKKwl1bnNpZ25lZCBjaGFyIGZyYW1lX2ZpZWxkX2luZm9fcHJlc2VudF9mbGFnOworCisJdW5zaWduZWQgc2hvcnQgc3BzX251bV9yZW9yZGVyX3BpY3NfMDsKKwl1bnNpZ25lZCBzaG9ydCBtaXNjX2ZsYWcwOworCWludCBtX3RlbXBvcmFsSWQ7CisJaW50IG1fbmFsVW5pdFR5cGU7CisJaW50IFRNVlBGbGFnOworCWludCBpc05leHRTbGljZVNlZ21lbnQ7CisJaW50IExEQ0ZsYWc7CisJaW50IG1fcG9jUmFuZG9tQWNjZXNzOworCWludCBwbGV2ZWw7CisJaW50IE1heE51bU1lcmdlQ2FuZDsKKworCWludCBuZXdfcGljOworCWludCBuZXdfdGlsZTsKKwlpbnQgY3Vycl9QT0M7CisJaW50IGlQcmV2UE9DOworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlpbnQgZGVjb2RlZF9wb2M7CisJc3RydWN0IFBJQ19zICpkZWNvZGluZ19waWM7CisjZW5kaWYKKwlpbnQgaVByZXZUaWQwUE9DOworCWludCBsaXN0X25vOworCWludCBSZWZOdW1fTDA7CisJaW50IFJlZk51bV9MMTsKKwlpbnQgQ29sRnJvbUwwRmxhZzsKKwlpbnQgTG9uZ1Rlcm1fQ3VycjsKKwlpbnQgTG9uZ1Rlcm1fQ29sOworCWludCBDb2xfUE9DOworCWludCBMb25nVGVybV9SZWY7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCWludCBtX3BvY1JhbmRvbUFjY2Vzc19iYWs7CisJaW50IGN1cnJfUE9DX2JhazsKKwlpbnQgaVByZXZQT0NfYmFrOworCWludCBpUHJldlRpZDBQT0NfYmFrOworCXVuc2lnbmVkIGNoYXIgc3RhcnRfcGFyc2VyX3R5cGVfYmFrOworCXVuc2lnbmVkIGNoYXIgc3RhcnRfZGVjb2RpbmdfZmxhZ19iYWs7CisJdW5zaWduZWQgY2hhciBycHNfc2V0X2lkX2JhazsKKwlpbnQgcGljX2RlY29kZWRfbGN1X2lkeF9iYWs7CisJaW50IGRlY29kZV9pZHhfYmFrOworI2VuZGlmCisJc3RydWN0IFBJQ19zICpjdXJfcGljOworCXN0cnVjdCBQSUNfcyAqY29sX3BpYzsKKwlpbnQgc2tpcF9mbGFnOworCWludCBkZWNvZGVfaWR4OworCWludCBzbGljZV9pZHg7CisJdW5zaWduZWQgY2hhciBoYXZlX3ZwczsKKwl1bnNpZ25lZCBjaGFyIGhhdmVfc3BzOworCXVuc2lnbmVkIGNoYXIgaGF2ZV9wcHM7CisJdW5zaWduZWQgY2hhciBoYXZlX3ZhbGlkX3N0YXJ0X3NsaWNlOworCXVuc2lnbmVkIGNoYXIgd2FpdF9idWY7CisJdW5zaWduZWQgY2hhciBlcnJvcl9mbGFnOworCXVuc2lnbmVkIGludCBlcnJvcl9za2lwX25hbF9jb3VudDsKKwlsb25nIHVzZWRfNGtfbnVtOworCisJdW5zaWduZWQgY2hhcgorCWlnbm9yZV9idWZtZ3JfZXJyb3I7CS8qIGJpdCAwLCBmb3IgZGVjb2Rpbmc7CisJCQliaXQgMSwgZm9yIGRpc3BsYXlpbmcKKwkJCWJpdCAxIG11c3QgYmUgc2V0IGlmIGJpdCAwIGlzIDEqLworCWludCBQQl9za2lwX21vZGU7CisJaW50IFBCX3NraXBfY291bnRfYWZ0ZXJfZGVjb2Rpbmc7CisjaWZkZWYgU1VQUE9SVF8xMEJJVAorCWludCBtZW1fc2F2aW5nX21vZGU7CisjZW5kaWYKKyNpZmRlZiBMT1NMRVNTX0NPTVBSRVNTX01PREUKKwl1bnNpZ25lZCBpbnQgbG9zbGVzc19jb21wX2JvZHlfc2l6ZTsKKyNlbmRpZgorCWludCBwdHNfbW9kZTsKKwlpbnQgbGFzdF9sb29rdXBfcHRzOworCWludCBsYXN0X3B0czsKKwl1NjQgbGFzdF9sb29rdXBfcHRzX3VzNjQ7CisJdTY0IGxhc3RfcHRzX3VzNjQ7CisJdTMyIHNoaWZ0X2J5dGVfY291bnRfbG87CisJdTMyIHNoaWZ0X2J5dGVfY291bnRfaGk7CisJaW50IHB0c19tb2RlX3N3aXRjaGluZ19jb3VudDsKKwlpbnQgcHRzX21vZGVfcmVjb3ZlcnlfY291bnQ7CisKKwlpbnQgcGljX251bTsKKworCS8qKi8KKwl1bmlvbiBwYXJhbV91IHBhcmFtOworCisJc3RydWN0IHRpbGVfcyBtX3RpbGVbTUFYX1RJTEVfUk9XX05VTV1bTUFYX1RJTEVfQ09MX05VTV07CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwlzdHJ1Y3QgQlVGX3MgbV9CVUZbQlVGX1BPT0xfU0laRV07CisJc3RydWN0IEJVRl9zIG1fbXZfQlVGW01BWF9SRUZfUElDX05VTV07CisJc3RydWN0IFBJQ19zICptX1BJQ1tNQVhfUkVGX1BJQ19OVU1dOworCisJREVDTEFSRV9LRklGTyhuZXdmcmFtZV9xLCBzdHJ1Y3QgdmZyYW1lX3MgKiwgVkZfUE9PTF9TSVpFKTsKKwlERUNMQVJFX0tGSUZPKGRpc3BsYXlfcSwgc3RydWN0IHZmcmFtZV9zICosIFZGX1BPT0xfU0laRSk7CisJREVDTEFSRV9LRklGTyhwZW5kaW5nX3EsIHN0cnVjdCB2ZnJhbWVfcyAqLCBWRl9QT09MX1NJWkUpOworCXN0cnVjdCB2ZnJhbWVfcyB2ZnBvb2xbVkZfUE9PTF9TSVpFXTsKKworCXUzMiBzdGF0OworCXUzMiBmcmFtZV93aWR0aDsKKwl1MzIgZnJhbWVfaGVpZ2h0OworCXUzMiBmcmFtZV9kdXI7CisJdTMyIGZyYW1lX2FyOworCXUzMiBiaXRfZGVwdGhfbHVtYTsKKwl1MzIgYml0X2RlcHRoX2Nocm9tYTsKKwl1MzIgdmlkZW9fc2lnbmFsX3R5cGU7CisJdTMyIHZpZGVvX3NpZ25hbF90eXBlX2RlYnVnOworCXUzMiBzYXZlZF9yZXNvbHV0aW9uOworCWJvb2wgZ2V0X2ZyYW1lX2R1cjsKKwl1MzIgZXJyb3Jfd2F0Y2hkb2dfY291bnQ7CisJdTMyIGVycm9yX3NraXBfbmFsX3d0X2NudDsKKwl1MzIgZXJyb3Jfc3lzdGVtX3dhdGNoZG9nX2NvdW50OworCisjaWZkZWYgREVCVUdfUFRTCisJdW5zaWduZWQgbG9uZyBwdHNfbWlzc2VkOworCXVuc2lnbmVkIGxvbmcgcHRzX2hpdDsKKyNlbmRpZgorCXN0cnVjdCBkZWNfc3lzaW5mbyB2aDI2NV9hbXN0cmVhbV9kZWNfaW5mbzsKKwl1bnNpZ25lZCBjaGFyIGluaXRfZmxhZzsKKwl1bnNpZ25lZCBjaGFyIGZpcnN0X3NjX2NoZWNrZWQ7CisJdW5zaWduZWQgY2hhciB1bmluaXRfbGlzdDsKKwl1MzIgc3RhcnRfZGVjb2RpbmdfdGltZTsKKworCWludCBzaG93X2ZyYW1lX251bTsKKyNpZmRlZiBVU0VfVU5JTklUX1NFTUEKKwlzdHJ1Y3Qgc2VtYXBob3JlIGgyNjVfdW5pbml0X2RvbmVfc2VtYTsKKyNlbmRpZgorCWludCBmYXRhbF9lcnJvcjsKKworCisJdTMyIHNlaV9wcmVzZW50X2ZsYWc7CisJdm9pZCAqZnJhbWVfbW11X21hcF9hZGRyOworCWRtYV9hZGRyX3QgZnJhbWVfbW11X21hcF9waHlfYWRkcjsKKwl1bnNpZ25lZCBpbnQgbW11X21jX2J1Zl9zdGFydDsKKwl1bnNpZ25lZCBpbnQgbW11X21jX2J1Zl9lbmQ7CisJdW5zaWduZWQgaW50IG1tdV9tY19zdGFydF80a19hZHI7CisJdm9pZCAqbW11X2JveDsKKwl2b2lkICpibW11X2JveDsKKwlpbnQgbW11X2VuYWJsZTsKKworCXVuc2lnbmVkIGludCBkZWNfc3RhdHVzOworCisJLyogZGF0YSBmb3IgU0VJX01BU1RFUl9ESVNQTEFZX0NPTE9SICovCisJdW5zaWduZWQgaW50IHByaW1hcmllc1szXVsyXTsKKwl1bnNpZ25lZCBpbnQgd2hpdGVfcG9pbnRbMl07CisJdW5zaWduZWQgaW50IGx1bWluYW5jZVsyXTsKKwkvKiBkYXRhIGZvciBTRUlfQ09OVEVOVF9MSUdIVF9MRVZFTCAqLworCXVuc2lnbmVkIGludCBjb250ZW50X2xpZ2h0X2xldmVsWzJdOworCisJc3RydWN0IFBJQ19zICpwcmVfdG9wX3BpYzsKKwlzdHJ1Y3QgUElDX3MgKnByZV9ib3RfcGljOworCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCWludCBkb3VibGVfd3JpdGVfbW9kZTsKKwlpbnQgZHluYW1pY19idWZfbnVtX21hcmdpbjsKKwlpbnQgc3RhcnRfYWN0aW9uOworCWludCBzYXZlX2J1ZmZlcl9tb2RlOworI2VuZGlmCisJdTMyIGlfb25seTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxvZ19saXN0OworCXUzMiB1Y29kZV9wYXVzZV9wb3M7CisJdTMyIHN0YXJ0X3NoaWZ0X2J5dGVzOworCisJYXRvbWljX3QgdmZfcHJlX2NvdW50OworCWF0b21pY190IHZmX2dldF9jb3VudDsKKwlhdG9taWNfdCB2Zl9wdXRfY291bnQ7CisjaWZkZWYgU1dBUF9IRVZDX1VDT0RFCisJZG1hX2FkZHJfdCBtY19kbWFfaGFuZGxlOworCXZvaWQgKm1jX2NwdV9hZGRyOworCWludCBzd2FwX3NpemU7CisJdWxvbmcgc3dhcF9hZGRyOworI2VuZGlmCisjaWZkZWYgREVUUkVGSUxMX0VOQUJMRQorCWRtYV9hZGRyX3QgZGV0YnVmX2FkcjsKKwl1MTYgKmRldGJ1Zl9hZHJfdmlydDsKKwl1OCBkZWxyZWZpbGxfY2hlY2s7CisjZW5kaWYKKwl1OCBoZWFkX2Vycm9yX2ZsYWc7CisJaW50IHZhbHZlX2NvdW50OworCXN0cnVjdCBmaXJtd2FyZV9zICpmdzsKKwlpbnQgbWF4X3BpY193OworCWludCBtYXhfcGljX2g7CisjaWZkZWYgQUdBSU5fSEFTX1RIUkVTSE9MRAorCXU4IG5leHRfYWdhaW5fZmxhZzsKKwl1MzIgcHJlX3BhcnNlcl93cl9wdHI7CisjZW5kaWYKKwl1MzIgcmF0aW9fY29udHJvbDsKKwl1MzIgZmlyc3RfcGljX2ZsYWc7CisJdTMyIGRlY29kZV9zaXplOworCXN0cnVjdCBtdXRleCBjaHVua3NfbXV0ZXg7CisJaW50IG5lZWRfY2FjaGVfc2l6ZTsKKwl1NjQgc2Nfc3RhcnRfdGltZTsKKwl1MzIgc2tpcF9uYWxfY291bnQ7CisJYm9vbCBpc19zd2FwOworCWJvb2wgaXNfNGs7CisKKwlpbnQgZnJhbWVpbmZvX2VuYWJsZTsKKwlzdHJ1Y3QgdmZyYW1lX3Fvc19zIHZmcmFtZV9xb3M7CisJYm9vbCBpc191c2VkX3Y0bDsKKwl2b2lkICp2NGwyX2N0eDsKKwlib29sIHY0bF9wYXJhbXNfcGFyc2VkOworCXUzMiBtZW1fbWFwX21vZGU7CisJdTMyIHBlcmZvcm1hbmNlX3Byb2ZpbGU7CisJc3RydWN0IHZkZWNfaW5mbyAqZ3ZzOworCWJvb2wgaXBfbW9kZTsKKwl1MzIga3BpX2ZpcnN0X2lfY29tbWluZzsKKwl1MzIga3BpX2ZpcnN0X2lfZGVjb2RlZDsKKwlpbnQgc2lkZWJpbmRfdHlwZTsKKwlpbnQgc2lkZWJpbmRfY2hhbm5lbF9pZDsKKwl1MzIgYWdhaW5fY291bnQ7CisJdTY0IGFnYWluX3RpbWVvdXRfamlmZmllczsKKwl1MzIgcHJlX3BhcnNlcl92aWRlb19ycDsKKwl1MzIgcHJlX3BhcnNlcl92aWRlb193cDsKKwlib29sIGR2X2R1YWxsYXllcjsKKwl1MzIgcG9jX2Vycm9yX2NvdW50OworCXUzMiB0aW1lb3V0X2ZsYWc7CisJdWxvbmcgdGltZW91dDsKKwlib29sIGRpc2NhcmRfZHZfZGF0YTsKKwlib29sIGVuYWJsZV9mZW5jZTsKKwlpbnQgZmVuY2VfdXNhZ2U7CisJaW50IGJ1ZmZlcl93cmFwW01BWF9SRUZfUElDX05VTV07CisJaW50IGxvd19sYXRlbmN5X2ZsYWc7CisJdTMyIG1ldGFkYXRhX2NvbmZpZ19mbGFnOworCWludCBsYXN0X3dpZHRoOworCWludCBsYXN0X2hlaWdodDsKKwlpbnQgdXNlZF9idWZfbnVtOworCXUzMiBkaXJ0eV9zaGlmdF9mbGFnOworCXUzMiBlbmRpYW47CisJdWxvbmcgZmJfdG9rZW47CisJaW50IHNlbmRfZnJhbWVfZmxhZzsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAgKnBhaXJfZmJbMl07CisJc3RydWN0IG1oMjY1X2ZlbmNlX3ZmX3QgZmVuY2VfdmZfczsKKwlzdHJ1Y3QgbXV0ZXggZmVuY2VfbXV0ZXg7CisJYm9vbCByZXNvbHV0aW9uX2NoYW5nZTsKKwlkbWFfYWRkcl90IHJkbWFfcGh5X2FkcjsKKwl1bnNpZ25lZCAqcmRtYV9hZHI7CisJYm9vbCBub19uZWVkX2F1eF9kYXRhOworCXN0cnVjdCB0cmFjZV9kZWNvZGVyX25hbWUgdHJhY2U7Cit9IC8qaGV2Y19zdHJ1X3QgKi87CisKKyNpZmRlZiBBR0FJTl9IQVNfVEhSRVNIT0xECitzdGF0aWMgdTMyIGFnYWluX3RocmVzaG9sZDsKKyNlbmRpZgorI2lmZGVmIFNFTkRfTE1FTV9XSVRIX1JQTQorI2RlZmluZSBnZXRfbG1lbV9wYXJhbXMoaGV2YywgbGFkcikgXAorCWhldmMtPmxtZW1fcHRyW2xhZHIgLSAobGFkciAmIDB4MykgKyAzIC0gKGxhZHIgJiAweDMpXQorCisKK3N0YXRpYyBpbnQgZ2V0X2ZyYW1lX21tdV9tYXBfc2l6ZSh2b2lkKQoreworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkKKwkJcmV0dXJuIChNQVhfRlJBTUVfOEtfTlVNICogNCk7CisKKwlyZXR1cm4gKE1BWF9GUkFNRV80S19OVU0gKiA0KTsKK30KKworc3RhdGljIGludCBpc19vdmVyc2l6ZShpbnQgdywgaW50IGgpCit7CisJaW50IG1heCA9IChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSk/CisJCU1BWF9TSVpFXzhLIDogTUFYX1NJWkVfNEs7CisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNUQpCisJCW1heCA9IE1BWF9TSVpFXzJLOworCisJaWYgKHcgPCAwIHx8IGggPCAwKQorCQlyZXR1cm4gdHJ1ZTsKKworCWlmIChoICE9IDAgJiYgKHcgPiBtYXggLyBoKSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK2ludCBpc19vdmVyc2l6ZV9leChpbnQgdywgaW50IGgpCit7CisJaW50IG1heCA9IChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkgPworCQlNQVhfU0laRV84SyA6IE1BWF9TSVpFXzRLOworCisJaWYgKHcgPT0gMCB8fCBoID09IDApCisJCXJldHVybiB0cnVlOworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkgeworCQlpZiAodyA+IDgxOTIgfHwgaCA+IDQ2MDgpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9IGVsc2UgeworCQlpZiAodyA+IDQwOTYgfHwgaCA+IDIzMDQpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlpZiAodyA8IDAgfHwgaCA8IDApCisJCXJldHVybiB0cnVlOworCisJaWYgKGggIT0gMCAmJiAodyA+IG1heCAvIGgpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworCit2b2lkIGNoZWNrX2hlYWRfZXJyb3Ioc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKyNkZWZpbmUgcGNtX2VuYWJsZWRfZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MAorI2RlZmluZSBwY21fc2FtcGxlX2JpdF9kZXB0aF9sdW1hICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQxCisjZGVmaW5lIHBjbV9zYW1wbGVfYml0X2RlcHRoX2Nocm9tYSAgICAgICAgICAgICAgICAgICAgICAgMHgwNDIKKwloZXZjLT5oZWFkX2Vycm9yX2ZsYWcgPSAwOworCWlmICgoZXJyb3JfaGFuZGxlX3BvbGljeSAmIDB4NDApID09IDApCisJCXJldHVybjsKKwlpZiAoZ2V0X2xtZW1fcGFyYW1zKGhldmMsIHBjbV9lbmFibGVkX2ZsYWcpKSB7CisJCXVpbnQxNl90IHBjbV9kZXB0aF9sdW1hID0gZ2V0X2xtZW1fcGFyYW1zKAorCQkJaGV2YywgcGNtX3NhbXBsZV9iaXRfZGVwdGhfbHVtYSk7CisJCXVpbnQxNl90IHBjbV9zYW1wbGVfY2hyb21hID0gZ2V0X2xtZW1fcGFyYW1zKAorCQkJaGV2YywgcGNtX3NhbXBsZV9iaXRfZGVwdGhfY2hyb21hKTsKKwkJaWYgKHBjbV9kZXB0aF9sdW1hID4KKwkJCWhldmMtPmJpdF9kZXB0aF9sdW1hIHx8CisJCQlwY21fc2FtcGxlX2Nocm9tYSA+CisJCQloZXZjLT5iaXRfZGVwdGhfY2hyb21hKSB7CisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiZXJyb3IsIHBjbSBiaXQgZGVwdGggJWQsICVkIGlzIGdyZWF0ZXIgdGhhbiBub3JtYWwgYml0IGRlcHRoICVkLCAlZFxuIiwKKwkJCXBjbV9kZXB0aF9sdW1hLAorCQkJcGNtX3NhbXBsZV9jaHJvbWEsCisJCQloZXZjLT5iaXRfZGVwdGhfbHVtYSwKKwkJCWhldmMtPmJpdF9kZXB0aF9jaHJvbWEpOworCQkJaGV2Yy0+aGVhZF9lcnJvcl9mbGFnID0gMTsKKwkJfQorCX0KK30KKyNlbmRpZgorCisjaWZkZWYgU1VQUE9SVF8xMEJJVAorLyogTG9zbGVzcyBjb21wcmVzc2lvbiBib2R5IGJ1ZmZlciBzaXplIDRLIHBlciA2NHgzMiAoanQpICovCitzdGF0aWMgIGludCAgY29tcHV0ZV9sb3NsZXNzX2NvbXBfYm9keV9zaXplKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsCisJaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbWVtX3NhdmluZ19tb2RlKQoreworCWludCB3aWR0aF94NjQ7CisJaW50ICAgICBoZWlnaHRfeDMyOworCWludCAgICAgYnNpemU7CisKKwl3aWR0aF94NjQgPSB3aWR0aCArIDYzOworCXdpZHRoX3g2NCA+Pj0gNjsKKworCWhlaWdodF94MzIgPSBoZWlnaHQgKyAzMTsKKwloZWlnaHRfeDMyID4+PSA1OworCWlmIChtZW1fc2F2aW5nX21vZGUgPT0gMSAmJiBoZXZjLT5tbXVfZW5hYmxlKQorCQlic2l6ZSA9IDMyMDAgKiB3aWR0aF94NjQgKiBoZWlnaHRfeDMyOworCWVsc2UgaWYgKG1lbV9zYXZpbmdfbW9kZSA9PSAxKQorCQlic2l6ZSA9IDMwNzIgKiB3aWR0aF94NjQgKiBoZWlnaHRfeDMyOworCWVsc2UKKwkJYnNpemUgPSA0MDk2ICogd2lkdGhfeDY0ICogaGVpZ2h0X3gzMjsKKworCXJldHVybiAgYnNpemU7Cit9CisKKy8qIExvc2xlc3MgY29tcHJlc3Npb24gaGVhZGVyIGJ1ZmZlciBzaXplIDMyYnl0ZXMgcGVyIDEyOHg2NCAoanQpICovCitzdGF0aWMgIGludCAgY29tcHV0ZV9sb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworCWludCAgICAgd2lkdGhfeDEyODsKKwlpbnQgICAgIGhlaWdodF94NjQ7CisJaW50ICAgICBoc2l6ZTsKKworCXdpZHRoX3gxMjggPSB3aWR0aCArIDEyNzsKKwl3aWR0aF94MTI4ID4+PSA3OworCisJaGVpZ2h0X3g2NCA9IGhlaWdodCArIDYzOworCWhlaWdodF94NjQgPj49IDY7CisKKwloc2l6ZSA9IDMyKndpZHRoX3gxMjgqaGVpZ2h0X3g2NDsKKworCXJldHVybiAgaHNpemU7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBhZGRfbG9nKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsCisJY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisjZGVmaW5lIEhFVkNfTE9HX0JVRgkJMTk2CisJc3RydWN0IGRlYnVnX2xvZ19zICpsb2dfaXRlbTsKKwl1bnNpZ25lZCBjaGFyIGJ1ZltIRVZDX0xPR19CVUZdOworCWludCBsZW4gPSAwOworCXZhX2xpc3QgYXJnczsKKwltdXRleF9sb2NrKCZ2aDI2NV9sb2dfbXV0ZXgpOworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJbGVuID0gc3ByaW50ZihidWYsICI8JWxkPiAgIDwlMDVkPiAiLAorCQlqaWZmaWVzLCBoZXZjLT5kZWNvZGVfaWR4KTsKKwlsZW4gKz0gdnNucHJpbnRmKGJ1ZiArIGxlbiwKKwkJSEVWQ19MT0dfQlVGIC0gbGVuLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlsb2dfaXRlbSA9IGttYWxsb2MoCisJCXNpemVvZihzdHJ1Y3QgZGVidWdfbG9nX3MpICsgbGVuLAorCQlHRlBfS0VSTkVMKTsKKwlpZiAobG9nX2l0ZW0pIHsKKwkJSU5JVF9MSVNUX0hFQUQoJmxvZ19pdGVtLT5saXN0KTsKKwkJc3RyY3B5KCZsb2dfaXRlbS0+ZGF0YSwgYnVmKTsKKwkJbGlzdF9hZGRfdGFpbCgmbG9nX2l0ZW0tPmxpc3QsCisJCQkmaGV2Yy0+bG9nX2xpc3QpOworCX0KKwltdXRleF91bmxvY2soJnZoMjY1X2xvZ19tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfbG9nKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJaW50IGkgPSAwOworCXN0cnVjdCBkZWJ1Z19sb2dfcyAqbG9nX2l0ZW0sICp0bXA7CisJbXV0ZXhfbG9jaygmdmgyNjVfbG9nX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobG9nX2l0ZW0sIHRtcCwgJmhldmMtPmxvZ19saXN0LCBsaXN0KSB7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJbTE9HJTA0ZF0lc1xuIiwKKwkJCWkrKywKKwkJCSZsb2dfaXRlbS0+ZGF0YSk7CisJCWxpc3RfZGVsKCZsb2dfaXRlbS0+bGlzdCk7CisJCWtmcmVlKGxvZ19pdGVtKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ2aDI2NV9sb2dfbXV0ZXgpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBpc19za2lwX2RlY29kaW5nKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsCisJCXN0cnVjdCBQSUNfcyAqcGljKQoreworCWlmIChwaWMtPmVycm9yX21hcmsKKwkJJiYgKChoZXZjLT5pZ25vcmVfYnVmbWdyX2Vycm9yICYgMHgxKSA9PSAwKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3BpY19wb2Moc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwkJdW5zaWduZWQgaW50IGlkeCkKK3sKKwlpZiAoaWR4ICE9IDB4ZmYKKwkJJiYgaWR4IDwgTUFYX1JFRl9QSUNfTlVNCisJCSYmIGhldmMtPm1fUElDW2lkeF0pCisJCXJldHVybiBoZXZjLT5tX1BJQ1tpZHhdLT5QT0M7CisJcmV0dXJuIElOVkFMSURfUE9DOworfQorCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfTVVMVElfREVDCitzdGF0aWMgaW50IGdldF92YWxpZF9kb3VibGVfd3JpdGVfbW9kZShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCXJldHVybiAoaGV2Yy0+bV9pbnNfZmxhZyAmJgorCQkoKGRvdWJsZV93cml0ZV9tb2RlICYgMHg4MDAwMDAwMCkgPT0gMCkpID8KKwkJaGV2Yy0+ZG91YmxlX3dyaXRlX21vZGUgOgorCQkoZG91YmxlX3dyaXRlX21vZGUgJiAweDdmZmZmZmZmKTsKK30KKworc3RhdGljIGludCBnZXRfZHluYW1pY19idWZfbnVtX21hcmdpbihzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCXJldHVybiAoaGV2Yy0+bV9pbnNfZmxhZyAmJgorCQkoKGR5bmFtaWNfYnVmX251bV9tYXJnaW4gJiAweDgwMDAwMDAwKSA9PSAwKSkgPworCQloZXZjLT5keW5hbWljX2J1Zl9udW1fbWFyZ2luIDoKKwkJKGR5bmFtaWNfYnVmX251bV9tYXJnaW4gJiAweDdmZmZmZmZmKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGdldF9kb3VibGVfd3JpdGVfbW9kZShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCXUzMiB2YWxpZF9kd19tb2RlID0gZ2V0X3ZhbGlkX2RvdWJsZV93cml0ZV9tb2RlKGhldmMpOworCWludCB3ID0gaGV2Yy0+cGljX3c7CisJaW50IGggPSBoZXZjLT5waWNfaDsKKwl1MzIgZHcgPSAweDE7IC8qMToxKi8KKworCWlmIChoZXZjLT5pc191c2VkX3Y0bCkgeworCQl1bnNpZ25lZCBpbnQgb3V0OworCisJCXZkZWNfdjRsX2dldF9kd19tb2RlKGhldmMtPnY0bDJfY3R4LCAmb3V0KTsKKwkJZHcgPSBvdXQ7CisJCXJldHVybiBkdzsKKwl9CisKKwlzd2l0Y2ggKHZhbGlkX2R3X21vZGUpIHsKKwljYXNlIDB4MTAwOgorCQlpZiAodyA+IDE5MjAgJiYgaCA+IDEwODgpCisJCQlkdyA9IDB4NDsgLyoxOjIqLworCQlicmVhazsKKwljYXNlIDB4MjAwOgorCQlpZiAodyA+IDE5MjAgJiYgaCA+IDEwODgpCisJCQlkdyA9IDB4MjsgLyoxOjQqLworCQlicmVhazsKKwljYXNlIDB4MzAwOgorCQlpZiAodyA+IDEyODAgJiYgaCA+IDcyMCkKKwkJCWR3ID0gMHg0OyAvKjE6MiovCisJCWJyZWFrOworCWNhc2UgMHgxMDAwOgorCQlpZiAodyAqIGggPiAxOTIwICogMTA4MCkKKwkJCWR3ID0gMzsKKwkJZWxzZSBpZiAodyAqIGggPiA5NjAgKiA1NDApCisJCQlkdyA9IDU7CisJCWVsc2UKKwkJCWR3ID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZHcgPSB2YWxpZF9kd19tb2RlOworCQlicmVhazsKKwl9CisJcmV0dXJuIGR3OworfQorCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfTVVMVElfREVDCitzdGF0aWMgdW5zaWduZWQgY2hhciBnZXRfaWR4KHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJcmV0dXJuIGhldmMtPmluZGV4OworfQorI2VuZGlmCisKKyN1bmRlZiBwcl9pbmZvCisjZGVmaW5lIHByX2luZm8gcHJpbnRrCitzdGF0aWMgaW50IGhldmNfcHJpbnQoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwlpbnQgZmxhZywgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisjZGVmaW5lIEhFVkNfUFJJTlRfQlVGCQk1MTIKKwl1bnNpZ25lZCBjaGFyIGJ1ZltIRVZDX1BSSU5UX0JVRl07CisJaW50IGxlbiA9IDA7CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfTVVMVElfREVDCisJaWYgKGhldmMgPT0gTlVMTCB8fAorCQkoZmxhZyA9PSAwKSB8fAorCQkoKGRlYnVnX21hc2sgJgorCQkoMSA8PCBoZXZjLT5pbmRleCkpCisJCSYmIChkZWJ1ZyAmIGZsYWcpKSkgeworI2VuZGlmCisJCXZhX2xpc3QgYXJnczsKKworCQl2YV9zdGFydChhcmdzLCBmbXQpOworCQlpZiAoaGV2YykKKwkJCWxlbiA9IHNwcmludGYoYnVmLCAiWyVkXSIsIGhldmMtPmluZGV4KTsKKwkJdnNucHJpbnRmKGJ1ZiArIGxlbiwgSEVWQ19QUklOVF9CVUYgLSBsZW4sIGZtdCwgYXJncyk7CisJCXByX2RlYnVnKCIlcyIsIGJ1Zik7CisJCXZhX2VuZChhcmdzKTsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9NVUxUSV9ERUMKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZXZjX3ByaW50X2NvbnQoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwlpbnQgZmxhZywgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdW5zaWduZWQgY2hhciBidWZbSEVWQ19QUklOVF9CVUZdOworCWludCBsZW4gPSAwOworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX01VTFRJX0RFQworCWlmIChoZXZjID09IE5VTEwgfHwKKwkJKGZsYWcgPT0gMCkgfHwKKwkJKChkZWJ1Z19tYXNrICYKKwkJKDEgPDwgaGV2Yy0+aW5kZXgpKQorCQkmJiAoZGVidWcgJiBmbGFnKSkpIHsKKyNlbmRpZgorCQl2YV9saXN0IGFyZ3M7CisKKwkJdmFfc3RhcnQoYXJncywgZm10KTsKKwkJdnNucHJpbnRmKGJ1ZiArIGxlbiwgSEVWQ19QUklOVF9CVUYgLSBsZW4sIGZtdCwgYXJncyk7CisJCXByX2luZm8oIiVzIiwgYnVmKTsKKwkJdmFfZW5kKGFyZ3MpOworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX01VTFRJX0RFQworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwdXRfbXZfYnVmKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsCisJc3RydWN0IFBJQ19zICpwaWMpOworCitzdGF0aWMgdm9pZCB1cGRhdGVfdmZfbWVtaGFuZGxlKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsCisJc3RydWN0IHZmcmFtZV9zICp2Ziwgc3RydWN0IFBJQ19zICpwaWMpOworCitzdGF0aWMgdm9pZCBzZXRfY2FudmFzKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsIHN0cnVjdCBQSUNfcyAqcGljKTsKKworc3RhdGljIHZvaWQgcmVsZWFzZV9hdXhfZGF0YShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCXN0cnVjdCBQSUNfcyAqcGljKTsKK3N0YXRpYyB2b2lkIHJlbGVhc2VfcGljX21tdV9idWYoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Yywgc3RydWN0IFBJQ19zICpwaWMpOworCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorc3RhdGljIHZvaWQgYmFja3VwX2RlY29kZV9zdGF0ZShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWhldmMtPm1fcG9jUmFuZG9tQWNjZXNzX2JhayA9IGhldmMtPm1fcG9jUmFuZG9tQWNjZXNzOworCWhldmMtPmN1cnJfUE9DX2JhayA9IGhldmMtPmN1cnJfUE9DOworCWhldmMtPmlQcmV2UE9DX2JhayA9IGhldmMtPmlQcmV2UE9DOworCWhldmMtPmlQcmV2VGlkMFBPQ19iYWsgPSBoZXZjLT5pUHJldlRpZDBQT0M7CisJaGV2Yy0+c3RhcnRfcGFyc2VyX3R5cGVfYmFrID0gaGV2Yy0+c3RhcnRfcGFyc2VyX3R5cGU7CisJaGV2Yy0+c3RhcnRfZGVjb2RpbmdfZmxhZ19iYWsgPSBoZXZjLT5zdGFydF9kZWNvZGluZ19mbGFnOworCWhldmMtPnJwc19zZXRfaWRfYmFrID0gaGV2Yy0+cnBzX3NldF9pZDsKKwloZXZjLT5waWNfZGVjb2RlZF9sY3VfaWR4X2JhayA9IGhldmMtPnBpY19kZWNvZGVkX2xjdV9pZHg7CisJaGV2Yy0+ZGVjb2RlX2lkeF9iYWsgPSBoZXZjLT5kZWNvZGVfaWR4OworCit9CisKK3N0YXRpYyB2b2lkIHJlc3RvcmVfZGVjb2RlX3N0YXRlKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaGV2Yyk7CisJaWYgKCF2ZGVjX2hhc19tb3JlX2lucHV0KHZkZWMpKSB7CisJCWhldmMtPnBpY19kZWNvZGVkX2xjdV9pZHggPQorCQkJUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0xDVV9TVEFSVCkKKwkJCSYgMHhmZmZmZmY7CisJCXJldHVybjsKKwl9CisJaGV2Y19wcmludChoZXZjLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkiJXM6IGRpc2NhcmQgcGljIGluZGV4IDB4JXhcbiIsCisJCV9fZnVuY19fLCBoZXZjLT5kZWNvZGluZ19waWMgPworCQloZXZjLT5kZWNvZGluZ19waWMtPmluZGV4IDogMHhmZik7CisJaWYgKGhldmMtPmRlY29kaW5nX3BpYykgeworCQloZXZjLT5kZWNvZGluZ19waWMtPmVycm9yX21hcmsgPSAwOworCQloZXZjLT5kZWNvZGluZ19waWMtPm91dHB1dF9yZWFkeSA9IDA7CisJCWhldmMtPmRlY29kaW5nX3BpYy0+c2hvd19mcmFtZSA9IGZhbHNlOworCQloZXZjLT5kZWNvZGluZ19waWMtPm91dHB1dF9tYXJrID0gMDsKKwkJaGV2Yy0+ZGVjb2RpbmdfcGljLT5yZWZlcmVuY2VkID0gMDsKKwkJaGV2Yy0+ZGVjb2RpbmdfcGljLT5QT0MgPSBJTlZBTElEX1BPQzsKKwkJcHV0X212X2J1ZihoZXZjLCBoZXZjLT5kZWNvZGluZ19waWMpOworCQlyZWxlYXNlX2F1eF9kYXRhKGhldmMsIGhldmMtPmRlY29kaW5nX3BpYyk7CisJCWhldmMtPmRlY29kaW5nX3BpYyA9IE5VTEw7CisJfQorCS8qaWYgKHZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpICYmCisJCShoZXZjLT5kZWNvZGVfaWR4IC0gaGV2Yy0+ZGVjb2RlX2lkeF9iYWsgPiAxKSkgeworCQlpbnQgaTsKKwkJaGV2Y19wcmludChoZXZjLCAwLCAiZGVjb2RlX2lkeCAlZCwgZGVjb2RlX2lkeF9iYWsgJWRcbiIsCisJCQkJCQkJCWhldmMtPmRlY29kZV9pZHgsIGhldmMtPmRlY29kZV9pZHhfYmFrKTsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9SRUZfUElDX05VTTsgaSsrKSB7CisJCQlzdHJ1Y3QgUElDX3MgKnBpYzsKKwkJCXBpYyA9IGhldmMtPm1fUElDW2ldOworCQkJaWYgKHBpYyA9PSBOVUxMIHx8CisJCQkJKHBpYy0+aW5kZXggPT0gLTEpIHx8CisJCQkJKHBpYy0+QlVGX2luZGV4ID09IC0xKSB8fAorCQkJCShwaWMtPlBPQyA9PSBJTlZBTElEX1BPQykpCisJCQkJY29udGludWU7CisJCQlpZiAoKHBpYy0+ZGVjb2RlX2lkeCA+PSBoZXZjLT5kZWNvZGVfaWR4X2JhaykgJiYKKwkJCQkJcGljLT5kZWNvZGVfaWR4ICE9IChoZXZjLT5kZWNvZGVfaWR4IC0gMSkpIHsKKwkJCQkJaGV2Y19wcmludChoZXZjLCAwLCAicmVsZWFzZSBlcnJvciBidWZmZXJcbiIpOworCQkJCQlwaWMtPmVycm9yX21hcmsgPSAwOworCQkJCQlwaWMtPm91dHB1dF9yZWFkeSA9IDA7CisJCQkJCXBpYy0+c2hvd19mcmFtZSA9IGZhbHNlOworCQkJCQlwaWMtPm91dHB1dF9tYXJrID0gMDsKKwkJCQkJcGljLT5yZWZlcmVuY2VkID0gMDsKKwkJCQkJcGljLT5QT0MgPSBJTlZBTElEX1BPQzsKKwkJCQkJcHV0X212X2J1ZihoZXZjLCBwaWMpOworCQkJCQlyZWxlYXNlX2F1eF9kYXRhKGhldmMsIHBpYyk7CisJCQl9CisJCX0KKwl9Ki8KKwloZXZjLT5kZWNvZGVfaWR4ID0gaGV2Yy0+ZGVjb2RlX2lkeF9iYWs7CisJaGV2Yy0+bV9wb2NSYW5kb21BY2Nlc3MgPSBoZXZjLT5tX3BvY1JhbmRvbUFjY2Vzc19iYWs7CisJaGV2Yy0+Y3Vycl9QT0MgPSBoZXZjLT5jdXJyX1BPQ19iYWs7CisJaGV2Yy0+aVByZXZQT0MgPSBoZXZjLT5pUHJldlBPQ19iYWs7CisJaGV2Yy0+aVByZXZUaWQwUE9DID0gaGV2Yy0+aVByZXZUaWQwUE9DX2JhazsKKwloZXZjLT5zdGFydF9wYXJzZXJfdHlwZSA9IGhldmMtPnN0YXJ0X3BhcnNlcl90eXBlX2JhazsKKwloZXZjLT5zdGFydF9kZWNvZGluZ19mbGFnID0gaGV2Yy0+c3RhcnRfZGVjb2RpbmdfZmxhZ19iYWs7CisJaGV2Yy0+cnBzX3NldF9pZCA9IGhldmMtPnJwc19zZXRfaWRfYmFrOworCWhldmMtPnBpY19kZWNvZGVkX2xjdV9pZHggPSBoZXZjLT5waWNfZGVjb2RlZF9sY3VfaWR4X2JhazsKKworCWlmIChoZXZjLT5waWNfbGlzdF9pbml0X2ZsYWcgPT0gMSkKKwkJaGV2Yy0+cGljX2xpc3RfaW5pdF9mbGFnID0gMDsKKwkvKmlmIChoZXZjLT5kZWNvZGVfaWR4ID09IDApCisJCWhldmMtPnN0YXJ0X2RlY29kaW5nX2ZsYWcgPSAwOyovCisKKwloZXZjLT5zbGljZV9pZHggPSAwOworCWhldmMtPnVzZWRfNGtfbnVtID0gLTE7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgaGV2Y19pbml0X3N0cnUoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwkJc3RydWN0IEJ1ZmZJbmZvX3MgKmJ1Zl9zcGVjX2kpCit7CisJaW50IGk7CisJSU5JVF9MSVNUX0hFQUQoJmhldmMtPmxvZ19saXN0KTsKKwloZXZjLT53b3JrX3NwYWNlX2J1ZiA9IGJ1Zl9zcGVjX2k7CisJaGV2Yy0+cHJlZml4X2F1eF9zaXplID0gMDsKKwloZXZjLT5zdWZmaXhfYXV4X3NpemUgPSAwOworCWhldmMtPmF1eF9hZGRyID0gTlVMTDsKKwloZXZjLT5ycG1fYWRkciA9IE5VTEw7CisJaGV2Yy0+bG1lbV9hZGRyID0gTlVMTDsKKworCWhldmMtPmN1cnJfUE9DID0gSU5WQUxJRF9QT0M7CisKKwloZXZjLT5waWNfbGlzdF9pbml0X2ZsYWcgPSAwOworCWhldmMtPnVzZV9jbWFfZmxhZyA9IDA7CisJaGV2Yy0+ZGVjb2RlX2lkeCA9IDA7CisJaGV2Yy0+c2xpY2VfaWR4ID0gMDsKKwloZXZjLT5uZXdfcGljID0gMDsKKwloZXZjLT5uZXdfdGlsZSA9IDA7CisJaGV2Yy0+aVByZXZQT0MgPSAwOworCWhldmMtPmxpc3Rfbm8gPSAwOworCS8qIGludCBtX3VpTWF4Q1VXaWR0aCA9IDE8PDc7ICovCisJLyogaW50IG1fdWlNYXhDVUhlaWdodCA9IDE8PDc7ICovCisJaGV2Yy0+bV9wb2NSYW5kb21BY2Nlc3MgPSBNQVhfSU5UOworCWhldmMtPnRpbGVfZW5hYmxlZCA9IDA7CisJaGV2Yy0+dGlsZV94ID0gMDsKKwloZXZjLT50aWxlX3kgPSAwOworCWhldmMtPmlQcmV2VGlkMFBPQyA9IDA7CisJaGV2Yy0+c2xpY2VfYWRkciA9IDA7CisJaGV2Yy0+c2xpY2Vfc2VnbWVudF9hZGRyID0gMDsKKwloZXZjLT5za2lwX2ZsYWcgPSAwOworCWhldmMtPm1pc2NfZmxhZzAgPSAwOworCisJaGV2Yy0+Y3VyX3BpYyA9IE5VTEw7CisJaGV2Yy0+Y29sX3BpYyA9IE5VTEw7CisJaGV2Yy0+d2FpdF9idWYgPSAwOworCWhldmMtPmVycm9yX2ZsYWcgPSAwOworCWhldmMtPmhlYWRfZXJyb3JfZmxhZyA9IDA7CisJaGV2Yy0+ZXJyb3Jfc2tpcF9uYWxfY291bnQgPSAwOworCWhldmMtPmhhdmVfdnBzID0gMDsKKwloZXZjLT5oYXZlX3NwcyA9IDA7CisJaGV2Yy0+aGF2ZV9wcHMgPSAwOworCWhldmMtPmhhdmVfdmFsaWRfc3RhcnRfc2xpY2UgPSAwOworCisJaGV2Yy0+cHRzX21vZGUgPSBQVFNfTk9STUFMOworCWhldmMtPmxhc3RfcHRzID0gMDsKKwloZXZjLT5sYXN0X2xvb2t1cF9wdHMgPSAwOworCWhldmMtPmxhc3RfcHRzX3VzNjQgPSAwOworCWhldmMtPmxhc3RfbG9va3VwX3B0c191czY0ID0gMDsKKwloZXZjLT5wdHNfbW9kZV9zd2l0Y2hpbmdfY291bnQgPSAwOworCWhldmMtPnB0c19tb2RlX3JlY292ZXJ5X2NvdW50ID0gMDsKKworCWhldmMtPlBCX3NraXBfbW9kZSA9IG5hbF9za2lwX3BvbGljeSAmIDB4MzsKKwloZXZjLT5QQl9za2lwX2NvdW50X2FmdGVyX2RlY29kaW5nID0gKG5hbF9za2lwX3BvbGljeSA+PiAxNikgJiAweGZmZmY7CisJaWYgKGhldmMtPlBCX3NraXBfbW9kZSA9PSAwKQorCQloZXZjLT5pZ25vcmVfYnVmbWdyX2Vycm9yID0gMHgxOworCWVsc2UKKwkJaGV2Yy0+aWdub3JlX2J1Zm1ncl9lcnJvciA9IDB4MDsKKworCWlmIChoZXZjLT5pc191c2VkX3Y0bCkgeworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9QSUNfTlVNOyBpKyspIHsKKwkJCWlmIChoZXZjLT5tX1BJQ1tpXSAhPSBOVUxMKSB7CisJCQkJY2hhciAqYWRkciA9IE5VTEw7CisJCQkJaW50IHNpemU7CisJCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CisJCQkJYWRkciA9IGhldmMtPm1fUElDW2ldLT5hdXhfZGF0YV9idWY7CisJCQkJc2l6ZSA9IGhldmMtPm1fUElDW2ldLT5hdXhfZGF0YV9zaXplOworCisJCQkJbWVtc2V0KGhldmMtPm1fUElDW2ldLCAwICxzaXplb2Yoc3RydWN0IFBJQ19zKSk7CisJCQkJaGV2Yy0+bV9QSUNbaV0tPmluZGV4ID0gaTsKKwkJCQloZXZjLT5tX1BJQ1tpXS0+YXV4X2RhdGFfYnVmID0gYWRkcjsKKwkJCQloZXZjLT5tX1BJQ1tpXS0+YXV4X2RhdGFfc2l6ZSA9IHNpemU7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOworCQkJfQorCQl9CisJfQorCisJaGV2Yy0+cGljX251bSA9IDA7CisJaGV2Yy0+bGN1X3hfbnVtX3ByZSA9IDA7CisJaGV2Yy0+bGN1X3lfbnVtX3ByZSA9IDA7CisJaGV2Yy0+Zmlyc3RfcGljX2FmdGVyX3JlY292ZXIgPSAwOworCisJaGV2Yy0+cHJlX3RvcF9waWMgPSBOVUxMOworCWhldmMtPnByZV9ib3RfcGljID0gTlVMTDsKKworCWhldmMtPnNlaV9wcmVzZW50X2ZsYWcgPSAwOworCWhldmMtPnZhbHZlX2NvdW50ID0gMDsKKwloZXZjLT5maXJzdF9waWNfZmxhZyA9IDA7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCWhldmMtPmRlY29kZWRfcG9jID0gSU5WQUxJRF9QT0M7CisJaGV2Yy0+c3RhcnRfcHJvY2Vzc190aW1lID0gMDsKKwloZXZjLT5sYXN0X2xjdV9pZHggPSAwOworCWhldmMtPmRlY29kZV90aW1lb3V0X2NvdW50ID0gMDsKKwloZXZjLT50aW1lb3V0X251bSA9IDA7CisJaGV2Yy0+ZW9zID0gMDsKKwloZXZjLT5waWNfZGVjb2RlZF9sY3VfaWR4ID0gLTE7CisJaGV2Yy0+b3Zlcl9kZWNvZGUgPSAwOworCWhldmMtPnVzZWRfNGtfbnVtID0gLTE7CisJaGV2Yy0+c3RhcnRfZGVjb2RpbmdfZmxhZyA9IDA7CisJaGV2Yy0+cnBzX3NldF9pZCA9IDA7CisJYmFja3VwX2RlY29kZV9zdGF0ZShoZXZjKTsKKyNlbmRpZgorI2lmZGVmIERFVFJFRklMTF9FTkFCTEUKKwloZXZjLT5kZXRidWZfYWRyID0gMDsKKwloZXZjLT5kZXRidWZfYWRyX3ZpcnQgPSBOVUxMOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgcG9zdF9waWN0dXJlX2Vhcmx5KHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBpbmRleCk7CitzdGF0aWMgaW50IHByZXBhcmVfZGlzcGxheV9idWYoc3RydWN0IHZkZWNfcyAqdmRlYywgc3RydWN0IFBJQ19zICpwaWMpOworc3RhdGljIGludCBIMjY1X2FsbG9jX21tdShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCQkJc3RydWN0IFBJQ19zICpuZXdfcGljLAl1bnNpZ25lZCBzaG9ydCBiaXRfZGVwdGgsCisJCQl1bnNpZ25lZCBpbnQgKm1tdV9pbmRleF9hZHIpOworCisjaWZkZWYgREVUUkVGSUxMX0VOQUJMRQorI2RlZmluZSBERVRSRUZJTExfQlVGX1NJWkUgKDQgKiAweDQwMDApCisjZGVmaW5lIEhFVkNfU0FPX0RCR19NT0RFMCAgICAgICAgICAgICAgICAgICAgICAgICAweDM2MWUKKyNkZWZpbmUgSEVWQ19TQU9fREJHX01PREUxICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzYxZgorI2RlZmluZSBIRVZDX1NBT19DVFJMMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNjJlCisjZGVmaW5lIEhFVkNfU0FPX0NUUkwxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM2MmYKK3N0YXRpYyBpbnQgaW5pdF9kZXRyZWZpbGxfYnVmKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJaWYgKGhldmMtPmRldGJ1Zl9hZHJfdmlydCkKKwkJcmV0dXJuIDA7CisKKwloZXZjLT5kZXRidWZfYWRyX3ZpcnQgPQorCQkodm9pZCAqKWRtYV9hbGxvY19jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQlERVRSRUZJTExfQlVGX1NJWkUsICZoZXZjLT5kZXRidWZfYWRyLAorCQkJR0ZQX0tFUk5FTCk7CisKKwlpZiAoaGV2Yy0+ZGV0YnVmX2Fkcl92aXJ0ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFsbG9jIEVUUkVGSUxMX0JVRlxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1bmluaXRfZGV0cmVmaWxsX2J1ZihzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWlmIChoZXZjLT5kZXRidWZfYWRyX3ZpcnQpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJREVUUkVGSUxMX0JVRl9TSVpFLCBoZXZjLT5kZXRidWZfYWRyX3ZpcnQsCisJCQloZXZjLT5kZXRidWZfYWRyKTsKKworCQloZXZjLT5kZXRidWZfYWRyX3ZpcnQgPSBOVUxMOworCQloZXZjLT5kZXRidWZfYWRyID0gMDsKKwl9Cit9CisKKy8qCisgKiBjb252ZXJ0IHVuY29tcHJlc3NlZCBmcmFtZSBidWZmZXIgZGF0YSBmcm9tL3RvIGRkcgorICovCitzdGF0aWMgdm9pZCBjb252VW5jOHg0YmxrKHVpbnQxNl90KiBibGs4eDRMdW1hLAorCXVpbnQxNl90KiBibGs4eDRDYiwgdWludDE2X3QqIGJsazh4NENyLCB1aW50MTZfdCogY21Cb2R5QnVmLCBpbnQzMl90IGRpcmVjdGlvbikKK3sKKwlpZiAoZGlyZWN0aW9uID09IDApIHsKKwkJYmxrOHg0THVtYVszICsgMCAqIDhdID0gKChjbUJvZHlCdWZbMF0gPj4gMCkpICYgMHgzZmY7CisJCWJsazh4NEx1bWFbMyArIDEgKiA4XSA9ICgoY21Cb2R5QnVmWzFdIDw8IDYpCisJCQl8IChjbUJvZHlCdWZbMF0gPj4gMTApKSAmIDB4M2ZmOworCQlibGs4eDRMdW1hWzMgKyAyICogOF0gPSAoKGNtQm9keUJ1ZlsxXSA+PiA0KSkgJiAweDNmZjsKKwkJYmxrOHg0THVtYVszICsgMyAqIDhdID0gKChjbUJvZHlCdWZbMl0gPDwgMikKKwkJCXwgKGNtQm9keUJ1ZlsxXSA+PiAxNCkpICYgMHgzZmY7CisJCWJsazh4NEx1bWFbNyArIDAgKiA4XSA9ICgoY21Cb2R5QnVmWzNdIDw8IDgpCisJCQl8IChjbUJvZHlCdWZbMl0gPj4gOCkpICYgMHgzZmY7CisJCWJsazh4NEx1bWFbNyArIDEgKiA4XSA9ICgoY21Cb2R5QnVmWzNdID4+IDIpKSAmIDB4M2ZmOworCQlibGs4eDRMdW1hWzcgKyAyICogOF0gPSAoKGNtQm9keUJ1Zls0XSA8PCA0KQorCQkJfCAoY21Cb2R5QnVmWzNdID4+IDEyKSkgJiAweDNmZjsKKwkJYmxrOHg0THVtYVs3ICsgMyAqIDhdID0gKChjbUJvZHlCdWZbNF0gPj4gNikpICYgMHgzZmY7CisJCWJsazh4NENiICBbMCArIDAgKiA0XSA9ICgoY21Cb2R5QnVmWzVdID4+IDApKSAmIDB4M2ZmOworCQlibGs4eDRDciAgWzAgKyAwICogNF0gPSAoKGNtQm9keUJ1Zls2XQk8PCA2KQorCQkJfCAoY21Cb2R5QnVmWzVdID4+IDEwKSkgJiAweDNmZjsKKwkJYmxrOHg0Q2IgIFswICsgMSAqIDRdID0gKChjbUJvZHlCdWZbNl0gPj4gNCkpICYgMHgzZmY7CisJCWJsazh4NENyICBbMCArIDEgKiA0XSA9ICgoY21Cb2R5QnVmWzddIDw8IDIpCisJCQl8IChjbUJvZHlCdWZbNl0gPj4gMTQpKSAmIDB4M2ZmOworCisJCWJsazh4NEx1bWFbMCArIDAgKiA4XSA9ICgoY21Cb2R5QnVmWzAgKyA4XSA+PiAwKSkgJiAweDNmZjsKKwkJYmxrOHg0THVtYVsxICsgMCAqIDhdID0gKChjbUJvZHlCdWZbMSArIDhdIDw8IDYpIHwKKwkJCShjbUJvZHlCdWZbMCArIDhdID4+IDEwKSkgJiAweDNmZjsKKwkJYmxrOHg0THVtYVsyICsgMCAqIDhdID0gKChjbUJvZHlCdWZbMSArIDhdID4+IDQpKSAmIDB4M2ZmOworCQlibGs4eDRMdW1hWzAgKyAxICogOF0gPSAoKGNtQm9keUJ1ZlsyICsgOF0gPDwgMikgfAorCQkJKGNtQm9keUJ1ZlsxICsgOF0gPj4gMTQpKSAmIDB4M2ZmOworCQlibGs4eDRMdW1hWzEgKyAxICogOF0gPSAoKGNtQm9keUJ1ZlszICsgOF0gPDwgOCkgfAorCQkJKGNtQm9keUJ1ZlsyICsgOF0gPj4gOCkpICYgMHgzZmY7CisJCWJsazh4NEx1bWFbMiArIDEgKiA4XSA9ICgoY21Cb2R5QnVmWzMgKyA4XSA+PiAyKSkgJiAweDNmZjsKKwkJYmxrOHg0THVtYVswICsgMiAqIDhdID0gKChjbUJvZHlCdWZbNCArIDhdIDw8IDQpIHwKKwkJCShjbUJvZHlCdWZbMyArIDhdID4+IDEyKSkgJiAweDNmZjsKKwkJYmxrOHg0THVtYVsxICsgMiAqIDhdID0gKChjbUJvZHlCdWZbNCArIDhdID4+IDYpKSAmIDB4M2ZmOworCQlibGs4eDRMdW1hWzIgKyAyICogOF0gPSAoKGNtQm9keUJ1Zls1ICsgOF0gPj4gMCkpICYgMHgzZmY7CisJCWJsazh4NEx1bWFbMCArIDMgKiA4XSA9ICgoY21Cb2R5QnVmWzYgKyA4XSA8PCA2KSB8CisJCQkoY21Cb2R5QnVmWzUgKyA4XSA+PiAxMCkpICYgMHgzZmY7CisJCWJsazh4NEx1bWFbMSArIDMgKiA4XSA9ICgoY21Cb2R5QnVmWzYgKyA4XSA+PiA0KSkgJiAweDNmZjsKKwkJYmxrOHg0THVtYVsyICsgMyAqIDhdID0gKChjbUJvZHlCdWZbNyArIDhdIDw8IDIpIHwKKwkJCShjbUJvZHlCdWZbNiArIDhdID4+IDE0KSkgJiAweDNmZjsKKworCQlibGs4eDRMdW1hWzQgKyAwICogOF0gPSAoKGNtQm9keUJ1ZlswICsgMTZdID4+IDApKSAmIDB4M2ZmOworCQlibGs4eDRMdW1hWzUgKyAwICogOF0gPSAoKGNtQm9keUJ1ZlsxICsgMTZdIDw8IDYpIHwKKwkJCShjbUJvZHlCdWZbMCArIDE2XSA+PiAxMCkpICYgMHgzZmY7CisJCWJsazh4NEx1bWFbNiArIDAgKiA4XSA9ICgoY21Cb2R5QnVmWzEgKyAxNl0gPj4gNCkpICYgMHgzZmY7CisJCWJsazh4NEx1bWFbNCArIDEgKiA4XSA9ICgoY21Cb2R5QnVmWzIgKyAxNl0gPDwgMikgfAorCQkJKGNtQm9keUJ1ZlsxICsgMTZdID4+IDE0KSkgJiAweDNmZjsKKwkJYmxrOHg0THVtYVs1ICsgMSAqIDhdID0gKChjbUJvZHlCdWZbMyArIDE2XSA8PCA4KSB8CisJCQkoY21Cb2R5QnVmWzIgKyAxNl0gPj4gOCkpICYgMHgzZmY7CisJCWJsazh4NEx1bWFbNiArIDEgKiA4XSA9ICgoY21Cb2R5QnVmWzMgKyAxNl0gPj4gMikpICYgMHgzZmY7CisJCWJsazh4NEx1bWFbNCArIDIgKiA4XSA9ICgoY21Cb2R5QnVmWzQgKyAxNl0gPDwgNCkgfAorCQkJKGNtQm9keUJ1ZlszICsgMTZdID4+IDEyKSkgJiAweDNmZjsKKwkJYmxrOHg0THVtYVs1ICsgMiAqIDhdID0gKChjbUJvZHlCdWZbNCArIDE2XSA+PiA2KSkgJiAweDNmZjsKKwkJYmxrOHg0THVtYVs2ICsgMiAqIDhdID0gKChjbUJvZHlCdWZbNSArIDE2XSA+PiAwKSkgJiAweDNmZjsKKwkJYmxrOHg0THVtYVs0ICsgMyAqIDhdID0gKChjbUJvZHlCdWZbNiArIDE2XSA8PCA2KSB8CisJCQkoY21Cb2R5QnVmWzUgKyAxNl0gPj4gMTApKSAmIDB4M2ZmOworCQlibGs4eDRMdW1hWzUgKyAzICogOF0gPSAoKGNtQm9keUJ1Zls2ICsgMTZdID4+IDQpKSAmIDB4M2ZmOworCQlibGs4eDRMdW1hWzYgKyAzICogOF0gPSAoKGNtQm9keUJ1Zls3ICsgMTZdIDw8IDIpIHwKKwkJCShjbUJvZHlCdWZbNiArIDE2XSA+PiAxNCkpICYgMHgzZmY7CisKKwkJYmxrOHg0Q2JbMSArIDAgKiA0XSA9ICgoY21Cb2R5QnVmWzAgKyAyNF0gPj4gMCkpICYgMHgzZmY7CisJCWJsazh4NENyWzEgKyAwICogNF0gPSAoKGNtQm9keUJ1ZlsxICsgMjRdIDw8IDYpIHwKKwkJCShjbUJvZHlCdWZbMCArIDI0XSA+PiAxMCkpICYgMHgzZmY7CisJCWJsazh4NENiWzIgKyAwICogNF0gPSAoKGNtQm9keUJ1ZlsxICsgMjRdID4+IDQpKSAmIDB4M2ZmOworCQlibGs4eDRDclsyICsgMCAqIDRdID0gKChjbUJvZHlCdWZbMiArIDI0XSA8PCAyKSB8CisJCQkoY21Cb2R5QnVmWzEgKyAyNF0gPj4gMTQpKSAmIDB4M2ZmOworCQlibGs4eDRDYlszICsgMCAqIDRdID0gKChjbUJvZHlCdWZbMyArIDI0XSA8PCA4KSB8CisJCQkoY21Cb2R5QnVmWzIgKyAyNF0gPj4gOCkpICYgMHgzZmY7CisJCWJsazh4NENyWzMgKyAwICogNF0gPSAoKGNtQm9keUJ1ZlszICsgMjRdID4+IDIpKSAmIDB4M2ZmOworCQlibGs4eDRDYlsxICsgMSAqIDRdID0gKChjbUJvZHlCdWZbNCArIDI0XSA8PCA0KSB8CisJCQkoY21Cb2R5QnVmWzMgKyAyNF0gPj4gMTIpKSAmIDB4M2ZmOworCQlibGs4eDRDclsxICsgMSAqIDRdID0gKChjbUJvZHlCdWZbNCArIDI0XSA+PiA2KSkgJiAweDNmZjsKKwkJYmxrOHg0Q2JbMiArIDEgKiA0XSA9ICgoY21Cb2R5QnVmWzUgKyAyNF0gPj4gMCkpICYgMHgzZmY7CisJCWJsazh4NENyWzIgKyAxICogNF0gPSAoKGNtQm9keUJ1Zls2ICsgMjRdIDw8IDYpIHwKKwkJCShjbUJvZHlCdWZbNSArIDI0XSA+PiAxMCkpICYgMHgzZmY7CisJCWJsazh4NENiWzMgKyAxICogNF0gPSAoKGNtQm9keUJ1Zls2ICsgMjRdID4+IDQpKSAmIDB4M2ZmOworCQlibGs4eDRDclszICsgMSAqIDRdID0gKChjbUJvZHlCdWZbNyArIDI0XSA8PCAyKSB8CisJCQkoY21Cb2R5QnVmWzYgKyAyNF0gPj4gMTQpKSAmIDB4M2ZmOworCX0gZWxzZSB7CisJCWNtQm9keUJ1ZlswICsgOCAqIDBdID0gKGJsazh4NEx1bWFbMyArIDEgKiA4XSA8PCAxMCkgfAorCQkJYmxrOHg0THVtYVszICsgMCAqIDhdOworCQljbUJvZHlCdWZbMSArIDggKiAwXSA9IChibGs4eDRMdW1hWzMgKyAzICogOF0gPDwgMTQpIHwKKwkJCShibGs4eDRMdW1hWzMgKyAyICogOF0gPDwgNCkgfCAoYmxrOHg0THVtYVszICsgMSAqIDhdID4+IDYpOworCQljbUJvZHlCdWZbMiArIDggKiAwXSA9IChibGs4eDRMdW1hWzcgKyAwICogOF0gPDwgOCkgfAorCQkJKGJsazh4NEx1bWFbMyArIDMgKiA4XSA+PiAyKTsKKwkJY21Cb2R5QnVmWzMgKyA4ICogMF0gPSAoYmxrOHg0THVtYVs3ICsgMiAqIDhdIDw8IDEyKSB8CisJCQkoYmxrOHg0THVtYVs3ICsgMSAqIDhdIDw8IDIpIHwgKGJsazh4NEx1bWFbNyArIDAgKiA4XSA+PjgpOworCQljbUJvZHlCdWZbNCArIDggKiAwXSA9IChibGs4eDRMdW1hWzcgKyAzICogOF0gPDwgNikgfAorCQkJKGJsazh4NEx1bWFbNyArIDIgKiA4XSA+PjQpOworCQljbUJvZHlCdWZbNSArIDggKiAwXSA9IChibGs4eDRDclswICsgMCAqIDRdIDw8IDEwKSB8CisJCQlibGs4eDRDYlswICsgMCAqIDRdOworCQljbUJvZHlCdWZbNiArIDggKiAwXSA9IChibGs4eDRDclswICsgMSAqIDRdIDw8IDE0KSB8CisJCQkoYmxrOHg0Q2JbMCArIDEgKiA0XSA8PCA0KSAgIHwgKGJsazh4NENyWzAgKyAwICogNF0gPj4gNik7CisJCWNtQm9keUJ1Zls3ICsgOCAqIDBdID0gKDA8PCA4KSB8IChibGs4eDRDclswICsgMSAqIDRdID4+IDIpOworCisJCWNtQm9keUJ1ZlswICsgOCAqIDFdID0gKGJsazh4NEx1bWFbMSArIDAgKiA4XSA8PCAxMCkgfAorCQkJYmxrOHg0THVtYVswICsgMCAqIDhdOworCQljbUJvZHlCdWZbMSArIDggKiAxXSA9IChibGs4eDRMdW1hWzAgKyAxICogOF0gPDwgMTQpIHwKKwkJCShibGs4eDRMdW1hWzIgKyAwICogOF0gPDwgNCkgfCAoYmxrOHg0THVtYVsxICsgMCAqIDhdID4+IDYpOworCQljbUJvZHlCdWZbMiArIDggKiAxXSA9IChibGs4eDRMdW1hWzEgKyAxICogOF0gPDwgOCkgfAorCQkJKGJsazh4NEx1bWFbMCArIDEgKiA4XSA+PiAyKTsKKwkJY21Cb2R5QnVmWzMgKyA4ICogMV0gPSAoYmxrOHg0THVtYVswICsgMiAqIDhdIDw8IDEyKSB8CisJCQkoYmxrOHg0THVtYVsyICsgMSAqIDhdIDw8IDIpIHwgKGJsazh4NEx1bWFbMSArIDEgKiA4XSA+PjgpOworCQljbUJvZHlCdWZbNCArIDggKiAxXSA9IChibGs4eDRMdW1hWzEgKyAyICogOF0gPDwgNikgfAorCQkJKGJsazh4NEx1bWFbMCArIDIgKiA4XSA+PjQpOworCQljbUJvZHlCdWZbNSArIDggKiAxXSA9IChibGs4eDRMdW1hWzAgKyAzICogOF0gPDwgMTApIHwKKwkJCWJsazh4NEx1bWFbMiArIDIgKiA4XTsKKwkJY21Cb2R5QnVmWzYgKyA4ICogMV0gPSAoYmxrOHg0THVtYVsyICsgMyAqIDhdIDw8IDE0KSB8CisJCQkoYmxrOHg0THVtYVsxICsgMyAqIDhdIDw8IDQpIHwgKGJsazh4NEx1bWFbMCArIDMgKiA4XSA+PiA2KTsKKwkJY21Cb2R5QnVmWzcgKyA4ICogMV0gPSAoMDw8IDgpIHwgKGJsazh4NEx1bWFbMiArIDMgKiA4XSA+PiAyKTsKKworCQljbUJvZHlCdWZbMCArIDggKiAyXSA9IChibGs4eDRMdW1hWzUgKyAwICogOF0gPDwgMTApIHwKKwkJCWJsazh4NEx1bWFbNCArIDAgKiA4XTsKKwkJY21Cb2R5QnVmWzEgKyA4ICogMl0gPSAoYmxrOHg0THVtYVs0ICsgMSAqIDhdIDw8IDE0KSB8CisJCQkoYmxrOHg0THVtYVs2ICsgMCAqIDhdIDw8IDQpIHwgKGJsazh4NEx1bWFbNSArIDAgKiA4XSA+PiA2KTsKKwkJY21Cb2R5QnVmWzIgKyA4ICogMl0gPSAoYmxrOHg0THVtYVs1ICsgMSAqIDhdIDw8IDgpIHwKKwkJCShibGs4eDRMdW1hWzQgKyAxICogOF0gPj4gMik7CisJCWNtQm9keUJ1ZlszICsgOCAqIDJdID0gKGJsazh4NEx1bWFbNCArIDIgKiA4XSA8PCAxMikgfAorCQkJKGJsazh4NEx1bWFbNiArIDEgKiA4XSA8PCAyKSB8IChibGs4eDRMdW1hWzUgKyAxICogOF0gPj44KTsKKwkJY21Cb2R5QnVmWzQgKyA4ICogMl0gPSAoYmxrOHg0THVtYVs1ICsgMiAqIDhdIDw8IDYpIHwKKwkJCShibGs4eDRMdW1hWzQgKyAyICogOF0gPj40KTsKKwkJY21Cb2R5QnVmWzUgKyA4ICogMl0gPSAoYmxrOHg0THVtYVs0ICsgMyAqIDhdIDw8IDEwKSB8CisJCQlibGs4eDRMdW1hWzYgKyAyICogOF07CisJCWNtQm9keUJ1Zls2ICsgOCAqIDJdID0gKGJsazh4NEx1bWFbNiArIDMgKiA4XSA8PCAxNCkgfAorCQkJKGJsazh4NEx1bWFbNSArIDMgKiA4XSA8PCA0KSB8IChibGs4eDRMdW1hWzQgKyAzICogOF0gPj4gNik7CisJCWNtQm9keUJ1Zls3ICsgOCAqIDJdID0gKDA8PCA4KSB8IChibGs4eDRMdW1hWzYgKyAzICogOF0gPj4gMik7CisKKwkJY21Cb2R5QnVmWzAgKyA4ICogM10gPSAoYmxrOHg0Q3JbMSArIDAgKiA0XSA8PCAxMCkgfAorCQkJYmxrOHg0Q2JbMSArIDAgKiA0XTsKKwkJY21Cb2R5QnVmWzEgKyA4ICogM10gPSAoYmxrOHg0Q3JbMiArIDAgKiA0XSA8PCAxNCkgfAorCQkJKGJsazh4NENiWzIgKyAwICogNF0gPDwgNCkgfCAoYmxrOHg0Q3JbMSArIDAgKiA0XSA+PiA2KTsKKwkJY21Cb2R5QnVmWzIgKyA4ICogM10gPSAoYmxrOHg0Q2JbMyArIDAgKiA0XSA8PCA4KSB8CisJCQkoYmxrOHg0Q3JbMiArIDAgKiA0XSA+PiAyKTsKKwkJY21Cb2R5QnVmWzMgKyA4ICogM10gPSAoYmxrOHg0Q2JbMSArIDEgKiA0XSA8PCAxMikgfAorCQkJKGJsazh4NENyWzMgKyAwICogNF0gPDwgMikgfCAoYmxrOHg0Q2JbMyArIDAgKiA0XSA+PjgpOworCQljbUJvZHlCdWZbNCArIDggKiAzXSA9IChibGs4eDRDclsxICsgMSAqIDRdIDw8IDYpIHwKKwkJCShibGs4eDRDYlsxICsgMSAqIDRdID4+NCk7CisJCWNtQm9keUJ1Zls1ICsgOCAqIDNdID0gKGJsazh4NENyWzIgKyAxICogNF0gPDwgMTApIHwKKwkJCWJsazh4NENiWzIgKyAxICogNF07CisJCWNtQm9keUJ1Zls2ICsgOCAqIDNdID0gKGJsazh4NENyWzMgKyAxICogNF0gPDwgMTQpIHwKKwkJCShibGs4eDRDYlszICsgMSAqIDRdIDw8IDQpIHwgKGJsazh4NENyWzIgKyAxICogNF0gPj4gNik7CisJCWNtQm9keUJ1Zls3ICsgOCAqIDNdID0gKDAgPDwgOCkgfCAoYmxrOHg0Q3JbMyArIDEgKiA0XSA+PiAyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvcnJSZWZpbGxXaXRoQW1yaXNjICgKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCXVpbnQzMl90ICBjbUhlYWRlckJhc2VBZGRyLAorCXVpbnQzMl90ICBwaWNXaWR0aCwKKwl1aW50MzJfdCAgY3R1UG9zaXRpb24pCit7CisJaW50MzJfdCBpOworCXVpbnQxNl90IGN0dXggPSAoY3R1UG9zaXRpb24+PjE2KSAmIDB4ZmZmZjsKKwl1aW50MTZfdCBjdHV5ID0gKGN0dVBvc2l0aW9uPj4gMCkgJiAweGZmZmY7CisJaW50MzJfdCBhYm92ZUN0dUF2YWlsYWJsZSA9IChjdHV5KSA/IDEgOiAwOworCisJdWludDE2X3QgKmNtQm9keUJ1ZiA9IE5VTEw7CisKKwl1aW50MzJfdCBwaWNfd2lkdGhfeDY0X3ByZSA9IHBpY1dpZHRoICsgMHgzZjsKKwl1aW50MzJfdCBwaWNfd2lkdGhfeDY0ID0gcGljX3dpZHRoX3g2NF9wcmUgPj4gNjsKKwl1aW50MzJfdCBzdHJpZGU2NHg2NCA9IHBpY193aWR0aF94NjQgKiAxMjg7CisJdWludDMyX3QgYWRkcl9vZmZzZXQ2NHg2NF9hYnYgPSBzdHJpZGU2NHg2NCAqCisJCShhYm92ZUN0dUF2YWlsYWJsZSA/IGN0dXkgLSAxIDogY3R1eSkgKyAxMjggKiBjdHV4OworCXVpbnQzMl90IGFkZHJfb2Zmc2V0NjR4NjRfY3VyID0gc3RyaWRlNjR4NjQqY3R1eSArIDEyOCAqIGN0dXg7CisJdWludDMyX3QgY21IZWFkZXJBZGRyQWJ2ID0gY21IZWFkZXJCYXNlQWRkciArIGFkZHJfb2Zmc2V0NjR4NjRfYWJ2OworCXVpbnQzMl90IGNtSGVhZGVyQWRkckN1ciA9IGNtSGVhZGVyQmFzZUFkZHIgKyBhZGRyX29mZnNldDY0eDY0X2N1cjsKKwl1bnNpZ25lZCBpbnQgdG1wRGF0YTMyOworCisJdWludDE2X3QgYmxrQnVmMFlbMzJdOworCXVpbnQxNl90IGJsa0J1ZjBDYls4XTsKKwl1aW50MTZfdCBibGtCdWYwQ3JbOF07CisJdWludDE2X3QgYmxrQnVmMVlbMzJdOworCXVpbnQxNl90IGJsa0J1ZjFDYls4XTsKKwl1aW50MTZfdCBibGtCdWYxQ3JbOF07CisJaW50MzJfdCAgYmxrQnVmQ250ID0gMDsKKworCWludDMyX3QgYmxrSWR4OworCVBSX0lOSVQoMTI4KTsKKworCWNtQm9keUJ1ZiA9IHZ6YWxsb2Moc2l6ZW9mKHVpbnQxNl90KSAqIDMyICogMTgpOworCWlmICghY21Cb2R5QnVmKQorCQlyZXR1cm47CisKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkwxMCwgY21IZWFkZXJBZGRyQWJ2KTsKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkwxMSwgY21IZWFkZXJBZGRyQ3VyKTsKKwlXUklURV9WUkVHKEhFVkNfU0FPX0RCR19NT0RFMCwgaGV2Yy0+ZGV0YnVmX2Fkcik7CisJV1JJVEVfVlJFRyhIRVZDX1NBT19EQkdfTU9ERTEsIDIpOworCisJZm9yIChpID0gMDsgaSA8IDMyICogMTg7IGkrKykKKwkJY21Cb2R5QnVmW2ldID0gMDsKKworCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19CVUZNR1JfTU9SRSwKKwkJIiVzLCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlkbyB7CisJCXRtcERhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19EQkdfTU9ERTEpOworCX0gd2hpbGUgKHRtcERhdGEzMik7CisJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX0JVRk1HUl9NT1JFLAorCQkiJXMsICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX0RFVEFJTCwKKwkJImNtQm9keUJ1ZiBmcm9tIGRldGJ1ZjpcbiIpOworCWZvciAoaSA9IDA7IGkgPCAzMiAqIDE4OyBpKyspIHsKKwkJY21Cb2R5QnVmW2ldID0gaGV2Yy0+ZGV0YnVmX2Fkcl92aXJ0W2ldOworCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYKKwkJCQlIMjY1X0RFQlVHX0RFVEFJTCkgeworCQkJaWYgKChpICYgMHhmKSA9PSAwKQorCQkJCVBSX0lORk8oaGV2Yy0+aW5kZXgpOworCQkJUFJfRklMTCgiJTAyeCAiLCBjbUJvZHlCdWZbaV0pOworCQl9CisJfQorCVBSX0lORk8oaGV2Yy0+aW5kZXgpOworCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisJCWJsa0J1ZjBZW2ldID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlibGtCdWYwQ2JbaV0gPSAwOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWJsa0J1ZjBDcltpXSA9IDA7CisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisJCWJsa0J1ZjFZW2ldID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlibGtCdWYxQ2JbaV0gPSAwOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWJsa0J1ZjFDcltpXSA9IDA7CisKKwlmb3IgKGJsa0lkeCA9IDA7IGJsa0lkeCA8IDE4OyBibGtJZHgrKykgeworCQlpbnQzMl90ICAgaW5BYm92ZUN0dSA9IChibGtJZHg8MikgPyAxIDogMDsKKwkJaW50MzJfdCAgIHJlc3RvcmVFbmFibGUgPSAoYmxrSWR4PjApID8gMSA6IDA7CisJCXVpbnQxNl90KiBibGtZID0gKGJsa0J1ZkNudD09MCkgPyBibGtCdWYwWSA6IGJsa0J1ZjFZIDsKKwkJdWludDE2X3QqIGJsa0NiID0gKGJsa0J1ZkNudD09MCkgPyBibGtCdWYwQ2IgOiBibGtCdWYxQ2I7CisJCXVpbnQxNl90KiBibGtDciA9IChibGtCdWZDbnQ9PTApID8gYmxrQnVmMENyIDogYmxrQnVmMUNyOworCQl1aW50MTZfdCogY21Cb2R5QnVmTm93ID0gY21Cb2R5QnVmICsgKGJsa0lkeCAqIDMyKTsKKworCQlpZiAoIWFib3ZlQ3R1QXZhaWxhYmxlICYmIGluQWJvdmVDdHUpCisJCQljb250aW51ZTsKKworCQkvKiBkZXRSZWZpbGxCdWYgLS0+IDh4NGJsb2NrKi8KKwkJY29udlVuYzh4NGJsayhibGtZLCBibGtDYiwgYmxrQ3IsIGNtQm9keUJ1Zk5vdywgMCk7CisKKwkJaWYgKHJlc3RvcmVFbmFibGUpIHsKKwkJCWJsa1lbMyArIDAgKiA4XSA9IGJsa1lbMiArIDAgKiA4XSArIDI7CisJCQlibGtZWzQgKyAwICogOF0gPSBibGtZWzEgKyAwICogOF0gKyAzOworCQkJYmxrWVs1ICsgMCAqIDhdID0gYmxrWVswICsgMCAqIDhdICsgMTsKKwkJCWJsa1lbNiArIDAgKiA4XSA9IGJsa1lbMCArIDAgKiA4XSArIDI7CisJCQlibGtZWzcgKyAwICogOF0gPSBibGtZWzEgKyAwICogOF0gKyAyOworCQkJYmxrWVszICsgMSAqIDhdID0gYmxrWVsyICsgMSAqIDhdICsgMTsKKwkJCWJsa1lbNCArIDEgKiA4XSA9IGJsa1lbMSArIDEgKiA4XSArIDI7CisJCQlibGtZWzUgKyAxICogOF0gPSBibGtZWzAgKyAxICogOF0gKyAyOworCQkJYmxrWVs2ICsgMSAqIDhdID0gYmxrWVswICsgMSAqIDhdICsgMjsKKwkJCWJsa1lbNyArIDEgKiA4XSA9IGJsa1lbMSArIDEgKiA4XSArIDM7CisJCQlibGtZWzMgKyAyICogOF0gPSBibGtZWzIgKyAyICogOF0gKyAzOworCQkJYmxrWVs0ICsgMiAqIDhdID0gYmxrWVsxICsgMiAqIDhdICsgMTsKKwkJCWJsa1lbNSArIDIgKiA4XSA9IGJsa1lbMCArIDIgKiA4XSArIDM7CisJCQlibGtZWzYgKyAyICogOF0gPSBibGtZWzAgKyAyICogOF0gKyAzOworCQkJYmxrWVs3ICsgMiAqIDhdID0gYmxrWVsxICsgMiAqIDhdICsgMzsKKwkJCWJsa1lbMyArIDMgKiA4XSA9IGJsa1lbMiArIDMgKiA4XSArIDA7CisJCQlibGtZWzQgKyAzICogOF0gPSBibGtZWzEgKyAzICogOF0gKyAwOworCQkJYmxrWVs1ICsgMyAqIDhdID0gYmxrWVswICsgMyAqIDhdICsgMTsKKwkJCWJsa1lbNiArIDMgKiA4XSA9IGJsa1lbMCArIDMgKiA4XSArIDI7CisJCQlibGtZWzcgKyAzICogOF0gPSBibGtZWzEgKyAzICogOF0gKyAxOworCQkJYmxrQ2JbMSArIDAgKiA0XSA9IGJsa0NiWzAgKyAwICogNF07CisJCQlibGtDYlsyICsgMCAqIDRdID0gYmxrQ2JbMCArIDAgKiA0XTsKKwkJCWJsa0NiWzMgKyAwICogNF0gPSBibGtDYlswICsgMCAqIDRdOworCQkJYmxrQ2JbMSArIDEgKiA0XSA9IGJsa0NiWzAgKyAxICogNF07CisJCQlibGtDYlsyICsgMSAqIDRdID0gYmxrQ2JbMCArIDEgKiA0XTsKKwkJCWJsa0NiWzMgKyAxICogNF0gPSBibGtDYlswICsgMSAqIDRdOworCQkJYmxrQ3JbMSArIDAgKiA0XSA9IGJsa0NyWzAgKyAwICogNF07CisJCQlibGtDclsyICsgMCAqIDRdID0gYmxrQ3JbMCArIDAgKiA0XTsKKwkJCWJsa0NyWzMgKyAwICogNF0gPSBibGtDclswICsgMCAqIDRdOworCQkJYmxrQ3JbMSArIDEgKiA0XSA9IGJsa0NyWzAgKyAxICogNF07CisJCQlibGtDclsyICsgMSAqIDRdID0gYmxrQ3JbMCArIDEgKiA0XTsKKwkJCWJsa0NyWzMgKyAxICogNF0gPSBibGtDclswICsgMSAqIDRdOworCisJCQkvKlN0b3JlIGRhdGEgYmFjayB0byBERFIqLworCQkJY29udlVuYzh4NGJsayhibGtZLCBibGtDYiwgYmxrQ3IsIGNtQm9keUJ1Zk5vdywgMSk7CisJCX0KKworCQlibGtCdWZDbnQgPSAoYmxrQnVmQ250PT0xKSA/IDAgOiBibGtCdWZDbnQgKyAxOworCX0KKworCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19ERVRBSUwsCisJCSJjbUJvZHlCdWYgdG8gZGV0YnVmOlxuIik7CisJZm9yIChpID0gMDsgaSA8IDMyICogMTg7IGkrKykgeworCQloZXZjLT5kZXRidWZfYWRyX3ZpcnRbaV0gPSBjbUJvZHlCdWZbaV07CisJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJgorCQkJCUgyNjVfREVCVUdfREVUQUlMKSB7CisJCQlpZiAoKGkgJiAweGYpID09IDApCisJCQkJUFJfSU5GTyhoZXZjLT5pbmRleCk7CisJCQlQUl9GSUxMKCIlMDJ4ICIsIGNtQm9keUJ1ZltpXSk7CisJCX0KKwl9CisKKwlQUl9JTkZPKGhldmMtPmluZGV4KTsKKworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fREJHX01PREUxLCAzKTsKKwloZXZjX3ByaW50KGhldmMsIEgyNjVfREVCVUdfQlVGTUdSX01PUkUsCisJCSIlcywgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJZG8geworCQl0bXBEYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fREJHX01PREUxKTsKKwl9IHdoaWxlICh0bXBEYXRhMzIpOworCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19CVUZNR1JfTU9SRSwKKwkJIiVzLCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwl2ZnJlZShjbUJvZHlCdWYpOworfQorCitzdGF0aWMgdm9pZCBkZWxyZWZpbGwoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwkvKgorCSAqIGNvcnJSZWZpbGwKKwkgKi8KKwkvKkhFVkNfU0FPX0RCR19NT0RFMDogcGljR2xvYmFsVmFyaWFibGUKKwlbMzE6MzBdZXJyb3IgbnVtYmVyCisJWzI5OjIwXWVycm9yMihbOTo3XXRpbGV4WzY6MF1jdHV5KQorCVsxOToxMF1lcnJvcjEgWzk6MF1lcnJvcjAqLworCXVpbnQzMl90IGRldFJlc3VsdCA9IFJFQURfVlJFRyhIRVZDX0FTU0lTVF9TQ1JBVENIXzMpOworCXVpbnQzMl90IGVycm9ySWR4OworCXVpbnQzMl90IGVycm9yTnVtID0gKGRldFJlc3VsdD4+MzApOworCisJaWYgKGRldFJlc3VsdCkgeworCQloZXZjX3ByaW50KGhldmMsIEgyNjVfREVCVUdfQlVGTUdSLAorCQkJIltjb3JyUmVmaWxsV2l0aEFtcmlzY10gZGV0UmVzdWx0PSUwOHhcbiIsIGRldFJlc3VsdCk7CisJCWZvciAoZXJyb3JJZHggPSAwOyBlcnJvcklkeCA8IGVycm9yTnVtOyBlcnJvcklkeCsrKSB7CisJCQl1aW50MzJfdCBlcnJvclBvcyA9IGVycm9ySWR4ICogMTA7CisJCQl1aW50MzJfdCBlcnJvclJlc3VsdCA9IChkZXRSZXN1bHQgPj4gZXJyb3JQb3MpICYgMHgzZmY7CisJCQl1aW50MzJfdCB0aWxleCA9IChlcnJvclJlc3VsdCA+PiA3KSAtIDE7CisJCQl1aW50MTZfdCBjdHV4ID0gaGV2Yy0+bV90aWxlWzBdW3RpbGV4XS5zdGFydF9jdV94CisJCQkJKyBoZXZjLT5tX3RpbGVbMF1bdGlsZXhdLndpZHRoIC0gMTsKKwkJCXVpbnQxNl90IGN0dXkgPSAodWludDE2X3QpKGVycm9yUmVzdWx0ICYgMHg3Zik7CisJCQl1aW50MzJfdCBjdHVQb3NpdGlvbiA9IChjdHV4PDwgMTYpICsgY3R1eTsKKwkJCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19CVUZNR1IsCisJCQkJIklkeDolZCB0aWxleDolZCBjdHUoJWQoMHgleCksICVkKDB4JXgpKVxuIiwKKwkJCQllcnJvcklkeCx0aWxleCxjdHV4LGN0dXgsIGN0dXksY3R1eSk7CisJCQljb3JyUmVmaWxsV2l0aEFtcmlzYygKKwkJCQloZXZjLAorCQkJCSh1aW50MzJfdCloZXZjLT5jdXJfcGljLT5oZWFkZXJfYWRyLAorCQkJCWhldmMtPnBpY193LAorCQkJCWN0dVBvc2l0aW9uKTsKKwkJfQorCisJCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfU0NSQVRDSF8zLCAwKTsgLypjbGVhciBzdGF0dXMqLworCQlXUklURV9WUkVHKEhFVkNfU0FPX0RCR19NT0RFMCwgMCk7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fREJHX01PREUxLCAxKTsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgZ2V0X3JwbV9wYXJhbSh1bmlvbiBwYXJhbV91ICpwYXJhbXMpCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IGRhdGEzMjsKKworCWZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykgeworCQlkbyB7CisJCQlkYXRhMzIgPSBSRUFEX1ZSRUcoUlBNX0NNRF9SRUcpOworCQkJLyogaGV2Y19wcmludChoZXZjLCAwLCAiJXhcbiIsIGRhdGEzMik7ICovCisJCX0gd2hpbGUgKChkYXRhMzIgJiAweDEwMDAwKSA9PSAwKTsKKwkJcGFyYW1zLT5sLmRhdGFbaV0gPSBkYXRhMzIgJiAweGZmZmY7CisJCS8qIGhldmNfcHJpbnQoaGV2YywgMCwgIiV4XG4iLCBkYXRhMzIpOyAqLworCQlXUklURV9WUkVHKFJQTV9DTURfUkVHLCAwKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgUElDX3MgKmdldF9waWNfYnlfUE9DKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsIGludCBQT0MpCit7CisJaW50IGk7CisJc3RydWN0IFBJQ19zICpwaWM7CisJc3RydWN0IFBJQ19zICpyZXRfcGljID0gTlVMTDsKKwlpZiAoUE9DID09IElOVkFMSURfUE9DKQorCQlyZXR1cm4gTlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9QSUNfTlVNOyBpKyspIHsKKwkJcGljID0gaGV2Yy0+bV9QSUNbaV07CisJCWlmIChwaWMgPT0gTlVMTCB8fCBwaWMtPmluZGV4ID09IC0xIHx8CisJCQlwaWMtPkJVRl9pbmRleCA9PSAtMSkKKwkJCWNvbnRpbnVlOworCQlpZiAocGljLT5QT0MgPT0gUE9DKSB7CisJCQlpZiAocmV0X3BpYyA9PSBOVUxMKQorCQkJCXJldF9waWMgPSBwaWM7CisJCQllbHNlIHsKKwkJCQlpZiAocGljLT5kZWNvZGVfaWR4ID4gcmV0X3BpYy0+ZGVjb2RlX2lkeCkKKwkJCQkJcmV0X3BpYyA9IHBpYzsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcmV0X3BpYzsKK30KKworc3RhdGljIHN0cnVjdCBQSUNfcyAqZ2V0X3JlZl9waWNfYnlfUE9DKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsIGludCBQT0MpCit7CisJaW50IGk7CisJc3RydWN0IFBJQ19zICpwaWM7CisJc3RydWN0IFBJQ19zICpyZXRfcGljID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVGX1BJQ19OVU07IGkrKykgeworCQlwaWMgPSBoZXZjLT5tX1BJQ1tpXTsKKwkJaWYgKHBpYyA9PSBOVUxMIHx8IHBpYy0+aW5kZXggPT0gLTEgfHwKKwkJCXBpYy0+QlVGX2luZGV4ID09IC0xKQorCQkJY29udGludWU7CisJCS8qQWRkIHdpZHRoIGFuZCBoZWlnaHQgb2YgcmVmIHBpY3R1cmUgZGV0ZWN0aW9uLAorCQkJcmVzb2x2ZWQgaW5jb3JyZWN0bHkgcmVmZXJlbmNlZCBmcmFtZS4qLworCQlpZiAoKHBpYy0+UE9DID09IFBPQykgJiYgKHBpYy0+cmVmZXJlbmNlZCkgJiYKKwkJCShoZXZjLT5waWNfdyA9PSBwaWMtPndpZHRoKSAmJgorCQkJKGhldmMtPnBpY19oID09IHBpYy0+aGVpZ2h0KSkgeworCQkJaWYgKHJldF9waWMgPT0gTlVMTCkKKwkJCQlyZXRfcGljID0gcGljOworCQkJZWxzZSB7CisJCQkJaWYgKHBpYy0+ZGVjb2RlX2lkeCA+IHJldF9waWMtPmRlY29kZV9pZHgpCisJCQkJCXJldF9waWMgPSBwaWM7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0X3BpYzsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBsb2cyaSh1bnNpZ25lZCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGludCByZXQgPSAtMTsKKworCXdoaWxlICh2YWwgIT0gMCkgeworCQl2YWwgPj49IDE7CisJCXJldCsrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGluaXRfYnVmX3NwZWMoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Yyk7CisKKworc3RhdGljIHZvaWQgdW5pbml0X21tdV9idWZmZXJzKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJaWYgKGhldmMtPm1tdV9ib3gpIHsKKwkJZGVjb2Rlcl9tbXVfYm94X2ZyZWUoaGV2Yy0+bW11X2JveCk7CisJCWhldmMtPm1tdV9ib3ggPSBOVUxMOworCX0KKworCWlmIChoZXZjLT5ibW11X2JveCkgeworCQkvKiByZWxlYXNlIHdvcmtzcGFjZSAqLworCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWVfaWR4KGhldmMtPmJtbXVfYm94LAorCQkJQk1NVV9XT1JLU1BBQ0VfSUQpOworCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWUoaGV2Yy0+Ym1tdV9ib3gpOworCQloZXZjLT5ibW11X2JveCA9IE5VTEw7CisJfQorfQorCisvKiByZXR1cm4gaW4gTUIgKi8KK3N0YXRpYyBpbnQgaGV2Y19tYXhfbW11X2J1Zl9zaXplKGludCBtYXhfdywgaW50IG1heF9oKQoreworCWludCBidWZfc2l6ZSA9IDY0OworCisJaWYgKChtYXhfdyAqIG1heF9oKSA+IDAgJiYKKwkJKG1heF93ICogbWF4X2gpIDw9IDE5MjAqMTA4OCkgeworCQlidWZfc2l6ZSA9IDI0OworCX0KKwlyZXR1cm4gYnVmX3NpemU7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9tbXVfYnVmZmVycyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLCBib29sIGJtbXVfZmxhZykKK3sKKwlpbnQgdHZwX2ZsYWcgPSB2ZGVjX3NlY3VyZShod190b192ZGVjKGhldmMpKSA/CisJCUNPREVDX01NX0ZMQUdTX1RWUCA6IDA7CisJaW50IGJ1Zl9zaXplID0gaGV2Y19tYXhfbW11X2J1Zl9zaXplKGhldmMtPm1heF9waWNfdywKKwkJCWhldmMtPm1heF9waWNfaCk7CisKKwlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpKSB7CisJCWhldmNfcHJpbnQoaGV2YywgMCwgIiVzIG1heF93ICVkIG1heF9oICVkXG4iLAorCQkJX19mdW5jX18sIGhldmMtPm1heF9waWNfdywgaGV2Yy0+bWF4X3BpY19oKTsKKwl9CisKKwloZXZjLT5uZWVkX2NhY2hlX3NpemUgPSBidWZfc2l6ZSAqIFNaXzFNOworCWhldmMtPnNjX3N0YXJ0X3RpbWUgPSBnZXRfamlmZmllc182NCgpOworCWlmIChoZXZjLT5tbXVfZW5hYmxlICYmICFoZXZjLT5pc191c2VkX3Y0bCkgeworCQloZXZjLT5tbXVfYm94ID0gZGVjb2Rlcl9tbXVfYm94X2FsbG9jX2JveChEUklWRVJfTkFNRSwKKwkJCWhldmMtPmluZGV4LAorCQkJTUFYX1JFRl9QSUNfTlVNLAorCQkJYnVmX3NpemUgKiBTWl8xTSwKKwkJCXR2cF9mbGFnCisJCQkpOworCQlpZiAoIWhldmMtPm1tdV9ib3gpIHsKKwkJCXByX2VycigiaDI2NSBhbGxvYyBtbXUgYm94IGZhaWxlZCEhXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWlmICghYm1tdV9mbGFnKQorCQlyZXR1cm4gMDsKKworCWhldmMtPmJtbXVfYm94ID0gZGVjb2Rlcl9ibW11X2JveF9hbGxvY19ib3goRFJJVkVSX05BTUUsCisJCQloZXZjLT5pbmRleCwKKwkJCUJNTVVfTUFYX0JVRkZFUlMsCisJCQk0ICsgUEFHRV9TSElGVCwKKwkJCUNPREVDX01NX0ZMQUdTX0NNQV9DTEVBUiB8CisJCQlDT0RFQ19NTV9GTEFHU19GT1JfVkRFQ09ERVIgfAorCQkJdHZwX2ZsYWcpOworCWlmICghaGV2Yy0+Ym1tdV9ib3gpIHsKKwkJaWYgKGhldmMtPm1tdV9ib3gpCisJCQlkZWNvZGVyX21tdV9ib3hfZnJlZShoZXZjLT5tbXVfYm94KTsKKwkJaGV2Yy0+bW11X2JveCA9IE5VTEw7CisJCXByX2VycigiaDI2NSBhbGxvYyBtbXUgYm94IGZhaWxlZCEhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGJ1Zl9zdHJ1X3MKK3sKKwlpbnQgbGN1X3RvdGFsOworCWludCBtY19idWZmZXJfc2l6ZV9oOworCWludCBtY19idWZmZXJfc2l6ZV91X3ZfaDsKK307CisKKyNpZm5kZWYgTVZfVVNFX0ZJWEVEX0JVRgorc3RhdGljIHZvaWQgZGVhbGxvY19tdl9idWZzKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IE1BWF9SRUZfUElDX05VTTsgaSsrKSB7CisJCWlmIChoZXZjLT5tX212X0JVRltpXS5zdGFydF9hZHIpIHsKKwkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikKKwkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJImRlYWxsb2MgbXYgYnVmKCVkKSBhZHIgMHglcCBzaXplIDB4JXggdXNlZF9mbGFnICVkXG4iLAorCQkJCWksIGhldmMtPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciwKKwkJCQloZXZjLT5tX212X0JVRltpXS5zaXplLAorCQkJCWhldmMtPm1fbXZfQlVGW2ldLnVzZWRfZmxhZyk7CisJCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWVfaWR4KAorCQkJCWhldmMtPmJtbXVfYm94LAorCQkJCU1WX0JVRkZFUl9JRFgoaSkpOworCQkJaGV2Yy0+bV9tdl9CVUZbaV0uc3RhcnRfYWRyID0gMDsKKwkJCWhldmMtPm1fbXZfQlVGW2ldLnNpemUgPSAwOworCQkJaGV2Yy0+bV9tdl9CVUZbaV0udXNlZF9mbGFnID0gMDsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9QSUNfTlVNOyBpKyspIHsKKwkJaWYgKGhldmMtPm1fUElDW2ldICE9IE5VTEwpCisJCQloZXZjLT5tX1BJQ1tpXS0+bXZfYnVmX2luZGV4ID0gLTE7CisJfQorfQorCitzdGF0aWMgaW50IGFsbG9jX212X2J1ZihzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLCBpbnQgaSkKK3sKKwlpbnQgcmV0ID0gMDsKKwkvKmdldF9jbWFfYWxsb2NfcmVmKCk7Ki8gLypERUJVR19UTVAqLworCWlmIChkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkKKwkJKGhldmMtPmJtbXVfYm94LAorCQlNVl9CVUZGRVJfSURYKGkpLCBoZXZjLT5tdl9idWZfc2l6ZSwKKwkJRFJJVkVSX05BTUUsCisJCSZoZXZjLT5tX212X0JVRltpXS5zdGFydF9hZHIpIDwgMCkgeworCQloZXZjLT5tX212X0JVRltpXS5zdGFydF9hZHIgPSAwOworCQlyZXQgPSAtMTsKKwl9IGVsc2UgeworCQloZXZjLT5tX212X0JVRltpXS5zaXplID0gaGV2Yy0+bXZfYnVmX3NpemU7CisJCWhldmMtPm1fbXZfQlVGW2ldLnVzZWRfZmxhZyA9IDA7CisJCXJldCA9IDA7CisJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikgeworCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJIk1WIEJ1ZmZlciAlZDogc3RhcnRfYWRyICVwIHNpemUgJXhcbiIsCisJCQlpLAorCQkJKHZvaWQgKiloZXZjLT5tX212X0JVRltpXS5zdGFydF9hZHIsCisJCQloZXZjLT5tX212X0JVRltpXS5zaXplKTsKKwkJfQorCQlpZiAoIXZkZWNfc2VjdXJlKGh3X3RvX3ZkZWMoaGV2YykpICYmIChoZXZjLT5tX212X0JVRltpXS5zdGFydF9hZHIpKSB7CisJCQl2b2lkICptZW1fc3RhcnRfdmlydDsKKwkJCW1lbV9zdGFydF92aXJ0ID0KKwkJCQkJY29kZWNfbW1fcGh5c190b192aXJ0KGhldmMtPm1fbXZfQlVGW2ldLnN0YXJ0X2Fkcik7CisJCQlpZiAobWVtX3N0YXJ0X3ZpcnQpIHsKKwkJCQkJbWVtc2V0KG1lbV9zdGFydF92aXJ0LCAwLCBoZXZjLT5tX212X0JVRltpXS5zaXplKTsKKwkJCQkJY29kZWNfbW1fZG1hX2ZsdXNoKG1lbV9zdGFydF92aXJ0LAorCQkJCQkJCWhldmMtPm1fbXZfQlVGW2ldLnNpemUsIERNQV9UT19ERVZJQ0UpOworCQkJfSBlbHNlIHsKKwkJCQkJbWVtX3N0YXJ0X3ZpcnQgPSBjb2RlY19tbV92bWFwKAorCQkJCQkJCWhldmMtPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciwKKwkJCQkJCQloZXZjLT5tX212X0JVRltpXS5zaXplKTsKKwkJCQkJaWYgKG1lbV9zdGFydF92aXJ0KSB7CisJCQkJCQkJbWVtc2V0KG1lbV9zdGFydF92aXJ0LCAwLCBoZXZjLT5tX212X0JVRltpXS5zaXplKTsKKwkJCQkJCQljb2RlY19tbV9kbWFfZmx1c2gobWVtX3N0YXJ0X3ZpcnQsCisJCQkJCQkJCQloZXZjLT5tX212X0JVRltpXS5zaXplLAorCQkJCQkJCQkJRE1BX1RPX0RFVklDRSk7CisJCQkJCQkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcihtZW1fc3RhcnRfdmlydCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkJLypub3QgdmlydCBmb3IgdHZwIHBsYXlpbmcsCisJCQkJCQkJbWF5IG5lZWQgY2xlYXIgb24gdWNvZGUuKi8KKwkJCQkJCQlwcl9lcnIoInJlZiAlcwltZW1fc3RhcnRfdmlydCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCQkJfQorCQkJfQorCQl9CisJfQorCS8qcHV0X2NtYV9hbGxvY19yZWYoKTsqLyAvKkRFQlVHX1RNUCovCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGdldF9tdl9idWYoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Yywgc3RydWN0IFBJQ19zICpwaWMpCit7CisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCWlmIChwaWMgJiYgcGljLT5pbmRleCA+PSAwKSB7CisJCWludCBtdl9zaXplOworCQlpZiAoSVNfOEtfU0laRShwaWMtPndpZHRoLCBwaWMtPmhlaWdodCkpCisJCQltdl9zaXplID0gTVBSRURfOEtfTVZfQlVGX1NJWkU7CisJCWVsc2UgaWYgKElTXzRLX1NJWkUocGljLT53aWR0aCwgcGljLT5oZWlnaHQpKQorCQkJbXZfc2l6ZSA9IE1QUkVEXzRLX01WX0JVRl9TSVpFOyAvKjB4MTIwMDAwKi8KKwkJZWxzZQorCQkJbXZfc2l6ZSA9IE1QUkVEX01WX0JVRl9TSVpFOworCisJCXBpYy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkciA9CisJCQloZXZjLT53b3JrX3NwYWNlX2J1Zi0+bXByZWRfbXYuYnVmX3N0YXJ0CisJCQkrIChwaWMtPmluZGV4ICogbXZfc2l6ZSk7CisJCXBpYy0+bXZfc2l6ZSA9IG12X3NpemU7CisJfQorCXJldHVybiAwOworI2Vsc2UKKwlpbnQgaTsKKwlpbnQgcmV0ID0gLTE7CisJaW50IG5ld19zaXplOworCWlmIChtdl9idWZfZHluYW1pY19hbGxvYykgeworCQlpbnQgTVZfTUVNX1VOSVQgPQorCQkJaGV2Yy0+bGN1X3NpemVfbG9nMiA9PSA2ID8gMHgyMDAgOiBoZXZjLT5sY3Vfc2l6ZV9sb2cyID09CisJCQk1ID8gMHg4MCA6IDB4MjA7CisJCWludCBleHRlbmRlZF9waWNfd2lkdGggPSAocGljLT53aWR0aCArIGhldmMtPmxjdV9zaXplIC0xKQorCQkJCSYgKH4oaGV2Yy0+bGN1X3NpemUgLSAxKSk7CisJCWludCBleHRlbmRlZF9waWNfaGVpZ2h0ID0gKHBpYy0+aGVpZ2h0ICsgaGV2Yy0+bGN1X3NpemUgLTEpCisJCQkJJiAofihoZXZjLT5sY3Vfc2l6ZSAtIDEpKTsKKwkJaW50IGxjdV94X251bSA9IGV4dGVuZGVkX3BpY193aWR0aCAvIGhldmMtPmxjdV9zaXplOworCQlpbnQgbGN1X3lfbnVtID0gZXh0ZW5kZWRfcGljX2hlaWdodCAvIGhldmMtPmxjdV9zaXplOworCQluZXdfc2l6ZSA9ICBsY3VfeF9udW0gKiBsY3VfeV9udW0gKiBNVl9NRU1fVU5JVDsKKwkJaGV2Yy0+bXZfYnVmX3NpemUgPSAobmV3X3NpemUgKyAweGZmZmYpICYgKH4weGZmZmYpOworCX0gZWxzZSB7CisJCWlmIChJU184S19TSVpFKHBpYy0+d2lkdGgsIHBpYy0+aGVpZ2h0KSkKKwkJCW5ld19zaXplID0gTVBSRURfOEtfTVZfQlVGX1NJWkU7CisJCWVsc2UgaWYgKElTXzRLX1NJWkUocGljLT53aWR0aCwgcGljLT5oZWlnaHQpKQorCQkJbmV3X3NpemUgPSBNUFJFRF80S19NVl9CVUZfU0laRTsgLyoweDEyMDAwMCovCisJCWVsc2UKKwkJCW5ld19zaXplID0gTVBSRURfTVZfQlVGX1NJWkU7CisKKwkJaWYgKG5ld19zaXplICE9IGhldmMtPm12X2J1Zl9zaXplKSB7CisJCQlkZWFsbG9jX212X2J1ZnMoaGV2Yyk7CisJCQloZXZjLT5tdl9idWZfc2l6ZSA9IG5ld19zaXplOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVGX1BJQ19OVU07IGkrKykgeworCQkJaWYgKGhldmMtPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciAmJgorCQkJCWhldmMtPm1fbXZfQlVGW2ldLnVzZWRfZmxhZyA9PSAwKSB7CisJCQkJaGV2Yy0+bV9tdl9CVUZbaV0udXNlZF9mbGFnID0gMTsKKwkJCQlyZXQgPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWlmIChyZXQgPCAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVGX1BJQ19OVU07IGkrKykgeworCQkJaWYgKGhldmMtPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciA9PSAwKSB7CisJCQkJaWYgKGFsbG9jX212X2J1ZihoZXZjLCBpKSA+PSAwKSB7CisJCQkJCWhldmMtPm1fbXZfQlVGW2ldLnVzZWRfZmxhZyA9IDE7CisJCQkJCXJldCA9IGk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKHJldCA+PSAwKSB7CisJCXBpYy0+bXZfYnVmX2luZGV4ID0gcmV0OworCQlwaWMtPm12X3NpemUgPSBoZXZjLT5tX212X0JVRltyZXRdLnNpemU7CisJCXBpYy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkciA9CisJCQkoaGV2Yy0+bV9tdl9CVUZbcmV0XS5zdGFydF9hZHIgKyAweGZmZmYpICYKKwkJCSh+MHhmZmZmKTsKKwkJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX0JVRk1HUl9NT1JFLAorCQkiJXMgPT4gJWQgKDB4JXgpIHNpemUgMHgleFxuIiwKKwkJX19mdW5jX18sIHJldCwKKwkJcGljLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyLAorCQlwaWMtPm12X3NpemUpOworCisJfSBlbHNlIHsKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkiJXM6IEVycm9yLCBtdiBidWYgaXMgbm90IGVub3VnaFxuIiwKKwkJX19mdW5jX18pOworCX0KKwlyZXR1cm4gcmV0OworCisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgcHV0X212X2J1ZihzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCXN0cnVjdCBQSUNfcyAqcGljKQoreworI2lmbmRlZiBNVl9VU0VfRklYRURfQlVGCisJaW50IGkgPSBwaWMtPm12X2J1Zl9pbmRleDsKKwlpZiAoaSA8IDAgfHwgaSA+PSBNQVhfUkVGX1BJQ19OVU0pIHsKKwkJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX0JVRk1HUl9NT1JFLAorCQkiJXM6IGluZGV4ICVkIGJleW9uZCByYW5nZVxuIiwKKwkJX19mdW5jX18sIGkpOworCQlyZXR1cm47CisJfQorCWlmIChtdl9idWZfZHluYW1pY19hbGxvYykgeworCQloZXZjX3ByaW50KGhldmMsIEgyNjVfREVCVUdfQlVGTUdSX01PUkUsCisJCSIlcyglZClcbiIsCisJCV9fZnVuY19fLCBpKTsKKworCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWVfaWR4KAorCQkJaGV2Yy0+Ym1tdV9ib3gsCisJCQlNVl9CVUZGRVJfSURYKGkpKTsKKwkJaGV2Yy0+bV9tdl9CVUZbaV0uc3RhcnRfYWRyID0gMDsKKwkJaGV2Yy0+bV9tdl9CVUZbaV0uc2l6ZSA9IDA7CisJCWhldmMtPm1fbXZfQlVGW2ldLnVzZWRfZmxhZyA9IDA7CisJCXBpYy0+bXZfYnVmX2luZGV4ID0gLTE7CisJCXJldHVybjsKKwl9CisKKwloZXZjX3ByaW50KGhldmMsIEgyNjVfREVCVUdfQlVGTUdSX01PUkUsCisJIiVzKCVkKTogdXNlZF9mbGFnKCVkKVxuIiwKKwlfX2Z1bmNfXywgaSwKKwloZXZjLT5tX212X0JVRltpXS51c2VkX2ZsYWcpOworCisJaWYgKGhldmMtPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciAmJgorCQloZXZjLT5tX212X0JVRltpXS51c2VkX2ZsYWcpCisJCWhldmMtPm1fbXZfQlVGW2ldLnVzZWRfZmxhZyA9IDA7CisJcGljLT5tdl9idWZfaW5kZXggPSAtMTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IGNhbF9jdXJyZW50X2J1Zl9zaXplKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsCisJc3RydWN0IGJ1Zl9zdHJ1X3MgKmJ1Zl9zdHJ1KQoreworCisJaW50IGJ1Zl9zaXplOworCWludCBwaWNfd2lkdGggPSBoZXZjLT5waWNfdzsKKwlpbnQgcGljX2hlaWdodCA9IGhldmMtPnBpY19oOworCWludCBsY3Vfc2l6ZSA9IGhldmMtPmxjdV9zaXplOworCWludCBwaWNfd2lkdGhfbGN1ID0gKHBpY193aWR0aCAlIGxjdV9zaXplKSA/IHBpY193aWR0aCAvIGxjdV9zaXplICsKKwkJCQkgMSA6IHBpY193aWR0aCAvIGxjdV9zaXplOworCWludCBwaWNfaGVpZ2h0X2xjdSA9IChwaWNfaGVpZ2h0ICUgbGN1X3NpemUpID8gcGljX2hlaWdodCAvIGxjdV9zaXplICsKKwkJCQkgMSA6IHBpY19oZWlnaHQgLyBsY3Vfc2l6ZTsKKwkvKlNVUFBPUlRfMTBCSVQqLworCWludCBsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUgPSBjb21wdXRlX2xvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZQorCQkocGljX3dpZHRoLCBwaWNfaGVpZ2h0KTsKKwkJLyphbHdheXMgYWxsb2MgYnVmIGZvciAxMGJpdCovCisJaW50IGxvc2xlc3NfY29tcF9ib2R5X3NpemUgPSBjb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemUKKwkJKGhldmMsIHBpY193aWR0aCwgcGljX2hlaWdodCwgMCk7CisJaW50IG1jX2J1ZmZlcl9zaXplID0gbG9zbGVzc19jb21wX2hlYWRlcl9zaXplCisJCSsgbG9zbGVzc19jb21wX2JvZHlfc2l6ZTsKKwlpbnQgbWNfYnVmZmVyX3NpemVfaCA9IChtY19idWZmZXJfc2l6ZSArIDB4ZmZmZikgPj4gMTY7CisJaW50IG1jX2J1ZmZlcl9zaXplX3Vfdl9oID0gMDsKKworCWludCBkd19tb2RlID0gZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGhldmMpOworCisJaWYgKGhldmMtPm1tdV9lbmFibGUpIHsKKwkJaWYgKChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkgJiYKKwkJCShJU184S19TSVpFKGhldmMtPnBpY193LCBoZXZjLT5waWNfaCkpKQorCQkJYnVmX3NpemUgPSAoKE1NVV9DT01QUkVTU19IRUFERVJfU0laRV84SyArIDB4ZmZmZikgPj4gMTYpCisJCQkJPDwgMTY7CisJCWVsc2UKKwkJCWJ1Zl9zaXplID0gKChNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfNEsgKyAweGZmZmYpID4+IDE2KQorCQkJCTw8IDE2OworCX0gZWxzZQorCQlidWZfc2l6ZSA9IDA7CisKKwlpZiAoZHdfbW9kZSkgeworCQlpbnQgcGljX3dpZHRoX2R3ID0gcGljX3dpZHRoIC8KKwkJCWdldF9kb3VibGVfd3JpdGVfcmF0aW8oZHdfbW9kZSk7CisJCWludCBwaWNfaGVpZ2h0X2R3ID0gcGljX2hlaWdodCAvCisJCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKGR3X21vZGUpOworCisJCWludCBwaWNfd2lkdGhfbGN1X2R3ID0gKHBpY193aWR0aF9kdyAlIGxjdV9zaXplKSA/CisJCQlwaWNfd2lkdGhfZHcgLyBsY3Vfc2l6ZSArIDEgOgorCQkJcGljX3dpZHRoX2R3IC8gbGN1X3NpemU7CisJCWludCBwaWNfaGVpZ2h0X2xjdV9kdyA9IChwaWNfaGVpZ2h0X2R3ICUgbGN1X3NpemUpID8KKwkJCXBpY19oZWlnaHRfZHcgLyBsY3Vfc2l6ZSArIDEgOgorCQkJcGljX2hlaWdodF9kdyAvIGxjdV9zaXplOworCQlpbnQgbGN1X3RvdGFsX2R3ID0gcGljX3dpZHRoX2xjdV9kdyAqIHBpY19oZWlnaHRfbGN1X2R3OworCisJCWludCBtY19idWZmZXJfc2l6ZV91X3YgPSBsY3VfdG90YWxfZHcgKiBsY3Vfc2l6ZSAqIGxjdV9zaXplIC8gMjsKKwkJbWNfYnVmZmVyX3NpemVfdV92X2ggPSAobWNfYnVmZmVyX3NpemVfdV92ICsgMHhmZmZmKSA+PiAxNjsKKwkJCS8qNjRrIGFsaWdubWVudCovCisJCWJ1Zl9zaXplICs9ICgobWNfYnVmZmVyX3NpemVfdV92X2ggPDwgMTYpICogMyk7CisJfQorCisJaWYgKCghaGV2Yy0+bW11X2VuYWJsZSkgJiYKKwkJKChkd19tb2RlICYgMHgxMCkgPT0gMCkpIHsKKwkJLyogdXNlIGNvbXByZXNzIG1vZGUgd2l0aG91dCBtbXUsCisJCW5lZWQgYnVmIGZvciBjb21wcmVzcyBkZWNvZGluZyovCisJCWJ1Zl9zaXplICs9IChtY19idWZmZXJfc2l6ZV9oIDw8IDE2KTsKKwl9CisKKwkvKmluIGNhc2Ugc3RhcnQgYWRyIGlzIG5vdCA2NGsgYWxpZ25tZW50Ki8KKwlpZiAoYnVmX3NpemUgPiAwKQorCQlidWZfc2l6ZSArPSAweDEwMDAwOworCisJaWYgKGJ1Zl9zdHJ1KSB7CisJCWJ1Zl9zdHJ1LT5sY3VfdG90YWwgPSBwaWNfd2lkdGhfbGN1ICogcGljX2hlaWdodF9sY3U7CisJCWJ1Zl9zdHJ1LT5tY19idWZmZXJfc2l6ZV9oID0gbWNfYnVmZmVyX3NpemVfaDsKKwkJYnVmX3N0cnUtPm1jX2J1ZmZlcl9zaXplX3Vfdl9oID0gbWNfYnVmZmVyX3NpemVfdV92X2g7CisJfQorCisJaGV2Y19wcmludChoZXZjLCBQUklOVF9GTEFHX1Y0TF9ERVRBSUwsInBpYyB3aWR0aDogJWQsIHBpYyBoZWlnaHQ6ICVkLCBoZWFkcjogJWQsIGJvZHk6ICVkLCBzaXplIGg6ICVkLCBzaXplIHV2aDogJWQsIGJ1ZiBzaXplOiAleFxuIiwKKwkJcGljX3dpZHRoLCBwaWNfaGVpZ2h0LCBsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUsCisJCWxvc2xlc3NfY29tcF9ib2R5X3NpemUsIG1jX2J1ZmZlcl9zaXplX2gsCisJCW1jX2J1ZmZlcl9zaXplX3Vfdl9oLCBidWZfc2l6ZSk7CisKKwlyZXR1cm4gYnVmX3NpemU7Cit9CisKK3N0YXRpYyBpbnQgaGV2Y19nZXRfaGVhZGVyX3NpemUoaW50IHcsIGludCBoKQoreworCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpICYmCisJCQkoSVNfOEtfU0laRSh3LCBoKSkpCisJCXJldHVybiBBTElHTihNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfOEssIDB4MTAwMDApOworCWVsc2UKKwkJcmV0dXJuIEFMSUdOKE1NVV9DT01QUkVTU19IRUFERVJfU0laRV80SywgMHgxMDAwMCk7Cit9CisKK3N0YXRpYyB2b2lkIGhldmNfcHV0X3ZpZGVvX2ZyYW1lKHZvaWQgKnZkZWNfY3R4LCBzdHJ1Y3QgdmZyYW1lX3MgKnZmKQoreworCXZoMjY1X3ZmX3B1dCh2ZiwgdmRlY19jdHgpOworfQorCitzdGF0aWMgdm9pZCBoZXZjX2dldF92aWRlb19mcmFtZSh2b2lkICp2ZGVjX2N0eCwgc3RydWN0IHZmcmFtZV9zICoqdmYpCit7CisJKnZmID0gdmgyNjVfdmZfZ2V0KHZkZWNfY3R4KTsKK30KKworc3RhdGljIHN0cnVjdCBpbnRlcm5hbF9jb21wX2J1ZiogdjRsZmJfdG9faWNvbXBfYnVmKAorCQlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCQlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIpCit7CisJc3RydWN0IGFtbF92aWRlb19kZWNfYnVmICphbWxfZmIgPSBOVUxMOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqIHY0bDJfY3R4ID0gaGV2Yy0+djRsMl9jdHg7CisKKwlhbWxfZmIgPSBjb250YWluZXJfb2YoZmIsIHN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1ZiwgZnJhbWVfYnVmZmVyKTsKKwlyZXR1cm4gJnY0bDJfY3R4LT5jb21wX2J1ZnNbYW1sX2ZiLT5pbnRlcm5hbF9pbmRleF07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZXJuYWxfY29tcF9idWYqIGluZGV4X3RvX2ljb21wX2J1ZigKKwkJc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywgaW50IGluZGV4KQoreworCXN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1ZiAqYW1sX2ZiID0gTlVMTDsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKiB2NGwyX2N0eCA9IGhldmMtPnY0bDJfY3R4OworCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9IE5VTEw7CisKKwlmYiA9IChzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqKQorCQloZXZjLT5tX1BJQ1tpbmRleF0tPmNtYV9hbGxvY19hZGRyOworCWFtbF9mYiA9IGNvbnRhaW5lcl9vZihmYiwgc3RydWN0IGFtbF92aWRlb19kZWNfYnVmLCBmcmFtZV9idWZmZXIpOworCXJldHVybiAmdjRsMl9jdHgtPmNvbXBfYnVmc1thbWxfZmItPmludGVybmFsX2luZGV4XTsKK30KKworc3RhdGljIHN0cnVjdCB0YXNrX29wc19zIHRhc2tfZGVjX29wcyA9IHsKKwkudHlwZQkJPSBUQVNLX1RZUEVfREVDLAorCS5nZXRfdmZyYW1lCT0gaGV2Y19nZXRfdmlkZW9fZnJhbWUsCisJLnB1dF92ZnJhbWUJPSBoZXZjX3B1dF92aWRlb19mcmFtZSwKK307CisKK3N0YXRpYyBpbnQgdjRsX2FsbG9jX2J1ZihzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLCBzdHJ1Y3QgUElDX3MgKnBpYykKK3sKKwlpbnQgcmV0ID0gLTE7CisJaW50IGkgPSBwaWMtPmluZGV4OworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKWhldmMtPnY0bDJfY3R4OworCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9IE5VTEw7CisKKwlyZXQgPSBjdHgtPmZiX29wcy5hbGxvYygmY3R4LT5mYl9vcHMsIGhldmMtPmZiX3Rva2VuLCAmZmIsIEFNTF9GQl9SRVFfREVDKTsKKwlpZiAocmV0IDwgMCkgeworCQloZXZjX3ByaW50KGhldmMsIDAsICJbJWRdIEgyNjUgZ2V0IGJ1ZmZlciBmYWlsLlxuIiwgY3R4LT5pZCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZmItPnRhc2stPmF0dGFjaChmYi0+dGFzaywgJnRhc2tfZGVjX29wcywgaHdfdG9fdmRlYyhoZXZjKSk7CisJZmItPnN0YXR1cyA9IEZCX1NUX0RFQ09ERVI7CisKKwlpZiAoaGV2Yy0+bW11X2VuYWJsZSkgeworCQlzdHJ1Y3QgaW50ZXJuYWxfY29tcF9idWYgKmlidWYgPSB2NGxmYl90b19pY29tcF9idWYoaGV2YywgZmIpOworCQloZXZjLT5tX0JVRltpXS5oZWFkZXJfYWRkciA9IGlidWYtPmhlYWRlcl9hZGRyOworCX0KKworCWhldmMtPm1fQlVGW2ldLnVzZWRfZmxhZwk9IDE7CisJaGV2Yy0+bV9CVUZbaV0udjRsX3JlZl9idWZfYWRkcgk9ICh1bG9uZylmYjsKKwlwaWMtPmNtYV9hbGxvY19hZGRyCQk9IGhldmMtPm1fQlVGW2ldLnY0bF9yZWZfYnVmX2FkZHI7CisJaWYgKGZiLT5udW1fcGxhbmVzID09IDEpIHsKKwkJaGV2Yy0+bV9CVUZbaV0uc3RhcnRfYWRyID0gZmItPm0ubWVtWzBdLmFkZHI7CisJCWhldmMtPm1fQlVGW2ldLmx1bWFfc2l6ZSA9IGZiLT5tLm1lbVswXS5vZmZzZXQ7CisJCWhldmMtPm1fQlVGW2ldLnNpemUgPSBmYi0+bS5tZW1bMF0uc2l6ZTsKKwkJZmItPm0ubWVtWzBdLmJ5dGVzX3VzZWQgPSBmYi0+bS5tZW1bMF0uc2l6ZTsKKwkJcGljLT5kd195X2FkciA9IGhldmMtPm1fQlVGW2ldLnN0YXJ0X2FkcjsKKwkJcGljLT5kd191X3ZfYWRyID0gcGljLT5kd195X2FkciArIGhldmMtPm1fQlVGW2ldLmx1bWFfc2l6ZTsKKwkJcGljLT5sdW1hX3NpemUgPSBmYi0+bS5tZW1bMF0ub2Zmc2V0OworCQlwaWMtPmNocm9tYV9zaXplID0gZmItPm0ubWVtWzBdLnNpemUgLSBmYi0+bS5tZW1bMF0ub2Zmc2V0OworCX0gZWxzZSBpZiAoZmItPm51bV9wbGFuZXMgPT0gMikgeworCQloZXZjLT5tX0JVRltpXS5zdGFydF9hZHIgPSBmYi0+bS5tZW1bMF0uYWRkcjsKKwkJaGV2Yy0+bV9CVUZbaV0ubHVtYV9zaXplID0gZmItPm0ubWVtWzBdLnNpemU7CisJCWhldmMtPm1fQlVGW2ldLmNocm9tYV9hZGRyID0gZmItPm0ubWVtWzFdLmFkZHI7CisJCWhldmMtPm1fQlVGW2ldLmNocm9tYV9zaXplID0gZmItPm0ubWVtWzFdLnNpemU7CisJCWhldmMtPm1fQlVGW2ldLnNpemUgPSBmYi0+bS5tZW1bMF0uc2l6ZSArIGZiLT5tLm1lbVsxXS5zaXplOworCQlmYi0+bS5tZW1bMF0uYnl0ZXNfdXNlZCA9IGZiLT5tLm1lbVswXS5zaXplOworCQlmYi0+bS5tZW1bMV0uYnl0ZXNfdXNlZCA9IGZiLT5tLm1lbVsxXS5zaXplOworCQlwaWMtPmR3X3lfYWRyID0gaGV2Yy0+bV9CVUZbaV0uc3RhcnRfYWRyOworCQlwaWMtPmR3X3Vfdl9hZHIgPSBoZXZjLT5tX0JVRltpXS5jaHJvbWFfYWRkcjsKKwkJcGljLT5sdW1hX3NpemUgPSBmYi0+bS5tZW1bMF0uc2l6ZTsKKwkJcGljLT5jaHJvbWFfc2l6ZSA9IGZiLT5tLm1lbVsxXS5zaXplOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWxsb2NfYnVmKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJaW50IGk7CisJaW50IHJldCA9IC0xOworCWludCBidWZfc2l6ZSA9IGNhbF9jdXJyZW50X2J1Zl9zaXplKGhldmMsIE5VTEwpOworCisJaWYgKGhldmMtPmZhdGFsX2Vycm9yICYgREVDT0RFUl9GQVRBTF9FUlJPUl9OT19NRU0pCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgQlVGX1BPT0xfU0laRTsgaSsrKSB7CisJCWlmIChoZXZjLT5tX0JVRltpXS5zdGFydF9hZHIgPT0gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA8IEJVRl9QT09MX1NJWkUpIHsKKwkJaWYgKGJ1Zl9zaXplID4gMCkgeworCQkJcmV0ID0gZGVjb2Rlcl9ibW11X2JveF9hbGxvY19idWZfcGh5CisJCQkJKGhldmMtPmJtbXVfYm94LAorCQkJCVZGX0JVRkZFUl9JRFgoaSksIGJ1Zl9zaXplLAorCQkJCURSSVZFUl9OQU1FLAorCQkJCSZoZXZjLT5tX0JVRltpXS5zdGFydF9hZHIpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQloZXZjLT5tX0JVRltpXS5zdGFydF9hZHIgPSAwOworCQkJCWlmIChpIDw9IDgpIHsKKwkJCQkJaGV2Yy0+ZmF0YWxfZXJyb3IgfD0KKwkJCQkJCURFQ09ERVJfRkFUQUxfRVJST1JfTk9fTUVNOworCQkJCQloZXZjX3ByaW50KGhldmMsIFBSSU5UX0ZMQUdfRVJST1IsCisJCQkJCQkiJXNbJWRdLCBzaXplOiAlZCwgbm8gbWVtIGZhdGFsIGVyclxuIiwKKwkJCQkJCV9fZnVuY19fLCBpLCBidWZfc2l6ZSk7CisJCQkJfQorCQkJfQorCisJCQlpZiAocmV0ID49IDApIHsKKwkJCQloZXZjLT5tX0JVRltpXS5zaXplID0gYnVmX3NpemU7CisJCQkJaGV2Yy0+bV9CVUZbaV0udXNlZF9mbGFnID0gMDsKKwkJCQlyZXQgPSAwOworCisJCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKSB7CisJCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJIkJ1ZmZlciAlZDogc3RhcnRfYWRyICVwIHNpemUgJXhcbiIsCisJCQkJCWksCisJCQkJCSh2b2lkICopaGV2Yy0+bV9CVUZbaV0uc3RhcnRfYWRyLAorCQkJCQloZXZjLT5tX0JVRltpXS5zaXplKTsKKwkJCQl9CisJCQkJLypmbHVzaCB0aGUgYnVmZmVyIG1ha2Ugc3VyZSBubyBjYWNoZSBkaXJ0eSovCisJCQkJaWYgKCF2ZGVjX3NlY3VyZShod190b192ZGVjKGhldmMpKSAmJiAoaGV2Yy0+bV9CVUZbaV0uc3RhcnRfYWRyKSkgeworCQkJCQl2b2lkICptZW1fc3RhcnRfdmlydDsKKwkJCQkJbWVtX3N0YXJ0X3ZpcnQgPQorCQkJCQljb2RlY19tbV9waHlzX3RvX3ZpcnQoaGV2Yy0+bV9CVUZbaV0uc3RhcnRfYWRyKTsKKwkJCQkJaWYgKG1lbV9zdGFydF92aXJ0KSB7CisJCQkJCQltZW1zZXQobWVtX3N0YXJ0X3ZpcnQsIDAsIGhldmMtPm1fQlVGW2ldLnNpemUpOworCQkJCQkJY29kZWNfbW1fZG1hX2ZsdXNoKG1lbV9zdGFydF92aXJ0LAorCQkJCQkJaGV2Yy0+bV9CVUZbaV0uc2l6ZSwgRE1BX1RPX0RFVklDRSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQljb2RlY19tbV9tZW1zZXQoaGV2Yy0+bV9CVUZbaV0uc3RhcnRfYWRyLAorCQkJCQkJCTAsIGhldmMtPm1fQlVGW2ldLnNpemUpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJLypwdXRfY21hX2FsbG9jX3JlZigpOyovIC8qREVCVUdfVE1QKi8KKwkJfSBlbHNlCisJCQlyZXQgPSAwOworCX0KKworCWlmIChyZXQgPj0gMCkgeworCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1IpIHsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJhbGxvYyBidWYoJWQpIGZvciAlZC8lZCBzaXplIDB4JXgpID0+ICVwXG4iLAorCQkJaSwgaGV2Yy0+cGljX3csIGhldmMtPnBpY19oLAorCQkJYnVmX3NpemUsCisJCQloZXZjLT5tX0JVRltpXS5zdGFydF9hZHIpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKSB7CisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiYWxsb2MgYnVmKCVkKSBmb3IgJWQvJWQgc2l6ZSAweCV4KSA9PiBGYWlsISEhXG4iLAorCQkJaSwgaGV2Yy0+cGljX3csIGhldmMtPnBpY19oLAorCQkJYnVmX3NpemUpOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9idWZfdW51c2VkKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsIGludCBpKQoreworCWlmIChpID49IDAgJiYgaSA8IEJVRl9QT09MX1NJWkUpCisJCWhldmMtPm1fQlVGW2ldLnVzZWRfZmxhZyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlYWxsb2NfdW51c2VkX2J1ZihzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBCVUZfUE9PTF9TSVpFOyBpKyspIHsKKwkJaWYgKGhldmMtPm1fQlVGW2ldLnN0YXJ0X2FkciAmJgorCQkJaGV2Yy0+bV9CVUZbaV0udXNlZF9mbGFnID09IDApIHsKKwkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikgeworCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJImRlYWxsb2MgYnVmKCVkKSBhZHIgMHglcCBzaXplIDB4JXhcbiIsCisJCQkJCWksIGhldmMtPm1fQlVGW2ldLnN0YXJ0X2FkciwKKwkJCQkJaGV2Yy0+bV9CVUZbaV0uc2l6ZSk7CisJCQl9CisJCQlpZiAoIWhldmMtPmlzX3VzZWRfdjRsKQorCQkJCWRlY29kZXJfYm1tdV9ib3hfZnJlZV9pZHgoCisJCQkJCWhldmMtPmJtbXVfYm94LAorCQkJCQlWRl9CVUZGRVJfSURYKGkpKTsKKwkJCWhldmMtPm1fQlVGW2ldLnN0YXJ0X2FkciA9IDA7CisJCQloZXZjLT5tX0JVRltpXS5oZWFkZXJfYWRkciA9IDA7CisJCQloZXZjLT5tX0JVRltpXS5zaXplID0gMDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZGVhbGxvY19waWNfYnVmKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsCisJc3RydWN0IFBJQ19zICpwaWMpCit7CisJaW50IGkgPSBwaWMtPkJVRl9pbmRleDsKKwlwaWMtPkJVRl9pbmRleCA9IC0xOworCWlmIChpID49IDAgJiYKKwkJaSA8IEJVRl9QT09MX1NJWkUgJiYKKwkJaGV2Yy0+bV9CVUZbaV0uc3RhcnRfYWRyKSB7CisJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikgeworCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSJkZWFsbG9jIGJ1ZiglZCkgYWRyIDB4JXAgc2l6ZSAweCV4XG4iLAorCQkJCWksIGhldmMtPm1fQlVGW2ldLnN0YXJ0X2FkciwKKwkJCQloZXZjLT5tX0JVRltpXS5zaXplKTsKKwkJfQorCisJCWlmICghaGV2Yy0+aXNfdXNlZF92NGwpCisJCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWVfaWR4KAorCQkJCWhldmMtPmJtbXVfYm94LAorCQkJCVZGX0JVRkZFUl9JRFgoaSkpOworCQloZXZjLT5tX0JVRltpXS51c2VkX2ZsYWcgPSAwOworCQloZXZjLT5tX0JVRltpXS5zdGFydF9hZHIgPSAwOworCQloZXZjLT5tX0JVRltpXS5oZWFkZXJfYWRkciA9IDA7CisJCWhldmMtPm1fQlVGW2ldLnNpemUgPSAwOworCX0KK30KKworc3RhdGljIGludCB2NGxfcGFyc2VyX3dvcmtfcGljX251bShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWludCB1c2VkX2J1Zl9udW0gPSAwOworCisJcHJfZGVidWcoIm1hcmdpbiA9ICVkLCBzcHNfbWF4X2RlY19waWNfYnVmZmVyaW5nX21pbnVzMV8wID0gJWRcbiIsCisJCWdldF9keW5hbWljX2J1Zl9udW1fbWFyZ2luKGhldmMpLAorCQloZXZjLT5wYXJhbS5wLnNwc19tYXhfZGVjX3BpY19idWZmZXJpbmdfbWludXMxXzApOworCisJdXNlZF9idWZfbnVtID0gaGV2Yy0+cGFyYW0ucC5zcHNfbWF4X2RlY19waWNfYnVmZmVyaW5nX21pbnVzMV8wICsgMTsKKwkvKgorCTEuIG5lZWQgb25lIG1vcmUgZm9yIG11bHRpIGluc3RhbmNlLCBhcyBhcHBseV9yZWZfcGljX3NldCgpCisJICAgaGFzIG5vIGNoYW5jaCB0byBydW4gdG8gY2xlYXIgcmVmZXJlbmNlZCBmbGFnIGluIHNvbWUgY2FzZQorCTIuIGZvciBlb3MgYWRkIG1vcmUgYnVmZmVyIHRvIGZsdXNoLgorCSovCisJdXNlZF9idWZfbnVtICs9IDI7CisKKwlpZiAoaGV2Yy0+c2F2ZV9idWZmZXJfbW9kZSkKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJInNhdmUgYnVmIF9tb2RlIDogZHluYW1pY19idWZfbnVtX21hcmdpbiAlZCAtLS0tPiAlZCBcbiIsCisJCQlkeW5hbWljX2J1Zl9udW1fbWFyZ2luLCAgaGV2Yy0+ZHluYW1pY19idWZfbnVtX21hcmdpbik7CisKKwlpZiAodXNlZF9idWZfbnVtID4gbWF4X2J1Zl9udW0pCisJCXVzZWRfYnVmX251bSA9IG1heF9idWZfbnVtOworCXJldHVybiB1c2VkX2J1Zl9udW07Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2FsbG9jX3BpY19jb3VudChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWludCBhbGxvY19waWNfY291bnQgPSAwOworCWludCBpOworCXN0cnVjdCBQSUNfcyAqcGljOworCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVGX1BJQ19OVU07IGkrKykgeworCQlwaWMgPSBoZXZjLT5tX1BJQ1tpXTsKKwkJaWYgKHBpYyAmJiBwaWMtPmluZGV4ID49IDApCisJCQlhbGxvY19waWNfY291bnQrKzsKKwl9CisJcmV0dXJuIGFsbG9jX3BpY19jb3VudDsKK30KKworc3RhdGljIGludCB2NGxfY29uZmlnX3BpYyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLCBzdHJ1Y3QgUElDX3MgKnBpYykKK3sKKwlpbnQgaSA9IHBpYy0+aW5kZXg7CisJaW50IGR3X21vZGUgPSBnZXRfZG91YmxlX3dyaXRlX21vZGUoaGV2Yyk7CisKKwlpZiAoaGV2Yy0+bW11X2VuYWJsZSkKKwkJcGljLT5oZWFkZXJfYWRyID0gaGV2Yy0+bV9CVUZbaV0uaGVhZGVyX2FkZHI7CisKKwlwaWMtPkJVRl9pbmRleAkJPSBpOworCXBpYy0+UE9DCQk9IElOVkFMSURfUE9DOworCXBpYy0+bWNfY2FudmFzX3kJPSBwaWMtPmluZGV4OworCXBpYy0+bWNfY2FudmFzX3Vfdgk9IHBpYy0+aW5kZXg7CisKKwlpZiAoZHdfbW9kZSAmIDB4MTApIHsKKwkJcGljLT5tY19jYW52YXNfeSA9IChwaWMtPmluZGV4IDw8IDEpOworCQlwaWMtPm1jX2NhbnZhc191X3YgPSAocGljLT5pbmRleCA8PCAxKSArIDE7CisJCXBpYy0+bWNfeV9hZHIgPSBwaWMtPmR3X3lfYWRyOworCQlwaWMtPm1jX3Vfdl9hZHIgPSBwaWMtPmR3X3Vfdl9hZHI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3BpYyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLCBzdHJ1Y3QgUElDX3MgKnBpYykKK3sKKwlpbnQgcmV0ID0gLTE7CisJaW50IGk7CisJLyppbnQgbGN1X3NpemVfbG9nMiA9IGhldmMtPmxjdV9zaXplX2xvZzI7CisJaW50IE1WX01FTV9VTklUPWxjdV9zaXplX2xvZzI9PQorCQk2ID8gMHgxMDAgOiBsY3Vfc2l6ZV9sb2cyPT01ID8gMHg0MCA6IDB4MTA7Ki8KKwkvKmludCBNVl9NRU1fVU5JVCA9IGxjdV9zaXplX2xvZzIgPT0gNiA/IDB4MjAwIDogbGN1X3NpemVfbG9nMiA9PQorCQkJCQkgNSA/IDB4ODAgOiAweDIwOworCWludCBtcHJlZF9tdl9lbmQgPSBoZXZjLT53b3JrX3NwYWNlX2J1Zi0+bXByZWRfbXYuYnVmX3N0YXJ0ICsKKwkJCQkgaGV2Yy0+d29ya19zcGFjZV9idWYtPm1wcmVkX212LmJ1Zl9zaXplOyovCisJdW5zaWduZWQgaW50IHlfYWRyID0gMDsKKwlzdHJ1Y3QgYnVmX3N0cnVfcyBidWZfc3RydTsKKwlpbnQgYnVmX3NpemUgPSBjYWxfY3VycmVudF9idWZfc2l6ZShoZXZjLCAmYnVmX3N0cnUpOworCWludCBkd19tb2RlID0gZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGhldmMpOworCisJZm9yIChpID0gMDsgaSA8IEJVRl9QT09MX1NJWkU7IGkrKykgeworCQlpZiAoaGV2Yy0+bV9CVUZbaV0uc3RhcnRfYWRyICE9IDAgJiYKKwkJCWhldmMtPm1fQlVGW2ldLnVzZWRfZmxhZyA9PSAwICYmCisJCQlidWZfc2l6ZSA8PSBoZXZjLT5tX0JVRltpXS5zaXplKSB7CisJCQloZXZjLT5tX0JVRltpXS51c2VkX2ZsYWcgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaSA+PSBCVUZfUE9PTF9TSVpFKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoaGV2Yy0+bW11X2VuYWJsZSkgeworCQlwaWMtPmhlYWRlcl9hZHIgPSBoZXZjLT5tX0JVRltpXS5zdGFydF9hZHI7CisJCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpICYmCisJCQkoSVNfOEtfU0laRShoZXZjLT5waWNfdywgaGV2Yy0+cGljX2gpKSkKKwkJCXlfYWRyID0gaGV2Yy0+bV9CVUZbaV0uc3RhcnRfYWRyICsKKwkJCQlNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfOEs7CisJCWVsc2UKKwkJCXlfYWRyID0gaGV2Yy0+bV9CVUZbaV0uc3RhcnRfYWRyICsKKwkJCQlNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfNEs7CisJfSBlbHNlCisJCXlfYWRyID0gaGV2Yy0+bV9CVUZbaV0uc3RhcnRfYWRyOworCisJeV9hZHIgPSAoKHlfYWRyICsgMHhmZmZmKSA+PiAxNikgPDwgMTY7IC8qNjRrIGFsaWdubWVudCovCisKKwlwaWMtPlBPQyA9IElOVkFMSURfUE9DOworCS8qZW5zdXJlIGdldF9waWNfYnlfUE9DKCkKKwlub3QgZ2V0IHRoZSBidWZmZXIgbm90IGRlY29kZWQqLworCXBpYy0+QlVGX2luZGV4ID0gaTsKKworCWlmICgoIWhldmMtPm1tdV9lbmFibGUpICYmCisJCSgoZHdfbW9kZSAmIDB4MTApID09IDApCisJCSkgeworCQlwaWMtPm1jX3lfYWRyID0geV9hZHI7CisJCXlfYWRyICs9IChidWZfc3RydS5tY19idWZmZXJfc2l6ZV9oIDw8IDE2KTsKKwl9CisJcGljLT5tY19jYW52YXNfeSA9IHBpYy0+aW5kZXg7CisJcGljLT5tY19jYW52YXNfdV92ID0gcGljLT5pbmRleDsKKwlpZiAoZHdfbW9kZSAmIDB4MTApIHsKKwkJcGljLT5tY195X2FkciA9IHlfYWRyOworCQlwaWMtPm1jX3Vfdl9hZHIgPSB5X2FkciArCisJCQkoKGJ1Zl9zdHJ1Lm1jX2J1ZmZlcl9zaXplX3Vfdl9oIDw8IDE2KSA8PCAxKTsKKwkJcGljLT5tY19jYW52YXNfeSA9IChwaWMtPmluZGV4IDw8IDEpOworCQlwaWMtPm1jX2NhbnZhc191X3YgPSAocGljLT5pbmRleCA8PCAxKSArIDE7CisKKwkJcGljLT5kd195X2FkciA9IHBpYy0+bWNfeV9hZHI7CisJCXBpYy0+ZHdfdV92X2FkciA9IHBpYy0+bWNfdV92X2FkcjsKKwl9IGVsc2UgaWYgKGR3X21vZGUpIHsKKwkJcGljLT5kd195X2FkciA9IHlfYWRyOworCQlwaWMtPmR3X3Vfdl9hZHIgPSBwaWMtPmR3X3lfYWRyICsKKwkJCSgoYnVmX3N0cnUubWNfYnVmZmVyX3NpemVfdV92X2ggPDwgMTYpIDw8IDEpOworCX0KKworCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikgeworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCSIlcyBpbmRleCAlZCBCVUZfaW5kZXggJWQgbWNfeV9hZHIgJXhcbiIsCisJCSBfX2Z1bmNfXywgcGljLT5pbmRleCwKKwkJIHBpYy0+QlVGX2luZGV4LCBwaWMtPm1jX3lfYWRyKTsKKwkJaWYgKGhldmMtPm1tdV9lbmFibGUgJiYKKwkJCWR3X21vZGUpCisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkibW11IGRvdWJsZSB3cml0ZSAgYWRyICVsZFxuIiwKKwkJCSBwaWMtPmNtYV9hbGxvY19hZGRyKTsKKwl9CisJcmV0ID0gMDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfcGljX2xpc3Qoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwlpbnQgaTsKKwlpbnQgaW5pdF9idWZfbnVtID0gaGV2Yy0+dXNlZF9idWZfbnVtOworCWludCBkd19tb2RlID0gZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGhldmMpOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGhldmMpOworCS8qYWxsb2MgZGVjb2RlciBidWYgd2lsbCBiZSBkZWxheSBpZiB3b3JrIG9uIHY0bC4gKi8KKwlpZiAoIWhldmMtPmlzX3VzZWRfdjRsKSB7CisJCWZvciAoaSA9IDA7IGkgPCBpbml0X2J1Zl9udW07IGkrKykgeworCQkJaWYgKGFsbG9jX2J1ZihoZXZjKSA8IDApIHsKKwkJCQlpZiAoaSA8PSA4KSB7CisJCQkJCS8qaWYgYWxsb2NlZCAoaSsxKT49OQorCQkJCQlkb24ndCBzZW5kIGVycm9ycy4qLworCQkJCQloZXZjLT5mYXRhbF9lcnJvciB8PQorCQkJCQlERUNPREVSX0ZBVEFMX0VSUk9SX05PX01FTTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9QSUNfTlVNOyBpKyspIHsKKwkJc3RydWN0IFBJQ19zICpwaWMgPSBoZXZjLT5tX1BJQ1tpXTsKKworCQlpZiAoIXBpYykgeworCQkJcGljID0gdnphbGxvYyhzaXplb2Yoc3RydWN0IFBJQ19zKSk7CisJCQlpZiAocGljID09IE5VTEwpIHsKKwkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCSIlczogYWxsb2MgcGljICVkIGZhaWwhISFcbiIsCisJCQkJCV9fZnVuY19fLCBpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWhldmMtPm1fUElDW2ldID0gcGljOworCQl9IGVsc2UgeworCQkJY2hhciAqYXV4X2RhdGFfdG1wOworCQkJdTMyIGF1eF9kYXRhX3NpemU7CisKKwkJCWF1eF9kYXRhX3RtcCA9IHBpYy0+YXV4X2RhdGFfYnVmOworCQkJYXV4X2RhdGFfc2l6ZSA9IHBpYy0+YXV4X2RhdGFfc2l6ZTsKKwkJCW1lbXNldChwaWMsIDAsIHNpemVvZihzdHJ1Y3QgUElDX3MpKTsKKwkJCXBpYy0+YXV4X2RhdGFfYnVmID0gYXV4X2RhdGFfdG1wOworCQkJcGljLT5hdXhfZGF0YV9zaXplID0gYXV4X2RhdGFfc2l6ZTsKKwkJfQorCisJCXBpYy0+aW5kZXggPSBpOworCQlwaWMtPkJVRl9pbmRleCA9IC0xOworCQlwaWMtPm12X2J1Zl9pbmRleCA9IC0xOworCQlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJCXBpYy0+eV9jYW52YXNfaW5kZXggPSAtMTsKKwkJCXBpYy0+dXZfY2FudmFzX2luZGV4ID0gLTE7CisJCX0KKworCQlwaWMtPndpZHRoID0gaGV2Yy0+cGljX3c7CisJCXBpYy0+aGVpZ2h0ID0gaGV2Yy0+cGljX2g7CisJCXBpYy0+ZG91YmxlX3dyaXRlX21vZGUgPSBkd19tb2RlOworCQlwaWMtPlBPQyA9IElOVkFMSURfUE9DOworCisJCS8qY29uZmlnIGNhbnZhcyB3aWxsIGJlIGRlbGF5IGlmIHdvcmsgb24gdjRsLiAqLworCQlpZiAoIWhldmMtPmlzX3VzZWRfdjRsKSB7CisJCQlpZiAoY29uZmlnX3BpYyhoZXZjLCBwaWMpIDwgMCkgeworCQkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykpCisJCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJCSJDb25maWdfcGljICVkIGZhaWxcbiIsIHBpYy0+aW5kZXgpOworCQkJCXBpYy0+aW5kZXggPSAtMTsKKwkJCQlpKys7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChwaWMtPmRvdWJsZV93cml0ZV9tb2RlKQorCQkJCXNldF9jYW52YXMoaGV2YywgcGljKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgdW5pbml0X3BpY19saXN0KHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaGV2Yyk7CisJaW50IGk7CisjaWZuZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwlkZWFsbG9jX212X2J1ZnMoaGV2Yyk7CisjZW5kaWYKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9QSUNfTlVNOyBpKyspIHsKKwkJc3RydWN0IFBJQ19zICpwaWMgPSBoZXZjLT5tX1BJQ1tpXTsKKworCQlpZiAocGljKSB7CisJCQlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJCQl2ZGVjLT5mcmVlX2NhbnZhc19leChwaWMtPnlfY2FudmFzX2luZGV4LCB2ZGVjLT5pZCk7CisJCQkJdmRlYy0+ZnJlZV9jYW52YXNfZXgocGljLT51dl9jYW52YXNfaW5kZXgsIHZkZWMtPmlkKTsKKwkJCX0KKwkJCXJlbGVhc2VfYXV4X2RhdGEoaGV2YywgcGljKTsKKwkJCXZmcmVlKHBpYyk7CisJCQloZXZjLT5tX1BJQ1tpXSA9IE5VTEw7CisJCX0KKwl9Cit9CisKKyNpZmRlZiBMT1NMRVNTX0NPTVBSRVNTX01PREUKK3N0YXRpYyB2b2lkIGluaXRfZGVjb2RlX2hlYWRfaHcoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKworCXN0cnVjdCBCdWZmSW5mb19zICpidWZfc3BlYyA9IGhldmMtPndvcmtfc3BhY2VfYnVmOworCXVuc2lnbmVkIGludCBkYXRhMzI7CisKKwlpbnQgbG9zbGVzc19jb21wX2hlYWRlcl9zaXplID0KKwkJY29tcHV0ZV9sb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUoaGV2Yy0+cGljX3csCisJCQkgaGV2Yy0+cGljX2gpOworCWludCBsb3NsZXNzX2NvbXBfYm9keV9zaXplID0gY29tcHV0ZV9sb3NsZXNzX2NvbXBfYm9keV9zaXplKGhldmMsCisJCWhldmMtPnBpY193LCBoZXZjLT5waWNfaCwgaGV2Yy0+bWVtX3NhdmluZ19tb2RlKTsKKworCWhldmMtPmxvc2xlc3NfY29tcF9ib2R5X3NpemUgPSBsb3NsZXNzX2NvbXBfYm9keV9zaXplOworCisKKwlpZiAoaGV2Yy0+bW11X2VuYWJsZSkgeworCQlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMSwgKDB4MSA8PCA0KSk7CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwyLCAweDApOworCX0gZWxzZSB7CisJaWYgKGhldmMtPm1lbV9zYXZpbmdfbW9kZSA9PSAxKQorCQlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMSwKKwkJCSgxIDw8IDMpIHwgKCh3b3JrYXJvdW5kX2VuYWJsZSAmIDIpID8gMSA6IDApKTsKKwllbHNlCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLAorCQkJKCh3b3JrYXJvdW5kX2VuYWJsZSAmIDIpID8gMSA6IDApKTsKKwlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMiwgKGxvc2xlc3NfY29tcF9ib2R5X3NpemUgPj4gNSkpOworCS8qCisJICpXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMywoMHhmZjw8MjApIHwgKDB4ZmY8PDEwKSB8IDB4ZmYpOworCSAqCS8vOC1iaXQgbW9kZQorCSAqLworCX0KKwlXUklURV9WUkVHKEhFVkNfQ01fQk9EWV9MRU5HVEgsIGxvc2xlc3NfY29tcF9ib2R5X3NpemUpOworCVdSSVRFX1ZSRUcoSEVWQ19DTV9IRUFERVJfT0ZGU0VULCBsb3NsZXNzX2NvbXBfYm9keV9zaXplKTsKKwlXUklURV9WUkVHKEhFVkNfQ01fSEVBREVSX0xFTkdUSCwgbG9zbGVzc19jb21wX2hlYWRlcl9zaXplKTsKKworCWlmIChoZXZjLT5tbXVfZW5hYmxlKSB7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fTU1VX1ZIMF9BRERSLCBidWZfc3BlYy0+bW11X3ZiaC5idWZfc3RhcnQpOworCQlXUklURV9WUkVHKEhFVkNfU0FPX01NVV9WSDFfQUREUiwKKwkJCWJ1Zl9zcGVjLT5tbXVfdmJoLmJ1Zl9zdGFydCArCisJCQlidWZfc3BlYy0+bW11X3ZiaC5idWZfc2l6ZS8yKTsKKwkJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkw5KTsKKwkJZGF0YTMyIHw9IDB4MTsKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMOSwgZGF0YTMyKTsKKworCQkvKiB1c2UgSEVWQ19DTV9IRUFERVJfU1RBUlRfQUREUiAqLworCQlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDUpOworCQlkYXRhMzIgfD0gKDE8PDEwKTsKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMNSwgZGF0YTMyKTsKKwl9CisKKwlpZiAoIWhldmMtPm1faW5zX2ZsYWcpCisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSIlczogKCVkLCAlZCkgYm9keV9zaXplIDB4JXggaGVhZGVyX3NpemUgMHgleFxuIiwKKwkJCV9fZnVuY19fLCBoZXZjLT5waWNfdywgaGV2Yy0+cGljX2gsCisJCQlsb3NsZXNzX2NvbXBfYm9keV9zaXplLCBsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUpOworCit9CisjZW5kaWYKKyNkZWZpbmUgSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0RBVEEgICAgICAgICAgICAgICAgIDB4MzQ2NAorCitzdGF0aWMgdm9pZCBpbml0X3BpY19saXN0X2h3KHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJaW50IGk7CisJaW50IGN1cl9waWNfbnVtID0gTUFYX1JFRl9QSUNfTlVNOworCWludCBkd19tb2RlID0gZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGhldmMpOworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTCkKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DMkFYSV9UQkxfQ09ORl9BRERSLAorCQkJKDB4MSA8PCAxKSB8ICgweDEgPDwgMikpOworCWVsc2UKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DMkFYSV9UQkxfQ09ORl9BRERSLCAweDApOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9SRUZfUElDX05VTTsgaSsrKSB7CisJCWlmIChoZXZjLT5tX1BJQ1tpXSA9PSBOVUxMIHx8CisJCQloZXZjLT5tX1BJQ1tpXS0+aW5kZXggPT0gLTEpIHsKKwkJCWN1cl9waWNfbnVtID0gaTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTCkgeworCQkJaWYgKGhldmMtPm1tdV9lbmFibGUgJiYgKChkd19tb2RlICYgMHgxMCkgPT0gMCkpCisJCQkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DMkFYSV9UQkxfREFUQSwKKwkJCQkJaGV2Yy0+bV9QSUNbaV0tPmhlYWRlcl9hZHI+PjUpOworCQkJZWxzZQorCQkJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0RBVEEsCisJCQkJCWhldmMtPm1fUElDW2ldLT5tY195X2FkciA+PiA1KTsKKwkJfSBlbHNlCisJCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9DTURfQUREUiwKKwkJCQloZXZjLT5tX1BJQ1tpXS0+bWNfeV9hZHIgfAorCQkJCShoZXZjLT5tX1BJQ1tpXS0+bWNfY2FudmFzX3kgPDwgOCkgfCAweDEpOworCQlpZiAoZHdfbW9kZSAmIDB4MTApIHsKKwkJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTCkgeworCQkJCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9EQVRBLAorCQkJCQloZXZjLT5tX1BJQ1tpXS0+bWNfdV92X2FkciA+PiA1KTsKKwkJCQl9CisJCQllbHNlCisJCQkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DMkFYSV9UQkxfQ01EX0FERFIsCisJCQkJCWhldmMtPm1fUElDW2ldLT5tY191X3ZfYWRyIHwKKwkJCQkJKGhldmMtPm1fUElDW2ldLT5tY19jYW52YXNfdV92IDw8IDgpCisJCQkJCXwgMHgxKTsKKwkJfQorCX0KKwlpZiAoY3VyX3BpY19udW0gPT0gMCkKKwkJcmV0dXJuOworCisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DMkFYSV9UQkxfQ09ORl9BRERSLCAweDEpOworCisJLyogWmVybyBvdXQgY2FudmFzIHJlZ2lzdGVycyBpbiBJUFAgLS0gYXZvaWQgc2ltdWxhdGlvbiBYICovCisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwKKwkJCSAgICgwIDw8IDgpIHwgKDAgPDwgMSkgfCAxKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIsIDApOworCisjaWZkZWYgTE9TTEVTU19DT01QUkVTU19NT0RFCisJaWYgKChkd19tb2RlICYgMHgxMCkgPT0gMCkKKwkJaW5pdF9kZWNvZGVfaGVhZF9odyhoZXZjKTsKKyNlbmRpZgorCit9CisKKworc3RhdGljIHZvaWQgZHVtcF9waWNfbGlzdChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWludCBpOworCXN0cnVjdCBQSUNfcyAqcGljOworCVBSX0lOSVQoMjU2KTsKKworCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJInBpY19saXN0X2luaXRfZmxhZyBpcyAlZFxyXG4iLCBoZXZjLT5waWNfbGlzdF9pbml0X2ZsYWcpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVGX1BJQ19OVU07IGkrKykgeworCQlwaWMgPSBoZXZjLT5tX1BJQ1tpXTsKKwkJaWYgKHBpYyA9PSBOVUxMIHx8IHBpYy0+aW5kZXggPT0gLTEpCisJCQljb250aW51ZTsKKwkJUFJfRklMTCgiaW5kZXggJWQgYnVmX2lkeCAlZCBtdl9pZHggJWQgZGVjb2RlX2lkeDolZCwJUE9DOiVkLAlyZWZlcmVuY2VkOiVkIChMVCAlZCksCSIsCisJCSBwaWMtPmluZGV4LCBwaWMtPkJVRl9pbmRleCwKKyNpZm5kZWYgTVZfVVNFX0ZJWEVEX0JVRgorCQlwaWMtPm12X2J1Zl9pbmRleCwKKyNlbHNlCisJCSAtMSwKKyNlbmRpZgorCQkgcGljLT5kZWNvZGVfaWR4LCBwaWMtPlBPQywgcGljLT5yZWZlcmVuY2VkCisjaWZkZWYgU1VQUE9SVF9MT05HX1RFUk1fUlBTCisJCSAsIHBpYy0+bG9uZ190ZXJtX3JlZgorI2Vsc2UKKwkJICwgMAorI2VuZGlmCisJCSApOworCQlQUl9GSUxMKCJudW1fcmVvcmRlcl9waWM6JWQsIG91dHB1dF9tYXJrOiVkLCBlcnJvcl9tYXJrOiVkIHcvaCAlZCwlZCIsCisJCQkJcGljLT5udW1fcmVvcmRlcl9waWMsIHBpYy0+b3V0cHV0X21hcmssIHBpYy0+ZXJyb3JfbWFyaywKKwkJCQlwaWMtPndpZHRoLCBwaWMtPmhlaWdodCk7CisJCVBSX0ZJTEwoIm91dHB1dF9yZWFkeTolZCwgbXZfd3Jfc3RhcnQgJXggdmZfcmVmICVkIiwKKwkJCQlwaWMtPm91dHB1dF9yZWFkeSwgcGljLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyLAorCQkJCXBpYy0+dmZfcmVmKTsKKwkJUFJfSU5GTyhoZXZjLT5pbmRleCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjbGVhcl9yZWZlcmVuY2VkX2ZsYWcoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgUElDX3MgKnBpYzsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9QSUNfTlVNOyBpKyspIHsKKwkJcGljID0gaGV2Yy0+bV9QSUNbaV07CisJCWlmIChwaWMgPT0gTlVMTCB8fCBwaWMtPmluZGV4ID09IC0xKQorCQkJY29udGludWU7CisJCWlmIChwaWMtPnJlZmVyZW5jZWQpIHsKKwkJCXBpYy0+cmVmZXJlbmNlZCA9IDA7CisJCQlwdXRfbXZfYnVmKGhldmMsIHBpYyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX3BvY19mbGFnKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJaW50IGk7CisJc3RydWN0IFBJQ19zICpwaWM7CisJZm9yIChpID0gMDsgaSA8IE1BWF9SRUZfUElDX05VTTsgaSsrKSB7CisJCXBpYyA9IGhldmMtPm1fUElDW2ldOworCQlpZiAocGljID09IE5VTEwgfHwgcGljLT5pbmRleCA9PSAtMSkKKwkJCWNvbnRpbnVlOworCQlwaWMtPlBPQyA9IElOVkFMSURfUE9DOworCX0KK30KKworc3RhdGljIHN0cnVjdCBQSUNfcyAqb3V0cHV0X3BpYyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCQl1bnNpZ25lZCBjaGFyIGZsdXNoX2ZsYWcpCit7CisJaW50IG51bV9waWNfbm90X3lldF9kaXNwbGF5ID0gMDsKKwlpbnQgaSwgZmlzcnRfcGljX2ZsYWcgPSAwOworCXN0cnVjdCBQSUNfcyAqcGljOworCXN0cnVjdCBQSUNfcyAqcGljX2Rpc3BsYXkgPSBOVUxMOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGhldmMpOworCisJaWYgKGhldmMtPmlfb25seSAmIDB4NCkgeworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9QSUNfTlVNOyBpKyspIHsKKwkJCXBpYyA9IGhldmMtPm1fUElDW2ldOworCQkJaWYgKHBpYyA9PSBOVUxMIHx8CisJCQkJKHBpYy0+aW5kZXggPT0gLTEpIHx8CisJCQkJKHBpYy0+QlVGX2luZGV4ID09IC0xKSB8fAorCQkJCShwaWMtPlBPQyA9PSBJTlZBTElEX1BPQykpCisJCQkJY29udGludWU7CisJCQlpZiAocGljLT5vdXRwdXRfbWFyaykgeworCQkJCWlmIChwaWNfZGlzcGxheSkgeworCQkJCQlpZiAocGljLT5kZWNvZGVfaWR4IDwKKwkJCQkJCXBpY19kaXNwbGF5LT5kZWNvZGVfaWR4KQorCQkJCQkJcGljX2Rpc3BsYXkgPSBwaWM7CisKKwkJCQl9IGVsc2UKKwkJCQkJcGljX2Rpc3BsYXkgPSBwaWM7CisKKwkJCX0KKwkJfQorCQlpZiAocGljX2Rpc3BsYXkpIHsKKwkJCXBpY19kaXNwbGF5LT5vdXRwdXRfbWFyayA9IDA7CisJCQlwaWNfZGlzcGxheS0+cmVjb25fbWFyayA9IDA7CisJCQlwaWNfZGlzcGxheS0+b3V0cHV0X3JlYWR5ID0gMTsKKwkJCXBpY19kaXNwbGF5LT5yZWZlcmVuY2VkID0gMDsKKwkJCXB1dF9tdl9idWYoaGV2YywgcGljX2Rpc3BsYXkpOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9SRUZfUElDX05VTTsgaSsrKSB7CisJCQlwaWMgPSBoZXZjLT5tX1BJQ1tpXTsKKwkJCWlmIChwaWMgPT0gTlVMTCB8fAorCQkJCShwaWMtPmluZGV4ID09IC0xKSB8fAorCQkJCShwaWMtPkJVRl9pbmRleCA9PSAtMSkgfHwKKwkJCQkocGljLT5QT0MgPT0gSU5WQUxJRF9QT0MpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHBpYy0+b3V0cHV0X21hcmspCisJCQkJbnVtX3BpY19ub3RfeWV0X2Rpc3BsYXkrKzsKKwkJCWlmIChwaWMtPnNsaWNlX3R5cGUgPT0gMiAmJgorCQkJCWF0b21pY19yZWFkKCZoZXZjLT52Zl9wcmVfY291bnQpID09IDAgJiYKKwkJCQlmYXN0X291dHB1dF9lbmFibGUgJiAweDEpIHsKKwkJCQkvKmZhc3Qgb3V0cHV0IGZvciBmaXJzdCBJIHBpY3R1cmUqLworCQkJCXBpYy0+bnVtX3Jlb3JkZXJfcGljID0gMDsKKwkJCQlpZiAodmRlYy0+bWFzdGVyIHx8IHZkZWMtPnNsYXZlKQorCQkJCQlwaWNfZGlzcGxheSA9IHBpYzsKKwkJCQlmaXNydF9waWNfZmxhZyA9IDE7CisJCQkJaGV2Y19wcmludChoZXZjLCAwLCAiVkgyNjU6IG91dHB1dCBmaXJzdCBmcmFtZVxuIik7CisJCQl9CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9QSUNfTlVNOyBpKyspIHsKKwkJCXBpYyA9IGhldmMtPm1fUElDW2ldOworCQkJaWYgKHBpYyA9PSBOVUxMIHx8CisJCQkJKHBpYy0+aW5kZXggPT0gLTEpIHx8CisJCQkJKHBpYy0+QlVGX2luZGV4ID09IC0xKSB8fAorCQkJCShwaWMtPlBPQyA9PSBJTlZBTElEX1BPQykpCisJCQkJY29udGludWU7CisJCQlpZiAocGljLT5vdXRwdXRfbWFyaykgeworCQkJCWlmIChwaWNfZGlzcGxheSkgeworCQkJCQlpZiAocGljLT5QT0MgPCBwaWNfZGlzcGxheS0+UE9DKQorCQkJCQkJcGljX2Rpc3BsYXkgPSBwaWM7CisJCQkJCWVsc2UgaWYgKChwaWMtPlBPQyA9PSBwaWNfZGlzcGxheS0+UE9DKQorCQkJCQkJJiYgKHBpYy0+ZGVjb2RlX2lkeCA8CisJCQkJCQkJcGljX2Rpc3BsYXktPgorCQkJCQkJCWRlY29kZV9pZHgpKQorCQkJCQkJCQlwaWNfZGlzcGxheQorCQkJCQkJCQk9IHBpYzsKKwkJCQl9IGVsc2UKKwkJCQkJcGljX2Rpc3BsYXkgPSBwaWM7CisJCQl9CisJCX0KKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCQkvKiBkdiB3YWl0IGN1cl9waWMgYWxsIGRhdGEgZ2V0LAorCQlzb21lIGRhdGEgbWF5IGdldCBhZnRlciBwaWN0dXJlIG91dHB1dCAqLworCQlpZiAoKHZkZWMtPm1hc3RlciB8fCB2ZGVjLT5zbGF2ZSkKKwkJCSYmIChwaWNfZGlzcGxheSA9PSBoZXZjLT5jdXJfcGljKSAmJgorCQkJKCFmbHVzaF9mbGFnKSAmJgorCQkJKGhldmMtPmJ5cGFzc19kdmVubCAmJiAhZG9sYnlfbWV0YV93aXRoX2VsKQorCQkJJiYgKCFmaXNydF9waWNfZmxhZykpCisJCQlwaWNfZGlzcGxheSA9IE5VTEw7CisjZW5kaWYKKwkJaWYgKHBpY19kaXNwbGF5KSB7CisJCQlpZiAoKG51bV9waWNfbm90X3lldF9kaXNwbGF5ID4KKwkJCQlwaWNfZGlzcGxheS0+bnVtX3Jlb3JkZXJfcGljKQorCQkJCXx8IGZsdXNoX2ZsYWcpIHsKKwkJCQlwaWNfZGlzcGxheS0+b3V0cHV0X21hcmsgPSAwOworCQkJCXBpY19kaXNwbGF5LT5yZWNvbl9tYXJrID0gMDsKKwkJCQlwaWNfZGlzcGxheS0+b3V0cHV0X3JlYWR5ID0gMTsKKwkJCX0gZWxzZSBpZiAobnVtX3BpY19ub3RfeWV0X2Rpc3BsYXkgPj0KKwkJCQkoTUFYX1JFRl9QSUNfTlVNIC0gMSkpIHsKKwkJCQlwaWNfZGlzcGxheS0+b3V0cHV0X21hcmsgPSAwOworCQkJCXBpY19kaXNwbGF5LT5yZWNvbl9tYXJrID0gMDsKKwkJCQlwaWNfZGlzcGxheS0+b3V0cHV0X3JlYWR5ID0gMTsKKwkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCSJXYXJuaW5nLCBudW1fcmVvcmRlcl9waWMgJWQgaXMgYnllb25kIGJ1ZiBudW1cbiIsCisJCQkJCXBpY19kaXNwbGF5LT5udW1fcmVvcmRlcl9waWMpOworCQkJfSBlbHNlCisJCQkJcGljX2Rpc3BsYXkgPSBOVUxMOworCQl9CisJfQorCisJaWYgKHBpY19kaXNwbGF5ICYmIGhldmMtPnNwc19udW1fcmVvcmRlcl9waWNzXzAgJiYKKwkJKGF0b21pY19yZWFkKCZoZXZjLT52Zl9wcmVfY291bnQpID09IDEpICYmIChoZXZjLT5maXJzdF9waWNfZmxhZyA9PSAxKSkgeworCQlwaWNfZGlzcGxheSA9IE5VTEw7CisJCWhldmMtPmZpcnN0X3BpY19mbGFnID0gMjsKKwl9CisJcmV0dXJuIHBpY19kaXNwbGF5OworfQorCitzdGF0aWMgaW50IGNvbmZpZ19tY19idWZmZXIoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Yywgc3RydWN0IFBJQ19zICpjdXJfcGljKQoreworCWludCBpOworCXN0cnVjdCBQSUNfcyAqcGljOworCisJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKQorCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiY29uZmlnX21jX2J1ZmZlciBlbnRlcmVkIC4uLi4uXG4iKTsKKwlpZiAoY3VyX3BpYy0+c2xpY2VfdHlwZSAhPSAyKSB7CS8qIFAgYW5kIEIgcGljICovCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfQUNDQ09ORklHX0FERFIsCisJCQkJICAgKDAgPDwgOCkgfCAoMCA8PCAxKSB8IDEpOworCQlmb3IgKGkgPSAwOyBpIDwgY3VyX3BpYy0+UmVmTnVtX0wwOyBpKyspIHsKKwkJCXBpYyA9CisJCQkJZ2V0X3JlZl9waWNfYnlfUE9DKGhldmMsCisJCQkJCQljdXJfcGljLT4KKwkJCQkJCW1fYWlSZWZQT0NMaXN0MFtjdXJfcGljLT4KKwkJCQkJCXNsaWNlX2lkeF1baV0pOworCQkJaWYgKHBpYykgeworCQkJCWlmICgocGljLT53aWR0aCAhPSBoZXZjLT5waWNfdykgfHwKKwkJCQkJKHBpYy0+aGVpZ2h0ICE9IGhldmMtPnBpY19oKSkgeworCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCQkiJXM6IFdyb25nIHJlZmVyZW5jZSBwaWMgKHBvYyAlZCkgd2lkdGgvaGVpZ2h0ICVkLyVkXG4iLAorCQkJCQkJX19mdW5jX18sIHBpYy0+UE9DLAorCQkJCQkJcGljLT53aWR0aCwgcGljLT5oZWlnaHQpOworCQkJCQljdXJfcGljLT5lcnJvcl9tYXJrID0gMTsKKwkJCQl9CisJCQkJaWYgKHBpYy0+ZXJyb3JfbWFyayAmJiAocmVmX2ZyYW1lX21hcmtfZmxhZ1toZXZjLT5pbmRleF0pKQorCQkJCQljdXJfcGljLT5lcnJvcl9tYXJrID0gMTsKKwkJCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUiwKKwkJCQkJCShwaWMtPm1jX2NhbnZhc191X3YgPDwgMTYpCisJCQkJCQl8IChwaWMtPm1jX2NhbnZhc191X3YKKwkJCQkJCQk8PCA4KSB8CisJCQkJCQkgICBwaWMtPm1jX2NhbnZhc195KTsKKwkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1IpIHsKKwkJCQkJaGV2Y19wcmludF9jb250KGhldmMsIDAsCisJCQkJCSJyZWZpZCAleCBtY19jYW52YXNfdV92ICV4IiwKKwkJCQkJIGksIHBpYy0+bWNfY2FudmFzX3Vfdik7CisJCQkJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLAorCQkJCQkJIiBtY19jYW52YXNfeSAleFxuIiwKKwkJCQkJIHBpYy0+bWNfY2FudmFzX3kpOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCWN1cl9waWMtPmVycm9yX21hcmsgPSAxOworCisJCQlpZiAocGljID09IE5VTEwgfHwgcGljLT5lcnJvcl9tYXJrKSB7CisJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSJFcnJvciAlcywgJWR0aCBwb2MgKCVkKSAlcyIsCisJCQkJIF9fZnVuY19fLCBpLAorCQkJCSBjdXJfcGljLT5tX2FpUmVmUE9DTGlzdDBbY3VyX3BpYy0+CisJCQkJIHNsaWNlX2lkeF1baV0sCisJCQkJIHBpYyA/ICJoYXMgZXJyb3IiIDoKKwkJCQkgIm5vdCBpbiBsaXN0MCIpOworCQkJfQorCQl9CisJfQorCWlmIChjdXJfcGljLT5zbGljZV90eXBlID09IDApIHsJLyogQiBwaWMgKi8KKwkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKQorCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSJjb25maWdfbWNfYnVmZmVyIFJlZk51bV9MMVxuIik7CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfQUNDQ09ORklHX0FERFIsCisJCQkJICAgKDE2IDw8IDgpIHwgKDAgPDwgMSkgfCAxKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgY3VyX3BpYy0+UmVmTnVtX0wxOyBpKyspIHsKKwkJCXBpYyA9CisJCQkJZ2V0X3JlZl9waWNfYnlfUE9DKGhldmMsCisJCQkJCQljdXJfcGljLT4KKwkJCQkJCW1fYWlSZWZQT0NMaXN0MVtjdXJfcGljLT4KKwkJCQkJCXNsaWNlX2lkeF1baV0pOworCQkJaWYgKHBpYykgeworCQkJCWlmICgocGljLT53aWR0aCAhPSBoZXZjLT5waWNfdykgfHwKKwkJCQkJKHBpYy0+aGVpZ2h0ICE9IGhldmMtPnBpY19oKSkgeworCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCQkiJXM6IFdyb25nIHJlZmVyZW5jZSBwaWMgKHBvYyAlZCkgd2lkdGgvaGVpZ2h0ICVkLyVkXG4iLAorCQkJCQkJX19mdW5jX18sIHBpYy0+UE9DLAorCQkJCQkJcGljLT53aWR0aCwgcGljLT5oZWlnaHQpOworCQkJCQljdXJfcGljLT5lcnJvcl9tYXJrID0gMTsKKwkJCQl9CisKKwkJCQlpZiAocGljLT5lcnJvcl9tYXJrICYmIChyZWZfZnJhbWVfbWFya19mbGFnW2hldmMtPmluZGV4XSkpCisJCQkJCWN1cl9waWMtPmVycm9yX21hcmsgPSAxOworCQkJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSLAorCQkJCQkJICAgKHBpYy0+bWNfY2FudmFzX3VfdiA8PCAxNikKKwkJCQkJCSAgIHwgKHBpYy0+bWNfY2FudmFzX3VfdgorCQkJCQkJCQkgICA8PCA4KSB8CisJCQkJCQkgICBwaWMtPm1jX2NhbnZhc195KTsKKwkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1IpIHsKKwkJCQkJaGV2Y19wcmludF9jb250KGhldmMsIDAsCisJCQkJCSJyZWZpZCAleCBtY19jYW52YXNfdV92ICV4IiwKKwkJCQkJIGksIHBpYy0+bWNfY2FudmFzX3Vfdik7CisJCQkJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLAorCQkJCQkJIiBtY19jYW52YXNfeSAleFxuIiwKKwkJCQkJIHBpYy0+bWNfY2FudmFzX3kpOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCWN1cl9waWMtPmVycm9yX21hcmsgPSAxOworCisJCQlpZiAocGljID09IE5VTEwgfHwgcGljLT5lcnJvcl9tYXJrKSB7CisJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSJFcnJvciAlcywgJWR0aCBwb2MgKCVkKSAlcyIsCisJCQkJIF9fZnVuY19fLCBpLAorCQkJCSBjdXJfcGljLT5tX2FpUmVmUE9DTGlzdDFbY3VyX3BpYy0+CisJCQkJIHNsaWNlX2lkeF1baV0sCisJCQkJIHBpYyA/ICJoYXMgZXJyb3IiIDoKKwkJCQkgIm5vdCBpbiBsaXN0MSIpOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCisjaWZkZWYgU1VQUE9SVF9MT05HX1RFUk1fUlBTCitzdGF0aWMgdW5zaWduZWQgY2hhciBpc19yZWZfbG9uZ190ZXJtKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsIGludCBwb2MpCit7CisJaW50IGlpOworCXN0cnVjdCBQSUNfcyAqcGljOworCWZvciAoaWkgPSAwOyBpaSA8IE1BWF9SRUZfUElDX05VTTsgaWkrKykgeworCQlwaWMgPSBoZXZjLT5tX1BJQ1tpaV07CisJCWlmIChwaWMgPT0gTlVMTCB8fAorCQkJcGljLT5pbmRleCA9PSAtMSB8fAorCQkJcGljLT5CVUZfaW5kZXggPT0gLTEKKwkJCSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChwaWMtPnJlZmVyZW5jZWQgJiYgcGljLT5QT0MgPT0gcG9jCisJCQkmJiBwaWMtPmxvbmdfdGVybV9yZWYpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBhcHBseV9yZWZfcGljX3NldChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLCBpbnQgY3VyX3BvYywKKwkJCQkJCQkgIHVuaW9uIHBhcmFtX3UgKnBhcmFtcykKK3sKKwlpbnQgaWksIGk7CisJaW50IHBvY190bXA7CisJc3RydWN0IFBJQ19zICpwaWM7CisJdW5zaWduZWQgY2hhciBpc19yZWZlcmVuY2VkOworCS8qIGhldmNfcHJpbnQoaGV2YywgMCwKKwkiJXMgY3VyX3BvYyAlZFxuIiwgX19mdW5jX18sIGN1cl9wb2MpOyAqLworCWlmIChwaWNfbGlzdF9kZWJ1ZyAmIDB4MikgeworCQlwcl9lcnIoImN1ciBwb2MgJWRcbiIsIGN1cl9wb2MpOworCX0KKwlmb3IgKGlpID0gMDsgaWkgPCBNQVhfUkVGX1BJQ19OVU07IGlpKyspIHsKKwkJcGljID0gaGV2Yy0+bV9QSUNbaWldOworCQlpZiAocGljID09IE5VTEwgfHwKKwkJCXBpYy0+aW5kZXggPT0gLTEgfHwKKwkJCXBpYy0+QlVGX2luZGV4ID09IC0xCisJCQkpCisJCQljb250aW51ZTsKKworI2lmZGVmIFNVUFBPUlRfTE9OR19URVJNX1JQUworCQlwaWMtPmxvbmdfdGVybV9yZWYgPSAwOworI2VuZGlmCisJCWlmICgocGljLT5yZWZlcmVuY2VkID09IDAgfHwgcGljLT5QT0MgPT0gY3VyX3BvYykpCisJCQljb250aW51ZTsKKwkJaXNfcmVmZXJlbmNlZCA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCWludCBkZWx0OworI2lmZGVmIFNVUFBPUlRfTE9OR19URVJNX1JQUworCQkJaWYgKHBhcmFtcy0+cC5DVVJfUlBTW2ldID09IFJQU19FTkQpCisJCQkJYnJlYWs7CisjZWxzZQorCQkJaWYgKHBhcmFtcy0+cC5DVVJfUlBTW2ldICYgMHg4MDAwKQorCQkJCWJyZWFrOworI2VuZGlmCisJCQlkZWx0ID0KKwkJCQlwYXJhbXMtPnAuQ1VSX1JQU1tpXSAmCisJCQkJKCgxIDw8IChSUFNfVVNFRF9CSVQgLSAxKSkgLSAxKTsKKwkJCWlmIChwYXJhbXMtPnAuQ1VSX1JQU1tpXSAmICgxIDw8IChSUFNfVVNFRF9CSVQgLSAxKSkpIHsKKwkJCQlwb2NfdG1wID0KKwkJCQkJY3VyX3BvYyAtICgoMSA8PCAoUlBTX1VTRURfQklUIC0gMSkpIC0KKwkJCQkJCQkgICBkZWx0KTsKKwkJCX0gZWxzZQorCQkJCXBvY190bXAgPSBjdXJfcG9jICsgZGVsdDsKKwkJCWlmIChwb2NfdG1wID09IHBpYy0+UE9DKSB7CisjaWZkZWYgU1VQUE9SVF9MT05HX1RFUk1fUlBTCisJCQkJaWYgKHBhcmFtcy0+cC5DVVJfUlBTW2ldICYgKDEgPDwgKFJQU19MVF9CSVQpKSkKKwkJCQkJcGljLT5sb25nX3Rlcm1fcmVmID0gMTsKKwkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1JfTU9SRSkKKwkJCQkJaGV2Y19wcmludChoZXZjLCAwLCAiJWQ6IENVUl9SUFMgMHgleCwgTFQgJWRcbiIsCisJCQkJCQlpLCBwYXJhbXMtPnAuQ1VSX1JQU1tpXSwKKwkJCQkJCXBpYy0+bG9uZ190ZXJtX3JlZik7CisjZW5kaWYKKwkJCQlpc19yZWZlcmVuY2VkID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoaXNfcmVmZXJlbmNlZCA9PSAwKSB7CisJCQlwaWMtPnJlZmVyZW5jZWQgPSAwOworCQkJcHV0X212X2J1ZihoZXZjLCBwaWMpOworCQkJLyogaGV2Y19wcmludChoZXZjLCAwLAorCQkJInNldCBwb2MgJWQgcmVmZXJlbmNlIHRvIDBcbiIsIHBpYy0+UE9DKTsgKi8KKwkJCWlmIChwaWNfbGlzdF9kZWJ1ZyAmIDB4MikgeworCQkJCXByX2Vycigic2V0IHBvYyAlZCByZWZlcmVuY2UgdG8gMFxuIiwgcGljLT5QT0MpOworCQkJfQorCQl9CisJfQorCit9CisKK3N0YXRpYyB2b2lkIHNldF9yZWZfcGljX2xpc3Qoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywgdW5pb24gcGFyYW1fdSAqcGFyYW1zKQoreworCXN0cnVjdCBQSUNfcyAqcGljID0gaGV2Yy0+Y3VyX3BpYzsKKwlpbnQgaSwgcklkeDsKKwlpbnQgbnVtX25lZyA9IDA7CisJaW50IG51bV9wb3MgPSAwOworCWludCB0b3RhbF9udW07CisJaW50IG51bV9yZWZfaWR4X2wwX2FjdGl2ZSA9CisJCShwYXJhbXMtPnAubnVtX3JlZl9pZHhfbDBfYWN0aXZlID4KKwkJIE1BWF9SRUZfQUNUSVZFKSA/IE1BWF9SRUZfQUNUSVZFIDoKKwkJcGFyYW1zLT5wLm51bV9yZWZfaWR4X2wwX2FjdGl2ZTsKKwlpbnQgbnVtX3JlZl9pZHhfbDFfYWN0aXZlID0KKwkJKHBhcmFtcy0+cC5udW1fcmVmX2lkeF9sMV9hY3RpdmUgPgorCQkgTUFYX1JFRl9BQ1RJVkUpID8gTUFYX1JFRl9BQ1RJVkUgOgorCQlwYXJhbXMtPnAubnVtX3JlZl9pZHhfbDFfYWN0aXZlOworCisJaW50IFJlZlBpY1NldFN0Q3VycjBbMTZdOworCWludCBSZWZQaWNTZXRTdEN1cnIxWzE2XTsKKyNpZmRlZiBTVVBQT1JUX0xPTkdfVEVSTV9SUFMKKwlpbnQgbnVtX2x0ID0gMDsKKwlpbnQgUmVmUGljU2V0THRDdXJyWzE2XTsKKyNlbmRpZgorCVBSX0lOSVQoMTI4KTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCVJlZlBpY1NldFN0Q3VycjBbaV0gPSAwOworCQlSZWZQaWNTZXRTdEN1cnIxW2ldID0gMDsKKwkJcGljLT5tX2FpUmVmUE9DTGlzdDBbcGljLT5zbGljZV9pZHhdW2ldID0gMDsKKwkJcGljLT5tX2FpUmVmUE9DTGlzdDFbcGljLT5zbGljZV9pZHhdW2ldID0gMDsKKwl9CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyNpZmRlZiBTVVBQT1JUX0xPTkdfVEVSTV9SUFMKKwkJaWYgKHBhcmFtcy0+cC5DVVJfUlBTW2ldID09IFJQU19FTkQpCisJCQlicmVhazsKKyNlbHNlCisJCWlmIChwYXJhbXMtPnAuQ1VSX1JQU1tpXSAmIDB4ODAwMCkKKwkJCWJyZWFrOworI2VuZGlmCisJCWlmICgocGFyYW1zLT5wLkNVUl9SUFNbaV0gPj4gUlBTX1VTRURfQklUKSAmIDEpIHsKKwkJCWludCBkZWx0ID0KKwkJCQlwYXJhbXMtPnAuQ1VSX1JQU1tpXSAmCisJCQkJKCgxIDw8IChSUFNfVVNFRF9CSVQgLSAxKSkgLSAxKTsKKworCQkJaWYgKChwYXJhbXMtPnAuQ1VSX1JQU1tpXSA+PiAoUlBTX1VTRURfQklUIC0gMSkpICYgMSkgeworI2lmZGVmIFNVUFBPUlRfTE9OR19URVJNX1JQUworCQkJCWlmICgocGFyYW1zLT5wLkNVUl9SUFNbaV0gPj4gUlBTX0xUX0JJVCkgJiAxKSB7CisJCQkJCVJlZlBpY1NldEx0Q3VycltudW1fbHRdID0KKwkJCQkJCXBpYy0+UE9DIC0gKCgxIDw8IChSUFNfVVNFRF9CSVQgLSAxKSkgLQorCQkJCQkJCQkJZGVsdCk7CisJCQkJCW51bV9sdCsrOworCQkJCQljb250aW51ZTsKKwkJCQl9CisjZW5kaWYKKworCQkJCVJlZlBpY1NldFN0Q3VycjBbbnVtX25lZ10gPQorCQkJCQlwaWMtPlBPQyAtICgoMSA8PCAoUlBTX1VTRURfQklUIC0gMSkpIC0KKwkJCQkJCQkJZGVsdCk7CisJCQkJLyogaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSAqCSJSZWZQaWNTZXRTdEN1cnIwICV4ICV4ICV4XG4iLAorCQkJCSAqICAgUmVmUGljU2V0U3RDdXJyMFtudW1fbmVnXSwgcGljLT5QT0MsCisJCQkJICogICAoMHg4MDAtKHBhcmFtc1tpXSYweDdmZikpKTsKKwkJCQkgKi8KKwkJCQludW1fbmVnKys7CisJCQl9IGVsc2UgeworI2lmZGVmIFNVUFBPUlRfTE9OR19URVJNX1JQUworCQkJCWlmICgocGFyYW1zLT5wLkNVUl9SUFNbaV0gPj4gUlBTX0xUX0JJVCkgJiAxKSB7CisJCQkJCVJlZlBpY1NldEx0Q3VycltudW1fbHRdID0gcGljLT5QT0MgKyBkZWx0OworCQkJCQludW1fbHQrKzsKKwkJCQkJY29udGludWU7CisJCQkJfQorI2VuZGlmCisJCQkJUmVmUGljU2V0U3RDdXJyMVtudW1fcG9zXSA9IHBpYy0+UE9DICsgZGVsdDsKKwkJCQkvKiBoZXZjX3ByaW50KGhldmMsIDAsCisJCQkJICoJIlJlZlBpY1NldFN0Q3VycjEgJWRcbiIsCisJCQkJICogICBSZWZQaWNTZXRTdEN1cnIxW251bV9wb3NdKTsKKwkJCQkgKi8KKwkJCQludW1fcG9zKys7CisJCQl9CisJCX0KKwl9CisjaWZkZWYgU1VQUE9SVF9MT05HX1RFUk1fUlBTCisJdG90YWxfbnVtID0gbnVtX25lZyArIG51bV9wb3MgKyBudW1fbHQ7CisjZWxzZQorCXRvdGFsX251bSA9IG51bV9uZWcgKyBudW1fcG9zOworI2VuZGlmCisJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKSB7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJIiVzOiBjdXJwb2MgJWQgc2xpY2VfdHlwZSAlZCwgdG90YWwgJWQgIiwKKwkJIF9fZnVuY19fLCBwaWMtPlBPQywgcGFyYW1zLT5wLnNsaWNlX3R5cGUsIHRvdGFsX251bSk7CisjaWZkZWYgU1VQUE9SVF9MT05HX1RFUk1fUlBTCisJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLAorCQkJIm51bV9uZWcgJWQgbnVtX2x0ICVkIG51bV9saXN0MCAlZCBudW1fbGlzdDEgJWRcbiIsCisJCSBudW1fbmVnLCBudW1fbHQsIG51bV9yZWZfaWR4X2wwX2FjdGl2ZSwgbnVtX3JlZl9pZHhfbDFfYWN0aXZlKTsKKyNlbHNlCisJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLAorCQkJIm51bV9uZWcgJWQgbnVtX2xpc3QwICVkIG51bV9saXN0MSAlZFxuIiwKKwkJIG51bV9uZWcsIG51bV9yZWZfaWR4X2wwX2FjdGl2ZSwgbnVtX3JlZl9pZHhfbDFfYWN0aXZlKTsKKyNlbmRpZgorCisJfQorCisJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKSB7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJIkhFVkMgU3RyZWFtIGJ1ZiBzdGFydCAiKTsKKwkJaGV2Y19wcmludF9jb250KGhldmMsIDAsCisJCSIleCBlbmQgJXggd3IgJXggcmQgJXggbGV2ICV4IGN0bCAleCBpbnRjdGwgJXhcbiIsCisJCSBSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fU1RBUlRfQUREUiksCisJCSBSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fRU5EX0FERFIpLAorCQkgUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1dSX1BUUiksCisJCSBSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSKSwKKwkJIFJFQURfVlJFRyhIRVZDX1NUUkVBTV9MRVZFTCksCisJCSBSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fRklGT19DVEwpLAorCQkgUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0lOVF9DT05UUk9MKSk7CisJfQorCisJaWYgKHRvdGFsX251bSA+IDApIHsKKwkJaWYgKHBhcmFtcy0+cC5tb2RpZmljYXRpb25fZmxhZyAmIDB4MSkgeworCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKQorCQkJCWhldmNfcHJpbnQoaGV2YywgMCwgInJlZjAgUE9DIChtb2RpZmljYXRpb24pOiIpOworCQkJZm9yIChySWR4ID0gMDsgcklkeCA8IG51bV9yZWZfaWR4X2wwX2FjdGl2ZTsgcklkeCsrKSB7CisJCQkJaW50IGNJZHggPSBwYXJhbXMtPnAubW9kaWZpY2F0aW9uX2xpc3RbcklkeF07CisKKwkJCQlwaWMtPm1fYWlSZWZQT0NMaXN0MFtwaWMtPnNsaWNlX2lkeF1bcklkeF0gPQorI2lmZGVmIFNVUFBPUlRfTE9OR19URVJNX1JQUworCQkJCQljSWR4ID49IChudW1fbmVnICsgbnVtX3BvcykgPworCQkJCQkJUmVmUGljU2V0THRDdXJyW2NJZHggLSBudW1fbmVnIC0gbnVtX3Bvc10gOgorI2VuZGlmCisJCQkJCShjSWR4ID49CisJCQkJCW51bV9uZWcgPyBSZWZQaWNTZXRTdEN1cnIxW2NJZHggLQorCQkJCQludW1fbmVnXSA6CisJCQkJCVJlZlBpY1NldFN0Q3VycjBbY0lkeF0pOworCQkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikgeworCQkJCQlQUl9GSUxMKCIlZCAiLAorCQkJCQkJICAgcGljLT5tX2FpUmVmUE9DTGlzdDBbcGljLT4KKwkJCQkJCSAgIHNsaWNlX2lkeF0KKwkJCQkJCSAgIFtySWR4XSk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKQorCQkJCWhldmNfcHJpbnQoaGV2YywgMCwgInJlZjAgUE9DOiIpOworCQkJZm9yIChySWR4ID0gMDsgcklkeCA8IG51bV9yZWZfaWR4X2wwX2FjdGl2ZTsgcklkeCsrKSB7CisJCQkJaW50IGNJZHggPSBySWR4ICUgdG90YWxfbnVtOworCisJCQkJcGljLT5tX2FpUmVmUE9DTGlzdDBbcGljLT5zbGljZV9pZHhdW3JJZHhdID0KKyNpZmRlZiBTVVBQT1JUX0xPTkdfVEVSTV9SUFMKKwkJCQkJY0lkeCA+PSAobnVtX25lZyArIG51bV9wb3MpID8KKwkJCQkJCVJlZlBpY1NldEx0Q3VycltjSWR4IC0gbnVtX25lZyAtIG51bV9wb3NdIDoKKyNlbmRpZgorCQkJCQkoY0lkeCA+PQorCQkJCQludW1fbmVnID8gUmVmUGljU2V0U3RDdXJyMVtjSWR4IC0KKwkJCQkJbnVtX25lZ10gOgorCQkJCQlSZWZQaWNTZXRTdEN1cnIwW2NJZHhdKTsKKwkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1IpIHsKKwkJCQkJUFJfRklMTCgiJWQgIiwKKwkJCQkJCSAgIHBpYy0+bV9haVJlZlBPQ0xpc3QwW3BpYy0+CisJCQkJCQkgICBzbGljZV9pZHhdCisJCQkJCQkgICBbcklkeF0pOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1IpCisJCQlQUl9JTkZPKGhldmMtPmluZGV4KTsKKwkJaWYgKHBhcmFtcy0+cC5zbGljZV90eXBlID09IEJfU0xJQ0UpIHsKKwkJCWlmIChwYXJhbXMtPnAubW9kaWZpY2F0aW9uX2ZsYWcgJiAweDIpIHsKKwkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1IpCisJCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJCSJyZWYxIFBPQyAobW9kaWZpY2F0aW9uKToiKTsKKwkJCQlmb3IgKHJJZHggPSAwOyBySWR4IDwgbnVtX3JlZl9pZHhfbDFfYWN0aXZlOworCQkJCQkgcklkeCsrKSB7CisJCQkJCWludCBjSWR4OworCisJCQkJCWlmIChwYXJhbXMtPnAubW9kaWZpY2F0aW9uX2ZsYWcgJiAweDEpIHsKKwkJCQkJCWNJZHggPQorCQkJCQkJCXBhcmFtcy0+cC4KKwkJCQkJCQltb2RpZmljYXRpb25fbGlzdAorCQkJCQkJCVtudW1fcmVmX2lkeF9sMF9hY3RpdmUgKworCQkJCQkJCSBySWR4XTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWNJZHggPQorCQkJCQkJCXBhcmFtcy0+cC4KKwkJCQkJCQltb2RpZmljYXRpb25fbGlzdFtySWR4XTsKKwkJCQkJfQorCQkJCQlwaWMtPm1fYWlSZWZQT0NMaXN0MVtwaWMtPgorCQkJCQkJc2xpY2VfaWR4XVtySWR4XSA9CisjaWZkZWYgU1VQUE9SVF9MT05HX1RFUk1fUlBTCisJCQkJCWNJZHggPj0gKG51bV9uZWcgKyBudW1fcG9zKSA/CisJCQkJCQlSZWZQaWNTZXRMdEN1cnJbY0lkeCAtIG51bV9uZWcgLSBudW1fcG9zXSA6CisjZW5kaWYKKwkJCQkJCShjSWR4ID49CisJCQkJCQludW1fcG9zID8KKwkJCQkJCVJlZlBpY1NldFN0Q3VycjBbY0lkeCAtCW51bV9wb3NdCisJCQkJCQk6IFJlZlBpY1NldFN0Q3VycjFbY0lkeF0pOworCQkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYKKwkJCQkJCUgyNjVfREVCVUdfQlVGTUdSKSB7CisJCQkJCQlQUl9GSUxMKCIlZCAiLAorCQkJCQkJCSAgIHBpYy0+CisJCQkJCQkJICAgbV9haVJlZlBPQ0xpc3QxW3BpYy0+CisJCQkJCQkJICAgc2xpY2VfaWR4XQorCQkJCQkJCSAgIFtySWR4XSk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJgorCQkJCQlIMjY1X0RFQlVHX0JVRk1HUikKKwkJCQkJaGV2Y19wcmludChoZXZjLCAwLCAicmVmMSBQT0M6Iik7CisJCQkJZm9yIChySWR4ID0gMDsgcklkeCA8IG51bV9yZWZfaWR4X2wxX2FjdGl2ZTsKKwkJCQkJIHJJZHgrKykgeworCQkJCQlpbnQgY0lkeCA9IHJJZHggJSB0b3RhbF9udW07CisKKwkJCQkJcGljLT5tX2FpUmVmUE9DTGlzdDFbcGljLT4KKwkJCQkJCXNsaWNlX2lkeF1bcklkeF0gPQorI2lmZGVmIFNVUFBPUlRfTE9OR19URVJNX1JQUworCQkJCQljSWR4ID49IChudW1fbmVnICsgbnVtX3BvcykgPworCQkJCQkJUmVmUGljU2V0THRDdXJyW2NJZHggLSBudW1fbmVnIC0gbnVtX3Bvc10gOgorI2VuZGlmCisJCQkJCQkoY0lkeCA+PQorCQkJCQkJbnVtX3BvcyA/CisJCQkJCQlSZWZQaWNTZXRTdEN1cnIwW2NJZHggLQorCQkJCQkJbnVtX3Bvc10KKwkJCQkJCTogUmVmUGljU2V0U3RDdXJyMVtjSWR4XSk7CisJCQkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJgorCQkJCQkJSDI2NV9ERUJVR19CVUZNR1IpIHsKKwkJCQkJCVBSX0ZJTEwoIiVkICIsCisJCQkJCQkJICAgcGljLT4KKwkJCQkJCQkgICBtX2FpUmVmUE9DTGlzdDFbcGljLT4KKwkJCQkJCQkgICBzbGljZV9pZHhdCisJCQkJCQkJICAgW3JJZHhdKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikKKwkJCQlQUl9JTkZPKGhldmMtPmluZGV4KTsKKwkJfQorCX0KKwkvKnNldCBtX1BJQyAqLworCXBpYy0+c2xpY2VfdHlwZSA9IChwYXJhbXMtPnAuc2xpY2VfdHlwZSA9PSBJX1NMSUNFKSA/IDIgOgorCQkocGFyYW1zLT5wLnNsaWNlX3R5cGUgPT0gUF9TTElDRSkgPyAxIDoKKwkJKHBhcmFtcy0+cC5zbGljZV90eXBlID09IEJfU0xJQ0UpID8gMCA6IDM7CisJcGljLT5SZWZOdW1fTDAgPSBudW1fcmVmX2lkeF9sMF9hY3RpdmU7CisJcGljLT5SZWZOdW1fTDEgPSBudW1fcmVmX2lkeF9sMV9hY3RpdmU7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV90aWxlX2luZm8oc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywgaW50IHBpY193aWR0aF9jdSwKKwkJaW50IHBpY19oZWlnaHRfY3UsIGludCBzYW9fbWVtX3VuaXQsCisJCXVuaW9uIHBhcmFtX3UgKnBhcmFtcykKK3sKKwlpbnQgaSwgajsKKwlpbnQgc3RhcnRfY3VfeCwgc3RhcnRfY3VfeTsKKwlpbnQgc2FvX3ZiX3NpemUgPSAoc2FvX21lbV91bml0ICsgKDIgPDwgNCkpICogcGljX2hlaWdodF9jdTsKKwlpbnQgc2FvX2Fidl9zaXplID0gc2FvX21lbV91bml0ICogcGljX3dpZHRoX2N1OworCVBSX0lOSVQoMTI4KTsKKyNpZmRlZiBERVRSRUZJTExfRU5BQkxFCisJaWYgKGhldmMtPmlzX3N3YXAgJiYgZ2V0X2NwdV9tYWpvcl9pZCgpIDw9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWE0pIHsKKwkJaW50IHRtcFJlZmlsbExjdVNpemUgPSAxIDw8CisJCQkocGFyYW1zLT5wLmxvZzJfbWluX2NvZGluZ19ibG9ja19zaXplX21pbnVzMyArCisJCQkzICsgcGFyYW1zLT5wLmxvZzJfZGlmZl9tYXhfbWluX2NvZGluZ19ibG9ja19zaXplKTsKKwkJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX0JVRk1HUl9NT1JFLAorCQkJIiV4LCAleCwgJXgsICV4XG4iLAorCQkJcGFyYW1zLT5wLnNsaWNlX3NlZ21lbnRfYWRkcmVzcywKKwkJCXBhcmFtcy0+cC5iaXRfZGVwdGgsCisJCQlwYXJhbXMtPnAudGlsZXNfZW5hYmxlZF9mbGFnLAorCQkJdG1wUmVmaWxsTGN1U2l6ZSk7CisJCWlmIChwYXJhbXMtPnAuc2xpY2Vfc2VnbWVudF9hZGRyZXNzID09IDAgJiYKKwkJCXBhcmFtcy0+cC5iaXRfZGVwdGggIT0gMCAmJgorCQkJKHBhcmFtcy0+cC50aWxlc19lbmFibGVkX2ZsYWcgJiAxKSAmJgorCQkJdG1wUmVmaWxsTGN1U2l6ZSA9PSA2NCkKKwkJCWhldmMtPmRlbHJlZmlsbF9jaGVjayA9IDE7CisJCWVsc2UKKwkJCWhldmMtPmRlbHJlZmlsbF9jaGVjayA9IDA7CisJfQorI2VuZGlmCisKKwloZXZjLT50aWxlX2VuYWJsZWQgPSBwYXJhbXMtPnAudGlsZXNfZW5hYmxlZF9mbGFnICYgMTsKKwlpZiAocGFyYW1zLT5wLnRpbGVzX2VuYWJsZWRfZmxhZyAmIDEpIHsKKwkJaGV2Yy0+bnVtX3RpbGVfY29sID0gcGFyYW1zLT5wLm51bV90aWxlX2NvbHVtbnNfbWludXMxICsgMTsKKwkJaGV2Yy0+bnVtX3RpbGVfcm93ID0gcGFyYW1zLT5wLm51bV90aWxlX3Jvd3NfbWludXMxICsgMTsKKworCQlpZiAoaGV2Yy0+bnVtX3RpbGVfcm93ID4gTUFYX1RJTEVfUk9XX05VTQorCQkJfHwgaGV2Yy0+bnVtX3RpbGVfcm93IDw9IDApIHsKKwkJCWhldmMtPm51bV90aWxlX3JvdyA9IDE7CisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJIiVzOiBudW1fdGlsZV9yb3dzX21pbnVzMSAoJWQpIGVycm9yISFcbiIsCisJCQkJICAgX19mdW5jX18sIHBhcmFtcy0+cC5udW1fdGlsZV9yb3dzX21pbnVzMSk7CisJCX0KKwkJaWYgKGhldmMtPm51bV90aWxlX2NvbCA+IE1BWF9USUxFX0NPTF9OVU0KKwkJCXx8IGhldmMtPm51bV90aWxlX2NvbCA8PSAwKSB7CisJCQloZXZjLT5udW1fdGlsZV9jb2wgPSAxOworCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSIlczogbnVtX3RpbGVfY29sdW1uc19taW51czEgKCVkKSBlcnJvciEhXG4iLAorCQkJCSAgIF9fZnVuY19fLCBwYXJhbXMtPnAubnVtX3RpbGVfY29sdW1uc19taW51czEpOworCQl9CisJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikgeworCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJIiVzIHBpY193X2N1ICVkIHBpY19oX2N1ICVkIHRpbGVfZW5hYmxlZCAiLAorCQkJIF9fZnVuY19fLCBwaWNfd2lkdGhfY3UsIHBpY19oZWlnaHRfY3UpOworCQkJaGV2Y19wcmludF9jb250KGhldmMsIDAsCisJCQkJIm51bV90aWxlX2NvbCAlZCBudW1fdGlsZV9yb3cgJWQ6XG4iLAorCQkJIGhldmMtPm51bV90aWxlX2NvbCwgaGV2Yy0+bnVtX3RpbGVfcm93KTsKKwkJfQorCisJCWlmIChwYXJhbXMtPnAudGlsZXNfZW5hYmxlZF9mbGFnICYgMikgewkvKiB1bmlmb3JtIGZsYWcgKi8KKwkJCWludCB3ID0gcGljX3dpZHRoX2N1IC8gaGV2Yy0+bnVtX3RpbGVfY29sOworCQkJaW50IGggPSBwaWNfaGVpZ2h0X2N1IC8gaGV2Yy0+bnVtX3RpbGVfcm93OworCisJCQlzdGFydF9jdV95ID0gMDsKKwkJCWZvciAoaSA9IDA7IGkgPCBoZXZjLT5udW1fdGlsZV9yb3c7IGkrKykgeworCQkJCXN0YXJ0X2N1X3ggPSAwOworCQkJCWZvciAoaiA9IDA7IGogPCBoZXZjLT5udW1fdGlsZV9jb2w7IGorKykgeworCQkJCQlpZiAoaiA9PSAoaGV2Yy0+bnVtX3RpbGVfY29sIC0gMSkpIHsKKwkJCQkJCWhldmMtPm1fdGlsZVtpXVtqXS53aWR0aCA9CisJCQkJCQkJcGljX3dpZHRoX2N1IC0KKwkJCQkJCQlzdGFydF9jdV94OworCQkJCQl9IGVsc2UKKwkJCQkJCWhldmMtPm1fdGlsZVtpXVtqXS53aWR0aCA9IHc7CisJCQkJCWlmIChpID09IChoZXZjLT5udW1fdGlsZV9yb3cgLSAxKSkgeworCQkJCQkJaGV2Yy0+bV90aWxlW2ldW2pdLmhlaWdodCA9CisJCQkJCQkJcGljX2hlaWdodF9jdSAtCisJCQkJCQkJc3RhcnRfY3VfeTsKKwkJCQkJfSBlbHNlCisJCQkJCQloZXZjLT5tX3RpbGVbaV1bal0uaGVpZ2h0ID0gaDsKKwkJCQkJaGV2Yy0+bV90aWxlW2ldW2pdLnN0YXJ0X2N1X3gKKwkJCQkJICAgID0gc3RhcnRfY3VfeDsKKwkJCQkJaGV2Yy0+bV90aWxlW2ldW2pdLnN0YXJ0X2N1X3kKKwkJCQkJICAgID0gc3RhcnRfY3VfeTsKKwkJCQkJaGV2Yy0+bV90aWxlW2ldW2pdLnNhb192Yl9zdGFydF9hZGRyID0KKwkJCQkJCWhldmMtPndvcmtfc3BhY2VfYnVmLT5zYW9fdmIuCisJCQkJCQlidWZfc3RhcnQgKyBqICogc2FvX3ZiX3NpemU7CisJCQkJCWhldmMtPm1fdGlsZVtpXVtqXS5zYW9fYWJ2X3N0YXJ0X2FkZHIgPQorCQkJCQkJaGV2Yy0+d29ya19zcGFjZV9idWYtPnNhb19hYnYuCisJCQkJCQlidWZfc3RhcnQgKyBpICogc2FvX2Fidl9zaXplOworCQkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYKKwkJCQkJCUgyNjVfREVCVUdfQlVGTUdSKSB7CisJCQkJCQlQUl9GSUxMKAorCQkJCQkJInt5PSVkLCB4PSVkIHcgJWQgaCAlZCAiLAorCQkJCQkJIGksIGosIGhldmMtPm1fdGlsZVtpXVtqXS53aWR0aCwKKwkJCQkJCSBoZXZjLT5tX3RpbGVbaV1bal0uaGVpZ2h0KTsKKwkJCQkJCVBSX0ZJTEwoCisJCQkJCQkic3RhcnRfeCAlZCBzdGFydF95ICVkICIsCisJCQkJCQkgaGV2Yy0+bV90aWxlW2ldW2pdLnN0YXJ0X2N1X3gsCisJCQkJCQkgaGV2Yy0+bV90aWxlW2ldW2pdLnN0YXJ0X2N1X3kpOworCQkJCQkJUFJfRklMTCgKKwkJCQkJCSJzYW9fdmJfc3RhcnQgMHgleCAiLAorCQkJCQkJIGhldmMtPm1fdGlsZVtpXVtqXS4KKwkJCQkJCSBzYW9fdmJfc3RhcnRfYWRkcik7CisJCQkJCQlQUl9GSUxMKAorCQkJCQkJInNhb19hYnZfc3RhcnQgMHgleH1cbiIsCisJCQkJCQkgaGV2Yy0+bV90aWxlW2ldW2pdLgorCQkJCQkJIHNhb19hYnZfc3RhcnRfYWRkcik7CisJCQkJCQlQUl9JTkZPKGhldmMtPmluZGV4KTsKKwkJCQkJfQorCQkJCQlzdGFydF9jdV94ICs9IGhldmMtPm1fdGlsZVtpXVtqXS53aWR0aDsKKworCQkJCX0KKwkJCQlzdGFydF9jdV95ICs9IGhldmMtPm1fdGlsZVtpXVswXS5oZWlnaHQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzdGFydF9jdV95ID0gMDsKKwkJCWZvciAoaSA9IDA7IGkgPCBoZXZjLT5udW1fdGlsZV9yb3c7IGkrKykgeworCQkJCXN0YXJ0X2N1X3ggPSAwOworCQkJCWZvciAoaiA9IDA7IGogPCBoZXZjLT5udW1fdGlsZV9jb2w7IGorKykgeworCQkJCQlpZiAoaiA9PSAoaGV2Yy0+bnVtX3RpbGVfY29sIC0gMSkpIHsKKwkJCQkJCWhldmMtPm1fdGlsZVtpXVtqXS53aWR0aCA9CisJCQkJCQkJcGljX3dpZHRoX2N1IC0KKwkJCQkJCQlzdGFydF9jdV94OworCQkJCQl9IGVsc2UgeworCQkJCQkJaGV2Yy0+bV90aWxlW2ldW2pdLndpZHRoID0KKwkJCQkJCQlwYXJhbXMtPnAudGlsZV93aWR0aFtqXTsKKwkJCQkJfQorCQkJCQlpZiAoaSA9PSAoaGV2Yy0+bnVtX3RpbGVfcm93IC0gMSkpIHsKKwkJCQkJCWhldmMtPm1fdGlsZVtpXVtqXS5oZWlnaHQgPQorCQkJCQkJCXBpY19oZWlnaHRfY3UgLQorCQkJCQkJCXN0YXJ0X2N1X3k7CisJCQkJCX0gZWxzZSB7CisJCQkJCQloZXZjLT5tX3RpbGVbaV1bal0uaGVpZ2h0ID0KKwkJCQkJCQlwYXJhbXMtPgorCQkJCQkJCXAudGlsZV9oZWlnaHRbaV07CisJCQkJCX0KKwkJCQkJaGV2Yy0+bV90aWxlW2ldW2pdLnN0YXJ0X2N1X3gKKwkJCQkJICAgID0gc3RhcnRfY3VfeDsKKwkJCQkJaGV2Yy0+bV90aWxlW2ldW2pdLnN0YXJ0X2N1X3kKKwkJCQkJICAgID0gc3RhcnRfY3VfeTsKKwkJCQkJaGV2Yy0+bV90aWxlW2ldW2pdLnNhb192Yl9zdGFydF9hZGRyID0KKwkJCQkJCWhldmMtPndvcmtfc3BhY2VfYnVmLT5zYW9fdmIuCisJCQkJCQlidWZfc3RhcnQgKyBqICogc2FvX3ZiX3NpemU7CisJCQkJCWhldmMtPm1fdGlsZVtpXVtqXS5zYW9fYWJ2X3N0YXJ0X2FkZHIgPQorCQkJCQkJaGV2Yy0+d29ya19zcGFjZV9idWYtPnNhb19hYnYuCisJCQkJCQlidWZfc3RhcnQgKyBpICogc2FvX2Fidl9zaXplOworCQkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYKKwkJCQkJCUgyNjVfREVCVUdfQlVGTUdSKSB7CisJCQkJCQlQUl9GSUxMKAorCQkJCQkJInt5PSVkLCB4PSVkIHcgJWQgaCAlZCAiLAorCQkJCQkJIGksIGosIGhldmMtPm1fdGlsZVtpXVtqXS53aWR0aCwKKwkJCQkJCSBoZXZjLT5tX3RpbGVbaV1bal0uaGVpZ2h0KTsKKwkJCQkJCVBSX0ZJTEwoCisJCQkJCQkic3RhcnRfeCAlZCBzdGFydF95ICVkICIsCisJCQkJCQkgaGV2Yy0+bV90aWxlW2ldW2pdLnN0YXJ0X2N1X3gsCisJCQkJCQkgaGV2Yy0+bV90aWxlW2ldW2pdLnN0YXJ0X2N1X3kpOworCQkJCQkJUFJfRklMTCgKKwkJCQkJCSJzYW9fdmJfc3RhcnQgMHgleCAiLAorCQkJCQkJIGhldmMtPm1fdGlsZVtpXVtqXS4KKwkJCQkJCSBzYW9fdmJfc3RhcnRfYWRkcik7CisJCQkJCQlQUl9GSUxMKAorCQkJCQkJInNhb19hYnZfc3RhcnQgMHgleH1cbiIsCisJCQkJCQkgaGV2Yy0+bV90aWxlW2ldW2pdLgorCQkJCQkJIHNhb19hYnZfc3RhcnRfYWRkcik7CisJCQkJCQlQUl9JTkZPKGhldmMtPmluZGV4KTsKKwkJCQkJfQorCQkJCQlzdGFydF9jdV94ICs9IGhldmMtPm1fdGlsZVtpXVtqXS53aWR0aDsKKwkJCQl9CisJCQkJc3RhcnRfY3VfeSArPSBoZXZjLT5tX3RpbGVbaV1bMF0uaGVpZ2h0OworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaGV2Yy0+bnVtX3RpbGVfY29sID0gMTsKKwkJaGV2Yy0+bnVtX3RpbGVfcm93ID0gMTsKKwkJaGV2Yy0+bV90aWxlWzBdWzBdLndpZHRoID0gcGljX3dpZHRoX2N1OworCQloZXZjLT5tX3RpbGVbMF1bMF0uaGVpZ2h0ID0gcGljX2hlaWdodF9jdTsKKwkJaGV2Yy0+bV90aWxlWzBdWzBdLnN0YXJ0X2N1X3ggPSAwOworCQloZXZjLT5tX3RpbGVbMF1bMF0uc3RhcnRfY3VfeSA9IDA7CisJCWhldmMtPm1fdGlsZVswXVswXS5zYW9fdmJfc3RhcnRfYWRkciA9CisJCQloZXZjLT53b3JrX3NwYWNlX2J1Zi0+c2FvX3ZiLmJ1Zl9zdGFydDsKKwkJaGV2Yy0+bV90aWxlWzBdWzBdLnNhb19hYnZfc3RhcnRfYWRkciA9CisJCQloZXZjLT53b3JrX3NwYWNlX2J1Zi0+c2FvX2Fidi5idWZfc3RhcnQ7CisJfQorfQorCitzdGF0aWMgaW50IGdldF90aWxlX2luZGV4KHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsIGludCBjdV9hZHIsCisJCQkJCQkgIGludCBwaWNfd2lkdGhfbGN1KQoreworCWludCBjdV94OworCWludCBjdV95OworCWludCB0aWxlX3ggPSAwOworCWludCB0aWxlX3kgPSAwOworCWludCBpOworCisJaWYgKHBpY193aWR0aF9sY3UgPT0gMCkgeworCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpKSB7CisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiJXMgRXJyb3IsIHBpY193aWR0aF9sY3UgaXMgMCwgcGljX3cgJWQsIHBpY19oICVkXG4iLAorCQkJIF9fZnVuY19fLCBoZXZjLT5waWNfdywgaGV2Yy0+cGljX2gpOworCQl9CisJCXJldHVybiAtMTsKKwl9CisJY3VfeCA9IGN1X2FkciAlIHBpY193aWR0aF9sY3U7CisJY3VfeSA9IGN1X2FkciAvIHBpY193aWR0aF9sY3U7CisJaWYgKGhldmMtPnRpbGVfZW5hYmxlZCkgeworCQlmb3IgKGkgPSAwOyBpIDwgaGV2Yy0+bnVtX3RpbGVfY29sOyBpKyspIHsKKwkJCWlmIChjdV94ID49IGhldmMtPm1fdGlsZVswXVtpXS5zdGFydF9jdV94KQorCQkJCXRpbGVfeCA9IGk7CisJCQllbHNlCisJCQkJYnJlYWs7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IGhldmMtPm51bV90aWxlX3JvdzsgaSsrKSB7CisJCQlpZiAoY3VfeSA+PSBoZXZjLT5tX3RpbGVbaV1bMF0uc3RhcnRfY3VfeSkKKwkJCQl0aWxlX3kgPSBpOworCQkJZWxzZQorCQkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAodGlsZV94KSB8ICh0aWxlX3kgPDwgOCk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3NjcmF0Y2hfZXJyb3IoaW50IGVycm9yX251bSkKK3sKKyNpZiAwCisJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSkgeworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCSIgRVJST1IgOiBIRVZDX0FTU0lTVF9TQ1JBVENIX1RFU1QgRXJyb3IgOiAlZFxuIiwKKwkJCSAgIGVycm9yX251bSk7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGhldmNfY29uZmlnX3dvcmtfc3BhY2VfaHcoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwlzdHJ1Y3QgQnVmZkluZm9fcyAqYnVmX3NwZWMgPSBoZXZjLT53b3JrX3NwYWNlX2J1ZjsKKworCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykpCisJCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19CVUZNR1JfTU9SRSwKKwkJCSIlcyAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleFxuIiwKKwkJCV9fZnVuY19fLAorCQkJYnVmX3NwZWMtPmlwcC5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+c3RhcnRfYWRyLAorCQkJYnVmX3NwZWMtPnNob3J0X3Rlcm1fcnBzLmJ1Zl9zdGFydCwKKwkJCWJ1Zl9zcGVjLT52cHMuYnVmX3N0YXJ0LAorCQkJYnVmX3NwZWMtPnNwcy5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+cHBzLmJ1Zl9zdGFydCwKKwkJCWJ1Zl9zcGVjLT5zYW9fdXAuYnVmX3N0YXJ0LAorCQkJYnVmX3NwZWMtPnN3YXBfYnVmLmJ1Zl9zdGFydCwKKwkJCWJ1Zl9zcGVjLT5zd2FwX2J1ZjIuYnVmX3N0YXJ0LAorCQkJYnVmX3NwZWMtPnNjYWxlbHV0LmJ1Zl9zdGFydCwKKwkJCWJ1Zl9zcGVjLT5kYmxrX3BhcmEuYnVmX3N0YXJ0LAorCQkJYnVmX3NwZWMtPmRibGtfZGF0YS5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+ZGJsa19kYXRhMi5idWZfc3RhcnQpOworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX0xJTkVCVUZGX0JBU0UsIGJ1Zl9zcGVjLT5pcHAuYnVmX3N0YXJ0KTsKKwlpZiAoKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfU0VORF9QQVJBTV9XSVRIX1JFRykgPT0gMCkKKwkJV1JJVEVfVlJFRyhIRVZDX1JQTV9CVUZGRVIsICh1MzIpaGV2Yy0+cnBtX3BoeV9hZGRyKTsKKwlXUklURV9WUkVHKEhFVkNfU0hPUlRfVEVSTV9SUFMsIGJ1Zl9zcGVjLT5zaG9ydF90ZXJtX3Jwcy5idWZfc3RhcnQpOworCVdSSVRFX1ZSRUcoSEVWQ19WUFNfQlVGRkVSLCBidWZfc3BlYy0+dnBzLmJ1Zl9zdGFydCk7CisJV1JJVEVfVlJFRyhIRVZDX1NQU19CVUZGRVIsIGJ1Zl9zcGVjLT5zcHMuYnVmX3N0YXJ0KTsKKwlXUklURV9WUkVHKEhFVkNfUFBTX0JVRkZFUiwgYnVmX3NwZWMtPnBwcy5idWZfc3RhcnQpOworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fVVAsIGJ1Zl9zcGVjLT5zYW9fdXAuYnVmX3N0YXJ0KTsKKwlpZiAoaGV2Yy0+bW11X2VuYWJsZSkgeworCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKSB7CisJCQlXUklURV9WUkVHKEhFVkNfQVNTSVNUX01NVV9NQVBfQUREUiwgaGV2Yy0+ZnJhbWVfbW11X21hcF9waHlfYWRkcik7CisJCQloZXZjX3ByaW50KGhldmMsIEgyNjVfREVCVUdfQlVGTUdSX01PUkUsCisJCQkJIndyaXRlIEhFVkNfQVNTSVNUX01NVV9NQVBfQUREUlxuIik7CisJCX0gZWxzZQorCQkJV1JJVEVfVlJFRyhIMjY1X01NVV9NQVBfQlVGRkVSLCBoZXZjLT5mcmFtZV9tbXVfbWFwX3BoeV9hZGRyKTsKKwl9IC8qZWxzZQorCQlXUklURV9WUkVHKEhFVkNfU1RSRUFNX1NXQVBfQlVGRkVSLAorCQkJCWJ1Zl9zcGVjLT5zd2FwX2J1Zi5idWZfc3RhcnQpOworCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fU1dBUF9CVUZGRVIyLCBidWZfc3BlYy0+c3dhcF9idWYyLmJ1Zl9zdGFydCk7Ki8KKwlXUklURV9WUkVHKEhFVkNfU0NBTEVMVVQsIGJ1Zl9zcGVjLT5zY2FsZWx1dC5idWZfc3RhcnQpOworI2lmZGVmIEhFVkNfOEtfTEZUT0ZGU0VUX0ZJWAorCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkgeworCQlpZiAoYnVmX3NwZWMtPm1heF93aWR0aCA8PSA0MDk2ICYmIGJ1Zl9zcGVjLT5tYXhfaGVpZ2h0IDw9IDIzMDQpCisJCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkczLCAweDQwMTApOworCQllbHNlCisJCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkczLCAweDgwMjApOworCQkvL1dSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGRzMsIDB4ODA4MDIwKTsgLypvZmZzZXQgc2hvdWxkIHgyIGlmIDhrKi8KKwkJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX0JVRk1HUl9NT1JFLAorCQkJIndyaXRlIEhFVkNfREJMS19DRkczIHRvICV4XG4iLCBSRUFEX1ZSRUcoSEVWQ19EQkxLX0NGRzMpKTsKKwl9CisjZW5kaWYKKwkvKiBjZmdfcF9hZGRyICovCisJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHNCwgYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc3RhcnQpOworCS8qIGNmZ19kX2FkZHIgKi8KKwlXUklURV9WUkVHKEhFVkNfREJMS19DRkc1LCBidWZfc3BlYy0+ZGJsa19kYXRhLmJ1Zl9zdGFydCk7CisKKwlXUklURV9WUkVHKEhFVkNfREJMS19DRkdFLCBidWZfc3BlYy0+ZGJsa19kYXRhMi5idWZfc3RhcnQpOworCisJV1JJVEVfVlJFRyhMTUVNX0RVTVBfQURSLCAodTMyKWhldmMtPmxtZW1fcGh5X2FkZHIpOworfQorCitzdGF0aWMgdm9pZCBwYXJzZXJfY21kX3dyaXRlKHZvaWQpCit7CisJdTMyIGk7CisJY29uc3QgdW5zaWduZWQgc2hvcnQgcGFyc2VyX2NtZFtQQVJTRVJfQ01EX05VTUJFUl0gPSB7CisJCTB4MDQwMSwgMHg4NDAxLCAweDA4MDAsIDB4MDQwMiwgMHg5MDAyLCAweDE0MjMsCisJCTB4OENDMywgMHgxNDIzLCAweDg4MDQsIDB4OTgyNSwgMHgwODAwLCAweDA0RkUsCisJCTB4ODQwNiwgMHg4NDExLCAweDE4MDAsIDB4ODQwOCwgMHg4NDA5LCAweDhDMkEsCisJCTB4OUMyQiwgMHgxQzAwLCAweDg0MEYsIDB4ODQwNywgMHg4MDAwLCAweDg0MDgsCisJCTB4MjAwMCwgMHhBODAwLCAweDg0MTAsIDB4MDRERSwgMHg4NDBDLCAweDg0MEQsCisJCTB4QUMwMCwgMHhBMDAwLCAweDA4QzAsIDB4MDhFMCwgMHhBNDBFLCAweEZDMDAsCisJCTB4N0MwMAorCX07CisJZm9yIChpID0gMDsgaSA8IFBBUlNFUl9DTURfTlVNQkVSOyBpKyspCisJCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfQ01EX1dSSVRFLCBwYXJzZXJfY21kW2ldKTsKK30KKworc3RhdGljIHZvaWQgaGV2Y19pbml0X2RlY29kZXJfaHcoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwlpbnQgZGVjb2RlX3BpY19iZWdpbiwgaW50IGRlY29kZV9waWNfbnVtKQoreworCXVuc2lnbmVkIGludCBkYXRhMzI7CisJaW50IGk7CisjaWYgMAorCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpIHsKKwkJLyogU2V0IE1DUiBmZXRjaCBwcmlvcml0aWVzKi8KKwkJZGF0YTMyID0gMHgxIHwgKDB4MSA8PCAyKSB8ICgweDEgPDwzKSB8CisJCQkoMjQgPDwgNCkgfCAoMzIgPDwgMTEpIHwgKDI0IDw8IDE4KSB8ICgzMiA8PCAyNSk7CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9BWElVUkdfQ1RMLCBkYXRhMzIpOworCX0KKyNlbmRpZgorI2lmIDEKKwkvKiBtOGJhYnkgdGVzdDE5MDIgKi8KKwlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1IpCisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSIlc1xuIiwgX19mdW5jX18pOworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BBUlNFUl9WRVJTSU9OKTsKKwlpZiAoZGF0YTMyICE9IDB4MDAwMTAwMDEpIHsKKwkJcHJpbnRfc2NyYXRjaF9lcnJvcigyNSk7CisJCXJldHVybjsKKwl9CisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9WRVJTSU9OLCAweDVhNWE1NWFhKTsKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfVkVSU0lPTik7CisJaWYgKGRhdGEzMiAhPSAweDVhNWE1NWFhKSB7CisJCXByaW50X3NjcmF0Y2hfZXJyb3IoMjYpOworCQlyZXR1cm47CisJfQorI2lmIDAKKwkvKiB0ZXN0IFBhcnNlciBSZXNldCAqLworCS8qIHJlc2V0IGlxaXQgdG8gc3RhcnQgbWVtIGluaXQgYWdhaW4gKi8KKwlXUklURV9WUkVHKERPU19TV19SRVNFVDMsICgxIDw8IDE0KSB8CisJCQkgICAoMSA8PCAzKQkvKiByZXNldF93aG9sZSBwYXJzZXIgKi8KKwkJCSAgKTsKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDMsIDApOwkvKiBjbGVhciByZXNldF93aG9sZSBwYXJzZXIgKi8KKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfVkVSU0lPTik7CisJaWYgKGRhdGEzMiAhPSAweDAwMDEwMDAxKQorCQloZXZjX3ByaW50KGhldmMsIDAsCisJCSJUZXN0IFBhcnNlciBGYXRhbCBFcnJvclxuIik7CisjZW5kaWYKKwkvKiByZXNldCBpcWl0IHRvIHN0YXJ0IG1lbSBpbml0IGFnYWluICovCisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQzLCAoMSA8PCAxNCkKKwkJCSAgKTsKKwlDTEVBUl9WUkVHX01BU0soSEVWQ19DQUJBQ19DT05UUk9MLCAxKTsKKwlDTEVBUl9WUkVHX01BU0soSEVWQ19QQVJTRVJfQ09SRV9DT05UUk9MLCAxKTsKKworI2VuZGlmCisJaWYgKCFoZXZjLT5tX2luc19mbGFnKSB7CisJCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NUUkVBTV9DT05UUk9MKTsKKwkJZGF0YTMyID0gZGF0YTMyIHwgKDEgPDwgMCk7ICAgICAgLyogc3RyZWFtX2ZldGNoX2VuYWJsZSAqLworCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKQorCQkJZGF0YTMyIHw9ICgweGYgPDwgMjUpOyAvKmFyd2xlbl9heGlfbWF4Ki8KKwkJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9DT05UUk9MLCBkYXRhMzIpOworCX0KKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9TVEFSVENPREUpOworCWlmIChkYXRhMzIgIT0gMHgwMDAwMDEwMCkgeworCQlwcmludF9zY3JhdGNoX2Vycm9yKDI5KTsKKwkJcmV0dXJuOworCX0KKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9FTVVMQVRFQ09ERSk7CisJaWYgKGRhdGEzMiAhPSAweDAwMDAwMzAwKSB7CisJCXByaW50X3NjcmF0Y2hfZXJyb3IoMzApOworCQlyZXR1cm47CisJfQorCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9TVEFSVENPREUsIDB4MTIzNDU2NzgpOworCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9FTVVMQVRFQ09ERSwgMHg5YWJjZGVmMCk7CisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0hJRlRfU1RBUlRDT0RFKTsKKwlpZiAoZGF0YTMyICE9IDB4MTIzNDU2NzgpIHsKKwkJcHJpbnRfc2NyYXRjaF9lcnJvcigzMSk7CisJCXJldHVybjsKKwl9CisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0hJRlRfRU1VTEFURUNPREUpOworCWlmIChkYXRhMzIgIT0gMHg5YWJjZGVmMCkgeworCQlwcmludF9zY3JhdGNoX2Vycm9yKDMyKTsKKwkJcmV0dXJuOworCX0KKwlXUklURV9WUkVHKEhFVkNfU0hJRlRfU1RBUlRDT0RFLCAweDAwMDAwMTAwKTsKKwlXUklURV9WUkVHKEhFVkNfU0hJRlRfRU1VTEFURUNPREUsIDB4MDAwMDAzMDApOworCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0lOVF9DT05UUk9MKTsKKwlkYXRhMzIgJj0gMHgwM2ZmZmZmZjsKKwlkYXRhMzIgPSBkYXRhMzIgfCAoMyA8PCAyOSkgfCAoMiA8PCAyNikgfCAoMSA8PCAyNCkKKwkJCSB8CS8qIHN0cmVhbV9idWZmZXJfZW1wdHlfaW50X2FtcmlzY19lbmFibGUgKi8KKwkJCSAoMSA8PCAyMikgfAkvKiBzdHJlYW1fZmlmb19lbXB0eV9pbnRfYW1yaXNjX2VuYWJsZSovCisJCQkgKDEgPDwgNykgfAkvKiBkZWNfZG9uZV9pbnRfY3B1X2VuYWJsZSAqLworCQkJICgxIDw8IDQpIHwJLyogc3RhcnRjb2RlX2ZvdW5kX2ludF9jcHVfZW5hYmxlICovCisJCQkgKDAgPDwgMykgfAkvKiBzdGFydGNvZGVfZm91bmRfaW50X2FtcmlzY19lbmFibGUgKi8KKwkJCSAoMSA8PCAwKQkvKiBwYXJzZXJfaW50X2VuYWJsZSAqLworCQkJIDsKKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0lOVF9DT05UUk9MLCBkYXRhMzIpOworCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0hJRlRfU1RBVFVTKTsKKwlkYXRhMzIgPSBkYXRhMzIgfCAoMSA8PCAxKSB8CS8qIGVtdWxhdGlvbl9jaGVja19vbiAqLworCQkJICgxIDw8IDApCQkvKiBzdGFydGNvZGVfY2hlY2tfb24gKi8KKwkJCSA7CisJV1JJVEVfVlJFRyhIRVZDX1NISUZUX1NUQVRVUywgZGF0YTMyKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9DT05UUk9MLCAoMyA8PCA2KSB8Lyogc2Z0X3ZhbGlkX3dyX3Bvc2l0aW9uICovCisJCQkgICAoMiA8PCA0KSB8CS8qIGVtdWxhdGVfY29kZV9sZW5ndGhfc3ViXzEgKi8KKwkJCSAgICgyIDw8IDEpIHwJLyogc3RhcnRfY29kZV9sZW5ndGhfc3ViXzEgKi8KKwkJCSAgICgxIDw8IDApCS8qIHN0cmVhbV9zaGlmdF9lbmFibGUgKi8KKwkJCSAgKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19DQUJBQ19DT05UUk9MLCAoMSA8PCAwKQkvKiBjYWJhY19lbmFibGUgKi8KKwkJCSAgKTsKKwkvKiBoZXZjX3BhcnNlcl9jb3JlX2Nsa19lbiAqLworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfQ09SRV9DT05UUk9MLCAoMSA8PCAwKQorCQkJICApOworCisJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCAwKTsKKworCS8qIEluaXRpYWwgSVFJVF9TQ0FMRUxVVCBtZW1vcnkgLS0ganVzdCB0byBhdm9pZCBYIGluIHNpbXVsYXRpb24gKi8KKwlpZiAoaXNfcmRtYV9lbmFibGUoKSkKKwkJcmRtYV9iYWNrX2VuZF93b3JrKGhldmMtPnJkbWFfcGh5X2FkciwgUkRNQV9TSVpFKTsKKwllbHNlIHsKKwkJV1JJVEVfVlJFRyhIRVZDX0lRSVRfU0NBTEVMVVRfV1JfQUREUiwgMCk7LypjZmdfcF9hZGRyKi8KKwkJZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKwkJCVdSSVRFX1ZSRUcoSEVWQ19JUUlUX1NDQUxFTFVUX0RBVEEsIDApOworCX0KKworI2lmZGVmIEVOQUJMRV9TV0FQX1RFU1QKKwlXUklURV9WUkVHKEhFVkNfU1RSRUFNX1NXQVBfVEVTVCwgMTAwKTsKKyNlbmRpZgorCisJLypXUklURV9WUkVHKEhFVkNfREVDT0RFX1BJQ19CRUdJTl9SRUcsIDApOyovCisJLypXUklURV9WUkVHKEhFVkNfREVDT0RFX1BJQ19OVU1fUkVHLCAweGZmZmZmZmZmKTsqLworCVdSSVRFX1ZSRUcoSEVWQ19ERUNPREVfU0laRSwgMCk7CisJLypXUklURV9WUkVHKEhFVkNfREVDT0RFX0NPVU5ULCAwKTsqLworCS8qIFNlbmQgcGFyc2VyX2NtZCAqLworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfQ01EX1dSSVRFLCAoMSA8PCAxNikgfCAoMCA8PCAwKSk7CisKKwlwYXJzZXJfY21kX3dyaXRlKCk7CisKKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0NNRF9TS0lQXzAsIFBBUlNFUl9DTURfU0tJUF9DRkdfMCk7CisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9DTURfU0tJUF8xLCBQQVJTRVJfQ01EX1NLSVBfQ0ZHXzEpOworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfQ01EX1NLSVBfMiwgUEFSU0VSX0NNRF9TS0lQX0NGR18yKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfSUZfQ09OVFJPTCwKKwkJCSAgIC8qICgxIDw8IDgpIHwgLy8gc2FvX3N3X3ByZWRfZW5hYmxlICovCisJCQkgICAoMSA8PCA1KSB8CS8qIHBhcnNlcl9zYW9faWZfZW4gKi8KKwkJCSAgICgxIDw8IDIpIHwJLyogcGFyc2VyX21wcmVkX2lmX2VuICovCisJCQkgICAoMSA8PCAwKQkvKiBwYXJzZXJfc2NhbGVyX2lmX2VuICovCisJCQkgICk7CisKKwkvKiBDaGFuZ2VkIHRvIFN0YXJ0IE1QUkVEIGluIG1pY3JvY29kZSAqLworCS8qCisJICogICBoZXZjX3ByaW50KGhldmMsIDAsICJbdGVzdC5jXSBTdGFydCBNUFJFRFxuIik7CisJICogICBXUklURV9WUkVHKEhFVkNfTVBSRURfSU5UX1NUQVRVUywKKwkgKiAgICgxPDwzMSkKKwkgKiAgICk7CisJICovCisKKwlXUklURV9WUkVHKEhFVkNEX0lQUF9UT1BfQ05UTCwgKDAgPDwgMSkgfAkvKiBlbmFibGUgaXBwICovCisJCQkgICAoMSA8PCAwKQkvKiBzb2Z0d2FyZSByZXNldCBpcHAgYW5kIG1wcCAqLworCQkJICApOworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX1RPUF9DTlRMLCAoMSA8PCAxKSB8CS8qIGVuYWJsZSBpcHAgKi8KKwkJCSAgICgwIDw8IDApCS8qIHNvZnR3YXJlIHJlc2V0IGlwcCBhbmQgbXBwICovCisJCQkgICk7CisKKwlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGhldmMpICYgMHgxMCkKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDEsCisJCQkweDEgPDwgMzEgIC8qL0VuYWJsZSBOVjIxIHJlZmVyZW5jZSByZWFkIG1vZGUgZm9yIE1DKi8KKwkJCSk7CisKK30KKworc3RhdGljIHZvaWQgZGVjb2Rlcl9od19yZXNldCh2b2lkKQoreworCWludCBpOworCXVuc2lnbmVkIGludCBkYXRhMzI7CisKKwkvKiByZXNldCBpcWl0IHRvIHN0YXJ0IG1lbSBpbml0IGFnYWluICovCisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQzLCAoMSA8PCAxNCkKKwkJCSAgKTsKKwlDTEVBUl9WUkVHX01BU0soSEVWQ19DQUJBQ19DT05UUk9MLCAxKTsKKwlDTEVBUl9WUkVHX01BU0soSEVWQ19QQVJTRVJfQ09SRV9DT05UUk9MLCAxKTsKKworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NUUkVBTV9DT05UUk9MKTsKKwlkYXRhMzIgPSBkYXRhMzIgfCAoMSA8PCAwKQkvKiBzdHJlYW1fZmV0Y2hfZW5hYmxlICovCisJCQkgOworCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fQ09OVFJPTCwgZGF0YTMyKTsKKworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NISUZUX1NUQVJUQ09ERSk7CisJaWYgKGRhdGEzMiAhPSAweDAwMDAwMTAwKSB7CisJCXByaW50X3NjcmF0Y2hfZXJyb3IoMjkpOworCQlyZXR1cm47CisJfQorCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NISUZUX0VNVUxBVEVDT0RFKTsKKwlpZiAoZGF0YTMyICE9IDB4MDAwMDAzMDApIHsKKwkJcHJpbnRfc2NyYXRjaF9lcnJvcigzMCk7CisJCXJldHVybjsKKwl9CisJV1JJVEVfVlJFRyhIRVZDX1NISUZUX1NUQVJUQ09ERSwgMHgxMjM0NTY3OCk7CisJV1JJVEVfVlJFRyhIRVZDX1NISUZUX0VNVUxBVEVDT0RFLCAweDlhYmNkZWYwKTsKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9TVEFSVENPREUpOworCWlmIChkYXRhMzIgIT0gMHgxMjM0NTY3OCkgeworCQlwcmludF9zY3JhdGNoX2Vycm9yKDMxKTsKKwkJcmV0dXJuOworCX0KKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9FTVVMQVRFQ09ERSk7CisJaWYgKGRhdGEzMiAhPSAweDlhYmNkZWYwKSB7CisJCXByaW50X3NjcmF0Y2hfZXJyb3IoMzIpOworCQlyZXR1cm47CisJfQorCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9TVEFSVENPREUsIDB4MDAwMDAxMDApOworCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9FTVVMQVRFQ09ERSwgMHgwMDAwMDMwMCk7CisKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfSU5UX0NPTlRST0wpOworCWRhdGEzMiAmPSAweDAzZmZmZmZmOworCWRhdGEzMiA9IGRhdGEzMiB8ICgzIDw8IDI5KSB8ICgyIDw8IDI2KSB8ICgxIDw8IDI0KQorCQkJIHwJLyogc3RyZWFtX2J1ZmZlcl9lbXB0eV9pbnRfYW1yaXNjX2VuYWJsZSAqLworCQkJICgxIDw8IDIyKSB8CS8qc3RyZWFtX2ZpZm9fZW1wdHlfaW50X2FtcmlzY19lbmFibGUgKi8KKwkJCSAoMSA8PCA3KSB8CS8qIGRlY19kb25lX2ludF9jcHVfZW5hYmxlICovCisJCQkgKDEgPDwgNCkgfAkvKiBzdGFydGNvZGVfZm91bmRfaW50X2NwdV9lbmFibGUgKi8KKwkJCSAoMCA8PCAzKSB8CS8qIHN0YXJ0Y29kZV9mb3VuZF9pbnRfYW1yaXNjX2VuYWJsZSAqLworCQkJICgxIDw8IDApCS8qIHBhcnNlcl9pbnRfZW5hYmxlICovCisJCQkgOworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfSU5UX0NPTlRST0wsIGRhdGEzMik7CisKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9TVEFUVVMpOworCWRhdGEzMiA9IGRhdGEzMiB8ICgxIDw8IDEpIHwJLyogZW11bGF0aW9uX2NoZWNrX29uICovCisJCQkgKDEgPDwgMCkJCS8qIHN0YXJ0Y29kZV9jaGVja19vbiAqLworCQkJIDsKKwlXUklURV9WUkVHKEhFVkNfU0hJRlRfU1RBVFVTLCBkYXRhMzIpOworCisJV1JJVEVfVlJFRyhIRVZDX1NISUZUX0NPTlRST0wsICgzIDw8IDYpIHwvKiBzZnRfdmFsaWRfd3JfcG9zaXRpb24gKi8KKwkJCSAgICgyIDw8IDQpIHwJLyogZW11bGF0ZV9jb2RlX2xlbmd0aF9zdWJfMSAqLworCQkJICAgKDIgPDwgMSkgfAkvKiBzdGFydF9jb2RlX2xlbmd0aF9zdWJfMSAqLworCQkJICAgKDEgPDwgMCkJLyogc3RyZWFtX3NoaWZ0X2VuYWJsZSAqLworCQkJICApOworCisJV1JJVEVfVlJFRyhIRVZDX0NBQkFDX0NPTlRST0wsICgxIDw8IDApCS8qIGNhYmFjX2VuYWJsZSAqLworCQkJICApOworCS8qIGhldmNfcGFyc2VyX2NvcmVfY2xrX2VuICovCisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9DT1JFX0NPTlRST0wsICgxIDw8IDApCisJCQkgICk7CisKKwkvKiBJbml0aWFsIElRSVRfU0NBTEVMVVQgbWVtb3J5IC0tIGp1c3QgdG8gYXZvaWQgWCBpbiBzaW11bGF0aW9uICovCisJV1JJVEVfVlJFRyhIRVZDX0lRSVRfU0NBTEVMVVRfV1JfQUREUiwgMCk7CS8qIGNmZ19wX2FkZHIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorCQlXUklURV9WUkVHKEhFVkNfSVFJVF9TQ0FMRUxVVF9EQVRBLCAwKTsKKworCS8qIFNlbmQgcGFyc2VyX2NtZCAqLworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfQ01EX1dSSVRFLCAoMSA8PCAxNikgfCAoMCA8PCAwKSk7CisKKwlwYXJzZXJfY21kX3dyaXRlKCk7CisKKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0NNRF9TS0lQXzAsIFBBUlNFUl9DTURfU0tJUF9DRkdfMCk7CisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9DTURfU0tJUF8xLCBQQVJTRVJfQ01EX1NLSVBfQ0ZHXzEpOworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfQ01EX1NLSVBfMiwgUEFSU0VSX0NNRF9TS0lQX0NGR18yKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfSUZfQ09OVFJPTCwKKwkJCSAgIC8qICgxIDw8IDgpIHwgLy8gc2FvX3N3X3ByZWRfZW5hYmxlICovCisJCQkgICAoMSA8PCA1KSB8CS8qIHBhcnNlcl9zYW9faWZfZW4gKi8KKwkJCSAgICgxIDw8IDIpIHwJLyogcGFyc2VyX21wcmVkX2lmX2VuICovCisJCQkgICAoMSA8PCAwKQkvKiBwYXJzZXJfc2NhbGVyX2lmX2VuICovCisJCQkgICk7CisKKwlXUklURV9WUkVHKEhFVkNEX0lQUF9UT1BfQ05UTCwgKDAgPDwgMSkgfAkvKiBlbmFibGUgaXBwICovCisJCQkgICAoMSA8PCAwKQkvKiBzb2Z0d2FyZSByZXNldCBpcHAgYW5kIG1wcCAqLworCQkJICApOworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX1RPUF9DTlRMLCAoMSA8PCAxKSB8CS8qIGVuYWJsZSBpcHAgKi8KKwkJCSAgICgwIDw8IDApCS8qIHNvZnR3YXJlIHJlc2V0IGlwcCBhbmQgbXBwICovCisJCQkgICk7Cit9CisKKyNpZmRlZiBDT05GSUdfSEVWQ19DTEtfRk9SQ0VEX09OCitzdGF0aWMgdm9pZCBjb25maWdfaGV2Y19jbGtfZm9yY2VkX29uKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHJkYXRhMzI7CisJLyogSVFJVCAqLworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19JUUlUX0NMS19SU1RfQ1RSTCk7CisJV1JJVEVfVlJFRyhIRVZDX0lRSVRfQ0xLX1JTVF9DVFJMLCByZGF0YTMyIHwgKDB4MSA8PCAyKSk7CisKKwkvKiBEQkxLICovCisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX0RCTEtfQ0ZHMCk7CisJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHMCwgcmRhdGEzMiB8ICgweDEgPDwgMikpOworCisJLyogU0FPICovCisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMMSk7CisJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMMSwgcmRhdGEzMiB8ICgweDEgPDwgMikpOworCisJLyogTVBSRUQgKi8KKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfTVBSRURfQ1RSTDEpOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9DVFJMMSwgcmRhdGEzMiB8ICgweDEgPDwgMjQpKTsKKworCS8qIFBBUlNFUiAqLworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fQ09OVFJPTCk7CisJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9DT05UUk9MLCByZGF0YTMyIHwgKDB4MSA8PCAxNSkpOworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9DT05UUk9MKTsKKwlXUklURV9WUkVHKEhFVkNfU0hJRlRfQ09OVFJPTCwgcmRhdGEzMiB8ICgweDEgPDwgMTUpKTsKKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfQ0FCQUNfQ09OVFJPTCk7CisJV1JJVEVfVlJFRyhIRVZDX0NBQkFDX0NPTlRST0wsIHJkYXRhMzIgfCAoMHgxIDw8IDEzKSk7CisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BBUlNFUl9DT1JFX0NPTlRST0wpOworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfQ09SRV9DT05UUk9MLCByZGF0YTMyIHwgKDB4MSA8PCAxNSkpOworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfSU5UX0NPTlRST0wpOworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfSU5UX0NPTlRST0wsIHJkYXRhMzIgfCAoMHgxIDw8IDE1KSk7CisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BBUlNFUl9JRl9DT05UUk9MKTsKKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0lGX0NPTlRST0wsCisJCQkgICByZGF0YTMyIHwgKDB4MyA8PCA1KSB8ICgweDMgPDwgMikgfCAoMHgzIDw8IDApKTsKKworCS8qIElQUCAqLworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ0RfSVBQX0RZTkNMS0dBVEVfQ09ORklHKTsKKwlXUklURV9WUkVHKEhFVkNEX0lQUF9EWU5DTEtHQVRFX0NPTkZJRywgcmRhdGEzMiB8IDB4ZmZmZmZmZmYpOworCisJLyogTUNSQ0MgKi8KKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNEX01DUkNDX0NUTDEpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMSwgcmRhdGEzMiB8ICgweDEgPDwgMykpOworfQorI2VuZGlmCisKKyNpZmRlZiBNQ1JDQ19FTkFCTEUKK3N0YXRpYyB2b2lkIGNvbmZpZ19tY3JjY19heGlfaHcoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywgaW50IHNsaWNlX3R5cGUpCit7CisJdW5zaWduZWQgaW50IHJkYXRhMzI7CisJdW5zaWduZWQgaW50IHJkYXRhMzJfMjsKKwlpbnQgbDBfY250ID0gMDsKKwlpbnQgbDFfY250ID0gMHg3ZmZmOworCisJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShoZXZjKSAmIDB4MTApIHsKKwkJbDBfY250ID0gaGV2Yy0+Y3VyX3BpYy0+UmVmTnVtX0wwOworCQlsMV9jbnQgPSBoZXZjLT5jdXJfcGljLT5SZWZOdW1fTDE7CisJfQorCisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwxLCAweDIpOwkvKiByZXNldCBtY3JjYyAqLworCisJaWYgKHNsaWNlX3R5cGUgPT0gMikgewkvKiBJLVBJQyAqLworCQkvKiByZW1vdmUgcmVzZXQgLS0gZGlzYWJsZXMgY2xvY2sgKi8KKwkJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwxLCAweDApOworCQlyZXR1cm47CisJfQorCisJaWYgKHNsaWNlX3R5cGUgPT0gMCkgewkvKiBCLVBJQyAqLworCQkvKiBQcm9ncmFtbWUgY2FudmFzMCAqLworCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0FDQ0NPTkZJR19BRERSLAorCQkJCSAgICgwIDw8IDgpIHwgKDAgPDwgMSkgfCAwKTsKKwkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIpOworCQlyZGF0YTMyID0gcmRhdGEzMiAmIDB4ZmZmZjsKKwkJcmRhdGEzMiA9IHJkYXRhMzIgfCAocmRhdGEzMiA8PCAxNik7CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMiwgcmRhdGEzMik7CisKKwkJLyogUHJvZ3JhbW1lIGNhbnZhczEgKi8KKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwKKwkJCQkgICAoMTYgPDwgOCkgfCAoMSA8PCAxKSB8IDApOworCQlyZGF0YTMyXzIgPSBSRUFEX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSKTsKKwkJcmRhdGEzMl8yID0gcmRhdGEzMl8yICYgMHhmZmZmOworCQlyZGF0YTMyXzIgPSByZGF0YTMyXzIgfCAocmRhdGEzMl8yIDw8IDE2KTsKKwkJaWYgKHJkYXRhMzIgPT0gcmRhdGEzMl8yICYmIGwxX2NudCA+IDEpIHsKKwkJCXJkYXRhMzJfMiA9IFJFQURfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIpOworCQkJcmRhdGEzMl8yID0gcmRhdGEzMl8yICYgMHhmZmZmOworCQkJcmRhdGEzMl8yID0gcmRhdGEzMl8yIHwgKHJkYXRhMzJfMiA8PCAxNik7CisJCX0KKwkJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwzLCByZGF0YTMyXzIpOworCX0gZWxzZSB7CQkvKiBQLVBJQyAqLworCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0FDQ0NPTkZJR19BRERSLAorCQkJCSAgICgwIDw8IDgpIHwgKDEgPDwgMSkgfCAwKTsKKwkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIpOworCQlyZGF0YTMyID0gcmRhdGEzMiAmIDB4ZmZmZjsKKwkJcmRhdGEzMiA9IHJkYXRhMzIgfCAocmRhdGEzMiA8PCAxNik7CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMiwgcmRhdGEzMik7CisKKwkJaWYgKGwwX2NudCA9PSAxKSB7CisJCQlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDMsIHJkYXRhMzIpOworCQl9IGVsc2UgeworCQkJLyogUHJvZ3JhbW1lIGNhbnZhczEgKi8KKwkJCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSKTsKKwkJCXJkYXRhMzIgPSByZGF0YTMyICYgMHhmZmZmOworCQkJcmRhdGEzMiA9IHJkYXRhMzIgfCAocmRhdGEzMiA8PCAxNik7CisJCQlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDMsIHJkYXRhMzIpOworCQl9CisJfQorCS8qIGVuYWJsZSBtY3JjYyBwcm9ncmVzc2l2ZS1tb2RlICovCisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwxLCAweGZmMCk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgY29uZmlnX3RpdGxlX2h3KHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsIGludCBzYW9fdmJfc2l6ZSwKKwkJCQkJCQlpbnQgc2FvX21lbV91bml0KQoreworCVdSSVRFX1ZSRUcoSEVWQ19zYW9fbWVtX3VuaXQsIHNhb19tZW1fdW5pdCk7CisJV1JJVEVfVlJFRyhIRVZDX1NBT19BQlYsIGhldmMtPndvcmtfc3BhY2VfYnVmLT5zYW9fYWJ2LmJ1Zl9zdGFydCk7CisJV1JJVEVfVlJFRyhIRVZDX3Nhb192Yl9zaXplLCBzYW9fdmJfc2l6ZSk7CisJV1JJVEVfVlJFRyhIRVZDX1NBT19WQiwgaGV2Yy0+d29ya19zcGFjZV9idWYtPnNhb192Yi5idWZfc3RhcnQpOworfQorCitzdGF0aWMgdTMyIGluaXRfYXV4X3NpemU7CitzdGF0aWMgaW50IGF1eF9kYXRhX2lzX2F2YWlibGUoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwl1MzIgcmVnX3ZhbDsKKworCXJlZ192YWwgPSBSRUFEX1ZSRUcoSEVWQ19BVVhfREFUQV9TSVpFKTsKKwlpZiAocmVnX3ZhbCAhPSAwICYmIHJlZ192YWwgIT0gaW5pdF9hdXhfc2l6ZSkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY29uZmlnX2F1eF9idWYoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwlXUklURV9WUkVHKEhFVkNfQVVYX0FEUiwgaGV2Yy0+YXV4X3BoeV9hZGRyKTsKKwlpbml0X2F1eF9zaXplID0gKChoZXZjLT5wcmVmaXhfYXV4X3NpemUgPj4gNCkgPDwgMTYpIHwKKwkJKGhldmMtPnN1ZmZpeF9hdXhfc2l6ZSA+PiA0KTsKKwlXUklURV9WUkVHKEhFVkNfQVVYX0RBVEFfU0laRSwgaW5pdF9hdXhfc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19tcHJlZF9odyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWludCBpOworCXVuc2lnbmVkIGludCBkYXRhMzI7CisJc3RydWN0IFBJQ19zICpjdXJfcGljID0gaGV2Yy0+Y3VyX3BpYzsKKwlzdHJ1Y3QgUElDX3MgKmNvbF9waWMgPSBoZXZjLT5jb2xfcGljOworCWludCBBTVZQX01BWF9OVU1fQ0FORFNfTUVNID0gMzsKKwlpbnQgQU1WUF9NQVhfTlVNX0NBTkRTID0gMjsKKwlpbnQgTlVNX0NIUk9NQV9NT0RFID0gNTsKKwlpbnQgRE1fQ0hST01BX0lEWCA9IDM2OworCWludCBhYm92ZV9wdHJfY3RybCA9IDA7CisJaW50IGJ1ZmZlcl9saW5lYXIgPSAxOworCWludCBjdV9zaXplX2xvZzIgPSAzOworCisJaW50IG1wcmVkX212X3JkX3N0YXJ0X2FkZHI7CisJaW50IG1wcmVkX2N1cnJfbGN1X3g7CisJaW50IG1wcmVkX2N1cnJfbGN1X3k7CisJaW50IG1wcmVkX2Fib3ZlX2J1Zl9zdGFydDsKKwlpbnQgbXByZWRfbXZfcmRfcHRyOworCWludCBtcHJlZF9tdl9yZF9wdHJfcDE7CisJaW50IG1wcmVkX212X3JkX2VuZF9hZGRyOworCWludCBNVl9NRU1fVU5JVDsKKwlpbnQgbXByZWRfbXZfd3JfcHRyOworCWludCAqcmVmX3BvY19MMCwgKnJlZl9wb2NfTDE7CisKKwlpbnQgYWJvdmVfZW47CisJaW50IG12X3dyX2VuOworCWludCBtdl9yZF9lbjsKKwlpbnQgY29sX2lzSW50cmE7CisKKwlpZiAoaGV2Yy0+c2xpY2VfdHlwZSAhPSAyKSB7CisJCWFib3ZlX2VuID0gMTsKKwkJbXZfd3JfZW4gPSAxOworCQltdl9yZF9lbiA9IDE7CisJCWNvbF9pc0ludHJhID0gMDsKKwl9IGVsc2UgeworCQlhYm92ZV9lbiA9IDE7CisJCW12X3dyX2VuID0gMTsKKwkJbXZfcmRfZW4gPSAwOworCQljb2xfaXNJbnRyYSA9IDA7CisJfQorCisJbXByZWRfbXZfcmRfc3RhcnRfYWRkciA9IGNvbF9waWMtPm1wcmVkX212X3dyX3N0YXJ0X2FkZHI7CisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfTVBSRURfQ1VSUl9MQ1UpOworCW1wcmVkX2N1cnJfbGN1X3ggPSBkYXRhMzIgJiAweGZmZmY7CisJbXByZWRfY3Vycl9sY3VfeSA9IChkYXRhMzIgPj4gMTYpICYgMHhmZmZmOworCisJTVZfTUVNX1VOSVQgPQorCQloZXZjLT5sY3Vfc2l6ZV9sb2cyID09IDYgPyAweDIwMCA6IGhldmMtPmxjdV9zaXplX2xvZzIgPT0KKwkJNSA/IDB4ODAgOiAweDIwOworCW1wcmVkX212X3JkX3B0ciA9CisJCW1wcmVkX212X3JkX3N0YXJ0X2FkZHIgKyAoaGV2Yy0+c2xpY2VfYWRkciAqIE1WX01FTV9VTklUKTsKKworCW1wcmVkX212X3JkX3B0cl9wMSA9IG1wcmVkX212X3JkX3B0ciArIE1WX01FTV9VTklUOworCW1wcmVkX212X3JkX2VuZF9hZGRyID0KKwkJbXByZWRfbXZfcmRfc3RhcnRfYWRkciArCisJCWNvbF9waWMtPm12X3NpemU7CisJCS8vKChoZXZjLT5sY3VfeF9udW0gKiBoZXZjLT5sY3VfeV9udW0pICogTVZfTUVNX1VOSVQpOworCisJbXByZWRfYWJvdmVfYnVmX3N0YXJ0ID0gaGV2Yy0+d29ya19zcGFjZV9idWYtPm1wcmVkX2Fib3ZlLmJ1Zl9zdGFydDsKKworCW1wcmVkX212X3dyX3B0ciA9CisJCWN1cl9waWMtPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIgKworCQkoaGV2Yy0+c2xpY2VfYWRkciAqIE1WX01FTV9VTklUKTsKKworCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikgeworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiY3VyIHBpYyBpbmRleCAlZCAgY29sIHBpYyBpbmRleCAlZFxuIiwgY3VyX3BpYy0+aW5kZXgsCisJCQljb2xfcGljLT5pbmRleCk7CisJfQorCisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX01WX1dSX1NUQVJUX0FERFIsCisJCQkgICBjdXJfcGljLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfUkRfU1RBUlRfQUREUiwgbXByZWRfbXZfcmRfc3RhcnRfYWRkcik7CisKKwlkYXRhMzIgPSAoKGhldmMtPmxjdV94X251bSAtIGhldmMtPnRpbGVfd2lkdGhfbGN1KSAqIE1WX01FTV9VTklUKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfV1JfUk9XX0pVTVAsIGRhdGEzMik7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX01WX1JEX1JPV19KVU1QLCBkYXRhMzIpOworCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfTVBSRURfQ1RSTDApOworCWRhdGEzMiA9ICgoaGV2Yy0+c2xpY2VfdHlwZSAmIDMpIHwKKwkJCSAgKGhldmMtPm5ld19waWMgJiAxKSA8PCAyIHwKKwkJCSAgKGhldmMtPm5ld190aWxlICYgMSkgPDwgMyB8CisJCQkgIChoZXZjLT5pc05leHRTbGljZVNlZ21lbnQgICYgMSk8PCA0IHwKKwkJCSAgKGhldmMtPlRNVlBGbGFnICAmIDEpPDwgNSB8CisJCQkgIChoZXZjLT5MRENGbGFnICYgMSkgPDwgNiB8CisJCQkgIChoZXZjLT5Db2xGcm9tTDBGbGFnICYgMSk8PCA3IHwKKwkJCSAgKGFib3ZlX3B0cl9jdHJsICYgMSk8PCA4IHwKKwkJCSAgKGFib3ZlX2VuICAmIDEpIDw8IDkgfAorCQkJICAobXZfd3JfZW4gJiAxKSA8PCAxMCB8CisJCQkgIChtdl9yZF9lbiAgJiAxKTw8IDExIHwKKwkJCSAgKGNvbF9pc0ludHJhICYgMSk8PCAxMiB8CisJCQkgIChidWZmZXJfbGluZWFyICYgMSk8PCAxMyB8CisJCQkgIChoZXZjLT5Mb25nVGVybV9DdXJyICYgMSkgPDwgMTQgfAorCQkJICAoaGV2Yy0+TG9uZ1Rlcm1fQ29sICYgMSkgPDwgMTUgfAorCQkJICAoaGV2Yy0+bGN1X3NpemVfbG9nMiAmIDB4ZikgPDwgMTYgfAorCQkJICAoY3Vfc2l6ZV9sb2cyICAmIDB4ZikgPDwgMjAgfCAoaGV2Yy0+cGxldmVsICYgMHg3KSA8PCAyNCk7CisJZGF0YTMyICY9ICB+KDE8PCAyOCk7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0NUUkwwLCBkYXRhMzIpOworCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfTVBSRURfQ1RSTDEpOworCWRhdGEzMiA9ICgKKyNpZiAwCisJCQkvKiBubyBzZXQgaW4gbThiYWJ5IHRlc3QxOTAyICovCisJCQkvKiBEb24ndCBvdmVycmlkZSBjbGtfZm9yY2VkX29uICwgKi8KKwkJCShkYXRhMzIgJiAoMHgxIDw8IDI0KSkgfAorI2VuZGlmCisJCQkJIGhldmMtPk1heE51bU1lcmdlQ2FuZCB8CisJCQkJIEFNVlBfTUFYX05VTV9DQU5EUyA8PCA0IHwKKwkJCQkgQU1WUF9NQVhfTlVNX0NBTkRTX01FTSA8PCA4IHwKKwkJCQkgTlVNX0NIUk9NQV9NT0RFIDw8IDEyIHwgRE1fQ0hST01BX0lEWCA8PCAxNik7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0NUUkwxLCBkYXRhMzIpOworCisJZGF0YTMyID0gKGhldmMtPnBpY193IHwgaGV2Yy0+cGljX2ggPDwgMTYpOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9QSUNfU0laRSwgZGF0YTMyKTsKKworCWRhdGEzMiA9ICgoaGV2Yy0+bGN1X3hfbnVtIC0gMSkgfCAoaGV2Yy0+bGN1X3lfbnVtIC0gMSkgPDwgMTYpOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9QSUNfU0laRV9MQ1UsIGRhdGEzMik7CisKKwlkYXRhMzIgPSAoaGV2Yy0+dGlsZV9zdGFydF9sY3VfeCB8IGhldmMtPnRpbGVfc3RhcnRfbGN1X3kgPDwgMTYpOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9USUxFX1NUQVJULCBkYXRhMzIpOworCisJZGF0YTMyID0gKGhldmMtPnRpbGVfd2lkdGhfbGN1IHwgaGV2Yy0+dGlsZV9oZWlnaHRfbGN1IDw8IDE2KTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfVElMRV9TSVpFX0xDVSwgZGF0YTMyKTsKKworCWRhdGEzMiA9IChoZXZjLT5SZWZOdW1fTDAgfCBoZXZjLT5SZWZOdW1fTDEgPDwgOCB8IDAKKwkJCSAgLyogY29sX1JlZk51bV9MMDw8MTZ8ICovCisJCQkgIC8qIGNvbF9SZWZOdW1fTDE8PDI0ICovCisJCQkgKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfUkVGX05VTSwgZGF0YTMyKTsKKworI2lmZGVmIFNVUFBPUlRfTE9OR19URVJNX1JQUworCWRhdGEzMiA9IDA7CisJZm9yIChpID0gMDsgaSA8IGhldmMtPlJlZk51bV9MMDsgaSsrKSB7CisJCWlmIChpc19yZWZfbG9uZ190ZXJtKGhldmMsCisJCQljdXJfcGljLT5tX2FpUmVmUE9DTGlzdDAKKwkJCQlbY3VyX3BpYy0+c2xpY2VfaWR4XVtpXSkpCisJCQlkYXRhMzIgPSBkYXRhMzIgfCAoMSA8PCBpKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGhldmMtPlJlZk51bV9MMTsgaSsrKSB7CisJCWlmIChpc19yZWZfbG9uZ190ZXJtKGhldmMsCisJCQljdXJfcGljLT5tX2FpUmVmUE9DTGlzdDEKKwkJCQlbY3VyX3BpYy0+c2xpY2VfaWR4XVtpXSkpCisJCQlkYXRhMzIgPSBkYXRhMzIgfCAoMSA8PCAoaSArIDE2KSk7CisJfQorCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikgeworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiTG9uZ1Rlcm1fUmVmIDB4JXhcbiIsIGRhdGEzMik7CisJfQorI2Vsc2UKKwlkYXRhMzIgPSBoZXZjLT5Mb25nVGVybV9SZWY7CisjZW5kaWYKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTFRfUkVGLCBkYXRhMzIpOworCisJZGF0YTMyID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgaGV2Yy0+UmVmTnVtX0wwOyBpKyspCisJCWRhdGEzMiA9IGRhdGEzMiB8ICgxIDw8IGkpOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9SRUZfRU5fTDAsIGRhdGEzMik7CisKKwlkYXRhMzIgPSAwOworCWZvciAoaSA9IDA7IGkgPCBoZXZjLT5SZWZOdW1fTDE7IGkrKykKKwkJZGF0YTMyID0gZGF0YTMyIHwgKDEgPDwgaSk7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX1JFRl9FTl9MMSwgZGF0YTMyKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9DVVJfUE9DLCBoZXZjLT5jdXJyX1BPQyk7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0NPTF9QT0MsIGhldmMtPkNvbF9QT0MpOworCisJLyogYmVsb3cgTVBSRUQgUmVmX1BPQ194eF9MeCByZWdpc3RlcnMgbXVzdCBmb2xsb3cgUmVmX1BPQ194eF9MMCAtPgorCSAqICAgUmVmX1BPQ194eF9MMSBpbiBwYWlyIHdyaXRlIG9yZGVyISEhCisJICovCisJcmVmX3BvY19MMCA9ICYoY3VyX3BpYy0+bV9haVJlZlBPQ0xpc3QwW2N1cl9waWMtPnNsaWNlX2lkeF1bMF0pOworCXJlZl9wb2NfTDEgPSAmKGN1cl9waWMtPm1fYWlSZWZQT0NMaXN0MVtjdXJfcGljLT5zbGljZV9pZHhdWzBdKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMF9SRUYwMF9QT0MsIHJlZl9wb2NfTDBbMF0pOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMV9SRUYwMF9QT0MsIHJlZl9wb2NfTDFbMF0pOworCisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wwX1JFRjAxX1BPQywgcmVmX3BvY19MMFsxXSk7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wxX1JFRjAxX1BPQywgcmVmX3BvY19MMVsxXSk7CisKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDBfUkVGMDJfUE9DLCByZWZfcG9jX0wwWzJdKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDFfUkVGMDJfUE9DLCByZWZfcG9jX0wxWzJdKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMF9SRUYwM19QT0MsIHJlZl9wb2NfTDBbM10pOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMV9SRUYwM19QT0MsIHJlZl9wb2NfTDFbM10pOworCisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wwX1JFRjA0X1BPQywgcmVmX3BvY19MMFs0XSk7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wxX1JFRjA0X1BPQywgcmVmX3BvY19MMVs0XSk7CisKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDBfUkVGMDVfUE9DLCByZWZfcG9jX0wwWzVdKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDFfUkVGMDVfUE9DLCByZWZfcG9jX0wxWzVdKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMF9SRUYwNl9QT0MsIHJlZl9wb2NfTDBbNl0pOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMV9SRUYwNl9QT0MsIHJlZl9wb2NfTDFbNl0pOworCisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wwX1JFRjA3X1BPQywgcmVmX3BvY19MMFs3XSk7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wxX1JFRjA3X1BPQywgcmVmX3BvY19MMVs3XSk7CisKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDBfUkVGMDhfUE9DLCByZWZfcG9jX0wwWzhdKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDFfUkVGMDhfUE9DLCByZWZfcG9jX0wxWzhdKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMF9SRUYwOV9QT0MsIHJlZl9wb2NfTDBbOV0pOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMV9SRUYwOV9QT0MsIHJlZl9wb2NfTDFbOV0pOworCisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wwX1JFRjEwX1BPQywgcmVmX3BvY19MMFsxMF0pOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMV9SRUYxMF9QT0MsIHJlZl9wb2NfTDFbMTBdKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMF9SRUYxMV9QT0MsIHJlZl9wb2NfTDBbMTFdKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDFfUkVGMTFfUE9DLCByZWZfcG9jX0wxWzExXSk7CisKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDBfUkVGMTJfUE9DLCByZWZfcG9jX0wwWzEyXSk7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wxX1JFRjEyX1BPQywgcmVmX3BvY19MMVsxMl0pOworCisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wwX1JFRjEzX1BPQywgcmVmX3BvY19MMFsxM10pOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMV9SRUYxM19QT0MsIHJlZl9wb2NfTDFbMTNdKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMF9SRUYxNF9QT0MsIHJlZl9wb2NfTDBbMTRdKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDFfUkVGMTRfUE9DLCByZWZfcG9jX0wxWzE0XSk7CisKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTDBfUkVGMTVfUE9DLCByZWZfcG9jX0wwWzE1XSk7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wxX1JFRjE1X1BPQywgcmVmX3BvY19MMVsxNV0pOworCisJaWYgKGhldmMtPm5ld19waWMpIHsKKwkJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0FCVl9TVEFSVF9BRERSLCBtcHJlZF9hYm92ZV9idWZfc3RhcnQpOworCQlXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfV1BUUiwgbXByZWRfbXZfd3JfcHRyKTsKKwkJLyogV1JJVEVfVlJFRyhIRVZDX01QUkVEX01WX1JQVFIsbXByZWRfbXZfcmRfcHRyKTsgKi8KKwkJV1JJVEVfVlJFRyhIRVZDX01QUkVEX01WX1JQVFIsIG1wcmVkX212X3JkX3N0YXJ0X2FkZHIpOworCX0gZWxzZSBpZiAoIWhldmMtPmlzTmV4dFNsaWNlU2VnbWVudCkgeworCQkvKiBXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfUlBUUixtcHJlZF9tdl9yZF9wdHJfcDEpOyAqLworCQlXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfUlBUUiwgbXByZWRfbXZfcmRfcHRyKTsKKwl9CisKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfUkRfRU5EX0FERFIsIG1wcmVkX212X3JkX2VuZF9hZGRyKTsKK30KKworc3RhdGljIHZvaWQgY29uZmlnX3Nhb19odyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLCB1bmlvbiBwYXJhbV91ICpwYXJhbXMpCit7CisJdW5zaWduZWQgaW50IGRhdGEzMiwgZGF0YTMyXzI7CisJaW50IG1pc2NfZmxhZzAgPSBoZXZjLT5taXNjX2ZsYWcwOworCWludCBzbGljZV9kZWJsb2NraW5nX2ZpbHRlcl9kaXNhYmxlZF9mbGFnID0gMDsKKworCWludCBtY19idWZmZXJfc2l6ZV91X3YgPQorCQloZXZjLT5sY3VfdG90YWwgKiBoZXZjLT5sY3Vfc2l6ZSAqIGhldmMtPmxjdV9zaXplIC8gMjsKKwlpbnQgbWNfYnVmZmVyX3NpemVfdV92X2ggPSAobWNfYnVmZmVyX3NpemVfdV92ICsgMHhmZmZmKSA+PiAxNjsKKwlzdHJ1Y3QgUElDX3MgKmN1cl9waWMgPSBoZXZjLT5jdXJfcGljOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqIHY0bDJfY3R4ID0gaGV2Yy0+djRsMl9jdHg7CisJUFJfSU5JVCgxMjgpOworCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkwwKTsKKwlkYXRhMzIgJj0gKH4weGYpOworCWRhdGEzMiB8PSBoZXZjLT5sY3Vfc2l6ZV9sb2cyOworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDAsIGRhdGEzMik7CisKKwlkYXRhMzIgPSAoaGV2Yy0+cGljX3cgfCBoZXZjLT5waWNfaCA8PCAxNik7CisJV1JJVEVfVlJFRyhIRVZDX1NBT19QSUNfU0laRSwgZGF0YTMyKTsKKworCWRhdGEzMiA9ICgoaGV2Yy0+bGN1X3hfbnVtIC0gMSkgfCAoaGV2Yy0+bGN1X3lfbnVtIC0gMSkgPDwgMTYpOworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fUElDX1NJWkVfTENVLCBkYXRhMzIpOworCisJaWYgKGhldmMtPm5ld19waWMpCisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fWV9TVEFSVF9BRERSLCAweGZmZmZmZmZmKTsKKyNpZmRlZiBMT1NMRVNTX0NPTVBSRVNTX01PREUKKy8qU1VQUE9SVF8xMEJJVCovCisJaWYgKChnZXRfZG91YmxlX3dyaXRlX21vZGUoaGV2YykgJiAweDEwKSA9PSAwKSB7CisJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3KQorCQkJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMMjYsIDApOworCisJCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMNSk7CisJCWRhdGEzMiAmPSAofigweGZmIDw8IDE2KSk7CisJCWlmICgoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGhldmMpID09IDgpIHx8CisJCQkoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGhldmMpID09IDkpKSB7CisJCQlkYXRhMzIgfD0gKDB4ZmYgPDwgMTYpOworCQkJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMNSwgZGF0YTMyKTsKKwkJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDI2LCAweGYpOworCQl9IGVsc2UgeworCQkJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShoZXZjKSA9PSAyIHx8CisJCQkJZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGhldmMpID09IDMpCisJCQkJZGF0YTMyIHw9ICgweGZmPDwxNik7CisJCQllbHNlIGlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUoaGV2YykgPT0gNCB8fAorCQkJCQlnZXRfZG91YmxlX3dyaXRlX21vZGUoaGV2YykgPT0gNSkKKwkJCQlkYXRhMzIgfD0gKDB4MzM8PDE2KTsKKworCQkJaWYgKGhldmMtPm1lbV9zYXZpbmdfbW9kZSA9PSAxKQorCQkJCWRhdGEzMiB8PSAoMSA8PCA5KTsKKwkJCWVsc2UKKwkJCQlkYXRhMzIgJj0gfigxIDw8IDkpOworCQkJaWYgKHdvcmthcm91bmRfZW5hYmxlICYgMSkKKwkJCQlkYXRhMzIgfD0gKDEgPDwgNyk7CisJCQlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw1LCBkYXRhMzIpOworCQl9CisJfQorCWRhdGEzMiA9IGN1cl9waWMtPm1jX3lfYWRyOworCWlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUoaGV2YykpCisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fWV9TVEFSVF9BRERSLCBjdXJfcGljLT5kd195X2Fkcik7CisKKwlpZiAoKGdldF9kb3VibGVfd3JpdGVfbW9kZShoZXZjKSAmIDB4MTApID09IDApCisJCVdSSVRFX1ZSRUcoSEVWQ19DTV9CT0RZX1NUQVJUX0FERFIsIGRhdGEzMik7CisKKwlpZiAoaGV2Yy0+bW11X2VuYWJsZSkKKwkJV1JJVEVfVlJFRyhIRVZDX0NNX0hFQURFUl9TVEFSVF9BRERSLCBjdXJfcGljLT5oZWFkZXJfYWRyKTsKKyNlbHNlCisJZGF0YTMyID0gY3VyX3BpYy0+bWNfeV9hZHI7CisJV1JJVEVfVlJFRyhIRVZDX1NBT19ZX1NUQVJUX0FERFIsIGRhdGEzMik7CisjZW5kaWYKKwlkYXRhMzIgPSAobWNfYnVmZmVyX3NpemVfdV92X2ggPDwgMTYpIDw8IDE7CisJV1JJVEVfVlJFRyhIRVZDX1NBT19ZX0xFTkdUSCwgZGF0YTMyKTsKKworI2lmZGVmIExPU0xFU1NfQ09NUFJFU1NfTU9ERQorLypTVVBQT1JUXzEwQklUKi8KKwlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGhldmMpKQorCQlXUklURV9WUkVHKEhFVkNfU0FPX0NfU1RBUlRfQUREUiwgY3VyX3BpYy0+ZHdfdV92X2Fkcik7CisjZWxzZQorCWRhdGEzMiA9IGN1cl9waWMtPm1jX3Vfdl9hZHI7CisJV1JJVEVfVlJFRyhIRVZDX1NBT19DX1NUQVJUX0FERFIsIGRhdGEzMik7CisjZW5kaWYKKwlkYXRhMzIgPSAobWNfYnVmZmVyX3NpemVfdV92X2ggPDwgMTYpOworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ19MRU5HVEgsIGRhdGEzMik7CisKKwlpZiAoaGV2Yy0+aXNfdXNlZF92NGwpIHsKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19ZX0xFTkdUSCwgY3VyX3BpYy0+bHVtYV9zaXplKTsKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19DX0xFTkdUSCwgY3VyX3BpYy0+Y2hyb21hX3NpemUpOworCQlpZiAoZGVidWcgJiBQUklOVF9GTEFHX1Y0TF9ERVRBSUwpIHsKKwkJCXByX2luZm8oIlslZF0gY29uZmlnIHBpYywgaWQ6ICVkLCBZOigleCwgJWQpIEM6KCV4LCAlZCkuXG4iLAorCQkJCXY0bDJfY3R4LT5pZCwgY3VyX3BpYy0+aW5kZXgsCisJCQkJY3VyX3BpYy0+ZHdfeV9hZHIsIGN1cl9waWMtPmx1bWFfc2l6ZSwKKwkJCQljdXJfcGljLT5kd191X3ZfYWRyLCBjdXJfcGljLT5jaHJvbWFfc2l6ZSk7CisJCX0KKwl9CisKKyNpZmRlZiBMT1NMRVNTX0NPTVBSRVNTX01PREUKKy8qU1VQUE9SVF8xMEJJVCovCisJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShoZXZjKSkgeworCQlXUklURV9WUkVHKEhFVkNfU0FPX1lfV1BUUiwgY3VyX3BpYy0+ZHdfeV9hZHIpOworCQlXUklURV9WUkVHKEhFVkNfU0FPX0NfV1BUUiwgY3VyX3BpYy0+ZHdfdV92X2Fkcik7CisJfQorI2Vsc2UKKwkvKiBtdWx0aSB0aWxlIHRvIGRvLi4uICovCisJZGF0YTMyID0gY3VyX3BpYy0+bWNfeV9hZHI7CisJV1JJVEVfVlJFRyhIRVZDX1NBT19ZX1dQVFIsIGRhdGEzMik7CisKKwlkYXRhMzIgPSBjdXJfcGljLT5tY191X3ZfYWRyOworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ19XUFRSLCBkYXRhMzIpOworI2VuZGlmCisJLyogREJMSyBDT05GSUcgSEVSRSAqLworCWlmIChoZXZjLT5uZXdfcGljKSB7CisJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpIHsKKwkJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkKKwkJCQlkYXRhMzIgPSAoMHhmZiA8PCA4KSB8ICgweDAgIDw8IDApOworCQkJZWxzZQorCQkJCWRhdGEzMiA9ICgweDU3IDw8IDgpIHwgIC8qIDFzdC8ybmQgd3JpdGUgYm90aCBlbmFibGUqLworCQkJCQkoMHgwICA8PCAwKTsgICAvKiBoMjY1IHZpZGVvIGZvcm1hdCovCisKKwkJCWlmIChoZXZjLT5waWNfdyA+PSAxMjgwKQorCQkJCWRhdGEzMiB8PSAoMHgxIDw8IDQpOyAvKmRibGsgcGlwZWxpbmUgbW9kZT0xIGZvciBwZXJmb3JtYW5jZSovCisJCQlkYXRhMzIgJj0gKH4weDMwMCk7IC8qWzhdOmZpcnN0IHdyaXRlIGVuYWJsZSAoY29tcHJlc3MpICBbOV06ZG91YmxlIHdyaXRlIGVuYWJsZSAodW5jb21wcmVzcykqLworCQkJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShoZXZjKSA9PSAwKQorCQkJCWRhdGEzMiB8PSAoMHgxIDw8IDgpOyAvKmVuYWJsZSBmaXJzdCB3cml0ZSovCisJCQllbHNlIGlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUoaGV2YykgPT0gMHgxMCkKKwkJCQlkYXRhMzIgfD0gKDB4MSA8PCA5KTsgLypkb3VibGUgd3JpdGUgb25seSovCisJCQllbHNlCisJCQkJZGF0YTMyIHw9ICgoMHgxIDw8IDgpICB8KDB4MSA8PCA5KSk7CisKKwkJCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGR0IsIGRhdGEzMik7CisJCQloZXZjX3ByaW50KGhldmMsIEgyNjVfREVCVUdfQlVGTUdSX01PUkUsCisJCQkJIltEQkxLIERFQlVHXSBIRVZDMSBDRkdCIDogMHgleFxuIiwgZGF0YTMyKTsKKwkJfQorCQlkYXRhMzIgPSAoaGV2Yy0+cGljX3cgfCBoZXZjLT5waWNfaCA8PCAxNik7CisJCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGRzIsIGRhdGEzMik7CisKKwkJaWYgKChtaXNjX2ZsYWcwID4+IFBDTV9FTkFCTEVfRkxBR19CSVQpICYgMHgxKSB7CisJCQlkYXRhMzIgPQorCQkJCSgobWlzY19mbGFnMCA+PgorCQkJCSAgUENNX0xPT1BfRklMVEVSX0RJU0FCTEVEX0ZMQUdfQklUKSAmCisJCQkJIDB4MSkgPDwgMzsKKwkJfSBlbHNlCisJCQlkYXRhMzIgPSAwOworCQlkYXRhMzIgfD0KKwkJCSgoKHBhcmFtcy0+cC5wcHNfY2JfcXBfb2Zmc2V0ICYgMHgxZikgPDwgNCkgfAorCQkJICgocGFyYW1zLT5wLnBwc19jcl9xcF9vZmZzZXQKKwkJCSAgICYgMHgxZikgPDwKKwkJCSAgOSkpOworCQlkYXRhMzIgfD0KKwkJCShoZXZjLT5sY3Vfc2l6ZSA9PQorCQkJIDY0KSA/IDAgOiAoKGhldmMtPmxjdV9zaXplID09IDMyKSA/IDEgOiAyKTsKKwkJZGF0YTMyIHw9IChoZXZjLT5waWNfdyA8PSA2NCkgPyAoMSA8PCAyMCkgOiAwOworCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkcxLCBkYXRhMzIpOworCisJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpIHsKKwkJCS8qaWYgKGRlYnVnICYgMHg4MCkgeyovCisJCQkJZGF0YTMyID0gMSA8PCAyODsgLyogRGVidWcgb25seTogc3RzMSBjaG9vc2VzIGRibGtfbWFpbiovCisJCQkJV1JJVEVfVlJFRyhIRVZDX0RCTEtfU1RTMSArIDQsIGRhdGEzMik7IC8qIDB4MzUxMCAqLworCQkJCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19CVUZNR1JfTU9SRSwKKwkJCQkJIltEQkxLIERFQlVHXSBIRVZDMSBTVFMxIDogMHgleFxuIiwKKwkJCQkJZGF0YTMyKTsKKwkJCS8qfSovCisJCX0KKwl9CisjaWYgMAorCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMMSk7CisJZGF0YTMyICY9ICh+MHgzMDAwKTsKKwlkYXRhMzIgfD0gKGhldmMtPm1lbV9tYXBfbW9kZSA8PAorCQkJMTIpOworCisvKiAgWzEzOjEyXSBheGlfYWZvcm1hdCwKKyAqCQkJICAgICAgIDAtTGluZWFyLCAxLTMyeDMyLCAyLTY0eDMyCisgKi8KKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkwxLCBkYXRhMzIpOworCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNEX0lQUF9BWElJRl9DT05GSUcpOworCWRhdGEzMiAmPSAofjB4MzApOworCWRhdGEzMiB8PSAoaGV2Yy0+bWVtX21hcF9tb2RlIDw8CisJCQkgICA0KTsKKworLyogIFs1OjRdICAgIC0tIGFkZHJlc3NfZm9ybWF0CisgKgkJCQkwMDpsaW5lYXIgMDE6MzJ4MzIgMTA6NjR4MzIKKyAqLworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX0FYSUlGX0NPTkZJRywgZGF0YTMyKTsKKyNlbHNlCisJLyogbThiYWJ5IHRlc3QxOTAyICovCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkwxKTsKKwlkYXRhMzIgJj0gKH4weDMwMDApOworCS8qIFsxMzoxMl0gYXhpX2Fmb3JtYXQsIDAtTGluZWFyLCAxLTMyeDMyLCAyLTY0eDMyICovCisJZGF0YTMyIHw9IChoZXZjLT5tZW1fbWFwX21vZGUgPDwgMTIpOworCWRhdGEzMiAmPSAofjB4ZmYwKTsKKwlkYXRhMzIgfD0gKChoZXZjLT5lbmRpYW4gPj4gOCkgJiAweGZmZik7CS8qIGRhdGEzMiB8PSAweDY3MDsgQmlnLUVuZGlhbiBwZXIgNjQtYml0ICovCisJZGF0YTMyICY9ICh+MHgzKTsgLypbMV06ZHdfZGlzYWJsZSBbMF06Y21fZGlzYWJsZSovCisJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShoZXZjKSA9PSAwKQorCQlkYXRhMzIgfD0gMHgyOyAvKmRpc2FibGUgZG91YmxlIHdyaXRlKi8KKwllbHNlIGlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUoaGV2YykgJiAweDEwKQorCQlkYXRhMzIgfD0gMHgxOyAvKmRpc2FibGUgY20qLworCSBpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKSB7CisJCQl1bnNpZ25lZCBpbnQgZGF0YTsKKwkJCWRhdGEgPSAoMHg1NyA8PCA4KSB8ICAvKiAxc3QvMm5kIHdyaXRlIGJvdGggZW5hYmxlKi8KKwkJCQkoMHgwICA8PCAwKTsgICAvKiBoMjY1IHZpZGVvIGZvcm1hdCovCisJCQlpZiAoaGV2Yy0+cGljX3cgPj0gMTI4MCkKKwkJCQlkYXRhIHw9ICgweDEgPDwgNCk7IC8qZGJsayBwaXBlbGluZSBtb2RlPTEgZm9yIHBlcmZvcm1hbmNlKi8KKwkJCWRhdGEgJj0gKH4weDMwMCk7IC8qWzhdOmZpcnN0IHdyaXRlIGVuYWJsZSAoY29tcHJlc3MpICBbOV06ZG91YmxlIHdyaXRlIGVuYWJsZSAodW5jb21wcmVzcykqLworCQkJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShoZXZjKSA9PSAwKQorCQkJCWRhdGEgfD0gKDB4MSA8PCA4KTsgLyplbmFibGUgZmlyc3Qgd3JpdGUqLworCQkJZWxzZSBpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGhldmMpICYgMHgxMCkKKwkJCQlkYXRhIHw9ICgweDEgPDwgOSk7IC8qZG91YmxlIHdyaXRlIG9ubHkqLworCQkJZWxzZQorCQkJCWRhdGEgfD0gKCgweDEgPDwgOCkgIHwoMHgxIDw8IDkpKTsKKworCQkJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHQiwgZGF0YSk7CisJCQloZXZjX3ByaW50KGhldmMsIEgyNjVfREVCVUdfQlVGTUdSX01PUkUsCisJCQkJIltEQkxLIERFQlVHXSBIRVZDMSBDRkdCIDogMHgleFxuIiwgZGF0YSk7CisJfQorCisJLyogc3dhcCB1diAqLworCWlmIChoZXZjLT5pc191c2VkX3Y0bCkgeworCQlpZiAoKHY0bDJfY3R4LT5jYXBfcGl4X2ZtdCA9PSBWNEwyX1BJWF9GTVRfTlYyMSkgfHwKKwkJCSh2NGwyX2N0eC0+Y2FwX3BpeF9mbXQgPT0gVjRMMl9QSVhfRk1UX05WMjFNKSkKKwkJCWRhdGEzMiAmPSB+KDEgPDwgOCk7IC8qIE5WMjEgKi8KKwkJZWxzZQorCQkJZGF0YTMyIHw9ICgxIDw8IDgpOyAvKiBOVjEyICovCisJfQorCWRhdGEzMiAmPSAofigzIDw8IDE0KSk7CisJZGF0YTMyIHw9ICgyIDw8IDE0KTsKKwkvKgorCSogIFszMToyNF0gYXJfZmlmbzFfYXhpX3RocmVkCisJKiAgWzIzOjE2XSBhcl9maWZvMF9heGlfdGhyZWQKKwkqICBbMTU6MTRdIGF4aV9saW5lYWxpZ24sIDAtMTZieXRlcywgMS0zMmJ5dGVzLCAyLTY0Ynl0ZXMKKwkqICBbMTM6MTJdIGF4aV9hZm9ybWF0LCAwLUxpbmVhciwgMS0zMngzMiwgMi02NHgzMgorCSogIFsxMTowOF0gYXhpX2xlbmRpYW5fQworCSogIFswNzowNF0gYXhpX2xlbmRpYW5fWQorCSogIFszXSAgICAgcmVzZXJ2ZWQKKwkqICBbMl0gICAgIGNsa19mb3JjZW9uCisJKiAgWzFdICAgICBkd19kaXNhYmxlOmRpc2FibGUgZG91YmxlIHdyaXRlIG91dHB1dAorCSogIFswXSAgICAgY21fZGlzYWJsZTpkaXNhYmxlIGNvbXByZXNzIG91dHB1dAorCSovCisJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMMSwgZGF0YTMyKTsKKwlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGhldmMpICYgMHgxMCkgeworCQkvKiBbMjM6MjJdIGR3X3YxX2N0cmwKKwkJICpbMjE6MjBdIGR3X3YwX2N0cmwKKwkJICpbMTk6MThdIGR3X2gxX2N0cmwKKwkJICpbMTc6MTZdIGR3X2gwX2N0cmwKKwkJICovCisJCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMNSk7CisJCS8qc2V0IHRoZW0gYWxsIDAgZm9yIEgyNjVfTlYyMSAobm8gZG93bi1zY2FsZSkqLworCQlkYXRhMzIgJj0gfigweGZmIDw8IDE2KTsKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMNSwgZGF0YTMyKTsKKwl9CisKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ0RfSVBQX0FYSUlGX0NPTkZJRyk7CisJZGF0YTMyICY9ICh+MHgzMCk7CisJLyogWzU6NF0gICAgLS0gYWRkcmVzc19mb3JtYXQgMDA6bGluZWFyIDAxOjMyeDMyIDEwOjY0eDMyICovCisJZGF0YTMyIHw9IChoZXZjLT5tZW1fbWFwX21vZGUgPDwgNCk7CisJZGF0YTMyICY9ICh+MHhGKTsKKwlkYXRhMzIgfD0gKGhldmMtPmVuZGlhbiAmIDB4Zik7ICAvKiB2YWxpZCBvbmx5IHdoZW4gZG91YmxlIHdyaXRlIG9ubHkgKi8KKworCS8qIHN3YXAgdXYgKi8KKwlpZiAoaGV2Yy0+aXNfdXNlZF92NGwpIHsKKwkJaWYgKCh2NGwyX2N0eC0+Y2FwX3BpeF9mbXQgPT0gVjRMMl9QSVhfRk1UX05WMjEpIHx8CisJCQkodjRsMl9jdHgtPmNhcF9waXhfZm10ID09IFY0TDJfUElYX0ZNVF9OVjIxTSkpCisJCQlkYXRhMzIgfD0gKDEgPDwgMTIpOyAvKiBOVjIxICovCisJCWVsc2UKKwkJCWRhdGEzMiAmPSB+KDEgPDwgMTIpOyAvKiBOVjEyICovCisJfQorCWRhdGEzMiAmPSAofigzIDw8IDgpKTsKKwlkYXRhMzIgfD0gKDIgPDwgOCk7CisJLyoKKwkqIFszOjBdICAgbGl0dGxlX2VuZGlhbgorCSogWzU6NF0gICBhZGRyZXNzX2Zvcm1hdCAwMDpsaW5lYXIgMDE6MzJ4MzIgMTA6NjR4MzIKKwkqIFs3OjZdICAgcmVzZXJ2ZWQKKwkqIFs5OjhdICAgTGluZWFyX0xpbmVBbGlnbm1lbnQgMDA6MTZieXRlIDAxOjMyYnl0ZSAxMDo2NGJ5dGUKKwkqIFsxMToxMF0gcmVzZXJ2ZWQKKwkqIFsxMl0gICAgQ2JDcl9ieXRlX3N3YXAKKwkqIFszMToxM10gcmVzZXJ2ZWQKKwkqLworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX0FYSUlGX0NPTkZJRywgZGF0YTMyKTsKKyNlbmRpZgorCWRhdGEzMiA9IDA7CisJZGF0YTMyXzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDApOworCWRhdGEzMl8yICY9ICh+MHgzMDApOworCS8qIHNsaWNlX2RlYmxvY2tpbmdfZmlsdGVyX2Rpc2FibGVkX2ZsYWcgPSAwOworCSAqCXVjb2RlIGhhcyBoYW5kbGUgaXQgLCBzbyByZWFkIGl0IGZyb20gdWNvZGUgZGlyZWN0bHkKKwkgKi8KKwlpZiAoaGV2Yy0+dGlsZV9lbmFibGVkKSB7CisJCWRhdGEzMiB8PQorCQkJKChtaXNjX2ZsYWcwID4+CisJCQkgIExPT1BfRklMRVJfQUNST1NTX1RJTEVTX0VOQUJMRURfRkxBR19CSVQpICYKKwkJCSAweDEpIDw8IDA7CisJCWRhdGEzMl8yIHw9CisJCQkoKG1pc2NfZmxhZzAgPj4KKwkJCSAgTE9PUF9GSUxFUl9BQ1JPU1NfVElMRVNfRU5BQkxFRF9GTEFHX0JJVCkgJgorCQkJIDB4MSkgPDwgODsKKwl9CisJc2xpY2VfZGVibG9ja2luZ19maWx0ZXJfZGlzYWJsZWRfZmxhZyA9IChtaXNjX2ZsYWcwID4+CisJCQlTTElDRV9ERUJMT0NLSU5HX0ZJTFRFUl9ESVNBQkxFRF9GTEFHX0JJVCkgJgorCQkweDE7CS8qIHVjb2RlIGhhcyBoYW5kbGUgaXQsc28gcmVhZCBpdCBmcm9tIHVjb2RlIGRpcmVjdGx5ICovCisJaWYgKChtaXNjX2ZsYWcwICYgKDEgPDwgREVCTE9DS0lOR19GSUxURVJfT1ZFUlJJREVfRU5BQkxFRF9GTEFHX0JJVCkpCisJCSYmIChtaXNjX2ZsYWcwICYgKDEgPDwgREVCTE9DS0lOR19GSUxURVJfT1ZFUlJJREVfRkxBR19CSVQpKSkgeworCQkvKiBzbGljZV9kZWJsb2NraW5nX2ZpbHRlcl9kaXNhYmxlZF9mbGFnID0KKwkJICogKG1pc2NfZmxhZzA+PlNMSUNFX0RFQkxPQ0tJTkdfRklMVEVSX0RJU0FCTEVEX0ZMQUdfQklUKSYweDE7CisJCSAqIC8vdWNvZGUgaGFzIGhhbmRsZSBpdCAsIHNvIHJlYWQgaXQgZnJvbSB1Y29kZSBkaXJlY3RseQorCQkgKi8KKwkJZGF0YTMyIHw9IHNsaWNlX2RlYmxvY2tpbmdfZmlsdGVyX2Rpc2FibGVkX2ZsYWcgPDwgMjsKKwkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKQorCQkJUFJfRklMTCgiKDEsJXgpIiwgZGF0YTMyKTsKKwkJaWYgKCFzbGljZV9kZWJsb2NraW5nX2ZpbHRlcl9kaXNhYmxlZF9mbGFnKSB7CisJCQlkYXRhMzIgfD0gKHBhcmFtcy0+cC5zbGljZV9iZXRhX29mZnNldF9kaXYyICYgMHhmKSA8PCAzOworCQkJZGF0YTMyIHw9IChwYXJhbXMtPnAuc2xpY2VfdGNfb2Zmc2V0X2RpdjIgJiAweGYpIDw8IDc7CisJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1IpCisJCQkJUFJfRklMTCgiKDIsJXgpIiwgZGF0YTMyKTsKKwkJfQorCX0gZWxzZSB7CisJCWRhdGEzMiB8PQorCQkJKChtaXNjX2ZsYWcwID4+CisJCQkgIFBQU19ERUJMT0NLSU5HX0ZJTFRFUl9ESVNBQkxFRF9GTEFHX0JJVCkgJgorCQkJIDB4MSkgPDwgMjsKKwkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKQorCQkJUFJfRklMTCgiKDMsJXgpIiwgZGF0YTMyKTsKKwkJaWYgKCgobWlzY19mbGFnMCA+PiBQUFNfREVCTE9DS0lOR19GSUxURVJfRElTQUJMRURfRkxBR19CSVQpICYKKwkJCSAweDEpID09IDApIHsKKwkJCWRhdGEzMiB8PSAocGFyYW1zLT5wLnBwc19iZXRhX29mZnNldF9kaXYyICYgMHhmKSA8PCAzOworCQkJZGF0YTMyIHw9IChwYXJhbXMtPnAucHBzX3RjX29mZnNldF9kaXYyICYgMHhmKSA8PCA3OworCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKQorCQkJCVBSX0ZJTEwoIig0LCV4KSIsIGRhdGEzMik7CisJCX0KKwl9CisJaWYgKChtaXNjX2ZsYWcwICYgKDEgPDwgUFBTX0xPT1BfRklMVEVSX0FDUk9TU19TTElDRVNfRU5BQkxFRF9GTEFHX0JJVCkpCisJCSYmICgobWlzY19mbGFnMCAmICgxIDw8IFNMSUNFX1NBT19MVU1BX0ZMQUdfQklUKSkKKwkJCXx8IChtaXNjX2ZsYWcwICYgKDEgPDwgU0xJQ0VfU0FPX0NIUk9NQV9GTEFHX0JJVCkpCisJCQl8fCAoIXNsaWNlX2RlYmxvY2tpbmdfZmlsdGVyX2Rpc2FibGVkX2ZsYWcpKSkgeworCQlkYXRhMzIgfD0KKwkJCSgobWlzY19mbGFnMCA+PgorCQkJICBTTElDRV9MT09QX0ZJTFRFUl9BQ1JPU1NfU0xJQ0VTX0VOQUJMRURfRkxBR19CSVQpCisJCQkgJiAweDEpCTw8IDE7CisJCWRhdGEzMl8yIHw9CisJCQkoKG1pc2NfZmxhZzAgPj4KKwkJCSAgU0xJQ0VfTE9PUF9GSUxURVJfQUNST1NTX1NMSUNFU19FTkFCTEVEX0ZMQUdfQklUKQorCQkJJiAweDEpIDw8IDk7CisJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikKKwkJCVBSX0ZJTEwoIig1LCV4KVxuIiwgZGF0YTMyKTsKKwl9IGVsc2UgeworCQlkYXRhMzIgfD0KKwkJCSgobWlzY19mbGFnMCA+PgorCQkJICBQUFNfTE9PUF9GSUxURVJfQUNST1NTX1NMSUNFU19FTkFCTEVEX0ZMQUdfQklUKQorCQkJICYgMHgxKSA8PCAxOworCQlkYXRhMzJfMiB8PQorCQkJKChtaXNjX2ZsYWcwID4+CisJCQkgIFBQU19MT09QX0ZJTFRFUl9BQ1JPU1NfU0xJQ0VTX0VOQUJMRURfRkxBR19CSVQpCisJCQkgJiAweDEpIDw8IDk7CisJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikKKwkJCVBSX0ZJTEwoIig2LCV4KVxuIiwgZGF0YTMyKTsKKwl9CisJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKQorCQlQUl9JTkZPKGhldmMtPmluZGV4KTsKKworCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGRzksIGRhdGEzMik7CisJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMMCwgZGF0YTMyXzIpOworfQorCisjaWZkZWYgVEVTVF9OT19CVUYKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHRlc3RfZmxhZyA9IDE7CisjZW5kaWYKKworc3RhdGljIHZvaWQgcGljX2xpc3RfcHJvY2VzcyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWludCB3b3JrX3BpY19udW0gPSBoZXZjLT51c2VkX2J1Zl9udW07CisJaW50IGFsbG9jX3BpY19jb3VudCA9IDA7CisJaW50IGk7CisJc3RydWN0IFBJQ19zICpwaWM7CisJZm9yIChpID0gMDsgaSA8IE1BWF9SRUZfUElDX05VTTsgaSsrKSB7CisJCXBpYyA9IGhldmMtPm1fUElDW2ldOworCQlpZiAocGljID09IE5VTEwgfHwgcGljLT5pbmRleCA9PSAtMSkKKwkJCWNvbnRpbnVlOworCQlhbGxvY19waWNfY291bnQrKzsKKwkJaWYgKHBpYy0+b3V0cHV0X21hcmsgPT0gMCAmJiBwaWMtPnJlZmVyZW5jZWQgPT0gMAorCQkJJiYgcGljLT5vdXRwdXRfcmVhZHkgPT0gMAorCQkJJiYgKHBpYy0+d2lkdGggIT0gaGV2Yy0+cGljX3cgfHwKKwkJCQlwaWMtPmhlaWdodCAhPSBoZXZjLT5waWNfaCkKKwkJCSkgeworCQkJc2V0X2J1Zl91bnVzZWQoaGV2YywgcGljLT5CVUZfaW5kZXgpOworCQkJcGljLT5CVUZfaW5kZXggPSAtMTsKKwkJCWlmIChhbGxvY19waWNfY291bnQgPiB3b3JrX3BpY19udW0pIHsKKwkJCQlwaWMtPndpZHRoID0gMDsKKwkJCQlwaWMtPmhlaWdodCA9IDA7CisJCQkJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UuZGVjb2RlX2hlYWRlcl9tZW1vcnlfdGltZV9uYW1lLCBUUkFDRV9IRUFERVJfTUVNT1JZX1NUQVJUKTsKKwkJCQlyZWxlYXNlX3BpY19tbXVfYnVmKGhldmMsIHBpYyk7CisJCQkJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UuZGVjb2RlX2hlYWRlcl9tZW1vcnlfdGltZV9uYW1lLCBUUkFDRV9IRUFERVJfTUVNT1JZX0VORCk7CisJCQkJcGljLT5pbmRleCA9IC0xOworCQkJfSBlbHNlIHsKKwkJCQlwaWMtPndpZHRoID0gaGV2Yy0+cGljX3c7CisJCQkJcGljLT5oZWlnaHQgPSBoZXZjLT5waWNfaDsKKwkJCX0KKwkJfQorCX0KKwlpZiAoYWxsb2NfcGljX2NvdW50IDwgd29ya19waWNfbnVtKSB7CisJCWludCBuZXdfY291bnQgPSBhbGxvY19waWNfY291bnQ7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVGX1BJQ19OVU07IGkrKykgeworCQkJcGljID0gaGV2Yy0+bV9QSUNbaV07CisJCQlpZiAocGljICYmIHBpYy0+aW5kZXggPT0gLTEpIHsKKwkJCQlwaWMtPmluZGV4ID0gaTsKKwkJCQlwaWMtPkJVRl9pbmRleCA9IC0xOworCQkJCXBpYy0+d2lkdGggPSBoZXZjLT5waWNfdzsKKwkJCQlwaWMtPmhlaWdodCA9IGhldmMtPnBpY19oOworCQkJCW5ld19jb3VudCsrOworCQkJCWlmIChuZXdfY291bnQgPj0KKwkJCQkJd29ya19waWNfbnVtKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJfQorCWRlYWxsb2NfdW51c2VkX2J1ZihoZXZjKTsKKwlpZiAoZ2V0X2FsbG9jX3BpY19jb3VudChoZXZjKQorCQkhPSBhbGxvY19waWNfY291bnQpIHsKKwkJaGV2Y19wcmludF9jb250KGhldmMsIDAsCisJCSIlczogd29ya19waWNfbnVtIGlzICVkLCBDaGFuZ2UgYWxsb2NfcGljX2NvdW50IGZyb20gJWQgdG8gJWRcbiIsCisJCV9fZnVuY19fLAorCQl3b3JrX3BpY19udW0sCisJCWFsbG9jX3BpY19jb3VudCwKKwkJZ2V0X2FsbG9jX3BpY19jb3VudChoZXZjKSk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IFBJQ19zICpnZXRfbmV3X3BpYyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCQl1bmlvbiBwYXJhbV91ICpycG1fcGFyYW0pCit7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaGV2Yyk7CisJc3RydWN0IFBJQ19zICpuZXdfcGljID0gTlVMTDsKKwlzdHJ1Y3QgUElDX3MgKnBpYzsKKwlpbnQgaTsKKwlpbnQgcmV0OworCisJZm9yIChpID0gMDsgaSA8IE1BWF9SRUZfUElDX05VTTsgaSsrKSB7CisJCXBpYyA9IGhldmMtPm1fUElDW2ldOworCQlpZiAocGljID09IE5VTEwgfHwgcGljLT5pbmRleCA9PSAtMSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChwaWMtPm91dHB1dF9tYXJrID09IDAgJiYgcGljLT5yZWZlcmVuY2VkID09IDAKKwkJCSYmIHBpYy0+b3V0cHV0X3JlYWR5ID09IDAKKwkJCSYmIHBpYy0+d2lkdGggPT0gaGV2Yy0+cGljX3cKKwkJCSYmIHBpYy0+aGVpZ2h0ID09IGhldmMtPnBpY19oCisJCQkmJiBwaWMtPnZmX3JlZiA9PSAwCisJCQkpIHsKKwkJCWlmIChuZXdfcGljKSB7CisJCQkJaWYgKG5ld19waWMtPlBPQyAhPSBJTlZBTElEX1BPQykgeworCQkJCQlpZiAocGljLT5QT0MgPT0gSU5WQUxJRF9QT0MgfHwKKwkJCQkJCXBpYy0+UE9DIDwgbmV3X3BpYy0+UE9DKQorCQkJCQkJbmV3X3BpYyA9IHBpYzsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQluZXdfcGljID0gcGljOworCQl9CisJfQorCisJaWYgKG5ld19waWMgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAobmV3X3BpYy0+QlVGX2luZGV4IDwgMCkgeworCQlpZiAoYWxsb2NfYnVmKGhldmMpIDwgMCkKKwkJCXJldHVybiBOVUxMOworCQllbHNlIHsKKwkJCWlmIChjb25maWdfcGljKGhldmMsIG5ld19waWMpIDwgMCkgeworCQkJCWRlYWxsb2NfcGljX2J1ZihoZXZjLCBuZXdfcGljKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCQluZXdfcGljLT53aWR0aCA9IGhldmMtPnBpY193OworCQluZXdfcGljLT5oZWlnaHQgPSBoZXZjLT5waWNfaDsKKwkJc2V0X2NhbnZhcyhoZXZjLCBuZXdfcGljKTsKKworCQlpbml0X3BpY19saXN0X2h3KGhldmMpOworCX0KKworCWlmIChuZXdfcGljKSB7CisJCW5ld19waWMtPmRvdWJsZV93cml0ZV9tb2RlID0KKwkJCWdldF9kb3VibGVfd3JpdGVfbW9kZShoZXZjKTsKKwkJaWYgKG5ld19waWMtPmRvdWJsZV93cml0ZV9tb2RlKQorCQkJc2V0X2NhbnZhcyhoZXZjLCBuZXdfcGljKTsKKworI2lmZGVmIFRFU1RfTk9fQlVGCisJCWlmICh0ZXN0X2ZsYWcpIHsKKwkJCXRlc3RfZmxhZyA9IDA7CisJCQlyZXR1cm4gTlVMTDsKKwkJfSBlbHNlCisJCQl0ZXN0X2ZsYWcgPSAxOworI2VuZGlmCisJCWlmIChnZXRfbXZfYnVmKGhldmMsIG5ld19waWMpIDwgMCkKKwkJCXJldHVybiBOVUxMOworCisJCWlmIChoZXZjLT5tbXVfZW5hYmxlKSB7CisJCQlyZXQgPSBIMjY1X2FsbG9jX21tdShoZXZjLCBuZXdfcGljLAorCQkJCXJwbV9wYXJhbS0+cC5iaXRfZGVwdGgsCisJCQkJaGV2Yy0+ZnJhbWVfbW11X21hcF9hZGRyKTsKKwkJCWlmIChyZXQgIT0gMCkgeworCQkJCXB1dF9tdl9idWYoaGV2YywgbmV3X3BpYyk7CisJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSJjYW4ndCBhbGxvYyBuZWVkIG1tdTEsaWR4ICVkIHJldCA9JWRcbiIsCisJCQkJbmV3X3BpYy0+ZGVjb2RlX2lkeCwKKwkJCQlyZXQpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisJCW5ld19waWMtPnJlZmVyZW5jZWQgPSAxOworCQluZXdfcGljLT5kZWNvZGVfaWR4ID0gaGV2Yy0+ZGVjb2RlX2lkeDsKKwkJbmV3X3BpYy0+c2xpY2VfaWR4ID0gMDsKKwkJbmV3X3BpYy0+cmVmZXJlbmNlZCA9IDE7CisJCW5ld19waWMtPm91dHB1dF9tYXJrID0gMDsKKwkJbmV3X3BpYy0+cmVjb25fbWFyayA9IDA7CisJCW5ld19waWMtPmVycm9yX21hcmsgPSAwOworCQluZXdfcGljLT5kaXNfbWFyayA9IDA7CisJCS8qIG5ld19waWMtPm91dHB1dF9yZWFkeSA9IDA7ICovCisJCW5ld19waWMtPm51bV9yZW9yZGVyX3BpYyA9IHJwbV9wYXJhbS0+cC5zcHNfbnVtX3Jlb3JkZXJfcGljc18wOworCQluZXdfcGljLT5pcF9tb2RlID0gKCFuZXdfcGljLT5udW1fcmVvcmRlcl9waWMgJiYKKwkJCQkJCQkJISh2ZGVjLT5zbGF2ZSB8fCB2ZGVjLT5tYXN0ZXIpICYmCisJCQkJCQkJCSFkaXNhYmxlX2lwX21vZGUpID8gdHJ1ZSA6IGZhbHNlOworCQluZXdfcGljLT5sb3NsZXNzX2NvbXBfYm9keV9zaXplID0gaGV2Yy0+bG9zbGVzc19jb21wX2JvZHlfc2l6ZTsKKwkJbmV3X3BpYy0+UE9DID0gaGV2Yy0+Y3Vycl9QT0M7CisJCW5ld19waWMtPnBpY19zdHJ1Y3QgPSBoZXZjLT5jdXJyX3BpY19zdHJ1Y3Q7CisJCWlmIChuZXdfcGljLT5hdXhfZGF0YV9idWYpCisJCQlyZWxlYXNlX2F1eF9kYXRhKGhldmMsIG5ld19waWMpOworCQluZXdfcGljLT5tZW1fc2F2aW5nX21vZGUgPQorCQkJaGV2Yy0+bWVtX3NhdmluZ19tb2RlOworCQluZXdfcGljLT5iaXRfZGVwdGhfbHVtYSA9CisJCQloZXZjLT5iaXRfZGVwdGhfbHVtYTsKKwkJbmV3X3BpYy0+Yml0X2RlcHRoX2Nocm9tYSA9CisJCQloZXZjLT5iaXRfZGVwdGhfY2hyb21hOworCQluZXdfcGljLT52aWRlb19zaWduYWxfdHlwZSA9CisJCQloZXZjLT52aWRlb19zaWduYWxfdHlwZTsKKworCQluZXdfcGljLT5jb25mb3JtYW5jZV93aW5kb3dfZmxhZyA9CisJCQloZXZjLT5wYXJhbS5wLmNvbmZvcm1hbmNlX3dpbmRvd19mbGFnOworCQluZXdfcGljLT5jb25mX3dpbl9sZWZ0X29mZnNldCA9CisJCQloZXZjLT5wYXJhbS5wLmNvbmZfd2luX2xlZnRfb2Zmc2V0OworCQluZXdfcGljLT5jb25mX3dpbl9yaWdodF9vZmZzZXQgPQorCQkJaGV2Yy0+cGFyYW0ucC5jb25mX3dpbl9yaWdodF9vZmZzZXQ7CisJCW5ld19waWMtPmNvbmZfd2luX3RvcF9vZmZzZXQgPQorCQkJaGV2Yy0+cGFyYW0ucC5jb25mX3dpbl90b3Bfb2Zmc2V0OworCQluZXdfcGljLT5jb25mX3dpbl9ib3R0b21fb2Zmc2V0ID0KKwkJCWhldmMtPnBhcmFtLnAuY29uZl93aW5fYm90dG9tX29mZnNldDsKKwkJbmV3X3BpYy0+Y2hyb21hX2Zvcm1hdF9pZGMgPQorCQkJCWhldmMtPnBhcmFtLnAuY2hyb21hX2Zvcm1hdF9pZGM7CisKKwkJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX0JVRk1HUl9NT1JFLAorCQkJIiVzOiBpbmRleCAlZCwgYnVmX2lkeCAlZCwgZGVjb2RlX2lkeCAlZCwgUE9DICVkXG4iLAorCQkJX19mdW5jX18sIG5ld19waWMtPmluZGV4LAorCQkJbmV3X3BpYy0+QlVGX2luZGV4LCBuZXdfcGljLT5kZWNvZGVfaWR4LAorCQkJbmV3X3BpYy0+UE9DKTsKKworCX0KKwlpZiAocGljX2xpc3RfZGVidWcgJiAweDEpIHsKKwkJZHVtcF9waWNfbGlzdChoZXZjKTsKKwkJcHJfZXJyKCJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworCX0KKworCXJldHVybiBuZXdfcGljOworfQorCitzdGF0aWMgaW50IGdldF9mcmVlX2ZiX2lkeChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGhldmMtPnVzZWRfYnVmX251bTsgKytpKSB7CisJCWlmIChoZXZjLT5tX1BJQ1tpXSA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJaWYgKChoZXZjLT5tX1BJQ1tpXS0+cmVmZXJlbmNlZCA9PSAwKSAmJgorCQkJKGhldmMtPm1fUElDW2ldLT52Zl9yZWYgPT0gMCkgJiYKKwkJCSghaGV2Yy0+bV9QSUNbaV0tPmNtYV9hbGxvY19hZGRyKSkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAoaGV2Yy0+bV9QSUNbaV0gJiYKKwkJKGkgIT0gaGV2Yy0+dXNlZF9idWZfbnVtKSkgPyBpIDogLTE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgUElDX3MgKnY0bF9nZXRfbmV3X3BpYyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCQl1bmlvbiBwYXJhbV91ICpycG1fcGFyYW0pCit7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaGV2Yyk7CisJaW50IHJldDsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKiB2NGwgPSBoZXZjLT52NGwyX2N0eDsKKwlzdHJ1Y3QgdjRsX2J1ZmZfcG9vbCAqcG9vbCA9ICZ2NGwtPmNhcF9wb29sOworCXN0cnVjdCBQSUNfcyAqbmV3X3BpYyA9IE5VTEw7CisJc3RydWN0IFBJQ19zICpwaWMgPSBOVUxMOworCWludCBpLCBqLCBpZHg7CisKKwlmb3IgKGkgPSAwOyBpIDwgcG9vbC0+aW47ICsraSkgeworCQl1MzIgc3RhdGUgPSAocG9vbC0+c2VxW2ldID4+IDE2KTsKKwkJdTMyIGluZGV4ID0gKHBvb2wtPnNlcVtpXSAmIDB4ZmZmZik7CisKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIFY0TF9DQVBfQlVGRl9JTl9ERUM6CisJCQlmb3IgKGogPSAwOyBqIDwgaGV2Yy0+dXNlZF9idWZfbnVtOyBqKyspIHsKKwkJCQlwaWMgPSBoZXZjLT5tX1BJQ1tqXTsKKwkJCQlpZiAocGljID09IE5VTEwgfHwgcGljLT5pbmRleCA9PSAtMSkKKwkJCQkJY29udGludWU7CisKKwkJCQlpZiAocGljLT5vdXRwdXRfbWFyayA9PSAwICYmCisJCQkJCXBpYy0+cmVmZXJlbmNlZCA9PSAwICYmCisJCQkJCXBpYy0+b3V0cHV0X3JlYWR5ID09IDAgJiYKKwkJCQkJcGljLT53aWR0aCA9PSBoZXZjLT5waWNfdyAmJgorCQkJCQlwaWMtPmhlaWdodCA9PSBoZXZjLT5waWNfaCAmJgorCQkJCQlwaWMtPnZmX3JlZiA9PSAwICYmCisJCQkJCXBpYy0+Y21hX2FsbG9jX2FkZHIpIHsKKwkJCQkJaWYgKG5ld19waWMpIHsKKwkJCQkJCWlmIChuZXdfcGljLT5QT0MgIT0gSU5WQUxJRF9QT0MpIHsKKwkJCQkJCQlpZiAocGljLT5QT0MgPT0gSU5WQUxJRF9QT0MgfHwKKwkJCQkJCQkJcGljLT5QT0MgPCBuZXdfcGljLT5QT0MpCisJCQkJCQkJCW5ld19waWMgPSBwaWM7CisJCQkJCQl9CisJCQkJCX0gZWxzZQorCQkJCQkJbmV3X3BpYyA9IHBpYzsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBWNExfQ0FQX0JVRkZfSU5fTTJNOgorCQkJaWR4ID0gZ2V0X2ZyZWVfZmJfaWR4KGhldmMpOworCQkJaWYgKGlkeCA8IDApCisJCQkJYnJlYWs7CisJCQlwaWMgPSBoZXZjLT5tX1BJQ1tpZHhdOworCQkJcGljLT53aWR0aCA9IGhldmMtPnBpY193OworCQkJcGljLT5oZWlnaHQgPSBoZXZjLT5waWNfaDsKKwkJCWhldmMtPmJ1ZmZlcl93cmFwW2lkeF0gPSBpbmRleDsKKwkJCWlmICgocGljLT5pbmRleCAhPSAtMSkgJiYKKwkJCQkhdjRsX2FsbG9jX2J1ZihoZXZjLCBwaWMpKSB7CisJCQkJdjRsX2NvbmZpZ19waWMoaGV2YywgcGljKTsKKwkJCQlpbml0X3BpY19saXN0X2h3KGhldmMpOworCQkJCW5ld19waWMgPSBwaWM7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG5ld19waWMpCisJCQlicmVhazsKKwl9CisKKwlpZiAobmV3X3BpYyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIGZvciBub3RpZnkgZW9zLiAqLworCWlmICghcnBtX3BhcmFtKQorCQlyZXR1cm4gbmV3X3BpYzsKKworCW5ld19waWMtPmRvdWJsZV93cml0ZV9tb2RlID0gZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGhldmMpOworCWlmIChuZXdfcGljLT5kb3VibGVfd3JpdGVfbW9kZSkKKwkJc2V0X2NhbnZhcyhoZXZjLCBuZXdfcGljKTsKKworCWlmIChnZXRfbXZfYnVmKGhldmMsIG5ld19waWMpIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoaGV2Yy0+bW11X2VuYWJsZSkgeworCQlyZXQgPSBIMjY1X2FsbG9jX21tdShoZXZjLCBuZXdfcGljLAorCQkJcnBtX3BhcmFtLT5wLmJpdF9kZXB0aCwKKwkJCWhldmMtPmZyYW1lX21tdV9tYXBfYWRkcik7CisJCWlmIChyZXQgIT0gMCkgeworCQkJcHV0X212X2J1ZihoZXZjLCBuZXdfcGljKTsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkiY2FuJ3QgYWxsb2MgbmVlZCBtbXUxLGlkeCAlZCByZXQgPSVkXG4iLAorCQkJCW5ld19waWMtPmRlY29kZV9pZHgsIHJldCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCW5ld19waWMtPnJlZmVyZW5jZWQgPSAxOworCW5ld19waWMtPmRlY29kZV9pZHggPSBoZXZjLT5kZWNvZGVfaWR4OworCW5ld19waWMtPnNsaWNlX2lkeCA9IDA7CisJbmV3X3BpYy0+cmVmZXJlbmNlZCA9IDE7CisJbmV3X3BpYy0+b3V0cHV0X21hcmsgPSAwOworCW5ld19waWMtPnJlY29uX21hcmsgPSAwOworCW5ld19waWMtPmVycm9yX21hcmsgPSAwOworCW5ld19waWMtPmRpc19tYXJrID0gMDsKKwkvKiBuZXdfcGljLT5vdXRwdXRfcmVhZHkgPSAwOyAqLworCW5ld19waWMtPm51bV9yZW9yZGVyX3BpYyA9IHJwbV9wYXJhbS0+cC5zcHNfbnVtX3Jlb3JkZXJfcGljc18wOworCW5ld19waWMtPmlwX21vZGUgPSBoZXZjLT5sb3dfbGF0ZW5jeV9mbGFnID8gdHJ1ZSA6CisJCQkoIW5ld19waWMtPm51bV9yZW9yZGVyX3BpYyAmJgorCQkJISh2ZGVjLT5zbGF2ZSB8fCB2ZGVjLT5tYXN0ZXIpICYmCisJCQkhZGlzYWJsZV9pcF9tb2RlKSA/IHRydWUgOiBmYWxzZTsKKwluZXdfcGljLT5sb3NsZXNzX2NvbXBfYm9keV9zaXplID0gaGV2Yy0+bG9zbGVzc19jb21wX2JvZHlfc2l6ZTsKKwluZXdfcGljLT5QT0MgPSBoZXZjLT5jdXJyX1BPQzsKKwluZXdfcGljLT5waWNfc3RydWN0ID0gaGV2Yy0+Y3Vycl9waWNfc3RydWN0OworCisJdjRsLT5hdXhfaW5mb3MuYmluZF9zZWlfYnVmZmVyKHY0bCwgJm5ld19waWMtPmF1eF9kYXRhX2J1ZiwKKwkJJm5ld19waWMtPmF1eF9kYXRhX3NpemUsICZuZXdfcGljLT5jdHhfYnVmX2lkeCk7CisKKwluZXdfcGljLT5tZW1fc2F2aW5nX21vZGUgPQorCQloZXZjLT5tZW1fc2F2aW5nX21vZGU7CisJbmV3X3BpYy0+Yml0X2RlcHRoX2x1bWEgPQorCQloZXZjLT5iaXRfZGVwdGhfbHVtYTsKKwluZXdfcGljLT5iaXRfZGVwdGhfY2hyb21hID0KKwkJaGV2Yy0+Yml0X2RlcHRoX2Nocm9tYTsKKwluZXdfcGljLT52aWRlb19zaWduYWxfdHlwZSA9CisJCWhldmMtPnZpZGVvX3NpZ25hbF90eXBlOworCisJbmV3X3BpYy0+Y29uZm9ybWFuY2Vfd2luZG93X2ZsYWcgPQorCQloZXZjLT5wYXJhbS5wLmNvbmZvcm1hbmNlX3dpbmRvd19mbGFnOworCW5ld19waWMtPmNvbmZfd2luX2xlZnRfb2Zmc2V0ID0KKwkJaGV2Yy0+cGFyYW0ucC5jb25mX3dpbl9sZWZ0X29mZnNldDsKKwluZXdfcGljLT5jb25mX3dpbl9yaWdodF9vZmZzZXQgPQorCQloZXZjLT5wYXJhbS5wLmNvbmZfd2luX3JpZ2h0X29mZnNldDsKKwluZXdfcGljLT5jb25mX3dpbl90b3Bfb2Zmc2V0ID0KKwkJaGV2Yy0+cGFyYW0ucC5jb25mX3dpbl90b3Bfb2Zmc2V0OworCW5ld19waWMtPmNvbmZfd2luX2JvdHRvbV9vZmZzZXQgPQorCQloZXZjLT5wYXJhbS5wLmNvbmZfd2luX2JvdHRvbV9vZmZzZXQ7CisJbmV3X3BpYy0+Y2hyb21hX2Zvcm1hdF9pZGMgPQorCQkJaGV2Yy0+cGFyYW0ucC5jaHJvbWFfZm9ybWF0X2lkYzsKKworCWlmIChuZXdfcGljKSB7CisJCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9CisJCQkoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKiluZXdfcGljLT5jbWFfYWxsb2NfYWRkcjsKKworCQlmYi0+c3RhdHVzID0gRkJfU1RfREVDT0RFUjsKKwl9CisKKwloZXZjX3ByaW50KGhldmMsIEgyNjVfREVCVUdfQlVGTUdSLAorCQkiJXM6IGluZGV4ICVkLCBidWZfaWR4ICVkLCBkZWNvZGVfaWR4ICVkLCBQT0MgJWRcbiIsCisJCV9fZnVuY19fLCBuZXdfcGljLT5pbmRleCwKKwkJbmV3X3BpYy0+QlVGX2luZGV4LCBuZXdfcGljLT5kZWNvZGVfaWR4LAorCQluZXdfcGljLT5QT0MpOworCisJcmV0dXJuIG5ld19waWM7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2Rpc3BsYXlfcGljX251bShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWludCBpOworCXN0cnVjdCBQSUNfcyAqcGljOworCWludCBudW0gPSAwOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9SRUZfUElDX05VTTsgaSsrKSB7CisJCXBpYyA9IGhldmMtPm1fUElDW2ldOworCQlpZiAocGljID09IE5VTEwgfHwKKwkJCXBpYy0+aW5kZXggPT0gLTEpCisJCQljb250aW51ZTsKKworCQlpZiAocGljLT5vdXRwdXRfcmVhZHkgPT0gMSkKKwkJCW51bSsrOworCX0KKwlyZXR1cm4gbnVtOworfQorCitzdGF0aWMgdm9pZCBmbHVzaF9vdXRwdXQoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Yywgc3RydWN0IFBJQ19zICpwaWMpCit7CisJc3RydWN0IFBJQ19zICpwaWNfZGlzcGxheTsKKworCWlmIChwaWMpIHsKKwkJLypQQiBza2lwIGNvbnRyb2wgKi8KKwkJaWYgKHBpYy0+ZXJyb3JfbWFyayA9PSAwICYmIGhldmMtPlBCX3NraXBfbW9kZSA9PSAxKSB7CisJCQkvKiBzdGFydCBkZWNvZGluZyBhZnRlciBmaXJzdCBJICovCisJCQloZXZjLT5pZ25vcmVfYnVmbWdyX2Vycm9yIHw9IDB4MTsKKwkJfQorCQlpZiAoaGV2Yy0+aWdub3JlX2J1Zm1ncl9lcnJvciAmIDEpIHsKKwkJCWlmIChoZXZjLT5QQl9za2lwX2NvdW50X2FmdGVyX2RlY29kaW5nID4gMCkKKwkJCQloZXZjLT5QQl9za2lwX2NvdW50X2FmdGVyX2RlY29kaW5nLS07CisJCQllbHNlIHsKKwkJCQkvKiBzdGFydCBkaXNwbGF5aW5nICovCisJCQkJaGV2Yy0+aWdub3JlX2J1Zm1ncl9lcnJvciB8PSAweDI7CisJCQl9CisJCX0KKwkJaWYgKHBpYy0+UE9DICE9IElOVkFMSURfUE9DICYmICFwaWMtPmlwX21vZGUpCisJCQlwaWMtPm91dHB1dF9tYXJrID0gMTsKKwkJcGljLT5yZWNvbl9tYXJrID0gMTsKKwl9CisJZG8geworCQlwaWNfZGlzcGxheSA9IG91dHB1dF9waWMoaGV2YywgMSk7CisKKwkJaWYgKHBpY19kaXNwbGF5KSB7CisJCQlwaWNfZGlzcGxheS0+cmVmZXJlbmNlZCA9IDA7CisJCQlwdXRfbXZfYnVmKGhldmMsIHBpY19kaXNwbGF5KTsKKwkJCWlmICgocGljX2Rpc3BsYXktPmVycm9yX21hcmsKKwkJCQkgJiYgKChoZXZjLT5pZ25vcmVfYnVmbWdyX2Vycm9yICYgMHgyKSA9PSAwKSkKKwkJCQl8fCAoZ2V0X2RiZ19mbGFnKGhldmMpICYKKwkJCQkJSDI2NV9ERUJVR19ESVNQTEFZX0NVUl9GUkFNRSkKKwkJCQl8fCAoZ2V0X2RiZ19mbGFnKGhldmMpICYKKwkJCQkJSDI2NV9ERUJVR19OT19ESVNQTEFZKSkgeworCQkJCXBpY19kaXNwbGF5LT5vdXRwdXRfcmVhZHkgPSAwOworCQkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikgeworCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCSJbQk1dIERpc3BsYXk6IFBPQyAlZCwgIiwKKwkJCQkJIHBpY19kaXNwbGF5LT5QT0MpOworCQkJCQloZXZjX3ByaW50X2NvbnQoaGV2YywgMCwKKwkJCQkJImRlY29kaW5nIGluZGV4ICVkID09PiAiLAorCQkJCQkgcGljX2Rpc3BsYXktPmRlY29kZV9pZHgpOworCQkJCQloZXZjX3ByaW50X2NvbnQoaGV2YywgMCwKKwkJCQkJIkRlYnVnIG1vZGUgb3IgZXJyb3IsIHJlY3ljbGUgaXRcbiIpOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIEhlcmUgdGhlIHBpYy9mcmFtZSBlcnJvcl9tYXJrIGlzIDEsCisJCQkJICogYW5kIGl0IHdvbid0IGJlIGRpc3BsYXllZCwgc28gaW5jcmVhc2UKKwkJCQkgKiB0aGUgZHJvcCBjb3VudAorCQkJCSAqLworCQkJCWhldmMtPmd2cy0+ZHJvcF9mcmFtZV9jb3VudCsrOworCQkJCWlmIChwaWNfZGlzcGxheS0+c2xpY2VfdHlwZSA9PSBJX1NMSUNFKSB7CisJCQkJCWhldmMtPmd2cy0+aV9sb3N0X2ZyYW1lcysrOworCQkJCX0gZWxzZSBpZiAocGljX2Rpc3BsYXktPnNsaWNlX3R5cGUgPT0gUF9TTElDRSkgeworCQkJCQloZXZjLT5ndnMtPnBfbG9zdF9mcmFtZXMrKzsKKwkJCQl9IGVsc2UgaWYgKHBpY19kaXNwbGF5LT5zbGljZV90eXBlID09IEJfU0xJQ0UpIHsKKwkJCQkJaGV2Yy0+Z3ZzLT5iX2xvc3RfZnJhbWVzKys7CisJCQkJfQorCQkJCS8qIGVycm9yIGZyYW1lIGNvdW50IGFsc28gbmVlZCBpbmNyZWFzZSAqLworCQkJCWhldmMtPmd2cy0+ZXJyb3JfZnJhbWVfY291bnQrKzsKKwkJCQlpZiAocGljX2Rpc3BsYXktPnNsaWNlX3R5cGUgPT0gSV9TTElDRSkgeworCQkJCQloZXZjLT5ndnMtPmlfY29uY2VhbGVkX2ZyYW1lcysrOworCQkJCX0gZWxzZSBpZiAocGljX2Rpc3BsYXktPnNsaWNlX3R5cGUgPT0gUF9TTElDRSkgeworCQkJCQloZXZjLT5ndnMtPnBfY29uY2VhbGVkX2ZyYW1lcysrOworCQkJCX0gZWxzZSBpZiAocGljX2Rpc3BsYXktPnNsaWNlX3R5cGUgPT0gQl9TTElDRSkgeworCQkJCQloZXZjLT5ndnMtPmJfY29uY2VhbGVkX2ZyYW1lcysrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGhldmMtPmlfb25seSAmIDB4MQorCQkJCQkmJiBwaWNfZGlzcGxheS0+c2xpY2VfdHlwZSAhPSAyKSB7CisJCQkJCXBpY19kaXNwbGF5LT5vdXRwdXRfcmVhZHkgPSAwOworCQkJCX0gZWxzZSB7CisJCQkJCXByZXBhcmVfZGlzcGxheV9idWYoaHdfdG9fdmRlYyhoZXZjKSwgcGljX2Rpc3BsYXkpOworCQkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpCisJCQkJCQkmIEgyNjVfREVCVUdfQlVGTUdSKSB7CisJCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCQkiW0JNXSBmbHVzaCBEaXNwbGF5OiBQT0MgJWQsICIsCisJCQkJCQkgcGljX2Rpc3BsYXktPlBPQyk7CisJCQkJCQloZXZjX3ByaW50X2NvbnQoaGV2YywgMCwKKwkJCQkJCSJkZWNvZGluZyBpbmRleCAlZFxuIiwKKwkJCQkJCSBwaWNfZGlzcGxheS0+ZGVjb2RlX2lkeCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9IHdoaWxlIChwaWNfZGlzcGxheSk7CisJY2xlYXJfcmVmZXJlbmNlZF9mbGFnKGhldmMpOworfQorCisvKgorKiBkdl9tZXRhX2ZsYWc6IDEsIGRvbGJ5IG1ldGEgb25seTsgMiwgbm90IGluY2x1ZGUgZG9sYnkgbWV0YQorKi8KK3N0YXRpYyB2b2lkIHNldF9hdXhfZGF0YShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCXN0cnVjdCBQSUNfcyAqcGljLCB1bnNpZ25lZCBjaGFyIHN1ZmZpeF9mbGFnLAorCXVuc2lnbmVkIGNoYXIgZHZfbWV0YV9mbGFnKQoreworCWludCBpOworCXVuc2lnbmVkIHNob3J0ICphdXhfYWRyOworCXVuc2lnbmVkIGludCBzaXplX3JlZ192YWwgPQorCQlSRUFEX1ZSRUcoSEVWQ19BVVhfREFUQV9TSVpFKTsKKwl1bnNpZ25lZCBpbnQgYXV4X2NvdW50ID0gMDsKKwlpbnQgYXV4X3NpemUgPSAwOworCWlmIChwaWMgPT0gTlVMTCB8fCAwID09IGF1eF9kYXRhX2lzX2F2YWlibGUoaGV2YykpCisJCXJldHVybjsKKworCWlmIChoZXZjLT5hdXhfZGF0YV9kaXJ0eSB8fAorCQloZXZjLT5tX2luc19mbGFnID09IDApIHsKKworCQloZXZjLT5hdXhfZGF0YV9kaXJ0eSA9IDA7CisJfQorCisJaWYgKHN1ZmZpeF9mbGFnKSB7CisJCWF1eF9hZHIgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCShoZXZjLT5hdXhfYWRkciArCisJCQloZXZjLT5wcmVmaXhfYXV4X3NpemUpOworCQlhdXhfY291bnQgPQorCQkoKHNpemVfcmVnX3ZhbCAmIDB4ZmZmZikgPDwgNCkKKwkJCT4+IDE7CisJCWF1eF9zaXplID0KKwkJCWhldmMtPnN1ZmZpeF9hdXhfc2l6ZTsKKwl9IGVsc2UgeworCQlhdXhfYWRyID0KKwkJKHVuc2lnbmVkIHNob3J0ICopaGV2Yy0+YXV4X2FkZHI7CisJCWF1eF9jb3VudCA9CisJCSgoc2l6ZV9yZWdfdmFsID4+IDE2KSA8PCA0KQorCQkJPj4gMTsKKwkJYXV4X3NpemUgPQorCQkJaGV2Yy0+cHJlZml4X2F1eF9zaXplOworCX0KKwlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19QUklOVF9TRUkpIHsKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJIiVzOnBpYyAweCVwIG9sZCBzaXplICVkIGNvdW50ICVkLHN1ZiAlZCBkdl9mbGFnICVkXHJcbiIsCisJCQlfX2Z1bmNfXywgcGljLCBwaWMtPmF1eF9kYXRhX3NpemUsCisJCQlhdXhfY291bnQsIHN1ZmZpeF9mbGFnLCBkdl9tZXRhX2ZsYWcpOworCX0KKworCWlmIChhdXhfY291bnQgPiBhdXhfc2l6ZSkgeworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiJXM6YXV4X2NvdW50KCVkKSBpcyBvdmVyIHNpemVcbiIsIF9fZnVuY19fLCBhdXhfY291bnQpOworCQlhdXhfY291bnQgPSAwOworCX0KKwlpZiAoYXV4X3NpemUgPiAwICYmIGF1eF9jb3VudCA+IDApIHsKKwkJaW50IGhlYWRzX3NpemUgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBhdXhfY291bnQ7IGkrKykgeworCQkJdW5zaWduZWQgY2hhciB0YWcgPSBhdXhfYWRyW2ldID4+IDg7CisJCQlpZiAodGFnICE9IDAgJiYgdGFnICE9IDB4ZmYpIHsKKwkJCQlpZiAoZHZfbWV0YV9mbGFnID09IDApCisJCQkJCWhlYWRzX3NpemUgKz0gODsKKwkJCQllbHNlIGlmIChkdl9tZXRhX2ZsYWcgPT0gMSAmJiB0YWcgPT0gMHgxKQorCQkJCQloZWFkc19zaXplICs9IDg7CisJCQkJZWxzZSBpZiAoZHZfbWV0YV9mbGFnID09IDIgJiYgdGFnICE9IDB4MSkKKwkJCQkJaGVhZHNfc2l6ZSArPSA4OworCQkJfQorCQl9CisKKwkJaWYgKHBpYy0+YXV4X2RhdGFfYnVmKSB7CisJCQl1bnNpZ25lZCBjaGFyIHZhbGlkX3RhZyA9IDA7CisJCQl1bnNpZ25lZCBjaGFyICpoID0KKwkJCQlwaWMtPmF1eF9kYXRhX2J1ZiArCisJCQkJcGljLT5hdXhfZGF0YV9zaXplOworCQkJdW5zaWduZWQgY2hhciAqcCA9IGggKyA4OworCQkJaW50IGxlbiA9IDA7CisJCQlpbnQgcGFkZGluZ19sZW4gPSAwOworCisJCQlmb3IgKGkgPSAwOyBpIDwgYXV4X2NvdW50OyBpICs9IDQpIHsKKwkJCQlpbnQgaWk7CisJCQkJdW5zaWduZWQgY2hhciB0YWcgPSBhdXhfYWRyW2kgKyAzXSA+PiA4OworCQkJCWlmICh0YWcgIT0gMCAmJiB0YWcgIT0gMHhmZikgeworCQkJCQlpZiAoZHZfbWV0YV9mbGFnID09IDApCisJCQkJCQl2YWxpZF90YWcgPSAxOworCQkJCQllbHNlIGlmIChkdl9tZXRhX2ZsYWcgPT0gMQorCQkJCQkJJiYgdGFnID09IDB4MSkKKwkJCQkJCXZhbGlkX3RhZyA9IDE7CisJCQkJCWVsc2UgaWYgKGR2X21ldGFfZmxhZyA9PSAyCisJCQkJCQkmJiB0YWcgIT0gMHgxKQorCQkJCQkJdmFsaWRfdGFnID0gMTsKKwkJCQkJZWxzZQorCQkJCQkJdmFsaWRfdGFnID0gMDsKKwkJCQkJaWYgKHZhbGlkX3RhZyAmJiBsZW4gPiAwKSB7CisJCQkJCQlwaWMtPmF1eF9kYXRhX3NpemUgKz0KKwkJCQkJCShsZW4gKyA4KTsKKwkJCQkJCWhbMF0gPSAobGVuID4+IDI0KQorCQkJCQkJJiAweGZmOworCQkJCQkJaFsxXSA9IChsZW4gPj4gMTYpCisJCQkJCQkmIDB4ZmY7CisJCQkJCQloWzJdID0gKGxlbiA+PiA4KQorCQkJCQkJJiAweGZmOworCQkJCQkJaFszXSA9IChsZW4gPj4gMCkKKwkJCQkJCSYgMHhmZjsKKwkJCQkJCWhbNl0gPQorCQkJCQkJKHBhZGRpbmdfbGVuID4+IDgpCisJCQkJCQkmIDB4ZmY7CisJCQkJCQloWzddID0gKHBhZGRpbmdfbGVuKQorCQkJCQkJJiAweGZmOworCQkJCQkJaCArPSAobGVuICsgOCk7CisJCQkJCQlwICs9IDg7CisJCQkJCQlsZW4gPSAwOworCQkJCQkJcGFkZGluZ19sZW4gPSAwOworCQkJCQl9CisJCQkJCWlmICh2YWxpZF90YWcpIHsKKwkJCQkJCWhbNF0gPSB0YWc7CisJCQkJCQloWzVdID0gMDsKKwkJCQkJCWhbNl0gPSAwOworCQkJCQkJaFs3XSA9IDA7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKHZhbGlkX3RhZykgeworCQkJCQlmb3IgKGlpID0gMDsgaWkgPCA0OyBpaSsrKSB7CisJCQkJCQl1bnNpZ25lZCBzaG9ydCBhYSA9CisJCQkJCQkJYXV4X2FkcltpICsgMworCQkJCQkJCS0gaWldOworCQkJCQkJKnAgPSBhYSAmIDB4ZmY7CisJCQkJCQlwKys7CisJCQkJCQlsZW4rKzsKKwkJCQkJCS8qaWYgKChhYSA+PiA4KSA9PSAweGZmKQorCQkJCQkJCXBhZGRpbmdfbGVuKys7Ki8KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChsZW4gPiAwKSB7CisJCQkJcGljLT5hdXhfZGF0YV9zaXplICs9IChsZW4gKyA4KTsKKwkJCQloWzBdID0gKGxlbiA+PiAyNCkgJiAweGZmOworCQkJCWhbMV0gPSAobGVuID4+IDE2KSAmIDB4ZmY7CisJCQkJaFsyXSA9IChsZW4gPj4gOCkgJiAweGZmOworCQkJCWhbM10gPSAobGVuID4+IDApICYgMHhmZjsKKwkJCQloWzZdID0gKHBhZGRpbmdfbGVuID4+IDgpICYgMHhmZjsKKwkJCQloWzddID0gKHBhZGRpbmdfbGVuKSAmIDB4ZmY7CisJCQl9CisJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19QUklOVF9TRUkpIHsKKwkJCQlQUl9JTklUKDEyOCk7CisJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkiYXV4OiAoc2l6ZSAlZCkgc3VmZml4X2ZsYWcgJWRcbiIsCisJCQkJCXBpYy0+YXV4X2RhdGFfc2l6ZSwgc3VmZml4X2ZsYWcpOworCQkJCWZvciAoaSA9IDA7IGkgPCBwaWMtPmF1eF9kYXRhX3NpemU7IGkrKykgeworCQkJCQlQUl9GSUxMKCIlMDJ4ICIsIHBpYy0+YXV4X2RhdGFfYnVmW2ldKTsKKwkJCQkJaWYgKCgoaSArIDEpICYgMHhmKSA9PSAwKQorCQkJCQkJUFJfSU5GTyhoZXZjLT5pbmRleCk7CisJCQkJfQorCQkJCVBSX0lORk8oaGV2Yy0+aW5kZXgpOworCQkJfQorCQl9CisJfQorCit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfYXV4X2RhdGEoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwlzdHJ1Y3QgUElDX3MgKnBpYykKK3sKKyNpZiAwCisJaWYgKHBpYy0+YXV4X2RhdGFfYnVmKSB7CisJCXZmcmVlKHBpYy0+YXV4X2RhdGFfYnVmKTsKKwkJaWYgKChydW5fY291bnRbaGV2Yy0+aW5kZXhdICYgNjMpID09IDApCisJCQl2bV91bm1hcF9hbGlhc2VzKCk7CisJfQorCXBpYy0+YXV4X2RhdGFfYnVmID0gTlVMTDsKKwlwaWMtPmF1eF9kYXRhX3NpemUgPSAwOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgcmVjeWNsZV9tbXVfYnVmX3RhaWwoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwkJYm9vbCBjaGVja19kbWEpCit7CisJaGV2Y19wcmludChoZXZjLAorCQkJSDI2NV9ERUJVR19CVUZNR1JfTU9SRSwKKwkJCSIlcyBwaWMgaW5kZXggJWQgc2NhdHRlcl9hbGxvYyAlZCBwYWdlX3N0YXJ0ICVkXG4iLAorCQkJImRlY29kZXJfbW11X2JveF9mcmVlX2lkeF90YWlsIiwKKwkJCWhldmMtPmN1cl9waWMtPmluZGV4LAorCQkJaGV2Yy0+Y3VyX3BpYy0+c2NhdHRlcl9hbGxvYywKKwkJCWhldmMtPnVzZWRfNGtfbnVtKTsKKwlpZiAoY2hlY2tfZG1hKQorCQloZXZjX21tdV9kbWFfY2hlY2soaHdfdG9fdmRlYyhoZXZjKSk7CisKKwlpZiAoaGV2Yy0+aXNfdXNlZF92NGwpIHsKKwkJaW50IGluZGV4ID0gaGV2Yy0+Y3VyX3BpYy0+QlVGX2luZGV4OworCQlzdHJ1Y3QgaW50ZXJuYWxfY29tcF9idWYgKmlidWYgPQorCQkJaW5kZXhfdG9faWNvbXBfYnVmKGhldmMsIGluZGV4KTsKKworCQlkZWNvZGVyX21tdV9ib3hfZnJlZV9pZHhfdGFpbCgKKwkJCQlpYnVmLT5tbXVfYm94LAorCQkJCWlidWYtPmluZGV4LAorCQkJCWhldmMtPnVzZWRfNGtfbnVtKTsKKwl9IGVsc2UgeworCQlkZWNvZGVyX21tdV9ib3hfZnJlZV9pZHhfdGFpbCgKKwkJCQloZXZjLT5tbXVfYm94LAorCQkJCWhldmMtPmN1cl9waWMtPmluZGV4LAorCQkJCWhldmMtPnVzZWRfNGtfbnVtKTsKKwl9CisJaGV2Yy0+Y3VyX3BpYy0+c2NhdHRlcl9hbGxvYyA9IDI7CisJaGV2Yy0+dXNlZF80a19udW0gPSAtMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGhldmNfcHJlX3BpYyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCQkJc3RydWN0IFBJQ19zICpwaWMpCit7CisKKwkvKiBwcmV2IHBpYyAqLworCS8qaWYgKGhldmMtPmN1cnJfUE9DICE9IDApIHsqLworCWludCBkZWNvZGVkX3BvYyA9IGhldmMtPmlQcmV2UE9DOworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlpZiAoaGV2Yy0+bV9pbnNfZmxhZykgeworCQlkZWNvZGVkX3BvYyA9IGhldmMtPmRlY29kZWRfcG9jOworCQloZXZjLT5kZWNvZGVkX3BvYyA9IElOVkFMSURfUE9DOworCX0KKyNlbmRpZgorCWlmIChoZXZjLT5tX25hbFVuaXRUeXBlICE9IE5BTF9VTklUX0NPREVEX1NMSUNFX0lEUgorCQkJJiYgaGV2Yy0+bV9uYWxVbml0VHlwZSAhPQorCQkJTkFMX1VOSVRfQ09ERURfU0xJQ0VfSURSX05fTFApIHsKKwkJc3RydWN0IFBJQ19zICpwaWNfZGlzcGxheTsKKworCQlwaWMgPSBnZXRfcGljX2J5X1BPQyhoZXZjLCBkZWNvZGVkX3BvYyk7CisJCWlmIChwaWMgJiYgKHBpYy0+UE9DICE9IElOVkFMSURfUE9DKSkgeworCQkJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaGV2Yyk7CisKKwkJCS8qUEIgc2tpcCBjb250cm9sICovCisJCQlpZiAocGljLT5lcnJvcl9tYXJrID09IDAKKwkJCQkJJiYgaGV2Yy0+UEJfc2tpcF9tb2RlID09IDEpIHsKKwkJCQkvKiBzdGFydCBkZWNvZGluZyBhZnRlcgorCQkJCSAqICAgZmlyc3QgSQorCQkJCSAqLworCQkJCWhldmMtPmlnbm9yZV9idWZtZ3JfZXJyb3IgfD0gMHgxOworCQkJfQorCQkJaWYgKGhldmMtPmlnbm9yZV9idWZtZ3JfZXJyb3IgJiAxKSB7CisJCQkJaWYgKGhldmMtPlBCX3NraXBfY291bnRfYWZ0ZXJfZGVjb2RpbmcgPiAwKSB7CisJCQkJCWhldmMtPlBCX3NraXBfY291bnRfYWZ0ZXJfZGVjb2RpbmctLTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBzdGFydCBkaXNwbGF5aW5nICovCisJCQkJCWhldmMtPmlnbm9yZV9idWZtZ3JfZXJyb3IgfD0gMHgyOworCQkJCX0KKwkJCX0KKwkJCWlmIChoZXZjLT5tbXVfZW5hYmxlCisJCQkJJiYgKChoZXZjLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MTApID09IDApKSB7CisJCQkJaWYgKCFoZXZjLT5tX2luc19mbGFnKSB7CisJCQkJCWhldmMtPnVzZWRfNGtfbnVtID0KKwkJCQkJUkVBRF9WUkVHKEhFVkNfU0FPX01NVV9TVEFUVVMpID4+IDE2OworCisJCQkJCWlmICgoIWlzX3NraXBfZGVjb2RpbmcoaGV2YywgcGljKSkgJiYKKwkJCQkJCShoZXZjLT51c2VkXzRrX251bSA+PSAwKSAmJgorCQkJCQkJKGhldmMtPmN1cl9waWMtPnNjYXR0ZXJfYWxsb2MKKwkJCQkJCT09IDEpKSB7CisJCQkJCQlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5kZWNvZGVfaGVhZGVyX21lbW9yeV90aW1lX25hbWUsIFRSQUNFX0hFQURFUl9NRU1PUllfU1RBUlQpOworCQkJCQkJcmVjeWNsZV9tbXVfYnVmX3RhaWwoaGV2YywgdHJ1ZSk7CisJCQkJCQlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5kZWNvZGVfaGVhZGVyX21lbW9yeV90aW1lX25hbWUsIFRSQUNFX0hFQURFUl9NRU1PUllfRU5EKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmICghcGljLT5pcF9tb2RlKQorCQkJCXBpYy0+b3V0cHV0X21hcmsgPSAxOworCQkJcGljLT5yZWNvbl9tYXJrID0gMTsKKwkJCXBpYy0+ZGlzX21hcmsgPSAxOworCQkJaWYgKHZkZWMtPm12ZnJtKSB7CisJCQkJcGljLT5mcmFtZV9zaXplID0gdmRlYy0+bXZmcm0tPmZyYW1lX3NpemU7CisJCQkJcGljLT5od19kZWNvZGVfdGltZSA9ICh1MzIpdmRlYy0+bXZmcm0tPmh3X2RlY29kZV90aW1lOworCQkJfQorCQl9CisJCWRvIHsKKwkJCXBpY19kaXNwbGF5ID0gb3V0cHV0X3BpYyhoZXZjLCAwKTsKKworCQkJaWYgKHBpY19kaXNwbGF5KSB7CisJCQkJaWYgKChwaWNfZGlzcGxheS0+ZXJyb3JfbWFyayAmJgorCQkJCQkoKGhldmMtPmlnbm9yZV9idWZtZ3JfZXJyb3IgJgorCQkJCQkJCSAgMHgyKSA9PSAwKSkKKwkJCQkJfHwgKGdldF9kYmdfZmxhZyhoZXZjKSAmCisJCQkJCQlIMjY1X0RFQlVHX0RJU1BMQVlfQ1VSX0ZSQU1FKQorCQkJCQl8fCAoZ2V0X2RiZ19mbGFnKGhldmMpICYKKwkJCQkJCUgyNjVfREVCVUdfTk9fRElTUExBWSkpIHsKKwkJCQkJcGljX2Rpc3BsYXktPm91dHB1dF9yZWFkeSA9IDA7CisJCQkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJgorCQkJCQkJSDI2NV9ERUJVR19CVUZNR1IpIHsKKwkJCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJCSJbQk1dIERpc3BsYXk6IFBPQyAlZCwgIiwKKwkJCQkJCQkgcGljX2Rpc3BsYXktPlBPQyk7CisJCQkJCQloZXZjX3ByaW50X2NvbnQoaGV2YywgMCwKKwkJCQkJCSJkZWNvZGluZyBpbmRleCAlZCA9PT4gIiwKKwkJCQkJCQkgcGljX2Rpc3BsYXktPgorCQkJCQkJCSBkZWNvZGVfaWR4KTsKKwkJCQkJCWhldmNfcHJpbnRfY29udChoZXZjLCAwLAorCQkJCQkJIkRlYnVnIG9yIGVycixyZWN5Y2xlIGl0XG4iKTsKKwkJCQkJfQorCQkJCQkvKgorCQkJCQkgKiBIZXJlIHRoZSBwaWMvZnJhbWUgZXJyb3JfbWFyayBpcyAxLAorCQkJCQkgKiBhbmQgaXQgd29uJ3QgYmUgZGlzcGxheWVkLCBzbyBpbmNyZWFzZQorCQkJCQkgKiB0aGUgZHJvcCBjb3VudAorCQkJCQkgKi8KKwkJCQkJaGV2Yy0+Z3ZzLT5kcm9wX2ZyYW1lX2NvdW50Kys7CisJCQkJCWlmIChwaWNfZGlzcGxheS0+c2xpY2VfdHlwZSA9PSBJX1NMSUNFKSB7CisJCQkJCQloZXZjLT5ndnMtPmlfbG9zdF9mcmFtZXMrKzsKKwkJCQkJfWVsc2UgaWYgKHBpY19kaXNwbGF5LT5zbGljZV90eXBlID09IFBfU0xJQ0UpIHsKKwkJCQkJCWhldmMtPmd2cy0+cF9sb3N0X2ZyYW1lcysrOworCQkJCQl9IGVsc2UgaWYgKHBpY19kaXNwbGF5LT5zbGljZV90eXBlID09IEJfU0xJQ0UpIHsKKwkJCQkJCWhldmMtPmd2cy0+Yl9sb3N0X2ZyYW1lcysrOworCQkJCQl9CisJCQkJCS8qIGVycm9yIGZyYW1lIGNvdW50IGFsc28gbmVlZCBpbmNyZWFzZSAqLworCQkJCQloZXZjLT5ndnMtPmVycm9yX2ZyYW1lX2NvdW50Kys7CisJCQkJCWlmIChwaWNfZGlzcGxheS0+c2xpY2VfdHlwZSA9PSBJX1NMSUNFKSB7CisJCQkJCQloZXZjLT5ndnMtPmlfY29uY2VhbGVkX2ZyYW1lcysrOworCQkJCQl9IGVsc2UgaWYgKHBpY19kaXNwbGF5LT5zbGljZV90eXBlID09IFBfU0xJQ0UpIHsKKwkJCQkJCWhldmMtPmd2cy0+cF9jb25jZWFsZWRfZnJhbWVzKys7CisJCQkJCX0gZWxzZSBpZiAocGljX2Rpc3BsYXktPnNsaWNlX3R5cGUgPT0gQl9TTElDRSkgeworCQkJCQkJaGV2Yy0+Z3ZzLT5iX2NvbmNlYWxlZF9mcmFtZXMrKzsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmIChoZXZjLT5pX29ubHkgJiAweDEKKwkJCQkJCSYmIHBpY19kaXNwbGF5LT4KKwkJCQkJCXNsaWNlX3R5cGUgIT0gMikgeworCQkJCQkJcGljX2Rpc3BsYXktPm91dHB1dF9yZWFkeSA9IDA7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcmVwYXJlX2Rpc3BsYXlfYnVmCisJCQkJCQkJKGh3X3RvX3ZkZWMoaGV2YyksCisJCQkJCQkJIHBpY19kaXNwbGF5KTsKKwkJCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmCisJCQkJCQlIMjY1X0RFQlVHX0JVRk1HUikgeworCQkJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkJIltCTV0gRGlzcGxheTogUE9DICVkLCAiLAorCQkJCQkJCSBwaWNfZGlzcGxheS0+UE9DKTsKKwkJCQkJCQloZXZjX3ByaW50X2NvbnQoaGV2YywgMCwKKwkJCQkJCQkiZGVjb2RpbmcgaW5kZXggJWRcbiIsCisJCQkJCQkJIHBpY19kaXNwbGF5LT4KKwkJCQkJCQkgZGVjb2RlX2lkeCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gd2hpbGUgKHBpY19kaXNwbGF5KTsKKwl9IGVsc2UgeworCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1IpIHsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJbQk1dIGN1cnJlbnQgcGljIGlzIElEUiwgIik7CisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiY2xlYXIgcmVmZXJlbmNlZCBmbGFnIG9mIGFsbCBidWZmZXJzXG4iKTsKKwkJfQorCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1JfTU9SRSkKKwkJCWR1bXBfcGljX2xpc3QoaGV2Yyk7CisJCWlmIChhdG9taWNfcmVhZCgmaGV2Yy0+dmZfcHJlX2NvdW50KSA9PSAxICYmCisJCQkJaGV2Yy0+Zmlyc3RfcGljX2ZsYWcgPT0gMSkgeworCQkJaGV2Yy0+Zmlyc3RfcGljX2ZsYWcgPSAyOworCQkJcGljID0gTlVMTDsKKwkJfQorCQllbHNlCisJCQlwaWMgPSBnZXRfcGljX2J5X1BPQyhoZXZjLCBkZWNvZGVkX3BvYyk7CisKKwkJZmx1c2hfb3V0cHV0KGhldmMsIHBpYyk7CisJfQorCit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3BpY19kZWNvZGVkX2Vycm9yX3ByZShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCWludCBkZWNvZGVkX2xjdSkKK3sKKwlpbnQgY3VycmVudF9sY3VfaWR4ID0gZGVjb2RlZF9sY3U7CisJaWYgKGRlY29kZWRfbGN1IDwgMCkKKwkJcmV0dXJuOworCisJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKSB7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJjdXIgbGN1IGlkeCA9ICVkLCAodG90YWwgJWQpXG4iLAorCQkJY3VycmVudF9sY3VfaWR4LCBoZXZjLT5sY3VfdG90YWwpOworCX0KKwlpZiAoKGVycm9yX2hhbmRsZV9wb2xpY3kgJiAweDIwKSA9PSAwICYmIGhldmMtPmN1cl9waWMgIT0gTlVMTCkgeworCQlpZiAoaGV2Yy0+Zmlyc3RfcGljX2FmdGVyX3JlY292ZXIpIHsKKwkJCWlmIChjdXJyZW50X2xjdV9pZHggIT0KKwkJCSAoKGhldmMtPmxjdV94X251bV9wcmUqaGV2Yy0+bGN1X3lfbnVtX3ByZSkgLSAxKSkKKwkJCQloZXZjLT5jdXJfcGljLT5lcnJvcl9tYXJrID0gMTsKKwkJfSBlbHNlIHsKKwkJCWlmIChoZXZjLT5sY3VfeF9udW1fcHJlICE9IDAKKwkJCSAmJiBoZXZjLT5sY3VfeV9udW1fcHJlICE9IDAKKwkJCSAmJiBjdXJyZW50X2xjdV9pZHggIT0gMAorCQkJICYmIGN1cnJlbnRfbGN1X2lkeCA8CisJCQkgKChoZXZjLT5sY3VfeF9udW1fcHJlKmhldmMtPmxjdV95X251bV9wcmUpIC0gMSkpCisJCQkJaGV2Yy0+Y3VyX3BpYy0+ZXJyb3JfbWFyayA9IDE7CisJCX0KKwkJaWYgKGhldmMtPmN1cl9waWMtPmVycm9yX21hcmspIHsKKwkJCWlmIChwcmludF9sY3VfZXJyb3IpCisJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkiY3VyIGxjdSBpZHggPSAlZCwgKHRvdGFsICVkKSwgc2V0IGVycm9yX21hcmtcbiIsCisJCQkJCWN1cnJlbnRfbGN1X2lkeCwKKwkJCQkJaGV2Yy0+bGN1X3hfbnVtX3ByZSpoZXZjLT5sY3VfeV9udW1fcHJlKTsKKwkJCWlmIChpc19sb2dfZW5hYmxlKGhldmMpKQorCQkJCWFkZF9sb2coaGV2YywKKwkJCQkJImN1ciBsY3UgaWR4ID0gJWQsICh0b3RhbCAlZCksIHNldCBlcnJvcl9tYXJrIiwKKwkJCQkJY3VycmVudF9sY3VfaWR4LAorCQkJCQloZXZjLT5sY3VfeF9udW1fcHJlICoKKwkJCQkJICAgIGhldmMtPmxjdV95X251bV9wcmUpOworCisJCX0KKworCX0KKwlpZiAoaGV2Yy0+Y3VyX3BpYyAmJiBoZXZjLT5oZWFkX2Vycm9yX2ZsYWcpIHsKKwkJaGV2Yy0+Y3VyX3BpYy0+ZXJyb3JfbWFyayA9IDE7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJoZWFkIGhhcyBlcnJvciwgc2V0IGVycm9yX21hcmtcbiIpOworCX0KKworCWlmICgoZXJyb3JfaGFuZGxlX3BvbGljeSAmIDB4ODApID09IDApIHsKKwkJaWYgKGhldmMtPm92ZXJfZGVjb2RlICYmIGhldmMtPmN1cl9waWMpIHsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkib3ZlciBkZWNvZGUsIHNldCBlcnJvcl9tYXJrXG4iKTsKKwkJCWhldmMtPmN1cl9waWMtPmVycm9yX21hcmsgPSAxOworCQl9CisJfQorCisJaGV2Yy0+bGN1X3hfbnVtX3ByZSA9IGhldmMtPmxjdV94X251bTsKKwloZXZjLT5sY3VfeV9udW1fcHJlID0gaGV2Yy0+bGN1X3lfbnVtOworfQorCitzdGF0aWMgdm9pZCBjaGVja19waWNfZGVjb2RlZF9lcnJvcihzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCWludCBkZWNvZGVkX2xjdSkKK3sKKwlpbnQgY3VycmVudF9sY3VfaWR4ID0gZGVjb2RlZF9sY3U7CisJaWYgKGRlY29kZWRfbGN1IDwgMCkKKwkJcmV0dXJuOworCisJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSKSB7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJjdXIgbGN1IGlkeCA9ICVkLCAodG90YWwgJWQpXG4iLAorCQkJY3VycmVudF9sY3VfaWR4LCBoZXZjLT5sY3VfdG90YWwpOworCX0KKwlpZiAoKGVycm9yX2hhbmRsZV9wb2xpY3kgJiAweDIwKSA9PSAwICYmIGhldmMtPmN1cl9waWMgIT0gTlVMTCkgeworCQlpZiAoaGV2Yy0+bGN1X3hfbnVtICE9IDAKKwkJICYmIGhldmMtPmxjdV95X251bSAhPSAwCisJCSAmJiBjdXJyZW50X2xjdV9pZHggIT0gMAorCQkgJiYgY3VycmVudF9sY3VfaWR4IDwKKwkJICgoaGV2Yy0+bGN1X3hfbnVtKmhldmMtPmxjdV95X251bSkgLSAxKSkKKwkJCWhldmMtPmN1cl9waWMtPmVycm9yX21hcmsgPSAxOworCisJCWlmIChoZXZjLT5jdXJfcGljLT5lcnJvcl9tYXJrKSB7CisJCQlpZiAocHJpbnRfbGN1X2Vycm9yKQorCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJImN1ciBsY3UgaWR4ID0gJWQsICh0b3RhbCAlZCksIHNldCBlcnJvcl9tYXJrXG4iLAorCQkJCQljdXJyZW50X2xjdV9pZHgsCisJCQkJCWhldmMtPmxjdV94X251bSpoZXZjLT5sY3VfeV9udW0pOworCQkJaWYgKCgoaGV2Yy0+aV9vbmx5ICYgMHg0KSAgPT0gMCkgJiYgaGV2Yy0+Y3VyX3BpYy0+UE9DICYmICggaGV2Yy0+Y3VyX3BpYy0+c2xpY2VfdHlwZSA9PSAwKQorCQkJCQkmJiAoKGhldmMtPmN1cl9waWMtPlBPQyArIE1BWF9CVUZfTlVNKSA8IGhldmMtPmlQcmV2UE9DKSkgeworCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCSJGbHVzaC4uIG51bV9yZW9yZGVyX3BpYyAlZCAgcGljLT5QT0MgJWQgIGhldmMtPmlQcmV2UE9DICVkXG4iLAorCQkJCQloZXZjLT5zcHNfbnVtX3Jlb3JkZXJfcGljc18wLGhldmMtPmN1cl9waWMtPlBPQyAsaGV2Yy0+aVByZXZQT0MpOworCQkJCQlmbHVzaF9vdXRwdXQoaGV2YywgZ2V0X3BpY19ieV9QT0MoaGV2YywgaGV2Yy0+Y3VyX3BpYy0+UE9DICkpOworCQkJfQorCQkJaWYgKGlzX2xvZ19lbmFibGUoaGV2YykpCisJCQkJYWRkX2xvZyhoZXZjLAorCQkJCQkiY3VyIGxjdSBpZHggPSAlZCwgKHRvdGFsICVkKSwgc2V0IGVycm9yX21hcmsiLAorCQkJCQljdXJyZW50X2xjdV9pZHgsCisJCQkJCWhldmMtPmxjdV94X251bSAqCisJCQkJCSAgICBoZXZjLT5sY3VfeV9udW0pOworCisJCX0KKworCX0KKwlpZiAoaGV2Yy0+Y3VyX3BpYyAmJiBoZXZjLT5oZWFkX2Vycm9yX2ZsYWcpIHsKKwkJaGV2Yy0+Y3VyX3BpYy0+ZXJyb3JfbWFyayA9IDE7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJoZWFkIGhhcyBlcnJvciwgc2V0IGVycm9yX21hcmtcbiIpOworCX0KKworCWlmICgoZXJyb3JfaGFuZGxlX3BvbGljeSAmIDB4ODApID09IDApIHsKKwkJaWYgKGhldmMtPm92ZXJfZGVjb2RlICYmIGhldmMtPmN1cl9waWMpIHsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkib3ZlciBkZWNvZGUsIHNldCBlcnJvcl9tYXJrXG4iKTsKKwkJCWhldmMtPmN1cl9waWMtPmVycm9yX21hcmsgPSAxOworCQl9CisJfQorfQorCisvKiBvbmx5IHdoZW4gd2UgZGVjb2RlZCBvbmUgZmllbGQgb3Igb25lIGZyYW1lLAord2UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBnZXQgcW9zIGluZm8qLworc3RhdGljIHZvaWQgZ2V0X3BpY3R1cmVfcW9zX2luZm8oc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwlzdHJ1Y3QgUElDX3MgKnBpY3R1cmUgPSBoZXZjLT5jdXJfcGljOworCisvKgorI2RlZmluZSBERUJVR19RT1MKKyovCisKKwlpZiAoIWhldmMtPmN1cl9waWMpCisJCXJldHVybjsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPCBBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQSkgeworCQl1bnNpZ25lZCBjaGFyIGFbM107CisJCXVuc2lnbmVkIGNoYXIgaSwgaiwgdDsKKwkJdW5zaWduZWQgbG9uZyAgZGF0YTsKKworCQlkYXRhID0gUkVBRF9WUkVHKEhFVkNfTVZfSU5GTyk7CisJCWlmIChwaWN0dXJlLT5zbGljZV90eXBlID09IElfU0xJQ0UpCisJCQlkYXRhID0gMDsKKwkJYVswXSA9IGRhdGEgJiAweGZmOworCQlhWzFdID0gKGRhdGEgPj4gOCkgJiAweGZmOworCQlhWzJdID0gKGRhdGEgPj4gMTYpICYgMHhmZjsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJZm9yIChqID0gaSsxOyBqIDwgMzsgaisrKSB7CisJCQkJaWYgKGFbal0gPCBhW2ldKSB7CisJCQkJCXQgPSBhW2pdOworCQkJCQlhW2pdID0gYVtpXTsKKwkJCQkJYVtpXSA9IHQ7CisJCQkJfSBlbHNlIGlmIChhW2pdID09IGFbaV0pIHsKKwkJCQkJYVtpXSsrOworCQkJCQl0ID0gYVtqXTsKKwkJCQkJYVtqXSA9IGFbaV07CisJCQkJCWFbaV0gPSB0OworCQkJCX0KKwkJCX0KKwkJcGljdHVyZS0+bWF4X212ID0gYVsyXTsKKwkJcGljdHVyZS0+YXZnX212ID0gYVsxXTsKKwkJcGljdHVyZS0+bWluX212ID0gYVswXTsKKyNpZmRlZiBERUJVR19RT1MKKwkJaGV2Y19wcmludChoZXZjLCAwLCAibXYgZGF0YSAleCAgYVswXT0gJXggYVsxXT0gJXggYVsyXT0gJXhcbiIsCisJCQlkYXRhLCBhWzBdLCBhWzFdLCBhWzJdKTsKKyNlbmRpZgorCisJCWRhdGEgPSBSRUFEX1ZSRUcoSEVWQ19RUF9JTkZPKTsKKwkJYVswXSA9IGRhdGEgJiAweDFmOworCQlhWzFdID0gKGRhdGEgPj4gOCkgJiAweDNmOworCQlhWzJdID0gKGRhdGEgPj4gMTYpICYgMHg3ZjsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJZm9yIChqID0gaSsxOyBqIDwgMzsgaisrKSB7CisJCQkJaWYgKGFbal0gPCBhW2ldKSB7CisJCQkJCXQgPSBhW2pdOworCQkJCQlhW2pdID0gYVtpXTsKKwkJCQkJYVtpXSA9IHQ7CisJCQkJfSBlbHNlIGlmIChhW2pdID09IGFbaV0pIHsKKwkJCQkJYVtpXSsrOworCQkJCQl0ID0gYVtqXTsKKwkJCQkJYVtqXSA9IGFbaV07CisJCQkJCWFbaV0gPSB0OworCQkJCX0KKwkJCX0KKwkJcGljdHVyZS0+bWF4X3FwID0gYVsyXTsKKwkJcGljdHVyZS0+YXZnX3FwID0gYVsxXTsKKwkJcGljdHVyZS0+bWluX3FwID0gYVswXTsKKyNpZmRlZiBERUJVR19RT1MKKwkJaGV2Y19wcmludChoZXZjLCAwLCAicXAgZGF0YSAleCAgYVswXT0gJXggYVsxXT0gJXggYVsyXT0gJXhcbiIsCisJCQlkYXRhLCBhWzBdLCBhWzFdLCBhWzJdKTsKKyNlbmRpZgorCisJCWRhdGEgPSBSRUFEX1ZSRUcoSEVWQ19TS0lQX0lORk8pOworCQlhWzBdID0gZGF0YSAmIDB4MWY7CisJCWFbMV0gPSAoZGF0YSA+PiA4KSAmIDB4M2Y7CisJCWFbMl0gPSAoZGF0YSA+PiAxNikgJiAweDdmOworCisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCQlmb3IgKGogPSBpKzE7IGogPCAzOyBqKyspIHsKKwkJCQlpZiAoYVtqXSA8IGFbaV0pIHsKKwkJCQkJdCA9IGFbal07CisJCQkJCWFbal0gPSBhW2ldOworCQkJCQlhW2ldID0gdDsKKwkJCQl9IGVsc2UgaWYgKGFbal0gPT0gYVtpXSkgeworCQkJCQlhW2ldKys7CisJCQkJCXQgPSBhW2pdOworCQkJCQlhW2pdID0gYVtpXTsKKwkJCQkJYVtpXSA9IHQ7CisJCQkJfQorCQkJfQorCQlwaWN0dXJlLT5tYXhfc2tpcCA9IGFbMl07CisJCXBpY3R1cmUtPmF2Z19za2lwID0gYVsxXTsKKwkJcGljdHVyZS0+bWluX3NraXAgPSBhWzBdOworCisjaWZkZWYgREVCVUdfUU9TCisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJza2lwIGRhdGEgJXggIGFbMF09ICV4IGFbMV09ICV4IGFbMl09ICV4XG4iLAorCQkJZGF0YSwgYVswXSwgYVsxXSwgYVsyXSk7CisjZW5kaWYKKwl9IGVsc2UgeworCQl1aW50MzJfdCBibGs4OF95X2NvdW50OworCQl1aW50MzJfdCBibGs4OF9jX2NvdW50OworCQl1aW50MzJfdCBibGsyMl9tdl9jb3VudDsKKwkJdWludDMyX3QgcmRhdGEzMjsKKwkJaW50MzJfdCBtdl9oaTsKKwkJaW50MzJfdCBtdl9sbzsKKwkJdWludDMyX3QgcmRhdGEzMl9sOworCQl1aW50MzJfdCBtdnhfTDBfaGk7CisJCXVpbnQzMl90IG12eV9MMF9oaTsKKwkJdWludDMyX3QgbXZ4X0wxX2hpOworCQl1aW50MzJfdCBtdnlfTDFfaGk7CisJCWludDY0X3QgdmFsdWU7CisJCXVpbnQ2NF90IHRlbXBfdmFsdWU7CisjaWZkZWYgREVCVUdfUU9TCisJCWludCBwaWNfbnVtYmVyID0gcGljdHVyZS0+UE9DOworI2VuZGlmCisKKwkJcGljdHVyZS0+bWF4X212ID0gMDsKKwkJcGljdHVyZS0+YXZnX212ID0gMDsKKwkJcGljdHVyZS0+bWluX212ID0gMDsKKworCQlwaWN0dXJlLT5tYXhfc2tpcCA9IDA7CisJCXBpY3R1cmUtPmF2Z19za2lwID0gMDsKKwkJcGljdHVyZS0+bWluX3NraXAgPSAwOworCisJCXBpY3R1cmUtPm1heF9xcCA9IDA7CisJCXBpY3R1cmUtPmF2Z19xcCA9IDA7CisJCXBpY3R1cmUtPm1pbl9xcCA9IDA7CisKKworCisjaWZkZWYgREVCVUdfUU9TCisJCWhldmNfcHJpbnQoaGV2YywgMCwgInNsaWNlX3R5cGU6JWQsIHBvYzolZFxuIiwKKwkJCXBpY3R1cmUtPnNsaWNlX3R5cGUsCisJCQlwaWN0dXJlLT5QT0MpOworI2VuZGlmCisJCS8qIHNldCByZF9pZHggdG8gMCAqLworCSAgICBXUklURV9WUkVHKEhFVkNfUElDX1FVQUxJVFlfQ1RSTCwgMCk7CisKKwkgICAgYmxrODhfeV9jb3VudCA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCSAgICBpZiAoYmxrODhfeV9jb3VudCA9PSAwKSB7CisjaWZkZWYgREVCVUdfUU9TCisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE5PIERhdGEgeWV0LlxuIiwKKwkJCQlwaWNfbnVtYmVyKTsKKyNlbmRpZgorCQkJLyogcmVzZXQgYWxsIGNvdW50cyAqLworCQkJV1JJVEVfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0NUUkwsICgxPDw4KSk7CisJCQlyZXR1cm47CisJICAgIH0KKwkJLyogcXBfeV9zdW0gKi8KKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworI2lmZGVmIERFQlVHX1FPUworCSAgICBoZXZjX3ByaW50KGhldmMsIDAsCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gWSBRUCBBVkcgOiAlZCAoJWQvJWQpXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMi9ibGs4OF95X2NvdW50LAorCQkJcmRhdGEzMiwgYmxrODhfeV9jb3VudCk7CisjZW5kaWYKKwkJcGljdHVyZS0+YXZnX3FwID0gcmRhdGEzMi9ibGs4OF95X2NvdW50OworCQkvKiBpbnRyYV95X2NvdW50ICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgaGV2Y19wcmludChoZXZjLCAwLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIFkgaW50cmEgcmF0ZSA6ICVkJWMgKCVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzIqMTAwL2Jsazg4X3lfY291bnQsCisJCQknJScsIHJkYXRhMzIpOworI2VuZGlmCisJCS8qIHNraXBwZWRfeV9jb3VudCAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisjaWZkZWYgREVCVUdfUU9TCisJICAgIGhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBZIHNraXBwZWQgcmF0ZSA6ICVkJWMgKCVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzIqMTAwL2Jsazg4X3lfY291bnQsCisJCQknJScsIHJkYXRhMzIpOworI2VuZGlmCisJCXBpY3R1cmUtPmF2Z19za2lwID0gcmRhdGEzMioxMDAvYmxrODhfeV9jb3VudDsKKwkJLyogY29lZmZfbm9uX3plcm9feV9jb3VudCAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisjaWZkZWYgREVCVUdfUU9TCisJICAgIGhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBZIFpFUk9fQ29lZmYgcmF0ZSA6ICVkJWMgKCVkKVxuIiwKKwkJCXBpY19udW1iZXIsICgxMDAgLSByZGF0YTMyKjEwMC8oYmxrODhfeV9jb3VudCoxKSksCisJCQknJScsIHJkYXRhMzIpOworI2VuZGlmCisJCS8qIGJsazY2X2NfY291bnQgKi8KKwkgICAgYmxrODhfY19jb3VudCA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCSAgICBpZiAoYmxrODhfY19jb3VudCA9PSAwKSB7CisjaWZkZWYgREVCVUdfUU9TCisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE5PIERhdGEgeWV0LlxuIiwKKwkJCQlwaWNfbnVtYmVyKTsKKyNlbmRpZgorCQkJLyogcmVzZXQgYWxsIGNvdW50cyAqLworCQkJV1JJVEVfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0NUUkwsICgxPDw4KSk7CisJCQlyZXR1cm47CisJICAgIH0KKwkJLyogcXBfY19zdW0gKi8KKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworI2lmZGVmIERFQlVHX1FPUworCSAgICBoZXZjX3ByaW50KGhldmMsIDAsCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gQyBRUCBBVkcgOiAlZCAoJWQvJWQpXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMi9ibGs4OF9jX2NvdW50LAorCQkJcmRhdGEzMiwgYmxrODhfY19jb3VudCk7CisjZW5kaWYKKwkJLyogaW50cmFfY19jb3VudCAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisjaWZkZWYgREVCVUdfUU9TCisJICAgIGhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBDIGludHJhIHJhdGUgOiAlZCVjICglZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyKjEwMC9ibGs4OF9jX2NvdW50LAorCQkJJyUnLCByZGF0YTMyKTsKKyNlbmRpZgorCQkvKiBza2lwcGVkX2N1X2NfY291bnQgKi8KKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworI2lmZGVmIERFQlVHX1FPUworCSAgICBoZXZjX3ByaW50KGhldmMsIDAsCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gQyBza2lwcGVkIHJhdGUgOiAlZCVjICglZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyKjEwMC9ibGs4OF9jX2NvdW50LAorCQkJJyUnLCByZGF0YTMyKTsKKyNlbmRpZgorCQkvKiBjb2VmZl9ub25femVyb19jX2NvdW50ICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgaGV2Y19wcmludChoZXZjLCAwLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIEMgWkVST19Db2VmZiByYXRlIDogJWQlYyAoJWQpXG4iLAorCQkJcGljX251bWJlciwgKDEwMCAtIHJkYXRhMzIqMTAwLyhibGs4OF9jX2NvdW50KjEpKSwKKwkJCSclJywgcmRhdGEzMik7CisjZW5kaWYKKworCQkvKiAxJ2gwLCBxcF9jX21heFs2OjBdLCAxJ2gwLCBxcF9jX21pbls2OjBdLAorCQkxJ2gwLCBxcF95X21heFs2OjBdLCAxJ2gwLCBxcF95X21pbls2OjBdICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgaGV2Y19wcmludChoZXZjLCAwLCAiW1BpY3R1cmUgJWQgUXVhbGl0eV0gWSBRUCBtaW4gOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIChyZGF0YTMyPj4wKSYweGZmKTsKKyNlbmRpZgorCQlwaWN0dXJlLT5taW5fcXAgPSAocmRhdGEzMj4+MCkmMHhmZjsKKworI2lmZGVmIERFQlVHX1FPUworCSAgICBoZXZjX3ByaW50KGhldmMsIDAsICJbUGljdHVyZSAlZCBRdWFsaXR5XSBZIFFQIG1heCA6ICVkXG4iLAorCQkJcGljX251bWJlciwgKHJkYXRhMzI+PjgpJjB4ZmYpOworI2VuZGlmCisJCXBpY3R1cmUtPm1heF9xcCA9IChyZGF0YTMyPj44KSYweGZmOworCisjaWZkZWYgREVCVUdfUU9TCisJICAgIGhldmNfcHJpbnQoaGV2YywgMCwgIltQaWN0dXJlICVkIFF1YWxpdHldIEMgUVAgbWluIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCAocmRhdGEzMj4+MTYpJjB4ZmYpOworCSAgICBoZXZjX3ByaW50KGhldmMsIDAsICJbUGljdHVyZSAlZCBRdWFsaXR5XSBDIFFQIG1heCA6ICVkXG4iLAorCQkJcGljX251bWJlciwgKHJkYXRhMzI+PjI0KSYweGZmKTsKKyNlbmRpZgorCisJCS8qIGJsazIyX212X2NvdW50ICovCisJICAgIGJsazIyX212X2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJICAgIGlmIChibGsyMl9tdl9jb3VudCA9PSAwKSB7CisjaWZkZWYgREVCVUdfUU9TCisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE5PIE1WIERhdGEgeWV0LlxuIiwKKwkJCQlwaWNfbnVtYmVyKTsKKyNlbmRpZgorCQkJLyogcmVzZXQgYWxsIGNvdW50cyAqLworCQkJV1JJVEVfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0NUUkwsICgxPDw4KSk7CisJCQlyZXR1cm47CisJICAgIH0KKwkJLyogbXZ5X0wxX2NvdW50WzM5OjMyXSwgbXZ4X0wxX2NvdW50WzM5OjMyXSwKKwkJbXZ5X0wwX2NvdW50WzM5OjMyXSwgbXZ4X0wwX2NvdW50WzM5OjMyXSAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJICAgIC8qIHNob3VsZCBhbGwgYmUgMHgwMCBvciAweGZmICovCisjaWZkZWYgREVCVUdfUU9TCisJICAgIGhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNViBBVkcgSGlnaCBCaXRzOiAweCVYXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMik7CisjZW5kaWYKKwkgICAgbXZ4X0wwX2hpID0gKChyZGF0YTMyPj4wKSYweGZmKTsKKwkgICAgbXZ5X0wwX2hpID0gKChyZGF0YTMyPj44KSYweGZmKTsKKwkgICAgbXZ4X0wxX2hpID0gKChyZGF0YTMyPj4xNikmMHhmZik7CisJICAgIG12eV9MMV9oaSA9ICgocmRhdGEzMj4+MjQpJjB4ZmYpOworCisJCS8qIG12eF9MMF9jb3VudFszMTowXSAqLworCSAgICByZGF0YTMyX2wgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkJdGVtcF92YWx1ZSA9IG12eF9MMF9oaTsKKwkJdGVtcF92YWx1ZSA9ICh0ZW1wX3ZhbHVlIDw8IDMyKSB8IHJkYXRhMzJfbDsKKworCQlpZiAobXZ4X0wwX2hpICYgMHg4MCkKKwkJCXZhbHVlID0gMHhGRkZGRkZGMDAwMDAwMDAwIHwgdGVtcF92YWx1ZTsKKwkJZWxzZQorCQkJdmFsdWUgPSB0ZW1wX3ZhbHVlOworCQkgdmFsdWUgPSBkaXZfczY0KHZhbHVlLCBibGsyMl9tdl9jb3VudCk7CisjaWZkZWYgREVCVUdfUU9TCisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVlhfTDAgQVZHIDogJWQgKCVsbGQvJWQpXG4iLAorCQkJcGljX251bWJlciwgKGludCl2YWx1ZSwKKwkJCXZhbHVlLCBibGsyMl9tdl9jb3VudCk7CisjZW5kaWYKKwkJcGljdHVyZS0+YXZnX212ID0gdmFsdWU7CisKKwkJLyogbXZ5X0wwX2NvdW50WzMxOjBdICovCisJICAgIHJkYXRhMzJfbCA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCQl0ZW1wX3ZhbHVlID0gbXZ5X0wwX2hpOworCQl0ZW1wX3ZhbHVlID0gKHRlbXBfdmFsdWUgPDwgMzIpIHwgcmRhdGEzMl9sOworCisJCWlmIChtdnlfTDBfaGkgJiAweDgwKQorCQkJdmFsdWUgPSAweEZGRkZGRkYwMDAwMDAwMDAgfCB0ZW1wX3ZhbHVlOworCQllbHNlCisJCQl2YWx1ZSA9IHRlbXBfdmFsdWU7CisjaWZkZWYgREVCVUdfUU9TCisJICAgIGhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVllfTDAgQVZHIDogJWQgKCVsbGQvJWQpXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMl9sL2JsazIyX212X2NvdW50LAorCQkJdmFsdWUsIGJsazIyX212X2NvdW50KTsKKyNlbmRpZgorCisJCS8qIG12eF9MMV9jb3VudFszMTowXSAqLworCSAgICByZGF0YTMyX2wgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkJdGVtcF92YWx1ZSA9IG12eF9MMV9oaTsKKwkJdGVtcF92YWx1ZSA9ICh0ZW1wX3ZhbHVlIDw8IDMyKSB8IHJkYXRhMzJfbDsKKwkJaWYgKG12eF9MMV9oaSAmIDB4ODApCisJCQl2YWx1ZSA9IDB4RkZGRkZGRjAwMDAwMDAwMCB8IHRlbXBfdmFsdWU7CisJCWVsc2UKKwkJCXZhbHVlID0gdGVtcF92YWx1ZTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgaGV2Y19wcmludChoZXZjLCAwLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWF9MMSBBVkcgOiAlZCAoJWxsZC8lZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyX2wvYmxrMjJfbXZfY291bnQsCisJCQl2YWx1ZSwgYmxrMjJfbXZfY291bnQpOworI2VuZGlmCisKKwkJLyogbXZ5X0wxX2NvdW50WzMxOjBdICovCisJICAgIHJkYXRhMzJfbCA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCQl0ZW1wX3ZhbHVlID0gbXZ5X0wxX2hpOworCQl0ZW1wX3ZhbHVlID0gKHRlbXBfdmFsdWUgPDwgMzIpIHwgcmRhdGEzMl9sOworCQlpZiAobXZ5X0wxX2hpICYgMHg4MCkKKwkJCXZhbHVlID0gMHhGRkZGRkZGMDAwMDAwMDAwIHwgdGVtcF92YWx1ZTsKKwkJZWxzZQorCQkJdmFsdWUgPSB0ZW1wX3ZhbHVlOworI2lmZGVmIERFQlVHX1FPUworCSAgICBoZXZjX3ByaW50KGhldmMsIDAsCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZZX0wxIEFWRyA6ICVkICglbGxkLyVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzJfbC9ibGsyMl9tdl9jb3VudCwKKwkJCXZhbHVlLCBibGsyMl9tdl9jb3VudCk7CisjZW5kaWYKKworCQkvKiB7bXZ4X0wwX21heCwgbXZ4X0wwX21pbn0gLy8gZm9ybWF0IDoge3NpZ24sIGFic1sxNDowXX0gICovCisJICAgIHJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkgICAgbXZfaGkgPSAocmRhdGEzMj4+MTYpJjB4ZmZmZjsKKwkgICAgaWYgKG12X2hpICYgMHg4MDAwKQorCQkJbXZfaGkgPSAweDgwMDAgLSBtdl9oaTsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgaGV2Y19wcmludChoZXZjLCAwLCAiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZYX0wwIE1BWCA6ICVkXG4iLAorCQkJcGljX251bWJlciwgbXZfaGkpOworI2VuZGlmCisJCXBpY3R1cmUtPm1heF9tdiA9IG12X2hpOworCisJICAgIG12X2xvID0gKHJkYXRhMzI+PjApJjB4ZmZmZjsKKwkgICAgaWYgKG12X2xvICYgMHg4MDAwKQorCQkJbXZfbG8gPSAweDgwMDAgLSBtdl9sbzsKKyNpZmRlZiBERUJVR19RT1MKKwkgICAgaGV2Y19wcmludChoZXZjLCAwLCAiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZYX0wwIE1JTiA6ICVkXG4iLAorCQkJcGljX251bWJlciwgbXZfbG8pOworI2VuZGlmCisJCXBpY3R1cmUtPm1pbl9tdiA9IG12X2xvOworCisjaWZkZWYgREVCVUdfUU9TCisJCS8qIHttdnlfTDBfbWF4LCBtdnlfTDBfbWlufSAqLworCSAgICByZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJICAgIG12X2hpID0gKHJkYXRhMzI+PjE2KSYweGZmZmY7CisJICAgIGlmIChtdl9oaSAmIDB4ODAwMCkKKwkJCW12X2hpID0gMHg4MDAwIC0gbXZfaGk7CisJICAgIGhldmNfcHJpbnQoaGV2YywgMCwgIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWV9MMCBNQVggOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIG12X2hpKTsKKworCisJICAgIG12X2xvID0gKHJkYXRhMzI+PjApJjB4ZmZmZjsKKwkgICAgaWYgKG12X2xvICYgMHg4MDAwKQorCQkJbXZfbG8gPSAweDgwMDAgLSBtdl9sbzsKKworCSAgICBoZXZjX3ByaW50KGhldmMsIDAsICJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVllfTDAgTUlOIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9sbyk7CisKKworCQkvKiB7bXZ4X0wxX21heCwgbXZ4X0wxX21pbn0gKi8KKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCSAgICBtdl9oaSA9IChyZGF0YTMyPj4xNikmMHhmZmZmOworCSAgICBpZiAobXZfaGkgJiAweDgwMDApCisJCQltdl9oaSA9IDB4ODAwMCAtIG12X2hpOworCisJICAgIGhldmNfcHJpbnQoaGV2YywgMCwgIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWF9MMSBNQVggOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIG12X2hpKTsKKworCisJICAgIG12X2xvID0gKHJkYXRhMzI+PjApJjB4ZmZmZjsKKwkgICAgaWYgKG12X2xvICYgMHg4MDAwKQorCQkJbXZfbG8gPSAweDgwMDAgLSBtdl9sbzsKKworCSAgICBoZXZjX3ByaW50KGhldmMsIDAsICJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVlhfTDEgTUlOIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9sbyk7CisKKworCQkvKiB7bXZ5X0wxX21heCwgbXZ5X0wxX21pbn0gKi8KKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCSAgICBtdl9oaSA9IChyZGF0YTMyPj4xNikmMHhmZmZmOworCSAgICBpZiAobXZfaGkgJiAweDgwMDApCisJCQltdl9oaSA9IDB4ODAwMCAtIG12X2hpOworCisJICAgIGhldmNfcHJpbnQoaGV2YywgMCwgIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWV9MMSBNQVggOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIG12X2hpKTsKKworCSAgICBtdl9sbyA9IChyZGF0YTMyPj4wKSYweGZmZmY7CisJICAgIGlmIChtdl9sbyAmIDB4ODAwMCkKKwkJCW12X2xvID0gMHg4MDAwIC0gbXZfbG87CisKKwkgICAgaGV2Y19wcmludChoZXZjLCAwLCAiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZZX0wxIE1JTiA6ICVkXG4iLAorCQkJcGljX251bWJlciwgbXZfbG8pOworI2VuZGlmCisKKwkgICAgcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0NUUkwpOworI2lmZGVmIERFQlVHX1FPUworCSAgICBoZXZjX3ByaW50KGhldmMsIDAsCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gQWZ0ZXIgUmVhZCA6IFZERUNfUElDX1FVQUxJVFlfQ1RSTCA6IDB4JXhcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyKTsKKyNlbmRpZgorCQkvKiByZXNldCBhbGwgY291bnRzICovCisJICAgIFdSSVRFX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9DVFJMLCAoMTw8OCkpOworCX0KK30KKworc3RhdGljIGludCBoZXZjX3NsaWNlX3NlZ21lbnRfaGVhZGVyX3Byb2Nlc3Moc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwkJdW5pb24gcGFyYW1fdSAqcnBtX3BhcmFtLAorCQlpbnQgZGVjb2RlX3BpY19iZWdpbikKK3sKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGhldmMpOworI2VuZGlmCisJaW50IGk7CisJaW50IGxjdV94X251bV9kaXY7CisJaW50IGxjdV95X251bV9kaXY7CisJaW50IENvbF9yZWY7CisJaW50IGRiZ19za2lwX2ZsYWcgPSAwOworCisJaWYgKGhldmMtPndhaXRfYnVmID09IDApIHsKKwkJaGV2Yy0+c3BzX251bV9yZW9yZGVyX3BpY3NfMCA9CisJCQlycG1fcGFyYW0tPnAuc3BzX251bV9yZW9yZGVyX3BpY3NfMDsKKwkJaGV2Yy0+aXBfbW9kZSA9ICghaGV2Yy0+c3BzX251bV9yZW9yZGVyX3BpY3NfMCAmJgorCQkJCQkJCSEodmRlYy0+c2xhdmUgfHwgdmRlYy0+bWFzdGVyKSAmJgorCQkJCQkJCSFkaXNhYmxlX2lwX21vZGUpID8gdHJ1ZSA6IGZhbHNlOworCQloZXZjLT5tX3RlbXBvcmFsSWQgPSBycG1fcGFyYW0tPnAubV90ZW1wb3JhbElkOworCQloZXZjLT5tX25hbFVuaXRUeXBlID0gcnBtX3BhcmFtLT5wLm1fbmFsVW5pdFR5cGU7CisJCWhldmMtPmludGVybGFjZV9mbGFnID0KKwkJCShycG1fcGFyYW0tPnAucHJvZmlsZV9ldGMgPj4gMikgJiAweDE7CisJCWhldmMtPmN1cnJfcGljX3N0cnVjdCA9CisJCQkocnBtX3BhcmFtLT5wLnNlaV9mcmFtZV9maWVsZF9pbmZvID4+IDMpICYgMHhmOworCisJCWhldmMtPmZyYW1lX2ZpZWxkX2luZm9fcHJlc2VudF9mbGFnID0KKwkJCShycG1fcGFyYW0tPnAuc2VpX2ZyYW1lX2ZpZWxkX2luZm8gPj4gOCkgJiAweDE7CisKKwkJaWYgKGhldmMtPmZyYW1lX2ZpZWxkX2luZm9fcHJlc2VudF9mbGFnKSB7CisJCQlpZiAoaGV2Yy0+Y3Vycl9waWNfc3RydWN0ID09IDAKKwkJCQl8fCBoZXZjLT5jdXJyX3BpY19zdHJ1Y3QgPT0gNworCQkJCXx8IGhldmMtPmN1cnJfcGljX3N0cnVjdCA9PSA4KQorCQkJCWhldmMtPmludGVybGFjZV9mbGFnID0gMDsKKwkJfQorCisJCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19QSUNfU1RSVUNULAorCQkJCSJmcmFtZV9maWVsZF9pbmZvX3ByZXNlbnRfZmxhZyA9ICVkIGN1cnJfcGljX3N0cnVjdCA9ICVkIGludGVybGFjZV9mbGFnID0gJWRcbiIsCisJCQkJICAgaGV2Yy0+ZnJhbWVfZmllbGRfaW5mb19wcmVzZW50X2ZsYWcsCisJCQkJICAgaGV2Yy0+Y3Vycl9waWNfc3RydWN0LAorCQkJCSAgIGhldmMtPmludGVybGFjZV9mbGFnKTsKKworCQkvKiBpZiAoaW50ZXJsYWNlX2VuYWJsZSA9PSAwIHx8IGhldmMtPm1faW5zX2ZsYWcpICovCisJCWlmIChpbnRlcmxhY2VfZW5hYmxlID09IDApCisJCQloZXZjLT5pbnRlcmxhY2VfZmxhZyA9IDA7CisJCWlmIChpbnRlcmxhY2VfZW5hYmxlICYgMHgxMDApCisJCQloZXZjLT5pbnRlcmxhY2VfZmxhZyA9IGludGVybGFjZV9lbmFibGUgJiAweDE7CisJCWlmIChoZXZjLT5pbnRlcmxhY2VfZmxhZyA9PSAwKQorCQkJaGV2Yy0+Y3Vycl9waWNfc3RydWN0ID0gMDsKKwkJLyogaWYoaGV2Yy0+bV9uYWxVbml0VHlwZSA9PSBOQUxfVU5JVF9FT1MpeyAqLworCQkvKgorCQkgKmhldmMtPm1fcG9jUmFuZG9tQWNjZXNzID0gTUFYX0lOVDsKKwkJICoJLy9hZGQgdG8gZml4IFJBUF9CX0Jvc3Nlbl8xCisJCSAqLworCQkvKiB9ICovCisJCWhldmMtPm1pc2NfZmxhZzAgPSBycG1fcGFyYW0tPnAubWlzY19mbGFnMDsKKwkJaWYgKHJwbV9wYXJhbS0+cC5maXJzdF9zbGljZV9zZWdtZW50X2luX3BpY19mbGFnID09IDApIHsKKwkJCWhldmMtPnNsaWNlX3NlZ21lbnRfYWRkciA9CisJCQkJcnBtX3BhcmFtLT5wLnNsaWNlX3NlZ21lbnRfYWRkcmVzczsKKwkJCWlmICghcnBtX3BhcmFtLT5wLmRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWcpCisJCQkJaGV2Yy0+c2xpY2VfYWRkciA9IGhldmMtPnNsaWNlX3NlZ21lbnRfYWRkcjsKKwkJfSBlbHNlIHsKKwkJCWhldmMtPnNsaWNlX3NlZ21lbnRfYWRkciA9IDA7CisJCQloZXZjLT5zbGljZV9hZGRyID0gMDsKKwkJfQorCisJCWhldmMtPmlQcmV2UE9DID0gaGV2Yy0+Y3Vycl9QT0M7CisJCWhldmMtPnNsaWNlX3R5cGUgPSAocnBtX3BhcmFtLT5wLnNsaWNlX3R5cGUgPT0gSV9TTElDRSkgPyAyIDoKKwkJCShycG1fcGFyYW0tPnAuc2xpY2VfdHlwZSA9PSBQX1NMSUNFKSA/IDEgOgorCQkJKHJwbV9wYXJhbS0+cC5zbGljZV90eXBlID09IEJfU0xJQ0UpID8gMCA6IDM7CisJCS8qIGhldmMtPmN1cnJfcHJlZEZsYWdfTDA9KGhldmMtPnNsaWNlX3R5cGU9PTIpID8gMDoxOyAqLworCQkvKiBoZXZjLT5jdXJyX3ByZWRGbGFnX0wxPShoZXZjLT5zbGljZV90eXBlPT0wKSA/IDE6MDsgKi8KKwkJaGV2Yy0+VE1WUEZsYWcgPSBycG1fcGFyYW0tPnAuc2xpY2VfdGVtcG9yYWxfbXZwX2VuYWJsZV9mbGFnOworCQloZXZjLT5pc05leHRTbGljZVNlZ21lbnQgPQorCQkJcnBtX3BhcmFtLT5wLmRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWcgPyAxIDogMDsKKwkJaWYgKGlzX292ZXJzaXplX2V4KHJwbV9wYXJhbS0+cC5waWNfd2lkdGhfaW5fbHVtYV9zYW1wbGVzLAorCQkJCXJwbV9wYXJhbS0+cC5waWNfaGVpZ2h0X2luX2x1bWFfc2FtcGxlcykpIHsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwgIm92ZXIgc2l6ZSA6ICV1IHggJXUuXG4iLAorCQkJCXJwbV9wYXJhbS0+cC5waWNfd2lkdGhfaW5fbHVtYV9zYW1wbGVzLCBycG1fcGFyYW0tPnAucGljX2hlaWdodF9pbl9sdW1hX3NhbXBsZXMpOworCQkJaWYgKCghaGV2Yy0+bV9pbnNfZmxhZykgJiYKKwkJCQkoKGRlYnVnICYKKwkJCQlIMjY1X05PX0NIQU5HX0RFQlVHX0ZMQUdfSU5fQ09ERSkgPT0gMCkpCisJCQkJZGVidWcgfD0gKEgyNjVfREVCVUdfRElTX0xPQ19FUlJPUl9QUk9DIHwKKwkJCQlIMjY1X0RFQlVHX0RJU19TWVNfRVJST1JfUFJPQyk7CisJCQlyZXR1cm4gMzsKKwkJfQorCisJCWlmIChoZXZjLT5waWNfdyAhPSBycG1fcGFyYW0tPnAucGljX3dpZHRoX2luX2x1bWFfc2FtcGxlcworCQkJfHwgaGV2Yy0+cGljX2ggIT0KKwkJCXJwbV9wYXJhbS0+cC5waWNfaGVpZ2h0X2luX2x1bWFfc2FtcGxlcykgeworCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSJQaWMgV2lkdGgvSGVpZ2h0IENoYW5nZSAoJWQsJWQpPT4oJWQsJWQpLCBpbnRlcmxhY2UgJWRcbiIsCisJCQkJICAgaGV2Yy0+cGljX3csIGhldmMtPnBpY19oLAorCQkJCSAgIHJwbV9wYXJhbS0+cC5waWNfd2lkdGhfaW5fbHVtYV9zYW1wbGVzLAorCQkJCSAgIHJwbV9wYXJhbS0+cC5waWNfaGVpZ2h0X2luX2x1bWFfc2FtcGxlcywKKwkJCQkgICBoZXZjLT5pbnRlcmxhY2VfZmxhZyk7CisKKwkJCWhldmMtPnBpY193ID0gcnBtX3BhcmFtLT5wLnBpY193aWR0aF9pbl9sdW1hX3NhbXBsZXM7CisJCQloZXZjLT5waWNfaCA9IHJwbV9wYXJhbS0+cC5waWNfaGVpZ2h0X2luX2x1bWFfc2FtcGxlczsKKwkJCWhldmMtPmZyYW1lX3dpZHRoID0gaGV2Yy0+cGljX3c7CisJCQloZXZjLT5mcmFtZV9oZWlnaHQgPSBoZXZjLT5waWNfaDsKKyNpZmRlZiBMT1NMRVNTX0NPTVBSRVNTX01PREUKKwkJCWlmICgvKnJlX2NvbmZpZ19waWNfZmxhZyA9PSAwICYmKi8KKwkJCQkoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGhldmMpICYgMHgxMCkgPT0gMCkKKwkJCQlpbml0X2RlY29kZV9oZWFkX2h3KGhldmMpOworI2VuZGlmCisJCX0KKworCQlpZiAoaGV2Yy0+Yml0X2RlcHRoX2Nocm9tYSA+IDEwIHx8CisJCQloZXZjLT5iaXRfZGVwdGhfbHVtYSA+IDEwKSB7CisJCQloZXZjX3ByaW50KGhldmMsIDAsICJ1bnN1cHBvcnQgYml0ZGVwdGggOiAldSwldVxuIiwKKwkJCQloZXZjLT5iaXRfZGVwdGhfY2hyb21hLAorCQkJCWhldmMtPmJpdF9kZXB0aF9sdW1hKTsKKwkJCWlmICghaGV2Yy0+bV9pbnNfZmxhZykKKwkJCQlkZWJ1ZyB8PSAoSDI2NV9ERUJVR19ESVNfTE9DX0VSUk9SX1BST0MgfAorCQkJCUgyNjVfREVCVUdfRElTX1NZU19FUlJPUl9QUk9DKTsKKwkJCWhldmMtPmZhdGFsX2Vycm9yIHw9IERFQ09ERVJfRkFUQUxfRVJST1JfU0laRV9PVkVSRkxPVzsKKwkJCXJldHVybiA0OworCQl9CisKKwkJLyogaXQgd2lsbCBjYXVzZSBkaXZpZGUgMCBlcnJvciAqLworCQlpZiAoaGV2Yy0+cGljX3cgPT0gMCB8fCBoZXZjLT5waWNfaCA9PSAwKSB7CisJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpKSB7CisJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkiRmF0YWwgRXJyb3IsIHBpY193ID0gJWQsIHBpY19oID0gJWRcbiIsCisJCQkJCSAgIGhldmMtPnBpY193LCBoZXZjLT5waWNfaCk7CisJCQl9CisJCQlyZXR1cm4gMzsKKwkJfQorCQlwaWNfbGlzdF9wcm9jZXNzKGhldmMpOworCisJCWhldmMtPmxjdV9zaXplID0KKwkJCTEgPDwgKHJwbV9wYXJhbS0+cC5sb2cyX21pbl9jb2RpbmdfYmxvY2tfc2l6ZV9taW51czMgKworCQkJCQkzICsgcnBtX3BhcmFtLT4KKwkJCQkJcC5sb2cyX2RpZmZfbWF4X21pbl9jb2RpbmdfYmxvY2tfc2l6ZSk7CisJCWlmIChoZXZjLT5sY3Vfc2l6ZSA9PSAwKSB7CisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJIkVycm9yLCBsY3Vfc2l6ZSA9IDAgKCVkLCVkKVxuIiwKKwkJCQkgICBycG1fcGFyYW0tPnAuCisJCQkJICAgbG9nMl9taW5fY29kaW5nX2Jsb2NrX3NpemVfbWludXMzLAorCQkJCSAgIHJwbV9wYXJhbS0+cC4KKwkJCQkgICBsb2cyX2RpZmZfbWF4X21pbl9jb2RpbmdfYmxvY2tfc2l6ZSk7CisJCQlyZXR1cm4gMzsKKwkJfQorCQloZXZjLT5sY3Vfc2l6ZV9sb2cyID0gbG9nMmkoaGV2Yy0+bGN1X3NpemUpOworCQlsY3VfeF9udW1fZGl2ID0gKGhldmMtPnBpY193IC8gaGV2Yy0+bGN1X3NpemUpOworCQlsY3VfeV9udW1fZGl2ID0gKGhldmMtPnBpY19oIC8gaGV2Yy0+bGN1X3NpemUpOworCQloZXZjLT5sY3VfeF9udW0gPQorCQkJKChoZXZjLT5waWNfdyAlIGhldmMtPmxjdV9zaXplKSA9PQorCQkJIDApID8gbGN1X3hfbnVtX2RpdiA6IGxjdV94X251bV9kaXYgKyAxOworCQloZXZjLT5sY3VfeV9udW0gPQorCQkJKChoZXZjLT5waWNfaCAlIGhldmMtPmxjdV9zaXplKSA9PQorCQkJIDApID8gbGN1X3lfbnVtX2RpdiA6IGxjdV95X251bV9kaXYgKyAxOworCQloZXZjLT5sY3VfdG90YWwgPSBoZXZjLT5sY3VfeF9udW0gKiBoZXZjLT5sY3VfeV9udW07CisKKwkJaWYgKGhldmMtPm1fbmFsVW5pdFR5cGUgPT0gTkFMX1VOSVRfQ09ERURfU0xJQ0VfSURSCisJCQl8fCBoZXZjLT5tX25hbFVuaXRUeXBlID09CisJCQlOQUxfVU5JVF9DT0RFRF9TTElDRV9JRFJfTl9MUCkgeworCQkJaGV2Yy0+Y3Vycl9QT0MgPSAwOworCQkJaWYgKChoZXZjLT5tX3RlbXBvcmFsSWQgLSAxKSA9PSAwKQorCQkJCWhldmMtPmlQcmV2VGlkMFBPQyA9IGhldmMtPmN1cnJfUE9DOworCQl9IGVsc2UgeworCQkJaW50IGlNYXhQT0Nsc2IgPQorCQkJCTEgPDwgKHJwbV9wYXJhbS0+cC4KKwkJCQlsb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgKyA0KTsKKwkJCWludCBpUHJldlBPQ2xzYjsKKwkJCWludCBpUHJldlBPQ21zYjsKKwkJCWludCBpUE9DbXNiOworCQkJaW50IGlQT0Nsc2IgPSBycG1fcGFyYW0tPnAuUE9DbHNiOworCisJCQlpZiAoaU1heFBPQ2xzYiA9PSAwKSB7CisJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkiZXJyb3IgaU1heFBPQ2xzYiBpcyAwXG4iKTsKKwkJCQlyZXR1cm4gMzsKKwkJCX0KKworCQkJaVByZXZQT0Nsc2IgPSBoZXZjLT5pUHJldlRpZDBQT0MgJSBpTWF4UE9DbHNiOworCQkJaVByZXZQT0Ntc2IgPSBoZXZjLT5pUHJldlRpZDBQT0MgLSBpUHJldlBPQ2xzYjsKKworCQkJaWYgKChpUE9DbHNiIDwgaVByZXZQT0Nsc2IpCisJCQkJJiYgKChpUHJldlBPQ2xzYiAtIGlQT0Nsc2IpID49CisJCQkJCShpTWF4UE9DbHNiIC8gMikpKQorCQkJCWlQT0Ntc2IgPSBpUHJldlBPQ21zYiArIGlNYXhQT0Nsc2I7CisJCQllbHNlIGlmICgoaVBPQ2xzYiA+IGlQcmV2UE9DbHNiKQorCQkJCQkgJiYgKChpUE9DbHNiIC0gaVByZXZQT0Nsc2IpID4KKwkJCQkJCSAoaU1heFBPQ2xzYiAvIDIpKSkKKwkJCQlpUE9DbXNiID0gaVByZXZQT0Ntc2IgLSBpTWF4UE9DbHNiOworCQkJZWxzZQorCQkJCWlQT0Ntc2IgPSBpUHJldlBPQ21zYjsKKwkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikgeworCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkiaVByZVBPQyVkIGlNYXhQT0Nsc2IlZCBpUE9DbXNiJWQgaVBPQ2xzYiVkXG4iLAorCQkJCSBoZXZjLT5pUHJldlRpZDBQT0MsIGlNYXhQT0Nsc2IsIGlQT0Ntc2IsCisJCQkJIGlQT0Nsc2IpOworCQkJfQorCQkJaWYgKGhldmMtPm1fbmFsVW5pdFR5cGUgPT0gTkFMX1VOSVRfQ09ERURfU0xJQ0VfQkxBCisJCQkJfHwgaGV2Yy0+bV9uYWxVbml0VHlwZSA9PQorCQkJCU5BTF9VTklUX0NPREVEX1NMSUNFX0JMQU5UCisJCQkJfHwgaGV2Yy0+bV9uYWxVbml0VHlwZSA9PQorCQkJCU5BTF9VTklUX0NPREVEX1NMSUNFX0JMQV9OX0xQKSB7CisJCQkJLyogRm9yIEJMQSBwaWN0dXJlIHR5cGVzLCBQT0Ntc2IgaXMgc2V0IHRvIDAuICovCisJCQkJaVBPQ21zYiA9IDA7CisJCQl9CisJCQloZXZjLT5jdXJyX1BPQyA9IChpUE9DbXNiICsgaVBPQ2xzYik7CisJCQlpZiAoKGhldmMtPm1fdGVtcG9yYWxJZCAtIDEpID09IDApCisJCQkJaGV2Yy0+aVByZXZUaWQwUE9DID0gaGV2Yy0+Y3Vycl9QT0M7CisJCQllbHNlIHsKKwkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1IpIHsKKwkJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkJIm1fdGVtcG9yYWxJRCBpcyAlZFxuIiwKKwkJCQkJCSAgIGhldmMtPm1fdGVtcG9yYWxJZCk7CisJCQkJfQorCQkJfQorCQl9CisJCWhldmMtPlJlZk51bV9MMCA9CisJCQkocnBtX3BhcmFtLT5wLm51bV9yZWZfaWR4X2wwX2FjdGl2ZSA+CisJCQkgTUFYX1JFRl9BQ1RJVkUpID8gTUFYX1JFRl9BQ1RJVkUgOiBycG1fcGFyYW0tPnAuCisJCQludW1fcmVmX2lkeF9sMF9hY3RpdmU7CisJCWhldmMtPlJlZk51bV9MMSA9CisJCQkocnBtX3BhcmFtLT5wLm51bV9yZWZfaWR4X2wxX2FjdGl2ZSA+CisJCQkgTUFYX1JFRl9BQ1RJVkUpID8gTUFYX1JFRl9BQ1RJVkUgOiBycG1fcGFyYW0tPnAuCisJCQludW1fcmVmX2lkeF9sMV9hY3RpdmU7CisKKwkJLyogaWYoY3Vycl9QT0M9PTB4MTApIGR1bXBfbG1lbSgpOyAqLworCisJCS8qIHNraXAgUkFTTCBwaWN0dXJlcyBhZnRlciBDUkEvQkxBIHBpY3R1cmVzICovCisJCWlmIChoZXZjLT5tX3BvY1JhbmRvbUFjY2VzcyA9PSBNQVhfSU5UKSB7LyogZmlyc3QgcGljdHVyZSAqLworCQkJaWYgKGhldmMtPm1fbmFsVW5pdFR5cGUgPT0gTkFMX1VOSVRfQ09ERURfU0xJQ0VfQ1JBIHx8CisJCQkJaGV2Yy0+bV9uYWxVbml0VHlwZSA9PSBOQUxfVU5JVF9DT0RFRF9TTElDRV9CTEEKKwkJCQl8fCBoZXZjLT5tX25hbFVuaXRUeXBlID09CisJCQkJTkFMX1VOSVRfQ09ERURfU0xJQ0VfQkxBTlQKKwkJCQl8fCBoZXZjLT5tX25hbFVuaXRUeXBlID09CisJCQkJTkFMX1VOSVRfQ09ERURfU0xJQ0VfQkxBX05fTFApCisJCQkJaGV2Yy0+bV9wb2NSYW5kb21BY2Nlc3MgPSBoZXZjLT5jdXJyX1BPQzsKKwkJCWVsc2UKKwkJCQloZXZjLT5tX3BvY1JhbmRvbUFjY2VzcyA9IC1NQVhfSU5UOworCQl9IGVsc2UgaWYgKGhldmMtPm1fbmFsVW5pdFR5cGUgPT0gTkFMX1VOSVRfQ09ERURfU0xJQ0VfQkxBCisJCQkJICAgfHwgaGV2Yy0+bV9uYWxVbml0VHlwZSA9PQorCQkJCSAgIE5BTF9VTklUX0NPREVEX1NMSUNFX0JMQU5UCisJCQkJICAgfHwgaGV2Yy0+bV9uYWxVbml0VHlwZSA9PQorCQkJCSAgIE5BTF9VTklUX0NPREVEX1NMSUNFX0JMQV9OX0xQKQorCQkJaGV2Yy0+bV9wb2NSYW5kb21BY2Nlc3MgPSBoZXZjLT5jdXJyX1BPQzsKKwkJZWxzZSBpZiAoKGhldmMtPmN1cnJfUE9DIDwgaGV2Yy0+bV9wb2NSYW5kb21BY2Nlc3MpICYmCisJCQkJKG5hbF9za2lwX3BvbGljeSA+PSAzKSAmJgorCQkJCSAoaGV2Yy0+bV9uYWxVbml0VHlwZSA9PQorCQkJCSAgTkFMX1VOSVRfQ09ERURfU0xJQ0VfUkFTTF9OIHx8CisJCQkJICBoZXZjLT5tX25hbFVuaXRUeXBlID09CisJCQkJICBOQUxfVU5JVF9DT0RFRF9TTElDRV9URkQpKSB7CS8qIHNraXAgKi8KKwkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykpIHsKKwkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJIlJBU0wgcGljdHVyZSB3aXRoIFBPQyAlZCA8ICVkICIsCisJCQkJIGhldmMtPmN1cnJfUE9DLCBoZXZjLT5tX3BvY1JhbmRvbUFjY2Vzcyk7CisJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkiUmFuZG9tQWNjZXNzIHBvaW50IFBPQyksIHNraXAgaXRcbiIpOworCQkJfQorCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJV1JJVEVfVlJFRyhIRVZDX1dBSVRfRkxBRywgUkVBRF9WUkVHKEhFVkNfV0FJVF9GTEFHKSB8IDB4Mik7CisJCWhldmMtPnNraXBfZmxhZyA9IDA7CisJCS8qKi8KKwkJLyogaWYoKGlQcmV2UE9DICE9IGN1cnJfUE9DKSl7ICovCisJCWlmIChycG1fcGFyYW0tPnAuc2xpY2Vfc2VnbWVudF9hZGRyZXNzID09IDApIHsKKwkJCXN0cnVjdCBQSUNfcyAqcGljID0gTlVMTDsKKworCQkJaGV2Yy0+bmV3X3BpYyA9IDE7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQkJaWYgKCFoZXZjLT5tX2luc19mbGFnKQorI2VuZGlmCisJCQkJY2hlY2tfcGljX2RlY29kZWRfZXJyb3JfcHJlKGhldmMsCisJCQkJCVJFQURfVlJFRyhIRVZDX1BBUlNFUl9MQ1VfU1RBUlQpCisJCQkJCSYgMHhmZmZmZmYpOworCQkJaWYgKHZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpICYmICgoUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0xDVV9TVEFSVCkgJiAweGZmZmZmZikgIT0gMCkpIHsKKwkJCQlpZiAoaGV2Yy0+Y3VyX3BpYykKKwkJCQkJaGV2Yy0+Y3VyX3BpYy0+ZXJyb3JfbWFyayA9IDE7CisJCQl9CisJCQkvKiovIGlmICh1c2VfY21hID09IDApIHsKKwkJCQlpZiAoaGV2Yy0+cGljX2xpc3RfaW5pdF9mbGFnID09IDApIHsKKwkJCQkJaW5pdF9waWNfbGlzdChoZXZjKTsKKwkJCQkJaW5pdF9waWNfbGlzdF9odyhoZXZjKTsKKwkJCQkJaW5pdF9idWZfc3BlYyhoZXZjKTsKKwkJCQkJaGV2Yy0+cGljX2xpc3RfaW5pdF9mbGFnID0gMzsKKwkJCQl9CisJCQl9CisJCQlpZiAoIWhldmMtPm1faW5zX2ZsYWcpIHsKKwkJCQlpZiAoaGV2Yy0+Y3VyX3BpYykKKwkJCQkJZ2V0X3BpY3R1cmVfcW9zX2luZm8oaGV2Yyk7CisJCQl9CisJCQloZXZjLT5maXJzdF9waWNfYWZ0ZXJfcmVjb3ZlciA9IDA7CisJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1JfTU9SRSkKKwkJCQlkdW1wX3BpY19saXN0KGhldmMpOworCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwkJCWlmICh2ZGVjLT5tYXN0ZXIpIHsKKwkJCQlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjX2JhID0KKwkJCQkoc3RydWN0IGhldmNfc3RhdGVfcyAqKQorCQkJCQl2ZGVjLT5tYXN0ZXItPnByaXZhdGU7CisJCQkJaWYgKGhldmNfYmEtPmN1cl9waWMgIT0gTlVMTCkgeworCQkJCQloZXZjX2JhLT5jdXJfcGljLT5kdl9lbmhhbmNlX2V4aXN0ID0gMTsKKwkJCQkJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX0RWLAorCQkJCQkiVG8gZGVjb2RlIGVsIChwb2MgJWQpID0+IHNldCBibCAocG9jICVkKSBkdl9lbmhhbmNlX2V4aXN0IGZsYWdcbiIsCisJCQkJCWhldmMtPmN1cnJfUE9DLCBoZXZjX2JhLT5jdXJfcGljLT5QT0MpOworCQkJCX0KKwkJCX0KKwkJCWlmICh2ZGVjLT5tYXN0ZXIgPT0gTlVMTCAmJgorCQkJCXZkZWMtPnNsYXZlID09IE5VTEwpCisJCQkJc2V0X2F1eF9kYXRhKGhldmMsCisJCQkJCWhldmMtPmN1cl9waWMsIDEsIDApOyAvKnN1ZmZpeCovCisJCQlpZiAoaGV2Yy0+YnlwYXNzX2R2ZW5sICYmICFkb2xieV9tZXRhX3dpdGhfZWwpCisJCQkJc2V0X2F1eF9kYXRhKGhldmMsCisJCQkJCWhldmMtPmN1cl9waWMsIDAsIDEpOyAvKmR2IG1ldGEgb25seSovCisjZWxzZQorCQkJc2V0X2F1eF9kYXRhKGhldmMsIGhldmMtPmN1cl9waWMsIDEsIDApOworI2VuZGlmCisKKwkJCS8qIHByZXYgcGljICovCisJCQloZXZjX3ByZV9waWMoaGV2YywgcGljKTsKKwkJCS8qCisJCQkgKnVwZGF0ZSByZWZlcmVuY2VkIG9mIG9sZCBwaWN0dXJlcworCQkJICooY3VyX3BpYy0+cmVmZXJlbmNlZCBpcyAxIGFuZCBub3QgdXBkYXRlZCkKKwkJCSAqLworCQkJYXBwbHlfcmVmX3BpY19zZXQoaGV2YywgaGV2Yy0+Y3Vycl9QT0MsCisJCQkJCQkJICBycG1fcGFyYW0pOworCisJCQkvKmlmIChoZXZjLT5tbXVfZW5hYmxlKQorCQkJCXJlY3ljbGVfbW11X2J1ZnMoaGV2Yyk7Ki8KKworCQkJLyogbmV3IHBpYyAqLworCQkJaGV2Yy0+Y3VyX3BpYyA9IGhldmMtPmlzX3VzZWRfdjRsID8KKwkJCQl2NGxfZ2V0X25ld19waWMoaGV2YywgcnBtX3BhcmFtKSA6CisJCQkJZ2V0X25ld19waWMoaGV2YywgcnBtX3BhcmFtKTsKKwkJCWlmIChoZXZjLT5jdXJfcGljID09IE5VTEwpIHsKKwkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1JfTU9SRSkKKwkJCQkJZHVtcF9waWNfbGlzdChoZXZjKTsKKwkJCQloZXZjLT53YWl0X2J1ZiA9IDE7CisJCQkJcmV0dXJuIC0xOworCQkJfQorI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwkJCWhldmMtPmRlY29kaW5nX3BpYyA9IGhldmMtPmN1cl9waWM7CisJCQlpZiAoIWhldmMtPm1faW5zX2ZsYWcpCisJCQkJaGV2Yy0+b3Zlcl9kZWNvZGUgPSAwOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwkJCWhldmMtPmN1cl9waWMtPmR2X2VuaGFuY2VfZXhpc3QgPSAwOworCQkJaWYgKHZkZWMtPnNsYXZlKQorCQkJCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19EViwKKwkJCQkiQ2xlYXIgYmwgKHBvYyAlZCkgZHZfZW5oYW5jZV9leGlzdCBmbGFnXG4iLAorCQkJCWhldmMtPmN1cnJfUE9DKTsKKwkJCWlmICh2ZGVjLT5tYXN0ZXIgPT0gTlVMTCAmJgorCQkJCXZkZWMtPnNsYXZlID09IE5VTEwpCisJCQkJc2V0X2F1eF9kYXRhKGhldmMsCisJCQkJCWhldmMtPmN1cl9waWMsIDAsIDApOyAvKnByZWZpeCovCisKKwkJCWlmIChoZXZjLT5ieXBhc3NfZHZlbmwgJiYgIWRvbGJ5X21ldGFfd2l0aF9lbCkKKwkJCQlzZXRfYXV4X2RhdGEoaGV2YywKKwkJCQkJaGV2Yy0+Y3VyX3BpYywgMCwgMik7IC8qcHJlIHNlaSBvbmx5Ki8KKyNlbHNlCisJCQlzZXRfYXV4X2RhdGEoaGV2YywgaGV2Yy0+Y3VyX3BpYywgMCwgMCk7CisjZW5kaWYKKwkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0RJU1BMQVlfQ1VSX0ZSQU1FKSB7CisJCQkJaGV2Yy0+Y3VyX3BpYy0+b3V0cHV0X3JlYWR5ID0gMTsKKwkJCQloZXZjLT5jdXJfcGljLT5zdHJlYW1fb2Zmc2V0ID0KKwkJCQkJUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCk7CisJCQkJcHJlcGFyZV9kaXNwbGF5X2J1Zih2ZGVjLCBoZXZjLT5jdXJfcGljKTsKKwkJCQloZXZjLT53YWl0X2J1ZiA9IDI7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfSEFTX0FVWF9JTl9TTElDRSkgeworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJCQkJaWYgKHZkZWMtPm1hc3RlciA9PSBOVUxMICYmCisJCQkJCXZkZWMtPnNsYXZlID09IE5VTEwpIHsKKwkJCQkJc2V0X2F1eF9kYXRhKGhldmMsIGhldmMtPmN1cl9waWMsIDEsIDApOworCQkJCQlzZXRfYXV4X2RhdGEoaGV2YywgaGV2Yy0+Y3VyX3BpYywgMCwgMCk7CisJCQkJfQorI2Vsc2UKKwkJCQlzZXRfYXV4X2RhdGEoaGV2YywgaGV2Yy0+Y3VyX3BpYywgMSwgMCk7CisJCQkJc2V0X2F1eF9kYXRhKGhldmMsIGhldmMtPmN1cl9waWMsIDAsIDApOworI2VuZGlmCisJCQl9CisJCQlpZiAoaGV2Yy0+cGljX2xpc3RfaW5pdF9mbGFnICE9IDMKKwkJCQl8fCBoZXZjLT5jdXJfcGljID09IE5VTEwpIHsKKwkJCQkvKiBtYWtlIGl0IGRlYyBmcm9tIHRoZSBmaXJzdCBzbGljZSBzZWdtZW50ICovCisJCQkJcmV0dXJuIDM7CisJCQl9CisJCQloZXZjLT5jdXJfcGljLT5zbGljZV9pZHgrKzsKKwkJCWhldmMtPm5ld19waWMgPSAwOworCQl9CisJfSBlbHNlIHsKKwlpZiAoaGV2Yy0+d2FpdF9idWYgPT0gMSkgeworCQkJcGljX2xpc3RfcHJvY2VzcyhoZXZjKTsKKworCQkJaGV2Yy0+Y3VyX3BpYyA9IGhldmMtPmlzX3VzZWRfdjRsID8KKwkJCQl2NGxfZ2V0X25ld19waWMoaGV2YywgcnBtX3BhcmFtKSA6CisJCQkJZ2V0X25ld19waWMoaGV2YywgcnBtX3BhcmFtKTsKKwkJCWlmIChoZXZjLT5jdXJfcGljID09IE5VTEwpCisJCQkJcmV0dXJuIC0xOworCisJCQlpZiAoIWhldmMtPm1faW5zX2ZsYWcpCisJCQkJaGV2Yy0+b3Zlcl9kZWNvZGUgPSAwOworCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwkJCWhldmMtPmN1cl9waWMtPmR2X2VuaGFuY2VfZXhpc3QgPSAwOworCQkJaWYgKHZkZWMtPm1hc3RlciA9PSBOVUxMICYmCisJCQkJdmRlYy0+c2xhdmUgPT0gTlVMTCkKKwkJCQlzZXRfYXV4X2RhdGEoaGV2YywgaGV2Yy0+Y3VyX3BpYywgMCwgMCk7CisjZWxzZQorCQkJc2V0X2F1eF9kYXRhKGhldmMsIGhldmMtPmN1cl9waWMsIDAsIDApOworI2VuZGlmCisJCQloZXZjLT53YWl0X2J1ZiA9IDA7CisJCX0gZWxzZSBpZiAoaGV2Yy0+d2FpdF9idWYgPT0KKwkJCQkgICAyKSB7CisJCQlpZiAoZ2V0X2Rpc3BsYXlfcGljX251bShoZXZjKSA+CisJCQkJMSkKKwkJCQlyZXR1cm4gLTE7CisJCQloZXZjLT53YWl0X2J1ZiA9IDA7CisJCX0KKwkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSX01PUkUpCisJCQlkdW1wX3BpY19saXN0KGhldmMpOworCX0KKworCWlmIChoZXZjLT5uZXdfcGljKSB7CisjaWYgMQorCQkvKlNVUFBPUlRfMTBCSVQqLworCQlpbnQgc2FvX21lbV91bml0ID0KKwkJCQkoaGV2Yy0+bGN1X3NpemUgPT0gMTYgPyA5IDoKKwkJCQkJCWhldmMtPmxjdV9zaXplID09CisJCQkJCQkzMiA/IDE0IDogMjQpIDw8IDQ7CisjZWxzZQorCQlpbnQgc2FvX21lbV91bml0ID0gKChoZXZjLT5sY3Vfc2l6ZSAvIDgpICogMiArIDQpIDw8IDQ7CisjZW5kaWYKKwkJaW50IHBpY19oZWlnaHRfY3UgPQorCQkJKGhldmMtPnBpY19oICsgaGV2Yy0+bGN1X3NpemUgLSAxKSAvIGhldmMtPmxjdV9zaXplOworCQlpbnQgcGljX3dpZHRoX2N1ID0KKwkJCShoZXZjLT5waWNfdyArIGhldmMtPmxjdV9zaXplIC0gMSkgLyBoZXZjLT5sY3Vfc2l6ZTsKKwkJaW50IHNhb192Yl9zaXplID0gKHNhb19tZW1fdW5pdCArICgyIDw8IDQpKSAqIHBpY19oZWlnaHRfY3U7CisKKwkJLyogaW50IHNhb19hYnZfc2l6ZSA9IHNhb19tZW1fdW5pdCpwaWNfd2lkdGhfY3U7ICovCisJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikgeworCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSI9PT4lcyBkZWMgaWR4ICVkLCBzdHJ1Y3QgJWQgaW50ZXJsYWNlICVkIHBpYyBpZHggJWRcbiIsCisJCQkJX19mdW5jX18sCisJCQkJaGV2Yy0+ZGVjb2RlX2lkeCwKKwkJCQloZXZjLT5jdXJyX3BpY19zdHJ1Y3QsCisJCQkJaGV2Yy0+aW50ZXJsYWNlX2ZsYWcsCisJCQkJaGV2Yy0+Y3VyX3BpYy0+aW5kZXgpOworCQl9CisJCWlmIChkYmdfc2tpcF9kZWNvZGVfaW5kZXggIT0gMCAmJgorCQkJaGV2Yy0+ZGVjb2RlX2lkeCA9PSBkYmdfc2tpcF9kZWNvZGVfaW5kZXgpCisJCQlkYmdfc2tpcF9mbGFnID0gMTsKKworCQloZXZjLT5kZWNvZGVfaWR4Kys7CisJCXVwZGF0ZV90aWxlX2luZm8oaGV2YywgcGljX3dpZHRoX2N1LCBwaWNfaGVpZ2h0X2N1LAorCQkJCQkJIHNhb19tZW1fdW5pdCwgcnBtX3BhcmFtKTsKKworCQljb25maWdfdGl0bGVfaHcoaGV2Yywgc2FvX3ZiX3NpemUsIHNhb19tZW1fdW5pdCk7CisJfQorCisJaWYgKGhldmMtPmlQcmV2UE9DICE9IGhldmMtPmN1cnJfUE9DKSB7CisJCWhldmMtPm5ld190aWxlID0gMTsKKwkJaGV2Yy0+dGlsZV94ID0gMDsKKwkJaGV2Yy0+dGlsZV95ID0gMDsKKwkJaGV2Yy0+dGlsZV95X3ggPSAwOworCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1IpIHsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkibmV3X3RpbGUgKG5ld19waWMpIHRpbGVfeD0lZCwgdGlsZV95PSVkXG4iLAorCQkJCSAgIGhldmMtPnRpbGVfeCwgaGV2Yy0+dGlsZV95KTsKKwkJfQorCX0gZWxzZSBpZiAoaGV2Yy0+dGlsZV9lbmFibGVkKSB7CisJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUikgeworCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSJzbGljZV9zZWdtZW50X2FkZHJlc3MgaXMgJWRcbiIsCisJCQkJICAgcnBtX3BhcmFtLT5wLnNsaWNlX3NlZ21lbnRfYWRkcmVzcyk7CisJCX0KKwkJaGV2Yy0+dGlsZV95X3ggPQorCQkJZ2V0X3RpbGVfaW5kZXgoaGV2YywgcnBtX3BhcmFtLT5wLnNsaWNlX3NlZ21lbnRfYWRkcmVzcywKKwkJCQkJCSAgIChoZXZjLT5waWNfdyArCisJCQkJCQkgICAgaGV2Yy0+bGN1X3NpemUgLQorCQkJCQkJCTEpIC8gaGV2Yy0+bGN1X3NpemUpOworCQlpZiAoKGhldmMtPnRpbGVfeV94ICE9IChoZXZjLT50aWxlX3ggfCAoaGV2Yy0+dGlsZV95IDw8IDgpKSkKKwkJCSYmIChoZXZjLT50aWxlX3lfeCAhPSAtMSkpIHsKKwkJCWhldmMtPm5ld190aWxlID0gMTsKKwkJCWhldmMtPnRpbGVfeCA9IGhldmMtPnRpbGVfeV94ICYgMHhmZjsKKwkJCWhldmMtPnRpbGVfeSA9IChoZXZjLT50aWxlX3lfeCA+PiA4KSAmIDB4ZmY7CisJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1IpIHsKKwkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJIm5ld190aWxlIHNlZyBhZHIgJWQgdGlsZV94PSVkLCB0aWxlX3k9JWRcbiIsCisJCQkJIHJwbV9wYXJhbS0+cC5zbGljZV9zZWdtZW50X2FkZHJlc3MsCisJCQkJIGhldmMtPnRpbGVfeCwgaGV2Yy0+dGlsZV95KTsKKwkJCX0KKwkJfSBlbHNlCisJCQloZXZjLT5uZXdfdGlsZSA9IDA7CisJfSBlbHNlCisJCWhldmMtPm5ld190aWxlID0gMDsKKworCWlmICgoaGV2Yy0+dGlsZV94ID4gKE1BWF9USUxFX0NPTF9OVU0gLSAxKSkKKwl8fCAoaGV2Yy0+dGlsZV95ID4gKE1BWF9USUxFX1JPV19OVU0gLSAxKSkpCisJCWhldmMtPm5ld190aWxlID0gMDsKKworCWlmIChoZXZjLT5uZXdfdGlsZSkgeworCQloZXZjLT50aWxlX3N0YXJ0X2xjdV94ID0KKwkJCWhldmMtPm1fdGlsZVtoZXZjLT50aWxlX3ldW2hldmMtPnRpbGVfeF0uc3RhcnRfY3VfeDsKKwkJaGV2Yy0+dGlsZV9zdGFydF9sY3VfeSA9CisJCQloZXZjLT5tX3RpbGVbaGV2Yy0+dGlsZV95XVtoZXZjLT50aWxlX3hdLnN0YXJ0X2N1X3k7CisJCWhldmMtPnRpbGVfd2lkdGhfbGN1ID0KKwkJICAgIGhldmMtPm1fdGlsZVtoZXZjLT50aWxlX3ldW2hldmMtPnRpbGVfeF0ud2lkdGg7CisJCWhldmMtPnRpbGVfaGVpZ2h0X2xjdSA9CisJCQloZXZjLT5tX3RpbGVbaGV2Yy0+dGlsZV95XVtoZXZjLT50aWxlX3hdLmhlaWdodDsKKwl9CisKKwlzZXRfcmVmX3BpY19saXN0KGhldmMsIHJwbV9wYXJhbSk7CisKKwlDb2xfcmVmID0gcnBtX3BhcmFtLT5wLmNvbGxvY2F0ZWRfcmVmX2lkeDsKKworCWhldmMtPkxEQ0ZsYWcgPSAwOworCWlmIChycG1fcGFyYW0tPnAuc2xpY2VfdHlwZSAhPSBJX1NMSUNFKSB7CisJCWhldmMtPkxEQ0ZsYWcgPSAxOworCQlmb3IgKGkgPSAwOyAoaSA8IGhldmMtPlJlZk51bV9MMCkgJiYgaGV2Yy0+TERDRmxhZzsgaSsrKSB7CisJCQlpZiAoaGV2Yy0+Y3VyX3BpYy0+CisJCQkJbV9haVJlZlBPQ0xpc3QwW2hldmMtPmN1cl9waWMtPnNsaWNlX2lkeF1baV0gPgorCQkJCWhldmMtPmN1cnJfUE9DKQorCQkJCWhldmMtPkxEQ0ZsYWcgPSAwOworCQl9CisJCWlmIChycG1fcGFyYW0tPnAuc2xpY2VfdHlwZSA9PSBCX1NMSUNFKSB7CisJCQlmb3IgKGkgPSAwOyAoaSA8IGhldmMtPlJlZk51bV9MMSkKKwkJCQkJJiYgaGV2Yy0+TERDRmxhZzsgaSsrKSB7CisJCQkJaWYgKGhldmMtPmN1cl9waWMtPgorCQkJCQltX2FpUmVmUE9DTGlzdDFbaGV2Yy0+Y3VyX3BpYy0+CisJCQkJCXNsaWNlX2lkeF1baV0gPgorCQkJCQloZXZjLT5jdXJyX1BPQykKKwkJCQkJaGV2Yy0+TERDRmxhZyA9IDA7CisJCQl9CisJCX0KKwl9CisKKwloZXZjLT5Db2xGcm9tTDBGbGFnID0gcnBtX3BhcmFtLT5wLmNvbGxvY2F0ZWRfZnJvbV9sMF9mbGFnOworCisJaGV2Yy0+cGxldmVsID0KKwkJcnBtX3BhcmFtLT5wLmxvZzJfcGFyYWxsZWxfbWVyZ2VfbGV2ZWw7CisJaGV2Yy0+TWF4TnVtTWVyZ2VDYW5kID0gNSAtIHJwbV9wYXJhbS0+cC5maXZlX21pbnVzX21heF9udW1fbWVyZ2VfY2FuZDsKKworCWhldmMtPkxvbmdUZXJtX0N1cnIgPSAwOwkvKiB0byBkbyAuLi4gKi8KKwloZXZjLT5Mb25nVGVybV9Db2wgPSAwOwkvKiB0byBkbyAuLi4gKi8KKworCWhldmMtPmxpc3Rfbm8gPSAwOworCWlmIChycG1fcGFyYW0tPnAuc2xpY2VfdHlwZSA9PSBCX1NMSUNFKQorCQloZXZjLT5saXN0X25vID0gMSAtIGhldmMtPkNvbEZyb21MMEZsYWc7CisJaWYgKGhldmMtPmxpc3Rfbm8gPT0gMCkgeworCQlpZiAoQ29sX3JlZiA8IGhldmMtPlJlZk51bV9MMCkgeworCQkJaGV2Yy0+Q29sX1BPQyA9CisJCQkJaGV2Yy0+Y3VyX3BpYy0+bV9haVJlZlBPQ0xpc3QwW2hldmMtPmN1cl9waWMtPgorCQkJCXNsaWNlX2lkeF1bQ29sX3JlZl07CisJCX0gZWxzZQorCQkJaGV2Yy0+Q29sX1BPQyA9IElOVkFMSURfUE9DOworCX0gZWxzZSB7CisJCWlmIChDb2xfcmVmIDwgaGV2Yy0+UmVmTnVtX0wxKSB7CisJCQloZXZjLT5Db2xfUE9DID0KKwkJCQloZXZjLT5jdXJfcGljLT5tX2FpUmVmUE9DTGlzdDFbaGV2Yy0+Y3VyX3BpYy0+CisJCQkJc2xpY2VfaWR4XVtDb2xfcmVmXTsKKwkJfSBlbHNlCisJCQloZXZjLT5Db2xfUE9DID0gSU5WQUxJRF9QT0M7CisJfQorCisJaGV2Yy0+TG9uZ1Rlcm1fUmVmID0gMDsJLyogdG8gZG8gLi4uICovCisKKwlpZiAoaGV2Yy0+c2xpY2VfdHlwZSAhPSAyKSB7CisJCS8qIGlmKGhldmMtPmlfb25seT09MSl7ICovCisJCS8qIHJldHVybiAweGY7ICovCisJCS8qIH0gKi8KKworCQlpZiAoaGV2Yy0+Q29sX1BPQyAhPSBJTlZBTElEX1BPQykgeworCQkJaGV2Yy0+Y29sX3BpYyA9IGdldF9yZWZfcGljX2J5X1BPQyhoZXZjLCBoZXZjLT5Db2xfUE9DKTsKKwkJCWlmIChoZXZjLT5jb2xfcGljID09IE5VTEwpIHsKKwkJCQloZXZjLT5jdXJfcGljLT5lcnJvcl9tYXJrID0gMTsKKwkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpKSB7CisJCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJIldST05HLGZhaWwgdG8gZ2V0IHRoZSBwaWMgQ29sX1BPQ1xuIik7CisJCQkJfQorCQkJCWlmIChpc19sb2dfZW5hYmxlKGhldmMpKQorCQkJCQlhZGRfbG9nKGhldmMsCisJCQkJCSJXUk9ORyxmYWlsIHRvIGdldCB0aGUgcGljIENvbF9QT0MiKTsKKwkJCX0gZWxzZSBpZiAoaGV2Yy0+Y29sX3BpYy0+ZXJyb3JfbWFyayB8fCBoZXZjLT5jb2xfcGljLT5kaXNfbWFyayA9PSAwKSB7CisJCQkJaGV2Yy0+Y29sX3BpYy0+ZXJyb3JfbWFyayA9IDE7CisJCQkJaGV2Yy0+Y3VyX3BpYy0+ZXJyb3JfbWFyayA9IDE7CisJCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSkgeworCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCSJXUk9ORywgQ29sX1BPQyBlcnJvcl9tYXJrIGlzIDFcbiIpOworCQkJCX0KKwkJCQlpZiAoaXNfbG9nX2VuYWJsZShoZXZjKSkKKwkJCQkJYWRkX2xvZyhoZXZjLAorCQkJCQkiV1JPTkcsIENvbF9QT0MgZXJyb3JfbWFyayBpcyAxIik7CisJCQl9IGVsc2UgeworCQkJCWlmICgoaGV2Yy0+Y29sX3BpYy0+d2lkdGgKKwkJCQkJIT0gaGV2Yy0+cGljX3cpIHx8CisJCQkJCShoZXZjLT5jb2xfcGljLT5oZWlnaHQKKwkJCQkJIT0gaGV2Yy0+cGljX2gpKSB7CisJCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJCSJXcm9uZyByZWZlcmVuY2UgcGljIChwb2MgJWQpIHdpZHRoL2hlaWdodCAlZC8lZFxuIiwKKwkJCQkJCWhldmMtPmNvbF9waWMtPlBPQywKKwkJCQkJCWhldmMtPmNvbF9waWMtPndpZHRoLAorCQkJCQkJaGV2Yy0+Y29sX3BpYy0+aGVpZ2h0KTsKKwkJCQkJaGV2Yy0+Y3VyX3BpYy0+ZXJyb3JfbWFyayA9IDE7CisJCQkJfQorCisJCQl9CisKKwkJCWlmIChoZXZjLT5jdXJfcGljLT5lcnJvcl9tYXJrCisJCQkJJiYgKChoZXZjLT5pZ25vcmVfYnVmbWdyX2Vycm9yICYgMHgxKSA9PSAwKSkgeworCQkJCS8qY291bnQgaW5mbyovCisJCQkJdmRlY19jb3VudF9pbmZvKGhldmMtPmd2cywgaGV2Yy0+Y3VyX3BpYy0+ZXJyb3JfbWFyaywKKwkJCQkJaGV2Yy0+Y3VyX3BpYy0+c3RyZWFtX29mZnNldCk7CisJCQkJaWYgKGhldmMtPmN1cl9waWMtPnNsaWNlX3R5cGUgPT0gSV9TTElDRSkgeworCQkJCQloZXZjLT5ndnMtPmlfZGVjb2RlZF9mcmFtZXMrKzsKKwkJCQl9IGVsc2UgaWYgKGhldmMtPmN1cl9waWMtPnNsaWNlX3R5cGUgPT0gUF9TTElDRSkgeworCQkJCQloZXZjLT5ndnMtPnBfZGVjb2RlZF9mcmFtZXMrKzsKKwkJCQl9IGVsc2UgaWYgKGhldmMtPmN1cl9waWMtPnNsaWNlX3R5cGUgPT0gQl9TTElDRSkgeworCQkJCQloZXZjLT5ndnMtPmJfZGVjb2RlZF9mcmFtZXMrKzsKKwkJCQl9CisJCQlpZiAoaGV2Yy0+Y3VyX3BpYy0+ZXJyb3JfbWFyaykgeworCQkJCWlmIChoZXZjLT5jdXJfcGljLT5zbGljZV90eXBlID09IElfU0xJQ0UpIHsKKwkJCQkJaGV2Yy0+Z3ZzLT5pX2NvbmNlYWxlZF9mcmFtZXMrKzsKKwkJCQl9IGVsc2UgaWYgKGhldmMtPmN1cl9waWMtPnNsaWNlX3R5cGUgPT0gUF9TTElDRSkgeworCQkJCQloZXZjLT5ndnMtPnBfY29uY2VhbGVkX2ZyYW1lcysrOworCQkJCX0gZWxzZSBpZiAoaGV2Yy0+Y3VyX3BpYy0+c2xpY2VfdHlwZSA9PSBCX1NMSUNFKSB7CisJCQkJCWhldmMtPmd2cy0+Yl9jb25jZWFsZWRfZnJhbWVzKys7CisJCQkJfQorCQkJfQorCQkJaWYgKGhldmMtPlBCX3NraXBfbW9kZSA9PSAyKSB7CisJCQkJaGV2Yy0+Z3ZzLT5kcm9wX2ZyYW1lX2NvdW50Kys7CisJCQkJaWYgKHJwbV9wYXJhbS0+cC5zbGljZV90eXBlID09IElfU0xJQ0UpIHsKKwkJCQkJaGV2Yy0+Z3ZzLT5pX2xvc3RfZnJhbWVzKys7CisJCQkJfSBlbHNlIGlmIChycG1fcGFyYW0tPnAuc2xpY2VfdHlwZSA9PSBQX1NMSUNFKSB7CisJCQkJCWhldmMtPmd2cy0+cF9sb3N0X2ZyYW1lcysrOworCQkJCX0gZWxzZSBpZiAocnBtX3BhcmFtLT5wLnNsaWNlX3R5cGUgPT0gQl9TTElDRSkgeworCQkJCQloZXZjLT5ndnMtPmJfbG9zdF9mcmFtZXMrKzsKKwkJCQl9CisJCQl9CisJCX0KKworCQkJaWYgKGlzX3NraXBfZGVjb2RpbmcoaGV2YywKKwkJCQloZXZjLT5jdXJfcGljKSkgeworCQkJCXJldHVybiAyOworCQkJfQorCQl9IGVsc2UKKwkJCWhldmMtPmNvbF9waWMgPSBoZXZjLT5jdXJfcGljOworCX0JCQkvKiAgKi8KKwlpZiAoaGV2Yy0+Y29sX3BpYyA9PSBOVUxMKQorCQloZXZjLT5jb2xfcGljID0gaGV2Yy0+Y3VyX3BpYzsKKyNpZmRlZiBCVUZGRVJfTUdSX09OTFkKKwlyZXR1cm4gMHhmOworI2Vsc2UKKwlpZiAoKGRlY29kZV9waWNfYmVnaW4gPiAwICYmIGhldmMtPmRlY29kZV9pZHggPD0gZGVjb2RlX3BpY19iZWdpbikKKwkJfHwgKGRiZ19za2lwX2ZsYWcpKQorCQlyZXR1cm4gMHhmOworI2VuZGlmCisJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UuZGVjb2RlX2hlYWRlcl9tZW1vcnlfdGltZV9uYW1lLCBUUkFDRV9IRUFERVJfUkVHSVNURVJfU1RBUlQpOworCWNvbmZpZ19tY19idWZmZXIoaGV2YywgaGV2Yy0+Y3VyX3BpYyk7CisKKwlpZiAoaXNfc2tpcF9kZWNvZGluZyhoZXZjLAorCQkJaGV2Yy0+Y3VyX3BpYykpIHsKKwkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSkKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJEaXNjYXJkIHRoaXMgcGljdHVyZSBpbmRleCAlZFxuIiwKKwkJCQkJaGV2Yy0+Y3VyX3BpYy0+aW5kZXgpOworCQkvKmNvdW50IGluZm8qLworCQl2ZGVjX2NvdW50X2luZm8oaGV2Yy0+Z3ZzLCBoZXZjLT5jdXJfcGljLT5lcnJvcl9tYXJrLAorCQkJaGV2Yy0+Y3VyX3BpYy0+c3RyZWFtX29mZnNldCk7CisJCWlmIChoZXZjLT5jdXJfcGljLT5zbGljZV90eXBlID09IElfU0xJQ0UpIHsKKwkJCWhldmMtPmd2cy0+aV9kZWNvZGVkX2ZyYW1lcysrOworCQl9IGVsc2UgaWYgKGhldmMtPmN1cl9waWMtPnNsaWNlX3R5cGUgPT0gUF9TTElDRSkgeworCQkJaGV2Yy0+Z3ZzLT5wX2RlY29kZWRfZnJhbWVzKys7CisJCX0gZWxzZSBpZiAoaGV2Yy0+Y3VyX3BpYy0+c2xpY2VfdHlwZSA9PSBCX1NMSUNFKSB7CisJCQloZXZjLT5ndnMtPmJfZGVjb2RlZF9mcmFtZXMrKzsKKwkJfQorCQlpZiAoaGV2Yy0+Y3VyX3BpYy0+ZXJyb3JfbWFyaykgeworCQkJaWYgKGhldmMtPmN1cl9waWMtPnNsaWNlX3R5cGUgPT0gSV9TTElDRSkgeworCQkJCWhldmMtPmd2cy0+aV9jb25jZWFsZWRfZnJhbWVzKys7CisJCQl9IGVsc2UgaWYgKGhldmMtPmN1cl9waWMtPnNsaWNlX3R5cGUgPT0gUF9TTElDRSkgeworCQkJCWhldmMtPmd2cy0+cF9jb25jZWFsZWRfZnJhbWVzKys7CisJCQl9IGVsc2UgaWYgKGhldmMtPmN1cl9waWMtPnNsaWNlX3R5cGUgPT0gQl9TTElDRSkgeworCQkJCWhldmMtPmd2cy0+Yl9jb25jZWFsZWRfZnJhbWVzKys7CisJCQl9CisJCX0KKwkJaWYgKGhldmMtPlBCX3NraXBfbW9kZSA9PSAyKSB7CisJCQloZXZjLT5ndnMtPmRyb3BfZnJhbWVfY291bnQrKzsKKwkJCWlmIChycG1fcGFyYW0tPnAuc2xpY2VfdHlwZSA9PSBJX1NMSUNFKSB7CisJCQkJaGV2Yy0+Z3ZzLT5pX2xvc3RfZnJhbWVzKys7CisJCQl9IGVsc2UgaWYgKHJwbV9wYXJhbS0+cC5zbGljZV90eXBlID09IFBfU0xJQ0UpIHsKKwkJCQloZXZjLT5ndnMtPnBfbG9zdF9mcmFtZXMrKzsKKwkJCX0gZWxzZSBpZiAocnBtX3BhcmFtLT5wLnNsaWNlX3R5cGUgPT0gQl9TTElDRSkgeworCQkJCWhldmMtPmd2cy0+Yl9sb3N0X2ZyYW1lcysrOworCQkJfQorCQl9CisJCXJldHVybiAyOworCX0KKyNpZmRlZiBNQ1JDQ19FTkFCTEUKKwljb25maWdfbWNyY2NfYXhpX2h3KGhldmMsIGhldmMtPmN1cl9waWMtPnNsaWNlX3R5cGUpOworI2VuZGlmCisJaWYgKCFoZXZjLT50aWxlX3dpZHRoX2xjdSB8fCAhaGV2Yy0+dGlsZV9oZWlnaHRfbGN1KQorCQlyZXR1cm4gLTE7CisJY29uZmlnX21wcmVkX2h3KGhldmMpOworCisJY29uZmlnX3Nhb19odyhoZXZjLCBycG1fcGFyYW0pOworCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLmRlY29kZV9oZWFkZXJfbWVtb3J5X3RpbWVfbmFtZSwgVFJBQ0VfSEVBREVSX1JFR0lTVEVSX1NUQVJUKTsKKwlpZiAoKGhldmMtPnNsaWNlX3R5cGUgIT0gMikgJiYgKGhldmMtPmlfb25seSAmIDB4MikpCisJCXJldHVybiAweGY7CisKKwlpZiAocG9zdF9waWN0dXJlX2Vhcmx5KHZkZWMsIGhldmMtPmN1cl9waWMtPmluZGV4KSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHJldHVybiBwYWdlIG51bWJlciAqLworc3RhdGljIGludCBoZXZjX21tdV9wYWdlX251bShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCQlpbnQgdywgaW50IGgsIGludCBzYXZlX21vZGUpCit7CisJaW50IHBpY3R1cmVfc2l6ZTsKKwlpbnQgcGFnZV9udW07CisJaW50IG1heF9mcmFtZV9udW07CisKKwlwaWN0dXJlX3NpemUgPSBjb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemUoaGV2YywgdywKKwkJCQloLCBzYXZlX21vZGUpOworCXBhZ2VfbnVtID0gKChwaWN0dXJlX3NpemUgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUKTsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkKKwkJbWF4X2ZyYW1lX251bSA9IE1BWF9GUkFNRV84S19OVU07CisJZWxzZQorCQltYXhfZnJhbWVfbnVtID0gTUFYX0ZSQU1FXzRLX05VTTsKKworCWlmIChwYWdlX251bSA+IG1heF9mcmFtZV9udW0pIHsKKwkJaGV2Y19wcmludChoZXZjLCAwLCAib3ZlciBtYXggISEgMHgleCB3aWR0aCAlZCBoZWlnaHQgJWRcbiIsCisJCQlwYWdlX251bSwgdywgaCk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIHBhZ2VfbnVtOworfQorCitzdGF0aWMgaW50IEgyNjVfYWxsb2NfbW11KHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsIHN0cnVjdCBQSUNfcyAqbmV3X3BpYywKKwkJdW5zaWduZWQgc2hvcnQgYml0X2RlcHRoLCB1bnNpZ25lZCBpbnQgKm1tdV9pbmRleF9hZHIpIHsKKwlpbnQgYml0X2RlcHRoXzEwID0gKGJpdF9kZXB0aCAhPSAweDAwKTsKKwlpbnQgY3VyX21tdV80a19udW1iZXI7CisJaW50IHJldDsKKworCWlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUoaGV2YykgPT0gMHgxMCkKKwkJcmV0dXJuIDA7CisKKwljdXJfbW11XzRrX251bWJlciA9IGhldmNfbW11X3BhZ2VfbnVtKGhldmMsIG5ld19waWMtPndpZHRoLAorCQkJbmV3X3BpYy0+aGVpZ2h0LCAhYml0X2RlcHRoXzEwKTsKKwlpZiAoY3VyX21tdV80a19udW1iZXIgPCAwKQorCQlyZXR1cm4gLTE7CisJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UuZGVjb2RlX2hlYWRlcl9tZW1vcnlfdGltZV9uYW1lLCBUUkFDRV9IRUFERVJfTUVNT1JZX1NUQVJUKTsKKwlpZiAoaGV2Yy0+aXNfdXNlZF92NGwpIHsKKwkJc3RydWN0IGludGVybmFsX2NvbXBfYnVmICppYnVmID0KKwkJCWluZGV4X3RvX2ljb21wX2J1ZihoZXZjLCBuZXdfcGljLT5CVUZfaW5kZXgpOworCisJCXJldCA9IGRlY29kZXJfbW11X2JveF9hbGxvY19pZHgoCisJCQkJaWJ1Zi0+bW11X2JveCwKKwkJCQlpYnVmLT5pbmRleCwKKwkJCQlpYnVmLT5mcmFtZV9idWZmZXJfc2l6ZSwKKwkJCQltbXVfaW5kZXhfYWRyKTsKKwl9IGVsc2UgeworCQlyZXQgPSBkZWNvZGVyX21tdV9ib3hfYWxsb2NfaWR4KAorCQkJCWhldmMtPm1tdV9ib3gsCisJCQkJbmV3X3BpYy0+aW5kZXgsCisJCQkJY3VyX21tdV80a19udW1iZXIsCisJCQkJbW11X2luZGV4X2Fkcik7CisJfQorCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLmRlY29kZV9oZWFkZXJfbWVtb3J5X3RpbWVfbmFtZSwgVFJBQ0VfSEVBREVSX01FTU9SWV9FTkQpOworCW5ld19waWMtPnNjYXR0ZXJfYWxsb2MgPSAxOworCisJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX0JVRk1HUl9NT1JFLAorCQkiJXMgcGljIGluZGV4ICVkIHBhZ2UgY291bnQoJWQpIHJldCA9JWRcbiIsCisJCV9fZnVuY19fLCBuZXdfcGljLT5pbmRleCwKKwkJY3VyX21tdV80a19udW1iZXIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgdm9pZCByZWxlYXNlX3BpY19tbXVfYnVmKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsCisJc3RydWN0IFBJQ19zICpwaWMpCit7CisJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX0JVRk1HUl9NT1JFLAorCSIlcyBwaWMgaW5kZXggJWQgc2NhdHRlcl9hbGxvYyAlZFxuIiwKKwlfX2Z1bmNfXywgcGljLT5pbmRleCwKKwlwaWMtPnNjYXR0ZXJfYWxsb2MpOworCisJaWYgKGhldmMtPm1tdV9lbmFibGUKKwkJJiYgIShoZXZjLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MTApCisJCSYmIHBpYy0+c2NhdHRlcl9hbGxvYykgeworCQlpZiAoIWhldmMtPmlzX3VzZWRfdjRsKQorCQkJZGVjb2Rlcl9tbXVfYm94X2ZyZWVfaWR4KGhldmMtPm1tdV9ib3gsIHBpYy0+aW5kZXgpOworCQllbHNlIHsKKwkJCXN0cnVjdCBpbnRlcm5hbF9jb21wX2J1ZiAqaWJ1ZiA9CisJCQkJaWJ1ZiA9IGluZGV4X3RvX2ljb21wX2J1ZihoZXZjLCBwaWMtPkJVRl9pbmRleCk7CisJCQlkZWNvZGVyX21tdV9ib3hfZnJlZV9pZHgoaWJ1Zi0+bW11X2JveCwgaWJ1Zi0+aW5kZXgpOworCQl9CisJfQorCXBpYy0+c2NhdHRlcl9hbGxvYyA9IDA7Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqaDI2NSBidWZmZXIgbWFuYWdlbWVudCBlbmQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworc3RhdGljIHN0cnVjdCBoZXZjX3N0YXRlX3MgKmdIZXZjOworCitzdGF0aWMgdm9pZCBoZXZjX2xvY2FsX3VuaW5pdChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWhldmMtPnJwbV9wdHIgPSBOVUxMOworCWhldmMtPmxtZW1fcHRyID0gTlVMTDsKKworI2lmZGVmIFNXQVBfSEVWQ19VQ09ERQorCWlmIChoZXZjLT5pc19zd2FwICYmIGdldF9jcHVfbWFqb3JfaWQoKSA8PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hNKSB7CisJCWlmIChoZXZjLT5tY19jcHVfYWRkciAhPSBOVUxMKSB7CisJCQlkbWFfZnJlZV9jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJaGV2Yy0+c3dhcF9zaXplLCBoZXZjLT5tY19jcHVfYWRkciwKKwkJCQloZXZjLT5tY19kbWFfaGFuZGxlKTsKKwkJCQloZXZjLT5tY19jcHVfYWRkciA9IE5VTEw7CisJCX0KKworCX0KKyNlbmRpZgorI2lmZGVmIERFVFJFRklMTF9FTkFCTEUKKwlpZiAoaGV2Yy0+aXNfc3dhcCAmJiBnZXRfY3B1X21ham9yX2lkKCkgPD0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTSkKKwkJdW5pbml0X2RldHJlZmlsbF9idWYoaGV2Yyk7CisjZW5kaWYKKwlpZiAoaGV2Yy0+YXV4X2FkZHIpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCWhldmMtPnByZWZpeF9hdXhfc2l6ZSArIGhldmMtPnN1ZmZpeF9hdXhfc2l6ZSwgaGV2Yy0+YXV4X2FkZHIsCisJCQkJCWhldmMtPmF1eF9waHlfYWRkcik7CisJCWhldmMtPmF1eF9hZGRyID0gTlVMTDsKKwl9CisJaWYgKGhldmMtPnJwbV9hZGRyKSB7CisJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlSUE1fQlVGX1NJWkUsIGhldmMtPnJwbV9hZGRyLAorCQkJCQloZXZjLT5ycG1fcGh5X2FkZHIpOworCQloZXZjLT5ycG1fYWRkciA9IE5VTEw7CisJfQorCWlmIChoZXZjLT5sbWVtX2FkZHIpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCVJQTV9CVUZfU0laRSwgaGV2Yy0+bG1lbV9hZGRyLAorCQkJCQloZXZjLT5sbWVtX3BoeV9hZGRyKTsKKwkJaGV2Yy0+bG1lbV9hZGRyID0gTlVMTDsKKwl9CisKKwlpZiAoaGV2Yy0+bW11X2VuYWJsZSAmJiBoZXZjLT5mcmFtZV9tbXVfbWFwX2FkZHIpIHsKKwkJaWYgKGhldmMtPmZyYW1lX21tdV9tYXBfcGh5X2FkZHIpCisJCQlkbWFfZnJlZV9jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJZ2V0X2ZyYW1lX21tdV9tYXBfc2l6ZSgpLCBoZXZjLT5mcmFtZV9tbXVfbWFwX2FkZHIsCisJCQkJCWhldmMtPmZyYW1lX21tdV9tYXBfcGh5X2FkZHIpOworCisJCWhldmMtPmZyYW1lX21tdV9tYXBfYWRkciA9IE5VTEw7CisJfQorCisJLy9wcl9lcnIoIlslcyBsaW5lICVkXSBoZXZjLT5ndnM9MHglcCBvcGVyYXRpb25cbiIsX19mdW5jX18sIF9fTElORV9fLCBoZXZjLT5ndnMpOworfQorCitzdGF0aWMgaW50IGhldmNfbG9jYWxfaW5pdChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWludCByZXQgPSAtMTsKKwlzdHJ1Y3QgQnVmZkluZm9fcyAqY3VyX2J1Zl9pbmZvID0gTlVMTDsKKworCW1lbXNldCgmaGV2Yy0+cGFyYW0sIDAsIHNpemVvZih1bmlvbiBwYXJhbV91KSk7CisKKwljdXJfYnVmX2luZm8gPSAmaGV2Yy0+d29ya19zcGFjZV9idWZfc3RvcmU7CisJaWYgKGZvcmNlX2J1ZnNwZWMpIHsKKwkJbWVtY3B5KGN1cl9idWZfaW5mbywgJmFtdmgyNjVfd29ya2J1ZmZfc3BlY1tmb3JjZV9idWZzcGVjICYgMHhmXSwKKwkJc2l6ZW9mKHN0cnVjdCBCdWZmSW5mb19zKSk7CisJCXByX2luZm8oImZvcmNlIGJ1ZmZlciBzcGVjICVkXG4iLCBmb3JjZV9idWZzcGVjICYgMHhmKTsKKwl9IGVsc2UgeworCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDw9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UTTIgJiYgIWlzX2NwdV90bTJfcmV2YigpKSB7CisJCQlpZiAodmRlY19pc19zdXBwb3J0XzRrKCkpIHsKKwkJCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpCisJCQkJCW1lbWNweShjdXJfYnVmX2luZm8sICZhbXZoMjY1X3dvcmtidWZmX3NwZWNbMl0sCS8qIDRrICovCisJCQkJCXNpemVvZihzdHJ1Y3QgQnVmZkluZm9fcykpOworCQkJCWVsc2UKKwkJCQkJbWVtY3B5KGN1cl9idWZfaW5mbywgJmFtdmgyNjVfd29ya2J1ZmZfc3BlY1sxXSwJLyogNGsgKi8KKwkJCQkJc2l6ZW9mKHN0cnVjdCBCdWZmSW5mb19zKSk7CisJCQl9IGVsc2UgeworCQkJCW1lbWNweShjdXJfYnVmX2luZm8sICZhbXZoMjY1X3dvcmtidWZmX3NwZWNbMF0sCS8qIDEwODBwICovCisJCQkJc2l6ZW9mKHN0cnVjdCBCdWZmSW5mb19zKSk7CisJCQl9CisJCX0gZWxzZSB7IC8vZ2V0X2NwdV9tYWpvcl9pZCgpID4gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RNMiB8fCBpc19jcHVfdG0yX3JldmIoKQorCQkJaWYgKHZkZWNfaXNfc3VwcG9ydF80aygpKSB7CisJCQkJbWVtY3B5KGN1cl9idWZfaW5mbywgJmFtdmgyNjVfd29ya2J1ZmZfc3BlY1s1XSwJLyogNGsgKi8KKwkJCQlzaXplb2Yoc3RydWN0IEJ1ZmZJbmZvX3MpKTsKKwkJCX0gZWxzZSB7CisJCQkJbWVtY3B5KGN1cl9idWZfaW5mbywgJmFtdmgyNjVfd29ya2J1ZmZfc3BlY1szXSwJLyogMTA4MHAgKi8KKwkJCQlzaXplb2Yoc3RydWN0IEJ1ZmZJbmZvX3MpKTsKKwkJCX0KKwkJfQorCX0KKworCWN1cl9idWZfaW5mby0+c3RhcnRfYWRyID0gaGV2Yy0+YnVmX3N0YXJ0OworCWluaXRfYnVmZl9zcGVjKGhldmMsIGN1cl9idWZfaW5mbyk7CisKKwloZXZjX2luaXRfc3RydShoZXZjLCBjdXJfYnVmX2luZm8pOworCisJaGV2Yy0+Yml0X2RlcHRoX2x1bWEgPSA4OworCWhldmMtPmJpdF9kZXB0aF9jaHJvbWEgPSA4OworCWhldmMtPnZpZGVvX3NpZ25hbF90eXBlID0gMDsKKwloZXZjLT52aWRlb19zaWduYWxfdHlwZV9kZWJ1ZyA9IDA7CisJYml0X2RlcHRoX2x1bWEgPSBoZXZjLT5iaXRfZGVwdGhfbHVtYTsKKwliaXRfZGVwdGhfY2hyb21hID0gaGV2Yy0+Yml0X2RlcHRoX2Nocm9tYTsKKwl2aWRlb19zaWduYWxfdHlwZSA9IGhldmMtPnZpZGVvX3NpZ25hbF90eXBlOworCisJaWYgKChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX1NFTkRfUEFSQU1fV0lUSF9SRUcpID09IDApIHsKKwkJaGV2Yy0+cnBtX2FkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCVJQTV9CVUZfU0laRSwgJmhldmMtPnJwbV9waHlfYWRkciwgR0ZQX0tFUk5FTCk7CisJCWlmIChoZXZjLT5ycG1fYWRkciA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgcnBtIGJ1ZmZlclxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC0xOworCQl9CisJCWhldmMtPnJwbV9wdHIgPSBoZXZjLT5ycG1fYWRkcjsKKwl9CisKKwlpZiAocHJlZml4X2F1eF9idWZfc2l6ZSA+IDAgfHwKKwkJc3VmZml4X2F1eF9idWZfc2l6ZSA+IDApIHsKKwkJdTMyIGF1eF9idWZfc2l6ZTsKKworCQloZXZjLT5wcmVmaXhfYXV4X3NpemUgPSBBVVhfQlVGX0FMSUdOKHByZWZpeF9hdXhfYnVmX3NpemUpOworCQloZXZjLT5zdWZmaXhfYXV4X3NpemUgPSBBVVhfQlVGX0FMSUdOKHN1ZmZpeF9hdXhfYnVmX3NpemUpOworCQlhdXhfYnVmX3NpemUgPSBoZXZjLT5wcmVmaXhfYXV4X3NpemUgKyBoZXZjLT5zdWZmaXhfYXV4X3NpemU7CisJCWhldmMtPmF1eF9hZGRyID1kbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCWF1eF9idWZfc2l6ZSwgJmhldmMtPmF1eF9waHlfYWRkciwgR0ZQX0tFUk5FTCk7CisJCWlmIChoZXZjLT5hdXhfYWRkciA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgcnBtIGJ1ZmZlclxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJaGV2Yy0+bG1lbV9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlMTUVNX0JVRl9TSVpFLCAmaGV2Yy0+bG1lbV9waHlfYWRkciwgR0ZQX0tFUk5FTCk7CisJaWYgKGhldmMtPmxtZW1fYWRkciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvYyBsbWVtIGJ1ZmZlclxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLTE7CisJfQorCWhldmMtPmxtZW1fcHRyID0gaGV2Yy0+bG1lbV9hZGRyOworCisJaWYgKGhldmMtPm1tdV9lbmFibGUpIHsKKwkJaGV2Yy0+ZnJhbWVfbW11X21hcF9hZGRyID0KKwkJCQlkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCWdldF9mcmFtZV9tbXVfbWFwX3NpemUoKSwKKwkJCQkmaGV2Yy0+ZnJhbWVfbW11X21hcF9waHlfYWRkciwgR0ZQX0tFUk5FTCk7CisJCWlmIChoZXZjLT5mcmFtZV9tbXVfbWFwX2FkZHIgPT0gTlVMTCkgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFsbG9jIGNvdW50X2J1ZmZlclxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC0xOworCQl9CisJCW1lbXNldChoZXZjLT5mcmFtZV9tbXVfbWFwX2FkZHIsIDAsIGdldF9mcmFtZV9tbXVfbWFwX3NpemUoKSk7CisJfQorCXJldCA9IDA7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgTWFpbGJveCBjb21tYW5kCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisjZGVmaW5lIENNRF9GSU5JU0hFRCAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ01EX0FMTE9DX1ZJRVcgICAgICAgICAgICAgMQorI2RlZmluZSBDTURfRlJBTUVfRElTUExBWSAgICAgICAgICAzCisjZGVmaW5lIENNRF9ERUJVRyAgICAgICAgICAgICAgICAgIDEwCisKKworI2RlZmluZSBERUNPREVfQlVGRkVSX05VTV9NQVggICAgMzIKKyNkZWZpbmUgRElTUExBWV9CVUZGRVJfTlVNICAgICAgIDYKKworI2RlZmluZSB2aWRlb19kb21haW5fYWRkcihhZHIpIChhZHImMHg3ZmZmZmZmZikKKyNkZWZpbmUgREVDT0RFUl9XT1JLX1NQQUNFX1NJWkUgMHg4MDAwMDAKKworI2RlZmluZSBzcGVjMmNhbnZhcyh4KSAgXAorCSgoKHgpLT51dl9jYW52YXNfaW5kZXggPDwgMTYpIHwgXAorCSAoKHgpLT51dl9jYW52YXNfaW5kZXggPDwgOCkgIHwgXAorCSAoKHgpLT55X2NhbnZhc19pbmRleCA8PCAwKSkKKworCitzdGF0aWMgdm9pZCBzZXRfY2FudmFzKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsIHN0cnVjdCBQSUNfcyAqcGljKQoreworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGhldmMpOworCWludCBjYW52YXNfdyA9IEFMSUdOKHBpYy0+d2lkdGgsIDY0KS80OworCWludCBjYW52YXNfaCA9IEFMSUdOKHBpYy0+aGVpZ2h0LCAzMikvNDsKKwlpbnQgYmxrbW9kZSA9IGhldmMtPm1lbV9tYXBfbW9kZTsKKworCS8qQ0FOVkFTX0JMS01PREVfNjRYMzIqLworI2lmZGVmIFNVUFBPUlRfMTBCSVQKKwlpZgkocGljLT5kb3VibGVfd3JpdGVfbW9kZSkgeworCQljYW52YXNfdyA9IHBpYy0+d2lkdGggLworCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhwaWMtPmRvdWJsZV93cml0ZV9tb2RlKTsKKwkJY2FudmFzX2ggPSBwaWMtPmhlaWdodCAvCisJCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKHBpYy0+ZG91YmxlX3dyaXRlX21vZGUpOworCisJCWNhbnZhc193ID0gQUxJR04oY2FudmFzX3csIDY0KTsKKwkJY2FudmFzX2ggPSBBTElHTihjYW52YXNfaCwgMzIpOworCisJCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQkJaWYgKHBpYy0+eV9jYW52YXNfaW5kZXggPT0gLTEpCisJCQkJcGljLT55X2NhbnZhc19pbmRleCA9IHZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX0hFVkMsIHZkZWMtPmlkKTsKKwkJCWlmIChwaWMtPnV2X2NhbnZhc19pbmRleCA9PSAtMSkKKwkJCQlwaWMtPnV2X2NhbnZhc19pbmRleCA9IHZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX0hFVkMsIHZkZWMtPmlkKTsKKwkJfSBlbHNlIHsKKwkJCXBpYy0+eV9jYW52YXNfaW5kZXggPSAxMjggKyBwaWMtPmluZGV4ICogMjsKKwkJCXBpYy0+dXZfY2FudmFzX2luZGV4ID0gMTI4ICsgcGljLT5pbmRleCAqIDIgKyAxOworCQl9CisKKwkJY29uZmlnX2Nhdl9sdXRfZXgocGljLT55X2NhbnZhc19pbmRleCwKKwkJCXBpYy0+ZHdfeV9hZHIsIGNhbnZhc193LCBjYW52YXNfaCwKKwkJCUNBTlZBU19BRERSX05PV1JBUCwgYmxrbW9kZSwgaGV2Yy0+aXNfdXNlZF92NGwgPyAwIDogNywgVkRFQ19IRVZDKTsKKwkJY29uZmlnX2Nhdl9sdXRfZXgocGljLT51dl9jYW52YXNfaW5kZXgsIHBpYy0+ZHdfdV92X2FkciwKKwkJCWNhbnZhc193LCBjYW52YXNfaCwKKwkJCUNBTlZBU19BRERSX05PV1JBUCwgYmxrbW9kZSwgaGV2Yy0+aXNfdXNlZF92NGwgPyAwIDogNywgVkRFQ19IRVZDKTsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCXBpYy0+Y2FudmFzX2NvbmZpZ1swXS5waHlfYWRkciA9CisJCQkJcGljLT5kd195X2FkcjsKKwkJcGljLT5jYW52YXNfY29uZmlnWzBdLndpZHRoID0KKwkJCQljYW52YXNfdzsKKwkJcGljLT5jYW52YXNfY29uZmlnWzBdLmhlaWdodCA9CisJCQkJY2FudmFzX2g7CisJCXBpYy0+Y2FudmFzX2NvbmZpZ1swXS5ibG9ja19tb2RlID0KKwkJCQlibGttb2RlOworCQlwaWMtPmNhbnZhc19jb25maWdbMF0uZW5kaWFuID0gaGV2Yy0+aXNfdXNlZF92NGwgPyAwIDogNzsKKworCQlwaWMtPmNhbnZhc19jb25maWdbMV0ucGh5X2FkZHIgPQorCQkJCXBpYy0+ZHdfdV92X2FkcjsKKwkJcGljLT5jYW52YXNfY29uZmlnWzFdLndpZHRoID0KKwkJCQljYW52YXNfdzsKKwkJcGljLT5jYW52YXNfY29uZmlnWzFdLmhlaWdodCA9CisJCQkJY2FudmFzX2g7CisJCXBpYy0+Y2FudmFzX2NvbmZpZ1sxXS5ibG9ja19tb2RlID0KKwkJCQlibGttb2RlOworCQlwaWMtPmNhbnZhc19jb25maWdbMV0uZW5kaWFuID0gaGV2Yy0+aXNfdXNlZF92NGwgPyAwIDogNzsKKworCQlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5zZXRfY2FudmFzMF9hZGRyLCBwaWMtPmNhbnZhc19jb25maWdbMF0ucGh5X2FkZHIpOworCQloZXZjX3ByaW50KGhldmMsIEgyNjVfREVCVUdfUElDX1NUUlVDVCwiJXMoY2FudmFzMCBhZGRyOjB4JXgpXG4iLAorCQkJX19mdW5jX18sIHBpYy0+Y2FudmFzX2NvbmZpZ1swXS5waHlfYWRkcik7CisjZWxzZQorCQlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5zZXRfY2FudmFzMF9hZGRyLCBzcGVjMmNhbnZhcyhwaWMpKTsKKwkJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX1BJQ19TVFJVQ1QsIiVzKGNhbnZhczAgYWRkcjoweCV4KVxuIiwKKwkJCV9fZnVuY19fLCBzcGVjMmNhbnZhcyhwaWMpKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCWlmICghaGV2Yy0+bW11X2VuYWJsZSkgeworCQkJLyogdG8gY2hhbmdlIGFmdGVyIDEwYml0IFZQVSBpcyByZWFkeSAuLi4gKi8KKwkJCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQkJCWlmIChwaWMtPnlfY2FudmFzX2luZGV4ID09IC0xKQorCQkJCQlwaWMtPnlfY2FudmFzX2luZGV4ID0gdmRlYy0+Z2V0X2NhbnZhc19leChDT1JFX01BU0tfSEVWQywgdmRlYy0+aWQpOworCQkJCXBpYy0+dXZfY2FudmFzX2luZGV4ID0gcGljLT55X2NhbnZhc19pbmRleDsKKwkJCX0gZWxzZSB7CisJCQkJcGljLT55X2NhbnZhc19pbmRleCA9IDEyOCArIHBpYy0+aW5kZXg7CisJCQkJcGljLT51dl9jYW52YXNfaW5kZXggPSAxMjggKyBwaWMtPmluZGV4OworCQkJfQorCisJCQljb25maWdfY2F2X2x1dF9leChwaWMtPnlfY2FudmFzX2luZGV4LAorCQkJCXBpYy0+bWNfeV9hZHIsIGNhbnZhc193LCBjYW52YXNfaCwKKwkJCQlDQU5WQVNfQUREUl9OT1dSQVAsIGJsa21vZGUsIGhldmMtPmlzX3VzZWRfdjRsID8gMCA6IDcsIFZERUNfSEVWQyk7CisJCQljb25maWdfY2F2X2x1dF9leChwaWMtPnV2X2NhbnZhc19pbmRleCwgcGljLT5tY191X3ZfYWRyLAorCQkJCWNhbnZhc193LCBjYW52YXNfaCwKKwkJCQlDQU5WQVNfQUREUl9OT1dSQVAsIGJsa21vZGUsIGhldmMtPmlzX3VzZWRfdjRsID8gMCA6IDcsIFZERUNfSEVWQyk7CisJCX0KKwkJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2Uuc2V0X2NhbnZhczBfYWRkciwgc3BlYzJjYW52YXMocGljKSk7CisJCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19QSUNfU1RSVUNULCIlcyhjYW52YXMwIGFkZHI6MHgleClcbiIsCisJCQlfX2Z1bmNfXywgc3BlYzJjYW52YXMocGljKSk7CisJfQorI2Vsc2UKKwlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJaWYgKHBpYy0+eV9jYW52YXNfaW5kZXggPT0gLTEpCisJCQlwaWMtPnlfY2FudmFzX2luZGV4ID0gdmRlYy0+Z2V0X2NhbnZhc19leChDT1JFX01BU0tfSEVWQywgdmRlYy0+aWQpOworCQlpZiAocGljLT51dl9jYW52YXNfaW5kZXggPT0gLTEpCisJCQlwaWMtPnV2X2NhbnZhc19pbmRleCA9IHZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX0hFVkMsIHZkZWMtPmlkKTsKKwl9IGVsc2UgeworCQlwaWMtPnlfY2FudmFzX2luZGV4ID0gMTI4ICsgcGljLT5pbmRleCAqIDI7CisJCXBpYy0+dXZfY2FudmFzX2luZGV4ID0gMTI4ICsgcGljLT5pbmRleCAqIDIgKyAxOworCX0KKworCisJY29uZmlnX2Nhdl9sdXRfZXgocGljLT55X2NhbnZhc19pbmRleCwgcGljLT5tY195X2FkciwgY2FudmFzX3csIGNhbnZhc19oLAorCQlDQU5WQVNfQUREUl9OT1dSQVAsIGJsa21vZGUsIGhldmMtPmlzX3VzZWRfdjRsID8gMCA6IDcsIFZERUNfSEVWQyk7CisJY29uZmlnX2Nhdl9sdXRfZXgocGljLT51dl9jYW52YXNfaW5kZXgsIHBpYy0+bWNfdV92X2FkciwKKwkJY2FudmFzX3csIGNhbnZhc19oLAorCQlDQU5WQVNfQUREUl9OT1dSQVAsIGJsa21vZGUsIGhldmMtPmlzX3VzZWRfdjRsID8gMCA6IDcsIFZERUNfSEVWQyk7CisKKwlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5zZXRfY2FudmFzMF9hZGRyLCBzcGVjMmNhbnZhcyhwaWMpKTsKKwloZXZjX3ByaW50KGhldmMsIEgyNjVfREVCVUdfUElDX1NUUlVDVCwiJXMoY2FudmFzMCBhZGRyOjB4JXgpXG4iLAorCQlfX2Z1bmNfXywgc3BlYzJjYW52YXMocGljKSk7CisjZW5kaWYKK30KKworc3RhdGljIGludCBpbml0X2J1Zl9zcGVjKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJaW50IHBpY193aWR0aCA9IGhldmMtPnBpY193OworCWludCBwaWNfaGVpZ2h0ID0gaGV2Yy0+cGljX2g7CisKKwkvKiBoZXZjX3ByaW50KGhldmMsIDAsCisJICoiJXMxOiAlZCAlZFxuIiwgX19mdW5jX18sIGhldmMtPnBpY193LCBoZXZjLT5waWNfaCk7CisJICovCisJaGV2Y19wcmludChoZXZjLCAwLAorCQkiJXMyICVkICVkXG4iLCBfX2Z1bmNfXywgcGljX3dpZHRoLCBwaWNfaGVpZ2h0KTsKKwkvKiBwaWNfd2lkdGggPSBoZXZjLT5waWNfdzsgKi8KKwkvKiBwaWNfaGVpZ2h0ID0gaGV2Yy0+cGljX2g7ICovCisKKwlpZiAoaGV2Yy0+ZnJhbWVfd2lkdGggPT0gMCB8fCBoZXZjLT5mcmFtZV9oZWlnaHQgPT0gMCkgeworCQloZXZjLT5mcmFtZV93aWR0aCA9IHBpY193aWR0aDsKKwkJaGV2Yy0+ZnJhbWVfaGVpZ2h0ID0gcGljX2hlaWdodDsKKworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX3NlaShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCXN0cnVjdCBQSUNfcyAqcGljLCBjaGFyICpzZWlfYnVmLCB1aW50MzJfdCBzaXplKQoreworCWNoYXIgKnAgPSBzZWlfYnVmOworCWNoYXIgKnBfc2VpOworCXVpbnQxNl90IGhlYWRlcjsKKwl1aW50MTZfdCBuYWxfdW5pdF90eXBlOworCXVpbnQxNl90IHBheWxvYWRfdHlwZSwgcGF5bG9hZF9zaXplOworCWludCBpLCBqOworCisJaWYgKHNpemUgPCAyKQorCQlyZXR1cm4gMDsKKwloZWFkZXIgPSAqcCsrOworCWhlYWRlciA8PD0gODsKKwloZWFkZXIgKz0gKnArKzsKKwluYWxfdW5pdF90eXBlID0gaGVhZGVyID4+IDk7CisJaWYgKChuYWxfdW5pdF90eXBlICE9IE5BTF9VTklUX1NFSSkKKwkmJiAobmFsX3VuaXRfdHlwZSAhPSBOQUxfVU5JVF9TRUlfU1VGRklYKSkKKwkJcmV0dXJuIDA7CisJd2hpbGUgKHArNCA8PSBzZWlfYnVmK3NpemUpIHsKKwkJcGF5bG9hZF90eXBlID0gKnArKzsKKwkJaWYgKHBheWxvYWRfdHlwZSA9PSAweGZmKSB7CisJCQlwYXlsb2FkX3R5cGUgKz0gKnArKzsKKwkJfQorCQlwYXlsb2FkX3NpemUgPSAqcCsrOworCQlpZiAocGF5bG9hZF9zaXplID09IDB4ZmYpIHsKKwkJCXBheWxvYWRfc2l6ZSArPSAqcCsrOworCQl9CisKKwkJaWYgKHArcGF5bG9hZF9zaXplIDw9IHNlaV9idWYrc2l6ZSkgeworCQkJc3dpdGNoIChwYXlsb2FkX3R5cGUpIHsKKwkJCWNhc2UgU0VJX1BpY1RpbWluZzoKKwkJCQlpZiAoKHBhcnNlcl9zZWlfZW5hYmxlICYgMHg0KSAmJgorCQkJCQloZXZjLT5mcmFtZV9maWVsZF9pbmZvX3ByZXNlbnRfZmxhZykgeworCQkJCQlwX3NlaSA9IHA7CisJCQkJCWhldmMtPmN1cnJfcGljX3N0cnVjdCA9ICgqcF9zZWkgPj4gNCkmMHgwZjsKKwkJCQkJcGljLT5waWNfc3RydWN0ID0gaGV2Yy0+Y3Vycl9waWNfc3RydWN0OworCQkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYKKwkJCQkJCUgyNjVfREVCVUdfUElDX1NUUlVDVCkgeworCQkJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkJInBhcnNlIHJlc3VsdCBwaWNfc3RydWN0ID0gJWRcbiIsCisJCQkJCQloZXZjLT5jdXJyX3BpY19zdHJ1Y3QpOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBTRUlfVXNlckRhdGFJVFVfVF9UMzU6CisJCQkJcF9zZWkgPSBwOworCQkJCWlmIChwX3NlaVswXSA9PSAweEI1CisJCQkJCSYmIHBfc2VpWzFdID09IDB4MDAKKwkJCQkJJiYgcF9zZWlbMl0gPT0gMHgzQworCQkJCQkmJiBwX3NlaVszXSA9PSAweDAwCisJCQkJCSYmIHBfc2VpWzRdID09IDB4MDEKKwkJCQkJJiYgcF9zZWlbNV0gPT0gMHgwNCkgeworCQkJCQljaGFyICpuZXdfYnVmOworCQkJCQloZXZjLT5zZWlfcHJlc2VudF9mbGFnIHw9IFNFSV9IRFIxMFBMVVNfTUFTSzsKKwkJCQkJbmV3X2J1ZiA9IHZ6YWxsb2MocGF5bG9hZF9zaXplKTsKKwkJCQkJaWYgKG5ld19idWYpIHsKKwkJCQkJCW1lbWNweShuZXdfYnVmLCBwX3NlaSwgcGF5bG9hZF9zaXplKTsKKwkJCQkJCXBpYy0+aGRyMTBwX2RhdGFfYnVmID0gbmV3X2J1ZjsKKwkJCQkJCXBpYy0+aGRyMTBwX2RhdGFfc2l6ZSA9IHBheWxvYWRfc2l6ZTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJCQkiJXM6aGRyMTBwIGRhdGEgdnphbGxvYyBzaXplKCVkKSBmYWlsXG4iLAorCQkJCQkJCV9fZnVuY19fLCBwYXlsb2FkX3NpemUpOworCQkJCQkJcGljLT5oZHIxMHBfZGF0YV9idWYgPSBOVUxMOworCQkJCQkJcGljLT5oZHIxMHBfZGF0YV9zaXplID0gMDsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAocF9zZWlbMF0gPT0gMHgyNgorCQkJCQkmJiBwX3NlaVsxXSA9PSAweDAwCisJCQkJCSYmIHBfc2VpWzJdID09IDB4MDQKKwkJCQkJJiYgcF9zZWlbM10gPT0gMHgwMAorCQkJCQkmJiBwX3NlaVs0XSA9PSAweDA1KSB7CisJCQkJCWhldmMtPnNlaV9wcmVzZW50X2ZsYWcgfD0gU0VJX0hEUl9DVVZBX01BU0s7CisKKwkJCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfUFJJTlRfU0VJKSB7CisJCQkJCQlQUl9JTklUKDEyOCk7CisJCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCQkJImhkciBjdXZhIGRhdGE6IChzaXplICVkKVxuIiwKKwkJCQkJCQlwYXlsb2FkX3NpemUpOworCQkJCQkJZm9yIChpID0gMDsgaSA8IHBheWxvYWRfc2l6ZTsgaSsrKSB7CisJCQkJCQkJUFJfRklMTCgiJTAyeCAiLCBwX3NlaVtpXSk7CisJCQkJCQkJaWYgKCgoaSArIDEpICYgMHhmKSA9PSAwKQorCQkJCQkJCQlQUl9JTkZPKGhldmMtPmluZGV4KTsKKwkJCQkJCX0KKwkJCQkJCVBSX0lORk8oaGV2Yy0+aW5kZXgpOworCQkJCQl9CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQljYXNlIFNFSV9NYXN0ZXJpbmdEaXNwbGF5Q29sb3JWb2x1bWU6CisJCQkJLypoZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCSJzZWkgdHlwZTogcHJpbWFyeSBkaXNwbGF5IGNvbG9yIHZvbHVtZSAlZCwgc2l6ZSAlZFxuIiwKKwkJCQkJcGF5bG9hZF90eXBlLAorCQkJCQlwYXlsb2FkX3NpemUpOyovCisJCQkJLyogbWFzdGVyX2Rpc3BsYXlfY29sb3VyICovCisJCQkJcF9zZWkgPSBwOworCQkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCQkJZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworCQkJCQkJaGV2Yy0+cHJpbWFyaWVzW2ldW2pdCisJCQkJCQkJPSAoKnBfc2VpPDw4KQorCQkJCQkJCXwgKihwX3NlaSsxKTsKKwkJCQkJCXBfc2VpICs9IDI7CisJCQkJCX0KKwkJCQl9CisJCQkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJCQloZXZjLT53aGl0ZV9wb2ludFtpXQorCQkJCQkJPSAoKnBfc2VpPDw4KQorCQkJCQkJfCAqKHBfc2VpKzEpOworCQkJCQlwX3NlaSArPSAyOworCQkJCX0KKwkJCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCQkJCWhldmMtPmx1bWluYW5jZVtpXQorCQkJCQkJPSAoKnBfc2VpPDwyNCkKKwkJCQkJCXwgKCoocF9zZWkrMSk8PDE2KQorCQkJCQkJfCAoKihwX3NlaSsyKTw8OCkKKwkJCQkJCXwgKihwX3NlaSszKTsKKwkJCQkJcF9zZWkgKz0gNDsKKwkJCQl9CisJCQkJaGV2Yy0+c2VpX3ByZXNlbnRfZmxhZyB8PQorCQkJCQlTRUlfTUFTVEVSX0RJU1BMQVlfQ09MT1JfTUFTSzsKKwkJCQkvKmZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCQkJCWZvciAoaiA9IDA7IGogPCAyOyBqKyspCisJCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCQkiXHRwcmltYXJpZXNbJTFkXVslMWRdID0gJTA0eFxuIiwKKwkJCQkJCWksIGosCisJCQkJCQloZXZjLT5wcmltYXJpZXNbaV1bal0pOworCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJIlx0d2hpdGVfcG9pbnQgPSAoJTA0eCwgJTA0eClcbiIsCisJCQkJCWhldmMtPndoaXRlX3BvaW50WzBdLAorCQkJCQloZXZjLT53aGl0ZV9wb2ludFsxXSk7CisJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkiXHRtYXgsbWluIGx1bWluYW5jZSA9ICUwOHgsICUwOHhcbiIsCisJCQkJCWhldmMtPmx1bWluYW5jZVswXSwKKwkJCQkJaGV2Yy0+bHVtaW5hbmNlWzFdKTsqLworCQkJCWJyZWFrOworCQkJY2FzZSBTRUlfQ29udGVudExpZ2h0TGV2ZWw6CisJCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfUFJJTlRfU0VJKQorCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCQkic2VpIHR5cGU6IG1heCBjb250ZW50IGxpZ2h0IGxldmVsICVkLCBzaXplICVkXG4iLAorCQkJCQlwYXlsb2FkX3R5cGUsIHBheWxvYWRfc2l6ZSk7CisJCQkJLyogY29udGVudF9saWdodF9sZXZlbCAqLworCQkJCXBfc2VpID0gcDsKKwkJCQloZXZjLT5jb250ZW50X2xpZ2h0X2xldmVsWzBdCisJCQkJCT0gKCpwX3NlaTw8OCkgfCAqKHBfc2VpKzEpOworCQkJCXBfc2VpICs9IDI7CisJCQkJaGV2Yy0+Y29udGVudF9saWdodF9sZXZlbFsxXQorCQkJCQk9ICgqcF9zZWk8PDgpIHwgKihwX3NlaSsxKTsKKwkJCQlwX3NlaSArPSAyOworCQkJCWhldmMtPnNlaV9wcmVzZW50X2ZsYWcgfD0KKwkJCQkJU0VJX0NPTlRFTlRfTElHSFRfTEVWRUxfTUFTSzsKKwkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19QUklOVF9TRUkpCisJCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJCSJcdG1heCBjbGwgPSAlMDR4LCBtYXhfcGFfY2xsID0gJTA0eFxuIiwKKwkJCQkJaGV2Yy0+Y29udGVudF9saWdodF9sZXZlbFswXSwKKwkJCQkJaGV2Yy0+Y29udGVudF9saWdodF9sZXZlbFsxXSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXAgKz0gcGF5bG9hZF9zaXplOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNhbGNfYXIodW5zaWduZWQgaWRjLCB1bnNpZ25lZCBzYXJfdywgdW5zaWduZWQgc2FyX2gsCisJCQl1bnNpZ25lZCB3LCB1bnNpZ25lZCBoKQoreworCXVuc2lnbmVkIGFyOworCisJaWYgKGlkYwk9PSAyNTUpIHsKKwkJYXIgPSBkaXZfdTY0KDI1NlVMTCAqIHNhcl9oICogaCwKKwkJCQlzYXJfdyAqIHcpOworCX0gZWxzZSB7CisJCXN3aXRjaCAoaWRjKSB7CisJCWNhc2UgMToKKwkJCWFyID0gMHgxMDAgKiBoIC8gdzsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlhciA9IDB4MTAwICogaCAqIDExIC8gKHcgKiAxMik7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJYXIgPSAweDEwMCAqIGggKiAxMSAvICh3ICogMTApOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCWFyID0gMHgxMDAgKiBoICogMTEgLyAodyAqIDE2KTsKKwkJCWJyZWFrOworCQljYXNlIDU6CisJCQlhciA9IDB4MTAwICogaCAqIDMzIC8gKHcgKiA0MCk7CisJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJYXIgPSAweDEwMCAqIGggKiAxMSAvICh3ICogMjQpOworCQkJYnJlYWs7CisJCWNhc2UgNzoKKwkJCWFyID0gMHgxMDAgKiBoICogMTEgLyAodyAqIDIwKTsKKwkJCWJyZWFrOworCQljYXNlIDg6CisJCQlhciA9IDB4MTAwICogaCAqIDExIC8gKHcgKiAzMik7CisJCQlicmVhazsKKwkJY2FzZSA5OgorCQkJYXIgPSAweDEwMCAqIGggKiAzMyAvICh3ICogODApOworCQkJYnJlYWs7CisJCWNhc2UgMTA6CisJCQlhciA9IDB4MTAwICogaCAqIDExIC8gKHcgKiAxOCk7CisJCQlicmVhazsKKwkJY2FzZSAxMToKKwkJCWFyID0gMHgxMDAgKiBoICogMTEgLyAodyAqIDE1KTsKKwkJCWJyZWFrOworCQljYXNlIDEyOgorCQkJYXIgPSAweDEwMCAqIGggKiAzMyAvICh3ICogNjQpOworCQkJYnJlYWs7CisJCWNhc2UgMTM6CisJCQlhciA9IDB4MTAwICogaCAqIDk5IC8gKHcgKiAxNjApOworCQkJYnJlYWs7CisJCWNhc2UgMTQ6CisJCQlhciA9IDB4MTAwICogaCAqIDMgLyAodyAqIDQpOworCQkJYnJlYWs7CisJCWNhc2UgMTU6CisJCQlhciA9IDB4MTAwICogaCAqIDIgLyAodyAqIDMpOworCQkJYnJlYWs7CisJCWNhc2UgMTY6CisJCQlhciA9IDB4MTAwICogaCAqIDEgLyAodyAqIDIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlhciA9IGggKiAweDEwMCAvIHc7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBhcjsKK30KKworc3RhdGljIHZvaWQgc2V0X2ZyYW1lX2luZm8oc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Yywgc3RydWN0IHZmcmFtZV9zICp2ZiwKKwkJCXN0cnVjdCBQSUNfcyAqcGljKQoreworCXVuc2lnbmVkIGludCBhcjsKKwlpbnQgaSwgajsKKwljaGFyICpwOworCXVuc2lnbmVkIHNpemUgPSAwOworCXVuc2lnbmVkIHR5cGUgPSAwOworCXN0cnVjdCB2ZnJhbWVfbWFzdGVyX2Rpc3BsYXlfY29sb3VyX3MgKnZmX2RwCisJCT0gJnZmLT5wcm9wLm1hc3Rlcl9kaXNwbGF5X2NvbG91cjsKKworCXZmLT53aWR0aCA9IHBpYy0+d2lkdGggLworCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKHBpYy0+ZG91YmxlX3dyaXRlX21vZGUpOworCXZmLT5oZWlnaHQgPSBwaWMtPmhlaWdodCAvCisJCWdldF9kb3VibGVfd3JpdGVfcmF0aW8ocGljLT5kb3VibGVfd3JpdGVfbW9kZSk7CisKKwl2Zi0+ZHVyYXRpb24gPSBoZXZjLT5mcmFtZV9kdXI7CisJdmYtPmR1cmF0aW9uX3B1bGxkb3duID0gMDsKKwl2Zi0+ZmxhZyA9IDA7CisKKwlhciA9IG1pbl90KHUzMiwgaGV2Yy0+ZnJhbWVfYXIsIERJU1BfUkFUSU9fQVNQRUNUX1JBVElPX01BWCk7CisJdmYtPnJhdGlvX2NvbnRyb2wgPSAoYXIgPDwgRElTUF9SQVRJT19BU1BFQ1RfUkFUSU9fQklUKTsKKworCisJaWYgKCgocGljLT5hc3BlY3RfcmF0aW9faWRjID09IDI1NSkgJiYKKwkJcGljLT5zYXJfd2lkdGggJiYKKwkJcGljLT5zYXJfaGVpZ2h0KSB8fAorCQkoKHBpYy0+YXNwZWN0X3JhdGlvX2lkYyAhPSAyNTUpICYmCisJCShwaWMtPndpZHRoKSkpIHsKKwkJYXIgPSBtaW5fdCh1MzIsCisJCQljYWxjX2FyKHBpYy0+YXNwZWN0X3JhdGlvX2lkYywKKwkJCXBpYy0+c2FyX3dpZHRoLAorCQkJcGljLT5zYXJfaGVpZ2h0LAorCQkJcGljLT53aWR0aCwKKwkJCXBpYy0+aGVpZ2h0KSwKKwkJCURJU1BfUkFUSU9fQVNQRUNUX1JBVElPX01BWCk7CisJCXZmLT5yYXRpb19jb250cm9sID0gKGFyIDw8IERJU1BfUkFUSU9fQVNQRUNUX1JBVElPX0JJVCk7CisJCXZmLT5yYXRpb19jb250cm9sIDw8PSBoZXZjLT5pbnRlcmxhY2VfZmxhZzsKKwl9CisJaGV2Yy0+cmF0aW9fY29udHJvbCA9IHZmLT5yYXRpb19jb250cm9sOworCWlmIChwaWMtPmF1eF9kYXRhX2J1ZgorCQkmJiBwaWMtPmF1eF9kYXRhX3NpemUpIHsKKwkJLyogcGFyc2VyIHNlaSAqLworCQlwID0gcGljLT5hdXhfZGF0YV9idWY7CisJCXdoaWxlIChwIDwgcGljLT5hdXhfZGF0YV9idWYKKwkJCSsgcGljLT5hdXhfZGF0YV9zaXplIC0gOCkgeworCQkJc2l6ZSA9ICpwKys7CisJCQlzaXplID0gKHNpemUgPDwgOCkgfCAqcCsrOworCQkJc2l6ZSA9IChzaXplIDw8IDgpIHwgKnArKzsKKwkJCXNpemUgPSAoc2l6ZSA8PCA4KSB8ICpwKys7CisJCQl0eXBlID0gKnArKzsKKwkJCXR5cGUgPSAodHlwZSA8PCA4KSB8ICpwKys7CisJCQl0eXBlID0gKHR5cGUgPDwgOCkgfCAqcCsrOworCQkJdHlwZSA9ICh0eXBlIDw8IDgpIHwgKnArKzsKKwkJCWlmICh0eXBlID09IDB4MDIwMDAwMDApIHsKKwkJCQkvKiBoZXZjX3ByaW50KGhldmMsIDAsCisJCQkJInNlaSglZClcbiIsIHNpemUpOyAqLworCQkJCXBhcnNlX3NlaShoZXZjLCBwaWMsIHAsIHNpemUpOworCQkJfQorCQkJcCArPSBzaXplOworCQl9CisJfQorCWlmIChoZXZjLT52aWRlb19zaWduYWxfdHlwZSAmIFZJREVPX1NJR05BTF9UWVBFX0FWQUlMQUJMRV9NQVNLKSB7CisJCXZmLT5zaWduYWxfdHlwZSA9IHBpYy0+dmlkZW9fc2lnbmFsX3R5cGU7CisJCWlmIChoZXZjLT5zZWlfcHJlc2VudF9mbGFnICYgU0VJX0hEUjEwUExVU19NQVNLKSB7CisJCQl1MzIgZGF0YTsKKwkJCWRhdGEgPSB2Zi0+c2lnbmFsX3R5cGU7CisJCQlkYXRhID0gZGF0YSAmIDB4RkZGRjAwRkY7CisJCQlkYXRhID0gZGF0YSB8ICgweDMwPDw4KTsKKwkJCXZmLT5zaWduYWxfdHlwZSA9IGRhdGE7CisJCX0KKworCQlpZiAoaGV2Yy0+c2VpX3ByZXNlbnRfZmxhZyAmIFNFSV9IRFJfQ1VWQV9NQVNLKSB7CisJCQl1MzIgZGF0YTsKKwkJCWRhdGEgPSB2Zi0+c2lnbmFsX3R5cGU7CisJCQlkYXRhID0gZGF0YSAmIDB4N0ZGRkZGRkY7CisJCQlkYXRhID0gZGF0YSB8ICgxPDwzMSk7CisJCQl2Zi0+c2lnbmFsX3R5cGUgPSBkYXRhOworCQl9CisJfQorCWVsc2UKKwkJdmYtPnNpZ25hbF90eXBlID0gMDsKKwloZXZjLT52aWRlb19zaWduYWxfdHlwZV9kZWJ1ZyA9IHZmLT5zaWduYWxfdHlwZTsKKworCS8qIG1hc3Rlcl9kaXNwbGF5X2NvbG91ciAqLworCWlmIChoZXZjLT5zZWlfcHJlc2VudF9mbGFnICYgU0VJX01BU1RFUl9ESVNQTEFZX0NPTE9SX01BU0spIHsKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCWZvciAoaiA9IDA7IGogPCAyOyBqKyspCisJCQkJdmZfZHAtPnByaW1hcmllc1tpXVtqXSA9IGhldmMtPnByaW1hcmllc1tpXVtqXTsKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJdmZfZHAtPndoaXRlX3BvaW50W2ldID0gaGV2Yy0+d2hpdGVfcG9pbnRbaV07CisJCQl2Zl9kcC0+bHVtaW5hbmNlW2ldCisJCQkJPSBoZXZjLT5sdW1pbmFuY2VbaV07CisJCX0KKwkJdmZfZHAtPnByZXNlbnRfZmxhZyA9IDE7CisJfSBlbHNlCisJCXZmX2RwLT5wcmVzZW50X2ZsYWcgPSAwOworCisJLyogY29udGVudF9saWdodF9sZXZlbCAqLworCWlmIChoZXZjLT5zZWlfcHJlc2VudF9mbGFnICYgU0VJX0NPTlRFTlRfTElHSFRfTEVWRUxfTUFTSykgeworCQl2Zl9kcC0+Y29udGVudF9saWdodF9sZXZlbC5tYXhfY29udGVudAorCQkJPSBoZXZjLT5jb250ZW50X2xpZ2h0X2xldmVsWzBdOworCQl2Zl9kcC0+Y29udGVudF9saWdodF9sZXZlbC5tYXhfcGljX2F2ZXJhZ2UKKwkJCT0gaGV2Yy0+Y29udGVudF9saWdodF9sZXZlbFsxXTsKKwkJdmZfZHAtPmNvbnRlbnRfbGlnaHRfbGV2ZWwucHJlc2VudF9mbGFnID0gMTsKKwl9IGVsc2UKKwkJdmZfZHAtPmNvbnRlbnRfbGlnaHRfbGV2ZWwucHJlc2VudF9mbGFnID0gMDsKKworCWlmIChoZXZjLT5pc191c2VkX3Y0bCAmJgorCQkoKGhldmMtPnZpZGVvX3NpZ25hbF90eXBlICYgVklERU9fU0lHTkFMX1RZUEVfQVZBSUxBQkxFX01BU0spIHx8CisJCShoZXZjLT5zZWlfcHJlc2VudF9mbGFnICYgU0VJX0hEUjEwUExVU19NQVNLKSB8fAorCQkodmZfZHAtPnByZXNlbnRfZmxhZykgfHwKKwkJKHZmX2RwLT5jb250ZW50X2xpZ2h0X2xldmVsLnByZXNlbnRfZmxhZykpKSB7CisJCXN0cnVjdCBhbWxfdmRlY19oZHJfaW5mb3MgaGRyOworCQlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGhldmMtPnY0bDJfY3R4KTsKKworCQltZW1zZXQoJmhkciwgMCwgc2l6ZW9mKGhkcikpOworCQloZHIuc2lnbmFsX3R5cGUgPSB2Zi0+c2lnbmFsX3R5cGU7CisJCWhkci5jb2xvcl9wYXJtcyA9ICp2Zl9kcDsKKwkJdmRlY192NGxfc2V0X2hkcl9pbmZvcyhjdHgsICZoZHIpOworCX0KKworCWlmICgoaGV2Yy0+c2VpX3ByZXNlbnRfZmxhZyAmIFNFSV9IRFIxMFBMVVNfTUFTSykgJiYgKHBpYy0+aGRyMTBwX2RhdGFfYnVmICE9IE5VTEwpCisJCSYmIChwaWMtPmhkcjEwcF9kYXRhX3NpemUgIT0gMCkpIHsKKwkJaWYgKHBpYy0+aGRyMTBwX2RhdGFfc2l6ZSA8PSAxMjgpIHsKKwkJCWNoYXIgKm5ld19idWY7CisJCQluZXdfYnVmID0ga3phbGxvYyhwaWMtPmhkcjEwcF9kYXRhX3NpemUsIEdGUF9BVE9NSUMpOworCisJCQlpZiAobmV3X2J1ZikgeworCQkJCW1lbWNweShuZXdfYnVmLCBwaWMtPmhkcjEwcF9kYXRhX2J1ZiwgcGljLT5oZHIxMHBfZGF0YV9zaXplKTsKKwkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19QUklOVF9TRUkpIHsKKwkJCQkJUFJfSU5JVCgxMjgpOworCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCQkiaGRyMTBwIGRhdGE6IChzaXplICVkKVxuIiwKKwkJCQkJCXBpYy0+aGRyMTBwX2RhdGFfc2l6ZSk7CisJCQkJCWZvciAoaSA9IDA7IGkgPCBwaWMtPmhkcjEwcF9kYXRhX3NpemU7IGkrKykgeworCQkJCQkJUFJfRklMTCgiJTAyeCAiLCBwaWMtPmhkcjEwcF9kYXRhX2J1ZltpXSk7CisJCQkJCQlpZiAoKChpICsgMSkgJiAweGYpID09IDApCisJCQkJCQkJUFJfSU5GTyhoZXZjLT5pbmRleCk7CisJCQkJCX0KKwkJCQkJUFJfSU5GTyhoZXZjLT5pbmRleCk7CisJCQkJfQorCisJCQkJdmYtPmhkcjEwcF9kYXRhX3NpemUgPSBwaWMtPmhkcjEwcF9kYXRhX3NpemU7CisJCQkJdmYtPmhkcjEwcF9kYXRhX2J1ZiA9IG5ld19idWY7CisJCQkJc2V0X21ldGFfZGF0YV90b192Zih2ZiwgVVZNX01FVEFfREFUQV9IRFIxMFBfREFUQSwgaGV2Yy0+djRsMl9jdHgpOworCQkJfSBlbHNlIHsKKwkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCSIlczpoZHIxMHAgZGF0YSB2emFsbG9jIHNpemUoJWQpIGZhaWxcbiIsCisJCQkJCV9fZnVuY19fLCBwaWMtPmhkcjEwcF9kYXRhX3NpemUpOworCQkJCXZmLT5oZHIxMHBfZGF0YV9idWYgPSBOVUxMOworCQkJCXZmLT5oZHIxMHBfZGF0YV9zaXplID0gMDsKKwkJCX0KKwkJfQorCisJCXZmcmVlKHBpYy0+aGRyMTBwX2RhdGFfYnVmKTsKKwkJcGljLT5oZHIxMHBfZGF0YV9idWYgPSBOVUxMOworCQlwaWMtPmhkcjEwcF9kYXRhX3NpemUgPSAwOworCX0KKworCXZmLT5zaWRlYmluZF90eXBlID0gaGV2Yy0+c2lkZWJpbmRfdHlwZTsKKwl2Zi0+c2lkZWJpbmRfY2hhbm5lbF9pZCA9IGhldmMtPnNpZGViaW5kX2NoYW5uZWxfaWQ7Cit9CisKK3N0YXRpYyBpbnQgdmgyNjVfdmZfc3RhdGVzKHN0cnVjdCB2ZnJhbWVfc3RhdGVzICpzdGF0ZXMsIHZvaWQgKm9wX2FyZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gb3BfYXJnOworCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPSAoc3RydWN0IGhldmNfc3RhdGVfcyAqKXZkZWMtPnByaXZhdGU7CisjZWxzZQorCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPSAoc3RydWN0IGhldmNfc3RhdGVfcyAqKW9wX2FyZzsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKKworCXN0YXRlcy0+dmZfcG9vbF9zaXplID0gVkZfUE9PTF9TSVpFOworCXN0YXRlcy0+YnVmX2ZyZWVfbnVtID0ga2ZpZm9fbGVuKCZoZXZjLT5uZXdmcmFtZV9xKTsKKwlzdGF0ZXMtPmJ1Zl9hdmFpbF9udW0gPSBrZmlmb19sZW4oJmhldmMtPmRpc3BsYXlfcSk7CisKKwlpZiAoc3RlcCA9PSAyKQorCQlzdGF0ZXMtPmJ1Zl9hdmFpbF9udW0gPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyAqdmgyNjVfdmZfcGVlayh2b2lkICpvcF9hcmcpCit7CisJc3RydWN0IHZmcmFtZV9zICp2ZlsyXSA9IHswLCAwfTsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IG9wX2FyZzsKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjID0gKHN0cnVjdCBoZXZjX3N0YXRlX3MgKil2ZGVjLT5wcml2YXRlOworI2Vsc2UKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjID0gKHN0cnVjdCBoZXZjX3N0YXRlX3MgKilvcF9hcmc7CisjZW5kaWYKKworCWlmIChzdGVwID09IDIpCisJCXJldHVybiBOVUxMOworCisJaWYgKGZvcmNlX2Rpc3BfcGljX2luZGV4ICYgMHgxMDApIHsKKwkJaWYgKGZvcmNlX2Rpc3BfcGljX2luZGV4ICYgMHgyMDApCisJCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuICZoZXZjLT52ZnJhbWVfZHVtbXk7CisJfQorCisKKwlpZiAoa2ZpZm9fb3V0X3BlZWsoJmhldmMtPmRpc3BsYXlfcSwgKHZvaWQgKikmdmYsIDIpKSB7CisJCWlmICh2ZlsxXSkgeworCQkJdmZbMF0tPm5leHRfdmZfcHRzX3ZhbGlkID0gdHJ1ZTsKKwkJCXZmWzBdLT5uZXh0X3ZmX3B0cyA9IHZmWzFdLT5wdHM7CisJCX0gZWxzZQorCQkJdmZbMF0tPm5leHRfdmZfcHRzX3ZhbGlkID0gZmFsc2U7CisJCXJldHVybiB2ZlswXTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyAqdmgyNjVfdmZfZ2V0KHZvaWQgKm9wX2FyZykKK3sKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmOworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gb3BfYXJnOworCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPSAoc3RydWN0IGhldmNfc3RhdGVfcyAqKXZkZWMtPnByaXZhdGU7CisjZWxzZQorCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPSAoc3RydWN0IGhldmNfc3RhdGVfcyAqKW9wX2FyZzsKKyNlbmRpZgorCisJaWYgKHN0ZXAgPT0gMikKKwkJcmV0dXJuIE5VTEw7CisJZWxzZSBpZiAoc3RlcCA9PSAxKQorCQlzdGVwID0gMjsKKworI2lmIDAKKwlpZiAoZm9yY2VfZGlzcF9waWNfaW5kZXggJiAweDEwMCkgeworCQlpbnQgYnVmZmVyX2luZGV4ID0gZm9yY2VfZGlzcF9waWNfaW5kZXggJiAweGZmOworCQlzdHJ1Y3QgUElDX3MgKnBpYyA9IE5VTEw7CisJCWlmIChidWZmZXJfaW5kZXggPj0gMAorCQkJJiYgYnVmZmVyX2luZGV4IDwgTUFYX1JFRl9QSUNfTlVNKQorCQkJcGljID0gaGV2Yy0+bV9QSUNbYnVmZmVyX2luZGV4XTsKKwkJaWYgKHBpYyA9PSBOVUxMKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmIChmb3JjZV9kaXNwX3BpY19pbmRleCAmIDB4MjAwKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJdmYgPSAmaGV2Yy0+dmZyYW1lX2R1bW15OworCQlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGhldmMpKSB7CisJCQl2Zi0+dHlwZSA9IFZJRFRZUEVfUFJPR1JFU1NJVkUgfCBWSURUWVBFX1ZJVV9GSUVMRCB8CisJCQkJVklEVFlQRV9WSVVfTlYyMTsKKwkJCWlmIChoZXZjLT5tX2luc19mbGFnKSB7CisJCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0gLTE7CisJCQkJdmYtPnBsYW5lX251bSA9IDI7CisJCQkJdmYtPmNhbnZhczBfY29uZmlnWzBdID0KKwkJCQkJcGljLT5jYW52YXNfY29uZmlnWzBdOworCQkJCXZmLT5jYW52YXMwX2NvbmZpZ1sxXSA9CisJCQkJCXBpYy0+Y2FudmFzX2NvbmZpZ1sxXTsKKworCQkJCXZmLT5jYW52YXMxX2NvbmZpZ1swXSA9CisJCQkJCXBpYy0+Y2FudmFzX2NvbmZpZ1swXTsKKwkJCQl2Zi0+Y2FudmFzMV9jb25maWdbMV0gPQorCQkJCQlwaWMtPmNhbnZhc19jb25maWdbMV07CisJCQl9IGVsc2UgeworCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkcgorCQkJCT0gc3BlYzJjYW52YXMocGljKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IDA7CisJCQl2Zi0+dHlwZSA9IFZJRFRZUEVfQ09NUFJFU1MgfCBWSURUWVBFX1ZJVV9GSUVMRDsKKwkJCWlmIChoZXZjLT5tbXVfZW5hYmxlKQorCQkJCXZmLT50eXBlIHw9IFZJRFRZUEVfU0NBVFRFUjsKKwkJfQorCQl2Zi0+Y29tcFdpZHRoID0gcGljLT53aWR0aDsKKwkJdmYtPmNvbXBIZWlnaHQgPSBwaWMtPmhlaWdodDsKKwkJdXBkYXRlX3ZmX21lbWhhbmRsZShoZXZjLCB2ZiwgcGljKTsKKwkJc3dpdGNoIChoZXZjLT5iaXRfZGVwdGhfbHVtYSkgeworCQljYXNlIDk6CisJCQl2Zi0+Yml0ZGVwdGggPSBCSVRERVBUSF9ZOSB8IEJJVERFUFRIX1U5IHwgQklUREVQVEhfVjk7CisJCQlicmVhazsKKwkJY2FzZSAxMDoKKwkJCXZmLT5iaXRkZXB0aCA9IEJJVERFUFRIX1kxMCB8IEJJVERFUFRIX1UxMAorCQkJCXwgQklUREVQVEhfVjEwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl2Zi0+Yml0ZGVwdGggPSBCSVRERVBUSF9ZOCB8IEJJVERFUFRIX1U4IHwgQklUREVQVEhfVjg7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKHZmLT50eXBlICYgVklEVFlQRV9DT01QUkVTUykgPT0gMCkKKwkJCXZmLT5iaXRkZXB0aCA9CisJCQkJQklUREVQVEhfWTggfCBCSVRERVBUSF9VOCB8IEJJVERFUFRIX1Y4OworCQlpZiAoaGV2Yy0+bWVtX3NhdmluZ19tb2RlID09IDEpCisJCQl2Zi0+Yml0ZGVwdGggfD0gQklUREVQVEhfU0FWSU5HX01PREU7CisJCXZmLT5kdXJhdGlvbl9wdWxsZG93biA9IDA7CisJCXZmLT5wdHMgPSAwOworCQl2Zi0+cHRzX3VzNjQgPSAwOworCQlzZXRfZnJhbWVfaW5mbyhoZXZjLCB2Zik7CisKKwkJdmYtPndpZHRoID0gcGljLT53aWR0aCAvCisJCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKHBpYy0+ZG91YmxlX3dyaXRlX21vZGUpOworCQl2Zi0+aGVpZ2h0ID0gcGljLT5oZWlnaHQgLworCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhwaWMtPmRvdWJsZV93cml0ZV9tb2RlKTsKKworCQlmb3JjZV9kaXNwX3BpY19pbmRleCB8PSAweDIwMDsKKwkJcmV0dXJuIHZmOworCX0KKyNlbmRpZgorCisJaWYgKGtmaWZvX2dldCgmaGV2Yy0+ZGlzcGxheV9xLCAmdmYpKSB7CisJCXN0cnVjdCB2ZnJhbWVfcyAqbmV4dF92ZiA9IE5VTEw7CisKKwkJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UudmZfZ2V0X25hbWUsIChsb25nKXZmKTsKKwkJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UuZGlzcF9xX25hbWUsIGtmaWZvX2xlbigmaGV2Yy0+ZGlzcGxheV9xKSk7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5zZXRfY2FudmFzMF9hZGRyLCB2Zi0+Y2FudmFzMF9jb25maWdbMF0ucGh5X2FkZHIpOworI2Vsc2UKKwkJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UuZ2V0X2NhbnZhczBfYWRkciwgdmYtPmNhbnZhczBBZGRyKTsKKyNlbmRpZgorCisJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX1BJQ19TVFJVQ1QpIHsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkiJXModmYgMHglcCB0eXBlICVkIGluZGV4IDB4JXggcG9jICVkLyVkKSBwdHMoJWQsJWQpIGR1ciAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgdmYsIHZmLT50eXBlLCB2Zi0+aW5kZXgsCisJCQkJZ2V0X3BpY19wb2MoaGV2YywgdmYtPmluZGV4ICYgMHhmZiksCisJCQkJZ2V0X3BpY19wb2MoaGV2YywgKHZmLT5pbmRleCA+PiA4KSAmIDB4ZmYpLAorCQkJCXZmLT5wdHMsIHZmLT5wdHNfdXM2NCwKKwkJCQl2Zi0+ZHVyYXRpb24pOworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwgImdldCBjYW52YXMwIGFkZHI6MHgleFxuIiwgdmYtPmNhbnZhczBfY29uZmlnWzBdLnBoeV9hZGRyKTsKKyNlbHNlCisJCQloZXZjX3ByaW50KGhldmMsIDAsICJnZXQgY2FudmFzMCBhZGRyOjB4JXhcbiIsIHZmLT5jYW52YXMwQWRkcik7CisjZW5kaWYKKwkJfQorI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0RWKSB7CisJCQlzdHJ1Y3QgUElDX3MgKnBpYyA9IGhldmMtPm1fUElDW3ZmLT5pbmRleCAmIDB4ZmZdOworCQkJaGV2Y19wcmludChoZXZjLCAwLCAicGljIDB4JXAgYXV4IHNpemUgJWQ6XG4iLAorCQkJCQlwaWMsIHBpYy0+YXV4X2RhdGFfc2l6ZSk7CisJCQlpZiAocGljLT5hdXhfZGF0YV9idWYgJiYgcGljLT5hdXhfZGF0YV9zaXplID4gMCkgeworCQkJCVBSX0lOSVQoMTI4KTsKKwkJCQlpbnQgaTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgcGljLT5hdXhfZGF0YV9zaXplOyBpKyspIHsKKwkJCQkJUFJfRklMTCgiJTAyeCAiLCBwaWMtPmF1eF9kYXRhX2J1ZltpXSk7CisJCQkJCWlmICgoKGkgKyAxKSAmIDB4ZikgPT0gMCkKKwkJCQkJCVBSX0lORk8oaGV2Yy0+aW5kZXgpOworCQkJCX0KKwkJCQlQUl9JTkZPKGhldmMtPmluZGV4KTsKKwkJCX0KKwkJfQorI2VuZGlmCisJCWhldmMtPnNob3dfZnJhbWVfbnVtKys7CisJCXZmLT5pbmRleF9kaXNwID0gYXRvbWljX3JlYWQoJmhldmMtPnZmX2dldF9jb3VudCk7CisJCWF0b21pY19hZGQoMSwgJmhldmMtPnZmX2dldF9jb3VudCk7CisKKwkJaWYgKGtmaWZvX3BlZWsoJmhldmMtPmRpc3BsYXlfcSwgJm5leHRfdmYpICYmIG5leHRfdmYpIHsKKwkJCXZmLT5uZXh0X3ZmX3B0c192YWxpZCA9IHRydWU7CisJCQl2Zi0+bmV4dF92Zl9wdHMgPSBuZXh0X3ZmLT5wdHM7CisJCX0gZWxzZQorCQkJdmYtPm5leHRfdmZfcHRzX3ZhbGlkID0gZmFsc2U7CisKKwkJcmV0dXJuIHZmOworCX0KKworCXJldHVybiBOVUxMOworfQorc3RhdGljIGJvb2wgdmZfdmFsaWRfY2hlY2soc3RydWN0IHZmcmFtZV9zICp2Ziwgc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykgeworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBWRl9QT09MX1NJWkU7IGkrKykgeworCQlpZiAodmYgPT0gJmhldmMtPnZmcG9vbFtpXSAgfHwgdmYgPT0gJmhldmMtPnZmcmFtZV9kdW1teSkKKwkJCXJldHVybiB0cnVlOworCX0KKwloZXZjX3ByaW50KGhldmMsIDAsIiBoMjY1IGludmFsaWQgdmYgYmVlbiBwdXQsIHZmID0gJXBcbiIsIHZmKTsKKwlmb3IgKGkgPSAwOyBpIDwgVkZfUE9PTF9TSVpFOyBpKyspIHsKKwkJaGV2Y19wcmludChoZXZjLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLCJ2YWxpZCB2ZlslZF09ICVwIFxuIiwgaSwgJmhldmMtPnZmcG9vbFtpXSk7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgdmgyNjVfdmZfcHV0KHN0cnVjdCB2ZnJhbWVfcyAqdmYsIHZvaWQgKm9wX2FyZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gb3BfYXJnOworCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPSAoc3RydWN0IGhldmNfc3RhdGVfcyAqKXZkZWMtPnByaXZhdGU7CisjZWxzZQorCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPSAoc3RydWN0IGhldmNfc3RhdGVfcyAqKW9wX2FyZzsKKyNlbmRpZgorCXVuc2lnbmVkIGNoYXIgaW5kZXhfdG9wOworCXVuc2lnbmVkIGNoYXIgaW5kZXhfYm90OworCisJaWYgKCF2ZikKKwkJcmV0dXJuOworCWlmICh2ZiA9PSAoJmhldmMtPnZmcmFtZV9kdW1teSkpCisJCXJldHVybjsKKwlpZiAodmYgJiYgKHZmX3ZhbGlkX2NoZWNrKHZmLCBoZXZjKSA9PSBmYWxzZSkpCisJCXJldHVybjsKKworCWlmIChoZXZjLT5lbmFibGVfZmVuY2UgJiYgdmYtPmZlbmNlKSB7CisJCWludCByZXQsIGk7CisKKwkJbXV0ZXhfbG9jaygmaGV2Yy0+ZmVuY2VfbXV0ZXgpOworCQlyZXQgPSBkbWFfZmVuY2VfZ2V0X3N0YXR1cyh2Zi0+ZmVuY2UpOworCQlpZiAocmV0ID09IDApIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBWRl9QT09MX1NJWkU7IGkrKykgeworCQkJCWlmIChoZXZjLT5mZW5jZV92Zl9zLmZlbmNlX3ZmW2ldID09IE5VTEwpIHsKKwkJCQkJaGV2Yy0+ZmVuY2VfdmZfcy5mZW5jZV92ZltpXSA9IHZmOworCQkJCQloZXZjLT5mZW5jZV92Zl9zLnVzZWRfc2l6ZSsrOworCQkJCQltdXRleF91bmxvY2soJmhldmMtPmZlbmNlX211dGV4KTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCQltdXRleF91bmxvY2soJmhldmMtPmZlbmNlX211dGV4KTsKKwl9CisKKwlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS52Zl9wdXRfbmFtZSwgKGxvbmcpdmYpOworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5wdXRfY2FudmFzMF9hZGRyLCB2Zi0+Y2FudmFzMF9jb25maWdbMF0ucGh5X2FkZHIpOworI2Vsc2UKKwlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5wdXRfY2FudmFzMF9hZGRyLCB2Zi0+Y2FudmFzMEFkZHIpOworI2VuZGlmCisJaW5kZXhfdG9wID0gdmYtPmluZGV4ICYgMHhmZjsKKwlpbmRleF9ib3QgPSAodmYtPmluZGV4ID4+IDgpICYgMHhmZjsKKwlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19QSUNfU1RSVUNUKQorCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiJXModmYgMHglcCB0eXBlICVkIGluZGV4IDB4JXggcHV0IGNhbnZhczAgYWRkcjoweCV4KVxuIiwKKwkJCV9fZnVuY19fLCB2ZiwgdmYtPnR5cGUsIHZmLT5pbmRleAorI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwkJCSwgdmYtPmNhbnZhczBfY29uZmlnWzBdLnBoeV9hZGRyCisjZWxzZQorCQkJLCB2Zi0+Y2FudmFzMEFkZHIKKyNlbmRpZgorCQkJKTsKKwlhdG9taWNfYWRkKDEsICZoZXZjLT52Zl9wdXRfY291bnQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CisJa2ZpZm9fcHV0KCZoZXZjLT5uZXdmcmFtZV9xLCAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLm5ld19xX25hbWUsIGtmaWZvX2xlbigmaGV2Yy0+bmV3ZnJhbWVfcSkpOworCWlmIChoZXZjLT5lbmFibGVfZmVuY2UgJiYgdmYtPmZlbmNlKSB7CisJCXZkZWNfZmVuY2VfcHV0KHZmLT5mZW5jZSk7CisJCXZmLT5mZW5jZSA9IE5VTEw7CisJfQorCisJaWYgKHZmLT5oZHIxMHBfZGF0YV9idWYpIHsKKwkJa2ZyZWUodmYtPmhkcjEwcF9kYXRhX2J1Zik7CisJCXZmLT5oZHIxMHBfZGF0YV9idWYgPSBOVUxMOworCQl2Zi0+aGRyMTBwX2RhdGFfc2l6ZSA9IDA7CisJfQorCisJaWYgKHZmLT5tZXRhX2RhdGFfYnVmKSB7CisJCXZmLT5tZXRhX2RhdGFfYnVmID0gTlVMTDsKKwkJdmYtPm1ldGFfZGF0YV9zaXplID0gMDsKKwl9CisKKwlpZiAoIWhldmMtPmludGVybGFjZV9mbGFnICYmCisJCSh2Zi0+djRsX21lbV9oYW5kbGUgIT0KKwkJaGV2Yy0+bV9QSUNbaW5kZXhfdG9wXS0+Y21hX2FsbG9jX2FkZHIpKSB7CisJCWhldmNfcHJpbnQoaGV2YywgUFJJTlRfRkxBR19WNExfREVUQUlMLAorCQkJIkgyNjUgdXBkYXRlIGZiIGhhbmRsZSwgb2xkOiVsbHgsIG5ldzolbGx4XG4iLAorCQkJaGV2Yy0+bV9QSUNbaW5kZXhfdG9wXS0+Y21hX2FsbG9jX2FkZHIsCisJCQl2Zi0+djRsX21lbV9oYW5kbGUpOworCisJCWhldmMtPm1fUElDW2luZGV4X3RvcF0tPmNtYV9hbGxvY19hZGRyCisJCQk9IHZmLT52NGxfbWVtX2hhbmRsZTsKKwl9CisKKwlpZiAoaW5kZXhfdG9wICE9IDB4ZmYKKwkJJiYgaW5kZXhfdG9wIDwgTUFYX1JFRl9QSUNfTlVNCisJCSYmIGhldmMtPm1fUElDW2luZGV4X3RvcF0pIHsKKwkJaWYgKGhldmMtPm1fUElDW2luZGV4X3RvcF0tPnZmX3JlZiA+IDApIHsKKwkJCWhldmMtPm1fUElDW2luZGV4X3RvcF0tPnZmX3JlZi0tOworCisJCQlpZiAoaGV2Yy0+bV9QSUNbaW5kZXhfdG9wXS0+dmZfcmVmID09IDApIHsKKwkJCQloZXZjLT5tX1BJQ1tpbmRleF90b3BdLT5vdXRwdXRfcmVhZHkgPSAwOworCQkJCWhldmMtPm1fUElDW2luZGV4X3RvcF0tPnNob3dfZnJhbWUgPSBmYWxzZTsKKworCQkJCWlmIChoZXZjLT53YWl0X2J1ZiAhPSAwKQorCQkJCQlXUklURV9WUkVHKEhFVkNfQVNTSVNUX01CT1gwX0lSUV9SRUcsCisJCQkJCQkweDEpOworCQkJfQorCQl9CisJfQorCisJaWYgKGluZGV4X2JvdCAhPSAweGZmCisJCSYmIGluZGV4X2JvdCA8IE1BWF9SRUZfUElDX05VTQorCQkmJiBoZXZjLT5tX1BJQ1tpbmRleF9ib3RdKSB7CisJCWlmIChoZXZjLT5tX1BJQ1tpbmRleF9ib3RdLT52Zl9yZWYgPiAwKSB7CisJCQloZXZjLT5tX1BJQ1tpbmRleF9ib3RdLT52Zl9yZWYtLTsKKworCQkJaWYgKGhldmMtPm1fUElDW2luZGV4X2JvdF0tPnZmX3JlZiA9PSAwKSB7CisJCQkJaGV2Yy0+bV9QSUNbaW5kZXhfYm90XS0+b3V0cHV0X3JlYWR5ID0gMDsKKwkJCQloZXZjLT5tX1BJQ1tpbmRleF9ib3RdLT5zaG93X2ZyYW1lID0gZmFsc2U7CisKKwkJCQlpZiAoaGV2Yy0+d2FpdF9idWYgIT0gMCkKKwkJCQkJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9NQk9YMF9JUlFfUkVHLAorCQkJCQkJMHgxKTsKKwkJCX0KKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKK30KKworCitzdGF0aWMgaW50IHZoMjY1X2V2ZW50X2NiKGludCB0eXBlLCB2b2lkICpkYXRhLCB2b2lkICpvcF9hcmcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IG9wX2FyZzsKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjID0gKHN0cnVjdCBoZXZjX3N0YXRlX3MgKil2ZGVjLT5wcml2YXRlOworI2Vsc2UKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjID0gKHN0cnVjdCBoZXZjX3N0YXRlX3MgKilvcF9hcmc7CisjZW5kaWYKKwlpZiAodHlwZSAmIFZGUkFNRV9FVkVOVF9SRUNFSVZFUl9SRVNFVCkgeworI2lmIDAKKwkJYW1oZXZjX3N0b3AoKTsKKyNpZm5kZWYgQ09ORklHX0FNTE9HSUNfUE9TVF9QUk9DRVNTX01BTkFHRVIKKwkJdmZfbGlnaHRfdW5yZWdfcHJvdmlkZXIoJnZoMjY1X3ZmX3Byb3YpOworI2VuZGlmCisJCXNwaW5fbG9ja19pcnFzYXZlKCZoZXZjLT5sb2NrLCBmbGFncyk7CisJCXZoMjY1X2xvY2FsX2luaXQoKTsKKwkJdmgyNjVfcHJvdF9pbml0KCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhldmMtPmxvY2ssIGZsYWdzKTsKKyNpZm5kZWYgQ09ORklHX0FNTE9HSUNfUE9TVF9QUk9DRVNTX01BTkFHRVIKKwkJdmZfcmVnX3Byb3ZpZGVyKCZ2aDI2NV92Zl9wcm92KTsKKyNlbmRpZgorCQlhbWhldmNfc3RhcnQoKTsKKyNlbmRpZgorCX0gZWxzZSBpZiAodHlwZSAmIFZGUkFNRV9FVkVOVF9SRUNFSVZFUl9HRVRfQVVYX0RBVEEpIHsKKwkJc3RydWN0IHByb3ZpZGVyX2F1eF9yZXFfcyAqcmVxID0KKwkJCShzdHJ1Y3QgcHJvdmlkZXJfYXV4X3JlcV9zICopZGF0YTsKKwkJdW5zaWduZWQgY2hhciBpbmRleDsKKworCQlpZiAoIXJlcS0+dmYpIHsKKwkJCXJlcS0+YXV4X3NpemUgPSBhdG9taWNfcmVhZCgmaGV2Yy0+dmZfcHV0X2NvdW50KTsKKwkJCXJldHVybiAwOworCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CisJCWluZGV4ID0gcmVxLT52Zi0+aW5kZXggJiAweGZmOworCQlyZXEtPmF1eF9idWYgPSBOVUxMOworCQlyZXEtPmF1eF9zaXplID0gMDsKKwkJcmVxLT5mb3JtYXQgPSBWRk9STUFUX0hFVkM7CisJCWlmIChyZXEtPmJvdF9mbGFnKQorCQkJaW5kZXggPSAocmVxLT52Zi0+aW5kZXggPj4gOCkgJiAweGZmOworCQlpZiAoaW5kZXggIT0gMHhmZgorCQkJJiYgaW5kZXggPCBNQVhfUkVGX1BJQ19OVU0KKwkJCSYmIGhldmMtPm1fUElDW2luZGV4XSkgeworCQkJcmVxLT5hdXhfYnVmID0gaGV2Yy0+bV9QSUNbaW5kZXhdLT5hdXhfZGF0YV9idWY7CisJCQlyZXEtPmF1eF9zaXplID0gaGV2Yy0+bV9QSUNbaW5kZXhdLT5hdXhfZGF0YV9zaXplOworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJCQlpZiAoaGV2Yy0+YnlwYXNzX2R2ZW5sICYmICFkb2xieV9tZXRhX3dpdGhfZWwpCisJCQkJcmVxLT5kdl9lbmhhbmNlX2V4aXN0ID0gZmFsc2U7CisJCQllbHNlCisJCQkJcmVxLT5kdl9lbmhhbmNlX2V4aXN0ID0KKwkJCQkJaGV2Yy0+bV9QSUNbaW5kZXhdLT5kdl9lbmhhbmNlX2V4aXN0OworCQkJaWYgKHZkZWNfZnJhbWVfYmFzZWQodmRlYykgJiYgKGhldmMtPmR2X2R1YWxsYXllciA9PSB0cnVlKSkKKwkJCQlyZXEtPmR2X2VuaGFuY2VfZXhpc3QgPSAxOworCQkJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX0RWLAorCQkJInF1ZXJ5IGR2X2VuaGFuY2VfZXhpc3QgZm9yIChwaWMgMHglcCwgdmYgMHglcCwgcG9jICVkIGluZGV4ICVkKSBmbGFnID0+ICVkLCBhdXggc2l6ZCAweCV4XG4iLAorCQkJaGV2Yy0+bV9QSUNbaW5kZXhdLAorCQkJcmVxLT52ZiwKKwkJCWhldmMtPm1fUElDW2luZGV4XS0+UE9DLCBpbmRleCwKKwkJCXJlcS0+ZHZfZW5oYW5jZV9leGlzdCwgcmVxLT5hdXhfc2l6ZSk7CisjZWxzZQorCQkJcmVxLT5kdl9lbmhhbmNlX2V4aXN0ID0gMDsKKyNlbmRpZgorCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKKworCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19QSUNfU1RSVUNUKQorCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJIiVzKHR5cGUgMHgleCB2ZiBpbmRleCAweCV4KT0+c2l6ZSAweCV4XG4iLAorCQkJX19mdW5jX18sIHR5cGUsIGluZGV4LCByZXEtPmF1eF9zaXplKTsKKwl9CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwllbHNlIGlmICh0eXBlICYgVkZSQU1FX0VWRU5UX1JFQ0VJVkVSX0RPTEJZX0JZUEFTU19FTCkgeworCQlpZiAoKGZvcmNlX2J5cGFzc19kdmVubCAmIDB4ODAwMDAwMDApID09IDApIHsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSIlczogVkZSQU1FX0VWRU5UX1JFQ0VJVkVSX0RPTEJZX0JZUEFTU19FTFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJCWhldmMtPmJ5cGFzc19kdmVubF9lbmFibGUgPSAxOworCQl9CisJfQorI2VuZGlmCisJZWxzZSBpZiAodHlwZSAmIFZGUkFNRV9FVkVOVF9SRUNFSVZFUl9SRVFfU1RBVEUpIHsKKwkJc3RydWN0IHByb3ZpZGVyX3N0YXRlX3JlcV9zICpyZXEgPQorCQkJKHN0cnVjdCBwcm92aWRlcl9zdGF0ZV9yZXFfcyAqKWRhdGE7CisJCWlmIChyZXEtPnJlcV90eXBlID09IFJFUV9TVEFURV9TRUNVUkUpCisJCQlyZXEtPnJlcV9yZXN1bHRbMF0gPSB2ZGVjX3NlY3VyZSh2ZGVjKTsKKwkJZWxzZQorCQkJcmVxLT5yZXFfcmVzdWx0WzBdID0gMHhmZmZmZmZmZjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2V0X3BhaXJfZmIoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Yywgc3RydWN0IHZmcmFtZV9zICp2ZikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSArKykgeworCQlpZiAoaGV2Yy0+cGFpcl9mYltpXSA9PSBOVUxMKSB7CisJCQloZXZjLT5wYWlyX2ZiW2ldID0gKHN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICopdmYtPnY0bF9tZW1faGFuZGxlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaSA+PSAyKSB7CisJCWhldmMtPnBhaXJfZmJbMF0gPSAoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKil2Zi0+djRsX21lbV9oYW5kbGU7CisJCWhldmMtPnBhaXJfZmJbMV0gPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgY2xlYXJfcGFpcl9mYihzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCAyOyBpICsrKQorCQloZXZjLT5wYWlyX2ZiW2ldID0gTlVMTDsKK30KKworc3RhdGljIGJvb2wgdjRsX291dHB1dF9kd193aXRoX2NvbXByZXNzKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsIGludCBkdykKK3sKKwlpZiAoKCFoZXZjLT5pc191c2VkX3Y0bCkgfHwgKGR3ID09IDB4MTApIHx8CisJCUlTXzhLX1NJWkUoaGV2Yy0+ZnJhbWVfd2lkdGgsIGhldmMtPmZyYW1lX2hlaWdodCkgfHwKKwkJaGV2Yy0+aW50ZXJsYWNlX2ZsYWcpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCisjaWZkZWYgSEVWQ19QSUNfU1RSVUNUX1NVUFBPUlQKK3N0YXRpYyBpbnQgcHJvY2Vzc19wZW5kaW5nX3ZmcmFtZShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCXN0cnVjdCBQSUNfcyAqcGFpcl9waWMsIHVuc2lnbmVkIGNoYXIgcGFpcl9mcmFtZV90b3BfZmxhZykKK3sKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmOworCisJaWYgKCFwYWlyX3BpYykKKwkJcmV0dXJuIC0xOworCisJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX1BJQ19TVFJVQ1QsCisJCSIlczogcGFpcl9waWMgaW5kZXggMHgleCAlc1xuIiwgX19mdW5jX18sIHBhaXJfcGljLT5pbmRleCwKKwkJcGFpcl9mcmFtZV90b3BfZmxhZyA/ICJ0b3AiIDogImJvdCIpOworCisJaWYgKGtmaWZvX2xlbigmaGV2Yy0+cGVuZGluZ19xKSA+IDEpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJaW50IGluZGV4MTsKKwkJaW50IGluZGV4MjsKKwkJLyogZG8gbm90IHBlbmRpbmcgbW9yZSB0aGFuIDEgZnJhbWUgKi8KKwkJaWYgKGtmaWZvX2dldCgmaGV2Yy0+cGVuZGluZ19xLCAmdmYpID09IDApIHsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJmYXRhbCBlcnJvciwgbm8gYXZhaWxhYmxlIGJ1ZmZlciBzbG90LiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX1BJQ19TVFJVQ1QpCisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiJXMgd2FybmluZygxKSwgdmY9PmRpc3BsYXlfcTogKGluZGV4IDB4JXgpLCB2ZiAweCVweFxuIiwKKwkJCQlfX2Z1bmNfXywgdmYtPmluZGV4LCB2Zik7CisKKwkJaWYgKHY0bF9vdXRwdXRfZHdfd2l0aF9jb21wcmVzcyhoZXZjLCBwYWlyX3BpYy0+ZG91YmxlX3dyaXRlX21vZGUpKSB7CisJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX0NPTVBSRVNTOworCQkJaWYgKGhldmMtPm1tdV9lbmFibGUpCisJCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9TQ0FUVEVSOworCQl9CisKKwkJLyogcmVjeWNsZSB2ZnJhbWUgKi8KKwkJYXRvbWljX2FkZCgxLCAmaGV2Yy0+dmZfcHJlX2NvdW50KTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKKwkJa2ZpZm9fcHV0KCZoZXZjLT5uZXdmcmFtZV9xLCAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQlpbmRleDEgPSB2Zi0+aW5kZXggJiAweGZmOworCQlpbmRleDIgPSAodmYtPmluZGV4ID4+IDgpICYgMHhmZjsKKwkJaWYgKGluZGV4MSA+PSBNQVhfUkVGX1BJQ19OVU0gJiYKKwkJCWluZGV4MiA+PSBNQVhfUkVGX1BJQ19OVU0pIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmIChpbmRleDEgPCBNQVhfUkVGX1BJQ19OVU0pIHsKKwkJCWhldmMtPm1fUElDW2luZGV4MV0tPnZmX3JlZiA9IDA7CisJCQloZXZjLT5tX1BJQ1tpbmRleDFdLT5vdXRwdXRfcmVhZHkgPSAwOworCQl9CisJCWlmIChpbmRleDIgPCBNQVhfUkVGX1BJQ19OVU0pIHsKKwkJCWhldmMtPm1fUElDW2luZGV4Ml0tPnZmX3JlZiA9IDA7CisJCQloZXZjLT5tX1BJQ1tpbmRleDJdLT5vdXRwdXRfcmVhZHkgPSAwOworCQl9CisJCWlmIChoZXZjLT53YWl0X2J1ZiAhPSAwKQorCQkJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9NQk9YMF9JUlFfUkVHLAorCQkJCTB4MSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKKworCQlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5wdHNfbmFtZSwgdmYtPnRpbWVzdGFtcCk7CisJfQorCisJaWYgKGtmaWZvX3BlZWsoJmhldmMtPnBlbmRpbmdfcSwgJnZmKSkgeworCQlpZiAoa2ZpZm9fZ2V0KCZoZXZjLT5wZW5kaW5nX3EsICZ2ZikgPT0gMCkgeworCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkiZmF0YWwgZXJyb3IsIG5vIGF2YWlsYWJsZSBidWZmZXIgc2xvdC4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKHZmID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisKKwkJaWYgKHBhaXJfcGljID09IE5VTEwgfHwgcGFpcl9waWMtPnZmX3JlZiA8PSAwKSB7CisJCQkvKgorCQkJICppZiBwYWlyX3BpYyBpcyByZWN5Y2xlZCAocGFpcl9waWMtPnZmX3JlZiA8PSAwKSwKKwkJCSAqZG8gbm90IHVzZSBpdAorCQkJICovCisJCQloZXZjX3ByaW50KGhldmMsIEgyNjVfREVCVUdfUElDX1NUUlVDVCwKKwkJCQkiJXMgd2FybmluZygyKSwgdmY9PmRpc3BsYXlfcTogKGluZGV4IDB4JXgpXG4iLAorCQkJCV9fZnVuY19fLCB2Zi0+aW5kZXgpOworCisJCQlpZiAodjRsX291dHB1dF9kd193aXRoX2NvbXByZXNzKGhldmMsIHBhaXJfcGljLT5kb3VibGVfd3JpdGVfbW9kZSkpIHsKKwkJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX0NPTVBSRVNTOworCQkJCWlmIChoZXZjLT5tbXVfZW5hYmxlKQorCQkJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX1NDQVRURVI7CisJCQl9CisJCQlhdG9taWNfYWRkKDEsICZoZXZjLT52Zl9wcmVfY291bnQpOworCQkJdmRlY192ZnJhbWVfcmVhZHkoaHdfdG9fdmRlYyhoZXZjKSwgdmYpOworCQkJaGV2Yy0+c2VuZF9mcmFtZV9mbGFnID0gMTsKKwkJCWtmaWZvX3B1dCgmaGV2Yy0+ZGlzcGxheV9xLAorCQkJKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwkJCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLnB0c19uYW1lLCB2Zi0+dGltZXN0YW1wKTsKKwkJfSBlbHNlIGlmICgoIXBhaXJfZnJhbWVfdG9wX2ZsYWcpICYmICgoKHZmLT5pbmRleCA+PiA4KSAmIDB4ZmYpID09IDB4ZmYpKSB7CisJCQlpZiAodjRsX291dHB1dF9kd193aXRoX2NvbXByZXNzKGhldmMsIHBhaXJfcGljLT5kb3VibGVfd3JpdGVfbW9kZSkpIHsKKwkJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX0NPTVBSRVNTOworCQkJCWlmIChoZXZjLT5tbXVfZW5hYmxlKQorCQkJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX1NDQVRURVI7CisJCQl9CisKKwkJCXZmLT5pbmRleCAmPSAweGZmOworCQkJdmYtPmluZGV4IHw9IChwYWlyX3BpYy0+aW5kZXggPDwgOCk7CisJCQlwYWlyX3BpYy0+dmZfcmVmKys7CisJCQl2ZGVjX3ZmcmFtZV9yZWFkeShod190b192ZGVjKGhldmMpLCB2Zik7CisJCQloZXZjLT5zZW5kX2ZyYW1lX2ZsYWcgPSAxOworCQkJZ2V0X3BhaXJfZmIoaGV2YywgdmYpOworCQkJa2ZpZm9fcHV0KCZoZXZjLT5kaXNwbGF5X3EsCisJCQkoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQkJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UucHRzX25hbWUsIHZmLT50aW1lc3RhbXApOworCQkJYXRvbWljX2FkZCgxLCAmaGV2Yy0+dmZfcHJlX2NvdW50KTsKKwkJCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19QSUNfU1RSVUNULAorCQkJCSIlcyB2ZiA9PiBkaXNwbGF5X3E6IChpbmRleCAweCV4KSwgdyAlZCwgaCAlZCwgdHlwZSAweCV4XG4iLAorCQkJCV9fZnVuY19fLCB2Zi0+aW5kZXgsIHZmLT53aWR0aCwgdmYtPmhlaWdodCwgdmYtPnR5cGUpOworCQl9IGVsc2UgaWYgKHBhaXJfZnJhbWVfdG9wX2ZsYWcgJiYgKCh2Zi0+aW5kZXggJiAweGZmKSA9PSAweGZmKSkgeworCQkJaWYgKHY0bF9vdXRwdXRfZHdfd2l0aF9jb21wcmVzcyhoZXZjLCBwYWlyX3BpYy0+ZG91YmxlX3dyaXRlX21vZGUpKSB7CisJCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9DT01QUkVTUzsKKwkJCQlpZiAoaGV2Yy0+bW11X2VuYWJsZSkKKwkJCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9TQ0FUVEVSOworCQkJfQorCisJCQl2Zi0+aW5kZXggJj0gMHhmZjAwOworCQkJdmYtPmluZGV4IHw9IHBhaXJfcGljLT5pbmRleDsKKwkJCXBhaXJfcGljLT52Zl9yZWYrKzsKKwkJCXZkZWNfdmZyYW1lX3JlYWR5KGh3X3RvX3ZkZWMoaGV2YyksIHZmKTsKKwkJCWhldmMtPnNlbmRfZnJhbWVfZmxhZyA9IDE7CisJCQlnZXRfcGFpcl9mYihoZXZjLCB2Zik7CisJCQlrZmlmb19wdXQoJmhldmMtPmRpc3BsYXlfcSwKKwkJCShjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCQlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5wdHNfbmFtZSwgdmYtPnRpbWVzdGFtcCk7CisJCQlhdG9taWNfYWRkKDEsICZoZXZjLT52Zl9wcmVfY291bnQpOworCQkJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX1BJQ19TVFJVQ1QsCisJCQkJIiVzIHZmID0+IGRpc3BsYXlfcTogKGluZGV4IDB4JXgpLCB3ICVkLCBoICVkLCB0eXBlIDB4JXhcbiIsCisJCQkJX19mdW5jX18sIHZmLT5pbmRleCwgdmYtPndpZHRoLCB2Zi0+aGVpZ2h0LCB2Zi0+dHlwZSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKK3N0YXRpYyB2b2lkIHVwZGF0ZV92Zl9tZW1oYW5kbGUoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmLCBzdHJ1Y3QgUElDX3MgKnBpYykKK3sKKwl2Zi0+bWVtX2hhbmRsZSA9IE5VTEw7CisJdmYtPm1lbV9oZWFkX2hhbmRsZSA9IE5VTEw7CisKKwkvKiBrZWVwZXIgbm90IG5lZWRlZCBmb3IgdjRsIHNvbHV0aW9uICovCisJaWYgKGhldmMtPmlzX3VzZWRfdjRsKQorCQlyZXR1cm47CisKKwlpZiAodmYtPnR5cGUgJiBWSURUWVBFX1NDQVRURVIpIHsKKwkJdmYtPm1lbV9oYW5kbGUgPQorCQkJZGVjb2Rlcl9tbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCWhldmMtPm1tdV9ib3gsIHBpYy0+aW5kZXgpOworCQl2Zi0+bWVtX2hlYWRfaGFuZGxlID0KKwkJCWRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJaGV2Yy0+Ym1tdV9ib3gsIFZGX0JVRkZFUl9JRFgocGljLT5CVUZfaW5kZXgpKTsKKwl9IGVsc2UgeworCQl2Zi0+bWVtX2hhbmRsZSA9CisJCQlkZWNvZGVyX2JtbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCWhldmMtPmJtbXVfYm94LCBWRl9CVUZGRVJfSURYKHBpYy0+QlVGX2luZGV4KSk7CisJCXZmLT5tZW1faGVhZF9oYW5kbGUgPSBOVUxMOworCQkvKnZmLT5tZW1faGVhZF9oYW5kbGUgPQorCQkJZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCQloZXZjLT5ibW11X2JveCwgVkZfQlVGRkVSX0lEWChCVUZfaW5kZXgpKTsqLworCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfZnJhbWVfaW5mbyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCXN0cnVjdCBQSUNfcyAqcGljLCB1bnNpZ25lZCBpbnQgZnJhbWVzaXplLCB1bnNpZ25lZCBpbnQgcHRzKQoreworCXN0cnVjdCB2ZnJhbWVfcW9zX3MgKnZmcmFtZV9xb3MgPSAmaGV2Yy0+dmZyYW1lX3FvczsKKwlpZiAoaGV2Yy0+bV9uYWxVbml0VHlwZSA9PSBOQUxfVU5JVF9DT0RFRF9TTElDRV9JRFIpCisJCXZmcmFtZV9xb3MtPnR5cGUgPSA0OworCWVsc2UgaWYgKHBpYy0+c2xpY2VfdHlwZSA9PSBJX1NMSUNFKQorCQl2ZnJhbWVfcW9zLT50eXBlID0gMTsKKwllbHNlIGlmIChwaWMtPnNsaWNlX3R5cGUgPT0gUF9TTElDRSkKKwkJdmZyYW1lX3Fvcy0+dHlwZSA9IDI7CisJZWxzZSBpZiAocGljLT5zbGljZV90eXBlID09IEJfU0xJQ0UpCisJCXZmcmFtZV9xb3MtPnR5cGUgPSAzOworLyoKKyNkZWZpbmUgU0hPV19RT1NfSU5GTworKi8KKwlpZiAoaW5wdXRfZnJhbWVfYmFzZWQoaHdfdG9fdmRlYyhoZXZjKSkpCisJCXZmcmFtZV9xb3MtPnNpemUgPSBwaWMtPmZyYW1lX3NpemU7CisJZWxzZQorCQl2ZnJhbWVfcW9zLT5zaXplID0gZnJhbWVzaXplOworCXZmcmFtZV9xb3MtPnB0cyA9IHB0czsKKyNpZmRlZiBTSE9XX1FPU19JTkZPCisJaGV2Y19wcmludChoZXZjLCAwLCAic2xpY2U6JWQsIHBvYzolZFxuIiwgcGljLT5zbGljZV90eXBlLCBwaWMtPlBPQyk7CisjZW5kaWYKKworCisJdmZyYW1lX3Fvcy0+bWF4X212ID0gcGljLT5tYXhfbXY7CisJdmZyYW1lX3Fvcy0+YXZnX212ID0gcGljLT5hdmdfbXY7CisJdmZyYW1lX3Fvcy0+bWluX212ID0gcGljLT5taW5fbXY7CisjaWZkZWYgU0hPV19RT1NfSU5GTworCWhldmNfcHJpbnQoaGV2YywgMCwgIm12OiBtYXg6JWQsICBhdmc6JWQsIG1pbjolZFxuIiwKKwkJCXZmcmFtZV9xb3MtPm1heF9tdiwKKwkJCXZmcmFtZV9xb3MtPmF2Z19tdiwKKwkJCXZmcmFtZV9xb3MtPm1pbl9tdik7CisjZW5kaWYKKworCXZmcmFtZV9xb3MtPm1heF9xcCA9IHBpYy0+bWF4X3FwOworCXZmcmFtZV9xb3MtPmF2Z19xcCA9IHBpYy0+YXZnX3FwOworCXZmcmFtZV9xb3MtPm1pbl9xcCA9IHBpYy0+bWluX3FwOworI2lmZGVmIFNIT1dfUU9TX0lORk8KKwloZXZjX3ByaW50KGhldmMsIDAsICJxcDogbWF4OiVkLCAgYXZnOiVkLCBtaW46JWRcbiIsCisJCQl2ZnJhbWVfcW9zLT5tYXhfcXAsCisJCQl2ZnJhbWVfcW9zLT5hdmdfcXAsCisJCQl2ZnJhbWVfcW9zLT5taW5fcXApOworI2VuZGlmCisKKwl2ZnJhbWVfcW9zLT5tYXhfc2tpcCA9IHBpYy0+bWF4X3NraXA7CisJdmZyYW1lX3Fvcy0+YXZnX3NraXAgPSBwaWMtPmF2Z19za2lwOworCXZmcmFtZV9xb3MtPm1pbl9za2lwID0gcGljLT5taW5fc2tpcDsKKyNpZmRlZiBTSE9XX1FPU19JTkZPCisJaGV2Y19wcmludChoZXZjLCAwLCAic2tpcDogbWF4OiVkLAlhdmc6JWQsIG1pbjolZFxuIiwKKwkJCXZmcmFtZV9xb3MtPm1heF9za2lwLAorCQkJdmZyYW1lX3Fvcy0+YXZnX3NraXAsCisJCQl2ZnJhbWVfcW9zLT5taW5fc2tpcCk7CisjZW5kaWYKKworCXZmcmFtZV9xb3MtPm51bSsrOworCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoZXZjX3VwZGF0ZV9ndnMoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwlpZiAoaGV2Yy0+Z3ZzLT5mcmFtZV9oZWlnaHQgIT0gaGV2Yy0+ZnJhbWVfaGVpZ2h0KSB7CisJCWhldmMtPmd2cy0+ZnJhbWVfd2lkdGggPSBoZXZjLT5mcmFtZV93aWR0aDsKKwkJaGV2Yy0+Z3ZzLT5mcmFtZV9oZWlnaHQgPSBoZXZjLT5mcmFtZV9oZWlnaHQ7CisJfQorCWlmIChoZXZjLT5ndnMtPmZyYW1lX2R1ciAhPSBoZXZjLT5mcmFtZV9kdXIpIHsKKwkJaGV2Yy0+Z3ZzLT5mcmFtZV9kdXIgPSBoZXZjLT5mcmFtZV9kdXI7CisJCWlmIChoZXZjLT5mcmFtZV9kdXIgIT0gMCkKKwkJCWhldmMtPmd2cy0+ZnJhbWVfcmF0ZSA9ICgoOTYwMDAgKiAxMCAvIGhldmMtPmZyYW1lX2R1cikgJSAxMCkgPCA1ID8KKwkJCQkJOTYwMDAgLyBoZXZjLT5mcmFtZV9kdXIgOiAoOTYwMDAgLyBoZXZjLT5mcmFtZV9kdXIgKzEpOworCQllbHNlCisJCQloZXZjLT5ndnMtPmZyYW1lX3JhdGUgPSAtMTsKKwl9CisJaGV2Yy0+Z3ZzLT5lcnJvcl9jb3VudCA9IGhldmMtPmd2cy0+ZXJyb3JfZnJhbWVfY291bnQ7CisJaGV2Yy0+Z3ZzLT5zdGF0dXMgPSBoZXZjLT5zdGF0IHwgaGV2Yy0+ZmF0YWxfZXJyb3I7CisJaWYgKGhldmMtPmd2cy0+cmF0aW9fY29udHJvbCAhPSBoZXZjLT5yYXRpb19jb250cm9sKQorCQloZXZjLT5ndnMtPnJhdGlvX2NvbnRyb2wgPSBoZXZjLT5yYXRpb19jb250cm9sOworfQorCitzdGF0aWMgdm9pZCBwdXRfdmZfdG9fZGlzcGxheV9xKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsIHN0cnVjdCB2ZnJhbWVfcyAqdmYpCit7CisJYXRvbWljX2FkZCgxLCAmaGV2Yy0+dmZfcHJlX2NvdW50KTsKKwlkZWNvZGVyX2RvX2ZyYW1lX2NoZWNrKGh3X3RvX3ZkZWMoaGV2YyksIHZmKTsKKwl2ZGVjX3ZmcmFtZV9yZWFkeShod190b192ZGVjKGhldmMpLCB2Zik7CisJaGV2Yy0+c2VuZF9mcmFtZV9mbGFnID0gMTsKKwlrZmlmb19wdXQoJmhldmMtPmRpc3BsYXlfcSwgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5wdHNfbmFtZSwgdmYtPnRpbWVzdGFtcCk7Cit9CisKK3N0YXRpYyBpbnQgcG9zdF9wcmVwYXJlX3Byb2Nlc3Moc3RydWN0IHZkZWNfcyAqdmRlYywgc3RydWN0IFBJQ19zICpmcmFtZSkKK3sKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjID0gKHN0cnVjdCBoZXZjX3N0YXRlX3MgKil2ZGVjLT5wcml2YXRlOworCisJaWYgKGZvcmNlX2Rpc3BfcGljX2luZGV4ICYgMHgxMDApIHsKKwkJLypyZWN5Y2xlIGRpcmVjdGx5Ki8KKwkJZnJhbWUtPm91dHB1dF9yZWFkeSA9IDA7CisJCWZyYW1lLT5zaG93X2ZyYW1lID0gZmFsc2U7CisJCWhldmNfcHJpbnQoaGV2YywgMCwgImRpc2NhcmQgc2hvdyBmcmFtZS5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlmcmFtZS0+c2hvd19mcmFtZSA9IHRydWU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwb3N0X3ZpZGVvX2ZyYW1lKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHN0cnVjdCBQSUNfcyAqcGljKQoreworCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPSAoc3RydWN0IGhldmNfc3RhdGVfcyAqKXZkZWMtPnByaXZhdGU7CisJc3RydWN0IHZmcmFtZV9zICp2ZiA9IE5VTEw7CisJaW50IHN0cmVhbV9vZmZzZXQgPSBwaWMtPnN0cmVhbV9vZmZzZXQ7CisJdW5zaWduZWQgc2hvcnQgc2xpY2VfdHlwZSA9IHBpYy0+c2xpY2VfdHlwZTsKKwl1bG9uZyBudl9vcmRlciA9IFZJRFRZUEVfVklVX05WMjE7CisJdTMyIGZyYW1lX3NpemUgPSAwOworCXN0cnVjdCB2ZGVjX2luZm8gdG1wNHg7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICogdjRsMl9jdHggPSBoZXZjLT52NGwyX2N0eDsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPSBOVUxMOworCWludCBpbmRleDsKKworCWhldmMtPnNlbmRfZnJhbWVfZmxhZyA9IDA7CisJLyogc3dhcCB1diAqLworCWlmIChoZXZjLT5pc191c2VkX3Y0bCkgeworCQlpZiAoKHY0bDJfY3R4LT5jYXBfcGl4X2ZtdCA9PSBWNEwyX1BJWF9GTVRfTlYxMikgfHwKKwkJCSh2NGwyX2N0eC0+Y2FwX3BpeF9mbXQgPT0gVjRMMl9QSVhfRk1UX05WMTJNKSkKKwkJCW52X29yZGVyID0gVklEVFlQRV9WSVVfTlYxMjsKKwl9CisKKwlpZiAoa2ZpZm9fZ2V0KCZoZXZjLT5uZXdmcmFtZV9xLCAmdmYpID09IDApIHsKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJImZhdGFsIGVycm9yLCBubyBhdmFpbGFibGUgYnVmZmVyIHNsb3QuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAodmYpIHsKKwkJLypoZXZjX3ByaW50KGhldmMsIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkiJXM6IHBpYyBpbmRleCAweCV4XG4iLAorCQkJX19mdW5jX18sIHBpYy0+aW5kZXgpOyovCisKKwkJaWYgKGhldmMtPmlzX3VzZWRfdjRsKSB7CisJCQl2Zi0+djRsX21lbV9oYW5kbGUgPSBwaWMtPmNtYV9hbGxvY19hZGRyOworCQkJZmIgPSAoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKil2Zi0+djRsX21lbV9oYW5kbGU7CisJCQlpZiAoaGV2Yy0+bW11X2VuYWJsZSkgeworCQkJCXZmLT5tbV9ib3guYm1tdV9ib3gJPSBoZXZjLT5ibW11X2JveDsKKwkJCQl2Zi0+bW1fYm94LmJtbXVfaWR4CT0gVkZfQlVGRkVSX0lEWChoZXZjLT5idWZmZXJfd3JhcFtwaWMtPkJVRl9pbmRleF0pOworCQkJCXZmLT5tbV9ib3gubW11X2JveAk9IGhldmMtPm1tdV9ib3g7CisJCQkJdmYtPm1tX2JveC5tbXVfaWR4CT0gaGV2Yy0+YnVmZmVyX3dyYXBbcGljLT5CVUZfaW5kZXhdOworCQkJfQorCQl9CisKKwkJaWYgKGhldmMtPmVuYWJsZV9mZW5jZSkgeworCQkJLyogZmlsbCBmZW5jZSBpbmZvcm1hdGlvbi4gKi8KKwkJCWlmIChoZXZjLT5mZW5jZV91c2FnZSA9PSBGRU5DRV9VU0VfRk9SX0RSSVZFUikKKwkJCQl2Zi0+ZmVuY2UJPSBwaWMtPmZlbmNlOworCQl9CisKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCWlmICh2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpKSB7CisJCQl2Zi0+cHRzID0gcGljLT5wdHM7CisJCQl2Zi0+cHRzX3VzNjQgPSBwaWMtPnB0czY0OworCQkJdmYtPnRpbWVzdGFtcCA9IHBpYy0+dGltZXN0YW1wOworCQl9CisJCS8qIGlmIChwdHNfbG9va3VwX29mZnNldChQVFNfVFlQRV9WSURFTywKKwkJICAgc3RyZWFtX29mZnNldCwgJnZmLT5wdHMsIDApICE9IDApIHsgKi8KKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCQllbHNlIGlmICh2ZGVjLT5tYXN0ZXIgPT0gTlVMTCkgeworI2Vsc2UKKwkJZWxzZSB7CisjZW5kaWYKKyNlbmRpZgorCQkJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX09VVF9QVFMsCisJCQkJImNhbGwgcHRzX2xvb2t1cF9vZmZzZXRfdXM2NCgweCV4KVxuIiwKKwkJCQlzdHJlYW1fb2Zmc2V0KTsKKwkJCWlmICgodmRlYy0+dmJ1Zi5ub19wYXJzZXIgPT0gMCkgfHwgKHZkZWMtPnZidWYudXNlX3B0c3NlcnYpKSB7CisJCQkJaWYgKHB0c19sb29rdXBfb2Zmc2V0X3VzNjQKKwkJCQkJKFBUU19UWVBFX1ZJREVPLCBzdHJlYW1fb2Zmc2V0LCAmdmYtPnB0cywKKwkJCQkJJmZyYW1lX3NpemUsIDAsICZ2Zi0+cHRzX3VzNjQpICE9IDApIHsKKyNpZmRlZiBERUJVR19QVFMKKwkJCQkJaGV2Yy0+cHRzX21pc3NlZCsrOworI2VuZGlmCisJCQkJCXZmLT5wdHMgPSAwOworCQkJCQl2Zi0+cHRzX3VzNjQgPSAwOworCQkJCX0gZWxzZSB7CisjaWZkZWYgREVCVUdfUFRTCisJCQkJCWhldmMtPnB0c19oaXQrKzsKKyNlbmRpZgorCQkJCX0KKwkJCX0KKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCQl9IGVsc2UgeworCQkJdmYtPnB0cyA9IDA7CisJCQl2Zi0+cHRzX3VzNjQgPSAwOworCQl9CisjZWxzZQorCQl9CisjZW5kaWYKKyNlbmRpZgorCisJCWlmIChwdHNfdW5zdGFibGUgJiYgKGhldmMtPmZyYW1lX2R1ciA+IDApKQorCQkJaGV2Yy0+cHRzX21vZGUgPSBQVFNfTk9ORV9SRUZfVVNFX0RVUkFUSU9OOworCisJCWZpbGxfZnJhbWVfaW5mbyhoZXZjLCBwaWMsIGZyYW1lX3NpemUsIHZmLT5wdHMpOworCisJCWlmICh2Zi0+cHRzICE9IDApCisJCQloZXZjLT5sYXN0X2xvb2t1cF9wdHMgPSB2Zi0+cHRzOworCisJCWlmICgoaGV2Yy0+cHRzX21vZGUgPT0gUFRTX05PTkVfUkVGX1VTRV9EVVJBVElPTikKKwkJCSYmIChzbGljZV90eXBlICE9IDIpKQorCQkJdmYtPnB0cyA9IGhldmMtPmxhc3RfcHRzICsgRFVSMlBUUyhoZXZjLT5mcmFtZV9kdXIpOworCQloZXZjLT5sYXN0X3B0cyA9IHZmLT5wdHM7CisKKwkJaWYgKHZmLT5wdHNfdXM2NCAhPSAwKQorCQkJaGV2Yy0+bGFzdF9sb29rdXBfcHRzX3VzNjQgPSB2Zi0+cHRzX3VzNjQ7CisKKwkJaWYgKChoZXZjLT5wdHNfbW9kZSA9PSBQVFNfTk9ORV9SRUZfVVNFX0RVUkFUSU9OKQorCQkJJiYgKHNsaWNlX3R5cGUgIT0gMikpIHsKKwkJCXZmLT5wdHNfdXM2NCA9CisJCQkJaGV2Yy0+bGFzdF9wdHNfdXM2NCArCisJCQkJKERVUjJQVFMoaGV2Yy0+ZnJhbWVfZHVyKSAqIDEwMCAvIDkpOworCQl9CisJCWhldmMtPmxhc3RfcHRzX3VzNjQgPSB2Zi0+cHRzX3VzNjQ7CisJCWlmICgoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19PVVRfUFRTKSAhPSAwKSB7CisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiSDI2NSBkZWMgb3V0IHB0czogdmYtPnB0cz0lZCwgdmYtPnB0c191czY0ID0gJWxsZCwgdHM6ICVsbHVcbiIsCisJCQkgdmYtPnB0cywgdmYtPnB0c191czY0LCB2Zi0+dGltZXN0YW1wKTsKKwkJfQorCisJCS8qCisJCSAqdmYtPmluZGV4OgorCQkgKigxKSB2Zi0+dHlwZSBpcyBWSURUWVBFX0lOVEVSTEFDRQorCQkgKglhbmQgdmYtPmNhbnZhczBBZGRyICE9ICB2Zi0+Y2FudmFzMUFkZHIsCisJCSAqCXZmLT5pbmRleFs3OjBdIGlzIHRoZSBpbmRleCBvZiB0b3AgcGljCisJCSAqCXZmLT5pbmRleFsxNTo4XSBpcyB0aGUgaW5kZXggb2YgYm90IHBpYworCQkgKigyKSBvdGhlciBjYXNlcywKKwkJICoJb25seSB2Zi0+aW5kZXhbNzowXSBpcyB1c2VkCisJCSAqCXZmLT5pbmRleFsxNTo4XSA9PSAweGZmCisJCSAqLworCQl2Zi0+aW5kZXggPSAweGZmMDAgfCBwaWMtPmluZGV4OworI2lmIDEKKy8qU1VQUE9SVF8xMEJJVCovCisJCWlmIChwaWMtPmRvdWJsZV93cml0ZV9tb2RlICYgMHgxMCkgeworCQkJLyogZG91YmxlIHdyaXRlIG9ubHkgKi8KKwkJCXZmLT5jb21wQm9keUFkZHIgPSAwOworCQkJdmYtPmNvbXBIZWFkQWRkciA9IDA7CisJCX0gZWxzZSB7CisKKwkJaWYgKGhldmMtPm1tdV9lbmFibGUpIHsKKwkJCXZmLT5jb21wQm9keUFkZHIgPSAwOworCQkJdmYtPmNvbXBIZWFkQWRkciA9IHBpYy0+aGVhZGVyX2FkcjsKKwkJfSBlbHNlIHsKKwkJCXZmLT5jb21wQm9keUFkZHIgPSBwaWMtPm1jX3lfYWRyOyAvKmJvZHkgYWRyKi8KKwkJCXZmLT5jb21wSGVhZEFkZHIgPSBwaWMtPm1jX3lfYWRyICsKKwkJCQkJCXBpYy0+bG9zbGVzc19jb21wX2JvZHlfc2l6ZTsKKwkJCXZmLT5tZW1faGVhZF9oYW5kbGUgPSBOVUxMOworCQl9CisKKwkJCQkJLypoZWFkIGFkciovCisJCQl2Zi0+Y2FudmFzMEFkZHIgPSB2Zi0+Y2FudmFzMUFkZHIgPSAwOworCQl9CisJCWlmIChwaWMtPmRvdWJsZV93cml0ZV9tb2RlKSB7CisJCQl2Zi0+dHlwZSA9IFZJRFRZUEVfUFJPR1JFU1NJVkUgfCBWSURUWVBFX1ZJVV9GSUVMRDsKKwkJCXZmLT50eXBlIHw9IG52X29yZGVyOworCisJCQlpZiAodjRsX291dHB1dF9kd193aXRoX2NvbXByZXNzKGhldmMsIHBpYy0+ZG91YmxlX3dyaXRlX21vZGUpKSB7CisJCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9DT01QUkVTUzsKKwkJCQlpZiAoaGV2Yy0+bW11X2VuYWJsZSkKKwkJCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9TQ0FUVEVSOworCQkJfQorCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQkJaWYgKGhldmMtPm1faW5zX2ZsYWcgJiYKKwkJCQkoZ2V0X2RiZ19mbGFnKGhldmMpCisJCQkJJiBIMjY1X0NGR19DQU5WQVNfSU5fREVDT0RFKSA9PSAwKSB7CisJCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IC0xOworCQkJCQl2Zi0+cGxhbmVfbnVtID0gMjsKKwkJCQkJdmYtPmNhbnZhczBfY29uZmlnWzBdID0KKwkJCQkJCXBpYy0+Y2FudmFzX2NvbmZpZ1swXTsKKwkJCQkJdmYtPmNhbnZhczBfY29uZmlnWzFdID0KKwkJCQkJCXBpYy0+Y2FudmFzX2NvbmZpZ1sxXTsKKworCQkJCQl2Zi0+Y2FudmFzMV9jb25maWdbMF0gPQorCQkJCQkJcGljLT5jYW52YXNfY29uZmlnWzBdOworCQkJCQl2Zi0+Y2FudmFzMV9jb25maWdbMV0gPQorCQkJCQkJcGljLT5jYW52YXNfY29uZmlnWzFdOworCisJCQl9IGVsc2UKKyNlbmRpZgorCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkcgorCQkJCT0gc3BlYzJjYW52YXMocGljKTsKKwkJfSBlbHNlIHsKKwkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IDA7CisJCQl2Zi0+dHlwZSA9IFZJRFRZUEVfQ09NUFJFU1MgfCBWSURUWVBFX1ZJVV9GSUVMRDsKKwkJCWlmIChoZXZjLT5tbXVfZW5hYmxlKQorCQkJCXZmLT50eXBlIHw9IFZJRFRZUEVfU0NBVFRFUjsKKwkJfQorCQl2Zi0+Y29tcFdpZHRoID0gcGljLT53aWR0aDsKKwkJdmYtPmNvbXBIZWlnaHQgPSBwaWMtPmhlaWdodDsKKwkJdXBkYXRlX3ZmX21lbWhhbmRsZShoZXZjLCB2ZiwgcGljKTsKKwkJc3dpdGNoIChwaWMtPmJpdF9kZXB0aF9sdW1hKSB7CisJCWNhc2UgOToKKwkJCXZmLT5iaXRkZXB0aCA9IEJJVERFUFRIX1k5OworCQkJYnJlYWs7CisJCWNhc2UgMTA6CisJCQl2Zi0+Yml0ZGVwdGggPSBCSVRERVBUSF9ZMTA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXZmLT5iaXRkZXB0aCA9IEJJVERFUFRIX1k4OworCQkJYnJlYWs7CisJCX0KKwkJc3dpdGNoIChwaWMtPmJpdF9kZXB0aF9jaHJvbWEpIHsKKwkJY2FzZSA5OgorCQkJdmYtPmJpdGRlcHRoIHw9IChCSVRERVBUSF9VOSB8IEJJVERFUFRIX1Y5KTsKKwkJCWJyZWFrOworCQljYXNlIDEwOgorCQkJdmYtPmJpdGRlcHRoIHw9IChCSVRERVBUSF9VMTAgfCBCSVRERVBUSF9WMTApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl2Zi0+Yml0ZGVwdGggfD0gKEJJVERFUFRIX1U4IHwgQklUREVQVEhfVjgpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCh2Zi0+dHlwZSAmIFZJRFRZUEVfQ09NUFJFU1MpID09IDApCisJCQl2Zi0+Yml0ZGVwdGggPQorCQkJCUJJVERFUFRIX1k4IHwgQklUREVQVEhfVTggfCBCSVRERVBUSF9WODsKKwkJaWYgKHBpYy0+bWVtX3NhdmluZ19tb2RlID09IDEpCisJCQl2Zi0+Yml0ZGVwdGggfD0gQklUREVQVEhfU0FWSU5HX01PREU7CisjZWxzZQorCQl2Zi0+dHlwZSA9IFZJRFRZUEVfUFJPR1JFU1NJVkUgfCBWSURUWVBFX1ZJVV9GSUVMRDsKKwkJdmYtPnR5cGUgfD0gbnZfb3JkZXI7CisJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IHNwZWMyY2FudmFzKHBpYyk7CisjZW5kaWYKKwkJc2V0X2ZyYW1lX2luZm8oaGV2YywgdmYsIHBpYyk7CisJCWlmIChoZXZjLT5kaXNjYXJkX2R2X2RhdGEpIHsKKwkJCXZmLT5kaXNjYXJkX2R2X2RhdGEgPSB0cnVlOworCQl9CisKKwkJdmYtPndpZHRoID0gcGljLT53aWR0aDsKKwkJdmYtPmhlaWdodCA9IHBpYy0+aGVpZ2h0OworCisJCWlmIChmb3JjZV93X2ggIT0gMCkgeworCQkJdmYtPndpZHRoID0gKGZvcmNlX3dfaCA+PiAxNikgJiAweGZmZmY7CisJCQl2Zi0+aGVpZ2h0ID0gZm9yY2Vfd19oICYgMHhmZmZmOworCQl9CisJCWlmIChmb3JjZV9mcHMgJiAweDEwMCkgeworCQkJdTMyIHJhdGUgPSBmb3JjZV9mcHMgJiAweGZmOworCisJCQlpZiAocmF0ZSkKKwkJCQl2Zi0+ZHVyYXRpb24gPSA5NjAwMC9yYXRlOworCQkJZWxzZQorCQkJCXZmLT5kdXJhdGlvbiA9IDA7CisJCX0KKwkJaWYgKGZvcmNlX2ZwcyAmIDB4MjAwKSB7CisJCQl2Zi0+cHRzID0gMDsKKwkJCXZmLT5wdHNfdXM2NCA9IDA7CisJCX0KKwkJaWYgKCF2ZGVjLT52YnVmLnVzZV9wdHNzZXJ2ICYmIHZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpKSB7CisJCQl2Zi0+cHRzX3VzNjQgPSBzdHJlYW1fb2Zmc2V0OworCQkJdmYtPnB0cyA9IDA7CisJCX0KKwkJLyoKKwkJICoJISEhIHRvIGRvIC4uLgorCQkgKgluZWVkIG1vdmUgYmVsb3cgY29kZSB0byBnZXRfbmV3X3BpYygpLAorCQkgKgloZXZjLT54eHggY2FuIG9ubHkgYmUgdXNlZCBieSBjdXJyZW50IGRlY29kZWQgcGljCisJCSAqLworCQlpZiAocGljLT5jb25mb3JtYW5jZV93aW5kb3dfZmxhZyAmJgorCQkJKGdldF9kYmdfZmxhZyhoZXZjKSAmCisJCQkJSDI2NV9ERUJVR19JR05PUkVfQ09ORk9STUFOQ0VfV0lORE9XKSA9PSAwKSB7CisJCQl1bnNpZ25lZCBpbnQgU3ViV2lkdGhDLCBTdWJIZWlnaHRDOworCisJCQlzd2l0Y2ggKHBpYy0+Y2hyb21hX2Zvcm1hdF9pZGMpIHsKKwkJCWNhc2UgMToKKwkJCQlTdWJXaWR0aEMgPSAyOworCQkJCVN1YkhlaWdodEMgPSAyOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCVN1YldpZHRoQyA9IDI7CisJCQkJU3ViSGVpZ2h0QyA9IDE7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCVN1YldpZHRoQyA9IDE7CisJCQkJU3ViSGVpZ2h0QyA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQkgdmYtPndpZHRoIC09IFN1YldpZHRoQyAqCisJCQkJKHBpYy0+Y29uZl93aW5fbGVmdF9vZmZzZXQgKworCQkJCXBpYy0+Y29uZl93aW5fcmlnaHRfb2Zmc2V0KTsKKwkJCSB2Zi0+aGVpZ2h0IC09IFN1YkhlaWdodEMgKgorCQkJCShwaWMtPmNvbmZfd2luX3RvcF9vZmZzZXQgKworCQkJCXBpYy0+Y29uZl93aW5fYm90dG9tX29mZnNldCk7CisKKwkJCSB2Zi0+Y29tcFdpZHRoIC09IFN1YldpZHRoQyAqCisJCQkJKHBpYy0+Y29uZl93aW5fbGVmdF9vZmZzZXQgKworCQkJCXBpYy0+Y29uZl93aW5fcmlnaHRfb2Zmc2V0KTsKKwkJCSB2Zi0+Y29tcEhlaWdodCAtPSBTdWJIZWlnaHRDICoKKwkJCQkocGljLT5jb25mX3dpbl90b3Bfb2Zmc2V0ICsKKwkJCQlwaWMtPmNvbmZfd2luX2JvdHRvbV9vZmZzZXQpOworCisJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1IpCisJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkiY29uZm9ybWFuY2Vfd2luZG93ICVkLCAlZCwgJWQsICVkLCAlZCA9PiBjcm9wcGVkIHdpZHRoICVkLCBoZWlnaHQgJWQgY29tX3cgJWQgY29tX2ggJWRcbiIsCisJCQkJCXBpYy0+Y2hyb21hX2Zvcm1hdF9pZGMsCisJCQkJCXBpYy0+Y29uZl93aW5fbGVmdF9vZmZzZXQsCisJCQkJCXBpYy0+Y29uZl93aW5fcmlnaHRfb2Zmc2V0LAorCQkJCQlwaWMtPmNvbmZfd2luX3RvcF9vZmZzZXQsCisJCQkJCXBpYy0+Y29uZl93aW5fYm90dG9tX29mZnNldCwKKwkJCQkJdmYtPndpZHRoLCB2Zi0+aGVpZ2h0LCB2Zi0+Y29tcFdpZHRoLCB2Zi0+Y29tcEhlaWdodCk7CisJCX0KKworCQl2Zi0+d2lkdGggPSB2Zi0+d2lkdGggLworCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhwaWMtPmRvdWJsZV93cml0ZV9tb2RlKTsKKwkJdmYtPmhlaWdodCA9IHZmLT5oZWlnaHQgLworCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhwaWMtPmRvdWJsZV93cml0ZV9tb2RlKTsKKworCQlpZiAoaGV2Yy0+aXNfdXNlZF92NGwgJiYgKHZkZWMtPnByb2dfb25seSB8fCAoIXY0bDJfY3R4LT52cHBfaXNfbmVlZCkpKQorCQkJcGljLT5waWNfc3RydWN0ID0gMDsKKworCQl2Zi0+aGVpZ2h0IDw8PSBoZXZjLT5pbnRlcmxhY2VfZmxhZzsKKwkJLyogdmYtPmNvbXBIZWlnaHQgPDw9IGhldmMtPmludGVybGFjZV9mbGFnOyAqLworCQl2Zi0+Y2FudmFzMF9jb25maWdbMF0uaGVpZ2h0IDw8PSBoZXZjLT5pbnRlcmxhY2VfZmxhZzsKKwkJdmYtPmNhbnZhczBfY29uZmlnWzFdLmhlaWdodCA8PD0gaGV2Yy0+aW50ZXJsYWNlX2ZsYWc7CisKKyNpZmRlZiBIRVZDX1BJQ19TVFJVQ1RfU1VQUE9SVAorCQlpZiAocGljLT5waWNfc3RydWN0ID09IDMgfHwgcGljLT5waWNfc3RydWN0ID09IDQpIHsKKwkJCXN0cnVjdCB2ZnJhbWVfcyAqdmYyOworCisJCQloZXZjX3ByaW50KGhldmMsIEgyNjVfREVCVUdfUElDX1NUUlVDVCwKKwkJCQkicGljX3N0cnVjdCA9ICVkIGluZGV4IDB4JXhcbiIsCisJCQkJcGljLT5waWNfc3RydWN0LCBwaWMtPmluZGV4KTsKKworCQkJaWYgKGtmaWZvX2dldCgmaGV2Yy0+bmV3ZnJhbWVfcSwgJnZmMikgPT0gMCkgeworCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJImZhdGFsIGVycm9yLCBubyBhdmFpbGFibGUgYnVmZmVyIHNsb3QuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCisJCQlwaWMtPnZmX3JlZiA9IDI7CisJCQl2Zi0+ZHVyYXRpb24gPSB2Zi0+ZHVyYXRpb24+PjE7CisJCQltZW1jcHkodmYyLCB2Ziwgc2l6ZW9mKHN0cnVjdCB2ZnJhbWVfcykpOworCisJCQlpZiAodjRsMl9jdHgtPnNlY29uZF9maWVsZF9wdHNfbW9kZSkgeworCQkJCXZmMi0+dGltZXN0YW1wID0gMDsKKwkJCX0KKwkJCWlmIChwaWMtPnBpY19zdHJ1Y3QgPT0gMykgeworCQkJCXZmLT50eXBlID0gVklEVFlQRV9JTlRFUkxBQ0VfVE9QCisJCQkJfCBudl9vcmRlcjsKKwkJCQl2ZjItPnR5cGUgPSBWSURUWVBFX0lOVEVSTEFDRV9CT1RUT00KKwkJCQl8IG52X29yZGVyOworCQkJfSBlbHNlIHsKKwkJCQl2Zi0+dHlwZSA9IFZJRFRZUEVfSU5URVJMQUNFX0JPVFRPTQorCQkJCXwgbnZfb3JkZXI7CisJCQkJdmYyLT50eXBlID0gVklEVFlQRV9JTlRFUkxBQ0VfVE9QCisJCQkJfCBudl9vcmRlcjsKKwkJCX0KKwkJCWlmIChwaWMtPnNob3dfZnJhbWUpIHsKKwkJCQlwdXRfdmZfdG9fZGlzcGxheV9xKGhldmMsIHZmKTsKKwkJCQlhdG9taWNfYWRkKDEsICZoZXZjLT52Zl9wcmVfY291bnQpOworCQkJCXZkZWNfdmZyYW1lX3JlYWR5KGh3X3RvX3ZkZWMoaGV2YyksIHZmMik7CisJCQkJa2ZpZm9fcHV0KCZoZXZjLT5kaXNwbGF5X3EsCisJCQkJKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmMik7CisJCQkJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UucHRzX25hbWUsIHZmMi0+dGltZXN0YW1wKTsKKwkJCX0gZWxzZSB7CisJCQkJdmgyNjVfdmZfcHV0KHZmLCB2ZGVjKTsKKwkJCQl2aDI2NV92Zl9wdXQodmYyLCB2ZGVjKTsKKwkJCQlhdG9taWNfYWRkKDIsICZoZXZjLT52Zl9nZXRfY291bnQpOworCQkJCWF0b21pY19hZGQoMiwgJmhldmMtPnZmX3ByZV9jb3VudCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0gZWxzZSBpZiAocGljLT5waWNfc3RydWN0ID09IDUKKwkJCXx8IHBpYy0+cGljX3N0cnVjdCA9PSA2KSB7CisJCQlzdHJ1Y3QgdmZyYW1lX3MgKnZmMiwgKnZmMzsKKworCQkJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX1BJQ19TVFJVQ1QsCisJCQkJInBpY19zdHJ1Y3QgPSAlZCBpbmRleCAweCV4XG4iLAorCQkJCXBpYy0+cGljX3N0cnVjdCwgcGljLT5pbmRleCk7CisKKwkJCWlmIChrZmlmb19nZXQoJmhldmMtPm5ld2ZyYW1lX3EsICZ2ZjIpID09IDApIHsKKwkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJImZhdGFsIGVycm9yLCBubyBhdmFpbGFibGUgYnVmZmVyIHNsb3QuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKGtmaWZvX2dldCgmaGV2Yy0+bmV3ZnJhbWVfcSwgJnZmMykgPT0gMCkgeworCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkiZmF0YWwgZXJyb3IsIG5vIGF2YWlsYWJsZSBidWZmZXIgc2xvdC4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlwaWMtPnZmX3JlZiA9IDM7CisJCQl2Zi0+ZHVyYXRpb24gPSB2Zi0+ZHVyYXRpb24vMzsKKwkJCW1lbWNweSh2ZjIsIHZmLCBzaXplb2Yoc3RydWN0IHZmcmFtZV9zKSk7CisJCQltZW1jcHkodmYzLCB2Ziwgc2l6ZW9mKHN0cnVjdCB2ZnJhbWVfcykpOworCisJCQlpZiAodjRsMl9jdHgtPnNlY29uZF9maWVsZF9wdHNfbW9kZSkgeworCQkJCXZmMi0+dGltZXN0YW1wID0gMDsKKwkJCQl2ZjMtPnRpbWVzdGFtcCA9IDA7CisJCQl9CisKKwkJCWlmIChwaWMtPnBpY19zdHJ1Y3QgPT0gNSkgeworCQkJCXZmLT50eXBlID0gVklEVFlQRV9JTlRFUkxBQ0VfVE9QCisJCQkJfCBudl9vcmRlcjsKKwkJCQl2ZjItPnR5cGUgPSBWSURUWVBFX0lOVEVSTEFDRV9CT1RUT00KKwkJCQl8IG52X29yZGVyOworCQkJCXZmMy0+dHlwZSA9IFZJRFRZUEVfSU5URVJMQUNFX1RPUAorCQkJCXwgbnZfb3JkZXI7CisJCQl9IGVsc2UgeworCQkJCXZmLT50eXBlID0gVklEVFlQRV9JTlRFUkxBQ0VfQk9UVE9NCisJCQkJfCBudl9vcmRlcjsKKwkJCQl2ZjItPnR5cGUgPSBWSURUWVBFX0lOVEVSTEFDRV9UT1AKKwkJCQl8IG52X29yZGVyOworCQkJCXZmMy0+dHlwZSA9IFZJRFRZUEVfSU5URVJMQUNFX0JPVFRPTQorCQkJCXwgbnZfb3JkZXI7CisJCQl9CisJCQlpZiAocGljLT5zaG93X2ZyYW1lKSB7CisJCQkJcHV0X3ZmX3RvX2Rpc3BsYXlfcShoZXZjLCB2Zik7CisJCQkJYXRvbWljX2FkZCgxLCAmaGV2Yy0+dmZfcHJlX2NvdW50KTsKKwkJCQl2ZGVjX3ZmcmFtZV9yZWFkeShod190b192ZGVjKGhldmMpLCB2ZjIpOworCQkJCWtmaWZvX3B1dCgmaGV2Yy0+ZGlzcGxheV9xLAorCQkJCShjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2ZjIpOworCQkJCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLnB0c19uYW1lLCB2ZjItPnRpbWVzdGFtcCk7CisJCQkJYXRvbWljX2FkZCgxLCAmaGV2Yy0+dmZfcHJlX2NvdW50KTsKKwkJCQl2ZGVjX3ZmcmFtZV9yZWFkeShod190b192ZGVjKGhldmMpLCB2ZjMpOworCQkJCWtmaWZvX3B1dCgmaGV2Yy0+ZGlzcGxheV9xLAorCQkJCShjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2ZjMpOworCQkJCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLnB0c19uYW1lLCB2ZjMtPnRpbWVzdGFtcCk7CisJCQl9IGVsc2UgeworCQkJCXZoMjY1X3ZmX3B1dCh2ZiwgdmRlYyk7CisJCQkJdmgyNjVfdmZfcHV0KHZmMiwgdmRlYyk7CisJCQkJdmgyNjVfdmZfcHV0KHZmMywgdmRlYyk7CisJCQkJYXRvbWljX2FkZCgzLCAmaGV2Yy0+dmZfZ2V0X2NvdW50KTsKKwkJCQlhdG9taWNfYWRkKDMsICZoZXZjLT52Zl9wcmVfY291bnQpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9IGVsc2UgaWYgKHBpYy0+cGljX3N0cnVjdCA9PSA5CisJCQl8fCBwaWMtPnBpY19zdHJ1Y3QgPT0gMTApIHsKKwkJCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19QSUNfU1RSVUNULAorCQkJCSJwaWNfc3RydWN0ID0gJWQgaW5kZXggMHgleFxuIiwKKwkJCQlwaWMtPnBpY19zdHJ1Y3QsIHBpYy0+aW5kZXgpOworCisJCQlwaWMtPnZmX3JlZiA9IDE7CisJCQkvKiBwcm9jZXNzIHByZXZpb3VzIHBlbmRpbmcgdmYqLworCQkJcHJvY2Vzc19wZW5kaW5nX3ZmcmFtZShoZXZjLAorCQkJcGljLCAocGljLT5waWNfc3RydWN0ID09IDkpKTsKKworCQkJaWYgKHBpYy0+c2hvd19mcmFtZSkgeworCQkJCWRlY29kZXJfZG9fZnJhbWVfY2hlY2sodmRlYywgdmYpOworCQkJCXZkZWNfdmZyYW1lX3JlYWR5KHZkZWMsIHZmKTsKKwkJCQkvKiBwcm9jZXNzIGN1cnJlbnQgdmYgKi8KKwkJCQlrZmlmb19wdXQoJmhldmMtPnBlbmRpbmdfcSwKKwkJCQkoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQkJCWlmIChwaWMtPnBpY19zdHJ1Y3QgPT0gOSkgeworCQkJCQl2Zi0+dHlwZSA9IFZJRFRZUEVfSU5URVJMQUNFX1RPUAorCQkJCQl8IG52X29yZGVyIHwgVklEVFlQRV9WSVVfRklFTEQ7CisJCQkJCXByb2Nlc3NfcGVuZGluZ192ZnJhbWUoaGV2YywKKwkJCQkJaGV2Yy0+cHJlX2JvdF9waWMsIDApOworCQkJCX0gZWxzZSB7CisJCQkJCXZmLT50eXBlID0gVklEVFlQRV9JTlRFUkxBQ0VfQk9UVE9NIHwKKwkJCQkJbnZfb3JkZXIgfCBWSURUWVBFX1ZJVV9GSUVMRDsKKwkJCQkJdmYtPmluZGV4ID0gKHBpYy0+aW5kZXggPDwgOCkgfCAweGZmOworCQkJCQlwcm9jZXNzX3BlbmRpbmdfdmZyYW1lKGhldmMsCisJCQkJCWhldmMtPnByZV90b3BfcGljLCAxKTsKKwkJCQl9CisKKwkJCQlpZiAoYXRvbWljX3JlYWQoJmhldmMtPnZmX3ByZV9jb3VudCkgPT0gMCkKKwkJCQkJYXRvbWljX2FkZCgxLCAmaGV2Yy0+dmZfcHJlX2NvdW50KTsKKworCQkJCS8qKi8KKwkJCQlpZiAocGljLT5waWNfc3RydWN0ID09IDkpCisJCQkJCWhldmMtPnByZV90b3BfcGljID0gcGljOworCQkJCWVsc2UKKwkJCQkJaGV2Yy0+cHJlX2JvdF9waWMgPSBwaWM7CisJCQl9IGVsc2UgeworCQkJCXZoMjY1X3ZmX3B1dCh2ZiwgdmRlYyk7CisJCQkJYXRvbWljX2FkZCgxLCAmaGV2Yy0+dmZfZ2V0X2NvdW50KTsKKwkJCQlhdG9taWNfYWRkKDEsICZoZXZjLT52Zl9wcmVfY291bnQpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9IGVsc2UgaWYgKHBpYy0+cGljX3N0cnVjdCA9PSAxMQorCQkgICAgfHwgcGljLT5waWNfc3RydWN0ID09IDEyKSB7CisKKwkJCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19QSUNfU1RSVUNULAorCQkJCSJwaWNfc3RydWN0ID0gJWQgaW5kZXggMHgleFxuIiwKKwkJCQlwaWMtPnBpY19zdHJ1Y3QsIHBpYy0+aW5kZXgpOworCQkJcGljLT52Zl9yZWYgPSAxOworCisJCQkvKiBwcm9jZXNzIHByZXZpb3VzIHBlbmRpbmcgdmYqLworCQkJcHJvY2Vzc19wZW5kaW5nX3ZmcmFtZShoZXZjLCBwaWMsCisJCQkocGljLT5waWNfc3RydWN0ID09IDExKSk7CisKKwkJCS8qIHB1dCBjdXJyZW50IGludG8gcGVuZGluZyBxICovCisJCQlpZiAocGljLT5waWNfc3RydWN0ID09IDExKQorCQkJCXZmLT50eXBlID0gVklEVFlQRV9JTlRFUkxBQ0VfVE9QIHwKKwkJCQludl9vcmRlciB8IFZJRFRZUEVfVklVX0ZJRUxEOworCQkJZWxzZSB7CisJCQkJdmYtPnR5cGUgPSBWSURUWVBFX0lOVEVSTEFDRV9CT1RUT00gfAorCQkJCW52X29yZGVyIHwgVklEVFlQRV9WSVVfRklFTEQ7CisJCQkJdmYtPmluZGV4ID0gKHBpYy0+aW5kZXggPDwgOCkgfCAweGZmOworCQkJfQorCQkJaWYgKHBpYy0+c2hvd19mcmFtZSkgeworCQkJCWRlY29kZXJfZG9fZnJhbWVfY2hlY2sodmRlYywgdmYpOworCQkJCXZkZWNfdmZyYW1lX3JlYWR5KHZkZWMsIHZmKTsKKwkJCQlrZmlmb19wdXQoJmhldmMtPnBlbmRpbmdfcSwKKwkJCQkoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQkJCWlmIChhdG9taWNfcmVhZCgmaGV2Yy0+dmZfcHJlX2NvdW50KSA9PSAwKQorCQkJCQlhdG9taWNfYWRkKDEsICZoZXZjLT52Zl9wcmVfY291bnQpOworCisJCQkJLyoqLworCQkJCWlmIChwaWMtPnBpY19zdHJ1Y3QgPT0gMTEpCisJCQkJCWhldmMtPnByZV90b3BfcGljID0gcGljOworCQkJCWVsc2UKKwkJCQkJaGV2Yy0+cHJlX2JvdF9waWMgPSBwaWM7CisJCQl9IGVsc2UgeworCQkJCXZoMjY1X3ZmX3B1dCh2ZiwgdmRlYyk7CisJCQkJYXRvbWljX2FkZCgxLCAmaGV2Yy0+dmZfZ2V0X2NvdW50KTsKKwkJCQlhdG9taWNfYWRkKDEsICZoZXZjLT52Zl9wcmVfY291bnQpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9IGVsc2UgeworCQkJcGljLT52Zl9yZWYgPSAxOworCisJCQloZXZjX3ByaW50KGhldmMsIEgyNjVfREVCVUdfUElDX1NUUlVDVCwKKwkJCQkicGljX3N0cnVjdCA9ICVkIGluZGV4IDB4JXhcbiIsCisJCQkJcGljLT5waWNfc3RydWN0LCBwaWMtPmluZGV4KTsKKworCQkJc3dpdGNoIChwaWMtPnBpY19zdHJ1Y3QpIHsKKwkJCWNhc2UgNzoKKwkJCQl2Zi0+ZHVyYXRpb24gPDw9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIDg6CisJCQkJdmYtPmR1cmF0aW9uID0gdmYtPmR1cmF0aW9uICogMzsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQl2Zi0+dHlwZSA9IFZJRFRZUEVfSU5URVJMQUNFX1RPUCB8CisJCQkJbnZfb3JkZXIgfCBWSURUWVBFX1ZJVV9GSUVMRDsKKwkJCQlwcm9jZXNzX3BlbmRpbmdfdmZyYW1lKGhldmMsIHBpYywgMSk7CisJCQkJaGV2Yy0+cHJlX3RvcF9waWMgPSBwaWM7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJdmYtPnR5cGUgPSBWSURUWVBFX0lOVEVSTEFDRV9CT1RUT00KKwkJCQl8IG52X29yZGVyCisJCQkJfCBWSURUWVBFX1ZJVV9GSUVMRDsKKwkJCQlwcm9jZXNzX3BlbmRpbmdfdmZyYW1lKGhldmMsIHBpYywgMCk7CisJCQkJaGV2Yy0+cHJlX2JvdF9waWMgPSBwaWM7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChwaWMtPnNob3dfZnJhbWUpIHsKKwkJCQlwdXRfdmZfdG9fZGlzcGxheV9xKGhldmMsIHZmKTsKKwkJCX0gZWxzZSB7CisJCQkJdmgyNjVfdmZfcHV0KHZmLCB2ZGVjKTsKKwkJCQlhdG9taWNfYWRkKDEsICZoZXZjLT52Zl9nZXRfY291bnQpOworCQkJCWF0b21pY19hZGQoMSwgJmhldmMtPnZmX3ByZV9jb3VudCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKyNlbHNlCisJCXZmLT50eXBlX29yaWdpbmFsID0gdmYtPnR5cGU7CisJCXBpYy0+dmZfcmVmID0gMTsKKwkJcHV0X3ZmX3RvX2Rpc3BsYXlfcShoZXZjLCB2Zik7CisjZW5kaWYKKwkJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UubmV3X3FfbmFtZSwga2ZpZm9fbGVuKCZoZXZjLT5uZXdmcmFtZV9xKSk7CisJCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLmRpc3BfcV9uYW1lLCBrZmlmb19sZW4oJmhldmMtPmRpc3BsYXlfcSkpOworCQkvKmNvdW50IGluZm8qLworCQl2ZGVjX2NvdW50X2luZm8oaGV2Yy0+Z3ZzLCAwLCBzdHJlYW1fb2Zmc2V0KTsKKwkJaWYgKHBpYy0+c2xpY2VfdHlwZSA9PSBJX1NMSUNFKSB7CisJCQloZXZjLT5ndnMtPmlfZGVjb2RlZF9mcmFtZXMrKzsKKwkJCXZmLT5mcmFtZV90eXBlIHw9IFY0TDJfQlVGX0ZMQUdfS0VZRlJBTUU7CisJCX0gZWxzZSBpZiAocGljLT5zbGljZV90eXBlID09IFBfU0xJQ0UpIHsKKwkJCWhldmMtPmd2cy0+cF9kZWNvZGVkX2ZyYW1lcysrOworCQkJdmYtPmZyYW1lX3R5cGUgfD0gVjRMMl9CVUZfRkxBR19QRlJBTUU7CisJCX0gZWxzZSBpZiAocGljLT5zbGljZV90eXBlID09IEJfU0xJQ0UpIHsKKwkJCWhldmMtPmd2cy0+Yl9kZWNvZGVkX2ZyYW1lcysrOworCQkJdmYtPmZyYW1lX3R5cGUgfD0gVjRMMl9CVUZfRkxBR19CRlJBTUU7CisJCX0KKwkJaGV2Y191cGRhdGVfZ3ZzKGhldmMpOworCQltZW1jcHkoJnRtcDR4LCBoZXZjLT5ndnMsIHNpemVvZihzdHJ1Y3QgdmRlY19pbmZvKSk7CisJCXRtcDR4LmJpdF9kZXB0aF9sdW1hID0gcGljLT5iaXRfZGVwdGhfbHVtYTsKKwkJdG1wNHguYml0X2RlcHRoX2Nocm9tYSA9IHBpYy0+Yml0X2RlcHRoX2Nocm9tYTsKKwkJdG1wNHguZG91YmxlX3dyaXRlX21vZGUgPSBwaWMtPmRvdWJsZV93cml0ZV9tb2RlOworCQl2ZGVjX2ZpbGxfdmRlY19mcmFtZSh2ZGVjLCAmaGV2Yy0+dmZyYW1lX3FvcywgJnRtcDR4LCB2ZiwgcGljLT5od19kZWNvZGVfdGltZSk7CisJCXZkZWMtPnZkZWNfZnBzX2RldGVjKHZkZWMtPmlkKTsKKwkJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX0JVRk1HUiwKKwkJCSIlcyh0eXBlICVkIGluZGV4IDB4JXggcG9jICVkLyVkKSBwdHMoJWQsJWQpIGR1ciAlZFxuIiwKKwkJCV9fZnVuY19fLCB2Zi0+dHlwZSwgdmYtPmluZGV4LAorCQkJZ2V0X3BpY19wb2MoaGV2YywgdmYtPmluZGV4ICYgMHhmZiksCisJCQlnZXRfcGljX3BvYyhoZXZjLCAodmYtPmluZGV4ID4+IDgpICYgMHhmZiksCisJCQl2Zi0+cHRzLCB2Zi0+cHRzX3VzNjQsCisJCQl2Zi0+ZHVyYXRpb24pOworCQlpZiAocGljLT5waWNfc3RydWN0ID09IDEwIHx8IHBpYy0+cGljX3N0cnVjdCA9PSAxMikgeworCQkJaW5kZXggPSAodmYtPmluZGV4ID4+IDgpICYgMHhmZjsKKwkJfSBlbHNlIHsKKwkJCWluZGV4ID0gdmYtPmluZGV4ICYgMHhmZjsKKwkJfQorI2lmZGVmIEFVWF9EQVRBX0NSQworCQlpZiAoaW5kZXggPD0gTUFYX1JFRl9QSUNfTlVNKQorCQkJZGVjb2Rlcl9kb19hdXhfZGF0YV9jaGVjayh2ZGVjLCBoZXZjLT5tX1BJQ1tpbmRleF0tPmF1eF9kYXRhX2J1ZiwKKwkJCQloZXZjLT5tX1BJQ1tpbmRleF0tPmF1eF9kYXRhX3NpemUpOworI2VuZGlmCisKKwkJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX1BSSU5UX1NFSSwKKwkJCSJhdXhfZGF0YV9zaXplOiVkLCBzaWduYWxfdHlwZTogJWQsIHNlaV9wcmVzZW50X2ZsYWc6ICVkXG4iLAorCQkJaGV2Yy0+bV9QSUNbaW5kZXhdLT5hdXhfZGF0YV9zaXplLCBoZXZjLT52aWRlb19zaWduYWxfdHlwZSwgaGV2Yy0+c2VpX3ByZXNlbnRfZmxhZyk7CisKKwkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfUFJJTlRfU0VJKSB7CisJCQlpbnQgaSA9IDA7CisJCQlQUl9JTklUKDEyOCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgaGV2Yy0+bV9QSUNbaW5kZXhdLT5hdXhfZGF0YV9zaXplOyBpKyspIHsKKwkJCQlQUl9GSUxMKCIlMDJ4ICIsIGhldmMtPm1fUElDW2luZGV4XS0+YXV4X2RhdGFfYnVmW2ldKTsKKwkJCQlpZiAoKChpICsgMSkgJiAweGYpID09IDApCisJCQkJCVBSX0lORk8oaGV2Yy0+aW5kZXgpOworCQkJfQorCQkJUFJfSU5GTyhoZXZjLT5pbmRleCk7CisJCX0KKworCQlpZiAoaGV2Yy0+aXNfdXNlZF92NGwpIHsKKwkJCWlmICgoaGV2Yy0+bV9QSUNbaW5kZXhdLT5hdXhfZGF0YV9zaXplID09IDApICYmCisJCQkJKHBpYy0+c2xpY2VfdHlwZSA9PSBJX1NMSUNFKSAmJgorCQkJCShhdG9taWNfcmVhZCgmaGV2Yy0+dmZfcHJlX2NvdW50KSA9PSAxKSkgeworCQkJCWhldmMtPm5vX25lZWRfYXV4X2RhdGEgPSB0cnVlOworCQkJfQorCisJCQlpZiAoaGV2Yy0+bm9fbmVlZF9hdXhfZGF0YSkgeworCQkJCXY0bDJfY3R4LT5hdXhfaW5mb3MuZnJlZV9vbmVfc2VpX2J1ZmZlcih2NGwyX2N0eCwKKwkJCQkJJmhldmMtPm1fUElDW2luZGV4XS0+YXV4X2RhdGFfYnVmLAorCQkJCQkmaGV2Yy0+bV9QSUNbaW5kZXhdLT5hdXhfZGF0YV9zaXplLAorCQkJCQloZXZjLT5tX1BJQ1tpbmRleF0tPmN0eF9idWZfaWR4KTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCFoZXZjLT5kaXNjYXJkX2R2X2RhdGEpCisJCQkJCXY0bDJfY3R4LT5hdXhfaW5mb3MuYmluZF9kdl9idWZmZXIodjRsMl9jdHgsICZ2Zi0+c3JjX2ZtdC5jb21wX2J1ZiwKKwkJCQkJCSZ2Zi0+c3JjX2ZtdC5tZF9idWYpOworCisJCQkJdXBkYXRlX3ZmcmFtZV9zcmNfZm10KHZmLAorCQkJCQloZXZjLT5tX1BJQ1tpbmRleF0tPmF1eF9kYXRhX2J1ZiwKKwkJCQkJaGV2Yy0+bV9QSUNbaW5kZXhdLT5hdXhfZGF0YV9zaXplLAorCQkJCQloZXZjLT5kdl9kdWFsbGF5ZXIsIGhldmMtPnByb3ZpZGVyX25hbWUsIE5VTEwpOworCQkJfQorCQl9CisKKwkJLyppZiAocGljLT52Zl9yZWYgPT0gaGV2Yy0+dmZfcHJlX2NvdW50KSB7Ki8KKwkJaWYgKGhldmMtPmtwaV9maXJzdF9pX2RlY29kZWQgPT0gMCkgeworCQkJaGV2Yy0+a3BpX2ZpcnN0X2lfZGVjb2RlZCA9IDE7CisJCQlwcl9kZWJ1ZygiW3ZkZWNfa3BpXVslc10gRmlyc3QgSSBmcmFtZSBkZWNvZGVkLlxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCX0KKworCQlpZiAod2l0aG91dF9kaXNwbGF5X21vZGUgPT0gMCkgeworCQkJaWYgKGhldmMtPmlzX3VzZWRfdjRsKSB7CisJCQkJaWYgKHY0bDJfY3R4LT5pc19zdHJlYW1fb2ZmKSB7CisJCQkJCXZoMjY1X3ZmX3B1dCh2aDI2NV92Zl9nZXQodmRlYyksIHZkZWMpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChoZXZjLT5zZW5kX2ZyYW1lX2ZsYWcgPT0gMSkgeworCQkJCQkJIHdoaWxlIChrZmlmb19sZW4oJmhldmMtPmRpc3BsYXlfcSkpIHsKKwkJCQkJCQlpZiAoaGV2Yy0+cGFpcl9mYlswXSAhPSBOVUxMICYmIGhldmMtPnBhaXJfZmJbMV0gIT0gTlVMTCkgeworCQkJCQkJCQlzZXRfbWV0YV9kYXRhX3RvX3ZmKHZmLCBVVk1fTUVUQV9EQVRBX1ZGX0JBU0VfSU5GT1MsIGhldmMtPnY0bDJfY3R4KTsKKwkJCQkJCQkJQVRSQUNFX0NPVU5URVIoIlZDX09VVF9ERUMtc3VibWl0IiwgaGV2Yy0+cGFpcl9mYlswXS0+YnVmX2lkeCk7CisJCQkJCQkJCWhldmMtPnBhaXJfZmJbMF0tPnRhc2stPnN1Ym1pdChoZXZjLT5wYWlyX2ZiWzBdLT50YXNrLCBUQVNLX1RZUEVfREVDKTsKKwkJCQkJCQkJQVRSQUNFX0NPVU5URVIoIlZDX09VVF9ERUMtc3VibWl0IiwgaGV2Yy0+cGFpcl9mYlsxXS0+YnVmX2lkeCk7CisJCQkJCQkJCWhldmMtPnBhaXJfZmJbMV0tPnRhc2stPnN1Ym1pdChoZXZjLT5wYWlyX2ZiWzFdLT50YXNrLCBUQVNLX1RZUEVfREVDKTsKKwkJCQkJCQkJY2xlYXJfcGFpcl9mYihoZXZjKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlzZXRfbWV0YV9kYXRhX3RvX3ZmKHZmLCBVVk1fTUVUQV9EQVRBX1ZGX0JBU0VfSU5GT1MsIGhldmMtPnY0bDJfY3R4KTsKKwkJCQkJCQkJQVRSQUNFX0NPVU5URVIoIlZDX09VVF9ERUMtc3VibWl0IiwgZmItPmJ1Zl9pZHgpOworCQkJCQkJCQlmYi0+dGFzay0+c3VibWl0KGZiLT50YXNrLCBUQVNLX1RZUEVfREVDKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXZmX25vdGlmeV9yZWNlaXZlcihoZXZjLT5wcm92aWRlcl9uYW1lLAorCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfVkZSQU1FX1JFQURZLCBOVUxMKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCQl2aDI2NV92Zl9wdXQodmgyNjVfdmZfZ2V0KHZkZWMpLCB2ZGVjKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwb3N0X3BpY3R1cmVfZWFybHkoc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGluZGV4KQoreworCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPSAoc3RydWN0IGhldmNfc3RhdGVfcyAqKXZkZWMtPnByaXZhdGU7CisJc3RydWN0IFBJQ19zICpwaWMgPSBoZXZjLT5tX1BJQ1tpbmRleF07CisKKwlpZiAoIWhldmMtPmVuYWJsZV9mZW5jZSkKKwkJcmV0dXJuIDA7CisKKwkvKiBjcmVhdGUgZmVuY2UgZm9yIGVhY2ggYnVmZmVycy4gKi8KKwlpZiAodmRlY190aW1lbGluZV9jcmVhdGVfZmVuY2UodmRlYy0+c3luYykpCisJCXJldHVybiAtMTsKKworCXBpYy0+ZmVuY2UJCT0gdmRlYy0+c3luYy0+ZmVuY2U7CisJcGljLT5zdHJlYW1fb2Zmc2V0CT0gUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCk7CisKKwlpZiAoaGV2Yy0+Y2h1bmspIHsKKwkJcGljLT5wdHMJPSBoZXZjLT5jaHVuay0+cHRzOworCQlwaWMtPnB0czY0CT0gaGV2Yy0+Y2h1bmstPnB0czY0OworCQlwaWMtPnRpbWVzdGFtcAk9IGhldmMtPmNodW5rLT50aW1lc3RhbXA7CisJfQorCXBpYy0+c2hvd19mcmFtZSA9IHRydWU7CisJcG9zdF92aWRlb19mcmFtZSh2ZGVjLCBwaWMpOworCisJZGlzcGxheV9mcmFtZV9jb3VudFtoZXZjLT5pbmRleF0rKzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByZXBhcmVfZGlzcGxheV9idWYoc3RydWN0IHZkZWNfcyAqdmRlYywgc3RydWN0IFBJQ19zICpmcmFtZSkKK3sKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjID0KKwkJKHN0cnVjdCBoZXZjX3N0YXRlX3MgKil2ZGVjLT5wcml2YXRlOworCisJaWYgKGhldmMtPmVuYWJsZV9mZW5jZSkgeworCQlpbnQgaSwgaiwgdXNlZF9zaXplLCByZXQ7CisJCWludCBzaWduZWRfY291bnQgPSAwOworCQlzdHJ1Y3QgdmZyYW1lX3MgKnNpZ25lZF9mZW5jZVtWRl9QT09MX1NJWkVdOworCisJCXBvc3RfcHJlcGFyZV9wcm9jZXNzKHZkZWMsIGZyYW1lKTsKKworCQlpZiAoIWZyYW1lLT5zaG93X2ZyYW1lKQorCQkJcHJfaW5mbygiZG8gbm90IGRpc3BsYXkuXG4iKTsKKworCQloZXZjLT5tX1BJQ1tmcmFtZS0+aW5kZXhdLT52Zl9yZWYgPSAxOworCisJCS8qIG5vdGlmeSBzaWduYWwgdG8gd2FrZSB1cCB3cSBvZiBmZW5jZS4gKi8KKwkJdmRlY190aW1lbGluZV9pbmNyZWFzZSh2ZGVjLT5zeW5jLCAxKTsKKwkJbXV0ZXhfbG9jaygmaGV2Yy0+ZmVuY2VfbXV0ZXgpOworCQl1c2VkX3NpemUgPSBoZXZjLT5mZW5jZV92Zl9zLnVzZWRfc2l6ZTsKKwkJaWYgKHVzZWRfc2l6ZSkgeworCQkJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBWRl9QT09MX1NJWkUgJiYgaiA8IHVzZWRfc2l6ZTsgaSsrKSB7CisJCQkJaWYgKGhldmMtPmZlbmNlX3ZmX3MuZmVuY2VfdmZbaV0gIT0gTlVMTCkgeworCQkJCQlyZXQgPSBkbWFfZmVuY2VfZ2V0X3N0YXR1cyhoZXZjLT5mZW5jZV92Zl9zLmZlbmNlX3ZmW2ldLT5mZW5jZSk7CisJCQkJCWlmIChyZXQgPT0gMSkgeworCQkJCQkJc2lnbmVkX2ZlbmNlW3NpZ25lZF9jb3VudF0gPSBoZXZjLT5mZW5jZV92Zl9zLmZlbmNlX3ZmW2ldOworCQkJCQkJaGV2Yy0+ZmVuY2VfdmZfcy5mZW5jZV92ZltpXSA9IE5VTEw7CisJCQkJCQloZXZjLT5mZW5jZV92Zl9zLnVzZWRfc2l6ZS0tOworCQkJCQkJc2lnbmVkX2NvdW50Kys7CisJCQkJCX0KKwkJCQkJaisrOworCQkJCX0KKwkJCX0KKwkJfQorCQltdXRleF91bmxvY2soJmhldmMtPmZlbmNlX211dGV4KTsKKwkJaWYgKHNpZ25lZF9jb3VudCAhPSAwKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2lnbmVkX2NvdW50OyBpKyspCisJCQkJdmgyNjVfdmZfcHV0KHNpZ25lZF9mZW5jZVtpXSwgdmRlYyk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHBvc3RfcHJlcGFyZV9wcm9jZXNzKHZkZWMsIGZyYW1lKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKHBvc3RfdmlkZW9fZnJhbWUodmRlYywgZnJhbWUpKQorCQlyZXR1cm4gLTE7CisKKwlkaXNwbGF5X2ZyYW1lX2NvdW50W2hldmMtPmluZGV4XSsrOworCXJldHVybiAwOworfQorCitzdGF0aWMgYm9vbCBpc19hdmFsaWFibGVfYnVmZmVyKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpOworCitzdGF0aWMgaW50IG5vdGlmeV92NGxfZW9zKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IGhldmNfc3RhdGVfcyAqaHcgPSAoc3RydWN0IGhldmNfc3RhdGVfcyAqKXZkZWMtPnByaXZhdGU7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPSAoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisJc3RydWN0IHZmcmFtZV9zICp2ZiA9ICZody0+dmZyYW1lX2R1bW15OworCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9IE5VTEw7CisJc3RhdGljIHN0cnVjdCBQSUNfcyAqcGljID0gTlVMTDsKKwl1bG9uZyBleHBpcmVzOworCisJaWYgKGh3LT5lb3MpIHsKKwkJZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDIwMDApOworCQl3aGlsZSAoIWlzX2F2YWxpYWJsZV9idWZmZXIoaHcpKSB7CisJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBleHBpcmVzKSkgeworCQkJCXByX2VycigiWyVkXSBIMjY1IGlzbid0IGVub3VnaCBidWZmIGZvciBub3RpZnkgZW9zLlxuIiwgY3R4LT5pZCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKworCQlwaWMgPSB2NGxfZ2V0X25ld19waWMoaHcsIE5VTEwpOworCQlpZiAoTlVMTCA9PSBwaWMpIHsKKwkJCXByX2VycigiWyVkXSBIMjY1IEVPUyBnZXQgZnJlZSBidWZmIGZhaWwuXG4iLCBjdHgtPmlkKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJZmIgPSAoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKikKKwkJCXBpYy0+Y21hX2FsbG9jX2FkZHI7CisKKwkJdmYtPnR5cGUJCXw9IFZJRFRZUEVfVjRMX0VPUzsKKwkJdmYtPnRpbWVzdGFtcAkJPSBVTE9OR19NQVg7CisJCXZmLT5mbGFnCQk9IFZGUkFNRV9GTEFHX0VNUFRZX0ZSQU1FX1Y0TDsKKwkJdmYtPnY0bF9tZW1faGFuZGxlCT0gKHVsb25nKWZiOworCisJCXZkZWNfdmZyYW1lX3JlYWR5KHZkZWMsIHZmKTsKKwkJa2ZpZm9fcHV0KCZody0+ZGlzcGxheV9xLCAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCisJCUFUUkFDRV9DT1VOVEVSKCJWQ19PVVRfREVDLXN1Ym1pdCIsIGZiLT5idWZfaWR4KTsKKwkJZmItPnRhc2stPnN1Ym1pdChmYi0+dGFzaywgVEFTS19UWVBFX0RFQyk7CisKKwkJcHJfaW5mbygiWyVkXSBIMjY1IEVPUyBub3RpZnkuXG4iLCBjdHgtPmlkKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19uYWxfc2VpKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsCisJaW50IHBheWxvYWRfdHlwZSwgaW50IHBheWxvYWRfc2l6ZSkKK3sKKwl1bnNpZ25lZCBzaG9ydCBkYXRhOworCisJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfUFJJTlRfU0VJKQorCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiXHRzZWkgbWVzc2FnZTogcGF5bG9hZF90eXBlID0gMHglMDJ4LCBwYXlsb2FkX3NpemUgPSAweCUwMnhcbiIsCisJCXBheWxvYWRfdHlwZSwgcGF5bG9hZF9zaXplKTsKKworCWlmIChwYXlsb2FkX3R5cGUgPT0gMTM3KSB7CisJCWludCBpLCBqOworCQkvKiBNQVNURVJJTkdfRElTUExBWV9DT0xPVVJfVk9MVU1FICovCisJCWlmIChwYXlsb2FkX3NpemUgPj0gMjQpIHsKKwkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX1BSSU5UX1NFSSkKKwkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCSJcdHNlaSBNQVNURVJJTkdfRElTUExBWV9DT0xPVVJfVk9MVU1FIGF2YWlsYWJsZVxuIik7CisJCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQkJZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworCQkJCQlkYXRhID0KKwkJCQkJKFJFQURfSFJFRyhIRVZDX1NISUZURURfREFUQSkgPj4gMTYpOworCQkJCQloZXZjLT5wcmltYXJpZXNbaV1bal0gPSBkYXRhOworCQkJCQlXUklURV9IUkVHKEhFVkNfU0hJRlRfQ09NTUFORCwKKwkJCQkJKDE8PDcpfDE2KTsKKwkJCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmCisJCQkJCQlIMjY1X0RFQlVHX1BSSU5UX1NFSSkKKwkJCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJCQkiXHRcdHByaW1hcmllc1slMWRdWyUxZF0gPSAlMDR4XG4iLAorCQkJCQkJaSwgaiwgaGV2Yy0+cHJpbWFyaWVzW2ldW2pdKTsKKwkJCQl9CisJCQl9CisJCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCQkJZGF0YSA9IChSRUFEX0hSRUcoSEVWQ19TSElGVEVEX0RBVEEpID4+IDE2KTsKKwkJCQloZXZjLT53aGl0ZV9wb2ludFtpXSA9IGRhdGE7CisJCQkJV1JJVEVfSFJFRyhIRVZDX1NISUZUX0NPTU1BTkQsICgxPDw3KXwxNik7CisJCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfUFJJTlRfU0VJKQorCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCQkiXHRcdHdoaXRlX3BvaW50WyUxZF0gPSAlMDR4XG4iLAorCQkJCQlpLCBoZXZjLT53aGl0ZV9wb2ludFtpXSk7CisJCQl9CisJCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCQkJZGF0YSA9IChSRUFEX0hSRUcoSEVWQ19TSElGVEVEX0RBVEEpID4+IDE2KTsKKwkJCQloZXZjLT5sdW1pbmFuY2VbaV0gPSBkYXRhIDw8IDE2OworCQkJCVdSSVRFX0hSRUcoSEVWQ19TSElGVF9DT01NQU5ELAorCQkJCSgxPDw3KXwxNik7CisJCQkJZGF0YSA9CisJCQkJKFJFQURfSFJFRyhIRVZDX1NISUZURURfREFUQSkgPj4gMTYpOworCQkJCWhldmMtPmx1bWluYW5jZVtpXSB8PSBkYXRhOworCQkJCVdSSVRFX0hSRUcoSEVWQ19TSElGVF9DT01NQU5ELAorCQkJCSgxPDw3KXwxNik7CisJCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmCisJCQkJCUgyNjVfREVCVUdfUFJJTlRfU0VJKQorCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCQkiXHRcdGx1bWluYW5jZVslMWRdID0gJTA4eFxuIiwKKwkJCQkJaSwgaGV2Yy0+bHVtaW5hbmNlW2ldKTsKKwkJCX0KKwkJCWhldmMtPnNlaV9wcmVzZW50X2ZsYWcgfD0gU0VJX01BU1RFUl9ESVNQTEFZX0NPTE9SX01BU0s7CisJCX0KKwkJcGF5bG9hZF9zaXplIC09IDI0OworCQl3aGlsZSAocGF5bG9hZF9zaXplID4gMCkgeworCQkJZGF0YSA9IChSRUFEX0hSRUcoSEVWQ19TSElGVEVEX0RBVEEpID4+IDI0KTsKKwkJCXBheWxvYWRfc2l6ZS0tOworCQkJV1JJVEVfSFJFRyhIRVZDX1NISUZUX0NPTU1BTkQsICgxPDw3KXw4KTsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwgIlx0XHRza2lwIGJ5dGUgJTAyeFxuIiwgZGF0YSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgaGV2Y19yZWNvdmVyKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJaW50IHJldCA9IC0xOworCXUzMiByZW07CisJdTY0IHNoaWZ0X2J5dGVfY291bnQ2NDsKKwl1bnNpZ25lZCBpbnQgaGV2Y19zaGlmdF9ieXRlX2NvdW50OworCXVuc2lnbmVkIGludCBoZXZjX3N0cmVhbV9zdGFydF9hZGRyOworCXVuc2lnbmVkIGludCBoZXZjX3N0cmVhbV9lbmRfYWRkcjsKKwl1bnNpZ25lZCBpbnQgaGV2Y19zdHJlYW1fcmRfcHRyOworCXVuc2lnbmVkIGludCBoZXZjX3N0cmVhbV93cl9wdHI7CisJdW5zaWduZWQgaW50IGhldmNfc3RyZWFtX2NvbnRyb2w7CisJdW5zaWduZWQgaW50IGhldmNfc3RyZWFtX2ZpZm9fY3RsOworCXVuc2lnbmVkIGludCBoZXZjX3N0cmVhbV9idWZfc2l6ZTsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhoZXZjKTsKKworCW11dGV4X2xvY2soJnZoMjY1X211dGV4KTsKKyNpZiAwCisJZm9yIChpID0gMDsgaSA8IChoZXZjLT5kZWJ1Z19wdHJfc2l6ZSAvIDIpOyBpICs9IDQpIHsKKwkJaW50IGlpOworCisJCWZvciAoaWkgPSAwOyBpaSA8IDQ7IGlpKyspCisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiJTA0eCAiLCBoZXZjLT5kZWJ1Z19wdHJbaSArIDMgLSBpaV0pOworCQlpZiAoKChpICsgaWkpICYgMHhmKSA9PSAwKQorCQkJaGV2Y19wcmludChoZXZjLCAwLCAiXG4iKTsKKwl9CisjZW5kaWYKKyNkZWZpbmUgRVNfVklEX01BTl9SRF9QVFIgICAgICAgICAgICAoMTw8MCkKKwlpZiAoIWhldmMtPmluaXRfZmxhZykgeworCQloZXZjX3ByaW50KGhldmMsIDAsICJoMjY1IGhhcyBzdG9wcGVkLCByZWNvdmVyIHJldHVybiFcbiIpOworCQltdXRleF91bmxvY2soJnZoMjY1X211dGV4KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJYW1oZXZjX3N0b3AoKTsKKwltc2xlZXAoMjApOworCXJldCA9IDA7CisJLyogcmVzZXQgKi8KKwlpZiAodmRlY19zdHJlYW1fYmFzZWQodmRlYykpIHsKKwkJU1RCVUZfV1JJVEUoJnZkZWMtPnZidWYsIHNldF9ycCwKKwkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIpKTsKKworCQlpZiAoIXZkZWMtPnZidWYubm9fcGFyc2VyKQorCQkJU0VUX1BBUlNFUl9SRUdfTUFTSyhQQVJTRVJfRVNfQ09OVFJPTCwKKwkJCQlFU19WSURfTUFOX1JEX1BUUik7CisJfQorCisJaGV2Y19zdHJlYW1fc3RhcnRfYWRkciA9IFJFQURfVlJFRyhIRVZDX1NUUkVBTV9TVEFSVF9BRERSKTsKKwloZXZjX3N0cmVhbV9lbmRfYWRkciA9IFJFQURfVlJFRyhIRVZDX1NUUkVBTV9FTkRfQUREUik7CisJaGV2Y19zdHJlYW1fcmRfcHRyID0gUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1JEX1BUUik7CisJaGV2Y19zdHJlYW1fd3JfcHRyID0gUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1dSX1BUUik7CisJaGV2Y19zdHJlYW1fY29udHJvbCA9IFJFQURfVlJFRyhIRVZDX1NUUkVBTV9DT05UUk9MKTsKKwloZXZjX3N0cmVhbV9maWZvX2N0bCA9IFJFQURfVlJFRyhIRVZDX1NUUkVBTV9GSUZPX0NUTCk7CisJaGV2Y19zdHJlYW1fYnVmX3NpemUgPSBoZXZjX3N0cmVhbV9lbmRfYWRkciAtIGhldmNfc3RyZWFtX3N0YXJ0X2FkZHI7CisKKwkvKiBIRVZDIHN0cmVhbWluZyBidWZmZXIgd2lsbCByZXNldCBhbmQgcmVzdGFydAorCSAqICAgZnJvbSBjdXJyZW50IGhldmNfc3RyZWFtX3JkX3B0ciBwb3NpdGlvbgorCSAqLworCS8qIGNhbGN1bGF0ZSBIRVZDX1NISUZUX0JZVEVfQ09VTlQgdmFsdWUgd2l0aCB0aGUgbmV3IHBvc2l0aW9uLiAqLworCWhldmNfc2hpZnRfYnl0ZV9jb3VudCA9IFJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpOworCWlmICgoaGV2Yy0+c2hpZnRfYnl0ZV9jb3VudF9sbyAmICgxIDw8IDMxKSkKKwkJJiYgKChoZXZjX3NoaWZ0X2J5dGVfY291bnQgJiAoMSA8PCAzMSkpID09IDApKQorCQloZXZjLT5zaGlmdF9ieXRlX2NvdW50X2hpKys7CisKKwloZXZjLT5zaGlmdF9ieXRlX2NvdW50X2xvID0gaGV2Y19zaGlmdF9ieXRlX2NvdW50OworCXNoaWZ0X2J5dGVfY291bnQ2NCA9ICgodTY0KShoZXZjLT5zaGlmdF9ieXRlX2NvdW50X2hpKSA8PCAzMikgfAorCQkJCWhldmMtPnNoaWZ0X2J5dGVfY291bnRfbG87CisJZGl2X3U2NF9yZW0oc2hpZnRfYnl0ZV9jb3VudDY0LCBoZXZjX3N0cmVhbV9idWZfc2l6ZSwgJnJlbSk7CisJc2hpZnRfYnl0ZV9jb3VudDY0IC09IHJlbTsKKwlzaGlmdF9ieXRlX2NvdW50NjQgKz0gaGV2Y19zdHJlYW1fcmRfcHRyIC0gaGV2Y19zdHJlYW1fc3RhcnRfYWRkcjsKKworCWlmIChyZW0gPiAoaGV2Y19zdHJlYW1fcmRfcHRyIC0gaGV2Y19zdHJlYW1fc3RhcnRfYWRkcikpCisJCXNoaWZ0X2J5dGVfY291bnQ2NCArPSBoZXZjX3N0cmVhbV9idWZfc2l6ZTsKKworCWhldmMtPnNoaWZ0X2J5dGVfY291bnRfbG8gPSAodTMyKXNoaWZ0X2J5dGVfY291bnQ2NDsKKwloZXZjLT5zaGlmdF9ieXRlX2NvdW50X2hpID0gKHUzMikoc2hpZnRfYnl0ZV9jb3VudDY0ID4+IDMyKTsKKworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMywKKwkJCSAgIC8qICgxPDwyKXwgKi8KKwkJCSAgICgxIDw8IDMpIHwgKDEgPDwgNCkgfCAoMSA8PCA4KSB8CisJCQkgICAoMSA8PCAxMSkgfCAoMSA8PCAxMikgfCAoMSA8PCAxNCkKKwkJCSAgIHwgKDEgPDwgMTUpIHwgKDEgPDwgMTcpIHwgKDEgPDwgMTgpIHwgKDEgPDwgMTkpKTsKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDMsIDApOworCisJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9TVEFSVF9BRERSLCBoZXZjX3N0cmVhbV9zdGFydF9hZGRyKTsKKwlXUklURV9WUkVHKEhFVkNfU1RSRUFNX0VORF9BRERSLCBoZXZjX3N0cmVhbV9lbmRfYWRkcik7CisJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIsIGhldmNfc3RyZWFtX3JkX3B0cik7CisJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9XUl9QVFIsIGhldmNfc3RyZWFtX3dyX3B0cik7CisJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9DT05UUk9MLCBoZXZjX3N0cmVhbV9jb250cm9sKTsKKwlXUklURV9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCwgaGV2Yy0+c2hpZnRfYnl0ZV9jb3VudF9sbyk7CisJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9GSUZPX0NUTCwgaGV2Y19zdHJlYW1fZmlmb19jdGwpOworCisJaGV2Y19jb25maWdfd29ya19zcGFjZV9odyhoZXZjKTsKKwlkZWNvZGVyX2h3X3Jlc2V0KCk7CisKKwloZXZjLT5oYXZlX3ZwcyA9IDA7CisJaGV2Yy0+aGF2ZV9zcHMgPSAwOworCWhldmMtPmhhdmVfcHBzID0gMDsKKworCWhldmMtPmhhdmVfdmFsaWRfc3RhcnRfc2xpY2UgPSAwOworCisJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShoZXZjKSAmIDB4MTApCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLAorCQkJMHgxIDw8IDMxICAvKi9FbmFibGUgTlYyMSByZWZlcmVuY2UgcmVhZCBtb2RlIGZvciBNQyovCisJCQkpOworCisJV1JJVEVfVlJFRyhIRVZDX1dBSVRfRkxBRywgMSk7CisJLyogY2xlYXIgbWFpbGJveCBpbnRlcnJ1cHQgKi8KKwlXUklURV9WUkVHKEhFVkNfQVNTSVNUX01CT1gwX0NMUl9SRUcsIDEpOworCS8qIGVuYWJsZSBtYWlsYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTUJPWDBfTUFTSywgMSk7CisJLyogZGlzYWJsZSBQU0NBTEUgZm9yIGhhcmR3YXJlIHNoYXJpbmcgKi8KKwlXUklURV9WUkVHKEhFVkNfUFNDQUxFX0NUUkwsIDApOworCisJQ0xFQVJfUEFSU0VSX1JFR19NQVNLKFBBUlNFUl9FU19DT05UUk9MLCBFU19WSURfTUFOX1JEX1BUUik7CisKKwlXUklURV9WUkVHKERFQlVHX1JFRzEsIDB4MCk7CisKKwlpZiAoKGVycm9yX2hhbmRsZV9wb2xpY3kgJiAxKSA9PSAwKSB7CisJCWlmICgoZXJyb3JfaGFuZGxlX3BvbGljeSAmIDQpID09IDApIHsKKwkJCS8qIHVjb2RlIGF1dG8gbW9kZSwgYW5kIGRvIG5vdCBjaGVjayB2cHMvc3BzL3Bwcy9pZHIgKi8KKwkJCVdSSVRFX1ZSRUcoTkFMX1NFQVJDSF9DVEwsCisJCQkJCSAgIDB4Yyk7CisJCX0gZWxzZSB7CisJCQlXUklURV9WUkVHKE5BTF9TRUFSQ0hfQ1RMLCAweDEpOy8qIG1hbnVhbCBwYXJzZXIgTkFMICovCisJCX0KKwl9IGVsc2UgeworCQlXUklURV9WUkVHKE5BTF9TRUFSQ0hfQ1RMLCAweDEpOy8qIG1hbnVhbCBwYXJzZXIgTkFMICovCisJfQorCisJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfTk9fRU9TX1NFQVJDSF9ET05FKQorCQlXUklURV9WUkVHKE5BTF9TRUFSQ0hfQ1RMLCBSRUFEX1ZSRUcoTkFMX1NFQVJDSF9DVEwpIHwgMHgxMDAwMCk7CisJV1JJVEVfVlJFRyhOQUxfU0VBUkNIX0NUTCwKKwkJUkVBRF9WUkVHKE5BTF9TRUFSQ0hfQ1RMKQorCQl8ICgocGFyc2VyX3NlaV9lbmFibGUgJiAweDcpIDw8IDE3KSk7CisvKiNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTiovCisJV1JJVEVfVlJFRyhOQUxfU0VBUkNIX0NUTCwKKwkJUkVBRF9WUkVHKE5BTF9TRUFSQ0hfQ1RMKSB8CisJCSgocGFyc2VyX2RvbGJ5X3Zpc2lvbl9lbmFibGUgJiAweDEpIDw8IDIwKSk7CisvKiNlbmRpZiovCisJY29uZmlnX2RlY29kZV9tb2RlKGhldmMpOworCVdSSVRFX1ZSRUcoREVDT0RFX1NUT1BfUE9TLCB1ZGVidWdfZmxhZyk7CisKKwkvKiBpZiAoYW1oZXZjX2xvYWRtYyh2aDI2NV9tYykgPCAwKSB7ICovCisJLyogYW1oZXZjX2Rpc2FibGUoKTsgKi8KKwkvKiByZXR1cm4gLUVCVVNZOyAqLworCS8qIH0gKi8KKyNpZiAwCisJZm9yIChpID0gMDsgaSA8IChoZXZjLT5kZWJ1Z19wdHJfc2l6ZSAvIDIpOyBpICs9IDQpIHsKKwkJaW50IGlpOworCisJCWZvciAoaWkgPSAwOyBpaSA8IDQ7IGlpKyspIHsKKwkJCS8qIGhldmMtPmRlYnVnX3B0cltpKzMtaWldPXR0dCsrOyAqLworCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJIiUwNHggIiwgaGV2Yy0+ZGVidWdfcHRyW2kgKyAzIC0gaWldKTsKKwkJfQorCQlpZiAoKChpICsgaWkpICYgMHhmKSA9PSAwKQorCQkJaGV2Y19wcmludChoZXZjLCAwLCAiXG4iKTsKKwl9CisjZW5kaWYKKwlpbml0X3BpY19saXN0X2h3KGhldmMpOworCisJaGV2Y19wcmludChoZXZjLCAwLCAiJXMgSEVWQ19TSElGVF9CWVRFX0NPVU5UPTB4JXhcbiIsIF9fZnVuY19fLAorCQkgICBSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKSk7CisKKyNpZmRlZiBTV0FQX0hFVkNfVUNPREUKKwlpZiAoIXRlZV9lbmFibGVkKCkgJiYgaGV2Yy0+aXNfc3dhcCAmJgorCQlnZXRfY3B1X21ham9yX2lkKCkgPD0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTSkgeworCQlXUklURV9WUkVHKEhFVkNfU1RSRUFNX1NXQVBfQlVGRkVSMiwgaGV2Yy0+bWNfZG1hX2hhbmRsZSk7CisJCS8qcHJfaW5mbygid3JpdGUgc3dhcCBidWZmZXIgJXhcbiIsICh1MzIpKGhldmMtPm1jX2RtYV9oYW5kbGUpKTsqLworCX0KKyNlbmRpZgorCWFtaGV2Y19zdGFydCgpOworCisJLyogc2tpcCwgc2VhcmNoIG5leHQgc3RhcnQgY29kZSAqLworCVdSSVRFX1ZSRUcoSEVWQ19XQUlUX0ZMQUcsIFJFQURfVlJFRyhIRVZDX1dBSVRfRkxBRykgJiAofjB4MikpOworCWhldmMtPnNraXBfZmxhZyA9IDE7CisjaWZkZWYgRVJST1JfSEFORExFX0RFQlVHCisJaWYgKGRiZ19uYWxfc2tpcF9jb3VudCAmIDB4MjAwMDApIHsKKwkJZGJnX25hbF9za2lwX2NvdW50ICY9IH4weDIwMDAwOworCQltdXRleF91bmxvY2soJnZoMjY1X211dGV4KTsKKwkJcmV0dXJuIHJldDsKKwl9CisjZW5kaWYKKwlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIEhFVkNfQUNUSU9OX0RPTkUpOworCS8qIEludGVycnVwdCBBbXJpc2MgdG8gZXhjdXRlICovCisJV1JJVEVfVlJFRyhIRVZDX01DUFVfSU5UUl9SRVEsIEFNUklTQ19NQUlOX1JFUSk7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCWlmICghaGV2Yy0+bV9pbnNfZmxhZykKKyNlbmRpZgorCQloZXZjLT5maXJzdF9waWNfYWZ0ZXJfcmVjb3ZlciA9IDE7CisJbXV0ZXhfdW5sb2NrKCZ2aDI2NV9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZHVtcF9hdXhfYnVmKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJaW50IGk7CisJdW5zaWduZWQgc2hvcnQgKmF1eF9hZHIgPQorCQkodW5zaWduZWQgc2hvcnQgKikKKwkJaGV2Yy0+YXV4X2FkZHI7CisJdW5zaWduZWQgaW50IGF1eF9zaXplID0KKwkJKFJFQURfVlJFRyhIRVZDX0FVWF9EQVRBX1NJWkUpCisJCT4+IDE2KSA8PCA0OworCVBSX0lOSVQoMTI4KTsKKworCWlmIChoZXZjLT5wcmVmaXhfYXV4X3NpemUgPiAwKSB7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJwcmVmaXggYXV4OiAoc2l6ZSAlZClcbiIsCisJCQlhdXhfc2l6ZSk7CisJCWlmIChhdXhfc2l6ZSA+IGhldmMtPnByZWZpeF9hdXhfc2l6ZSkgeworCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSIlczphdXhfc2l6ZSglZCkgaXMgb3ZlciBzaXplXG4iLCBfX2Z1bmNfXywgYXV4X3NpemUpOworCQkJcmV0dXJuIDsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgKGF1eF9zaXplID4+IDEpOyBpKyspIHsKKwkJCVBSX0ZJTEwoIiUwNHggIiwgKihhdXhfYWRyICsgaSkpOworCQkJaWYgKCgoaSArIDEpICYgMHhmKSA9PSAwKQorCQkJCVBSX0lORk8oaGV2Yy0+aW5kZXgpOzsKKwkJfQorCQlQUl9JTkZPKGhldmMtPmluZGV4KTs7CisJfQorCWlmIChoZXZjLT5zdWZmaXhfYXV4X3NpemUgPiAwKSB7CisJCWF1eF9hZHIgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCShoZXZjLT5hdXhfYWRkciArCisJCQloZXZjLT5wcmVmaXhfYXV4X3NpemUpOworCQlhdXhfc2l6ZSA9CisJCShSRUFEX1ZSRUcoSEVWQ19BVVhfREFUQV9TSVpFKSAmIDB4ZmZmZikKKwkJCTw8IDQ7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJzdWZmaXggYXV4OiAoc2l6ZSAlZClcbiIsCisJCQlhdXhfc2l6ZSk7CisJCWlmIChhdXhfc2l6ZSA+IGhldmMtPnN1ZmZpeF9hdXhfc2l6ZSkgeworCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSIlczphdXhfc2l6ZSglZCkgaXMgb3ZlciBzaXplXG4iLCBfX2Z1bmNfXywgYXV4X3NpemUpOworCQkJcmV0dXJuIDsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwKKwkJKGF1eF9zaXplID4+IDEpOyBpKyspIHsKKwkJCVBSX0ZJTEwoIiUwNHggIiwgKihhdXhfYWRyICsgaSkpOworCQkJaWYgKCgoaSArIDEpICYgMHhmKSA9PSAwKQorCQkJCVBSX0lORk8oaGV2Yy0+aW5kZXgpOworCQl9CisJCVBSX0lORk8oaGV2Yy0+aW5kZXgpOworCX0KK30KKworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCitzdGF0aWMgdm9pZCBkb2xieV9nZXRfbWV0YShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGhldmMpOworCisJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmCisJCUgyNjVfREVCVUdfUFJJTlRfU0VJKQorCQlkdW1wX2F1eF9idWYoaGV2Yyk7CisJaWYgKHZkZWMtPmRvbGJ5X21ldGFfd2l0aF9lbCB8fCB2ZGVjLT5zbGF2ZSkgeworCQlzZXRfYXV4X2RhdGEoaGV2YywKKwkJaGV2Yy0+Y3VyX3BpYywgMCwgMCk7CisJfSBlbHNlIGlmICh2ZGVjLT5tYXN0ZXIpIHsKKwkJc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Y19iYSA9CisJCShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICopCisJCQl2ZGVjLT5tYXN0ZXItPnByaXZhdGU7CisJCS8qZG8gbm90IHVzZSBoZXZjX2JhKi8KKwkJc2V0X2F1eF9kYXRhKGhldmMsCisJCWhldmNfYmEtPmN1cl9waWMsCisJCQkwLCAxKTsKKwkJc2V0X2F1eF9kYXRhKGhldmMsCisJCWhldmMtPmN1cl9waWMsIDAsIDIpOworCX0gZWxzZSBpZiAodmRlY19mcmFtZV9iYXNlZCh2ZGVjKSkgeworCQlzZXRfYXV4X2RhdGEoaGV2YywKKwkJCWhldmMtPmN1cl9waWMsIDEsIDApOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCByZWFkX2RlY29kZV9pbmZvKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJdWludDMyX3QgZGVjb2RlX2luZm8gPQorCQlSRUFEX0hSRUcoSEVWQ19ERUNPREVfSU5GTyk7CisJaGV2Yy0+c3RhcnRfZGVjb2RpbmdfZmxhZyB8PQorCQkoZGVjb2RlX2luZm8gJiAweGZmKTsKKwloZXZjLT5ycHNfc2V0X2lkID0gKGRlY29kZV9pbmZvID4+IDgpICYgMHhmZjsKK30KKworc3RhdGljIGludCB2aDI2NV9nZXRfcHNfaW5mbyhzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjLAorCQkJICAgICB1bmlvbiBwYXJhbV91ICpycG1fcGFyYW0sCisJCQkgICAgIHN0cnVjdCBhbWxfdmRlY19wc19pbmZvcyAqcHMpCit7CisJdTMyIFN1YldpZHRoQywgU3ViSGVpZ2h0QzsKKwl1MzIgd2lkdGggPSBycG1fcGFyYW0tPnAucGljX3dpZHRoX2luX2x1bWFfc2FtcGxlczsKKwl1MzIgaGVpZ2h0ID0gcnBtX3BhcmFtLT5wLnBpY19oZWlnaHRfaW5fbHVtYV9zYW1wbGVzOworCisJc3dpdGNoIChycG1fcGFyYW0tPnAuY2hyb21hX2Zvcm1hdF9pZGMpIHsKKwljYXNlIDE6CisJCVN1YldpZHRoQyA9IDI7CisJCVN1YkhlaWdodEMgPSAyOworCQlicmVhazsKKwljYXNlIDI6CisJCVN1YldpZHRoQyA9IDI7CisJCVN1YkhlaWdodEMgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlTdWJXaWR0aEMgPSAxOworCQlTdWJIZWlnaHRDID0gMTsKKwkJYnJlYWs7CisJfQorCisJd2lkdGggLT0gU3ViV2lkdGhDICoKKwkJKHJwbV9wYXJhbS0+cC5jb25mX3dpbl9sZWZ0X29mZnNldCArCisJCXJwbV9wYXJhbS0+cC5jb25mX3dpbl9yaWdodF9vZmZzZXQpOworCWhlaWdodCAtPSBTdWJIZWlnaHRDICoKKwkJKHJwbV9wYXJhbS0+cC5jb25mX3dpbl90b3Bfb2Zmc2V0ICsKKwkJcnBtX3BhcmFtLT5wLmNvbmZfd2luX2JvdHRvbV9vZmZzZXQpOworCisJaGV2Yy0+bGFzdF93aWR0aCA9IHJwbV9wYXJhbS0+cC5waWNfd2lkdGhfaW5fbHVtYV9zYW1wbGVzOworCWhldmMtPmxhc3RfaGVpZ2h0ID0gcnBtX3BhcmFtLT5wLnBpY19oZWlnaHRfaW5fbHVtYV9zYW1wbGVzOworCWhldmMtPnNwc19udW1fcmVvcmRlcl9waWNzXzAgPQorCQlycG1fcGFyYW0tPnAuc3BzX251bV9yZW9yZGVyX3BpY3NfMDsKKworCWhlaWdodCA8PD0gaGV2Yy0+aW50ZXJsYWNlX2ZsYWc7CisJcHMtPnZpc2libGVfd2lkdGggCT0gd2lkdGg7CisJcHMtPnZpc2libGVfaGVpZ2h0IAk9IGhlaWdodDsKKwlwcy0+Y29kZWRfd2lkdGggCT0gQUxJR04od2lkdGgsIDY0KTsKKwlwcy0+Y29kZWRfaGVpZ2h0IAk9IEFMSUdOKGhlaWdodCwgNjQpOworCXBzLT5maWVsZCAJCT0gaGV2Yy0+aW50ZXJsYWNlX2ZsYWcgPyBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQgOiBWNEwyX0ZJRUxEX05PTkU7CisJcHMtPmRwYl9mcmFtZXMJCT0gdjRsX3BhcnNlcl93b3JrX3BpY19udW0oaGV2Yyk7CisJcHMtPmRwYl9tYXJnaW4JCT0gZ2V0X2R5bmFtaWNfYnVmX251bV9tYXJnaW4oaGV2Yyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aDI2NV9nZXRfY2ZnX2luZm8oc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwkJCSAgICAgdW5pb24gcGFyYW1fdSAqcnBtX3BhcmFtLAorCQkJICAgICBzdHJ1Y3QgYW1sX3ZkZWNfY2ZnX2luZm9zICpjZmcpCit7CisJLyogZm9yY2UgaDI2NSBpbnRlcmxhY2UgdmlkZW8gdG8gZG91YmxlIHdyaXRlIDEqLworCWlmIChoZXZjLT5pbnRlcmxhY2VfZmxhZykgeworCQljZmctPmRvdWJsZV93cml0ZV9tb2RlID0gMTsKKwkJaGV2Yy0+ZG91YmxlX3dyaXRlX21vZGUgPSAxOworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiaGV2YyBpbnRlcmxhY2UgZm9yY2UgZHcgMVxuIik7CisJfQorCWNmZy0+aW5pdF93aWR0aCA9IHJwbV9wYXJhbS0+cC5waWNfd2lkdGhfaW5fbHVtYV9zYW1wbGVzOworCWNmZy0+aW5pdF9oZWlnaHQgPSBycG1fcGFyYW0tPnAucGljX2hlaWdodF9pbl9sdW1hX3NhbXBsZXMKKwkJPDwgaGV2Yy0+aW50ZXJsYWNlX2ZsYWc7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2V0X2NvbXBfYnVmX2luZm8oc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwkJc3RydWN0IHZkZWNfY29tcF9idWZfaW5mbyAqaW5mbykKK3sKKwl1MTYgYml0X2RlcHRoID0gaGV2Yy0+cGFyYW0ucC5iaXRfZGVwdGg7CisJaW50IHcgPSBoZXZjLT5wYXJhbS5wLnBpY193aWR0aF9pbl9sdW1hX3NhbXBsZXM7CisJaW50IGggPSBoZXZjLT5wYXJhbS5wLnBpY19oZWlnaHRfaW5fbHVtYV9zYW1wbGVzOworCisJaW5mby0+bWF4X3NpemUgPSBoZXZjX21heF9tbXVfYnVmX3NpemUoCisJCQloZXZjLT5tYXhfcGljX3csCisJCQloZXZjLT5tYXhfcGljX2gpOworCWluZm8tPmhlYWRlcl9zaXplID0gaGV2Y19nZXRfaGVhZGVyX3NpemUodyxoKTsKKwlpbmZvLT5mcmFtZV9idWZmZXJfc2l6ZSA9IGhldmNfbW11X3BhZ2VfbnVtKAorCQkJaGV2YywgdywgaCwJYml0X2RlcHRoID09IDApOworCisJcHJfaW5mbygiaGV2YyBnZXQgY29tcCBpbmZvOiAlZCAlZCAlZFxuIiwKKwkJCWluZm8tPm1heF9zaXplLCBpbmZvLT5oZWFkZXJfc2l6ZSwKKwkJCWluZm8tPmZyYW1lX2J1ZmZlcl9zaXplKTsKK30KKworc3RhdGljIGludCBpc19pbnRlcmxhY2Uoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwlpbnQgcGljX3N0cnVjdCA9IChoZXZjLT5wYXJhbS5wLnNlaV9mcmFtZV9maWVsZF9pbmZvID4+IDMpICYgMHhmOworCWludCBmcmFtZV9maWVsZF9pbmZvX3ByZXNlbnRfZmxhZyA9CisJCQkoaGV2Yy0+cGFyYW0ucC5zZWlfZnJhbWVfZmllbGRfaW5mbyA+PiA4KSAmIDB4MTsKKworCWlmICgoaGV2Yy0+cGFyYW0ucC5wcm9maWxlX2V0YyAmIDB4YykgPT0gMHg0CisJCSYmIChmcmFtZV9maWVsZF9pbmZvX3ByZXNlbnRfZmxhZworCQkmJiAocGljX3N0cnVjdCA9PSAwCisJCXx8IHBpY19zdHJ1Y3QgPT0gNworCQl8fCBwaWNfc3RydWN0ID09IDgpKSkKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAoKGhldmMtPnBhcmFtLnAucHJvZmlsZV9ldGMgJiAweGMpID09IDB4NCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaGV2Y19pbnRlcmxhY2VfY2hlY2soc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwl1bmlvbiBwYXJhbV91ICpycG1fcGFyYW0pCit7CisJaW50IHcsIGg7CisKKwl3ID0gaGV2Yy0+cGFyYW0ucC5waWNfd2lkdGhfaW5fbHVtYV9zYW1wbGVzOworCWggPSBoZXZjLT5wYXJhbS5wLnBpY19oZWlnaHRfaW5fbHVtYV9zYW1wbGVzOworCS8qIGludGVybGFjZSBjaGVjaywgNGsgZm9yY2Ugbm8gaW50ZXJsYWNlICovCisJaWYgKChpbnRlcmxhY2VfZW5hYmxlICE9IDApICYmCisJCSghSVNfNEtfU0laRSh3LCBoKSkgJiYKKwkJKGlzX2ludGVybGFjZShoZXZjKSkpIHsKKwkJaGV2Yy0+aW50ZXJsYWNlX2ZsYWcgPSAxOworCQloZXZjLT5mcmFtZV9hciA9IChoZXZjLT5waWNfaCAqIDB4MTAwIC8gaGV2Yy0+cGljX3cpICogMjsKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJImludGVybGFjZSAoJWQsICVkKSwgcHJvZmlsZV9ldGMgJXgsIGFyIDB4JXgsIGR3ICVkXG4iLAorCQkJaGV2Yy0+cGljX3csIGhldmMtPnBpY19oLCBoZXZjLT5wYXJhbS5wLnByb2ZpbGVfZXRjLCBoZXZjLT5mcmFtZV9hciwKKwkJCWdldF9kb3VibGVfd3JpdGVfbW9kZShoZXZjKSk7CisJfQorfQorCitzdGF0aWMgaW50IHY0bF9yZXNfY2hhbmdlKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMsIHVuaW9uIHBhcmFtX3UgKnJwbV9wYXJhbSkKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGhldmMtPnY0bDJfY3R4KTsKKwlpbnQgaSwgcmV0ID0gMDsKKworCWlmIChjdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSkgeworCQlzdHJ1Y3QgYW1sX3ZkZWNfcHNfaW5mb3MgcHM7CisJCWludCB3aWR0aCA9IHJwbV9wYXJhbS0+cC5waWNfd2lkdGhfaW5fbHVtYV9zYW1wbGVzOworCQlpbnQgaGVpZ2h0ID0gcnBtX3BhcmFtLT5wLnBpY19oZWlnaHRfaW5fbHVtYV9zYW1wbGVzOworCisJCWlmICgoaGV2Yy0+bGFzdF93aWR0aCAhPSAwICYmCisJCQloZXZjLT5sYXN0X2hlaWdodCAhPSAwKSAmJgorCQkJKGhldmMtPmxhc3Rfd2lkdGggIT0gd2lkdGggfHwKKwkJCWhldmMtPmxhc3RfaGVpZ2h0ICE9IGhlaWdodCkpIHsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkidjRsX3Jlc19jaGFuZ2UgUGljIFdpZHRoL0hlaWdodCBDaGFuZ2UgKCVkLCVkKT0+KCVkLCVkKSwgaW50ZXJsYWNlICVkXG4iLAorCQkJCWhldmMtPmxhc3Rfd2lkdGgsIGhldmMtPmxhc3RfaGVpZ2h0LAorCQkJCXdpZHRoLAorCQkJCWhlaWdodCwKKwkJCQloZXZjLT5pbnRlcmxhY2VfZmxhZyk7CisKKwkJCWlmIChnZXRfdmFsaWRfZG91YmxlX3dyaXRlX21vZGUoaGV2YykgIT0gMTYpIHsKKwkJCQlzdHJ1Y3QgdmRlY19jb21wX2J1Zl9pbmZvIGluZm87CisKKwkJCQlnZXRfY29tcF9idWZfaW5mbyhoZXZjLCAmaW5mbyk7CisJCQkJdmRlY192NGxfc2V0X2NvbXBfYnVmX2luZm8oY3R4LCAmaW5mbyk7CisJCQl9CisJCQl2aDI2NV9nZXRfcHNfaW5mbyhoZXZjLCAmaGV2Yy0+cGFyYW0sICZwcyk7CisJCQl2ZGVjX3Y0bF9zZXRfcHNfaW5mb3MoY3R4LCAmcHMpOworCQkJdmRlY192NGxfcmVzX2NoX2V2ZW50KGN0eCk7CisJCQloZXZjLT52NGxfcGFyYW1zX3BhcnNlZCA9IGZhbHNlOworCQkJY3R4LT52NGxfcmVzb2x1dGlvbl9jaGFuZ2UgPSAxOworCQkJaGV2Yy0+ZW9zID0gMTsKKwkJCWhldmMtPnJlc29sdXRpb25fY2hhbmdlID0gdHJ1ZTsKKworCQkJLyoKKwkJCSAqIG1hcmtzIGZyYW1lIHZhbGlkIG9uIHRoZSBkcGIgaXMgdGhlIG91cHV0IHN0YXRlLAorCQkJICogdGhlbiB2aWEgZmx1c2hfb3V0cHV0IGFsbCBmcmFtZXMgY2FuIGJlIGZsdXNoZWQgb3V0LgorCQkJICovCisJCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9QSUNfTlVNOyArK2kpIHsKKwkJCQlpZiAoKGhldmMtPm1fUElDW2ldID09IE5VTEwpIHx8CisJCQkJCShoZXZjLT5tX1BJQ1tpXS0+aW5kZXggPT0gLTEpIHx8CisJCQkJCShoZXZjLT5tX1BJQ1tpXS0+QlVGX2luZGV4ID09IC0xKSkKKwkJCQkJY29udGludWU7CisKKwkJCQlpZiAoKGhldmMtPm1fUElDW2ldLT5QT0MgIT0gSU5WQUxJRF9QT0MpICYmCisJCQkJCShoZXZjLT5tX1BJQ1tpXS0+b3V0cHV0X3JlYWR5ID09IDApICYmCisJCQkJCWhldmMtPm1fUElDW2ldLT5yZWZlcmVuY2VkICYmCisJCQkJCShoZXZjLT5tX1BJQ1tpXS0+UE9DID49IGhldmMtPmRlY29kZWRfcG9jKSkgeworCQkJCQkJaGV2Yy0+bV9QSUNbaV0tPm91dHB1dF9tYXJrID0gMTsKKwkJCQl9CisJCQl9CisKKwkJCWZsdXNoX291dHB1dChoZXZjLCBOVUxMKTsKKwkJCS8vZGVsX3RpbWVyX3N5bmMoJmhldmMtPnRpbWVyKTsKKwkJCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy1zdWJtaXRfZW9zIiwgX19MSU5FX18pOworCQkJbm90aWZ5X3Y0bF9lb3MoaHdfdG9fdmRlYyhoZXZjKSk7CisJCQlBVFJBQ0VfQ09VTlRFUigiVl9TVF9ERUMtc3VibWl0X2VvcyIsIDApOworCisJCQlyZXQgPSAxOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBoZXZjX3NraXBfbmFsKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJaWYgKChoZXZjLT5waWNfaCA9PSA5NikgJiYgKGhldmMtPnBpY193ICA9PSAxNjApICYmCisJCShnZXRfZG91YmxlX3dyaXRlX21vZGUoaGV2YykgPT0gMHgxMCkpIHsKKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA8PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVFhMWCkgeworCQkJaWYgKGhldmMtPnNraXBfbmFsX2NvdW50IDwgc2tpcF9uYWxfY291bnQpCisJCQkJcmV0dXJuIDE7CisJCX0gZWxzZSB7CisJCQlpZiAoaGV2Yy0+c2tpcF9uYWxfY291bnQgPCAxKQorCQkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgdmgyNjVfaXNyX3RocmVhZF9mbihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPSAoc3RydWN0IGhldmNfc3RhdGVfcyAqKSBkYXRhOworCXVuc2lnbmVkIGludCBkZWNfc3RhdHVzID0gaGV2Yy0+ZGVjX3N0YXR1czsKKwlpbnQgaSwgcmV0OworCisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaGV2Yyk7CisKKwlpZiAoZGVjX3N0YXR1cyA9PSBIRVZDX1NMSUNFX1NFR01FTlRfRE9ORSkgeworCQlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9USFJFQURfSEVBRF9TVEFSVCk7CisJfQorCWVsc2UgaWYgKGRlY19zdGF0dXMgPT0gSEVWQ19ERUNQSUNfREFUQV9ET05FKSB7CisJCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX1RIUkVBRF9QSUNfRE9ORV9TVEFSVCk7CisJfQorCisJaWYgKGhldmMtPmVvcykKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCWlmICgKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCSghaGV2Yy0+bV9pbnNfZmxhZykgJiYKKyNlbmRpZgorCQloZXZjLT5lcnJvcl9mbGFnID09IDEpIHsKKwkJaWYgKChlcnJvcl9oYW5kbGVfcG9saWN5ICYgMHgxMCkgPT0gMCkgeworCQkJaWYgKGhldmMtPmN1cl9waWMpIHsKKwkJCQlpbnQgY3VycmVudF9sY3VfaWR4ID0KKwkJCQkJUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0xDVV9TVEFSVCkKKwkJCQkJJiAweGZmZmZmZjsKKwkJCQlpZiAoY3VycmVudF9sY3VfaWR4IDwKKwkJCQkJKChoZXZjLT5sY3VfeF9udW0qaGV2Yy0+bGN1X3lfbnVtKS0xKSkKKwkJCQkJaGV2Yy0+Y3VyX3BpYy0+ZXJyb3JfbWFyayA9IDE7CisKKwkJCX0KKwkJfQorCQlpZiAoKGVycm9yX2hhbmRsZV9wb2xpY3kgJiAxKSA9PSAwKSB7CisJCQloZXZjLT5lcnJvcl9za2lwX25hbF9jb3VudCA9IDE7CisJCQkvKiBtYW51YWwgc2VhcmNoIG5hbCwgc2tpcCAgZXJyb3Jfc2tpcF9uYWxfY291bnQKKwkJCSAqICAgb2YgbmFsIGFuZCB0cmlnZ2VyIHRoZSBIRVZDX05BTF9TRUFSQ0hfRE9ORSBpcnEKKwkJCSAqLworCQkJV1JJVEVfVlJFRyhOQUxfU0VBUkNIX0NUTCwKKwkJCQkJICAgKGVycm9yX3NraXBfbmFsX2NvdW50IDw8IDQpIHwgMHgxKTsKKwkJfSBlbHNlIHsKKwkJCWhldmMtPmVycm9yX3NraXBfbmFsX2NvdW50ID0gZXJyb3Jfc2tpcF9uYWxfY291bnQ7CisJCQlXUklURV9WUkVHKE5BTF9TRUFSQ0hfQ1RMLCAweDEpOy8qIG1hbnVhbCBwYXJzZXIgTkFMICovCisJCX0KKwkJaWYgKChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX05PX0VPU19TRUFSQ0hfRE9ORSkKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCQkJfHwgdmRlYy0+bWFzdGVyCisJCQl8fCB2ZGVjLT5zbGF2ZQorI2VuZGlmCisJCQkpIHsKKwkJCVdSSVRFX1ZSRUcoTkFMX1NFQVJDSF9DVEwsCisJCQkJCSAgIFJFQURfVlJFRyhOQUxfU0VBUkNIX0NUTCkgfCAweDEwMDAwKTsKKwkJfQorCQlXUklURV9WUkVHKE5BTF9TRUFSQ0hfQ1RMLAorCQkJUkVBRF9WUkVHKE5BTF9TRUFSQ0hfQ1RMKQorCQkJfCAoKHBhcnNlcl9zZWlfZW5hYmxlICYgMHg3KSA8PCAxNykpOworLyojaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04qLworCQlXUklURV9WUkVHKE5BTF9TRUFSQ0hfQ1RMLAorCQkJUkVBRF9WUkVHKE5BTF9TRUFSQ0hfQ1RMKSB8CisJCQkoKHBhcnNlcl9kb2xieV92aXNpb25fZW5hYmxlICYgMHgxKSA8PCAyMCkpOworLyojZW5kaWYqLworCQljb25maWdfZGVjb2RlX21vZGUoaGV2Yyk7CisJCS8qIHNlYXJjaCBuZXcgbmFsICovCisJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgSEVWQ19BQ1RJT05fRE9ORSk7CisJCS8qIEludGVycnVwdCBBbXJpc2MgdG8gZXhjdXRlICovCisJCVdSSVRFX1ZSRUcoSEVWQ19NQ1BVX0lOVFJfUkVRLCBBTVJJU0NfTUFJTl9SRVEpOworCisJCS8qIGhldmNfcHJpbnQoaGV2YywgMCwKKwkJICoiJXM6IGVycm9yIGhhbmRsZVxuIiwgX19mdW5jX18pOworCQkgKi8KKwkJaGV2Yy0+ZXJyb3JfZmxhZyA9IDI7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9IGVsc2UgaWYgKAorI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwkJKCFoZXZjLT5tX2luc19mbGFnKSAmJgorI2VuZGlmCisJCWhldmMtPmVycm9yX2ZsYWcgPT0gMykgeworCQloZXZjX3ByaW50KGhldmMsIDAsICJlcnJvcl9mbGFnPTMsIGhldmNfcmVjb3ZlclxuIik7CisJCWhldmNfcmVjb3ZlcihoZXZjKTsKKwkJaGV2Yy0+ZXJyb3JfZmxhZyA9IDA7CisKKwkJaWYgKChlcnJvcl9oYW5kbGVfcG9saWN5ICYgMHgxMCkgPT0gMCkgeworCQkJaWYgKGhldmMtPmN1cl9waWMpIHsKKwkJCQlpbnQgY3VycmVudF9sY3VfaWR4ID0KKwkJCQkJUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0xDVV9TVEFSVCkKKwkJCQkJJiAweGZmZmZmZjsKKwkJCQlpZiAoY3VycmVudF9sY3VfaWR4IDwKKwkJCQkJKChoZXZjLT5sY3VfeF9udW0qaGV2Yy0+bGN1X3lfbnVtKS0xKSkKKwkJCQkJaGV2Yy0+Y3VyX3BpYy0+ZXJyb3JfbWFyayA9IDE7CisKKwkJCX0KKwkJfQorCQlpZiAoKGVycm9yX2hhbmRsZV9wb2xpY3kgJiAxKSA9PSAwKSB7CisJCQkvKiBuZWVkIHNraXAgc29tZSBkYXRhIHdoZW4KKwkJCSAqICAgZXJyb3JfZmxhZyBvZiAzIGlzIHRyaWdnZXJlZCwKKwkJCSAqLworCQkJLyogdG8gYXZvaWQgaGV2Y19yZWNvdmVyKCkgYmVpbmcgY2FsbGVkCisJCQkgKiAgIGZvciBtYW55IHRpbWVzIGF0IHRoZSBzYW1lIGJpdHN0cmVhbSBwb3NpdGlvbgorCQkJICovCisJCQloZXZjLT5lcnJvcl9za2lwX25hbF9jb3VudCA9IDE7CisJCQkvKiBtYW51YWwgc2VhcmNoIG5hbCwgc2tpcCAgZXJyb3Jfc2tpcF9uYWxfY291bnQKKwkJCSAqICAgb2YgbmFsIGFuZCB0cmlnZ2VyIHRoZSBIRVZDX05BTF9TRUFSQ0hfRE9ORSBpcnEKKwkJCSAqLworCQkJV1JJVEVfVlJFRyhOQUxfU0VBUkNIX0NUTCwKKwkJCQkJICAgKGVycm9yX3NraXBfbmFsX2NvdW50IDw8IDQpIHwgMHgxKTsKKwkJfQorCisJCWlmICgoZXJyb3JfaGFuZGxlX3BvbGljeSAmIDB4MikgPT0gMCkgeworCQkJaGV2Yy0+aGF2ZV92cHMgPSAxOworCQkJaGV2Yy0+aGF2ZV9zcHMgPSAxOworCQkJaGV2Yy0+aGF2ZV9wcHMgPSAxOworCQl9CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisJaWYgKCFoZXZjLT5tX2luc19mbGFnKSB7CisJCWkgPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKTsKKwkJaWYgKChoZXZjLT5zaGlmdF9ieXRlX2NvdW50X2xvICYgKDEgPDwgMzEpKQorCQkJJiYgKChpICYgKDEgPDwgMzEpKSA9PSAwKSkKKwkJCWhldmMtPnNoaWZ0X2J5dGVfY291bnRfaGkrKzsKKwkJaGV2Yy0+c2hpZnRfYnl0ZV9jb3VudF9sbyA9IGk7CisJfQorI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwltdXRleF9sb2NrKCZoZXZjLT5jaHVua3NfbXV0ZXgpOworCWlmICgoZGVjX3N0YXR1cyA9PSBIRVZDX0RFQ1BJQ19EQVRBX0RPTkUgfHwKKwkJZGVjX3N0YXR1cyA9PSBIRVZDX0ZJTkRfTkVYVF9QSUNfTkFMIHx8CisJCWRlY19zdGF0dXMgPT0gSEVWQ19GSU5EX05FWFRfRFZFTF9OQUwpCisJCSYmIChoZXZjLT5jaHVuaykpIHsKKwkJaGV2Yy0+Y3VyX3BpYy0+cHRzID0gaGV2Yy0+Y2h1bmstPnB0czsKKwkJaGV2Yy0+Y3VyX3BpYy0+cHRzNjQgPSBoZXZjLT5jaHVuay0+cHRzNjQ7CisJCWhldmMtPmN1cl9waWMtPnRpbWVzdGFtcCA9IGhldmMtPmNodW5rLT50aW1lc3RhbXA7CisJfQorCW11dGV4X3VubG9jaygmaGV2Yy0+Y2h1bmtzX211dGV4KTsKKworCWlmIChkZWNfc3RhdHVzID09IEhFVkNfREVDT0RFX0JVRkVNUFRZIHx8CisJCWRlY19zdGF0dXMgPT0gSEVWQ19ERUNPREVfQlVGRU1QVFkyKSB7CisJCWlmIChoZXZjLT5tX2luc19mbGFnKSB7CisJCQlyZWFkX2RlY29kZV9pbmZvKGhldmMpOworCQkJaWYgKHZkZWNfZnJhbWVfYmFzZWQoaHdfdG9fdmRlYyhoZXZjKSkpIHsKKwkJCQloZXZjLT5lbXB0eV9mbGFnID0gMTsKKwkJCQkvKnN1ZmZpeCBzZWkgb3IgZHYgbWV0YSovCisJCQkJc2V0X2F1eF9kYXRhKGhldmMsIGhldmMtPmN1cl9waWMsIDEsIDApOworCQkJCWdvdG8gcGljX2RvbmU7CisJCQl9IGVsc2UgeworCQkJCWlmICgKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCQkJCQl2ZGVjLT5tYXN0ZXIgfHwKKwkJCQkJdmRlYy0+c2xhdmUgfHwKKyNlbmRpZgorCQkJCQkoZGF0YV9yZXNlbmRfcG9saWN5ICYgMHgxKSkgeworCQkJCQloZXZjLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKwkJCQkJYW1oZXZjX3N0b3AoKTsKKwkJCQkJcmVzdG9yZV9kZWNvZGVfc3RhdGUoaGV2Yyk7CisJCQkJfSBlbHNlCisJCQkJCWhldmMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0dFVF9EQVRBOworCQkJfQorCQkJcmVzZXRfcHJvY2Vzc190aW1lKGhldmMpOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZoZXZjLT53b3JrKTsKKwkJfQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfSBlbHNlIGlmICgoZGVjX3N0YXR1cyA9PSBIRVZDX1NFQVJDSF9CVUZFTVBUWSkgfHwKKwkJKGRlY19zdGF0dXMgPT0gSEVWQ19OQUxfREVDT0RFX0RPTkUpCisJCSkgeworCQlpZiAoaGV2Yy0+bV9pbnNfZmxhZykgeworCQkJcmVhZF9kZWNvZGVfaW5mbyhoZXZjKTsKKwkJCWlmICh2ZGVjX2ZyYW1lX2Jhc2VkKGh3X3RvX3ZkZWMoaGV2YykpKSB7CisJCQkJLypoZXZjLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9HRVRfREFUQTsqLworCQkJCWhldmMtPmVtcHR5X2ZsYWcgPSAxOworCQkJCS8qc3VmZml4IHNlaSBvciBkdiBtZXRhKi8KKwkJCQlzZXRfYXV4X2RhdGEoaGV2YywgaGV2Yy0+Y3VyX3BpYywgMSwgMCk7CisJCQkJZ290byBwaWNfZG9uZTsKKwkJCX0gZWxzZSB7CisJCQkJaGV2Yy0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfQUdBSU47CisJCQkJYW1oZXZjX3N0b3AoKTsKKwkJCQlyZXN0b3JlX2RlY29kZV9zdGF0ZShoZXZjKTsKKwkJCX0KKworCQkJcmVzZXRfcHJvY2Vzc190aW1lKGhldmMpOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZoZXZjLT53b3JrKTsKKwkJfQorCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9IGVsc2UgaWYgKGRlY19zdGF0dXMgPT0gSEVWQ19ERUNQSUNfREFUQV9ET05FKSB7CisJCWlmIChoZXZjLT5tX2luc19mbGFnKSB7CisJCQlzdHJ1Y3QgUElDX3MgKnBpYzsKKwkJCXN0cnVjdCBQSUNfcyAqcGljX2Rpc3BsYXk7CisJCQlpbnQgZGVjb2RlZF9wb2M7CisKKwkJCWlmICh2ZGVjLT5tdmZybSkKKwkJCQl2ZGVjLT5tdmZybS0+aHdfZGVjb2RlX3RpbWUgPQorCQkJCWxvY2FsX2Nsb2NrKCkgLSB2ZGVjLT5tdmZybS0+aHdfZGVjb2RlX3N0YXJ0OworI2lmZGVmIERFVFJFRklMTF9FTkFCTEUKKwkJCWlmIChoZXZjLT5pc19zd2FwICYmCisJCQkJZ2V0X2NwdV9tYWpvcl9pZCgpIDw9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWE0pIHsKKwkJCQlpZiAoaGV2Yy0+ZGV0YnVmX2Fkcl92aXJ0ICYmIGhldmMtPmRlbHJlZmlsbF9jaGVjaworCQkJCQkmJiBSRUFEX1ZSRUcoSEVWQ19TQU9fREJHX01PREUwKSkKKwkJCQkJaGV2Yy0+ZGVscmVmaWxsX2NoZWNrID0gMjsKKwkJCX0KKyNlbmRpZgorCQkJaGV2Yy0+ZW1wdHlfZmxhZyA9IDA7CitwaWNfZG9uZToKKwkJCWlmICh2ZGVjLT5tYXN0ZXIgPT0gTlVMTCAmJiB2ZGVjLT5zbGF2ZSA9PSBOVUxMICYmCisJCQkJaGV2Yy0+ZW1wdHlfZmxhZyA9PSAwKSB7CisJCQkJaGV2Yy0+b3Zlcl9kZWNvZGUgPQorCQkJCQkoUkVBRF9WUkVHKEhFVkNfU0hJRlRfU1RBVFVTKSA+PiAxNSkgJiAweDE7CisJCQkJaWYgKGhldmMtPm92ZXJfZGVjb2RlKQorCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCQkiISEhT3ZlciBkZWNvZGUgJWRcbiIsIF9fTElORV9fKTsKKwkJCX0KKwkJCWlmIChpbnB1dF9mcmFtZV9iYXNlZChod190b192ZGVjKGhldmMpKSAmJgorCQkJCWZybWJhc2VfY29udF9iaXRsZXZlbCAhPSAwICYmCisJCQkJKGhldmMtPmRlY29kZV9zaXplID4gUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCkpICYmCisJCQkJKGhldmMtPmRlY29kZV9zaXplIC0gKFJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpKQorCQkJCSA+CWZybWJhc2VfY29udF9iaXRsZXZlbCkpIHsKKwkJCQkgY2hlY2tfcGljX2RlY29kZWRfZXJyb3IoaGV2YywgUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0xDVV9TVEFSVCkgJiAweGZmZmZmZik7CisJCQkJLypoYW5kbGUgdGhlIGNhc2U6IG11bHRpIHBpY3R1cmVzIGluIG9uZSBwYWNrZXQqLworCQkJCWhldmNfcHJpbnQoaGV2YywgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCQkiJXMgIGhhcyBtb3JlIGRhdGEgaW5kZXg9ICVkLCBzaXplPTB4JXggc2hpZnRjbnQ9MHgleClcbiIsCisJCQkJX19mdW5jX18sCisJCQkJaGV2Yy0+ZGVjb2RlX2lkeCwgaGV2Yy0+ZGVjb2RlX3NpemUsCisJCQkJUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCkpOworCQkJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgSEVWQ19BQ1RJT05fRE9ORSk7CisJCQkJc3RhcnRfcHJvY2Vzc190aW1lKGhldmMpOworCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCX0KKworCQkJcmVhZF9kZWNvZGVfaW5mbyhoZXZjKTsKKwkJCWdldF9waWN0dXJlX3Fvc19pbmZvKGhldmMpOworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJCQloZXZjLT5zdGFydF9wYXJzZXJfdHlwZSA9IDA7CisJCQloZXZjLT5zd2l0Y2hfZHZsYXllcl9mbGFnID0gMDsKKyNlbmRpZgorCQkJaGV2Yy0+ZGVjb2RlZF9wb2MgPSBoZXZjLT5jdXJyX1BPQzsKKwkJCWhldmMtPmRlY29kaW5nX3BpYyA9IE5VTEw7CisJCQloZXZjLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworI2lmZGVmIERFVFJFRklMTF9FTkFCTEUKKwkJCWlmIChoZXZjLT5pc19zd2FwICYmCisJCQkJZ2V0X2NwdV9tYWpvcl9pZCgpIDw9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWE0pCisJCQkJaWYgKGhldmMtPmRlbHJlZmlsbF9jaGVjayAhPSAyKQorI2VuZGlmCisKKwkJCWFtaGV2Y19zdG9wKCk7CisKKwkJCXJlc2V0X3Byb2Nlc3NfdGltZShoZXZjKTsKKworCQkJaWYgKCghaW5wdXRfc3RyZWFtX2Jhc2VkKHZkZWMpICYmCisJCQkJCWF0b21pY19yZWFkKCZoZXZjLT52Zl9wcmVfY291bnQpID09IDApIHx8IGhldmMtPmlwX21vZGUpIHsKKwkJCQlkZWNvZGVkX3BvYyA9IGhldmMtPmN1cnJfUE9DOworCQkJCXBpYyA9IGdldF9waWNfYnlfUE9DKGhldmMsIGRlY29kZWRfcG9jKTsKKwkJCQlpZiAocGljICYmIChwaWMtPlBPQyAhPSBJTlZBTElEX1BPQykpIHsKKwkJCQkJLypQQiBza2lwIGNvbnRyb2wgKi8KKwkJCQkJaWYgKHBpYy0+ZXJyb3JfbWFyayA9PSAwCisJCQkJCQkJJiYgaGV2Yy0+UEJfc2tpcF9tb2RlID09IDEpIHsKKwkJCQkJCS8qIHN0YXJ0IGRlY29kaW5nIGFmdGVyCisJCQkJCQkgKiAgIGZpcnN0IEkKKwkJCQkJCSAqLworCQkJCQkJaGV2Yy0+aWdub3JlX2J1Zm1ncl9lcnJvciB8PSAweDE7CisJCQkJCX0KKwkJCQkJaWYgKGhldmMtPmlnbm9yZV9idWZtZ3JfZXJyb3IgJiAxKSB7CisJCQkJCQlpZiAoaGV2Yy0+UEJfc2tpcF9jb3VudF9hZnRlcl9kZWNvZGluZyA+IDApIHsKKwkJCQkJCQloZXZjLT5QQl9za2lwX2NvdW50X2FmdGVyX2RlY29kaW5nLS07CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8qIHN0YXJ0IGRpc3BsYXlpbmcgKi8KKwkJCQkJCQloZXZjLT5pZ25vcmVfYnVmbWdyX2Vycm9yIHw9IDB4MjsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoaGV2Yy0+bW11X2VuYWJsZQorCQkJCQkJCSYmICgoaGV2Yy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDEwKSA9PSAwKSkgeworCQkJCQkJaWYgKCFoZXZjLT5tX2luc19mbGFnKSB7CisJCQkJCQkJaGV2Yy0+dXNlZF80a19udW0gPQorCQkJCQkJCVJFQURfVlJFRyhIRVZDX1NBT19NTVVfU1RBVFVTKSA+PiAxNjsKKworCQkJCQkJCWlmICgoIWlzX3NraXBfZGVjb2RpbmcoaGV2YywgcGljKSkgJiYKKwkJCQkJCQkJKGhldmMtPnVzZWRfNGtfbnVtID49IDApICYmCisJCQkJCQkJCShoZXZjLT5jdXJfcGljLT5zY2F0dGVyX2FsbG9jCisJCQkJCQkJCT09IDEpKQorCQkJCQkJCQlyZWN5Y2xlX21tdV9idWZfdGFpbChoZXZjLCBmYWxzZSk7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlwaWMtPm91dHB1dF9tYXJrID0gMTsKKwkJCQkJcGljLT5yZWNvbl9tYXJrID0gMTsKKwkJCQkJaWYgKHZkZWMtPm12ZnJtKSB7CisJCQkJCQlwaWMtPmZyYW1lX3NpemUgPQorCQkJCQkJCXZkZWMtPm12ZnJtLT5mcmFtZV9zaXplOworCQkJCQkJcGljLT5od19kZWNvZGVfdGltZSA9CisJCQkJCQkodTMyKXZkZWMtPm12ZnJtLT5od19kZWNvZGVfdGltZTsKKwkJCQkJfQorCQkJCX0KKwkJCQkvKkRldGVjdHMgdGhlIGZpcnN0IGZyYW1lIHdoZXRoZXIgaGFzIGFuIG92ZXIgZGVjb2RlIGVycm9yKi8KKwkJCQlpZiAodmRlYy0+bWFzdGVyID09IE5VTEwgJiYgdmRlYy0+c2xhdmUgPT0gTlVMTCAmJgorCQkJCQloZXZjLT5lbXB0eV9mbGFnID09IDApIHsKKwkJCQkJaGV2Yy0+b3Zlcl9kZWNvZGUgPQorCQkJCQkJKFJFQURfVlJFRyhIRVZDX1NISUZUX1NUQVRVUykgPj4gMTUpICYgMHgxOworCQkJCQlpZiAoaGV2Yy0+b3Zlcl9kZWNvZGUpCisJCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCQkJIiEhIU92ZXIgZGVjb2RlICVkXG4iLCBfX0xJTkVfXyk7CisJCQkJfQorCQkJCWNoZWNrX3BpY19kZWNvZGVkX2Vycm9yKGhldmMsCisJCQkJCVJFQURfVlJFRyhIRVZDX1BBUlNFUl9MQ1VfU1RBUlQpICYgMHhmZmZmZmYpOworCQkJCWlmIChoZXZjLT5jdXJfcGljICE9IE5VTEwgJiYKKwkJCQkJKFJFQURfVlJFRyhIRVZDX1BBUlNFUl9MQ1VfU1RBUlQpICYgMHhmZmZmZmYpID09IDAKKwkJCQkJJiYgKGhldmMtPmxjdV94X251bSAqIGhldmMtPmxjdV95X251bSAhPSAxKSkKKwkJCQkJaGV2Yy0+Y3VyX3BpYy0+ZXJyb3JfbWFyayA9IDE7CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KK2ZvcmNlX291dHB1dDoKKyNlbmRpZgorCQkJCXBpY19kaXNwbGF5ID0gb3V0cHV0X3BpYyhoZXZjLCAxKTsKKworCQkJCWlmIChwaWNfZGlzcGxheSkgeworCQkJCQlpZiAoKHBpY19kaXNwbGF5LT5lcnJvcl9tYXJrICYmCisJCQkJCQkoKGhldmMtPmlnbm9yZV9idWZtZ3JfZXJyb3IgJgorCQkJCQkJCQkgIDB4MikgPT0gMCkpCisJCQkJCQl8fCAoZ2V0X2RiZ19mbGFnKGhldmMpICYKKwkJCQkJCQlIMjY1X0RFQlVHX0RJU1BMQVlfQ1VSX0ZSQU1FKQorCQkJCQkJfHwgKGdldF9kYmdfZmxhZyhoZXZjKSAmCisJCQkJCQkJSDI2NV9ERUJVR19OT19ESVNQTEFZKSkgeworCQkJCQkJcGljX2Rpc3BsYXktPm91dHB1dF9yZWFkeSA9IDA7CisJCQkJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYKKwkJCQkJCQlIMjY1X0RFQlVHX0JVRk1HUikgeworCQkJCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJCQkiW0JNXSBEaXNwbGF5OiBQT0MgJWQsICIsCisJCQkJCQkJCSBwaWNfZGlzcGxheS0+UE9DKTsKKwkJCQkJCQloZXZjX3ByaW50X2NvbnQoaGV2YywgMCwKKwkJCQkJCQkiZGVjb2RpbmcgaW5kZXggJWQgPT0+ICIsCisJCQkJCQkJCSBwaWNfZGlzcGxheS0+CisJCQkJCQkJCSBkZWNvZGVfaWR4KTsKKwkJCQkJCQloZXZjX3ByaW50X2NvbnQoaGV2YywgMCwKKwkJCQkJCQkiRGVidWcgb3IgZXJyLHJlY3ljbGUgaXRcbiIpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKChwaWNfZGlzcGxheS0+CisJCQkJCQlzbGljZV90eXBlICE9IDIpICYmICFwaWNfZGlzcGxheS0+aXBfbW9kZSkgeworCQkJCQkJcGljX2Rpc3BsYXktPm91dHB1dF9yZWFkeSA9IDA7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXByZXBhcmVfZGlzcGxheV9idWYKKwkJCQkJCQkJKGh3X3RvX3ZkZWMoaGV2YyksCisJCQkJCQkJCSBwaWNfZGlzcGxheSk7CisJCQkJCQkJaGV2Yy0+Zmlyc3RfcGljX2ZsYWcgPSAxOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9JU1JfVEhSRUFEX0VETik7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmhldmMtPndvcmspOworCQl9CisKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJfSBlbHNlIGlmIChkZWNfc3RhdHVzID09IEhFVkNfRklORF9ORVhUX1BJQ19OQUwgfHwKKwkJZGVjX3N0YXR1cyA9PSBIRVZDX0ZJTkRfTkVYVF9EVkVMX05BTCkgeworCQlpZiAoaGV2Yy0+bV9pbnNfZmxhZykgeworCQkJdW5zaWduZWQgY2hhciBuZXh0X3BhcnNlcl90eXBlID0KKwkJCQkJUkVBRF9IUkVHKENVUl9OQUxfVU5JVF9UWVBFKSAmIDB4ZmY7CisJCQlyZWFkX2RlY29kZV9pbmZvKGhldmMpOworCisJCQlpZiAodmRlYy0+c2xhdmUgJiYKKwkJCQlkZWNfc3RhdHVzID09IEhFVkNfRklORF9ORVhUX0RWRUxfTkFMKSB7CisJCQkJLypjdXIgaXMgYmFzZSwgZm91bmQgZW5oYW5jZSovCisJCQkJc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Y19lbCA9CisJCQkJKHN0cnVjdCBoZXZjX3N0YXRlX3MgKikKKwkJCQkJdmRlYy0+c2xhdmUtPnByaXZhdGU7CisJCQkJaGV2Yy0+c3dpdGNoX2R2bGF5ZXJfZmxhZyA9IDE7CisJCQkJaGV2Yy0+bm9fc3dpdGNoX2R2bGF5ZXJfY291bnQgPSAwOworCQkJCWhldmNfZWwtPnN0YXJ0X3BhcnNlcl90eXBlID0KKwkJCQkJbmV4dF9wYXJzZXJfdHlwZTsKKwkJCQloZXZjX3ByaW50KGhldmMsIEgyNjVfREVCVUdfRFYsCisJCQkJCSJzd2l0Y2ggKHBvYyAlZCkgdG8gZWxcbiIsCisJCQkJCWhldmMtPmN1cl9waWMgPworCQkJCQloZXZjLT5jdXJfcGljLT5QT0MgOgorCQkJCQlJTlZBTElEX1BPQyk7CisJCQl9IGVsc2UgaWYgKHZkZWMtPm1hc3RlciAmJgorCQkJCWRlY19zdGF0dXMgPT0gSEVWQ19GSU5EX05FWFRfUElDX05BTCkgeworCQkJCS8qY3VyIGlzIGVuaGFuY2UsIGZvdW5kIGJhc2UqLworCQkJCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmNfYmEgPQorCQkJCShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICopCisJCQkJCXZkZWMtPm1hc3Rlci0+cHJpdmF0ZTsKKwkJCQloZXZjLT5zd2l0Y2hfZHZsYXllcl9mbGFnID0gMTsKKwkJCQloZXZjLT5ub19zd2l0Y2hfZHZsYXllcl9jb3VudCA9IDA7CisJCQkJaGV2Y19iYS0+c3RhcnRfcGFyc2VyX3R5cGUgPQorCQkJCQluZXh0X3BhcnNlcl90eXBlOworCQkJCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19EViwKKwkJCQkJInN3aXRjaCAocG9jICVkKSB0byBibFxuIiwKKwkJCQkJaGV2Yy0+Y3VyX3BpYyA/CisJCQkJCWhldmMtPmN1cl9waWMtPlBPQyA6CisJCQkJCUlOVkFMSURfUE9DKTsKKwkJCX0gZWxzZSB7CisJCQkJaGV2Yy0+c3dpdGNoX2R2bGF5ZXJfZmxhZyA9IDA7CisJCQkJaGV2Yy0+c3RhcnRfcGFyc2VyX3R5cGUgPQorCQkJCQluZXh0X3BhcnNlcl90eXBlOworCQkJCWhldmMtPm5vX3N3aXRjaF9kdmxheWVyX2NvdW50Kys7CisJCQkJaGV2Y19wcmludChoZXZjLCBIMjY1X0RFQlVHX0RWLAorCQkJCQkiJXM6IG5vX3N3aXRjaF9kdmxheWVyX2NvdW50ID0gJWRcbiIsCisJCQkJCXZkZWMtPm1hc3RlciA/ICJlbCIgOiAiYmwiLAorCQkJCQloZXZjLT5ub19zd2l0Y2hfZHZsYXllcl9jb3VudCk7CisJCQkJaWYgKHZkZWMtPnNsYXZlICYmCisJCQkJCWRvbGJ5X2VsX2ZsdXNoX3RoICE9IDAgJiYKKwkJCQkJaGV2Yy0+bm9fc3dpdGNoX2R2bGF5ZXJfY291bnQgPgorCQkJCQlkb2xieV9lbF9mbHVzaF90aCkgeworCQkJCQlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjX2VsID0KKwkJCQkJKHN0cnVjdCBoZXZjX3N0YXRlX3MgKikKKwkJCQkJdmRlYy0+c2xhdmUtPnByaXZhdGU7CisJCQkJCXN0cnVjdCBQSUNfcyAqZWxfcGljOworCQkJCQljaGVja19waWNfZGVjb2RlZF9lcnJvcihoZXZjX2VsLAorCQkJCQloZXZjX2VsLT5waWNfZGVjb2RlZF9sY3VfaWR4KTsKKwkJCQkJZWxfcGljID0gZ2V0X3BpY19ieV9QT0MoaGV2Y19lbCwKKwkJCQkJCWhldmNfZWwtPmN1cnJfUE9DKTsKKwkJCQkJaGV2Y19lbC0+Y3Vycl9QT0MgPSBJTlZBTElEX1BPQzsKKwkJCQkJaGV2Y19lbC0+bV9wb2NSYW5kb21BY2Nlc3MgPSBNQVhfSU5UOworCQkJCQlmbHVzaF9vdXRwdXQoaGV2Y19lbCwgZWxfcGljKTsKKwkJCQkJaGV2Y19lbC0+ZGVjb2RlZF9wb2MgPSBJTlZBTElEX1BPQzsgLyoKKwkJCQkJYWxyZWFkeSBjYWxsIGZsdXNoX291dHB1dCovCisJCQkJCWhldmNfZWwtPmRlY29kaW5nX3BpYyA9IE5VTEw7CisJCQkJCWhldmMtPm5vX3N3aXRjaF9kdmxheWVyX2NvdW50ID0gMDsKKwkJCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfRFYpCisJCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCQkibm8gZWwgYW55bW9yZSwgZmx1c2hfb3V0cHV0IGVsXG4iKTsKKwkJCQl9CisJCQl9CisJCQloZXZjLT5kZWNvZGVkX3BvYyA9IGhldmMtPmN1cnJfUE9DOworCQkJaGV2Yy0+ZGVjb2RpbmdfcGljID0gTlVMTDsKKwkJCWhldmMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJCQlhbWhldmNfc3RvcCgpOworCQkJcmVzZXRfcHJvY2Vzc190aW1lKGhldmMpOworCQkJaWYgKGF1eF9kYXRhX2lzX2F2YWlibGUoaGV2YykpCisJCQkJZG9sYnlfZ2V0X21ldGEoaGV2Yyk7CisJCQlpZihoZXZjLT5jdXJfcGljICYmIGhldmMtPmN1cl9waWMtPnNsaWNlX3R5cGUgPT0gMiAmJgorCQkJCWF0b21pY19yZWFkKCZoZXZjLT52Zl9wcmVfY291bnQpID09IDApIHsKKwkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCQkiZmlyc3Qgc2xpY2VfdHlwZSAleCBub19zd2l0Y2hfZHZsYXllcl9jb3VudCAleFxuIiwKKwkJCQkJCWhldmMtPmN1cl9waWMtPnNsaWNlX3R5cGUsCisJCQkJCQloZXZjLT5ub19zd2l0Y2hfZHZsYXllcl9jb3VudCk7CisJCQkJZ290byAgZm9yY2Vfb3V0cHV0OworCQkJfQorCQkJdmRlY19zY2hlZHVsZV93b3JrKCZoZXZjLT53b3JrKTsKKwkJfQorCisJCXJldHVybiBJUlFfSEFORExFRDsKKyNlbmRpZgorCX0KKworI2VuZGlmCisKKwlpZiAoZGVjX3N0YXR1cyA9PSBIRVZDX1NFSV9EQVQpIHsKKwkJaWYgKCFoZXZjLT5tX2luc19mbGFnKSB7CisJCQlpbnQgcGF5bG9hZF90eXBlID0KKwkJCQlSRUFEX0hSRUcoQ1VSX05BTF9VTklUX1RZUEUpICYgMHhmZmZmOworCQkJaW50IHBheWxvYWRfc2l6ZSA9CisJCQkJKFJFQURfSFJFRyhDVVJfTkFMX1VOSVRfVFlQRSkgPj4gMTYpICYgMHhmZmZmOworCQkJCXByb2Nlc3NfbmFsX3NlaShoZXZjLAorCQkJCQlwYXlsb2FkX3R5cGUsIHBheWxvYWRfc2l6ZSk7CisJCX0KKwkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCBIRVZDX1NFSV9EQVRfRE9ORSk7CisJfSBlbHNlIGlmIChkZWNfc3RhdHVzID09IEhFVkNfTkFMX1NFQVJDSF9ET05FKSB7CisJCWludCBuYWx0eXBlID0gUkVBRF9IUkVHKENVUl9OQUxfVU5JVF9UWVBFKTsKKwkJaW50IHBhcnNlX3R5cGUgPSBIRVZDX0RJU0NBUkRfTkFMOworCisJCWhldmMtPmVycm9yX3dhdGNoZG9nX2NvdW50ID0gMDsKKwkJaGV2Yy0+ZXJyb3Jfc2tpcF9uYWxfd3RfY250ID0gMDsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCWlmIChoZXZjLT5tX2luc19mbGFnKQorCQkJcmVzZXRfcHJvY2Vzc190aW1lKGhldmMpOworI2VuZGlmCisJCWlmIChzbGljZV9wYXJzZV9iZWdpbiA+IDAgJiYKKwkJCWdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfRElTQ0FSRF9OQUwpIHsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkibmFsIHR5cGUgJWQsIGRpc2NhcmQgJWRcbiIsIG5hbHR5cGUsCisJCQkJc2xpY2VfcGFyc2VfYmVnaW4pOworCQkJaWYgKG5hbHR5cGUgPD0gTkFMX1VOSVRfQ09ERURfU0xJQ0VfQ1JBKQorCQkJCXNsaWNlX3BhcnNlX2JlZ2luLS07CisJCX0KKwkJaWYgKG5hbHR5cGUgPT0gTkFMX1VOSVRfRU9TKSB7CisJCQlzdHJ1Y3QgUElDX3MgKnBpYzsKKwkJCWJvb2wgZW9zX2luX2hlYWQgPSBmYWxzZTsKKworCQkJaGV2Y19wcmludChoZXZjLCAwLCAiZ2V0IE5BTF9VTklUX0VPUywgZmx1c2ggb3V0cHV0XG4iKTsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCQkJaWYgKCghaGV2Yy0+ZGlzY2FyZF9kdl9kYXRhKSAmJiBhdXhfZGF0YV9pc19hdmFpYmxlKGhldmMpKSB7CisJCQkJaWYgKGhldmMtPmRlY29kaW5nX3BpYykKKwkJCQkJZG9sYnlfZ2V0X21ldGEoaGV2Yyk7CisJCQl9CisjZW5kaWYKKwkJCS8qRGV0ZWN0cyBmcmFtZSB3aGV0aGVyIGhhcyBhbiBvdmVyIGRlY29kZSBlcnJvciovCisJCQlpZiAodmRlYy0+bWFzdGVyID09IE5VTEwgJiYgdmRlYy0+c2xhdmUgPT0gTlVMTCAmJgorCQkJCQloZXZjLT5lbXB0eV9mbGFnID09IDAgJiYgaW5wdXRfc3RyZWFtX2Jhc2VkKHZkZWMpKSB7CisJCQkJCWhldmMtPm92ZXJfZGVjb2RlID0KKwkJCQkJCShSRUFEX1ZSRUcoSEVWQ19TSElGVF9TVEFUVVMpID4+IDE1KSAmIDB4MTsKKwkJCQkJaWYgKGhldmMtPm92ZXJfZGVjb2RlKQorCQkJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkJCSIhISFPdmVyIGRlY29kZSAlZFxuIiwgX19MSU5FX18pOworCQkJfQorCQkJY2hlY2tfcGljX2RlY29kZWRfZXJyb3IoaGV2YywKKwkJCQloZXZjLT5waWNfZGVjb2RlZF9sY3VfaWR4KTsKKwkJCXBpYyA9IGdldF9waWNfYnlfUE9DKGhldmMsIGhldmMtPmN1cnJfUE9DKTsKKwkJCWhldmMtPmN1cnJfUE9DID0gSU5WQUxJRF9QT0M7CisJCQkvKiBhZGQgdG8gZml4IFJBUF9CX0Jvc3Nlbl8xICovCisJCQloZXZjLT5tX3BvY1JhbmRvbUFjY2VzcyA9IE1BWF9JTlQ7CisJCQlmbHVzaF9vdXRwdXQoaGV2YywgcGljKTsKKwkJCWNsZWFyX3BvY19mbGFnKGhldmMpOworCQkJaWYgKGlucHV0X2ZyYW1lX2Jhc2VkKHZkZWMpKSB7CisJCQkJdTMyIHNoaWZ0Ynl0ZSA9IFJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpOworCQkJCWlmIChzaGlmdGJ5dGUgPCAweDggJiYgKGhldmMtPmRlY29kZV9zaXplIC0gc2hpZnRieXRlKSA+IDB4MTAwKSB7CisJCQkJCWhldmNfcHJpbnQoaGV2YywgMCwiIHNoaWZ0Ynl0ZXMgMHgleCAgZGVjb2RlX3NpemUgMHgleFxuIiwgc2hpZnRieXRlLCBoZXZjLT5kZWNvZGVfc2l6ZSk7CisJCQkJCWVvc19pbl9oZWFkID0gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCQlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIEhFVkNfRElTQ0FSRF9OQUwpOworCQkJLyogSW50ZXJydXB0IEFtcmlzYyB0byBleGN1dGUgKi8KKwkJCVdSSVRFX1ZSRUcoSEVWQ19NQ1BVX0lOVFJfUkVRLCBBTVJJU0NfTUFJTl9SRVEpOworCisJCQkvKiBlb3MgaXMgaW4gdGhlIGhlYWQgb2YgdGhlIGNodW5rIGFuZCBmb2xsb3dlZCBieSBzcHMvcHBzL0lEUgorCQkJICAqIHNvIG5lZWQgdG8gZ28gb24gZGVjb2RpbmcKKwkJCSAgKi8KKwkJCWlmIChlb3NfaW5faGVhZCkKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCQlpZiAoaGV2Yy0+bV9pbnNfZmxhZykgeworCQkJCWhldmMtPmRlY29kZWRfcG9jID0gSU5WQUxJRF9QT0M7IC8qCisJCQkJCWFscmVhZHkgY2FsbCBmbHVzaF9vdXRwdXQqLworCQkJCWhldmMtPmRlY29kaW5nX3BpYyA9IE5VTEw7CisJCQkJaGV2Yy0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwkJCQlhbWhldmNfc3RvcCgpOworCisJCQkJdmRlY19zY2hlZHVsZV93b3JrKCZoZXZjLT53b3JrKTsKKwkJCX0KKyNlbmRpZgorCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisKKwkJaWYgKAorI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwkJCSghaGV2Yy0+bV9pbnNfZmxhZykgJiYKKyNlbmRpZgorCQkJaGV2Yy0+ZXJyb3Jfc2tpcF9uYWxfY291bnQgPiAwKSB7CisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJIm5hbCB0eXBlICVkLCBkaXNjYXJkICVkXG4iLCBuYWx0eXBlLAorCQkJCWhldmMtPmVycm9yX3NraXBfbmFsX2NvdW50KTsKKwkJCWhldmMtPmVycm9yX3NraXBfbmFsX2NvdW50LS07CisJCQlpZiAoaGV2Yy0+ZXJyb3Jfc2tpcF9uYWxfY291bnQgPT0gMCkgeworCQkJCWhldmNfcmVjb3ZlcihoZXZjKTsKKwkJCQloZXZjLT5lcnJvcl9mbGFnID0gMDsKKwkJCQlpZiAoKGVycm9yX2hhbmRsZV9wb2xpY3kgJiAweDIpID09IDApIHsKKwkJCQkJaGV2Yy0+aGF2ZV92cHMgPSAxOworCQkJCQloZXZjLT5oYXZlX3NwcyA9IDE7CisJCQkJCWhldmMtPmhhdmVfcHBzID0gMTsKKwkJCQl9CisJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJfQorCQl9IGVsc2UgaWYgKG5hbHR5cGUgPT0gTkFMX1VOSVRfVlBTKSB7CisJCQkJcGFyc2VfdHlwZSA9IEhFVkNfTkFMX1VOSVRfVlBTOworCQkJCWhldmMtPmhhdmVfdnBzID0gMTsKKyNpZmRlZiBFUlJPUl9IQU5ETEVfREVCVUcKKwkJCQlpZiAoZGJnX25hbF9za2lwX2ZsYWcgJiAxKQorCQkJCQlwYXJzZV90eXBlID0gSEVWQ19ESVNDQVJEX05BTDsKKyNlbmRpZgorCQl9IGVsc2UgaWYgKGhldmMtPmhhdmVfdnBzKSB7CisJCQlpZiAobmFsdHlwZSA9PSBOQUxfVU5JVF9TUFMpIHsKKwkJCQlwYXJzZV90eXBlID0gSEVWQ19OQUxfVU5JVF9TUFM7CisJCQkJaGV2Yy0+aGF2ZV9zcHMgPSAxOworI2lmZGVmIEVSUk9SX0hBTkRMRV9ERUJVRworCQkJCWlmIChkYmdfbmFsX3NraXBfZmxhZyAmIDIpCisJCQkJCXBhcnNlX3R5cGUgPSBIRVZDX0RJU0NBUkRfTkFMOworI2VuZGlmCisJCQl9IGVsc2UgaWYgKG5hbHR5cGUgPT0gTkFMX1VOSVRfUFBTKSB7CisJCQkJcGFyc2VfdHlwZSA9IEhFVkNfTkFMX1VOSVRfUFBTOworCQkJCWhldmMtPmhhdmVfcHBzID0gMTsKKyNpZmRlZiBFUlJPUl9IQU5ETEVfREVCVUcKKwkJCQlpZiAoZGJnX25hbF9za2lwX2ZsYWcgJiA0KQorCQkJCQlwYXJzZV90eXBlID0gSEVWQ19ESVNDQVJEX05BTDsKKyNlbmRpZgorCQkJfSBlbHNlIGlmIChoZXZjLT5oYXZlX3NwcyAmJiBoZXZjLT5oYXZlX3BwcykgeworCQkJCWludCBzZWcgPSBIRVZDX05BTF9VTklUX0NPREVEX1NMSUNFX1NFR01FTlQ7CisKKwkJCQlpZiAoKG5hbHR5cGUgPT0gTkFMX1VOSVRfQ09ERURfU0xJQ0VfSURSKSB8fAorCQkJCQkobmFsdHlwZSA9PQorCQkJCQlOQUxfVU5JVF9DT0RFRF9TTElDRV9JRFJfTl9MUCkKKwkJCQkJfHwgKG5hbHR5cGUgPT0KKwkJCQkJCU5BTF9VTklUX0NPREVEX1NMSUNFX0NSQSkKKwkJCQkJfHwgKG5hbHR5cGUgPT0KKwkJCQkJCU5BTF9VTklUX0NPREVEX1NMSUNFX0JMQSkKKwkJCQkJfHwgKG5hbHR5cGUgPT0KKwkJCQkJCU5BTF9VTklUX0NPREVEX1NMSUNFX0JMQU5UKQorCQkJCQl8fCAobmFsdHlwZSA9PQorCQkJCQkJTkFMX1VOSVRfQ09ERURfU0xJQ0VfQkxBX05fTFApCisJCQkJKSB7CisJCQkJCWlmIChzbGljZV9wYXJzZV9iZWdpbiA+IDApIHsKKwkJCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJCSJkaXNjYXJkICVkLCBmb3IgZGVidWdnaW5nXG4iLAorCQkJCQkJIHNsaWNlX3BhcnNlX2JlZ2luKTsKKwkJCQkJCXNsaWNlX3BhcnNlX2JlZ2luLS07CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwYXJzZV90eXBlID0gc2VnOworCQkJCQl9CisJCQkJCWhldmMtPmhhdmVfdmFsaWRfc3RhcnRfc2xpY2UgPSAxOworCQkJCX0gZWxzZSBpZiAobmFsdHlwZSA8PQorCQkJCQkJTkFMX1VOSVRfQ09ERURfU0xJQ0VfQ1JBCisJCQkJCQkmJiAoaGV2Yy0+aGF2ZV92YWxpZF9zdGFydF9zbGljZQorCQkJCQkJfHwgKGhldmMtPlBCX3NraXBfbW9kZSAhPSAzKSkpIHsKKwkJCQkJaWYgKHNsaWNlX3BhcnNlX2JlZ2luID4gMCkgeworCQkJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkJImRpc2NhcmQgJWQsIGRkXG4iLAorCQkJCQkJc2xpY2VfcGFyc2VfYmVnaW4pOworCQkJCQkJc2xpY2VfcGFyc2VfYmVnaW4tLTsKKwkJCQkJfSBlbHNlCisJCQkJCQlwYXJzZV90eXBlID0gc2VnOworCisJCQkJfQorCQkJfQorCQl9CisJCWlmIChoZXZjLT5oYXZlX3ZwcyAmJiBoZXZjLT5oYXZlX3NwcyAmJiBoZXZjLT5oYXZlX3BwcworCQkJJiYgaGV2Yy0+aGF2ZV92YWxpZF9zdGFydF9zbGljZSAmJgorCQkJaGV2Yy0+ZXJyb3JfZmxhZyA9PSAwKSB7CisJCQlpZiAoKGdldF9kYmdfZmxhZyhoZXZjKSAmCisJCQkJSDI2NV9ERUJVR19NQU5fU0VBUkNIX05BTCkgPT0gMAorCQkJCS8qICYmICghaGV2Yy0+bV9pbnNfZmxhZykqLykgeworCQkJCS8qIGF1b3QgcGFyc2VyIE5BTDsgZG8gbm90IGNoZWNrCisJCQkJICp2cHMvc3BzL3Bwcy9pZHIKKwkJCQkgKi8KKwkJCQlXUklURV9WUkVHKE5BTF9TRUFSQ0hfQ1RMLCAweDIpOworCQkJfQorCisJCQlpZiAoKGdldF9kYmdfZmxhZyhoZXZjKSAmCisJCQkJSDI2NV9ERUJVR19OT19FT1NfU0VBUkNIX0RPTkUpCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwkJCQl8fCB2ZGVjLT5tYXN0ZXIKKwkJCQl8fCB2ZGVjLT5zbGF2ZQorI2VuZGlmCisJCQkJKSB7CisJCQkJV1JJVEVfVlJFRyhOQUxfU0VBUkNIX0NUTCwKKwkJCQkJCVJFQURfVlJFRyhOQUxfU0VBUkNIX0NUTCkgfAorCQkJCQkJMHgxMDAwMCk7CisJCQl9CisJCQlXUklURV9WUkVHKE5BTF9TRUFSQ0hfQ1RMLAorCQkJCVJFQURfVlJFRyhOQUxfU0VBUkNIX0NUTCkKKwkJCQl8ICgocGFyc2VyX3NlaV9lbmFibGUgJiAweDcpIDw8IDE3KSk7CisvKiNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTiovCisJCQlXUklURV9WUkVHKE5BTF9TRUFSQ0hfQ1RMLAorCQkJCVJFQURfVlJFRyhOQUxfU0VBUkNIX0NUTCkgfAorCQkJCSgocGFyc2VyX2RvbGJ5X3Zpc2lvbl9lbmFibGUgJiAweDEpIDw8IDIwKSk7CisvKiNlbmRpZiovCisJCQljb25maWdfZGVjb2RlX21vZGUoaGV2Yyk7CisJCX0KKworCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1IpIHsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkibmFsdHlwZSA9ICVkICBwYXJzZV90eXBlICVkXG4gJWQgJWQgJWQgJWRcbiIsCisJCQkJbmFsdHlwZSwgcGFyc2VfdHlwZSwgaGV2Yy0+aGF2ZV92cHMsCisJCQkJaGV2Yy0+aGF2ZV9zcHMsIGhldmMtPmhhdmVfcHBzLAorCQkJCWhldmMtPmhhdmVfdmFsaWRfc3RhcnRfc2xpY2UpOworCQl9CisKKwkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCBwYXJzZV90eXBlKTsKKwkJLyogSW50ZXJydXB0IEFtcmlzYyB0byBleGN1dGUgKi8KKwkJV1JJVEVfVlJFRyhIRVZDX01DUFVfSU5UUl9SRVEsIEFNUklTQ19NQUlOX1JFUSk7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQlpZiAoaGV2Yy0+bV9pbnNfZmxhZykKKwkJCXN0YXJ0X3Byb2Nlc3NfdGltZShoZXZjKTsKKyNlbmRpZgorCX0gZWxzZSBpZiAoZGVjX3N0YXR1cyA9PSBIRVZDX1NMSUNFX1NFR01FTlRfRE9ORSkgeworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwkJaWYgKGhldmMtPm1faW5zX2ZsYWcpIHsKKwkJCXJlc2V0X3Byb2Nlc3NfdGltZShoZXZjKTsKKwkJCXJlYWRfZGVjb2RlX2luZm8oaGV2Yyk7CisKKwkJfQorI2VuZGlmCisJCWlmIChoZXZjLT5zdGFydF9kZWNvZGluZ190aW1lID4gMCkgeworCQkJdTMyIHByb2Nlc3NfdGltZSA9IDEwMDAqCisJCQkJKGppZmZpZXMgLSBoZXZjLT5zdGFydF9kZWNvZGluZ190aW1lKS9IWjsKKwkJCWlmIChwcm9jZXNzX3RpbWUgPiBtYXhfZGVjb2RpbmdfdGltZSkKKwkJCQltYXhfZGVjb2RpbmdfdGltZSA9IHByb2Nlc3NfdGltZTsKKwkJfQorCisJCWhldmMtPmVycm9yX3dhdGNoZG9nX2NvdW50ID0gMDsKKwkJaWYgKGhldmMtPnBpY19saXN0X2luaXRfZmxhZyA9PSAyKSB7CisJCQloZXZjLT5waWNfbGlzdF9pbml0X2ZsYWcgPSAzOworCQkJaGV2Y19wcmludChoZXZjLCAwLCAic2V0IHBpY19saXN0X2luaXRfZmxhZyB0byAzXG4iKTsKKwkJCWlmIChoZXZjLT5rcGlfZmlyc3RfaV9jb21taW5nID09IDApIHsKKwkJCQloZXZjLT5rcGlfZmlyc3RfaV9jb21taW5nID0gMTsKKwkJCQlwcl9kZWJ1ZygiW3ZkZWNfa3BpXVslc10gRmlyc3QgSSBmcmFtZSBjb21pbmcuXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQl9CisJCX0gZWxzZSBpZiAoaGV2Yy0+d2FpdF9idWYgPT0gMCkgeworCQkJdTMyIHZ1aV90aW1lX3NjYWxlOworCQkJdTMyIHZ1aV9udW1fdW5pdHNfaW5fdGljazsKKwkJCXVuc2lnbmVkIGNoYXIgcmVjb25maWdfZmxhZyA9IDA7CisKKwkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX1NFTkRfUEFSQU1fV0lUSF9SRUcpCisJCQkJZ2V0X3JwbV9wYXJhbSgmaGV2Yy0+cGFyYW0pOworCQkJZWxzZSB7CisJCQkJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UuZGVjb2RlX2hlYWRlcl9tZW1vcnlfdGltZV9uYW1lLCBUUkFDRV9IRUFERVJfUlBNX1NUQVJUKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgKFJQTV9FTkQgLSBSUE1fQkVHSU4pOyBpICs9IDQpIHsKKwkJCQkJaW50IGlpOworCisJCQkJCWZvciAoaWkgPSAwOyBpaSA8IDQ7IGlpKyspIHsKKwkJCQkJCWhldmMtPnBhcmFtLmwuZGF0YVtpICsgaWldID0KKwkJCQkJCQloZXZjLT5ycG1fcHRyW2kgKyAzCisJCQkJCQkJLSBpaV07CisJCQkJCX0KKwkJCQl9CisJCQkJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UuZGVjb2RlX2hlYWRlcl9tZW1vcnlfdGltZV9uYW1lLCBUUkFDRV9IRUFERVJfUlBNX0VORCk7CisjaWZkZWYgU0VORF9MTUVNX1dJVEhfUlBNCisJCQkJY2hlY2tfaGVhZF9lcnJvcihoZXZjKTsKKyNlbmRpZgorCQkJfQorCisKKwkJCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0JVRk1HUl9NT1JFKSB7CisJCQkJUFJfSU5JVCgxMjgpOworCisJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkicnBtX3BhcmFtOiAoJWQpXG4iLCBoZXZjLT5zbGljZV9pZHgpOworCQkJCWhldmMtPnNsaWNlX2lkeCsrOworCisJCQkJZm9yIChpID0gMDsgaSA8IChSUE1fRU5EIC0gUlBNX0JFR0lOKTsgaSsrKSB7CisJCQkJCVBSX0ZJTEwoIiUwNHggIiwgaGV2Yy0+cGFyYW0ubC5kYXRhW2ldKTsKKwkJCQkJaWYgKCgoaSArIDEpICYgMHhmKSA9PSAwKQorCQkJCQkJUFJfSU5GTyhoZXZjLT5pbmRleCk7CisJCQkJfQorCQkJCVBSX0lORk8oaGV2Yy0+aW5kZXgpOworCisJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkidnVpX3RpbWluZ19pbmZvOiAleCwgJXgsICV4LCAleFxuIiwKKwkJCQkJaGV2Yy0+cGFyYW0ucC52dWlfbnVtX3VuaXRzX2luX3RpY2tfaGksCisJCQkJCWhldmMtPnBhcmFtLnAudnVpX251bV91bml0c19pbl90aWNrX2xvLAorCQkJCQloZXZjLT5wYXJhbS5wLnZ1aV90aW1lX3NjYWxlX2hpLAorCQkJCQloZXZjLT5wYXJhbS5wLnZ1aV90aW1lX3NjYWxlX2xvKTsKKwkJCX0KKworCQkJaWYgKGF1eF9kYXRhX2lzX2F2YWlibGUoaGV2YykpIHsKKwkJCQlzdGF0aWMgc3RydWN0IFBJQ19zIHBpYzsKKwkJCQl1MzIgc2l6ZSA9IDAsIHR5cGUgPSAwOworCQkJCWNoYXIgKnA7CisKKwkJCQltZW1zZXQoJnBpYywgMCwgc2l6ZW9mKHBpYykpOworCisJCQkJcGljLmF1eF9kYXRhX2J1ZiA9IHZ6YWxsb2MoaGV2Yy0+cHJlZml4X2F1eF9zaXplKTsKKworCQkJCXNldF9hdXhfZGF0YShoZXZjLCAmcGljLCAwLCAwKTsKKworCQkJCWlmIChwaWMuYXV4X2RhdGFfYnVmCisJCQkJCSYmIHBpYy5hdXhfZGF0YV9zaXplKSB7CisJCQkJCWhldmMtPmZyYW1lX2ZpZWxkX2luZm9fcHJlc2VudF9mbGFnID0KKwkJCQkJCShoZXZjLT5wYXJhbS5wLnNlaV9mcmFtZV9maWVsZF9pbmZvID4+IDgpICYgMHgxOworCisJCQkJCS8qIHBhcnNlciBzZWkgKi8KKwkJCQkJcCA9IHBpYy5hdXhfZGF0YV9idWY7CisJCQkJCXdoaWxlIChwIDwgcGljLmF1eF9kYXRhX2J1ZgorCQkJCQkJKyBwaWMuYXV4X2RhdGFfc2l6ZSAtIDgpIHsKKwkJCQkJCXNpemUgPSAqcCsrOworCQkJCQkJc2l6ZSA9IChzaXplIDw8IDgpIHwgKnArKzsKKwkJCQkJCXNpemUgPSAoc2l6ZSA8PCA4KSB8ICpwKys7CisJCQkJCQlzaXplID0gKHNpemUgPDwgOCkgfCAqcCsrOworCQkJCQkJdHlwZSA9ICpwKys7CisJCQkJCQl0eXBlID0gKHR5cGUgPDwgOCkgfCAqcCsrOworCQkJCQkJdHlwZSA9ICh0eXBlIDw8IDgpIHwgKnArKzsKKwkJCQkJCXR5cGUgPSAodHlwZSA8PCA4KSB8ICpwKys7CisJCQkJCQlpZiAodHlwZSA9PSAweDAyMDAwMDAwKSB7CisJCQkJCQkJLyogaGV2Y19wcmludChoZXZjLCAwLCAic2VpKCVkKVxuIiwgc2l6ZSk7Ki8KKwkJCQkJCQlwYXJzZV9zZWkoaGV2YywgJnBpYywgcCwgc2l6ZSk7CisJCQkJCQl9CisJCQkJCQlwICs9IHNpemU7CisJCQkJCX0KKworCQkJCQloZXZjLT5wYXJhbS5wLnNlaV9mcmFtZV9maWVsZF9pbmZvICY9CisJCQkJCQl+KDB4ZiA8PCAzKTsKKwkJCQkJaGV2Yy0+cGFyYW0ucC5zZWlfZnJhbWVfZmllbGRfaW5mbyB8PQorCQkJCQkJKHBpYy5waWNfc3RydWN0IDw8IDMpOworCQkJCX0KKworCQkJCWlmIChwaWMuaGRyMTBwX2RhdGFfYnVmKQorCQkJCQl2ZnJlZShwaWMuaGRyMTBwX2RhdGFfYnVmKTsKKwkJCQlpZiAocGljLmF1eF9kYXRhX2J1ZikKKwkJCQkJdmZyZWUocGljLmF1eF9kYXRhX2J1Zik7CisJCQl9CisKKwkJCWlmIChoZXZjLT5pc191c2VkX3Y0bCkgeworCQkJCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJCQkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShoZXZjLT52NGwyX2N0eCk7CisJCQkJaWYgKCF2NGxfcmVzX2NoYW5nZShoZXZjLCAmaGV2Yy0+cGFyYW0pKSB7CisJCQkJCWlmIChjdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSAmJiAhaGV2Yy0+djRsX3BhcmFtc19wYXJzZWQpIHsKKwkJCQkJCXN0cnVjdCBhbWxfdmRlY19wc19pbmZvcyBwczsKKwkJCQkJCXN0cnVjdCBhbWxfdmRlY19jZmdfaW5mb3MgY2ZnOworCQkJCQkJaW50IGxvZyA9IGhldmMtPnBhcmFtLnAubG9nMl9taW5fY29kaW5nX2Jsb2NrX3NpemVfbWludXMzOworCQkJCQkJaW50IGxvZ19zID0gaGV2Yy0+cGFyYW0ucC5sb2cyX2RpZmZfbWF4X21pbl9jb2RpbmdfYmxvY2tfc2l6ZTsKKworCQkJCQkJaGV2Yy0+cGljX3cgPSBoZXZjLT5wYXJhbS5wLnBpY193aWR0aF9pbl9sdW1hX3NhbXBsZXM7CisJCQkJCQloZXZjLT5waWNfaCA9IGhldmMtPnBhcmFtLnAucGljX2hlaWdodF9pbl9sdW1hX3NhbXBsZXM7CisJCQkJCQloZXZjLT5sY3Vfc2l6ZSA9IDEgPDwgKGxvZyArIDMgKyBsb2dfcyk7CisKKwkJCQkJCXByX2RlYnVnKCJzZXQgdWNvZGUgcGFyc2VcbiIpOworCQkJCQkJaGV2Y19pbnRlcmxhY2VfY2hlY2soaGV2YywgJmhldmMtPnBhcmFtKTsKKwkJCQkJCWlmIChoZXZjLT5pbnRlcmxhY2VfZmxhZykgeworCQkJCQkJCXZoMjY1X2dldF9jZmdfaW5mbyhoZXZjLCAmaGV2Yy0+cGFyYW0sICZjZmcpOworCQkJCQkJCXZkZWNfdjRsX3NldF9jZmdfaW5mb3MoY3R4LCAmY2ZnKTsKKwkJCQkJCX0KKwkJCQkJCWlmIChnZXRfdmFsaWRfZG91YmxlX3dyaXRlX21vZGUoaGV2YykgIT0gMTYpIHsKKwkJCQkJCQlzdHJ1Y3QgdmRlY19jb21wX2J1Zl9pbmZvIGluZm87CisKKwkJCQkJCQlnZXRfY29tcF9idWZfaW5mbyhoZXZjLCAmaW5mbyk7CisJCQkJCQkJdmRlY192NGxfc2V0X2NvbXBfYnVmX2luZm8oY3R4LCAmaW5mbyk7CisJCQkJCQl9CisJCQkJCQl2aDI2NV9nZXRfcHNfaW5mbyhoZXZjLCAmaGV2Yy0+cGFyYW0sICZwcyk7CisJCQkJCQkvKm5vdGljZSB0aGUgdjRsMiBjb2RlYy4qLworCQkJCQkJdmRlY192NGxfc2V0X3BzX2luZm9zKGN0eCwgJnBzKTsKKwkJCQkJCWhldmMtPnY0bF9wYXJhbXNfcGFyc2VkID0gdHJ1ZTsKKwkJCQkJCWhldmMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0FHQUlOOworCQkJCQkJYW1oZXZjX3N0b3AoKTsKKwkJCQkJCXJlc3RvcmVfZGVjb2RlX3N0YXRlKGhldmMpOworCQkJCQkJcmVzZXRfcHJvY2Vzc190aW1lKGhldmMpOworCQkJCQkJdmRlY19zY2hlZHVsZV93b3JrKCZoZXZjLT53b3JrKTsKKwkJCQkJCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX1RIUkVBRF9IRUFEX0VORCk7CisJCQkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlzdHJ1Y3QgdmRlY19waWNfaW5mbyBwaWM7CisKKwkJCQkJCXZkZWNfdjRsX2dldF9waWNfaW5mbyhjdHgsICZwaWMpOworCQkJCQkJaGV2Yy0+dXNlZF9idWZfbnVtID0gcGljLmRwYl9mcmFtZXMgKworCQkJCQkJCXBpYy5kcGJfbWFyZ2luOworCQkJCQkJaWYgKGhldmMtPnVzZWRfYnVmX251bSA+IE1BWF9CVUZfTlVNKQorCQkJCQkJCWhldmMtPnVzZWRfYnVmX251bSA9IE1BWF9CVUZfTlVNOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJfZGVidWcoInJlc29sdXRpb24gY2hhbmdlXG4iKTsKKwkJCQkJaGV2Yy0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfQUdBSU47CisJCQkJCWFtaGV2Y19zdG9wKCk7CisJCQkJCXJlc3RvcmVfZGVjb2RlX3N0YXRlKGhldmMpOworCQkJCQlyZXNldF9wcm9jZXNzX3RpbWUoaGV2Yyk7CisJCQkJCXZkZWNfc2NoZWR1bGVfd29yaygmaGV2Yy0+d29yayk7CisJCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCQl9CisJCQl9CisKKwkJCWlmICgKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCQkJCXZkZWMtPm1hc3RlciA9PSBOVUxMICYmCisJCQkJdmRlYy0+c2xhdmUgPT0gTlVMTCAmJgorI2VuZGlmCisJCQkJYXV4X2RhdGFfaXNfYXZhaWJsZShoZXZjKQorCQkJCSkgeworCisJCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmCisJCQkJCUgyNjVfREVCVUdfUFJJTlRfU0VJKQorCQkJCQlkdW1wX2F1eF9idWYoaGV2Yyk7CisJCQl9CisKKwkJCXZ1aV90aW1lX3NjYWxlID0KKwkJCQkodTMyKShoZXZjLT5wYXJhbS5wLnZ1aV90aW1lX3NjYWxlX2hpIDw8IDE2KSB8CisJCQkJaGV2Yy0+cGFyYW0ucC52dWlfdGltZV9zY2FsZV9sbzsKKwkJCXZ1aV9udW1fdW5pdHNfaW5fdGljayA9CisJCQkJKHUzMikoaGV2Yy0+cGFyYW0uCisJCQkJcC52dWlfbnVtX3VuaXRzX2luX3RpY2tfaGkgPDwgMTYpIHwKKwkJCQloZXZjLT5wYXJhbS4KKwkJCQlwLnZ1aV9udW1fdW5pdHNfaW5fdGlja19sbzsKKwkJCWlmIChoZXZjLT5iaXRfZGVwdGhfbHVtYSAhPQorCQkJCSgoaGV2Yy0+cGFyYW0ucC5iaXRfZGVwdGggJiAweGYpICsgOCkpIHsKKwkJCQlyZWNvbmZpZ19mbGFnID0gMTsKKwkJCQloZXZjX3ByaW50KGhldmMsIDAsICJCaXQgZGVwdGggbHVtYSA9ICVkXG4iLAorCQkJCQkoaGV2Yy0+cGFyYW0ucC5iaXRfZGVwdGggJiAweGYpICsgOCk7CisJCQl9CisJCQlpZiAoaGV2Yy0+Yml0X2RlcHRoX2Nocm9tYSAhPQorCQkJCSgoKGhldmMtPnBhcmFtLnAuYml0X2RlcHRoID4+IDQpICYgMHhmKSArIDgpKSB7CisJCQkJcmVjb25maWdfZmxhZyA9IDE7CisJCQkJaGV2Y19wcmludChoZXZjLCAwLCAiQml0IGRlcHRoIGNocm9tYSA9ICVkXG4iLAorCQkJCQkoKGhldmMtPnBhcmFtLnAuYml0X2RlcHRoID4+IDQpICYKKwkJCQkJMHhmKSArIDgpOworCQkJfQorCQkJaGV2Yy0+Yml0X2RlcHRoX2x1bWEgPQorCQkJCShoZXZjLT5wYXJhbS5wLmJpdF9kZXB0aCAmIDB4ZikgKyA4OworCQkJaGV2Yy0+Yml0X2RlcHRoX2Nocm9tYSA9CisJCQkJKChoZXZjLT5wYXJhbS5wLmJpdF9kZXB0aCA+PiA0KSAmIDB4ZikgKyA4OworCQkJYml0X2RlcHRoX2x1bWEgPSBoZXZjLT5iaXRfZGVwdGhfbHVtYTsKKwkJCWJpdF9kZXB0aF9jaHJvbWEgPSBoZXZjLT5iaXRfZGVwdGhfY2hyb21hOworI2lmZGVmIFNVUFBPUlRfMTBCSVQKKwkJCWlmIChoZXZjLT5iaXRfZGVwdGhfbHVtYSA9PSA4ICYmCisJCQkJaGV2Yy0+Yml0X2RlcHRoX2Nocm9tYSA9PSA4ICYmCisJCQkJZW5hYmxlX21lbV9zYXZpbmcpCisJCQkJaGV2Yy0+bWVtX3NhdmluZ19tb2RlID0gMTsKKwkJCWVsc2UKKwkJCQloZXZjLT5tZW1fc2F2aW5nX21vZGUgPSAwOworI2VuZGlmCisJCQlpZiAocmVjb25maWdfZmxhZyAmJgorCQkJCShnZXRfZG91YmxlX3dyaXRlX21vZGUoaGV2YykgJiAweDEwKSA9PSAwKQorCQkJCWluaXRfZGVjb2RlX2hlYWRfaHcoaGV2Yyk7CisKKwkJCWlmICgodnVpX3RpbWVfc2NhbGUgIT0gMCkKKwkJCQkmJiAodnVpX251bV91bml0c19pbl90aWNrICE9IDApKSB7CisJCQkJaGV2Yy0+ZnJhbWVfZHVyID0KKwkJCQkJZGl2X3U2NCg5NjAwMFVMTCAqCisJCQkJCQl2dWlfbnVtX3VuaXRzX2luX3RpY2ssCisJCQkJCQl2dWlfdGltZV9zY2FsZSk7CisJCQkJCWlmIChoZXZjLT5nZXRfZnJhbWVfZHVyICE9IHRydWUpCisJCQkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoCisJCQkJCQkmaGV2Yy0+bm90aWZ5X3dvcmspOworCisJCQkJaGV2Yy0+Z2V0X2ZyYW1lX2R1ciA9IHRydWU7CisJCQkJLy9oZXZjLT5ndnMtPmZyYW1lX2R1ciA9IGhldmMtPmZyYW1lX2R1cjsKKwkJCX0KKworCQkJaWYgKGhldmMtPnZpZGVvX3NpZ25hbF90eXBlICE9CisJCQkJKChoZXZjLT5wYXJhbS5wLnZpZGVvX3NpZ25hbF90eXBlIDw8IDE2KQorCQkJCXwgaGV2Yy0+cGFyYW0ucC5jb2xvcl9kZXNjcmlwdGlvbikpIHsKKwkJCQl1MzIgdiA9IGhldmMtPnBhcmFtLnAudmlkZW9fc2lnbmFsX3R5cGU7CisJCQkJdTMyIGMgPSBoZXZjLT5wYXJhbS5wLmNvbG9yX2Rlc2NyaXB0aW9uOworI2lmIDAKKwkJCWlmICh2ICYgMHgyMDAwKSB7CisJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSJ2aWRlb19zaWduYWxfdHlwZSBwcmVzZW50OlxuIik7CisJCQkJaGV2Y19wcmludChoZXZjLCAwLCAiICVzICVzXG4iLAorCQkJCXZpZGVvX2Zvcm1hdF9uYW1lc1sodiA+PiAxMCkgJiA3XSwKKwkJCQkJKCh2ID4+IDkpICYgMSkgPworCQkJCQkiZnVsbF9yYW5nZSIgOiAibGltaXRlZCIpOworCQkJCWlmICh2ICYgMHgxMDApIHsKKwkJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkiIGNvbG9yX2Rlc2NyaXB0aW9uIHByZXNlbnQ6XG4iKTsKKwkJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkiICBjb2xvcl9wcmltYXJpZSA9ICVzXG4iLAorCQkJCQljb2xvcl9wcmltYXJpZXNfbmFtZXMKKwkJCQkJW3YgJiAweGZmXSk7CisJCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJIiAgdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWMgPSAlc1xuIiwKKwkJCQkJdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzX25hbWVzCisJCQkJCVsoYyA+PiA4KSAmIDB4ZmZdKTsKKwkJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkiICBtYXRyaXhfY29lZmZpY2llbnQgPSAlc1xuIiwKKwkJCQkJbWF0cml4X2NvZWZmc19uYW1lc1tjICYgMHhmZl0pOworCQkJCX0KKwkJCX0KKyNlbmRpZgorCQloZXZjLT52aWRlb19zaWduYWxfdHlwZSA9ICh2IDw8IDE2KSB8IGM7CisJCXZpZGVvX3NpZ25hbF90eXBlID0gaGV2Yy0+dmlkZW9fc2lnbmFsX3R5cGU7CisJfQorCisJaWYgKHVzZV9jbWEgJiYKKwkJKGhldmMtPnBhcmFtLnAuc2xpY2Vfc2VnbWVudF9hZGRyZXNzID09IDApCisJCSYmIChoZXZjLT5waWNfbGlzdF9pbml0X2ZsYWcgPT0gMCkpIHsKKwkJaW50IGxvZyA9IGhldmMtPnBhcmFtLnAubG9nMl9taW5fY29kaW5nX2Jsb2NrX3NpemVfbWludXMzOworCQlpbnQgbG9nX3MgPSBoZXZjLT5wYXJhbS5wLmxvZzJfZGlmZl9tYXhfbWluX2NvZGluZ19ibG9ja19zaXplOworCisJCWhldmMtPnBpY193ID0gaGV2Yy0+cGFyYW0ucC5waWNfd2lkdGhfaW5fbHVtYV9zYW1wbGVzOworCQloZXZjLT5waWNfaCA9IGhldmMtPnBhcmFtLnAucGljX2hlaWdodF9pbl9sdW1hX3NhbXBsZXM7CisJCWhldmMtPmxjdV9zaXplID0gMSA8PCAobG9nICsgMyArIGxvZ19zKTsKKwkJaGV2Yy0+bGN1X3NpemVfbG9nMiA9IGxvZzJpKGhldmMtPmxjdV9zaXplKTsKKwkJaWYgKHBlcmZvcm1hbmNlX3Byb2ZpbGUgJiYoICghaXNfb3ZlcnNpemUoaGV2Yy0+cGljX3csIGhldmMtPnBpY19oKSkgJiYgSVNfOEtfU0laRShoZXZjLT5waWNfdyxoZXZjLT5waWNfaCkpKQorCQkJaGV2Yy0+cGVyZm9ybWFuY2VfcHJvZmlsZSA9IDE7CisJCWVsc2UKKwkJCWhldmMtPnBlcmZvcm1hbmNlX3Byb2ZpbGUgPSAwOworCQloZXZjX3ByaW50KGhldmMsIDAsICJoZXZjLT5wZXJmb3JtYW5jZV9wcm9maWxlICVkXG4iLCBoZXZjLT5wZXJmb3JtYW5jZV9wcm9maWxlKTsKKwkJaWYgKGhldmMtPnBpY193ID09IDAgfHwgaGV2Yy0+cGljX2ggPT0gMAorCQkJCQkJfHwgaGV2Yy0+bGN1X3NpemUgPT0gMAorCQkJCQkJfHwgaXNfb3ZlcnNpemUoaGV2Yy0+cGljX3csIGhldmMtPnBpY19oKQorCQkJCQkJfHwgIGhldmNfc2tpcF9uYWwoaGV2YykpIHsKKwkJCS8qIHNraXAgc2VhcmNoIG5leHQgc3RhcnQgY29kZSAqLworCQkJV1JJVEVfVlJFRyhIRVZDX1dBSVRfRkxBRywgUkVBRF9WUkVHKEhFVkNfV0FJVF9GTEFHKQorCQkJCQkJJiAofjB4MikpOworCQkJaWYgICgoaGV2Yy0+cGljX2ggPT0gOTYpICYmIChoZXZjLT5waWNfdyAgPT0gMTYwKSkKKwkJCQloZXZjLT5za2lwX25hbF9jb3VudCsrOworCQkJaGV2Yy0+c2tpcF9mbGFnID0gMTsKKwkJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywJSEVWQ19BQ1RJT05fRE9ORSk7CisJCQkvKiBJbnRlcnJ1cHQgQW1yaXNjIHRvIGV4Y3V0ZSAqLworCQkJV1JJVEVfVlJFRyhIRVZDX01DUFVfSU5UUl9SRVEsCUFNUklTQ19NQUlOX1JFUSk7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQkJaWYgKGhldmMtPm1faW5zX2ZsYWcpCisJCQkJc3RhcnRfcHJvY2Vzc190aW1lKGhldmMpOworI2VuZGlmCisJCX0gZWxzZSB7CisJCQloZXZjLT5zcHNfbnVtX3Jlb3JkZXJfcGljc18wID0KKwkJCWhldmMtPnBhcmFtLnAuc3BzX251bV9yZW9yZGVyX3BpY3NfMDsKKwkJCWhldmMtPmlwX21vZGUgPSBoZXZjLT5sb3dfbGF0ZW5jeV9mbGFnID8gdHJ1ZSA6CisJCQkJCSghaGV2Yy0+c3BzX251bV9yZW9yZGVyX3BpY3NfMCAmJgorCQkJCQkhKHZkZWMtPnNsYXZlIHx8IHZkZWMtPm1hc3RlcikgJiYKKwkJCQkJIWRpc2FibGVfaXBfbW9kZSkgPyB0cnVlIDogZmFsc2U7CisJCQloZXZjLT5waWNfbGlzdF9pbml0X2ZsYWcgPSAxOworCQkJI2lmIDAKKwkJCWlmICgoIUlTXzRLX1NJWkUoaGV2Yy0+cGljX3csIGhldmMtPnBpY19oKSkgJiYKKwkJCQkoKGhldmMtPnBhcmFtLnAucHJvZmlsZV9ldGMgJiAweGMpID09IDB4NCkKKwkJCQkmJiAoaW50ZXJsYWNlX2VuYWJsZSAhPSAwKSkgeworCQkJCWhldmMtPmRvdWJsZV93cml0ZV9tb2RlID0gMTsKKwkJCQloZXZjLT5pbnRlcmxhY2VfZmxhZyA9IDE7CisJCQkJaGV2Yy0+ZnJhbWVfYXIgPSAoaGV2Yy0+cGljX2ggKiAweDEwMCAvIGhldmMtPnBpY193KSAqIDI7CisJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkiaW50ZXJsYWNlICglZCwgJWQpLCBwcm9maWxlX2V0YyAleCwgYXIgMHgleCwgZHcgJWRcbiIsCisJCQkJCWhldmMtPnBpY193LCBoZXZjLT5waWNfaCwgaGV2Yy0+cGFyYW0ucC5wcm9maWxlX2V0YywgaGV2Yy0+ZnJhbWVfYXIsCisJCQkJCWdldF9kb3VibGVfd3JpdGVfbW9kZShoZXZjKSk7CisJCQkJLyogV2hlbiBkdyBjaGFuZ2VkIGZyb20gMHgxMCB0byAxLCB0aGUgbW11X2JveCBpcyBOVUxMICovCisJCQkJaWYgKCFoZXZjLT5tbXVfYm94ICYmIGluaXRfbW11X2J1ZmZlcnMoaGV2YywgMCkgIT0gMCkgeworCQkJCQloZXZjLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9GT1JDRV9FWElUOworCQkJCQloZXZjLT5mYXRhbF9lcnJvciB8PQorCQkJCQkJREVDT0RFUl9GQVRBTF9FUlJPUl9OT19NRU07CisJCQkJCXZkZWNfc2NoZWR1bGVfd29yaygmaGV2Yy0+d29yayk7CisJCQkJCWhldmNfcHJpbnQoaGV2YywKKwkJCQkJCTAsICJjYW4gbm90IGFsbG9jIG1tdSBib3gsIGZvcmNlIGV4aXRcbiIpOworCQkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQkJfQorCQkJfQorCQkJI2VuZGlmCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQkJaWYgKGhldmMtPm1faW5zX2ZsYWcpIHsKKwkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmhldmMtPndvcmspOworCQkJfSBlbHNlCisjZW5kaWYKKwkJCQl1cCgmaDI2NV9zZW1hKTsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwgInNldCBwaWNfbGlzdF9pbml0X2ZsYWcgMVxuIik7CisJCX0KKwkJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9JU1JfVEhSRUFEX0hFQURfRU5EKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworfQorCXJldCA9CisJCWhldmNfc2xpY2Vfc2VnbWVudF9oZWFkZXJfcHJvY2VzcyhoZXZjLAorCQkJJmhldmMtPnBhcmFtLCBkZWNvZGVfcGljX2JlZ2luKTsKKwlpZiAocmV0IDwgMCkgeworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwkJaWYgKGhldmMtPm1faW5zX2ZsYWcpIHsKKwkJCWhldmMtPndhaXRfYnVmID0gMDsKKwkJCWhldmMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0FHQUlOOworCQkJYW1oZXZjX3N0b3AoKTsKKwkJCXJlc3RvcmVfZGVjb2RlX3N0YXRlKGhldmMpOworCQkJcmVzZXRfcHJvY2Vzc190aW1lKGhldmMpOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZoZXZjLT53b3JrKTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorI2Vsc2UKKwkJOworI2VuZGlmCisJfSBlbHNlIGlmIChyZXQgPT0gMCkgeworCQlpZiAoKGhldmMtPm5ld19waWMpICYmIChoZXZjLT5jdXJfcGljKSkgeworCQkJaGV2Yy0+Y3VyX3BpYy0+c3RyZWFtX29mZnNldCA9CisJCQlSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKTsKKwkJCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19PVVRfUFRTLAorCQkJCSJyZWFkIHN0cmVhbV9vZmZzZXQgPSAweCV4XG4iLAorCQkJCWhldmMtPmN1cl9waWMtPnN0cmVhbV9vZmZzZXQpOworCQkJaGV2Yy0+Y3VyX3BpYy0+YXNwZWN0X3JhdGlvX2lkYyA9CisJCQkJaGV2Yy0+cGFyYW0ucC5hc3BlY3RfcmF0aW9faWRjOworCQkJaGV2Yy0+Y3VyX3BpYy0+c2FyX3dpZHRoID0KKwkJCQloZXZjLT5wYXJhbS5wLnNhcl93aWR0aDsKKwkJCWhldmMtPmN1cl9waWMtPnNhcl9oZWlnaHQgPQorCQkJCWhldmMtPnBhcmFtLnAuc2FyX2hlaWdodDsKKwkJfQorCisJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywKKwkJCUhFVkNfQ09ERURfU0xJQ0VfU0VHTUVOVF9EQVQpOworCQkvKiBJbnRlcnJ1cHQgQW1yaXNjIHRvIGV4Y3V0ZSAqLworCQlXUklURV9WUkVHKEhFVkNfTUNQVV9JTlRSX1JFUSwgQU1SSVNDX01BSU5fUkVRKTsKKworCQloZXZjLT5zdGFydF9kZWNvZGluZ190aW1lID0gamlmZmllczsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCWlmIChoZXZjLT5tX2luc19mbGFnKQorCQkJc3RhcnRfcHJvY2Vzc190aW1lKGhldmMpOworI2VuZGlmCisjaWYgMQorCQkvKnRvIGRvLi4uLCBjb3B5IGF1eCBkYXRhIHRvIGhldmMtPmN1cl9waWMqLworI2VuZGlmCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCX0gZWxzZSBpZiAoaGV2Yy0+bV9pbnNfZmxhZykgeworCQloZXZjX3ByaW50KGhldmMsIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkiJXMsIGJ1Zm1nciByZXQgJWQgc2tpcCwgREVDX1JFU1VMVF9ET05FXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCWhldmMtPmRlY29kZWRfcG9jID0gSU5WQUxJRF9QT0M7CisJCWhldmMtPmRlY29kaW5nX3BpYyA9IE5VTEw7CisJCWhldmMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJCWFtaGV2Y19zdG9wKCk7CisJCXJlc2V0X3Byb2Nlc3NfdGltZShoZXZjKTsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZoZXZjLT53b3JrKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCS8qIHNraXAsIHNlYXJjaCBuZXh0IHN0YXJ0IGNvZGUgKi8KKwkJaGV2Yy0+Z3ZzLT5kcm9wX2ZyYW1lX2NvdW50Kys7CisJCWlmIChoZXZjLT5jdXJfcGljLT5zbGljZV90eXBlID09IElfU0xJQ0UpIHsKKwkJCWhldmMtPmd2cy0+aV9sb3N0X2ZyYW1lcysrOworCQl9IGVsc2UgaWYgKGhldmMtPmN1cl9waWMtPnNsaWNlX3R5cGUgPT0gUF9TTElDRSkgeworCQkJaGV2Yy0+Z3ZzLT5pX2xvc3RfZnJhbWVzKys7CisJCX0gZWxzZSBpZiAoaGV2Yy0+Y3VyX3BpYy0+c2xpY2VfdHlwZSA9PSBCX1NMSUNFKSB7CisJCQloZXZjLT5ndnMtPmlfbG9zdF9mcmFtZXMrKzsKKwkJfQorCQlXUklURV9WUkVHKEhFVkNfV0FJVF9GTEFHLCBSRUFEX1ZSRUcoSEVWQ19XQUlUX0ZMQUcpICYgKH4weDIpKTsKKwkJCWhldmMtPnNraXBfZmxhZyA9IDE7CisJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywJSEVWQ19BQ1RJT05fRE9ORSk7CisJCS8qIEludGVycnVwdCBBbXJpc2MgdG8gZXhjdXRlICovCisJCVdSSVRFX1ZSRUcoSEVWQ19NQ1BVX0lOVFJfUkVRLCBBTVJJU0NfTUFJTl9SRVEpOworCX0KKworCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX1RIUkVBRF9IRUFEX0VORCk7CisKKwl9IGVsc2UgaWYgKGRlY19zdGF0dXMgPT0gSEVWQ19ERUNPREVfT1ZFUl9TSVpFKSB7CisJCWhldmNfcHJpbnQoaGV2YywgMCAsICJoZXZjICBkZWNvZGUgb3ZlcnNpemUgISFcbiIpOworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwkJaWYgKCFoZXZjLT5tX2luc19mbGFnKQorCQkJZGVidWcgfD0gKEgyNjVfREVCVUdfRElTX0xPQ19FUlJPUl9QUk9DIHwKKwkJCQlIMjY1X0RFQlVHX0RJU19TWVNfRVJST1JfUFJPQyk7CisjZW5kaWYKKwkJaGV2Yy0+ZmF0YWxfZXJyb3IgfD0gREVDT0RFUl9GQVRBTF9FUlJPUl9TSVpFX09WRVJGTE9XOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHdhaXRfaGV2Y19zZWFyY2hfZG9uZShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWludCBjb3VudCA9IDA7CisJV1JJVEVfVlJFRyhIRVZDX1NISUZUX1NUQVRVUywgMCk7CisJd2hpbGUgKFJFQURfVlJFRyhIRVZDX1NUUkVBTV9DT05UUk9MKSAmIDB4MikgeworCQltc2xlZXAoMjApOworCQljb3VudCsrOworCQlpZiAoY291bnQgPiAxMDApIHsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwgIiVzIHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorc3RhdGljIGlycXJldHVybl90IHZoMjY1X2lzcihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCWludCBpLCB0ZW1wOworCXVuc2lnbmVkIGludCBkZWNfc3RhdHVzOworCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPSAoc3RydWN0IGhldmNfc3RhdGVfcyAqKWRhdGE7CisJdTMyIGRlYnVnX3RhZzsKKwlkZWNfc3RhdHVzID0gUkVBRF9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcpOworCisJaWYgKGRlY19zdGF0dXMgPT0gSEVWQ19TTElDRV9TRUdNRU5UX0RPTkUpIHsKKwkJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9JU1JfSEVBRF9ET05FKTsKKwl9CisJZWxzZSBpZiAoZGVjX3N0YXR1cyA9PSBIRVZDX0RFQ1BJQ19EQVRBX0RPTkUpIHsKKwkJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9JU1JfUElDX0RPTkUpOworCX0KKworCWlmIChoZXZjLT5pbml0X2ZsYWcgPT0gMCkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJQVRSQUNFX0NPVU5URVIoIlZfU1RfREVDLWRlY29kZV9zdGF0ZSIsIGRlY19zdGF0dXMpOworCisJaGV2Yy0+ZGVjX3N0YXR1cyA9IGRlY19zdGF0dXM7CisJaWYgKGlzX2xvZ19lbmFibGUoaGV2YykpCisJCWFkZF9sb2coaGV2YywKKwkJCSJpc3I6IHN0YXR1cyA9IDB4JXggZGVjIGluZm8gMHgleCBsY3UgMHgleCBzaGlmdGJ5dGUgMHgleCBzaGlmdHN0YXR1cyAweCV4IiwKKwkJCWRlY19zdGF0dXMsIFJFQURfSFJFRyhIRVZDX0RFQ09ERV9JTkZPKSwKKwkJCVJFQURfVlJFRyhIRVZDX01QUkVEX0NVUlJfTENVKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpLAorCQkJUkVBRF9WUkVHKEhFVkNfU0hJRlRfU1RBVFVTKSk7CisKKwlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19CVUZNR1IpCisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSIyNjUgaXNyIGRlYyBzdGF0dXMgPSAweCV4IGRlYyBpbmZvIDB4JXggc2hpZnRieXRlIDB4JXggc2hpZnRzdGF0dXMgMHgleFxuIiwKKwkJCWRlY19zdGF0dXMsIFJFQURfSFJFRyhIRVZDX0RFQ09ERV9JTkZPKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpLAorCQkJUkVBRF9WUkVHKEhFVkNfU0hJRlRfU1RBVFVTKSk7CisKKwlkZWJ1Z190YWcgPSBSRUFEX0hSRUcoREVCVUdfUkVHMSk7CisJaWYgKGRlYnVnX3RhZyAmIDB4MTAwMDApIHsKKwkJUFJfSU5JVCgxMjgpOworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiTE1FTTx0YWcgJXg+OlxuIiwgUkVBRF9IUkVHKERFQlVHX1JFRzEpKTsKKworCQlpZiAoaGV2Yy0+bW11X2VuYWJsZSkKKwkJCXRlbXAgPSAweDUwMDsKKwkJZWxzZQorCQkJdGVtcCA9IDB4NDAwOworCQlmb3IgKGkgPSAwOyBpIDwgdGVtcDsgaSArPSA0KSB7CisJCQlpbnQgaWk7CisJCQlpZiAoKGkgJiAweGYpID09IDApCisJCQkJUFJfRklMTCgiJTAzeDogIiwgaSk7CisJCQlmb3IgKGlpID0gMDsgaWkgPCA0OyBpaSsrKSB7CisJCQkJUFJfRklMTCgiJTA0eCAiLAorCQkJCQkgICBoZXZjLT5sbWVtX3B0cltpICsgMyAtIGlpXSk7CisJCQl9CisJCQlpZiAoKChpICsgaWkpICYgMHhmKSA9PSAwKQorCQkJCVBSX0lORk8oaGV2Yy0+aW5kZXgpOworCQl9CisKKwkJUFJfSU5GTyhoZXZjLT5pbmRleCk7CisKKwkJaWYgKCgodWRlYnVnX3BhdXNlX3BvcyAmIDB4ZmZmZikKKwkJCT09IChkZWJ1Z190YWcgJiAweGZmZmYpKSAmJgorCQkJKHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4ID09IDAgfHwKKwkJCXVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4ID09IGhldmMtPmRlY29kZV9pZHgpICYmCisJCQkodWRlYnVnX3BhdXNlX3ZhbCA9PSAwIHx8CisJCQl1ZGVidWdfcGF1c2VfdmFsID09IFJFQURfSFJFRyhERUJVR19SRUcyKSkpIHsKKwkJCXVkZWJ1Z19wYXVzZV9wb3MgJj0gMHhmZmZmOworCQkJaGV2Yy0+dWNvZGVfcGF1c2VfcG9zID0gdWRlYnVnX3BhdXNlX3BvczsKKwkJfQorCQllbHNlIGlmIChkZWJ1Z190YWcgJiAweDIwMDAwKQorCQkJaGV2Yy0+dWNvZGVfcGF1c2VfcG9zID0gMHhmZmZmZmZmZjsKKwkJaWYgKGhldmMtPnVjb2RlX3BhdXNlX3BvcykKKwkJCXJlc2V0X3Byb2Nlc3NfdGltZShoZXZjKTsKKwkJZWxzZQorCQkJV1JJVEVfSFJFRyhERUJVR19SRUcxLCAwKTsKKwl9IGVsc2UgaWYgKGRlYnVnX3RhZyAhPSAwKSB7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJkYmcleDogJXggbC93L3IgJXggJXggJXhcbiIsIFJFQURfSFJFRyhERUJVR19SRUcxKSwKKwkJCSAgIFJFQURfSFJFRyhERUJVR19SRUcyKSwKKwkJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fTEVWRUwpLAorCQkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9XUl9QVFIpLAorCQkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIpKTsKKwkJaWYgKCgodWRlYnVnX3BhdXNlX3BvcyAmIDB4ZmZmZikKKwkJCT09IChkZWJ1Z190YWcgJiAweGZmZmYpKSAmJgorCQkJKHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4ID09IDAgfHwKKwkJCXVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4ID09IGhldmMtPmRlY29kZV9pZHgpICYmCisJCQkodWRlYnVnX3BhdXNlX3ZhbCA9PSAwIHx8CisJCQl1ZGVidWdfcGF1c2VfdmFsID09IFJFQURfSFJFRyhERUJVR19SRUcyKSkpIHsKKwkJCXVkZWJ1Z19wYXVzZV9wb3MgJj0gMHhmZmZmOworCQkJaGV2Yy0+dWNvZGVfcGF1c2VfcG9zID0gdWRlYnVnX3BhdXNlX3BvczsKKwkJfQorCQlpZiAoaGV2Yy0+dWNvZGVfcGF1c2VfcG9zKQorCQkJcmVzZXRfcHJvY2Vzc190aW1lKGhldmMpOworCQllbHNlCisJCQlXUklURV9IUkVHKERFQlVHX1JFRzEsIDApOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisKKwlpZiAoaGV2Yy0+cGljX2xpc3RfaW5pdF9mbGFnID09IDEpCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCWlmICghaGV2Yy0+bV9pbnNfZmxhZykgeworCQlpZiAoZGVjX3N0YXR1cyA9PSBIRVZDX09WRVJfREVDT0RFKSB7CisJCQloZXZjLT5vdmVyX2RlY29kZSA9IDE7CisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJImlzcjogb3ZlciBkZWNvZGVcbiIpLAorCQkJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgMCk7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKwl9CisJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9JU1JfRU5EKTsKKwlyZXR1cm4gSVJRX1dBS0VfVEhSRUFEOworCit9CisKK3N0YXRpYyB2b2lkIHZoMjY1X3NldF9jbGsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPSBjb250YWluZXJfb2Yod29yaywKKwkJc3RydWN0IGhldmNfc3RhdGVfcywgc2V0X2Nsa193b3JrKTsKKworCQlpbnQgZnBzID0gOTYwMDAgLyBoZXZjLT5mcmFtZV9kdXI7CisKKwkJaWYgKGhldmNfc291cmNlX2NoYW5nZWQoVkZPUk1BVF9IRVZDLAorCQkJaGV2Yy0+ZnJhbWVfd2lkdGgsIGhldmMtPmZyYW1lX2hlaWdodCwgZnBzKSA+IDApCisJCQloZXZjLT5zYXZlZF9yZXNvbHV0aW9uID0gaGV2Yy0+ZnJhbWVfd2lkdGggKgorCQkJaGV2Yy0+ZnJhbWVfaGVpZ2h0ICogZnBzOworfQorCitzdGF0aWMgdm9pZCB2aDI2NV9jaGVja190aW1lcl9mdW5jKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKK3sKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjID0gY29udGFpbmVyX29mKHRpbWVyLAorCQkgc3RydWN0IGhldmNfc3RhdGVfcywgdGltZXIpOworCXVuc2lnbmVkIGNoYXIgZW1wdHlfZmxhZzsKKwl1bnNpZ25lZCBpbnQgYnVmX2xldmVsOworCisJZW51bSByZWNldml2ZXJfc3RhcnRfZSBzdGF0ZSA9IFJFQ0VJVkVSX0lOQUNUSVZFOworCisJaWYgKGhldmMtPmluaXRfZmxhZyA9PSAwKSB7CisJCWlmIChoZXZjLT5zdGF0ICYgU1RBVF9USU1FUl9BUk0pIHsKKwkJCW1vZF90aW1lcigmaGV2Yy0+dGltZXIsIGppZmZpZXMgKyBQVVRfSU5URVJWQUwpOworCQl9CisJCXJldHVybjsKKwl9CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCWlmIChoZXZjLT5tX2luc19mbGFnICYmCisJCShnZXRfZGJnX2ZsYWcoaGV2YykgJgorCQlIMjY1X0RFQlVHX1dBSVRfREVDT0RFX0RPTkVfV0hFTl9TVE9QKSA9PSAwICYmCisJCWh3X3RvX3ZkZWMoaGV2YyktPm5leHRfc3RhdHVzID09CisJCVZERUNfU1RBVFVTX0RJU0NPTk5FQ1RFRCAmJgorCQkhaGV2Yy0+aXNfdXNlZF92NGwpIHsKKwkJaGV2Yy0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRk9SQ0VfRVhJVDsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZoZXZjLT53b3JrKTsKKwkJaGV2Y19wcmludChoZXZjLAorCQkJMCwgInZkZWMgcmVxdWVzdGVkIHRvIGJlIGRpc2Nvbm5lY3RlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaGV2Yy0+bV9pbnNfZmxhZykgeworCQlpZiAoKChnZXRfZGJnX2ZsYWcoaGV2YykgJgorCQkJSDI2NV9ERUJVR19ESVNfTE9DX0VSUk9SX1BST0MpID09IDApICYmCisJCQkoZGVjb2RlX3RpbWVvdXRfdmFsID4gMCkgJiYKKwkJCShoZXZjLT5zdGFydF9wcm9jZXNzX3RpbWUgPiAwKSAmJgorCQkJKCgxMDAwICogKGppZmZpZXMgLSBoZXZjLT5zdGFydF9wcm9jZXNzX3RpbWUpIC8gSFopCisJCQkJPiBkZWNvZGVfdGltZW91dF92YWwpCisJCSkgeworCQkJdTMyIGRlY19zdGF0dXMgPSBSRUFEX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRyk7CisJCQlpbnQgY3VycmVudF9sY3VfaWR4ID0KKwkJCQlSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfTENVX1NUQVJUKSYweGZmZmZmZjsKKwkJCWlmIChkZWNfc3RhdHVzID09IEhFVkNfQ09ERURfU0xJQ0VfU0VHTUVOVF9EQVQpIHsKKwkJCQlpZiAoaGV2Yy0+bGFzdF9sY3VfaWR4ID09IGN1cnJlbnRfbGN1X2lkeCkgeworCQkJCQlpZiAoaGV2Yy0+ZGVjb2RlX3RpbWVvdXRfY291bnQgPiAwKQorCQkJCQkJaGV2Yy0+ZGVjb2RlX3RpbWVvdXRfY291bnQtLTsKKwkJCQkJaWYgKGhldmMtPmRlY29kZV90aW1lb3V0X2NvdW50ID09IDApCisJCQkJCQl0aW1lb3V0X3Byb2Nlc3MoaGV2Yyk7CisJCQkJfSBlbHNlCisJCQkJCXJlc3RhcnRfcHJvY2Vzc190aW1lKGhldmMpOworCQkJCWhldmMtPmxhc3RfbGN1X2lkeCA9IGN1cnJlbnRfbGN1X2lkeDsKKwkJCX0gZWxzZSB7CisJCQkJaGV2Yy0+cGljX2RlY29kZWRfbGN1X2lkeCA9IGN1cnJlbnRfbGN1X2lkeDsKKwkJCQl0aW1lb3V0X3Byb2Nlc3MoaGV2Yyk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworI2VuZGlmCisJaWYgKGhldmMtPm1faW5zX2ZsYWcgPT0gMCAmJgorCQl2Zl9nZXRfcmVjZWl2ZXIoaGV2Yy0+cHJvdmlkZXJfbmFtZSkpIHsKKwkJc3RhdGUgPQorCQkJdmZfbm90aWZ5X3JlY2VpdmVyKGhldmMtPnByb3ZpZGVyX25hbWUsCisJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1FVUkVZX1NUQVRFLAorCQkJCU5VTEwpOworCQlpZiAoKHN0YXRlID09IFJFQ0VJVkVSX1NUQVRFX05VTEwpCisJCQl8fCAoc3RhdGUgPT0gUkVDRUlWRVJfU1RBVEVfTk9ORSkpCisJCQlzdGF0ZSA9IFJFQ0VJVkVSX0lOQUNUSVZFOworCX0gZWxzZQorCQlzdGF0ZSA9IFJFQ0VJVkVSX0lOQUNUSVZFOworCisJZW1wdHlfZmxhZyA9IChSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfSU5UX1NUQVRVUykgPj4gNikgJiAweDE7CisJLyogZXJyb3Igd2F0Y2hkb2cgKi8KKwlpZiAoaGV2Yy0+bV9pbnNfZmxhZyA9PSAwICYmCisJCShlbXB0eV9mbGFnID09IDApCisJCSYmIChoZXZjLT5waWNfbGlzdF9pbml0X2ZsYWcgPT0gMAorCQkJfHwgaGV2Yy0+cGljX2xpc3RfaW5pdF9mbGFnCisJCQk9PSAzKSkgeworCQkvKiBkZWNvZGVyIGhhcyBpbnB1dCAqLworCQlpZiAoKGdldF9kYmdfZmxhZyhoZXZjKSAmCisJCQlIMjY1X0RFQlVHX0RJU19MT0NfRVJST1JfUFJPQykgPT0gMCkgeworCisJCQlidWZfbGV2ZWwgPSBSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fTEVWRUwpOworCQkJLyogcmVjZWl2ZXIgaGFzIG5vIGJ1ZmZlciB0byByZWN5Y2xlICovCisJCQlpZiAoKHN0YXRlID09IFJFQ0VJVkVSX0lOQUNUSVZFKSAmJgorCQkJCShrZmlmb19pc19lbXB0eSgmaGV2Yy0+ZGlzcGxheV9xKSAmJgorCQkJCSBidWZfbGV2ZWwgPiAweDIwMCkKKwkJCSAgICkgeworCQkJCWlmIChoZXZjLT5lcnJvcl9mbGFnID09IDApIHsKKwkJCQkJaGV2Yy0+ZXJyb3Jfd2F0Y2hkb2dfY291bnQrKzsKKwkJCQkJaWYgKGhldmMtPmVycm9yX3dhdGNoZG9nX2NvdW50ID09CisJCQkJCQllcnJvcl9oYW5kbGVfdGhyZXNob2xkKSB7CisJCQkJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJCQkiSDI2NSBkZWMgZXJyIGxvY2FsIHJlc2V0LlxuIik7CisJCQkJCQloZXZjLT5lcnJvcl9mbGFnID0gMTsKKwkJCQkJCWhldmMtPmVycm9yX3dhdGNoZG9nX2NvdW50ID0gMDsKKwkJCQkJCWhldmMtPmVycm9yX3NraXBfbmFsX3d0X2NudCA9IDA7CisJCQkJCQloZXZjLT4KKwkJCQkJCWVycm9yX3N5c3RlbV93YXRjaGRvZ19jb3VudCsrOworCQkJCQkJV1JJVEVfVlJFRworCQkJCQkJKEhFVkNfQVNTSVNUX01CT1gwX0lSUV9SRUcsCisJCQkJCQkgMHgxKTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoaGV2Yy0+ZXJyb3JfZmxhZyA9PSAyKSB7CisJCQkJCWludCB0aCA9CisJCQkJCQllcnJvcl9oYW5kbGVfbmFsX3NraXBfdGhyZXNob2xkOworCQkJCQloZXZjLT5lcnJvcl9za2lwX25hbF93dF9jbnQrKzsKKwkJCQkJaWYgKGhldmMtPmVycm9yX3NraXBfbmFsX3d0X2NudAorCQkJCQk9PSB0aCkgeworCQkJCQkJaGV2Yy0+ZXJyb3JfZmxhZyA9IDM7CisJCQkJCQloZXZjLT5lcnJvcl93YXRjaGRvZ19jb3VudCA9IDA7CisJCQkJCQloZXZjLT4KKwkJCQkJCWVycm9yX3NraXBfbmFsX3d0X2NudCA9CTA7CisJCQkJCQlXUklURV9WUkVHCisJCQkJCQkoSEVWQ19BU1NJU1RfTUJPWDBfSVJRX1JFRywKKwkJCQkJCSAweDEpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKChnZXRfZGJnX2ZsYWcoaGV2YykKKwkJCSYgSDI2NV9ERUJVR19ESVNfU1lTX0VSUk9SX1BST0MpID09IDApCisJCQkvKiByZWNlaXZlciBoYXMgbm8gYnVmZmVyIHRvIHJlY3ljbGUgKi8KKwkJCWlmICgoc3RhdGUgPT0gUkVDRUlWRVJfSU5BQ1RJVkUpICYmCisJCQkJKGtmaWZvX2lzX2VtcHR5KCZoZXZjLT5kaXNwbGF5X3EpKQorCQkJICAgKSB7CS8qIG5vIGJ1ZmZlciB0byByZWN5Y2xlICovCisJCQkJaWYgKChnZXRfZGJnX2ZsYWcoaGV2YykgJgorCQkJCQlIMjY1X0RFQlVHX0RJU19MT0NfRVJST1JfUFJPQykgIT0KKwkJCQkJMCkKKwkJCQkJaGV2Yy0+ZXJyb3Jfc3lzdGVtX3dhdGNoZG9nX2NvdW50Kys7CisJCQkJaWYgKGhldmMtPmVycm9yX3N5c3RlbV93YXRjaGRvZ19jb3VudCA9PQorCQkJCQllcnJvcl9oYW5kbGVfc3lzdGVtX3RocmVzaG9sZCkgeworCQkJCQkvKiBhbmQgaXQgbGFzdHMgZm9yIGEgd2hpbGUgKi8KKwkJCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCQkiSDI2NSBkZWMgZmF0YWwgZXJyb3Igd2F0Y2hkb2cuXG4iKTsKKwkJCQkJaGV2Yy0+CisJCQkJCWVycm9yX3N5c3RlbV93YXRjaGRvZ19jb3VudCA9IDA7CisJCQkJCWhldmMtPmZhdGFsX2Vycm9yIHw9IERFQ09ERVJfRkFUQUxfRVJST1JfVU5LTk9XTjsKKwkJCQl9CisJCQl9CisJfSBlbHNlIHsKKwkJaGV2Yy0+ZXJyb3Jfd2F0Y2hkb2dfY291bnQgPSAwOworCQloZXZjLT5lcnJvcl9zeXN0ZW1fd2F0Y2hkb2dfY291bnQgPSAwOworCX0KKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJfQorI2VuZGlmCisJaWYgKChoZXZjLT51Y29kZV9wYXVzZV9wb3MgIT0gMCkgJiYKKwkJKGhldmMtPnVjb2RlX3BhdXNlX3BvcyAhPSAweGZmZmZmZmZmKSAmJgorCQl1ZGVidWdfcGF1c2VfcG9zICE9IGhldmMtPnVjb2RlX3BhdXNlX3BvcykgeworCQloZXZjLT51Y29kZV9wYXVzZV9wb3MgPSAwOworCQlXUklURV9IUkVHKERFQlVHX1JFRzEsIDApOworCX0KKworCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0RVTVBfUElDX0xJU1QpIHsKKwkJZHVtcF9waWNfbGlzdChoZXZjKTsKKwkJZGVidWcgJj0gfkgyNjVfREVCVUdfRFVNUF9QSUNfTElTVDsKKwl9CisJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfVFJJR19TTElDRV9TRUdNRU5UX1BST0MpIHsKKwkJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9NQk9YMF9JUlFfUkVHLCAweDEpOworCQlkZWJ1ZyAmPSB+SDI2NV9ERUJVR19UUklHX1NMSUNFX1NFR01FTlRfUFJPQzsKKwl9CisjaWZkZWYgVEVTVF9OT19CVUYKKwlpZiAoaGV2Yy0+d2FpdF9idWYpCisJCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTUJPWDBfSVJRX1JFRywgMHgxKTsKKyNlbmRpZgorCWlmIChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX0hXX1JFU0VUKSB7CisJCWhldmMtPmVycm9yX3NraXBfbmFsX2NvdW50ID0gZXJyb3Jfc2tpcF9uYWxfY291bnQ7CisJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgSEVWQ19BQ1RJT05fRE9ORSk7CisKKwkJZGVidWcgJj0gfkgyNjVfREVCVUdfSFdfUkVTRVQ7CisJfQorCisjaWZkZWYgRVJST1JfSEFORExFX0RFQlVHCisJaWYgKChkYmdfbmFsX3NraXBfY291bnQgPiAwKSAmJiAoKGRiZ19uYWxfc2tpcF9jb3VudCAmIDB4MTAwMDApICE9IDApKSB7CisJCWhldmMtPmVycm9yX3NraXBfbmFsX2NvdW50ID0gZGJnX25hbF9za2lwX2NvdW50ICYgMHhmZmZmOworCQlkYmdfbmFsX3NraXBfY291bnQgJj0gfjB4MTAwMDA7CisJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgSEVWQ19BQ1RJT05fRE9ORSk7CisJfQorI2VuZGlmCisKKwlpZiAocmFkciAhPSAwKSB7CisjaWZkZWYgU1VQUE9SVF9MT05HX1RFUk1fUlBTCisJCWlmICgocmFkciA+PiAyNCkgIT0gMCkgeworCQkJaW50IGNvdW50ID0gcmFkciA+PiAyNDsKKwkJCWludCBhZHIgPSByYWRyICYgMHhmZmZmZmY7CisJCQlpbnQgaTsKKwkJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQkJCXByX2luZm8oIlJFQURfVlJFRygleCk9JXhcbiIsIGFkcitpLCBSRUFEX1ZSRUcoYWRyK2kpKTsKKwkJfSBlbHNlCisjZW5kaWYKKwkJaWYgKHJ2YWwgIT0gMCkgeworCQkJV1JJVEVfVlJFRyhyYWRyLCBydmFsKTsKKwkJCXByX2luZm8oIldSSVRFX1ZSRUcoJXgsJXgpXG4iLCByYWRyLCBydmFsKTsKKwkJfSBlbHNlCisJCQlwcl9pbmZvKCJSRUFEX1ZSRUcoJXgpPSV4XG4iLCByYWRyLCBSRUFEX1ZSRUcocmFkcikpOworCQlydmFsID0gMDsKKwkJcmFkciA9IDA7CisJfQorCWlmIChkYmdfY21kICE9IDApIHsKKwkJaWYgKGRiZ19jbWQgPT0gMSkgeworCQkJdTMyIGRpc3BfbGFkZHI7CisKKwkJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYQkIgJiYKKwkJCQlnZXRfZG91YmxlX3dyaXRlX21vZGUoaGV2YykgPT0gMCkgeworCQkJCWRpc3BfbGFkZHIgPQorCQkJCQlSRUFEX1ZDQlVTX1JFRyhBRkJDX0JPRFlfQkFERFIpIDw8IDQ7CisJCQl9IGVsc2UgeworCQkJCXN0cnVjdCBjYW52YXNfcyBjdXJfY2FudmFzOworCisJCQkJY2FudmFzX3JlYWQoKFJFQURfVkNCVVNfUkVHKFZEMV9JRjBfQ0FOVkFTMCkKKwkJCQkJJiAweGZmKSwgJmN1cl9jYW52YXMpOworCQkJCWRpc3BfbGFkZHIgPSBjdXJfY2FudmFzLmFkZHI7CisJCQl9CisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJImN1cnJlbnQgZGlzcGxheWVkIGJ1ZmZlciBhZGRyZXNzICV4XHJcbiIsCisJCQkJZGlzcF9sYWRkcik7CisJCX0KKwkJZGJnX2NtZCA9IDA7CisJfQorCS8qZG9uJ3QgY2hhbmdlZCBhdCBzdGFydC4qLworCWlmIChoZXZjLT5tX2luc19mbGFnID09IDAgJiYKKwkJaGV2Yy0+Z2V0X2ZyYW1lX2R1ciAmJiBoZXZjLT5zaG93X2ZyYW1lX251bSA+IDYwICYmCisJCWhldmMtPmZyYW1lX2R1ciA+IDAgJiYgaGV2Yy0+c2F2ZWRfcmVzb2x1dGlvbiAhPQorCQloZXZjLT5mcmFtZV93aWR0aCAqIGhldmMtPmZyYW1lX2hlaWdodCAqCisJCQkoOTYwMDAgLyBoZXZjLT5mcmFtZV9kdXIpKQorCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmhldmMtPnNldF9jbGtfd29yayk7CisKKwltb2RfdGltZXIodGltZXIsIGppZmZpZXMgKyBQVVRfSU5URVJWQUwpOworfQorCitzdGF0aWMgaW50IGgyNjVfdGFza19oYW5kbGUodm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjID0gKHN0cnVjdCBoZXZjX3N0YXRlX3MgKilkYXRhOworCisJc2V0X3VzZXJfbmljZShjdXJyZW50LCAtMTApOworCXdoaWxlICgxKSB7CisJCWlmICh1c2VfY21hID09IDApIHsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJFUlJPUjogdXNlX2NtYSBjYW4gbm90IGJlIGNoYW5nZWQgZHluYW1pY2FsbHlcbiIpOworCQl9CisJCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmaDI2NV9zZW1hKTsKKwkJaWYgKChoZXZjLT5pbml0X2ZsYWcgIT0gMCkgJiYgKGhldmMtPnBpY19saXN0X2luaXRfZmxhZyA9PSAxKSkgeworCQkJaW5pdF9waWNfbGlzdChoZXZjKTsKKwkJCWluaXRfcGljX2xpc3RfaHcoaGV2Yyk7CisJCQlpbml0X2J1Zl9zcGVjKGhldmMpOworCQkJaGV2Yy0+cGljX2xpc3RfaW5pdF9mbGFnID0gMjsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwgInNldCBwaWNfbGlzdF9pbml0X2ZsYWcgdG8gMlxuIik7CisKKwkJCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTUJPWDBfSVJRX1JFRywgMHgxKTsKKworCQl9CisKKwkJaWYgKGhldmMtPnVuaW5pdF9saXN0KSB7CisJCQkvKlVTRV9CVUZfQkxPQ0sqLworCQkJdW5pbml0X3BpY19saXN0KGhldmMpOworCQkJaGV2Y19wcmludChoZXZjLCAwLCAidW5pbml0IGxpc3RcbiIpOworCQkJaGV2Yy0+dW5pbml0X2xpc3QgPSAwOworI2lmZGVmIFVTRV9VTklOSVRfU0VNQQorCQkJaWYgKHVzZV9jbWEpIHsKKwkJCQl1cCgmaGV2Yy0+aDI2NV91bmluaXRfZG9uZV9zZW1hKTsKKwkJCQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKKwkJCQkJbXNsZWVwKDEpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmCisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCB2aDI2NV9mcmVlX2NtYWJ1Zih2b2lkKQoreworCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPSBnSGV2YzsKKworCW11dGV4X2xvY2soJnZoMjY1X211dGV4KTsKKworCWlmIChoZXZjLT5pbml0X2ZsYWcpIHsKKwkJbXV0ZXhfdW5sb2NrKCZ2aDI2NV9tdXRleCk7CisJCXJldHVybjsKKwl9CisKKwltdXRleF91bmxvY2soJnZoMjY1X211dGV4KTsKK30KKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKK2ludCB2aDI2NV9kZWNfc3RhdHVzKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHN0cnVjdCB2ZGVjX2luZm8gKnZzdGF0dXMpCisjZWxzZQoraW50IHZoMjY1X2RlY19zdGF0dXMoc3RydWN0IHZkZWNfaW5mbyAqdnN0YXR1cykKKyNlbmRpZgoreworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjID0KKwkJKHN0cnVjdCBoZXZjX3N0YXRlX3MgKil2ZGVjLT5wcml2YXRlOworI2Vsc2UKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjID0gZ0hldmM7CisjZW5kaWYKKwlpZiAoIWhldmMpCisJCXJldHVybiAtMTsKKworCXZzdGF0dXMtPmZyYW1lX3dpZHRoID0gaGV2Yy0+cGljX3c7CisJLyogZm9yIGhldmMgaW50ZXJsYWNlIGZvciBkaXNwIGhlaWdodCB4MiAqLworCXZzdGF0dXMtPmZyYW1lX2hlaWdodCA9CisJCShoZXZjLT5waWNfaCA8PCBoZXZjLT5pbnRlcmxhY2VfZmxhZyk7CisJaWYgKGhldmMtPmZyYW1lX2R1ciAhPSAwKQorCQl2c3RhdHVzLT5mcmFtZV9yYXRlID0gKCg5NjAwMCAqIDEwIC8gaGV2Yy0+ZnJhbWVfZHVyKSAlIDEwKSA8IDUgPworCQkJCTk2MDAwIC8gaGV2Yy0+ZnJhbWVfZHVyIDogKDk2MDAwIC8gaGV2Yy0+ZnJhbWVfZHVyICsxKTsKKwllbHNlCisJCXZzdGF0dXMtPmZyYW1lX3JhdGUgPSAtMTsKKwl2c3RhdHVzLT5lcnJvcl9jb3VudCA9IGhldmMtPmd2cy0+ZXJyb3JfZnJhbWVfY291bnQ7CisJdnN0YXR1cy0+c3RhdHVzID0gaGV2Yy0+c3RhdCB8IGhldmMtPmZhdGFsX2Vycm9yOworCXZzdGF0dXMtPmJpdF9yYXRlID0gaGV2Yy0+Z3ZzLT5iaXRfcmF0ZTsKKwl2c3RhdHVzLT5mcmFtZV9kdXIgPSBoZXZjLT5mcmFtZV9kdXI7CisJaWYgKGhldmMtPmd2cykgeworCQl2c3RhdHVzLT5iaXRfcmF0ZSA9IGhldmMtPmd2cy0+Yml0X3JhdGU7CisJCXZzdGF0dXMtPmZyYW1lX2RhdGEgPSBoZXZjLT5ndnMtPmZyYW1lX2RhdGE7CisJCXZzdGF0dXMtPnRvdGFsX2RhdGEgPSBoZXZjLT5ndnMtPnRvdGFsX2RhdGE7CisJCXZzdGF0dXMtPmZyYW1lX2NvdW50ID0gaGV2Yy0+Z3ZzLT5mcmFtZV9jb3VudDsKKwkJdnN0YXR1cy0+ZXJyb3JfZnJhbWVfY291bnQgPSBoZXZjLT5ndnMtPmVycm9yX2ZyYW1lX2NvdW50OworCQl2c3RhdHVzLT5kcm9wX2ZyYW1lX2NvdW50ID0gaGV2Yy0+Z3ZzLT5kcm9wX2ZyYW1lX2NvdW50OworCQl2c3RhdHVzLT5pX2RlY29kZWRfZnJhbWVzID0gaGV2Yy0+Z3ZzLT5pX2RlY29kZWRfZnJhbWVzOworCQl2c3RhdHVzLT5pX2xvc3RfZnJhbWVzID0gaGV2Yy0+Z3ZzLT5pX2xvc3RfZnJhbWVzOworCQl2c3RhdHVzLT5pX2NvbmNlYWxlZF9mcmFtZXMgPSBoZXZjLT5ndnMtPmlfY29uY2VhbGVkX2ZyYW1lczsKKwkJdnN0YXR1cy0+cF9kZWNvZGVkX2ZyYW1lcyA9IGhldmMtPmd2cy0+cF9kZWNvZGVkX2ZyYW1lczsKKwkJdnN0YXR1cy0+cF9sb3N0X2ZyYW1lcyA9IGhldmMtPmd2cy0+cF9sb3N0X2ZyYW1lczsKKwkJdnN0YXR1cy0+cF9jb25jZWFsZWRfZnJhbWVzID0gaGV2Yy0+Z3ZzLT5wX2NvbmNlYWxlZF9mcmFtZXM7CisJCXZzdGF0dXMtPmJfZGVjb2RlZF9mcmFtZXMgPSBoZXZjLT5ndnMtPmJfZGVjb2RlZF9mcmFtZXM7CisJCXZzdGF0dXMtPmJfbG9zdF9mcmFtZXMgPSBoZXZjLT5ndnMtPmJfbG9zdF9mcmFtZXM7CisJCXZzdGF0dXMtPmJfY29uY2VhbGVkX2ZyYW1lcyA9IGhldmMtPmd2cy0+Yl9jb25jZWFsZWRfZnJhbWVzOworCQl2c3RhdHVzLT5zYW1wX2NudCA9IGhldmMtPmd2cy0+c2FtcF9jbnQ7CisJCXZzdGF0dXMtPm9mZnNldCA9IGhldmMtPmd2cy0+b2Zmc2V0OworCX0KKworCXNucHJpbnRmKHZzdGF0dXMtPnZkZWNfbmFtZSwgc2l6ZW9mKHZzdGF0dXMtPnZkZWNfbmFtZSksCisJCSIlcyIsIERSSVZFUl9OQU1FKTsKKwl2c3RhdHVzLT5yYXRpb19jb250cm9sID0gaGV2Yy0+cmF0aW9fY29udHJvbDsKKwlyZXR1cm4gMDsKK30KKworaW50IHZoMjY1X3NldF9pc3Jlc2V0KHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBpc3Jlc2V0KQoreworCWlzX3Jlc2V0ID0gaXNyZXNldDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aDI2NV92ZGVjX2luZm9faW5pdChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICAqaGV2YykKK3sKKwloZXZjLT5ndnMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdmRlY19pbmZvKSwgR0ZQX0tFUk5FTCk7CisJLy9wcl9lcnIoIlslcyBsaW5lICVkXSBoZXZjLT5ndnM9MHglcCBvcGVyYXRpb25cbiIsX19mdW5jX18sIF9fTElORV9fLCBoZXZjLT5ndnMpOworCWlmIChOVUxMID09IGhldmMtPmd2cykgeworCQlwcl9pbmZvKCJ0aGUgc3RydWN0IG9mIHZkZWMgc3RhdHVzIG1hbGxvYyBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXZkZWNfc2V0X3ZmcmFtZV9jb21tKGh3X3RvX3ZkZWMoaGV2YyksIERSSVZFUl9OQU1FKTsKKwlyZXR1cm4gMDsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIEgyNjVfREVDT0RFX0lOSVQodm9pZCkKK3sKKwkvKiBlbmFibGUgaGV2YyBjbG9ja3MgKi8KKwlXUklURV9WUkVHKERPU19HQ0xLX0VOMywgMHhmZmZmZmZmZik7CisJLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisJLyogUG93ZXIgT04gSEVWQyAqLworCS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCS8qIFBvd2VydXAgSEVWQyAqLworCVdSSVRFX1ZSRUcoUF9BT19SVElfR0VOX1BXUl9TTEVFUDAsCisJCQlSRUFEX1ZSRUcoUF9BT19SVElfR0VOX1BXUl9TTEVFUDApICYgKH4oMHgzIDw8IDYpKSk7CisJV1JJVEVfVlJFRyhET1NfTUVNX1BEX0hFVkMsIDB4MCk7CisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQzLCBSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMykgfCAoMHgzZmZmZiA8PCAyKSk7CisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQzLCBSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMykgJiAofigweDNmZmZmIDw8IDIpKSk7CisJLyogcmVtb3ZlIGlzb2xhdGlvbnMgKi8KKwlXUklURV9WUkVHKEFPX1JUSV9HRU5fUFdSX0lTTzAsCisJCQlSRUFEX1ZSRUcoQU9fUlRJX0dFTl9QV1JfSVNPMCkgJiAofigweDMgPDwgMTApKSk7CisKK30KKyNlbmRpZgorCitpbnQgdmgyNjVfc2V0X3RyaWNrbW9kZShzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1bnNpZ25lZCBsb25nIHRyaWNrbW9kZSkKK3sKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjID0gKHN0cnVjdCBoZXZjX3N0YXRlX3MgKil2ZGVjLT5wcml2YXRlOworCWhldmNfcHJpbnQoaGV2YywgMCwJIlslcyAlZF0gdHJpY2ttb2RlOiVsdVxuIiwgX19mdW5jX18sIF9fTElORV9fLCB0cmlja21vZGUpOworCisJaWYgKHRyaWNrbW9kZSA9PSBUUklDS01PREVfSSkgeworCQl0cmlja21vZGVfaSA9IDE7CisJCWlfb25seV9mbGFnID0gMHgxOworCX0gZWxzZSBpZiAodHJpY2ttb2RlID09IFRSSUNLTU9ERV9OT05FKSB7CisJCXRyaWNrbW9kZV9pID0gMDsKKwkJaV9vbmx5X2ZsYWcgPSAweDA7CisJfSBlbHNlIGlmICh0cmlja21vZGUgPT0gMHgwMikgeworCQl0cmlja21vZGVfaSA9IDA7CisJCWlfb25seV9mbGFnID0gMHgwMjsKKwl9IGVsc2UgaWYgKHRyaWNrbW9kZSA9PSAweDAzKSB7CisJCXRyaWNrbW9kZV9pID0gMTsKKwkJaV9vbmx5X2ZsYWcgPSAweDAzOworCX0gZWxzZSBpZiAodHJpY2ttb2RlID09IDB4MDcpIHsKKwkJdHJpY2ttb2RlX2kgPSAxOworCQlpX29ubHlfZmxhZyA9IDB4MDc7CisJfQorCS8vaGV2Y19wcmludChoZXZjLCAwLCAiaV9vbmx5X2ZsYWc6ICVkIHRyaWNrbW9kZV9pOiVkXG4iLCBpX29ubHlfZmxhZywgdHJpY2ttb2RlX2kpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19kZWNvZGVfbW9kZShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaGV2Yyk7CisjZW5kaWYKKwl1bnNpZ25lZCBkZWNvZGVfbW9kZTsKKyNpZmRlZiBIRVZDXzhLX0xGVE9GRlNFVF9GSVgKKwlpZiAoaGV2Yy0+cGVyZm9ybWFuY2VfcHJvZmlsZSkKKwkJV1JJVEVfVlJFRyhOQUxfU0VBUkNIX0NUTCwKKwkJCVJFQURfVlJFRyhOQUxfU0VBUkNIX0NUTCkgfCAoMSA8PCAyMSkpOworI2VuZGlmCisJaWYgKCFoZXZjLT5tX2luc19mbGFnKQorCQlkZWNvZGVfbW9kZSA9IERFQ09ERV9NT0RFX1NJTkdMRTsKKwllbHNlIGlmICh2ZGVjX2ZyYW1lX2Jhc2VkKGh3X3RvX3ZkZWMoaGV2YykpKQorCQlkZWNvZGVfbW9kZSA9CisJCQlERUNPREVfTU9ERV9NVUxUSV9GUkFNRUJBU0U7CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwllbHNlIGlmICh2ZGVjLT5zbGF2ZSkgeworCQlpZiAoZm9yY2VfYnlwYXNzX2R2ZW5sICYgMHg4MDAwMDAwMCkKKwkJCWhldmMtPmJ5cGFzc19kdmVubCA9IGZvcmNlX2J5cGFzc19kdmVubCAmIDB4MTsKKwkJZWxzZQorCQkJaGV2Yy0+YnlwYXNzX2R2ZW5sID0gaGV2Yy0+YnlwYXNzX2R2ZW5sX2VuYWJsZTsKKwkJaWYgKGRvbGJ5X21ldGFfd2l0aF9lbCAmJiBoZXZjLT5ieXBhc3NfZHZlbmwpIHsKKwkJCWhldmMtPmJ5cGFzc19kdmVubCA9IDA7CisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJIk5PVCBzdXBwb3J0IGJ5cGFzc19kdmVubCB3aGVuIG1ldGFfd2l0aF9lbFxuIik7CisJCX0KKwkJaWYgKGhldmMtPmJ5cGFzc19kdmVubCkKKwkJCWRlY29kZV9tb2RlID0KKwkJCQkoaGV2Yy0+c3RhcnRfcGFyc2VyX3R5cGUgPDwgOCkKKwkJCQl8IERFQ09ERV9NT0RFX01VTFRJX1NUUkVBTUJBU0U7CisJCWVsc2UKKwkJCWRlY29kZV9tb2RlID0KKwkJCQkoaGV2Yy0+c3RhcnRfcGFyc2VyX3R5cGUgPDwgOCkKKwkJCQl8IERFQ09ERV9NT0RFX01VTFRJX0RWQkFMOworCX0gZWxzZSBpZiAodmRlYy0+bWFzdGVyKQorCQlkZWNvZGVfbW9kZSA9CisJCQkoaGV2Yy0+c3RhcnRfcGFyc2VyX3R5cGUgPDwgOCkKKwkJCXwgREVDT0RFX01PREVfTVVMVElfRFZFTkw7CisjZW5kaWYKKwllbHNlCisJCWRlY29kZV9tb2RlID0KKwkJCURFQ09ERV9NT0RFX01VTFRJX1NUUkVBTUJBU0U7CisKKwlpZiAoaGV2Yy0+bV9pbnNfZmxhZykKKwkJZGVjb2RlX21vZGUgfD0KKwkJCShoZXZjLT5zdGFydF9kZWNvZGluZ19mbGFnIDw8IDE2KTsKKwkvKiBzZXQgTUJYMCBpbnRlcnJ1cHQgZmxhZyAqLworCWRlY29kZV9tb2RlIHw9ICgweDgwIDw8IDI0KTsKKwlXUklURV9WUkVHKEhFVkNfREVDT0RFX01PREUsIGRlY29kZV9tb2RlKTsKKwlXUklURV9WUkVHKEhFVkNfREVDT0RFX01PREUyLAorCQloZXZjLT5ycHNfc2V0X2lkKTsKK30KKworc3RhdGljIHZvaWQgdmgyNjVfcHJvdF9pbml0KHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhoZXZjKTsKKyNlbmRpZgorCS8qIEgyNjVfREVDT0RFX0lOSVQoKTsgKi8KKworCWhldmNfY29uZmlnX3dvcmtfc3BhY2VfaHcoaGV2Yyk7CisKKwloZXZjX2luaXRfZGVjb2Rlcl9odyhoZXZjLCAwLCAweGZmZmZmZmZmKTsKKworCVdSSVRFX1ZSRUcoSEVWQ19XQUlUX0ZMQUcsIDEpOworCisJLyogV1JJVEVfVlJFRyhQX0hFVkNfTVBTUiwgMSk7ICovCisKKwkvKiBjbGVhciBtYWlsYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTUJPWDBfQ0xSX1JFRywgMSk7CisKKwkvKiBlbmFibGUgbWFpbGJveCBpbnRlcnJ1cHQgKi8KKwlXUklURV9WUkVHKEhFVkNfQVNTSVNUX01CT1gwX01BU0ssIDEpOworCisJLyogZGlzYWJsZSBQU0NBTEUgZm9yIGhhcmR3YXJlIHNoYXJpbmcgKi8KKwlXUklURV9WUkVHKEhFVkNfUFNDQUxFX0NUUkwsIDApOworCisJV1JJVEVfVlJFRyhERUJVR19SRUcxLCAweDAgfCAoZHVtcF9uYWwgPDwgOCkpOworCisJaWYgKChnZXRfZGJnX2ZsYWcoaGV2YykgJgorCQkoSDI2NV9ERUJVR19NQU5fU0tJUF9OQUwgfAorCQlIMjY1X0RFQlVHX01BTl9TRUFSQ0hfTkFMKSkKKwkJLyp8fGhldmMtPm1faW5zX2ZsYWcqLworCQkpIHsKKwkJV1JJVEVfVlJFRyhOQUxfU0VBUkNIX0NUTCwgMHgxKTsJLyogbWFudWFsIHBhcnNlciBOQUwgKi8KKwl9IGVsc2UgeworCQkvKiBjaGVjayB2cHMvc3BzL3Bwcy9pLXNsaWNlIGluIHVjb2RlICovCisJCXVuc2lnbmVkIGN0bF92YWwgPSAweDg7CisJCWlmIChoZXZjLT5QQl9za2lwX21vZGUgPT0gMCkKKwkJCWN0bF92YWwgPSAweDQ7CS8qIGNoZWNrIHZwcy9zcHMvcHBzIG9ubHkgaW4gdWNvZGUgKi8KKwkJZWxzZSBpZiAoaGV2Yy0+UEJfc2tpcF9tb2RlID09IDMpCisJCQljdGxfdmFsID0gMHgwOwkvKiBjaGVjayB2cHMvc3BzL3Bwcy9pZHIgaW4gdWNvZGUgKi8KKwkJLyppZiAoKChlcnJvcl9oYW5kbGVfcG9saWN5ICYgMHgyMDApID09IDApICYmCisJCQkJaW5wdXRfc3RyZWFtX2Jhc2VkKHZkZWMpKQorCQkJY3RsX3ZhbCA9IDB4MTsqLworCQlXUklURV9WUkVHKE5BTF9TRUFSQ0hfQ1RMLCBjdGxfdmFsKTsKKwl9CisJaWYgKChnZXRfZGJnX2ZsYWcoaGV2YykgJiBIMjY1X0RFQlVHX05PX0VPU19TRUFSQ0hfRE9ORSkKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCQl8fCB2ZGVjLT5tYXN0ZXIKKwkJfHwgdmRlYy0+c2xhdmUKKyNlbmRpZgorCQkpCisJCVdSSVRFX1ZSRUcoTkFMX1NFQVJDSF9DVEwsIFJFQURfVlJFRyhOQUxfU0VBUkNIX0NUTCkgfCAweDEwMDAwKTsKKworCVdSSVRFX1ZSRUcoTkFMX1NFQVJDSF9DVEwsCisJCVJFQURfVlJFRyhOQUxfU0VBUkNIX0NUTCkKKwkJfCAoKHBhcnNlcl9zZWlfZW5hYmxlICYgMHg3KSA8PCAxNykpOworLyojaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04qLworCVdSSVRFX1ZSRUcoTkFMX1NFQVJDSF9DVEwsCisJCVJFQURfVlJFRyhOQUxfU0VBUkNIX0NUTCkgfAorCQkoKHBhcnNlcl9kb2xieV92aXNpb25fZW5hYmxlICYgMHgxKSA8PCAyMCkpOworLyojZW5kaWYqLworCVdSSVRFX1ZSRUcoREVDT0RFX1NUT1BfUE9TLCB1ZGVidWdfZmxhZyk7CisKKwljb25maWdfZGVjb2RlX21vZGUoaGV2Yyk7CisJY29uZmlnX2F1eF9idWYoaGV2Yyk7CisjaWZkZWYgU1dBUF9IRVZDX1VDT0RFCisJaWYgKCF0ZWVfZW5hYmxlZCgpICYmIGhldmMtPmlzX3N3YXAgJiYKKwkJZ2V0X2NwdV9tYWpvcl9pZCgpIDw9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWE0pIHsKKwkJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9TV0FQX0JVRkZFUjIsIGhldmMtPm1jX2RtYV9oYW5kbGUpOworCQkvKnByX2luZm8oIndyaXRlIHN3YXAgYnVmZmVyICV4XG4iLCAodTMyKShoZXZjLT5tY19kbWFfaGFuZGxlKSk7Ki8KKwl9CisjZW5kaWYKKyNpZmRlZiBERVRSRUZJTExfRU5BQkxFCisJaWYgKGhldmMtPmlzX3N3YXAgJiYKKwkJZ2V0X2NwdV9tYWpvcl9pZCgpIDw9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWE0pIHsKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19EQkdfTU9ERTAsIDApOworCQlXUklURV9WUkVHKEhFVkNfU0FPX0RCR19NT0RFMSwgMCk7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgdmgyNjVfbG9jYWxfaW5pdChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWludCBpOworCWludCByZXQgPSAtMTsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhoZXZjKTsKKworI2lmZGVmIERFQlVHX1BUUworCWhldmMtPnB0c19taXNzZWQgPSAwOworCWhldmMtPnB0c19oaXQgPSAwOworI2VuZGlmCisJaGV2Yy0+c2F2ZWRfcmVzb2x1dGlvbiA9IDA7CisJaGV2Yy0+Z2V0X2ZyYW1lX2R1ciA9IGZhbHNlOworCWhldmMtPmZyYW1lX3dpZHRoID0gaGV2Yy0+dmgyNjVfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGg7CisJaGV2Yy0+ZnJhbWVfaGVpZ2h0ID0gaGV2Yy0+dmgyNjVfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0OworCWlmIChpc19vdmVyc2l6ZShoZXZjLT5mcmFtZV93aWR0aCwgaGV2Yy0+ZnJhbWVfaGVpZ2h0KSkgeworCQlwcl9pbmZvKCJvdmVyIHNpemUgOiAldSB4ICV1LlxuIiwKKwkJCWhldmMtPmZyYW1lX3dpZHRoLCBoZXZjLT5mcmFtZV9oZWlnaHQpOworCQloZXZjLT5mYXRhbF9lcnJvciB8PSBERUNPREVSX0ZBVEFMX0VSUk9SX1NJWkVfT1ZFUkZMT1c7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGhldmMtPm1heF9waWNfdyAmJiBoZXZjLT5tYXhfcGljX2gpIHsKKwkJaGV2Yy0+aXNfNGsgPSAhKGhldmMtPm1heF9waWNfdyAmJiBoZXZjLT5tYXhfcGljX2gpIHx8CisJCQkoKGhldmMtPm1heF9waWNfdyAqIGhldmMtPm1heF9waWNfaCkgPgorCQkJMTkyMCAqIDEwODgpID8gdHJ1ZSA6IGZhbHNlOworCX0gZWxzZSB7CisJCWhldmMtPmlzXzRrID0gIShoZXZjLT5mcmFtZV93aWR0aCAmJiBoZXZjLT5mcmFtZV9oZWlnaHQpIHx8CisJCQkoKGhldmMtPmZyYW1lX3dpZHRoICogaGV2Yy0+ZnJhbWVfaGVpZ2h0KSA+CisJCQkxOTIwICogMTA4OCkgPyB0cnVlIDogZmFsc2U7CisJfQorCisJaGV2Yy0+ZnJhbWVfZHVyID0KKwkJKGhldmMtPnZoMjY1X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgPT0KKwkJIDApID8gMzYwMCA6IGhldmMtPnZoMjY1X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGU7CisJLy9oZXZjLT5ndnMtPmZyYW1lX2R1ciA9IGhldmMtPmZyYW1lX2R1cjsKKwlpZiAoaGV2Yy0+ZnJhbWVfd2lkdGggJiYgaGV2Yy0+ZnJhbWVfaGVpZ2h0KQorCQloZXZjLT5mcmFtZV9hciA9IGhldmMtPmZyYW1lX2hlaWdodCAqIDB4MTAwIC8gaGV2Yy0+ZnJhbWVfd2lkdGg7CisKKwlpZiAoaV9vbmx5X2ZsYWcpCisJCWhldmMtPmlfb25seSA9IGlfb25seV9mbGFnICYgMHhmZjsKKwllbHNlIGlmICgodW5zaWduZWQgbG9uZykgaGV2Yy0+dmgyNjVfYW1zdHJlYW1fZGVjX2luZm8ucGFyYW0KKwkJJiAweDA4KQorCQloZXZjLT5pX29ubHkgPSAweDc7CisJZWxzZQorCQloZXZjLT5pX29ubHkgPSAweDA7CisJaGV2Yy0+ZXJyb3Jfd2F0Y2hkb2dfY291bnQgPSAwOworCWhldmMtPnNlaV9wcmVzZW50X2ZsYWcgPSAwOworCWlmICh2ZGVjLT5zeXNfaW5mbykKKwkJcHRzX3Vuc3RhYmxlID0gKCh1bnNpZ25lZCBsb25nKXZkZWMtPnN5c19pbmZvLT5wYXJhbQorCQkJJiAweDQwKSA+PiA2OworCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJImgyNjU6cHRzX3Vuc3RhYmxlPSVkXG4iLCBwdHNfdW5zdGFibGUpOworLyoKKyAqVE9ETzpGT1IgVkVSU0lPTgorICovCisJaGV2Y19wcmludChoZXZjLCAwLAorCQkiaDI2NTogdmVyICglZCwlZCkgZGVjaW5mbzogJWR4JWQgcmF0ZT0lZFxuIiwgaDI2NV92ZXJzaW9uLAorCQkgICAwLCBoZXZjLT5mcmFtZV93aWR0aCwgaGV2Yy0+ZnJhbWVfaGVpZ2h0LCBoZXZjLT5mcmFtZV9kdXIpOworCisJaWYgKGhldmMtPmZyYW1lX2R1ciA9PSAwKQorCQloZXZjLT5mcmFtZV9kdXIgPSA5NjAwMCAvIDI0OworCisJSU5JVF9LRklGTyhoZXZjLT5kaXNwbGF5X3EpOworCUlOSVRfS0ZJRk8oaGV2Yy0+bmV3ZnJhbWVfcSk7CisJSU5JVF9LRklGTyhoZXZjLT5wZW5kaW5nX3EpOworCisJZm9yIChpID0gMDsgaSA8IFZGX1BPT0xfU0laRTsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqdmYgPSAmaGV2Yy0+dmZwb29sW2ldOworCisJCWhldmMtPnZmcG9vbFtpXS5pbmRleCA9IC0xOworCQlrZmlmb19wdXQoJmhldmMtPm5ld2ZyYW1lX3EsIHZmKTsKKwl9CisKKwlpZiAoIWhldmMtPnJlc29sdXRpb25fY2hhbmdlKQorCQlyZXQgPSBoZXZjX2xvY2FsX2luaXQoaGV2Yyk7CisJZWxzZQorCQlyZXQgPSAwOworCisJcmV0dXJuIHJldDsKK30KKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCitzdGF0aWMgczMyIHZoMjY1X2luaXQoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjID0gKHN0cnVjdCBoZXZjX3N0YXRlX3MgKil2ZGVjLT5wcml2YXRlOworI2Vsc2UKK3N0YXRpYyBzMzIgdmgyNjVfaW5pdChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCisjZW5kaWYKKwlpbnQgcmV0LCBzaXplID0gLTE7CisJaW50IGZ3X3NpemUgPSAweDEwMDAgKiAxNjsKKwlzdHJ1Y3QgZmlybXdhcmVfcyAqZncgPSBOVUxMOworCisJdGltZXJfc2V0dXAoJmhldmMtPnRpbWVyLCB2aDI2NV9jaGVja190aW1lcl9mdW5jLCAwKTsKKworCWhldmMtPnN0YXQgfD0gU1RBVF9USU1FUl9JTklUOworCisJaWYgKGhldmMtPm1faW5zX2ZsYWcpIHsKKyNpZmRlZiBVU0VfVU5JTklUX1NFTUEKKwkJc2VtYV9pbml0KCZoZXZjLT5oMjY1X3VuaW5pdF9kb25lX3NlbWEsIDApOworI2VuZGlmCisJCUlOSVRfV09SSygmaGV2Yy0+d29yaywgdmgyNjVfd29yayk7CisJCUlOSVRfV09SSygmaGV2Yy0+dGltZW91dF93b3JrLCB2aDI2NV90aW1lb3V0X3dvcmspOworCX0KKworCWlmICh2aDI2NV9sb2NhbF9pbml0KGhldmMpIDwgMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCW11dGV4X2luaXQoJmhldmMtPmNodW5rc19tdXRleCk7CisJSU5JVF9XT1JLKCZoZXZjLT5ub3RpZnlfd29yaywgdmgyNjVfbm90aWZ5X3dvcmspOworCUlOSVRfV09SSygmaGV2Yy0+c2V0X2Nsa193b3JrLCB2aDI2NV9zZXRfY2xrKTsKKworCWZ3ID0gdnphbGxvYyhzaXplb2Yoc3RydWN0IGZpcm13YXJlX3MpICsgZndfc2l6ZSk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGZ3KSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoaGV2Yy0+bW11X2VuYWJsZSkKKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWE0pCisJCQlzaXplID0gZ2V0X2Zpcm13YXJlX2RhdGEoVklERU9fREVDX0hFVkNfTU1VLCBmdy0+ZGF0YSk7CisJCWVsc2UgeworCQkJaWYgKCFoZXZjLT5pc180aykgeworCQkJCS8qIGlmIGFuIG9sZGVyIHZlcnNpb24gb2YgdGhlIGZ3IHdhcyBsb2FkZWQsICovCisJCQkJLyogbmVlZHMgdHJ5IHRvIGxvYWQgbm9zd2FwIGZ3IGJlY2F1c2UgdGhlICovCisJCQkJLyogb2xkIGZ3IHBhY2thZ2UgZG9zZSBub3QgY29udGFpbiB0aGUgc3dhcCBmdy4qLworCQkJCXNpemUgPSBnZXRfZmlybXdhcmVfZGF0YSgKKwkJCQkJVklERU9fREVDX0hFVkNfTU1VX1NXQVAsIGZ3LT5kYXRhKTsKKwkJCQlpZiAoc2l6ZSA8IDApCisJCQkJCXNpemUgPSBnZXRfZmlybXdhcmVfZGF0YSgKKwkJCQkJCVZJREVPX0RFQ19IRVZDX01NVSwgZnctPmRhdGEpOworCQkJCWVsc2UgaWYgKHNpemUpCisJCQkJCWhldmMtPmlzX3N3YXAgPSB0cnVlOworCQkJfSBlbHNlCisJCQkJc2l6ZSA9IGdldF9maXJtd2FyZV9kYXRhKFZJREVPX0RFQ19IRVZDX01NVSwKKwkJCQkJZnctPmRhdGEpOworCQl9CisJZWxzZQorCQlzaXplID0gZ2V0X2Zpcm13YXJlX2RhdGEoVklERU9fREVDX0hFVkMsIGZ3LT5kYXRhKTsKKworCWlmIChzaXplIDwgMCkgeworCQlwcl9lcnIoImdldCBmaXJtd2FyZSBmYWlsLlxuIik7CisJCXZmcmVlKGZ3KTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZ3LT5sZW4gPSBzaXplOworCisjaWZkZWYgU1dBUF9IRVZDX1VDT0RFCisJaWYgKCF0ZWVfZW5hYmxlZCgpICYmIGhldmMtPmlzX3N3YXAgJiYKKwkJZ2V0X2NwdV9tYWpvcl9pZCgpIDw9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWE0pIHsKKwkJaWYgKGhldmMtPm1tdV9lbmFibGUpIHsKKwkJCWhldmMtPnN3YXBfc2l6ZSA9ICg0ICogKDQgKiBTWl8xSykpOyAvKm1heCA0IHN3YXAgY29kZSwgZWFjaCAweDQwMCovCisJCQloZXZjLT5tY19jcHVfYWRkciA9CisJCQkJZG1hX2FsbG9jX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQkJaGV2Yy0+c3dhcF9zaXplLAorCQkJCQkmaGV2Yy0+bWNfZG1hX2hhbmRsZSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWhldmMtPm1jX2NwdV9hZGRyKSB7CisJCQkJYW1oZXZjX2Rpc2FibGUoKTsKKwkJCQlwcl9pbmZvKCJ2aDI2NSBtbXUgc3dhcCB1Y29kZSBsb2FkZWQgZmFpbC5cbiIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCisJCQltZW1jcHkoKHU4ICopIGhldmMtPm1jX2NwdV9hZGRyLCBmdy0+ZGF0YSArIFNXQVBfSEVWQ19PRkZTRVQsCisJCQkJaGV2Yy0+c3dhcF9zaXplKTsKKworCQkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJCSJ2aDI2NSBtbXUgdWNvZGUgc3dhcCBsb2FkZWQgJXhcbiIsCisJCQkJaGV2Yy0+bWNfZG1hX2hhbmRsZSk7CisJCX0KKwl9CisjZW5kaWYKKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlpZiAoaGV2Yy0+bV9pbnNfZmxhZykgeworCQkvL2hldmMtPnRpbWVyLmRhdGEgPSAodWxvbmcpIGhldmM7CisJCS8vaGV2Yy0+dGltZXIuZnVuY3Rpb24gPSB2aDI2NV9jaGVja190aW1lcl9mdW5jOworCQloZXZjLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIFBVVF9JTlRFUlZBTDsKKworCQloZXZjLT5mdyA9IGZ3OworCQloZXZjLT5pbml0X2ZsYWcgPSAxOworCisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCWFtaGV2Y19lbmFibGUoKTsKKworCWlmIChoZXZjLT5tbXVfZW5hYmxlKQorCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID4gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTSkKKwkJCXJldCA9IGFtaGV2Y19sb2FkbWNfZXgoVkZPUk1BVF9IRVZDLCAiaDI2NV9tbXUiLCBmdy0+ZGF0YSk7CisJCWVsc2UgeworCQkJaWYgKCFoZXZjLT5pc180aykgeworCQkJCS8qIGlmIGFuIG9sZGVyIHZlcnNpb24gb2YgdGhlIGZ3IHdhcyBsb2FkZWQsICovCisJCQkJLyogbmVlZHMgdHJ5IHRvIGxvYWQgbm9zd2FwIGZ3IGJlY2F1c2UgdGhlICovCisJCQkJLyogb2xkIGZ3IHBhY2thZ2UgZG9zZSBub3QgY29udGFpbiB0aGUgc3dhcCBmdy4gKi8KKwkJCQlyZXQgPSBhbWhldmNfbG9hZG1jX2V4KFZGT1JNQVRfSEVWQywKKwkJCQkJImhldmNfbW11X3N3YXAiLCBmdy0+ZGF0YSk7CisJCQkJaWYgKHJldCA8IDApCisJCQkJCXJldCA9IGFtaGV2Y19sb2FkbWNfZXgoVkZPUk1BVF9IRVZDLAorCQkJCQkJImgyNjVfbW11IiwgZnctPmRhdGEpOworCQkJCWVsc2UKKwkJCQkJaGV2Yy0+aXNfc3dhcCA9IHRydWU7CisJCQl9IGVsc2UKKwkJCQlyZXQgPSBhbWhldmNfbG9hZG1jX2V4KFZGT1JNQVRfSEVWQywKKwkJCQkJImgyNjVfbW11IiwgZnctPmRhdGEpOworCQl9CisJZWxzZQorCQlyZXQgPSBhbWhldmNfbG9hZG1jX2V4KFZGT1JNQVRfSEVWQywgTlVMTCwgZnctPmRhdGEpOworCisJaWYgKHJldCA8IDApIHsKKwkJYW1oZXZjX2Rpc2FibGUoKTsKKwkJdmZyZWUoZncpOworCQlwcl9lcnIoIkgyNjU6IHRoZSAlcyBmdyBsb2FkaW5nIGZhaWxlZCwgZXJyOiAleFxuIiwKKwkJCXRlZV9lbmFibGVkKCkgPyAiVEVFIiA6ICJsb2NhbCIsIHJldCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJdmZyZWUoZncpOworCisJaGV2Yy0+c3RhdCB8PSBTVEFUX01DX0xPQUQ7CisKKyNpZmRlZiBERVRSRUZJTExfRU5BQkxFCisJaWYgKGhldmMtPmlzX3N3YXAgJiYKKwkJZ2V0X2NwdV9tYWpvcl9pZCgpIDw9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWE0pCisJCWluaXRfZGV0cmVmaWxsX2J1ZihoZXZjKTsKKyNlbmRpZgorCS8qIGVuYWJsZSBBTVJJU0Mgc2lkZSBwcm90b2NvbCAqLworCXZoMjY1X3Byb3RfaW5pdChoZXZjKTsKKworCWlmICh2ZGVjX3JlcXVlc3RfdGhyZWFkZWRfaXJxKFZERUNfSVJRXzAsIHZoMjY1X2lzciwKKwkJCQl2aDI2NV9pc3JfdGhyZWFkX2ZuLAorCQkJCUlSUUZfT05FU0hPVCwvKnJ1biB0aHJlYWQgb24gdGhpcyBpcnEgZGlzYWJsZWQqLworCQkJCSJ2aDI2NS1pcnEiLCAodm9pZCAqKWhldmMpKSB7CisJCWhldmNfcHJpbnQoaGV2YywgMCwgInZoMjY1IGlycSByZWdpc3RlciBlcnJvci5cbiIpOworCQlhbWhldmNfZGlzYWJsZSgpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwloZXZjLT5zdGF0IHw9IFNUQVRfSVNSX1JFRzsKKwloZXZjLT5wcm92aWRlcl9uYW1lID0gUFJPVklERVJfTkFNRTsKKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlpZiAoIWhldmMtPmlzX3VzZWRfdjRsKSB7CisJCXZmX3Byb3ZpZGVyX2luaXQoJnZoMjY1X3ZmX3Byb3YsIGhldmMtPnByb3ZpZGVyX25hbWUsCisJCQkJCSZ2aDI2NV92Zl9wcm92aWRlciwgdmRlYyk7CisJCXZmX3JlZ19wcm92aWRlcigmdmgyNjVfdmZfcHJvdik7CisJCXZmX25vdGlmeV9yZWNlaXZlcihoZXZjLT5wcm92aWRlcl9uYW1lLCBWRlJBTUVfRVZFTlRfUFJPVklERVJfU1RBUlQsCisJCQkJCU5VTEwpOworCQlpZiAoaGV2Yy0+ZnJhbWVfZHVyICE9IDApIHsKKwkJCWlmICghaXNfcmVzZXQpIHsKKwkJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoaGV2Yy0+cHJvdmlkZXJfbmFtZSwKKwkJCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9GUl9ISU5ULAorCQkJCQkJKHZvaWQgKikKKwkJCQkJCSgodW5zaWduZWQgbG9uZyloZXZjLT5mcmFtZV9kdXIpKTsKKwkJCQlmcl9oaW50X3N0YXR1cyA9IFZERUNfSElOVEVEOworCQkJfQorCQl9IGVsc2UKKwkJCWZyX2hpbnRfc3RhdHVzID0gVkRFQ19ORUVEX0hJTlQ7CisJfQorI2Vsc2UKKwl2Zl9wcm92aWRlcl9pbml0KCZ2aDI2NV92Zl9wcm92LCBQUk9WSURFUl9OQU1FLCAmdmgyNjVfdmZfcHJvdmlkZXIsCisJCQkJCSBoZXZjKTsKKwl2Zl9yZWdfcHJvdmlkZXIoJnZoMjY1X3ZmX3Byb3YpOworCXZmX25vdGlmeV9yZWNlaXZlcihQUk9WSURFUl9OQU1FLCBWRlJBTUVfRVZFTlRfUFJPVklERVJfU1RBUlQsIE5VTEwpOworCWlmIChoZXZjLT5mcmFtZV9kdXIgIT0gMCkgeworCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoUFJPVklERVJfTkFNRSwKKwkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfRlJfSElOVCwKKwkJCQkodm9pZCAqKQorCQkJCSgodW5zaWduZWQgbG9uZyloZXZjLT5mcmFtZV9kdXIpKTsKKwkJZnJfaGludF9zdGF0dXMgPSBWREVDX0hJTlRFRDsKKwl9IGVsc2UKKwkJZnJfaGludF9zdGF0dXMgPSBWREVDX05FRURfSElOVDsKKyNlbmRpZgorCWhldmMtPnN0YXQgfD0gU1RBVF9WRl9IT09LOworCisJLy9oZXZjLT50aW1lci5kYXRhID0gKHVsb25nKSBoZXZjOworCS8vaGV2Yy0+dGltZXIuZnVuY3Rpb24gPSB2aDI2NV9jaGVja190aW1lcl9mdW5jOworCWhldmMtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgUFVUX0lOVEVSVkFMOworCisJYWRkX3RpbWVyKCZoZXZjLT50aW1lcik7CisKKwloZXZjLT5zdGF0IHw9IFNUQVRfVElNRVJfQVJNOworCisJaWYgKHVzZV9jbWEpIHsKKyNpZmRlZiBVU0VfVU5JTklUX1NFTUEKKwkJc2VtYV9pbml0KCZoZXZjLT5oMjY1X3VuaW5pdF9kb25lX3NlbWEsIDApOworI2VuZGlmCisJCWlmIChoMjY1X3Rhc2sgPT0gTlVMTCkgeworCQkJc2VtYV9pbml0KCZoMjY1X3NlbWEsIDEpOworCQkJaDI2NV90YXNrID0KKwkJCQlrdGhyZWFkX3J1bihoMjY1X3Rhc2tfaGFuZGxlLCBoZXZjLAorCQkJCQkJImt0aHJlYWRfaDI2NSIpOworCQl9CisJfQorCS8qIGhldmMtPnN0YXQgfD0gU1RBVF9LVEhSRUFEOyAqLworI2lmIDAKKwlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgSDI2NV9ERUJVR19GT1JDRV9DTEspIHsKKwkJaGV2Y19wcmludChoZXZjLCAwLCAiJXMgZm9yY2UgY2xrXG4iLCBfX2Z1bmNfXyk7CisJCVdSSVRFX1ZSRUcoSEVWQ19JUUlUX0NMS19SU1RfQ1RSTCwKKwkJCQkgICBSRUFEX1ZSRUcoSEVWQ19JUUlUX0NMS19SU1RfQ1RSTCkgfAorCQkJCSAgICgoMSA8PCAyKSB8ICgxIDw8IDEpKSk7CisJCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGRzAsCisJCQkJUkVBRF9WUkVHKEhFVkNfREJMS19DRkcwKSB8ICgoMSA8PCAyKSB8CisJCQkJCSgxIDw8IDEpIHwgMHgzZmZmMDAwMCkpOy8qIDIsMjk6MTYgKi8KKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMMSwgUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkwxKSB8CisJCQkJKDEgPDwgMikpOwkvKiAyICovCisJCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9DVFJMMSwgUkVBRF9WUkVHKEhFVkNfTVBSRURfQ1RSTDEpIHwKKwkJCQkoMSA8PCAyNCkpOwkvKiAyNCAqLworCQlXUklURV9WUkVHKEhFVkNfU1RSRUFNX0NPTlRST0wsCisJCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0NPTlRST0wpIHwKKwkJCQkoMSA8PCAxNSkpOwkvKiAxNSAqLworCQlXUklURV9WUkVHKEhFVkNfQ0FCQUNfQ09OVFJPTCwgUkVBRF9WUkVHKEhFVkNfQ0FCQUNfQ09OVFJPTCkgfAorCQkJCSgxIDw8IDEzKSk7CS8qIDEzICovCisJCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfQ09SRV9DT05UUk9MLAorCQkJCVJFQURfVlJFRyhIRVZDX1BBUlNFUl9DT1JFX0NPTlRST0wpIHwKKwkJCQkoMSA8PCAxNSkpOwkvKiAxNSAqLworCQlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0lOVF9DT05UUk9MLAorCQkJCVJFQURfVlJFRyhIRVZDX1BBUlNFUl9JTlRfQ09OVFJPTCkgfAorCQkJCSgxIDw8IDE1KSk7CS8qIDE1ICovCisJCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfSUZfQ09OVFJPTCwKKwkJCQlSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfSUZfQ09OVFJPTCkgfCAoKDEgPDwgNikgfAorCQkJCQkoMSA8PCAzKSB8ICgxIDw8IDEpKSk7CS8qIDYsIDMsIDEgKi8KKwkJV1JJVEVfVlJFRyhIRVZDRF9JUFBfRFlOQ0xLR0FURV9DT05GSUcsIDB4ZmZmZmZmZmYpOwkvKiAzMTowICovCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMSwgUkVBRF9WUkVHKEhFVkNEX01DUkNDX0NUTDEpIHwKKwkJCQkoMSA8PCAzKSk7CS8qIDMgKi8KKwl9CisjZW5kaWYKKyNpZmRlZiBTV0FQX0hFVkNfVUNPREUKKwlpZiAoIXRlZV9lbmFibGVkKCkgJiYgaGV2Yy0+aXNfc3dhcCAmJgorCQlnZXRfY3B1X21ham9yX2lkKCkgPD0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTSkgeworCQlXUklURV9WUkVHKEhFVkNfU1RSRUFNX1NXQVBfQlVGRkVSMiwgaGV2Yy0+bWNfZG1hX2hhbmRsZSk7CisJCS8qcHJfaW5mbygid3JpdGUgc3dhcCBidWZmZXIgJXhcbiIsICh1MzIpKGhldmMtPm1jX2RtYV9oYW5kbGUpKTsqLworCX0KKyNlbmRpZgorCisjaWZuZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlzZXRfdmRlY19mdW5jKCZ2aDI2NV9kZWNfc3RhdHVzKTsKKyNlbmRpZgorCWFtaGV2Y19zdGFydCgpOworCisJV1JJVEVfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQsIDApOworCisJaGV2Yy0+c3RhdCB8PSBTVEFUX1ZERUNfUlVOOworCWhldmMtPmluaXRfZmxhZyA9IDE7CisJZXJyb3JfaGFuZGxlX3RocmVzaG9sZCA9IDMwOworCS8qIHByX2luZm8oIiVkLCB2aDI2NV9pbml0LCBSUD0weCV4XG4iLAorCSAqICAgX19MSU5FX18sIFJFQURfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIpKTsKKwkgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX2RpcnR5X2RhdGEoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjID0KKwkJKHN0cnVjdCBoZXZjX3N0YXRlX3MgKikodmRlYy0+cHJpdmF0ZSk7CisJc3RydWN0IHZkZWNfaW5wdXRfcyAqaW5wdXQgPSAmdmRlYy0+aW5wdXQ7CisJdTMyIHdwLCBycCwgbGV2ZWw7CisJdTMyIHJwX3NldDsKKworCXJwID0gU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3JwKTsKKwl3cCA9IGhldmMtPnByZV9wYXJzZXJfd3JfcHRyOworCisJaWYgKHdwID4gcnApCisJCWxldmVsID0gd3AgLSBycDsKKwllbHNlCisJCWxldmVsID0gd3AgKyB2ZGVjLT5pbnB1dC5zaXplIC0gcnA7CisKKwlpZiAobGV2ZWwgPiAweDEwMDAwMCkgeworCQl1MzIgc2tpcF9zaXplID0gKChsZXZlbCA+PiAxKSA+PiAxOSkgPDwgMTk7CisJCWlmICghdmRlYy0+aW5wdXQuc3dhcF92YWxpZCkgeworCQkJaGV2Y19wcmludChoZXZjICwgMCwgImgyNjUgc3RhcnQgZGF0YSBkaXNjYXJkIGxldmVsIDB4JXgsIGJ1ZmZlciBsZXZlbCAweCV4LCBSUCAweCV4LCBXUCAweCV4XG4iLAorCQkJCSgobGV2ZWwgPj4gMSkgPj4gMTkpIDw8IDE5LCBsZXZlbCwgcnAsIHdwKTsKKwkJCWlmICh3cCA+PSBycCkgeworCQkJCXJwX3NldCA9IHJwICsgc2tpcF9zaXplOworCQkJfQorCQkJZWxzZSBpZiAoKHJwICsgc2tpcF9zaXplKSA8IChpbnB1dC0+c3RhcnQgKyBpbnB1dC0+c2l6ZSkpIHsKKwkJCQlycF9zZXQgPSBycCArIHNraXBfc2l6ZTsKKwkJCX0gZWxzZSB7CisJCQkJcnBfc2V0ID0gcnAgKyBza2lwX3NpemUgLSBpbnB1dC0+c2l6ZTsKKwkJCX0KKwkJCVNUQlVGX1dSSVRFKCZ2ZGVjLT52YnVmLCBzZXRfcnAsIHJwX3NldCk7CisJCQl2ZGVjLT5kaXNjYXJkX3N0YXJ0X2RhdGFfZmxhZyA9IDE7CisJCQl2ZGVjLT5pbnB1dC5zdHJlYW1fY29va2llICs9IHNraXBfc2l6ZTsKKwkJCWhldmMtPmRpcnR5X3NoaWZ0X2ZsYWcgPSAxOworCQl9CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKK3N0YXRpYyB2b2lkIHJlc2V0X3Byb2Nlc3NfdGltZShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWlmIChoZXZjLT5zdGFydF9wcm9jZXNzX3RpbWUpIHsKKwkJdW5zaWduZWQgaW50IHByb2Nlc3NfdGltZSA9CisJCQkxMDAwICogKGppZmZpZXMgLSBoZXZjLT5zdGFydF9wcm9jZXNzX3RpbWUpIC8gSFo7CisJCWhldmMtPnN0YXJ0X3Byb2Nlc3NfdGltZSA9IDA7CisJCWlmIChwcm9jZXNzX3RpbWUgPiBtYXhfcHJvY2Vzc190aW1lW2hldmMtPmluZGV4XSkKKwkJCW1heF9wcm9jZXNzX3RpbWVbaGV2Yy0+aW5kZXhdID0gcHJvY2Vzc190aW1lOworCX0KK30KKworc3RhdGljIHZvaWQgc3RhcnRfcHJvY2Vzc190aW1lKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJaGV2Yy0+c3RhcnRfcHJvY2Vzc190aW1lID0gamlmZmllczsKKwloZXZjLT5kZWNvZGVfdGltZW91dF9jb3VudCA9IDI7CisJaGV2Yy0+bGFzdF9sY3VfaWR4ID0gMDsKK30KKworc3RhdGljIHZvaWQgcmVzdGFydF9wcm9jZXNzX3RpbWUoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwloZXZjLT5zdGFydF9wcm9jZXNzX3RpbWUgPSBqaWZmaWVzOworCWhldmMtPmRlY29kZV90aW1lb3V0X2NvdW50ID0gMjsKK30KKworc3RhdGljIHZvaWQgdGltZW91dF9wcm9jZXNzKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJLyoKKwkgKiBJbiB0aGlzIHZlcnkgdGltZW91dCBwb2ludCx0aGUgdmgyNjVfd29yayBhcnJpdmVzLAorCSAqIG9yIGluIHNvbWUgY2FzZXMgdGhlIHN5c3RlbSBiZWNvbWUgc2xvdywgIHRoZW4gY29tZQorCSAqIHRoaXMgc2Vjb25kIHRpbWVvdXQuIEluIGJvdGggY2FzZXMgd2UgcmV0dXJuLgorCSAqLworCWlmICh3b3JrX3BlbmRpbmcoJmhldmMtPndvcmspIHx8CisJICAgIHdvcmtfYnVzeSgmaGV2Yy0+d29yaykgfHwKKwkgICAgd29ya19idXN5KCZoZXZjLT50aW1lb3V0X3dvcmspIHx8CisJICAgIHdvcmtfcGVuZGluZygmaGV2Yy0+dGltZW91dF93b3JrKSkgeworCQlwcl9lcnIoIiVzIGgyNjVbJWRdIHdvcmsgcGVuZGluZywgZG8gbm90aGluZy5cbiIsX19mdW5jX18sIGhldmMtPmluZGV4KTsKKwkJcmV0dXJuOworCX0KKworCWhldmMtPnRpbWVvdXRfbnVtKys7CisJYW1oZXZjX3N0b3AoKTsKKwlyZWFkX2RlY29kZV9pbmZvKGhldmMpOworCisJaGV2Y19wcmludChoZXZjLAorCQkwLCAiJXMgZGVjb2RlciB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CisJY2hlY2tfcGljX2RlY29kZWRfZXJyb3IoaGV2YywKKwkJCQloZXZjLT5waWNfZGVjb2RlZF9sY3VfaWR4KTsKKwkvKlRoZSBjdXJyZW50IGRlY29kZWQgZnJhbWUgaXMgbWFya2VkCisJCWVycm9yIHdoZW4gdGhlIGRlY29kZSB0aW1lb3V0Ki8KKwlpZiAoaGV2Yy0+Y3VyX3BpYyAhPSBOVUxMKQorCQloZXZjLT5jdXJfcGljLT5lcnJvcl9tYXJrID0gMTsKKwloZXZjLT5kZWNvZGVkX3BvYyA9IGhldmMtPmN1cnJfUE9DOworCWhldmMtPmRlY29kaW5nX3BpYyA9IE5VTEw7CisJaGV2Yy0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwlyZXNldF9wcm9jZXNzX3RpbWUoaGV2Yyk7CisKKwlpZiAod29ya19wZW5kaW5nKCZoZXZjLT53b3JrKSkKKwkJcmV0dXJuOworCXZkZWNfc2NoZWR1bGVfd29yaygmaGV2Yy0+dGltZW91dF93b3JrKTsKK30KKworI2lmZGVmIENPTlNUUkFJTl9NQVhfQlVGX05VTQorc3RhdGljIGludCBnZXRfdmZfcmVmX29ubHlfYnVmX2NvdW50KHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJc3RydWN0IFBJQ19zICpwaWM7CisJaW50IGk7CisJaW50IGNvdW50ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9QSUNfTlVNOyBpKyspIHsKKwkJcGljID0gaGV2Yy0+bV9QSUNbaV07CisJCWlmIChwaWMgPT0gTlVMTCB8fCBwaWMtPmluZGV4ID09IC0xKQorCQkJY29udGludWU7CisJCWlmIChwaWMtPm91dHB1dF9tYXJrID09IDAgJiYgcGljLT5yZWZlcmVuY2VkID09IDAKKwkJCSYmIHBpYy0+b3V0cHV0X3JlYWR5ID09IDEpCisJCQljb3VudCsrOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBnZXRfdXNlZF9idWZfY291bnQoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwlzdHJ1Y3QgUElDX3MgKnBpYzsKKwlpbnQgaTsKKwlpbnQgY291bnQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVGX1BJQ19OVU07IGkrKykgeworCQlwaWMgPSBoZXZjLT5tX1BJQ1tpXTsKKwkJaWYgKHBpYyA9PSBOVUxMIHx8IHBpYy0+aW5kZXggPT0gLTEpCisJCQljb250aW51ZTsKKwkJaWYgKHBpYy0+b3V0cHV0X21hcmsgIT0gMCB8fCBwaWMtPnJlZmVyZW5jZWQgIT0gMAorCQkJfHwgcGljLT5vdXRwdXRfcmVhZHkgIT0gMCkKKwkJCWNvdW50Kys7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorI2VuZGlmCisKK3N0YXRpYyBib29sIGlzX2F2YWxpYWJsZV9idWZmZXIoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaGV2Yy0+djRsMl9jdHgpOworCXN0cnVjdCBQSUNfcyAqcGljID0gTlVMTDsKKwlpbnQgaSwgZnJlZV9jb3VudCA9IDA7CisJaW50IHVzZWRfY291bnQgPSAwOworCisJaWYgKChoZXZjLT51c2VkX2J1Zl9udW0gPT0gMCkgfHwKKwkJKGN0eC0+Y2FwX3Bvb2wuZGVjIDwgaGV2Yy0+dXNlZF9idWZfbnVtKSkgeworCQlpZiAoY3R4LT5mYl9vcHMucXVlcnkoJmN0eC0+ZmJfb3BzLCAmaGV2Yy0+ZmJfdG9rZW4pKSB7CisJCQlmcmVlX2NvdW50ID0KKwkJCQl2NGwyX20ybV9udW1fZHN0X2J1ZnNfcmVhZHkoY3R4LT5tMm1fY3R4KSArIDE7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaGV2Yy0+dXNlZF9idWZfbnVtOyBpKyspIHsKKwkJcGljID0gaGV2Yy0+bV9QSUNbaV07CisJCWlmIChwaWMgPT0gTlVMTCB8fAorCQkJcGljLT5pbmRleCA9PSAtMSB8fAorCQkJcGljLT5CVUZfaW5kZXggPT0gLTEpCisJCQljb250aW51ZTsKKworCQlpZiAoKHBpYy0+b3V0cHV0X21hcmsgPT0gMCkgJiYKKwkJCShwaWMtPnJlZmVyZW5jZWQgPT0gMCkgJiYKKwkJCShwaWMtPm91dHB1dF9yZWFkeSA9PSAwKSAmJgorCQkJKHBpYy0+dmZfcmVmID09IDApICYmCisJCQlwaWMtPmNtYV9hbGxvY19hZGRyKSB7CisJCQlmcmVlX2NvdW50Kys7CisJCX0gZWxzZSBpZiAocGljLT5jbWFfYWxsb2NfYWRkcikKKwkJCXVzZWRfY291bnQrKzsKKwl9CisKKwlBVFJBQ0VfQ09VTlRFUigiVl9TVF9ERUMtZnJlZV9idWZmX2NvdW50IiwgZnJlZV9jb3VudCk7CisJQVRSQUNFX0NPVU5URVIoIlZfU1RfREVDLXVzZWRfYnVmZl9jb3VudCIsIHVzZWRfY291bnQpOworCisJcmV0dXJuIGZyZWVfY291bnQgPj0gcnVuX3JlYWR5X21pbl9idWZfbnVtID8gMSA6IDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGlzX25ld19waWNfYXZhaWxhYmxlKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJc3RydWN0IFBJQ19zICpuZXdfcGljID0gTlVMTDsKKwlzdHJ1Y3QgUElDX3MgKnBpYzsKKwkvKiByZWN5Y2xlIHVuLXVzZWQgcGljICovCisJaW50IGk7CisJaW50IHJlZl9waWMgPSAwOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGhldmMpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGhldmMtPnY0bDJfY3R4KTsKKwkvKnJldHVybiAxIGlmIHBpY19saXN0IGlzIG5vdCBpbml0aWFsaXplZCB5ZXQqLworCWlmIChoZXZjLT5waWNfbGlzdF9pbml0X2ZsYWcgIT0gMykKKwkJcmV0dXJuIDE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVGX1BJQ19OVU07IGkrKykgeworCQlwaWMgPSBoZXZjLT5tX1BJQ1tpXTsKKwkJaWYgKHBpYyA9PSBOVUxMIHx8IHBpYy0+aW5kZXggPT0gLTEgfHwgcGljLT5CVUZfaW5kZXggPT0gLTEpCisJCQljb250aW51ZTsKKwkJaWYgKHBpYy0+cmVmZXJlbmNlZCA9PSAxKQorCQkJcmVmX3BpYysrOworCQlpZiAocGljLT5vdXRwdXRfbWFyayA9PSAwICYmIHBpYy0+cmVmZXJlbmNlZCA9PSAwCisJCQkmJiBwaWMtPm91dHB1dF9yZWFkeSA9PSAwCisJCQkmJiBwaWMtPnZmX3JlZiA9PSAwCisJCQkpIHsKKwkJCWlmIChuZXdfcGljKSB7CisJCQkJaWYgKHBpYy0+UE9DIDwgbmV3X3BpYy0+UE9DKQorCQkJCQluZXdfcGljID0gcGljOworCQkJfSBlbHNlCisJCQkJbmV3X3BpYyA9IHBpYzsKKwkJfQorCX0KKwlpZiAoIWhldmMtPmlzX3VzZWRfdjRsICYmIG5ld19waWMgPT0gTlVMTCkgeworCQllbnVtIHJlY2V2aXZlcl9zdGFydF9lIHN0YXRlID0gUkVDRUlWRVJfSU5BQ1RJVkU7CisJCWlmICh2Zl9nZXRfcmVjZWl2ZXIodmRlYy0+dmZfcHJvdmlkZXJfbmFtZSkpIHsKKwkJCXN0YXRlID0KKwkJCXZmX25vdGlmeV9yZWNlaXZlcih2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9RVVJFWV9TVEFURSwKKwkJCQlOVUxMKTsKKwkJCWlmICgoc3RhdGUgPT0gUkVDRUlWRVJfU1RBVEVfTlVMTCkKKwkJCQl8fCAoc3RhdGUgPT0gUkVDRUlWRVJfU1RBVEVfTk9ORSkpCisJCQkJc3RhdGUgPSBSRUNFSVZFUl9JTkFDVElWRTsKKwkJfQorCQlpZiAoc3RhdGUgPT0gUkVDRUlWRVJfSU5BQ1RJVkUpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVGX1BJQ19OVU07IGkrKykgeworCQkJCWludCBwb2MgPSBJTlZBTElEX1BPQzsKKwkJCQlwaWMgPSBoZXZjLT5tX1BJQ1tpXTsKKwkJCQlpZiAocGljID09IE5VTEwgfHwgcGljLT5pbmRleCA9PSAtMSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCWlmICgocGljLT5yZWZlcmVuY2VkID09IDApICYmCisJCQkJCQkocGljLT5lcnJvcl9tYXJrID09IDEpICYmCisJCQkJCQkocGljLT5vdXRwdXRfbWFyayA9PSAxKSkgeworCQkJCQlpZiAocG9jID09IElOVkFMSURfUE9DIHx8ICAocGljLT5QT0MgPCBwb2MpKSB7CisJCQkJCQluZXdfcGljID0gcGljOworCQkJCQkJcG9jID0gcGljLT5QT0M7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCSAgICAgaWYgKG5ld19waWMpICB7CisJCQkJbmV3X3BpYy0+cmVmZXJlbmNlZCA9IDA7CisJCQkJbmV3X3BpYy0+b3V0cHV0X21hcmsgPSAwOworCQkJCXB1dF9tdl9idWYoaGV2YywgbmV3X3BpYyk7CisJCQkJaGV2Y19wcmludChoZXZjLCAwLCAiZm9yY2UgcmVsZWFzZSBlcnJvciAgcGljICVkICByZWNpZXZlX3N0YXRlICVkIFxuIiwgbmV3X3BpYy0+UE9DLCBzdGF0ZSk7CisJCQl9IGVsc2UgeworCQkJCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVGX1BJQ19OVU07IGkrKykgeworCQkJCQlwaWMgPSBoZXZjLT5tX1BJQ1tpXTsKKwkJCQkJaWYgKHBpYyA9PSBOVUxMIHx8IHBpYy0+aW5kZXggPT0gLTEpCisJCQkJCQljb250aW51ZTsKKwkJCQkJaWYgKChwaWMtPnJlZmVyZW5jZWQgPT0gMSkgJiYgKHBpYy0+ZXJyb3JfbWFyayA9PSAxKSkgeworCQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOworCQkJCQkJZmx1c2hfb3V0cHV0KGhldmMsIHBpYyk7CisJCQkJCQloZXZjX3ByaW50KGhldmMsIDAsICJEUEIgZXJyb3IsIG5lZWVkIGZvcm5jZSBmbHVzaCAgcmVjaWV2ZV9zdGF0ZSAlZCBcbiIsIHN0YXRlKTsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYgKChuZXdfcGljID09IE5VTEwpIHx8CisJCShoZXZjLT5pc191c2VkX3Y0bCAmJgorCQkoY3R4LT5wYXJhbV9zZXRzX2Zyb21fdWNvZGUpICYmCisJCShoZXZjLT52NGxfcGFyYW1zX3BhcnNlZCkgJiYKKwkJKGN0eC0+Y2FwX3Bvb2wuZGVjIDwgaGV2Yy0+dXNlZF9idWZfbnVtKSAmJiAhaXNfYXZhbGlhYmxlX2J1ZmZlcihoZXZjKSkpIHsKKwkJaW50IGRlY29kZV9jb3VudCA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9SRUZfUElDX05VTTsgaSsrKSB7CisJCQlwaWMgPSBoZXZjLT5tX1BJQ1tpXTsKKwkJCWlmIChwaWMgPT0gTlVMTCB8fCBwaWMtPmluZGV4ID09IC0xIHx8IHBpYy0+QlVGX2luZGV4ID09IC0xKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKChwaWMtPm91dHB1dF9yZWFkeSA9PSAwKSAmJiAocGljLT5vdXRwdXRfbWFyayAhPSAwIHx8CisJCQkJcGljLT5yZWZlcmVuY2VkICE9IDAgfHwKKwkJCQlwaWMtPnZmX3JlZiAhPSAwKSkKKwkJCQlkZWNvZGVfY291bnQrKzsKKwkJfQorCisJCWlmIChkZWNvZGVfY291bnQgPj0KKwkJCQloZXZjLT5wYXJhbS5wLnNwc19tYXhfZGVjX3BpY19idWZmZXJpbmdfbWludXMxXzAgKyBkZXRlY3Rfc3R1Y2tfYnVmZmVyX21hcmdpbikgeworCQkJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSAmIEgyNjVfREVCVUdfQlVGTUdSX01PUkUpCisJCQkJZHVtcF9waWNfbGlzdChoZXZjKTsKKwkJCWlmICghKGVycm9yX2hhbmRsZV9wb2xpY3kgJiAweDQwMCkpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CisJCQkJZmx1c2hfb3V0cHV0KGhldmMsIE5VTEwpOworCQkJCWhldmNfcHJpbnQoaGV2YywgSDI2NV9ERUJVR19CVUZNR1IsICJmbHVzaCBkcGIsIHJlZl9lcnJvcl9jb3VudCAlZCwgc3BzX21heF9kZWNfcGljX2J1ZmZlcmluZ19taW51czFfMCAlZFxuIiwKKwkJCQkJCWRlY29kZV9jb3VudCwgaGV2Yy0+cGFyYW0ucC5zcHNfbWF4X2RlY19waWNfYnVmZmVyaW5nX21pbnVzMV8wKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAobmV3X3BpYyAhPSBOVUxMKSA/IDEgOiAwOworfQorCitzdGF0aWMgdm9pZCBjaGVja19idWZmZXJfc3RhdHVzKHN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMpCit7CisJaW50IGk7CisJc3RydWN0IFBJQ19zICpuZXdfcGljID0gTlVMTDsKKwlzdHJ1Y3QgUElDX3MgKnBpYzsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhoZXZjKTsKKworCWVudW0gcmVjZXZpdmVyX3N0YXJ0X2Ugc3RhdGUgPSBSRUNFSVZFUl9JTkFDVElWRTsKKworCWlmIChoZXZjLT5pc191c2VkX3Y0bCkKKwkJcmV0dXJuOworCisJaWYgKHZmX2dldF9yZWNlaXZlcih2ZGVjLT52Zl9wcm92aWRlcl9uYW1lKSkgeworCQlzdGF0ZSA9CisJCXZmX25vdGlmeV9yZWNlaXZlcih2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1FVUkVZX1NUQVRFLAorCQkJTlVMTCk7CisJCWlmICgoc3RhdGUgPT0gUkVDRUlWRVJfU1RBVEVfTlVMTCkKKwkJCXx8IChzdGF0ZSA9PSBSRUNFSVZFUl9TVEFURV9OT05FKSkKKwkJCXN0YXRlID0gUkVDRUlWRVJfSU5BQ1RJVkU7CisJfQorCWlmIChoZXZjLT50aW1lb3V0X2ZsYWcgPT0gZmFsc2UpCisJCWhldmMtPnRpbWVvdXQgPSBqaWZmaWVzICsgSFogLyAyOworCisJaWYgKHN0YXRlID09IFJFQ0VJVkVSX0lOQUNUSVZFKQorCQloZXZjLT50aW1lb3V0X2ZsYWcgPSB0cnVlOworCWVsc2UKKwkJaGV2Yy0+dGltZW91dF9mbGFnID0gZmFsc2U7CisKKwlpZiAoc3RhdGUgPT0gUkVDRUlWRVJfSU5BQ1RJVkUgJiYgaGV2Yy0+dGltZW91dF9mbGFnICYmCisJCQkJdGltZV9hZnRlcihqaWZmaWVzLCBoZXZjLT50aW1lb3V0KSkgeworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9QSUNfTlVNOyBpKyspIHsKKwkJCWludCBwb2MgPSBJTlZBTElEX1BPQzsKKwkJCXBpYyA9IGhldmMtPm1fUElDW2ldOworCQkJaWYgKHBpYyA9PSBOVUxMIHx8IHBpYy0+aW5kZXggPT0gLTEpCisJCQkJCWNvbnRpbnVlOworCQkJaWYgKChwaWMtPnJlZmVyZW5jZWQgPT0gMCkgJiYKKwkJCQkJKHBpYy0+ZXJyb3JfbWFyayA9PSAxKSAmJgorCQkJCQkocGljLT5vdXRwdXRfbWFyayA9PSAxKSkgeworCQkJCWlmIChwb2MgPT0gSU5WQUxJRF9QT0MgfHwgIChwaWMtPlBPQyA8IHBvYykpIHsKKwkJCQkJbmV3X3BpYyA9IHBpYzsKKwkJCQkJcG9jID0gcGljLT5QT0M7CisJCQkJfQorCQkJfQorCQl9CisJICAgIGlmIChuZXdfcGljKSAgeworCQkJbmV3X3BpYy0+cmVmZXJlbmNlZCA9IDA7CisJCQluZXdfcGljLT5vdXRwdXRfbWFyayA9IDA7CisJCQlwdXRfbXZfYnVmKGhldmMsIG5ld19waWMpOworCQkJaGV2Y19wcmludChoZXZjLCAwLCAiY2hlY2tfYnVmZmVyX3N0YXR1cyBmb3JjZSByZWxlYXNlIGVycm9yICBwaWMgJWQgIHJlY2lldmVfc3RhdGUgJWQgXG4iLCBuZXdfcGljLT5QT0MsIHN0YXRlKTsKKwkJfSBlbHNlIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVGX1BJQ19OVU07IGkrKykgeworCQkJCXBpYyA9IGhldmMtPm1fUElDW2ldOworCQkJCWlmIChwaWMgPT0gTlVMTCB8fCBwaWMtPmluZGV4ID09IC0xKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoKHBpYy0+cmVmZXJlbmNlZCA9PSAxKSAmJiAocGljLT5lcnJvcl9tYXJrID09IDEpKSB7CisJCQkJCWZsdXNoX291dHB1dChoZXZjLCBwaWMpOworCQkJCQloZXZjX3ByaW50KGhldmMsIDAsICJjaGVja19idWZmZXJfc3RhdHVzIERQQiBlcnJvciwgbmVlZWQgZm9ybmNlIGZsdXNoICByZWNpZXZlX3N0YXRlICVkIFxuIiwgc3RhdGUpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKKworc3RhdGljIGludCB2bWgyNjVfc3RvcChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjKQoreworCWlmIChoZXZjLT5zdGF0ICYgU1RBVF9USU1FUl9BUk0pIHsKKwkJZGVsX3RpbWVyX3N5bmMoJmhldmMtPnRpbWVyKTsKKwkJaGV2Yy0+c3RhdCAmPSB+U1RBVF9USU1FUl9BUk07CisJfQorCWlmIChoZXZjLT5zdGF0ICYgU1RBVF9WREVDX1JVTikgeworCQlhbWhldmNfc3RvcCgpOworCQloZXZjLT5zdGF0ICY9IH5TVEFUX1ZERUNfUlVOOworCX0KKwlpZiAoaGV2Yy0+c3RhdCAmIFNUQVRfSVNSX1JFRykgeworCQl2ZGVjX2ZyZWVfaXJxKFZERUNfSVJRXzAsICh2b2lkICopaGV2Yyk7CisJCWhldmMtPnN0YXQgJj0gflNUQVRfSVNSX1JFRzsKKwl9CisKKwlpZiAoIWhldmMtPmlzX3VzZWRfdjRsICYmIGhldmMtPnN0YXQgJiBTVEFUX1ZGX0hPT0spIHsKKwkJaWYgKGZyX2hpbnRfc3RhdHVzID09IFZERUNfSElOVEVEKQorCQkJdmZfbm90aWZ5X3JlY2VpdmVyKGhldmMtPnByb3ZpZGVyX25hbWUsCisJCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9GUl9FTkRfSElOVCwKKwkJCQkJTlVMTCk7CisJCWZyX2hpbnRfc3RhdHVzID0gVkRFQ19OT19ORUVEX0hJTlQ7CisJCXZmX3VucmVnX3Byb3ZpZGVyKCZ2aDI2NV92Zl9wcm92KTsKKwkJaGV2Yy0+c3RhdCAmPSB+U1RBVF9WRl9IT09LOworCX0KKworCWhldmNfbG9jYWxfdW5pbml0KGhldmMpOworCisJaWYgKGhldmMtPmd2cykKKwkJa2ZyZWUoaGV2Yy0+Z3ZzKTsKKwloZXZjLT5ndnMgPSBOVUxMOworCisJaWYgKHVzZV9jbWEpIHsKKwkJaGV2Yy0+dW5pbml0X2xpc3QgPSAxOworCQlyZXNldF9wcm9jZXNzX3RpbWUoaGV2Yyk7CisJCWhldmMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0ZSRUVfQ0FOVkFTOworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmhldmMtPndvcmspOworCQlmbHVzaF93b3JrKCZoZXZjLT53b3JrKTsKKyNpZmRlZiBVU0VfVU5JTklUX1NFTUEKKwkJaWYgKGhldmMtPmluaXRfZmxhZykgeworCQkJZG93bigmaGV2Yy0+aDI2NV91bmluaXRfZG9uZV9zZW1hKTsKKwkJfQorI2Vsc2UKKwkJd2hpbGUgKGhldmMtPnVuaW5pdF9saXN0KQkvKiB3YWl0IHVuaW5pdCBjb21wbGV0ZSAqLworCQkJbXNsZWVwKDIwKTsKKyNlbmRpZgorCX0KKwloZXZjLT5pbml0X2ZsYWcgPSAwOworCWhldmMtPmZpcnN0X3NjX2NoZWNrZWQgPSAwOworCWNhbmNlbF93b3JrX3N5bmMoJmhldmMtPm5vdGlmeV93b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZoZXZjLT5zZXRfY2xrX3dvcmspOworCWNhbmNlbF93b3JrX3N5bmMoJmhldmMtPnRpbWVvdXRfd29yayk7CisJY2FuY2VsX3dvcmtfc3luYygmaGV2Yy0+d29yayk7CisJdW5pbml0X21tdV9idWZmZXJzKGhldmMpOworCisJdmZyZWUoaGV2Yy0+ZncpOworCWhldmMtPmZ3ID0gTlVMTDsKKworCWR1bXBfbG9nKGhldmMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBnZXRfZGF0YV9jaGVja19zdW0KKwkoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywgaW50IHNpemUpCit7CisJaW50IHN1bSA9IDA7CisJdTggKmRhdGEgPSBOVUxMOworCisJaWYgKCFoZXZjLT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJZGF0YSA9IGNvZGVjX21tX3ZtYXAoaGV2Yy0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQloZXZjLT5jaHVuay0+b2Zmc2V0LCBzaXplKTsKKwllbHNlCisJCWRhdGEgPSAoKHU4ICopaGV2Yy0+Y2h1bmstPmJsb2NrLT5zdGFydF92aXJ0KSArCisJCQloZXZjLT5jaHVuay0+b2Zmc2V0OworCisJc3VtID0gY3JjMzJfbGUoMCwgZGF0YSwgc2l6ZSk7CisKKwloZXZjX3ByaW50KGhldmMsIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCSIlczogc2l6ZSAweCV4IHN1bSAweCV4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IC4uICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCV9fZnVuY19fLCBzaXplLCBzdW0sCisJCWRhdGFbMF0sIGRhdGFbMV0sIGRhdGFbMl0sIGRhdGFbM10sCisJCWRhdGFbNF0sIGRhdGFbNV0sIGRhdGFbc2l6ZSAtIDRdLAorCQlkYXRhW3NpemUgLSAzXSwgZGF0YVtzaXplIC0gMl0sCisJCWRhdGFbc2l6ZSAtIDFdKTsKKworCWlmICghaGV2Yy0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIoZGF0YSk7CisJcmV0dXJuIHN1bTsKK30KKworc3RhdGljIHZvaWQgdmgyNjVfbm90aWZ5X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPQorCQkJCQkJY29udGFpbmVyX29mKHdvcmssCisJCQkJCQlzdHJ1Y3QgaGV2Y19zdGF0ZV9zLAorCQkJCQkJbm90aWZ5X3dvcmspOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGhldmMpOworCisJaWYgKGhldmMtPmlzX3VzZWRfdjRsKQorCQlyZXR1cm47CisKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJaWYgKHZkZWMtPmZyX2hpbnRfc3RhdGUgPT0gVkRFQ19ORUVEX0hJTlQpIHsKKwkJdmZfbm90aWZ5X3JlY2VpdmVyKGhldmMtPnByb3ZpZGVyX25hbWUsCisJCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9GUl9ISU5ULAorCQkJCQkodm9pZCAqKQorCQkJCQkoKHVuc2lnbmVkIGxvbmcpaGV2Yy0+ZnJhbWVfZHVyKSk7CisJCXZkZWMtPmZyX2hpbnRfc3RhdGUgPSBWREVDX0hJTlRFRDsKKwl9IGVsc2UgaWYgKGZyX2hpbnRfc3RhdHVzID09IFZERUNfTkVFRF9ISU5UKSB7CisJCXZmX25vdGlmeV9yZWNlaXZlcihoZXZjLT5wcm92aWRlcl9uYW1lLAorCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfRlJfSElOVCwKKwkJCQkJKHZvaWQgKikKKwkJCQkJKCh1bnNpZ25lZCBsb25nKWhldmMtPmZyYW1lX2R1cikpOworCQlmcl9oaW50X3N0YXR1cyA9IFZERUNfSElOVEVEOworCX0KKyNlbHNlCisJaWYgKGZyX2hpbnRfc3RhdHVzID09IFZERUNfTkVFRF9ISU5UKQorCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoUFJPVklERVJfTkFNRSwKKwkJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX0ZSX0hJTlQsCisJCQkJCSh2b2lkICopCisJCQkJCSgodW5zaWduZWQgbG9uZyloZXZjLT5mcmFtZV9kdXIpKTsKKwkJZnJfaGludF9zdGF0dXMgPSBWREVDX0hJTlRFRDsKKwl9CisjZW5kaWYKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgdmgyNjVfd29ya19pbXBsZW1lbnQoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YywKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjLGludCBmcm9tKQoreworCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy13b3JrX3N0YXRlIiwgaGV2Yy0+ZGVjX3Jlc3VsdCk7CisKKwlpZiAoaGV2Yy0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0FHQUlOKQorCQlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX1dPUktFUl9BR0FJTik7CisJaWYgKGhldmMtPmRlY19yZXN1bHQgIT0gREVDX1JFU1VMVF9OT05FKQorCQlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX1dPUktFUl9TVEFSVCk7CisJaWYgKGhldmMtPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9GUkVFX0NBTlZBUykgeworCQkvKlVTRV9CVUZfQkxPQ0sqLworCQl1bmluaXRfcGljX2xpc3QoaGV2Yyk7CisJCWhldmMtPnVuaW5pdF9saXN0ID0gMDsKKyNpZmRlZiBVU0VfVU5JTklUX1NFTUEKKwkJdXAoJmhldmMtPmgyNjVfdW5pbml0X2RvbmVfc2VtYSk7CisjZW5kaWYKKwkJcmV0dXJuOworCX0KKworCS8qIGZpbmlzaGVkIGRlY29kaW5nIG9uZSBmcmFtZSBvciBlcnJvciwKKwkgKiBub3RpZnkgdmRlYyBjb3JlIHRvIHN3aXRjaCBjb250ZXh0CisJICovCisJaWYgKGhldmMtPnBpY19saXN0X2luaXRfZmxhZyA9PSAxCisJCSYmIChoZXZjLT5kZWNfcmVzdWx0ICE9IERFQ19SRVNVTFRfRk9SQ0VfRVhJVCkpIHsKKwkJaGV2Yy0+cGljX2xpc3RfaW5pdF9mbGFnID0gMjsKKwkJaW5pdF9waWNfbGlzdChoZXZjKTsKKwkJaW5pdF9waWNfbGlzdF9odyhoZXZjKTsKKwkJaW5pdF9idWZfc3BlYyhoZXZjKTsKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJInNldCBwaWNfbGlzdF9pbml0X2ZsYWcgdG8gMlxuIik7CisKKwkJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9NQk9YMF9JUlFfUkVHLCAweDEpOworCQlyZXR1cm47CisJfQorCisJaGV2Y19wcmludChoZXZjLCBQUklOVF9GTEFHX1ZERUNfREVUQUlMLAorCQkiJXMgZGVjX3Jlc3VsdCAlZCAleCAleCAleFxuIiwKKwkJX19mdW5jX18sCisJCWhldmMtPmRlY19yZXN1bHQsCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9MRVZFTCksCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9XUl9QVFIpLAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSKSk7CisKKwlpZiAoKChoZXZjLT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfR0VUX0RBVEEpIHx8CisJCShoZXZjLT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfR0VUX0RBVEFfUkVUUlkpKQorCQkmJiAoaHdfdG9fdmRlYyhoZXZjKS0+bmV4dF9zdGF0dXMgIT0KKwkJVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEKSkgeworCQlpZiAoIXZkZWNfaGFzX21vcmVfaW5wdXQodmRlYykpIHsKKwkJCWhldmMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0VPUzsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaGV2Yy0+d29yayk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKCFpbnB1dF9mcmFtZV9iYXNlZCh2ZGVjKSkgeworCQkJaW50IHIgPSB2ZGVjX3N5bmNfaW5wdXQodmRlYyk7CisJCQlpZiAociA+PSAweDIwMCkgeworCQkJCVdSSVRFX1ZSRUcoSEVWQ19ERUNPREVfU0laRSwKKwkJCQkJUkVBRF9WUkVHKEhFVkNfREVDT0RFX1NJWkUpICsgcik7CisKKwkJCQloZXZjX3ByaW50KGhldmMsIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkJCSIlcyBERUNfUkVTVUxUX0dFVF9EQVRBICV4ICV4ICV4IG1wYyAleCBzaXplIDB4JXhcbiIsCisJCQkJCV9fZnVuY19fLAorCQkJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fTEVWRUwpLAorCQkJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fV1JfUFRSKSwKKwkJCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1JEX1BUUiksCisJCQkJCVJFQURfVlJFRyhIRVZDX01QQ19FKSwgcik7CisKKwkJCQlzdGFydF9wcm9jZXNzX3RpbWUoaGV2Yyk7CisJCQkJaWYgKFJFQURfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHKQorCQkJCSA9PSBIRVZDX0RFQ09ERV9CVUZFTVBUWTIpCisJCQkJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywKKwkJCQkJCUhFVkNfQUNUSU9OX0RPTkUpOworCQkJCWVsc2UKKwkJCQkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLAorCQkJCQkJSEVWQ19BQ1RJT05fREVDX0NPTlQpOworCQkJfSBlbHNlIHsKKwkJCQloZXZjLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9HRVRfREFUQV9SRVRSWTsKKwkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmhldmMtPndvcmspOworCQkJfQorCQkJcmV0dXJuOworCQl9CisKKwkJLypiZWxvdyBmb3IgZnJhbWVfYmFzZSovCisJCWlmIChoZXZjLT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfR0VUX0RBVEEpIHsKKwkJCWhldmNfcHJpbnQoaGV2YywgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCQkiJXMgREVDX1JFU1VMVF9HRVRfREFUQSAleCAleCAleCBtcGMgJXhcbiIsCisJCQkJX19mdW5jX18sCisJCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0xFVkVMKSwKKwkJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fV1JfUFRSKSwKKwkJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSKSwKKwkJCQlSRUFEX1ZSRUcoSEVWQ19NUENfRSkpOworCQkJbXV0ZXhfbG9jaygmaGV2Yy0+Y2h1bmtzX211dGV4KTsKKwkJCXZkZWNfdmZyYW1lX2RpcnR5KHZkZWMsIGhldmMtPmNodW5rKTsKKwkJCWhldmMtPmNodW5rID0gTlVMTDsKKwkJCW11dGV4X3VubG9jaygmaGV2Yy0+Y2h1bmtzX211dGV4KTsKKwkJCXZkZWNfY2xlYW5faW5wdXQodmRlYyk7CisJCX0KKworCQkvKmlmIChpc19uZXdfcGljX2F2YWlsYWJsZShoZXZjKSkgeyovCisJCWlmIChydW5fcmVhZHkodmRlYywgVkRFQ19IRVZDKSkgeworCQkJaW50IHI7CisJCQlpbnQgZGVjb2RlX3NpemU7CisKKwkJCXIgPSB2ZGVjX3ByZXBhcmVfaW5wdXQodmRlYywgJmhldmMtPmNodW5rKTsKKwkJCWlmIChyIDwgMCkgeworCQkJCWhldmMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0dFVF9EQVRBX1JFVFJZOworCisJCQkJaGV2Y19wcmludChoZXZjLAorCQkJCQlQUklOVF9GTEFHX1ZERUNfREVUQUlMLAorCQkJCQkiYW12ZGVjX3ZoMjY1OiBJbnN1ZmZpY2llbnQgZGF0YVxuIik7CisKKwkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmhldmMtPndvcmspOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWhldmMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX05PTkU7CisJCQloZXZjX3ByaW50KGhldmMsIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkJIiVzOiBjaHVuayBzaXplIDB4JXggc3VtIDB4JXggbXBjICV4XG4iLAorCQkJCV9fZnVuY19fLCByLAorCQkJCShnZXRfZGJnX2ZsYWcoaGV2YykgJiBQUklOVF9GTEFHX1ZERUNfU1RBVFVTKSA/CisJCQkJZ2V0X2RhdGFfY2hlY2tfc3VtKGhldmMsIHIpIDogMCwKKwkJCQlSRUFEX1ZSRUcoSEVWQ19NUENfRSkpOworCisJCQlpZiAoZ2V0X2RiZ19mbGFnKGhldmMpICYgUFJJTlRfRlJBTUVCQVNFX0RBVEEpIHsKKwkJCQlpbnQgamo7CisJCQkJdTggKmRhdGEgPSBOVUxMOworCQkJCVBSX0lOSVQoMTI4KTsKKworCQkJCWlmICghaGV2Yy0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQkJCWRhdGEgPSBjb2RlY19tbV92bWFwKAorCQkJCQkJaGV2Yy0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQkJCQloZXZjLT5jaHVuay0+b2Zmc2V0LCByKTsKKwkJCQllbHNlCisJCQkJCWRhdGEgPSAoKHU4ICopCisJCQkJCQloZXZjLT5jaHVuay0+YmxvY2stPnN0YXJ0X3ZpcnQpCisJCQkJCQkrIGhldmMtPmNodW5rLT5vZmZzZXQ7CisKKwkJCQlmb3IgKGpqID0gMDsgamogPCByOyBqaisrKSB7CisJCQkJCWlmICgoamogJiAweGYpID09IDApCisJCQkJCQlQUl9GSUxMKCIlMDZ4OiIsIGpqKTsKKwkJCQkJUFJfRklMTCgiJTAyeCAiLCBkYXRhW2pqXSk7CisJCQkJCWlmICgoKGpqICsgMSkgJiAweGYpID09IDApCisJCQkJCQlQUl9JTkZPKGhldmMtPmluZGV4KTsKKwkJCQl9CisJCQkJUFJfSU5GTyhoZXZjLT5pbmRleCk7CisKKwkJCQlpZiAoIWhldmMtPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQkJCQljb2RlY19tbV91bm1hcF9waHlhZGRyKGRhdGEpOworCQkJfQorCisJCQlkZWNvZGVfc2l6ZSA9IGhldmMtPmNodW5rLT5zaXplICsKKwkJCQkoaGV2Yy0+Y2h1bmstPm9mZnNldCAmIChWREVDX0ZJRk9fQUxJR04gLSAxKSk7CisJCQlXUklURV9WUkVHKEhFVkNfREVDT0RFX1NJWkUsCisJCQkJUkVBRF9WUkVHKEhFVkNfREVDT0RFX1NJWkUpICsgZGVjb2RlX3NpemUpOworCisJCQl2ZGVjX2VuYWJsZV9pbnB1dCh2ZGVjKTsKKworCQkJaGV2Y19wcmludChoZXZjLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJCSIlczogbXBjICV4XG4iLAorCQkJCV9fZnVuY19fLCBSRUFEX1ZSRUcoSEVWQ19NUENfRSkpOworCisJCQlzdGFydF9wcm9jZXNzX3RpbWUoaGV2Yyk7CisJCQlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIEhFVkNfQUNUSU9OX0RPTkUpOworCQl9IGVsc2V7CisJCQloZXZjLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9HRVRfREFUQV9SRVRSWTsKKworCQkJLypoZXZjX3ByaW50KGhldmMsIFBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsCisJCQkgKgkiYW12ZGVjX3ZoMjY1OiBJbnN1ZmZpY2llbnQgZGF0YVxuIik7CisJCQkgKi8KKworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZoZXZjLT53b3JrKTsKKwkJfQorCQlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX1dPUktFUl9FTkQpOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChoZXZjLT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfRE9ORSkgeworCQkvKiBpZiAoIWhldmMtPmN0eF92YWxpZCkKKwkJCWhldmMtPmN0eF92YWxpZCA9IDE7ICovCisJCQlpbnQgaTsKKwkJZGVjb2RlX2ZyYW1lX2NvdW50W2hldmMtPmluZGV4XSsrOworI2lmZGVmIERFVFJFRklMTF9FTkFCTEUKKwlpZiAoaGV2Yy0+aXNfc3dhcCAmJgorCQlnZXRfY3B1X21ham9yX2lkKCkgPD0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTSkgeworCQlpZiAoaGV2Yy0+ZGVscmVmaWxsX2NoZWNrID09IDIpIHsKKwkJCWRlbHJlZmlsbChoZXZjKTsKKwkJCWFtaGV2Y19zdG9wKCk7CisJCX0KKwl9CisjZW5kaWYKKwkJaWYgKGhldmMtPm1tdV9lbmFibGUgJiYgKChoZXZjLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MTApID09IDApKSB7CisJCQloZXZjLT51c2VkXzRrX251bSA9CisJCQkJUkVBRF9WUkVHKEhFVkNfU0FPX01NVV9TVEFUVVMpID4+IDE2OworCQkJaWYgKGhldmMtPnVzZWRfNGtfbnVtID49IDAgJiYKKwkJCQloZXZjLT5jdXJfcGljICYmCisJCQkJaGV2Yy0+Y3VyX3BpYy0+c2NhdHRlcl9hbGxvYworCQkJCT09IDEpCisJCQkJcmVjeWNsZV9tbXVfYnVmX3RhaWwoaGV2YywgaGV2Yy0+bV9pbnNfZmxhZyk7CisJCX0KKwkJaGV2Yy0+cGljX2RlY29kZWRfbGN1X2lkeCA9CisJCQlSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfTENVX1NUQVJUKQorCQkJJiAweGZmZmZmZjsKKworCQlpZiAodmRlYy0+bWFzdGVyID09IE5VTEwgJiYgdmRlYy0+c2xhdmUgPT0gTlVMTCAmJgorCQkJaGV2Yy0+ZW1wdHlfZmxhZyA9PSAwKSB7CisJCQloZXZjLT5vdmVyX2RlY29kZSA9CisJCQkJKFJFQURfVlJFRyhIRVZDX1NISUZUX1NUQVRVUykgPj4gMTUpICYgMHgxOworCQkJaWYgKGhldmMtPm92ZXJfZGVjb2RlKQorCQkJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCQkJIiEhIU92ZXIgZGVjb2RlXG4iKTsKKwkJfQorCisJCWlmIChpc19sb2dfZW5hYmxlKGhldmMpKQorCQkJYWRkX2xvZyhoZXZjLAorCQkJCSIlcyBkZWNfcmVzdWx0ICVkIGxjdSAlZCB1c2VkX21tdSAlZCBzaGlmdGJ5dGUgMHgleCBkZWNieXRlcyAweCV4IiwKKwkJCQlfX2Z1bmNfXywKKwkJCQloZXZjLT5kZWNfcmVzdWx0LAorCQkJCWhldmMtPnBpY19kZWNvZGVkX2xjdV9pZHgsCisJCQkJaGV2Yy0+dXNlZF80a19udW0sCisJCQkJUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCksCisJCQkJUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCkgLQorCQkJCWhldmMtPnN0YXJ0X3NoaWZ0X2J5dGVzCisJCQkJKTsKKworCQloZXZjX3ByaW50KGhldmMsIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkiJXMgZGVjX3Jlc3VsdCAlZCAoJXggJXggJXgpIGxjdSAlZCB1c2VkX21tdSAlZCBzaGlmdGJ5dGUgMHgleCBkZWNieXRlcyAweCV4XG4iLAorCQkJX19mdW5jX18sCisJCQloZXZjLT5kZWNfcmVzdWx0LAorCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0xFVkVMKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9XUl9QVFIpLAorCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1JEX1BUUiksCisJCQloZXZjLT5waWNfZGVjb2RlZF9sY3VfaWR4LAorCQkJaGV2Yy0+dXNlZF80a19udW0sCisJCQlSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpIC0KKwkJCWhldmMtPnN0YXJ0X3NoaWZ0X2J5dGVzCisJCQkpOworCisJCWhldmMtPnVzZWRfNGtfbnVtID0gLTE7CisKKwkJY2hlY2tfcGljX2RlY29kZWRfZXJyb3IoaGV2YywKKwkJCWhldmMtPnBpY19kZWNvZGVkX2xjdV9pZHgpOworCQlpZiAoKGVycm9yX2hhbmRsZV9wb2xpY3kgJiAweDEwMCkgPT0gMCAmJiBoZXZjLT5jdXJfcGljKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFRl9QSUNfTlVNOyBpKyspIHsKKwkJCQlzdHJ1Y3QgUElDX3MgKnBpYzsKKwkJCQlwaWMgPSBoZXZjLT5tX1BJQ1tpXTsKKwkJCQlpZiAoIXBpYyB8fCBwaWMtPmluZGV4ID09IC0xKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoKGhldmMtPmN1cl9waWMtPlBPQyArIHBvY19udW1fbWFyZ2luIDwgcGljLT5QT0MpICYmIChwaWMtPnJlZmVyZW5jZWQgPT0gMCkgJiYKKwkJCQkJKHBpYy0+b3V0cHV0X21hcmsgPT0gMSkgJiYgKHBpYy0+b3V0cHV0X3JlYWR5ID09IDApKSB7CisJCQkJCWhldmMtPnBvY19lcnJvcl9jb3VudCsrOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoaSA9PSBNQVhfUkVGX1BJQ19OVU0pCisJCQkJaGV2Yy0+cG9jX2Vycm9yX2NvdW50ID0gMDsKKwkJCWlmIChoZXZjLT5wb2NfZXJyb3JfY291bnQgPj0gcG9jX2Vycm9yX2xpbWl0KSB7CisJCQkJZm9yIChpID0gMDsgaSA8IE1BWF9SRUZfUElDX05VTTsgaSsrKSB7CisJCQkJCXN0cnVjdCBQSUNfcyAqcGljOworCQkJCQlwaWMgPSBoZXZjLT5tX1BJQ1tpXTsKKwkJCQkJaWYgKCFwaWMgfHwgcGljLT5pbmRleCA9PSAtMSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlpZiAoKGhldmMtPmN1cl9waWMtPlBPQyArIHBvY19udW1fbWFyZ2luIDwgcGljLT5QT0MpICYmIChwaWMtPnJlZmVyZW5jZWQgPT0gMCkgJiYKKwkJCQkJCShwaWMtPm91dHB1dF9tYXJrID09IDEpICYmIChwaWMtPm91dHB1dF9yZWFkeSA9PSAwKSkgeworCQkJCQkJcGljLT5vdXRwdXRfbWFyayA9IDA7CisJCQkJCQloZXZjX3ByaW50KGhldmMsIDAsICJEUEIgcG9jIGVycm9yLCByZW1vdmUgZXJyb3IgZnJhbWVcbiIpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorI2lmIDEKKwkJaWYgKHZkZWMtPnNsYXZlKSB7CisJCQlpZiAoZHZfZGVidWcgJiAweDEpCisJCQkJdmRlY19zZXRfZmxhZyh2ZGVjLT5zbGF2ZSwKKwkJCQkJVkRFQ19GTEFHX1NFTEZfSU5QVVRfQ09OVEVYVCk7CisJCQllbHNlCisJCQkJdmRlY19zZXRfZmxhZyh2ZGVjLT5zbGF2ZSwKKwkJCQkJVkRFQ19GTEFHX09USEVSX0lOUFVUX0NPTlRFWFQpOworCQl9CisjZWxzZQorCQlpZiAodmRlYy0+c2xhdmUpIHsKKwkJCWlmIChub19pbnRlcmxlYXZlZF9lbF9zbGljZSkKKwkJCQl2ZGVjX3NldF9mbGFnKHZkZWMtPnNsYXZlLAorCQkJCVZERUNfRkxBR19JTlBVVF9LRUVQX0NPTlRFWFQpOworCQkJCS8qIHRoaXMgd2lsbCBtb3ZlIHJlYWwgSFcgcG9pbnRlciBmb3IgaW5wdXQgKi8KKwkJCWVsc2UKKwkJCQl2ZGVjX3NldF9mbGFnKHZkZWMtPnNsYXZlLCAwKTsKKwkJCQkvKiB0aGlzIHdpbGwgbm90IG1vdmUgcmVhbCBIVyBwb2ludGVyCisJCQkJICphbmQgU0wgbGF5ZXIgZGVjb2RpbmcKKwkJCQkgKndpbGwgc3RhcnQgZnJvbSBzYW1lIHN0cmVhbSBwb3NpdGlvbgorCQkJCSAqYXMgY3VycmVudCBCTCBkZWNvZGVyCisJCQkJICovCisJCX0KKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwkJaGV2Yy0+c2hpZnRfYnl0ZV9jb3VudF9sbworCQkJPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKTsKKwkJaWYgKHZkZWMtPnNsYXZlKSB7CisJCQkvKmN1ciBpcyBiYXNlLCBmb3VuZCBlbmhhbmNlKi8KKwkJCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmNfZWwgPQorCQkJKHN0cnVjdCBoZXZjX3N0YXRlX3MgKikKKwkJCQl2ZGVjLT5zbGF2ZS0+cHJpdmF0ZTsKKwkJCWlmIChoZXZjX2VsKQorCQkJCWhldmNfZWwtPnNoaWZ0X2J5dGVfY291bnRfbG8gPQorCQkJCWhldmMtPnNoaWZ0X2J5dGVfY291bnRfbG87CisJCX0gZWxzZSBpZiAodmRlYy0+bWFzdGVyKSB7CisJCQkvKmN1ciBpcyBlbmhhbmNlLCBmb3VuZCBiYXNlKi8KKwkJCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmNfYmEgPQorCQkJKHN0cnVjdCBoZXZjX3N0YXRlX3MgKikKKwkJCQl2ZGVjLT5tYXN0ZXItPnByaXZhdGU7CisJCQlpZiAoaGV2Y19iYSkKKwkJCQloZXZjX2JhLT5zaGlmdF9ieXRlX2NvdW50X2xvID0KKwkJCQloZXZjLT5zaGlmdF9ieXRlX2NvdW50X2xvOworCQl9CisjZW5kaWYKKwkJbXV0ZXhfbG9jaygmaGV2Yy0+Y2h1bmtzX211dGV4KTsKKwkJdmRlY192ZnJhbWVfZGlydHkoaHdfdG9fdmRlYyhoZXZjKSwgaGV2Yy0+Y2h1bmspOworCQloZXZjLT5jaHVuayA9IE5VTEw7CisJCW11dGV4X3VubG9jaygmaGV2Yy0+Y2h1bmtzX211dGV4KTsKKwl9IGVsc2UgaWYgKGhldmMtPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9BR0FJTikgeworCQkvKgorCQkJc3RyZWFtIGJhc2U6IHN0cmVhbSBidWYgZW1wdHkgb3IgdGltZW91dAorCQkJZnJhbWUgYmFzZTogdmRlY19wcmVwYXJlX2lucHV0IGZhaWwKKwkJKi8KKwkJaWYgKCF2ZGVjX2hhc19tb3JlX2lucHV0KHZkZWMpKSB7CisJCQloZXZjLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9FT1M7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmhldmMtPndvcmspOworCQkJcmV0dXJuOworCQl9CisjaWZkZWYgQUdBSU5fSEFTX1RIUkVTSE9MRAorCQloZXZjLT5uZXh0X2FnYWluX2ZsYWcgPSAxOworI2VuZGlmCisJCWlmIChpbnB1dF9zdHJlYW1fYmFzZWQodmRlYykpIHsKKwkJCXUzMiBycCwgd3AsIGxldmVsOworCQkJc3RydWN0IHZkZWNfaW5wdXRfcyAqaW5wdXQgPSAmdmRlYy0+aW5wdXQ7CisJCQlycCA9IFNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF9ycCk7OworCQkJd3AgPSBTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApOworCQkJaWYgKHdwIDwgcnApCisJCQkJbGV2ZWwgPSBpbnB1dC0+c2l6ZSArIHdwIC0gcnA7CisJCQllbHNlCisJCQkJbGV2ZWwgPSB3cCAtIHJwOworCQkJaWYgKChsZXZlbCA+PSBkaXJ0eV9idWZmZXJzaXplX3RocmVzaG9sZCkgJiYKKwkJCQkoaGV2Yy0+cHJlX3BhcnNlcl92aWRlb19ycCA9PQorCQkJCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfcnApKSAmJgorCQkJCShoZXZjLT5wcmVfcGFyc2VyX3ZpZGVvX3dwID09CisJCQkJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCkpKSB7CisJCQkJaWYgKGhldmMtPmFnYWluX2NvdW50ID09IDApIHsKKwkJCQkJaGV2Yy0+YWdhaW5fdGltZW91dF9qaWZmaWVzID0KKwkJCQkJCWdldF9qaWZmaWVzXzY0KCkgKyBkaXJ0eV90aW1lX3RocmVzaG9sZCAqIEhaLzEwMDA7CisJCQkJfQorCQkJCWhldmMtPmFnYWluX2NvdW50Kys7CisJCQl9CisJCQllbHNlCisJCQkJaGV2Yy0+YWdhaW5fY291bnQgPSAwOworCisJCQloZXZjLT5wcmVfcGFyc2VyX3ZpZGVvX3JwID0gU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3JwKTsKKwkJCWhldmMtPnByZV9wYXJzZXJfdmlkZW9fd3AgPSBTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApOworCisJCQlpZiAoKChoZXZjLT5hZ2Fpbl9jb3VudCA+IGRpcnR5X2NvdW50X3RocmVzaG9sZCkgJiYKKwkJCQkJdGltZV9hZnRlcjY0KGdldF9qaWZmaWVzXzY0KCksIGhldmMtPmFnYWluX3RpbWVvdXRfamlmZmllcykpKSB7CisJCQkJbXV0ZXhfbG9jaygmaGV2Yy0+Y2h1bmtzX211dGV4KTsKKwkJCQloZXZjLT5hZ2Fpbl9jb3VudCA9IDA7CisJCQkJdmRlY192ZnJhbWVfZGlydHkoaHdfdG9fdmRlYyhoZXZjKSwgaGV2Yy0+Y2h1bmspOworCQkJCWhldmMtPmNodW5rID0gTlVMTDsKKwkJCQloZXZjX3ByaW50KGhldmMsIFBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsCisJCQkJCSJEaXNjYXJkIGRpcnR5IGRhdGFcbiIpOworCQkJCW11dGV4X3VubG9jaygmaGV2Yy0+Y2h1bmtzX211dGV4KTsKKwkJCX0gZWxzZSBpZiAoKCgoZXJyb3JfaGFuZGxlX3BvbGljeSAmIDB4MjAwKSA9PSAwKSAmJgorCQkJCQkJKGhldmMtPnBpY19saXN0X2luaXRfZmxhZyA9PSAwKSkpIHsKKwkJCQljaGVja19kaXJ0eV9kYXRhKHZkZWMpOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChoZXZjLT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfRU9TKSB7CisJCXN0cnVjdCBQSUNfcyAqcGljOworCQloZXZjLT5lb3MgPSAxOworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJCWlmICgoIWhldmMtPmRpc2NhcmRfZHZfZGF0YSkgJiYgYXV4X2RhdGFfaXNfYXZhaWJsZShoZXZjKSkKKwkJCWlmIChoZXZjLT5kZWNvZGluZ19waWMpCisJCQkJZG9sYnlfZ2V0X21ldGEoaGV2Yyk7CisjZW5kaWYKKwkJY2hlY2tfcGljX2RlY29kZWRfZXJyb3IoaGV2YywKKwkJCWhldmMtPnBpY19kZWNvZGVkX2xjdV9pZHgpOworCQlwaWMgPSBnZXRfcGljX2J5X1BPQyhoZXZjLCBoZXZjLT5jdXJyX1BPQyk7CisJCWhldmNfcHJpbnQoaGV2YywgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCSIlczogZW5kIG9mIHN0cmVhbSwgbGFzdCBkZWMgcG9jICVkID0+IDB4JXBmXG4iLAorCQkJX19mdW5jX18sIGhldmMtPmN1cnJfUE9DLCBwaWMpOworCQlmbHVzaF9vdXRwdXQoaGV2YywgcGljKTsKKwkJLyogZHVtbXkgdmYgd2l0aCBlb3MgZmxhZyB0byBiYWNrZW5kICovCisJCWlmIChoZXZjLT5pc191c2VkX3Y0bCkgeworCQkJQVRSQUNFX0NPVU5URVIoIlZfU1RfREVDLXN1Ym1pdF9lb3MiLCBfX0xJTkVfXyk7CisJCQlub3RpZnlfdjRsX2Vvcyhod190b192ZGVjKGhldmMpKTsKKwkJCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy1zdWJtaXRfZW9zIiwgMCk7CisJCX0KKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCQloZXZjLT5zaGlmdF9ieXRlX2NvdW50X2xvCisJCQk9IFJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpOworCQlpZiAodmRlYy0+c2xhdmUpIHsKKwkJCS8qY3VyIGlzIGJhc2UsIGZvdW5kIGVuaGFuY2UqLworCQkJc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Y19lbCA9CisJCQkoc3RydWN0IGhldmNfc3RhdGVfcyAqKQorCQkJCXZkZWMtPnNsYXZlLT5wcml2YXRlOworCQkJaWYgKGhldmNfZWwpCisJCQkJaGV2Y19lbC0+c2hpZnRfYnl0ZV9jb3VudF9sbyA9CisJCQkJaGV2Yy0+c2hpZnRfYnl0ZV9jb3VudF9sbzsKKwkJfSBlbHNlIGlmICh2ZGVjLT5tYXN0ZXIpIHsKKwkJCS8qY3VyIGlzIGVuaGFuY2UsIGZvdW5kIGJhc2UqLworCQkJc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Y19iYSA9CisJCQkoc3RydWN0IGhldmNfc3RhdGVfcyAqKQorCQkJCXZkZWMtPm1hc3Rlci0+cHJpdmF0ZTsKKwkJCWlmIChoZXZjX2JhKQorCQkJCWhldmNfYmEtPnNoaWZ0X2J5dGVfY291bnRfbG8gPQorCQkJCWhldmMtPnNoaWZ0X2J5dGVfY291bnRfbG87CisJCX0KKyNlbmRpZgorCQltdXRleF9sb2NrKCZoZXZjLT5jaHVua3NfbXV0ZXgpOworCQl2ZGVjX3ZmcmFtZV9kaXJ0eShod190b192ZGVjKGhldmMpLCBoZXZjLT5jaHVuayk7CisJCWhldmMtPmNodW5rID0gTlVMTDsKKwkJbXV0ZXhfdW5sb2NrKCZoZXZjLT5jaHVua3NfbXV0ZXgpOworCX0gZWxzZSBpZiAoaGV2Yy0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0ZPUkNFX0VYSVQpIHsKKwkJaGV2Y19wcmludChoZXZjLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJIiVzOiBmb3JjZSBleGl0XG4iLAorCQkJX19mdW5jX18pOworCQlpZiAoaGV2Yy0+c3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJCWFtaGV2Y19zdG9wKCk7CisJCQloZXZjLT5zdGF0ICY9IH5TVEFUX1ZERUNfUlVOOworCQl9CisJCWlmIChoZXZjLT5zdGF0ICYgU1RBVF9JU1JfUkVHKSB7CisJCQkJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9NQk9YMF9NQVNLLCAwKTsKKwkJCXZkZWNfZnJlZV9pcnEoVkRFQ19JUlFfMCwgKHZvaWQgKiloZXZjKTsKKwkJCWhldmMtPnN0YXQgJj0gflNUQVRfSVNSX1JFRzsKKwkJfQorCQloZXZjX3ByaW50KGhldmMsIDAsICIlczogZm9yY2UgZXhpdCBlbmRcbiIsCisJCQlfX2Z1bmNfXyk7CisJfQorCisJaWYgKGhldmMtPnN0YXQgJiBTVEFUX1ZERUNfUlVOKSB7CisJCWFtaGV2Y19zdG9wKCk7CisJCWhldmMtPnN0YXQgJj0gflNUQVRfVkRFQ19SVU47CisJfQorCisJaWYgKGhldmMtPnN0YXQgJiBTVEFUX1RJTUVSX0FSTSkgeworCQlkZWxfdGltZXJfc3luYygmaGV2Yy0+dGltZXIpOworCQloZXZjLT5zdGF0ICY9IH5TVEFUX1RJTUVSX0FSTTsKKwl9CisKKwlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5kZWNvZGVfd29ya190aW1lX25hbWUsIFRSQUNFX1dPUktfV0FJVF9TRUFSQ0hfRE9ORV9TVEFSVCk7CisJd2FpdF9oZXZjX3NlYXJjaF9kb25lKGhldmMpOworCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLmRlY29kZV93b3JrX3RpbWVfbmFtZSwgVFJBQ0VfV09SS19XQUlUX1NFQVJDSF9ET05FX0VORCk7CisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCWlmIChoZXZjLT5zd2l0Y2hfZHZsYXllcl9mbGFnKSB7CisJCWlmICh2ZGVjLT5zbGF2ZSkKKwkJCXZkZWNfc2V0X25leHRfc2NoZWQodmRlYywgdmRlYy0+c2xhdmUpOworCQllbHNlIGlmICh2ZGVjLT5tYXN0ZXIpCisJCQl2ZGVjX3NldF9uZXh0X3NjaGVkKHZkZWMsIHZkZWMtPm1hc3Rlcik7CisJfSBlbHNlIGlmICh2ZGVjLT5zbGF2ZSB8fCB2ZGVjLT5tYXN0ZXIpCisJCXZkZWNfc2V0X25leHRfc2NoZWQodmRlYywgdmRlYyk7CisjZW5kaWYKKworCWlmIChmcm9tID09IDEpIHsKKwkJLyogVGhpcyBpcyBhIHRpbWVvdXQgd29yayAqLworCQlpZiAod29ya19wZW5kaW5nKCZoZXZjLT53b3JrKSkgeworCQkJLyoKKwkJCSAqIFRoZSB2aDI2NV93b3JrIGFycml2ZXMgYXQgdGhlIGxhc3Qgc2Vjb25kLAorCQkJICogZ2l2ZSBpdCBhIGNoYW5jZSB0byBoYW5kbGUgdGhlIHNjZW5hcmlvLgorCQkJICovCisJCQlyZXR1cm47CisJCQkvL2NhbmNlbF93b3JrX3N5bmMoJmhldmMtPndvcmspOy8vcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBjb25zaWRyYWlvbgorCQl9CisJfQorCisJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9XT1JLRVJfRU5EKTsKKworCS8qIG1hcmsgaXRzZWxmIGhhcyBhbGwgSFcgcmVzb3VyY2UgcmVsZWFzZWQgYW5kIGlucHV0IHJlbGVhc2VkICovCisJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKQorCQl2ZGVjX2NvcmVfZmluaXNoX3J1bih2ZGVjLCBDT1JFX01BU0tfSEVWQyk7CisJZWxzZQorCQl2ZGVjX2NvcmVfZmluaXNoX3J1bih2ZGVjLCBDT1JFX01BU0tfVkRFQ18xIHwgQ09SRV9NQVNLX0hFVkMpOworCisJaWYgKGhldmMtPmlzX3VzZWRfdjRsKSB7CisJCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaGV2Yy0+djRsMl9jdHgpOworCisJCWlmIChjdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSAmJgorCQkJIWhldmMtPnY0bF9wYXJhbXNfcGFyc2VkKQorCQkJdmRlY192NGxfd3JpdGVfZnJhbWVfc3luYyhjdHgpOworCX0KKworCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy1jaHVua19zaXplIiwgMCk7CisKKwlpZiAoaGV2Yy0+dmRlY19jYikKKwkJaGV2Yy0+dmRlY19jYihod190b192ZGVjKGhldmMpLCBoZXZjLT52ZGVjX2NiX2FyZyk7Cit9CisKK3N0YXRpYyB2b2lkIHZoMjY1X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPSBjb250YWluZXJfb2Yod29yaywKKwkJCXN0cnVjdCBoZXZjX3N0YXRlX3MsIHdvcmspOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGhldmMpOworCisJdmgyNjVfd29ya19pbXBsZW1lbnQoaGV2YywgdmRlYywgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHZoMjY1X3RpbWVvdXRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YyA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQlzdHJ1Y3QgaGV2Y19zdGF0ZV9zLCB0aW1lb3V0X3dvcmspOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGhldmMpOworCisJaWYgKHdvcmtfcGVuZGluZygmaGV2Yy0+d29yaykpCisJCXJldHVybjsKKwloZXZjLT50aW1lb3V0X3Byb2Nlc3NpbmcgPSAxOworCXZoMjY1X3dvcmtfaW1wbGVtZW50KGhldmMsIHZkZWMsIDEpOworfQorCisKK3N0YXRpYyBpbnQgdmgyNjVfaHdfY3R4X3Jlc3RvcmUoc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YykKK3sKKwkvKiBuZXcgdG8gZG8gLi4uICovCisJdmgyNjVfcHJvdF9pbml0KGhldmMpOworCXJldHVybiAwOworfQorc3RhdGljIHVuc2lnbmVkIGxvbmcgcnVuX3JlYWR5KHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjID0KKwkJKHN0cnVjdCBoZXZjX3N0YXRlX3MgKil2ZGVjLT5wcml2YXRlOworCWludCB0dnAgPSB2ZGVjX3NlY3VyZShod190b192ZGVjKGhldmMpKSA/CisJCUNPREVDX01NX0ZMQUdTX1RWUCA6IDA7CisJYm9vbCByZXQgPSAwOworCWlmIChzdGVwID09IDB4MTIpCisJCXJldHVybiAwOworCWVsc2UgaWYgKHN0ZXAgPT0gMHgxMSkKKwkJc3RlcCA9IDB4MTI7CisKKwlpZiAoaGV2Yy0+ZmF0YWxfZXJyb3IgJiBERUNPREVSX0ZBVEFMX0VSUk9SX05PX01FTSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoaGV2Yy0+ZW9zKQorCQlyZXR1cm4gMDsKKwlpZiAoaGV2Yy0+dGltZW91dF9wcm9jZXNzaW5nICYmCisJICAgICh3b3JrX3BlbmRpbmcoJmhldmMtPndvcmspIHx8CisJICAgIHdvcmtfYnVzeSgmaGV2Yy0+d29yaykgfHwKKwkgICAgd29ya19idXN5KCZoZXZjLT50aW1lb3V0X3dvcmspIHx8CisJICAgIHdvcmtfcGVuZGluZygmaGV2Yy0+dGltZW91dF93b3JrKSkpIHsKKwkJaGV2Y19wcmludChoZXZjLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJICAgImgyNjUgd29yayBwZW5kaW5nLG5vdCByZWFkeSBmb3IgcnVuLlxuIik7CisJCXJldHVybiAwOworCX0KKwloZXZjLT50aW1lb3V0X3Byb2Nlc3NpbmcgPSAwOworCWlmICghaGV2Yy0+Zmlyc3Rfc2NfY2hlY2tlZCAmJiBoZXZjLT5tbXVfZW5hYmxlKSB7CisJCWludCBzaXplOworCQl2b2lkICogbW11X2JveDsKKworCQlpZiAoaGV2Yy0+aXNfdXNlZF92NGwpIHsKKwkJCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGhldmMtPnY0bDJfY3R4KTsKKwkJCW1tdV9ib3ggPSBjdHgtPm1tdV9ib3g7CisJCX0gZWxzZQorCQkJbW11X2JveCA9IGhldmMtPm1tdV9ib3g7CisKKwkJc2l6ZSA9IGRlY29kZXJfbW11X2JveF9zY19jaGVjayhtbXVfYm94LCB0dnApOworCQloZXZjLT5maXJzdF9zY19jaGVja2VkID0xOworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkidmgyNjUgY2FjaGVkPSVkICBuZWVkX3NpemU9JWQgc3BlZWQ9ICVkIG1zXG4iLAorCQkJc2l6ZSwgKGhldmMtPm5lZWRfY2FjaGVfc2l6ZSA+PiBQQUdFX1NISUZUKSwKKwkJCShpbnQpKGdldF9qaWZmaWVzXzY0KCkgLSBoZXZjLT5zY19zdGFydF90aW1lKSAqIDEwMDAvSFopOworCX0KKwlpZiAodmRlY19zdHJlYW1fYmFzZWQodmRlYykgJiYgKGhldmMtPmluaXRfZmxhZyA9PSAwKQorCQkJJiYgcHJlX2RlY29kZV9idWZfbGV2ZWwgIT0gMCkgeworCQkJdTMyIHJwLCB3cCwgbGV2ZWw7CisKKwkJCXJwID0gU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3JwKTsKKwkJCXdwID0gU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3dwKTsKKwkJCWlmICh3cCA8IHJwKQorCQkJCWxldmVsID0gdmRlYy0+aW5wdXQuc2l6ZSArIHdwIC0gcnA7CisJCQllbHNlCisJCQkJbGV2ZWwgPSB3cCAtIHJwOworCisJCQlpZiAobGV2ZWwgPCBwcmVfZGVjb2RlX2J1Zl9sZXZlbCkKKwkJCQlyZXR1cm4gMDsKKwl9CisKKyNpZmRlZiBBR0FJTl9IQVNfVEhSRVNIT0xECisJaWYgKGhldmMtPm5leHRfYWdhaW5fZmxhZyAmJgorCQkoIXZkZWNfZnJhbWVfYmFzZWQodmRlYykpKSB7CisJCXUzMiBwYXJzZXJfd3JfcHRyID0KKwkJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCk7CisJCWlmIChwYXJzZXJfd3JfcHRyID49IGhldmMtPnByZV9wYXJzZXJfd3JfcHRyICYmCisJCQkocGFyc2VyX3dyX3B0ciAtIGhldmMtPnByZV9wYXJzZXJfd3JfcHRyKSA8CisJCQlhZ2Fpbl90aHJlc2hvbGQpIHsKKwkJCWludCByID0gdmRlY19zeW5jX2lucHV0KHZkZWMpOworCQkJaGV2Y19wcmludChoZXZjLAorCQkJCVBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsICIlcyBidWYgbGVsdmVsOiV4XG4iLCAgX19mdW5jX18sIHIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisjZW5kaWYKKworCWlmIChkaXNwX3ZmcmFtZV92YWx2ZV9sZXZlbCAmJgorCQlrZmlmb19sZW4oJmhldmMtPmRpc3BsYXlfcSkgPj0KKwkJZGlzcF92ZnJhbWVfdmFsdmVfbGV2ZWwpIHsKKwkJaGV2Yy0+dmFsdmVfY291bnQtLTsKKwkJaWYgKGhldmMtPnZhbHZlX2NvdW50IDw9IDApCisJCQloZXZjLT52YWx2ZV9jb3VudCA9IDI7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KKworCXJldCA9IGlzX25ld19waWNfYXZhaWxhYmxlKGhldmMpOworCWlmICghcmV0KSB7CisJCWhldmNfcHJpbnQoaGV2YywKKwkJUFJJTlRfRkxBR19WREVDX0RFVEFJTCwgIiVzPT4lZFxyXG4iLAorCQlfX2Z1bmNfXywgcmV0KTsKKwl9CisKKyNpZmRlZiBDT05TVFJBSU5fTUFYX0JVRl9OVU0KKwlpZiAoaGV2Yy0+cGljX2xpc3RfaW5pdF9mbGFnID09IDMgJiYgIWhldmMtPmlzX3VzZWRfdjRsKSB7CisJCWlmIChydW5fcmVhZHlfbWF4X3ZmX29ubHlfbnVtID4gMCAmJgorCQkJZ2V0X3ZmX3JlZl9vbmx5X2J1Zl9jb3VudChoZXZjKSA+PQorCQkJcnVuX3JlYWR5X21heF92Zl9vbmx5X251bQorCQkJKQorCQkJcmV0ID0gMDsKKwkJaWYgKHJ1bl9yZWFkeV9kaXNwbGF5X3FfbnVtID4gMCAmJgorCQkJa2ZpZm9fbGVuKCZoZXZjLT5kaXNwbGF5X3EpID49CisJCQlydW5fcmVhZHlfZGlzcGxheV9xX251bSkKKwkJCXJldCA9IDA7CisKKwkJLyphdm9pZCBtb3JlIGJ1ZmZlcnMgY29uc3VtZWQgd2hlbgorCQlzd2l0Y2hpbmcgcmVzb2x1dGlvbiovCisJCWlmIChydW5fcmVhZHlfbWF4X2J1Zl9udW0gPT0gMHhmZiAmJgorCQkJKGdldF91c2VkX2J1Zl9jb3VudChoZXZjKSA+PQorCQkJdjRsX3BhcnNlcl93b3JrX3BpY19udW0oaGV2YykgKworCQkJZ2V0X2R5bmFtaWNfYnVmX251bV9tYXJnaW4oaGV2YykpKSB7CisJCQljaGVja19idWZmZXJfc3RhdHVzKGhldmMpOworCQkJcmV0ID0gMDsKKwkJfQorCQllbHNlIGlmIChydW5fcmVhZHlfbWF4X2J1Zl9udW0gJiYKKwkJCWdldF91c2VkX2J1Zl9jb3VudChoZXZjKSA+PQorCQkJcnVuX3JlYWR5X21heF9idWZfbnVtKQorCQkJcmV0ID0gMDsKKwl9CisjZW5kaWYKKworCWlmIChoZXZjLT5pc191c2VkX3Y0bCkgeworCQlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGhldmMtPnY0bDJfY3R4KTsKKworCQlpZiAoY3R4LT5wYXJhbV9zZXRzX2Zyb21fdWNvZGUpIHsKKwkJCWlmIChoZXZjLT52NGxfcGFyYW1zX3BhcnNlZCkgeworCQkJCXJldCA9IGlzX2F2YWxpYWJsZV9idWZmZXIoaGV2YykgPyAxIDogMDsKKwkJCX0gZWxzZSB7CisJCQkJcmV0ID0gY3R4LT52NGxfcmVzb2x1dGlvbl9jaGFuZ2UgPyAwIDogMTsKKwkJCX0KKwkJfSBlbHNlIGlmICghY3R4LT52NGxfY29kZWNfZHBiX3JlYWR5KSB7CisJCQlpZiAodjRsMl9tMm1fbnVtX2RzdF9idWZzX3JlYWR5KGN0eC0+bTJtX2N0eCkgPAorCQkJCXJ1bl9yZWFkeV9taW5fYnVmX251bSkKKwkJCQlyZXQgPSAwOworCQl9CisJfQorCisJaWYgKHJldCkKKwkJbm90X3J1bl9yZWFkeVtoZXZjLT5pbmRleF0gPSAwOworCWVsc2UKKwkJbm90X3J1bl9yZWFkeVtoZXZjLT5pbmRleF0rKzsKKwlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpCisJCXJldHVybiByZXQgPyAoQ09SRV9NQVNLX0hFVkMpIDogMDsKKwllbHNlCisJCXJldHVybiByZXQgPyAoQ09SRV9NQVNLX1ZERUNfMSB8IENPUkVfTUFTS19IRVZDKSA6IDA7Cit9CisKK3N0YXRpYyB2b2lkIHJ1bihzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1bnNpZ25lZCBsb25nIG1hc2ssCisJdm9pZCAoKmNhbGxiYWNrKShzdHJ1Y3QgdmRlY19zICosIHZvaWQgKiksIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjID0KKwkJKHN0cnVjdCBoZXZjX3N0YXRlX3MgKil2ZGVjLT5wcml2YXRlOworCWludCByLCBsb2FkciA9IDA7CisJdW5zaWduZWQgY2hhciBjaGVja19zdW0gPSAwOworCisJcnVuX2NvdW50W2hldmMtPmluZGV4XSsrOworCWhldmMtPnZkZWNfY2JfYXJnID0gYXJnOworCWhldmMtPnZkZWNfY2IgPSBjYWxsYmFjazsKKwloZXZjLT5hdXhfZGF0YV9kaXJ0eSA9IDE7CisKKwlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX1JVTl9TVEFSVCk7CisJaGV2Y19yZXNldF9jb3JlKHZkZWMpOworCisjaWZkZWYgQUdBSU5fSEFTX1RIUkVTSE9MRAorCWlmICh2ZGVjX3N0cmVhbV9iYXNlZCh2ZGVjKSkgeworCQloZXZjLT5wcmVfcGFyc2VyX3dyX3B0ciA9CisJCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApOworCQloZXZjLT5uZXh0X2FnYWluX2ZsYWcgPSAwOworCX0KKyNlbmRpZgorCXIgPSB2ZGVjX3ByZXBhcmVfaW5wdXQodmRlYywgJmhldmMtPmNodW5rKTsKKwlpZiAociA8IDApIHsKKwkJaW5wdXRfZW1wdHlbaGV2Yy0+aW5kZXhdKys7CisJCWhldmMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0FHQUlOOworCQloZXZjX3ByaW50KGhldmMsIFBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsCisJCQkiYW1tdmRlY192aDI2NTogSW5zdWZmaWNpZW50IGRhdGFcbiIpOworCisJCXZkZWNfc2NoZWR1bGVfd29yaygmaGV2Yy0+d29yayk7CisJCXJldHVybjsKKwl9CisKKwlBVFJBQ0VfQ09VTlRFUigiVl9TVF9ERUMtY2h1bmtfc2l6ZSIsIHIpOworCisJaW5wdXRfZW1wdHlbaGV2Yy0+aW5kZXhdID0gMDsKKwloZXZjLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9OT05FOworCWlmICh2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpICYmCisJCSgoZ2V0X2RiZ19mbGFnKGhldmMpICYgUFJJTlRfRkxBR19WREVDX1NUQVRVUykKKwkJfHwgaXNfbG9nX2VuYWJsZShoZXZjKSkgJiYKKwkJIXZkZWNfc2VjdXJlKHZkZWMpKQorCQljaGVja19zdW0gPSBnZXRfZGF0YV9jaGVja19zdW0oaGV2Yywgcik7CisKKwlpZiAoaXNfbG9nX2VuYWJsZShoZXZjKSkKKwkJYWRkX2xvZyhoZXZjLAorCQkJIiVzOiBzaXplIDB4JXggc3VtIDB4JXggc2hpZnRieXRlIDB4JXgiLAorCQkJX19mdW5jX18sIHIsCisJCQljaGVja19zdW0sCisJCQlSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKQorCQkJKTsKKwlpZiAoKGhldmMtPmRpcnR5X3NoaWZ0X2ZsYWcgPT0gMSkgJiYgISh2ZGVjLT5pbnB1dC5zd2FwX3ZhbGlkKSkgeworCQlXUklURV9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCwgdmRlYy0+aW5wdXQuc3RyZWFtX2Nvb2tpZSk7CisJfQorCWhldmMtPnN0YXJ0X3NoaWZ0X2J5dGVzID0gUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCk7CisKKwloZXZjX3ByaW50KGhldmMsIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCSIlczogc2l6ZSAweCV4IHN1bSAweCV4ICgleCAleCAleCAleCAleCkgYnl0ZSBjb3VudCAleFxuIiwKKwkJX19mdW5jX18sIHIsCisJCWNoZWNrX3N1bSwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0xFVkVMKSwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1dSX1BUUiksCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIpLAorCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfcnApLAorCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApLAorCQloZXZjLT5zdGFydF9zaGlmdF9ieXRlcworCQkpOworCWlmICgoZ2V0X2RiZ19mbGFnKGhldmMpICYgUFJJTlRfRlJBTUVCQVNFX0RBVEEpICYmCisJCWlucHV0X2ZyYW1lX2Jhc2VkKHZkZWMpICYmCisJCSF2ZGVjX3NlY3VyZSh2ZGVjKSkgeworCQlpbnQgamo7CisJCXU4ICpkYXRhID0gTlVMTDsKKwkJUFJfSU5JVCgxMjgpOworCisJCWlmICghaGV2Yy0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQlkYXRhID0gY29kZWNfbW1fdm1hcChoZXZjLT5jaHVuay0+YmxvY2stPnN0YXJ0ICsKKwkJCQloZXZjLT5jaHVuay0+b2Zmc2V0LCByKTsKKwkJZWxzZQorCQkJZGF0YSA9ICgodTggKiloZXZjLT5jaHVuay0+YmxvY2stPnN0YXJ0X3ZpcnQpCisJCQkJKyBoZXZjLT5jaHVuay0+b2Zmc2V0OworCisJCWZvciAoamogPSAwOyBqaiA8IHI7IGpqKyspIHsKKwkJCWlmICgoamogJiAweGYpID09IDApCisJCQkJUFJfRklMTCgiJTA2eDoiLCBqaik7CisJCQlQUl9GSUxMKCIlMDJ4ICIsIGRhdGFbampdKTsKKwkJCWlmICgoKGpqICsgMSkgJiAweGYpID09IDApCisJCQkJUFJfSU5GTyhoZXZjLT5pbmRleCk7CisJCX0KKwkJUFJfSU5GTyhoZXZjLT5pbmRleCk7CisKKwkJaWYgKCFoZXZjLT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIoZGF0YSk7CisJfQorCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLmRlY29kZV9ydW5fdGltZV9uYW1lLCBUUkFDRV9SVU5fTE9BRElOR19GV19TVEFSVCk7CisJaWYgKHZkZWMtPm1jX2xvYWRlZCkgeworCQkvKmZpcm13YXJlIGhhdmUgbG9hZCBiZWZvcmUsCisJCSAgYW5kIG5vdCBjaGFuZ2VzIHRvIGFub3RoZXIuCisJCSAgaWdub3JlIHJlbG9hZC4KKwkJKi8KKwkJaWYgKHRlZV9lbmFibGVkKCkgJiYgaGV2Yy0+aXNfc3dhcCAmJgorCQkJZ2V0X2NwdV9tYWpvcl9pZCgpIDw9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWE0pCisJCQlXUklURV9WUkVHKEhFVkNfU1RSRUFNX1NXQVBfQlVGRkVSMiwgaGV2Yy0+c3dhcF9hZGRyKTsKKwl9IGVsc2UgeworCQlpZiAoaGV2Yy0+bW11X2VuYWJsZSkKKwkJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPiBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hNKQorCQkJCWxvYWRyID0gYW1oZXZjX3ZkZWNfbG9hZG1jX2V4KFZGT1JNQVRfSEVWQywgdmRlYywKKwkJCQkJCSJoMjY1X21tdSIsIGhldmMtPmZ3LT5kYXRhKTsKKwkJCWVsc2UgeworCQkJCWlmICghaGV2Yy0+aXNfNGspIHsKKwkJCQkJLyogaWYgYW4gb2xkZXIgdmVyc2lvbiBvZiB0aGUgZncgd2FzIGxvYWRlZCwgKi8KKwkJCQkJLyogbmVlZHMgdHJ5IHRvIGxvYWQgbm9zd2FwIGZ3IGJlY2F1c2UgdGhlICovCisJCQkJCS8qIG9sZCBmdyBwYWNrYWdlIGRvc2Ugbm90IGNvbnRhaW4gdGhlIHN3YXAgZncuKi8KKwkJCQkJbG9hZHIgPSBhbWhldmNfdmRlY19sb2FkbWNfZXgoCisJCQkJCQlWRk9STUFUX0hFVkMsIHZkZWMsCisJCQkJCQkiaGV2Y19tbXVfc3dhcCIsCisJCQkJCQloZXZjLT5mdy0+ZGF0YSk7CisJCQkJCWlmIChsb2FkciA8IDApCisJCQkJCQlsb2FkciA9IGFtaGV2Y192ZGVjX2xvYWRtY19leCgKKwkJCQkJCQlWRk9STUFUX0hFVkMsIHZkZWMsCisJCQkJCQkJImgyNjVfbW11IiwKKwkJCQkJCQloZXZjLT5mdy0+ZGF0YSk7CisJCQkJCWVsc2UKKwkJCQkJCWhldmMtPmlzX3N3YXAgPSB0cnVlOworCQkJCX0gZWxzZQorCQkJCQlsb2FkciA9IGFtaGV2Y192ZGVjX2xvYWRtY19leCgKKwkJCQkJCVZGT1JNQVRfSEVWQywgdmRlYywKKwkJCQkJCSJoMjY1X21tdSIsIGhldmMtPmZ3LT5kYXRhKTsKKwkJCX0KKwkJZWxzZQorCQkJbG9hZHIgPSBhbWhldmNfdmRlY19sb2FkbWNfZXgoVkZPUk1BVF9IRVZDLCB2ZGVjLAorCQkJCQlOVUxMLCBoZXZjLT5mdy0+ZGF0YSk7CisKKwkJaWYgKGxvYWRyIDwgMCkgeworCQkJYW1oZXZjX2Rpc2FibGUoKTsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwgIkgyNjU6IHRoZSAlcyBmdyBsb2FkaW5nIGZhaWxlZCwgZXJyOiAleFxuIiwKKwkJCQl0ZWVfZW5hYmxlZCgpID8gIlRFRSIgOiAibG9jYWwiLCBsb2Fkcik7CisJCQloZXZjLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9GT1JDRV9FWElUOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZoZXZjLT53b3JrKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmICh0ZWVfZW5hYmxlZCgpICYmIGhldmMtPmlzX3N3YXAgJiYKKwkJCWdldF9jcHVfbWFqb3JfaWQoKSA8PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hNKQorCQkJaGV2Yy0+c3dhcF9hZGRyID0gUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1NXQVBfQlVGRkVSMik7CisjaWZkZWYgREVUUkVGSUxMX0VOQUJMRQorCQlpZiAoaGV2Yy0+aXNfc3dhcCAmJgorCQkJZ2V0X2NwdV9tYWpvcl9pZCgpIDw9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWE0pCisJCQlpbml0X2RldHJlZmlsbF9idWYoaGV2Yyk7CisjZW5kaWYKKwkJdmRlYy0+bWNfbG9hZGVkID0gMTsKKwkJdmRlYy0+bWNfdHlwZSA9IFZGT1JNQVRfSEVWQzsKKwl9CisJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UuZGVjb2RlX3J1bl90aW1lX25hbWUsIFRSQUNFX1JVTl9MT0FESU5HX0ZXX0VORCk7CisKKwlBVFJBQ0VfQ09VTlRFUihoZXZjLT50cmFjZS5kZWNvZGVfcnVuX3RpbWVfbmFtZSwgVFJBQ0VfUlVOX0xPQURJTkdfUkVTVE9SRV9TVEFSVCk7CisJaWYgKHZoMjY1X2h3X2N0eF9yZXN0b3JlKGhldmMpIDwgMCkgeworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmhldmMtPndvcmspOworCQlyZXR1cm47CisJfQorCUFUUkFDRV9DT1VOVEVSKGhldmMtPnRyYWNlLmRlY29kZV9ydW5fdGltZV9uYW1lLCBUUkFDRV9SVU5fTE9BRElOR19SRVNUT1JFX0VORCk7CisJdmRlY19lbmFibGVfaW5wdXQodmRlYyk7CisKKwlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIEhFVkNfQUNUSU9OX0RPTkUpOworCisJaWYgKHZkZWNfZnJhbWVfYmFzZWQodmRlYykpIHsKKwkJV1JJVEVfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQsIDApOworCQlyID0gaGV2Yy0+Y2h1bmstPnNpemUgKworCQkJKGhldmMtPmNodW5rLT5vZmZzZXQgJiAoVkRFQ19GSUZPX0FMSUdOIC0gMSkpOworCQloZXZjLT5kZWNvZGVfc2l6ZSA9IHI7CisJCWlmICh2ZGVjLT5tdmZybSkKKwkJCXZkZWMtPm12ZnJtLT5mcmFtZV9zaXplID0gaGV2Yy0+Y2h1bmstPnNpemU7CisJfQorI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJZWxzZSB7CisJCWlmICh2ZGVjLT5tYXN0ZXIgfHwgdmRlYy0+c2xhdmUpCisJCQlXUklURV9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCwKKwkJCQloZXZjLT5zaGlmdF9ieXRlX2NvdW50X2xvKTsKKwl9CisjZW5kaWYKKwlXUklURV9WUkVHKEhFVkNfREVDT0RFX1NJWkUsIHIpOworCS8qV1JJVEVfVlJFRyhIRVZDX0RFQ09ERV9DT1VOVCwgaGV2Yy0+ZGVjb2RlX2lkeCk7Ki8KKwloZXZjLT5pbml0X2ZsYWcgPSAxOworCisJaWYgKGhldmMtPnBpY19saXN0X2luaXRfZmxhZyA9PSAzKQorCQlpbml0X3BpY19saXN0X2h3KGhldmMpOworCisJYmFja3VwX2RlY29kZV9zdGF0ZShoZXZjKTsKKworCXN0YXJ0X3Byb2Nlc3NfdGltZShoZXZjKTsKKwltb2RfdGltZXIoJmhldmMtPnRpbWVyLCBqaWZmaWVzKTsKKwloZXZjLT5zdGF0IHw9IFNUQVRfVElNRVJfQVJNOworCWhldmMtPnN0YXQgfD0gU1RBVF9JU1JfUkVHOworCWlmICh2ZGVjLT5tdmZybSkKKwkJdmRlYy0+bXZmcm0tPmh3X2RlY29kZV9zdGFydCA9IGxvY2FsX2Nsb2NrKCk7CisJYW1oZXZjX3N0YXJ0KCk7CisJaGV2Yy0+c3RhdCB8PSBTVEFUX1ZERUNfUlVOOworCisJQVRSQUNFX0NPVU5URVIoaGV2Yy0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9SVU5fRU5EKTsKK30KKworc3RhdGljIHZvaWQgYW1sX2ZyZWVfY2FudmFzKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJaW50IGk7CisJc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YyA9CisJCShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICopdmRlYy0+cHJpdmF0ZTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVGX1BJQ19OVU07IGkrKykgeworCQlzdHJ1Y3QgUElDX3MgKnBpYyA9IGhldmMtPm1fUElDW2ldOworCisJCWlmIChwaWMpIHsKKwkJCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQkJCXZkZWMtPmZyZWVfY2FudmFzX2V4KHBpYy0+eV9jYW52YXNfaW5kZXgsIHZkZWMtPmlkKTsKKwkJCQl2ZGVjLT5mcmVlX2NhbnZhc19leChwaWMtPnV2X2NhbnZhc19pbmRleCwgdmRlYy0+aWQpOworCQkJfQorCQkJcGljLT5jbWFfYWxsb2NfYWRkciA9IDA7CisJCX0KKwkJaGV2Yy0+YnVmZmVyX3dyYXBbaV0gPSBpOworCX0KK30KKworc3RhdGljIHZvaWQgcmVzZXQoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpoZXZjID0KKwkJKHN0cnVjdCBoZXZjX3N0YXRlX3MgKil2ZGVjLT5wcml2YXRlOworCWludCBpOworCisJY2FuY2VsX3dvcmtfc3luYygmaGV2Yy0+d29yayk7CisJY2FuY2VsX3dvcmtfc3luYygmaGV2Yy0+bm90aWZ5X3dvcmspOworCWlmIChoZXZjLT5zdGF0ICYgU1RBVF9WREVDX1JVTikgeworCQlhbWhldmNfc3RvcCgpOworCQloZXZjLT5zdGF0ICY9IH5TVEFUX1ZERUNfUlVOOworCX0KKworCWlmIChoZXZjLT5zdGF0ICYgU1RBVF9USU1FUl9BUk0pIHsKKwkJZGVsX3RpbWVyX3N5bmMoJmhldmMtPnRpbWVyKTsKKwkJaGV2Yy0+c3RhdCAmPSB+U1RBVF9USU1FUl9BUk07CisJfQorCWhldmMtPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX05PTkU7CisJcmVzZXRfcHJvY2Vzc190aW1lKGhldmMpOworCWhldmMtPnBpY19saXN0X2luaXRfZmxhZyA9IDA7CisJZGVhbGxvY19tdl9idWZzKGhldmMpOworCWFtbF9mcmVlX2NhbnZhcyh2ZGVjKTsKKwlpZiAoIWhldmMtPnJlc29sdXRpb25fY2hhbmdlKQorCQloZXZjX2xvY2FsX3VuaW5pdChoZXZjKTsKKwlpZiAodmgyNjVfbG9jYWxfaW5pdChoZXZjKSA8IDApCisJCXByX2RlYnVnKCIgJXMgbG9jYWwgaW5pdCBmYWlsXG4iLCBfX2Z1bmNfXyk7CisJZm9yIChpID0gMDsgaSA8IEJVRl9QT09MX1NJWkU7IGkrKykgeworCQloZXZjLT5tX0JVRltpXS5zdGFydF9hZHIgPSAwOworCX0KKworCWF0b21pY19zZXQoJmhldmMtPnZmX3ByZV9jb3VudCwgMCk7CisJYXRvbWljX3NldCgmaGV2Yy0+dmZfZ2V0X2NvdW50LCAwKTsKKwlhdG9taWNfc2V0KCZoZXZjLT52Zl9wdXRfY291bnQsIDApOworCWhldmMtPmVvcyA9IDA7CisJaGV2Yy0+cmVzb2x1dGlvbl9jaGFuZ2UgPSBmYWxzZTsKKworCWhldmNfcHJpbnQoaGV2YywgUFJJTlRfRkxBR19WREVDX0RFVEFJTCwgIiVzXHJcbiIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHZoMjY1X2lycV9jYihzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgaXJxKQoreworCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPQorCQkoc3RydWN0IGhldmNfc3RhdGVfcyAqKXZkZWMtPnByaXZhdGU7CisKKwlyZXR1cm4gdmgyNjVfaXNyKDAsIGhldmMpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgdmgyNjVfdGhyZWFkZWRfaXJxX2NiKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBpcnEpCit7CisJc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YyA9CisJCShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICopdmRlYy0+cHJpdmF0ZTsKKworCXJldHVybiB2aDI2NV9pc3JfdGhyZWFkX2ZuKDAsIGhldmMpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBoMjY1X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWFtaGV2Y19zdXNwZW5kKHRvX3BsYXRmb3JtX2RldmljZShkZXYpLCBkZXYtPnBvd2VyLnBvd2VyX3N0YXRlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoMjY1X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJYW1oZXZjX3Jlc3VtZSh0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBoMjY1X3BtX29wcyA9IHsKKwlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhoMjY1X3N1c3BlbmQsIGgyNjVfcmVzdW1lKQorfTsKKyNlbmRpZgorCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorc3RhdGljIHZvaWQgdmgyNjVfZHVtcF9zdGF0ZShzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCWludCBpOworCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPQorCQkoc3RydWN0IGhldmNfc3RhdGVfcyAqKXZkZWMtPnByaXZhdGU7CisJaGV2Y19wcmludChoZXZjLCAwLAorCQkiPT09PT09ICVzXG4iLCBfX2Z1bmNfXyk7CisKKwloZXZjX3ByaW50KGhldmMsIDAsCisJCSJ3aWR0aC9oZWlnaHQgKCVkLyVkKSwgcmVvcmRlcl9waWNfbnVtICVkIGlwX21vZGUgJWQgYnVmIGNvdW50KGJ1ZnNwZWMgc2l6ZSkgJWQsIHZpZGVvX3NpZ25hbF90eXBlIDB4JXgsIGlzX3N3YXAgJWQgaV9vbmx5IDB4JXhcbiIsCisJCWhldmMtPmZyYW1lX3dpZHRoLAorCQloZXZjLT5mcmFtZV9oZWlnaHQsCisJCWhldmMtPnNwc19udW1fcmVvcmRlcl9waWNzXzAsCisJCWhldmMtPmlwX21vZGUsCisJCWhldmMtPnVzZWRfYnVmX251bSwKKwkJaGV2Yy0+dmlkZW9fc2lnbmFsX3R5cGVfZGVidWcsCisJCWhldmMtPmlzX3N3YXAsCisJCWhldmMtPmlfb25seQorCQkpOworCisJaGV2Y19wcmludChoZXZjLCAwLAorCQkiaXNfZnJhbWViYXNlKCVkKSwgZW9zICVkLCBkZWNfcmVzdWx0IDB4JXggZGVjX2ZybSAlZCBkaXNwX2ZybSAlZCBydW4gJWQgbm90X3J1bl9yZWFkeSAlZCBpbnB1dF9lbXB0eSAlZFxuIiwKKwkJaW5wdXRfZnJhbWVfYmFzZWQodmRlYyksCisJCWhldmMtPmVvcywKKwkJaGV2Yy0+ZGVjX3Jlc3VsdCwKKwkJZGVjb2RlX2ZyYW1lX2NvdW50W2hldmMtPmluZGV4XSwKKwkJZGlzcGxheV9mcmFtZV9jb3VudFtoZXZjLT5pbmRleF0sCisJCXJ1bl9jb3VudFtoZXZjLT5pbmRleF0sCisJCW5vdF9ydW5fcmVhZHlbaGV2Yy0+aW5kZXhdLAorCQlpbnB1dF9lbXB0eVtoZXZjLT5pbmRleF0KKwkJKTsKKworCWlmIChoZXZjLT5pc191c2VkX3Y0bCAmJiB2Zl9nZXRfcmVjZWl2ZXIodmRlYy0+dmZfcHJvdmlkZXJfbmFtZSkpIHsKKwkJZW51bSByZWNldml2ZXJfc3RhcnRfZSBzdGF0ZSA9CisJCXZmX25vdGlmeV9yZWNlaXZlcih2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1FVUkVZX1NUQVRFLAorCQkJTlVMTCk7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJcbnJlY2VpdmVyKCVzKSBzdGF0ZSAlZFxuIiwKKwkJCXZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQlzdGF0ZSk7CisJfQorCisJaGV2Y19wcmludChoZXZjLCAwLAorCSIlcywgbmV3cSglZC8lZCksIGRpc3BxKCVkLyVkKSwgdmYgcHJlcGFyZS9nZXQvcHV0ICglZC8lZC8lZCksIHBpY19saXN0X2luaXRfZmxhZyglZCksIGlzX25ld19waWNfYXZhaWxhYmxlKCVkKVxuIiwKKwlfX2Z1bmNfXywKKwlrZmlmb19sZW4oJmhldmMtPm5ld2ZyYW1lX3EpLAorCVZGX1BPT0xfU0laRSwKKwlrZmlmb19sZW4oJmhldmMtPmRpc3BsYXlfcSksCisJVkZfUE9PTF9TSVpFLAorCWhldmMtPnZmX3ByZV9jb3VudCwKKwloZXZjLT52Zl9nZXRfY291bnQsCisJaGV2Yy0+dmZfcHV0X2NvdW50LAorCWhldmMtPnBpY19saXN0X2luaXRfZmxhZywKKwlpc19uZXdfcGljX2F2YWlsYWJsZShoZXZjKQorCSk7CisKKwlkdW1wX3BpY19saXN0KGhldmMpOworCisJZm9yIChpID0gMDsgaSA8IEJVRl9QT09MX1NJWkU7IGkrKykgeworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiQnVmKCVkKSBzdGFydF9hZHIgMHgleCBoZWFkZXJfYWRkciAweCV4IHNpemUgMHgleCB1c2VkICVkXG4iLAorCQkJaSwKKwkJCWhldmMtPm1fQlVGW2ldLnN0YXJ0X2FkciwKKwkJCWhldmMtPm1fQlVGW2ldLmhlYWRlcl9hZGRyLAorCQkJaGV2Yy0+bV9CVUZbaV0uc2l6ZSwKKwkJCWhldmMtPm1fQlVGW2ldLnVzZWRfZmxhZyk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE1BWF9SRUZfUElDX05VTTsgaSsrKSB7CisJCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJCSJtdl9CdWYoJWQpIHN0YXJ0X2FkciAweCV4IHNpemUgMHgleCB1c2VkICVkXG4iLAorCQkJaSwKKwkJCWhldmMtPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciwKKwkJCWhldmMtPm1fbXZfQlVGW2ldLnNpemUsCisJCQloZXZjLT5tX212X0JVRltpXS51c2VkX2ZsYWcpOworCX0KKworCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJIkhFVkNfREVDX1NUQVRVU19SRUc9MHgleFxuIiwKKwkJUkVBRF9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcpKTsKKwloZXZjX3ByaW50KGhldmMsIDAsCisJCSJIRVZDX01QQ19FPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX01QQ19FKSk7CisJaGV2Y19wcmludChoZXZjLCAwLAorCQkiSEVWQ19ERUNPREVfTU9ERT0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19ERUNPREVfTU9ERSkpOworCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJIkhFVkNfREVDT0RFX01PREUyPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX0RFQ09ERV9NT0RFMikpOworCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJIk5BTF9TRUFSQ0hfQ1RMPTB4JXhcbiIsCisJCVJFQURfVlJFRyhOQUxfU0VBUkNIX0NUTCkpOworCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJIkhFVkNfUEFSU0VSX0xDVV9TVEFSVD0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfTENVX1NUQVJUKSk7CisJaGV2Y19wcmludChoZXZjLCAwLAorCQkiSEVWQ19ERUNPREVfU0laRT0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19ERUNPREVfU0laRSkpOworCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJIkhFVkNfU0hJRlRfQllURV9DT1VOVD0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKSk7CisJaGV2Y19wcmludChoZXZjLCAwLAorCQkiSEVWQ19TVFJFQU1fU1RBUlRfQUREUj0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fU1RBUlRfQUREUikpOworCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJIkhFVkNfU1RSRUFNX0VORF9BRERSPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9FTkRfQUREUikpOworCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJIkhFVkNfU1RSRUFNX0xFVkVMPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9MRVZFTCkpOworCWhldmNfcHJpbnQoaGV2YywgMCwKKwkJIkhFVkNfU1RSRUFNX1dSX1BUUj0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fV1JfUFRSKSk7CisJaGV2Y19wcmludChoZXZjLCAwLAorCQkiSEVWQ19TVFJFQU1fUkRfUFRSPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIpKTsKKwloZXZjX3ByaW50KGhldmMsIDAsCisJCSJQQVJTRVJfVklERU9fUlA9MHgleFxuIiwKKwkJU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3JwKSk7CisJaGV2Y19wcmludChoZXZjLCAwLAorCQkiUEFSU0VSX1ZJREVPX1dQPTB4JXhcbiIsCisJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCkpOworCisJaWYgKGlucHV0X2ZyYW1lX2Jhc2VkKHZkZWMpICYmCisJCShnZXRfZGJnX2ZsYWcoaGV2YykgJiBQUklOVF9GUkFNRUJBU0VfREFUQSkKKwkJKSB7CisJCWludCBqajsKKwkJUFJfSU5JVCgxMjgpOworCisJCWlmIChoZXZjLT5jaHVuayAmJiBoZXZjLT5jaHVuay0+YmxvY2sgJiYKKwkJCWhldmMtPmNodW5rLT5zaXplID4gMCkgeworCQkJdTggKmRhdGEgPSBOVUxMOworCQkJaWYgKCFoZXZjLT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJCQlkYXRhID0gY29kZWNfbW1fdm1hcChoZXZjLT5jaHVuay0+YmxvY2stPnN0YXJ0ICsKKwkJCQkJaGV2Yy0+Y2h1bmstPm9mZnNldCwgaGV2Yy0+Y2h1bmstPnNpemUpOworCQkJZWxzZQorCQkJCWRhdGEgPSAoKHU4ICopaGV2Yy0+Y2h1bmstPmJsb2NrLT5zdGFydF92aXJ0KQorCQkJCQkrIGhldmMtPmNodW5rLT5vZmZzZXQ7CisJCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkJImZyYW1lIGRhdGEgc2l6ZSAweCV4XG4iLAorCQkJCWhldmMtPmNodW5rLT5zaXplKTsKKwkJCWZvciAoamogPSAwOyBqaiA8IGhldmMtPmNodW5rLT5zaXplOyBqaisrKSB7CisJCQkJaWYgKChqaiAmIDB4ZikgPT0gMCkKKwkJCQkJUFJfRklMTCgiJTA2eDoiLCBqaik7CisJCQkJUFJfRklMTCgiJTAyeCAiLCBkYXRhW2pqXSk7CisJCQkJaWYgKCgoamogKyAxKSAmIDB4ZikgPT0gMCkKKwkJCQkJUFJfSU5GTyhoZXZjLT5pbmRleCk7CisJCQl9CisJCQlQUl9JTkZPKGhldmMtPmluZGV4KTsKKworCQkJaWYgKCFoZXZjLT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJCQljb2RlY19tbV91bm1hcF9waHlhZGRyKGRhdGEpOworCQl9CisJfQorCit9CisKKworc3RhdGljIGludCBhbW12ZGVjX2gyNjVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKworCXN0cnVjdCB2ZGVjX3MgKnBkYXRhID0gKihzdHJ1Y3QgdmRlY19zICoqKXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBoZXZjX3N0YXRlX3MgKmhldmMgPSBOVUxMOworCWludCByZXQ7CisJaW50IGk7CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfTVVMVElfREVDCisJaW50IGNvbmZpZ192YWw7CisjZW5kaWYKKworCWlmIChwZGF0YSA9PSBOVUxMKSB7CisJCXByX2luZm8oIlxuYW1tdmRlY19oMjY1IG1lbW9yeSByZXNvdXJjZSB1bmRlZmluZWQuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJLyogaGV2YyA9IChzdHJ1Y3QgaGV2Y19zdGF0ZV9zICopZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCisJCXNpemVvZihzdHJ1Y3QgaGV2Y19zdGF0ZV9zKSwgR0ZQX0tFUk5FTCk7ICovCisJaGV2YyA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBoZXZjX3N0YXRlX3MpKTsKKwlpZiAoaGV2YyA9PSBOVUxMKSB7CisJCXByX2luZm8oIlxuYW1tdmRlY19oMjY1IGRldmljZSBkYXRhIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChoZXZjLCAwLCBzaXplb2Yoc3RydWN0IGhldmNfc3RhdGVfcykpOworCisJLyogdGhlIGN0eCBmcm9tIHY0bDIgZHJpdmVyLiAqLworCWhldmMtPnY0bDJfY3R4ID0gcGRhdGEtPnByaXZhdGU7CisKKwlwZGF0YS0+cHJpdmF0ZSA9IGhldmM7CisJcGRhdGEtPmRlY19zdGF0dXMgPSB2aDI2NV9kZWNfc3RhdHVzOworCXBkYXRhLT5zZXRfdHJpY2ttb2RlID0gdmgyNjVfc2V0X3RyaWNrbW9kZTsKKwlwZGF0YS0+cnVuX3JlYWR5ID0gcnVuX3JlYWR5OworCXBkYXRhLT5ydW4gPSBydW47CisJcGRhdGEtPnJlc2V0ID0gcmVzZXQ7CisJcGRhdGEtPmlycV9oYW5kbGVyID0gdmgyNjVfaXJxX2NiOworCXBkYXRhLT50aHJlYWRlZF9pcnFfaGFuZGxlciA9IHZoMjY1X3RocmVhZGVkX2lycV9jYjsKKwlwZGF0YS0+ZHVtcF9zdGF0ZSA9IHZoMjY1X2R1bXBfc3RhdGU7CisKKwloZXZjLT5pbmRleCA9IHBkZXYtPmlkOworCWhldmMtPm1faW5zX2ZsYWcgPSAxOworCisKKwlpZiAoaXNfcmRtYV9lbmFibGUoKSkgeworCQloZXZjLT5yZG1hX2FkciA9IGRtYV9hbGxvY19jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksIFJETUFfU0laRSwgJmhldmMtPnJkbWFfcGh5X2FkciwgR0ZQX0tFUk5FTCk7CisJCWZvciAoaSA9IDA7IGkgPCBTQ0FMRUxVVF9EQVRBX1dSSVRFX05VTTsgaSsrKSB7CisJCQloZXZjLT5yZG1hX2FkcltpICogNF0gPSBIRVZDX0lRSVRfU0NBTEVMVVRfV1JfQUREUiAmIDB4ZmZmOworCQkJaGV2Yy0+cmRtYV9hZHJbaSAqIDQgKyAxXSA9IGk7CisJCQloZXZjLT5yZG1hX2FkcltpICogNCArIDJdID0gSEVWQ19JUUlUX1NDQUxFTFVUX0RBVEEgJiAweGZmZjsKKwkJCWhldmMtPnJkbWFfYWRyW2kgKiA0ICsgM10gPSAwOworCQkJaWYgKGkgPT0gU0NBTEVMVVRfREFUQV9XUklURV9OVU0gLSAxKSB7CisJCQkJaGV2Yy0+cmRtYV9hZHJbaSAqIDQgKyAyXSA9IChIRVZDX0lRSVRfU0NBTEVMVVRfREFUQSAmIDB4ZmZmKSB8IDB4MjAwMDA7CisJCQl9CisJCX0KKwl9CisJc25wcmludGYoaGV2Yy0+dHJhY2UudmRlY19uYW1lLCBzaXplb2YoaGV2Yy0+dHJhY2UudmRlY19uYW1lKSwKKwkJImgyNjUtJWQiLCBoZXZjLT5pbmRleCk7CisJc25wcmludGYoaGV2Yy0+dHJhY2UucHRzX25hbWUsIHNpemVvZihoZXZjLT50cmFjZS5wdHNfbmFtZSksCisJCSIlcy10aW1lc3RhbXAiLCBoZXZjLT50cmFjZS52ZGVjX25hbWUpOworCXNucHJpbnRmKGhldmMtPnRyYWNlLnZmX2dldF9uYW1lLCBzaXplb2YoaGV2Yy0+dHJhY2UudmZfZ2V0X25hbWUpLAorCQkiJXMtdmZfZ2V0IiwgaGV2Yy0+dHJhY2UudmRlY19uYW1lKTsKKwlzbnByaW50ZihoZXZjLT50cmFjZS52Zl9wdXRfbmFtZSwgc2l6ZW9mKGhldmMtPnRyYWNlLnZmX3B1dF9uYW1lKSwKKwkJIiVzLXZmX3B1dCIsIGhldmMtPnRyYWNlLnZkZWNfbmFtZSk7CisJc25wcmludGYoaGV2Yy0+dHJhY2Uuc2V0X2NhbnZhczBfYWRkciwgc2l6ZW9mKGhldmMtPnRyYWNlLnNldF9jYW52YXMwX2FkZHIpLAorCQkiJXMtc2V0X2NhbnZhczBfYWRkciIsIGhldmMtPnRyYWNlLnZkZWNfbmFtZSk7CisJc25wcmludGYoaGV2Yy0+dHJhY2UuZ2V0X2NhbnZhczBfYWRkciwgc2l6ZW9mKGhldmMtPnRyYWNlLmdldF9jYW52YXMwX2FkZHIpLAorCQkiJXMtZ2V0X2NhbnZhczBfYWRkciIsIGhldmMtPnRyYWNlLnZkZWNfbmFtZSk7CisJc25wcmludGYoaGV2Yy0+dHJhY2UucHV0X2NhbnZhczBfYWRkciwgc2l6ZW9mKGhldmMtPnRyYWNlLnB1dF9jYW52YXMwX2FkZHIpLAorCQkiJXMtcHV0X2NhbnZhczBfYWRkciIsIGhldmMtPnRyYWNlLnZkZWNfbmFtZSk7CisJc25wcmludGYoaGV2Yy0+dHJhY2UubmV3X3FfbmFtZSwgc2l6ZW9mKGhldmMtPnRyYWNlLm5ld19xX25hbWUpLAorCQkiJXMtbmV3ZnJhbWVfcSIsIGhldmMtPnRyYWNlLnZkZWNfbmFtZSk7CisJc25wcmludGYoaGV2Yy0+dHJhY2UuZGlzcF9xX25hbWUsIHNpemVvZihoZXZjLT50cmFjZS5kaXNwX3FfbmFtZSksCisJCSIlcy1kaXNwZnJhbWVfcSIsIGhldmMtPnRyYWNlLnZkZWNfbmFtZSk7CisJc25wcmludGYoaGV2Yy0+dHJhY2UubmV3X3FfbmFtZSwgc2l6ZW9mKGhldmMtPnRyYWNlLm5ld19xX25hbWUpLAorCQkiJXMtbmV3ZnJhbWVfcSIsIGhldmMtPnRyYWNlLnZkZWNfbmFtZSk7CisJc25wcmludGYoaGV2Yy0+dHJhY2UuZGlzcF9xX25hbWUsIHNpemVvZihoZXZjLT50cmFjZS5kaXNwX3FfbmFtZSksCisJCSIlcy1kaXNwZnJhbWVfcSIsIGhldmMtPnRyYWNlLnZkZWNfbmFtZSk7CisJc25wcmludGYoaGV2Yy0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgc2l6ZW9mKGhldmMtPnRyYWNlLmRlY29kZV90aW1lX25hbWUpLAorCQkiZGVjb2Rlcl90aW1lJWQiLCBwZGV2LT5pZCk7CisJc25wcmludGYoaGV2Yy0+dHJhY2UuZGVjb2RlX3J1bl90aW1lX25hbWUsIHNpemVvZihoZXZjLT50cmFjZS5kZWNvZGVfcnVuX3RpbWVfbmFtZSksCisJCSJkZWNvZGVyX3J1bl90aW1lJWQiLCBwZGV2LT5pZCk7CisJc25wcmludGYoaGV2Yy0+dHJhY2UuZGVjb2RlX2hlYWRlcl9tZW1vcnlfdGltZV9uYW1lLCBzaXplb2YoaGV2Yy0+dHJhY2UuZGVjb2RlX2hlYWRlcl9tZW1vcnlfdGltZV9uYW1lKSwKKwkJImRlY29kZXJfaGVhZGVyX3RpbWUlZCIsIHBkZXYtPmlkKTsKKwlzbnByaW50ZihoZXZjLT50cmFjZS5kZWNvZGVfd29ya190aW1lX25hbWUsIHNpemVvZihoZXZjLT50cmFjZS5kZWNvZGVfd29ya190aW1lX25hbWUpLAorCQkiZGVjb2Rlcl93b3JrX3RpbWUlZCIsIHBkZXYtPmlkKTsKKworCWlmIChwZGF0YS0+dXNlX3ZmbV9wYXRoKSB7CisJCXNucHJpbnRmKHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lLAorCQlWREVDX1BST1ZJREVSX05BTUVfU0laRSwKKwkJCVZGTV9ERUNfUFJPVklERVJfTkFNRSk7CisJCWhldmMtPmZyYW1laW5mb19lbmFibGUgPSAxOworCX0KKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorCWVsc2UgaWYgKHZkZWNfZHVhbChwZGF0YSkpIHsKKwkJc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2Y19wYWlyID0gTlVMTDsKKworCQlpZiAoZHZfdG9nZ2xlX3Byb3ZfbmFtZSkgLypkZWJ1ZyBwdXJwb3NlKi8KKwkJCXNucHJpbnRmKHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJVkRFQ19QUk9WSURFUl9OQU1FX1NJWkUsCisJCQkJKHBkYXRhLT5tYXN0ZXIpID8gVkZNX0RFQ19EVkJMX1BST1ZJREVSX05BTUUgOgorCQkJCVZGTV9ERUNfRFZFTF9QUk9WSURFUl9OQU1FKTsKKwkJZWxzZQorCQkJc25wcmludGYocGRhdGEtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQlWREVDX1BST1ZJREVSX05BTUVfU0laRSwKKwkJCQkocGRhdGEtPm1hc3RlcikgPyBWRk1fREVDX0RWRUxfUFJPVklERVJfTkFNRSA6CisJCQkJVkZNX0RFQ19EVkJMX1BST1ZJREVSX05BTUUpOworCQloZXZjLT5kb2xieV9lbmhhbmNlX2ZsYWcgPSBwZGF0YS0+bWFzdGVyID8gMSA6IDA7CisJCWlmIChwZGF0YS0+bWFzdGVyKQorCQkJaGV2Y19wYWlyID0gKHN0cnVjdCBoZXZjX3N0YXRlX3MgKikKKwkJCQlwZGF0YS0+bWFzdGVyLT5wcml2YXRlOworCQllbHNlIGlmIChwZGF0YS0+c2xhdmUpCisJCQloZXZjX3BhaXIgPSAoc3RydWN0IGhldmNfc3RhdGVfcyAqKQorCQkJCXBkYXRhLT5zbGF2ZS0+cHJpdmF0ZTsKKwkJaWYgKGhldmNfcGFpcikKKwkJCWhldmMtPnNoaWZ0X2J5dGVfY291bnRfbG8gPQorCQkJaGV2Y19wYWlyLT5zaGlmdF9ieXRlX2NvdW50X2xvOworCX0KKyNlbmRpZgorCWVsc2UKKwkJc25wcmludGYocGRhdGEtPnZmX3Byb3ZpZGVyX25hbWUsIFZERUNfUFJPVklERVJfTkFNRV9TSVpFLAorCQkJTVVMVElfSU5TVEFOQ0VfUFJPVklERVJfTkFNRSAiLiUwMngiLCBwZGV2LT5pZCAmIDB4ZmYpOworCisJaGV2Yy0+cHJvdmlkZXJfbmFtZSA9IHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBkYXRhKTsKKworCWhldmMtPnBsYXRmb3JtX2RldiA9IHBkZXY7CisKKwlpZiAoKChnZXRfZGJnX2ZsYWcoaGV2YykgJiBJR05PUkVfUEFSQU1fRlJPTV9DT05GSUcpID09IDApICYmCisJCQlwZGF0YS0+Y29uZmlnX2xlbikgeworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX01VTFRJX0RFQworCQkvKnVzZSBwdHIgY29uZmlnIGZvciBkb3ViZWxfd3JpdGVfbW9kZSwgZXRjKi8KKwkJaGV2Y19wcmludChoZXZjLCAwLCAicGRhdGEtPmNvbmZpZz0lc1xuIiwgcGRhdGEtPmNvbmZpZyk7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJoZXZjX2RvdWJsZV93cml0ZV9tb2RlIiwKKwkJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWhldmMtPmRvdWJsZV93cml0ZV9tb2RlID0gY29uZmlnX3ZhbDsKKwkJZWxzZQorCQkJaGV2Yy0+ZG91YmxlX3dyaXRlX21vZGUgPSBkb3VibGVfd3JpdGVfbW9kZTsKKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgInNhdmVfYnVmZmVyX21vZGUiLAorCQkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJaGV2Yy0+c2F2ZV9idWZmZXJfbW9kZSA9IGNvbmZpZ192YWw7CisJCWVsc2UKKwkJCWhldmMtPnNhdmVfYnVmZmVyX21vZGUgPSAwOworCisJCS8qdXNlIHB0ciBjb25maWcgZm9yIG1heF9waWNfdywgZXRjKi8KKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJoZXZjX2J1Zl93aWR0aCIsCisJCQkJJmNvbmZpZ192YWwpID09IDApIHsKKwkJCQloZXZjLT5tYXhfcGljX3cgPSBjb25maWdfdmFsOworCQl9CisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAiaGV2Y19idWZfaGVpZ2h0IiwKKwkJCQkmY29uZmlnX3ZhbCkgPT0gMCkgeworCQkJCWhldmMtPm1heF9waWNfaCA9IGNvbmZpZ192YWw7CisJCX0KKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJzaWRlYmluZF90eXBlIiwKKwkJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWhldmMtPnNpZGViaW5kX3R5cGUgPSBjb25maWdfdmFsOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAic2lkZWJpbmRfY2hhbm5lbF9pZCIsCisJCQkJJmNvbmZpZ192YWwpID09IDApCisJCQloZXZjLT5zaWRlYmluZF9jaGFubmVsX2lkID0gY29uZmlnX3ZhbDsKKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywKKwkJCSJwYXJtX3Y0bF9jb2RlY19lbmFibGUiLAorCQkJJmNvbmZpZ192YWwpID09IDApCisJCQloZXZjLT5pc191c2VkX3Y0bCA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV92NGxfYnVmZmVyX21hcmdpbiIsCisJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWhldmMtPmR5bmFtaWNfYnVmX251bV9tYXJnaW4gPSBjb25maWdfdmFsOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLAorCQkJInBhcm1fdjRsX2NhbnZhc19tZW1fbW9kZSIsCisJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWhldmMtPm1lbV9tYXBfbW9kZSA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJuZWdhdGl2ZV9kdiIsCisJCQkmY29uZmlnX3ZhbCkgPT0gMCkgeworCQkJaGV2Yy0+ZGlzY2FyZF9kdl9kYXRhID0gY29uZmlnX3ZhbDsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwgImRpc2NhcmQgZHYgZGF0YVxuIik7CisJCX0KKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywKKwkJCSJwYXJtX2VuYWJsZV9mZW5jZSIsCisJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWhldmMtPmVuYWJsZV9mZW5jZSA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV9mZW5jZV91c2FnZSIsCisJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWhldmMtPmZlbmNlX3VzYWdlID0gY29uZmlnX3ZhbDsKKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywKKwkJCSJwYXJtX3Y0bF9sb3dfbGF0ZW5jeV9tb2RlIiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKSB7CisJCQloZXZjLT5sb3dfbGF0ZW5jeV9mbGFnID0gKGNvbmZpZ192YWwgJiAxKSA/IDEgOiAwOworCQkJaGV2Yy0+ZW5hYmxlX2ZlbmNlID0gKGNvbmZpZ192YWwgJiAyKSA/IDEgOiAwOworCQl9CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV92NGxfbWV0YWRhdGFfY29uZmlnX2ZsYWciLAorCQkJJmNvbmZpZ192YWwpID09IDApIHsKKwkJCWhldmMtPm1ldGFkYXRhX2NvbmZpZ19mbGFnID0gY29uZmlnX3ZhbDsKKwkJCWhldmMtPmRpc2NhcmRfZHZfZGF0YSA9IGhldmMtPm1ldGFkYXRhX2NvbmZpZ19mbGFnICYgVkRFQ19DRkdfRkxBR19EVl9ORUdBVElWRTsKKwkJCWhldmMtPmR2X2R1YWxsYXllciA9IGhldmMtPm1ldGFkYXRhX2NvbmZpZ19mbGFnICYgVkRFQ19DRkdfRkxBR19EVl9UV09MQVJZRVI7CisJCQlpZiAoaGV2Yy0+ZGlzY2FyZF9kdl9kYXRhKQorCQkJCWhldmNfcHJpbnQoaGV2YywgMCwgImRpc2NhcmQgZHYgZGF0YVxuIik7CisJCQlpZiAoaGV2Yy0+ZHZfZHVhbGxheWVyKQorCQkJCWhldmNfcHJpbnQoaGV2YywgMCwgImR2X2R1YWxsYXllclxuIik7CisJCX0KKwkJLyppZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywKKwkJCSJwYXJtX3Y0bF9kdXJhdGlvbiIsCisJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCXZkZWNfZnJhbWVfcmF0ZV91ZXZlbnQoY29uZmlnX3ZhbCk7Ki8KKyNlbmRpZgorCX0gZWxzZSB7CisJCWlmIChwZGF0YS0+c3lzX2luZm8pCisJCQloZXZjLT52aDI2NV9hbXN0cmVhbV9kZWNfaW5mbyA9ICpwZGF0YS0+c3lzX2luZm87CisJCWVsc2UgeworCQkJaGV2Yy0+dmgyNjVfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGggPSAwOworCQkJaGV2Yy0+dmgyNjVfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0ID0gMDsKKwkJCWhldmMtPnZoMjY1X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgPSAzMDsKKwkJfQorCQloZXZjLT5kb3VibGVfd3JpdGVfbW9kZSA9IGRvdWJsZV93cml0ZV9tb2RlOworCX0KKworCWlmICghaGV2Yy0+aXNfdXNlZF92NGwpCisJCXZmX3Byb3ZpZGVyX2luaXQoJnBkYXRhLT52ZnJhbWVfcHJvdmlkZXIsIHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJJnZoMjY1X3ZmX3Byb3ZpZGVyLCBwZGF0YSk7CisKKwlpZiAoZm9yY2VfY29uZmlnX2ZlbmNlKSB7CisJCWhldmMtPmVuYWJsZV9mZW5jZSA9IHRydWU7CisJCWhldmMtPmZlbmNlX3VzYWdlID0gKGZvcmNlX2NvbmZpZ19mZW5jZSA+PiA0KSAmIDB4ZjsKKwkJaWYgKGZvcmNlX2NvbmZpZ19mZW5jZSAmIDB4MikKKwkJCWhldmMtPmVuYWJsZV9mZW5jZSA9IGZhbHNlOworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiZW5hYmxlIGZlbmNlOiAlZCwgZmVuY2UgdXNhZ2U6ICVkXG4iLAorCQkJaGV2Yy0+ZW5hYmxlX2ZlbmNlLCBoZXZjLT5mZW5jZV91c2FnZSk7CisJfQorCisJaWYgKChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1KSAmJgorCQkJKGhldmMtPmRvdWJsZV93cml0ZV9tb2RlID09IDMpKQorCQloZXZjLT5kb3VibGVfd3JpdGVfbW9kZSA9IDB4MTAwMDsKKworCWhldmMtPmVuZGlhbiA9IEhFVkNfQ09ORklHX0xJVFRMRV9FTkRJQU47CisJaWYgKCFoZXZjLT5pc191c2VkX3Y0bCkgeworCQkvKiBnZXQgdmFsaWQgZG91YmxlIHdyaXRlIGZyb20gY29uZmlndXJlIG9yIG5vZGUgKi8KKwkJLy9oZXZjLT5kb3VibGVfd3JpdGVfbW9kZSA9IGdldF9kb3VibGVfd3JpdGVfbW9kZShoZXZjKTsKKwkJaWYgKGhldmMtPnNhdmVfYnVmZmVyX21vZGUgJiYgZHluYW1pY19idWZfbnVtX21hcmdpbiA+IDIpCisJCQloZXZjLT5keW5hbWljX2J1Zl9udW1fbWFyZ2luID0gZHluYW1pY19idWZfbnVtX21hcmdpbiAtMjsKKwkJZWxzZQorCQkJaGV2Yy0+ZHluYW1pY19idWZfbnVtX21hcmdpbiA9IGR5bmFtaWNfYnVmX251bV9tYXJnaW47CisKKwkJaGV2Yy0+bWVtX21hcF9tb2RlID0gbWVtX21hcF9tb2RlOworCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNykKKwkJCWhldmMtPmVuZGlhbiA9IEhFVkNfQ09ORklHX0JJR19FTkRJQU47CisJfQorCWlmIChlbmRpYW4pCisJCWhldmMtPmVuZGlhbiA9IGVuZGlhbjsKKworCWlmIChtbXVfZW5hYmxlX2ZvcmNlID09IDApIHsKKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA8IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWEwKKwkJCXx8IGhldmMtPmRvdWJsZV93cml0ZV9tb2RlID09IDB4MTApCisJCQloZXZjLT5tbXVfZW5hYmxlID0gMDsKKwkJZWxzZQorCQkJaGV2Yy0+bW11X2VuYWJsZSA9IDE7CisJfQorCisJaWYgKGhldmMtPmlzX3VzZWRfdjRsKSB7CisJCWlmIChoZXZjLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MTApCisJCQloZXZjLT5tbXVfZW5hYmxlID0gMDsKKwkJZWxzZQorCQkJaGV2Yy0+bW11X2VuYWJsZSA9IDE7CisJfQorCisJaWYgKGhldmMtPmlzX3VzZWRfdjRsICYmIChoZXZjLT52NGwyX2N0eCAhPSBOVUxMKSkgeworCQlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IGhldmMtPnY0bDJfY3R4OworCisJCWN0eC0+YXV4X2luZm9zLmFsbG9jX2J1ZmZlcihjdHgsIFNFSV9UWVBFKTsKKworCQlpZiAoIWhldmMtPmRpc2NhcmRfZHZfZGF0YSkKKwkJCWN0eC0+YXV4X2luZm9zLmFsbG9jX2J1ZmZlcihjdHgsIERWX1RZUEUpOworCX0KKworCWlmIChpbml0X21tdV9idWZmZXJzKGhldmMsIDEpIDwgMCkgeworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiXG4gMjY1IG1tdSBpbml0IGZhaWxlZCFcbiIpOworCQltdXRleF91bmxvY2soJnZoMjY1X211dGV4KTsKKwkJLyogZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCAodm9pZCAqKWhldmMpOyovCisJCWlmIChoZXZjKQorCQkJdmZyZWUoKHZvaWQgKiloZXZjKTsKKwkJcGRhdGEtPmRlY19zdGF0dXMgPSBOVUxMOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisjaWYgMAorCWhldmMtPmJ1Zl9zdGFydCA9IHBkYXRhLT5tZW1fc3RhcnQ7CisJaGV2Yy0+YnVmX3NpemUgPSBwZGF0YS0+bWVtX2VuZCAtIHBkYXRhLT5tZW1fc3RhcnQgKyAxOworI2Vsc2UKKworCXJldCA9IGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeShoZXZjLT5ibW11X2JveCwKKwkJCUJNTVVfV09SS1NQQUNFX0lELCB3b3JrX2J1Zl9zaXplLAorCQkJRFJJVkVSX05BTUUsICZoZXZjLT5idWZfc3RhcnQpOworCWlmIChyZXQgPCAwKSB7CisJCXVuaW5pdF9tbXVfYnVmZmVycyhoZXZjKTsKKwkJLyogZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCAodm9pZCAqKWhldmMpOyAqLworCQlpZiAoaGV2YykKKwkJCXZmcmVlKCh2b2lkICopaGV2Yyk7CisJCXBkYXRhLT5kZWNfc3RhdHVzID0gTlVMTDsKKwkJbXV0ZXhfdW5sb2NrKCZ2aDI2NV9tdXRleCk7CisJCXJldHVybiByZXQ7CisJfQorCWhldmMtPmJ1Zl9zaXplID0gd29ya19idWZfc2l6ZTsKKyNlbmRpZgorCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWFRWQkIpICYmCisJCShwYXJzZXJfc2VpX2VuYWJsZSAmIDB4MTAwKSA9PSAwKQorCQlwYXJzZXJfc2VpX2VuYWJsZSA9IDc7CisJaGV2Yy0+aW5pdF9mbGFnID0gMDsKKwloZXZjLT5maXJzdF9zY19jaGVja2VkID0gMDsKKwloZXZjLT51bmluaXRfbGlzdCA9IDA7CisJaGV2Yy0+ZmF0YWxfZXJyb3IgPSAwOworCWhldmMtPnNob3dfZnJhbWVfbnVtID0gMDsKKworCS8qCisJICpoZXZjLT5tY19idWZfc3BlYy5idWZfZW5kID0gcGRhdGEtPm1lbV9lbmQgKyAxOworCSAqZm9yIChpID0gMDsgaSA8IFdPUktfQlVGX1NQRUNfTlVNOyBpKyspCisJICoJYW12aDI2NV93b3JrYnVmZl9zcGVjW2ldLnN0YXJ0X2FkciA9IHBkYXRhLT5tZW1fc3RhcnQ7CisJICovCisJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSkgeworCQloZXZjX3ByaW50KGhldmMsIDAsCisJCQkiPT09SC4yNjUgZGVjb2RlciBtZW0gcmVzb3VyY2UgMHglbHggc2l6ZSAweCV4XG4iLAorCQkJICAgaGV2Yy0+YnVmX3N0YXJ0LCBoZXZjLT5idWZfc2l6ZSk7CisJfQorCisJaGV2Y19wcmludChoZXZjLCAwLAorCQkiZHluYW1pY19idWZfbnVtX21hcmdpbj0lZFxuIiwKKwkJaGV2Yy0+ZHluYW1pY19idWZfbnVtX21hcmdpbik7CisJaGV2Y19wcmludChoZXZjLCAwLAorCQkiZG91YmxlX3dyaXRlX21vZGU9JWRcbiIsCisJCWhldmMtPmRvdWJsZV93cml0ZV9tb2RlKTsKKworCWhldmMtPmNtYV9kZXYgPSBwZGF0YS0+Y21hX2RldjsKKwl2aDI2NV92ZGVjX2luZm9faW5pdChoZXZjKTsKKworCWlmICh2aDI2NV9pbml0KHBkYXRhKSA8IDApIHsKKwkJaGV2Y19wcmludChoZXZjLCAwLAorCQkJIlxuYW12ZGVjX2gyNjUgaW5pdCBmYWlsZWQuXG4iKTsKKwkJaGV2Y19sb2NhbF91bmluaXQoaGV2Yyk7CisJCWlmIChoZXZjLT5ndnMpCisJCQlrZnJlZShoZXZjLT5ndnMpOworCQloZXZjLT5ndnMgPSBOVUxMOworCQl1bmluaXRfbW11X2J1ZmZlcnMoaGV2Yyk7CisJCS8qIGRldm1fa2ZyZWUoJnBkZXYtPmRldiwgKHZvaWQgKiloZXZjKTsgKi8KKwkJaWYgKGhldmMpCisJCQl2ZnJlZSgodm9pZCAqKWhldmMpOworCQlwZGF0YS0+ZGVjX3N0YXR1cyA9IE5VTEw7CisJCXJldHVybiAtRU5PREVWOworCX0KKworI2lmZGVmIEFVWF9EQVRBX0NSQworCXZkZWNfYXV4X2RhdGFfY2hlY2tfaW5pdChwZGF0YSk7CisjZW5kaWYKKworCXZkZWNfc2V0X3ByZXBhcmVfbGV2ZWwocGRhdGEsIHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwpOworCisJLypzZXQgdGhlIG1heCBjbGsgZm9yIHNtb290aCBwbGF5aW5nLi4uKi8KKwloZXZjX3NvdXJjZV9jaGFuZ2VkKFZGT1JNQVRfSEVWQywKKwkJCTM4NDAsIDIxNjAsIDYwKTsKKwlpZiAocGRhdGEtPnBhcmFsbGVsX2RlYyA9PSAxKQorCQl2ZGVjX2NvcmVfcmVxdWVzdChwZGF0YSwgQ09SRV9NQVNLX0hFVkMpOworCWVsc2UKKwkJdmRlY19jb3JlX3JlcXVlc3QocGRhdGEsIENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQworCQkJCQl8IENPUkVfTUFTS19DT01CSU5FKTsKKwltdXRleF9pbml0KCZoZXZjLT5mZW5jZV9tdXRleCk7CisJaWYgKGhldmMtPmVuYWJsZV9mZW5jZSkgeworCQlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShoZXZjLT52NGwyX2N0eCk7CisKKwkJcGRhdGEtPnN5bmMgPSB2ZGVjX3N5bmNfZ2V0KCk7CisJCWlmICghcGRhdGEtPnN5bmMpIHsKKwkJCWhldmNfcHJpbnQoaGV2YywgMCwgImFsbG9jIGZlbmNlIHRpbWVsaW5lIGVycm9yXG4iKTsKKwkJCWhldmNfbG9jYWxfdW5pbml0KGhldmMpOworCQkJaWYgKGhldmMtPmd2cykKKwkJCQlrZnJlZShoZXZjLT5ndnMpOworCQkJaGV2Yy0+Z3ZzID0gTlVMTDsKKwkJCXVuaW5pdF9tbXVfYnVmZmVycyhoZXZjKTsKKwkJCS8qIGRldm1fa2ZyZWUoJnBkZXYtPmRldiwgKHZvaWQgKiloZXZjKTsgKi8KKwkJCWlmIChoZXZjKQorCQkJCXZmcmVlKCh2b2lkICopaGV2Yyk7CisJCQlwZGF0YS0+ZGVjX3N0YXR1cyA9IE5VTEw7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQljdHgtPnN5bmMgPSBwZGF0YS0+c3luYzsKKwkJcGRhdGEtPnN5bmMtPnVzYWdlID0gaGV2Yy0+ZmVuY2VfdXNhZ2U7CisJCS8qIGNyZWF0IHRpbWVsaW5lLiAqLworCQl2ZGVjX3RpbWVsaW5lX2NyZWF0ZShwZGF0YS0+c3luYywgRFJJVkVSX05BTUUpOworCQl2ZGVjX3RpbWVsaW5lX2dldChwZGF0YS0+c3luYyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZkZWNfZmVuY2VfcmVsZWFzZShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICpodywKKwkJCSAgICAgICBzdHJ1Y3QgdmRlY19zeW5jICpzeW5jKQoreworCXVsb25nIGV4cGlyZXM7CisKKwkvKiBub3RpZnkgc2lnbmFsIHRvIHdha2UgdXAgYWxsIGZlbmNlcy4gKi8KKwl2ZGVjX3RpbWVsaW5lX2luY3JlYXNlKHN5bmMsIFZGX1BPT0xfU0laRSk7CisKKwlleHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjAwMCk7CisJd2hpbGUgKCFjaGVja19vYmpzX2FsbF9zaWduYWxlZChzeW5jKSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBleHBpcmVzKSkgeworCQkJcHJfZXJyKCJ3YWl0IGZlbmNlIHNpZ25hbGVkIHRpbWVvdXQuXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogZGVjcmVhc2VzIHJlZmNudCBvZiB0aW1lbGluZS4gKi8KKwl2ZGVjX3RpbWVsaW5lX3B1dChzeW5jKTsKK30KKworc3RhdGljIGludCBhbW12ZGVjX2gyNjVfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGhldmNfc3RhdGVfcyAqaGV2YyA9CisJCShzdHJ1Y3QgaGV2Y19zdGF0ZV9zICopCisJCSgoKHN0cnVjdCB2ZGVjX3MgKikocGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldikpKS0+cHJpdmF0ZSk7CisJc3RydWN0IHZkZWNfcyAqdmRlYzsKKworCWlmIChoZXZjID09IE5VTEwpCisJCXJldHVybiAwOworCXZkZWMgPSBod190b192ZGVjKGhldmMpOworCisjaWZkZWYgQVVYX0RBVEFfQ1JDCisJdmRlY19hdXhfZGF0YV9jaGVja19leGl0KHZkZWMpOworI2VuZGlmCisKKwkvL3ByX2VycigiJXMgW3BpZD0lZCx0Z2lkPSVkXVxuIiwgX19mdW5jX18sIGN1cnJlbnQtPnBpZCwgY3VycmVudC0+dGdpZCk7CisJaWYgKGdldF9kYmdfZmxhZyhoZXZjKSkKKwkJaGV2Y19wcmludChoZXZjLCAwLCAiJXNcclxuIiwgX19mdW5jX18pOworCisJdm1oMjY1X3N0b3AoaGV2Yyk7CisKKwkvKiB2ZGVjX3NvdXJjZV9jaGFuZ2VkKFZGT1JNQVRfSDI2NCwgMCwgMCwgMCk7ICovCisJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKQorCQl2ZGVjX2NvcmVfcmVsZWFzZShod190b192ZGVjKGhldmMpLCBDT1JFX01BU0tfSEVWQyk7CisJZWxzZQorCQl2ZGVjX2NvcmVfcmVsZWFzZShod190b192ZGVjKGhldmMpLCBDT1JFX01BU0tfSEVWQyk7CisKKwl2ZGVjX3NldF9zdGF0dXMoaHdfdG9fdmRlYyhoZXZjKSwgVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEKTsKKworCWlmIChoZXZjLT5lbmFibGVfZmVuY2UpCisJCXZkZWNfZmVuY2VfcmVsZWFzZShoZXZjLCB2ZGVjLT5zeW5jKTsKKwlpZiAoaXNfcmRtYV9lbmFibGUoKSkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLCBSRE1BX1NJWkUsIGhldmMtPnJkbWFfYWRyLCBoZXZjLT5yZG1hX3BoeV9hZHIpOworCXZmcmVlKCh2b2lkICopaGV2Yyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYW1tdmRlY19oMjY1X2RyaXZlciA9IHsKKwkucHJvYmUgPSBhbW12ZGVjX2gyNjVfcHJvYmUsCisJLnJlbW92ZSA9IGFtbXZkZWNfaDI2NV9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBNVUxUSV9EUklWRVJfTkFNRSwKKyNpZmRlZiBDT05GSUdfUE0KKwkJLnBtID0gJmgyNjVfcG1fb3BzLAorI2VuZGlmCisJfQorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGNvZGVjX3Byb2ZpbGVfdCBhbXZkZWNfaDI2NV9wcm9maWxlID0geworCS5uYW1lID0gIkguMjY1LVY0TCIsCisJLnByb2ZpbGUgPSAiIgorfTsKKworc3RhdGljIHN0cnVjdCBtY29uZmlnIGgyNjVfY29uZmlnc1tdID0geworCU1DX1BVMzIoInVzZV9jbWEiLCAmdXNlX2NtYSksCisJTUNfUFUzMigiYml0X2RlcHRoX2x1bWEiLCAmYml0X2RlcHRoX2x1bWEpLAorCU1DX1BVMzIoImJpdF9kZXB0aF9jaHJvbWEiLCAmYml0X2RlcHRoX2Nocm9tYSksCisJTUNfUFUzMigidmlkZW9fc2lnbmFsX3R5cGUiLCAmdmlkZW9fc2lnbmFsX3R5cGUpLAorI2lmZGVmIEVSUk9SX0hBTkRMRV9ERUJVRworCU1DX1BVMzIoImRiZ19uYWxfc2tpcF9mbGFnIiwgJmRiZ19uYWxfc2tpcF9mbGFnKSwKKwlNQ19QVTMyKCJkYmdfbmFsX3NraXBfY291bnQiLCAmZGJnX25hbF9za2lwX2NvdW50KSwKKyNlbmRpZgorCU1DX1BVMzIoInJhZHIiLCAmcmFkciksCisJTUNfUFUzMigicnZhbCIsICZydmFsKSwKKwlNQ19QVTMyKCJkYmdfY21kIiwgJmRiZ19jbWQpLAorCU1DX1BVMzIoImRiZ19za2lwX2RlY29kZV9pbmRleCIsICZkYmdfc2tpcF9kZWNvZGVfaW5kZXgpLAorCU1DX1BVMzIoImVuZGlhbiIsICZlbmRpYW4pLAorCU1DX1BVMzIoInN0ZXAiLCAmc3RlcCksCisJTUNfUFUzMigidWRlYnVnX2ZsYWciLCAmdWRlYnVnX2ZsYWcpLAorCU1DX1BVMzIoImRlY29kZV9waWNfYmVnaW4iLCAmZGVjb2RlX3BpY19iZWdpbiksCisJTUNfUFUzMigic2xpY2VfcGFyc2VfYmVnaW4iLCAmc2xpY2VfcGFyc2VfYmVnaW4pLAorCU1DX1BVMzIoIm5hbF9za2lwX3BvbGljeSIsICZuYWxfc2tpcF9wb2xpY3kpLAorCU1DX1BVMzIoImlfb25seV9mbGFnIiwgJmlfb25seV9mbGFnKSwKKwlNQ19QVTMyKCJlcnJvcl9oYW5kbGVfcG9saWN5IiwgJmVycm9yX2hhbmRsZV9wb2xpY3kpLAorCU1DX1BVMzIoImVycm9yX2hhbmRsZV90aHJlc2hvbGQiLCAmZXJyb3JfaGFuZGxlX3RocmVzaG9sZCksCisJTUNfUFUzMigiZXJyb3JfaGFuZGxlX25hbF9za2lwX3RocmVzaG9sZCIsCisJCSZlcnJvcl9oYW5kbGVfbmFsX3NraXBfdGhyZXNob2xkKSwKKwlNQ19QVTMyKCJlcnJvcl9oYW5kbGVfc3lzdGVtX3RocmVzaG9sZCIsCisJCSZlcnJvcl9oYW5kbGVfc3lzdGVtX3RocmVzaG9sZCksCisJTUNfUFUzMigiZXJyb3Jfc2tpcF9uYWxfY291bnQiLCAmZXJyb3Jfc2tpcF9uYWxfY291bnQpLAorCU1DX1BVMzIoImRlYnVnIiwgJmRlYnVnKSwKKwlNQ19QVTMyKCJkZWJ1Z19tYXNrIiwgJmRlYnVnX21hc2spLAorCU1DX1BVMzIoImJ1ZmZlcl9tb2RlIiwgJmJ1ZmZlcl9tb2RlKSwKKwlNQ19QVTMyKCJkb3VibGVfd3JpdGVfbW9kZSIsICZkb3VibGVfd3JpdGVfbW9kZSksCisJTUNfUFUzMigiYnVmX2FsbG9jX3dpZHRoIiwgJmJ1Zl9hbGxvY193aWR0aCksCisJTUNfUFUzMigiYnVmX2FsbG9jX2hlaWdodCIsICZidWZfYWxsb2NfaGVpZ2h0KSwKKwlNQ19QVTMyKCJkeW5hbWljX2J1Zl9udW1fbWFyZ2luIiwgJmR5bmFtaWNfYnVmX251bV9tYXJnaW4pLAorCU1DX1BVMzIoIm1heF9idWZfbnVtIiwgJm1heF9idWZfbnVtKSwKKwlNQ19QVTMyKCJidWZfYWxsb2Nfc2l6ZSIsICZidWZfYWxsb2Nfc2l6ZSksCisJTUNfUFUzMigiYnVmZmVyX21vZGVfZGJnIiwgJmJ1ZmZlcl9tb2RlX2RiZyksCisJTUNfUFUzMigibWVtX21hcF9tb2RlIiwgJm1lbV9tYXBfbW9kZSksCisJTUNfUFUzMigiZW5hYmxlX21lbV9zYXZpbmciLCAmZW5hYmxlX21lbV9zYXZpbmcpLAorCU1DX1BVMzIoImZvcmNlX3dfaCIsICZmb3JjZV93X2gpLAorCU1DX1BVMzIoImZvcmNlX2ZwcyIsICZmb3JjZV9mcHMpLAorCU1DX1BVMzIoIm1heF9kZWNvZGluZ190aW1lIiwgJm1heF9kZWNvZGluZ190aW1lKSwKKwlNQ19QVTMyKCJwcmVmaXhfYXV4X2J1Zl9zaXplIiwgJnByZWZpeF9hdXhfYnVmX3NpemUpLAorCU1DX1BVMzIoInN1ZmZpeF9hdXhfYnVmX3NpemUiLCAmc3VmZml4X2F1eF9idWZfc2l6ZSksCisJTUNfUFUzMigiaW50ZXJsYWNlX2VuYWJsZSIsICZpbnRlcmxhY2VfZW5hYmxlKSwKKwlNQ19QVTMyKCJwdHNfdW5zdGFibGUiLCAmcHRzX3Vuc3RhYmxlKSwKKwlNQ19QVTMyKCJwYXJzZXJfc2VpX2VuYWJsZSIsICZwYXJzZXJfc2VpX2VuYWJsZSksCisJTUNfUFUzMigic3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCIsICZzdGFydF9kZWNvZGVfYnVmX2xldmVsKSwKKwlNQ19QVTMyKCJkZWNvZGVfdGltZW91dF92YWwiLCAmZGVjb2RlX3RpbWVvdXRfdmFsKSwKKwlNQ19QVTMyKCJwYXJzZXJfZG9sYnlfdmlzaW9uX2VuYWJsZSIsICZwYXJzZXJfZG9sYnlfdmlzaW9uX2VuYWJsZSksCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwlNQ19QVTMyKCJkdl90b2dnbGVfcHJvdl9uYW1lIiwgJmR2X3RvZ2dsZV9wcm92X25hbWUpLAorCU1DX1BVMzIoImR2X2RlYnVnIiwgJmR2X2RlYnVnKSwKKyNlbmRpZgorfTsKK3N0YXRpYyBzdHJ1Y3QgbWNvbmZpZ19ub2RlIGRlY29kZXJfMjY1X25vZGU7CisKK3N0YXRpYyBpbnQgX19pbml0IGFtdmRlY19oMjY1X2RyaXZlcl9pbml0X21vZHVsZSh2b2lkKQoreworCXN0cnVjdCBCdWZmSW5mb19zICpwX2J1Zl9pbmZvOworCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA8PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVE0yICYmICFpc19jcHVfdG0yX3JldmIoKSkgeworCQlpZiAodmRlY19pc19zdXBwb3J0XzRrKCkpIHsKKwkJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkKKwkJCQlwX2J1Zl9pbmZvID0gJmFtdmgyNjVfd29ya2J1ZmZfc3BlY1syXTsKKwkJCWVsc2UKKwkJCQlwX2J1Zl9pbmZvID0gJmFtdmgyNjVfd29ya2J1ZmZfc3BlY1sxXTsKKwkJfSBlbHNlCisJCQlwX2J1Zl9pbmZvID0gJmFtdmgyNjVfd29ya2J1ZmZfc3BlY1swXTsKKwl9IGVsc2UgeyAvL2dldF9jcHVfbWFqb3JfaWQoKSA+IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UTTIgfHwgaXNfY3B1X3RtMl9yZXZiKCkKKwkJaWYgKHZkZWNfaXNfc3VwcG9ydF80aygpKQorCQkJcF9idWZfaW5mbyA9ICZhbXZoMjY1X3dvcmtidWZmX3NwZWNbNV07CisJCWVsc2UKKwkJCXBfYnVmX2luZm8gPSAmYW12aDI2NV93b3JrYnVmZl9zcGVjWzNdOworCX0KKworCWluaXRfYnVmZl9zcGVjKE5VTEwsIHBfYnVmX2luZm8pOworCXdvcmtfYnVmX3NpemUgPQorCQkocF9idWZfaW5mby0+ZW5kX2FkciAtIHBfYnVmX2luZm8tPnN0YXJ0X2FkcgorCQkgKyAweGZmZmYpICYgKH4weGZmZmYpOworCisJcHJfZGVidWcoImFtdmRlY19oMjY1IG1vZHVsZSBpbml0XG4iKTsKKwllcnJvcl9oYW5kbGVfcG9saWN5ID0gMDsKKworI2lmZGVmIEVSUk9SX0hBTkRMRV9ERUJVRworCWRiZ19uYWxfc2tpcF9mbGFnID0gMDsKKwlkYmdfbmFsX3NraXBfY291bnQgPSAwOworI2VuZGlmCisJdWRlYnVnX2ZsYWcgPSAwOworCWRlY29kZV9waWNfYmVnaW4gPSAwOworCXNsaWNlX3BhcnNlX2JlZ2luID0gMDsKKwlzdGVwID0gMDsKKwlidWZfYWxsb2Nfc2l6ZSA9IDA7CisKKwlpZiAocGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhbW12ZGVjX2gyNjVfZHJpdmVyKSkgeworCQlwcl9lcnIoImZhaWxlZCB0byByZWdpc3RlciBhbW12ZGVjX2gyNjUgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisjaWYgMS8qTUVTT05fQ1BVX1RZUEUgPj0gTUVTT05fQ1BVX1RZUEVfTUVTT044Ki8KKwlpZiAoIWhhc19oZXZjX3ZkZWMoKSkgeworCQkvKiBub3Qgc3VwcG9ydCBoZXZjICovCisJCWFtdmRlY19oMjY1X3Byb2ZpbGUubmFtZSA9ICJoZXZjX3Vuc3VwcG9ydCI7CisJfQorCWlmICgodmRlY19pc19zdXBwb3J0XzRrKCkpKSB7CisJCWlmIChpc19tZXNvbl9tOG0yX2NwdSgpKSB7CisJCQkvKiBtOG0yIHN1cHBvcnQgNGsgKi8KKwkJCWFtdmRlY19oMjY1X3Byb2ZpbGUucHJvZmlsZSA9ICI0ayI7CisJCX0gZWxzZSBpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpIHsKKwkJCWFtdmRlY19oMjY1X3Byb2ZpbGUucHJvZmlsZSA9CisJCQkJIjhrLCA4Yml0LCAxMGJpdCwgZHdyaXRlLCBjb21wcmVzc2VkLCBmcmFtZV9kdiwgZmVuY2UsIHV2bSI7CisJCX1lbHNlIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYQkIpIHsKKwkJCWFtdmRlY19oMjY1X3Byb2ZpbGUucHJvZmlsZSA9CisJCQkJIjRrLCA4Yml0LCAxMGJpdCwgZHdyaXRlLCBjb21wcmVzc2VkLCBmcmFtZV9kdiwgZmVuY2UsIHV2bSI7CisJCX0gZWxzZSBpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9NRzlUVikKKwkJCWFtdmRlY19oMjY1X3Byb2ZpbGUucHJvZmlsZSA9ICI0ayI7CisJfSBlbHNlIHsKKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDVEIHx8IGlzX2NwdV9zNF9zODA1eDIoKSkgeworCQkJYW12ZGVjX2gyNjVfcHJvZmlsZS5wcm9maWxlID0KKwkJCQkiOGJpdCwgMTBiaXQsIGR3cml0ZSwgY29tcHJlc3NlZCwgZnJhbWVfZHYsIHV2bSwgdjRsIjsKKwkJfSBlbHNlIHsKKwkJCWFtdmRlY19oMjY1X3Byb2ZpbGUucHJvZmlsZSA9CisJCQkJIjhiaXQsIDEwYml0LCBkd3JpdGUsIGNvbXByZXNzZWQsIHY0bCI7CisJCX0KKwl9CisjZW5kaWYKKwlpZiAoY29kZWNfbW1fZ2V0X3RvdGFsX3NpemUoKSA8IDgwICogU1pfMU0pIHsKKwkJcHJfaW5mbygiYW12ZGVjX2gyNjUgZGVmYXVsdCBtbXUgZW5hYmxlZC5cbiIpOworCQltbXVfZW5hYmxlID0gMTsKKwl9CisKKwl2Y29kZWNfcHJvZmlsZV9yZWdpc3RlcigmYW12ZGVjX2gyNjVfcHJvZmlsZSk7CisJSU5JVF9SRUdfTk9ERV9DT05GSUdTKCJtZWRpYS5kZWNvZGVyIiwgJmRlY29kZXJfMjY1X25vZGUsCisJCSJoMjY1LXY0bCIsIGgyNjVfY29uZmlncywgQ09ORklHX0ZPUl9SVyk7CisJdmNvZGVjX2ZlYXR1cmVfcmVnaXN0ZXIoVkZPUk1BVF9IRVZDLCAxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFtdmRlY19oMjY1X2RyaXZlcl9yZW1vdmVfbW9kdWxlKHZvaWQpCit7CisJcHJfZGVidWcoImFtdmRlY19oMjY1IG1vZHVsZSByZW1vdmUuXG4iKTsKKworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhbW12ZGVjX2gyNjVfZHJpdmVyKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKm1vZHVsZV9wYXJhbShzdGF0LCB1aW50LCAwNjY0KTsKKyAqTU9EVUxFX1BBUk1fREVTQyhzdGF0LCAiXG4gYW12ZGVjX2gyNjUgc3RhdFxuIik7CisgKi8KK21vZHVsZV9wYXJhbSh1c2VfY21hLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModXNlX2NtYSwgIlxuIGFtdmRlY19oMjY1IHVzZV9jbWFcbiIpOworCittb2R1bGVfcGFyYW0oYml0X2RlcHRoX2x1bWEsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhiaXRfZGVwdGhfbHVtYSwgIlxuIGFtdmRlY19oMjY1IGJpdF9kZXB0aF9sdW1hXG4iKTsKKworbW9kdWxlX3BhcmFtKGJpdF9kZXB0aF9jaHJvbWEsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhiaXRfZGVwdGhfY2hyb21hLCAiXG4gYW12ZGVjX2gyNjUgYml0X2RlcHRoX2Nocm9tYVxuIik7CisKK21vZHVsZV9wYXJhbSh2aWRlb19zaWduYWxfdHlwZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHZpZGVvX3NpZ25hbF90eXBlLCAiXG4gYW12ZGVjX2gyNjUgdmlkZW9fc2lnbmFsX3R5cGVcbiIpOworCisjaWZkZWYgRVJST1JfSEFORExFX0RFQlVHCittb2R1bGVfcGFyYW0oZGJnX25hbF9za2lwX2ZsYWcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkYmdfbmFsX3NraXBfZmxhZywgIlxuIGFtdmRlY19oMjY1IGRiZ19uYWxfc2tpcF9mbGFnXG4iKTsKKworbW9kdWxlX3BhcmFtKGRiZ19uYWxfc2tpcF9jb3VudCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRiZ19uYWxfc2tpcF9jb3VudCwgIlxuIGFtdmRlY19oMjY1IGRiZ19uYWxfc2tpcF9jb3VudFxuIik7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKHJhZHIsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhyYWRyLCAiXG4gcmFkclxuIik7CisKK21vZHVsZV9wYXJhbShydmFsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocnZhbCwgIlxuIHJ2YWxcbiIpOworCittb2R1bGVfcGFyYW0oZGJnX2NtZCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRiZ19jbWQsICJcbiBkYmdfY21kXG4iKTsKKworbW9kdWxlX3BhcmFtKGR1bXBfbmFsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZHVtcF9uYWwsICJcbiBkdW1wX25hbFxuIik7CisKK21vZHVsZV9wYXJhbShkYmdfc2tpcF9kZWNvZGVfaW5kZXgsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkYmdfc2tpcF9kZWNvZGVfaW5kZXgsICJcbiBkYmdfc2tpcF9kZWNvZGVfaW5kZXhcbiIpOworCittb2R1bGVfcGFyYW0oZW5kaWFuLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5kaWFuLCAiXG4gcnZhbFxuIik7CisKK21vZHVsZV9wYXJhbShzdGVwLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3RlcCwgIlxuIGFtdmRlY19oMjY1IHN0ZXBcbiIpOworCittb2R1bGVfcGFyYW0oZGVjb2RlX3BpY19iZWdpbiwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlY29kZV9waWNfYmVnaW4sICJcbiBhbXZkZWNfaDI2NSBkZWNvZGVfcGljX2JlZ2luXG4iKTsKKworbW9kdWxlX3BhcmFtKHNsaWNlX3BhcnNlX2JlZ2luLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Moc2xpY2VfcGFyc2VfYmVnaW4sICJcbiBhbXZkZWNfaDI2NSBzbGljZV9wYXJzZV9iZWdpblxuIik7CisKK21vZHVsZV9wYXJhbShuYWxfc2tpcF9wb2xpY3ksIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhuYWxfc2tpcF9wb2xpY3ksICJcbiBhbXZkZWNfaDI2NSBuYWxfc2tpcF9wb2xpY3lcbiIpOworCittb2R1bGVfcGFyYW0oaV9vbmx5X2ZsYWcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhpX29ubHlfZmxhZywgIlxuIGFtdmRlY19oMjY1IGlfb25seV9mbGFnXG4iKTsKKworbW9kdWxlX3BhcmFtKGZhc3Rfb3V0cHV0X2VuYWJsZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZhc3Rfb3V0cHV0X2VuYWJsZSwgIlxuIGFtdmRlY19oMjY1IGZhc3Rfb3V0cHV0X2VuYWJsZVxuIik7CisKK21vZHVsZV9wYXJhbShlcnJvcl9oYW5kbGVfcG9saWN5LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZXJyb3JfaGFuZGxlX3BvbGljeSwgIlxuIGFtdmRlY19oMjY1IGVycm9yX2hhbmRsZV9wb2xpY3lcbiIpOworCittb2R1bGVfcGFyYW0oZXJyb3JfaGFuZGxlX3RocmVzaG9sZCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVycm9yX2hhbmRsZV90aHJlc2hvbGQsCisJCSJcbiBhbXZkZWNfaDI2NSBlcnJvcl9oYW5kbGVfdGhyZXNob2xkXG4iKTsKKworbW9kdWxlX3BhcmFtKGVycm9yX2hhbmRsZV9uYWxfc2tpcF90aHJlc2hvbGQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhlcnJvcl9oYW5kbGVfbmFsX3NraXBfdGhyZXNob2xkLAorCQkiXG4gYW12ZGVjX2gyNjUgZXJyb3JfaGFuZGxlX25hbF9za2lwX3RocmVzaG9sZFxuIik7CisKK21vZHVsZV9wYXJhbShlcnJvcl9oYW5kbGVfc3lzdGVtX3RocmVzaG9sZCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVycm9yX2hhbmRsZV9zeXN0ZW1fdGhyZXNob2xkLAorCQkiXG4gYW12ZGVjX2gyNjUgZXJyb3JfaGFuZGxlX3N5c3RlbV90aHJlc2hvbGRcbiIpOworCittb2R1bGVfcGFyYW0oZXJyb3Jfc2tpcF9uYWxfY291bnQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhlcnJvcl9za2lwX25hbF9jb3VudCwKKwkJCQkgIlxuIGFtdmRlY19oMjY1IGVycm9yX3NraXBfbmFsX2NvdW50XG4iKTsKKworbW9kdWxlX3BhcmFtKHNraXBfbmFsX2NvdW50LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Moc2tpcF9uYWxfY291bnQsICJcbiBza2lwX25hbF9jb3VudFxuIik7CisKK21vZHVsZV9wYXJhbShkZWJ1ZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiXG4gYW12ZGVjX2gyNjUgZGVidWdcbiIpOworCittb2R1bGVfcGFyYW0oZGVidWdfbWFzaywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnX21hc2ssICJcbiBhbXZkZWNfaDI2NSBkZWJ1ZyBtYXNrXG4iKTsKKworbW9kdWxlX3BhcmFtKGxvZ19tYXNrLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobG9nX21hc2ssICJcbiBhbXZkZWNfaDI2NSBsb2dfbWFza1xuIik7CisKK21vZHVsZV9wYXJhbShidWZmZXJfbW9kZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGJ1ZmZlcl9tb2RlLCAiXG4gYnVmZmVyX21vZGVcbiIpOworCittb2R1bGVfcGFyYW0oZG91YmxlX3dyaXRlX21vZGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkb3VibGVfd3JpdGVfbW9kZSwgIlxuIGRvdWJsZV93cml0ZV9tb2RlXG4iKTsKKworbW9kdWxlX3BhcmFtKGJ1Zl9hbGxvY193aWR0aCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGJ1Zl9hbGxvY193aWR0aCwgIlxuIGJ1Zl9hbGxvY193aWR0aFxuIik7CisKK21vZHVsZV9wYXJhbShidWZfYWxsb2NfaGVpZ2h0LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoYnVmX2FsbG9jX2hlaWdodCwgIlxuIGJ1Zl9hbGxvY19oZWlnaHRcbiIpOworCittb2R1bGVfcGFyYW0oZHluYW1pY19idWZfbnVtX21hcmdpbiwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGR5bmFtaWNfYnVmX251bV9tYXJnaW4sICJcbiBkeW5hbWljX2J1Zl9udW1fbWFyZ2luXG4iKTsKKworbW9kdWxlX3BhcmFtKG1heF9idWZfbnVtLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2J1Zl9udW0sICJcbiBtYXhfYnVmX251bVxuIik7CisKK21vZHVsZV9wYXJhbShidWZfYWxsb2Nfc2l6ZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGJ1Zl9hbGxvY19zaXplLCAiXG4gYnVmX2FsbG9jX3NpemVcbiIpOworCisjaWZkZWYgQ09OU1RSQUlOX01BWF9CVUZfTlVNCittb2R1bGVfcGFyYW0ocnVuX3JlYWR5X21heF92Zl9vbmx5X251bSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJ1bl9yZWFkeV9tYXhfdmZfb25seV9udW0sICJcbiBydW5fcmVhZHlfbWF4X3ZmX29ubHlfbnVtXG4iKTsKKworbW9kdWxlX3BhcmFtKHJ1bl9yZWFkeV9kaXNwbGF5X3FfbnVtLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocnVuX3JlYWR5X2Rpc3BsYXlfcV9udW0sICJcbiBydW5fcmVhZHlfZGlzcGxheV9xX251bVxuIik7CisKK21vZHVsZV9wYXJhbShydW5fcmVhZHlfbWF4X2J1Zl9udW0sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhydW5fcmVhZHlfbWF4X2J1Zl9udW0sICJcbiBydW5fcmVhZHlfbWF4X2J1Zl9udW1cbiIpOworCittb2R1bGVfcGFyYW0ocnVuX3JlYWR5X21pbl9idWZfbnVtLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocnVuX3JlYWR5X21pbl9idWZfbnVtLCAiXG4gcnVuX3JlYWR5X21pbl9idWZfbnVtXG4iKTsKKyNlbmRpZgorCisjaWYgMAorbW9kdWxlX3BhcmFtKHJlX2NvbmZpZ19waWNfZmxhZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJlX2NvbmZpZ19waWNfZmxhZywgIlxuIHJlX2NvbmZpZ19waWNfZmxhZ1xuIik7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKGJ1ZmZlcl9tb2RlX2RiZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGJ1ZmZlcl9tb2RlX2RiZywgIlxuIGJ1ZmZlcl9tb2RlX2RiZ1xuIik7CisKK21vZHVsZV9wYXJhbShtZW1fbWFwX21vZGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhtZW1fbWFwX21vZGUsICJcbiBtZW1fbWFwX21vZGVcbiIpOworCittb2R1bGVfcGFyYW0oZW5hYmxlX21lbV9zYXZpbmcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhlbmFibGVfbWVtX3NhdmluZywgIlxuIGVuYWJsZV9tZW1fc2F2aW5nXG4iKTsKKworbW9kdWxlX3BhcmFtKGZvcmNlX3dfaCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX3dfaCwgIlxuIGZvcmNlX3dfaFxuIik7CisKK21vZHVsZV9wYXJhbShmb3JjZV9mcHMsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9mcHMsICJcbiBmb3JjZV9mcHNcbiIpOworCittb2R1bGVfcGFyYW0obWF4X2RlY29kaW5nX3RpbWUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfZGVjb2RpbmdfdGltZSwgIlxuIG1heF9kZWNvZGluZ190aW1lXG4iKTsKKworbW9kdWxlX3BhcmFtKHByZWZpeF9hdXhfYnVmX3NpemUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhwcmVmaXhfYXV4X2J1Zl9zaXplLCAiXG4gcHJlZml4X2F1eF9idWZfc2l6ZVxuIik7CisKK21vZHVsZV9wYXJhbShzdWZmaXhfYXV4X2J1Zl9zaXplLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3VmZml4X2F1eF9idWZfc2l6ZSwgIlxuIHN1ZmZpeF9hdXhfYnVmX3NpemVcbiIpOworCittb2R1bGVfcGFyYW0oaW50ZXJsYWNlX2VuYWJsZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGludGVybGFjZV9lbmFibGUsICJcbiBpbnRlcmxhY2VfZW5hYmxlXG4iKTsKK21vZHVsZV9wYXJhbShwdHNfdW5zdGFibGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhwdHNfdW5zdGFibGUsICJcbiBhbXZkZWNfaDI2NSBwdHNfdW5zdGFibGVcbiIpOworbW9kdWxlX3BhcmFtKHBhcnNlcl9zZWlfZW5hYmxlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocGFyc2VyX3NlaV9lbmFibGUsICJcbiBwYXJzZXJfc2VpX2VuYWJsZVxuIik7CisKK21vZHVsZV9wYXJhbShwYXJzZXJfZG9sYnlfdmlzaW9uX2VuYWJsZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBhcnNlcl9kb2xieV92aXNpb25fZW5hYmxlLAorCSJcbiBwYXJzZXJfZG9sYnlfdmlzaW9uX2VuYWJsZVxuIik7CisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorbW9kdWxlX3BhcmFtKGRvbGJ5X21ldGFfd2l0aF9lbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRvbGJ5X21ldGFfd2l0aF9lbCwKKwkiXG4gZG9sYnlfbWV0YV93aXRoX2VsXG4iKTsKKworbW9kdWxlX3BhcmFtKGRvbGJ5X2VsX2ZsdXNoX3RoLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZG9sYnlfZWxfZmx1c2hfdGgsCisJIlxuIGRvbGJ5X2VsX2ZsdXNoX3RoXG4iKTsKKyNlbmRpZgorbW9kdWxlX3BhcmFtKG1tdV9lbmFibGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhtbXVfZW5hYmxlLCAiXG4gbW11X2VuYWJsZVxuIik7CisKK21vZHVsZV9wYXJhbShtbXVfZW5hYmxlX2ZvcmNlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobW11X2VuYWJsZV9mb3JjZSwgIlxuIG1tdV9lbmFibGVfZm9yY2VcbiIpOworCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorbW9kdWxlX3BhcmFtKHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwsCisJCSJcbiBoMjY1IHN0YXJ0X2RlY29kZV9idWZfbGV2ZWxcbiIpOworCittb2R1bGVfcGFyYW0oZGVjb2RlX3RpbWVvdXRfdmFsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVjb2RlX3RpbWVvdXRfdmFsLAorCSJcbiBoMjY1IGRlY29kZV90aW1lb3V0X3ZhbFxuIik7CisKK21vZHVsZV9wYXJhbShwcmludF9sY3VfZXJyb3IsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhwcmludF9sY3VfZXJyb3IsCisJIlxuIGgyNjUgcHJpbnRfbGN1X2Vycm9yXG4iKTsKKworbW9kdWxlX3BhcmFtKGRhdGFfcmVzZW5kX3BvbGljeSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRhdGFfcmVzZW5kX3BvbGljeSwKKwkiXG4gaDI2NSBkYXRhX3Jlc2VuZF9wb2xpY3lcbiIpOworCittb2R1bGVfcGFyYW0ocG9jX251bV9tYXJnaW4sIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBvY19udW1fbWFyZ2luLAorCSJcbiBoMjY1IHBvY19udW1fbWFyZ2luXG4iKTsKKworbW9kdWxlX3BhcmFtKHBvY19lcnJvcl9saW1pdCwgaW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocG9jX2Vycm9yX2xpbWl0LAorCSJcbiBoMjY1IHBvY19lcnJvcl9saW1pdFxuIik7CisKK21vZHVsZV9wYXJhbV9hcnJheShkZWNvZGVfZnJhbWVfY291bnQsIHVpbnQsCisJJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGRpc3BsYXlfZnJhbWVfY291bnQsIHVpbnQsCisJJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtX2FycmF5KG1heF9wcm9jZXNzX3RpbWUsIHVpbnQsCisJJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtX2FycmF5KG1heF9nZXRfZnJhbWVfaW50ZXJ2YWwsCisJdWludCwgJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtX2FycmF5KHJ1bl9jb3VudCwgdWludCwKKwkmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCittb2R1bGVfcGFyYW1fYXJyYXkoaW5wdXRfZW1wdHksIHVpbnQsCisJJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtX2FycmF5KG5vdF9ydW5fcmVhZHksIHVpbnQsCisJJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtX2FycmF5KHJlZl9mcmFtZV9tYXJrX2ZsYWcsIHVpbnQsCisJJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworI2VuZGlmCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KK21vZHVsZV9wYXJhbShkdl90b2dnbGVfcHJvdl9uYW1lLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZHZfdG9nZ2xlX3Byb3ZfbmFtZSwgIlxuIGR2X3RvZ2dsZV9wcm92X25hbWVcbiIpOworCittb2R1bGVfcGFyYW0oZHZfZGVidWcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkdl9kZWJ1ZywgIlxuIGR2X2RlYnVnXG4iKTsKKworbW9kdWxlX3BhcmFtKGZvcmNlX2J5cGFzc19kdmVubCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2J5cGFzc19kdmVubCwgIlxuIGZvcmNlX2J5cGFzc19kdmVubFxuIik7CisjZW5kaWYKKworI2lmZGVmIEFHQUlOX0hBU19USFJFU0hPTEQKK21vZHVsZV9wYXJhbShhZ2Fpbl90aHJlc2hvbGQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhhZ2Fpbl90aHJlc2hvbGQsICJcbiBhZ2Fpbl90aHJlc2hvbGRcbiIpOworI2VuZGlmCisKK21vZHVsZV9wYXJhbShmb3JjZV9kaXNwX3BpY19pbmRleCwgaW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2VfZGlzcF9waWNfaW5kZXgsCisJIlxuIGFtdmRlY19oMjY1IGZvcmNlX2Rpc3BfcGljX2luZGV4XG4iKTsKKworbW9kdWxlX3BhcmFtKGZybWJhc2VfY29udF9iaXRsZXZlbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZybWJhc2VfY29udF9iaXRsZXZlbCwJIlxuIGZybWJhc2VfY29udF9iaXRsZXZlbFxuIik7CisKK21vZHVsZV9wYXJhbShmb3JjZV9idWZzcGVjLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2VfYnVmc3BlYywgIlxuIGFtdmRlY19oMjY1IGZvcmNlX2J1ZnNwZWNcbiIpOworCittb2R1bGVfcGFyYW0odWRlYnVnX2ZsYWcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh1ZGVidWdfZmxhZywgIlxuIGFtdmRlY19oMjY1IHVkZWJ1Z19mbGFnXG4iKTsKKworbW9kdWxlX3BhcmFtKHVkZWJ1Z19wYXVzZV9wb3MsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh1ZGVidWdfcGF1c2VfcG9zLCAiXG4gdWRlYnVnX3BhdXNlX3Bvc1xuIik7CisKK21vZHVsZV9wYXJhbSh1ZGVidWdfcGF1c2VfdmFsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModWRlYnVnX3BhdXNlX3ZhbCwgIlxuIHVkZWJ1Z19wYXVzZV92YWxcbiIpOworCittb2R1bGVfcGFyYW0ocHJlX2RlY29kZV9idWZfbGV2ZWwsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHByZV9kZWNvZGVfYnVmX2xldmVsLCAiXG4gYW1tdmRlY19oMjY0IHByZV9kZWNvZGVfYnVmX2xldmVsXG4iKTsKKworbW9kdWxlX3BhcmFtKHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModWRlYnVnX3BhdXNlX2RlY29kZV9pZHgsICJcbiB1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeFxuIik7CisKK21vZHVsZV9wYXJhbShkaXNwX3ZmcmFtZV92YWx2ZV9sZXZlbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRpc3BfdmZyYW1lX3ZhbHZlX2xldmVsLCAiXG4gZGlzcF92ZnJhbWVfdmFsdmVfbGV2ZWxcbiIpOworCittb2R1bGVfcGFyYW0ocGljX2xpc3RfZGVidWcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhwaWNfbGlzdF9kZWJ1ZywgIlxuIHBpY19saXN0X2RlYnVnXG4iKTsKKworbW9kdWxlX3BhcmFtKHdpdGhvdXRfZGlzcGxheV9tb2RlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Mod2l0aG91dF9kaXNwbGF5X21vZGUsICJcbiBhbXZkZWNfaDI2NSB3aXRob3V0X2Rpc3BsYXlfbW9kZVxuIik7CisKKyNpZmRlZiBIRVZDXzhLX0xGVE9GRlNFVF9GSVgKK21vZHVsZV9wYXJhbShwZXJmb3JtYW5jZV9wcm9maWxlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocGVyZm9ybWFuY2VfcHJvZmlsZSwgIlxuIGFtdmRlY19oMjY1IHBlcmZvcm1hbmNlX3Byb2ZpbGVcbiIpOworI2VuZGlmCittb2R1bGVfcGFyYW0oZGlzYWJsZV9pcF9tb2RlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGlzYWJsZV9pcF9tb2RlLCAiXG4gYW12ZGVjX2gyNjUgZGlzYWJsZSBpcF9tb2RlXG4iKTsKKworbW9kdWxlX3BhcmFtKGRpcnR5X3RpbWVfdGhyZXNob2xkLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGlydHlfdGltZV90aHJlc2hvbGQsICJcbiBkaXJ0eV90aW1lX3RocmVzaG9sZFxuIik7CisKK21vZHVsZV9wYXJhbShkaXJ0eV9jb3VudF90aHJlc2hvbGQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkaXJ0eV9jb3VudF90aHJlc2hvbGQsICJcbiBkaXJ0eV9jb3VudF90aHJlc2hvbGRcbiIpOworCittb2R1bGVfcGFyYW0oZGlydHlfYnVmZmVyc2l6ZV90aHJlc2hvbGQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkaXJ0eV9idWZmZXJzaXplX3RocmVzaG9sZCwgIlxuIGRpcnR5X2J1ZmZlcnNpemVfdGhyZXNob2xkXG4iKTsKKworbW9kdWxlX3BhcmFtKGZvcmNlX2NvbmZpZ19mZW5jZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2NvbmZpZ19mZW5jZSwgIlxuIGZvcmNlIGVuYWJsZSBmZW5jZVxuIik7CisKK21vZHVsZV9wYXJhbShtdl9idWZfZHluYW1pY19hbGxvYywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG12X2J1Zl9keW5hbWljX2FsbG9jLCAiXG4gbXZfYnVmX2R5bmFtaWNfYWxsb2NcbiIpOworCittb2R1bGVfcGFyYW0oZGV0ZWN0X3N0dWNrX2J1ZmZlcl9tYXJnaW4sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkZXRlY3Rfc3R1Y2tfYnVmZmVyX21hcmdpbiwgIlxuIGRldGVjdF9zdHVja19idWZmZXJfbWFyZ2luXG4iKTsKKworbW9kdWxlX2luaXQoYW12ZGVjX2gyNjVfZHJpdmVyX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGFtdmRlY19oMjY1X2RyaXZlcl9yZW1vdmVfbW9kdWxlKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTUxPR0lDIGgyNjUgVmlkZW8gRGVjb2RlciBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlRpbSBZYW8gPHRpbS55YW9AYW1sb2dpYy5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL2gyNjUvdmgyNjUuaCBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlcl92NGwvaDI2NS92aDI2NS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZGUxMWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL2gyNjUvdmgyNjUuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL2FtcG9ydHMvdmgyNjUuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIFZIMjY1X0gKKyNkZWZpbmUgVkgyNjVfSAorCitleHRlcm4gdTMyIGdldF9ibGFja291dF9wb2xpY3kodm9pZCk7CisKK2V4dGVybiBzMzIgdmgyNjVfaW5pdCh2b2lkKTsKKworZXh0ZXJuIHMzMiB2aDI2NV9yZWxlYXNlKHZvaWQpOworCisjZW5kaWYgLyogVk1QRUc0X0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlcl92NGwvbWpwZWcvTWFrZWZpbGUgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL21qcGVnL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzODE5YzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL21qcGVnL01ha2VmaWxlCkBAIC0wLDAgKzEsMiBAQAorb2JqLSQoQ09ORklHX0FNTE9HSUNfTUVESUFfVkRFQ19NSlBFR19NVUxUSSkgKz0gYW12ZGVjX21tanBlZ192NGwubworYW12ZGVjX21tanBlZ192NGwtb2JqcyArPSB2bWpwZWdfbXVsdGkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC9tanBlZy92bWpwZWdfbXVsdGkuYyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlcl92NGwvbWpwZWcvdm1qcGVnX211bHRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYwYmI5NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlcl92NGwvbWpwZWcvdm1qcGVnX211bHRpLmMKQEAgLTAsMCArMSwxODc3IEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL2FtcG9ydHMvdm1qcGVnLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2ZyYW1lX3N5bmMvcHRzc2Vydi5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvYW1zdHJlYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NhbnZhcy9jYW52YXMuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWVfcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWVfcmVjZWl2ZXIuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvdGVlLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC90ZWUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmRlY19yZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3JlZ2lzdGVycy9yZWdpc3Rlci5oPgorI2luY2x1ZGUgIi4uLy4uLy4uL3N0cmVhbV9pbnB1dC9hbXBvcnRzL2FtcG9ydHNfcHJpdi5oIgorI2luY2x1ZGUgIi4uLy4uLy4uL2NvbW1vbi9jaGlwcy9kZWNvZGVyX2NwdV92ZXJfaW5mby5oIgorCisjaW5jbHVkZSAiLi4vLi4vZGVjb2Rlci91dGlscy92ZGVjX2lucHV0LmgiCisjaW5jbHVkZSAiLi4vLi4vZGVjb2Rlci91dGlscy92ZGVjLmgiCisjaW5jbHVkZSAiLi4vLi4vZGVjb2Rlci91dGlscy9hbXZkZWMuaCIKKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL2RlY29kZXJfbW11X2JveC5oIgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvZGVjb2Rlcl9ibW11X2JveC5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29kZWNfbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvbmZpZ3MuaD4KKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL2Zpcm13YXJlLmgiCisjaW5jbHVkZSAiLi4vLi4vZGVjb2Rlci91dGlscy92ZGVjX3Y0bDJfYnVmZmVyX29wcy5oIgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvY29uZmlnX3BhcnNlci5oIgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItbWVtMm1lbS5oPgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvdmRlY19mZWF0dXJlLmgiCisKKyNkZWZpbmUgTUVNX05BTUUgImNvZGVjX21tanBlZyIKKworI2RlZmluZSBEUklWRVJfTkFNRSAiYW1tdmRlY19tanBlZ192NGwiCisjZGVmaW5lIENIRUNLX0lOVEVSVkFMICAgICAgICAoSFovMTAwKQorCisvKiBwcm90b2NvbCByZWdpc3RlciB1c2FnZQorICogICAgQVZfU0NSQVRDSF80IDogZGVjb2RlIGJ1ZmZlciBzcGVjCisgKiAgICBBVl9TQ1JBVENIXzUgOiBkZWNvZGUgYnVmZmVyIGluZGV4CisgKi8KKworI2RlZmluZSBNUkVHX0RFQ09ERV9QQVJBTSAgIEFWX1NDUkFUQ0hfMgkvKiBiaXQgMC0zOiBwaWNvX2FkZHJfbW9kZSAqLworLyogYml0IDE1LTQ6IHJlZmVyZW5jZSBoZWlnaHQgKi8KKyNkZWZpbmUgTVJFR19UT19BTVJJU0MgICAgICBBVl9TQ1JBVENIXzgKKyNkZWZpbmUgTVJFR19GUk9NX0FNUklTQyAgICBBVl9TQ1JBVENIXzkKKyNkZWZpbmUgTVJFR19GUkFNRV9PRkZTRVQgICBBVl9TQ1JBVENIX0EKKyNkZWZpbmUgREVDX1NUQVRVU19SRUcgICAgICBBVl9TQ1JBVENIX0YKKyNkZWZpbmUgTVJFR19QSUNfV0lEVEggICAgICBBVl9TQ1JBVENIX0IKKyNkZWZpbmUgTVJFR19QSUNfSEVJR0hUICAgICBBVl9TQ1JBVENIX0MKKyNkZWZpbmUgREVDT0RFX1NUT1BfUE9TICAgICBBVl9TQ1JBVENIX0sKKworI2RlZmluZSBQSUNJTkZPX0JVRl9JRFhfTUFTSyAgICAgICAgMHgwMDA3CisjZGVmaW5lIFBJQ0lORk9fQVZJMSAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgUElDSU5GT19JTlRFUkxBQ0UgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBQSUNJTkZPX0lOVEVSTEFDRV9BVkkxX0JPVCAgMHgwMDEwCisjZGVmaW5lIFBJQ0lORk9fSU5URVJMQUNFX0ZJUlNUICAgICAweDAwMTAKKworI2RlZmluZSBWRl9QT09MX1NJWkUgICAgICAgICAgNjQKKyNkZWZpbmUgREVDT0RFX0JVRkZFUl9OVU1fTUFYCQkxNgorI2RlZmluZSBERUNPREVfQlVGRkVSX05VTV9ERUYJCTQKKyNkZWZpbmUgTUFYX0JNTVVfQlVGRkVSX05VTQkJREVDT0RFX0JVRkZFUl9OVU1fTUFYCisKKyNkZWZpbmUgREVGQVVMVF9NRU1fU0laRQkoMzIqU1pfMU0pCisKKyNkZWZpbmUgSU5WQUxJRF9JRFggCQkoLTEpICAvKiBJbnZhbGlkIGJ1ZmZlciBpbmRleC4qLworCitzdGF0aWMgaW50IGRlYnVnX2VuYWJsZTsKK3N0YXRpYyB1MzIgdWRlYnVnX2ZsYWc7CisjZGVmaW5lIERFQ09ERV9JRChodykgKGh3X3RvX3ZkZWMoaHcpLT5pZCkKKworc3RhdGljIHVuc2lnbmVkIGludCByYWRyOworc3RhdGljIHVuc2lnbmVkIGludCBydmFsOworI2RlZmluZSBWTUpQRUdfREVWX05VTSAgICAgICAgOQorc3RhdGljIHVuc2lnbmVkIGludCBtYXhfZGVjb2RlX2luc3RhbmNlX251bSA9IFZNSlBFR19ERVZfTlVNOworc3RhdGljIHVuc2lnbmVkIGludCBtYXhfcHJvY2Vzc190aW1lW1ZNSlBFR19ERVZfTlVNXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVjb2RlX3RpbWVvdXRfdmFsID0gMjAwOworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyAqdm1qcGVnX3ZmX3BlZWsodm9pZCAqKTsKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZtanBlZ192Zl9nZXQodm9pZCAqKTsKK3N0YXRpYyB2b2lkIHZtanBlZ192Zl9wdXQoc3RydWN0IHZmcmFtZV9zICosIHZvaWQgKik7CitzdGF0aWMgaW50IHZtanBlZ192Zl9zdGF0ZXMoc3RydWN0IHZmcmFtZV9zdGF0ZXMgKnN0YXRlcywgdm9pZCAqKTsKK3N0YXRpYyBpbnQgdm1qcGVnX2V2ZW50X2NiKGludCB0eXBlLCB2b2lkICpkYXRhLCB2b2lkICpwcml2YXRlX2RhdGEpOworc3RhdGljIHZvaWQgdm1qcGVnX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3N0YXRpYyBpbnQgbm90aWZ5X3Y0bF9lb3Moc3RydWN0IHZkZWNfcyAqdmRlYyk7CitzdGF0aWMgaW50IHByZV9kZWNvZGVfYnVmX2xldmVsID0gMHg4MDA7CitzdGF0aWMgaW50IHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwgPSAweDIwMDA7CitzdGF0aWMgdTMyIHdpdGhvdXRfZGlzcGxheV9tb2RlOworc3RhdGljIHUzMiBkeW5hbWljX2J1Zl9udW1fbWFyZ2luOworc3RhdGljIHUzMiBydW5fcmVhZHlfbWluX2J1Zl9udW0gPSAyOworI3VuZGVmIHByX2luZm8KKyNkZWZpbmUgcHJfaW5mbyBwcmludGsKK3Vuc2lnbmVkIGludCBtbWpwZWdfZGVidWdfbWFzayA9IDB4ZmY7CisjZGVmaW5lIFBSSU5UX0ZMQUdfRVJST1IgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBQUklOVF9GTEFHX1JVTl9GTE9XICAgICAgICAgICAwWDAwMDEKKyNkZWZpbmUgUFJJTlRfRkxBR19USU1FSU5GTyAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFBSSU5UX0ZMQUdfVUNPREVfREVUQUlMCQkgIDB4MDAwNAorI2RlZmluZSBQUklOVF9GTEFHX1ZMRF9ERVRBSUwgICAgICAgICAweDAwMDgKKyNkZWZpbmUgUFJJTlRfRkxBR19ERUNfREVUQUlMICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFBSSU5UX0ZMQUdfQlVGRkVSX0RFVEFJTCAgICAgIDB4MDAyMAorI2RlZmluZSBQUklOVF9GTEFHX1JFU1RPUkUgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgUFJJTlRfRlJBTUVfTlVNICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFBSSU5UX0ZMQUdfRk9SQ0VfRE9ORSAgICAgICAgIDB4MDEwMAorI2RlZmluZSBQUklOVF9GUkFNRUJBU0VfREFUQSAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgUFJJTlRfRkxBR19USU1FT1VUX1NUQVRVUyAgICAgMHgxMDAwCisjZGVmaW5lIFBSSU5UX0ZMQUdfVjRMX0RFVEFJTCAgICAgICAgIDB4ODAwMAorI2RlZmluZSBJR05PUkVfUEFSQU1fRlJPTV9DT05GSUcgICAgICAweDgwMDAwMDAKKworaW50IG1tanBlZ19kZWJ1Z19wcmludChpbnQgaW5kZXgsIGludCBkZWJ1Z19mbGFnLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwlpZiAoKChkZWJ1Z19lbmFibGUgJiBkZWJ1Z19mbGFnKSAmJgorCQkoKDEgPDwgaW5kZXgpICYgbW1qcGVnX2RlYnVnX21hc2spKQorCQl8fCAoZGVidWdfZmxhZyA9PSBQUklOVF9GTEFHX0VSUk9SKSkgeworCQl1bnNpZ25lZCBjaGFyICpidWYgPSBremFsbG9jKDUxMiwgR0ZQX0FUT01JQyk7CisJCWludCBsZW4gPSAwOworCQl2YV9saXN0IGFyZ3M7CisKKwkJaWYgKCFidWYpCisJCQlyZXR1cm4gMDsKKworCQl2YV9zdGFydChhcmdzLCBmbXQpOworCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVkOiAiLCBpbmRleCk7CisJCXZzbnByaW50ZihidWYgKyBsZW4sIDUxMi1sZW4sIGZtdCwgYXJncyk7CisJCXByX2luZm8oIiVzIiwgYnVmKTsKKwkJdmFfZW5kKGFyZ3MpOworCQlrZnJlZShidWYpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgdm1qcGVnX2RlY19pZFtdID0gInZtbWpwZWctZGV2IjsKKworI2RlZmluZSBQUk9WSURFUl9OQU1FICAgInZkZWMubWpwZWciCitzdGF0aWMgY29uc3Qgc3RydWN0IHZmcmFtZV9vcGVyYXRpb25zX3MgdmZfcHJvdmlkZXJfb3BzID0geworCS5wZWVrID0gdm1qcGVnX3ZmX3BlZWssCisJLmdldCA9IHZtanBlZ192Zl9nZXQsCisJLnB1dCA9IHZtanBlZ192Zl9wdXQsCisJLmV2ZW50X2NiID0gdm1qcGVnX2V2ZW50X2NiLAorCS52Zl9zdGF0ZXMgPSB2bWpwZWdfdmZfc3RhdGVzLAorfTsKKworI2RlZmluZSBERUNfUkVTVUxUX05PTkUgICAgICAgICAgICAgMAorI2RlZmluZSBERUNfUkVTVUxUX0RPTkUgICAgICAgICAgICAgMQorI2RlZmluZSBERUNfUkVTVUxUX0FHQUlOICAgICAgICAgICAgMgorI2RlZmluZSBERUNfUkVTVUxUX0VSUk9SICAgICAgICAgICAgMworI2RlZmluZSBERUNfUkVTVUxUX0ZPUkNFX0VYSVQgICAgICAgNAorI2RlZmluZSBERUNfUkVTVUxUX0VPUyAgICAgICAgICAgICAgNQorI2RlZmluZSBERUNfREVDT0RFX1RJTUVPVVQgICAgICAgICAweDIxCisKKworc3RydWN0IGJ1ZmZlcl9zcGVjX3MgeworCXVuc2lnbmVkIGludCB5X2FkZHI7CisJdW5zaWduZWQgaW50IHVfYWRkcjsKKwl1bnNpZ25lZCBpbnQgdl9hZGRyOworCisJaW50IHlfY2FudmFzX2luZGV4OworCWludCB1X2NhbnZhc19pbmRleDsKKwlpbnQgdl9jYW52YXNfaW5kZXg7CisKKwlzdHJ1Y3QgY2FudmFzX2NvbmZpZ19zIGNhbnZhc19jb25maWdbM107CisJdW5zaWduZWQgbG9uZyBjbWFfYWxsb2NfYWRkcjsKKwlpbnQgY21hX2FsbG9jX2NvdW50OworCXVuc2lnbmVkIGludCBidWZfYWRyOworCXVsb25nIHY0bF9yZWZfYnVmX2FkZHI7Cit9OworCisjZGVmaW5lIHNwZWMyY2FudmFzKHgpICBcCisJKCgoeCktPnZfY2FudmFzX2luZGV4IDw8IDE2KSB8IFwKKwkgKCh4KS0+dV9jYW52YXNfaW5kZXggPDwgOCkgIHwgXAorCSAoKHgpLT55X2NhbnZhc19pbmRleCA8PCAwKSkKKworc3RydWN0IHZkZWNfbWpwZWdfaHdfcyB7CisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCBtdXRleCB2bWpwZWdfbXV0ZXg7CisKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXY7CisJREVDTEFSRV9LRklGTyhuZXdmcmFtZV9xLCBzdHJ1Y3QgdmZyYW1lX3MgKiwgVkZfUE9PTF9TSVpFKTsKKwlERUNMQVJFX0tGSUZPKGRpc3BsYXlfcSwgc3RydWN0IHZmcmFtZV9zICosIFZGX1BPT0xfU0laRSk7CisKKwlzdHJ1Y3QgdmZyYW1lX3MgdmZwb29sW1ZGX1BPT0xfU0laRV07CisJc3RydWN0IHZmcmFtZV9zIHZmcmFtZV9kdW1teTsKKworCXN0cnVjdCBidWZmZXJfc3BlY19zIGJ1ZmZlcl9zcGVjW0RFQ09ERV9CVUZGRVJfTlVNX01BWF07CisJczMyIHZmYnVmX3VzZVtERUNPREVfQlVGRkVSX05VTV9NQVhdOworCisJdTMyIGZyYW1lX3dpZHRoOworCXUzMiBmcmFtZV9oZWlnaHQ7CisJdTMyIGZyYW1lX2R1cjsKKwl1MzIgc2F2ZWRfcmVzb2x1dGlvbjsKKwl1OCBpbml0X2ZsYWc7CisJdTMyIHN0YXQ7CisJdTMyIGRlY19yZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBidWZfc3RhcnQ7CisJdTMyIGJ1Zl9zaXplOworCXZvaWQgKm1tX2Jsa19oYW5kbGU7CisJc3RydWN0IGRlY19zeXNpbmZvIHZtanBlZ19hbXN0cmVhbV9kZWNfaW5mbzsKKworCXN0cnVjdCB2ZnJhbWVfY2h1bmtfcyAqY2h1bms7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJdm9pZCAoKnZkZWNfY2IpKHN0cnVjdCB2ZGVjX3MgKiwgdm9pZCAqKTsKKwl2b2lkICp2ZGVjX2NiX2FyZzsKKwlzdHJ1Y3QgZmlybXdhcmVfcyAqZnc7CisJc3RydWN0IHRpbWVyX2xpc3QgY2hlY2tfdGltZXI7CisJdTMyIGRlY29kZV90aW1lb3V0X2NvdW50OworCXUzMiBzdGFydF9wcm9jZXNzX3RpbWU7CisJdTMyIGxhc3RfdmxkX2xldmVsOworCXU4IGVvczsKKwl1MzIgZnJhbWVfbnVtOworCXUzMiBydW5fY291bnQ7CisJdTMyCW5vdF9ydW5fcmVhZHk7CisJdTMyIGJ1ZmZlcl9ub3RfcmVhZHk7CisJdTMyCWlucHV0X2VtcHR5OworCWF0b21pY190IHBlZWtfbnVtOworCWF0b21pY190IGdldF9udW07CisJYXRvbWljX3QgcHV0X251bTsKKwlib29sIGlzX3VzZWRfdjRsOworCXZvaWQgKnY0bDJfY3R4OworCWJvb2wgdjRsX3BhcmFtc19wYXJzZWQ7CisJaW50IGJ1Zl9udW07CisJaW50IGR5bmFtaWNfYnVmX251bV9tYXJnaW47CisJaW50IHNpZGViaW5kX3R5cGU7CisJaW50IHNpZGViaW5kX2NoYW5uZWxfaWQ7CisJdTMyIHJlc19jaF9mbGFnOworCXUzMiBjYW52YXNfbW9kZTsKKwl1MzIgY2FudmFzX2VuZGlhbjsKKwl1bG9uZyBmYl90b2tlbjsKKwljaGFyIHZkZWNfbmFtZVszMl07CisJY2hhciBwdHNfbmFtZVszMl07CisJY2hhciBuZXdfcV9uYW1lWzMyXTsKKwljaGFyIGRpc3BfcV9uYW1lWzMyXTsKK307CisKK3N0YXRpYyB2b2lkIHJlc2V0X3Byb2Nlc3NfdGltZShzdHJ1Y3QgdmRlY19tanBlZ19od19zICpodyk7CisKK3N0YXRpYyB2b2lkIHNldF9mcmFtZV9pbmZvKHN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKmh3LCBzdHJ1Y3QgdmZyYW1lX3MgKnZmKQoreworCXUzMiB0ZW1wOworCXUzMiB0ZW1wX2VuZGlhbjsKKworCXRlbXAgPSBSRUFEX1ZSRUcoTVJFR19QSUNfV0lEVEgpOworCWlmICh0ZW1wID4gMTkyMCkKKwkJdmYtPndpZHRoID0gaHctPmZyYW1lX3dpZHRoID0gMTkyMDsKKwllbHNlIGlmICh0ZW1wID4gMCkKKwkJdmYtPndpZHRoID0gaHctPmZyYW1lX3dpZHRoID0gdGVtcDsKKwl0ZW1wID0gUkVBRF9WUkVHKE1SRUdfUElDX0hFSUdIVCk7CisJaWYgKHRlbXAgPiAxMDg4KQorCQl2Zi0+aGVpZ2h0ID0gaHctPmZyYW1lX2hlaWdodCA9IDEwODg7CisJZWxzZSBpZiAodGVtcCA+IDApCisJCXZmLT5oZWlnaHQgPSBody0+ZnJhbWVfaGVpZ2h0ID0gdGVtcDsKKwl2Zi0+ZHVyYXRpb24gPSBody0+ZnJhbWVfZHVyOworCXZmLT5yYXRpb19jb250cm9sID0gRElTUF9SQVRJT19BU1BFQ1RfUkFUSU9fTUFYIDw8IERJU1BfUkFUSU9fQVNQRUNUX1JBVElPX0JJVDsKKwl2Zi0+c2FyX3dpZHRoID0gMTsKKwl2Zi0+c2FyX2hlaWdodCA9IDE7CisJdmYtPmR1cmF0aW9uX3B1bGxkb3duID0gMDsKKwl2Zi0+ZmxhZyA9IDA7CisKKwl2Zi0+Y2FudmFzMEFkZHIgPSB2Zi0+Y2FudmFzMUFkZHIgPSAtMTsKKwl2Zi0+cGxhbmVfbnVtID0gMzsKKworCXZmLT5jYW52YXMwX2NvbmZpZ1swXSA9IGh3LT5idWZmZXJfc3BlY1t2Zi0+aW5kZXhdLmNhbnZhc19jb25maWdbMF07CisJdmYtPmNhbnZhczBfY29uZmlnWzFdID0gaHctPmJ1ZmZlcl9zcGVjW3ZmLT5pbmRleF0uY2FudmFzX2NvbmZpZ1sxXTsKKwl2Zi0+Y2FudmFzMF9jb25maWdbMl0gPSBody0+YnVmZmVyX3NwZWNbdmYtPmluZGV4XS5jYW52YXNfY29uZmlnWzJdOworCisJdmYtPmNhbnZhczFfY29uZmlnWzBdID0gaHctPmJ1ZmZlcl9zcGVjW3ZmLT5pbmRleF0uY2FudmFzX2NvbmZpZ1swXTsKKwl2Zi0+Y2FudmFzMV9jb25maWdbMV0gPSBody0+YnVmZmVyX3NwZWNbdmYtPmluZGV4XS5jYW52YXNfY29uZmlnWzFdOworCXZmLT5jYW52YXMxX2NvbmZpZ1syXSA9IGh3LT5idWZmZXJfc3BlY1t2Zi0+aW5kZXhdLmNhbnZhc19jb25maWdbMl07CisKKwkvKiBtanBlZyBjb252ZXJ0IGVuZGlhbiB0byBtYXRjaCBkaXNwbGF5LiAqLworCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNykgfHwKKwkJKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDMpIHx8CisJCShnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1VykpIHsKKwkJdGVtcF9lbmRpYW4gPSAoaHctPmNhbnZhc19tb2RlID09IENBTlZBU19CTEtNT0RFX0xJTkVBUikgPyA3IDogMDsKKwl9IGVsc2UgeworCQl0ZW1wX2VuZGlhbiA9IChody0+Y2FudmFzX21vZGUgPT0gQ0FOVkFTX0JMS01PREVfTElORUFSKSA/IDAgOiA3OworCX0KKworCXZmLT5jYW52YXMwX2NvbmZpZ1swXS5lbmRpYW4gPSB0ZW1wX2VuZGlhbjsKKwl2Zi0+Y2FudmFzMF9jb25maWdbMV0uZW5kaWFuID0gdGVtcF9lbmRpYW47CisJdmYtPmNhbnZhczBfY29uZmlnWzJdLmVuZGlhbiA9IHRlbXBfZW5kaWFuOworCXZmLT5jYW52YXMxX2NvbmZpZ1swXS5lbmRpYW4gPSB0ZW1wX2VuZGlhbjsKKwl2Zi0+Y2FudmFzMV9jb25maWdbMV0uZW5kaWFuID0gdGVtcF9lbmRpYW47CisJdmYtPmNhbnZhczFfY29uZmlnWzJdLmVuZGlhbiA9IHRlbXBfZW5kaWFuOworCisJdmYtPnNpZGViaW5kX3R5cGUgPSBody0+c2lkZWJpbmRfdHlwZTsKKwl2Zi0+c2lkZWJpbmRfY2hhbm5lbF9pZCA9IGh3LT5zaWRlYmluZF9jaGFubmVsX2lkOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgdm1qcGVnX2lzcihzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgaXJxKQoreworCXN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKmh3ID0KKwkJKHN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKikodmRlYy0+cHJpdmF0ZSk7CisKKwlpZiAoIWh3KQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwlpZiAoaHctPmVvcykKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfQ0xSX1JFRywgMSk7CisKKwlyZXR1cm4gSVJRX1dBS0VfVEhSRUFEOworfQorCitzdGF0aWMgaW50IHZtanBlZ19nZXRfcHNfaW5mbyhzdHJ1Y3QgdmRlY19tanBlZ19od19zICpodywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBzdHJ1Y3QgYW1sX3ZkZWNfcHNfaW5mb3MgKnBzKQoreworCXBzLT52aXNpYmxlX3dpZHRoCT0gd2lkdGg7CisJcHMtPnZpc2libGVfaGVpZ2h0CT0gaGVpZ2h0OworCXBzLT5jb2RlZF93aWR0aAkJPSBBTElHTih3aWR0aCwgNjQpOworCXBzLT5jb2RlZF9oZWlnaHQgCT0gQUxJR04oaGVpZ2h0LCA2NCk7CisJcHMtPmRwYl9zaXplIAkJPSBody0+YnVmX251bTsKKwlwcy0+ZHBiX2ZyYW1lcwkJPSBERUNPREVfQlVGRkVSX05VTV9ERUY7CisJcHMtPmRwYl9tYXJnaW4JCT0gaHctPmR5bmFtaWNfYnVmX251bV9tYXJnaW47CisJcHMtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdjRsX3Jlc19jaGFuZ2Uoc3RydWN0IHZkZWNfbWpwZWdfaHdfcyAqaHcsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisJaW50IHJldCA9IDA7CisKKwlpZiAoY3R4LT5wYXJhbV9zZXRzX2Zyb21fdWNvZGUgJiYKKwkJaHctPnJlc19jaF9mbGFnID09IDApIHsKKwkJc3RydWN0IGFtbF92ZGVjX3BzX2luZm9zIHBzOworCisJCWlmICgoaHctPmZyYW1lX3dpZHRoICE9IDAgJiYKKwkJCWh3LT5mcmFtZV9oZWlnaHQgIT0gMCkgJiYKKwkJCShody0+ZnJhbWVfd2lkdGggIT0gd2lkdGggfHwKKwkJCWh3LT5mcmFtZV9oZWlnaHQgIT0gaGVpZ2h0KSkgeworCQkJbW1qcGVnX2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkJInY0bF9yZXNfY2hhbmdlIFBpYyBXaWR0aC9IZWlnaHQgQ2hhbmdlICglZCwlZCk9PiglZCwlZClcbiIsCisJCQkJaHctPmZyYW1lX3dpZHRoLCBody0+ZnJhbWVfaGVpZ2h0LAorCQkJCXdpZHRoLAorCQkJCWhlaWdodCk7CisJCQl2bWpwZWdfZ2V0X3BzX2luZm8oaHcsIHdpZHRoLCBoZWlnaHQsICZwcyk7CisJCQl2ZGVjX3Y0bF9zZXRfcHNfaW5mb3MoY3R4LCAmcHMpOworCQkJdmRlY192NGxfcmVzX2NoX2V2ZW50KGN0eCk7CisJCQlody0+djRsX3BhcmFtc19wYXJzZWQgPSBmYWxzZTsKKwkJCWh3LT5yZXNfY2hfZmxhZyA9IDE7CisJCQljdHgtPnY0bF9yZXNvbHV0aW9uX2NoYW5nZSA9IDE7CisJCQlody0+ZW9zID0gMTsKKwkJCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy1zdWJtaXRfZW9zIiwgX19MSU5FX18pOworCQkJbm90aWZ5X3Y0bF9lb3MoaHdfdG9fdmRlYyhodykpOworCQkJQVRSQUNFX0NPVU5URVIoIlZfU1RfREVDLXN1Ym1pdF9lb3MiLCAwKTsKKworCQkJcmV0ID0gMTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB2bWpwZWdfaXNyX3RocmVhZF9mbihzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgaXJxKQoreworCXN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKikodmRlYy0+cHJpdmF0ZSk7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICogdjRsMl9jdHggPSBody0+djRsMl9jdHg7CisJc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKmZiID0gTlVMTDsKKwl1MzIgcmVnOworCXN0cnVjdCB2ZnJhbWVfcyAqdmYgPSBOVUxMOworCXUzMiBpbmRleCwgb2Zmc2V0ID0gMCwgcHRzOworCXU2NCBwdHNfdXM2NDsKKwl1MzIgZnJhbWVfc2l6ZTsKKworCWlmIChSRUFEX1ZSRUcoQVZfU0NSQVRDSF9EKSAhPSAwICYmCisJCShkZWJ1Z19lbmFibGUgJiBQUklOVF9GTEFHX1VDT0RFX0RFVEFJTCkpIHsKKwkJcHJfaW5mbygiZGJnJXg6ICV4XG4iLCBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9EKSwKKwkJUkVBRF9WUkVHKEFWX1NDUkFUQ0hfRSkpOworCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfRCwgMCk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAoUkVBRF9WUkVHKERFQ19TVEFUVVNfUkVHKSA9PSAxKSB7CisJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCWludCBmcmFtZV93aWR0aCA9IFJFQURfVlJFRyhNUkVHX1BJQ19XSURUSCk7CisJCQlpbnQgZnJhbWVfaGVpZ2h0ID0gUkVBRF9WUkVHKE1SRUdfUElDX0hFSUdIVCk7CisKKwkJCWlmICghdjRsX3Jlc19jaGFuZ2UoaHcsIGZyYW1lX3dpZHRoLCBmcmFtZV9oZWlnaHQpKSB7CisJCQkJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisJCQkJaWYgKGN0eC0+cGFyYW1fc2V0c19mcm9tX3Vjb2RlICYmICFody0+djRsX3BhcmFtc19wYXJzZWQpIHsKKwkJCQkJc3RydWN0IGFtbF92ZGVjX3BzX2luZm9zIHBzOworCisJCQkJCXZtanBlZ19nZXRfcHNfaW5mbyhodywgZnJhbWVfd2lkdGgsIGZyYW1lX2hlaWdodCwgJnBzKTsKKwkJCQkJaHctPnY0bF9wYXJhbXNfcGFyc2VkID0gdHJ1ZTsKKwkJCQkJdmRlY192NGxfc2V0X3BzX2luZm9zKGN0eCwgJnBzKTsKKwkJCQkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwkJCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0FHQUlOOworCQkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCQl9IGVsc2UgeworCQkJCQlzdHJ1Y3QgdmRlY19waWNfaW5mbyBwaWM7CisKKwkJCQkJaWYgKCFody0+YnVmX251bSkgeworCQkJCQkJdmRlY192NGxfZ2V0X3BpY19pbmZvKGN0eCwgJnBpYyk7CisJCQkJCQlody0+YnVmX251bSA9IHBpYy5kcGJfZnJhbWVzICsKKwkJCQkJCQlwaWMuZHBiX21hcmdpbjsKKwkJCQkJCWlmIChody0+YnVmX251bSA+IERFQ09ERV9CVUZGRVJfTlVNX01BWCkKKwkJCQkJCQlody0+YnVmX251bSA9IERFQ09ERV9CVUZGRVJfTlVNX01BWDsKKwkJCQkJfQorCisJCQkJCVdSSVRFX1ZSRUcoREVDX1NUQVRVU19SRUcsIDApOworCisJCQkJCWh3LT5yZXNfY2hfZmxhZyA9IDE7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCQkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKwkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCX0KKwkJfSBlbHNlCisJCQlXUklURV9WUkVHKERFQ19TVEFUVVNfUkVHLCAwKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCisJcmVnID0gUkVBRF9WUkVHKE1SRUdfRlJPTV9BTVJJU0MpOworCWluZGV4ID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfNSkgJiAweGZmZmZmZjsKKworCWlmIChpbmRleCA+PSBody0+YnVmX251bSkgeworCQlwcl9lcnIoImZhdGFsIGVycm9yLCBpbnZhbGlkIGJ1ZmZlciBpbmRleC4iKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWlmIChrZmlmb19nZXQoJmh3LT5uZXdmcmFtZV9xLCAmdmYpID09IDApIHsKKwkJcHJfaW5mbygKKwkJImZhdGFsIGVycm9yLCBubyBhdmFpbGFibGUgYnVmZmVyIHNsb3QuIik7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCXZmLT52NGxfbWVtX2hhbmRsZQorCQkJPSBody0+YnVmZmVyX3NwZWNbaW5kZXhdLnY0bF9yZWZfYnVmX2FkZHI7CisJCWZiID0gKHN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICopdmYtPnY0bF9tZW1faGFuZGxlOworCQltbWpwZWdfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WNExfREVUQUlMLAorCQkJIlslZF0gJXMoKSwgdjRsIG1lbSBoYW5kbGU6IDB4JWx4XG4iLAorCQkJKChzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KSktPmlkLAorCQkJX19mdW5jX18sIHZmLT52NGxfbWVtX2hhbmRsZSk7CisJfQorCisJdmYtPmluZGV4ID0gaW5kZXg7CisJc2V0X2ZyYW1lX2luZm8oaHcsIHZmKTsKKworCXZmLT50eXBlID0gVklEVFlQRV9QUk9HUkVTU0lWRSB8IFZJRFRZUEVfVklVX0ZJRUxEOworCS8qIHZmLT5wdHMgPSAocHRzX3ZhbGlkKSA/IHB0cyA6IDA7ICovCisJLyogdmYtPnB0c191czY0ID0gKHB0c192YWxpZCkgPyBwdHNfdXM2NCA6IDA7ICovCisKKwlpZiAoaHctPmNodW5rKSB7CisJCXZmLT5wdHMgPSBody0+Y2h1bmstPnB0czsKKwkJdmYtPnB0c191czY0ID0gaHctPmNodW5rLT5wdHM2NDsKKwkJdmYtPnRpbWVzdGFtcCA9IGh3LT5jaHVuay0+dGltZXN0YW1wOworCX0gZWxzZSB7CisJCW9mZnNldCA9IFJFQURfVlJFRyhNUkVHX0ZSQU1FX09GRlNFVCk7CisJCWlmICgodmRlYy0+dmJ1Zi5ub19wYXJzZXIgPT0gMCkgfHwgKHZkZWMtPnZidWYudXNlX3B0c3NlcnYpKSB7CisJCQlpZiAocHRzX2xvb2t1cF9vZmZzZXRfdXM2NAorCQkJCShQVFNfVFlQRV9WSURFTywgb2Zmc2V0LCAmcHRzLAorCQkJCSZmcmFtZV9zaXplLCAzMDAwLAorCQkJCSZwdHNfdXM2NCkgPT0gMCkgeworCQkJCXZmLT5wdHMgPSBwdHM7CisJCQkJdmYtPnB0c191czY0ID0gcHRzX3VzNjQ7CisJCQl9IGVsc2UgeworCQkJCXZmLT5wdHMgPSAwOworCQkJCXZmLT5wdHNfdXM2NCA9IDA7CisJCQl9CisJCX0KKwkJaWYgKCF2ZGVjLT52YnVmLnVzZV9wdHNzZXJ2ICYmIHZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpKSB7CisJCQl2Zi0+cHRzX3VzNjQgPSBvZmZzZXQ7CisJCQl2Zi0+cHRzID0gMDsKKwkJfQorCX0KKwl2Zi0+b3JpZW50YXRpb24gPSAwOworCWh3LT52ZmJ1Zl91c2VbaW5kZXhdKys7CisKKwl2Zi0+bWVtX2hhbmRsZSA9CisJCWRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQlody0+bW1fYmxrX2hhbmRsZSwgaW5kZXgpOworCWRlY29kZXJfZG9fZnJhbWVfY2hlY2sodmRlYywgdmYpOworCXZkZWNfdmZyYW1lX3JlYWR5KHZkZWMsIHZmKTsKKwlrZmlmb19wdXQoJmh3LT5kaXNwbGF5X3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJQVRSQUNFX0NPVU5URVIoaHctPnB0c19uYW1lLCB2Zi0+dGltZXN0YW1wKTsKKwlBVFJBQ0VfQ09VTlRFUihody0+bmV3X3FfbmFtZSwga2ZpZm9fbGVuKCZody0+bmV3ZnJhbWVfcSkpOworCUFUUkFDRV9DT1VOVEVSKGh3LT5kaXNwX3FfbmFtZSwga2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKSk7CisJaHctPmZyYW1lX251bSsrOworCW1tanBlZ19kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GUkFNRV9OVU0sCisJCSIlczpmcmFtZSBudW06JWQscHRzPSVkLHB0czY0PSVsbGQuIGR1cj0lZFxuIiwKKwlfX2Z1bmNfXywgaHctPmZyYW1lX251bSwKKwl2Zi0+cHRzLCB2Zi0+cHRzX3VzNjQsIHZmLT5kdXJhdGlvbik7CisJdmRlYy0+dmRlY19mcHNfZGV0ZWModmRlYy0+aWQpOworCWlmICh3aXRob3V0X2Rpc3BsYXlfbW9kZSA9PSAwKSB7CisJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCWlmICh2NGwyX2N0eC0+aXNfc3RyZWFtX29mZikgeworCQkJCXZtanBlZ192Zl9wdXQodm1qcGVnX3ZmX2dldCh2ZGVjKSwgdmRlYyk7CisJCQl9IGVsc2UgeworCQkJCUFUUkFDRV9DT1VOVEVSKCJWQ19PVVRfREVDLXN1Ym1pdCIsIGZiLT5idWZfaWR4KTsKKwkJCQlmYi0+dGFzay0+c3VibWl0KGZiLT50YXNrLCBUQVNLX1RZUEVfREVDKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXZmX25vdGlmeV9yZWNlaXZlcih2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfVkZSQU1FX1JFQURZLAorCQkJCQlOVUxMKTsKKwkJfQorCX0gZWxzZQorCQl2bWpwZWdfdmZfcHV0KHZtanBlZ192Zl9nZXQodmRlYyksIHZkZWMpOworCisJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisKKwl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCB2YWxpZF92Zl9jaGVjayhzdHJ1Y3QgdmZyYW1lX3MgKnZmLCBzdHJ1Y3QgdmRlY19tanBlZ19od19zICpodykKK3sKKwlpbnQgaTsKKworCWlmICghdmYgfHwgKHZmLT5pbmRleCA9PSAtMSkpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IFZGX1BPT0xfU0laRTsgaSsrKSB7CisJCWlmICh2ZiA9PSAmaHctPnZmcG9vbFtpXSkKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2bWpwZWdfdmZfcGVlayh2b2lkICpvcF9hcmcpCit7CisJc3RydWN0IHZmcmFtZV9zICp2ZjsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gb3BfYXJnOworCXN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKil2ZGVjLT5wcml2YXRlOworCisJaWYgKCFodykKKwkJcmV0dXJuIE5VTEw7CisJYXRvbWljX2FkZCgxLCAmaHctPnBlZWtfbnVtKTsKKwlpZiAoa2ZpZm9fcGVlaygmaHctPmRpc3BsYXlfcSwgJnZmKSkKKwkJcmV0dXJuIHZmOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZtanBlZ192Zl9nZXQodm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCB2ZnJhbWVfcyAqdmY7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IG9wX2FyZzsKKwlzdHJ1Y3QgdmRlY19tanBlZ19od19zICpodyA9IChzdHJ1Y3QgdmRlY19tanBlZ19od19zICopdmRlYy0+cHJpdmF0ZTsKKworCWlmICghaHcpCisJCXJldHVybiBOVUxMOworCisJaWYgKGtmaWZvX2dldCgmaHctPmRpc3BsYXlfcSwgJnZmKSkgeworCQl2Zi0+aW5kZXhfZGlzcCA9IGF0b21pY19yZWFkKCZody0+Z2V0X251bSk7CisJCWF0b21pY19hZGQoMSwgJmh3LT5nZXRfbnVtKTsKKwkJQVRSQUNFX0NPVU5URVIoaHctPmRpc3BfcV9uYW1lLCBrZmlmb19sZW4oJmh3LT5kaXNwbGF5X3EpKTsKKwkJcmV0dXJuIHZmOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgdm1qcGVnX3ZmX3B1dChzdHJ1Y3QgdmZyYW1lX3MgKnZmLCB2b2lkICpvcF9hcmcpCit7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IG9wX2FyZzsKKwlzdHJ1Y3QgdmRlY19tanBlZ19od19zICpodyA9IChzdHJ1Y3QgdmRlY19tanBlZ19od19zICopdmRlYy0+cHJpdmF0ZTsKKworCWlmICghdmFsaWRfdmZfY2hlY2sodmYsIGh3KSkgeworCQltbWpwZWdfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19FUlJPUiwKKwkJCSJpbnZhbGlkIHZmOiAlbHhcbiIsICh1bG9uZyl2Zik7CisJCXJldHVybiA7CisJfQorCisJbW1qcGVnX2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZSQU1FX05VTSwKKwkJIiVzOnB1dF9udW06JWRcbiIsIF9fZnVuY19fLCBody0+cHV0X251bSk7CisKKwlpZiAodmYtPnY0bF9tZW1faGFuZGxlICE9CisJCWh3LT5idWZmZXJfc3BlY1t2Zi0+aW5kZXhdLnY0bF9yZWZfYnVmX2FkZHIpIHsKKwkJaHctPmJ1ZmZlcl9zcGVjW3ZmLT5pbmRleF0udjRsX3JlZl9idWZfYWRkcgorCQkJPSB2Zi0+djRsX21lbV9oYW5kbGU7CisKKwkJbW1qcGVnX2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVjRMX0RFVEFJTCwKKwkJCSJNSlBFRyB1cGRhdGUgZmIgaGFuZGxlLCBvbGQ6JWxseCwgbmV3OiVsbHhcbiIsCisJCQlody0+YnVmZmVyX3NwZWNbdmYtPmluZGV4XS52NGxfcmVmX2J1Zl9hZGRyLAorCQkJdmYtPnY0bF9tZW1faGFuZGxlKTsKKwl9CisKKwlody0+dmZidWZfdXNlW3ZmLT5pbmRleF0tLTsKKworCWtmaWZvX3B1dCgmaHctPm5ld2ZyYW1lX3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJQVRSQUNFX0NPVU5URVIoaHctPm5ld19xX25hbWUsIGtmaWZvX2xlbigmaHctPm5ld2ZyYW1lX3EpKTsKKwlhdG9taWNfYWRkKDEsICZody0+cHV0X251bSk7Cit9CisKK3N0YXRpYyBpbnQgdm1qcGVnX2V2ZW50X2NiKGludCB0eXBlLCB2b2lkICpkYXRhLCB2b2lkICpvcF9hcmcpCit7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IG9wX2FyZzsKKworCWlmICh0eXBlICYgVkZSQU1FX0VWRU5UX1JFQ0VJVkVSX1JFUV9TVEFURSkgeworCQlzdHJ1Y3QgcHJvdmlkZXJfc3RhdGVfcmVxX3MgKnJlcSA9CisJCQkoc3RydWN0IHByb3ZpZGVyX3N0YXRlX3JlcV9zICopZGF0YTsKKwkJaWYgKHJlcS0+cmVxX3R5cGUgPT0gUkVRX1NUQVRFX1NFQ1VSRSkKKwkJCXJlcS0+cmVxX3Jlc3VsdFswXSA9IHZkZWNfc2VjdXJlKHZkZWMpOworCQllbHNlCisJCQlyZXEtPnJlcV9yZXN1bHRbMF0gPSAweGZmZmZmZmZmOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZtanBlZ192Zl9zdGF0ZXMoc3RydWN0IHZmcmFtZV9zdGF0ZXMgKnN0YXRlcywgdm9pZCAqb3BfYXJnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IG9wX2FyZzsKKwlzdHJ1Y3QgdmRlY19tanBlZ19od19zICpodyA9IChzdHJ1Y3QgdmRlY19tanBlZ19od19zICopdmRlYy0+cHJpdmF0ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZody0+bG9jaywgZmxhZ3MpOworCisJc3RhdGVzLT52Zl9wb29sX3NpemUgPSBWRl9QT09MX1NJWkU7CisJc3RhdGVzLT5idWZfZnJlZV9udW0gPSBrZmlmb19sZW4oJmh3LT5uZXdmcmFtZV9xKTsKKwlzdGF0ZXMtPmJ1Zl9hdmFpbF9udW0gPSBrZmlmb19sZW4oJmh3LT5kaXNwbGF5X3EpOworCXN0YXRlcy0+YnVmX3JlY3ljbGVfbnVtID0gMDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bWpwZWdfZGVjX3N0YXR1cyhzdHJ1Y3QgdmRlY19zICp2ZGVjLCBzdHJ1Y3QgdmRlY19pbmZvICp2c3RhdHVzKQoreworCXN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKil2ZGVjLT5wcml2YXRlOworCisJaWYgKCFodykKKwkJcmV0dXJuIC0xOworCisJdnN0YXR1cy0+ZnJhbWVfd2lkdGggPSBody0+ZnJhbWVfd2lkdGg7CisJdnN0YXR1cy0+ZnJhbWVfaGVpZ2h0ID0gaHctPmZyYW1lX2hlaWdodDsKKwlpZiAoMCAhPSBody0+ZnJhbWVfZHVyKQorCQl2c3RhdHVzLT5mcmFtZV9yYXRlID0gOTYwMDAgLyBody0+ZnJhbWVfZHVyOworCWVsc2UKKwkJdnN0YXR1cy0+ZnJhbWVfcmF0ZSA9IDk2MDAwOworCXZzdGF0dXMtPmVycm9yX2NvdW50ID0gMDsKKwl2c3RhdHVzLT5zdGF0dXMgPSBody0+c3RhdDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbml0X3NjYWxlcih2b2lkKQoreworCS8qIDQgcG9pbnQgdHJpYW5nbGUgKi8KKwljb25zdCB1bnNpZ25lZCBpbnQgZmlsdF9jb2VmW10gPSB7CisJCTB4MjA0MDIwMDAsIDB4MjA0MDIwMDAsIDB4MWYzZjIxMDEsIDB4MWYzZjIxMDEsCisJCTB4MWUzZTIyMDIsIDB4MWUzZTIyMDIsIDB4MWQzZDIzMDMsIDB4MWQzZDIzMDMsCisJCTB4MWMzYzI0MDQsIDB4MWMzYzI0MDQsIDB4MWIzYjI1MDUsIDB4MWIzYjI1MDUsCisJCTB4MWEzYTI2MDYsIDB4MWEzYTI2MDYsIDB4MTkzOTI3MDcsIDB4MTkzOTI3MDcsCisJCTB4MTgzODI4MDgsIDB4MTgzODI4MDgsIDB4MTczNzI5MDksIDB4MTczNzI5MDksCisJCTB4MTYzNjJhMGEsIDB4MTYzNjJhMGEsIDB4MTUzNTJiMGIsIDB4MTUzNTJiMGIsCisJCTB4MTQzNDJjMGMsIDB4MTQzNDJjMGMsIDB4MTMzMzJkMGQsIDB4MTMzMzJkMGQsCisJCTB4MTIzMjJlMGUsIDB4MTIzMjJlMGUsIDB4MTEzMTJmMGYsIDB4MTEzMTJmMGYsCisJCTB4MTAzMDMwMTAKKwl9OworCWludCBpOworCisJLyogcHNjYWxlIGVuYWJsZSwgUFNDQUxFIGNidXMgYm1lbSBlbmFibGUgKi8KKwlXUklURV9WUkVHKFBTQ0FMRV9DVFJMLCAweGMwMDApOworCisJLyogd3JpdGUgZmlsdGVyIGNvZWZzICovCisJV1JJVEVfVlJFRyhQU0NBTEVfQk1FTV9BRERSLCAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzM7IGkrKykgeworCQlXUklURV9WUkVHKFBTQ0FMRV9CTUVNX0RBVCwgMCk7CisJCVdSSVRFX1ZSRUcoUFNDQUxFX0JNRU1fREFULCBmaWx0X2NvZWZbaV0pOworCX0KKworCS8qIFkgaG9yaXpvbnRhbCBpbml0aWFsIGluZm8gKi8KKwlXUklURV9WUkVHKFBTQ0FMRV9CTUVNX0FERFIsIDM3ICogMik7CisJLyogWzM1XTogYnVmIHJlcGVhdCBwaXgwLAorCSAqIFszNDoyOV0gPT4gYnVmIHJlY2VpdmUgbnVtLAorCSAqIFsyODoxNl0gPT4gYnVmIGJsayB4LAorCSAqIFsxNTowXSA9PiBidWYgcGhhc2UKKwkgKi8KKwlXUklURV9WUkVHKFBTQ0FMRV9CTUVNX0RBVCwgMHgwMDA4KTsKKwlXUklURV9WUkVHKFBTQ0FMRV9CTUVNX0RBVCwgMHg2MDAwMDAwMCk7CisKKwkvKiBDIGhvcml6b250YWwgaW5pdGlhbCBpbmZvICovCisJV1JJVEVfVlJFRyhQU0NBTEVfQk1FTV9BRERSLCA0MSAqIDIpOworCVdSSVRFX1ZSRUcoUFNDQUxFX0JNRU1fREFULCAweDAwMDgpOworCVdSSVRFX1ZSRUcoUFNDQUxFX0JNRU1fREFULCAweDYwMDAwMDAwKTsKKworCS8qIFkgdmVydGljYWwgaW5pdGlhbCBpbmZvICovCisJV1JJVEVfVlJFRyhQU0NBTEVfQk1FTV9BRERSLCAzOSAqIDIpOworCVdSSVRFX1ZSRUcoUFNDQUxFX0JNRU1fREFULCAweDAwMDgpOworCVdSSVRFX1ZSRUcoUFNDQUxFX0JNRU1fREFULCAweDYwMDAwMDAwKTsKKworCS8qIEMgdmVydGljYWwgaW5pdGlhbCBpbmZvICovCisJV1JJVEVfVlJFRyhQU0NBTEVfQk1FTV9BRERSLCA0MyAqIDIpOworCVdSSVRFX1ZSRUcoUFNDQUxFX0JNRU1fREFULCAweDAwMDgpOworCVdSSVRFX1ZSRUcoUFNDQUxFX0JNRU1fREFULCAweDYwMDAwMDAwKTsKKworCS8qIFkgaG9yaXpvbnRhbCBwaGFzZSBzdGVwICovCisJV1JJVEVfVlJFRyhQU0NBTEVfQk1FTV9BRERSLCAzNiAqIDIgKyAxKTsKKwkvKiBbMTk6MF0gPT4gWSBob3Jpem9udGFsIHBoYXNlIHN0ZXAgKi8KKwlXUklURV9WUkVHKFBTQ0FMRV9CTUVNX0RBVCwgMHgxMDAwMCk7CisJLyogQyBob3Jpem9udGFsIHBoYXNlIHN0ZXAgKi8KKwlXUklURV9WUkVHKFBTQ0FMRV9CTUVNX0FERFIsIDQwICogMiArIDEpOworCS8qIFsxOTowXSA9PiBDIGhvcml6b250YWwgcGhhc2Ugc3RlcCAqLworCVdSSVRFX1ZSRUcoUFNDQUxFX0JNRU1fREFULCAweDEwMDAwKTsKKworCS8qIFkgdmVydGljYWwgcGhhc2Ugc3RlcCAqLworCVdSSVRFX1ZSRUcoUFNDQUxFX0JNRU1fQUREUiwgMzggKiAyICsgMSk7CisJLyogWzE5OjBdID0+IFkgdmVydGljYWwgcGhhc2Ugc3RlcCAqLworCVdSSVRFX1ZSRUcoUFNDQUxFX0JNRU1fREFULCAweDEwMDAwKTsKKwkvKiBDIHZlcnRpY2FsIHBoYXNlIHN0ZXAgKi8KKwlXUklURV9WUkVHKFBTQ0FMRV9CTUVNX0FERFIsIDQyICogMiArIDEpOworCS8qIFsxOTowXSA9PiBDIGhvcml6b250YWwgcGhhc2Ugc3RlcCAqLworCVdSSVRFX1ZSRUcoUFNDQUxFX0JNRU1fREFULCAweDEwMDAwKTsKKworCS8qIHJlc2V0IHBzY2FsZXIgKi8KKyNpZiAxLypNRVNPTl9DUFVfVFlQRSA+PSBNRVNPTl9DUFVfVFlQRV9NRVNPTjYqLworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgKDEgPDwgMTApKTsKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsIDApOworI2Vsc2UKKwlXUklURV9SRVNFVF9SRUcoUkVTRVQyX1JFR0lTVEVSLCBSRVNFVF9QU0NBTEUpOworI2VuZGlmCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA8IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TQzIpIHsKKwkJUkVBRF9SRVNFVF9SRUcoUkVTRVQyX1JFR0lTVEVSKTsKKwkJUkVBRF9SRVNFVF9SRUcoUkVTRVQyX1JFR0lTVEVSKTsKKwkJUkVBRF9SRVNFVF9SRUcoUkVTRVQyX1JFR0lTVEVSKTsKKwl9CisJV1JJVEVfVlJFRyhQU0NBTEVfUlNULCAweDcpOworCVdSSVRFX1ZSRUcoUFNDQUxFX1JTVCwgMHgwKTsKK30KKworc3RhdGljIHZvaWQgdm1qcGVnX2R1bXBfc3RhdGUoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzdHJ1Y3QgdmRlY19tanBlZ19od19zICpodyA9CisJCShzdHJ1Y3QgdmRlY19tanBlZ19od19zICopKHZkZWMtPnByaXZhdGUpOworCW1tanBlZ19kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiPT09PT09ICVzXG4iLCBfX2Z1bmNfXyk7CisJbW1qcGVnX2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSJ3aWR0aC9oZWlnaHQgKCVkLyVkKSBidWZfbnVtICVkXG4iLAorCQlody0+ZnJhbWVfd2lkdGgsCisJCWh3LT5mcmFtZV9oZWlnaHQsCisJCWh3LT5idWZfbnVtCisJCSk7CisJbW1qcGVnX2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJImlzX2ZyYW1lYmFzZSglZCksIGVvcyAlZCwgc3RhdGUgMHgleCwgZGVjX3Jlc3VsdCAweCV4IGRlY19mcm0gJWQgcHV0X2ZybSAlZCBydW4gJWQgbm90X3J1bl9yZWFkeSAlZCBpbnB1dF9lbXB0eSAlZFxuIiwKKwkJaW5wdXRfZnJhbWVfYmFzZWQodmRlYyksCisJCWh3LT5lb3MsCisJCWh3LT5zdGF0LAorCQlody0+ZGVjX3Jlc3VsdCwKKwkJaHctPmZyYW1lX251bSwKKwkJaHctPnB1dF9udW0sCisJCWh3LT5ydW5fY291bnQsCisJCWh3LT5ub3RfcnVuX3JlYWR5LAorCQlody0+aW5wdXRfZW1wdHkKKwkJKTsKKwlpZiAoIWh3LT5pc191c2VkX3Y0bCAmJiB2Zl9nZXRfcmVjZWl2ZXIodmRlYy0+dmZfcHJvdmlkZXJfbmFtZSkpIHsKKwkJZW51bSByZWNldml2ZXJfc3RhcnRfZSBzdGF0ZSA9CisJCXZmX25vdGlmeV9yZWNlaXZlcih2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1FVUkVZX1NUQVRFLAorCQkJTlVMTCk7CisJCW1tanBlZ19kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJIlxucmVjZWl2ZXIoJXMpIHN0YXRlICVkXG4iLAorCQkJdmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCXN0YXRlKTsKKwl9CisJbW1qcGVnX2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJIiVzLCBuZXdxKCVkLyVkKSwgZGlzcHEoJWQvJWQpIHZmIHBlZWsvZ2V0L3B1dCAoJWQvJWQvJWQpXG4iLAorCV9fZnVuY19fLAorCWtmaWZvX2xlbigmaHctPm5ld2ZyYW1lX3EpLAorCVZGX1BPT0xfU0laRSwKKwlrZmlmb19sZW4oJmh3LT5kaXNwbGF5X3EpLAorCVZGX1BPT0xfU0laRSwKKwlody0+cGVla19udW0sCisJaHctPmdldF9udW0sCisJaHctPnB1dF9udW0KKwkpOworCW1tanBlZ19kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiVklGRl9CSVRfQ05UPTB4JXhcbiIsCisJCVJFQURfVlJFRyhWSUZGX0JJVF9DTlQpKTsKKwltbWpwZWdfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIlZMRF9NRU1fVklGSUZPX0xFVkVMPTB4JXhcbiIsCisJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCkpOworCW1tanBlZ19kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiVkxEX01FTV9WSUZJRk9fV1A9MHgleFxuIiwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1dQKSk7CisJbW1qcGVnX2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSJWTERfTUVNX1ZJRklGT19SUD0weCV4XG4iLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApKTsKKwltbWpwZWdfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIlBBUlNFUl9WSURFT19SUD0weCV4XG4iLAorCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfcnApKTsKKwltbWpwZWdfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIlBBUlNFUl9WSURFT19XUD0weCV4XG4iLAorCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApKTsKKwlpZiAoaW5wdXRfZnJhbWVfYmFzZWQodmRlYykgJiYKKwkJZGVidWdfZW5hYmxlICYgUFJJTlRfRlJBTUVCQVNFX0RBVEEKKwkJKSB7CisJCWludCBqajsKKwkJaWYgKGh3LT5jaHVuayAmJiBody0+Y2h1bmstPmJsb2NrICYmCisJCQlody0+Y2h1bmstPnNpemUgPiAwKSB7CisJCQl1OCAqZGF0YSA9IE5VTEw7CisKKwkJCWlmICghaHctPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQkJCWRhdGEgPSBjb2RlY19tbV92bWFwKGh3LT5jaHVuay0+YmxvY2stPnN0YXJ0ICsKKwkJCQkJaHctPmNodW5rLT5vZmZzZXQsIGh3LT5jaHVuay0+c2l6ZSk7CisJCQllbHNlCisJCQkJZGF0YSA9ICgodTggKilody0+Y2h1bmstPmJsb2NrLT5zdGFydF92aXJ0KSArCisJCQkJCWh3LT5jaHVuay0+b2Zmc2V0OworCisJCQltbWpwZWdfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCQkiZnJhbWUgZGF0YSBzaXplIDB4JXhcbiIsCisJCQkJaHctPmNodW5rLT5zaXplKTsKKwkJCWZvciAoamogPSAwOyBqaiA8IGh3LT5jaHVuay0+c2l6ZTsgamorKykgeworCQkJCWlmICgoamogJiAweGYpID09IDApCisJCQkJCW1tanBlZ19kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLAorCQkJCQlQUklOVF9GUkFNRUJBU0VfREFUQSwKKwkJCQkJCSIlMDZ4OiIsIGpqKTsKKwkJCQltbWpwZWdfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCQlQUklOVF9GUkFNRUJBU0VfREFUQSwKKwkJCQkJIiUwMnggIiwgZGF0YVtqal0pOworCQkJCWlmICgoKGpqICsgMSkgJiAweGYpID09IDApCisJCQkJCW1tanBlZ19kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLAorCQkJCQlQUklOVF9GUkFNRUJBU0VfREFUQSwKKwkJCQkJCSJcbiIpOworCQkJfQorCisJCQlpZiAoIWh3LT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJCQljb2RlY19tbV91bm1hcF9waHlhZGRyKGRhdGEpOworCQl9CisJfQorfQorc3RhdGljIHZvaWQgcmVzZXRfcHJvY2Vzc190aW1lKHN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKmh3KQoreworCWlmIChody0+c3RhcnRfcHJvY2Vzc190aW1lKSB7CisJCXVuc2lnbmVkIHByb2Nlc3NfdGltZSA9CisJCQkxMDAwICogKGppZmZpZXMgLSBody0+c3RhcnRfcHJvY2Vzc190aW1lKSAvIEhaOworCQlody0+c3RhcnRfcHJvY2Vzc190aW1lID0gMDsKKwkJaWYgKHByb2Nlc3NfdGltZSA+IG1heF9wcm9jZXNzX3RpbWVbREVDT0RFX0lEKGh3KV0pCisJCQltYXhfcHJvY2Vzc190aW1lW0RFQ09ERV9JRChodyldID0gcHJvY2Vzc190aW1lOworCX0KK30KKworc3RhdGljIHZvaWQgc3RhcnRfcHJvY2Vzc190aW1lKHN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKmh3KQoreworCWh3LT5kZWNvZGVfdGltZW91dF9jb3VudCA9IDI7CisJaHctPnN0YXJ0X3Byb2Nlc3NfdGltZSA9IGppZmZpZXM7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVvdXRfcHJvY2VzcyhzdHJ1Y3QgdmRlY19tanBlZ19od19zICpodykKK3sKKwlhbXZkZWNfc3RvcCgpOworCW1tanBlZ19kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0VSUk9SLAorCQkiJXMgZGVjb2RlciB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CisJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfdGltZXJfZnVuYyhzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpCit7CisJc3RydWN0IHZkZWNfbWpwZWdfaHdfcyAqaHcgPSBjb250YWluZXJfb2YodGltZXIsCisJCXN0cnVjdCB2ZGVjX21qcGVnX2h3X3MsIGNoZWNrX3RpbWVyKTsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisJaW50IHRpbWVvdXRfdmFsID0gZGVjb2RlX3RpbWVvdXRfdmFsOworCisJbW1qcGVnX2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkxEX0RFVEFJTCwKKwkJIiVzOiBzdGF0dXM6bnN0YXR1cz0lZDolZFxuIiwKKwkJX19mdW5jX18sIHZkZWMtPnN0YXR1cywgdmRlYy0+bmV4dF9zdGF0dXMpOworCW1tanBlZ19kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1ZMRF9ERVRBSUwsCisJCSIlczogJWQsYnVmdGw9JXg6JXg6JXg6JXhcbiIsCisJCV9fZnVuY19fLCBfX0xJTkVfXywKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0JVRl9DTlRMKSwKKwkJU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3dwKSwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKSwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1dQKSk7CisKKwlpZiAocmFkciAhPSAwKSB7CisJCWlmIChydmFsICE9IDApIHsKKwkJCVdSSVRFX1ZSRUcocmFkciwgcnZhbCk7CisJCQlwcl9pbmZvKCJXUklURV9WUkVHKCV4LCV4KVxuIiwgcmFkciwgcnZhbCk7CisJCX0gZWxzZQorCQkJcHJfaW5mbygiUkVBRF9WUkVHKCV4KT0leFxuIiwgcmFkciwgUkVBRF9WUkVHKHJhZHIpKTsKKwkJcnZhbCA9IDA7CisJCXJhZHIgPSAwOworCX0KKworCWlmICgoKGRlYnVnX2VuYWJsZSAmIFBSSU5UX0ZMQUdfVElNRU9VVF9TVEFUVVMpID09IDApICYmCisJCSh0aW1lb3V0X3ZhbCA+IDApICYmCisJCShody0+c3RhcnRfcHJvY2Vzc190aW1lID4gMCkgJiYKKwkJKCgxMDAwICogKGppZmZpZXMgLSBody0+c3RhcnRfcHJvY2Vzc190aW1lKSAvIEhaKQorCQkJPiB0aW1lb3V0X3ZhbCkpIHsKKwkJaWYgKGh3LT5sYXN0X3ZsZF9sZXZlbCA9PSBSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpKSB7CisJCQlpZiAoaHctPmRlY29kZV90aW1lb3V0X2NvdW50ID4gMCkKKwkJCQlody0+ZGVjb2RlX3RpbWVvdXRfY291bnQtLTsKKwkJCWlmIChody0+ZGVjb2RlX3RpbWVvdXRfY291bnQgPT0gMCkKKwkJCQl0aW1lb3V0X3Byb2Nlc3MoaHcpOworCQl9CisJCWh3LT5sYXN0X3ZsZF9sZXZlbCA9IFJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCk7CisJfQorCisJaWYgKFJFQURfVlJFRyhERUNfU1RBVFVTX1JFRykgPT0gREVDX0RFQ09ERV9USU1FT1VUKSB7CisJCXByX2luZm8oInVjb2RlIERFQ19ERUNPREVfVElNRU9VVFxuIik7CisJCWlmIChody0+ZGVjb2RlX3RpbWVvdXRfY291bnQgPiAwKQorCQkJaHctPmRlY29kZV90aW1lb3V0X2NvdW50LS07CisJCWlmIChody0+ZGVjb2RlX3RpbWVvdXRfY291bnQgPT0gMCkKKwkJCXRpbWVvdXRfcHJvY2Vzcyhodyk7CisJCVdSSVRFX1ZSRUcoREVDX1NUQVRVU19SRUcsIDApOworCX0KKworCW1vZF90aW1lcigmaHctPmNoZWNrX3RpbWVyLCBqaWZmaWVzICsgQ0hFQ0tfSU5URVJWQUwpOworfQorCitzdGF0aWMgdm9pZCBtanBlZ19wdXRfdmlkZW9fZnJhbWUodm9pZCAqdmRlY19jdHgsIHN0cnVjdCB2ZnJhbWVfcyAqdmYpCit7CisJdm1qcGVnX3ZmX3B1dCh2ZiwgdmRlY19jdHgpOworfQorCitzdGF0aWMgdm9pZCBtanBlZ19nZXRfdmlkZW9fZnJhbWUodm9pZCAqdmRlY19jdHgsIHN0cnVjdCB2ZnJhbWVfcyAqKnZmKQoreworCSp2ZiA9IHZtanBlZ192Zl9nZXQodmRlY19jdHgpOworfQorCitzdGF0aWMgc3RydWN0IHRhc2tfb3BzX3MgdGFza19kZWNfb3BzID0geworCS50eXBlCQk9IFRBU0tfVFlQRV9ERUMsCisJLmdldF92ZnJhbWUJPSBtanBlZ19nZXRfdmlkZW9fZnJhbWUsCisJLnB1dF92ZnJhbWUJPSBtanBlZ19wdXRfdmlkZW9fZnJhbWUsCit9OworCitzdGF0aWMgaW50IHZtanBlZ192NGxfYWxsb2NfYnVmZl9jb25maWdfY2FudmFzKHN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKmh3LCBpbnQgaSkKK3sKKwlpbnQgcmV0OworCXUzMiBjYW52YXM7CisJdWxvbmcgZGVjYnVmX3N0YXJ0ID0gMCwgZGVjYnVmX3Vfc3RhcnQgPSAwLCBkZWNidWZfdl9zdGFydCA9IDA7CisJaW50IGRlY2J1Zl95X3NpemUgPSAwLCBkZWNidWZfdV9zaXplID0gMCwgZGVjYnVmX3Zfc2l6ZSA9IDA7CisJdTMyIGNhbnZhc193aWR0aCA9IDAsIGNhbnZhc19oZWlnaHQgPSAwOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGh3KTsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPSBOVUxMOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShody0+djRsMl9jdHgpOworCisJaWYgKGh3LT5idWZmZXJfc3BlY1tpXS52NGxfcmVmX2J1Zl9hZGRyKSB7CisJCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9CisJCQkoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKikKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS52NGxfcmVmX2J1Zl9hZGRyOworCisJCWZiLT5zdGF0dXMgPSBGQl9TVF9ERUNPREVSOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXQgPSBjdHgtPmZiX29wcy5hbGxvYygmY3R4LT5mYl9vcHMsIGh3LT5mYl90b2tlbiwgJmZiLCBBTUxfRkJfUkVRX0RFQyk7CisJaWYgKHJldCA8IDApIHsKKwkJbW1qcGVnX2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkiWyVkXSBnZXQgZmIgZmFpbC5cbiIsCisJCQkoKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKQorCQkJKGh3LT52NGwyX2N0eCkpLT5pZCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZmItPnRhc2stPmF0dGFjaChmYi0+dGFzaywgJnRhc2tfZGVjX29wcywgaHdfdG9fdmRlYyhodykpOworCWZiLT5zdGF0dXMgPSBGQl9TVF9ERUNPREVSOworCisJaWYgKCFody0+ZnJhbWVfd2lkdGggfHwgIWh3LT5mcmFtZV9oZWlnaHQpIHsKKwkJCXN0cnVjdCB2ZGVjX3BpY19pbmZvIHBpYzsKKwkJCXZkZWNfdjRsX2dldF9waWNfaW5mbyhjdHgsICZwaWMpOworCQkJaHctPmZyYW1lX3dpZHRoID0gcGljLnZpc2libGVfd2lkdGg7CisJCQlody0+ZnJhbWVfaGVpZ2h0ID0gcGljLnZpc2libGVfaGVpZ2h0OworCQkJbW1qcGVnX2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkJIlslZF0gc2V0ICVkIHggJWQgZnJvbSBJRiBsYXllclxuIiwgY3R4LT5pZCwKKwkJCQlody0+ZnJhbWVfd2lkdGgsIGh3LT5mcmFtZV9oZWlnaHQpOworCX0KKworCWh3LT5idWZmZXJfc3BlY1tpXS52NGxfcmVmX2J1Zl9hZGRyID0gKHVsb25nKWZiOworCWlmIChmYi0+bnVtX3BsYW5lcyA9PSAxKSB7CisJCWRlY2J1Zl9zdGFydAk9IGZiLT5tLm1lbVswXS5hZGRyOworCQlkZWNidWZfeV9zaXplCT0gZmItPm0ubWVtWzBdLm9mZnNldDsKKwkJZGVjYnVmX3Vfc3RhcnQJPSBkZWNidWZfc3RhcnQgKyBkZWNidWZfeV9zaXplOworCQlkZWNidWZfdV9zaXplCT0gZGVjYnVmX3lfc2l6ZSAvIDQ7CisJCWRlY2J1Zl92X3N0YXJ0CT0gZGVjYnVmX3Vfc3RhcnQgKyBkZWNidWZfdV9zaXplOworCQlkZWNidWZfdl9zaXplCT0gZGVjYnVmX3Vfc2l6ZTsKKwkJY2FudmFzX3dpZHRoCT0gQUxJR04oaHctPmZyYW1lX3dpZHRoLCA2NCk7CisJCWNhbnZhc19oZWlnaHQJPSBBTElHTihody0+ZnJhbWVfaGVpZ2h0LCA2NCk7CisJCWZiLT5tLm1lbVswXS5ieXRlc191c2VkID0gZmItPm0ubWVtWzBdLnNpemU7CisJfSBlbHNlIGlmIChmYi0+bnVtX3BsYW5lcyA9PSAyKSB7CisJCWRlY2J1Zl9zdGFydAk9IGZiLT5tLm1lbVswXS5hZGRyOworCQlkZWNidWZfeV9zaXplCT0gZmItPm0ubWVtWzBdLnNpemU7CisJCWRlY2J1Zl91X3N0YXJ0CT0gZmItPm0ubWVtWzFdLmFkZHI7CisJCWRlY2J1Zl91X3NpemUJPSBmYi0+bS5tZW1bMV0uc2l6ZSA+PiAxOworCQlkZWNidWZfdl9zdGFydAk9IGRlY2J1Zl91X3N0YXJ0ICsgZGVjYnVmX3Vfc2l6ZTsKKwkJZGVjYnVmX3Zfc2l6ZQk9IGRlY2J1Zl91X3NpemU7CisJCWNhbnZhc193aWR0aAk9IEFMSUdOKGh3LT5mcmFtZV93aWR0aCwgNjQpOworCQljYW52YXNfaGVpZ2h0CT0gQUxJR04oaHctPmZyYW1lX2hlaWdodCwgNjQpOworCQlmYi0+bS5tZW1bMF0uYnl0ZXNfdXNlZCA9IGZiLT5tLm1lbVswXS5zaXplOworCQlmYi0+bS5tZW1bMV0uYnl0ZXNfdXNlZCA9IGZiLT5tLm1lbVsxXS5zaXplOworCX0gZWxzZSBpZiAoZmItPm51bV9wbGFuZXMgPT0gMykgeworCQlkZWNidWZfc3RhcnQJPSBmYi0+bS5tZW1bMF0uYWRkcjsKKwkJZGVjYnVmX3lfc2l6ZQk9IGZiLT5tLm1lbVswXS5zaXplOworCQlkZWNidWZfdV9zdGFydAk9IGZiLT5tLm1lbVsxXS5hZGRyOworCQlkZWNidWZfdV9zaXplCT0gZmItPm0ubWVtWzFdLnNpemU7CisJCWRlY2J1Zl92X3N0YXJ0CT0gZmItPm0ubWVtWzJdLmFkZHI7CisJCWRlY2J1Zl92X3NpemUJPSBmYi0+bS5tZW1bMl0uc2l6ZTsKKwkJY2FudmFzX3dpZHRoCT0gQUxJR04oaHctPmZyYW1lX3dpZHRoLCA2NCk7CisJCWNhbnZhc19oZWlnaHQJPSBBTElHTihody0+ZnJhbWVfaGVpZ2h0LCA2NCk7CisJCWZiLT5tLm1lbVswXS5ieXRlc191c2VkID0gZmItPm0ubWVtWzBdLnNpemU7CisJCWZiLT5tLm1lbVsxXS5ieXRlc191c2VkID0gZmItPm0ubWVtWzFdLnNpemU7CisJCWZiLT5tLm1lbVsyXS5ieXRlc191c2VkID0gZmItPm0ubWVtWzJdLnNpemU7CisJfQorCisJbW1qcGVnX2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVjRMX0RFVEFJTCwKKwkJIlslZF0gdjRsIHJlZiBidWYgYWRkcjogMHgleFxuIiwgY3R4LT5pZCwgZmIpOworCisJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCWlmIChody0+YnVmZmVyX3NwZWNbaV0ueV9jYW52YXNfaW5kZXggPT0gLTEpCisJCQlody0+YnVmZmVyX3NwZWNbaV0ueV9jYW52YXNfaW5kZXggPQorCQkJdmRlYy0+Z2V0X2NhbnZhc19leChDT1JFX01BU0tfVkRFQ18xLCB2ZGVjLT5pZCk7CisJCWlmIChody0+YnVmZmVyX3NwZWNbaV0udV9jYW52YXNfaW5kZXggPT0gLTEpCisJCQlody0+YnVmZmVyX3NwZWNbaV0udV9jYW52YXNfaW5kZXggPQorCQkJdmRlYy0+Z2V0X2NhbnZhc19leChDT1JFX01BU0tfVkRFQ18xLCB2ZGVjLT5pZCk7CisJCWlmIChody0+YnVmZmVyX3NwZWNbaV0udl9jYW52YXNfaW5kZXggPT0gLTEpCisJCQlody0+YnVmZmVyX3NwZWNbaV0udl9jYW52YXNfaW5kZXggPQorCQkJdmRlYy0+Z2V0X2NhbnZhc19leChDT1JFX01BU0tfVkRFQ18xLCB2ZGVjLT5pZCk7CisJfSBlbHNlIHsKKwkJY2FudmFzID0gdmRlYy0+Z2V0X2NhbnZhcyhpLCAzKTsKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLnlfY2FudmFzX2luZGV4ID0gY2FudmFzX3koY2FudmFzKTsKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLnVfY2FudmFzX2luZGV4ID0gY2FudmFzX3UoY2FudmFzKTsKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLnZfY2FudmFzX2luZGV4ID0gY2FudmFzX3YoY2FudmFzKTsKKwl9CisKKwlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1swXS5waHlfYWRkciA9CisJCWRlY2J1Zl9zdGFydDsKKwlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1swXS53aWR0aCA9CisJCWNhbnZhc193aWR0aDsKKwlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1swXS5oZWlnaHQgPQorCQljYW52YXNfaGVpZ2h0OworCWh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfY29uZmlnWzBdLmJsb2NrX21vZGUgPQorCQlody0+Y2FudmFzX21vZGU7CisJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMF0uZW5kaWFuID0KKwkJKGh3LT5jYW52YXNfbW9kZSA9PSBDQU5WQVNfQkxLTU9ERV9MSU5FQVIpID8gNyA6IDA7CisKKwljb25maWdfY2F2X2x1dChody0+YnVmZmVyX3NwZWNbaV0ueV9jYW52YXNfaW5kZXgsCisJCQkmaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMF0sIFZERUNfMSk7CisKKwlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1sxXS5waHlfYWRkciA9CisJCWRlY2J1Zl91X3N0YXJ0OworCWh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfY29uZmlnWzFdLndpZHRoID0KKwkJY2FudmFzX3dpZHRoIC8gMjsKKwlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1sxXS5oZWlnaHQgPQorCQljYW52YXNfaGVpZ2h0IC8gMjsKKwlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1sxXS5ibG9ja19tb2RlID0KKwkJaHctPmNhbnZhc19tb2RlOworCWh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfY29uZmlnWzFdLmVuZGlhbiA9CisJCShody0+Y2FudmFzX21vZGUgPT0gQ0FOVkFTX0JMS01PREVfTElORUFSKSA/IDcgOiAwOworCisJY29uZmlnX2Nhdl9sdXQoaHctPmJ1ZmZlcl9zcGVjW2ldLnVfY2FudmFzX2luZGV4LAorCQkJJmh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfY29uZmlnWzFdLCBWREVDXzEpOworCisJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMl0ucGh5X2FkZHIgPQorCQlkZWNidWZfdl9zdGFydDsKKwlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1syXS53aWR0aCA9CisJCWNhbnZhc193aWR0aCAvIDI7CisJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMl0uaGVpZ2h0ID0KKwkJY2FudmFzX2hlaWdodCAvIDI7CisJaHctPmJ1ZmZlcl9zcGVjW2ldLmNhbnZhc19jb25maWdbMl0uYmxvY2tfbW9kZSA9CisJCWh3LT5jYW52YXNfbW9kZTsKKwlody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1syXS5lbmRpYW4gPQorCQkoaHctPmNhbnZhc19tb2RlID09IENBTlZBU19CTEtNT0RFX0xJTkVBUikgPyA3IDogMDsKKworCWNvbmZpZ19jYXZfbHV0KGh3LT5idWZmZXJfc3BlY1tpXS52X2NhbnZhc19pbmRleCwKKwkJCSZody0+YnVmZmVyX3NwZWNbaV0uY2FudmFzX2NvbmZpZ1syXSwgVkRFQ18xKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbmRfZnJlZV9idWZmZXIoc3RydWN0IHZkZWNfbWpwZWdfaHdfcyAqaHcpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaHctPmJ1Zl9udW07IGkrKykgeworCQlpZiAoaHctPnZmYnVmX3VzZVtpXSA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKChpID09IGh3LT5idWZfbnVtKSAmJgorCQkoaHctPmJ1Zl9udW0gIT0gMCkpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICh2bWpwZWdfdjRsX2FsbG9jX2J1ZmZfY29uZmlnX2NhbnZhcyhodywgaSkpCisJCXJldHVybiAtMTsKKworCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IHZtanBlZ19od19jdHhfcmVzdG9yZShzdHJ1Y3QgdmRlY19tanBlZ19od19zICpodykKK3sKKwlpbnQgaW5kZXggPSAtMTsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKiB2NGwyX2N0eCA9IGh3LT52NGwyX2N0eDsKKwlpbnQgaSA9IDA7CisKKwlpZiAoaHctPnY0bF9wYXJhbXNfcGFyc2VkKSB7CisJCXN0cnVjdCB2ZGVjX3BpY19pbmZvIHBpYzsKKworCQlpZiAoIWh3LT5idWZfbnVtKSB7CisJCQl2ZGVjX3Y0bF9nZXRfcGljX2luZm8odjRsMl9jdHgsICZwaWMpOworCQkJaHctPmJ1Zl9udW0gPSBwaWMuZHBiX2ZyYW1lcyArCisJCQkJcGljLmRwYl9tYXJnaW47CisJCQlpZiAoaHctPmJ1Zl9udW0gPiBERUNPREVfQlVGRkVSX05VTV9NQVgpCisJCQkJaHctPmJ1Zl9udW0gPSBERUNPREVfQlVGRkVSX05VTV9NQVg7CisJCX0KKworCQlpbmRleCA9IGZpbmRfZnJlZV9idWZmZXIoaHcpOworCQlpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID49IGh3LT5idWZfbnVtKSkKKwkJCXJldHVybiAtMTsKKworCQlmb3IgKGkgPSAwOyBpIDwgaHctPmJ1Zl9udW07IGkrKykgeworCQkJaWYgKGh3LT5idWZmZXJfc3BlY1tpXS52NGxfcmVmX2J1Zl9hZGRyKSB7CisJCQkJY29uZmlnX2Nhdl9sdXQoaHctPmJ1ZmZlcl9zcGVjW2ldLnlfY2FudmFzX2luZGV4LAorCQkJCQkJJmh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfY29uZmlnWzBdLCBWREVDXzEpOworCQkJCWNvbmZpZ19jYXZfbHV0KGh3LT5idWZmZXJfc3BlY1tpXS51X2NhbnZhc19pbmRleCwKKwkJCQkJJmh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfY29uZmlnWzFdLCBWREVDXzEpOworCQkJCWNvbmZpZ19jYXZfbHV0KGh3LT5idWZmZXJfc3BlY1tpXS52X2NhbnZhc19pbmRleCwKKwkJCQkJJmh3LT5idWZmZXJfc3BlY1tpXS5jYW52YXNfY29uZmlnWzJdLCBWREVDXzEpOworCQkJfQorCQl9CisKKwkJLyogZmluZCBuZXh0IGRlY29kZSBidWZmZXIgaW5kZXggKi8KKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIXzQsIHNwZWMyY2FudmFzKCZody0+YnVmZmVyX3NwZWNbaW5kZXhdKSk7CisJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF81LCBpbmRleCB8IDEgPDwgMjQpOworCisJfSBlbHNlCisJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF81LCAxIDw8IDI0KTsKKworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgKDEgPDwgNykgfCAoMSA8PCA2KSk7CisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAwKTsKKwlpbml0X3NjYWxlcigpOworCisJLyogY2xlYXIgYnVmZmVyIElOL09VVCByZWdpc3RlcnMgKi8KKwlXUklURV9WUkVHKE1SRUdfVE9fQU1SSVNDLCAwKTsKKwlXUklURV9WUkVHKE1SRUdfRlJPTV9BTVJJU0MsIDApOworCisJV1JJVEVfVlJFRyhNQ1BVX0lOVFJfTVNLLCAweGZmZmYpOworCVdSSVRFX1ZSRUcoTVJFR19ERUNPREVfUEFSQU0sIChody0+ZnJhbWVfaGVpZ2h0IDw8IDQpIHwgMHg4MDAwKTsKKworCS8qIGNsZWFyIG1haWxib3ggaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfQ0xSX1JFRywgMSk7CisJLyogZW5hYmxlIG1haWxib3ggaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfTUFTSywgMSk7CisJLyogc2V0IGludGVycnVwdCBtYXBwaW5nIGZvciB2bGQgKi8KKwlXUklURV9WUkVHKEFTU0lTVF9BTVIxX0lOVDgsIDgpOworI2lmIDEvKk1FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09ONiovCisJQ0xFQVJfVlJFR19NQVNLKE1ERUNfUElDX0RDX0NUUkwsIDEgPDwgMTcpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzMzIgdm1qcGVnX2luaXQoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlpbnQgaTsKKwlpbnQgc2l6ZSA9IC0xLCBmd19zaXplID0gMHgxMDAwICogMTY7CisJc3RydWN0IGZpcm13YXJlX3MgKmZ3ID0gTlVMTDsKKwlzdHJ1Y3QgdmRlY19tanBlZ19od19zICpodyA9CisJCShzdHJ1Y3QgdmRlY19tanBlZ19od19zICopdmRlYy0+cHJpdmF0ZTsKKworCWZ3ID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IGZpcm13YXJlX3MpICsgZndfc2l6ZSk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGZ3KSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzaXplID0gZ2V0X2Zpcm13YXJlX2RhdGEoVklERU9fREVDX01KUEVHX01VTFRJLCBmdy0+ZGF0YSk7CisJaWYgKHNpemUgPCAwKSB7CisJCXByX2VycigiZ2V0IGZpcm13YXJlIGZhaWwuIik7CisJCXZmcmVlKGZ3KTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZ3LT5sZW4gPSBzaXplOworCWh3LT5mdyA9IGZ3OworCisJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQlody0+ZnJhbWVfd2lkdGggPSAwOworCQlody0+ZnJhbWVfaGVpZ2h0ID0gMDsKKwl9IGVsc2UgeworCQlody0+ZnJhbWVfd2lkdGggPSBody0+dm1qcGVnX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoOworCQlody0+ZnJhbWVfaGVpZ2h0ID0gaHctPnZtanBlZ19hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQ7CisJfQorCWh3LT5mcmFtZV9kdXIgPSAoKGh3LT52bWpwZWdfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSkgPworCWh3LT52bWpwZWdfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSA6IDM4NDApOworCWh3LT5zYXZlZF9yZXNvbHV0aW9uID0gMDsKKwlody0+ZW9zID0gMDsKKwlody0+aW5pdF9mbGFnID0gMDsKKwlody0+ZnJhbWVfbnVtID0gMDsKKwlody0+cnVuX2NvdW50ID0gMDsKKwlody0+bm90X3J1bl9yZWFkeSA9IDA7CisJaHctPmlucHV0X2VtcHR5ID0gMDsKKwlhdG9taWNfc2V0KCZody0+cGVla19udW0sIDApOworCWF0b21pY19zZXQoJmh3LT5nZXRfbnVtLCAwKTsKKwlhdG9taWNfc2V0KCZody0+cHV0X251bSwgMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgREVDT0RFX0JVRkZFUl9OVU1fTUFYOyBpKyspCisJCWh3LT52ZmJ1Zl91c2VbaV0gPSAwOworCisJSU5JVF9LRklGTyhody0+ZGlzcGxheV9xKTsKKwlJTklUX0tGSUZPKGh3LT5uZXdmcmFtZV9xKTsKKworCWZvciAoaSA9IDA7IGkgPCBWRl9QT09MX1NJWkU7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKnZmID0gJmh3LT52ZnBvb2xbaV07CisKKwkJaHctPnZmcG9vbFtpXS5pbmRleCA9IC0xOworCQlrZmlmb19wdXQoJmh3LT5uZXdmcmFtZV9xLCB2Zik7CisJfQorCisJaWYgKGh3LT5tbV9ibGtfaGFuZGxlKSB7CisJCWRlY29kZXJfYm1tdV9ib3hfZnJlZShody0+bW1fYmxrX2hhbmRsZSk7CisJCWh3LT5tbV9ibGtfaGFuZGxlID0gTlVMTDsKKwl9CisKKwlody0+bW1fYmxrX2hhbmRsZSA9IGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYm94KAorCQlEUklWRVJfTkFNRSwKKwkJMCwKKwkJTUFYX0JNTVVfQlVGRkVSX05VTSwKKwkJNCArIFBBR0VfU0hJRlQsCisJCUNPREVDX01NX0ZMQUdTX0NNQV9DTEVBUiB8CisJCUNPREVDX01NX0ZMQUdTX0ZPUl9WREVDT0RFUik7CisKKwl0aW1lcl9zZXR1cCgmaHctPmNoZWNrX3RpbWVyLCBjaGVja190aW1lcl9mdW5jLCAwKTsKKwlody0+Y2hlY2tfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBDSEVDS19JTlRFUlZBTDsKKwkvKmFkZF90aW1lcigmaHctPmNoZWNrX3RpbWVyKTsqLworCWh3LT5zdGF0IHw9IFNUQVRfVElNRVJfQVJNOworCWh3LT5zdGF0IHw9IFNUQVRfSVNSX1JFRzsKKworCVdSSVRFX1ZSRUcoREVDT0RFX1NUT1BfUE9TLCB1ZGVidWdfZmxhZyk7CisJSU5JVF9XT1JLKCZody0+d29yaywgdm1qcGVnX3dvcmspOworCXByX2luZm8oInc6aD0lZDolZFxuIiwgaHctPmZyYW1lX3dpZHRoLCBody0+ZnJhbWVfaGVpZ2h0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2wgaXNfYXZhbGlhYmxlX2J1ZmZlcihzdHJ1Y3QgdmRlY19tanBlZ19od19zICpodykKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KTsKKwlpbnQgaSwgZnJlZV9jb3VudCA9IDA7CisJaW50IHVzZWRfY291bnQgPSAwOworCisJaWYgKChody0+YnVmX251bSA9PSAwKSB8fAorCQkoY3R4LT5jYXBfcG9vbC5kZWMgPCBody0+YnVmX251bSkpIHsKKwkJaWYgKGN0eC0+ZmJfb3BzLnF1ZXJ5KCZjdHgtPmZiX29wcywgJmh3LT5mYl90b2tlbikpIHsKKwkJCWZyZWVfY291bnQgPQorCQkJCXY0bDJfbTJtX251bV9kc3RfYnVmc19yZWFkeShjdHgtPm0ybV9jdHgpICsgMTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBody0+YnVmX251bTsgKytpKSB7CisJCWlmICgoaHctPnZmYnVmX3VzZVtpXSA9PSAwKSAmJgorCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnY0bF9yZWZfYnVmX2FkZHIpIHsKKwkJCWZyZWVfY291bnQrKzsKKwkJfSBlbHNlIGlmIChody0+YnVmZmVyX3NwZWNbaV0udjRsX3JlZl9idWZfYWRkcikKKwkJCXVzZWRfY291bnQrKzsKKwl9CisKKwlBVFJBQ0VfQ09VTlRFUigiVl9TVF9ERUMtZnJlZV9idWZmX2NvdW50IiwgZnJlZV9jb3VudCk7CisJQVRSQUNFX0NPVU5URVIoIlZfU1RfREVDLXVzZWRfYnVmZl9jb3VudCIsIHVzZWRfY291bnQpOworCisJcmV0dXJuIGZyZWVfY291bnQgPj0gcnVuX3JlYWR5X21pbl9idWZfbnVtID8gMSA6IDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJ1bl9yZWFkeShzdHJ1Y3QgdmRlY19zICp2ZGVjLAorCXVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgdmRlY19tanBlZ19od19zICpodyA9CisJCShzdHJ1Y3QgdmRlY19tanBlZ19od19zICopdmRlYy0+cHJpdmF0ZTsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KTsKKwlpbnQgcmV0ID0gMDsKKworCWh3LT5ub3RfcnVuX3JlYWR5Kys7CisKKwlpZiAoaHctPmVvcykKKwkJcmV0dXJuIDA7CisKKwlpZiAodmRlY19zdHJlYW1fYmFzZWQodmRlYykgJiYgKGh3LT5pbml0X2ZsYWcgPT0gMCkKKwkJJiYgcHJlX2RlY29kZV9idWZfbGV2ZWwgIT0gMCkgeworCQl1MzIgcnAsIHdwLCBsZXZlbDsKKworCQlycCA9IFNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF9ycCk7CisJCXdwID0gU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3dwKTsKKwkJaWYgKHdwIDwgcnApCisJCQlsZXZlbCA9IHZkZWMtPmlucHV0LnNpemUgKyB3cCAtIHJwOworCQllbHNlCisJCQlsZXZlbCA9IHdwIC0gcnA7CisKKwkJaWYgKGxldmVsIDwgcHJlX2RlY29kZV9idWZfbGV2ZWwpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoaHctPnY0bF9wYXJhbXNfcGFyc2VkKSB7CisJCXJldCA9IGlzX2F2YWxpYWJsZV9idWZmZXIoaHcpID8gMSA6IDA7CisJfSBlbHNlIHsKKwkJcmV0ID0gY3R4LT52NGxfcmVzb2x1dGlvbl9jaGFuZ2UgPyAwIDogMTsKKwl9CisKKwlody0+bm90X3J1bl9yZWFkeSA9IDA7CisJaHctPmJ1ZmZlcl9ub3RfcmVhZHkgPSAwOworCisJcmV0dXJuIHJldCA/IENPUkVfTUFTS19WREVDXzEgOiAwOworfQorCitzdGF0aWMgdm9pZCBydW4oc3RydWN0IHZkZWNfcyAqdmRlYywgdW5zaWduZWQgbG9uZyBtYXNrLAorCXZvaWQgKCpjYWxsYmFjaykoc3RydWN0IHZkZWNfcyAqLCB2b2lkICopLCB2b2lkICphcmcpCit7CisJc3RydWN0IHZkZWNfbWpwZWdfaHdfcyAqaHcgPQorCQkoc3RydWN0IHZkZWNfbWpwZWdfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJaW50IHJldDsKKworCWh3LT52ZGVjX2NiX2FyZyA9IGFyZzsKKwlody0+dmRlY19jYiA9IGNhbGxiYWNrOworCisJaHctPnJ1bl9jb3VudCsrOworCXZkZWNfcmVzZXRfY29yZSh2ZGVjKTsKKworCXJldCA9IHZkZWNfcHJlcGFyZV9pbnB1dCh2ZGVjLCAmaHctPmNodW5rKTsKKwlpZiAocmV0IDw9IDApIHsKKwkJaHctPmlucHV0X2VtcHR5Kys7CisJCW1tanBlZ19kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1JVTl9GTE9XLAorCQkiJXM6ICVkLHI9JWQsYnVmdGw9JXg6JXg6JXhcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJldCwKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19CVUZfQ05UTCksCisJCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfcnApLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1dQKSk7CisKKwkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0FHQUlOOworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJcmV0dXJuOworCX0KKworCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy1jaHVua19zaXplIiwgcmV0KTsKKworCWh3LT5pbnB1dF9lbXB0eSA9IDA7CisJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX05PTkU7CisJaWYgKHZkZWMtPm1jX2xvYWRlZCkgeworCS8qZmlybXdhcmUgaGF2ZSBsb2FkIGJlZm9yZSwKKwkgIGFuZCBub3QgY2hhbmdlcyB0byBhbm90aGVyLgorCSAgaWdub3JlIHJlbG9hZC4KKwkqLworCX0gZWxzZSB7CisJCXJldCA9IGFtdmRlY192ZGVjX2xvYWRtY19leChWRk9STUFUX01KUEVHLCAibW1qcGVnIiwgdmRlYywgaHctPmZ3LT5kYXRhKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiWyVkXSBNTUpQRUc6IHRoZSAlcyBmdyBsb2FkaW5nIGZhaWxlZCwgZXJyOiAleFxuIiwKKwkJCQl2ZGVjLT5pZCwgdGVlX2VuYWJsZWQoKSA/ICJURUUiIDogImxvY2FsIiwgcmV0KTsKKwkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9GT1JDRV9FWElUOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQlyZXR1cm47CisJCX0KKwkJdmRlYy0+bWNfbG9hZGVkID0gMTsKKwkJdmRlYy0+bWNfdHlwZSA9IFZGT1JNQVRfTUpQRUc7CisJfQorLyoJaWYgKGFtdmRlY192ZGVjX2xvYWRtY19idWZfZXgodmRlYywgaHctPmZ3LT5kYXRhLCBody0+ZnctPmxlbikgPCAwKSB7CisJCXByX2VycigiJXM6IEVycm9yIGFtdmRlY19sb2FkbWMgZmFpbFxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfSovCisKKwlpZiAodm1qcGVnX2h3X2N0eF9yZXN0b3JlKGh3KSA8IDApIHsKKwkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0VSUk9SOworCQltbWpwZWdfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSJhbXZkZWNfbW1qcGVnOiBlcnJvciBIVyBjb250ZXh0IHJlc3RvcmVcbiIpOworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJcmV0dXJuOworCX0KKyNpZiAwCisJdmRlY19lbmFibGVfaW5wdXQodmRlYyk7CisJbW9kX3RpbWVyKCZody0+Y2hlY2tfdGltZXIsIGppZmZpZXMgKyBDSEVDS19JTlRFUlZBTCk7CisjZW5kaWYKKwlody0+c3RhdCB8PSBTVEFUX01DX0xPQUQ7CisJc3RhcnRfcHJvY2Vzc190aW1lKGh3KTsKKwlody0+bGFzdF92bGRfbGV2ZWwgPSAwOworCW1vZF90aW1lcigmaHctPmNoZWNrX3RpbWVyLCBqaWZmaWVzICsgQ0hFQ0tfSU5URVJWQUwpOworCWFtdmRlY19zdGFydCgpOworCXZkZWNfZW5hYmxlX2lucHV0KHZkZWMpOworCWh3LT5zdGF0IHw9IFNUQVRfVkRFQ19SVU47CisJaHctPmluaXRfZmxhZyA9IDE7CisKKwltbWpwZWdfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19SVU5fRkxPVywKKwkJIiVzICgweCV4IDB4JXggMHgleCkgdmxkY3JsIDB4JXggYml0Y250IDB4JXggcG93ZXJjdGwgMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXhcbiIsCisJCV9fZnVuY19fLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApLAorCQlSRUFEX1ZSRUcoVkxEX0RFQ09ERV9DT05UUk9MKSwKKwkJUkVBRF9WUkVHKFZJRkZfQklUX0NOVCksCisJCVJFQURfVlJFRyhQT1dFUl9DVExfVkxEKSwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1NUQVJUX1BUUiksCisJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19DVVJSX1BUUiksCisJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19DT05UUk9MKSwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0JVRl9DTlRMKSwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0VORF9QVFIpKTsKK30KK3N0YXRpYyB2b2lkIHdhaXRfdm1qcGVnX3NlYXJjaF9kb25lKHN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKmh3KQoreworCXUzMiB2bGRfcnAgPSBSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApOworCWludCBjb3VudCA9IDA7CisKKwlkbyB7CisJCXVzbGVlcF9yYW5nZSgxMDAsIDUwMCk7CisJCWlmICh2bGRfcnAgPT0gUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSkKKwkJCWJyZWFrOworCQlpZiAoY291bnQgPiAxMDAwKSB7CisJCQltbWpwZWdfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCQkJIiVzLCBjb3VudCAlZCAgdmxkX3JwIDB4JXggVkxEX01FTV9WSUZJRk9fUlAgMHgleFxuIiwKKwkJCQkJX19mdW5jX18sIGNvdW50LCB2bGRfcnAsIFJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCkpOworCQkJYnJlYWs7CisJCX0gZWxzZQorCQkJdmxkX3JwID0gUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKTsKKwkJY291bnQrKzsKKwl9IHdoaWxlICgxKTsKK30KKworc3RhdGljIGludCBub3RpZnlfdjRsX2VvcyhzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKil2ZGVjLT5wcml2YXRlOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShody0+djRsMl9jdHgpOworCXN0cnVjdCB2ZnJhbWVfcyAqdmYgPSAmaHctPnZmcmFtZV9kdW1teTsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPSBOVUxMOworCWludCBpbmRleCA9IElOVkFMSURfSURYOworCXVsb25nIGV4cGlyZXM7CisKKwlpZiAoaHctPmVvcykgeworCQlleHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjAwMCk7CisJCXdoaWxlICghaXNfYXZhbGlhYmxlX2J1ZmZlcihodykpIHsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGV4cGlyZXMpKSB7CisJCQkJcHJfZXJyKCJbJWRdIE1KUEVHIGlzbid0IGVub3VnaCBidWZmIGZvciBub3RpZnkgZW9zLlxuIiwgY3R4LT5pZCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKworCQlpbmRleCA9IGZpbmRfZnJlZV9idWZmZXIoaHcpOworCQlpZiAoSU5WQUxJRF9JRFggPT0gaW5kZXgpIHsKKwkJCXByX2VycigiWyVkXSBNSlBFRyBFT1MgZ2V0IGZyZWUgYnVmZiBmYWlsLlxuIiwgY3R4LT5pZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWZiID0gKHN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICopCisJCQlody0+YnVmZmVyX3NwZWNbaW5kZXhdLnY0bF9yZWZfYnVmX2FkZHI7CisKKwkJdmYtPnR5cGUJCXw9IFZJRFRZUEVfVjRMX0VPUzsKKwkJdmYtPnRpbWVzdGFtcAkJPSBVTE9OR19NQVg7CisJCXZmLT52NGxfbWVtX2hhbmRsZQk9ICh1bG9uZylmYjsKKwkJdmYtPmZsYWcJCT0gVkZSQU1FX0ZMQUdfRU1QVFlfRlJBTUVfVjRMOworCisJCXZkZWNfdmZyYW1lX3JlYWR5KHZkZWMsIHZmKTsKKwkJa2ZpZm9fcHV0KCZody0+ZGlzcGxheV9xLCAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCisJCUFUUkFDRV9DT1VOVEVSKCJWQ19PVVRfREVDLXN1Ym1pdCIsIGZiLT5idWZfaWR4KTsKKwkJZmItPnRhc2stPnN1Ym1pdChmYi0+dGFzaywgVEFTS19UWVBFX0RFQyk7CisKKwkJcHJfaW5mbygiWyVkXSBtanBlZyBFT1Mgbm90aWZ5LlxuIiwgY3R4LT5pZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZtanBlZ193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdmRlY19tanBlZ19od19zICpodyA9IGNvbnRhaW5lcl9vZih3b3JrLAorCXN0cnVjdCB2ZGVjX21qcGVnX2h3X3MsIHdvcmspOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGh3KTsKKworCW1tanBlZ19kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0JVRkZFUl9ERVRBSUwsCisJIiVzOiByZXN1bHQ9JWQsbGVuPSVkOiVkXG4iLAorCQkJX19mdW5jX18sIGh3LT5kZWNfcmVzdWx0LAorCQkJa2ZpZm9fbGVuKCZody0+bmV3ZnJhbWVfcSksCisJCQlrZmlmb19sZW4oJmh3LT5kaXNwbGF5X3EpKTsKKworCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy13b3JrX3N0YXRlIiwgaHctPmRlY19yZXN1bHQpOworCisJaWYgKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfRE9ORSkgeworCQl2ZGVjX3ZmcmFtZV9kaXJ0eShod190b192ZGVjKGh3KSwgaHctPmNodW5rKTsKKwkJaHctPmNodW5rID0gTlVMTDsKKwl9IGVsc2UgaWYgKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfQUdBSU4pIHsKKwkJLyoKKwkJCXN0cmVhbSBiYXNlOiBzdHJlYW0gYnVmIGVtcHR5IG9yIHRpbWVvdXQKKwkJCWZyYW1lIGJhc2U6IHZkZWNfcHJlcGFyZV9pbnB1dCBmYWlsCisJCSovCisJCWlmICghdmRlY19oYXNfbW9yZV9pbnB1dChod190b192ZGVjKGh3KSkpIHsKKwkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9FT1M7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCS8qcHJfaW5mbygiJXM6IHJldHVyblxuIiwKKwkJCV9fZnVuY19fKTsqLworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIGlmIChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0ZPUkNFX0VYSVQpIHsKKwkJcHJfaW5mbygiJXM6IGZvcmNlIGV4aXRcbiIsIF9fZnVuY19fKTsKKwkJaWYgKGh3LT5zdGF0ICYgU1RBVF9JU1JfUkVHKSB7CisJCQlhbXZkZWNfc3RvcCgpOworCQkJdmRlY19mcmVlX2lycShWREVDX0lSUV8xLCAodm9pZCAqKWh3KTsKKwkJCWh3LT5zdGF0ICY9IH5TVEFUX0lTUl9SRUc7CisJCX0KKwl9IGVsc2UgaWYgKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfRU9TKSB7CisJCXByX2luZm8oIiVzOiBlbmQgb2Ygc3RyZWFtXG4iLCBfX2Z1bmNfXyk7CisJCWlmIChody0+c3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJCWFtdmRlY19zdG9wKCk7CisJCQlody0+c3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwkJfQorCQlody0+ZW9zID0gMTsKKwkJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQkJQVRSQUNFX0NPVU5URVIoIlZfU1RfREVDLXN1Ym1pdF9lb3MiLCBfX0xJTkVfXyk7CisJCQlub3RpZnlfdjRsX2Vvcyh2ZGVjKTsKKwkJCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy1zdWJtaXRfZW9zIiwgMCk7CisJCX0KKworCQl2ZGVjX3ZmcmFtZV9kaXJ0eShod190b192ZGVjKGh3KSwgaHctPmNodW5rKTsKKwkJaHctPmNodW5rID0gTlVMTDsKKwkJdmRlY19jbGVhbl9pbnB1dChod190b192ZGVjKGh3KSk7CisJfQorCWlmIChody0+c3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJYW12ZGVjX3N0b3AoKTsKKwkJaHctPnN0YXQgJj0gflNUQVRfVkRFQ19SVU47CisJfQorCS8qZGlzYWJsZSBtYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoQVNTSVNUX01CT1gxX01BU0ssIDApOworCXdhaXRfdm1qcGVnX3NlYXJjaF9kb25lKGh3KTsKKworCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShody0+djRsMl9jdHgpOworCisJCWlmIChjdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSAmJgorCQkJIWh3LT52NGxfcGFyYW1zX3BhcnNlZCkKKwkJCXZkZWNfdjRsX3dyaXRlX2ZyYW1lX3N5bmMoY3R4KTsKKwl9CisKKwkvKiBtYXJrIGl0c2VsZiBoYXMgYWxsIEhXIHJlc291cmNlIHJlbGVhc2VkIGFuZCBpbnB1dCByZWxlYXNlZCAqLworCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkKKwkJdmRlY19jb3JlX2ZpbmlzaF9ydW4oaHdfdG9fdmRlYyhodyksIENPUkVfTUFTS19WREVDXzEpOworCWVsc2UgeworCQl2ZGVjX2NvcmVfZmluaXNoX3J1bihod190b192ZGVjKGh3KSwgQ09SRV9NQVNLX1ZERUNfMQorCQkJfCBDT1JFX01BU0tfSEVWQyk7CisJfQorCWRlbF90aW1lcl9zeW5jKCZody0+Y2hlY2tfdGltZXIpOworCWh3LT5zdGF0ICY9IH5TVEFUX1RJTUVSX0FSTTsKKworCWlmIChody0+dmRlY19jYikKKwkJaHctPnZkZWNfY2IoaHdfdG9fdmRlYyhodyksIGh3LT52ZGVjX2NiX2FyZyk7Cit9CisKK3N0YXRpYyBpbnQgdm1qcGVnX3N0b3Aoc3RydWN0IHZkZWNfbWpwZWdfaHdfcyAqaHcpCit7CisJcHJfaW5mbygiJXMgLi4uY291bnQgPSAlZFxuIiwgX19mdW5jX18sIGh3LT5mcmFtZV9udW0pOworCisJaWYgKGh3LT5zdGF0ICYgU1RBVF9WREVDX1JVTikgeworCQlhbXZkZWNfc3RvcCgpOworCQlwcl9pbmZvKCIlcyBhbXZkZWNfc3RvcFxuIiwgX19mdW5jX18pOworCQlody0+c3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwl9CisKKwlpZiAoaHctPnN0YXQgJiBTVEFUX0lTUl9SRUcpIHsKKwkJdmRlY19mcmVlX2lycShWREVDX0lSUV8xLCAodm9pZCAqKWh3KTsKKwkJaHctPnN0YXQgJj0gflNUQVRfSVNSX1JFRzsKKwl9CisKKwlpZiAoaHctPnN0YXQgJiBTVEFUX1RJTUVSX0FSTSkgeworCQlkZWxfdGltZXJfc3luYygmaHctPmNoZWNrX3RpbWVyKTsKKwkJaHctPnN0YXQgJj0gflNUQVRfVElNRVJfQVJNOworCX0KKwljYW5jZWxfd29ya19zeW5jKCZody0+d29yayk7CisJaHctPmluaXRfZmxhZyA9IDA7CisKKwlpZiAoaHctPm1tX2Jsa19oYW5kbGUpIHsKKwkJZGVjb2Rlcl9ibW11X2JveF9mcmVlKGh3LT5tbV9ibGtfaGFuZGxlKTsKKwkJaHctPm1tX2Jsa19oYW5kbGUgPSBOVUxMOworCX0KKworCWlmIChody0+ZncpIHsKKwkJdmZyZWUoaHctPmZ3KTsKKwkJaHctPmZ3ID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmVzZXQoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzdHJ1Y3QgdmRlY19tanBlZ19od19zICpodyA9CisJCShzdHJ1Y3QgdmRlY19tanBlZ19od19zICopdmRlYy0+cHJpdmF0ZTsKKwlpbnQgaTsKKworCWlmIChody0+c3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJYW12ZGVjX3N0b3AoKTsKKwkJaHctPnN0YXQgJj0gflNUQVRfVkRFQ19SVU47CisJfQorCisJZmx1c2hfd29yaygmaHctPndvcmspOworCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaHctPmJ1Zl9udW07IGkrKykgeworCQlody0+YnVmZmVyX3NwZWNbaV0udjRsX3JlZl9idWZfYWRkciA9IDA7CisJCWh3LT52ZmJ1Zl91c2VbaV0gPSAwOworCX0KKworCUlOSVRfS0ZJRk8oaHctPmRpc3BsYXlfcSk7CisJSU5JVF9LRklGTyhody0+bmV3ZnJhbWVfcSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVkZfUE9PTF9TSVpFOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IHZmcmFtZV9zICp2ZiA9ICZody0+dmZwb29sW2ldOworCisJCW1lbXNldCgodm9pZCAqKXZmLCAwLCBzaXplb2YoKnZmKSk7CisJCWh3LT52ZnBvb2xbaV0uaW5kZXggPSAtMTsKKwkJa2ZpZm9fcHV0KCZody0+bmV3ZnJhbWVfcSwgdmYpOworCX0KKwlody0+ZW9zID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBERUNPREVfQlVGRkVSX05VTV9NQVg7IGkrKykgeworCQl2ZGVjLT5mcmVlX2NhbnZhc19leChody0+YnVmZmVyX3NwZWNbaV0ueV9jYW52YXNfaW5kZXgsIHZkZWMtPmlkKTsKKwkJdmRlYy0+ZnJlZV9jYW52YXNfZXgoaHctPmJ1ZmZlcl9zcGVjW2ldLnVfY2FudmFzX2luZGV4LCB2ZGVjLT5pZCk7CisJCXZkZWMtPmZyZWVfY2FudmFzX2V4KGh3LT5idWZmZXJfc3BlY1tpXS52X2NhbnZhc19pbmRleCwgdmRlYy0+aWQpOworCQlody0+YnVmZmVyX3NwZWNbaV0ueV9jYW52YXNfaW5kZXggPSAtMTsKKwkJaHctPmJ1ZmZlcl9zcGVjW2ldLnVfY2FudmFzX2luZGV4ID0gLTE7CisJCWh3LT5idWZmZXJfc3BlY1tpXS52X2NhbnZhc19pbmRleCA9IC0xOworCX0KKworCWh3LT5lb3MJCQk9IDA7CisJaHctPmJ1Zl9udW0JCT0gMDsKKwlody0+ZnJhbWVfd2lkdGgJCT0gMDsKKwlody0+ZnJhbWVfaGVpZ2h0CT0gMDsKKworCWF0b21pY19zZXQoJmh3LT5wZWVrX251bSwgMCk7CisJYXRvbWljX3NldCgmaHctPmdldF9udW0sIDApOworCWF0b21pY19zZXQoJmh3LT5wdXRfbnVtLCAwKTsKKworCXByX2luZm8oIm1qcGVnOiByZXNldC5cbiIpOworfQorCitzdGF0aWMgaW50IGFtbXZkZWNfbWpwZWdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdmRlY19zICpwZGF0YSA9ICooc3RydWN0IHZkZWNfcyAqKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgdmRlY19tanBlZ19od19zICpodyA9IE5VTEw7CisJaW50IGNvbmZpZ192YWwgPSAwOworCisJaWYgKHBkYXRhID09IE5VTEwpIHsKKwkJcHJfaW5mbygiYW1tdmRlY19tanBlZyBtZW1vcnkgcmVzb3VyY2UgdW5kZWZpbmVkLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWh3ID0gIHZ6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZGVjX21qcGVnX2h3X3MpKTsKKwlpZiAoaHcgPT0gTlVMTCkgeworCQlwcl9pbmZvKCJcbmFtbXZkZWNfbWpwZWcgZGV2aWNlIGRhdGEgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiB0aGUgY3R4IGZyb20gdjRsMiBkcml2ZXIuICovCisJaHctPnY0bDJfY3R4ID0gcGRhdGEtPnByaXZhdGU7CisKKwlwZGF0YS0+cHJpdmF0ZSA9IGh3OworCXBkYXRhLT5kZWNfc3RhdHVzID0gdm1qcGVnX2RlY19zdGF0dXM7CisKKwlwZGF0YS0+cnVuID0gcnVuOworCXBkYXRhLT5ydW5fcmVhZHkgPSBydW5fcmVhZHk7CisJcGRhdGEtPnJlc2V0ID0gcmVzZXQ7CisJcGRhdGEtPmlycV9oYW5kbGVyID0gdm1qcGVnX2lzcjsKKwlwZGF0YS0+dGhyZWFkZWRfaXJxX2hhbmRsZXIgPSB2bWpwZWdfaXNyX3RocmVhZF9mbjsKKwlwZGF0YS0+ZHVtcF9zdGF0ZSA9IHZtanBlZ19kdW1wX3N0YXRlOworCisJc25wcmludGYoaHctPnZkZWNfbmFtZSwgc2l6ZW9mKGh3LT52ZGVjX25hbWUpLAorCQkidm1qcGVnLSVkIiwgcGRldi0+aWQpOworCXNucHJpbnRmKGh3LT5wdHNfbmFtZSwgc2l6ZW9mKGh3LT5wdHNfbmFtZSksCisJCSIlcy10aW1lc3RhbXAiLCBody0+dmRlY19uYW1lKTsKKwlzbnByaW50Zihody0+bmV3X3FfbmFtZSwgc2l6ZW9mKGh3LT5uZXdfcV9uYW1lKSwKKwkJIiVzLW5ld2ZyYW1lX3EiLCBody0+dmRlY19uYW1lKTsKKwlzbnByaW50Zihody0+ZGlzcF9xX25hbWUsIHNpemVvZihody0+ZGlzcF9xX25hbWUpLAorCQkiJXMtZGlzcGZyYW1lX3EiLCBody0+dmRlY19uYW1lKTsKKworCWlmIChwZGF0YS0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBERUNPREVfQlVGRkVSX05VTV9NQVg7IGkrKykgeworCQkJaHctPmJ1ZmZlcl9zcGVjW2ldLnlfY2FudmFzX2luZGV4ID0gLTE7CisJCQlody0+YnVmZmVyX3NwZWNbaV0udV9jYW52YXNfaW5kZXggPSAtMTsKKwkJCWh3LT5idWZmZXJfc3BlY1tpXS52X2NhbnZhc19pbmRleCA9IC0xOworCQl9CisJfQorCisJaWYgKHBkYXRhLT51c2VfdmZtX3BhdGgpCisJCXNucHJpbnRmKHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lLCBWREVDX1BST1ZJREVSX05BTUVfU0laRSwKKwkJCVZGTV9ERUNfUFJPVklERVJfTkFNRSk7CisJZWxzZQorCQlzbnByaW50ZihwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwgVkRFQ19QUk9WSURFUl9OQU1FX1NJWkUsCisJCQlQUk9WSURFUl9OQU1FICIuJTAyeCIsIHBkZXYtPmlkICYgMHhmZik7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwZGF0YSk7CisJaHctPnBsYXRmb3JtX2RldiA9IHBkZXY7CisKKwlpZiAoKChkZWJ1Z19lbmFibGUgJiBJR05PUkVfUEFSQU1fRlJPTV9DT05GSUcpID09IDApICYmIHBkYXRhLT5jb25maWdfbGVuKSB7CisJCW1tanBlZ19kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLCAicGRhdGEtPmNvbmZpZzogJXNcbiIsIHBkYXRhLT5jb25maWcpOworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgInBhcm1fdjRsX2J1ZmZlcl9tYXJnaW4iLAorCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+ZHluYW1pY19idWZfbnVtX21hcmdpbiA9IGNvbmZpZ192YWw7CisJCWVsc2UKKwkJCWh3LT5keW5hbWljX2J1Zl9udW1fbWFyZ2luID0gZHluYW1pY19idWZfbnVtX21hcmdpbjsKKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywKKwkJCSJwYXJtX3Y0bF9jYW52YXNfbWVtX21vZGUiLAorCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+Y2FudmFzX21vZGUgPSBjb25maWdfdmFsOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLAorCQkJInBhcm1fdjRsX2NhbnZhc19tZW1fZW5kaWFuIiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJaHctPmNhbnZhc19lbmRpYW4gPSBjb25maWdfdmFsOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAic2lkZWJpbmRfdHlwZSIsCisJCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+c2lkZWJpbmRfdHlwZSA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJzaWRlYmluZF9jaGFubmVsX2lkIiwKKwkJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWh3LT5zaWRlYmluZF9jaGFubmVsX2lkID0gY29uZmlnX3ZhbDsKKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywKKwkJCSJwYXJtX3Y0bF9jb2RlY19lbmFibGUiLAorCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+aXNfdXNlZF92NGwgPSBjb25maWdfdmFsOworCisJCS8qaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV92NGxfZHVyYXRpb24iLAorCQkJJmNvbmZpZ192YWwpID09IDApCisJCQl2ZGVjX2ZyYW1lX3JhdGVfdWV2ZW50KGNvbmZpZ192YWwpOyovCisJfSBlbHNlIHsKKwkJaHctPmR5bmFtaWNfYnVmX251bV9tYXJnaW4gPSBkeW5hbWljX2J1Zl9udW1fbWFyZ2luOworCX0KKworCWlmICghaHctPmlzX3VzZWRfdjRsKSB7CisJCXZmX3Byb3ZpZGVyX2luaXQoJnBkYXRhLT52ZnJhbWVfcHJvdmlkZXIsCisJCQlwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwgJnZmX3Byb3ZpZGVyX29wcywgcGRhdGEpOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBkYXRhKTsKKworCWh3LT5wbGF0Zm9ybV9kZXYgPSBwZGV2OworCisJdmRlY19zb3VyY2VfY2hhbmdlZChWRk9STUFUX01KUEVHLAorCQkJMTkyMCwgMTA4MCwgNjApOworCWlmICh2bWpwZWdfaW5pdChwZGF0YSkgPCAwKSB7CisJCXByX2luZm8oImFtbXZkZWNfbWpwZWcgaW5pdCBmYWlsZWQuXG4iKTsKKwkJaWYgKGh3KSB7CisJCQl2ZnJlZShodyk7CisJCQlodyA9IE5VTEw7CisJCX0KKwkJcGRhdGEtPmRlY19zdGF0dXMgPSBOVUxMOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJdmRlY19zZXRfcHJlcGFyZV9sZXZlbChwZGF0YSwgc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCk7CisKKwlpZiAocGRhdGEtPnBhcmFsbGVsX2RlYyA9PSAxKQorCQl2ZGVjX2NvcmVfcmVxdWVzdChwZGF0YSwgQ09SRV9NQVNLX1ZERUNfMSk7CisJZWxzZSB7CisJCXZkZWNfY29yZV9yZXF1ZXN0KHBkYXRhLCBDT1JFX01BU0tfVkRFQ18xIHwgQ09SRV9NQVNLX0hFVkMKKwkJCQl8IENPUkVfTUFTS19DT01CSU5FKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbW12ZGVjX21qcGVnX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKmh3ID0KKwkJKHN0cnVjdCB2ZGVjX21qcGVnX2h3X3MgKikKKwkJKCgoc3RydWN0IHZkZWNfcyAqKShwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KSkpLT5wcml2YXRlKTsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjOworCWludCBpOworCisJaWYgKCFodykKKwkJcmV0dXJuIC0xOworCXZkZWMgPSBod190b192ZGVjKGh3KTsKKworCXZtanBlZ19zdG9wKGh3KTsKKworCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkKKwkJdmRlY19jb3JlX3JlbGVhc2UoaHdfdG9fdmRlYyhodyksIENPUkVfTUFTS19WREVDXzEpOworCWVsc2UKKwkJdmRlY19jb3JlX3JlbGVhc2UoaHdfdG9fdmRlYyhodyksIENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQyk7CisJdmRlY19zZXRfc3RhdHVzKGh3X3RvX3ZkZWMoaHcpLCBWREVDX1NUQVRVU19ESVNDT05ORUNURUQpOworCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQlmb3IgKGkgPSAwOyBpIDwgREVDT0RFX0JVRkZFUl9OVU1fTUFYOyBpKyspIHsKKwkJCXZkZWMtPmZyZWVfY2FudmFzX2V4KGh3LT5idWZmZXJfc3BlY1tpXS55X2NhbnZhc19pbmRleCwgdmRlYy0+aWQpOworCQkJdmRlYy0+ZnJlZV9jYW52YXNfZXgoaHctPmJ1ZmZlcl9zcGVjW2ldLnVfY2FudmFzX2luZGV4LCB2ZGVjLT5pZCk7CisJCQl2ZGVjLT5mcmVlX2NhbnZhc19leChody0+YnVmZmVyX3NwZWNbaV0udl9jYW52YXNfaW5kZXgsIHZkZWMtPmlkKTsKKwkJfQorCX0KKworCXZmcmVlKGh3KTsKKworCXByX2luZm8oIiVzXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhbW12ZGVjX21qcGVnX2RyaXZlciA9IHsKKwkucHJvYmUgPSBhbW12ZGVjX21qcGVnX3Byb2JlLAorCS5yZW1vdmUgPSBhbW12ZGVjX21qcGVnX3JlbW92ZSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZCA9IGFtdmRlY19zdXNwZW5kLAorCS5yZXN1bWUgPSBhbXZkZWNfcmVzdW1lLAorI2VuZGlmCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGNvZGVjX3Byb2ZpbGVfdCBhbW12ZGVjX21qcGVnX3Byb2ZpbGUgPSB7CisJLm5hbWUgPSAiTUpQRUctVjRMIiwKKwkucHJvZmlsZSA9ICIiCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhbW12ZGVjX21qcGVnX2RyaXZlcl9pbml0X21vZHVsZSh2b2lkKQoreworCWlmIChwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFtbXZkZWNfbWpwZWdfZHJpdmVyKSkgeworCQlwcl9lcnIoImZhaWxlZCB0byByZWdpc3RlciBhbW12ZGVjX21qcGVnIGRyaXZlclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwl2Y29kZWNfcHJvZmlsZV9yZWdpc3RlcigmYW1tdmRlY19tanBlZ19wcm9maWxlKTsKKwl2Y29kZWNfZmVhdHVyZV9yZWdpc3RlcihWRk9STUFUX01KUEVHLCAxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFtbXZkZWNfbWpwZWdfZHJpdmVyX3JlbW92ZV9tb2R1bGUodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYW1tdmRlY19tanBlZ19kcml2ZXIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK21vZHVsZV9wYXJhbShkZWJ1Z19lbmFibGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1Z19lbmFibGUsICJcbiBkZWJ1ZyBlbmFibGVcbiIpOworbW9kdWxlX3BhcmFtKHByZV9kZWNvZGVfYnVmX2xldmVsLCBpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhwcmVfZGVjb2RlX2J1Zl9sZXZlbCwKKwkJIlxuIGFtbXZkZWNfaDI2NCBwcmVfZGVjb2RlX2J1Zl9sZXZlbFxuIik7Cittb2R1bGVfcGFyYW0odWRlYnVnX2ZsYWcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh1ZGVidWdfZmxhZywgIlxuIGFtdmRlY19tbXBlZzEyIHVkZWJ1Z19mbGFnXG4iKTsKKworbW9kdWxlX3BhcmFtKGR5bmFtaWNfYnVmX251bV9tYXJnaW4sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkeW5hbWljX2J1Zl9udW1fbWFyZ2luLCAiXG4gZHluYW1pY19idWZfbnVtX21hcmdpblxuIik7CisKK21vZHVsZV9wYXJhbShkZWNvZGVfdGltZW91dF92YWwsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkZWNvZGVfdGltZW91dF92YWwsICJcbiBhbW12ZGVjX21qcGVnIGRlY29kZV90aW1lb3V0X3ZhbFxuIik7CisKK21vZHVsZV9wYXJhbV9hcnJheShtYXhfcHJvY2Vzc190aW1lLCB1aW50LCAmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCittb2R1bGVfcGFyYW0ocmFkciwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJhZHIsICJcbnJhZHJcbiIpOworCittb2R1bGVfcGFyYW0oc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwsICJcbnN0YXJ0X2RlY29kZV9idWZfbGV2ZWxcbiIpOworCittb2R1bGVfcGFyYW0ocnZhbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJ2YWwsICJcbnJ2YWxcbiIpOworCittb2R1bGVfcGFyYW0od2l0aG91dF9kaXNwbGF5X21vZGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh3aXRob3V0X2Rpc3BsYXlfbW9kZSwgIlxuIHdpdGhvdXRfZGlzcGxheV9tb2RlXG4iKTsKKworbW9kdWxlX2luaXQoYW1tdmRlY19tanBlZ19kcml2ZXJfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoYW1tdmRlY19tanBlZ19kcml2ZXJfcmVtb3ZlX21vZHVsZSk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQU1MT0dJQyBNSk1QRUcgVmlkZW8gRGVjb2RlciBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlRpbSBZYW8gPHRpbXlhb0BhbWxvZ2ljLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlcl92NGwvbXBlZzEyL01ha2VmaWxlIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC9tcGVnMTIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQxOWVkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlcl92NGwvbXBlZzEyL01ha2VmaWxlCkBAIC0wLDAgKzEsMiBAQAorb2JqLSQoQ09ORklHX0FNTE9HSUNfTUVESUFfVkRFQ19NUEVHMl9NVUxUSSkgKz0gYW12ZGVjX21tcGVnMTJfdjRsLm8KK2FtdmRlY19tbXBlZzEyX3Y0bC1vYmpzICs9IHZtcGVnMTJfbXVsdGkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC9tcGVnMTIvdm1wZWcxMl9tdWx0aS5jIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC9tcGVnMTIvdm1wZWcxMl9tdWx0aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2N2ZkNzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL21wZWcxMi92bXBlZzEyX211bHRpLmMKQEAgLTAsMCArMSwzOTQ1IEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL2FtcG9ydHMvdm1wZWcxMi5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorKi8KKworI2RlZmluZSBERUJVRworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC9jbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZnJhbWVfc3luYy9wdHNzZXJ2Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy9hbXN0cmVhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY2FudmFzL2NhbnZhcy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdmZtL3ZmcmFtZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdmZtL3ZmcmFtZV9wcm92aWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdmZtL3ZmcmFtZV9yZWNlaXZlci5oPgorLy8jaW5jbHVkZSA8bGludXgvYW1sb2dpYy90ZWUuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L3RlZS5oPgorCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy92ZGVjX3JlZy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvcmVnaXN0ZXJzL3JlZ2lzdGVyLmg+CisjaW5jbHVkZSAiLi4vLi4vLi4vc3RyZWFtX2lucHV0L2FtcG9ydHMvYW1wb3J0c19wcml2LmgiCisjaW5jbHVkZSAiLi4vLi4vLi4vY29tbW9uL2NoaXBzL2RlY29kZXJfY3B1X3Zlcl9pbmZvLmgiCisjaW5jbHVkZSAiLi4vLi4vZGVjb2Rlci91dGlscy92ZGVjX2lucHV0LmgiCisjaW5jbHVkZSAiLi4vLi4vZGVjb2Rlci91dGlscy92ZGVjLmgiCisjaW5jbHVkZSAiLi4vLi4vZGVjb2Rlci91dGlscy9hbXZkZWMuaCIKKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL2RlY29kZXJfbW11X2JveC5oIgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvZGVjb2Rlcl9ibW11X2JveC5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29kZWNfbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvbmZpZ3MuaD4KKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL2NvbmZpZ19wYXJzZXIuaCIKKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL2Zpcm13YXJlLmgiCisjaW5jbHVkZSAiLi4vLi4vZGVjb2Rlci91dGlscy92ZGVjX3Y0bDJfYnVmZmVyX29wcy5oIgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvY29uZmlnX3BhcnNlci5oIgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItbWVtMm1lbS5oPgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvdmRlY19mZWF0dXJlLmgiCisKKyNkZWZpbmUgTUVNX05BTUUgImNvZGVjX21tcGVnMTIiCisjZGVmaW5lIENIRUNLX0lOVEVSVkFMICAgICAgICAoSFovMTAwKQorCisjZGVmaW5lIERSSVZFUl9OQU1FICJhbW12ZGVjX21wZWcxMl92NGwiCisjZGVmaW5lIE1SRUdfUkVGMCAgICAgICAgQVZfU0NSQVRDSF8yCisjZGVmaW5lIE1SRUdfUkVGMSAgICAgICAgQVZfU0NSQVRDSF8zCisvKiBwcm90b2NvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTVJFR19TRVFfSU5GTyAgICAgICBBVl9TQ1JBVENIXzQKKyNkZWZpbmUgTVJFR19QSUNfSU5GTyAgICAgICBBVl9TQ1JBVENIXzUKKyNkZWZpbmUgTVJFR19QSUNfV0lEVEggICAgICBBVl9TQ1JBVENIXzYKKyNkZWZpbmUgTVJFR19QSUNfSEVJR0hUICAgICBBVl9TQ1JBVENIXzcKKyNkZWZpbmUgTVJFR19JTlBVVCAgICAgICAgICBBVl9TQ1JBVENIXzggIC8qaW5wdXRfdHlwZSovCisjZGVmaW5lIE1SRUdfQlVGRkVST1VUICAgICAgQVZfU0NSQVRDSF85ICAvKkZST01fQU1SSVNDX1JFRyovCisKKyNkZWZpbmUgTVJFR19DTUQgICAgICAgICAgICBBVl9TQ1JBVENIX0EKKyNkZWZpbmUgTVJFR19DT19NVl9TVEFSVCAgICBBVl9TQ1JBVENIX0IKKyNkZWZpbmUgTVJFR19FUlJPUl9DT1VOVCAgICBBVl9TQ1JBVENIX0MKKyNkZWZpbmUgTVJFR19GUkFNRV9PRkZTRVQgICBBVl9TQ1JBVENIX0QKKyNkZWZpbmUgTVJFR19XQUlUX0JVRkZFUiAgICBBVl9TQ1JBVENIX0UKKyNkZWZpbmUgTVJFR19GQVRBTF9FUlJPUiAgICBBVl9TQ1JBVENIX0YKKworI2RlZmluZSBNUkVHX0NDX0FERFIgICAgQVZfU0NSQVRDSF8wCisjZGVmaW5lIEFVWF9CVUZfQUxJR04oYWRyKSAoKGFkciArIDB4ZikgJiAofjB4ZikpCisKKyNkZWZpbmUgR0VUX1NMSUNFX1RZUEUodHlwZSkgICgiSVBCIyMiWygodHlwZSZQSUNJTkZPX1RZUEVfTUFTSyk+PjE2KSYweDNdKQorI2RlZmluZSBQSUNJTkZPX0VSUk9SICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgUElDSU5GT19UWVBFX01BU0sgICAweDAwMDMwMDAwCisjZGVmaW5lIFBJQ0lORk9fVFlQRV9JICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBQSUNJTkZPX1RZUEVfUCAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgUElDSU5GT19UWVBFX0IgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIFBJQ0lORk9fUFJPRyAgICAgICAgMHg4MDAwCisjZGVmaW5lIFBJQ0lORk9fUlBUX0ZJUlNUICAgMHg0MDAwCisjZGVmaW5lIFBJQ0lORk9fVE9QX0ZJUlNUICAgMHgyMDAwCisjZGVmaW5lIFBJQ0lORk9fRlJBTUUgICAgICAgMHgxMDAwCisjZGVmaW5lIFRPUF9GSUVMRCAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBCT1RUT01fRklFTEQgICAgICAgICAweDIwMDAKKyNkZWZpbmUgRlJBTUVfUElDVFVSRSAgICAgICAgMHgzMDAwCisjZGVmaW5lIEZSQU1FX1BJQ1RVUkVfTUFTSyAgIDB4MzAwMAorCisjZGVmaW5lIFNFUUlORk9fRVhUX0FWQUlMQUJMRSAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgU0VRSU5GT19QUk9HICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBDQ0JVRl9TSVpFICAgICAgKDUqMTAyNCkKKworI2RlZmluZSBWRl9QT09MX1NJWkUgICAgICAgIDY0CisjZGVmaW5lIERFQ09ERV9CVUZGRVJfTlVNX01BWCAxNgorI2RlZmluZSBERUNPREVfQlVGRkVSX05VTV9ERUYgOAorI2RlZmluZSBNQVhfQk1NVV9CVUZGRVJfTlVNIChERUNPREVfQlVGRkVSX05VTV9NQVggKyAxKQorCisjZGVmaW5lIFBVVF9JTlRFUlZBTCAgICAgICAgKEhaLzEwMCkKKyNkZWZpbmUgV09SS1NQQUNFX1NJWkUJCSg0KlNaXzY0SykgLypzd2FwJmNjYnVmJm1hdGlyeCZNViovCisjZGVmaW5lIENUWF9MTUVNX1NXQVBfT0ZGU0VUICAgIDAKKyNkZWZpbmUgQ1RYX0NDQlVGX09GRlNFVCAgICAgICAgMHg4MDAKKyNkZWZpbmUgQ1RYX1FVQU5UX01BVFJJWF9PRkZTRVQgKENUWF9DQ0JVRl9PRkZTRVQgKyA1KjEwMjQpCisjZGVmaW5lIENUWF9DT19NVl9PRkZTRVQgICAgICAgIChDVFhfUVVBTlRfTUFUUklYX09GRlNFVCArIDEqMTAyNCkKKyNkZWZpbmUgQ1RYX0RFQ0JVRl9PRkZTRVQgICAgICAgKENUWF9DT19NVl9PRkZTRVQgKyAweDExMDAwKQorCisjZGVmaW5lIERFRkFVTFRfTUVNX1NJWkUJKDMyKlNaXzFNKQorCisjZGVmaW5lIElOVkFMSURfSURYIAkJKC0xKSAgLyogSW52YWxpZCBidWZmZXIgaW5kZXguKi8KKworc3RhdGljIGludCBwcmVfZGVjb2RlX2J1Zl9sZXZlbCA9IDB4ODAwOworc3RhdGljIGludCBzdGFydF9kZWNvZGVfYnVmX2xldmVsID0gMHg0MDAwOworc3RhdGljIHUzMiBkZWNfY29udHJvbDsKK3N0YXRpYyB1MzIgZXJyb3JfZnJhbWVfc2tpcF9sZXZlbCA9IDE7CitzdGF0aWMgdTMyIHVkZWJ1Z19mbGFnOworc3RhdGljIHVuc2lnbmVkIGludCByYWRyOworc3RhdGljIHVuc2lnbmVkIGludCBydmFsOworCitzdGF0aWMgdTMyIHdpdGhvdXRfZGlzcGxheV9tb2RlOworc3RhdGljIHUzMiBkeW5hbWljX2J1Zl9udW1fbWFyZ2luID0gMjsKKworI2RlZmluZSBWTVBFRzEyX0RFVl9OVU0gICAgICAgIDkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X2RlY29kZV9pbnN0YW5jZV9udW0gPSBWTVBFRzEyX0RFVl9OVU07CitzdGF0aWMgdW5zaWduZWQgaW50IG1heF9wcm9jZXNzX3RpbWVbVk1QRUcxMl9ERVZfTlVNXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVjb2RlX3RpbWVvdXRfdmFsID0gMjAwOworI2RlZmluZSBJTkNQVFIocCkgcHRyX2F0b21pY193cmFwX2luYygmcCkKKworI2RlZmluZSBERUNfQ09OVFJPTF9GTEFHX0ZPUkNFXzI1MDBfNzIwXzU3Nl9JTlRFUkxBQ0UgIDB4MDAwMgorI2RlZmluZSBERUNfQ09OVFJPTF9GTEFHX0ZPUkNFXzMwMDBfNzA0XzQ4MF9JTlRFUkxBQ0UgIDB4MDAwNAorI2RlZmluZSBERUNfQ09OVFJPTF9GTEFHX0ZPUkNFXzI1MDBfNzA0XzU3Nl9JTlRFUkxBQ0UgIDB4MDAwOAorI2RlZmluZSBERUNfQ09OVFJPTF9GTEFHX0ZPUkNFXzI1MDBfNTQ0XzU3Nl9JTlRFUkxBQ0UgIDB4MDAxMAorI2RlZmluZSBERUNfQ09OVFJPTF9GTEFHX0ZPUkNFXzI1MDBfNDgwXzU3Nl9JTlRFUkxBQ0UgIDB4MDAyMAorI2RlZmluZSBERUNfQ09OVFJPTF9JTlRFUk5BTF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MGZmZgorI2RlZmluZSBERUNfQ09OVFJPTF9GTEFHX0ZPUkNFX1NFUV9JTlRFUkxBQ0UgICAgICAgICAgIDB4MTAwMAorCisjZGVmaW5lIElOVEVSTEFDRV9TRVFfQUxXQVlTCisKKyNpZiAxLyogTUVTT05fQ1BVX1RZUEUgPj0gTUVTT05fQ1BVX1RZUEVfTUVTT042ICovCisjZGVmaW5lIE5WMjEKKyNlbmRpZgorCisjZGVmaW5lIEFHQUlOX0hBU19USFJFU0hPTEQKKworI2lmZGVmIEFHQUlOX0hBU19USFJFU0hPTEQKK3N0YXRpYyB1MzIgYWdhaW5fdGhyZXNob2xkOworI2VuZGlmCisKKy8qCisjZGVmaW5lIERVTVBfVVNFUl9EQVRBCisqLworCitlbnVtIHsKKwlGUkFNRV9SRVBFQVRfVE9QLAorCUZSQU1FX1JFUEVBVF9CT1QsCisJRlJBTUVfUkVQRUFUX05PTkUKK307CisKKy8qU2VuZCBieSBBVl9TQ1JBVENIXzkqLworI2RlZmluZSBNUEVHMTJfUElDX0RPTkUgICAgIDEKKyNkZWZpbmUgTVBFRzEyX0RBVEFfRU1QVFkgICAyCisjZGVmaW5lIE1QRUcxMl9TRVFfRU5EICAgICAgMworI2RlZmluZSBNUEVHMTJfREFUQV9SRVFVRVNUIDQKKworLypTZW5kIGJ5IEFWX1NDUkFUQ0hfRyovCisjZGVmaW5lIE1QRUcxMl9WNEwyX0lORk9fTk9USUZZIDEKKy8qU2VuZCBieSBBVl9TQ1JBVENIX0oqLworI2RlZmluZSBNUEVHMTJfVVNFUkRBVEFfRE9ORSAweDgwMDAKKworI2RlZmluZSBERUNfUkVTVUxUX05PTkUgICAgIDAKKyNkZWZpbmUgREVDX1JFU1VMVF9ET05FICAgICAxCisjZGVmaW5lIERFQ19SRVNVTFRfQUdBSU4gICAgMgorI2RlZmluZSBERUNfUkVTVUxUX0VSUk9SICAgIDMKKyNkZWZpbmUgREVDX1JFU1VMVF9GT1JDRV9FWElUIDQKKyNkZWZpbmUgREVDX1JFU1VMVF9FT1MgNQorI2RlZmluZSBERUNfUkVTVUxUX0dFVF9EQVRBICAgICAgICAgNgorI2RlZmluZSBERUNfUkVTVUxUX0dFVF9EQVRBX1JFVFJZICAgNworCisjZGVmaW5lIERFQ19ERUNPREVfVElNRU9VVCAgICAgICAgIDB4MjEKKyNkZWZpbmUgREVDT0RFX0lEKGh3KSAoaHdfdG9fdmRlYyhodyktPmlkKQorI2RlZmluZSBERUNPREVfU1RPUF9QT1MgICAgICAgICBBVl9TQ1JBVENIX0sKKworc3RydWN0IG1tcGVnMl91c2VyZGF0YV9yZWNvcmRfdCB7CisJc3RydWN0IHVzZXJkYXRhX21ldGFfaW5mb190IG1ldGFfaW5mbzsKKwl1MzIgcmVjX3N0YXJ0OworCXUzMiByZWNfbGVuOworfTsKKworI2RlZmluZSBVU0VSREFUQV9GSUZPX05VTSAgICAyNTYKKyNkZWZpbmUgTUFYX0ZSRUVfVVNFUkRBVEFfTk9ERVMJCTUKKworc3RydWN0IG1tcGVnMl91c2VyZGF0YV9pbmZvX3QgeworCXN0cnVjdCBtbXBlZzJfdXNlcmRhdGFfcmVjb3JkX3QgcmVjb3Jkc1tVU0VSREFUQV9GSUZPX05VTV07CisJdTggKmRhdGFfYnVmOworCXU4ICpkYXRhX2J1Zl9lbmQ7CisJdTMyIGJ1Zl9sZW47CisJdTMyIHJlYWRfaW5kZXg7CisJdTMyIHdyaXRlX2luZGV4OworCXUzMiBsYXN0X3dwOworfTsKKyNkZWZpbmUgTUFYX1VEX1JFQ09SRFMJNQorCitzdHJ1Y3QgcGljX2luZm9fdCB7CisJdTMyIGJ1ZmZlcl9pbmZvOworCXUzMiBpbmRleDsKKwl1MzIgb2Zmc2V0OworCXUzMiB3aWR0aDsKKwl1MzIgaGVpZ2h0OworCXUzMiBwdHM7CisJdTY0IHB0czY0OworCWJvb2wgcHRzX3ZhbGlkOworCXVsb25nIHY0bF9yZWZfYnVmX2FkZHI7CisJdTMyIGh3X2RlY29kZV90aW1lOworCXUzMiBmcmFtZV9zaXplOyAvLyBGb3IgZnJhbWUgYmFzZSBtb2RlCisJdTY0IHRpbWVzdGFtcDsKKwl1NjQgbGFzdF90aW1lc3RhbXA7Cit9OworCitzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyB7CisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRmb3JtX2RldjsKKwlERUNMQVJFX0tGSUZPKG5ld2ZyYW1lX3EsIHN0cnVjdCB2ZnJhbWVfcyAqLCBWRl9QT09MX1NJWkUpOworCURFQ0xBUkVfS0ZJRk8oZGlzcGxheV9xLCBzdHJ1Y3QgdmZyYW1lX3MgKiwgVkZfUE9PTF9TSVpFKTsKKwlzdHJ1Y3QgdmZyYW1lX3MgdmZwb29sW1ZGX1BPT0xfU0laRV07CisJc3RydWN0IHZmcmFtZV9zIHZmcmFtZV9kdW1teTsKKwlzMzIgdmZidWZfdXNlW0RFQ09ERV9CVUZGRVJfTlVNX01BWF07CisJczMyIHJlZl91c2VbREVDT0RFX0JVRkZFUl9OVU1fTUFYXTsKKwl1MzIgZnJhbWVfd2lkdGg7CisJdTMyIGZyYW1lX2hlaWdodDsKKwl1MzIgZnJhbWVfZHVyOworCXUzMiBmcmFtZV9wcm9nOworCXUzMiBzZXFpbmZvOworCXUzMiBjdHhfdmFsaWQ7CisJdTMyIGRlY19jb250cm9sOworCXZvaWQgKm1tX2Jsa19oYW5kbGU7CisJc3RydWN0IHZmcmFtZV9jaHVua19zICpjaHVuazsKKwl1MzIgc3RhdDsKKwl1OCBpbml0X2ZsYWc7CisJdW5zaWduZWQgbG9uZyBidWZfc3RhcnQ7CisJdTMyIGJ1Zl9zaXplOworCXUzMiByZWdfcGljX3dpZHRoOworCXUzMiByZWdfcGljX2hlaWdodDsKKwl1MzIgcmVnX21wZWcxXzJfcmVnOworCXUzMiByZWdfcGljX2hlYWRfaW5mbzsKKwl1MzIgcmVnX2ZfY29kZV9yZWc7CisJdTMyIHJlZ19zbGljZV92ZXJfcG9zX3BpY190eXBlOworCXUzMiByZWdfdmNvcF9jdHJsX3JlZzsKKwl1MzIgcmVnX21iX2luZm87CisJdTMyIHJlZ19zaWduYWxfdHlwZTsKKwl1MzIgZGVjX251bTsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBjaGVja190aW1lcjsKKwl1MzIgZGVjb2RlX3RpbWVvdXRfY291bnQ7CisJdW5zaWduZWQgbG9uZyBpbnQgc3RhcnRfcHJvY2Vzc190aW1lOworCXUzMiBsYXN0X3ZsZF9sZXZlbDsKKwl1MzIgZW9zOworCisJc3RydWN0IHBpY19pbmZvX3QgcGljc1tERUNPREVfQlVGRkVSX05VTV9NQVhdOworCXUzMiBjYW52YXNfc3BlY1tERUNPREVfQlVGRkVSX05VTV9NQVhdOworCXU2NCBsYXN0cHRzNjQ7CisJdTMyIGxhc3RfY2h1bmtfcHRzOworCXN0cnVjdCBjYW52YXNfY29uZmlnX3MgY2FudmFzX2NvbmZpZ1tERUNPREVfQlVGRkVSX05VTV9NQVhdWzJdOworCXN0cnVjdCBkZWNfc3lzaW5mbyB2bXBlZzEyX2Ftc3RyZWFtX2RlY19pbmZvOworCisJczMyIHJlZnNbMl07CisJaW50IGRlY19yZXN1bHQ7CisJdTMyIHRpbWVvdXRfcHJvY2Vzc2luZzsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdGltZW91dF93b3JrOworCXN0cnVjdCB3b3JrX3N0cnVjdCBub3RpZnlfd29yazsKKwl2b2lkICgqdmRlY19jYikoc3RydWN0IHZkZWNfcyAqLCB2b2lkICopOworCXZvaWQgKnZkZWNfY2JfYXJnOworCWRtYV9hZGRyX3QgY2NidWZfcGh5QWRkcmVzczsKKwl2b2lkICpjY2J1Zl9waHlBZGRyZXNzX3ZpcnQ7CisJdTMyIGNjX2J1Zl9zaXplOworCXVuc2lnbmVkIGxvbmcgY2NidWZfcGh5QWRkcmVzc19pc19yZW1hcGVkX25vY2FjaGU7CisJdTMyIGZyYW1lX3JwdF9zdGF0ZTsKKy8qIGZvciBlcnJvciBoYW5kbGluZyAqLworCXMzMiBmcmFtZV9mb3JjZV9za2lwX2ZsYWc7CisJczMyIGVycm9yX2ZyYW1lX3NraXBfbGV2ZWw7CisJczMyIHdhaXRfYnVmZmVyX2NvdW50ZXI7CisJdTMyIGZpcnN0X2lfZnJhbWVfcmVhZHk7CisJdTMyIHJ1bl9jb3VudDsKKwl1MzIJbm90X3J1bl9yZWFkeTsKKwl1MzIJaW5wdXRfZW1wdHk7CisJYXRvbWljX3QgZGlzcF9udW07CisJYXRvbWljX3QgcHV0X251bTsKKwlhdG9taWNfdCBwZWVrX251bTsKKwlhdG9taWNfdCBnZXRfbnVtOworCXUzMiBkcm9wX2ZyYW1lX2NvdW50OworCXUzMiBidWZmZXJfbm90X3JlYWR5OworCXUzMiByYXRpb19jb250cm9sOworCWludCBmcmFtZWluZm9fZW5hYmxlOworCXN0cnVjdCBmaXJtd2FyZV9zICpmdzsKKwl1MzIgY2FudmFzX21vZGU7CisjaWZkZWYgQUdBSU5fSEFTX1RIUkVTSE9MRAorCXUzMiBwcmVfcGFyc2VyX3dyX3B0cjsKKwl1OCBuZXh0X2FnYWluX2ZsYWc7CisjZW5kaWYKKworCXN0cnVjdCB3b3JrX3N0cnVjdCB1c2VyZGF0YV9wdXNoX3dvcms7CisJc3RydWN0IG11dGV4IHVzZXJkYXRhX211dGV4OworCXN0cnVjdCBtbXBlZzJfdXNlcmRhdGFfaW5mb190IHVzZXJkYXRhX2luZm87CisJc3RydWN0IG1tcGVnMl91c2VyZGF0YV9yZWNvcmRfdCB1ZF9yZWNvcmRbTUFYX1VEX1JFQ09SRFNdOworCWludCBjdXJfdWRfaWR4OworCXU4ICp1c2VyX2RhdGFfYnVmZmVyOworCWludCB3YWl0X2Zvcl91ZHJfc2VuZDsKKwl1MzIgdWNvZGVfY2NfbGFzdF93cDsKKwl1MzIgbm90aWZ5X3Vjb2RlX2NjX2xhc3Rfd3A7CisJdTMyIG5vdGlmeV9kYXRhX2NjX2xhc3Rfd3A7CisJdTMyIHVzZXJkYXRhX3dwX2N0eDsKKyNpZmRlZiBEVU1QX1VTRVJfREFUQQorI2RlZmluZSBNQVhfVVNFUl9EQVRBX1NJWkUJCTE1NzI4NjQKKwl2b2lkICp1c2VyX2RhdGFfZHVtcF9idWY7CisJdW5zaWduZWQgY2hhciAqcGR1bXBfYnVmX2N1cl9zdGFydDsKKwlpbnQgdG90YWxfbGVuOworCWludCBic2tpcDsKKwlpbnQgbl91c2VyZGF0YV9pZDsKKwl1MzIgcmVmZXJlbmNlW01BWF9VRF9SRUNPUkRTXTsKKyNlbmRpZgorCWludCB0dnBfZmxhZzsKKwlib29sIGlzX3VzZWRfdjRsOworCXZvaWQgKnY0bDJfY3R4OworCWJvb2wgdjRsX3BhcmFtc19wYXJzZWQ7CisJdTMyIGJ1Zl9udW07CisJdTMyIGR5bmFtaWNfYnVmX251bV9tYXJnaW47CisJc3RydWN0IHZkZWNfaW5mbyBndnM7CisJc3RydWN0IHZmcmFtZV9xb3NfcyB2ZnJhbWVfcW9zOworCXUzMiByZXNfY2hfZmxhZzsKKwl1MzIgaV9vbmx5OworCXUzMiBrcGlfZmlyc3RfaV9jb21taW5nOworCXUzMiBrcGlfZmlyc3RfaV9kZWNvZGVkOworCWludCBzaWRlYmluZF90eXBlOworCWludCBzaWRlYmluZF9jaGFubmVsX2lkOworCXUzMiBwcm9maWxlX2lkYzsKKwl1MzIgbGV2ZWxfaWRjOworCWludCBkZWNfYWdhaW5fY250OworCWludCB2ZGVjX3BnX2VuYWJsZV9mbGFnOworCXVsb25nIGZiX3Rva2VuOworCWJvb2wgZm9yY2VfcHJvZ19vbmx5OworCWNoYXIgdmRlY19uYW1lWzMyXTsKKwljaGFyIHB0c19uYW1lWzMyXTsKKwljaGFyIG5ld19xX25hbWVbMzJdOworCWNoYXIgZGlzcF9xX25hbWVbMzJdOworCXUzMiBjaHVua19oZWFkZXJfb2Zmc2V0OworCXUzMiBjaHVua19yZXNfc2l6ZTsKKwl1NjQgZmlyc3RfZmllbGRfdGltZXN0YW1wOworCXU2NCBmaXJzdF9maWVsZF90aW1lc3RhbXBfdmFsaWQ7CisJdTMyIHJlcG9ydF9maWVsZDsKK307CitzdGF0aWMgdm9pZCB2bXBlZzEyX2xvY2FsX2luaXQoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3KTsKK3N0YXRpYyBpbnQgdm1wZWcxMl9od19jdHhfcmVzdG9yZShzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcpOworc3RhdGljIHZvaWQgcmVzZXRfcHJvY2Vzc190aW1lKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodyk7CitzdGF0aWMgdm9pZCB2bXBlZzEyX3dvcmtzcGFjZV9pbml0KHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodyk7CitzdGF0aWMgdm9pZCBmbHVzaF9vdXRwdXQoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3KTsKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZtcGVnX3ZmX3BlZWsodm9pZCAqKTsKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZtcGVnX3ZmX2dldCh2b2lkICopOworc3RhdGljIHZvaWQgdm1wZWdfdmZfcHV0KHN0cnVjdCB2ZnJhbWVfcyAqLCB2b2lkICopOworc3RhdGljIGludCB2bXBlZ192Zl9zdGF0ZXMoc3RydWN0IHZmcmFtZV9zdGF0ZXMgKnN0YXRlcywgdm9pZCAqKTsKK3N0YXRpYyBpbnQgdm1wZWdfZXZlbnRfY2IoaW50IHR5cGUsIHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGVfZGF0YSk7CitzdGF0aWMgaW50IG5vdGlmeV92NGxfZW9zKHN0cnVjdCB2ZGVjX3MgKnZkZWMpOworc3RhdGljIHZvaWQgc3RhcnRfcHJvY2Vzc190aW1lX3NldChzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcpOworc3RhdGljIGludCBkZWJ1Z19lbmFibGU7CisvKnN0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3QgdXNlcmRhdGFfcHVzaF93b3JrOyovCisjdW5kZWYgcHJfaW5mbworI2RlZmluZSBwcl9pbmZvIHByaW50awordW5zaWduZWQgaW50IG1wZWcxMl9kZWJ1Z19tYXNrID0gMHhmZjsKKy8qc3RhdGljIGludCBjb3VudGVyX21heCA9IDU7Ki8KK3N0YXRpYyB1MzIgcnVuX3JlYWR5X21pbl9idWZfbnVtID0gMjsKK3N0YXRpYyBpbnQgZGlydHlfYWdhaW5fdGhyZXNob2xkID0gMTAwOworc3RhdGljIGludCBlcnJvcl9wcm9jX3BvbGljeSA9IDB4MTsKKworI2RlZmluZSBQUklOVF9GTEFHX0VSUk9SICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgUFJJTlRfRkxBR19SVU5fRkxPVyAgICAgICAgICAgMFgwMDAxCisjZGVmaW5lIFBSSU5UX0ZMQUdfVElNRUlORk8gICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBQUklOVF9GTEFHX1VDT0RFX0RFVEFJTAkJICAweDAwMDQKKyNkZWZpbmUgUFJJTlRfRkxBR19WTERfREVUQUlMICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCAgICAgICAgIDB4MDAxMAorI2RlZmluZSBQUklOVF9GTEFHX0JVRkZFUl9ERVRBSUwgICAgICAweDAwMjAKKyNkZWZpbmUgUFJJTlRfRkxBR19SRVNUT1JFICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFBSSU5UX0ZSQU1FX05VTSAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBQUklOVF9GTEFHX0ZPUkNFX0RPTkUgICAgICAgICAweDAxMDAKKyNkZWZpbmUgUFJJTlRfRkxBR19DT1VOVEVSICAgICAgICAgICAgMFgwMjAwCisjZGVmaW5lIFBSSU5UX0ZSQU1FQkFTRV9EQVRBICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBQUklOVF9GTEFHX1ZERUNfU1RBVFVTICAgICAgICAweDA4MDAKKyNkZWZpbmUgUFJJTlRfRkxBR19QQVJBX0RBVEEgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFBSSU5UX0ZMQUdfVVNFUkRBVEFfREVUQUlMICAgIDB4MjAwMAorI2RlZmluZSBQUklOVF9GTEFHX1RJTUVPVVRfU1RBVFVTICAgICAweDQwMDAKKyNkZWZpbmUgUFJJTlRfRkxBR19WNExfREVUQUlMICAgICAgICAgMHg4MDAwCisjZGVmaW5lIElHTk9SRV9QQVJBTV9GUk9NX0NPTkZJRyAgICAgIDB4ODAwMDAwMAorCisKKworaW50IGRlYnVnX3ByaW50KGludCBpbmRleCwgaW50IGRlYnVnX2ZsYWcsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCWlmICgoKGRlYnVnX2VuYWJsZSAmIGRlYnVnX2ZsYWcpICYmCisJCSgoMSA8PCBpbmRleCkgJiBtcGVnMTJfZGVidWdfbWFzaykpCisJCXx8IChkZWJ1Z19mbGFnID09IFBSSU5UX0ZMQUdfRVJST1IpKSB7CisJCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IGt6YWxsb2MoNTEyLCBHRlBfQVRPTUlDKTsKKwkJaW50IGxlbiA9IDA7CisJCXZhX2xpc3QgYXJnczsKKworCQlpZiAoIWJ1ZikKKwkJCXJldHVybiAwOworCisJCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJCWxlbiA9IHNwcmludGYoYnVmLCAiJWQ6ICIsIGluZGV4KTsKKwkJdnNucHJpbnRmKGJ1ZiArIGxlbiwgNTEyLWxlbiwgZm10LCBhcmdzKTsKKwkJcHJfaW5mbygiJXMiLCBidWYpOworCQl2YV9lbmQoYXJncyk7CisJCWtmcmVlKGJ1Zik7CisJfQorCXJldHVybiAwOworfQorCisKKy8qc3RhdGljIGJvb2wgaXNfcmVzZXQ7Ki8KKyNkZWZpbmUgUFJPVklERVJfTkFNRSAgICJ2ZGVjLm1wZWcxMiIKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmZyYW1lX29wZXJhdGlvbnNfcyB2Zl9wcm92aWRlcl9vcHMgPSB7CisJLnBlZWsgPSB2bXBlZ192Zl9wZWVrLAorCS5nZXQgPSB2bXBlZ192Zl9nZXQsCisJLnB1dCA9IHZtcGVnX3ZmX3B1dCwKKwkuZXZlbnRfY2IgPSB2bXBlZ19ldmVudF9jYiwKKwkudmZfc3RhdGVzID0gdm1wZWdfdmZfc3RhdGVzLAorfTsKKworCitzdGF0aWMgY29uc3QgdTMyIGZyYW1lX3JhdGVfdGFiWzE2XSA9IHsKKwk5NjAwMCAvIDMwLCA5NjAwMDAwMCAvIDIzOTc2LCA5NjAwMCAvIDI0LCA5NjAwMCAvIDI1LAorCTk2MDAwMDAgLyAyOTk3LCA5NjAwMCAvIDMwLCA5NjAwMCAvIDUwLCA5NjAwMDAwIC8gNTk5NCwKKwk5NjAwMCAvIDYwLAorCS8qID4gOCByZXNlcnZlZCwgdXNlIDI0ICovCisJOTYwMDAgLyAyNCwgOTYwMDAgLyAyNCwgOTYwMDAgLyAyNCwgOTYwMDAgLyAyNCwKKwk5NjAwMCAvIDI0LCA5NjAwMCAvIDI0LCA5NjAwMCAvIDI0Cit9OworCitzdGF0aWMgdm9pZCBtcGVnMTJfcHV0X3ZpZGVvX2ZyYW1lKHZvaWQgKnZkZWNfY3R4LCBzdHJ1Y3QgdmZyYW1lX3MgKnZmKQoreworCXZtcGVnX3ZmX3B1dCh2ZiwgdmRlY19jdHgpOworfQorCitzdGF0aWMgdm9pZCBtcGVnMTJfZ2V0X3ZpZGVvX2ZyYW1lKHZvaWQgKnZkZWNfY3R4LCBzdHJ1Y3QgdmZyYW1lX3MgKip2ZikKK3sKKwkqdmYgPSB2bXBlZ192Zl9nZXQodmRlY19jdHgpOworfQorCitzdGF0aWMgc3RydWN0IHRhc2tfb3BzX3MgdGFza19kZWNfb3BzID0geworCS50eXBlCQk9IFRBU0tfVFlQRV9ERUMsCisJLmdldF92ZnJhbWUJPSBtcGVnMTJfZ2V0X3ZpZGVvX2ZyYW1lLAorCS5wdXRfdmZyYW1lCT0gbXBlZzEyX3B1dF92aWRlb19mcmFtZSwKK307CisKK3N0YXRpYyBpbnQgdm1wZWcxMl92NGxfYWxsb2NfYnVmZl9jb25maWdfY2FudmFzKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodywgaW50IGkpCit7CisJaW50IHJldDsKKwl1MzIgY2FudmFzOworCXVsb25nIGRlY2J1Zl9zdGFydCA9IDAsIGRlY2J1Zl91dl9zdGFydCA9IDA7CisJaW50IGRlY2J1Zl95X3NpemUgPSAwLCBkZWNidWZfdXZfc2l6ZSA9IDA7CisJdTMyIGNhbnZhc193aWR0aCA9IDAsIGNhbnZhc19oZWlnaHQgPSAwOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGh3KTsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPSBOVUxMOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShody0+djRsMl9jdHgpOworCisJaWYgKGh3LT5waWNzW2ldLnY0bF9yZWZfYnVmX2FkZHIpIHsKKwkJc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKmZiID0KKwkJCShzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqKQorCQkJaHctPnBpY3NbaV0udjRsX3JlZl9idWZfYWRkcjsKKworCQlmYi0+c3RhdHVzID0gRkJfU1RfREVDT0RFUjsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gY3R4LT5mYl9vcHMuYWxsb2MoJmN0eC0+ZmJfb3BzLCBody0+ZmJfdG9rZW4sICZmYiwgQU1MX0ZCX1JFUV9ERUMpOworCWlmIChyZXQgPCAwKSB7CisJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkiWyVkXSBnZXQgZmIgZmFpbCAlZC8lZC5cbiIsCisJCQljdHgtPmlkLCBpLCBody0+YnVmX251bSk7CisJCXJldHVybiByZXQ7CisJfQorCisJZmItPnRhc2stPmF0dGFjaChmYi0+dGFzaywgJnRhc2tfZGVjX29wcywgaHdfdG9fdmRlYyhodykpOworCWZiLT5zdGF0dXMgPSBGQl9TVF9ERUNPREVSOworCisJaWYgKCFody0+ZnJhbWVfd2lkdGggfHwgIWh3LT5mcmFtZV9oZWlnaHQpIHsKKwkJc3RydWN0IHZkZWNfcGljX2luZm8gcGljOworCQl2ZGVjX3Y0bF9nZXRfcGljX2luZm8oY3R4LCAmcGljKTsKKwkJaHctPmZyYW1lX3dpZHRoID0gcGljLnZpc2libGVfd2lkdGg7CisJCWh3LT5mcmFtZV9oZWlnaHQgPSBwaWMudmlzaWJsZV9oZWlnaHQ7CisJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkiWyVkXSBzZXQgJWQgeCAlZCBmcm9tIElGIGxheWVyXG4iLCBjdHgtPmlkLAorCQkJaHctPmZyYW1lX3dpZHRoLCBody0+ZnJhbWVfaGVpZ2h0KTsKKwl9CisKKwlody0+cGljc1tpXS52NGxfcmVmX2J1Zl9hZGRyID0gKHVsb25nKWZiOworCWlmIChmYi0+bnVtX3BsYW5lcyA9PSAxKSB7CisJCWRlY2J1Zl9zdGFydAk9IGZiLT5tLm1lbVswXS5hZGRyOworCQlkZWNidWZfeV9zaXplCT0gZmItPm0ubWVtWzBdLm9mZnNldDsKKwkJZGVjYnVmX3V2X3N0YXJ0CT0gZGVjYnVmX3N0YXJ0ICsgZGVjYnVmX3lfc2l6ZTsKKwkJZGVjYnVmX3V2X3NpemUJPSBkZWNidWZfeV9zaXplIC8gMjsKKwkJY2FudmFzX3dpZHRoCT0gQUxJR04oaHctPmZyYW1lX3dpZHRoLCA2NCk7CisJCWNhbnZhc19oZWlnaHQJPSBBTElHTihody0+ZnJhbWVfaGVpZ2h0LCA2NCk7CisJCWZiLT5tLm1lbVswXS5ieXRlc191c2VkID0gZmItPm0ubWVtWzBdLnNpemU7CisJfSBlbHNlIGlmIChmYi0+bnVtX3BsYW5lcyA9PSAyKSB7CisJCWRlY2J1Zl9zdGFydAk9IGZiLT5tLm1lbVswXS5hZGRyOworCQlkZWNidWZfeV9zaXplCT0gZmItPm0ubWVtWzBdLnNpemU7CisJCWRlY2J1Zl91dl9zdGFydAk9IGZiLT5tLm1lbVsxXS5hZGRyOworCQlkZWNidWZfdXZfc2l6ZQk9IGZiLT5tLm1lbVsxXS5zaXplOworCQljYW52YXNfd2lkdGgJPSBBTElHTihody0+ZnJhbWVfd2lkdGgsIDY0KTsKKwkJY2FudmFzX2hlaWdodAk9IEFMSUdOKGh3LT5mcmFtZV9oZWlnaHQsIDY0KTsKKwkJZmItPm0ubWVtWzBdLmJ5dGVzX3VzZWQgPSBkZWNidWZfeV9zaXplOworCQlmYi0+bS5tZW1bMV0uYnl0ZXNfdXNlZCA9IGRlY2J1Zl91dl9zaXplOworCX0KKworCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVjRMX0RFVEFJTCwKKwkJIlslZF0gJXMoKSwgdjRsIHJlZiBidWYgYWRkcjogMHgleFxuIiwKKwkJY3R4LT5pZCwgX19mdW5jX18sIGZiKTsKKworCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQl1MzIgdG1wOworCQlpZiAoY2FudmFzX3UoaHctPmNhbnZhc19zcGVjW2ldKSA9PSAweGZmKSB7CisJCQl0bXAgPSB2ZGVjLT5nZXRfY2FudmFzX2V4KENPUkVfTUFTS19WREVDXzEsIHZkZWMtPmlkKTsKKwkJCWh3LT5jYW52YXNfc3BlY1tpXSAmPSB+KDB4ZmZmZiA8PCA4KTsKKwkJCWh3LT5jYW52YXNfc3BlY1tpXSB8PSB0bXAgPDwgODsKKwkJCWh3LT5jYW52YXNfc3BlY1tpXSB8PSB0bXAgPDwgMTY7CisJCX0KKwkJaWYgKGNhbnZhc195KGh3LT5jYW52YXNfc3BlY1tpXSkgPT0gMHhmZikgeworCQkJdG1wID0gdmRlYy0+Z2V0X2NhbnZhc19leChDT1JFX01BU0tfVkRFQ18xLCB2ZGVjLT5pZCk7CisJCQlody0+Y2FudmFzX3NwZWNbaV0gJj0gfjB4ZmY7CisJCQlody0+Y2FudmFzX3NwZWNbaV0gfD0gdG1wOworCQl9CisJCWNhbnZhcyA9IGh3LT5jYW52YXNfc3BlY1tpXTsKKwl9IGVsc2UgeworCQljYW52YXMgPSB2ZGVjLT5nZXRfY2FudmFzKGksIDIpOworCQlody0+Y2FudmFzX3NwZWNbaV0gPSBjYW52YXM7CisJfQorCisJaHctPmNhbnZhc19jb25maWdbaV1bMF0ucGh5X2FkZHIJPSBkZWNidWZfc3RhcnQ7CisJaHctPmNhbnZhc19jb25maWdbaV1bMF0ud2lkdGgJCT0gY2FudmFzX3dpZHRoOworCWh3LT5jYW52YXNfY29uZmlnW2ldWzBdLmhlaWdodAkJPSBjYW52YXNfaGVpZ2h0OworCWh3LT5jYW52YXNfY29uZmlnW2ldWzBdLmJsb2NrX21vZGUJPSBody0+Y2FudmFzX21vZGU7CisJaHctPmNhbnZhc19jb25maWdbaV1bMF0uZW5kaWFuCQk9CisJCShody0+Y2FudmFzX21vZGUgPT0gQ0FOVkFTX0JMS01PREVfTElORUFSKSA/IDcgOiAwOworCWNvbmZpZ19jYXZfbHV0KGNhbnZhc195KGNhbnZhcyksICZody0+Y2FudmFzX2NvbmZpZ1tpXVswXSwgVkRFQ18xKTsKKworCWh3LT5jYW52YXNfY29uZmlnW2ldWzFdLnBoeV9hZGRyCT0gZGVjYnVmX3V2X3N0YXJ0OworCWh3LT5jYW52YXNfY29uZmlnW2ldWzFdLndpZHRoCQk9IGNhbnZhc193aWR0aDsKKwlody0+Y2FudmFzX2NvbmZpZ1tpXVsxXS5oZWlnaHQJCT0gY2FudmFzX2hlaWdodCAvIDI7CisJaHctPmNhbnZhc19jb25maWdbaV1bMV0uYmxvY2tfbW9kZQk9IGh3LT5jYW52YXNfbW9kZTsKKwlody0+Y2FudmFzX2NvbmZpZ1tpXVsxXS5lbmRpYW4JCT0KKwkJKGh3LT5jYW52YXNfbW9kZSA9PSBDQU5WQVNfQkxLTU9ERV9MSU5FQVIpID8gNyA6IDA7CisJY29uZmlnX2Nhdl9sdXQoY2FudmFzX3UoY2FudmFzKSwgJmh3LT5jYW52YXNfY29uZmlnW2ldWzFdLCBWREVDXzEpOworCisJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19CVUZGRVJfREVUQUlMLAorCQkiWyVkXSAlcygpLCBjYW52YXM6IDB4JXggbW9kZTogJWQgeTogJXggdXY6ICV4IHc6ICVkIGg6ICVkXG4iLAorCQljdHgtPmlkLCBfX2Z1bmNfXywgY2FudmFzLCBody0+Y2FudmFzX21vZGUsCisJCWRlY2J1Zl9zdGFydCwgZGVjYnVmX3V2X3N0YXJ0LAorCQljYW52YXNfd2lkdGgsIGNhbnZhc19oZWlnaHQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9mcmVlX2J1ZmZlcihzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaHctPmJ1Zl9udW07IGkrKykgeworCQlpZiAoKGh3LT52ZmJ1Zl91c2VbaV0gPT0gMCkgJiYKKwkJCShody0+cmVmX3VzZVtpXSA9PSAwKSkKKwkJCWJyZWFrOworCX0KKworCWlmICgoaSA9PSBody0+YnVmX251bSkgJiYKKwkJKGh3LT5idWZfbnVtICE9IDApKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAodm1wZWcxMl92NGxfYWxsb2NfYnVmZl9jb25maWdfY2FudmFzKGh3LCBpKSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB1MzIgc3BlY190b19pbmRleChzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcsIHUzMiBzcGVjKQoreworCXUzMiBpOworCisJZm9yIChpID0gMDsgaSA8IGh3LT5idWZfbnVtOyBpKyspIHsKKwkJaWYgKGh3LT5jYW52YXNfc3BlY1tpXSA9PSBzcGVjKQorCQkJcmV0dXJuIGk7CisJfQorCisJcmV0dXJuIGh3LT5idWZfbnVtOworfQorCisvKiArW1NFXVtCVUctMTQ1MzQzXVtodWFuZ2hhbmddIGZpeGVkOm1wZWcyIGZyYW1lIHFvcyBpbmZvIG5vdGlmeSAqLworc3RhdGljIHZvaWQgZmlsbF9mcmFtZV9pbmZvKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodywgdTMyIHNsaWNlX3R5cGUsCisJCQkJCQkJaW50IGZyYW1lX3NpemUsIHUzMiBwdHMpCit7CisJdW5zaWduZWQgY2hhciBhWzNdOworCXVuc2lnbmVkIGNoYXIgaSwgaiwgdDsKKwl1bnNpZ25lZCBsb25nICBkYXRhOworCXN0cnVjdCB2ZnJhbWVfcW9zX3MgKnZmcmFtZV9xb3MgPSAmaHctPnZmcmFtZV9xb3M7CisKKwl2ZnJhbWVfcW9zLT50eXBlID0gKChzbGljZV90eXBlICYgUElDSU5GT19UWVBFX01BU0spID09CisJCQkJCQlQSUNJTkZPX1RZUEVfSSkgPyAxIDoKKwkJCQkJCSgoc2xpY2VfdHlwZSAmCisJCQkJCQlQSUNJTkZPX1RZUEVfTUFTSykgPT0KKwkJCQkJCVBJQ0lORk9fVFlQRV9QKSA/IDIgOiAzOworCXZmcmFtZV9xb3MtPnNpemUgPSBmcmFtZV9zaXplOworCXZmcmFtZV9xb3MtPnB0cyA9IHB0czsKKworCWdldF9yYW5kb21fYnl0ZXMoJmRhdGEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJaWYgKHZmcmFtZV9xb3MtPnR5cGUgPT0gMSkKKwkJZGF0YSA9IDA7CisJYVswXSA9IGRhdGEgJiAweGZmOworCWFbMV0gPSAoZGF0YSA+PiA4KSAmIDB4ZmY7CisJYVsyXSA9IChkYXRhID4+IDE2KSAmIDB4ZmY7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCWZvciAoaiA9IGkrMTsgaiA8IDM7IGorKykgeworCQkJaWYgKGFbal0gPCBhW2ldKSB7CisJCQkJdCA9IGFbal07CisJCQkJYVtqXSA9IGFbaV07CisJCQkJYVtpXSA9IHQ7CisJCQl9IGVsc2UgaWYgKGFbal0gPT0gYVtpXSkgeworCQkJCWFbaV0rKzsKKwkJCQl0ID0gYVtqXTsKKwkJCQlhW2pdID0gYVtpXTsKKwkJCQlhW2ldID0gdDsKKwkJCX0KKwkJfQorCX0KKwl2ZnJhbWVfcW9zLT5tYXhfbXYgPSBhWzJdOworCXZmcmFtZV9xb3MtPmF2Z19tdiA9IGFbMV07CisJdmZyYW1lX3Fvcy0+bWluX212ID0gYVswXTsKKworCWdldF9yYW5kb21fYnl0ZXMoJmRhdGEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJYVswXSA9IGRhdGEgJiAweDFmOworCWFbMV0gPSAoZGF0YSA+PiA4KSAmIDB4M2Y7CisJYVsyXSA9IChkYXRhID4+IDE2KSAmIDB4N2Y7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCWZvciAoaiA9IGkrMTsgaiA8IDM7IGorKykgeworCQkJaWYgKGFbal0gPCBhW2ldKSB7CisJCQkJdCA9IGFbal07CisJCQkJYVtqXSA9IGFbaV07CisJCQkJYVtpXSA9IHQ7CisJCQl9IGVsc2UgaWYgKGFbal0gPT0gYVtpXSkgeworCQkJCWFbaV0rKzsKKwkJCQl0ID0gYVtqXTsKKwkJCQlhW2pdID0gYVtpXTsKKwkJCQlhW2ldID0gdDsKKwkJCX0KKwkJfQorCX0KKwl2ZnJhbWVfcW9zLT5tYXhfcXAgPSBhWzJdOworCXZmcmFtZV9xb3MtPmF2Z19xcCA9IGFbMV07CisJdmZyYW1lX3Fvcy0+bWluX3FwID0gYVswXTsKKworCWdldF9yYW5kb21fYnl0ZXMoJmRhdGEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJYVswXSA9IGRhdGEgJiAweDFmOworCWFbMV0gPSAoZGF0YSA+PiA4KSAmIDB4M2Y7CisJYVsyXSA9IChkYXRhID4+IDE2KSAmIDB4N2Y7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCWZvciAoaiA9IGkgKyAxOyBqIDwgMzsgaisrKSB7CisJCQlpZiAoYVtqXSA8IGFbaV0pIHsKKwkJCQl0ID0gYVtqXTsKKwkJCQlhW2pdID0gYVtpXTsKKwkJCQlhW2ldID0gdDsKKwkJCX0gZWxzZSBpZiAoYVtqXSA9PSBhW2ldKSB7CisJCQkJYVtpXSsrOworCQkJCXQgPSBhW2pdOworCQkJCWFbal0gPSBhW2ldOworCQkJCWFbaV0gPSB0OworCQkJfQorCQl9CisJfQorCXZmcmFtZV9xb3MtPm1heF9za2lwID0gYVsyXTsKKwl2ZnJhbWVfcW9zLT5hdmdfc2tpcCA9IGFbMV07CisJdmZyYW1lX3Fvcy0+bWluX3NraXAgPSBhWzBdOworCisJdmZyYW1lX3Fvcy0+bnVtKys7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHNldF9mcmFtZV9pbmZvKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodywgc3RydWN0IHZmcmFtZV9zICp2ZikKK3sKKwl1MzIgYXJfYml0czsKKwl1MzIgZW5kaWFuX3RtcDsKKwl1MzIgYnVmZmVyX2luZGV4ID0gdmYtPmluZGV4OworCisJdmYtPndpZHRoID0gaHctPnBpY3NbYnVmZmVyX2luZGV4XS53aWR0aDsKKwl2Zi0+aGVpZ2h0ID0gaHctPnBpY3NbYnVmZmVyX2luZGV4XS5oZWlnaHQ7CisKKwlpZiAoaHctPmZyYW1lX2R1ciA+IDApCisJCXZmLT5kdXJhdGlvbiA9IGh3LT5mcmFtZV9kdXI7CisJZWxzZSB7CisJCXZmLT5kdXJhdGlvbiA9IGh3LT5mcmFtZV9kdXIgPQorCQlmcmFtZV9yYXRlX3RhYlsoUkVBRF9WUkVHKE1SRUdfU0VRX0lORk8pID4+IDQpICYgMHhmXTsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+bm90aWZ5X3dvcmspOworCX0KKworCXZmLT5zaWduYWxfdHlwZSA9IGh3LT5yZWdfc2lnbmFsX3R5cGU7CisKKwlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCXN0cnVjdCBhbWxfdmRlY19oZHJfaW5mb3MgaGRyOworCQlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisKKwkJbWVtc2V0KCZoZHIsIDAsIHNpemVvZihoZHIpKTsKKwkJaGRyLnNpZ25hbF90eXBlID0gaHctPnJlZ19zaWduYWxfdHlwZTsKKwkJdmRlY192NGxfc2V0X2hkcl9pbmZvcyhjdHgsICZoZHIpOworCX0KKworCWFyX2JpdHMgPSBSRUFEX1ZSRUcoTVJFR19TRVFfSU5GTykgJiAweGY7CisKKwlpZiAoYXJfYml0cyA9PSAweDIpCisJCXZmLT5yYXRpb19jb250cm9sID0gMHhjMCA8PCBESVNQX1JBVElPX0FTUEVDVF9SQVRJT19CSVQ7CisKKwllbHNlIGlmIChhcl9iaXRzID09IDB4MykKKwkJdmYtPnJhdGlvX2NvbnRyb2wgPSAweDkwIDw8IERJU1BfUkFUSU9fQVNQRUNUX1JBVElPX0JJVDsKKworCWVsc2UgaWYgKGFyX2JpdHMgPT0gMHg0KQorCQl2Zi0+cmF0aW9fY29udHJvbCA9IDB4NzQgPDwgRElTUF9SQVRJT19BU1BFQ1RfUkFUSU9fQklUOworCWVsc2UKKwkJdmYtPnJhdGlvX2NvbnRyb2wgPSAwOworCisJaHctPnJhdGlvX2NvbnRyb2wgPSB2Zi0+cmF0aW9fY29udHJvbDsKKworCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IC0xOworCXZmLT5wbGFuZV9udW0gPSAyOworCisJdmYtPmNhbnZhczBfY29uZmlnWzBdID0gaHctPmNhbnZhc19jb25maWdbYnVmZmVyX2luZGV4XVswXTsKKwl2Zi0+Y2FudmFzMF9jb25maWdbMV0gPSBody0+Y2FudmFzX2NvbmZpZ1tidWZmZXJfaW5kZXhdWzFdOworCXZmLT5jYW52YXMxX2NvbmZpZ1swXSA9IGh3LT5jYW52YXNfY29uZmlnW2J1ZmZlcl9pbmRleF1bMF07CisJdmYtPmNhbnZhczFfY29uZmlnWzFdID0gaHctPmNhbnZhc19jb25maWdbYnVmZmVyX2luZGV4XVsxXTsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3KSB7CisJCWVuZGlhbl90bXAgPSAoaHctPmNhbnZhc19tb2RlID09IENBTlZBU19CTEtNT0RFX0xJTkVBUikgPyA3IDogMDsKKwl9IGVsc2UgeworCQllbmRpYW5fdG1wID0gKGh3LT5jYW52YXNfbW9kZSA9PSBDQU5WQVNfQkxLTU9ERV9MSU5FQVIpID8gMCA6IDc7CisJfQorCisJdmYtPmNhbnZhczBfY29uZmlnWzBdLmVuZGlhbiA9IGVuZGlhbl90bXA7CisJdmYtPmNhbnZhczBfY29uZmlnWzFdLmVuZGlhbiA9IGVuZGlhbl90bXA7CisJdmYtPmNhbnZhczFfY29uZmlnWzBdLmVuZGlhbiA9IGVuZGlhbl90bXA7CisJdmYtPmNhbnZhczFfY29uZmlnWzFdLmVuZGlhbiA9IGVuZGlhbl90bXA7CisKKwl2Zi0+c2lkZWJpbmRfdHlwZSA9IGh3LT5zaWRlYmluZF90eXBlOworCXZmLT5zaWRlYmluZF9jaGFubmVsX2lkID0gaHctPnNpZGViaW5kX2NoYW5uZWxfaWQ7CisKKwlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1BBUkFfREFUQSwKKwkibXBlZzJkZWM6IHcoJWQpLCBoKCVkKSwgZHVyKCVkKSwgZHVyLUVTKCVkKVxuIiwKKwkJaHctPmZyYW1lX3dpZHRoLCBody0+ZnJhbWVfaGVpZ2h0LCBody0+ZnJhbWVfZHVyLAorCQlmcmFtZV9yYXRlX3RhYlsoUkVBRF9WUkVHKE1SRUdfU0VRX0lORk8pID4+IDQpICYgMHhmXSk7Cit9CisKK3N0YXRpYyBib29sIGVycm9yX3NraXAoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3LAorCXUzMiBpbmZvLCBzdHJ1Y3QgdmZyYW1lX3MgKnZmKQoreworCWlmIChody0+ZXJyb3JfZnJhbWVfc2tpcF9sZXZlbCkgeworCQkvKiBza2lwIGVycm9yIGZyYW1lICovCisJCWlmICgoaW5mbyAmIFBJQ0lORk9fRVJST1IpIHx8IChody0+ZnJhbWVfZm9yY2Vfc2tpcF9mbGFnKSkgeworCQkJaWYgKChpbmZvICYgUElDSU5GT19FUlJPUikgPT0gMCkgeworCQkJCWlmICgoaW5mbyAmIFBJQ0lORk9fVFlQRV9NQVNLKSA9PQorCQkJCQlQSUNJTkZPX1RZUEVfSSkKKwkJCQkJaHctPmZyYW1lX2ZvcmNlX3NraXBfZmxhZyA9IDA7CisJCQl9IGVsc2UgeworCQkJCWlmIChody0+ZXJyb3JfZnJhbWVfc2tpcF9sZXZlbCA+PSAyKQorCQkJCQlody0+ZnJhbWVfZm9yY2Vfc2tpcF9mbGFnID0gMTsKKwkJCX0KKwkJCWlmICgoaW5mbyAmIFBJQ0lORk9fRVJST1IpCisJCQl8fCAoaHctPmZyYW1lX2ZvcmNlX3NraXBfZmxhZykpCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdm1wZWcxMl9zYXZlX2h3X2NvbnRleHQoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3LCB1MzIgcmVnKQoreworCWlmIChyZWcgPT0gMykgeworCQlody0+Y3R4X3ZhbGlkID0gMDsKKwkJLy9wcl9pbmZvKCIlcywgaHctPnVzZXJkYXRhX3dwX2N0eCAlZFxuIiwgX19mdW5jX18sIGh3LT51c2VyZGF0YV93cF9jdHgpOworCX0gZWxzZSB7CisJCWh3LT5zZXFpbmZvID0gUkVBRF9WUkVHKE1SRUdfU0VRX0lORk8pOworCQlody0+cmVnX3BpY193aWR0aCA9IFJFQURfVlJFRyhNUkVHX1BJQ19XSURUSCk7CisJCWh3LT5yZWdfcGljX2hlaWdodCA9IFJFQURfVlJFRyhNUkVHX1BJQ19IRUlHSFQpOworCQlody0+cmVnX21wZWcxXzJfcmVnID0gUkVBRF9WUkVHKE1QRUcxXzJfUkVHKTsKKwkJaHctPnJlZ19waWNfaGVhZF9pbmZvID0gUkVBRF9WUkVHKFBJQ19IRUFEX0lORk8pOworCQlody0+cmVnX2ZfY29kZV9yZWcgPSBSRUFEX1ZSRUcoRl9DT0RFX1JFRyk7CisJCWh3LT5yZWdfc2xpY2VfdmVyX3Bvc19waWNfdHlwZSA9IFJFQURfVlJFRyhTTElDRV9WRVJfUE9TX1BJQ19UWVBFKTsKKwkJaHctPnJlZ192Y29wX2N0cmxfcmVnID0gUkVBRF9WUkVHKFZDT1BfQ1RSTF9SRUcpOworCQlody0+cmVnX21iX2luZm8gPSBSRUFEX1ZSRUcoTUJfSU5GTyk7CisJCWh3LT5yZWdfc2lnbmFsX3R5cGUgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9IKTsKKwkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19QQVJBX0RBVEEsCisJCQkic2lnbmFsX3R5cGUgPSAleCIsIGh3LT5yZWdfc2lnbmFsX3R5cGUpOworCQlody0+Y3R4X3ZhbGlkID0gMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHZtbXBlZzJfcmVzZXRfdWRyX21ncihzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcpCit7CisJaHctPndhaXRfZm9yX3Vkcl9zZW5kID0gMDsKKwlody0+Y3VyX3VkX2lkeCA9IDA7CisJbWVtc2V0KCZody0+dWRfcmVjb3JkLCAwLCBzaXplb2YoaHctPnVkX3JlY29yZCkpOworfQorCitzdGF0aWMgdm9pZCB2bW1wZWcyX2NyYXRlX3VzZXJkYXRhX21hbmFnZXIoCisJCQkJCQlzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcsCisJCQkJCQl1OCAqdXNlcmRhdGFfYnVmLAorCQkJCQkJaW50IGJ1Zl9sZW4pCit7CisJaWYgKGh3KSB7CisJCW11dGV4X2luaXQoJmh3LT51c2VyZGF0YV9tdXRleCk7CisKKwkJbWVtc2V0KCZody0+dXNlcmRhdGFfaW5mbywgMCwKKwkJCXNpemVvZihzdHJ1Y3QgbW1wZWcyX3VzZXJkYXRhX2luZm9fdCkpOworCQlody0+dXNlcmRhdGFfaW5mby5kYXRhX2J1ZiA9IHVzZXJkYXRhX2J1ZjsKKwkJaHctPnVzZXJkYXRhX2luZm8uYnVmX2xlbiA9IGJ1Zl9sZW47CisJCWh3LT51c2VyZGF0YV9pbmZvLmRhdGFfYnVmX2VuZCA9IHVzZXJkYXRhX2J1ZiArIGJ1Zl9sZW47CisJCWh3LT51c2VyZGF0YV93cF9jdHggPSAwOworCisJCXZtbXBlZzJfcmVzZXRfdWRyX21ncihodyk7CisJfQorfQorCitzdGF0aWMgdm9pZCB2bW1wZWcyX2Rlc3Ryb3lfdXNlcmRhdGFfbWFuYWdlcihzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcpCit7CisJaWYgKGh3KQorCQltZW1zZXQoJmh3LT51c2VyZGF0YV9pbmZvLAorCQkJCTAsCisJCQkJc2l6ZW9mKHN0cnVjdCBtbXBlZzJfdXNlcmRhdGFfaW5mb190KSk7Cit9CisKK3N0YXRpYyB2b2lkIGFtbF9zd2FwX2RhdGEodWludDhfdCAqdXNlcl9kYXRhLCBpbnQgdWRfc2l6ZSkKK3sKKwlpbnQgc3dhcF9ibG9ja3MsIGksIGosIGssIG07CisJdW5zaWduZWQgY2hhciBjX3RlbXA7CisKKwkvKiBzd2FwIGJ5dGUgb3JkZXIgKi8KKwlzd2FwX2Jsb2NrcyA9IHVkX3NpemUgLyA4OworCWZvciAoaSA9IDA7IGkgPCBzd2FwX2Jsb2NrczsgaSsrKSB7CisJCWogPSBpICogODsKKwkJayA9IGogKyA3OworCQlmb3IgKG0gPSAwOyBtIDwgNDsgbSsrKSB7CisJCQljX3RlbXAgPSB1c2VyX2RhdGFbal07CisJCQl1c2VyX2RhdGFbaisrXSA9IHVzZXJfZGF0YVtrXTsKKwkJCXVzZXJfZGF0YVtrLS1dID0gY190ZW1wOworCQl9CisJfQorfQorCisjaWZkZWYgRFVNUF9VU0VSX0RBVEEKK3N0YXRpYyB2b2lkIHB1c2hfdG9fYnVmKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodywKKwl1OCAqcGRhdGEsCisJaW50IGxlbiwKKwlzdHJ1Y3QgdXNlcmRhdGFfbWV0YV9pbmZvX3QgKnBtZXRhLAorCXUzMiByZWZlcmVuY2UpCit7CisJdTMyICpwTGVuOworCWludCBpbmZvX2NudDsKKwl1OCAqcGJ1Zl9lbmQ7CisKKwlpZiAoIWh3LT51c2VyX2RhdGFfZHVtcF9idWYpCisJCXJldHVybjsKKworCWlmIChody0+YnNraXApIHsKKwkJcHJfaW5mbygib3ZlciBzaXplLCBza2lwXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpbmZvX2NudCA9IDA7CisJcExlbiA9ICh1MzIgKilody0+cGR1bXBfYnVmX2N1cl9zdGFydDsKKworCSpwTGVuID0gbGVuOworCWh3LT5wZHVtcF9idWZfY3VyX3N0YXJ0ICs9IHNpemVvZih1MzIpOworCWluZm9fY250Kys7CisJcExlbisrOworCisJKnBMZW4gPSBwbWV0YS0+ZHVyYXRpb247CisJaHctPnBkdW1wX2J1Zl9jdXJfc3RhcnQgKz0gc2l6ZW9mKHUzMik7CisJaW5mb19jbnQrKzsKKwlwTGVuKys7CisKKwkqcExlbiA9IHBtZXRhLT5mbGFnczsKKwlody0+cGR1bXBfYnVmX2N1cl9zdGFydCArPSBzaXplb2YodTMyKTsKKwlpbmZvX2NudCsrOworCXBMZW4rKzsKKworCSpwTGVuID0gcG1ldGEtPnZwdHM7CisJaHctPnBkdW1wX2J1Zl9jdXJfc3RhcnQgKz0gc2l6ZW9mKHUzMik7CisJaW5mb19jbnQrKzsKKwlwTGVuKys7CisKKwkqcExlbiA9IHBtZXRhLT52cHRzX3ZhbGlkOworCWh3LT5wZHVtcF9idWZfY3VyX3N0YXJ0ICs9IHNpemVvZih1MzIpOworCWluZm9fY250Kys7CisJcExlbisrOworCisKKwkqcExlbiA9IGh3LT5uX3VzZXJkYXRhX2lkOworCWh3LT5wZHVtcF9idWZfY3VyX3N0YXJ0ICs9IHNpemVvZih1MzIpOworCWluZm9fY250Kys7CisJcExlbisrOworCisJKnBMZW4gPSByZWZlcmVuY2U7CisJaHctPnBkdW1wX2J1Zl9jdXJfc3RhcnQgKz0gc2l6ZW9mKHUzMik7CisJaW5mb19jbnQrKzsKKwlwTGVuKys7CisKKwlwYnVmX2VuZCA9IGh3LT51c2VyZGF0YV9pbmZvLmRhdGFfYnVmX2VuZDsKKwlpZiAocGRhdGEgKyBsZW4gPiBwYnVmX2VuZCkgeworCQlpbnQgZmlyc3Rfc2VjdGlvbl9sZW47CisKKwkJZmlyc3Rfc2VjdGlvbl9sZW4gPSBwYnVmX2VuZCAtIHBkYXRhOworCQltZW1jcHkoaHctPnBkdW1wX2J1Zl9jdXJfc3RhcnQsIHBkYXRhLCBmaXJzdF9zZWN0aW9uX2xlbik7CisJCXBkYXRhID0gKHU4ICopaHctPnVzZXJkYXRhX2luZm8uZGF0YV9idWY7CisJCWh3LT5wZHVtcF9idWZfY3VyX3N0YXJ0ICs9IGZpcnN0X3NlY3Rpb25fbGVuOworCQltZW1jcHkoaHctPnBkdW1wX2J1Zl9jdXJfc3RhcnQsIHBkYXRhLCBsZW4gLSBmaXJzdF9zZWN0aW9uX2xlbik7CisJCWh3LT5wZHVtcF9idWZfY3VyX3N0YXJ0ICs9IGxlbiAtIGZpcnN0X3NlY3Rpb25fbGVuOworCX0gZWxzZSB7CisJCW1lbWNweShody0+cGR1bXBfYnVmX2N1cl9zdGFydCwgcGRhdGEsIGxlbik7CisJCWh3LT5wZHVtcF9idWZfY3VyX3N0YXJ0ICs9IGxlbjsKKwl9CisKKwlody0+dG90YWxfbGVuICs9IGxlbiArIGluZm9fY250ICogc2l6ZW9mKHUzMik7CisJaWYgKGh3LT50b3RhbF9sZW4gPj0gTUFYX1VTRVJfREFUQV9TSVpFLTQwOTYpCisJCWh3LT5ic2tpcCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfdXNlcmRhdGFfaW5mbyhzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcsCisJdm9pZCAqcHVzZXJfZGF0YSwKKwlpbnQgbGVuLAorCXN0cnVjdCB1c2VyZGF0YV9tZXRhX2luZm9fdCAqcG1ldGEsCisJdTMyIHJlZmVyZW5jZSkKK3sKKwl1OCAqcHN0YXJ0OworCisJcHN0YXJ0ID0gKHU4ICopcHVzZXJfZGF0YTsKKworI2lmZGVmCURVTVBfSEVBRF9JTkZPX0RBVEEKKwlwdXNoX3RvX2J1ZihodywgcHN0YXJ0LCBsZW4sIHBtZXRhLCByZWZlcmVuY2UpOworI2Vsc2UKKwlwdXNoX3RvX2J1ZihodywgcHN0YXJ0KzgsIGxlbiAtIDgsIHBtZXRhLCByZWZlcmVuY2UpOworI2VuZGlmCit9CisKKworc3RhdGljIHZvaWQgcHJpbnRfZGF0YSh1bnNpZ25lZCBjaGFyICpwZGF0YSwKKwkJCQkJCWludCBsZW4sCisJCQkJCQl1bnNpZ25lZCBpbnQgZmxhZywKKwkJCQkJCXVuc2lnbmVkIGludCBkdXJhdGlvbiwKKwkJCQkJCXVuc2lnbmVkIGludCB2cHRzLAorCQkJCQkJdW5zaWduZWQgaW50IHZwdHNfdmFsaWQsCisJCQkJCQlpbnQgcmVjX2lkLAorCQkJCQkJdTMyIHJlZmVyZW5jZSkKK3sKKwlpbnQgbkxlZnQ7CisKKwluTGVmdCA9IGxlbjsKKworCXByX2luZm8oIiVkIGxlbjolZCwgZmxhZzoweCV4LCBkdXI6JWQsIHZwdHM6MHgleCwgdmFsaWQ6JWQsIHJlZmVyOiVkXG4iLAorCQkJCXJlY19pZCwJbGVuLCBmbGFnLAorCQkJCWR1cmF0aW9uLCB2cHRzLCB2cHRzX3ZhbGlkLAorCQkJCXJlZmVyZW5jZSk7CisJd2hpbGUgKG5MZWZ0ID49IDE2KSB7CisJCXByX2luZm8oIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQlwZGF0YVswXSwgcGRhdGFbMV0sIHBkYXRhWzJdLCBwZGF0YVszXSwKKwkJCXBkYXRhWzRdLCBwZGF0YVs1XSwgcGRhdGFbNl0sIHBkYXRhWzddLAorCQkJcGRhdGFbOF0sIHBkYXRhWzldLCBwZGF0YVsxMF0sIHBkYXRhWzExXSwKKwkJCXBkYXRhWzEyXSwgcGRhdGFbMTNdLCBwZGF0YVsxNF0sIHBkYXRhWzE1XSk7CisJCW5MZWZ0IC09IDE2OworCQlwZGF0YSArPSAxNjsKKwl9CisKKworCXdoaWxlIChuTGVmdCA+IDApIHsKKwkJcHJfaW5mbygiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJcGRhdGFbMF0sIHBkYXRhWzFdLCBwZGF0YVsyXSwgcGRhdGFbM10sCisJCQlwZGF0YVs0XSwgcGRhdGFbNV0sIHBkYXRhWzZdLCBwZGF0YVs3XSk7CisJCW5MZWZ0IC09IDg7CisJCXBkYXRhICs9IDg7CisJfQorfQorCitzdGF0aWMgdm9pZCBkdW1wX2RhdGEodTggKnBkYXRhLAorCQkJCQkJdW5zaWduZWQgaW50IHVzZXJfZGF0YV9sZW5ndGgsCisJCQkJCQl1bnNpZ25lZCBpbnQgZmxhZywKKwkJCQkJCXVuc2lnbmVkIGludCBkdXJhdGlvbiwKKwkJCQkJCXVuc2lnbmVkIGludCB2cHRzLAorCQkJCQkJdW5zaWduZWQgaW50IHZwdHNfdmFsaWQsCisJCQkJCQlpbnQgcmVjX2lkLAorCQkJCQkJdTMyIHJlZmVyZW5jZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHN6QnVmWzI1Nl07CisKKworCW1lbXNldChzekJ1ZiwgMCwgMjU2KTsKKwltZW1jcHkoc3pCdWYsIHBkYXRhLCB1c2VyX2RhdGFfbGVuZ3RoKTsKKworCWFtbF9zd2FwX2RhdGEoc3pCdWYsIHVzZXJfZGF0YV9sZW5ndGgpOworCisJcHJpbnRfZGF0YShzekJ1ZiwKKwkJCQl1c2VyX2RhdGFfbGVuZ3RoLAorCQkJCWZsYWcsCisJCQkJZHVyYXRpb24sCisJCQkJdnB0cywKKwkJCQl2cHRzX3ZhbGlkLAorCQkJCXJlY19pZCwKKwkJCQlyZWZlcmVuY2UpOworfQorCisKK3N0YXRpYyB2b2lkIHNob3dfdXNlcl9kYXRhX2J1ZihzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcpCit7CisJdTggKnBidWY7CisJaW50IGxlbjsKKwl1bnNpZ25lZCBpbnQgZmxhZzsKKwl1bnNpZ25lZCBpbnQgZHVyYXRpb247CisJdW5zaWduZWQgaW50IHZwdHM7CisJdW5zaWduZWQgaW50IHZwdHNfdmFsaWQ7CisJaW50IHJlY19pZDsKKwl1MzIgcmVmZXJlbmNlOworCisJcHJfaW5mbygic2hvdyB1c2VyIGRhdGEgYnVmXG4iKTsKKwlwYnVmID0gaHctPnVzZXJfZGF0YV9kdW1wX2J1ZjsKKworCXdoaWxlIChwYnVmIDwgaHctPnBkdW1wX2J1Zl9jdXJfc3RhcnQpIHsKKwkJdTMyICpwTGVuOworCisJCXBMZW4gPSAodTMyICopcGJ1ZjsKKworCQlsZW4gPSAqcExlbjsKKwkJcExlbisrOworCQlwYnVmICs9IHNpemVvZih1MzIpOworCisJCWR1cmF0aW9uID0gKnBMZW47CisJCXBMZW4rKzsKKwkJcGJ1ZiArPSBzaXplb2YodTMyKTsKKworCQlmbGFnID0gKnBMZW47CisJCXBMZW4rKzsKKwkJcGJ1ZiArPSBzaXplb2YodTMyKTsKKworCQl2cHRzID0gKnBMZW47CisJCXBMZW4rKzsKKwkJcGJ1ZiArPSBzaXplb2YodTMyKTsKKworCQl2cHRzX3ZhbGlkID0gKnBMZW47CisJCXBMZW4rKzsKKwkJcGJ1ZiArPSBzaXplb2YodTMyKTsKKworCQlyZWNfaWQgPSAqcExlbjsKKwkJcExlbisrOworCQlwYnVmICs9IHNpemVvZih1MzIpOworCisJCXJlZmVyZW5jZSA9ICpwTGVuOworCQlwTGVuKys7CisJCXBidWYgKz0gc2l6ZW9mKHUzMik7CisKKworCQlkdW1wX2RhdGEocGJ1ZiwgbGVuLCBmbGFnLCBkdXJhdGlvbiwKKwkJCXZwdHMsIHZwdHNfdmFsaWQsIHJlY19pZCwgcmVmZXJlbmNlKTsKKwkJcGJ1ZiArPSBsZW47CisJCW1zbGVlcCgzMCk7CisJfQorfQorCitzdGF0aWMgaW50IGFtdmRlY19tbXBlZzEyX2luaXRfdXNlcmRhdGFfZHVtcChzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcpCit7CisJaHctPnVzZXJfZGF0YV9kdW1wX2J1ZiA9IGttYWxsb2MoTUFYX1VTRVJfREFUQV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoaHctPnVzZXJfZGF0YV9kdW1wX2J1ZikKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYW12ZGVjX21tcGVnMTJfdW5pbml0X3VzZXJkYXRhX2R1bXAoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3KQoreworCWlmIChody0+dXNlcl9kYXRhX2R1bXBfYnVmKSB7CisJCXNob3dfdXNlcl9kYXRhX2J1Zihodyk7CisJCWtmcmVlKGh3LT51c2VyX2RhdGFfZHVtcF9idWYpOworCQlody0+dXNlcl9kYXRhX2R1bXBfYnVmID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0X3VzZXJfZGF0YV9idWYoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3KQoreworCWh3LT50b3RhbF9sZW4gPSAwOworCWh3LT5wZHVtcF9idWZfY3VyX3N0YXJ0ID0gaHctPnVzZXJfZGF0YV9kdW1wX2J1ZjsKKwlody0+YnNraXAgPSAwOworCWh3LT5uX3VzZXJkYXRhX2lkID0gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB1c2VyX2RhdGFfcmVhZHlfbm90aWZ5KHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodywKKwl1MzIgcHRzLCB1MzIgcHRzX3ZhbGlkKQoreworCXN0cnVjdCBtbXBlZzJfdXNlcmRhdGFfcmVjb3JkX3QgKnBfdXNlcmRhdGFfcmVjOworCWludCBpOworCisJaWYgKGh3LT53YWl0X2Zvcl91ZHJfc2VuZCkgeworCQlmb3IgKGkgPSAwOyBpIDwgaHctPmN1cl91ZF9pZHg7IGkrKykgeworCQkJbXV0ZXhfbG9jaygmaHctPnVzZXJkYXRhX211dGV4KTsKKworCisJCQlwX3VzZXJkYXRhX3JlYyA9IGh3LT51c2VyZGF0YV9pbmZvLnJlY29yZHMKKwkJCQkrIGh3LT51c2VyZGF0YV9pbmZvLndyaXRlX2luZGV4OworCisJCQlody0+dWRfcmVjb3JkW2ldLm1ldGFfaW5mby52cHRzX3ZhbGlkID0gcHRzX3ZhbGlkOworCQkJaHctPnVkX3JlY29yZFtpXS5tZXRhX2luZm8udnB0cyA9IHB0czsKKworCQkJKnBfdXNlcmRhdGFfcmVjID0gaHctPnVkX3JlY29yZFtpXTsKKyNpZmRlZiBEVU1QX1VTRVJfREFUQQorCQkJZHVtcF91c2VyZGF0YV9pbmZvKGh3LAorCQkJCWh3LT51c2VyZGF0YV9pbmZvLmRhdGFfYnVmICsgcF91c2VyZGF0YV9yZWMtPnJlY19zdGFydCwKKwkJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX2xlbiwKKwkJCQkmcF91c2VyZGF0YV9yZWMtPm1ldGFfaW5mbywKKwkJCQlody0+cmVmZXJlbmNlW2ldKTsKKwkJCWh3LT5uX3VzZXJkYXRhX2lkKys7CisjZW5kaWYKKy8qCisJCQlwcl9pbmZvKCJub3RpZnk6IHJlY19zdGFydDolZCwgcmVjX2xlbjolZCwgd2k6JWQsIHJlZmVyZW5jZTolZFxuIiwKKwkJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX3N0YXJ0LAorCQkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfbGVuLAorCQkJCWh3LT51c2VyZGF0YV9pbmZvLndyaXRlX2luZGV4LAorCQkJCWh3LT5yZWZlcmVuY2VbaV0pOworKi8KKwkJCWh3LT51c2VyZGF0YV9pbmZvLndyaXRlX2luZGV4Kys7CisJCQlpZiAoaHctPnVzZXJkYXRhX2luZm8ud3JpdGVfaW5kZXggPj0gVVNFUkRBVEFfRklGT19OVU0pCisJCQkJaHctPnVzZXJkYXRhX2luZm8ud3JpdGVfaW5kZXggPSAwOworCisJCQltdXRleF91bmxvY2soJmh3LT51c2VyZGF0YV9tdXRleCk7CisKKworCQkJdmRlY193YWtldXBfdXNlcmRhdGFfcG9sbChod190b192ZGVjKGh3KSk7CisJCX0KKwkJaHctPndhaXRfZm9yX3Vkcl9zZW5kID0gMDsKKwkJaHctPmN1cl91ZF9pZHggPSAwOworCX0KKwlody0+bm90aWZ5X3Vjb2RlX2NjX2xhc3Rfd3AgPSBody0+dWNvZGVfY2NfbGFzdF93cDsKKwlody0+bm90aWZ5X2RhdGFfY2NfbGFzdF93cCA9IGh3LT51c2VyZGF0YV9pbmZvLmxhc3Rfd3A7Cit9CisKK3N0YXRpYyBpbnQgdm1tcGVnMl91c2VyX2RhdGFfcmVhZChzdHJ1Y3QgdmRlY19zICp2ZGVjLAorCXN0cnVjdCB1c2VyZGF0YV9wYXJhbV90ICpwdXNlcmRhdGFfcGFyYSkKK3sKKwlzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcgPSBOVUxMOworCWludCByZWNfcmksIHJlY193aTsKKwlpbnQgcmVjX2xlbjsKKwl1OCAqcmVjX2RhdGFfc3RhcnQ7CisJdTggKnBkZXN0X2J1ZjsKKwlzdHJ1Y3QgbW1wZWcyX3VzZXJkYXRhX3JlY29yZF90ICpwX3VzZXJkYXRhX3JlYzsKKwl1MzIgZGF0YV9zaXplOworCXUzMiByZXM7CisJaW50IGNvcHlfb2sgPSAxOworCisJaHcgPSAoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKil2ZGVjLT5wcml2YXRlOworCisJcGRlc3RfYnVmID0gcHVzZXJkYXRhX3BhcmEtPnBidWZfYWRkcjsKKworCW11dGV4X2xvY2soJmh3LT51c2VyZGF0YV9tdXRleCk7CisKKy8qCisJcHJfaW5mbygicmkgPSAlZCwgd2kgPSAlZFxuIiwKKwkJaHctPnVzZXJkYXRhX2luZm8ucmVhZF9pbmRleCwKKwkJaHctPnVzZXJkYXRhX2luZm8ud3JpdGVfaW5kZXgpOworKi8KKwlyZWNfcmkgPSBody0+dXNlcmRhdGFfaW5mby5yZWFkX2luZGV4OworCXJlY193aSA9IGh3LT51c2VyZGF0YV9pbmZvLndyaXRlX2luZGV4OworCisJaWYgKHJlY19yaSA9PSByZWNfd2kpIHsKKwkJbXV0ZXhfdW5sb2NrKCZody0+dXNlcmRhdGFfbXV0ZXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwX3VzZXJkYXRhX3JlYyA9IGh3LT51c2VyZGF0YV9pbmZvLnJlY29yZHMgKyByZWNfcmk7CisKKwlyZWNfbGVuID0gcF91c2VyZGF0YV9yZWMtPnJlY19sZW47CisJcmVjX2RhdGFfc3RhcnQgPSBwX3VzZXJkYXRhX3JlYy0+cmVjX3N0YXJ0ICsgaHctPnVzZXJkYXRhX2luZm8uZGF0YV9idWY7CisvKgorCXByX2luZm8oInJpOiVkLCB3aTolZCwgcmVjX2xlbjolZCwgcmVjX3N0YXJ0OiVkLCBidWZfbGVuOiVkXG4iLAorCQlyZWNfcmksIHJlY193aSwKKwkJcF91c2VyZGF0YV9yZWMtPnJlY19sZW4sCisJCXBfdXNlcmRhdGFfcmVjLT5yZWNfc3RhcnQsCisJCXB1c2VyZGF0YV9wYXJhLT5idWZfbGVuKTsKKyovCisJaWYgKHJlY19sZW4gPD0gcHVzZXJkYXRhX3BhcmEtPmJ1Zl9sZW4pIHsKKwkJLyogZHZiIHVzZXIgZGF0YSBidWZmZXIgaXMgZW5vdWdodCB0bworCQljb3B5IHRoZSB3aG9sZSByZWNvcmVkLiAqLworCQlkYXRhX3NpemUgPSByZWNfbGVuOworCQlpZiAocmVjX2RhdGFfc3RhcnQgKyBkYXRhX3NpemUKKwkJCT4gaHctPnVzZXJkYXRhX2luZm8uZGF0YV9idWZfZW5kKSB7CisJCQlpbnQgZmlyc3Rfc2VjdGlvbl9sZW47CisKKwkJCWZpcnN0X3NlY3Rpb25fbGVuID0gaHctPnVzZXJkYXRhX2luZm8uYnVmX2xlbiAtCisJCQkJcF91c2VyZGF0YV9yZWMtPnJlY19zdGFydDsKKwkJCXJlcyA9ICh1MzIpY29weV90b191c2VyKCh2b2lkICopcGRlc3RfYnVmLAorCQkJCQkJCSh2b2lkICopcmVjX2RhdGFfc3RhcnQsCisJCQkJCQkJZmlyc3Rfc2VjdGlvbl9sZW4pOworCQkJaWYgKHJlcykgeworCQkJCXByX2luZm8oInAxIHJlYWQgbm90IGVuZCByZXM9JWQsIHJlcXVlc3Q9JWRcbiIsCisJCQkJCXJlcywgZmlyc3Rfc2VjdGlvbl9sZW4pOworCQkJCWNvcHlfb2sgPSAwOworCisJCQkJcF91c2VyZGF0YV9yZWMtPnJlY19sZW4gLT0KKwkJCQkJZmlyc3Rfc2VjdGlvbl9sZW4gLSByZXM7CisJCQkJcF91c2VyZGF0YV9yZWMtPnJlY19zdGFydCArPQorCQkJCQlmaXJzdF9zZWN0aW9uX2xlbiAtIHJlczsKKwkJCQlwdXNlcmRhdGFfcGFyYS0+ZGF0YV9zaXplID0KKwkJCQkJZmlyc3Rfc2VjdGlvbl9sZW4gLSByZXM7CisJCQl9IGVsc2UgeworCQkJCXJlcyA9ICh1MzIpY29weV90b191c2VyKAorCQkJCQkodm9pZCAqKShwZGVzdF9idWYrZmlyc3Rfc2VjdGlvbl9sZW4pLAorCQkJCQkodm9pZCAqKWh3LT51c2VyZGF0YV9pbmZvLmRhdGFfYnVmLAorCQkJCQlkYXRhX3NpemUgLSBmaXJzdF9zZWN0aW9uX2xlbik7CisJCQkJaWYgKHJlcykgeworCQkJCQlwcl9pbmZvKCJwMiByZWFkIG5vdCBlbmQgcmVzPSVkLCByZXF1ZXN0PSVkXG4iLAorCQkJCQkJcmVzLCBkYXRhX3NpemUpOworCQkJCQljb3B5X29rID0gMDsKKwkJCQl9CisJCQkJcF91c2VyZGF0YV9yZWMtPnJlY19sZW4gLT0KKwkJCQkJZGF0YV9zaXplIC0gcmVzOworCQkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfc3RhcnQgPQorCQkJCQlkYXRhX3NpemUgLSBmaXJzdF9zZWN0aW9uX2xlbiAtIHJlczsKKwkJCQlwdXNlcmRhdGFfcGFyYS0+ZGF0YV9zaXplID0KKwkJCQkJZGF0YV9zaXplIC0gcmVzOworCQkJfQorCQl9IGVsc2UgeworCQkJcmVzID0gKHUzMiljb3B5X3RvX3VzZXIoKHZvaWQgKilwZGVzdF9idWYsCisJCQkJCQkJKHZvaWQgKilyZWNfZGF0YV9zdGFydCwKKwkJCQkJCQlkYXRhX3NpemUpOworCQkJaWYgKHJlcykgeworCQkJCXByX2luZm8oInAzIHJlYWQgbm90IGVuZCByZXM9JWQsIHJlcXVlc3Q9JWRcbiIsCisJCQkJCXJlcywgZGF0YV9zaXplKTsKKwkJCQljb3B5X29rID0gMDsKKwkJCX0KKwkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfbGVuIC09IGRhdGFfc2l6ZSAtIHJlczsKKwkJCXBfdXNlcmRhdGFfcmVjLT5yZWNfc3RhcnQgKz0gZGF0YV9zaXplIC0gcmVzOworCQkJcHVzZXJkYXRhX3BhcmEtPmRhdGFfc2l6ZSA9IGRhdGFfc2l6ZSAtIHJlczsKKwkJfQorCisJCWlmIChjb3B5X29rKSB7CisJCQlody0+dXNlcmRhdGFfaW5mby5yZWFkX2luZGV4Kys7CisJCQlpZiAoaHctPnVzZXJkYXRhX2luZm8ucmVhZF9pbmRleCA+PSBVU0VSREFUQV9GSUZPX05VTSkKKwkJCQlody0+dXNlcmRhdGFfaW5mby5yZWFkX2luZGV4ID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIGR2YiB1c2VyIGRhdGEgYnVmZmVyIGlzIG5vdCBlbm91Z2h0CisJCXRvIGNvcHkgdGhlIHdob2xlIHJlY29yZWQuICovCisJCWRhdGFfc2l6ZSA9IHB1c2VyZGF0YV9wYXJhLT5idWZfbGVuOworCQlpZiAocmVjX2RhdGFfc3RhcnQgKyBkYXRhX3NpemUKKwkJCT4gaHctPnVzZXJkYXRhX2luZm8uZGF0YV9idWZfZW5kKSB7CisJCQlpbnQgZmlyc3Rfc2VjdGlvbl9sZW47CisKKwkJCWZpcnN0X3NlY3Rpb25fbGVuID0gaHctPnVzZXJkYXRhX2luZm8uYnVmX2xlbiAtCisJCQkJcF91c2VyZGF0YV9yZWMtPnJlY19zdGFydDsKKwkJCXJlcyA9ICh1MzIpY29weV90b191c2VyKCh2b2lkICopcGRlc3RfYnVmLAorCQkJCQkJKHZvaWQgKilyZWNfZGF0YV9zdGFydCwKKwkJCQkJCWZpcnN0X3NlY3Rpb25fbGVuKTsKKwkJCWlmIChyZXMpIHsKKwkJCQlwcl9pbmZvKCJwNCByZWFkIG5vdCBlbmQgcmVzPSVkLCByZXF1ZXN0PSVkXG4iLAorCQkJCQlyZXMsIGZpcnN0X3NlY3Rpb25fbGVuKTsKKwkJCQljb3B5X29rID0gMDsKKwkJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX2xlbiAtPQorCQkJCQlmaXJzdF9zZWN0aW9uX2xlbiAtIHJlczsKKwkJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX3N0YXJ0ICs9CisJCQkJCWZpcnN0X3NlY3Rpb25fbGVuIC0gcmVzOworCQkJCXB1c2VyZGF0YV9wYXJhLT5kYXRhX3NpemUgPQorCQkJCQlmaXJzdF9zZWN0aW9uX2xlbiAtIHJlczsKKwkJCX0gZWxzZSB7CisJCQkJLyogZmlyc3Qgc2VjdG9uIGNvcHkgaXMgb2sqLworCQkJCXJlcyA9ICh1MzIpY29weV90b191c2VyKAorCQkJCQkodm9pZCAqKShwZGVzdF9idWYrZmlyc3Rfc2VjdGlvbl9sZW4pLAorCQkJCQkodm9pZCAqKWh3LT51c2VyZGF0YV9pbmZvLmRhdGFfYnVmLAorCQkJCQlkYXRhX3NpemUgLSBmaXJzdF9zZWN0aW9uX2xlbik7CisJCQkJaWYgKHJlcykgeworCQkJCQlwcl9pbmZvKCJwNSByZWFkIG5vdCBlbmQgcmVzPSVkLCByZXF1ZXN0PSVkXG4iLAorCQkJCQkJcmVzLAorCQkJCQkJZGF0YV9zaXplIC0gZmlyc3Rfc2VjdGlvbl9sZW4pOworCQkJCQljb3B5X29rID0gMDsKKwkJCQl9CisKKwkJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX2xlbiAtPQorCQkJCQlkYXRhX3NpemUgLSByZXM7CisJCQkJcF91c2VyZGF0YV9yZWMtPnJlY19zdGFydCA9CisJCQkJCWRhdGFfc2l6ZSAtIGZpcnN0X3NlY3Rpb25fbGVuIC0gcmVzOworCQkJCXB1c2VyZGF0YV9wYXJhLT5kYXRhX3NpemUgPQorCQkJCQlkYXRhX3NpemUgLSByZXM7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXMgPSAodTMyKWNvcHlfdG9fdXNlcigodm9pZCAqKXBkZXN0X2J1ZiwKKwkJCQkJCQkodm9pZCAqKXJlY19kYXRhX3N0YXJ0LAorCQkJCQkJCWRhdGFfc2l6ZSk7CisJCQlpZiAocmVzKSB7CisJCQkJcHJfaW5mbygicDYgcmVhZCBub3QgZW5kIHJlcz0lZCwgcmVxdWVzdD0lZFxuIiwKKwkJCQkJcmVzLCBkYXRhX3NpemUpOworCQkJCWNvcHlfb2sgPSAwOworCQkJfQorCisJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX2xlbiAtPSBkYXRhX3NpemUgLSByZXM7CisJCQlwX3VzZXJkYXRhX3JlYy0+cmVjX3N0YXJ0ICs9IGRhdGFfc2l6ZSAtIHJlczsKKwkJCXB1c2VyZGF0YV9wYXJhLT5kYXRhX3NpemUgPSBkYXRhX3NpemUgLSByZXM7CisJCX0KKworCQlpZiAoY29weV9vaykgeworCQkJaHctPnVzZXJkYXRhX2luZm8ucmVhZF9pbmRleCsrOworCQkJaWYgKGh3LT51c2VyZGF0YV9pbmZvLnJlYWRfaW5kZXggPj0gVVNFUkRBVEFfRklGT19OVU0pCisJCQkJaHctPnVzZXJkYXRhX2luZm8ucmVhZF9pbmRleCA9IDA7CisJCX0KKworCX0KKwlwdXNlcmRhdGFfcGFyYS0+bWV0YV9pbmZvID0gcF91c2VyZGF0YV9yZWMtPm1ldGFfaW5mbzsKKworCWlmIChody0+dXNlcmRhdGFfaW5mby5yZWFkX2luZGV4IDw9IGh3LT51c2VyZGF0YV9pbmZvLndyaXRlX2luZGV4KQorCQlwdXNlcmRhdGFfcGFyYS0+bWV0YV9pbmZvLnJlY29yZHNfaW5fcXVlID0KKwkJCWh3LT51c2VyZGF0YV9pbmZvLndyaXRlX2luZGV4IC0KKwkJCWh3LT51c2VyZGF0YV9pbmZvLnJlYWRfaW5kZXg7CisJZWxzZQorCQlwdXNlcmRhdGFfcGFyYS0+bWV0YV9pbmZvLnJlY29yZHNfaW5fcXVlID0KKwkJCWh3LT51c2VyZGF0YV9pbmZvLndyaXRlX2luZGV4ICsKKwkJCVVTRVJEQVRBX0ZJRk9fTlVNIC0KKwkJCWh3LT51c2VyZGF0YV9pbmZvLnJlYWRfaW5kZXg7CisKKwlwdXNlcmRhdGFfcGFyYS0+dmVyc2lvbiA9ICgwPDwyNHwwPDwxNnwwPDw4fDEpOworCisJbXV0ZXhfdW5sb2NrKCZody0+dXNlcmRhdGFfbXV0ZXgpOworCisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgdm1tcGVnMl9yZXNldF91c2VyZGF0YV9maWZvKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBiSW5pdCkKK3sKKwlzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcgPSBOVUxMOworCisJaHcgPSAoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKil2ZGVjLT5wcml2YXRlOworCisJaWYgKGh3KSB7CisJCW11dGV4X2xvY2soJmh3LT51c2VyZGF0YV9tdXRleCk7CisJCXByX2luZm8oIm1wZWcyX3Jlc2V0X3VzZXJkYXRhX2ZpZm86IGJJbml0OiAlZCwgcmk6ICVkLCB3aTogJWRcbiIsCisJCQliSW5pdCwKKwkJCWh3LT51c2VyZGF0YV9pbmZvLnJlYWRfaW5kZXgsCisJCQlody0+dXNlcmRhdGFfaW5mby53cml0ZV9pbmRleCk7CisJCWh3LT51c2VyZGF0YV9pbmZvLnJlYWRfaW5kZXggPSAwOworCQlody0+dXNlcmRhdGFfaW5mby53cml0ZV9pbmRleCA9IDA7CisKKwkJaWYgKGJJbml0KQorCQkJaHctPnVzZXJkYXRhX2luZm8ubGFzdF93cCA9IDA7CisJCW11dGV4X3VubG9jaygmaHctPnVzZXJkYXRhX211dGV4KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHZtbXBlZzJfd2FrZXVwX3VzZXJkYXRhX3BvbGwoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlhbXN0cmVhbV93YWtldXBfdXNlcmRhdGFfcG9sbCh2ZGVjKTsKK30KKworLyoKKyNkZWZpbmUgUFJJTlRfSEVBRF9JTkZPCisqLworc3RhdGljIHZvaWQgdXNlcmRhdGFfcHVzaF9kb193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwl1MzIgcmVnOworCXU4ICpwZGF0YTsKKwl1OCAqcHNyY19kYXRhOworCXU4IGhlYWRfaW5mb1s4XTsKKwlzdHJ1Y3QgdXNlcmRhdGFfbWV0YV9pbmZvX3QgbWV0YV9pbmZvOworCXUzMiB3cDsKKwl1MzIgaW5kZXg7CisJdTMyIHBpY3R1cmVfc3RydWN0OworCXUzMiByZWZlcmVuY2U7CisJdTMyIHBpY3R1cmVfdHlwZTsKKwl1MzIgdGVtcDsKKwl1MzIgZGF0YV9sZW5ndGg7CisJdTMyIGRhdGFfc3RhcnQ7CisJaW50IGk7CisJdTMyIG9mZnNldDsKKwl1MzIgY3VyX3dwOworI2lmZGVmIFBSSU5UX0hFQURfSU5GTworCXU4ICpwdHlwZV9zdHI7CisjZW5kaWYKKwlzdHJ1Y3QgbW1wZWcyX3VzZXJkYXRhX3JlY29yZF90ICpwY3VyX3VkX3JlYzsKKworCXN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodyA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQkJCQlzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcywgdXNlcmRhdGFfcHVzaF93b3JrKTsKKworCW1lbXNldCgmbWV0YV9pbmZvLCAwLCBzaXplb2YobWV0YV9pbmZvKSk7CisKKwltZXRhX2luZm8uZHVyYXRpb24gPSBody0+ZnJhbWVfZHVyOworCisKKwlyZWcgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9KKTsKKwlody0+dXNlcmRhdGFfd3BfY3R4ID0gcmVnICYgKH4oMTw8MTYpKTsKKwltZXRhX2luZm8uZmxhZ3MgPSAoKHJlZyA+PiAzMCkgPDwgMSk7CisJbWV0YV9pbmZvLmZsYWdzIHw9IChWRk9STUFUX01QRUcxMiA8PCAzKTsKKwkvKiBjaGVjayAgdG9wX2ZpZWxkX2ZpcnN0IGZsYWcgKi8KKwlpZiAoKHJlZyA+PiAyOCkgJiAweDEpIHsKKwkJbWV0YV9pbmZvLmZsYWdzIHw9ICgxIDw8IDEwKTsKKwkJbWV0YV9pbmZvLmZsYWdzIHw9ICgoKHJlZyA+PiAyOSkgJiAweDEpIDw8IDExKTsKKwl9CisKKwljdXJfd3AgPSByZWcgJiAweDdmZmY7CisJaWYgKGN1cl93cCA9PSBody0+dWNvZGVfY2NfbGFzdF93cCB8fCAoY3VyX3dwID49IEFVWF9CVUZfQUxJR04oQ0NCVUZfU0laRSkpKSB7CisJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkiTnVsbCBvciBPdmVyIHNpemUgdXNlciBkYXRhIHBhY2thZ2U6IHdwID0gJWRcbiIsIGN1cl93cCk7CisJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9KLCAwKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChody0+Y3VyX3VkX2lkeCA+PSBNQVhfVURfUkVDT1JEUykgeworCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RFQ19ERVRBSUwsCisJCQkiVUQgUmVjb3JkcyBvdmVyOiAlZCwgc2tpcCBpdFxuIiwgTUFYX1VEX1JFQ09SRFMpOworCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfSiwgMCk7CisJCWh3LT5jdXJfdWRfaWR4ID0gMDsKKwkJcmV0dXJuOworCX0KKworCWlmIChjdXJfd3AgPCBody0+dWNvZGVfY2NfbGFzdF93cCkKKwkJaHctPnVjb2RlX2NjX2xhc3Rfd3AgPSAwOworCisJb2Zmc2V0ID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfSSk7CisKKwljb2RlY19tbV9kbWFfZmx1c2goCisJCWh3LT5jY2J1Zl9waHlBZGRyZXNzX3ZpcnQsCisJCUNDQlVGX1NJWkUsCisJCURNQV9GUk9NX0RFVklDRSk7CisKKwltdXRleF9sb2NrKCZody0+dXNlcmRhdGFfbXV0ZXgpOworCWlmIChody0+Y2NidWZfcGh5QWRkcmVzc192aXJ0KSB7CisJCXBkYXRhID0gKHU4ICopaHctPmNjYnVmX3BoeUFkZHJlc3NfdmlydCArIGh3LT51Y29kZV9jY19sYXN0X3dwOworCQltZW1jcHkoaGVhZF9pbmZvLCBwZGF0YSwgOCk7CisJfSBlbHNlCisJCW1lbXNldChoZWFkX2luZm8sIDAsIDgpOworCW11dGV4X3VubG9jaygmaHctPnVzZXJkYXRhX211dGV4KTsKKwlhbWxfc3dhcF9kYXRhKGhlYWRfaW5mbywgOCk7CisKKwl3cCA9IChoZWFkX2luZm9bMF0gPDwgOCB8IGhlYWRfaW5mb1sxXSk7CisJaW5kZXggPSAoaGVhZF9pbmZvWzJdIDw8IDggfCBoZWFkX2luZm9bM10pOworCisJcGljdHVyZV9zdHJ1Y3QgPSAoaGVhZF9pbmZvWzZdIDw8IDggfCBoZWFkX2luZm9bN10pOworCXRlbXAgPSAoaGVhZF9pbmZvWzRdIDw8IDggfCBoZWFkX2luZm9bNV0pOworCXJlZmVyZW5jZSA9IHRlbXAgJiAweDNGRjsKKwlwaWN0dXJlX3R5cGUgPSAodGVtcCA+PiAxMCkgJiAweDc7CisKKwlpZiAoZGVidWdfZW5hYmxlICYgUFJJTlRfRkxBR19VU0VSREFUQV9ERVRBSUwpCisJCXByX2luZm8oImluZGV4OiVkLCB3cDolZCwgcmVmOiVkLCB0eXBlOiVkLCBzdHJ1Y3Q6MHgleCwgdV9sYXN0X3dwOjB4JXhcbiIsCisJCQlpbmRleCwgd3AsIHJlZmVyZW5jZSwKKwkJCXBpY3R1cmVfdHlwZSwgcGljdHVyZV9zdHJ1Y3QsCisJCQlody0+dWNvZGVfY2NfbGFzdF93cCk7CisKKwlzd2l0Y2ggKHBpY3R1cmVfdHlwZSkgeworCWNhc2UgMToKKwkJCS8qIHByX2luZm8oIkkgdHlwZSwgcG9zOiVkXG4iLAorCQkJCQkobWV0YV9pbmZvLmZsYWdzPj4xKSYweDMpOyAqLworCQkJbWV0YV9pbmZvLmZsYWdzIHw9ICgxPDw3KTsKKyNpZmRlZiBQUklOVF9IRUFEX0lORk8KKwkJCXB0eXBlX3N0ciA9ICIgSSI7CisjZW5kaWYKKwkJCWJyZWFrOworCWNhc2UgMjoKKwkJCS8qIHByX2luZm8oIlAgdHlwZSwgcG9zOiVkXG4iLAorCQkJCQkobWV0YV9pbmZvLmZsYWdzPj4xKSYweDMpOyAqLworCQkJbWV0YV9pbmZvLmZsYWdzIHw9ICgyPDw3KTsKKyNpZmRlZiBQUklOVF9IRUFEX0lORk8KKwkJCXB0eXBlX3N0ciA9ICIgUCI7CisjZW5kaWYKKwkJCWJyZWFrOworCWNhc2UgMzoKKwkJCS8qIHByX2luZm8oIkIgdHlwZSwgcG9zOiVkXG4iLAorCQkJCQkobWV0YV9pbmZvLmZsYWdzPj4xKSYweDMpOyAqLworCQkJbWV0YV9pbmZvLmZsYWdzIHw9ICgzPDw3KTsKKyNpZmRlZiBQUklOVF9IRUFEX0lORk8KKwkJCXB0eXBlX3N0ciA9ICIgQiI7CisjZW5kaWYKKwkJCWJyZWFrOworCWNhc2UgNDoKKwkJCS8qIHByX2luZm8oIkQgdHlwZSwgcG9zOiVkXG4iLAorCQkJCQkobWV0YV9pbmZvLmZsYWdzPj4xKSYweDMpOyAqLworCQkJbWV0YV9pbmZvLmZsYWdzIHw9ICg0PDw3KTsKKyNpZmRlZiBQUklOVF9IRUFEX0lORk8KKwkJCXB0eXBlX3N0ciA9ICIgRCI7CisjZW5kaWYKKwkJCWJyZWFrOworCWRlZmF1bHQ6CisJCQkvKiBwcl9pbmZvKCJVbmtub3duIHR5cGU6MHgleCwgcG9zOiVkXG4iLAorCQkJCQlwaGVhZGVyLT5waWN0dXJlX2NvZGluZ190eXBlLAorCQkJCQkobWV0YV9pbmZvLmZsYWdzPj4xKSYweDMpOyAqLworI2lmZGVmIFBSSU5UX0hFQURfSU5GTworCQkJcHR5cGVfc3RyID0gIiBVIjsKKyNlbmRpZgorCQkJYnJlYWs7CisJfQorI2lmZGVmIFBSSU5UX0hFQURfSU5GTworCXByX2luZm8oInJlZjolZCwgdHlwZTolcywgZXh0OiVkLCBmaXJzdDolZCwgZGF0YV9sZW5ndGg6JWRcbiIsCisJCXJlZmVyZW5jZSwgcHR5cGVfc3RyLAorCQkocmVnID4+IDMwKSwKKwkJKHJlZyA+PiAyOCkmMHgzLAorCQlyZWcgJiAweGZmZmYpOworI2VuZGlmCisJZGF0YV9sZW5ndGggPSBjdXJfd3AgLSBody0+dWNvZGVfY2NfbGFzdF93cDsKKwlkYXRhX3N0YXJ0ID0gcmVnICYgMHhmZmZmOworCXBzcmNfZGF0YSA9ICh1OCAqKWh3LT5jY2J1Zl9waHlBZGRyZXNzX3ZpcnQgKyBody0+dWNvZGVfY2NfbGFzdF93cDsKKworCXBkYXRhID0gaHctPnVzZXJkYXRhX2luZm8uZGF0YV9idWYgKyBody0+dXNlcmRhdGFfaW5mby5sYXN0X3dwOworCWZvciAoaSA9IDA7IGkgPCBkYXRhX2xlbmd0aCAmJiBody0+Y2NidWZfcGh5QWRkcmVzc192aXJ0ICE9IE5VTEwgJiYgcHNyY19kYXRhOyBpKyspIHsKKwkJKnBkYXRhKysgPSAqcHNyY19kYXRhKys7CisJCWlmIChwZGF0YSA+PSBody0+dXNlcmRhdGFfaW5mby5kYXRhX2J1Zl9lbmQpCisJCQlwZGF0YSA9IGh3LT51c2VyZGF0YV9pbmZvLmRhdGFfYnVmOworCX0KKworCXBjdXJfdWRfcmVjID0gaHctPnVkX3JlY29yZCArIGh3LT5jdXJfdWRfaWR4OworCisJcGN1cl91ZF9yZWMtPm1ldGFfaW5mbyA9IG1ldGFfaW5mbzsKKwlwY3VyX3VkX3JlYy0+cmVjX3N0YXJ0ID0gaHctPnVzZXJkYXRhX2luZm8ubGFzdF93cDsKKwlwY3VyX3VkX3JlYy0+cmVjX2xlbiA9IGRhdGFfbGVuZ3RoOworCisJaHctPnVzZXJkYXRhX2luZm8ubGFzdF93cCArPSBkYXRhX2xlbmd0aDsKKwlpZiAoaHctPnVzZXJkYXRhX2luZm8ubGFzdF93cCA+PSBVU0VSX0RBVEFfU0laRSkKKwkJaHctPnVzZXJkYXRhX2luZm8ubGFzdF93cCAlPSBVU0VSX0RBVEFfU0laRTsKKworCWh3LT53YWl0X2Zvcl91ZHJfc2VuZCA9IDE7CisKKwlody0+dWNvZGVfY2NfbGFzdF93cCA9IGN1cl93cDsKKworCWlmIChkZWJ1Z19lbmFibGUgJiBQUklOVF9GTEFHX1VTRVJEQVRBX0RFVEFJTCkKKwkJcHJfaW5mbygiY3VyX3dwOiVkLCByZWNfc3RhcnQ6JWQsIHJlY19sZW46JWRcbiIsCisJCQljdXJfd3AsCisJCQlwY3VyX3VkX3JlYy0+cmVjX3N0YXJ0LAorCQkJcGN1cl91ZF9yZWMtPnJlY19sZW4pOworCisjaWZkZWYgRFVNUF9VU0VSX0RBVEEKKwlody0+cmVmZXJlbmNlW2h3LT5jdXJfdWRfaWR4XSA9IHJlZmVyZW5jZTsKKyNlbmRpZgorCisJaHctPmN1cl91ZF9pZHgrKzsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfSiwgMCk7Cit9CisKKwordm9pZCB1c2VyZGF0YV9wdXNoZWRfZHJvcChzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcpCit7CisJaHctPnVzZXJkYXRhX2luZm8ubGFzdF93cCA9IGh3LT5ub3RpZnlfZGF0YV9jY19sYXN0X3dwOworCWh3LT51Y29kZV9jY19sYXN0X3dwID0gaHctPm5vdGlmeV91Y29kZV9jY19sYXN0X3dwOworCWh3LT5jdXJfdWRfaWR4ID0gMDsKKwlody0+d2FpdF9mb3JfdWRyX3NlbmQgPSAwOworCit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGh3X3VwZGF0ZV9ndnMoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3KQoreworCWlmIChody0+Z3ZzLmZyYW1lX2hlaWdodCAhPSBody0+ZnJhbWVfaGVpZ2h0KSB7CisJCWh3LT5ndnMuZnJhbWVfd2lkdGggPSBody0+ZnJhbWVfd2lkdGg7CisJCWh3LT5ndnMuZnJhbWVfaGVpZ2h0ID0gaHctPmZyYW1lX2hlaWdodDsKKwl9CisJaWYgKGh3LT5ndnMuZnJhbWVfZHVyICE9IGh3LT5mcmFtZV9kdXIpIHsKKwkJaHctPmd2cy5mcmFtZV9kdXIgPSBody0+ZnJhbWVfZHVyOworCQlpZiAoaHctPmZyYW1lX2R1ciAhPSAwKQorCQkJaHctPmd2cy5mcmFtZV9yYXRlID0gKCg5NjAwMCAqIDEwIC8gaHctPmZyYW1lX2R1cikgJSAxMCkgPCA1ID8KKwkJCQkJOTYwMDAgLyBody0+ZnJhbWVfZHVyIDogKDk2MDAwIC8gaHctPmZyYW1lX2R1ciArMSk7CisJCWVsc2UKKwkJCWh3LT5ndnMuZnJhbWVfcmF0ZSA9IC0xOworCX0KKwlpZiAoaHctPmd2cy5yYXRpb19jb250cm9sICE9IGh3LT5yYXRpb19jb250cm9sKQorCQlody0+Z3ZzLnJhdGlvX2NvbnRyb2wgPSBody0+cmF0aW9fY29udHJvbDsKKworCWh3LT5ndnMuc3RhdHVzID0gaHctPnN0YXQ7CisJaHctPmd2cy5lcnJvcl9jb3VudCA9IGh3LT5ndnMuZXJyb3JfZnJhbWVfY291bnQ7CisJaHctPmd2cy5kcm9wX2ZyYW1lX2NvdW50ID0gaHctPmRyb3BfZnJhbWVfY291bnQ7CisKK30KKworc3RhdGljIGludCBwcmVwYXJlX2Rpc3BsYXlfYnVmKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodywKKwlzdHJ1Y3QgcGljX2luZm9fdCAqcGljKQoreworCXUzMiBmaWVsZF9udW0gPSAwLCBpOworCXUzMiBmaXJzdF9maWVsZF90eXBlID0gMCwgdHlwZSA9IDA7CisJc3RydWN0IHZmcmFtZV9zICp2ZiA9IE5VTEw7CisJdTMyIGluZGV4ID0gcGljLT5pbmRleDsKKwl1MzIgaW5mbyA9IHBpYy0+YnVmZmVyX2luZm87CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaHcpOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqIHY0bDJfY3R4ID0gaHctPnY0bDJfY3R4OworCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9IE5VTEw7CisJdWxvbmcgbnZfb3JkZXIgPSBWSURUWVBFX1ZJVV9OVjIxOworCWJvb2wgcGJfc2tpcCA9IGZhbHNlOworCisJLyogc3dhcCB1diAqLworCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJaWYgKCh2NGwyX2N0eC0+Y2FwX3BpeF9mbXQgPT0gVjRMMl9QSVhfRk1UX05WMTIpIHx8CisJCQkodjRsMl9jdHgtPmNhcF9waXhfZm10ID09IFY0TDJfUElYX0ZNVF9OVjEyTSkpCisJCQludl9vcmRlciA9IFZJRFRZUEVfVklVX05WMTI7CisJfQorCisjaWZkZWYgTlYyMQorCXR5cGUgPSBudl9vcmRlcjsKKyNlbmRpZgorCWlmIChody0+aV9vbmx5KSB7CisJCXBiX3NraXAgPSAxOworCX0KKworCXVzZXJfZGF0YV9yZWFkeV9ub3RpZnkoaHcsIHBpYy0+cHRzLCBwaWMtPnB0c192YWxpZCk7CisKKwlpZiAoaHctPmZyYW1lX3Byb2cgJiBQSUNJTkZPX1BST0cpIHsKKwkJZmllbGRfbnVtID0gMTsKKwkJdHlwZSB8PSBWSURUWVBFX1BST0dSRVNTSVZFIHwgVklEVFlQRV9WSVVfRklFTEQgfCBudl9vcmRlcjsKKwl9IGVsc2UgeworI2lmZGVmIElOVEVSTEFDRV9TRVFfQUxXQVlTCisJCS8qIG9uY2UgYW4gaW50ZXJsYWNlIHNlcSwgZm9yY2UgaW50ZXJsYWNlLCB0byBtYWtlIGRpIGVhc3kuICovCisJCWh3LT5kZWNfY29udHJvbCB8PSBERUNfQ09OVFJPTF9GTEFHX0ZPUkNFX1NFUV9JTlRFUkxBQ0U7CisjZW5kaWYKKwkJaHctPmZyYW1lX3JwdF9zdGF0ZSA9IEZSQU1FX1JFUEVBVF9OT05FOworCisJCWZpcnN0X2ZpZWxkX3R5cGUgPSAoaW5mbyAmIFBJQ0lORk9fVE9QX0ZJUlNUKSA/CisJCQlWSURUWVBFX0lOVEVSTEFDRV9UT1AgOiBWSURUWVBFX0lOVEVSTEFDRV9CT1RUT007CisJCWZpZWxkX251bSA9IChpbmZvICYgUElDSU5GT19SUFRfRklSU1QpID8gMyA6IDI7CisJfQorCisJaWYgKChody0+aXNfdXNlZF92NGwpICYmCisJCSgodmRlYy0+cHJvZ19vbmx5KSB8fCAoaHctPnJlcG9ydF9maWVsZCAmIFY0TDJfRklFTERfTk9ORSkgfHwKKwkJKCF2NGwyX2N0eC0+dnBwX2lzX25lZWQpKSkgeworCQlmaWVsZF9udW0gPSAxOworCQl0eXBlIHw9IFZJRFRZUEVfUFJPR1JFU1NJVkUgfCBWSURUWVBFX1ZJVV9GSUVMRCB8IG52X29yZGVyOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBmaWVsZF9udW07IGkrKykgeworCQlpZiAoa2ZpZm9fZ2V0KCZody0+bmV3ZnJhbWVfcSwgJnZmKSA9PSAwKSB7CisJCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0VSUk9SLAorCQkJCSJmYXRhbCBlcnJvciwgbm8gYXZhaWxhYmxlIGJ1ZmZlciBzbG90LiIpOworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0VSUk9SOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCQl2Zi0+djRsX21lbV9oYW5kbGUKKwkJCQk9IGh3LT5waWNzW2luZGV4XS52NGxfcmVmX2J1Zl9hZGRyOworCQkJZmIgPSAoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKil2Zi0+djRsX21lbV9oYW5kbGU7CisJCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1Y0TF9ERVRBSUwsCisJCQkJIlslZF0gJXMoKSwgdjRsIG1lbSBoYW5kbGU6IDB4JWx4XG4iLAorCQkJCSgoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCkpLT5pZCwKKwkJCQlfX2Z1bmNfXywgdmYtPnY0bF9tZW1faGFuZGxlKTsKKwkJfQorCisJCWh3LT52ZmJ1Zl91c2VbaW5kZXhdKys7CisJCXZmLT5pbmRleCA9IGluZGV4OworCQlzZXRfZnJhbWVfaW5mbyhodywgdmYpOworCQlpZiAoZmllbGRfbnVtID4gMSkgeworCQkJdmYtPmR1cmF0aW9uID0gdmYtPmR1cmF0aW9uIC8gZmllbGRfbnVtOworCQkJdmYtPmR1cmF0aW9uX3B1bGxkb3duID0gKGZpZWxkX251bSA9PSAzKSA/CisJCQkJKHZmLT5kdXJhdGlvbiA+PiAxKTowOworCQkJdHlwZSA9IG52X29yZGVyOworCQkJaWYgKGkgPT0gMSkgLyogc2Vjb25kIGZpZWxkKi8KKwkJCQl0eXBlIHw9IChmaXJzdF9maWVsZF90eXBlID09IFZJRFRZUEVfSU5URVJMQUNFX1RPUCkgPworCQkJCQlWSURUWVBFX0lOVEVSTEFDRV9CT1RUT00gOiBWSURUWVBFX0lOVEVSTEFDRV9UT1A7CisJCQllbHNlCisJCQkJdHlwZSB8PSAoZmlyc3RfZmllbGRfdHlwZSA9PSBWSURUWVBFX0lOVEVSTEFDRV9UT1ApID8KKwkJCQkJVklEVFlQRV9JTlRFUkxBQ0VfVE9QIDogVklEVFlQRV9JTlRFUkxBQ0VfQk9UVE9NOworCQl9IGVsc2UgeworCQkJaWYgKChody0+c2VxaW5mbyAmIFNFUUlORk9fRVhUX0FWQUlMQUJMRSkgJiYKKwkJCQkoaHctPnNlcWluZm8gJiBTRVFJTkZPX1BST0cpKSB7CisJCQkJaWYgKGluZm8gJiBQSUNJTkZPX1JQVF9GSVJTVCkgeworCQkJCQlpZiAoaW5mbyAmIFBJQ0lORk9fVE9QX0ZJUlNUKQorCQkJCQkJdmYtPmR1cmF0aW9uICo9IDM7CisJCQkJCWVsc2UKKwkJCQkJCXZmLT5kdXJhdGlvbiAqPSAyOworCQkJCX0KKwkJCQl2Zi0+ZHVyYXRpb25fcHVsbGRvd24gPSAwOworCQkJfSBlbHNlIHsKKwkJCQl2Zi0+ZHVyYXRpb25fcHVsbGRvd24gPQorCQkJCQkoaW5mbyAmIFBJQ0lORk9fUlBUX0ZJUlNUKSA/CisJCQkJCQl2Zi0+ZHVyYXRpb24gPj4gMSA6IDA7CisJCQl9CisJCX0KKwkJdmYtPmR1cmF0aW9uICs9IHZmLT5kdXJhdGlvbl9wdWxsZG93bjsKKwkJdmYtPnR5cGUgPSB0eXBlOworCQl2Zi0+b3JpZW50YXRpb24gPSAwOworCQlpZiAoaSA+IDApIHsKKwkJCXZmLT5wdHMgPSAwOworCQkJdmYtPnB0c191czY0ID0gMDsKKwkJCXZmLT50aW1lc3RhbXAgPSBwaWMtPnRpbWVzdGFtcDsKKwkJCWlmICh2NGwyX2N0eC0+c2Vjb25kX2ZpZWxkX3B0c19tb2RlKSB7CisJCQkJdmYtPnRpbWVzdGFtcCA9IDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQl2Zi0+cHRzID0gKHBpYy0+cHRzX3ZhbGlkKSA/IHBpYy0+cHRzIDogMDsKKwkJCXZmLT5wdHNfdXM2NCA9IChwaWMtPnB0c192YWxpZCkgPyBwaWMtPnB0czY0IDogMDsKKwkJCWlmIChmaWVsZF9udW0gPT0gMSkKKwkJCQl2Zi0+dGltZXN0YW1wID0gcGljLT50aW1lc3RhbXA7CisJCQllbHNlCisJCQkJdmYtPnRpbWVzdGFtcCA9IHBpYy0+bGFzdF90aW1lc3RhbXA7CisJCX0KKwkJdmYtPnR5cGVfb3JpZ2luYWwgPSB2Zi0+dHlwZTsKKworCQlpZiAoKGVycm9yX3NraXAoaHcsIHBpYy0+YnVmZmVyX2luZm8sIHZmKSkgfHwKKwkJCSgoKGh3LT5maXJzdF9pX2ZyYW1lX3JlYWR5ID09IDApIHx8IHBiX3NraXApICYmCisJCQkoKFBJQ0lORk9fVFlQRV9NQVNLICYgcGljLT5idWZmZXJfaW5mbykgIT0KKwkJCSBQSUNJTkZPX1RZUEVfSSkpKSB7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJaHctPmRyb3BfZnJhbWVfY291bnQrKzsKKwkJCWlmICgoaW5mbyAmIFBJQ0lORk9fVFlQRV9NQVNLKSA9PSBQSUNJTkZPX1RZUEVfSSkgeworCQkJCWh3LT5ndnMuaV9sb3N0X2ZyYW1lcysrOworCQkJfSBlbHNlIGlmICgoaW5mbyAmIFBJQ0lORk9fVFlQRV9NQVNLKSA9PSBQSUNJTkZPX1RZUEVfUCkgeworCQkJCWh3LT5ndnMucF9sb3N0X2ZyYW1lcysrOworCQkJfSBlbHNlIGlmICgoaW5mbyAmIFBJQ0lORk9fVFlQRV9NQVNLKSA9PSBQSUNJTkZPX1RZUEVfQikgeworCQkJCWh3LT5ndnMuYl9sb3N0X2ZyYW1lcysrOworCQkJfQorCQkJLyogVGhvdWdoIHdlIGRyb3AgaXQsIGl0IGlzIHN0aWxsIGFuIGVycm9yIGZyYW1lLCBjb3VudCBpdC4KKwkJCSAqIEJlY2FzZSB3ZSd2ZSBjb3VudGVkIHRoZSBlcnJvciBmcmFtZSBpbiB2ZGVjX2NvdW50X2luZm8KKwkJCSAqIGZ1bmN0aW9uLCBhdm9pZCBjb3VudCBpdCB0d2ljZS4KKwkJCSAqLworCQlpZiAoIShpbmZvICYgUElDSU5GT19FUlJPUikpIHsKKwkJCWh3LT5ndnMuZXJyb3JfZnJhbWVfY291bnQrKzsKKwkJCWlmICgoaW5mbyAmIFBJQ0lORk9fVFlQRV9NQVNLKSA9PSBQSUNJTkZPX1RZUEVfSSkgeworCQkJCWh3LT5ndnMuaV9jb25jZWFsZWRfZnJhbWVzKys7CisJCQl9IGVsc2UgaWYgKChpbmZvICYgUElDSU5GT19UWVBFX01BU0spID09IFBJQ0lORk9fVFlQRV9QKSB7CisJCQkJaHctPmd2cy5wX2NvbmNlYWxlZF9mcmFtZXMrKzsKKwkJCX0gZWxzZSBpZiAoKGluZm8gJiBQSUNJTkZPX1RZUEVfTUFTSykgPT0gUElDSU5GT19UWVBFX0IpIHsKKwkJCQlody0+Z3ZzLmJfY29uY2VhbGVkX2ZyYW1lcysrOworCQkJfQorCQl9CisJCQlody0+dmZidWZfdXNlW2luZGV4XS0tOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5sb2NrLCBmbGFncyk7CisJCQlrZmlmb19wdXQoJmh3LT5uZXdmcmFtZV9xLAorCQkJCShjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+bG9jaywgZmxhZ3MpOworCQl9IGVsc2UgeworCQkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19USU1FSU5GTywKKwkJCQkiJXMsIHZmOiAlbHgsIG51bVslZF06ICVkKCVjKSwgZHVyOiAlZCwgdHlwZTogJXgsIHB0czogJWQoJWxsZCksIHRzKCVsbGQpXG4iLAorCQkJCV9fZnVuY19fLCAodWxvbmcpdmYsIGksIGh3LT5kaXNwX251bSwgR0VUX1NMSUNFX1RZUEUoaW5mbyksCisJCQkJdmYtPmR1cmF0aW9uLCB2Zi0+dHlwZSwgdmYtPnB0cywgdmYtPnB0c191czY0LCB2Zi0+dGltZXN0YW1wKTsKKwkJCWF0b21pY19hZGQoMSwgJmh3LT5kaXNwX251bSk7CisJCQlpZiAoaSA9PSAwKSB7CisJCQkJZGVjb2Rlcl9kb19mcmFtZV9jaGVjayh2ZGVjLCB2Zik7CisJCQkJaHdfdXBkYXRlX2d2cyhodyk7CisJCQkJdmRlY19maWxsX3ZkZWNfZnJhbWUodmRlYywgJmh3LT52ZnJhbWVfcW9zLAorCQkJCQkmaHctPmd2cywgdmYsIHBpYy0+aHdfZGVjb2RlX3RpbWUpOworCQkJfQorCQkJdmRlYy0+dmRlY19mcHNfZGV0ZWModmRlYy0+aWQpOworCQkJdmYtPm1lbV9oYW5kbGUgPQorCQkJCWRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJaHctPm1tX2Jsa19oYW5kbGUsIGluZGV4KTsKKwkJCWlmICghdmRlYy0+dmJ1Zi51c2VfcHRzc2VydiAmJiB2ZGVjX3N0cmVhbV9iYXNlZCh2ZGVjKSkgeworCQkJCS8qIG9mZnNldCBmb3IgdHNwbGF5ZXIgcHRzIGxvb2t1cCAqLworCQkJCWlmIChpID09IDApIHsKKwkJCQkJdmYtPnB0c191czY0ID0KKwkJCQkJCSgoKHU2NCl2Zi0+ZHVyYXRpb24gPDwgMzIpICYKKwkJCQkJCTB4ZmZmZmZmZmYwMDAwMDAwMCkgfCBwaWMtPm9mZnNldDsKKwkJCQkJdmYtPnB0cyA9IDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJdmYtPnB0c191czY0ID0gKHU2NCktMTsKKwkJCQkJdmYtPnB0cyA9IDA7CisJCQkJfQorCQkJfQorCQkJdmRlY192ZnJhbWVfcmVhZHkodmRlYywgdmYpOworCQkJa2ZpZm9fcHV0KCZody0+ZGlzcGxheV9xLCAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQkJQVRSQUNFX0NPVU5URVIoaHctPnB0c19uYW1lLCB2Zi0+dGltZXN0YW1wKTsKKwkJCUFUUkFDRV9DT1VOVEVSKGh3LT5uZXdfcV9uYW1lLCBrZmlmb19sZW4oJmh3LT5uZXdmcmFtZV9xKSk7CisJCQlBVFJBQ0VfQ09VTlRFUihody0+ZGlzcF9xX25hbWUsIGtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSkpOworCQkJLyogaWYgKGh3LT5kaXNwX251bSA9PSAxKSB7ICovCisJCQlpZiAoaHctPmtwaV9maXJzdF9pX2RlY29kZWQgPT0gMCkgeworCQkJCWh3LT5rcGlfZmlyc3RfaV9kZWNvZGVkID0gMTsKKwkJCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RFQ19ERVRBSUwsCisJCQkJCSJbdmRlY19rcGldWyVzXSBGaXJzdCBJIGZyYW1lIGRlY29kZWQuXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQl9CisJCQlpZiAod2l0aG91dF9kaXNwbGF5X21vZGUgPT0gMCkgeworCQkJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCQkJaWYgKHY0bDJfY3R4LT5pc19zdHJlYW1fb2ZmKSB7CisJCQkJCQl2bXBlZ192Zl9wdXQodm1wZWdfdmZfZ2V0KHZkZWMpLCB2ZGVjKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXNldF9tZXRhX2RhdGFfdG9fdmYodmYsIFVWTV9NRVRBX0RBVEFfVkZfQkFTRV9JTkZPUywgaHctPnY0bDJfY3R4KTsKKwkJCQkJCUFUUkFDRV9DT1VOVEVSKCJWQ19PVVRfREVDLXN1Ym1pdCIsIGZiLT5idWZfaWR4KTsKKwkJCQkJCWZiLT50YXNrLT5zdWJtaXQoZmItPnRhc2ssIFRBU0tfVFlQRV9ERUMpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJdmZfbm90aWZ5X3JlY2VpdmVyKHZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQkJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfVkZSQU1FX1JFQURZLAorCQkJCQkJTlVMTCk7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJdm1wZWdfdmZfcHV0KHZtcGVnX3ZmX2dldCh2ZGVjKSwgdmRlYyk7CisKKworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmb3JjZV9pbnRlcmxhY2VfY2hlY2soc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3KQoreworCWlmICgoaHctPmRlY19jb250cm9sICYKKwlERUNfQ09OVFJPTF9GTEFHX0ZPUkNFXzI1MDBfNzIwXzU3Nl9JTlRFUkxBQ0UpICYmCisJCShody0+ZnJhbWVfd2lkdGggPT0gNzIwKSAmJgorCQkoaHctPmZyYW1lX2hlaWdodCA9PSA1NzYpICYmCisJCShody0+ZnJhbWVfZHVyID09IDM4NDApKSB7CisJCWh3LT5mcmFtZV9wcm9nID0gMDsKKwl9IGVsc2UgaWYgKChody0+ZGVjX2NvbnRyb2wKKwkmIERFQ19DT05UUk9MX0ZMQUdfRk9SQ0VfMzAwMF83MDRfNDgwX0lOVEVSTEFDRSkgJiYKKwkJKGh3LT5mcmFtZV93aWR0aCA9PSA3MDQpICYmCisJCShody0+ZnJhbWVfaGVpZ2h0ID09IDQ4MCkgJiYKKwkJKGh3LT5mcmFtZV9kdXIgPT0gMzIwMCkpIHsKKwkJaHctPmZyYW1lX3Byb2cgPSAwOworCX0gZWxzZSBpZiAoKGh3LT5kZWNfY29udHJvbAorCSYgREVDX0NPTlRST0xfRkxBR19GT1JDRV8yNTAwXzcwNF81NzZfSU5URVJMQUNFKSAmJgorCQkoaHctPmZyYW1lX3dpZHRoID09IDcwNCkgJiYKKwkJKGh3LT5mcmFtZV9oZWlnaHQgPT0gNTc2KSAmJgorCQkoaHctPmZyYW1lX2R1ciA9PSAzODQwKSkgeworCQlody0+ZnJhbWVfcHJvZyA9IDA7CisJfSBlbHNlIGlmICgoaHctPmRlY19jb250cm9sCisJJiBERUNfQ09OVFJPTF9GTEFHX0ZPUkNFXzI1MDBfNTQ0XzU3Nl9JTlRFUkxBQ0UpICYmCisJCShody0+ZnJhbWVfd2lkdGggPT0gNTQ0KSAmJgorCQkoaHctPmZyYW1lX2hlaWdodCA9PSA1NzYpICYmCisJCShody0+ZnJhbWVfZHVyID09IDM4NDApKSB7CisJCWh3LT5mcmFtZV9wcm9nID0gMDsKKwl9IGVsc2UgaWYgKChody0+ZGVjX2NvbnRyb2wKKwkmIERFQ19DT05UUk9MX0ZMQUdfRk9SQ0VfMjUwMF80ODBfNTc2X0lOVEVSTEFDRSkgJiYKKwkJKGh3LT5mcmFtZV93aWR0aCA9PSA0ODApICYmCisJCShody0+ZnJhbWVfaGVpZ2h0ID09IDU3NikgJiYKKwkJKGh3LT5mcmFtZV9kdXIgPT0gMzg0MCkpIHsKKwkJaHctPmZyYW1lX3Byb2cgPSAwOworCX0gZWxzZSBpZiAoaHctPmRlY19jb250cm9sCisJJiBERUNfQ09OVFJPTF9GTEFHX0ZPUkNFX1NFUV9JTlRFUkxBQ0UpIHsKKwkJaHctPmZyYW1lX3Byb2cgPSAwOworCX0KKworfQorCitzdGF0aWMgaW50IHVwZGF0ZV9yZWZlcmVuY2Uoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3LAorCWludCBpbmRleCkKK3sKKwlody0+cmVmX3VzZVtpbmRleF0rKzsKKwlpZiAoaHctPnJlZnNbMV0gPT0gLTEpIHsKKwkJaHctPnJlZnNbMV0gPSBpbmRleDsKKwkJLyoKKwkJKiBmaXJzdCBwaWMgbmVlZCBvdXRwdXQgdG8gc2hvdworCQkqIHVzZWNudCBkbyBub3QgZGVjcmVhc2UuCisJCSovCisJfSBlbHNlIGlmIChody0+cmVmc1swXSA9PSAtMSkgeworCQlody0+cmVmc1swXSA9IGh3LT5yZWZzWzFdOworCQlody0+cmVmc1sxXSA9IGluZGV4OworCQkvKiBzZWNvbmQgcGljIGRvIG5vdCBvdXRwdXQgKi8KKwkJaW5kZXggPSBody0+YnVmX251bTsKKwl9IGVsc2UgeworCQlody0+cmVmX3VzZVtody0+cmVmc1swXV0tLTsJCS8vb2xkIHJlZjAgdW51bnNlZAorCQlody0+cmVmc1swXSA9IGh3LT5yZWZzWzFdOworCQlody0+cmVmc1sxXSA9IGluZGV4OworCQlpbmRleCA9IGh3LT5yZWZzWzBdOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisKK3N0YXRpYyBib29sIGlzX3JlZl9lcnJvcihzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcpCit7CisJaWYgKChody0+cGljc1tody0+cmVmc1swXV0uYnVmZmVyX2luZm8gJiBQSUNJTkZPX0VSUk9SKSB8fAorCQkoaHctPnBpY3NbaHctPnJlZnNbMV1dLmJ1ZmZlcl9pbmZvICYgUElDSU5GT19FUlJPUikpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZtcGVnMl9nZXRfcHNfaW5mbyhzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKwlib29sIGZyYW1lX3Byb2csIHN0cnVjdCBhbWxfdmRlY19wc19pbmZvcyAqcHMpCit7CisJcHMtPnZpc2libGVfd2lkdGgJPSB3aWR0aDsKKwlwcy0+dmlzaWJsZV9oZWlnaHQJPSBoZWlnaHQ7CisJcHMtPmNvZGVkX3dpZHRoCQk9IEFMSUdOKHdpZHRoLCA2NCk7CisJcHMtPmNvZGVkX2hlaWdodCAJPSBBTElHTihoZWlnaHQsIDY0KTsKKwlwcy0+ZHBiX3NpemUgCQk9IGh3LT5idWZfbnVtOworCXBzLT5kcGJfZnJhbWVzCQk9IERFQ09ERV9CVUZGRVJfTlVNX0RFRjsKKwlwcy0+ZHBiX21hcmdpbgkJPSBody0+ZHluYW1pY19idWZfbnVtX21hcmdpbjsKKwlwcy0+ZmllbGQgCQk9IGZyYW1lX3Byb2cgPyBWNEwyX0ZJRUxEX05PTkUgOiBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ7CisJcHMtPmZpZWxkIAkJPSBody0+Zm9yY2VfcHJvZ19vbmx5ID8gVjRMMl9GSUVMRF9OT05FIDogcHMtPmZpZWxkOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdjRsX3Jlc19jaGFuZ2Uoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2wgZnJhbWVfcHJvZykKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisJaW50IHJldCA9IDA7CisKKwlpZiAoY3R4LT5wYXJhbV9zZXRzX2Zyb21fdWNvZGUgJiYKKwkJaHctPnJlc19jaF9mbGFnID09IDApIHsKKwkJc3RydWN0IGFtbF92ZGVjX3BzX2luZm9zIHBzOworCisJCWlmICgoaHctPmZyYW1lX3dpZHRoICE9IDAgJiYKKwkJCWh3LT5mcmFtZV9oZWlnaHQgIT0gMCkgJiYKKwkJCShody0+ZnJhbWVfd2lkdGggIT0gd2lkdGggfHwKKwkJCWh3LT5mcmFtZV9oZWlnaHQgIT0gaGVpZ2h0KSkgeworCQkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCQkidjRsX3Jlc19jaGFuZ2UgUGljIFdpZHRoL0hlaWdodCBDaGFuZ2UgKCVkLCVkKT0+KCVkLCVkKVxuIiwKKwkJCQlody0+ZnJhbWVfd2lkdGgsIGh3LT5mcmFtZV9oZWlnaHQsCisJCQkJd2lkdGgsCisJCQkJaGVpZ2h0KTsKKwkJCXZtcGVnMl9nZXRfcHNfaW5mbyhodywgd2lkdGgsIGhlaWdodCwgZnJhbWVfcHJvZywgJnBzKTsKKwkJCXZkZWNfdjRsX3NldF9wc19pbmZvcyhjdHgsICZwcyk7CisJCQl2ZGVjX3Y0bF9yZXNfY2hfZXZlbnQoY3R4KTsKKwkJCWh3LT52NGxfcGFyYW1zX3BhcnNlZCA9IGZhbHNlOworCQkJaHctPnJlc19jaF9mbGFnID0gMTsKKwkJCWN0eC0+djRsX3Jlc29sdXRpb25fY2hhbmdlID0gMTsKKwkJCWh3LT5lb3MgPSAxOworCQkJZmx1c2hfb3V0cHV0KGh3KTsKKwkJCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy1zdWJtaXRfZW9zIiwgX19MSU5FX18pOworCQkJbm90aWZ5X3Y0bF9lb3MoaHdfdG9fdmRlYyhodykpOworCQkJQVRSQUNFX0NPVU5URVIoIlZfU1RfREVDLXN1Ym1pdF9lb3MiLCAwKTsKKworCQkJcmV0ID0gMTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgY2FsX2NodW5rX29mZnNldF9hbmRfc2l6ZShzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcpCit7CisJdTMyIGNvbnN1bWVfYnl0ZSwgcmVzX2J5dGU7CisKKwlyZXNfYnl0ZSA9IFJFQURfVlJFRyhWSUZGX0JJVF9DTlQpID4+IDM7CisKKwlpZiAoaHctPmNodW5rLT5zaXplID4gcmVzX2J5dGUpIHsKKwkJY29uc3VtZV9ieXRlID0gaHctPmNodW5rLT5zaXplIC0gcmVzX2J5dGU7CisKKwkJaWYgKGNvbnN1bWVfYnl0ZSA+IFZERUNfRklGT19BTElHTikgeworCQkJY29uc3VtZV9ieXRlIC09IFZERUNfRklGT19BTElHTjsKKwkJCXJlc19ieXRlICs9IFZERUNfRklGT19BTElHTjsKKwkJfQorCQlody0+Y2h1bmtfaGVhZGVyX29mZnNldCA9IGh3LT5jaHVuay0+b2Zmc2V0ICsgY29uc3VtZV9ieXRlOworCQlody0+Y2h1bmtfcmVzX3NpemUgPSByZXNfYnl0ZTsKKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB2bXBlZzEyX2lzcl90aHJlYWRfZm4oc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGlycSkKK3sKKwl1MzIgcmVnLCBpbmRleCwgaW5mbywgc2VxaW5mbywgb2Zmc2V0LCBwdHMsIGZyYW1lX3NpemU9MCwgdG1wX2gsIHRtcF93OworCXU2NCBwdHNfdXM2NCA9IDA7CisJc3RydWN0IHBpY19pbmZvX3QgKm5ld19waWMsICpkaXNwX3BpYzsKKwlzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcgPQorCQkoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKikodmRlYy0+cHJpdmF0ZSk7CisKKwlpZiAoUkVBRF9WUkVHKEFWX1NDUkFUQ0hfTSkgIT0gMCAmJgorCQkoZGVidWdfZW5hYmxlICYgUFJJTlRfRkxBR19VQ09ERV9ERVRBSUwpKSB7CisKKwkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19ERUNfREVUQUlMLAorCQkJImRiZyAleDogJXgsIGxldmVsICV4LCB3cCAleCwgcnAgJXgsIGNudCAleFxuIiwKKwkJCVJFQURfVlJFRyhBVl9TQ1JBVENIX00pLCBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9OKSwKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCksCisJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSwKKwkJCVJFQURfVlJFRyhWSUZGX0JJVF9DTlQpKTsKKwkJV1JJVEVfVlJFRyhBVl9TQ1JBVENIX00sIDApOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJcmVnID0gUkVBRF9WUkVHKEFWX1NDUkFUQ0hfRyk7CisJaWYgKHJlZyA9PSAxKSB7CisJCWlmIChody0+a3BpX2ZpcnN0X2lfY29tbWluZyA9PSAwKSB7CisJCQlody0+a3BpX2ZpcnN0X2lfY29tbWluZyA9IDE7CisJCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RFQ19ERVRBSUwsCisJCQkJIlt2ZGVjX2twaV1bJXNdIEZpcnN0IEkgZnJhbWUgY29taW5nLlxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCX0KKwkJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQkJaW50IGZyYW1lX3dpZHRoID0gUkVBRF9WUkVHKE1SRUdfUElDX1dJRFRIKTsKKwkJCWludCBmcmFtZV9oZWlnaHQgPSBSRUFEX1ZSRUcoTVJFR19QSUNfSEVJR0hUKTsKKwkJCWludCBpbmZvID0gUkVBRF9WUkVHKE1SRUdfU0VRX0lORk8pOworCQkJYm9vbCBmcmFtZV9wcm9nID0gaW5mbyAmIDB4MTAwMDA7CisKKwkJCWlmICghdjRsX3Jlc19jaGFuZ2UoaHcsIGZyYW1lX3dpZHRoLCBmcmFtZV9oZWlnaHQsIGZyYW1lX3Byb2cpKSB7CisJCQkJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisJCQkJaWYgKGN0eC0+cGFyYW1fc2V0c19mcm9tX3Vjb2RlICYmICFody0+djRsX3BhcmFtc19wYXJzZWQpIHsKKwkJCQkJc3RydWN0IGFtbF92ZGVjX3BzX2luZm9zIHBzOworCisJCQkJCXZtcGVnMl9nZXRfcHNfaW5mbyhodywgZnJhbWVfd2lkdGgsIGZyYW1lX2hlaWdodCwgZnJhbWVfcHJvZywgJnBzKTsKKwkJCQkJaHctPnY0bF9wYXJhbXNfcGFyc2VkID0gdHJ1ZTsKKwkJCQkJaHctPnJlcG9ydF9maWVsZCA9IGZyYW1lX3Byb2cgPyBWNEwyX0ZJRUxEX05PTkUgOiBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ7CisJCQkJCXZkZWNfdjRsX3NldF9wc19pbmZvcyhjdHgsICZwcyk7CisJCQkJCWNhbF9jaHVua19vZmZzZXRfYW5kX3NpemUoaHcpOworCQkJCQl1c2VyZGF0YV9wdXNoZWRfZHJvcChodyk7CisJCQkJCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisJCQkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKwkJCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc3RydWN0IHZkZWNfcGljX2luZm8gcGljOworCisJCQkJCWlmICghaHctPmJ1Zl9udW0pIHsKKwkJCQkJCXZkZWNfdjRsX2dldF9waWNfaW5mbyhjdHgsICZwaWMpOworCQkJCQkJaHctPmJ1Zl9udW0gPSBwaWMuZHBiX2ZyYW1lcyArCisJCQkJCQkJcGljLmRwYl9tYXJnaW47CisJCQkJCQlpZiAoaHctPmJ1Zl9udW0gPiBERUNPREVfQlVGRkVSX05VTV9NQVgpCisJCQkJCQkJaHctPmJ1Zl9udW0gPSBERUNPREVfQlVGRkVSX05VTV9NQVg7CisJCQkJCX0KKworCQkJCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfRywgMCk7CisKKwkJCQkJaHctPnJlc19jaF9mbGFnID0gMDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXVzZXJkYXRhX3B1c2hlZF9kcm9wKGh3KTsKKwkJCQlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCQkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKwkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCX0KKwkJfSBlbHNlCisJCQlXUklURV9WUkVHKEFWX1NDUkFUQ0hfRywgMCk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlyZWcgPSBSRUFEX1ZSRUcoQVZfU0NSQVRDSF9KKTsKKwlpZiAocmVnICYgKDE8PDE2KSkgeworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT51c2VyZGF0YV9wdXNoX3dvcmspOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJcmVnID0gUkVBRF9WUkVHKE1SRUdfQlVGRkVST1VUKTsKKworCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy1kZWNvZGVfc3RhdGUiLCByZWcpOworCisJaWYgKHJlZyA9PSBNUEVHMTJfREFUQV9SRVFVRVNUKSB7CisJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfUlVOX0ZMT1csCisJCQkiJXM6IGRhdGEgcmVxdWVzdCwgYmNudD0leFxuIiwKKwkJCV9fZnVuY19fLCBSRUFEX1ZSRUcoVklGRl9CSVRfQ05UKSk7CisJCWlmICh2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpKSB7CisJCQlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0dFVF9EQVRBOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCX0KKwl9IGVsc2UgaWYgKHJlZyA9PSBNUEVHMTJfREFUQV9FTVBUWSkgeworCQkvKnRpbWVvdXQgd2hlbiBkZWNvZGluZyBuZXh0IGZyYW1lKi8KKwkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WTERfREVUQUlMLAorCQkJIiVzOiBJbnN1ZmZpY2llbnQgZGF0YSwgbHZsPSV4IGN0cmw9JXggYmNudD0leFxuIiwKKwkJCV9fZnVuY19fLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKSwKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19DT05UUk9MKSwKKwkJCVJFQURfVlJFRyhWSUZGX0JJVF9DTlQpKTsKKworCQlpZiAodmRlY19mcmFtZV9iYXNlZCh2ZGVjKSkgeworCQkJdXNlcmRhdGFfcHVzaGVkX2Ryb3AoaHcpOworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJfSBlbHNlIHsKKwkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJdXNlcmRhdGFfcHVzaGVkX2Ryb3AoaHcpOworCQkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwkJfQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfSBlbHNlIHsgIC8qIE1QRUcxMl9QSUNfRE9ORSwgTVBFRzEyX1NFUV9FTkQgKi8KKwkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKworCQlpbmZvID0gUkVBRF9WUkVHKE1SRUdfUElDX0lORk8pOworCQlvZmZzZXQgPSBSRUFEX1ZSRUcoTVJFR19GUkFNRV9PRkZTRVQpOworCQlpbmRleCA9IHNwZWNfdG9faW5kZXgoaHcsIFJFQURfVlJFRyhSRUNfQ0FOVkFTX0FERFIpKTsKKwkJc2VxaW5mbyA9IFJFQURfVlJFRyhNUkVHX1NFUV9JTkZPKTsKKworCQlpZiAoKChzZXFpbmZvID4+IDgpICYgMHhmZikgJiYKKwkJCSgoc2VxaW5mbyA+PiAxMiAmIDB4NykgIT0gaHctPnByb2ZpbGVfaWRjIHx8CisJCQkoc2VxaW5mbyA+PiA4ICYgMHhmKSAhPSBody0+bGV2ZWxfaWRjKSkgeworCQkJaHctPnByb2ZpbGVfaWRjID0gc2VxaW5mbyA+PiAxMiAmIDB4NzsKKwkJCWh3LT5sZXZlbF9pZGMgPSBzZXFpbmZvID4+IDggJiAweGY7CisJCQl2ZGVjX3NldF9wcm9maWxlX2xldmVsKHZkZWMsIGh3LT5wcm9maWxlX2lkYywgaHctPmxldmVsX2lkYyk7CisJCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RFQ19ERVRBSUwsCisJCQkJInByb2ZpbGVfaWRjOiAlZCAgbGV2ZWxfaWRjOiAlZFxuIiwKKwkJCQlody0+cHJvZmlsZV9pZGMsIGh3LT5sZXZlbF9pZGMpOworCQl9CisKKwkJaWYgKChpbmZvICYgUElDSU5GT19QUk9HKSA9PSAwICYmCisJCQkoaW5mbyAmIEZSQU1FX1BJQ1RVUkVfTUFTSykgIT0gRlJBTUVfUElDVFVSRSkgeworCQkJaHctPmZpcnN0X2lfZnJhbWVfcmVhZHkgPSAxOyAvKiBmb3IgZmllbGQgc3RydWN0IGNhc2UqLworCQl9CisJCWlmIChpbmRleCA+PSBody0+YnVmX251bSkgeworCQkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19FUlJPUiwKKwkJCQkibW1wZWcxMjogaW52YWxpZCBidWYgaW5kZXg6ICVkXG4iLCBpbmRleCk7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRVJST1I7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCQlody0+ZGVjX251bSsrOworCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwkJbmV3X3BpYyA9ICZody0+cGljc1tpbmRleF07CisJCWlmICh2ZGVjLT5tdmZybSkgeworCQkJbmV3X3BpYy0+ZnJhbWVfc2l6ZSA9IHZkZWMtPm12ZnJtLT5mcmFtZV9zaXplOworCQkJbmV3X3BpYy0+aHdfZGVjb2RlX3RpbWUgPQorCQkJbG9jYWxfY2xvY2soKSAtIHZkZWMtPm12ZnJtLT5od19kZWNvZGVfc3RhcnQ7CisJCX0KKworCQl0bXBfdyA9IFJFQURfVlJFRyhNUkVHX1BJQ19XSURUSCk7CisJCXRtcF9oID0gUkVBRF9WUkVHKE1SRUdfUElDX0hFSUdIVCk7CisKKwkJbmV3X3BpYy0+d2lkdGggPSB0bXBfdzsKKwkJaHctPmZyYW1lX3dpZHRoID0gdG1wX3c7CisJCW5ld19waWMtPmhlaWdodCA9IHRtcF9oOworCQlody0+ZnJhbWVfaGVpZ2h0ID0gdG1wX2g7CisKKwkJbmV3X3BpYy0+YnVmZmVyX2luZm8gPSBpbmZvOworCQluZXdfcGljLT5vZmZzZXQgPSBvZmZzZXQ7CisJCW5ld19waWMtPmluZGV4ID0gaW5kZXg7CisJCWlmICgoKGluZm8gJiBQSUNJTkZPX1RZUEVfTUFTSykgPT0gUElDSU5GT19UWVBFX0kpIHx8CisJCQkoKGluZm8gJiBQSUNJTkZPX1RZUEVfTUFTSykgPT0gUElDSU5GT19UWVBFX1ApKSB7CisJCQlpZiAoaHctPmNodW5rKSB7CisJCQkJbmV3X3BpYy0+cHRzX3ZhbGlkID0gaHctPmNodW5rLT5wdHNfdmFsaWQ7CisJCQkJbmV3X3BpYy0+cHRzID0gaHctPmNodW5rLT5wdHM7CisJCQkJbmV3X3BpYy0+cHRzNjQgPSBody0+Y2h1bmstPnB0czY0OworCQkJCWlmIChody0+Zmlyc3RfZmllbGRfdGltZXN0YW1wX3ZhbGlkKQorCQkJCQluZXdfcGljLT5sYXN0X3RpbWVzdGFtcCA9IGh3LT5maXJzdF9maWVsZF90aW1lc3RhbXA7CisJCQkJZWxzZQorCQkJCQluZXdfcGljLT5sYXN0X3RpbWVzdGFtcCA9IGh3LT5jaHVuay0+dGltZXN0YW1wOworCQkJCWh3LT5maXJzdF9maWVsZF90aW1lc3RhbXBfdmFsaWQgPSBmYWxzZTsKKwkJCQluZXdfcGljLT50aW1lc3RhbXAgPSBody0+Y2h1bmstPnRpbWVzdGFtcDsKKwkJCQlpZiAoaHctPmxhc3RfY2h1bmtfcHRzID09IGh3LT5jaHVuay0+cHRzKSB7CisJCQkJCW5ld19waWMtPnB0c192YWxpZCA9IDA7CisJCQkJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVElNRUlORk8sCisJCQkJCQkicHRzIGludmFsaWRcbiIpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKCh2ZGVjLT52YnVmLm5vX3BhcnNlciA9PSAwKSB8fCAodmRlYy0+dmJ1Zi51c2VfcHRzc2VydikpIHsKKwkJCQkJaWYgKHB0c19sb29rdXBfb2Zmc2V0X3VzNjQoUFRTX1RZUEVfVklERU8sIG9mZnNldCwKKwkJCQkJCSZwdHMsICZmcmFtZV9zaXplLCAwLCAmcHRzX3VzNjQpID09IDApIHsKKwkJCQkJCW5ld19waWMtPnB0c192YWxpZCA9IHRydWU7CisJCQkJCQluZXdfcGljLT5wdHMgPSBwdHM7CisJCQkJCQluZXdfcGljLT5wdHM2NCA9IHB0c191czY0OworCQkJCQl9IGVsc2UKKwkJCQkJCW5ld19waWMtPnB0c192YWxpZCA9IGZhbHNlOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChody0+Y2h1bmspIHsKKwkJCQlody0+bGFzdF9jaHVua19wdHMgPSBody0+Y2h1bmstPnB0czsKKwkJCQlpZiAoaHctPmZpcnN0X2ZpZWxkX3RpbWVzdGFtcF92YWxpZCkKKwkJCQkJbmV3X3BpYy0+bGFzdF90aW1lc3RhbXAgPSBody0+Zmlyc3RfZmllbGRfdGltZXN0YW1wOworCQkJCWVsc2UKKwkJCQkJbmV3X3BpYy0+bGFzdF90aW1lc3RhbXAgPSBody0+Y2h1bmstPnRpbWVzdGFtcDsKKwkJCQlody0+Zmlyc3RfZmllbGRfdGltZXN0YW1wX3ZhbGlkID0gZmFsc2U7CisJCQkJbmV3X3BpYy0+dGltZXN0YW1wID0gaHctPmNodW5rLT50aW1lc3RhbXA7CisJCQl9CisJCQluZXdfcGljLT5wdHNfdmFsaWQgPSBmYWxzZTsKKwkJfQorCisJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfUlVOX0ZMT1csCisJCQkibW1wZWcxMjogbmV3X3BpYz0lZCwgaW5kPSVkLCBpbmZvPSV4LCBzZXE9JXgsIG9mZnNldD0lZFxuIiwKKwkJCWh3LT5kZWNfbnVtLCBpbmRleCwgaW5mbywgc2VxaW5mbywgb2Zmc2V0KTsKKworCQlody0+ZnJhbWVfcHJvZyA9IGluZm8gJiBQSUNJTkZPX1BST0c7CisjaWYgMQorCQlpZiAoKHNlcWluZm8gJiBTRVFJTkZPX0VYVF9BVkFJTEFCTEUpICYmCisJCQkoKHNlcWluZm8gJiBTRVFJTkZPX1BST0cpID09IDApKQorCQkJaHctPmZyYW1lX3Byb2cgPSAwOworI2VuZGlmCisJCWZvcmNlX2ludGVybGFjZV9jaGVjayhodyk7CisKKwkJaWYgKGlzX3JlZl9lcnJvcihodykpIHsKKwkJCWlmICgoaW5mbyAmIFBJQ0lORk9fVFlQRV9NQVNLKSA9PSBQSUNJTkZPX1RZUEVfQikKKwkJCQluZXdfcGljLT5idWZmZXJfaW5mbyB8PSBQSUNJTkZPX0VSUk9SOworCQl9CisKKwkJaWYgKCgoaW5mbyAmIFBJQ0lORk9fVFlQRV9NQVNLKSA9PSBQSUNJTkZPX1RZUEVfSSkgfHwKKwkJCSgoaW5mbyAmIFBJQ0lORk9fVFlQRV9NQVNLKSA9PSBQSUNJTkZPX1RZUEVfUCkpIHsKKwkJCWluZGV4ID0gdXBkYXRlX3JlZmVyZW5jZShodywgaW5kZXgpOworCQl9IGVsc2UgeworCQkJLyogZHJvcCBiIGZyYW1lIGJlZm9yZSByZWZlcmVuY2UgcGljIHJlYWR5ICovCisJCQlpZiAoaHctPnJlZnNbMF0gPT0gLTEpCisJCQkJaW5kZXggPSBody0+YnVmX251bTsKKwkJfQorCQl2bXBlZzEyX3NhdmVfaHdfY29udGV4dChodywgcmVnKTsKKworCQlpZiAoaW5kZXggPj0gaHctPmJ1Zl9udW0pIHsKKwkJCWlmIChody0+ZGVjX251bSAhPSAyKSB7CisJCQkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCQkibW1wZWcxMjogZHJvcCBwaWMgbnVtICVkLCB0eXBlICVjLCBpbmRleCAlZCwgb2Zmc2V0ICV4XG4iLAorCQkJCWh3LT5kZWNfbnVtLCBHRVRfU0xJQ0VfVFlQRShpbmZvKSwgaW5kZXgsIG9mZnNldCk7CisJCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0VSUk9SOworCQkJfQorCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKworCQlkaXNwX3BpYyA9ICZody0+cGljc1tpbmRleF07CisJCWluZm8gPSBody0+cGljc1tpbmRleF0uYnVmZmVyX2luZm87CisJCWlmIChkaXNwX3BpYy0+cHRzX3ZhbGlkICYmIGh3LT5sYXN0cHRzNjQgPT0gZGlzcF9waWMtPnB0czY0KQorCQkJZGlzcF9waWMtPnB0c192YWxpZCA9IGZhbHNlOworCQlpZiAoZGlzcF9waWMtPnB0c192YWxpZCkKKwkJCWh3LT5sYXN0cHRzNjQgPSBkaXNwX3BpYy0+cHRzNjQ7CisKKwkJaWYgKGlucHV0X2ZyYW1lX2Jhc2VkKGh3X3RvX3ZkZWMoaHcpKSkKKwkJCWZyYW1lX3NpemUgPSBuZXdfcGljLT5mcmFtZV9zaXplOworCisJCWZpbGxfZnJhbWVfaW5mbyhodywgaW5mbywgZnJhbWVfc2l6ZSwgbmV3X3BpYy0+cHRzKTsKKworCQlpZiAoKGh3LT5maXJzdF9pX2ZyYW1lX3JlYWR5ID09IDApICYmCisJCQkoKGluZm8gJiBQSUNJTkZPX1RZUEVfTUFTSykgPT0gUElDSU5GT19UWVBFX0kpICYmCisJCQkoKGluZm8gJiBQSUNJTkZPX0VSUk9SKSA9PSAwKSkgeworCQkJaHctPmZpcnN0X2lfZnJhbWVfcmVhZHkgPSAxOworCQl9CisKKwkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19SVU5fRkxPVywKKwkJCSJtbXBlZzEyOiBkaXNwX3BpYz0lZCglYyksIGluZD0lZCwgb2Zmc3Q9JXgsIHB0cz0oJWQsJWxsZCwlbGxkKSglZClcbiIsCisJCQlody0+ZGlzcF9udW0sIEdFVF9TTElDRV9UWVBFKGluZm8pLCBpbmRleCwgZGlzcF9waWMtPm9mZnNldCwKKwkJCWRpc3BfcGljLT5wdHMsIGRpc3BfcGljLT5wdHM2NCwKKwkJCWRpc3BfcGljLT50aW1lc3RhbXAsIGRpc3BfcGljLT5wdHNfdmFsaWQpOworCisJCXByZXBhcmVfZGlzcGxheV9idWYoaHcsIGRpc3BfcGljKTsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorc3RhdGljIGlycXJldHVybl90IHZtcGVnMTJfaXNyKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBpcnEpCit7CisJdTMyIGluZm8sIG9mZnNldDsKKwlzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcgPQorCShzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqKSh2ZGVjLT5wcml2YXRlKTsKKwlpZiAoaHctPmVvcykKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCWluZm8gPSBSRUFEX1ZSRUcoTVJFR19QSUNfSU5GTyk7CisJb2Zmc2V0ID0gUkVBRF9WUkVHKE1SRUdfRlJBTUVfT0ZGU0VUKTsKKworCXZkZWNfY291bnRfaW5mbygmaHctPmd2cywgaW5mbyAmIFBJQ0lORk9fRVJST1IsIG9mZnNldCk7CisJaWYgKGluZm8gJlBJQ0lORk9fRVJST1IpIHsKKwkJaWYgKChpbmZvICYgUElDSU5GT19UWVBFX01BU0spID09IFBJQ0lORk9fVFlQRV9JKSB7CisJCQlody0+Z3ZzLmlfY29uY2VhbGVkX2ZyYW1lcysrOworCQl9IGVsc2UgaWYgKChpbmZvICYgUElDSU5GT19UWVBFX01BU0spID09IFBJQ0lORk9fVFlQRV9QKSB7CisJCQlody0+Z3ZzLnBfY29uY2VhbGVkX2ZyYW1lcysrOworCQl9IGVsc2UgaWYgKChpbmZvICYgUElDSU5GT19UWVBFX01BU0spID09IFBJQ0lORk9fVFlQRV9CKSB7CisJCQlody0+Z3ZzLmJfY29uY2VhbGVkX2ZyYW1lcysrOworCQl9CisJfQorCWlmIChvZmZzZXQpIHsKKwkJaWYgKChpbmZvICYgUElDSU5GT19UWVBFX01BU0spID09IFBJQ0lORk9fVFlQRV9JKSB7CisJCQlody0+Z3ZzLmlfZGVjb2RlZF9mcmFtZXMrKzsKKwkJfSBlbHNlIGlmICgoaW5mbyAmIFBJQ0lORk9fVFlQRV9NQVNLKSA9PSBQSUNJTkZPX1RZUEVfUCkgeworCQkJaHctPmd2cy5wX2RlY29kZWRfZnJhbWVzKys7CisJCX0gZWxzZSBpZiAoKGluZm8gJiBQSUNJTkZPX1RZUEVfTUFTSykgPT0gUElDSU5GT19UWVBFX0IpIHsKKwkJCWh3LT5ndnMuYl9kZWNvZGVkX2ZyYW1lcysrOworCQl9CisJfQorCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfQ0xSX1JFRywgMSk7CisKKwlyZXR1cm4gSVJRX1dBS0VfVEhSRUFEOworfQorCitzdGF0aWMgdm9pZCB2bXBlZzEyX25vdGlmeV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcgPSBjb250YWluZXJfb2Yod29yaywKKwkJCQkJc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MsIG5vdGlmeV93b3JrKTsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisKKwlpZiAoIWh3LT5pc191c2VkX3Y0bCAmJiB2ZGVjLT5mcl9oaW50X3N0YXRlID09IFZERUNfTkVFRF9ISU5UKSB7CisJCXZmX25vdGlmeV9yZWNlaXZlcih2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9GUl9ISU5ULAorCQkJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKWh3LT5mcmFtZV9kdXIpKTsKKwkJdmRlYy0+ZnJfaGludF9zdGF0ZSA9IFZERUNfSElOVEVEOworCX0KK30KKworc3RhdGljIHZvaWQgd2FpdF92bW1wZWcxMl9zZWFyY2hfZG9uZShzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcpCit7CisJdTMyIHZsZF9ycCA9IFJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCk7CisJaW50IGNvdW50ID0gMDsKKworCWRvIHsKKwkJdXNsZWVwX3JhbmdlKDEwMCwgNTAwKTsKKwkJaWYgKHZsZF9ycCA9PSBSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApKQorCQkJYnJlYWs7CisJCWlmIChjb3VudCA+IDEwMDApIHsKKwkJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkJCSIlcywgY291bnQgJWQgIHZsZF9ycCAweCV4IFZMRF9NRU1fVklGSUZPX1JQIDB4JXhcbiIsCisJCQkJCV9fZnVuY19fLCBjb3VudCwgdmxkX3JwLCBSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApKTsKKwkJCWJyZWFrOworCQl9IGVsc2UKKwkJCXZsZF9ycCA9IFJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCk7CisJCWNvdW50Kys7CisJfSB3aGlsZSAoMSk7Cit9CisKK3N0YXRpYyB2b2lkIGZsdXNoX291dHB1dChzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcpCit7CisJaW50IGluZGV4ID0gaHctPnJlZnNbMV07CisKKwkvKiB2aWRlbyBvbmx5IG9uZSBmcmFtZSBuZWVkIG5vdCBmbHVzaC4gKi8KKwlpZiAoaHctPmRlY19udW0gPCAyKQorCQlyZXR1cm47CisKKwlpZiAoKGh3LT5yZWZzWzBdID49IDApICYmCisJCShody0+cmVmc1swXSA8IGh3LT5idWZfbnVtKSkKKwkJaHctPnJlZl91c2VbaHctPnJlZnNbMF1dID0gMDsKKworCWlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgaHctPmJ1Zl9udW0pIHsKKwkJaHctPnJlZl91c2VbaW5kZXhdID0gMDsKKwkJcHJlcGFyZV9kaXNwbGF5X2J1ZihodywgJmh3LT5waWNzW2luZGV4XSk7CisJfQorfQorCitzdGF0aWMgYm9vbCBpc19hdmFsaWFibGVfYnVmZmVyKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodyk7CisKK3N0YXRpYyBpbnQgbm90aWZ5X3Y0bF9lb3Moc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcgPSAoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKil2ZGVjLT5wcml2YXRlOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShody0+djRsMl9jdHgpOworCXN0cnVjdCB2ZnJhbWVfcyAqdmYgPSAmaHctPnZmcmFtZV9kdW1teTsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPSBOVUxMOworCWludCBpbmRleCA9IElOVkFMSURfSURYOworCXVsb25nIGV4cGlyZXM7CisKKwlpZiAoaHctPmVvcykgeworCQlleHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjAwMCk7CisJCXdoaWxlICghaXNfYXZhbGlhYmxlX2J1ZmZlcihodykpIHsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGV4cGlyZXMpKSB7CisJCQkJcHJfZXJyKCJbJWRdIE1QRUcyIGlzbid0IGVub3VnaCBidWZmIGZvciBub3RpZnkgZW9zLlxuIiwgY3R4LT5pZCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKworCQlpbmRleCA9IGZpbmRfZnJlZV9idWZmZXIoaHcpOworCQlpZiAoSU5WQUxJRF9JRFggPT0gaW5kZXgpIHsKKwkJCXByX2VycigiWyVkXSBNUEVHMiBFT1MgZ2V0IGZyZWUgYnVmZiBmYWlsLlxuIiwgY3R4LT5pZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWZiID0gKHN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICopCisJCQlody0+cGljc1tpbmRleF0udjRsX3JlZl9idWZfYWRkcjsKKworCQl2Zi0+dHlwZQkJfD0gVklEVFlQRV9WNExfRU9TOworCQl2Zi0+dGltZXN0YW1wCQk9IFVMT05HX01BWDsKKwkJdmYtPnY0bF9tZW1faGFuZGxlCT0gKHVsb25nKWZiOworCQl2Zi0+ZmxhZwkJPSBWRlJBTUVfRkxBR19FTVBUWV9GUkFNRV9WNEw7CisKKwkJdmRlY192ZnJhbWVfcmVhZHkodmRlYywgdmYpOworCQlrZmlmb19wdXQoJmh3LT5kaXNwbGF5X3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT5wdHNfbmFtZSwgdmYtPnRpbWVzdGFtcCk7CisKKwkJQVRSQUNFX0NPVU5URVIoIlZDX09VVF9ERUMtc3VibWl0IiwgZmItPmJ1Zl9pZHgpOworCQlmYi0+dGFzay0+c3VibWl0KGZiLT50YXNrLCBUQVNLX1RZUEVfREVDKTsKKworCQlwcl9pbmZvKCJbJWRdIG1wZWcxMiBFT1Mgbm90aWZ5LlxuIiwgY3R4LT5pZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZtcGVnMTJfd29ya19pbXBsZW1lbnQoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3LAorCXN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBmcm9tKQoreworCWludCByOworCisJaWYgKGh3LT5kZWNfcmVzdWx0ICE9IERFQ19SRVNVTFRfRE9ORSkKKwkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19SVU5fRkxPVywKKwkJCSIlcywgcmVzdWx0PSVkLCBzdGF0dXM9JWRcbiIsIF9fZnVuY19fLAorCQkJaHctPmRlY19yZXN1bHQsIHZkZWMtPm5leHRfc3RhdHVzKTsKKworCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy13b3JrX3N0YXRlIiwgaHctPmRlY19yZXN1bHQpOworCisJaWYgKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfRE9ORSkgeworCQlpZiAodmRlYy0+aW5wdXQuc3dhcF92YWxpZCkKKwkJCWh3LT5kZWNfYWdhaW5fY250ID0gMDsKKwkJdmRlY192ZnJhbWVfZGlydHkodmRlYywgaHctPmNodW5rKTsKKwkJaHctPmNodW5rID0gTlVMTDsKKwkJaHctPmNodW5rX2hlYWRlcl9vZmZzZXQgPSAwOworCQlody0+Y2h1bmtfcmVzX3NpemUgPSAwOworCX0gZWxzZSBpZiAoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9BR0FJTiAmJgorCSh2ZGVjLT5uZXh0X3N0YXR1cyAhPSBWREVDX1NUQVRVU19ESVNDT05ORUNURUQpKSB7CisJCS8qCisJCQlzdHJlYW0gYmFzZTogc3RyZWFtIGJ1ZiBlbXB0eSBvciB0aW1lb3V0CisJCQlmcmFtZSBiYXNlOiB2ZGVjX3ByZXBhcmVfaW5wdXQgZmFpbAorCQkqLworCQlpZiAoIXZkZWNfaGFzX21vcmVfaW5wdXQodmRlYykpIHsKKwkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9FT1M7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCXJldHVybjsKKwkJfQorI2lmZGVmIEFHQUlOX0hBU19USFJFU0hPTEQKKwkJaHctPm5leHRfYWdhaW5fZmxhZyA9IDE7CisjZW5kaWYKKwkJLy9ody0+ZGVjX2FnYWluX2NudCsrOworCX0gZWxzZSBpZiAoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9HRVRfREFUQSAmJgorCQl2ZGVjLT5uZXh0X3N0YXR1cyAhPSBWREVDX1NUQVRVU19ESVNDT05ORUNURUQpIHsKKwkJaWYgKCF2ZGVjX2hhc19tb3JlX2lucHV0KHZkZWMpKSB7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRU9TOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQlyZXR1cm47CisJCX0KKwkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WTERfREVUQUlMLAorCQkJIiVzIERFQ19SRVNVTFRfR0VUX0RBVEEgJXggJXggJXhcbiIsCisJCQlfX2Z1bmNfXywKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCksCisJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSk7CisJCWlmIChody0+Y2h1bmsgIT0gTlVMTCkgeworCQkJaHctPmZpcnN0X2ZpZWxkX3RpbWVzdGFtcCA9IGh3LT5jaHVuay0+dGltZXN0YW1wOworCQkJaHctPmZpcnN0X2ZpZWxkX3RpbWVzdGFtcF92YWxpZCA9IHRydWU7CisJCX0KKworCQl2ZGVjX3ZmcmFtZV9kaXJ0eSh2ZGVjLCBody0+Y2h1bmspOworCQlody0+Y2h1bmtfaGVhZGVyX29mZnNldCA9IDA7CisJCWh3LT5jaHVua19yZXNfc2l6ZSA9IDA7CisJCWh3LT5jaHVuayA9IE5VTEw7CisJCXZkZWNfY2xlYW5faW5wdXQodmRlYyk7CisKKwkJciA9IHZkZWNfcHJlcGFyZV9pbnB1dCh2ZGVjLCAmaHctPmNodW5rKTsKKwkJaWYgKHIgPCAwKSB7CisJCQlody0+aW5wdXRfZW1wdHkrKzsKKwkJCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfR0VUX0RBVEE7CisJCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RFQ19ERVRBSUwsCisJCQkJIiVzOiBJbnN1ZmZpY2llbnQgZGF0YSwgZ2V0IGRhdGEgcmV0cnlcbiIsIF9fZnVuY19fKTsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJcmV0dXJuOworCQl9CisKKwkJaHctPmlucHV0X2VtcHR5ID0gMDsKKwkJaWYgKHZkZWNfZnJhbWVfYmFzZWQodmRlYykgJiYgKGh3LT5jaHVuayAhPSBOVUxMKSkgeworCQkJciA9IGh3LT5jaHVuay0+c2l6ZSArCisJCQkJKGh3LT5jaHVuay0+b2Zmc2V0ICYgKFZERUNfRklGT19BTElHTiAtIDEpKTsKKwkJCVdSSVRFX1ZSRUcoVklGRl9CSVRfQ05ULCByICogOCk7CisJCQlpZiAodmRlYy0+bXZmcm0pCisJCQkJdmRlYy0+bXZmcm0tPmZyYW1lX3NpemUgKz0gaHctPmNodW5rLT5zaXplOworCQl9CisJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkiJXM6ICV4ICV4ICV4IHNpemUgJWQsIGJpdGNudCAlZFxuIiwKKwkJCV9fZnVuY19fLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKSwKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19XUCksCisJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fUlApLAorCQkJciwgUkVBRF9WUkVHKFZJRkZfQklUX0NOVCkpOworCQl2ZGVjX2VuYWJsZV9pbnB1dCh2ZGVjKTsKKwkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX05PTkU7CisJCWh3LT5sYXN0X3ZsZF9sZXZlbCA9IDA7CisJCXN0YXJ0X3Byb2Nlc3NfdGltZV9zZXQoaHcpOworCQlody0+aW5pdF9mbGFnID0gMTsKKwkJbW9kX3RpbWVyKCZody0+Y2hlY2tfdGltZXIsIGppZmZpZXMgKyBDSEVDS19JTlRFUlZBTCk7CisJCVdSSVRFX1ZSRUcoTVJFR19CVUZGRVJPVVQsIDApOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0ZPUkNFX0VYSVQpIHsKKwkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19FUlJPUiwKKwkJCSIlczogZm9yY2UgZXhpdFxuIiwgX19mdW5jX18pOworCQlpZiAoaHctPnN0YXQgJiBTVEFUX0lTUl9SRUcpIHsKKwkJCWFtdmRlY19zdG9wKCk7CisJCQl2ZGVjX2ZyZWVfaXJxKFZERUNfSVJRXzEsICh2b2lkICopaHcpOworCQkJaHctPnN0YXQgJj0gflNUQVRfSVNSX1JFRzsKKwkJfQorCX0gZWxzZSBpZiAoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9FT1MpIHsKKwkJaWYgKGh3LT5zdGF0ICYgU1RBVF9WREVDX1JVTikgeworCQkJYW12ZGVjX3N0b3AoKTsKKwkJCWh3LT5zdGF0ICY9IH5TVEFUX1ZERUNfUlVOOworCQl9CisJCWh3LT5lb3MgPSAxOworCQl2ZGVjX3ZmcmFtZV9kaXJ0eSh2ZGVjLCBody0+Y2h1bmspOworCQlody0+Y2h1bmtfaGVhZGVyX29mZnNldCA9IDA7CisJCWh3LT5jaHVua19yZXNfc2l6ZSA9IDA7CisJCWh3LT5jaHVuayA9IE5VTEw7CisJCXZkZWNfY2xlYW5faW5wdXQodmRlYyk7CisJCWZsdXNoX291dHB1dChodyk7CisJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy1zdWJtaXRfZW9zIiwgX19MSU5FX18pOworCQkJbm90aWZ5X3Y0bF9lb3ModmRlYyk7CisJCQlBVFJBQ0VfQ09VTlRFUigiVl9TVF9ERUMtc3VibWl0X2VvcyIsIDApOworCQl9CisKKwkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSIlczogZW5kIG9mIHN0cmVhbSwgbnVtICVkKCVkKVxuIiwKKwkJCV9fZnVuY19fLCBody0+ZGlzcF9udW0sIGh3LT5kZWNfbnVtKTsKKwl9CisJaWYgKGh3LT5zdGF0ICYgU1RBVF9WREVDX1JVTikgeworCQlhbXZkZWNfc3RvcCgpOworCQlody0+c3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwl9CisJLypkaXNhYmxlIG1ib3ggaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfTUFTSywgMCk7CisJZGVsX3RpbWVyX3N5bmMoJmh3LT5jaGVja190aW1lcik7CisJaHctPnN0YXQgJj0gflNUQVRfVElNRVJfQVJNOworCXdhaXRfdm1tcGVnMTJfc2VhcmNoX2RvbmUoaHcpOworCisJaWYgKGZyb20gPT0gMSkgeworCQkvKlRoaXMgaXMgYSB0aW1lb3V0IHdvcmsqLworCQlpZiAod29ya19wZW5kaW5nKCZody0+d29yaykpIHsKKwkJCXByX2VycigidGltZW91dCB3b3JrIHJldHVybiBiZWZvciBmaW5pc2hpbmcuIik7CisJCQkvKgorCQkJICogVGhlIHZtcGVnMTJfd29yayBhcnJpdmVzIGF0IHRoZSBsYXN0IHNlY29uZCwKKwkJCSAqIGdpdmUgaXQgYSBjaGFuY2UgdG8gaGFuZGxlIHRoZSBzY2VuYXJpby4KKwkJCSAqLworCQkJcmV0dXJuOworCQl9CisJfQorCisJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKQorCQl2ZGVjX2NvcmVfZmluaXNoX3J1bih2ZGVjLCBDT1JFX01BU0tfVkRFQ18xKTsKKwllbHNlCisJCXZkZWNfY29yZV9maW5pc2hfcnVuKHZkZWMsIENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQyk7CisKKwlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KTsKKworCQlpZiAoY3R4LT5wYXJhbV9zZXRzX2Zyb21fdWNvZGUgJiYKKwkJCSFody0+djRsX3BhcmFtc19wYXJzZWQpCisJCQl2ZGVjX3Y0bF93cml0ZV9mcmFtZV9zeW5jKGN0eCk7CisJfQorCisJQVRSQUNFX0NPVU5URVIoIlZfU1RfREVDLWNodW5rX3NpemUiLCAwKTsKKworCWlmIChody0+dmRlY19jYikKKwkJaHctPnZkZWNfY2IodmRlYywgaHctPnZkZWNfY2JfYXJnKTsKK30KKworc3RhdGljIHZvaWQgdm1wZWcxMl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcgPQorCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcywgd29yayk7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaHcpOworCisJdm1wZWcxMl93b3JrX2ltcGxlbWVudChodywgdmRlYywgMCk7Cit9CitzdGF0aWMgdm9pZCB2bXBlZzEyX3RpbWVvdXRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3ID0KKwljb250YWluZXJfb2Yod29yaywgc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MsIHRpbWVvdXRfd29yayk7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaHcpOworCisJaWYgKHdvcmtfcGVuZGluZygmaHctPndvcmspKSB7CisJCXByX2VycigidGltZW91dCB3b3JrIHJldHVybiBiZWZvciBleGVjdXRpbmcuIik7CisJCXJldHVybjsKKwl9CisKKwlody0+dGltZW91dF9wcm9jZXNzaW5nID0gMTsKKwl2bXBlZzEyX3dvcmtfaW1wbGVtZW50KGh3LCB2ZGVjLCAxKTsKK30KKworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyAqdm1wZWdfdmZfcGVlayh2b2lkICpvcF9hcmcpCit7CisJc3RydWN0IHZmcmFtZV9zICp2ZjsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gb3BfYXJnOworCXN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodyA9CisJKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICopdmRlYy0+cHJpdmF0ZTsKKwlhdG9taWNfYWRkKDEsICZody0+cGVla19udW0pOworCWlmIChrZmlmb19wZWVrKCZody0+ZGlzcGxheV9xLCAmdmYpKQorCQlyZXR1cm4gdmY7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyAqdm1wZWdfdmZfZ2V0KHZvaWQgKm9wX2FyZykKK3sKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBvcF9hcmc7CisJc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3ID0KKwkJKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICopdmRlYy0+cHJpdmF0ZTsKKworCWlmIChrZmlmb19nZXQoJmh3LT5kaXNwbGF5X3EsICZ2ZikpIHsKKwkJdmYtPmluZGV4X2Rpc3AgPSBhdG9taWNfcmVhZCgmaHctPmdldF9udW0pOworCQlhdG9taWNfYWRkKDEsICZody0+Z2V0X251bSk7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT5kaXNwX3FfbmFtZSwga2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKSk7CisJCXJldHVybiB2ZjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgbXBlZzEyX3ZhbGlkX3ZmX2NoZWNrKHN0cnVjdCB2ZnJhbWVfcyAqdmYsIHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodykKK3sKKwlpbnQgaTsKKworCWlmICh2ZiA9PSBOVUxMIHx8ICh2Zi0+aW5kZXggPT0gLTEpKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBWRl9QT09MX1NJWkU7IGkrKykgeworCQlpZiAodmYgPT0gJmh3LT52ZnBvb2xbaV0pCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdm1wZWdfdmZfcHV0KHN0cnVjdCB2ZnJhbWVfcyAqdmYsIHZvaWQgKm9wX2FyZykKK3sKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gb3BfYXJnOworCXN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodyA9CisJCShzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghbXBlZzEyX3ZhbGlkX3ZmX2NoZWNrKHZmLCBodykpIHsKKwkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19FUlJPUiwKKwkJCSJpbnZhbGlkIHZmOiAlbHhcbiIsICh1bG9uZyl2Zik7CisJCXJldHVybiA7CisJfQorCisJaWYgKHZmLT5tZXRhX2RhdGFfYnVmKSB7CisJCXZmLT5tZXRhX2RhdGFfYnVmID0gTlVMTDsKKwkJdmYtPm1ldGFfZGF0YV9zaXplID0gMDsKKwl9CisKKwlpZiAodmYtPnY0bF9tZW1faGFuZGxlICE9CisJCWh3LT5waWNzW3ZmLT5pbmRleF0udjRsX3JlZl9idWZfYWRkcikgeworCQlody0+cGljc1t2Zi0+aW5kZXhdLnY0bF9yZWZfYnVmX2FkZHIKKwkJCT0gdmYtPnY0bF9tZW1faGFuZGxlOworCisJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVjRMX0RFVEFJTCwKKwkJCSJNUEVHMTIgdXBkYXRlIGZiIGhhbmRsZSwgb2xkOiVsbHgsIG5ldzolbGx4XG4iLAorCQkJaHctPnBpY3NbdmYtPmluZGV4XS52NGxfcmVmX2J1Zl9hZGRyLAorCQkJdmYtPnY0bF9tZW1faGFuZGxlKTsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5sb2NrLCBmbGFncyk7CisJaHctPnZmYnVmX3VzZVt2Zi0+aW5kZXhdLS07CisJaWYgIChody0+dmZidWZfdXNlW3ZmLT5pbmRleF0gPCAwKSB7CisJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRVJST1IsCisJCQkid2FybjogdmYgJWx4LCBpbmRleCAlZCBwdXRiYWNrIHJlcGV0aXRpdmUsIHNldCB1c2UgdG8gMFxuIiwgKHVsb25nKXZmLCB2Zi0+aW5kZXgpOworCQlody0+dmZidWZfdXNlW3ZmLT5pbmRleF0gPSAwOworCX0KKwlhdG9taWNfYWRkKDEsICZody0+cHV0X251bSk7CisJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19SVU5fRkxPVywKKwkJIiVzOiB2ZjogJWx4LCBpbmRleDogJWQsIHVzZTogJWRcbiIsIF9fZnVuY19fLCAodWxvbmcpdmYsCisJCXZmLT5pbmRleCwgaHctPnZmYnVmX3VzZVt2Zi0+aW5kZXhdKTsKKworCWtmaWZvX3B1dCgmaHctPm5ld2ZyYW1lX3EsCisJCShjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJQVRSQUNFX0NPVU5URVIoaHctPm5ld19xX25hbWUsIGtmaWZvX2xlbigmaHctPm5ld2ZyYW1lX3EpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHZtcGVnX2V2ZW50X2NiKGludCB0eXBlLCB2b2lkICpkYXRhLCB2b2lkICpvcF9hcmcpCit7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IG9wX2FyZzsKKworCWlmICh0eXBlICYgVkZSQU1FX0VWRU5UX1JFQ0VJVkVSX1JFUV9TVEFURSkgeworCQlzdHJ1Y3QgcHJvdmlkZXJfc3RhdGVfcmVxX3MgKnJlcSA9CisJCQkoc3RydWN0IHByb3ZpZGVyX3N0YXRlX3JlcV9zICopZGF0YTsKKwkJaWYgKHJlcS0+cmVxX3R5cGUgPT0gUkVRX1NUQVRFX1NFQ1VSRSkKKwkJCXJlcS0+cmVxX3Jlc3VsdFswXSA9IHZkZWNfc2VjdXJlKHZkZWMpOworCQllbHNlCisJCQlyZXEtPnJlcV9yZXN1bHRbMF0gPSAweGZmZmZmZmZmOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZtcGVnX3ZmX3N0YXRlcyhzdHJ1Y3QgdmZyYW1lX3N0YXRlcyAqc3RhdGVzLCB2b2lkICpvcF9hcmcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gb3BfYXJnOworCXN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodyA9CisJCShzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmxvY2ssIGZsYWdzKTsKKworCXN0YXRlcy0+dmZfcG9vbF9zaXplID0gVkZfUE9PTF9TSVpFOworCXN0YXRlcy0+YnVmX2ZyZWVfbnVtID0ga2ZpZm9fbGVuKCZody0+bmV3ZnJhbWVfcSk7CisJc3RhdGVzLT5idWZfYXZhaWxfbnVtID0ga2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKTsKKwlzdGF0ZXMtPmJ1Zl9yZWN5Y2xlX251bSA9IDA7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorc3RhdGljIGludCB2bW1wZWcxMl9kZWNfc3RhdHVzKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHN0cnVjdCB2ZGVjX2luZm8gKnZzdGF0dXMpCit7CisJc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3ID0KKwkoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKil2ZGVjLT5wcml2YXRlOworCisJaWYgKCFodykKKwkJcmV0dXJuIC0xOworCisJdnN0YXR1cy0+ZnJhbWVfd2lkdGggPSBody0+ZnJhbWVfd2lkdGg7CisJdnN0YXR1cy0+ZnJhbWVfaGVpZ2h0ID0gaHctPmZyYW1lX2hlaWdodDsKKwlpZiAoaHctPmZyYW1lX2R1ciAhPSAwKQorCQl2c3RhdHVzLT5mcmFtZV9yYXRlID0gKCg5NjAwMCAqIDEwIC8gaHctPmZyYW1lX2R1cikgJSAxMCkgPCA1ID8KKwkJICAgICAgICAgICAgICAgICAgICA5NjAwMCAvIGh3LT5mcmFtZV9kdXIgOiAoOTYwMDAgLyBody0+ZnJhbWVfZHVyICsxKTsKKwllbHNlCisJCXZzdGF0dXMtPmZyYW1lX3JhdGUgPSAtMTsKKwl2c3RhdHVzLT5lcnJvcl9jb3VudCA9IFJFQURfVlJFRyhBVl9TQ1JBVENIX0MpOworCXZzdGF0dXMtPnN0YXR1cyA9IGh3LT5zdGF0OworCXZzdGF0dXMtPmJpdF9yYXRlID0gaHctPmd2cy5iaXRfcmF0ZTsKKwl2c3RhdHVzLT5mcmFtZV9kdXIgPSBody0+ZnJhbWVfZHVyOworCXZzdGF0dXMtPmZyYW1lX2RhdGEgPSBody0+Z3ZzLmZyYW1lX2RhdGE7CisJdnN0YXR1cy0+dG90YWxfZGF0YSA9IGh3LT5ndnMudG90YWxfZGF0YTsKKwl2c3RhdHVzLT5mcmFtZV9jb3VudCA9IGh3LT5ndnMuZnJhbWVfY291bnQ7CisJdnN0YXR1cy0+ZXJyb3JfZnJhbWVfY291bnQgPSBody0+Z3ZzLmVycm9yX2ZyYW1lX2NvdW50OworCXZzdGF0dXMtPmRyb3BfZnJhbWVfY291bnQgPSBody0+ZHJvcF9mcmFtZV9jb3VudDsKKwl2c3RhdHVzLT5pX2RlY29kZWRfZnJhbWVzID0gaHctPmd2cy5pX2RlY29kZWRfZnJhbWVzOworCXZzdGF0dXMtPmlfbG9zdF9mcmFtZXMgPSBody0+Z3ZzLmlfbG9zdF9mcmFtZXM7CisJdnN0YXR1cy0+aV9jb25jZWFsZWRfZnJhbWVzID0gaHctPmd2cy5pX2NvbmNlYWxlZF9mcmFtZXM7CisJdnN0YXR1cy0+cF9kZWNvZGVkX2ZyYW1lcyA9IGh3LT5ndnMucF9kZWNvZGVkX2ZyYW1lczsKKwl2c3RhdHVzLT5wX2xvc3RfZnJhbWVzID0gaHctPmd2cy5wX2xvc3RfZnJhbWVzOworCXZzdGF0dXMtPnBfY29uY2VhbGVkX2ZyYW1lcyA9IGh3LT5ndnMucF9jb25jZWFsZWRfZnJhbWVzOworCXZzdGF0dXMtPmJfZGVjb2RlZF9mcmFtZXMgPSBody0+Z3ZzLmJfZGVjb2RlZF9mcmFtZXM7CisJdnN0YXR1cy0+Yl9sb3N0X2ZyYW1lcyA9IGh3LT5ndnMuYl9sb3N0X2ZyYW1lczsKKwl2c3RhdHVzLT5iX2NvbmNlYWxlZF9mcmFtZXMgPSBody0+Z3ZzLmJfY29uY2VhbGVkX2ZyYW1lczsKKwl2c3RhdHVzLT50b3RhbF9kYXRhID0gaHctPmd2cy50b3RhbF9kYXRhOworCXZzdGF0dXMtPnNhbXBfY250ID0gaHctPmd2cy5zYW1wX2NudDsKKwl2c3RhdHVzLT5vZmZzZXQgPSBody0+Z3ZzLm9mZnNldDsKKwl2c3RhdHVzLT5yYXRpb19jb250cm9sID0gaHctPnJhdGlvX2NvbnRyb2w7CisJc25wcmludGYodnN0YXR1cy0+dmRlY19uYW1lLCBzaXplb2YodnN0YXR1cy0+dmRlY19uYW1lKSwKKwkJCSIlcyIsIERSSVZFUl9OQU1FKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHZtcGVnMTJfd29ya3NwYWNlX2luaXQoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3KQoreworCWludCByZXQ7CisKKwlyZXQgPSBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkoaHctPm1tX2Jsa19oYW5kbGUsCisJCQlERUNPREVfQlVGRkVSX05VTV9NQVgsCisJCQlXT1JLU1BBQ0VfU0laRSwKKwkJCURSSVZFUl9OQU1FLAorCQkJJmh3LT5idWZfc3RhcnQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigibXBlZzIgd29ya3NwYWNlIGFsbG9jIHNpemUgJWQgZmFpbGVkLlxuIiwKKwkJCVdPUktTUEFDRV9TSVpFKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghaHctPmNjYnVmX3BoeUFkZHJlc3NfdmlydCkgeworCQlody0+Y2NfYnVmX3NpemUgPSBBVVhfQlVGX0FMSUdOKENDQlVGX1NJWkUpOworCQlody0+Y2NidWZfcGh5QWRkcmVzc192aXJ0ID0KKwkJCWRtYV9hbGxvY19jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJCSAgaHctPmNjX2J1Zl9zaXplLCAmaHctPmNjYnVmX3BoeUFkZHJlc3MsCisJCQkJCSAgR0ZQX0tFUk5FTCk7CisJCWlmIChody0+Y2NidWZfcGh5QWRkcmVzc192aXJ0ID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvYyBjYyBidWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCVdSSVRFX1ZSRUcoTVJFR19DT19NVl9TVEFSVCwgaHctPmJ1Zl9zdGFydCk7CisJV1JJVEVfVlJFRyhNUkVHX0NDX0FERFIsIGh3LT5jY2J1Zl9waHlBZGRyZXNzKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgdm1wZWcyX2R1bXBfc3RhdGUoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcgPQorCQkoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKikodmRlYy0+cHJpdmF0ZSk7CisJdTMyIGk7CisJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIj09PT09PSAlc1xuIiwgX19mdW5jX18pOworCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSJ3aWR0aC9oZWlnaHQgKCVkLyVkKSxpX2ZpcnN0ICVkLCBidWZfbnVtICVkXG4iLAorCQlody0+ZnJhbWVfd2lkdGgsCisJCWh3LT5mcmFtZV9oZWlnaHQsCisJCWh3LT5maXJzdF9pX2ZyYW1lX3JlYWR5LAorCQlody0+YnVmX251bQorCQkpOworCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSJpc19mcmFtZWJhc2UoJWQpLCBlb3MgJWQsIHN0YXRlIDB4JXgsIGRlY19yZXN1bHQgMHgleCBkZWNfZnJtICVkIHB1dF9mcm0gJWQgcnVuICVkIG5vdF9ydW5fcmVhZHkgJWQsaW5wdXRfZW1wdHkgJWRcbiIsCisJCXZkZWNfZnJhbWVfYmFzZWQodmRlYyksCisJCWh3LT5lb3MsCisJCWh3LT5zdGF0LAorCQlody0+ZGVjX3Jlc3VsdCwKKwkJaHctPmRlY19udW0sCisJCWh3LT5wdXRfbnVtLAorCQlody0+cnVuX2NvdW50LAorCQlody0+bm90X3J1bl9yZWFkeSwKKwkJaHctPmlucHV0X2VtcHR5CisJCSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaHctPmJ1Zl9udW07IGkrKykgeworCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJImluZGV4ICVkLCB1c2VkICVkLCByZWYgJWRcbiIsIGksCisJCQlody0+dmZidWZfdXNlW2ldLCBody0+cmVmX3VzZVtpXSk7CisJfQorCisJaWYgKCFody0+aXNfdXNlZF92NGwgJiYgdmZfZ2V0X3JlY2VpdmVyKHZkZWMtPnZmX3Byb3ZpZGVyX25hbWUpKSB7CisJCWVudW0gcmVjZXZpdmVyX3N0YXJ0X2Ugc3RhdGUgPQorCQl2Zl9ub3RpZnlfcmVjZWl2ZXIodmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9RVVJFWV9TVEFURSwKKwkJCU5VTEwpOworCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJIlxucmVjZWl2ZXIoJXMpIHN0YXRlICVkXG4iLAorCQkJdmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCXN0YXRlKTsKKwl9CisJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkiJXMsIG5ld3EoJWQvJWQpLCBkaXNwcSglZC8lZCkgdmYgcHJlL2dldC9wdXQgKCVkLyVkLyVkKSxkcm9wPSVkLCBidWZmZXJfbm90X3JlYWR5ICVkXG4iLAorCV9fZnVuY19fLAorCWtmaWZvX2xlbigmaHctPm5ld2ZyYW1lX3EpLAorCVZGX1BPT0xfU0laRSwKKwlrZmlmb19sZW4oJmh3LT5kaXNwbGF5X3EpLAorCVZGX1BPT0xfU0laRSwKKwlody0+ZGlzcF9udW0sCisJaHctPmdldF9udW0sCisJaHctPnB1dF9udW0sCisJaHctPmRyb3BfZnJhbWVfY291bnQsCisJaHctPmJ1ZmZlcl9ub3RfcmVhZHkKKwkpOworCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSJWSUZGX0JJVF9DTlQ9MHgleFxuIiwKKwkJUkVBRF9WUkVHKFZJRkZfQklUX0NOVCkpOworCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSJWTERfTUVNX1ZJRklGT19MRVZFTD0weCV4XG4iLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpKTsKKwlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiVkxEX01FTV9WSUZJRk9fV1A9MHgleFxuIiwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1dQKSk7CisJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIlZMRF9NRU1fVklGSUZPX1JQPTB4JXhcbiIsCisJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCkpOworCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSJQQVJTRVJfVklERU9fUlA9MHgleFxuIiwKKwkJU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3JwKSk7CisJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIlBBUlNFUl9WSURFT19XUD0weCV4XG4iLAorCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApKTsKKworCWlmICh2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpICYmCisJCWRlYnVnX2VuYWJsZSAmIFBSSU5UX0ZSQU1FQkFTRV9EQVRBCisJCSkgeworCQlpbnQgamo7CisJCWlmIChody0+Y2h1bmsgJiYgaHctPmNodW5rLT5ibG9jayAmJgorCQkJaHctPmNodW5rLT5zaXplID4gMCkgeworCQkJdTggKmRhdGEgPSBOVUxMOworCisJCQlpZiAoIWh3LT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJCQlkYXRhID0gY29kZWNfbW1fdm1hcChody0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQkJCWh3LT5jaHVuay0+b2Zmc2V0LCBody0+Y2h1bmstPnNpemUpOworCQkJZWxzZQorCQkJCWRhdGEgPSAoKHU4ICopaHctPmNodW5rLT5ibG9jay0+c3RhcnRfdmlydCkgKworCQkJCQlody0+Y2h1bmstPm9mZnNldDsKKworCQkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCQkiZnJhbWUgZGF0YSBzaXplIDB4JXhcbiIsCisJCQkJaHctPmNodW5rLT5zaXplKTsKKwkJCWZvciAoamogPSAwOyBqaiA8IGh3LT5jaHVuay0+c2l6ZTsgamorKykgeworCQkJCWlmICgoamogJiAweGYpID09IDApCisJCQkJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJCQlQUklOVF9GUkFNRUJBU0VfREFUQSwKKwkJCQkJCSIlMDZ4OiIsIGpqKTsKKwkJCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLAorCQkJCVBSSU5UX0ZSQU1FQkFTRV9EQVRBLAorCQkJCQkiJTAyeCAiLCBkYXRhW2pqXSk7CisJCQkJaWYgKCgoamogKyAxKSAmIDB4ZikgPT0gMCkKKwkJCQkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCQkJCVBSSU5UX0ZSQU1FQkFTRV9EQVRBLCAiXG4iKTsKKwkJCX0KKworCQkJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcihkYXRhKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcmVzZXRfcHJvY2Vzc190aW1lKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodykKK3sKKwlpZiAoaHctPnN0YXJ0X3Byb2Nlc3NfdGltZSkgeworCQl1bnNpZ25lZCBwcm9jZXNzX3RpbWUgPQorCQkJMTAwMCAqIChqaWZmaWVzIC0gaHctPnN0YXJ0X3Byb2Nlc3NfdGltZSkgLyBIWjsKKwkJaHctPnN0YXJ0X3Byb2Nlc3NfdGltZSA9IDA7CisJCWlmIChwcm9jZXNzX3RpbWUgPiBtYXhfcHJvY2Vzc190aW1lW0RFQ09ERV9JRChodyldKQorCQkJbWF4X3Byb2Nlc3NfdGltZVtERUNPREVfSUQoaHcpXSA9IHByb2Nlc3NfdGltZTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X3Byb2Nlc3NfdGltZV9zZXQoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3KQoreworCWlmICgoaHctPnJlZnNbMV0gIT0gLTEpICYmIChody0+cmVmc1swXSA9PSAtMSkpCisJCWh3LT5kZWNvZGVfdGltZW91dF9jb3VudCA9IDE7CisJZWxzZQorCQlody0+ZGVjb2RlX3RpbWVvdXRfY291bnQgPSAxMDsKKwlody0+c3RhcnRfcHJvY2Vzc190aW1lID0gamlmZmllczsKK30KK3N0YXRpYyB2b2lkIHRpbWVvdXRfcHJvY2VzcyhzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcpCit7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaHcpOworCisJaWYgKHdvcmtfcGVuZGluZygmaHctPndvcmspIHx8CisJICAgIHdvcmtfYnVzeSgmaHctPndvcmspIHx8CisJICAgIHdvcmtfYnVzeSgmaHctPnRpbWVvdXRfd29yaykgfHwKKwkgICAgd29ya19wZW5kaW5nKCZody0+dGltZW91dF93b3JrKSkgeworCQlwcl9lcnIoIiVzIG1wZWcxMlslZF0gdGltZW91dF9wcm9jZXNzIHJldHVybiBiZWZvciBkbyBhbnl0aGluZy5cbiIsX19mdW5jX18sIHZkZWMtPmlkKTsKKwkJcmV0dXJuOworCX0KKwlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCWFtdmRlY19zdG9wKCk7CisJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19FUlJPUiwKKwkJIiVzIGRlY29kZXIgdGltZW91dCwgc3RhdHVzPSVkLCBsZXZlbD0lZFxuIiwKKwkJX19mdW5jX18sIHZkZWMtPnN0YXR1cywgUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKSk7CisJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJaWYgKChody0+cmVmc1sxXSAhPSAtMSkgJiYgKGh3LT5yZWZzWzBdICE9IC0xKSkKKwkJaHctPmZpcnN0X2lfZnJhbWVfcmVhZHkgPSAwOworCisJLyoKKwkgKiBJbiB0aGlzIHZlcnkgdGltZW91dCBwb2ludCx0aGUgdm1wZWcxMl93b3JrIGFycml2ZXMsCisJICogbGV0IGl0IHRvIGhhbmRsZSB0aGUgc2NlbmFyaW8uCisJICovCisJaWYgKHdvcmtfcGVuZGluZygmaHctPndvcmspKSB7CisJCXByX2VycigiJXMgbXBlZzEyWyVkXSByZXR1cm4gYmVmb3Igc2NoZWR1bGUuIiwgX19mdW5jX18sIHZkZWMtPmlkKTsKKwkJcmV0dXJuOworCX0KKwl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT50aW1lb3V0X3dvcmspOworfQorCitzdGF0aWMgdm9pZCBjaGVja190aW1lcl9mdW5jKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKK3sKKwlzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcgPSBjb250YWluZXJfb2YodGltZXIsCisJCXN0cnVjdCB2ZGVjX21wZWcxMl9od19zLCBjaGVja190aW1lcik7CisJdW5zaWduZWQgaW50IHRpbWVvdXRfdmFsID0gZGVjb2RlX3RpbWVvdXRfdmFsOworCisJaWYgKHJhZHIgIT0gMCkgeworCQlpZiAocnZhbCAhPSAwKSB7CisJCQlXUklURV9WUkVHKHJhZHIsIHJ2YWwpOworCQkJcHJfaW5mbygiV1JJVEVfVlJFRygleCwleClcbiIsIHJhZHIsIHJ2YWwpOworCQl9IGVsc2UKKwkJCXByX2luZm8oIlJFQURfVlJFRygleCk9JXhcbiIsIHJhZHIsIFJFQURfVlJFRyhyYWRyKSk7CisJCXJ2YWwgPSAwOworCQlyYWRyID0gMDsKKwl9CisKKwlpZiAoKChkZWJ1Z19lbmFibGUgJiBQUklOVF9GTEFHX1RJTUVPVVRfU1RBVFVTKSA9PSAwKSAmJgorCQkodGltZW91dF92YWwgPiAwKSAmJgorCQkoaHctPnN0YXJ0X3Byb2Nlc3NfdGltZSA+IDApICYmCisJCSgoMTAwMCAqIChqaWZmaWVzIC0gaHctPnN0YXJ0X3Byb2Nlc3NfdGltZSkgLyBIWikKKwkJCQk+IHRpbWVvdXRfdmFsKSkgeworCQlpZiAoaHctPmxhc3RfdmxkX2xldmVsID09IFJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCkpIHsKKwkJCWlmIChody0+ZGVjb2RlX3RpbWVvdXRfY291bnQgPiAwKQorCQkJCWh3LT5kZWNvZGVfdGltZW91dF9jb3VudC0tOworCQkJaWYgKGh3LT5kZWNvZGVfdGltZW91dF9jb3VudCA9PSAwKQorCQkJCXRpbWVvdXRfcHJvY2Vzcyhodyk7CisJCX0KKwkJaHctPmxhc3RfdmxkX2xldmVsID0gUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKTsKKwl9CisKKwltb2RfdGltZXIoJmh3LT5jaGVja190aW1lciwgamlmZmllcyArIENIRUNLX0lOVEVSVkFMKTsKK30KKworc3RhdGljIGludCB2bXBlZzEyX2h3X2N0eF9yZXN0b3JlKHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodykKK3sKKwl1MzIgaW5kZXggPSAtMTsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKiB2NGwyX2N0eCA9IGh3LT52NGwyX2N0eDsKKwlpbnQgaTsKKworCWlmICghaHctPmluaXRfZmxhZykKKwkJdm1wZWcxMl93b3Jrc3BhY2VfaW5pdChodyk7CisKKwlpZiAoaHctPnY0bF9wYXJhbXNfcGFyc2VkKSB7CisJCXN0cnVjdCB2ZGVjX3BpY19pbmZvIHBpYzsKKworCQlpZiAoIWh3LT5idWZfbnVtKSB7CisJCQl2ZGVjX3Y0bF9nZXRfcGljX2luZm8odjRsMl9jdHgsICZwaWMpOworCQkJaHctPmJ1Zl9udW0gPSBwaWMuZHBiX2ZyYW1lcyArCisJCQkJcGljLmRwYl9tYXJnaW47CisJCQlpZiAoaHctPmJ1Zl9udW0gPiBERUNPREVfQlVGRkVSX05VTV9NQVgpCisJCQkJaHctPmJ1Zl9udW0gPSBERUNPREVfQlVGRkVSX05VTV9NQVg7CisJCX0KKworCQlpbmRleCA9IGZpbmRfZnJlZV9idWZmZXIoaHcpOworCQlpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID49IGh3LT5idWZfbnVtKSkKKwkJCXJldHVybiAtMTsKKworCQlXUklURV9WUkVHKE1SRUdfQ09fTVZfU1RBUlQsIGh3LT5idWZfc3RhcnQpOworCQlXUklURV9WUkVHKE1SRUdfQ0NfQUREUiwgaHctPmNjYnVmX3BoeUFkZHJlc3MpOworCisJCWZvciAoaSA9IDA7IGkgPCBody0+YnVmX251bTsgaSsrKSB7CisJCQlpZiAoaHctPnBpY3NbaV0udjRsX3JlZl9idWZfYWRkcikgeworCQkJCWNvbmZpZ19jYXZfbHV0KGNhbnZhc195KGh3LT5jYW52YXNfc3BlY1tpXSksCisJCQkJCSZody0+Y2FudmFzX2NvbmZpZ1tpXVswXSwgVkRFQ18xKTsKKwkJCQljb25maWdfY2F2X2x1dChjYW52YXNfdShody0+Y2FudmFzX3NwZWNbaV0pLAorCQkJCQkmaHctPmNhbnZhc19jb25maWdbaV1bMV0sIFZERUNfMSk7CisJCQl9CisJCX0KKworCQkvKiBwcmVwYXJlIFJFRjAgJiBSRUYxCisJCXBvaW50cyB0byB0aGUgcGFzdCB0d28gSVAgYnVmZmVycworCQlwcmVwYXJlIFJFQ19DQU5WQVNfQUREUiBhbmQgQU5DMl9DQU5WQVNfQUREUgorCQlwb2ludHMgdG8gdGhlIG91dHB1dCBidWZmZXIqLworCQlXUklURV9WUkVHKE1SRUdfUkVGMCwKKwkJCShody0+cmVmc1swXSA9PSAtMSkgPyAweGZmZmZmZmZmIDoKKwkJCWh3LT5jYW52YXNfc3BlY1tody0+cmVmc1swXV0pOworCQlXUklURV9WUkVHKE1SRUdfUkVGMSwKKwkJCShody0+cmVmc1sxXSA9PSAtMSkgPyAweGZmZmZmZmZmIDoKKwkJCWh3LT5jYW52YXNfc3BlY1tody0+cmVmc1sxXV0pOworCQlXUklURV9WUkVHKFJFQ19DQU5WQVNfQUREUiwgaHctPmNhbnZhc19zcGVjW2luZGV4XSk7CisJCVdSSVRFX1ZSRUcoQU5DMl9DQU5WQVNfQUREUiwgaHctPmNhbnZhc19zcGVjW2luZGV4XSk7CisKKwkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19SRVNUT1JFLAorCQkJIiVzLHJlZjA9MHgleCwgcmVmMT0weCV4LHJlYz0weCV4LCBjdHhfdmFsaWQ9JWQsaW5kZXg9JWRcbiIsCisJCQlfX2Z1bmNfXywKKwkJCVJFQURfVlJFRyhNUkVHX1JFRjApLAorCQkJUkVBRF9WUkVHKE1SRUdfUkVGMSksCisJCQlSRUFEX1ZSRUcoUkVDX0NBTlZBU19BRERSKSwKKwkJCWh3LT5jdHhfdmFsaWQsIGluZGV4KTsKKwl9CisKKwkvKiBzZXQgdG8gbXBlZzEgZGVmYXVsdCAqLworCVdSSVRFX1ZSRUcoTVBFRzFfMl9SRUcsCisJKGh3LT5jdHhfdmFsaWQpID8gaHctPnJlZ19tcGVnMV8yX3JlZyA6IDApOworCS8qIGRpc2FibGUgUFNDQUxFIGZvciBoYXJkd2FyZSBzaGFyaW5nICovCisJV1JJVEVfVlJFRyhQU0NBTEVfQ1RSTCwgMCk7CisJLyogZm9yIE1wZWcxIGRlZmF1bHQgdmFsdWUgKi8KKwlXUklURV9WUkVHKFBJQ19IRUFEX0lORk8sCisJKGh3LT5jdHhfdmFsaWQpID8gaHctPnJlZ19waWNfaGVhZF9pbmZvIDogMHgzODApOworCS8qIGRpc2FibGUgbXBlZzQgKi8KKwlXUklURV9WUkVHKE00X0NPTlRST0xfUkVHLCAwKTsKKwkvKiBjbGVhciBtYWlsYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoQVNTSVNUX01CT1gxX0NMUl9SRUcsIDEpOworCS8qIGNsZWFyIGJ1ZmZlciBJTi9PVVQgcmVnaXN0ZXJzICovCisJV1JJVEVfVlJFRyhNUkVHX0JVRkZFUk9VVCwgMCk7CisJLyogZW5hYmxlIG1haWxib3ggaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfTUFTSywgMSk7CisJLyogc2V0IHJlZmVyZW5jZSB3aWR0aCBhbmQgaGVpZ2h0ICovCisJaWYgKChody0+ZnJhbWVfd2lkdGggIT0gMCkgJiYgKGh3LT5mcmFtZV9oZWlnaHQgIT0gMCkpCisJCVdSSVRFX1ZSRUcoTVJFR19DTUQsCisJCShody0+ZnJhbWVfd2lkdGggPDwgMTYpIHwgaHctPmZyYW1lX2hlaWdodCk7CisJZWxzZQorCQlXUklURV9WUkVHKE1SRUdfQ01ELCAwKTsKKworCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfUkVTVE9SRSwKKwkJIjB4JXgsIDB4JXgsIDB4JXgsIDB4JXgsIDB4JXgsIDB4JXhcbiIsCisJCWh3LT5mcmFtZV93aWR0aCwgaHctPmZyYW1lX2hlaWdodCwgaHctPnNlcWluZm8sCisJCWh3LT5yZWdfZl9jb2RlX3JlZywgaHctPnJlZ19zbGljZV92ZXJfcG9zX3BpY190eXBlLAorCQlody0+cmVnX21iX2luZm8pOworCisJV1JJVEVfVlJFRyhNUkVHX1BJQ19XSURUSCwgaHctPnJlZ19waWNfd2lkdGgpOworCVdSSVRFX1ZSRUcoTVJFR19QSUNfSEVJR0hULCBody0+cmVnX3BpY19oZWlnaHQpOworCVdSSVRFX1ZSRUcoTVJFR19TRVFfSU5GTywgaHctPnNlcWluZm8pOworCVdSSVRFX1ZSRUcoRl9DT0RFX1JFRywgaHctPnJlZ19mX2NvZGVfcmVnKTsKKwlXUklURV9WUkVHKFNMSUNFX1ZFUl9QT1NfUElDX1RZUEUsCisJCWh3LT5yZWdfc2xpY2VfdmVyX3Bvc19waWNfdHlwZSk7CisJV1JJVEVfVlJFRyhNQl9JTkZPLCBody0+cmVnX21iX2luZm8pOworCVdSSVRFX1ZSRUcoVkNPUF9DVFJMX1JFRywgaHctPnJlZ192Y29wX2N0cmxfcmVnKTsKKwlXUklURV9WUkVHKEFWX1NDUkFUQ0hfSCwgaHctPnJlZ19zaWduYWxfdHlwZSk7CisKKwlpZiAoUkVBRF9WUkVHKE1SRUdfRVJST1JfQ09VTlQpICE9IDAgfHwKKwkJCVJFQURfVlJFRyhNUkVHX0ZBVEFMX0VSUk9SKSA9PSAxKQorCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1JFU1RPUkUsCisJCQkJImVycl9jbnQ6JWQgZmFfZXJyOiVkXG4iLAorCQkJCVJFQURfVlJFRyhNUkVHX0VSUk9SX0NPVU5UKSwKKwkJCQlSRUFEX1ZSRUcoTVJFR19GQVRBTF9FUlJPUikpOworCisJLyogY2xlYXIgZXJyb3IgY291bnQgKi8KKwlXUklURV9WUkVHKE1SRUdfRVJST1JfQ09VTlQsIDApOworCS8qVXNlIE1SRUdfRkFUQUxfRVJST1IgYml0MSwgdGhlIHVjb2RlIGRldGVybWluZQorCQl3aGV0aGVyIHRvIHJlcG9ydCB0aGUgaW50ZXJydXB0aW9uIG9mIHdpZHRoIGFuZAorCQloZWlnaHQgaW5mb3JtYXRpb24saW4gb3JkZXIgdG8gYmUgY29tcGF0aWJsZQorCQl3aXRoIHRoZSBvbGQgdmVyc2lvbiBvZiB1Y29kZS4KKwkJMTogUmVwb3J0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGluZm9ybWF0aW9uCisJCTA6IE5vIFJlcG9ydAorCSAgYml0MDoKKwkgICAgICAgIDE6IFVzZSBjbWEgY2MgYnVmZmVyIGZvciBuZXcgZHJpdmVyCisJICAgICAgICAwOiB1c2UgY29kZWMgbW0gY2MgYnVmZmVyIGZvciBvbGQgZHJpdmVyCisJCSovCisJV1JJVEVfVlJFRyhNUkVHX0ZBVEFMX0VSUk9SLCAzKTsKKwkvKiBjbGVhciB3YWl0IGJ1ZmZlciBzdGF0dXMgKi8KKwlXUklURV9WUkVHKE1SRUdfV0FJVF9CVUZGRVIsIDApOworI2lmZGVmIE5WMjEKKwlTRVRfVlJFR19NQVNLKE1ERUNfUElDX0RDX0NUUkwsIDE8PDE3KTsKKyNlbmRpZgorCisJLyogY2Jjcl9tZXJnZV9zd2FwX2VuICovCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDcpIHsKKwkJaWYgKCh2NGwyX2N0eC0+cV9kYXRhW0FNTF9RX0RBVEFfRFNUXS5mbXQtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfTlYyMSkgfHwKKwkJCSh2NGwyX2N0eC0+cV9kYXRhW0FNTF9RX0RBVEFfRFNUXS5mbXQtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfTlYyMU0pKQorCQkJQ0xFQVJfVlJFR19NQVNLKE1ERUNfUElDX0RDX0NUUkwsIDEgPDwgMTYpOworCQllbHNlCisJCQlTRVRfVlJFR19NQVNLKE1ERUNfUElDX0RDX0NUUkwsIDEgPDwgMTYpOworCX0gZWxzZSB7CisJCWlmICgodjRsMl9jdHgtPnFfZGF0YVtBTUxfUV9EQVRBX0RTVF0uZm10LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX05WMjEpIHx8CisJCQkodjRsMl9jdHgtPnFfZGF0YVtBTUxfUV9EQVRBX0RTVF0uZm10LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX05WMjFNKSkKKwkJCVNFVF9WUkVHX01BU0soTURFQ19QSUNfRENfQ1RSTCwgMSA8PCAxNik7CisJCWVsc2UKKwkJCUNMRUFSX1ZSRUdfTUFTSyhNREVDX1BJQ19EQ19DVFJMLCAxIDw8IDE2KTsKKwl9CisKKwlpZiAoIWh3LT5jdHhfdmFsaWQpCisJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9KLCBody0+dXNlcmRhdGFfd3BfY3R4KTsKKworCWlmIChody0+Y2h1bmspIHsKKwkJLypmcmFtZSBiYXNlZCBpbnB1dCovCisJCVdSSVRFX1ZSRUcoTVJFR19JTlBVVCwKKwkJKGh3LT5jaHVuay0+b2Zmc2V0ICYgNykgfCAoMTw8NykgfCAoaHctPmN0eF92YWxpZDw8NikpOworCX0gZWxzZSB7CisJCS8qc3RyZWFtIGJhc2VkIGlucHV0Ki8KKwkJV1JJVEVfVlJFRyhNUkVHX0lOUFVULCAoaHctPmN0eF92YWxpZDw8NikpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdm1wZWcxMl9sb2NhbF9pbml0KHN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodykKK3sKKwlpbnQgaTsKKwlJTklUX0tGSUZPKGh3LT5kaXNwbGF5X3EpOworCUlOSVRfS0ZJRk8oaHctPm5ld2ZyYW1lX3EpOworCisJZm9yIChpID0gMDsgaSA8IFZGX1BPT0xfU0laRTsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqdmY7CisJCXZmID0gJmh3LT52ZnBvb2xbaV07CisJCWh3LT52ZnBvb2xbaV0uaW5kZXggPSBERUNPREVfQlVGRkVSX05VTV9NQVg7CisJCWtmaWZvX3B1dCgmaHctPm5ld2ZyYW1lX3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJfQorCisJZm9yIChpID0gMDsgaSA8IERFQ09ERV9CVUZGRVJfTlVNX01BWDsgaSsrKSB7CisJCWh3LT52ZmJ1Zl91c2VbaV0gPSAwOworCQlody0+cmVmX3VzZVtpXSA9IDA7CisJfQorCisJaWYgKGh3LT5tbV9ibGtfaGFuZGxlKSB7CisJCWRlY29kZXJfYm1tdV9ib3hfZnJlZShody0+bW1fYmxrX2hhbmRsZSk7CisJCWh3LT5tbV9ibGtfaGFuZGxlID0gTlVMTDsKKwl9CisKKwlody0+bW1fYmxrX2hhbmRsZSA9IGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYm94KAorCQkJRFJJVkVSX05BTUUsCisJCQkwLAorCQkJTUFYX0JNTVVfQlVGRkVSX05VTSwKKwkJCTQgKyBQQUdFX1NISUZULAorCQkJQ09ERUNfTU1fRkxBR1NfQ01BX0NMRUFSIHwKKwkJCUNPREVDX01NX0ZMQUdTX0ZPUl9WREVDT0RFUiB8CisJCQlody0+dHZwX2ZsYWcpOworCisJaHctPmVvcyA9IDA7CisJaHctPmZyYW1lX3dpZHRoID0gaHctPmZyYW1lX2hlaWdodCA9IDA7CisJaHctPmZyYW1lX2R1ciA9IGh3LT5mcmFtZV9wcm9nID0gMDsKKwlody0+ZnJhbWVfZm9yY2Vfc2tpcF9mbGFnID0gMDsKKwlody0+d2FpdF9idWZmZXJfY291bnRlciA9IDA7CisJaHctPmZpcnN0X2lfZnJhbWVfcmVhZHkgPSAwOworCWh3LT5kZWNfY29udHJvbCAmPSBERUNfQ09OVFJPTF9JTlRFUk5BTF9NQVNLOworCWh3LT5yZWZzWzBdID0gLTE7CisJaHctPnJlZnNbMV0gPSAtMTsKKwlody0+ZGVjX251bSA9IDA7CisJaHctPnJ1bl9jb3VudCA9IDA7CisJaHctPm5vdF9ydW5fcmVhZHkgPSAwOworCWh3LT5pbnB1dF9lbXB0eSA9IDA7CisJaHctPmRyb3BfZnJhbWVfY291bnQgPSAwOworCWh3LT5idWZmZXJfbm90X3JlYWR5ID0gMDsKKwlody0+c3RhcnRfcHJvY2Vzc190aW1lID0gMDsKKwlody0+aW5pdF9mbGFnID0gMDsKKwlody0+ZGVjX2FnYWluX2NudCA9IDA7CisJaHctPmVycm9yX2ZyYW1lX3NraXBfbGV2ZWwgPSBlcnJvcl9mcmFtZV9za2lwX2xldmVsOworCWF0b21pY19zZXQoJmh3LT5kaXNwX251bSwgMCk7CisJYXRvbWljX3NldCgmaHctPnB1dF9udW0sIDApOworCWF0b21pY19zZXQoJmh3LT5nZXRfbnVtLCAwKTsKKwlhdG9taWNfc2V0KCZody0+cGVla19udW0sIDApOworCisJaWYgKGRlY19jb250cm9sKQorCQlody0+ZGVjX2NvbnRyb2wgPSBkZWNfY29udHJvbDsKK30KKworc3RhdGljIHMzMiB2bXBlZzEyX2luaXQoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3KQoreworCWludCBzaXplOworCXUzMiBmd19zaXplID0gMTYqMHgxMDAwOworCXN0cnVjdCBmaXJtd2FyZV9zICpmdzsKKworCXZtcGVnMTJfbG9jYWxfaW5pdChodyk7CisKKwlmdyA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBmaXJtd2FyZV9zKSArIGZ3X3NpemUpOworCWlmIChJU19FUlJfT1JfTlVMTChmdykpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJfZGVidWcoImdldCBmaXJtd2FyZSAuLi5cbiIpOworCXNpemUgPSBnZXRfZmlybXdhcmVfZGF0YShWSURFT19ERUNfTVBFRzEyX01VTFRJLCBmdy0+ZGF0YSk7CisJaWYgKHNpemUgPCAwKSB7CisJCXByX2VycigiZ2V0IGZpcm13YXJlIGZhaWwuXG4iKTsKKwkJdmZyZWUoZncpOworCQlyZXR1cm4gLTE7CisJfQorCisJZnctPmxlbiA9IHNpemU7CisJaHctPmZ3ID0gZnc7CisKKwlJTklUX1dPUksoJmh3LT51c2VyZGF0YV9wdXNoX3dvcmssIHVzZXJkYXRhX3B1c2hfZG9fd29yayk7CisJSU5JVF9XT1JLKCZody0+d29yaywgdm1wZWcxMl93b3JrKTsKKwlJTklUX1dPUksoJmh3LT50aW1lb3V0X3dvcmssIHZtcGVnMTJfdGltZW91dF93b3JrKTsKKwlJTklUX1dPUksoJmh3LT5ub3RpZnlfd29yaywgdm1wZWcxMl9ub3RpZnlfd29yayk7CisKKwlpZiAoTlVMTCA9PSBody0+dXNlcl9kYXRhX2J1ZmZlcikgeworCQlody0+dXNlcl9kYXRhX2J1ZmZlciA9IGttYWxsb2MoVVNFUl9EQVRBX1NJWkUsCisJCQkJCQkJR0ZQX0tFUk5FTCk7CisJCWlmICghaHctPnVzZXJfZGF0YV9idWZmZXIpIHsKKwkJCXByX2luZm8oIiVzOiBDYW4gbm90IGFsbG9jYXRlIHVzZXJfZGF0YV9idWZmZXJcbiIsCisJCQkJICAgX19mdW5jX18pOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJdm1tcGVnMl9jcmF0ZV91c2VyZGF0YV9tYW5hZ2VyKGh3LAorCQkJaHctPnVzZXJfZGF0YV9idWZmZXIsCisJCQlVU0VSX0RBVEFfU0laRSk7CisKKwkvL2FtdmRlY19lbmFibGUoKTsKKwl0aW1lcl9zZXR1cCgmaHctPmNoZWNrX3RpbWVyLCBjaGVja190aW1lcl9mdW5jLCAwKTsKKwkvL2luaXRfdGltZXIoJmh3LT5jaGVja190aW1lcik7CisJLy9ody0+Y2hlY2tfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWh3OworCS8vaHctPmNoZWNrX3RpbWVyLmZ1bmN0aW9uID0gY2hlY2tfdGltZXJfZnVuYzsKKwlody0+Y2hlY2tfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBDSEVDS19JTlRFUlZBTDsKKworCWh3LT5zdGF0IHw9IFNUQVRfVElNRVJfQVJNOworCWh3LT5zdGF0IHw9IFNUQVRfSVNSX1JFRzsKKworCWh3LT5idWZfc3RhcnQgPSAwOworCVdSSVRFX1ZSRUcoREVDT0RFX1NUT1BfUE9TLCB1ZGVidWdfZmxhZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2wgaXNfYXZhbGlhYmxlX2J1ZmZlcihzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcpCit7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisJaW50IGksIGZyZWVfY291bnQgPSAwOworCWludCB1c2VkX2NvdW50ID0gMDsKKworCWlmICgoaHctPmJ1Zl9udW0gPT0gMCkgfHwKKwkJKGN0eC0+Y2FwX3Bvb2wuZGVjIDwgaHctPmJ1Zl9udW0pKSB7CisJCWlmIChjdHgtPmZiX29wcy5xdWVyeSgmY3R4LT5mYl9vcHMsICZody0+ZmJfdG9rZW4pKSB7CisJCQlmcmVlX2NvdW50ID0KKwkJCQl2NGwyX20ybV9udW1fZHN0X2J1ZnNfcmVhZHkoY3R4LT5tMm1fY3R4KSArIDE7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaHctPmJ1Zl9udW07ICsraSkgeworCQlpZiAoKGh3LT52ZmJ1Zl91c2VbaV0gPT0gMCkgJiYKKwkJCShody0+cmVmX3VzZVtpXSA9PSAwKSAmJgorCQkJaHctPnBpY3NbaV0udjRsX3JlZl9idWZfYWRkcikgeworCQkJZnJlZV9jb3VudCsrOworCQl9IGVsc2UgaWYgKGh3LT5waWNzW2ldLnY0bF9yZWZfYnVmX2FkZHIpCisJCQl1c2VkX2NvdW50Kys7CisJfQorCisJQVRSQUNFX0NPVU5URVIoIlZfU1RfREVDLWZyZWVfYnVmZl9jb3VudCIsIGZyZWVfY291bnQpOworCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy11c2VkX2J1ZmZfY291bnQiLCB1c2VkX2NvdW50KTsKKworCXJldHVybiBmcmVlX2NvdW50ID49IHJ1bl9yZWFkeV9taW5fYnVmX251bSA/IDEgOiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBydW5fcmVhZHkoc3RydWN0IHZkZWNfcyAqdmRlYywgdW5zaWduZWQgbG9uZyBtYXNrKQoreworCXN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodyA9CisJCShzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisJaW50IHJldCA9IDA7CisKKwlpZiAoaHctPmVvcykKKwkJcmV0dXJuIDA7CisKKwlpZiAoaHctPnRpbWVvdXRfcHJvY2Vzc2luZyAmJgorCSAgICAod29ya19wZW5kaW5nKCZody0+d29yaykgfHwgd29ya19idXN5KCZody0+d29yaykgfHwKKwkgICAgd29ya19wZW5kaW5nKCZody0+dGltZW91dF93b3JrKSB8fCB3b3JrX2J1c3koJmh3LT50aW1lb3V0X3dvcmspKSkgeworCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJIm1wZWcxMiB3b3JrIHBlbmRpbmcsbm90IHJlYWR5IGZvciBydW4uXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWh3LT50aW1lb3V0X3Byb2Nlc3NpbmcgPSAwOworCWlmICh2ZGVjX3N0cmVhbV9iYXNlZCh2ZGVjKSAmJiAoaHctPmluaXRfZmxhZyA9PSAwKQorCQkmJiBwcmVfZGVjb2RlX2J1Zl9sZXZlbCAhPSAwKSB7CisJCXUzMiBycCwgd3AsIGxldmVsOworCisJCXJwID0gU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3JwKTsKKwkJd3AgPSBTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApOworCQlpZiAod3AgPCBycCkKKwkJCWxldmVsID0gdmRlYy0+aW5wdXQuc2l6ZSArIHdwIC0gcnA7CisJCWVsc2UKKwkJCWxldmVsID0gd3AgLSBycDsKKworCQlpZiAobGV2ZWwgPCBwcmVfZGVjb2RlX2J1Zl9sZXZlbCkgeworCQkJaHctPm5vdF9ydW5fcmVhZHkrKzsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisjaWZkZWYgQUdBSU5fSEFTX1RIUkVTSE9MRAorCWlmIChody0+bmV4dF9hZ2Fpbl9mbGFnJiYKKwkJKCF2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpKSkgeworCQl1MzIgcGFyc2VyX3dyX3B0ciA9CisJCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApOworCQlpZiAocGFyc2VyX3dyX3B0ciA+PSBody0+cHJlX3BhcnNlcl93cl9wdHIgJiYKKwkJCShwYXJzZXJfd3JfcHRyIC0gaHctPnByZV9wYXJzZXJfd3JfcHRyKSA8CisJCQlhZ2Fpbl90aHJlc2hvbGQpIHsKKwkJCWludCByID0gdmRlY19zeW5jX2lucHV0KHZkZWMpOworCQkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19SVU5fRkxPVywKKwkJCSIlcyBidWYgbGV2ZWwleFxuIiwKKwkJCV9fZnVuY19fLCByKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorI2VuZGlmCisKKwlpZiAoaHctPnY0bF9wYXJhbXNfcGFyc2VkKSB7CisJCXJldCA9IGlzX2F2YWxpYWJsZV9idWZmZXIoaHcpID8gMSA6IDA7CisJfSBlbHNlIHsKKwkJcmV0ID0gY3R4LT52NGxfcmVzb2x1dGlvbl9jaGFuZ2UgPyAwIDogMTsKKwl9CisKKwlody0+bm90X3J1bl9yZWFkeSA9IDA7CisJaHctPmJ1ZmZlcl9ub3RfcmVhZHkgPSAwOworCisJcmV0dXJuIHJldCA/IENPUkVfTUFTS19WREVDXzEgOiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBnZXRfZGF0YV9jaGVja19zdW0KKwkoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKmh3LCBpbnQgc2l6ZSkKK3sKKwlpbnQgamo7CisJaW50IHN1bSA9IDA7CisJdTggKmRhdGEgPSBOVUxMOworCisJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCWRhdGEgPSBjb2RlY19tbV92bWFwKGh3LT5jaHVuay0+YmxvY2stPnN0YXJ0ICsKKwkJCWh3LT5jaHVuay0+b2Zmc2V0LCBzaXplKTsKKwllbHNlCisJCWRhdGEgPSAoKHU4ICopaHctPmNodW5rLT5ibG9jay0+c3RhcnRfdmlydCkgKworCQkJaHctPmNodW5rLT5vZmZzZXQ7CisKKwlmb3IgKGpqID0gMDsgamogPCBzaXplOyBqaisrKQorCQlzdW0gKz0gZGF0YVtqal07CisKKwlpZiAoIWh3LT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcihkYXRhKTsKKwlyZXR1cm4gc3VtOworfQorCitzdGF0aWMgaW50IGNoZWNrX2RpcnR5X2RhdGEoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcgPQorCQkoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKikodmRlYy0+cHJpdmF0ZSk7CisJdTMyIHdwLCBycCwgbGV2ZWw7CisKKwlycCA9IFNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF9ycCk7CisJd3AgPSBTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApOworCisJaWYgKHdwID4gcnApCisJCWxldmVsID0gd3AgLSBycDsKKwllbHNlCisJCWxldmVsID0gd3AgKyB2ZGVjLT5pbnB1dC5zaXplIC0gcnAgOworCisJaWYgKGh3LT5uZXh0X2FnYWluX2ZsYWcgJiYKKwkJaHctPnByZV9wYXJzZXJfd3JfcHRyICE9CisJCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApKQorCQlody0+ZGVjX2FnYWluX2NudCsrOworCWlmICgobGV2ZWwgPiAodmRlYy0+aW5wdXQuc2l6ZSAqIDIgLyAzKSApICYmCisJCQkoaHctPmRlY19hZ2Fpbl9jbnQgPiBkaXJ0eV9hZ2Fpbl90aHJlc2hvbGQpKSB7CisJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsICJtcGVnMTIgZGF0YSBza2lwcGVkICV4LCBsZXZlbCAleFxuIiwgKChsZXZlbCAvIDIpID4+IDIwKSA8PCAyMCwgbGV2ZWwpOworCQlpZiAodmRlYy0+aW5wdXQuc3dhcF92YWxpZCkgeworCQkJdmRlY19zdHJlYW1fc2tpcF9kYXRhKHZkZWMsICgobGV2ZWwgLyAyKSA+PiAyMCkgPDwgMjApOworCQkJaHctPmRlY19hZ2Fpbl9jbnQgPSAwOworCQl9CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBydW4oc3RydWN0IHZkZWNfcyAqdmRlYywgdW5zaWduZWQgbG9uZyBtYXNrLAordm9pZCAoKmNhbGxiYWNrKShzdHJ1Y3QgdmRlY19zICosIHZvaWQgKiksCisJCXZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcgPQorCQkoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MgKil2ZGVjLT5wcml2YXRlOworCWludCBzYXZlX3JlZzsKKwlpbnQgc2l6ZSwgcmV0OworCWlmICghaHctPnZkZWNfcGdfZW5hYmxlX2ZsYWcpIHsKKwkJaHctPnZkZWNfcGdfZW5hYmxlX2ZsYWcgPSAxOworCQlhbXZkZWNfZW5hYmxlKCk7CisJfQorCXNhdmVfcmVnID0gUkVBRF9WUkVHKFBPV0VSX0NUTF9WTEQpOworCS8qIHJlc2V0IGV2ZXJ5dGhpbmcgZXhjZXB0IERPU19UT1BbMV0gYW5kIEFQQl9DQlVTWzBdKi8KKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsIDB4ZmZmZmZmZjApOworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgMCk7CisJV1JJVEVfVlJFRyhQT1dFUl9DVExfVkxELCBzYXZlX3JlZyk7CisJaHctPnJ1bl9jb3VudCsrOworCXZkZWNfcmVzZXRfY29yZSh2ZGVjKTsKKwlody0+dmRlY19jYl9hcmcgPSBhcmc7CisJaHctPnZkZWNfY2IgPSBjYWxsYmFjazsKKworCWlmICgodmRlY19zdHJlYW1fYmFzZWQodmRlYykpICYmCisJCQkoZXJyb3JfcHJvY19wb2xpY3kgJiAweDEpICYmCisJCQljaGVja19kaXJ0eV9kYXRhKHZkZWMpKSB7CisJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKwkJaWYgKCF2ZGVjLT5pbnB1dC5zd2FwX3ZhbGlkKSB7CisJCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLCAibXBlZzEyIHN0YXJ0IGRpcnR5IGRhdGEgc2tpcHBlZFxuIik7CisJCQl2ZGVjX3ByZXBhcmVfaW5wdXQodmRlYywgJmh3LT5jaHVuayk7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwkJfQorCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJcmV0dXJuOworCX0KKworI2lmZGVmIEFHQUlOX0hBU19USFJFU0hPTEQKKwlpZiAodmRlY19zdHJlYW1fYmFzZWQodmRlYykpIHsKKwkJaHctPnByZV9wYXJzZXJfd3JfcHRyID0KKwkJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCk7CisJCWh3LT5uZXh0X2FnYWluX2ZsYWcgPSAwOworCX0KKyNlbmRpZgorCisJaWYgKCh2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpKSAmJiAoaHctPmNodW5rX2hlYWRlcl9vZmZzZXQgIT0gMCkgJiYKKwkJKCFody0+djRsX3BhcmFtc19wYXJzZWQpICYmIChody0+Y2h1bmsgIT0gTlVMTCkgJiYKKwkJKGh3LT5jaHVua19yZXNfc2l6ZSAhPSAwKSkgeworCQlody0+Y2h1bmstPm9mZnNldCA9IGh3LT5jaHVua19oZWFkZXJfb2Zmc2V0OworCQlody0+Y2h1bmstPnNpemUgPSBody0+Y2h1bmtfcmVzX3NpemU7CisJCWh3LT5jaHVua19oZWFkZXJfb2Zmc2V0ID0gMDsKKwkJaHctPmNodW5rX3Jlc19zaXplID0gMDsKKwkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwgIk11bHRpcGxlIGhlYWRzIGFyZSBwYXJzZWQgaW4gYSBjaHVuayBhbmQgcmVzb2x1dGlvbiBjaGFuZ2VkLlxuIik7CisJfQorCisJc2l6ZSA9IHZkZWNfcHJlcGFyZV9pbnB1dCh2ZGVjLCAmaHctPmNodW5rKTsKKwlpZiAoc2l6ZSA8IDApIHsKKwkJaHctPmlucHV0X2VtcHR5Kys7CisJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKworCQlkZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX0RFQ19ERVRBSUwsCisJCQkidmRlY19wcmVwYXJlX2lucHV0OiBJbnN1ZmZpY2llbnQgZGF0YVxuIik7CisJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQlyZXR1cm47CisJfQorCisJQVRSQUNFX0NPVU5URVIoIlZfU1RfREVDLWNodW5rX3NpemUiLCBzaXplKTsKKworCWh3LT5pbnB1dF9lbXB0eSA9IDA7CisJaWYgKCh2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpKSAmJgorCQkoaHctPmNodW5rICE9IE5VTEwpKSB7CisJCXNpemUgPSBody0+Y2h1bmstPnNpemUgKworCQkJKGh3LT5jaHVuay0+b2Zmc2V0ICYgKFZERUNfRklGT19BTElHTiAtIDEpKTsKKwkJV1JJVEVfVlJFRyhWSUZGX0JJVF9DTlQsIHNpemUgKiA4KTsKKwkJaWYgKHZkZWMtPm12ZnJtKQorCQkJdmRlYy0+bXZmcm0tPmZyYW1lX3NpemUgPSBody0+Y2h1bmstPnNpemU7CisJfQorCWlmICh2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpICYmICF2ZGVjX3NlY3VyZSh2ZGVjKSkgeworCQkvKiBIVyBuZWVkcyBwYWRkaW5nIChOQUwgc3RhcnQpIGZvciBmcmFtZSBlbmRpbmcgKi8KKwkJY2hhciogdGFpbCA9IChjaGFyICopaHctPmNodW5rLT5ibG9jay0+c3RhcnRfdmlydDsKKworCQl0YWlsICs9IGh3LT5jaHVuay0+b2Zmc2V0ICsgaHctPmNodW5rLT5zaXplOworCQl0YWlsWzBdID0gMDsKKwkJdGFpbFsxXSA9IDA7CisJCXRhaWxbMl0gPSAxOworCQl0YWlsWzNdID0gMDsKKwkJY29kZWNfbW1fZG1hX2ZsdXNoKHRhaWwsIDQsIERNQV9UT19ERVZJQ0UpOworCX0KKworCWlmICh2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpICYmIGRlYnVnX2VuYWJsZSAmJiAhdmRlY19zZWN1cmUodmRlYykpIHsKKwkJdTggKmRhdGEgPSBOVUxMOworCQlpZiAoaHctPmNodW5rKQorCQkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19SVU5fRkxPVywKKwkJCQkicnVuOiBjaHVuayBvZmZzZXQgMHgleCwgc2l6ZSAlZFxuIiwKKwkJCQlody0+Y2h1bmstPm9mZnNldCwgaHctPmNodW5rLT5zaXplKTsKKworCQlpZiAoIWh3LT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJCWRhdGEgPSBjb2RlY19tbV92bWFwKGh3LT5jaHVuay0+YmxvY2stPnN0YXJ0ICsKKwkJCQlody0+Y2h1bmstPm9mZnNldCwgc2l6ZSk7CisJCWVsc2UKKwkJCWRhdGEgPSAoKHU4ICopaHctPmNodW5rLT5ibG9jay0+c3RhcnRfdmlydCkgKworCQkJCWh3LT5jaHVuay0+b2Zmc2V0OworCisJCWlmIChkZWJ1Z19lbmFibGUgJiBQUklOVF9GTEFHX1ZERUNfU1RBVFVTCisJCQkpIHsKKwkJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkiJXM6IHNpemUgMHgleCBzdW0gMHgleCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAuLiAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJX19mdW5jX18sIHNpemUsIGdldF9kYXRhX2NoZWNrX3N1bShodywgc2l6ZSksCisJCQlkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdLCBkYXRhWzNdLAorCQkJZGF0YVs0XSwgZGF0YVs1XSwgZGF0YVtzaXplIC0gNF0sCisJCQlkYXRhW3NpemUgLSAzXSwJZGF0YVtzaXplIC0gMl0sCisJCQlkYXRhW3NpemUgLSAxXSk7CisJCX0KKwkJaWYgKGRlYnVnX2VuYWJsZSAmIFBSSU5UX0ZSQU1FQkFTRV9EQVRBCisJCQkpIHsKKwkJCWludCBqajsKKwkJCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZSQU1FQkFTRV9EQVRBLAorCQkJCSJmcmFtZSBkYXRhOlxuIik7CisJCQlmb3IgKGpqID0gMDsgamogPCBzaXplOyBqaisrKSB7CisJCQkJaWYgKChqaiAmIDB4ZikgPT0gMCkKKwkJCQkJcHJfaW5mbygiJTA2eDoiLCBqaik7CisJCQkJcHJfaW5mbygiJTAyeCAiLCBkYXRhW2pqXSk7CisJCQkJaWYgKCgoamogKyAxKSAmIDB4ZikgPT0gMCkKKwkJCQkJcHJfaW5mbygiXG4iKTsKKwkJCX0KKwkJCXByX2luZm8oIlxuIik7CisJCX0KKworCQlpZiAoIWh3LT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIoZGF0YSk7CisJfSBlbHNlIHsKKwkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCSIlczogJXggJXggJXggJXggJXggc2l6ZSAweCV4LCBiaXRjbnQgJWRcbiIsCisJCQlfX2Z1bmNfXywKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCksCisJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1JQKSwKKwkJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF9ycCksCisJCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApLAorCQkJc2l6ZSwgUkVBRF9WUkVHKFZJRkZfQklUX0NOVCkpOworCX0KKworCWlmICh2ZGVjLT5tY19sb2FkZWQpIHsKKwkvKmZpcm13YXJlIGhhdmUgbG9hZCBiZWZvcmUsCisJICBhbmQgbm90IGNoYW5nZXMgdG8gYW5vdGhlci4KKwkgIGlnbm9yZSByZWxvYWQuCisJKi8KKwl9IGVsc2UgeworCQlyZXQgPSBhbXZkZWNfdmRlY19sb2FkbWNfYnVmX2V4KFZGT1JNQVRfTVBFRzEyLCAibW1wZWcxMiIsIHZkZWMsCisJCQlody0+ZnctPmRhdGEsIGh3LT5mdy0+bGVuKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiWyVkXSAlczogdGhlICVzIGZ3IGxvYWRpbmcgZmFpbGVkLCBlcnI6ICV4XG4iLCB2ZGVjLT5pZCwKKwkJCQlody0+ZnctPm5hbWUsIHRlZV9lbmFibGVkKCkgPyAiVEVFIiA6ICJsb2NhbCIsIHJldCk7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRk9SQ0VfRVhJVDsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJcmV0dXJuOworCQl9CisJCXZkZWMtPm1jX2xvYWRlZCA9IDE7CisJCXZkZWMtPm1jX3R5cGUgPSBWRk9STUFUX01QRUcxMjsKKwl9CisKKwlpZiAodm1wZWcxMl9od19jdHhfcmVzdG9yZShodykgPCAwKSB7CisJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9FUlJPUjsKKwkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19FUlJPUiwKKwkJImFtbXZkZWNfbXBlZzEyOiBlcnJvciBIVyBjb250ZXh0IHJlc3RvcmVcbiIpOworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJcmV0dXJuOworCX0KKwkvKndtYigpOyovCisJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX05PTkU7CisJaHctPnN0YXQgfD0gU1RBVF9NQ19MT0FEOworCXZkZWNfZW5hYmxlX2lucHV0KHZkZWMpOworCWh3LT5sYXN0X3ZsZF9sZXZlbCA9IDA7CisJc3RhcnRfcHJvY2Vzc190aW1lX3NldChodyk7CisJaWYgKHZkZWMtPm12ZnJtKQorCQl2ZGVjLT5tdmZybS0+aHdfZGVjb2RlX3N0YXJ0ID0gbG9jYWxfY2xvY2soKTsKKwlhbXZkZWNfc3RhcnQoKTsKKwlody0+c3RhdCB8PSBTVEFUX1ZERUNfUlVOOworCWh3LT5zdGF0IHw9IFNUQVRfVElNRVJfQVJNOworCWh3LT5pbml0X2ZsYWcgPSAxOworCW1vZF90aW1lcigmaHctPmNoZWNrX3RpbWVyLCBqaWZmaWVzICsgQ0hFQ0tfSU5URVJWQUwpOworfQorCitzdGF0aWMgdm9pZCByZXNldChzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodyA9CisJCShzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJaW50IGk7CisKKwlpZiAoaHctPnN0YXQgJiBTVEFUX1ZERUNfUlVOKSB7CisJCWFtdmRlY19zdG9wKCk7CisJCWh3LT5zdGF0ICY9IH5TVEFUX1ZERUNfUlVOOworCX0KKworCWZsdXNoX3dvcmsoJmh3LT53b3JrKTsKKwlmbHVzaF93b3JrKCZody0+dGltZW91dF93b3JrKTsKKwlmbHVzaF93b3JrKCZody0+bm90aWZ5X3dvcmspOworCWZsdXNoX3dvcmsoJmh3LT51c2VyZGF0YV9wdXNoX3dvcmspOworCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaHctPmJ1Zl9udW07IGkrKykgeworCQlody0+cGljc1tpXS52NGxfcmVmX2J1Zl9hZGRyID0gMDsKKwkJaHctPnZmYnVmX3VzZVtpXSA9IDA7CisJCWh3LT5yZWZfdXNlW2ldID0gMDsKKwl9CisKKwlJTklUX0tGSUZPKGh3LT5kaXNwbGF5X3EpOworCUlOSVRfS0ZJRk8oaHctPm5ld2ZyYW1lX3EpOworCisJZm9yIChpID0gMDsgaSA8IFZGX1BPT0xfU0laRTsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqdmYgPSAmaHctPnZmcG9vbFtpXTsKKworCQltZW1zZXQoKHZvaWQgKil2ZiwgMCwgc2l6ZW9mKCp2ZikpOworCQlody0+dmZwb29sW2ldLmluZGV4ID0gLTE7CisJCWtmaWZvX3B1dCgmaHctPm5ld2ZyYW1lX3EsIHZmKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgREVDT0RFX0JVRkZFUl9OVU1fTUFYOyBpKyspIHsKKwkJdmRlYy0+ZnJlZV9jYW52YXNfZXgoY2FudmFzX3koaHctPmNhbnZhc19zcGVjW2ldKSwgdmRlYy0+aWQpOworCQl2ZGVjLT5mcmVlX2NhbnZhc19leChjYW52YXNfdShody0+Y2FudmFzX3NwZWNbaV0pLCB2ZGVjLT5pZCk7CisJCWh3LT5jYW52YXNfc3BlY1tpXSA9IDB4ZmZmZmZmOworCX0KKworCWh3LT5yZWZzWzBdCQk9IC0xOworCWh3LT5yZWZzWzFdCQk9IC0xOworCWh3LT5jdHhfdmFsaWQJCT0gMDsKKwlody0+ZGVjX251bQkJPSAwOworCWh3LT5lb3MJCQk9IDA7CisJaHctPmJ1Zl9udW0JCT0gMDsKKwlody0+ZnJhbWVfd2lkdGgJCT0gMDsKKwlody0+ZnJhbWVfaGVpZ2h0CT0gMDsKKwlody0+Zmlyc3RfaV9mcmFtZV9yZWFkeSA9IDA7CisJaHctPmZpcnN0X2ZpZWxkX3RpbWVzdGFtcCA9IDA7CisJaHctPmZpcnN0X2ZpZWxkX3RpbWVzdGFtcF92YWxpZCA9IGZhbHNlOworCisJYXRvbWljX3NldCgmaHctPmRpc3BfbnVtLCAwKTsKKwlhdG9taWNfc2V0KCZody0+Z2V0X251bSwgMCk7CisJYXRvbWljX3NldCgmaHctPnB1dF9udW0sIDApOworCisJcHJfaW5mbygibXBlZzEyOiByZXNldC5cbiIpOworfQorCitzdGF0aWMgaW50IHZtcGVnMTJfc2V0X3RyaWNrbW9kZShzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1bnNpZ25lZCBsb25nIHRyaWNrbW9kZSkKK3sKKwlzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqaHcgPQorCShzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJaWYgKCFodykKKwkJcmV0dXJuIDA7CisKKwlpZiAodHJpY2ttb2RlID09IFRSSUNLTU9ERV9JKSB7CisJCWh3LT5pX29ubHkgPSAweDM7CisJCS8vdHJpY2ttb2RlX2kgPSAxOworCX0gZWxzZSBpZiAodHJpY2ttb2RlID09IFRSSUNLTU9ERV9OT05FKSB7CisJCWh3LT5pX29ubHkgPSAweDA7CisJCS8vdHJpY2ttb2RlX2kgPSAwOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbW12ZGVjX21wZWcxMl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB2ZGVjX3MgKnBkYXRhID0gKihzdHJ1Y3QgdmRlY19zICoqKXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodyA9IE5VTEw7CisJaW50IGNvbmZpZ192YWwgPSAwOworCisJcHJfaW5mbygiYW1tdmRlY19tcGVnMTIgcHJvYmUgc3RhcnQuXG4iKTsKKworCWlmIChwZGF0YSA9PSBOVUxMKSB7CisJCXByX2luZm8oImFtbXZkZWNfbXBlZzEyIHBsYXRmb3JtIGRhdGEgdW5kZWZpbmVkLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWh3ID0gdnphbGxvYyhzaXplb2Yoc3RydWN0IHZkZWNfbXBlZzEyX2h3X3MpKTsKKwlpZiAoaHcgPT0gTlVMTCkgeworCQlwcl9pbmZvKCJcbmFtbXZkZWNfbXBlZzEyIGRlY29kZXIgZHJpdmVyIGFsbG9jIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIHRoZSBjdHggZnJvbSB2NGwyIGRyaXZlci4gKi8KKwlody0+djRsMl9jdHggPSBwZGF0YS0+cHJpdmF0ZTsKKworCXBkYXRhLT5wcml2YXRlID0gaHc7CisJcGRhdGEtPmRlY19zdGF0dXMgPSB2bW1wZWcxMl9kZWNfc3RhdHVzOworCXBkYXRhLT5zZXRfdHJpY2ttb2RlID0gdm1wZWcxMl9zZXRfdHJpY2ttb2RlOworCXBkYXRhLT5ydW5fcmVhZHkgPSBydW5fcmVhZHk7CisJcGRhdGEtPnJ1biA9IHJ1bjsKKwlwZGF0YS0+cmVzZXQgPSByZXNldDsKKwlwZGF0YS0+aXJxX2hhbmRsZXIgPSB2bXBlZzEyX2lzcjsKKwlwZGF0YS0+dGhyZWFkZWRfaXJxX2hhbmRsZXIgPSB2bXBlZzEyX2lzcl90aHJlYWRfZm47CisJcGRhdGEtPmR1bXBfc3RhdGUgPSB2bXBlZzJfZHVtcF9zdGF0ZTsKKworCXBkYXRhLT51c2VyX2RhdGFfcmVhZCA9IHZtbXBlZzJfdXNlcl9kYXRhX3JlYWQ7CisJcGRhdGEtPnJlc2V0X3VzZXJkYXRhX2ZpZm8gPSB2bW1wZWcyX3Jlc2V0X3VzZXJkYXRhX2ZpZm87CisJcGRhdGEtPndha2V1cF91c2VyZGF0YV9wb2xsID0gdm1tcGVnMl93YWtldXBfdXNlcmRhdGFfcG9sbDsKKworCXNucHJpbnRmKGh3LT52ZGVjX25hbWUsIHNpemVvZihody0+dmRlY19uYW1lKSwKKwkJIm1wZWcxMi0lZCIsIHBkZXYtPmlkKTsKKwlzbnByaW50Zihody0+cHRzX25hbWUsIHNpemVvZihody0+cHRzX25hbWUpLAorCQkiJXMtdGltZXN0YW1wIiwgaHctPnZkZWNfbmFtZSk7CisJc25wcmludGYoaHctPm5ld19xX25hbWUsIHNpemVvZihody0+bmV3X3FfbmFtZSksCisJCSIlcy1uZXdmcmFtZV9xIiwgaHctPnZkZWNfbmFtZSk7CisJc25wcmludGYoaHctPmRpc3BfcV9uYW1lLCBzaXplb2YoaHctPmRpc3BfcV9uYW1lKSwKKwkJIiVzLWRpc3BmcmFtZV9xIiwgaHctPnZkZWNfbmFtZSk7CisKKwlpZiAocGRhdGEtPnVzZV92Zm1fcGF0aCkgeworCQlzbnByaW50ZihwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwgVkRFQ19QUk9WSURFUl9OQU1FX1NJWkUsCisJCQkgICAgVkZNX0RFQ19QUk9WSURFUl9OQU1FKTsKKwkJaHctPmZyYW1laW5mb19lbmFibGUgPSAxOworCX0KKwllbHNlCisJCXNucHJpbnRmKHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lLCBWREVDX1BST1ZJREVSX05BTUVfU0laRSwKKwkJCVBST1ZJREVSX05BTUUgIi4lMDJ4IiwgcGRldi0+aWQgJiAweGZmKTsKKworCXZmX3Byb3ZpZGVyX2luaXQoJnBkYXRhLT52ZnJhbWVfcHJvdmlkZXIsIHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lLAorCQkmdmZfcHJvdmlkZXJfb3BzLCBwZGF0YSk7CisKKwlpZiAocGRhdGEtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgREVDT0RFX0JVRkZFUl9OVU1fTUFYOyBpKyspCisJCQlody0+Y2FudmFzX3NwZWNbaV0gPSAweGZmZmZmZjsKKwl9CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGRhdGEpOworCisJaHctPmNhbnZhc19tb2RlID0gcGRhdGEtPmNhbnZhc19tb2RlOworCWlmIChwZGF0YS0+Y29uZmlnX2xlbikgeworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywKKwkJCSJwYXJtX3Y0bF9jb2RlY19lbmFibGUiLAorCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+aXNfdXNlZF92NGwgPSBjb25maWdfdmFsOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLAorCQkJInBhcm1fdjRsX2NhbnZhc19tZW1fbW9kZSIsCisJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWh3LT5jYW52YXNfbW9kZSA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV92NGxfbWV0YWRhdGFfY29uZmlnX2ZsYWciLAorCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+Zm9yY2VfcHJvZ19vbmx5ID0gKGNvbmZpZ192YWwgJiBWREVDX0NGR19GTEFHX1BST0dfT05MWSkgPyAxIDogMDsKKworCQkvKmlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLAorCQkJInBhcm1fdjRsX2R1cmF0aW9uIiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJdmRlY19mcmFtZV9yYXRlX3VldmVudChjb25maWdfdmFsKTsqLworCisJCWlmICgoZGVidWdfZW5hYmxlICYgSUdOT1JFX1BBUkFNX0ZST01fQ09ORklHKSA9PSAwICYmCisJCQlnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLAorCQkJInBhcm1fdjRsX2J1ZmZlcl9tYXJnaW4iLAorCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+ZHluYW1pY19idWZfbnVtX21hcmdpbj0gY29uZmlnX3ZhbDsKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJzaWRlYmluZF90eXBlIiwKKwkJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWh3LT5zaWRlYmluZF90eXBlID0gY29uZmlnX3ZhbDsKKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgInNpZGViaW5kX2NoYW5uZWxfaWQiLAorCQkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJaHctPnNpZGViaW5kX2NoYW5uZWxfaWQgPSBjb25maWdfdmFsOworCX0KKwlody0+cGxhdGZvcm1fZGV2ID0gcGRldjsKKwlody0+Y2h1bmtfaGVhZGVyX29mZnNldCA9IDA7CisJaHctPmNodW5rX3Jlc19zaXplID0gMDsKKwlody0+Zmlyc3RfZmllbGRfdGltZXN0YW1wID0gMDsKKwlody0+Zmlyc3RfZmllbGRfdGltZXN0YW1wX3ZhbGlkID0gZmFsc2U7CisKKwlpZiAoaHctPmZvcmNlX3Byb2dfb25seSkgeworCQlwZGF0YS0+cHJvZ19vbmx5ID0gMTsKKwkJZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSJmb3JjZWQgcHJvZ3Jlc3NpdmUgb3V0cHV0XG4iKTsKKwl9CisKKwlody0+dHZwX2ZsYWcgPSB2ZGVjX3NlY3VyZShwZGF0YSkgPyBDT0RFQ19NTV9GTEFHU19UVlAgOiAwOworCWlmIChwZGF0YS0+c3lzX2luZm8pCisJCWh3LT52bXBlZzEyX2Ftc3RyZWFtX2RlY19pbmZvID0gKnBkYXRhLT5zeXNfaW5mbzsKKworCWRlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSIlcywgc3lzaW5mbzogJWR4JWQsIHR2cF9mbGFnID0gMHgleFxuIiwKKwkJX19mdW5jX18sCisJCWh3LT52bXBlZzEyX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoLAorCQlody0+dm1wZWcxMl9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQsCisJCWh3LT50dnBfZmxhZyk7CisKKwlpZiAodm1wZWcxMl9pbml0KGh3KSA8IDApIHsKKwkJcHJfaW5mbygiYW1tdmRlY19tcGVnMTIgaW5pdCBmYWlsZWQuXG4iKTsKKwkJaWYgKGh3KSB7CisJCQl2ZnJlZShodyk7CisJCQlodyA9IE5VTEw7CisJCX0KKwkJcGRhdGEtPmRlY19zdGF0dXMgPSBOVUxMOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJdmRlY19zZXRfcHJlcGFyZV9sZXZlbChwZGF0YSwgc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCk7CisKKwl2ZGVjX3NldF92ZnJhbWVfY29tbShwZGF0YSwgRFJJVkVSX05BTUUpOworCisJaWYgKHBkYXRhLT5wYXJhbGxlbF9kZWMgPT0gMSkKKwkJdmRlY19jb3JlX3JlcXVlc3QocGRhdGEsIENPUkVfTUFTS19WREVDXzEpOworCWVsc2UgeworCQl2ZGVjX2NvcmVfcmVxdWVzdChwZGF0YSwgQ09SRV9NQVNLX1ZERUNfMSB8IENPUkVfTUFTS19IRVZDCisJCQkJCXwgQ09SRV9NQVNLX0NPTUJJTkUpOworCX0KKyNpZmRlZiBEVU1QX1VTRVJfREFUQQorCWFtdmRlY19tbXBlZzEyX2luaXRfdXNlcmRhdGFfZHVtcChodyk7CisJcmVzZXRfdXNlcl9kYXRhX2J1Zihodyk7CisjZW5kaWYKKworCS8qSU5JVF9XT1JLKCZ1c2VyZGF0YV9wdXNoX3dvcmssIHVzZXJkYXRhX3B1c2hfZG9fd29yayk7Ki8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbW12ZGVjX21wZWcxMl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKKworeworCXN0cnVjdCB2ZGVjX21wZWcxMl9od19zICpodyA9CisJCShzdHJ1Y3QgdmRlY19tcGVnMTJfaHdfcyAqKQorCQkoKChzdHJ1Y3QgdmRlY19zICopKHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpKSktPnByaXZhdGUpOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGh3KTsKKwlpbnQgaTsKKworCWlmIChody0+c3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJYW12ZGVjX3N0b3AoKTsKKwkJaHctPnN0YXQgJj0gflNUQVRfVkRFQ19SVU47CisJfQorCisJaWYgKGh3LT5zdGF0ICYgU1RBVF9JU1JfUkVHKSB7CisJCXZkZWNfZnJlZV9pcnEoVkRFQ19JUlFfMSwgKHZvaWQgKilodyk7CisJCWh3LT5zdGF0ICY9IH5TVEFUX0lTUl9SRUc7CisJfQorCisJaWYgKGh3LT5zdGF0ICYgU1RBVF9USU1FUl9BUk0pIHsKKwkJZGVsX3RpbWVyX3N5bmMoJmh3LT5jaGVja190aW1lcik7CisJCWh3LT5zdGF0ICY9IH5TVEFUX1RJTUVSX0FSTTsKKwl9CisJY2FuY2VsX3dvcmtfc3luYygmaHctPnVzZXJkYXRhX3B1c2hfd29yayk7CisJY2FuY2VsX3dvcmtfc3luYygmaHctPm5vdGlmeV93b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZody0+d29yayk7CisJY2FuY2VsX3dvcmtfc3luYygmaHctPnRpbWVvdXRfd29yayk7CisKKwlpZiAoaHctPm1tX2Jsa19oYW5kbGUpIHsKKwkJZGVjb2Rlcl9ibW11X2JveF9mcmVlKGh3LT5tbV9ibGtfaGFuZGxlKTsKKwkJaHctPm1tX2Jsa19oYW5kbGUgPSBOVUxMOworCX0KKwlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpCisJCXZkZWNfY29yZV9yZWxlYXNlKGh3X3RvX3ZkZWMoaHcpLCBDT1JFX01BU0tfVkRFQ18xKTsKKwllbHNlCisJCXZkZWNfY29yZV9yZWxlYXNlKGh3X3RvX3ZkZWMoaHcpLCBDT1JFX01BU0tfVkRFQ18xIHwgQ09SRV9NQVNLX0hFVkMpOworCXZkZWNfc2V0X3N0YXR1cyhod190b192ZGVjKGh3KSwgVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEKTsKKworCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQlmb3IgKGkgPSAwOyBpIDwgREVDT0RFX0JVRkZFUl9OVU1fTUFYOyBpKyspIHsKKwkJCXZkZWMtPmZyZWVfY2FudmFzX2V4KGNhbnZhc195KGh3LT5jYW52YXNfc3BlY1tpXSksIHZkZWMtPmlkKTsKKwkJCXZkZWMtPmZyZWVfY2FudmFzX2V4KGNhbnZhc191KGh3LT5jYW52YXNfc3BlY1tpXSksIHZkZWMtPmlkKTsKKwkJfQorCX0KKworCWlmIChody0+Y2NidWZfcGh5QWRkcmVzc192aXJ0KSB7CisJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSxody0+Y2NfYnVmX3NpemUsCisJCQlody0+Y2NidWZfcGh5QWRkcmVzc192aXJ0LCBody0+Y2NidWZfcGh5QWRkcmVzcyk7CisJCWh3LT5jY2J1Zl9waHlBZGRyZXNzX3ZpcnQgPSBOVUxMOworCQlody0+Y2NidWZfcGh5QWRkcmVzcyA9IDA7CisJfQorCisJaWYgKGh3LT51c2VyX2RhdGFfYnVmZmVyICE9IE5VTEwpIHsKKwkJa2ZyZWUoaHctPnVzZXJfZGF0YV9idWZmZXIpOworCQlody0+dXNlcl9kYXRhX2J1ZmZlciA9IE5VTEw7CisJfQorCXZtbXBlZzJfZGVzdHJveV91c2VyZGF0YV9tYW5hZ2VyKGh3KTsKKworI2lmZGVmIERVTVBfVVNFUl9EQVRBCisJYW12ZGVjX21tcGVnMTJfdW5pbml0X3VzZXJkYXRhX2R1bXAoaHcpOworI2VuZGlmCisKKwlpZiAoaHctPmZ3KSB7CisJCXZmcmVlKGh3LT5mdyk7CisJCWh3LT5mdyA9IE5VTEw7CisJfQorCisJdmZyZWUoaHcpOworCisJcHJfaW5mbygiYW1tdmRlY19tcGVnMTIgcmVtb3ZlZC5cbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhbW12ZGVjX21wZWcxMl9kcml2ZXIgPSB7CisJLnByb2JlID0gYW1tdmRlY19tcGVnMTJfcHJvYmUsCisJLnJlbW92ZSA9IGFtbXZkZWNfbXBlZzEyX3JlbW92ZSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZCA9IGFtdmRlY19zdXNwZW5kLAorCS5yZXN1bWUgPSBhbXZkZWNfcmVzdW1lLAorI2VuZGlmCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGNvZGVjX3Byb2ZpbGVfdCBhbW12ZGVjX21wZWcxMl9wcm9maWxlID0geworCS5uYW1lID0gIk1QRUcxMi1WNEwiLAorCS5wcm9maWxlID0gIiIKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWNvbmZpZyBtbXBlZzEyX2NvbmZpZ3NbXSA9IHsKKwlNQ19QVTMyKCJyYWRyIiwgJnJhZHIpLAorCU1DX1BVMzIoInJ2YWwiLCAmcnZhbCksCisJTUNfUFUzMigiZGVjX2NvbnRyb2wiLCAmZGVjX2NvbnRyb2wpLAorCU1DX1BVMzIoImVycm9yX2ZyYW1lX3NraXBfbGV2ZWwiLCAmZXJyb3JfZnJhbWVfc2tpcF9sZXZlbCksCisJTUNfUFUzMigiZGVjb2RlX3RpbWVvdXRfdmFsIiwgJmRlY29kZV90aW1lb3V0X3ZhbCksCisJTUNfUFUzMigic3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCIsICZzdGFydF9kZWNvZGVfYnVmX2xldmVsKSwKKwlNQ19QVTMyKCJwcmVfZGVjb2RlX2J1Zl9sZXZlbCIsICZwcmVfZGVjb2RlX2J1Zl9sZXZlbCksCisJTUNfUFUzMigiZGVidWdfZW5hYmxlIiwgJmRlYnVnX2VuYWJsZSksCisJTUNfUFUzMigidWRlYnVnX2ZsYWciLCAmdWRlYnVnX2ZsYWcpLAorCU1DX1BVMzIoIndpdGhvdXRfZGlzcGxheV9tb2RlIiwgJndpdGhvdXRfZGlzcGxheV9tb2RlKSwKKwlNQ19QVTMyKCJkeW5hbWljX2J1Zl9udW1fbWFyZ2luIiwgJmR5bmFtaWNfYnVmX251bV9tYXJnaW4pLAorI2lmZGVmIEFHQUlOX0hBU19USFJFU0hPTEQKKwlNQ19QVTMyKCJhZ2Fpbl90aHJlc2hvbGQiLCAmYWdhaW5fdGhyZXNob2xkKSwKKyNlbmRpZgorfTsKK3N0YXRpYyBzdHJ1Y3QgbWNvbmZpZ19ub2RlIG1tcGVnMTJfbm9kZTsKKworc3RhdGljIGludCBfX2luaXQgYW1tdmRlY19tcGVnMTJfZHJpdmVyX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcHJfaW5mbygiYW1tdmRlY19tcGVnMTIgbW9kdWxlIGluaXRcbiIpOworCisJaWYgKHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYW1tdmRlY19tcGVnMTJfZHJpdmVyKSkgeworCQlwcl9pbmZvKCJmYWlsZWQgdG8gcmVnaXN0ZXIgYW1tdmRlY19tcGVnMTIgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXZjb2RlY19wcm9maWxlX3JlZ2lzdGVyKCZhbW12ZGVjX21wZWcxMl9wcm9maWxlKTsKKwlJTklUX1JFR19OT0RFX0NPTkZJR1MoIm1lZGlhLmRlY29kZXIiLCAmbW1wZWcxMl9ub2RlLAorCQkibW1wZWcxMi12NGwiLCBtbXBlZzEyX2NvbmZpZ3MsIENPTkZJR19GT1JfUlcpOworCXZjb2RlY19mZWF0dXJlX3JlZ2lzdGVyKFZGT1JNQVRfTVBFRzEyLCAxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFtbXZkZWNfbXBlZzEyX2RyaXZlcl9yZW1vdmVfbW9kdWxlKHZvaWQpCit7CisJcHJfaW5mbygiYW1tdmRlY19tcGVnMTIgbW9kdWxlIGV4aXQuXG4iKTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYW1tdmRlY19tcGVnMTJfZHJpdmVyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCittb2R1bGVfcGFyYW0oZGVjX2NvbnRyb2wsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkZWNfY29udHJvbCwgIlxuIGFtbXZkZWNfbXBlZzEyIGRlY29kZXIgY29udHJvbFxuIik7Cittb2R1bGVfcGFyYW0oZXJyb3JfZnJhbWVfc2tpcF9sZXZlbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVycm9yX2ZyYW1lX3NraXBfbGV2ZWwsCisJCQkJICJcbiBhbW12ZGVjX21wZWcxMiBlcnJvcl9mcmFtZV9za2lwX2xldmVsXG4iKTsKKworbW9kdWxlX3BhcmFtKHJhZHIsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhyYWRyLCAiXG5yYWRyXG4iKTsKKworbW9kdWxlX3BhcmFtKHJ2YWwsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhydmFsLCAiXG5ydmFsXG4iKTsKKworbW9kdWxlX3BhcmFtKGRlYnVnX2VuYWJsZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnX2VuYWJsZSwKKwkJCQkJICJcbiBhbW12ZGVjX21wZWcxMiBkZWJ1ZyBlbmFibGVcbiIpOworbW9kdWxlX3BhcmFtKHByZV9kZWNvZGVfYnVmX2xldmVsLCBpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhwcmVfZGVjb2RlX2J1Zl9sZXZlbCwKKwkJIlxuIGFtbXZkZWNfbXBlZzEyIHByZV9kZWNvZGVfYnVmX2xldmVsXG4iKTsKKworbW9kdWxlX3BhcmFtKHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0X2RlY29kZV9idWZfbGV2ZWwsCisJCSJcbiBhbW12ZGVjX21wZWcxMiBzdGFydF9kZWNvZGVfYnVmX2xldmVsXG4iKTsKKworbW9kdWxlX3BhcmFtKGRlY29kZV90aW1lb3V0X3ZhbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlY29kZV90aW1lb3V0X3ZhbCwgIlxuIGFtbXZkZWNfbXBlZzEyIGRlY29kZV90aW1lb3V0X3ZhbFxuIik7CisKK21vZHVsZV9wYXJhbShkeW5hbWljX2J1Zl9udW1fbWFyZ2luLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZHluYW1pY19idWZfbnVtX21hcmdpbiwgIlxuIGFtbXZkZWNfbXBlZzEyIGR5bmFtaWNfYnVmX251bV9tYXJnaW5cbiIpOworCittb2R1bGVfcGFyYW1fYXJyYXkobWF4X3Byb2Nlc3NfdGltZSwgdWludCwgJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtKHVkZWJ1Z19mbGFnLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModWRlYnVnX2ZsYWcsICJcbiBhbW12ZGVjX21wZWcxMiB1ZGVidWdfZmxhZ1xuIik7CisKK21vZHVsZV9wYXJhbShkaXJ0eV9hZ2Fpbl90aHJlc2hvbGQsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRpcnR5X2FnYWluX3RocmVzaG9sZCwgIlxuIGFtbXZkZWNfbXBlZzEyIGRpcnR5X2FnYWluX3RocmVzaG9sZFxuIik7CisKKworI2lmZGVmIEFHQUlOX0hBU19USFJFU0hPTEQKK21vZHVsZV9wYXJhbShhZ2Fpbl90aHJlc2hvbGQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhhZ2Fpbl90aHJlc2hvbGQsICJcbiBhZ2Fpbl90aHJlc2hvbGRcbiIpOworI2VuZGlmCisKK21vZHVsZV9wYXJhbSh3aXRob3V0X2Rpc3BsYXlfbW9kZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHdpdGhvdXRfZGlzcGxheV9tb2RlLCAiXG4gYW1tdmRlY19tcGVnMTIgd2l0aG91dF9kaXNwbGF5X21vZGVcbiIpOworCittb2R1bGVfcGFyYW0oZXJyb3JfcHJvY19wb2xpY3ksIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhlcnJvcl9wcm9jX3BvbGljeSwgIlxuIGFtbXZkZWNfbXBlZzEyIGVycm9yX3Byb2NfcG9saWN5XG4iKTsKKworbW9kdWxlX2luaXQoYW1tdmRlY19tcGVnMTJfZHJpdmVyX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGFtbXZkZWNfbXBlZzEyX2RyaXZlcl9yZW1vdmVfbW9kdWxlKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTUxPR0lDIE1VTFRJIE1QRUcxLzIgVmlkZW8gRGVjb2RlciBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL21wZWc0L01ha2VmaWxlIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC9tcGVnNC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTY0OTQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC9tcGVnNC9NYWtlZmlsZQpAQCAtMCwwICsxLDIgQEAKK29iai0kKENPTkZJR19BTUxPR0lDX01FRElBX1ZERUNfTVBFRzRfTVVMVEkpICs9IGFtdmRlY19tbXBlZzRfdjRsLm8KK2FtdmRlY19tbXBlZzRfdjRsLW9ianMgKz0gdm1wZWc0X211bHRpLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlcl92NGwvbXBlZzQvdm1wZWc0X211bHRpLmMgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL21wZWc0L3ZtcGVnNF9tdWx0aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZDhmNDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL21wZWc0L3ZtcGVnNF9tdWx0aS5jCkBAIC0wLDAgKzEsMzAwMyBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9hbXBvcnRzL3ZtcGVnNC5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy9hbXN0cmVhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZnJhbWVfc3luYy9wdHNzZXJ2Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3Byb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3JlY2VpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jYW52YXMvY2FudmFzLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jb2RlY19tbS9jb2RlY19tbS5oPgorLy8jaW5jbHVkZSA8bGludXgvYW1sb2dpYy90ZWUuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L3RlZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkL2Nsb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy92ZGVjX3JlZy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvcmVnaXN0ZXJzL3JlZ2lzdGVyLmg+CisjaW5jbHVkZSAiLi4vLi4vLi4vc3RyZWFtX2lucHV0L2FtcG9ydHMvYW1wb3J0c19wcml2LmgiCisjaW5jbHVkZSAiLi4vLi4vLi4vY29tbW9uL2NoaXBzL2RlY29kZXJfY3B1X3Zlcl9pbmZvLmgiCisjaW5jbHVkZSAiLi4vLi4vZGVjb2Rlci91dGlscy9hbXZkZWMuaCIKKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL3ZkZWNfaW5wdXQuaCIKKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL3ZkZWMuaCIKKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL2Zpcm13YXJlLmgiCisjaW5jbHVkZSAiLi4vLi4vZGVjb2Rlci91dGlscy9kZWNvZGVyX21tdV9ib3guaCIKKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL2RlY29kZXJfYm1tdV9ib3guaCIKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvbmZpZ3MuaD4KKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL2Zpcm13YXJlLmgiCisjaW5jbHVkZSAiLi4vLi4vZGVjb2Rlci91dGlscy92ZGVjX3Y0bDJfYnVmZmVyX29wcy5oIgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvY29uZmlnX3BhcnNlci5oIgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItbWVtMm1lbS5oPgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvdmRlY19mZWF0dXJlLmgiCisKKyNkZWZpbmUgRFJJVkVSX05BTUUgImFtbXZkZWNfbXBlZzRfdjRsIgorCisjZGVmaW5lIE1FTV9OQU1FICJjb2RlY19tbXBlZzQiCisKKyNkZWZpbmUgREVCVUdfUFRTCisKKyNkZWZpbmUgTlYyMQorI2RlZmluZSBJX1BJQ1RVUkUgICAwCisjZGVmaW5lIFBfUElDVFVSRSAgIDEKKyNkZWZpbmUgQl9QSUNUVVJFICAgMgorI2RlZmluZSBHRVRfUElDX1RZUEUodHlwZSkgKCJJUEIjIyMjIlt0eXBlJjB4M10pCisKKyNkZWZpbmUgT1JJX0JVRkZFUl9TVEFSVF9BRERSICAgMHgwMTAwMDAwMAorI2RlZmluZSBERUZBVUxUX01FTV9TSVpFCSgzMipTWl8xTSkKKworI2RlZmluZSBJTlRFUkxBQ0VfRkxBRyAgICAgICAgICAweDgwCisjZGVmaW5lIFRPUF9GSUVMRF9GSVJTVF9GTEFHICAgIDB4NDAKKworLyogcHJvdG9jb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1SRUdfUkVGMCAgICAgICAgICAgQVZfU0NSQVRDSF8xCisjZGVmaW5lIE1SRUdfUkVGMSAgICAgICAgICAgQVZfU0NSQVRDSF8yCisjZGVmaW5lIE1QNF9QSUNfUkFUSU8gICAgICAgQVZfU0NSQVRDSF81CisjZGVmaW5lIE1QNF9SQVRFICAgICAgICAgICAgQVZfU0NSQVRDSF8zCisjZGVmaW5lIE1QNF9FUlJfQ09VTlQgICAgICAgQVZfU0NSQVRDSF82CisjZGVmaW5lIE1QNF9QSUNfV0ggICAgICAgICAgQVZfU0NSQVRDSF83CisjZGVmaW5lIE1SRUdfSU5QVVQgICAgICAgICAgQVZfU0NSQVRDSF84CisjZGVmaW5lIE1SRUdfQlVGRkVST1VUICAgICAgQVZfU0NSQVRDSF85CisjZGVmaW5lIE1QNF9OT1RfQ09ERURfQ05UICAgQVZfU0NSQVRDSF9BCisjZGVmaW5lIE1QNF9WT1BfVElNRV9JTkMgICAgQVZfU0NSQVRDSF9CCisjZGVmaW5lIE1QNF9PRkZTRVRfUkVHICAgICAgQVZfU0NSQVRDSF9DCisjZGVmaW5lIE1QNF9WT1NfSU5GTyAgICAgICAgQVZfU0NSQVRDSF9ECisjZGVmaW5lIE1QNF9TWVNfUkFURSAgICAgICAgQVZfU0NSQVRDSF9FCisjZGVmaW5lIE1FTV9PRkZTRVRfUkVHICAgICAgQVZfU0NSQVRDSF9GCisjZGVmaW5lIE1QNF9QSUNfSU5GTyAgICAgICAgQVZfU0NSQVRDSF9ICisKKyNkZWZpbmUgUEFSQ19GT1JCSURERU4gICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEFSQ19TUVVBUkUgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUEFSQ19DSUYgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUEFSQ18xMF8xMSAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUEFSQ18xNl8xMSAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgUEFSQ180MF8zMyAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgUEFSQ19SRVNFUlZFRCAgICAgICAgICAgICAgIDYKKy8qIHZhbHVlcyBiZXR3ZWVuIDYgYW5kIDE0IGFyZSByZXNlcnZlZCAqLworI2RlZmluZSBQQVJDX0VYVEVOREVEICAgICAgICAgICAgICAxNQorCisjZGVmaW5lIFZGX1BPT0xfU0laRSAgICAgICAgICA2NAorI2RlZmluZSBERUNPREVfQlVGRkVSX05VTV9NQVggMTYKKyNkZWZpbmUgREVDT0RFX0JVRkZFUl9OVU1fREVGIDgKKyNkZWZpbmUgUFVUX0lOVEVSVkFMICAgICAgICAoSFovMTAwKQorI2RlZmluZSBNQVhfQk1NVV9CVUZGRVJfTlVNIChERUNPREVfQlVGRkVSX05VTV9NQVggKyAxKQorI2RlZmluZSBXT1JLU1BBQ0VfU0laRQkJKDEyKlNaXzY0SykKKworI2RlZmluZSBDVFhfTE1FTV9TV0FQX09GRlNFVCAgICAwCisjZGVmaW5lIENUWF9RVUFOVF9NQVRSSVhfT0ZGU0VUIDB4ODAwCisvKiBkY2FjIGJ1ZmZlciBtdXN0IGFsaWduIGF0IDRrIGJvdW5kYXJ5ICovCisjZGVmaW5lIENUWF9EQ0FDX0JVRl9PRkZTRVQgICAgIDB4MTAwMAorI2RlZmluZSBDVFhfREVDQlVGX09GRlNFVCAgICAgICAoMHgwYzAwMDAgKyAweDEwMDApCisKKyNkZWZpbmUgUkFURV9ERVRFQ1RfQ09VTlQgICA1CisjZGVmaW5lIERVUkFUSU9OX1VOSVQgICAgICAgOTYwMDAKKyNkZWZpbmUgUFRTX1VOSVQgICAgICAgICAgICA5MDAwMAorI2RlZmluZSBDSEVDS19JTlRFUlZBTCAgICAgICAgKEhaLzEwMCkKKworI2RlZmluZSBEVVIyUFRTKHgpICgoeCkgLSAoKHgpID4+IDQpKQorCisvKiA5NjAwMC8oNjBmcHMqIDJmaWVsZCkgPSA4MDAsIDk2MDAwLzEwZnBzID0gOTYwMCAqLworI2RlZmluZSBNUEVHNF9WQUxJRF9EVVIoeCkgKCh4IDwgOTYwMCkgJiYgKHggPiA3OTkpKQorCisjZGVmaW5lIE1BWF9NUEVHNF9TVVBQT1JUX1NJWkUgKDE5MjAqMTA4OCkKKworI2RlZmluZSBERUNfUkVTVUxUX05PTkUgICAgIDAKKyNkZWZpbmUgREVDX1JFU1VMVF9ET05FICAgICAxCisjZGVmaW5lIERFQ19SRVNVTFRfQUdBSU4gICAgMgorI2RlZmluZSBERUNfUkVTVUxUX0VSUk9SICAgIDMKKyNkZWZpbmUgREVDX1JFU1VMVF9GT1JDRV9FWElUIDQKKyNkZWZpbmUgREVDX1JFU1VMVF9FT1MJCTUKKyNkZWZpbmUgREVDX1JFU1VMVF9VTkZJTklTSAk2CisjZGVmaW5lIERFQ19SRVNVTFRfRVJST1JfU1pJRQk3CisKKyNkZWZpbmUgREVDX0RFQ09ERV9USU1FT1VUICAgICAgICAgMHgyMQorI2RlZmluZSBERUNPREVfSUQoaHcpIChod190b192ZGVjKGh3KS0+aWQpCisjZGVmaW5lIERFQ09ERV9TVE9QX1BPUyAgICAgICAgIEFWX1NDUkFUQ0hfSworCisjZGVmaW5lIElOVkFMSURfSURYIAkJKC0xKSAgLyogSW52YWxpZCBidWZmZXIgaW5kZXguKi8KKworc3RhdGljIHUzMiB1ZGVidWdfZmxhZzsKKworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyAqdm1wZWdfdmZfcGVlayh2b2lkICopOworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyAqdm1wZWdfdmZfZ2V0KHZvaWQgKik7CitzdGF0aWMgdm9pZCB2bXBlZ192Zl9wdXQoc3RydWN0IHZmcmFtZV9zICosIHZvaWQgKik7CitzdGF0aWMgaW50IHZtcGVnX3ZmX3N0YXRlcyhzdHJ1Y3QgdmZyYW1lX3N0YXRlcyAqc3RhdGVzLCB2b2lkICopOworc3RhdGljIGludCB2bXBlZ19ldmVudF9jYihpbnQgdHlwZSwgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKK3N0YXRpYyBpbnQgbm90aWZ5X3Y0bF9lb3Moc3RydWN0IHZkZWNfcyAqdmRlYyk7CisKK3N0YXRpYyBpbnQgcHJlX2RlY29kZV9idWZfbGV2ZWwgPSAweDgwMDsKK3N0YXRpYyBpbnQgc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCA9IDB4NDAwMDsKK3N0YXRpYyBpbnQgZGVidWdfZW5hYmxlOworc3RhdGljIHVuc2lnbmVkIGludCByYWRyOworc3RhdGljIHVuc2lnbmVkIGludCBydmFsOworLyogMHg0MGJpdCA9IDhieXRlICovCitzdGF0aWMgdW5zaWduZWQgaW50IGZybWJhc2VfY29udF9iaXRsZXZlbCA9IDB4NDA7CitzdGF0aWMgdW5zaWduZWQgaW50IGR5bmFtaWNfYnVmX251bV9tYXJnaW47CisKKyNkZWZpbmUgVk1QRUc0X0RFVl9OVU0gICAgICAgIDkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X2RlY29kZV9pbnN0YW5jZV9udW0gPSBWTVBFRzRfREVWX05VTTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X3Byb2Nlc3NfdGltZVtWTVBFRzRfREVWX05VTV07CitzdGF0aWMgdW5zaWduZWQgaW50IGRlY29kZV90aW1lb3V0X3ZhbCA9IDIwMDsKKworc3RhdGljIHUzMiB3aXRob3V0X2Rpc3BsYXlfbW9kZTsKKworI3VuZGVmIHByX2luZm8KKyNkZWZpbmUgcHJfaW5mbyBwcmludGsKK3Vuc2lnbmVkIGludCBtcGVnNF9kZWJ1Z19tYXNrID0gMHhmZjsKK3N0YXRpYyB1MzIgcnVuX3JlYWR5X21pbl9idWZfbnVtID0gMjsKKworCisjZGVmaW5lIFBSSU5UX0ZMQUdfRVJST1IgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBQUklOVF9GTEFHX1JVTl9GTE9XICAgICAgICAgICAwWDAwMDEKKyNkZWZpbmUgUFJJTlRfRkxBR19USU1FSU5GTyAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFBSSU5UX0ZMQUdfVUNPREVfREVUQUlMCSAgICAgIDB4MDAwNAorI2RlZmluZSBQUklOVF9GTEFHX1ZMRF9ERVRBSUwgICAgICAgICAweDAwMDgKKyNkZWZpbmUgUFJJTlRfRkxBR19ERUNfREVUQUlMICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFBSSU5UX0ZMQUdfQlVGRkVSX0RFVEFJTCAgICAgIDB4MDAyMAorI2RlZmluZSBQUklOVF9GTEFHX1JFU1RPUkUgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgUFJJTlRfRlJBTUVfTlVNICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFBSSU5UX0ZMQUdfRk9SQ0VfRE9ORSAgICAgICAgIDB4MDEwMAorI2RlZmluZSBQUklOVF9GTEFHX0NPVU5URVIgICAgICAgICAgICAwWDAyMDAKKyNkZWZpbmUgUFJJTlRfRlJBTUVCQVNFX0RBVEEgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMgICAgICAgIDB4MDgwMAorI2RlZmluZSBQUklOVF9GTEFHX1RJTUVPVVRfU1RBVFVTICAgICAweDEwMDAKKyNkZWZpbmUgUFJJTlRfRkxBR19WNExfREVUQUlMICAgICAgICAgMHg4MDAwCisjZGVmaW5lIElHTk9SRV9QQVJBTV9GUk9NX0NPTkZJRyAgICAgIDB4ODAwMDAwMAorCitpbnQgbW1wZWc0X2RlYnVnX3ByaW50KGludCBpbmRleCwgaW50IGRlYnVnX2ZsYWcsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCWlmICgoKGRlYnVnX2VuYWJsZSAmIGRlYnVnX2ZsYWcpICYmCisJCSgoMSA8PCBpbmRleCkgJiBtcGVnNF9kZWJ1Z19tYXNrKSkKKwkJfHwgKGRlYnVnX2ZsYWcgPT0gUFJJTlRfRkxBR19FUlJPUikpIHsKKwkJdW5zaWduZWQgY2hhciAqYnVmID0ga3phbGxvYyg1MTIsIEdGUF9BVE9NSUMpOworCQlpbnQgbGVuID0gMDsKKwkJdmFfbGlzdCBhcmdzOworCisJCWlmICghYnVmKQorCQkJcmV0dXJuIDA7CisKKwkJdmFfc3RhcnQoYXJncywgZm10KTsKKwkJbGVuID0gc3ByaW50ZihidWYsICIlZDogIiwgaW5kZXgpOworCQl2c25wcmludGYoYnVmICsgbGVuLCA1MTItbGVuLCBmbXQsIGFyZ3MpOworCQlwcl9pbmZvKCIlcyIsIGJ1Zik7CisJCXZhX2VuZChhcmdzKTsKKwkJa2ZyZWUoYnVmKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBwaWNfaW5mb190IHsKKwlpbnQgaW5kZXg7CisJdTMyIHBpY190eXBlOworCXUzMiBwaWNfaW5mbzsKKwl1MzIgcHRzOworCXU2NCBwdHM2NDsKKwlib29sIHB0c192YWxpZDsKKwl1MzIgZHVyYXRpb247CisJdTMyIHJlcGVhdF9jbnQ7CisJdWxvbmcgdjRsX3JlZl9idWZfYWRkcjsKKwl1MzIgaHdfZGVjb2RlX3RpbWU7CisJdTMyIGZyYW1lX3NpemU7IC8vIEZvciBmcmFtZSBiYXNlIG1vZGU7CisJdTY0IHRpbWVzdGFtcDsKKwl1MzIgb2Zmc2V0OworCXUzMiBoZWlnaHQ7CisJdTMyIHdpZHRoOworfTsKKworc3RydWN0IHZkZWNfbXBlZzRfaHdfcyB7CisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRmb3JtX2RldjsKKwkvKiBzdHJ1Y3QgZGV2aWNlICpjbWFfZGV2OyAqLworCisJREVDTEFSRV9LRklGTyhuZXdmcmFtZV9xLCBzdHJ1Y3QgdmZyYW1lX3MgKiwgVkZfUE9PTF9TSVpFKTsKKwlERUNMQVJFX0tGSUZPKGRpc3BsYXlfcSwgc3RydWN0IHZmcmFtZV9zICosIFZGX1BPT0xfU0laRSk7CisJc3RydWN0IHZmcmFtZV9zIHZmcG9vbFtWRl9QT09MX1NJWkVdOworCXN0cnVjdCB2ZnJhbWVfcyB2ZnJhbWVfZHVtbXk7CisJczMyIHZmYnVmX3VzZVtERUNPREVfQlVGRkVSX05VTV9NQVhdOworCXUzMiBmcmFtZV93aWR0aDsKKwl1MzIgZnJhbWVfaGVpZ2h0OworCXUzMiBmcmFtZV9kdXI7CisJdTMyIGZyYW1lX3Byb2c7CisKKwl1MzIgY3R4X3ZhbGlkOworCXUzMiByZWdfdmNvcF9jdHJsX3JlZzsKKwl1MzIgcmVnX3BpY19oZWFkX2luZm87CisJdTMyIHJlZ19tcGVnMV8yX3JlZzsKKwl1MzIgcmVnX3NsaWNlX3FwOworCXUzMiByZWdfbXA0X3BpY193aDsKKwl1MzIgcmVnX21wNF9yYXRlOworCXUzMiByZWdfbWJfaW5mbzsKKwl1MzIgcmVnX2RjX2FjX2N0cmw7CisJdTMyIHJlZ19pcWlkY3RfY29udHJvbDsKKwl1MzIgcmVnX3Jlc3luY19tYXJrZXJfbGVuZ3RoOworCXUzMiByZWdfcnZfYWlfbWJfY291bnQ7CisJc3RydWN0IHRpbWVyX2xpc3QgY2hlY2tfdGltZXI7CisJdTMyIGRlY29kZV90aW1lb3V0X2NvdW50OworCXUzMiB0aW1lb3V0X2NudDsKKwl1bnNpZ25lZCBsb25nIGludCBzdGFydF9wcm9jZXNzX3RpbWU7CisKKwl1MzIgbGFzdF92bGRfbGV2ZWw7CisJdTggaW5pdF9mbGFnOworCXUzMiBlb3M7CisJdm9pZCAqbW1fYmxrX2hhbmRsZTsKKworCXN0cnVjdCB2ZnJhbWVfY2h1bmtfcyAqY2h1bms7CisJdTMyIGNodW5rX29mZnNldDsKKwl1MzIgY2h1bmtfc2l6ZTsKKwl1MzIgY2h1bmtfZnJhbWVfY291bnQ7CisJdTMyIHN0YXQ7CisJdW5zaWduZWQgbG9uZyBidWZfc3RhcnQ7CisJdTMyIGJ1Zl9zaXplOworCS8qCisJdW5zaWduZWQgbG9uZyBjbWFfYWxsb2NfYWRkcjsKKwlpbnQgY21hX2FsbG9jX2NvdW50OworCSovCisJdTMyIHZtcGVnNF9yYXRpbzsKKwl1NjQgdm1wZWc0X3JhdGlvNjQ7CisJdTMyIHJhdGVfZGV0ZWN0OworCXUzMiB2bXBlZzRfcm90YXRpb247CisJdTMyIHRvdGFsX2ZyYW1lOworCXUzMiBsYXN0X3ZvcF90aW1lX2luYzsKKwl1MzIgbGFzdF9kdXJhdGlvbjsKKwl1MzIgbGFzdF9hbmNoX3B0czsKKwl1MzIgdm9wX3RpbWVfaW5jX3NpbmNlX2xhc3RfYW5jaDsKKwl1MzIgZnJhbWVfbnVtX3NpbmNlX2xhc3RfYW5jaDsKKwl1NjQgbGFzdF9hbmNoX3B0c191czY0OworCisJdTMyIGxhc3RfcHRzOworCXU2NCBsYXN0X3B0czY0OworCXUzMiBwdHNfaGl0OworCXUzMiBwdHNfbWlzc2VkOworCXUzMiBwdHNfaV9oaXQ7CisJdTMyIHB0c19pX21pc3NlZDsKKwlzdHJ1Y3QgcGljX2luZm9fdCBwaWNbREVDT0RFX0JVRkZFUl9OVU1fTUFYXTsKKwl1MzIgY2FudmFzX3NwZWNbREVDT0RFX0JVRkZFUl9OVU1fTUFYXTsKKyNpZmRlZiBOVjIxCisJc3RydWN0IGNhbnZhc19jb25maWdfcyBjYW52YXNfY29uZmlnW0RFQ09ERV9CVUZGRVJfTlVNX01BWF1bMl07CisjZWxzZQorCXN0cnVjdCBjYW52YXNfY29uZmlnX3MgY2FudmFzX2NvbmZpZ1tERUNPREVfQlVGRkVSX05VTV9NQVhdWzNdOworI2VuZGlmCisJc3RydWN0IGRlY19zeXNpbmZvIHZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mbzsKKworCXMzMiByZWZzWzJdOworCWludCBkZWNfcmVzdWx0OworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCisJdm9pZCAoKnZkZWNfY2IpKHN0cnVjdCB2ZGVjX3MgKiwgdm9pZCAqKTsKKwl2b2lkICp2ZGVjX2NiX2FyZzsKKwl1MzIgZnJhbWVfbnVtOworCXUzMiBzeXNfbXA0X3JhdGU7CisJdTMyIHJ1bl9jb3VudDsKKwl1MzIJbm90X3J1bl9yZWFkeTsKKwl1MzIgYnVmZmVyX25vdF9yZWFkeTsKKwl1MzIJaW5wdXRfZW1wdHk7CisJYXRvbWljX3QgcGVla19udW07CisJYXRvbWljX3QgZ2V0X251bTsKKwlhdG9taWNfdCBwdXRfbnVtOworCXUzMiBmaXJzdF9pX2ZyYW1lX3JlYWR5OworCXUzMiBkcm9wX2ZyYW1lX2NvdW50OworCXUzMiB1bnN0YWJsZV9wdHM7CisJdTMyIGxhc3RfZGVjX3B0czsKKworCXN0cnVjdCBmaXJtd2FyZV9zICpmdzsKKwl1MzIgYmxrbW9kZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3E7CisJYm9vbCBpc191c2VkX3Y0bDsKKwl2b2lkICp2NGwyX2N0eDsKKwlib29sIHY0bF9wYXJhbXNfcGFyc2VkOworCXUzMiBidWZfbnVtOworCXUzMiBkeW5hbWljX2J1Zl9udW1fbWFyZ2luOworCXUzMiBpX29ubHk7CisJaW50IHNpZGViaW5kX3R5cGU7CisJaW50IHNpZGViaW5kX2NoYW5uZWxfaWQ7CisJdTMyIHJlc19jaF9mbGFnOworCXUzMiBwcm9maWxlX2lkYzsKKwl1MzIgbGV2ZWxfaWRjOworCXVuc2lnbmVkIGludCBpX2RlY29kZWRfZnJhbWVzOworCXVuc2lnbmVkIGludCBpX2xvc3RfZnJhbWVzOworCXVuc2lnbmVkIGludCBpX2NvbmNlYWxlZF9mcmFtZXM7CisJdW5zaWduZWQgaW50IHBfZGVjb2RlZF9mcmFtZXM7CisJdW5zaWduZWQgaW50IHBfbG9zdF9mcmFtZXM7CisJdW5zaWduZWQgaW50IHBfY29uY2VhbGVkX2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgYl9kZWNvZGVkX2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgYl9sb3N0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgYl9jb25jZWFsZWRfZnJhbWVzOworCWludCB2ZGVjX3BnX2VuYWJsZV9mbGFnOworCXVsb25nIGZiX3Rva2VuOworCWNoYXIgdmRlY19uYW1lWzMyXTsKKwljaGFyIHB0c19uYW1lWzMyXTsKKwljaGFyIG5ld19xX25hbWVbMzJdOworCWNoYXIgZGlzcF9xX25hbWVbMzJdOworfTsKK3N0YXRpYyB2b2lkIHZtcGVnNF9sb2NhbF9pbml0KHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3KTsKK3N0YXRpYyBpbnQgdm1wZWc0X2h3X2N0eF9yZXN0b3JlKHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3KTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCisJZ2V0X2RhdGFfY2hlY2tfc3VtKHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3LCBpbnQgc2l6ZSk7CitzdGF0aWMgdm9pZCBmbHVzaF9vdXRwdXQoc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqIGh3KTsKKworI2RlZmluZSBQUk9WSURFUl9OQU1FICAgInZkZWMubXBlZzQiCisKKy8qCisgKmludCBxdWVyeV92aWRlb19zdGF0dXMoaW50IHR5cGUsIGludCAqdmFsdWUpOworICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHZmcmFtZV9vcGVyYXRpb25zX3MgdmZfcHJvdmlkZXJfb3BzID0geworCS5wZWVrID0gdm1wZWdfdmZfcGVlaywKKwkuZ2V0ID0gdm1wZWdfdmZfZ2V0LAorCS5wdXQgPSB2bXBlZ192Zl9wdXQsCisJLmV2ZW50X2NiID0gdm1wZWdfZXZlbnRfY2IsCisJLnZmX3N0YXRlcyA9IHZtcGVnX3ZmX3N0YXRlcywKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFzcGVjdF9yYXRpb190YWJsZVsxNl0gPSB7CisJUEFSQ19GT1JCSURERU4sCisJUEFSQ19TUVVBUkUsCisJUEFSQ19DSUYsCisJUEFSQ18xMF8xMSwKKwlQQVJDXzE2XzExLAorCVBBUkNfNDBfMzMsCisJUEFSQ19SRVNFUlZFRCwgUEFSQ19SRVNFUlZFRCwgUEFSQ19SRVNFUlZFRCwgUEFSQ19SRVNFUlZFRCwKKwlQQVJDX1JFU0VSVkVELCBQQVJDX1JFU0VSVkVELCBQQVJDX1JFU0VSVkVELCBQQVJDX1JFU0VSVkVELAorCVBBUkNfUkVTRVJWRUQsIFBBUkNfRVhURU5ERUQKK307CisKK3N0YXRpYyB2b2lkIHJlc2V0X3Byb2Nlc3NfdGltZShzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodyk7CisKK3N0YXRpYyB2b2lkIG1wZWc0X3B1dF92aWRlb19mcmFtZSh2b2lkICp2ZGVjX2N0eCwgc3RydWN0IHZmcmFtZV9zICp2ZikKK3sKKwl2bXBlZ192Zl9wdXQodmYsIHZkZWNfY3R4KTsKK30KKworc3RhdGljIHZvaWQgbXBlZzRfZ2V0X3ZpZGVvX2ZyYW1lKHZvaWQgKnZkZWNfY3R4LCBzdHJ1Y3QgdmZyYW1lX3MgKip2ZikKK3sKKwkqdmYgPSB2bXBlZ192Zl9nZXQodmRlY19jdHgpOworfQorCitzdGF0aWMgc3RydWN0IHRhc2tfb3BzX3MgdGFza19kZWNfb3BzID0geworCS50eXBlCQk9IFRBU0tfVFlQRV9ERUMsCisJLmdldF92ZnJhbWUJPSBtcGVnNF9nZXRfdmlkZW9fZnJhbWUsCisJLnB1dF92ZnJhbWUJPSBtcGVnNF9wdXRfdmlkZW9fZnJhbWUsCit9OworCitzdGF0aWMgaW50IHZtcGVnNF92NGxfYWxsb2NfYnVmZl9jb25maWdfY2FudmFzKHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3LCBpbnQgaSkKK3sKKwlpbnQgcmV0OworCXUzMiBjYW52YXM7CisJdWxvbmcgZGVjYnVmX3N0YXJ0ID0gMCwgZGVjYnVmX3V2X3N0YXJ0ID0gMDsKKwlpbnQgZGVjYnVmX3lfc2l6ZSA9IDAsIGRlY2J1Zl91dl9zaXplID0gMDsKKwl1MzIgY2FudmFzX3dpZHRoID0gMCwgY2FudmFzX2hlaWdodCA9IDA7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaHcpOworCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9IE5VTEw7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisKKwlpZiAoaHctPnBpY1tpXS52NGxfcmVmX2J1Zl9hZGRyKSB7CisJCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9CisJCQkoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKikKKwkJCWh3LT5waWNbaV0udjRsX3JlZl9idWZfYWRkcjsKKworCQlmYi0+c3RhdHVzID0gRkJfU1RfREVDT0RFUjsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gY3R4LT5mYl9vcHMuYWxsb2MoJmN0eC0+ZmJfb3BzLCBody0+ZmJfdG9rZW4sICZmYiwgQU1MX0ZCX1JFUV9ERUMpOworCWlmIChyZXQgPCAwKSB7CisJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJIlslZF0gZ2V0IGZiIGZhaWwuXG4iLAorCQkJKChzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikKKwkJCShody0+djRsMl9jdHgpKS0+aWQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWZiLT50YXNrLT5hdHRhY2goZmItPnRhc2ssICZ0YXNrX2RlY19vcHMsIGh3X3RvX3ZkZWMoaHcpKTsKKwlmYi0+c3RhdHVzID0gRkJfU1RfREVDT0RFUjsKKworCWlmICghaHctPmZyYW1lX3dpZHRoIHx8ICFody0+ZnJhbWVfaGVpZ2h0KSB7CisJCQlzdHJ1Y3QgdmRlY19waWNfaW5mbyBwaWM7CisJCQl2ZGVjX3Y0bF9nZXRfcGljX2luZm8oY3R4LCAmcGljKTsKKwkJCWh3LT5mcmFtZV93aWR0aCA9IHBpYy52aXNpYmxlX3dpZHRoOworCQkJaHctPmZyYW1lX2hlaWdodCA9IHBpYy52aXNpYmxlX2hlaWdodDsKKwkJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJCSJbJWRdIHNldCAlZCB4ICVkIGZyb20gSUYgbGF5ZXJcbiIsIGN0eC0+aWQsCisJCQkJaHctPmZyYW1lX3dpZHRoLCBody0+ZnJhbWVfaGVpZ2h0KTsKKwl9CisKKwlody0+cGljW2ldLnY0bF9yZWZfYnVmX2FkZHIgPSAodWxvbmcpZmI7CisJaWYgKGZiLT5udW1fcGxhbmVzID09IDEpIHsKKwkJZGVjYnVmX3N0YXJ0CT0gZmItPm0ubWVtWzBdLmFkZHI7CisJCWRlY2J1Zl95X3NpemUJPSBmYi0+bS5tZW1bMF0ub2Zmc2V0OworCQlkZWNidWZfdXZfc3RhcnQJPSBkZWNidWZfc3RhcnQgKyBkZWNidWZfeV9zaXplOworCQlkZWNidWZfdXZfc2l6ZQk9IGRlY2J1Zl95X3NpemUgLyAyOworCQljYW52YXNfd2lkdGgJPSBBTElHTihody0+ZnJhbWVfd2lkdGgsIDY0KTsKKwkJY2FudmFzX2hlaWdodAk9IEFMSUdOKGh3LT5mcmFtZV9oZWlnaHQsIDY0KTsKKwkJZmItPm0ubWVtWzBdLmJ5dGVzX3VzZWQgPSBmYi0+bS5tZW1bMF0uc2l6ZTsKKwl9IGVsc2UgaWYgKGZiLT5udW1fcGxhbmVzID09IDIpIHsKKwkJZGVjYnVmX3N0YXJ0CT0gZmItPm0ubWVtWzBdLmFkZHI7CisJCWRlY2J1Zl95X3NpemUJPSBmYi0+bS5tZW1bMF0uc2l6ZTsKKwkJZGVjYnVmX3V2X3N0YXJ0CT0gZmItPm0ubWVtWzFdLmFkZHI7CisJCWRlY2J1Zl91dl9zaXplCT0gZmItPm0ubWVtWzFdLnNpemU7CisJCWNhbnZhc193aWR0aAk9IEFMSUdOKGh3LT5mcmFtZV93aWR0aCwgNjQpOworCQljYW52YXNfaGVpZ2h0CT0gQUxJR04oaHctPmZyYW1lX2hlaWdodCwgNjQpOworCQlmYi0+bS5tZW1bMF0uYnl0ZXNfdXNlZCA9IGRlY2J1Zl95X3NpemU7CisJCWZiLT5tLm1lbVsxXS5ieXRlc191c2VkID0gZGVjYnVmX3V2X3NpemU7CisJfQorCisJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVjRMX0RFVEFJTCwKKwkJIlslZF0gJXMoKSwgdjRsIHJlZiBidWYgYWRkcjogMHgleFxuIiwKKwkJY3R4LT5pZCwgX19mdW5jX18sIGZiKTsKKworCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQl1MzIgdG1wOworCQlpZiAoY2FudmFzX3koaHctPmNhbnZhc19zcGVjW2ldKSA9PSAweGZmKSB7CisJCQl0bXAgPSB2ZGVjLT5nZXRfY2FudmFzX2V4KENPUkVfTUFTS19WREVDXzEsIHZkZWMtPmlkKTsKKwkJCWh3LT5jYW52YXNfc3BlY1tpXSAmPSB+MHhmZjsKKwkJCWh3LT5jYW52YXNfc3BlY1tpXSB8PSB0bXA7CisJCX0KKwkJaWYgKGNhbnZhc191KGh3LT5jYW52YXNfc3BlY1tpXSkgPT0gMHhmZikgeworCQkJdG1wID0gdmRlYy0+Z2V0X2NhbnZhc19leChDT1JFX01BU0tfVkRFQ18xLCB2ZGVjLT5pZCk7CisJCQlody0+Y2FudmFzX3NwZWNbaV0gJj0gfigweGZmZmYgPDwgOCk7CisJCQlody0+Y2FudmFzX3NwZWNbaV0gfD0gdG1wIDw8IDg7CisJCQlody0+Y2FudmFzX3NwZWNbaV0gfD0gdG1wIDw8IDE2OworCQl9CisJCWNhbnZhcyA9IGh3LT5jYW52YXNfc3BlY1tpXTsKKwl9IGVsc2UgeworCQljYW52YXMgPSB2ZGVjLT5nZXRfY2FudmFzKGksIDIpOworCQlody0+Y2FudmFzX3NwZWNbaV0gPSBjYW52YXM7CisJfQorCisJaHctPmNhbnZhc19jb25maWdbaV1bMF0ucGh5X2FkZHIgPSBkZWNidWZfc3RhcnQ7CisJaHctPmNhbnZhc19jb25maWdbaV1bMF0ud2lkdGggPSBjYW52YXNfd2lkdGg7CisJaHctPmNhbnZhc19jb25maWdbaV1bMF0uaGVpZ2h0ID0gY2FudmFzX2hlaWdodDsKKwlody0+Y2FudmFzX2NvbmZpZ1tpXVswXS5ibG9ja19tb2RlID0gaHctPmJsa21vZGU7CisJaWYgKGh3LT5ibGttb2RlID09IENBTlZBU19CTEtNT0RFX0xJTkVBUikKKwkJaHctPmNhbnZhc19jb25maWdbaV1bMF0uZW5kaWFuID0gNzsKKwllbHNlCisJCWh3LT5jYW52YXNfY29uZmlnW2ldWzBdLmVuZGlhbiA9IDA7CisJY29uZmlnX2Nhdl9sdXQoY2FudmFzX3koY2FudmFzKSwKKwkJCSZody0+Y2FudmFzX2NvbmZpZ1tpXVswXSwgVkRFQ18xKTsKKworCWh3LT5jYW52YXNfY29uZmlnW2ldWzFdLnBoeV9hZGRyID0KKwkJZGVjYnVmX3V2X3N0YXJ0OworCWh3LT5jYW52YXNfY29uZmlnW2ldWzFdLndpZHRoID0gY2FudmFzX3dpZHRoOworCWh3LT5jYW52YXNfY29uZmlnW2ldWzFdLmhlaWdodCA9IChjYW52YXNfaGVpZ2h0ID4+IDEpOworCWh3LT5jYW52YXNfY29uZmlnW2ldWzFdLmJsb2NrX21vZGUgPSBody0+YmxrbW9kZTsKKwlpZiAoaHctPmJsa21vZGUgPT0gQ0FOVkFTX0JMS01PREVfTElORUFSKQorCQlody0+Y2FudmFzX2NvbmZpZ1tpXVsxXS5lbmRpYW4gPSA3OworCWVsc2UKKwkJaHctPmNhbnZhc19jb25maWdbaV1bMV0uZW5kaWFuID0gMDsKKwljb25maWdfY2F2X2x1dChjYW52YXNfdShjYW52YXMpLAorCQkJJmh3LT5jYW52YXNfY29uZmlnW2ldWzFdLCBWREVDXzEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9mcmVlX2J1ZmZlcihzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBody0+YnVmX251bTsgaSsrKSB7CisJCWlmIChody0+dmZidWZfdXNlW2ldID09IDApCisJCQlicmVhazsKKwl9CisKKwlpZiAoKGkgPT0gaHctPmJ1Zl9udW0pICYmCisJCShody0+YnVmX251bSAhPSAwKSkgeworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHZtcGVnNF92NGxfYWxsb2NfYnVmZl9jb25maWdfY2FudmFzKGh3LCBpKSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgc3BlY190b19pbmRleChzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodywgdTMyIHNwZWMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaHctPmJ1Zl9udW07IGkrKykgeworCQlpZiAoaHctPmNhbnZhc19zcGVjW2ldID09IHNwZWMpCisJCQlyZXR1cm4gaTsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9mcmFtZV9pbmZvKHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3LCBzdHJ1Y3QgdmZyYW1lX3MgKnZmLAorCQkJaW50IGJ1ZmZlcl9pbmRleCkKK3sKKwlpbnQgYXIgPSAwOworCWludCBlbmRpYW5fdG1wOworCXVuc2lnbmVkIGludCBudW0gPSAwOworCXVuc2lnbmVkIGludCBkZW4gPSAwOworCXVuc2lnbmVkIGludCBwaXhlbF9yYXRpbyA9IFJFQURfVlJFRyhNUDRfUElDX1JBVElPKTsKKworCWlmIChody0+dm1wZWc0X3JhdGlvNjQgIT0gMCkgeworCQludW0gPSBody0+dm1wZWc0X3JhdGlvNjQ+PjMyOworCQlkZW4gPSBody0+dm1wZWc0X3JhdGlvNjQgJiAweGZmZmZmZmZmOworCX0gZWxzZSB7CisJCW51bSA9IGh3LT52bXBlZzRfcmF0aW8+PjE2OworCQlkZW4gPSBody0+dm1wZWc0X3JhdGlvICYgMHhmZmZmOworCisJfQorCWlmICgobnVtID09IDApIHx8IChkZW4gPT0gMCkpIHsKKwkJbnVtID0gMTsKKwkJZGVuID0gMTsKKwl9CisKKwlpZiAoaHctPnZtcGVnNF9yYXRpbyA9PSAwKSB7CisJCXZmLT5yYXRpb19jb250cm9sIHw9ICgweDkwIDw8IERJU1BfUkFUSU9fQVNQRUNUX1JBVElPX0JJVCk7CisJCS8qIGFsd2F5cyBzdHJldGNoIHRvIDE2OjkgKi8KKwl9IGVsc2UgaWYgKHBpeGVsX3JhdGlvID4gMHgwZikgeworCQludW0gPSAocGl4ZWxfcmF0aW8gPj4gOCkgKgorCQkJaHctPmZyYW1lX3dpZHRoICogbnVtOworCQlhciA9IGRpdl91NjQoKHBpeGVsX3JhdGlvICYgMHhmZikgKgorCQkJaHctPmZyYW1lX2hlaWdodCAqIGRlbiAqIDB4MTAwVUxMICsKKwkJCShudW0gPj4gMSksIG51bSk7CisJfSBlbHNlIHsKKwkJc3dpdGNoIChhc3BlY3RfcmF0aW9fdGFibGVbcGl4ZWxfcmF0aW9dKSB7CisJCWNhc2UgMDoKKwkJCW51bSA9IGh3LT5mcmFtZV93aWR0aCAqIG51bTsKKwkJCWFyID0gKGh3LT5mcmFtZV9oZWlnaHQgKiBkZW4gKgorCQkJCTB4MTAwICsgKG51bSA+PiAxKSkgLyBudW07CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJbnVtID0gdmYtPndpZHRoICogbnVtOworCQkJYXIgPSAodmYtPmhlaWdodCAqIGRlbiAqIDB4MTAwICsgKG51bSA+PiAxKSkgLyBudW07CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJbnVtID0gKHZmLT53aWR0aCAqIDEyKSAqIG51bTsKKwkJCWFyID0gKHZmLT5oZWlnaHQgKiBkZW4gKiAweDEwMCAqIDExICsKKwkJCQkgICgobnVtKSA+PiAxKSkgLyBudW07CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJbnVtID0gKHZmLT53aWR0aCAqIDEwKSAqIG51bTsKKwkJCWFyID0gKHZmLT5oZWlnaHQgKiBkZW4gKiAweDEwMCAqIDExICsgKG51bSA+PiAxKSkgLworCQkJCW51bTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQludW0gPSAodmYtPndpZHRoICogMTYpICogbnVtOworCQkJYXIgPSAodmYtPmhlaWdodCAqIGRlbiAqIDB4MTAwICogMTEgKyAobnVtID4+IDEpKSAvCisJCQkJbnVtOworCQkJYnJlYWs7CisJCWNhc2UgNToKKwkJCW51bSA9ICh2Zi0+d2lkdGggKiA0MCkgKiBudW07CisJCQlhciA9ICh2Zi0+aGVpZ2h0ICogZGVuICogMHgxMDAgKiAzMyArIChudW0gPj4gMSkpIC8KKwkJCQludW07CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW51bSA9IHZmLT53aWR0aCAqIG51bTsKKwkJCWFyID0gKHZmLT5oZWlnaHQgKiBkZW4gKiAweDEwMCArIChudW0gPj4gMSkpIC8gbnVtOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwl2Zi0+c2lkZWJpbmRfdHlwZSA9IGh3LT5zaWRlYmluZF90eXBlOworCXZmLT5zaWRlYmluZF9jaGFubmVsX2lkID0gaHctPnNpZGViaW5kX2NoYW5uZWxfaWQ7CisKKwlhciA9IG1pbihhciwgRElTUF9SQVRJT19BU1BFQ1RfUkFUSU9fTUFYKTsKKworCXZmLT5zaWduYWxfdHlwZSA9IDA7CisJdmYtPnR5cGVfb3JpZ2luYWwgPSB2Zi0+dHlwZTsKKwl2Zi0+cmF0aW9fY29udHJvbCA9IChhciA8PCBESVNQX1JBVElPX0FTUEVDVF9SQVRJT19CSVQpOworCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IC0xOworI2lmZGVmIE5WMjEKKwl2Zi0+cGxhbmVfbnVtID0gMjsKKyNlbHNlCisJdmYtPnBsYW5lX251bSA9IDM7CisjZW5kaWYKKwl2Zi0+Y2FudmFzMF9jb25maWdbMF0gPSBody0+Y2FudmFzX2NvbmZpZ1tidWZmZXJfaW5kZXhdWzBdOworCXZmLT5jYW52YXMwX2NvbmZpZ1sxXSA9IGh3LT5jYW52YXNfY29uZmlnW2J1ZmZlcl9pbmRleF1bMV07CisjaWZuZGVmIE5WMjEKKwl2Zi0+Y2FudmFzMF9jb25maWdbMl0gPSBody0+Y2FudmFzX2NvbmZpZ1tidWZmZXJfaW5kZXhdWzJdOworI2VuZGlmCisJdmYtPmNhbnZhczFfY29uZmlnWzBdID0gaHctPmNhbnZhc19jb25maWdbYnVmZmVyX2luZGV4XVswXTsKKwl2Zi0+Y2FudmFzMV9jb25maWdbMV0gPSBody0+Y2FudmFzX2NvbmZpZ1tidWZmZXJfaW5kZXhdWzFdOworI2lmbmRlZiBOVjIxCisJdmYtPmNhbnZhczFfY29uZmlnWzJdID0gaHctPmNhbnZhc19jb25maWdbYnVmZmVyX2luZGV4XVsyXTsKKyNlbmRpZgorCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDcpIHsKKwkJZW5kaWFuX3RtcCA9IChody0+YmxrbW9kZSA9PSBDQU5WQVNfQkxLTU9ERV9MSU5FQVIpID8gNyA6IDA7CisJfSBlbHNlIHsKKwkJZW5kaWFuX3RtcCA9IChody0+YmxrbW9kZSA9PSBDQU5WQVNfQkxLTU9ERV9MSU5FQVIpID8gMCA6IDc7CisJfQorCS8qIG1wZWc0IGNvbnZlcnQgZW5kaWFuIHRvIG1hdGNoIGRpc3BsYXkgKi8KKwl2Zi0+Y2FudmFzMF9jb25maWdbMF0uZW5kaWFuID0gZW5kaWFuX3RtcDsKKwl2Zi0+Y2FudmFzMF9jb25maWdbMV0uZW5kaWFuID0gZW5kaWFuX3RtcDsKKwl2Zi0+Y2FudmFzMV9jb25maWdbMF0uZW5kaWFuID0gZW5kaWFuX3RtcDsKKwl2Zi0+Y2FudmFzMV9jb25maWdbMV0uZW5kaWFuID0gZW5kaWFuX3RtcDsKKyNpZm5kZWYgTlYyMQorCXZmLT5jYW52YXMwX2NvbmZpZ1syXS5lbmRpYW4gPSBlbmRpYW5fdG1wOworCXZmLT5jYW52YXMxX2NvbmZpZ1syXS5lbmRpYW4gPSBlbmRpYW5fdG1wOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2bXBlZzRfc2F2ZV9od19jb250ZXh0KHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3KQoreworCWh3LT5yZWdfbXBlZzFfMl9yZWcgPSBSRUFEX1ZSRUcoTVBFRzFfMl9SRUcpOworCWh3LT5yZWdfdmNvcF9jdHJsX3JlZyA9IFJFQURfVlJFRyhWQ09QX0NUUkxfUkVHKTsKKwlody0+cmVnX3BpY19oZWFkX2luZm8gPSBSRUFEX1ZSRUcoUElDX0hFQURfSU5GTyk7CisJaHctPnJlZ19zbGljZV9xcCA9IFJFQURfVlJFRyhTTElDRV9RUCk7CisJaHctPnJlZ19tcDRfcGljX3doID0gUkVBRF9WUkVHKE1QNF9QSUNfV0gpOworCWh3LT5yZWdfbXA0X3JhdGUgPSBSRUFEX1ZSRUcoTVA0X1JBVEUpOworCWh3LT5yZWdfbWJfaW5mbyA9IFJFQURfVlJFRyhNQl9JTkZPKTsKKwlody0+cmVnX2RjX2FjX2N0cmwgPSBSRUFEX1ZSRUcoRENfQUNfQ1RSTCk7CisJaHctPnJlZ19pcWlkY3RfY29udHJvbCA9IFJFQURfVlJFRyhJUUlEQ1RfQ09OVFJPTCk7CisJaHctPnJlZ19yZXN5bmNfbWFya2VyX2xlbmd0aCA9IFJFQURfVlJFRyhSRVNZTkNfTUFSS0VSX0xFTkdUSCk7CisJaHctPnJlZ19ydl9haV9tYl9jb3VudCA9IFJFQURfVlJFRyhSVl9BSV9NQl9DT1VOVCk7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX3JlZihzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodywgaW50IGluZGV4KQoreworCWh3LT52ZmJ1Zl91c2VbaW5kZXhdKys7CisKKwlpZiAoaHctPnJlZnNbMV0gPT0gLTEpIHsKKwkJaHctPnJlZnNbMV0gPSBpbmRleDsKKwkJaW5kZXggPSAtMTsKKwl9IGVsc2UgaWYgKGh3LT5yZWZzWzBdID09IC0xKSB7CisJCWh3LT5yZWZzWzBdID0gaHctPnJlZnNbMV07CisJCWh3LT5yZWZzWzFdID0gaW5kZXg7CisJCWluZGV4ID0gaHctPnJlZnNbMF07CisJfSBlbHNlIHsKKwkJaHctPnZmYnVmX3VzZVtody0+cmVmc1swXV0tLTsKKwkJaHctPnJlZnNbMF0gPSBody0+cmVmc1sxXTsKKwkJaHctPnJlZnNbMV0gPSBpbmRleDsKKwkJaW5kZXggPSBody0+cmVmc1swXTsKKwl9CisKKwlyZXR1cm4gaW5kZXg7Cit9CisKK3N0YXRpYyBpbnQgcHJlcGFyZV9kaXNwbGF5X2J1ZihzdHJ1Y3QgdmRlY19tcGVnNF9od19zICogaHcsCisJc3RydWN0IHBpY19pbmZvX3QgKnBpYykKK3sKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmID0gTlVMTDsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICogdjRsMl9jdHggPSBody0+djRsMl9jdHg7CisJc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKmZiID0gTlVMTDsKKwl1bG9uZyBudl9vcmRlciA9IFZJRFRZUEVfVklVX05WMjE7CisJaW50IGluZGV4ID0gcGljLT5pbmRleDsKKwlib29sIHBiX3NraXAgPSBmYWxzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogc3dhcCB1diAqLworCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJaWYgKCh2NGwyX2N0eC0+Y2FwX3BpeF9mbXQgPT0gVjRMMl9QSVhfRk1UX05WMTIpIHx8CisJCQkodjRsMl9jdHgtPmNhcF9waXhfZm10ID09IFY0TDJfUElYX0ZNVF9OVjEyTSkpCisJCQludl9vcmRlciA9IFZJRFRZUEVfVklVX05WMTI7CisJCWlmICh2ZGVjLT5wcm9nX29ubHkgfHwgKCF2NGwyX2N0eC0+dnBwX2lzX25lZWQpKQorCQkJcGljLT5waWNfaW5mbyAmPSB+SU5URVJMQUNFX0ZMQUc7CisJfQorCisJaWYgKGh3LT5pX29ubHkpCisJCXBiX3NraXAgPSAxOworCisJaWYgKHBpYy0+cGljX2luZm8gJiBJTlRFUkxBQ0VfRkxBRykgeworCQlpZiAoa2ZpZm9fZ2V0KCZody0+bmV3ZnJhbWVfcSwgJnZmKSA9PSAwKSB7CisJCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCQkiZmF0YWwgZXJyb3IsIG5vIGF2YWlsYWJsZSBidWZmZXIgc2xvdC4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCXZmLT52NGxfbWVtX2hhbmRsZQorCQkJCT0gaHctPnBpY1tpbmRleF0udjRsX3JlZl9idWZfYWRkcjsKKwkJCWZiID0gKHN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICopdmYtPnY0bF9tZW1faGFuZGxlOworCQkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVjRMX0RFVEFJTCwKKwkJCQkiWyVkXSAlcygpLCB2NGwgbWVtIGhhbmRsZTogMHglbHhcbiIsCisJCQkJKChzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KSktPmlkLAorCQkJCV9fZnVuY19fLCB2Zi0+djRsX21lbV9oYW5kbGUpOworCQl9CisKKwkJdmYtPmluZGV4ID0gcGljLT5pbmRleDsKKwkJdmYtPndpZHRoID0gcGljLT53aWR0aDsKKwkJdmYtPmhlaWdodCA9IHBpYy0+aGVpZ2h0OworCQl2Zi0+YnVmV2lkdGggPSAxOTIwOworCQl2Zi0+ZmxhZyA9IDA7CisJCXZmLT5vcmllbnRhdGlvbiA9IGh3LT52bXBlZzRfcm90YXRpb247CisJCXZmLT5wdHMgPSBwaWMtPnB0czsKKwkJdmYtPnB0c191czY0ID0gcGljLT5wdHM2NDsKKwkJdmYtPnRpbWVzdGFtcCA9IHBpYy0+dGltZXN0YW1wOworCQl2Zi0+ZHVyYXRpb24gPSBwaWMtPmR1cmF0aW9uID4+IDE7CisJCXZmLT5kdXJhdGlvbl9wdWxsZG93biA9IDA7CisJCXZmLT50eXBlID0gKHBpYy0+cGljX2luZm8gJiBUT1BfRklFTERfRklSU1RfRkxBRykgPworCQkJVklEVFlQRV9JTlRFUkxBQ0VfVE9QIDogVklEVFlQRV9JTlRFUkxBQ0VfQk9UVE9NOworI2lmZGVmIE5WMjEKKwkJdmYtPnR5cGUgfD0gbnZfb3JkZXI7CisjZW5kaWYKKwkJc2V0X2ZyYW1lX2luZm8oaHcsIHZmLCBwaWMtPmluZGV4KTsKKworCQlody0+dmZidWZfdXNlW3BpYy0+aW5kZXhdKys7CisJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1RJTUVJTkZPLAorCQkJImZpZWxkMDogcHRzICVkLCBwdHM2NCAlbGxkLCB3ICVkLCBoICVkLCBkdXIgJWRcbiIsCisJCQl2Zi0+cHRzLCB2Zi0+cHRzX3VzNjQsIHZmLT53aWR0aCwgdmYtPmhlaWdodCwgdmYtPmR1cmF0aW9uKTsKKworCQlpZiAodmRlY19zdHJlYW1fYmFzZWQodmRlYykgJiYgKCF2ZGVjLT52YnVmLnVzZV9wdHNzZXJ2KSkgeworCQkJdmYtPnB0c191czY0ID0KKwkJCQkoKCh1NjQpdmYtPmR1cmF0aW9uIDw8IDMyKSAmCisJCQkJMHhmZmZmZmZmZjAwMDAwMDAwKSB8IHBpYy0+b2Zmc2V0OworCQkJdmYtPnB0cyA9IDA7CisJCX0KKwkJaWYgKCgoaHctPmZpcnN0X2lfZnJhbWVfcmVhZHkgPT0gMCkgfHwgcGJfc2tpcCkKKwkJCSAmJiAocGljLT5waWNfdHlwZSAhPSBJX1BJQ1RVUkUpKSB7CisJCQlody0+ZHJvcF9mcmFtZV9jb3VudCsrOworCQkJaWYgKHBpYy0+cGljX3R5cGUgPT0gSV9QSUNUVVJFKSB7CisJCQkJaHctPmlfbG9zdF9mcmFtZXMrKzsKKwkJCX0gZWxzZSBpZiAocGljLT5waWNfdHlwZSA9PSBQX1BJQ1RVUkUpIHsKKwkJCQlody0+cF9sb3N0X2ZyYW1lcysrOworCQkJfSBlbHNlIGlmIChwaWMtPnBpY190eXBlID09IEJfUElDVFVSRSkgeworCQkJCWh3LT5iX2xvc3RfZnJhbWVzKys7CisJCQl9CisJCQlody0+dmZidWZfdXNlW2luZGV4XS0tOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5sb2NrLCBmbGFncyk7CisJCQlrZmlmb19wdXQoJmh3LT5uZXdmcmFtZV9xLAorCQkJCShjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+bG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQl2Zi0+bWVtX2hhbmRsZSA9CisJCQkJZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCQkJaHctPm1tX2Jsa19oYW5kbGUsIGluZGV4KTsKKwkJCWtmaWZvX3B1dCgmaHctPmRpc3BsYXlfcSwgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwkJCUFUUkFDRV9DT1VOVEVSKGh3LT5wdHNfbmFtZSwgdmYtPnRpbWVzdGFtcCk7CisJCQlody0+ZnJhbWVfbnVtKys7CisJCQlpZiAocGljLT5waWNfdHlwZSA9PSBJX1BJQ1RVUkUpIHsKKwkJCQlody0+aV9kZWNvZGVkX2ZyYW1lcysrOworCQkJfSBlbHNlIGlmIChwaWMtPnBpY190eXBlID09IFBfUElDVFVSRSkgeworCQkJCWh3LT5wX2RlY29kZWRfZnJhbWVzKys7CisJCQl9IGVsc2UgaWYgKHBpYy0+cGljX3R5cGUgPT0gQl9QSUNUVVJFKSB7CisJCQkJaHctPmJfZGVjb2RlZF9mcmFtZXMrKzsKKwkJCX0KKwkJCWlmICh3aXRob3V0X2Rpc3BsYXlfbW9kZSA9PSAwKSB7CisJCQkJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQkJCQlpZiAodjRsMl9jdHgtPmlzX3N0cmVhbV9vZmYpIHsKKwkJCQkJCXZtcGVnX3ZmX3B1dCh2bXBlZ192Zl9nZXQodmRlYyksIHZkZWMpOworCQkJCQl9IGVsc2UgeworCQkJCQkJZmItPnRhc2stPnN1Ym1pdChmYi0+dGFzaywgVEFTS19UWVBFX0RFQyk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIodmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9WRlJBTUVfUkVBRFksIE5VTEwpOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCXZtcGVnX3ZmX3B1dCh2bXBlZ192Zl9nZXQodmRlYyksIHZkZWMpOworCQl9CisKKwkJaWYgKGtmaWZvX2dldCgmaHctPm5ld2ZyYW1lX3EsICZ2ZikgPT0gMCkgeworCQkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkJImVycm9yLCBubyBhdmFpbGFibGUgYnVmLlxuIik7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRVJST1I7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCQl2Zi0+djRsX21lbV9oYW5kbGUKKwkJCQk9IGh3LT5waWNbaW5kZXhdLnY0bF9yZWZfYnVmX2FkZHI7CisJCQlmYiA9IChzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqKXZmLT52NGxfbWVtX2hhbmRsZTsKKwkJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1Y0TF9ERVRBSUwsCisJCQkJIlslZF0gJXMoKSwgdjRsIG1lbSBoYW5kbGU6IDB4JWx4XG4iLAorCQkJCSgoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCkpLT5pZCwKKwkJCQlfX2Z1bmNfXywgdmYtPnY0bF9tZW1faGFuZGxlKTsKKwkJfQorCisJCXZmLT5pbmRleCA9IHBpYy0+aW5kZXg7CisJCXZmLT53aWR0aCA9IHBpYy0+d2lkdGg7CisJCXZmLT5oZWlnaHQgPSBwaWMtPmhlaWdodDsKKwkJdmYtPmJ1ZldpZHRoID0gMTkyMDsKKwkJdmYtPmZsYWcgPSAwOworCQl2Zi0+b3JpZW50YXRpb24gPSBody0+dm1wZWc0X3JvdGF0aW9uOworCQl2Zi0+cHRzID0gMDsKKwkJdmYtPnB0c191czY0ID0gMDsKKwkJdmYtPnRpbWVzdGFtcCA9IHBpYy0+dGltZXN0YW1wOworCQlpZiAodjRsMl9jdHgtPnNlY29uZF9maWVsZF9wdHNfbW9kZSkgeworCQkJdmYtPnRpbWVzdGFtcCA9IDA7CisJCX0KKworCQl2Zi0+ZHVyYXRpb24gPSBwaWMtPmR1cmF0aW9uID4+IDE7CisJCXZmLT5kdXJhdGlvbl9wdWxsZG93biA9IDA7CisJCXZmLT50eXBlID0gKHBpYy0+cGljX2luZm8gJiBUT1BfRklFTERfRklSU1RfRkxBRykgPworCQkJVklEVFlQRV9JTlRFUkxBQ0VfQk9UVE9NIDogVklEVFlQRV9JTlRFUkxBQ0VfVE9QOworI2lmZGVmIE5WMjEKKwkJdmYtPnR5cGUgfD0gbnZfb3JkZXI7CisjZW5kaWYKKwkJc2V0X2ZyYW1lX2luZm8oaHcsIHZmLCBwaWMtPmluZGV4KTsKKworCQlody0+dmZidWZfdXNlW3BpYy0+aW5kZXhdKys7CisJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1RJTUVJTkZPLAorCQkJImZpbGVkMTogcHRzICVkLCBwdHM2NCAlbGxkLCB3ICVkLCBoICVkLCBkdXI6ICVkXG4iLAorCQkJdmYtPnB0cywgdmYtPnB0c191czY0LCB2Zi0+d2lkdGgsIHZmLT5oZWlnaHQsIHZmLT5kdXJhdGlvbik7CisKKwkJaWYgKHZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpICYmICghdmRlYy0+dmJ1Zi51c2VfcHRzc2VydikpIHsKKwkJCXZmLT5wdHNfdXM2NCA9ICh1NjQpLTE7CisJCQl2Zi0+cHRzID0gMDsKKwkJfQorCQlpZiAoKChody0+Zmlyc3RfaV9mcmFtZV9yZWFkeSA9PSAwKSB8fCBwYl9za2lwKQorCQkJJiYgKHBpYy0+cGljX3R5cGUgIT0gSV9QSUNUVVJFKSkgeworCQkJaHctPmRyb3BfZnJhbWVfY291bnQrKzsKKwkJCWlmIChwaWMtPnBpY190eXBlID09IElfUElDVFVSRSkgeworCQkJCWh3LT5pX2xvc3RfZnJhbWVzKys7CisJCQl9IGVsc2UgaWYgKHBpYy0+cGljX3R5cGUgPT0gUF9QSUNUVVJFKSB7CisJCQkJaHctPnBfbG9zdF9mcmFtZXMrKzsKKwkJCX0gZWxzZSBpZiAocGljLT5waWNfdHlwZSA9PSBCX1BJQ1RVUkUpIHsKKwkJCQlody0+Yl9sb3N0X2ZyYW1lcysrOworCQkJfQorCQkJaHctPnZmYnVmX3VzZVtpbmRleF0tLTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZody0+bG9jaywgZmxhZ3MpOworCQkJa2ZpZm9fcHV0KCZody0+bmV3ZnJhbWVfcSwKKwkJCQkoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmxvY2ssIGZsYWdzKTsKKwkJfSBlbHNlIHsKKwkJCXZmLT5tZW1faGFuZGxlID0KKwkJCQlkZWNvZGVyX2JtbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCQlody0+bW1fYmxrX2hhbmRsZSwgaW5kZXgpOworCQkJZGVjb2Rlcl9kb19mcmFtZV9jaGVjayh2ZGVjLCB2Zik7CisJCQl2ZGVjX3ZmcmFtZV9yZWFkeSh2ZGVjLCB2Zik7CisJCQlrZmlmb19wdXQoJmh3LT5kaXNwbGF5X3EsCisJCQkJKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwkJCUFUUkFDRV9DT1VOVEVSKGh3LT5wdHNfbmFtZSwgdmYtPnRpbWVzdGFtcCk7CisJCQl2ZGVjLT52ZGVjX2Zwc19kZXRlYyh2ZGVjLT5pZCk7CisJCQlody0+ZnJhbWVfbnVtKys7CisJCQlpZiAocGljLT5waWNfdHlwZSA9PSBJX1BJQ1RVUkUpIHsKKwkJCQlody0+aV9kZWNvZGVkX2ZyYW1lcysrOworCQkJfSBlbHNlIGlmIChwaWMtPnBpY190eXBlID09IFBfUElDVFVSRSkgeworCQkJCWh3LT5wX2RlY29kZWRfZnJhbWVzKys7CisJCQl9IGVsc2UgaWYgKHBpYy0+cGljX3R5cGUgPT0gQl9QSUNUVVJFKSB7CisJCQkJaHctPmJfZGVjb2RlZF9mcmFtZXMrKzsKKwkJCX0KKwkJCWlmICh3aXRob3V0X2Rpc3BsYXlfbW9kZSA9PSAwKSB7CisJCQkJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQkJCQlpZiAodjRsMl9jdHgtPmlzX3N0cmVhbV9vZmYpIHsKKwkJCQkJCXZtcGVnX3ZmX3B1dCh2bXBlZ192Zl9nZXQodmRlYyksIHZkZWMpOworCQkJCQl9IGVsc2UgeworCQkJCQkJZmItPnRhc2stPnN1Ym1pdChmYi0+dGFzaywgVEFTS19UWVBFX0RFQyk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIodmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9WRlJBTUVfUkVBRFksIE5VTEwpOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCXZtcGVnX3ZmX3B1dCh2bXBlZ192Zl9nZXQodmRlYyksIHZkZWMpOworCQl9CisJfSBlbHNlIHsKKwkJLyogcHJvZ3Jlc3NpdmUgKi8KKwkJaWYgKGtmaWZvX2dldCgmaHctPm5ld2ZyYW1lX3EsICZ2ZikgPT0gMCkgeworCQkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkJImVycm9yLCBubyBhdmFpbGFibGUgYnVmXG4iKTsKKwkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9FUlJPUjsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCXZmLT52NGxfbWVtX2hhbmRsZQorCQkJCT0gaHctPnBpY1tpbmRleF0udjRsX3JlZl9idWZfYWRkcjsKKwkJCWZiID0gKHN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICopdmYtPnY0bF9tZW1faGFuZGxlOworCQkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVjRMX0RFVEFJTCwKKwkJCQkiWyVkXSAlcygpLCB2NGwgbWVtIGhhbmRsZTogMHglbHhcbiIsCisJCQkJKChzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KSktPmlkLAorCQkJCV9fZnVuY19fLCB2Zi0+djRsX21lbV9oYW5kbGUpOworCQl9CisKKwkJdmYtPmluZGV4ID0gaW5kZXg7CisJCXZmLT53aWR0aCA9IGh3LT5mcmFtZV93aWR0aDsKKwkJdmYtPmhlaWdodCA9IGh3LT5mcmFtZV9oZWlnaHQ7CisJCXZmLT5idWZXaWR0aCA9IDE5MjA7CisJCXZmLT5mbGFnID0gMDsKKwkJdmYtPm9yaWVudGF0aW9uID0gaHctPnZtcGVnNF9yb3RhdGlvbjsKKwkJdmYtPnB0cyA9IHBpYy0+cHRzOworCQl2Zi0+cHRzX3VzNjQgPSBwaWMtPnB0czY0OworCQl2Zi0+dGltZXN0YW1wID0gcGljLT50aW1lc3RhbXA7CisJCXZmLT5kdXJhdGlvbiA9IHBpYy0+ZHVyYXRpb247CisJCXZmLT5kdXJhdGlvbl9wdWxsZG93biA9IHBpYy0+cmVwZWF0X2NudCAqCisJCQlwaWMtPmR1cmF0aW9uOworI2lmZGVmIE5WMjEKKwkJdmYtPnR5cGUgPSBWSURUWVBFX1BST0dSRVNTSVZFIHwKKwkJCVZJRFRZUEVfVklVX0ZJRUxEIHwgbnZfb3JkZXI7CisjZWxzZQorCQl2Zi0+dHlwZSA9IFZJRFRZUEVfUFJPR1JFU1NJVkUgfAorCQkJVklEVFlQRV9WSVVfRklFTEQ7CisjZW5kaWYKKwkJc2V0X2ZyYW1lX2luZm8oaHcsIHZmLCBpbmRleCk7CisKKwkJaHctPnZmYnVmX3VzZVtpbmRleF0rKzsKKwkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVElNRUlORk8sCisJCQkicHJvZzogcHRzICVkLCBwdHM2NCAlbGxkLCB3ICVkLCBoICVkLCBkdXIgJWRcbiIsCisJCQl2Zi0+cHRzLCB2Zi0+cHRzX3VzNjQsIHZmLT53aWR0aCwgdmYtPmhlaWdodCwgdmYtPmR1cmF0aW9uKTsKKworCQlpZiAodmRlY19zdHJlYW1fYmFzZWQodmRlYykgJiYgKCF2ZGVjLT52YnVmLnVzZV9wdHNzZXJ2KSkgeworCQkJdmYtPnB0c191czY0ID0KKwkJCQkoKCh1NjQpdmYtPmR1cmF0aW9uIDw8IDMyKSAmCisJCQkJMHhmZmZmZmZmZjAwMDAwMDAwKSB8IHBpYy0+b2Zmc2V0OworCQkJdmYtPnB0cyA9IDA7CisJCX0KKwkJaWYgKCgoaHctPmZpcnN0X2lfZnJhbWVfcmVhZHkgPT0gMCkgfHwgcGJfc2tpcCkKKwkJCSYmIChwaWMtPnBpY190eXBlICE9IElfUElDVFVSRSkpIHsKKwkJCWh3LT5kcm9wX2ZyYW1lX2NvdW50Kys7CisJCQlpZiAocGljLT5waWNfdHlwZSA9PSBJX1BJQ1RVUkUpIHsKKwkJCQlody0+aV9sb3N0X2ZyYW1lcysrOworCQkJfSBlbHNlIGlmIChwaWMtPnBpY190eXBlID09IFBfUElDVFVSRSkgeworCQkJCWh3LT5wX2xvc3RfZnJhbWVzKys7CisJCQl9IGVsc2UgaWYgKHBpYy0+cGljX3R5cGUgPT0gQl9QSUNUVVJFKSB7CisJCQkJaHctPmJfbG9zdF9mcmFtZXMrKzsKKwkJCX0KKwkJCWh3LT52ZmJ1Zl91c2VbaW5kZXhdLS07CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmxvY2ssIGZsYWdzKTsKKwkJCWtmaWZvX3B1dCgmaHctPm5ld2ZyYW1lX3EsCisJCQkJKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5sb2NrLCBmbGFncyk7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgdmRlY19pbmZvIHZpbmZvOworCisJCQl2Zi0+bWVtX2hhbmRsZSA9CisJCQkJZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCQkJaHctPm1tX2Jsa19oYW5kbGUsIGluZGV4KTsKKwkJCWRlY29kZXJfZG9fZnJhbWVfY2hlY2sodmRlYywgdmYpOworCQkJdmRlY192ZnJhbWVfcmVhZHkodmRlYywgdmYpOworCQkJa2ZpZm9fcHV0KCZody0+ZGlzcGxheV9xLCAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCQkJQVRSQUNFX0NPVU5URVIoaHctPnB0c19uYW1lLCB2Zi0+dGltZXN0YW1wKTsKKwkJCUFUUkFDRV9DT1VOVEVSKGh3LT5uZXdfcV9uYW1lLCBrZmlmb19sZW4oJmh3LT5uZXdmcmFtZV9xKSk7CisJCQlBVFJBQ0VfQ09VTlRFUihody0+ZGlzcF9xX25hbWUsIGtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSkpOworCQkJdmRlYy0+dmRlY19mcHNfZGV0ZWModmRlYy0+aWQpOworCQkJaHctPmZyYW1lX251bSsrOworCQkJaWYgKHBpYy0+cGljX3R5cGUgPT0gSV9QSUNUVVJFKSB7CisJCQkJaHctPmlfZGVjb2RlZF9mcmFtZXMrKzsKKwkJCX0gZWxzZSBpZiAocGljLT5waWNfdHlwZSA9PSBQX1BJQ1RVUkUpIHsKKwkJCQlody0+cF9kZWNvZGVkX2ZyYW1lcysrOworCQkJfSBlbHNlIGlmIChwaWMtPnBpY190eXBlID09IEJfUElDVFVSRSkgeworCQkJCWh3LT5iX2RlY29kZWRfZnJhbWVzKys7CisJCQl9CisJCQl2ZGVjLT5kZWNfc3RhdHVzKHZkZWMsICZ2aW5mbyk7CisJCQl2ZGVjX2ZpbGxfdmRlY19mcmFtZSh2ZGVjLCBOVUxMLAorCQkJCSZ2aW5mbywgdmYsIHBpYy0+aHdfZGVjb2RlX3RpbWUpOworCQkJaWYgKHdpdGhvdXRfZGlzcGxheV9tb2RlID09IDApIHsKKwkJCQlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCQkJCWlmICh2NGwyX2N0eC0+aXNfc3RyZWFtX29mZikgeworCQkJCQkJdm1wZWdfdmZfcHV0KHZtcGVnX3ZmX2dldCh2ZGVjKSwgdmRlYyk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlBVFJBQ0VfQ09VTlRFUigiVkNfT1VUX0RFQy1zdWJtaXQiLCBmYi0+YnVmX2lkeCk7CisJCQkJCQlmYi0+dGFzay0+c3VibWl0KGZiLT50YXNrLCBUQVNLX1RZUEVfREVDKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXZmX25vdGlmeV9yZWNlaXZlcih2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1ZGUkFNRV9SRUFEWSwgTlVMTCk7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJdm1wZWdfdmZfcHV0KHZtcGVnX3ZmX2dldCh2ZGVjKSwgdmRlYyk7CisJCX0KKworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdm1wZWc0X3ByZXBhcmVfaW5wdXQoc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqaHcpCit7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaHcpOworCXN0cnVjdCB2ZGVjX2lucHV0X3MgKmlucHV0ID0gJnZkZWMtPmlucHV0OworCXN0cnVjdCB2ZnJhbWVfYmxvY2tfbGlzdF9zICpibG9jayA9IE5VTEw7CisJc3RydWN0IHZmcmFtZV9jaHVua19zICpjaHVuayA9IGh3LT5jaHVuazsKKwlpbnQgZHVtbXk7CisKKwlpZiAoY2h1bmsgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogZnVsbCByZXNldCB0byBIVyBpbnB1dCAqLworCVdSSVRFX1ZSRUcoVkxEX01FTV9WSUZJRk9fQ09OVFJPTCwgMCk7CisKKwkvKiByZXNldCBWTEQgZmlmbyBmb3IgYWxsIHZkZWMgKi8KKwlXUklURV9WUkVHKERPU19TV19SRVNFVDAsICgxPDw1KSB8ICgxPDw0KSB8ICgxPDwzKSk7CisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQwLCAwKTsKKworCVdSSVRFX1ZSRUcoUE9XRVJfQ1RMX1ZMRCwgMSA8PCA0KTsKKworCS8qCisJICpzZXR1cCBIVyBkZWNvZGVyIGlucHV0IGJ1ZmZlciAoVkxEIGNvbnRleHQpCisJICogYmFzZWQgb24gaW5wdXQtPnR5cGUgYW5kIGlucHV0LT50YXJnZXQKKwkgKi8KKwlpZiAoaW5wdXRfZnJhbWVfYmFzZWQoaW5wdXQpKSB7CisJCWJsb2NrID0gY2h1bmstPmJsb2NrOworCisJCVdSSVRFX1ZSRUcoVkxEX01FTV9WSUZJRk9fU1RBUlRfUFRSLCBibG9jay0+c3RhcnQpOworCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX0VORF9QVFIsIGJsb2NrLT5zdGFydCArCisJCQkJYmxvY2stPnNpemUgLSA4KTsKKwkJV1JJVEVfVlJFRyhWTERfTUVNX1ZJRklGT19DVVJSX1BUUiwKKwkJCQlyb3VuZF9kb3duKGJsb2NrLT5zdGFydCArIGh3LT5jaHVua19vZmZzZXQsCisJCQkJCVZERUNfRklGT19BTElHTikpOworCisJCVdSSVRFX1ZSRUcoVkxEX01FTV9WSUZJRk9fQ09OVFJPTCwgMSk7CisJCVdSSVRFX1ZSRUcoVkxEX01FTV9WSUZJRk9fQ09OVFJPTCwgMCk7CisKKwkJLyogc2V0IHRvIG1hbnVhbCBtb2RlICovCisJCVdSSVRFX1ZSRUcoVkxEX01FTV9WSUZJRk9fQlVGX0NOVEwsIDIpOworCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX1JQLAorCQkJCXJvdW5kX2Rvd24oYmxvY2stPnN0YXJ0ICsgaHctPmNodW5rX29mZnNldCwKKwkJCQkJVkRFQ19GSUZPX0FMSUdOKSk7CisJCWR1bW15ID0gaHctPmNodW5rX29mZnNldCArIGh3LT5jaHVua19zaXplICsKKwkJCVZMRF9QQURESU5HX1NJWkU7CisJCWlmIChkdW1teSA+PSBibG9jay0+c2l6ZSkKKwkJCWR1bW15IC09IGJsb2NrLT5zaXplOworCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX1dQLAorCQkJcm91bmRfZG93bihibG9jay0+c3RhcnQgKyBkdW1teSwKKwkJCQlWREVDX0ZJRk9fQUxJR04pKTsKKworCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX0JVRl9DTlRMLCAzKTsKKwkJV1JJVEVfVlJFRyhWTERfTUVNX1ZJRklGT19CVUZfQ05UTCwgMik7CisKKwkJV1JJVEVfVlJFRyhWTERfTUVNX1ZJRklGT19DT05UUk9MLAorCQkJKDB4MTEgPDwgMTYpIHwgKDE8PDEwKSB8ICg3PDwzKSk7CisKKwl9Cit9CisKK3N0YXRpYyBpbnQgdm1wZWc0X2dldF9wc19pbmZvKHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBpbnRlcmxhY2UsIHN0cnVjdCBhbWxfdmRlY19wc19pbmZvcyAqcHMpCit7CisJcHMtPnZpc2libGVfd2lkdGgJPSB3aWR0aDsKKwlwcy0+dmlzaWJsZV9oZWlnaHQJPSBoZWlnaHQ7CisJcHMtPmNvZGVkX3dpZHRoCQk9IEFMSUdOKHdpZHRoLCA2NCk7CisJcHMtPmNvZGVkX2hlaWdodCAJPSBBTElHTihoZWlnaHQsIDY0KTsKKwlwcy0+ZHBiX3NpemUgCQk9IGh3LT5idWZfbnVtOworCXBzLT5kcGJfZnJhbWVzCQk9IERFQ09ERV9CVUZGRVJfTlVNX0RFRjsKKwlwcy0+ZHBiX21hcmdpbgkJPSBody0+ZHluYW1pY19idWZfbnVtX21hcmdpbjsKKwlwcy0+ZmllbGQgICAgICAgCT0gaW50ZXJsYWNlID8gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEIDogVjRMMl9GSUVMRF9OT05FOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdjRsX3Jlc19jaGFuZ2Uoc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqaHcsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGludGVybGFjZSkKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisJaW50IHJldCA9IDA7CisKKwlpZiAoY3R4LT5wYXJhbV9zZXRzX2Zyb21fdWNvZGUgJiYKKwkJaHctPnJlc19jaF9mbGFnID09IDApIHsKKwkJc3RydWN0IGFtbF92ZGVjX3BzX2luZm9zIHBzOworCisJCWlmICgoaHctPmZyYW1lX3dpZHRoICE9IDAgJiYKKwkJCWh3LT5mcmFtZV9oZWlnaHQgIT0gMCkgJiYKKwkJCShody0+ZnJhbWVfd2lkdGggIT0gd2lkdGggfHwKKwkJCWh3LT5mcmFtZV9oZWlnaHQgIT0gaGVpZ2h0KSkgeworCQkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkJInY0bF9yZXNfY2hhbmdlIFBpYyBXaWR0aC9IZWlnaHQgQ2hhbmdlICglZCwlZCk9PiglZCwlZClcbiIsCisJCQkJaHctPmZyYW1lX3dpZHRoLCBody0+ZnJhbWVfaGVpZ2h0LAorCQkJCXdpZHRoLAorCQkJCWhlaWdodCk7CisJCQl2bXBlZzRfZ2V0X3BzX2luZm8oaHcsIHdpZHRoLCBoZWlnaHQsIGludGVybGFjZSwgJnBzKTsKKwkJCXZkZWNfdjRsX3NldF9wc19pbmZvcyhjdHgsICZwcyk7CisJCQl2ZGVjX3Y0bF9yZXNfY2hfZXZlbnQoY3R4KTsKKwkJCWh3LT52NGxfcGFyYW1zX3BhcnNlZCA9IGZhbHNlOworCQkJaHctPnJlc19jaF9mbGFnID0gMTsKKwkJCWN0eC0+djRsX3Jlc29sdXRpb25fY2hhbmdlID0gMTsKKwkJCWh3LT5lb3MgPSAxOworCQkJZmx1c2hfb3V0cHV0KGh3KTsKKwkJCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy1zdWJtaXRfZW9zIiwgX19MSU5FX18pOworCQkJbm90aWZ5X3Y0bF9lb3MoaHdfdG9fdmRlYyhodykpOworCQkJQVRSQUNFX0NPVU5URVIoIlZfU1RfREVDLXN1Ym1pdF9lb3MiLCAwKTsKKworCQkJcmV0ID0gMTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB2bXBlZzRfaXNyX3RocmVhZF9mbihzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgaXJxKQoreworCXUzMiByZWc7CisJdTMyIHBpY3R1cmVfdHlwZTsKKwlpbnQgaW5kZXg7CisJdTMyIHB0cywgb2Zmc2V0ID0gMDsKKwl1NjQgcHRzX3VzNjQgPSAwOworCXUzMiBmcmFtZV9zaXplLCBkZWNfdywgZGVjX2g7CisJdTMyIHRpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24sIGZpeGVkX3ZvcF9yYXRlLCB2b3BfdGltZV9pbmMsIHZvc19pbmZvOworCXUzMiByZXBlYXRfY250LCBkdXJhdGlvbiA9IDMyMDA7CisJc3RydWN0IHBpY19pbmZvX3QgKmRlY19waWMsICpkaXNwX3BpYzsKKwlzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodyA9IChzdHJ1Y3QgdmRlY19tcGVnNF9od19zICopKHZkZWMtPnByaXZhdGUpOworCWlmIChody0+ZW9zKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwlpZiAoUkVBRF9WUkVHKE1QNF9QSUNfSU5GTykgPT0gMSkgeworCQlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCQlpbnQgZnJhbWVfd2lkdGggPSBSRUFEX1ZSRUcoTVA0X1BJQ19XSCk+PiAxNjsKKwkJCWludCBmcmFtZV9oZWlnaHQgPSBSRUFEX1ZSRUcoTVA0X1BJQ19XSCkgJiAweGZmZmY7CisJCQlpbnQgaW50ZXJsYWNlID0gKFJFQURfVlJFRyhNUDRfUElDX1JBVElPKSAmIDB4ODAwMDAwMDApID4+IDMxOworCQkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfQlVGRkVSX0RFVEFJTCwKKwkJCQkiaW50ZXJsYWNlID0gJWRcbiIsIGludGVybGFjZSk7CisJCQlpZiAoIXY0bF9yZXNfY2hhbmdlKGh3LCBmcmFtZV93aWR0aCwgZnJhbWVfaGVpZ2h0LCBpbnRlcmxhY2UpKSB7CisJCQkJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisJCQkJaWYgKGN0eC0+cGFyYW1fc2V0c19mcm9tX3Vjb2RlICYmICFody0+djRsX3BhcmFtc19wYXJzZWQpIHsKKwkJCQkJc3RydWN0IGFtbF92ZGVjX3BzX2luZm9zIHBzOworCisJCQkJCXZtcGVnNF9nZXRfcHNfaW5mbyhodywgZnJhbWVfd2lkdGgsIGZyYW1lX2hlaWdodCwgaW50ZXJsYWNlLCAmcHMpOworCQkJCQlody0+djRsX3BhcmFtc19wYXJzZWQgPSB0cnVlOworCQkJCQl2ZGVjX3Y0bF9zZXRfcHNfaW5mb3MoY3R4LCAmcHMpOworCQkJCQlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCQkJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfQUdBSU47CisJCQkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJCX0gZWxzZSB7CisJCQkJCXN0cnVjdCB2ZGVjX3BpY19pbmZvIHBpYzsKKworCQkJCQlpZiAoIWh3LT5idWZfbnVtKSB7CisJCQkJCQl2ZGVjX3Y0bF9nZXRfcGljX2luZm8oY3R4LCAmcGljKTsKKwkJCQkJCWh3LT5idWZfbnVtID0gcGljLmRwYl9mcmFtZXMgKworCQkJCQkJCXBpYy5kcGJfbWFyZ2luOworCQkJCQkJaWYgKGh3LT5idWZfbnVtID4gREVDT0RFX0JVRkZFUl9OVU1fTUFYKQorCQkJCQkJCWh3LT5idWZfbnVtID0gREVDT0RFX0JVRkZFUl9OVU1fTUFYOworCQkJCQl9CisKKwkJCQkJV1JJVEVfVlJFRyhNUDRfUElDX0lORk8sIDApOworCisJCQkJCWh3LT5yZXNfY2hfZmxhZyA9IDA7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCQkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKwkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCX0KKwkJfSBlbHNlCisJCQlXUklURV9WUkVHKE1QNF9QSUNfSU5GTywgMCk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAoKGh3LT5pc191c2VkX3Y0bCkgJiYgIWh3LT52NGxfcGFyYW1zX3BhcnNlZCkgeworCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19WNExfREVUQUlMLAorCQkJIlRoZSBoZWFkIHdhcyBub3QgZm91bmQsIGNhbiBub3QgdG8gZGVjb2RlXG4iKTsKKwkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJV1JJVEVfVlJFRyhBU1NJU1RfTUJPWDFfQ0xSX1JFRywgMSk7CisJaWYgKFJFQURfVlJFRyhBVl9TQ1JBVENIX00pICE9IDAgJiYKKwkJKGRlYnVnX2VuYWJsZSAmIFBSSU5UX0ZMQUdfVUNPREVfREVUQUlMKSkgeworCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19VQ09ERV9ERVRBSUwsCisJCSJkYmcgJXg6ICV4LCBsZXZlbCAleCwgd3AgJXgsIHJwICV4LCBjbnQgJXhcbiIsCisJCQlSRUFEX1ZSRUcoQVZfU0NSQVRDSF9NKSwgUkVBRF9WUkVHKEFWX1NDUkFUQ0hfTiksCisJCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fTEVWRUwpLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1dQKSwKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCksCisJCQlSRUFEX1ZSRUcoVklGRl9CSVRfQ05UKSk7CisJCVdSSVRFX1ZSRUcoQVZfU0NSQVRDSF9NLCAwKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwlyZWcgPSBSRUFEX1ZSRUcoTVJFR19CVUZGRVJPVVQpOworCisJQVRSQUNFX0NPVU5URVIoIlZfU1RfREVDLWRlY29kZV9zdGF0ZSIsIHJlZyk7CisKKwl0aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uID0gUkVBRF9WUkVHKE1QNF9SQVRFKTsKKwlmaXhlZF92b3BfcmF0ZSA9IHRpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24gPj4gMTY7CisJdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiAmPSAweGZmZmY7CisJaWYgKHRpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24gPiAwICYmCisJCWZpeGVkX3ZvcF9yYXRlID09IDApCisJCWh3LT5zeXNfbXA0X3JhdGUgPSB0aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uOworCisJaWYgKGh3LT52bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSA9PSAwKSB7CisJCWlmICgoZml4ZWRfdm9wX3JhdGUgIT0gMCkgJiYKKwkJCSh0aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uICE9IDApKSB7CisJCQlody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgPSBmaXhlZF92b3BfcmF0ZSAqCisJCQkJCURVUkFUSU9OX1VOSVQgLyB0aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uOworCQl9IGVsc2UgaWYgKHRpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24gPT0gMAorCQkJJiYgaHctPnN5c19tcDRfcmF0ZSA+IDApCisJCQl0aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uID0gaHctPnN5c19tcDRfcmF0ZTsKKwl9CisJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCwKKwkJInRpbWVfaW5jX3JlcyA9ICVkLCBmaXhlZF92b3BfcmF0ZSA9ICVkLCByYXRlID0gJWRcbiIsCisJCXRpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24sIGZpeGVkX3ZvcF9yYXRlLAorCQlody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUpOworCisJaWYgKHJlZyA9PSAyKSB7CisJCS8qIHRpbWVvdXQgd2hlbiBkZWNvZGluZyBuZXh0IGZyYW1lICovCisKKwkJLyogZm9yIGZyYW1lIGJhc2VkIGNhc2UsIGluc3VmZmljaWVudCByZXN1bHQgbWF5IGhhcHBlbgorCQkgKiBhdCB0aGUgYmVnaW5uaW5nIHdoZW4gb25seSBWT0wgaGVhZCBpcyBhdmFpbGFibGUgc2F2ZQorCQkgKiBIVyBjb250ZXh0IGFsc28sIHN1Y2ggYXMgZm9yIHRoZSBRVGFibGUgZnJvbSBWQ09QIHJlZ2lzdGVyCisJCSAqLworCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCVBSSU5UX0ZMQUdfVkxEX0RFVEFJTCwKKwkJCSIlcywgbGV2ZWwgPSAleCwgdmZpZm9fY3RybCA9ICV4LCBiaXRjbnQgPSAlZFxuIiwKKwkJCV9fZnVuY19fLAorCQkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKSwKKwkJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19DT05UUk9MKSwKKwkJCVJFQURfVlJFRyhWSUZGX0JJVF9DTlQpKTsKKworCQlpZiAodmRlY19mcmFtZV9iYXNlZCh2ZGVjKSkgeworCQkJdm1wZWc0X3NhdmVfaHdfY29udGV4dChodyk7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQl9IGVsc2UgeworCQkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQl9CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9IGVsc2UgeworCQlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCQlwaWN0dXJlX3R5cGUgPSAocmVnID4+IDMpICYgNzsKKwkJcmVwZWF0X2NudCA9IFJFQURfVlJFRyhNUDRfTk9UX0NPREVEX0NOVCk7CisJCXZvcF90aW1lX2luYyA9IFJFQURfVlJFRyhNUDRfVk9QX1RJTUVfSU5DKTsKKwkJdm9zX2luZm8gPSBSRUFEX1ZSRUcoTVA0X1ZPU19JTkZPKTsKKwkJaWYgKCh2b3NfaW5mbyAmIDB4ZmYpICYmCisJCQkoKCh2b3NfaW5mbyA+PiA0KSAmIDB4ZikgIT0gaHctPnByb2ZpbGVfaWRjIHx8CisJCQkodm9zX2luZm8gJiAweGYpICE9IGh3LT5sZXZlbF9pZGMpKSB7CisJCQlody0+cHJvZmlsZV9pZGMgPSB2b3NfaW5mbyA+PiA0ICYgMHhmOworCQkJaHctPmxldmVsX2lkYyA9IHZvc19pbmZvICYgMHhmOworCQkJdmRlY19zZXRfcHJvZmlsZV9sZXZlbCh2ZGVjLCBody0+cHJvZmlsZV9pZGMsIGh3LT5sZXZlbF9pZGMpOworCQkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfREVDX0RFVEFJTCwKKwkJCQkicHJvZmlsZV9pZGM6ICVkICBsZXZlbF9pZGM6ICVkXG4iLAorCQkJCWh3LT5wcm9maWxlX2lkYywgaHctPmxldmVsX2lkYyk7CisJCX0KKworCQlpbmRleCA9IHNwZWNfdG9faW5kZXgoaHcsIFJFQURfVlJFRyhSRUNfQ0FOVkFTX0FERFIpKTsKKwkJaWYgKGluZGV4IDwgMCkgeworCQkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkJImludmFsaWQgYnVmZmVyIGluZGV4ICVkLiByZWMgPSAleFxuIiwKKwkJCQlpbmRleCwgUkVBRF9WUkVHKFJFQ19DQU5WQVNfQUREUikpOworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0VSUk9SOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKwkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJCWRlY19waWMgPSAmaHctPnBpY1tpbmRleF07CisJCWlmICh2ZGVjLT5tdmZybSkgeworCQkJZGVjX3BpYy0+ZnJhbWVfc2l6ZSA9IHZkZWMtPm12ZnJtLT5mcmFtZV9zaXplOworCQkJZGVjX3BpYy0+aHdfZGVjb2RlX3RpbWUgPQorCQkJbG9jYWxfY2xvY2soKSAtIHZkZWMtPm12ZnJtLT5od19kZWNvZGVfc3RhcnQ7CisJCX0KKwkJZGVjX3BpYy0+cHRzX3ZhbGlkID0gZmFsc2U7CisJCWRlY19waWMtPnB0cyA9IDA7CisJCWRlY19waWMtPnB0czY0ID0gMDsKKwkJZGVjX3BpYy0+dGltZXN0YW1wID0gMDsKKwkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfQlVGRkVSX0RFVEFJTCwKKwkJCSJuZXcgcGljOiBpbmRleD0lZCwgdXNlZD0lZCwgcmVwZWF0PSVkLCB0aW1lX2luYz0lZFxuIiwKKwkJCWluZGV4LCBody0+dmZidWZfdXNlW2luZGV4XSwgcmVwZWF0X2NudCwgdm9wX3RpbWVfaW5jKTsKKworCQlkZWNfdyA9IFJFQURfVlJFRyhNUDRfUElDX1dIKT4+IDE2OworCQlkZWNfaCA9IFJFQURfVlJFRyhNUDRfUElDX1dIKSAmIDB4ZmZmZjsKKwkJaWYgKGRlY193ICE9IDApIHsKKwkJCWh3LT5mcmFtZV93aWR0aCA9IGRlY193OworCQkJZGVjX3BpYy0+d2lkdGggPSBkZWNfdzsKKwkJfQorCQlpZiAoZGVjX2ggIT0gMCkgeworCQkJaHctPmZyYW1lX2hlaWdodCA9IGRlY19oOworCQkJZGVjX3BpYy0+aGVpZ2h0ID0gZGVjX2g7CisJCX0KKwkJaHctPnJlc19jaF9mbGFnID0gMDsKKworCQlpZiAoaHctPnZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5yYXRlID09IDApIHsKKwkJCWlmICh2b3BfdGltZV9pbmMgPCBody0+bGFzdF92b3BfdGltZV9pbmMpIHsKKwkJCQlkdXJhdGlvbiA9IHZvcF90aW1lX2luYyArCisJCQkJCXRpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24gLQorCQkJCQlody0+bGFzdF92b3BfdGltZV9pbmM7CisJCQl9IGVsc2UgeworCQkJCWR1cmF0aW9uID0gdm9wX3RpbWVfaW5jIC0KKwkJCQkJaHctPmxhc3Rfdm9wX3RpbWVfaW5jOworCQkJfQorCisJCQlpZiAoZHVyYXRpb24gPT0gaHctPmxhc3RfZHVyYXRpb24pIHsKKwkJCQlody0+cmF0ZV9kZXRlY3QrKzsKKwkJCQlpZiAoKGh3LT5yYXRlX2RldGVjdCA+PSBSQVRFX0RFVEVDVF9DT1VOVCkgJiYKKwkJCQkJKHRpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24gIT0gMCkpIHsKKwkJCQkJaHctPnZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5yYXRlID0KKwkJCQkJCWR1cmF0aW9uICogRFVSQVRJT05fVU5JVCAvCisJCQkJCQl0aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uOworCQkJCQlkdXJhdGlvbiA9CisJCQkJCQlody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGU7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlody0+cmF0ZV9kZXRlY3QgPSAwOworCQkJCWh3LT5sYXN0X2R1cmF0aW9uID0gZHVyYXRpb247CisJCQl9CisJCQlpZiAoTVBFRzRfVkFMSURfRFVSKGR1cmF0aW9uKSkgeworCQkJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1RJTUVJTkZPLAorCQkJCQkid2FybjogZHVyYXRpb24gJXgsIHNldCAwXG4iLCBkdXJhdGlvbik7CisJCQkJZHVyYXRpb24gPSAwOworCQkJfQorCQl9IGVsc2UgeworCQkJZHVyYXRpb24gPSBody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGU7CisjaWYgMAorCQkJcHJfaW5mbygiaW5mbyByYXRlID0gJWQsIHVjb2RlIHJhdGUgPSAweCV4OjB4JXhcbiIsCisJCQkJICAgaHctPnZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5yYXRlLAorCQkJCSAgIFJFQURfVlJFRyhNUDRfUkFURSksIHZvcF90aW1lX2luYyk7CisjZW5kaWYKKwkJfQorCisJCS8qIGZyYW1lIG1vZGUgd2l0aCB1bnN0YWJsZSBwdHMgKi8KKwkJaWYgKGh3LT51bnN0YWJsZV9wdHMgJiYgaHctPmNodW5rKSB7CisJCQlkZWNfcGljLT5wdHNfdmFsaWQgPSBody0+Y2h1bmstPnB0c192YWxpZDsKKwkJCWRlY19waWMtPnB0cyA9IGh3LT5jaHVuay0+cHRzOworCQkJZGVjX3BpYy0+cHRzNjQgPSBody0+Y2h1bmstPnB0czY0OworCQkJZGVjX3BpYy0+dGltZXN0YW1wID0gaHctPmNodW5rLT50aW1lc3RhbXA7CisJCQlpZiAoKEJfUElDVFVSRSA9PSBwaWN0dXJlX3R5cGUpIHx8CisJCQkJKGh3LT5sYXN0X2RlY19wdHMgPT0gZGVjX3BpYy0+cHRzKSkKKwkJCQlkZWNfcGljLT5wdHNfdmFsaWQgPSAwOworCisJCQlody0+bGFzdF9kZWNfcHRzID0gZGVjX3BpYy0+cHRzOworCQl9IGVsc2UgaWYgKChJX1BJQ1RVUkUgPT0gcGljdHVyZV90eXBlKSB8fAorCQkJKFBfUElDVFVSRSA9PSBwaWN0dXJlX3R5cGUpKSB7CisJCQlvZmZzZXQgPSBSRUFEX1ZSRUcoTVA0X09GRlNFVF9SRUcpOworCQkJaWYgKGh3LT5jaHVuaykgeworCQkJCWRlY19waWMtPnB0c192YWxpZCA9IGh3LT5jaHVuay0+cHRzX3ZhbGlkOworCQkJCWRlY19waWMtPnB0cyA9IGh3LT5jaHVuay0+cHRzOworCQkJCWRlY19waWMtPnB0czY0ID0gaHctPmNodW5rLT5wdHM2NDsKKwkJCQlkZWNfcGljLT50aW1lc3RhbXAgPSBody0+Y2h1bmstPnRpbWVzdGFtcDsKKwkJCX0gZWxzZSB7CisJCQkJZGVjX3BpYy0+b2Zmc2V0ID0gb2Zmc2V0OworCQkJCWlmICgodmRlYy0+dmJ1Zi5ub19wYXJzZXIgPT0gMCkgfHwgKHZkZWMtPnZidWYudXNlX3B0c3NlcnYpKSB7CisJCQkJCWlmIChwdHNfbG9va3VwX29mZnNldF91czY0KFBUU19UWVBFX1ZJREVPLCBvZmZzZXQsCisJCQkJCQkmcHRzLCAmZnJhbWVfc2l6ZSwgMzAwMCwgJnB0c191czY0KSA9PSAwKSB7CisJCQkJCQlkZWNfcGljLT5wdHNfdmFsaWQgPSB0cnVlOworCQkJCQkJZGVjX3BpYy0+cHRzID0gcHRzOworCQkJCQkJZGVjX3BpYy0+cHRzNjQgPSBwdHNfdXM2NDsKKwkJCQkJCWh3LT5wdHNfaGl0Kys7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlkZWNfcGljLT5wdHNfdmFsaWQgPSBmYWxzZTsKKwkJCQkJCWh3LT5wdHNfbWlzc2VkKys7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19USU1FSU5GTywKKwkJCQkiJWMsIG9mZnNldD0weCV4LCBwdHM9MHgleCglZCksIGluZGV4PSVkLCB1c2VkPSVkXG4iLAorCQkJCUdFVF9QSUNfVFlQRShwaWN0dXJlX3R5cGUpLCBvZmZzZXQsIGRlY19waWMtPnB0cywKKwkJCQlkZWNfcGljLT5wdHNfdmFsaWQsIGluZGV4LCBody0+dmZidWZfdXNlW2luZGV4XSk7CisJCX0gZWxzZSBpZiAoQl9QSUNUVVJFID09IHBpY3R1cmVfdHlwZSkgeworCQkJaWYgKGh3LT5jaHVuaykgeworCQkJCWRlY19waWMtPnB0c192YWxpZCA9IGh3LT5jaHVuay0+cHRzX3ZhbGlkOworCQkJCWRlY19waWMtPnB0cyA9IGh3LT5jaHVuay0+cHRzOworCQkJCWRlY19waWMtPnB0czY0ID0gaHctPmNodW5rLT5wdHM2NDsKKwkJCQlkZWNfcGljLT50aW1lc3RhbXAgPSBody0+Y2h1bmstPnRpbWVzdGFtcDsKKwkJCX0KKwkJfQorCisJCWRlY19waWMtPmluZGV4ID0gaW5kZXg7CisJCWRlY19waWMtPnBpY19pbmZvID0gcmVnOworCQlkZWNfcGljLT5waWNfdHlwZSA9IHBpY3R1cmVfdHlwZTsKKwkJZGVjX3BpYy0+ZHVyYXRpb24gPSBkdXJhdGlvbjsKKwkJaHctPnZmYnVmX3VzZVtpbmRleF0gPSAwOworCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19SVU5fRkxPVywKKwkJCSJtbXBlZzQ6IHBpY19udW06ICVkLCBpbmRleCAlZCwgdHlwZSAlYywgcHRzICV4XG4iLAorCQkJaHctPmZyYW1lX251bSwgaW5kZXgsCisJCQlHRVRfUElDX1RZUEUocGljdHVyZV90eXBlKSwKKwkJCWRlY19waWMtPnB0cyk7CisKKwkJLyogYnVmZmVyIG1hbmFnZW1lbnQgKi8KKwkJaWYgKChwaWN0dXJlX3R5cGUgPT0gSV9QSUNUVVJFKSB8fAorCQkJKHBpY3R1cmVfdHlwZSA9PSBQX1BJQ1RVUkUpKSB7CisJCQlpbmRleCA9IHVwZGF0ZV9yZWYoaHcsIGluZGV4KTsKKwkJfSBlbHNlIHsKKwkJCS8qIGRyb3AgQiBmcmFtZSBvciBkaXNwIGltbWVkaWF0ZWx5LgorCQkJICogZGVwZW5kIG9uIGlmIHRoZXJlIGFyZSB0d28gcmVmIGZyYW1lcworCQkJICovCisJCQlpZiAoaHctPnJlZnNbMV0gPT0gLTEpCisJCQkJaW5kZXggPSAtMTsKKwkJfQorCQl2bXBlZzRfc2F2ZV9od19jb250ZXh0KGh3KTsKKwkJaWYgKGluZGV4IDwgMCkgeworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKwkJZGlzcF9waWMgPSAmaHctPnBpY1tpbmRleF07CisJCWlmICgoaHctPmZpcnN0X2lfZnJhbWVfcmVhZHkgPT0gMCkgJiYKKwkJCShJX1BJQ1RVUkUgPT0gZGlzcF9waWMtPnBpY190eXBlKSkKKwkJCWh3LT5maXJzdF9pX2ZyYW1lX3JlYWR5ID0gMTsKKworCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19SVU5fRkxPVywKKwkJCSJkaXNwOiBpbmRleD0lZCwgcHRzPSV4KCVkKSwgdXNlZD0lZCwgcGljb3V0PSVjKGRlYz0lYylcbiIsCisJCQlpbmRleCwgZGlzcF9waWMtPnB0cywgZGlzcF9waWMtPnB0c192YWxpZCwKKwkJCWh3LT52ZmJ1Zl91c2VbaW5kZXhdLAorCQkJR0VUX1BJQ19UWVBFKGRpc3BfcGljLT5waWNfdHlwZSksCisJCQlHRVRfUElDX1RZUEUocGljdHVyZV90eXBlKSk7CisKKwkJaWYgKGRpc3BfcGljLT5wdHNfdmFsaWQpIHsKKwkJCWh3LT5sYXN0X2FuY2hfcHRzID0gZGlzcF9waWMtPnB0czsKKwkJCWh3LT5sYXN0X2FuY2hfcHRzX3VzNjQgPSBkaXNwX3BpYy0+cHRzNjQ7CisJCQlody0+ZnJhbWVfbnVtX3NpbmNlX2xhc3RfYW5jaCA9IDA7CisJCQlody0+dm9wX3RpbWVfaW5jX3NpbmNlX2xhc3RfYW5jaCA9IDA7CisJCX0gZWxzZSBpZiAodmRlY19zdHJlYW1fYmFzZWQodmRlYykpIHsKKwkJCWRpc3BfcGljLT5wdHMgPSBody0+bGFzdF9hbmNoX3B0czsKKwkJCWRpc3BfcGljLT5wdHM2NCA9IGh3LT5sYXN0X2FuY2hfcHRzX3VzNjQ7CisKKwkJCWlmICgodGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiAhPSAwKSAmJgorCQkJCShmaXhlZF92b3BfcmF0ZSA9PSAwKSAmJgorCQkJCShody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgPT0gMCkpIHsKKwkJCQkvKiB2YXJpYWJsZSBQVFMgcmF0ZSAqLworCQkJCS8qYnVnIG9uIHZhcmlhYmxlIHB0cyBjYWxjLAorCQkJCSAqZG8gYXMgZGl4ZWQgdm9wIGZpcnN0IGlmIHdlCisJCQkJICpoYXZlIHJhdGUgc2V0dGluZyBiZWZvcmUuCisJCQkJICovCisJCQkJaWYgKHZvcF90aW1lX2luYyA+IGh3LT5sYXN0X3ZvcF90aW1lX2luYykgeworCQkJCQlkdXJhdGlvbiA9IHZvcF90aW1lX2luYyAtCisJCQkJCQlody0+bGFzdF92b3BfdGltZV9pbmM7CisJCQkJfSBlbHNlIHsKKwkJCQkJZHVyYXRpb24gPSB2b3BfdGltZV9pbmMgKworCQkJCQkJdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiAtCisJCQkJCQlody0+bGFzdF92b3BfdGltZV9pbmM7CisJCQkJfQorCisJCQkJaHctPnZvcF90aW1lX2luY19zaW5jZV9sYXN0X2FuY2ggKz0gZHVyYXRpb247CisKKwkJCQlkaXNwX3BpYy0+cHRzICs9IGh3LT52b3BfdGltZV9pbmNfc2luY2VfbGFzdF9hbmNoICoKKwkJCQkJUFRTX1VOSVQgLyB0aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uOworCQkJCWRpc3BfcGljLT5wdHM2NCArPSAoaHctPnZvcF90aW1lX2luY19zaW5jZV9sYXN0X2FuY2ggKgorCQkJCQlQVFNfVU5JVCAvIHRpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24pICoKKwkJCQkJMTAwIC8gOTsKKworCQkJCWlmIChody0+dm9wX3RpbWVfaW5jX3NpbmNlX2xhc3RfYW5jaCA+CisJCQkJCSgxIDw8IDE0KSkgeworCQkJCQkvKiBhdm9pZCBvdmVyZmxvdyAqLworCQkJCQlody0+bGFzdF9hbmNoX3B0cyA9IGRpc3BfcGljLT5wdHM7CisJCQkJCWh3LT5sYXN0X2FuY2hfcHRzX3VzNjQgPSBkaXNwX3BpYy0+cHRzNjQ7CisJCQkJCWh3LT52b3BfdGltZV9pbmNfc2luY2VfbGFzdF9hbmNoID0gMDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIGZpeGVkIFZPUCByYXRlICovCisJCQkJaHctPmZyYW1lX251bV9zaW5jZV9sYXN0X2FuY2grKzsKKwkJCQlkaXNwX3BpYy0+cHRzICs9IERVUjJQVFMoaHctPmZyYW1lX251bV9zaW5jZV9sYXN0X2FuY2ggKgorCQkJCQlody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUpOworCQkJCWRpc3BfcGljLT5wdHM2NCArPSBEVVIyUFRTKAorCQkJCQlody0+ZnJhbWVfbnVtX3NpbmNlX2xhc3RfYW5jaCAqCisJCQkJCWh3LT52bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSkgKiAxMDAgLyA5OworCisJCQkJaWYgKGh3LT5mcmFtZV9udW1fc2luY2VfbGFzdF9hbmNoID4gKDEgPDwgMTUpKSB7CisJCQkJCS8qIGF2b2lkIG92ZXJmbG93ICovCisJCQkJCWh3LT5sYXN0X2FuY2hfcHRzID0gZGlzcF9waWMtPnB0czsKKwkJCQkJaHctPmxhc3RfYW5jaF9wdHNfdXM2NCA9IGRpc3BfcGljLT5wdHM2NDsKKwkJCQkJaHctPmZyYW1lX251bV9zaW5jZV9sYXN0X2FuY2ggPSAwOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChody0+dW5zdGFibGVfcHRzICYmIGh3LT5jaHVuayAmJgorCQkJTVBFRzRfVkFMSURfRFVSKGR1cmF0aW9uKSkgeworCQkJLyogaW52YWxpZCBwdHMgY2FsYyAqLworCQkJaHctPmZyYW1lX251bV9zaW5jZV9sYXN0X2FuY2ggPSBody0+Y2h1bmtfZnJhbWVfY291bnQ7CisJCQlkaXNwX3BpYy0+cHRzID0gaHctPmxhc3RfYW5jaF9wdHMgKworCQkJCURVUjJQVFMoaHctPmZyYW1lX251bV9zaW5jZV9sYXN0X2FuY2ggKgorCQkJCWR1cmF0aW9uKTsKKwkJCWRpc3BfcGljLT5wdHM2NCA9IGh3LT5sYXN0X2FuY2hfcHRzX3VzNjQgKworCQkJCURVUjJQVFMoaHctPmZyYW1lX251bV9zaW5jZV9sYXN0X2FuY2ggKgorCQkJCWR1cmF0aW9uKSAqIDEwMCAvIDk7CisKKwkJCWlmIChody0+ZnJhbWVfbnVtX3NpbmNlX2xhc3RfYW5jaCA+ICgxIDw8IDE1KSkgeworCQkJCS8qIGF2b2lkIG92ZXJmbG93ICovCisJCQkJaHctPmxhc3RfYW5jaF9wdHMgPSBkaXNwX3BpYy0+cHRzOworCQkJCWh3LT5sYXN0X2FuY2hfcHRzX3VzNjQgPSBkaXNwX3BpYy0+cHRzNjQ7CisJCQkJaHctPmZyYW1lX251bV9zaW5jZV9sYXN0X2FuY2ggPSAwOworCQkJfSBlbHNlCisJCQkJZGlzcF9waWMtPnB0c192YWxpZCA9IDE7CisJCX0KKworCQlpZiAodmRlY19mcmFtZV9iYXNlZCh2ZGVjKSAmJgorCQkJKGh3LT51bnN0YWJsZV9wdHMpICYmCisJCQlNUEVHNF9WQUxJRF9EVVIoZHVyYXRpb24pKSB7CisKKwkJCXUzMiB0aHJlc2hvbGQgPSBEVVIyUFRTKGR1cmF0aW9uKSA+PiAzOworCisJCQlpZiAoZGlzcF9waWMtPnB0cyA8PSAoaHctPmxhc3RfcHRzICsgdGhyZXNob2xkKSkgeworCQkJCWRpc3BfcGljLT5wdHMgPSBody0+bGFzdF9wdHMgKyBEVVIyUFRTKGR1cmF0aW9uKTsKKwkJCQlkaXNwX3BpYy0+cHRzNjQgPSBody0+bGFzdF9wdHM2NCArCisJCQkJCShEVVIyUFRTKGR1cmF0aW9uKSoxMDAvOSk7CisJCQl9CisJCQlpZiAoIWRpc3BfcGljLT5wdHNfdmFsaWQpIHsKKwkJCQlkaXNwX3BpYy0+cHRzID0gMDsKKwkJCQlkaXNwX3BpYy0+cHRzNjQgPSAwOworCQkJCWRpc3BfcGljLT50aW1lc3RhbXAgPSAwOworCQkJfQorCQl9CisJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1RJTUVJTkZPLAorCQkJImRpc3A6IHBpY190eXBlICVjLCBwdHMgJWQoJWxsZCksIGRpZmYgJWQsIGNudCAlZCwgZGlzcF9waWMtPnRpbWVzdGFtcCAlbGx1XG4iLAorCQkJR0VUX1BJQ19UWVBFKGRpc3BfcGljLT5waWNfdHlwZSksCisJCQlkaXNwX3BpYy0+cHRzLAorCQkJZGlzcF9waWMtPnB0czY0LAorCQkJZGlzcF9waWMtPnB0cyAtIGh3LT5sYXN0X3B0cywKKwkJCWh3LT5jaHVua19mcmFtZV9jb3VudCwKKwkJCWRpc3BfcGljLT50aW1lc3RhbXApOworCQlody0+bGFzdF9wdHMgPSBkaXNwX3BpYy0+cHRzOworCQlody0+bGFzdF9wdHM2NCA9IGRpc3BfcGljLT5wdHM2NDsKKwkJaHctPmZyYW1lX2R1ciA9IGR1cmF0aW9uOworCQlkaXNwX3BpYy0+ZHVyYXRpb24gPSBkdXJhdGlvbjsKKwkJZGlzcF9waWMtPnJlcGVhdF9jbnQgPSByZXBlYXRfY250OworCisJCXByZXBhcmVfZGlzcGxheV9idWYoaHcsIGRpc3BfcGljKTsKKworCQlody0+dG90YWxfZnJhbWUgKz0gcmVwZWF0X2NudCArIDE7CisJCWh3LT5sYXN0X3ZvcF90aW1lX2luYyA9IHZvcF90aW1lX2luYzsKKworCQlpZiAodmRlY19mcmFtZV9iYXNlZCh2ZGVjKSAmJgorCQkJKGZybWJhc2VfY29udF9iaXRsZXZlbCAhPSAwKSAmJgorCQkJKGh3LT5maXJzdF9pX2ZyYW1lX3JlYWR5KSkgeworCQkJdTMyIGNvbnN1bWVfYnl0ZSwgcmVzX2J5dGUsIGJpdGNudDsKKworCQkJYml0Y250ID0gUkVBRF9WUkVHKFZJRkZfQklUX0NOVCk7CisJCQlyZXNfYnl0ZSA9IGJpdGNudCA+PiAzOworCisJCQlpZiAoaHctPmNodW5rX3NpemUgPiByZXNfYnl0ZSkgeworCQkJCWlmIChiaXRjbnQgPiBmcm1iYXNlX2NvbnRfYml0bGV2ZWwpIHsKKwkJCQkJY29uc3VtZV9ieXRlID0gaHctPmNodW5rX3NpemUgLSByZXNfYnl0ZTsKKworCQkJCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19SVU5fRkxPVywKKwkJCQkJCSIlcywgc2l6ZSAlZCwgY29uc3VtZSAlZCwgcmVzICVkXG4iLCBfX2Z1bmNfXywKKwkJCQkJCWh3LT5jaHVua19zaXplLCBjb25zdW1lX2J5dGUsIHJlc19ieXRlKTsKKworCQkJCQlpZiAoY29uc3VtZV9ieXRlID4gVkRFQ19GSUZPX0FMSUdOKSB7CisJCQkJCQljb25zdW1lX2J5dGUgLT0gVkRFQ19GSUZPX0FMSUdOOworCQkJCQkJcmVzX2J5dGUgKz0gVkRFQ19GSUZPX0FMSUdOOworCQkJCQl9CisJCQkJCWh3LT5jaHVua19vZmZzZXQgKz0gY29uc3VtZV9ieXRlOworCQkJCQlody0+Y2h1bmtfc2l6ZSA9IHJlc19ieXRlOworCQkJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfVU5GSU5JU0g7CisJCQkJCWh3LT5jaHVua19mcmFtZV9jb3VudCsrOworCQkJCQlody0+dW5zdGFibGVfcHRzID0gMTsKKwkJCQl9IGVsc2UgeworCQkJCQlody0+Y2h1bmtfc2l6ZSA9IDA7CisJCQkJCWh3LT5jaHVua19vZmZzZXQgPSAwOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRVJST1IsCisJCQkJCSJlcnJvcjogYml0Ynl0ZSAlZCAgaHctPmNodW5rX3NpemUgJWRcbiIsIHJlc19ieXRlLCBody0+Y2h1bmtfc2l6ZSk7CisJCQkJaHctPmNodW5rX3NpemUgPSAwOworCQkJCWh3LT5jaHVua19vZmZzZXQgPSAwOworCQkJfQorCQl9CisJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCX0KKwltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRlJBTUVfTlVNLAorCQkiJXM6IGZyYW1lIG51bTolZFxuIiwgX19mdW5jX18sIGh3LT5mcmFtZV9udW0pOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgdm1wZWc0X2lzcihzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgaXJxKQoreworCXN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3ID0KKwkJKHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKikodmRlYy0+cHJpdmF0ZSk7CisKKwlpZiAoaHctPmVvcykKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJcmV0dXJuIElSUV9XQUtFX1RIUkVBRDsKK30KKworc3RhdGljIHZvaWQgZmx1c2hfb3V0cHV0KHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKiBodykKK3sKKwlzdHJ1Y3QgcGljX2luZm9fdCAqcGljOworCisJaWYgKGh3LT52ZmJ1Zl91c2VbaHctPnJlZnNbMV1dID4gMCkgeworCQlwaWMgPSAmaHctPnBpY1tody0+cmVmc1sxXV07CisJCXByZXBhcmVfZGlzcGxheV9idWYoaHcsIHBpYyk7CisJfQorfQorCitzdGF0aWMgYm9vbCBpc19hdmFsaWFibGVfYnVmZmVyKHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3KTsKKworc3RhdGljIGludCBub3RpZnlfdjRsX2VvcyhzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKil2ZGVjLT5wcml2YXRlOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShody0+djRsMl9jdHgpOworCXN0cnVjdCB2ZnJhbWVfcyAqdmYgPSAmaHctPnZmcmFtZV9kdW1teTsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPSBOVUxMOworCWludCBpbmRleCA9IElOVkFMSURfSURYOworCXVsb25nIGV4cGlyZXM7CisKKwlpZiAoaHctPmVvcykgeworCQlleHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjAwMCk7CisJCXdoaWxlICghaXNfYXZhbGlhYmxlX2J1ZmZlcihodykpIHsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGV4cGlyZXMpKSB7CisJCQkJcHJfZXJyKCJbJWRdIE1QRUc0IGlzbid0IGVub3VnaCBidWZmIGZvciBub3RpZnkgZW9zLlxuIiwgY3R4LT5pZCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKworCQlpbmRleCA9IGZpbmRfZnJlZV9idWZmZXIoaHcpOworCQlpZiAoSU5WQUxJRF9JRFggPT0gaW5kZXgpIHsKKwkJCXByX2VycigiWyVkXSBNUEVHNCBFT1MgZ2V0IGZyZWUgYnVmZiBmYWlsLlxuIiwgY3R4LT5pZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWZiID0gKHN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICopCisJCQlody0+cGljW2luZGV4XS52NGxfcmVmX2J1Zl9hZGRyOworCisJCXZmLT50eXBlCQl8PSBWSURUWVBFX1Y0TF9FT1M7CisJCXZmLT50aW1lc3RhbXAJCT0gVUxPTkdfTUFYOworCQl2Zi0+djRsX21lbV9oYW5kbGUJPSAodWxvbmcpZmI7CisJCXZmLT5mbGFnCQk9IFZGUkFNRV9GTEFHX0VNUFRZX0ZSQU1FX1Y0TDsKKworCQl2ZGVjX3ZmcmFtZV9yZWFkeSh2ZGVjLCB2Zik7CisJCWtmaWZvX3B1dCgmaHctPmRpc3BsYXlfcSwgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKworCQlBVFJBQ0VfQ09VTlRFUigiVkNfT1VUX0RFQy1zdWJtaXQiLCBmYi0+YnVmX2lkeCk7CisJCWZiLT50YXNrLT5zdWJtaXQoZmItPnRhc2ssIFRBU0tfVFlQRV9ERUMpOworCQlBVFJBQ0VfQ09VTlRFUihody0+cHRzX25hbWUsIHZmLT50aW1lc3RhbXApOworCisJCXByX2luZm8oIlslZF0gbXBlZzQgRU9TIG5vdGlmeS5cbiIsIGN0eC0+aWQpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2bXBlZzRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqaHcgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHZkZWNfbXBlZzRfaHdfcywgd29yayk7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaHcpOworCisJLyogZmluaXNoZWQgZGVjb2Rpbmcgb25lIGZyYW1lIG9yIGVycm9yLAorCSAqIG5vdGlmeSB2ZGVjIGNvcmUgdG8gc3dpdGNoIGNvbnRleHQKKwkgKi8KKwlpZiAoaHctPmRlY19yZXN1bHQgIT0gREVDX1JFU1VMVF9ET05FKQorCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19SVU5fRkxPVywKKwkJCSJ2bXBlZzRfd29yazogcmVzdWx0PSVkLHN0YXR1cz0lZFxuIiwKKwkJCWh3LT5kZWNfcmVzdWx0LCBod190b192ZGVjKGh3KS0+bmV4dF9zdGF0dXMpOworCisJQVRSQUNFX0NPVU5URVIoIlZfU1RfREVDLXdvcmtfc3RhdGUiLCBody0+ZGVjX3Jlc3VsdCk7CisKKwlpZiAoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9VTkZJTklTSCkgeworCQlpZiAoIWh3LT5jdHhfdmFsaWQpCisJCQlody0+Y3R4X3ZhbGlkID0gMTsKKworCX0gZWxzZSBpZiAoKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfRE9ORSkgfHwKKwkJKCghaHctPmlzX3VzZWRfdjRsKSAmJiAoaW5wdXRfZnJhbWVfYmFzZWQoJnZkZWMtPmlucHV0KSkgJiYgaHctPmNodW5rKSkgeworCQlpZiAoIWh3LT5jdHhfdmFsaWQpCisJCQlody0+Y3R4X3ZhbGlkID0gMTsKKworCQl2ZGVjX3ZmcmFtZV9kaXJ0eSh2ZGVjLCBody0+Y2h1bmspOworCQlody0+Y2h1bmsgPSBOVUxMOworCX0gZWxzZSBpZiAoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9BR0FJTgorCQkmJiAodmRlYy0+bmV4dF9zdGF0dXMgIT0gVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEKSkgeworCQkvKgorCQkJc3RyZWFtIGJhc2U6IHN0cmVhbSBidWYgZW1wdHkgb3IgdGltZW91dAorCQkJZnJhbWUgYmFzZTogdmRlY19wcmVwYXJlX2lucHV0IGZhaWwKKwkJKi8KKwkJaWYgKCF2ZGVjX2hhc19tb3JlX2lucHV0KHZkZWMpKSB7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRU9TOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgaWYgKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfRk9SQ0VfRVhJVCkgeworCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19FUlJPUiwKKwkJCSIlczogZm9yY2UgZXhpdFxuIiwgX19mdW5jX18pOworCQlpZiAoaHctPnN0YXQgJiBTVEFUX0lTUl9SRUcpIHsKKwkJCWFtdmRlY19zdG9wKCk7CisJCQl2ZGVjX2ZyZWVfaXJxKFZERUNfSVJRXzEsICh2b2lkICopaHcpOworCQkJaHctPnN0YXQgJj0gflNUQVRfSVNSX1JFRzsKKwkJfQorCX0gZWxzZSBpZiAoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9FT1MpIHsKKwkJaHctPmVvcyA9IDE7CisJCWlmIChody0+c3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJCWFtdmRlY19zdG9wKCk7CisJCQlody0+c3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwkJfQorCQl2ZGVjX3ZmcmFtZV9kaXJ0eSh2ZGVjLCBody0+Y2h1bmspOworCQlody0+Y2h1bmsgPSBOVUxMOworCQl2ZGVjX2NsZWFuX2lucHV0KHZkZWMpOworCQlmbHVzaF9vdXRwdXQoaHcpOworCisJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy1zdWJtaXRfZW9zIiwgX19MSU5FX18pOworCQkJbm90aWZ5X3Y0bF9lb3ModmRlYyk7CisJCQlBVFJBQ0VfQ09VTlRFUigiVl9TVF9ERUMtc3VibWl0X2VvcyIsIDApOworCQl9CisKKwkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkiJXM6IGVvcyBmbHVzaGVkLCBmcmFtZV9udW0gJWRcbiIsCisJCQlfX2Z1bmNfXywgaHctPmZyYW1lX251bSk7CisJfSBlbHNlIGlmIChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0VSUk9SX1NaSUUpIHsKKwkJaWYgKCF2ZGVjX2hhc19tb3JlX2lucHV0KHZkZWMpKSB7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRU9TOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQl2ZGVjX3ZmcmFtZV9kaXJ0eSh2ZGVjLCBody0+Y2h1bmspOworCQkJaHctPmNodW5rID0gTlVMTDsKKwkJfQorCX0KKworCWlmIChody0+c3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJYW12ZGVjX3N0b3AoKTsKKwkJaHctPnN0YXQgJj0gflNUQVRfVkRFQ19SVU47CisJfQorCS8qZGlzYWJsZSBtYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoQVNTSVNUX01CT1gxX01BU0ssIDApOworCWRlbF90aW1lcl9zeW5jKCZody0+Y2hlY2tfdGltZXIpOworCWh3LT5zdGF0ICY9IH5TVEFUX1RJTUVSX0FSTTsKKworCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShody0+djRsMl9jdHgpOworCisJCWlmIChjdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSAmJgorCQkJIWh3LT52NGxfcGFyYW1zX3BhcnNlZCkKKwkJCXZkZWNfdjRsX3dyaXRlX2ZyYW1lX3N5bmMoY3R4KTsKKwl9CisKKwkvKiBtYXJrIGl0c2VsZiBoYXMgYWxsIEhXIHJlc291cmNlIHJlbGVhc2VkIGFuZCBpbnB1dCByZWxlYXNlZCAqLworCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkKKwkJdmRlY19jb3JlX2ZpbmlzaF9ydW4odmRlYywgQ09SRV9NQVNLX1ZERUNfMSk7CisJZWxzZQorCQl2ZGVjX2NvcmVfZmluaXNoX3J1bih2ZGVjLCBDT1JFX01BU0tfVkRFQ18xIHwgQ09SRV9NQVNLX0hFVkMpOworCisJQVRSQUNFX0NPVU5URVIoIlZfU1RfREVDLWNodW5rX3NpemUiLCAwKTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaHctPndhaXRfcSk7CisJaWYgKGh3LT52ZGVjX2NiKQorCQlody0+dmRlY19jYih2ZGVjLCBody0+dmRlY19jYl9hcmcpOworfQorCitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2bXBlZ192Zl9wZWVrKHZvaWQgKm9wX2FyZykKK3sKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBvcF9hcmc7CisJc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqaHcgPSAoc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisKKwlpZiAoIWh3KQorCQlyZXR1cm4gTlVMTDsKKwlhdG9taWNfYWRkKDEsICZody0+cGVla19udW0pOworCWlmIChrZmlmb19wZWVrKCZody0+ZGlzcGxheV9xLCAmdmYpKQorCQlyZXR1cm4gdmY7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyAqdm1wZWdfdmZfZ2V0KHZvaWQgKm9wX2FyZykKK3sKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBvcF9hcmc7CisJc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqaHcgPSAoc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisKKwlpZiAoa2ZpZm9fZ2V0KCZody0+ZGlzcGxheV9xLCAmdmYpKSB7CisJCXZmLT5pbmRleF9kaXNwID0gYXRvbWljX3JlYWQoJmh3LT5nZXRfbnVtKTsKKwkJYXRvbWljX2FkZCgxLCAmaHctPmdldF9udW0pOworCQlBVFJBQ0VfQ09VTlRFUihody0+ZGlzcF9xX25hbWUsIGtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSkpOworCQlyZXR1cm4gdmY7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHZhbGlkX3ZmX2NoZWNrKHN0cnVjdCB2ZnJhbWVfcyAqdmYsIHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3KQoreworCWludCBpOworCisJaWYgKCF2ZiB8fCAodmYtPmluZGV4ID09IC0xKSkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgVkZfUE9PTF9TSVpFOyBpKyspIHsKKwkJaWYgKHZmID09ICZody0+dmZwb29sW2ldKQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgdm1wZWdfdmZfcHV0KHN0cnVjdCB2ZnJhbWVfcyAqdmYsIHZvaWQgKm9wX2FyZykKK3sKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gb3BfYXJnOworCXN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3ID0gKHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKil2ZGVjLT5wcml2YXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIXZhbGlkX3ZmX2NoZWNrKHZmLCBodykpIHsKKwkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfRVJST1IsCisJCQkiaW52YWxpZCB2ZjogJWx4XG4iLCAodWxvbmcpdmYpOworCQlyZXR1cm4gOworCX0KKworCWlmICh2Zi0+djRsX21lbV9oYW5kbGUgIT0KKwkJaHctPnBpY1t2Zi0+aW5kZXhdLnY0bF9yZWZfYnVmX2FkZHIpIHsKKwkJaHctPnBpY1t2Zi0+aW5kZXhdLnY0bF9yZWZfYnVmX2FkZHIKKwkJCT0gdmYtPnY0bF9tZW1faGFuZGxlOworCisJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1Y0TF9ERVRBSUwsCisJCQkiTVBFRzQgdXBkYXRlIGZiIGhhbmRsZSwgb2xkOiVsbHgsIG5ldzolbGx4XG4iLAorCQkJaHctPnBpY1t2Zi0+aW5kZXhdLnY0bF9yZWZfYnVmX2FkZHIsCisJCQl2Zi0+djRsX21lbV9oYW5kbGUpOworCX0KKworCWh3LT52ZmJ1Zl91c2VbdmYtPmluZGV4XS0tOworCWF0b21pY19hZGQoMSwgJmh3LT5wdXRfbnVtKTsKKwltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRlJBTUVfTlVNLAorCQkiJXM6IHB1dCBudW06JWRcbiIsX19mdW5jX18sIGh3LT5wdXRfbnVtKTsKKwltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19CVUZGRVJfREVUQUlMLAorCQkiaW5kZXg9JWQsIHVzZWQ9JWRcbiIsIHZmLT5pbmRleCwgaHctPnZmYnVmX3VzZVt2Zi0+aW5kZXhdKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmxvY2ssIGZsYWdzKTsKKwlrZmlmb19wdXQoJmh3LT5uZXdmcmFtZV9xLCAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5sb2NrLCBmbGFncyk7CisJQVRSQUNFX0NPVU5URVIoaHctPm5ld19xX25hbWUsIGtmaWZvX2xlbigmaHctPm5ld2ZyYW1lX3EpKTsKK30KKworc3RhdGljIGludCB2bXBlZ19ldmVudF9jYihpbnQgdHlwZSwgdm9pZCAqZGF0YSwgdm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBvcF9hcmc7CisKKwlpZiAodHlwZSAmIFZGUkFNRV9FVkVOVF9SRUNFSVZFUl9SRVFfU1RBVEUpIHsKKwkJc3RydWN0IHByb3ZpZGVyX3N0YXRlX3JlcV9zICpyZXEgPQorCQkJKHN0cnVjdCBwcm92aWRlcl9zdGF0ZV9yZXFfcyAqKWRhdGE7CisJCWlmIChyZXEtPnJlcV90eXBlID09IFJFUV9TVEFURV9TRUNVUkUpCisJCQlyZXEtPnJlcV9yZXN1bHRbMF0gPSB2ZGVjX3NlY3VyZSh2ZGVjKTsKKwkJZWxzZQorCQkJcmVxLT5yZXFfcmVzdWx0WzBdID0gMHhmZmZmZmZmZjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCAgdm1wZWdfdmZfc3RhdGVzKHN0cnVjdCB2ZnJhbWVfc3RhdGVzICpzdGF0ZXMsIHZvaWQgKm9wX2FyZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBvcF9hcmc7CisJc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqaHcgPSAoc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmxvY2ssIGZsYWdzKTsKKworCXN0YXRlcy0+dmZfcG9vbF9zaXplID0gVkZfUE9PTF9TSVpFOworCXN0YXRlcy0+YnVmX2ZyZWVfbnVtID0ga2ZpZm9fbGVuKCZody0+bmV3ZnJhbWVfcSk7CisJc3RhdGVzLT5idWZfYXZhaWxfbnVtID0ga2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKTsKKwlzdGF0ZXMtPmJ1Zl9yZWN5Y2xlX251bSA9IDA7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBkZWNfc3RhdHVzKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHN0cnVjdCB2ZGVjX2luZm8gKnZzdGF0dXMpCit7CisJc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqaHcgPQorCQkoc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisKKwlpZiAoIWh3KQorCQlyZXR1cm4gLTE7CisKKwl2c3RhdHVzLT5mcmFtZV93aWR0aCA9IGh3LT5mcmFtZV93aWR0aDsKKwl2c3RhdHVzLT5mcmFtZV9oZWlnaHQgPSBody0+ZnJhbWVfaGVpZ2h0OworCWlmICgwICE9IGh3LT52bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSkKKwkJdnN0YXR1cy0+ZnJhbWVfcmF0ZSA9ICgoRFVSQVRJT05fVU5JVCAqIDEwIC8gaHctPnZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5yYXRlKSAlIDEwKSA8IDUgPworCQlEVVJBVElPTl9VTklUIC8gaHctPnZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5yYXRlIDogKERVUkFUSU9OX1VOSVQgLyBody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgKzEpOworCWVsc2UKKwkJdnN0YXR1cy0+ZnJhbWVfcmF0ZSA9IC0xOworCXZzdGF0dXMtPmVycm9yX2NvdW50ID0gUkVBRF9WUkVHKE1QNF9FUlJfQ09VTlQpOworCXZzdGF0dXMtPnN0YXR1cyA9IGh3LT5zdGF0OworCXZzdGF0dXMtPmZyYW1lX2R1ciA9IGh3LT5mcmFtZV9kdXI7CisJdnN0YXR1cy0+ZXJyb3JfZnJhbWVfY291bnQgPSBSRUFEX1ZSRUcoTVA0X0VSUl9DT1VOVCk7CisJdnN0YXR1cy0+ZHJvcF9mcmFtZV9jb3VudCA9IGh3LT5kcm9wX2ZyYW1lX2NvdW50OworCXZzdGF0dXMtPmZyYW1lX2NvdW50ID1ody0+ZnJhbWVfbnVtOworCXZzdGF0dXMtPmlfZGVjb2RlZF9mcmFtZXMgPSBody0+aV9kZWNvZGVkX2ZyYW1lczsKKwl2c3RhdHVzLT5pX2xvc3RfZnJhbWVzID0gaHctPmlfbG9zdF9mcmFtZXM7CisJdnN0YXR1cy0+aV9jb25jZWFsZWRfZnJhbWVzID0gaHctPmlfY29uY2VhbGVkX2ZyYW1lczsKKwl2c3RhdHVzLT5wX2RlY29kZWRfZnJhbWVzID0gaHctPnBfZGVjb2RlZF9mcmFtZXM7CisJdnN0YXR1cy0+cF9sb3N0X2ZyYW1lcyA9IGh3LT5wX2xvc3RfZnJhbWVzOworCXZzdGF0dXMtPnBfY29uY2VhbGVkX2ZyYW1lcyA9IGh3LT5wX2NvbmNlYWxlZF9mcmFtZXM7CisJdnN0YXR1cy0+Yl9kZWNvZGVkX2ZyYW1lcyA9IGh3LT5iX2RlY29kZWRfZnJhbWVzOworCXZzdGF0dXMtPmJfbG9zdF9mcmFtZXMgPSBody0+Yl9sb3N0X2ZyYW1lczsKKwl2c3RhdHVzLT5iX2NvbmNlYWxlZF9mcmFtZXMgPSBody0+Yl9jb25jZWFsZWRfZnJhbWVzOworCXNucHJpbnRmKHZzdGF0dXMtPnZkZWNfbmFtZSwgc2l6ZW9mKHZzdGF0dXMtPnZkZWNfbmFtZSksCisJCQkiJXMiLCBEUklWRVJfTkFNRSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHZtcGVnNF93b3Jrc3BhY2VfaW5pdChzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodykKK3sKKwlpbnQgcmV0OworCXZvaWQgKmJ1ZiA9IE5VTEw7CisKKwlyZXQgPSBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkoaHctPm1tX2Jsa19oYW5kbGUsCisJCURFQ09ERV9CVUZGRVJfTlVNX01BWCwKKwkJV09SS1NQQUNFX1NJWkUsCisJCURSSVZFUl9OQU1FLAorCQkmaHctPmJ1Zl9zdGFydCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCJtcGVnNCB3b3Jrc3BhY2UgYWxsb2Mgc2l6ZSAlZCBmYWlsZWQuXG4iLAorCQkJV09SS1NQQUNFX1NJWkUpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIG5vdGlmeSB1Y29kZSB0aGUgYnVmZmVyIHN0YXJ0IGFkZHJlc3MgKi8KKwlidWYgPSBjb2RlY19tbV92bWFwKGh3LT5idWZfc3RhcnQsIFdPUktTUEFDRV9TSVpFKTsKKwlpZiAoYnVmKSB7CisJCW1lbXNldChidWYsIDAsIFdPUktTUEFDRV9TSVpFKTsKKwkJY29kZWNfbW1fZG1hX2ZsdXNoKGJ1ZiwKKwkJCVdPUktTUEFDRV9TSVpFLCBETUFfVE9fREVWSUNFKTsKKwkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcihidWYpOworCX0KKworCVdSSVRFX1ZSRUcoTUVNX09GRlNFVF9SRUcsIGh3LT5idWZfc3RhcnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZtcGVnNF9kdW1wX3N0YXRlKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqaHcgPQorCQkoc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqKSh2ZGVjLT5wcml2YXRlKTsKKwl1MzIgaTsKKwltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIj09PT09PSAlc1xuIiwgX19mdW5jX18pOworCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkid2lkdGgvaGVpZ2h0ICglZC8lZCksIGlfZnJhbTolZCwgYnVmZmVyX25vdF9yZWFkeSAlZCwgYnVmX251bSAlZFxuIiwKKwkJaHctPmZyYW1lX3dpZHRoLAorCQlody0+ZnJhbWVfaGVpZ2h0LAorCQlody0+Zmlyc3RfaV9mcmFtZV9yZWFkeSwKKwkJaHctPmJ1ZmZlcl9ub3RfcmVhZHksCisJCWh3LT5idWZfbnVtCisJCSk7CisJZm9yIChpID0gMDsgaSA8IGh3LT5idWZfbnVtOyBpKyspIHsKKwkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkiaW5kZXggJWQsIHVzZWQgJWRcbiIsIGksIGh3LT52ZmJ1Zl91c2VbaV0pOworCX0KKworCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiaXNfZnJhbWViYXNlKCVkKSwgZW9zICVkLCBzdGF0ZSAweCV4LCBkZWNfcmVzdWx0IDB4JXggZGVjX2ZybSAlZFxuIiwKKwkJdmRlY19mcmFtZV9iYXNlZCh2ZGVjKSwKKwkJaHctPmVvcywKKwkJaHctPnN0YXQsCisJCWh3LT5kZWNfcmVzdWx0LAorCQlody0+ZnJhbWVfbnVtCisJCSk7CisJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSJpc19mcmFtZWJhc2UoJWQpLCAgcHV0X2ZybSAlZCBydW4gJWQgbm90X3J1bl9yZWFkeSAlZCBpbnB1dF9lbXB0eSAlZCxkcm9wICVkXG4iLAorCQl2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpLAorCQlody0+cHV0X251bSwKKwkJaHctPnJ1bl9jb3VudCwKKwkJaHctPm5vdF9ydW5fcmVhZHksCisJCWh3LT5pbnB1dF9lbXB0eSwKKwkJaHctPmRyb3BfZnJhbWVfY291bnQKKwkJKTsKKworCWlmICghaHctPmlzX3VzZWRfdjRsICYmIHZmX2dldF9yZWNlaXZlcih2ZGVjLT52Zl9wcm92aWRlcl9uYW1lKSkgeworCQllbnVtIHJlY2V2aXZlcl9zdGFydF9lIHN0YXRlID0KKwkJdmZfbm90aWZ5X3JlY2VpdmVyKHZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfUVVSRVlfU1RBVEUsCisJCQlOVUxMKTsKKwkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkiXG5yZWNlaXZlciglcykgc3RhdGUgJWRcbiIsCisJCQl2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJc3RhdGUpOworCX0KKwltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIiVzLCBuZXdxKCVkLyVkKSwgZGlzcHEoJWQvJWQpIHZmIHBlZWsvZ2V0L3B1dCAoJWQvJWQvJWQpXG4iLAorCQlfX2Z1bmNfXywKKwkJa2ZpZm9fbGVuKCZody0+bmV3ZnJhbWVfcSksIFZGX1BPT0xfU0laRSwKKwkJa2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKSwgVkZfUE9PTF9TSVpFLAorCQlody0+cGVla19udW0sIGh3LT5nZXRfbnVtLCBody0+cHV0X251bQorCSk7CisJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSJWSUZGX0JJVF9DTlQ9MHgleFxuIiwKKwkJUkVBRF9WUkVHKFZJRkZfQklUX0NOVCkpOworCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiVkxEX01FTV9WSUZJRk9fTEVWRUw9MHgleFxuIiwKKwkJUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKSk7CisJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSJWTERfTUVNX1ZJRklGT19XUD0weCV4XG4iLAorCQlSRUFEX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1ApKTsKKwltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJIlZMRF9NRU1fVklGSUZPX1JQPTB4JXhcbiIsCisJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCkpOworCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiUEFSU0VSX1ZJREVPX1JQPTB4JXhcbiIsCisJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF9ycCkpOworCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiUEFSU0VSX1ZJREVPX1dQPTB4JXhcbiIsCisJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCkpOworCisJaWYgKHZkZWNfZnJhbWVfYmFzZWQodmRlYykgJiYKKwkJZGVidWdfZW5hYmxlICYgUFJJTlRfRlJBTUVCQVNFX0RBVEEpIHsKKwkJaW50IGpqOworCQlpZiAoaHctPmNodW5rICYmIGh3LT5jaHVuay0+YmxvY2sgJiYKKwkJCWh3LT5jaHVuay0+c2l6ZSA+IDApIHsKKwkJCXU4ICpkYXRhID0gTlVMTDsKKworCQkJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQkJZGF0YSA9IGNvZGVjX21tX3ZtYXAoaHctPmNodW5rLT5ibG9jay0+c3RhcnQgKworCQkJCQlody0+Y2h1bmstPm9mZnNldCwgaHctPmNodW5rLT5zaXplKTsKKwkJCWVsc2UKKwkJCQlkYXRhID0gKCh1OCAqKWh3LT5jaHVuay0+YmxvY2stPnN0YXJ0X3ZpcnQpICsKKwkJCQkJaHctPmNodW5rLT5vZmZzZXQ7CisKKwkJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkJCSJmcmFtZSBkYXRhIHNpemUgMHgleFxuIiwKKwkJCQlody0+Y2h1bmstPnNpemUpOworCQkJZm9yIChqaiA9IDA7IGpqIDwgaHctPmNodW5rLT5zaXplOyBqaisrKSB7CisJCQkJaWYgKChqaiAmIDB4ZikgPT0gMCkKKwkJCQkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJCVBSSU5UX0ZSQU1FQkFTRV9EQVRBLAorCQkJCQkJIiUwNng6IiwgamopOworCQkJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLAorCQkJCVBSSU5UX0ZSQU1FQkFTRV9EQVRBLAorCQkJCQkiJTAyeCAiLCBkYXRhW2pqXSk7CisJCQkJaWYgKCgoamogKyAxKSAmIDB4ZikgPT0gMCkKKwkJCQkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJCVBSSU5UX0ZSQU1FQkFTRV9EQVRBLAorCQkJCQkJIlxuIik7CisJCQl9CisKKwkJCWlmICghaHctPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQkJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIoZGF0YSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0X3Byb2Nlc3NfdGltZShzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodykKK3sKKwlpZiAoaHctPnN0YXJ0X3Byb2Nlc3NfdGltZSkgeworCQl1bnNpZ25lZCBwcm9jZXNzX3RpbWUgPQorCQkJMTAwMCAqIChqaWZmaWVzIC0gaHctPnN0YXJ0X3Byb2Nlc3NfdGltZSkgLyBIWjsKKwkJaHctPnN0YXJ0X3Byb2Nlc3NfdGltZSA9IDA7CisJCWlmIChwcm9jZXNzX3RpbWUgPiBtYXhfcHJvY2Vzc190aW1lW0RFQ09ERV9JRChodyldKQorCQkJbWF4X3Byb2Nlc3NfdGltZVtERUNPREVfSUQoaHcpXSA9IHByb2Nlc3NfdGltZTsKKwl9Cit9CitzdGF0aWMgdm9pZCBzdGFydF9wcm9jZXNzX3RpbWUoc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqaHcpCit7CisJaHctPmRlY29kZV90aW1lb3V0X2NvdW50ID0gMjsKKwlody0+c3RhcnRfcHJvY2Vzc190aW1lID0gamlmZmllczsKK30KKworc3RhdGljIHZvaWQgdGltZW91dF9wcm9jZXNzKHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3KQoreworCWlmIChody0+c3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJYW12ZGVjX3N0b3AoKTsKKwkJaHctPnN0YXQgJj0gflNUQVRfVkRFQ19SVU47CisJfQorCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLAorCQkiJXMgZGVjb2RlciB0aW1lb3V0ICVkXG4iLCBfX2Z1bmNfXywgaHctPnRpbWVvdXRfY250KTsKKwlpZiAodmRlY19mcmFtZV9iYXNlZCgoaHdfdG9fdmRlYyhodykpKSkgeworCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSIlcyBmcmFtZV9udW0gJWQsIGNodW5rIHNpemUgMHgleCwgY2hrc3VtIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWh3LT5mcmFtZV9udW0sCisJCQlody0+Y2h1bmstPnNpemUsCisJCQlnZXRfZGF0YV9jaGVja19zdW0oaHcsIGh3LT5jaHVuay0+c2l6ZSkpOworCX0KKwlody0+dGltZW91dF9jbnQrKzsKKwkvKiB0aW1lb3V0OiBkYXRhIGRyb3BlZCwgZnJhbWVfbnVtIGluYWNjdXJhdGUqLworCWh3LT5mcmFtZV9udW0rKzsKKwlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCWh3LT5maXJzdF9pX2ZyYW1lX3JlYWR5ID0gMDsKKwlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKK30KKworCitzdGF0aWMgdm9pZCBjaGVja190aW1lcl9mdW5jKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKK3sKKwlzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodyA9IGNvbnRhaW5lcl9vZih0aW1lciwKKwkJc3RydWN0IHZkZWNfbXBlZzRfaHdfcywgY2hlY2tfdGltZXIpOworCXVuc2lnbmVkIGludCB0aW1lb3V0X3ZhbCA9IGRlY29kZV90aW1lb3V0X3ZhbDsKKworCWlmIChyYWRyICE9IDApIHsKKwkJaWYgKHJ2YWwgIT0gMCkgeworCQkJV1JJVEVfVlJFRyhyYWRyLCBydmFsKTsKKwkJCXByX2luZm8oIldSSVRFX1ZSRUcoJXgsJXgpXG4iLCByYWRyLCBydmFsKTsKKwkJfSBlbHNlCisJCQlwcl9pbmZvKCJSRUFEX1ZSRUcoJXgpPSV4XG4iLCByYWRyLCBSRUFEX1ZSRUcocmFkcikpOworCQlydmFsID0gMDsKKwkJcmFkciA9IDA7CisJfQorCisJaWYgKCgoZGVidWdfZW5hYmxlICYgUFJJTlRfRkxBR19USU1FT1VUX1NUQVRVUykgPT0gMCkgJiYKKwkJKHRpbWVvdXRfdmFsID4gMCkgJiYKKwkJKGh3LT5zdGFydF9wcm9jZXNzX3RpbWUgPiAwKSAmJgorCQkoKDEwMDAgKiAoamlmZmllcyAtIGh3LT5zdGFydF9wcm9jZXNzX3RpbWUpIC8gSFopCisJCQk+IHRpbWVvdXRfdmFsKSkgeworCQlpZiAoaHctPmxhc3RfdmxkX2xldmVsID09IFJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCkpIHsKKwkJCWlmIChody0+ZGVjb2RlX3RpbWVvdXRfY291bnQgPiAwKQorCQkJCWh3LT5kZWNvZGVfdGltZW91dF9jb3VudC0tOworCQkJaWYgKGh3LT5kZWNvZGVfdGltZW91dF9jb3VudCA9PSAwKQorCQkJCXRpbWVvdXRfcHJvY2Vzcyhodyk7CisJCX0KKwkJaHctPmxhc3RfdmxkX2xldmVsID0gUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX0xFVkVMKTsKKwl9CisKKwltb2RfdGltZXIoJmh3LT5jaGVja190aW1lciwgamlmZmllcyArIENIRUNLX0lOVEVSVkFMKTsKK30KKworc3RhdGljIGludCB2bXBlZzRfaHdfY3R4X3Jlc3RvcmUoc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqaHcpCit7CisJaW50IGluZGV4OworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqIHY0bDJfY3R4ID0gaHctPnY0bDJfY3R4OworCWludCBpOworCisJaWYgKCFody0+aW5pdF9mbGFnKQorCQl2bXBlZzRfd29ya3NwYWNlX2luaXQoaHcpOworCisJaWYgKGh3LT52NGxfcGFyYW1zX3BhcnNlZCkgeworCQlzdHJ1Y3QgdmRlY19waWNfaW5mbyBwaWM7CisKKwkJaWYgKCFody0+YnVmX251bSkgeworCQkJdmRlY192NGxfZ2V0X3BpY19pbmZvKHY0bDJfY3R4LCAmcGljKTsKKwkJCWh3LT5idWZfbnVtID0gcGljLmRwYl9mcmFtZXMgKworCQkJCXBpYy5kcGJfbWFyZ2luOworCQkJaWYgKGh3LT5idWZfbnVtID4gREVDT0RFX0JVRkZFUl9OVU1fTUFYKQorCQkJCWh3LT5idWZfbnVtID0gREVDT0RFX0JVRkZFUl9OVU1fTUFYOworCQl9CisKKwkJaW5kZXggPSBmaW5kX2ZyZWVfYnVmZmVyKGh3KTsKKwkJaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+PSBody0+YnVmX251bSkpCisJCQlyZXR1cm4gLTE7CisKKwkJV1JJVEVfVlJFRyhNRU1fT0ZGU0VUX1JFRywgaHctPmJ1Zl9zdGFydCk7CisKKwkJZm9yIChpID0gMDsgaSA8IGh3LT5idWZfbnVtOyBpKyspIHsKKwkJCWlmIChody0+cGljW2ldLnY0bF9yZWZfYnVmX2FkZHIpIHsKKwkJCQljb25maWdfY2F2X2x1dChjYW52YXNfeShody0+Y2FudmFzX3NwZWNbaV0pLAorCQkJCQkmaHctPmNhbnZhc19jb25maWdbaV1bMF0sIFZERUNfMSk7CisJCQkJY29uZmlnX2Nhdl9sdXQoY2FudmFzX3UoaHctPmNhbnZhc19zcGVjW2ldKSwKKwkJCQkJJmh3LT5jYW52YXNfY29uZmlnW2ldWzFdLCBWREVDXzEpOworCQkJfQorCQl9CisKKwkJLyogcHJlcGFyZSBSRUYwICYgUkVGMQorCQkgKiBwb2ludHMgdG8gdGhlIHBhc3QgdHdvIElQIGJ1ZmZlcnMKKwkJICogcHJlcGFyZSBSRUNfQ0FOVkFTX0FERFIgYW5kIEFOQzJfQ0FOVkFTX0FERFIKKwkJICogcG9pbnRzIHRvIHRoZSBvdXRwdXQgYnVmZmVyCisJCSAqLworCQlpZiAoaHctPnJlZnNbMF0gPT0gLTEpIHsKKwkJCVdSSVRFX1ZSRUcoTVJFR19SRUYwLCAoaHctPnJlZnNbMV0gPT0gLTEpID8gMHhmZmZmZmZmZiA6CisJCQkJCQlody0+Y2FudmFzX3NwZWNbaHctPnJlZnNbMV1dKTsKKwkJfSBlbHNlIHsKKwkJCVdSSVRFX1ZSRUcoTVJFR19SRUYwLCBody0+Y2FudmFzX3NwZWNbaHctPnJlZnNbMF1dKTsKKwkJfQorCQlXUklURV9WUkVHKE1SRUdfUkVGMSwgKGh3LT5yZWZzWzFdID09IC0xKSA/IDB4ZmZmZmZmZmYgOgorCQkJCQlody0+Y2FudmFzX3NwZWNbaHctPnJlZnNbMV1dKTsKKwkJaWYgKChody0+aXNfdXNlZF92NGwpICYmIChpbmRleCA9PSAweGZmZmZmZikpIHsKKwkJCVdSSVRFX1ZSRUcoUkVDX0NBTlZBU19BRERSLCAweGZmZmZmZik7CisJCQlXUklURV9WUkVHKEFOQzJfQ0FOVkFTX0FERFIsIDB4ZmZmZmZmKTsKKwkJfSBlbHNlIHsKKwkJCVdSSVRFX1ZSRUcoUkVDX0NBTlZBU19BRERSLCBody0+Y2FudmFzX3NwZWNbaW5kZXhdKTsKKwkJCVdSSVRFX1ZSRUcoQU5DMl9DQU5WQVNfQUREUiwgaHctPmNhbnZhc19zcGVjW2luZGV4XSk7CisJCX0KKworCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19SRVNUT1JFLAorCQkJInJlc3RvcmUgcmVmMD0weCV4LCByZWYxPTB4JXgsIHJlYz0weCV4LCBjdHhfdmFsaWQ9JWQsaW5kZXg9JWRcbiIsCisJCQlSRUFEX1ZSRUcoTVJFR19SRUYwKSwKKwkJCVJFQURfVlJFRyhNUkVHX1JFRjEpLAorCQkJUkVBRF9WUkVHKFJFQ19DQU5WQVNfQUREUiksCisJCQlody0+Y3R4X3ZhbGlkLCBpbmRleCk7CisJfQorCisJLyogZGlzYWJsZSBQU0NBTEUgZm9yIGhhcmR3YXJlIHNoYXJpbmcgKi8KKwlXUklURV9WUkVHKFBTQ0FMRV9DVFJMLCAwKTsKKworCVdSSVRFX1ZSRUcoTVJFR19CVUZGRVJPVVQsIDB4MTAwMDApOworCisJLyogY2xlYXIgbWFpbGJveCBpbnRlcnJ1cHQgKi8KKwlXUklURV9WUkVHKEFTU0lTVF9NQk9YMV9DTFJfUkVHLCAxKTsKKworCS8qIGVuYWJsZSBtYWlsYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoQVNTSVNUX01CT1gxX01BU0ssIDEpOworCisJLyogY2xlYXIgcmVwZWF0IGNvdW50ICovCisJV1JJVEVfVlJFRyhNUDRfTk9UX0NPREVEX0NOVCwgMCk7CisKKyNpZmRlZiBOVjIxCisJU0VUX1ZSRUdfTUFTSyhNREVDX1BJQ19EQ19DVFJMLCAxIDw8IDE3KTsKKyNlbmRpZgorCisJLyogY2Jjcl9tZXJnZV9zd2FwX2VuICovCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDcpIHsKKwkJaWYgKCh2NGwyX2N0eC0+cV9kYXRhW0FNTF9RX0RBVEFfRFNUXS5mbXQtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfTlYyMSkgfHwKKwkJCSh2NGwyX2N0eC0+cV9kYXRhW0FNTF9RX0RBVEFfRFNUXS5mbXQtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfTlYyMU0pKQorCQkJQ0xFQVJfVlJFR19NQVNLKE1ERUNfUElDX0RDX0NUUkwsIDEgPDwgMTYpOworCQllbHNlCisJCQlTRVRfVlJFR19NQVNLKE1ERUNfUElDX0RDX0NUUkwsIDEgPDwgMTYpOworCX0gZWxzZSB7CisJCWlmICgodjRsMl9jdHgtPnFfZGF0YVtBTUxfUV9EQVRBX0RTVF0uZm10LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX05WMjEpIHx8CisJCQkodjRsMl9jdHgtPnFfZGF0YVtBTUxfUV9EQVRBX0RTVF0uZm10LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX05WMjFNKSkKKwkJCVNFVF9WUkVHX01BU0soTURFQ19QSUNfRENfQ1RSTCwgMSA8PCAxNik7CisJCWVsc2UKKwkJCUNMRUFSX1ZSRUdfTUFTSyhNREVDX1BJQ19EQ19DVFJMLCAxIDw8IDE2KTsKKwl9CisKKyNpZiAxLyogL01FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09OOCAqLworCVdSSVRFX1ZSRUcoTURFQ19QSUNfRENfVEhSRVNILCAweDQwNDAzOGFhKTsKKyNlbmRpZgorCisJV1JJVEVfVlJFRyhNUDRfUElDX1dILCAoaHctPmN0eF92YWxpZCkgPworCQlody0+cmVnX21wNF9waWNfd2ggOgorCQkoKGh3LT5mcmFtZV93aWR0aCA8PCAxNikgfCBody0+ZnJhbWVfaGVpZ2h0KSk7CisJV1JJVEVfVlJFRyhNUDRfU1lTX1JBVEUsIGh3LT52bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSk7CisKKwlpZiAoaHctPmN0eF92YWxpZCkgeworCQlXUklURV9WUkVHKERDX0FDX0NUUkwsIGh3LT5yZWdfZGNfYWNfY3RybCk7CisJCVdSSVRFX1ZSRUcoSVFJRENUX0NPTlRST0wsIGh3LT5yZWdfaXFpZGN0X2NvbnRyb2wpOworCQlXUklURV9WUkVHKFJFU1lOQ19NQVJLRVJfTEVOR1RILCBody0+cmVnX3Jlc3luY19tYXJrZXJfbGVuZ3RoKTsKKwkJV1JJVEVfVlJFRyhSVl9BSV9NQl9DT1VOVCwgaHctPnJlZ19ydl9haV9tYl9jb3VudCk7CisJfQorCVdSSVRFX1ZSRUcoTVBFRzFfMl9SRUcsIChody0+Y3R4X3ZhbGlkKSA/IGh3LT5yZWdfbXBlZzFfMl9yZWcgOiAxKTsKKwlXUklURV9WUkVHKFZDT1BfQ1RSTF9SRUcsIGh3LT5yZWdfdmNvcF9jdHJsX3JlZyk7CisJV1JJVEVfVlJFRyhQSUNfSEVBRF9JTkZPLCBody0+cmVnX3BpY19oZWFkX2luZm8pOworCVdSSVRFX1ZSRUcoU0xJQ0VfUVAsIGh3LT5yZWdfc2xpY2VfcXApOworCVdSSVRFX1ZSRUcoTUJfSU5GTywgaHctPnJlZ19tYl9pbmZvKTsKKworCWlmICh2ZGVjX2ZyYW1lX2Jhc2VkKGh3X3RvX3ZkZWMoaHcpKSAmJiBody0+Y2h1bmspIHsKKwkJLyogZnJhbWUgYmFzZWQgaW5wdXQgKi8KKwkJV1JJVEVfVlJFRyhNUkVHX0lOUFVULCAoaHctPmNodW5rLT5vZmZzZXQgJiA3KSB8ICgxPDw3KSB8CisJCQkJCQkJKGh3LT5jdHhfdmFsaWQ8PDYpKTsKKwl9IGVsc2UgeworCQkvKiBzdHJlYW0gYmFzZWQgaW5wdXQgKi8KKwkJV1JJVEVfVlJFRyhNUkVHX0lOUFVULCAoaHctPmN0eF92YWxpZDw8NikpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2bXBlZzRfbG9jYWxfaW5pdChzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodykKK3sKKwlpbnQgaTsKKworCWh3LT52bXBlZzRfcmF0aW8gPSBody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGlvOworCisJaHctPnZtcGVnNF9yYXRpbzY0ID0gaHctPnZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5yYXRpbzY0OworCisJaHctPnZtcGVnNF9yb3RhdGlvbiA9CisJCSgoKHVuc2lnbmVkIGxvbmcpaHctPnZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5wYXJhbSkgPj4gMTYpICYgMHhmZmZmOworCWh3LT5zeXNfbXA0X3JhdGUgPSBody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGU7CisJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQlody0+ZnJhbWVfd2lkdGggPSAwOworCQlody0+ZnJhbWVfaGVpZ2h0ID0gMDsKKwl9IGVsc2UgeworCQlody0+ZnJhbWVfd2lkdGggPSBody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoOworCQlody0+ZnJhbWVfaGVpZ2h0ID0gaHctPnZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQ7CisJfQorCisJaHctPmZyYW1lX2R1ciA9IDA7CisJaHctPmZyYW1lX3Byb2cgPSAwOworCWh3LT51bnN0YWJsZV9wdHMgPQorCSAgICgoKHVuc2lnbmVkIGxvbmcpIGh3LT52bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8ucGFyYW0gJiAweDQwKSA+PiA2KTsKKwltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJInBhcmFtID0gMHgleCB1bnN0YWJsZV9wdHMgPSAlZFxuIiwKKwkJaHctPnZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5wYXJhbSwKKwkJaHctPnVuc3RhYmxlX3B0cyk7CisJaHctPmxhc3RfZGVjX3B0cyA9IC0xOworCisJaHctPnRvdGFsX2ZyYW1lID0gMDsKKworCWh3LT5sYXN0X2FuY2hfcHRzID0gMDsKKworCWh3LT5sYXN0X2FuY2hfcHRzX3VzNjQgPSAwOworCisJaHctPmxhc3Rfdm9wX3RpbWVfaW5jID0gaHctPmxhc3RfZHVyYXRpb24gPSAwOworCisJaHctPnZvcF90aW1lX2luY19zaW5jZV9sYXN0X2FuY2ggPSAwOworCWh3LT5sYXN0X3B0cyA9IDA7CisJaHctPmxhc3RfcHRzNjQgPSAwOworCWh3LT5mcmFtZV9udW1fc2luY2VfbGFzdF9hbmNoID0gMDsKKwlody0+ZnJhbWVfbnVtID0gMDsKKwlody0+cnVuX2NvdW50ID0gMDsKKwlody0+bm90X3J1bl9yZWFkeSA9IDA7CisJaHctPmlucHV0X2VtcHR5ID0gMDsKKwlhdG9taWNfc2V0KCZody0+cGVla19udW0sIDApOworCWF0b21pY19zZXQoJmh3LT5nZXRfbnVtLCAwKTsKKwlhdG9taWNfc2V0KCZody0+cHV0X251bSwgMCk7CisKKwlody0+cHRzX2hpdCA9IGh3LT5wdHNfbWlzc2VkID0gaHctPnB0c19pX2hpdCA9IGh3LT5wdHNfaV9taXNzZWQgPSAwOworCWh3LT5yZWZzWzBdID0gLTE7CisJaHctPnJlZnNbMV0gPSAtMTsKKwlody0+Zmlyc3RfaV9mcmFtZV9yZWFkeSA9IDA7CisJaHctPmRyb3BfZnJhbWVfY291bnQgPSAwOworCWh3LT5idWZmZXJfbm90X3JlYWR5ID0gMDsKKwlody0+aW5pdF9mbGFnID0gMDsKKwlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfTk9ORTsKKwlody0+dGltZW91dF9jbnQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IERFQ09ERV9CVUZGRVJfTlVNX01BWDsgaSsrKQorCQlody0+dmZidWZfdXNlW2ldID0gMDsKKworCUlOSVRfS0ZJRk8oaHctPmRpc3BsYXlfcSk7CisJSU5JVF9LRklGTyhody0+bmV3ZnJhbWVfcSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVkZfUE9PTF9TSVpFOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IHZmcmFtZV9zICp2ZiA9ICZody0+dmZwb29sW2ldOworCisJCWh3LT52ZnBvb2xbaV0uaW5kZXggPSBERUNPREVfQlVGRkVSX05VTV9NQVg7CisJCWtmaWZvX3B1dCgmaHctPm5ld2ZyYW1lX3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJfQorCWlmIChody0+bW1fYmxrX2hhbmRsZSkgeworCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWUoaHctPm1tX2Jsa19oYW5kbGUpOworCQlody0+bW1fYmxrX2hhbmRsZSA9IE5VTEw7CisJfQorCWh3LT5tbV9ibGtfaGFuZGxlID0gZGVjb2Rlcl9ibW11X2JveF9hbGxvY19ib3goCisJCQlEUklWRVJfTkFNRSwKKwkJCTAsCisJCQlNQVhfQk1NVV9CVUZGRVJfTlVNLAorCQkJNCArIFBBR0VfU0hJRlQsCisJCQlDT0RFQ19NTV9GTEFHU19DTUFfQ0xFQVIgfAorCQkJQ09ERUNfTU1fRkxBR1NfRk9SX1ZERUNPREVSKTsKKworCUlOSVRfV09SSygmaHctPndvcmssIHZtcGVnNF93b3JrKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmh3LT53YWl0X3EpOworfQorCitzdGF0aWMgczMyIHZtbXBlZzRfaW5pdChzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodykKK3sKKwlpbnQgdHJpY2ttb2RlX2ZmZmIgPSAwOworCWludCBzaXplID0gLTEsIGZ3X3NpemUgPSAweDEwMDAgKiAxNjsKKwlzdHJ1Y3QgZmlybXdhcmVfcyAqZncgPSBOVUxMOworCisJZncgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgZmlybXdhcmVfcykgKyBmd19zaXplKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZncpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLmZvcm1hdCA9PQorCQkJVklERU9fREVDX0ZPUk1BVF9NUEVHNF81KSB7CisJCXNpemUgPSBnZXRfZmlybXdhcmVfZGF0YShWSURFT19ERUNfTVBFRzRfNV9NVUxUSSwgZnctPmRhdGEpOworCQlzdHJuY3B5KGZ3LT5uYW1lLCAibW1wZWc0X21jXzUiLCBzaXplb2YoZnctPm5hbWUpKTsKKwl9IGVsc2UgaWYgKGh3LT52bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8uZm9ybWF0ID09CisJCQlWSURFT19ERUNfRk9STUFUX0gyNjMpIHsKKwkJc2l6ZSA9IGdldF9maXJtd2FyZV9kYXRhKFZJREVPX0RFQ19IMjYzX01VTFRJLCBmdy0+ZGF0YSk7CisJCXN0cm5jcHkoZnctPm5hbWUsICJtaDI2M19tYyIsIHNpemVvZihmdy0+bmFtZSkpOworCX0gZWxzZQorCQlwcl9lcnIoInVuc3VwcG9ydCBtcGVnNCBzdWIgZm9ybWF0ICVkXG4iLAorCQkJCWh3LT52bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8uZm9ybWF0KTsKKwlwcl9pbmZvKCJtbXBlZzQgZ2V0IGZ3ICVzLCBzaXplICV4XG4iLCBmdy0+bmFtZSwgc2l6ZSk7CisJaWYgKHNpemUgPCAwKSB7CisJCXByX2VycigiZ2V0IGZpcm13YXJlIGZhaWxlZC4iKTsKKwkJdmZyZWUoZncpOworCQlyZXR1cm4gLTE7CisJfQorCisJZnctPmxlbiA9IHNpemU7CisJaHctPmZ3ID0gZnc7CisKKwlxdWVyeV92aWRlb19zdGF0dXMoMCwgJnRyaWNrbW9kZV9mZmZiKTsKKworCXByX2luZm8oIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwkvL2FtdmRlY19lbmFibGUoKTsKKworCXRpbWVyX3NldHVwKCZody0+Y2hlY2tfdGltZXIsIGNoZWNrX3RpbWVyX2Z1bmMsIDApOworCS8vaW5pdF90aW1lcigmaHctPmNoZWNrX3RpbWVyKTsKKwkvL2h3LT5jaGVja190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaHc7CisJLy9ody0+Y2hlY2tfdGltZXIuZnVuY3Rpb24gPSBjaGVja190aW1lcl9mdW5jOworCWh3LT5jaGVja190aW1lci5leHBpcmVzID0gamlmZmllcyArIENIRUNLX0lOVEVSVkFMOworCWh3LT5zdGF0IHw9IFNUQVRfVElNRVJfQVJNOworCWh3LT5lb3MgPSAwOworCVdSSVRFX1ZSRUcoREVDT0RFX1NUT1BfUE9TLCB1ZGVidWdfZmxhZyk7CisKKwl2bXBlZzRfbG9jYWxfaW5pdChodyk7CisJd21iKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2wgaXNfYXZhbGlhYmxlX2J1ZmZlcihzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodykKK3sKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KTsKKwlpbnQgaSwgZnJlZV9jb3VudCA9IDA7CisJaW50IHVzZWRfY291bnQgPSAwOworCisJaWYgKChody0+YnVmX251bSA9PSAwKSB8fAorCQkoY3R4LT5jYXBfcG9vbC5kZWMgPCBody0+YnVmX251bSkpIHsKKwkJaWYgKGN0eC0+ZmJfb3BzLnF1ZXJ5KCZjdHgtPmZiX29wcywgJmh3LT5mYl90b2tlbikpIHsKKwkJCWZyZWVfY291bnQgPQorCQkJCXY0bDJfbTJtX251bV9kc3RfYnVmc19yZWFkeShjdHgtPm0ybV9jdHgpICsgMTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBody0+YnVmX251bTsgKytpKSB7CisJCWlmICgoaHctPnZmYnVmX3VzZVtpXSA9PSAwKSAmJgorCQkJaHctPnBpY1tpXS52NGxfcmVmX2J1Zl9hZGRyKSB7CisJCQlmcmVlX2NvdW50Kys7CisJCX0gZWxzZSBpZiAoaHctPnBpY1tpXS52NGxfcmVmX2J1Zl9hZGRyKQorCQkJdXNlZF9jb3VudCsrOworCX0KKworCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy1mcmVlX2J1ZmZfY291bnQiLCBmcmVlX2NvdW50KTsKKwlBVFJBQ0VfQ09VTlRFUigiVl9TVF9ERUMtdXNlZF9idWZmX2NvdW50IiwgdXNlZF9jb3VudCk7CisKKwlyZXR1cm4gZnJlZV9jb3VudCA+PSBydW5fcmVhZHlfbWluX2J1Zl9udW0gPyAxIDogMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcnVuX3JlYWR5KHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodyA9CisJCShzdHJ1Y3QgdmRlY19tcGVnNF9od19zICopdmRlYy0+cHJpdmF0ZTsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChody0+ZW9zKQorCQlyZXR1cm4gMDsKKworCWlmICh2ZGVjX3N0cmVhbV9iYXNlZCh2ZGVjKSAmJiAoaHctPmluaXRfZmxhZyA9PSAwKQorCQkmJiBwcmVfZGVjb2RlX2J1Zl9sZXZlbCAhPSAwKSB7CisJCXUzMiBycCwgd3AsIGxldmVsOworCisJCXJwID0gU1RCVUZfUkVBRCgmdmRlYy0+dmJ1ZiwgZ2V0X3JwKTsKKwkJd3AgPSBTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApOworCQlpZiAod3AgPCBycCkKKwkJCWxldmVsID0gdmRlYy0+aW5wdXQuc2l6ZSArIHdwIC0gcnA7CisJCWVsc2UKKwkJCWxldmVsID0gd3AgLSBycDsKKwkJaWYgKGxldmVsIDwgcHJlX2RlY29kZV9idWZfbGV2ZWwpIHsKKwkJCWh3LT5ub3RfcnVuX3JlYWR5Kys7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmIChody0+djRsX3BhcmFtc19wYXJzZWQpIHsKKwkJcmV0ID0gaXNfYXZhbGlhYmxlX2J1ZmZlcihodykgPyAxIDogMDsKKwl9IGVsc2UgeworCQlyZXQgPSBjdHgtPnY0bF9yZXNvbHV0aW9uX2NoYW5nZSA/IDAgOiAxOworCX0KKworCWh3LT5ub3RfcnVuX3JlYWR5ID0gMDsKKwlody0+YnVmZmVyX25vdF9yZWFkeSA9IDA7CisKKwlyZXR1cm4gcmV0ID8gQ09SRV9NQVNLX1ZERUNfMSA6IDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGdldF9kYXRhX2NoZWNrX3N1bQorCShzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodywgaW50IHNpemUpCit7CisJaW50IGpqOworCWludCBzdW0gPSAwOworCXU4ICpkYXRhID0gTlVMTDsKKworCWlmICghaHctPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQlkYXRhID0gY29kZWNfbW1fdm1hcChody0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQlody0+Y2h1bmstPm9mZnNldCwgc2l6ZSk7CisJZWxzZQorCQlkYXRhID0gKCh1OCAqKWh3LT5jaHVuay0+YmxvY2stPnN0YXJ0X3ZpcnQpICsKKwkJCWh3LT5jaHVuay0+b2Zmc2V0OworCisJZm9yIChqaiA9IDA7IGpqIDwgc2l6ZTsgamorKykKKwkJc3VtICs9IGRhdGFbampdOworCisJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIoZGF0YSk7CisJcmV0dXJuIHN1bTsKK30KKworc3RhdGljIHZvaWQgcnVuKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHVuc2lnbmVkIGxvbmcgbWFzaywKKwkJdm9pZCAoKmNhbGxiYWNrKShzdHJ1Y3QgdmRlY19zICosIHZvaWQgKiksIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodyA9IChzdHJ1Y3QgdmRlY19tcGVnNF9od19zICopdmRlYy0+cHJpdmF0ZTsKKwlpbnQgc2l6ZSA9IDAsIHJldCA9IDA7CisJaWYgKCFody0+dmRlY19wZ19lbmFibGVfZmxhZykgeworCQlody0+dmRlY19wZ19lbmFibGVfZmxhZyA9IDE7CisJCWFtdmRlY19lbmFibGUoKTsKKwl9CisJaHctPnJ1bl9jb3VudCsrOworCWh3LT52ZGVjX2NiX2FyZyA9IGFyZzsKKwlody0+dmRlY19jYiA9IGNhbGxiYWNrOworCXZkZWNfcmVzZXRfY29yZSh2ZGVjKTsKKworCWlmICgodmRlY19mcmFtZV9iYXNlZCh2ZGVjKSkgJiYKKwkJKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfVU5GSU5JU0gpKSB7CisJCXZtcGVnNF9wcmVwYXJlX2lucHV0KGh3KTsKKwkJc2l6ZSA9IGh3LT5jaHVua19zaXplOworCX0gZWxzZSB7CisJCXNpemUgPSB2ZGVjX3ByZXBhcmVfaW5wdXQodmRlYywgJmh3LT5jaHVuayk7CisJCWlmIChzaXplIDwgNCkgeyAvKmxlc3MgdGhhbiBzdGFydCBjb2RlIHNpemUgMDAgMDAgMDEgeHgqLworCQkJaHctPmlucHV0X2VtcHR5Kys7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRVJST1JfU1pJRTsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJcmV0dXJuOworCQl9CisJCWlmICgodmRlY19mcmFtZV9iYXNlZCh2ZGVjKSkgJiYKKwkJCShody0+Y2h1bmsgIT0gTlVMTCkpIHsKKwkJCWh3LT5jaHVua19vZmZzZXQgPSBody0+Y2h1bmstPm9mZnNldDsKKwkJCWh3LT5jaHVua19zaXplID0gaHctPmNodW5rLT5zaXplOworCQkJaHctPmNodW5rX2ZyYW1lX2NvdW50ID0gMDsKKwkJfQorCX0KKworCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy1jaHVua19zaXplIiwgc2l6ZSk7CisKKwlpZiAodmRlY19mcmFtZV9iYXNlZCh2ZGVjKSAmJiAhdmRlY19zZWN1cmUodmRlYykpIHsKKwkJLyogSFcgbmVlZHMgcGFkZGluZyAoTkFMIHN0YXJ0KSBmb3IgZnJhbWUgZW5kaW5nICovCisJCWNoYXIqIHRhaWwgPSAoY2hhciAqKWh3LT5jaHVuay0+YmxvY2stPnN0YXJ0X3ZpcnQ7CisKKwkJdGFpbCArPSBody0+Y2h1bmstPm9mZnNldCArIGh3LT5jaHVuay0+c2l6ZTsKKwkJdGFpbFswXSA9IDA7CisJCXRhaWxbMV0gPSAwOworCQl0YWlsWzJdID0gMTsKKwkJdGFpbFszXSA9IDB4YjY7CisJCWNvZGVjX21tX2RtYV9mbHVzaCh0YWlsLCA0LCBETUFfVE9fREVWSUNFKTsKKwl9CisJaWYgKHZkZWNfZnJhbWVfYmFzZWQodmRlYykgJiYKKwkJKGRlYnVnX2VuYWJsZSAmIDB4YzAwKSkgeworCQl1OCAqZGF0YSA9IE5VTEw7CisKKwkJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQlkYXRhID0gY29kZWNfbW1fdm1hcChody0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQkJaHctPmNodW5rX29mZnNldCwgc2l6ZSk7CisJCWVsc2UKKwkJCWRhdGEgPSAoKHU4ICopaHctPmNodW5rLT5ibG9jay0+c3RhcnRfdmlydCkgKworCQkJCWh3LT5jaHVua19vZmZzZXQ7CisKKwkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkiJXM6IHNpemUgMHgleCBzdW0gMHgleCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAuLiAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJX19mdW5jX18sIHNpemUsIGdldF9kYXRhX2NoZWNrX3N1bShodywgc2l6ZSksCisJCQlkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdLCBkYXRhWzNdLAorCQkJZGF0YVs0XSwgZGF0YVs1XSwgZGF0YVtzaXplIC0gNF0sCisJCQlkYXRhW3NpemUgLSAzXSwJZGF0YVtzaXplIC0gMl0sCisJCQlkYXRhW3NpemUgLSAxXSk7CisKKwkJaWYgKGRlYnVnX2VuYWJsZSAmIFBSSU5UX0ZSQU1FQkFTRV9EQVRBKSB7CisJCQlpbnQgamo7CisKKwkJCWZvciAoamogPSAwOyBqaiA8IHNpemU7IGpqKyspIHsKKwkJCQlpZiAoKGpqICYgMHhmKSA9PSAwKQorCQkJCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCQkJUFJJTlRfRlJBTUVCQVNFX0RBVEEsCisJCQkJCQkiJTA2eDoiLCBqaik7CisJCQkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksCisJCQkJUFJJTlRfRlJBTUVCQVNFX0RBVEEsCisJCQkJCSIlMDJ4ICIsIGRhdGFbampdKTsKKwkJCQlpZiAoKChqaiArIDEpICYgMHhmKSA9PSAwKQorCQkJCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwKKwkJCQkJUFJJTlRfRlJBTUVCQVNFX0RBVEEsCisJCQkJCQkiXG4iKTsKKwkJCX0KKwkJfQorCisJCWlmICghaHctPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcihkYXRhKTsKKwl9CisKKwltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgUFJJTlRfRkxBR19SVU5fRkxPVywKKwkJIiVzLCBzaXplPSVkLCAleCAleCAleCAleCAleFxuIiwKKwkJX19mdW5jX18sIHNpemUsCisJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19MRVZFTCksCisJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19XUCksCisJCVJFQURfVlJFRyhWTERfTUVNX1ZJRklGT19SUCksCisJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF9ycCksCisJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCkpOworCisJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX05PTkU7CisJaWYgKHZkZWMtPm1jX2xvYWRlZCkgeworCS8qZmlybXdhcmUgaGF2ZSBsb2FkIGJlZm9yZSwKKwkgIGFuZCBub3QgY2hhbmdlcyB0byBhbm90aGVyLgorCSAgaWdub3JlIHJlbG9hZC4KKwkqLworCX0gZWxzZSB7CisJCXJldCA9IGFtdmRlY192ZGVjX2xvYWRtY19idWZfZXgoVkZPUk1BVF9NUEVHNCxody0+ZnctPm5hbWUsIHZkZWMsCisJCQlody0+ZnctPmRhdGEsIGh3LT5mdy0+bGVuKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiWyVkXSAlczogdGhlICVzIGZ3IGxvYWRpbmcgZmFpbGVkLCBlcnI6ICV4XG4iLCB2ZGVjLT5pZCwKKwkJCQlody0+ZnctPm5hbWUsIHRlZV9lbmFibGVkKCkgPyAiVEVFIiA6ICJsb2NhbCIsIHJldCk7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRk9SQ0VfRVhJVDsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJcmV0dXJuOworCQl9CisJCXZkZWMtPm1jX2xvYWRlZCA9IDE7CisJCXZkZWMtPm1jX3R5cGUgPSBWRk9STUFUX01QRUc0OworCX0KKwlpZiAodm1wZWc0X2h3X2N0eF9yZXN0b3JlKGh3KSA8IDApIHsKKwkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0VSUk9SOworCQltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwKKwkJCSJhbXZkZWNfbXBlZzQ6IGVycm9yIEhXIGNvbnRleHQgcmVzdG9yZVxuIik7CisJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQlyZXR1cm47CisJfQorCWlmICh2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpKSB7CisJCXNpemUgPSBody0+Y2h1bmtfc2l6ZSArCisJCQkoaHctPmNodW5rX29mZnNldCAmIChWREVDX0ZJRk9fQUxJR04gLSAxKSk7CisJCVdSSVRFX1ZSRUcoVklGRl9CSVRfQ05ULCBzaXplICogOCk7CisJCWlmICh2ZGVjLT5tdmZybSkKKwkJCXZkZWMtPm12ZnJtLT5mcmFtZV9zaXplID0gaHctPmNodW5rLT5zaXplOworCX0KKwlody0+aW5wdXRfZW1wdHkgPSAwOworCWh3LT5sYXN0X3ZsZF9sZXZlbCA9IDA7CisJc3RhcnRfcHJvY2Vzc190aW1lKGh3KTsKKwl2ZGVjX2VuYWJsZV9pbnB1dCh2ZGVjKTsKKwkvKiB3bWIgYmVmb3JlIElTUiBpcyBoYW5kbGVkICovCisJd21iKCk7CisKKwlpZiAodmRlYy0+bXZmcm0pCisJCXZkZWMtPm12ZnJtLT5od19kZWNvZGVfc3RhcnQgPSBsb2NhbF9jbG9jaygpOworCWFtdmRlY19zdGFydCgpOworCWh3LT5zdGF0IHw9IFNUQVRfVkRFQ19SVU47CisJaHctPnN0YXQgfD0gU1RBVF9USU1FUl9BUk07CisJaHctPmluaXRfZmxhZyA9IDE7CisJbW9kX3RpbWVyKCZody0+Y2hlY2tfdGltZXIsIGppZmZpZXMgKyBDSEVDS19JTlRFUlZBTCk7Cit9CisKK3N0YXRpYyBpbnQgdm1wZWc0X3N0b3Aoc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqaHcpCit7CisJY2FuY2VsX3dvcmtfc3luYygmaHctPndvcmspOworCisJaWYgKGh3LT5tbV9ibGtfaGFuZGxlKSB7CisJCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWUoaHctPm1tX2Jsa19oYW5kbGUpOworCQkJaHctPm1tX2Jsa19oYW5kbGUgPSBOVUxMOworCX0KKworCWlmIChody0+c3RhdCAmIFNUQVRfVElNRVJfQVJNKSB7CisJCWRlbF90aW1lcl9zeW5jKCZody0+Y2hlY2tfdGltZXIpOworCQlody0+c3RhdCAmPSB+U1RBVF9USU1FUl9BUk07CisJfQorCisJaWYgKGh3LT5mdykgeworCQl2ZnJlZShody0+ZncpOworCQlody0+ZncgPSBOVUxMOworCX0KKwlyZXR1cm4gMDsKK30KK3N0YXRpYyB2b2lkIHJlc2V0KHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqaHcgPQorCQkoc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJaW50IGk7CisKKwlpZiAoaHctPnN0YXQgJiBTVEFUX1ZERUNfUlVOKSB7CisJCWFtdmRlY19zdG9wKCk7CisJCWh3LT5zdGF0ICY9IH5TVEFUX1ZERUNfUlVOOworCX0KKworCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9OT05FOworCWZsdXNoX3dvcmsoJmh3LT53b3JrKTsKKwlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCisJZm9yIChpID0gMDsgaSA8IGh3LT5idWZfbnVtOyBpKyspIHsKKwkJaHctPnBpY1tpXS52NGxfcmVmX2J1Zl9hZGRyID0gMDsKKwkJaHctPnZmYnVmX3VzZVtpXSA9IDA7CisJfQorCisJSU5JVF9LRklGTyhody0+ZGlzcGxheV9xKTsKKwlJTklUX0tGSUZPKGh3LT5uZXdmcmFtZV9xKTsKKworCWZvciAoaSA9IDA7IGkgPCBWRl9QT09MX1NJWkU7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKnZmID0gJmh3LT52ZnBvb2xbaV07CisKKwkJbWVtc2V0KCh2b2lkICopdmYsIDAsIHNpemVvZigqdmYpKTsKKwkJaHctPnZmcG9vbFtpXS5pbmRleCA9IC0xOworCQlrZmlmb19wdXQoJmh3LT5uZXdmcmFtZV9xLCB2Zik7CisJfQorCisJZm9yIChpID0gMDsgaSA8IERFQ09ERV9CVUZGRVJfTlVNX01BWDsgaSsrKSB7CisJCXZkZWMtPmZyZWVfY2FudmFzX2V4KGNhbnZhc195KGh3LT5jYW52YXNfc3BlY1tpXSksIHZkZWMtPmlkKTsKKwkJdmRlYy0+ZnJlZV9jYW52YXNfZXgoY2FudmFzX3UoaHctPmNhbnZhc19zcGVjW2ldKSwgdmRlYy0+aWQpOworCQlody0+Y2FudmFzX3NwZWNbaV0gPSAweGZmZmZmZjsKKwl9CisKKwlody0+cmVmc1swXQkJPSAtMTsKKwlody0+cmVmc1sxXQkJPSAtMTsKKwlody0+Y3R4X3ZhbGlkCQk9IDA7CisJaHctPmVvcwkJCT0gMDsKKwlody0+YnVmX251bQkJPSAwOworCWh3LT5mcmFtZV93aWR0aAkJPSAwOworCWh3LT5mcmFtZV9oZWlnaHQJPSAwOworCWh3LT5maXJzdF9pX2ZyYW1lX3JlYWR5ID0gMDsKKworCWF0b21pY19zZXQoJmh3LT5wZWVrX251bSwgMCk7CisJYXRvbWljX3NldCgmaHctPmdldF9udW0sIDApOworCWF0b21pY19zZXQoJmh3LT5wdXRfbnVtLCAwKTsKKworCXByX2luZm8oIm1wZWc0OiByZXNldC5cbiIpOworfQorCitzdGF0aWMgaW50IHZtcGVnNF9zZXRfdHJpY2ttb2RlKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHVuc2lnbmVkIGxvbmcgdHJpY2ttb2RlKQoreworCXN0cnVjdCB2ZGVjX21wZWc0X2h3X3MgKmh3ID0KKwkoc3RydWN0IHZkZWNfbXBlZzRfaHdfcyAqKXZkZWMtPnByaXZhdGU7CisJaWYgKCFodykKKwkJcmV0dXJuIDA7CisKKwlpZiAodHJpY2ttb2RlID09IFRSSUNLTU9ERV9JKSB7CisJCWh3LT5pX29ubHkgPSAweDM7CisJCXRyaWNrbW9kZV9pID0gMTsKKwl9IGVsc2UgaWYgKHRyaWNrbW9kZSA9PSBUUklDS01PREVfTk9ORSkgeworCQlody0+aV9vbmx5ID0gMHgwOworCQl0cmlja21vZGVfaSA9IDA7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtbXZkZWNfbXBlZzRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdmRlY19zICpwZGF0YSA9ICooc3RydWN0IHZkZWNfcyAqKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodyA9IE5VTEw7CisJaW50IGNvbmZpZ192YWwgPSAwOworCisJaWYgKHBkYXRhID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlcyBtZW1vcnkgcmVzb3VyY2UgdW5kZWZpbmVkLlxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlodyA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZGVjX21wZWc0X2h3X3MpKTsKKwlpZiAoaHcgPT0gTlVMTCkgeworCQlwcl9lcnIoIlxuYW12ZGVjX21wZWc0IGRlY29kZXIgZHJpdmVyIGFsbG9jIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoaHcsIDAsIHNpemVvZihzdHJ1Y3QgdmRlY19tcGVnNF9od19zKSk7CisKKwkvKiB0aGUgY3R4IGZyb20gdjRsMiBkcml2ZXIuICovCisJaHctPnY0bDJfY3R4ID0gcGRhdGEtPnByaXZhdGU7CisKKwlwZGF0YS0+cHJpdmF0ZSA9IGh3OworCXBkYXRhLT5kZWNfc3RhdHVzID0gZGVjX3N0YXR1czsKKwkvKiBwZGF0YS0+c2V0X3RyaWNrbW9kZSA9IHNldF90cmlja21vZGU7ICovCisJcGRhdGEtPnNldF90cmlja21vZGUgPSB2bXBlZzRfc2V0X3RyaWNrbW9kZTsKKwlwZGF0YS0+cnVuX3JlYWR5ID0gcnVuX3JlYWR5OworCXBkYXRhLT5ydW4gPSBydW47CisJcGRhdGEtPnJlc2V0ID0gcmVzZXQ7CisJcGRhdGEtPmlycV9oYW5kbGVyID0gdm1wZWc0X2lzcjsKKwlwZGF0YS0+dGhyZWFkZWRfaXJxX2hhbmRsZXIgPSB2bXBlZzRfaXNyX3RocmVhZF9mbjsKKwlwZGF0YS0+ZHVtcF9zdGF0ZSA9IHZtcGVnNF9kdW1wX3N0YXRlOworCisJc25wcmludGYoaHctPnZkZWNfbmFtZSwgc2l6ZW9mKGh3LT52ZGVjX25hbWUpLAorCQkibXBlZzQtJWQiLCBwZGV2LT5pZCk7CisJc25wcmludGYoaHctPnB0c19uYW1lLCBzaXplb2YoaHctPnB0c19uYW1lKSwKKwkJIiVzLXRpbWVzdGFtcCIsIGh3LT52ZGVjX25hbWUpOworCXNucHJpbnRmKGh3LT5uZXdfcV9uYW1lLCBzaXplb2YoaHctPm5ld19xX25hbWUpLAorCQkiJXMtbmV3ZnJhbWVfcSIsIGh3LT52ZGVjX25hbWUpOworCXNucHJpbnRmKGh3LT5kaXNwX3FfbmFtZSwgc2l6ZW9mKGh3LT5kaXNwX3FfbmFtZSksCisJCSIlcy1kaXNwZnJhbWVfcSIsIGh3LT52ZGVjX25hbWUpOworCisJaWYgKHBkYXRhLT51c2VfdmZtX3BhdGgpCisJCXNucHJpbnRmKHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lLCBWREVDX1BST1ZJREVSX05BTUVfU0laRSwKKwkJCVZGTV9ERUNfUFJPVklERVJfTkFNRSk7CisJZWxzZQorCQlzbnByaW50ZihwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwgVkRFQ19QUk9WSURFUl9OQU1FX1NJWkUsCisJCQlQUk9WSURFUl9OQU1FICIuJTAyeCIsIHBkZXYtPmlkICYgMHhmZik7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwZGF0YSk7CisJaHctPnBsYXRmb3JtX2RldiA9IHBkZXY7CisKKwlpZiAoKChkZWJ1Z19lbmFibGUgJiBJR05PUkVfUEFSQU1fRlJPTV9DT05GSUcpID09IDApICYmIHBkYXRhLT5jb25maWdfbGVuKSB7CisJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCAwLCAicGRhdGEtPmNvbmZpZzogJXNcbiIsIHBkYXRhLT5jb25maWcpOworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgInBhcm1fdjRsX2J1ZmZlcl9tYXJnaW4iLAorCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+ZHluYW1pY19idWZfbnVtX21hcmdpbiA9IGNvbmZpZ192YWw7CisJCWVsc2UKKwkJCWh3LT5keW5hbWljX2J1Zl9udW1fbWFyZ2luID0gZHluYW1pY19idWZfbnVtX21hcmdpbjsKKwl9IGVsc2UgeworCQlody0+ZHluYW1pY19idWZfbnVtX21hcmdpbiA9IGR5bmFtaWNfYnVmX251bV9tYXJnaW47CisJfQorCisJaWYgKHBkYXRhLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IERFQ09ERV9CVUZGRVJfTlVNX01BWDsgaSsrKQorCQkJaHctPmNhbnZhc19zcGVjW2ldID0gMHhmZmZmZmY7CisJfQorCisJaHctPmJsa21vZGUgPSBwZGF0YS0+Y2FudmFzX21vZGU7CisKKwlpZiAocGRhdGEtPnN5c19pbmZvKSB7CisJCWh3LT52bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8gPSAqcGRhdGEtPnN5c19pbmZvOworCQlpZiAoKGh3LT52bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0ICE9IDApICYmCisJCQkoaHctPnZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby53aWR0aCA+CisJCQkoTUFYX01QRUc0X1NVUFBPUlRfU0laRS9ody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodCkpKSB7CisJCQlwcl9pbmZvKCJhbW12ZGVjX21wZWc0OiBvdmVyc2l6ZSwgdW5zdXBwb3J0OiAlZColZFxuIiwKKwkJCQlody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoLAorCQkJCWh3LT52bXBlZzRfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0KTsKKwkJCXBkYXRhLT5kZWNfc3RhdHVzID0gTlVMTDsKKwkJCXZmcmVlKCh2b2lkICopaHcpOworCQkJaHcgPSBOVUxMOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkic3lzaW5mbzogJWQgeCAlZCwgcmF0ZTogJWRcbiIsCisJCQlody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoLAorCQkJaHctPnZtcGVnNF9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQsCisJCQlody0+dm1wZWc0X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUpOworCX0KKwlpZiAoKChkZWJ1Z19lbmFibGUgJiBJR05PUkVfUEFSQU1fRlJPTV9DT05GSUcpID09IDApICYmIHBkYXRhLT5jb25maWdfbGVuKSB7CisJCW1tcGVnNF9kZWJ1Z19wcmludChERUNPREVfSUQoaHcpLCBQUklOVF9GTEFHX1JVTl9GTE9XLAorCQkJICJwZGF0YS0+Y29uZmlnOiAlc1xuIiwgcGRhdGEtPmNvbmZpZyk7CisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAicGFybV92NGxfYnVmZmVyX21hcmdpbiIsCisJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWh3LT5keW5hbWljX2J1Zl9udW1fbWFyZ2luID0gY29uZmlnX3ZhbDsKKwkJZWxzZQorCQkJaHctPmR5bmFtaWNfYnVmX251bV9tYXJnaW4gPSBkeW5hbWljX2J1Zl9udW1fbWFyZ2luOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAic2lkZWJpbmRfdHlwZSIsCisJCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+c2lkZWJpbmRfdHlwZSA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJzaWRlYmluZF9jaGFubmVsX2lkIiwKKwkJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWh3LT5zaWRlYmluZF9jaGFubmVsX2lkID0gY29uZmlnX3ZhbDsKKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywKKwkJCSJwYXJtX3Y0bF9jb2RlY19lbmFibGUiLAorCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+aXNfdXNlZF92NGwgPSBjb25maWdfdmFsOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLAorCQkJInBhcm1fdjRsX2NhbnZhc19tZW1fbW9kZSIsCisJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWh3LT5ibGttb2RlID0gY29uZmlnX3ZhbDsKKworCQkvKmlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLAorCQkJInBhcm1fdjRsX2R1cmF0aW9uIiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJdmRlY19mcmFtZV9yYXRlX3VldmVudChjb25maWdfdmFsKTsqLworCX0gZWxzZQorCQlody0+ZHluYW1pY19idWZfbnVtX21hcmdpbiA9IGR5bmFtaWNfYnVmX251bV9tYXJnaW47CisKKwlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCXZmX3Byb3ZpZGVyX2luaXQoJnBkYXRhLT52ZnJhbWVfcHJvdmlkZXIsCisJCQlwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwgJnZmX3Byb3ZpZGVyX29wcywgcGRhdGEpOworCX0KKworCWlmICh2bW1wZWc0X2luaXQoaHcpIDwgMCkgeworCQlwcl9lcnIoIiVzIGluaXQgZmFpbGVkLlxuIiwgX19mdW5jX18pOworCisJCWlmIChodykgeworCQkJdmZyZWUoKHZvaWQgKilodyk7CisJCQlodyA9IE5VTEw7CisJCX0KKwkJcGRhdGEtPmRlY19zdGF0dXMgPSBOVUxMOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJdmRlY19zZXRfcHJlcGFyZV9sZXZlbChwZGF0YSwgc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCk7CisKKwl2ZGVjX3NldF92ZnJhbWVfY29tbShwZGF0YSwgRFJJVkVSX05BTUUpOworCisJaWYgKHBkYXRhLT5wYXJhbGxlbF9kZWMgPT0gMSkKKwkJdmRlY19jb3JlX3JlcXVlc3QocGRhdGEsIENPUkVfTUFTS19WREVDXzEpOworCWVsc2UgeworCQl2ZGVjX2NvcmVfcmVxdWVzdChwZGF0YSwgQ09SRV9NQVNLX1ZERUNfMSB8IENPUkVfTUFTS19IRVZDCisJCQkJfCBDT1JFX01BU0tfQ09NQklORSk7CisJfQorCisJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCSIlcyBlbmQuXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1tdmRlY19tcGVnNF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdmRlY19tcGVnNF9od19zICpodyA9CisJCShzdHJ1Y3QgdmRlY19tcGVnNF9od19zICopCisJCSgoKHN0cnVjdCB2ZGVjX3MgKikocGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldikpKS0+cHJpdmF0ZSk7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaHcpOworCWludCBpOworCisJaWYgKHZkZWMtPm5leHRfc3RhdHVzID09IFZERUNfU1RBVFVTX0RJU0NPTk5FQ1RFRAorCQkJCSYmICh2ZGVjLT5zdGF0dXMgPT0gVkRFQ19TVEFUVVNfQUNUSVZFKSkgeworCQkJbW1wZWc0X2RlYnVnX3ByaW50KERFQ09ERV9JRChodyksIDAsCisJCQkJIiVzICBmb3JjZSBleGl0ICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0ZPUkNFX0VYSVQ7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGh3LT53YWl0X3EsCisJCQkJKHZkZWMtPnN0YXR1cyA9PSBWREVDX1NUQVRVU19DT05ORUNURUQpLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOyAgLyogd2FpdCBmb3Igd29yayBkb25lICovCisJfQorCisJdm1wZWc0X3N0b3AoaHcpOworCisJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKQorCQl2ZGVjX2NvcmVfcmVsZWFzZShod190b192ZGVjKGh3KSwgQ09SRV9NQVNLX1ZERUNfMSk7CisJZWxzZQorCQl2ZGVjX2NvcmVfcmVsZWFzZShod190b192ZGVjKGh3KSwgQ09SRV9NQVNLX1ZERUNfMSB8IENPUkVfTUFTS19IRVZDKTsKKwl2ZGVjX3NldF9zdGF0dXMoaHdfdG9fdmRlYyhodyksIFZERUNfU1RBVFVTX0RJU0NPTk5FQ1RFRCk7CisKKwlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJZm9yIChpID0gMDsgaSA8IERFQ09ERV9CVUZGRVJfTlVNX01BWDsgaSsrKSB7CisJCQl2ZGVjLT5mcmVlX2NhbnZhc19leChjYW52YXNfeShody0+Y2FudmFzX3NwZWNbaV0pLCB2ZGVjLT5pZCk7CisJCQl2ZGVjLT5mcmVlX2NhbnZhc19leChjYW52YXNfdShody0+Y2FudmFzX3NwZWNbaV0pLCB2ZGVjLT5pZCk7CisJCX0KKwl9CisKKwltbXBlZzRfZGVidWdfcHJpbnQoREVDT0RFX0lEKGh3KSwgMCwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJdmZyZWUoKHZvaWQgKilodyk7CisJaHcgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhbW12ZGVjX21wZWc0X2RyaXZlciA9IHsKKwkucHJvYmUgPSBhbW12ZGVjX21wZWc0X3Byb2JlLAorCS5yZW1vdmUgPSBhbW12ZGVjX21wZWc0X3JlbW92ZSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZCA9IGFtdmRlY19zdXNwZW5kLAorCS5yZXN1bWUgPSBhbXZkZWNfcmVzdW1lLAorI2VuZGlmCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGNvZGVjX3Byb2ZpbGVfdCBhbXZkZWNfbXBlZzRfcHJvZmlsZSA9IHsKKwkubmFtZSA9ICJNUEVHNC1WNEwiLAorCS5wcm9maWxlID0gIiIKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFtbXZkZWNfbXBlZzRfZHJpdmVyX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcHJfaW5mbygiJXMgXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAocGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhbW12ZGVjX21wZWc0X2RyaXZlcikpIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gcmVnaXN0ZXIgYW1tdmRlY19tcGVnNCBkcml2ZXJcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJdmNvZGVjX3Byb2ZpbGVfcmVnaXN0ZXIoJmFtdmRlY19tcGVnNF9wcm9maWxlKTsKKwl2Y29kZWNfZmVhdHVyZV9yZWdpc3RlcihWRk9STUFUX01QRUc0LCAxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFtbXZkZWNfbXBlZzRfZHJpdmVyX3JlbW92ZV9tb2R1bGUodm9pZCkKK3sKKwlwcl9pbmZvKCJhbW12ZGVjX21wZWc0IG1vZHVsZSByZW1vdmUuXG4iKTsKKworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhbW12ZGVjX21wZWc0X2RyaXZlcik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworbW9kdWxlX3BhcmFtKGRlYnVnX2VuYWJsZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnX2VuYWJsZSwKKwkJCQkJICJcbiBhbW12ZGVjX21wZWc0IGRlYnVnIGVuYWJsZVxuIik7CisKK21vZHVsZV9wYXJhbShmcm1iYXNlX2NvbnRfYml0bGV2ZWwsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmcm1iYXNlX2NvbnRfYml0bGV2ZWwsICJcbmZybWJhc2VfY29udF9iaXRsZXZlbFxuIik7CisKK21vZHVsZV9wYXJhbShkeW5hbWljX2J1Zl9udW1fbWFyZ2luLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZHluYW1pY19idWZfbnVtX21hcmdpbiwgIlxuIGR5bmFtaWNfYnVmX251bV9tYXJnaW5cbiIpOworCittb2R1bGVfcGFyYW0ocmFkciwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJhZHIsICJcbnJhZHJcbiIpOworCittb2R1bGVfcGFyYW0ocnZhbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJ2YWwsICJcbnJ2YWxcbiIpOworCittb2R1bGVfcGFyYW0oZGVjb2RlX3RpbWVvdXRfdmFsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVjb2RlX3RpbWVvdXRfdmFsLCAiXG4gYW1tdmRlY19tcGVnNCBkZWNvZGVfdGltZW91dF92YWxcbiIpOworCittb2R1bGVfcGFyYW1fYXJyYXkobWF4X3Byb2Nlc3NfdGltZSwgdWludCwgJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtKHByZV9kZWNvZGVfYnVmX2xldmVsLCBpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhwcmVfZGVjb2RlX2J1Zl9sZXZlbCwKKwkJIlxuIGFtbXZkZWNfbXBlZzQgcHJlX2RlY29kZV9idWZfbGV2ZWxcbiIpOworCittb2R1bGVfcGFyYW0oc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCwgaW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCwKKwkJIlxuIGFtbXZkZWNfbXBlZzQgc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbFxuIik7CisKK21vZHVsZV9wYXJhbSh1ZGVidWdfZmxhZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHVkZWJ1Z19mbGFnLCAiXG4gYW1tdmRlY19tcGVnNCB1ZGVidWdfZmxhZ1xuIik7CisKK21vZHVsZV9wYXJhbSh3aXRob3V0X2Rpc3BsYXlfbW9kZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHdpdGhvdXRfZGlzcGxheV9tb2RlLCAiXG4gYW1tdmRlY19tcGVnNCB3aXRob3V0X2Rpc3BsYXlfbW9kZVxuIik7CisKK21vZHVsZV9pbml0KGFtbXZkZWNfbXBlZzRfZHJpdmVyX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGFtbXZkZWNfbXBlZzRfZHJpdmVyX3JlbW92ZV9tb2R1bGUpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFNTE9HSUMgTVBFRzQgVmlkZW8gRGVjb2RlciBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlRpbSBZYW8gPHRpbXlhb0BhbWxvZ2ljLmNvbT4iKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC92YXYxL01ha2VmaWxlIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC92YXYxL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkOWEyNjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL3ZhdjEvTWFrZWZpbGUKQEAgLTAsMCArMSwyIEBACitvYmotJChDT05GSUdfQU1MT0dJQ19NRURJQV9WREVDX0FWMSkgKz0gYW12ZGVjX2F2MV92NGwubworYW12ZGVjX2F2MV92NGwtb2JqcyArPSB2YXYxLm8gYXYxX2J1Zm1nci5vIGF2MV9maWxtX2dyYWluLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlcl92NGwvdmF2MS9hb21fYXYxX2RlZmluZS5oIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC92YXYxL2FvbV9hdjFfZGVmaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjllNjNmMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlcl92NGwvdmF2MS9hb21fYXYxX2RlZmluZS5oCkBAIC0wLDAgKzEsMTkwIEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorKiBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqCisqIERlc2NyaXB0aW9uOgorKi8KK2VudW0gTmFsVW5pdFR5cGUKK3sKKyAgTkFMX1VOSVRfQ09ERURfU0xJQ0VfVFJBSUxfTiA9IDAsICAgLy8gMAorICBOQUxfVU5JVF9DT0RFRF9TTElDRV9UUkFJTF9SLCAgIC8vIDEKKworICBOQUxfVU5JVF9DT0RFRF9TTElDRV9UU0FfTiwgICAgIC8vIDIKKyAgTkFMX1VOSVRfQ09ERURfU0xJQ0VfVExBLCAgICAgICAvLyAzICAgLy8gQ3VycmVudCBuYW1lIGluIHRoZSBzcGVjOiBUU0FfUgorCisgIE5BTF9VTklUX0NPREVEX1NMSUNFX1NUU0FfTiwgICAgLy8gNAorICBOQUxfVU5JVF9DT0RFRF9TTElDRV9TVFNBX1IsICAgIC8vIDUKKworICBOQUxfVU5JVF9DT0RFRF9TTElDRV9SQURMX04sICAgIC8vIDYKKyAgTkFMX1VOSVRfQ09ERURfU0xJQ0VfRExQLCAgICAgICAvLyA3IC8vIEN1cnJlbnQgbmFtZSBpbiB0aGUgc3BlYzogUkFETF9SCisKKyAgTkFMX1VOSVRfQ09ERURfU0xJQ0VfUkFTTF9OLCAgICAvLyA4CisgIE5BTF9VTklUX0NPREVEX1NMSUNFX1RGRCwgICAgICAgLy8gOSAvLyBDdXJyZW50IG5hbWUgaW4gdGhlIHNwZWM6IFJBU0xfUgorCisgIE5BTF9VTklUX1JFU0VSVkVEXzEwLAorICBOQUxfVU5JVF9SRVNFUlZFRF8xMSwKKyAgTkFMX1VOSVRfUkVTRVJWRURfMTIsCisgIE5BTF9VTklUX1JFU0VSVkVEXzEzLAorICBOQUxfVU5JVF9SRVNFUlZFRF8xNCwKKyAgTkFMX1VOSVRfUkVTRVJWRURfMTUsCisKKyAgTkFMX1VOSVRfQ09ERURfU0xJQ0VfQkxBLCAgICAgICAvLyAxNiAgIC8vIEN1cnJlbnQgbmFtZSBpbiB0aGUgc3BlYzogQkxBX1dfTFAKKyAgTkFMX1VOSVRfQ09ERURfU0xJQ0VfQkxBTlQsICAgICAvLyAxNyAgIC8vIEN1cnJlbnQgbmFtZSBpbiB0aGUgc3BlYzogQkxBX1dfRExQCisgIE5BTF9VTklUX0NPREVEX1NMSUNFX0JMQV9OX0xQLCAgLy8gMTgKKyAgTkFMX1VOSVRfQ09ERURfU0xJQ0VfSURSLCAgICAgICAvLyAxOSAgLy8gQ3VycmVudCBuYW1lIGluIHRoZSBzcGVjOiBJRFJfV19ETFAKKyAgTkFMX1VOSVRfQ09ERURfU0xJQ0VfSURSX05fTFAsICAvLyAyMAorICBOQUxfVU5JVF9DT0RFRF9TTElDRV9DUkEsICAgICAgIC8vIDIxCisgIE5BTF9VTklUX1JFU0VSVkVEXzIyLAorICBOQUxfVU5JVF9SRVNFUlZFRF8yMywKKworICBOQUxfVU5JVF9SRVNFUlZFRF8yNCwKKyAgTkFMX1VOSVRfUkVTRVJWRURfMjUsCisgIE5BTF9VTklUX1JFU0VSVkVEXzI2LAorICBOQUxfVU5JVF9SRVNFUlZFRF8yNywKKyAgTkFMX1VOSVRfUkVTRVJWRURfMjgsCisgIE5BTF9VTklUX1JFU0VSVkVEXzI5LAorICBOQUxfVU5JVF9SRVNFUlZFRF8zMCwKKyAgTkFMX1VOSVRfUkVTRVJWRURfMzEsCisKKyAgTkFMX1VOSVRfVlBTLCAgICAgICAgICAgICAgICAgICAvLyAzMgorICBOQUxfVU5JVF9TUFMsICAgICAgICAgICAgICAgICAgIC8vIDMzCisgIE5BTF9VTklUX1BQUywgICAgICAgICAgICAgICAgICAgLy8gMzQKKyAgTkFMX1VOSVRfQUNDRVNTX1VOSVRfREVMSU1JVEVSLCAvLyAzNQorICBOQUxfVU5JVF9FT1MsICAgICAgICAgICAgICAgICAgIC8vIDM2CisgIE5BTF9VTklUX0VPQiwgICAgICAgICAgICAgICAgICAgLy8gMzcKKyAgTkFMX1VOSVRfRklMTEVSX0RBVEEsICAgICAgICAgICAvLyAzOAorICBOQUxfVU5JVF9TRUksICAgICAgICAgICAgICAgICAgIC8vIDM5IFByZWZpeCBTRUkKKyAgTkFMX1VOSVRfU0VJX1NVRkZJWCwgICAgICAgICAgICAvLyA0MCBTdWZmaXggU0VJCisgIE5BTF9VTklUX1JFU0VSVkVEXzQxLAorICBOQUxfVU5JVF9SRVNFUlZFRF80MiwKKyAgTkFMX1VOSVRfUkVTRVJWRURfNDMsCisgIE5BTF9VTklUX1JFU0VSVkVEXzQ0LAorICBOQUxfVU5JVF9SRVNFUlZFRF80NSwKKyAgTkFMX1VOSVRfUkVTRVJWRURfNDYsCisgIE5BTF9VTklUX1JFU0VSVkVEXzQ3LAorICBOQUxfVU5JVF9VTlNQRUNJRklFRF80OCwKKyAgTkFMX1VOSVRfVU5TUEVDSUZJRURfNDksCisgIE5BTF9VTklUX1VOU1BFQ0lGSUVEXzUwLAorICBOQUxfVU5JVF9VTlNQRUNJRklFRF81MSwKKyAgTkFMX1VOSVRfVU5TUEVDSUZJRURfNTIsCisgIE5BTF9VTklUX1VOU1BFQ0lGSUVEXzUzLAorICBOQUxfVU5JVF9VTlNQRUNJRklFRF81NCwKKyAgTkFMX1VOSVRfVU5TUEVDSUZJRURfNTUsCisgIE5BTF9VTklUX1VOU1BFQ0lGSUVEXzU2LAorICBOQUxfVU5JVF9VTlNQRUNJRklFRF81NywKKyAgTkFMX1VOSVRfVU5TUEVDSUZJRURfNTgsCisgIE5BTF9VTklUX1VOU1BFQ0lGSUVEXzU5LAorICBOQUxfVU5JVF9VTlNQRUNJRklFRF82MCwKKyAgTkFMX1VOSVRfVU5TUEVDSUZJRURfNjEsCisgIE5BTF9VTklUX1VOU1BFQ0lGSUVEXzYyLAorICBOQUxfVU5JVF9VTlNQRUNJRklFRF82MywKKyAgTkFMX1VOSVRfSU5WQUxJRCwKK307CisKK2ludCBmb3JiaWRkZW5femVyb19iaXQ7CitpbnQgbV9uYWxVbml0VHlwZTsKK2ludCBtX3Jlc2VydmVkWmVybzZCaXRzOworaW50IG1fdGVtcG9yYWxJZDsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFtcmlzYyBTb2Z0d2FyZSBJbnRlcnJ1cHQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFNUklTQ19TVFJFQU1fRU1QVFlfUkVRIDB4MDEKKyNkZWZpbmUgQU1SSVNDX1BBUlNFUl9SRVEgICAgICAgMHgwMgorI2RlZmluZSBBTVJJU0NfTUFJTl9SRVEgICAgICAgICAweDA0CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBT01fQVYxX0RFQ19TVEFUVVMgKEhFVkNfREVDX1NUQVRVUykgZGVmaW5lCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvKmNvbW1hbmQqLworI2RlZmluZSBBT01fQVYxX0RFQ19JRExFICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBT01fQVYxX0RFQ19GUkFNRV9IRUFERVIgICAgICAgICAgICAgMQorI2RlZmluZSBBT01fQVYxX0RFQ19USUxFX0VORCAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBBT01fQVYxX0RFQ19UR19FTkQgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBBT01fQVYxX0RFQ19MQ1VfRU5EICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBBT01fQVYxX0RFQ09ERV9TTElDRSAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBBT01fQVYxX1NFQVJDSF9IRUFEICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBBT01fQVYxX0RVTVBfTE1FTSAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBBT01fQVYxX0ZHU19QQVJBTV9DT05UICAgICAgICAgICAgICAgOAorI2RlZmluZSBBT01fQVYxX0ZHU19QQVJBTV9DT05UICAgICAgICAgICAgICAgOAorI2RlZmluZSBBT01fQVYxX1BJQ19FTkRfQ09OVCAgICAgICAgICAgICAgICAgOQorICAvKnN0YXR1cyovCisjZGVmaW5lIEFPTV9BVjFfREVDX1BJQ19FTkQgICAgICAgICAgICAgICAgICAweGUwCisgIC8qQU9NX0FWMV9GR1NfUEFSQToKKyAgICBCaXRbMTFdIC0gMCBSZWFkLCAxIC0gV3JpdGUKKyAgQml0WzEwOjhdIC0gZmlsbV9ncmFpbl9wYXJhbXNfcmVmX2lkeCwgRm9yIFdyaXRlIHJlcXVlc3QKKyAgKi8KKyNkZWZpbmUgQU9NX0FWMV9GR1NfUEFSQU0gICAgICAgICAgICAgICAgICAgIDB4ZTEKKyNkZWZpbmUgQU9NX0FWMV9ERUNfUElDX0VORF9QUkUgICAgICAgICAgICAgIDB4ZTIKKyNkZWZpbmUgQU9NX0FWMV9IRUFEX1BBUlNFUl9ET05FICAgICAgICAgIDB4ZjAKKyNkZWZpbmUgQU9NX0FWMV9IRUFEX1NFQVJDSF9ET05FICAgICAgICAgIDB4ZjEKKyNkZWZpbmUgQU9NX0FWMV9TRVFfSEVBRF9QQVJTRVJfRE9ORSAgICAgIDB4ZjIKKyNkZWZpbmUgQU9NX0FWMV9GUkFNRV9IRUFEX1BBUlNFUl9ET05FICAgIDB4ZjMKKyNkZWZpbmUgQU9NX0FWMV9GUkFNRV9QQVJTRVJfRE9ORSAgIDB4ZjQKKyNkZWZpbmUgQU9NX0FWMV9SRURVTkRBTlRfRlJBTUVfSEVBRF9QQVJTRVJfRE9ORSAgIDB4ZjUKKyNkZWZpbmUgSEVWQ19BQ1RJT05fRE9ORSAgICAgICAgICAgIDB4ZmYKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5jbHVkZSAicGFyc2VyX2NtZC5oIgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgUEFSU0VSX0NNRF9TS0lQX0NGR18wIDB4MDAwMDA5MGIKKworI2RlZmluZSBQQVJTRVJfQ01EX1NLSVBfQ0ZHXzEgMHgxYjE0MTQwZgorCisjZGVmaW5lIFBBUlNFUl9DTURfU0tJUF9DRkdfMiAweDAwMWIxOTEwCisKKyNkZWZpbmUgUEFSU0VSX0NNRF9OVU1CRVIgMzcKKwordW5zaWduZWQgc2hvcnQgcGFyc2VyX2NtZFtQQVJTRVJfQ01EX05VTUJFUl0gPSB7CisweDA0MDEsCisweDg0MDEsCisweDA4MDAsCisweDA0MDIsCisweDkwMDIsCisweDE0MjMsCisweDhDQzMsCisweDE0MjMsCisweDg4MDQsCisweDk4MjUsCisweDA4MDAsCisweDA0RkUsCisweDg0MDYsCisweDg0MTEsCisweDE4MDAsCisweDg0MDgsCisweDg0MDksCisweDhDMkEsCisweDlDMkIsCisweDFDMDAsCisweDg0MEYsCisweDg0MDcsCisweDgwMDAsCisweDg0MDgsCisweDIwMDAsCisweEE4MDAsCisweDg0MTAsCisweDA0REUsCisweDg0MEMsCisweDg0MEQsCisweEFDMDAsCisweEEwMDAsCisweDA4QzAsCisweDA4RTAsCisweEE0MEUsCisweEZDMDAsCisweDdDMDAKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL3ZhdjEvYXYxX2J1Zm1nci5jIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC92YXYxL2F2MV9idWZtZ3IuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hODYzNjU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC92YXYxL2F2MV9idWZtZ3IuYwpAQCAtMCwwICsxLDM0MjYgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNyBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisqIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyoKKyogRGVzY3JpcHRpb246CisqLworI2lmbmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9NVUxUSV9ERUMKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY2FudmFzL2NhbnZhcy5oPgorCisjdW5kZWYgcHJfaW5mbworI2RlZmluZSBwcl9pbmZvIHByaW50aworCisjZGVmaW5lIF9fQ09NUEFSRShjb250ZXh0LCBwMSwgcDIpIGNvbXAocDEsIHAyKQorI2RlZmluZSBfX1NIT1JUU09SVChsbywgaGksIHdpZHRoLCBjb21wLCBjb250ZXh0KSBcCisgIHNob3J0c29ydChsbywgaGksIHdpZHRoLCBjb21wKQorI2RlZmluZSBDVVRPRkYgOCAgICAgICAgICAgIC8qIHRlc3Rpbmcgc2hvd3MgdGhhdCB0aGlzIGlzIGdvb2QgdmFsdWUgKi8KKyNkZWZpbmUgU1RLU0laICg4KnNpemVvZih2b2lkICopIC0gMikKKworI3VuZGVmIHN3YXAKK3N0YXRpYyB2b2lkIHN3YXAoY2hhciAqYSwgY2hhciAqYiwgc2l6ZV90IHdpZHRoKQoreworCWNoYXIgdG1wOworCisJaWYgKGEgIT0gYikKKwkvKiBEbyB0aGUgc3dhcCBvbmUgY2hhcmFjdGVyIGF0IGEgdGltZSB0byBhdm9pZCBwb3RlbnRpYWwKKwkqICAgYWxpZ25tZW50IHByb2JsZW1zLgorCSovCisJd2hpbGUgKHdpZHRoLS0pIHsKKwkJdG1wID0gKmE7CisJCSphKysgPSAqYjsKKwkJKmIrKyA9IHRtcDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNob3J0c29ydChjaGFyICpsbywgY2hhciAqaGksIHNpemVfdCB3aWR0aCwKKyAgaW50ICgqY29tcCkoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKQoreworCWNoYXIgKnAsICptYXg7CisKKwkvKiBOb3RlOiBpbiBhc3NlcnRpb25zIGJlbG93LCBpIGFuZCBqIGFyZSBhbHdheSBpbnNpZGUgb3JpZ2luYWwKKwkqICAgYm91bmQgb2YgYXJyYXkgdG8gc29ydC4KKwkqLworCXdoaWxlIChoaSA+IGxvKSB7CisJCS8qIEFbaV0gPD0gQVtqXSBmb3IgaSA8PSBqLCBqID4gaGkgKi8KKwkJbWF4ID0gbG87CisJCWZvciAocCA9IGxvICsgd2lkdGg7IHAgPD0gaGk7IHAgKz0gd2lkdGgpIHsKKwkJCS8qIEFbaV0gPD0gQVttYXhdIGZvciBsbyA8PSBpIDwgcCAqLworCQkJaWYgKF9fQ09NUEFSRShjb250ZXh0LCBwLCBtYXgpID4gMCkKKwkJCQltYXggPSBwOworCQkJCS8qIEFbaV0gPD0gQVttYXhdIGZvciBsbyA8PSBpIDw9IHAgKi8KKwkJfQorCQkvKiBBW2ldIDw9IEFbbWF4XSBmb3IgbG8gPD0gaSA8PSBoaSAqLworCQlzd2FwKG1heCwgaGksIHdpZHRoKTsKKworCQkvKiBBW2ldIDw9IEFbaGldIGZvciBpIDw9IGhpLCBzbyBBW2ldIDw9IEFbal0gZm9yIGkgPD0gaiwKKwkJKiAgIGogPj0gaGkKKwkJKi8KKwkJaGkgLT0gd2lkdGg7CisKKwkJLyogQVtpXSA8PSBBW2pdIGZvciBpIDw9IGosIGogPiBoaSwgbG9vcCB0b3AgY29uZGl0aW9uCisJCSogICBlc3RhYmxpc2hlZAorCQkqLworCX0KK30KKworc3RhdGljIHZvaWQgcXNvcnQodm9pZCAqYmFzZSwgc2l6ZV90IG51bSwgc2l6ZV90IHdpZHRoLAorICBpbnQgKCpjb21wKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpCit7CisgIGNoYXIgKmxvLCAqaGk7ICAgICAgICAgICAgICAvKiBlbmRzIG9mIHN1Yi1hcnJheSBjdXJyZW50bHkgc29ydGluZyAqLworICBjaGFyICptaWQ7ICAgICAgICAgICAgICAgICAgLyogcG9pbnRzIHRvIG1pZGRsZSBvZiBzdWJhcnJheSAqLworICBjaGFyICpsb2d1eSwgKmhpZ3V5OyAgICAgICAgLyogdHJhdmVsaW5nIHBvaW50ZXJzIGZvciBwYXJ0aXRpb24gc3RlcCAqLworICBzaXplX3Qgc2l6ZTsgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiB0aGUgc3ViLWFycmF5ICovCisgIGNoYXIgKmxvc3RrW1NUS1NJWl0sICpoaXN0a1tTVEtTSVpdOworICBpbnQgc3RrcHRyOworCisvKiAgc3RhY2sgZm9yIHNhdmluZyBzdWItYXJyYXkgdG8gYmUKKyAqICAgICAgICAgIHByb2Nlc3NlZAorICovCisjaWYgMAorICAvKiB2YWxpZGF0aW9uIHNlY3Rpb24gKi8KKyAgX1ZBTElEQVRFX1JFVFVSTl9WT0lEKGJhc2UgIT0gTlVMTCB8fCBudW0gPT0gMCwgRUlOVkFMKTsKKyAgX1ZBTElEQVRFX1JFVFVSTl9WT0lEKHdpZHRoID4gMCwgRUlOVkFMKTsKKyAgX1ZBTElEQVRFX1JFVFVSTl9WT0lEKGNvbXAgIT0gTlVMTCwgRUlOVkFMKTsKKyNlbmRpZgorICBpZiAobnVtIDwgMikKKyAgICByZXR1cm47ICAgICAgICAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvICovCisKKyAgc3RrcHRyID0gMDsgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgc3RhY2sgKi8KKyAgbG8gPSAoY2hhciAqKWJhc2U7CisgIGhpID0gKGNoYXIgKiliYXNlICsgd2lkdGggKiAobnVtIC0gMSk7ICAgICAgLyogaW5pdGlhbGl6ZSBsaW1pdHMgKi8KKworICAvKiB0aGlzIGVudHJ5IHBvaW50IGlzIGZvciBwc2V1ZG8tcmVjdXJzaW9uIGNhbGxpbmc6IHNldHRpbmcKKyAgICogbG8gYW5kIGhpIGFuZCBqdW1waW5nIHRvIGhlcmUgaXMgbGlrZSByZWN1cnNpb24sIGJ1dCBzdGtwdHIgaXMKKyAgICogcHJlc2VydmVkLCBsb2NhbHMgYXJlbid0LCBzbyB3ZSBwcmVzZXJ2ZSBzdHVmZiBvbiB0aGUgc3RhY2sKKyAgICovCityZWN1cnNlOgorCisgIHNpemUgPSAoaGkgLSBsbykgLyB3aWR0aCArIDE7ICAgICAgICAvKiBudW1iZXIgb2YgZWwncyB0byBzb3J0ICovCisKKyAgLyogYmVsb3cgYSBjZXJ0YWluIHNpemUsIGl0IGlzIGZhc3RlciB0byB1c2UgYSBPKG5eMikgc29ydGluZyBtZXRob2QgKi8KKyAgaWYgKHNpemUgPD0gQ1VUT0ZGKSB7CisgICAgX19TSE9SVFNPUlQobG8sIGhpLCB3aWR0aCwgY29tcCwgY29udGV4dCk7CisgIH0gZWxzZSB7CisgICAgLyogRmlyc3Qgd2UgcGljayBhIHBhcnRpdGlvbmluZyBlbGVtZW50LiAgVGhlIGVmZmljaWVuY3kgb2YKKyAgICAgKiB0aGUgYWxnb3JpdGhtIGRlbWFuZHMgdGhhdCB3ZSBmaW5kIG9uZSB0aGF0IGlzIGFwcHJveGltYXRlbHkKKyAgICAgKiB0aGUgbWVkaWFuIG9mIHRoZSB2YWx1ZXMsIGJ1dCBhbHNvIHRoYXQgd2Ugc2VsZWN0IG9uZSBmYXN0LgorICAgICAqIFdlIGNob29zZSB0aGUgbWVkaWFuIG9mIHRoZSBmaXJzdCwgbWlkZGxlLCBhbmQgbGFzdAorICAgICAqIGVsZW1lbnRzLCB0byBhdm9pZCBiYWQgcGVyZm9ybWFuY2UgaW4gdGhlIGZhY2Ugb2YgYWxyZWFkeQorICAgICAqIHNvcnRlZCBkYXRhLCBvciBkYXRhIHRoYXQgaXMgbWFkZSB1cCBvZiBtdWx0aXBsZSBzb3J0ZWQKKyAgICAgKiBydW5zIGFwcGVuZGVkIHRvZ2V0aGVyLiAgVGVzdGluZyBzaG93cyB0aGF0IGEKKyAgICAgKiBtZWRpYW4tb2YtdGhyZWUgYWxnb3JpdGhtIHByb3ZpZGVzIGJldHRlciBwZXJmb3JtYW5jZSB0aGFuCisgICAgICogc2ltcGx5IHBpY2tpbmcgdGhlIG1pZGRsZSBlbGVtZW50IGZvciB0aGUgbGF0dGVyIGNhc2UuCisgICAgICovCisKKyAgICBtaWQgPSBsbyArIChzaXplIC8gMikgKiB3aWR0aDsgICAgICAvKiBmaW5kIG1pZGRsZSBlbGVtZW50ICovCisKKyAgICAvKiBTb3J0IHRoZSBmaXJzdCwgbWlkZGxlLCBsYXN0IGVsZW1lbnRzIGludG8gb3JkZXIgKi8KKyAgICBpZiAoX19DT01QQVJFKGNvbnRleHQsIGxvLCBtaWQpID4gMCkKKyAgICAgIHN3YXAobG8sIG1pZCwgd2lkdGgpOworICAgIGlmIChfX0NPTVBBUkUoY29udGV4dCwgbG8sIGhpKSA+IDApCisgICAgICBzd2FwKGxvLCBoaSwgd2lkdGgpOworICAgIGlmIChfX0NPTVBBUkUoY29udGV4dCwgbWlkLCBoaSkgPiAwKQorICAgICAgc3dhcChtaWQsIGhpLCB3aWR0aCk7CisKKyAgICAvKiBXZSBub3cgd2lzaCB0byBwYXJ0aXRpb24gdGhlIGFycmF5IGludG8gdGhyZWUgcGllY2VzLCBvbmUKKyAgICAgKiBjb25zaXN0aW5nIG9mIGVsZW1lbnRzIDw9IHBhcnRpdGlvbiBlbGVtZW50LCBvbmUgb2YgZWxlbWVudHMKKyAgICAgKiBlcXVhbCB0byB0aGUgcGFydGl0aW9uIGVsZW1lbnQsIGFuZCBvbmUgb2YgZWxlbWVudHMgPiB0aGFuCisgICAgICogaXQuIFRoaXMgaXMgZG9uZSBiZWxvdzsgY29tbWVudHMgaW5kaWNhdGUgY29uZGl0aW9ucworICAgICAqIGVzdGFibGlzaGVkIGF0IGV2ZXJ5IHN0ZXAuCisgICAgICovCisKKyAgICBsb2d1eSA9IGxvOworICAgIGhpZ3V5ID0gaGk7CisKKyAgICAvKiBOb3RlIHRoYXQgaGlndXkgZGVjcmVhc2VzIGFuZCBsb2d1eSBpbmNyZWFzZXMgb24gZXZlcnkKKyAgICAgKiAgIGl0ZXJhdGlvbiwgc28gbG9vcCBtdXN0IHRlcm1pbmF0ZS4KKyAgICAgKi8KKyAgICBmb3IgKDs7KSB7CisgICAgICAvKiBsbyA8PSBsb2d1eSA8IGhpLCBsbyA8IGhpZ3V5IDw9IGhpLAorICAgICAgICogICBBW2ldIDw9IEFbbWlkXSBmb3IgbG8gPD0gaSA8PSBsb2d1eSwKKyAgICAgICAqICAgQVtpXSA+IEFbbWlkXSBmb3IgaGlndXkgPD0gaSA8IGhpLAorICAgICAgICogICBBW2hpXSA+PSBBW21pZF0KKyAgICAgICAqLworCisgICAgICAvKiBUaGUgZG91YmxlZCBsb29wIGlzIHRvIGF2b2lkIGNhbGxpbmcgY29tcChtaWQsbWlkKSwKKyAgICAgICAqICAgc2luY2Ugc29tZSBleGlzdGluZyBjb21wYXJpc29uIGZ1bmNzIGRvbid0IHdvcmsKKyAgICAgICAqICAgd2hlbiBwYXNzZWQgdGhlIHNhbWUgdmFsdWUgZm9yIGJvdGggcG9pbnRlcnMuCisgICAgICAgKi8KKworICAgICAgaWYgKG1pZCA+IGxvZ3V5KSB7CisgICAgICAgIGRvICB7CisgICAgICAgICAgbG9ndXkgKz0gd2lkdGg7CisgICAgICAgIH0gd2hpbGUgKGxvZ3V5IDwgbWlkICYmCisgICAgICAgICAgX19DT01QQVJFKGNvbnRleHQsIGxvZ3V5LCBtaWQpIDw9IDApOworICAgICAgfQorICAgICAgaWYgKG1pZCA8PSBsb2d1eSkgeworICAgICAgICBkbyAgeworICAgICAgICAgIGxvZ3V5ICs9IHdpZHRoOworICAgICAgICB9IHdoaWxlIChsb2d1eSA8PSBoaSAmJgorICAgICAgICAgIF9fQ09NUEFSRShjb250ZXh0LCBsb2d1eSwgbWlkKSA8PSAwKTsKKyAgICAgIH0KKworICAgICAgLyogbG8gPCBsb2d1eSA8PSBoaSsxLCBBW2ldIDw9IEFbbWlkXSBmb3IKKyAgICAgICAqICAgbG8gPD0gaSA8IGxvZ3V5LAorICAgICAgICogICBlaXRoZXIgbG9ndXkgPiBoaSBvciBBW2xvZ3V5XSA+IEFbbWlkXQorICAgICAgICovCisKKyAgICAgIGRvICB7CisgICAgICAgIGhpZ3V5IC09IHdpZHRoOworICAgICAgfSB3aGlsZSAoaGlndXkgPiBtaWQgJiYKKyAgICAgICAgICBfX0NPTVBBUkUoY29udGV4dCwgaGlndXksIG1pZCkgPiAwKTsKKworICAgICAgLyogbG8gPD0gaGlndXkgPCBoaSwgQVtpXSA+IEFbbWlkXSBmb3IgaGlndXkgPCBpIDwgaGksCisgICAgICAgKiAgIGVpdGhlciBoaWd1eSA9PSBsbyBvciBBW2hpZ3V5XSA8PSBBW21pZF0KKyAgICAgICAqLworCisgICAgICBpZiAoaGlndXkgPCBsb2d1eSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIGlmIGxvZ3V5ID4gaGkgb3IgaGlndXkgPT0gbG8sIHRoZW4gd2Ugd291bGQgaGF2ZQorICAgICAgICogICBleGl0ZWQsIHNvIEFbbG9ndXldID4gQVttaWRdLCBBW2hpZ3V5XSA8PSBBW21pZF0sCisgICAgICAgKiAgIGxvZ3V5IDw9IGhpLCBoaWd1eSA+IGxvCisgICAgICAgKi8KKworICAgICAgc3dhcChsb2d1eSwgaGlndXksIHdpZHRoKTsKKworICAgICAgLyogSWYgdGhlIHBhcnRpdGlvbiBlbGVtZW50IHdhcyBtb3ZlZCwgZm9sbG93IGl0LgorICAgICAgICogICBPbmx5IG5lZWQgdG8gY2hlY2sgZm9yIG1pZCA9PSBoaWd1eSwgc2luY2UgYmVmb3JlCisgICAgICAgKiAgIHRoZSBzd2FwLCBBW2xvZ3V5XSA+IEFbbWlkXSBpbXBsaWVzIGxvZ3V5ICE9IG1pZC4KKyAgICAgICAqLworCisgICAgICBpZiAobWlkID09IGhpZ3V5KQorICAgICAgICBtaWQgPSBsb2d1eTsKKworICAgICAgLyogQVtsb2d1eV0gPD0gQVttaWRdLCBBW2hpZ3V5XSA+IEFbbWlkXTsgc28gY29uZGl0aW9uCisgICAgICAgKiAgIGF0IHRvcCBvZiBsb29wIGlzIHJlLWVzdGFibGlzaGVkCisgICAgICAgKi8KKyAgICB9CisKKyAgICAvKiAgICAgQVtpXSA8PSBBW21pZF0gZm9yIGxvIDw9IGkgPCBsb2d1eSwKKyAgICAgKiAgICAgICBBW2ldID4gQVttaWRdIGZvciBoaWd1eSA8IGkgPCBoaSwKKyAgICAgKiAgICAgICBBW2hpXSA+PSBBW21pZF0KKyAgICAgKiAgICAgICBoaWd1eSA8IGxvZ3V5CisgICAgICogICBpbXBseWluZzoKKyAgICAgKiAgICAgICBoaWd1eSA9PSBsb2d1eS0xCisgICAgICogICAgICAgb3IgaGlndXkgPT0gaGkgLSAxLCBsb2d1eSA9PSBoaSArIDEsIEFbaGldID09IEFbbWlkXQorICAgICAqLworCisgICAgLyogRmluZCBhZGphY2VudCBlbGVtZW50cyBlcXVhbCB0byB0aGUgcGFydGl0aW9uIGVsZW1lbnQuICBUaGUKKyAgICAgKiAgIGRvdWJsZWQgbG9vcCBpcyB0byBhdm9pZCBjYWxsaW5nIGNvbXAobWlkLG1pZCksIHNpbmNlIHNvbWUKKyAgICAgKiAgIGV4aXN0aW5nIGNvbXBhcmlzb24gZnVuY3MgZG9uJ3Qgd29yayB3aGVuIHBhc3NlZCB0aGUgc2FtZQorICAgICAqICAgdmFsdWUgZm9yIGJvdGggcG9pbnRlcnMuCisgICAgICovCisKKyAgICBoaWd1eSArPSB3aWR0aDsKKyAgICBpZiAobWlkIDwgaGlndXkpIHsKKyAgICAgIGRvICB7CisgICAgICAgIGhpZ3V5IC09IHdpZHRoOworICAgICAgfSB3aGlsZSAoaGlndXkgPiBtaWQgJiYKKyAgICAgICAgX19DT01QQVJFKGNvbnRleHQsIGhpZ3V5LCBtaWQpID09IDApOworICAgIH0KKyAgICBpZiAobWlkID49IGhpZ3V5KSB7CisgICAgICBkbyAgeworICAgICAgICBoaWd1eSAtPSB3aWR0aDsKKyAgICAgIH0gd2hpbGUgKGhpZ3V5ID4gbG8gJiYKKyAgICAgICAgX19DT01QQVJFKGNvbnRleHQsIGhpZ3V5LCBtaWQpID09IDApOworICAgIH0KKworICAgIC8qIE9LLCBub3cgd2UgaGF2ZSB0aGUgZm9sbG93aW5nOgorICAgICAqICAgICAgaGlndXkgPCBsb2d1eQorICAgICAqICAgICAgbG8gPD0gaGlndXkgPD0gaGkKKyAgICAgKiAgICAgIEFbaV0gIDw9IEFbbWlkXSBmb3IgbG8gPD0gaSA8PSBoaWd1eQorICAgICAqICAgICAgQVtpXSAgPT0gQVttaWRdIGZvciBoaWd1eSA8IGkgPCBsb2d1eQorICAgICAqICAgICAgQVtpXSAgPiAgQVttaWRdIGZvciBsb2d1eSA8PSBpIDwgaGkKKyAgICAgKiAgICAgIEFbaGldID49IEFbbWlkXQorICAgICAqLworCisgICAgLyogV2UndmUgZmluaXNoZWQgdGhlIHBhcnRpdGlvbiwgbm93IHdlIHdhbnQgdG8gc29ydCB0aGUKKyAgICAgKiAgIHN1YmFycmF5cyBbbG8sIGhpZ3V5XSBhbmQgW2xvZ3V5LCBoaV0uCisgICAgICogICBXZSBkbyB0aGUgc21hbGxlciBvbmUgZmlyc3QgdG8gbWluaW1pemUgc3RhY2sgdXNhZ2UuCisgICAgICogICBXZSBvbmx5IHNvcnQgYXJyYXlzIG9mIGxlbmd0aCAyIG9yIG1vcmUuCisgICAgICovCisKKyAgICBpZiAoaGlndXkgLSBsbyA+PSBoaSAtIGxvZ3V5KSB7CisgICAgICBpZiAobG8gPCBoaWd1eSkgeworICAgICAgICBsb3N0a1tzdGtwdHJdID0gbG87CisgICAgICAgIGhpc3RrW3N0a3B0cl0gPSBoaWd1eTsKKyAgICAgICAgKytzdGtwdHI7CisgICAgICB9ICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIGJpZyByZWN1cnNpb24gZm9yIGxhdGVyICovCisKKyAgICAgIGlmIChsb2d1eSA8IGhpKSB7CisgICAgICAgIGxvID0gbG9ndXk7CisgICAgICAgIGdvdG8gcmVjdXJzZTsgICAgICAgICAgLyogZG8gc21hbGwgcmVjdXJzaW9uICovCisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChsb2d1eSA8IGhpKSB7CisgICAgICAgIGxvc3RrW3N0a3B0cl0gPSBsb2d1eTsKKyAgICAgICAgaGlzdGtbc3RrcHRyXSA9IGhpOworICAgICAgICArK3N0a3B0cjsgICAgLyogc2F2ZSBiaWcgcmVjdXJzaW9uIGZvciBsYXRlciAqLworICAgICAgfQorCisgICAgICBpZiAobG8gPCBoaWd1eSkgeworICAgICAgICBoaSA9IGhpZ3V5OworICAgICAgICBnb3RvIHJlY3Vyc2U7ICAgICAgICAgIC8qIGRvIHNtYWxsIHJlY3Vyc2lvbiAqLworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFdlIGhhdmUgc29ydGVkIHRoZSBhcnJheSwgZXhjZXB0IGZvciBhbnkgcGVuZGluZyBzb3J0cyBvbiB0aGUgc3RhY2suCisgICAqICAgQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSwgYW5kIGRvIHRoZW0uCisgICAqLworCisgIC0tc3RrcHRyOworICBpZiAoc3RrcHRyID49IDApIHsKKyAgICBsbyA9IGxvc3RrW3N0a3B0cl07CisgICAgaGkgPSBoaXN0a1tzdGtwdHJdOworICAgIGdvdG8gcmVjdXJzZTsgICAgICAgICAgIC8qIHBvcCBzdWJhcnJheSBmcm9tIHN0YWNrICovCisgIH0gZWxzZQorICAgIHJldHVybjsgICAgICAgICAgICAgICAgIC8qIGFsbCBzdWJhcnJheXMgZG9uZSAqLworfQorCisjZW5kaWYKKworI2luY2x1ZGUgImF2MV9nbG9iYWwuaCIKK2ludCBhb21fcmVhbGxvY19mcmFtZV9idWZmZXIoQVYxX0NPTU1PTiAqY20sIFBJQ19CVUZGRVJfQ09ORklHICpwaWMsCisgIGludCB3aWR0aCwgaW50IGhlaWdodCwgdW5zaWduZWQgaW50IG9yZGVyX2hpbnQpOwordm9pZCBkdW1wX3BhcmFtcyhBVjFEZWNvZGVyICpwYmksIHVuaW9uIHBhcmFtX3UgKnBhcmFtcyk7CisKKyNkZWZpbmUgYXNzZXJ0KGEpCisjZGVmaW5lIElNUExJRVMoYSkKKworaW50IG5ld19jb21wcmVzc2VkX2RhdGFfY291bnQgPSAwOworCitzdGF0aWMgaW50IHZhbGlkX3JlZl9mcmFtZV9zaXplKGludCByZWZfd2lkdGgsIGludCByZWZfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRoaXNfd2lkdGgsIGludCB0aGlzX2hlaWdodCkgeworICByZXR1cm4gMiAqIHRoaXNfd2lkdGggPj0gcmVmX3dpZHRoICYmIDIgKiB0aGlzX2hlaWdodCA+PSByZWZfaGVpZ2h0ICYmCisgICAgICAgICB0aGlzX3dpZHRoIDw9IDE2ICogcmVmX3dpZHRoICYmIHRoaXNfaGVpZ2h0IDw9IDE2ICogcmVmX2hlaWdodDsKK30KKworI2lmZGVmIFNVUFBPUlRfU0NBTEVfRkFDVE9SCisvLyBOb3RlOiBFeHBlY3QgdmFsIHRvIGJlIGluIHE0IHByZWNpc2lvbgorc3RhdGljIGlubGluZSBpbnQgc2NhbGVkX3goaW50IHZhbCwgY29uc3Qgc3RydWN0IHNjYWxlX2ZhY3RvcnMgKnNmKSB7CisgIGNvbnN0IGludCBvZmYgPQorICAgICAgKHNmLT54X3NjYWxlX2ZwIC0gKDEgPDwgUkVGX1NDQUxFX1NISUZUKSkgKiAoMSA8PCAoU1VCUEVMX0JJVFMgLSAxKSk7CisgIGNvbnN0IGludDY0X3QgdHZhbCA9IChpbnQ2NF90KXZhbCAqIHNmLT54X3NjYWxlX2ZwICsgb2ZmOworICByZXR1cm4gKGludClST1VORF9QT1dFUl9PRl9UV09fU0lHTkVEXzY0KHR2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGX1NDQUxFX1NISUZUIC0gU0NBTEVfRVhUUkFfQklUUyk7Cit9CisKKy8vIE5vdGU6IEV4cGVjdCB2YWwgdG8gYmUgaW4gcTQgcHJlY2lzaW9uCitzdGF0aWMgaW5saW5lIGludCBzY2FsZWRfeShpbnQgdmFsLCBjb25zdCBzdHJ1Y3Qgc2NhbGVfZmFjdG9ycyAqc2YpIHsKKyAgY29uc3QgaW50IG9mZiA9CisgICAgICAoc2YtPnlfc2NhbGVfZnAgLSAoMSA8PCBSRUZfU0NBTEVfU0hJRlQpKSAqICgxIDw8IChTVUJQRUxfQklUUyAtIDEpKTsKKyAgY29uc3QgaW50NjRfdCB0dmFsID0gKGludDY0X3QpdmFsICogc2YtPnlfc2NhbGVfZnAgKyBvZmY7CisgIHJldHVybiAoaW50KVJPVU5EX1BPV0VSX09GX1RXT19TSUdORURfNjQodHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZfU0NBTEVfU0hJRlQgLSBTQ0FMRV9FWFRSQV9CSVRTKTsKK30KKworLy8gTm90ZTogRXhwZWN0IHZhbCB0byBiZSBpbiBxNCBwcmVjaXNpb24KK3N0YXRpYyBpbnQgdW5zY2FsZWRfdmFsdWUoaW50IHZhbCwgY29uc3Qgc3RydWN0IHNjYWxlX2ZhY3RvcnMgKnNmKSB7CisgICh2b2lkKXNmOworICByZXR1cm4gdmFsIDw8IFNDQUxFX0VYVFJBX0JJVFM7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2ZpeGVkX3BvaW50X3NjYWxlX2ZhY3RvcihpbnQgb3RoZXJfc2l6ZSwgaW50IHRoaXNfc2l6ZSkgeworICAvLyBDYWxjdWxhdGUgc2NhbGluZyBmYWN0b3Igb25jZSBmb3IgZWFjaCByZWZlcmVuY2UgZnJhbWUKKyAgLy8gYW5kIHVzZSBmaXhlZCBwb2ludCBzY2FsaW5nIGZhY3RvcnMgaW4gZGVjb2RpbmcgYW5kIGVuY29kaW5nIHJvdXRpbmVzLgorICAvLyBIYXJkd2FyZSBpbXBsZW1lbnRhdGlvbnMgY2FuIGNhbGN1bGF0ZSBzY2FsZSBmYWN0b3IgaW4gZGV2aWNlIGRyaXZlcgorICAvLyBhbmQgdXNlIG11bHRpcGxpY2F0aW9uIGFuZCBzaGlmdGluZyBvbiBoYXJkd2FyZSBpbnN0ZWFkIG9mIGRpdmlzaW9uLgorICByZXR1cm4gKChvdGhlcl9zaXplIDw8IFJFRl9TQ0FMRV9TSElGVCkgKyB0aGlzX3NpemUgLyAyKSAvIHRoaXNfc2l6ZTsKK30KKworLy8gR2l2ZW4gdGhlIGZpeGVkIHBvaW50IHNjYWxlLCBjYWxjdWxhdGUgY29hcnNlIHBvaW50IHNjYWxlLgorc3RhdGljIGludCBmaXhlZF9wb2ludF9zY2FsZV90b19jb2Fyc2VfcG9pbnRfc2NhbGUoaW50IHNjYWxlX2ZwKSB7CisgIHJldHVybiBST1VORF9QT1dFUl9PRl9UV08oc2NhbGVfZnAsIFJFRl9TQ0FMRV9TSElGVCAtIFNDQUxFX1NVQlBFTF9CSVRTKTsKK30KKworCit2b2lkIGF2MV9zZXR1cF9zY2FsZV9mYWN0b3JzX2Zvcl9mcmFtZShzdHJ1Y3Qgc2NhbGVfZmFjdG9ycyAqc2YsIGludCBvdGhlcl93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG90aGVyX2gsIGludCB0aGlzX3csIGludCB0aGlzX2gpIHsKKyAgaWYgKCF2YWxpZF9yZWZfZnJhbWVfc2l6ZShvdGhlcl93LCBvdGhlcl9oLCB0aGlzX3csIHRoaXNfaCkpIHsKKyAgICBzZi0+eF9zY2FsZV9mcCA9IFJFRl9JTlZBTElEX1NDQUxFOworICAgIHNmLT55X3NjYWxlX2ZwID0gUkVGX0lOVkFMSURfU0NBTEU7CisgICAgcmV0dXJuOworICB9CisKKyAgc2YtPnhfc2NhbGVfZnAgPSBnZXRfZml4ZWRfcG9pbnRfc2NhbGVfZmFjdG9yKG90aGVyX3csIHRoaXNfdyk7CisgIHNmLT55X3NjYWxlX2ZwID0gZ2V0X2ZpeGVkX3BvaW50X3NjYWxlX2ZhY3RvcihvdGhlcl9oLCB0aGlzX2gpOworCisgIHNmLT54X3N0ZXBfcTQgPSBmaXhlZF9wb2ludF9zY2FsZV90b19jb2Fyc2VfcG9pbnRfc2NhbGUoc2YtPnhfc2NhbGVfZnApOworICBzZi0+eV9zdGVwX3E0ID0gZml4ZWRfcG9pbnRfc2NhbGVfdG9fY29hcnNlX3BvaW50X3NjYWxlKHNmLT55X3NjYWxlX2ZwKTsKKworICBpZiAoYXYxX2lzX3NjYWxlZChzZikpIHsKKyAgICBzZi0+c2NhbGVfdmFsdWVfeCA9IHNjYWxlZF94OworICAgIHNmLT5zY2FsZV92YWx1ZV95ID0gc2NhbGVkX3k7CisgIH0gZWxzZSB7CisgICAgc2YtPnNjYWxlX3ZhbHVlX3ggPSB1bnNjYWxlZF92YWx1ZTsKKyAgICBzZi0+c2NhbGVfdmFsdWVfeSA9IHVuc2NhbGVkX3ZhbHVlOworICB9CisjaWZkZWYgT1JJX0NPREUKKyAgLy8gQVYxIGNvbnZvbHZlIGZ1bmN0aW9ucworICAvLyBTcGVjaWFsIGNhc2UgY29udm9sdmUgZnVuY3Rpb25zIHNob3VsZCBwcm9kdWNlIHRoZSBzYW1lIHJlc3VsdCBhcworICAvLyBhdjFfY29udm9sdmVfMmQuCisgIC8vIHN1YnBlbF94X3FuID09IDAgJiYgc3VicGVsX3lfcW4gPT0gMAorICBzZi0+Y29udm9sdmVbMF1bMF1bMF0gPSBhdjFfY29udm9sdmVfMmRfY29weV9zcjsKKyAgLy8gc3VicGVsX3hfcW4gPT0gMAorICBzZi0+Y29udm9sdmVbMF1bMV1bMF0gPSBhdjFfY29udm9sdmVfeV9zcjsKKyAgLy8gc3VicGVsX3lfcW4gPT0gMAorICBzZi0+Y29udm9sdmVbMV1bMF1bMF0gPSBhdjFfY29udm9sdmVfeF9zcjsKKyAgLy8gc3VicGVsX3hfcW4gIT0gMCAmJiBzdWJwZWxfeV9xbiAhPSAwCisgIHNmLT5jb252b2x2ZVsxXVsxXVswXSA9IGF2MV9jb252b2x2ZV8yZF9zcjsKKyAgLy8gc3VicGVsX3hfcW4gPT0gMCAmJiBzdWJwZWxfeV9xbiA9PSAwCisgIHNmLT5jb252b2x2ZVswXVswXVsxXSA9IGF2MV9kaXN0X3d0ZF9jb252b2x2ZV8yZF9jb3B5OworICAvLyBzdWJwZWxfeF9xbiA9PSAwCisgIHNmLT5jb252b2x2ZVswXVsxXVsxXSA9IGF2MV9kaXN0X3d0ZF9jb252b2x2ZV95OworICAvLyBzdWJwZWxfeV9xbiA9PSAwCisgIHNmLT5jb252b2x2ZVsxXVswXVsxXSA9IGF2MV9kaXN0X3d0ZF9jb252b2x2ZV94OworICAvLyBzdWJwZWxfeF9xbiAhPSAwICYmIHN1YnBlbF95X3FuICE9IDAKKyAgc2YtPmNvbnZvbHZlWzFdWzFdWzFdID0gYXYxX2Rpc3Rfd3RkX2NvbnZvbHZlXzJkOworICAvLyBBVjEgSGlnaCBCRCBjb252b2x2ZSBmdW5jdGlvbnMKKyAgLy8gU3BlY2lhbCBjYXNlIGNvbnZvbHZlIGZ1bmN0aW9ucyBzaG91bGQgcHJvZHVjZSB0aGUgc2FtZSByZXN1bHQgYXMKKyAgLy8gYXYxX2hpZ2hiZF9jb252b2x2ZV8yZC4KKyAgLy8gc3VicGVsX3hfcW4gPT0gMCAmJiBzdWJwZWxfeV9xbiA9PSAwCisgIHNmLT5oaWdoYmRfY29udm9sdmVbMF1bMF1bMF0gPSBhdjFfaGlnaGJkX2NvbnZvbHZlXzJkX2NvcHlfc3I7CisgIC8vIHN1YnBlbF94X3FuID09IDAKKyAgc2YtPmhpZ2hiZF9jb252b2x2ZVswXVsxXVswXSA9IGF2MV9oaWdoYmRfY29udm9sdmVfeV9zcjsKKyAgLy8gc3VicGVsX3lfcW4gPT0gMAorICBzZi0+aGlnaGJkX2NvbnZvbHZlWzFdWzBdWzBdID0gYXYxX2hpZ2hiZF9jb252b2x2ZV94X3NyOworICAvLyBzdWJwZWxfeF9xbiAhPSAwICYmIHN1YnBlbF95X3FuICE9IDAKKyAgc2YtPmhpZ2hiZF9jb252b2x2ZVsxXVsxXVswXSA9IGF2MV9oaWdoYmRfY29udm9sdmVfMmRfc3I7CisgIC8vIHN1YnBlbF94X3FuID09IDAgJiYgc3VicGVsX3lfcW4gPT0gMAorICBzZi0+aGlnaGJkX2NvbnZvbHZlWzBdWzBdWzFdID0gYXYxX2hpZ2hiZF9kaXN0X3d0ZF9jb252b2x2ZV8yZF9jb3B5OworICAvLyBzdWJwZWxfeF9xbiA9PSAwCisgIHNmLT5oaWdoYmRfY29udm9sdmVbMF1bMV1bMV0gPSBhdjFfaGlnaGJkX2Rpc3Rfd3RkX2NvbnZvbHZlX3k7CisgIC8vIHN1YnBlbF95X3FuID09IDAKKyAgc2YtPmhpZ2hiZF9jb252b2x2ZVsxXVswXVsxXSA9IGF2MV9oaWdoYmRfZGlzdF93dGRfY29udm9sdmVfeDsKKyAgLy8gc3VicGVsX3hfcW4gIT0gMCAmJiBzdWJwZWxfeV9xbiAhPSAwCisgIHNmLT5oaWdoYmRfY29udm9sdmVbMV1bMV1bMV0gPSBhdjFfaGlnaGJkX2Rpc3Rfd3RkX2NvbnZvbHZlXzJkOworI2VuZGlmCit9CisjZW5kaWYKKworc3RhdGljIFJlZkNudEJ1ZmZlciAqYXNzaWduX2N1cl9mcmFtZV9uZXdfZmIoQVYxX0NPTU1PTiAqY29uc3QgY20pIHsKKyAgLy8gUmVsZWFzZSB0aGUgcHJldmlvdXNseS11c2VkIGZyYW1lLWJ1ZmZlcgorICBpbnQgbmV3X2ZiX2lkeDsKKyAgaWYgKGNtLT5jdXJfZnJhbWUgIT0gTlVMTCkgeworICAgIC0tY20tPmN1cl9mcmFtZS0+cmVmX2NvdW50OworICAgIGNtLT5jdXJfZnJhbWUgPSBOVUxMOworICB9CisKKyAgLy8gQXNzaWduIGEgbmV3IGZyYW1lYnVmZmVyCisgIG5ld19mYl9pZHggPSBnZXRfZnJlZV9mcmFtZV9idWZmZXIoY20pOworICBpZiAobmV3X2ZiX2lkeCA9PSBJTlZBTElEX0lEWCkgcmV0dXJuIE5VTEw7CisKKyAgY20tPmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzW25ld19mYl9pZHhdLmJ1Zi52NGxfYnVmX2luZGV4ID0gbmV3X2ZiX2lkeDsKKyAgY20tPmN1cl9mcmFtZSA9ICZjbS0+YnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnNbbmV3X2ZiX2lkeF07CisgIGNtLT5jdXJfZnJhbWUtPmJ1Zi5idWZfOGJpdF92YWxpZCA9IDA7CisjaWZkZWYgQU1MCisgIGNtLT5jdXJfZnJhbWUtPmJ1Zi5pbmRleCA9IG5ld19mYl9pZHg7CisjZW5kaWYKKyNpZmRlZiBPUklfQ09ERQorICBhdjFfemVybyhjbS0+Y3VyX2ZyYW1lLT5pbnRlcnBfZmlsdGVyX3NlbGVjdGVkKTsKKyNlbmRpZgorICByZXR1cm4gY20tPmN1cl9mcmFtZTsKK30KKworLy8gTW9kaWZ5ICdsaHNfcHRyJyB0byByZWZlcmVuY2UgdGhlIGJ1ZmZlciBhdCAncmhzX3B0cicsIGFuZCB1cGRhdGUgdGhlIHJlZgorLy8gY291bnRzIGFjY29yZGluZ2x5Lgorc3RhdGljIHZvaWQgYXNzaWduX2ZyYW1lX2J1ZmZlcl9wKFJlZkNudEJ1ZmZlciAqKmxoc19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZDbnRCdWZmZXIgKnJoc19wdHIpIHsKKyAgUmVmQ250QnVmZmVyICpjb25zdCBvbGRfcHRyID0gKmxoc19wdHI7CisgIGlmIChvbGRfcHRyICE9IE5VTEwpIHsKKyAgICBhc3NlcnQob2xkX3B0ci0+cmVmX2NvdW50ID4gMCk7CisgICAgLy8gT25lIGxlc3MgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgYXQgJ29sZF9wdHInLCBzbyBkZWNyZWFzZSByZWYgY291bnQuCisgICAgLS1vbGRfcHRyLT5yZWZfY291bnQ7CisgIH0KKworICAqbGhzX3B0ciA9IHJoc19wdHI7CisgIC8vIE9uZSBtb3JlIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIGF0ICdyaHNfcHRyJywgc28gaW5jcmVhc2UgcmVmIGNvdW50LgorICArK3Joc19wdHItPnJlZl9jb3VudDsKK30KKworQVYxRGVjb2RlciAqYXYxX2RlY29kZXJfY3JlYXRlKEJ1ZmZlclBvb2wgKmNvbnN0IHBvb2wsIEFWMV9DT01NT04gKmNtKSB7CisgIGludCBpOworCisjaWZuZGVmIENPTkZJR19BTUxPR0lDX01FRElBX01VTFRJX0RFQworICBBVjFEZWNvZGVyICpwYmkgPSAoQVYxRGVjb2RlciAqKW1hbGxvYyhzaXplb2YoKnBiaSkpOworI2Vsc2UKKyAgQVYxRGVjb2RlciAqcGJpID0gKEFWMURlY29kZXIgKil2bWFsbG9jKHNpemVvZihBVjFEZWNvZGVyKSk7CisjZW5kaWYKKyAgaWYgKCFwYmkpIHJldHVybiBOVUxMOworICBtZW1zZXQocGJpLCAwLCBzaXplb2YoKnBiaSkpOworCisgIC8vIFRoZSBqbXBfYnVmIGlzIHZhbGlkIG9ubHkgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZnVuY3Rpb24gdGhhdCBjYWxscworICAvLyBzZXRqbXAoKS4gVGhlcmVmb3JlLCB0aGlzIGZ1bmN0aW9uIG11c3QgcmVzZXQgdGhlICdzZXRqbXAnIGZpZWxkIHRvIDAKKyAgLy8gYmVmb3JlIGl0IHJldHVybnMuCisKKyAgcGJpLT5jb21tb24gPSBjbTsKKyAgY20tPmVycm9yLnNldGptcCA9IDE7CisKKyNpZmRlZiBPUklfQ09ERQorICBtZW1zZXQoY20tPmZjLCAwLCBzaXplb2YoKmNtLT5mYykpOworICBtZW1zZXQoY20tPmRlZmF1bHRfZnJhbWVfY29udGV4dCwgMCwgc2l6ZW9mKCpjbS0+ZGVmYXVsdF9mcmFtZV9jb250ZXh0KSk7CisjZW5kaWYKKyAgcGJpLT5uZWVkX3Jlc3luYyA9IDE7CisKKyAgLy8gSW5pdGlhbGl6ZSB0aGUgcmVmZXJlbmNlcyB0byBub3QgcG9pbnQgdG8gYW55IGZyYW1lIGJ1ZmZlcnMuCisgIGZvciAoaSA9IDA7IGkgPCBSRUZfRlJBTUVTOyBpKyspIHsKKyAgICBjbS0+cmVmX2ZyYW1lX21hcFtpXSA9IE5VTEw7CisgICAgY20tPm5leHRfcmVmX2ZyYW1lX21hcFtpXSA9IE5VTEw7CisjaWZkZWYgQU1MCisgICAgY20tPm5leHRfdXNlZF9yZWZfZnJhbWVfbWFwW2ldID0gTlVMTDsKKyNlbmRpZgorICB9CisKKyAgY20tPmN1cnJlbnRfZnJhbWUuZnJhbWVfbnVtYmVyID0gMDsKKyAgcGJpLT5kZWNvZGluZ19maXJzdF9mcmFtZSA9IDE7CisgIHBiaS0+Y29tbW9uLT5idWZmZXJfcG9vbCA9IHBvb2w7CisKKyAgY20tPnNlcV9wYXJhbXMuYml0X2RlcHRoID0gQU9NX0JJVFNfODsKKworI2lmZGVmIE9SSV9DT0RFCisgIGNtLT5hbGxvY19taSA9IGRlY19hbGxvY19taTsKKyAgY20tPmZyZWVfbWkgPSBkZWNfZnJlZV9taTsKKyAgY20tPnNldHVwX21pID0gZGVjX3NldHVwX21pOworCisgIGF2MV9sb29wX2ZpbHRlcl9pbml0KGNtKTsKKworICBhdjFfcW1faW5pdChjbSk7CisgIGF2MV9sb29wX3Jlc3RvcmF0aW9uX3ByZWNhbCgpOworI2lmIENPTkZJR19BQ0NPVU5USU5HCisgIHBiaS0+YWNjdF9lbmFibGVkID0gMTsKKyAgYW9tX2FjY291bnRpbmdfaW5pdCgmcGJpLT5hY2NvdW50aW5nKTsKKyNlbmRpZgorI2VuZGlmCisgIGNtLT5lcnJvci5zZXRqbXAgPSAwOworCisjaWZkZWYgT1JJX0NPREUKKyAgYW9tX2dldF93b3JrZXJfaW50ZXJmYWNlKCktPmluaXQoJnBiaS0+bGZfd29ya2VyKTsKKyAgcGJpLT5sZl93b3JrZXIudGhyZWFkX25hbWUgPSAiYW9tIGxmIHdvcmtlciI7CisjZW5kaWYKKworICByZXR1cm4gcGJpOworfQorCitzdGF0aWMgdm9pZCByZXNldF9mcmFtZV9idWZmZXJzKEFWMURlY29kZXIgKmNvbnN0IHBiaSk7CisKK3ZvaWQgYXYxX2J1Zm1ncl9jdHhfcmVzZXQoQVYxRGVjb2RlciAqcGJpLCBCdWZmZXJQb29sICpjb25zdCBwb29sLCBBVjFfQ09NTU9OICpjbSkKK3sKKwl1MzIgc2F2ZV93LCBzYXZlX2g7CisKKwlpZiAoIXBiaSB8fCAhcG9vbCB8fCAhY20pCisJCXJldHVybjsKKworCXJlc2V0X2ZyYW1lX2J1ZmZlcnMocGJpKTsKKwltZW1zZXQocGJpLCAwLCBzaXplb2YoKnBiaSkpOworCS8qc2F2ZSB3LGggZm9yIHJlc29sdXRpb24gY2hhbmdlIGFmdGVyIHNlZWsgKi8KKwlzYXZlX3cgPSBjbS0+d2lkdGg7CisJc2F2ZV9oID0gY20tPmhlaWdodDsKKwltZW1zZXQoY20sIDAsIHNpemVvZigqY20pKTsKKworCWNtLT5jdXJyZW50X2ZyYW1lLmZyYW1lX251bWJlcgk9IDA7CisJY20tPnNlcV9wYXJhbXMuYml0X2RlcHRoCT0gQU9NX0JJVFNfODsKKwljbS0+ZXJyb3Iuc2V0am1wID0gMDsKKwljbS0+d2lkdGggPSBzYXZlX3c7CisJY20tPmhlaWdodCA9IHNhdmVfaDsKKworCXBiaS0+YnVmbWdyX3Byb2NfY291bnQJCT0gMDsKKwlwYmktPm5lZWRfcmVzeW5jCQk9IDE7CisJcGJpLT5kZWNvZGluZ19maXJzdF9mcmFtZQk9IDE7CisJcGJpLT5udW1fb3V0cHV0X2ZyYW1lcwkJPSAwOworCXBiaS0+Y29tbW9uCQkJPSBjbTsKKwlwYmktPmNvbW1vbi0+YnVmZmVyX3Bvb2wJPSBwb29sOworfQorCitpbnQgcmVsZWFzZV9mYl9jYih2b2lkICpjYl9wcml2LCBhb21fY29kZWNfZnJhbWVfYnVmZmVyX3QgKmZiKSB7CisjaWYgMAorICBJbnRlcm5hbEZyYW1lQnVmZmVyICpjb25zdCBpbnRfZmIgPSAoSW50ZXJuYWxGcmFtZUJ1ZmZlciAqKWZiLT5wcml2OworICAodm9pZCljYl9wcml2OworICBpZiAoaW50X2ZiKSBpbnRfZmItPmluX3VzZSA9IDA7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlY3JlYXNlX3JlZl9jb3VudChBVjFEZWNvZGVyICpwYmksIFJlZkNudEJ1ZmZlciAqY29uc3QgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJQb29sICpjb25zdCBwb29sKSB7CisgIGlmIChidWYgIT0gTlVMTCkgeworICAgIC0tYnVmLT5yZWZfY291bnQ7CisgICAgLy8gUmVmZXJlbmNlIGNvdW50cyBzaG91bGQgbmV2ZXIgYmVjb21lIG5lZ2F0aXZlLiBJZiB0aGlzIGFzc2VydGlvbiBmYWlscywKKyAgICAvLyB0aGVyZSBpcyBhIGJ1ZyBpbiBvdXIgcmVmZXJlbmNlIGNvdW50IG1hbmFnZW1lbnQuCisgICAgYXNzZXJ0KGJ1Zi0+cmVmX2NvdW50ID49IDApOworICAgIC8vIEEgd29ya2VyIG1heSBvbmx5IGdldCBhIGZyZWUgZnJhbWVidWZmZXIgaW5kZXggd2hlbiBjYWxsaW5nIGdldF9mcmVlX2ZiLgorICAgIC8vIEJ1dCB0aGUgcmF3IGZyYW1lIGJ1ZmZlciBpcyBub3Qgc2V0IHVwIHVudGlsIHdlIGZpbmlzaCBkZWNvZGluZyBoZWFkZXIuCisgICAgLy8gU28gaWYgYW55IGVycm9yIGhhcHBlbnMgZHVyaW5nIGRlY29kaW5nIGhlYWRlciwgZnJhbWVfYnVmc1tpZHhdIHdpbGwgbm90CisgICAgLy8gaGF2ZSBhIHZhbGlkIHJhdyBmcmFtZSBidWZmZXIuCisgICAgaWYgKGJ1Zi0+cmVmX2NvdW50ID09IDAKKyNpZmRlZiBPUklfQ09ERQorICAgICAmJiBidWYtPnJhd19mcmFtZV9idWZmZXIuZGF0YQorI2VuZGlmCisgICAgICkgeworI2lmZGVmIEFNTAorICAgICAgYXYxX3JlbGVhc2VfYnVmKHBiaSwgYnVmKTsKKyNlbmRpZgorICAgICAgcmVsZWFzZV9mYl9jYihwb29sLT5jYl9wcml2LCAmYnVmLT5yYXdfZnJhbWVfYnVmZmVyKTsKKyAgICAgIGJ1Zi0+cmF3X2ZyYW1lX2J1ZmZlci5kYXRhID0gTlVMTDsKKyAgICAgIGJ1Zi0+cmF3X2ZyYW1lX2J1ZmZlci5zaXplID0gMDsKKyAgICAgIGJ1Zi0+cmF3X2ZyYW1lX2J1ZmZlci5wcml2ID0gTlVMTDsKKyAgICB9CisgIH0KK30KKwordm9pZCBjbGVhcl9mcmFtZV9idWZfcmVmX2NvdW50KEFWMURlY29kZXIgKnBiaSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwYmktPm51bV9vdXRwdXRfZnJhbWVzOyBpKyspIHsKKwkJZGVjcmVhc2VfcmVmX2NvdW50KHBiaSwgcGJpLT5vdXRwdXRfZnJhbWVzW2ldLAorCQkJcGJpLT5jb21tb24tPmJ1ZmZlcl9wb29sKTsKKwl9CisJcGJpLT5udW1fb3V0cHV0X2ZyYW1lcyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHN3YXBfZnJhbWVfYnVmZmVycyhBVjFEZWNvZGVyICpwYmksIGludCBmcmFtZV9kZWNvZGVkKSB7CisgIGludCByZWZfaW5kZXggPSAwLCBtYXNrOworICBBVjFfQ09NTU9OICpjb25zdCBjbSA9IHBiaS0+Y29tbW9uOworICBCdWZmZXJQb29sICpjb25zdCBwb29sID0gY20tPmJ1ZmZlcl9wb29sOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgIGlmIChmcmFtZV9kZWNvZGVkKSB7CisgICAgaW50IGNoZWNrX29uX3Nob3dfZXhpc3RpbmdfZnJhbWU7CisgICAgbG9ja19idWZmZXJfcG9vbChwb29sLCBmbGFncyk7CisKKyAgICAvLyBJbiBleHQtdGlsZSBkZWNvZGluZywgdGhlIGNhbWVyYSBmcmFtZSBoZWFkZXIgaXMgb25seSBkZWNvZGVkIG9uY2UuIFNvLAorICAgIC8vIHdlIGRvbid0IHJlbGVhc2UgdGhlIHJlZmVyZW5jZXMgaGVyZS4KKyAgICBpZiAoIXBiaS0+Y2FtZXJhX2ZyYW1lX2hlYWRlcl9yZWFkeSkgeworICAgICAgLy8gSWYgd2UgYXJlIG5vdCBob2xkaW5nIHJlZmVyZW5jZSBidWZmZXJzIGluIGNtLT5uZXh0X3JlZl9mcmFtZV9tYXAsCisgICAgICAvLyBhc3NlcnQgdGhhdCB0aGUgZm9sbG93aW5nIHR3byBmb3IgbG9vcHMgYXJlIG5vLW9wcy4KKyAgICAgIGFzc2VydChJTVBMSUVTKCFwYmktPmhvbGRfcmVmX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgIGNtLT5jdXJyZW50X2ZyYW1lLnJlZnJlc2hfZnJhbWVfZmxhZ3MgPT0gMCkpOworICAgICAgYXNzZXJ0KElNUExJRVMoIXBiaS0+aG9sZF9yZWZfYnVmLAorICAgICAgICAgICAgICAgICAgICAgY20tPnNob3dfZXhpc3RpbmdfZnJhbWUgJiYgIXBiaS0+cmVzZXRfZGVjb2Rlcl9zdGF0ZSkpOworCisgICAgICAvLyBUaGUgZm9sbG93aW5nIHR3byBmb3IgbG9vcHMgbmVlZCB0byByZWxlYXNlIHRoZSByZWZlcmVuY2Ugc3RvcmVkIGluCisgICAgICAvLyBjbS0+cmVmX2ZyYW1lX21hcFtyZWZfaW5kZXhdIGJlZm9yZSB0cmFuc2ZlcnJpbmcgdGhlIHJlZmVyZW5jZSBzdG9yZWQKKyAgICAgIC8vIGluIGNtLT5uZXh0X3JlZl9mcmFtZV9tYXBbcmVmX2luZGV4XSB0byBjbS0+cmVmX2ZyYW1lX21hcFtyZWZfaW5kZXhdLgorICAgICAgZm9yIChtYXNrID0gY20tPmN1cnJlbnRfZnJhbWUucmVmcmVzaF9mcmFtZV9mbGFnczsgbWFzazsgbWFzayA+Pj0gMSkgeworICAgICAgICBkZWNyZWFzZV9yZWZfY291bnQocGJpLCBjbS0+cmVmX2ZyYW1lX21hcFtyZWZfaW5kZXhdLCBwb29sKTsKKyAgICAgICAgY20tPnJlZl9mcmFtZV9tYXBbcmVmX2luZGV4XSA9IGNtLT5uZXh0X3JlZl9mcmFtZV9tYXBbcmVmX2luZGV4XTsKKyAgICAgICAgY20tPm5leHRfcmVmX2ZyYW1lX21hcFtyZWZfaW5kZXhdID0gTlVMTDsKKyAgICAgICAgKytyZWZfaW5kZXg7CisgICAgICB9CisKKyAgICAgIGNoZWNrX29uX3Nob3dfZXhpc3RpbmdfZnJhbWUgPQorICAgICAgICAgICFjbS0+c2hvd19leGlzdGluZ19mcmFtZSB8fCBwYmktPnJlc2V0X2RlY29kZXJfc3RhdGU7CisgICAgICBmb3IgKDsgcmVmX2luZGV4IDwgUkVGX0ZSQU1FUyAmJiBjaGVja19vbl9zaG93X2V4aXN0aW5nX2ZyYW1lOworICAgICAgICAgICArK3JlZl9pbmRleCkgeworICAgICAgICBkZWNyZWFzZV9yZWZfY291bnQocGJpLCBjbS0+cmVmX2ZyYW1lX21hcFtyZWZfaW5kZXhdLCBwb29sKTsKKyAgICAgICAgY20tPnJlZl9mcmFtZV9tYXBbcmVmX2luZGV4XSA9IGNtLT5uZXh0X3JlZl9mcmFtZV9tYXBbcmVmX2luZGV4XTsKKyAgICAgICAgY20tPm5leHRfcmVmX2ZyYW1lX21hcFtyZWZfaW5kZXhdID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY20tPnNob3dfZXhpc3RpbmdfZnJhbWUgfHwgY20tPnNob3dfZnJhbWUpIHsKKyAgICAgIGlmIChwYmktPm91dHB1dF9hbGxfbGF5ZXJzKSB7CisgICAgICAgIC8vIEFwcGVuZCB0aGlzIGZyYW1lIHRvIHRoZSBvdXRwdXQgcXVldWUKKyAgICAgICAgaWYgKHBiaS0+bnVtX291dHB1dF9mcmFtZXMgPj0gTUFYX05VTV9TUEFUSUFMX0xBWUVSUykgeworICAgICAgICAgIC8vIFdlIGNhbid0IHN0b3JlIHRoZSBuZXcgZnJhbWUgYW55d2hlcmUsIHNvIGRyb3AgaXQgYW5kIHJldHVybiBhbgorICAgICAgICAgIC8vIGVycm9yCisgICAgICAgICAgY20tPmN1cl9mcmFtZS0+YnVmLmNvcnJ1cHRlZCA9IDE7CisgICAgICAgICAgZGVjcmVhc2VfcmVmX2NvdW50KHBiaSwgY20tPmN1cl9mcmFtZSwgcG9vbCk7CisgICAgICAgICAgY20tPmVycm9yLmVycm9yX2NvZGUgPSBBT01fQ09ERUNfVU5TVVBfQklUU1RSRUFNOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBiaS0+b3V0cHV0X2ZyYW1lc1twYmktPm51bV9vdXRwdXRfZnJhbWVzXSA9IGNtLT5jdXJfZnJhbWU7CisgICAgICAgICAgcGJpLT5udW1fb3V0cHV0X2ZyYW1lcysrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBSZXBsYWNlIGFueSBleGlzdGluZyBvdXRwdXQgZnJhbWUKKyAgICAgICAgYXNzZXJ0KHBiaS0+bnVtX291dHB1dF9mcmFtZXMgPT0gMCB8fCBwYmktPm51bV9vdXRwdXRfZnJhbWVzID09IDEpOworICAgICAgICBpZiAocGJpLT5udW1fb3V0cHV0X2ZyYW1lcyA+IDApIHsKKyAgICAgICAgICBkZWNyZWFzZV9yZWZfY291bnQocGJpLCBwYmktPm91dHB1dF9mcmFtZXNbMF0sIHBvb2wpOworICAgICAgICB9CisJaWYgKGNtLT5jdXJfZnJhbWUpIHsKKyAgICAgICAgICBwYmktPm91dHB1dF9mcmFtZXNbMF0gPSBjbS0+Y3VyX2ZyYW1lOworICAgICAgICAgIHBiaS0+bnVtX291dHB1dF9mcmFtZXMgPSAxOworCX0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZGVjcmVhc2VfcmVmX2NvdW50KHBiaSwgY20tPmN1cl9mcmFtZSwgcG9vbCk7CisgICAgfQorCisgICAgdW5sb2NrX2J1ZmZlcl9wb29sKHBvb2wsIGZsYWdzKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBUaGUgY29kZSBoZXJlIGFzc3VtZXMgd2UgYXJlIG5vdCBob2xkaW5nIHJlZmVyZW5jZSBidWZmZXJzIGluCisgICAgLy8gY20tPm5leHRfcmVmX2ZyYW1lX21hcC4gSWYgdGhpcyBhc3NlcnRpb24gZmFpbHMsIHdlIGFyZSBsZWFraW5nIHRoZQorICAgIC8vIGZyYW1lIGJ1ZmZlciByZWZlcmVuY2VzIGluIGNtLT5uZXh0X3JlZl9mcmFtZV9tYXAuCisgICAgYXNzZXJ0KElNUExJRVMoIXBiaS0+Y2FtZXJhX2ZyYW1lX2hlYWRlcl9yZWFkeSwgIXBiaS0+aG9sZF9yZWZfYnVmKSk7CisgICAgLy8gTm90aGluZyB3YXMgZGVjb2RlZCwgc28ganVzdCBkcm9wIHRoaXMgZnJhbWUgYnVmZmVyCisgICAgbG9ja19idWZmZXJfcG9vbChwb29sLCBmbGFncyk7CisgICAgZGVjcmVhc2VfcmVmX2NvdW50KHBiaSwgY20tPmN1cl9mcmFtZSwgcG9vbCk7CisgICAgdW5sb2NrX2J1ZmZlcl9wb29sKHBvb2wsIGZsYWdzKTsKKyAgfQorICBjbS0+Y3VyX2ZyYW1lID0gTlVMTDsKKworICBpZiAoIXBiaS0+Y2FtZXJhX2ZyYW1lX2hlYWRlcl9yZWFkeSkgeworICAgIHBiaS0+aG9sZF9yZWZfYnVmID0gMDsKKworICAgIC8vIEludmFsaWRhdGUgdGhlc2UgcmVmZXJlbmNlcyB1bnRpbCB0aGUgbmV4dCBmcmFtZSBzdGFydHMuCisgICAgZm9yIChyZWZfaW5kZXggPSAwOyByZWZfaW5kZXggPCBJTlRFUl9SRUZTX1BFUl9GUkFNRTsgcmVmX2luZGV4KyspIHsKKyAgICAgIGNtLT5yZW1hcHBlZF9yZWZfaWR4W3JlZl9pbmRleF0gPSBJTlZBTElEX0lEWDsKKyAgICB9CisgIH0KK30KKwordm9pZCBhb21faW50ZXJuYWxfZXJyb3Ioc3RydWN0IGFvbV9pbnRlcm5hbF9lcnJvcl9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgYW9tX2NvZGVjX2Vycl90IGVycm9yLCBjb25zdCBjaGFyICpmbXQsIC4uLikgeworICB2YV9saXN0IGFwOworCisgIGluZm8tPmVycm9yX2NvZGUgPSBlcnJvcjsKKyAgaW5mby0+aGFzX2RldGFpbCA9IDA7CisKKyAgaWYgKGZtdCkgeworICAgIHNpemVfdCBzeiA9IHNpemVvZihpbmZvLT5kZXRhaWwpOworCisgICAgaW5mby0+aGFzX2RldGFpbCA9IDE7CisgICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICAgdnNucHJpbnRmKGluZm8tPmRldGFpbCwgc3ogLSAxLCBmbXQsIGFwKTsKKyAgICB2YV9lbmQoYXApOworICAgIGluZm8tPmRldGFpbFtzeiAtIDFdID0gJ1wwJzsKKyAgfQorI2lmZGVmIE9SSV9DT0RFCisgIGlmIChpbmZvLT5zZXRqbXApIGxvbmdqbXAoaW5mby0+am1wLCBpbmZvLT5lcnJvcl9jb2RlKTsKKyNlbmRpZgorfQorCisjaWZkZWYgT1JJX0NPREUKK3ZvaWQgYXYxX3plcm9fdW51c2VkX2ludGVybmFsX2ZyYW1lX2J1ZmZlcnMoSW50ZXJuYWxGcmFtZUJ1ZmZlckxpc3QgKmxpc3QpIHsKKyAgaW50IGk7CisKKyAgYXNzZXJ0KGxpc3QgIT0gTlVMTCk7CisKKyAgZm9yIChpID0gMDsgaSA8IGxpc3QtPm51bV9pbnRlcm5hbF9mcmFtZV9idWZmZXJzOyArK2kpIHsKKyAgICBpZiAobGlzdC0+aW50X2ZiW2ldLmRhdGEgJiYgIWxpc3QtPmludF9mYltpXS5pbl91c2UpCisgICAgICBtZW1zZXQobGlzdC0+aW50X2ZiW2ldLmRhdGEsIDAsIGxpc3QtPmludF9mYltpXS5zaXplKTsKKyAgfQorfQorI2VuZGlmCisKKy8vIFJlbGVhc2UgdGhlIHJlZmVyZW5jZXMgdG8gdGhlIGZyYW1lIGJ1ZmZlcnMgaW4gY20tPnJlZl9mcmFtZV9tYXAgYW5kIHJlc2V0CisvLyBhbGwgZWxlbWVudHMgb2YgY20tPnJlZl9mcmFtZV9tYXAgdG8gTlVMTC4KK3N0YXRpYyB2b2lkIHJlc2V0X3JlZl9mcmFtZV9tYXAoQVYxRGVjb2RlciAqY29uc3QgcGJpKSB7CisgIEFWMV9DT01NT04gKmNvbnN0IGNtID0gcGJpLT5jb21tb247CisgIEJ1ZmZlclBvb2wgKmNvbnN0IHBvb2wgPSBjbS0+YnVmZmVyX3Bvb2w7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBSRUZfRlJBTUVTOyBpKyspIHsKKyAgICBkZWNyZWFzZV9yZWZfY291bnQocGJpLCBjbS0+cmVmX2ZyYW1lX21hcFtpXSwgcG9vbCk7CisgICAgY20tPnJlZl9mcmFtZV9tYXBbaV0gPSBOVUxMOworI2lmZGVmIEFNTAorICAgIGNtLT5uZXh0X3VzZWRfcmVmX2ZyYW1lX21hcFtpXSA9IE5VTEw7CisjZW5kaWYKKyAgfQorfQorCisvLyBHZW5lcmF0ZSBuZXh0X3JlZl9mcmFtZV9tYXAuCitzdGF0aWMgdm9pZCBnZW5lcmF0ZV9uZXh0X3JlZl9mcmFtZV9tYXAoQVYxRGVjb2RlciAqY29uc3QgcGJpKSB7CisgIEFWMV9DT01NT04gKmNvbnN0IGNtID0gcGJpLT5jb21tb247CisgIEJ1ZmZlclBvb2wgKmNvbnN0IHBvb2wgPSBjbS0+YnVmZmVyX3Bvb2w7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIGludCByZWZfaW5kZXggPSAwOworICBpbnQgbWFzazsKKworICBsb2NrX2J1ZmZlcl9wb29sKHBvb2wsIGZsYWdzKTsKKyAgLy8gY20tPm5leHRfcmVmX2ZyYW1lX21hcCBob2xkcyByZWZlcmVuY2VzIHRvIGZyYW1lIGJ1ZmZlcnMuIEFmdGVyIHN0b3JpbmcgYQorICAvLyBmcmFtZSBidWZmZXIgaW5kZXggaW4gY20tPm5leHRfcmVmX2ZyYW1lX21hcCwgd2UgbmVlZCB0byBpbmNyZWFzZSB0aGUKKyAgLy8gZnJhbWUgYnVmZmVyJ3MgcmVmX2NvdW50LgorICBmb3IgKG1hc2sgPSBjbS0+Y3VycmVudF9mcmFtZS5yZWZyZXNoX2ZyYW1lX2ZsYWdzOyBtYXNrOyBtYXNrID4+PSAxKSB7CisgICAgaWYgKG1hc2sgJiAxKSB7CisgICAgICBjbS0+bmV4dF9yZWZfZnJhbWVfbWFwW3JlZl9pbmRleF0gPSBjbS0+Y3VyX2ZyYW1lOworICAgIH0gZWxzZSB7CisgICAgICBjbS0+bmV4dF9yZWZfZnJhbWVfbWFwW3JlZl9pbmRleF0gPSBjbS0+cmVmX2ZyYW1lX21hcFtyZWZfaW5kZXhdOworICAgIH0KKyAgICBpZiAoY20tPm5leHRfcmVmX2ZyYW1lX21hcFtyZWZfaW5kZXhdICE9IE5VTEwpCisgICAgICArK2NtLT5uZXh0X3JlZl9mcmFtZV9tYXBbcmVmX2luZGV4XS0+cmVmX2NvdW50OworICAgICsrcmVmX2luZGV4OworICB9CisKKyAgZm9yICg7IHJlZl9pbmRleCA8IFJFRl9GUkFNRVM7ICsrcmVmX2luZGV4KSB7CisgICAgY20tPm5leHRfcmVmX2ZyYW1lX21hcFtyZWZfaW5kZXhdID0gY20tPnJlZl9mcmFtZV9tYXBbcmVmX2luZGV4XTsKKyAgICBpZiAoY20tPm5leHRfcmVmX2ZyYW1lX21hcFtyZWZfaW5kZXhdICE9IE5VTEwpCisgICAgICArK2NtLT5uZXh0X3JlZl9mcmFtZV9tYXBbcmVmX2luZGV4XS0+cmVmX2NvdW50OworICB9CisgIHVubG9ja19idWZmZXJfcG9vbChwb29sLCBmbGFncyk7CisgIHBiaS0+aG9sZF9yZWZfYnVmID0gMTsKK30KKworLy8gSWYgdGhlIHJlZnJlc2hfZnJhbWVfZmxhZ3MgYml0bWFzayBpcyBzZXQsIHVwZGF0ZSByZWZlcmVuY2UgZnJhbWUgaWQgdmFsdWVzCisvLyBhbmQgbWFyayBmcmFtZXMgYXMgdmFsaWQgZm9yIHJlZmVyZW5jZS4KK3N0YXRpYyB2b2lkIHVwZGF0ZV9yZWZfZnJhbWVfaWQoQVYxX0NPTU1PTiAqY29uc3QgY20sIGludCBmcmFtZV9pZCkgeworICBpbnQgaTsKKyAgaW50IHJlZnJlc2hfZnJhbWVfZmxhZ3MgPSBjbS0+Y3VycmVudF9mcmFtZS5yZWZyZXNoX2ZyYW1lX2ZsYWdzOworICBhc3NlcnQoY20tPnNlcV9wYXJhbXMuZnJhbWVfaWRfbnVtYmVyc19wcmVzZW50X2ZsYWcpOworICBmb3IgKGkgPSAwOyBpIDwgUkVGX0ZSQU1FUzsgaSsrKSB7CisgICAgaWYgKChyZWZyZXNoX2ZyYW1lX2ZsYWdzID4+IGkpICYgMSkgeworICAgICAgY20tPnJlZl9mcmFtZV9pZFtpXSA9IGZyYW1lX2lkOworICAgICAgY20tPnZhbGlkX2Zvcl9yZWZlcmVuY2luZ1tpXSA9IDE7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfZXhpc3RpbmdfZnJhbWVfcmVzZXQoQVYxRGVjb2RlciAqY29uc3QgcGJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhpc3RpbmdfZnJhbWVfaWR4KSB7CisgIEFWMV9DT01NT04gKmNvbnN0IGNtID0gcGJpLT5jb21tb247CisgIGludCBpOworICBhc3NlcnQoY20tPnNob3dfZXhpc3RpbmdfZnJhbWUpOworCisgIGNtLT5jdXJyZW50X2ZyYW1lLmZyYW1lX3R5cGUgPSBLRVlfRlJBTUU7CisKKyAgY20tPmN1cnJlbnRfZnJhbWUucmVmcmVzaF9mcmFtZV9mbGFncyA9ICgxIDw8IFJFRl9GUkFNRVMpIC0gMTsKKworICBmb3IgKGkgPSAwOyBpIDwgSU5URVJfUkVGU19QRVJfRlJBTUU7ICsraSkgeworICAgIGNtLT5yZW1hcHBlZF9yZWZfaWR4W2ldID0gSU5WQUxJRF9JRFg7CisgIH0KKworICBpZiAocGJpLT5uZWVkX3Jlc3luYykgeworICAgIHJlc2V0X3JlZl9mcmFtZV9tYXAocGJpKTsKKyAgICBwYmktPm5lZWRfcmVzeW5jID0gMDsKKyAgfQorCisgIC8vIE5vdGUgdGhhdCB0aGUgZGlzcGxheWVkIGZyYW1lIG11c3QgYmUgdmFsaWQgZm9yIHJlZmVyZW5jaW5nIGluIG9yZGVyIHRvCisgIC8vIGhhdmUgYmVlbiBzZWxlY3RlZC4KKyAgaWYgKGNtLT5zZXFfcGFyYW1zLmZyYW1lX2lkX251bWJlcnNfcHJlc2VudF9mbGFnKSB7CisgICAgY20tPmN1cnJlbnRfZnJhbWVfaWQgPSBjbS0+cmVmX2ZyYW1lX2lkW2V4aXN0aW5nX2ZyYW1lX2lkeF07CisgICAgdXBkYXRlX3JlZl9mcmFtZV9pZChjbSwgY20tPmN1cnJlbnRfZnJhbWVfaWQpOworICB9CisKKyAgY20tPnJlZnJlc2hfZnJhbWVfY29udGV4dCA9IFJFRlJFU0hfRlJBTUVfQ09OVEVYVF9ESVNBQkxFRDsKKworICBnZW5lcmF0ZV9uZXh0X3JlZl9mcmFtZV9tYXAocGJpKTsKKworI2lmZGVmIE9SSV9DT0RFCisgIC8vIFJlbG9hZCB0aGUgYWRhcHRlZCBDREZzIGZyb20gd2hlbiB3ZSBvcmlnaW5hbGx5IGNvZGVkIHRoaXMga2V5ZnJhbWUKKyAgKmNtLT5mYyA9IGNtLT5uZXh0X3JlZl9mcmFtZV9tYXBbZXhpc3RpbmdfZnJhbWVfaWR4XS0+ZnJhbWVfY29udGV4dDsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCByZXNldF9mcmFtZV9idWZmZXJzKEFWMURlY29kZXIgKmNvbnN0IHBiaSkgeworICBBVjFfQ09NTU9OICpjb25zdCBjbSA9IHBiaS0+Y29tbW9uOworICBSZWZDbnRCdWZmZXIgKmNvbnN0IGZyYW1lX2J1ZnMgPSBjbS0+YnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnM7CisgIGludCBpOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgIC8vIFdlIGhhdmUgbm90IHN0b3JlZCBhbnkgcmVmZXJlbmNlcyB0byBmcmFtZSBidWZmZXJzIGluCisgIC8vIGNtLT5uZXh0X3JlZl9mcmFtZV9tYXAsIHNvIHdlIGNhbiBkaXJlY3RseSByZXNldCBpdCB0byBhbGwgTlVMTC4KKyAgZm9yIChpID0gMDsgaSA8IFJFRl9GUkFNRVM7ICsraSkgeworICAgIGNtLT5uZXh0X3JlZl9mcmFtZV9tYXBbaV0gPSBOVUxMOworICB9CisKKyAgbG9ja19idWZmZXJfcG9vbChjbS0+YnVmZmVyX3Bvb2wsIGZsYWdzKTsKKyAgcmVzZXRfcmVmX2ZyYW1lX21hcChwYmkpOworICBhc3NlcnQoY20tPmN1cl9mcmFtZS0+cmVmX2NvdW50ID09IDEpOworICBmb3IgKGkgPSAwOyBpIDwgRlJBTUVfQlVGRkVSUzsgKytpKSB7CisgICAgLy8gUmVzZXQgYWxsIHVucmVmZXJlbmNlZCBmcmFtZSBidWZmZXJzLiBXZSBjYW4gYWxzbyByZXNldCBjbS0+Y3VyX2ZyYW1lCisgICAgLy8gYmVjYXVzZSB3ZSBhcmUgdGhlIHNvbGUgb3duZXIgb2YgY20tPmN1cl9mcmFtZS4KKyAgICBpZiAoZnJhbWVfYnVmc1tpXS5yZWZfY291bnQgPiAwICYmICZmcmFtZV9idWZzW2ldICE9IGNtLT5jdXJfZnJhbWUpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBmcmFtZV9idWZzW2ldLm9yZGVyX2hpbnQgPSAwOworICAgIGF2MV96ZXJvKGZyYW1lX2J1ZnNbaV0ucmVmX29yZGVyX2hpbnRzKTsKKyAgfQorI2lmZGVmIE9SSV9DT0RFCisgIGF2MV96ZXJvX3VudXNlZF9pbnRlcm5hbF9mcmFtZV9idWZmZXJzKCZjbS0+YnVmZmVyX3Bvb2wtPmludF9mcmFtZV9idWZmZXJzKTsKKyNlbmRpZgorICB1bmxvY2tfYnVmZmVyX3Bvb2woY20tPmJ1ZmZlcl9wb29sLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgZnJhbWVfaXNfaW50cmFfb25seShjb25zdCBBVjFfQ09NTU9OICpjb25zdCBjbSkgeworICByZXR1cm4gY20tPmN1cnJlbnRfZnJhbWUuZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUgfHwKKyAgICAgIGNtLT5jdXJyZW50X2ZyYW1lLmZyYW1lX3R5cGUgPT0gSU5UUkFfT05MWV9GUkFNRTsKK30KKworc3RhdGljIGludCBmcmFtZV9pc19zZnJhbWUoY29uc3QgQVYxX0NPTU1PTiAqY20pIHsKKyAgcmV0dXJuIGNtLT5jdXJyZW50X2ZyYW1lLmZyYW1lX3R5cGUgPT0gU19GUkFNRTsKK30KKworLy8gVGhlc2UgZnVuY3Rpb25zIHRha2UgYSByZWZlcmVuY2UgZnJhbWUgbGFiZWwgYmV0d2VlbiBMQVNUX0ZSQU1FIGFuZAorLy8gRVhUUkVGX0ZSQU1FIGluY2x1c2l2ZS4gIE5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudCB0byB0aGUgaW5kZXhpbmcKKy8vIHByZXZpb3VzbHkgdXNlZCBieSB0aGUgZnJhbWVfcmVmc1tdIGFycmF5Lgorc3RhdGljIGludCBnZXRfcmVmX2ZyYW1lX21hcF9pZHgoY29uc3QgQVYxX0NPTU1PTiAqY29uc3QgY20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTVZfUkVGRVJFTkNFX0ZSQU1FIHJlZl9mcmFtZSkgeworICByZXR1cm4gKHJlZl9mcmFtZSA+PSBMQVNUX0ZSQU1FICYmIHJlZl9mcmFtZSA8PSBFWFRSRUZfRlJBTUUpCisgICAgICAgICAgICAgPyBjbS0+cmVtYXBwZWRfcmVmX2lkeFtyZWZfZnJhbWUgLSBMQVNUX0ZSQU1FXQorICAgICAgICAgICAgIDogSU5WQUxJRF9JRFg7Cit9CisKK3N0YXRpYyBSZWZDbnRCdWZmZXIgKmdldF9yZWZfZnJhbWVfYnVmKAorICAgIGNvbnN0IEFWMV9DT01NT04gKmNvbnN0IGNtLCBjb25zdCBNVl9SRUZFUkVOQ0VfRlJBTUUgcmVmX2ZyYW1lKSB7CisgIGNvbnN0IGludCBtYXBfaWR4ID0gZ2V0X3JlZl9mcmFtZV9tYXBfaWR4KGNtLCByZWZfZnJhbWUpOworICByZXR1cm4gKG1hcF9pZHggIT0gSU5WQUxJRF9JRFgpID8gY20tPnJlZl9mcmFtZV9tYXBbbWFwX2lkeF0gOiBOVUxMOworfQorI2lmZGVmIFNVUFBPUlRfU0NBTEVfRkFDVE9SCitzdGF0aWMgc3RydWN0IHNjYWxlX2ZhY3RvcnMgKmdldF9yZWZfc2NhbGVfZmFjdG9ycygKKyAgICBBVjFfQ09NTU9OICpjb25zdCBjbSwgY29uc3QgTVZfUkVGRVJFTkNFX0ZSQU1FIHJlZl9mcmFtZSkgeworICBjb25zdCBpbnQgbWFwX2lkeCA9IGdldF9yZWZfZnJhbWVfbWFwX2lkeChjbSwgcmVmX2ZyYW1lKTsKKyAgcmV0dXJuIChtYXBfaWR4ICE9IElOVkFMSURfSURYKSA/ICZjbS0+cmVmX3NjYWxlX2ZhY3RvcnNbbWFwX2lkeF0gOiBOVUxMOworfQorI2VuZGlmCitzdGF0aWMgUmVmQ250QnVmZmVyICpnZXRfcHJpbWFyeV9yZWZfZnJhbWVfYnVmKAorICAgIGNvbnN0IEFWMV9DT01NT04gKmNvbnN0IGNtKSB7CisgIGludCBtYXBfaWR4OworICBpZiAoY20tPnByaW1hcnlfcmVmX2ZyYW1lID09IFBSSU1BUllfUkVGX05PTkUpIHJldHVybiBOVUxMOworICBtYXBfaWR4ID0gZ2V0X3JlZl9mcmFtZV9tYXBfaWR4KGNtLCBjbS0+cHJpbWFyeV9yZWZfZnJhbWUgKyAxKTsKKyAgcmV0dXJuIChtYXBfaWR4ICE9IElOVkFMSURfSURYKSA/IGNtLT5yZWZfZnJhbWVfbWFwW21hcF9pZHhdIDogTlVMTDsKK30KKworc3RhdGljIGludCBnZXRfcmVsYXRpdmVfZGlzdChjb25zdCBPcmRlckhpbnRJbmZvICpvaCwgaW50IGEsIGludCBiKSB7CisgIGludCBiaXRzOworICBpbnQgbTsKKyAgaW50IGRpZmY7CisgIGlmICghb2gtPmVuYWJsZV9vcmRlcl9oaW50KSByZXR1cm4gMDsKKworICBiaXRzID0gb2gtPm9yZGVyX2hpbnRfYml0c19taW51c18xICsgMTsKKworICBhc3NlcnQoYml0cyA+PSAxKTsKKyAgYXNzZXJ0KGEgPj0gMCAmJiBhIDwgKDEgPDwgYml0cykpOworICBhc3NlcnQoYiA+PSAwICYmIGIgPCAoMSA8PCBiaXRzKSk7CisKKyAgZGlmZiA9IGEgLSBiOworICBtID0gMSA8PCAoYml0cyAtIDEpOworICBkaWZmID0gKGRpZmYgJiAobSAtIDEpKSAtIChkaWZmICYgbSk7CisgIHJldHVybiBkaWZmOworfQorCisKK3ZvaWQgYXYxX3JlYWRfZnJhbWVfc2l6ZSh1bmlvbiBwYXJhbV91ICpwYXJhbXMsIGludCBudW1fYml0c193aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2JpdHNfaGVpZ2h0LCBpbnQgKndpZHRoLCBpbnQgKmhlaWdodCwgaW50KiBkZWNfd2lkdGgpIHsKKyAgKndpZHRoID0gcGFyYW1zLT5wLmZyYW1lX3dpZHRoOworICAqaGVpZ2h0ID0gcGFyYW1zLT5wLmZyYW1lX2hlaWdodDsvL2FvbV9yYl9yZWFkX2xpdGVyYWwocmIsIG51bV9iaXRzX2hlaWdodCkgKyAxOworI2lmZGVmIEFNTAorICAqZGVjX3dpZHRoID0gcGFyYW1zLT5wLmRlY19mcmFtZV93aWR0aDsKKyNlbmRpZgorfQorCitzdGF0aWMgUkVGRVJFTkNFX01PREUgcmVhZF9mcmFtZV9yZWZlcmVuY2VfbW9kZSgKKyAgICBjb25zdCBBVjFfQ09NTU9OICpjbSwgdW5pb24gcGFyYW1fdSAqcGFyYW1zKSB7CisgIGlmIChmcmFtZV9pc19pbnRyYV9vbmx5KGNtKSkgeworICAgIHJldHVybiBTSU5HTEVfUkVGRVJFTkNFOworICB9IGVsc2UgeworICAgIHJldHVybiBwYXJhbXMtPnAucmVmZXJlbmNlX21vZGUgPyBSRUZFUkVOQ0VfTU9ERV9TRUxFQ1QgOiBTSU5HTEVfUkVGRVJFTkNFOworICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNhbGNfbWlfc2l6ZShpbnQgbGVuKSB7CisgIC8vIGxlbiBpcyBpbiBtaSB1bml0cy4gQWxpZ24gdG8gYSBtdWx0aXBsZSBvZiBTQnMuCisgIHJldHVybiBBTElHTl9QT1dFUl9PRl9UV08obGVuLCBNQVhfTUlCX1NJWkVfTE9HMik7Cit9CisKK3ZvaWQgYXYxX3NldF9tYl9taShBVjFfQ09NTU9OICpjbSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgIC8vIEVuc3VyZSB0aGF0IHRoZSBkZWNvZGVkIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGJvdGggbXVsdGlwbGVzIG9mCisgIC8vIDggbHVtYSBwaXhlbHMgKG5vdGU6IHRoaXMgbWF5IG9ubHkgYmUgYSBtdWx0aXBsZSBvZiA0IGNocm9tYSBwaXhlbHMgaWYKKyAgLy8gc3Vic2FtcGxpbmcgaXMgdXNlZCkuCisgIC8vIFRoaXMgc2ltcGxpZmllcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdmFyaW91cyBleHBlcmltZW50cywKKyAgLy8gZWcuIGNkZWYsIHdoaWNoIG9wZXJhdGVzIG9uIHVuaXRzIG9mIDh4OCBsdW1hIHBpeGVscy4KKyAgY29uc3QgaW50IGFsaWduZWRfd2lkdGggPSBBTElHTl9QT1dFUl9PRl9UV08od2lkdGgsIDMpOworICBjb25zdCBpbnQgYWxpZ25lZF9oZWlnaHQgPSBBTElHTl9QT1dFUl9PRl9UV08oaGVpZ2h0LCAzKTsKKyAgYXYxX3ByaW50MihBVjFfREVCVUdfQlVGTUdSX0RFVEFJTCwgIiBbUElDVFVSRV0gYXYxX3NldF9tYl9taSAoJWQgWCAlZClcbiIsIHdpZHRoLCBoZWlnaHQpOworCisgIGNtLT5taV9jb2xzID0gYWxpZ25lZF93aWR0aCA+PiBNSV9TSVpFX0xPRzI7CisgIGNtLT5taV9yb3dzID0gYWxpZ25lZF9oZWlnaHQgPj4gTUlfU0laRV9MT0cyOworICBjbS0+bWlfc3RyaWRlID0gY2FsY19taV9zaXplKGNtLT5taV9jb2xzKTsKKworICBjbS0+bWJfY29scyA9IChjbS0+bWlfY29scyArIDIpID4+IDI7CisgIGNtLT5tYl9yb3dzID0gKGNtLT5taV9yb3dzICsgMikgPj4gMjsKKyAgY20tPk1CcyA9IGNtLT5tYl9yb3dzICogY20tPm1iX2NvbHM7CisKKyNpZiBDT05GSUdfTFBGX01BU0sKKyAgYWxsb2NfbG9vcF9maWx0ZXJfbWFzayhjbSk7CisjZW5kaWYKK30KKworaW50IGF2MV9hbGxvY19jb250ZXh0X2J1ZmZlcnMoQVYxX0NPTU1PTiAqY20sIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworI2lmZGVmIE9SSV9DT0RFCisgIGludCBuZXdfbWlfc2l6ZTsKKyNlbmRpZgorICBhdjFfc2V0X21iX21pKGNtLCB3aWR0aCwgaGVpZ2h0KTsKKyNpZmRlZiBPUklfQ09ERQorICBuZXdfbWlfc2l6ZSA9IGNtLT5taV9zdHJpZGUgKiBjYWxjX21pX3NpemUoY20tPm1pX3Jvd3MpOworICBpZiAoY20tPm1pX2FsbG9jX3NpemUgPCBuZXdfbWlfc2l6ZSkgeworICAgIGNtLT5mcmVlX21pKGNtKTsKKyAgICBpZiAoY20tPmFsbG9jX21pKGNtLCBuZXdfbWlfc2l6ZSkpIGdvdG8gZmFpbDsKKyAgfQorI2VuZGlmCisgIHJldHVybiAwOworCisjaWZkZWYgT1JJX0NPREUKK2ZhaWw6CisjZW5kaWYKKyAgLy8gY2xlYXIgdGhlIG1pXyogdmFsdWVzIHRvIGZvcmNlIGEgcmVhbGxvYyBvbiByZXN5bmMKKyAgYXYxX3NldF9tYl9taShjbSwgMCwgMCk7CisjaWZkZWYgT1JJX0NPREUKKyAgYXYxX2ZyZWVfY29udGV4dF9idWZmZXJzKGNtKTsKKyNlbmRpZgorICByZXR1cm4gMTsKK30KKworI2lmbmRlZiBVU0VfU0NBTEVEX1dJRFRIX0ZST01fVUNPREUKK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZV9zY2FsZWRfc2l6ZV9oZWxwZXIoaW50ICpkaW0sIGludCBkZW5vbSkgeworICBpZiAoZGVub20gIT0gU0NBTEVfTlVNRVJBVE9SKSB7CisgICAgLy8gV2UgbmVlZCB0byBlbnN1cmUgdGhlIGNvbnN0cmFpbnQgaW4gIkFwcGVuZGl4IEEiIG9mIHRoZSBzcGVjOgorICAgIC8vICogRnJhbWVXaWR0aCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMTYKKyAgICAvLyAqIEZyYW1lSGVpZ2h0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxNgorICAgIC8vIEZvciB0aGlzLCB3ZSBjbGFtcCB0aGUgZG93bnNjYWxlZCBkaW1lbnNpb24gdG8gYXQgbGVhc3QgMTYuIE9uZQorICAgIC8vIGV4Y2VwdGlvbjogaWYgb3JpZ2luYWwgZGltZW5zaW9uIGl0c2VsZiB3YXMgPCAxNiwgdGhlbiB3ZSBrZWVwIHRoZQorICAgIC8vIGRvd25zY2FsZWQgZGltZW5zaW9uIHRvIGJlIHNhbWUgYXMgdGhlIG9yaWdpbmFsLCB0byBlbnN1cmUgdGhhdCByZXNpemluZworICAgIC8vIGlzIHZhbGlkLgorICAgIGNvbnN0IGludCBtaW5fZGltID0gQU9NTUlOKDE2LCAqZGltKTsKKyAgICAvLyBVc2UgdGhpcyB2ZXJzaW9uIGlmIHdlIG5lZWQgKmRpbSB0byBiZSBldmVuCisgICAgLy8gKndpZHRoID0gKCp3aWR0aCAqIFNDQUxFX05VTUVSQVRPUiArIGRlbm9tKSAvICgyICogZGVub20pOworICAgIC8vICp3aWR0aCA8PD0gMTsKKyAgICAqZGltID0gKCpkaW0gKiBTQ0FMRV9OVU1FUkFUT1IgKyBkZW5vbSAvIDIpIC8gKGRlbm9tKTsKKyAgICAqZGltID0gQU9NTUFYKCpkaW0sIG1pbl9kaW0pOworICB9Cit9CisjaWZkZWYgT1JJX0NPREUKK3ZvaWQgYXYxX2NhbGN1bGF0ZV9zY2FsZWRfc2l6ZShpbnQgKndpZHRoLCBpbnQgKmhlaWdodCwgaW50IHJlc2l6ZV9kZW5vbSkgeworICBjYWxjdWxhdGVfc2NhbGVkX3NpemVfaGVscGVyKHdpZHRoLCByZXNpemVfZGVub20pOworICBjYWxjdWxhdGVfc2NhbGVkX3NpemVfaGVscGVyKGhlaWdodCwgcmVzaXplX2Rlbm9tKTsKK30KKyNlbmRpZgordm9pZCBhdjFfY2FsY3VsYXRlX3NjYWxlZF9zdXBlcnJlc19zaXplKGludCAqd2lkdGgsIGludCAqaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdXBlcnJlc19kZW5vbSkgeworICAodm9pZCloZWlnaHQ7CisgIGNhbGN1bGF0ZV9zY2FsZWRfc2l6ZV9oZWxwZXIod2lkdGgsIHN1cGVycmVzX2Rlbm9tKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzZXR1cF9zdXBlcnJlcyhBVjFfQ09NTU9OICpjb25zdCBjbSwgdW5pb24gcGFyYW1fdSAqcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp3aWR0aCwgaW50ICpoZWlnaHQpIHsKKyNpZmRlZiBVU0VfU0NBTEVEX1dJRFRIX0ZST01fVUNPREUKKyAgY20tPnN1cGVycmVzX3Vwc2NhbGVkX3dpZHRoID0gcGFyYW1zLT5wLmZyYW1lX3dpZHRoX3NjYWxlZDsKKyAgY20tPnN1cGVycmVzX3Vwc2NhbGVkX2hlaWdodCA9IHBhcmFtcy0+cC5mcmFtZV9oZWlnaHQ7CisKKworICAqd2lkdGggPSBwYXJhbXMtPnAuZGVjX2ZyYW1lX3dpZHRoOworICAqaGVpZ2h0ID0gcGFyYW1zLT5wLmZyYW1lX2hlaWdodDsKKyAgYXYxX3ByaW50MihBVjFfREVCVUdfQlVGTUdSX0RFVEFJTCwgIiBbUElDVFVSRV0gc2V0IGRlY29kaW5nIHNpemUgdG8gKCVkIFggJWQpIHNjYWxlZCBzaXplIHRvICglZCBYICVkKVxuIiwKKwkqd2lkdGgsICpoZWlnaHQsCisJY20tPnN1cGVycmVzX3Vwc2NhbGVkX3dpZHRoLAorCWNtLT5zdXBlcnJlc191cHNjYWxlZF9oZWlnaHQpOworI2Vsc2UKKyAgY20tPnN1cGVycmVzX3Vwc2NhbGVkX3dpZHRoID0gKndpZHRoOworICBjbS0+c3VwZXJyZXNfdXBzY2FsZWRfaGVpZ2h0ID0gKmhlaWdodDsKKworICBjb25zdCBTZXF1ZW5jZUhlYWRlciAqY29uc3Qgc2VxX3BhcmFtcyA9ICZjbS0+c2VxX3BhcmFtczsKKyAgaWYgKCFzZXFfcGFyYW1zLT5lbmFibGVfc3VwZXJyZXMpIHJldHVybjsKKworICAvL2lmIChhb21fcmJfcmVhZF9iaXQoLTEsIGRlZm1hcmssIHJiKSkgeworICBpZiAocGFyYW1zLT5wLnN1cGVycmVzX3NjYWxlX2Rlbm9taW5hdG9yICE9IFNDQUxFX05VTUVSQVRPUikgeworI2lmZGVmIE9SSV9DT0RFCisgICAgY20tPnN1cGVycmVzX3NjYWxlX2Rlbm9taW5hdG9yID0KKyAgICAgICAgKHVpbnQ4X3QpYW9tX3JiX3JlYWRfbGl0ZXJhbCgtMSwgZGVmbWFyaywgcmIsIFNVUEVSUkVTX1NDQUxFX0JJVFMpOworICAgIGNtLT5zdXBlcnJlc19zY2FsZV9kZW5vbWluYXRvciArPSBTVVBFUlJFU19TQ0FMRV9ERU5PTUlOQVRPUl9NSU47CisjZWxzZQorICAgIGNtLT5zdXBlcnJlc19zY2FsZV9kZW5vbWluYXRvciA9IHBhcmFtcy0+cC5zdXBlcnJlc19zY2FsZV9kZW5vbWluYXRvcjsKKyNlbmRpZgorICAgIC8vIERvbid0IGVkaXQgY20tPndpZHRoIG9yIGNtLT5oZWlnaHQgZGlyZWN0bHksIG9yIHRoZSBidWZmZXJzIHdvbid0IGdldAorICAgIC8vIHJlc2l6ZWQgY29ycmVjdGx5CisgICAgYXYxX2NhbGN1bGF0ZV9zY2FsZWRfc3VwZXJyZXNfc2l6ZSh3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPnN1cGVycmVzX3NjYWxlX2Rlbm9taW5hdG9yKTsKKyAgfSBlbHNlIHsKKyAgICAvLyAxOjEgc2NhbGluZyAtIGllLiBubyBzY2FsaW5nLCBzY2FsZSBub3QgcHJvdmlkZWQKKyAgICBjbS0+c3VwZXJyZXNfc2NhbGVfZGVub21pbmF0b3IgPSBTQ0FMRV9OVU1FUkFUT1I7CisgIH0KKy8qIVVTRV9TQ0FMRURfV0lEVEhfRlJPTV9VQ09ERSovCisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgcmVzaXplX2NvbnRleHRfYnVmZmVycyhBVjFfQ09NTU9OICpjbSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisjaWYgQ09ORklHX1NJWkVfTElNSVQKKyAgaWYgKHdpZHRoID4gREVDT0RFX1dJRFRIX0xJTUlUIHx8IGhlaWdodCA+IERFQ09ERV9IRUlHSFRfTElNSVQpCisgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAiRGltZW5zaW9ucyBvZiAlZHglZCBiZXlvbmQgYWxsb3dlZCBzaXplIG9mICVkeCVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIERFQ09ERV9XSURUSF9MSU1JVCwgREVDT0RFX0hFSUdIVF9MSU1JVCk7CisjZW5kaWYKKyAgaWYgKGNtLT53aWR0aCAhPSB3aWR0aCB8fCBjbS0+aGVpZ2h0ICE9IGhlaWdodCkgeworICAgIGNvbnN0IGludCBuZXdfbWlfcm93cyA9CisgICAgICAgIEFMSUdOX1BPV0VSX09GX1RXTyhoZWlnaHQsIE1JX1NJWkVfTE9HMikgPj4gTUlfU0laRV9MT0cyOworICAgIGNvbnN0IGludCBuZXdfbWlfY29scyA9CisgICAgICAgIEFMSUdOX1BPV0VSX09GX1RXTyh3aWR0aCwgTUlfU0laRV9MT0cyKSA+PiBNSV9TSVpFX0xPRzI7CisKKyAgICAvLyBBbGxvY2F0aW9ucyBpbiBhdjFfYWxsb2NfY29udGV4dF9idWZmZXJzKCkgZGVwZW5kIG9uIGluZGl2aWR1YWwKKyAgICAvLyBkaW1lbnNpb25zIGFzIHdlbGwgYXMgdGhlIG92ZXJhbGwgc2l6ZS4KKyAgICBpZiAobmV3X21pX2NvbHMgPiBjbS0+bWlfY29scyB8fCBuZXdfbWlfcm93cyA+IGNtLT5taV9yb3dzKSB7CisgICAgICBpZiAoYXYxX2FsbG9jX2NvbnRleHRfYnVmZmVycyhjbSwgd2lkdGgsIGhlaWdodCkpIHsKKyAgICAgICAgLy8gVGhlIGNtLT5taV8qIHZhbHVlcyBoYXZlIGJlZW4gY2xlYXJlZCBhbmQgYW55IGV4aXN0aW5nIGNvbnRleHQKKyAgICAgICAgLy8gYnVmZmVycyBoYXZlIGJlZW4gZnJlZWQuIENsZWFyIGNtLT53aWR0aCBhbmQgY20tPmhlaWdodCB0byBiZQorICAgICAgICAvLyBjb25zaXN0ZW50IGFuZCB0byBmb3JjZSBhIHJlYWxsb2MgbmV4dCB0aW1lLgorICAgICAgICBjbS0+d2lkdGggPSAwOworICAgICAgICBjbS0+aGVpZ2h0ID0gMDsKKyAgICAgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19NRU1fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIGNvbnRleHQgYnVmZmVycyIpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBhdjFfc2V0X21iX21pKGNtLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB9CisjaWZkZWYgT1JJX0NPREUKKyAgICBhdjFfaW5pdF9jb250ZXh0X2J1ZmZlcnMoY20pOworI2VuZGlmCisgICAgY20tPndpZHRoID0gd2lkdGg7CisgICAgY20tPmhlaWdodCA9IGhlaWdodDsKKyAgfQorCisjaWZkZWYgT1JJX0NPREUKKyAgZW5zdXJlX212X2J1ZmZlcihjbS0+Y3VyX2ZyYW1lLCBjbSk7CisjZW5kaWYKKyAgY20tPmN1cl9mcmFtZS0+d2lkdGggPSBjbS0+d2lkdGg7CisgIGNtLT5jdXJfZnJhbWUtPmhlaWdodCA9IGNtLT5oZWlnaHQ7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX2J1ZmZlcl9wb29sKEFWMV9DT01NT04gKmNtKSB7CisgIEJ1ZmZlclBvb2wgKmNvbnN0IHBvb2wgPSBjbS0+YnVmZmVyX3Bvb2w7CisgIGNvbnN0IFNlcXVlbmNlSGVhZGVyICpjb25zdCBzZXFfcGFyYW1zID0gJmNtLT5zZXFfcGFyYW1zOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgIGxvY2tfYnVmZmVyX3Bvb2wocG9vbCwgZmxhZ3MpOworICBpZiAoYW9tX3JlYWxsb2NfZnJhbWVfYnVmZmVyKGNtLCAmY20tPmN1cl9mcmFtZS0+YnVmLAorICAgIGNtLT53aWR0aCwgY20tPmhlaWdodCwgY20tPmN1cl9mcmFtZS0+b3JkZXJfaGludCkpIHsKKyAgICB1bmxvY2tfYnVmZmVyX3Bvb2wocG9vbCwgZmxhZ3MpOworICAgIGFvbV9pbnRlcm5hbF9lcnJvcigmY20tPmVycm9yLCBBT01fQ09ERUNfTUVNX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIGZyYW1lIGJ1ZmZlciIpOworICB9CisgIHVubG9ja19idWZmZXJfcG9vbChwb29sLCBmbGFncyk7CisKKyAgY20tPmN1cl9mcmFtZS0+YnVmLmJpdF9kZXB0aCA9ICh1bnNpZ25lZCBpbnQpc2VxX3BhcmFtcy0+Yml0X2RlcHRoOworICBjbS0+Y3VyX2ZyYW1lLT5idWYuY29sb3JfcHJpbWFyaWVzID0gc2VxX3BhcmFtcy0+Y29sb3JfcHJpbWFyaWVzOworICBjbS0+Y3VyX2ZyYW1lLT5idWYudHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzID0KKyAgICAgIHNlcV9wYXJhbXMtPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKKyAgY20tPmN1cl9mcmFtZS0+YnVmLm1hdHJpeF9jb2VmZmljaWVudHMgPSBzZXFfcGFyYW1zLT5tYXRyaXhfY29lZmZpY2llbnRzOworICBjbS0+Y3VyX2ZyYW1lLT5idWYubW9ub2Nocm9tZSA9IHNlcV9wYXJhbXMtPm1vbm9jaHJvbWU7CisgIGNtLT5jdXJfZnJhbWUtPmJ1Zi5jaHJvbWFfc2FtcGxlX3Bvc2l0aW9uID0KKyAgICAgIHNlcV9wYXJhbXMtPmNocm9tYV9zYW1wbGVfcG9zaXRpb247CisgIGNtLT5jdXJfZnJhbWUtPmJ1Zi5jb2xvcl9yYW5nZSA9IHNlcV9wYXJhbXMtPmNvbG9yX3JhbmdlOworICBjbS0+Y3VyX2ZyYW1lLT5idWYucmVuZGVyX3dpZHRoID0gY20tPnJlbmRlcl93aWR0aDsKKyAgY20tPmN1cl9mcmFtZS0+YnVmLnJlbmRlcl9oZWlnaHQgPSBjbS0+cmVuZGVyX2hlaWdodDsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfZnJhbWVfc2l6ZShBVjFfQ09NTU9OICpjbSwgaW50IGZyYW1lX3NpemVfb3ZlcnJpZGVfZmxhZywgdW5pb24gcGFyYW1fdSAqcGFyYW1zKSB7CisgIGNvbnN0IFNlcXVlbmNlSGVhZGVyICpjb25zdCBzZXFfcGFyYW1zID0gJmNtLT5zZXFfcGFyYW1zOworICBpbnQgd2lkdGgsIGhlaWdodCwgZGVjX3dpZHRoOworCisgIGlmIChmcmFtZV9zaXplX292ZXJyaWRlX2ZsYWcpIHsKKyAgICBpbnQgbnVtX2JpdHNfd2lkdGggPSBzZXFfcGFyYW1zLT5udW1fYml0c193aWR0aDsKKyAgICBpbnQgbnVtX2JpdHNfaGVpZ2h0ID0gc2VxX3BhcmFtcy0+bnVtX2JpdHNfaGVpZ2h0OworICAgIGF2MV9yZWFkX2ZyYW1lX3NpemUocGFyYW1zLCBudW1fYml0c193aWR0aCwgbnVtX2JpdHNfaGVpZ2h0LCAmd2lkdGgsICZoZWlnaHQsICZkZWNfd2lkdGgpOworI2lmZGVmIEFNTAorICAgIGNtLT5kZWNfd2lkdGggPSBkZWNfd2lkdGg7CisjZW5kaWYKKyAgICBpZiAod2lkdGggPiBzZXFfcGFyYW1zLT5tYXhfZnJhbWVfd2lkdGggfHwKKyAgICAgICAgaGVpZ2h0ID4gc2VxX3BhcmFtcy0+bWF4X2ZyYW1lX2hlaWdodCkgeworICAgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICJGcmFtZSBkaW1lbnNpb25zIGFyZSBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSB2YWx1ZXMiKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgd2lkdGggPSBzZXFfcGFyYW1zLT5tYXhfZnJhbWVfd2lkdGg7CisgICAgaGVpZ2h0ID0gc2VxX3BhcmFtcy0+bWF4X2ZyYW1lX2hlaWdodDsKKyNpZmRlZiBBTUwKKyAgICBjbS0+ZGVjX3dpZHRoID0gZGVjX3dpZHRoID0gcGFyYW1zLT5wLmRlY19mcmFtZV93aWR0aDsKKyNlbmRpZgorICB9CisgIHNldHVwX3N1cGVycmVzKGNtLCBwYXJhbXMsICZ3aWR0aCwgJmhlaWdodCk7CisgIHJlc2l6ZV9jb250ZXh0X2J1ZmZlcnMoY20sIHdpZHRoLCBoZWlnaHQpOworI2lmZGVmIE9SSV9DT0RFCisgIHNldHVwX3JlbmRlcl9zaXplKGNtLCBwYXJhbXMpOworI2VuZGlmCisgIHNldHVwX2J1ZmZlcl9wb29sKGNtKTsKK30KKworc3RhdGljIGludCB2YWxpZF9yZWZfZnJhbWVfaW1nX2ZtdChhb21fYml0X2RlcHRoX3QgcmVmX2JpdF9kZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWZfeHNzLCBpbnQgcmVmX3lzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFvbV9iaXRfZGVwdGhfdCB0aGlzX2JpdF9kZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aGlzX3hzcywgaW50IHRoaXNfeXNzKSB7CisgIHJldHVybiByZWZfYml0X2RlcHRoID09IHRoaXNfYml0X2RlcHRoICYmIHJlZl94c3MgPT0gdGhpc194c3MgJiYKKyAgICAgICAgIHJlZl95c3MgPT0gdGhpc195c3M7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX2ZyYW1lX3NpemVfd2l0aF9yZWZzKEFWMV9DT01NT04gKmNtLCB1bmlvbiBwYXJhbV91ICpwYXJhbXMpIHsKKyAgaW50IHdpZHRoLCBoZWlnaHQsIGRlY193aWR0aDsKKyAgaW50IGZvdW5kID0gMDsKKyAgaW50IGhhc192YWxpZF9yZWZfZnJhbWUgPSAwOworICBpbnQgaTsKKyAgU2VxdWVuY2VIZWFkZXIgKnNlcV9wYXJhbXM7CisgIGZvciAoaSA9IExBU1RfRlJBTUU7IGkgPD0gQUxUUkVGX0ZSQU1FOyArK2kpIHsKKyAgICAvKmlmIChhb21fcmJfcmVhZF9iaXQocmIpKSB7Ki8KKyAgICBpZiAocGFyYW1zLT5wLnZhbGlkX3JlZl9mcmFtZV9iaXRzICYgKDE8PGkpKSB7CisgICAgICBjb25zdCBSZWZDbnRCdWZmZXIgKmNvbnN0IHJlZl9idWYgPSBnZXRfcmVmX2ZyYW1lX2J1ZihjbSwgaSk7CisgICAgICAvLyBUaGlzIHdpbGwgbmV2ZXIgYmUgTlVMTCBpbiBhIG5vcm1hbCBzdHJlYW0sIGFzIHN0cmVhbXMgYXJlIHJlcXVpcmVkIHRvCisgICAgICAvLyBoYXZlIGEgc2hvd24ga2V5ZnJhbWUgYmVmb3JlIGFueSBpbnRlciBmcmFtZXMsIHdoaWNoIHdvdWxkIHJlZnJlc2ggYWxsCisgICAgICAvLyB0aGUgcmVmZXJlbmNlIGJ1ZmZlcnMuIEhvd2V2ZXIsIGl0IG1pZ2h0IGJlIG51bGwgaWYgd2UncmUgc3RhcnRpbmcgaW4KKyAgICAgIC8vIHRoZSBtaWRkbGUgb2YgYSBzdHJlYW0sIGFuZCBzdGF0aWMgYW5hbHlzaXMgd2lsbCBlcnJvciBpZiB3ZSBkb24ndCBkbworICAgICAgLy8gYSBudWxsIGNoZWNrIGhlcmUuCisgICAgICBpZiAocmVmX2J1ZiA9PSBOVUxMKSB7CisgICAgICAgIGFvbV9pbnRlcm5hbF9lcnJvcigmY20tPmVycm9yLCBBT01fQ09ERUNfQ09SUlVQVF9GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGNvbmRpdGlvbjogaW52YWxpZCByZWZlcmVuY2UgYnVmZmVyIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBQSUNfQlVGRkVSX0NPTkZJRyAqY29uc3QgYnVmID0gJnJlZl9idWYtPmJ1ZjsKKyAgICAgICAgd2lkdGggPSBidWYtPnlfY3JvcF93aWR0aDsKKyAgICAgICAgaGVpZ2h0ID0gYnVmLT55X2Nyb3BfaGVpZ2h0OworICAgICAgICBjbS0+cmVuZGVyX3dpZHRoID0gYnVmLT5yZW5kZXJfd2lkdGg7CisgICAgICAgIGNtLT5yZW5kZXJfaGVpZ2h0ID0gYnVmLT5yZW5kZXJfaGVpZ2h0OworICAgICAgICBzZXR1cF9zdXBlcnJlcyhjbSwgcGFyYW1zLCAmd2lkdGgsICZoZWlnaHQpOworICAgICAgICByZXNpemVfY29udGV4dF9idWZmZXJzKGNtLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgZm91bmQgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzZXFfcGFyYW1zID0gJmNtLT5zZXFfcGFyYW1zOworICBpZiAoIWZvdW5kKSB7CisgICAgaW50IG51bV9iaXRzX3dpZHRoID0gc2VxX3BhcmFtcy0+bnVtX2JpdHNfd2lkdGg7CisgICAgaW50IG51bV9iaXRzX2hlaWdodCA9IHNlcV9wYXJhbXMtPm51bV9iaXRzX2hlaWdodDsKKworICAgIGF2MV9yZWFkX2ZyYW1lX3NpemUocGFyYW1zLCBudW1fYml0c193aWR0aCwgbnVtX2JpdHNfaGVpZ2h0LCAmd2lkdGgsICZoZWlnaHQsICZkZWNfd2lkdGgpOworI2lmZGVmIEFNTAorICAgIGNtLT5kZWNfd2lkdGggPSBkZWNfd2lkdGg7CisjZW5kaWYKKyAgICBzZXR1cF9zdXBlcnJlcyhjbSwgcGFyYW1zLCAmd2lkdGgsICZoZWlnaHQpOworICAgIHJlc2l6ZV9jb250ZXh0X2J1ZmZlcnMoY20sIHdpZHRoLCBoZWlnaHQpOworI2lmZGVmIE9SSV9DT0RFCisgICAgc2V0dXBfcmVuZGVyX3NpemUoY20sIHJiKTsKKyNlbmRpZgorICB9CisKKyAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApCisgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmcmFtZSBzaXplIik7CisKKyAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIGF0IGxlYXN0IG9uZSBvZiBmcmFtZXMgdGhhdCB0aGlzIGZyYW1lIHJlZmVyZW5jZXMKKyAgLy8gaGFzIHZhbGlkIGRpbWVuc2lvbnMuCisgIGZvciAoaSA9IExBU1RfRlJBTUU7IGkgPD0gQUxUUkVGX0ZSQU1FOyArK2kpIHsKKyAgICBjb25zdCBSZWZDbnRCdWZmZXIgKmNvbnN0IHJlZl9mcmFtZSA9IGdldF9yZWZfZnJhbWVfYnVmKGNtLCBpKTsKKyAgICBpZiAocmVmX2ZyYW1lICE9IE5VTEwpIHsKKyAgICAgIGhhc192YWxpZF9yZWZfZnJhbWUgfD0KKyAgICAgICAgdmFsaWRfcmVmX2ZyYW1lX3NpemUocmVmX2ZyYW1lLT5idWYueV9jcm9wX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZfZnJhbWUtPmJ1Zi55X2Nyb3BfaGVpZ2h0LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB9CisgIH0KKyAgaWYgKCFoYXNfdmFsaWRfcmVmX2ZyYW1lKQorICAgIGFvbV9pbnRlcm5hbF9lcnJvcigmY20tPmVycm9yLCBBT01fQ09ERUNfQ09SUlVQVF9GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIlJlZmVyZW5jZWQgZnJhbWUgaGFzIGludmFsaWQgc2l6ZSIpOworICBmb3IgKGkgPSBMQVNUX0ZSQU1FOyBpIDw9IEFMVFJFRl9GUkFNRTsgKytpKSB7CisgICAgY29uc3QgUmVmQ250QnVmZmVyICpjb25zdCByZWZfZnJhbWUgPSBnZXRfcmVmX2ZyYW1lX2J1ZihjbSwgaSk7CisgICAgaWYgKHJlZl9mcmFtZSAhPSBOVUxMKSB7CisgICAgICBpZiAoIXZhbGlkX3JlZl9mcmFtZV9pbWdfZm10KAorICAgICAgICAgICAgcmVmX2ZyYW1lLT5idWYuYml0X2RlcHRoLCByZWZfZnJhbWUtPmJ1Zi5zdWJzYW1wbGluZ194LAorICAgICAgICAgICAgcmVmX2ZyYW1lLT5idWYuc3Vic2FtcGxpbmdfeSwgc2VxX3BhcmFtcy0+Yml0X2RlcHRoLAorICAgICAgICAgICAgc2VxX3BhcmFtcy0+c3Vic2FtcGxpbmdfeCwgc2VxX3BhcmFtcy0+c3Vic2FtcGxpbmdfeSkpCisgICAgICBhb21faW50ZXJuYWxfZXJyb3IoJmNtLT5lcnJvciwgQU9NX0NPREVDX0NPUlJVUFRfRlJBTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZmVyZW5jZWQgZnJhbWUgaGFzIGluY29tcGF0aWJsZSBjb2xvciBmb3JtYXQiKTsKKyAgICB9CisgIH0KKyAgc2V0dXBfYnVmZmVyX3Bvb2woY20pOworfQorCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBtYXBfaWR4OyAgICAgICAgLy8gZnJhbWUgbWFwIGluZGV4CisgIFJlZkNudEJ1ZmZlciAqYnVmOyAgLy8gZnJhbWUgYnVmZmVyCisgIGludCBzb3J0X2lkeDsgICAgICAgLy8gaW5kZXggYmFzZWQgb24gdGhlIG9mZnNldCB0byBiZSB1c2VkIGZvciBzb3J0aW5nCit9IFJFRl9GUkFNRV9JTkZPOworCisvLyBDb21wYXJlcyB0aGUgc29ydF9pZHggZmllbGRzLiBJZiB0aGV5IGFyZSBlcXVhbCwgdGhlbiBjb21wYXJlcyB0aGUgbWFwX2lkeAorLy8gZmllbGRzIHRvIGJyZWFrIHRoZSB0aWUuIFRoaXMgZW5zdXJlcyBhIHN0YWJsZSBzb3J0Lgorc3RhdGljIGludCBjb21wYXJlX3JlZl9mcmFtZV9pbmZvKGNvbnN0IHZvaWQgKmFyZ19hLCBjb25zdCB2b2lkICphcmdfYikgeworICBjb25zdCBSRUZfRlJBTUVfSU5GTyAqaW5mb19hID0gKFJFRl9GUkFNRV9JTkZPICopYXJnX2E7CisgIGNvbnN0IFJFRl9GUkFNRV9JTkZPICppbmZvX2IgPSAoUkVGX0ZSQU1FX0lORk8gKilhcmdfYjsKKworICBjb25zdCBpbnQgc29ydF9pZHhfZGlmZiA9IGluZm9fYS0+c29ydF9pZHggLSBpbmZvX2ItPnNvcnRfaWR4OworICBpZiAoc29ydF9pZHhfZGlmZiAhPSAwKSByZXR1cm4gc29ydF9pZHhfZGlmZjsKKyAgcmV0dXJuIGluZm9fYS0+bWFwX2lkeCAtIGluZm9fYi0+bWFwX2lkeDsKK30KKworCisvKgorZm9yIGF2MV9zZXR1cF9tb3Rpb25fZmllbGQoKQorKi8KK3N0YXRpYyBpbnQgbW90aW9uX2ZpZWxkX3Byb2plY3Rpb24oQVYxX0NPTU1PTiAqY20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WX1JFRkVSRU5DRV9GUkFNRSBzdGFydF9mcmFtZSwgaW50IGRpcikgeworI2lmZGVmIE9SSV9DT0RFCisgIFRQTF9NVl9SRUYgKnRwbF9tdnNfYmFzZSA9IGNtLT50cGxfbXZzOworICBpbnQgcmVmX29mZnNldFtSRUZfRlJBTUVTXSA9IHsgMCB9OworI2VuZGlmCisgIE1WX1JFRkVSRU5DRV9GUkFNRSByZjsKKyAgY29uc3QgUmVmQ250QnVmZmVyICpjb25zdCBzdGFydF9mcmFtZV9idWYgPQorICAgICAgZ2V0X3JlZl9mcmFtZV9idWYoY20sIHN0YXJ0X2ZyYW1lKTsKKyAgaW50IHN0YXJ0X2ZyYW1lX29yZGVyX2hpbnQ7CisgIHVuc2lnbmVkIGludCBjb25zdCAqcmVmX29yZGVyX2hpbnRzOworICBpbnQgY3VyX29yZGVyX2hpbnQ7CisgIGludCBzdGFydF90b19jdXJyZW50X2ZyYW1lX29mZnNldDsKKworI2lmZGVmIEFNTAorICBpbnQgaTsKKyAgLy9hdjFfcHJpbnQyKEFWMV9ERUJVR19CVUZNR1JfREVUQUlMLCAiJCQkJCQkJCQkJCQlczpjbS0+bXZfcmVmX2lkX2luZGV4ID0gJWQsIHN0YXJ0X2ZyYW1lPSVkXG4iLCBfX2Z1bmNfXywgY20tPm12X3JlZl9pZF9pbmRleCwgc3RhcnRfZnJhbWUpOworICBjbS0+bXZfcmVmX2lkW2NtLT5tdl9yZWZfaWRfaW5kZXhdID0gc3RhcnRfZnJhbWU7CisgIGZvciAoaSA9IDA7IGkgPCBSRUZfRlJBTUVTOyBpKyspIHsKKyAgICAgIGNtLT5tdl9yZWZfb2Zmc2V0W2NtLT5tdl9yZWZfaWRfaW5kZXhdW2ldPTA7CisgIH0KKyAgY20tPm12X2NhbF90cGxfbXZzW2NtLT5tdl9yZWZfaWRfaW5kZXhdPTA7CisgIGNtLT5tdl9yZWZfaWRfaW5kZXgrKzsKKyNlbmRpZgorICBpZiAoc3RhcnRfZnJhbWVfYnVmID09IE5VTEwpIHJldHVybiAwOworCisgIGlmIChzdGFydF9mcmFtZV9idWYtPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FIHx8CisgICAgICBzdGFydF9mcmFtZV9idWYtPmZyYW1lX3R5cGUgPT0gSU5UUkFfT05MWV9GUkFNRSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoc3RhcnRfZnJhbWVfYnVmLT5taV9yb3dzICE9IGNtLT5taV9yb3dzIHx8CisgICAgICBzdGFydF9mcmFtZV9idWYtPm1pX2NvbHMgIT0gY20tPm1pX2NvbHMpCisgICAgcmV0dXJuIDA7CisKKyAgc3RhcnRfZnJhbWVfb3JkZXJfaGludCA9IHN0YXJ0X2ZyYW1lX2J1Zi0+b3JkZXJfaGludDsKKyAgcmVmX29yZGVyX2hpbnRzID0KKyAgICAgICZzdGFydF9mcmFtZV9idWYtPnJlZl9vcmRlcl9oaW50c1swXTsKKyAgY3VyX29yZGVyX2hpbnQgPSBjbS0+Y3VyX2ZyYW1lLT5vcmRlcl9oaW50OworICBzdGFydF90b19jdXJyZW50X2ZyYW1lX29mZnNldCA9IGdldF9yZWxhdGl2ZV9kaXN0KAorICAgICAgJmNtLT5zZXFfcGFyYW1zLm9yZGVyX2hpbnRfaW5mbywgc3RhcnRfZnJhbWVfb3JkZXJfaGludCwgY3VyX29yZGVyX2hpbnQpOworCisgIGZvciAocmYgPSBMQVNUX0ZSQU1FOyByZiA8PSBJTlRFUl9SRUZTX1BFUl9GUkFNRTsgKytyZikgeworICAgIGNtLT5tdl9yZWZfb2Zmc2V0W2NtLT5tdl9yZWZfaWRfaW5kZXgtMV1bcmZdID0gZ2V0X3JlbGF0aXZlX2Rpc3QoJmNtLT5zZXFfcGFyYW1zLm9yZGVyX2hpbnRfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2ZyYW1lX29yZGVyX2hpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZfb3JkZXJfaGludHNbcmYgLSBMQVNUX0ZSQU1FXSk7CisgIH0KKyNpZmRlZiBBTUwKKyAgY20tPm12X2NhbF90cGxfbXZzW2NtLT5tdl9yZWZfaWRfaW5kZXgtMV09MTsKKyNlbmRpZgorICBpZiAoZGlyID09IDIpIHN0YXJ0X3RvX2N1cnJlbnRfZnJhbWVfb2Zmc2V0ID0gLXN0YXJ0X3RvX2N1cnJlbnRfZnJhbWVfb2Zmc2V0OworI2lmZGVmIE9SSV9DT0RFCisgIE1WX1JFRiAqbXZfcmVmX2Jhc2UgPSBzdGFydF9mcmFtZV9idWYtPm12czsKKyAgY29uc3QgaW50IG12c19yb3dzID0gKGNtLT5taV9yb3dzICsgMSkgPj4gMTsKKyAgY29uc3QgaW50IG12c19jb2xzID0gKGNtLT5taV9jb2xzICsgMSkgPj4gMTsKKworICBmb3IgKGludCBibGtfcm93ID0gMDsgYmxrX3JvdyA8IG12c19yb3dzOyArK2Jsa19yb3cpIHsKKyAgICBmb3IgKGludCBibGtfY29sID0gMDsgYmxrX2NvbCA8IG12c19jb2xzOyArK2Jsa19jb2wpIHsKKyAgICAgIE1WX1JFRiAqbXZfcmVmID0gJm12X3JlZl9iYXNlW2Jsa19yb3cgKiBtdnNfY29scyArIGJsa19jb2xdOworICAgICAgTVYgZndkX212ID0gbXZfcmVmLT5tdi5hc19tdjsKKworICAgICAgaWYgKG12X3JlZi0+cmVmX2ZyYW1lID4gSU5UUkFfRlJBTUUpIHsKKyAgICAgICAgaW50X212IHRoaXNfbXY7CisgICAgICAgIGludCBtaV9yLCBtaV9jOworICAgICAgICBjb25zdCBpbnQgcmVmX2ZyYW1lX29mZnNldCA9IHJlZl9vZmZzZXRbbXZfcmVmLT5yZWZfZnJhbWVdOworCisgICAgICAgIGludCBwb3NfdmFsaWQgPQorICAgICAgICAgICAgYWJzKHJlZl9mcmFtZV9vZmZzZXQpIDw9IE1BWF9GUkFNRV9ESVNUQU5DRSAmJgorICAgICAgICAgICAgcmVmX2ZyYW1lX29mZnNldCA+IDAgJiYKKyAgICAgICAgICAgIGFicyhzdGFydF90b19jdXJyZW50X2ZyYW1lX29mZnNldCkgPD0gTUFYX0ZSQU1FX0RJU1RBTkNFOworCisgICAgICAgIGlmIChwb3NfdmFsaWQpIHsKKyAgICAgICAgICBnZXRfbXZfcHJvamVjdGlvbigmdGhpc19tdi5hc19tdiwgZndkX212LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3RvX2N1cnJlbnRfZnJhbWVfb2Zmc2V0LCByZWZfZnJhbWVfb2Zmc2V0KTsKKyAgICAgICAgICBwb3NfdmFsaWQgPSBnZXRfYmxvY2tfcG9zaXRpb24oY20sICZtaV9yLCAmbWlfYywgYmxrX3JvdywgYmxrX2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19tdi5hc19tdiwgZGlyID4+IDEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBvc192YWxpZCkgeworICAgICAgICAgIGNvbnN0IGludCBtaV9vZmZzZXQgPSBtaV9yICogKGNtLT5taV9zdHJpZGUgPj4gMSkgKyBtaV9jOworCisgICAgICAgICAgdHBsX212c19iYXNlW21pX29mZnNldF0ubWZtdjAuYXNfbXYucm93ID0gZndkX212LnJvdzsKKyAgICAgICAgICB0cGxfbXZzX2Jhc2VbbWlfb2Zmc2V0XS5tZm12MC5hc19tdi5jb2wgPSBmd2RfbXYuY29sOworICAgICAgICAgIHRwbF9tdnNfYmFzZVttaV9vZmZzZXRdLnJlZl9mcmFtZV9vZmZzZXQgPSByZWZfZnJhbWVfb2Zmc2V0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKKyAgcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBBTUwKK3N0YXRpYyBpbnQgc2V0dXBfbW90aW9uX2ZpZWxkX2RlYnVnX2NvdW50ID0gMDsKKyNlbmRpZgordm9pZCBhdjFfc2V0dXBfbW90aW9uX2ZpZWxkKEFWMV9DT01NT04gKmNtKSB7CisgIGNvbnN0IE9yZGVySGludEluZm8gKmNvbnN0IG9yZGVyX2hpbnRfaW5mbyA9ICZjbS0+c2VxX3BhcmFtcy5vcmRlcl9oaW50X2luZm87CisgIGludCByZWZfZnJhbWU7CisgIGludCBzaXplOworICBpbnQgY3VyX29yZGVyX2hpbnQ7CisgIGNvbnN0IFJlZkNudEJ1ZmZlciAqcmVmX2J1ZltJTlRFUl9SRUZTX1BFUl9GUkFNRV07CisgIGludCByZWZfb3JkZXJfaGludFtJTlRFUl9SRUZTX1BFUl9GUkFNRV07CisgIGludCByZWZfc3RhbXA7CisgIG1lbXNldChjbS0+cmVmX2ZyYW1lX3NpZGUsIDAsIHNpemVvZihjbS0+cmVmX2ZyYW1lX3NpZGUpKTsKKyAgaWYgKCFvcmRlcl9oaW50X2luZm8tPmVuYWJsZV9vcmRlcl9oaW50KSByZXR1cm47CisjaWZkZWYgT1JJX0NPREUKKyAgVFBMX01WX1JFRiAqdHBsX212c19iYXNlID0gY20tPnRwbF9tdnM7CisjZW5kaWYKKyAgc2l6ZSA9ICgoY20tPm1pX3Jvd3MgKyBNQVhfTUlCX1NJWkUpID4+IDEpICogKGNtLT5taV9zdHJpZGUgPj4gMSk7CisjaWZkZWYgT1JJX0NPREUKKyAgZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgc2l6ZTsgKytpZHgpIHsKKyAgICB0cGxfbXZzX2Jhc2VbaWR4XS5tZm12MC5hc19pbnQgPSBJTlZBTElEX01WOworICAgIHRwbF9tdnNfYmFzZVtpZHhdLnJlZl9mcmFtZV9vZmZzZXQgPSAwOworICB9CisjZW5kaWYKKyAgY3VyX29yZGVyX2hpbnQgPSBjbS0+Y3VyX2ZyYW1lLT5vcmRlcl9oaW50OworCisgIGZvciAocmVmX2ZyYW1lID0gTEFTVF9GUkFNRTsgcmVmX2ZyYW1lIDw9IEFMVFJFRl9GUkFNRTsgcmVmX2ZyYW1lKyspIHsKKyAgICBjb25zdCBpbnQgcmVmX2lkeCA9IHJlZl9mcmFtZSAtIExBU1RfRlJBTUU7CisgICAgY29uc3QgUmVmQ250QnVmZmVyICpjb25zdCBidWYgPSBnZXRfcmVmX2ZyYW1lX2J1ZihjbSwgcmVmX2ZyYW1lKTsKKyAgICBpbnQgb3JkZXJfaGludCA9IDA7CisKKyAgICBpZiAoYnVmICE9IE5VTEwpIG9yZGVyX2hpbnQgPSBidWYtPm9yZGVyX2hpbnQ7CisKKyAgICByZWZfYnVmW3JlZl9pZHhdID0gYnVmOworICAgIHJlZl9vcmRlcl9oaW50W3JlZl9pZHhdID0gb3JkZXJfaGludDsKKworICAgIGlmIChnZXRfcmVsYXRpdmVfZGlzdChvcmRlcl9oaW50X2luZm8sIG9yZGVyX2hpbnQsIGN1cl9vcmRlcl9oaW50KSA+IDApCisgICAgICBjbS0+cmVmX2ZyYW1lX3NpZGVbcmVmX2ZyYW1lXSA9IDE7CisgICAgZWxzZSBpZiAob3JkZXJfaGludCA9PSBjdXJfb3JkZXJfaGludCkKKyAgICAgIGNtLT5yZWZfZnJhbWVfc2lkZVtyZWZfZnJhbWVdID0gLTE7CisgIH0KKyAgcmVmX3N0YW1wID0gTUZNVl9TVEFDS19TSVpFIC0gMTsKKyNpZmRlZiBBTUwKKyAgY20tPm12X3JlZl9pZF9pbmRleCA9IDA7CisgIGF2MV9wcmludDIoQVYxX0RFQlVHX0JVRk1HUl9ERVRBSUwsICIlcyglZCkgbWlfY29scyAlZCBtaV9yb3dzICVkXG4iLAorICAgICAgX19mdW5jX18sIHNldHVwX21vdGlvbl9maWVsZF9kZWJ1Z19jb3VudCsrLAorICAgICAgY20tPm1pX2NvbHMsCisgICAgICBjbS0+bWlfcm93cworICAgICAgKTsKKyNlbmRpZgorICBpZiAocmVmX2J1ZltMQVNUX0ZSQU1FIC0gTEFTVF9GUkFNRV0gIT0gTlVMTCkgeworICAgIGNvbnN0IGludCBhbHRfb2ZfbHN0X29yZGVyX2hpbnQgPQorICAgICAgICByZWZfYnVmW0xBU1RfRlJBTUUgLSBMQVNUX0ZSQU1FXQorICAgICAgICAgICAgLT5yZWZfb3JkZXJfaGludHNbQUxUUkVGX0ZSQU1FIC0gTEFTVF9GUkFNRV07CisKKyAgICBjb25zdCBpbnQgaXNfbHN0X292ZXJsYXkgPQorICAgICAgICAoYWx0X29mX2xzdF9vcmRlcl9oaW50ID09IHJlZl9vcmRlcl9oaW50W0dPTERFTl9GUkFNRSAtIExBU1RfRlJBTUVdKTsKKyAgICBpZiAoIWlzX2xzdF9vdmVybGF5KSBtb3Rpb25fZmllbGRfcHJvamVjdGlvbihjbSwgTEFTVF9GUkFNRSwgMik7CisgICAgLS1yZWZfc3RhbXA7CisgIH0KKworICBpZiAoZ2V0X3JlbGF0aXZlX2Rpc3Qob3JkZXJfaGludF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVmX29yZGVyX2hpbnRbQldEUkVGX0ZSQU1FIC0gTEFTVF9GUkFNRV0sCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJfb3JkZXJfaGludCkgPiAwKSB7CisgICAgaWYgKG1vdGlvbl9maWVsZF9wcm9qZWN0aW9uKGNtLCBCV0RSRUZfRlJBTUUsIDApKSAtLXJlZl9zdGFtcDsKKyAgfQorCisgIGlmIChnZXRfcmVsYXRpdmVfZGlzdChvcmRlcl9oaW50X2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICByZWZfb3JkZXJfaGludFtBTFRSRUYyX0ZSQU1FIC0gTEFTVF9GUkFNRV0sCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJfb3JkZXJfaGludCkgPiAwKSB7CisgICAgaWYgKG1vdGlvbl9maWVsZF9wcm9qZWN0aW9uKGNtLCBBTFRSRUYyX0ZSQU1FLCAwKSkgLS1yZWZfc3RhbXA7CisgIH0KKworICBpZiAoZ2V0X3JlbGF0aXZlX2Rpc3Qob3JkZXJfaGludF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVmX29yZGVyX2hpbnRbQUxUUkVGX0ZSQU1FIC0gTEFTVF9GUkFNRV0sCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJfb3JkZXJfaGludCkgPiAwICYmCisgICAgICByZWZfc3RhbXAgPj0gMCkKKyAgICBpZiAobW90aW9uX2ZpZWxkX3Byb2plY3Rpb24oY20sIEFMVFJFRl9GUkFNRSwgMCkpIC0tcmVmX3N0YW1wOworCisgIGlmIChyZWZfc3RhbXAgPj0gMCkgbW90aW9uX2ZpZWxkX3Byb2plY3Rpb24oY20sIExBU1QyX0ZSQU1FLCAyKTsKK30KKworCitzdGF0aWMgdm9pZCBzZXRfcmVmX2ZyYW1lX2luZm8oaW50ICpyZW1hcHBlZF9yZWZfaWR4LCBpbnQgZnJhbWVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRl9GUkFNRV9JTkZPICpyZWZfaW5mbykgeworICBhc3NlcnQoZnJhbWVfaWR4ID49IDAgJiYgZnJhbWVfaWR4IDwgSU5URVJfUkVGU19QRVJfRlJBTUUpOworCisgIHJlbWFwcGVkX3JlZl9pZHhbZnJhbWVfaWR4XSA9IHJlZl9pbmZvLT5tYXBfaWR4OworICBhdjFfcHJpbnQyKEFWMV9ERUJVR19CVUZNR1JfREVUQUlMLCAiKysrKysrKysrKysrKyVzOnJlbWFwcGVkX3JlZl9pZHhbJWRdPTB4JXhcbiIsIF9fZnVuY19fLCBmcmFtZV9pZHgsIHJlZl9pbmZvLT5tYXBfaWR4KTsKK30KKworCit2b2lkIGF2MV9zZXRfZnJhbWVfcmVmcyhBVjFfQ09NTU9OICpjb25zdCBjbSwgaW50ICpyZW1hcHBlZF9yZWZfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxzdF9tYXBfaWR4LCBpbnQgZ2xkX21hcF9pZHgpIHsKKyAgaW50IGxzdF9mcmFtZV9zb3J0X2lkeCA9IC0xOworICBpbnQgZ2xkX2ZyYW1lX3NvcnRfaWR4ID0gLTE7CisgIGludCBpOworICAvL2Fzc2VydChjbS0+c2VxX3BhcmFtcy5vcmRlcl9oaW50X2luZm8uZW5hYmxlX29yZGVyX2hpbnQpOworICAvL2Fzc2VydChjbS0+c2VxX3BhcmFtcy5vcmRlcl9oaW50X2luZm8ub3JkZXJfaGludF9iaXRzX21pbnVzXzEgPj0gMCk7CisgIGNvbnN0IGludCBjdXJfb3JkZXJfaGludCA9IChpbnQpY20tPmN1cnJlbnRfZnJhbWUub3JkZXJfaGludDsKKyAgY29uc3QgaW50IGN1cl9mcmFtZV9zb3J0X2lkeCA9CisgICAgICAxIDw8IGNtLT5zZXFfcGFyYW1zLm9yZGVyX2hpbnRfaW5mby5vcmRlcl9oaW50X2JpdHNfbWludXNfMTsKKworICBSRUZfRlJBTUVfSU5GTyByZWZfZnJhbWVfaW5mb1tSRUZfRlJBTUVTXTsKKyAgaW50IHJlZl9mbGFnX2xpc3RbSU5URVJfUkVGU19QRVJfRlJBTUVdID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CisgIGludCBid2Rfc3RhcnRfaWR4OworICBpbnQgYndkX2VuZF9pZHg7CisgIGludCBmd2Rfc3RhcnRfaWR4LCBmd2RfZW5kX2lkeDsKKyAgaW50IHJlZl9pZHg7CisgIHN0YXRpYyBjb25zdCBNVl9SRUZFUkVOQ0VfRlJBTUUgcmVmX2ZyYW1lX2xpc3RbSU5URVJfUkVGU19QRVJfRlJBTUUgLSAyXSA9IHsKKyAgICBMQVNUMl9GUkFNRSwgTEFTVDNfRlJBTUUsIEJXRFJFRl9GUkFNRSwgQUxUUkVGMl9GUkFNRSwgQUxUUkVGX0ZSQU1FCisgIH07CisKKyAgZm9yIChpID0gMDsgaSA8IFJFRl9GUkFNRVM7ICsraSkgeworICAgIGNvbnN0IGludCBtYXBfaWR4ID0gaTsKKyAgICBSZWZDbnRCdWZmZXIgKmJ1ZjsKKyAgICBpbnQgb2Zmc2V0OworCisgICAgcmVmX2ZyYW1lX2luZm9baV0ubWFwX2lkeCA9IG1hcF9pZHg7CisgICAgcmVmX2ZyYW1lX2luZm9baV0uc29ydF9pZHggPSAtMTsKKworICAgIGJ1ZiA9IGNtLT5yZWZfZnJhbWVfbWFwW21hcF9pZHhdOworICAgIHJlZl9mcmFtZV9pbmZvW2ldLmJ1ZiA9IGJ1ZjsKKworICAgIGlmIChidWYgPT0gTlVMTCkgY29udGludWU7CisgICAgLy8gSWYgdGhpcyBhc3NlcnRpb24gZmFpbHMsIHRoZXJlIGlzIGEgcmVmZXJlbmNlIGxlYWsuCisgICAgYXNzZXJ0KGJ1Zi0+cmVmX2NvdW50ID4gMCk7CisKKyAgICBvZmZzZXQgPSAoaW50KWJ1Zi0+b3JkZXJfaGludDsKKyAgICByZWZfZnJhbWVfaW5mb1tpXS5zb3J0X2lkeCA9CisgICAgICAgIChvZmZzZXQgPT0gLTEpID8gLTEKKyAgICAgICAgICAgICAgICAgICAgICAgOiBjdXJfZnJhbWVfc29ydF9pZHggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcmVsYXRpdmVfZGlzdCgmY20tPnNlcV9wYXJhbXMub3JkZXJfaGludF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIGN1cl9vcmRlcl9oaW50KTsKKyAgICBhc3NlcnQocmVmX2ZyYW1lX2luZm9baV0uc29ydF9pZHggPj0gLTEpOworCisgICAgaWYgKG1hcF9pZHggPT0gbHN0X21hcF9pZHgpIGxzdF9mcmFtZV9zb3J0X2lkeCA9IHJlZl9mcmFtZV9pbmZvW2ldLnNvcnRfaWR4OworICAgIGlmIChtYXBfaWR4ID09IGdsZF9tYXBfaWR4KSBnbGRfZnJhbWVfc29ydF9pZHggPSByZWZfZnJhbWVfaW5mb1tpXS5zb3J0X2lkeDsKKyAgfQorCisgIC8vIENvbmZpcm0gYm90aCBMQVNUX0ZSQU1FIGFuZCBHT0xERU5fRlJBTUUgYXJlIHZhbGlkIGZvcndhcmQgcmVmZXJlbmNlCisgIC8vIGZyYW1lcy4KKyAgaWYgKGxzdF9mcmFtZV9zb3J0X2lkeCA9PSAtMSB8fCBsc3RfZnJhbWVfc29ydF9pZHggPj0gY3VyX2ZyYW1lX3NvcnRfaWR4KSB7CisgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXIgZnJhbWUgcmVxdWVzdHMgYSBsb29rLWFoZWFkIGZyYW1lIGFzIExBU1QiKTsKKyAgfQorICBpZiAoZ2xkX2ZyYW1lX3NvcnRfaWR4ID09IC0xIHx8IGdsZF9mcmFtZV9zb3J0X2lkeCA+PSBjdXJfZnJhbWVfc29ydF9pZHgpIHsKKyAgICBhb21faW50ZXJuYWxfZXJyb3IoJmNtLT5lcnJvciwgQU9NX0NPREVDX0NPUlJVUFRfRlJBTUUsCisgICAgICAgICAgICAgICAgICAgICAgICJJbnRlciBmcmFtZSByZXF1ZXN0cyBhIGxvb2stYWhlYWQgZnJhbWUgYXMgR09MREVOIik7CisgIH0KKworICAvLyBTb3J0IHJlZiBmcmFtZXMgYmFzZWQgb24gdGhlaXIgZnJhbWVfb2Zmc2V0IHZhbHVlcy4KKyAgcXNvcnQocmVmX2ZyYW1lX2luZm8sIFJFRl9GUkFNRVMsIHNpemVvZihSRUZfRlJBTUVfSU5GTyksCisgICAgICAgIGNvbXBhcmVfcmVmX2ZyYW1lX2luZm8pOworCisgIC8vIElkZW50aWZ5IGZvcndhcmQgYW5kIGJhY2t3YXJkIHJlZmVyZW5jZSBmcmFtZXMuCisgIC8vIEZvcndhcmQgIHJlZmVyZW5jZTogb2Zmc2V0IDwgb3JkZXJfaGludAorICAvLyBCYWNrd2FyZCByZWZlcmVuY2U6IG9mZnNldCA+PSBvcmRlcl9oaW50CisgIGZ3ZF9zdGFydF9pZHggPSAwOworICBmd2RfZW5kX2lkeCA9IFJFRl9GUkFNRVMgLSAxOworCisgIGZvciAoaSA9IDA7IGkgPCBSRUZfRlJBTUVTOyBpKyspIHsKKyAgICBpZiAocmVmX2ZyYW1lX2luZm9baV0uc29ydF9pZHggPT0gLTEpIHsKKyAgICAgIGZ3ZF9zdGFydF9pZHgrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChyZWZfZnJhbWVfaW5mb1tpXS5zb3J0X2lkeCA+PSBjdXJfZnJhbWVfc29ydF9pZHgpIHsKKyAgICAgIGZ3ZF9lbmRfaWR4ID0gaSAtIDE7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBid2Rfc3RhcnRfaWR4ID0gZndkX2VuZF9pZHggKyAxOworICBid2RfZW5kX2lkeCA9IFJFRl9GUkFNRVMgLSAxOworCisgIC8vID09PSBCYWNrd2FyZCBSZWZlcmVuY2UgRnJhbWVzID09PQorCisgIC8vID09IEFMVFJFRl9GUkFNRSA9PQorICBpZiAoYndkX3N0YXJ0X2lkeCA8PSBid2RfZW5kX2lkeCkgeworICAgIHNldF9yZWZfZnJhbWVfaW5mbyhyZW1hcHBlZF9yZWZfaWR4LCBBTFRSRUZfRlJBTUUgLSBMQVNUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAmcmVmX2ZyYW1lX2luZm9bYndkX2VuZF9pZHhdKTsKKyAgICByZWZfZmxhZ19saXN0W0FMVFJFRl9GUkFNRSAtIExBU1RfRlJBTUVdID0gMTsKKyAgICBid2RfZW5kX2lkeC0tOworICB9CisKKyAgLy8gPT0gQldEUkVGX0ZSQU1FID09CisgIGlmIChid2Rfc3RhcnRfaWR4IDw9IGJ3ZF9lbmRfaWR4KSB7CisgICAgc2V0X3JlZl9mcmFtZV9pbmZvKHJlbWFwcGVkX3JlZl9pZHgsIEJXRFJFRl9GUkFNRSAtIExBU1RfRlJBTUUsCisgICAgICAgICAgICAgICAgICAgICAgICZyZWZfZnJhbWVfaW5mb1tid2Rfc3RhcnRfaWR4XSk7CisgICAgcmVmX2ZsYWdfbGlzdFtCV0RSRUZfRlJBTUUgLSBMQVNUX0ZSQU1FXSA9IDE7CisgICAgYndkX3N0YXJ0X2lkeCsrOworICB9CisKKyAgLy8gPT0gQUxUUkVGMl9GUkFNRSA9PQorICBpZiAoYndkX3N0YXJ0X2lkeCA8PSBid2RfZW5kX2lkeCkgeworICAgIHNldF9yZWZfZnJhbWVfaW5mbyhyZW1hcHBlZF9yZWZfaWR4LCBBTFRSRUYyX0ZSQU1FIC0gTEFTVF9GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgJnJlZl9mcmFtZV9pbmZvW2J3ZF9zdGFydF9pZHhdKTsKKyAgICByZWZfZmxhZ19saXN0W0FMVFJFRjJfRlJBTUUgLSBMQVNUX0ZSQU1FXSA9IDE7CisgIH0KKworICAvLyA9PT0gRm9yd2FyZCBSZWZlcmVuY2UgRnJhbWVzID09PQorCisgIGZvciAoaSA9IGZ3ZF9zdGFydF9pZHg7IGkgPD0gZndkX2VuZF9pZHg7ICsraSkgeworICAgIC8vID09IExBU1RfRlJBTUUgPT0KKyAgICBpZiAocmVmX2ZyYW1lX2luZm9baV0ubWFwX2lkeCA9PSBsc3RfbWFwX2lkeCkgeworICAgICAgc2V0X3JlZl9mcmFtZV9pbmZvKHJlbWFwcGVkX3JlZl9pZHgsIExBU1RfRlJBTUUgLSBMQVNUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZfZnJhbWVfaW5mb1tpXSk7CisgICAgICByZWZfZmxhZ19saXN0W0xBU1RfRlJBTUUgLSBMQVNUX0ZSQU1FXSA9IDE7CisgICAgfQorCisgICAgLy8gPT0gR09MREVOX0ZSQU1FID09CisgICAgaWYgKHJlZl9mcmFtZV9pbmZvW2ldLm1hcF9pZHggPT0gZ2xkX21hcF9pZHgpIHsKKyAgICAgIHNldF9yZWZfZnJhbWVfaW5mbyhyZW1hcHBlZF9yZWZfaWR4LCBHT0xERU5fRlJBTUUgLSBMQVNUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZfZnJhbWVfaW5mb1tpXSk7CisgICAgICByZWZfZmxhZ19saXN0W0dPTERFTl9GUkFNRSAtIExBU1RfRlJBTUVdID0gMTsKKyAgICB9CisgIH0KKworICBhc3NlcnQocmVmX2ZsYWdfbGlzdFtMQVNUX0ZSQU1FIC0gTEFTVF9GUkFNRV0gPT0gMSAmJgorICAgICAgICAgcmVmX2ZsYWdfbGlzdFtHT0xERU5fRlJBTUUgLSBMQVNUX0ZSQU1FXSA9PSAxKTsKKworICAvLyA9PSBMQVNUMl9GUkFNRSA9PQorICAvLyA9PSBMQVNUM19GUkFNRSA9PQorICAvLyA9PSBCV0RSRUZfRlJBTUUgPT0KKyAgLy8gPT0gQUxUUkVGMl9GUkFNRSA9PQorICAvLyA9PSBBTFRSRUZfRlJBTUUgPT0KKworICAvLyBTZXQgdXAgdGhlIHJlZmVyZW5jZSBmcmFtZXMgaW4gdGhlIGFudGktY2hyb25vbG9naWNhbCBvcmRlci4KKyAgZm9yIChyZWZfaWR4ID0gMDsgcmVmX2lkeCA8IChJTlRFUl9SRUZTX1BFUl9GUkFNRSAtIDIpOyByZWZfaWR4KyspIHsKKyAgICBjb25zdCBNVl9SRUZFUkVOQ0VfRlJBTUUgcmVmX2ZyYW1lID0gcmVmX2ZyYW1lX2xpc3RbcmVmX2lkeF07CisKKyAgICBpZiAocmVmX2ZsYWdfbGlzdFtyZWZfZnJhbWUgLSBMQVNUX0ZSQU1FXSA9PSAxKSBjb250aW51ZTsKKworICAgIHdoaWxlIChmd2Rfc3RhcnRfaWR4IDw9IGZ3ZF9lbmRfaWR4ICYmCisgICAgICAgICAgIChyZWZfZnJhbWVfaW5mb1tmd2RfZW5kX2lkeF0ubWFwX2lkeCA9PSBsc3RfbWFwX2lkeCB8fAorICAgICAgICAgICAgcmVmX2ZyYW1lX2luZm9bZndkX2VuZF9pZHhdLm1hcF9pZHggPT0gZ2xkX21hcF9pZHgpKSB7CisgICAgICBmd2RfZW5kX2lkeC0tOworICAgIH0KKyAgICBpZiAoZndkX3N0YXJ0X2lkeCA+IGZ3ZF9lbmRfaWR4KSBicmVhazsKKworICAgIHNldF9yZWZfZnJhbWVfaW5mbyhyZW1hcHBlZF9yZWZfaWR4LCByZWZfZnJhbWUgLSBMQVNUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAmcmVmX2ZyYW1lX2luZm9bZndkX2VuZF9pZHhdKTsKKyAgICByZWZfZmxhZ19saXN0W3JlZl9mcmFtZSAtIExBU1RfRlJBTUVdID0gMTsKKworICAgIGZ3ZF9lbmRfaWR4LS07CisgIH0KKworICAvLyBBc3NpZ24gYWxsIHRoZSByZW1haW5pbmcgZnJhbWUocyksIGlmIGFueSwgdG8gdGhlIGVhcmxpZXN0IHJlZmVyZW5jZSBmcmFtZS4KKyAgZm9yICg7IHJlZl9pZHggPCAoSU5URVJfUkVGU19QRVJfRlJBTUUgLSAyKTsgcmVmX2lkeCsrKSB7CisgICAgY29uc3QgTVZfUkVGRVJFTkNFX0ZSQU1FIHJlZl9mcmFtZSA9IHJlZl9mcmFtZV9saXN0W3JlZl9pZHhdOworICAgIGlmIChyZWZfZmxhZ19saXN0W3JlZl9mcmFtZSAtIExBU1RfRlJBTUVdID09IDEpIGNvbnRpbnVlOworICAgIHNldF9yZWZfZnJhbWVfaW5mbyhyZW1hcHBlZF9yZWZfaWR4LCByZWZfZnJhbWUgLSBMQVNUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAmcmVmX2ZyYW1lX2luZm9bZndkX3N0YXJ0X2lkeF0pOworICAgIHJlZl9mbGFnX2xpc3RbcmVmX2ZyYW1lIC0gTEFTVF9GUkFNRV0gPSAxOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IElOVEVSX1JFRlNfUEVSX0ZSQU1FOyBpKyspIHsKKyAgICBhc3NlcnQocmVmX2ZsYWdfbGlzdFtpXSA9PSAxKTsKKyAgfQorfQorCit2b2lkIGF2MV9zZXR1cF9mcmFtZV9idWZfcmVmcyhBVjFfQ09NTU9OICpjbSkgeworICBNVl9SRUZFUkVOQ0VfRlJBTUUgcmVmX2ZyYW1lOworICBjbS0+Y3VyX2ZyYW1lLT5vcmRlcl9oaW50ID0gY20tPmN1cnJlbnRfZnJhbWUub3JkZXJfaGludDsKKworICBmb3IgKHJlZl9mcmFtZSA9IExBU1RfRlJBTUU7IHJlZl9mcmFtZSA8PSBBTFRSRUZfRlJBTUU7ICsrcmVmX2ZyYW1lKSB7CisgICAgY29uc3QgUmVmQ250QnVmZmVyICpjb25zdCBidWYgPSBnZXRfcmVmX2ZyYW1lX2J1ZihjbSwgcmVmX2ZyYW1lKTsKKyAgICBpZiAoYnVmICE9IE5VTEwpCisgICAgICBjbS0+Y3VyX2ZyYW1lLT5yZWZfb3JkZXJfaGludHNbcmVmX2ZyYW1lIC0gTEFTVF9GUkFNRV0gPSBidWYtPm9yZGVyX2hpbnQ7CisgIH0KK30KKwordm9pZCBhdjFfc2V0dXBfZnJhbWVfc2lnbl9iaWFzKEFWMV9DT01NT04gKmNtKSB7CisgIE1WX1JFRkVSRU5DRV9GUkFNRSByZWZfZnJhbWU7CisgIGZvciAocmVmX2ZyYW1lID0gTEFTVF9GUkFNRTsgcmVmX2ZyYW1lIDw9IEFMVFJFRl9GUkFNRTsgKytyZWZfZnJhbWUpIHsKKyAgICBjb25zdCBSZWZDbnRCdWZmZXIgKmNvbnN0IGJ1ZiA9IGdldF9yZWZfZnJhbWVfYnVmKGNtLCByZWZfZnJhbWUpOworICAgIGlmIChjbS0+c2VxX3BhcmFtcy5vcmRlcl9oaW50X2luZm8uZW5hYmxlX29yZGVyX2hpbnQgJiYgYnVmICE9IE5VTEwpIHsKKyAgICAgIGNvbnN0IGludCByZWZfb3JkZXJfaGludCA9IGJ1Zi0+b3JkZXJfaGludDsKKyAgICAgIGNtLT5yZWZfZnJhbWVfc2lnbl9iaWFzW3JlZl9mcmFtZV0gPQorICAgICAgICAgIChnZXRfcmVsYXRpdmVfZGlzdCgmY20tPnNlcV9wYXJhbXMub3JkZXJfaGludF9pbmZvLCByZWZfb3JkZXJfaGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCljbS0+Y3VycmVudF9mcmFtZS5vcmRlcl9oaW50KSA8PSAwKQorICAgICAgICAgICAgICA/IDAKKyAgICAgICAgICAgICAgOiAxOworICAgIH0gZWxzZSB7CisgICAgICBjbS0+cmVmX2ZyYW1lX3NpZ25fYmlhc1tyZWZfZnJhbWVdID0gMDsKKyAgICB9CisgIH0KK30KKworCit2b2lkIGF2MV9zZXR1cF9za2lwX21vZGVfYWxsb3dlZChBVjFfQ09NTU9OICpjbSkKK3sKKwljb25zdCBPcmRlckhpbnRJbmZvICpjb25zdCBvcmRlcl9oaW50X2luZm8gPSAmY20tPnNlcV9wYXJhbXMub3JkZXJfaGludF9pbmZvOworCVNraXBNb2RlSW5mbyAqY29uc3Qgc2tpcF9tb2RlX2luZm8gPSAmY20tPmN1cnJlbnRfZnJhbWUuc2tpcF9tb2RlX2luZm87CisJaW50IGk7CisJaW50IGN1cl9vcmRlcl9oaW50OworCWludCByZWZfb3JkZXJfaGludHNbMl0gPSB7IC0xLCBJTlRfTUFYIH07CisJaW50IHJlZl9pZHhbMl0gPSB7IElOVkFMSURfSURYLCBJTlZBTElEX0lEWCB9OworCisJc2tpcF9tb2RlX2luZm8tPnNraXBfbW9kZV9hbGxvd2VkID0gMDsKKwlza2lwX21vZGVfaW5mby0+cmVmX2ZyYW1lX2lkeF8wID0gSU5WQUxJRF9JRFg7CisJc2tpcF9tb2RlX2luZm8tPnJlZl9mcmFtZV9pZHhfMSA9IElOVkFMSURfSURYOworCWF2MV9wcmludDIoQVYxX0RFQlVHX0JVRk1HUl9ERVRBSUwsICJhdjFfc2V0dXBfc2tpcF9tb2RlX2FsbG93ZWQgJWQgJWQgJWRcbiIsIG9yZGVyX2hpbnRfaW5mby0+ZW5hYmxlX29yZGVyX2hpbnQsCisJCWZyYW1lX2lzX2ludHJhX29ubHkoY20pLAorCQljbS0+Y3VycmVudF9mcmFtZS5yZWZlcmVuY2VfbW9kZSk7CisJaWYgKCFvcmRlcl9oaW50X2luZm8tPmVuYWJsZV9vcmRlcl9oaW50IHx8IGZyYW1lX2lzX2ludHJhX29ubHkoY20pIHx8CisJCWNtLT5jdXJyZW50X2ZyYW1lLnJlZmVyZW5jZV9tb2RlID09IFNJTkdMRV9SRUZFUkVOQ0UpCisJCXJldHVybjsKKworCWN1cl9vcmRlcl9oaW50ID0gY20tPmN1cnJlbnRfZnJhbWUub3JkZXJfaGludDsKKworCS8vIElkZW50aWZ5IHRoZSBuZWFyZXN0IGZvcndhcmQgYW5kIGJhY2t3YXJkIHJlZmVyZW5jZXMuCisJZm9yIChpID0gMDsgaSA8IElOVEVSX1JFRlNfUEVSX0ZSQU1FOyArK2kpIHsKKwkJY29uc3QgUmVmQ250QnVmZmVyICpjb25zdCBidWYgPSBnZXRfcmVmX2ZyYW1lX2J1ZihjbSwgTEFTVF9GUkFNRSArIGkpOworCQlpbnQgcmVmX29yZGVyX2hpbnQ7CisJCWlmIChidWYgPT0gTlVMTCkgY29udGludWU7CisKKwkJcmVmX29yZGVyX2hpbnQgPSBidWYtPm9yZGVyX2hpbnQ7CisJCWlmIChnZXRfcmVsYXRpdmVfZGlzdChvcmRlcl9oaW50X2luZm8sIHJlZl9vcmRlcl9oaW50LCBjdXJfb3JkZXJfaGludCkgPCAwKSB7CisJCQkvLyBGb3J3YXJkIHJlZmVyZW5jZQorCQkJaWYgKHJlZl9vcmRlcl9oaW50c1swXSA9PSAtMSB8fAorCQkJCWdldF9yZWxhdGl2ZV9kaXN0KG9yZGVyX2hpbnRfaW5mbywgcmVmX29yZGVyX2hpbnQsCisJCQkJcmVmX29yZGVyX2hpbnRzWzBdKSA+IDApIHsKKwkJCQlyZWZfb3JkZXJfaGludHNbMF0gPSByZWZfb3JkZXJfaGludDsKKwkJCQlyZWZfaWR4WzBdID0gaTsKKwkJCX0KKwkJfSBlbHNlIGlmIChnZXRfcmVsYXRpdmVfZGlzdChvcmRlcl9oaW50X2luZm8sIHJlZl9vcmRlcl9oaW50LAorCQljdXJfb3JkZXJfaGludCkgPiAwKSB7CisJCQkvLyBCYWNrd2FyZCByZWZlcmVuY2UKKwkJCWlmIChyZWZfb3JkZXJfaGludHNbMV0gPT0gSU5UX01BWCB8fAorCQkJCWdldF9yZWxhdGl2ZV9kaXN0KG9yZGVyX2hpbnRfaW5mbywgcmVmX29yZGVyX2hpbnQsCisJCQkJcmVmX29yZGVyX2hpbnRzWzFdKSA8IDApIHsKKwkJCQlyZWZfb3JkZXJfaGludHNbMV0gPSByZWZfb3JkZXJfaGludDsKKwkJCQlyZWZfaWR4WzFdID0gaTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChyZWZfaWR4WzBdICE9IElOVkFMSURfSURYICYmIHJlZl9pZHhbMV0gIT0gSU5WQUxJRF9JRFgpIHsKKwkJLy8gPT0gQmktZGlyZWN0aW9uYWwgcHJlZGljdGlvbiA9PQorCQlza2lwX21vZGVfaW5mby0+c2tpcF9tb2RlX2FsbG93ZWQgPSAxOworCQlza2lwX21vZGVfaW5mby0+cmVmX2ZyYW1lX2lkeF8wID0gQU9NTUlOKHJlZl9pZHhbMF0sIHJlZl9pZHhbMV0pOworCQlza2lwX21vZGVfaW5mby0+cmVmX2ZyYW1lX2lkeF8xID0gQU9NTUFYKHJlZl9pZHhbMF0sIHJlZl9pZHhbMV0pOworCX0gZWxzZSBpZiAocmVmX2lkeFswXSAhPSBJTlZBTElEX0lEWCAmJiByZWZfaWR4WzFdID09IElOVkFMSURfSURYKSB7CisJCS8vID09IEZvcndhcmQgcHJlZGljdGlvbiBvbmx5ID09CisJCS8vIElkZW50aWZ5IHRoZSBzZWNvbmQgbmVhcmVzdCBmb3J3YXJkIHJlZmVyZW5jZS4KKwkJcmVmX29yZGVyX2hpbnRzWzFdID0gLTE7CisJCWZvciAoaSA9IDA7IGkgPCBJTlRFUl9SRUZTX1BFUl9GUkFNRTsgKytpKSB7CisJCQljb25zdCBSZWZDbnRCdWZmZXIgKmNvbnN0IGJ1ZiA9IGdldF9yZWZfZnJhbWVfYnVmKGNtLCBMQVNUX0ZSQU1FICsgaSk7CisJCQlpbnQgcmVmX29yZGVyX2hpbnQ7CisJCQlpZiAoYnVmID09IE5VTEwpIGNvbnRpbnVlOworCisJCQlyZWZfb3JkZXJfaGludCA9IGJ1Zi0+b3JkZXJfaGludDsKKwkJCWlmICgocmVmX29yZGVyX2hpbnRzWzBdICE9IC0xICYmCisJCQlnZXRfcmVsYXRpdmVfZGlzdChvcmRlcl9oaW50X2luZm8sIHJlZl9vcmRlcl9oaW50LCByZWZfb3JkZXJfaGludHNbMF0pIDwgMCkgJiYKKwkJCShyZWZfb3JkZXJfaGludHNbMV0gPT0gLTEgfHwKKwkJCWdldF9yZWxhdGl2ZV9kaXN0KG9yZGVyX2hpbnRfaW5mbywgcmVmX29yZGVyX2hpbnQsIHJlZl9vcmRlcl9oaW50c1sxXSkgPiAwKSkgeworCQkJCS8vIFNlY29uZCBjbG9zZXN0IGZvcndhcmQgcmVmZXJlbmNlCisJCQkJcmVmX29yZGVyX2hpbnRzWzFdID0gcmVmX29yZGVyX2hpbnQ7CisJCQkJcmVmX2lkeFsxXSA9IGk7CisJCQl9CisJCX0KKwkJaWYgKHJlZl9vcmRlcl9oaW50c1sxXSAhPSAtMSkgeworCQkJc2tpcF9tb2RlX2luZm8tPnNraXBfbW9kZV9hbGxvd2VkID0gMTsKKwkJCXNraXBfbW9kZV9pbmZvLT5yZWZfZnJhbWVfaWR4XzAgPSBBT01NSU4ocmVmX2lkeFswXSwgcmVmX2lkeFsxXSk7CisJCQlza2lwX21vZGVfaW5mby0+cmVmX2ZyYW1lX2lkeF8xID0gQU9NTUFYKHJlZl9pZHhbMF0sIHJlZl9pZHhbMV0pOworCQl9CisJfQorCWF2MV9wcmludDIoQVYxX0RFQlVHX0JVRk1HUl9ERVRBSUwsCisJCSJza2lwX21vZGVfaW5mbzogc2tpcF9tb2RlX2FsbG93ZWQgMHgleCAweCV4IDB4JXhcbiIsCisJY20tPmN1cnJlbnRfZnJhbWUuc2tpcF9tb2RlX2luZm8uc2tpcF9tb2RlX2FsbG93ZWQsCisJY20tPmN1cnJlbnRfZnJhbWUuc2tpcF9tb2RlX2luZm8ucmVmX2ZyYW1lX2lkeF8wLAorCWNtLT5jdXJyZW50X2ZyYW1lLnNraXBfbW9kZV9pbmZvLnJlZl9mcmFtZV9pZHhfMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZyYW1lX21pZ2h0X2FsbG93X3JlZl9mcmFtZV9tdnMoY29uc3QgQVYxX0NPTU1PTiAqY20pIHsKKyAgcmV0dXJuICFjbS0+ZXJyb3JfcmVzaWxpZW50X21vZGUgJiYKKyAgICBjbS0+c2VxX3BhcmFtcy5vcmRlcl9oaW50X2luZm8uZW5hYmxlX3JlZl9mcmFtZV9tdnMgJiYKKyAgICBjbS0+c2VxX3BhcmFtcy5vcmRlcl9oaW50X2luZm8uZW5hYmxlX29yZGVyX2hpbnQgJiYKKyAgICAhZnJhbWVfaXNfaW50cmFfb25seShjbSk7Cit9CisKKyNpZmRlZiBPUklfQ09ERQorLyoKKyogc2VnbWVudGF0aW9uCisqLworc3RhdGljIGNvbnN0IGludCBzZWdfZmVhdHVyZV9kYXRhX3NpZ25lZFtTRUdfTFZMX01BWF0gPSB7CisgIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAKK307CisKK3N0YXRpYyBjb25zdCBpbnQgc2VnX2ZlYXR1cmVfZGF0YV9tYXhbU0VHX0xWTF9NQVhdID0geyBNQVhRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9MT09QX0ZJTFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfTE9PUF9GSUxURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX0xPT1BfRklMVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9MT09QX0ZJTFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCB9OworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZWdmZWF0dXJlc19jb3B5KHN0cnVjdCBzZWdtZW50YXRpb24gKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzZWdtZW50YXRpb24gKnNyYykgeworICBpbnQgaSwgajsKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9TRUdNRU5UUzsgaSsrKSB7CisgICAgZHN0LT5mZWF0dXJlX21hc2tbaV0gPSBzcmMtPmZlYXR1cmVfbWFza1tpXTsKKyAgICBmb3IgKGogPSAwOyBqIDwgU0VHX0xWTF9NQVg7IGorKykgeworICAgICAgZHN0LT5mZWF0dXJlX2RhdGFbaV1bal0gPSBzcmMtPmZlYXR1cmVfZGF0YVtpXVtqXTsKKyAgICB9CisgIH0KKyAgZHN0LT5zZWdpZF9wcmVza2lwID0gc3JjLT5zZWdpZF9wcmVza2lwOworICBkc3QtPmxhc3RfYWN0aXZlX3NlZ2lkID0gc3JjLT5sYXN0X2FjdGl2ZV9zZWdpZDsKK30KKworc3RhdGljIHZvaWQgYXYxX2NsZWFyYWxsX3NlZ2ZlYXR1cmVzKHN0cnVjdCBzZWdtZW50YXRpb24gKnNlZykgeworICBhdjFfemVybyhzZWctPmZlYXR1cmVfZGF0YSk7CisgIGF2MV96ZXJvKHNlZy0+ZmVhdHVyZV9tYXNrKTsKK30KKworc3RhdGljIHZvaWQgYXYxX2VuYWJsZV9zZWdmZWF0dXJlKHN0cnVjdCBzZWdtZW50YXRpb24gKnNlZywgaW50IHNlZ21lbnRfaWQsCisgICAgaW50IGZlYXR1cmVfaWQpIHsKKyAgc2VnLT5mZWF0dXJlX21hc2tbc2VnbWVudF9pZF0gfD0gMSA8PCBmZWF0dXJlX2lkOworfQorCit2b2lkIGF2MV9jYWxjdWxhdGVfc2VnZGF0YShzdHJ1Y3Qgc2VnbWVudGF0aW9uICpzZWcpIHsKKyAgc2VnLT5zZWdpZF9wcmVza2lwID0gMDsKKyAgc2VnLT5sYXN0X2FjdGl2ZV9zZWdpZCA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1NFR01FTlRTOyBpKyspIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IFNFR19MVkxfTUFYOyBqKyspIHsKKyAgICAgIGlmIChzZWctPmZlYXR1cmVfbWFza1tpXSAmICgxIDw8IGopKSB7CisgICAgICAgIHNlZy0+c2VnaWRfcHJlc2tpcCB8PSAoaiA+PSBTRUdfTFZMX1JFRl9GUkFNRSk7CisgICAgICAgIHNlZy0+bGFzdF9hY3RpdmVfc2VnaWQgPSBpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgaW50IGF2MV9zZWdfZmVhdHVyZV9kYXRhX21heChpbnQgZmVhdHVyZV9pZCkgeworICByZXR1cm4gc2VnX2ZlYXR1cmVfZGF0YV9tYXhbZmVhdHVyZV9pZF07Cit9CisKK3N0YXRpYyBpbnQgYXYxX2lzX3NlZ2ZlYXR1cmVfc2lnbmVkKGludCBmZWF0dXJlX2lkKSB7CisgIHJldHVybiBzZWdfZmVhdHVyZV9kYXRhX3NpZ25lZFtmZWF0dXJlX2lkXTsKK30KKworc3RhdGljIHZvaWQgYXYxX3NldF9zZWdkYXRhKHN0cnVjdCBzZWdtZW50YXRpb24gKnNlZywgaW50IHNlZ21lbnRfaWQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgZmVhdHVyZV9pZCwgaW50IHNlZ19kYXRhKSB7CisgIGlmIChzZWdfZGF0YSA8IDApIHsKKyAgICBhc3NlcnQoc2VnX2ZlYXR1cmVfZGF0YV9zaWduZWRbZmVhdHVyZV9pZF0pOworICAgIGFzc2VydCgtc2VnX2RhdGEgPD0gc2VnX2ZlYXR1cmVfZGF0YV9tYXhbZmVhdHVyZV9pZF0pOworICB9IGVsc2UgeworICAgIGFzc2VydChzZWdfZGF0YSA8PSBzZWdfZmVhdHVyZV9kYXRhX21heFtmZWF0dXJlX2lkXSk7CisgIH0KKworICBzZWctPmZlYXR1cmVfZGF0YVtzZWdtZW50X2lkXVtmZWF0dXJlX2lkXSA9IHNlZ19kYXRhOworfQorCitzdGF0aWMgaW5saW5lIGludCBjbGFtcChpbnQgdmFsdWUsIGludCBsb3csIGludCBoaWdoKSB7CisgIHJldHVybiB2YWx1ZSA8IGxvdyA/IGxvdyA6ICh2YWx1ZSA+IGhpZ2ggPyBoaWdoIDogdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBzZXR1cF9zZWdtZW50YXRpb24oQVYxX0NPTU1PTiAqY29uc3QgY20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gcGFyYW1fdSAqcGFyYW1zKSB7CisgIHN0cnVjdCBzZWdtZW50YXRpb24gKmNvbnN0IHNlZyA9ICZjbS0+c2VnOworCisgIHNlZy0+dXBkYXRlX21hcCA9IDA7CisgIHNlZy0+dXBkYXRlX2RhdGEgPSAwOworICBzZWctPnRlbXBvcmFsX3VwZGF0ZSA9IDA7CisKKyAgc2VnLT5lbmFibGVkID0gcGFyYW1zLT5wLnNlZ19lbmFibGVkOyAvL2FvbV9yYl9yZWFkX2JpdCgtMSwgZGVmbWFyaywgcmIpOworICBpZiAoIXNlZy0+ZW5hYmxlZCkgeworICAgIGlmIChjbS0+Y3VyX2ZyYW1lLT5zZWdfbWFwKQorICAgICAgbWVtc2V0KGNtLT5jdXJfZnJhbWUtPnNlZ19tYXAsIDAsIChjbS0+bWlfcm93cyAqIGNtLT5taV9jb2xzKSk7CisKKyAgICBtZW1zZXQoc2VnLCAwLCBzaXplb2YoKnNlZykpOworICAgIHNlZ2ZlYXR1cmVzX2NvcHkoJmNtLT5jdXJfZnJhbWUtPnNlZywgc2VnKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGNtLT5zZWcuZW5hYmxlZCAmJiBjbS0+cHJldl9mcmFtZSAmJgorICAgICAgKGNtLT5taV9yb3dzID09IGNtLT5wcmV2X2ZyYW1lLT5taV9yb3dzKSAmJgorICAgICAgKGNtLT5taV9jb2xzID09IGNtLT5wcmV2X2ZyYW1lLT5taV9jb2xzKSkgeworICAgIGNtLT5sYXN0X2ZyYW1lX3NlZ19tYXAgPSBjbS0+cHJldl9mcmFtZS0+c2VnX21hcDsKKyAgfSBlbHNlIHsKKyAgICBjbS0+bGFzdF9mcmFtZV9zZWdfbWFwID0gTlVMTDsKKyAgfQorICAvLyBSZWFkIHVwZGF0ZSBmbGFncworICBpZiAoY20tPnByaW1hcnlfcmVmX2ZyYW1lID09IFBSSU1BUllfUkVGX05PTkUpIHsKKyAgICAvLyBUaGVzZSBmcmFtZXMgY2FuJ3QgdXNlIHByZXZpb3VzIGZyYW1lcywgc28gbXVzdCBzaWduYWwgbWFwICsgZmVhdHVyZXMKKyAgICBzZWctPnVwZGF0ZV9tYXAgPSAxOworICAgIHNlZy0+dGVtcG9yYWxfdXBkYXRlID0gMDsKKyAgICBzZWctPnVwZGF0ZV9kYXRhID0gMTsKKyAgfSBlbHNlIHsKKyAgICBzZWctPnVwZGF0ZV9tYXAgPSBwYXJhbXMtPnAuc2VnX3VwZGF0ZV9tYXA7IC8vIGFvbV9yYl9yZWFkX2JpdCgtMSwgZGVmbWFyaywgcmIpOworICAgIGlmIChzZWctPnVwZGF0ZV9tYXApIHsKKyAgICAgIHNlZy0+dGVtcG9yYWxfdXBkYXRlID0gcGFyYW1zLT5wLnNlZ190ZW1wb3JhbF91cGRhdGU7IC8vYW9tX3JiX3JlYWRfYml0KC0xLCBkZWZtYXJrLCByYik7CisgICAgfSBlbHNlIHsKKyAgICAgIHNlZy0+dGVtcG9yYWxfdXBkYXRlID0gMDsKKyAgICB9CisgICAgc2VnLT51cGRhdGVfZGF0YSA9IHBhcmFtcy0+cC5zZWdfdXBkYXRlX2RhdGE7IC8vYW9tX3JiX3JlYWRfYml0KC0xLCBkZWZtYXJrLCByYik7CisgIH0KKworICAvLyBTZWdtZW50YXRpb24gZGF0YSB1cGRhdGUKKyAgaWYgKHNlZy0+dXBkYXRlX2RhdGEpIHsKKyAgICBhdjFfY2xlYXJhbGxfc2VnZmVhdHVyZXMoc2VnKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1NFR01FTlRTOyBpKyspIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgU0VHX0xWTF9NQVg7IGorKykgeworICAgICAgICBpbnQgZGF0YSA9IDA7CisgICAgICAgIGNvbnN0IGludCBmZWF0dXJlX2VuYWJsZWQgPSBwYXJhbXMtPnAuc2VnX2ZlYXR1cmVfZW5hYmxlZCA7Ly9hb21fcmJfcmVhZF9iaXQoLTEsIGRlZm1hcmssIHJiKTsKKyAgICAgICAgaWYgKGZlYXR1cmVfZW5hYmxlZCkgeworICAgICAgICAgIGF2MV9lbmFibGVfc2VnZmVhdHVyZShzZWcsIGksIGopOworCisgICAgICAgICAgY29uc3QgaW50IGRhdGFfbWF4ID0gYXYxX3NlZ19mZWF0dXJlX2RhdGFfbWF4KGopOworICAgICAgICAgIGNvbnN0IGludCBkYXRhX21pbiA9IC1kYXRhX21heDsKKyAgICAgICAgICAvKgorICAgICAgICAgIGNvbnN0IGludCB1Yml0cyA9IGdldF91bnNpZ25lZF9iaXRzKGRhdGFfbWF4KTsKKworICAgICAgICAgIGlmIChhdjFfaXNfc2VnZmVhdHVyZV9zaWduZWQoaikpIHsKKyAgICAgICAgICAgIGRhdGEgPSBhb21fcmJfcmVhZF9pbnZfc2lnbmVkX2xpdGVyYWwoLTEsIGRlZm1hcmssIHJiLCB1Yml0cyk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGEgPSBhb21fcmJfcmVhZF9saXRlcmFsKC0xLCBkZWZtYXJrLCByYiwgdWJpdHMpOworICAgICAgICAgIH0qLworICAgICAgICAgIGRhdGEgPSBwYXJhbXMtPnAuc2VnX2RhdGE7CisgICAgICAgICAgZGF0YSA9IGNsYW1wKGRhdGEsIGRhdGFfbWluLCBkYXRhX21heCk7CisgICAgICAgIH0KKyAgICAgICAgYXYxX3NldF9zZWdkYXRhKHNlZywgaSwgaiwgZGF0YSk7CisgICAgICB9CisgICAgfQorICAgIGF2MV9jYWxjdWxhdGVfc2VnZGF0YShzZWcpOworICB9IGVsc2UgaWYgKGNtLT5wcmV2X2ZyYW1lKSB7CisgICAgc2VnZmVhdHVyZXNfY29weShzZWcsICZjbS0+cHJldl9mcmFtZS0+c2VnKTsKKyAgfQorICBzZWdmZWF0dXJlc19jb3B5KCZjbS0+Y3VyX2ZyYW1lLT5zZWcsIHNlZyk7Cit9CisjZW5kaWYKKworLyoqLworCisKK2ludCBhdjFfZGVjb2RlX2ZyYW1lX2hlYWRlcnNfYW5kX3NldHVwKEFWMURlY29kZXIgKnBiaSwgaW50IHRyYWlsaW5nX2JpdHNfcHJlc2VudCwgdW5pb24gcGFyYW1fdSAqcGFyYW1zKQoreworICBBVjFfQ09NTU9OICpjb25zdCBjbSA9IHBiaS0+Y29tbW9uOworICAvKgorICByZWFkX3VuY29tcHJlc3NlZF9oZWFkZXIoKQorICAqLworICBjb25zdCBTZXF1ZW5jZUhlYWRlciAqY29uc3Qgc2VxX3BhcmFtcyA9ICZjbS0+c2VxX3BhcmFtczsKKyAgQ3VycmVudEZyYW1lICpjb25zdCBjdXJyZW50X2ZyYW1lID0gJmNtLT5jdXJyZW50X2ZyYW1lOworICAvL01BQ1JPQkxPQ0tEICpjb25zdCB4ZCA9ICZwYmktPm1iOworICBCdWZmZXJQb29sICpjb25zdCBwb29sID0gY20tPmJ1ZmZlcl9wb29sOworICBSZWZDbnRCdWZmZXIgKmNvbnN0IGZyYW1lX2J1ZnMgPSBwb29sLT5mcmFtZV9idWZzOworICBpbnQgaTsKKyAgaW50IGZyYW1lX3NpemVfb3ZlcnJpZGVfZmxhZzsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICBpZiAoIXBiaS0+c2VxdWVuY2VfaGVhZGVyX3JlYWR5KSB7CisgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAiTm8gc2VxdWVuY2UgaGVhZGVyIik7CisgIH0KKyAgY20tPmxhc3RfZnJhbWVfdHlwZSA9IGN1cnJlbnRfZnJhbWUtPmZyYW1lX3R5cGU7CisKKyAgaWYgKHNlcV9wYXJhbXMtPnJlZHVjZWRfc3RpbGxfcGljdHVyZV9oZHIpIHsKKyAgICBjbS0+c2hvd19leGlzdGluZ19mcmFtZSA9IDA7CisgICAgY20tPnNob3dfZnJhbWUgPSAxOworICAgIGN1cnJlbnRfZnJhbWUtPmZyYW1lX3R5cGUgPSBLRVlfRlJBTUU7CisgICAgaWYgKHBiaS0+c2VxdWVuY2VfaGVhZGVyX2NoYW5nZWQpIHsKKyAgICAgIC8vIFRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgbmV3IGNvZGVkIHZpZGVvIHNlcXVlbmNlLgorICAgICAgcGJpLT5zZXF1ZW5jZV9oZWFkZXJfY2hhbmdlZCA9IDA7CisgICAgICBwYmktPmRlY29kaW5nX2ZpcnN0X2ZyYW1lID0gMTsKKyAgICAgIHJlc2V0X2ZyYW1lX2J1ZmZlcnMocGJpKTsKKyAgICB9CisgICAgY20tPmVycm9yX3Jlc2lsaWVudF9tb2RlID0gMTsKKyAgfSBlbHNlIHsKKyAgICBjbS0+c2hvd19leGlzdGluZ19mcmFtZSA9IHBhcmFtcy0+cC5zaG93X2V4aXN0aW5nX2ZyYW1lOworICAgIHBiaS0+cmVzZXRfZGVjb2Rlcl9zdGF0ZSA9IDA7CisgICAgaWYgKGNtLT5zaG93X2V4aXN0aW5nX2ZyYW1lKSB7CisgICAgICBpbnQgZXhpc3RpbmdfZnJhbWVfaWR4OworICAgICAgUmVmQ250QnVmZmVyICpmcmFtZV90b19zaG93OworICAgICAgaWYgKHBiaS0+c2VxdWVuY2VfaGVhZGVyX2NoYW5nZWQpIHsKKyAgICAgICAgYW9tX2ludGVybmFsX2Vycm9yKAorICAgICAgICAgICAgJmNtLT5lcnJvciwgQU9NX0NPREVDX0NPUlJVUFRfRlJBTUUsCisgICAgICAgICAgICAiTmV3IHNlcXVlbmNlIGhlYWRlciBzdGFydHMgd2l0aCBhIHNob3dfZXhpc3RpbmdfZnJhbWUuIik7CisgICAgICB9CisgICAgICAvLyBTaG93IGFuIGV4aXN0aW5nIGZyYW1lIGRpcmVjdGx5LgorICAgICAgZXhpc3RpbmdfZnJhbWVfaWR4ID0gcGFyYW1zLT5wLmV4aXN0aW5nX2ZyYW1lX2lkeDsgLy9hb21fcmJfcmVhZF9saXRlcmFsKHJiLCAzKTsKKyAgICAgIGZyYW1lX3RvX3Nob3cgPSBjbS0+cmVmX2ZyYW1lX21hcFtleGlzdGluZ19mcmFtZV9pZHhdOworICAgICAgaWYgKGZyYW1lX3RvX3Nob3cgPT0gTlVMTCkgeworICAgICAgICAgIGFvbV9pbnRlcm5hbF9lcnJvcigmY20tPmVycm9yLCBBT01fQ09ERUNfVU5TVVBfQklUU1RSRUFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJ1ZmZlciBkb2VzIG5vdCBjb250YWluIGEgZGVjb2RlZCBmcmFtZSIpOworICAgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgaWYgKHNlcV9wYXJhbXMtPmRlY29kZXJfbW9kZWxfaW5mb19wcmVzZW50X2ZsYWcgJiYKKyAgICAgICAgICBjbS0+dGltaW5nX2luZm8uZXF1YWxfcGljdHVyZV9pbnRlcnZhbCA9PSAwKSB7CisgICAgICAgIGNtLT5mcmFtZV9wcmVzZW50YXRpb25fdGltZSA9IHBhcmFtcy0+cC5mcmFtZV9wcmVzZW50YXRpb25fdGltZTsKKyAgICAgICAgLy9yZWFkX3RlbXBvcmFsX3BvaW50X2luZm8oY20pOworICAgICAgfQorICAgICAgaWYgKHNlcV9wYXJhbXMtPmZyYW1lX2lkX251bWJlcnNfcHJlc2VudF9mbGFnKSB7CisgICAgICAgIC8vaW50IGZyYW1lX2lkX2xlbmd0aCA9IHNlcV9wYXJhbXMtPmZyYW1lX2lkX2xlbmd0aDsKKyAgICAgICAgaW50IGRpc3BsYXlfZnJhbWVfaWQgPSBwYXJhbXMtPnAuZGlzcGxheV9mcmFtZV9pZDsgLy9hb21fcmJfcmVhZF9saXRlcmFsKHJiLCBmcmFtZV9pZF9sZW5ndGgpOworICAgICAgICAvKiBDb21wYXJlIGRpc3BsYXlfZnJhbWVfaWQgd2l0aCByZWZfZnJhbWVfaWQgYW5kIGNoZWNrIHZhbGlkIGZvcgorICAgICAgICAgKiByZWZlcmVuY2luZyAqLworICAgICAgICBpZiAoZGlzcGxheV9mcmFtZV9pZCAhPSBjbS0+cmVmX2ZyYW1lX2lkW2V4aXN0aW5nX2ZyYW1lX2lkeF0gfHwKKyAgICAgICAgICAgIGNtLT52YWxpZF9mb3JfcmVmZXJlbmNpbmdbZXhpc3RpbmdfZnJhbWVfaWR4XSA9PSAwKQorICAgICAgICAgIGFvbV9pbnRlcm5hbF9lcnJvcigmY20tPmVycm9yLCBBT01fQ09ERUNfQ09SUlVQVF9GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZmVyZW5jZSBidWZmZXIgZnJhbWUgSUQgbWlzbWF0Y2giKTsKKyAgICAgIH0KKyAgICAgIGxvY2tfYnVmZmVyX3Bvb2wocG9vbCwgZmxhZ3MpOworICAgICAgYXNzZXJ0KGZyYW1lX3RvX3Nob3ctPnJlZl9jb3VudCA+IDApOworICAgICAgLy8gY20tPmN1cl9mcmFtZSBzaG91bGQgYmUgdGhlIGJ1ZmZlciByZWZlcmVuY2VkIGJ5IHRoZSByZXR1cm4gdmFsdWUKKyAgICAgIC8vIG9mIHRoZSBnZXRfZnJlZV9mYigpIGNhbGwgaW4gYXYxX3JlY2VpdmVfY29tcHJlc3NlZF9kYXRhKCksIGFuZAorICAgICAgLy8gZ2VuZXJhdGVfbmV4dF9yZWZfZnJhbWVfbWFwKCkgaGFzIG5vdCBiZWVuIGNhbGxlZCwgc28gcmVmX2NvdW50CisgICAgICAvLyBzaG91bGQgc3RpbGwgYmUgMS4KKyAgICAgIGFzc2VydChjbS0+Y3VyX2ZyYW1lLT5yZWZfY291bnQgPT0gMSk7CisgICAgICAvLyBhc3NpZ25fZnJhbWVfYnVmZmVyX3AoKSBkZWNyZW1lbnRzIHJlZl9jb3VudCBkaXJlY3RseSByYXRoZXIgdGhhbgorICAgICAgLy8gY2FsbCBkZWNyZWFzZV9yZWZfY291bnQoKS4gSWYgY20tPmN1cl9mcmFtZS0+cmF3X2ZyYW1lX2J1ZmZlciBoYXMKKyAgICAgIC8vIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQsIGl0IHdpbGwgbm90IGJlIHJlbGVhc2VkIGJ5CisgICAgICAvLyBhc3NpZ25fZnJhbWVfYnVmZmVyX3AoKSEKKyAgICAgIGFzc2VydCghY20tPmN1cl9mcmFtZS0+cmF3X2ZyYW1lX2J1ZmZlci5kYXRhKTsKKworICAgICAgaWYgKGNoZWNrX2J1ZmZfaGFzX3Nob3coZnJhbWVfdG9fc2hvdykpIHsKKyAgICAgICAgZnJhbWVfdG9fc2hvdy0+YnVmLnY0bF9idWZfaW5kZXggPSBjbS0+Y3VyX2ZyYW1lLT5idWYuaW5kZXg7CisgICAgICAgIGZyYW1lX3RvX3Nob3ctPmJ1Zi5yZXBlYXRfY291bnQgKys7CisgICAgICAgIGNtLT5jdXJfZnJhbWUtPmJ1Zi5yZXBlYXRfcGljID0gJmZyYW1lX3RvX3Nob3ctPmJ1ZjsKKyAgICAgIH0KKworICAgICAgZnJhbWVfdG9fc2hvdy0+YnVmLnRpbWVzdGFtcCA9IGNtLT5jdXJfZnJhbWUtPmJ1Zi50aW1lc3RhbXA7CisKKyAgICAgIGFzc2lnbl9mcmFtZV9idWZmZXJfcCgmY20tPmN1cl9mcmFtZSwgZnJhbWVfdG9fc2hvdyk7CisgICAgICBwYmktPnJlc2V0X2RlY29kZXJfc3RhdGUgPSBmcmFtZV90b19zaG93LT5mcmFtZV90eXBlID09IEtFWV9GUkFNRTsKKyAgICAgIHVubG9ja19idWZmZXJfcG9vbChwb29sLCBmbGFncyk7CisKKyNpZmRlZiBPUklfQ09ERQorICAgICAgY20tPmxmLmZpbHRlcl9sZXZlbFswXSA9IDA7CisgICAgICBjbS0+bGYuZmlsdGVyX2xldmVsWzFdID0gMDsKKyNlbmRpZgorICAgICAgY20tPnNob3dfZnJhbWUgPSAxOworCisgICAgICAvLyBTZWN0aW9uIDYuOC4yOiBJdCBpcyBhIHJlcXVpcmVtZW50IG9mIGJpdHN0cmVhbSBjb25mb3JtYW5jZSB0aGF0IHdoZW4KKyAgICAgIC8vIHNob3dfZXhpc3RpbmdfZnJhbWUgaXMgdXNlZCB0byBzaG93IGEgcHJldmlvdXMgZnJhbWUsIHRoYXQgdGhlIHZhbHVlCisgICAgICAvLyBvZiBzaG93YWJsZV9mcmFtZSBmb3IgdGhlIHByZXZpb3VzIGZyYW1lIHdhcyBlcXVhbCB0byAxLgorICAgICAgaWYgKCFmcmFtZV90b19zaG93LT5zaG93YWJsZV9mcmFtZSkgeworICAgICAgICBhb21faW50ZXJuYWxfZXJyb3IoJmNtLT5lcnJvciwgQU9NX0NPREVDX1VOU1VQX0JJVFNUUkVBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJCdWZmZXIgZG9lcyBub3QgY29udGFpbiBhIHNob3dhYmxlIGZyYW1lIik7CisgICAgICB9CisgICAgICAvLyBTZWN0aW9uIDYuOC4yOiBJdCBpcyBhIHJlcXVpcmVtZW50IG9mIGJpdHN0cmVhbSBjb25mb3JtYW5jZSB0aGF0IHdoZW4KKyAgICAgIC8vIHNob3dfZXhpc3RpbmdfZnJhbWUgaXMgdXNlZCB0byBzaG93IGEgcHJldmlvdXMgZnJhbWUgd2l0aAorICAgICAgLy8gUmVmRnJhbWVUeXBlWyBmcmFtZV90b19zaG93X21hcF9pZHggXSBlcXVhbCB0byBLRVlfRlJBTUUsIHRoYXQgdGhlCisgICAgICAvLyBmcmFtZSBpcyBvdXRwdXQgdmlhIHRoZSBzaG93X2V4aXN0aW5nX2ZyYW1lIG1lY2hhbmlzbSBhdCBtb3N0IG9uY2UuCisgICAgICBpZiAocGJpLT5yZXNldF9kZWNvZGVyX3N0YXRlKSBmcmFtZV90b19zaG93LT5zaG93YWJsZV9mcmFtZSA9IDA7CisKKyNpZmRlZiBPUklfQ09ERQorICAgICAgY20tPmZpbG1fZ3JhaW5fcGFyYW1zID0gZnJhbWVfdG9fc2hvdy0+ZmlsbV9ncmFpbl9wYXJhbXM7CisjZW5kaWYKKyAgICAgIGlmIChwYmktPnJlc2V0X2RlY29kZXJfc3RhdGUpIHsKKyAgICAgICAgc2hvd19leGlzdGluZ19mcmFtZV9yZXNldChwYmksIGV4aXN0aW5nX2ZyYW1lX2lkeCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjdXJyZW50X2ZyYW1lLT5yZWZyZXNoX2ZyYW1lX2ZsYWdzID0gMDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgY3VycmVudF9mcmFtZS0+ZnJhbWVfdHlwZSA9IChGUkFNRV9UWVBFKXBhcmFtcy0+cC5mcmFtZV90eXBlOyAvL2FvbV9yYl9yZWFkX2xpdGVyYWwocmIsIDIpOworICAgIGlmIChwYmktPnNlcXVlbmNlX2hlYWRlcl9jaGFuZ2VkKSB7CisgICAgICBpZiAoY3VycmVudF9mcmFtZS0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpIHsKKyAgICAgICAgLy8gVGhpcyBpcyB0aGUgc3RhcnQgb2YgYSBuZXcgY29kZWQgdmlkZW8gc2VxdWVuY2UuCisgICAgICAgIHBiaS0+c2VxdWVuY2VfaGVhZGVyX2NoYW5nZWQgPSAwOworICAgICAgICBwYmktPmRlY29kaW5nX2ZpcnN0X2ZyYW1lID0gMTsKKyAgICAgICAgcmVzZXRfZnJhbWVfYnVmZmVycyhwYmkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlcXVlbmNlIGhlYWRlciBoYXMgY2hhbmdlZCB3aXRob3V0IGEga2V5ZnJhbWUuIik7CisgICAgICB9CisgICAgfQorICAgIGNtLT5zaG93X2ZyYW1lID0gcGFyYW1zLT5wLnNob3dfZnJhbWU7IC8vYW9tX3JiX3JlYWRfYml0KHJiKTsKKyAgICBpZiAoc2VxX3BhcmFtcy0+c3RpbGxfcGljdHVyZSAmJgorICAgICAgICAoY3VycmVudF9mcmFtZS0+ZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUgfHwgIWNtLT5zaG93X2ZyYW1lKSkgeworICAgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICJTdGlsbCBwaWN0dXJlcyBtdXN0IGJlIGNvZGVkIGFzIHNob3duIGtleWZyYW1lcyIpOworICAgIH0KKyAgICBjbS0+c2hvd2FibGVfZnJhbWUgPSBjdXJyZW50X2ZyYW1lLT5mcmFtZV90eXBlICE9IEtFWV9GUkFNRTsKKyAgICBpZiAoY20tPnNob3dfZnJhbWUpIHsKKyAgICAgIGlmIChzZXFfcGFyYW1zLT5kZWNvZGVyX21vZGVsX2luZm9fcHJlc2VudF9mbGFnICYmCisgICAgICAgICAgY20tPnRpbWluZ19pbmZvLmVxdWFsX3BpY3R1cmVfaW50ZXJ2YWwgPT0gMCkKKyAgICAgICAgY20tPmZyYW1lX3ByZXNlbnRhdGlvbl90aW1lID0gcGFyYW1zLT5wLmZyYW1lX3ByZXNlbnRhdGlvbl90aW1lOworICAgICAgICAvL3JlYWRfdGVtcG9yYWxfcG9pbnRfaW5mbyhjbSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFNlZSBpZiB0aGlzIGZyYW1lIGNhbiBiZSB1c2VkIGFzIHNob3dfZXhpc3RpbmdfZnJhbWUgaW4gZnV0dXJlCisgICAgICBjbS0+c2hvd2FibGVfZnJhbWUgPSBwYXJhbXMtPnAuc2hvd2FibGVfZnJhbWU7Ly9hb21fcmJfcmVhZF9iaXQocmIpOworICAgIH0KKyAgICBjbS0+Y3VyX2ZyYW1lLT5zaG93X2ZyYW1lID0gY20tPnNob3dfZnJhbWU7CisgICAgY20tPmN1cl9mcmFtZS0+c2hvd2FibGVfZnJhbWUgPSBjbS0+c2hvd2FibGVfZnJhbWU7CisgICAgY20tPmVycm9yX3Jlc2lsaWVudF9tb2RlID0KKyAgICAgICAgZnJhbWVfaXNfc2ZyYW1lKGNtKSB8fAorICAgICAgICAgICAgICAgIChjdXJyZW50X2ZyYW1lLT5mcmFtZV90eXBlID09IEtFWV9GUkFNRSAmJiBjbS0+c2hvd19mcmFtZSkKKyAgICAgICAgICAgID8gMQorICAgICAgICAgICAgOiBwYXJhbXMtPnAuZXJyb3JfcmVzaWxpZW50X21vZGU7IC8vYW9tX3JiX3JlYWRfYml0KHJiKTsKKyAgfQorCisjaWZkZWYgT1JJX0NPREUKKyAgY20tPmRpc2FibGVfY2RmX3VwZGF0ZSA9IGFvbV9yYl9yZWFkX2JpdChyYik7CisgIGlmIChzZXFfcGFyYW1zLT5mb3JjZV9zY3JlZW5fY29udGVudF90b29scyA9PSAyKSB7CisgICAgY20tPmFsbG93X3NjcmVlbl9jb250ZW50X3Rvb2xzID0gYW9tX3JiX3JlYWRfYml0KHJiKTsKKyAgfSBlbHNlIHsKKyAgICBjbS0+YWxsb3dfc2NyZWVuX2NvbnRlbnRfdG9vbHMgPSBzZXFfcGFyYW1zLT5mb3JjZV9zY3JlZW5fY29udGVudF90b29sczsKKyAgfQorCisgIGlmIChjbS0+YWxsb3dfc2NyZWVuX2NvbnRlbnRfdG9vbHMpIHsKKyAgICBpZiAoc2VxX3BhcmFtcy0+Zm9yY2VfaW50ZWdlcl9tdiA9PSAyKSB7CisgICAgICBjbS0+Y3VyX2ZyYW1lX2ZvcmNlX2ludGVnZXJfbXYgPSBhb21fcmJfcmVhZF9iaXQocmIpOworICAgIH0gZWxzZSB7CisgICAgICBjbS0+Y3VyX2ZyYW1lX2ZvcmNlX2ludGVnZXJfbXYgPSBzZXFfcGFyYW1zLT5mb3JjZV9pbnRlZ2VyX212OworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjbS0+Y3VyX2ZyYW1lX2ZvcmNlX2ludGVnZXJfbXYgPSAwOworICB9CisjZW5kaWYKKworICBmcmFtZV9zaXplX292ZXJyaWRlX2ZsYWcgPSAwOworICBjbS0+YWxsb3dfaW50cmFiYyA9IDA7CisgIGNtLT5wcmltYXJ5X3JlZl9mcmFtZSA9IFBSSU1BUllfUkVGX05PTkU7CisKKyAgaWYgKCFzZXFfcGFyYW1zLT5yZWR1Y2VkX3N0aWxsX3BpY3R1cmVfaGRyKSB7CisgICAgaWYgKHNlcV9wYXJhbXMtPmZyYW1lX2lkX251bWJlcnNfcHJlc2VudF9mbGFnKSB7CisgICAgICBpbnQgZnJhbWVfaWRfbGVuZ3RoID0gc2VxX3BhcmFtcy0+ZnJhbWVfaWRfbGVuZ3RoOworICAgICAgaW50IGRpZmZfbGVuID0gc2VxX3BhcmFtcy0+ZGVsdGFfZnJhbWVfaWRfbGVuZ3RoOworICAgICAgaW50IHByZXZfZnJhbWVfaWQgPSAwOworICAgICAgaW50IGhhdmVfcHJldl9mcmFtZV9pZCA9CisgICAgICAgICAgIXBiaS0+ZGVjb2RpbmdfZmlyc3RfZnJhbWUgJiYKKyAgICAgICAgICAhKGN1cnJlbnRfZnJhbWUtPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FICYmIGNtLT5zaG93X2ZyYW1lKTsKKyAgICAgIGlmIChoYXZlX3ByZXZfZnJhbWVfaWQpIHsKKyAgICAgICAgcHJldl9mcmFtZV9pZCA9IGNtLT5jdXJyZW50X2ZyYW1lX2lkOworICAgICAgfQorICAgICAgY20tPmN1cnJlbnRfZnJhbWVfaWQgPSBwYXJhbXMtPnAuY3VycmVudF9mcmFtZV9pZDsgLy9hb21fcmJfcmVhZF9saXRlcmFsKHJiLCBmcmFtZV9pZF9sZW5ndGgpOworCisgICAgICBpZiAoaGF2ZV9wcmV2X2ZyYW1lX2lkKSB7CisgICAgICAgIGludCBkaWZmX2ZyYW1lX2lkOworICAgICAgICBpZiAoY20tPmN1cnJlbnRfZnJhbWVfaWQgPiBwcmV2X2ZyYW1lX2lkKSB7CisgICAgICAgICAgZGlmZl9mcmFtZV9pZCA9IGNtLT5jdXJyZW50X2ZyYW1lX2lkIC0gcHJldl9mcmFtZV9pZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkaWZmX2ZyYW1lX2lkID0KKyAgICAgICAgICAgICAgKDEgPDwgZnJhbWVfaWRfbGVuZ3RoKSArIGNtLT5jdXJyZW50X2ZyYW1lX2lkIC0gcHJldl9mcmFtZV9pZDsKKyAgICAgICAgfQorICAgICAgICAvKiBDaGVjayBjdXJyZW50X2ZyYW1lX2lkIGZvciBjb25mb3JtYW5jZSAqLworICAgICAgICBpZiAocHJldl9mcmFtZV9pZCA9PSBjbS0+Y3VycmVudF9mcmFtZV9pZCB8fAorICAgICAgICAgICAgZGlmZl9mcmFtZV9pZCA+PSAoMSA8PCAoZnJhbWVfaWRfbGVuZ3RoIC0gMSkpKSB7CisgICAgICAgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCB2YWx1ZSBvZiBjdXJyZW50X2ZyYW1lX2lkIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIENoZWNrIGlmIHNvbWUgZnJhbWVzIG5lZWQgdG8gYmUgbWFya2VkIGFzIG5vdCB2YWxpZCBmb3IgcmVmZXJlbmNpbmcgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBSRUZfRlJBTUVTOyBpKyspIHsKKyAgICAgICAgaWYgKGN1cnJlbnRfZnJhbWUtPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FICYmIGNtLT5zaG93X2ZyYW1lKSB7CisgICAgICAgICAgY20tPnZhbGlkX2Zvcl9yZWZlcmVuY2luZ1tpXSA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAoY20tPmN1cnJlbnRfZnJhbWVfaWQgLSAoMSA8PCBkaWZmX2xlbikgPiAwKSB7CisgICAgICAgICAgaWYgKGNtLT5yZWZfZnJhbWVfaWRbaV0gPiBjbS0+Y3VycmVudF9mcmFtZV9pZCB8fAorICAgICAgICAgICAgICBjbS0+cmVmX2ZyYW1lX2lkW2ldIDwgY20tPmN1cnJlbnRfZnJhbWVfaWQgLSAoMSA8PCBkaWZmX2xlbikpCisgICAgICAgICAgICBjbS0+dmFsaWRfZm9yX3JlZmVyZW5jaW5nW2ldID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoY20tPnJlZl9mcmFtZV9pZFtpXSA+IGNtLT5jdXJyZW50X2ZyYW1lX2lkICYmCisgICAgICAgICAgICAgIGNtLT5yZWZfZnJhbWVfaWRbaV0gPCAoMSA8PCBmcmFtZV9pZF9sZW5ndGgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+Y3VycmVudF9mcmFtZV9pZCAtICgxIDw8IGRpZmZfbGVuKSkKKyAgICAgICAgICAgIGNtLT52YWxpZF9mb3JfcmVmZXJlbmNpbmdbaV0gPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgZnJhbWVfc2l6ZV9vdmVycmlkZV9mbGFnID0gZnJhbWVfaXNfc2ZyYW1lKGNtKSA/IDEgOiBwYXJhbXMtPnAuZnJhbWVfc2l6ZV9vdmVycmlkZV9mbGFnOyAvL2FvbV9yYl9yZWFkX2JpdChyYik7CisKKyAgICBjdXJyZW50X2ZyYW1lLT5vcmRlcl9oaW50ID0gcGFyYW1zLT5wLm9yZGVyX2hpbnQ7IC8qYW9tX3JiX3JlYWRfbGl0ZXJhbCgKKyAgICAgICAgcmIsIHNlcV9wYXJhbXMtPm9yZGVyX2hpbnRfaW5mby5vcmRlcl9oaW50X2JpdHNfbWludXNfMSArIDEpOyovCisgICAgY3VycmVudF9mcmFtZS0+ZnJhbWVfbnVtYmVyID0gY3VycmVudF9mcmFtZS0+b3JkZXJfaGludDsKKworICAgIGlmICghY20tPmVycm9yX3Jlc2lsaWVudF9tb2RlICYmICFmcmFtZV9pc19pbnRyYV9vbmx5KGNtKSkgeworICAgICAgY20tPnByaW1hcnlfcmVmX2ZyYW1lID0gcGFyYW1zLT5wLnByaW1hcnlfcmVmX2ZyYW1lOy8vYW9tX3JiX3JlYWRfbGl0ZXJhbChyYiwgUFJJTUFSWV9SRUZfQklUUyk7CisgICAgfQorICB9CisKKyAgaWYgKHNlcV9wYXJhbXMtPmRlY29kZXJfbW9kZWxfaW5mb19wcmVzZW50X2ZsYWcpIHsKKyAgICBjbS0+YnVmZmVyX3JlbW92YWxfdGltZV9wcmVzZW50ID0gcGFyYW1zLT5wLmJ1ZmZlcl9yZW1vdmFsX3RpbWVfcHJlc2VudDsgLy9hb21fcmJfcmVhZF9iaXQocmIpOworICAgIGlmIChjbS0+YnVmZmVyX3JlbW92YWxfdGltZV9wcmVzZW50KSB7CisgICAgICBpbnQgb3BfbnVtOworICAgICAgZm9yIChvcF9udW0gPSAwOworICAgICAgICAgICBvcF9udW0gPCBzZXFfcGFyYW1zLT5vcGVyYXRpbmdfcG9pbnRzX2NudF9taW51c18xICsgMTsgb3BfbnVtKyspIHsKKyAgICAgICAgaWYgKGNtLT5vcF9wYXJhbXNbb3BfbnVtXS5kZWNvZGVyX21vZGVsX3BhcmFtX3ByZXNlbnRfZmxhZykgeworICAgICAgICAgIGlmICgoKChzZXFfcGFyYW1zLT5vcGVyYXRpbmdfcG9pbnRfaWRjW29wX251bV0gPj4KKyAgICAgICAgICAgICAgICAgY20tPnRlbXBvcmFsX2xheWVyX2lkKSAmCisgICAgICAgICAgICAgICAgMHgxKSAmJgorICAgICAgICAgICAgICAgKChzZXFfcGFyYW1zLT5vcGVyYXRpbmdfcG9pbnRfaWRjW29wX251bV0gPj4KKyAgICAgICAgICAgICAgICAgKGNtLT5zcGF0aWFsX2xheWVyX2lkICsgOCkpICYKKyAgICAgICAgICAgICAgICAweDEpKSB8fAorICAgICAgICAgICAgICBzZXFfcGFyYW1zLT5vcGVyYXRpbmdfcG9pbnRfaWRjW29wX251bV0gPT0gMCkgeworICAgICAgICAgICAgY20tPm9wX2ZyYW1lX3RpbWluZ1tvcF9udW1dLmJ1ZmZlcl9yZW1vdmFsX3RpbWUgPQorICAgICAgICAgICAgICAgIHBhcmFtcy0+cC5vcF9mcmFtZV90aW1pbmdbb3BfbnVtXTsKKyAgICAgICAgICAgICAgICAvKmFvbV9yYl9yZWFkX3Vuc2lnbmVkX2xpdGVyYWwoCisgICAgICAgICAgICAgICAgICAgIHJiLCBjbS0+YnVmZmVyX21vZGVsLmJ1ZmZlcl9yZW1vdmFsX3RpbWVfbGVuZ3RoKTsqLworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbS0+b3BfZnJhbWVfdGltaW5nW29wX251bV0uYnVmZmVyX3JlbW92YWxfdGltZSA9IDA7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNtLT5vcF9mcmFtZV90aW1pbmdbb3BfbnVtXS5idWZmZXJfcmVtb3ZhbF90aW1lID0gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoY3VycmVudF9mcmFtZS0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpIHsKKyAgICBpZiAoIWNtLT5zaG93X2ZyYW1lKSB7ICAvLyB1bnNob3duIGtleWZyYW1lIChmb3J3YXJkIGtleWZyYW1lKQorICAgICAgY3VycmVudF9mcmFtZS0+cmVmcmVzaF9mcmFtZV9mbGFncyA9IHBhcmFtcy0+cC5yZWZyZXNoX2ZyYW1lX2ZsYWdzOyAvL2FvbV9yYl9yZWFkX2xpdGVyYWwocmIsIFJFRl9GUkFNRVMpOworICAgIH0gZWxzZSB7ICAvLyBzaG93biBrZXlmcmFtZQorICAgICAgY3VycmVudF9mcmFtZS0+cmVmcmVzaF9mcmFtZV9mbGFncyA9ICgxIDw8IFJFRl9GUkFNRVMpIC0gMTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgSU5URVJfUkVGU19QRVJfRlJBTUU7ICsraSkgeworICAgICAgY20tPnJlbWFwcGVkX3JlZl9pZHhbaV0gPSBJTlZBTElEX0lEWDsKKyAgICB9CisgICAgaWYgKHBiaS0+bmVlZF9yZXN5bmMpIHsKKyAgICAgIHJlc2V0X3JlZl9mcmFtZV9tYXAocGJpKTsKKyAgICAgIHBiaS0+bmVlZF9yZXN5bmMgPSAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoY3VycmVudF9mcmFtZS0+ZnJhbWVfdHlwZSA9PSBJTlRSQV9PTkxZX0ZSQU1FKSB7CisgICAgICBjdXJyZW50X2ZyYW1lLT5yZWZyZXNoX2ZyYW1lX2ZsYWdzID0gcGFyYW1zLT5wLnJlZnJlc2hfZnJhbWVfZmxhZ3M7IC8vYW9tX3JiX3JlYWRfbGl0ZXJhbChyYiwgUkVGX0ZSQU1FUyk7CisgICAgICBpZiAoY3VycmVudF9mcmFtZS0+cmVmcmVzaF9mcmFtZV9mbGFncyA9PSAweEZGKSB7CisgICAgICAgIGFvbV9pbnRlcm5hbF9lcnJvcigmY20tPmVycm9yLCBBT01fQ09ERUNfVU5TVVBfQklUU1RSRUFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludHJhIG9ubHkgZnJhbWVzIGNhbm5vdCBoYXZlIHJlZnJlc2ggZmxhZ3MgMHhGRiIpOworICAgICAgfQorICAgICAgaWYgKHBiaS0+bmVlZF9yZXN5bmMpIHsKKyAgICAgICAgcmVzZXRfcmVmX2ZyYW1lX21hcChwYmkpOworICAgICAgICBwYmktPm5lZWRfcmVzeW5jID0gMDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHBiaS0+bmVlZF9yZXN5bmMgIT0gMSkgeyAvKiBTa2lwIGlmIG5lZWQgcmVzeW5jICovCisgICAgICBjdXJyZW50X2ZyYW1lLT5yZWZyZXNoX2ZyYW1lX2ZsYWdzID0KKyAgICAgICAgICBmcmFtZV9pc19zZnJhbWUoY20pID8gMHhGRiA6IHBhcmFtcy0+cC5yZWZyZXNoX2ZyYW1lX2ZsYWdzOyAvL2FvbV9yYl9yZWFkX2xpdGVyYWwocmIsIFJFRl9GUkFNRVMpOworICAgIH0KKyAgfQorCisgIGlmICghZnJhbWVfaXNfaW50cmFfb25seShjbSkgfHwgY3VycmVudF9mcmFtZS0+cmVmcmVzaF9mcmFtZV9mbGFncyAhPSAweEZGKSB7CisgICAgLy8gUmVhZCBhbGwgcmVmIGZyYW1lIG9yZGVyIGhpbnRzIGlmIGVycm9yX3Jlc2lsaWVudF9tb2RlID09IDEKKyAgICBpZiAoY20tPmVycm9yX3Jlc2lsaWVudF9tb2RlICYmCisgICAgICAgIHNlcV9wYXJhbXMtPm9yZGVyX2hpbnRfaW5mby5lbmFibGVfb3JkZXJfaGludCkgeworICAgICAgaW50IHJlZl9pZHg7CisgICAgICBmb3IgKHJlZl9pZHggPSAwOyByZWZfaWR4IDwgUkVGX0ZSQU1FUzsgcmVmX2lkeCsrKSB7CisgICAgICAgIC8vIFJlYWQgb3JkZXIgaGludCBmcm9tIGJpdCBzdHJlYW0KKyAgICAgICAgdW5zaWduZWQgaW50IG9yZGVyX2hpbnQgPSBwYXJhbXMtPnAucmVmX29yZGVyX2hpbnRbcmVmX2lkeF07Lyphb21fcmJfcmVhZF9saXRlcmFsKAorICAgICAgICAgICAgcmIsIHNlcV9wYXJhbXMtPm9yZGVyX2hpbnRfaW5mby5vcmRlcl9oaW50X2JpdHNfbWludXNfMSArIDEpOyovCisgICAgICAgIC8vIEdldCBidWZmZXIKKyAgICAgICAgUmVmQ250QnVmZmVyICpidWYgPSBjbS0+cmVmX2ZyYW1lX21hcFtyZWZfaWR4XTsKKyAgICAgICAgaW50IGJ1Zl9pZHg7CisgICAgICAgIGlmIChidWYgPT0gTlVMTCB8fCBvcmRlcl9oaW50ICE9IGJ1Zi0+b3JkZXJfaGludCkgeworICAgICAgICAgIGlmIChidWYgIT0gTlVMTCkgeworICAgICAgICAgICAgbG9ja19idWZmZXJfcG9vbChwb29sLCBmbGFncyk7CisgICAgICAgICAgICBkZWNyZWFzZV9yZWZfY291bnQocGJpLCBidWYsIHBvb2wpOworICAgICAgICAgICAgdW5sb2NrX2J1ZmZlcl9wb29sKHBvb2wsIGZsYWdzKTsKKyAgICAgICAgICB9CisgICAgICAgICAgLy8gSWYgbm8gY29ycmVzcG9uZGluZyBidWZmZXIgZXhpc3RzLCBhbGxvY2F0ZSBhIG5ldyBidWZmZXIgd2l0aCBhbGwKKyAgICAgICAgICAvLyBwaXhlbHMgc2V0IHRvIG5ldXRyYWwgZ3JleS4KKyAgICAgICAgICBidWZfaWR4ID0gIGdldF9mcmVlX2ZyYW1lX2J1ZmZlcihjbSk7CisgICAgICAgICAgaWYgKGJ1Zl9pZHggPT0gSU5WQUxJRF9JRFgpIHsKKyAgICAgICAgICAgIGFvbV9pbnRlcm5hbF9lcnJvcigmY20tPmVycm9yLCBBT01fQ09ERUNfTUVNX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZmluZCBmcmVlIGZyYW1lIGJ1ZmZlciIpOworICAgICAgICAgIH0KKyAgICAgICAgICBidWYgPSAmZnJhbWVfYnVmc1tidWZfaWR4XTsKKyAgICAgICAgICBsb2NrX2J1ZmZlcl9wb29sKHBvb2wsIGZsYWdzKTsKKyAgICAgICAgICBpZiAoYW9tX3JlYWxsb2NfZnJhbWVfYnVmZmVyKGNtLCAmYnVmLT5idWYsIHNlcV9wYXJhbXMtPm1heF9mcmFtZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgIHNlcV9wYXJhbXMtPm1heF9mcmFtZV9oZWlnaHQsIGJ1Zi0+b3JkZXJfaGludCkpIHsKKyAgICAgICAgICAgIGRlY3JlYXNlX3JlZl9jb3VudChwYmksIGJ1ZiwgcG9vbCk7CisgICAgICAgICAgICB1bmxvY2tfYnVmZmVyX3Bvb2wocG9vbCwgZmxhZ3MpOworICAgICAgICAgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19NRU1fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBmcmFtZSBidWZmZXIiKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdW5sb2NrX2J1ZmZlcl9wb29sKHBvb2wsIGZsYWdzKTsKKyNpZmRlZiBPUklfQ09ERQorICAgICAgICAgIHNldF9wbGFuZXNfdG9fbmV1dHJhbF9ncmV5KHNlcV9wYXJhbXMsICZidWYtPmJ1ZiwgMCk7CisjZW5kaWYKKyAgICAgICAgICBjbS0+cmVmX2ZyYW1lX21hcFtyZWZfaWR4XSA9IGJ1ZjsKKyAgICAgICAgICBidWYtPm9yZGVyX2hpbnQgPSBvcmRlcl9oaW50OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGN1cnJlbnRfZnJhbWUtPmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKSB7CisgICAgc2V0dXBfZnJhbWVfc2l6ZShjbSwgZnJhbWVfc2l6ZV9vdmVycmlkZV9mbGFnLCBwYXJhbXMpOworI2lmZGVmIE9SSV9DT0RFCisgICAgaWYgKGNtLT5hbGxvd19zY3JlZW5fY29udGVudF90b29scyAmJiAhYXYxX3N1cGVycmVzX3NjYWxlZChjbSkpCisgICAgICBjbS0+YWxsb3dfaW50cmFiYyA9IGFvbV9yYl9yZWFkX2JpdChyYik7CisjZW5kaWYKKyAgICBjbS0+YWxsb3dfcmVmX2ZyYW1lX212cyA9IDA7CisgICAgY20tPnByZXZfZnJhbWUgPSBOVUxMOworICB9IGVsc2UgeworICAgIGNtLT5hbGxvd19yZWZfZnJhbWVfbXZzID0gMDsKKworICAgIGlmIChjdXJyZW50X2ZyYW1lLT5mcmFtZV90eXBlID09IElOVFJBX09OTFlfRlJBTUUpIHsKKyNpZmRlZiBPUklfQ09ERQorICAgICAgY20tPmN1cl9mcmFtZS0+ZmlsbV9ncmFpbl9wYXJhbXNfcHJlc2VudCA9CisgICAgICAgICAgc2VxX3BhcmFtcy0+ZmlsbV9ncmFpbl9wYXJhbXNfcHJlc2VudDsKKyNlbmRpZgorICAgICAgc2V0dXBfZnJhbWVfc2l6ZShjbSwgZnJhbWVfc2l6ZV9vdmVycmlkZV9mbGFnLCBwYXJhbXMpOworI2lmZGVmIE9SSV9DT0RFCisgICAgICBpZiAoY20tPmFsbG93X3NjcmVlbl9jb250ZW50X3Rvb2xzICYmICFhdjFfc3VwZXJyZXNfc2NhbGVkKGNtKSkKKyAgICAgICAgY20tPmFsbG93X2ludHJhYmMgPSBhb21fcmJfcmVhZF9iaXQocmIpOworI2VuZGlmCisgICAgfSBlbHNlIGlmIChwYmktPm5lZWRfcmVzeW5jICE9IDEpIHsgLyogU2tpcCBpZiBuZWVkIHJlc3luYyAqLworICAgICAgaW50IGZyYW1lX3JlZnNfc2hvcnRfc2lnbmFsaW5nID0gMDsKKyAgICAgIC8vIEZyYW1lIHJlZnMgc2hvcnQgc2lnbmFsaW5nIGlzIG9mZiB3aGVuIGVycm9yIHJlc2lsaWVudCBtb2RlIGlzIG9uLgorICAgICAgaWYgKHNlcV9wYXJhbXMtPm9yZGVyX2hpbnRfaW5mby5lbmFibGVfb3JkZXJfaGludCkKKyAgICAgICAgZnJhbWVfcmVmc19zaG9ydF9zaWduYWxpbmcgPSBwYXJhbXMtPnAuZnJhbWVfcmVmc19zaG9ydF9zaWduYWxpbmc7Ly9hb21fcmJfcmVhZF9iaXQocmIpOworCisgICAgICBpZiAoZnJhbWVfcmVmc19zaG9ydF9zaWduYWxpbmcpIHsKKyAgICAgICAgLy8gPT0gTEFTVF9GUkFNRSA9PQorICAgICAgICBjb25zdCBpbnQgbHN0X3JlZiA9IHBhcmFtcy0+cC5sc3RfcmVmOyAvL2FvbV9yYl9yZWFkX2xpdGVyYWwocmIsIFJFRl9GUkFNRVNfTE9HMik7CisgICAgICAgIGNvbnN0IFJlZkNudEJ1ZmZlciAqY29uc3QgbHN0X2J1ZiA9IGNtLT5yZWZfZnJhbWVfbWFwW2xzdF9yZWZdOworCisgICAgICAgIC8vID09IEdPTERFTl9GUkFNRSA9PQorICAgICAgICBjb25zdCBpbnQgZ2xkX3JlZiA9IHBhcmFtcy0+cC5nbGRfcmVmOyAvL2FvbV9yYl9yZWFkX2xpdGVyYWwocmIsIFJFRl9GUkFNRVNfTE9HMik7CisgICAgICAgIGNvbnN0IFJlZkNudEJ1ZmZlciAqY29uc3QgZ2xkX2J1ZiA9IGNtLT5yZWZfZnJhbWVfbWFwW2dsZF9yZWZdOworCisgICAgICAgIC8vIE1vc3Qgb2YgdGhlIHRpbWUsIHN0cmVhbXMgc3RhcnQgd2l0aCBhIGtleWZyYW1lLiBJbiB0aGF0IGNhc2UsCisgICAgICAgIC8vIHJlZl9mcmFtZV9tYXAgd2lsbCBoYXZlIGJlZW4gZmlsbGVkIGluIGF0IHRoYXQgcG9pbnQgYW5kIHdpbGwgbm90CisgICAgICAgIC8vIGNvbnRhaW4gYW55IE5VTExzLiBIb3dldmVyLCBzdHJlYW1zIGFyZSBleHBsaWNpdGx5IGFsbG93ZWQgdG8gc3RhcnQKKyAgICAgICAgLy8gd2l0aCBhbiBpbnRyYS1vbmx5IGZyYW1lLCBzbyBsb25nIGFzIHRoZXkgZG9uJ3QgdGhlbiBzaWduYWwgYQorICAgICAgICAvLyByZWZlcmVuY2UgdG8gYSBzbG90IHRoYXQgaGFzbid0IGJlZW4gc2V0IHlldC4gVGhhdCdzIHdoYXQgd2UgYXJlCisgICAgICAgIC8vIGNoZWNraW5nIGhlcmUuCisgICAgICAgIGlmIChsc3RfYnVmID09IE5VTEwpCisgICAgICAgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXIgZnJhbWUgcmVxdWVzdHMgbm9uZXhpc3RlbnQgcmVmZXJlbmNlIik7CisgICAgICAgIGlmIChnbGRfYnVmID09IE5VTEwpCisgICAgICAgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXIgZnJhbWUgcmVxdWVzdHMgbm9uZXhpc3RlbnQgcmVmZXJlbmNlIik7CisKKyAgICAgICAgYXYxX3NldF9mcmFtZV9yZWZzKGNtLCBjbS0+cmVtYXBwZWRfcmVmX2lkeCwgbHN0X3JlZiwgZ2xkX3JlZik7CisgICAgICB9CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBJTlRFUl9SRUZTX1BFUl9GUkFNRTsgKytpKSB7CisgICAgICAgIGludCByZWYgPSAwOworICAgICAgICBpZiAoIWZyYW1lX3JlZnNfc2hvcnRfc2lnbmFsaW5nKSB7CisgICAgICAgICAgcmVmID0gcGFyYW1zLT5wLnJlbWFwcGVkX3JlZl9pZHhbaV07Ly9hb21fcmJfcmVhZF9saXRlcmFsKHJiLCBSRUZfRlJBTUVTX0xPRzIpOworCisgICAgICAgICAgLy8gTW9zdCBvZiB0aGUgdGltZSwgc3RyZWFtcyBzdGFydCB3aXRoIGEga2V5ZnJhbWUuIEluIHRoYXQgY2FzZSwKKyAgICAgICAgICAvLyByZWZfZnJhbWVfbWFwIHdpbGwgaGF2ZSBiZWVuIGZpbGxlZCBpbiBhdCB0aGF0IHBvaW50IGFuZCB3aWxsIG5vdAorICAgICAgICAgIC8vIGNvbnRhaW4gYW55IE5VTExzLiBIb3dldmVyLCBzdHJlYW1zIGFyZSBleHBsaWNpdGx5IGFsbG93ZWQgdG8gc3RhcnQKKyAgICAgICAgICAvLyB3aXRoIGFuIGludHJhLW9ubHkgZnJhbWUsIHNvIGxvbmcgYXMgdGhleSBkb24ndCB0aGVuIHNpZ25hbCBhCisgICAgICAgICAgLy8gcmVmZXJlbmNlIHRvIGEgc2xvdCB0aGF0IGhhc24ndCBiZWVuIHNldCB5ZXQuIFRoYXQncyB3aGF0IHdlIGFyZQorICAgICAgICAgIC8vIGNoZWNraW5nIGhlcmUuCisgICAgICAgICAgaWYgKGNtLT5yZWZfZnJhbWVfbWFwW3JlZl0gPT0gTlVMTCkKKyAgICAgICAgICAgIGFvbV9pbnRlcm5hbF9lcnJvcigmY20tPmVycm9yLCBBT01fQ09ERUNfQ09SUlVQVF9GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXIgZnJhbWUgcmVxdWVzdHMgbm9uZXhpc3RlbnQgcmVmZXJlbmNlIik7CisgICAgICAgICAgY20tPnJlbWFwcGVkX3JlZl9pZHhbaV0gPSByZWY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVmID0gY20tPnJlbWFwcGVkX3JlZl9pZHhbaV07CisgICAgICAgIH0KKworICAgICAgICBjbS0+cmVmX2ZyYW1lX3NpZ25fYmlhc1tMQVNUX0ZSQU1FICsgaV0gPSAwOworCisgICAgICAgIGlmIChzZXFfcGFyYW1zLT5mcmFtZV9pZF9udW1iZXJzX3ByZXNlbnRfZmxhZykgeworICAgICAgICAgIGludCBmcmFtZV9pZF9sZW5ndGggPSBzZXFfcGFyYW1zLT5mcmFtZV9pZF9sZW5ndGg7CisgICAgICAgICAgLy9pbnQgZGlmZl9sZW4gPSBzZXFfcGFyYW1zLT5kZWx0YV9mcmFtZV9pZF9sZW5ndGg7CisgICAgICAgICAgaW50IGRlbHRhX2ZyYW1lX2lkX21pbnVzXzEgPSBwYXJhbXMtPnAuZGVsdGFfZnJhbWVfaWRfbWludXNfMVtpXTsvL2FvbV9yYl9yZWFkX2xpdGVyYWwocmIsIGRpZmZfbGVuKTsKKyAgICAgICAgICBpbnQgcmVmX2ZyYW1lX2lkID0KKyAgICAgICAgICAgICAgKChjbS0+Y3VycmVudF9mcmFtZV9pZCAtIChkZWx0YV9mcmFtZV9pZF9taW51c18xICsgMSkgKworICAgICAgICAgICAgICAgICgxIDw8IGZyYW1lX2lkX2xlbmd0aCkpICUKKyAgICAgICAgICAgICAgICgxIDw8IGZyYW1lX2lkX2xlbmd0aCkpOworICAgICAgICAgIC8vIENvbXBhcmUgdmFsdWVzIGRlcml2ZWQgZnJvbSBkZWx0YV9mcmFtZV9pZF9taW51c18xIGFuZAorICAgICAgICAgIC8vIHJlZnJlc2hfZnJhbWVfZmxhZ3MuIEFsc28sIGNoZWNrIHZhbGlkIGZvciByZWZlcmVuY2luZworICAgICAgICAgIGlmIChyZWZfZnJhbWVfaWQgIT0gY20tPnJlZl9mcmFtZV9pZFtyZWZdIHx8CisgICAgICAgICAgICAgIGNtLT52YWxpZF9mb3JfcmVmZXJlbmNpbmdbcmVmXSA9PSAwKQorICAgICAgICAgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWZlcmVuY2UgYnVmZmVyIGZyYW1lIElEIG1pc21hdGNoIik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKCFjbS0+ZXJyb3JfcmVzaWxpZW50X21vZGUgJiYgZnJhbWVfc2l6ZV9vdmVycmlkZV9mbGFnKSB7CisgICAgICAgIHNldHVwX2ZyYW1lX3NpemVfd2l0aF9yZWZzKGNtLCBwYXJhbXMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0dXBfZnJhbWVfc2l6ZShjbSwgZnJhbWVfc2l6ZV9vdmVycmlkZV9mbGFnLCBwYXJhbXMpOworICAgICAgfQorI2lmZGVmIE9SSV9DT0RFCisgICAgICBpZiAoY20tPmN1cl9mcmFtZV9mb3JjZV9pbnRlZ2VyX212KSB7CisgICAgICAgIGNtLT5hbGxvd19oaWdoX3ByZWNpc2lvbl9tdiA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBjbS0+YWxsb3dfaGlnaF9wcmVjaXNpb25fbXYgPSBhb21fcmJfcmVhZF9iaXQocmIpOworICAgICAgfQorICAgICAgY20tPmludGVycF9maWx0ZXIgPSByZWFkX2ZyYW1lX2ludGVycF9maWx0ZXIocmIpOworICAgICAgY20tPnN3aXRjaGFibGVfbW90aW9uX21vZGUgPSBhb21fcmJfcmVhZF9iaXQocmIpOworI2VuZGlmCisgICAgfQorCisgICAgY20tPnByZXZfZnJhbWUgPSBnZXRfcHJpbWFyeV9yZWZfZnJhbWVfYnVmKGNtKTsKKyAgICBpZiAoY20tPnByaW1hcnlfcmVmX2ZyYW1lICE9IFBSSU1BUllfUkVGX05PTkUgJiYKKyAgICAgICAgZ2V0X3ByaW1hcnlfcmVmX2ZyYW1lX2J1ZihjbSkgPT0gTlVMTCkgeworICAgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICJSZWZlcmVuY2UgZnJhbWUgY29udGFpbmluZyB0aGlzIGZyYW1lJ3MgaW5pdGlhbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImZyYW1lIGNvbnRleHQgaXMgdW5hdmFpbGFibGUuIik7CisgICAgfQorI2lmIDAKKyAgICBhdjFfcHJpbnQyKEFWMV9ERUJVR19CVUZNR1JfREVUQUlMLCAiJWQsJWQsJWQsJWRcbiIsY20tPmVycm9yX3Jlc2lsaWVudF9tb2RlLAorICAgICAgY20tPnNlcV9wYXJhbXMub3JkZXJfaGludF9pbmZvLmVuYWJsZV9yZWZfZnJhbWVfbXZzLAorICAgICAgY20tPnNlcV9wYXJhbXMub3JkZXJfaGludF9pbmZvLmVuYWJsZV9vcmRlcl9oaW50LGZyYW1lX2lzX2ludHJhX29ubHkoY20pKTsKKworICAgIHByaW50ZigiZnJhbWVfbWlnaHRfYWxsb3dfcmVmX2ZyYW1lX212cygpPT4lZCwgY3VycmVudF9mcmFtZS0+ZnJhbWVfdHlwZT0lZCwgcGJpLT5uZWVkX3Jlc3luYz0lZCwgcGFyYW1zLT5wLmFsbG93X3JlZl9mcmFtZV9tdnM9JWRcbiIsCisgICAgICAgIGZyYW1lX21pZ2h0X2FsbG93X3JlZl9mcmFtZV9tdnMoY20pLCBjdXJyZW50X2ZyYW1lLT5mcmFtZV90eXBlLCBwYmktPm5lZWRfcmVzeW5jLAorICAgICAgICBwYXJhbXMtPnAuYWxsb3dfcmVmX2ZyYW1lX212cyk7CisjZW5kaWYKKyAgICBpZiAoIShjdXJyZW50X2ZyYW1lLT5mcmFtZV90eXBlID09IElOVFJBX09OTFlfRlJBTUUpICYmCisgICAgICAgIHBiaS0+bmVlZF9yZXN5bmMgIT0gMSkgeworICAgICAgaWYgKGZyYW1lX21pZ2h0X2FsbG93X3JlZl9mcmFtZV9tdnMoY20pKQorICAgICAgICBjbS0+YWxsb3dfcmVmX2ZyYW1lX212cyA9IHBhcmFtcy0+cC5hbGxvd19yZWZfZnJhbWVfbXZzOyAvL2FvbV9yYl9yZWFkX2JpdCgtMSwgIjxhbGxvd19yZWZfZnJhbWVfbXZzPiIsIHJiKTsKKyAgICAgIGVsc2UKKyAgICAgICAgY20tPmFsbG93X3JlZl9mcmFtZV9tdnMgPSAwOworCisjaWZkZWYgU1VQUE9SVF9TQ0FMRV9GQUNUT1IKKyAgICAgIGZvciAoaSA9IExBU1RfRlJBTUU7IGkgPD0gQUxUUkVGX0ZSQU1FOyArK2kpIHsKKyAgICAgICAgY29uc3QgUmVmQ250QnVmZmVyICpjb25zdCByZWZfYnVmID0gZ2V0X3JlZl9mcmFtZV9idWYoY20sIGkpOworICAgICAgICBzdHJ1Y3Qgc2NhbGVfZmFjdG9ycyAqY29uc3QgcmVmX3NjYWxlX2ZhY3RvcnMgPQorICAgICAgICAgICAgZ2V0X3JlZl9zY2FsZV9mYWN0b3JzKGNtLCBpKTsKKyAgICAgICBpZiAocmVmX2J1ZiAhPSBOVUxMKSB7CisjaWZkZWYgQU1MCisgICAgICAgIGF2MV9zZXR1cF9zY2FsZV9mYWN0b3JzX2Zvcl9mcmFtZSgKKyAgICAgICAgICAgIHJlZl9zY2FsZV9mYWN0b3JzLCByZWZfYnVmLT5idWYueV9jcm9wX3dpZHRoLAorICAgICAgICAgICAgcmVmX2J1Zi0+YnVmLnlfY3JvcF9oZWlnaHQsIGNtLT5kZWNfd2lkdGgsIGNtLT5oZWlnaHQpOworI2Vsc2UKKyAgICAgICAgYXYxX3NldHVwX3NjYWxlX2ZhY3RvcnNfZm9yX2ZyYW1lKAorICAgICAgICAgICAgcmVmX3NjYWxlX2ZhY3RvcnMsIHJlZl9idWYtPmJ1Zi55X2Nyb3Bfd2lkdGgsCisgICAgICAgICAgICByZWZfYnVmLT5idWYueV9jcm9wX2hlaWdodCwgY20tPndpZHRoLCBjbS0+aGVpZ2h0KTsKKyNlbmRpZgorICAgICAgfQorICAgICAgIGlmIChyZWZfc2NhbGVfZmFjdG9ycykgeworICAgICAgICBpZiAoKCFhdjFfaXNfdmFsaWRfc2NhbGUocmVmX3NjYWxlX2ZhY3RvcnMpKSkKKyAgICAgICAgICBhb21faW50ZXJuYWxfZXJyb3IoJmNtLT5lcnJvciwgQU9NX0NPREVDX1VOU1VQX0JJVFNUUkVBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZmVyZW5jZSBmcmFtZSBoYXMgaW52YWxpZCBkaW1lbnNpb25zIik7CisgICAgICAgfQorICAgICAgfQorI2VuZGlmCisgICAgfQorICB9CisKKyAgYXYxX3NldHVwX2ZyYW1lX2J1Zl9yZWZzKGNtKTsKKworICBhdjFfc2V0dXBfZnJhbWVfc2lnbl9iaWFzKGNtKTsKKworICBjbS0+Y3VyX2ZyYW1lLT5mcmFtZV90eXBlID0gY3VycmVudF9mcmFtZS0+ZnJhbWVfdHlwZTsKKworICBpZiAoc2VxX3BhcmFtcy0+ZnJhbWVfaWRfbnVtYmVyc19wcmVzZW50X2ZsYWcpIHsKKyAgICB1cGRhdGVfcmVmX2ZyYW1lX2lkKGNtLCBjbS0+Y3VycmVudF9mcmFtZV9pZCk7CisgIH0KKyNpZmRlZiBPUklfQ09ERQorICBjb25zdCBpbnQgbWlnaHRfYndkX2FkYXB0ID0KKyAgICAgICEoc2VxX3BhcmFtcy0+cmVkdWNlZF9zdGlsbF9waWN0dXJlX2hkcikgJiYgIShjbS0+ZGlzYWJsZV9jZGZfdXBkYXRlKTsKKyAgaWYgKG1pZ2h0X2J3ZF9hZGFwdCkgeworICAgIGNtLT5yZWZyZXNoX2ZyYW1lX2NvbnRleHQgPSBhb21fcmJfcmVhZF9iaXQocmIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFJFRlJFU0hfRlJBTUVfQ09OVEVYVF9ESVNBQkxFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBSRUZSRVNIX0ZSQU1FX0NPTlRFWFRfQkFDS1dBUkQ7CisgIH0gZWxzZSB7CisgICAgY20tPnJlZnJlc2hfZnJhbWVfY29udGV4dCA9IFJFRlJFU0hfRlJBTUVfQ09OVEVYVF9ESVNBQkxFRDsKKyAgfQorI2VuZGlmCisKKyAgY20tPmN1cl9mcmFtZS0+YnVmLmJpdF9kZXB0aCA9IHNlcV9wYXJhbXMtPmJpdF9kZXB0aDsKKyAgY20tPmN1cl9mcmFtZS0+YnVmLmNvbG9yX3ByaW1hcmllcyA9IHNlcV9wYXJhbXMtPmNvbG9yX3ByaW1hcmllczsKKyAgY20tPmN1cl9mcmFtZS0+YnVmLnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljcyA9CisgICAgICBzZXFfcGFyYW1zLT50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3M7CisgIGNtLT5jdXJfZnJhbWUtPmJ1Zi5tYXRyaXhfY29lZmZpY2llbnRzID0gc2VxX3BhcmFtcy0+bWF0cml4X2NvZWZmaWNpZW50czsKKyAgY20tPmN1cl9mcmFtZS0+YnVmLm1vbm9jaHJvbWUgPSBzZXFfcGFyYW1zLT5tb25vY2hyb21lOworICBjbS0+Y3VyX2ZyYW1lLT5idWYuY2hyb21hX3NhbXBsZV9wb3NpdGlvbiA9CisgICAgICBzZXFfcGFyYW1zLT5jaHJvbWFfc2FtcGxlX3Bvc2l0aW9uOworICBjbS0+Y3VyX2ZyYW1lLT5idWYuY29sb3JfcmFuZ2UgPSBzZXFfcGFyYW1zLT5jb2xvcl9yYW5nZTsKKyAgY20tPmN1cl9mcmFtZS0+YnVmLnJlbmRlcl93aWR0aCA9IGNtLT5yZW5kZXJfd2lkdGg7CisgIGNtLT5jdXJfZnJhbWUtPmJ1Zi5yZW5kZXJfaGVpZ2h0ID0gY20tPnJlbmRlcl9oZWlnaHQ7CisKKyAgaWYgKHBiaS0+bmVlZF9yZXN5bmMpIHsKKyAgICBhb21faW50ZXJuYWxfZXJyb3IoJmNtLT5lcnJvciwgQU9NX0NPREVDX0NPUlJVUFRfRlJBTUUsCisgICAgICAgICAgICAgICAgICAgICAgICJLZXlmcmFtZSAvIGludHJhLW9ubHkgZnJhbWUgcmVxdWlyZWQgdG8gcmVzZXQgZGVjb2RlciIKKyAgICAgICAgICAgICAgICAgICAgICAgIiBzdGF0ZSIpOworICB9CisKKyAgZ2VuZXJhdGVfbmV4dF9yZWZfZnJhbWVfbWFwKHBiaSk7CisKKyNpZmRlZiBPUklfQ09ERQorICBpZiAoY20tPmFsbG93X2ludHJhYmMpIHsKKyAgICAvLyBTZXQgcGFyYW1ldGVycyBjb3JyZXNwb25kaW5nIHRvIG5vIGZpbHRlcmluZy4KKyAgICBzdHJ1Y3QgbG9vcGZpbHRlciAqbGYgPSAmY20tPmxmOworICAgIGxmLT5maWx0ZXJfbGV2ZWxbMF0gPSAwOworICAgIGxmLT5maWx0ZXJfbGV2ZWxbMV0gPSAwOworICAgIGNtLT5jZGVmX2luZm8uY2RlZl9iaXRzID0gMDsKKyAgICBjbS0+Y2RlZl9pbmZvLmNkZWZfc3RyZW5ndGhzWzBdID0gMDsKKyAgICBjbS0+Y2RlZl9pbmZvLm5iX2NkZWZfc3RyZW5ndGhzID0gMTsKKyAgICBjbS0+Y2RlZl9pbmZvLmNkZWZfdXZfc3RyZW5ndGhzWzBdID0gMDsKKyAgICBjbS0+cnN0X2luZm9bMF0uZnJhbWVfcmVzdG9yYXRpb25fdHlwZSA9IFJFU1RPUkVfTk9ORTsKKyAgICBjbS0+cnN0X2luZm9bMV0uZnJhbWVfcmVzdG9yYXRpb25fdHlwZSA9IFJFU1RPUkVfTk9ORTsKKyAgICBjbS0+cnN0X2luZm9bMl0uZnJhbWVfcmVzdG9yYXRpb25fdHlwZSA9IFJFU1RPUkVfTk9ORTsKKyAgfQorCisgIHJlYWRfdGlsZV9pbmZvKHBiaSwgcmIpOworICBpZiAoIWF2MV9pc19taW5fdGlsZV93aWR0aF9zYXRpc2ZpZWQoY20pKSB7CisgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAiTWluaW11bSB0aWxlIHdpZHRoIHJlcXVpcmVtZW50IG5vdCBzYXRpc2ZpZWQiKTsKKyAgfQorCisgIHNldHVwX3F1YW50aXphdGlvbihjbSwgcmIpOworICB4ZC0+YmQgPSAoaW50KXNlcV9wYXJhbXMtPmJpdF9kZXB0aDsKKworICBpZiAoY20tPm51bV9hbGxvY2F0ZWRfYWJvdmVfY29udGV4dF9wbGFuZXMgPCBhdjFfbnVtX3BsYW5lcyhjbSkgfHwKKyAgICAgIGNtLT5udW1fYWxsb2NhdGVkX2Fib3ZlX2NvbnRleHRfbWlfY29sIDwgY20tPm1pX2NvbHMgfHwKKyAgICAgIGNtLT5udW1fYWxsb2NhdGVkX2Fib3ZlX2NvbnRleHRzIDwgY20tPnRpbGVfcm93cykgeworICAgIGF2MV9mcmVlX2Fib3ZlX2NvbnRleHRfYnVmZmVycyhjbSwgY20tPm51bV9hbGxvY2F0ZWRfYWJvdmVfY29udGV4dHMpOworICAgIGlmIChhdjFfYWxsb2NfYWJvdmVfY29udGV4dF9idWZmZXJzKGNtLCBjbS0+dGlsZV9yb3dzKSkKKyAgICAgIGFvbV9pbnRlcm5hbF9lcnJvcigmY20tPmVycm9yLCBBT01fQ09ERUNfTUVNX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgY29udGV4dCBidWZmZXJzIik7CisgIH0KKworICBpZiAoY20tPnByaW1hcnlfcmVmX2ZyYW1lID09IFBSSU1BUllfUkVGX05PTkUpIHsKKyAgICBhdjFfc2V0dXBfcGFzdF9pbmRlcGVuZGVuY2UoY20pOworICB9CisKKyAgc2V0dXBfc2VnbWVudGF0aW9uKGNtLCBwYXJhbXMpOworCisgIGNtLT5kZWx0YV9xX2luZm8uZGVsdGFfcV9yZXMgPSAxOworICBjbS0+ZGVsdGFfcV9pbmZvLmRlbHRhX2xmX3JlcyA9IDE7CisgIGNtLT5kZWx0YV9xX2luZm8uZGVsdGFfbGZfcHJlc2VudF9mbGFnID0gMDsKKyAgY20tPmRlbHRhX3FfaW5mby5kZWx0YV9sZl9tdWx0aSA9IDA7CisgIGNtLT5kZWx0YV9xX2luZm8uZGVsdGFfcV9wcmVzZW50X2ZsYWcgPQorICAgICAgY20tPmJhc2VfcWluZGV4ID4gMCA/IGFvbV9yYl9yZWFkX2JpdCgtMSwgZGVmbWFyaywgcmIpIDogMDsKKyAgaWYgKGNtLT5kZWx0YV9xX2luZm8uZGVsdGFfcV9wcmVzZW50X2ZsYWcpIHsKKyAgICB4ZC0+Y3VycmVudF9xaW5kZXggPSBjbS0+YmFzZV9xaW5kZXg7CisgICAgY20tPmRlbHRhX3FfaW5mby5kZWx0YV9xX3JlcyA9IDEgPDwgYW9tX3JiX3JlYWRfbGl0ZXJhbCgtMSwgZGVmbWFyaywgcmIsIDIpOworICAgIGlmICghY20tPmFsbG93X2ludHJhYmMpCisgICAgICBjbS0+ZGVsdGFfcV9pbmZvLmRlbHRhX2xmX3ByZXNlbnRfZmxhZyA9IGFvbV9yYl9yZWFkX2JpdCgtMSwgZGVmbWFyaywgcmIpOworICAgIGlmIChjbS0+ZGVsdGFfcV9pbmZvLmRlbHRhX2xmX3ByZXNlbnRfZmxhZykgeworICAgICAgY20tPmRlbHRhX3FfaW5mby5kZWx0YV9sZl9yZXMgPSAxIDw8IGFvbV9yYl9yZWFkX2xpdGVyYWwoLTEsIGRlZm1hcmssIHJiLCAyKTsKKyAgICAgIGNtLT5kZWx0YV9xX2luZm8uZGVsdGFfbGZfbXVsdGkgPSBhb21fcmJfcmVhZF9iaXQoLTEsIGRlZm1hcmssIHJiKTsKKyAgICAgIGF2MV9yZXNldF9sb29wX2ZpbHRlcl9kZWx0YSh4ZCwgYXYxX251bV9wbGFuZXMoY20pKTsKKyAgICB9CisgIH0KKworICB4ZC0+Y3VyX2ZyYW1lX2ZvcmNlX2ludGVnZXJfbXYgPSBjbS0+Y3VyX2ZyYW1lX2ZvcmNlX2ludGVnZXJfbXY7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfU0VHTUVOVFM7ICsraSkgeworICAgIGNvbnN0IGludCBxaW5kZXggPSBhdjFfZ2V0X3FpbmRleCgmY20tPnNlZywgaSwgY20tPmJhc2VfcWluZGV4KTsKKyAgICB4ZC0+bG9zc2xlc3NbaV0gPSBxaW5kZXggPT0gMCAmJiBjbS0+eV9kY19kZWx0YV9xID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICBjbS0+dV9kY19kZWx0YV9xID09IDAgJiYgY20tPnVfYWNfZGVsdGFfcSA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgY20tPnZfZGNfZGVsdGFfcSA9PSAwICYmIGNtLT52X2FjX2RlbHRhX3EgPT0gMDsKKyAgICB4ZC0+cWluZGV4W2ldID0gcWluZGV4OworICB9CisgIGNtLT5jb2RlZF9sb3NzbGVzcyA9IGlzX2NvZGVkX2xvc3NsZXNzKGNtLCB4ZCk7CisgIGNtLT5hbGxfbG9zc2xlc3MgPSBjbS0+Y29kZWRfbG9zc2xlc3MgJiYgIWF2MV9zdXBlcnJlc19zY2FsZWQoY20pOworICBzZXR1cF9zZWdtZW50YXRpb25fZGVxdWFudChjbSwgeGQpOworICBpZiAoY20tPmNvZGVkX2xvc3NsZXNzKSB7CisgICAgY20tPmxmLmZpbHRlcl9sZXZlbFswXSA9IDA7CisgICAgY20tPmxmLmZpbHRlcl9sZXZlbFsxXSA9IDA7CisgIH0KKyAgaWYgKGNtLT5jb2RlZF9sb3NzbGVzcyB8fCAhc2VxX3BhcmFtcy0+ZW5hYmxlX2NkZWYpIHsKKyAgICBjbS0+Y2RlZl9pbmZvLmNkZWZfYml0cyA9IDA7CisgICAgY20tPmNkZWZfaW5mby5jZGVmX3N0cmVuZ3Roc1swXSA9IDA7CisgICAgY20tPmNkZWZfaW5mby5jZGVmX3V2X3N0cmVuZ3Roc1swXSA9IDA7CisgIH0KKyAgaWYgKGNtLT5hbGxfbG9zc2xlc3MgfHwgIXNlcV9wYXJhbXMtPmVuYWJsZV9yZXN0b3JhdGlvbikgeworICAgIGNtLT5yc3RfaW5mb1swXS5mcmFtZV9yZXN0b3JhdGlvbl90eXBlID0gUkVTVE9SRV9OT05FOworICAgIGNtLT5yc3RfaW5mb1sxXS5mcmFtZV9yZXN0b3JhdGlvbl90eXBlID0gUkVTVE9SRV9OT05FOworICAgIGNtLT5yc3RfaW5mb1syXS5mcmFtZV9yZXN0b3JhdGlvbl90eXBlID0gUkVTVE9SRV9OT05FOworICB9CisgIHNldHVwX2xvb3BmaWx0ZXIoY20sIHJiKTsKKworICBpZiAoIWNtLT5jb2RlZF9sb3NzbGVzcyAmJiBzZXFfcGFyYW1zLT5lbmFibGVfY2RlZikgeworICAgIHNldHVwX2NkZWYoY20sIHJiKTsKKyAgfQorICBpZiAoIWNtLT5hbGxfbG9zc2xlc3MgJiYgc2VxX3BhcmFtcy0+ZW5hYmxlX3Jlc3RvcmF0aW9uKSB7CisgICAgZGVjb2RlX3Jlc3RvcmF0aW9uX21vZGUoY20sIHJiKTsKKyAgfQorCisgIGNtLT50eF9tb2RlID0gcmVhZF90eF9tb2RlKGNtLCByYik7CisjZW5kaWYKKworICBjdXJyZW50X2ZyYW1lLT5yZWZlcmVuY2VfbW9kZSA9IHJlYWRfZnJhbWVfcmVmZXJlbmNlX21vZGUoY20sIHBhcmFtcyk7CisKKyNpZmRlZiBPUklfQ09ERQorICBpZiAoY3VycmVudF9mcmFtZS0+cmVmZXJlbmNlX21vZGUgIT0gU0lOR0xFX1JFRkVSRU5DRSkKKyAgICBzZXR1cF9jb21wb3VuZF9yZWZlcmVuY2VfbW9kZShjbSk7CisKKworI2VuZGlmCisKKyAgYXYxX3NldHVwX3NraXBfbW9kZV9hbGxvd2VkKGNtKTsKKworICAvKgorICAgIHRoZSBwb2ludCB0aGF0IHVjb2RlIHNlbmQgc2VuZF9idWZtZ3JfaW5mbworICAgIGFuZCB3YWl0IGJ1Zm1nciBjb2RlIHRvIHJldHVybiBpc19za2lwX21vZGVfYWxsb3dlZAorICAqLworCisgIC8qCisgIHJlYWRfdW5jb21wcmVzc2VkX2hlYWRlcigpIGVuZAorICAqLworCisgIGF2MV9zZXR1cF9tb3Rpb25fZmllbGQoY20pOworI2lmZGVmIEFNTAorICBjbS0+Y3VyX2ZyYW1lLT5taV9jb2xzID0gY20tPm1pX2NvbHM7CisgIGNtLT5jdXJfZnJhbWUtPm1pX3Jvd3MgPSBjbS0+bWlfcm93czsKKyAgY20tPmN1cl9mcmFtZS0+ZGVjX3dpZHRoID0gY20tPmRlY193aWR0aDsKKworICAvKgorICBzdXBlcnJlc19wb3N0X2RlY29kZShBVjFEZWNvZGVyICpwYmkpID0+CisgICAgYXYxX3N1cGVycmVzX3Vwc2NhbGUoY20sIHBvb2wpOyA9PgorICAgICAgYW9tX3JlYWxsb2NfZnJhbWVfYnVmZmVyKAorICAgICAgICAgICAgZnJhbWVfdG9fc2hvdywgY20tPnN1cGVycmVzX3Vwc2NhbGVkX3dpZHRoLAorICAgICAgICAgICAgY20tPnN1cGVycmVzX3Vwc2NhbGVkX2hlaWdodCwgc2VxX3BhcmFtcy0+c3Vic2FtcGxpbmdfeCwKKyAgICAgICAgICAgIHNlcV9wYXJhbXMtPnN1YnNhbXBsaW5nX3ksIHNlcV9wYXJhbXMtPnVzZV9oaWdoYml0ZGVwdGgsCisgICAgICAgICAgICBBT01fQk9SREVSX0lOX1BJWEVMUywgY20tPmJ5dGVfYWxpZ25tZW50LCBmYiwgY2IsIGNiX3ByaXYpCisgICovCisgIGFvbV9yZWFsbG9jX2ZyYW1lX2J1ZmZlcihjbSwgJmNtLT5jdXJfZnJhbWUtPmJ1ZiwKKyAgICBjbS0+c3VwZXJyZXNfdXBzY2FsZWRfd2lkdGgsIGNtLT5zdXBlcnJlc191cHNjYWxlZF9oZWlnaHQsCisgICAgY20tPmN1cl9mcmFtZS0+b3JkZXJfaGludCk7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXJlX3NlcV9oZWFkZXJzX2NvbnNpc3RlbnQoY29uc3QgU2VxdWVuY2VIZWFkZXIgKnNlcV9wYXJhbXNfb2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZXF1ZW5jZUhlYWRlciAqc2VxX3BhcmFtc19uZXcpIHsKKyAgcmV0dXJuICFtZW1jbXAoc2VxX3BhcmFtc19vbGQsIHNlcV9wYXJhbXNfbmV3LCBzaXplb2YoU2VxdWVuY2VIZWFkZXIpKTsKK30KKworYW9tX2NvZGVjX2Vycl90IGFvbV9nZXRfbnVtX2xheWVyc19mcm9tX29wZXJhdGluZ19wb2ludF9pZGMoCisgICAgaW50IG9wZXJhdGluZ19wb2ludF9pZGMsIHVuc2lnbmVkIGludCAqbnVtYmVyX3NwYXRpYWxfbGF5ZXJzLAorICAgIHVuc2lnbmVkIGludCAqbnVtYmVyX3RlbXBvcmFsX2xheWVycykgeworICAvLyBkZXJpdmUgbnVtYmVyIG9mIHNwYXRpYWwvdGVtcG9yYWwgbGF5ZXJzIGZyb20gb3BlcmF0aW5nX3BvaW50X2lkYworCisgIGlmICghbnVtYmVyX3NwYXRpYWxfbGF5ZXJzIHx8ICFudW1iZXJfdGVtcG9yYWxfbGF5ZXJzKQorICAgIHJldHVybiBBT01fQ09ERUNfSU5WQUxJRF9QQVJBTTsKKworICBpZiAob3BlcmF0aW5nX3BvaW50X2lkYyA9PSAwKSB7CisgICAgKm51bWJlcl90ZW1wb3JhbF9sYXllcnMgPSAxOworICAgICpudW1iZXJfc3BhdGlhbF9sYXllcnMgPSAxOworICB9IGVsc2UgeworICAgIGludCBqOworICAgICpudW1iZXJfc3BhdGlhbF9sYXllcnMgPSAwOworICAgICpudW1iZXJfdGVtcG9yYWxfbGF5ZXJzID0gMDsKKyAgICBmb3IgKGogPSAwOyBqIDwgTUFYX05VTV9TUEFUSUFMX0xBWUVSUzsgaisrKSB7CisgICAgICAqbnVtYmVyX3NwYXRpYWxfbGF5ZXJzICs9CisgICAgICAgICAgKG9wZXJhdGluZ19wb2ludF9pZGMgPj4gKGogKyBNQVhfTlVNX1RFTVBPUkFMX0xBWUVSUykpICYgMHgxOworICAgIH0KKyAgICBmb3IgKGogPSAwOyBqIDwgTUFYX05VTV9URU1QT1JBTF9MQVlFUlM7IGorKykgeworICAgICAgKm51bWJlcl90ZW1wb3JhbF9sYXllcnMgKz0gKG9wZXJhdGluZ19wb2ludF9pZGMgPj4gaikgJiAweDE7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEFPTV9DT0RFQ19PSzsKK30KKwordm9pZCBhdjFfcmVhZF9zZXF1ZW5jZV9oZWFkZXIoQVYxX0NPTU1PTiAqY20sIHVuaW9uIHBhcmFtX3UgKnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlSGVhZGVyICpzZXFfcGFyYW1zKSB7CisjaWZkZWYgT1JJX0NPREUKKyAgY29uc3QgaW50IG51bV9iaXRzX3dpZHRoID0gYW9tX3JiX3JlYWRfbGl0ZXJhbCgtMSwgIjxudW1fYml0c193aWR0aD4iLCByYiwgNCkgKyAxOworICBjb25zdCBpbnQgbnVtX2JpdHNfaGVpZ2h0ID0gYW9tX3JiX3JlYWRfbGl0ZXJhbCgtMSwgIjxudW1fYml0c19oZWlnaHQ+IiwgcmIsIDQpICsgMTsKKyAgY29uc3QgaW50IG1heF9mcmFtZV93aWR0aCA9IGFvbV9yYl9yZWFkX2xpdGVyYWwoLTEsICI8bWF4X2ZyYW1lX3dpZHRoPiIsIHJiLCBudW1fYml0c193aWR0aCkgKyAxOworICBjb25zdCBpbnQgbWF4X2ZyYW1lX2hlaWdodCA9IGFvbV9yYl9yZWFkX2xpdGVyYWwoLTEsICI8bWF4X2ZyYW1lX2hlaWdodD4iLCByYiwgbnVtX2JpdHNfaGVpZ2h0KSArIDE7CisKKyAgc2VxX3BhcmFtcy0+bnVtX2JpdHNfd2lkdGggPSBudW1fYml0c193aWR0aDsKKyAgc2VxX3BhcmFtcy0+bnVtX2JpdHNfaGVpZ2h0ID0gbnVtX2JpdHNfaGVpZ2h0OworI2VuZGlmCisgIHNlcV9wYXJhbXMtPm1heF9mcmFtZV93aWR0aCA9IHBhcmFtcy0+cC5tYXhfZnJhbWVfd2lkdGg7IC8vbWF4X2ZyYW1lX3dpZHRoOworICBzZXFfcGFyYW1zLT5tYXhfZnJhbWVfaGVpZ2h0ID0gcGFyYW1zLT5wLm1heF9mcmFtZV9oZWlnaHQ7IC8vbWF4X2ZyYW1lX2hlaWdodDsKKworICBpZiAoc2VxX3BhcmFtcy0+cmVkdWNlZF9zdGlsbF9waWN0dXJlX2hkcikgeworICAgIHNlcV9wYXJhbXMtPmZyYW1lX2lkX251bWJlcnNfcHJlc2VudF9mbGFnID0gMDsKKyAgfSBlbHNlIHsKKyAgICBzZXFfcGFyYW1zLT5mcmFtZV9pZF9udW1iZXJzX3ByZXNlbnRfZmxhZyA9IHBhcmFtcy0+cC5mcmFtZV9pZF9udW1iZXJzX3ByZXNlbnRfZmxhZzsgLy9hb21fcmJfcmVhZF9iaXQoLTEsICI8ZnJhbWVfaWRfbnVtYmVyc19wcmVzZW50X2ZsYWc+IiwgcmIpOworICB9CisgIGlmIChzZXFfcGFyYW1zLT5mcmFtZV9pZF9udW1iZXJzX3ByZXNlbnRfZmxhZykgeworICAgIC8vIFdlIG11c3QgYWx3YXlzIGhhdmUgZGVsdGFfZnJhbWVfaWRfbGVuZ3RoIDwgZnJhbWVfaWRfbGVuZ3RoLAorICAgIC8vIGluIG9yZGVyIGZvciBhIGZyYW1lIHRvIGJlIHJlZmVyZW5jZWQgd2l0aCBhIHVuaXF1ZSBkZWx0YS4KKyAgICAvLyBBdm9pZCB3YXN0aW5nIGJpdHMgYnkgdXNpbmcgYSBjb2RpbmcgdGhhdCBlbmZvcmNlcyB0aGlzIHJlc3RyaWN0aW9uLgorI2lmZGVmIE9SSV9DT0RFCisgICAgc2VxX3BhcmFtcy0+ZGVsdGFfZnJhbWVfaWRfbGVuZ3RoID0gYW9tX3JiX3JlYWRfbGl0ZXJhbCgtMSwgIjxkZWx0YV9mcmFtZV9pZF9sZW5ndGg+IiwgcmIsIDQpICsgMjsKKyAgICBzZXFfcGFyYW1zLT5mcmFtZV9pZF9sZW5ndGggPSBwYXJhbXMtPnAuZnJhbWVfaWRfbGVuZ3RoICArIGFvbV9yYl9yZWFkX2xpdGVyYWwoLTEsICI8ZnJhbWVfaWRfbGVuZ3RoPiIsIHJiLCAzKSArIHNlcV9wYXJhbXMtPmRlbHRhX2ZyYW1lX2lkX2xlbmd0aCArIDE7CisjZWxzZQorICAgIHNlcV9wYXJhbXMtPmRlbHRhX2ZyYW1lX2lkX2xlbmd0aCA9IHBhcmFtcy0+cC5kZWx0YV9mcmFtZV9pZF9sZW5ndGg7CisgICAgc2VxX3BhcmFtcy0+ZnJhbWVfaWRfbGVuZ3RoID0gcGFyYW1zLT5wLmZyYW1lX2lkX2xlbmd0aCAgKyBzZXFfcGFyYW1zLT5kZWx0YV9mcmFtZV9pZF9sZW5ndGggKyAxOworI2VuZGlmCisgICAgaWYgKHNlcV9wYXJhbXMtPmZyYW1lX2lkX2xlbmd0aCA+IDE2KQorICAgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19DT1JSVVBUX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGZyYW1lX2lkX2xlbmd0aCIpOworICB9CisjaWZkZWYgT1JJX0NPREUKKyAgc2V0dXBfc2Jfc2l6ZShzZXFfcGFyYW1zLCByYik7CisgIHNlcV9wYXJhbXMtPmVuYWJsZV9maWx0ZXJfaW50cmEgPSBhb21fcmJfcmVhZF9iaXQoLTEsICI8ZW5hYmxlX2ZpbHRlcl9pbnRyYT4iLCByYik7CisgIHNlcV9wYXJhbXMtPmVuYWJsZV9pbnRyYV9lZGdlX2ZpbHRlciA9IGFvbV9yYl9yZWFkX2JpdCgtMSwgIjxlbmFibGVfaW50cmFfZWRnZV9maWx0ZXI+IiwgcmIpOworI2VuZGlmCisKKyAgaWYgKHNlcV9wYXJhbXMtPnJlZHVjZWRfc3RpbGxfcGljdHVyZV9oZHIpIHsKKyAgICBzZXFfcGFyYW1zLT5lbmFibGVfaW50ZXJpbnRyYV9jb21wb3VuZCA9IDA7CisgICAgc2VxX3BhcmFtcy0+ZW5hYmxlX21hc2tlZF9jb21wb3VuZCA9IDA7CisgICAgc2VxX3BhcmFtcy0+ZW5hYmxlX3dhcnBlZF9tb3Rpb24gPSAwOworICAgIHNlcV9wYXJhbXMtPmVuYWJsZV9kdWFsX2ZpbHRlciA9IDA7CisgICAgc2VxX3BhcmFtcy0+b3JkZXJfaGludF9pbmZvLmVuYWJsZV9vcmRlcl9oaW50ID0gMDsKKyAgICBzZXFfcGFyYW1zLT5vcmRlcl9oaW50X2luZm8uZW5hYmxlX2Rpc3Rfd3RkX2NvbXAgPSAwOworICAgIHNlcV9wYXJhbXMtPm9yZGVyX2hpbnRfaW5mby5lbmFibGVfcmVmX2ZyYW1lX212cyA9IDA7CisgICAgc2VxX3BhcmFtcy0+Zm9yY2Vfc2NyZWVuX2NvbnRlbnRfdG9vbHMgPSAyOyAgLy8gU0VMRUNUX1NDUkVFTl9DT05URU5UX1RPT0xTCisgICAgc2VxX3BhcmFtcy0+Zm9yY2VfaW50ZWdlcl9tdiA9IDI7ICAgICAgICAgICAgLy8gU0VMRUNUX0lOVEVHRVJfTVYKKyAgICBzZXFfcGFyYW1zLT5vcmRlcl9oaW50X2luZm8ub3JkZXJfaGludF9iaXRzX21pbnVzXzEgPSAtMTsKKyAgfSBlbHNlIHsKKyNpZmRlZiBPUklfQ09ERQorICAgIHNlcV9wYXJhbXMtPmVuYWJsZV9pbnRlcmludHJhX2NvbXBvdW5kID0gYW9tX3JiX3JlYWRfYml0KC0xLCAiPGVuYWJsZV9pbnRlcmludHJhX2NvbXBvdW5kPiIsIHJiKTsKKyAgICBzZXFfcGFyYW1zLT5lbmFibGVfbWFza2VkX2NvbXBvdW5kID0gYW9tX3JiX3JlYWRfYml0KC0xLCAiPGVuYWJsZV9tYXNrZWRfY29tcG91bmQ+IiwgcmIpOworICAgIHNlcV9wYXJhbXMtPmVuYWJsZV93YXJwZWRfbW90aW9uID0gYW9tX3JiX3JlYWRfYml0KC0xLCAiPGVuYWJsZV93YXJwZWRfbW90aW9uPiIsIHJiKTsKKyAgICBzZXFfcGFyYW1zLT5lbmFibGVfZHVhbF9maWx0ZXIgPSBhb21fcmJfcmVhZF9iaXQoLTEsICI8ZW5hYmxlX2R1YWxfZmlsdGVyPiIsIHJiKTsKKyNlbmRpZgorICAgIHNlcV9wYXJhbXMtPm9yZGVyX2hpbnRfaW5mby5lbmFibGVfb3JkZXJfaGludCA9IHBhcmFtcy0+cC5lbmFibGVfb3JkZXJfaGludDsgLy9hb21fcmJfcmVhZF9iaXQoLTEsICI8b3JkZXJfaGludF9pbmZvLmVuYWJsZV9vcmRlcl9oaW50PiIsIHJiKTsKKyAgICBzZXFfcGFyYW1zLT5vcmRlcl9oaW50X2luZm8uZW5hYmxlX2Rpc3Rfd3RkX2NvbXAgPQorICAgICAgICBzZXFfcGFyYW1zLT5vcmRlcl9oaW50X2luZm8uZW5hYmxlX29yZGVyX2hpbnQgPyBwYXJhbXMtPnAuZW5hYmxlX2Rpc3Rfd3RkX2NvbXAgOiAwOyAvL2FvbV9yYl9yZWFkX2JpdCgtMSwgIjxvcmRlcl9oaW50X2luZm8uZW5hYmxlX2Rpc3Rfd3RkX2NvbXA+IiwgcmIpIDogMDsKKyAgICBzZXFfcGFyYW1zLT5vcmRlcl9oaW50X2luZm8uZW5hYmxlX3JlZl9mcmFtZV9tdnMgPQorICAgICAgICBzZXFfcGFyYW1zLT5vcmRlcl9oaW50X2luZm8uZW5hYmxlX29yZGVyX2hpbnQgPyBwYXJhbXMtPnAuZW5hYmxlX3JlZl9mcmFtZV9tdnMgOiAwOyAvL2FvbV9yYl9yZWFkX2JpdCgtMSwgIjxvcmRlcl9oaW50X2luZm8uZW5hYmxlX3JlZl9mcmFtZV9tdnM+IiwgcmIpIDogMDsKKworI2lmZGVmIE9SSV9DT0RFCisgICAgaWYgKGFvbV9yYl9yZWFkX2JpdCgtMSwgZGVmbWFyaywgcmIpKSB7CisgICAgICBzZXFfcGFyYW1zLT5mb3JjZV9zY3JlZW5fY29udGVudF90b29scyA9CisgICAgICAgICAgMjsgIC8vIFNFTEVDVF9TQ1JFRU5fQ09OVEVOVF9UT09MUworICAgIH0gZWxzZSB7CisgICAgICBzZXFfcGFyYW1zLT5mb3JjZV9zY3JlZW5fY29udGVudF90b29scyA9IGFvbV9yYl9yZWFkX2JpdCgtMSwgZGVmbWFyaywgcmIpOworICAgIH0KKworICAgIGlmIChzZXFfcGFyYW1zLT5mb3JjZV9zY3JlZW5fY29udGVudF90b29scyA+IDApIHsKKyAgICAgIGlmIChhb21fcmJfcmVhZF9iaXQoLTEsIGRlZm1hcmssIHJiKSkgeworICAgICAgICBzZXFfcGFyYW1zLT5mb3JjZV9pbnRlZ2VyX212ID0gMjsgIC8vIFNFTEVDVF9JTlRFR0VSX01WCisgICAgICB9IGVsc2UgeworICAgICAgICBzZXFfcGFyYW1zLT5mb3JjZV9pbnRlZ2VyX212ID0gYW9tX3JiX3JlYWRfYml0KC0xLCBkZWZtYXJrLCByYik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHNlcV9wYXJhbXMtPmZvcmNlX2ludGVnZXJfbXYgPSAyOyAgLy8gU0VMRUNUX0lOVEVHRVJfTVYKKyAgICB9CisjZW5kaWYKKyAgICBzZXFfcGFyYW1zLT5vcmRlcl9oaW50X2luZm8ub3JkZXJfaGludF9iaXRzX21pbnVzXzEgPQorICAgICAgICBzZXFfcGFyYW1zLT5vcmRlcl9oaW50X2luZm8uZW5hYmxlX29yZGVyX2hpbnQKKyAgICAgICAgICAgID8gcGFyYW1zLT5wLm9yZGVyX2hpbnRfYml0c19taW51c18xIC8qYW9tX3JiX3JlYWRfbGl0ZXJhbCgtMSwgIjxvcmRlcl9oaW50X2luZm8ub3JkZXJfaGludF9iaXRzX21pbnVzXzE+IiwgcmIsIDMpKi8KKyAgICAgICAgICAgIDogLTE7CisgIH0KKyAgc2VxX3BhcmFtcy0+ZW5hYmxlX3N1cGVycmVzID0gcGFyYW1zLT5wLmVuYWJsZV9zdXBlcnJlczsgLy9hb21fcmJfcmVhZF9iaXQoLTEsIGRlZm1hcmssIHJiKTsKKworI2lmZGVmIE9SSV9DT0RFCisgIHNlcV9wYXJhbXMtPmVuYWJsZV9jZGVmID0gYW9tX3JiX3JlYWRfYml0KC0xLCBkZWZtYXJrLCByYik7CisgIHNlcV9wYXJhbXMtPmVuYWJsZV9yZXN0b3JhdGlvbiA9IGFvbV9yYl9yZWFkX2JpdCgtMSwgZGVmbWFyaywgcmIpOworI2VuZGlmCit9CisKKyNpZmRlZiBPUklfQ09ERQordm9pZCBhdjFfcmVhZF9vcF9wYXJhbWV0ZXJzX2luZm8oQVYxX0NPTU1PTiAqY29uc3QgY20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYW9tX3JlYWRfYml0X2J1ZmZlciAqcmIsIGludCBvcF9udW0pIHsKKyAgLy8gVGhlIGNtLT5vcF9wYXJhbXMgYXJyYXkgaGFzIE1BWF9OVU1fT1BFUkFUSU5HX1BPSU5UUyArIDEgZWxlbWVudHMuCisgIGlmIChvcF9udW0gPiBNQVhfTlVNX09QRVJBVElOR19QT0lOVFMpIHsKKyAgICBhb21faW50ZXJuYWxfZXJyb3IoJmNtLT5lcnJvciwgQU9NX0NPREVDX1VOU1VQX0JJVFNUUkVBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkFWMSBkb2VzIG5vdCBzdXBwb3J0ICVkIGRlY29kZXIgbW9kZWwgb3BlcmF0aW5nIHBvaW50cyIsCisgICAgICAgICAgICAgICAgICAgICAgIG9wX251bSArIDEpOworICB9CisKKyAgY20tPm9wX3BhcmFtc1tvcF9udW1dLmRlY29kZXJfYnVmZmVyX2RlbGF5ID0gYW9tX3JiX3JlYWRfdW5zaWduZWRfbGl0ZXJhbCgtMSwgZGVmbWFyaywKKyAgICAgIHJiLCBjbS0+YnVmZmVyX21vZGVsLmVuY29kZXJfZGVjb2Rlcl9idWZmZXJfZGVsYXlfbGVuZ3RoKTsKKworICBjbS0+b3BfcGFyYW1zW29wX251bV0uZW5jb2Rlcl9idWZmZXJfZGVsYXkgPSBhb21fcmJfcmVhZF91bnNpZ25lZF9saXRlcmFsKC0xLCBkZWZtYXJrLAorICAgICAgcmIsIGNtLT5idWZmZXJfbW9kZWwuZW5jb2Rlcl9kZWNvZGVyX2J1ZmZlcl9kZWxheV9sZW5ndGgpOworCisgIGNtLT5vcF9wYXJhbXNbb3BfbnVtXS5sb3dfZGVsYXlfbW9kZV9mbGFnID0gYW9tX3JiX3JlYWRfYml0KC0xLCBkZWZtYXJrLCByYik7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBpc192YWxpZF9zZXFfbGV2ZWxfaWR4KEFWMV9MRVZFTCBzZXFfbGV2ZWxfaWR4KSB7CisJcmV0dXJuIHNlcV9sZXZlbF9pZHggPCBTRVFfTEVWRUxTIHx8IHNlcV9sZXZlbF9pZHggPT0gU0VRX0xFVkVMX01BWDsKK30KKworc3RhdGljIHVpbnQzMl90IHJlYWRfc2VxdWVuY2VfaGVhZGVyX29idShBVjFEZWNvZGVyICpwYmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIHBhcmFtX3UgKnBhcmFtcykgeworICBBVjFfQ09NTU9OICpjb25zdCBjbSA9IHBiaS0+Y29tbW9uOworICBpbnQgaTsKKyAgaW50IG9wZXJhdGluZ19wb2ludDsKKyAgLy8gVmVyaWZ5IHJiIGhhcyBiZWVuIGNvbmZpZ3VyZWQgdG8gcmVwb3J0IGVycm9ycy4KKyAgLy9hc3NlcnQocmItPmVycm9yX2hhbmRsZXIpOworCisgIC8vIFVzZSBhIGxvY2FsIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSBpbmZvcm1hdGlvbiBhcyB3ZSBkZWNvZGUuIEF0IHRoZSBlbmQsCisgIC8vIGlmIG5vIGVycm9ycyBoYXZlIG9jY3VycmVkLCBjbS0+c2VxX3BhcmFtcyBpcyB1cGRhdGVkLgorICBTZXF1ZW5jZUhlYWRlciBzaCA9IGNtLT5zZXFfcGFyYW1zOworICBTZXF1ZW5jZUhlYWRlciAqY29uc3Qgc2VxX3BhcmFtcyA9ICZzaDsKKworICBzZXFfcGFyYW1zLT5wcm9maWxlID0gcGFyYW1zLT5wLnByb2ZpbGU7IC8vYXYxX3JlYWRfcHJvZmlsZShyYik7CisgIGlmIChzZXFfcGFyYW1zLT5wcm9maWxlID4gQ09ORklHX01BWF9ERUNPREVfUFJPRklMRSkgeworICAgIGNtLT5lcnJvci5lcnJvcl9jb2RlID0gQU9NX0NPREVDX1VOU1VQX0JJVFNUUkVBTTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIFN0aWxsIHBpY3R1cmUgb3Igbm90CisgIHNlcV9wYXJhbXMtPnN0aWxsX3BpY3R1cmUgPSBwYXJhbXMtPnAuc3RpbGxfcGljdHVyZTsgLy9hb21fcmJfcmVhZF9iaXQoLTEsICI8c3RpbGxfcGljdHVyZT4iLCByYik7CisgIHNlcV9wYXJhbXMtPnJlZHVjZWRfc3RpbGxfcGljdHVyZV9oZHIgPSBwYXJhbXMtPnAucmVkdWNlZF9zdGlsbF9waWN0dXJlX2hkcjsgLy9hb21fcmJfcmVhZF9iaXQoLTEsICI8cmVkdWNlZF9zdGlsbF9waWN0dXJlX2hkcj4iLCByYik7CisgIC8vIFZpZGVvIG11c3QgaGF2ZSByZWR1Y2VkX3N0aWxsX3BpY3R1cmVfaGRyID0gMAorICBpZiAoIXNlcV9wYXJhbXMtPnN0aWxsX3BpY3R1cmUgJiYgc2VxX3BhcmFtcy0+cmVkdWNlZF9zdGlsbF9waWN0dXJlX2hkcikgeworICAgIGNtLT5lcnJvci5lcnJvcl9jb2RlID0gQU9NX0NPREVDX1VOU1VQX0JJVFNUUkVBTTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChzZXFfcGFyYW1zLT5yZWR1Y2VkX3N0aWxsX3BpY3R1cmVfaGRyKSB7CisgICAgY20tPnRpbWluZ19pbmZvX3ByZXNlbnQgPSAwOworICAgIHNlcV9wYXJhbXMtPmRlY29kZXJfbW9kZWxfaW5mb19wcmVzZW50X2ZsYWcgPSAwOworICAgIHNlcV9wYXJhbXMtPmRpc3BsYXlfbW9kZWxfaW5mb19wcmVzZW50X2ZsYWcgPSAwOworICAgIHNlcV9wYXJhbXMtPm9wZXJhdGluZ19wb2ludHNfY250X21pbnVzXzEgPSAwOworICAgIHNlcV9wYXJhbXMtPm9wZXJhdGluZ19wb2ludF9pZGNbMF0gPSAwOworICAgIC8vaWYgKCFyZWFkX2JpdHN0cmVhbV9sZXZlbCgwLCAiPHNlcV9sZXZlbF9pZHg+IiwgJnNlcV9wYXJhbXMtPnNlcV9sZXZlbF9pZHhbMF0sIHJiKSkgeworICAgIGlmICghaXNfdmFsaWRfc2VxX2xldmVsX2lkeChwYXJhbXMtPnAuc2VxX2xldmVsX2lkeFswXSkpIHsKKyAgICAgIGNtLT5lcnJvci5lcnJvcl9jb2RlID0gQU9NX0NPREVDX1VOU1VQX0JJVFNUUkVBTTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzZXFfcGFyYW1zLT50aWVyWzBdID0gMDsKKyAgICBjbS0+b3BfcGFyYW1zWzBdLmRlY29kZXJfbW9kZWxfcGFyYW1fcHJlc2VudF9mbGFnID0gMDsKKyAgICBjbS0+b3BfcGFyYW1zWzBdLmRpc3BsYXlfbW9kZWxfcGFyYW1fcHJlc2VudF9mbGFnID0gMDsKKyAgfSBlbHNlIHsKKyAgICBjbS0+dGltaW5nX2luZm9fcHJlc2VudCA9IHBhcmFtcy0+cC50aW1pbmdfaW5mb19wcmVzZW50OyAvL2FvbV9yYl9yZWFkX2JpdCgtMSwgIjx0aW1pbmdfaW5mb19wcmVzZW50PiIsIHJiKTsgIC8vIHRpbWluZ19pbmZvX3ByZXNlbnRfZmxhZworICAgIGlmIChjbS0+dGltaW5nX2luZm9fcHJlc2VudCkgeworI2lmZGVmIE9SSV9DT0RFCisgICAgICBhdjFfcmVhZF90aW1pbmdfaW5mb19oZWFkZXIoY20sIHJiKTsKKyNlbmRpZgorICAgICAgc2VxX3BhcmFtcy0+ZGVjb2Rlcl9tb2RlbF9pbmZvX3ByZXNlbnRfZmxhZyA9IHBhcmFtcy0+cC5kZWNvZGVyX21vZGVsX2luZm9fcHJlc2VudF9mbGFnOyAvL2FvbV9yYl9yZWFkX2JpdCgtMSwgIjxkZWNvZGVyX21vZGVsX2luZm9fcHJlc2VudF9mbGFnPiIsIHJiKTsKKyNpZmRlZiBPUklfQ09ERQorICAgICAgaWYgKHNlcV9wYXJhbXMtPmRlY29kZXJfbW9kZWxfaW5mb19wcmVzZW50X2ZsYWcpCisgICAgICAgIGF2MV9yZWFkX2RlY29kZXJfbW9kZWxfaW5mbyhjbSwgcmIpOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgIHNlcV9wYXJhbXMtPmRlY29kZXJfbW9kZWxfaW5mb19wcmVzZW50X2ZsYWcgPSAwOworICAgIH0KKyNpZmRlZiBPUklfQ09ERQorICAgIHNlcV9wYXJhbXMtPmRpc3BsYXlfbW9kZWxfaW5mb19wcmVzZW50X2ZsYWcgPSBhb21fcmJfcmVhZF9iaXQoLTEsICI8ZGlzcGxheV9tb2RlbF9pbmZvX3ByZXNlbnRfZmxhZz4iLCByYik7CisjZW5kaWYKKyAgICBzZXFfcGFyYW1zLT5vcGVyYXRpbmdfcG9pbnRzX2NudF9taW51c18xID0gcGFyYW1zLT5wLm9wZXJhdGluZ19wb2ludHNfY250X21pbnVzXzE7CisgICAgICAgIC8vYW9tX3JiX3JlYWRfbGl0ZXJhbCgtMSwgIjxvcGVyYXRpbmdfcG9pbnRzX2NudF9taW51c18xPiIsIHJiLCBPUF9QT0lOVFNfQ05UX01JTlVTXzFfQklUUyk7CisgICAgZm9yIChpID0gMDsgaSA8IHNlcV9wYXJhbXMtPm9wZXJhdGluZ19wb2ludHNfY250X21pbnVzXzEgKyAxOyBpKyspIHsKKyAgICAgIHNlcV9wYXJhbXMtPm9wZXJhdGluZ19wb2ludF9pZGNbaV0gPSBwYXJhbXMtPnAub3BlcmF0aW5nX3BvaW50X2lkY1tpXTsKKyAgICAgICAgICAvL2FvbV9yYl9yZWFkX2xpdGVyYWwoaSwgIjxvcGVyYXRpbmdfcG9pbnRfaWRjPiIsIHJiLCBPUF9QT0lOVFNfSURDX0JJVFMpOworICAgICAgLy9pZiAoIXJlYWRfYml0c3RyZWFtX2xldmVsKGksICI8c2VxX2xldmVsX2lkeD4iLCAmc2VxX3BhcmFtcy0+c2VxX2xldmVsX2lkeFtpXSwgcmIpKSB7CisgICAgICBpZiAoIWlzX3ZhbGlkX3NlcV9sZXZlbF9pZHgocGFyYW1zLT5wLnNlcV9sZXZlbF9pZHhbaV0pKSB7CisgICAgICAgIGNtLT5lcnJvci5lcnJvcl9jb2RlID0gQU9NX0NPREVDX1VOU1VQX0JJVFNUUkVBTTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICAvLyBUaGlzIGlzIHRoZSBzZXFfbGV2ZWxfaWR4W2ldID4gNyBjaGVjayBpbiB0aGUgc3BlYy4gc2VxX2xldmVsX2lkeCA3CisgICAgICAvLyBpcyBlcXVpdmFsZW50IHRvIGxldmVsIDMuMy4KKyNpZmRlZiBPUklfQ09ERQorICAgICAgaWYgKHNlcV9wYXJhbXMtPnNlcV9sZXZlbF9pZHhbaV0gPj0gU0VRX0xFVkVMXzRfMCkKKyAgICAgICAgc2VxX3BhcmFtcy0+dGllcltpXSA9IGFvbV9yYl9yZWFkX2JpdChpLCAiPHRpZXI+IiwgcmIpOworICAgICAgZWxzZQorICAgICAgICBzZXFfcGFyYW1zLT50aWVyW2ldID0gMDsKKyNlbmRpZgorICAgICAgaWYgKHNlcV9wYXJhbXMtPmRlY29kZXJfbW9kZWxfaW5mb19wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgY20tPm9wX3BhcmFtc1tpXS5kZWNvZGVyX21vZGVsX3BhcmFtX3ByZXNlbnRfZmxhZyA9IHBhcmFtcy0+cC5kZWNvZGVyX21vZGVsX3BhcmFtX3ByZXNlbnRfZmxhZ1tpXTsgLy9hb21fcmJfcmVhZF9iaXQoLTEsIGRlZm1hcmssIHJiKTsKKyNpZmRlZiBPUklfQ09ERQorICAgICAgICBpZiAoY20tPm9wX3BhcmFtc1tpXS5kZWNvZGVyX21vZGVsX3BhcmFtX3ByZXNlbnRfZmxhZykKKyAgICAgICAgICBhdjFfcmVhZF9vcF9wYXJhbWV0ZXJzX2luZm8oY20sIHJiLCBpKTsKKyNlbmRpZgorICAgICAgfSBlbHNlIHsKKyAgICAgICAgY20tPm9wX3BhcmFtc1tpXS5kZWNvZGVyX21vZGVsX3BhcmFtX3ByZXNlbnRfZmxhZyA9IDA7CisgICAgICB9CisjaWZkZWYgT1JJX0NPREUKKyAgICAgIGlmIChjbS0+dGltaW5nX2luZm9fcHJlc2VudCAmJgorICAgICAgICAgIChjbS0+dGltaW5nX2luZm8uZXF1YWxfcGljdHVyZV9pbnRlcnZhbCB8fAorICAgICAgICAgICBjbS0+b3BfcGFyYW1zW2ldLmRlY29kZXJfbW9kZWxfcGFyYW1fcHJlc2VudF9mbGFnKSkgeworICAgICAgICBjbS0+b3BfcGFyYW1zW2ldLmJpdHJhdGUgPSBhdjFfbWF4X2xldmVsX2JpdHJhdGUoCisgICAgICAgICAgICBzZXFfcGFyYW1zLT5wcm9maWxlLCBzZXFfcGFyYW1zLT5zZXFfbGV2ZWxfaWR4W2ldLAorICAgICAgICAgICAgc2VxX3BhcmFtcy0+dGllcltpXSk7CisgICAgICAgIC8vIExldmVsIHdpdGggc2VxX2xldmVsX2lkeCA9IDMxIHJldHVybnMgYSBoaWdoICJkdW1teSIgYml0cmF0ZSB0byBwYXNzCisgICAgICAgIC8vIHRoZSBjaGVjaworICAgICAgICBpZiAoY20tPm9wX3BhcmFtc1tpXS5iaXRyYXRlID09IDApCisgICAgICAgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19VTlNVUF9CSVRTVFJFQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBVjEgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGNvbWJpbmF0aW9uIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2ZpbGUsIGxldmVsLCBhbmQgdGllci4iKTsKKyAgICAgICAgLy8gQnVmZmVyIHNpemUgaW4gYml0cy9zIGlzIGJpdHJhdGUgaW4gYml0cy9zICogMSBzCisgICAgICAgIGNtLT5vcF9wYXJhbXNbaV0uYnVmZmVyX3NpemUgPSBjbS0+b3BfcGFyYW1zW2ldLmJpdHJhdGU7CisgICAgICB9CisjZW5kaWYKKyAgICAgIGlmIChjbS0+dGltaW5nX2luZm9fcHJlc2VudCAmJiBjbS0+dGltaW5nX2luZm8uZXF1YWxfcGljdHVyZV9pbnRlcnZhbCAmJgorICAgICAgICAgICFjbS0+b3BfcGFyYW1zW2ldLmRlY29kZXJfbW9kZWxfcGFyYW1fcHJlc2VudF9mbGFnKSB7CisgICAgICAgIC8vIFdoZW4gdGhlIGRlY29kZXJfbW9kZWxfcGFyYW1ldGVycyBhcmUgbm90IHNlbnQgZm9yIHRoaXMgb3AsIHNldAorICAgICAgICAvLyB0aGUgZGVmYXVsdCBvbmVzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCB0aGUgcmVzb3VyY2UgYXZhaWxhYmlsaXR5IG1vZGUKKyAgICAgICAgY20tPm9wX3BhcmFtc1tpXS5kZWNvZGVyX2J1ZmZlcl9kZWxheSA9IDcwMDAwOworICAgICAgICBjbS0+b3BfcGFyYW1zW2ldLmVuY29kZXJfYnVmZmVyX2RlbGF5ID0gMjAwMDA7CisgICAgICAgIGNtLT5vcF9wYXJhbXNbaV0ubG93X2RlbGF5X21vZGVfZmxhZyA9IDA7CisgICAgICB9CisKKyNpZmRlZiBPUklfQ09ERQorICAgICAgaWYgKHNlcV9wYXJhbXMtPmRpc3BsYXlfbW9kZWxfaW5mb19wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgY20tPm9wX3BhcmFtc1tpXS5kaXNwbGF5X21vZGVsX3BhcmFtX3ByZXNlbnRfZmxhZyA9IGFvbV9yYl9yZWFkX2JpdCgtMSwgZGVmbWFyaywgcmIpOworICAgICAgICBpZiAoY20tPm9wX3BhcmFtc1tpXS5kaXNwbGF5X21vZGVsX3BhcmFtX3ByZXNlbnRfZmxhZykgeworICAgICAgICAgIGNtLT5vcF9wYXJhbXNbaV0uaW5pdGlhbF9kaXNwbGF5X2RlbGF5ID0KKyAgICAgICAgICAgICAgYW9tX3JiX3JlYWRfbGl0ZXJhbCgtMSwgZGVmbWFyaywgcmIsIDQpICsgMTsKKyAgICAgICAgICBpZiAoY20tPm9wX3BhcmFtc1tpXS5pbml0aWFsX2Rpc3BsYXlfZGVsYXkgPiAxMCkKKyAgICAgICAgICAgIGFvbV9pbnRlcm5hbF9lcnJvcigKKyAgICAgICAgICAgICAgICAmY20tPmVycm9yLCBBT01fQ09ERUNfVU5TVVBfQklUU1RSRUFNLAorICAgICAgICAgICAgICAgICJBVjEgZG9lcyBub3Qgc3VwcG9ydCBtb3JlIHRoYW4gMTAgZGVjb2RlZCBmcmFtZXMgZGVsYXkiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjbS0+b3BfcGFyYW1zW2ldLmluaXRpYWxfZGlzcGxheV9kZWxheSA9IDEwOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBjbS0+b3BfcGFyYW1zW2ldLmRpc3BsYXlfbW9kZWxfcGFyYW1fcHJlc2VudF9mbGFnID0gMDsKKyAgICAgICAgY20tPm9wX3BhcmFtc1tpXS5pbml0aWFsX2Rpc3BsYXlfZGVsYXkgPSAxMDsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgfQorICAvLyBUaGlzIGRlY29kZXIgc3VwcG9ydHMgYWxsIGxldmVscy4gIENob29zZSBvcGVyYXRpbmcgcG9pbnQgcHJvdmlkZWQgYnkKKyAgLy8gZXh0ZXJuYWwgbWVhbnMKKyAgb3BlcmF0aW5nX3BvaW50ID0gcGJpLT5vcGVyYXRpbmdfcG9pbnQ7CisgIGlmIChvcGVyYXRpbmdfcG9pbnQgPCAwIHx8CisgICAgICBvcGVyYXRpbmdfcG9pbnQgPiBzZXFfcGFyYW1zLT5vcGVyYXRpbmdfcG9pbnRzX2NudF9taW51c18xKQorICAgIG9wZXJhdGluZ19wb2ludCA9IDA7CisgIHBiaS0+Y3VycmVudF9vcGVyYXRpbmdfcG9pbnQgPQorICAgICAgc2VxX3BhcmFtcy0+b3BlcmF0aW5nX3BvaW50X2lkY1tvcGVyYXRpbmdfcG9pbnRdOworICBpZiAoYW9tX2dldF9udW1fbGF5ZXJzX2Zyb21fb3BlcmF0aW5nX3BvaW50X2lkYygKKyAgICAgICAgICBwYmktPmN1cnJlbnRfb3BlcmF0aW5nX3BvaW50LCAmY20tPm51bWJlcl9zcGF0aWFsX2xheWVycywKKyAgICAgICAgICAmY20tPm51bWJlcl90ZW1wb3JhbF9sYXllcnMpICE9IEFPTV9DT0RFQ19PSykgeworICAgIGNtLT5lcnJvci5lcnJvcl9jb2RlID0gQU9NX0NPREVDX0VSUk9SOworICAgIHJldHVybiAwOworICB9CisKKyAgYXYxX3JlYWRfc2VxdWVuY2VfaGVhZGVyKGNtLCBwYXJhbXMsIHNlcV9wYXJhbXMpOworI2lmZGVmIE9SSV9DT0RFCisgIGF2MV9yZWFkX2NvbG9yX2NvbmZpZyhyYiwgcGJpLT5hbGxvd19sb3diaXRkZXB0aCwgc2VxX3BhcmFtcywgJmNtLT5lcnJvcik7CisgIGlmICghKHNlcV9wYXJhbXMtPnN1YnNhbXBsaW5nX3ggPT0gMCAmJiBzZXFfcGFyYW1zLT5zdWJzYW1wbGluZ195ID09IDApICYmCisgICAgICAhKHNlcV9wYXJhbXMtPnN1YnNhbXBsaW5nX3ggPT0gMSAmJiBzZXFfcGFyYW1zLT5zdWJzYW1wbGluZ195ID09IDEpICYmCisgICAgICAhKHNlcV9wYXJhbXMtPnN1YnNhbXBsaW5nX3ggPT0gMSAmJiBzZXFfcGFyYW1zLT5zdWJzYW1wbGluZ195ID09IDApKSB7CisgICAgYW9tX2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIEFPTV9DT0RFQ19VTlNVUF9CSVRTVFJFQU0sCisgICAgICAgICAgICAgICAgICAgICAgICJPbmx5IDQ6NDo0LCA0OjI6MiBhbmQgNDoyOjAgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgIiVkICVkIHN1YnNhbXBsaW5nIGlzIG5vdCBzdXBwb3J0ZWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBzZXFfcGFyYW1zLT5zdWJzYW1wbGluZ194LCBzZXFfcGFyYW1zLT5zdWJzYW1wbGluZ195KTsKKyAgfQorICBzZXFfcGFyYW1zLT5maWxtX2dyYWluX3BhcmFtc19wcmVzZW50ID0gYW9tX3JiX3JlYWRfYml0KC0xLCAiPGZpbG1fZ3JhaW5fcGFyYW1zX3ByZXNlbnQ+IiwgcmIpOworCisgIGlmIChhdjFfY2hlY2tfdHJhaWxpbmdfYml0cyhwYmksIHJiKSAhPSAwKSB7CisgICAgLy8gY20tPmVycm9yLmVycm9yX2NvZGUgaXMgYWxyZWFkeSBzZXQuCisgICAgcmV0dXJuIDA7CisgIH0KKyNlbmRpZgorCisgIC8vIElmIGEgc2VxdWVuY2UgaGVhZGVyIGhhcyBiZWVuIGRlY29kZWQgYmVmb3JlLCB3ZSBjaGVjayBpZiB0aGUgbmV3CisgIC8vIG9uZSBpcyBjb25zaXN0ZW50IHdpdGggdGhlIG9sZCBvbmUuCisgIGlmIChwYmktPnNlcXVlbmNlX2hlYWRlcl9yZWFkeSkgeworICAgIGlmICghYXJlX3NlcV9oZWFkZXJzX2NvbnNpc3RlbnQoJmNtLT5zZXFfcGFyYW1zLCBzZXFfcGFyYW1zKSkKKyAgICAgIHBiaS0+c2VxdWVuY2VfaGVhZGVyX2NoYW5nZWQgPSAxOworICB9CisKKyAgY20tPnNlcV9wYXJhbXMgPSAqc2VxX3BhcmFtczsKKyAgcGJpLT5zZXF1ZW5jZV9oZWFkZXJfcmVhZHkgPSAxOworICByZXR1cm4gMDsKKworfQorCitpbnQgYW9tX2RlY29kZV9mcmFtZV9mcm9tX29idXMoQVYxRGVjb2RlciAqcGJpLCB1bmlvbiBwYXJhbV91ICpwYXJhbXMsIGludCBvYnVfdHlwZSkKK3sKKyAgQVYxX0NPTU1PTiAqY29uc3QgY20gPSBwYmktPmNvbW1vbjsKKyAgT2J1SGVhZGVyIG9idV9oZWFkZXI7CisgaW50IGZyYW1lX2RlY29kaW5nX2ZpbmlzaGVkID0gMDsKKyAgdWludDMyX3QgZnJhbWVfaGVhZGVyX3NpemUgPSAwOworCisgICAgLy9zdHJ1Y3QgYW9tX3JlYWRfYml0X2J1ZmZlciByYjsKKyAgICBzaXplX3QgcGF5bG9hZF9zaXplID0gMDsKKyAgICBzaXplX3QgZGVjb2RlZF9wYXlsb2FkX3NpemUgPSAwOworICAgIHNpemVfdCBvYnVfcGF5bG9hZF9vZmZzZXQgPSAwOworICAgIC8vc2l6ZV90IGJ5dGVzX3JlYWQgPSAwOworCisgIG1lbXNldCgmb2J1X2hlYWRlciwgMCwgc2l6ZW9mKG9idV9oZWFkZXIpKTsKKyNpZmRlZiBPUklfQ09ERQorICBwYmktPnNlZW5fZnJhbWVfaGVhZGVyID0gMDsKKyNlbHNlCisgIC8qIHNldCBpbiB0aGUgdGVzdC5jKi8KKyNlbmRpZgorCisgIG9idV9oZWFkZXIudHlwZSA9IG9idV90eXBlOworICBwYmktPmN1cl9vYnVfdHlwZSA9IG9idV9oZWFkZXIudHlwZTsKKyAgaWYgKGF2MV9pc19kZWJ1ZyhBT01fREVCVUdfUFJJTlRfTElTVF9JTkZPKSkKKyAgICBkdW1wX3BhcmFtcyhwYmksIHBhcmFtcyk7CisgIHN3aXRjaCAob2J1X2hlYWRlci50eXBlKSB7CisgICAgY2FzZSBPQlVfU0VRVUVOQ0VfSEVBREVSOgorICAgICAgICBkZWNvZGVkX3BheWxvYWRfc2l6ZSA9IHJlYWRfc2VxdWVuY2VfaGVhZGVyX29idShwYmksIHBhcmFtcyk7CisgICAgICAgIGlmIChjbS0+ZXJyb3IuZXJyb3JfY29kZSAhPSBBT01fQ09ERUNfT0spIHJldHVybiAtMTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9CVV9GUkFNRV9IRUFERVI6CisgICAgY2FzZSBPQlVfUkVEVU5EQU5UX0ZSQU1FX0hFQURFUjoKKyAgICBjYXNlIE9CVV9GUkFNRToKKyAgICAgICAgaWYgKG9idV9oZWFkZXIudHlwZSA9PSBPQlVfUkVEVU5EQU5UX0ZSQU1FX0hFQURFUikgeworICAgICAgICAgIGlmICghcGJpLT5zZWVuX2ZyYW1lX2hlYWRlcikgeworICAgICAgICAgICAgY20tPmVycm9yLmVycm9yX2NvZGUgPSBBT01fQ09ERUNfQ09SUlVQVF9GUkFNRTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gT0JVX0ZSQU1FX0hFQURFUiBvciBPQlVfRlJBTUUuCisgICAgICAgICAgaWYgKHBiaS0+c2Vlbl9mcmFtZV9oZWFkZXIpIHsKKyAgICAgICAgICAgIGNtLT5lcnJvci5lcnJvcl9jb2RlID0gQU9NX0NPREVDX0NPUlJVUFRfRlJBTUU7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE9ubHkgZGVjb2RlIGZpcnN0IGZyYW1lIGhlYWRlciByZWNlaXZlZAorICAgICAgICBpZiAoIXBiaS0+c2Vlbl9mcmFtZV9oZWFkZXIgfHwKKyAgICAgICAgICAgIChjbS0+bGFyZ2Vfc2NhbGVfdGlsZSAmJiAhcGJpLT5jYW1lcmFfZnJhbWVfaGVhZGVyX3JlYWR5KSkgeworICAgICAgICAgIGZyYW1lX2hlYWRlcl9zaXplID0gYXYxX2RlY29kZV9mcmFtZV9oZWFkZXJzX2FuZF9zZXR1cCgKKyAgICAgICAgICAgICAgcGJpLCAvKiZyYiwgZGF0YSwgcF9kYXRhX2VuZCwqL29idV9oZWFkZXIudHlwZSAhPSBPQlVfRlJBTUUsIHBhcmFtcyk7CisgICAgICAgICAgcGJpLT5zZWVuX2ZyYW1lX2hlYWRlciA9IDE7CisgICAgICAgICAgaWYgKCFwYmktPmV4dF90aWxlX2RlYnVnICYmIGNtLT5sYXJnZV9zY2FsZV90aWxlKQorICAgICAgICAgICAgcGJpLT5jYW1lcmFfZnJhbWVfaGVhZGVyX3JlYWR5ID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBUT0RPKHd0Yyk6IFZlcmlmeSB0aGF0IHRoZSBmcmFtZV9oZWFkZXJfb2J1IGlzIGlkZW50aWNhbCB0byB0aGUKKyAgICAgICAgICAvLyBvcmlnaW5hbCBmcmFtZV9oZWFkZXJfb2J1LiBGb3Igbm93IGp1c3Qgc2tpcCBmcmFtZV9oZWFkZXJfc2l6ZQorICAgICAgICAgIC8vIGJ5dGVzIGluIHRoZSBiaXQgYnVmZmVyLgorICAgICAgICAgIGlmIChmcmFtZV9oZWFkZXJfc2l6ZSA+IHBheWxvYWRfc2l6ZSkgeworICAgICAgICAgICAgY20tPmVycm9yLmVycm9yX2NvZGUgPSBBT01fQ09ERUNfQ09SUlVQVF9GUkFNRTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB9CisgICAgICAgICAgYXNzZXJ0KHJiLmJpdF9vZmZzZXQgPT0gMCk7CisjaWZkZWYgT1JJX0NPREUKKyAgICAgICAgICByYi5iaXRfb2Zmc2V0ID0gOCAqIGZyYW1lX2hlYWRlcl9zaXplOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBkZWNvZGVkX3BheWxvYWRfc2l6ZSA9IGZyYW1lX2hlYWRlcl9zaXplOworICAgICAgICBwYmktPmZyYW1lX2hlYWRlcl9zaXplID0gZnJhbWVfaGVhZGVyX3NpemU7CisKKyAgICAgICAgaWYgKGNtLT5zaG93X2V4aXN0aW5nX2ZyYW1lKSB7CisgICAgICAgICAgaWYgKG9idV9oZWFkZXIudHlwZSA9PSBPQlVfRlJBTUUpIHsKKyAgICAgICAgICAgIGNtLT5lcnJvci5lcnJvcl9jb2RlID0gQU9NX0NPREVDX1VOU1VQX0JJVFNUUkVBTTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB9CisgICAgICAgICAgZnJhbWVfZGVjb2RpbmdfZmluaXNoZWQgPSAxOworICAgICAgICAgIHBiaS0+c2Vlbl9mcmFtZV9oZWFkZXIgPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW4gbGFyZ2Ugc2NhbGUgdGlsZSBjb2RpbmcsIGRlY29kZSB0aGUgY29tbW9uIGNhbWVyYSBmcmFtZSBoZWFkZXIKKyAgICAgICAgLy8gYmVmb3JlIGFueSB0aWxlIGxpc3QgT0JVLgorICAgICAgICBpZiAoIXBiaS0+ZXh0X3RpbGVfZGVidWcgJiYgcGJpLT5jYW1lcmFfZnJhbWVfaGVhZGVyX3JlYWR5KSB7CisgICAgICAgICAgZnJhbWVfZGVjb2RpbmdfZmluaXNoZWQgPSAxOworICAgICAgICAgIC8vIFNraXAgdGhlIHJlc3Qgb2YgdGhlIGZyYW1lIGRhdGEuCisgICAgICAgICAgZGVjb2RlZF9wYXlsb2FkX3NpemUgPSBwYXlsb2FkX3NpemU7CisgICAgICAgICAgLy8gVXBkYXRlIGRhdGFfZW5kLgorI2lmZGVmIE9SSV9DT0RFCisgICAgICAgICAgKnBfZGF0YV9lbmQgPSBkYXRhX2VuZDsKKyNlbmRpZgorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjaWYgMCAvL2RlZiBBTUwKKyAgICAgICAgZnJhbWVfZGVjb2RpbmdfZmluaXNoZWQgPSAxOworI2VuZGlmCisgICAgICAgIGlmIChvYnVfaGVhZGVyLnR5cGUgIT0gT0JVX0ZSQU1FKSBicmVhazsKKyAgICAgICAgb2J1X3BheWxvYWRfb2Zmc2V0ID0gZnJhbWVfaGVhZGVyX3NpemU7CisgICAgICAgIC8vIEJ5dGUgYWxpZ24gdGhlIHJlYWRlciBiZWZvcmUgcmVhZGluZyB0aGUgdGlsZSBncm91cC4KKyAgICAgICAgLy8gYnl0ZV9hbGlnbm1lbnQoKSBoYXMgc2V0IGNtLT5lcnJvci5lcnJvcl9jb2RlIGlmIGl0IHJldHVybnMgLTEuCisjaWZkZWYgT1JJX0NPREUKKyAgICAgICAgaWYgKGJ5dGVfYWxpZ25tZW50KGNtLCAmcmIpKSByZXR1cm4gLTE7CisgICAgICAgIEFPTV9GQUxMVEhST1VHSF9JTlRFTkRFRDsgIC8vIGZhbGwgdGhyb3VnaCB0byByZWFkIHRpbGUgZ3JvdXAuCisjZW5kaWYKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgICAgIH0KKwlyZXR1cm4gZnJhbWVfZGVjb2RpbmdfZmluaXNoZWQ7Cit9CisKK2ludCBnZXRfYnVmZmVyX2luZGV4KEFWMURlY29kZXIgKnBiaSwgUmVmQ250QnVmZmVyICpidWZmZXIpCit7CisJQVYxX0NPTU1PTiAqY29uc3QgY20gPSBwYmktPmNvbW1vbjsKKwlpbnQgaSA9IC0xOworCisJaWYgKGJ1ZmZlcikgeworCQlmb3IgKGkgPSAwOyBpIDwgRlJBTUVfQlVGRkVSUzsgaSsrKSB7CisJCQlSZWZDbnRCdWZmZXIgKmJ1ZiA9CisJCQkJJmNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmc1tpXTsKKwkJCWlmIChidWYgPT0gYnVmZmVyKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGk7Cit9CisKK3ZvaWQgZHVtcF9idWZmZXIoUmVmQ250QnVmZmVyICpidWYpCit7CisJaW50IGk7CisJcHJfaW5mbygicmVmX2NvdW50ICVkLCB2Zl9yZWYgJWQsIG9yZGVyX2hpbnQgJWQsIHcvaCglZCwlZCkgc2hvd2FibGVfZnJhbWUgJWQgZnJhbWVfdHlwZSAlZCBjYW52YXMoJWQsJWQpIHcvaCglZCwlZCkgbWlfYy9yKCVkLCVkKSBoZWFkZXIgMHgleCByZWZfZGVsdGFzKCIsCisJYnVmLT5yZWZfY291bnQsIGJ1Zi0+YnVmLnZmX3JlZiwgYnVmLT5vcmRlcl9oaW50LCBidWYtPndpZHRoLCBidWYtPmhlaWdodCwgYnVmLT5zaG93YWJsZV9mcmFtZSwgYnVmLT5mcmFtZV90eXBlLAorCWJ1Zi0+YnVmLm1jX2NhbnZhc195LCBidWYtPmJ1Zi5tY19jYW52YXNfdV92LAorCWJ1Zi0+YnVmLnlfY3JvcF93aWR0aCwgYnVmLT5idWYueV9jcm9wX2hlaWdodCwKKwlidWYtPm1pX2NvbHMsIGJ1Zi0+bWlfcm93cywKKwlidWYtPmJ1Zi5oZWFkZXJfYWRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgUkVGX0ZSQU1FUzsgaSsrKQorCQlwcl9pbmZvKCIlZCwiLCBidWYtPnJlZl9kZWx0YXNbaV0pOworCXByX2luZm8oIiksIHJlZl9vcmRlcl9oaW50cygiKTsKKworCWZvciAoaSA9IDA7IGkgPCBJTlRFUl9SRUZTX1BFUl9GUkFNRTsgaSsrKQorCQlwcl9pbmZvKCIlZCAiLCBidWYtPnJlZl9vcmRlcl9oaW50c1tpXSk7CisJcHJfaW5mbygiKSIpOworfQorCit2b2lkIGR1bXBfcmVmX2J1ZmZlcl9pbmZvKEFWMURlY29kZXIgKnBiaSwgaW50IGkpCit7CisJQVYxX0NPTU1PTiAqY29uc3QgY20gPSBwYmktPmNvbW1vbjsKKwlwcl9pbmZvKCJyZW1hcHBlZF9yZWZfaWR4ICVkLCByZWZfZnJhbWVfc2lnbl9iaWFzICVkLCByZWZfZnJhbWVfaWQgJWQsIHZhbGlkX2Zvcl9yZWZlcmVuY2luZyAlZCByZWZfZnJhbWVfc2lkZSAlZCByZWZfZnJhbWVfbWFwIGlkeCAlZCwgbmV4dF9yZWZfZnJhbWVfbWFwIGlkeCAlZCIsCisJCWNtLT5yZW1hcHBlZF9yZWZfaWR4W2ldLAorCQljbS0+cmVmX2ZyYW1lX3NpZ25fYmlhc1tpXSwKKwkJY20tPnJlZl9mcmFtZV9pZFtpXSwKKwkJY20tPnZhbGlkX2Zvcl9yZWZlcmVuY2luZ1tpXSwKKwkJY20tPnJlZl9mcmFtZV9zaWRlW2ldLAorCQlnZXRfYnVmZmVyX2luZGV4KHBiaSwgY20tPnJlZl9mcmFtZV9tYXBbaV0pLAorCQlnZXRfYnVmZmVyX2luZGV4KHBiaSwgY20tPm5leHRfcmVmX2ZyYW1lX21hcFtpXSkpOworfQorCit2b2lkIGR1bXBfbXZfcmVmcyhBVjFEZWNvZGVyICpwYmkpCit7CisgIGludCBpLCBqOworICBBVjFfQ09NTU9OICpjb25zdCBjbSA9IHBiaS0+Y29tbW9uOworICBmb3IgKGkgPSAwOyBpIDwgY20tPm12X3JlZl9pZF9pbmRleDsgaSsrKSB7CisgICAgcHJfaW5mbygiJWQ6IHJlZl9pZCAlZCBjYWxfdHBsX212cyAlZCBtdl9yZWZfb2Zmc2V0OiAiLAorICAgICAgaSwgY20tPm12X3JlZl9pZFtpXSwgY20tPm12X2NhbF90cGxfbXZzW2ldKTsKKyAgICBmb3IgKGogPSAwOyBqIDwgUkVGX0ZSQU1FUzsgaisrKQorICAgICAgICBwcl9pbmZvKCIlZCAiLCBjbS0+bXZfcmVmX29mZnNldFtpXVtqXSk7CisgICAgcHJfaW5mbygiXG4iKTsKKyAgfQorfQorCit2b2lkIGR1bXBfcmVmX3NwZWNfYnVmcyhBVjFEZWNvZGVyICpwYmkpCit7CisgIGludCBpOworICBBVjFfQ09NTU9OICpjb25zdCBjbSA9IHBiaS0+Y29tbW9uOworICBmb3IgKGkgPSAwOyBpIDwgSU5URVJfUkVGU19QRVJfRlJBTUU7ICsraSkgeworICAgIFBJQ19CVUZGRVJfQ09ORklHICpwaWNfY29uZmlnID0gYXYxX2dldF9yZWZfZnJhbWVfc3BlY19idWYoY20sIExBU1RfRlJBTUUgKyBpKTsKKyAgICBpZiAocGljX2NvbmZpZyA9PSBOVUxMKSBjb250aW51ZTsKKyAgICBwcl9pbmZvKCIlZDogaW5kZXggJWQgb3JkZXJfaGludCAlZCBoZWFkZXIgMHgleCBkd19oZWFkZXIgMHgleCBjYW52YXMoJWQsJWQpIG12X3dyX3N0YXJ0IDB4JXggbGN1X3RvdGFsICVkXG4iLAorICAgICAgaSwgcGljX2NvbmZpZy0+aW5kZXgsCisgICAgICBwaWNfY29uZmlnLT5vcmRlcl9oaW50LAorICAgICAgcGljX2NvbmZpZy0+aGVhZGVyX2FkciwKKyNpZmRlZiBBT01fQVYxX01NVV9EVworICAgICAgcGljX2NvbmZpZy0+aGVhZGVyX2R3X2FkciwKKyNlbHNlCisgICAgICAwLAorI2VuZGlmCisgICAgICBwaWNfY29uZmlnLT5tY19jYW52YXNfeSwKKyAgICAgIHBpY19jb25maWctPm1jX2NhbnZhc191X3YsCisgICAgICBwaWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyLAorICAgICAgcGljX2NvbmZpZy0+bGN1X3RvdGFsCisgICAgICApOworICB9Cit9CisKKyNpZmRlZiBTVVBQT1JUX1NDQUxFX0ZBQ1RPUgordm9pZCBkdW1wX3NjYWxlX2ZhY3RvcnMoQVYxRGVjb2RlciAqcGJpKQoreworICBpbnQgaTsKKyAgQVYxX0NPTU1PTiAqY29uc3QgY20gPSBwYmktPmNvbW1vbjsKKyAgZm9yIChpID0gTEFTVF9GUkFNRTsgaSA8PSBBTFRSRUZfRlJBTUU7ICsraSkgeworICAgIHN0cnVjdCBzY2FsZV9mYWN0b3JzICpjb25zdCBzZiA9CisgICAgICAgIGdldF9yZWZfc2NhbGVfZmFjdG9ycyhjbSwgaSk7CisgICAgaWYgKHNmKQorICAgICAgcHJfaW5mbygiJWQ6IGlzX3NjYWxlZCAlZCB4X3NjYWxlX2ZwICVkLCB5X3NjYWxlX2ZwICVkXG4iLAorICAgICAgICBpLCBhdjFfaXNfc2NhbGVkKHNmKSwKKyAgICAgICAgc2YtPnhfc2NhbGVfZnAsIHNmLT55X3NjYWxlX2ZwKTsKKyAgICBlbHNlCisgICAgICBwcl9pbmZvKCIlZDogc2YgbnVsbFxuIiwgaSk7CisgIH0KK30KKworI2VuZGlmCisKK3ZvaWQgZHVtcF9idWZmZXJfc3RhdHVzKEFWMURlY29kZXIgKnBiaSkKK3sKKwlpbnQgaTsKKwlBVjFfQ09NTU9OICpjb25zdCBjbSA9IHBiaS0+Y29tbW9uOworCUJ1ZmZlclBvb2wgKmNvbnN0IHBvb2wgPSBjbS0+YnVmZmVyX3Bvb2w7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2tfYnVmZmVyX3Bvb2wocG9vbCwgZmxhZ3MpOworCisJcHJfaW5mbygiJXM6IHBiaSAlcCBjbSAlcCBjdXJfZnJhbWUgJXBcbiIsIF9fZnVuY19fLCBwYmksIGNtLCBjbS0+Y3VyX2ZyYW1lKTsKKworCXByX2luZm8oIkJ1ZmZlciBQb29sOlxuIik7CisJZm9yIChpID0gMDsgaSA8IEZSQU1FX0JVRkZFUlM7IGkrKykgeworCQlSZWZDbnRCdWZmZXIgKmJ1ZiA9CisJCQkmY20tPmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzW2ldOworCQlwcl9pbmZvKCIlZDogIiwgaSk7CisJCWlmIChidWYpCisJCQlkdW1wX2J1ZmZlcihidWYpOworCQlwcl9pbmZvKCJcbiIpOworCX0KKworCWlmIChjbS0+cHJldl9mcmFtZSkgeworCQlwcl9pbmZvKCJwcmV2X2ZyYW1lICglZCk6ICIsCisJCQlnZXRfYnVmZmVyX2luZGV4KHBiaSwgY20tPnByZXZfZnJhbWUpKTsKKwkJZHVtcF9idWZmZXIoY20tPnByZXZfZnJhbWUpOworCQlwcl9pbmZvKCJcbiIpOworCX0KKwlpZiAoY20tPmN1cl9mcmFtZSkgeworCQlwcl9pbmZvKCJjdXJfZnJhbWUgKCVkKTogIiwKKwkJCWdldF9idWZmZXJfaW5kZXgocGJpLCBjbS0+Y3VyX2ZyYW1lKSk7CisJCWR1bXBfYnVmZmVyKGNtLT5jdXJfZnJhbWUpOworCQlwcl9pbmZvKCJcbiIpOworCX0KKwlwcl9pbmZvKCJSRUZfRlJBTUVTIEluZm8ocmVmIGJ1ZiBpcyByZWZfZnJhbWVfbWFwW3JlbWFwcGVkX3JlZl9pZHhbaS0xXV0sIGk9MX43KTpcbiIpOworCWZvciAoaSA9IDA7IGkgPCBSRUZfRlJBTUVTOyBpKyspIHsKKwkJcHJfaW5mbygiJWQ6ICIsIGkpOworCQlkdW1wX3JlZl9idWZmZXJfaW5mbyhwYmksIGkpOworCQlwcl9pbmZvKCJcbiIpOworCX0KKwlwcl9pbmZvKCJSZWYgU3BlYyBCdWZmZXJzOlxuIik7CisJZHVtcF9yZWZfc3BlY19idWZzKHBiaSk7CisKKwlwcl9pbmZvKCJNViByZWZzOlxuIik7CisJZHVtcF9tdl9yZWZzKHBiaSk7CisKKyNpZmRlZiBTVVBQT1JUX1NDQUxFX0ZBQ1RPUgorCXByX2luZm8oIlNjYWxlIGZhY3RvcnM6XG4iKTsKKwlkdW1wX3NjYWxlX2ZhY3RvcnMocGJpKTsKKyNlbmRpZgorCXVubG9ja19idWZmZXJfcG9vbChwb29sLCBmbGFncyk7Cit9CisKKworc3RydWN0IHBhcmFtX2R1bXBfaXRlbV9zIHsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwljaGFyKiBuYW1lOworCXVuc2lnbmVkIGludCBhZHJfb2ZmOworfSBwYXJhbV9kdW1wX2l0ZW1zW10gPSB7CisJezEsICJwcm9maWxlIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSYoKCh1bmlvbiBwYXJhbV91ICopMCktPnAucHJvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICl9LAorCXsxLCAic3RpbGxfcGljdHVyZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykmKCgodW5pb24gcGFyYW1fdSAqKTApLT5wLnN0aWxsX3BpY3R1cmUgICAgICAgICAgICAgICAgICApfSwKKwl7MSwgInJlZHVjZWRfc3RpbGxfcGljdHVyZV9oZHIiLCAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpJigoKHVuaW9uIHBhcmFtX3UgKikwKS0+cC5yZWR1Y2VkX3N0aWxsX3BpY3R1cmVfaGRyICAgICAgKX0sCisJezEsICJkZWNvZGVyX21vZGVsX2luZm9fcHJlc2VudF9mbGFnIiwgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSYoKCh1bmlvbiBwYXJhbV91ICopMCktPnAuZGVjb2Rlcl9tb2RlbF9pbmZvX3ByZXNlbnRfZmxhZyl9LAorCXsxLCAibWF4X2ZyYW1lX3dpZHRoIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykmKCgodW5pb24gcGFyYW1fdSAqKTApLT5wLm1heF9mcmFtZV93aWR0aCAgICAgICAgICAgICAgICApfSwKKwl7MSwgIm1heF9mcmFtZV9oZWlnaHQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpJigoKHVuaW9uIHBhcmFtX3UgKikwKS0+cC5tYXhfZnJhbWVfaGVpZ2h0ICAgICAgICAgICAgICAgKX0sCisJezEsICJmcmFtZV9pZF9udW1iZXJzX3ByZXNlbnRfZmxhZyIsICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSYoKCh1bmlvbiBwYXJhbV91ICopMCktPnAuZnJhbWVfaWRfbnVtYmVyc19wcmVzZW50X2ZsYWcgICl9LAorCXsxLCAiZGVsdGFfZnJhbWVfaWRfbGVuZ3RoIiwgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykmKCgodW5pb24gcGFyYW1fdSAqKTApLT5wLmRlbHRhX2ZyYW1lX2lkX2xlbmd0aCAgICAgICAgICApfSwKKwl7MSwgImZyYW1lX2lkX2xlbmd0aCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpJigoKHVuaW9uIHBhcmFtX3UgKikwKS0+cC5mcmFtZV9pZF9sZW5ndGggICAgICAgICAgICAgICAgKX0sCisJezEsICJvcmRlcl9oaW50X2JpdHNfbWludXNfMSIsICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSYoKCh1bmlvbiBwYXJhbV91ICopMCktPnAub3JkZXJfaGludF9iaXRzX21pbnVzXzEgICAgICAgICl9LAorCXsxLCAiZW5hYmxlX29yZGVyX2hpbnQiLCAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykmKCgodW5pb24gcGFyYW1fdSAqKTApLT5wLmVuYWJsZV9vcmRlcl9oaW50ICAgICAgICAgICAgICApfSwKKwl7MSwgImVuYWJsZV9kaXN0X3d0ZF9jb21wIiwgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpJigoKHVuaW9uIHBhcmFtX3UgKikwKS0+cC5lbmFibGVfZGlzdF93dGRfY29tcCAgICAgICAgICAgKX0sCisJezEsICJlbmFibGVfcmVmX2ZyYW1lX212cyIsICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSYoKCh1bmlvbiBwYXJhbV91ICopMCktPnAuZW5hYmxlX3JlZl9mcmFtZV9tdnMgICAgICAgICAgICl9LAorCXsxLCAiZW5hYmxlX3N1cGVycmVzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykmKCgodW5pb24gcGFyYW1fdSAqKTApLT5wLmVuYWJsZV9zdXBlcnJlcyAgICAgICAgICAgICAgICApfSwKKwl7MSwgInN1cGVycmVzX3NjYWxlX2Rlbm9taW5hdG9yIiwgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpJigoKHVuaW9uIHBhcmFtX3UgKikwKS0+cC5zdXBlcnJlc19zY2FsZV9kZW5vbWluYXRvciAgICAgKX0sCisJezEsICJzaG93X2V4aXN0aW5nX2ZyYW1lIiwgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSYoKCh1bmlvbiBwYXJhbV91ICopMCktPnAuc2hvd19leGlzdGluZ19mcmFtZSAgICAgICAgICAgICl9LAorCXsxLCAiZnJhbWVfdHlwZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykmKCgodW5pb24gcGFyYW1fdSAqKTApLT5wLmZyYW1lX3R5cGUgICAgICAgICAgICAgICAgICAgICApfSwKKwl7MSwgInNob3dfZnJhbWUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpJigoKHVuaW9uIHBhcmFtX3UgKikwKS0+cC5zaG93X2ZyYW1lICAgICAgICAgICAgICAgICAgICAgKX0sCisJezEsICJlLnIuci5vLnJfcmVzaWxpZW50X21vZGUiLCAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSYoKCh1bmlvbiBwYXJhbV91ICopMCktPnAuZXJyb3JfcmVzaWxpZW50X21vZGUgICAgICAgICAgICl9LAorCXsxLCAicmVmcmVzaF9mcmFtZV9mbGFncyIsICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykmKCgodW5pb24gcGFyYW1fdSAqKTApLT5wLnJlZnJlc2hfZnJhbWVfZmxhZ3MgICAgICAgICAgICApfSwKKwl7MSwgInNob3dhYmxlX2ZyYW1lIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpJigoKHVuaW9uIHBhcmFtX3UgKikwKS0+cC5zaG93YWJsZV9mcmFtZSAgICAgICAgICAgICAgICAgKX0sCisJezEsICJjdXJyZW50X2ZyYW1lX2lkIiwgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSYoKCh1bmlvbiBwYXJhbV91ICopMCktPnAuY3VycmVudF9mcmFtZV9pZCAgICAgICAgICAgICAgICl9LAorCXsxLCAiZnJhbWVfc2l6ZV9vdmVycmlkZV9mbGFnIiwgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykmKCgodW5pb24gcGFyYW1fdSAqKTApLT5wLmZyYW1lX3NpemVfb3ZlcnJpZGVfZmxhZyAgICAgICApfSwKKwl7MSwgIm9yZGVyX2hpbnQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpJigoKHVuaW9uIHBhcmFtX3UgKikwKS0+cC5vcmRlcl9oaW50ICAgICAgICAgICAgICAgICAgICAgKX0sCisJezEsICJwcmltYXJ5X3JlZl9mcmFtZSIsICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSYoKCh1bmlvbiBwYXJhbV91ICopMCktPnAucHJpbWFyeV9yZWZfZnJhbWUgICAgICAgICAgICAgICl9LAorCXsxLCAiZnJhbWVfcmVmc19zaG9ydF9zaWduYWxpbmciLCAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykmKCgodW5pb24gcGFyYW1fdSAqKTApLT5wLmZyYW1lX3JlZnNfc2hvcnRfc2lnbmFsaW5nICAgICApfSwKKwl7MSwgImZyYW1lX3dpZHRoIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpJigoKHVuaW9uIHBhcmFtX3UgKikwKS0+cC5mcmFtZV93aWR0aCAgICAgICAgICAgICAgICAgICAgKX0sCisJezEsICJkZWNfZnJhbWVfd2lkdGgiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSYoKCh1bmlvbiBwYXJhbV91ICopMCktPnAuZGVjX2ZyYW1lX3dpZHRoICAgICAgICAgICAgICAgICl9LAorCXsxLCAiZnJhbWVfd2lkdGhfc2NhbGVkIiwgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykmKCgodW5pb24gcGFyYW1fdSAqKTApLT5wLmZyYW1lX3dpZHRoX3NjYWxlZCAgICAgICAgICAgICApfSwKKwl7MSwgImZyYW1lX2hlaWdodCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpJigoKHVuaW9uIHBhcmFtX3UgKikwKS0+cC5mcmFtZV9oZWlnaHQgICAgICAgICAgICAgICAgICAgKX0sCisJezEsICJyZWZlcmVuY2VfbW9kZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSYoKCh1bmlvbiBwYXJhbV91ICopMCktPnAucmVmZXJlbmNlX21vZGUgICAgICAgICAgICAgICAgICl9LAorCXsxLCAidXBkYXRlX3BhcmFtZXRlcnMiLCAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykmKCgodW5pb24gcGFyYW1fdSAqKTApLT5wLnVwZGF0ZV9wYXJhbWV0ZXJzICAgICAgICAgICAgICApfSwKKwl7MSwgImZpbG1fZ3JhaW5fcGFyYW1zX3JlZl9pZHgiLCAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpJigoKHVuaW9uIHBhcmFtX3UgKikwKS0+cC5maWxtX2dyYWluX3BhcmFtc19yZWZfaWR4ICAgICAgKX0sCisJezEsICJhbGxvd19yZWZfZnJhbWVfbXZzIiwgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSYoKCh1bmlvbiBwYXJhbV91ICopMCktPnAuYWxsb3dfcmVmX2ZyYW1lX212cyAgICAgICAgICAgICl9LAorCXsxLCAibHN0X3JlZiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykmKCgodW5pb24gcGFyYW1fdSAqKTApLT5wLmxzdF9yZWYgICAgICAgICAgICAgICAgICAgICAgICApfSwKKwl7MSwgImdsZF9yZWYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpJigoKHVuaW9uIHBhcmFtX3UgKikwKS0+cC5nbGRfcmVmICAgICAgICAgICAgICAgICAgICAgICAgKX0sCisJe0lOVEVSX1JFRlNfUEVSX0ZSQU1FLCAicmVtYXBwZWRfcmVmX2lkeCIsICAgICAgICh1bnNpZ25lZCBsb25nKSYoKCh1bmlvbiBwYXJhbV91ICopMCktPnAucmVtYXBwZWRfcmVmX2lkeFswXSAgICAgICAgICAgICl9LAorCXtJTlRFUl9SRUZTX1BFUl9GUkFNRSwgImRlbHRhX2ZyYW1lX2lkX21pbnVzXzEiLCAodW5zaWduZWQgbG9uZykmKCgodW5pb24gcGFyYW1fdSAqKTApLT5wLmRlbHRhX2ZyYW1lX2lkX21pbnVzXzFbMF0gICAgICApfSwKKwl7UkVGX0ZSQU1FUywgInJlZl9vcmRlcl9oaW50IiwgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpJigoKHVuaW9uIHBhcmFtX3UgKikwKS0+cC5yZWZfb3JkZXJfaGludFswXSAgICAgICAgICAgICAgKX0sCit9OworCit2b2lkIGR1bXBfcGFyYW1zKEFWMURlY29kZXIgKnBiaSwgdW5pb24gcGFyYW1fdSAqcGFyYW1zKQoreworCWludCBpLCBqOworCXVuc2lnbmVkIGNoYXIgKnN0YXJ0X2FkciA9ICh1bnNpZ25lZCBjaGFyKilwYXJhbXM7CisKKwlwcl9pbmZvKCI9PT09PT09PT09PT0gcGFyYW1zOlxuIik7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihwYXJhbV9kdW1wX2l0ZW1zKSAvIHNpemVvZihwYXJhbV9kdW1wX2l0ZW1zWzBdKTsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBwYXJhbV9kdW1wX2l0ZW1zW2ldLnNpemU7IGorKykgeworCQkJaWYgKHBhcmFtX2R1bXBfaXRlbXNbaV0uc2l6ZSA+IDEpCisJCQkJcHJfaW5mbygiJXMoJWQpOiAweCV4XG4iLAorCQkJCXBhcmFtX2R1bXBfaXRlbXNbaV0ubmFtZSwgaiwKKwkJCQkqKCh1bnNpZ25lZCBzaG9ydCopKHN0YXJ0X2FkciArIHBhcmFtX2R1bXBfaXRlbXNbaV0uYWRyX29mZiArIGogKiAyKSkpOworCQkJZWxzZQorCQkJCXByX2luZm8oIiVzOiAweCV4XG4iLCBwYXJhbV9kdW1wX2l0ZW1zW2ldLm5hbWUsCisJCQkJKigodW5zaWduZWQgc2hvcnQqKShzdGFydF9hZHIgKyBwYXJhbV9kdW1wX2l0ZW1zW2ldLmFkcl9vZmYgKyBqICogMikpKTsKKwkJfQorCX0KK30KKworLypzdGF0aWMgdm9pZCByYXdfd3JpdGVfaW1hZ2UoQVYxRGVjb2RlciAqcGJpLCBQSUNfQlVGRkVSX0NPTkZJRyAqc2QpCit7CisgIHByaW50ZigiJCQkJCQkJCBvdXRwdXQgaW1hZ2VcbiIpOworfSovCisKKy8qCisgIHJldHVybiAwLCBuZWVkIGRlY29kaW5nIGRhdGEKKyAgMSwgZGVjb2RpbmcgZG9uZQorICAtMSwgZGVjb2RpbmcgZXJyb3IKKworKi8KK2ludCBhdjFfYnVmbWdyX3Byb2Nlc3MoQVYxRGVjb2RlciAqcGJpLCB1bmlvbiBwYXJhbV91ICpwYXJhbXMsCisgIHVuc2lnbmVkIGNoYXIgbmV3X2NvbXByZXNzZWRfZGF0YSwgaW50IG9idV90eXBlKQoreworICBBVjFfQ09NTU9OICpjb25zdCBjbSA9IHBiaS0+Y29tbW9uOworICBpbnQgajsKKyAgLy8gUmVsZWFzZSBhbnkgcGVuZGluZyBvdXRwdXQgZnJhbWVzIGZyb20gdGhlIHByZXZpb3VzIGRlY29kZXJfZGVjb2RlIGNhbGwuCisgIC8vIFdlIG5lZWQgdG8gZG8gdGhpcyBldmVuIGlmIHRoZSBkZWNvZGVyIGlzIGJlaW5nIGZsdXNoZWQgb3IgdGhlIGlucHV0CisgIC8vIGFyZ3VtZW50cyBhcmUgaW52YWxpZC4KKyAgQnVmZmVyUG9vbCAqY29uc3QgcG9vbCA9IGNtLT5idWZmZXJfcG9vbDsKKyAgaW50IGZyYW1lX2RlY29kZWQ7CisgIGF2MV9wcmludDIoQVYxX0RFQlVHX0JVRk1HUl9ERVRBSUwsICIlczogcGJpICVwIGNtICVwIGN1cl9mcmFtZSAlcFxuIiwgX19mdW5jX18sIHBiaSwgY20sIGNtLT5jdXJfZnJhbWUpOworICBhdjFfcHJpbnQyKEFWMV9ERUJVR19CVUZNR1JfREVUQUlMLCAiJXM6IG5ld19jb21wcmVzc2VkX2RhdGE9ICVkXG4iLCBfX2Z1bmNfXywgbmV3X2NvbXByZXNzZWRfZGF0YSk7CisgIGZvciAoaiA9IDA7IGogPCBwYmktPm51bV9vdXRwdXRfZnJhbWVzOyBqKyspIHsKKyAgICBkZWNyZWFzZV9yZWZfY291bnQocGJpLCBwYmktPm91dHB1dF9mcmFtZXNbal0sIHBvb2wpOworICB9CisgIHBiaS0+bnVtX291dHB1dF9mcmFtZXMgPSAwOworICAvLworICBpZiAobmV3X2NvbXByZXNzZWRfZGF0YSkgeworICAgIGlmIChhc3NpZ25fY3VyX2ZyYW1lX25ld19mYihjbSkgPT0gTlVMTCkgeworICAgICAgY20tPmVycm9yLmVycm9yX2NvZGUgPSBBT01fQ09ERUNfTUVNX0VSUk9SOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBwYmktPnNlZW5fZnJhbWVfaGVhZGVyID0gMDsKKyAgICBhdjFfcHJpbnQyKEFWMV9ERUJVR19CVUZNR1JfREVUQUlMLCAiTmV3X2NvbXByZXNzZWRfZGF0YSAoJWQpXG4iLCBuZXdfY29tcHJlc3NlZF9kYXRhX2NvdW50KyspOworCisgIH0KKworICBmcmFtZV9kZWNvZGVkID0KKyAgICAgIGFvbV9kZWNvZGVfZnJhbWVfZnJvbV9vYnVzKHBiaSwgcGFyYW1zLCBvYnVfdHlwZSk7CisKKyAgaWYgKHBiaS0+Y3VyX29idV90eXBlID09IE9CVV9GUkFNRV9IRUFERVIgfHwKKyAgICAgICAgICBwYmktPmN1cl9vYnVfdHlwZSA9PSBPQlVfUkVEVU5EQU5UX0ZSQU1FX0hFQURFUiB8fAorICAgICAgICAgIHBiaS0+Y3VyX29idV90eXBlID09IE9CVV9GUkFNRSkgeworICAgICAgaWYgKGF2MV9pc19kZWJ1ZyhBT01fREVCVUdfUFJJTlRfTElTVF9JTkZPKSkgeworICAgICAgICBwcl9pbmZvKCJhZnRlciBidWZtZ3IgKGZyYW1lX2RlY29kZWQgJWQgc2Vlbl9mcmFtZV9oZWFkZXIgJWQpOiAiLAorICAgICAgICAgIGZyYW1lX2RlY29kZWQsIHBiaS0+c2Vlbl9mcmFtZV9oZWFkZXIpOworICAgICAgICBkdW1wX2J1ZmZlcl9zdGF0dXMocGJpKTsKKyAgICAgIH0KKyAgfQorICBhdjFfcHJpbnQyKEFWMV9ERUJVR19CVUZNR1JfREVUQUlMLCAiJXM6IHBiaSAlcCBjbSAlcCBjdXJfZnJhbWUgJXBcbiIsIF9fZnVuY19fLCBwYmksIGNtLCBjbS0+Y3VyX2ZyYW1lKTsKKworICByZXR1cm4gZnJhbWVfZGVjb2RlZDsKKworfQorCitpbnQgYXYxX2dldF9yYXdfZnJhbWUoQVYxRGVjb2RlciAqcGJpLCBzaXplX3QgaW5kZXgsIFBJQ19CVUZGRVJfQ09ORklHICoqc2QpIHsKKyAgaWYgKGluZGV4ID49IHBiaS0+bnVtX291dHB1dF9mcmFtZXMpIHJldHVybiAtMTsKKyAgKnNkID0gJnBiaS0+b3V0cHV0X2ZyYW1lc1tpbmRleF0tPmJ1ZjsKKyAgLy8qZ3JhaW5fcGFyYW1zID0gJnBiaS0+b3V0cHV0X2ZyYW1lc1tpbmRleF0tPmZpbG1fZ3JhaW5fcGFyYW1zOworICAvL2FvbV9jbGVhcl9zeXN0ZW1fc3RhdGUoKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBhdjFfYnVmbWdyX3Bvc3Rwcm9jKEFWMURlY29kZXIgKnBiaSwgdW5zaWduZWQgY2hhciBmcmFtZV9kZWNvZGVkKQoreworICAgIFBJQ19CVUZGRVJfQ09ORklHICpzZCA9IE5VTEw7CisgICAgaW50IGluZGV4OworI2lmIDAKKyAgICBpZiAoZnJhbWVfZGVjb2RlZCkgeworICAgICAgcHJpbnRmKCJiZWZvcmUgc3dhcF9mcmFtZV9idWZmZXJzOiAiKTsKKyAgICAgIGR1bXBfYnVmZmVyX3N0YXR1cyhwYmkpOworICAgIH0KKyNlbmRpZgorICAgIHN3YXBfZnJhbWVfYnVmZmVycyhwYmksIGZyYW1lX2RlY29kZWQpOworICAgIGlmIChmcmFtZV9kZWNvZGVkKSB7CisgICAgICBpZiAoYXYxX2lzX2RlYnVnKEFPTV9ERUJVR19QUklOVF9MSVNUX0lORk8pKSB7CisgICAgICAgIHByX2luZm8oImFmdGVyIHN3YXBfZnJhbWVfYnVmZmVyczogIik7CisgICAgICAgIGR1bXBfYnVmZmVyX3N0YXR1cyhwYmkpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoZnJhbWVfZGVjb2RlZCkgeworICAgICAgcGJpLT5kZWNvZGluZ19maXJzdF9mcmFtZSA9IDA7CisgICAgfQorCisKKyAgICBmb3IgKGluZGV4ID0gMDs7aW5kZXgrKykgeworICAgICAgaWYgKGF2MV9nZXRfcmF3X2ZyYW1lKHBiaSwgaW5kZXgsICZzZCkgPCAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgaWYgKHNkKQorCSAgICAgIGF2MV9yYXdfd3JpdGVfaW1hZ2UocGJpLCBzZCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgYW9tX3JlYWxsb2NfZnJhbWVfYnVmZmVyKEFWMV9DT01NT04gKmNtLCBQSUNfQlVGRkVSX0NPTkZJRyAqcGljLAorICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIHVuc2lnbmVkIGludCBvcmRlcl9oaW50KQoreworICBhdjFfcHJpbnQyKEFWMV9ERUJVR19CVUZNR1JfREVUQUlMLCAiJXMsIGluZGV4IDB4JXgsIHdpZHRoIDB4JXgsIGhlaWdodCAweCV4IG9yZGVyX2hpbnQgMHgleFxuIiwKKyAgICBfX2Z1bmNfXywgcGljLT5pbmRleCwgd2lkdGgsIGhlaWdodCwgb3JkZXJfaGludCk7CisgIHBpYy0+eV9jcm9wX3dpZHRoID0gd2lkdGg7CisgIHBpYy0+eV9jcm9wX2hlaWdodCA9IGhlaWdodDsKKyAgcGljLT5vcmRlcl9oaW50ID0gb3JkZXJfaGludDsKKyAgcmV0dXJuIDA7Cit9CisKKwordW5zaWduZWQgY2hhciBhdjFfZnJhbWVfaXNfaW50ZXIoY29uc3QgQVYxX0NPTU1PTiAqY29uc3QgY20pIHsKKyAgdW5zaWduZWQgY2hhciBpc19pbnRlciA9IGNtLT5jdXJfZnJhbWUgJiYgKGNtLT5jdXJfZnJhbWUtPmZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKQorICAgICAmJiAoY20tPmN1cnJlbnRfZnJhbWUuZnJhbWVfdHlwZSAhPSBJTlRSQV9PTkxZX0ZSQU1FKTsKKyAgcmV0dXJuIGlzX2ludGVyOworfQorCitQSUNfQlVGRkVSX0NPTkZJRyAqYXYxX2dldF9yZWZfZnJhbWVfc3BlY19idWYoCisgICAgY29uc3QgQVYxX0NPTU1PTiAqY29uc3QgY20sIGNvbnN0IE1WX1JFRkVSRU5DRV9GUkFNRSByZWZfZnJhbWUpIHsKKyAgUmVmQ250QnVmZmVyICpidWYgPSBnZXRfcmVmX2ZyYW1lX2J1ZihjbSwgcmVmX2ZyYW1lKTsKKyAgaWYgKGJ1ZikgeworICAgIGJ1Zi0+YnVmLm9yZGVyX2hpbnQgPSBidWYtPm9yZGVyX2hpbnQ7CisgICAgcmV0dXJuICYoYnVmLT5idWYpOworICB9CisgIHJldHVybiBOVUxMOworfQorCitzdHJ1Y3Qgc2NhbGVfZmFjdG9ycyAqYXYxX2dldF9yZWZfc2NhbGVfZmFjdG9ycygKKyAgQVYxX0NPTU1PTiAqY29uc3QgY20sIGNvbnN0IE1WX1JFRkVSRU5DRV9GUkFNRSByZWZfZnJhbWUpCit7CisgIHJldHVybiBnZXRfcmVmX3NjYWxlX2ZhY3RvcnMoY20sIHJlZl9mcmFtZSk7Cit9CisKK3ZvaWQgYXYxX3NldF9uZXh0X3JlZl9mcmFtZV9tYXAoQVYxRGVjb2RlciAqcGJpKSB7CisgIGludCByZWZfaW5kZXggPSAwOworICBpbnQgbWFzazsKKyAgQVYxX0NPTU1PTiAqY29uc3QgY20gPSBwYmktPmNvbW1vbjsKKyAgaW50IGNoZWNrX29uX3Nob3dfZXhpc3RpbmdfZnJhbWU7CisgIGF2MV9wcmludDIoQVYxX0RFQlVHX0JVRk1HUl9ERVRBSUwsICIlcywgJWQsIG1hc2sgMHgleCwgc2hvd19leGlzdGluZ19mcmFtZSAlZCwgcmVzZXRfZGVjb2Rlcl9zdGF0ZSAlZFxuIiwKKyAgICBfX2Z1bmNfXywgcGJpLT5jYW1lcmFfZnJhbWVfaGVhZGVyX3JlYWR5LAorICAgIGNtLT5jdXJyZW50X2ZyYW1lLnJlZnJlc2hfZnJhbWVfZmxhZ3MsCisgICAgY20tPnNob3dfZXhpc3RpbmdfZnJhbWUsCisgICAgcGJpLT5yZXNldF9kZWNvZGVyX3N0YXRlCisgICAgKTsKKyAgaWYgKCFwYmktPmNhbWVyYV9mcmFtZV9oZWFkZXJfcmVhZHkpIHsKKyAgICBmb3IgKG1hc2sgPSBjbS0+Y3VycmVudF9mcmFtZS5yZWZyZXNoX2ZyYW1lX2ZsYWdzOyBtYXNrOyBtYXNrID4+PSAxKSB7CisgICAgICBjbS0+bmV4dF91c2VkX3JlZl9mcmFtZV9tYXBbcmVmX2luZGV4XSA9IGNtLT5uZXh0X3JlZl9mcmFtZV9tYXBbcmVmX2luZGV4XTsKKyAgICAgICsrcmVmX2luZGV4OworICAgIH0KKworICAgIGNoZWNrX29uX3Nob3dfZXhpc3RpbmdfZnJhbWUgPQorICAgICAgICAhY20tPnNob3dfZXhpc3RpbmdfZnJhbWUgfHwgcGJpLT5yZXNldF9kZWNvZGVyX3N0YXRlOworICAgIGZvciAoOyByZWZfaW5kZXggPCBSRUZfRlJBTUVTICYmIGNoZWNrX29uX3Nob3dfZXhpc3RpbmdfZnJhbWU7CisgICAgICAgICArK3JlZl9pbmRleCkgeworICAgICAgY20tPm5leHRfdXNlZF9yZWZfZnJhbWVfbWFwW3JlZl9pbmRleF0gPSBjbS0+bmV4dF9yZWZfZnJhbWVfbWFwW3JlZl9pbmRleF07CisgICAgfQorICB9Cit9CisKK3Vuc2lnbmVkIGludCBhdjFfZ2V0X25leHRfdXNlZF9yZWZfaW5mbygKKyAgICBjb25zdCBBVjFfQ09NTU9OICpjb25zdCBjbSwgaW50IGkpIHsKKyAgLyoKKyAgaSA9IDB+MSBvcmRlX2hpbnQgbWFwCisgIGkgPSAyfjEwIHNpemUgbWFwW2ktMl0KKyAgKi8KKyAgdW5zaWduZWQgaW50IGluZm8gPSAwOworICBpbnQgajsKKyAgaWYgKGkgPCAyKSB7CisgICAgLypuZXh0X3VzZWRfcmVmX2ZyYW1lX21hcCBoYXMgOCBpdGVtcyovCisgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgUmVmQ250QnVmZmVyICpidWYgPQorICAgICAgICBjbS0+bmV4dF91c2VkX3JlZl9mcmFtZV9tYXBbKGkgKiA0KSArIGpdOworICAgICAgaWYgKGJ1ZikKKyAgICAgICAgaW5mbyB8PSAoKGJ1Zi0+YnVmLm9yZGVyX2hpbnQgJiAweGZmKQorICAgICAgICAgIDw8IChqICogOCkpOworICAgIH0KKyAgfSBlbHNlIGlmIChpIDwgMTApIHsKKyAgICBSZWZDbnRCdWZmZXIgKmJ1ZiA9CisgICAgICBjbS0+bmV4dF91c2VkX3JlZl9mcmFtZV9tYXBbaS0yXTsKKyAgICBpZiAoYnVmKQorICAgICAgaW5mbyA9IChidWYtPmJ1Zi55X2Nyb3Bfd2lkdGggPDwgMTYpIHwgKGJ1Zi0+YnVmLnlfY3JvcF9oZWlnaHQgJiAweGZmZmYpOworICB9IGVsc2UgeworICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgIFJlZkNudEJ1ZmZlciAqYnVmID0KKyAgICAgICAgY20tPm5leHRfdXNlZF9yZWZfZnJhbWVfbWFwWygoaSAtIDEwKSAqIDQpICsgal07CisgICAgICBpZiAoYnVmKQorICAgICAgICBpbmZvIHw9ICgoYnVmLT5idWYuaW5kZXggJiAweGZmKQorICAgICAgICAgIDw8IChqICogOCkpOworICAgIH0KKyAgfQorICByZXR1cm4gaW5mbzsKK30KKworUmVmQ250QnVmZmVyICphdjFfZ2V0X3ByaW1hcnlfcmVmX2ZyYW1lX2J1ZigKKyAgY29uc3QgQVYxX0NPTU1PTiAqY29uc3QgY20pCit7CisgIHJldHVybiBnZXRfcHJpbWFyeV9yZWZfZnJhbWVfYnVmKGNtKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlcl92NGwvdmF2MS9hdjFfZmlsbV9ncmFpbi5jIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC92YXYxL2F2MV9maWxtX2dyYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE5NzYyYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlcl92NGwvdmF2MS9hdjFfZmlsbV9ncmFpbi5jCkBAIC0wLDAgKzEsMTE5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgQWxsaWFuY2UgZm9yIE9wZW4gTWVkaWEuIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBCU0QgMiBDbGF1c2UgTGljZW5zZSBhbmQKKyAqIHRoZSBBbGxpYW5jZSBmb3IgT3BlbiBNZWRpYSBQYXRlbnQgTGljZW5zZSAxLjAuIElmIHRoZSBCU0QgMiBDbGF1c2UgTGljZW5zZQorICogd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc291cmNlIGNvZGUgaW4gdGhlIExJQ0VOU0UgZmlsZSwgeW91IGNhbgorICogb2J0YWluIGl0IGF0IHd3dy5hb21lZGlhLm9yZy9saWNlbnNlL3NvZnR3YXJlLiBJZiB0aGUgQWxsaWFuY2UgZm9yIE9wZW4KKyAqIE1lZGlhIFBhdGVudCBMaWNlbnNlIDEuMCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb3VyY2UgY29kZSBpbiB0aGUKKyAqIFBBVEVOVFMgZmlsZSwgeW91IGNhbiBvYnRhaW4gaXQgYXQgd3d3LmFvbWVkaWEub3JnL2xpY2Vuc2UvcGF0ZW50LgorICovCisKKy8qIVxmaWxlCisgKiBcYnJpZWYgRGVzY3JpYmVzIGZpbG0gZ3JhaW4gcGFyYW1ldGVycyBhbmQgZmlsbSBncmFpbiBzeW50aGVzaXMKKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkL2Nsb2NrLmg+CisjaW5jbHVkZSAidmF2MS5oIgorCisjZGVmaW5lIEZJTE1fR1JBSU5fUkVHX1NJWkUgIDM5CisKKyNkZWZpbmUgTUlEKGEsIG1pbiwgbWF4KSAoKGEgPiBtYXgpID8gbWF4IDogKChhID4gbWluKSA/IGEgOiBtaW4pKQorCisjZGVmaW5lIGdhdXNzX2JpdHMgMTEKKworI2RlZmluZSBsdW1hX3N1YmJsb2NrX3NpemVfeSAzMgorI2RlZmluZSBsdW1hX3N1YmJsb2NrX3NpemVfeCAzMgorCisjZGVmaW5lIGxlZnRfcGFkIDMKKyNkZWZpbmUgcmlnaHRfcGFkIDMJLy8gcGFkZGluZyB0byBvZmZzZXQgZm9yIEFSIGNvZWZmaWNpZW50cworI2RlZmluZSB0b3BfcGFkIDMKKyNkZWZpbmUgYm90dG9tX3BhZCAwCisjZGVmaW5lIGFyX3BhZGRpbmcgMyAvLyBtYXhpbXVtIGxhZyB1c2VkIGZvciBzdGFiaWxpemF0aW9uIG9mIEFSIGNvZWZmaWNpZW50cworCisjZGVmaW5lIGx1bWFfZ3JhaW5fYmxvY2tfb2ZmdCAweDEyMCAvLzE4ICogMTYKKyNkZWZpbmUgY2JfZ3JhaW5fYmxvY2tfb2ZmdCAweDE1MjAgIC8vKDE4ICsgMzIwKSAqIDE2CisKK3N0cnVjdCBhb21fZmlsbV9ncmFpbl90IHsKKwl1OCBhcHBseV9ncmFpbjsKKworCXU4IHVwZGF0ZV9wYXJhbWV0ZXJzOworCisJLy8gOCBiaXQgdmFsdWVzCisJczMyIHNjYWxpbmdfcG9pbnRzX3lbMTRdWzJdOworCXU4IG51bV95X3BvaW50czsgIC8vIHZhbHVlOiAwLi4xNAorCisJLy8gOCBiaXQgdmFsdWVzCisJczMyIHNjYWxpbmdfcG9pbnRzX2NiWzEwXVsyXTsKKwl1OCBudW1fY2JfcG9pbnRzOyAgLy8gdmFsdWU6IDAuLjEwCisKKwkvLyA4IGJpdCB2YWx1ZXMKKwlzMzIgc2NhbGluZ19wb2ludHNfY3JbMTBdWzJdOworCXU4IG51bV9jcl9wb2ludHM7ICAvLyB2YWx1ZTogMC4uMTAKKworCXU4IHNjYWxpbmdfc2hpZnQ7ICAvLyB2YWx1ZXMgOiA4Li4xMQorCisJczMyIGFyX2NvZWZmX2xhZzsgIC8vIHZhbHVlczogIDAuLjMKKworCS8vIDggYml0IHZhbHVlcworCXMzMiBhcl9jb2VmZnNfeVsyNF07CisJczMyIGFyX2NvZWZmc19jYlsyNV07CisJczMyIGFyX2NvZWZmc19jclsyNV07CisKKwkvLyBTaGlmdCB2YWx1ZTogQVIgY29lZmZzIHJhbmdlCisJLy8gNjogWy0yLCAyKQorCS8vIDc6IFstMSwgMSkKKwkvLyA4OiBbLTAuNSwgMC41KQorCS8vIDk6IFstMC4yNSwgMC4yNSkKKwl1OCBhcl9jb2VmZl9zaGlmdDsgIC8vIHZhbHVlcyA6IDYuLjkKKworCXM4IGNiX211bHQ7ICAgICAgIC8vIDggYml0cworCXM4IGNiX2x1bWFfbXVsdDsgIC8vIDggYml0cworCXMxNiBjYl9vZmZzZXQ7ICAgICAvLyA5IGJpdHMKKworCXM4IGNyX211bHQ7ICAgICAgIC8vIDggYml0cworCXM4IGNyX2x1bWFfbXVsdDsgIC8vIDggYml0cworCXMxNiBjcl9vZmZzZXQ7ICAgICAvLyA5IGJpdHMKKworCXU4IG92ZXJsYXBfZmxhZzsKKworCXU4IGNsaXBfdG9fcmVzdHJpY3RlZF9yYW5nZTsKKworCXU4IGJpdF9kZXB0aDsgIC8vIHZpZGVvIGJpdCBkZXB0aAorCisJdTggbWNfaWRlbnRpdHk7CisKKwl1OCBjaHJvbWFfc2NhbGluZ19mcm9tX2x1bWE7CisKKwl1OCBncmFpbl9zY2FsZV9zaGlmdDsKKworCXUxNiByYW5kb21fc2VlZDsKKworCXUxNiByYW5kb21fcmVnaXN0ZXJfeTsKKwl1MTYgcmFuZG9tX3JlZ2lzdGVyX2NiOworCXUxNiByYW5kb21fcmVnaXN0ZXJfY3I7CisKKwlzMzIgc2NhbGluZ19kZWx0YV95WzE0XTsKKwlzMzIgc2NhbGluZ19kZWx0YV9jYlsxMF07CisJczMyIHNjYWxpbmdfZGVsdGFfY3JbMTBdOworfTsKKworCitzdGF0aWMgdTMyIGRlYnVnX2ZnczsKK21vZHVsZV9wYXJhbShkZWJ1Z19mZ3MsIHVpbnQsIDA2NjQpOworCisvLyBTYW1wbGVzIHdpdGggR2F1c3NpYW4gZGlzdHJpYnV0aW9uIGluIHRoZSByYW5nZSBvZiBbLTIwNDgsIDIwNDddICgxMiBiaXRzKQorLy8gd2l0aCB6ZXJvIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBhYm91dCA1MTIuCisvLyBzaG91bGQgYmUgZGl2aWRlZCBieSA0IGZvciAxMC1iaXQgcmFuZ2UgYW5kIDE2IGZvciA4LWJpdCByYW5nZS4KK3N0YXRpYyBjb25zdCBzMzIgZ2F1c3NpYW5fc2VxWzIwNDhdID0geworICA1NiwgICAgNTY4LCAgIC0xODAsICAxNzIsICAgMTI0LCAgIC04NCwgICAxNzIsICAgLTY0LCAgIC05MDAsICAyNCwgICA4MjAsCisgIDIyNCwgICAxMjQ4LCAgOTk2LCAgIDI3MiwgICAtOCwgICAgLTkxNiwgIC0zODgsICAtNzMyLCAgLTEwNCwgIC0xODgsIDgwMCwKKyAgMTEyLCAgIC02NTIsICAtMzIwLCAgLTM3NiwgIDE0MCwgICAtMjUyLCAgNDkyLCAgIC0xNjgsICA0NCwgICAgLTc4OCwgNTg4LAorICAtNTg0LCAgNTAwLCAgIC0yMjgsICAxMiwgICAgNjgwLCAgIDI3MiwgICAtNDc2LCAgOTcyLCAgIC0xMDAsICA2NTIsICAzNjgsCisgIDQzMiwgICAtMTk2LCAgLTcyMCwgIC0xOTIsICAxMDAwLCAgLTMzMiwgIDY1MiwgICAtMTM2LCAgLTU1MiwgIC02MDQsIC00LAorICAxOTIsICAgLTIyMCwgIC0xMzYsICAxMDAwLCAgLTUyLCAgIDM3MiwgICAtOTYsICAgLTYyNCwgIDEyNCwgICAtMjQsICAzOTYsCisgIDU0MCwgICAtMTIsICAgLTEwNCwgIDY0MCwgICA0NjQsICAgMjQ0LCAgIC0yMDgsICAtODQsICAgMzY4LCAgIC01MjgsIC03NDAsCisgIDI0OCwgICAtOTY4LCAgLTg0OCwgIDYwOCwgICAzNzYsICAgLTYwLCAgIC0yOTIsICAtNDAsICAgLTE1NiwgIDI1MiwgIC0yOTIsCisgIDI0OCwgICAyMjQsICAgLTI4MCwgIDQwMCwgICAtMjQ0LCAgMjQ0LCAgIC02MCwgICA3NiwgICAgLTgwLCAgIDIxMiwgIDUzMiwKKyAgMzQwLCAgIDEyOCwgICAtMzYsICAgODI0LCAgIC0zNTIsICAtNjAsICAgLTI2NCwgIC05NiwgICAtNjEyLCAgNDE2LCAgLTcwNCwKKyAgMjIwLCAgIC0yMDQsICA2NDAsICAgLTE2MCwgIDEyMjAsICAtNDA4LCAgOTAwLCAgIDMzNiwgICAyMCwgICAgLTMzNiwgLTk2LAorICAtNzkyLCAgMzA0LCAgIDQ4LCAgICAtMjgsICAgLTEyMzIsIC0xMTcyLCAtNDQ4LCAgMTA0LCAgIC0yOTIsICAtNTIwLCAyNDQsCisgIDYwLCAgICAtOTQ4LCAgMCwgICAgIC03MDgsICAyNjgsICAgMTA4LCAgIDM1NiwgICAtNTQ4LCAgNDg4LCAgIC0zNDQsIC0xMzYsCisgIDQ4OCwgICAtMTk2LCAgLTIyNCwgIDY1NiwgICAtMjM2LCAgLTExMjgsIDYwLCAgICA0LCAgICAgMTQwLCAgIDI3NiwgIC02NzYsCisgIC0zNzYsICAxNjgsICAgLTEwOCwgIDQ2NCwgICA4LCAgICAgNTY0LCAgIDY0LCAgICAyNDAsICAgMzA4LCAgIC0zMDAsIC00MDAsCisgIC00NTYsICAtMTM2LCAgNTYsICAgIDEyMCwgICAtNDA4LCAgLTExNiwgIDQzNiwgICA1MDQsICAgLTIzMiwgIDMyOCwgIDg0NCwKKyAgLTE2NCwgIC04NCwgICA3ODQsICAgLTE2OCwgIDIzMiwgICAtMjI0LCAgMzQ4LCAgIC0zNzYsICAxMjgsICAgNTY4LCAgOTYsCisgIC0xMjQ0LCAtMjg4LCAgMjc2LCAgIDg0OCwgICA4MzIsICAgLTM2MCwgIDY1NiwgICA0NjQsICAgLTM4NCwgIC0zMzIsIC0zNTYsCisgIDcyOCwgICAtMzg4LCAgMTYwLCAgIC0xOTIsICA0NjgsICAgMjk2LCAgIDIyNCwgICAxNDAsICAgLTc3NiwgIC0xMDAsIDI4MCwKKyAgNCwgICAgIDE5NiwgICA0NCwgICAgLTM2LCAgIC02NDgsICA5MzIsICAgMTYsICAgIDE0MjgsICAyOCwgICAgNTI4LCAgODA4LAorICA3NzIsICAgMjAsICAgIDI2OCwgICA4OCwgICAgLTMzMiwgIC0yODQsICAxMjQsICAgLTM4NCwgIC00NDgsICAyMDgsICAtMjI4LAorICAtMTA0NCwgLTMyOCwgIDY2MCwgICAzODAsICAgLTE0OCwgIC0zMDAsICA1ODgsICAgMjQwLCAgIDU0MCwgICAyOCwgICAxMzYsCisgIC04OCwgICAtNDM2LCAgMjU2LCAgIDI5NiwgICAtMTAwMCwgMTQwMCwgIDAsICAgICAtNDgsICAgMTA1NiwgIC0xMzYsIDI2NCwKKyAgLTUyOCwgIC0xMTA4LCA2MzIsICAgLTQ4NCwgIC01OTIsICAtMzQ0LCAgNzk2LCAgIDEyNCwgICAtNjY4LCAgLTc2OCwgMzg4LAorICAxMjk2LCAgLTIzMiwgIC0xODgsICAtMjAwLCAgLTI4OCwgIC00LCAgICAzMDgsICAgMTAwLCAgIC0xNjgsICAyNTYsICAtNTAwLAorICAyMDQsICAgLTUwOCwgIDY0OCwgICAtMTM2LCAgMzcyLCAgIC0yNzIsICAtMTIwLCAgLTEwMDQsIC01NTIsICAtNTQ4LCAtMzg0LAorICA1NDgsICAgLTI5NiwgIDQyOCwgICAtMTA4LCAgLTgsICAgIC05MTIsICAtMzI0LCAgLTIyNCwgIC04OCwgICAtMTEyLCAtMjIwLAorICAtMTAwLCAgOTk2LCAgIC03OTYsICA1NDgsICAgMzYwLCAgIC0yMTYsICAxODAsICAgNDI4LCAgIC0yMDAsICAtMjEyLCAxNDgsCisgIDk2LCAgICAxNDgsICAgMjg0LCAgIDIxNiwgICAtNDEyLCAgLTMyMCwgIDEyMCwgICAtMzAwLCAgLTM4NCwgIC02MDQsIC01NzIsCisgIC0zMzIsICAtOCwgICAgLTE4MCwgIC0xNzYsICA2OTYsICAgMTE2LCAgIC04OCwgICA2MjgsICAgNzYsICAgIDQ0LCAgIC01MTYsCisgIDI0MCwgICAtMjA4LCAgLTQwLCAgIDEwMCwgICAtNTkyLCAgMzQ0LCAgIC0zMDgsICAtNDUyLCAgLTIyOCwgIDIwLCAgIDkxNiwKKyAgLTE3NTIsIC0xMzYsICAtMzQwLCAgLTgwNCwgIDE0MCwgICA0MCwgICAgNTEyLCAgIDM0MCwgICAyNDgsICAgMTg0LCAgLTQ5MiwKKyAgODk2LCAgIC0xNTYsICA5MzIsICAgLTYyOCwgIDMyOCwgICAtNjg4LCAgLTQ0OCwgIC02MTYsICAtNzUyLCAgLTEwMCwgNTYwLAorICAtMTAyMCwgMTgwLCAgIC04MDAsICAtNjQsICAgNzYsICAgIDU3NiwgICAxMDY4LCAgMzk2LCAgIDY2MCwgICA1NTIsICAtMTA4LAorICAtMjgsICAgMzIwLCAgIC02MjgsICAzMTIsICAgLTkyLCAgIC05MiwgICAtNDcyLCAgMjY4LCAgIDE2LCAgICA1NjAsICA1MTYsCisgIC02NzIsICAtNTIsICAgNDkyLCAgIC0xMDAsICAyNjAsICAgMzg0LCAgIDI4NCwgICAyOTIsICAgMzA0LCAgIC0xNDgsIDg4LAorICAtMTUyLCAgMTAxMiwgIDEwNjQsICAtMjI4LCAgMTY0LCAgIC0zNzYsICAtNjg0LCAgNTkyLCAgIC0zOTIsICAxNTYsICAxOTYsCisgIC01MjQsICAtNjQsICAgLTg4NCwgIDE2MCwgICAtMTc2LCAgNjM2LCAgIDY0OCwgICA0MDQsICAgLTM5NiwgIC00MzYsIDg2NCwKKyAgNDI0LCAgIC03MjgsICA5ODgsICAgLTYwNCwgIDkwNCwgICAtNTkyLCAgMjk2LCAgIC0yMjQsICA1MzYsICAgLTE3NiwgLTkyMCwKKyAgNDM2LCAgIC00OCwgICAxMTc2LCAgLTg4NCwgIDQxNiwgICAtNzc2LCAgLTgyNCwgIC04ODQsICA1MjQsICAgLTU0OCwgLTU2NCwKKyAgLTY4LCAgIC0xNjQsICAtOTYsICAgNjkyLCAgIDM2NCwgICAtNjkyLCAgLTEwMTIsIC02OCwgICAyNjAsICAgLTQ4MCwgODc2LAorICAtMTExNiwgNDUyLCAgIC0zMzIsICAtMzUyLCAgODkyLCAgIC0xMDg4LCAxMjIwLCAgLTY3NiwgIDEyLCAgICAtMjkyLCAyNDQsCisgIDQ5NiwgICAzNzIsICAgLTMyLCAgIDI4MCwgICAyMDAsICAgMTEyLCAgIC00NDAsICAtOTYsICAgMjQsICAgIC02NDQsIC0xODQsCisgIDU2LCAgICAtNDMyLCAgMjI0LCAgIC05ODAsICAyNzIsICAgLTI2MCwgIDE0NCwgICAtNDM2LCAgNDIwLCAgIDM1NiwgIDM2NCwKKyAgLTUyOCwgIDc2LCAgICAxNzIsICAgLTc0NCwgIC0zNjgsICA0MDQsICAgLTc1MiwgIC00MTYsICA2ODQsICAgLTY4OCwgNzIsCisgIDU0MCwgICA0MTYsICAgOTIsICAgIDQ0NCwgICA0ODAsICAgLTcyLCAgIC0xNDE2LCAxNjQsICAgLTExNzIsIC02OCwgIDI0LAorICA0MjQsICAgMjY0LCAgIDEwNDAsICAxMjgsICAgLTkxMiwgIC01MjQsICAtMzU2LCAgNjQsICAgIDg3NiwgICAtMTIsICA0LAorICAtODgsICAgNTMyLCAgIDI3MiwgICAtNTI0LCAgMzIwLCAgIDI3NiwgICAtNTA4LCAgOTQwLCAgIDI0LCAgICAtNDAwLCAtMTIwLAorICA3NTYsICAgNjAsICAgIDIzNiwgICAtNDEyLCAgMTAwLCAgIDM3NiwgICAtNDg0LCAgNDAwLCAgIC0xMDAsICAtNzQwLCAtMTA4LAorICAtMjYwLCAgMzI4LCAgIC0yNjgsICAyMjQsICAgLTIwMCwgIC00MTYsICAxODQsICAgLTYwNCwgIC01NjQsICAtMjAsICAyOTYsCisgIDYwLCAgICA4OTIsICAgLTg4OCwgIDYwLCAgICAxNjQsICAgNjgsICAgIC03NjAsICAyMTYsICAgLTI5NiwgIDkwNCwgIC0zMzYsCisgIC0yOCwgICA0MDQsICAgLTM1NiwgIC01NjgsICAtMjA4LCAgLTE0ODAsIC01MTIsICAyOTYsICAgMzI4LCAgIC0zNjAsIC0xNjQsCisgIC0xNTYwLCAtNzc2LCAgMTE1NiwgIC00MjgsICAxNjQsICAgLTUwNCwgIC0xMTIsICAxMjAsICAgLTIxNiwgIC0xNDgsIC0yNjQsCisgIDMwOCwgICAzMiwgICAgNjQsICAgIC03MiwgICA3MiwgICAgMTE2LCAgIDE3NiwgICAtNjQsICAgLTI3MiwgIDQ2MCwgIC01MzYsCisgIC03ODQsICAtMjgwLCAgMzQ4LCAgIDEwOCwgICAtNzUyLCAgLTEzMiwgIDUyNCwgICAtNTQwLCAgLTc3NiwgIDExNiwgIC0yOTYsCisgIC0xMTk2LCAtMjg4LCAgLTU2MCwgIDEwNDAsICAtNDcyLCAgMTE2LCAgIC04NDgsICAtMTExNiwgMTE2LCAgIDYzNiwgIDY5NiwKKyAgMjg0LCAgIC0xNzYsICAxMDE2LCAgMjA0LCAgIC04NjQsICAtNjQ4LCAgLTI0OCwgIDM1NiwgICA5NzIsICAgLTU4NCwgLTIwNCwKKyAgMjY0LCAgIDg4MCwgICA1MjgsICAgLTI0LCAgIC0xODQsICAxMTYsICAgNDQ4LCAgIC0xNDQsICA4MjgsICAgNTI0LCAgMjEyLAorICAtMjEyLCAgNTIsICAgIDEyLCAgICAyMDAsICAgMjY4LCAgIC00ODgsICAtNDA0LCAgLTg4MCwgIDgyNCwgICAtNjcyLCAtNDAsCisgIDkwOCwgICAtMjQ4LCAgNTAwLCAgIDcxNiwgICAtNTc2LCAgNDkyLCAgIC01NzYsICAxNiwgICAgNzIwLCAgIC0xMDgsIDM4NCwKKyAgMTI0LCAgIDM0NCwgICAyODAsICAgNTc2LCAgIC01MDAsICAyNTIsICAgMTA0LCAgIC0zMDgsICAxOTYsICAgLTE4OCwgLTgsCisgIDEyNjgsICAyOTYsICAgMTAzMiwgIC0xMTk2LCA0MzYsICAgMzE2LCAgIDM3MiwgICAtNDMyLCAgLTIwMCwgIC02NjAsIDcwNCwKKyAgLTIyNCwgIDU5NiwgICAtMTMyLCAgMjY4LCAgIDMyLCAgICAtNDUyLCAgODg0LCAgIDEwNCwgICAtMTAwOCwgNDI0LCAgLTEzNDgsCisgIC0yODAsICA0LCAgICAgLTExNjgsIDM2OCwgICA0NzYsICAgNjk2LCAgIDMwMCwgICAtOCwgICAgMjQsICAgIDE4MCwgIC01OTIsCisgIC0xOTYsICAzODgsICAgMzA0LCAgIDUwMCwgICA3MjQsICAgLTE2MCwgIDI0NCwgICAtODQsICAgMjcyLCAgIC0yNTYsIC00MjAsCisgIDMyMCwgICAyMDgsICAgLTE0NCwgIC0xNTYsICAxNTYsICAgMzY0LCAgIDQ1MiwgICAyOCwgICAgNTQwLCAgIDMxNiwgIDIyMCwKKyAgLTY0NCwgIC0yNDgsICA0NjQsICAgNzIsICAgIDM2MCwgICAzMiwgICAgLTM4OCwgIDQ5NiwgICAtNjgwLCAgLTQ4LCAgMjA4LAorICAtMTE2LCAgLTQwOCwgIDYwLCAgICAtNjA0LCAgLTM5MiwgIDU0OCwgICAtODQwLCAgNzg0LCAgIC00NjAsICA2NTYsICAtNTQ0LAorICAtMzg4LCAgLTI2NCwgIDkwOCwgICAtODAwLCAgLTYyOCwgIC02MTIsICAtNTY4LCAgNTcyLCAgIC0yMjAsICAxNjQsICAyODgsCisgIC0xNiwgICAtMzA4LCAgMzA4LCAgIC0xMTIsICAtNjM2LCAgLTc2MCwgIDI4MCwgICAtNjY4LCAgNDMyLCAgIDM2NCwgIDI0MCwKKyAgLTE5NiwgIDYwNCwgICAzNDAsICAgMzg0LCAgIDE5NiwgICA1OTIsICAgLTQ0LCAgIC01MDAsICA0MzIsICAgLTU4MCwgLTEzMiwKKyAgNjM2LCAgIC03NiwgICAzOTIsICAgNCwgICAgIC00MTIsICA1NDAsICAgNTA4LCAgIDMyOCwgICAtMzU2LCAgLTM2LCAgMTYsCisgIC0yMjAsICAtNjQsICAgLTI0OCwgIC02MCwgICAyNCwgICAgLTE5MiwgIDM2OCwgICAxMDQwLCAgOTIsICAgIC0yNCwgIC0xMDQ0LAorICAtMzIsICAgNDAsICAgIDEwNCwgICAxNDgsICAgMTkyLCAgIC0xMzYsICAtNTIwLCAgNTYsICAgIC04MTYsICAtMjI0LCA3MzIsCisgIDM5MiwgICAzNTYsICAgMjEyLCAgIC04MCwgICAtNDI0LCAgLTEwMDgsIC0zMjQsICA1ODgsICAgLTE0OTYsIDU3NiwgIDQ2MCwKKyAgLTgxNiwgIC04NDgsICA1NiwgICAgLTU4MCwgIC05MiwgICAtMTM3MiwgLTExMiwgIC00OTYsICAyMDAsICAgMzY0LCAgNTIsCisgIC0xNDAsICA0OCwgICAgLTQ4LCAgIC02MCwgICA4NCwgICAgNzIsICAgIDQwLCAgICAxMzIsICAgLTM1NiwgIC0yNjgsIC0xMDQsCisgIC0yODQsICAtNDA0LCAgNzMyLCAgIC01MjAsICAxNjQsICAgLTMwNCwgIC01NDAsICAxMjAsICAgMzI4LCAgIC03NiwgIC00NjAsCisgIDc1NiwgICAzODgsICAgNTg4LCAgIDIzNiwgICAtNDM2LCAgLTcyLCAgIC0xNzYsICAtNDA0LCAgLTMxNiwgIC0xNDgsIDcxNiwKKyAgLTYwNCwgIDQwNCwgICAtNzIsICAgLTg4LCAgIC04ODgsICAtNjgsICAgOTQ0LCAgIDg4LCAgICAtMjIwLCAgLTM0NCwgOTYwLAorICA0NzIsICAgNDYwLCAgIC0yMzIsICA3MDQsICAgMTIwLCAgIDgzMiwgICAtMjI4LCAgNjkyLCAgIC01MDgsICAxMzIsICAtNDc2LAorICA4NDQsICAgLTc0OCwgIC0zNjQsICAtNDQsICAgMTExNiwgIC0xMTA0LCAtMTA1NiwgNzYsICAgIDQyOCwgICA1NTIsICAtNjkyLAorICA2MCwgICAgMzU2LCAgIDk2LCAgICAtMzg0LCAgLTE4OCwgIC02MTIsICAtNTc2LCAgNzM2LCAgIDUwOCwgICA4OTIsICAzNTIsCisgIC0xMTMyLCA1MDQsICAgLTI0LCAgIC0zNTIsICAzMjQsICAgMzMyLCAgIC02MDAsICAtMzEyLCAgMjkyLCAgIDUwOCwgIC0xNDQsCisgIC04LCAgICA0ODQsICAgNDgsICAgIDI4NCwgICAtMjYwLCAgLTI0MCwgIDI1NiwgICAtMTAwLCAgLTI5MiwgIC0yMDQsIC00NCwKKyAgNDcyLCAgIC0yMDQsICA5MDgsICAgLTE4OCwgIC0xMDAwLCAtMjU2LCAgOTIsICAgIDExNjQsICAtMzkyLCAgNTY0LCAgMzU2LAorICA2NTIsICAgLTI4LCAgIC04ODQsICAyNTYsICAgNDg0LCAgIC0xOTIsICA3NjAsICAgLTE3NiwgIDM3NiwgICAtNTI0LCAtNDUyLAorICAtNDM2LCAgODYwLCAgIC03MzYsICAyMTIsICAgMTI0LCAgIDUwNCwgICAtNDc2LCAgNDY4LCAgIDc2LCAgICAtNDcyLCA1NTIsCisgIC02OTIsICAtOTQ0LCAgLTYyMCwgIDc0MCwgICAtMjQwLCAgNDAwLCAgIDEzMiwgICAyMCwgICAgMTkyLCAgIC0xOTYsIDI2NCwKKyAgLTY2OCwgIC0xMDEyLCAtNjAsICAgMjk2LCAgIC0zMTYsICAtODI4LCAgNzYsICAgIC0xNTYsICAyODQsICAgLTc2OCwgLTQ0OCwKKyAgLTgzMiwgIDE0OCwgICAyNDgsICAgNjUyLCAgIDYxNiwgICAxMjM2LCAgMjg4LCAgIC0zMjgsICAtNDAwLCAgLTEyNCwgNTg4LAorICAyMjAsICAgNTIwLCAgIC02OTYsICAxMDMyLCAgNzY4LCAgIC03NDAsICAtOTIsICAgLTI3MiwgIDI5NiwgICA0NDgsICAtNDY0LAorICA0MTIsICAgLTIwMCwgIDM5MiwgICA0NDAsICAgLTIwMCwgIDI2NCwgICAtMTUyLCAgLTI2MCwgIDMyMCwgICAxMDMyLCAyMTYsCisgIDMyMCwgICAtOCwgICAgLTY0LCAgIDE1NiwgICAtMTAxNiwgMTA4NCwgIDExNzIsICA1MzYsICAgNDg0LCAgIC00MzIsIDEzMiwKKyAgMzcyLCAgIC01MiwgICAtMjU2LCAgODQsICAgIDExNiwgICAtMzUyLCAgNDgsICAgIDExNiwgICAzMDQsICAgLTM4NCwgNDEyLAorICA5MjQsICAgLTMwMCwgIDUyOCwgICA2MjgsICAgMTgwLCAgIDY0OCwgICA0NCwgICAgLTk4MCwgIC0yMjAsICAxMzIwLCA0OCwKKyAgMzMyLCAgIDc0OCwgICA1MjQsICAgLTI2OCwgIC03MjAsICA1NDAsICAgLTI3NiwgIDU2NCwgICAtMzQ0LCAgLTIwOCwgLTE5NiwKKyAgNDM2LCAgIDg5NiwgICA4OCwgICAgLTM5MiwgIDEzMiwgICA4MCwgICAgLTk2NCwgIC0yODgsICA1NjgsICAgNTYsICAgLTQ4LAorICAtNDU2LCAgODg4LCAgIDgsICAgICA1NTIsICAgLTE1NiwgIC0yOTIsICA5NDgsICAgMjg4LCAgIDEyOCwgICAtNzE2LCAtMjkyLAorICAxMTkyLCAgLTE1MiwgIDg3NiwgICAzNTIsICAgLTYwMCwgIC0yNjAsICAtODEyLCAgLTQ2OCwgIC0yOCwgICAtMTIwLCAtMzIsCisgIC00NCwgICAxMjg0LCAgNDk2LCAgIDE5MiwgICA0NjQsICAgMzEyLCAgIC03NiwgICAtNTE2LCAgLTM4MCwgIC00NTYsIC0xMDEyLAorICAtNDgsICAgMzA4LCAgIC0xNTYsICAzNiwgICAgNDkyLCAgIC0xNTYsICAtODA4LCAgMTg4LCAgIDE2NTIsICA2OCwgICAtMTIwLAorICAtMTE2LCAgMzE2LCAgIDE2MCwgICAtMTQwLCAgMzUyLCAgIDgwOCwgICAtNDE2LCAgNTkyLCAgIDMxNiwgICAtNDgwLCA1NiwKKyAgNTI4LCAgIC0yMDQsICAtNTY4LCAgMzcyLCAgIC0yMzIsICA3NTIsICAgLTM0NCwgIDc0NCwgICAtNCwgICAgMzI0LCAgLTQxNiwKKyAgLTYwMCwgIDc2OCwgICAyNjgsICAgLTI0OCwgIC04OCwgICAtMTMyLCAgLTQyMCwgIC00MzIsICA4MCwgICAgLTI4OCwgNDA0LAorICAtMzE2LCAgLTEyMTYsIC01ODgsICA1MjAsICAgLTEwOCwgIDkyLCAgICAtMzIwLCAgMzY4LCAgIC00ODAsICAtMjE2LCAtOTIsCisgIDE2ODgsICAtMzAwLCAgMTgwLCAgIDEwMjAsICAtMTc2LCAgODIwLCAgIC02OCwgICAtMjI4LCAgLTI2MCwgIDQzNiwgIC05MDQsCisgIDIwLCAgICA0MCwgICAgLTUwOCwgIDQ0MCwgICAtNzM2LCAgMzEyLCAgIDMzMiwgICAyMDQsICAgNzYwLCAgIC0zNzIsIDcyOCwKKyAgOTYsICAgIC0yMCwgICAtNjMyLCAgLTUyMCwgIC01NjAsICAzMzYsICAgMTA3NiwgIC02NCwgICAtNTMyLCAgNzc2LCAgNTg0LAorICAxOTIsICAgMzk2LCAgIC03MjgsICAtNTIwLCAgMjc2LCAgIC0xODgsICA4MCwgICAgLTUyLCAgIC02MTIsICAtMjUyLCAtNDgsCisgIDY0OCwgICAyMTIsICAgLTY4OCwgIDIyOCwgICAtNTIsICAgLTI2MCwgIDQyOCwgICAtNDEyLCAgLTI3MiwgIC00MDQsIDE4MCwKKyAgODE2LCAgIC03OTYsICA0OCwgICAgMTUyLCAgIDQ4NCwgICAtODgsICAgLTIxNiwgIDk4OCwgICA2OTYsICAgMTg4LCAgLTUyOCwKKyAgNjQ4LCAgIC0xMTYsICAtMTgwLCAgMzE2LCAgIDQ3NiwgICAxMiwgICAgLTU2NCwgIDk2LCAgICA0NzYsICAgLTI1MiwgLTM2NCwKKyAgLTM3NiwgIC0zOTIsICA1NTYsICAgLTI1NiwgIC01NzYsICAyNjAsICAgLTM1MiwgIDEyMCwgICAtMTYsICAgLTEzNiwgLTI2MCwKKyAgLTQ5MiwgIDcyLCAgICA1NTYsICAgNjYwLCAgIDU4MCwgICA2MTYsICAgNzcyLCAgIDQzNiwgICA0MjQsICAgLTMyLCAgLTMyNCwKKyAgLTEyNjgsIDQxNiwgICAtMzI0LCAgLTgwLCAgIDkyMCwgICAxNjAsICAgMjI4LCAgIDcyNCwgICAzMiwgICAgLTUxNiwgNjQsCisgIDM4NCwgICA2OCwgICAgLTEyOCwgIDEzNiwgICAyNDAsICAgMjQ4LCAgIC0yMDQsICAtNjgsICAgMjUyLCAgIC05MzIsIC0xMjAsCisgIC00ODAsICAtNjI4LCAgLTg0LCAgIDE5MiwgICA4NTIsICAgLTQwNCwgIC0yODgsICAtMTMyLCAgMjA0LCAgIDEwMCwgIDE2OCwKKyAgLTY4LCAgIC0xOTYsICAtODY4LCAgNDYwLCAgIDEwODAsICAzODAsICAgLTgwLCAgIDI0NCwgICAwLCAgICAgNDg0LCAgLTg4OCwKKyAgNjQsICAgIDE4NCwgICAzNTIsICAgNjAwLCAgIDQ2MCwgICAxNjQsICAgNjA0LCAgIC0xOTYsICAzMjAsICAgLTY0LCAgNTg4LAorICAtMTg0LCAgMjI4LCAgIDEyLCAgICAzNzIsICAgNDgsICAgIC04NDgsICAtMzQ0LCAgMjI0LCAgIDIwOCwgICAtMjAwLCA0ODQsCisgIDEyOCwgICAtMjAsICAgMjcyLCAgIC00NjgsICAtODQwLCAgMzg0LCAgIDI1NiwgICAtNzIwLCAgLTUyMCwgIC00NjQsIC01ODAsCisgIDExMiwgICAtMTIwLCAgNjQ0LCAgIC0zNTYsICAtMjA4LCAgLTYwOCwgIC01MjgsICA3MDQsICAgNTYwLCAgIC00MjQsIDM5MiwKKyAgODI4LCAgIDQwLCAgICA4NCwgICAgMjAwLCAgIC0xNTIsICAwLCAgICAgLTE0NCwgIDU4NCwgICAyODAsICAgLTEyMCwgODAsCisgIC01NTYsICAtOTcyLCAgLTE5NiwgIC00NzIsICA3MjQsICAgODAsICAgIDE2OCwgICAtMzIsICAgODgsICAgIDE2MCwgIC02ODgsCisgIDAsICAgICAxNjAsICAgMzU2LCAgIDM3MiwgICAtNzc2LCAgNzQwLCAgIC0xMjgsICA2NzYsICAgLTI0OCwgIC00ODAsIDQsCisgIC0zNjQsICA5NiwgICAgNTQ0LCAgIDIzMiwgICAtMTAzMiwgOTU2LCAgIDIzNiwgICAzNTYsICAgMjAsICAgIC00MCwgIDMwMCwKKyAgMjQsICAgIC02NzYsICAtNTk2LCAgMTMyLCAgIDExMjAsICAtMTA0LCAgNTMyLCAgIC0xMDk2LCA1NjgsICAgNjQ4LCAgNDQ0LAorICA1MDgsICAgMzgwLCAgIDE4OCwgICAtMzc2LCAgLTYwNCwgIDE0ODgsICA0MjQsICAgMjQsICAgIDc1NiwgICAtMjIwLCAtMTkyLAorICA3MTYsICAgMTIwLCAgIDkyMCwgICA2ODgsICAgMTY4LCAgIDQ0LCAgICAtNDYwLCAgNTY4LCAgIDI4NCwgICAxMTQ0LCAxMTYwLAorICA2MDAsICAgNDI0LCAgIDg4OCwgICA2NTYsICAgLTM1NiwgIC0zMjAsICAyMjAsICAgMzE2LCAgIC0xNzYsICAtNzI0LCAtMTg4LAorICAtODE2LCAgLTYyOCwgIC0zNDgsICAtMjI4LCAgLTM4MCwgIDEwMTIsICAtNDUyLCAgLTY2MCwgIDczNiwgICA5MjgsICA0MDQsCisgIC02OTYsICAtNzIsICAgLTI2OCwgIC04OTIsICAxMjgsICAgMTg0LCAgIC0zNDQsICAtNzgwLCAgMzYwLCAgIDMzNiwgIDQwMCwKKyAgMzQ0LCAgIDQyOCwgICA1NDgsICAgLTExMiwgIDEzNiwgICAtMjI4LCAgLTIxNiwgIC04MjAsICAtNTE2LCAgMzQwLCAgOTIsCisgIC0xMzYsICAxMTYsICAgLTMwMCwgIDM3NiwgICAtMjQ0LCAgMTAwLCAgIC0zMTYsICAtNTIwLCAgLTI4NCwgIC0xMiwgIDgyNCwKKyAgMTY0LCAgIC01NDgsICAtMTgwLCAgLTEyOCwgIDExNiwgICAtOTI0LCAgLTgyOCwgIDI2OCwgICAtMzY4LCAgLTU4MCwgNjIwLAorICAxOTIsICAgMTYwLCAgIDAsICAgICAtMTY3NiwgMTA2OCwgIDQyNCwgICAtNTYsICAgLTM2MCwgIDQ2OCwgICAtMTU2LCA3MjAsCisgIDI4OCwgICAtNTI4LCAgNTU2LCAgIC0zNjQsICA1NDgsICAgLTE0OCwgIDUwNCwgICAzMTYsICAgMTUyLCAgIC02NDgsIC02MjAsCisgIC02ODQsICAtMjQsICAgLTM3NiwgIC0zODQsICAtMTA4LCAgLTkyMCwgIC0xMDMyLCA3NjgsICAgMTgwLCAgIC0yNjQsIC01MDgsCisgIC0xMjY4LCAtMjYwLCAgLTYwLCAgIDMwMCwgICAtMjQwLCAgOTg4LCAgIDcyNCwgICAtMzc2LCAgLTU3NiwgIC0yMTIsIC03MzYsCisgIDU1NiwgICAxOTIsICAgMTA5MiwgIC02MjAsICAtODgwLCAgMzc2LCAgIC01NiwgICAtNCwgICAgLTIxNiwgIC0zMiwgIDgzNiwKKyAgMjY4LCAgIDM5NiwgICAxMzMyLCAgODY0LCAgIC02MDAsICAxMDAsICAgNTYsICAgIC00MTIsICAtOTIsICAgMzU2LCAgMTgwLAorICA4ODQsICAgLTQ2OCwgIC00MzYsICAyOTIsICAgLTM4OCwgIC04MDQsICAtNzA0LCAgLTg0MCwgIDM2OCwgICAtMzQ4LCAxNDAsCisgIC03MjQsICAxNTM2LCAgOTQwLCAgIDM3MiwgICAxMTIsICAgLTM3MiwgIDQzNiwgICAtNDgwLCAgMTEzNiwgIDI5NiwgIC0zMiwKKyAgLTIyOCwgIDEzMiwgICAtNDgsICAgLTIyMCwgIDg2OCwgICAtMTAxNiwgLTYwLCAgIC0xMDQ0LCAtNDY0LCAgMzI4LCAgOTE2LAorICAyNDQsICAgMTIsICAgIC03MzYsICAtMjk2LCAgMzYwLCAgIDQ2OCwgICAtMzc2LCAgLTEwOCwgIC05MiwgICA3ODgsICAzNjgsCisgIC01NiwgICA1NDQsICAgNDAwLCAgIC02NzIsICAtNDIwLCAgNzI4LCAgIDE2LCAgICAzMjAsICAgNDQsICAgIC0yODQsIC0zODAsCisgIC03OTYsICA0ODgsICAgMTMyLCAgIDIwNCwgICAtNTk2LCAgLTM3MiwgIDg4LCAgICAtMTUyLCAgLTkwOCwgIC02MzYsIC01NzIsCisgIC02MjQsICAtMTE2LCAgLTY5MiwgIC0yMDAsICAtNTYsICAgMjc2LCAgIC04OCwgICA0ODQsICAgLTMyNCwgIDk0OCwgIDg2NCwKKyAgMTAwMCwgIC00NTYsICAtMTg0LCAgLTI3NiwgIDI5MiwgICAtMjk2LCAgMTU2LCAgIDY3NiwgICAzMjAsICAgMTYwLCAgOTA4LAorICAtODQsICAgLTEyMzYsIC0yODgsICAtMTE2LCAgMjYwLCAgIC0zNzIsICAtNjQ0LCAgNzMyLCAgIC03NTYsICAtOTYsICA4NCwKKyAgMzQ0LCAgIC01MjAsICAzNDgsICAgLTY4OCwgIDI0MCwgICAtODQsICAgMjE2LCAgIC0xMDQ0LCAtMTM2LCAgLTY3NiwgLTM5NiwKKyAgLTE1MDAsIDk2MCwgICAtNDAsICAgMTc2LCAgIDE2OCwgICAxNTE2LCAgNDIwLCAgIC01MDQsICAtMzQ0LCAgLTM2NCwgLTM2MCwKKyAgMTIxNiwgIC05NDAsICAtMzgwLCAgLTIxMiwgIDI1MiwgICAtNjYwLCAgLTcwOCwgIDQ4NCwgICAtNDQ0LCAgLTE1MiwgOTI4LAorICAtMTIwLCAgMTExMiwgIDQ3NiwgICAtMjYwLCAgNTYwLCAgIC0xNDgsICAtMzQ0LCAgMTA4LCAgIC0xOTYsICAyMjgsICAtMjg4LAorICA1MDQsICAgNTYwLCAgIC0zMjgsICAtODgsICAgMjg4LCAgIC0xMDA4LCA0NjAsICAgLTIyOCwgIDQ2OCwgICAtODM2LCAtMTk2LAorICA3NiwgICAgMzg4LCAgIDIzMiwgICA0MTIsICAgLTExNjgsIC03MTYsICAtNjQ0LCAgNzU2LCAgIC0xNzIsICAtMzU2LCAtNTA0LAorICAxMTYsICAgNDMyLCAgIDUyOCwgICA0OCwgICAgNDc2LCAgIC0xNjgsICAtNjA4LCAgNDQ4LCAgIDE2MCwgICAtNTMyLCAtMjcyLAorICAyOCwgICAgLTY3NiwgIC0xMiwgICA4MjgsICAgOTgwLCAgIDQ1NiwgICA1MjAsICAgMTA0LCAgIC0xMDQsICAyNTYsICAtMzQ0LAorICAtNCwgICAgLTI4LCAgIC0zNjgsICAtNTIsICAgLTUyNCwgIC01NzIsICAtNTU2LCAgLTIwMCwgIDc2OCwgICAxMTI0LCAtMjA4LAorICAtNTEyLCAgMTc2LCAgIDIzMiwgICAyNDgsICAgLTE0OCwgIC04ODgsICA2MDQsICAgLTYwMCwgIC0zMDQsICA4MDQsICAtMTU2LAorICAtMjEyLCAgNDg4LCAgIC0xOTIsICAtODA0LCAgLTI1NiwgIDM2OCwgICAtMzYwLCAgLTkxNiwgIC0zMjgsICAyMjgsICAtMjQwLAorICAtNDQ4LCAgLTQ3MiwgIDg1NiwgICAtNTU2LCAgLTM2NCwgIDU3MiwgICAtMTIsICAgLTE1NiwgIC0zNjgsICAtMzQwLCA0MzIsCisgIDI1MiwgICAtNzUyLCAgLTE1MiwgIDI4OCwgICAyNjgsICAgLTU4MCwgIC04NDgsICAtNTkyLCAgMTA4LCAgIC03NiwgIDI0NCwKKyAgMzEyLCAgIC03MTYsICA1OTIsICAgLTgwLCAgIDQzNiwgICAzNjAsICAgNCwgICAgIC0yNDgsICAxNjAsICAgNTE2LCAgNTg0LAorICA3MzIsICAgNDQsICAgIC00NjgsICAtMjgwLCAgLTI5MiwgIC0xNTYsICAtNTg4LCAgMjgsICAgIDMwOCwgICA5MTIsICAyNCwKKyAgMTI0LCAgIDE1NiwgICAxODAsICAgLTI1MiwgIDk0NCwgICAtOTI0LCAgLTc3MiwgIC01MjAsICAtNDI4LCAgLTYyNCwgMzAwLAorICAtMjEyLCAgLTExNDQsIDMyLCAgICAtNzI0LCAgODAwLCAgIC0xMTI4LCAtMjEyLCAgLTEyODgsIC04NDgsICAxODAsICAtNDE2LAorICA0NDAsICAgMTkyLCAgIC01NzYsICAtNzkyLCAgLTc2LCAgIC0xMDgwLCA4MCwgICAgLTUzMiwgIC0zNTIsICAtMTMyLCAzODAsCisgIC04MjAsICAxNDgsICAgMTExMiwgIDEyOCwgICAxNjQsICAgNDU2LCAgIDcwMCwgICAtOTI0LCAgMTQ0LCAgIC02NjgsIC0zODQsCisgIDY0OCwgICAtODMyLCAgNTA4LCAgIDU1MiwgICAtNTIsICAgLTEwMCwgIC02NTYsICAyMDgsICAgLTU2OCwgIDc0OCwgIC04OCwKKyAgNjgwLCAgIDIzMiwgICAzMDAsICAgMTkyLCAgIC00MDgsICAtMTAxMiwgLTE1MiwgIC0yNTIsICAtMjY4LCAgMjcyLCAgLTg3NiwKKyAgLTY2NCwgIC02NDgsICAtMzMyLCAgLTEzNiwgIDE2LCAgICAxMiwgICAgMTE1MiwgIC0yOCwgICAzMzIsICAgLTUzNiwgMzIwLAorICAtNjcyLCAgLTQ2MCwgIC0zMTYsICA1MzIsICAgLTI2MCwgIDIyOCwgICAtNDAsICAgMTA1MiwgIC04MTYsICAxODAsICA4OCwKKyAgLTQ5NiwgIC01NTYsICAtNjcyLCAgLTM2OCwgIDQyOCwgICA5MiwgICAgMzU2LCAgIDQwNCwgICAtNDA4LCAgMjUyLCAgMTk2LAorICAtMTc2LCAgLTU1NiwgIDc5MiwgICAyNjgsICAgMzIsICAgIDM3MiwgICA0MCwgICAgOTYsICAgIC0zMzIsICAzMjgsICAxMjAsCisgIDM3MiwgICAtOTAwLCAgLTQwLCAgIDQ3MiwgICAtMjY0LCAgLTU5MiwgIDk1MiwgICAxMjgsICAgNjU2LCAgIDExMiwgIDY2NCwKKyAgLTIzMiwgIDQyMCwgICA0LCAgICAgLTM0NCwgIC00NjQsICA1NTYsICAgMjQ0LCAgIC00MTYsICAtMzIsICAgMjUyLCAgMCwKKyAgLTQxMiwgIDE4OCwgICAtNjk2LCAgNTA4LCAgIC00NzYsICAzMjQsICAgLTEwOTYsIDY1NiwgICAtMzEyLCAgNTYwLCAgMjY0LAorICAtMTM2LCAgMzA0LCAgIDE2MCwgICAtNjQsICAgLTU4MCwgIDI0OCwgICAzMzYsICAgLTcyMCwgIDU2MCwgICAtMzQ4LCAtMjg4LAorICAtMjc2LCAgLTE5NiwgIC01MDAsICA4NTIsICAgLTU0NCwgIC0yMzYsICAtMTEyOCwgLTk5MiwgIC03NzYsICAxMTYsICA1NiwKKyAgNTIsICAgIDg2MCwgICA4ODQsICAgMjEyLCAgIC0xMiwgICAxNjgsICAgMTAyMCwgIDUxMiwgICAtNTUyLCAgOTI0LCAgLTE0OCwKKyAgNzE2LCAgIDE4OCwgICAxNjQsICAgLTM0MCwgIC01MjAsICAtMTg0LCAgODgwLCAgIC0xNTIsICAtNjgwLCAgLTIwOCwgLTExNTYsCisgIC0zMDAsICAtNTI4LCAgLTQ3MiwgIDM2NCwgICAxMDAsICAgLTc0NCwgIC0xMDU2LCAtMzIsICAgNTQwLCAgIDI4MCwgIDE0NCwKKyAgLTY3NiwgIC0zMiwgICAtMjMyLCAgLTI4MCwgIC0yMjQsICA5NiwgICAgNTY4LCAgIC03NiwgICAxNzIsICAgMTQ4LCAgMTQ4LAorICAxMDQsICAgMzIsICAgIC0yOTYsICAtMzIsICAgNzg4LCAgIC04MCwgICAzMiwgICAgLTE2LCAgIDI4MCwgICAyODgsICA5NDQsCisgIDQyOCwgICAtNDg0Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgZmdfZGF0YV9jb3B5X3Vuc2lnbmVkKAorCXMzMiAqdG8sIHU4ICpmcm9tLCBzMzIgc2l6ZSwgdTggZW5kaWFuX3N3YXAsIHMzMiBvZmZ0KQoreworCXMzMiBpOworCisJaWYgKGVuZGlhbl9zd2FwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpICs9IDQpIHsKKwkJCXRvW2ldID0gZnJvbVtpICsgM10gLSBvZmZ0OworCQkJdG9baSArIDFdID0gZnJvbVtpICsgMl0gLSBvZmZ0OworCQkJdG9baSArIDJdID0gZnJvbVtpICsgMV0gLSBvZmZ0OworCQkJdG9baSArIDNdID0gZnJvbVtpXSAtIG9mZnQ7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQl0b1tpXSA9IGZyb21baV07CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmZ19kYXRhX2NvcHlfc2lnbmVkKAorCXMzMiAqdG8sIHM4ICpmcm9tLCBzMzIgc2l6ZSwgdTggZW5kaWFuX3N3YXAsIHMzMiBvZmZ0KQoreworCXMzMiBpOworCisJaWYgKGVuZGlhbl9zd2FwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpICs9IDQpIHsKKwkJCXRvW2ldID0gKHMzMikoZnJvbVtpICsgM10gLSBvZmZ0KTsKKwkJCXRvW2kgKyAxXSA9IChzMzIpKGZyb21baSArIDJdIC0gb2ZmdCk7CisJCQl0b1tpICsgMl0gPSAoczMyKShmcm9tW2kgKyAxXSAtIG9mZnQpOworCQkJdG9baSArIDNdID0gKHMzMikoZnJvbVtpXSAtIG9mZnQpOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJdG9baV0gPSBmcm9tW2ldOworCQl9CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGZnX2luZm9fcHJpbnQoc3RydWN0IGFvbV9maWxtX2dyYWluX3QgKnApCit7CisJczMyIGk7CisKKwlwcl9pbmZvKCJhcHBseV9ncmFpbjogJWRcbiIsIHAtPmFwcGx5X2dyYWluKTsKKwlwcl9pbmZvKCJ1cGRhdGVfcGFyYW1ldGVyczogJWRcbiIsIHAtPnVwZGF0ZV9wYXJhbWV0ZXJzKTsKKworCWlmIChwLT5udW1feV9wb2ludHMgPiAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCAxNDsgaSsrKSB7CisJCQlwcl9pbmZvKCJzY2FsaW5nX3BvaW50c195WyVkXVswXTogJXgsIFsxXTogJXhcbiIsIGksIHAtPnNjYWxpbmdfcG9pbnRzX3lbaV1bMF0sIHAtPnNjYWxpbmdfcG9pbnRzX3lbaV1bMV0pOworCQl9CisJfQorCXByX2luZm8oIm51bV95X3BvaW50czogJWRcbiIsIHAtPm51bV95X3BvaW50cyk7CisKKwlpZiAocC0+bnVtX2NiX3BvaW50cyA+IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJCXByX2luZm8oInNjYWxpbmdfcG9pbnRzX2NiWyVkXVswXTogJXgsIFsxXTogJXhcbiIsIGksIHAtPnNjYWxpbmdfcG9pbnRzX2NiW2ldWzBdLCBwLT5zY2FsaW5nX3BvaW50c19jYltpXVsxXSk7CisJCX0KKwl9CisJcHJfaW5mbygibnVtX2NiX3BvaW50czogJWRcbiIsIHAtPm51bV9jYl9wb2ludHMpOworCisJaWYgKHAtPm51bV9jYl9wb2ludHMgPiAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCQlwcl9pbmZvKCJzY2FsaW5nX3BvaW50c19jclslZF1bMF06ICV4LCBbMV06ICV4XG4iLCBpLCBwLT5zY2FsaW5nX3BvaW50c19jcltpXVswXSwgcC0+c2NhbGluZ19wb2ludHNfY3JbaV1bMV0pOworCQl9CisJfQorCXByX2luZm8oIm51bV9jcl9wb2ludHM6ICVkXG4iLCBwLT5udW1fY3JfcG9pbnRzKTsKKwlwcl9pbmZvKCJzY2FsaW5nX3NoaWZ0OiAlZFxuIiwgcC0+c2NhbGluZ19zaGlmdCk7CisJcHJfaW5mbygiYXJfY29lZmZfbGFnOiAweCV4XG4iLCBwLT5hcl9jb2VmZl9sYWcpOworCisJZm9yIChpID0gMDsgaSA8IDI0OyBpKyspIHsKKwkJcHJfaW5mbygiYXJfY29lZmZzX3lbJWRdOiAleFxuIiwgaSwgcC0+YXJfY29lZmZzX3lbaV0pOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgMjU7IGkrKykgeworCQlwcl9pbmZvKCJhcl9jb2VmZnNfY2JbJWRdOiAleFxuIiwgaSwgcC0+YXJfY29lZmZzX2NiW2ldKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IDI1OyBpKyspIHsKKwkJcHJfaW5mbygiYXJfY29lZmZzX2NyWyVkXTogJXhcbiIsIGksIHAtPmFyX2NvZWZmc19jcltpXSk7CisJfQorCXByX2luZm8oImFyX2NvZWZmX3NoaWZ0OiAlZFxuIiwgcC0+YXJfY29lZmZfc2hpZnQpOworCXByX2luZm8oImNiX211bHQ6IDB4JXhcbiIsIHAtPmNiX211bHQpOworCXByX2luZm8oImNiX2x1bWFfbXVsdDogMHgleFxuIiwgcC0+Y2JfbHVtYV9tdWx0KTsKKwlwcl9pbmZvKCJjYl9vZmZzZXQ6IDB4JXhcbiIsIHAtPmNiX29mZnNldCk7CisKKwlwcl9pbmZvKCJjcl9tdWx0OiAweCV4XG4iLCBwLT5jcl9tdWx0KTsKKwlwcl9pbmZvKCJjcl9sdW1hX211bHQ6IDB4JXhcbiIsIHAtPmNyX2x1bWFfbXVsdCk7CisJcHJfaW5mbygiY3Jfb2Zmc2V0OiAweCV4XG4iLCBwLT5jcl9vZmZzZXQpOworCisJcHJfaW5mbygib3ZlcmxhcF9mbGFnOiAlZFxuIiwgcC0+b3ZlcmxhcF9mbGFnKTsKKwlwcl9pbmZvKCJjbGlwX3RvX3Jlc3RyaWN0ZWRfcmFuZ2U6ICVkXG4iLCBwLT5jbGlwX3RvX3Jlc3RyaWN0ZWRfcmFuZ2UpOworCXByX2luZm8oImJpdF9kZXB0aDogJWRcbiIsIHAtPmJpdF9kZXB0aCk7CisJcHJfaW5mbygibWNfaWRlbnRpdHk6ICVkXG4iLCBwLT5tY19pZGVudGl0eSk7CisJcHJfaW5mbygiY2hyb21hX3NjYWxpbmdfZnJvbV9sdW1hOiAlZFxuIiwgcC0+Y2hyb21hX3NjYWxpbmdfZnJvbV9sdW1hKTsKKwlwcl9pbmZvKCJncmFpbl9zY2FsZV9zaGlmdDogJWRcbiIsIHAtPmdyYWluX3NjYWxlX3NoaWZ0KTsKKwlwcl9pbmZvKCJyYW5kb21fc2VlZDogMHgleFxuIiwgcC0+cmFuZG9tX3NlZWQpOworfQorCitzdGF0aWMgdm9pZCBmaWxtX2dyYWluX2RhdGFfcGFyc2Uoc3RydWN0IGFvbV9maWxtX2dyYWluX3QgKnBhcmEsIHUzMiBmZ3NfY3RybCwgdTMyICpmZ3NfZGF0YSkKK3sKKwkvKiBpbmRleCAwCisJIGJpdFszMF0gICAtIGJpdF9kZXB0aF8xMAorCSBiaXRbMjldICAgLSBtY19pZGVudGl0eQorCSBiaXRbMjhdICAgLSBudW1fcG9zX2Nocm9tYV9vbmVfbW9yZQorCSBiaXRbMjc6MjRdIC0gYXJfY29lZmZfc2hpZnQKKwkgYml0WzIzOjIwXSAtIHNjYWxpbmdfc2hpZnQKKwkgYml0WzE5XSAgIC0gb3ZlcmxhcF9mbGFnCisJIGJpdFsxOF0gICAtIGNsaXBfdG9fcmVzdHJpY3RlZF9yYW5nZQorCSBiaXRbMTddICAgLSBjaHJvbWFfc2NhbGluZ19mcm9tX2x1bWEKKwkgKi8KKwlwYXJhLT5iaXRfZGVwdGggPSAoZmdzX2RhdGFbMF0gJiAoMSA8PCAzMCkpID8gMTAgOiA4OyAgLy8gdmlkZW8gYml0IGRlcHRoCisJcGFyYS0+bWNfaWRlbnRpdHkgPSAoZmdzX2RhdGFbMF0gJiAoMSA8PCAyOSkpID8gMSA6IDA7CisJcGFyYS0+YXJfY29lZmZfc2hpZnQgICAgICAgICAgID0gKGZnc19kYXRhWzBdID4+IDI0KSAmIDB4Zjs7ICAvLyB2YWx1ZXMgOiA2Li45CisJcGFyYS0+c2NhbGluZ19zaGlmdCAgICAgICAgICAgID0gKGZnc19kYXRhWzBdID4+IDIwKSAmIDB4ZjsgICAvLyB2YWx1ZXMgOiA4Li4xMQorCXBhcmEtPm92ZXJsYXBfZmxhZyAgICAgICAgICAgICA9IChmZ3NfZGF0YVswXSA+PiAxOSkgJiAweDE7CisJcGFyYS0+Y2xpcF90b19yZXN0cmljdGVkX3JhbmdlID0gKGZnc19kYXRhWzBdID4+IDE4KSAmIDB4MTsKKwlwYXJhLT5jaHJvbWFfc2NhbGluZ19mcm9tX2x1bWEgPSAoZmdzX2RhdGFbMF0gPj4gMTcpICYgMHgxOworCisJLyogaW5kZXggMQorCSBiaXRbMzE6MzBdIC0gZ3JhaW5fc2NhbGVfc2hpZnQKKwkgYml0WzI5OjI4XSAtIGFyX2NvZWZmX2xhZworCSBiaXRbMjc6MjBdIC0gYXJfY29lZmZzX2NyWzI0XQorCSBiaXRbMTk6MTJdIC0gYXJfY29lZmZzX2NiWzI0XQorCSBiaXRbMTE6OF0gIC0gbnVtX2NyX3BvaW50cworCSBiaXRbNzo0XSAgIC0gbnVtX2NiX3BvaW50cworCSBiaXRbMzowXSAgIC0gbnVtX3lfcG9pbnRzCisJKi8KKwlwYXJhLT5ncmFpbl9zY2FsZV9zaGlmdCAgICAgID0gKGZnc19kYXRhWzFdID4+IDMwKSAmIDB4MzsKKwlwYXJhLT5hcl9jb2VmZl9sYWcgICAgICAgICAgID0gKGZnc19kYXRhWzFdID4+IDI4KSAmIDB4MzsgIC8vIHZhbHVlczogIDAuLjMKKwlwYXJhLT5hcl9jb2VmZnNfY3JbMjRdICAgICAgID0gKGZnc19kYXRhWzFdID4+IDIwKSAmIDB4ZmY7CisJcGFyYS0+YXJfY29lZmZzX2NyWzI0XSAtPSAxMjg7CisJcGFyYS0+YXJfY29lZmZzX2NiWzI0XSAgICAgICA9IChmZ3NfZGF0YVsxXSA+PiAxMikgJiAweGZmOworCXBhcmEtPmFyX2NvZWZmc19jYlsyNF0gLT0gMTI4OworCXBhcmEtPm51bV9jcl9wb2ludHMgICAgICAgICAgPSAoZmdzX2RhdGFbMV0gPj4gOCkgJiAweGY7ICAgLy8gdmFsdWU6IDAuLjEwCisJcGFyYS0+bnVtX2NiX3BvaW50cyAgICAgICAgICA9IChmZ3NfZGF0YVsxXSA+PiA0KSAmIDB4ZjsgICAvLyB2YWx1ZTogMC4uMTAKKwlwYXJhLT5udW1feV9wb2ludHMgICAgICAgICAgID0gKGZnc19kYXRhWzFdID4+IDApICYgMHhmOyAgIC8vIHZhbHVlOiAwLi4xNAorCisJLyogaW5kZXggMn44IHNjYWxpbmdfcG9pbnRzX3lbMTRdWzJdICovCisJZmdfZGF0YV9jb3B5X3Vuc2lnbmVkKCZwYXJhLT5zY2FsaW5nX3BvaW50c195WzBdWzBdLCAodTggKikmZmdzX2RhdGFbMl0sIHBhcmEtPm51bV95X3BvaW50cyAqIDIsIDEsIDApOyAgLy8gOCBiaXQgdmFsdWVzIC8vIGJyaWFuICBzd2FwID8KKworCS8qIGluZGV4IDktMTMgc2NhbGluZ19wb2ludHNfY2JbMTBdWzJdICovCisJZmdfZGF0YV9jb3B5X3Vuc2lnbmVkKCZwYXJhLT5zY2FsaW5nX3BvaW50c19jYlswXVswXSwgKHU4ICopJmZnc19kYXRhWzldLCBwYXJhLT5udW1fY2JfcG9pbnRzICogMiwgMSwgMCk7ICAvLyA4IGJpdCB2YWx1ZXMgLy8gYnJpYW4gIGNocm9tYV9zY2FsaW5nX2Zyb21fbHVtYSBhbmQgc3dhcCA/CisKKwkvLyAxNC0xOCAtLSBzY2FsaW5nX3BvaW50c19jclsxMF1bMl0KKwlmZ19kYXRhX2NvcHlfdW5zaWduZWQoJnBhcmEtPnNjYWxpbmdfcG9pbnRzX2NyWzBdWzBdLCAodTggKikmZmdzX2RhdGFbMTRdLCBwYXJhLT5udW1fY3JfcG9pbnRzICogMiwgMSwgMCk7IC8vIDggYml0IHZhbHVlcyAvLyBicmlhbiAgY2hyb21hX3NjYWxpbmdfZnJvbV9sdW1hIGFuZCBzd2FwID8KKworCS8vIDE5LTI0IC0tIGFyX2NvZWZmc195WzAtMjNdCisJZmdfZGF0YV9jb3B5X3Vuc2lnbmVkKHBhcmEtPmFyX2NvZWZmc195LCAodTggKikmZmdzX2RhdGFbMTldLCAyNCwgMSwgMTI4KTsgLy8gYnJpYW4gIGNocm9tYV9zY2FsaW5nX2Zyb21fbHVtYSBhbmQgc3dhcCA/CisKKwkvLyAyNS0zMCAtLSBhcl9jb2VmZnNfY2JbMC0yM10KKwlmZ19kYXRhX2NvcHlfdW5zaWduZWQocGFyYS0+YXJfY29lZmZzX2NiLCAodTggKikmZmdzX2RhdGFbMjVdLCAyNCwgMSwgMTI4KTsgLy8gYnJpYW4gIGNocm9tYV9zY2FsaW5nX2Zyb21fbHVtYSA/CisKKwkvLyAzMS0zNiAtLSBhcl9jb2VmZnNfY3JbMC0yM10KKwlmZ19kYXRhX2NvcHlfdW5zaWduZWQocGFyYS0+YXJfY29lZmZzX2NyLCAodTggKikmZmdzX2RhdGFbMzFdLCAyNCwgMSwgMTI4KTsgIC8vIGJyaWFuICBjaHJvbWFfc2NhbGluZ19mcm9tX2x1bWEgPworCisJLyogaW5kZXggMzcKKwkgYml0WzMxOjI0XSAgLSBjYl9tdWx0CisJIGJpdFsyMzoxNl0gIC0gY2JfbHVtYV9tdWx0CisJIGJpdFsxNTo3XSAgIC0gY2Jfb2Zmc2V0CisJKi8KKwlpZiAocGFyYS0+bnVtX2NiX3BvaW50cyA+IDApIHsgIC8vIGJyaWFuICBjaHJvbWFfc2NhbGluZ19mcm9tX2x1bWEgPworCQlwYXJhLT5jYl9tdWx0ICAgICAgPSAoZmdzX2RhdGFbMzddID4+IDI0KSAmIDB4ZmY7ICAgICAvLyA4IGJpdHMKKwkJcGFyYS0+Y2JfbHVtYV9tdWx0ID0gKGZnc19kYXRhWzM3XSA+PiAxNikgJiAweGZmOyAgICAgLy8gOCBiaXRzCisJCXBhcmEtPmNiX29mZnNldCAgICA9IChmZ3NfZGF0YVszN10gPj4gNykgJiAweDFmZjsgICAgIC8vIDkgYml0cworCX0gZWxzZSB7CisJCXBhcmEtPmNiX211bHQJICAgPSAwOwkgIC8vIDggYml0cworCQlwYXJhLT5jYl9sdW1hX211bHQgPSAwOwkgIC8vIDggYml0cworCQlwYXJhLT5jYl9vZmZzZXQgICAgPSAwOwkgIC8vIDkgYml0cworCX0KKworCS8qIGluZGV4IDM4CisJIGJpdFszMToyNF0gIC0gY3JfbXVsdAorCSBiaXRbMjM6MTZdICAtIGNyX2x1bWFfbXVsdAorCSBiaXRbMTU6N10gICAtIGNyX29mZnNldAorCSovCisJaWYgKHBhcmEtPm51bV9jcl9wb2ludHMgPiAwKSB7ICAvLyBicmlhbiAgY2hyb21hX3NjYWxpbmdfZnJvbV9sdW1hID8KKwkJcGFyYS0+Y3JfbXVsdCAgICAgID0gKGZnc19kYXRhWzM4XSA+PiAyNCkgJiAweGZmOyAgICAgICAvLyA4IGJpdHMKKwkJcGFyYS0+Y3JfbHVtYV9tdWx0ID0gKGZnc19kYXRhWzM4XSA+PiAxNikgJiAweGZmOyAgLy8gOCBiaXRzCisJCXBhcmEtPmNyX29mZnNldCAgICA9IChmZ3NfZGF0YVszOF0gPj4gNykgJiAweDFmZjsgICAgIC8vIDkgYml0cworCX0gZWxzZSB7CisJCXBhcmEtPmNyX211bHQgICAgICA9IDA7ICAgICAgIC8vIDggYml0cworCQlwYXJhLT5jcl9sdW1hX211bHQgPSAwOyAgLy8gOCBiaXRzCisJCXBhcmEtPmNyX29mZnNldCAgICA9IDA7ICAgICAvLyA5IGJpdHMKKwl9CisJLyoKKwkgYml0WzMxOjE2XSAtIHJhbmRvbV9zZWVkCisJIGJpdFswNl0gICAtIGFwcGx5X2NyIChSTykgLy9hc3NpZ24gIGFwcGx5X2NyID0gbnVtX2NyX3BvaW50cz4wIHwgY2hyb21hX3NjYWxpbmdfZnJvbV9sdW1hOworCSBiaXRbMDVdICAgLSBhcHBseV9jYiAoUk8pIC8vYXNzaWduICBhcHBseV9jYiA9IG51bV9jYl9wb2ludHM+MCB8IGNocm9tYV9zY2FsaW5nX2Zyb21fbHVtYTsKKwkgYml0WzA0XSAgIC0gYXBwbHlfbHUgKFJPKSAvL2Fzc2lnbiAgYXBwbHlfbHUgPSBudW1feV9wb2ludHM+MDsKKwkgYml0WzAzXSAgIC0gZmdzX25vdF9ieXBhc3MgOiAwPWZncyBieXBhc3MgMTo9ZmdzIG5vdCBieXBhc3MgKGRlZmF1bHQ9MCkKKwkgYml0WzAyXSAgIC0gdXBkYXRlX3BhcmFtZXRlcnMKKwkgYml0WzAxXSAgIC0gYXBwbHlfZ3JhaW4KKwkgYml0WzAwXSAgIC0gZmlsbSBncmFuIHN0YXJ0CisJKi8KKwlwYXJhLT5hcHBseV9ncmFpbiA9IChmZ3NfY3RybCA+PiAxKSAmIDB4MTsKKwlwYXJhLT51cGRhdGVfcGFyYW1ldGVycyA9IChmZ3NfY3RybCA+PiAyKSAmIDB4MTsKKwlwYXJhLT5yYW5kb21fc2VlZCA9IChmZ3NfY3RybCA+PiAxNikgJiAweGZmZmY7Cit9CisKKyNkZWZpbmUgREVGQVVMVF9BTElHTk1FTlQgKDIgKiBzaXplb2Yodm9pZCAqKSkKKworc3RhdGljIGlubGluZSB2b2lkICpmZ3NfYWxsb2ModTMyIHNpemUpCit7CisJdm9pZCAqYWRkcjsKKwlzaXplID0gc2l6ZSArIERFRkFVTFRfQUxJR05NRU5UIC0gMSArIHNpemVvZihzaXplX3QpOworCWFkZHIgPSB2emFsbG9jKHNpemUpOworCWlmIChhZGRyID09IE5VTEwpCisJCWFkZHIgPSB2emFsbG9jKHNpemUpOworCisJcmV0dXJuIGFkZHI7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfYXJyYXlzKHN0cnVjdCBhb21fZmlsbV9ncmFpbl90ICpwYXJhbXMsCisJczMyICoqKnByZWRfcG9zX2x1bWFfcCwJczMyICoqKnByZWRfcG9zX2Nocm9tYV9wLAorCXMzMiAqKmx1bWFfZ3JhaW5fYmxvY2ssIHMzMiAqKmNiX2dyYWluX2Jsb2NrLCBzMzIgKipjcl9ncmFpbl9ibG9jaywKKwlzMzIgbHVtYV9ncmFpbl9zYW1wbGVzLCBzMzIgbHVtYV9ncmFpbl9zdHJpZGUsCisJczMyIGNocm9tYV9ncmFpbl9zYW1wbGVzLCBzMzIgY2hyb21hX2dyYWluX3N0cmlkZSkKK3sKKwlzMzIgbnVtX3Bvc19sdW1hID0gMiAqIHBhcmFtcy0+YXJfY29lZmZfbGFnICogKHBhcmFtcy0+YXJfY29lZmZfbGFnICsgMSk7CisJczMyIG51bV9wb3NfY2hyb21hID0gbnVtX3Bvc19sdW1hOworCXMzMiByb3csIGNvbDsKKwlzMzIgcG9zX2FyX2luZGV4ID0gMDsKKwlzMzIgKipwcmVkX3Bvc19sdW1hOworCXMzMiAqKnByZWRfcG9zX2Nocm9tYTsKKworCWlmIChwYXJhbXMtPm51bV95X3BvaW50cyA+IDApCisJCSsrbnVtX3Bvc19jaHJvbWE7CisKKwlpZiAoZGVidWdfZmdzICYgREVCVUdfRkdTX0RFVEFJTCkgeworCQlwcl9pbmZvKCJudW1fcG9zX2x1bWEgJWQsIHNpemVvZigqcHJlZF9wb3NfbHVtYSk6JWxkXG4iLCBudW1fcG9zX2x1bWEsIHNpemVvZigqcHJlZF9wb3NfbHVtYSkpOworCQlwcl9pbmZvKCJudW1fcG9zX2Nocm9tYSAlZCwgc2l6ZW9mKCpwcmVkX3Bvc19jaHJvbWEpOiVsZFxuIiwgbnVtX3Bvc19jaHJvbWEsIHNpemVvZigqcHJlZF9wb3NfY2hyb21hKSk7CisJfQorCXByZWRfcG9zX2x1bWEgPSAoczMyICoqKWZnc19hbGxvYyhzaXplb2YoKnByZWRfcG9zX2x1bWEpICogbnVtX3Bvc19sdW1hKTsKKworCWZvciAocm93ID0gMDsgcm93IDwgbnVtX3Bvc19sdW1hOyByb3crKykgeworCQlwcmVkX3Bvc19sdW1hW3Jvd10gPSAoczMyICopZmdzX2FsbG9jKHNpemVvZigqKnByZWRfcG9zX2x1bWEpICogMyk7CisJfQorCisJcHJlZF9wb3NfY2hyb21hID0gKHMzMiAqKilmZ3NfYWxsb2Moc2l6ZW9mKCpwcmVkX3Bvc19jaHJvbWEpICogbnVtX3Bvc19jaHJvbWEpOworCisJZm9yIChyb3cgPSAwOyByb3cgPCBudW1fcG9zX2Nocm9tYTsgcm93KyspIHsKKwkJcHJlZF9wb3NfY2hyb21hW3Jvd10gPSAoczMyICopZmdzX2FsbG9jKHNpemVvZigqKnByZWRfcG9zX2Nocm9tYSkgKiAzKTsKKwl9CisKKwlmb3IgKHJvdyA9IC1wYXJhbXMtPmFyX2NvZWZmX2xhZzsgcm93IDwgMDsgcm93KyspIHsKKwkJZm9yIChjb2wgPSAtcGFyYW1zLT5hcl9jb2VmZl9sYWc7CisJCQljb2wgPCBwYXJhbXMtPmFyX2NvZWZmX2xhZyArIDE7IGNvbCsrKSB7CisJCQlwcmVkX3Bvc19sdW1hW3Bvc19hcl9pbmRleF1bMF0gPSByb3cgKiBsdW1hX2dyYWluX3N0cmlkZTsKKwkJCXByZWRfcG9zX2x1bWFbcG9zX2FyX2luZGV4XVsxXSA9IGNvbDsKKwkJCXByZWRfcG9zX2x1bWFbcG9zX2FyX2luZGV4XVsyXSA9IDA7CisKKwkJCXByZWRfcG9zX2Nocm9tYVtwb3NfYXJfaW5kZXhdWzBdID0gcm93ICogY2hyb21hX2dyYWluX3N0cmlkZTsKKwkJCXByZWRfcG9zX2Nocm9tYVtwb3NfYXJfaW5kZXhdWzFdID0gY29sOworCQkJcHJlZF9wb3NfY2hyb21hW3Bvc19hcl9pbmRleF1bMl0gPSAwOworCQkJKytwb3NfYXJfaW5kZXg7CisJCX0KKwl9CisKKwlmb3IgKGNvbCA9IC1wYXJhbXMtPmFyX2NvZWZmX2xhZzsgY29sIDwgMDsgY29sKyspIHsKKwkJcHJlZF9wb3NfbHVtYVtwb3NfYXJfaW5kZXhdWzBdID0gMDsKKwkJcHJlZF9wb3NfbHVtYVtwb3NfYXJfaW5kZXhdWzFdID0gY29sOworCQlwcmVkX3Bvc19sdW1hW3Bvc19hcl9pbmRleF1bMl0gPSAwOworCisJCXByZWRfcG9zX2Nocm9tYVtwb3NfYXJfaW5kZXhdWzBdID0gMDsKKwkJcHJlZF9wb3NfY2hyb21hW3Bvc19hcl9pbmRleF1bMV0gPSBjb2w7CisJCXByZWRfcG9zX2Nocm9tYVtwb3NfYXJfaW5kZXhdWzJdID0gMDsKKworCQkrK3Bvc19hcl9pbmRleDsKKwl9CisKKwlpZiAocGFyYW1zLT5udW1feV9wb2ludHMgPiAwKSB7CisJCXByZWRfcG9zX2Nocm9tYVtwb3NfYXJfaW5kZXhdWzBdID0gMDsKKwkJcHJlZF9wb3NfY2hyb21hW3Bvc19hcl9pbmRleF1bMV0gPSAwOworCQlwcmVkX3Bvc19jaHJvbWFbcG9zX2FyX2luZGV4XVsyXSA9IDE7CisJfQorCisJKnByZWRfcG9zX2x1bWFfcCA9IHByZWRfcG9zX2x1bWE7CisJKnByZWRfcG9zX2Nocm9tYV9wID0gcHJlZF9wb3NfY2hyb21hOworCSpsdW1hX2dyYWluX2Jsb2NrID0KKwkJKHMzMiAqKWZnc19hbGxvYyhzaXplb2YoKipsdW1hX2dyYWluX2Jsb2NrKSAqIGx1bWFfZ3JhaW5fc2FtcGxlcyk7CisJaWYgKGRlYnVnX2ZncyAmIERFQlVHX0ZHU19ERVRBSUwpIHsKKwkJcHJfaW5mbygibHVtYSBibG9jayBzaXplICVsZCwgbHVtYV9ncmFpbl9zYW1wbGVzOiVkXG4iLCBzaXplb2YoKipsdW1hX2dyYWluX2Jsb2NrKSAqIGx1bWFfZ3JhaW5fc2FtcGxlcywgbHVtYV9ncmFpbl9zYW1wbGVzKTsKKwl9CisJKmNiX2dyYWluX2Jsb2NrID0KKwkJKHMzMiAqKWZnc19hbGxvYyhzaXplb2YoKipjYl9ncmFpbl9ibG9jaykgKiBjaHJvbWFfZ3JhaW5fc2FtcGxlcyk7CisJKmNyX2dyYWluX2Jsb2NrID0KKwkJKHMzMiopZmdzX2FsbG9jKHNpemVvZigqKmNyX2dyYWluX2Jsb2NrKSAqIGNocm9tYV9ncmFpbl9zYW1wbGVzKTsKKwlpZiAoZGVidWdfZmdzICYgREVCVUdfRkdTX0RFVEFJTCkgeworCQlwcl9pbmZvKCJjaHJvbWEgYmxvY2sgc2l6ZSAlbGQsIGNocm9tYV9ncmFpbl9zYW1wbGVzOiVkXG4iLCBzaXplb2YoKipjYl9ncmFpbl9ibG9jaykgKiBjaHJvbWFfZ3JhaW5fc2FtcGxlcywgY2hyb21hX2dyYWluX3NhbXBsZXMpOworCX0KK30KKworc3RhdGljIHZvaWQgZGVhbGxvY19hcnJheXMoc3RydWN0IGFvbV9maWxtX2dyYWluX3QgKnBhcmFtcywKKwlzMzIgKioqcHJlZF9wb3NfbHVtYSwgczMyICoqKnByZWRfcG9zX2Nocm9tYSwKKwlzMzIgKipsdW1hX2dyYWluX2Jsb2NrLCBzMzIgKipjYl9ncmFpbl9ibG9jaywgczMyICoqY3JfZ3JhaW5fYmxvY2spCit7CisJczMyIG51bV9wb3NfbHVtYSA9IDIgKiBwYXJhbXMtPmFyX2NvZWZmX2xhZyAqIChwYXJhbXMtPmFyX2NvZWZmX2xhZyArIDEpOworCXMzMiBudW1fcG9zX2Nocm9tYSA9IG51bV9wb3NfbHVtYTsKKwlzMzIgcm93OworCisJaWYgKHBhcmFtcy0+bnVtX3lfcG9pbnRzID4gMCkKKwkJKytudW1fcG9zX2Nocm9tYTsKKworCWZvciAocm93ID0gMDsgcm93IDwgbnVtX3Bvc19sdW1hOyByb3crKykgeworCQl2ZnJlZSgoKnByZWRfcG9zX2x1bWEpW3Jvd10pOworCX0KKwl2ZnJlZSgqcHJlZF9wb3NfbHVtYSk7CisKKwlmb3IgKHJvdyA9IDA7IHJvdyA8IG51bV9wb3NfY2hyb21hOyByb3crKykgeworCQl2ZnJlZSgoKnByZWRfcG9zX2Nocm9tYSlbcm93XSk7CisJfQorCXZmcmVlKCgqcHJlZF9wb3NfY2hyb21hKSk7CisKKwl2ZnJlZSgqbHVtYV9ncmFpbl9ibG9jayk7CisKKwl2ZnJlZSgqY2JfZ3JhaW5fYmxvY2spOworCisJdmZyZWUoKmNyX2dyYWluX2Jsb2NrKTsKK30KKworLy8gZ2V0IGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMl5iaXRzIC0gMQorc3RhdGljIGlubGluZSBzMzIgZ2V0X3JhbmRvbV9udW1iZXIodTE2ICpyYW5kb21fcmVnaXN0ZXIsIHMzMiBiaXRzKQoreworCXUxNiBiaXQ7CisKKwliaXQgPSAoKCpyYW5kb21fcmVnaXN0ZXIgPj4gMCkgXiAoKnJhbmRvbV9yZWdpc3RlciA+PiAxKSBeCisJCSgqcmFuZG9tX3JlZ2lzdGVyID4+IDMpIF4gKCpyYW5kb21fcmVnaXN0ZXIgPj4gMTIpKSAmIDE7CisJKnJhbmRvbV9yZWdpc3RlciA9ICgqcmFuZG9tX3JlZ2lzdGVyID4+IDEpIHwgKGJpdCA8PCAxNSk7CisJcmV0dXJuICgqcmFuZG9tX3JlZ2lzdGVyID4+ICgxNiAtIGJpdHMpKSAmICgoMSA8PCBiaXRzKSAtIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9yYW5kb21fZ2VuZXJhdG9yKHUxNiAqcmFuZG9tX3JlZ2lzdGVyLCB1MTYgc2VlZCwgczMyIGx1bWFfbGluZSkKK3sKKyAgLy8gc2FtZSBmb3IgdGhlIHBpY3R1cmUKKwl1MTYgbXNiID0gKHNlZWQgPj4gOCkgJiAweGZmOworCXUxNiBsc2IgPSBzZWVkICYgMHhmZjsKKwlzMzIgbHVtYV9udW0gPSBsdW1hX2xpbmUgPj4gNTsKKworCSpyYW5kb21fcmVnaXN0ZXIgPSAobXNiIDw8IDgpICsgbHNiOworCSpyYW5kb21fcmVnaXN0ZXIgXj0gKChsdW1hX251bSAqIDM3ICsgMTc4KSAmIDI1NSkgPDwgODsKKwkqcmFuZG9tX3JlZ2lzdGVyIF49ICgobHVtYV9udW0gKiAxNzMgKyAxMDUpICYgMjU1KTsKK30KKworc3RhdGljIHZvaWQgZ2VuZXJhdGVfbHVtYV9ncmFpbl9ibG9jayhzdHJ1Y3QgYW9tX2ZpbG1fZ3JhaW5fdCAqcGFyYW1zLAorCXMzMiAqKnByZWRfcG9zX2x1bWEsIHMzMiAqbHVtYV9ncmFpbl9ibG9jaywKKwlzMzIgbHVtYV9ibG9ja19zaXplX3ksIHMzMiBsdW1hX2Jsb2NrX3NpemVfeCwgczMyIGx1bWFfZ3JhaW5fc3RyaWRlLAorCXM4ICp0YWJsZV9wdHIpCit7CisJczMyIHhfc3RhcnQgPSBsZWZ0X3BhZCArIGFyX3BhZGRpbmcgKiAyOworCXMzMiB4X2VuZCA9IGx1bWFfYmxvY2tfc2l6ZV94IC0gcmlnaHRfcGFkIC0gKGFyX3BhZGRpbmcgKiAyKSAtIDE7CisJczMyIHlfc3RhcnQgPSB0b3BfcGFkICsgYXJfcGFkZGluZyAqIDI7CisJczMyIHlfZW5kID0gbHVtYV9ibG9ja19zaXplX3kgLSBib3R0b21fcGFkIC0gMTsKKwlzMzIgeF9wYWRfc3RhcnQgPSBsZWZ0X3BhZDsKKwlzMzIgeF9wYWRfZW5kID0gbHVtYV9ibG9ja19zaXplX3ggLSByaWdodF9wYWQgLSAxOworCXMzMiB5X3BhZF9zdGFydCA9IHRvcF9wYWQ7CisJczMyIHlfcGFkX2VuZCA9IGx1bWFfYmxvY2tfc2l6ZV95IC0gYm90dG9tX3BhZCAtIDE7CisJdTggY250ID0gMDsKKwlzMzIgZ3JhaW5fYmxvY2tbNF0sIGdyYWluX3ZhbDsKKwl1MzIgYml0X21hc2sgPSAoMSA8PCBwYXJhbXMtPmJpdF9kZXB0aCkgLSAxOworCXM4IGdhdXNzX3NlY19zaGlmdCA9IDEyIC0gcGFyYW1zLT5iaXRfZGVwdGggKyBwYXJhbXMtPmdyYWluX3NjYWxlX3NoaWZ0OworCXMzMiBnYXVzc19zZWNfdmFsID0gKDEgPDwgZ2F1c3Nfc2VjX3NoaWZ0KSA+PiAxOworCXUzMiBudW1fcG9zX2x1bWEgPSAyICogcGFyYW1zLT5hcl9jb2VmZl9sYWcgKiAocGFyYW1zLT5hcl9jb2VmZl9sYWcgKyAxKTsKKwlzMzIgcm91bmRpbmdfb2Zmc2V0ID0gKDEgPDwgKHBhcmFtcy0+YXJfY29lZmZfc2hpZnQgLSAxKSk7CisJdTMyIGksIGosIHBvcywgYmxvY2tfaWQgPSAwOworCXMzMiByYW5kb21fbnVtOworCXMzMiBncmFpbl9jZW50ZXIgPSAxMjggPDwgKHBhcmFtcy0+Yml0X2RlcHRoIC0gOCk7CisJczMyIGdyYWluX21pbiA9IDAgLSBncmFpbl9jZW50ZXI7CisJczMyIGdyYWluX21heCA9ICgyNTYgPDwgKHBhcmFtcy0+Yml0X2RlcHRoIC0gOCkpIC0gMSAtIGdyYWluX2NlbnRlcjsKKwlzMzIgcHJlZFszMF07CisKKwl0YWJsZV9wdHIgKz0gbHVtYV9ncmFpbl9ibG9ja19vZmZ0OworCXBhcmFtcy0+cmFuZG9tX3JlZ2lzdGVyX3kgPSBwYXJhbXMtPnJhbmRvbV9zZWVkOworCisJaWYgKHBhcmFtcy0+bnVtX3lfcG9pbnRzID09IDApCisJCXJldHVybjsKKworCWlmIChkZWJ1Z19mZ3MgJiBERUJVR19GR1NfREVUQUlMKSB7CisJCXByX2luZm8oIi0tPmdhdXNzX3NlY19zaGlmdCA9ICVkIFxuIixnYXVzc19zZWNfc2hpZnQpOworCQlwcl9pbmZvKCItLT5hcl9jb2VmZl9zaGlmdCAgPSAleCBcbiIscGFyYW1zLT5hcl9jb2VmZl9zaGlmdCk7CisJCXByX2luZm8oIi0tPnJvdW5kaW5nX29mZnNldCA9ICV4IFxuIixyb3VuZGluZ19vZmZzZXQpOworCX0KKworCWZvciAocG9zID0gMDsgcG9zIDwgbnVtX3Bvc19sdW1hOyBwb3MrKykKKwkJcHJlZFtwb3NdID0gcHJlZF9wb3NfbHVtYVtwb3NdWzBdICsgcHJlZF9wb3NfbHVtYVtwb3NdWzFdOworCisJZm9yIChpID0gMDsgaSA8IGx1bWFfYmxvY2tfc2l6ZV95OyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IGx1bWFfYmxvY2tfc2l6ZV94OyBqKyspIHsKKwkJCXJhbmRvbV9udW0gPQorCQkJCWdldF9yYW5kb21fbnVtYmVyKCZwYXJhbXMtPnJhbmRvbV9yZWdpc3Rlcl95LCBnYXVzc19iaXRzKTsKKwkJCWdyYWluX3ZhbCA9IChnYXVzc2lhbl9zZXFbcmFuZG9tX251bV0gKyBnYXVzc19zZWNfdmFsKSA+PiBnYXVzc19zZWNfc2hpZnQ7CisJCQlsdW1hX2dyYWluX2Jsb2NrW2Jsb2NrX2lkXSA9IGdyYWluX3ZhbDsKKwkJCWlmIChpID49IHlfcGFkX3N0YXJ0ICYmIGkgPD0geV9wYWRfZW5kICYmCisJCQkgICAgaiA+PSB4X3BhZF9zdGFydCAmJiBqIDw9IHhfcGFkX2VuZCkgeworCQkJCXMzMiB3c3VtID0gMDsKKworCQkJCWZvciAocG9zID0gMDsgcG9zIDwgbnVtX3Bvc19sdW1hOyBwb3MrKykKKwkJCQkJd3N1bSArPSBwYXJhbXMtPmFyX2NvZWZmc195W3Bvc10gKgorCQkJCQkJbHVtYV9ncmFpbl9ibG9ja1tibG9ja19pZCArIHByZWRbcG9zXV07CisJCQkJd3N1bSArPSByb3VuZGluZ19vZmZzZXQ7CisJCQkJd3N1bSA9IHdzdW0gPj4gcGFyYW1zLT5hcl9jb2VmZl9zaGlmdDsKKwkJCQlncmFpbl92YWwgPSBNSUQoZ3JhaW5fdmFsICsJd3N1bSwgZ3JhaW5fbWluLCBncmFpbl9tYXgpOworCQkJCWx1bWFfZ3JhaW5fYmxvY2tbYmxvY2tfaWRdID0gZ3JhaW5fdmFsOworCQkJCWlmIChpID49IHlfc3RhcnQgJiYgaSA8PSB5X2VuZCAmJgorCQkJCSAgICBqID49IHhfc3RhcnQgJiYgaiA8PSB4X2VuZCkgeworCQkJCQlncmFpbl9ibG9ja1tjbnQrK10gPSBncmFpbl92YWwgJiBiaXRfbWFzazsKKwkJCQkJaWYgKGNudCA9PSA0KSB7CisJCQkJCQl0YWJsZV9wdHJbMF0gPSAgZ3JhaW5fYmxvY2tbMF0gJiAweGZmOworCQkJCQkJdGFibGVfcHRyWzFdID0gIChncmFpbl9ibG9ja1sxXSAmIDB4M2YpIDw8IDI7CisJCQkJCQl0YWJsZV9wdHJbMV0gfD0gKGdyYWluX2Jsb2NrWzBdID4+IDgpICYgMzsKKwkJCQkJCXRhYmxlX3B0clsyXSA9ICAoZ3JhaW5fYmxvY2tbMl0gJiAweGYpIDw8IDQ7CisJCQkJCQl0YWJsZV9wdHJbMl0gfD0gKGdyYWluX2Jsb2NrWzFdID4+IDYpICYgMHhmOworCQkJCQkJdGFibGVfcHRyWzNdID0gIChncmFpbl9ibG9ja1szXSAmIDMpIDw8IDY7CisJCQkJCQl0YWJsZV9wdHJbM10gfD0gKGdyYWluX2Jsb2NrWzJdID4+IDQpICYgMHgzZjsKKwkJCQkJCXRhYmxlX3B0cls0XSA9ICAoZ3JhaW5fYmxvY2tbM10gPj4gMikgJiAweGZmOworCQkJCQkJdGFibGVfcHRyICs9IDU7CisJCQkJCQljbnQgPSAwOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYmxvY2tfaWQrKzsKKwkJfQorICAgIH0KK30KKworc3RhdGljIHMzMiBnZW5lcmF0ZV9jaHJvbWFfZ3JhaW5fYmxvY2tzKHN0cnVjdCBhb21fZmlsbV9ncmFpbl90ICpwYXJhbXMsCisgICAgczMyICoqcHJlZF9wb3NfY2hyb21hLCBzMzIgKmx1bWFfZ3JhaW5fYmxvY2ssIHMzMiAqY2JfZ3JhaW5fYmxvY2ssCisgICAgczMyICpjcl9ncmFpbl9ibG9jaywgczMyIGx1bWFfZ3JhaW5fc3RyaWRlLCBzMzIgY2hyb21hX2Jsb2NrX3NpemVfeSwKKyAgICBzMzIgY2hyb21hX2Jsb2NrX3NpemVfeCwgczMyIGNocm9tYV9ncmFpbl9zdHJpZGUsCisgICAgczMyIGNocm9tYV9zdWJzYW1wX3ksIHMzMiBjaHJvbWFfc3Vic2FtcF94LAorICAgIHM4ICp0YWJsZV9wdHIpCit7CisJczggZ2F1c3Nfc2VjX3NoaWZ0ID0gMTIgLSBwYXJhbXMtPmJpdF9kZXB0aCArIHBhcmFtcy0+Z3JhaW5fc2NhbGVfc2hpZnQ7CisJczMyIGdhdXNzX3NlY192YWwgPSAoMSA8PCBnYXVzc19zZWNfc2hpZnQpID4+IDE7CisJczMyIGksIGosIGssIGwsIHBvczsKKwl1MzIgbnVtX3Bvc19jaHJvbWEgPSAyICogcGFyYW1zLT5hcl9jb2VmZl9sYWcgKiAocGFyYW1zLT5hcl9jb2VmZl9sYWcgKyAxKTsKKwlzMzIgcm91bmRpbmdfb2Zmc2V0ID0gKDEgPDwgKHBhcmFtcy0+YXJfY29lZmZfc2hpZnQgLSAxKSk7CisJczMyIGNocm9tYV9ncmFpbl9zYW1wbGVzID0gY2hyb21hX2Jsb2NrX3NpemVfeSAqIGNocm9tYV9ibG9ja19zaXplX3g7CisJczMyIGNiX2Jsb2NrWzJdLCBjcl9ibG9ja1syXSwgY2JfZ3JhaW5fdmFsLCBjcl9ncmFpbl92YWw7CisJdTMyIGJpdF9tYXNrID0gKDEgPDwgcGFyYW1zLT5iaXRfZGVwdGgpIC0gMTsKKwlzMzIgeF9zdGFydCA9IGxlZnRfcGFkICsgYXJfcGFkZGluZyAqICgyID4+IGNocm9tYV9zdWJzYW1wX3gpOworCXMzMiB4X2VuZCA9IGNocm9tYV9ibG9ja19zaXplX3ggLSByaWdodF9wYWQgLSAoYXJfcGFkZGluZyAqICgyID4+IGNocm9tYV9zdWJzYW1wX3gpKSAtIDE7CisJczMyIHlfc3RhcnQgPSB0b3BfcGFkICsgYXJfcGFkZGluZyAqICgyID4+IGNocm9tYV9zdWJzYW1wX3gpOworCXMzMiB5X2VuZCA9IGNocm9tYV9ibG9ja19zaXplX3kgLSBib3R0b21fcGFkIC0gMTsKKwlzMzIgeF9wYWRfc3RhcnQgPSBsZWZ0X3BhZDsKKwlzMzIgeF9wYWRfZW5kID0gY2hyb21hX2Jsb2NrX3NpemVfeCAtIHJpZ2h0X3BhZCAtIDE7CisJczMyIHlfcGFkX3N0YXJ0ID0gdG9wX3BhZDsKKwlzMzIgeV9wYWRfZW5kID0gY2hyb21hX2Jsb2NrX3NpemVfeSAtIGJvdHRvbV9wYWQgLSAxOworCXU4IGNudDsKKwlzMzIgcmFuZG9tX251bV9jYiwgcmFuZG9tX251bV9jcjsKKwl1MzIgYmxvY2tfaWQ7CisJdTggZG9fY2IgPSAxLCBkb19jciA9IDE7CisJczMyIGdyYWluX2NlbnRlciA9IDEyOCA8PCAocGFyYW1zLT5iaXRfZGVwdGggLSA4KTsKKwlzMzIgZ3JhaW5fbWluID0gMCAtIGdyYWluX2NlbnRlcjsKKwlzMzIgZ3JhaW5fbWF4ID0gKDI1NiA8PCAocGFyYW1zLT5iaXRfZGVwdGggLSA4KSkgLSAxIC0gZ3JhaW5fY2VudGVyOworCXMzMiBwcmVkWzMwXTsKKwl1OCBzdWJzYW1wID0gY2hyb21hX3N1YnNhbXBfeSArIGNocm9tYV9zdWJzYW1wX3g7CisJdTggc3Vic2FtcF92YWwgPSAoMSA8PCAoY2hyb21hX3N1YnNhbXBfeSArIGNocm9tYV9zdWJzYW1wX3gpKSA+PiAxOworCisJdGFibGVfcHRyICs9IGNiX2dyYWluX2Jsb2NrX29mZnQ7CisKKwlpZiAocGFyYW1zLT5udW1feV9wb2ludHMgPiAwKQorCQkrK251bV9wb3NfY2hyb21hOworCisJZm9yIChwb3MgPSAwOyBwb3MgPCBudW1fcG9zX2Nocm9tYTsgcG9zKyspCisJCXByZWRbcG9zXSA9IHByZWRfcG9zX2Nocm9tYVtwb3NdWzBdICsgcHJlZF9wb3NfY2hyb21hW3Bvc11bMV07CisKKwlpZiAoIXBhcmFtcy0+bnVtX2NiX3BvaW50cyAmJiAhcGFyYW1zLT5jaHJvbWFfc2NhbGluZ19mcm9tX2x1bWEpIHsKKwkJbWVtc2V0KGNiX2dyYWluX2Jsb2NrLCAwLCBzaXplb2YoKmNiX2dyYWluX2Jsb2NrKSAqIGNocm9tYV9ncmFpbl9zYW1wbGVzKTsKKwkJZG9fY2IgPSAwOworCX0gZWxzZSB7CisJCWluaXRfcmFuZG9tX2dlbmVyYXRvcigKKwkJCSZwYXJhbXMtPnJhbmRvbV9yZWdpc3Rlcl9jYiwKKwkJCXBhcmFtcy0+cmFuZG9tX3NlZWQsIDcgPDwgNSk7CisJfQorCWlmICghcGFyYW1zLT5udW1fY3JfcG9pbnRzICYmICFwYXJhbXMtPmNocm9tYV9zY2FsaW5nX2Zyb21fbHVtYSkgeworCQltZW1zZXQoY3JfZ3JhaW5fYmxvY2ssIDAsIHNpemVvZigqY3JfZ3JhaW5fYmxvY2spICogY2hyb21hX2dyYWluX3NhbXBsZXMpOworCQlkb19jciA9IDA7CisJfSBlbHNlIHsKKwkJaW5pdF9yYW5kb21fZ2VuZXJhdG9yKAorCQkJJnBhcmFtcy0+cmFuZG9tX3JlZ2lzdGVyX2NyLAorCQkJcGFyYW1zLT5yYW5kb21fc2VlZCwgMTEgPDwgNSk7CisKKwl9CisKKwlibG9ja19pZCA9IDA7CisJZm9yIChpID0gMDsgaSA8IGNocm9tYV9ibG9ja19zaXplX3k7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgY2hyb21hX2Jsb2NrX3NpemVfeDsgaisrKSB7CisJCQlpZiAoZG9fY2IpIHsKKwkJCQlyYW5kb21fbnVtX2NiID0gZ2V0X3JhbmRvbV9udW1iZXIoCisJCQkJCSZwYXJhbXMtPnJhbmRvbV9yZWdpc3Rlcl9jYiwgZ2F1c3NfYml0cyk7CisJCQkJY2JfZ3JhaW5fdmFsID0KKwkJCQkJKGdhdXNzaWFuX3NlcVtyYW5kb21fbnVtX2NiXSArIGdhdXNzX3NlY192YWwpCisJCQkJCT4+IGdhdXNzX3NlY19zaGlmdDsKKwkJCQljYl9ncmFpbl9ibG9ja1tibG9ja19pZF0gPSBjYl9ncmFpbl92YWw7CisJCQl9CisJCQlpZiAoZG9fY3IpIHsKKwkJCQlyYW5kb21fbnVtX2NyID0gZ2V0X3JhbmRvbV9udW1iZXIoCisJCQkJCSZwYXJhbXMtPnJhbmRvbV9yZWdpc3Rlcl9jciwgZ2F1c3NfYml0cyk7CisJCQkJY3JfZ3JhaW5fdmFsID0KKwkJCQkJKGdhdXNzaWFuX3NlcVtyYW5kb21fbnVtX2NyXSArIGdhdXNzX3NlY192YWwpCisJCQkJCT4+IGdhdXNzX3NlY19zaGlmdDsKKwkJCQljcl9ncmFpbl9ibG9ja1tibG9ja19pZF0gPSBjcl9ncmFpbl92YWw7CisJCQl9CisJCQlpZiAoaSA+PSB5X3BhZF9zdGFydCAmJiBpIDw9IHlfcGFkX2VuZCAmJgorCQkJICAgIGogPj0geF9wYWRfc3RhcnQgJiYgaiA8PSB4X3BhZF9lbmQpIHsKKwkJCQlzMzIgd3N1bV9jYiA9IDA7CisJCQkJczMyIHdzdW1fY3IgPSAwOworCisJCQkJZm9yIChwb3MgPSAwOyBwb3MgPCBudW1fcG9zX2Nocm9tYTsgcG9zKyspIHsKKwkJCQkJaWYgKHByZWRfcG9zX2Nocm9tYVtwb3NdWzJdID09IDApIHsKKwkJCQkJCXdzdW1fY2IgKz0gcGFyYW1zLT5hcl9jb2VmZnNfY2JbcG9zXSAqCisJCQkJCQkJY2JfZ3JhaW5fYmxvY2tbYmxvY2tfaWQgKyBwcmVkW3Bvc11dOworCQkJCQkJd3N1bV9jciArPSBwYXJhbXMtPmFyX2NvZWZmc19jcltwb3NdICoKKwkJCQkJCQljcl9ncmFpbl9ibG9ja1tibG9ja19pZCArIHByZWRbcG9zXV07CisJCQkJCX0gZWxzZSBpZiAocHJlZF9wb3NfY2hyb21hW3Bvc11bMl0gPT0gMSkgeworCQkJCQkJczMyIGF2X2x1bWEgPSAwOworCQkJCQkJczMyIGx1bWFfY29vcmRfeSA9ICgoaSAtIHRvcF9wYWQpIDw8IGNocm9tYV9zdWJzYW1wX3kpICsgdG9wX3BhZDsKKwkJCQkJCXMzMiBsdW1hX2Nvb3JkX3ggPSAoKGogLSBsZWZ0X3BhZCkgPDwgY2hyb21hX3N1YnNhbXBfeCkgKyBsZWZ0X3BhZDsKKworCQkJCQkJZm9yIChrID0gbHVtYV9jb29yZF95OworCQkJCQkJCWsgPCBsdW1hX2Nvb3JkX3kgKyBjaHJvbWFfc3Vic2FtcF95ICsgMTsgaysrKQorCQkJCQkJCWZvciAobCA9IGx1bWFfY29vcmRfeDsKKwkJCQkJCQkJbCA8IGx1bWFfY29vcmRfeCArIGNocm9tYV9zdWJzYW1wX3ggKyAxOyBsKyspIHsKKwkJCQkJCQkJYXZfbHVtYSArPSBsdW1hX2dyYWluX2Jsb2NrW2sgKiBsdW1hX2dyYWluX3N0cmlkZSArIGxdOworCQkJCQkJCX0KKwkJCQkJCWF2X2x1bWEgPSAoYXZfbHVtYSArIHN1YnNhbXBfdmFsKSA+PiBzdWJzYW1wOworCQkJCQkJd3N1bV9jYiArPSBwYXJhbXMtPmFyX2NvZWZmc19jYltwb3NdICogYXZfbHVtYTsKKwkJCQkJCXdzdW1fY3IgKz0gcGFyYW1zLT5hcl9jb2VmZnNfY3JbcG9zXSAqIGF2X2x1bWE7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcl9pbmZvKAorCQkJCQkJCSJHcmFpbiBzeW50aGVzaXM6IHByZWRpY3Rpb24gYmV0d2VlbiB0d28gY2hyb21hIGNvbXBvbmVudHMgaXMgIgorCQkJCQkJCSJub3Qgc3VwcG9ydGVkISIpOworCQkJCQkJcmV0dXJuIC0xOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChkb19jYikgeworCQkJCQl3c3VtX2NiICs9IHJvdW5kaW5nX29mZnNldDsKKwkJCQkJd3N1bV9jYiA9IHdzdW1fY2IgPj4gcGFyYW1zLT5hcl9jb2VmZl9zaGlmdDsKKwkJCQkJY2JfZ3JhaW5fdmFsID0KKwkJCQkJCU1JRChjYl9ncmFpbl92YWwgKyB3c3VtX2NiLCBncmFpbl9taW4sIGdyYWluX21heCk7CisJCQkJCWNiX2dyYWluX2Jsb2NrW2Jsb2NrX2lkXSA9IGNiX2dyYWluX3ZhbDsKKwkJCQl9CisJCQkJaWYgKGRvX2NyKSB7CisJCQkJCXdzdW1fY3IgKz0gcm91bmRpbmdfb2Zmc2V0OworCQkJCQl3c3VtX2NyID0gd3N1bV9jciA+PiBwYXJhbXMtPmFyX2NvZWZmX3NoaWZ0OworCQkJCQljcl9ncmFpbl92YWwgPQorCQkJCQkJTUlEKGNyX2dyYWluX3ZhbCArIHdzdW1fY3IsIGdyYWluX21pbiwgZ3JhaW5fbWF4KTsKKwkJCQkJY3JfZ3JhaW5fYmxvY2tbYmxvY2tfaWRdID0gY3JfZ3JhaW5fdmFsOworCQkJCX0KKwkJCQlpZiAoaSA+PSB5X3N0YXJ0ICYmIGkgPD0geV9lbmQgJiYgaiA+PSB4X3N0YXJ0ICYmIGogPD0geF9lbmQpIHsKKwkJCQkJY2JfYmxvY2tbY250XSA9IGNiX2dyYWluX3ZhbCAmIGJpdF9tYXNrOworCQkJCQljcl9ibG9ja1tjbnQrK10gPSBjcl9ncmFpbl92YWwgJiBiaXRfbWFzazsKKwkJCQkJaWYgKGNudCA9PSAyKSB7CisJCQkJCQl0YWJsZV9wdHJbMF0gPQljYl9ibG9ja1swXSAmIDB4ZmY7CisJCQkJCQl0YWJsZV9wdHJbMV0gPQkoY3JfYmxvY2tbMF0gJiAweDNmKSA8PCAyOworCQkJCQkJdGFibGVfcHRyWzFdIHw9IChjYl9ibG9ja1swXSA+PiA4KSAmIDM7CisJCQkJCQl0YWJsZV9wdHJbMl0gPQkoY2JfYmxvY2tbMV0gJiAweGYpIDw8IDQ7CisJCQkJCQl0YWJsZV9wdHJbMl0gfD0gKGNyX2Jsb2NrWzBdID4+IDYpICYgMHhmOworCQkJCQkJdGFibGVfcHRyWzNdID0JKGNyX2Jsb2NrWzFdICYgMykgPDwgNjsKKwkJCQkJCXRhYmxlX3B0clszXSB8PSAoY2JfYmxvY2tbMV0gPj4gNCkgJiAweDNmOworCQkJCQkJdGFibGVfcHRyWzRdID0JKGNyX2Jsb2NrWzFdID4+IDIpICYgMHhmZjsKKwkJCQkJCXRhYmxlX3B0ciArPSA1OworCQkJCQkJY250ID0gMDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJsb2NrX2lkKys7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfc2NhbGluZ19mdW5jdGlvbigKKwlzMzIgc2NhbGluZ19wb2ludHNbXVsyXSwgdTggbnVtX3BvaW50cywgczMyIHNjYWxpbmdfZGVsdGFbXSkKK3sKKwlzNjQgZGVsdGE7CisJczMyIGRlbHRhX3ksIGRlbHRhX3gsIHBvaW50OworCisJaWYgKG51bV9wb2ludHMgPT0gMCkgcmV0dXJuOworCisJZm9yIChwb2ludCA9IDA7IHBvaW50IDwgbnVtX3BvaW50cyAtIDE7IHBvaW50KyspIHsKKwkJZGVsdGFfeSA9IHNjYWxpbmdfcG9pbnRzW3BvaW50ICsgMV1bMV0gLSBzY2FsaW5nX3BvaW50c1twb2ludF1bMV07CisJCWRlbHRhX3ggPSBzY2FsaW5nX3BvaW50c1twb2ludCArIDFdWzBdIC0gc2NhbGluZ19wb2ludHNbcG9pbnRdWzBdOworCisJCWRlbHRhID0gZGVsdGFfeSAqICgoNjU1MzYgKyAoZGVsdGFfeCA+PiAxKSkgLyBkZWx0YV94KTsKKwkJc2NhbGluZ19kZWx0YVtwb2ludF09ZGVsdGE7CisJfQorfQorCit2b2lkIGNvbnZlcnRfdG9fZmdfdGFibGUoc3RydWN0IGFvbV9maWxtX2dyYWluX3QgKnBhcmFtcywgdTggKnRhYmxlX3B0cikKK3sKKwlzMzIgaSwgajsKKwl1MzIgdG90YWwgPSAwOworCisJaWYgKHBhcmFtcy0+bnVtX3lfcG9pbnRzID4gMCB8fAorCSAgICBwYXJhbXMtPm51bV9jYl9wb2ludHMgPiAwIHx8CisJICAgIHBhcmFtcy0+bnVtX2NyX3BvaW50cyA+IDApIHsKKwkJdGFibGVfcHRyWzBdID0KKwkJCSgocGFyYW1zLT5hcHBseV9ncmFpbiAmIDB4MSkgPDwgMCkgfCAJLy8xYml0IFswXQorCQkJKChwYXJhbXMtPm92ZXJsYXBfZmxhZyAmIDB4MSkgPDwgMSkgfCAJLy8xYml0IFsxXQorCQkJKChwYXJhbXMtPmNocm9tYV9zY2FsaW5nX2Zyb21fbHVtYSAmIDB4MSkgPDwgMikgfCAJLy8xYml0IFsyXQorCQkJKChwYXJhbXMtPmNsaXBfdG9fcmVzdHJpY3RlZF9yYW5nZSAmIDB4MSkgPDwgMykgfCAJLy8xYml0IFszXQorCQkJKChwYXJhbXMtPm1jX2lkZW50aXR5ICYgMHgxKSA8PCA0KTsJCS8vMWJpdCBbNF0KKwkJdGFibGVfcHRyWzFdID0gKHBhcmFtcy0+cmFuZG9tX3NlZWQgPj4gMCkgJiAweGZmOyAvL3JhbmRvbV9zZWVkOiAxNmJpdHMKKwkJdGFibGVfcHRyWzJdID0gKHBhcmFtcy0+cmFuZG9tX3NlZWQgPj4gOCkgJiAweGZmOworCQl0YWJsZV9wdHJbM10gPQorCQkJKChwYXJhbXMtPm51bV95X3BvaW50cyAmIDB4ZikgPDwgMCkgfAkvLzRiaXQJMC4uLjE0CisJCQkoKHBhcmFtcy0+bnVtX2NiX3BvaW50cyAmIDB4ZikgPDwgNCk7CS8vNGJpdAkwLi4uMTAKKwkJdGFibGVfcHRyWzRdID0KKwkJCSgocGFyYW1zLT5udW1fY3JfcG9pbnRzICYgMHhmKSA8PCAwKSB8CS8vNGJpdAkwLi4uMTAKKwkJCSgocGFyYW1zLT5zY2FsaW5nX3NoaWZ0ICYgMHhmKSA8PCA0KTsJLy80Yml0OiA4Li4uMTEKKwkJdGFibGVfcHRyWzVdID0gIHBhcmFtcy0+Y2JfbHVtYV9tdWx0OwkJCQkvLzhiaXQKKwkJdGFibGVfcHRyWzZdID0gIHBhcmFtcy0+Y2JfbXVsdDsgCQkJCQkvLzhiaXQKKwkJdGFibGVfcHRyWzddID0gKChwYXJhbXMtPmNiX29mZnNldCA+PiAwKSAmIDB4ZmYpOyAvL2NiX29mZnNldDo5Yml0CisJCXRhYmxlX3B0cls4XSA9ICgocGFyYW1zLT5jYl9vZmZzZXQgPj4gOCkgJiAweDEpOworCQl0YWJsZV9wdHJbOV0gPSAgcGFyYW1zLT5jcl9sdW1hX211bHQ7IC8vOGJpdAorCQl0YWJsZV9wdHJbMTBdID0gIHBhcmFtcy0+Y3JfbXVsdDsgLy84Yml0CisJCXRhYmxlX3B0clsxMV0gPSAoKHBhcmFtcy0+Y3Jfb2Zmc2V0ID4+IDApICYgMHhmZik7IC8vY3Jfb2Zmc2V0OjliaXQKKwkJdGFibGVfcHRyWzEyXSA9ICgocGFyYW1zLT5jcl9vZmZzZXQgPj4gOCkgJiAweDEpOworCQl0YWJsZV9wdHJbMTNdID0gMDsKKwkJdGFibGVfcHRyWzE0XSA9IDA7CisJCXRhYmxlX3B0clsxNV0gPSAwOworCX0gZWxzZSB7CisJCW1lbXNldCh0YWJsZV9wdHIsIDAsIDE2ICogc2l6ZW9mKGNoYXIpKTsKKwl9CisJdG90YWwgPSAxOworCXRhYmxlX3B0ciArPSAxNjsKKwkvL3lfc2NhbGUgKDd4MTI4Yml0KQorCWlmIChwYXJhbXMtPm51bV95X3BvaW50cyA+IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IDE0OyBpICs9IDIpIHsKKwkJCWogPSBpICsgMTsKKwkJCXRhYmxlX3B0clswXSA9IHBhcmFtcy0+c2NhbGluZ19wb2ludHNfeVtpXVswXTsgLy94CisJCQl0YWJsZV9wdHJbMV0gPSBwYXJhbXMtPnNjYWxpbmdfcG9pbnRzX3lbaV1bMV07IC8veQorCQkJLy9kZWx0YSwgaXQgYmUgc2lnbmVkLCBzbyAyNWJpdAorCQkJdGFibGVfcHRyWzJdID0gKHBhcmFtcy0+c2NhbGluZ19kZWx0YV95W2ldID4+IDApICYgMHhmZjsKKwkJCXRhYmxlX3B0clszXSA9IChwYXJhbXMtPnNjYWxpbmdfZGVsdGFfeVtpXSA+PiA4KSAmIDB4ZmY7CisJCQl0YWJsZV9wdHJbNF0gPSAocGFyYW1zLT5zY2FsaW5nX2RlbHRhX3lbaV0gPj4gMTYpICYgMHhmZjsKKwkJCXRhYmxlX3B0cls1XSA9IChwYXJhbXMtPnNjYWxpbmdfZGVsdGFfeVtpXSA+PiAyNCkgJiAweGZmOworCQkJdGFibGVfcHRyWzZdID0gcGFyYW1zLT5zY2FsaW5nX3BvaW50c195W2pdWzBdOworCQkJdGFibGVfcHRyWzddID0gcGFyYW1zLT5zY2FsaW5nX3BvaW50c195W2pdWzFdOworCQkJdGFibGVfcHRyWzhdID0KKwkJCQkoaiA9PSAxMykgPyAwIDogKChwYXJhbXMtPnNjYWxpbmdfZGVsdGFfeVtqXSA+PiAwKSAmIDB4ZmYpOworCQkJdGFibGVfcHRyWzldID0KKwkJCQkoaiA9PSAxMykgPyAwIDogKChwYXJhbXMtPnNjYWxpbmdfZGVsdGFfeVtqXSA+PiA4KSAmIDB4ZmYpOworCQkJdGFibGVfcHRyWzEwXSA9CisJCQkJKGogPT0gMTMpID8gMCA6ICgocGFyYW1zLT5zY2FsaW5nX2RlbHRhX3lbal0gPj4gMTYpICYgMHhmZik7CisJCQl0YWJsZV9wdHJbMTFdID0KKwkJCQkoaiA9PSAxMykgPyAwIDogKChwYXJhbXMtPnNjYWxpbmdfZGVsdGFfeVtqXSA+PiAyNCkgJiAweGZmKTsKKwkJCXRhYmxlX3B0clsxMl0gPSAwOworCQkJdGFibGVfcHRyWzEzXSA9IDA7CisJCQl0YWJsZV9wdHJbMTRdID0gMDsKKwkJCXRhYmxlX3B0clsxNV0gPSAwOworCQkJdGFibGVfcHRyICs9IDE2OworCQl9CisJfSBlbHNlIHsKKwkJbWVtc2V0KHRhYmxlX3B0ciwgMCwgMTYgKiA3ICogc2l6ZW9mKGNoYXIpKTsKKwkJdGFibGVfcHRyICs9IDE2ICogNzsKKwl9CisJdG90YWwgKz0gNzsKKwlpZiAocGFyYW1zLT5udW1fY2JfcG9pbnRzID4gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkgKz0gMikgeworCQkJaiA9IGkgKyAxOworCQkJdGFibGVfcHRyWzBdID0gcGFyYW1zLT5zY2FsaW5nX3BvaW50c19jYltpXVswXTsKKwkJCXRhYmxlX3B0clsxXSA9IHBhcmFtcy0+c2NhbGluZ19wb2ludHNfY2JbaV1bMV07CisJCQkvL2RlbHRhLCBpdCBiZSBzaWduZWQsIHNvIDI1Yml0CisJCQl0YWJsZV9wdHJbMl0gPSAocGFyYW1zLT5zY2FsaW5nX2RlbHRhX2NiW2ldID4+IDApICYgMHhmZjsKKwkJCXRhYmxlX3B0clszXSA9IChwYXJhbXMtPnNjYWxpbmdfZGVsdGFfY2JbaV0gPj4gOCkgJiAweGZmOworCQkJdGFibGVfcHRyWzRdID0gKHBhcmFtcy0+c2NhbGluZ19kZWx0YV9jYltpXSA+PiAxNikgJiAweGZmOworCQkJdGFibGVfcHRyWzVdID0gKHBhcmFtcy0+c2NhbGluZ19kZWx0YV9jYltpXSA+PiAyNCkgJiAweGZmOworCQkJdGFibGVfcHRyWzZdID0gcGFyYW1zLT5zY2FsaW5nX3BvaW50c19jYltqXVswXTsKKwkJCXRhYmxlX3B0cls3XSA9IHBhcmFtcy0+c2NhbGluZ19wb2ludHNfY2Jbal1bMV07CisJCQl0YWJsZV9wdHJbOF0gPQorCQkJCShqID09IDkpID8gMCA6ICgocGFyYW1zLT5zY2FsaW5nX2RlbHRhX2NiW2pdID4+IDApICYgMHhmZik7CisJCQl0YWJsZV9wdHJbOV0gPQorCQkJCShqID09IDkpID8gMCA6ICgocGFyYW1zLT5zY2FsaW5nX2RlbHRhX2NiW2pdID4+IDgpICYgMHhmZik7CisJCQl0YWJsZV9wdHJbMTBdID0KKwkJCQkoaiA9PSA5KSA/IDAgOiAoKHBhcmFtcy0+c2NhbGluZ19kZWx0YV9jYltqXSA+PiAxNikgJiAweGZmKTsKKwkJCXRhYmxlX3B0clsxMV0gPQorCQkJCShqID09IDkpID8gMCA6ICgocGFyYW1zLT5zY2FsaW5nX2RlbHRhX2NiW2pdID4+IDI0KSAmIDB4ZmYpOworCQkJdGFibGVfcHRyWzEyXSA9IDA7CisJCQl0YWJsZV9wdHJbMTNdID0gMDsKKwkJCXRhYmxlX3B0clsxNF0gPSAwOworCQkJdGFibGVfcHRyWzE1XSA9IDA7CisJCQl0YWJsZV9wdHIgKz0gMTY7CisJCX0KKwl9IGVsc2UgeworCQltZW1zZXQodGFibGVfcHRyLCAwLCAxNiAqIDUgKiBzaXplb2YoY2hhcikpOworCQl0YWJsZV9wdHIgKz0gMTYgKiA1OworCX0KKwl0b3RhbCArPSA1OworCWlmIChwYXJhbXMtPm51bV9jcl9wb2ludHMgPiAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCAxMDsgaSArPSAyKSB7CisJCQlqID0gaSArIDE7CisJCQl0YWJsZV9wdHJbMF0gPSBwYXJhbXMtPnNjYWxpbmdfcG9pbnRzX2NyW2ldWzBdOworCQkJdGFibGVfcHRyWzFdID0gcGFyYW1zLT5zY2FsaW5nX3BvaW50c19jcltpXVsxXTsKKwkJCS8vZGVsdGEsIGl0IGJlIHNpZ25lZCwgc28gMjViaXQKKwkJCXRhYmxlX3B0clsyXSA9IChwYXJhbXMtPnNjYWxpbmdfZGVsdGFfY3JbaV0gPj4gMCkgJiAweGZmOworCQkJdGFibGVfcHRyWzNdID0gKHBhcmFtcy0+c2NhbGluZ19kZWx0YV9jcltpXSA+PiA4KSAmIDB4ZmY7CisJCQl0YWJsZV9wdHJbNF0gPSAocGFyYW1zLT5zY2FsaW5nX2RlbHRhX2NyW2ldID4+IDE2KSAmIDB4ZmY7CisJCQl0YWJsZV9wdHJbNV0gPSAocGFyYW1zLT5zY2FsaW5nX2RlbHRhX2NyW2ldID4+IDI0KSAmIDB4ZmY7CisJCQl0YWJsZV9wdHJbNl0gPSBwYXJhbXMtPnNjYWxpbmdfcG9pbnRzX2NyW2pdWzBdOworCQkJdGFibGVfcHRyWzddID0gcGFyYW1zLT5zY2FsaW5nX3BvaW50c19jcltqXVsxXTsKKwkJCXRhYmxlX3B0cls4XSA9CisJCQkJKGogPT0gOSkgPyAwIDogKChwYXJhbXMtPnNjYWxpbmdfZGVsdGFfY3Jbal0gPj4gMCkgJiAweGZmKTsKKwkJCXRhYmxlX3B0cls5XSA9CisJCQkJKGogPT0gOSkgPyAwIDogKChwYXJhbXMtPnNjYWxpbmdfZGVsdGFfY3Jbal0gPj4gOCkgJiAweGZmKTsKKwkJCXRhYmxlX3B0clsxMF0gPQorCQkJCShqID09IDkpID8gMCA6ICgocGFyYW1zLT5zY2FsaW5nX2RlbHRhX2NyW2pdID4+IDE2KSAmIDB4ZmYpOworCQkJdGFibGVfcHRyWzExXSA9CisJCQkJKGogPT0gOSkgPyAwIDogKChwYXJhbXMtPnNjYWxpbmdfZGVsdGFfY3Jbal0gPj4gMjQpICYgMHhmZik7CisJCQl0YWJsZV9wdHJbMTJdID0gMDsKKwkJCXRhYmxlX3B0clsxM10gPSAwOworCQkJdGFibGVfcHRyWzE0XSA9IDA7CisJCQl0YWJsZV9wdHJbMTVdID0gMDsKKwkJCXRhYmxlX3B0ciArPSAxNjsKKwkJfQorCX0gZWxzZSB7CisJCW1lbXNldCh0YWJsZV9wdHIsIDAsIDE2ICogNSAqIHNpemVvZihjaGFyKSk7CisJCXRhYmxlX3B0ciArPSAxNiAqIDU7CisJfQorCS8vdG90YWwgKz0gNTsKKwkvL3RvdGFsICs9IDQ4MDsvLzMyMDsKK30KKwordm9pZCBhdjFfYWRkX2ZpbG1fZ3JhaW5fcnVuKGNoYXIgKmZnX3RhYmxlX2J1Ziwgc3RydWN0IGFvbV9maWxtX2dyYWluX3QgKnBhcmFtcykKK3sKKwlzMzIgKipwcmVkX3Bvc19sdW1hOworCXMzMiAqKnByZWRfcG9zX2Nocm9tYTsKKwlzMzIgKmx1bWFfZ3JhaW5fYmxvY2s7CisJczMyICpjYl9ncmFpbl9ibG9jazsKKwlzMzIgKmNyX2dyYWluX2Jsb2NrOworCXMzMiBsdW1hX2Jsb2NrX3NpemVfeSwgbHVtYV9ibG9ja19zaXplX3g7CisJczMyIGNocm9tYV9ibG9ja19zaXplX3ksIGNocm9tYV9ibG9ja19zaXplX3g7CisJczMyIGNocm9tYV9zdWJibG9ja19zaXplX3ksIGNocm9tYV9zdWJibG9ja19zaXplX3g7CisJczMyIGNocm9tYV9zdWJzYW1wX3ggPSAxOworCXMzMiBjaHJvbWFfc3Vic2FtcF95ID0gMTsKKworCXVsb25nIHN0YXJ0X3RpbWUsIHN0ZXBfdGltZTsKKwl1MzIgdGltZTEsIHRpbWUyLCB0aW1lMywgdGltZTQsIHRpbWU1LCB0aW1lNjsKKworCWlmIChkZWJ1Z19mZ3MgJiBERUJVR19GR1NfQ09OU1VNRV9USU1FKQorCQlzdGFydF90aW1lID0gc3RlcF90aW1lID0gbG9jYWxfY2xvY2soKTsKKworCWNocm9tYV9zdWJibG9ja19zaXplX3kgPSBsdW1hX3N1YmJsb2NrX3NpemVfeSA+PiBjaHJvbWFfc3Vic2FtcF95OworCWNocm9tYV9zdWJibG9ja19zaXplX3ggPSBsdW1hX3N1YmJsb2NrX3NpemVfeCA+PiBjaHJvbWFfc3Vic2FtcF94OworCisJLy8gSW5pdGlhbCBwYWRkaW5nIGlzIG9ubHkgbmVlZGVkIGZvciBnZW5lcmF0aW9uIG9mCisJLy8gZmlsbSBncmFpbiB0ZW1wbGF0ZXMgKHRvIHN0YWJpbGl6ZSB0aGUgQVIgcHJvY2VzcykKKwkvLyBPbmx5IGEgNjR4NjQgbHVtYSBhbmQgMzJ4MzIgY2hyb21hIHBhcnQgb2YgYSB0ZW1wbGF0ZQorCS8vIGlzIHVzZWQgbGF0ZXIgZm9yIGFkZGluZyBncmFpbiwgcGFkZGluZyBjYW4gYmUgZGlzY2FyZGVkCisKKwlsdW1hX2Jsb2NrX3NpemVfeSA9IHRvcF9wYWQgKyAyICogYXJfcGFkZGluZyArCisJCWx1bWFfc3ViYmxvY2tfc2l6ZV95ICogMiArIGJvdHRvbV9wYWQ7CisJbHVtYV9ibG9ja19zaXplX3ggPSBsZWZ0X3BhZCArIDIgKiBhcl9wYWRkaW5nICsKKwkJbHVtYV9zdWJibG9ja19zaXplX3ggKiAyICsgMiAqIGFyX3BhZGRpbmcgKyByaWdodF9wYWQ7CisKKwljaHJvbWFfYmxvY2tfc2l6ZV95ID0gdG9wX3BhZCArICgyID4+IGNocm9tYV9zdWJzYW1wX3kpICogYXJfcGFkZGluZyArCisJCWNocm9tYV9zdWJibG9ja19zaXplX3kgKiAyICsgYm90dG9tX3BhZDsKKwljaHJvbWFfYmxvY2tfc2l6ZV94ID0gbGVmdF9wYWQgKyAoMiA+PiBjaHJvbWFfc3Vic2FtcF94KSAqIGFyX3BhZGRpbmcgKworCQljaHJvbWFfc3ViYmxvY2tfc2l6ZV94ICogMiArCisJCSgyID4+IGNocm9tYV9zdWJzYW1wX3gpICogYXJfcGFkZGluZyArIHJpZ2h0X3BhZDsKKworCWluaXRfYXJyYXlzKHBhcmFtcywgJnByZWRfcG9zX2x1bWEsCisJCSZwcmVkX3Bvc19jaHJvbWEsICZsdW1hX2dyYWluX2Jsb2NrLAorCQkmY2JfZ3JhaW5fYmxvY2ssICZjcl9ncmFpbl9ibG9jaywKKwkJbHVtYV9ibG9ja19zaXplX3kgKiBsdW1hX2Jsb2NrX3NpemVfeCwKKwkJbHVtYV9ibG9ja19zaXplX3gsCisJCWNocm9tYV9ibG9ja19zaXplX3kgKiBjaHJvbWFfYmxvY2tfc2l6ZV94LAorCQljaHJvbWFfYmxvY2tfc2l6ZV94KTsKKworCWlmIChkZWJ1Z19mZ3MgJiBERUJVR19GR1NfQ09OU1VNRV9USU1FKSB7CisJCXRpbWUxID0gZGl2NjRfdTY0KGxvY2FsX2Nsb2NrKCkgLSBzdGVwX3RpbWUsIDEwMDApOworCQlzdGVwX3RpbWUgPSBsb2NhbF9jbG9jaygpOworCX0KKworCWdlbmVyYXRlX2x1bWFfZ3JhaW5fYmxvY2socGFyYW1zLAorCQlwcmVkX3Bvc19sdW1hLCBsdW1hX2dyYWluX2Jsb2NrLAorCQlsdW1hX2Jsb2NrX3NpemVfeSwgbHVtYV9ibG9ja19zaXplX3gsCisJCWx1bWFfYmxvY2tfc2l6ZV94LCBmZ190YWJsZV9idWYpOworCisJaWYgKGRlYnVnX2ZncyAmIERFQlVHX0ZHU19DT05TVU1FX1RJTUUpIHsKKwkJdGltZTIgPSBkaXY2NF91NjQobG9jYWxfY2xvY2soKSAtIHN0ZXBfdGltZSwgMTAwMCk7CisJCXN0ZXBfdGltZSA9IGxvY2FsX2Nsb2NrKCk7CisJfQorCisJZ2VuZXJhdGVfY2hyb21hX2dyYWluX2Jsb2NrcyhwYXJhbXMsCisJCXByZWRfcG9zX2Nocm9tYSwgbHVtYV9ncmFpbl9ibG9jaywKKwkJY2JfZ3JhaW5fYmxvY2ssIGNyX2dyYWluX2Jsb2NrLAorCQlsdW1hX2Jsb2NrX3NpemVfeCwKKwkJY2hyb21hX2Jsb2NrX3NpemVfeSwgY2hyb21hX2Jsb2NrX3NpemVfeCwKKwkJY2hyb21hX2Jsb2NrX3NpemVfeCwKKwkJY2hyb21hX3N1YnNhbXBfeSwgY2hyb21hX3N1YnNhbXBfeCwKKwkJZmdfdGFibGVfYnVmKTsKKworCWlmIChkZWJ1Z19mZ3MgJiBERUJVR19GR1NfQ09OU1VNRV9USU1FKSB7CisJCXRpbWUzID0gZGl2NjRfdTY0KGxvY2FsX2Nsb2NrKCkgLSBzdGVwX3RpbWUsIDEwMDApOworCQlzdGVwX3RpbWUgPSBsb2NhbF9jbG9jaygpOworCX0KKworCWluaXRfc2NhbGluZ19mdW5jdGlvbigKKwkJcGFyYW1zLT5zY2FsaW5nX3BvaW50c195LAorCQlwYXJhbXMtPm51bV95X3BvaW50cywKKwkJcGFyYW1zLT5zY2FsaW5nX2RlbHRhX3kpOworCisJaWYgKCFwYXJhbXMtPmNocm9tYV9zY2FsaW5nX2Zyb21fbHVtYSkgeworCQlpbml0X3NjYWxpbmdfZnVuY3Rpb24oCisJCQlwYXJhbXMtPnNjYWxpbmdfcG9pbnRzX2NiLAorCQkJcGFyYW1zLT5udW1fY2JfcG9pbnRzLAorCQkJcGFyYW1zLT5zY2FsaW5nX2RlbHRhX2NiKTsKKwkJaW5pdF9zY2FsaW5nX2Z1bmN0aW9uKAorCQkJcGFyYW1zLT5zY2FsaW5nX3BvaW50c19jciwKKwkJCXBhcmFtcy0+bnVtX2NyX3BvaW50cywKKwkJCXBhcmFtcy0+c2NhbGluZ19kZWx0YV9jcik7CisJfQorCisJaWYgKGRlYnVnX2ZncyAmIERFQlVHX0ZHU19DT05TVU1FX1RJTUUpIHsKKwkJdGltZTQgPSBkaXY2NF91NjQobG9jYWxfY2xvY2soKSAtIHN0ZXBfdGltZSwgMTAwMCk7CisJCXN0ZXBfdGltZSA9IGxvY2FsX2Nsb2NrKCk7CisJfQorCisJY29udmVydF90b19mZ190YWJsZShwYXJhbXMsIGZnX3RhYmxlX2J1Zik7CisKKwlpZiAoZGVidWdfZmdzICYgREVCVUdfRkdTX0NPTlNVTUVfVElNRSkgeworCQl0aW1lNSA9IGRpdjY0X3U2NChsb2NhbF9jbG9jaygpIC0gc3RlcF90aW1lLCAxMDAwKTsKKwkJc3RlcF90aW1lID0gbG9jYWxfY2xvY2soKTsKKwl9CisKKwlkZWFsbG9jX2FycmF5cyhwYXJhbXMsCisJCSZwcmVkX3Bvc19sdW1hLCAmcHJlZF9wb3NfY2hyb21hLAorCQkmbHVtYV9ncmFpbl9ibG9jaywKKwkJJmNiX2dyYWluX2Jsb2NrLCAmY3JfZ3JhaW5fYmxvY2spOworCisJaWYgKGRlYnVnX2ZncyAmIERFQlVHX0ZHU19DT05TVU1FX1RJTUUpIHsKKwkJdGltZTYgPSBkaXY2NF91NjQobG9jYWxfY2xvY2soKSAtIHN0ZXBfdGltZSwgMTAwMCk7CisJCXByX2luZm8oImZncyBjb25zdW1lIHRpbWUgJWQgKCVkLCAlZCwgJWQsICVkLCAlZCwgJWQpdXNcbiIsCisJCQlkaXY2NF91NjQobG9jYWxfY2xvY2soKSAtIHN0YXJ0X3RpbWUsIDEwMDApLCB0aW1lMSwgdGltZTIsIHRpbWUzLCB0aW1lNCwgdGltZTUsIHRpbWU2KTsKKwl9Cit9CisKKy8qIEZpbG0gR3JhaW4gRW50cnkgKi8KKyNpZiAwCitpbnQgcGljX2ZpbG1fZ3JhaW5fcnVuKGNoYXIgKmZnX3RhYmxlX2FkZHIsIHUzMiBmZ3NfY3RybCwgdTMyICpmZ3NfZGF0YSkKKyNlbmRpZgoraW50IHBpY19maWxtX2dyYWluX3J1bih1MzIgZnJhbWVfY291bnQsIGNoYXIgKmZnX3RhYmxlX2FkZHIsIHUzMiBmZ3NfY3RybCwgdTMyICpmZ3NfZGF0YSkKKworeworCXN0cnVjdCBhb21fZmlsbV9ncmFpbl90IGZnX3BhcmFtczsKKworCWlmIChkZWJ1Z19mZ3MgJiBERUJVR19GR1NfUkVHUykgeworCQlpbnQgaTsKKwkJcHJfaW5mbygiZmlsbSBncmFpbiBjdHJsOiAweCUwOHhcbiIsIGZnc19jdHJsKTsKKwkJZm9yIChpID0gMDsgaSA8IEZJTE1fR1JBSU5fUkVHX1NJWkU7IGkrKykgeworCQkJcHJfaW5mbygiZmlsbSBncmFpbiByZWdbJTAyZF06IDB4JTA4eFxuIiwgaSwgZmdzX2RhdGFbaV0pOworCQl9CisJfQorCisJZmlsbV9ncmFpbl9kYXRhX3BhcnNlKCZmZ19wYXJhbXMsIGZnc19jdHJsLCBmZ3NfZGF0YSk7CisKKwlpZiAoZGVidWdfZmdzICYgREVCVUdfRkdTX1JFR1NfUEFSU0UpIHsKKwkJZmdfaW5mb19wcmludCgmZmdfcGFyYW1zKTsKKwl9CisKKwlhdjFfYWRkX2ZpbG1fZ3JhaW5fcnVuKGZnX3RhYmxlX2FkZHIsICZmZ19wYXJhbXMpOworCisJaWYgKGRlYnVnX2ZncyAmIERFQlVHX0ZHU19UQUJMRV9EVU1QKSB7CisJCSNkZWZpbmUgRkdTX1RBQkxFX1NJWkUgICg1MTIgKiAxMjggLyA4KQorCQlzdHJ1Y3QgZmlsZSAqZmdfZnAgPSBOVUxMOworCQljaGFyIGZpbGVbMjU2XSA9IHswfTsKKworCQlzbnByaW50ZihmaWxlLCBzaXplb2YoZmlsZSksICIvZGF0YS90bXAvZmdzX3RhYmxlXyVkLmJpbiIsIGZyYW1lX2NvdW50IC0gMSk7CisJCWZnX2ZwID0gZmlscF9vcGVuKGZpbGUsIE9fQ1JFQVQgfCBPX1JEV1IgfCBPX1RSVU5DLCAwNjY2KTsKKwkJaWYgKElTX0VSUihmZ19mcCkpIHsKKwkJCWZnX2ZwID0gTlVMTDsKKwkJCXByaW50ayhLRVJOX0VSUiJvcGVuICVzIGZhaWxlZFxuIiwgZmlsZSk7CisJCX0gZWxzZSB7CisJCQlrZXJuZWxfd3JpdGUoZmdfZnAsIGZnX3RhYmxlX2FkZHIsIEZHU19UQUJMRV9TSVpFLCAmZmdfZnAtPmZfcG9zKTsKKwkJCWZpbHBfY2xvc2UoZmdfZnAsIGN1cnJlbnQtPmZpbGVzKTsKKwkJCWZnX2ZwID0gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wocGljX2ZpbG1fZ3JhaW5fcnVuKTsKKworaW50IGdldF9kZWJ1Z19mZ3Modm9pZCkKK3sKKwlyZXR1cm4gZGVidWdfZmdzOworfQorRVhQT1JUX1NZTUJPTChnZXRfZGVidWdfZmdzKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC92YXYxL2F2MV9nbG9iYWwuaCBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlcl92NGwvdmF2MS9hdjFfZ2xvYmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1M2ZmOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlcl92NGwvdmF2MS9hdjFfZ2xvYmFsLmgKQEAgLTAsMCArMSwyMzYwIEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorKiBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqCisqIERlc2NyaXB0aW9uOgorKi8KKyNpZm5kZWYgQVYxX0dMT0JBTF9IXworI2RlZmluZSBBVjFfR0xPQkFMX0hfCisjZGVmaW5lIEFPTV9BVjFfTU1VX0RXCisjaWZuZGVmIEhBVkVfTkVPTgorI2RlZmluZSBIQVZFX05FT04gMAorI2VuZGlmCisjaWZuZGVmIENPTkZJR19BQ0NPVU5USU5HCisjZGVmaW5lIENPTkZJR19BQ0NPVU5USU5HIDAKKyNlbmRpZgorI2lmbmRlZiBDT05GSUdfSU5TUEVDVElPTgorI2RlZmluZSBDT05GSUdfSU5TUEVDVElPTiAwCisjZW5kaWYKKyNpZm5kZWYgQ09ORklHX0xQRl9NQVNLCisjZGVmaW5lIENPTkZJR19MUEZfTUFTSyAwCisjZW5kaWYKKyNpZm5kZWYgQ09ORklHX1NJWkVfTElNSVQKKyNkZWZpbmUgQ09ORklHX1NJWkVfTElNSVQgMAorI2VuZGlmCisKKyNkZWZpbmUgU1VQUE9SVF9TQ0FMRV9GQUNUT1IKKyNkZWZpbmUgVVNFX1NDQUxFRF9XSURUSF9GUk9NX1VDT0RFCisjZGVmaW5lIEFNTAorI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX01VTFRJX0RFQworI2RlZmluZSBBTUxfREVWSUNFCisjZW5kaWYKKyNpZmRlZiBCVUZNR1JfRk9SX1NJTQorI2RlZmluZSBwcmludGYgaW9fcHJpbnRmCisjZW5kaWYKKworI2lmbmRlZiBJTlRfTUFYCisjZGVmaW5lIElOVF9NQVggMHg3RkZGRkZGRgorI2VuZGlmCisjZGVmaW5lIEFPTU1JTih4LCB5KSAoKCh4KSA8ICh5KSkgPyAoeCkgOiAoeSkpCisjZGVmaW5lIEFPTU1BWCh4LCB5KSAoKCh4KSA+ICh5KSkgPyAoeCkgOiAoeSkpCisKKy8qCisgKnR5cGVkZWYgY2hhciBpbnQ4X3Q7CisgKiNpZm5kZWYgQlVGTUdSX0ZPUl9TSU0KKyAqdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVpbnQ4X3Q7CisgKiNlbmRpZgorICp0eXBlZGVmIHVuc2lnbmVkIGludCB1aW50MzJfdDsKKyAqdHlwZWRlZiBpbnQgaW50MzJfdDsKKyAqdHlwZWRlZiBsb25nIGxvbmcgaW50NjRfdDsKKyAqLworCisjaWZkZWYgQU1MCisjZGVmaW5lIEFPTV9BVjFfTU1VCisjZGVmaW5lIEZJTE1fR1JBSU5fUkVHX1NJWkUgIDM5Cit0eXBlZGVmIHN0cnVjdCBidWZmX3MKK3sKKyAgICB1aW50MzJfdCBidWZfc3RhcnQ7CisgICAgdWludDMyX3QgYnVmX3NpemU7CisgICAgdWludDMyX3QgYnVmX2VuZDsKK30gYnVmZl90OworCit0eXBlZGVmIHN0cnVjdCBCdWZmSW5mb19zCit7CisgICAgdWludDMyX3QgbWF4X3dpZHRoOworICAgIHVpbnQzMl90IG1heF9oZWlnaHQ7CisgICAgdWludDMyX3Qgc3RhcnRfYWRyOworICAgIHVpbnQzMl90IGVuZF9hZHI7CisgICAgYnVmZl90IGlwcDsKKyAgICBidWZmX3Qgc2FvX2FidjsKKyAgICBidWZmX3Qgc2FvX3ZiOworICAgIGJ1ZmZfdCBzaG9ydF90ZXJtX3JwczsKKyAgICBidWZmX3QgdnBzOworICAgIGJ1ZmZfdCBzZWdfbWFwOworICAgIGJ1ZmZfdCBkYWFsYV90b3A7CisgICAgYnVmZl90IHNhb191cDsKKyAgICBidWZmX3Qgc3dhcF9idWY7CisgICAgYnVmZl90IGNkZl9idWY7CisgICAgYnVmZl90IGdtY19idWY7CisgICAgYnVmZl90IHNjYWxlbHV0OworICAgIGJ1ZmZfdCBkYmxrX3BhcmE7CisgICAgYnVmZl90IGRibGtfZGF0YTsKKyAgICBidWZmX3QgY2RlZl9kYXRhOworICAgIGJ1ZmZfdCB1cHNfZGF0YTsKKyNpZmRlZiBBT01fQVYxX01NVQorICAgIGJ1ZmZfdCBtbXVfdmJoOworICAgIGJ1ZmZfdCBjbV9oZWFkZXI7CisjZW5kaWYKKyNpZmRlZiBBT01fQVYxX01NVV9EVworICAgIGJ1ZmZfdCBtbXVfdmJoX2R3OworICAgIGJ1ZmZfdCBjbV9oZWFkZXJfZHc7CisjZW5kaWYKKyAgICBidWZmX3QgZmdzX3RhYmxlOworICAgIGJ1ZmZfdCBtcHJlZF9hYm92ZTsKKyAgICBidWZmX3QgbXByZWRfbXY7CisgICAgYnVmZl90IHJwbTsKKyAgICBidWZmX3QgbG1lbTsKK30gQnVmZkluZm9fdDsKKyNlbmRpZgorCisjaWYgMAorI2RlZmluZSB2YV9zdGFydCh2LGwpICAgX19idWlsdGluX3ZhX3N0YXJ0KHYsbCkKKyNkZWZpbmUgdmFfZW5kKHYpICAgICAgIF9fYnVpbHRpbl92YV9lbmQodikKKyNkZWZpbmUgdmFfYXJnKHYsbCkgICAgIF9fYnVpbHRpbl92YV9hcmcodixsKQorI2VuZGlmCisKKy8qCittZW0uaAorKi8KKyNpZiAoZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18pIHx8IGRlZmluZWQoX19TVU5QUk9fQykKKyNkZWZpbmUgREVDTEFSRV9BTElHTkVEKG4sIHR5cCwgdmFsKSB0eXAgdmFsIF9fYXR0cmlidXRlX18oKGFsaWduZWQobikpKQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgREVDTEFSRV9BTElHTkVEKG4sIHR5cCwgdmFsKSBfX2RlY2xzcGVjKGFsaWduKG4pKSB0eXAgdmFsCisjZWxzZQorI3dhcm5pbmcgTm8gYWxpZ25tZW50IGRpcmVjdGl2ZXMga25vd24gZm9yIHRoaXMgY29tcGlsZXIuCisjZGVmaW5lIERFQ0xBUkVfQUxJR05FRChuLCB0eXAsIHZhbCkgdHlwIHZhbAorI2VuZGlmCisKKy8qIEluZGljYXRlcyB0aGF0IHRoZSB1c2FnZSBvZiB0aGUgc3BlY2lmaWVkIHZhcmlhYmxlIGhhcyBiZWVuIGF1ZGl0ZWQgdG8gYXNzdXJlCisgKiB0aGF0IGl0J3Mgc2FmZSB0byB1c2UgdW5pbml0aWFsaXplZC4gU2lsZW5jZXMgJ21heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQnCisgKiB3YXJuaW5ncyBvbiBnY2MuCisgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXworI2RlZmluZSBVTklOSVRJQUxJWkVEX0lTX1NBRkUoeCkgeCA9IHgKKyNlbHNlCisjZGVmaW5lIFVOSU5JVElBTElaRURfSVNfU0FGRSh4KSB4CisjZW5kaWYKKworI2lmIEhBVkVfTkVPTiAmJiBkZWZpbmVkKF9NU0NfVkVSKQorI2RlZmluZSBfX2J1aWx0aW5fcHJlZmV0Y2goeCkKKyNlbmRpZgorCisvKiBTaGlmdCBkb3duIHdpdGggcm91bmRpbmcgZm9yIHVzZSB3aGVuIG4gPj0gMCwgdmFsdWUgPj0gMCAqLworI2RlZmluZSBST1VORF9QT1dFUl9PRl9UV08odmFsdWUsIG4pICgoKHZhbHVlKSArICgoKDEgPDwgKG4pKSA+PiAxKSkpID4+IChuKSkKKworLyogU2hpZnQgZG93biB3aXRoIHJvdW5kaW5nIGZvciBzaWduZWQgaW50ZWdlcnMsIGZvciB1c2Ugd2hlbiBuID49IDAgKi8KKyNkZWZpbmUgUk9VTkRfUE9XRVJfT0ZfVFdPX1NJR05FRCh2YWx1ZSwgbikgICAgICAgICAgIFwKKyAgKCgodmFsdWUpIDwgMCkgPyAtUk9VTkRfUE9XRVJfT0ZfVFdPKC0odmFsdWUpLCAobikpIFwKKyAgICAgICAgICAgICAgICAgOiBST1VORF9QT1dFUl9PRl9UV08oKHZhbHVlKSwgKG4pKSkKKworLyogU2hpZnQgZG93biB3aXRoIHJvdW5kaW5nIGZvciB1c2Ugd2hlbiBuID49IDAsIHZhbHVlID49IDAgZm9yICg2NCBiaXQpICovCisjZGVmaW5lIFJPVU5EX1BPV0VSX09GX1RXT182NCh2YWx1ZSwgbikgXAorICAoKCh2YWx1ZSkgKyAoKCgoaW50NjRfdCkxIDw8IChuKSkgPj4gMSkpKSA+PiAobikpCisvKiBTaGlmdCBkb3duIHdpdGggcm91bmRpbmcgZm9yIHNpZ25lZCBpbnRlZ2VycywgZm9yIHVzZSB3aGVuIG4gPj0gMCAoNjQgYml0KSAqLworI2RlZmluZSBST1VORF9QT1dFUl9PRl9UV09fU0lHTkVEXzY0KHZhbHVlLCBuKSAgICAgICAgICAgXAorICAoKCh2YWx1ZSkgPCAwKSA/IC1ST1VORF9QT1dFUl9PRl9UV09fNjQoLSh2YWx1ZSksIChuKSkgXAorICAgICAgICAgICAgICAgICA6IFJPVU5EX1BPV0VSX09GX1RXT182NCgodmFsdWUpLCAobikpKQorCisvKiBzaGlmdCByaWdodCBvciBsZWZ0IGRlcGVuZGluZyBvbiBzaWduIG9mIG4gKi8KKyNkZWZpbmUgUklHSFRfU0lHTkVEX1NISUZUKHZhbHVlLCBuKSBcCisgICgobikgPCAwID8gKCh2YWx1ZSkgPDwgKC0obikpKSA6ICgodmFsdWUpID4+IChuKSkpCisKKyNkZWZpbmUgQUxJR05fUE9XRVJfT0ZfVFdPKHZhbHVlLCBuKSBcCisgICgoKHZhbHVlKSArICgoMSA8PCAobikpIC0gMSkpICYgfigoMSA8PCAobikpIC0gMSkpCisKKyNkZWZpbmUgRElWSURFX0FORF9ST1VORCh4LCB5KSAoKCh4KSArICgoeSkgPj4gMSkpIC8gKHkpKQorCisjZGVmaW5lIENPTlZFUlRfVE9fU0hPUlRQVFIoeCkgKCh1aW50MTZfdCAqKSgoKHVpbnRwdHJfdCkoeCkpIDw8IDEpKQorI2RlZmluZSBDT05WRVJUX1RPX0JZVEVQVFIoeCkgKCh1aW50OF90ICopKCgodWludHB0cl90KSh4KSkgPj4gMSkpCisKKyNpZmRlZiBBTUwKKyNkZWZpbmUgVFlQRURFRiB0eXBlZGVmCisjZGVmaW5lIFVFTlVNMUJZVEUoZW51bXZhcikgZW51bXZhcgorI2RlZmluZSBTRU5VTTFCWVRFKGVudW12YXIpIGVudW12YXIKKyNkZWZpbmUgVUVOVU0yQllURShlbnVtdmFyKSBlbnVtdmFyCisjZGVmaW5lIFNFTlVNMkJZVEUoZW51bXZhcikgZW51bXZhcgorI2RlZmluZSBVRU5VTTRCWVRFKGVudW12YXIpIGVudW12YXIKKyNkZWZpbmUgU0VOVU00QllURShlbnVtdmFyKSBlbnVtdmFyCisKKyNlbHNlCisjZGVmaW5lIFRZUEVERUYKKy8qIVxicmllZiBmb3JjZSBlbnVtIHRvIGJlIHVuc2lnbmVkIDEgYnl0ZSovCisjZGVmaW5lIFVFTlVNMUJZVEUoZW51bXZhcikgXAorICA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHlwZWRlZiB1aW50OF90IGVudW12YXIKKworLyohXGJyaWVmIGZvcmNlIGVudW0gdG8gYmUgc2lnbmVkIDEgYnl0ZSovCisjZGVmaW5lIFNFTlVNMUJZVEUoZW51bXZhcikgXAorICA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHlwZWRlZiBpbnQ4X3QgZW51bXZhcgorCisvKiFcYnJpZWYgZm9yY2UgZW51bSB0byBiZSB1bnNpZ25lZCAyIGJ5dGUqLworI2RlZmluZSBVRU5VTTJCWVRFKGVudW12YXIpIFwKKyAgOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHR5cGVkZWYgdWludDE2X3QgZW51bXZhcgorCisvKiFcYnJpZWYgZm9yY2UgZW51bSB0byBiZSBzaWduZWQgMiBieXRlKi8KKyNkZWZpbmUgU0VOVU0yQllURShlbnVtdmFyKSBcCisgIDsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlZGVmIGludDE2X3QgZW51bXZhcgorCisvKiFcYnJpZWYgZm9yY2UgZW51bSB0byBiZSB1bnNpZ25lZCA0IGJ5dGUqLworI2RlZmluZSBVRU5VTTRCWVRFKGVudW12YXIpIFwKKyAgOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHR5cGVkZWYgdWludDMyX3QgZW51bXZhcgorCisvKiFcYnJpZWYgZm9yY2UgZW51bSB0byBiZSB1bnNpZ25lZCA0IGJ5dGUqLworI2RlZmluZSBTRU5VTTRCWVRFKGVudW12YXIpIFwKKyAgOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHR5cGVkZWYgaW50MzJfdCBlbnVtdmFyCisjZW5kaWYKKworCisvKgorI2luY2x1ZGUgImVudW1zLmgiCisqLworI3VuZGVmIE1BWF9TQl9TSVpFCisKKy8vIE1heCBzdXBlcmJsb2NrIHNpemUKKyNkZWZpbmUgTUFYX1NCX1NJWkVfTE9HMiA3CisjZGVmaW5lIE1BWF9TQl9TSVpFICgxIDw8IE1BWF9TQl9TSVpFX0xPRzIpCisjZGVmaW5lIE1BWF9TQl9TUVVBUkUgKE1BWF9TQl9TSVpFICogTUFYX1NCX1NJWkUpCisKKy8vIE1pbiBzdXBlcmJsb2NrIHNpemUKKyNkZWZpbmUgTUlOX1NCX1NJWkVfTE9HMiA2CisKKy8vIFBpeGVscyBwZXIgTW9kZSBJbmZvIChNSSkgdW5pdAorI2RlZmluZSBNSV9TSVpFX0xPRzIgMgorI2RlZmluZSBNSV9TSVpFICgxIDw8IE1JX1NJWkVfTE9HMikKKworLy8gTUktdW5pdHMgcGVyIG1heCBzdXBlcmJsb2NrIChNSSBCbG9jayAtIE1JQikKKyNkZWZpbmUgTUFYX01JQl9TSVpFX0xPRzIgKE1BWF9TQl9TSVpFX0xPRzIgLSBNSV9TSVpFX0xPRzIpCisjZGVmaW5lIE1BWF9NSUJfU0laRSAoMSA8PCBNQVhfTUlCX1NJWkVfTE9HMikKKworLy8gTUktdW5pdHMgcGVyIG1pbiBzdXBlcmJsb2NrCisjZGVmaW5lIE1JTl9NSUJfU0laRV9MT0cyIChNSU5fU0JfU0laRV9MT0cyIC0gTUlfU0laRV9MT0cyKQorCisvLyBNYXNrIHRvIGV4dHJhY3QgTUkgb2Zmc2V0IHdpdGhpbiBtYXggTUlCCisjZGVmaW5lIE1BWF9NSUJfTUFTSyAoTUFYX01JQl9TSVpFIC0gMSkKKworLy8gTWF4aW11bSBudW1iZXIgb2YgdGlsZSByb3dzIGFuZCB0aWxlIGNvbHVtbnMKKyNkZWZpbmUgTUFYX1RJTEVfUk9XUyA2NAorI2RlZmluZSBNQVhfVElMRV9DT0xTIDY0CisKKyNkZWZpbmUgTUFYX1ZBUlRYX0RFUFRIIDIKKworI2RlZmluZSBNSV9TSVpFXzY0WDY0ICg2NCA+PiBNSV9TSVpFX0xPRzIpCisjZGVmaW5lIE1JX1NJWkVfMTI4WDEyOCAoMTI4ID4+IE1JX1NJWkVfTE9HMikKKworI2RlZmluZSBNQVhfUEFMRVRURV9TUVVBUkUgKDY0ICogNjQpCisvLyBNYXhpbXVtIG51bWJlciBvZiBjb2xvcnMgaW4gYSBwYWxldHRlLgorI2RlZmluZSBQQUxFVFRFX01BWF9TSVpFIDgKKy8vIE1pbmltdW0gbnVtYmVyIG9mIGNvbG9ycyBpbiBhIHBhbGV0dGUuCisjZGVmaW5lIFBBTEVUVEVfTUlOX1NJWkUgMgorCisjZGVmaW5lIEZSQU1FX09GRlNFVF9CSVRTIDUKKyNkZWZpbmUgTUFYX0ZSQU1FX0RJU1RBTkNFICgoMSA8PCBGUkFNRV9PRkZTRVRfQklUUykgLSAxKQorCisvLyA0IGZyYW1lIGZpbHRlciBsZXZlbHM6IHkgcGxhbmUgdmVydGljYWwsIHkgcGxhbmUgaG9yaXpvbnRhbCwKKy8vIHUgcGxhbmUsIGFuZCB2IHBsYW5lCisjZGVmaW5lIEZSQU1FX0xGX0NPVU5UIDQKKyNkZWZpbmUgREVGQVVMVF9ERUxUQV9MRl9NVUxUSSAwCisjZGVmaW5lIE1BWF9NT0RFX0xGX0RFTFRBUyAyCisKKyNkZWZpbmUgRElTVF9QUkVDSVNJT05fQklUUyA0CisjZGVmaW5lIERJU1RfUFJFQ0lTSU9OICgxIDw8IERJU1RfUFJFQ0lTSU9OX0JJVFMpICAvLyAxNgorCisjZGVmaW5lIFBST0ZJTEVfQklUUyAzCisvLyBUaGUgZm9sbG93aW5nIHRocmVlIHByb2ZpbGVzIGFyZSBjdXJyZW50bHkgZGVmaW5lZC4KKy8vIFByb2ZpbGUgMC4gIDgtYml0IGFuZCAxMC1iaXQgNDoyOjAgYW5kIDQ6MDowIG9ubHkuCisvLyBQcm9maWxlIDEuICA4LWJpdCBhbmQgMTAtYml0IDQ6NDo0CisvLyBQcm9maWxlIDIuICA4LWJpdCBhbmQgMTAtYml0IDQ6MjoyCisvLyAgICAgICAgICAgIDEyLWJpdCAgNDowOjAsIDQ6MjoyIGFuZCA0OjQ6NAorLy8gU2luY2Ugd2UgaGF2ZSB0aHJlZSBiaXRzIGZvciB0aGUgcHJvZmlsZXMsIGl0IGNhbiBiZSBleHRlbmRlZCBsYXRlci4KK1RZUEVERUYgZW51bSB7CisgIFBST0ZJTEVfMCwKKyAgUFJPRklMRV8xLAorICBQUk9GSUxFXzIsCisgIE1BWF9QUk9GSUxFUywKK30gU0VOVU0xQllURShCSVRTVFJFQU1fUFJPRklMRSk7CisKKyNkZWZpbmUgT1BfUE9JTlRTX0NOVF9NSU5VU18xX0JJVFMgNQorI2RlZmluZSBPUF9QT0lOVFNfSURDX0JJVFMgMTIKKworLy8gTm90ZTogU29tZSBlbnVtcyB1c2UgdGhlIGF0dHJpYnV0ZSAncGFja2VkJyB0byB1c2Ugc21hbGxlc3QgcG9zc2libGUgaW50ZWdlcgorLy8gdHlwZSwgc28gdGhhdCB3ZSBjYW4gc2F2ZSBtZW1vcnkgd2hlbiB0aGV5IGFyZSB1c2VkIGluIHN0cnVjdHMvYXJyYXlzLgorCit0eXBlZGVmIGVudW0gQVRUUklCVVRFX1BBQ0tFRCB7CisgIEJMT0NLXzRYNCwKKyAgQkxPQ0tfNFg4LAorICBCTE9DS184WDQsCisgIEJMT0NLXzhYOCwKKyAgQkxPQ0tfOFgxNiwKKyAgQkxPQ0tfMTZYOCwKKyAgQkxPQ0tfMTZYMTYsCisgIEJMT0NLXzE2WDMyLAorICBCTE9DS18zMlgxNiwKKyAgQkxPQ0tfMzJYMzIsCisgIEJMT0NLXzMyWDY0LAorICBCTE9DS182NFgzMiwKKyAgQkxPQ0tfNjRYNjQsCisgIEJMT0NLXzY0WDEyOCwKKyAgQkxPQ0tfMTI4WDY0LAorICBCTE9DS18xMjhYMTI4LAorICBCTE9DS180WDE2LAorICBCTE9DS18xNlg0LAorICBCTE9DS184WDMyLAorICBCTE9DS18zMlg4LAorICBCTE9DS18xNlg2NCwKKyAgQkxPQ0tfNjRYMTYsCisgIEJMT0NLX1NJWkVTX0FMTCwKKyAgQkxPQ0tfU0laRVMgPSBCTE9DS180WDE2LAorICBCTE9DS19JTlZBTElEID0gMjU1LAorICBCTE9DS19MQVJHRVNUID0gKEJMT0NLX1NJWkVTIC0gMSkKK30gQkxPQ0tfU0laRTI7CisKKy8vIDRYNCwgOFg4LCAxNlgxNiwgMzJYMzIsIDY0WDY0LCAxMjhYMTI4CisjZGVmaW5lIFNRUl9CTE9DS19TSVpFUyA2CisKK1RZUEVERUYgZW51bSB7CisgIFBBUlRJVElPTl9OT05FLAorICBQQVJUSVRJT05fSE9SWiwKKyAgUEFSVElUSU9OX1ZFUlQsCisgIFBBUlRJVElPTl9TUExJVCwKKyAgUEFSVElUSU9OX0hPUlpfQSwgIC8vIEhPUlogc3BsaXQgYW5kIHRoZSB0b3AgcGFydGl0aW9uIGlzIHNwbGl0IGFnYWluCisgIFBBUlRJVElPTl9IT1JaX0IsICAvLyBIT1JaIHNwbGl0IGFuZCB0aGUgYm90dG9tIHBhcnRpdGlvbiBpcyBzcGxpdCBhZ2FpbgorICBQQVJUSVRJT05fVkVSVF9BLCAgLy8gVkVSVCBzcGxpdCBhbmQgdGhlIGxlZnQgcGFydGl0aW9uIGlzIHNwbGl0IGFnYWluCisgIFBBUlRJVElPTl9WRVJUX0IsICAvLyBWRVJUIHNwbGl0IGFuZCB0aGUgcmlnaHQgcGFydGl0aW9uIGlzIHNwbGl0IGFnYWluCisgIFBBUlRJVElPTl9IT1JaXzQsICAvLyA0OjEgaG9yaXpvbnRhbCBwYXJ0aXRpb24KKyAgUEFSVElUSU9OX1ZFUlRfNCwgIC8vIDQ6MSB2ZXJ0aWNhbCBwYXJ0aXRpb24KKyAgRVhUX1BBUlRJVElPTl9UWVBFUywKKyAgUEFSVElUSU9OX1RZUEVTID0gUEFSVElUSU9OX1NQTElUICsgMSwKKyAgUEFSVElUSU9OX0lOVkFMSUQgPSAyNTUKK30gVUVOVU0xQllURShQQVJUSVRJT05fVFlQRSk7CisKK3R5cGVkZWYgY2hhciBQQVJUSVRJT05fQ09OVEVYVDsKKyNkZWZpbmUgUEFSVElUSU9OX1BMT0ZGU0VUIDQgIC8vIG51bWJlciBvZiBwcm9iYWJpbGl0eSBtb2RlbHMgcGVyIGJsb2NrIHNpemUKKyNkZWZpbmUgUEFSVElUSU9OX0JMT0NLX1NJWkVTIDUKKyNkZWZpbmUgUEFSVElUSU9OX0NPTlRFWFRTIChQQVJUSVRJT05fQkxPQ0tfU0laRVMgKiBQQVJUSVRJT05fUExPRkZTRVQpCisKKy8vIGJsb2NrIHRyYW5zZm9ybSBzaXplCitUWVBFREVGIGVudW0geworICBUWF80WDQsICAgICAgICAgICAgIC8vIDR4NCB0cmFuc2Zvcm0KKyAgVFhfOFg4LCAgICAgICAgICAgICAvLyA4eDggdHJhbnNmb3JtCisgIFRYXzE2WDE2LCAgICAgICAgICAgLy8gMTZ4MTYgdHJhbnNmb3JtCisgIFRYXzMyWDMyLCAgICAgICAgICAgLy8gMzJ4MzIgdHJhbnNmb3JtCisgIFRYXzY0WDY0LCAgICAgICAgICAgLy8gNjR4NjQgdHJhbnNmb3JtCisgIFRYXzRYOCwgICAgICAgICAgICAgLy8gNHg4IHRyYW5zZm9ybQorICBUWF84WDQsICAgICAgICAgICAgIC8vIDh4NCB0cmFuc2Zvcm0KKyAgVFhfOFgxNiwgICAgICAgICAgICAvLyA4eDE2IHRyYW5zZm9ybQorICBUWF8xNlg4LCAgICAgICAgICAgIC8vIDE2eDggdHJhbnNmb3JtCisgIFRYXzE2WDMyLCAgICAgICAgICAgLy8gMTZ4MzIgdHJhbnNmb3JtCisgIFRYXzMyWDE2LCAgICAgICAgICAgLy8gMzJ4MTYgdHJhbnNmb3JtCisgIFRYXzMyWDY0LCAgICAgICAgICAgLy8gMzJ4NjQgdHJhbnNmb3JtCisgIFRYXzY0WDMyLCAgICAgICAgICAgLy8gNjR4MzIgdHJhbnNmb3JtCisgIFRYXzRYMTYsICAgICAgICAgICAgLy8gNHgxNiB0cmFuc2Zvcm0KKyAgVFhfMTZYNCwgICAgICAgICAgICAvLyAxNng0IHRyYW5zZm9ybQorICBUWF84WDMyLCAgICAgICAgICAgIC8vIDh4MzIgdHJhbnNmb3JtCisgIFRYXzMyWDgsICAgICAgICAgICAgLy8gMzJ4OCB0cmFuc2Zvcm0KKyAgVFhfMTZYNjQsICAgICAgICAgICAvLyAxNng2NCB0cmFuc2Zvcm0KKyAgVFhfNjRYMTYsICAgICAgICAgICAvLyA2NHgxNiB0cmFuc2Zvcm0KKyAgVFhfU0laRVNfQUxMLCAgICAgICAvLyBJbmNsdWRlcyByZWN0YW5ndWxhciB0cmFuc2Zvcm1zCisgIFRYX1NJWkVTID0gVFhfNFg4LCAgLy8gRG9lcyBOT1QgaW5jbHVkZSByZWN0YW5ndWxhciB0cmFuc2Zvcm1zCisgIFRYX1NJWkVTX0xBUkdFU1QgPSBUWF82NFg2NCwKKyAgVFhfSU5WQUxJRCA9IDI1NSAgLy8gSW52YWxpZCB0cmFuc2Zvcm0gc2l6ZQorfSBVRU5VTTFCWVRFKFRYX1NJWkUpOworCisjZGVmaW5lIFRYX1NJWkVfTFVNQV9NSU4gKFRYXzRYNCkKKy8qIFdlIGRvbid0IG5lZWQgdG8gY29kZSBhIHRyYW5zZm9ybSBzaXplIHVubGVzcyB0aGUgYWxsb3dlZCBzaXplIGlzIGF0IGxlYXN0CisgICBvbmUgbW9yZSB0aGFuIHRoZSBtaW5pbXVtLiAqLworI2RlZmluZSBUWF9TSVpFX0NUWF9NSU4gKFRYX1NJWkVfTFVNQV9NSU4gKyAxKQorCisvLyBNYXhpbXVtIHR4X3NpemUgY2F0ZWdvcmllcworI2RlZmluZSBNQVhfVFhfQ0FUUyAoVFhfU0laRVMgLSBUWF9TSVpFX0NUWF9NSU4pCisjZGVmaW5lIE1BWF9UWF9ERVBUSCAyCisKKyNkZWZpbmUgTUFYX1RYX1NJWkVfTE9HMiAoNikKKyNkZWZpbmUgTUFYX1RYX1NJWkUgKDEgPDwgTUFYX1RYX1NJWkVfTE9HMikKKyNkZWZpbmUgTUlOX1RYX1NJWkVfTE9HMiAyCisjZGVmaW5lIE1JTl9UWF9TSVpFICgxIDw8IE1JTl9UWF9TSVpFX0xPRzIpCisjZGVmaW5lIE1BWF9UWF9TUVVBUkUgKE1BWF9UWF9TSVpFICogTUFYX1RYX1NJWkUpCisKKy8vIFBhZCA0IGV4dHJhIGNvbHVtbnMgdG8gcmVtb3ZlIGhvcml6b250YWwgYXZhaWxhYmlsaXR5IGNoZWNrLgorI2RlZmluZSBUWF9QQURfSE9SX0xPRzIgMgorI2RlZmluZSBUWF9QQURfSE9SIDQKKy8vIFBhZCA2IGV4dHJhIHJvd3MgKDIgb24gdG9wIGFuZCA0IG9uIGJvdHRvbSkgdG8gcmVtb3ZlIHZlcnRpY2FsIGF2YWlsYWJpbGl0eQorLy8gY2hlY2suCisjZGVmaW5lIFRYX1BBRF9UT1AgMAorI2RlZmluZSBUWF9QQURfQk9UVE9NIDQKKyNkZWZpbmUgVFhfUEFEX1ZFUiAoVFhfUEFEX1RPUCArIFRYX1BBRF9CT1RUT00pCisvLyBQYWQgMTYgZXh0cmEgYnl0ZXMgdG8gYXZvaWQgcmVhZGluZyBvdmVyZmxvdyBpbiBTSU1EIG9wdGltaXphdGlvbi4KKyNkZWZpbmUgVFhfUEFEX0VORCAxNgorI2RlZmluZSBUWF9QQURfMkQgKCgzMiArIFRYX1BBRF9IT1IpICogKDMyICsgVFhfUEFEX1ZFUikgKyBUWF9QQURfRU5EKQorCisvLyBOdW1iZXIgb2YgbWF4aXVtIHNpemUgdHJhbnNmb3JtIGJsb2NrcyBpbiB0aGUgbWF4aW11bSBzaXplIHN1cGVyYmxvY2sKKyNkZWZpbmUgTUFYX1RYX0JMT0NLU19JTl9NQVhfU0JfTE9HMiAoKE1BWF9TQl9TSVpFX0xPRzIgLSBNQVhfVFhfU0laRV9MT0cyKSAqIDIpCisjZGVmaW5lIE1BWF9UWF9CTE9DS1NfSU5fTUFYX1NCICgxIDw8IE1BWF9UWF9CTE9DS1NfSU5fTUFYX1NCX0xPRzIpCisKKy8vIGZyYW1lIHRyYW5zZm9ybSBtb2RlCitUWVBFREVGIGVudW0geworICBPTkxZXzRYNCwgICAgICAgICAvLyB1c2Ugb25seSA0eDQgdHJhbnNmb3JtCisgIFRYX01PREVfTEFSR0VTVCwgIC8vIHRyYW5zZm9ybSBzaXplIGlzIHRoZSBsYXJnZXN0IHBvc3NpYmxlIGZvciBwdSBzaXplCisgIFRYX01PREVfU0VMRUNULCAgIC8vIHRyYW5zZm9ybSBzcGVjaWZpZWQgZm9yIGVhY2ggYmxvY2sKKyAgVFhfTU9ERVMsCit9IFVFTlVNMUJZVEUoVFhfTU9ERSk7CisKKy8vIDFEIHR4IHR5cGVzCitUWVBFREVGIGVudW0geworICBEQ1RfMUQsCisgIEFEU1RfMUQsCisgIEZMSVBBRFNUXzFELAorICBJRFRYXzFELAorICBUWF9UWVBFU18xRCwKK30gVUVOVU0xQllURShUWF9UWVBFXzFEKTsKKworVFlQRURFRiBlbnVtIHsKKyAgRENUX0RDVCwgICAgICAgICAgICAvLyBEQ1QgaW4gYm90aCBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbAorICBBRFNUX0RDVCwgICAgICAgICAgIC8vIEFEU1QgaW4gdmVydGljYWwsIERDVCBpbiBob3Jpem9udGFsCisgIERDVF9BRFNULCAgICAgICAgICAgLy8gRENUIGluIHZlcnRpY2FsLCBBRFNUIGluIGhvcml6b250YWwKKyAgQURTVF9BRFNULCAgICAgICAgICAvLyBBRFNUIGluIGJvdGggZGlyZWN0aW9ucworICBGTElQQURTVF9EQ1QsICAgICAgIC8vIEZMSVBBRFNUIGluIHZlcnRpY2FsLCBEQ1QgaW4gaG9yaXpvbnRhbAorICBEQ1RfRkxJUEFEU1QsICAgICAgIC8vIERDVCBpbiB2ZXJ0aWNhbCwgRkxJUEFEU1QgaW4gaG9yaXpvbnRhbAorICBGTElQQURTVF9GTElQQURTVCwgIC8vIEZMSVBBRFNUIGluIGJvdGggZGlyZWN0aW9ucworICBBRFNUX0ZMSVBBRFNULCAgICAgIC8vIEFEU1QgaW4gdmVydGljYWwsIEZMSVBBRFNUIGluIGhvcml6b250YWwKKyAgRkxJUEFEU1RfQURTVCwgICAgICAvLyBGTElQQURTVCBpbiB2ZXJ0aWNhbCwgQURTVCBpbiBob3Jpem9udGFsCisgIElEVFgsICAgICAgICAgICAgICAgLy8gSWRlbnRpdHkgaW4gYm90aCBkaXJlY3Rpb25zCisgIFZfRENULCAgICAgICAgICAgICAgLy8gRENUIGluIHZlcnRpY2FsLCBpZGVudGl0eSBpbiBob3Jpem9udGFsCisgIEhfRENULCAgICAgICAgICAgICAgLy8gSWRlbnRpdHkgaW4gdmVydGljYWwsIERDVCBpbiBob3Jpem9udGFsCisgIFZfQURTVCwgICAgICAgICAgICAgLy8gQURTVCBpbiB2ZXJ0aWNhbCwgaWRlbnRpdHkgaW4gaG9yaXpvbnRhbAorICBIX0FEU1QsICAgICAgICAgICAgIC8vIElkZW50aXR5IGluIHZlcnRpY2FsLCBBRFNUIGluIGhvcml6b250YWwKKyAgVl9GTElQQURTVCwgICAgICAgICAvLyBGTElQQURTVCBpbiB2ZXJ0aWNhbCwgaWRlbnRpdHkgaW4gaG9yaXpvbnRhbAorICBIX0ZMSVBBRFNULCAgICAgICAgIC8vIElkZW50aXR5IGluIHZlcnRpY2FsLCBGTElQQURTVCBpbiBob3Jpem9udGFsCisgIFRYX1RZUEVTLAorfSBVRU5VTTFCWVRFKFRYX1RZUEUpOworCitUWVBFREVGIGVudW0geworICBSRUdfUkVHLAorICBSRUdfU01PT1RILAorICBSRUdfU0hBUlAsCisgIFNNT09USF9SRUcsCisgIFNNT09USF9TTU9PVEgsCisgIFNNT09USF9TSEFSUCwKKyAgU0hBUlBfUkVHLAorICBTSEFSUF9TTU9PVEgsCisgIFNIQVJQX1NIQVJQLAorfSBVRU5VTTFCWVRFKERVQUxfRklMVEVSX1RZUEUpOworCitUWVBFREVGIGVudW0geworICAvLyBEQ1Qgb25seQorICBFWFRfVFhfU0VUX0RDVE9OTFksCisgIC8vIERDVCArIElkZW50aXR5IG9ubHkKKyAgRVhUX1RYX1NFVF9EQ1RfSURUWCwKKyAgLy8gRGlzY3JldGUgVHJpZyB0cmFuc2Zvcm1zIHcvbyBmbGlwICg0KSArIElkZW50aXR5ICgxKQorICBFWFRfVFhfU0VUX0RUVDRfSURUWCwKKyAgLy8gRGlzY3JldGUgVHJpZyB0cmFuc2Zvcm1zIHcvbyBmbGlwICg0KSArIElkZW50aXR5ICgxKSArIDFEIEhvci92ZXJ0IERDVCAoMikKKyAgRVhUX1RYX1NFVF9EVFQ0X0lEVFhfMUREQ1QsCisgIC8vIERpc2NyZXRlIFRyaWcgdHJhbnNmb3JtcyB3LyBmbGlwICg5KSArIElkZW50aXR5ICgxKSArIDFEIEhvci9WZXIgRENUICgyKQorICBFWFRfVFhfU0VUX0RUVDlfSURUWF8xRERDVCwKKyAgLy8gRGlzY3JldGUgVHJpZyB0cmFuc2Zvcm1zIHcvIGZsaXAgKDkpICsgSWRlbnRpdHkgKDEpICsgMUQgSG9yL1ZlciAoNikKKyAgRVhUX1RYX1NFVF9BTEwxNiwKKyAgRVhUX1RYX1NFVF9UWVBFUworfSBVRU5VTTFCWVRFKFR4U2V0VHlwZSk7CisKKyNkZWZpbmUgSVNfMkRfVFJBTlNGT1JNKHR4X3R5cGUpICh0eF90eXBlIDwgSURUWCkKKworI2RlZmluZSBFWFRfVFhfU0laRVMgNCAgICAgICAvLyBudW1iZXIgb2Ygc2l6ZXMgdGhhdCB1c2UgZXh0ZW5kZWQgdHJhbnNmb3JtcworI2RlZmluZSBFWFRfVFhfU0VUU19JTlRFUiA0ICAvLyBTZXRzIG9mIHRyYW5zZm9ybSBzZWxlY3Rpb25zIGZvciBJTlRFUgorI2RlZmluZSBFWFRfVFhfU0VUU19JTlRSQSAzICAvLyBTZXRzIG9mIHRyYW5zZm9ybSBzZWxlY3Rpb25zIGZvciBJTlRSQQorCitUWVBFREVGIGVudW0geworICBBT01fTEFTVF9GTEFHID0gMSA8PCAwLAorICBBT01fTEFTVDJfRkxBRyA9IDEgPDwgMSwKKyAgQU9NX0xBU1QzX0ZMQUcgPSAxIDw8IDIsCisgIEFPTV9HT0xEX0ZMQUcgPSAxIDw8IDMsCisgIEFPTV9CV0RfRkxBRyA9IDEgPDwgNCwKKyAgQU9NX0FMVDJfRkxBRyA9IDEgPDwgNSwKKyAgQU9NX0FMVF9GTEFHID0gMSA8PCA2LAorICBBT01fUkVGRlJBTUVfQUxMID0gKDEgPDwgNykgLSAxCit9IFVFTlVNMUJZVEUoQU9NX1JFRkZSQU1FKTsKKworVFlQRURFRiBlbnVtIHsKKyAgVU5JRElSX0NPTVBfUkVGRVJFTkNFLAorICBCSURJUl9DT01QX1JFRkVSRU5DRSwKKyAgQ09NUF9SRUZFUkVOQ0VfVFlQRVMsCit9IFVFTlVNMUJZVEUoQ09NUF9SRUZFUkVOQ0VfVFlQRSk7CisKKy8qZW51bSB7IFBMQU5FX1RZUEVfWSwgUExBTkVfVFlQRV9VViwgUExBTkVfVFlQRVMgfSBVRU5VTTFCWVRFKFBMQU5FX1RZUEUpOyovCisKKyNkZWZpbmUgQ0ZMX0FMUEhBQkVUX1NJWkVfTE9HMiA0CisjZGVmaW5lIENGTF9BTFBIQUJFVF9TSVpFICgxIDw8IENGTF9BTFBIQUJFVF9TSVpFX0xPRzIpCisjZGVmaW5lIENGTF9NQUdTX1NJWkUgKCgyIDw8IENGTF9BTFBIQUJFVF9TSVpFX0xPRzIpICsgMSkKKyNkZWZpbmUgQ0ZMX0lEWF9VKGlkeCkgKGlkeCA+PiBDRkxfQUxQSEFCRVRfU0laRV9MT0cyKQorI2RlZmluZSBDRkxfSURYX1YoaWR4KSAoaWR4ICYgKENGTF9BTFBIQUJFVF9TSVpFIC0gMSkpCisKKy8qZW51bSB7IENGTF9QUkVEX1UsIENGTF9QUkVEX1YsIENGTF9QUkVEX1BMQU5FUyB9IFVFTlVNMUJZVEUoQ0ZMX1BSRURfVFlQRSk7Ki8KKworVFlQRURFRiBlbnVtIHsKKyAgQ0ZMX1NJR05fWkVSTywKKyAgQ0ZMX1NJR05fTkVHLAorICBDRkxfU0lHTl9QT1MsCisgIENGTF9TSUdOUworfSBVRU5VTTFCWVRFKENGTF9TSUdOX1RZUEUpOworCitUWVBFREVGIGVudW0geworICBDRkxfRElTQUxMT1dFRCwKKyAgQ0ZMX0FMTE9XRUQsCisgIENGTF9BTExPV0VEX1RZUEVTCit9IFVFTlVNMUJZVEUoQ0ZMX0FMTE9XRURfVFlQRSk7CisKKy8vIENGTF9TSUdOX1pFUk8sQ0ZMX1NJR05fWkVSTyBpcyBpbnZhbGlkCisjZGVmaW5lIENGTF9KT0lOVF9TSUdOUyAoQ0ZMX1NJR05TICogQ0ZMX1NJR05TIC0gMSkKKy8vIENGTF9TSUdOX1UgaXMgZXF1aXZhbGVudCB0byAoanMgKyAxKSAvIDMgZm9yIGpzIGluIDAgdG8gOAorI2RlZmluZSBDRkxfU0lHTl9VKGpzKSAoKChqcyArIDEpICogMTEpID4+IDUpCisvLyBDRkxfU0lHTl9WIGlzIGVxdWl2YWxlbnQgdG8gKGpzICsgMSkgJSAzIGZvciBqcyBpbiAwIHRvIDgKKyNkZWZpbmUgQ0ZMX1NJR05fVihqcykgKChqcyArIDEpIC0gQ0ZMX1NJR05TICogQ0ZMX1NJR05fVShqcykpCisKKy8vIFRoZXJlIGlzIG5vIGNvbnRleHQgd2hlbiB0aGUgYWxwaGEgZm9yIGEgZ2l2ZW4gcGxhbmUgaXMgemVyby4KKy8vIFNvIHRoZXJlIGFyZSAyIGZld2VyIGNvbnRleHRzIHRoYW4gam9pbnQgc2lnbnMuCisjZGVmaW5lIENGTF9BTFBIQV9DT05URVhUUyAoQ0ZMX0pPSU5UX1NJR05TICsgMSAtIENGTF9TSUdOUykKKyNkZWZpbmUgQ0ZMX0NPTlRFWFRfVShqcykgKGpzICsgMSAtIENGTF9TSUdOUykKKy8vIEFsc28sIHRoZSBjb250ZXh0cyBhcmUgc3ltbWV0cmljIHVuZGVyIHN3YXBwaW5nIHRoZSBwbGFuZXMuCisjZGVmaW5lIENGTF9DT05URVhUX1YoanMpIFwKKyAgKENGTF9TSUdOX1YoanMpICogQ0ZMX1NJR05TICsgQ0ZMX1NJR05fVShqcykgLSBDRkxfU0lHTlMpCisKK1RZUEVERUYgZW51bSB7CisgIFBBTEVUVEVfTUFQLAorICBDT0xPUl9NQVBfVFlQRVMsCit9IFVFTlVNMUJZVEUoQ09MT1JfTUFQX1RZUEUpOworCitUWVBFREVGIGVudW0geworICBUV09fQ09MT1JTLAorICBUSFJFRV9DT0xPUlMsCisgIEZPVVJfQ09MT1JTLAorICBGSVZFX0NPTE9SUywKKyAgU0lYX0NPTE9SUywKKyAgU0VWRU5fQ09MT1JTLAorICBFSUdIVF9DT0xPUlMsCisgIFBBTEVUVEVfU0laRVMKK30gVUVOVU0xQllURShQQUxFVFRFX1NJWkUpOworCitUWVBFREVGIGVudW0geworICBQQUxFVFRFX0NPTE9SX09ORSwKKyAgUEFMRVRURV9DT0xPUl9UV08sCisgIFBBTEVUVEVfQ09MT1JfVEhSRUUsCisgIFBBTEVUVEVfQ09MT1JfRk9VUiwKKyAgUEFMRVRURV9DT0xPUl9GSVZFLAorICBQQUxFVFRFX0NPTE9SX1NJWCwKKyAgUEFMRVRURV9DT0xPUl9TRVZFTiwKKyAgUEFMRVRURV9DT0xPUl9FSUdIVCwKKyAgUEFMRVRURV9DT0xPUlMKK30gVUVOVU0xQllURShQQUxFVFRFX0NPTE9SKTsKKworLy8gTm90ZTogQWxsIGRpcmVjdGlvbmFsIHByZWRpY3RvcnMgbXVzdCBiZSBiZXR3ZWVuIFZfUFJFRCBhbmQgRDY3X1BSRUQgKGJvdGgKKy8vIGluY2x1c2l2ZSkuCitUWVBFREVGIGVudW0geworICBEQ19QUkVELCAgICAgICAgLy8gQXZlcmFnZSBvZiBhYm92ZSBhbmQgbGVmdCBwaXhlbHMKKyAgVl9QUkVELCAgICAgICAgIC8vIFZlcnRpY2FsCisgIEhfUFJFRCwgICAgICAgICAvLyBIb3Jpem9udGFsCisgIEQ0NV9QUkVELCAgICAgICAvLyBEaXJlY3Rpb25hbCA0NSAgZGVncmVlCisgIEQxMzVfUFJFRCwgICAgICAvLyBEaXJlY3Rpb25hbCAxMzUgZGVncmVlCisgIEQxMTNfUFJFRCwgICAgICAvLyBEaXJlY3Rpb25hbCAxMTMgZGVncmVlCisgIEQxNTdfUFJFRCwgICAgICAvLyBEaXJlY3Rpb25hbCAxNTcgZGVncmVlCisgIEQyMDNfUFJFRCwgICAgICAvLyBEaXJlY3Rpb25hbCAyMDMgZGVncmVlCisgIEQ2N19QUkVELCAgICAgICAvLyBEaXJlY3Rpb25hbCA2NyAgZGVncmVlCisgIFNNT09USF9QUkVELCAgICAvLyBDb21iaW5hdGlvbiBvZiBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCisgIFNNT09USF9WX1BSRUQsICAvLyBWZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCisgIFNNT09USF9IX1BSRUQsICAvLyBIb3Jpem9udGFsIGludGVycG9sYXRpb24KKyAgUEFFVEhfUFJFRCwgICAgIC8vIFByZWRpY3QgZnJvbSB0aGUgZGlyZWN0aW9uIG9mIHNtYWxsZXN0IGdyYWRpZW50CisgIE5FQVJFU1RNViwKKyAgTkVBUk1WLAorICBHTE9CQUxNViwKKyAgTkVXTVYsCisgIC8vIENvbXBvdW5kIHJlZiBjb21wb3VuZCBtb2RlcworICBORUFSRVNUX05FQVJFU1RNViwKKyAgTkVBUl9ORUFSTVYsCisgIE5FQVJFU1RfTkVXTVYsCisgIE5FV19ORUFSRVNUTVYsCisgIE5FQVJfTkVXTVYsCisgIE5FV19ORUFSTVYsCisgIEdMT0JBTF9HTE9CQUxNViwKKyAgTkVXX05FV01WLAorICBNQl9NT0RFX0NPVU5ULAorICBJTlRSQV9NT0RFX1NUQVJUID0gRENfUFJFRCwKKyAgSU5UUkFfTU9ERV9FTkQgPSBORUFSRVNUTVYsCisgIElOVFJBX01PREVfTlVNID0gSU5UUkFfTU9ERV9FTkQgLSBJTlRSQV9NT0RFX1NUQVJULAorICBTSU5HTEVfSU5URVJfTU9ERV9TVEFSVCA9IE5FQVJFU1RNViwKKyAgU0lOR0xFX0lOVEVSX01PREVfRU5EID0gTkVBUkVTVF9ORUFSRVNUTVYsCisgIFNJTkdMRV9JTlRFUl9NT0RFX05VTSA9IFNJTkdMRV9JTlRFUl9NT0RFX0VORCAtIFNJTkdMRV9JTlRFUl9NT0RFX1NUQVJULAorICBDT01QX0lOVEVSX01PREVfU1RBUlQgPSBORUFSRVNUX05FQVJFU1RNViwKKyAgQ09NUF9JTlRFUl9NT0RFX0VORCA9IE1CX01PREVfQ09VTlQsCisgIENPTVBfSU5URVJfTU9ERV9OVU0gPSBDT01QX0lOVEVSX01PREVfRU5EIC0gQ09NUF9JTlRFUl9NT0RFX1NUQVJULAorICBJTlRFUl9NT0RFX1NUQVJUID0gTkVBUkVTVE1WLAorICBJTlRFUl9NT0RFX0VORCA9IE1CX01PREVfQ09VTlQsCisgIElOVFJBX01PREVTID0gUEFFVEhfUFJFRCArIDEsICAvLyBQQUVUSF9QUkVEIGhhcyB0byBiZSB0aGUgbGFzdCBpbnRyYSBtb2RlLgorICBJTlRSQV9JTlZBTElEID0gTUJfTU9ERV9DT1VOVCAgLy8gRm9yIHV2X21vZGUgaW4gaW50ZXIgYmxvY2tzCit9IFVFTlVNMUJZVEUoUFJFRElDVElPTl9NT0RFKTsKKworLy8gVE9ETyhsdHJ1ZGVhdSkgRG8gd2UgcmVhbGx5IHdhbnQgdG8gcGFjayB0aGlzPworLy8gVE9ETyhsdHJ1ZGVhdSkgRG8gd2UgbWF0Y2ggd2l0aCBQUkVESUNUSU9OX01PREU/CitUWVBFREVGIGVudW0geworICBVVl9EQ19QUkVELCAgICAgICAgLy8gQXZlcmFnZSBvZiBhYm92ZSBhbmQgbGVmdCBwaXhlbHMKKyAgVVZfVl9QUkVELCAgICAgICAgIC8vIFZlcnRpY2FsCisgIFVWX0hfUFJFRCwgICAgICAgICAvLyBIb3Jpem9udGFsCisgIFVWX0Q0NV9QUkVELCAgICAgICAvLyBEaXJlY3Rpb25hbCA0NSAgZGVncmVlCisgIFVWX0QxMzVfUFJFRCwgICAgICAvLyBEaXJlY3Rpb25hbCAxMzUgZGVncmVlCisgIFVWX0QxMTNfUFJFRCwgICAgICAvLyBEaXJlY3Rpb25hbCAxMTMgZGVncmVlCisgIFVWX0QxNTdfUFJFRCwgICAgICAvLyBEaXJlY3Rpb25hbCAxNTcgZGVncmVlCisgIFVWX0QyMDNfUFJFRCwgICAgICAvLyBEaXJlY3Rpb25hbCAyMDMgZGVncmVlCisgIFVWX0Q2N19QUkVELCAgICAgICAvLyBEaXJlY3Rpb25hbCA2NyAgZGVncmVlCisgIFVWX1NNT09USF9QUkVELCAgICAvLyBDb21iaW5hdGlvbiBvZiBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCisgIFVWX1NNT09USF9WX1BSRUQsICAvLyBWZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCisgIFVWX1NNT09USF9IX1BSRUQsICAvLyBIb3Jpem9udGFsIGludGVycG9sYXRpb24KKyAgVVZfUEFFVEhfUFJFRCwgICAgIC8vIFByZWRpY3QgZnJvbSB0aGUgZGlyZWN0aW9uIG9mIHNtYWxsZXN0IGdyYWRpZW50CisgIFVWX0NGTF9QUkVELCAgICAgICAvLyBDaHJvbWEtZnJvbS1MdW1hCisgIFVWX0lOVFJBX01PREVTLAorICBVVl9NT0RFX0lOVkFMSUQsICAvLyBGb3IgdXZfbW9kZSBpbiBpbnRlciBibG9ja3MKK30gVUVOVU0xQllURShVVl9QUkVESUNUSU9OX01PREUpOworCitUWVBFREVGIGVudW0geworICBTSU1QTEVfVFJBTlNMQVRJT04sCisgIE9CTUNfQ0FVU0FMLCAgICAvLyAyLXNpZGVkIE9CTUMKKyAgV0FSUEVEX0NBVVNBTCwgIC8vIDItc2lkZWQgV0FSUEVECisgIE1PVElPTl9NT0RFUworfSBVRU5VTTFCWVRFKE1PVElPTl9NT0RFKTsKKworVFlQRURFRiBlbnVtIHsKKyAgSUlfRENfUFJFRCwKKyAgSUlfVl9QUkVELAorICBJSV9IX1BSRUQsCisgIElJX1NNT09USF9QUkVELAorICBJTlRFUklOVFJBX01PREVTCit9IFVFTlVNMUJZVEUoSU5URVJJTlRSQV9NT0RFKTsKKworVFlQRURFRiBlbnVtIHsKKyAgQ09NUE9VTkRfQVZFUkFHRSwKKyAgQ09NUE9VTkRfRElTVFdURCwKKyAgQ09NUE9VTkRfV0VER0UsCisgIENPTVBPVU5EX0RJRkZXVEQsCisgIENPTVBPVU5EX1RZUEVTLAorICBNQVNLRURfQ09NUE9VTkRfVFlQRVMgPSAyLAorfSBVRU5VTTFCWVRFKENPTVBPVU5EX1RZUEUpOworCitUWVBFREVGIGVudW0geworICBGSUxURVJfRENfUFJFRCwKKyAgRklMVEVSX1ZfUFJFRCwKKyAgRklMVEVSX0hfUFJFRCwKKyAgRklMVEVSX0QxNTdfUFJFRCwKKyAgRklMVEVSX1BBRVRIX1BSRUQsCisgIEZJTFRFUl9JTlRSQV9NT0RFUywKK30gVUVOVU0xQllURShGSUxURVJfSU5UUkFfTU9ERSk7CisKK1RZUEVERUYgZW51bSB7CisgIFNFUV9MRVZFTF8yXzAsCisgIFNFUV9MRVZFTF8yXzEsCisgIFNFUV9MRVZFTF8yXzIsCisgIFNFUV9MRVZFTF8yXzMsCisgIFNFUV9MRVZFTF8zXzAsCisgIFNFUV9MRVZFTF8zXzEsCisgIFNFUV9MRVZFTF8zXzIsCisgIFNFUV9MRVZFTF8zXzMsCisgIFNFUV9MRVZFTF80XzAsCisgIFNFUV9MRVZFTF80XzEsCisgIFNFUV9MRVZFTF80XzIsCisgIFNFUV9MRVZFTF80XzMsCisgIFNFUV9MRVZFTF81XzAsCisgIFNFUV9MRVZFTF81XzEsCisgIFNFUV9MRVZFTF81XzIsCisgIFNFUV9MRVZFTF81XzMsCisgIFNFUV9MRVZFTF82XzAsCisgIFNFUV9MRVZFTF82XzEsCisgIFNFUV9MRVZFTF82XzIsCisgIFNFUV9MRVZFTF82XzMsCisgIFNFUV9MRVZFTF83XzAsCisgIFNFUV9MRVZFTF83XzEsCisgIFNFUV9MRVZFTF83XzIsCisgIFNFUV9MRVZFTF83XzMsCisgIFNFUV9MRVZFTFMsCisgIFNFUV9MRVZFTF9NQVggPSAzMQorfSBVRU5VTTFCWVRFKEFWMV9MRVZFTCk7CisKKyNkZWZpbmUgTEVWRUxfQklUUyA1CisKKyNkZWZpbmUgRElSRUNUSU9OQUxfTU9ERVMgOAorI2RlZmluZSBNQVhfQU5HTEVfREVMVEEgMworI2RlZmluZSBBTkdMRV9TVEVQIDMKKworI2RlZmluZSBJTlRFUl9NT0RFUyAoMSArIE5FV01WIC0gTkVBUkVTVE1WKQorCisjZGVmaW5lIElOVEVSX0NPTVBPVU5EX01PREVTICgxICsgTkVXX05FV01WIC0gTkVBUkVTVF9ORUFSRVNUTVYpCisKKyNkZWZpbmUgU0tJUF9DT05URVhUUyAzCisjZGVmaW5lIFNLSVBfTU9ERV9DT05URVhUUyAzCisKKyNkZWZpbmUgQ09NUF9JTkRFWF9DT05URVhUUyA2CisjZGVmaW5lIENPTVBfR1JPVVBfSURYX0NPTlRFWFRTIDYKKworI2RlZmluZSBOTVZfQ09OVEVYVFMgMworCisjZGVmaW5lIE5FV01WX01PREVfQ09OVEVYVFMgNgorI2RlZmluZSBHTE9CQUxNVl9NT0RFX0NPTlRFWFRTIDIKKyNkZWZpbmUgUkVGTVZfTU9ERV9DT05URVhUUyA2CisjZGVmaW5lIERSTF9NT0RFX0NPTlRFWFRTIDMKKworI2RlZmluZSBHTE9CQUxNVl9PRkZTRVQgMworI2RlZmluZSBSRUZNVl9PRkZTRVQgNAorCisjZGVmaW5lIE5FV01WX0NUWF9NQVNLICgoMSA8PCBHTE9CQUxNVl9PRkZTRVQpIC0gMSkKKyNkZWZpbmUgR0xPQkFMTVZfQ1RYX01BU0sgKCgxIDw8IChSRUZNVl9PRkZTRVQgLSBHTE9CQUxNVl9PRkZTRVQpKSAtIDEpCisjZGVmaW5lIFJFRk1WX0NUWF9NQVNLICgoMSA8PCAoOCAtIFJFRk1WX09GRlNFVCkpIC0gMSkKKworI2RlZmluZSBDT01QX05FV01WX0NUWFMgNQorI2RlZmluZSBJTlRFUl9NT0RFX0NPTlRFWFRTIDgKKworI2RlZmluZSBERUxUQV9RX1NNQUxMIDMKKyNkZWZpbmUgREVMVEFfUV9QUk9CUyAoREVMVEFfUV9TTUFMTCkKKyNkZWZpbmUgREVGQVVMVF9ERUxUQV9RX1JFU19QRVJDRVBUVUFMIDQKKyNkZWZpbmUgREVGQVVMVF9ERUxUQV9RX1JFU19PQkpFQ1RJVkUgNAorCisjZGVmaW5lIERFTFRBX0xGX1NNQUxMIDMKKyNkZWZpbmUgREVMVEFfTEZfUFJPQlMgKERFTFRBX0xGX1NNQUxMKQorI2RlZmluZSBERUZBVUxUX0RFTFRBX0xGX1JFUyAyCisKKy8qIFNlZ21lbnQgRmVhdHVyZSBNYXNrcyAqLworI2RlZmluZSBNQVhfTVZfUkVGX0NBTkRJREFURVMgMgorCisjZGVmaW5lIE1BWF9SRUZfTVZfU1RBQ0tfU0laRSA4CisjZGVmaW5lIFJFRl9DQVRfTEVWRUwgNjQwCisKKyNkZWZpbmUgSU5UUkFfSU5URVJfQ09OVEVYVFMgNAorI2RlZmluZSBDT01QX0lOVEVSX0NPTlRFWFRTIDUKKyNkZWZpbmUgUkVGX0NPTlRFWFRTIDMKKworI2RlZmluZSBDT01QX1JFRl9UWVBFX0NPTlRFWFRTIDUKKyNkZWZpbmUgVU5JX0NPTVBfUkVGX0NPTlRFWFRTIDMKKworI2RlZmluZSBUWEZNX1BBUlRJVElPTl9DT05URVhUUyAoKFRYX1NJWkVTIC0gVFhfOFg4KSAqIDYgLSAzKQorI2lmZGVmIE9SSV9DT0RFCit0eXBlZGVmIHVpbnQ4X3QgVFhGTV9DT05URVhUOworI2VuZGlmCisvLyBBbiBlbnVtIGZvciBzaW5nbGUgcmVmZXJlbmNlIHR5cGVzIChhbmQgc29tZSBkZXJpdmVkIHZhbHVlcykuCitlbnVtIHsKKyAgTk9ORV9GUkFNRSA9IC0xLAorICBJTlRSQV9GUkFNRSwKKyAgTEFTVF9GUkFNRSwKKyAgTEFTVDJfRlJBTUUsCisgIExBU1QzX0ZSQU1FLAorICBHT0xERU5fRlJBTUUsCisgIEJXRFJFRl9GUkFNRSwKKyAgQUxUUkVGMl9GUkFNRSwKKyAgQUxUUkVGX0ZSQU1FLAorICBSRUZfRlJBTUVTLAorCisgIC8vIEV4dHJhL3NjcmF0Y2ggcmVmZXJlbmNlIGZyYW1lLiBJdCBtYXkgYmU6CisgIC8vIC0gdXNlZCB0byB1cGRhdGUgdGhlIEFMVFJFRjJfRlJBTUUgcmVmIChzZWUgbHNoaWZ0X2J3ZF9yZWZfZnJhbWVzKCkpLCBvcgorICAvLyAtIHVwZGF0ZWQgZnJvbSBBTFRSRUYyX0ZSQU1FIHJlZiAoc2VlIHJzaGlmdF9id2RfcmVmX2ZyYW1lcygpKS4KKyAgRVhUUkVGX0ZSQU1FID0gUkVGX0ZSQU1FUywKKworICAvLyBOdW1iZXIgb2YgaW50ZXIgKG5vbi1pbnRyYSkgcmVmZXJlbmNlIHR5cGVzLgorICBJTlRFUl9SRUZTX1BFUl9GUkFNRSA9IEFMVFJFRl9GUkFNRSAtIExBU1RfRlJBTUUgKyAxLAorCisgIC8vIE51bWJlciBvZiBmb3J3YXJkIChha2EgcGFzdCkgcmVmZXJlbmNlIHR5cGVzLgorICBGV0RfUkVGUyA9IEdPTERFTl9GUkFNRSAtIExBU1RfRlJBTUUgKyAxLAorCisgIC8vIE51bWJlciBvZiBiYWNrd2FyZCAoYWthIGZ1dHVyZSkgcmVmZXJlbmNlIHR5cGVzLgorICBCV0RfUkVGUyA9IEFMVFJFRl9GUkFNRSAtIEJXRFJFRl9GUkFNRSArIDEsCisKKyAgU0lOR0xFX1JFRlMgPSBGV0RfUkVGUyArIEJXRF9SRUZTLAorfTsKKworI2RlZmluZSBSRUZfRlJBTUVTX0xPRzIgMworCisvLyBSRUZfRlJBTUVTIGZvciB0aGUgY20tPnJlZl9mcmFtZV9tYXAgYXJyYXksIDEgc2NyYXRjaCBmcmFtZSBmb3IgdGhlIG5ldworLy8gZnJhbWUgaW4gY20tPmN1cl9mcmFtZSwgSU5URVJfUkVGU19QRVJfRlJBTUUgZm9yIHNjYWxlZCByZWZlcmVuY2VzIG9uIHRoZQorLy8gZW5jb2RlciBpbiB0aGUgY3BpLT5zY2FsZWRfcmVmX2J1ZiBhcnJheS4KKyNkZWZpbmUgRlJBTUVfQlVGRkVSUyAoUkVGX0ZSQU1FUyArIDEgKyBJTlRFUl9SRUZTX1BFUl9GUkFNRSkKKworI2RlZmluZSBGV0RfUkZfT0ZGU0VUKHJlZikgKHJlZiAtIExBU1RfRlJBTUUpCisjZGVmaW5lIEJXRF9SRl9PRkZTRVQocmVmKSAocmVmIC0gQldEUkVGX0ZSQU1FKQorCitUWVBFREVGIGVudW0geworICBMQVNUX0xBU1QyX0ZSQU1FUywgICAgICAvLyB7IExBU1RfRlJBTUUsIExBU1QyX0ZSQU1FIH0KKyAgTEFTVF9MQVNUM19GUkFNRVMsICAgICAgLy8geyBMQVNUX0ZSQU1FLCBMQVNUM19GUkFNRSB9CisgIExBU1RfR09MREVOX0ZSQU1FUywgICAgIC8vIHsgTEFTVF9GUkFNRSwgR09MREVOX0ZSQU1FIH0KKyAgQldEUkVGX0FMVFJFRl9GUkFNRVMsICAgLy8geyBCV0RSRUZfRlJBTUUsIEFMVFJFRl9GUkFNRSB9CisgIExBU1QyX0xBU1QzX0ZSQU1FUywgICAgIC8vIHsgTEFTVDJfRlJBTUUsIExBU1QzX0ZSQU1FIH0KKyAgTEFTVDJfR09MREVOX0ZSQU1FUywgICAgLy8geyBMQVNUMl9GUkFNRSwgR09MREVOX0ZSQU1FIH0KKyAgTEFTVDNfR09MREVOX0ZSQU1FUywgICAgLy8geyBMQVNUM19GUkFNRSwgR09MREVOX0ZSQU1FIH0KKyAgQldEUkVGX0FMVFJFRjJfRlJBTUVTLCAgLy8geyBCV0RSRUZfRlJBTUUsIEFMVFJFRjJfRlJBTUUgfQorICBBTFRSRUYyX0FMVFJFRl9GUkFNRVMsICAvLyB7IEFMVFJFRjJfRlJBTUUsIEFMVFJFRl9GUkFNRSB9CisgIFRPVEFMX1VOSURJUl9DT01QX1JFRlMsCisgIC8vIE5PVEU6IFVOSURJUl9DT01QX1JFRlMgaXMgdGhlIG51bWJlciBvZiB1bmktZGlyZWN0aW9uYWwgcmVmZXJlbmNlIHBhaXJzCisgIC8vICAgICAgIHRoYXQgYXJlIGV4cGxpY2l0bHkgc2lnbmFsZWQuCisgIFVOSURJUl9DT01QX1JFRlMgPSBCV0RSRUZfQUxUUkVGX0ZSQU1FUyArIDEsCit9IFVFTlVNMUJZVEUoVU5JRElSX0NPTVBfUkVGKTsKKworI2RlZmluZSBUT1RBTF9DT01QX1JFRlMgKEZXRF9SRUZTICogQldEX1JFRlMgKyBUT1RBTF9VTklESVJfQ09NUF9SRUZTKQorCisjZGVmaW5lIENPTVBfUkVGUyAoRldEX1JFRlMgKiBCV0RfUkVGUyArIFVOSURJUl9DT01QX1JFRlMpCisKKy8vIE5PVEU6IEEgbGltaXRlZCBudW1iZXIgb2YgdW5pZGlyZWN0aW9uYWwgcmVmZXJlbmNlIHBhaXJzIGNhbiBiZSBzaWduYWxsZWQgZm9yCisvLyAgICAgICBjb21wb3VuZCBwcmVkaWN0aW9uLiBUaGUgdXNlIG9mIHNraXAgbW9kZSwgb24gdGhlIG90aGVyIGhhbmQsIG1ha2VzIGl0CisvLyAgICAgICBwb3NzaWJsZSB0byBoYXZlIGEgcmVmZXJlbmNlIHBhaXIgbm90IGxpc3RlZCBmb3IgZXhwbGljaXQgc2lnbmFsaW5nLgorI2RlZmluZSBNT0RFX0NUWF9SRUZfRlJBTUVTIChSRUZfRlJBTUVTICsgVE9UQUxfQ09NUF9SRUZTKQorCisvLyBOb3RlOiBJdCBpbmNsdWRlcyBzaW5nbGUgYW5kIGNvbXBvdW5kIHJlZmVyZW5jZXMuIFNvLCBpdCBjYW4gdGFrZSB2YWx1ZXMgZnJvbQorLy8gTk9ORV9GUkFNRSB0byAoTU9ERV9DVFhfUkVGX0ZSQU1FUyAtIDEpLiBIZW5jZSwgaXQgaXMgbm90IGRlZmluZWQgYXMgYW4gZW51bS4KK3R5cGVkZWYgaW50OF90IE1WX1JFRkVSRU5DRV9GUkFNRTsKKworVFlQRURFRiBlbnVtIHsKKyAgUkVTVE9SRV9OT05FLAorICBSRVNUT1JFX1dJRU5FUiwKKyAgUkVTVE9SRV9TR1JQUk9KLAorICBSRVNUT1JFX1NXSVRDSEFCTEUsCisgIFJFU1RPUkVfU1dJVENIQUJMRV9UWVBFUyA9IFJFU1RPUkVfU1dJVENIQUJMRSwKKyAgUkVTVE9SRV9UWVBFUyA9IDQsCit9IFVFTlVNMUJZVEUoUmVzdG9yYXRpb25UeXBlKTsKKworLy8gUGljdHVyZSBwcmVkaWN0aW9uIHN0cnVjdHVyZXMgKDAtMTIgYXJlIHByZWRlZmluZWQpIGluIHNjYWxhYmlsaXR5IG1ldGFkYXRhLgorVFlQRURFRiBlbnVtIHsKKyAgU0NBTEFCSUxJVFlfTDFUMiA9IDAsCisgIFNDQUxBQklMSVRZX0wxVDMgPSAxLAorICBTQ0FMQUJJTElUWV9MMlQxID0gMiwKKyAgU0NBTEFCSUxJVFlfTDJUMiA9IDMsCisgIFNDQUxBQklMSVRZX0wyVDMgPSA0LAorICBTQ0FMQUJJTElUWV9TMlQxID0gNSwKKyAgU0NBTEFCSUxJVFlfUzJUMiA9IDYsCisgIFNDQUxBQklMSVRZX1MyVDMgPSA3LAorICBTQ0FMQUJJTElUWV9MMlQxaCA9IDgsCisgIFNDQUxBQklMSVRZX0wyVDJoID0gOSwKKyAgU0NBTEFCSUxJVFlfTDJUM2ggPSAxMCwKKyAgU0NBTEFCSUxJVFlfUzJUMWggPSAxMSwKKyAgU0NBTEFCSUxJVFlfUzJUMmggPSAxMiwKKyAgU0NBTEFCSUxJVFlfUzJUM2ggPSAxMywKKyAgU0NBTEFCSUxJVFlfU1MgPSAxNAorfSBVRU5VTTFCWVRFKFNDQUxBQklMSVRZX1NUUlVDVFVSRVMpOworCisjZGVmaW5lIFNVUEVSUkVTX1NDQUxFX0JJVFMgMworI2RlZmluZSBTVVBFUlJFU19TQ0FMRV9ERU5PTUlOQVRPUl9NSU4gKFNDQUxFX05VTUVSQVRPUiArIDEpCisKKy8vIEluIGxhcmdlX3NjYWxlX3RpbGUgY29kaW5nLCBleHRlcm5hbCByZWZlcmVuY2VzIGFyZSB1c2VkLgorI2RlZmluZSBNQVhfRVhURVJOQUxfUkVGRVJFTkNFUyAxMjgKKyNkZWZpbmUgTUFYX1RJTEVTIDUxMgorCisKKyNkZWZpbmUgQ09ORklHX01VTFRJVEhSRUFEIDAKKyNkZWZpbmUgQ09ORklHX0VOVFJPUFlfU1RBVFMgMAorCisjZGVmaW5lIENPTkZJR19NQVhfREVDT0RFX1BST0ZJTEUgMgorCisvKgorZnJvbToKK3NlZ19jb21tb24uaAorKi8KKyNpZmRlZiBPUklfQ09ERQorCisjZGVmaW5lIE1BWF9TRUdNRU5UUyA4CisjZGVmaW5lIFNFR19UUkVFX1BST0JTIChNQVhfU0VHTUVOVFMgLSAxKQorCisjZGVmaW5lIFNFR19URU1QT1JBTF9QUkVEX0NUWFMgMworI2RlZmluZSBTUEFUSUFMX1BSRURJQ1RJT05fUFJPQlMgMworCitlbnVtIHsKKyAgU0VHX0xWTF9BTFRfUSwgICAgICAgLy8gVXNlIGFsdGVybmF0ZSBRdWFudGl6ZXIgLi4uLgorICBTRUdfTFZMX0FMVF9MRl9ZX1YsICAvLyBVc2UgYWx0ZXJuYXRlIGxvb3AgZmlsdGVyIHZhbHVlIG9uIHkgcGxhbmUgdmVydGljYWwKKyAgU0VHX0xWTF9BTFRfTEZfWV9ILCAgLy8gVXNlIGFsdGVybmF0ZSBsb29wIGZpbHRlciB2YWx1ZSBvbiB5IHBsYW5lIGhvcml6b250YWwKKyAgU0VHX0xWTF9BTFRfTEZfVSwgICAgLy8gVXNlIGFsdGVybmF0ZSBsb29wIGZpbHRlciB2YWx1ZSBvbiB1IHBsYW5lCisgIFNFR19MVkxfQUxUX0xGX1YsICAgIC8vIFVzZSBhbHRlcm5hdGUgbG9vcCBmaWx0ZXIgdmFsdWUgb24gdiBwbGFuZQorICBTRUdfTFZMX1JFRl9GUkFNRSwgICAvLyBPcHRpb25hbCBTZWdtZW50IHJlZmVyZW5jZSBmcmFtZQorICBTRUdfTFZMX1NLSVAsICAgICAgICAvLyBPcHRpb25hbCBTZWdtZW50ICgwLDApICsgc2tpcCBtb2RlCisgIFNFR19MVkxfR0xPQkFMTVYsCisgIFNFR19MVkxfTUFYCit9IFVFTlVNMUJZVEUoU0VHX0xWTF9GRUFUVVJFUyk7CisKK3N0cnVjdCBzZWdtZW50YXRpb24geworICB1aW50OF90IGVuYWJsZWQ7CisgIHVpbnQ4X3QgdXBkYXRlX21hcDsKKyAgdWludDhfdCB1cGRhdGVfZGF0YTsKKyAgdWludDhfdCB0ZW1wb3JhbF91cGRhdGU7CisKKyAgaW50MTZfdCBmZWF0dXJlX2RhdGFbTUFYX1NFR01FTlRTXVtTRUdfTFZMX01BWF07CisgIHVuc2lnbmVkIGludCBmZWF0dXJlX21hc2tbTUFYX1NFR01FTlRTXTsKKyAgaW50IGxhc3RfYWN0aXZlX3NlZ2lkOyAgLy8gVGhlIGhpZ2hlc3QgbnVtYmVyZWQgc2VnbWVudCBpZCB0aGF0IGhhcyBzb21lCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuYWJsZWQgZmVhdHVyZS4KKyAgdWludDhfdCBzZWdpZF9wcmVza2lwOyAgLy8gV2hldGhlciB0aGUgc2VnbWVudCBpZCB3aWxsIGJlIHJlYWQgYmVmb3JlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwIHN5bnRheCBlbGVtZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxOiB0aGUgc2VnbWVudCBpZCB3aWxsIGJlIHJlYWQgZmlyc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDA6IHRoZSBza2lwIHN5bnRheCBlbGVtZW50IHdpbGwgYmUgcmVhZCBmaXJzdC4KK307CisKKy8qCitmcm9tIGF2MV9sb29wZmlsdGVyLmgKKyovCisjZGVmaW5lIE1BWF9MT09QX0ZJTFRFUiA2MworCisKKy8qIGZyb20KK3F1YW50X2NvbW1vbi5oOgorKi8KKyNkZWZpbmUgTUFYUSAyNTUKKworI2VuZGlmCisKKy8qCitmcm9tOgorYW9tL2F2MS9jb21tb24vY29tbW9uLmgKKyovCisjZGVmaW5lIGF2MV96ZXJvKGRlc3QpIG1lbXNldCgmKGRlc3QpLCAwLCBzaXplb2YoZGVzdCkpCisjZGVmaW5lIGF2MV96ZXJvX2FycmF5KGRlc3QsIG4pIG1lbXNldChkZXN0LCAwLCBuICogc2l6ZW9mKCooZGVzdCkpKQorLyoKK2Zyb206Cithb20vYXYxL2NvbW1vbi9hbGxvY2NvbW1vbi5oCisqLworI2RlZmluZSBJTlZBTElEX0lEWCAtMSAgLy8gSW52YWxpZCBidWZmZXIgaW5kZXguCisKKy8qCitmcm9tOgorYW9tL2F2MS9jb21tb24vdGltaW5nLmgKKyovCit0eXBlZGVmIHN0cnVjdCBhb21fdGltaW5nIHsKKyAgdWludDMyX3QgbnVtX3VuaXRzX2luX2Rpc3BsYXlfdGljazsKKyAgdWludDMyX3QgdGltZV9zY2FsZTsKKyAgaW50IGVxdWFsX3BpY3R1cmVfaW50ZXJ2YWw7CisgIHVpbnQzMl90IG51bV90aWNrc19wZXJfcGljdHVyZTsKK30gYW9tX3RpbWluZ19pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IGFvbV9kZWNfbW9kZWxfaW5mbyB7CisgIHVpbnQzMl90IG51bV91bml0c19pbl9kZWNvZGluZ190aWNrOworICBpbnQgZW5jb2Rlcl9kZWNvZGVyX2J1ZmZlcl9kZWxheV9sZW5ndGg7CisgIGludCBidWZmZXJfcmVtb3ZhbF90aW1lX2xlbmd0aDsKKyAgaW50IGZyYW1lX3ByZXNlbnRhdGlvbl90aW1lX2xlbmd0aDsKK30gYW9tX2RlY19tb2RlbF9pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IGFvbV9kZWNfbW9kZWxfb3BfcGFyYW1ldGVycyB7CisgIGludCBkZWNvZGVyX21vZGVsX3BhcmFtX3ByZXNlbnRfZmxhZzsKKyAgaW50NjRfdCBiaXRyYXRlOworICBpbnQ2NF90IGJ1ZmZlcl9zaXplOworICB1aW50MzJfdCBkZWNvZGVyX2J1ZmZlcl9kZWxheTsKKyAgdWludDMyX3QgZW5jb2Rlcl9idWZmZXJfZGVsYXk7CisgIGludCBsb3dfZGVsYXlfbW9kZV9mbGFnOworICBpbnQgZGlzcGxheV9tb2RlbF9wYXJhbV9wcmVzZW50X2ZsYWc7CisgIGludCBpbml0aWFsX2Rpc3BsYXlfZGVsYXk7Cit9IGFvbV9kZWNfbW9kZWxfb3BfcGFyYW1ldGVyc190OworCit0eXBlZGVmIHN0cnVjdCBhb21fb3BfdGltaW5nX2luZm9fdCB7CisgIHVpbnQzMl90IGJ1ZmZlcl9yZW1vdmFsX3RpbWU7Cit9IGFvbV9vcF90aW1pbmdfaW5mb190OworLyoKK2Zyb206Cithb20vYW9tX2NvZGVjLmgKKyovCisvKiFcYnJpZWYgT0JVIHR5cGVzLiAqLwordHlwZWRlZiBlbnVtIHsKKyAgT0JVX1NFUVVFTkNFX0hFQURFUiA9IDEsCisgIE9CVV9URU1QT1JBTF9ERUxJTUlURVIgPSAyLAorICBPQlVfRlJBTUVfSEVBREVSID0gMywKKyAgT0JVX1RJTEVfR1JPVVAgPSA0LAorICBPQlVfTUVUQURBVEEgPSA1LAorICBPQlVfRlJBTUUgPSA2LAorICBPQlVfUkVEVU5EQU5UX0ZSQU1FX0hFQURFUiA9IDcsCisgIE9CVV9USUxFX0xJU1QgPSA4LAorICBPQlVfUEFERElORyA9IDE1LAorfSBPQlVfVFlQRTsKKwordHlwZWRlZiBlbnVtIGFvbV9iaXRfZGVwdGggeworICBBT01fQklUU184ID0gOCwgICAvKio8ICA4IGJpdHMgKi8KKyAgQU9NX0JJVFNfMTAgPSAxMCwgLyoqPCAxMCBiaXRzICovCisgIEFPTV9CSVRTXzEyID0gMTIsIC8qKjwgMTIgYml0cyAqLworfSBhb21fYml0X2RlcHRoX3Q7CisKKy8qIVxicmllZiBBbGdvcml0aG0gcmV0dXJuIGNvZGVzICovCit0eXBlZGVmIGVudW0geworICAvKiFcYnJpZWYgT3BlcmF0aW9uIGNvbXBsZXRlZCB3aXRob3V0IGVycm9yICovCisgIEFPTV9DT0RFQ19PSywKKworICAvKiFcYnJpZWYgVW5zcGVjaWZpZWQgZXJyb3IgKi8KKyAgQU9NX0NPREVDX0VSUk9SLAorCisgIC8qIVxicmllZiBNZW1vcnkgb3BlcmF0aW9uIGZhaWxlZCAqLworICBBT01fQ09ERUNfTUVNX0VSUk9SLAorCisgIC8qIVxicmllZiBBQkkgdmVyc2lvbiBtaXNtYXRjaCAqLworICBBT01fQ09ERUNfQUJJX01JU01BVENILAorCisgIC8qIVxicmllZiBBbGdvcml0aG0gZG9lcyBub3QgaGF2ZSByZXF1aXJlZCBjYXBhYmlsaXR5ICovCisgIEFPTV9DT0RFQ19JTkNBUEFCTEUsCisKKyAgLyohXGJyaWVmIFRoZSBnaXZlbiBiaXRzdHJlYW0gaXMgbm90IHN1cHBvcnRlZC4KKyAgICoKKyAgICogVGhlIGJpdHN0cmVhbSB3YXMgdW5hYmxlIHRvIGJlIHBhcnNlZCBhdCB0aGUgaGlnaGVzdCBsZXZlbC4gVGhlIGRlY29kZXIKKyAgICogaXMgdW5hYmxlIHRvIHByb2NlZWQuIFRoaXMgZXJyb3IgXHJlZiBTSE9VTEQgYmUgdHJlYXRlZCBhcyBmYXRhbCB0byB0aGUKKyAgICogc3RyZWFtLiAqLworICBBT01fQ09ERUNfVU5TVVBfQklUU1RSRUFNLAorCisgIC8qIVxicmllZiBFbmNvZGVkIGJpdHN0cmVhbSB1c2VzIGFuIHVuc3VwcG9ydGVkIGZlYXR1cmUKKyAgICoKKyAgICogVGhlIGRlY29kZXIgZG9lcyBub3QgaW1wbGVtZW50IGEgZmVhdHVyZSByZXF1aXJlZCBieSB0aGUgZW5jb2Rlci4gVGhpcworICAgKiByZXR1cm4gY29kZSBzaG91bGQgb25seSBiZSB1c2VkIGZvciBmZWF0dXJlcyB0aGF0IHByZXZlbnQgZnV0dXJlCisgICAqIHBpY3R1cmVzIGZyb20gYmVpbmcgcHJvcGVybHkgZGVjb2RlZC4gVGhpcyBlcnJvciBccmVmIE1BWSBiZSB0cmVhdGVkIGFzCisgICAqIGZhdGFsIHRvIHRoZSBzdHJlYW0gb3IgXHJlZiBNQVkgYmUgdHJlYXRlZCBhcyBmYXRhbCB0byB0aGUgY3VycmVudCBHT1AuCisgICAqLworICBBT01fQ09ERUNfVU5TVVBfRkVBVFVSRSwKKworICAvKiFcYnJpZWYgVGhlIGNvZGVkIGRhdGEgZm9yIHRoaXMgc3RyZWFtIGlzIGNvcnJ1cHQgb3IgaW5jb21wbGV0ZQorICAgKgorICAgKiBUaGVyZSB3YXMgYSBwcm9ibGVtIGRlY29kaW5nIHRoZSBjdXJyZW50IGZyYW1lLiAgVGhpcyByZXR1cm4gY29kZQorICAgKiBzaG91bGQgb25seSBiZSB1c2VkIGZvciBmYWlsdXJlcyB0aGF0IHByZXZlbnQgZnV0dXJlIHBpY3R1cmVzIGZyb20KKyAgICogYmVpbmcgcHJvcGVybHkgZGVjb2RlZC4gVGhpcyBlcnJvciBccmVmIE1BWSBiZSB0cmVhdGVkIGFzIGZhdGFsIHRvIHRoZQorICAgKiBzdHJlYW0gb3IgXHJlZiBNQVkgYmUgdHJlYXRlZCBhcyBmYXRhbCB0byB0aGUgY3VycmVudCBHT1AuIElmIGRlY29kaW5nCisgICAqIGlzIGNvbnRpbnVlZCBmb3IgdGhlIGN1cnJlbnQgR09QLCBhcnRpZmFjdHMgbWF5IGJlIHByZXNlbnQuCisgICAqLworICBBT01fQ09ERUNfQ09SUlVQVF9GUkFNRSwKKworICAvKiFcYnJpZWYgQW4gYXBwbGljYXRpb24tc3VwcGxpZWQgcGFyYW1ldGVyIGlzIG5vdCB2YWxpZC4KKyAgICoKKyAgICovCisgIEFPTV9DT0RFQ19JTlZBTElEX1BBUkFNLAorCisgIC8qIVxicmllZiBBbiBpdGVyYXRvciByZWFjaGVkIHRoZSBlbmQgb2YgbGlzdC4KKyAgICoKKyAgICovCisgIEFPTV9DT0RFQ19MSVNUX0VORAorCit9IGFvbV9jb2RlY19lcnJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgY2ZnX29wdGlvbnMgeworICAvKiFcYnJpZWYgUmVmbGVjdHMgaWYgZXh0X3BhcnRpdGlvbiBzaG91bGQgYmUgZW5hYmxlZAorICAgKgorICAgKiBJZiB0aGlzIHZhbHVlIGlzIG5vbi16ZXJvIGl0IGVuYWJsZWQgdGhlIGZlYXR1cmUKKyAgICovCisgIHVuc2lnbmVkIGludCBleHRfcGFydGl0aW9uOworfSBjZmdfb3B0aW9uc190OworCisvKgorZnJvbToKK2FvbS9hdjEvY29tbW9uL29idV91dGlsLmgKKyovCit0eXBlZGVmIHN0cnVjdCB7CisgIHNpemVfdCBzaXplOyAgLy8gU2l6ZSAoMSBvciAyIGJ5dGVzKSBvZiB0aGUgT0JVIGhlYWRlciAoaW5jbHVkaW5nIHRoZQorICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsIE9CVSBleHRlbnNpb24gaGVhZGVyKSBpbiB0aGUgYml0c3RyZWFtLgorICBPQlVfVFlQRSB0eXBlOworICBpbnQgaGFzX3NpemVfZmllbGQ7CisgIGludCBoYXNfZXh0ZW5zaW9uOworICAvLyBUaGUgZm9sbG93aW5nIGZpZWxkcyBjb21lIGZyb20gdGhlIE9CVSBleHRlbnNpb24gaGVhZGVyIGFuZCB0aGVyZWZvcmUgYXJlCisgIC8vIG9ubHkgdXNlZCBpZiBoYXNfZXh0ZW5zaW9uIGlzIHRydWUuCisgIGludCB0ZW1wb3JhbF9sYXllcl9pZDsKKyAgaW50IHNwYXRpYWxfbGF5ZXJfaWQ7Cit9IE9idUhlYWRlcjsKKworCisvKgorZnJvbToKK2FvbS9pbnRlcm5hbC9hb21fY29kZWNfaW50ZXJuYWwuaAorKi8KKworc3RydWN0IGFvbV9pbnRlcm5hbF9lcnJvcl9pbmZvIHsKKyAgYW9tX2NvZGVjX2Vycl90IGVycm9yX2NvZGU7CisgIGludCBoYXNfZGV0YWlsOworICBjaGFyIGRldGFpbFs4MF07CisgIGludCBzZXRqbXA7ICAvLyBCb29sZWFuOiB3aGV0aGVyICdqbXAnIGlzIHZhbGlkLgorI2lmZGVmIE9SSV9DT0RFCisgIGptcF9idWYgam1wOworI2VuZGlmCit9OworCisvKgorZnJvbToKK2FvbS9hb21fZnJhbWVfYnVmZmVyLmgKKyovCit0eXBlZGVmIHN0cnVjdCBhb21fY29kZWNfZnJhbWVfYnVmZmVyIHsKKyAgdWludDhfdCAqZGF0YTsgLyoqPCBQb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlciAqLworICBzaXplX3Qgc2l6ZTsgICAvKio8IFNpemUgb2YgZGF0YSBpbiBieXRlcyAqLworICB2b2lkICpwcml2OyAgICAvKio8IEZyYW1lJ3MgcHJpdmF0ZSBkYXRhICovCit9IGFvbV9jb2RlY19mcmFtZV9idWZmZXJfdDsKKworLyoKK2Zyb206Cithb20vYW9tX2ltYWdlLmgKKyovCisjZGVmaW5lIEFPTV9JTUFHRV9BQklfVkVSU0lPTiAoNSkgLyoqPFxoaWRlaW5pdGlhbGl6ZXIqLworCisjZGVmaW5lIEFPTV9JTUdfRk1UX1BMQU5BUiAweDEwMCAgLyoqPCBJbWFnZSBpcyBhIHBsYW5hciBmb3JtYXQuICovCisjZGVmaW5lIEFPTV9JTUdfRk1UX1VWX0ZMSVAgMHgyMDAgLyoqPCBWIHBsYW5lIHByZWNlZGVzIFUgaW4gbWVtb3J5LiAqLworLyoqIDB4NDAwIHVzZWQgdG8gc2lnbmFsIGFscGhhIGNoYW5uZWwsIHNraXBwaW5nIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gKi8KKyNkZWZpbmUgQU9NX0lNR19GTVRfSElHSEJJVERFUFRIIDB4ODAwIC8qKjwgSW1hZ2UgdXNlcyAxNmJpdCBmcmFtZWJ1ZmZlci4gKi8KKworLyohXGJyaWVmIExpc3Qgb2Ygc3VwcG9ydGVkIGltYWdlIGZvcm1hdHMgKi8KK3R5cGVkZWYgZW51bSBhb21faW1nX2ZtdCB7CisgIEFPTV9JTUdfRk1UX05PTkUsCisgIEFPTV9JTUdfRk1UX1lWMTIgPQorICAgICAgQU9NX0lNR19GTVRfUExBTkFSIHwgQU9NX0lNR19GTVRfVVZfRkxJUCB8IDEsIC8qKjwgcGxhbmFyIFlWVSAqLworICBBT01fSU1HX0ZNVF9JNDIwID0gQU9NX0lNR19GTVRfUExBTkFSIHwgMiwKKyAgQU9NX0lNR19GTVRfQU9NWVYxMiA9IEFPTV9JTUdfRk1UX1BMQU5BUiB8IEFPTV9JTUdfRk1UX1VWX0ZMSVAgfAorICAgICAgICAgICAgICAgICAgICAgICAgMywgLyoqIDwgcGxhbmFyIDQ6MjowIGZvcm1hdCB3aXRoIGFvbSBjb2xvciBzcGFjZSAqLworICBBT01fSU1HX0ZNVF9BT01JNDIwID0gQU9NX0lNR19GTVRfUExBTkFSIHwgNCwKKyAgQU9NX0lNR19GTVRfSTQyMiA9IEFPTV9JTUdfRk1UX1BMQU5BUiB8IDUsCisgIEFPTV9JTUdfRk1UX0k0NDQgPSBBT01fSU1HX0ZNVF9QTEFOQVIgfCA2LAorICBBT01fSU1HX0ZNVF9JNDIwMTYgPSBBT01fSU1HX0ZNVF9JNDIwIHwgQU9NX0lNR19GTVRfSElHSEJJVERFUFRILAorICBBT01fSU1HX0ZNVF9ZVjEyMTYgPSBBT01fSU1HX0ZNVF9ZVjEyIHwgQU9NX0lNR19GTVRfSElHSEJJVERFUFRILAorICBBT01fSU1HX0ZNVF9JNDIyMTYgPSBBT01fSU1HX0ZNVF9JNDIyIHwgQU9NX0lNR19GTVRfSElHSEJJVERFUFRILAorICBBT01fSU1HX0ZNVF9JNDQ0MTYgPSBBT01fSU1HX0ZNVF9JNDQ0IHwgQU9NX0lNR19GTVRfSElHSEJJVERFUFRILAorfSBhb21faW1nX2ZtdF90OyAvKio8IGFsaWFzIGZvciBlbnVtIGFvbV9pbWdfZm10ICovCisKKy8qIVxicmllZiBMaXN0IG9mIHN1cHBvcnRlZCBjb2xvciBwcmltYXJpZXMgKi8KK3R5cGVkZWYgZW51bSBhb21fY29sb3JfcHJpbWFyaWVzIHsKKyAgQU9NX0NJQ1BfQ1BfUkVTRVJWRURfMCA9IDAsICAvKio8IEZvciBmdXR1cmUgdXNlICovCisgIEFPTV9DSUNQX0NQX0JUXzcwOSA9IDEsICAgICAgLyoqPCBCVC43MDkgKi8KKyAgQU9NX0NJQ1BfQ1BfVU5TUEVDSUZJRUQgPSAyLCAvKio8IFVuc3BlY2lmaWVkICovCisgIEFPTV9DSUNQX0NQX1JFU0VSVkVEXzMgPSAzLCAgLyoqPCBGb3IgZnV0dXJlIHVzZSAqLworICBBT01fQ0lDUF9DUF9CVF80NzBfTSA9IDQsICAgIC8qKjwgQlQuNDcwIFN5c3RlbSBNIChoaXN0b3JpY2FsKSAqLworICBBT01fQ0lDUF9DUF9CVF80NzBfQl9HID0gNSwgIC8qKjwgQlQuNDcwIFN5c3RlbSBCLCBHIChoaXN0b3JpY2FsKSAqLworICBBT01fQ0lDUF9DUF9CVF82MDEgPSA2LCAgICAgIC8qKjwgQlQuNjAxICovCisgIEFPTV9DSUNQX0NQX1NNUFRFXzI0MCA9IDcsICAgLyoqPCBTTVBURSAyNDAgKi8KKyAgQU9NX0NJQ1BfQ1BfR0VORVJJQ19GSUxNID0KKyAgICAgIDgsIC8qKjwgR2VuZXJpYyBmaWxtIChjb2xvciBmaWx0ZXJzIHVzaW5nIGlsbHVtaW5hbnQgQykgKi8KKyAgQU9NX0NJQ1BfQ1BfQlRfMjAyMCA9IDksICAgICAgLyoqPCBCVC4yMDIwLCBCVC4yMTAwICovCisgIEFPTV9DSUNQX0NQX1hZWiA9IDEwLCAgICAgICAgIC8qKjwgU01QVEUgNDI4IChDSUUgMTkyMSBYWVopICovCisgIEFPTV9DSUNQX0NQX1NNUFRFXzQzMSA9IDExLCAgIC8qKjwgU01QVEUgUlAgNDMxLTIgKi8KKyAgQU9NX0NJQ1BfQ1BfU01QVEVfNDMyID0gMTIsICAgLyoqPCBTTVBURSBFRyA0MzItMSAgKi8KKyAgQU9NX0NJQ1BfQ1BfUkVTRVJWRURfMTMgPSAxMywgLyoqPCBGb3IgZnV0dXJlIHVzZSAodmFsdWVzIDEzIC0gMjEpICAqLworICBBT01fQ0lDUF9DUF9FQlVfMzIxMyA9IDIyLCAgICAvKio8IEVCVSBUZWNoLiAzMjEzLUUgICovCisgIEFPTV9DSUNQX0NQX1JFU0VSVkVEXzIzID0gMjMgIC8qKjwgRm9yIGZ1dHVyZSB1c2UgKHZhbHVlcyAyMyAtIDI1NSkgICovCit9IGFvbV9jb2xvcl9wcmltYXJpZXNfdDsgICAgICAgIC8qKjwgYWxpYXMgZm9yIGVudW0gYW9tX2NvbG9yX3ByaW1hcmllcyAqLworCisvKiFcYnJpZWYgTGlzdCBvZiBzdXBwb3J0ZWQgdHJhbnNmZXIgZnVuY3Rpb25zICovCit0eXBlZGVmIGVudW0gYW9tX3RyYW5zZmVyX2NoYXJhY3RlcmlzdGljcyB7CisgIEFPTV9DSUNQX1RDX1JFU0VSVkVEXzAgPSAwLCAgLyoqPCBGb3IgZnV0dXJlIHVzZSAqLworICBBT01fQ0lDUF9UQ19CVF83MDkgPSAxLCAgICAgIC8qKjwgQlQuNzA5ICovCisgIEFPTV9DSUNQX1RDX1VOU1BFQ0lGSUVEID0gMiwgLyoqPCBVbnNwZWNpZmllZCAqLworICBBT01fQ0lDUF9UQ19SRVNFUlZFRF8zID0gMywgIC8qKjwgRm9yIGZ1dHVyZSB1c2UgKi8KKyAgQU9NX0NJQ1BfVENfQlRfNDcwX00gPSA0LCAgICAvKio8IEJULjQ3MCBTeXN0ZW0gTSAoaGlzdG9yaWNhbCkgICovCisgIEFPTV9DSUNQX1RDX0JUXzQ3MF9CX0cgPSA1LCAgLyoqPCBCVC40NzAgU3lzdGVtIEIsIEcgKGhpc3RvcmljYWwpICovCisgIEFPTV9DSUNQX1RDX0JUXzYwMSA9IDYsICAgICAgLyoqPCBCVC42MDEgKi8KKyAgQU9NX0NJQ1BfVENfU01QVEVfMjQwID0gNywgICAvKio8IFNNUFRFIDI0MCBNICovCisgIEFPTV9DSUNQX1RDX0xJTkVBUiA9IDgsICAgICAgLyoqPCBMaW5lYXIgKi8KKyAgQU9NX0NJQ1BfVENfTE9HXzEwMCA9IDksICAgICAvKio8IExvZ2FyaXRobWljICgxMDAgOiAxIHJhbmdlKSAqLworICBBT01fQ0lDUF9UQ19MT0dfMTAwX1NRUlQxMCA9CisgICAgICAxMCwgICAgICAgICAgICAgICAgICAgICAvKio8IExvZ2FyaXRobWljICgxMDAgKiBTcXJ0KDEwKSA6IDEgcmFuZ2UpICovCisgIEFPTV9DSUNQX1RDX0lFQ182MTk2NiA9IDExLCAvKio8IElFQyA2MTk2Ni0yLTQgKi8KKyAgQU9NX0NJQ1BfVENfQlRfMTM2MSA9IDEyLCAgIC8qKjwgQlQuMTM2MSAqLworICBBT01fQ0lDUF9UQ19TUkdCID0gMTMsICAgICAgLyoqPCBzUkdCIG9yIHNZQ0MqLworICBBT01fQ0lDUF9UQ19CVF8yMDIwXzEwX0JJVCA9IDE0LCAvKio8IEJULjIwMjAgMTAtYml0IHN5c3RlbXMgKi8KKyAgQU9NX0NJQ1BfVENfQlRfMjAyMF8xMl9CSVQgPSAxNSwgLyoqPCBCVC4yMDIwIDEyLWJpdCBzeXN0ZW1zICovCisgIEFPTV9DSUNQX1RDX1NNUFRFXzIwODQgPSAxNiwgICAgIC8qKjwgU01QVEUgU1QgMjA4NCwgSVRVIEJULjIxMDAgUFEgKi8KKyAgQU9NX0NJQ1BfVENfU01QVEVfNDI4ID0gMTcsICAgICAgLyoqPCBTTVBURSBTVCA0MjggKi8KKyAgQU9NX0NJQ1BfVENfSExHID0gMTgsICAgICAgICAgICAgLyoqPCBCVC4yMTAwIEhMRywgQVJJQiBTVEQtQjY3ICovCisgIEFPTV9DSUNQX1RDX1JFU0VSVkVEXzE5ID0gMTkgICAgIC8qKjwgRm9yIGZ1dHVyZSB1c2UgKHZhbHVlcyAxOS0yNTUpICovCit9IGFvbV90cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3NfdDsgIC8qKjwgYWxpYXMgZm9yIGVudW0gYW9tX3RyYW5zZmVyX2Z1bmN0aW9uICovCisKKy8qIVxicmllZiBMaXN0IG9mIHN1cHBvcnRlZCBtYXRyaXggY29lZmZpY2llbnRzICovCit0eXBlZGVmIGVudW0gYW9tX21hdHJpeF9jb2VmZmljaWVudHMgeworICBBT01fQ0lDUF9NQ19JREVOVElUWSA9IDAsICAgIC8qKjwgSWRlbnRpdHkgbWF0cml4ICovCisgIEFPTV9DSUNQX01DX0JUXzcwOSA9IDEsICAgICAgLyoqPCBCVC43MDkgKi8KKyAgQU9NX0NJQ1BfTUNfVU5TUEVDSUZJRUQgPSAyLCAvKio8IFVuc3BlY2lmaWVkICovCisgIEFPTV9DSUNQX01DX1JFU0VSVkVEXzMgPSAzLCAgLyoqPCBGb3IgZnV0dXJlIHVzZSAqLworICBBT01fQ0lDUF9NQ19GQ0MgPSA0LCAgICAgICAgIC8qKjwgVVMgRkNDIDczLjYyOCAqLworICBBT01fQ0lDUF9NQ19CVF80NzBfQl9HID0gNSwgIC8qKjwgQlQuNDcwIFN5c3RlbSBCLCBHIChoaXN0b3JpY2FsKSAqLworICBBT01fQ0lDUF9NQ19CVF82MDEgPSA2LCAgICAgIC8qKjwgQlQuNjAxICovCisgIEFPTV9DSUNQX01DX1NNUFRFXzI0MCA9IDcsICAgLyoqPCBTTVBURSAyNDAgTSAqLworICBBT01fQ0lDUF9NQ19TTVBURV9ZQ0dDTyA9IDgsIC8qKjwgWUNnQ28gKi8KKyAgQU9NX0NJQ1BfTUNfQlRfMjAyMF9OQ0wgPQorICAgICAgOSwgLyoqPCBCVC4yMDIwIG5vbi1jb25zdGFudCBsdW1pbmFuY2UsIEJULjIxMDAgWUNiQ3IgICovCisgIEFPTV9DSUNQX01DX0JUXzIwMjBfQ0wgPSAxMCwgLyoqPCBCVC4yMDIwIGNvbnN0YW50IGx1bWluYW5jZSAqLworICBBT01fQ0lDUF9NQ19TTVBURV8yMDg1ID0gMTEsIC8qKjwgU01QVEUgU1QgMjA4NSBZRHpEeCAqLworICBBT01fQ0lDUF9NQ19DSFJPTUFUX05DTCA9CisgICAgICAxMiwgLyoqPCBDaHJvbWF0aWNpdHktZGVyaXZlZCBub24tY29uc3RhbnQgbHVtaW5hbmNlICovCisgIEFPTV9DSUNQX01DX0NIUk9NQVRfQ0wgPSAxMywgLyoqPCBDaHJvbWF0aWNpdHktZGVyaXZlZCBjb25zdGFudCBsdW1pbmFuY2UgKi8KKyAgQU9NX0NJQ1BfTUNfSUNUQ1AgPSAxNCwgICAgICAvKio8IEJULjIxMDAgSUN0Q3AgKi8KKyAgQU9NX0NJQ1BfTUNfUkVTRVJWRURfMTUgPSAxNSAvKio8IEZvciBmdXR1cmUgdXNlICh2YWx1ZXMgMTUtMjU1KSAgKi8KK30gYW9tX21hdHJpeF9jb2VmZmljaWVudHNfdDsKKworLyohXGJyaWVmIExpc3Qgb2Ygc3VwcG9ydGVkIGNvbG9yIHJhbmdlICovCit0eXBlZGVmIGVudW0gYW9tX2NvbG9yX3JhbmdlIHsKKyAgQU9NX0NSX1NUVURJT19SQU5HRSA9IDAsIC8qKjwgWSBbMTYuLjIzNV0sIFVWIFsxNi4uMjQwXSAqLworICBBT01fQ1JfRlVMTF9SQU5HRSA9IDEgICAgLyoqPCBZVVYvUkdCIFswLi4yNTVdICovCit9IGFvbV9jb2xvcl9yYW5nZV90OyAgICAgICAvKio8IGFsaWFzIGZvciBlbnVtIGFvbV9jb2xvcl9yYW5nZSAqLworCisvKiFcYnJpZWYgTGlzdCBvZiBjaHJvbWEgc2FtcGxlIHBvc2l0aW9ucyAqLwordHlwZWRlZiBlbnVtIGFvbV9jaHJvbWFfc2FtcGxlX3Bvc2l0aW9uIHsKKyAgQU9NX0NTUF9VTktOT1dOID0gMCwgICAgICAgICAgLyoqPCBVbmtub3duICovCisgIEFPTV9DU1BfVkVSVElDQUwgPSAxLCAgICAgICAgIC8qKjwgSG9yaXpvbnRhbGx5IGNvLWxvY2F0ZWQgd2l0aCBsdW1hKDAsIDApKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBzYW1wbGUsIGJldHdlZW4gdHdvIHZlcnRpY2FsIHNhbXBsZXMgKi8KKyAgQU9NX0NTUF9DT0xPQ0FURUQgPSAyLCAgICAgICAgLyoqPCBDby1sb2NhdGVkIHdpdGggbHVtYSgwLCAwKSBzYW1wbGUgKi8KKyAgQU9NX0NTUF9SRVNFUlZFRCA9IDMgICAgICAgICAgLyoqPCBSZXNlcnZlZCB2YWx1ZSAqLworfSBhb21fY2hyb21hX3NhbXBsZV9wb3NpdGlvbl90OyAvKio8IGFsaWFzIGZvciBlbnVtIGFvbV90cmFuc2Zlcl9mdW5jdGlvbiAqLworCisvKgorZnJvbToKK2FvbS9hb21fc2NhbGUveXYxMmNvbmZpZy5oCisqLwordHlwZWRlZiBzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyB7CisgIHVuaW9uIHsKKyAgICBzdHJ1Y3QgeworICAgICAgaW50IHlfd2lkdGg7CisgICAgICBpbnQgdXZfd2lkdGg7CisgICAgfTsKKyAgICBpbnQgd2lkdGhzWzJdOworICB9OworICB1bmlvbiB7CisgICAgc3RydWN0IHsKKyAgICAgIGludCB5X2hlaWdodDsKKyAgICAgIGludCB1dl9oZWlnaHQ7CisgICAgfTsKKyAgICBpbnQgaGVpZ2h0c1syXTsKKyAgfTsKKyAgdW5pb24geworICAgIHN0cnVjdCB7CisgICAgICBpbnQgeV9jcm9wX3dpZHRoOworICAgICAgaW50IHV2X2Nyb3Bfd2lkdGg7CisgICAgfTsKKyAgICBpbnQgY3JvcF93aWR0aHNbMl07CisgIH07CisgIHVuaW9uIHsKKyAgICBzdHJ1Y3QgeworICAgICAgaW50IHlfY3JvcF9oZWlnaHQ7CisgICAgICBpbnQgdXZfY3JvcF9oZWlnaHQ7CisgICAgfTsKKyAgICBpbnQgY3JvcF9oZWlnaHRzWzJdOworICB9OworICB1bmlvbiB7CisgICAgc3RydWN0IHsKKyAgICAgIGludCB5X3N0cmlkZTsKKyAgICAgIGludCB1dl9zdHJpZGU7CisgICAgfTsKKyAgICBpbnQgc3RyaWRlc1syXTsKKyAgfTsKKyAgdW5pb24geworICAgIHN0cnVjdCB7CisgICAgICB1aW50OF90ICp5X2J1ZmZlcjsKKyAgICAgIHVpbnQ4X3QgKnVfYnVmZmVyOworICAgICAgdWludDhfdCAqdl9idWZmZXI7CisgICAgfTsKKyAgICB1aW50OF90ICpidWZmZXJzWzNdOworICB9OworCisgIC8vIEluZGljYXRlIHdoZXRoZXIgeV9idWZmZXIsIHVfYnVmZmVyLCBhbmQgdl9idWZmZXIgcG9pbnRzIHRvIHRoZSBpbnRlcm5hbGx5CisgIC8vIGFsbG9jYXRlZCBtZW1vcnkgb3IgZXh0ZXJuYWwgYnVmZmVycy4KKyAgaW50IHVzZV9leHRlcm5hbF9yZWZlcmVuY2VfYnVmZmVyczsKKyAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gc3RvcmUgeV9idWZmZXIsIHVfYnVmZmVyLCBhbmQgdl9idWZmZXIgd2hlbiBzZXQgcmVmZXJlbmNlCisgIC8vIHVzZXMgYW4gZXh0ZXJuYWwgcmVmZXJuZWNlLCBhbmQgcmVzdG9yZSB0aG9zZSBidWZmZXIgcG9pbnRlcnMgYWZ0ZXIgdGhlCisgIC8vIGV4dGVybmFsIHJlZmVyZW5jZSBmcmFtZSBpcyBubyBsb25nZXIgdXNlZC4KKyAgdWludDhfdCAqc3RvcmVfYnVmX2FkclszXTsKKworICAvLyBJZiB0aGUgZnJhbWUgaXMgc3RvcmVkIGluIGEgMTYtYml0IGJ1ZmZlciwgdGhpcyBzdG9yZXMgYW4gOC1iaXQgdmVyc2lvbgorICAvLyBmb3IgdXNlIGluIGdsb2JhbCBtb3Rpb24gZGV0ZWN0aW9uLiBJdCBpcyBhbGxvY2F0ZWQgb24tZGVtYW5kLgorICB1aW50OF90ICp5X2J1ZmZlcl84Yml0OworICBpbnQgYnVmXzhiaXRfdmFsaWQ7CisKKyAgdWludDhfdCAqYnVmZmVyX2FsbG9jOworICBzaXplX3QgYnVmZmVyX2FsbG9jX3N6OworICBpbnQgYm9yZGVyOworICBzaXplX3QgZnJhbWVfc2l6ZTsKKyAgaW50IHN1YnNhbXBsaW5nX3g7CisgIGludCBzdWJzYW1wbGluZ195OworICB1bnNpZ25lZCBpbnQgYml0X2RlcHRoOworICBhb21fY29sb3JfcHJpbWFyaWVzX3QgY29sb3JfcHJpbWFyaWVzOworICBhb21fdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzX3QgdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzOworICBhb21fbWF0cml4X2NvZWZmaWNpZW50c190IG1hdHJpeF9jb2VmZmljaWVudHM7CisgIHVpbnQ4X3QgbW9ub2Nocm9tZTsKKyAgYW9tX2Nocm9tYV9zYW1wbGVfcG9zaXRpb25fdCBjaHJvbWFfc2FtcGxlX3Bvc2l0aW9uOworICBhb21fY29sb3JfcmFuZ2VfdCBjb2xvcl9yYW5nZTsKKyAgaW50IHJlbmRlcl93aWR0aDsKKyAgaW50IHJlbmRlcl9oZWlnaHQ7CisKKyAgaW50IGNvcnJ1cHRlZDsKKyAgaW50IGZsYWdzOworCisjaWZkZWYgQU1MCisgICAgaW50MzJfdCBpbmRleDsKKyAgICBpbnQzMl90IGRlY29kZV9pZHg7CisgICAgaW50MzJfdCBzbGljZV90eXBlOworICAgIGludDMyX3QgUmVmTnVtX0wwOworICAgIGludDMyX3QgUmVmTnVtX0wxOworICAgIGludDMyX3QgbnVtX3Jlb3JkZXJfcGljOworICAgICAgICBpbnQzMl90IHN0cmVhbV9vZmZzZXQ7CisgICAgdWludDhfdCByZWZlcmVuY2VkOworICAgIHVpbnQ4X3Qgb3V0cHV0X21hcms7CisgICAgdWludDhfdCByZWNvbl9tYXJrOworICAgIHVpbnQ4X3Qgb3V0cHV0X3JlYWR5OworICAgIHVpbnQ4X3QgZXJyb3JfbWFyazsKKyAgICAvKiovCisgICAgaW50MzJfdCBzbGljZV9pZHg7CisgICAgLypidWZmZXIqLworICAgIHVpbnQzMl90IGZnc190YWJsZV9hZHI7CisgICAgdWludDMyX3Qgc2Znc190YWJsZV9waHk7CisgICAgY2hhciAqc2Znc190YWJsZV9wdHI7CisjaWZkZWYgQU9NX0FWMV9NTVUKKyAgICB1aW50MzJfdCBoZWFkZXJfYWRyOworI2VuZGlmCisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKyAgICB1aW50MzJfdCBoZWFkZXJfZHdfYWRyOworI2VuZGlmCisgICAgdWludDMyX3QgbXByZWRfbXZfd3Jfc3RhcnRfYWRkcjsKKyAgICB1aW50MzJfdCBtY195X2FkcjsKKyAgICB1aW50MzJfdCBtY191X3ZfYWRyOworICAgIGludDMyX3QgbWNfY2FudmFzX3k7CisgICAgaW50MzJfdCBtY19jYW52YXNfdV92OworCisgICAgaW50MzJfdCBsY3VfdG90YWw7CisgICAgLyoqLworICAgIHVuc2lnbmVkIGludCBvcmRlcl9oaW50OworI2VuZGlmCisjaWZkZWYgQU1MX0RFVklDRQorICAgICBpbnQgbXZfYnVmX2luZGV4OworICAgICAgdW5zaWduZWQgbG9uZyBjbWFfYWxsb2NfYWRkcjsKKyAgICAgIGludCBCVUZfaW5kZXg7CisgICAgICBpbnQgYnVmX3NpemU7CisgICAgICBpbnQgY29tcF9ib2R5X3NpemU7CisgICAgICB1bnNpZ25lZCBpbnQgZHdfeV9hZHI7CisgICAgICB1bnNpZ25lZCBpbnQgZHdfdV92X2FkcjsKKyAgICAgIGludCBkb3VibGVfd3JpdGVfbW9kZTsKKyAgICAgIGludCB5X2NhbnZhc19pbmRleDsKKyAgICAgIGludCB1dl9jYW52YXNfaW5kZXg7CisgICAgICBpbnQgdmZfcmVmOworICBzdHJ1Y3QgY2FudmFzX2NvbmZpZ19zIGNhbnZhc19jb25maWdbMl07CisgICAgY2hhciAqYXV4X2RhdGFfYnVmOworICAgIGludCBhdXhfZGF0YV9zaXplOworICAgIHUzMiBwdHM7CisgIHU2NCBwdHM2NDsKKyAgLyogcGljdHVyZSBxb3MgaW5mb21hdGlvbiovCisgIGludCBtYXhfcXA7CisgIGludCBhdmdfcXA7CisgIGludCBtaW5fcXA7CisgIGludCBtYXhfc2tpcDsKKyAgaW50IGF2Z19za2lwOworICBpbnQgbWluX3NraXA7CisgIGludCBtYXhfbXY7CisgIGludCBtaW5fbXY7CisgIGludCBhdmdfbXY7CisjZW5kaWYKKyAgdTY0IHRpbWVzdGFtcDsKKyAgdTMyIGh3X2RlY29kZV90aW1lOworICB1MzIgZnJhbWVfc2l6ZTI7IC8vIEZvciBmcmFtZSBiYXNlIG1vZGUKKyAgaW50IGN0eF9idWZfaWR4OworICBpbnQgdjRsX2J1Zl9pbmRleDsKKyAgaW50IHJlcGVhdF9jb3VudDsNCisgIHN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpyZXBlYXRfcGljOworfSBQSUNfQlVGRkVSX0NPTkZJRzsKKworLyoKK2Zyb206Citjb21tb24vYmxvY2tkLmgKKyovCitUWVBFREVGIGVudW0geworICBLRVlfRlJBTUUgPSAwLAorICBJTlRFUl9GUkFNRSA9IDEsCisgIElOVFJBX09OTFlfRlJBTUUgPSAyLCAgLy8gcmVwbGFjZXMgaW50cmEtb25seQorICBTX0ZSQU1FID0gMywKKyAgRlJBTUVfVFlQRVMsCit9IFVFTlVNMUJZVEUoRlJBTUVfVFlQRSk7CisKKy8qZnJvbToKK212LmgKKyovCisjaWZkZWYgT1JJX0NPREUKK3R5cGVkZWYgc3RydWN0IG12MzIgeworICBpbnQzMl90IHJvdzsKKyAgaW50MzJfdCBjb2w7Cit9IE1WMzI7CisjZW5kaWYKKy8qZnJvbToKKyBhb21fZmlsdGVyLmgKKyovCisjZGVmaW5lIFNVQlBFTF9CSVRTIDQKKyNkZWZpbmUgU1VCUEVMX01BU0sgKCgxIDw8IFNVQlBFTF9CSVRTKSAtIDEpCisjZGVmaW5lIFNVQlBFTF9TSElGVFMgKDEgPDwgU1VCUEVMX0JJVFMpCisjZGVmaW5lIFNVQlBFTF9UQVBTIDgKKworI2RlZmluZSBTQ0FMRV9TVUJQRUxfQklUUyAxMAorI2RlZmluZSBTQ0FMRV9TVUJQRUxfU0hJRlRTICgxIDw8IFNDQUxFX1NVQlBFTF9CSVRTKQorI2RlZmluZSBTQ0FMRV9TVUJQRUxfTUFTSyAoU0NBTEVfU1VCUEVMX1NISUZUUyAtIDEpCisjZGVmaW5lIFNDQUxFX0VYVFJBX0JJVFMgKFNDQUxFX1NVQlBFTF9CSVRTIC0gU1VCUEVMX0JJVFMpCisjZGVmaW5lIFNDQUxFX0VYVFJBX09GRiAoKDEgPDwgU0NBTEVfRVhUUkFfQklUUykgLyAyKQorCisjZGVmaW5lIFJTX1NVQlBFTF9CSVRTIDYKKyNkZWZpbmUgUlNfU1VCUEVMX01BU0sgKCgxIDw8IFJTX1NVQlBFTF9CSVRTKSAtIDEpCisjZGVmaW5lIFJTX1NDQUxFX1NVQlBFTF9CSVRTIDE0CisjZGVmaW5lIFJTX1NDQUxFX1NVQlBFTF9NQVNLICgoMSA8PCBSU19TQ0FMRV9TVUJQRUxfQklUUykgLSAxKQorI2RlZmluZSBSU19TQ0FMRV9FWFRSQV9CSVRTIChSU19TQ0FMRV9TVUJQRUxfQklUUyAtIFJTX1NVQlBFTF9CSVRTKQorI2RlZmluZSBSU19TQ0FMRV9FWFRSQV9PRkYgKDEgPDwgKFJTX1NDQUxFX0VYVFJBX0JJVFMgLSAxKSkKKworLypmcm9tOgorc2NhbGUuaAorKi8KKyNkZWZpbmUgU0NBTEVfTlVNRVJBVE9SIDgKKworI2RlZmluZSBSRUZfU0NBTEVfU0hJRlQgMTQKKyNkZWZpbmUgUkVGX05PX1NDQUxFICgxIDw8IFJFRl9TQ0FMRV9TSElGVCkKKyNkZWZpbmUgUkVGX0lOVkFMSURfU0NBTEUgLTEKKworc3RydWN0IHNjYWxlX2ZhY3RvcnMgeworICBpbnQgeF9zY2FsZV9mcDsgIC8vIGhvcml6b250YWwgZml4ZWQgcG9pbnQgc2NhbGUgZmFjdG9yCisgIGludCB5X3NjYWxlX2ZwOyAgLy8gdmVydGljYWwgZml4ZWQgcG9pbnQgc2NhbGUgZmFjdG9yCisgIGludCB4X3N0ZXBfcTQ7CisgIGludCB5X3N0ZXBfcTQ7CisKKyAgaW50ICgqc2NhbGVfdmFsdWVfeCkoaW50IHZhbCwgY29uc3Qgc3RydWN0IHNjYWxlX2ZhY3RvcnMgKnNmKTsKKyAgaW50ICgqc2NhbGVfdmFsdWVfeSkoaW50IHZhbCwgY29uc3Qgc3RydWN0IHNjYWxlX2ZhY3RvcnMgKnNmKTsKKyNpZmRlZiBPUklfQ09ERQorICAvLyBjb252b2x2ZV9mbl9wdHJbc3VicGVsX3ggIT0gMF1bc3VicGVsX3kgIT0gMF1baXNfY29tcG91bmRdCisgIGFvbV9jb252b2x2ZV9mbl90IGNvbnZvbHZlWzJdWzJdWzJdOworICBhb21faGlnaGJkX2NvbnZvbHZlX2ZuX3QgaGlnaGJkX2NvbnZvbHZlWzJdWzJdWzJdOworI2VuZGlmCit9OworCisjaWZkZWYgT1JJX0NPREUKK01WMzIgYXYxX3NjYWxlX212KGNvbnN0IE1WICptdiwgaW50IHgsIGludCB5LCBjb25zdCBzdHJ1Y3Qgc2NhbGVfZmFjdG9ycyAqc2YpOworI2VuZGlmCit2b2lkIGF2MV9zZXR1cF9zY2FsZV9mYWN0b3JzX2Zvcl9mcmFtZShzdHJ1Y3Qgc2NhbGVfZmFjdG9ycyAqc2YsIGludCBvdGhlcl93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG90aGVyX2gsIGludCB0aGlzX3csIGludCB0aGlzX2gpOworCitzdGF0aWMgaW5saW5lIGludCBhdjFfaXNfdmFsaWRfc2NhbGUoY29uc3Qgc3RydWN0IHNjYWxlX2ZhY3RvcnMgKnNmKSB7CisjaWZkZWYgT1JJX0NPREUKKyAgYXNzZXJ0KHNmICE9IE5VTEwpOworI2VuZGlmCisgIHJldHVybiBzZi0+eF9zY2FsZV9mcCAhPSBSRUZfSU5WQUxJRF9TQ0FMRSAmJgorICAgICAgICAgc2YtPnlfc2NhbGVfZnAgIT0gUkVGX0lOVkFMSURfU0NBTEU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF2MV9pc19zY2FsZWQoY29uc3Qgc3RydWN0IHNjYWxlX2ZhY3RvcnMgKnNmKSB7CisjaWZkZWYgT1JJX0NPREUKKyAgYXNzZXJ0KHNmICE9IE5VTEwpOworI2VuZGlmCisgIHJldHVybiBhdjFfaXNfdmFsaWRfc2NhbGUoc2YpICYmCisgICAgICAgICAoc2YtPnhfc2NhbGVfZnAgIT0gUkVGX05PX1NDQUxFIHx8IHNmLT55X3NjYWxlX2ZwICE9IFJFRl9OT19TQ0FMRSk7Cit9CisKKworLyoKK2Zyb206Citjb21tb24vb255eGNfaW50LmgKKyovCisKKyNkZWZpbmUgQ0RFRl9NQVhfU1RSRU5HVEhTIDE2CisKKy8qIENvbnN0YW50IHZhbHVlcyB3aGlsZSB3YWl0aW5nIGZvciB0aGUgc2VxdWVuY2UgaGVhZGVyICovCisjZGVmaW5lIEZSQU1FX0lEX0xFTkdUSCAxNQorI2RlZmluZSBERUxUQV9GUkFNRV9JRF9MRU5HVEggMTQKKworI2RlZmluZSBGUkFNRV9DT05URVhUUyAoRlJBTUVfQlVGRkVSUyArIDEpCisvLyBFeHRyYSBmcmFtZSBjb250ZXh0IHdoaWNoIGlzIGFsd2F5cyBrZXB0IGF0IGRlZmF1bHQgdmFsdWVzCisjZGVmaW5lIEZSQU1FX0NPTlRFWFRfREVGQVVMVFMgKEZSQU1FX0NPTlRFWFRTIC0gMSkKKyNkZWZpbmUgUFJJTUFSWV9SRUZfQklUUyAzCisjZGVmaW5lIFBSSU1BUllfUkVGX05PTkUgNworCisjZGVmaW5lIE5VTV9QSU5HX1BPTkdfQlVGRkVSUyAyCisKKyNkZWZpbmUgTUFYX05VTV9URU1QT1JBTF9MQVlFUlMgOAorI2RlZmluZSBNQVhfTlVNX1NQQVRJQUxfTEFZRVJTIDQKKy8qIGNsYW5nLWZvcm1hdCBvZmYgKi8KKy8vIGNsYW5nLWZvcm1hdCBzZWVtcyB0byB0aGluayB0aGlzIGlzIGEgcG9pbnRlciBkZXJlZmVyZW5jZSBhbmQgbm90IGEKKy8vIG11bHRpcGxpY2F0aW9uLgorI2RlZmluZSBNQVhfTlVNX09QRVJBVElOR19QT0lOVFMgXAorICBNQVhfTlVNX1RFTVBPUkFMX0xBWUVSUyAqIE1BWF9OVU1fU1BBVElBTF9MQVlFUlMKKy8qIGNsYW5nLWZvcm1hdCBvbiovCisKKy8vIFRPRE8oamluZ25pbmcpOiBUdXJuaW5nIHRoaXMgb24gdG8gc2V0IHVwIHRyYW5zZm9ybSBjb2VmZmljaWVudAorLy8gcHJvY2Vzc2luZyB0aW1lci4KKyNkZWZpbmUgVFhDT0VGRl9USU1FUiAwCisjZGVmaW5lIFRYQ09FRkZfQ09TVF9USU1FUiAwCisKK1RZUEVERUYgZW51bSB7CisgIFNJTkdMRV9SRUZFUkVOQ0UgPSAwLAorICBDT01QT1VORF9SRUZFUkVOQ0UgPSAxLAorICBSRUZFUkVOQ0VfTU9ERV9TRUxFQ1QgPSAyLAorICBSRUZFUkVOQ0VfTU9ERVMgPSAzLAorfSBVRU5VTTFCWVRFKFJFRkVSRU5DRV9NT0RFKTsKKworVFlQRURFRiBlbnVtIHsKKyAgLyoqCisgICAqIEZyYW1lIGNvbnRleHQgdXBkYXRlcyBhcmUgZGlzYWJsZWQKKyAgICovCisgIFJFRlJFU0hfRlJBTUVfQ09OVEVYVF9ESVNBQkxFRCwKKyAgLyoqCisgICAqIFVwZGF0ZSBmcmFtZSBjb250ZXh0IHRvIHZhbHVlcyByZXN1bHRpbmcgZnJvbSBiYWNrd2FyZCBwcm9iYWJpbGl0eQorICAgKiB1cGRhdGVzIGJhc2VkIG9uIGVudHJvcHkvY291bnRzIGluIHRoZSBkZWNvZGVkIGZyYW1lCisgICAqLworICBSRUZSRVNIX0ZSQU1FX0NPTlRFWFRfQkFDS1dBUkQsCit9IFVFTlVNMUJZVEUoUkVGUkVTSF9GUkFNRV9DT05URVhUX01PREUpOworCisjZGVmaW5lIE1GTVZfU1RBQ0tfU0laRSAzCisKKyNpZmRlZiBBTUwKKyNkZWZpbmUgTVZfUkVGX1NJWkUgOAorI2VuZGlmCisKKyNpZmRlZiBPUklfQ09ERQordHlwZWRlZiBzdHJ1Y3QgeworICBpbnRfbXYgbWZtdjA7CisgIHVpbnQ4X3QgcmVmX2ZyYW1lX29mZnNldDsKK30gVFBMX01WX1JFRjsKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50X212IG12OworICBNVl9SRUZFUkVOQ0VfRlJBTUUgcmVmX2ZyYW1lOworfSBNVl9SRUY7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgUmVmQ250QnVmZmVyX3MgeworICAvLyBGb3IgYSBSZWZDbnRCdWZmZXIsIHRoZSBmb2xsb3dpbmcgYXJlIHJlZmVyZW5jZS1ob2xkaW5nIHZhcmlhYmxlczoKKyAgLy8gLSBjbS0+cmVmX2ZyYW1lX21hcFtdCisgIC8vIC0gY20tPmN1cl9mcmFtZQorICAvLyAtIGNtLT5zY2FsZWRfcmVmX2J1ZltdIChlbmNvZGVyIG9ubHkpCisgIC8vIC0gY20tPm5leHRfcmVmX2ZyYW1lX21hcFtdIChkZWNvZGVyIG9ubHkpCisgIC8vIC0gcGJpLT5vdXRwdXRfZnJhbWVfaW5kZXhbXSAoZGVjb2RlciBvbmx5KQorICAvLyBXaXRoIHRoYXQgZGVmaW5pdGlvbiwgJ3JlZl9jb3VudCcgaXMgdGhlIG51bWJlciBvZiByZWZlcmVuY2UtaG9sZGluZworICAvLyB2YXJpYWJsZXMgdGhhdCBhcmUgY3VycmVudGx5IHJlZmVyZW5jaW5nIHRoaXMgYnVmZmVyLgorICAvLyBGb3IgZXhhbXBsZToKKyAgLy8gLSBzdXBwb3NlIHRoaXMgYnVmZmVyIGlzIGF0IGluZGV4ICdrJyBpbiB0aGUgYnVmZmVyIHBvb2wsIGFuZAorICAvLyAtIFRvdGFsICduJyBvZiB0aGUgdmFyaWFibGVzIC8gYXJyYXkgZWxlbWVudHMgYWJvdmUgaGF2ZSB2YWx1ZSAnaycgKHRoYXQKKyAgLy8gaXMsIHRoZXkgYXJlIHBvaW50aW5nIHRvIGJ1ZmZlciBhdCBpbmRleCAnaycpLgorICAvLyBUaGVuLCBwb29sLT5mcmFtZV9idWZzW2tdLnJlZl9jb3VudCA9IG4uCisgIGludCByZWZfY291bnQ7CisKKyAgdW5zaWduZWQgaW50IG9yZGVyX2hpbnQ7CisgIHVuc2lnbmVkIGludCByZWZfb3JkZXJfaGludHNbSU5URVJfUkVGU19QRVJfRlJBTUVdOworCisgIGludCBpbnRyYV9vbmx5OworICBpbnQgc2VnbWVudGF0aW9uX2VuYWJsZWQ7CisgIHVuc2lnbmVkIGludCBzZWdtZW50X2ZlYXR1cmVbOF07CisjaWZkZWYgQU1MCisgIGludCBzZWdtZW50YXRpb25fdXBkYXRlX21hcDsKKyAgaW50IHByZXZfc2VnbWVudGF0aW9uX2VuYWJsZWQ7CisgIGludCBzZWdfbWlfcm93czsKKyAgaW50IHNlZ19taV9jb2xzOworCisgIHVuc2lnbmVkIGludCBzZWdfbGZfaW5mb195WzhdOworICB1bnNpZ25lZCBpbnQgc2VnX2xmX2luZm9fY1s4XTsKKyAgaW50OF90IHJlZl9kZWx0YXNbUkVGX0ZSQU1FU107CisgIGludDhfdCBtb2RlX2RlbHRhc1tNQVhfTU9ERV9MRl9ERUxUQVNdOworI2VuZGlmCisgIC8vTVZfUkVGICptdnM7CisgIHVpbnQ4X3QgKnNlZ19tYXA7CisjaWZkZWYgT1JJX0NPREUKKyAgc3RydWN0IHNlZ21lbnRhdGlvbiBzZWc7CisjZW5kaWYKKworICBpbnQgbWlfcm93czsKKyAgaW50IG1pX2NvbHM7CisgIC8vIFdpZHRoIGFuZCBoZWlnaHQgZ2l2ZSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIChiZWZvcmUgYW55IHVwc2NhbGluZywgdW5saWtlCisgIC8vIHRoZSBzaXplcyB0aGF0IGNhbiBiZSBkZXJpdmVkIGZyb20gdGhlIGJ1ZiBzdHJ1Y3R1cmUpCisgIGludCB3aWR0aDsKKyAgaW50IGhlaWdodDsKKyNpZmRlZiBPUklfQ09ERQorICBXYXJwZWRNb3Rpb25QYXJhbXMgZ2xvYmFsX21vdGlvbltSRUZfRlJBTUVTXTsKKyNlbmRpZgorICBpbnQgc2hvd2FibGVfZnJhbWU7ICAvLyBmcmFtZSBjYW4gYmUgdXNlZCBhcyBzaG93IGV4aXN0aW5nIGZyYW1lIGluIGZ1dHVyZQorICB1aW50OF90IGZpbG1fZ3JhaW5fcGFyYW1zX3ByZXNlbnQ7CisjaWZkZWYgT1JJX0NPREUKKyAgYW9tX2ZpbG1fZ3JhaW5fdCBmaWxtX2dyYWluX3BhcmFtczsKKyNlbmRpZgorI2lmZGVmIEFNTAorICBpbnQgZGVjX3dpZHRoOworICB1aW50OF90IGZpbG1fZ3JhaW5fcmVnX3ZhbGlkOworICB3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3NmZ3M7CisgIGF0b21pY190IGZnc19kb25lOworICB1aW50MzJfdCBmaWxtX2dyYWluX3JlZ1tGSUxNX0dSQUlOX1JFR19TSVpFXTsKKyAgdWludDMyX3QgZmlsbV9ncmFpbl9jdHJsOworI2VuZGlmCisgIGFvbV9jb2RlY19mcmFtZV9idWZmZXJfdCByYXdfZnJhbWVfYnVmZmVyOworICBQSUNfQlVGRkVSX0NPTkZJRyBidWY7CisjaWZkZWYgT1JJX0NPREUKKyAgaGFzaF90YWJsZSBoYXNoX3RhYmxlOworI2VuZGlmCisgIEZSQU1FX1RZUEUgZnJhbWVfdHlwZTsKKworICAvLyBUaGlzIGlzIG9ubHkgdXNlZCBpbiB0aGUgZW5jb2RlciBidXQgbmVlZHMgdG8gYmUgaW5kZXhlZCBwZXIgcmVmIGZyYW1lCisgIC8vIHNvIGl0J3MgZXh0cmVtZWx5IGNvbnZlbmllbnQgdG8ga2VlcCBpdCBoZXJlLgorI2lmZGVmIE9SSV9DT0RFCisgIGludCBpbnRlcnBfZmlsdGVyX3NlbGVjdGVkW1NXSVRDSEFCTEVdOworI2VuZGlmCisgIC8vIEludGVyIGZyYW1lIHJlZmVyZW5jZSBmcmFtZSBkZWx0YSBmb3IgbG9vcCBmaWx0ZXIKKyNpZm5kZWYgQU1MCisgIGludDhfdCByZWZfZGVsdGFzW1JFRl9GUkFNRVNdOworI2VuZGlmCisjaWZkZWYgT1JJX0NPREUKKyAgLy8gMCA9IFpFUk9fTVYsIE1WCisgIGludDhfdCBtb2RlX2RlbHRhc1tNQVhfTU9ERV9MRl9ERUxUQVNdOworCisgIEZSQU1FX0NPTlRFWFQgZnJhbWVfY29udGV4dDsKKyNlbmRpZgorICBpbnQgc2hvd19mcmFtZTsKK30gUmVmQ250QnVmZmVyOworCit0eXBlZGVmIHN0cnVjdCBCdWZmZXJQb29sX3MgeworLy8gUHJvdGVjdCBCdWZmZXJQb29sIGZyb20gYmVpbmcgYWNjZXNzZWQgYnkgc2V2ZXJhbCBGcmFtZVdvcmtlcnMgYXQKKy8vIHRoZSBzYW1lIHRpbWUgZHVyaW5nIGZyYW1lIHBhcmFsbGVsIGRlY29kZS4KKy8vIFRPRE8oaGt1YW5nKTogVHJ5IHRvIHVzZSBhdG9taWMgdmFyaWFibGUgaW5zdGVhZCBvZiBsb2NraW5nIHRoZSB3aG9sZSBwb29sLgorLy8gVE9ETyh3dGMpOiBSZW1vdmUgdGhpcy4gU2VlCisvLyBodHRwczovL2Nocm9taXVtLXJldmlldy5nb29nbGVzb3VyY2UuY29tL2Mvd2VibS9saWJ2cHgvKy81NjA2MzAuCisjaWYgQ09ORklHX01VTFRJVEhSRUFECisgIHB0aHJlYWRfbXV0ZXhfdCBwb29sX211dGV4OworI2VuZGlmCisKKyAgLy8gUHJpdmF0ZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZnJhbWUgYnVmZmVyIGNhbGxiYWNrcy4KKyAgdm9pZCAqY2JfcHJpdjsKKyNpZmRlZiBPUklfQ09ERQorICBhb21fZ2V0X2ZyYW1lX2J1ZmZlcl9jYl9mbl90IGdldF9mYl9jYjsKKyAgYW9tX3JlbGVhc2VfZnJhbWVfYnVmZmVyX2NiX2ZuX3QgcmVsZWFzZV9mYl9jYjsKKyNlbmRpZgorICBSZWZDbnRCdWZmZXIgZnJhbWVfYnVmc1tGUkFNRV9CVUZGRVJTXTsKKworI2lmZGVmIE9SSV9DT0RFCisgIC8vIEZyYW1lIGJ1ZmZlcnMgYWxsb2NhdGVkIGludGVybmFsbHkgYnkgdGhlIGNvZGVjLgorICBJbnRlcm5hbEZyYW1lQnVmZmVyTGlzdCBpbnRfZnJhbWVfYnVmZmVyczsKKyNlbmRpZgorI2lmZGVmIEFNTF9ERVZJQ0UKKyAgICBzcGlubG9ja190IGxvY2s7CisjZW5kaWYKK30gQnVmZmVyUG9vbDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgY2RlZl9wcmlfZGFtcGluZzsKKyAgaW50IGNkZWZfc2VjX2RhbXBpbmc7CisgIGludCBuYl9jZGVmX3N0cmVuZ3RoczsKKyAgaW50IGNkZWZfc3RyZW5ndGhzW0NERUZfTUFYX1NUUkVOR1RIU107CisgIGludCBjZGVmX3V2X3N0cmVuZ3Roc1tDREVGX01BWF9TVFJFTkdUSFNdOworICBpbnQgY2RlZl9iaXRzOworfSBDZGVmSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgZGVsdGFfcV9wcmVzZW50X2ZsYWc7CisgIC8vIFJlc29sdXRpb24gb2YgZGVsdGEgcXVhbnQKKyAgaW50IGRlbHRhX3FfcmVzOworICBpbnQgZGVsdGFfbGZfcHJlc2VudF9mbGFnOworICAvLyBSZXNvbHV0aW9uIG9mIGRlbHRhIGxmIGxldmVsCisgIGludCBkZWx0YV9sZl9yZXM7CisgIC8vIFRoaXMgaXMgYSBmbGFnIGZvciBudW1iZXIgb2YgZGVsdGFzIG9mIGxvb3AgZmlsdGVyIGxldmVsCisgIC8vIDA6IHVzZSAxIGRlbHRhLCBmb3IgeV92ZXJ0aWNhbCwgeV9ob3Jpem9udGFsLCB1LCBhbmQgdgorICAvLyAxOiB1c2Ugc2VwYXJhdGUgZGVsdGFzIGZvciBlYWNoIGZpbHRlciBsZXZlbAorICBpbnQgZGVsdGFfbGZfbXVsdGk7Cit9IERlbHRhUUluZm87CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IGVuYWJsZV9vcmRlcl9oaW50OyAgICAgICAgICAgLy8gMCAtIGRpc2FibGUgb3JkZXIgaGludCwgYW5kIHJlbGF0ZWQgdG9vbHMKKyAgaW50IG9yZGVyX2hpbnRfYml0c19taW51c18xOyAgICAgLy8gZGlzdF93dGRfY29tcCwgcmVmX2ZyYW1lX212cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJhbWVfc2lnbl9iaWFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIDAsIGVuYWJsZV9kaXN0X3d0ZF9jb21wIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmFibGVfcmVmX2ZyYW1lX212cyBtdXN0IGJlIHNldCBhcyAwLgorICBpbnQgZW5hYmxlX2Rpc3Rfd3RkX2NvbXA7ICAgICAgICAvLyAwIC0gZGlzYWJsZSBkaXN0LXd0ZCBjb21wb3VuZCBtb2RlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxIC0gZW5hYmxlIGl0CisgIGludCBlbmFibGVfcmVmX2ZyYW1lX212czsgICAgICAgIC8vIDAgLSBkaXNhYmxlIHJlZiBmcmFtZSBtdnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMSAtIGVuYWJsZSBpdAorfSBPcmRlckhpbnRJbmZvOworCisvLyBTZXF1ZW5jZSBoZWFkZXIgc3RydWN0dXJlLgorLy8gTm90ZTogQWxsIHN5bnRheCBlbGVtZW50cyBvZiBzZXF1ZW5jZV9oZWFkZXJfb2J1IHRoYXQgbmVlZCB0byBiZQorLy8gYml0LWlkZW50aWNhbCBhY3Jvc3MgbXVsdGlwbGUgc2VxdWVuY2UgaGVhZGVycyBtdXN0IGJlIHBhcnQgb2YgdGhpcyBzdHJ1Y3QsCisvLyBzbyB0aGF0IGNvbnNpc3RlbmN5IGlzIGNoZWNrZWQgYnkgYXJlX3NlcV9oZWFkZXJzX2NvbnNpc3RlbnQoKSBmdW5jdGlvbi4KK3R5cGVkZWYgc3RydWN0IFNlcXVlbmNlSGVhZGVyIHsKKyAgaW50IG51bV9iaXRzX3dpZHRoOworICBpbnQgbnVtX2JpdHNfaGVpZ2h0OworICBpbnQgbWF4X2ZyYW1lX3dpZHRoOworICBpbnQgbWF4X2ZyYW1lX2hlaWdodDsKKyAgdWludDhfdCBmcmFtZV9pZF9udW1iZXJzX3ByZXNlbnRfZmxhZzsKKyAgaW50IGZyYW1lX2lkX2xlbmd0aDsKKyAgaW50IGRlbHRhX2ZyYW1lX2lkX2xlbmd0aDsKKyAgQkxPQ0tfU0laRTIgc2Jfc2l6ZTsgIC8vIFNpemUgb2YgdGhlIHN1cGVyYmxvY2sgdXNlZCBmb3IgdGhpcyBmcmFtZQorICBpbnQgbWliX3NpemU7ICAgICAgICAvLyBTaXplIG9mIHRoZSBzdXBlcmJsb2NrIGluIHVuaXRzIG9mIE1JIGJsb2NrcworICBpbnQgbWliX3NpemVfbG9nMjsgICAvLyBMb2cgMiBvZiBhYm92ZS4KKworICBPcmRlckhpbnRJbmZvIG9yZGVyX2hpbnRfaW5mbzsKKworICB1aW50OF90IGZvcmNlX3NjcmVlbl9jb250ZW50X3Rvb2xzOyAgLy8gMCAtIGZvcmNlIG9mZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMSAtIGZvcmNlIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyIC0gYWRhcHRpdmUKKyAgdWludDhfdCBzdGlsbF9waWN0dXJlOyAgICAgICAgICAgICAgIC8vIFZpZGVvIGlzIGEgc2luZ2xlIGZyYW1lIHN0aWxsIHBpY3R1cmUKKyAgdWludDhfdCByZWR1Y2VkX3N0aWxsX3BpY3R1cmVfaGRyOyAgIC8vIFVzZSByZWR1Y2VkIGhlYWRlciBmb3Igc3RpbGwgcGljdHVyZQorICB1aW50OF90IGZvcmNlX2ludGVnZXJfbXY7ICAgICAgICAgICAgLy8gMCAtIERvbid0IGZvcmNlLiBNViBjYW4gdXNlIHN1YnBlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMSAtIGZvcmNlIHRvIGludGVnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIgLSBhZGFwdGl2ZQorICB1aW50OF90IGVuYWJsZV9maWx0ZXJfaW50cmE7ICAgICAgICAgLy8gZW5hYmxlcy9kaXNhYmxlcyBmaWx0ZXJpbnRyYQorICB1aW50OF90IGVuYWJsZV9pbnRyYV9lZGdlX2ZpbHRlcjsgICAgLy8gZW5hYmxlcy9kaXNhYmxlcyBlZGdlIHVwc2FtcGxpbmcKKyAgdWludDhfdCBlbmFibGVfaW50ZXJpbnRyYV9jb21wb3VuZDsgIC8vIGVuYWJsZXMvZGlzYWJsZXMgaW50ZXJpbnRyYV9jb21wb3VuZAorICB1aW50OF90IGVuYWJsZV9tYXNrZWRfY29tcG91bmQ7ICAgICAgLy8gZW5hYmxlcy9kaXNhYmxlcyBtYXNrZWQgY29tcG91bmQKKyAgdWludDhfdCBlbmFibGVfZHVhbF9maWx0ZXI7ICAgICAgICAgIC8vIDAgLSBkaXNhYmxlIGR1YWwgaW50ZXJwb2xhdGlvbiBmaWx0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgLSBlbmFibGUgdmVydC9ob3J6IGZpbHRlciBzZWxlY3Rpb24KKyAgdWludDhfdCBlbmFibGVfd2FycGVkX21vdGlvbjsgICAgICAgIC8vIDAgLSBkaXNhYmxlIHdhcnAgZm9yIHRoZSBzZXF1ZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMSAtIGVuYWJsZSB3YXJwIGZvciB0aGUgc2VxdWVuY2UKKyAgdWludDhfdCBlbmFibGVfc3VwZXJyZXM7ICAgICAgICAgICAgIC8vIDAgLSBEaXNhYmxlIHN1cGVycmVzIGZvciB0aGUgc2VxdWVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBhbmQgbm8gZnJhbWUgbGV2ZWwgc3VwZXJyZXMgZmxhZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMSAtIEVuYWJsZSBzdXBlcnJlcyBmb3IgdGhlIHNlcXVlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgZW5hYmxlIHBlci1mcmFtZSBzdXBlcnJlcyBmbGFnCisgIHVpbnQ4X3QgZW5hYmxlX2NkZWY7ICAgICAgICAgICAgICAgICAvLyBUbyB0dXJuIG9uL29mZiBDREVGCisgIHVpbnQ4X3QgZW5hYmxlX3Jlc3RvcmF0aW9uOyAgICAgICAgICAvLyBUbyB0dXJuIG9uL29mZiBsb29wIHJlc3RvcmF0aW9uCisgIEJJVFNUUkVBTV9QUk9GSUxFIHByb2ZpbGU7CisKKyAgLy8gT3BlcmF0aW5nIHBvaW50IGluZm8uCisgIGludCBvcGVyYXRpbmdfcG9pbnRzX2NudF9taW51c18xOworICBpbnQgb3BlcmF0aW5nX3BvaW50X2lkY1tNQVhfTlVNX09QRVJBVElOR19QT0lOVFNdOworICB1aW50OF90IGRpc3BsYXlfbW9kZWxfaW5mb19wcmVzZW50X2ZsYWc7CisgIHVpbnQ4X3QgZGVjb2Rlcl9tb2RlbF9pbmZvX3ByZXNlbnRfZmxhZzsKKyAgQVYxX0xFVkVMIHNlcV9sZXZlbF9pZHhbTUFYX05VTV9PUEVSQVRJTkdfUE9JTlRTXTsKKyAgdWludDhfdCB0aWVyW01BWF9OVU1fT1BFUkFUSU5HX1BPSU5UU107ICAvLyBzZXFfdGllciBpbiB0aGUgc3BlYy4gT25lIGJpdDogMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIDEuCisKKyAgLy8gQ29sb3IgY29uZmlnLgorICBhb21fYml0X2RlcHRoX3QgYml0X2RlcHRoOyAgLy8gQU9NX0JJVFNfOCBpbiBwcm9maWxlIDAgb3IgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFPTV9CSVRTXzEwIG9yIEFPTV9CSVRTXzEyIGluIHByb2ZpbGUgMiBvciAzLgorICB1aW50OF90IHVzZV9oaWdoYml0ZGVwdGg7ICAgLy8gSWYgdHJ1ZSwgd2UgbmVlZCB0byB1c2UgMTZiaXQgZnJhbWUgYnVmZmVycy4KKyAgdWludDhfdCBtb25vY2hyb21lOyAgICAgICAgIC8vIE1vbm9jaG9ybWUgdmlkZW8KKyAgYW9tX2NvbG9yX3ByaW1hcmllc190IGNvbG9yX3ByaW1hcmllczsKKyAgYW9tX3RyYW5zZmVyX2NoYXJhY3RlcmlzdGljc190IHRyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKKyAgYW9tX21hdHJpeF9jb2VmZmljaWVudHNfdCBtYXRyaXhfY29lZmZpY2llbnRzOworICBpbnQgY29sb3JfcmFuZ2U7CisgIGludCBzdWJzYW1wbGluZ194OyAgICAgICAgICAvLyBDaHJvbWEgc3Vic2FtcGxpbmcgZm9yIHgKKyAgaW50IHN1YnNhbXBsaW5nX3k7ICAgICAgICAgIC8vIENocm9tYSBzdWJzYW1wbGluZyBmb3IgeQorICBhb21fY2hyb21hX3NhbXBsZV9wb3NpdGlvbl90IGNocm9tYV9zYW1wbGVfcG9zaXRpb247CisgIHVpbnQ4X3Qgc2VwYXJhdGVfdXZfZGVsdGFfcTsKKyAgdWludDhfdCBmaWxtX2dyeV9kZXF1YW50X1FUWGFpbl9wYXJhbXNfcHJlc2VudDsKK30gU2VxdWVuY2VIZWFkZXI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgc2tpcF9tb2RlX2FsbG93ZWQ7CisgICAgaW50IHNraXBfbW9kZV9mbGFnOworICAgIGludCByZWZfZnJhbWVfaWR4XzA7CisgICAgaW50IHJlZl9mcmFtZV9pZHhfMTsKK30gU2tpcE1vZGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEZSQU1FX1RZUEUgZnJhbWVfdHlwZTsKKyAgUkVGRVJFTkNFX01PREUgcmVmZXJlbmNlX21vZGU7CisKKyAgdW5zaWduZWQgaW50IG9yZGVyX2hpbnQ7CisgIHVuc2lnbmVkIGludCBmcmFtZV9udW1iZXI7CisgIFNraXBNb2RlSW5mbyBza2lwX21vZGVfaW5mbzsKKyAgaW50IHJlZnJlc2hfZnJhbWVfZmxhZ3M7ICAvLyBXaGljaCByZWYgZnJhbWVzIGFyZSBvdmVyd3JpdHRlbiBieSB0aGlzIGZyYW1lCisgIGludCBmcmFtZV9yZWZzX3Nob3J0X3NpZ25hbGluZzsKK30gQ3VycmVudEZyYW1lOworCit0eXBlZGVmIHN0cnVjdCBBVjFfQ29tbW9uX3MgeworICBDdXJyZW50RnJhbWUgY3VycmVudF9mcmFtZTsKKyAgc3RydWN0IGFvbV9pbnRlcm5hbF9lcnJvcl9pbmZvIGVycm9yOworICBpbnQgd2lkdGg7CisgIGludCBoZWlnaHQ7CisgIGludCByZW5kZXJfd2lkdGg7CisgIGludCByZW5kZXJfaGVpZ2h0OworICBpbnQgdGltaW5nX2luZm9fcHJlc2VudDsKKyAgYW9tX3RpbWluZ19pbmZvX3QgdGltaW5nX2luZm87CisgIGludCBidWZmZXJfcmVtb3ZhbF90aW1lX3ByZXNlbnQ7CisgIGFvbV9kZWNfbW9kZWxfaW5mb190IGJ1ZmZlcl9tb2RlbDsKKyAgYW9tX2RlY19tb2RlbF9vcF9wYXJhbWV0ZXJzX3Qgb3BfcGFyYW1zW01BWF9OVU1fT1BFUkFUSU5HX1BPSU5UUyArIDFdOworICBhb21fb3BfdGltaW5nX2luZm9fdCBvcF9mcmFtZV90aW1pbmdbTUFYX05VTV9PUEVSQVRJTkdfUE9JTlRTICsgMV07CisgIHVpbnQzMl90IGZyYW1lX3ByZXNlbnRhdGlvbl90aW1lOworCisgIGludCBjb250ZXh0X3VwZGF0ZV90aWxlX2lkOworI2lmZGVmIFNVUFBPUlRfU0NBTEVfRkFDVE9SCisgIC8vIFNjYWxlIG9mIHRoZSBjdXJyZW50IGZyYW1lIHdpdGggcmVzcGVjdCB0byBpdHNlbGYuCisgIHN0cnVjdCBzY2FsZV9mYWN0b3JzIHNmX2lkZW50aXR5OworI2VuZGlmCisgIFJlZkNudEJ1ZmZlciAqcHJldl9mcmFtZTsKKworICAvLyBUT0RPKGhrdWFuZyk6IENvbWJpbmUgdGhpcyB3aXRoIGN1cl9idWYgaW4gbWFjcm9ibG9ja2QuCisgIFJlZkNudEJ1ZmZlciAqY3VyX2ZyYW1lOworCisgIC8vIEZvciBlbmNvZGVyLCB3ZSBoYXZlIGEgdHdvLWxldmVsIG1hcHBpbmcgZnJvbSByZWZlcmVuY2UgZnJhbWUgdHlwZSB0byB0aGUKKyAgLy8gY29ycmVzcG9uZGluZyBidWZmZXIgaW4gdGhlIGJ1ZmZlciBwb29sOgorICAvLyAqICdyZW1hcHBlZF9yZWZfaWR4W2kgLSAxXScgbWFwcyByZWZlcmVuY2UgdHlwZSAnaScgKHJhbmdlOiBMQVNUX0ZSQU1FIC4uLgorICAvLyBFWFRSRUZfRlJBTUUpIHRvIGEgcmVtYXBwZWQgaW5kZXggJ2onIChpbiByYW5nZTogMCAuLi4gUkVGX0ZSQU1FUyAtIDEpCisgIC8vICogTGF0ZXIsICdjbS0+cmVmX2ZyYW1lX21hcFtqXScgbWFwcyB0aGUgcmVtYXBwZWQgaW5kZXggJ2onIHRvIGEgcG9pbnRlciB0bworICAvLyB0aGUgcmVmZXJlbmNlIGNvdW50ZWQgYnVmZmVyIHN0cnVjdHVyZSBSZWZDbnRCdWZmZXIsIHRha2VuIGZyb20gdGhlIGJ1ZmZlcgorICAvLyBwb29sIGNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmcy4KKyAgLy8KKyAgLy8gTEFTVF9GUkFNRSwgICAgICAgICAgICAgICAgICAgICAgICAuLi4sICAgICAgRVhUUkVGX0ZSQU1FCisgIC8vICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgIC8vICAgICAgdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2CisgIC8vIHJlbWFwcGVkX3JlZl9pZHhbTEFTVF9GUkFNRSAtIDFdLCAgLi4uLCAgcmVtYXBwZWRfcmVmX2lkeFtFWFRSRUZfRlJBTUUgLSAxXQorICAvLyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAvLyAgICAgIHYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdgorICAvLyByZWZfZnJhbWVfbWFwW10sICAgICAgICAgICAgICAgICAgIC4uLiwgICAgIHJlZl9mcmFtZV9tYXBbXQorICAvLworICAvLyBOb3RlOiBJTlRSQV9GUkFNRSBhbHdheXMgcmVmZXJzIHRvIHRoZSBjdXJyZW50IGZyYW1lLCBzbyB0aGVyZSdzIG5vIG5lZWQgdG8KKyAgLy8gaGF2ZSBhIHJlbWFwcGVkIGluZGV4IGZvciB0aGUgc2FtZS4KKyAgaW50IHJlbWFwcGVkX3JlZl9pZHhbUkVGX0ZSQU1FU107CisKKyNpZmRlZiBTVVBQT1JUX1NDQUxFX0ZBQ1RPUgorICBzdHJ1Y3Qgc2NhbGVfZmFjdG9ycyByZWZfc2NhbGVfZmFjdG9yc1tSRUZfRlJBTUVTXTsKKyNlbmRpZgorICAvLyBGb3IgZGVjb2RlciwgcmVmX2ZyYW1lX21hcFtpXSBtYXBzIHJlZmVyZW5jZSB0eXBlICdpJyB0byBhIHBvaW50ZXIgdG8KKyAgLy8gdGhlIGJ1ZmZlciBpbiB0aGUgYnVmZmVyIHBvb2wgJ2NtLT5idWZmZXJfcG9vbC5mcmFtZV9idWZzJy4KKyAgLy8gRm9yIGVuY29kZXIsIHJlZl9mcmFtZV9tYXBbal0gKHdoZXJlIGogPSByZW1hcHBlZF9yZWZfaWR4W2ldKSBtYXBzCisgIC8vIHJlbWFwcGVkIHJlZmVyZW5jZSBpbmRleCAnaicgKHRoYXQgaXMsIG9yaWdpbmFsIHJlZmVyZW5jZSB0eXBlICdpJykgdG8KKyAgLy8gYSBwb2ludGVyIHRvIHRoZSBidWZmZXIgaW4gdGhlIGJ1ZmZlciBwb29sICdjbS0+YnVmZmVyX3Bvb2wuZnJhbWVfYnVmcycuCisgIFJlZkNudEJ1ZmZlciAqcmVmX2ZyYW1lX21hcFtSRUZfRlJBTUVTXTsKKworICAvLyBQcmVwYXJlIHJlZl9mcmFtZV9tYXAgZm9yIHRoZSBuZXh0IGZyYW1lLgorICAvLyBPbmx5IHVzZWQgaW4gZnJhbWUgcGFyYWxsZWwgZGVjb2RlLgorICBSZWZDbnRCdWZmZXIgKm5leHRfcmVmX2ZyYW1lX21hcFtSRUZfRlJBTUVTXTsKKyNpZmRlZiBBTUwKKyAgUmVmQ250QnVmZmVyICpuZXh0X3VzZWRfcmVmX2ZyYW1lX21hcFtSRUZfRlJBTUVTXTsKKyNlbmRpZgorICBGUkFNRV9UWVBFIGxhc3RfZnJhbWVfdHlwZTsgLyogbGFzdCBmcmFtZSdzIGZyYW1lIHR5cGUgZm9yIG1vdGlvbiBzZWFyY2guKi8KKworICBpbnQgc2hvd19mcmFtZTsKKyAgaW50IHNob3dhYmxlX2ZyYW1lOyAgLy8gZnJhbWUgY2FuIGJlIHVzZWQgYXMgc2hvdyBleGlzdGluZyBmcmFtZSBpbiBmdXR1cmUKKyAgaW50IHNob3dfZXhpc3RpbmdfZnJhbWU7CisKKyAgdWludDhfdCBkaXNhYmxlX2NkZl91cGRhdGU7CisgIGludCBhbGxvd19oaWdoX3ByZWNpc2lvbl9tdjsKKyAgdWludDhfdCBjdXJfZnJhbWVfZm9yY2VfaW50ZWdlcl9tdjsgIC8vIDAgdGhlIGRlZmF1bHQgaW4gQU9NLCAxIG9ubHkgaW50ZWdlcgorCisgIHVpbnQ4X3QgYWxsb3dfc2NyZWVuX2NvbnRlbnRfdG9vbHM7CisgIGludCBhbGxvd19pbnRyYWJjOworICBpbnQgYWxsb3dfd2FycGVkX21vdGlvbjsKKworICAvLyBNQnMsIG1iX3Jvd3MvY29scyBpcyBpbiAxNi1waXhlbCB1bml0czsgbWlfcm93cy9jb2xzIGlzIGluCisgIC8vIE1CX01PREVfSU5GTyAoOC1waXhlbCkgdW5pdHMuCisgIGludCBNQnM7CisgIGludCBtYl9yb3dzLCBtaV9yb3dzOworICBpbnQgbWJfY29scywgbWlfY29sczsKKyAgaW50IG1pX3N0cmlkZTsKKworICAvKiBwcm9maWxlIHNldHRpbmdzICovCisgIFRYX01PREUgdHhfbW9kZTsKKworI2lmIENPTkZJR19FTlRST1BZX1NUQVRTCisgIGludCBjb2VmX2NkZl9jYXRlZ29yeTsKKyNlbmRpZgorCisgIGludCBiYXNlX3FpbmRleDsKKyAgaW50IHlfZGNfZGVsdGFfcTsKKyAgaW50IHVfZGNfZGVsdGFfcTsKKyAgaW50IHZfZGNfZGVsdGFfcTsKKyAgaW50IHVfYWNfZGVsdGFfcTsKKyAgaW50IHZfYWNfZGVsdGFfcTsKKworI2lmZGVmIE9SSV9DT0RFCisgIC8vIFRoZSBkZXF1YW50aXplcnMgYmVsb3cgYXJlIHRydWUgZGVxdWFudGl6ZXJzIHVzZWQgb25seSBpbiB0aGUKKyAgLy8gZGVxdWFudGl6YXRpb24gcHJvY2Vzcy4gIFRoZXkgaGF2ZSB0aGUgc2FtZSBjb2VmZmljaWVudAorICAvLyBzaGlmdC9zY2FsZSBhcyBUWC4KKyAgaW50MTZfdCB5X2RlcXVhbnRfUVRYW01BWF9TRUdNRU5UU11bMl07CisgIGludDE2X3QgdV9kZXF1YW50X1FUWFtNQVhfU0VHTUVOVFNdWzJdOworICBpbnQxNl90IHZfZGVxdWFudF9RVFhbTUFYX1NFR01FTlRTXVsyXTsKKworICAvLyBHbG9iYWwgcXVhbnQgbWF0cml4IHRhYmxlcworICBjb25zdCBxbV92YWxfdCAqZ2lxbWF0cml4W05VTV9RTV9MRVZFTFNdWzNdW1RYX1NJWkVTX0FMTF07CisgIGNvbnN0IHFtX3ZhbF90ICpncW1hdHJpeFtOVU1fUU1fTEVWRUxTXVszXVtUWF9TSVpFU19BTExdOworCisgIC8vIExvY2FsIHF1YW50IG1hdHJpeCB0YWJsZXMgZm9yIGVhY2ggZnJhbWUKKyAgY29uc3QgcW1fdmFsX3QgKnlfaXFtYXRyaXhbTUFYX1NFR01FTlRTXVtUWF9TSVpFU19BTExdOworICBjb25zdCBxbV92YWxfdCAqdV9pcW1hdHJpeFtNQVhfU0VHTUVOVFNdW1RYX1NJWkVTX0FMTF07CisgIGNvbnN0IHFtX3ZhbF90ICp2X2lxbWF0cml4W01BWF9TRUdNRU5UU11bVFhfU0laRVNfQUxMXTsKKyNlbmRpZgorICAvLyBFbmNvZGVyCisgIGludCB1c2luZ19xbWF0cml4OworICBpbnQgcW1feTsKKyAgaW50IHFtX3U7CisgIGludCBxbV92OworICBpbnQgbWluX3FtbGV2ZWw7CisgIGludCBtYXhfcW1sZXZlbDsKKyAgaW50IHVzZV9xdWFudF9iX2FkYXB0OworCisgIC8qIFdlIGFsbG9jYXRlIGEgTUJfTU9ERV9JTkZPIHN0cnVjdCBmb3IgZWFjaCBtYWNyb2Jsb2NrLCB0b2dldGhlciB3aXRoCisgICAgIGFuIGV4dHJhIHJvdyBvbiB0b3AgYW5kIGNvbHVtbiBvbiB0aGUgbGVmdCB0byBzaW1wbGlmeSBwcmVkaWN0aW9uLiAqLworICBpbnQgbWlfYWxsb2Nfc2l6ZTsKKworI2lmZGVmIE9SSV9DT0RFCisgIE1CX01PREVfSU5GTyAqbWlwOyAvKiBCYXNlIG9mIGFsbG9jYXRlZCBhcnJheSAqLworICBNQl9NT0RFX0lORk8gKm1pOyAgLyogQ29ycmVzcG9uZHMgdG8gdXBwZXIgbGVmdCB2aXNpYmxlIG1hY3JvYmxvY2sgKi8KKworICAvLyBUT0RPKGFncmFuZ2UpOiBNb3ZlIHByZXZfbWkgaW50byBlbmNvZGVyIHN0cnVjdHVyZS4KKyAgLy8gcHJldl9taXAgYW5kIHByZXZfbWkgd2lsbCBvbmx5IGJlIGFsbG9jYXRlZCBpbiBlbmNvZGVyLgorICBNQl9NT0RFX0lORk8gKnByZXZfbWlwOyAvKiBNQl9NT0RFX0lORk8gYXJyYXkgJ21pcCcgZnJvbSBsYXN0IGRlY29kZWQgZnJhbWUgKi8KKyAgTUJfTU9ERV9JTkZPICpwcmV2X21pOyAgLyogJ21pJyBmcm9tIGxhc3QgZnJhbWUgKHBvaW50cyBpbnRvIHByZXZfbWlwKSAqLworCisgIC8vIFNlcGFyYXRlIG1pIGZ1bmN0aW9ucyBiZXR3ZWVuIGVuY29kZXIgYW5kIGRlY29kZXIuCisgIGludCAoKmFsbG9jX21pKShzdHJ1Y3QgQVYxQ29tbW9uICpjbSwgaW50IG1pX3NpemUpOworICB2b2lkICgqZnJlZV9taSkoc3RydWN0IEFWMUNvbW1vbiAqY20pOworICB2b2lkICgqc2V0dXBfbWkpKHN0cnVjdCBBVjFDb21tb24gKmNtKTsKKworICAvLyBHcmlkIG9mIHBvaW50ZXJzIHRvIDh4OCBNQl9NT0RFX0lORk8gc3RydWN0cy4gIEFueSA4eDggbm90IGluIHRoZSB2aXNpYmxlCisgIC8vIGFyZWEgd2lsbCBiZSBOVUxMLgorICBNQl9NT0RFX0lORk8gKiptaV9ncmlkX2Jhc2U7CisgIE1CX01PREVfSU5GTyAqKm1pX2dyaWRfdmlzaWJsZTsKKyAgTUJfTU9ERV9JTkZPICoqcHJldl9taV9ncmlkX2Jhc2U7CisgIE1CX01PREVfSU5GTyAqKnByZXZfbWlfZ3JpZF92aXNpYmxlOworI2VuZGlmCisgIC8vIFdoZXRoZXIgdG8gdXNlIHByZXZpb3VzIGZyYW1lcycgbW90aW9uIHZlY3RvcnMgZm9yIHByZWRpY3Rpb24uCisgIGludCBhbGxvd19yZWZfZnJhbWVfbXZzOworCisgIHVpbnQ4X3QgKmxhc3RfZnJhbWVfc2VnX21hcDsKKworI2lmZGVmIE9SSV9DT0RFCisgIEludGVycEZpbHRlciBpbnRlcnBfZmlsdGVyOworI2VuZGlmCisgIGludCBzd2l0Y2hhYmxlX21vdGlvbl9tb2RlOworI2lmZGVmIE9SSV9DT0RFCisgIGxvb3BfZmlsdGVyX2luZm9fbiBsZl9pbmZvOworI2VuZGlmCisgIC8vIFRoZSBkZW5vbWluYXRvciBvZiB0aGUgc3VwZXJyZXMgc2NhbGU7IHRoZSBudW1lcmF0b3IgaXMgZml4ZWQuCisgIHVpbnQ4X3Qgc3VwZXJyZXNfc2NhbGVfZGVub21pbmF0b3I7CisgIGludCBzdXBlcnJlc191cHNjYWxlZF93aWR0aDsKKyAgaW50IHN1cGVycmVzX3Vwc2NhbGVkX2hlaWdodDsKKworI2lmZGVmIE9SSV9DT0RFCisgIFJlc3RvcmF0aW9uSW5mbyByc3RfaW5mb1tNQVhfTUJfUExBTkVdOworI2VuZGlmCisgIC8vIFBvaW50ZXIgdG8gYSBzY3JhdGNoIGJ1ZmZlciB1c2VkIGJ5IHNlbGYtZ3VpZGVkIHJlc3RvcmF0aW9uCisgIGludDMyX3QgKnJzdF90bXBidWY7CisjaWZkZWYgT1JJX0NPREUKKyAgUmVzdG9yYXRpb25MaW5lQnVmZmVycyAqcmxiczsKKyNlbmRpZgorICAvLyBPdXRwdXQgb2YgbG9vcCByZXN0b3JhdGlvbgorICBQSUNfQlVGRkVSX0NPTkZJRyByc3RfZnJhbWU7CisKKyAgLy8gRmxhZyBzaWduYWxpbmcgaG93IGZyYW1lIGNvbnRleHRzIHNob3VsZCBiZSB1cGRhdGVkIGF0IHRoZSBlbmQgb2YKKyAgLy8gYSBmcmFtZSBkZWNvZGUKKyAgUkVGUkVTSF9GUkFNRV9DT05URVhUX01PREUgcmVmcmVzaF9mcmFtZV9jb250ZXh0OworCisgIGludCByZWZfZnJhbWVfc2lnbl9iaWFzW1JFRl9GUkFNRVNdOyAvKiBUd28gc3RhdGUgMCwgMSAqLworCisjaWZkZWYgT1JJX0NPREUKKyAgc3RydWN0IGxvb3BmaWx0ZXIgbGY7CisgIHN0cnVjdCBzZWdtZW50YXRpb24gc2VnOworI2VuZGlmCisKKyAgaW50IGNvZGVkX2xvc3NsZXNzOyAgLy8gZnJhbWUgaXMgZnVsbHkgbG9zc2xlc3MgYXQgdGhlIGNvZGVkIHJlc29sdXRpb24uCisgIGludCBhbGxfbG9zc2xlc3M7ICAgIC8vIGZyYW1lIGlzIGZ1bGx5IGxvc3NsZXNzIGF0IHRoZSB1cHNjYWxlZCByZXNvbHV0aW9uLgorCisgIGludCByZWR1Y2VkX3R4X3NldF91c2VkOworCisjaWZkZWYgT1JJX0NPREUKKyAgLy8gQ29udGV4dCBwcm9iYWJpbGl0aWVzIGZvciByZWZlcmVuY2UgZnJhbWUgcHJlZGljdGlvbgorICBNVl9SRUZFUkVOQ0VfRlJBTUUgY29tcF9md2RfcmVmW0ZXRF9SRUZTXTsKKyAgTVZfUkVGRVJFTkNFX0ZSQU1FIGNvbXBfYndkX3JlZltCV0RfUkVGU107CisKKyAgRlJBTUVfQ09OVEVYVCAqZmM7ICAgICAgICAgICAgICAvKiB0aGlzIGZyYW1lIGVudHJvcHkgKi8KKyAgRlJBTUVfQ09OVEVYVCAqZGVmYXVsdF9mcmFtZV9jb250ZXh0OworI2VuZGlmCisgIGludCBwcmltYXJ5X3JlZl9mcmFtZTsKKworICBpbnQgZXJyb3JfcmVzaWxpZW50X21vZGU7CisKKyAgaW50IHRpbGVfY29scywgdGlsZV9yb3dzOworCisgIGludCBtYXhfdGlsZV93aWR0aF9zYjsKKyAgaW50IG1pbl9sb2cyX3RpbGVfY29sczsKKyAgaW50IG1heF9sb2cyX3RpbGVfY29sczsKKyAgaW50IG1heF9sb2cyX3RpbGVfcm93czsKKyAgaW50IG1pbl9sb2cyX3RpbGVfcm93czsKKyAgaW50IG1pbl9sb2cyX3RpbGVzOworICBpbnQgbWF4X3RpbGVfaGVpZ2h0X3NiOworICBpbnQgdW5pZm9ybV90aWxlX3NwYWNpbmdfZmxhZzsKKyAgaW50IGxvZzJfdGlsZV9jb2xzOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgdmFsaWQgZm9yIHVuaWZvcm0gdGlsZXMKKyAgaW50IGxvZzJfdGlsZV9yb3dzOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgdmFsaWQgZm9yIHVuaWZvcm0gdGlsZXMKKyAgaW50IHRpbGVfY29sX3N0YXJ0X3NiW01BWF9USUxFX0NPTFMgKyAxXTsgIC8vIHZhbGlkIGZvciAwIDw9IGkgPD0gdGlsZV9jb2xzCisgIGludCB0aWxlX3Jvd19zdGFydF9zYltNQVhfVElMRV9ST1dTICsgMV07ICAvLyB2YWxpZCBmb3IgMCA8PSBpIDw9IHRpbGVfcm93cworICBpbnQgdGlsZV93aWR0aCwgdGlsZV9oZWlnaHQ7ICAgICAgICAgICAgICAgLy8gSW4gTUkgdW5pdHMKKyAgaW50IG1pbl9pbm5lcl90aWxlX3dpZHRoOyAgICAgICAgICAgICAgICAgIC8vIG1pbiB3aWR0aCBvZiBub24tcmlnaHRtb3N0IHRpbGUKKworICB1bnNpZ25lZCBpbnQgbGFyZ2Vfc2NhbGVfdGlsZTsKKyAgdW5zaWduZWQgaW50IHNpbmdsZV90aWxlX2RlY29kaW5nOworCisgIGludCBieXRlX2FsaWdubWVudDsKKyAgaW50IHNraXBfbG9vcF9maWx0ZXI7CisgIGludCBza2lwX2ZpbG1fZ3JhaW47CisKKyAgLy8gRXh0ZXJuYWwgQnVmZmVyUG9vbCBwYXNzZWQgZnJvbSBvdXRzaWRlLgorICBCdWZmZXJQb29sICpidWZmZXJfcG9vbDsKKworI2lmZGVmIE9SSV9DT0RFCisgIFBBUlRJVElPTl9DT05URVhUICoqYWJvdmVfc2VnX2NvbnRleHQ7CisgIEVOVFJPUFlfQ09OVEVYVCAqKmFib3ZlX2NvbnRleHRbTUFYX01CX1BMQU5FXTsKKyAgVFhGTV9DT05URVhUICoqYWJvdmVfdHhmbV9jb250ZXh0OworICBXYXJwZWRNb3Rpb25QYXJhbXMgZ2xvYmFsX21vdGlvbltSRUZfRlJBTUVTXTsKKyAgYW9tX2ZpbG1fZ3JhaW5fdCBmaWxtX2dyYWluX3BhcmFtczsKKworICBDZGVmSW5mbyBjZGVmX2luZm87CisgIERlbHRhUUluZm8gZGVsdGFfcV9pbmZvOyAgLy8gRGVsdGEgUSBhbmQgRGVsdGEgTEYgcGFyYW1ldGVycworI2VuZGlmCisgIGludCBudW1fdGc7CisgIFNlcXVlbmNlSGVhZGVyIHNlcV9wYXJhbXM7CisgIGludCBjdXJyZW50X2ZyYW1lX2lkOworICBpbnQgcmVmX2ZyYW1lX2lkW1JFRl9GUkFNRVNdOworICBpbnQgdmFsaWRfZm9yX3JlZmVyZW5jaW5nW1JFRl9GUkFNRVNdOworI2lmZGVmIE9SSV9DT0RFCisgIFRQTF9NVl9SRUYgKnRwbF9tdnM7CisjZW5kaWYKKyAgaW50IHRwbF9tdnNfbWVtX3NpemU7CisgIC8vIFRPRE8oamluZ25pbmcpOiBUaGlzIGNhbiBiZSBjb21iaW5lZCB3aXRoIHNpZ25fYmlhcyBsYXRlci4KKyAgaW50OF90IHJlZl9mcmFtZV9zaWRlW1JFRl9GUkFNRVNdOworCisgIGludCBpc19hbm5leGI7CisKKyAgaW50IHRlbXBvcmFsX2xheWVyX2lkOworICBpbnQgc3BhdGlhbF9sYXllcl9pZDsKKyAgdW5zaWduZWQgaW50IG51bWJlcl90ZW1wb3JhbF9sYXllcnM7CisgIHVuc2lnbmVkIGludCBudW1iZXJfc3BhdGlhbF9sYXllcnM7CisgIGludCBudW1fYWxsb2NhdGVkX2Fib3ZlX2NvbnRleHRfbWlfY29sOworICBpbnQgbnVtX2FsbG9jYXRlZF9hYm92ZV9jb250ZXh0czsKKyAgaW50IG51bV9hbGxvY2F0ZWRfYWJvdmVfY29udGV4dF9wbGFuZXM7CisKKyNpZiBUWENPRUZGX1RJTUVSCisgIGludDY0X3QgY3VtX3R4Y29lZmZfdGltZXI7CisgIGludDY0X3QgdHhjb2VmZl90aW1lcjsKKyAgaW50IHR4Yl9jb3VudDsKKyNlbmRpZgorCisjaWYgVFhDT0VGRl9DT1NUX1RJTUVSCisgIGludDY0X3QgY3VtX3R4Y29lZmZfY29zdF90aW1lcjsKKyAgaW50NjRfdCB0eGNvZWZmX2Nvc3RfdGltZXI7CisgIGludDY0X3QgdHhjb2VmZl9jb3N0X2NvdW50OworI2VuZGlmCisgIGNvbnN0IGNmZ19vcHRpb25zX3QgKm9wdGlvbnM7CisgIGludCBpc19kZWNvZGluZzsKKyNpZmRlZiBBTUwKKyAgaW50IG12X3JlZl9vZmZzZXRbTVZfUkVGX1NJWkVdW1JFRl9GUkFNRVNdOworICBpbnQgbXZfcmVmX2lkW01WX1JFRl9TSVpFXTsKKyAgdW5zaWduZWQgY2hhciBtdl9jYWxfdHBsX212c1tNVl9SRUZfU0laRV07CisgIGludCBtdl9yZWZfaWRfaW5kZXg7CisgICAgICBpbnQgcHJldl9mYl9pZHg7CisgICAgaW50IG5ld19mYl9pZHg7CisgICAgaW50MzJfdCBkZWNfd2lkdGg7CisjZW5kaWYKKyNpZmRlZiBBTUxfREVWSUNFCisgICAgICBpbnQgY3VyX2ZiX2lkeF9tbXU7CisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKyAgICAgIGludCBjdXJfZmJfaWR4X21tdV9kdzsKKyNlbmRpZgorICAgICAgaW50IGN1cnJlbnRfdmlkZW9fZnJhbWU7CisgICAgICBpbnQgdXNlX3ByZXZfZnJhbWVfbXZzOworICAgICAgaW50IGZyYW1lX3R5cGU7CisgICAgICBpbnQgaW50cmFfb25seTsKKyAgc3RydWN0IFJlZkNudEJ1ZmZlcl9zIGZyYW1lX3JlZnNbSU5URVJfUkVGU19QRVJfRlJBTUVdOworCisjZW5kaWYKK30gQVYxX0NPTU1PTjsKKworCisvKgorZnJvbToKKwlkZWNvZGVyL2RlY29kZXIuaAorKi8KKwordHlwZWRlZiBzdHJ1Y3QgRVhURVJOQUxfUkVGRVJFTkNFUyB7CisgIFBJQ19CVUZGRVJfQ09ORklHIHJlZnNbTUFYX0VYVEVSTkFMX1JFRkVSRU5DRVNdOworICBpbnQgbnVtOworfSBFWFRFUk5BTF9SRUZFUkVOQ0VTOworCit0eXBlZGVmIHN0cnVjdCBBVjFEZWNvZGVyIHsKKyAgLy9ERUNMQVJFX0FMSUdORUQoMzIsIE1BQ1JPQkxPQ0tELCBtYik7CisKKyAgLy9ERUNMQVJFX0FMSUdORUQoMzIsIEFWMV9DT01NT04sIGNvbW1vbik7CisgIEFWMV9DT01NT04gKmNvbW1vbjsKKworI2lmZGVmIE9SSV9DT0RFCisgIEFWeFdvcmtlciBsZl93b3JrZXI7CisgIEFWMUxmU3luYyBsZl9yb3dfc3luYzsKKyAgQVYxTHJTeW5jIGxyX3Jvd19zeW5jOworICBBVjFMclN0cnVjdCBscl9jdHh0OworICBBVnhXb3JrZXIgKnRpbGVfd29ya2VyczsKKyAgaW50IG51bV93b3JrZXJzOworICBEZWNXb3JrZXJEYXRhICp0aHJlYWRfZGF0YTsKKyAgVGhyZWFkRGF0YSB0ZDsKKyAgVGlsZURhdGFEZWMgKnRpbGVfZGF0YTsKKyAgaW50IGFsbG9jYXRlZF90aWxlczsKKyAgVGlsZUJ1ZmZlckRlYyB0aWxlX2J1ZmZlcnNbTUFYX1RJTEVfUk9XU11bTUFYX1RJTEVfQ09MU107CisgIEFWMURlY1RpbGVNVCB0aWxlX210X2luZm87CisjZW5kaWYKKworICAvLyBFYWNoIHRpbWUgdGhlIGRlY29kZXIgaXMgY2FsbGVkLCB3ZSBleHBlY3QgdG8gcmVjZWl2ZSBhIGZ1bGwgdGVtcG9yYWwgdW5pdC4KKyAgLy8gVGhpcyBjYW4gY29udGFpbiB1cCB0byBvbmUgc2hvd24gZnJhbWUgcGVyIHNwYXRpYWwgbGF5ZXIgaW4gdGhlIGN1cnJlbnQKKyAgLy8gb3BlcmF0aW5nIHBvaW50IChub3RlIHRoYXQgc29tZSBsYXllcnMgbWF5IGJlIGVudGlyZWx5IG9taXR0ZWQpLgorICAvLyBJZiB0aGUgJ291dHB1dF9hbGxfbGF5ZXJzJyBvcHRpb24gaXMgdHJ1ZSwgd2Ugc2F2ZSBhbGwgb2YgdGhlc2Ugc2hvd24KKyAgLy8gZnJhbWVzIHNvIHRoYXQgdGhleSBjYW4gYmUgcmV0dXJuZWQgdG8gdGhlIGFwcGxpY2F0aW9uLiBJZiB0aGUKKyAgLy8gJ291dHB1dF9hbGxfbGF5ZXJzJyBvcHRpb24gaXMgZmFsc2UsIHRoZW4gd2Ugb25seSBvdXRwdXQgb25lIGltYWdlIHBlcgorICAvLyB0ZW1wb3JhbCB1bml0LgorICAvLworICAvLyBOb3RlOiBUaGUgc2F2ZWQgYnVmZmVycyBhcmUgcmVsZWFzZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IHRpbWUgdGhlCisgIC8vIGFwcGxpY2F0aW9uIGNhbGxzIGFvbV9jb2RlY19kZWNvZGUoKS4KKyAgaW50IG91dHB1dF9hbGxfbGF5ZXJzOworICBSZWZDbnRCdWZmZXIgKm91dHB1dF9mcmFtZXNbTUFYX05VTV9TUEFUSUFMX0xBWUVSU107CisgIHNpemVfdCBudW1fb3V0cHV0X2ZyYW1lczsgIC8vIEhvdyBtYW55IGZyYW1lcyBhcmUgcXVldWVkIHVwIHNvIGZhcj8KKworICAvLyBJbiBvcmRlciB0byBwcm9wZXJseSBzdXBwb3J0IHJhbmRvbS1hY2Nlc3MgZGVjb2RpbmcsIHdlIG5lZWQKKyAgLy8gdG8gYmVoYXZlIHNsaWdodGx5IGRpZmZlcmVudGx5IGZvciB0aGUgdmVyeSBmaXJzdCBmcmFtZSB3ZSBkZWNvZGUuCisgIC8vIFNvIHdlIHRyYWNrIHdoZXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgZnJhbWUgb3Igbm90LgorICBpbnQgZGVjb2RpbmdfZmlyc3RfZnJhbWU7CisKKyAgaW50IGFsbG93X2xvd2JpdGRlcHRoOworICBpbnQgbWF4X3RocmVhZHM7CisgIGludCBpbnZfdGlsZV9vcmRlcjsKKyAgaW50IG5lZWRfcmVzeW5jOyAgIC8vIHdhaXQgZm9yIGtleS9pbnRyYS1vbmx5IGZyYW1lLgorICBpbnQgaG9sZF9yZWZfYnVmOyAgLy8gQm9vbGVhbjogd2hldGhlciB3ZSBhcmUgaG9sZGluZyByZWZlcmVuY2UgYnVmZmVycyBpbgorICAgICAgICAgICAgICAgICAgICAgLy8gY29tbW9uLm5leHRfcmVmX2ZyYW1lX21hcC4KKyAgaW50IHJlc2V0X2RlY29kZXJfc3RhdGU7CisKKyAgaW50IHRpbGVfc2l6ZV9ieXRlczsKKyAgaW50IHRpbGVfY29sX3NpemVfYnl0ZXM7CisgIGludCBkZWNfdGlsZV9yb3csIGRlY190aWxlX2NvbDsgIC8vIGFsd2F5cyAtMSBmb3Igbm9uLVZSIHRpbGUgZW5jb2RpbmcKKyNpZiBDT05GSUdfQUNDT1VOVElORworICBpbnQgYWNjdF9lbmFibGVkOworICBBY2NvdW50aW5nIGFjY291bnRpbmc7CisjZW5kaWYKKyAgaW50IHRnX3NpemU7ICAgLy8gTnVtYmVyIG9mIHRpbGVzIGluIHRoZSBjdXJyZW50IHRpbGVncm91cAorICBpbnQgdGdfc3RhcnQ7ICAvLyBGaXJzdCB0aWxlIGluIHRoZSBjdXJyZW50IHRpbGVncm91cAorICBpbnQgdGdfc2l6ZV9iaXRfb2Zmc2V0OworICBpbnQgc2VxdWVuY2VfaGVhZGVyX3JlYWR5OworICBpbnQgc2VxdWVuY2VfaGVhZGVyX2NoYW5nZWQ7CisjaWYgQ09ORklHX0lOU1BFQ1RJT04KKyAgYW9tX2luc3BlY3RfY2IgaW5zcGVjdF9jYjsKKyAgdm9pZCAqaW5zcGVjdF9jdHg7CisjZW5kaWYKKyAgaW50IG9wZXJhdGluZ19wb2ludDsKKyAgaW50IGN1cnJlbnRfb3BlcmF0aW5nX3BvaW50OworICBpbnQgc2Vlbl9mcmFtZV9oZWFkZXI7CisKKyAgLy8gU3RhdGUgaWYgdGhlIGNhbWVyYSBmcmFtZSBoZWFkZXIgaXMgYWxyZWFkeSBkZWNvZGVkIHdoaWxlCisgIC8vIGxhcmdlX3NjYWxlX3RpbGUgPSAxLgorICBpbnQgY2FtZXJhX2ZyYW1lX2hlYWRlcl9yZWFkeTsKKyAgc2l6ZV90IGZyYW1lX2hlYWRlcl9zaXplOworI2lmZGVmIE9SSV9DT0RFCisgIERhdGFCdWZmZXIgb2J1X3NpemVfaGRyOworI2VuZGlmCisgIGludCBvdXRwdXRfZnJhbWVfd2lkdGhfaW5fdGlsZXNfbWludXNfMTsKKyAgaW50IG91dHB1dF9mcmFtZV9oZWlnaHRfaW5fdGlsZXNfbWludXNfMTsKKyAgaW50IHRpbGVfY291bnRfbWludXNfMTsKKyAgdWludDMyX3QgY29kZWRfdGlsZV9kYXRhX3NpemU7CisgIHVuc2lnbmVkIGludCBleHRfdGlsZV9kZWJ1ZzsgIC8vIGZvciBleHQtdGlsZSBzb2Z0d2FyZSBkZWJ1ZyAmIHRlc3RpbmcKKyAgdW5zaWduZWQgaW50IHJvd19tdDsKKyAgRVhURVJOQUxfUkVGRVJFTkNFUyBleHRfcmVmczsKKyAgUElDX0JVRkZFUl9DT05GSUcgdGlsZV9saXN0X291dGJ1ZjsKKworI2lmZGVmIE9SSV9DT0RFCisgIENCX0JVRkZFUiAqY2JfYnVmZmVyX2Jhc2U7CisjZW5kaWYKKyAgaW50IGNiX2J1ZmZlcl9hbGxvY19zaXplOworCisgIGludCBhbGxvY2F0ZWRfcm93X210X3N5bmNfcm93czsKKworI2lmIENPTkZJR19NVUxUSVRIUkVBRAorICBwdGhyZWFkX211dGV4X3QgKnJvd19tdF9tdXRleF87CisgIHB0aHJlYWRfY29uZF90ICpyb3dfbXRfY29uZF87CisjZW5kaWYKKworI2lmZGVmIE9SSV9DT0RFCisgIEFWMURlY1Jvd01USW5mbyBmcmFtZV9yb3dfbXRfaW5mbzsKKyNlbmRpZgorCisjaWZkZWYgQU1MCisgIHVuc2lnbmVkIGNoYXIgcHJlZF9pbnRlcl9yZWFkX2VuYWJsZTsKKyAgaW50IGN1cl9vYnVfdHlwZTsKKyAgaW50IGRlY29kZV9pZHg7CisgIGludCBidWZtZ3JfcHJvY19jb3VudDsKKyAgaW50IG9idV9mcmFtZV9mcmFtZV9oZWFkX2NvbWVfYWZ0ZXJfdGlsZTsKKyAgICB1aW50MzJfdCBmcmFtZV93aWR0aDsKKyAgICB1aW50MzJfdCBmcmFtZV9oZWlnaHQ7CisgICAgQnVmZkluZm9fdCogd29ya19zcGFjZV9idWY7CisgICAgYnVmZl90KiBtY19idWY7CisgICAgLy91bnNpZ25lZCBzaG9ydCAqcnBtX3B0cjsKKyAgICB2b2lkICpwcml2YXRlX2RhdGE7CisgICAgdTMyIHByZV9zdHJlYW1fb2Zmc2V0OworI2VuZGlmCit9IEFWMURlY29kZXI7CisKKyNkZWZpbmUgUlBNX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwCisjZGVmaW5lIFJQTV9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDI4MAorCit0eXBlZGVmIHVuaW9uIHBhcmFtX3UgeworICAgIHN0cnVjdCB7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGRhdGFbUlBNX0VORCAtIFJQTV9CRUdJTl07CisgICAgfSBsOworICAgIHN0cnVjdCB7CisgICAgICAgIC8qc2VxdWVuY2UgaGVhZCovCisgICAgICAgIHVuc2lnbmVkIHNob3J0IHByb2ZpbGU7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IHN0aWxsX3BpY3R1cmU7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IHJlZHVjZWRfc3RpbGxfcGljdHVyZV9oZHI7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGRlY29kZXJfbW9kZWxfaW5mb19wcmVzZW50X2ZsYWc7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IG1heF9mcmFtZV93aWR0aDsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgbWF4X2ZyYW1lX2hlaWdodDsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgZnJhbWVfaWRfbnVtYmVyc19wcmVzZW50X2ZsYWc7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGRlbHRhX2ZyYW1lX2lkX2xlbmd0aDsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgZnJhbWVfaWRfbGVuZ3RoOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBvcmRlcl9oaW50X2JpdHNfbWludXNfMTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgZW5hYmxlX29yZGVyX2hpbnQ7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGVuYWJsZV9kaXN0X3d0ZF9jb21wOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBlbmFibGVfcmVmX2ZyYW1lX212czsKKworICAgICAgICAvKmZyYW1lIGhlYWQqLworICAgICAgICB1bnNpZ25lZCBzaG9ydCBzaG93X2V4aXN0aW5nX2ZyYW1lOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBmcmFtZV90eXBlOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBzaG93X2ZyYW1lOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBlcnJvcl9yZXNpbGllbnRfbW9kZTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgcmVmcmVzaF9mcmFtZV9mbGFnczsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgc2hvd2FibGVfZnJhbWU7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGN1cnJlbnRfZnJhbWVfaWQ7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGZyYW1lX3NpemVfb3ZlcnJpZGVfZmxhZzsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgb3JkZXJfaGludDsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgcHJpbWFyeV9yZWZfZnJhbWU7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGZyYW1lX3JlZnNfc2hvcnRfc2lnbmFsaW5nOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBmcmFtZV93aWR0aDsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgZGVjX2ZyYW1lX3dpZHRoOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBmcmFtZV93aWR0aF9zY2FsZWQ7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGZyYW1lX2hlaWdodDsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgcmVmZXJlbmNlX21vZGU7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGFsbG93X3JlZl9mcmFtZV9tdnM7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IHN1cGVycmVzX3NjYWxlX2Rlbm9taW5hdG9yOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBsc3RfcmVmOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBnbGRfcmVmOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBleGlzdGluZ19mcmFtZV9pZHg7CisKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgcmVtYXBwZWRfcmVmX2lkeFtJTlRFUl9SRUZTX1BFUl9GUkFNRV07CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGRlbHRhX2ZyYW1lX2lkX21pbnVzXzFbSU5URVJfUkVGU19QRVJfRlJBTUVdOworICAgICAgICB1bnNpZ25lZCBzaG9ydCByZWZfb3JkZXJfaGludFtSRUZfRlJBTUVTXTsKKyAgICAgICAgLypvdGhlciBub3QgaW4gcmVmZXJlbmNlKi8KKyAgICAgICAgdW5zaWduZWQgc2hvcnQgYml0X2RlcHRoOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBzZXFfZmxhZ3M7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IHVwZGF0ZV9wYXJhbWV0ZXJzOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBmaWxtX2dyYWluX3BhcmFtc19yZWZfaWR4OworCisgICAgICAgIC8qbG9vcF9maWx0ZXIgJiBzZWdtZW50YXRpb24qLworICAgICAgICB1bnNpZ25lZCBzaG9ydCBsb29wX2ZpbHRlcl9zaGFycG5lc3NfbGV2ZWw7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGxvb3BfZmlsdGVyX21vZGVfcmVmX2RlbHRhX2VuYWJsZWQ7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGxvb3BfZmlsdGVyX3JlZl9kZWx0YXNfMDsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgbG9vcF9maWx0ZXJfcmVmX2RlbHRhc18xOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBsb29wX2ZpbHRlcl9yZWZfZGVsdGFzXzI7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGxvb3BfZmlsdGVyX3JlZl9kZWx0YXNfMzsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgbG9vcF9maWx0ZXJfcmVmX2RlbHRhc180OworICAgICAgICB1bnNpZ25lZCBzaG9ydCBsb29wX2ZpbHRlcl9yZWZfZGVsdGFzXzU7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGxvb3BfZmlsdGVyX3JlZl9kZWx0YXNfNjsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgbG9vcF9maWx0ZXJfcmVmX2RlbHRhc183OworICAgICAgICB1bnNpZ25lZCBzaG9ydCBsb29wX2ZpbHRlcl9tb2RlX2RlbHRhc18wOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBsb29wX2ZpbHRlcl9tb2RlX2RlbHRhc18xOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBsb29wX2ZpbHRlcl9sZXZlbF8wOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBsb29wX2ZpbHRlcl9sZXZlbF8xOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBsb29wX2ZpbHRlcl9sZXZlbF91OworICAgICAgICB1bnNpZ25lZCBzaG9ydCBsb29wX2ZpbHRlcl9sZXZlbF92OworCisgICAgICAgIHVuc2lnbmVkIHNob3J0IHNlZ21lbnRhdGlvbl9lbmFibGVkOworICAgICAgICAgIC8qCisgICAgICAgICAgIFNFR19MVkxfQUxUX0xGX1lfViBmZWF0dXJlX2VuYWJsZTogc2VnX2xmX2luZm9feVtiaXQ3XQorICAgICAgICAgICBTRUdfTFZMX0FMVF9MRl9ZX1YgZGF0YTogc2VnX2xmX2luZm9feVtiaXQwfjZdCisgICAgICAgICAgIFNFR19MVkxfQUxUX0xGX1lfSCBmZWF0dXJlIGVuYWJsZTogc2VnX2xmX2luZm9feVtiaXQxNV0KKyAgICAgICAgICAgU0VHX0xWTF9BTFRfTEZfWV9IIGRhdGE6IHNlZ19sZl9pbmZvX3lbYml0OH4xNF0KKyAgICAgICAgICAgKi8KKyAgICAgICAgdW5zaWduZWQgc2hvcnQgc2VnX2xmX2luZm9feVs4XTsKKyAgICAgICAgICAvKgorICAgICAgICAgICBTRUdfTFZMX0FMVF9MRl9VIGZlYXR1cmVfZW5hYmxlOiBzZWdfbGZfaW5mb195W2JpdDddCisgICAgICAgICAgIFNFR19MVkxfQUxUX0xGX1UgZGF0YTogc2VnX2xmX2luZm9feVtiaXQwfjZdCisgICAgICAgICAgIFNFR19MVkxfQUxUX0xGX1YgZmVhdHVyZSBlbmFibGU6IHNlZ19sZl9pbmZvX3lbYml0MTVdCisgICAgICAgICAgIFNFR19MVkxfQUxUX0xGX1YgZGF0YTogc2VnX2xmX2luZm9feVtiaXQ4fjE0XQorICAgICAgICAgICAqLworICAgICAgICB1bnNpZ25lZCBzaG9ydCBzZWdfbGZfaW5mb19jWzhdOworCQl1bnNpZ25lZCBzaG9ydCB2aWRlb19zaWduYWxfdHlwZTsKKwkJdW5zaWduZWQgc2hvcnQgY29sb3JfZGVzY3JpcHRpb247CisKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgbW11X3VzZWRfbnVtOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBkd19tbXVfdXNlZF9udW07CisgICAgICAgIHVuc2lnbmVkIHNob3J0IHNlcV9mbGFnc18yOworCQl1bnNpZ25lZCBzaG9ydCBmaWxtX2dyYWluX3ByZXNlbnRfZmxhZzsKKworICAgICAgICAvKnVjb2RlIGVuZCovCisgICAgICAgIC8qb3RoZXIqLworICAgICAgICB1bnNpZ25lZCBzaG9ydCBlbmFibGVfc3VwZXJyZXM7CisKKyAgICAgICAgLypzZXFlbmNlIG5vdCB1c2UqLworICAgICAgICB1bnNpZ25lZCBzaG9ydCBvcGVyYXRpbmdfcG9pbnRzX2NudF9taW51c18xOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBvcGVyYXRpbmdfcG9pbnRfaWRjW01BWF9OVU1fT1BFUkFUSU5HX1BPSU5UU107CisgICAgICAgIHVuc2lnbmVkIHNob3J0IHNlcV9sZXZlbF9pZHhbTUFYX05VTV9PUEVSQVRJTkdfUE9JTlRTXTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgZGVjb2Rlcl9tb2RlbF9wYXJhbV9wcmVzZW50X2ZsYWdbTUFYX05VTV9PUEVSQVRJTkdfUE9JTlRTXTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgdGltaW5nX2luZm9fcHJlc2VudDsKKyAgICAgICAgLypmcmFtZSBoZWFkIG5vdCB1c2UqLworICAgICAgICB1bnNpZ25lZCBzaG9ydCBkaXNwbGF5X2ZyYW1lX2lkOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBmcmFtZV9wcmVzZW50YXRpb25fdGltZTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgYnVmZmVyX3JlbW92YWxfdGltZV9wcmVzZW50OworICAgICAgICB1bnNpZ25lZCBzaG9ydCBvcF9mcmFtZV90aW1pbmdbTUFYX05VTV9PUEVSQVRJTkdfUE9JTlRTICsgMV07CisgICAgICAgIHVuc2lnbmVkIHNob3J0IHZhbGlkX3JlZl9mcmFtZV9iaXRzOworCisgICAgfSBwOworfXBhcmFtX3Q7CisKK1BJQ19CVUZGRVJfQ09ORklHICphdjFfZ2V0X3JlZl9mcmFtZV9zcGVjX2J1ZigKKyAgICBjb25zdCBBVjFfQ09NTU9OICpjb25zdCBjbSwgY29uc3QgTVZfUkVGRVJFTkNFX0ZSQU1FIHJlZl9mcmFtZSk7CisKK2ludCBhdjFfYnVmbWdyX3Byb2Nlc3MoQVYxRGVjb2RlciAqcGJpLCB1bmlvbiBwYXJhbV91ICpwYXJhbXMsCisgICAgdW5zaWduZWQgY2hhciBuZXdfY29tcHJlc3NlZF9kYXRhLCBpbnQgb2J1X3R5cGUpOworCitzdHJ1Y3Qgc2NhbGVfZmFjdG9ycyAqYXYxX2dldF9yZWZfc2NhbGVfZmFjdG9ycygKKyAgQVYxX0NPTU1PTiAqY29uc3QgY20sIGNvbnN0IE1WX1JFRkVSRU5DRV9GUkFNRSByZWZfZnJhbWUpOworCit2b2lkIGF2MV9zZXRfbmV4dF9yZWZfZnJhbWVfbWFwKEFWMURlY29kZXIgKnBiaSk7CisKK3Vuc2lnbmVkIGludCBhdjFfZ2V0X25leHRfdXNlZF9yZWZfaW5mbygKKyAgICBjb25zdCBBVjFfQ09NTU9OICpjb25zdCBjbSwgaW50IGkpOworCit2b2lkIGF2MV9yZWxlYXNlX2J1ZihBVjFEZWNvZGVyICpwYmksIFJlZkNudEJ1ZmZlciAqY29uc3QgYnVmKTsKKworaW50IGF2MV9idWZtZ3JfcG9zdHByb2MoQVYxRGVjb2RlciAqcGJpLCB1bnNpZ25lZCBjaGFyIGZyYW1lX2RlY29kZWQpOworCitBVjFEZWNvZGVyICphdjFfZGVjb2Rlcl9jcmVhdGUoQnVmZmVyUG9vbCAqY29uc3QgcG9vbCwgQVYxX0NPTU1PTiAqY20pOworCit1bnNpZ25lZCBjaGFyIGF2MV9mcmFtZV9pc19pbnRlcihjb25zdCBBVjFfQ09NTU9OICpjb25zdCBjbSk7CisKK1JlZkNudEJ1ZmZlciAqYXYxX2dldF9wcmltYXJ5X3JlZl9mcmFtZV9idWYoCisgIGNvbnN0IEFWMV9DT01NT04gKmNvbnN0IGNtKTsKKwordm9pZCBhdjFfcmF3X3dyaXRlX2ltYWdlKEFWMURlY29kZXIgKnBiaSwgUElDX0JVRkZFUl9DT05GSUcgKnNkKTsKKworaW50IGdldF9mcmVlX2ZyYW1lX2J1ZmZlcihzdHJ1Y3QgQVYxX0NvbW1vbl9zICpjbSk7CisKK2ludCBjaGVja19idWZmX2hhc19zaG93KHN0cnVjdCBSZWZDbnRCdWZmZXJfcyAqZnJhbWVfYnVmKTsKKwordm9pZCBhdjFfYnVmbWdyX2N0eF9yZXNldChBVjFEZWNvZGVyICpwYmksIEJ1ZmZlclBvb2wgKmNvbnN0IHBvb2wsIEFWMV9DT01NT04gKmNtKTsKKworI2lmIDEKKyNkZWZpbmUgbG9ja19idWZmZXJfcG9vbChwb29sLCBmbGFncykgXAorICAgIHNwaW5fbG9ja19pcnFzYXZlKCZwb29sLT5sb2NrLCBmbGFncykKKworI2RlZmluZSB1bmxvY2tfYnVmZmVyX3Bvb2wocG9vbCwgZmxhZ3MpIFwKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBmbGFncykKKyNlbHNlCisjZGVmaW5lIGxvY2tfYnVmZmVyX3Bvb2wocG9vbCwgZmxhZ3MpIGZsYWdzPTE7CisKKyNkZWZpbmUgdW5sb2NrX2J1ZmZlcl9wb29sKHBvb2wsIGZsYWdzKSBmbGFncz0wOworCisjZW5kaWYKKworI2RlZmluZSBBVjFfREVCVUdfQlVGTUdSICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQVYxX0RFQlVHX0JVRk1HUl9NT1JFICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEFWMV9ERUJVR19CVUZNR1JfREVUQUlMICAgICAgICAgICAgMHgwNAorI2RlZmluZSBBVjFfREVCVUdfVElNRU9VVF9JTkZPICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgQVYxX0RFQlVHX09VVF9QVFMgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIEFPTV9ERUJVR19IV19NT1JFICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBBT01fREVCVUdfVkZSQU1FICAgICAgICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgQU9NX0RFQlVHX1BSSU5UX0xJU1RfSU5GTyAgICAgICAgICAweDgwCisjZGVmaW5lIEFPTV9BVjFfREVCVUdfU0VORF9QQVJBTV9XSVRIX1JFRyAgICAgIDB4MTAwCisjZGVmaW5lIEFWMV9ERUJVR19JR05PUkVfVkZfUkVGICAgICAgICAgICAgMHgyMDAKKyNkZWZpbmUgQVYxX0RFQlVHX0RCR19MRl9QUklOVCAgICAgICAgICAgICAweDQwMAorI2RlZmluZSBBVjFfREVCVUdfUkVHICAgICAgICAgICAgICAgICAgICAgIDB4ODAwCisjZGVmaW5lIEFPTV9ERUJVR19CVUZNR1JfT05MWSAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIEFPTV9ERUJVR19BVVhfREFUQSAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIEFWMV9ERUJVR19RT1NfSU5GTyAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIEFPTV9ERUJVR19EV19ESVNQX01BSU4gICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIEFWMV9ERUJVR19ESVNfTE9DX0VSUk9SX1BST0MgICAgICAgMHgxMDAwMAorI2RlZmluZSBBT01fREVCVUdfRElTX1JFQ1lDTEVfTU1VX1RBSUwgICAgIDB4MjAwMDAKKyNkZWZpbmUgQVYxX0RFQlVHX0RVTVBfUElDX0xJU1QgICAgICAgMHg0MDAwMAorI2RlZmluZSBBVjFfREVCVUdfVFJJR19TTElDRV9TRUdNRU5UX1BST0MgMHg4MDAwMAorI2RlZmluZSBBT01fREVCVUdfVVNFX0ZJWEVEX01WX0JVRl9TSVpFICAweDEwMDAwMAorI2RlZmluZSBBVjFfREVCVUdfTE9BRF9VQ09ERV9GUk9NX0ZJTEUgICAweDIwMDAwMAorI2RlZmluZSBBVjFfREVCVUdfRk9SQ0VfU0VORF9BR0FJTiAgICAgICAweDQwMDAwMAorI2RlZmluZSBBVjFfREVCVUdfRFVNUF9EQVRBICAgICAgICAgICAgICAweDgwMDAwMAorI2RlZmluZSBBVjFfREVCVUdfQ0FDSEUgICAgICAgICAgICAgICAgICAweDEwMDAwMDAKKyNkZWZpbmUgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFICAgICAgICAgMHgyMDAwMDAwCisjZGVmaW5lIEFWMV9ERUJVR19TRUlfREVUQUlMICAgICAgICAgICAgIDB4NDAwMDAwMAorI2RlZmluZSBJR05PUkVfUEFSQU1fRlJPTV9DT05GSUcgICAgICAgICAweDgwMDAwMDAKKyNpZiAxCisvKmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUKi8KKyNkZWZpbmUgUFJJTlRfRkxBR19FUlJPUiAgICAweDAKKyNkZWZpbmUgUFJJTlRfRkxBR19WNExfREVUQUlMICAgMHgxMDAwMDAwMAorI2RlZmluZSBQUklOVF9GTEFHX1ZERUNfU1RBVFVTICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgUFJJTlRfRkxBR19WREVDX0RFVEFJTCAgICAweDQwMDAwMDAwCisjZGVmaW5lIFBSSU5UX0ZMQUdfVkRFQ19EQVRBICAgIDB4ODAwMDAwMDAKKyNlbmRpZgorCitpbnQgYXYxX3ByaW50MihpbnQgZmxhZywgY29uc3QgY2hhciAqZm10LCAuLi4pOworCit1bnNpZ25lZCBjaGFyIGF2MV9pc19kZWJ1ZyhpbnQgZmxhZyk7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL3ZhdjEvdmF2MS5jIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC92YXYxL3ZhdjEuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMzIzNDFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC92YXYxL3ZhdjEuYwpAQCAtMCwwICsxLDEyMDYxIEBACisgLyoKKyAgKiBkcml2ZXJzL2FtbG9naWMvYW1wb3J0cy92YXYxLmMKKyAgKgorICAqIENvcHlyaWdodCAoQykgMjAxNSBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgICoKKyAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICAqCisgICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICAqIG1vcmUgZGV0YWlscy4KKyAgKgorICAqLworI2RlZmluZSBERUJVRworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQvY2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkL3J0Lmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9zY2hlZC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy9hbXN0cmVhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmZvcm1hdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZnJhbWVfc3luYy9wdHNzZXJ2Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jYW52YXMvY2FudmFzLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3Byb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3JlY2VpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtY29udGlndW91cy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL3RlZS5oPgorI2luY2x1ZGUgIi4uLy4uLy4uL3N0cmVhbV9pbnB1dC9hbXBvcnRzL2FtcG9ydHNfcHJpdi5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29kZWNfbW0uaD4KKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL2RlY29kZXJfbW11X2JveC5oIgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvZGVjb2Rlcl9ibW11X2JveC5oIgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisKKyNkZWZpbmUgTUVNX05BTUUgImNvZGVjX2F2MSIKKy8qICNpbmNsdWRlIDxtYWNoL2FtX3JlZ3MuaD4gKi8KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL3ZkZWNfcmVnLmg+CisjaW5jbHVkZSAiLi4vLi4vZGVjb2Rlci91dGlscy92ZGVjLmgiCisjaW5jbHVkZSAiLi4vLi4vZGVjb2Rlci91dGlscy9hbXZkZWMuaCIKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9NVUxUSV9ERUMKKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL3ZkZWNfcHJvZmlsZS5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZpZGVvX3NpbmsvdmlkZW8uaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvbmZpZ3MuaD4KKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL2NvbmZpZ19wYXJzZXIuaCIKKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL2Zpcm13YXJlLmgiCisjaW5jbHVkZSAiLi4vLi4vLi4vY29tbW9uL2NoaXBzL2RlY29kZXJfY3B1X3Zlcl9pbmZvLmgiCisjaW5jbHVkZSAiLi4vLi4vLi4vYW12ZGVjX3BvcnRzL3ZkZWNfZHJ2X2Jhc2UuaCIKKworLy8jZGVmaW5lIERFQlVHX1VDT0RFX0xPRworI2RlZmluZSBERUJVR19DTUQKKyNkZWZpbmUgREVCVUdfQ1JDX0VSUk9SCisKKyNkZWZpbmUgU1VQUE9SVF9WNEwyCisvLyNkZWZpbmUgREVCVUdfVVNFX1ZQOV9ERVZJQ0VfTkFNRQorLy8jZGVmaW5lIEJVRk1HUl9PTkxZX09MRF9DSElQCisKKyNpZmRlZiBTVVBQT1JUX1Y0TDIKKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL3ZkZWNfdjRsMl9idWZmZXJfb3BzLmgiCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1tZW0ybWVtLmg+CisjZW5kaWYKKyNpbmNsdWRlICIuLi8uLi8uLi9hbXZkZWNfcG9ydHMvdXRpbHMvY29tbW9uLmgiCisjaW5jbHVkZSAiLi4vLi4vZGVjb2Rlci91dGlscy92ZGVjX2ZlYXR1cmUuaCIKKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL3ZkZWNfZ2UyZF91dGlscy5oIgorCisjZGVmaW5lIEFNTAorI2luY2x1ZGUgImFvbV9hdjFfZGVmaW5lLmgiCisjaW5jbHVkZSAiYXYxX2dsb2JhbC5oIgorCisjZGVmaW5lIERVTVBfRklMTUdSQUlOCisjZGVmaW5lIE1JWF9TVFJFQU1fU1VQUE9SVAorLy8jZGVmaW5lIE1WX1VTRV9GSVhFRF9CVUYKKy8vI2RlZmluZSBVU0VfU1BFQ19CVUZfRk9SX01NVV9IRUFECisKKyNkZWZpbmUgQU9NX0FWMV9EQkxLX0lOSVQKKyNkZWZpbmUgQU9NX0FWMV9VUFNDQUxFX0lOSVQKKworI2RlZmluZSBVU0VfREVDX1BJQ19FTkQKKworI2RlZmluZSBTQU5JVFlfQ0hFQ0sKKyNkZWZpbmUgQ09fTVZfQ09NUFJFU1MKKworI2luY2x1ZGUgInZhdjEuaCIKKworI2RlZmluZSBGR1NfVEFCTEVfU0laRSAgKDUxMiAqIDEyOCAvIDgpCisKKyNkZWZpbmUgQVYxX0dNQ19QQVJBTV9CVUZGX0FERFIgCSAgICAgICAgICAgICAgIDB4MzE2ZAorI2RlZmluZSBIRVZDRF9NUFBfREVDT01QX0FYSVVSR19DVEwgICAgICAgICAgICAgICAgMHgzNGM3CisjZGVmaW5lIEhFVkNfRkdTX0lEWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM2NjAKKyNkZWZpbmUgSEVWQ19GR1NfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzY2MQorI2RlZmluZSBIRVZDX0ZHU19DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNjYyCisjZGVmaW5lIEFWMV9TS0lQX01PREVfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICAweDMxNmMKKyNkZWZpbmUgQVYxX1FVQU5UX1dSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzE0NgorI2RlZmluZSAgIEFWMV9TRUdfV19BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMTY1CisjZGVmaW5lICAgQVYxX1NFR19SX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMxNjYKKyNkZWZpbmUgQVYxX1JFRl9TRUdfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzE3MQorI2RlZmluZSBIRVZDX0FTU0lTVF9QSUNfU0laRV9GQl9SRUFEICAgICAgICAgICAgICAgMHgzMDBkCisjZGVmaW5lIFBBUlNFUl9SRUZfU0NBTEVfRU5CTCAgICAgICAgICAgICAgICAgICAgICAweDMxNmIKKyNkZWZpbmUgSEVWQ19NUFJFRF9NVl9SUFRSXzEgICAgICAgICAgICAgICAgICAgICAgIDB4MzI2MworI2RlZmluZSBIRVZDX01QUkVEX01WX1JQVFJfMiAgICAgICAgICAgICAgICAgICAgICAgMHgzMjY0CisjZGVmaW5lIEhFVkNfU0FPX0NUUkw5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM2MmQKKyNkZWZpbmUgSEVWQ19GR1NfVEFCTEVfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgIDB4MzY2NgorI2RlZmluZSBIRVZDX0ZHU19UQUJMRV9MRU5HVEggICAgICAgICAgICAgICAgICAgICAgMHgzNjY3CisjZGVmaW5lIEhFVkNfREJMS19DREVGMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM1MTUKKyNkZWZpbmUgSEVWQ19EQkxLX0NERUYxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzUxNgorI2RlZmluZSBIRVZDX0RCTEtfVVBTMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNTFjCisjZGVmaW5lIEhFVkNfREJMS19VUFMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM1MWQKKyNkZWZpbmUgSEVWQ19EQkxLX1VQUzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzUxZQorI2RlZmluZSBIRVZDX0RCTEtfVVBTNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNTFmCisjZGVmaW5lIEhFVkNfREJMS19VUFM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM1MjAKKyNkZWZpbmUgQVYxX1VQU0NBTEVfWDBfUU4gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzE2ZQorI2RlZmluZSBBVjFfVVBTQ0FMRV9TVEVQX1FOICAgICAgICAgICAgICAgICAgICAgICAgMHgzMTZmCisjZGVmaW5lIEhFVkNfREJMS19EQkxLMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM1MjMKKyNkZWZpbmUgSEVWQ19EQkxLX0RCTEsxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzUyNAorI2RlZmluZSBIRVZDX0RCTEtfREJMSzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNTI1CisKKyNkZWZpbmUgSFdfTUFTS19GUk9OVCAgICAweDEKKyNkZWZpbmUgSFdfTUFTS19CQUNLICAgICAweDIKKworI2RlZmluZSBBVjFEX01QUF9SRUZJTkZPX1RCTF9BQ0NDT05GSUcgICAgICAgICAgICAgMHgzNDQyCisjZGVmaW5lIEFWMURfTVBQX1JFRklORk9fREFUQSAgICAgICAgICAgICAgICAgICAgICAweDM0NDMKKyNkZWZpbmUgQVYxRF9NUFBfUkVGX1NDQUxFX0VOQkwgICAgICAgICAgICAgICAgICAgIDB4MzQ0MQorI2RlZmluZSBIRVZDX01QUkVEX0NUUkw0ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMjRjCisjZGVmaW5lIEhFVkNfQ01fSEVBREVSX1NUQVJUX0FERFIgICAgICAgICAgICAgICAgICAweDM2MjgKKyNkZWZpbmUgSEVWQ19EQkxLX0NGR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzUwYgorI2RlZmluZSBIRVZDRF9NUFBfQU5DMkFYSV9UQkxfREFUQSAgICAgICAgICAgICAgICAgMHgzNDY0CisjZGVmaW5lIEhFVkNfU0FPX01NVV9WSDFfQUREUiAgICAgICAgICAgICAgICAgICAgICAweDM2M2IKKyNkZWZpbmUgSEVWQ19TQU9fTU1VX1ZIMF9BRERSICAgICAgICAgICAgICAgICAgICAgIDB4MzYzYQorCisjZGVmaW5lIEhFVkNfTVZfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMxMGQKKyNkZWZpbmUgSEVWQ19RUF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzEzNworI2RlZmluZSBIRVZDX1NLSVBfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMTM2CisKKyNkZWZpbmUgSEVWQ19DTV9CT0RZX0xFTkdUSDIgICAgICAgICAgICAgICAgICAgICAgIDB4MzY2MworI2RlZmluZSBIRVZDX0NNX0hFQURFUl9PRkZTRVQyICAgICAgICAgICAgICAgICAgICAgMHgzNjY0CisjZGVmaW5lIEhFVkNfQ01fSEVBREVSX0xFTkdUSDIgICAgICAgICAgICAgICAgICAgICAweDM2NjUKKworI2RlZmluZSBIRVZDX0NNX0hFQURFUl9TVEFSVF9BRERSMiAgICAgICAgICAgICAgICAgMHgzNjRhCisjZGVmaW5lIEhFVkNfU0FPX01NVV9ETUFfQ1RSTDIgICAgICAgICAgICAgICAgICAgICAweDM2NGMKKyNkZWZpbmUgSEVWQ19TQU9fTU1VX1ZIMF9BRERSMiAgICAgICAgICAgICAgICAgICAgIDB4MzY0ZAorI2RlZmluZSBIRVZDX1NBT19NTVVfVkgxX0FERFIyICAgICAgICAgICAgICAgICAgICAgMHgzNjRlCisjZGVmaW5lIEhFVkNfU0FPX01NVV9TVEFUVVMyICAgICAgICAgICAgICAgICAgICAgICAweDM2NTAKKyNkZWZpbmUgSEVWQ19EV19WSDBfQURERFIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzY1ZQorI2RlZmluZSBIRVZDX0RXX1ZIMV9BREREUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNjVmCisKKyNpZmRlZiBCVUZNR1JfT05MWV9PTERfQ0hJUAorI3VuZGVmIEFWMV9TS0lQX01PREVfSU5GTworI2RlZmluZSBBVjFfU0tJUF9NT0RFX0lORk8gIEhFVkNfQVNTSVNUX1NDUkFUQ0hfQgorI2VuZGlmCisKKworI2RlZmluZSBBT01fQVYxX0RFQ19JRExFICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBT01fQVYxX0RFQ19GUkFNRV9IRUFERVIgICAgICAgICAgICAgMQorI2RlZmluZSBBT01fQVYxX0RFQ19USUxFX0VORCAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBBT01fQVYxX0RFQ19UR19FTkQgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBBT01fQVYxX0RFQ19MQ1VfRU5EICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBBT01fQVYxX0RFQ09ERV9TTElDRSAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBBT01fQVYxX1NFQVJDSF9IRUFEICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBBT01fQVYxX0RVTVBfTE1FTSAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBBT01fQVYxX0ZHU19QQVJBTV9DT05UICAgICAgICAgICAgICAgOAorI2RlZmluZSBBT01fQVYxX0RJU0NBUkRfTkFMICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBBT01fQVYxX1JFU1VMVF9ORUVEX01PUkVfQlVGRkVSICAgICAgMHgxMQorI2RlZmluZSBERUNfUkVTVUxUX1VORklOSVNICSAgICAgICAgCQkgMHgxMgorCisvKnN0YXR1cyovCisjZGVmaW5lIEFPTV9BVjFfREVDX1BJQ19FTkQgICAgICAgICAgICAgICAgICAweGUwCisvKkFPTV9BVjFfRkdTX1BBUkE6CitCaXRbMTFdIC0gMCBSZWFkLCAxIC0gV3JpdGUKK0JpdFsxMDo4XSAtIGZpbG1fZ3JhaW5fcGFyYW1zX3JlZl9pZHgsIEZvciBXcml0ZSByZXF1ZXN0CisqLworI2RlZmluZSBBT01fQVYxX0ZHU19QQVJBTSAgICAgICAgICAgICAgICAgICAgMHhlMQorI2RlZmluZSBBT01fQVYxX0RFQ19QSUNfRU5EX1BSRSAgICAgICAgICAgICAgMHhlMgorI2RlZmluZSBBT01fQVYxX0hFQURfUEFSU0VSX0RPTkUgICAgICAgICAgMHhmMAorI2RlZmluZSBBT01fQVYxX0hFQURfU0VBUkNIX0RPTkUgICAgICAgICAgMHhmMQorI2RlZmluZSBBT01fQVYxX1NFUV9IRUFEX1BBUlNFUl9ET05FICAgICAgMHhmMgorI2RlZmluZSBBT01fQVYxX0ZSQU1FX0hFQURfUEFSU0VSX0RPTkUgICAgMHhmMworI2RlZmluZSBBT01fQVYxX0ZSQU1FX1BBUlNFUl9ET05FICAgMHhmNAorI2RlZmluZSBBT01fQVYxX1JFRFVOREFOVF9GUkFNRV9IRUFEX1BBUlNFUl9ET05FICAgMHhmNQorI2RlZmluZSBIRVZDX0FDVElPTl9ET05FICAgICAgICAgICAgMHhmZgorCisjZGVmaW5lIEFPTV9ERUNPREVfQlVGRU1QVFkgICAgICAgIDB4MjAKKyNkZWZpbmUgQU9NX0RFQ09ERV9USU1FT1VUICAgICAgICAgMHgyMQorI2RlZmluZSBBT01fU0VBUkNIX0JVRkVNUFRZICAgICAgICAweDIyCisjZGVmaW5lIEFPTV9ERUNPREVfT1ZFUl9TSVpFICAgICAgIDB4MjMKKyNkZWZpbmUgQU9NX0VPUyAgICAgICAgICAgICAgICAgICAgIDB4MjQKKyNkZWZpbmUgQU9NX05BTF9ERUNPREVfRE9ORSAgICAgICAgICAgIDB4MjUKKworI2RlZmluZSBWRl9QT09MX1NJWkUgICAgICAgIDMyCisKKyN1bmRlZiBwcl9pbmZvCisjZGVmaW5lIHByX2luZm8gcHJpbnRrCisKKyNkZWZpbmUgREVDT0RFX01PREVfU0lOR0xFCQkoKDB4ODAgPDwgMjQpIHwgMCkKKyNkZWZpbmUgREVDT0RFX01PREVfTVVMVElfU1RSRUFNQkFTRQkoKDB4ODAgPDwgMjQpIHwgMSkKKyNkZWZpbmUgREVDT0RFX01PREVfTVVMVElfRlJBTUVCQVNFCSgoMHg4MCA8PCAyNCkgfCAyKQorI2RlZmluZSBERUNPREVfTU9ERV9TSU5HTEVfTE9XX0xBVEVOQ1kgKCgweDgwIDw8IDI0KSB8IDMpCisjZGVmaW5lIERFQ09ERV9NT0RFX01VTFRJX0ZSQU1FQkFTRV9OT0hFQUQgKCgweDgwIDw8IDI0KSB8IDQpCisKKyNkZWZpbmUgIEFWMV9UUklHR0VSX0ZSQU1FX0RPTkUJCTB4MTAwCisjZGVmaW5lICBBVjFfVFJJR0dFUl9GUkFNRV9FTkFCTEUJMHgyMDAKKworI2RlZmluZSBNVl9NRU1fVU5JVCAweDI0MAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluY2x1ZGUgInBhcnNlcl9jbWQuaCIKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNkZWZpbmUgUEFSU0VSX0NNRF9TS0lQX0NGR18wIDB4MDAwMDA5MGIKKworI2RlZmluZSBQQVJTRVJfQ01EX1NLSVBfQ0ZHXzEgMHgxYjE0MTQwZgorCisjZGVmaW5lIFBBUlNFUl9DTURfU0tJUF9DRkdfMiAweDAwMWIxOTEwCisKKyNkZWZpbmUgUEFSU0VSX0NNRF9OVU1CRVIgMzcKKworLyojZGVmaW5lIEhFVkNfUElDX1NUUlVDVF9TVVBQT1JUKi8KKy8qIHRvIHJlbW92ZSwgZml4IGJ1aWxkIGVycm9yICovCisKKy8qI2RlZmluZSBDT0RFQ19NTV9GTEFHU19GT1JfVkRFQ09ERVIgIDAqLworCisjZGVmaW5lIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKyNkZWZpbmUgU1VQUE9SVF8xMEJJVAorLyogI2RlZmluZSBFUlJPUl9IQU5ETEVfREVCVUcgKi8KKworI2lmbmRlZiBTVEFUX0tUSFJFQUQKKyNkZWZpbmUgU1RBVF9LVEhSRUFEIDB4NDAKKyNlbmRpZgorCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorI2RlZmluZSBNQVhfREVDT0RFX0lOU1RBTkNFX05VTSAgICAgOQorCisjaWZkZWYgREVCVUdfVVNFX1ZQOV9ERVZJQ0VfTkFNRQorI2RlZmluZSBNVUxUSV9EUklWRVJfTkFNRSAiYW1tdmRlY192cDlfdjRsIgorI2Vsc2UKKyNkZWZpbmUgTVVMVElfRFJJVkVSX05BTUUgImFtbXZkZWNfYXYxX3Y0bCIKKyNlbmRpZgorCisjZGVmaW5lIEFVWF9CVUZfQUxJR04oYWRyKSAoKGFkciArIDB4ZikgJiAofjB4ZikpCisjaWZkZWYgREVCVUdfVUNPREVfTE9HCitzdGF0aWMgdTMyIHByZWZpeF9hdXhfYnVmX3NpemU7CitzdGF0aWMgdTMyIHN1ZmZpeF9hdXhfYnVmX3NpemU7CisjZWxzZQorc3RhdGljIHUzMiBwcmVmaXhfYXV4X2J1Zl9zaXplID0gKDE2ICogMTAyNCk7CitzdGF0aWMgdTMyIHN1ZmZpeF9hdXhfYnVmX3NpemU7CisjZW5kaWYKKyNpZiAoZGVmaW5lZCBERUJVR19VQ09ERV9MT0cpIHx8IChkZWZpbmVkIERFQlVHX0NNRCkKKy8vI2RlZmluZSBVQ09ERV9MT0dfQlVGX1NJWkUgICAoMTYgKiAxMDI0KQorI2RlZmluZSBVQ09ERV9MT0dfQlVGX1NJWkUgICAoMTAyNCAqIDEwMjQpCisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X2RlY29kZV9pbnN0YW5jZV9udW0KKwkJCQk9IE1BWF9ERUNPREVfSU5TVEFOQ0VfTlVNOworc3RhdGljIHVuc2lnbmVkIGludCBkZWNvZGVfZnJhbWVfY291bnRbTUFYX0RFQ09ERV9JTlNUQU5DRV9OVU1dOworc3RhdGljIHVuc2lnbmVkIGludCBkaXNwbGF5X2ZyYW1lX2NvdW50W01BWF9ERUNPREVfSU5TVEFOQ0VfTlVNXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X3Byb2Nlc3NfdGltZVtNQVhfREVDT0RFX0lOU1RBTkNFX05VTV07CitzdGF0aWMgdW5zaWduZWQgaW50IHJ1bl9jb3VudFtNQVhfREVDT0RFX0lOU1RBTkNFX05VTV07CitzdGF0aWMgdW5zaWduZWQgaW50IGlucHV0X2VtcHR5W01BWF9ERUNPREVfSU5TVEFOQ0VfTlVNXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm90X3J1bl9yZWFkeVtNQVhfREVDT0RFX0lOU1RBTkNFX05VTV07CisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZHdfbW11X2VuYWJsZVtNQVhfREVDT0RFX0lOU1RBTkNFX05VTV07CisjZW5kaWYKKworc3RhdGljIHUzMiBkZWNvZGVfdGltZW91dF92YWwgPSA2MDA7CitzdGF0aWMgdTMyIGVuYWJsZV9zaW5nbGVfc2xpY2UgPSAxOworc3RhdGljIGludCBzdGFydF9kZWNvZGVfYnVmX2xldmVsID0gMHg4MDAwOworLy9zdGF0aWMgdTMyIHdvcmtfYnVmX3NpemU7CitzdGF0aWMgdTMyIGZvcmNlX3B0c191bnN0YWJsZTsKK3N0YXRpYyB1MzIgbXZfYnVmX21hcmdpbiA9IFJFRl9GUkFNRVM7CitzdGF0aWMgdTMyIG12X2J1Zl9keW5hbWljX2FsbG9jOworc3RhdGljIHUzMiBmb3JjZV9tYXhfb25lX212X2J1ZmZlcl9zaXplOworCisvKiBET1VCTEVfV1JJVEVfTU9ERSBpcyBlbmFibGVkIG9ubHkgd2hlbiBOVjIxIDggYml0IG91dHB1dCBpcyBuZWVkZWQgKi8KKy8qIGRvdWJsZV93cml0ZV9tb2RlOgorICoJMCwgbm8gZG91YmxlIHdyaXRlOworICoJMSwgMToxIHJhdGlvOworICoJMiwgKDEvNCk6KDEvNCkgcmF0aW87CisgKgkzLCAoMS80KTooMS80KSByYXRpbywgd2l0aCBib3RoIGNvbXByZXNzZWQgZnJhbWUgaW5jbHVkZWQKKyAqCTQsICgxLzIpOigxLzIpIHJhdGlvOworICoJNSwgKDEvMik6KDEvMikgcmF0aW8sIHdpdGggYm90aCBjb21wcmVzc2VkIGZyYW1lIGluY2x1ZGVkCisgKgk4LCAoMS84KTooMS84KSByYXRpbzsKKyAqCTB4MTAsIGRvdWJsZSB3cml0ZSBvbmx5CisgKgkweDIwLCBtbXUgZG91YmxlIHdyaXRlCisgKgkweDEwMCwgaWYgPiAxMDgwcCx1c2UgbW9kZSA0LGVsc2UgdXNlIG1vZGUgMTsKKyAqCTB4MjAwLCBpZiA+IDEwODBwLHVzZSBtb2RlIDIsZWxzZSB1c2UgbW9kZSAxOworICoJMHgzMDAsIGlmID4gNzIwcCwgdXNlIG1vZGUgNCwgZWxzZSB1c2UgbW9kZSAxOworICovCitzdGF0aWMgdTMyIGRvdWJsZV93cml0ZV9tb2RlOworCisjaWZkZWYgREVCVUdfVVNFX1ZQOV9ERVZJQ0VfTkFNRQorI2RlZmluZSBEUklWRVJfTkFNRSAiYW12ZGVjX3ZwOV92NGwiCisjZGVmaW5lIE1PRFVMRV9OQU1FICJhbXZkZWNfdnA5X3Y0bCIKKyNkZWZpbmUgRFJJVkVSX0hFQURFUl9OQU1FICJhbXZkZWNfdnA5X2hlYWRlciIKKyNlbHNlCisjZGVmaW5lIERSSVZFUl9OQU1FICJhbXZkZWNfYXYxX3Y0bCIKKyNkZWZpbmUgRFJJVkVSX0hFQURFUl9OQU1FICJhbXZkZWNfYXYxX2hlYWRlciIKKyNlbmRpZgorCisjZGVmaW5lIFBVVF9JTlRFUlZBTCAgICAgICAgKEhaLzEwMCkKKyNkZWZpbmUgRVJST1JfU1lTVEVNX1JFU0VUX0NPVU5UICAgMjAwCisKKyNkZWZpbmUgUFRTX05PUk1BTCAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBUU19OT05FX1JFRl9VU0VfRFVSQVRJT04gMQorCisjZGVmaW5lIFBUU19NT0RFX1NXSVRDSElOR19USFJFU0hPTEQgICAgICAgICAgIDMKKyNkZWZpbmUgUFRTX01PREVfU1dJVENISU5HX1JFQ09WRVJZX1RIUkVBU0hPTEQgMworCisjZGVmaW5lIERVUjJQVFMoeCkgKCh4KSo5MC85NikKKyNkZWZpbmUgUFRTMkRVUih4KSAoKHgpKjk2LzkwKQorI2RlZmluZSBQVFMyRFVSX3U2NCh4KSAoZGl2X3U2NCgoeCkqOTYsIDkwKSkKKworc3RydWN0IEFWMUhXX3M7CitzdGF0aWMgaW50IHZhdjFfdmZfc3RhdGVzKHN0cnVjdCB2ZnJhbWVfc3RhdGVzICpzdGF0ZXMsIHZvaWQgKik7CitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2YXYxX3ZmX3BlZWsodm9pZCAqKTsKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZhdjFfdmZfZ2V0KHZvaWQgKik7CitzdGF0aWMgdm9pZCB2YXYxX3ZmX3B1dChzdHJ1Y3QgdmZyYW1lX3MgKiwgdm9pZCAqKTsKK3N0YXRpYyBpbnQgdmF2MV9ldmVudF9jYihpbnQgdHlwZSwgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCitzdGF0aWMgczMyIHZhdjFfaW5pdChzdHJ1Y3QgdmRlY19zICp2ZGVjKTsKKyNlbHNlCitzdGF0aWMgczMyIHZhdjFfaW5pdChzdHJ1Y3QgQVYxSFdfcyAqaHcpOworI2VuZGlmCitzdGF0aWMgdm9pZCB2YXYxX3Byb3RfaW5pdChzdHJ1Y3QgQVYxSFdfcyAqaHcsIHUzMiBtYXNrKTsKK3N0YXRpYyBpbnQgdmF2MV9sb2NhbF9pbml0KHN0cnVjdCBBVjFIV19zICpodywgYm9vbCByZXNldF9mbGFnKTsKK3N0YXRpYyB2b2lkIHZhdjFfcHV0X3RpbWVyX2Z1bmMoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKTsKK3N0YXRpYyB2b2lkIGR1bXBfZGF0YShzdHJ1Y3QgQVYxSFdfcyAqaHcsIGludCBzaXplKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X2RhdGFfY2hlY2tfc3VtCisJKHN0cnVjdCBBVjFIV19zICpodywgaW50IHNpemUpOworc3RhdGljIHZvaWQgZHVtcF9waWNfbGlzdChzdHJ1Y3QgQVYxSFdfcyAqaHcpOworc3RhdGljIGludCB2YXYxX21tdV9tYXBfYWxsb2Moc3RydWN0IEFWMUhXX3MgKmh3KTsKK3N0YXRpYyB2b2lkIHZhdjFfbW11X21hcF9mcmVlKHN0cnVjdCBBVjFIV19zICpodyk7CitzdGF0aWMgaW50IGF2MV9hbGxvY19tbXUoCisJCXN0cnVjdCBBVjFIV19zICpodywKKwkJaW50IGN1cl9idWZfaWR4LAorCQlpbnQgcGljX3dpZHRoLAorCQlpbnQgcGljX2hlaWdodCwKKwkJdW5zaWduZWQgc2hvcnQgYml0X2RlcHRoLAorCQl1bnNpZ25lZCBpbnQgKm1tdV9pbmRleF9hZHIpOworCisjaWZkZWYgREVCVUdfVVNFX1ZQOV9ERVZJQ0VfTkFNRQorc3RhdGljIGNvbnN0IGNoYXIgdmF2MV9kZWNfaWRbXSA9ICJ2dnA5LWRldiI7CisKKyNkZWZpbmUgUFJPVklERVJfTkFNRSAgICJkZWNvZGVyLnZwOSIKKyNkZWZpbmUgTVVMVElfSU5TVEFOQ0VfUFJPVklERVJfTkFNRSAgICAidmRlYy52cDkiCisjZWxzZQorc3RhdGljIGNvbnN0IGNoYXIgdmF2MV9kZWNfaWRbXSA9ICJ2YXYxLWRldiI7CisKKyNkZWZpbmUgUFJPVklERVJfTkFNRSAgICJkZWNvZGVyLmF2MSIKKyNkZWZpbmUgTVVMVElfSU5TVEFOQ0VfUFJPVklERVJfTkFNRSAgICAidmRlYy5hdjEiCisjZW5kaWYKKyNkZWZpbmUgRFZfUFJPVklERVJfTkFNRSAgImR2YmxkZWMiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmZyYW1lX29wZXJhdGlvbnNfcyB2YXYxX3ZmX3Byb3ZpZGVyID0geworCS5wZWVrID0gdmF2MV92Zl9wZWVrLAorCS5nZXQgPSB2YXYxX3ZmX2dldCwKKwkucHV0ID0gdmF2MV92Zl9wdXQsCisJLmV2ZW50X2NiID0gdmF2MV9ldmVudF9jYiwKKwkudmZfc3RhdGVzID0gdmF2MV92Zl9zdGF0ZXMsCit9OworCitzdGF0aWMgc3RydWN0IHZmcmFtZV9wcm92aWRlcl9zIHZhdjFfdmZfcHJvdjsKKworc3RhdGljIHUzMiBiaXRfZGVwdGhfbHVtYTsKK3N0YXRpYyB1MzIgYml0X2RlcHRoX2Nocm9tYTsKK3N0YXRpYyB1MzIgZnJhbWVfd2lkdGg7CitzdGF0aWMgdTMyIGZyYW1lX2hlaWdodDsKK3N0YXRpYyB1MzIgdmlkZW9fc2lnbmFsX3R5cGU7CitzdGF0aWMgdTMyIG9uX25vX2tleWZyYW1lX3NraXBlZDsKK3N0YXRpYyB1MzIgd2l0aG91dF9kaXNwbGF5X21vZGU7CitzdGF0aWMgdTMyIHY0bF9iaXRzdHJlYW1faWRfZW5hYmxlID0gMTsKKworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCitzdGF0aWMgdTMyIGZvcmNlX2R2X2VuYWJsZTsKKyNlbmRpZgorCisjZGVmaW5lIFBST0JfU0laRSAgICAoNDk2ICogMiAqIDQpCisjZGVmaW5lIFBST0JfQlVGX1NJWkUgICAgKDB4NTAwMCkKKyNkZWZpbmUgQ09VTlRfQlVGX1NJWkUgICAoMHgzMDAgKiA0ICogNCkKKy8qY29tcHV0ZV9sb3NsZXNzX2NvbXBfYm9keV9zaXplKDQwOTYsIDIzMDQsIDEpID0gMTg4NzQzNjgoMHgxMjAwMDAwKSovCisjZGVmaW5lIE1BWF9GUkFNRV80S19OVU0gMHgxMjAwCisjZGVmaW5lIE1BWF9GUkFNRV84S19OVU0gMHg0ODAwCisKKyNkZWZpbmUgSEVWQ19BU1NJU1RfTU1VX01BUF9BRERSICAgICAgICAgICAgICAgICAgIDB4MzAwOQorCisKKy8qVVNFX0JVRl9CTE9DSyovCitzdHJ1Y3QgQlVGX3MgeworCWludCBpbmRleDsKKwl1bnNpZ25lZCBpbnQgYWxsb2NfZmxhZzsKKwkvKmJ1ZmZlciAqLworCXVuc2lnbmVkIGludCBjbWFfcGFnZV9jb3VudDsKKwl1bnNpZ25lZCBsb25nIGFsbG9jX2FkZHI7CisJdW5zaWduZWQgbG9uZyBzdGFydF9hZHI7CisJdW5zaWduZWQgaW50IHNpemU7CisKKwl1bnNpZ25lZCBpbnQgZnJlZV9zdGFydF9hZHI7CisJdWxvbmcgdjRsX3JlZl9idWZfYWRkcjsKKwl1bG9uZwloZWFkZXJfYWRkcjsKKwl1MzIgCWhlYWRlcl9zaXplOworCXUzMglsdW1hX3NpemU7CisJdWxvbmcJY2hyb21hX2FkZHI7CisJdTMyCWNocm9tYV9zaXplOworCXVsb25nCWhlYWRlcl9kd19hZGRyOworfSAvKkJVRl90ICovOworCitzdHJ1Y3QgTVZCVUZfcyB7CisJdW5zaWduZWQgbG9uZyBzdGFydF9hZHI7CisJdW5zaWduZWQgaW50IHNpemU7CisJaW50IHVzZWRfZmxhZzsKK30gLypNVkJVRl90ICovOworCisvKiNkZWZpbmUgVEVTVF9XUl9QVFJfSU5DKi8KKy8qI2RlZmluZSBXUl9QVFJfSU5DX05VTSAxMjgqLworI2RlZmluZSBXUl9QVFJfSU5DX05VTSAxCisKKy8vI2RlZmluZSBTSU1VTEFUSU9OCisjZGVmaW5lIERPU19QUk9KRUNUCisjdW5kZWYgTUVNT1JZX01BUF9JTl9SRUFMX0NISVAKKworLyojdW5kZWYgRE9TX1BST0pFQ1QqLworLyojZGVmaW5lIE1FTU9SWV9NQVBfSU5fUkVBTF9DSElQKi8KKworLyojZGVmaW5lIENPTkZJR19IRVZDX0NMS19GT1JDRURfT04qLworLyojZGVmaW5lIEVOQUJMRV9TV0FQX1RFU1QqLworI2lmbmRlZiBCVUZNR1JfT05MWV9PTERfQ0hJUAorI2RlZmluZSAgIE1DUkNDX0VOQUJMRQorI2VuZGlmCisKKyNpZmRlZiBBVjFfMTBCX05WMjEKKyNlbHNlCisjZGVmaW5lIExPU0xFU1NfQ09NUFJFU1NfTU9ERQorI2VuZGlmCisKK3N0YXRpYyB1MzIgZ2V0X3BpY3R1cmVfcW9zOworCitzdGF0aWMgdTMyIGRpc2FibGVfcmVwZWF0OworCitzdGF0aWMgdTMyIGRlYnVnOworc3RhdGljIHUzMiBkaXNhYmxlX2ZnOworCitzdGF0aWMgYm9vbCBpc19yZXNldDsKKy8qZm9yIGRlYnVnKi8KK3N0YXRpYyB1MzIgZm9yY2VfYnVmc3BlYzsKKy8qCisJdWRlYnVnX2ZsYWc6CisJYml0IDAsIGVuYWJsZSB1Y29kZSBwcmludAorCWJpdCAxLCBlbmFibGUgdWNvZGUgZGV0YWlsIHByaW50CisJYml0IFszMToxNl0gbm90IDAsIHBvcyB0byBkdW1wIGxtZW0KKwkJYml0IDIsIHBvcCBiaXRzIHRvIGxtZW0KKwkJYml0IFsxMTo4XSwgcHJlLXBvcCBiaXRzIGZvciBhbGlnbm1lbnQgKHdoZW4gYml0IDIgaXMgMSkKKyovCitzdGF0aWMgdTMyIHVkZWJ1Z19mbGFnOworLyoKKwl3aGVuIHVkZWJ1Z19mbGFnWzE6MF0gaXMgbm90IDAKKwl1ZGVidWdfcGF1c2VfcG9zIG5vdCAwLAorCQlwYXVzZSBwb3NpdGlvbgorKi8KK3N0YXRpYyB1MzIgdWRlYnVnX3BhdXNlX3BvczsKKy8qCisJd2hlbiB1ZGVidWdfZmxhZ1sxOjBdIGlzIG5vdCAwCisJYW5kIHVkZWJ1Z19wYXVzZV9wb3MgaXMgbm90IDAsCisJCXBhdXNlIG9ubHkgd2hlbiBERUJVR19SRUcyIGlzIGVxdWFsIHRvIHRoaXMgdmFsCisqLworc3RhdGljIHUzMiB1ZGVidWdfcGF1c2VfdmFsOworCitzdGF0aWMgdTMyIHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4OworCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KK3N0YXRpYyB1MzIgZHZfdG9nZ2xlX3Byb3ZfbmFtZTsKKyNlbmRpZgorCitzdGF0aWMgdTMyIHJ1bl9yZWFkeV9taW5fYnVmX251bSA9IDI7CisjaWZkZWYgREVCVUdfQ1JDX0VSUk9SCisvKgorICBiaXRbNF0gZmlsbCB6ZXJvIGluIGhlYWRlciBiZWZvcmUgc3RhcnRpbmcKKyAgYml0WzVdIGR1bXAgbW11IGhlYWRlciBhbHdheXMKKworICBiaXRbNl0gZHVtcCBtdiBidWZmZXIgYWx3YXlzCisKKyAgYml0WzhdIGRlbGF5IGFmdGVyIGRlY29kaW5nCisgIGJpdFszMX4xNl0gZGVsYXllZCBtc2Vjb25kcworKi8KK3N0YXRpYyB1MzIgY3JjX2RlYnVnX2ZsYWc7CisjZW5kaWYKKyNpZmRlZiBERUJVR19DTUQKK3N0YXRpYyB1MzIgaGVhZGVyX2R1bXBfc2l6ZSA9IDB4MTAwMDA7CitzdGF0aWMgdTMyIGRlYnVnX2NtZF93YWl0X2NvdW50Oworc3RhdGljIHUzMiBkZWJ1Z19jbWRfd2FpdF90eXBlOworI2VuZGlmCisjZGVmaW5lIERFQlVHX1JFRworI2lmZGVmIERFQlVHX1JFRwordm9pZCBBVjFfV1JJVEVfVlJFR19EQkcyKHVuc2lnbmVkIGludCBhZHIsIHVuc2lnbmVkIGludCB2YWwsIGludCBsaW5lKQoreworCWlmIChkZWJ1ZyAmIEFWMV9ERUJVR19SRUcpCisJCXByX2luZm8oIiVkOiVzKCV4LCAleClcbiIsIGxpbmUsIF9fZnVuY19fLCBhZHIsIHZhbCk7CisJaWYgKGFkciAhPSAwKQorCQlXUklURV9WUkVHKGFkciwgdmFsKTsKK30KKworI3VuZGVmIFdSSVRFX1ZSRUcKKyNkZWZpbmUgV1JJVEVfVlJFRyhhLHYpIEFWMV9XUklURV9WUkVHX0RCRzIoYSx2LF9fTElORV9fKQorI2VuZGlmCisKKyNkZWZpbmUgRlJBTUVfQ05UX1dJTkRPV19TSVpFIDU5CisjZGVmaW5lIFJBVEVfQ09SUkVDVElPTl9USFJFU0hPTEQgNQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0FWMSBidWZmZXIgbWFuYWdlbWVudCBzdGFydAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE1NVV9DT01QUkVTU19IRUFERVJfU0laRV8xMDgwUCAgMHgxMDAwMAorI2RlZmluZSBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfNEsgIDB4NDgwMDAKKyNkZWZpbmUgTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFXzhLICAweDEyMDAwMAorCisvLyNkZWZpbmUgTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFICAweDQ4MDAwCisvLyNkZWZpbmUgTUFYX09ORV9NVl9CVUZGRVJfU0laRSAgIDB4MjYwMDAwCisvLyNkZWZpbmUgTUFYX09ORV9NVl9CVUZGRVJfU0laRSAgIDB4MTMwMDAwCisKKyNkZWZpbmUgTUFYX09ORV9NVl9CVUZGRVJfU0laRV8xMDgwUCAweDIwNDAwCisjZGVmaW5lIE1BWF9PTkVfTVZfQlVGRkVSX1NJWkVfNEsgIDB4OTE0MDAKKyNkZWZpbmUgTUFYX09ORV9NVl9CVUZGRVJfU0laRV84SyAweDI0NDgwMAorLyp0byBzdXBwb3J0IHRtMnJldmIgYW5kIHNjMiovCisjZGVmaW5lIE1BWF9PTkVfTVZfQlVGRkVSX1NJWkVfMTA4MFBfVE0yUkVWQiAweDI2NDAwCisjZGVmaW5lIE1BWF9PTkVfTVZfQlVGRkVSX1NJWkVfNEtfVE0yUkVWQiAgMHhhYzQwMAorI2RlZmluZSBNQVhfT05FX01WX0JVRkZFUl9TSVpFXzhLX1RNMlJFVkIgMHgyYjA4MDAKKworc3RhdGljIGludCB2YXYxX21tdV9jb21wcmVzc19oZWFkZXJfc2l6ZShzdHJ1Y3QgQVYxSFdfcyAqaHcpOworCisvLyNkZWZpbmUgTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFICAweDQ4MDAwCisvLyNkZWZpbmUgTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFX0RXIE1NVV9DT01QUkVTU19IRUFERVJfU0laRQorLy8jZGVmaW5lIE1NVV9DT01QUkVTU184S19IRUFERVJfU0laRSAgKDB4NDgwMDAqNCkKKyNkZWZpbmUgTUFYX1NJWkVfOEsgKDgxOTIgKiA0NjA4KQorI2RlZmluZSBNQVhfU0laRV80SyAoNDA5NiAqIDIzMDQpCisjZGVmaW5lIE1BWF9TSVpFXzJLICgxOTIwICogMTA4OCkKKyNkZWZpbmUgSVNfOEtfU0laRSh3LCBoKQkoKCh3KSAqIChoKSkgPiBNQVhfU0laRV80SykKKyNkZWZpbmUgSVNfNEtfU0laRSh3LCBoKSAgKCgodykgKiAoaCkpID4gKDE5MjAqMTA4OCkpCisKKyNkZWZpbmUgSU5WQUxJRF9JRFggLTEgIC8qIEludmFsaWQgYnVmZmVyIGluZGV4LiovCisKKworLyo0IHNjcmF0Y2ggZnJhbWVzIGZvciB0aGUgbmV3IGZyYW1lcyB0byBzdXBwb3J0IGEgbWF4aW11bSBvZiA0IGNvcmVzIGRlY29kaW5nCisgKmluIHBhcmFsbGVsLCAzIGZvciBzY2FsZWQgcmVmZXJlbmNlcyBvbiB0aGUgZW5jb2Rlci4KKyAqVE9ETyhoa3VhbmcpOiBBZGQgb25kZW1hbmQgZnJhbWUgYnVmZmVycyBpbnN0ZWFkIG9mIGhhcmRjb2RpbmcgdGhlIG51bWJlcgorICogLy8gb2YgZnJhbWVidWZmZXJzLgorICpUT0RPKGprb2xlc3phcik6IFRoZXNlIDMgZXh0cmEgcmVmZXJlbmNlcyBjb3VsZCBwcm9iYWJseSBjb21lIGZyb20gdGhlCisgKm5vcm1hbCByZWZlcmVuY2UgcG9vbC4KKyAqLworLy8jZGVmaW5lIEZSQU1FX0JVRkZFUlMgKFJFRl9GUkFNRVMgKyAxNikKKy8vI2RlZmluZSBSRUZfRlJBTUVTXzRLICg2KQorI2RlZmluZSBSRUZfRlJBTUVTXzRLIFJFRl9GUkFNRVMKKworI2lmZGVmIFVTRV9TUEVDX0JVRl9GT1JfTU1VX0hFQUQKKyNkZWZpbmUgSEVBREVSX0ZSQU1FX0JVRkZFUlMgKDApCisjZWxpZiAoZGVmaW5lZCBBT01fQVYxX01NVV9EVykKKyNkZWZpbmUgSEVBREVSX0ZSQU1FX0JVRkZFUlMgKDIgKiBGUkFNRV9CVUZGRVJTKQorI2Vsc2UKKyNkZWZpbmUgSEVBREVSX0ZSQU1FX0JVRkZFUlMgKEZSQU1FX0JVRkZFUlMpCisjZW5kaWYKKyNkZWZpbmUgTUFYX0JVRl9OVU0gKEZSQU1FX0JVRkZFUlMpCisjZGVmaW5lIE1WX0JVRkZFUl9OVU0JRlJBTUVfQlVGRkVSUworCisvLyNkZWZpbmUgRlJBTUVfQ09OVEVYVFNfTE9HMiAyCisvLyNkZWZpbmUgRlJBTUVfQ09OVEVYVFMgKDEgPDwgRlJBTUVfQ09OVEVYVFNfTE9HMikKKy8qYnVmZmVyICsgaGVhZGVyIGJ1ZmZlciArIHdvcmtzcGFjZSovCisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorI2RlZmluZSBNQVhfQk1NVV9CVUZGRVJfTlVNIChGUkFNRV9CVUZGRVJTICsgSEVBREVSX0ZSQU1FX0JVRkZFUlMgKyAxKQorI2RlZmluZSBWRl9CVUZGRVJfSURYKG4pIChuKQorI2RlZmluZSBIRUFERVJfQlVGRkVSX0lEWChuKSAoRlJBTUVfQlVGRkVSUyArIG4pCisjZGVmaW5lIFdPUktfU1BBQ0VfQlVGX0lEIChGUkFNRV9CVUZGRVJTICsgSEVBREVSX0ZSQU1FX0JVRkZFUlMpCisjZWxzZQorI2RlZmluZSBNQVhfQk1NVV9CVUZGRVJfTlVNIFwKKwkoRlJBTUVfQlVGRkVSUyArIEhFQURFUl9GUkFNRV9CVUZGRVJTICsgTVZfQlVGRkVSX05VTSArIDEpCisjZGVmaW5lIFZGX0JVRkZFUl9JRFgobikgKG4pCisjZGVmaW5lIEhFQURFUl9CVUZGRVJfSURYKG4pIChGUkFNRV9CVUZGRVJTICsgbikKKyNkZWZpbmUgTVZfQlVGRkVSX0lEWChuKSAoRlJBTUVfQlVGRkVSUyArIEhFQURFUl9GUkFNRV9CVUZGRVJTICsgbikKKyNkZWZpbmUgV09SS19TUEFDRV9CVUZfSUQgXAorCShGUkFNRV9CVUZGRVJTICsgSEVBREVSX0ZSQU1FX0JVRkZFUlMgKyBNVl9CVUZGRVJfTlVNKQorI2VuZGlmCisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKyNkZWZpbmUgRFdfSEVBREVSX0JVRkZFUl9JRFgobikgKEhFQURFUl9CVUZGRVJfSURYKEhFQURFUl9GUkFNRV9CVUZGRVJTLzIpICsgbikKKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkIHNldF9jYW52YXMoc3RydWN0IEFWMUhXX3MgKmh3LAorCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpwaWNfY29uZmlnKTsKKworc3RhdGljIHZvaWQgZmlsbF9mcmFtZV9pbmZvKHN0cnVjdCBBVjFIV19zICpodywKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqZnJhbWUsCisJdW5zaWduZWQgaW50IGZyYW1lc2l6ZSwKKwl1bnNpZ25lZCBpbnQgcHRzKTsKKworCitzdGF0aWMgaW50ICBjb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCQkJCXVpbnQ4X3QgaXNfYml0X2RlcHRoXzEwKTsKKwordm9pZCBjbGVhcl9mcmFtZV9idWZfcmVmX2NvdW50KEFWMURlY29kZXIgKnBiaSk7CisKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisjZGVmaW5lIERFQ19SRVNVTFRfTk9ORSAgICAgICAgICAgICAwCisjZGVmaW5lIERFQ19SRVNVTFRfRE9ORSAgICAgICAgICAgICAxCisjZGVmaW5lIERFQ19SRVNVTFRfQUdBSU4gICAgICAgICAgICAyCisjZGVmaW5lIERFQ19SRVNVTFRfQ09ORklHX1BBUkFNICAgICAzCisjZGVmaW5lIERFQ19SRVNVTFRfRVJST1IgICAgICAgICAgICA0CisjZGVmaW5lIERFQ19JTklUX1BJQ0xJU1QJCQk1CisjZGVmaW5lIERFQ19VTklOSVRfUElDTElTVAkJCTYKKyNkZWZpbmUgREVDX1JFU1VMVF9HRVRfREFUQSAgICAgICAgIDcKKyNkZWZpbmUgREVDX1JFU1VMVF9HRVRfREFUQV9SRVRSWSAgIDgKKyNkZWZpbmUgREVDX1JFU1VMVF9FT1MgICAgICAgICAgICAgIDkKKyNkZWZpbmUgREVDX1JFU1VMVF9GT1JDRV9FWElUICAgICAgIDEwCisjZGVmaW5lIERFQ19SRVNVTFRfRElTQ0FSRF9EQVRBICAgICAxMQorCisjZGVmaW5lIERFQ19TMV9SRVNVTFRfTk9ORSAgICAgICAgICAwCisjZGVmaW5lIERFQ19TMV9SRVNVTFRfRE9ORSAgICAgICAgICAxCisjZGVmaW5lIERFQ19TMV9SRVNVTFRfRk9SQ0VfRVhJVCAgICAgICAyCisjZGVmaW5lIERFQ19TMV9SRVNVTFRfVEVTVF9UUklHR0VSX0RPTkUJMHhmMAorCisjaWZkZWYgRkJfREVDT0RJTkdfVEVTVF9TQ0hFRFVMRQorI2RlZmluZSBURVNUX1NFVF9OT05FICAgICAgICAwCisjZGVmaW5lIFRFU1RfU0VUX1BJQ19ET05FICAgIDEKKyNkZWZpbmUgVEVTVF9TRVRfUzJfRE9ORSAgICAgMgorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGF2MV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisjZW5kaWYKKworI2lmZGVmIERVTVBfRklMTUdSQUlOCit1MzIgZmdfZHVtcF9pbmRleCA9IDB4ZmY7CisjZW5kaWYKKworI2lmZGVmIEFPTV9BVjFfREJMS19JTklUCitzdHJ1Y3QgbG9vcF9maWx0ZXJfaW5mb19uX3M7CitzdHJ1Y3QgbG9vcGZpbHRlcjsKK3N0cnVjdCBzZWdtZW50YXRpb25fbGY7CisjZW5kaWYKKworc3RydWN0IHZhdjFfYXNzaXRfdGFzayB7CisJYm9vbCAgICAgICAgICAgICAgICAgdXNlX3NmZ3M7CisJYm9vbCAgICAgICAgICAgICAgICAgcnVubmluZzsKKwlzdHJ1Y3QgbXV0ZXggICAgICAgICBhc3NpdF9tdXRleDsKKwlzdHJ1Y3Qgc2VtYXBob3JlICAgICBzZW07CisJc3RydWN0IHRhc2tfc3RydWN0ICAqdGFzazsKKwl2b2lkICAgICAgICAgICAgICAgICpwcml2YXRlOworfTsKKworc3RydWN0IEFWMUhXX3MgeworCUFWMURlY29kZXIgKnBiaTsKKwl1bmlvbiBwYXJhbV91IGFvbV9wYXJhbTsKKwl1bnNpZ25lZCBjaGFyIGZyYW1lX2RlY29kZWQ7CisJdW5zaWduZWQgY2hhciBvbmVfY29tcHJlc3NlZF9kYXRhX2RvbmU7CisJdW5zaWduZWQgY2hhciBuZXdfY29tcHJlc3NlZF9kYXRhOworI2lmIDEKKy8qZGVmIENIRUNLX09CVV9SRURVTkRBTlRfRlJBTUVfSEVBREVSKi8KKwlpbnQgb2J1X2ZyYW1lX2ZyYW1lX2hlYWRfY29tZV9hZnRlcl90aWxlOworI2VuZGlmCisJdW5zaWduZWQgY2hhciBpbmRleDsKKworCXN0cnVjdCBkZXZpY2UgKmNtYV9kZXY7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2OworCXZvaWQgKCp2ZGVjX2NiKShzdHJ1Y3QgdmRlY19zICosIHZvaWQgKik7CisJdm9pZCAqdmRlY19jYl9hcmc7CisJc3RydWN0IHZmcmFtZV9jaHVua19zICpjaHVuazsKKwlpbnQgZGVjX3Jlc3VsdDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc2V0X2Nsa193b3JrOworCXUzMiBzdGFydF9zaGlmdF9ieXRlczsKKwl1MzIgZGF0YV9zaXplOworCisJc3RydWN0IEJ1ZmZJbmZvX3Mgd29ya19zcGFjZV9idWZfc3RvcmU7CisJdW5zaWduZWQgbG9uZyBidWZfc3RhcnQ7CisJdTMyIGJ1Zl9zaXplOworCXUzMiBjbWFfYWxsb2NfY291bnQ7CisJdW5zaWduZWQgbG9uZyBjbWFfYWxsb2NfYWRkcjsKKwl1aW50OF90IGVvczsKKwl1bnNpZ25lZCBsb25nIGludCBzdGFydF9wcm9jZXNzX3RpbWU7CisJdW5zaWduZWQgbGFzdF9sY3VfaWR4OworCWludCBkZWNvZGVfdGltZW91dF9jb3VudDsKKwl1bnNpZ25lZCB0aW1lb3V0X251bTsKKwlpbnQgc2F2ZV9idWZmZXJfbW9kZTsKKworCWludCBkb3VibGVfd3JpdGVfbW9kZTsKKworCWxvbmcgdXNlZF80a19udW07CisKKwl1bnNpZ25lZCBjaGFyIG1faW5zX2ZsYWc7CisJY2hhciAqcHJvdmlkZXJfbmFtZTsKKwl1bmlvbiBwYXJhbV91IHBhcmFtOworCWludCBmcmFtZV9jb3VudDsKKwlpbnQgcGljX2NvdW50OworCXUzMiBzdGF0OworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCXUzMiBmcmFtZV9kdXI7CisJdTMyIGZyYW1lX2FyOworCWludCBmYXRhbF9lcnJvcjsKKwl1aW50OF90IGluaXRfZmxhZzsKKwl1aW50OF90IGNvbmZpZ19uZXh0X3JlZl9pbmZvX2ZsYWc7CisJdWludDhfdCBmaXJzdF9zY19jaGVja2VkOworCXVpbnQ4X3QgcHJvY2Vzc19idXN5OworI2RlZmluZSBQUk9DX1NUQVRFX0lOSVQJCQkwCisjZGVmaW5lIFBST0NfU1RBVEVfREVDT0RFU0xJQ0UJMQorI2RlZmluZSBQUk9DX1NUQVRFX1NFTkRBR0FJTgkyCisJdWludDhfdCBwcm9jZXNzX3N0YXRlOworCXUzMiB1Y29kZV9wYXVzZV9wb3M7CisKKwlpbnQgc2hvd19mcmFtZV9udW07CisJc3RydWN0IGJ1ZmZfcyBtY19idWZfc3BlYzsKKwlzdHJ1Y3QgZGVjX3N5c2luZm8gdmF2MV9hbXN0cmVhbV9kZWNfaW5mbzsKKwl2b2lkICpycG1fYWRkcjsKKwl2b2lkICpsbWVtX2FkZHI7CisJZG1hX2FkZHJfdCBycG1fcGh5X2FkZHI7CisJZG1hX2FkZHJfdCBsbWVtX3BoeV9hZGRyOworCXVuc2lnbmVkIHNob3J0ICpsbWVtX3B0cjsKKwl1bnNpZ25lZCBzaG9ydCAqZGVidWdfcHRyOworI2lmZGVmIERVTVBfRklMTUdSQUlOCisJZG1hX2FkZHJfdCBmZ19waHlfYWRkcjsKKwl1bnNpZ25lZCBjaGFyICpmZ19wdHI7CisJdm9pZCAqZmdfYWRkcjsKKyNlbmRpZgorCXUzMiBmZ3NfdmFsaWQ7CisKKwl1OCBhdXhfZGF0YV9kaXJ0eTsKKwl1MzIgcHJlZml4X2F1eF9zaXplOworCXUzMiBzdWZmaXhfYXV4X3NpemU7CisJdm9pZCAqYXV4X2FkZHI7CisJZG1hX2FkZHJfdCBhdXhfcGh5X2FkZHI7CisJY2hhciAqZHZfZGF0YV9idWY7CisJaW50IGR2X2RhdGFfc2l6ZTsKKyNpZiAoZGVmaW5lZCBERUJVR19VQ09ERV9MT0cpIHx8IChkZWZpbmVkIERFQlVHX0NNRCkKKwl2b2lkICp1Y29kZV9sb2dfYWRkcjsKKwlkbWFfYWRkcl90IHVjb2RlX2xvZ19waHlfYWRkcjsKKyNlbmRpZgorCisJdm9pZCAqcHJvYl9idWZmZXJfYWRkcjsKKwl2b2lkICpjb3VudF9idWZmZXJfYWRkcjsKKwlkbWFfYWRkcl90IHByb2JfYnVmZmVyX3BoeV9hZGRyOworCWRtYV9hZGRyX3QgY291bnRfYnVmZmVyX3BoeV9hZGRyOworCisJdm9pZCAqZnJhbWVfbW11X21hcF9hZGRyOworCWRtYV9hZGRyX3QgZnJhbWVfbW11X21hcF9waHlfYWRkcjsKKyNpZmRlZiBBT01fQVYxX01NVV9EVworCXZvaWQgKmR3X2ZyYW1lX21tdV9tYXBfYWRkcjsKKwlkbWFfYWRkcl90IGR3X2ZyYW1lX21tdV9tYXBfcGh5X2FkZHI7CisjZW5kaWYKKwl1bnNpZ25lZCBpbnQgdXNlX2NtYV9mbGFnOworCisJc3RydWN0IEJVRl9zIG1fQlVGW01BWF9CVUZfTlVNXTsKKwlzdHJ1Y3QgTVZCVUZfcyBtX212X0JVRltNVl9CVUZGRVJfTlVNXTsKKwl1MzIgdXNlZF9idWZfbnVtOworCXUzMiBtdl9idWZfbWFyZ2luOworCURFQ0xBUkVfS0ZJRk8obmV3ZnJhbWVfcSwgc3RydWN0IHZmcmFtZV9zICosIFZGX1BPT0xfU0laRSk7CisJREVDTEFSRV9LRklGTyhkaXNwbGF5X3EsIHN0cnVjdCB2ZnJhbWVfcyAqLCBWRl9QT09MX1NJWkUpOworCURFQ0xBUkVfS0ZJRk8ocGVuZGluZ19xLCBzdHJ1Y3QgdmZyYW1lX3MgKiwgVkZfUE9PTF9TSVpFKTsKKwlzdHJ1Y3QgdmZyYW1lX3MgdmZwb29sW1ZGX1BPT0xfU0laRV07CisJYXRvbWljX3QgIHZmX3ByZV9jb3VudDsKKwlhdG9taWNfdCAgdmZfZ2V0X2NvdW50OworCWF0b21pY190ICB2Zl9wdXRfY291bnQ7CisJaW50IGJ1Zl9udW07CisJaW50IHBpY19udW07CisJaW50IGxjdV9zaXplX2xvZzI7CisJdW5zaWduZWQgaW50IGxvc2xlc3NfY29tcF9ib2R5X3NpemU7CisKKwl1MzIgdmlkZW9fc2lnbmFsX3R5cGU7CisKKwl1MzIgcHRzX3Vuc3RhYmxlOworCWJvb2wgYXYxX2ZpcnN0X3B0c19yZWFkeTsKKwlib29sIGR1cl9yZWNhbGNfZmxhZzsKKwl1OCAgZmlyc3RfcHRzX2luZGV4OworCXUzMiBmcmFtZV9tb2RlX3B0c19zYXZlW0ZSQU1FX0JVRkZFUlNdOworCXU2NCBmcmFtZV9tb2RlX3B0czY0X3NhdmVbRlJBTUVfQlVGRkVSU107CisKKwlpbnQgbGFzdF9wdHM7CisJdTY0IGxhc3RfcHRzX3VzNjQ7CisJdTY0IHNoaWZ0X2J5dGVfY291bnQ7CisKKwl1MzIgc2hpZnRfYnl0ZV9jb3VudF9sbzsKKwl1MzIgc2hpZnRfYnl0ZV9jb3VudF9oaTsKKwlpbnQgcHRzX21vZGVfc3dpdGNoaW5nX2NvdW50OworCWludCBwdHNfbW9kZV9yZWNvdmVyeV9jb3VudDsKKwlib29sIGdldF9mcmFtZV9kdXI7CisKKwl1MzIgc2F2ZWRfcmVzb2x1dGlvbjsKKwkvKiovCisJc3RydWN0IEFWMV9Db21tb25fcyBjb21tb247CisJc3RydWN0IFJlZkNudEJ1ZmZlcl9zICpjdXJfYnVmOworCWludCByZWZyZXNoX2ZyYW1lX2ZsYWdzOworCXVpbnQ4X3QgbmVlZF9yZXN5bmM7CisJdWludDhfdCBob2xkX3JlZl9idWY7CisJdWludDhfdCByZWFkeV9mb3JfbmV3X2RhdGE7CisJc3RydWN0IEJ1ZmZlclBvb2xfcyBhdjFfYnVmZmVyX3Bvb2w7CisKKwlzdHJ1Y3QgQnVmZkluZm9fcyAqd29ya19zcGFjZV9idWY7CisKKwlzdHJ1Y3QgYnVmZl9zICptY19idWY7CisKKwl1bnNpZ25lZCBpbnQgZnJhbWVfd2lkdGg7CisJdW5zaWduZWQgaW50IGZyYW1lX2hlaWdodDsKKworCXVuc2lnbmVkIHNob3J0ICpycG1fcHRyOworCWludCAgICAgaW5pdF9waWNfdzsKKwlpbnQgICAgIGluaXRfcGljX2g7CisJaW50ICAgICBsY3VfdG90YWw7CisKKwlpbnQgICAgIGN1cnJlbnRfbGN1X3NpemU7CisKKwlpbnQgICAgIHNsaWNlX3R5cGU7CisKKwlpbnQgc2tpcF9mbGFnOworCWludCBkZWNvZGVfaWR4OworCWludCByZXN1bHRfZG9uZV9jb3VudDsKKwl1aW50OF90IGhhc19rZXlmcmFtZTsKKwl1aW50OF90IGhhc19zZXF1ZW5jZTsKKwl1aW50OF90IHdhaXRfYnVmOworCXVpbnQ4X3QgZXJyb3JfZmxhZzsKKworCS8qIGJpdCAwLCBmb3IgZGVjb2Rpbmc7IGJpdCAxLCBmb3IgZGlzcGxheWluZyAqLworCXVpbnQ4X3QgaWdub3JlX2J1Zm1ncl9lcnJvcjsKKwlpbnQgUEJfc2tpcF9tb2RlOworCWludCBQQl9za2lwX2NvdW50X2FmdGVyX2RlY29kaW5nOworCS8qaHcqLworCisJLyoqLworCXN0cnVjdCB2ZGVjX2luZm8gKmd2czsKKworCXUzMiBwcmVfc3RyZWFtX29mZnNldDsKKworCXVuc2lnbmVkIGludCBkZWNfc3RhdHVzOworCXUzMiBsYXN0X3B1dF9pZHg7CisJaW50IG5ld19mcmFtZV9kaXNwbGF5ZWQ7CisJdm9pZCAqbW11X2JveDsKKwl2b2lkICpibW11X2JveDsKKwlpbnQgbW11X2VuYWJsZTsKKyNpZmRlZiBBT01fQVYxX01NVV9EVworCXZvaWQgKm1tdV9ib3hfZHc7CisJaW50IGR3X21tdV9lbmFibGU7CisjZW5kaWYKKwlzdHJ1Y3QgdmZyYW1lX21hc3Rlcl9kaXNwbGF5X2NvbG91cl9zIHZmX2RwOworCXN0cnVjdCBmaXJtd2FyZV9zICpmdzsKKwlpbnQgbWF4X3BpY193OworCWludCBtYXhfcGljX2g7CisJaW50IGJ1ZmZlcl9zcGVjX2luZGV4OworCWludDMyX3QgbWF4X29uZV9tdl9idWZmZXJfc2l6ZTsKKworCWludCBuZWVkX2NhY2hlX3NpemU7CisJdTY0IHNjX3N0YXJ0X3RpbWU7CisJYm9vbCBwb3N0cHJvY19kb25lOworCWludCBsb3dfbGF0ZW5jeV9mbGFnOworCWJvb2wgbm9faGVhZDsKKwlib29sIHBpY19saXN0X2luaXRfZG9uZTsKKwlib29sIHBpY19saXN0X2luaXRfZG9uZTI7CisJYm9vbCBpc191c2VkX3Y0bDsKKwl2b2lkICp2NGwyX2N0eDsKKwlib29sIHY0bF9wYXJhbXNfcGFyc2VkOworCWludCBmcmFtZWluZm9fZW5hYmxlOworCXN0cnVjdCB2ZnJhbWVfcW9zX3MgdmZyYW1lX3FvczsKKworI2lmZGVmIEFPTV9BVjFfREJMS19JTklUCisJLyoKKwkgKiBtYWxsb2MgbWF5IG5vdCB3b3JrIGluIHJlYWwgY2hpcCwgcGxlYXNlIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmVzCisJICovCisJc3RydWN0IGxvb3BfZmlsdGVyX2luZm9fbl9zICpsZmk7CisJc3RydWN0IGxvb3BmaWx0ZXIgKmxmOworCXN0cnVjdCBzZWdtZW50YXRpb25fbGYgKnNlZ180bGY7CisjZW5kaWYKKwl1MzIgbWVtX21hcF9tb2RlOworCXUzMiBkeW5hbWljX2J1Zl9udW1fbWFyZ2luOworCXN0cnVjdCB2ZnJhbWVfcyB2ZnJhbWVfZHVtbXk7CisJdTMyIHJlc19jaF9mbGFnOworCWludCBidWZmZXJfd3JhcFtGUkFNRV9CVUZGRVJTXTsKKwlpbnQgc2lkZWJpbmRfdHlwZTsKKwlpbnQgc2lkZWJpbmRfY2hhbm5lbF9pZDsKKwl1MzIgY3VyX29idV90eXBlOworCXUzMiBtdWx0aV9mcmFtZV9jbnQ7CisJdTMyIGVuZGlhbjsKKwl1MzIgcnVuX3JlYWR5X21pbl9idWZfbnVtOworCWludCBvbmVfcGFja2FnZV9mcmFtZV9jbnQ7CisJdWxvbmcgZmJfdG9rZW47CisJYm9vbCB3YWl0X21vcmVfYnVmOworCWRtYV9hZGRyX3QgcmRtYV9waHlfYWRyOworCXVuc2lnbmVkICpyZG1hX2FkcjsKKwl1MzIgYXV4X2RhdGFfc2l6ZTsKKwlib29sIG5vX25lZWRfYXV4X2RhdGE7CisJc3RydWN0IHRyYWNlX2RlY29kZXJfbmFtZSB0cmFjZTsKKwlzdHJ1Y3QgdmF2MV9hc3NpdF90YXNrIGFzc2l0X3Rhc2s7CisJaW50IGZpbG1fZ3JhaW5fcHJlc2VudDsKKwl1bG9uZyBmZ190YWJsZV9oYW5kbGU7CisJc3RydWN0IHZkZWNfZ2UyZCAqZ2UyZDsKKwl1MzIgZGF0YV9vZmZzZXQ7CisJdTMyIGRhdGFfaW52YWxpZDsKKwl1MzIgY29uc3VtZV9ieXRlOworfTsKK3N0YXRpYyB2b2lkIGF2MV9kdW1wX3N0YXRlKHN0cnVjdCB2ZGVjX3MgKnZkZWMpOworCitpbnQgYXYxX3ByaW50KHN0cnVjdCBBVjFIV19zICpodywKKwlpbnQgZmxhZywgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisjZGVmaW5lIEhFVkNfUFJJTlRfQlVGCQk1MTIKKwl1bnNpZ25lZCBjaGFyIGJ1ZltIRVZDX1BSSU5UX0JVRl07CisJaW50IGxlbiA9IDA7CisKKwlpZiAoaHcgPT0gTlVMTCB8fAorCQkoZmxhZyA9PSAwKSB8fAorCQkoZGVidWcgJiBmbGFnKSkgeworCQl2YV9saXN0IGFyZ3M7CisKKwkJdmFfc3RhcnQoYXJncywgZm10KTsKKwkJaWYgKGh3KQorCQkJbGVuID0gc3ByaW50ZihidWYsICJbJWRdIiwgaHctPmluZGV4KTsKKwkJdnNucHJpbnRmKGJ1ZiArIGxlbiwgSEVWQ19QUklOVF9CVUYgLSBsZW4sIGZtdCwgYXJncyk7CisJCXByX2luZm8oIiVzIiwgYnVmKTsKKwkJdmFfZW5kKGFyZ3MpOworCX0KKwlyZXR1cm4gMDsKK30KKwordW5zaWduZWQgY2hhciBhdjFfaXNfZGVidWcoaW50IGZsYWcpCit7CisJaWYgKChmbGFnID09IDApIHx8IChkZWJ1ZyAmIGZsYWcpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitpbnQgYXYxX3ByaW50MihpbnQgZmxhZywgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdW5zaWduZWQgY2hhciBidWZbSEVWQ19QUklOVF9CVUZdOworCWludCBsZW4gPSAwOworCisJaWYgKChmbGFnID09IDApIHx8CisJCShkZWJ1ZyAmIGZsYWcpKSB7CisJCXZhX2xpc3QgYXJnczsKKworCQl2YV9zdGFydChhcmdzLCBmbXQpOworCQl2c25wcmludGYoYnVmICsgbGVuLCBIRVZDX1BSSU5UX0JVRiAtIGxlbiwgZm10LCBhcmdzKTsKKwkJcHJfaW5mbygiJXMiLCBidWYpOworCQl2YV9lbmQoYXJncyk7CisJfQorCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQgaXNfb3ZlcnNpemUoaW50IHcsIGludCBoKQoreworCWludCBtYXggPSAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpPworCQlNQVhfU0laRV84SyA6IE1BWF9TSVpFXzRLOworCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDVEKQorCQltYXggPSBNQVhfU0laRV8ySzsKKworCWlmICh3IDw9IDAgfHwgaCA8PSAwKQorCQlyZXR1cm4gdHJ1ZTsKKworCWlmIChoICE9IDAgJiYgKHcgPiBtYXggLyBoKSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgdjRsX2FsbG9jX2FuZF9jb25maWdfcGljKHN0cnVjdCBBVjFIV19zICpodywKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljKTsKKworc3RhdGljIGlubGluZSBib29sIGNsb3NlX3RvKGludCBhLCBpbnQgYiwgaW50IG0pCit7CisJcmV0dXJuIChhYnMoYSAtIGIpIDwgbSkgPyB0cnVlIDogZmFsc2U7Cit9CisKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCitzdGF0aWMgaW50IGF2MV9wcmludF9jb250KHN0cnVjdCBBVjFIV19zICpodywKKwlpbnQgZmxhZywgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdW5zaWduZWQgY2hhciBidWZbSEVWQ19QUklOVF9CVUZdOworCWludCBsZW4gPSAwOworCisJaWYgKGh3ID09IE5VTEwgfHwKKwkJKGZsYWcgPT0gMCkgfHwKKwkJKGRlYnVnICYgZmxhZykpIHsKKwkJdmFfbGlzdCBhcmdzOworCisJCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJCXZzbnByaW50ZihidWYgKyBsZW4sIEhFVkNfUFJJTlRfQlVGIC0gbGVuLCBmbXQsIGFyZ3MpOworCQlwcl9pbmZvKCIlcyIsIGJ1Zik7CisJCXZhX2VuZChhcmdzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRyaWdnZXJfc2NoZWR1bGUoc3RydWN0IEFWMUhXX3MgKmh3KQoreworCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShody0+djRsMl9jdHgpOworCisJCWlmIChjdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSAmJgorCQkJIWh3LT52NGxfcGFyYW1zX3BhcnNlZCkKKwkJCXZkZWNfdjRsX3dyaXRlX2ZyYW1lX3N5bmMoY3R4KTsKKwl9CisKKwlBVFJBQ0VfQ09VTlRFUigiVl9TVF9ERUMtY2h1bmtfc2l6ZSIsIDApOworCisJaWYgKGh3LT52ZGVjX2NiKQorCQlody0+dmRlY19jYihod190b192ZGVjKGh3KSwgaHctPnZkZWNfY2JfYXJnKTsKK30KKworc3RhdGljIHZvaWQgcmVzZXRfcHJvY2Vzc190aW1lKHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlpZiAoaHctPnN0YXJ0X3Byb2Nlc3NfdGltZSkgeworCQl1bnNpZ25lZCBwcm9jZXNzX3RpbWUgPQorCQkJMTAwMCAqIChqaWZmaWVzIC0gaHctPnN0YXJ0X3Byb2Nlc3NfdGltZSkgLyBIWjsKKwkJaHctPnN0YXJ0X3Byb2Nlc3NfdGltZSA9IDA7CisJCWlmIChwcm9jZXNzX3RpbWUgPiBtYXhfcHJvY2Vzc190aW1lW2h3LT5pbmRleF0pCisJCQltYXhfcHJvY2Vzc190aW1lW2h3LT5pbmRleF0gPSBwcm9jZXNzX3RpbWU7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdGFydF9wcm9jZXNzX3RpbWUoc3RydWN0IEFWMUhXX3MgKmh3KQoreworCWh3LT5zdGFydF9wcm9jZXNzX3RpbWUgPSBqaWZmaWVzOworCWh3LT5kZWNvZGVfdGltZW91dF9jb3VudCA9IDA7CisJaHctPmxhc3RfbGN1X2lkeCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVvdXRfcHJvY2VzcyhzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwlpZiAoaHctPnByb2Nlc3NfYnVzeSkgeworCQlhdjFfcHJpbnQoaHcsCisJCQkwLCAiJXMgZGVjb2RlciB0aW1lb3V0IGJ1dCBwcm9jZXNzX2J1c3lcbiIsIF9fZnVuY19fKTsKKwkJaWYgKGRlYnVnKQorCQkJYXYxX3ByaW50KGh3LCAwLCAiZGVidWcgZGlzYWJsZSB0aW1lb3V0IG5vdGlmeVxuIik7CisJCXJldHVybjsKKwl9CisJaHctPnRpbWVvdXRfbnVtKys7CisJYW1oZXZjX3N0b3AoKTsKKworCWF2MV9wcmludChodywKKwkJMCwgIiVzIGRlY29kZXIgdGltZW91dFxuIiwgX19mdW5jX18pOworCisJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7Cit9CisKK3N0YXRpYyB1MzIgZ2V0X3ZhbGlkX2RvdWJsZV93cml0ZV9tb2RlKHN0cnVjdCBBVjFIV19zICpodykKK3sKKwl1MzIgZHcgPSAoKGRvdWJsZV93cml0ZV9tb2RlICYgMHg4MDAwMDAwMCkgPT0gMCkgPworCQlody0+ZG91YmxlX3dyaXRlX21vZGUgOgorCQkoZG91YmxlX3dyaXRlX21vZGUgJiAweDdmZmZmZmZmKTsKKwlpZiAoKGR3ICYgMHgyMCkgJiYKKwkJKChkdyAmIDB4ZikgPT0gMiB8fCAoZHcgJiAweGYpID09IDMpKSB7CisJCXByX2luZm8oIk1NVSBkb3VlYmxlIHdyaXRlIDE6NCBub3Qgc3VwcG9ydGVkICEhIVxuIik7CisJCWR3ID0gMDsKKwl9CisJcmV0dXJuIGR3OworfQorCitzdGF0aWMgaW50IGdldF9kb3VibGVfd3JpdGVfbW9kZShzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJdTMyIHZhbGlkX2R3X21vZGUgPSBnZXRfdmFsaWRfZG91YmxlX3dyaXRlX21vZGUoaHcpOworCXUzMiBkdzsKKwlpbnQgdywgaDsKKwlzdHJ1Y3QgQVYxX0NvbW1vbl9zICpjbSA9ICZody0+Y29tbW9uOworCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpjdXJfcGljX2NvbmZpZzsKKworCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJdW5zaWduZWQgaW50IG91dDsKKworCQl2ZGVjX3Y0bF9nZXRfZHdfbW9kZShody0+djRsMl9jdHgsICZvdXQpOworCQlkdyA9IG91dDsKKwkJcmV0dXJuIGR3OworCX0KKworCWN1cl9waWNfY29uZmlnID0gJmNtLT5jdXJfZnJhbWUtPmJ1ZjsKKwl3ID0gY3VyX3BpY19jb25maWctPnlfY3JvcF93aWR0aDsKKwloID0gY3VyX3BpY19jb25maWctPnlfY3JvcF9oZWlnaHQ7CisKKwlkdyA9IDB4MTsgLyoxOjEqLworCXN3aXRjaCAodmFsaWRfZHdfbW9kZSkgeworCWNhc2UgMHgxMDA6CisJCWlmICh3ID4gMTkyMCAmJiBoID4gMTA4OCkKKwkJCWR3ID0gMHg0OyAvKjE6MiovCisJCWJyZWFrOworCWNhc2UgMHgyMDA6CisJCWlmICh3ID4gMTkyMCAmJiBoID4gMTA4OCkKKwkJCWR3ID0gMHgyOyAvKjE6NCovCisJCWJyZWFrOworCWNhc2UgMHgzMDA6CisJCWlmICh3ID4gMTI4MCAmJiBoID4gNzIwKQorCQkJZHcgPSAweDQ7IC8qMToyKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZHcgPSB2YWxpZF9kd19tb2RlOworCQlicmVhazsKKwl9CisJcmV0dXJuIGR3OworfQorCisvKiBmb3IgZG91YmxlIHdyaXRlIGJ1ZiBhbGxvYyAqLworc3RhdGljIGludCBnZXRfZG91YmxlX3dyaXRlX21vZGVfaW5pdChzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJdTMyIHZhbGlkX2R3X21vZGUgPSBnZXRfdmFsaWRfZG91YmxlX3dyaXRlX21vZGUoaHcpOworCXUzMiBkdzsKKwlpbnQgdyA9IGh3LT5pbml0X3BpY193OworCWludCBoID0gaHctPmluaXRfcGljX2g7CisKKwlkdyA9IDB4MTsgLyoxOjEqLworCXN3aXRjaCAodmFsaWRfZHdfbW9kZSkgeworCWNhc2UgMHgxMDA6CisJCWlmICh3ID4gMTkyMCAmJiBoID4gMTA4OCkKKwkJCWR3ID0gMHg0OyAvKjE6MiovCisJCWJyZWFrOworCWNhc2UgMHgyMDA6CisJCWlmICh3ID4gMTkyMCAmJiBoID4gMTA4OCkKKwkJCWR3ID0gMHgyOyAvKjE6NCovCisJCWJyZWFrOworCWNhc2UgMHgzMDA6CisJCWlmICh3ID4gMTI4MCAmJiBoID4gNzIwKQorCQkJZHcgPSAweDQ7IC8qMToyKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZHcgPSB2YWxpZF9kd19tb2RlOworCQlicmVhazsKKwl9CisJcmV0dXJuIGR3OworfQorI2VuZGlmCisKKyNkZWZpbmUgRklMTV9HUkFJTl9UQVNLCisjaWZkZWYgRklMTV9HUkFJTl9UQVNLCisKK3N0YXRpYyB1MzIgdXNlX3NmZ3M7Cittb2R1bGVfcGFyYW0odXNlX3NmZ3MsIHVpbnQsIDA2NjQpOworCit2b2lkIGZpbG1fZ3JhaW5fdGFza193YWtldXAoc3RydWN0IEFWMUhXX3MgKmh3KQoreworCXUzMiBmZ19yZWcwLCBmZ19yZWcxLCBudW1feV9wb2ludHMsIG51bV9jYl9wb2ludHMsIG51bV9jcl9wb2ludHM7CisJc3RydWN0IEFWMV9Db21tb25fcyAqY20gPSAmaHctPmNvbW1vbjsKKworCWlmICghaHctPmFzc2l0X3Rhc2sudXNlX3NmZ3MgfHwgaHctPmVvcykKKwkJcmV0dXJuOworCisJZmdfcmVnMCA9IGNtLT5jdXJfZnJhbWUtPmZpbG1fZ3JhaW5fcmVnWzBdOworCWZnX3JlZzEgPSBjbS0+Y3VyX2ZyYW1lLT5maWxtX2dyYWluX3JlZ1sxXTsKKwludW1feV9wb2ludHMgPSBmZ19yZWcxICYgMHhmOworCW51bV9jcl9wb2ludHMgPSAoZmdfcmVnMSA+PiA4KSAmIDB4ZjsKKwludW1fY2JfcG9pbnRzID0gKGZnX3JlZzEgPj4gNCkgJiAweGY7CisJaWYgKChudW1feV9wb2ludHMgPiAwKSB8fAorCQkoKG51bV9jYl9wb2ludHMgPiAwKSB8ICgoZmdfcmVnMCA+PiAxNykgJiAweDEpKSB8fAorCQkoKG51bV9jcl9wb2ludHMgPiAwKSB8ICgoZmdfcmVnMCA+PiAxNykgJiAweDEpKSkKKwkJaHctPmZnc192YWxpZCA9IDE7CisJZWxzZQorCQlody0+ZmdzX3ZhbGlkID0gMDsKKworCWlmIChjbS0+Y3VyX2ZyYW1lKSB7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNtLT5jdXJfZnJhbWUtPndhaXRfc2Zncyk7CisJCWlmICgoKGdldF9kZWJ1Z19mZ3MoKSAmIERFQlVHX0ZHU19CWVBBU1MpID09IDApCisJCQkmJiBody0+ZmdzX3ZhbGlkKSB7CisJCQlhdG9taWNfc2V0KCZjbS0+Y3VyX2ZyYW1lLT5mZ3NfZG9uZSwgMCk7CisJCQlody0+YXNzaXRfdGFzay5wcml2YXRlID0gY20tPmN1cl9mcmFtZTsKKwkJCXVwKCZody0+YXNzaXRfdGFzay5zZW0pOworCQl9IGVsc2UgeworCQkJYXRvbWljX3NldCgmY20tPmN1cl9mcmFtZS0+ZmdzX2RvbmUsIDEpOworCQl9CisJfQorfQorRVhQT1JUX1NZTUJPTChmaWxtX2dyYWluX3Rhc2tfd2FrZXVwKTsKKworc3RhdGljIGludCBmaWxtX2dyYWluX3Rhc2sodm9pZCAqYXJncykKK3sKKwlzdHJ1Y3QgQVYxSFdfcyAqaHcgPSAoc3RydWN0IEFWMUhXX3MgKilhcmdzOworCXN0cnVjdCB2YXYxX2Fzc2l0X3Rhc2sgKmFzc2l0ID0gJmh3LT5hc3NpdF90YXNrOworCXN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbSA9IHsuc2NoZWRfcHJpb3JpdHkgPSBNQVhfUlRfUFJJTy8yfTsKKwlSZWZDbnRCdWZmZXIgKmN1cl9mcmFtZTsKKworCXNjaGVkX3NldHNjaGVkdWxlcihjdXJyZW50LCBTQ0hFRF9GSUZPLCAmcGFyYW0pOworCisJYWxsb3dfc2lnbmFsKFNJR1RFUk0pOworCisJd2hpbGUgKGRvd25faW50ZXJydXB0aWJsZSgmYXNzaXQtPnNlbSkgPT0gMCkgeworCQlpZiAoYXNzaXQtPnJ1bm5pbmcgPT0gZmFsc2UpCisJCQlicmVhazsKKworCQlpZiAoYXNzaXQtPnByaXZhdGUgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCW11dGV4X2xvY2soJmFzc2l0LT5hc3NpdF9tdXRleCk7CisJCWN1cl9mcmFtZSA9IChSZWZDbnRCdWZmZXIgKilhc3NpdC0+cHJpdmF0ZTsKKwkJaWYgKCghaHctPmVvcykgJiYgKGF0b21pY19yZWFkKCZjdXJfZnJhbWUtPmZnc19kb25lKSA9PSAwKSkgeworCQkJCXBpY19maWxtX2dyYWluX3J1bihody0+ZnJhbWVfY291bnQsIGN1cl9mcmFtZS0+YnVmLnNmZ3NfdGFibGVfcHRyLAorCQkJCQljdXJfZnJhbWUtPmZpbG1fZ3JhaW5fY3RybCwgY3VyX2ZyYW1lLT5maWxtX2dyYWluX3JlZyk7CisJCQkJYXRvbWljX3NldCgmY3VyX2ZyYW1lLT5mZ3NfZG9uZSwgMSk7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjdXJfZnJhbWUtPndhaXRfc2Zncyk7CisJCQkJYXNzaXQtPnByaXZhdGUgPSBOVUxMOworCQkJCXZkZWNfc3luY19pcnEoVkRFQ19JUlFfMCk7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZhc3NpdC0+YXNzaXRfbXV0ZXgpOworCX0KKworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCXVzbGVlcF9yYW5nZSg1MDAsIDEwMDApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbG1fZ3JhaW5fdGFza19jcmVhdGUoc3RydWN0IEFWMUhXX3MgKmh3KQoreworCXN0cnVjdCB2YXYxX2Fzc2l0X3Rhc2sgKmFzc2l0ID0gJmh3LT5hc3NpdF90YXNrOworCisJbXV0ZXhfaW5pdCgmYXNzaXQtPmFzc2l0X211dGV4KTsKKworCWlmICgoIXZkZWNfc2VjdXJlKGh3X3RvX3ZkZWMoaHcpKSB8fCAoZ2V0X2NwdV9tYWpvcl9pZCgpICE9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TQzIpKQorCQkmJiAhdXNlX3NmZ3MpCisJCXJldHVybiAwOworCisJYXNzaXQtPnVzZV9zZmdzID0gMTsKKwlzZW1hX2luaXQoJmFzc2l0LT5zZW0sIDApOworCisJYXNzaXQtPnRhc2sgPSBrdGhyZWFkX3J1bihmaWxtX2dyYWluX3Rhc2ssIGh3LCAiZmdzX3Rhc2siKTsKKwlpZiAoSVNfRVJSKGFzc2l0LT50YXNrKSkgeworCQlwcl9lcnIoIiVzLCBjcmVhdCBmaWxtIGdyYWluIHRhc2sgdGhyZWFkIGZhaWxkICVsZFxuIiwKKwkJCV9fZnVuY19fLCBQVFJfRVJSKGFzc2l0LT50YXNrKSk7CisJCXJldHVybiBQVFJfRVJSKGFzc2l0LT50YXNrKTsKKwl9CisJYXNzaXQtPnJ1bm5pbmcgPSB0cnVlOworCWFzc2l0LT5wcml2YXRlID0gTlVMTDsKKwlhdjFfcHJpbnQoaHcsIDAsICIlcywgdGFzayAlcHggY3JlYXRlIHN1Y2Vzc1xuIiwgX19mdW5jX18sIGFzc2l0LT50YXNrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmaWxtX2dyYWluX3Rhc2tfZXhpdChzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJc3RydWN0IHZhdjFfYXNzaXRfdGFzayAqYXNzaXQgPSAmaHctPmFzc2l0X3Rhc2s7CisKKwlpZiAoKCFhc3NpdC0+dXNlX3NmZ3MpIHx8IChJU19FUlIoYXNzaXQtPnRhc2spKSkKKwkJcmV0dXJuOworCisJYXNzaXQtPnJ1bm5pbmcgPSBmYWxzZTsKKwl1cCgmYXNzaXQtPnNlbSk7CisKKwlpZiAoYXNzaXQtPnRhc2spIHsKKwkJa3RocmVhZF9zdG9wKGFzc2l0LT50YXNrKTsKKwkJYXNzaXQtPnRhc2sgPSBOVUxMOworCX0KKwlhc3NpdC0+dXNlX3NmZ3MgPSAwOworCWF2MV9wcmludChodywgMCwgIiVzLCB0YXNrIGt0aHJlYWQgc3RvcGVkXG4iLCBfX2Z1bmNfXyk7Cit9CisjZW5kaWYKKworCisvKiByZXR1cm4gcGFnZSBudW1iZXIgKi8KK3N0YXRpYyBpbnQgYXYxX21tdV9wYWdlX251bShzdHJ1Y3QgQVYxSFdfcyAqaHcsCisJCWludCB3LCBpbnQgaCwgaW50IHNhdmVfbW9kZSkKK3sKKwlpbnQgcGljdHVyZV9zaXplOworCWludCBjdXJfbW11XzRrX251bWJlciwgbWF4X2ZyYW1lX251bTsKKworCXBpY3R1cmVfc2l6ZSA9IGNvbXB1dGVfbG9zbGVzc19jb21wX2JvZHlfc2l6ZSh3LCBoLCBzYXZlX21vZGUpOworCWN1cl9tbXVfNGtfbnVtYmVyID0gKChwaWN0dXJlX3NpemUgKyAoUEFHRV9TSVpFIC0gMSkpID4+IFBBR0VfU0hJRlQpOworCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKQorCQltYXhfZnJhbWVfbnVtID0gTUFYX0ZSQU1FXzhLX05VTTsKKwllbHNlCisJCW1heF9mcmFtZV9udW0gPSBNQVhfRlJBTUVfNEtfTlVNOworCisJaWYgKGN1cl9tbXVfNGtfbnVtYmVyID4gbWF4X2ZyYW1lX251bSkgeworCQlwcl9lcnIoIm92ZXIgbWF4ICEhIGN1cl9tbXVfNGtfbnVtYmVyIDB4JXggd2lkdGggJWQgaGVpZ2h0ICVkXG4iLAorCQkJY3VyX21tdV80a19udW1iZXIsIHcsIGgpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIGN1cl9tbXVfNGtfbnVtYmVyOworfQorCitzdGF0aWMgc3RydWN0IGludGVybmFsX2NvbXBfYnVmKiB2NGxmYl90b19pY29tcF9idWYoCisJCXN0cnVjdCBBVjFIV19zICpodywKKwkJc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKmZiKQoreworCXN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1ZiAqYW1sX2ZiID0gTlVMTDsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKiB2NGwyX2N0eCA9IGh3LT52NGwyX2N0eDsKKworCWFtbF9mYiA9IGNvbnRhaW5lcl9vZihmYiwgc3RydWN0IGFtbF92aWRlb19kZWNfYnVmLCBmcmFtZV9idWZmZXIpOworCisJcmV0dXJuICZ2NGwyX2N0eC0+Y29tcF9idWZzW2FtbF9mYi0+aW50ZXJuYWxfaW5kZXhdOworfQorCitzdGF0aWMgc3RydWN0IGludGVybmFsX2NvbXBfYnVmKiBpbmRleF90b19pY29tcF9idWYoCisJCXN0cnVjdCBBVjFIV19zICpodywgaW50IGluZGV4KQoreworCXN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1ZiAqYW1sX2ZiID0gTlVMTDsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKiB2NGwyX2N0eCA9IGh3LT52NGwyX2N0eDsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPSBOVUxMOworCisJZmIgPSAoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKikKKwkJaHctPm1fQlVGW2luZGV4XS52NGxfcmVmX2J1Zl9hZGRyOworCWFtbF9mYiA9IGNvbnRhaW5lcl9vZihmYiwgc3RydWN0IGFtbF92aWRlb19kZWNfYnVmLCBmcmFtZV9idWZmZXIpOworCisJcmV0dXJuICZ2NGwyX2N0eC0+Y29tcF9idWZzW2FtbF9mYi0+aW50ZXJuYWxfaW5kZXhdOworfQorCisvLyNkZWZpbmUJTUFYXzRLX05VTQkJMHgxMjAwCitpbnQgYXYxX2FsbG9jX21tdSgKKwlzdHJ1Y3QgQVYxSFdfcyAqaHcsCisJaW50IGN1cl9idWZfaWR4LAorCWludCBwaWNfd2lkdGgsCisJaW50IHBpY19oZWlnaHQsCisJdW5zaWduZWQgc2hvcnQgYml0X2RlcHRoLAorCXVuc2lnbmVkIGludCAqbW11X2luZGV4X2FkcikKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgYml0X2RlcHRoXzEwID0gKGJpdF9kZXB0aCA9PSBBT01fQklUU18xMCk7CisJaW50IGN1cl9tbXVfNGtfbnVtYmVyOworCisJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShodykgJiAweDEwKQorCQlyZXR1cm4gMDsKKworCWlmIChiaXRfZGVwdGggPj0gQU9NX0JJVFNfMTIpIHsKKwkJaHctPmZhdGFsX2Vycm9yID0gREVDT0RFUl9GQVRBTF9FUlJPUl9TSVpFX09WRVJGTE9XOworCQlwcl9lcnIoImZhdGFsX2Vycm9yLCB1biBzdXBwb3J0IGJpdCBkZXB0aCAxMiFcblxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwljdXJfbW11XzRrX251bWJlciA9IGF2MV9tbXVfcGFnZV9udW0oaHcsCisJCQkJcGljX3dpZHRoLAorCQkJCXBpY19oZWlnaHQsCisJCQkJYml0X2RlcHRoXzEwKTsKKwlpZiAoY3VyX21tdV80a19udW1iZXIgPCAwKQorCQlyZXR1cm4gLTE7CisJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV9oZWFkZXJfbWVtb3J5X3RpbWVfbmFtZSwgVFJBQ0VfSEVBREVSX01FTU9SWV9TVEFSVCk7CisJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQlzdHJ1Y3QgaW50ZXJuYWxfY29tcF9idWYgKmlidWYgPQorCQkJaW5kZXhfdG9faWNvbXBfYnVmKGh3LCBjdXJfYnVmX2lkeCk7CisKKwkJcmV0ID0gZGVjb2Rlcl9tbXVfYm94X2FsbG9jX2lkeCgKKwkJCQlpYnVmLT5tbXVfYm94LAorCQkJCWlidWYtPmluZGV4LAorCQkJCWlidWYtPmZyYW1lX2J1ZmZlcl9zaXplLAorCQkJCW1tdV9pbmRleF9hZHIpOworCX0gZWxzZSB7CisJCXJldCA9IGRlY29kZXJfbW11X2JveF9hbGxvY19pZHgoCisJCQlody0+bW11X2JveCwKKwkJCWN1cl9idWZfaWR4LAorCQkJY3VyX21tdV80a19udW1iZXIsCisJCQltbXVfaW5kZXhfYWRyKTsKKwl9CisJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV9oZWFkZXJfbWVtb3J5X3RpbWVfbmFtZSwgVFJBQ0VfSEVBREVSX01FTU9SWV9FTkQpOworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBBT01fQVYxX01NVV9EVworc3RhdGljIGludCBjb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemVfZHcoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCQkJCXVpbnQ4X3QgaXNfYml0X2RlcHRoXzEwKTsKKworaW50IGF2MV9hbGxvY19tbXVfZHcoCisJc3RydWN0IEFWMUhXX3MgKmh3LAorCWludCBjdXJfYnVmX2lkeCwKKwlpbnQgcGljX3dpZHRoLAorCWludCBwaWNfaGVpZ2h0LAorCXVuc2lnbmVkIHNob3J0IGJpdF9kZXB0aCwKKwl1bnNpZ25lZCBpbnQgKm1tdV9pbmRleF9hZHIpCit7CisJaW50IHJldCA9IDA7CisJaW50IGJpdF9kZXB0aF8xMCA9IChiaXRfZGVwdGggPT0gQU9NX0JJVFNfMTApOworCWludCBwaWN0dXJlX3NpemU7CisJaW50IGN1cl9tbXVfNGtfbnVtYmVyLCBtYXhfZnJhbWVfbnVtOworCisJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShodykgJiAweDEwKQorCQlyZXR1cm4gMDsKKwlpZiAoYml0X2RlcHRoID49IEFPTV9CSVRTXzEyKSB7CisJCWh3LT5mYXRhbF9lcnJvciA9IERFQ09ERVJfRkFUQUxfRVJST1JfU0laRV9PVkVSRkxPVzsKKwkJcHJfZXJyKCJmYXRhbF9lcnJvciwgdW4gc3VwcG9ydCBiaXQgZGVwdGggMTIhXG5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXBpY3R1cmVfc2l6ZSA9IGNvbXB1dGVfbG9zbGVzc19jb21wX2JvZHlfc2l6ZV9kdyhwaWNfd2lkdGgsIHBpY19oZWlnaHQsCisJCQkJICAgYml0X2RlcHRoXzEwKTsKKwljdXJfbW11XzRrX251bWJlciA9ICgocGljdHVyZV9zaXplICsgKDEgPDwgMTIpIC0gMSkgPj4gMTIpOworCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKQorCQltYXhfZnJhbWVfbnVtID0gTUFYX0ZSQU1FXzhLX05VTTsKKwllbHNlCisJCW1heF9mcmFtZV9udW0gPSBNQVhfRlJBTUVfNEtfTlVNOworCisJaWYgKGN1cl9tbXVfNGtfbnVtYmVyID4gbWF4X2ZyYW1lX251bSkgeworCQlwcl9lcnIoIm92ZXIgbWF4ICEhIGN1cl9tbXVfNGtfbnVtYmVyIDB4JXggd2lkdGggJWQgaGVpZ2h0ICVkXG4iLAorCQkJY3VyX21tdV80a19udW1iZXIsIHBpY193aWR0aCwgcGljX2hlaWdodCk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQlzdHJ1Y3QgaW50ZXJuYWxfY29tcF9idWYgKmlidWYgPQorCQkJaW5kZXhfdG9faWNvbXBfYnVmKGh3LCBjdXJfYnVmX2lkeCk7CisKKwkJcmV0ID0gZGVjb2Rlcl9tbXVfYm94X2FsbG9jX2lkeCgKKwkJCQlpYnVmLT5tbXVfYm94X2R3LAorCQkJCWlidWYtPmluZGV4LAorCQkJCWlidWYtPmZyYW1lX2J1ZmZlcl9zaXplLAorCQkJCW1tdV9pbmRleF9hZHIpOworCX0gZWxzZSB7CisJCXJldCA9IGRlY29kZXJfbW11X2JveF9hbGxvY19pZHgoCisJCQlody0+bW11X2JveF9kdywKKwkJCWN1cl9idWZfaWR4LAorCQkJY3VyX21tdV80a19udW1iZXIsCisJCQltbXVfaW5kZXhfYWRyKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisjaWZuZGVmIE1WX1VTRV9GSVhFRF9CVUYKK3N0YXRpYyB2b2lkIGRlYWxsb2NfbXZfYnVmcyhzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IE1WX0JVRkZFUl9OVU07IGkrKykgeworCQlpZiAoaHctPm1fbXZfQlVGW2ldLnN0YXJ0X2FkcikgeworCQkJaWYgKGRlYnVnKQorCQkJCXByX2luZm8oCisJCQkJImRlYWxsb2MgbXYgYnVmKCVkKSBhZHIgJWxkIHNpemUgMHgleCB1c2VkX2ZsYWcgJWRcbiIsCisJCQkJaSwgaHctPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciwKKwkJCQlody0+bV9tdl9CVUZbaV0uc2l6ZSwKKwkJCQlody0+bV9tdl9CVUZbaV0udXNlZF9mbGFnKTsKKwkJCWRlY29kZXJfYm1tdV9ib3hfZnJlZV9pZHgoCisJCQkJaHctPmJtbXVfYm94LAorCQkJCU1WX0JVRkZFUl9JRFgoaSkpOworCQkJaHctPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciA9IDA7CisJCQlody0+bV9tdl9CVUZbaV0uc2l6ZSA9IDA7CisJCQlody0+bV9tdl9CVUZbaV0udXNlZF9mbGFnID0gMDsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBhbGxvY19tdl9idWYoc3RydWN0IEFWMUhXX3MgKmh3LAorCWludCBpLCBpbnQgc2l6ZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChody0+bV9tdl9CVUZbaV0uc3RhcnRfYWRyICYmCisJCXNpemUgPiBody0+bV9tdl9CVUZbaV0uc2l6ZSkgeworCQlkZWFsbG9jX212X2J1ZnMoaHcpOworCX0gZWxzZSBpZiAoaHctPm1fbXZfQlVGW2ldLnN0YXJ0X2FkcikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZGVjb2Rlcl9ibW11X2JveF9hbGxvY19idWZfcGh5CisJCShody0+Ym1tdV9ib3gsCisJCU1WX0JVRkZFUl9JRFgoaSksIHNpemUsCisJCURSSVZFUl9OQU1FLAorCQkmaHctPm1fbXZfQlVGW2ldLnN0YXJ0X2FkcikgPCAwKSB7CisJCWh3LT5tX212X0JVRltpXS5zdGFydF9hZHIgPSAwOworCQlyZXQgPSAtMTsKKwl9IGVsc2UgeworCQlody0+bV9tdl9CVUZbaV0uc2l6ZSA9IHNpemU7CisJCWh3LT5tX212X0JVRltpXS51c2VkX2ZsYWcgPSAwOworCQlyZXQgPSAwOworCQlpZiAoZGVidWcpIHsKKwkJCXByX2luZm8oCisJCQkiTVYgQnVmZmVyICVkOiBzdGFydF9hZHIgJXAgc2l6ZSAleFxuIiwKKwkJCWksCisJCQkodm9pZCAqKWh3LT5tX212X0JVRltpXS5zdGFydF9hZHIsCisJCQlody0+bV9tdl9CVUZbaV0uc2l6ZSk7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjYWxfbXZfYnVmX3NpemUoc3RydWN0IEFWMUhXX3MgKmh3LCBpbnQgcGljX3dpZHRoLCBpbnQgcGljX2hlaWdodCkKK3sKKwl1bnNpZ25lZCBsY3Vfc2l6ZSA9IGh3LT5jdXJyZW50X2xjdV9zaXplOworCWludCBleHRlbmRlZF9waWNfd2lkdGggPSAocGljX3dpZHRoICsgbGN1X3NpemUgLTEpCisJCQkJJiAofihsY3Vfc2l6ZSAtIDEpKTsKKwlpbnQgZXh0ZW5kZWRfcGljX2hlaWdodCA9IChwaWNfaGVpZ2h0ICsgbGN1X3NpemUgLTEpCisJCQkJJiAofihsY3Vfc2l6ZSAtIDEpKTsKKworCWludCBsY3VfeF9udW0gPSBleHRlbmRlZF9waWNfd2lkdGggLyBsY3Vfc2l6ZTsKKwlpbnQgbGN1X3lfbnVtID0gZXh0ZW5kZWRfcGljX2hlaWdodCAvIGxjdV9zaXplOworCWludCBzaXplX2EsIHNpemVfYiwgc2l6ZTsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPiBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU0MyKQorCQkvKnRtMnJldmIgYW5kIHNjMiovCisJCXNpemVfYSA9IGxjdV94X251bSAqIGxjdV95X251bSAqIDE2ICoKKwkJCSgobGN1X3NpemUgPT0gNjQpID8gMTYgOiA2NCk7CisJZWxzZQorCQlzaXplX2EgPSBsY3VfeF9udW0gKiBsY3VfeV9udW0gKiAxNiAqCisJCQkoKGxjdV9zaXplID09IDY0KSA/IDE5IDogNzYpOworCisJc2l6ZV9iID0gbGN1X3hfbnVtICogKChsY3VfeV9udW0gPj4gMykgKworCQkJKGxjdV95X251bSAmIDB4NykpICogMTY7CisJc2l6ZSA9ICgoc2l6ZV9hICsgc2l6ZV9iKSArIDB4ZmZmZikgJiAofjB4ZmZmZik7CisKKwlpZiAoZGVidWcgJiBBT01fREVCVUdfVVNFX0ZJWEVEX01WX0JVRl9TSVpFKQorCQlzaXplID0gaHctPm1heF9vbmVfbXZfYnVmZmVyX3NpemU7CisJaWYgKGZvcmNlX21heF9vbmVfbXZfYnVmZmVyX3NpemUpCisJCXNpemUgPSBmb3JjZV9tYXhfb25lX212X2J1ZmZlcl9zaXplOworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgaW50IGluaXRfbXZfYnVmX2xpc3Qoc3RydWN0IEFWMUhXX3MgKmh3KQoreworCWludCBpOworCWludCByZXQgPSAwOworCWludCBjb3VudCA9IE1WX0JVRkZFUl9OVU07CisJaW50IHBpY193aWR0aCA9IGh3LT5pbml0X3BpY193OworCWludCBwaWNfaGVpZ2h0ID0gaHctPmluaXRfcGljX2g7CisJaW50IHNpemUgPSBjYWxfbXZfYnVmX3NpemUoaHcsIHBpY193aWR0aCwgcGljX2hlaWdodCk7CisKKwlpZiAobXZfYnVmX2R5bmFtaWNfYWxsb2MpCisJCXJldHVybiAwOworI2lmIDAKKwlpZiAobXZfYnVmX21hcmdpbiA+IDApCisJCWNvdW50ID0gUkVGX0ZSQU1FUyArIG12X2J1Zl9tYXJnaW47CisJaWYgKGh3LT5pbml0X3BpY193ID4gMjA0OCAmJiBody0+aW5pdF9waWNfaCA+IDEwODgpCisJCWNvdW50ID0gUkVGX0ZSQU1FU180SyArIG12X2J1Zl9tYXJnaW47CisjZWxzZQorCWlmIChkZWJ1ZykKKwkJcHJfaW5mbygiJXMsIGNhbGN1bGF0ZWQgbXYgc2l6ZSAweCV4XG4iLAorCQkJX19mdW5jX18sIHNpemUpOworCisJaWYgKChody0+aXNfdXNlZF92NGwpICYmICFJU184S19TSVpFKHBpY193aWR0aCwgcGljX2hlaWdodCkpIHsKKwkJaWYgKHZkZWNfaXNfc3VwcG9ydF80aygpKQorCQkJc2l6ZSA9IDB4YjAwMDA7CisJCWVsc2UKKwkJCXNpemUgPSAweDMwMDAwOworCX0KKworCWlmIChody0+aW5pdF9waWNfdyA+IDQwOTYgJiYgaHctPmluaXRfcGljX2ggPiAyMDQ4KQorCQljb3VudCA9IFJFRl9GUkFNRVNfNEsgKyBody0+bXZfYnVmX21hcmdpbjsKKwllbHNlIGlmIChody0+aW5pdF9waWNfdyA+IDIwNDggJiYgaHctPmluaXRfcGljX2ggPiAxMDg4KQorCQljb3VudCA9IFJFRl9GUkFNRVNfNEsgKyBody0+bXZfYnVmX21hcmdpbjsKKwllbHNlCisJCWNvdW50ID0gUkVGX0ZSQU1FUyArIGh3LT5tdl9idWZfbWFyZ2luOworCisjZW5kaWYKKwlpZiAoZGVidWcpIHsKKwkJcHJfaW5mbygiJXMgdzolZCwgaDolZCwgY291bnQ6ICVkLCBzaXplIDB4JXhcbiIsCisJCV9fZnVuY19fLCBody0+aW5pdF9waWNfdywgaHctPmluaXRfcGljX2gsCisJCWNvdW50LCBzaXplKTsKKwl9CisKKwlmb3IgKGkgPSAwOworCQlpIDwgY291bnQgJiYgaSA8IE1WX0JVRkZFUl9OVU07IGkrKykgeworCQlpZiAoYWxsb2NfbXZfYnVmKGh3LCBpLCBzaXplKSA8IDApIHsKKwkJCXJldCA9IC0xOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnZXRfbXZfYnVmKHN0cnVjdCBBVjFIV19zICpodywKKwkJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnBpY19jb25maWcpCit7CisJaW50IGk7CisJaW50IHJldCA9IC0xOworCWlmIChtdl9idWZfZHluYW1pY19hbGxvYykgeworCQlpbnQgc2l6ZSA9IGNhbF9tdl9idWZfc2l6ZShodywKKwkJCXBpY19jb25maWctPnlfY3JvcF93aWR0aCwgcGljX2NvbmZpZy0+eV9jcm9wX2hlaWdodCk7CisJCWZvciAoaSA9IDA7IGkgPCBNVl9CVUZGRVJfTlVNOyBpKyspIHsKKwkJCWlmIChody0+bV9tdl9CVUZbaV0uc3RhcnRfYWRyID09IDApIHsKKwkJCQlyZXQgPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChpID09IE1WX0JVRkZFUl9OVU0pIHsKKwkJCXByX2luZm8oCisJCQkiJXM6IEVycm9yLCBtdiBidWYgTVZfQlVGRkVSX05VTSBpcyBub3QgZW5vdWdoXG4iLAorCQkJX19mdW5jX18pOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWlmIChhbGxvY19tdl9idWYoaHcsIHJldCwgc2l6ZSkgPj0gMCkgeworCQkJcGljX2NvbmZpZy0+bXZfYnVmX2luZGV4ID0gcmV0OworCQkJcGljX2NvbmZpZy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkciA9CisJCQkJKGh3LT5tX212X0JVRltyZXRdLnN0YXJ0X2FkciArIDB4ZmZmZikgJgorCQkJCSh+MHhmZmZmKTsKKwkJfSBlbHNlIHsKKwkJCXByX2luZm8oCisJCQkiJXM6IEVycm9yLCBtdiBidWYgYWxsb2MgZmFpbFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJfQorCQlyZXR1cm4gcmV0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBNVl9CVUZGRVJfTlVNOyBpKyspIHsKKwkJaWYgKGh3LT5tX212X0JVRltpXS5zdGFydF9hZHIgJiYKKwkJCWh3LT5tX212X0JVRltpXS51c2VkX2ZsYWcgPT0gMCkgeworCQkJaHctPm1fbXZfQlVGW2ldLnVzZWRfZmxhZyA9IDE7CisJCQlyZXQgPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAocmV0ID49IDApIHsKKwkJcGljX2NvbmZpZy0+bXZfYnVmX2luZGV4ID0gcmV0OworCQlwaWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyID0KKwkJCShody0+bV9tdl9CVUZbcmV0XS5zdGFydF9hZHIgKyAweGZmZmYpICYKKwkJCSh+MHhmZmZmKTsKKwkJaWYgKGRlYnVnICYgQVYxX0RFQlVHX0JVRk1HUl9NT1JFKQorCQkJcHJfaW5mbygKKwkJCSIlcyA9PiAlZCAoJWQpIHNpemUgMHgleFxuIiwKKwkJCV9fZnVuY19fLCByZXQsCisJCQlwaWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyLAorCQkJaHctPm1fbXZfQlVGW3JldF0uc2l6ZSk7CisJfSBlbHNlIHsKKwkJcHJfaW5mbygKKwkJIiVzOiBFcnJvciwgbXYgYnVmIGlzIG5vdCBlbm91Z2hcbiIsCisJCV9fZnVuY19fKTsKKwl9CisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyB2b2lkIHB1dF9tdl9idWYoc3RydWN0IEFWMUhXX3MgKmh3LAorCQkJCWludCAqbXZfYnVmX2luZGV4KQoreworCWludCBpID0gKm12X2J1Zl9pbmRleDsKKwlpZiAoaSA+PSBNVl9CVUZGRVJfTlVNKSB7CisJCWlmIChkZWJ1ZyAmIEFWMV9ERUJVR19CVUZNR1JfTU9SRSkKKwkJCXByX2luZm8oCisJCQkiJXM6IGluZGV4ICVkIGJleW9uZCByYW5nZVxuIiwKKwkJCV9fZnVuY19fLCBpKTsKKwkJcmV0dXJuOworCX0KKwlpZiAobXZfYnVmX2R5bmFtaWNfYWxsb2MpIHsKKwkJaWYgKGh3LT5tX212X0JVRltpXS5zdGFydF9hZHIpIHsKKwkJCWlmIChkZWJ1ZykKKwkJCQlwcl9pbmZvKAorCQkJCSJkZWFsbG9jIG12IGJ1ZiglZCkgYWRyICVsZCBzaXplIDB4JXggdXNlZF9mbGFnICVkXG4iLAorCQkJCWksIGh3LT5tX212X0JVRltpXS5zdGFydF9hZHIsCisJCQkJaHctPm1fbXZfQlVGW2ldLnNpemUsCisJCQkJaHctPm1fbXZfQlVGW2ldLnVzZWRfZmxhZyk7CisJCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWVfaWR4KAorCQkJCWh3LT5ibW11X2JveCwKKwkJCQlNVl9CVUZGRVJfSURYKGkpKTsKKwkJCWh3LT5tX212X0JVRltpXS5zdGFydF9hZHIgPSAwOworCQkJaHctPm1fbXZfQlVGW2ldLnNpemUgPSAwOworCQkJaHctPm1fbXZfQlVGW2ldLnVzZWRfZmxhZyA9IDA7CisJCX0KKwkJKm12X2J1Zl9pbmRleCA9IC0xOworCQlyZXR1cm47CisJfQorCisJaWYgKGRlYnVnICYgQVYxX0RFQlVHX0JVRk1HUl9NT1JFKQorCQlwcl9pbmZvKAorCQkiJXMoJWQpOiB1c2VkX2ZsYWcoJWQpXG4iLAorCQlfX2Z1bmNfXywgaSwKKwkJaHctPm1fbXZfQlVGW2ldLnVzZWRfZmxhZyk7CisKKwkqbXZfYnVmX2luZGV4ID0gLTE7CisJaWYgKGh3LT5tX212X0JVRltpXS5zdGFydF9hZHIgJiYKKwkJaHctPm1fbXZfQlVGW2ldLnVzZWRfZmxhZykKKwkJaHctPm1fbXZfQlVGW2ldLnVzZWRfZmxhZyA9IDA7Cit9CitzdGF0aWMgdm9pZAlwdXRfdW5fdXNlZF9tdl9idWZzKHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlzdHJ1Y3QgQVYxX0NvbW1vbl9zICpjb25zdCBjbSA9ICZody0+Y29tbW9uOworCXN0cnVjdCBSZWZDbnRCdWZmZXJfcyAqY29uc3QgZnJhbWVfYnVmcyA9IGNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmczsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgaHctPnVzZWRfYnVmX251bTsgKytpKSB7CisJCWlmICgoZnJhbWVfYnVmc1tpXS5yZWZfY291bnQgPT0gMCkgJiYKKwkJCShmcmFtZV9idWZzW2ldLmJ1Zi5pbmRleCAhPSAtMSkgJiYKKwkJCShmcmFtZV9idWZzW2ldLmJ1Zi5tdl9idWZfaW5kZXggPj0gMCkKKwkJCSkKKwkJCXB1dF9tdl9idWYoaHcsICZmcmFtZV9idWZzW2ldLmJ1Zi5tdl9idWZfaW5kZXgpOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBpbml0X3BpY19saXN0X2h3KHN0cnVjdCBBVjFIV19zICpwYmkpOworCitzdGF0aWMgdm9pZCB1cGRhdGVfaGlkZV9mcmFtZV90aW1lc3RhbXAoc3RydWN0IEFWMUhXX3MgKmh3KQoreworCVJlZkNudEJ1ZmZlciAqY29uc3QgZnJhbWVfYnVmcyA9IGh3LT5jb21tb24uYnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnM7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaHctPnVzZWRfYnVmX251bTsgKytpKSB7CisJCWlmICgoIWZyYW1lX2J1ZnNbaV0uc2hvd19mcmFtZSkgJiYKKwkJCShmcmFtZV9idWZzW2ldLnNob3dhYmxlX2ZyYW1lKSAmJgorCQkJKCFmcmFtZV9idWZzW2ldLmJ1Zi52Zl9yZWYpICYmCisJCQkoZnJhbWVfYnVmc1tpXS5idWYuQlVGX2luZGV4ICE9IC0xKSkgeworCQkJZnJhbWVfYnVmc1tpXS5idWYudGltZXN0YW1wID0gaHctPmNodW5rLT50aW1lc3RhbXA7CisJCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19PVVRfUFRTLAorCQkJCSIlcywgdXBkYXRlICVkIGhpZGUgZnJhbWUgdHM6ICVsbGRcbiIsCisJCQkJX19mdW5jX18sIGksIGZyYW1lX2J1ZnNbaV0uYnVmLnRpbWVzdGFtcCk7CisJCX0KKwl9Cit9CisKK2ludCBjaGVja19idWZmX2hhc19zaG93KHN0cnVjdCBSZWZDbnRCdWZmZXJfcyAqZnJhbWVfYnVmKQoreworCWludCByZXQgPSAxOworCisJaWYgKGRpc2FibGVfcmVwZWF0IHx8CisJCSgoZnJhbWVfYnVmLT5idWYudmZfcmVmID09IDApICYmCisJCShmcmFtZV9idWYtPmJ1Zi5pbmRleCAhPSAtMSkgJiYKKwkJZnJhbWVfYnVmLT5idWYuY21hX2FsbG9jX2FkZHIpKSB7CisJCXJldCA9IDA7CisJCWlmIChkZWJ1ZyAmIEFWMV9ERUJVR19CVUZNR1IpCisJCQlwcl9pbmZvKCJleGlzdGluZyBidWZmIGNhbiB1c2VcbiIpOworCX0gZWxzZSB7CisJCWlmIChkZWJ1ZyAmIEFWMV9ERUJVR19CVUZNR1IpCisJCQlwcl9pbmZvKCJleGlzdGluZyBidWZmIGNhbid0IHVzZVxuIik7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2ZyZWVfZmJfaWR4KEFWMV9DT01NT04gKmNtKQoreworCWludCBpOworCVJlZkNudEJ1ZmZlciAqY29uc3QgZnJhbWVfYnVmcyA9IGNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmczsKKworCWZvciAoaSA9IDA7IGkgPCBGUkFNRV9CVUZGRVJTOyArK2kpIHsKKwkJaWYgKChmcmFtZV9idWZzW2ldLnJlZl9jb3VudCA9PSAwKSAmJgorCQkJKGZyYW1lX2J1ZnNbaV0uYnVmLnZmX3JlZiA9PSAwKSAmJgorCQkJKGZyYW1lX2J1ZnNbaV0uYnVmLnJlcGVhdF9jb3VudCA9PSAwKSkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAoaSAhPSBGUkFNRV9CVUZGRVJTKSA/IGkgOiAtMTsKK30KKworc3RhdGljIGludCB2NGxfZ2V0X2ZyZWVfZmIoc3RydWN0IEFWMUhXX3MgKmh3KQoreworCXN0cnVjdCBBVjFfQ29tbW9uX3MgKmNvbnN0IGNtID0gJmh3LT5jb21tb247CisJc3RydWN0IFJlZkNudEJ1ZmZlcl9zICpjb25zdCBmcmFtZV9idWZzID0gY20tPmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqIHY0bCA9IGh3LT52NGwyX2N0eDsKKwlzdHJ1Y3QgdjRsX2J1ZmZfcG9vbCAqcG9vbCA9ICZ2NGwtPmNhcF9wb29sOworCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpwaWMgPSBOVUxMOworCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpmcmVlX3BpYyA9IE5VTEw7CisJdWxvbmcgZmxhZ3M7CisJaW50IGlkeCwgaTsKKworCWxvY2tfYnVmZmVyX3Bvb2woY20tPmJ1ZmZlcl9wb29sLCBmbGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcG9vbC0+aW47ICsraSkgeworCQl1MzIgc3RhdGUgPSAocG9vbC0+c2VxW2ldID4+IDE2KTsKKwkJdTMyIGluZGV4ID0gKHBvb2wtPnNlcVtpXSAmIDB4ZmZmZik7CisKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIFY0TF9DQVBfQlVGRl9JTl9ERUM6CisJCQlwaWMgPSAmZnJhbWVfYnVmc1tpXS5idWY7CisJCQlpZiAoKGZyYW1lX2J1ZnNbaV0ucmVmX2NvdW50ID09IDApICYmCisJCQkJKHBpYy0+dmZfcmVmID09IDApICYmCisJCQkJKHBpYy0+cmVwZWF0X2NvdW50ID09IDApICYmCisJCQkJKHBpYy0+aW5kZXggIT0gLTEpICYmCisJCQkJcGljLT5jbWFfYWxsb2NfYWRkcikgeworCQkJCWZyZWVfcGljID0gcGljOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVjRMX0NBUF9CVUZGX0lOX00yTToKKwkJCWlkeCA9IGdldF9mcmVlX2ZiX2lkeChjbSk7CisJCQlpZiAoaWR4IDwgMCkKKwkJCQlicmVhazsKKworCQkJcGljID0gJmZyYW1lX2J1ZnNbaWR4XS5idWY7CisJCQlwaWMtPnlfY3JvcF93aWR0aCA9IGh3LT5mcmFtZV93aWR0aDsKKwkJCXBpYy0+eV9jcm9wX2hlaWdodCA9IGh3LT5mcmFtZV9oZWlnaHQ7CisJCQlody0+YnVmZmVyX3dyYXBbaWR4XSA9IGluZGV4OworCQkJaWYgKCF2NGxfYWxsb2NfYW5kX2NvbmZpZ19waWMoaHcsIHBpYykpIHsKKwkJCQlzZXRfY2FudmFzKGh3LCBwaWMpOworCQkJCWluaXRfcGljX2xpc3RfaHcoaHcpOworCQkJCWZyZWVfcGljID0gcGljOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCWlmIChmcmVlX3BpYykgeworCQkJaWYgKGZyYW1lX2J1ZnNbaV0uYnVmLnVzZV9leHRlcm5hbF9yZWZlcmVuY2VfYnVmZmVycykgeworCQkJCS8vIElmIHRoaXMgZnJhbWUgYnVmZmVyJ3MgeV9idWZmZXIsIHVfYnVmZmVyLCBhbmQgdl9idWZmZXIgcG9pbnQgdG8gdGhlCisJCQkJLy8gZXh0ZXJuYWwgcmVmZXJlbmNlIGJ1ZmZlcnMuIFJlc3RvcmUgdGhlIGJ1ZmZlciBwb2ludGVycyB0byBwb2ludCB0byB0aGUKKwkJCQkvLyBpbnRlcm5hbGx5IGFsbG9jYXRlZCBtZW1vcnkuCisJCQkJUElDX0JVRkZFUl9DT05GSUcgKnliZiA9ICZmcmFtZV9idWZzW2ldLmJ1ZjsKKworCQkJCXliZi0+eV9idWZmZXIgPSB5YmYtPnN0b3JlX2J1Zl9hZHJbMF07CisJCQkJeWJmLT51X2J1ZmZlciA9IHliZi0+c3RvcmVfYnVmX2FkclsxXTsKKwkJCQl5YmYtPnZfYnVmZmVyID0geWJmLT5zdG9yZV9idWZfYWRyWzJdOworCQkJCXliZi0+dXNlX2V4dGVybmFsX3JlZmVyZW5jZV9idWZmZXJzID0gMDsKKwkJCX0KKworCQkJZnJhbWVfYnVmc1tpXS5yZWZfY291bnQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoZnJlZV9waWMgJiYgaHctPmNodW5rKSB7CisJCWZyZWVfcGljLT50aW1lc3RhbXAgPSBody0+Y2h1bmstPnRpbWVzdGFtcDsKKwkJdXBkYXRlX2hpZGVfZnJhbWVfdGltZXN0YW1wKGh3KTsKKwl9CisKKwl1bmxvY2tfYnVmZmVyX3Bvb2woY20tPmJ1ZmZlcl9wb29sLCBmbGFncyk7CisKKwlpZiAoZnJlZV9waWMpIHsKKwkJc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKmZiID0KKwkJCShzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqKQorCQkJaHctPm1fQlVGW2ZyZWVfcGljLT5pbmRleF0udjRsX3JlZl9idWZfYWRkcjsKKworCQlmYi0+c3RhdHVzID0gRkJfU1RfREVDT0RFUjsKKworCQl2NGwtPmF1eF9pbmZvcy5iaW5kX3NlaV9idWZmZXIodjRsLCAmZnJlZV9waWMtPmF1eF9kYXRhX2J1ZiwKKwkJCSZmcmVlX3BpYy0+YXV4X2RhdGFfc2l6ZSwgJmZyZWVfcGljLT5jdHhfYnVmX2lkeCk7CisKKwl9CisKKwlpZiAoZGVidWcgJiBBVjFfREVCVUdfT1VUX1BUUykgeworCQlpZiAoZnJlZV9waWMpIHsKKwkJCXByX2RlYnVnKCIlcywgaWR4OiAlZCwgdHM6ICVsbGRcbiIsCisJCQkJX19mdW5jX18sIGZyZWVfcGljLT5pbmRleCwgZnJlZV9waWMtPnRpbWVzdGFtcCk7CisJCX0gZWxzZSB7CisJCQlwcl9kZWJ1ZygiJXMsIGF2MSBnZXQgZnJlZSBwaWMgbnVsbFxuIiwgX19mdW5jX18pOworCQl9CisJfQorCisJcmV0dXJuIGZyZWVfcGljID8gZnJlZV9waWMtPmluZGV4IDogSU5WQUxJRF9JRFg7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2ZyZWVfZmIoQVYxX0NPTU1PTiAqY20pIHsKKwlSZWZDbnRCdWZmZXIgKmNvbnN0IGZyYW1lX2J1ZnMgPSBjbS0+YnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCWxvY2tfYnVmZmVyX3Bvb2woY20tPmJ1ZmZlcl9wb29sLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IEZSQU1FX0JVRkZFUlM7ICsraSkgeworCQlpZiAoZnJhbWVfYnVmc1tpXS5yZWZfY291bnQgPT0gMAorI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX01VTFRJX0RFQworCQkJJiYgZnJhbWVfYnVmc1tpXS5idWYudmZfcmVmID09IDAKKyNlbmRpZgorCQkpCisJCWJyZWFrOworCX0KKworCWlmIChpICE9IEZSQU1FX0JVRkZFUlMpIHsKKwkJaWYgKGZyYW1lX2J1ZnNbaV0uYnVmLnVzZV9leHRlcm5hbF9yZWZlcmVuY2VfYnVmZmVycykgeworCQkvLyBJZiB0aGlzIGZyYW1lIGJ1ZmZlcidzIHlfYnVmZmVyLCB1X2J1ZmZlciwgYW5kIHZfYnVmZmVyIHBvaW50IHRvIHRoZQorCQkvLyBleHRlcm5hbCByZWZlcmVuY2UgYnVmZmVycy4gUmVzdG9yZSB0aGUgYnVmZmVyIHBvaW50ZXJzIHRvIHBvaW50IHRvIHRoZQorCQkvLyBpbnRlcm5hbGx5IGFsbG9jYXRlZCBtZW1vcnkuCisJCVBJQ19CVUZGRVJfQ09ORklHICp5YmYgPSAmZnJhbWVfYnVmc1tpXS5idWY7CisJCXliZi0+eV9idWZmZXIgPSB5YmYtPnN0b3JlX2J1Zl9hZHJbMF07CisJCXliZi0+dV9idWZmZXIgPSB5YmYtPnN0b3JlX2J1Zl9hZHJbMV07CisJCXliZi0+dl9idWZmZXIgPSB5YmYtPnN0b3JlX2J1Zl9hZHJbMl07CisJCXliZi0+dXNlX2V4dGVybmFsX3JlZmVyZW5jZV9idWZmZXJzID0gMDsKKwkJfQorCisJCWZyYW1lX2J1ZnNbaV0ucmVmX2NvdW50ID0gMTsKKwl9IGVsc2UgeworCQkvLyBXZSBzaG91bGQgbmV2ZXIgcnVuIG91dCBvZiBmcmVlIGJ1ZmZlcnMuIElmIHRoaXMgYXNzZXJ0aW9uIGZhaWxzLCB0aGVyZQorCQkvLyBpcyBhIHJlZmVyZW5jZSBsZWFrLgorCQkvL2Fzc2VydCgwICYmICJSYW4gb3V0IG9mIGZyZWUgZnJhbWUgYnVmZmVycy4gTGlrZWx5IGEgcmVmZXJlbmNlIGxlYWsuIik7CisJCS8vIFJlc2V0IGkgdG8gYmUgSU5WQUxJRF9JRFggdG8gaW5kaWNhdGUgbm8gZnJlZSBidWZmZXIgZm91bmQuCisJCWkgPSBJTlZBTElEX0lEWDsKKwl9CisKKwl1bmxvY2tfYnVmZmVyX3Bvb2woY20tPmJ1ZmZlcl9wb29sLCBmbGFncyk7CisJcmV0dXJuIGk7Cit9CisKK2ludCBnZXRfZnJlZV9mcmFtZV9idWZmZXIoc3RydWN0IEFWMV9Db21tb25fcyAqY20pCit7CisJc3RydWN0IEFWMUhXX3MgKmh3ID0gY29udGFpbmVyX29mKGNtLCBzdHJ1Y3QgQVYxSFdfcywgY29tbW9uKTsKKworCXJldHVybiBody0+aXNfdXNlZF92NGwgPyB2NGxfZ2V0X2ZyZWVfZmIoaHcpIDogZ2V0X2ZyZWVfZmIoY20pOworfQorCitzdGF0aWMgaW50IGdldF9mcmVlX2J1Zl9jb3VudChzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJc3RydWN0IEFWMV9Db21tb25fcyAqY29uc3QgY20gPSAmaHctPmNvbW1vbjsKKwlzdHJ1Y3QgUmVmQ250QnVmZmVyX3MgKmNvbnN0IGZyYW1lX2J1ZnMgPSBjbS0+YnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnM7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPSAoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisJaW50IGksIGZyZWVfYnVmX2NvdW50ID0gMDsKKworCS8vY2xlYXJfZnJhbWVfYnVmX3JlZl9jb3VudChody0+cGJpKTsKKworCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJZm9yIChpID0gMDsgaSA8IGh3LT51c2VkX2J1Zl9udW07ICsraSkgeworCQkJaWYgKChmcmFtZV9idWZzW2ldLnJlZl9jb3VudCA9PSAwKSAmJgorCQkJCShmcmFtZV9idWZzW2ldLmJ1Zi52Zl9yZWYgPT0gMCkgJiYKKwkJCQkoZnJhbWVfYnVmc1tpXS5idWYucmVwZWF0X2NvdW50ID09IDApICYmCisJCQkJZnJhbWVfYnVmc1tpXS5idWYuY21hX2FsbG9jX2FkZHIpIHsKKwkJCQlmcmVlX2J1Zl9jb3VudCsrOworCQkJfQorCQl9CisKKwkJaWYgKGN0eC0+Y2FwX3Bvb2wuZGVjIDwgaHctPnVzZWRfYnVmX251bSkgeworCQkJaWYgKGN0eC0+ZmJfb3BzLnF1ZXJ5KCZjdHgtPmZiX29wcywgJmh3LT5mYl90b2tlbikpIHsKKwkJCQlmcmVlX2J1Zl9jb3VudCArPQorCQkJCQl2NGwyX20ybV9udW1fZHN0X2J1ZnNfcmVhZHkoY3R4LT5tMm1fY3R4KSArIDE7CisJCQl9CisJCX0KKworCQkvKiB0cmlnZ2VyIHRvIHBhcnNlIGhlYWQgZGF0YS4gKi8KKwkJaWYgKCFody0+djRsX3BhcmFtc19wYXJzZWQpIHsKKwkJCWZyZWVfYnVmX2NvdW50ID0gaHctPnJ1bl9yZWFkeV9taW5fYnVmX251bTsKKwkJfQorCQlpZiAoKGRlYnVnICYgQVYxX0RFQlVHX0JVRk1HUl9NT1JFKSAmJgorCQkJKGZyZWVfYnVmX2NvdW50IDw9IDApKSB7CisJCQlwcl9pbmZvKCIlcywgZnJlZSBjb3VudCAlZCwgbTJtX3JlYWR5ICVkXG4iLAorCQkJCV9fZnVuY19fLAorCQkJCWZyZWVfYnVmX2NvdW50LAorCQkJCXY0bDJfbTJtX251bV9kc3RfYnVmc19yZWFkeShjdHgtPm0ybV9jdHgpKTsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBody0+dXNlZF9idWZfbnVtOyArK2kpCisJCQlpZiAoKGZyYW1lX2J1ZnNbaV0ucmVmX2NvdW50ID09IDApICYmCisJCQkJKGZyYW1lX2J1ZnNbaV0uYnVmLnZmX3JlZiA9PSAwKSAmJgorCQkJCShmcmFtZV9idWZzW2ldLmJ1Zi5pbmRleCAhPSAtMSkpIHsKKwkJCQlmcmVlX2J1Zl9jb3VudCsrOworCQkJfQorCX0KKworCXJldHVybiBmcmVlX2J1Zl9jb3VudDsKK30KKworaW50IGFvbV9idWZtZ3JfaW5pdChzdHJ1Y3QgQVYxSFdfcyAqaHcsIHN0cnVjdCBCdWZmSW5mb19zICpidWZfc3BlY19pLAorCQlzdHJ1Y3QgYnVmZl9zICptY19idWZfaSkgeworCXN0cnVjdCBBVjFfQ29tbW9uX3MgKmNtID0gJmh3LT5jb21tb247CisJaWYgKGRlYnVnKQorCQlwcl9pbmZvKCIlcyAlZCAlcFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBody0+cGJpKTsKKwlody0+ZnJhbWVfY291bnQgPSAwOworCWh3LT5waWNfY291bnQgPSAwOworCWh3LT5wcmVfc3RyZWFtX29mZnNldCA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJmNtLT5idWZmZXJfcG9vbC0+bG9jayk7CisJY20tPnByZXZfZmJfaWR4ID0gSU5WQUxJRF9JRFg7CisJY20tPm5ld19mYl9pZHggPSBJTlZBTElEX0lEWDsKKwlody0+dXNlZF80a19udW0gPSAtMTsKKwljbS0+Y3VyX2ZiX2lkeF9tbXUgPSBJTlZBTElEX0lEWDsKKwlwcl9kZWJ1ZworCSgiQWZ0ZXIgYW9tX2J1Zm1ncl9pbml0LCBwcmV2X2ZiX2lkeCA6ICVkLCBuZXdfZmJfaWR4IDogJWRcclxuIiwKKwkJY20tPnByZXZfZmJfaWR4LCBjbS0+bmV3X2ZiX2lkeCk7CisJaHctPm5lZWRfcmVzeW5jID0gMTsKKworCWNtLT5jdXJyZW50X3ZpZGVvX2ZyYW1lID0gMDsKKwlody0+cmVhZHlfZm9yX25ld19kYXRhID0gMTsKKworCS8qIHByaXZhdGUgaW5pdCAqLworCWh3LT53b3JrX3NwYWNlX2J1ZiA9IGJ1Zl9zcGVjX2k7CisJaWYgKChnZXRfY3B1X21ham9yX2lkKCkgPCBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hMKSB8fAorCQkoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSA9PSAweDEwKSkgeworCQlody0+bWNfYnVmID0gbWNfYnVmX2k7CisJfQorCisJaHctPnJwbV9hZGRyID0gTlVMTDsKKwlody0+bG1lbV9hZGRyID0gTlVMTDsKKworCWh3LT51c2VfY21hX2ZsYWcgPSAwOworCWh3LT5kZWNvZGVfaWR4ID0gMDsKKwlody0+cmVzdWx0X2RvbmVfY291bnQgPSAwOworCS8qaW50IG1fdWlNYXhDVVdpZHRoID0gMTw8NzsqLworCS8qaW50IG1fdWlNYXhDVUhlaWdodCA9IDE8PDc7Ki8KKwlody0+aGFzX2tleWZyYW1lID0gMDsKKwlody0+aGFzX3NlcXVlbmNlID0gMDsKKwlody0+c2tpcF9mbGFnID0gMDsKKwlody0+d2FpdF9idWYgPSAwOworCWh3LT5lcnJvcl9mbGFnID0gMDsKKworCWh3LT5sYXN0X3B0cyA9IDA7CisJaHctPmxhc3RfcHRzX3VzNjQgPSAwOworCWh3LT5zaGlmdF9ieXRlX2NvdW50ID0gMDsKKwlody0+c2hpZnRfYnl0ZV9jb3VudF9sbyA9IDA7CisJaHctPnNoaWZ0X2J5dGVfY291bnRfaGkgPSAwOworCWh3LT5wdHNfbW9kZV9zd2l0Y2hpbmdfY291bnQgPSAwOworCWh3LT5wdHNfbW9kZV9yZWNvdmVyeV9jb3VudCA9IDA7CisKKwlody0+YnVmX251bSA9IDA7CisJaHctPnBpY19udW0gPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qCitzdHJ1Y3QgQVYxSFdfcyBhdjFfZGVjb2RlcjsKK3VuaW9uIHBhcmFtX3UgYXYxX3BhcmFtOworKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqQVYxIGJ1ZmZlciBtYW5hZ2VtZW50IGVuZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisKKyNkZWZpbmUgSEVWQ19DTV9CT0RZX1NUQVJUX0FERFIgICAgCQkJICAgIDB4MzYyNgorI2RlZmluZSBIRVZDX0NNX0JPRFlfTEVOR1RIICAgIAkJCQkgICAgMHgzNjI3CisjZGVmaW5lIEhFVkNfQ01fSEVBREVSX0xFTkdUSCAgICAJCQkJICAweDM2MjkKKyNkZWZpbmUgSEVWQ19DTV9IRUFERVJfT0ZGU0VUICAgIAkJCQkgIDB4MzYyYgorCisjZGVmaW5lIExPU0xFU1NfQ09NUFJFU1NfTU9ERQorCisvKiNkZWZpbmUgREVDT01QX0hFQURSX1NVUkdFTlQqLworI2lmZGVmIEFWMV8xMEJfTlYyMQorc3RhdGljIHUzMiBtZW1fbWFwX21vZGUgPSAyICAvKiAwOmxpbmVhciAxOjMyeDMyIDI6NjR4MzIqLworI2Vsc2UKK3N0YXRpYyB1MzIgbWVtX21hcF9tb2RlOyAvKiAwOmxpbmVhciAxOjMyeDMyIDI6NjR4MzIgOyBtOGJhYnkgdGVzdDE5MDIgKi8KKyNlbmRpZgorc3RhdGljIHUzMiBlbmFibGVfbWVtX3NhdmluZyA9IDE7CitzdGF0aWMgdTMyIGZvcmNlX3dfaDsKKworc3RhdGljIHUzMiBmb3JjZV9mcHM7CisKKworY29uc3QgdTMyIGF2MV92ZXJzaW9uID0gMjAxNjAyMTAxOworc3RhdGljIHUzMiBkZWJ1ZzsKK3N0YXRpYyB1MzIgcmFkcjsKK3N0YXRpYyB1MzIgcnZhbDsKK3N0YXRpYyB1MzIgcG9wX3Nob3J0czsKK3N0YXRpYyB1MzIgZGJnX2NtZDsKK3N0YXRpYyB1MzIgZGJnX3NraXBfZGVjb2RlX2luZGV4OworLyoKKyAqIGJpdCAwfjMsIGZvciBIRVZDRF9JUFBfQVhJSUZfQ09ORklHIGVuZGlhbiBjb25maWcKKyAqIGJpdCA4fjIzLCBmb3IgSEVWQ19TQU9fQ1RSTDEgZW5kaWFuIGNvbmZpZworICovCitzdGF0aWMgdTMyIGVuZGlhbjsKKyNkZWZpbmUgSEVWQ19DT05GSUdfQklHX0VORElBTiAgICAgKCgweDg4MCA8PCA4KSB8IDB4OCkKKyNkZWZpbmUgSEVWQ19DT05GSUdfTElUVExFX0VORElBTiAgKCgweGZmMCA8PCA4KSB8IDB4ZikKKworc3RhdGljIHUzMiBtdWx0aV9mcmFtZXNfaW5fb25lX3BhY2sgPSAxOworI2lmZGVmIEVSUk9SX0hBTkRMRV9ERUJVRworc3RhdGljIHUzMiBkYmdfbmFsX3NraXBfZmxhZzsKKwkJLyogYml0WzBdLCBza2lwIHZwczsgYml0WzFdLCBza2lwIHNwczsgYml0WzJdLCBza2lwIHBwcyAqLworc3RhdGljIHUzMiBkYmdfbmFsX3NraXBfY291bnQ7CisjZW5kaWYKKy8qZm9yIGRlYnVnKi8KK3N0YXRpYyB1MzIgZGVjb2RlX3BpY19iZWdpbjsKK3N0YXRpYyB1aW50IHNsaWNlX3BhcnNlX2JlZ2luOworc3RhdGljIHUzMiBzdGVwOworI2lmZGVmIE1JWF9TVFJFQU1fU1VQUE9SVAorc3RhdGljIHUzMiBidWZfYWxsb2Nfd2lkdGggPSA0MDk2Oworc3RhdGljIHUzMiBidWZfYWxsb2NfaGVpZ2h0ID0gMjMwNDsKK3N0YXRpYyB1MzIgYXYxX21heF9waWNfdyA9IDQwOTY7CitzdGF0aWMgdTMyIGF2MV9tYXhfcGljX2ggPSAyMzA0OworCitzdGF0aWMgdTMyIGR5bmFtaWNfYnVmX251bV9tYXJnaW4gPSAzOworI2Vsc2UKK3N0YXRpYyB1MzIgYnVmX2FsbG9jX3dpZHRoOworc3RhdGljIHUzMiBidWZfYWxsb2NfaGVpZ2h0Oworc3RhdGljIHUzMiBkeW5hbWljX2J1Zl9udW1fbWFyZ2luID0gNzsKKyNlbmRpZgorc3RhdGljIHUzMiBidWZfYWxsb2NfZGVwdGggPSAxMDsKK3N0YXRpYyB1MzIgYnVmX2FsbG9jX3NpemU7CisvKgorICpiaXRbMF06IDAsCisgKiAgICBiaXRbMV06IDAsIGFsd2F5cyByZWxlYXNlIGNtYSBidWZmZXIgd2hlbiBzdG9wCisgKiAgICBiaXRbMV06IDEsIG5ldmVyIHJlbGVhc2UgY21hIGJ1ZmZlciB3aGVuIHN0b3AKKyAqYml0WzBdOiAxLCB3aGVuIHN0b3AsIHJlbGVhc2UgY21hIGJ1ZmZlciBpZiBibGFja291dCBpcyAxOworICpkbyBub3QgcmVsZWFzZSBjbWEgYnVmZmVyIGlzIGJsYWNrb3V0IGlzIG5vdCAxCisgKgorICpiaXRbMl06IDAsIHdoZW4gc3RhcnQgZGVjb2RpbmcsIGNoZWNrIGN1cnJlbnQgZGlzcGxheWVkIGJ1ZmZlcgorICoJIChvbmx5IGZvciBidWZmZXIgZGVjb2RlZCBieSBBVjEpIGlmIGJsYWNrb3V0IGlzIDAKKyAqCSAxLCBkbyBub3QgY2hlY2sgY3VycmVudCBkaXNwbGF5ZWQgYnVmZmVyCisgKgorICpiaXRbM106IDEsIGlmIGJsYWNrb3V0IGlzIG5vdCAxLCBkbyBub3QgcmVsZWFzZSBjdXJyZW50CisgKgkJCWRpc3BsYXllZCBjbWEgYnVmZmVyIGFsd2F5cy4KKyAqLworLyogc2V0IHRvIDEgZm9yIGZhc3QgcGxheTsKKyAqCXNldCB0byA4IGZvciBvdGhlciBjYXNlIG9mICJrZWVwIGxhc3QgZnJhbWUiCisgKi8KK3N0YXRpYyB1MzIgYnVmZmVyX21vZGUgPSAxOworLyogYnVmZmVyX21vZGVfZGJnOiBkZWJ1ZyBvbmx5Ki8KK3N0YXRpYyB1MzIgYnVmZmVyX21vZGVfZGJnID0gMHhmZmZmMDAwMDsKKy8qKi8KKworLyoKKyAqYml0IDAsIDE6IG9ubHkgZGlzcGxheSBJIHBpY3R1cmU7CisgKmJpdCAxLCAxOiBvbmx5IGRlY29kZSBJIHBpY3R1cmU7CisgKi8KK3N0YXRpYyB1MzIgaV9vbmx5X2ZsYWc7CisKK3N0YXRpYyB1MzIgbG93X2xhdGVuY3lfZmxhZzsKKworc3RhdGljIHUzMiBub19oZWFkOworCitzdGF0aWMgdTMyIG1heF9kZWNvZGluZ190aW1lOworLyoKKyAqZXJyb3IgaGFuZGxpbmcKKyAqLworLyplcnJvcl9oYW5kbGVfcG9saWN5OgorICpiaXQgMDogMCwgYXV0byBza2lwIGVycm9yX3NraXBfbmFsX2NvdW50IG5hbHMgYmVmb3JlIGVycm9yIHJlY292ZXJ5OworICoxLCBza2lwIGVycm9yX3NraXBfbmFsX2NvdW50IG5hbHMgYmVmb3JlIGVycm9yIHJlY292ZXJ5OworICpiaXQgMSAodmFsaWQgb25seSB3aGVuIGJpdDAgPT0gMSk6CisgKjEsIHdhaXQgdnBzL3Nwcy9wcHMgYWZ0ZXIgZXJyb3IgcmVjb3Zlcnk7CisgKmJpdCAyICh2YWxpZCBvbmx5IHdoZW4gYml0MCA9PSAwKToKKyAqMCwgYXV0byBzZWFyY2ggYWZ0ZXIgZXJyb3IgcmVjb3ZlcnkgKGF2MV9yZWNvdmVyKCkgY2FsbGVkKTsKKyAqMSwgbWFudWFsIHNlYXJjaCBhZnRlciBlcnJvciByZWNvdmVyeQorICooY2hhbmdlIHRvIGF1dG8gc2VhcmNoIGFmdGVyIGdldCBJRFI6IFdSSVRFX1ZSRUcoTkFMX1NFQVJDSF9DVEwsIDB4MikpCisgKgorICpiaXQgNDogMCwgc2V0IGVycm9yX21hcmsgYWZ0ZXIgcmVzZXQvcmVjb3ZlcgorICogICAgMSwgZG8gbm90IHNldCBlcnJvcl9tYXJrIGFmdGVyIHJlc2V0L3JlY292ZXIKKyAqYml0IDU6IDAsIGNoZWNrIHRvdGFsIGxjdSBmb3IgZXZlcnkgcGljdHVyZQorICogICAgMSwgZG8gbm90IGNoZWNrIHRvdGFsIGxjdQorICoKKyAqLworCitzdGF0aWMgdTMyIGVycm9yX2hhbmRsZV9wb2xpY3k7CisvKnN0YXRpYyB1MzIgcGFyc2VyX3NlaV9lbmFibGUgPSAxOyovCisjZGVmaW5lIE1BWF9CVUZfTlVNX05PUk1BTCAgICAgMTYKKy8qbGVzcyBidWZzIG51bSAxMiBjYXVzZWQgZnJhbWUgZHJvcCwgbnRzIGZhaWxlZCovCisjZGVmaW5lIE1BWF9CVUZfTlVNX0xFU1MgICAxNAorc3RhdGljIHUzMiBtYXhfYnVmX251bSA9IE1BWF9CVUZfTlVNX05PUk1BTDsKKyNkZWZpbmUgTUFYX0JVRl9OVU1fU0FWRV9CVUYgIDgKKworc3RhdGljIERFRklORV9NVVRFWCh2YXYxX211dGV4KTsKKyNpZm5kZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorc3RhdGljIHN0cnVjdCBkZXZpY2UgKmNtYV9kZXY7CisjZW5kaWYKKyNkZWZpbmUgSEVWQ19ERUNfU1RBVFVTX1JFRyAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzAKKyNkZWZpbmUgSEVWQ19GR19TVEFUVVMJCQlIRVZDX0FTU0lTVF9TQ1JBVENIX0IKKyNkZWZpbmUgSEVWQ19SUE1fQlVGRkVSICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzEKKyNkZWZpbmUgQU9NX0FWMV9BREFQVF9QUk9CX1JFRyAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF8zCisjZGVmaW5lIEFPTV9BVjFfTU1VX01BUF9CVUZGRVIgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfNCAvLyBjaGFuZ2VkIHRvIHVzZSBIRVZDX0FTU0lTVF9NTVVfTUFQX0FERFIKKyNkZWZpbmUgQU9NX0FWMV9EQUFMQV9UT1BfQlVGRkVSICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF81CisvLyNkZWZpbmUgSEVWQ19TQU9fVVAgICAgICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzYKKy8vI2RlZmluZSBIRVZDX1NUUkVBTV9TV0FQX0JVRkZFUiAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfNworI2RlZmluZSBBT01fQVYxX0NERl9CVUZGRVJfVyAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfOAorI2RlZmluZSBBT01fQVYxX0NERl9CVUZGRVJfUiAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfOQorI2RlZmluZSBBT01fQVYxX0NPVU5UX1NXQVBfQlVGRkVSICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0EKKyNkZWZpbmUgQU9NX0FWMV9TRUdfTUFQX0JVRkZFUl9XICBBVjFfU0VHX1dfQUREUiAgLy8gICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9CCisjZGVmaW5lIEFPTV9BVjFfU0VHX01BUF9CVUZGRVJfUiAgQVYxX1NFR19SX0FERFIgIC8vICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfQworLy8jZGVmaW5lIEhFVkNfc2FvX3ZiX3NpemUgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9CCisvLyNkZWZpbmUgSEVWQ19TQU9fVkIgICAgICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0MKKy8vI2RlZmluZSBIRVZDX1NDQUxFTFVUICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfRAorI2RlZmluZSBIRVZDX1dBSVRfRkxBRwkgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9FCisjZGVmaW5lIFJQTV9DTURfUkVHICAgICAgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9GCisvLyNkZWZpbmUgSEVWQ19TVFJFQU1fU1dBUF9URVNUICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0wKKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKyNkZWZpbmUgSEVWQ19ERUNPREVfQ09VTlQgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9NCisjZGVmaW5lIEhFVkNfREVDT0RFX1NJWkUJCUhFVkNfQVNTSVNUX1NDUkFUQ0hfTgorI2Vsc2UKKyNkZWZpbmUgSEVWQ19ERUNPREVfUElDX0JFR0lOX1JFRyBIRVZDX0FTU0lTVF9TQ1JBVENIX00KKyNkZWZpbmUgSEVWQ19ERUNPREVfUElDX05VTV9SRUcgICBIRVZDX0FTU0lTVF9TQ1JBVENIX04KKyNlbmRpZgorI2RlZmluZSBBT01fQVYxX1NFR01FTlRfRkVBVFVSRSAgIEFWMV9RVUFOVF9XUgorCisjZGVmaW5lIERFQlVHX1JFRzEgICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfRworI2RlZmluZSBERUJVR19SRUcyICAgICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0gKKworI2RlZmluZSBMTUVNX0RVTVBfQURSICAgICAJICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0kKKyNkZWZpbmUgQ1VSX05BTF9VTklUX1RZUEUgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9KCisjZGVmaW5lIERFQ09ERV9TVE9QX1BPUyAgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9LCisKKyNkZWZpbmUgUElDX0VORF9MQ1VfQ09VTlQgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF8yCisKKyNkZWZpbmUgSEVWQ19BVVhfQURSCQkJSEVWQ19BU1NJU1RfU0NSQVRDSF9MCisjZGVmaW5lIEhFVkNfQVVYX0RBVEFfU0laRQkJSEVWQ19BU1NJU1RfU0NSQVRDSF83CisjaWYgKGRlZmluZWQgREVCVUdfVUNPREVfTE9HKSB8fCAoZGVmaW5lZCBERUJVR19DTUQpCisjZGVmaW5lIEhFVkNfREJHX0xPR19BRFIgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9DCisjaWZkZWYgREVCVUdfQ01ECisjZGVmaW5lIEhFVkNfRF9BRFIgICAgICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzQKKyNlbmRpZgorI2VuZGlmCisvKgorICp1Y29kZSBwYXJzZXIvc2VhcmNoIGNvbnRyb2wKKyAqYml0IDA6ICAwLCBoZWFkZXIgYXV0byBwYXJzZTsgMSwgaGVhZGVyIG1hbnVhbCBwYXJzZQorICpiaXQgMTogIDAsIGF1dG8gc2tpcCBmb3Igbm9uZXNlYW1sZXNzIHN0cmVhbTsgMSwgbm8gc2tpcAorICpiaXQgWzM6Ml06IHZhbGlkIHdoZW4gYml0MT09MDsKKyAqMCwgYXV0byBza2lwIG5hbCBiZWZvcmUgZmlyc3QgdnBzL3Nwcy9wcHMvaWRyOworICoxLCBhdXRvIHNraXAgbmFsIGJlZm9yZSBmaXJzdCB2cHMvc3BzL3BwcworICoyLCBhdXRvIHNraXAgbmFsIGJlZm9yZSBmaXJzdCAgdnBzL3Nwcy9wcHMsCisgKglhbmQgbm90IGRlY29kZSB1bnRpbCB0aGUgZmlyc3QgSSBzbGljZSAod2l0aCBzbGljZSBhZGRyZXNzIG9mIDApCisgKgorICozLCBhdXRvIHNraXAgYmVmb3JlIGZpcnN0IEkgc2xpY2UgKG5hbF90eXBlID49MTYgJiYgbmFsX3R5cGU8PTIxKQorICpiaXQgWzE1OjRdIG5hbCBza2lwIGNvdW50ICh2YWxpZCB3aGVuIGJpdDAgPT0gMSAobWFudWFsIG1vZGUpICkKKyAqYml0IFsxNl06IGZvciBOQUxfVU5JVF9FT1Mgd2hlbiBiaXQwIGlzIDA6CisgKgkwLCBzZW5kIFNFQVJDSF9ET05FIHRvIGFybSA7ICAxLCBkbyBub3Qgc2VuZCBTRUFSQ0hfRE9ORSB0byBhcm0KKyAqYml0IFsxN106IGZvciBOQUxfU0VJIHdoZW4gYml0MCBpcyAwOgorICoJMCwgZG8gbm90IHBhcnNlIFNFSSBpbiB1Y29kZTsgMSwgcGFyc2UgU0VJIGluIHVjb2RlCisgKmJpdCBbMzE6MjBdOiB1c2VkIGJ5IHVjb2RlIGZvciBkZWJ1ZyBwdXJwb3NlCisgKi8KKyNkZWZpbmUgTkFMX1NFQVJDSF9DVEwgICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0kKKwkvKlszMToyNF0gY2hpcCBmZWF0dXJlCisJCTMxOiAwLCB1c2UgTUJPWDE7IDEsIHVzZSBNQk9YMAorCSAgWzI0OjE2XSBkZWJ1ZworCSAgICAweDEsIGJ1Zm1nciBvbmx5CisJKi8KKyNkZWZpbmUgREVDT0RFX01PREUgICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfSgorI2RlZmluZSBERUNPREVfU1RPUF9QT1MgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0sKKworI2RlZmluZSBSUE1fQlVGX1NJWkUgKChSUE1fRU5EIC0gUlBNX0JFR0lOKSAqIDIpCisjZGVmaW5lIExNRU1fQlVGX1NJWkUgKDB4NjAwICogMikKKworLyoKKyNpZmRlZiBNQVBfOEsKK3N0YXRpYyB1MzIgc2VnX21hcF9zaXplID0gMHhkODAwMDsKKyNlbHNlCitzdGF0aWMgdTMyIHNlZ19tYXBfc2l6ZSA9IDB4MzYwMDA7CisjZW5kaWYKKyovCisvL3N0YXRpYyB1MzIgc2VnX21hcF9zaXplID0gMHgzNjAwMDsKKworLy8jZGVmaW5lIFZCSF9CVUZfQ09VTlQgNAorLy8jZGVmaW5lIFZCSF9CVUZfU0laRV8xMDgwUCAoKCgoMiAqIDE2ICogMTA4OCkgKyAweGZmZmYpICYgKH4weGZmZmYpKSAqIFZCSF9CVUZfQ09VTlQpCisvLyNkZWZpbmUgVkJIX0JVRl9TSVpFXzRLICgoKCgyICogMTYgKiAyMzA0KSArIDB4ZmZmZikgJiAofjB4ZmZmZikpKSAqIFZCSF9CVUZfQ09VTlQpCisvLyNkZWZpbmUgVkJIX0JVRl9TSVpFXzhLICgoKCgyICogMTYgKiA0NjA4KSArIDB4ZmZmZikgJiAofjB4ZmZmZikpKSAqIFZCSF9CVUZfQ09VTlQpCisKKwkvKm1tdV92YmggYnVmIGlzIHVzZWQgYnkgSEVWQ19TQU9fTU1VX1ZIMF9BRERSLCBIRVZDX1NBT19NTVVfVkgxX0FERFIqLworI2RlZmluZSBWQkhfQlVGX1NJWkVfMTA4MFAgMHgzMDAwCisjZGVmaW5lIFZCSF9CVUZfU0laRV80SyAweDUwMDAKKyNkZWZpbmUgVkJIX0JVRl9TSVpFXzhLIDB4YTAwMAorI2RlZmluZSBWQkhfQlVGX1NJWkUoYnVmc3BlYykgKGJ1ZnNwZWMtPm1tdV92YmguYnVmX3NpemUgLyAyKQorCS8qbW11X3ZiaF9kdyBidWYgaXMgdXNlZCBieSBIRVZDX1NBT19NTVVfVkgwX0FERFIyLEhFVkNfU0FPX01NVV9WSDFfQUREUjIsCisJCUhFVkNfRFdfVkgwX0FERERSLCBIRVZDX0RXX1ZIMV9BREREUiovCisjZGVmaW5lIERXX1ZCSF9CVUZfU0laRV8xMDgwUCAoVkJIX0JVRl9TSVpFXzEwODBQICogMikKKyNkZWZpbmUgRFdfVkJIX0JVRl9TSVpFXzRLIChWQkhfQlVGX1NJWkVfNEsgKiAyKQorI2RlZmluZSBEV19WQkhfQlVGX1NJWkVfOEsgKFZCSF9CVUZfU0laRV84SyAqIDIpCisjZGVmaW5lIERXX1ZCSF9CVUZfU0laRShidWZzcGVjKSAoYnVmc3BlYy0+bW11X3ZiaF9kdy5idWZfc2l6ZSAvIDQpCisKKy8qIG5lY2Vzc2FyeSA0SyBwYWdlIHNpemUgYWxpZ24gZm9yIHQ3L3QzIGRlY29kZXIgYW5kIGFmdGVyLiBmaXggY2FzZTE0NDAgZGVjIHRpbWVvdXQgKi8KKyNkZWZpbmUgV09SS0JVRl9BTElHTihhZGRyKSAoQUxJR04oYWRkciwgUEFHRV9TSVpFKSkKKworI2RlZmluZSBXT1JLX0JVRl9TUEVDX05VTSAzCisKK3N0YXRpYyBzdHJ1Y3QgQnVmZkluZm9fcyBhb21fd29ya2J1ZmZfc3BlY1tXT1JLX0JVRl9TUEVDX05VTV0gPSB7CisJeyAvLzhNIGJ5dGVzCisJCS5tYXhfd2lkdGggPSAxOTIwLAorCQkubWF4X2hlaWdodCA9IDEwODgsCisJCS5pcHAgPSB7CisJCQkvLyBJUFAgd29yayBzcGFjZSBjYWxjdWxhdGlvbiA6IDQwOTYgKiAoWStDYkNyK0ZsYWdzKSA9IDEyaywgcm91bmQgdG8gMTZrCisJCQkuYnVmX3NpemUgPSAweDFFMDAsCisJCX0sCisJCS5zYW9fYWJ2ID0geworCQkJLmJ1Zl9zaXplID0gMHgwLCAvLzB4MzAwMDAsCisJCX0sCisJCS5zYW9fdmIgPSB7CisJCQkuYnVmX3NpemUgPSAweDAsIC8vMHgzMDAwMCwKKwkJfSwKKwkJLnNob3J0X3Rlcm1fcnBzID0geworCQkJLy8gU0hPUlRfVEVSTV9SUFMgLSBNYXggNjQgc2V0LCAxNiBlbnRyeSBldmVyeSBzZXQsIHRvdGFsIDY0eDE2eDIgPSAyMDQ4IGJ5dGVzICgweDgwMCkKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkudnBzID0geworCQkJLy8gVlBTIFNUT1JFIEFSRUEgLSBNYXggMTYgVlBTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLCB0b3RhbCAweDA4MDAgYnl0ZXMKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc2VnX21hcCA9IHsKKwkJCS8vIFNFR01FTlQgTUFQIEFSRUEgLSAxOTIweDEwODgvNC80ICogMyBiaXRzID0gMHhCRjQwIEJ5dGVzICogMTYgPSAweEJGNDAwCisJCQkuYnVmX3NpemUgPSAweEJGNDAwLAorCQl9LAorCQkuZGFhbGFfdG9wID0geworCQkJLy8gREFBTEEgVE9QIFNUT1JFIEFSRUEgLSAyMjQgQnl0ZXMgKHVzZSAyNTYgQnl0ZXMgZm9yIExQRERSNCkgcGVyIDEyOC4gVG90YWwgNDA5Ni8xMjgqMjU2ID0gMHgyMDAwCisJCQkuYnVmX3NpemUgPSAweGYwMCwKKwkJfSwKKwkJLnNhb191cCA9IHsKKwkJCS8vIFNBTyBVUCBTVE9SRSBBUkVBIC0gTWF4IDY0MCgxMDI0MC8xNikgTENVLCBlYWNoIGhhcyAxNiBieXRlcyB0b3RhbCAweDI4MDAgYnl0ZXMKKwkJCS5idWZfc2l6ZSA9IDB4MCwgLy8weDI4MDAsCisJCX0sCisJCS5zd2FwX2J1ZiA9IHsKKwkJCS8vIDI1NmN5Y2xleDY0Yml0ID0gMksgYnl0ZXMgMHg4MDAgKG9ubHkgMTQ0IGN5Y2xlcyB2YWxpZCkKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuY2RmX2J1ZiA9IHsKKwkJCS8vIGZvciBjb250ZXh0IHN0b3JlL2xvYWQgMTAyNHgyNTYgeDE2ID0gNTEySyBieXRlcyAxNioweDgwMDAKKwkJCS5idWZfc2l6ZSA9IDB4ODAwMDAsCisJCX0sCisJCS5nbWNfYnVmID0geworCQkJLy8gZm9yIGdtY19wYXJhbWV0ZXIgc3RvcmUvbG9hZCAxMjggeCAxNiA9IDJLIGJ5dGVzIDB4ODAwCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNjYWxlbHV0ID0geworCQkJLy8gc3VwcG9ydCB1cCB0byAzMiBTQ0FMRUxVVCAxMDI0eDMyID0gMzJLYnl0ZXMgKDB4ODAwMCkKKwkJCS5idWZfc2l6ZSA9IDB4MCwgLy8weDgwMDAsCisJCX0sCisJCS5kYmxrX3BhcmEgPSB7CisJCQkvLyBEQkxLIC0+IE1heCAyNTYoNDA5Ni8xNikgTENVLCBlYWNoIHBhcmEgMTAyNGJ5dGVzKHRvdGFsOjB4NDAwMDApLCBkYXRhIDEwMjRieXRlcyh0b3RhbDoweDQwMDAwKQorCQkJLmJ1Zl9zaXplID0gMHhkMDAsIC8qMHhjNDAqLworCQl9LAorCQkuZGJsa19kYXRhID0geworCQkJLmJ1Zl9zaXplID0gMHg0OTAwMCwKKwkJfSwKKwkJLmNkZWZfZGF0YSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MjI0MDAsCisJCX0sCisJCS51cHNfZGF0YSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MzYwMDAsCisJCX0sCisJCS5mZ3NfdGFibGUgPSB7CisJCQkuYnVmX3NpemUgPSBGR1NfVEFCTEVfU0laRSAqIEZSQU1FX0JVRkZFUlMsIC8vIDUxMngxMjhiaXRzCisJCX0sCisjaWZkZWYgQU9NX0FWMV9NTVUKKwkJLm1tdV92YmggPSB7CisJCQkuYnVmX3NpemUgPSBWQkhfQlVGX1NJWkVfMTA4MFAsIC8vMioxNioobW9yZSB0aGFuIDIzMDQpLzQsIDRLCisJCX0sCisJCS5jbV9oZWFkZXIgPSB7CisJI2lmZGVmIFVTRV9TUEVDX0JVRl9GT1JfTU1VX0hFQUQKKwkJCS5idWZfc2l6ZSA9IE1NVV9DT01QUkVTU19IRUFERVJfU0laRV8xMDgwUCAqIEZSQU1FX0JVRkZFUlMsIC8vIDB4NDQwMDAgPSAoKDEwODgqMioxMDI0KjQpLzMyLzQpKigzMi84KQorCSNlbHNlCisJCQkuYnVmX3NpemUgPSAwLAorCSNlbmRpZgorCQl9LAorI2VuZGlmCisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKwkJLm1tdV92YmhfZHcgPSB7CisJCQkuYnVmX3NpemUgPSBEV19WQkhfQlVGX1NJWkVfMTA4MFAsIC8vMioxNioobW9yZSB0aGFuIDIzMDQpLzQsIDRLCisJCX0sCisJCS5jbV9oZWFkZXJfZHcgPSB7CisJI2lmZGVmIFVTRV9TUEVDX0JVRl9GT1JfTU1VX0hFQUQKKwkJCS5idWZfc2l6ZSA9IE1NVV9DT01QUkVTU19IRUFERVJfU0laRV8xMDgwUCpGUkFNRV9CVUZGRVJTLCAvLyAweDQ0MDAwID0gKCgxMDg4KjIqMTAyNCo0KS8zMi80KSooMzIvOCkKKwkjZWxzZQorCQkJLmJ1Zl9zaXplID0gMCwKKwkjZW5kaWYKKwkJfSwKKyNlbmRpZgorCQkubXByZWRfYWJvdmUgPSB7CisJCQkuYnVmX3NpemUgPSAweDI4MDAsIC8qcm91bmQgZnJvbSAweDI3NjAqLyAvKiAyICogc2l6ZSBvZiBodyovCisJCX0sCisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCQkubXByZWRfbXYgPSB7CisJCSAgIC5idWZfc2l6ZSA9IE1BWF9PTkVfTVZfQlVGRkVSX1NJWkVfMTA4MFBfVE0yUkVWQiAqIEZSQU1FX0JVRkZFUlMsLypyb3VuZCBmcm9tIDIwM0EwKi8gLy8xMDgwcCwgMHg0MDAwMCBwZXIgYnVmZmVyCisJCX0sCisjZW5kaWYKKwkJLnJwbSA9IHsKKwkJICAgLmJ1Zl9zaXplID0gMHg4MCoyLAorCQl9LAorCQkubG1lbSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4NDAwICogMiwKKwkJfQorCX0sCisJeworI2lmZGVmIFZQVV9GSUxNR1JBSU5fRFVNUAorCQkubWF4X3dpZHRoID0gNjQwLAorCQkubWF4X2hlaWdodCA9IDQ4MCwKKyNlbHNlCisJCS5tYXhfd2lkdGggPSA0MDk2LAorCQkubWF4X2hlaWdodCA9IDIzMDQsCisjZW5kaWYKKwkJLmlwcCA9IHsKKwkJCS8vIElQUCB3b3JrIHNwYWNlIGNhbGN1bGF0aW9uIDogNDA5NiAqIChZK0NiQ3IrRmxhZ3MpID0gMTJrLCByb3VuZCB0byAxNmsKKwkJCS5idWZfc2l6ZSA9IDB4NDAwMCwKKwkJfSwKKwkJLnNhb19hYnYgPSB7CisJCQkuYnVmX3NpemUgPSAweDAsIC8vMHgzMDAwMCwKKwkJfSwKKwkJLnNhb192YiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MCwgLy8weDMwMDAwLAorCQl9LAorCQkuc2hvcnRfdGVybV9ycHMgPSB7CisJCQkvLyBTSE9SVF9URVJNX1JQUyAtIE1heCA2NCBzZXQsIDE2IGVudHJ5IGV2ZXJ5IHNldCwgdG90YWwgNjR4MTZ4MiA9IDIwNDggYnl0ZXMgKDB4ODAwKQorCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS52cHMgPSB7CisJCQkvLyBWUFMgU1RPUkUgQVJFQSAtIE1heCAxNiBWUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsIHRvdGFsIDB4MDgwMCBieXRlcworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zZWdfbWFwID0geworCQkJLy8gU0VHTUVOVCBNQVAgQVJFQSAtIDQwOTZ4MjMwNC80LzQgKiAzIGJpdHMgPSAweDM2MDAwIEJ5dGVzICogMTYgPSAweDM2MDAwMAorCQkJLmJ1Zl9zaXplID0gMHgzNjAwMDAsCisJCX0sCisJCS5kYWFsYV90b3AgPSB7CisJCQkvLyBEQUFMQSBUT1AgU1RPUkUgQVJFQSAtIDIyNCBCeXRlcyAodXNlIDI1NiBCeXRlcyBmb3IgTFBERFI0KSBwZXIgMTI4LiBUb3RhbCA0MDk2LzEyOCoyNTYgPSAweDIwMDAKKwkJCS5idWZfc2l6ZSA9IDB4MjAwMCwKKwkJfSwKKwkJLnNhb191cCA9IHsKKwkJCS8vIFNBTyBVUCBTVE9SRSBBUkVBIC0gTWF4IDY0MCgxMDI0MC8xNikgTENVLCBlYWNoIGhhcyAxNiBieXRlcyB0b3RhbCAweDI4MDAgYnl0ZXMKKwkJCS5idWZfc2l6ZSA9IDB4MCwgLy8weDI4MDAsCisJCX0sCisJCS5zd2FwX2J1ZiA9IHsKKwkJCS8vIDI1NmN5Y2xleDY0Yml0ID0gMksgYnl0ZXMgMHg4MDAgKG9ubHkgMTQ0IGN5Y2xlcyB2YWxpZCkKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuY2RmX2J1ZiA9IHsKKwkJLy8gZm9yIGNvbnRleHQgc3RvcmUvbG9hZCAxMDI0eDI1NiB4MTYgPSA1MTJLIGJ5dGVzIDE2KjB4ODAwMAorCQkJLmJ1Zl9zaXplID0gMHg4MDAwMCwKKwkJfSwKKwkJLmdtY19idWYgPSB7CisJCS8vIGZvciBnbWNfcGFyYW1ldGVyIHN0b3JlL2xvYWQgMTI4IHggMTYgPSAySyBieXRlcyAweDgwMAorCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zY2FsZWx1dCA9IHsKKwkJCS8vIHN1cHBvcnQgdXAgdG8gMzIgU0NBTEVMVVQgMTAyNHgzMiA9IDMyS2J5dGVzICgweDgwMDApCisJCQkuYnVmX3NpemUgPSAweDAsIC8vMHg4MDAwLAorCQl9LAorCQkuZGJsa19wYXJhID0geworCQkJLy8gREJMSyAtPiBNYXggMjU2KDQwOTYvMTYpIExDVSwgZWFjaCBwYXJhIDEwMjRieXRlcyh0b3RhbDoweDQwMDAwKSwgZGF0YSAxMDI0Ynl0ZXModG90YWw6MHg0MDAwMCkKKwkJCS5idWZfc2l6ZSA9IDB4MWEwMCwgLyoweDE5ODAqLworCQl9LAorCQkuZGJsa19kYXRhID0geworCQkJLmJ1Zl9zaXplID0gMHg1MjgwMCwKKwkJfSwKKwkJLmNkZWZfZGF0YSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MjRhMDAsCisJCX0sCisJCS51cHNfZGF0YSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4NmYwMDAsCisJCX0sCisJCS5mZ3NfdGFibGUgPSB7CisJCQkuYnVmX3NpemUgPSBGR1NfVEFCTEVfU0laRSAqIEZSQU1FX0JVRkZFUlMsIC8vIDUxMngxMjhiaXRzCisJCX0sCisjaWZkZWYgQU9NX0FWMV9NTVUKKwkJLm1tdV92YmggPSB7CisJCQkuYnVmX3NpemUgPSBWQkhfQlVGX1NJWkVfNEssIC8vMioxNioobW9yZSB0aGFuIDIzMDQpLzQsIDRLCisJCX0sCisJCS5jbV9oZWFkZXIgPSB7CisJI2lmZGVmIFVTRV9TUEVDX0JVRl9GT1JfTU1VX0hFQUQKKwkJCS5idWZfc2l6ZSA9IE1NVV9DT01QUkVTU19IRUFERVJfU0laRV80SypGUkFNRV9CVUZGRVJTLCAvLyAweDQ0MDAwID0gKCgxMDg4KjIqMTAyNCo0KS8zMi80KSooMzIvOCkKKwkjZWxzZQorCQkJLmJ1Zl9zaXplID0gMCwKKwkjZW5kaWYKKwkJfSwKKyNlbmRpZgorI2lmZGVmIEFPTV9BVjFfTU1VX0RXCisJCS5tbXVfdmJoX2R3ID0geworCQkJLmJ1Zl9zaXplID0gRFdfVkJIX0JVRl9TSVpFXzRLLCAvLzIqMTYqKG1vcmUgdGhhbiAyMzA0KS80LCA0SworCQl9LAorCQkuY21faGVhZGVyX2R3ID0geworCSNpZmRlZiBVU0VfU1BFQ19CVUZfRk9SX01NVV9IRUFECisJCQkuYnVmX3NpemUgPSBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfNEsqRlJBTUVfQlVGRkVSUywgLy8gMHg0NDAwMCA9ICgoMTA4OCoyKjEwMjQqNCkvMzIvNCkqKDMyLzgpCisJI2Vsc2UKKwkJCS5idWZfc2l6ZSA9IDAsCisJI2VuZGlmCisJCX0sCisjZW5kaWYKKwkJLm1wcmVkX2Fib3ZlID0geworCQkJLmJ1Zl9zaXplID0gMHg1NDAwLCAvKiAyICogc2l6ZSBvZiBodyovCisJCX0sCisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCQkubXByZWRfbXYgPSB7CisJCSAgLyogLmJ1Zl9zaXplID0gMHgxMDAwMDAqMTYsCisJCSAgLy80azJrICwgMHgxMDAwMDAgcGVyIGJ1ZmZlciAqLworCQkgIC8qIDQwOTZ4MjMwNCAsIDB4MTIwMDAwIHBlciBidWZmZXIgKi8KKwkJICAuYnVmX3NpemUgPSBNQVhfT05FX01WX0JVRkZFUl9TSVpFXzRLX1RNMlJFVkIgKiBGUkFNRV9CVUZGRVJTLAorCQl9LAorI2VuZGlmCisJCS5ycG0gPSB7CisJCSAgIC5idWZfc2l6ZSA9IDB4ODAqMiwKKwkJfSwKKwkJLmxtZW0gPSB7CisJCQkuYnVmX3NpemUgPSAweDQwMCAqIDIsCisJCX0KKworCX0sCisJeworCQkubWF4X3dpZHRoID0gODE5MiwKKwkJLm1heF9oZWlnaHQgPSA0NjA4LAorCQkuaXBwID0geworCQkJLy8gSVBQIHdvcmsgc3BhY2UgY2FsY3VsYXRpb24gOiA0MDk2ICogKFkrQ2JDcitGbGFncykgPSAxMmssIHJvdW5kIHRvIDE2aworCQkJLmJ1Zl9zaXplID0gMHg0MDAwLAorCQl9LAorCQkuc2FvX2FidiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MCwgLy8weDMwMDAwLAorCQl9LAorCQkuc2FvX3ZiID0geworCQkJLmJ1Zl9zaXplID0gMHgwLCAvLzB4MzAwMDAsCisJCX0sCisJCS5zaG9ydF90ZXJtX3JwcyA9IHsKKwkJCS8vIFNIT1JUX1RFUk1fUlBTIC0gTWF4IDY0IHNldCwgMTYgZW50cnkgZXZlcnkgc2V0LCB0b3RhbCA2NHgxNngyID0gMjA0OCBieXRlcyAoMHg4MDApCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnZwcyA9IHsKKwkJCS8vIFZQUyBTVE9SRSBBUkVBIC0gTWF4IDE2IFZQUywgZWFjaCBoYXMgMHg4MCBieXRlcywgdG90YWwgMHgwODAwIGJ5dGVzCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNlZ19tYXAgPSB7CisJCQkvLyBTRUdNRU5UIE1BUCBBUkVBIC0gNDA5NngyMzA0LzQvNCAqIDMgYml0cyA9IDB4MzYwMDAgQnl0ZXMgKiAxNiA9IDB4MzYwMDAwCisJCQkuYnVmX3NpemUgPSAweGQ4MDAwMCwKKwkJfSwKKwkJLmRhYWxhX3RvcCA9IHsKKwkJCS8vIERBQUxBIFRPUCBTVE9SRSBBUkVBIC0gMjI0IEJ5dGVzICh1c2UgMjU2IEJ5dGVzIGZvciBMUEREUjQpIHBlciAxMjguIFRvdGFsIDQwOTYvMTI4KjI1NiA9IDB4MjAwMAorCQkJLmJ1Zl9zaXplID0gMHgyMDAwLAorCQl9LAorCQkuc2FvX3VwID0geworCQkJLy8gU0FPIFVQIFNUT1JFIEFSRUEgLSBNYXggNjQwKDEwMjQwLzE2KSBMQ1UsIGVhY2ggaGFzIDE2IGJ5dGVzIHRvdGFsIDB4MjgwMCBieXRlcworCQkJLmJ1Zl9zaXplID0gMHgwLCAvLzB4MjgwMCwKKwkJfSwKKwkJLnN3YXBfYnVmID0geworCQkJLy8gMjU2Y3ljbGV4NjRiaXQgPSAySyBieXRlcyAweDgwMCAob25seSAxNDQgY3ljbGVzIHZhbGlkKQorCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5jZGZfYnVmID0geworCQkvLyBmb3IgY29udGV4dCBzdG9yZS9sb2FkIDEwMjR4MjU2IHgxNiA9IDUxMksgYnl0ZXMgMTYqMHg4MDAwCisJCQkuYnVmX3NpemUgPSAweDgwMDAwLAorCQl9LAorCQkuZ21jX2J1ZiA9IHsKKwkJLy8gZm9yIGdtY19wYXJhbWV0ZXIgc3RvcmUvbG9hZCAxMjggeCAxNiA9IDJLIGJ5dGVzIDB4ODAwCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNjYWxlbHV0ID0geworCQkJLy8gc3VwcG9ydCB1cCB0byAzMiBTQ0FMRUxVVCAxMDI0eDMyID0gMzJLYnl0ZXMgKDB4ODAwMCkKKwkJCS5idWZfc2l6ZSA9IDB4MCwgLy8weDgwMDAsCisJCX0sCisJCS5kYmxrX3BhcmEgPSB7CisJCQkvLyBEQkxLIC0+IE1heCAyNTYoNDA5Ni8xNikgTENVLCBlYWNoIHBhcmEgMTAyNGJ5dGVzKHRvdGFsOjB4NDAwMDApLCBkYXRhIDEwMjRieXRlcyh0b3RhbDoweDQwMDAwKQorCQkJLmJ1Zl9zaXplID0gMHgzMzAwLCAvKjB4MzJhMCovCisJCX0sCisJCS5kYmxrX2RhdGEgPSB7CisJCQkuYnVmX3NpemUgPSAweGE0ODAwLAorCQl9LAorCQkuY2RlZl9kYXRhID0geworCQkJLmJ1Zl9zaXplID0gMHgyOTIwMCwKKwkJfSwKKwkJLnVwc19kYXRhID0geworCQkJLmJ1Zl9zaXplID0gMHhkYjAwMCwKKwkJfSwKKwkJLmZnc190YWJsZSA9IHsKKwkJCS5idWZfc2l6ZSA9IEZHU19UQUJMRV9TSVpFICogRlJBTUVfQlVGRkVSUywgLy8gNTEyeDEyOGJpdHMKKwkJfSwKKyNpZmRlZiBBT01fQVYxX01NVQorCQkubW11X3ZiaCA9IHsKKwkJCS5idWZfc2l6ZSA9IFZCSF9CVUZfU0laRV84SywgLy8yKjE2Kihtb3JlIHRoYW4gMjMwNCkvNCwgNEsKKwkJfSwKKwkJLmNtX2hlYWRlciA9IHsKKwkjaWZkZWYgVVNFX1NQRUNfQlVGX0ZPUl9NTVVfSEVBRAorCQkJLmJ1Zl9zaXplID0gTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFXzhLKkZSQU1FX0JVRkZFUlMsIC8vIDB4NDQwMDAgPSAoKDEwODgqMioxMDI0KjQpLzMyLzQpKigzMi84KQorI2Vsc2UKKwkJCS5idWZfc2l6ZSA9IDAsCisjZW5kaWYKKwkJfSwKKyNlbmRpZgorI2lmZGVmIEFPTV9BVjFfTU1VX0RXCisJCS5tbXVfdmJoX2R3ID0geworCQkJLmJ1Zl9zaXplID0gRFdfVkJIX0JVRl9TSVpFXzhLLCAvLzIqMTYqKG1vcmUgdGhhbiAyMzA0KS80LCA0SworCQl9LAorCQkuY21faGVhZGVyX2R3ID0geworCSNpZmRlZiBVU0VfU1BFQ19CVUZfRk9SX01NVV9IRUFECisJCQkuYnVmX3NpemUgPSBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfOEsqRlJBTUVfQlVGRkVSUywgLy8gMHg0NDAwMCA9ICgoMTA4OCoyKjEwMjQqNCkvMzIvNCkqKDMyLzgpCisJI2Vsc2UKKwkJCS5idWZfc2l6ZSA9IDAsCisJI2VuZGlmCisJCX0sCisjZW5kaWYKKwkJLm1wcmVkX2Fib3ZlID0geworCQkJLmJ1Zl9zaXplID0gMHhBODAwLCAvKiAyICogc2l6ZSBvZiBodyovCisJCX0sCisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCQkubXByZWRfbXYgPSB7CisJCSAgLyogLmJ1Zl9zaXplID0gMHgxMDAwMDAqMTYsCisJCSAgLy80azJrICwgMHgxMDAwMDAgcGVyIGJ1ZmZlciAqLworCQkgIC8qIDQwOTZ4MjMwNCAsIDB4MTIwMDAwIHBlciBidWZmZXIgKi8KKwkJICAuYnVmX3NpemUgPSBNQVhfT05FX01WX0JVRkZFUl9TSVpFXzhLX1RNMlJFVkIgKiBGUkFNRV9CVUZGRVJTLAorCQl9LAorI2VuZGlmCisJCS5ycG0gPSB7CisJCSAgIC5idWZfc2l6ZSA9IDB4ODAqMiwKKwkJfSwKKwkJLmxtZW0gPSB7CisJCQkuYnVmX3NpemUgPSAweDQwMCAqIDIsCisJCX0KKworCX0KK307CisKKworLyoKKyogQVVYIERBVEEgUHJvY2VzcworKi8KK3N0YXRpYyB1MzIgaW5pdF9hdXhfc2l6ZTsKK3N0YXRpYyBpbnQgYXV4X2RhdGFfaXNfYXZhaWJsZShzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJdTMyIHJlZ192YWw7CisKKwlyZWdfdmFsID0gUkVBRF9WUkVHKEhFVkNfQVVYX0RBVEFfU0laRSk7CisJaWYgKHJlZ192YWwgIT0gMCAmJiByZWdfdmFsICE9IGluaXRfYXV4X3NpemUpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19hdXhfYnVmKHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlXUklURV9WUkVHKEhFVkNfQVVYX0FEUiwgaHctPmF1eF9waHlfYWRkcik7CisJaW5pdF9hdXhfc2l6ZSA9ICgoaHctPnByZWZpeF9hdXhfc2l6ZSA+PiA0KSA8PCAxNikgfAorCQkoaHctPnN1ZmZpeF9hdXhfc2l6ZSA+PiA0KTsKKwlXUklURV9WUkVHKEhFVkNfQVVYX0RBVEFfU0laRSwgaW5pdF9hdXhfc2l6ZSk7Cit9CisKKy8qCisqIGR2X21ldGFfZmxhZzogMSwgZG9sYnkgbWV0YSAoVDM1KSBvbmx5OyAyLCBub3QgaW5jbHVkZSBkb2xieSBtZXRhIChUMzUpCisqLworc3RhdGljIHZvaWQgc2V0X2F1eF9kYXRhKHN0cnVjdCBBVjFIV19zICpodywKKwkgICAgY2hhciAqKmF1eF9kYXRhX2J1ZiwgaW50ICphdXhfZGF0YV9zaXplLAorCXVuc2lnbmVkIGNoYXIgc3VmZml4X2ZsYWcsCisJdW5zaWduZWQgY2hhciBkdl9tZXRhX2ZsYWcpCit7CisJaW50IGk7CisJdW5zaWduZWQgc2hvcnQgKmF1eF9hZHI7CisJdW5zaWduZWQgaW50IHNpemVfcmVnX3ZhbCA9CisJCVJFQURfVlJFRyhIRVZDX0FVWF9EQVRBX1NJWkUpOworCXVuc2lnbmVkIGludCBhdXhfY291bnQgPSAwOworCWludCBhdXhfc2l6ZSA9IDA7CisJaWYgKDAgPT0gYXV4X2RhdGFfaXNfYXZhaWJsZShodykpCisJCXJldHVybjsKKworCWlmIChody0+YXV4X2RhdGFfZGlydHkgfHwKKwkJaHctPm1faW5zX2ZsYWcgPT0gMCkgeworCisJCWh3LT5hdXhfZGF0YV9kaXJ0eSA9IDA7CisJfQorCisJaWYgKHN1ZmZpeF9mbGFnKSB7CisJCWF1eF9hZHIgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCShody0+YXV4X2FkZHIgKworCQkJaHctPnByZWZpeF9hdXhfc2l6ZSk7CisJCWF1eF9jb3VudCA9CisJCSgoc2l6ZV9yZWdfdmFsICYgMHhmZmZmKSA8PCA0KQorCQkJPj4gMTsKKwkJYXV4X3NpemUgPQorCQkJaHctPnN1ZmZpeF9hdXhfc2l6ZTsKKwl9IGVsc2UgeworCQlhdXhfYWRyID0KKwkJKHVuc2lnbmVkIHNob3J0ICopaHctPmF1eF9hZGRyOworCQlhdXhfY291bnQgPQorCQkoKHNpemVfcmVnX3ZhbCA+PiAxNikgPDwgNCkKKwkJCT4+IDE7CisJCWF1eF9zaXplID0KKwkJCWh3LT5wcmVmaXhfYXV4X3NpemU7CisJfQorCWlmIChkZWJ1ZyAmIEFWMV9ERUJVR19CVUZNR1JfTU9SRSkgeworCQlhdjFfcHJpbnQoaHcsIDAsCisJCQkiJXM6b2xkIHNpemUgJWQgY291bnQgJWQsc3VmICVkIGR2X2ZsYWcgJWRcclxuIiwKKwkJCV9fZnVuY19fLCAqYXV4X2RhdGFfc2l6ZSwKKwkJCWF1eF9jb3VudCwgc3VmZml4X2ZsYWcsIGR2X21ldGFfZmxhZyk7CisJfQorCWlmIChhdXhfc2l6ZSA+IDAgJiYgYXV4X2NvdW50ID4gMCkgeworCQlpbnQgaGVhZHNfc2l6ZSA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IGF1eF9jb3VudDsgaSsrKSB7CisJCQl1bnNpZ25lZCBjaGFyIHRhZyA9IGF1eF9hZHJbaV0gPj4gODsKKwkJCWlmICh0YWcgIT0gMCAmJiB0YWcgIT0gMHhmZikgeworCQkJCWlmIChkdl9tZXRhX2ZsYWcgPT0gMCkKKwkJCQkJaGVhZHNfc2l6ZSArPSA4OworCQkJCWVsc2UgaWYgKGR2X21ldGFfZmxhZyA9PSAxICYmIHRhZyA9PSAweDE0KQorCQkJCQloZWFkc19zaXplICs9IDg7CisJCQkJZWxzZSBpZiAoZHZfbWV0YV9mbGFnID09IDIgJiYgdGFnICE9IDB4MTQpCisJCQkJCWhlYWRzX3NpemUgKz0gODsKKwkJCX0KKwkJfQorCisJCWlmICgqYXV4X2RhdGFfYnVmKSB7CisJCQl1bnNpZ25lZCBjaGFyIHZhbGlkX3RhZyA9IDA7CisJCQl1bnNpZ25lZCBjaGFyICpoID0KKwkJCQkqYXV4X2RhdGFfYnVmICsKKwkJCQkqYXV4X2RhdGFfc2l6ZTsKKwkJCXVuc2lnbmVkIGNoYXIgKnAgPSBoICsgODsKKwkJCWludCBsZW4gPSAwOworCQkJaW50IHBhZGRpbmdfbGVuID0gMDsKKworCQkJZm9yIChpID0gMDsgaSA8IGF1eF9jb3VudDsgaSArPSA0KSB7CisJCQkJaW50IGlpOworCQkJCXVuc2lnbmVkIGNoYXIgdGFnID0gYXV4X2FkcltpICsgM10gPj4gODsKKwkJCQlpZiAodGFnICE9IDAgJiYgdGFnICE9IDB4ZmYpIHsKKwkJCQkJaWYgKGR2X21ldGFfZmxhZyA9PSAwKQorCQkJCQkJdmFsaWRfdGFnID0gMTsKKwkJCQkJZWxzZSBpZiAoZHZfbWV0YV9mbGFnID09IDEKKwkJCQkJCSYmIHRhZyA9PSAweDE0KQorCQkJCQkJdmFsaWRfdGFnID0gMTsKKwkJCQkJZWxzZSBpZiAoZHZfbWV0YV9mbGFnID09IDIKKwkJCQkJCSYmIHRhZyAhPSAweDE0KQorCQkJCQkJdmFsaWRfdGFnID0gMTsKKwkJCQkJZWxzZQorCQkJCQkJdmFsaWRfdGFnID0gMDsKKwkJCQkJaWYgKHZhbGlkX3RhZyAmJiBsZW4gPiAwKSB7CisJCQkJCQkqYXV4X2RhdGFfc2l6ZSArPQorCQkJCQkJKGxlbiArIDgpOworCQkJCQkJaFswXSA9IChsZW4gPj4gMjQpCisJCQkJCQkmIDB4ZmY7CisJCQkJCQloWzFdID0gKGxlbiA+PiAxNikKKwkJCQkJCSYgMHhmZjsKKwkJCQkJCWhbMl0gPSAobGVuID4+IDgpCisJCQkJCQkmIDB4ZmY7CisJCQkJCQloWzNdID0gKGxlbiA+PiAwKQorCQkJCQkJJiAweGZmOworCQkJCQkJaFs2XSA9CisJCQkJCQkocGFkZGluZ19sZW4gPj4gOCkKKwkJCQkJCSYgMHhmZjsKKwkJCQkJCWhbN10gPSAocGFkZGluZ19sZW4pCisJCQkJCQkmIDB4ZmY7CisJCQkJCQloICs9IChsZW4gKyA4KTsKKwkJCQkJCXAgKz0gODsKKwkJCQkJCWxlbiA9IDA7CisJCQkJCQlwYWRkaW5nX2xlbiA9IDA7CisJCQkJCX0KKwkJCQkJaWYgKHZhbGlkX3RhZykgeworCQkJCQkJaFs0XSA9IHRhZzsKKwkJCQkJCWhbNV0gPSAwOworCQkJCQkJaFs2XSA9IDA7CisJCQkJCQloWzddID0gMDsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAodmFsaWRfdGFnKSB7CisJCQkJCWZvciAoaWkgPSAwOyBpaSA8IDQ7IGlpKyspIHsKKwkJCQkJCXVuc2lnbmVkIHNob3J0IGFhID0KKwkJCQkJCQlhdXhfYWRyW2kgKyAzCisJCQkJCQkJLSBpaV07CisJCQkJCQkqcCA9IGFhICYgMHhmZjsKKwkJCQkJCXArKzsKKwkJCQkJCWxlbisrOworCQkJCQkJaWYgKChhYSA+PiA4KSA9PSAweGZmKQorCQkJCQkJCXBhZGRpbmdfbGVuKys7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAobGVuID4gMCkgeworCQkJCSphdXhfZGF0YV9zaXplICs9IChsZW4gKyA4KTsKKwkJCQloWzBdID0gKGxlbiA+PiAyNCkgJiAweGZmOworCQkJCWhbMV0gPSAobGVuID4+IDE2KSAmIDB4ZmY7CisJCQkJaFsyXSA9IChsZW4gPj4gOCkgJiAweGZmOworCQkJCWhbM10gPSAobGVuID4+IDApICYgMHhmZjsKKwkJCQloWzZdID0gKHBhZGRpbmdfbGVuID4+IDgpICYgMHhmZjsKKwkJCQloWzddID0gKHBhZGRpbmdfbGVuKSAmIDB4ZmY7CisJCQl9CisJCQlpZiAoZGVidWcgJiBBVjFfREVCVUdfQlVGTUdSX01PUkUpIHsKKwkJCQlhdjFfcHJpbnQoaHcsIDAsCisJCQkJCSJhdXg6IChzaXplICVkKSBzdWZmaXhfZmxhZyAlZFxuIiwKKwkJCQkJKmF1eF9kYXRhX3NpemUsIHN1ZmZpeF9mbGFnKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgKmF1eF9kYXRhX3NpemU7IGkrKykgeworCQkJCQlhdjFfcHJpbnRfY29udChodywgMCwKKwkJCQkJCSIlMDJ4ICIsICgqYXV4X2RhdGFfYnVmKVtpXSk7CisJCQkJCWlmICgoKGkgKyAxKSAmIDB4ZikgPT0gMCkKKwkJCQkJCWF2MV9wcmludF9jb250KGh3LCAwLCAiXG4iKTsKKwkJCQl9CisJCQkJYXYxX3ByaW50X2NvbnQoaHcsIDAsICJcbiIpOworCQkJfQorCQl9CisJfQorCit9CisKK3N0YXRpYyB2b2lkIHNldF9kdl9kYXRhKHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlzZXRfYXV4X2RhdGEoaHcsICZody0+ZHZfZGF0YV9idWYsCisJCSZody0+ZHZfZGF0YV9zaXplLCAwLCAxKTsKKworfQorCitzdGF0aWMgdm9pZCBzZXRfcGljX2F1eF9kYXRhKHN0cnVjdCBBVjFIV19zICpodywKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljLCB1bnNpZ25lZCBjaGFyIHN1ZmZpeF9mbGFnLAorCXVuc2lnbmVkIGNoYXIgZHZfbWV0YV9mbGFnKQoreworCWlmIChwaWMgPT0gTlVMTCkKKwkJcmV0dXJuOworCXNldF9hdXhfZGF0YShodywgJnBpYy0+YXV4X2RhdGFfYnVmLAorCQkmcGljLT5hdXhfZGF0YV9zaXplLCBzdWZmaXhfZmxhZywgZHZfbWV0YV9mbGFnKTsKK30KKworc3RhdGljIHZvaWQgY29weV9kdl9kYXRhKHN0cnVjdCBBVjFIV19zICpodywKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljKQoreworCWlmIChwaWMtPmF1eF9kYXRhX2J1ZikgeworCQlpZiAoZGVidWcgJiBBVjFfREVCVUdfQlVGTUdSX01PUkUpIHsKKwkJCWF2MV9wcmludChodywgMCwKKwkJCQkiJXM6IChzaXplICVkKSBwaWMgaW5kZXggJWRcbiIsCisJCQkJX19mdW5jX18sCisJCQkJaHctPmR2X2RhdGFfc2l6ZSwgcGljLT5pbmRleCk7CisJCX0KKwkJbWVtY3B5KHBpYy0+YXV4X2RhdGFfYnVmICsgcGljLT5hdXhfZGF0YV9zaXplLCBody0+ZHZfZGF0YV9idWYsIGh3LT5kdl9kYXRhX3NpemUpOworCQlwaWMtPmF1eF9kYXRhX3NpemUgKz0gaHctPmR2X2RhdGFfc2l6ZTsKKwkJbWVtc2V0KGh3LT5kdl9kYXRhX2J1ZiwgMCwgaHctPmF1eF9kYXRhX3NpemUpOworCQlody0+ZHZfZGF0YV9zaXplID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfYXV4X2RhdGEoc3RydWN0IEFWMUhXX3MgKmh3LAorCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpwaWMpCit7CisjaWYgMAorCWlmIChwaWMtPmF1eF9kYXRhX2J1ZikKKwkJdmZyZWUocGljLT5hdXhfZGF0YV9idWYpOworCXBpYy0+YXV4X2RhdGFfYnVmID0gTlVMTDsKKwlwaWMtPmF1eF9kYXRhX3NpemUgPSAwOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGR1bXBfYXV4X2J1ZihzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJaW50IGk7CisJdW5zaWduZWQgc2hvcnQgKmF1eF9hZHIgPQorCQkodW5zaWduZWQgc2hvcnQgKikKKwkJaHctPmF1eF9hZGRyOworCXVuc2lnbmVkIGludCBhdXhfc2l6ZSA9CisJCShSRUFEX1ZSRUcoSEVWQ19BVVhfREFUQV9TSVpFKQorCQk+PiAxNikgPDwgNDsKKworCWlmIChody0+cHJlZml4X2F1eF9zaXplID4gMCkgeworCQlhdjFfcHJpbnQoaHcsIDAsCisJCQkicHJlZml4IGF1eDogKHNpemUgJWQpXG4iLAorCQkJYXV4X3NpemUpOworCQlmb3IgKGkgPSAwOyBpIDwKKwkJKGF1eF9zaXplID4+IDEpOyBpKyspIHsKKwkJCWF2MV9wcmludF9jb250KGh3LCAwLAorCQkJCSIlMDR4ICIsCisJCQkJKihhdXhfYWRyICsgaSkpOworCQkJaWYgKCgoaSArIDEpICYgMHhmKQorCQkJCT09IDApCisJCQkJYXYxX3ByaW50X2NvbnQoaHcsCisJCQkJMCwgIlxuIik7CisJCX0KKwl9CisJaWYgKGh3LT5zdWZmaXhfYXV4X3NpemUgPiAwKSB7CisJCWF1eF9hZHIgPSAodW5zaWduZWQgc2hvcnQgKikKKwkJCShody0+YXV4X2FkZHIgKworCQkJaHctPnByZWZpeF9hdXhfc2l6ZSk7CisJCWF1eF9zaXplID0KKwkJKFJFQURfVlJFRyhIRVZDX0FVWF9EQVRBX1NJWkUpICYgMHhmZmZmKQorCQkJPDwgNDsKKwkJYXYxX3ByaW50KGh3LCAwLAorCQkJInN1ZmZpeCBhdXg6IChzaXplICVkKVxuIiwKKwkJCWF1eF9zaXplKTsKKwkJZm9yIChpID0gMDsgaSA8CisJCShhdXhfc2l6ZSA+PiAxKTsgaSsrKSB7CisJCQlhdjFfcHJpbnRfY29udChodywgMCwKKwkJCQkiJTA0eCAiLCAqKGF1eF9hZHIgKyBpKSk7CisJCQlpZiAoKChpICsgMSkgJiAweGYpID09IDApCisJCQkJYXYxX3ByaW50X2NvbnQoaHcsIDAsICJcbiIpOworCQl9CisJfQorfQorCisvKgorKgorKi8KKworLypMb3NsZXNzIGNvbXByZXNzaW9uIGJvZHkgYnVmZmVyIHNpemUgNEsgcGVyIDY0eDMyIChqdCkqLworc3RhdGljIGludCBjb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCQkJCXVpbnQ4X3QgaXNfYml0X2RlcHRoXzEwKQoreworCWludCAgICAgd2lkdGhfeDY0OworCWludCAgICAgaGVpZ2h0X3gzMjsKKwlpbnQgICAgIGJzaXplOworCisJd2lkdGhfeDY0ID0gd2lkdGggKyA2MzsKKwl3aWR0aF94NjQgPj49IDY7CisJaGVpZ2h0X3gzMiA9IGhlaWdodCArIDMxOworCWhlaWdodF94MzIgPj49IDU7CisJYnNpemUgPSAoaXNfYml0X2RlcHRoXzEwPzQwOTY6MzIwMCkqd2lkdGhfeDY0KmhlaWdodF94MzI7CisJaWYgKGRlYnVnICYgQVYxX0RFQlVHX0JVRk1HUl9NT1JFKQorCQlwcl9pbmZvKCIlcyglZCwlZCwlZCk9PiVkXG4iLAorCQkJX19mdW5jX18sIHdpZHRoLCBoZWlnaHQsCisJCQlpc19iaXRfZGVwdGhfMTAsIGJzaXplKTsKKworCXJldHVybiAgYnNpemU7Cit9CisKKy8qIExvc2xlc3MgY29tcHJlc3Npb24gaGVhZGVyIGJ1ZmZlciBzaXplIDMyYnl0ZXMgcGVyIDEyOHg2NCAoanQpKi8KK3N0YXRpYyAgaW50ICBjb21wdXRlX2xvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisJaW50ICAgICB3aWR0aF94MTI4OworCWludCAgICAgaGVpZ2h0X3g2NDsKKwlpbnQgICAgIGhzaXplOworCisJd2lkdGhfeDEyOCA9IHdpZHRoICsgMTI3OworCXdpZHRoX3gxMjggPj49IDc7CisJaGVpZ2h0X3g2NCA9IGhlaWdodCArIDYzOworCWhlaWdodF94NjQgPj49IDY7CisKKwloc2l6ZSA9IDMyICogd2lkdGhfeDEyOCAqIGhlaWdodF94NjQ7CisJaWYgKGRlYnVnICYgQVYxX0RFQlVHX0JVRk1HUl9NT1JFKQorCQlwcl9pbmZvKCIlcyglZCwlZCk9PiVkXG4iLAorCQkJX19mdW5jX18sIHdpZHRoLCBoZWlnaHQsCisJCQloc2l6ZSk7CisKKwlyZXR1cm4gIGhzaXplOworfQorCisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKK3N0YXRpYyBpbnQgY29tcHV0ZV9sb3NsZXNzX2NvbXBfYm9keV9zaXplX2R3KGludCB3aWR0aCwgaW50IGhlaWdodCwKKwkJCQl1aW50OF90IGlzX2JpdF9kZXB0aF8xMCkKK3sKKworCXJldHVybiBjb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemUod2lkdGgsIGhlaWdodCwgaXNfYml0X2RlcHRoXzEwKTsKK30KKworLyogTG9zbGVzcyBjb21wcmVzc2lvbiBoZWFkZXIgYnVmZmVyIHNpemUgMzJieXRlcyBwZXIgMTI4eDY0IChqdCkqLworc3RhdGljIGludCBjb21wdXRlX2xvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZV9kdyhpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisJcmV0dXJuIGNvbXB1dGVfbG9zbGVzc19jb21wX2hlYWRlcl9zaXplKHdpZHRoLCBoZWlnaHQpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGluaXRfYnVmZl9zcGVjKHN0cnVjdCBBVjFIV19zICpodywKKwlzdHJ1Y3QgQnVmZkluZm9fcyAqYnVmX3NwZWMpCit7CisJdm9pZCAqbWVtX3N0YXJ0X3ZpcnQ7CisKKwlidWZfc3BlYy0+aXBwLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnN0YXJ0X2Fkcik7CisJYnVmX3NwZWMtPnNhb19hYnYuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+aXBwLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5pcHAuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5zYW9fdmIuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c2FvX2Fidi5idWZfc3RhcnQgKyBidWZfc3BlYy0+c2FvX2Fidi5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPnNob3J0X3Rlcm1fcnBzLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnNhb192Yi5idWZfc3RhcnQgKyBidWZfc3BlYy0+c2FvX3ZiLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+dnBzLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnNob3J0X3Rlcm1fcnBzLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5zaG9ydF90ZXJtX3Jwcy5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPnNlZ19tYXAuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+dnBzLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT52cHMuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5kYWFsYV90b3AuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c2VnX21hcC5idWZfc3RhcnQgKyBidWZfc3BlYy0+c2VnX21hcC5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPnNhb191cC5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5kYWFsYV90b3AuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPmRhYWxhX3RvcC5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPnN3YXBfYnVmLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnNhb191cC5idWZfc3RhcnQgKyBidWZfc3BlYy0+c2FvX3VwLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+Y2RmX2J1Zi5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5zd2FwX2J1Zi5idWZfc3RhcnQgKyBidWZfc3BlYy0+c3dhcF9idWYuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5nbWNfYnVmLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPmNkZl9idWYuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPmNkZl9idWYuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5zY2FsZWx1dC5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5nbWNfYnVmLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5nbWNfYnVmLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnNjYWxlbHV0LmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5zY2FsZWx1dC5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPmRibGtfZGF0YS5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5kYmxrX3BhcmEuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPmNkZWZfZGF0YS5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5kYmxrX2RhdGEuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPmRibGtfZGF0YS5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPnVwc19kYXRhLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPmNkZWZfZGF0YS5idWZfc3RhcnQgKyBidWZfc3BlYy0+Y2RlZl9kYXRhLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+ZmdzX3RhYmxlLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnVwc19kYXRhLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT51cHNfZGF0YS5idWZfc2l6ZSk7CisjaWZkZWYgQU9NX0FWMV9NTVUKKwlidWZfc3BlYy0+bW11X3ZiaC5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5mZ3NfdGFibGUuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPmZnc190YWJsZS5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPmNtX2hlYWRlci5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5tbXVfdmJoLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5tbXVfdmJoLmJ1Zl9zaXplKTsKKyNpZmRlZiBBT01fQVYxX01NVV9EVworCWJ1Zl9zcGVjLT5tbXVfdmJoX2R3LmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPmNtX2hlYWRlci5idWZfc3RhcnQgKyBidWZfc3BlYy0+Y21faGVhZGVyLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+Y21faGVhZGVyX2R3LmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPm1tdV92YmhfZHcuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPm1tdV92YmhfZHcuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5tcHJlZF9hYm92ZS5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5jbV9oZWFkZXJfZHcuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPmNtX2hlYWRlcl9kdy5idWZfc2l6ZSk7CisjZWxzZQorCWJ1Zl9zcGVjLT5tcHJlZF9hYm92ZS5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5jbV9oZWFkZXIuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPmNtX2hlYWRlci5idWZfc2l6ZSk7CisjZW5kaWYKKyNlbHNlCisJYnVmX3NwZWMtPm1wcmVkX2Fib3ZlLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPmZnc190YWJsZS5idWZfc3RhcnQgKyBidWZfc3BlYy0+ZmdzX3RhYmxlLmJ1Zl9zaXplKTsKKyNlbmRpZgorI2lmZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwlidWZfc3BlYy0+bXByZWRfbXYuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+bXByZWRfYWJvdmUuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPm1wcmVkX2Fib3ZlLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+cnBtLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPm1wcmVkX212LmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5tcHJlZF9tdi5idWZfc2l6ZSk7CisjZWxzZQorCWJ1Zl9zcGVjLT5ycG0uYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+bXByZWRfYWJvdmUuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPm1wcmVkX2Fib3ZlLmJ1Zl9zaXplKTsKKyNlbmRpZgorCWJ1Zl9zcGVjLT5sbWVtLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnJwbS5idWZfc3RhcnQgKyBidWZfc3BlYy0+cnBtLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+ZW5kX2FkciA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPmxtZW0uYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPmxtZW0uYnVmX3NpemUpOworCisJaWYgKCFodykKKwkJcmV0dXJuOworCisJaWYgKCF2ZGVjX3NlY3VyZShod190b192ZGVjKGh3KSkpIHsKKwkJbWVtX3N0YXJ0X3ZpcnQgPQorCQkJY29kZWNfbW1fcGh5c190b192aXJ0KGJ1Zl9zcGVjLT5kYmxrX3BhcmEuYnVmX3N0YXJ0KTsKKwkJaWYgKG1lbV9zdGFydF92aXJ0KSB7CisJCQltZW1zZXQobWVtX3N0YXJ0X3ZpcnQsIDAsCisJCQkJYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc2l6ZSk7CisJCQljb2RlY19tbV9kbWFfZmx1c2gobWVtX3N0YXJ0X3ZpcnQsCisJCQkJYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc2l6ZSwKKwkJCQlETUFfVE9fREVWSUNFKTsKKwkJfSBlbHNlIHsKKwkJCW1lbV9zdGFydF92aXJ0ID0gY29kZWNfbW1fdm1hcCgKKwkJCQlidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zdGFydCwKKwkJCQlidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zaXplKTsKKwkJCWlmIChtZW1fc3RhcnRfdmlydCkgeworCQkJCW1lbXNldChtZW1fc3RhcnRfdmlydCwgMCwKKwkJCQkJYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc2l6ZSk7CisJCQkJY29kZWNfbW1fZG1hX2ZsdXNoKG1lbV9zdGFydF92aXJ0LAorCQkJCQlidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zaXplLAorCQkJCQlETUFfVE9fREVWSUNFKTsKKwkJCQljb2RlY19tbV91bm1hcF9waHlhZGRyKG1lbV9zdGFydF92aXJ0KTsKKwkJCX0gZWxzZSB7CisJCQkJLypub3QgdmlydCBmb3IgdHZwIHBsYXlpbmcsCisJCQkJbWF5IG5lZWQgY2xlYXIgb24gdWNvZGUuKi8KKwkJCQlwcl9lcnIoIm1lbV9zdGFydF92aXJ0IGZhaWxlZFxuIik7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoZGVidWcpIHsKKwkJcHJfaW5mbygiJXMgd29ya3NwYWNlICgleCAleCkgc2l6ZSA9ICV4XG4iLCBfX2Z1bmNfXywKKwkJCSAgIGJ1Zl9zcGVjLT5zdGFydF9hZHIsIGJ1Zl9zcGVjLT5lbmRfYWRyLAorCQkJICAgYnVmX3NwZWMtPmVuZF9hZHIgLSBidWZfc3BlYy0+c3RhcnRfYWRyKTsKKwl9CisKKwlpZiAoZGVidWcpIHsKKwkJcHJfaW5mbygiaXBwLmJ1Zl9zdGFydCAgICAJCSA6JXhcbiIsCisJCQkgICBidWZfc3BlYy0+aXBwLmJ1Zl9zdGFydCk7CisJCXByX2luZm8oInNhb19hYnYuYnVmX3N0YXJ0ICAgIAkgIDoleFxuIiwKKwkJCSAgIGJ1Zl9zcGVjLT5zYW9fYWJ2LmJ1Zl9zdGFydCk7CisJCXByX2luZm8oInNhb192Yi5idWZfc3RhcnQgICAgCSAgOiV4XG4iLAorCQkJICAgYnVmX3NwZWMtPnNhb192Yi5idWZfc3RhcnQpOworCQlwcl9pbmZvKCJzaG9ydF90ZXJtX3Jwcy5idWZfc3RhcnQgIDoleFxuIiwKKwkJCSAgIGJ1Zl9zcGVjLT5zaG9ydF90ZXJtX3Jwcy5idWZfc3RhcnQpOworCQlwcl9pbmZvKCJ2cHMuYnVmX3N0YXJ0ICAgIAkJIDoleFxuIiwKKwkJCSAgIGJ1Zl9zcGVjLT52cHMuYnVmX3N0YXJ0KTsKKwkJcHJfaW5mbygic2VnX21hcC5idWZfc3RhcnQgICAgCSAgOiV4XG4iLAorCQkJICAgYnVmX3NwZWMtPnNlZ19tYXAuYnVmX3N0YXJ0KTsKKwkJcHJfaW5mbygiZGFhbGFfdG9wLmJ1Zl9zdGFydCAgICAJICA6JXhcbiIsCisJCQkgICBidWZfc3BlYy0+ZGFhbGFfdG9wLmJ1Zl9zdGFydCk7CisJCXByX2luZm8oInN3YXBfYnVmLmJ1Zl9zdGFydCAgICAJOiV4XG4iLAorCQkJICAgYnVmX3NwZWMtPnN3YXBfYnVmLmJ1Zl9zdGFydCk7CisJCXByX2luZm8oImNkZl9idWYuYnVmX3N0YXJ0ICAgIAk6JXhcbiIsCisJCQkgICBidWZfc3BlYy0+Y2RmX2J1Zi5idWZfc3RhcnQpOworCQlwcl9pbmZvKCJnbWNfYnVmLmJ1Zl9zdGFydCAgICAJOiV4XG4iLAorCQkJICAgYnVmX3NwZWMtPmdtY19idWYuYnVmX3N0YXJ0KTsKKwkJcHJfaW5mbygic2NhbGVsdXQuYnVmX3N0YXJ0ICAgIAk6JXhcbiIsCisJCQkgICBidWZfc3BlYy0+c2NhbGVsdXQuYnVmX3N0YXJ0KTsKKwkJcHJfaW5mbygiZGJsa19wYXJhLmJ1Zl9zdGFydCAgICAgICA6JXhcbiIsCisJCQkgICBidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zdGFydCk7CisJCXByX2luZm8oImRibGtfZGF0YS5idWZfc3RhcnQgICAgICAgOiV4XG4iLAorCQkJICAgYnVmX3NwZWMtPmRibGtfZGF0YS5idWZfc3RhcnQpOworCQlwcl9pbmZvKCJjZGVmX2RhdGEuYnVmX3N0YXJ0ICAgICAgIDoleFxuIiwKKwkJCQlidWZfc3BlYy0+Y2RlZl9kYXRhLmJ1Zl9zdGFydCk7CisJCXByX2luZm8oInVwc19kYXRhLmJ1Zl9zdGFydCAgICAgICA6JXhcbiIsCisJCQkJYnVmX3NwZWMtPnVwc19kYXRhLmJ1Zl9zdGFydCk7CisKKyNpZmRlZiBBT01fQVYxX01NVQorCQlwcl9pbmZvKCJtbXVfdmJoLmJ1Zl9zdGFydCAgICAgOiV4XG4iLAorCQkJYnVmX3NwZWMtPm1tdV92YmguYnVmX3N0YXJ0KTsKKyNlbmRpZgorCQlwcl9pbmZvKCJtcHJlZF9hYm92ZS5idWZfc3RhcnQgICAgIDoleFxuIiwKKwkJCSAgIGJ1Zl9zcGVjLT5tcHJlZF9hYm92ZS5idWZfc3RhcnQpOworI2lmZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwkJcHJfaW5mbygibXByZWRfbXYuYnVmX3N0YXJ0ICAgIAk6JXhcbiIsCisJCQkgICBidWZfc3BlYy0+bXByZWRfbXYuYnVmX3N0YXJ0KTsKKyNlbmRpZgorCQlpZiAoKGRlYnVnICYgQU9NX0FWMV9ERUJVR19TRU5EX1BBUkFNX1dJVEhfUkVHKSA9PSAwKSB7CisJCQlwcl9pbmZvKCJycG0uYnVmX3N0YXJ0ICAgIAkJIDoleFxuIiwKKwkJCQkgICBidWZfc3BlYy0+cnBtLmJ1Zl9zdGFydCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVuaW5pdF9tbXVfYnVmZmVycyhzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisjaWZuZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwlkZWFsbG9jX212X2J1ZnMoaHcpOworI2VuZGlmCisJaWYgKGh3LT5tbXVfYm94KQorCQlkZWNvZGVyX21tdV9ib3hfZnJlZShody0+bW11X2JveCk7CisJaHctPm1tdV9ib3ggPSBOVUxMOworCisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKwlpZiAoaHctPm1tdV9ib3hfZHcpCisJCWRlY29kZXJfbW11X2JveF9mcmVlKGh3LT5tbXVfYm94X2R3KTsKKwlody0+bW11X2JveF9kdyA9IE5VTEw7CisjZW5kaWYKKwlpZiAoaHctPmJtbXVfYm94KQorCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWUoaHctPmJtbXVfYm94KTsKKwlody0+Ym1tdV9ib3ggPSBOVUxMOworfQorCitzdGF0aWMgaW50IGNhbGNfbHVjX3F1YW50aXR5KGludCBsY3Vfc2l6ZSwgdTMyIHcsIHUzMiBoKQoreworCWludCBwaWNfd2lkdGhfNjQgPSAodyArIDYzKSAmICh+MHgzZik7CisJaW50IHBpY19oZWlnaHRfMzIgPSAoaCArIDMxKSAmICh+MHgxZik7CisJaW50IHBpY193aWR0aF9sY3UgID0gKHBpY193aWR0aF82NCAlIGxjdV9zaXplKSA/CisJCXBpY193aWR0aF82NCAvIGxjdV9zaXplICArIDEgOiBwaWNfd2lkdGhfNjQgLyBsY3Vfc2l6ZTsKKwlpbnQgcGljX2hlaWdodF9sY3UgPSAocGljX2hlaWdodF8zMiAlIGxjdV9zaXplKSA/CisJCXBpY19oZWlnaHRfMzIgLyBsY3Vfc2l6ZSArIDEgOiBwaWNfaGVpZ2h0XzMyIC8gbGN1X3NpemU7CisKKwlyZXR1cm4gcGljX3dpZHRoX2xjdSAqIHBpY19oZWlnaHRfbGN1OworfQorCisvKiByZXR1cm4gaW4gTUIgKi8KK3N0YXRpYyBpbnQgYXYxX21heF9tbXVfYnVmX3NpemUoaW50IG1heF93LCBpbnQgbWF4X2gpCit7CisJaW50IGJ1Zl9zaXplID0gNDg7CisKKwlpZiAoKG1heF93ICogbWF4X2ggPiAxMjgwKjczNikgJiYKKwkJKG1heF93ICogbWF4X2ggPD0gMTkyMCoxMDg4KSkgeworCQlidWZfc2l6ZSA9IDEyOworCX0gZWxzZSBpZiAoKG1heF93ICogbWF4X2ggPiAwKSAmJgorCQkobWF4X3cgKiBtYXhfaCA8PSAxMjgwKjczNikpIHsKKwkJYnVmX3NpemUgPSA0OworCX0KKworCXJldHVybiBidWZfc2l6ZTsKK30KKworc3RhdGljIGludCBhdjFfZ2V0X2hlYWRlcl9zaXplKGludCB3LCBpbnQgaCkKK3sKKwlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKSAmJgorCQlJU184S19TSVpFKHcsIGgpKQorCQlyZXR1cm4gTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFXzhLOworCWlmIChJU180S19TSVpFKHcsIGgpKQorCQlyZXR1cm4gTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFXzRLOworCisJcmV0dXJuIE1NVV9DT01QUkVTU19IRUFERVJfU0laRV8xMDgwUDsKK30KKworc3RhdGljIHZvaWQgYXYxX3B1dF92aWRlb19mcmFtZSh2b2lkICp2ZGVjX2N0eCwgc3RydWN0IHZmcmFtZV9zICp2ZikKK3sKKwl2YXYxX3ZmX3B1dCh2ZiwgdmRlY19jdHgpOworfQorCitzdGF0aWMgdm9pZCBhdjFfZ2V0X3ZpZGVvX2ZyYW1lKHZvaWQgKnZkZWNfY3R4LCBzdHJ1Y3QgdmZyYW1lX3MgKip2ZikKK3sKKwkqdmYgPSB2YXYxX3ZmX2dldCh2ZGVjX2N0eCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGFza19vcHNfcyB0YXNrX2RlY19vcHMgPSB7CisJLnR5cGUJCT0gVEFTS19UWVBFX0RFQywKKwkuZ2V0X3ZmcmFtZQk9IGF2MV9nZXRfdmlkZW9fZnJhbWUsCisJLnB1dF92ZnJhbWUJPSBhdjFfcHV0X3ZpZGVvX2ZyYW1lLAorfTsKKworc3RhdGljIGludCB2NGxfYWxsb2NfYW5kX2NvbmZpZ19waWMoc3RydWN0IEFWMUhXX3MgKmh3LAorCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpwaWMpCit7CisJaW50IHJldCA9IC0xOworCWludCBpID0gcGljLT5pbmRleDsKKwlpbnQgZHdfbW9kZSA9IGdldF9kb3VibGVfd3JpdGVfbW9kZV9pbml0KGh3KTsKKwlpbnQgbGN1X3RvdGFsID0gY2FsY19sdWNfcXVhbnRpdHkoaHctPmN1cnJlbnRfbGN1X3NpemUsCisJCWh3LT5mcmFtZV93aWR0aCwgaHctPmZyYW1lX2hlaWdodCk7CisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCXUzMiBtcHJlZF9tdl9lbmQgPSBody0+d29ya19zcGFjZV9idWYtPm1wcmVkX212LmJ1Zl9zdGFydCArCisJCWh3LT53b3JrX3NwYWNlX2J1Zi0+bXByZWRfbXYuYnVmX3NpemU7CisvLyNpZmRlZiBVU0VfRFlOQU1JQ19NVl9CVUZGRVIKKy8vCSAgaW50MzJfdCBNVl9NRU1fVU5JVCA9IChsY3Vfc2l6ZSA9PSAxMjgpID8gKDE5KjQqMTYpIDogKDE5KjE2KTsKKy8vCSAgaW50MzJfdCBtdl9idWZmZXJfc2l6ZSA9IChsY3VfdG90YWwqTVZfTUVNX1VOSVQpOworLy8jZWxzZQorCSAgaW50MzJfdCBtdl9idWZmZXJfc2l6ZSA9IGh3LT5tYXhfb25lX212X2J1ZmZlcl9zaXplOworLy8jZW5kaWYKKyNlbmRpZgorCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKWh3LT52NGwyX2N0eDsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPSBOVUxMOworCisJaWYgKGkgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gY3R4LT5mYl9vcHMuYWxsb2MoJmN0eC0+ZmJfb3BzLCBody0+ZmJfdG9rZW4sICZmYiwgQU1MX0ZCX1JFUV9ERUMpOworCWlmIChyZXQgPCAwKSB7CisJCWF2MV9wcmludChodywgMCwgIlslZF0gQVYxIGdldCBidWZmZXIgZmFpbC5cbiIsIGN0eC0+aWQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWZiLT50YXNrLT5hdHRhY2goZmItPnRhc2ssICZ0YXNrX2RlY19vcHMsIGh3KTsKKwlmYi0+c3RhdHVzID0gRkJfU1RfREVDT0RFUjsKKworCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWEwpICYmCisJCShnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpICE9IDB4MTApKSB7CisJCXN0cnVjdCBpbnRlcm5hbF9jb21wX2J1ZiAqaWJ1ZiA9IHY0bGZiX3RvX2ljb21wX2J1ZihodywgZmIpOworCisJCWh3LT5tX0JVRltpXS5oZWFkZXJfYWRkciA9IGlidWYtPmhlYWRlcl9hZGRyOworCQlpZiAoZGVidWcgJiBBVjFfREVCVUdfQlVGTUdSX01PUkUpIHsKKwkJCXByX2luZm8oIk1NVSBoZWFkZXJfYWRyICVkOiAlbGRcbiIsCisJCQkJaSwgaHctPm1fQlVGW2ldLmhlYWRlcl9hZGRyKTsKKwkJfQorCX0KKworCWlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpICYgMHgyMCkgeworCQlzdHJ1Y3QgaW50ZXJuYWxfY29tcF9idWYgKmlidWYgPSB2NGxmYl90b19pY29tcF9idWYoaHcsIGZiKTsKKworCQlody0+bV9CVUZbaV0uaGVhZGVyX2R3X2FkZHIgPSBpYnVmLT5oZWFkZXJfZHdfYWRkcjsKKwkJaWYgKGRlYnVnICYgQVYxX0RFQlVHX0JVRk1HUl9NT1JFKSB7CisJCQlwcl9pbmZvKCJNTVUgaGVhZGVyX2FkciAlZDogJWxkXG4iLAorCQkJCWksIGh3LT5tX0JVRltpXS5oZWFkZXJfYWRkcik7CisJCX0KKwl9CisJcGljLT5yZXBlYXRfcGljID0gTlVMTDsKKwlwaWMtPnJlcGVhdF9jb3VudCA9IDA7CisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCWlmICgoaHctPndvcmtfc3BhY2VfYnVmLT5tcHJlZF9tdi5idWZfc3RhcnQgKworCQkoKGkgKyAxKSAqIG12X2J1ZmZlcl9zaXplKSkKKwkJPD0gbXByZWRfbXZfZW5kKSB7CisjZW5kaWYKKwlody0+bV9CVUZbaV0udjRsX3JlZl9idWZfYWRkciA9ICh1bG9uZylmYjsKKwlwaWMtPmNtYV9hbGxvY19hZGRyID0gZmItPm0ubWVtWzBdLmFkZHI7CisJaWYgKGZiLT5udW1fcGxhbmVzID09IDEpIHsKKwkJaHctPm1fQlVGW2ldLnN0YXJ0X2FkciA9IGZiLT5tLm1lbVswXS5hZGRyOworCQlody0+bV9CVUZbaV0ubHVtYV9zaXplID0gZmItPm0ubWVtWzBdLm9mZnNldDsKKwkJaHctPm1fQlVGW2ldLnNpemUgPSBmYi0+bS5tZW1bMF0uc2l6ZTsKKwkJZmItPm0ubWVtWzBdLmJ5dGVzX3VzZWQgPSBmYi0+bS5tZW1bMF0uc2l6ZTsKKwkJcGljLT5kd195X2FkciA9IGh3LT5tX0JVRltpXS5zdGFydF9hZHI7CisJCXBpYy0+ZHdfdV92X2FkciA9IHBpYy0+ZHdfeV9hZHIgKyBody0+bV9CVUZbaV0ubHVtYV9zaXplOworCX0gZWxzZSBpZiAoZmItPm51bV9wbGFuZXMgPT0gMikgeworCQlody0+bV9CVUZbaV0uc3RhcnRfYWRyID0gZmItPm0ubWVtWzBdLmFkZHI7CisJCWh3LT5tX0JVRltpXS5zaXplID0gZmItPm0ubWVtWzBdLnNpemU7CisJCWh3LT5tX0JVRltpXS5jaHJvbWFfYWRkciA9IGZiLT5tLm1lbVsxXS5hZGRyOworCQlody0+bV9CVUZbaV0uY2hyb21hX3NpemUgPSBmYi0+bS5tZW1bMV0uc2l6ZTsKKwkJZmItPm0ubWVtWzBdLmJ5dGVzX3VzZWQgPSBmYi0+bS5tZW1bMF0uc2l6ZTsKKwkJZmItPm0ubWVtWzFdLmJ5dGVzX3VzZWQgPSBmYi0+bS5tZW1bMV0uc2l6ZTsKKwkJcGljLT5kd195X2FkciA9IGh3LT5tX0JVRltpXS5zdGFydF9hZHI7CisJCXBpYy0+ZHdfdV92X2FkciA9IGh3LT5tX0JVRltpXS5jaHJvbWFfYWRkcjsKKwl9CisKKwkvKiBjb25maWcgZnJhbWUgYnVmZmVyICovCisJaWYgKChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTCkgJiYKKwkJKGdldF9kb3VibGVfd3JpdGVfbW9kZShodykgIT0gMHgxMCkpIHsKKwkJcGljLT5oZWFkZXJfYWRyID0gaHctPm1fQlVGW2ldLmhlYWRlcl9hZGRyOworCX0KKworCWlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpICYgMHgyMCkgeworCQlwaWMtPmhlYWRlcl9kd19hZHIgPSBody0+bV9CVUZbaV0uaGVhZGVyX2R3X2FkZHI7CisJfQorCisJcGljLT5CVUZfaW5kZXgJCT0gaTsKKwlwaWMtPmxjdV90b3RhbAkJPSBsY3VfdG90YWw7CisJcGljLT5tY19jYW52YXNfeQk9IHBpYy0+aW5kZXg7CisJcGljLT5tY19jYW52YXNfdV92CT0gcGljLT5pbmRleDsKKworCWlmIChkd19tb2RlICYgMHgxMCkgeworCQlwaWMtPm1jX2NhbnZhc195ID0gKHBpYy0+aW5kZXggPDwgMSk7CisJCXBpYy0+bWNfY2FudmFzX3VfdiA9IChwaWMtPmluZGV4IDw8IDEpICsgMTsKKwl9CisKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJcGljLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyID0KKwkJaHctPndvcmtfc3BhY2VfYnVmLT5tcHJlZF9tdi5idWZfc3RhcnQgKworCQkocGljLT5pbmRleCAqIG12X2J1ZmZlcl9zaXplKTsKKyNlbmRpZgorCisjaWZkZWYgRFVNUF9GSUxNR1JBSU4KKwlpZiAocGljLT5pbmRleCA9PSBmZ19kdW1wX2luZGV4KSB7CisJCXBpYy0+ZmdzX3RhYmxlX2FkciA9IGh3LT5mZ19waHlfYWRkcjsKKwkJcHJfaW5mbygic2V0IGJ1ZmZlciAlZCBmaWxtIGdyYWluIHRhYmxlIDB4JXhcbiIsCisJCQlwaWMtPmluZGV4LCBwaWMtPmZnc190YWJsZV9hZHIpOworCQl9IGVsc2UgeworI2VuZGlmCisJCQlpZiAoaHctPmFzc2l0X3Rhc2sudXNlX3NmZ3MpIHsKKwkJCQlwaWMtPnNmZ3NfdGFibGVfcGh5ID0gaHctPmZnX3BoeV9hZGRyICsgKHBpYy0+aW5kZXggKiBGR1NfVEFCTEVfU0laRSk7CisJCQkJcGljLT5zZmdzX3RhYmxlX3B0ciA9IGh3LT5mZ19wdHIgKyAocGljLT5pbmRleCAqIEZHU19UQUJMRV9TSVpFKTsKKwkJCX0KKwkJCXBpYy0+ZmdzX3RhYmxlX2FkciA9IGh3LT53b3JrX3NwYWNlX2J1Zi0+ZmdzX3RhYmxlLmJ1Zl9zdGFydCArCisJCQkJKHBpYy0+aW5kZXggKiBGR1NfVEFCTEVfU0laRSk7CisJCX0KKworCWlmIChkZWJ1ZykgeworCisJCXByX2luZm8oIiVzIGluZGV4ICVkIEJVRl9pbmRleCAlZCAiLAorCQkJX19mdW5jX18sIHBpYy0+aW5kZXgsCisJCQlwaWMtPkJVRl9pbmRleCk7CisJCXByX2luZm8oImNvbXBfYm9keV9zaXplICV4IGNvbXBfYnVmX3NpemUgJXggIiwKKwkJCXBpYy0+Y29tcF9ib2R5X3NpemUsCisJCQlwaWMtPmJ1Zl9zaXplKTsKKwkJcHJfaW5mbygibXByZWRfbXZfd3Jfc3RhcnRfYWRyICVkXG4iLAorCQkJcGljLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyKTsKKwkJcHJfaW5mbygiZHdfeV9hZHIgJWQsIHBpY19jb25maWctPmR3X3Vfdl9hZHIgPSVkXG4iLAorCQkJcGljLT5kd195X2FkciwKKwkJCXBpYy0+ZHdfdV92X2Fkcik7CisJfQorI2lmZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwl9CisjZW5kaWYKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNvbmZpZ19waWMoc3RydWN0IEFWMUhXX3MgKmh3LAorCQkJCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpwaWNfY29uZmlnKQoreworCWludCByZXQgPSAtMTsKKwlpbnQgaTsKKwlpbnQgcGljX3dpZHRoID0gaHctPmluaXRfcGljX3c7CisJaW50IHBpY19oZWlnaHQgPSBody0+aW5pdF9waWNfaDsKKwkvL2ludCBsY3Vfc2l6ZSA9ICgocGFyYW1zLT5wLnNlcV9mbGFncyA+PiA2KSAmIDB4MSkgPyAxMjggOiA2NDsKKyAgICBpbnQgbGN1X3NpemUgPSBody0+Y3VycmVudF9sY3Vfc2l6ZTsKKworCWludCBwaWNfd2lkdGhfNjQgPSAocGljX3dpZHRoICsgNjMpICYgKH4weDNmKTsKKwlpbnQgcGljX2hlaWdodF8zMiA9IChwaWNfaGVpZ2h0ICsgMzEpICYgKH4weDFmKTsKKwlpbnQgcGljX3dpZHRoX2xjdSAgPSAocGljX3dpZHRoXzY0ICUgbGN1X3NpemUpID8KKwkJCQlwaWNfd2lkdGhfNjQgLyBsY3Vfc2l6ZSAgKyAxCisJCQkJOiBwaWNfd2lkdGhfNjQgLyBsY3Vfc2l6ZTsKKwlpbnQgcGljX2hlaWdodF9sY3UgPSAocGljX2hlaWdodF8zMiAlIGxjdV9zaXplKSA/CisJCQkJcGljX2hlaWdodF8zMiAvIGxjdV9zaXplICsgMQorCQkJCTogcGljX2hlaWdodF8zMiAvIGxjdV9zaXplOworCWludCBsY3VfdG90YWwgICAgICAgPSBwaWNfd2lkdGhfbGN1ICogcGljX2hlaWdodF9sY3U7CisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCXUzMiBtcHJlZF9tdl9lbmQgPSBody0+d29ya19zcGFjZV9idWYtPm1wcmVkX212LmJ1Zl9zdGFydCArCisJCQlody0+d29ya19zcGFjZV9idWYtPm1wcmVkX212LmJ1Zl9zaXplOworLy8jaWZkZWYgVVNFX0RZTkFNSUNfTVZfQlVGRkVSCisvLyAgaW50MzJfdCBNVl9NRU1fVU5JVCA9IChsY3Vfc2l6ZSA9PSAxMjgpID8gKDE5KjQqMTYpIDogKDE5KjE2KTsKKy8vICBpbnQzMl90IG12X2J1ZmZlcl9zaXplID0gKGxjdV90b3RhbCpNVl9NRU1fVU5JVCk7CisvLyNlbHNlCisgIGludDMyX3QgbXZfYnVmZmVyX3NpemUgPSBody0+bWF4X29uZV9tdl9idWZmZXJfc2l6ZTsKKy8vI2VuZGlmCisKKyNlbmRpZgorCisJdTMyIHlfYWRyID0gMDsKKwlpbnQgYnVmX3NpemUgPSAwOworCisJaW50IGxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSA9CisJCQljb21wdXRlX2xvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZShwaWNfd2lkdGgsCisJCQlwaWNfaGVpZ2h0KTsKKwlpbnQgbG9zbGVzc19jb21wX2JvZHlfc2l6ZSA9IGNvbXB1dGVfbG9zbGVzc19jb21wX2JvZHlfc2l6ZShwaWNfd2lkdGgsCisJCQlwaWNfaGVpZ2h0LCBidWZfYWxsb2NfZGVwdGggPT0gMTApOworCWludCBtY19idWZmZXJfc2l6ZSA9IGxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSArIGxvc2xlc3NfY29tcF9ib2R5X3NpemU7CisJaW50IG1jX2J1ZmZlcl9zaXplX2ggPSAobWNfYnVmZmVyX3NpemUgKyAweGZmZmYpID4+IDE2OworCWludCBtY19idWZmZXJfc2l6ZV91X3YgPSAwOworCWludCBtY19idWZmZXJfc2l6ZV91X3ZfaCA9IDA7CisJaW50IGR3X21vZGUgPSBnZXRfZG91YmxlX3dyaXRlX21vZGVfaW5pdChodyk7CisKKwlody0+bGN1X3RvdGFsID0gbGN1X3RvdGFsOworCisJaWYgKGR3X21vZGUgJiYgKGR3X21vZGUgJiAweDIwKSA9PSAwKSB7CisJCWludCBwaWNfd2lkdGhfZHcgPSBwaWNfd2lkdGggLworCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhkd19tb2RlICYgMHhmKTsKKwkJaW50IHBpY19oZWlnaHRfZHcgPSBwaWNfaGVpZ2h0IC8KKwkJCWdldF9kb3VibGVfd3JpdGVfcmF0aW8oZHdfbW9kZSAmIDB4Zik7CisKKwkJaW50IHBpY193aWR0aF82NF9kdyA9IChwaWNfd2lkdGhfZHcgKyA2MykgJiAofjB4M2YpOworCQlpbnQgcGljX2hlaWdodF8zMl9kdyA9IChwaWNfaGVpZ2h0X2R3ICsgMzEpICYgKH4weDFmKTsKKwkJaW50IHBpY193aWR0aF9sY3VfZHcgID0gKHBpY193aWR0aF82NF9kdyAlIGxjdV9zaXplKSA/CisJCQkJCXBpY193aWR0aF82NF9kdyAvIGxjdV9zaXplICArIDEKKwkJCQkJOiBwaWNfd2lkdGhfNjRfZHcgLyBsY3Vfc2l6ZTsKKwkJaW50IHBpY19oZWlnaHRfbGN1X2R3ID0gKHBpY19oZWlnaHRfMzJfZHcgJSBsY3Vfc2l6ZSkgPworCQkJCQlwaWNfaGVpZ2h0XzMyX2R3IC8gbGN1X3NpemUgKyAxCisJCQkJCTogcGljX2hlaWdodF8zMl9kdyAvIGxjdV9zaXplOworCQlpbnQgbGN1X3RvdGFsX2R3ICAgICAgID0gcGljX3dpZHRoX2xjdV9kdyAqIHBpY19oZWlnaHRfbGN1X2R3OworCQltY19idWZmZXJfc2l6ZV91X3YgPSBsY3VfdG90YWxfZHcgKiBsY3Vfc2l6ZSAqIGxjdV9zaXplIC8gMjsKKwkJbWNfYnVmZmVyX3NpemVfdV92X2ggPSAobWNfYnVmZmVyX3NpemVfdV92ICsgMHhmZmZmKSA+PiAxNjsKKwkJLyo2NGsgYWxpZ25tZW50Ki8KKwkJYnVmX3NpemUgPSAoKG1jX2J1ZmZlcl9zaXplX3Vfdl9oIDw8IDE2KSAqIDMpOworCQlidWZfc2l6ZSA9ICgoYnVmX3NpemUgKyAweGZmZmYpID4+IDE2KSA8PCAxNjsKKwl9CisKKwlpZiAobWNfYnVmZmVyX3NpemUgJiAweGZmZmYpIC8qNjRrIGFsaWdubWVudCovCisJCW1jX2J1ZmZlcl9zaXplX2ggKz0gMTsKKwlpZiAoKCFody0+bW11X2VuYWJsZSkgJiYgKChkd19tb2RlICYgMHgxMCkgPT0gMCkpCisJCWJ1Zl9zaXplICs9IChtY19idWZmZXJfc2l6ZV9oIDw8IDE2KTsKKworI2lmZGVmIFVTRV9TUEVDX0JVRl9GT1JfTU1VX0hFQUQKKwlpZiAoaHctPm1tdV9lbmFibGUpIHsKKwkJcGljX2NvbmZpZy0+aGVhZGVyX2FkciA9CisJCQlody0+d29ya19zcGFjZV9idWYtPmNtX2hlYWRlci5idWZfc3RhcnQgKworCQkJCQkocGljX2NvbmZpZy0+aW5kZXggKiB2YXYxX21tdV9jb21wcmVzc19oZWFkZXJfc2l6ZShodykpOworCisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKwkJaWYgKGh3LT5kd19tbXVfZW5hYmxlKSB7CisJCQlwaWNfY29uZmlnLT5oZWFkZXJfZHdfYWRyID0KKwkJCQlody0+d29ya19zcGFjZV9idWYtPmNtX2hlYWRlcl9kdy5idWZfc3RhcnQgKworCQkJCQkJKHBpY19jb25maWctPmluZGV4ICogdmF2MV9tbXVfY29tcHJlc3NfaGVhZGVyX3NpemUoaHcpKTsKKworCQl9CisjZW5kaWYKKwl9CisKKyNlbHNlCisvKiFVU0VfU1BFQ19CVUZfRk9SX01NVV9IRUFEKi8KKwlpZiAoaHctPm1tdV9lbmFibGUpIHsKKwkJcGljX2NvbmZpZy0+aGVhZGVyX2FkciA9IGRlY29kZXJfYm1tdV9ib3hfZ2V0X3BoeV9hZGRyKAorCQkJaHctPmJtbXVfYm94LCBIRUFERVJfQlVGRkVSX0lEWChwaWNfY29uZmlnLT5pbmRleCkpOworCisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKwkJaWYgKGh3LT5kd19tbXVfZW5hYmxlKSB7CisJCQlwaWNfY29uZmlnLT5oZWFkZXJfZHdfYWRyID0gZGVjb2Rlcl9ibW11X2JveF9nZXRfcGh5X2FkZHIoCisJCQkJaHctPmJtbXVfYm94LCBEV19IRUFERVJfQlVGRkVSX0lEWChwaWNfY29uZmlnLT5pbmRleCkpOworCisJCX0KKwkJaWYgKGRlYnVnICYgQVYxX0RFQlVHX0JVRk1HUl9NT1JFKSB7CisJCQlwcl9pbmZvKCJNTVUgZHcgaGVhZGVyX2FkciAoJWQsICVkKSAlZDogJWRcbiIsCisJCQkJaHctPmR3X21tdV9lbmFibGUsCisJCQkJRFdfSEVBREVSX0JVRkZFUl9JRFgocGljX2NvbmZpZy0+aW5kZXgpLAorCQkJCXBpY19jb25maWctPmluZGV4LAorCQkJCXBpY19jb25maWctPmhlYWRlcl9kd19hZHIpOworCQl9CisjZW5kaWYKKworCQlpZiAoZGVidWcgJiBBVjFfREVCVUdfQlVGTUdSX01PUkUpIHsKKwkJCXByX2luZm8oIk1NVSBoZWFkZXJfYWRyICVkOiAlZFxuIiwKKwkJCQlwaWNfY29uZmlnLT5pbmRleCwgcGljX2NvbmZpZy0+aGVhZGVyX2Fkcik7CisJCX0KKwl9CisjZW5kaWYKKworCWkgPSBwaWNfY29uZmlnLT5pbmRleDsKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJaWYgKChody0+d29ya19zcGFjZV9idWYtPm1wcmVkX212LmJ1Zl9zdGFydCArCisJCSgoaSArIDEpICogbXZfYnVmZmVyX3NpemUpKQorCQk8PSBtcHJlZF9tdl9lbmQKKwkpIHsKKyNlbmRpZgorCQlpZiAoYnVmX3NpemUgPiAwKSB7CisJCQlyZXQgPSBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkoaHctPmJtbXVfYm94LAorCQkJCQlWRl9CVUZGRVJfSURYKGkpLAorCQkJCQlidWZfc2l6ZSwgRFJJVkVSX05BTUUsCisJCQkJCSZwaWNfY29uZmlnLT5jbWFfYWxsb2NfYWRkcik7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXByX2luZm8oCisJCQkJCSJkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkgaWR4ICVkIHNpemUgJWQgZmFpbFxuIiwKKwkJCQkJVkZfQlVGRkVSX0lEWChpKSwKKwkJCQkJYnVmX3NpemUKKwkJCQkJKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCisJCQlpZiAocGljX2NvbmZpZy0+Y21hX2FsbG9jX2FkZHIpCisJCQkJeV9hZHIgPSBwaWNfY29uZmlnLT5jbWFfYWxsb2NfYWRkcjsKKwkJCWVsc2UgeworCQkJCXByX2luZm8oCisJCQkJCSJkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkgaWR4ICVkIHNpemUgJWQgcmV0dXJuIG51bGxcbiIsCisJCQkJCVZGX0JVRkZFUl9JRFgoaSksCisJCQkJCWJ1Zl9zaXplCisJCQkJCSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXsKKwkJCS8qZW5zdXJlIGdldF9waWNfYnlfUE9DKCkKKwkJCW5vdCBnZXQgdGhlIGJ1ZmZlciBub3QgZGVjb2RlZCovCisJCQlwaWNfY29uZmlnLT5CVUZfaW5kZXggPSBpOworCQkJcGljX2NvbmZpZy0+bGN1X3RvdGFsID0gbGN1X3RvdGFsOworCisJCQlwaWNfY29uZmlnLT5jb21wX2JvZHlfc2l6ZSA9IGxvc2xlc3NfY29tcF9ib2R5X3NpemU7CisJCQlwaWNfY29uZmlnLT5idWZfc2l6ZSA9IGJ1Zl9zaXplOworCisJCQlwaWNfY29uZmlnLT5tY19jYW52YXNfeSA9IHBpY19jb25maWctPmluZGV4OworCQkJcGljX2NvbmZpZy0+bWNfY2FudmFzX3VfdiA9IHBpY19jb25maWctPmluZGV4OworCQkJaWYgKGR3X21vZGUgJiAweDEwKSB7CisJCQkJcGljX2NvbmZpZy0+ZHdfeV9hZHIgPSB5X2FkcjsKKwkJCQlwaWNfY29uZmlnLT5kd191X3ZfYWRyID0geV9hZHIgKworCQkJCQkoKG1jX2J1ZmZlcl9zaXplX3Vfdl9oIDw8IDE2KSA8PCAxKTsKKworCQkJCXBpY19jb25maWctPm1jX2NhbnZhc195ID0KKwkJCQkJKHBpY19jb25maWctPmluZGV4IDw8IDEpOworCQkJCXBpY19jb25maWctPm1jX2NhbnZhc191X3YgPQorCQkJCQkocGljX2NvbmZpZy0+aW5kZXggPDwgMSkgKyAxOworCQkJfSBlbHNlIGlmIChkd19tb2RlICYmIChkd19tb2RlICYgMHgyMCkgPT0gMCkgeworCQkJCXBpY19jb25maWctPmR3X3lfYWRyID0geV9hZHI7CisJCQkJcGljX2NvbmZpZy0+ZHdfdV92X2FkciA9IHBpY19jb25maWctPmR3X3lfYWRyICsKKwkJCQkoKG1jX2J1ZmZlcl9zaXplX3Vfdl9oIDw8IDE2KSA8PCAxKTsKKwkJCX0KKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJCQlwaWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyID0KKwkJCWh3LT53b3JrX3NwYWNlX2J1Zi0+bXByZWRfbXYuYnVmX3N0YXJ0ICsKKwkJCQkJKHBpY19jb25maWctPmluZGV4ICogbXZfYnVmZmVyX3NpemUpOworI2VuZGlmCisjaWZkZWYgRFVNUF9GSUxNR1JBSU4KKwkJCWlmIChwaWNfY29uZmlnLT5pbmRleCA9PSBmZ19kdW1wX2luZGV4KSB7CisJCQkJcGljX2NvbmZpZy0+ZmdzX3RhYmxlX2FkciA9IGh3LT5mZ19waHlfYWRkcjsKKwkJCQlwcl9pbmZvKCJzZXQgYnVmZmVyICVkIGZpbG0gZ3JhaW4gdGFibGUgMHgleFxuIiwKKwkJCQkJcGljX2NvbmZpZy0+aW5kZXgsIHBpY19jb25maWctPmZnc190YWJsZV9hZHIpOworCQkJfSBlbHNlIHsKKyNlbmRpZgorCQkJCWlmIChody0+YXNzaXRfdGFzay51c2Vfc2ZncykgeworCQkJCQlwaWNfY29uZmlnLT5zZmdzX3RhYmxlX3BoeSA9IGh3LT5mZ19waHlfYWRkciArIChwaWNfY29uZmlnLT5pbmRleCAqIEZHU19UQUJMRV9TSVpFKTsKKwkJCQkJcGljX2NvbmZpZy0+c2Znc190YWJsZV9wdHIgPSBody0+ZmdfcHRyICsgKHBpY19jb25maWctPmluZGV4ICogRkdTX1RBQkxFX1NJWkUpOworCQkJCX0KKwkJCQlwaWNfY29uZmlnLT5mZ3NfdGFibGVfYWRyID0KKwkJCQkJaHctPndvcmtfc3BhY2VfYnVmLT5mZ3NfdGFibGUuYnVmX3N0YXJ0ICsKKwkJCQkJKHBpY19jb25maWctPmluZGV4ICogRkdTX1RBQkxFX1NJWkUpOworCQkJfQorCisJCQlpZiAoZGVidWcpIHsKKwkJCQlwcl9pbmZvCisJCQkJKCIlcyBpbmRleCAlZCBCVUZfaW5kZXggJWQgIiwKKwkJCQlfX2Z1bmNfXywgcGljX2NvbmZpZy0+aW5kZXgsCisJCQkJcGljX2NvbmZpZy0+QlVGX2luZGV4KTsKKwkJCQlwcl9pbmZvCisJCQkJKCJjb21wX2JvZHlfc2l6ZSAleCBjb21wX2J1Zl9zaXplICV4ICIsCisJCQkJcGljX2NvbmZpZy0+Y29tcF9ib2R5X3NpemUsCisJCQkJcGljX2NvbmZpZy0+YnVmX3NpemUpOworCQkJCXByX2luZm8KKwkJCQkoIm1wcmVkX212X3dyX3N0YXJ0X2FkciAlZFxuIiwKKwkJCQlwaWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyKTsKKwkJCQlwcl9pbmZvKCJkd195X2FkciAlZCwgcGljX2NvbmZpZy0+ZHdfdV92X2FkciA9JWRcbiIsCisJCQkJCXBpY19jb25maWctPmR3X3lfYWRyLAorCQkJCQlwaWNfY29uZmlnLT5kd191X3ZfYWRyKTsKKwkJCX0KKwkJCXJldCA9IDA7CisJCX0KKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJfQorI2VuZGlmCisJcmV0dXJuIHJldDsKK30KKworI2lmbmRlZiBVU0VfU1BFQ19CVUZfRk9SX01NVV9IRUFECitzdGF0aWMgaW50IHZhdjFfbW11X2NvbXByZXNzX2hlYWRlcl9zaXplKHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKSAmJgorCQlJU184S19TSVpFKGh3LT5tYXhfcGljX3csIGh3LT5tYXhfcGljX2gpKQorCQlyZXR1cm4gKE1NVV9DT01QUkVTU19IRUFERVJfU0laRV84Syk7CisKKwlpZiAoSVNfNEtfU0laRShody0+bWF4X3BpY193LCBody0+bWF4X3BpY19oKSkKKwkJcmV0dXJuIE1NVV9DT01QUkVTU19IRUFERVJfU0laRV80SzsKKworCXJldHVybiAoTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFXzEwODBQKTsKK30KKyNlbmRpZgorLyojZGVmaW5lIEZSQU1FX01NVV9NQVBfU0laRSAgKE1BWF9GUkFNRV80S19OVU0gKiA0KSovCitzdGF0aWMgaW50IHZhdjFfZnJhbWVfbW11X21hcF9zaXplKHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKSAmJgorCQlJU184S19TSVpFKGh3LT5tYXhfcGljX3csIGh3LT5tYXhfcGljX2gpKQorCQlyZXR1cm4gKE1BWF9GUkFNRV84S19OVU0gKiA0KTsKKworCXJldHVybiAoTUFYX0ZSQU1FXzRLX05VTSAqIDQpOworfQorCisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKK3N0YXRpYyBpbnQgdmFvbV9kd19mcmFtZV9tbXVfbWFwX3NpemUoc3RydWN0IEFWMUhXX3MgKmh3KQoreworCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpICYmCisJCUlTXzhLX1NJWkUoaHctPm1heF9waWNfdywgaHctPm1heF9waWNfaCkpCisJCXJldHVybiAoTUFYX0ZSQU1FXzhLX05VTSAqIDQpOworCisJcmV0dXJuIChNQVhfRlJBTUVfNEtfTlVNICogNCk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgaW5pdF9waWNfbGlzdChzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJaW50IGk7CisJc3RydWN0IEFWMV9Db21tb25fcyAqY20gPSAmaHctPmNvbW1vbjsKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljX2NvbmZpZzsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisKKyNpZm5kZWYgVVNFX1NQRUNfQlVGX0ZPUl9NTVVfSEVBRAorCXUzMiBoZWFkZXJfc2l6ZTsKKworCWlmICghaHctPmlzX3VzZWRfdjRsICYmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTCkgJiYKKwkJKGdldF9kb3VibGVfd3JpdGVfbW9kZShodykgIT0gMHgxMCkpIHsKKwkJaGVhZGVyX3NpemUgPSB2YXYxX21tdV9jb21wcmVzc19oZWFkZXJfc2l6ZShodyk7CisJCS8qYWxsb2MgQVYxIGNvbXByZXNzIGhlYWRlciBmaXJzdCovCisJCWZvciAoaSA9IDA7IGkgPCBody0+dXNlZF9idWZfbnVtOyBpKyspIHsKKwkJCXVuc2lnbmVkIGxvbmcgYnVmX2FkZHI7CisJCQlpZiAoZGVjb2Rlcl9ibW11X2JveF9hbGxvY19idWZfcGh5CisJCQkJKGh3LT5ibW11X2JveCwKKwkJCQlIRUFERVJfQlVGRkVSX0lEWChpKSwgaGVhZGVyX3NpemUsCisJCQkJRFJJVkVSX0hFQURFUl9OQU1FLAorCQkJCSZidWZfYWRkcikgPCAwKSB7CisJCQkJYXYxX3ByaW50KGh3LCAwLCAiJXMgbWFsbG9jIGNvbXByZXNzIGhlYWRlciBmYWlsZWQgJWRcbiIsCisJCQkJRFJJVkVSX0hFQURFUl9OQU1FLCBpKTsKKwkJCQlody0+ZmF0YWxfZXJyb3IgfD0gREVDT0RFUl9GQVRBTF9FUlJPUl9OT19NRU07CisJCQkJcmV0dXJuOworCQkJfQorI2lmZGVmIEFPTV9BVjFfTU1VX0RXCisJCQlpZiAoaHctPmR3X21tdV9lbmFibGUpIHsKKwkJCQlpZiAoZGVjb2Rlcl9ibW11X2JveF9hbGxvY19idWZfcGh5CisJCQkJCShody0+Ym1tdV9ib3gsCisJCQkJCURXX0hFQURFUl9CVUZGRVJfSURYKGkpLCBoZWFkZXJfc2l6ZSwKKwkJCQkJRFJJVkVSX0hFQURFUl9OQU1FLAorCQkJCQkmYnVmX2FkZHIpIDwgMCkgeworCQkJCQlhdjFfcHJpbnQoaHcsIDAsICIlcyBtYWxsb2MgY29tcHJlc3MgZHcgaGVhZGVyIGZhaWxlZCAlZFxuIiwKKwkJCQkJRFJJVkVSX0hFQURFUl9OQU1FLCBpKTsKKwkJCQkJaHctPmZhdGFsX2Vycm9yIHw9IERFQ09ERVJfRkFUQUxfRVJST1JfTk9fTUVNOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorI2VuZGlmCisJCX0KKwl9CisjZW5kaWYKKwlmb3IgKGkgPSAwOyBpIDwgaHctPnVzZWRfYnVmX251bTsgaSsrKSB7CisJCXBpY19jb25maWcgPSAmY20tPmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzW2ldLmJ1ZjsKKwkJcGljX2NvbmZpZy0+aW5kZXggPSBpOworCQlwaWNfY29uZmlnLT5CVUZfaW5kZXggPSAtMTsKKwkJcGljX2NvbmZpZy0+bXZfYnVmX2luZGV4ID0gLTE7CisJCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQkJcGljX2NvbmZpZy0+eV9jYW52YXNfaW5kZXggPSAtMTsKKwkJCXBpY19jb25maWctPnV2X2NhbnZhc19pbmRleCA9IC0xOworCQl9CisJCXBpY19jb25maWctPnlfY3JvcF93aWR0aCA9IGh3LT5pbml0X3BpY193OworCQlwaWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0ID0gaHctPmluaXRfcGljX2g7CisJCXBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlID0gZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KTsKKwkJaHctPmJ1ZmZlcl93cmFwW2ldID0gaTsKKworCQlpZiAoIWh3LT5pc191c2VkX3Y0bCkgeworCQkJaWYgKGNvbmZpZ19waWMoaHcsIHBpY19jb25maWcpIDwgMCkgeworCQkJCWlmIChkZWJ1ZykKKwkJCQkJYXYxX3ByaW50KGh3LCAwLCAiQ29uZmlnX3BpYyAlZCBmYWlsXG4iLAorCQkJCQkJcGljX2NvbmZpZy0+aW5kZXgpOworCQkJCXBpY19jb25maWctPmluZGV4ID0gLTE7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSAmJgorCQkJCShwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MjApID09IDApIHsKKwkJCQlzZXRfY2FudmFzKGh3LCBwaWNfY29uZmlnKTsKKwkJCX0KKwkJfQorCX0KKwlmb3IgKDsgaSA8IGh3LT51c2VkX2J1Zl9udW07IGkrKykgeworCQlwaWNfY29uZmlnID0gJmNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmc1tpXS5idWY7CisJCXBpY19jb25maWctPmluZGV4ID0gLTE7CisJCXBpY19jb25maWctPkJVRl9pbmRleCA9IC0xOworCQlwaWNfY29uZmlnLT5tdl9idWZfaW5kZXggPSAtMTsKKwkJaHctPmJ1ZmZlcl93cmFwW2ldID0gaTsKKwkJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCQlwaWNfY29uZmlnLT55X2NhbnZhc19pbmRleCA9IC0xOworCQkJcGljX2NvbmZpZy0+dXZfY2FudmFzX2luZGV4ID0gLTE7CisJCX0KKwl9CisJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQlVGTUdSLCAiJXMgb2ssIHVzZWRfYnVmX251bSA9ICVkXG4iLAorCQlfX2Z1bmNfXywgaHctPnVzZWRfYnVmX251bSk7CisKK30KKworc3RhdGljIHZvaWQgaW5pdF9waWNfbGlzdF9odyhzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJaW50IGk7CisJc3RydWN0IEFWMV9Db21tb25fcyAqY20gPSAmaHctPmNvbW1vbjsKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljX2NvbmZpZzsKKwkvKldSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0NPTkZfQUREUiwgMHgwKTsqLworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0NPTkZfQUREUiwKKwkJKDB4MSA8PCAxKSB8ICgweDEgPDwgMikpOworCisKKwlmb3IgKGkgPSAwOyBpIDwgaHctPnVzZWRfYnVmX251bTsgaSsrKSB7CisJCXBpY19jb25maWcgPSAmY20tPmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzW2ldLmJ1ZjsKKwkJaWYgKHBpY19jb25maWctPmluZGV4IDwgMCkKKwkJCWJyZWFrOworCisJCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWEwpICYmCisJCQkoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSAhPSAweDEwKSkgeworCQkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DMkFYSV9UQkxfREFUQSwKKwkJCQlwaWNfY29uZmlnLT5oZWFkZXJfYWRyID4+IDUpOworCQl9IGVsc2UgeworCQkJLypXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9DTURfQUREUiwKKwkJCSAqCXBpY19jb25maWctPm1jX3lfYWRyCisJCQkgKgl8IChwaWNfY29uZmlnLT5tY19jYW52YXNfeSA8PCA4KSB8IDB4MSk7CisJCQkgKi8KKwkJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0RBVEEsCisJCQkJcGljX2NvbmZpZy0+ZHdfeV9hZHIgPj4gNSk7CisJCX0KKyNpZm5kZWYgTE9TTEVTU19DT01QUkVTU19NT0RFCisJCS8qV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DMkFYSV9UQkxfQ01EX0FERFIsCisJCSAqCXBpY19jb25maWctPm1jX3Vfdl9hZHIKKwkJICoJfCAocGljX2NvbmZpZy0+bWNfY2FudmFzX3VfdiA8PCA4KXwgMHgxKTsKKwkJICovCisJCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9EQVRBLAorCQkJCXBpY19jb25maWctPmR3X3Vfdl9hZHIgPj4gNSk7CisjZWxzZQorCQlpZiAocGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDEwKSB7CisJCQkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DMkFYSV9UQkxfREFUQSwKKwkJCQlwaWNfY29uZmlnLT5kd191X3ZfYWRyID4+IDUpOworCQl9CisjZW5kaWYKKwl9CisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DMkFYSV9UQkxfQ09ORl9BRERSLCAweDEpOworCisjaWZkZWYgQ0hBTkdFX1JFTU9WRUQKKwkvKlplcm8gb3V0IGNhbnZhcyByZWdpc3RlcnMgaW4gSVBQIC0tIGF2b2lkIHNpbXVsYXRpb24gWCovCisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwKKwkJCSgwIDw8IDgpIHwgKDAgPDwgMSkgfCAxKTsKKyNlbHNlCisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwKKwkJCSgxIDw8IDgpIHwgKDAgPDwgMSkgfCAxKTsKKyNlbmRpZgorCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUiwgMCk7Cit9CisKKworc3RhdGljIHZvaWQgZHVtcF9waWNfbGlzdChzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJc3RydWN0IEFWMV9Db21tb25fcyAqY29uc3QgY20gPSAmaHctPmNvbW1vbjsKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljX2NvbmZpZzsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgRlJBTUVfQlVGRkVSUzsgaSsrKSB7CisJCXBpY19jb25maWcgPSAmY20tPmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzW2ldLmJ1ZjsKKwkJYXYxX3ByaW50KGh3LCAwLAorCQkJIkJ1ZiglZCkgaW5kZXggJWQgbXZfYnVmX2luZGV4ICVkIHJlZl9jb3VudCAlZCB2Zl9yZWYgJWQgcmVwZWF0X2NvdW50ICVkIGRlY19pZHggJWQgc2xpY2VfdHlwZSAlZCB3L2ggJWQvJWQgYWRyJWxkXG4iLAorCQkJaSwKKwkJCXBpY19jb25maWctPmluZGV4LAorI2lmbmRlZiBNVl9VU0VfRklYRURfQlVGCisJCQlwaWNfY29uZmlnLT5tdl9idWZfaW5kZXgsCisjZWxzZQorCQkJLTEsCisjZW5kaWYKKwkJCWNtLT5idWZmZXJfcG9vbC0+CisJCQlmcmFtZV9idWZzW2ldLnJlZl9jb3VudCwKKwkJCXBpY19jb25maWctPnZmX3JlZiwKKwkJCXBpY19jb25maWctPnJlcGVhdF9jb3VudCwKKwkJCXBpY19jb25maWctPmRlY29kZV9pZHgsCisJCQlwaWNfY29uZmlnLT5zbGljZV90eXBlLAorCQkJcGljX2NvbmZpZy0+eV9jcm9wX3dpZHRoLAorCQkJcGljX2NvbmZpZy0+eV9jcm9wX2hlaWdodCwKKwkJCXBpY19jb25maWctPmNtYV9hbGxvY19hZGRyCisJCQkpOworCX0KKwlyZXR1cm47Cit9CisKK3ZvaWQgYXYxX3JlbGVhc2VfYnVmKEFWMURlY29kZXIgKnBiaSwgUmVmQ250QnVmZmVyICpjb25zdCBidWYpCit7CisKKyNpZiAwCisJLy9kZWYgQ0hBTkdFX0RPTkUKKwlzdHJ1Y3QgQVYxSFdfcyAqaHcgPSAoc3RydWN0IEFWMUhXX3MgKikocGJpLT5wcml2YXRlX2RhdGEpOworCWlmICghaHctPm1tdV9lbmFibGUpCisJCXJldHVybjsKKwkvL3JlbGVhc2VfYnVmZmVyXzRrKCZhdjFfbW11bWdyX20sIGJ1Zi0+YnVmLmluZGV4KTsKKwlkZWNvZGVyX21tdV9ib3hfZnJlZV9pZHgoaHctPm1tdV9ib3gsIGJ1Zi0+YnVmLmluZGV4KTsKKyNpZmRlZiBBT01fQVYxX01NVV9EVworCS8vcmVsZWFzZV9idWZmZXJfNGsoJmF2MV9tbXVtZ3JfZHcsIGJ1Zi0+YnVmLmluZGV4KTsKKwlkZWNvZGVyX21tdV9ib3hfZnJlZV9pZHgoaHctPm1tdV9ib3hfZHcsIGJ1Zi0+YnVmLmluZGV4KTsKKyNlbmRpZgorCisjZW5kaWYKK30KKwordm9pZCBhdjFfcmVsZWFzZV9idWZzKHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlBVjFfQ09NTU9OICpjbSA9ICZody0+Y29tbW9uOworCVJlZkNudEJ1ZmZlciAqY29uc3QgZnJhbWVfYnVmcyA9IGNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmczsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBGUkFNRV9CVUZGRVJTOyArK2kpIHsKKwkJaWYgKGZyYW1lX2J1ZnNbaV0uYnVmLnZmX3JlZiA9PSAwICYmCisJCQlmcmFtZV9idWZzW2ldLnJlZl9jb3VudCA9PSAwICYmCisJCQlmcmFtZV9idWZzW2ldLmJ1Zi5pbmRleCA+PSAwKSB7CisJCQlpZiAoZnJhbWVfYnVmc1tpXS5idWYuYXV4X2RhdGFfYnVmKQorCQkJCXJlbGVhc2VfYXV4X2RhdGEoaHcsICZmcmFtZV9idWZzW2ldLmJ1Zik7CisJCX0KKwl9Cit9CisKKyNpZmRlZiBERUJVR19DTUQKK3N0YXRpYyB2b2lkIGRfZmlsbF96ZXJvKHN0cnVjdCBBVjFIV19zICpodywgdW5zaWduZWQgaW50IHBoeWFkciwgaW50IHNpemUpCit7CisJV1JJVEVfVlJFRyhIRVZDX0RCR19MT0dfQURSLCBwaHlhZHIpOworCVdSSVRFX1ZSRUcoREVCVUdfUkVHMSwKKwkJMHgyMDAwMDAwMCB8IHNpemUpOworCWRlYnVnX2NtZF93YWl0X2NvdW50ID0gMDsKKwlkZWJ1Z19jbWRfd2FpdF90eXBlID0gMTsKKwl3aGlsZSAoKFJFQURfVlJFRyhERUJVR19SRUcxKSAmIDB4MSkgPT0gMAorCQkmJiBkZWJ1Z19jbWRfd2FpdF9jb3VudCA8IDB4N2ZmZmZmZmYpIHsKKwkJZGVidWdfY21kX3dhaXRfY291bnQrKzsKKwl9CisKKwlXUklURV9WUkVHKERFQlVHX1JFRzEsIDApOworCWRlYnVnX2NtZF93YWl0X3R5cGUgPSAwOworfQorCitzdGF0aWMgdm9pZCBkX2R1bXAoc3RydWN0IEFWMUhXX3MgKmh3LCB1bnNpZ25lZCBpbnQgcGh5YWRyLCBpbnQgc2l6ZSwKKwlzdHJ1Y3QgZmlsZSAqZnAsIGxvZmZfdCAqd3Jfb2ZmKQoreworCisJaW50IGpqOworCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSAodW5zaWduZWQgY2hhciAqKQorCQkoaHctPnVjb2RlX2xvZ19hZGRyKTsKKwlXUklURV9WUkVHKEhFVkNfREJHX0xPR19BRFIsIGh3LT51Y29kZV9sb2dfcGh5X2FkZHIpOworCisJV1JJVEVfVlJFRyhIRVZDX0RfQURSLCBwaHlhZHIpOworCVdSSVRFX1ZSRUcoREVCVUdfUkVHMSwKKwkJMHgxMDAwMDAwMCB8IHNpemUpOworCisJZGVidWdfY21kX3dhaXRfY291bnQgPSAwOworCWRlYnVnX2NtZF93YWl0X3R5cGUgPSAzOworCXdoaWxlICgoUkVBRF9WUkVHKERFQlVHX1JFRzEpICYgMHgxKSA9PSAwCisJCSYmIGRlYnVnX2NtZF93YWl0X2NvdW50IDwgMHg3ZmZmZmZmZikgeworCQlkZWJ1Z19jbWRfd2FpdF9jb3VudCsrOworCX0KKworCWlmIChmcCkgeworCQl2ZnNfd3JpdGUoZnAsIGRhdGEsCisJCQlzaXplLCB3cl9vZmYpOworCisJfSBlbHNlIHsKKwkJZm9yIChqaiA9IDA7IGpqIDwgc2l6ZTsgamorKykgeworCQkJaWYgKChqaiAmIDB4ZikgPT0gMCkKKwkJCQlhdjFfcHJpbnQoaHcsIDAsCisJCQkJCSIlMDZ4OiIsIGpqKTsKKwkJCWF2MV9wcmludF9jb250KGh3LCAwLAorCQkJCSIlMDJ4ICIsIGRhdGFbampdKTsKKwkJCWlmICgoKGpqICsgMSkgJiAweGYpID09IDApCisJCQkJYXYxX3ByaW50X2NvbnQoaHcsIDAsCisJCQkJCSJcbiIpOworCQl9CisJCWF2MV9wcmludChodywgMCwgIlxuIik7CisJfQorCisJV1JJVEVfVlJFRyhERUJVR19SRUcxLCAwKTsKKwlkZWJ1Z19jbWRfd2FpdF90eXBlID0gMDsKKworfQorCitzdGF0aWMgdm9pZCBtdl9idWZmZXJfZmlsbF96ZXJvKHN0cnVjdCBBVjFIV19zICpodywgc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnBpY19jb25maWcpCit7CisJcHJfaW5mbygiZmlsbCBkdW1teSBkYXRhIHBpYyBpbmRleCAlZCBjb2xvY2F0ZSBhZGRyZXNlcyAleCBzaXplICV4XG4iLAorCQlwaWNfY29uZmlnLT5pbmRleCwgcGljX2NvbmZpZy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkciwKKwkJaHctPm1fbXZfQlVGW3BpY19jb25maWctPm12X2J1Zl9pbmRleF0uc2l6ZSk7CisJZF9maWxsX3plcm8oaHcsIHBpY19jb25maWctPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIsCisJCWh3LT5tX212X0JVRltwaWNfY29uZmlnLT5tdl9idWZfaW5kZXhdLnNpemUpOworfQorCitzdGF0aWMgdm9pZCBkdW1wX212X2J1ZmZlcihzdHJ1Y3QgQVYxSFdfcyAqaHcsIHN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpwaWNfY29uZmlnKQoreworCisJdW5zaWduZWQgaW50IGFkciwgc2l6ZTsKKwl1bnNpZ25lZCBpbnQgYWRyX2VuZCA9IHBpY19jb25maWctPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIgKworCQlody0+bV9tdl9CVUZbcGljX2NvbmZpZy0+bXZfYnVmX2luZGV4XS5zaXplOworCW1tX3NlZ21lbnRfdCBvbGRfZnM7CisJbG9mZl90IG9mZiA9IDA7CisJaW50IG1vZGUgPSBPX0NSRUFUIHwgT19XUk9OTFkgfCBPX1RSVU5DOworCWNoYXIgZmlsZVs2NF07CisJc3RydWN0IGZpbGUgKmZwOworCXNwcmludGYoJmZpbGVbMF0sICIvZGF0YS90bXAvY29sb2NhdGUlZCIsIGh3LT5mcmFtZV9jb3VudC0xKTsKKwlmcCA9IGZpbHBfb3BlbihmaWxlLCBtb2RlLCAwNjY2KTsKKwlvbGRfZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwlmb3IgKGFkciA9IHBpY19jb25maWctPm1wcmVkX212X3dyX3N0YXJ0X2FkZHI7CisJCWFkciA8IGFkcl9lbmQ7CisJCWFkciArPSBVQ09ERV9MT0dfQlVGX1NJWkUpIHsKKwkJc2l6ZSA9IFVDT0RFX0xPR19CVUZfU0laRTsKKwkJaWYgKHNpemUgPiAoYWRyX2VuZCAtIGFkcikpCisJCQlzaXplID0gYWRyX2VuZCAtIGFkcjsKKwkJcHJfaW5mbygiZHVtcCBwaWMgaW5kZXggJWQgY29sb2NhdGUgYWRkcmVzZXMgJXggc2l6ZSAleFxuIiwKKwkJCXBpY19jb25maWctPmluZGV4LCBhZHIsIHNpemUpOworCQlkX2R1bXAoaHcsIGFkciwgc2l6ZSwgZnAsICZvZmYpOworCX0KKwlzZXRfZnMob2xkX2ZzKTsKKwl2ZnNfZnN5bmMoZnAsIDApOworCisJZmlscF9jbG9zZShmcCwgY3VycmVudC0+ZmlsZXMpOworfQorCisjZW5kaWYKKworc3RhdGljIGludCBjb25maWdfcGljX3NpemUoc3RydWN0IEFWMUhXX3MgKmh3LCB1bnNpZ25lZCBzaG9ydCBiaXRfZGVwdGgpCit7CisJdWludDMyX3QgZGF0YTMyOworCXN0cnVjdCBBVjFfQ29tbW9uX3MgKmNtID0gJmh3LT5jb21tb247CisJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKmN1cl9waWNfY29uZmlnID0gJmNtLT5jdXJfZnJhbWUtPmJ1ZjsKKwlpbnQgbG9zbGVzc19jb21wX2hlYWRlcl9zaXplLCBsb3NsZXNzX2NvbXBfYm9keV9zaXplOworI2lmZGVmIEFPTV9BVjFfTU1VX0RXCisJaW50IGxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZV9kdywgbG9zbGVzc19jb21wX2JvZHlfc2l6ZV9kdzsKKyNlbmRpZgorICAgIGF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCSIJIyMjIyBjb25maWdfcGljX3NpemUgIyMjIywgYml0X2RlcHRoID0gJWRcbiIsIGJpdF9kZXB0aCk7CisKKwlmcmFtZV93aWR0aCA9IGN1cl9waWNfY29uZmlnLT55X2Nyb3Bfd2lkdGg7CisJZnJhbWVfaGVpZ2h0ID0gY3VyX3BpY19jb25maWctPnlfY3JvcF9oZWlnaHQ7CisJY3VyX3BpY19jb25maWctPmJpdF9kZXB0aCA9IGJpdF9kZXB0aDsKKwljdXJfcGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGUgPSBnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpOworCisJLyogdXNlIGZpeGVkIG1heGltdW0gc2l6ZSAgIC8vIDEyOHgxMjgvNC80KjMtYml0cyA9IDM4NCBCeXRlcworICAgIHNlZ19tYXBfc2l6ZSA9CisJKChmcmFtZV93aWR0aCArIDEyNykgPj4gNykgKiAoKGZyYW1lX2hlaWdodCArIDEyNykgPj4gNykgKiAzODQgOworCSovCisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9QSUNUVVJFX1NJWkUsCisJCShmcmFtZV9oZWlnaHQgPDwgMTYpIHwgZnJhbWVfd2lkdGgpOworI2lmZGVmIERVQUxfREVDT0RFCisjZWxzZQorCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfUElDX1NJWkVfRkJfUkVBRCwKKwkJKGZyYW1lX2hlaWdodCA8PCAxNikgfCBmcmFtZV93aWR0aCk7CisjZW5kaWYKKyNpZmRlZiBBT01fQVYxX01NVQorCisgIC8vYWxsb2NfbW11KCZhdjFfbW11bWdyX20sIGNtLT5jdXJfZnJhbWUtPmJ1Zi5pbmRleCwgZnJhbWVfd2lkdGgsIGZyYW1lX2hlaWdodCwgIGJpdF9kZXB0aCk7CisjZW5kaWYKKyNpZmRlZiBBT01fQVYxX01NVV9EVworCisgIC8vYWxsb2NfbW11KCZhdjFfbW11bWdyX2R3LCBjbS0+Y3VyX2ZyYW1lLT5idWYuaW5kZXgsIGZyYW1lX3dpZHRoLCBmcmFtZV9oZWlnaHQsICBiaXRfZGVwdGgpOworICAgIGxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZV9kdyA9CisJCWNvbXB1dGVfbG9zbGVzc19jb21wX2hlYWRlcl9zaXplX2R3KGZyYW1lX3dpZHRoLCBmcmFtZV9oZWlnaHQpOworICAgIGxvc2xlc3NfY29tcF9ib2R5X3NpemVfZHcgPQorCQljb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemVfZHcoZnJhbWVfd2lkdGgsIGZyYW1lX2hlaWdodCwKKwkJCShiaXRfZGVwdGggPT0gQU9NX0JJVFNfMTApKTsKKyNlbmRpZgorCisgICAgbG9zbGVzc19jb21wX2hlYWRlcl9zaXplID0KKwkJY29tcHV0ZV9sb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUKKwkJKGZyYW1lX3dpZHRoLCBmcmFtZV9oZWlnaHQpOworICAgIGxvc2xlc3NfY29tcF9ib2R5X3NpemUgPQorCQljb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemUoZnJhbWVfd2lkdGgsCisJCWZyYW1lX2hlaWdodCwgKGJpdF9kZXB0aCA9PSBBT01fQklUU18xMCkpOworCisJY3VyX3BpY19jb25maWctPmNvbXBfYm9keV9zaXplID0gbG9zbGVzc19jb21wX2JvZHlfc2l6ZTsKKworCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCSIlczogd2lkdGggJWQgaGVpZ2h0ICVkIGRlcHRoICVkIGhlYWRfc2l6ZSAweCV4IGJvZHlfc2l6ZSAweCV4XHJcbiIsCisJCV9fZnVuY19fLCBmcmFtZV93aWR0aCwgZnJhbWVfaGVpZ2h0LCBiaXRfZGVwdGgsCisJCWxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSwgbG9zbGVzc19jb21wX2JvZHlfc2l6ZSk7CisjaWZkZWYgTE9TTEVTU19DT01QUkVTU19NT0RFCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkw1KTsKKwlpZiAoYml0X2RlcHRoID09IEFPTV9CSVRTXzEwKQorCQlkYXRhMzIgJj0gfigxPDw5KTsKKwllbHNlCisJCWRhdGEzMiB8PSAoMTw8OSk7CisKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw1LCBkYXRhMzIpOworCisJaWYgKChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTCkgJiYKKwkJKGdldF9kb3VibGVfd3JpdGVfbW9kZShodykgIT0gMHgxMCkpIHsKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDEsKDB4MTw8IDQpKTsgLy8gYml0WzRdIDogcGFnZWRfbWVtX21vZGUKKwl9IGVsc2UgeworCQlpZiAoYml0X2RlcHRoID09IEFPTV9CSVRTXzEwKQorCQkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDEsICgwPDwzKSk7IC8vIGJpdFszXSBzbWVtIG1kb2UKKwkJZWxzZQorCQkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDEsICgxPDwzKSk7IC8vIGJpdFszXSBzbWVtIG1kb2UKKwl9CisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDIsCisJCShsb3NsZXNzX2NvbXBfYm9keV9zaXplID4+IDUpKTsKKwkvKgorCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwzLAorCSgweGZmPDwyMCkgfCAoMHhmZjw8MTApIHwgMHhmZik7IC8vOC1iaXQgbW9kZQorCSovCisJV1JJVEVfVlJFRyhIRVZDX0NNX0JPRFlfTEVOR1RILAorCQlsb3NsZXNzX2NvbXBfYm9keV9zaXplKTsKKwlXUklURV9WUkVHKEhFVkNfQ01fSEVBREVSX09GRlNFVCwKKwkJbG9zbGVzc19jb21wX2JvZHlfc2l6ZSk7CisJV1JJVEVfVlJFRyhIRVZDX0NNX0hFQURFUl9MRU5HVEgsCisJCWxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSk7CisKKwlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSAmIDB4MTApCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLCAweDEgPDwgMzEpOworCisjZWxzZQorCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLDB4MSA8PCAzMSk7CisjZW5kaWYKKyNpZmRlZiBBT01fQVYxX01NVV9EVworICAgIGlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpICYgMHgyMCkgeworCQlXUklURV9WUkVHKEhFVkNfQ01fQk9EWV9MRU5HVEgyLCBsb3NsZXNzX2NvbXBfYm9keV9zaXplX2R3KTsKKwkJV1JJVEVfVlJFRyhIRVZDX0NNX0hFQURFUl9PRkZTRVQyLCBsb3NsZXNzX2NvbXBfYm9keV9zaXplX2R3KTsKKwkJV1JJVEVfVlJFRyhIRVZDX0NNX0hFQURFUl9MRU5HVEgyLCBsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemVfZHcpOworCX0KKyNlbmRpZgorICAgIHJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQgY29uZmlnX21jX2J1ZmZlcihzdHJ1Y3QgQVYxSFdfcyAqaHcsIHVuc2lnbmVkIHNob3J0IGJpdF9kZXB0aCwgdW5zaWduZWQgY2hhciBpbnRlcl9mbGFnKQoreworCWludDMyX3QgaTsKKwlBVjFfQ09NTU9OICpjbSA9ICZody0+Y29tbW9uOworCVBJQ19CVUZGRVJfQ09ORklHKiBjdXJfcGljX2NvbmZpZyA9ICZjbS0+Y3VyX2ZyYW1lLT5idWY7CisJdWludDhfdCBzY2FsZV9lbmFibGUgPSAwOworCisJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJIiAjIyMjIGNvbmZpZ19tY19idWZmZXIgJXMgIyMjI1xuIiwKKwkJaW50ZXJfZmxhZyA/ICJpbnRlciIgOiAiaW50cmEiKTsKKworI2lmZGVmIERFQlVHX1BSSU5UCisJaWYgKGRlYnVnJkFPTV9BVjFfREVCVUdfQlVGTUdSKQorCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkJImNvbmZpZ19tY19idWZmZXIgZW50ZXJlZCAuLi4uLlxuIik7CisjZW5kaWYKKworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfQUNDQ09ORklHX0FERFIsCisJCSgwIDw8IDgpIHwgKDA8PDEpIHwgMSk7CisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIsCisJCShjdXJfcGljX2NvbmZpZy0+b3JkZXJfaGludDw8MjQpIHwKKwkJKGN1cl9waWNfY29uZmlnLT5tY19jYW52YXNfdV92PDwxNikgfAorCQkoY3VyX3BpY19jb25maWctPm1jX2NhbnZhc191X3Y8PDgpfAorCQljdXJfcGljX2NvbmZpZy0+bWNfY2FudmFzX3kpOworCWZvciAoaSA9IExBU1RfRlJBTUU7IGkgPD0gQUxUUkVGX0ZSQU1FOyBpKyspIHsKKwkJUElDX0JVRkZFUl9DT05GSUcgKnBpY19jb25maWc7IC8vY20tPmZyYW1lX3JlZnNbaV0uYnVmOworCQlpZiAoaW50ZXJfZmxhZykKKwkJCXBpY19jb25maWcgPSBhdjFfZ2V0X3JlZl9mcmFtZV9zcGVjX2J1ZihjbSwgaSk7CisJCWVsc2UKKwkJCXBpY19jb25maWcgPSBjdXJfcGljX2NvbmZpZzsKKwkJaWYgKHBpY19jb25maWcpIHsKKwkJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSLAorCQkJCShwaWNfY29uZmlnLT5vcmRlcl9oaW50PDwyNCkgfAorCQkJCShwaWNfY29uZmlnLT5tY19jYW52YXNfdV92PDwxNikgfAorCQkJCShwaWNfY29uZmlnLT5tY19jYW52YXNfdV92PDw4KSB8CisJCQkJcGljX2NvbmZpZy0+bWNfY2FudmFzX3kpOworCQkJaWYgKGludGVyX2ZsYWcpCisJCQkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJCQkicmVmaWQgMHgleCBtY19jYW52YXNfdV92IDB4JXggbWNfY2FudmFzX3kgMHgleCBvcmRlcl9oaW50IDB4JXhcbiIsCisJCQkJaSwgcGljX2NvbmZpZy0+bWNfY2FudmFzX3VfdiwKKwkJCQlwaWNfY29uZmlnLT5tY19jYW52YXNfeSwgcGljX2NvbmZpZy0+b3JkZXJfaGludCk7CisJCX0gZWxzZSB7CisJCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUiwgMCk7CisJCX0KKwl9CisKKwlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0FDQ0NPTkZJR19BRERSLAorCQkoMTYgPDwgOCkgfCAoMCA8PCAxKSB8IDEpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSLAorCQkoY3VyX3BpY19jb25maWctPm9yZGVyX2hpbnQgPDwgMjQpIHwKKwkJKGN1cl9waWNfY29uZmlnLT5tY19jYW52YXNfdV92IDw8IDE2KSB8CisJCShjdXJfcGljX2NvbmZpZy0+bWNfY2FudmFzX3VfdiA8PCA4KSB8CisJCWN1cl9waWNfY29uZmlnLT5tY19jYW52YXNfeSk7CisJZm9yIChpID0gTEFTVF9GUkFNRTsgaSA8PSBBTFRSRUZfRlJBTUU7IGkrKykgeworCQlQSUNfQlVGRkVSX0NPTkZJRyAqcGljX2NvbmZpZzsKKwkJaWYgKGludGVyX2ZsYWcpCisJCQlwaWNfY29uZmlnID0gYXYxX2dldF9yZWZfZnJhbWVfc3BlY19idWYoY20sIGkpOworCQllbHNlCisJCQlwaWNfY29uZmlnID0gY3VyX3BpY19jb25maWc7CisKKwkJaWYgKHBpY19jb25maWcpIHsKKwkJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSLAorCQkJKHBpY19jb25maWctPm9yZGVyX2hpbnQgPDwgMjQpfAorCQkJKHBpY19jb25maWctPm1jX2NhbnZhc191X3YgPDwgMTYpIHwKKwkJCShwaWNfY29uZmlnLT5tY19jYW52YXNfdV92IDw8IDgpIHwKKwkJCXBpY19jb25maWctPm1jX2NhbnZhc195KTsKKwkJfSBlbHNlIHsKKwkJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSLCAwKTsKKwkJfQorCX0KKworCVdSSVRFX1ZSRUcoQVYxRF9NUFBfUkVGSU5GT19UQkxfQUNDQ09ORklHLAorCQkoMHgxIDw8IDIpIHwgKDB4MCA8PDMpKTsgLy8gYXV0b19pbmMgc3RhcnQgaW5kZXg6MCBmaWVsZDowCisJZm9yIChpID0gMDsgaSA8PSBBTFRSRUZfRlJBTUU7IGkrKykgeworCQlpbnQzMl90IHJlZl9waWNfYm9keV9zaXplOworCQlzdHJ1Y3Qgc2NhbGVfZmFjdG9ycyAqIHNmID0gTlVMTDsKKwkJUElDX0JVRkZFUl9DT05GSUcgKnBpY19jb25maWc7CisKKwkJaWYgKGludGVyX2ZsYWcgJiYgaSA+PSBMQVNUX0ZSQU1FKQorCQkJcGljX2NvbmZpZyA9IGF2MV9nZXRfcmVmX2ZyYW1lX3NwZWNfYnVmKGNtLCBpKTsKKwkJZWxzZQorCQkJcGljX2NvbmZpZyA9IGN1cl9waWNfY29uZmlnOworCisJCWlmIChwaWNfY29uZmlnKSB7CisJCQlyZWZfcGljX2JvZHlfc2l6ZSA9CisJCQkJY29tcHV0ZV9sb3NsZXNzX2NvbXBfYm9keV9zaXplKHBpY19jb25maWctPnlfY3JvcF93aWR0aCwKKwkJCXBpY19jb25maWctPnlfY3JvcF9oZWlnaHQsIChiaXRfZGVwdGggPT0gQU9NX0JJVFNfMTApKTsKKworCQkJV1JJVEVfVlJFRyhBVjFEX01QUF9SRUZJTkZPX0RBVEEsIHBpY19jb25maWctPnlfY3JvcF93aWR0aCk7CisJCQlXUklURV9WUkVHKEFWMURfTVBQX1JFRklORk9fREFUQSwgcGljX2NvbmZpZy0+eV9jcm9wX2hlaWdodCk7CisJCQlpZiAoaW50ZXJfZmxhZyAmJiBpID49IExBU1RfRlJBTUUpIHsKKwkJCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkJCSJyZWZpZCAlZDogcmVmIHdpZHRoL2hlaWdodCglZCwlZCksIGN1ciB3aWR0aC9oZWlnaHQoJWQsJWQpIHJlZl9waWNfYm9keV9zaXplIDB4JXhcbiIsCisJCQkJaSwgcGljX2NvbmZpZy0+eV9jcm9wX3dpZHRoLCBwaWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0LAorCQkJCWN1cl9waWNfY29uZmlnLT55X2Nyb3Bfd2lkdGgsIGN1cl9waWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0LAorCQkJCXJlZl9waWNfYm9keV9zaXplKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJlZl9waWNfYm9keV9zaXplID0gMDsKKwkJCVdSSVRFX1ZSRUcoQVYxRF9NUFBfUkVGSU5GT19EQVRBLCAwKTsKKwkJCVdSSVRFX1ZSRUcoQVYxRF9NUFBfUkVGSU5GT19EQVRBLCAwKTsKKwkJfQorCisJCWlmIChpbnRlcl9mbGFnICYmIGkgPj0gTEFTVF9GUkFNRSkKKwkJCXNmID0gYXYxX2dldF9yZWZfc2NhbGVfZmFjdG9ycyhjbSwgaSk7CisKKwkJaWYgKChzZiAhPSBOVUxMKSAmJiBhdjFfaXNfc2NhbGVkKHNmKSkgeworCQkJc2NhbGVfZW5hYmxlIHw9ICgxIDw8IGkpOworCQl9CisKKwkJaWYgKHNmKSB7CisJCQlXUklURV9WUkVHKEFWMURfTVBQX1JFRklORk9fREFUQSwgc2YtPnhfc2NhbGVfZnApOworCQkJV1JJVEVfVlJFRyhBVjFEX01QUF9SRUZJTkZPX0RBVEEsIHNmLT55X3NjYWxlX2ZwKTsKKworCQkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJCSJ4X3NjYWxlX2ZwICVkLCB5X3NjYWxlX2ZwICVkXG4iLAorCQkJc2YtPnhfc2NhbGVfZnAsIHNmLT55X3NjYWxlX2ZwKTsKKwkJfSBlbHNlIHsKKwkJCVdSSVRFX1ZSRUcoQVYxRF9NUFBfUkVGSU5GT19EQVRBLCBSRUZfTk9fU0NBTEUpOyAvLzE8PDE0CisJCQlXUklURV9WUkVHKEFWMURfTVBQX1JFRklORk9fREFUQSwgUkVGX05PX1NDQUxFKTsKKwkJfQorCQlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hMKSAmJgorCQkJKGdldF9kb3VibGVfd3JpdGVfbW9kZShodykgIT0gMHgxMCkpIHsKKwkJCVdSSVRFX1ZSRUcoQVYxRF9NUFBfUkVGSU5GT19EQVRBLCAwKTsKKwkJfSBlbHNlCisJCQlXUklURV9WUkVHKEFWMURfTVBQX1JFRklORk9fREFUQSwgcmVmX3BpY19ib2R5X3NpemUgPj4gNSk7CisKKwl9CisJV1JJVEVfVlJFRyhBVjFEX01QUF9SRUZfU0NBTEVfRU5CTCwgc2NhbGVfZW5hYmxlKTsKKwlXUklURV9WUkVHKFBBUlNFUl9SRUZfU0NBTEVfRU5CTCwgc2NhbGVfZW5hYmxlKTsKKwlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkiV1JJVEVfVlJFRyhQQVJTRVJfUkVGX1NDQUxFX0VOQkwsIDB4JXgpXG4iLAorCQlzY2FsZV9lbmFibGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjbGVhcl9tcHJlZF9odyhzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJdW5zaWduZWQgaW50IGRhdGEzMjsKKworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX01QUkVEX0NUUkw0KTsKKwlkYXRhMzIgJj0gICh+KDEgPDwgNikpOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9DVFJMNCwgZGF0YTMyKTsKK30KKworc3RhdGljIHZvaWQgY29uZmlnX21wcmVkX2h3KHN0cnVjdCBBVjFIV19zICpodywgdW5zaWduZWQgY2hhciBpbnRlcl9mbGFnKQoreworCUFWMV9DT01NT04gKmNtID0gJmh3LT5jb21tb247CisJUElDX0JVRkZFUl9DT05GSUcgKmN1cl9waWNfY29uZmlnID0gJmNtLT5jdXJfZnJhbWUtPmJ1ZjsKKwkvL1BJQ19CVUZGRVJfQ09ORklHICpsYXN0X2ZyYW1lX3BpY19jb25maWcgPSBOVUxMOworCWludCBpLCBqLCBwb3MsIHJlZ19pOworCWludCBtdl9jYWxfdHBsX2NvdW50ID0gMDsKKwl1bnNpZ25lZCBpbnQgbXZfcmVmX2lkW01GTVZfU1RBQ0tfU0laRV0gPSB7MCwgMCwgMH07CisJdW5zaWduZWQgcmVmX29mZnNldF9yZWdbXSA9IHsKKwkJSEVWQ19NUFJFRF9MMF9SRUYwNl9QT0MsCisJCUhFVkNfTVBSRURfTDBfUkVGMDdfUE9DLAorCQlIRVZDX01QUkVEX0wwX1JFRjA4X1BPQywKKwkJSEVWQ19NUFJFRF9MMF9SRUYwOV9QT0MsCisJCUhFVkNfTVBSRURfTDBfUkVGMTBfUE9DLAorCQlIRVZDX01QUkVEX0wwX1JFRjExX1BPQywKKwl9OworCXVuc2lnbmVkIHJlZl9idWZfcmVnW10gPSB7CisJCUhFVkNfTVBSRURfTDBfUkVGMDNfUE9DLAorCQlIRVZDX01QUkVEX0wwX1JFRjA0X1BPQywKKwkJSEVWQ19NUFJFRF9MMF9SRUYwNV9QT0MKKwl9OworCXVuc2lnbmVkIHJlZl9vZmZzZXRfdmFsWzZdID0KKwkJezAsIDAsIDAsIDAsIDAsIDB9OworCXVuc2lnbmVkIHJlZl9idWZfdmFsWzNdID0gezAsIDAsIDB9OworCisJdWludDMyX3QgZGF0YTMyOworCWludDMyX3QgIG1wcmVkX2N1cnJfbGN1X3g7CisJaW50MzJfdCAgbXByZWRfY3Vycl9sY3VfeTsKKwkvL2ludDMyX3QgICAgIG1wcmVkX212X3JkX2VuZF9hZGRyOworCisJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkiICMjIyMgY29uZmlnX21wcmVkX2h3ICMjIyNcbiIpOworCisJLyppZiAoY20tPnByZXZfZnJhbWUpCisJbGFzdF9mcmFtZV9waWNfY29uZmlnID0gJmNtLT5wcmV2X2ZyYW1lLT5idWY7CisJbXByZWRfbXZfcmRfZW5kX2FkZHIgPSBsYXN0X2ZyYW1lX3BpY19jb25maWctPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIKKwkrIChsYXN0X2ZyYW1lX3BpY19jb25maWctPmxjdV90b3RhbCAqIE1WX01FTV9VTklUKTsKKwkqLworCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfTVBSRURfQ1VSUl9MQ1UpOworCW1wcmVkX2N1cnJfbGN1X3ggICA9ZGF0YTMyICYgMHhmZmZmOworCW1wcmVkX2N1cnJfbGN1X3kgICA9KGRhdGEzMj4+MTYpICYgMHhmZmZmOworCisJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkiY3VyIHBpYyBpbmRleCAlZFxuIiwgY3VyX3BpY19jb25maWctPmluZGV4KTsKKwkvKnByaW50aygiY3VyIHBpYyBpbmRleCAlZCAgY29sIHBpYyBpbmRleCAlZFxuIiwKKwljdXJfcGljX2NvbmZpZy0+aW5kZXgsIGxhc3RfZnJhbWVfcGljX2NvbmZpZy0+aW5kZXgpOyovCisKKwkvL1dSSVRFX1ZSRUcoSEVWQ19NUFJFRF9DVFJMMywweDI0MTIyNDEyKTsKKyNpZmRlZiBDT19NVl9DT01QUkVTUworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1RCkgeworCQlXUklURV9WUkVHKEhFVkNfTVBSRURfQ1RSTDMsMHgxMDE1MTAxNSk7IC8vICdkMTAsICdkMjEgZm9yIEFWMQorCX0gZWxzZSB7CisJCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9DVFJMMywweDEzMTUxMzE1KTsgLy8gJ2QxOSwgJ2QyMSBmb3IgQVYxCisJfQorI2Vsc2UKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfQ1RSTDMsMHgxMzE1MTMxNSk7IC8vICdkMTksICdkMjEgZm9yIEFWMQorI2VuZGlmCisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0FCVl9TVEFSVF9BRERSLAorCWh3LT5wYmktPndvcmtfc3BhY2VfYnVmLT5tcHJlZF9hYm92ZS5idWZfc3RhcnQpOworCisjaWYgMAorCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX01QUkVEX0NUUkw0KTsKKwlkYXRhMzIgJj0gICh+KDE8PDYpKTsKKwlkYXRhMzIgfD0gKGNtLT51c2VfcHJldl9mcmFtZV9tdnMgPDwgNik7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0NUUkw0LCBkYXRhMzIpOworI2VuZGlmCisJaWYgKGludGVyX2ZsYWcpIHsKKwkJLyogY29uZmlnIHNpZ25fYmlhcyAqLworCQkvL2RhdGEzMiA9IChjbS0+Y3VyX2ZyYW1lX2ZvcmNlX2ludGVnZXJfbXYgJiAweDEpIDw8IDk7CisJCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX01QUkVEX0NUUkw0KTsKKwkJZGF0YTMyICY9ICh+KDB4ZmYgPDwgMTIpKTsKKwkJLy9mb3IgKGkgPSBMQVNUX0ZSQU1FOyBpIDw9IEFMVFJFRl9GUkFNRTsgaSsrKSB7CisJCS8qIEhFVkNfTVBSRURfQ1RSTDRbYml0IDEyXSBpcyBmb3IgY20tPnJlZl9mcmFtZV9zaWduX2JpYXNbMF0KKwkJaW5zdGVhZCBvZiBjbS0+cmVmX2ZyYW1lX3NpZ25fYmlhc1tMQVNUX0ZSQU1FXSAqLworCQlmb3IgKGkgPSAwOyBpIDw9IEFMVFJFRl9GUkFNRTsgaSsrKSB7CisJCQlkYXRhMzIgfD0gKChjbS0+cmVmX2ZyYW1lX3NpZ25fYmlhc1tpXSAmIDB4MSkgPDwgKDEyICsgaSkpOworCQl9CisJCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9DVFJMNCwgZGF0YTMyKTsKKwkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJCSJXUklURV9WUkVHKEhFVkNfTVBSRURfQ1RSTDQsIDB4JXgpXG4iLCBkYXRhMzIpOworCX0KKyNpZiAxCisJZGF0YTMyID0gKChjbS0+c2VxX3BhcmFtcy5vcmRlcl9oaW50X2luZm8uZW5hYmxlX29yZGVyX2hpbnQgPDwgMjcpIHwKKwkJKGNtLT5zZXFfcGFyYW1zLm9yZGVyX2hpbnRfaW5mby5vcmRlcl9oaW50X2JpdHNfbWludXNfMSA8PCAyNCkgfAorCQkoY20tPmN1cl9mcmFtZS0+b3JkZXJfaGludCA8PCAxNiApKTsKKyNpZmRlZiBDT19NVl9DT01QUkVTUworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1RCkgeworCQlkYXRhMzIgfD0gKDB4MTAgPDwgOCkgfCAoMHgxMCA8PCAwKTsKKwl9IGVsc2UgeworCQlkYXRhMzIgfD0gKDB4MTMgPDwgOCkgfCAoMHgxMyA8PCAwKTsKKwl9CisjZWxzZQorCQlkYXRhMzIgfD0gKDB4MTMgPDwgOCkgfCAoMHgxMyA8PCAwKTsKKyNlbmRpZgorCisjZWxzZQorCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX01QUkVEX0wwX1JFRjAwX1BPQyk7CisJZGF0YTMyICY9ICh+KDB4ZmYgPDwgMTYpKTsKKwlkYXRhMzIgfD0gKGNtLT5jdXJfZnJhbWUtPm9yZGVyX2hpbnQgJiAweGZmKTsKKwlkYXRhMzIgJj0gKH4oMSA8PCAyNykpOworCWRhdGEzMiB8PSAoY20tPnNlcV9wYXJhbXMub3JkZXJfaGludF9pbmZvLmVuYWJsZV9vcmRlcl9oaW50IDw8IDI3KTsKKyNlbmRpZgorCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMF9SRUYwMF9QT0MsIGRhdGEzMik7CisJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkiV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wwX1JFRjAwX1BPQywgMHgleClcbiIsIGRhdGEzMik7CisKKwlpZiAoaW50ZXJfZmxhZykgeworCQkvKiBjb25maWcgcmVmX2J1ZiBpZCBhbmQgb3JkZXIgaGludCAqLworCQlkYXRhMzIgPSAwOworCQlwb3MgPSAyNTsKKwkJcmVnX2kgPSAwOworCQlmb3IgKGkgPSBBTFRSRUZfRlJBTUU7IGkgPj0gTEFTVF9GUkFNRTsgaS0tKSB7CisJCQkJUElDX0JVRkZFUl9DT05GSUcgKnBpY19jb25maWcgPQorCQkJCQlhdjFfZ2V0X3JlZl9mcmFtZV9zcGVjX2J1ZihjbSwgaSk7CisJCQlpZiAocGljX2NvbmZpZykgeworCQkJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCQkJCSJwaWNfY29uZmlnIGZvciAlZCB0aCByZWY6IGluZGV4ICVkLCByZWdbJWRdIHBvcyAlZFxuIiwKKwkJCQkJaSwgcGljX2NvbmZpZy0+aW5kZXgsIHJlZ19pLCBwb3MpOworCQkJCWRhdGEzMiB8PSAoKHBpY19jb25maWctPmluZGV4IDwgMCk/IDAgOiBwaWNfY29uZmlnLT5pbmRleCkgPDwgcG9zOworCQkJfSBlbHNlCisJCQkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJCQkicGljX2NvbmZpZyBpcyBudWxsIGZvciAlZCB0aCByZWZcbiIsIGkpOworCQkJaWYgKHBvcyA9PSAwKSB7CisJCQkJLy9XUklURV9WUkVHKHJlZl9idWZfcmVnW3JlZ19pXSwgZGF0YTMyKTsKKwkJCQlyZWZfYnVmX3ZhbFtyZWdfaV0gPSBkYXRhMzI7CisJCQkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJCQkicmVmX2J1Zl9yZWdbJWRdLCBXUklURV9WUkVHKDB4JXgsIDB4JXgpXG4iLAorCQkJCXJlZ19pLCByZWZfYnVmX3JlZ1tyZWdfaV0sIGRhdGEzMik7CisJCQkJcmVnX2krKzsKKwkJCQlkYXRhMzIgPSAwOworCQkJCXBvcyA9IDI0OyAvL2ZvciBQX0hFVkNfTVBSRURfTDBfUkVGMDRfUE9DCisJCQl9IGVsc2UgeworCQkJCWlmIChwb3MgPT0gMjQpCisJCQkJcG9zIC09IDg7IC8vZm9yIFBfSEVWQ19NUFJFRF9MMF9SRUYwNF9QT0MKKwkJCQllbHNlCisJCQkJcG9zIC09IDU7IC8vZm9yIFBfSEVWQ19NUFJFRF9MMF9SRUYwM19QT0MKKwkJCX0KKwkJfQorCQlmb3IgKGkgPSBBTFRSRUZfRlJBTUU7IGkgPj0gTEFTVF9GUkFNRTsgaS0tKSB7CisJCQlQSUNfQlVGRkVSX0NPTkZJRyAqcGljX2NvbmZpZyA9CisJCQkJYXYxX2dldF9yZWZfZnJhbWVfc3BlY19idWYoY20sIGkpOworCQkJaWYgKHBpY19jb25maWcpIHsKKwkJCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkJCQkicGljX2NvbmZpZyBmb3IgJWQgdGggcmVmOiBvcmRlcl9oaW50ICVkLCByZWdbJWRdIHBvcyAlZFxuIiwKKwkJCQkJaSwgcGljX2NvbmZpZy0+b3JkZXJfaGludCwgcmVnX2ksIHBvcyk7CisJCQkJZGF0YTMyIHw9ICgocGljX2NvbmZpZy0+aW5kZXggPCAwKT8gMCA6IHBpY19jb25maWctPm9yZGVyX2hpbnQpIDw8IHBvczsKKwkJCX0gZWxzZQorCQkJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCQkJInBpY19jb25maWcgaXMgbnVsbCBmb3IgJWQgdGggcmVmXG4iLCBpKTsKKwkJCWlmIChwb3MgPT0gMCkgeworCQkJCS8vV1JJVEVfVlJFRyhyZWZfYnVmX3JlZ1tyZWdfaV0sIGRhdGEzMik7CisJCQkJcmVmX2J1Zl92YWxbcmVnX2ldID0gZGF0YTMyOworCQkJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCQkJInJlZl9idWZfcmVnWyVkXSwgV1JJVEVfVlJFRygweCV4LCAweCV4KVxuIiwKKwkJCQlyZWdfaSwgcmVmX2J1Zl9yZWdbcmVnX2ldLCBkYXRhMzIpOworCQkJCXJlZ19pKys7CisJCQkJZGF0YTMyID0gMDsKKwkJCQlwb3MgPSAyNDsKKwkJCX0gZWxzZQorCQkJCXBvcyAtPSA4OworCQl9CisJCWlmIChwb3MgIT0gMjQpIHsKKwkJCS8vV1JJVEVfVlJFRyhyZWZfYnVmX3JlZ1tyZWdfaV0sIGRhdGEzMik7CisJCQlyZWZfYnVmX3ZhbFtyZWdfaV0gPSBkYXRhMzI7CisJCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkJCSJyZWZfYnVmX3JlZ1slZF0sIFdSSVRFX1ZSRUcoMHgleCwgMHgleClcbiIsCisJCQlyZWdfaSwgcmVmX2J1Zl9yZWdbcmVnX2ldLCBkYXRhMzIpOworCQl9CisJCS8qIGNvbmZpZyByZWZfb2Zmc2V0ICovCisJCWRhdGEzMiA9IDA7CisJCXBvcyA9IDI0OworCQltdl9jYWxfdHBsX2NvdW50ID0gMDsKKwkJcmVnX2kgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgY20tPm12X3JlZl9pZF9pbmRleDsgaSsrKSB7CisJCQlpZiAoY20tPm12X2NhbF90cGxfbXZzW2ldKSB7CisJCQkJbXZfcmVmX2lkW212X2NhbF90cGxfY291bnRdID0gY20tPm12X3JlZl9pZFtpXTsKKwkJCQltdl9jYWxfdHBsX2NvdW50Kys7CisJCQkJZm9yIChqID0gTEFTVF9GUkFNRTsgaiA8PSBBTFRSRUZfRlJBTUU7IGorKykgeworCQkJCQkvKm9mZnNldCBjYW4gYmUgbmVnYXRpdmUqLworCQkJCQl1bnNpZ25lZCBjaGFyIG9mZnZhbCA9CisJCQkJCQljbS0+bXZfcmVmX29mZnNldFtpXVtqXSAmIDB4ZmY7CisJCQkJCWRhdGEzMiB8PSAob2ZmdmFsIDw8IHBvcyk7CisJCQkJCWlmIChwb3MgPT0gMCkgeworCQkJCQkJLy9XUklURV9WUkVHKHJlZl9vZmZzZXRfcmVnW3JlZ19pXSwgZGF0YTMyKTsKKwkJCQkJCXJlZl9vZmZzZXRfdmFsW3JlZ19pXSA9IGRhdGEzMjsKKwkJCQkJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCQkJCQkicmVmX29mZnNldF9yZWdbJWRdLCBXUklURV9WUkVHKDB4JXgsIDB4JXgpXG4iLAorCQkJCQkJcmVnX2ksIHJlZl9vZmZzZXRfcmVnW3JlZ19pXSwgZGF0YTMyKTsKKwkJCQkJCXJlZ19pKys7CisJCQkJCQlkYXRhMzIgPSAwOworCQkJCQkJcG9zID0gMjQ7CisJCQkJCX0gZWxzZQorCQkJCQkJcG9zIC09IDg7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChwb3MgIT0gMjQpIHsKKwkJLy9XUklURV9WUkVHKHJlZl9vZmZzZXRfcmVnW3JlZ19pXSwgZGF0YTMyKTsKKwkJcmVmX29mZnNldF92YWxbcmVnX2ldID0gZGF0YTMyOworCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkicmVmX29mZnNldF9yZWdbJWRdLCBXUklURV9WUkVHKDB4JXgsIDB4JXgpXG4iLAorCQlyZWdfaSwgcmVmX29mZnNldF9yZWdbcmVnX2ldLCBkYXRhMzIpOworCQl9CisKKwkJZGF0YTMyID0gcmVmX29mZnNldF92YWxbNV0gfCAvL1JFQURfVlJFRyhIRVZDX01QUkVEX0wwX1JFRjExX1BPQykgfAorCQkJbXZfY2FsX3RwbF9jb3VudCB8IChtdl9yZWZfaWRbMF0gPDwgMikgfAorCQkJKG12X3JlZl9pZFsxXSA8PCA1KSB8IChtdl9yZWZfaWRbMl0gPDwgOCk7CisJCXJlZl9vZmZzZXRfdmFsWzVdID0gZGF0YTMyOworCQkvL1dSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMF9SRUYxMV9QT0MsIGRhdGEzMik7CisJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCQkiV1JJVEVfVlJFRyhIRVZDX01QUkVEX0wwX1JFRjExX1BPQyAweCV4LCAweCV4KVxuIiwKKwkJCUhFVkNfTVBSRURfTDBfUkVGMTFfUE9DLCBkYXRhMzIpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQlXUklURV9WUkVHKHJlZl9idWZfcmVnW2ldLCByZWZfYnVmX3ZhbFtpXSk7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJV1JJVEVfVlJFRyhyZWZfb2Zmc2V0X3JlZ1tpXSwgcmVmX29mZnNldF92YWxbaV0pOworCisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX01WX1dSX1NUQVJUX0FERFIsCisJCWN1cl9waWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfV1BUUiwKKwkJY3VyX3BpY19jb25maWctPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIpOworCisJaWYgKGludGVyX2ZsYWcpIHsKKwkJZm9yIChpID0gMDsgaSA8IG12X2NhbF90cGxfY291bnQ7IGkrKykgeworCQkJUElDX0JVRkZFUl9DT05GSUcgKnBpY19jb25maWcgPQorCQkJYXYxX2dldF9yZWZfZnJhbWVfc3BlY19idWYoY20sIG12X3JlZl9pZFtpXSk7CisJCQlpZiAocGljX2NvbmZpZyA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGkgPT0gMCkgeworCQkJCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9NVl9SRF9TVEFSVF9BRERSLAorCQkJCQlwaWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyKTsKKwkJCQlXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfUlBUUiwKKwkJCQkJcGljX2NvbmZpZy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkcik7CisJCQl9IGVsc2UgaWYgKGkgPT0gMSkgeworCQkJCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9MMF9SRUYwMV9QT0MsCisJCQkJCXBpY19jb25maWctPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIpOworCQkJCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9NVl9SUFRSXzEsCisJCQkJCXBpY19jb25maWctPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIpOworCQkJfSBlbHNlIGlmIChpID09IDIpIHsKKwkJCQlXUklURV9WUkVHKEhFVkNfTVBSRURfTDBfUkVGMDJfUE9DLAorCQkJCQlwaWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyKTsKKwkJCQlXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfUlBUUl8yLAorCQkJCQlwaWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyKTsKKwkJCX0gZWxzZSB7CisJCQkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJCQkJIiVzOiBtdl9yZWZfaWQgZXJyb3JcbiIsIF9fZnVuY19fKTsKKwkJCX0KKwkJfQorCX0KKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19NUFJFRF9DVFJMMCk7CisJZGF0YTMyICY9IH4oKDEgPDwgMTApIHwgKDEgPDwgMTEpKTsKKwlkYXRhMzIgfD0gKDEgPDwgMTApOyAvKndyaXRlIGVuYWJsZSovCisJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJImN1cnJlbnRfZnJhbWUuZnJhbWVfdHlwZT0lZCwgY3VyX2ZyYW1lLT5mcmFtZV90eXBlPSVkLCBhbGxvd19yZWZfZnJhbWVfbXZzPSVkXG4iLAorCQljbS0+Y3VycmVudF9mcmFtZS5mcmFtZV90eXBlLCBjbS0+Y3VyX2ZyYW1lLT5mcmFtZV90eXBlLAorCQljbS0+YWxsb3dfcmVmX2ZyYW1lX212cyk7CisKKwlpZiAoYXYxX2ZyYW1lX2lzX2ludGVyKCZody0+Y29tbW9uKSkgeworCQlpZiAoY20tPmFsbG93X3JlZl9mcmFtZV9tdnMpIHsKKwkJCWRhdGEzMiB8PSAoMSA8PCAxMSk7IC8qcmVhZCBlbmFibGUqLworCQl9CisJfQorCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCSJXUklURV9WUkVHKEhFVkNfTVBSRURfQ1RSTDAgMHgleCwgMHgleClcbiIsCisJCUhFVkNfTVBSRURfQ1RSTDAsIGRhdGEzMik7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0NUUkwwLCBkYXRhMzIpOworCS8qCisJcHJpbnRrKCJjb25maWdfbXByZWQ6ICgleCkgd3Jfc3RhcnRfYWRkciAgJXggZnJvbSBpbmR4ICVkOworCQkoJXgpIHJkX3N0YXJ0X2FkZHIgJXggZnJvbSBpbmRleCAlZFxuIiwKKwkJY3VyX3BpY19jb25maWcsICBjdXJfcGljX2NvbmZpZy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkciwgIGN1cl9waWNfY29uZmlnLT5pbmRleCwKKwlsYXN0X2ZyYW1lX3BpY19jb25maWcsICBsYXN0X2ZyYW1lX3BpY19jb25maWctPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIsICBsYXN0X2ZyYW1lX3BpY19jb25maWctPmluZGV4KTsKKwlkYXRhMzIgPSAoKHBiaS0+bGN1X3hfbnVtIC0gcGJpLT50aWxlX3dpZHRoX2xjdSkqTVZfTUVNX1VOSVQpOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9NVl9XUl9ST1dfSlVNUCxkYXRhMzIpOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9NVl9SRF9ST1dfSlVNUCxkYXRhMzIpOworCisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX01WX1JEX0VORF9BRERSLCBtcHJlZF9tdl9yZF9lbmRfYWRkcik7CisJKi8KK30KKworc3RhdGljIHZvaWQgY29uZmlnX3Nhb19odyhzdHJ1Y3QgQVYxSFdfcyAqaHcsIHVuaW9uIHBhcmFtX3UgKnBhcmFtcykKK3sKKwkvKgorCSEhISEhISEhISEhISEhISEhISEhISEhISFUT0RPIC4uLi4gISEhISEhISEhISEKKwltZW1fbWFwX21vZGUsIGVuZGlhbiwgZ2V0X2RvdWJsZV93cml0ZV9tb2RlCisJKi8KKwlBVjFfQ09NTU9OICpjbSA9ICZody0+Y29tbW9uOworICAgIFBJQ19CVUZGRVJfQ09ORklHKiBwaWNfY29uZmlnID0gJmNtLT5jdXJfZnJhbWUtPmJ1ZjsKKyAgICB1aW50MzJfdCBkYXRhMzI7CisgICAgaW50MzJfdCBsY3Vfc2l6ZSA9CisJCSgocGFyYW1zLT5wLnNlcV9mbGFncyA+PiA2KSAmIDB4MSkgPyAxMjggOiA2NDsKKyAgICBpbnQzMl90IG1jX2J1ZmZlcl9zaXplX3VfdiA9CisJCXBpY19jb25maWctPmxjdV90b3RhbCpsY3Vfc2l6ZSpsY3Vfc2l6ZS8yOworICAgIGludDMyX3QgbWNfYnVmZmVyX3NpemVfdV92X2ggPQorCQkobWNfYnVmZmVyX3NpemVfdV92ICsgMHhmZmZmKT4+MTY7IC8vNjRrIGFsaWdubWVudAorCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqIHY0bDJfY3R4ID0gaHctPnY0bDJfY3R4OworCisgICAgYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJIlt0ZXN0LmNdICMjIyMgY29uZmlnX3Nhb19odyAjIyMjLCBsY3Vfc2l6ZSAlZFxuIiwgbGN1X3NpemUpOworICAgIGF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCSJbY29uZmlnX3Nhb19od10gbGN1X3RvdGFsIDogJWRcbiIsIHBpY19jb25maWctPmxjdV90b3RhbCk7CisgICAgYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJIltjb25maWdfc2FvX2h3XSBtY195X2FkciA6IDB4JXhcbiIsIHBpY19jb25maWctPm1jX3lfYWRyKTsKKyAgICBhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkiW2NvbmZpZ19zYW9faHddIG1jX3Vfdl9hZHIgOiAweCV4XG4iLCBwaWNfY29uZmlnLT5tY191X3ZfYWRyKTsKKyAgICBhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkiW2NvbmZpZ19zYW9faHddIGhlYWRlcl9hZHIgOiAweCV4XG4iLCBwaWNfY29uZmlnLT5oZWFkZXJfYWRyKTsKKyNpZmRlZiBBT01fQVYxX01NVV9EVworICAgIGlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpICYgMHgyMCkKKwkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJIltjb25maWdfc2FvX2h3XSBoZWFkZXJfZHdfYWRyIDogMHgleFxuIiwgcGljX2NvbmZpZy0+aGVhZGVyX2R3X2Fkcik7CisjZW5kaWYKKyAgICBkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDkpIHwgKDEgPDwgMSk7CisgICAgV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMOSwgZGF0YTMyKTsKKworICAgIGRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMNSk7CisgICAgZGF0YTMyIHw9ICgweDEgPDwgMTQpOyAvKiBhdjEgbW9kZSAqLworICAgIGRhdGEzMiB8PSAoMHhmZiA8PCAxNik7IC8qIGR3IHt2MSx2MCxoMSxoMH0gY3RybF95X2NidXMgKi8KKyAgICBXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw1LCBkYXRhMzIpOworCisgICAgV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMMCwKKwkJbGN1X3NpemUgPT0gMTI4ID8gMHg3IDogMHg2KTsgLypsY3Vfc2l6ZV9sb2cyKi8KKyNpZmRlZiBMT1NMRVNTX0NPTVBSRVNTX01PREUKKyAgICBXUklURV9WUkVHKEhFVkNfQ01fQk9EWV9TVEFSVF9BRERSLCBwaWNfY29uZmlnLT5tY195X2Fkcik7CisjaWZkZWYgQU9NX0FWMV9NTVUKKyAgICBXUklURV9WUkVHKEhFVkNfQ01fSEVBREVSX1NUQVJUX0FERFIsIHBpY19jb25maWctPmhlYWRlcl9hZHIpOworI2VuZGlmCisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKyAgICBpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSAmIDB4MjApIHsKKwkJV1JJVEVfVlJFRyhIRVZDX0NNX0hFQURFUl9TVEFSVF9BRERSMiwgcGljX2NvbmZpZy0+aGVhZGVyX2R3X2Fkcik7CisJfQorI2VuZGlmCisjZWxzZQorLyohTE9TTEVTU19DT01QUkVTU19NT0RFKi8KKyAgICBXUklURV9WUkVHKEhFVkNfU0FPX1lfU1RBUlRfQUREUiwgcGljX2NvbmZpZy0+bWNfeV9hZHIpOworI2VuZGlmCisKKyAgICBhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkiW2NvbmZpZ19zYW9faHddIHNhb19ib2R5X2FkZHI6JXhcbiIsIHBpY19jb25maWctPm1jX3lfYWRyKTsKKwkvL3ByaW50aygiW2NvbmZpZ19zYW9faHddIHNhb19oZWFkZXJfYWRkcjoleFxuIiwgcGljX2NvbmZpZy0+bWNfeV9hZHIgKyBsb3NsZXNzX2NvbXBfYm9keV9zaXplICk7CisKKyNpZmRlZiBWUFVfRklMTUdSQUlOX0RVTVAKKwkvLyBMZXQgTWljcm9jb2RlIHRvIGluY3JlYXNlCisJLy8gV1JJVEVfVlJFRyhIRVZDX0ZHU19UQUJMRV9TVEFSVCwgcGljX2NvbmZpZy0+ZmdzX3RhYmxlX2Fkcik7CisjZWxzZQorICAgIFdSSVRFX1ZSRUcoSEVWQ19GR1NfVEFCTEVfU1RBUlQsIHBpY19jb25maWctPmZnc190YWJsZV9hZHIpOworI2VuZGlmCisgICAgV1JJVEVfVlJFRyhIRVZDX0ZHU19UQUJMRV9MRU5HVEgsIEZHU19UQUJMRV9TSVpFICogOCk7CisgICAgYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJIltjb25maWdfc2FvX2h3XSBmZ3NfdGFibGUgYWRyOjB4JXggLCBsZW5ndGggMHgleCBiaXRzXG4iLAorCQlwaWNfY29uZmlnLT5mZ3NfdGFibGVfYWRyLCBGR1NfVEFCTEVfU0laRSAqIDgpOworCisgICAgZGF0YTMyID0gKG1jX2J1ZmZlcl9zaXplX3Vfdl9oPDwxNik8PDE7CisJLy9wcmludGsoImRhdGEzMiA9ICV4LCBtY19idWZmZXJfc2l6ZV91X3ZfaCA9ICV4LCBsY3VfdG90YWwgPSAleFxuIiwgZGF0YTMyLCBtY19idWZmZXJfc2l6ZV91X3ZfaCwgcGljX2NvbmZpZy0+bGN1X3RvdGFsKTsKKyAgICBXUklURV9WUkVHKEhFVkNfU0FPX1lfTEVOR1RIICxkYXRhMzIpOworCisjaWZuZGVmIExPU0xFU1NfQ09NUFJFU1NfTU9ERQorICAgIFdSSVRFX1ZSRUcoSEVWQ19TQU9fQ19TVEFSVF9BRERSLCBwaWNfY29uZmlnLT5tY191X3ZfYWRyKTsKKyNlbHNlCisjZW5kaWYKKworICAgIGRhdGEzMiA9IChtY19idWZmZXJfc2l6ZV91X3ZfaDw8MTYpOworICAgIFdSSVRFX1ZSRUcoSEVWQ19TQU9fQ19MRU5HVEggICxkYXRhMzIpOworCisjaWZuZGVmIExPU0xFU1NfQ09NUFJFU1NfTU9ERQorCS8qIG11bHRpIHRpbGUgdG8gZG8uLi4gKi8KKyAgICBXUklURV9WUkVHKEhFVkNfU0FPX1lfV1BUUiwgcGljX2NvbmZpZy0+bWNfeV9hZHIpOworCisgICAgV1JJVEVfVlJFRyhIRVZDX1NBT19DX1dQVFIsIHBpY19jb25maWctPm1jX3Vfdl9hZHIpOworI2Vsc2UKKyAgICBpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSAmJgorCQkoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSAmIDB4MjApID09IDApIHsKKwkgICAgV1JJVEVfVlJFRyhIRVZDX1NBT19ZX1NUQVJUX0FERFIsIHBpY19jb25maWctPmR3X3lfYWRyKTsKKwkgICAgV1JJVEVfVlJFRyhIRVZDX1NBT19DX1NUQVJUX0FERFIsIHBpY19jb25maWctPmR3X3Vfdl9hZHIpOworCSAgICBXUklURV9WUkVHKEhFVkNfU0FPX1lfV1BUUiwgcGljX2NvbmZpZy0+ZHdfeV9hZHIpOworCSAgICBXUklURV9WUkVHKEhFVkNfU0FPX0NfV1BUUiwgcGljX2NvbmZpZy0+ZHdfdV92X2Fkcik7CisJfSBlbHNlIHsKKwkJLy9XUklURV9WUkVHKEhFVkNfU0FPX1lfU1RBUlRfQUREUiwgMHhmZmZmZmZmZik7CisJCS8vV1JJVEVfVlJFRyhIRVZDX1NBT19DX1NUQVJUX0FERFIsIDB4ZmZmZmZmZmYpOworCX0KKyNlbmRpZgorCisKKyNpZm5kZWYgQU9NX0FWMV9OVjIxCisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKyAgICBpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSAmIDB4MjApIHsKKwl9CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgQU9NX0FWMV9OVjIxCisjaWZkZWYgRE9TX1BST0pFQ1QKKyAgICBkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDEpOworICAgIGRhdGEzMiAmPSAofjB4MzAwMCk7CisgICAgZGF0YTMyIHw9IChody0+bWVtX21hcF9tb2RlIDw8IDEyKTsgLy8gWzEzOjEyXSBheGlfYWZvcm1hdCwgMC1MaW5lYXIsIDEtMzJ4MzIsIDItNjR4MzIKKyAgICBkYXRhMzIgJj0gKH4weDMpOworICAgIGRhdGEzMiB8PSAweDE7IC8vIFsxXTpkd19kaXNhYmxlIFswXTpjbV9kaXNhYmxlCisgICAgV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMMSwgZGF0YTMyKTsKKworICAgIGRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMNSk7IC8vIFsyMzoyMl0gZHdfdjFfY3RybCBbMjE6MjBdIGR3X3YwX2N0cmwgWzE5OjE4XSBkd19oMV9jdHJsIFsxNzoxNl0gZHdfaDBfY3RybAorICAgIGRhdGEzMiAmPSB+KDB4ZmYgPDwgMTYpOwkJCSAgIC8vIHNldCB0aGVtIGFsbCAwIGZvciBBT01fQVYxX05WMjEgKG5vIGRvd24tc2NhbGUpCisgICAgV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMNSwgZGF0YTMyKTsKKworICAgIGRhdGEzMiA9IFJFQURfVlJFRyhIRVZDRF9JUFBfQVhJSUZfQ09ORklHKTsKKyAgICBkYXRhMzIgJj0gKH4weDMwKTsKKyAgICBkYXRhMzIgfD0gKGh3LT5tZW1fbWFwX21vZGUgPDwgNCk7IC8vIFs1OjRdCS0tIGFkZHJlc3NfZm9ybWF0IDAwOmxpbmVhciAwMTozMngzMiAxMDo2NHgzMgorICAgIFdSSVRFX1ZSRUcoSEVWQ0RfSVBQX0FYSUlGX0NPTkZJRywgZGF0YTMyKTsKKyNlbHNlCisvLyBtOGJhYnkgdGVzdDE5MDIKKyAgIGRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMMSk7CisJZGF0YTMyICY9ICh+MHgzMDAwKTsKKwlkYXRhMzIgfD0gKGh3LT5tZW1fbWFwX21vZGUgPDwgMTIpOyAvLyBbMTM6MTJdIGF4aV9hZm9ybWF0LCAwLUxpbmVhciwgMS0zMngzMiwgMi02NHgzMgorICAgIGRhdGEzMiAmPSAofjB4ZmYwKTsKKwkvL2RhdGEzMiB8PSAweDY3MDsgIC8vIEJpZy1FbmRpYW4gcGVyIDY0LWJpdAorICAgIGRhdGEzMiB8PSAweDg4MDsgIC8vIEJpZy1FbmRpYW4gcGVyIDY0LWJpdAorICAgIGRhdGEzMiAmPSAofjB4Myk7CisgICAgZGF0YTMyIHw9IDB4MTsgLy8gWzFdOmR3X2Rpc2FibGUgWzBdOmNtX2Rpc2FibGUKKyAgICBXUklURV9WUkVHKEhFVkNfU0FPX0NUUkwxLCBkYXRhMzIpOworCisgICAgZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkw1KTsgLy8gWzIzOjIyXSBkd192MV9jdHJsIFsyMToyMF0gZHdfdjBfY3RybCBbMTk6MThdIGR3X2gxX2N0cmwgWzE3OjE2XSBkd19oMF9jdHJsCisgICAgZGF0YTMyICY9IH4oMHhmZiA8PCAxNik7CQkJICAgLy8gc2V0IHRoZW0gYWxsIDAgZm9yIEFPTV9BVjFfTlYyMSAobm8gZG93bi1zY2FsZSkKKyAgICBXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw1LCBkYXRhMzIpOworCisgICAgZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNEX0lQUF9BWElJRl9DT05GSUcpOworCWRhdGEzMiAmPSAofjB4MzApOworCWRhdGEzMiB8PSAoaHctPm1lbV9tYXBfbW9kZSA8PCA0KTsgLy8gWzU6NF0JLS0gYWRkcmVzc19mb3JtYXQgMDA6bGluZWFyIDAxOjMyeDMyIDEwOjY0eDMyCisJZGF0YTMyICY9ICh+MHhGKTsKKyAgICBkYXRhMzIgfD0gMHg4OwkvLyBCaWctRW5kaWFuIHBlciA2NC1iaXQKKyAgICBXUklURV9WUkVHKEhFVkNEX0lQUF9BWElJRl9DT05GSUcsIGRhdGEzMik7CisjZW5kaWYKKyNlbHNlCisvKkNIQU5HRV9ET05FIG5ubiovCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkwxKTsKKwlkYXRhMzIgJj0gKH4weDMwMDApOworCWRhdGEzMiB8PSAoaHctPm1lbV9tYXBfbW9kZSA8PCAxMik7IC8qIFsxMzoxMl0gYXhpX2Fmb3JtYXQsIDAtTGluZWFyLCAxLTMyeDMyLCAyLTY0eDMyICovCisJZGF0YTMyICY9ICh+MHhmZjApOworCS8qIGRhdGEzMiB8PSAweDY3MDsgIC8vIEJpZy1FbmRpYW4gcGVyIDY0LWJpdCAqLworI2lmZGVmIEFPTV9BVjFfTU1VX0RXCisJaWYgKChnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpICYgMHgyMCkgPT0gMCkKKwkJZGF0YTMyIHw9ICgoaHctPmVuZGlhbiA+PiA4KSAmIDB4ZmZmKTsJLyogQmlnLUVuZGlhbiBwZXIgNjQtYml0ICovCisjZWxzZQorCWRhdGEzMiB8PSAoKGh3LT5lbmRpYW4gPj4gOCkgJiAweGZmZik7CS8qIEJpZy1FbmRpYW4gcGVyIDY0LWJpdCAqLworI2VuZGlmCisJZGF0YTMyICY9ICh+MHgzKTsgLypbMV06ZHdfZGlzYWJsZSBbMF06Y21fZGlzYWJsZSovCisJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShodykgPT0gMCkKKwkJZGF0YTMyIHw9IDB4MjsgLypkaXNhYmxlIGRvdWJsZSB3cml0ZSovCisJZWxzZSBpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSAmIDB4MTApCisJCWRhdGEzMiB8PSAweDE7IC8qZGlzYWJsZSBjbSovCisJIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpIHsgLyogPj0gRzEyQSBkdyB3cml0ZSBjb250cm9sICovCisJCXVuc2lnbmVkIGludCBkYXRhOworCQlkYXRhID0gUkVBRF9WUkVHKEhFVkNfREJMS19DRkdCKTsKKwkJZGF0YSAmPSAofjB4MzAwKTsgLypbOF06Zmlyc3Qgd3JpdGUgZW5hYmxlIChjb21wcmVzcykgIFs5XTpkb3VibGUgd3JpdGUgZW5hYmxlICh1bmNvbXByZXNzKSovCisJCWlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpID09IDApCisJCQlkYXRhIHw9ICgweDEgPDwgOCk7IC8qZW5hYmxlIGZpcnN0IHdyaXRlKi8KKwkJZWxzZSBpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSAmIDB4MTApCisJCQlkYXRhIHw9ICgweDEgPDwgOSk7IC8qZG91YmxlIHdyaXRlIG9ubHkqLworCQllbHNlCisJCQlkYXRhIHw9ICgoMHgxIDw8IDgpICB8KDB4MSA8PCA5KSk7CisJCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGR0IsIGRhdGEpOworCX0KKworCS8qIHN3YXAgdXYgKi8KKwlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCWlmICgodjRsMl9jdHgtPnFfZGF0YVtBTUxfUV9EQVRBX0RTVF0uZm10LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX05WMjEpIHx8CisJCQkodjRsMl9jdHgtPnFfZGF0YVtBTUxfUV9EQVRBX0RTVF0uZm10LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX05WMjFNKSkKKwkJCWRhdGEzMiAmPSB+KDEgPDwgOCk7IC8qIE5WMjEgKi8KKwkJZWxzZQorCQkJZGF0YTMyIHw9ICgxIDw8IDgpOyAvKiBOVjEyICovCisJfQorCWRhdGEzMiAmPSAofigzIDw8IDE0KSk7CisJZGF0YTMyIHw9ICgyIDw8IDE0KTsKKwkvKgorCSogIFszMToyNF0gYXJfZmlmbzFfYXhpX3RocmVkCisJKiAgWzIzOjE2XSBhcl9maWZvMF9heGlfdGhyZWQKKwkqICBbMTU6MTRdIGF4aV9saW5lYWxpZ24sIDAtMTZieXRlcywgMS0zMmJ5dGVzLCAyLTY0Ynl0ZXMKKwkqICBbMTM6MTJdIGF4aV9hZm9ybWF0LCAwLUxpbmVhciwgMS0zMngzMiwgMi02NHgzMgorCSogIFsxMTowOF0gYXhpX2xlbmRpYW5fQworCSogIFswNzowNF0gYXhpX2xlbmRpYW5fWQorCSogIFszXSAgICAgcmVzZXJ2ZWQKKwkqICBbMl0gICAgIGNsa19mb3JjZW9uCisJKiAgWzFdICAgICBkd19kaXNhYmxlOmRpc2FibGUgZG91YmxlIHdyaXRlIG91dHB1dAorCSogIFswXSAgICAgY21fZGlzYWJsZTpkaXNhYmxlIGNvbXByZXNzIG91dHB1dAorCSovCisJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMMSwgZGF0YTMyKTsKKworCWlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpICYgMHgxMCkgeworCQkvKiBbMjM6MjJdIGR3X3YxX2N0cmwKKwkJICpbMjE6MjBdIGR3X3YwX2N0cmwKKwkJICpbMTk6MThdIGR3X2gxX2N0cmwKKwkJICpbMTc6MTZdIGR3X2gwX2N0cmwKKwkJICovCisJCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMNSk7CisJCS8qc2V0IHRoZW0gYWxsIDAgZm9yIEgyNjVfTlYyMSAobm8gZG93bi1zY2FsZSkqLworCQlkYXRhMzIgJj0gfigweGZmIDw8IDE2KTsKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMNSwgZGF0YTMyKTsKKwl9IGVsc2UgeworCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNykKKwkJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDI2LCAwKTsKKwkJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkw1KTsKKwkJZGF0YTMyICY9ICh+KDB4ZmYgPDwgMTYpKTsKKwkJaWYgKChnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpICYgMHhmKSA9PSA4KSB7CisJCQlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkwyNiwgMHhmKTsKKwkJCWRhdGEzMiB8PSAoMHhmZiA8PCAxNik7CisJCX0gZWxzZSBpZiAoKGdldF9kb3VibGVfd3JpdGVfbW9kZShodykgJiAweGYpID09IDIgfHwKKwkJCShnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpICYgMHhmKSA9PSAzKQorCQkJZGF0YTMyIHw9ICgweGZmPDwxNik7CisJCWVsc2UgaWYgKChnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpICYgMHhmKSA9PSA0IHx8CisJCQkoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSAmIDB4ZikgPT0gNSkKKwkJCWRhdGEzMiB8PSAoMHgzMzw8MTYpOworCQlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw1LCBkYXRhMzIpOworCX0KKworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDRF9JUFBfQVhJSUZfQ09ORklHKTsKKwlkYXRhMzIgJj0gKH4weDMwKTsKKwkvKiBbNTo0XQktLSBhZGRyZXNzX2Zvcm1hdCAwMDpsaW5lYXIgMDE6MzJ4MzIgMTA6NjR4MzIgKi8KKwlkYXRhMzIgfD0gKGh3LT5tZW1fbWFwX21vZGUgPDwgNCk7CisJZGF0YTMyICY9ICh+MHhmKTsKKwlkYXRhMzIgfD0gKGh3LT5lbmRpYW4gJiAweGYpOyAgLyogdmFsaWQgb25seSB3aGVuIGRvdWJsZSB3cml0ZSBvbmx5ICovCisKKwkvKiBzd2FwIHV2ICovCisJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQlpZiAoKHY0bDJfY3R4LT5xX2RhdGFbQU1MX1FfREFUQV9EU1RdLmZtdC0+Zm91cmNjID09IFY0TDJfUElYX0ZNVF9OVjIxKSB8fAorCQkJKHY0bDJfY3R4LT5xX2RhdGFbQU1MX1FfREFUQV9EU1RdLmZtdC0+Zm91cmNjID09IFY0TDJfUElYX0ZNVF9OVjIxTSkpCisJCQlkYXRhMzIgfD0gKDEgPDwgMTIpOyAvKiBOVjIxICovCisJCWVsc2UKKwkJCWRhdGEzMiAmPSB+KDEgPDwgMTIpOyAvKiBOVjEyICovCisJfQorCWRhdGEzMiAmPSAofigzIDw8IDgpKTsKKwlkYXRhMzIgfD0gKDIgPDwgOCk7CisJLyoKKwkqIFszOjBdICAgbGl0dGxlX2VuZGlhbgorCSogWzU6NF0gICBhZGRyZXNzX2Zvcm1hdCAwMDpsaW5lYXIgMDE6MzJ4MzIgMTA6NjR4MzIKKwkqIFs3OjZdICAgcmVzZXJ2ZWQKKwkqIFs5OjhdICAgTGluZWFyX0xpbmVBbGlnbm1lbnQgMDA6MTZieXRlIDAxOjMyYnl0ZSAxMDo2NGJ5dGUKKwkqIFsxMToxMF0gcmVzZXJ2ZWQKKwkqIFsxMl0gICAgQ2JDcl9ieXRlX3N3YXAKKwkqIFszMToxM10gcmVzZXJ2ZWQKKwkqLworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX0FYSUlGX0NPTkZJRywgZGF0YTMyKTsKKworI2VuZGlmCisKK30KKworCisjaWZkZWYgQU9NX0FWMV9EQkxLX0lOSVQKKy8qCisgKiBEZWZpbmVzLCBkZWNsYXJhdGlvbnMsIHN1Yi1mdW5jdGlvbnMgZm9yIGF2MSBkZS1ibG9jayBsb29wIGZpbHRlciBUaHIvTHZsIHRhYmxlIHVwZGF0ZQorICogLSBzdHJ1Y3Qgc2VnbWVudGF0aW9uX2xmIGlzIGZvciBsb29wIGZpbHRlciBvbmx5IChyZW1vdmVkIHNvbWV0aGluZykKKyAqIC0gZnVuY3Rpb24gImF2MV9sb29wX2ZpbHRlcl9pbml0IiBhbmQgImF2MV9sb29wX2ZpbHRlcl9mcmFtZV9pbml0IiB3aWxsIGJlIGluc3RhbnRpYXRlZCBpbiBDX0VudHJ5CisgKiAtIGF2MV9sb29wX2ZpbHRlcl9pbml0IHJ1biBvbmNlIGJlZm9yZSBkZWNvZGluZyBzdGFydAorICogLSBhdjFfbG9vcF9maWx0ZXJfZnJhbWVfaW5pdCBydW4gYmVmb3JlIGV2ZXJ5IGZyYW1lIGRlY29kaW5nIHN0YXJ0CisgKiAtIHNldCB2aWRlbyBmb3JtYXQgdG8gQU9NX0FWMSBpcyBpbiBhdjFfbG9vcF9maWx0ZXJfaW5pdAorICovCisjZGVmaW5lIE1BWF9MT09QX0ZJTFRFUiA2MworI2RlZmluZSBNQVhfTU9ERV9MRl9ERUxUQVMgMgorI2RlZmluZSBNQVhfU0VHTUVOVFMgOAorI2RlZmluZSBNQVhfTUJfUExBTkUgMworCit0eXBlZGVmIGVudW0geworICBTRUdfTFZMX0FMVF9RLAkgICAvLyBVc2UgYWx0ZXJuYXRlIFF1YW50aXplciAuLi4uCisgIFNFR19MVkxfQUxUX0xGX1lfViwgIC8vIFVzZSBhbHRlcm5hdGUgbG9vcCBmaWx0ZXIgdmFsdWUgb24geSBwbGFuZSB2ZXJ0aWNhbAorICBTRUdfTFZMX0FMVF9MRl9ZX0gsICAvLyBVc2UgYWx0ZXJuYXRlIGxvb3AgZmlsdGVyIHZhbHVlIG9uIHkgcGxhbmUgaG9yaXpvbnRhbAorICBTRUdfTFZMX0FMVF9MRl9VLAkvLyBVc2UgYWx0ZXJuYXRlIGxvb3AgZmlsdGVyIHZhbHVlIG9uIHUgcGxhbmUKKyAgU0VHX0xWTF9BTFRfTEZfViwJLy8gVXNlIGFsdGVybmF0ZSBsb29wIGZpbHRlciB2YWx1ZSBvbiB2IHBsYW5lCisgIFNFR19MVkxfUkVGX0ZSQU1FLCAgIC8vIE9wdGlvbmFsIFNlZ21lbnQgcmVmZXJlbmNlIGZyYW1lCisgIFNFR19MVkxfU0tJUCwJCS8vIE9wdGlvbmFsIFNlZ21lbnQgKDAsMCkgKyBza2lwIG1vZGUKKyAgU0VHX0xWTF9HTE9CQUxNViwKKyAgU0VHX0xWTF9NQVgKK30gU0VHX0xWTF9GRUFUVVJFUzsKKworc3RhdGljIGNvbnN0IFNFR19MVkxfRkVBVFVSRVMgc2VnX2x2bF9sZl9sdXRbTUFYX01CX1BMQU5FXVsyXSA9IHsKKyAgeyBTRUdfTFZMX0FMVF9MRl9ZX1YsIFNFR19MVkxfQUxUX0xGX1lfSCB9LAorICB7IFNFR19MVkxfQUxUX0xGX1UsIFNFR19MVkxfQUxUX0xGX1UgfSwKKyAgeyBTRUdfTFZMX0FMVF9MRl9WLCBTRUdfTFZMX0FMVF9MRl9WIH0KK307CisKK3N0cnVjdCBzZWdtZW50YXRpb25fbGYgeyAvLyBmb3IgbG9vcGZpbHRlciBvbmx5CisgIHVpbnQ4X3QgZW5hYmxlZDsKKwkJICAvKgorCQkgICBTRUdfTFZMX0FMVF9MRl9ZX1YgZmVhdHVyZV9lbmFibGU6IHNlZ19sZl9pbmZvX3lbYml0N10KKwkJICAgU0VHX0xWTF9BTFRfTEZfWV9WIGRhdGE6IHNlZ19sZl9pbmZvX3lbYml0MH42XQorCQkgICBTRUdfTFZMX0FMVF9MRl9ZX0ggZmVhdHVyZSBlbmFibGU6IHNlZ19sZl9pbmZvX3lbYml0MTVdCisJCSAgIFNFR19MVkxfQUxUX0xGX1lfSCBkYXRhOiBzZWdfbGZfaW5mb195W2JpdDh+MTRdCisJCSAgICovCisgIHVpbnQxNl90IHNlZ19sZl9pbmZvX3lbOF07CisJCSAgLyoKKwkJICAgU0VHX0xWTF9BTFRfTEZfVSBmZWF0dXJlX2VuYWJsZTogc2VnX2xmX2luZm9fY1tiaXQ3XQorCQkgICBTRUdfTFZMX0FMVF9MRl9VIGRhdGE6IHNlZ19sZl9pbmZvX2NbYml0MH42XQorCQkgICBTRUdfTFZMX0FMVF9MRl9WIGZlYXR1cmUgZW5hYmxlOiBzZWdfbGZfaW5mb19jW2JpdDE1XQorCQkgICBTRUdfTFZMX0FMVF9MRl9WIGRhdGE6IHNlZ19sZl9pbmZvX2NbYml0OH4xNF0KKwkJICAgKi8KKyAgdWludDE2X3Qgc2VnX2xmX2luZm9fY1s4XTsKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDhfdCBtYmxpbTsKKyAgdWludDhfdCBsaW07CisgIHVpbnQ4X3QgaGV2X3RocjsKK30gbG9vcF9maWx0ZXJfdGhyZXNoOworCit0eXBlZGVmIHN0cnVjdCBsb29wX2ZpbHRlcl9pbmZvX25fcyB7CisgIGxvb3BfZmlsdGVyX3RocmVzaCBsZnRocltNQVhfTE9PUF9GSUxURVIgKyAxXTsKKyAgdWludDhfdCBsdmxbTUFYX01CX1BMQU5FXVtNQVhfU0VHTUVOVFNdWzJdW1JFRl9GUkFNRVNdW01BWF9NT0RFX0xGX0RFTFRBU107Cit9IGxvb3BfZmlsdGVyX2luZm9fbjsKKworc3RydWN0IGxvb3BmaWx0ZXIgeworICBpbnQzMl90IGZpbHRlcl9sZXZlbFsyXTsKKyAgaW50MzJfdCBmaWx0ZXJfbGV2ZWxfdTsKKyAgaW50MzJfdCBmaWx0ZXJfbGV2ZWxfdjsKKworICBpbnQzMl90IHNoYXJwbmVzc19sZXZlbDsKKworICB1aW50OF90IG1vZGVfcmVmX2RlbHRhX2VuYWJsZWQ7CisgIHVpbnQ4X3QgbW9kZV9yZWZfZGVsdGFfdXBkYXRlOworCisgIC8vIDAgPSBJbnRyYSwgTGFzdCwgTGFzdDIrTGFzdDMsCisgIC8vIEdGLCBCUkYsIEFSRjIsIEFSRgorICBpbnQ4X3QgcmVmX2RlbHRhc1tSRUZfRlJBTUVTXTsKKworICAvLyAwID0gWkVST19NViwgTVYKKyAgaW50OF90IG1vZGVfZGVsdGFzW01BWF9NT0RFX0xGX0RFTFRBU107CisKKyAgaW50MzJfdCBjb21iaW5lX3ZlcnRfaG9yel9sZjsKKworICBpbnQzMl90IGxmX3BpY19jbnQ7CisKKy8vI2lmIExPT1BfRklMVEVSX0JJVE1BU0sKKyAgLy9Mb29wRmlsdGVyTWFzayAqbGZtOworICAvL3NpemVfdCBsZm1fbnVtOworICAvL2ludCBsZm1fc3RyaWRlOworICAvL0xwZlN1cGVyYmxvY2tJbmZvIG5laWdoYm9yX3NiX2xwZl9pbmZvOworLy8jZW5kaWYgIC8vIExPT1BfRklMVEVSX0JJVE1BU0sKK307CisjaWZkZWYgREJHX0xQRl9EQkxLX0xWTAorc3RhdGljIGludDMyX3QgbXljbGFtcChpbnQzMl90IHZhbHVlLCBpbnQzMl90IGxvdywgaW50MzJfdCBoaWdoKSB7CisgIHJldHVybiB2YWx1ZSA8IGxvdyA/IGxvdyA6ICh2YWx1ZSA+IGhpZ2ggPyBoaWdoIDogdmFsdWUpOworfQorI2VuZGlmCisvKnN0YXRpYyBpbnQ4X3QgZXh0ZW5kX3NpZ25fN2JpdHModWludDhfdCB2YWx1ZSkgeworICByZXR1cm4gKCgodmFsdWU+PjYpICYgMHgxKTw8NykgfCAodmFsdWUmMHg3Zik7Cit9Ki8KKworLy8gY29udmVydCBkYXRhIHRvIGludDhfdCB2YXJpYWJsZQorLy8gdmFsdWUgOiBzaWduZWQgZGF0YSAod2l0aCBhbnkgYml0d2lkdGg8OCkgd2hpY2ggaXMgYXNzaWduZWQgdG8gdWludDhfdCB2YXJpYWJsZSBhcyBhbiBpbnB1dAorLy8gYncgICAgOiBiaXR3aWR0aCBvZiBzaWduZWQgZGF0YSwgKGZyb20gMSB0byA3KQorc3RhdGljIGludDhfdCBjb252MmludDggKHVpbnQ4X3QgdmFsdWUsIHVpbnQ4X3QgYncpIHsKKyAgICBpZiAoYnc8MSB8fCBidz43KSByZXR1cm4gKGludDhfdCl2YWx1ZTsKKyAgICBlbHNlIHsKKwkgICAgY29uc3QgdWludDhfdCBkYXRhX2JpdHMgPSB2YWx1ZSAmICgoMTw8YncpLTEpOworCSAgICBjb25zdCB1aW50OF90IHNpZ25fYml0ID0gKHZhbHVlPj4oYnctMSkpICYgMHgxOworCSAgICBjb25zdCB1aW50OF90IHNpZ25fYml0X2V4dCA9IHNpZ25fYml0IHwgc2lnbl9iaXQ8PDEgfCBzaWduX2JpdDw8MiB8IHNpZ25fYml0PDwzIHwgc2lnbl9iaXQ8PDQgfCBzaWduX2JpdDw8NSB8IHNpZ25fYml0PDw2IHwgc2lnbl9iaXQ8PDc7CisJICAgIHJldHVybiAoaW50OF90KSgoc2lnbl9iaXRfZXh0PDxidykgfCBkYXRhX2JpdHMpOworCX0KK30KKworc3RhdGljIHZvaWQgYXYxX3VwZGF0ZV9zaGFycG5lc3MobG9vcF9maWx0ZXJfaW5mb19uICpsZmksIGludDMyX3Qgc2hhcnBuZXNzX2x2bCkgeworICBpbnQzMl90IGx2bDsKKworICAvLyBGb3IgZWFjaCBwb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIGxvb3AgZmlsdGVyIGZpbGwgb3V0IGxpbWl0cworICBmb3IgKGx2bCA9IDA7IGx2bCA8PSBNQVhfTE9PUF9GSUxURVI7IGx2bCsrKSB7CisJLy8gU2V0IGxvb3AgZmlsdGVyIHBhcmFtZXRlcnMgdGhhdCBjb250cm9sIHNoYXJwbmVzcy4KKyAgICBpbnQzMl90IGJsb2NrX2luc2lkZV9saW1pdCA9CisJCWx2bCA+PiAoKHNoYXJwbmVzc19sdmwgPiAwKSArIChzaGFycG5lc3NfbHZsID4gNCkpOworCisgICAgaWYgKHNoYXJwbmVzc19sdmwgPiAwKSB7CisJICBpZiAoYmxvY2tfaW5zaWRlX2xpbWl0ID4gKDkgLSBzaGFycG5lc3NfbHZsKSkKKwkgICAgYmxvY2tfaW5zaWRlX2xpbWl0ID0gKDkgLSBzaGFycG5lc3NfbHZsKTsKKwl9CisKKyAgICBpZiAoYmxvY2tfaW5zaWRlX2xpbWl0IDwgMSkKKwkgIGJsb2NrX2luc2lkZV9saW1pdCA9IDE7CisKKyAgICBsZmktPmxmdGhyW2x2bF0ubGltID0gKHVpbnQ4X3QpYmxvY2tfaW5zaWRlX2xpbWl0OworICAgIGxmaS0+bGZ0aHJbbHZsXS5tYmxpbSA9ICh1aW50OF90KSgyICogKGx2bCArIDIpICsgYmxvY2tfaW5zaWRlX2xpbWl0KTsKKyAgfQorfQorCisvLyBpbnN0YW50aWF0ZSB0aGlzIGZ1bmN0aW9uIG9uY2Ugd2hlbiBkZWNvZGUgaXMgc3RhcnRlZAordm9pZCBhdjFfbG9vcF9maWx0ZXJfaW5pdChsb29wX2ZpbHRlcl9pbmZvX24gKmxmaSwgc3RydWN0IGxvb3BmaWx0ZXIgKmxmKSB7CisJaW50MzJfdCBpOworCXVpbnQzMl90IGRhdGEzMjsKKworCS8vIGluaXQgbGltaXRzIGZvciBnaXZlbiBzaGFycG5lc3MKKwlhdjFfdXBkYXRlX3NoYXJwbmVzcyhsZmksIGxmLT5zaGFycG5lc3NfbGV2ZWwpOworCisJLy8gV3JpdGUgdG8gcmVnaXN0ZXIKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQl1aW50MzJfdCB0aHI7CisJCXRociA9ICgobGZpLT5sZnRocltpKjIrMV0ubGltICYgMHgzZik8PDgpIHwKKwkJCShsZmktPmxmdGhyW2kqMisxXS5tYmxpbSAmIDB4ZmYpOworCQl0aHIgPSAodGhyPDwxNikgfCAoKGxmaS0+bGZ0aHJbaSoyXS5saW0gJiAweDNmKTw8OCkgfAorCQkJKGxmaS0+bGZ0aHJbaSoyXS5tYmxpbSAmIDB4ZmYpOworCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkc5LCB0aHIpOworCX0KKwkvLyB2aWRlbyBmb3JtYXQgaXMgQU9NX0FWMQorCWRhdGEzMiA9ICgweDU3IDw8IDgpIHwgIC8vIDFzdC8ybmQgd3JpdGUgYm90aCBlbmFibGUKKwkJKDB4NCAgPDwgMCk7ICAgLy8gYW9tX2F2MSB2aWRlbyBmb3JtYXQKKwlXUklURV9WUkVHKEhFVkNfREJMS19DRkdCLCBkYXRhMzIpOworCWF2MV9wcmludDIoQU9NX0RFQlVHX0hXX01PUkUsCisJCSJbREJMSyBERUJVR10gQ0ZHQiA6IDB4JXhcbiIsIGRhdGEzMik7Cit9CisKKy8vIHBlcmZvcm0gdGhpcyBmdW5jdGlvbiBwZXIgZnJhbWUKK3ZvaWQgYXYxX2xvb3BfZmlsdGVyX2ZyYW1lX2luaXQoQVYxRGVjb2RlciogcGJpLCBzdHJ1Y3Qgc2VnbWVudGF0aW9uX2xmICpzZWcsCisJbG9vcF9maWx0ZXJfaW5mb19uICpsZmksCisJc3RydWN0IGxvb3BmaWx0ZXIgKmxmLAorCWludDMyX3QgcGljX3dpZHRoKSB7CisJQnVmZkluZm9fdCogYnVmX3NwZWMgPSBwYmktPndvcmtfc3BhY2VfYnVmOworCWludDMyX3QgaTsKKyNpZmRlZiBEQkdfTFBGX0RCTEtfTFZMCisJaW50MzJfdCBkaXI7CisJaW50MzJfdCBmaWx0X2x2bFtNQVhfTUJfUExBTkVdLCBmaWx0X2x2bF9yW01BWF9NQl9QTEFORV07CisJaW50MzJfdCBwbGFuZTsKKwlpbnQzMl90IHNlZ19pZDsKKyNlbmRpZgorCS8vIG5fc2hpZnQgaXMgdGhlIG11bHRpcGxpZXIgZm9yIGxmX2RlbHRhcworCS8vIHRoZSBtdWx0aXBsaWVyIGlzIDEgZm9yIHdoZW4gZmlsdGVyX2x2bCBpcyBiZXR3ZWVuIDAgYW5kIDMxOworCS8vIDIgd2hlbiBmaWx0ZXJfbHZsIGlzIGJldHdlZW4gMzIgYW5kIDYzCisKKwkvLyB1cGRhdGUgbGltaXRzIGlmIHNoYXJwbmVzcyBoYXMgY2hhbmdlZAorCWF2MV91cGRhdGVfc2hhcnBuZXNzKGxmaSwgbGYtPnNoYXJwbmVzc19sZXZlbCk7CisKKwkvLyBXcml0ZSB0byByZWdpc3RlcgorCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCXVpbnQzMl90IHRocjsKKwkJdGhyID0gKChsZmktPmxmdGhyW2kqMisxXS5saW0gJiAweDNmKTw8OCkKKwkJCXwgKGxmaS0+bGZ0aHJbaSoyKzFdLm1ibGltICYgMHhmZik7CisJCXRociA9ICh0aHI8PDE2KSB8ICgobGZpLT5sZnRocltpKjJdLmxpbSAmIDB4M2YpPDw4KQorCQkJfCAobGZpLT5sZnRocltpKjJdLm1ibGltICYgMHhmZik7CisJCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGRzksIHRocik7CisJfQorI2lmZGVmIERCR19MUEZfREJMS19MVkwKKwlmaWx0X2x2bFswXSA9IGxmLT5maWx0ZXJfbGV2ZWxbMF07CisJZmlsdF9sdmxbMV0gPSBsZi0+ZmlsdGVyX2xldmVsX3U7CisJZmlsdF9sdmxbMl0gPSBsZi0+ZmlsdGVyX2xldmVsX3Y7CisKKwlmaWx0X2x2bF9yWzBdID0gbGYtPmZpbHRlcl9sZXZlbFsxXTsKKwlmaWx0X2x2bF9yWzFdID0gbGYtPmZpbHRlcl9sZXZlbF91OworCWZpbHRfbHZsX3JbMl0gPSBsZi0+ZmlsdGVyX2xldmVsX3Y7CisKKyNpZmRlZiBEQkdfTFBGX1BSSU5UCisJcHJpbnRrKCJMRl9QUklOVDogcGljX2NudCglZCkgYmFzZV9maWx0ZXJfbGV2ZWwoJWQsJWQsJWQsJWQpXG4iLAorCQlsZi0+bGZfcGljX2NudCwgbGYtPmZpbHRlcl9sZXZlbFswXSwKKwkJbGYtPmZpbHRlcl9sZXZlbFsxXSwgbGYtPmZpbHRlcl9sZXZlbF91LCBsZi0+ZmlsdGVyX2xldmVsX3YpOworI2VuZGlmCisKKwlmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCAzOyBwbGFuZSsrKSB7CisJCWlmIChwbGFuZSA9PSAwICYmICFmaWx0X2x2bFswXSAmJiAhZmlsdF9sdmxfclswXSkKKwkJICBicmVhazsKKwkJZWxzZSBpZiAocGxhbmUgPT0gMSAmJiAhZmlsdF9sdmxbMV0pCisJCSAgY29udGludWU7CisJCWVsc2UgaWYgKHBsYW5lID09IDIgJiYgIWZpbHRfbHZsWzJdKQorCQkgIGNvbnRpbnVlOworCisJCWZvciAoc2VnX2lkID0gMDsgc2VnX2lkIDwgTUFYX1NFR01FTlRTOyBzZWdfaWQrKykgeyAvLyBNQVhfU0VHTUVOVFM9PTgKKwkJCWZvciAoZGlyID0gMDsgZGlyIDwgMjsgKytkaXIpIHsKKwkJCQlpbnQzMl90IGx2bF9zZWcgPSAoZGlyID09IDApID8gZmlsdF9sdmxbcGxhbmVdIDogZmlsdF9sdmxfcltwbGFuZV07CisJCQkJLy9hc3NlcnQocGxhbmUgPj0gMCAmJiBwbGFuZSA8PSAyKTsKKwkJCQljb25zdCB1aW50OF90IHNlZ19sZl9pbmZvX3kwID0gc2VnLT5zZWdfbGZfaW5mb195W3NlZ19pZF0gJiAweGZmOworCQkJCWNvbnN0IHVpbnQ4X3Qgc2VnX2xmX2luZm9feTEgPSAoc2VnLT5zZWdfbGZfaW5mb195W3NlZ19pZF0+PjgpICYgMHhmZjsKKwkJCQljb25zdCB1aW50OF90IHNlZ19sZl9pbmZvX3UgPSBzZWctPnNlZ19sZl9pbmZvX2Nbc2VnX2lkXSAmIDB4ZmY7CisJCQkJY29uc3QgdWludDhfdCBzZWdfbGZfaW5mb192ID0gKHNlZy0+c2VnX2xmX2luZm9fY1tzZWdfaWRdPj44KSAmIDB4ZmY7CisJCQkJY29uc3QgdWludDhfdCBzZWdfbGZfaW5mbyA9IChwbGFuZT09MikgPyBzZWdfbGZfaW5mb192IDogKHBsYW5lPT0xKSA/CisJCQkJCXNlZ19sZl9pbmZvX3UgOiAoKGRpcj09MCkgPyAgc2VnX2xmX2luZm9feTAgOiBzZWdfbGZfaW5mb195MSk7CisJCQkJY29uc3QgaW50OF90IHNlZ19sZl9hY3RpdmUgPSAoKHNlZy0+ZW5hYmxlZCkgJiYgKChzZWdfbGZfaW5mbz4+NykgJiAweDEpKTsKKwkJCQljb25zdCBpbnQ4X3Qgc2VnX2xmX2RhdGEgPSBjb252MmludDgoc2VnX2xmX2luZm8sNyk7CisjaWZkZWYgREJHX0xQRl9QUklOVAorCQkJCWNvbnN0IGludDhfdCBzZWdfbGZfZGF0YV9jbGlwID0gKHNlZ19sZl9kYXRhPjYzKSA/IDYzIDoKKwkJCQkJKHNlZ19sZl9kYXRhPC02MykgPyAtNjMgOiBzZWdfbGZfZGF0YTsKKyNlbmRpZgorCQkJCWlmIChzZWdfbGZfYWN0aXZlKSB7CisJCQkJICBsdmxfc2VnID0gbXljbGFtcChsdmxfc2VnICsgKGludDMyX3Qpc2VnX2xmX2RhdGEsIDAsIE1BWF9MT09QX0ZJTFRFUik7CisJCQkJfQorCisjaWZkZWYgREJHX0xQRl9QUklOVAorCQkJCXByaW50aygiTEZfUFJJTlQ6cGxhbmUoJWQpIHNlZ19pZCglZCkgZGlyKCVkKSBzZWdfbGZfaW5mbyglZCwweCV4KSxsdmxfc2VnKDB4JXgpXG4iLAorCQkJCQlwbGFuZSxzZWdfaWQsZGlyLHNlZ19sZl9hY3RpdmUsc2VnX2xmX2RhdGFfY2xpcCxsdmxfc2VnKTsKKyNlbmRpZgorCisJCQkJaWYgKCFsZi0+bW9kZV9yZWZfZGVsdGFfZW5hYmxlZCkgeworCQkJCSAgLy8gd2UgY291bGQgZ2V0IHJpZCBvZiB0aGlzIGlmIHdlIGFzc3VtZSB0aGF0IGRlbHRhcyBhcmUgc2V0IHRvCisJCQkJICAvLyB6ZXJvIHdoZW4gbm90IGluIHVzZTsgZW5jb2RlciBhbHdheXMgdXNlcyBkZWx0YXMKKwkJCQkgIG1lbXNldChsZmktPmx2bFtwbGFuZV1bc2VnX2lkXVtkaXJdLCBsdmxfc2VnLAorCQkJCQkJIHNpemVvZihsZmktPmx2bFtwbGFuZV1bc2VnX2lkXVtkaXJdKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaW50MzJfdCByZWYsIG1vZGU7CisJCQkJCWNvbnN0IGludDMyX3Qgc2NhbGUgPSAxIDw8IChsdmxfc2VnID4+IDUpOworCQkJCQljb25zdCBpbnQzMl90IGludHJhX2x2bCA9IGx2bF9zZWcgKyBsZi0+cmVmX2RlbHRhc1tJTlRSQV9GUkFNRV0gKiBzY2FsZTsKKwkJCQkJbGZpLT5sdmxbcGxhbmVdW3NlZ19pZF1bZGlyXVtJTlRSQV9GUkFNRV1bMF0gPQorCQkJCQkgIG15Y2xhbXAoaW50cmFfbHZsLCAwLCBNQVhfTE9PUF9GSUxURVIpOworI2lmZGVmIERCR19MUEZfUFJJTlQKKwkJCQkJcHJpbnRrKCJMRl9QUklOVDpyZWZfZGVsdGFzW0lOVFJBX0ZSQU1FXSglZClcbiIsbGYtPnJlZl9kZWx0YXNbSU5UUkFfRlJBTUVdKTsKKyNlbmRpZgorCQkJCQlmb3IgKHJlZiA9IExBU1RfRlJBTUU7IHJlZiA8IFJFRl9GUkFNRVM7ICsrcmVmKSB7CQkgLy8gTEFTVF9GUkFNRT09MSBSRUZfRlJBTUVTPT04CisJCQkJCQlmb3IgKG1vZGUgPSAwOyBtb2RlIDwgTUFYX01PREVfTEZfREVMVEFTOyArK21vZGUpIHsJIC8vIE1BWF9NT0RFX0xGX0RFTFRBUz09MgorCQkJCQkJCWNvbnN0IGludDMyX3QgaW50ZXJfbHZsID0KKwkJCQkJCQkJbHZsX3NlZyArIGxmLT5yZWZfZGVsdGFzW3JlZl0gKiBzY2FsZSArCisJCQkJCQkJCWxmLT5tb2RlX2RlbHRhc1ttb2RlXSAqIHNjYWxlOworCQkJCQkJCWxmaS0+bHZsW3BsYW5lXVtzZWdfaWRdW2Rpcl1bcmVmXVttb2RlXSA9CisJCQkJCQkJCW15Y2xhbXAoaW50ZXJfbHZsLCAwLCBNQVhfTE9PUF9GSUxURVIpOworI2lmZGVmIERCR19MUEZfUFJJTlQKKwkJCQkJCQlwcmludGsoIkxGX1BSSU5UOnJlZl9kZWx0YXMoJWQpIG1vZGVfZGVsdGFzKCVkKVxuIiwKKwkJCQkJCQlsZi0+cmVmX2RlbHRhc1tyZWZdLCBsZi0+bW9kZV9kZWx0YXNbbW9kZV0pOworI2VuZGlmCisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKyNpZmRlZiBEQkdfTFBGX1BSSU5UCisJZm9yIChpID0gMDsgaSA8PSBNQVhfTE9PUF9GSUxURVI7IGkrKykgeworCQlwcmludGsoIkxGX1BSSU5UOiglMmQpIHRocj0lZCxibGltPSUzZCxsaW09JTJkXG4iLAorCQkJaSwgbGZpLT5sZnRocltpXS5oZXZfdGhyLAorCQkJbGZpLT5sZnRocltpXS5tYmxpbSwgbGZpLT5sZnRocltpXS5saW0pOworCX0KKwlmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCAzOyBwbGFuZSsrKSB7CisJCWZvciAoc2VnX2lkID0gMDsgc2VnX2lkIDwgTUFYX1NFR01FTlRTOyBzZWdfaWQrKykgeyAvLyBNQVhfU0VHTUVOVFM9PTgKKwkJCWZvciAoZGlyID0gMDsgZGlyIDwgMjsgKytkaXIpIHsKKwkJCQlpbnQzMl90IG1vZGU7CisJCQkJZm9yIChtb2RlID0gMDsgbW9kZSA8IDI7ICsrbW9kZSkgeworCQkJCQlwcmludGsoImFzc2lnbiB7bHZsWyVkXVslZF1bJWRdWzBdWyVkXSxsdmxbJWRdWyVkXVslZF1bMV1bJWRdLGx2bFslZF1bJWRdWyVkXVsyXVslZF0sbHZsWyVkXVslZF1bJWRdWzNdWyVkXSxsdmxbJWRdWyVkXVslZF1bNF1bJWRdLGx2bFslZF1bJWRdWyVkXVs1XVslZF0sbHZsWyVkXVslZF1bJWRdWzZdWyVkXSxsdmxbJWRdWyVkXVslZF1bN11bJWRdfT17NidkJTJkLDYnZCUyZCw2J2QlMmQsNidkJTJkLDYnZCUyZCw2J2QlMmQsNidkJTJkLDYnZCUyZH07XG4iLAorCQkJCQlwbGFuZSwgc2VnX2lkLCBkaXIsIG1vZGUsCisJCQkJCXBsYW5lLCBzZWdfaWQsIGRpciwgbW9kZSwKKwkJCQkJcGxhbmUsIHNlZ19pZCwgZGlyLCBtb2RlLAorCQkJCQlwbGFuZSwgc2VnX2lkLCBkaXIsIG1vZGUsCisJCQkJCXBsYW5lLCBzZWdfaWQsIGRpciwgbW9kZSwKKwkJCQkJcGxhbmUsIHNlZ19pZCwgZGlyLCBtb2RlLAorCQkJCQlwbGFuZSwgc2VnX2lkLCBkaXIsIG1vZGUsCisJCQkJCXBsYW5lLCBzZWdfaWQsIGRpciwgbW9kZSwKKwkJCQkJbGZpLT5sdmxbcGxhbmVdW3NlZ19pZF1bZGlyXVswXVttb2RlXSwKKwkJCQkJbGZpLT5sdmxbcGxhbmVdW3NlZ19pZF1bZGlyXVsxXVttb2RlXSwKKwkJCQkJbGZpLT5sdmxbcGxhbmVdW3NlZ19pZF1bZGlyXVsyXVttb2RlXSwKKwkJCQkJbGZpLT5sdmxbcGxhbmVdW3NlZ19pZF1bZGlyXVszXVttb2RlXSwKKwkJCQkJbGZpLT5sdmxbcGxhbmVdW3NlZ19pZF1bZGlyXVs0XVttb2RlXSwKKwkJCQkJbGZpLT5sdmxbcGxhbmVdW3NlZ19pZF1bZGlyXVs1XVttb2RlXSwKKwkJCQkJbGZpLT5sdmxbcGxhbmVdW3NlZ19pZF1bZGlyXVs2XVttb2RlXSwKKwkJCQkJbGZpLT5sdmxbcGxhbmVdW3NlZ19pZF1bZGlyXVs3XVttb2RlXSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorI2VuZGlmCisJLy8gV3JpdGUgdG8gcmVnaXN0ZXIKKwlmb3IgKGkgPSAwOyBpIDwgMTkyOyBpKyspIHsKKwkJdWludDMyX3QgbGV2ZWw7CisJCWxldmVsID0gKChsZmktPmx2bFtpPj42JjNdW2k+PjMmN11bMV1baSY3XVsxXSAmIDB4M2YpPDwyNCkgfAorCQkJKChsZmktPmx2bFtpPj42JjNdW2k+PjMmN11bMV1baSY3XVswXSAmIDB4M2YpPDwxNikgfAorCQkJKChsZmktPmx2bFtpPj42JjNdW2k+PjMmN11bMF1baSY3XVsxXSAmIDB4M2YpPDw4KSB8CisJCQkobGZpLT5sdmxbaT4+NiYzXVtpPj4zJjddWzBdW2kmN11bMF0gJiAweDNmKTsKKwkJaWYgKCFsZi0+ZmlsdGVyX2xldmVsWzBdICYmICFsZi0+ZmlsdGVyX2xldmVsWzFdKQorCQkJbGV2ZWwgPSAwOworCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkdBLCBsZXZlbCk7CisJfQorI2VuZGlmICAvLyBEQkdfTFBGX0RCTEtfTFZMCisKKyNpZmRlZiBEQkdfTFBGX0RCTEtfRk9SQ0VEX09GRgorCWlmIChsZi0+bGZfcGljX2NudCA9PSAyKSB7CisJCXByaW50aygiTEZfUFJJTlQ6IHBpY19jbnQoJWQpIGRibGsgZm9yY2VkIG9mZiAhISFcbiIsIGxmLT5sZl9waWNfY250KTsKKwkJV1JJVEVfVlJFRyhIRVZDX0RCTEtfREJMSzAsIDApOworCX0gZWxzZQorCQlXUklURV9WUkVHKEhFVkNfREJMS19EQkxLMCwKKwkJCWxmLT5maWx0ZXJfbGV2ZWxbMF0gfCBsZi0+ZmlsdGVyX2xldmVsWzFdIDw8IDYgfAorCQkJbGYtPmZpbHRlcl9sZXZlbF91IDw8IDEyIHwgbGYtPmZpbHRlcl9sZXZlbF92IDw8IDE4KTsKKyNlbHNlCisJV1JJVEVfVlJFRyhIRVZDX0RCTEtfREJMSzAsCisJCWxmLT5maWx0ZXJfbGV2ZWxbMF0gfCBsZi0+ZmlsdGVyX2xldmVsWzFdPDw2IHwKKwkJbGYtPmZpbHRlcl9sZXZlbF91PDwxMiB8IGxmLT5maWx0ZXJfbGV2ZWxfdjw8MTgpOworI2VuZGlmCisJZm9yIChpID0wOyBpIDwgMTA7IGkrKykKKwkJV1JJVEVfVlJFRyhIRVZDX0RCTEtfREJMSzEsCisJCQkoKGk8MikgPyBsZi0+bW9kZV9kZWx0YXNbaSYxXSA6IGxmLT5yZWZfZGVsdGFzWyhpLTIpJjddKSk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJV1JJVEVfVlJFRyhIRVZDX0RCTEtfREJMSzIsCisJCQkodWludDMyX3QpKHNlZy0+c2VnX2xmX2luZm9feVtpXSkgfCAodWludDMyX3QpKHNlZy0+c2VnX2xmX2luZm9fY1tpXTw8MTYpKTsKKworCS8vIFNldCBQX0hFVkNfREJMS19DRkdCIGFnYWluCisJeworCQl1aW50MzJfdCBscGZfZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfREJMS19DRkdCKTsKKwkJaWYgKGxmLT5tb2RlX3JlZl9kZWx0YV9lbmFibGVkKQorCQkJbHBmX2RhdGEzMiB8PSAgKDB4MTw8MjgpOyAvLyBtb2RlX3JlZl9kZWx0YV9lbmFibGVkCisJCWVsc2UKKwkJCWxwZl9kYXRhMzIgJj0gfigweDE8PDI4KTsKKwkJaWYgKHNlZy0+ZW5hYmxlZCkKKwkJCWxwZl9kYXRhMzIgfD0gICgweDE8PDI5KTsgLy8gc2VnIGVuYWJsZQorCQllbHNlCisJCQlscGZfZGF0YTMyICY9IH4oMHgxPDwyOSk7CisJCWlmIChwaWNfd2lkdGggPj0gMTI4MCkKKwkJCWxwZl9kYXRhMzIgfD0gKDB4MSA8PCA0KTsgLy8gZGJsayBwaXBlbGluZSBtb2RlPTEgZm9yIHBlcmZvcm1hbmNlCisJCWVsc2UKKwkJCWxwZl9kYXRhMzIgJj0gfigweDMgPDwgNCk7CisJCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGR0IsIGxwZl9kYXRhMzIpOworCX0KKwkgIC8vIFNldCBDREVGCisJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0RFRjAsIGJ1Zl9zcGVjLT5jZGVmX2RhdGEuYnVmX3N0YXJ0KTsKKwl7CisJCXVpbnQzMl90IGNkZWZfZGF0YTMyID0gKFJFQURfVlJFRyhIRVZDX0RCTEtfQ0RFRjEpICYgMHhmZmZmZmYwMCk7CisJCWNkZWZfZGF0YTMyIHw9IDE3OwkvLyBUT0RPIEVSUk9SIDo6IGNkZWYgdGVtcCBkbWEgYWRkcmVzcyBsZWZ0IG9mZnNldAorI2lmZGVmIERCR19MUEZfQ0RFRl9OT19QSVBFTElORQorCQljZGVmX2RhdGEzMiB8PSAoMTw8MTcpOyAvLyBjZGVmIHRlc3Qgbm8gcGlwZWxpbmUgZm9yIHZlcnkgc21hbGwgcGljdHVyZQorI2VuZGlmCisJCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NERUYxLCBjZGVmX2RhdGEzMik7CisJfQorCS8vIFBpY3R1cmUgY291bnQKKwlsZi0+bGZfcGljX2NudCsrOworfQorI2VuZGlmICAvLyAjaWZkZWYgQU9NX0FWMV9EQkxLX0lOSVQKKworI2lmZGVmIEFPTV9BVjFfVVBTQ0FMRV9JTklUCisvKgorICogdGhlc2UgZnVuY3Rpb25zIGhlcmUgZm9yIHVwc2NhbGluZyB1cGRhdGVkIGluIGV2ZXJ5IHBpY3R1cmUKKyAqLworI2RlZmluZSBSU19TVUJQRUxfQklUUyA2CisjZGVmaW5lIFJTX1NVQlBFTF9NQVNLICgoMSA8PCBSU19TVUJQRUxfQklUUykgLSAxKQorI2RlZmluZSBSU19TQ0FMRV9TVUJQRUxfQklUUyAxNAorI2RlZmluZSBSU19TQ0FMRV9TVUJQRUxfTUFTSyAoKDEgPDwgUlNfU0NBTEVfU1VCUEVMX0JJVFMpIC0gMSkKKyNkZWZpbmUgUlNfU0NBTEVfRVhUUkFfQklUUyAoUlNfU0NBTEVfU1VCUEVMX0JJVFMgLSBSU19TVUJQRUxfQklUUykKKyNkZWZpbmUgUlNfU0NBTEVfRVhUUkFfT0ZGICgxIDw8IChSU19TQ0FMRV9FWFRSQV9CSVRTIC0gMSkpCisKK3N0YXRpYyBpbnQzMl90IGF2MV9nZXRfdXBzY2FsZV9jb252b2x2ZV9zdGVwKGludDMyX3QgaW5fbGVuZ3RoLCBpbnQzMl90IG91dF9sZW5ndGgpIHsKKyAgcmV0dXJuICgoaW5fbGVuZ3RoIDw8IFJTX1NDQUxFX1NVQlBFTF9CSVRTKSArIG91dF9sZW5ndGggLyAyKSAvIG91dF9sZW5ndGg7Cit9CisKK3N0YXRpYyBpbnQzMl90IGdldF91cHNjYWxlX2NvbnZvbHZlX3gwKGludDMyX3QgaW5fbGVuZ3RoLCBpbnQzMl90IG91dF9sZW5ndGgsCisJCQkJCQkJCQkgICBpbnQzMl90IHhfc3RlcF9xbikgeworICBjb25zdCBpbnQzMl90IGVyciA9IG91dF9sZW5ndGggKiB4X3N0ZXBfcW4gLSAoaW5fbGVuZ3RoIDw8IFJTX1NDQUxFX1NVQlBFTF9CSVRTKTsKKyAgY29uc3QgaW50MzJfdCB4MCA9CisJICAoLSgob3V0X2xlbmd0aCAtIGluX2xlbmd0aCkgPDwgKFJTX1NDQUxFX1NVQlBFTF9CSVRTIC0gMSkpICsKKwkgICBvdXRfbGVuZ3RoIC8gMikgLworCQkgIG91dF9sZW5ndGggKworCSAgUlNfU0NBTEVfRVhUUkFfT0ZGIC0gZXJyIC8gMjsKKyAgcmV0dXJuIChpbnQzMl90KSgodWludDMyX3QpeDAgJiBSU19TQ0FMRV9TVUJQRUxfTUFTSyk7Cit9CisKK3ZvaWQgYXYxX3Vwc2NhbGVfZnJhbWVfaW5pdChBVjFEZWNvZGVyKiBwYmksIEFWMV9DT01NT04gKmNtLCBwYXJhbV90KiBwYXJhbXMpCit7CisJQnVmZkluZm9fdCogYnVmX3NwZWMgPSBwYmktPndvcmtfc3BhY2VfYnVmOworCS8vdWludDMyX3QgZGF0YTMyOworCWNvbnN0IGludDMyX3Qgd2lkdGggICAgICAgICAgICAgICAgICAgPSBjbS0+ZGVjX3dpZHRoOworCWNvbnN0IGludDMyX3Qgc3VwZXJyZXNfdXBzY2FsZWRfd2lkdGggPSBjbS0+c3VwZXJyZXNfdXBzY2FsZWRfd2lkdGg7CisJY29uc3QgaW50MzJfdCB4X3N0ZXBfcW5fbHVtYSAgICAgICAgICA9IGF2MV9nZXRfdXBzY2FsZV9jb252b2x2ZV9zdGVwKHdpZHRoLCBzdXBlcnJlc191cHNjYWxlZF93aWR0aCk7CisJY29uc3QgaW50MzJfdCB4MF9xbl9sdW1hICAgICAgICAgICAgICA9IGdldF91cHNjYWxlX2NvbnZvbHZlX3gwKHdpZHRoLCBzdXBlcnJlc191cHNjYWxlZF93aWR0aCwgeF9zdGVwX3FuX2x1bWEpOworCWNvbnN0IGludDMyX3QgeF9zdGVwX3FuX2Nocm9tYSAgICAgICAgPSBhdjFfZ2V0X3Vwc2NhbGVfY29udm9sdmVfc3RlcCgod2lkdGgrMSk+PjEsIChzdXBlcnJlc191cHNjYWxlZF93aWR0aCsxKT4+MSk7CisJY29uc3QgaW50MzJfdCB4MF9xbl9jaHJvbWEgICAgICAgICAgICA9IGdldF91cHNjYWxlX2NvbnZvbHZlX3gwKCh3aWR0aCsxKT4+MSwgKHN1cGVycmVzX3Vwc2NhbGVkX3dpZHRoKzEpPj4xLCB4X3N0ZXBfcW5fY2hyb21hKTsKKyAgICBhdjFfcHJpbnQyKEFPTV9ERUJVR19IV19NT1JFLAorCQkiVVBTX1BSSU5UOiB3aWR0aCglZCAtPiAlZClcbiIsCisJCXdpZHRoLCBzdXBlcnJlc191cHNjYWxlZF93aWR0aCk7CisgICAgYXYxX3ByaW50MihBT01fREVCVUdfSFdfTU9SRSwKKwkJIlVQU19QUklOVDogeHN0ZXAoJWQsJWQpKDB4JVgsIDB4JVgpIHgwcW4oJWQsJWQpKDB4JVgsIDB4JVgpXG4iLAorCSAgeF9zdGVwX3FuX2x1bWEseF9zdGVwX3FuX2Nocm9tYSwKKwkgIHhfc3RlcF9xbl9sdW1hLHhfc3RlcF9xbl9jaHJvbWEsCisJICB4MF9xbl9sdW1hLHgwX3FuX2Nocm9tYSwKKwkgIHgwX3FuX2x1bWEseDBfcW5fY2hyb21hKTsKKyAgICBXUklURV9WUkVHKEhFVkNfREJMS19VUFMxLCBidWZfc3BlYy0+dXBzX2RhdGEuYnVmX3N0YXJ0KTsKKyAgICBXUklURV9WUkVHKEhFVkNfREJMS19VUFMyLCB4MF9xbl9sdW1hKTsJCSAvLyB4MF9xbiB5CisgICAgV1JJVEVfVlJFRyhIRVZDX0RCTEtfVVBTMywgeDBfcW5fY2hyb21hKTsJICAgLy8geDBfcW4gYworICAgIFdSSVRFX1ZSRUcoSEVWQ19EQkxLX1VQUzQsIHhfc3RlcF9xbl9sdW1hKTsJIC8vIHhfc3RlcCB5CisgICAgV1JJVEVfVlJFRyhIRVZDX0RCTEtfVVBTNSwgeF9zdGVwX3FuX2Nocm9tYSk7ICAgLy8geF9zdGVwIGMKKyAgICBXUklURV9WUkVHKEFWMV9VUFNDQUxFX1gwX1FOLCAoeDBfcW5fY2hyb21hPDwxNil8eDBfcW5fbHVtYSk7CisgICAgV1JJVEVfVlJFRyhBVjFfVVBTQ0FMRV9TVEVQX1FOLCAoeF9zdGVwX3FuX2Nocm9tYTw8MTYpfHhfc3RlcF9xbl9sdW1hKTsKKworLyoKKyAqIFRpbGVSIGNhbGN1bGF0aW9uIGhlcmUgaWYgY20gbmVlZHMgYW4gZXhhY3RseSBhY2N1cmF0ZSB2YWx1ZQorICovCisvLyNkZWZpbmUgQVYxX1VQU0NBTEVfVElMRVJfQ0FMQ1VMQVRJT04KKyNpZmRlZiBBVjFfVVBTQ0FMRV9USUxFUl9DQUxDVUxBVElPTgorICAgIHVpbnQzMl90IHVwc2NsX2VuYWJsZWQgPSAxOyAvLyAxIGp1c3QgZm9yIGV4YW1wbGUsIGFjdHVhbGx5IHRoaXMgaXMgdXNlX3N1cGVycmVzIGZsYWcKKyAgICB1aW50MzJfdCB0aWxlcl94ID0gMTkyOyAvLyAxOTIganVzdCBmb3IgZXhhbXBsZSwgYWN0dWFsbHkgdGhpcyBpcyB0aWxlIGVuZAorICAgIHVpbnQzMl90IHV4OworICAgIHVpbnQzMl90IHV4X3RpbGVyLHV4X3RpbGVyX3JuZDMyOworICAgIHVpbnQzMl90IHhxbl95OworICAgIHVpbnQzMl90IHhxbl9jOworICAgIHVpbnQzMl90IHRpbGVyX3hfeSA9IHRpbGVyX3ggICAgIC0gOCAtIDM7IC8vIGRibGsvY2RlZiBsZWZ0LXNoaWZ0LTggcGx1cyB1cHNjYWxpbmcgZXh0cmEtMworICAgIHVpbnQzMl90IHRpbGVyX3hfYyA9ICh0aWxlcl94LzIpIC0gNCAtIDM7IC8vIGRibGsvY2RlZiBsZWZ0LXNoaWZ0LTQgcGx1cyB1cHNjYWxpbmcgZXh0cmEtMworCisgICAgeHFuX3kgPSB4MF9xbl9sdW1hOworICAgIHhxbl9jID0geDBfcW5fY2hyb21hOworICAgIHV4X3RpbGVyID0gMDsKKyAgICB1eF90aWxlcl9ybmQzMiA9IDA7CisgICAgZm9yICh1eD0wOyB1eDwxNjM4NDsgdXgrPTgpIHsKKwkgICAgdWludDMyX3QgeDFxbl95ICAgICA9IHhxbl95ICsgeF9zdGVwX3FuX2x1bWEgICooICA3KzMpOyAvLyBleHRyYS0zIGlzIGZvciBscmYKKwkgICAgdWludDMyX3QgeDFxbl9jICAgICA9IHhxbl9jICsgeF9zdGVwX3FuX2Nocm9tYSooICAzKzMpOyAvLyBleHRyYS0zIGlzIGZvciBscmYKKwkgICAgdWludDMyX3QgeDFxbl95X254dCA9IHhxbl95ICsgeF9zdGVwX3FuX2x1bWEgICooOCs3KzMpOyAvLyBleHRyYS0zIGlzIGZvciBscmYKKwkgICAgdWludDMyX3QgeDFxbl9jX254dCA9IHhxbl9jICsgeF9zdGVwX3FuX2Nocm9tYSooNCszKzMpOyAvLyBleHRyYS0zIGlzIGZvciBscmYKKworCSAgICB1aW50MzJfdCB4MV95ID0gdXBzY2xfZW5hYmxlZCA/ICh4MXFuX3k+PjE0KSA6IHV4ICAgICs3KzM7CisJICAgIHVpbnQzMl90IHgxX2MgPSB1cHNjbF9lbmFibGVkID8gKHgxcW5fYz4+MTQpIDogKHV4LzIpKzMrMzsKKwkgICAgdWludDMyX3QgeDFfeV9ueHQgPSB1cHNjbF9lbmFibGVkID8gKHgxcW5feV9ueHQ+PjE0KSA6IHV4ICAgICs4KzcrMzsKKwkgICAgdWludDMyX3QgeDFfY19ueHQgPSB1cHNjbF9lbmFibGVkID8gKHgxcW5fY19ueHQ+PjE0KSA6ICh1eC8yKSs0KzMrMzsKKworCSAgICBpZiAoKHgxX3k8dGlsZXJfeF95ICYmIHgxX2M8dGlsZXJfeF9jKSAmJgorCQkJKHgxX3lfbnh0Pj10aWxlcl94X3kgfHwgeDFfY19ueHQ+PXRpbGVyX3hfYykpIHsKKwkJICAgIHV4X3RpbGVyID0gdXg7CisJCSAgICB1eF90aWxlcl9ybmQzMiA9ICh1eF90aWxlci8zMiArICh1eF90aWxlciUzMiA/IDEgOiAwKSkgKiAzMjsKKwkJICAgIGJyZWFrOworCQl9CisKKwkgICAgeHFuX3kgKz0geF9zdGVwX3FuX2x1bWEqODsKKwkgICAgeHFuX2MgKz0geF9zdGVwX3FuX2Nocm9tYSo0OworCX0KKworICAgIGF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCSJVUFNfUFJJTlQ6IHhxbl95KDB4JXgpLCB4cW5fYygweCV4KSwgeDFxbl95KDB4JXgpLCB4MXFuX2MoMHgleClcbiIsCisJCXhxbl95LCB4cW5fYywgeDFxbl95LCB4MXFuX2MpOworICAgIGF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCSJVUFNfUFJJTlQ6IHV4X3RpbGVyKCVkKSgweCV4KSwgdXhfdGlsZXJfcm5kMzIoJWQpKDB4JXgpXG4iLAorCQl1eF90aWxlciwgdXhfdGlsZXIsIHV4X3RpbGVyX3JuZDMyLCB1eF90aWxlcl9ybmQzMik7CisjZW5kaWYKKworCS8vIFRFTVAgd3JpdGUgbHJmIHJlZ2lzdGVyIGhlcmUKKwkvL1dSSVRFX1ZSRUcoSEVWQ19EQkxLX0xSRjAsIDE8PDAgfCAxPDwyKTsgLy8gTFJGIFVOSVQgU0laRQorCS8vV1JJVEVfVlJFRyhIRVZDX0RCTEtfTFJGMSwgMzw8MCB8IDE8PDggfCAxPDwxNiB8IDE8PDI0KTsgLy8gTFJGIFVOSVQgTlVNQkVSCisKKwkvLyBURU1QIEdsb2JhbCBFbmFibGVzIHdyaXRlIGhlcmUKKwkvKgorICAgIGNvbnN0IHVpbnQzMl90IGRibGtfZW5hYmxlID0gKCFjbS0+YWxsb3dfaW50cmFiYyAmJiAhY20tPnNpbmdsZV90aWxlX2RlY29kaW5nICYmIChjbS0+bGYuZmlsdGVyX2xldmVsWzBdIHx8IGNtLT5sZi5maWx0ZXJfbGV2ZWxbMV0pKTsKKyAgICBjb25zdCB1aW50MzJfdCBjZGVmX2VuYWJsZSA9ICghY20tPmFsbG93X2ludHJhYmMgJiYgIWNtLT5zaW5nbGVfdGlsZV9kZWNvZGluZyAmJiAhY20tPnNraXBfbG9vcF9maWx0ZXIgJiYgIWNtLT5jb2RlZF9sb3NzbGVzcyAmJiAoY20tPmNkZWZfYml0cyB8fCBjbS0+Y2RlZl9zdHJlbmd0aHNbMF0gfHwgY20tPmNkZWZfdXZfc3RyZW5ndGhzWzBdKSk7CisgICAgcHJpbnRrKCJMUEZfRU5BQkxFUyA6IGRibGsoJWQpIGNkZWYoJWQpXG4iLCBkYmxrX2VuYWJsZSwgY2RlZl9lbmFibGUpOworICAgIGRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX0RCTEtfQ0ZHQiApOworICAgIGRhdGEzMiAmPSB+KDB4Zjw8MjApOworICAgIGRhdGEzMiB8PSAoZGJsa19lbmFibGU8PDIwKTsKKyAgICBkYXRhMzIgfD0gKGNkZWZfZW5hYmxlPDwyMyk7CisgICAgV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHQiwgZGF0YTMyKTsKKwkqLworfQorCisjZW5kaWYgLy8gI2lmZGVmIEFPTV9BVjFfVVBTQ0FMRV9JTklUCisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfZGJsa19zdHJ1Y3Qoc3RydWN0IEFWMUhXX3MgKmh3KQoreworI2lmZGVmIEFPTV9BVjFfREJMS19JTklUCisJaWYgKGh3LT5sZmkpCisJCXZmcmVlKGh3LT5sZmkpOworCWlmIChody0+bGYpCisJCXZmcmVlKGh3LT5sZik7CisJaWYgKGh3LT5zZWdfNGxmKQorCQl2ZnJlZShody0+c2VnXzRsZik7CisJaHctPmxmaSA9IE5VTEw7CisJaHctPmxmID0gTlVMTDsKKwlody0+c2VnXzRsZiA9IE5VTEw7CisjZW5kaWYKK30KKworc3RhdGljIGludCBpbml0X2RibGtfc3RydWMoc3RydWN0IEFWMUhXX3MgKmh3KQoreworI2lmZGVmIEFPTV9BVjFfREJMS19JTklUCisgICAgaHctPmxmaSA9IHZtYWxsb2Moc2l6ZW9mKGxvb3BfZmlsdGVyX2luZm9fbikpOworICAgIGh3LT5sZiA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBsb29wZmlsdGVyKSk7CisgICAgaHctPnNlZ180bGYgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VnbWVudGF0aW9uX2xmKSk7CisKKyAgICBpZiAoaHctPmxmaSA9PSBOVUxMIHx8IGh3LT5sZiA9PSBOVUxMIHx8IGh3LT5zZWdfNGxmID09IE5VTEwpIHsKKwkJcHJpbnRrKCJbdGVzdC5jXSBhb21fbG9vcF9maWx0ZXIgaW5pdCBtYWxsb2MgZXJyb3IhISFcbiIpOworCQlyZWxlYXNlX2RibGtfc3RydWN0KGh3KTsKKwkJcmV0dXJuIC0xOworCX0KKworICAgIGh3LT5sZi0+bW9kZV9yZWZfZGVsdGFfZW5hYmxlZCA9IDE7IC8vIHNldCBkZWZhdWx0IGhlcmUKKyAgICBody0+bGYtPm1vZGVfcmVmX2RlbHRhX3VwZGF0ZSA9IDE7IC8vIHNldCBkZWZhdWx0IGhlcmUKKyAgICBody0+bGYtPnNoYXJwbmVzc19sZXZlbCA9IDA7IC8vIGluaXQgdG8gMAorICAgIGh3LT5sZi0+bGZfcGljX2NudCA9IDA7IC8vIGluaXQgdG8gMAorI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19kYmxrX2h3KHN0cnVjdCBBVjFIV19zICpodykKK3sKKyAgICBBVjFEZWNvZGVyICpwYmkgPSBody0+cGJpOworICAgIEFWMV9DT01NT04gKmNtID0gJmh3LT5jb21tb247CisgICAgbG9vcF9maWx0ZXJfaW5mb19uICpsZmkgPSBody0+bGZpOworICAgIHN0cnVjdCBsb29wZmlsdGVyICpsZiA9IGh3LT5sZjsKKyAgICBzdHJ1Y3Qgc2VnbWVudGF0aW9uX2xmICpzZWdfNGxmID0gaHctPnNlZ180bGY7CisgICAgQnVmZkluZm9fdCogYnVmX3NwZWMgPSBwYmktPndvcmtfc3BhY2VfYnVmOworCVBJQ19CVUZGRVJfQ09ORklHKiBjdXJfcGljX2NvbmZpZyA9ICZjbS0+Y3VyX2ZyYW1lLT5idWY7CisJUElDX0JVRkZFUl9DT05GSUcqIHByZXZfcGljX2NvbmZpZyA9ICZjbS0+cHJldl9mcmFtZS0+YnVmOworICAgIGludCBpOworCisjaWZkZWYgQU9NX0FWMV9EQkxLX0lOSVQKKyNpZmRlZiBEVUFMX0RFQ09ERQorI2Vsc2UKKwlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCSJbdGVzdC5jIHJlZl9kZWx0YV0gY3VyX2ZyYW1lIDogJXAgcHJldl9mcmFtZSA6ICVwIC0gJXAgXG4iLAorCWNtLT5jdXJfZnJhbWUsIGNtLT5wcmV2X2ZyYW1lLAorCWF2MV9nZXRfcHJpbWFyeV9yZWZfZnJhbWVfYnVmKGNtKSk7CisJLy8gZ2V0IGxmIHBhcmFtZXRlcnMgZnJvbSBwYXJzZXIKKwlsZi0+bW9kZV9yZWZfZGVsdGFfZW5hYmxlZCA9CisJCShody0+YW9tX3BhcmFtLnAubG9vcF9maWx0ZXJfbW9kZV9yZWZfZGVsdGFfZW5hYmxlZCAmIDEpOworCWxmLT5tb2RlX3JlZl9kZWx0YV91cGRhdGUgPQorCQkoKGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9tb2RlX3JlZl9kZWx0YV9lbmFibGVkID4+IDEpICYgMSk7CisJbGYtPnNoYXJwbmVzc19sZXZlbCA9CisJCWh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9zaGFycG5lc3NfbGV2ZWw7CisJaWYgKCgoaHctPmFvbV9wYXJhbS5wLmxvb3BfZmlsdGVyX21vZGVfcmVmX2RlbHRhX2VuYWJsZWQpJjMpID09IDMpIHsgLy8gZW5hYmxlZCBidXQgYW5kIHVwZGF0ZQorCQlpZiAoY20tPnByZXZfZnJhbWUgPD0gMCkgeworCQkgIC8vIGFscmVhZHkgaW5pdGlhbGl6ZWQgaW4gTWljcm9jb2RlCisJCQlsZi0+cmVmX2RlbHRhc1swXSA9IGNvbnYyaW50OCgodWludDhfdCkoaHctPmFvbV9wYXJhbS5wLmxvb3BfZmlsdGVyX3JlZl9kZWx0YXNfMCksNyk7CisJCQlsZi0+cmVmX2RlbHRhc1sxXQk9IGNvbnYyaW50OCgodWludDhfdCkoaHctPmFvbV9wYXJhbS5wLmxvb3BfZmlsdGVyX3JlZl9kZWx0YXNfMD4+OCksNyk7CisJCQlsZi0+cmVmX2RlbHRhc1syXQk9IGNvbnYyaW50OCgodWludDhfdCkoaHctPmFvbV9wYXJhbS5wLmxvb3BfZmlsdGVyX3JlZl9kZWx0YXNfMSksNyk7CisJCQlsZi0+cmVmX2RlbHRhc1szXQk9IGNvbnYyaW50OCgodWludDhfdCkoaHctPmFvbV9wYXJhbS5wLmxvb3BfZmlsdGVyX3JlZl9kZWx0YXNfMT4+OCksNyk7CisJCQlsZi0+cmVmX2RlbHRhc1s0XQk9IGNvbnYyaW50OCgodWludDhfdCkoaHctPmFvbV9wYXJhbS5wLmxvb3BfZmlsdGVyX3JlZl9kZWx0YXNfMiksNyk7CisJCQlsZi0+cmVmX2RlbHRhc1s1XQk9IGNvbnYyaW50OCgodWludDhfdCkoaHctPmFvbV9wYXJhbS5wLmxvb3BfZmlsdGVyX3JlZl9kZWx0YXNfMj4+OCksNyk7CisJCQlsZi0+cmVmX2RlbHRhc1s2XQk9IGNvbnYyaW50OCgodWludDhfdCkoaHctPmFvbV9wYXJhbS5wLmxvb3BfZmlsdGVyX3JlZl9kZWx0YXNfMyksNyk7CisJCQlsZi0+cmVmX2RlbHRhc1s3XQk9IGNvbnYyaW50OCgodWludDhfdCkoaHctPmFvbV9wYXJhbS5wLmxvb3BfZmlsdGVyX3JlZl9kZWx0YXNfMz4+OCksNyk7CisJCQlsZi0+bW9kZV9kZWx0YXNbMF0gPSBjb252MmludDgoKHVpbnQ4X3QpKGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9tb2RlX2RlbHRhc18wKSw3KTsKKwkJCWxmLT5tb2RlX2RlbHRhc1sxXSA9IGNvbnYyaW50OCgodWludDhfdCkoaHctPmFvbV9wYXJhbS5wLmxvb3BfZmlsdGVyX21vZGVfZGVsdGFzXzA+PjgpLDcpOworCQl9IGVsc2UgeworCQkJbGYtPnJlZl9kZWx0YXNbMF0gPSAoaHctPmFvbV9wYXJhbS5wLmxvb3BfZmlsdGVyX3JlZl9kZWx0YXNfMCAmIDB4ODApID8KKwkJCQljb252MmludDgoKHVpbnQ4X3QpKGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9yZWZfZGVsdGFzXzApLDcpIDoKKwkJCSAgICBjbS0+cHJldl9mcmFtZS0+cmVmX2RlbHRhc1swXTsKKwkJCWxmLT5yZWZfZGVsdGFzWzFdCT0gKGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9yZWZfZGVsdGFzXzAgJiAweDgwMDApID8KKwkJCQljb252MmludDgoKHVpbnQ4X3QpKGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9yZWZfZGVsdGFzXzA+PjgpLDcpIDoKKwkJCSAgICBjbS0+cHJldl9mcmFtZS0+cmVmX2RlbHRhc1sxXTsKKwkJCWxmLT5yZWZfZGVsdGFzWzJdCT0gKGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9yZWZfZGVsdGFzXzEgJiAweDgwKSA/CisJCQkJY29udjJpbnQ4KCh1aW50OF90KShody0+YW9tX3BhcmFtLnAubG9vcF9maWx0ZXJfcmVmX2RlbHRhc18xKSw3KSA6CisJCQkgICAgY20tPnByZXZfZnJhbWUtPnJlZl9kZWx0YXNbMl07CisJCQlsZi0+cmVmX2RlbHRhc1szXQk9IChody0+YW9tX3BhcmFtLnAubG9vcF9maWx0ZXJfcmVmX2RlbHRhc18xICYgMHg4MDAwKSA/CisJCQkJY29udjJpbnQ4KCh1aW50OF90KShody0+YW9tX3BhcmFtLnAubG9vcF9maWx0ZXJfcmVmX2RlbHRhc18xPj44KSw3KSA6CisJCQkgICAgY20tPnByZXZfZnJhbWUtPnJlZl9kZWx0YXNbM107CisJCQlsZi0+cmVmX2RlbHRhc1s0XQk9IChody0+YW9tX3BhcmFtLnAubG9vcF9maWx0ZXJfcmVmX2RlbHRhc18yICYgMHg4MCkgPworCQkJCWNvbnYyaW50OCgodWludDhfdCkoaHctPmFvbV9wYXJhbS5wLmxvb3BfZmlsdGVyX3JlZl9kZWx0YXNfMiksNykgOgorCQkJICAgIGNtLT5wcmV2X2ZyYW1lLT5yZWZfZGVsdGFzWzRdOworCQkJbGYtPnJlZl9kZWx0YXNbNV0JPSAoaHctPmFvbV9wYXJhbS5wLmxvb3BfZmlsdGVyX3JlZl9kZWx0YXNfMiAmIDB4ODAwMCkgPworCQkJCWNvbnYyaW50OCgodWludDhfdCkoaHctPmFvbV9wYXJhbS5wLmxvb3BfZmlsdGVyX3JlZl9kZWx0YXNfMj4+OCksNykgOgorCQkJICAgIGNtLT5wcmV2X2ZyYW1lLT5yZWZfZGVsdGFzWzVdOworCQkJbGYtPnJlZl9kZWx0YXNbNl0gPSAoaHctPmFvbV9wYXJhbS5wLmxvb3BfZmlsdGVyX3JlZl9kZWx0YXNfMyAmIDB4ODApID8KKwkJCQljb252MmludDgoKHVpbnQ4X3QpKGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9yZWZfZGVsdGFzXzMpLDcpIDoKKwkJCSAgICBjbS0+cHJldl9mcmFtZS0+cmVmX2RlbHRhc1s2XTsKKwkJCWxmLT5yZWZfZGVsdGFzWzddCT0gKGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9yZWZfZGVsdGFzXzMgJiAweDgwMDApID8KKwkJCQljb252MmludDgoKHVpbnQ4X3QpKGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9yZWZfZGVsdGFzXzM+PjgpLDcpIDoKKwkJCSAgICBjbS0+cHJldl9mcmFtZS0+cmVmX2RlbHRhc1s3XTsKKwkJCWxmLT5tb2RlX2RlbHRhc1swXSA9IChody0+YW9tX3BhcmFtLnAubG9vcF9maWx0ZXJfbW9kZV9kZWx0YXNfMCAmIDB4ODApID8KKwkJCQljb252MmludDgoKHVpbnQ4X3QpKGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9tb2RlX2RlbHRhc18wKSw3KSA6CisJCQkgICAgY20tPnByZXZfZnJhbWUtPm1vZGVfZGVsdGFzWzBdOworCQkJbGYtPm1vZGVfZGVsdGFzWzFdID0gKGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9tb2RlX2RlbHRhc18wICYgMHg4MDAwKSA/CisJCQkJY29udjJpbnQ4KCh1aW50OF90KShody0+YW9tX3BhcmFtLnAubG9vcF9maWx0ZXJfbW9kZV9kZWx0YXNfMD4+OCksNykgOgorCQkJICAgIGNtLT5wcmV2X2ZyYW1lLT5tb2RlX2RlbHRhc1sxXTsKKwkJfQorCX0gLy9lbHNlIGlmIChody0+YW9tX3BhcmFtLnAubG9vcF9maWx0ZXJfbW9kZV9yZWZfZGVsdGFfZW5hYmxlZCA9PSAxKSB7IC8vIGVuYWJsZWQgYnV0IG5vIHVwZGF0ZQorCSAgZWxzZSB7IC8vIG1hdGNoIGMgY29kZSAtLSBub3QgZW5hYmxlZCwgc3RpbGwgbmVlZCB0byBjb3B5IHByZXYgdG8gdXNlZCBmb3IgbmV4dAorCQlpZiAoKGNtLT5wcmV2X2ZyYW1lIDw9IDApIHwgKGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9tb2RlX3JlZl9kZWx0YV9lbmFibGVkICYgNCkpIHsKKwkJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCQkJIlt0ZXN0LmNdIG1vZGVfcmVmX2RlbHRhIHNldCB0byBkZWZhdWx0XG4iKTsKKwkJCWxmLT5yZWZfZGVsdGFzWzBdID0gY29udjJpbnQ4KCh1aW50OF90KTEsNyk7CisJCQlsZi0+cmVmX2RlbHRhc1sxXSA9IGNvbnYyaW50OCgodWludDhfdCkwLDcpOworCQkJbGYtPnJlZl9kZWx0YXNbMl0gPSBjb252MmludDgoKHVpbnQ4X3QpMCw3KTsKKwkJCWxmLT5yZWZfZGVsdGFzWzNdID0gY29udjJpbnQ4KCh1aW50OF90KTAsNyk7CisJCQlsZi0+cmVmX2RlbHRhc1s0XSA9IGNvbnYyaW50OCgodWludDhfdCkweGZmLDcpOworCQkJbGYtPnJlZl9kZWx0YXNbNV0gPSBjb252MmludDgoKHVpbnQ4X3QpMCw3KTsKKwkJCWxmLT5yZWZfZGVsdGFzWzZdID0gY29udjJpbnQ4KCh1aW50OF90KTB4ZmYsNyk7CisJCQlsZi0+cmVmX2RlbHRhc1s3XSA9IGNvbnYyaW50OCgodWludDhfdCkweGZmLDcpOworCQkJbGYtPm1vZGVfZGVsdGFzWzBdID0gY29udjJpbnQ4KCh1aW50OF90KTAsNyk7CisJCQlsZi0+bW9kZV9kZWx0YXNbMV0gPSBjb252MmludDgoKHVpbnQ4X3QpMCw3KTsKKwkJfSBlbHNlIHsKKwkJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCQkJIlt0ZXN0LmNdIG1vZGVfcmVmX2RlbHRhIGNvcHkgZnJvbSBwcmV2X2ZyYW1lXG4iKTsKKwkJCWxmLT5yZWZfZGVsdGFzWzBdCQkJICAgPSBjbS0+cHJldl9mcmFtZS0+cmVmX2RlbHRhc1swXTsKKwkJCWxmLT5yZWZfZGVsdGFzWzFdCQkJICAgPSBjbS0+cHJldl9mcmFtZS0+cmVmX2RlbHRhc1sxXTsKKwkJCWxmLT5yZWZfZGVsdGFzWzJdCQkJICAgPSBjbS0+cHJldl9mcmFtZS0+cmVmX2RlbHRhc1syXTsKKwkJCWxmLT5yZWZfZGVsdGFzWzNdCQkJICAgPSBjbS0+cHJldl9mcmFtZS0+cmVmX2RlbHRhc1szXTsKKwkJCWxmLT5yZWZfZGVsdGFzWzRdCQkJICAgPSBjbS0+cHJldl9mcmFtZS0+cmVmX2RlbHRhc1s0XTsKKwkJCWxmLT5yZWZfZGVsdGFzWzVdCQkJICAgPSBjbS0+cHJldl9mcmFtZS0+cmVmX2RlbHRhc1s1XTsKKwkJCWxmLT5yZWZfZGVsdGFzWzZdCQkJICAgPSBjbS0+cHJldl9mcmFtZS0+cmVmX2RlbHRhc1s2XTsKKwkJCWxmLT5yZWZfZGVsdGFzWzddCQkJICAgPSBjbS0+cHJldl9mcmFtZS0+cmVmX2RlbHRhc1s3XTsKKwkJCWxmLT5tb2RlX2RlbHRhc1swXQkJCSAgPSBjbS0+cHJldl9mcmFtZS0+bW9kZV9kZWx0YXNbMF07CisJCQlsZi0+bW9kZV9kZWx0YXNbMV0JCQkgID0gY20tPnByZXZfZnJhbWUtPm1vZGVfZGVsdGFzWzFdOworCQl9CisJfQorCWxmLT5maWx0ZXJfbGV2ZWxbMF0JCQkgPSBody0+YW9tX3BhcmFtLnAubG9vcF9maWx0ZXJfbGV2ZWxfMDsKKwlsZi0+ZmlsdGVyX2xldmVsWzFdCQkJID0gaHctPmFvbV9wYXJhbS5wLmxvb3BfZmlsdGVyX2xldmVsXzE7CisJbGYtPmZpbHRlcl9sZXZlbF91ICAgIAkJICA9IGh3LT5hb21fcGFyYW0ucC5sb29wX2ZpbHRlcl9sZXZlbF91OworCWxmLT5maWx0ZXJfbGV2ZWxfdiAgICAJCSAgPSBody0+YW9tX3BhcmFtLnAubG9vcF9maWx0ZXJfbGV2ZWxfdjsKKworCWNtLT5jdXJfZnJhbWUtPnJlZl9kZWx0YXNbMF0gPSBsZi0+cmVmX2RlbHRhc1swXTsKKwljbS0+Y3VyX2ZyYW1lLT5yZWZfZGVsdGFzWzFdID0gbGYtPnJlZl9kZWx0YXNbMV07CisJY20tPmN1cl9mcmFtZS0+cmVmX2RlbHRhc1syXSA9IGxmLT5yZWZfZGVsdGFzWzJdOworCWNtLT5jdXJfZnJhbWUtPnJlZl9kZWx0YXNbM10gPSBsZi0+cmVmX2RlbHRhc1szXTsKKwljbS0+Y3VyX2ZyYW1lLT5yZWZfZGVsdGFzWzRdID0gbGYtPnJlZl9kZWx0YXNbNF07CisJY20tPmN1cl9mcmFtZS0+cmVmX2RlbHRhc1s1XSA9IGxmLT5yZWZfZGVsdGFzWzVdOworCWNtLT5jdXJfZnJhbWUtPnJlZl9kZWx0YXNbNl0gPSBsZi0+cmVmX2RlbHRhc1s2XTsKKwljbS0+Y3VyX2ZyYW1lLT5yZWZfZGVsdGFzWzddID0gbGYtPnJlZl9kZWx0YXNbN107CisJY20tPmN1cl9mcmFtZS0+bW9kZV9kZWx0YXNbMF0gPSBsZi0+bW9kZV9kZWx0YXNbMF07CisJY20tPmN1cl9mcmFtZS0+bW9kZV9kZWx0YXNbMV0gPSBsZi0+bW9kZV9kZWx0YXNbMV07CisKKwkvLyBnZXQgc2VnXzRsZiBwYXJhbWV0ZXJzIGZyb20gcGFyc2VyCisJc2VnXzRsZi0+ZW5hYmxlZCA9IGh3LT5hb21fcGFyYW0ucC5zZWdtZW50YXRpb25fZW5hYmxlZCAmIDE7CisJY20tPmN1cl9mcmFtZS0+c2VnbWVudGF0aW9uX2VuYWJsZWQgPSBody0+YW9tX3BhcmFtLnAuc2VnbWVudGF0aW9uX2VuYWJsZWQgJiAxOworCWNtLT5jdXJfZnJhbWUtPmludHJhX29ubHkgPSAoaHctPmFvbV9wYXJhbS5wLnNlZ21lbnRhdGlvbl9lbmFibGVkID4+IDIpICYgMTsKKwljbS0+Y3VyX2ZyYW1lLT5zZWdtZW50YXRpb25fdXBkYXRlX21hcCA9IChody0+YW9tX3BhcmFtLnAuc2VnbWVudGF0aW9uX2VuYWJsZWQgPj4gMykgJiAxOworCisJaWYgKGh3LT5hb21fcGFyYW0ucC5zZWdtZW50YXRpb25fZW5hYmxlZCAmIDEpIHsgLy8gc2VnbWVudGF0aW9uX2VuYWJsZWQKKwkJaWYgKGh3LT5hb21fcGFyYW0ucC5zZWdtZW50YXRpb25fZW5hYmxlZCAmIDIpIHsgLy8gc2VnbWVudGF0aW9uX3VwZGF0ZV9kYXRhCisJCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1NFR01FTlRTOyBpKyspIHsKKwkJCQlzZWdfNGxmLT5zZWdfbGZfaW5mb195W2ldID0gaHctPmFvbV9wYXJhbS5wLnNlZ19sZl9pbmZvX3lbaV07CisJCQkJc2VnXzRsZi0+c2VnX2xmX2luZm9fY1tpXSA9IGh3LT5hb21fcGFyYW0ucC5zZWdfbGZfaW5mb19jW2ldOworCQkJCSNpZmRlZiBEQkdfTFBGX1BSSU5UCisJCQkJCXByaW50aygiIHJlYWQgc2VnX2xmX2luZm8gWyVkXSA6IDB4JXgsIDB4JXhcbiIsCisJCQkJCWksIHNlZ180bGYtPnNlZ19sZl9pbmZvX3lbaV0sIHNlZ180bGYtPnNlZ19sZl9pbmZvX2NbaV0pOworCQkJCSNlbmRpZgorCQkJCX0KKwkJCX0gLy8gc2VnbWVudGF0aW9uX3VwZGF0ZV9kYXRhCisJCQllbHNlIHsgLy8gbm8gc2VnbWVudGF0aW9uX3VwZGF0ZV9kYXRhCisJCQkJaWYgKGNtLT5wcmV2X2ZyYW1lIDw9IDApIHsKKwkJCQkJZm9yIChpPTA7aTxNQVhfU0VHTUVOVFM7aSsrKSB7CisJCQkJCQlzZWdfNGxmLT5zZWdfbGZfaW5mb195W2ldID0gMDsKKwkJCQkJCXNlZ180bGYtPnNlZ19sZl9pbmZvX2NbaV0gPSAwOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJZm9yIChpID0gMDsgaSA8IE1BWF9TRUdNRU5UUzsgaSsrKSB7CisJCQkJCQlzZWdfNGxmLT5zZWdfbGZfaW5mb195W2ldID0gY20tPnByZXZfZnJhbWUtPnNlZ19sZl9pbmZvX3lbaV07CisJCQkJCQlzZWdfNGxmLT5zZWdfbGZfaW5mb19jW2ldID0gY20tPnByZXZfZnJhbWUtPnNlZ19sZl9pbmZvX2NbaV07CisJCSNpZmRlZiBEQkdfTFBGX1BSSU5UCisJCQkJCSAgcHJpbnRrKCIgUmVmcmVuY2Ugc2VnX2xmX2luZm8gWyVkXSA6IDB4JXgsIDB4JXhcbiIsCisJCQkJCSAgaSwgc2VnXzRsZi0+c2VnX2xmX2luZm9feVtpXSwgc2VnXzRsZi0+c2VnX2xmX2luZm9fY1tpXSk7CisJCSNlbmRpZgorCQkJCQl9CisJCQkJfQorCQkJfSAvLyBubyBzZWdtZW50YXRpb25fdXBkYXRlX2RhdGEKKwkJfSAvLyBzZWdtZW50YXRpb25fZW5hYmxlZAorCQllbHNlIHsKKwkJCWZvciAoaT0wO2k8TUFYX1NFR01FTlRTO2krKykgeworCQkJCXNlZ180bGYtPnNlZ19sZl9pbmZvX3lbaV0gPSAwOworCQkJCXNlZ180bGYtPnNlZ19sZl9pbmZvX2NbaV0gPSAwOworCQkJfQorCQl9IC8vIE5PVCBzZWdtZW50YXRpb25fZW5hYmxlZAorCQlmb3IgKGk9MDtpPE1BWF9TRUdNRU5UUztpKyspIHsKKwkJCWNtLT5jdXJfZnJhbWUtPnNlZ19sZl9pbmZvX3lbaV0gPSBzZWdfNGxmLT5zZWdfbGZfaW5mb195W2ldOworCQkJY20tPmN1cl9mcmFtZS0+c2VnX2xmX2luZm9fY1tpXSA9IHNlZ180bGYtPnNlZ19sZl9pbmZvX2NbaV07CisjaWZkZWYgREJHX0xQRl9QUklOVAorCQkJcHJpbnRrKCIgU0FWRSBzZWdfbGZfaW5mbyBbJWRdIDogMHgleCwgMHgleFxuIiwKKwkJCWksIGNtLT5jdXJfZnJhbWUtPnNlZ19sZl9pbmZvX3lbaV0sCisJCQljbS0+Y3VyX2ZyYW1lLT5zZWdfbGZfaW5mb19jW2ldKTsKKyNlbmRpZgorCQl9CisKKwkvKgorCSogVXBkYXRlIGxvb3AgZmlsdGVyIFRoci9MdmwgdGFibGUgZm9yIGV2ZXJ5IGZyYW1lCisJKi8KKwlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkiW3Rlc3QuY10gYXYxX2xvb3BfZmlsdGVyX2ZyYW1lX2luaXQgKHJ1biBiZWZvcmUgZXZlcnkgZnJhbWUgZGVjb2Rpbmcgc3RhcnQpXG4iKTsKKwlhdjFfbG9vcF9maWx0ZXJfZnJhbWVfaW5pdChwYmksIHNlZ180bGYsIGxmaSwgbGYsIGNtLT5kZWNfd2lkdGgpOworI2VuZGlmIC8vIG5vdCBEVUFMX0RFQ09ERQorI2VuZGlmCisKKyNpZmRlZiBBT01fQVYxX1VQU0NBTEVfSU5JVAorCS8qCisJKiBpbml0IGZvciB1cHNjYWxpbmcKKwkqLworCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCSJbdGVzdC5jXSBhdjFfdXBzY2FsZV9mcmFtZV9pbml0IChydW4gYmVmb3JlIGV2ZXJ5IGZyYW1lIGRlY29kaW5nIHN0YXJ0KVxuIik7CisJYXYxX3Vwc2NhbGVfZnJhbWVfaW5pdChwYmksCisJCXBiaS0+Y29tbW9uLCAmaHctPmFvbV9wYXJhbSk7CisjZW5kaWYgLy8gI2lmZGVmIEFPTV9BVjFfVVBTQ0FMRV9JTklUCisKKwkvL0J1ZmZJbmZvX3QqIGJ1Zl9zcGVjID0gcGJpLT53b3JrX3NwYWNlX2J1ZjsKKwlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkiW3Rlc3QuY10gY3VyX2ZyYW1lIDogJXAgcHJldl9mcmFtZSA6ICVwIC0gJXAgXG4iLAorCQljbS0+Y3VyX2ZyYW1lLCBjbS0+cHJldl9mcmFtZSwgYXYxX2dldF9wcmltYXJ5X3JlZl9mcmFtZV9idWYoY20pKTsKKwlpZiAoY20tPmN1cl9mcmFtZSA8PSAwKSB7CisJCVdSSVRFX1ZSRUcoQU9NX0FWMV9DREZfQlVGRkVSX1csIGJ1Zl9zcGVjLT5jZGZfYnVmLmJ1Zl9zdGFydCk7CisJCVdSSVRFX1ZSRUcoQU9NX0FWMV9TRUdfTUFQX0JVRkZFUl9XLCBidWZfc3BlYy0+c2VnX21hcC5idWZfc3RhcnQpOworCX0KKwllbHNlIHsKKwkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJCSJbdGVzdC5jXSBDb25maWcgV1JJVEUgQ0RGX0JVRi9TRUdfTUFQX0JVRiAgOiAlZFxuIiwKKwkJCWN1cl9waWNfY29uZmlnLT5pbmRleCk7CisJCVdSSVRFX1ZSRUcoQU9NX0FWMV9DREZfQlVGRkVSX1csCisJCQlidWZfc3BlYy0+Y2RmX2J1Zi5idWZfc3RhcnQgKyAoMHg4MDAwKmN1cl9waWNfY29uZmlnLT5pbmRleCkpOworCQlXUklURV9WUkVHKEFPTV9BVjFfU0VHX01BUF9CVUZGRVJfVywKKwkJCWJ1Zl9zcGVjLT5zZWdfbWFwLmJ1Zl9zdGFydCArICgoYnVmX3NwZWMtPnNlZ19tYXAuYnVmX3NpemUgLyAxNikgKiBjdXJfcGljX2NvbmZpZy0+aW5kZXgpKTsKKwl9CisJY20tPmN1cl9mcmFtZS0+c2VnX21pX3Jvd3MgPSBjbS0+Y3VyX2ZyYW1lLT5taV9yb3dzOworCWNtLT5jdXJfZnJhbWUtPnNlZ19taV9jb2xzID0gY20tPmN1cl9mcmFtZS0+bWlfY29sczsKKwlpZiAoY20tPnByZXZfZnJhbWUgPD0gMCkgeworCQlXUklURV9WUkVHKEFPTV9BVjFfQ0RGX0JVRkZFUl9SLCBidWZfc3BlYy0+Y2RmX2J1Zi5idWZfc3RhcnQpOworCQlXUklURV9WUkVHKEFPTV9BVjFfU0VHX01BUF9CVUZGRVJfUiwgYnVmX3NwZWMtPnNlZ19tYXAuYnVmX3N0YXJ0KTsKKwl9IGVsc2UgeworCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkJIlt0ZXN0LmNdIENvbmZpZyBSRUFEICBDREZfQlVGL1NFR19NQVBfQlVGICA6ICVkXG4iLAorCQkJcHJldl9waWNfY29uZmlnLT5pbmRleCk7CisJCVdSSVRFX1ZSRUcoQU9NX0FWMV9DREZfQlVGRkVSX1IsCisJCQlidWZfc3BlYy0+Y2RmX2J1Zi5idWZfc3RhcnQgKyAoMHg4MDAwKnByZXZfcGljX2NvbmZpZy0+aW5kZXgpKTsKKwkJV1JJVEVfVlJFRyhBT01fQVYxX1NFR19NQVBfQlVGRkVSX1IsCisJCQlidWZfc3BlYy0+c2VnX21hcC5idWZfc3RhcnQgKyAoKGJ1Zl9zcGVjLT5zZWdfbWFwLmJ1Zl9zaXplIC8gMTYpICogcHJldl9waWNfY29uZmlnLT5pbmRleCkpOworCisJCS8vIHNlZ21lbnRhdGlvbl9lbmFibGVkIGJ1dCBubyBzZWdtZW50YXRpb25fdXBkYXRlX2RhdGEKKwkJaWYgKChody0+YW9tX3BhcmFtLnAuc2VnbWVudGF0aW9uX2VuYWJsZWQgJiAzKSA9PSAxKSB7CisJCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkJCSJbdGVzdC5jXSBzZWdmZWF0dXJlc19jb3B5IGZyb20gcHJldl9mcmFtZVxuIik7CisJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQkJV1JJVEVfVlJFRyhBT01fQVYxX1NFR01FTlRfRkVBVFVSRSwKKwkJCQkJY20tPnByZXZfZnJhbWUtPnNlZ21lbnRfZmVhdHVyZVtpXSk7CisJCQl9CisJCX0KKwkJLy8gc2VnbWVudGF0aW9uX2VuYWJsZWQgYnV0IG5vIHNlZ21lbnRhdGlvbl91cGRhdGVfbWFwCisJCWlmICgoaHctPmFvbV9wYXJhbS5wLnNlZ21lbnRhdGlvbl9lbmFibGVkICYgOSkgPT0gMSkgeworCQkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJCQkiW3Rlc3QuY10gc2VnX21hcF9zaXplIGNvcHkgZnJvbSBwcmV2X2ZyYW1lXG4iKTsKKwkJCWNtLT5jdXJfZnJhbWUtPnNlZ19taV9yb3dzID0gY20tPnByZXZfZnJhbWUtPnNlZ19taV9yb3dzOworCQkJY20tPmN1cl9mcmFtZS0+c2VnX21pX2NvbHMgPSBjbS0+cHJldl9mcmFtZS0+c2VnX21pX2NvbHM7CisJCX0KKwl9CisjaWZkZWYgUFJJTlRfSEVWQ19EQVRBX1BBVEhfTU9OSVRPUgorCXsKKwkJdWludDMyX3QgdG90YWxfY2xrX2NvdW50OworCQl1aW50MzJfdCBwYXRoX3RyYW5zZmVyX2NvdW50OworCQl1aW50MzJfdCBwYXRoX3dhaXRfY291bnQ7CisJCWZsb2F0IHBhdGhfd2FpdF9yYXRpbzsKKwkJaWYgKHBiaS0+ZGVjb2RlX2lkeCA+IDEpIHsKKwkJCVdSSVRFX1ZSRUcoSEVWQ19QQVRIX01PTklUT1JfQ1RSTCwgMCk7IC8vIERpc2FiYmxlIG1vbml0b3IgYW5kIHNldCByZF9pZHggdG8gMAorCQkJdG90YWxfY2xrX2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUEFUSF9NT05JVE9SX0RBVEEpOworCisJCQlXUklURV9WUkVHKEhFVkNfUEFUSF9NT05JVE9SX0NUUkwsICgxPDw0KSk7IC8vIERpc2FiYmxlIG1vbml0b3IgYW5kIHNldCByZF9pZHggdG8gMAorCisJCQkvLyBwYXJzZXIgLS0+IGlxaXQKKwkJCXBhdGhfdHJhbnNmZXJfY291bnQgPSBSRUFEX1ZSRUcoSEVWQ19QQVRIX01PTklUT1JfREFUQSk7CisJCQlwYXRoX3dhaXRfY291bnQgPSBSRUFEX1ZSRUcoSEVWQ19QQVRIX01PTklUT1JfREFUQSk7CisJCQlpZiAocGF0aF90cmFuc2Zlcl9jb3VudCA9PSAwKQorCQkJCXBhdGhfd2FpdF9yYXRpbyA9IDAuMDsKKwkJCWVsc2UKKwkJCQlwYXRoX3dhaXRfcmF0aW8gPQorCQkJCQkoZmxvYXQpcGF0aF93YWl0X2NvdW50LyhmbG9hdClwYXRoX3RyYW5zZmVyX2NvdW50OworCQkJcHJpbnRrKCJbUCVkIEhFVkMgUEFUSF0gUGFyc2VyL0lRSVQvSVBQL0RCTEsvT1cvRERSL0NNRCBXQUlUSU5HIFwlIDogJS4yZiIsCisJCQkJcGJpLT5kZWNvZGVfaWR4IC0gMiwKKwkJCQlwYXRoX3dhaXRfcmF0aW8pOworCisJCQkvLyBpcWl0IC0tPiBpcHAKKwkJCXBhdGhfdHJhbnNmZXJfY291bnQgPSBSRUFEX1ZSRUcoSEVWQ19QQVRIX01PTklUT1JfREFUQSk7CisJCQlwYXRoX3dhaXRfY291bnQgPSBSRUFEX1ZSRUcoSEVWQ19QQVRIX01PTklUT1JfREFUQSk7CisJCQlpZiAocGF0aF90cmFuc2Zlcl9jb3VudCA9PSAwKQorCQkJCXBhdGhfd2FpdF9yYXRpbyA9IDAuMDsKKwkJCWVsc2UKKwkJCQlwYXRoX3dhaXRfcmF0aW8gPSAoZmxvYXQpcGF0aF93YWl0X2NvdW50LyhmbG9hdClwYXRoX3RyYW5zZmVyX2NvdW50OworCQkJcHJpbnRrKCIgJS4yZiIsIHBhdGhfd2FpdF9yYXRpbyk7CisKKwkJCS8vIGRibGsgPC0tIGlwcAorCQkJcGF0aF90cmFuc2Zlcl9jb3VudCA9IFJFQURfVlJFRyhIRVZDX1BBVEhfTU9OSVRPUl9EQVRBKTsKKwkJCXBhdGhfd2FpdF9jb3VudCA9IFJFQURfVlJFRyhIRVZDX1BBVEhfTU9OSVRPUl9EQVRBKTsKKwkJCWlmIChwYXRoX3RyYW5zZmVyX2NvdW50ID09IDApCisJCQkJcGF0aF93YWl0X3JhdGlvID0gMC4wOworCQkJZWxzZQorCQkJCXBhdGhfd2FpdF9yYXRpbyA9IChmbG9hdClwYXRoX3dhaXRfY291bnQvKGZsb2F0KXBhdGhfdHJhbnNmZXJfY291bnQ7CisJCQlwcmludGsoIiAlLjJmIiwgcGF0aF93YWl0X3JhdGlvKTsKKworCQkJLy8gZGJsayAtLT4gb3cKKwkJCXBhdGhfdHJhbnNmZXJfY291bnQgPSBSRUFEX1ZSRUcoSEVWQ19QQVRIX01PTklUT1JfREFUQSk7CisJCQlwYXRoX3dhaXRfY291bnQgPSBSRUFEX1ZSRUcoSEVWQ19QQVRIX01PTklUT1JfREFUQSk7CisJCQlpZiAocGF0aF90cmFuc2Zlcl9jb3VudCA9PSAwKQorCQkJCXBhdGhfd2FpdF9yYXRpbyA9IDAuMDsKKwkJCWVsc2UgcGF0aF93YWl0X3JhdGlvID0KKwkJCQkoZmxvYXQpcGF0aF93YWl0X2NvdW50LyhmbG9hdClwYXRoX3RyYW5zZmVyX2NvdW50OworCQkJcHJpbnRrKCIgJS4yZiIsIHBhdGhfd2FpdF9yYXRpbyk7CisKKwkJCS8vIDwtLT4gRERSCisJCQlwYXRoX3RyYW5zZmVyX2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUEFUSF9NT05JVE9SX0RBVEEpOworCQkJcGF0aF93YWl0X2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUEFUSF9NT05JVE9SX0RBVEEpOworCQkJaWYgKHBhdGhfdHJhbnNmZXJfY291bnQgPT0gMCkKKwkJCQlwYXRoX3dhaXRfcmF0aW8gPSAwLjA7CisJCQllbHNlIHBhdGhfd2FpdF9yYXRpbyA9CisJCQkJKGZsb2F0KXBhdGhfd2FpdF9jb3VudC8oZmxvYXQpcGF0aF90cmFuc2Zlcl9jb3VudDsKKwkJCXByaW50aygiICUuMmYiLCBwYXRoX3dhaXRfcmF0aW8pOworCisJCQkvLyBDTUQKKwkJCXBhdGhfdHJhbnNmZXJfY291bnQgPSBSRUFEX1ZSRUcoSEVWQ19QQVRIX01PTklUT1JfREFUQSk7CisJCQlwYXRoX3dhaXRfY291bnQgPSBSRUFEX1ZSRUcoSEVWQ19QQVRIX01PTklUT1JfREFUQSk7CisJCQlpZiAocGF0aF90cmFuc2Zlcl9jb3VudCA9PSAwKQorCQkJCXBhdGhfd2FpdF9yYXRpbyA9IDAuMDsKKwkJCWVsc2UKKwkJCQlwYXRoX3dhaXRfcmF0aW8gPSAoZmxvYXQpcGF0aF93YWl0X2NvdW50LyhmbG9hdClwYXRoX3RyYW5zZmVyX2NvdW50OworCQkJcHJpbnRrKCIgJS4yZlxuIiwgcGF0aF93YWl0X3JhdGlvKTsKKwkJfQorCX0KKworI2VuZGlmCisKK30KKworc3RhdGljIHZvaWQgYW9tX2NvbmZpZ193b3JrX3NwYWNlX2h3KHN0cnVjdCBBVjFIV19zICpodywgdTMyIG1hc2spCit7CisJc3RydWN0IEJ1ZmZJbmZvX3MgKmJ1Zl9zcGVjID0gaHctPndvcmtfc3BhY2VfYnVmOworCXVuc2lnbmVkIGludCBkYXRhMzI7CisJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwgIiVzICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCWlmIChkZWJ1ZyAmJiBody0+aW5pdF9mbGFnID09IDApCisJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsICIlcyAleCAleCAleCAleCAleCAleCAleCAleFxuIiwKKwkJCV9fZnVuY19fLAorCQkJYnVmX3NwZWMtPmlwcC5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+c3RhcnRfYWRyLAorCQkJYnVmX3NwZWMtPnNob3J0X3Rlcm1fcnBzLmJ1Zl9zdGFydCwKKwkJCWJ1Zl9zcGVjLT5zYW9fdXAuYnVmX3N0YXJ0LAorCQkJYnVmX3NwZWMtPnN3YXBfYnVmLmJ1Zl9zdGFydCwKKwkJCWJ1Zl9zcGVjLT5zY2FsZWx1dC5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zdGFydCwKKwkJCWJ1Zl9zcGVjLT5kYmxrX2RhdGEuYnVmX3N0YXJ0KTsKKwlpZiAobWFzayAmIEhXX01BU0tfRlJPTlQpIHsKKwkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwgIiVzICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlpZiAoKGRlYnVnICYgQU9NX0FWMV9ERUJVR19TRU5EX1BBUkFNX1dJVEhfUkVHKSA9PSAwKQorCQkJV1JJVEVfVlJFRyhIRVZDX1JQTV9CVUZGRVIsICh1MzIpaHctPnJwbV9waHlfYWRkcik7CisKKwkJLypXUklURV9WUkVHKEhFVkNfU1RSRUFNX1NXQVBfQlVGRkVSLAorCQkJYnVmX3NwZWMtPnN3YXBfYnVmLmJ1Zl9zdGFydCk7Ki8KKwkJV1JJVEVfVlJFRyhMTUVNX0RVTVBfQURSLCAodTMyKWh3LT5sbWVtX3BoeV9hZGRyKTsKKworCX0KKworCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsICIlcyAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworICAgIFdSSVRFX1ZSRUcoQU9NX0FWMV9EQUFMQV9UT1BfQlVGRkVSLAorCQlidWZfc3BlYy0+ZGFhbGFfdG9wLmJ1Zl9zdGFydCk7CisgICAgV1JJVEVfVlJFRyhBVjFfR01DX1BBUkFNX0JVRkZfQUREUiwKKwkJYnVmX3NwZWMtPmdtY19idWYuYnVmX3N0YXJ0KTsKKworICAgIFdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGRzQsCisJCWJ1Zl9zcGVjLT5kYmxrX3BhcmEuYnVmX3N0YXJ0KTsgLy8gY2ZnX2FkZHJfY2lmCisgICAgV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHNSwKKwkJYnVmX3NwZWMtPmRibGtfZGF0YS5idWZfc3RhcnQpOyAvLyBjZmdfYWRkcl94aW8KKworCWlmIChtYXNrICYgSFdfTUFTS19CQUNLKSB7CisjaWZkZWYgTE9TTEVTU19DT01QUkVTU19NT0RFCisJCWludCBsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUgPQorCQkJY29tcHV0ZV9sb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUoaHctPmluaXRfcGljX3csCisJCQlody0+aW5pdF9waWNfaCk7CisJCWludCBsb3NsZXNzX2NvbXBfYm9keV9zaXplID0KKwkJCWNvbXB1dGVfbG9zbGVzc19jb21wX2JvZHlfc2l6ZShody0+aW5pdF9waWNfdywKKwkJCWh3LT5pbml0X3BpY19oLCBidWZfYWxsb2NfZGVwdGggPT0gMTApOworI2VuZGlmCisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKwkJaW50IGxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZV9kdyA9CisJCQljb21wdXRlX2xvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZV9kdyhody0+aW5pdF9waWNfdywKKwkJCWh3LT5pbml0X3BpY19oKTsKKwkJaW50IGxvc2xlc3NfY29tcF9ib2R5X3NpemVfZHcgPQorCQkJY29tcHV0ZV9sb3NsZXNzX2NvbXBfYm9keV9zaXplX2R3KGh3LT5pbml0X3BpY193LAorCQkJaHctPmluaXRfcGljX2gsIGJ1Zl9hbGxvY19kZXB0aCA9PSAxMCk7CisjZW5kaWYKKwkJV1JJVEVfVlJFRyhIRVZDRF9JUFBfTElORUJVRkZfQkFTRSwKKwkJCWJ1Zl9zcGVjLT5pcHAuYnVmX3N0YXJ0KTsKKwkJLy9XUklURV9WUkVHKEhFVkNfU0FPX1VQLCBidWZfc3BlYy0+c2FvX3VwLmJ1Zl9zdGFydCk7CisJCS8vV1JJVEVfVlJFRyhIRVZDX1NDQUxFTFVULCBidWZfc3BlYy0+c2NhbGVsdXQuYnVmX3N0YXJ0KTsKKyNpZmRlZiBDSEFOR0VfUkVNT1ZFRAorCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKSB7CisJCQkvKiBjZmdfYWRkcl9hZHAqLworCQkJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHRSwgYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc3RhcnQpOworCQkJaWYgKGRlYnVnICYgQVYxX0RFQlVHX0JVRk1HUl9NT1JFKQorCQkJCXByX2luZm8oIldyaXRlIEhFVkNfREJMS19DRkdFXG4iKTsKKwkJfQorI2VuZGlmCisJCS8qIGNmZ19wX2FkZHIgKi8KKwkJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHNCwgYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc3RhcnQpOworCQkvKiBjZmdfZF9hZGRyICovCisJCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGRzUsIGJ1Zl9zcGVjLT5kYmxrX2RhdGEuYnVmX3N0YXJ0KTsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkgeworCQlpZiAoYnVmX3NwZWMtPm1heF93aWR0aCA8PSA0MDk2ICYmIGJ1Zl9zcGVjLT5tYXhfaGVpZ2h0IDw9IDIzMDQpCisJCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkczLCAweDQwNDAxMCk7IC8vZGVmYXVsdCB2YWx1ZQorCQllbHNlCisJCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkczLCAweDgwODAyMCk7IC8vIG1ha2UgbGVmdCBzdG9yYWdlIDIgeCA0a10KKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQlVGTUdSX01PUkUsCisJCQkiSEVWQ19EQkxLX0NGRzMgPSAleFxuIiwgUkVBRF9WUkVHKEhFVkNfREJMS19DRkczKSk7CisJfQorCisjaWZkZWYgTE9TTEVTU19DT01QUkVTU19NT0RFCisJaWYgKChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTCkgJiYKKwkJKGdldF9kb3VibGVfd3JpdGVfbW9kZShodykgIT0gMHgxMCkpIHsKKwkJLypiaXRbNF0gOiBwYWdlZF9tZW1fbW9kZSovCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLCAoMHgxIDw8IDQpKTsKKyNpZmRlZiBDSEFOR0VfUkVNT1ZFRAorCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkKKyNlbmRpZgorCQkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDIsIDApOworCX0gZWxzZSB7CisJCS8qaWYgKGN1cl9waWNfY29uZmlnLT5iaXRfZGVwdGggPT0gQU9NX0JJVFNfMTApCisJCSAqCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLCAoMDw8MykpOworCQkgKi8KKwkJLypiaXRbM10gc21lbSBtZG9lKi8KKwkJLyplbHNlIFdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLCAoMTw8MykpOyovCisJCS8qYml0WzNdIHNtZW0gbWRvZSovCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwyLAorCQkJKGxvc2xlc3NfY29tcF9ib2R5X3NpemUgPj4gNSkpOworCX0KKwkvKldSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwyLAorCQkobG9zbGVzc19jb21wX2JvZHlfc2l6ZSA+PiA1KSk7Ki8KKwkvKldSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwzLAorCQkoMHhmZjw8MjApIHwgKDB4ZmY8PDEwKSB8IDB4ZmYpOyovCisJLyo4LWJpdCBtb2RlICovCisJV1JJVEVfVlJFRyhIRVZDX0NNX0JPRFlfTEVOR1RILCBsb3NsZXNzX2NvbXBfYm9keV9zaXplKTsKKwlXUklURV9WUkVHKEhFVkNfQ01fSEVBREVSX09GRlNFVCwgbG9zbGVzc19jb21wX2JvZHlfc2l6ZSk7CisJV1JJVEVfVlJFRyhIRVZDX0NNX0hFQURFUl9MRU5HVEgsIGxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSk7CisJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShodykgJiAweDEwKQorCQlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMSwgMHgxIDw8IDMxKTsKKyNlbHNlCisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDEsIDB4MSA8PCAzMSk7CisjZW5kaWYKKworCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWEwpICYmCisJCShnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpICE9IDB4MTApKSB7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fTU1VX1ZIMF9BRERSLCBidWZfc3BlYy0+bW11X3ZiaC5idWZfc3RhcnQpOworCQlXUklURV9WUkVHKEhFVkNfU0FPX01NVV9WSDFfQUREUiwgYnVmX3NwZWMtPm1tdV92YmguYnVmX3N0YXJ0CisJCQkJKyBWQkhfQlVGX1NJWkUoYnVmX3NwZWMpKTsKKwkJLypkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDkpOyovCisJCS8qZGF0YTMyIHw9IDB4MTsqLworCQkvKldSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDksIGRhdGEzMik7Ki8KKworCQkvKiB1c2UgSEVWQ19DTV9IRUFERVJfU1RBUlRfQUREUiAqLworCQlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDUpOworCQlkYXRhMzIgfD0gKDE8PDEwKTsKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMNSwgZGF0YTMyKTsKKwl9CisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKyAgICBkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDUpOworCWlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpICYgMHgyMCkgeworCQl1MzIgZGF0YV90bXA7CisJCWRhdGFfdG1wID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkw5KTsKKwkJZGF0YV90bXAgfD0gKDE8PDEwKTsKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMOSwgZGF0YV90bXApOworCisJICAgIFdSSVRFX1ZSRUcoSEVWQ19DTV9CT0RZX0xFTkdUSDIsbG9zbGVzc19jb21wX2JvZHlfc2l6ZV9kdyk7CisJICAgIFdSSVRFX1ZSRUcoSEVWQ19DTV9IRUFERVJfT0ZGU0VUMixsb3NsZXNzX2NvbXBfYm9keV9zaXplX2R3KTsKKwkgICAgV1JJVEVfVlJFRyhIRVZDX0NNX0hFQURFUl9MRU5HVEgyLGxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZV9kdyk7CisKKwkgICAgV1JJVEVfVlJFRyhIRVZDX1NBT19NTVVfVkgwX0FERFIyLCBidWZfc3BlYy0+bW11X3ZiaF9kdy5idWZfc3RhcnQpOworCSAgICBXUklURV9WUkVHKEhFVkNfU0FPX01NVV9WSDFfQUREUjIsIGJ1Zl9zcGVjLT5tbXVfdmJoX2R3LmJ1Zl9zdGFydAorCQkJKyBEV19WQkhfQlVGX1NJWkUoYnVmX3NwZWMpKTsKKworCQlXUklURV9WUkVHKEhFVkNfRFdfVkgwX0FERERSLCBidWZfc3BlYy0+bW11X3ZiaF9kdy5idWZfc3RhcnQKKwkJCSsgKDIgKiBEV19WQkhfQlVGX1NJWkUoYnVmX3NwZWMpKSk7CisJCVdSSVRFX1ZSRUcoSEVWQ19EV19WSDFfQURERFIsIGJ1Zl9zcGVjLT5tbXVfdmJoX2R3LmJ1Zl9zdGFydAorCQkJKyAoMyAqIERXX1ZCSF9CVUZfU0laRShidWZfc3BlYykpKTsKKworCQkvKiB1c2UgSEVWQ19DTV9IRUFERVJfU1RBUlRfQUREUiAqLworCSAgICBkYXRhMzIgfD0gKDE8PDE1KTsKKwl9IGVsc2UKKwkgICAgZGF0YTMyICY9IH4oMTw8MTUpOworICAgIFdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDUsIGRhdGEzMik7CisjZW5kaWYKKworCVdSSVRFX1ZSRUcoTE1FTV9EVU1QX0FEUiwgKHUzMilody0+bG1lbV9waHlfYWRkcik7CisjaWZkZWYgQ0hBTkdFX1JFTU9WRUQKKworCQlXUklURV9WUkVHKEFWMV9TRUdfTUFQX0JVRkZFUiwgYnVmX3NwZWMtPnNlZ19tYXAuYnVmX3N0YXJ0KTsKKworCQkgLyoqLworCQlXUklURV9WUkVHKEFWMV9QUk9CX1NXQVBfQlVGRkVSLCBody0+cHJvYl9idWZmZXJfcGh5X2FkZHIpOworCQlXUklURV9WUkVHKEFWMV9DT1VOVF9TV0FQX0JVRkZFUiwgaHctPmNvdW50X2J1ZmZlcl9waHlfYWRkcik7CisJCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWEwpICYmCisJCQkoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSAhPSAweDEwKSkgeworCQkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQSkKKwkJCQlXUklURV9WUkVHKEhFVkNfQVNTSVNUX01NVV9NQVBfQUREUiwgaHctPmZyYW1lX21tdV9tYXBfcGh5X2FkZHIpOworCQkJZWxzZQorCQkJCVdSSVRFX1ZSRUcoQVYxX01NVV9NQVBfQlVGRkVSLCBody0+ZnJhbWVfbW11X21hcF9waHlfYWRkcik7CisJCX0KKyNlbHNlCisJaWYgKChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTCkgJiYKKwkJKGdldF9kb3VibGVfd3JpdGVfbW9kZShodykgIT0gMHgxMCkpIHsKKwkgICAgV1JJVEVfVlJFRyhIRVZDX1NBT19NTVVfRE1BX0NUUkwsIGh3LT5mcmFtZV9tbXVfbWFwX3BoeV9hZGRyKTsKKwl9CisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKwlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSAmIDB4MjApIHsKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19NTVVfRE1BX0NUUkwyLCBody0+ZHdfZnJhbWVfbW11X21hcF9waHlfYWRkcik7CisJCS8vZGVmYXVsdCBvZiAweGZmZmZmZmZmIHdpbGwgZGlzYWJsZSBkdworCSAgICBXUklURV9WUkVHKEhFVkNfU0FPX1lfU1RBUlRfQUREUiwgMCk7CisJICAgIFdSSVRFX1ZSRUcoSEVWQ19TQU9fQ19TVEFSVF9BRERSLCAwKTsKKwl9CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIENPX01WX0NPTVBSRVNTCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDVEKSB7CisJICAgIGRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX01QUkVEX0NUUkw0KTsKKwkgICAgZGF0YTMyIHw9ICAoMSA8PCAxKTsKKwkgICAgV1JJVEVfVlJFRyhIRVZDX01QUkVEX0NUUkw0LCBkYXRhMzIpOworCX0KKyNlbmRpZgorCX0KKworCWNvbmZpZ19hdXhfYnVmKGh3KTsKK30KKworI2lmZGVmIE1DUkNDX0VOQUJMRQorc3RhdGljIHUzMiBtY3JjY19jYWNoZV9hbGdfZmxhZyA9IDE7CitzdGF0aWMgdm9pZCBtY3JjY19wZXJmY291bnRfcmVzZXQoc3RydWN0IEFWMUhXX3MgKmh3KTsKK3N0YXRpYyB2b2lkIGRlY29tcF9wZXJmY291bnRfcmVzZXQoc3RydWN0IEFWMUhXX3MgKmh3KTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBhb21faW5pdF9kZWNvZGVyX2h3KHN0cnVjdCBBVjFIV19zICpodywgdTMyIG1hc2spCit7CisJdW5zaWduZWQgaW50IGRhdGEzMjsKKwlpbnQgaTsKKwljb25zdCB1bnNpZ25lZCBzaG9ydCBwYXJzZXJfY21kW1BBUlNFUl9DTURfTlVNQkVSXSA9IHsKKwkJMHgwNDAxLCAweDg0MDEsIDB4MDgwMCwgMHgwNDAyLCAweDkwMDIsIDB4MTQyMywKKwkJMHg4Q0MzLCAweDE0MjMsIDB4ODgwNCwgMHg5ODI1LCAweDA4MDAsIDB4MDRGRSwKKwkJMHg4NDA2LCAweDg0MTEsIDB4MTgwMCwgMHg4NDA4LCAweDg0MDksIDB4OEMyQSwKKwkJMHg5QzJCLCAweDFDMDAsIDB4ODQwRiwgMHg4NDA3LCAweDgwMDAsIDB4ODQwOCwKKwkJMHgyMDAwLCAweEE4MDAsIDB4ODQxMCwgMHgwNERFLCAweDg0MEMsIDB4ODQwRCwKKwkJMHhBQzAwLCAweEEwMDAsIDB4MDhDMCwgMHgwOEUwLCAweEE0MEUsIDB4RkMwMCwKKwkJMHg3QzAwCisJfTsKKyNpZiAwCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBNRVNPTl9DUFVfTUFKT1JfSURfRzEyQSkgeworCQkvKiBTZXQgTUNSIGZldGNoIHByaW9yaXRpZXMqLworCQlkYXRhMzIgPSAweDEgfCAoMHgxIDw8IDIpIHwgKDB4MSA8PDMpIHwKKwkJCSgyNCA8PCA0KSB8ICgzMiA8PCAxMSkgfCAoMjQgPDwgMTgpIHwgKDMyIDw8IDI1KTsKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0FYSVVSR19DVEwsIGRhdGEzMik7CisJfQorI2VuZGlmCisJLyppZiAoZGVidWcgJiBBVjFfREVCVUdfQlVGTUdSX01PUkUpCisJCXByX2luZm8oIiVzXG4iLCBfX2Z1bmNfXyk7Ki8KKwlpZiAobWFzayAmIEhXX01BU0tfRlJPTlQpIHsKKwkJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0lOVF9DT05UUk9MKTsKKyNpZmRlZiBDSEFOR0VfUkVNT1ZFRAorI2lmIDEKKwkJLyogc2V0IGJpdCAzMX4yOSB0byAzIGlmIEhFVkNfU1RSRUFNX0ZJRk9fQ1RMWzI5XSBpcyAxICovCisJCWRhdGEzMiAmPSB+KDcgPDwgMjkpOworCQlkYXRhMzIgfD0gKDMgPDwgMjkpOworI2VuZGlmCisJCWRhdGEzMiA9IGRhdGEzMiB8CisJCSgxIDw8IDI0KSB8LypzdHJlYW1fYnVmZmVyX2VtcHR5X2ludF9hbXJpc2NfZW5hYmxlKi8KKwkJKDEgPDwgMjIpIHwvKnN0cmVhbV9maWZvX2VtcHR5X2ludF9hbXJpc2NfZW5hYmxlKi8KKwkJKDEgPDwgNykgfC8qZGVjX2RvbmVfaW50X2NwdV9lbmFibGUqLworCQkoMSA8PCA0KSB8LypzdGFydGNvZGVfZm91bmRfaW50X2NwdV9lbmFibGUqLworCQkoMCA8PCAzKSB8LypzdGFydGNvZGVfZm91bmRfaW50X2FtcmlzY19lbmFibGUqLworCQkoMSA8PCAwKQkvKnBhcnNlcl9pbnRfZW5hYmxlKi8KKwkJOworI2Vsc2UKKwkJZGF0YTMyID0gZGF0YTMyICYgMHgwM2ZmZmZmZjsKKwkJZGF0YTMyID0gZGF0YTMyIHwKKwkJCSgzIDw8IDI5KSB8ICAvLyBzdHJlYW1fYnVmZmVyX2VtcHR5X2ludF9jdGwgKCAweDIwMCBpbnRlcnJ1cHQpCisJCQkoMyA8PCAyNikgfCAgLy8gc3RyZWFtX2ZpZm9fZW1wdHlfaW50X2N0bCAoIDQgaW50ZXJydXB0KQorCQkJKDEgPDwgMjQpIHwgIC8vIHN0cmVhbV9idWZmZXJfZW1wdHlfaW50X2FtcmlzY19lbmFibGUKKwkJCSgxIDw8IDIyKSB8ICAvLyBzdHJlYW1fZmlmb19lbXB0eV9pbnRfYW1yaXNjX2VuYWJsZQorI2lmZGVmIEFPTV9BVjFfSEVEX0ZCCisjaWZkZWYgRFVBTF9ERUNPREUKKwkJLy8gRm9yIEhBTFQgQ0NQVSB0ZXN0LiBVc2UgUHVsbCBpbnNpZGUgQ0NQVSB0byBnZW5lcmF0ZSBpbnRlcnJ1cHQKKwkJLy8gKDEgPDwgOSkgfCAgLy8gZmVkX2ZiX3NsaWNlX2RvbmVfaW50X2FtcmlzY19lbmFibGUKKyNlbHNlCisJCQkoMSA8PCAxMCkgfCAgLy8gZmVkX2ZiX3NsaWNlX2RvbmVfaW50X2NwdV9lbmFibGUKKyNlbmRpZgorI2VuZGlmCisJCQkoMSA8PCA3KSB8ICAvLyBkZWNfZG9uZV9pbnRfY3B1X2VuYWJsZQorCQkJKDEgPDwgNCkgfCAgLy8gc3RhcnRjb2RlX2ZvdW5kX2ludF9jcHVfZW5hYmxlCisJCQkoMCA8PCAzKSB8ICAvLyBzdGFydGNvZGVfZm91bmRfaW50X2FtcmlzY19lbmFibGUKKwkJCSgxIDw8IDApICAgIC8vIHBhcnNlcl9pbnRfZW5hYmxlCisJCQk7CisjZW5kaWYKKwkJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9JTlRfQ09OVFJPTCwgZGF0YTMyKTsKKworCQlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9TVEFUVVMpOworCQlkYXRhMzIgPSBkYXRhMzIgfAorCQkoMCA8PCAxKSB8LyplbXVsYXRpb25fY2hlY2tfb2ZmIEFWMQorCQkJZG8gbm90IGhhdmUgZW11bGF0aW9uKi8KKwkJKDEgPDwgMCkvKnN0YXJ0Y29kZV9jaGVja19vbiovCisJCTsKKwkJV1JJVEVfVlJFRyhIRVZDX1NISUZUX1NUQVRVUywgZGF0YTMyKTsKKwkJV1JJVEVfVlJFRyhIRVZDX1NISUZUX0NPTlRST0wsCisJCSgwIDw8IDE0KSB8IC8qZGlzYWJsZV9zdGFydF9jb2RlX3Byb3RlY3QqLworCQkoMSA8PCAxMCkgfCAvKmxlbmd0aF96ZXJvX3N0YXJ0Y29kZV9lbiBmb3IgQVYxKi8KKwkJKDEgPDwgOSkgfCAvKmxlbmd0aF92YWxpZF9zdGFydGNvZGVfZW4gZm9yIEFWMSovCisJCSgzIDw8IDYpIHwgLypzZnRfdmFsaWRfd3JfcG9zaXRpb24qLworCQkoMiA8PCA0KSB8IC8qZW11bGF0ZV9jb2RlX2xlbmd0aF9zdWJfMSovCisJCSgzIDw8IDEpIHwgLypzdGFydF9jb2RlX2xlbmd0aF9zdWJfMQorCQlBVjEgdXNlIDB4MDAwMDAwMDEgYXMgc3RhcnRjb2RlICg0IEJ5dGVzKSovCisJCSgxIDw8IDApICAgLypzdHJlYW1fc2hpZnRfZW5hYmxlKi8KKwkJKTsKKworCQlXUklURV9WUkVHKEhFVkNfQ0FCQUNfQ09OVFJPTCwKKwkJCSgxIDw8IDApLypjYWJhY19lbmFibGUqLworCQkpOworCisJCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfQ09SRV9DT05UUk9MLAorCQkJKDEgPDwgMCkvKiBoZXZjX3BhcnNlcl9jb3JlX2Nsa19lbiovCisJCSk7CisKKwkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCAwKTsKKwl9CisKKwlpZiAobWFzayAmIEhXX01BU0tfQkFDSykgeworCQkvKkluaXRpYWwgSVFJVF9TQ0FMRUxVVCBtZW1vcnkKKwkJLS0ganVzdCB0byBhdm9pZCBYIGluIHNpbXVsYXRpb24qLworCQlpZiAoaXNfcmRtYV9lbmFibGUoKSkKKwkJCXJkbWFfYmFja19lbmRfd29yayhody0+cmRtYV9waHlfYWRyLCBSRE1BX1NJWkUpOworCQllbHNlIHsKKwkJCVdSSVRFX1ZSRUcoSEVWQ19JUUlUX1NDQUxFTFVUX1dSX0FERFIsIDApOy8qY2ZnX3BfYWRkciovCisJCQlmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorCQkJCVdSSVRFX1ZSRUcoSEVWQ19JUUlUX1NDQUxFTFVUX0RBVEEsIDApOworCQl9CisJfQorCisJaWYgKG1hc2sgJiBIV19NQVNLX0ZST05UKSB7CisJCXUzMiBkZWNvZGVfbW9kZTsKKy8qCisjaWZkZWYgRU5BQkxFX1NXQVBfVEVTVAorCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fU1dBUF9URVNULCAxMDApOworI2Vsc2UKKwlXUklURV9WUkVHKEhFVkNfU1RSRUFNX1NXQVBfVEVTVCwgMCk7CisjZW5kaWYKKyovCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQlpZiAoIWh3LT5tX2luc19mbGFnKSB7CisJCQlpZiAoaHctPmxvd19sYXRlbmN5X2ZsYWcpCisJCQkJZGVjb2RlX21vZGUgPSBERUNPREVfTU9ERV9TSU5HTEVfTE9XX0xBVEVOQ1k7CisJCQllbHNlCisJCQkJZGVjb2RlX21vZGUgPSBERUNPREVfTU9ERV9TSU5HTEU7CisJCX0gZWxzZSBpZiAodmRlY19mcmFtZV9iYXNlZChod190b192ZGVjKGh3KSkpCisJCQlkZWNvZGVfbW9kZSA9IGh3LT5ub19oZWFkID8KKwkJCQlERUNPREVfTU9ERV9NVUxUSV9GUkFNRUJBU0VfTk9IRUFEIDoKKwkJCQlERUNPREVfTU9ERV9NVUxUSV9GUkFNRUJBU0U7CisJCWVsc2UKKwkJCWRlY29kZV9tb2RlID0gREVDT0RFX01PREVfTVVMVElfU1RSRUFNQkFTRTsKKwkJaWYgKGRlYnVnICYgQU9NX0RFQlVHX0JVRk1HUl9PTkxZKQorCQkJZGVjb2RlX21vZGUgfD0gKDEgPDwgMTYpOworCQlXUklURV9WUkVHKERFQ09ERV9NT0RFLCBkZWNvZGVfbW9kZSk7CisJCVdSSVRFX1ZSRUcoSEVWQ19ERUNPREVfU0laRSwgMCk7CisJCVdSSVRFX1ZSRUcoSEVWQ19ERUNPREVfQ09VTlQsIDApOworI2Vsc2UKKwlXUklURV9WUkVHKERFQ09ERV9NT0RFLCBERUNPREVfTU9ERV9TSU5HTEUpOworCVdSSVRFX1ZSRUcoSEVWQ19ERUNPREVfUElDX0JFR0lOX1JFRywgMCk7CisJV1JJVEVfVlJFRyhIRVZDX0RFQ09ERV9QSUNfTlVNX1JFRywgMHg3ZmZmZmZmZik7IC8qdG8gcmVtb3ZlKi8KKyNlbmRpZgorCS8qU2VuZCBwYXJzZXJfY21kKi8KKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0NNRF9XUklURSwgKDEgPDwgMTYpIHwgKDAgPDwgMCkpOworCWZvciAoaSA9IDA7IGkgPCBQQVJTRVJfQ01EX05VTUJFUjsgaSsrKQorCQlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0NNRF9XUklURSwgcGFyc2VyX2NtZFtpXSk7CisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9DTURfU0tJUF8wLCBQQVJTRVJfQ01EX1NLSVBfQ0ZHXzApOworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfQ01EX1NLSVBfMSwgUEFSU0VSX0NNRF9TS0lQX0NGR18xKTsKKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0NNRF9TS0lQXzIsIFBBUlNFUl9DTURfU0tJUF9DRkdfMik7CisKKworCQlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0lGX0NPTlRST0wsCisJCQkvKiAgKDEgPDwgOCkgfCovIC8qc2FvX3N3X3ByZWRfZW5hYmxlKi8KKwkJCSgxIDw8IDUpIHwgLypwYXJzZXJfc2FvX2lmX2VuKi8KKwkJCSgxIDw8IDIpIHwgLypwYXJzZXJfbXByZWRfaWZfZW4qLworCQkJKDEgPDwgMCkgLypwYXJzZXJfc2NhbGVyX2lmX2VuKi8KKwkJKTsKKwl9CisKKwlpZiAobWFzayAmIEhXX01BU0tfQkFDSykgeworCQkvKkNoYW5nZWQgdG8gU3RhcnQgTVBSRUQgaW4gbWljcm9jb2RlKi8KKwkJLyoKKwkJcHJfaW5mbygiW3Rlc3QuY10gU3RhcnQgTVBSRURcbiIpOworCQlXUklURV9WUkVHKEhFVkNfTVBSRURfSU5UX1NUQVRVUywKKwkJKDE8PDMxKQorCQkpOworCQkqLworCQlXUklURV9WUkVHKEhFVkNEX0lQUF9UT1BfQ05UTCwKKwkJCSgwIDw8IDEpIHwgLyplbmFibGUgaXBwKi8KKwkJCSgxIDw8IDApICAgLypzb2Z0d2FyZSByZXNldCBpcHAgYW5kIG1wcCovCisJCSk7CisjaWZkZWYgQ0hBTkdFX1JFTU9WRUQKKwkJV1JJVEVfVlJFRyhIRVZDRF9JUFBfVE9QX0NOVEwsCisJCQkoMSA8PCAxKSB8IC8qZW5hYmxlIGlwcCovCisJCQkoMCA8PCAwKSAgIC8qc29mdHdhcmUgcmVzZXQgaXBwIGFuZCBtcHAqLworCQkpOworI2Vsc2UKKwkJV1JJVEVfVlJFRyhIRVZDRF9JUFBfVE9QX0NOVEwsCisJCQkoMyA8PCA0KSB8IC8vIGF2MQorCQkJKDEgPDwgMSkgfCAvKmVuYWJsZSBpcHAqLworCQkJKDAgPDwgMCkgICAvKnNvZnR3YXJlIHJlc2V0IGlwcCBhbmQgbXBwKi8KKwkJKTsKKyNlbmRpZgorCWlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpICYgMHgxMCkgeworCQkvKkVuYWJsZSBOVjIxIHJlZmVyZW5jZSByZWFkIG1vZGUgZm9yIE1DKi8KKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDEsIDB4MSA8PCAzMSk7CisJfQorI2lmZGVmIE1DUkNDX0VOQUJMRQorCQkvKkluaXRpYWxpemUgbWNyY2MgYW5kIGRlY29tcCBwZXJmIGNvdW50ZXJzKi8KKwkJaWYgKG1jcmNjX2NhY2hlX2FsZ19mbGFnICYmCisJCQlody0+aW5pdF9mbGFnID09IDApIHsKKwkJCW1jcmNjX3BlcmZjb3VudF9yZXNldChodyk7CisJCQlkZWNvbXBfcGVyZmNvdW50X3Jlc2V0KGh3KTsKKwkJfQorI2VuZGlmCisJfQorI2lmZGVmIENIQU5HRV9SRU1PVkVECisjZWxzZQorLy8gU2V0IE1DUiBmZXRjaCBwcmlvcml0aWVzCisgICAgZGF0YTMyID0gMHgxIHwgKDB4MSA8PCAyKSB8ICgweDEgPDwzKSB8CisJKDI0IDw8IDQpIHwgKDMyIDw8IDExKSB8ICgyNCA8PCAxOCkgfCAoMzIgPDwgMjUpOworICAgIFdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9BWElVUkdfQ1RMLCBkYXRhMzIpOworI2VuZGlmCisJcmV0dXJuOworfQorCisKKyNpZmRlZiBDT05GSUdfSEVWQ19DTEtfRk9SQ0VEX09OCitzdGF0aWMgdm9pZCBjb25maWdfYXYxX2Nsa19mb3JjZWRfb24odm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgcmRhdGEzMjsKKwkvKklRSVQqLworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19JUUlUX0NMS19SU1RfQ1RSTCk7CisJV1JJVEVfVlJFRyhIRVZDX0lRSVRfQ0xLX1JTVF9DVFJMLCByZGF0YTMyIHwgKDB4MSA8PCAyKSk7CisKKwkvKiBEQkxLKi8KKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfREJMS19DRkcwKTsKKwlXUklURV9WUkVHKEhFVkNfREJMS19DRkcwLCByZGF0YTMyIHwgKDB4MSA8PCAyKSk7CisKKwkvKiBTQU8qLworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDEpOworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDEsIHJkYXRhMzIgfCAoMHgxIDw8IDIpKTsKKworCS8qTVBSRUQqLworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19NUFJFRF9DVFJMMSk7CisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0NUUkwxLCByZGF0YTMyIHwgKDB4MSA8PCAyNCkpOworCisJLyogUEFSU0VSKi8KKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0NPTlRST0wpOworCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fQ09OVFJPTCwgcmRhdGEzMiB8ICgweDEgPDwgMTUpKTsKKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0hJRlRfQ09OVFJPTCk7CisJV1JJVEVfVlJFRyhIRVZDX1NISUZUX0NPTlRST0wsIHJkYXRhMzIgfCAoMHgxIDw8IDE1KSk7CisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX0NBQkFDX0NPTlRST0wpOworCVdSSVRFX1ZSRUcoSEVWQ19DQUJBQ19DT05UUk9MLCByZGF0YTMyIHwgKDB4MSA8PCAxMykpOworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfQ09SRV9DT05UUk9MKTsKKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0NPUkVfQ09OVFJPTCwgcmRhdGEzMiB8ICgweDEgPDwgMTUpKTsKKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0lOVF9DT05UUk9MKTsKKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0lOVF9DT05UUk9MLCByZGF0YTMyIHwgKDB4MSA8PCAxNSkpOworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfSUZfQ09OVFJPTCk7CisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9JRl9DT05UUk9MLAorCQkJcmRhdGEzMiB8ICgweDEgPDwgNikgfCAoMHgxIDw8IDMpIHwgKDB4MSA8PCAxKSk7CisKKwkvKklQUCovCisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDRF9JUFBfRFlOQ0xLR0FURV9DT05GSUcpOworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX0RZTkNMS0dBVEVfQ09ORklHLCByZGF0YTMyIHwgMHhmZmZmZmZmZik7CisKKwkvKiBNQ1JDQyovCisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDRF9NQ1JDQ19DVEwxKTsKKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDEsIHJkYXRhMzIgfCAoMHgxIDw8IDMpKTsKK30KKyNlbmRpZgorCisKK3N0YXRpYyBpbnQgdmF2MV9tbXVfbWFwX2FsbG9jKHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hMKSAmJgorCQkoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSAhPSAweDEwKSkgeworCQl1MzIgbW11X21hcF9zaXplID0gdmF2MV9mcmFtZV9tbXVfbWFwX3NpemUoaHcpOworCQlody0+ZnJhbWVfbW11X21hcF9hZGRyID0KKwkJCWRtYV9hbGxvY19jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJbW11X21hcF9zaXplLAorCQkJCSZody0+ZnJhbWVfbW11X21hcF9waHlfYWRkciwgR0ZQX0tFUk5FTCk7CisJCWlmIChody0+ZnJhbWVfbW11X21hcF9hZGRyID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvYyBjb3VudF9idWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQltZW1zZXQoaHctPmZyYW1lX21tdV9tYXBfYWRkciwgMCwgbW11X21hcF9zaXplKTsKKwl9CisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKwlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSAmIDB4MjApIHsKKwkJdTMyIG1tdV9tYXBfc2l6ZSA9IHZhb21fZHdfZnJhbWVfbW11X21hcF9zaXplKGh3KTsKKwkJaHctPmR3X2ZyYW1lX21tdV9tYXBfYWRkciA9CisJCQlkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCW1tdV9tYXBfc2l6ZSwKKwkJCQkmaHctPmR3X2ZyYW1lX21tdV9tYXBfcGh5X2FkZHIsIEdGUF9LRVJORUwpOworCQlpZiAoaHctPmR3X2ZyYW1lX21tdV9tYXBfYWRkciA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgY291bnRfYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbWVtc2V0KGh3LT5kd19mcmFtZV9tbXVfbWFwX2FkZHIsIDAsIG1tdV9tYXBfc2l6ZSk7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgdmF2MV9tbXVfbWFwX2ZyZWUoc3RydWN0IEFWMUhXX3MgKmh3KQoreworCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWEwpICYmCisJCShnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpICE9IDB4MTApKSB7CisJCXUzMiBtbXVfbWFwX3NpemUgPSB2YXYxX2ZyYW1lX21tdV9tYXBfc2l6ZShodyk7CisJCWlmIChody0+ZnJhbWVfbW11X21hcF9hZGRyKSB7CisJCQlpZiAoaHctPmZyYW1lX21tdV9tYXBfcGh5X2FkZHIpCisJCQkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCQltbXVfbWFwX3NpemUsCisJCQkJCWh3LT5mcmFtZV9tbXVfbWFwX2FkZHIsCisJCQkJCWh3LT5mcmFtZV9tbXVfbWFwX3BoeV9hZGRyKTsKKwkJCWh3LT5mcmFtZV9tbXVfbWFwX2FkZHIgPSBOVUxMOworCQl9CisJfQorI2lmZGVmIEFPTV9BVjFfTU1VX0RXCisJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShodykgJiAweDIwKSB7CisJCXUzMiBtbXVfbWFwX3NpemUgPSB2YW9tX2R3X2ZyYW1lX21tdV9tYXBfc2l6ZShodyk7CisJCWlmIChody0+ZHdfZnJhbWVfbW11X21hcF9hZGRyKSB7CisJCQlpZiAoaHctPmR3X2ZyYW1lX21tdV9tYXBfcGh5X2FkZHIpCisJCQkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCQltbXVfbWFwX3NpemUsCisJCQkJCWh3LT5kd19mcmFtZV9tbXVfbWFwX2FkZHIsCisJCQkJCWh3LT5kd19mcmFtZV9tbXVfbWFwX3BoeV9hZGRyKTsKKwkJCWh3LT5kd19mcmFtZV9tbXVfbWFwX2FkZHIgPSBOVUxMOworCQl9CisJfQorI2VuZGlmCit9CisKKworc3RhdGljIHZvaWQgYXYxX2xvY2FsX3VuaW5pdChzdHJ1Y3QgQVYxSFdfcyAqaHcsIGJvb2wgcmVzZXRfZmxhZykKK3sKKwlody0+cnBtX3B0ciA9IE5VTEw7CisJaHctPmxtZW1fcHRyID0gTlVMTDsKKworCWlmICghcmVzZXRfZmxhZykgeworCQlody0+ZmdfcHRyID0gTlVMTDsKKwkJaWYgKGh3LT5mZ19hZGRyKSB7CisJCQlpZiAoaHctPmZnX3BoeV9hZGRyKQorCQkJCWNvZGVjX21tX2RtYV9mcmVlX2NvaGVyZW50KGh3LT5mZ190YWJsZV9oYW5kbGUpOworCQkJaHctPmZnX2FkZHIgPSBOVUxMOworCQl9CisJfQorCisJaWYgKGh3LT5ycG1fYWRkcikgeworCQlkbWFfZnJlZV9jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJCVJQTV9CVUZfU0laRSwKKwkJCQkJaHctPnJwbV9hZGRyLAorCQkJCQlody0+cnBtX3BoeV9hZGRyKTsKKwkJaHctPnJwbV9hZGRyID0gTlVMTDsKKwl9CisJaWYgKGh3LT5hdXhfYWRkcikgeworCQlkbWFfZnJlZV9jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJaHctPnByZWZpeF9hdXhfc2l6ZSArIGh3LT5zdWZmaXhfYXV4X3NpemUsIGh3LT5hdXhfYWRkciwKKwkJCQkJaHctPmF1eF9waHlfYWRkcik7CisJCWh3LT5hdXhfYWRkciA9IE5VTEw7CisJfQorI2lmIChkZWZpbmVkIERFQlVHX1VDT0RFX0xPRykgfHwgKGRlZmluZWQgREVCVUdfQ01EKQorCWlmIChody0+dWNvZGVfbG9nX2FkZHIpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCVVDT0RFX0xPR19CVUZfU0laRSwgaHctPnVjb2RlX2xvZ19hZGRyLAorCQkJCQlody0+dWNvZGVfbG9nX3BoeV9hZGRyKTsKKwkJaHctPnVjb2RlX2xvZ19hZGRyID0gTlVMTDsKKwl9CisjZW5kaWYKKwlpZiAoaHctPmxtZW1fYWRkcikgeworCQlpZiAoaHctPmxtZW1fcGh5X2FkZHIpCisJCQlkbWFfZnJlZV9jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJTE1FTV9CVUZfU0laRSwgaHctPmxtZW1fYWRkciwKKwkJCQlody0+bG1lbV9waHlfYWRkcik7CisJCWh3LT5sbWVtX2FkZHIgPSBOVUxMOworCX0KKworCXZhdjFfbW11X21hcF9mcmVlKGh3KTsKKworCWlmIChody0+Z3ZzKQorCQl2ZnJlZShody0+Z3ZzKTsKKwlody0+Z3ZzID0gTlVMTDsKK30KKworc3RhdGljIGludCBhdjFfbG9jYWxfaW5pdChzdHJ1Y3QgQVYxSFdfcyAqaHcsIGJvb2wgcmVzZXRfZmxhZykKK3sKKwlpbnQgcmV0ID0gLTE7CisJLyppbnQgbG9zbGVzc19jb21wX2hlYWRlcl9zaXplLCBsb3NsZXNzX2NvbXBfYm9keV9zaXplOyovCisKKwlzdHJ1Y3QgQnVmZkluZm9fcyAqY3VyX2J1Zl9pbmZvID0gTlVMTDsKKworCW1lbXNldCgmaHctPnBhcmFtLCAwLCBzaXplb2YodW5pb24gcGFyYW1fdSkpOworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwljdXJfYnVmX2luZm8gPSAmaHctPndvcmtfc3BhY2VfYnVmX3N0b3JlOworICAgIGh3LT5wYmktPndvcmtfc3BhY2VfYnVmID0gY3VyX2J1Zl9pbmZvOworI2lmIDAKKwlpZiAodmRlY19pc19zdXBwb3J0XzRrKCkpIHsKKwkJbWVtY3B5KGN1cl9idWZfaW5mbywgJmFvbV93b3JrYnVmZl9zcGVjWzFdLAkvKiA4ayAqLworCQkJc2l6ZW9mKHN0cnVjdCBCdWZmSW5mb19zKSk7CisJfSBlbHNlCisJCW1lbWNweShjdXJfYnVmX2luZm8sICZhb21fd29ya2J1ZmZfc3BlY1swXSwvKiAxMDgwcCAqLworCQlzaXplb2Yoc3RydWN0IEJ1ZmZJbmZvX3MpKTsKKyNlbmRpZgorCW1lbWNweShjdXJfYnVmX2luZm8sICZhb21fd29ya2J1ZmZfc3BlY1tody0+YnVmZmVyX3NwZWNfaW5kZXhdLAorCQlzaXplb2Yoc3RydWN0IEJ1ZmZJbmZvX3MpKTsKKworCWN1cl9idWZfaW5mby0+c3RhcnRfYWRyID0gaHctPmJ1Zl9zdGFydDsKKwlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA8IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWEwpIHx8CisJCShnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpID09IDB4MTApKQorCQlody0+bWNfYnVmX3NwZWMuYnVmX2VuZCA9IGh3LT5idWZfc3RhcnQgKyBody0+YnVmX3NpemU7CisKKyNlbHNlCisvKiEgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVCovCisjaWYgMAorCWlmICh2ZGVjX2lzX3N1cHBvcnRfNGsoKSkgeworCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpCisJCQljdXJfYnVmX2luZm8gPSAmYW9tX3dvcmtidWZmX3NwZWNbMV07LyogOGsgd29yayBzcGFjZSAqLworCQllbHNlCisJCQljdXJfYnVmX2luZm8gPSAmYW9tX3dvcmtidWZmX3NwZWNbMV07LyogNGsyayB3b3JrIHNwYWNlICovCisJfSBlbHNlCisJCWN1cl9idWZfaW5mbyA9ICZhb21fd29ya2J1ZmZfc3BlY1swXTsvKiAxMDgwcCB3b3JrIHNwYWNlICovCisjZW5kaWYKKwltZW1jcHkoY3VyX2J1Zl9pbmZvLCAmYW9tX3dvcmtidWZmX3NwZWNbaHctPmJ1ZmZlcl9zcGVjX2luZGV4XSwKKwkJc2l6ZW9mKHN0cnVjdCBCdWZmSW5mb19zKSk7CisjZW5kaWYKKworCWluaXRfYnVmZl9zcGVjKGh3LCBjdXJfYnVmX2luZm8pOworCWFvbV9idWZtZ3JfaW5pdChodywgY3VyX2J1Zl9pbmZvLCBOVUxMKTsKKworCWlmICghdmRlY19pc19zdXBwb3J0XzRrKCkKKwkJJiYgKGJ1Zl9hbGxvY193aWR0aCA+IDE5MjAgJiYgIGJ1Zl9hbGxvY19oZWlnaHQgPiAxMDg4KSkgeworCQlidWZfYWxsb2Nfd2lkdGggPSAxOTIwOworCQlidWZfYWxsb2NfaGVpZ2h0ID0gMTA4ODsKKwkJaWYgKGh3LT5tYXhfcGljX3cgPiAxOTIwICYmIGh3LT5tYXhfcGljX2ggPiAxMDg4KSB7CisJCQlody0+bWF4X3BpY193ID0gMTkyMDsKKwkJCWh3LT5tYXhfcGljX2ggPSAxMDg4OworCQl9CisJfSBlbHNlIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkgeworCQlidWZfYWxsb2Nfd2lkdGggPSA4MTkyOworCQlidWZfYWxsb2NfaGVpZ2h0ID0gNDYwODsKKwl9CisKKwlody0+aW5pdF9waWNfdyA9IGh3LT5tYXhfcGljX3cgPyBody0+bWF4X3BpY193IDoKKwkJKGh3LT52YXYxX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoID8gaHctPnZhdjFfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGggOgorCQkoYnVmX2FsbG9jX3dpZHRoID8gYnVmX2FsbG9jX3dpZHRoIDogaHctPndvcmtfc3BhY2VfYnVmLT5tYXhfd2lkdGgpKTsKKwlody0+aW5pdF9waWNfaCA9IGh3LT5tYXhfcGljX2ggPyBody0+bWF4X3BpY19oIDoKKwkJKGh3LT52YXYxX2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodCA/IGh3LT52YXYxX2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodCA6CisJCShidWZfYWxsb2NfaGVpZ2h0ID8gYnVmX2FsbG9jX2hlaWdodCA6IGh3LT53b3JrX3NwYWNlX2J1Zi0+bWF4X2hlaWdodCkpOworCisgICAgaHctPnBiaS0+ZnJhbWVfd2lkdGggPSBody0+aW5pdF9waWNfdzsKKyAgICBody0+cGJpLT5mcmFtZV9oZWlnaHQgPSBody0+aW5pdF9waWNfaDsKKworCS8qIHZpZGVvIGlzIG5vdCBzdXBwb3J0IHVuYWxpZ25lZCB3aXRoIDY0IGluIHRsMQorCSoqIHZkZWMgY2FudmFzIG1vZGUgd2lsbCBiZSBsaW5lYXIgd2hlbiBkdW1wIHl1diBpcyBzZXQKKwkqLworCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpICYmCisJCShnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpICE9IDApICYmCisJCSgoKGh3LT5tYXhfcGljX3cgJSA2NCkgIT0gMCkgfHwKKwkJKGh3LT52YXYxX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoICUgNjQpICE9IDApKSB7CisJCWlmIChod190b192ZGVjKGh3KS0+Y2FudmFzX21vZGUgIT0KKwkJCUNBTlZBU19CTEtNT0RFX0xJTkVBUikKKwkJCWh3LT5tZW1fbWFwX21vZGUgPSAyOworCQllbHNlIHsKKwkJCWh3LT5tZW1fbWFwX21vZGUgPSAwOworCQkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwgInZkZWMgYmxrbW9kIGxpbmVhciwgZm9yY2UgbWVtX21hcF9tb2RlIDBcbiIpOworCQl9CisJfQorCisjaWYgMAorLy9uZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwlpZiAoaW5pdF9tdl9idWZfbGlzdChodykgPCAwKSB7CisJCXByX2VycigiJXM6IGluaXRfbXZfYnVmX2xpc3QgZmFpbFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLTE7CisJfQorI2VuZGlmCisKKwlody0+bXZfYnVmX21hcmdpbiA9IG12X2J1Zl9tYXJnaW47CisKKwlody0+cHRzX3Vuc3RhYmxlID0gKCh1bnNpZ25lZCBsb25nKShody0+dmF2MV9hbXN0cmVhbV9kZWNfaW5mby5wYXJhbSkKKwkJCSYgMHg0MCkgPj4gNjsKKworCWlmICgoZGVidWcgJiBBT01fQVYxX0RFQlVHX1NFTkRfUEFSQU1fV0lUSF9SRUcpID09IDApIHsKKwkJaHctPnJwbV9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlSUE1fQlVGX1NJWkUsCisJCQkJJmh3LT5ycG1fcGh5X2FkZHIsIEdGUF9LRVJORUwpOworCQlpZiAoaHctPnJwbV9hZGRyID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvYyBycG0gYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaHctPnJwbV9wdHIgPSBody0+cnBtX2FkZHI7CisJfQorCisJaWYgKHByZWZpeF9hdXhfYnVmX3NpemUgPiAwIHx8CisJCXN1ZmZpeF9hdXhfYnVmX3NpemUgPiAwKSB7CisJCXUzMiBhdXhfYnVmX3NpemU7CisKKwkJaHctPnByZWZpeF9hdXhfc2l6ZSA9IEFVWF9CVUZfQUxJR04ocHJlZml4X2F1eF9idWZfc2l6ZSk7CisJCWh3LT5zdWZmaXhfYXV4X3NpemUgPSBBVVhfQlVGX0FMSUdOKHN1ZmZpeF9hdXhfYnVmX3NpemUpOworCQlhdXhfYnVmX3NpemUgPSBody0+cHJlZml4X2F1eF9zaXplICsgaHctPnN1ZmZpeF9hdXhfc2l6ZTsKKwkJaHctPmF1eF9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlhdXhfYnVmX3NpemUsICZody0+YXV4X3BoeV9hZGRyLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGh3LT5hdXhfYWRkciA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgcnBtIGJ1ZmZlclxuIiwgX19mdW5jX18pOworCQkJZ290byBkbWFfYWxsb2NfZmFpbDsKKwkJfQorCX0KKyNpZiAoZGVmaW5lZCBERUJVR19VQ09ERV9MT0cpIHx8IChkZWZpbmVkIERFQlVHX0NNRCkKKwkvL2lmICh1ZGVidWdfZmxhZyAmIDB4OCkgeworCQlody0+dWNvZGVfbG9nX2FkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCVVDT0RFX0xPR19CVUZfU0laRSwgJmh3LT51Y29kZV9sb2dfcGh5X2FkZHIsIEdGUF9LRVJORUwpOworCQlpZiAoaHctPnVjb2RlX2xvZ19hZGRyID09IE5VTEwpIHsKKwkJCWh3LT51Y29kZV9sb2dfcGh5X2FkZHIgPSAwOworCQl9CisJCXByX2luZm8oIiVzOiBhbGxvYyB1Y29kZSBsb2cgYnVmZmVyICVwXG4iLAorCQkJX19mdW5jX18sIGh3LT51Y29kZV9sb2dfYWRkcik7CisJLy99CisjZW5kaWYKKworCWlmICghcmVzZXRfZmxhZykgeworCQlpbnQgYWxsb2NfbnVtID0gMTsKKwkJaWYgKChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NDMikgfHwKKwkJCShnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1QzKSB8fAorCQkJKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDcpIHx8CisJCQkoZ2V0X2NwdV9tYWpvcl9pZCgpID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNVcpKSB7CisJCQlhbGxvY19udW0gPSBGUkFNRV9CVUZGRVJTOworCQl9CisJCWh3LT5mZ19hZGRyID0gY29kZWNfbW1fZG1hX2FsbG9jX2NvaGVyZW50KCZody0+ZmdfdGFibGVfaGFuZGxlLAorCQkJCSh1bG9uZyAqKSZody0+ZmdfcGh5X2FkZHIsRkdTX1RBQkxFX1NJWkUgKiBhbGxvY19udW0sIE1FTV9OQU1FKTsKKwkJaWYgKGh3LT5mZ19hZGRyID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvYyBmZyBidWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJfQorCQlody0+ZmdfcHRyID0gaHctPmZnX2FkZHI7CisJCXByX2luZm8oIiVzLCBhbGxvYyBmZyB0YWJsZSBhZGRyICVseCwgc2l6ZSAweCV4XG4iLCBfX2Z1bmNfXywKKwkJCSh1bG9uZylody0+ZmdfcGh5X2FkZHIsIEZHU19UQUJMRV9TSVpFICogYWxsb2NfbnVtKTsKKwl9CisKKwlody0+bG1lbV9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCUxNRU1fQlVGX1NJWkUsCisJCQkmaHctPmxtZW1fcGh5X2FkZHIsIEdGUF9LRVJORUwpOworCWlmIChody0+bG1lbV9hZGRyID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFsbG9jIGxtZW0gYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZG1hX2FsbG9jX2ZhaWw7CisJfQorCWh3LT5sbWVtX3B0ciA9IGh3LT5sbWVtX2FkZHI7CisKKwl2ZGVjX3NldF92ZnJhbWVfY29tbShod190b192ZGVjKGh3KSwgRFJJVkVSX05BTUUpOworCXJldCA9IHZhdjFfbW11X21hcF9hbGxvYyhodyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZG1hX2FsbG9jX2ZhaWw7CisKKwlyZXR1cm4gcmV0OworCitkbWFfYWxsb2NfZmFpbDoKKwlhdjFfbG9jYWxfdW5pbml0KGh3LCByZXNldF9mbGFnKTsKKwlyZXR1cm4gLTE7Cit9CisKKworI2RlZmluZSBzcGVjMmNhbnZhcyh4KSAgXAorCSgoKHgpLT51dl9jYW52YXNfaW5kZXggPDwgMTYpIHwgXAorCSAoKHgpLT51dl9jYW52YXNfaW5kZXggPDwgOCkgIHwgXAorCSAoKHgpLT55X2NhbnZhc19pbmRleCA8PCAwKSkKKworCitzdGF0aWMgdm9pZCBzZXRfY2FudmFzKHN0cnVjdCBBVjFIV19zICpodywKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljX2NvbmZpZykKK3sKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhodyk7CisJaW50IGNhbnZhc193ID0gQUxJR04ocGljX2NvbmZpZy0+eV9jcm9wX3dpZHRoLCA2NCkvNDsKKwlpbnQgY2FudmFzX2ggPSBBTElHTihwaWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0LCAzMikvNDsKKwlpbnQgYmxrbW9kZSA9IGh3LT5tZW1fbWFwX21vZGU7CisJLypDQU5WQVNfQkxLTU9ERV82NFgzMiovCisJaWYJKHBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlKSB7CisJCWNhbnZhc193ID0gcGljX2NvbmZpZy0+eV9jcm9wX3dpZHRoCS8KKwkJCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKAorCQkJCQlwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4Zik7CisJCWNhbnZhc19oID0gcGljX2NvbmZpZy0+eV9jcm9wX2hlaWdodCAvCisJCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbygKKwkJCQkJcGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweGYpOworCisJCS8qIHNhbyBjdHJsMSBjb25maWcgYWxpZ25lZCB3aXRoIDY0LCBzbyBhbGlnbmVkIHdpdGggNjQgc2FtZSAqLworCQljYW52YXNfdyA9IEFMSUdOKGNhbnZhc193LCA2NCk7CisJCWNhbnZhc19oID0gQUxJR04oY2FudmFzX2gsIDMyKTsKKworCQlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJCWlmIChwaWNfY29uZmlnLT55X2NhbnZhc19pbmRleCA9PSAtMSkKKwkJCQlwaWNfY29uZmlnLT55X2NhbnZhc19pbmRleCA9CisJCQkJCXZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX0hFVkMsIHZkZWMtPmlkKTsKKwkJCWlmIChwaWNfY29uZmlnLT51dl9jYW52YXNfaW5kZXggPT0gLTEpCisJCQkJcGljX2NvbmZpZy0+dXZfY2FudmFzX2luZGV4ID0KKwkJCQkJdmRlYy0+Z2V0X2NhbnZhc19leChDT1JFX01BU0tfSEVWQywgdmRlYy0+aWQpOworCQl9IGVsc2UgeworCQkJcGljX2NvbmZpZy0+eV9jYW52YXNfaW5kZXggPSAxMjggKyBwaWNfY29uZmlnLT5pbmRleCAqIDI7CisJCQlwaWNfY29uZmlnLT51dl9jYW52YXNfaW5kZXggPSAxMjggKyBwaWNfY29uZmlnLT5pbmRleCAqIDIgKyAxOworCQl9CisKKwkJY29uZmlnX2Nhdl9sdXRfZXgocGljX2NvbmZpZy0+eV9jYW52YXNfaW5kZXgsCisJCQlwaWNfY29uZmlnLT5kd195X2FkciwgY2FudmFzX3csIGNhbnZhc19oLAorCQkJQ0FOVkFTX0FERFJfTk9XUkFQLCBibGttb2RlLCBody0+aXNfdXNlZF92NGwgPyAwIDogNywgVkRFQ19IRVZDKTsKKwkJY29uZmlnX2Nhdl9sdXRfZXgocGljX2NvbmZpZy0+dXZfY2FudmFzX2luZGV4LAorCQkJcGljX2NvbmZpZy0+ZHdfdV92X2FkciwJY2FudmFzX3csIGNhbnZhc19oLAorCQkJQ0FOVkFTX0FERFJfTk9XUkFQLCBibGttb2RlLCBody0+aXNfdXNlZF92NGwgPyAwIDogNywgVkRFQ19IRVZDKTsKKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwkJcGljX2NvbmZpZy0+Y2FudmFzX2NvbmZpZ1swXS5waHlfYWRkciA9CisJCQkJcGljX2NvbmZpZy0+ZHdfeV9hZHI7CisJCXBpY19jb25maWctPmNhbnZhc19jb25maWdbMF0ud2lkdGggPQorCQkJCWNhbnZhc193OworCQlwaWNfY29uZmlnLT5jYW52YXNfY29uZmlnWzBdLmhlaWdodCA9CisJCQkJY2FudmFzX2g7CisJCXBpY19jb25maWctPmNhbnZhc19jb25maWdbMF0uYmxvY2tfbW9kZSA9CisJCQkJYmxrbW9kZTsKKwkJcGljX2NvbmZpZy0+Y2FudmFzX2NvbmZpZ1swXS5lbmRpYW4gPSBody0+aXNfdXNlZF92NGwgPyAwIDogNzsKKworCQlwaWNfY29uZmlnLT5jYW52YXNfY29uZmlnWzFdLnBoeV9hZGRyID0KKwkJCQlwaWNfY29uZmlnLT5kd191X3ZfYWRyOworCQlwaWNfY29uZmlnLT5jYW52YXNfY29uZmlnWzFdLndpZHRoID0KKwkJCQljYW52YXNfdzsKKwkJcGljX2NvbmZpZy0+Y2FudmFzX2NvbmZpZ1sxXS5oZWlnaHQgPQorCQkJCWNhbnZhc19oOworCQlwaWNfY29uZmlnLT5jYW52YXNfY29uZmlnWzFdLmJsb2NrX21vZGUgPQorCQkJCWJsa21vZGU7CisJCXBpY19jb25maWctPmNhbnZhc19jb25maWdbMV0uZW5kaWFuID0gaHctPmlzX3VzZWRfdjRsID8gMCA6IDc7CisjZW5kaWYKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNldF9mcmFtZV9pbmZvKHN0cnVjdCBBVjFIV19zICpodywgc3RydWN0IHZmcmFtZV9zICp2ZikKK3sKKwl1bnNpZ25lZCBpbnQgYXI7CisJdmYtPmR1cmF0aW9uID0gaHctPmZyYW1lX2R1cjsKKwl2Zi0+ZHVyYXRpb25fcHVsbGRvd24gPSAwOworCXZmLT5mbGFnID0gMDsKKwl2Zi0+cHJvcC5tYXN0ZXJfZGlzcGxheV9jb2xvdXIgPSBody0+dmZfZHA7CisJdmYtPnNpZ25hbF90eXBlID0gaHctPnZpZGVvX3NpZ25hbF90eXBlOworCWlmICh2Zi0+Y29tcFdpZHRoICYmIHZmLT5jb21wSGVpZ2h0KQorCQlody0+ZnJhbWVfYXIgPSB2Zi0+Y29tcEhlaWdodCAqIDB4MTAwIC8gdmYtPmNvbXBXaWR0aDsKKwlhciA9IG1pbl90KHUzMiwgaHctPmZyYW1lX2FyLCBESVNQX1JBVElPX0FTUEVDVF9SQVRJT19NQVgpOworCXZmLT5yYXRpb19jb250cm9sID0gKGFyIDw8IERJU1BfUkFUSU9fQVNQRUNUX1JBVElPX0JJVCk7CisKKwlpZiAoaHctPmlzX3VzZWRfdjRsICYmICh2Zi0+c2lnbmFsX3R5cGUgIT0gMCkpIHsKKwkJc3RydWN0IGFtbF92ZGVjX2hkcl9pbmZvcyBoZHI7CisJCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KTsKKworCQltZW1zZXQoJmhkciwgMCwgc2l6ZW9mKGhkcikpOworCQloZHIuc2lnbmFsX3R5cGUgPSB2Zi0+c2lnbmFsX3R5cGU7CisJCWhkci5jb2xvcl9wYXJtcyA9IGh3LT52Zl9kcDsKKwkJaGRyLmNvbG9yX3Bhcm1zLmx1bWluYW5jZVswXSA9IGhkci5jb2xvcl9wYXJtcy5sdW1pbmFuY2VbMF0gLyAxMDAwOworCQl2ZGVjX3Y0bF9zZXRfaGRyX2luZm9zKGN0eCwgJmhkcik7CisJfQorCisJdmYtPnNpZGViaW5kX3R5cGUgPSBody0+c2lkZWJpbmRfdHlwZTsKKwl2Zi0+c2lkZWJpbmRfY2hhbm5lbF9pZCA9IGh3LT5zaWRlYmluZF9jaGFubmVsX2lkOworfQorCitzdGF0aWMgaW50IHZhdjFfdmZfc3RhdGVzKHN0cnVjdCB2ZnJhbWVfc3RhdGVzICpzdGF0ZXMsIHZvaWQgKm9wX2FyZykKK3sKKwlzdHJ1Y3QgQVYxSFdfcyAqaHcgPSAoc3RydWN0IEFWMUhXX3MgKilvcF9hcmc7CisKKwlzdGF0ZXMtPnZmX3Bvb2xfc2l6ZSA9IFZGX1BPT0xfU0laRTsKKwlzdGF0ZXMtPmJ1Zl9mcmVlX251bSA9IGtmaWZvX2xlbigmaHctPm5ld2ZyYW1lX3EpOworCXN0YXRlcy0+YnVmX2F2YWlsX251bSA9IGtmaWZvX2xlbigmaHctPmRpc3BsYXlfcSk7CisKKwlpZiAoc3RlcCA9PSAyKQorCQlzdGF0ZXMtPmJ1Zl9hdmFpbF9udW0gPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2YXYxX3ZmX3BlZWsodm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCB2ZnJhbWVfcyAqdmZbMl0gPSB7MCwgMH07CisJc3RydWN0IEFWMUhXX3MgKmh3ID0gKHN0cnVjdCBBVjFIV19zICopb3BfYXJnOworCisJaWYgKHN0ZXAgPT0gMikKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoa2ZpZm9fb3V0X3BlZWsoJmh3LT5kaXNwbGF5X3EsICh2b2lkICopJnZmLCAyKSkgeworCQlpZiAodmZbMV0pIHsKKwkJCXZmWzBdLT5uZXh0X3ZmX3B0c192YWxpZCA9IHRydWU7CisJCQl2ZlswXS0+bmV4dF92Zl9wdHMgPSB2ZlsxXS0+cHRzOworCQl9IGVsc2UKKwkJCXZmWzBdLT5uZXh0X3ZmX3B0c192YWxpZCA9IGZhbHNlOworCQlyZXR1cm4gdmZbMF07CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZhdjFfdmZfZ2V0KHZvaWQgKm9wX2FyZykKK3sKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmOworCXN0cnVjdCBBVjFIV19zICpodyA9IChzdHJ1Y3QgQVYxSFdfcyAqKW9wX2FyZzsKKworCWlmIChzdGVwID09IDIpCisJCXJldHVybiBOVUxMOworCWVsc2UgaWYgKHN0ZXAgPT0gMSkKKwkJCXN0ZXAgPSAyOworCisJaWYgKGtmaWZvX2dldCgmaHctPmRpc3BsYXlfcSwgJnZmKSkgeworCQlzdHJ1Y3QgdmZyYW1lX3MgKm5leHRfdmYgPSBOVUxMOworCQl1aW50OF90IGluZGV4ID0gdmYtPmluZGV4ICYgMHhmZjsKKwkJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRpc3BfcV9uYW1lLCBrZmlmb19sZW4oJmh3LT5kaXNwbGF5X3EpKTsKKwkJaWYgKGluZGV4IDwgaHctPnVzZWRfYnVmX251bSB8fAorCQkJKHZmLT50eXBlICYgVklEVFlQRV9WNExfRU9TKSkgeworCQkJdmYtPmluZGV4X2Rpc3AgPSAgYXRvbWljX3JlYWQoJmh3LT52Zl9nZXRfY291bnQpOworCQkJYXRvbWljX2FkZCgxLCAmaHctPnZmX2dldF9jb3VudCk7CisJCQlpZiAoZGVidWcgJiBBT01fREVCVUdfVkZSQU1FKSB7CisJCQkJc3RydWN0IEJ1ZmZlclBvb2xfcyAqcG9vbCA9IGh3LT5jb21tb24uYnVmZmVyX3Bvb2w7CisJCQkJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnBpYyA9CisJCQkJCSZwb29sLT5mcmFtZV9idWZzW2luZGV4XS5idWY7CisJCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCQlsb2NrX2J1ZmZlcl9wb29sKGh3LT5jb21tb24uYnVmZmVyX3Bvb2wsIGZsYWdzKTsKKwkJCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19WRlJBTUUsICIlcyB2ZiAlcHggaW5kZXggMHgleCB0eXBlIDB4JXggdy9oICVkLyVkLCBhdXggc2l6ZSAlZCwgcHRzICVkLCAlbGxkLCB0czogJWxsdVxuIiwKKwkJCQkJX19mdW5jX18sIHZmLCB2Zi0+aW5kZXgsIHZmLT50eXBlLAorCQkJCQl2Zi0+d2lkdGgsIHZmLT5oZWlnaHQsCisJCQkJCXBpYy0+YXV4X2RhdGFfc2l6ZSwKKwkJCQkJdmYtPnB0cywKKwkJCQkJdmYtPnB0c191czY0LAorCQkJCQl2Zi0+dGltZXN0YW1wKTsKKwkJCQl1bmxvY2tfYnVmZmVyX3Bvb2woaHctPmNvbW1vbi5idWZmZXJfcG9vbCwgZmxhZ3MpOworCQkJfQorCisJCQlpZiAoa2ZpZm9fcGVlaygmaHctPmRpc3BsYXlfcSwgJm5leHRfdmYpICYmIG5leHRfdmYpIHsKKwkJCQl2Zi0+bmV4dF92Zl9wdHNfdmFsaWQgPSB0cnVlOworCQkJCXZmLT5uZXh0X3ZmX3B0cyA9IG5leHRfdmYtPnB0czsKKwkJCX0gZWxzZQorCQkJCXZmLT5uZXh0X3ZmX3B0c192YWxpZCA9IGZhbHNlOworI2lmZGVmIERVTVBfRklMTUdSQUlOCisJCQlpZiAoaW5kZXggPT0gZmdfZHVtcF9pbmRleCkgeworCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkJaW50IGlpOworCQkJCWxvY2tfYnVmZmVyX3Bvb2woaHctPmNvbW1vbi5idWZmZXJfcG9vbCwgZmxhZ3MpOworCQkJCXByX2luZm8oIkZHU19UQUJMRSBmb3IgYnVmZmVyICVkOlxuIiwgaW5kZXgpOworCQkJCWZvciAoaWkgPSAwOyBpaSA8IEZHU19UQUJMRV9TSVpFOyBpaSsrKSB7CisJCQkgICAgICAgIHByX2luZm8oIiUwMnggIiwgaHctPmZnX3B0cltpaV0pOworCSAgICAgICAgCQlpZiAoKChpaSsgMSkgJiAweGYpID09IDApCisJCQkJCQlwcl9pbmZvKCJcbiIpOworCSAgICAJCX0KKwkJCQl1bmxvY2tfYnVmZmVyX3Bvb2woaHctPmNvbW1vbi5idWZmZXJfcG9vbCwgZmxhZ3MpOworCQkJfQorI2VuZGlmCisKKwkJCXJldHVybiB2ZjsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgdmF2MV92Zl9wdXQoc3RydWN0IHZmcmFtZV9zICp2Ziwgdm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCBBVjFIV19zICpodyA9IChzdHJ1Y3QgQVYxSFdfcyAqKW9wX2FyZzsKKwl1aW50OF90IGluZGV4ID0gdmYtPmluZGV4ICYgMHhmZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCh2ZiA9PSBOVUxMKSB8fCAoaHcgPT0gTlVMTCkpCisJCXJldHVybjsKKworCWtmaWZvX3B1dCgmaHctPm5ld2ZyYW1lX3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLm5ld19xX25hbWUsIGtmaWZvX2xlbigmaHctPm5ld2ZyYW1lX3EpKTsKKwlhdG9taWNfYWRkKDEsICZody0+dmZfcHV0X2NvdW50KTsKKwlpZiAoZGVidWcgJiBBT01fREVCVUdfVkZSQU1FKSB7CisJCWxvY2tfYnVmZmVyX3Bvb2woaHctPmNvbW1vbi5idWZmZXJfcG9vbCwgZmxhZ3MpOworCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19WRlJBTUUsICIlcyBpbmRleCAweCV4IHR5cGUgMHgleCB3L2ggJWQvJWQsIHB0cyAlZCwgJWxsZCwgdHM6ICVsbHVcbiIsCisJCQlfX2Z1bmNfXywgdmYtPmluZGV4LCB2Zi0+dHlwZSwKKwkJCXZmLT53aWR0aCwgdmYtPmhlaWdodCwKKwkJCXZmLT5wdHMsCisJCQl2Zi0+cHRzX3VzNjQsCisJCQl2Zi0+dGltZXN0YW1wKTsKKwkJdW5sb2NrX2J1ZmZlcl9wb29sKGh3LT5jb21tb24uYnVmZmVyX3Bvb2wsIGZsYWdzKTsKKwl9CisKKwlpZiAoaW5kZXggPCBody0+dXNlZF9idWZfbnVtKSB7CisJCXN0cnVjdCBBVjFfQ29tbW9uX3MgKmNtID0gJmh3LT5jb21tb247CisJCXN0cnVjdCBCdWZmZXJQb29sX3MgKnBvb2wgPSBjbS0+YnVmZmVyX3Bvb2w7CisJCVBJQ19CVUZGRVJfQ09ORklHICpwaWMgPSAmcG9vbC0+ZnJhbWVfYnVmc1tpbmRleF0uYnVmOworCisJCWlmICh2Zi0+djRsX21lbV9oYW5kbGUgIT0KKwkJCWh3LT5tX0JVRltwaWMtPkJVRl9pbmRleF0udjRsX3JlZl9idWZfYWRkcikgeworCQkJYXYxX3ByaW50KGh3LCBQUklOVF9GTEFHX1Y0TF9ERVRBSUwsCisJCQkJIkFWMSB1cGRhdGUgZmIgaGFuZGxlLCBvbGQ6JWxseCwgbmV3OiVsbHhcbiIsCisJCQkJaHctPm1fQlVGW3BpYy0+QlVGX2luZGV4XS52NGxfcmVmX2J1Zl9hZGRyLAorCQkJCXZmLT52NGxfbWVtX2hhbmRsZSk7CisKKwkJCWh3LT5tX0JVRltwaWMtPkJVRl9pbmRleF0udjRsX3JlZl9idWZfYWRkciA9CisJCQkJdmYtPnY0bF9tZW1faGFuZGxlOworCQl9CisKKwkJbG9ja19idWZmZXJfcG9vbChody0+Y29tbW9uLmJ1ZmZlcl9wb29sLCBmbGFncyk7CisJCWlmIChwaWMtPnJlcGVhdF9waWMpIHsKKwkJCWlmIChwaWMtPnJlcGVhdF9waWMtPnJlcGVhdF9jb3VudCA+IDApCisJCQkJcGljLT5yZXBlYXRfcGljLT5yZXBlYXRfY291bnQgLS07CisJCQllbHNlCisJCQkJYXYxX3ByaW50KGh3LCBQUklOVF9GTEFHX0VSUk9SLCAicmVwZWF0X2NvdW50IDw9IDAgcGljOiVweFxuIiwgcGljKTsKKwkJCXBpYy0+cmVwZWF0X3BpYyA9IE5VTEw7CisJCX0KKwkJaWYgKChkZWJ1ZyAmIEFWMV9ERUJVR19JR05PUkVfVkZfUkVGKSA9PSAwKSB7CisJCQlpZiAocG9vbC0+ZnJhbWVfYnVmc1tpbmRleF0uYnVmLnZmX3JlZiA+IDApCisJCQkJcG9vbC0+ZnJhbWVfYnVmc1tpbmRleF0uYnVmLnZmX3JlZi0tOworCQl9CisJCWlmIChody0+d2FpdF9idWYpCisJCQlXUklURV9WUkVHKEhFVkNfQVNTSVNUX01CT1gwX0lSUV9SRUcsIDB4MSk7CisKKwkJaHctPmxhc3RfcHV0X2lkeCA9IGluZGV4OworCQlody0+bmV3X2ZyYW1lX2Rpc3BsYXllZCsrOworCisJCWlmIChody0+d2FpdF9tb3JlX2J1ZikgeworCQkJaHctPndhaXRfbW9yZV9idWYgPSBmYWxzZTsKKwkJCWh3LT5kZWNfcmVzdWx0ID0gQU9NX0FWMV9SRVNVTFRfTkVFRF9NT1JFX0JVRkZFUjsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQl9CisKKwkJdW5sb2NrX2J1ZmZlcl9wb29sKGh3LT5jb21tb24uYnVmZmVyX3Bvb2wsIGZsYWdzKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdmF2MV9ldmVudF9jYihpbnQgdHlwZSwgdm9pZCAqZGF0YSwgdm9pZCAqb3BfYXJnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IEFWMUhXX3MgKmh3ID0gKHN0cnVjdCBBVjFIV19zICopb3BfYXJnOworCXN0cnVjdCBBVjFfQ29tbW9uX3MgKmNtID0gJmh3LT5jb21tb247CisJc3RydWN0IEJ1ZmZlclBvb2xfcyAqcG9vbCA9IGNtLT5idWZmZXJfcG9vbDsKKworCWlmICh0eXBlICYgVkZSQU1FX0VWRU5UX1JFQ0VJVkVSX1JFU0VUKSB7CisjaWYgMAorCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCWFtaGV2Y19zdG9wKCk7CisjaWZuZGVmIENPTkZJR19BTUxPR0lDX1BPU1RfUFJPQ0VTU19NQU5BR0VSCisJCXZmX2xpZ2h0X3VucmVnX3Byb3ZpZGVyKCZ2YXYxX3ZmX3Byb3YpOworI2VuZGlmCisJCXNwaW5fbG9ja19pcnFzYXZlKCZody0+bG9jaywgZmxhZ3MpOworCQl2YXYxX2xvY2FsX2luaXQoKTsKKwkJdmF2MV9wcm90X2luaXQoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmxvY2ssIGZsYWdzKTsKKyNpZm5kZWYgQ09ORklHX0FNTE9HSUNfUE9TVF9QUk9DRVNTX01BTkFHRVIKKwkJdmZfcmVnX3Byb3ZpZGVyKCZ2YXYxX3ZmX3Byb3YpOworI2VuZGlmCisJCWFtaGV2Y19zdGFydCgpOworI2VuZGlmCisJfSBlbHNlIGlmICh0eXBlICYgVkZSQU1FX0VWRU5UX1JFQ0VJVkVSX0dFVF9BVVhfREFUQSkgeworCQlzdHJ1Y3QgcHJvdmlkZXJfYXV4X3JlcV9zICpyZXEgPQorCQkJKHN0cnVjdCBwcm92aWRlcl9hdXhfcmVxX3MgKilkYXRhOworCQl1bnNpZ25lZCBjaGFyIGluZGV4OworCisJCWxvY2tfYnVmZmVyX3Bvb2woaHctPmNvbW1vbi5idWZmZXJfcG9vbCwgZmxhZ3MpOworCQlpbmRleCA9IHJlcS0+dmYtPmluZGV4ICYgMHhmZjsKKwkJcmVxLT5hdXhfYnVmID0gTlVMTDsKKwkJcmVxLT5hdXhfc2l6ZSA9IDA7CisJCWlmIChyZXEtPmJvdF9mbGFnKQorCQkJaW5kZXggPSAocmVxLT52Zi0+aW5kZXggPj4gOCkgJiAweGZmOworCQlpZiAoaW5kZXggIT0gMHhmZgorCQkJJiYgaW5kZXggPCBody0+dXNlZF9idWZfbnVtKSB7CisJCQlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljX2NvbmZpZyA9CisJCQkJJnBvb2wtPmZyYW1lX2J1ZnNbaW5kZXhdLmJ1ZjsKKwkJCXJlcS0+YXV4X2J1ZiA9IHBpY19jb25maWctPmF1eF9kYXRhX2J1ZjsKKwkJCXJlcS0+YXV4X3NpemUgPSBwaWNfY29uZmlnLT5hdXhfZGF0YV9zaXplOworI2lmIDAKKy8vZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJCQlpZiAoaHctPmJ5cGFzc19kdmVubCAmJiAhZG9sYnlfbWV0YV93aXRoX2VsKQorCQkJCXJlcS0+ZHZfZW5oYW5jZV9leGlzdCA9IGZhbHNlOworCQkJZWxzZQorCQkJCXJlcS0+ZHZfZW5oYW5jZV9leGlzdCA9CisJCQkJCXBpY19jb25maWctPmR2X2VuaGFuY2VfZXhpc3Q7CisJCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19WRlJBTUUsCisJCQkicXVlcnkgZHZfZW5oYW5jZV9leGlzdCBmb3IgcGljICh2ZiAweCVwLCBwb2MgJWQgaW5kZXggJWQpIGZsYWcgPT4gJWQsIGF1eCBzaXpkIDB4JXhcbiIsCisJCQlyZXEtPnZmLAorCQkJcGljX2NvbmZpZy0+UE9DLCBpbmRleCwKKwkJCXJlcS0+ZHZfZW5oYW5jZV9leGlzdCwgcmVxLT5hdXhfc2l6ZSk7CisjZWxzZQorCQkJcmVxLT5kdl9lbmhhbmNlX2V4aXN0ID0gMDsKKyNlbmRpZgorCQl9CisJCXVubG9ja19idWZmZXJfcG9vbChody0+Y29tbW9uLmJ1ZmZlcl9wb29sLCBmbGFncyk7CisKKwkJaWYgKGRlYnVnICYgQU9NX0RFQlVHX0FVWF9EQVRBKQorCQkJYXYxX3ByaW50KGh3LCAwLAorCQkJIiVzKHR5cGUgMHgleCB2ZiBpbmRleCAweCV4KT0+c2l6ZSAweCV4XG4iLAorCQkJX19mdW5jX18sIHR5cGUsIGluZGV4LCByZXEtPmF1eF9zaXplKTsKKwl9IGVsc2UgaWYgKHR5cGUgJiBWRlJBTUVfRVZFTlRfUkVDRUlWRVJfUkVRX1NUQVRFKSB7CisJCXN0cnVjdCBwcm92aWRlcl9zdGF0ZV9yZXFfcyAqcmVxID0KKwkJCShzdHJ1Y3QgcHJvdmlkZXJfc3RhdGVfcmVxX3MgKilkYXRhOworCQlpZiAocmVxLT5yZXFfdHlwZSA9PSBSRVFfU1RBVEVfU0VDVVJFKQorCQkJcmVxLT5yZXFfcmVzdWx0WzBdID0gdmRlY19zZWN1cmUoaHdfdG9fdmRlYyhodykpOworCQllbHNlCisJCQlyZXEtPnJlcV9yZXN1bHRbMF0gPSAweGZmZmZmZmZmOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBhdjFfaW5jX3ZmX3JlZihzdHJ1Y3QgQVYxSFdfcyAqaHcsIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgQVYxX0NvbW1vbl9zICpjbSA9ICZody0+Y29tbW9uOworCisJaWYgKChkZWJ1ZyAmIEFWMV9ERUJVR19JR05PUkVfVkZfUkVGKSA9PSAwKSB7CisJCWNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmc1tpbmRleF0uYnVmLnZmX3JlZisrOworCisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX0JVRk1HUl9NT1JFLCAiJXMgaW5kZXggPSAlZCBuZXcgdmZfcmVmID0gJWRcclxuIiwKKwkJCV9fZnVuY19fLCBpbmRleCwKKwkJCWNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmc1tpbmRleF0uYnVmLnZmX3JlZik7CisJfQorfQorI2lmIDAKK3N0YXRpYyBpbnQgZnJhbWVfZHVyYXRpb25fYWRhcHQoc3RydWN0IEFWMUhXX3MgKmh3LCBzdHJ1Y3QgdmZyYW1lX3MgKnZmLCB1MzIgdmFsaWQpCit7CisJdTMyIG9sZF9kdXJhdGlvbiwgcHRzX2R1cmF0aW9uID0gMDsKKwl1MzIgcHRzID0gdmYtPnB0czsKKworCWlmIChody0+Z2V0X2ZyYW1lX2R1ciA9PSB0cnVlKQorCQlyZXR1cm4gdHJ1ZTsKKworCWh3LT5mcmFtZV9jbnRfd2luZG93Kys7CisJaWYgKCEoaHctPmF2MV9maXJzdF9wdHNfcmVhZHkgPT0gMSkpIHsKKwkJaWYgKHZhbGlkKSB7CisJCQlody0+cHRzMSA9IHB0czsKKwkJCWh3LT5mcmFtZV9jbnRfd2luZG93ID0gMDsKKwkJCWh3LT5kdXJhdGlvbl9mcm9tX3B0c19kb25lID0gMDsKKwkJCWh3LT5hdjFfZmlyc3RfcHRzX3JlYWR5ID0gMTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChwdHMgPCBody0+cHRzMSkgeworCQkJaWYgKGh3LT5mcmFtZV9jbnRfd2luZG93ID4gRlJBTUVfQ05UX1dJTkRPV19TSVpFKSB7CisJCQkJaHctPnB0czEgPSBwdHM7CisJCQkJaHctPmZyYW1lX2NudF93aW5kb3cgPSAwOworCQkJfQorCQl9CisKKwkJaWYgKHZhbGlkICYmIChody0+ZnJhbWVfY250X3dpbmRvdyA+IEZSQU1FX0NOVF9XSU5ET1dfU0laRSkgJiYKKwkJCShwdHMgPiBody0+cHRzMSkgJiYgKGh3LT5kdXJhdGlvbl9mcm9tX3B0c19kb25lID09IDApKSB7CisJCQkJb2xkX2R1cmF0aW9uID0gaHctPmZyYW1lX2R1cjsKKwkJCQlody0+cHRzMiA9IHB0czsKKwkJCQlwdHNfZHVyYXRpb24gPSAoKChody0+cHRzMiAtIGh3LT5wdHMxKSAqIDE2KSAvCisJCQkJCShody0+ZnJhbWVfY250X3dpbmRvdyAqIDE1KSk7CisKKwkJCWlmIChjbG9zZV90byhwdHNfZHVyYXRpb24sIG9sZF9kdXJhdGlvbiwgMjAwMCkpIHsKKwkJCQlody0+ZnJhbWVfZHVyID0gcHRzX2R1cmF0aW9uOworCQkJCWF2MV9wcmludChodywgQVYxX0RFQlVHX09VVF9QVFMsCisJCQkJCSJ1c2UgY2FsYyBkdXJhdGlvbiAlZFxuIiwgcHRzX2R1cmF0aW9uKTsKKwkJCX0KKworCQkJaWYgKGh3LT5kdXJhdGlvbl9mcm9tX3B0c19kb25lID09IDApIHsKKwkJCQlpZiAoY2xvc2VfdG8ocHRzX2R1cmF0aW9uLCBvbGRfZHVyYXRpb24sIFJBVEVfQ09SUkVDVElPTl9USFJFU0hPTEQpKSB7CisJCQkJCWh3LT5kdXJhdGlvbl9mcm9tX3B0c19kb25lID0gMTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoIWNsb3NlX3RvKHB0c19kdXJhdGlvbiwKKwkJCQkJCSBvbGRfZHVyYXRpb24sIDEwMDApICYmCisJCQkJCQkhY2xvc2VfdG8ocHRzX2R1cmF0aW9uLAorCQkJCQkJaHctPmZyYW1lX2R1ciwgMTAwMCkgJiYKKwkJCQkJCWNsb3NlX3RvKHB0c19kdXJhdGlvbiwKKwkJCQkJCWh3LT5sYXN0X2R1cmF0aW9uLCAyMDApKSB7CisJCQkJCQkvKiBmcmFtZV9kdXIgbXVzdAorCQkJCQkJICogIHdyb25nLHJlY292ZXIgaXQuCisJCQkJCQkgKi8KKwkJCQkJCWh3LT5mcmFtZV9kdXIgPSBwdHNfZHVyYXRpb247CisJCQkJCX0KKwkJCQkJaHctPnB0czEgPSBody0+cHRzMjsKKwkJCQkJaHctPmZyYW1lX2NudF93aW5kb3cgPSAwOworCQkJCQlody0+ZHVyYXRpb25fZnJvbV9wdHNfZG9uZSA9IDA7CisJCQkJfQorCQkJfQorCQkJaHctPmxhc3RfZHVyYXRpb24gPSBwdHNfZHVyYXRpb247CisJCX0KKwl9CisJcmV0dXJuIHRydWU7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgdXBkYXRlX3ZmX21lbWhhbmRsZShzdHJ1Y3QgQVYxSFdfcyAqaHcsCisJc3RydWN0IHZmcmFtZV9zICp2Ziwgc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnBpYykKK3sKKwkvKiBrZWVwZXIgbm90IG5lZWRlZCBmb3IgdjRsIHNvbHV0aW9uICovCisJaWYgKGh3LT5pc191c2VkX3Y0bCkKKwkJcmV0dXJuOworCisJaWYgKHBpYy0+aW5kZXggPCAwKSB7CisJCXZmLT5tZW1faGFuZGxlID0gTlVMTDsKKwkJdmYtPm1lbV9oZWFkX2hhbmRsZSA9IE5VTEw7CisJCXZmLT5tZW1fZHdfaGFuZGxlID0gTlVMTDsKKwl9IGVsc2UgaWYgKHZmLT50eXBlICYgVklEVFlQRV9TQ0FUVEVSKSB7CisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKwkJaWYgKHBpYy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDIwICYmCisJCQkoZGVidWcgJiBBT01fREVCVUdfRFdfRElTUF9NQUlOKSA9PSAwKSB7CisJCQl2Zi0+bWVtX2hhbmRsZSA9CisJCQkJZGVjb2Rlcl9tbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCQlody0+bW11X2JveF9kdywgcGljLT5pbmRleCk7CisJCQl2Zi0+bWVtX2hlYWRfaGFuZGxlID0KKwkJCQlkZWNvZGVyX2JtbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCQlody0+Ym1tdV9ib3gsCisJCQkJCURXX0hFQURFUl9CVUZGRVJfSURYKHBpYy0+QlVGX2luZGV4KSk7CisJCQl2Zi0+bWVtX2R3X2hhbmRsZSA9IE5VTEw7CisJCX0gZWxzZQorI2VuZGlmCisJCXsKKwkJdmYtPm1lbV9oYW5kbGUgPQorCQkJZGVjb2Rlcl9tbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCWh3LT5tbXVfYm94LCBwaWMtPmluZGV4KTsKKwkJdmYtPm1lbV9oZWFkX2hhbmRsZSA9CisJCQlkZWNvZGVyX2JtbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCWh3LT5ibW11X2JveCwKKwkJCQlIRUFERVJfQlVGRkVSX0lEWChwaWMtPkJVRl9pbmRleCkpOworCQlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSA9PSAzKQorCQkJdmYtPm1lbV9kd19oYW5kbGUgPQorCQkJCWRlY29kZXJfYm1tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJCWh3LT5ibW11X2JveCwKKwkJCQkJVkZfQlVGRkVSX0lEWChwaWMtPkJVRl9pbmRleCkpOworCQllbHNlCisJCQl2Zi0+bWVtX2R3X2hhbmRsZSA9IE5VTEw7CisJCX0KKyNpZmRlZiBVU0VfU1BFQ19CVUZfRk9SX01NVV9IRUFECisJCXZmLT5tZW1faGVhZF9oYW5kbGUgPSBOVUxMOworI2VuZGlmCisJfSBlbHNlIHsKKwkJdmYtPm1lbV9oYW5kbGUgPQorCQkJZGVjb2Rlcl9ibW11X2JveF9nZXRfbWVtX2hhbmRsZSgKKwkJCQlody0+Ym1tdV9ib3gsIFZGX0JVRkZFUl9JRFgocGljLT5CVUZfaW5kZXgpKTsKKwkJdmYtPm1lbV9oZWFkX2hhbmRsZSA9IE5VTEw7CisJCXZmLT5tZW1fZHdfaGFuZGxlID0gTlVMTDsKKwkJLyp2Zi0+bWVtX2hlYWRfaGFuZGxlID0KKwkJICpkZWNvZGVyX2JtbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkgKmh3LT5ibW11X2JveCwgVkZfQlVGRkVSX0lEWChCVUZfaW5kZXgpKTsKKwkJICovCisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXYxX3VwZGF0ZV9ndnMoc3RydWN0IEFWMUhXX3MgKmh3LCBzdHJ1Y3QgdmZyYW1lX3MgKnZmLAorCQkJCSAgc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnBpY19jb25maWcpCit7CisJaWYgKGh3LT5ndnMtPmZyYW1lX2hlaWdodCAhPSBwaWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0KSB7CisJCWh3LT5ndnMtPmZyYW1lX3dpZHRoID0gcGljX2NvbmZpZy0+eV9jcm9wX3dpZHRoOworCQlody0+Z3ZzLT5mcmFtZV9oZWlnaHQgPSBwaWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0OworCX0KKwlpZiAoaHctPmd2cy0+ZnJhbWVfZHVyICE9IGh3LT5mcmFtZV9kdXIpIHsKKwkJaHctPmd2cy0+ZnJhbWVfZHVyID0gaHctPmZyYW1lX2R1cjsKKwkJaWYgKGh3LT5mcmFtZV9kdXIgIT0gMCkKKwkJCWh3LT5ndnMtPmZyYW1lX3JhdGUgPSAoKDk2MDAwICogMTAgLyBody0+ZnJhbWVfZHVyKSAlIDEwKSA8IDUgPworCQkJCQk5NjAwMCAvIGh3LT5mcmFtZV9kdXIgOiAoOTYwMDAgLyBody0+ZnJhbWVfZHVyICsxKTsKKwkJZWxzZQorCQkJaHctPmd2cy0+ZnJhbWVfcmF0ZSA9IC0xOworCX0KKwlpZiAodmYgJiYgaHctPmd2cy0+cmF0aW9fY29udHJvbCAhPSB2Zi0+cmF0aW9fY29udHJvbCkKKwkJaHctPmd2cy0+cmF0aW9fY29udHJvbCA9IHZmLT5yYXRpb19jb250cm9sOworCisJaHctPmd2cy0+c3RhdHVzID0gaHctPnN0YXQgfCBody0+ZmF0YWxfZXJyb3I7CisJaHctPmd2cy0+ZXJyb3JfY291bnQgPSBody0+Z3ZzLT5lcnJvcl9mcmFtZV9jb3VudDsKKworfQorCitzdGF0aWMgaW50IHByZXBhcmVfZGlzcGxheV9idWYoc3RydWN0IEFWMUhXX3MgKmh3LAorCQkJCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpwaWNfY29uZmlnKQoreworCXN0cnVjdCB2ZnJhbWVfcyAqdmYgPSBOVUxMOworCXN0cnVjdCB2ZGVjX2luZm8gdG1wNHg7CisJaW50IHN0cmVhbV9vZmZzZXQgPSBwaWNfY29uZmlnLT5zdHJlYW1fb2Zmc2V0OworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqIHY0bDJfY3R4ID0gaHctPnY0bDJfY3R4OworCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9IE5VTEw7CisJdWxvbmcgbnZfb3JkZXIgPSBWSURUWVBFX1ZJVV9OVjIxOworCXUzMiBwdHNfdmFsaWQgPSAwLCBwdHNfdXM2NF92YWxpZCA9IDA7CisJdTMyIGZyYW1lX3NpemU7CisJaW50IGksIHJlY2xhY19mbGFnID0gMDsKKworCWF2MV9wcmludChodywgQU9NX0RFQlVHX1ZGUkFNRSwgIiVzIGluZGV4ID0gJWRcclxuIiwgX19mdW5jX18sIHBpY19jb25maWctPmluZGV4KTsKKwlpZiAoa2ZpZm9fZ2V0KCZody0+bmV3ZnJhbWVfcSwgJnZmKSA9PSAwKSB7CisJCWF2MV9wcmludChodywgMCwgImZhdGFsIGVycm9yLCBubyBhdmFpbGFibGUgYnVmZmVyIHNsb3QuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBzd2FwIHV2ICovCisJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQlpZiAoKHY0bDJfY3R4LT5jYXBfcGl4X2ZtdCA9PSBWNEwyX1BJWF9GTVRfTlYxMikgfHwKKwkJCSh2NGwyX2N0eC0+Y2FwX3BpeF9mbXQgPT0gVjRMMl9QSVhfRk1UX05WMTJNKSkKKwkJCW52X29yZGVyID0gVklEVFlQRV9WSVVfTlYxMjsKKwl9CisKKwlpZiAocGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGUgJiYKKwkJKHBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlICYgMHgyMCkgPT0gMCkKKwkJc2V0X2NhbnZhcyhodywgcGljX2NvbmZpZyk7CisKKwlkaXNwbGF5X2ZyYW1lX2NvdW50W2h3LT5pbmRleF0rKzsKKwlpZiAodmYpIHsKKwkJaWYgKCFmb3JjZV9wdHNfdW5zdGFibGUgJiYgaHctPmF2MV9maXJzdF9wdHNfcmVhZHkpIHsKKwkJCWlmICgocGljX2NvbmZpZy0+cHRzID09IDApIHx8ICgocGljX2NvbmZpZy0+cHRzIDw9IGh3LT5sYXN0X3B0cykgJiYKKwkJCQkocGljX2NvbmZpZy0+cHRzNjQgPD0gaHctPmxhc3RfcHRzX3VzNjQpKSkgeworCQkJCWZvciAoaSA9IChGUkFNRV9CVUZGRVJTIC0gMSk7IGkgPiAwOyBpLS0pIHsKKwkJCQkJaWYgKChody0+bGFzdF9wdHMgPT0gaHctPmZyYW1lX21vZGVfcHRzX3NhdmVbaV0pIHx8CisJCQkJCQkoaHctPmxhc3RfcHRzX3VzNjQgPT0gaHctPmZyYW1lX21vZGVfcHRzNjRfc2F2ZVtpXSkpIHsKKwkJCQkJCXBpY19jb25maWctPnB0cyA9IGh3LT5mcmFtZV9tb2RlX3B0c19zYXZlW2kgLSAxXTsKKwkJCQkJCXBpY19jb25maWctPnB0czY0ID0gaHctPmZyYW1lX21vZGVfcHRzNjRfc2F2ZVtpIC0gMV07CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmICgoaSA9PSAwKSB8fCAocGljX2NvbmZpZy0+cHRzIDw9IGh3LT5sYXN0X3B0cykpIHsKKwkJCQkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfT1VUX1BUUywKKwkJCQkJCSJubyBmb3VuZCBwdHMgJWQsIHNldCAwLiAlZCwgJWRcbiIsCisJCQkJCQlpLCBwaWNfY29uZmlnLT5wdHMsIGh3LT5sYXN0X3B0cyk7CisJCQkJCXBpY19jb25maWctPnB0cyA9IDA7CisJCQkJCXBpY19jb25maWctPnB0czY0ID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCQl2Zi0+djRsX21lbV9oYW5kbGUKKwkJCQk9IGh3LT5tX0JVRltwaWNfY29uZmlnLT52NGxfYnVmX2luZGV4XS52NGxfcmVmX2J1Zl9hZGRyOworCQkJZmIgPSAoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKil2Zi0+djRsX21lbV9oYW5kbGU7CisJCQlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hMKSAmJgorCQkJCShnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpICE9IDB4MTApKSB7CisJCQkJdmYtPm1tX2JveC5ibW11X2JveAk9IGh3LT5ibW11X2JveDsKKwkJCQl2Zi0+bW1fYm94LmJtbXVfaWR4CT0gSEVBREVSX0JVRkZFUl9JRFgoaHctPmJ1ZmZlcl93cmFwW3BpY19jb25maWctPnY0bF9idWZfaW5kZXhdKTsKKwkJCQl2Zi0+bW1fYm94Lm1tdV9ib3gJPSBody0+bW11X2JveDsKKwkJCQl2Zi0+bW1fYm94Lm1tdV9pZHgJPSBody0+YnVmZmVyX3dyYXBbcGljX2NvbmZpZy0+djRsX2J1Zl9pbmRleF07CisJCQl9CisJCX0KKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwkJaWYgKHZkZWNfZnJhbWVfYmFzZWQoaHdfdG9fdmRlYyhodykpKSB7CisJCQl2Zi0+cHRzID0gcGljX2NvbmZpZy0+cHRzOworCQkJdmYtPnB0c191czY0ID0gcGljX2NvbmZpZy0+cHRzNjQ7CisKKwkJCWlmIChody0+aXNfdXNlZF92NGwgJiYgdjRsX2JpdHN0cmVhbV9pZF9lbmFibGUpCisJCQkJdmYtPnRpbWVzdGFtcCA9IHBpY19jb25maWctPnRpbWVzdGFtcDsKKwkJCWVsc2UKKwkJCQl2Zi0+dGltZXN0YW1wID0gcGljX2NvbmZpZy0+cHRzNjQ7CisKKwkJCWlmICh2Zi0+cHRzICE9IDAgfHwgdmYtPnB0c191czY0ICE9IDApIHsKKwkJCQlwdHNfdmFsaWQgPSAxOworCQkJCXB0c191czY0X3ZhbGlkID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJcHRzX3ZhbGlkID0gMDsKKwkJCQlwdHNfdXM2NF92YWxpZCA9IDA7CisJCQl9CisJCX0gZWxzZQorI2VuZGlmCisJCWlmIChwdHNfbG9va3VwX29mZnNldF91czY0CisJCQkoUFRTX1RZUEVfVklERU8sIHN0cmVhbV9vZmZzZXQsICZ2Zi0+cHRzLAorCQkJJmZyYW1lX3NpemUsIDAsCisJCQkmdmYtPnB0c191czY0KSAhPSAwKSB7CisjaWZkZWYgREVCVUdfUFRTCisJCQlody0+cHRzX21pc3NlZCsrOworI2VuZGlmCisJCQl2Zi0+cHRzID0gMDsKKwkJCXZmLT5wdHNfdXM2NCA9IDA7CisJCQlwdHNfdmFsaWQgPSAwOworCQkJcHRzX3VzNjRfdmFsaWQgPSAwOworCQl9IGVsc2UgeworI2lmZGVmIERFQlVHX1BUUworCQkJaHctPnB0c19oaXQrKzsKKyNlbmRpZgorCQkJcHRzX3ZhbGlkID0gMTsKKwkJCXB0c191czY0X3ZhbGlkID0gMTsKKwkJfQorCisJCWlmIChody0+YXYxX2ZpcnN0X3B0c19yZWFkeSkgeworCQkJaWYgKGh3LT5mcmFtZV9kdXIgJiYgKCh2Zi0+cHRzID09IDApIHx8ICh2Zi0+cHRzX3VzNjQgPT0gMCkpKSB7CisJCQkJdmYtPnB0cyA9IGh3LT5sYXN0X3B0cyArIERVUjJQVFMoaHctPmZyYW1lX2R1cik7CisJCQkJdmYtPnB0c191czY0ID0gaHctPmxhc3RfcHRzX3VzNjQgKworCQkJCQkoRFVSMlBUUyhody0+ZnJhbWVfZHVyKSAqIDEwMCAvIDkpOworCQkJCXJlY2xhY19mbGFnID0gMTsKKwkJCX0KKworCQkJaWYgKCFjbG9zZV90byh2Zi0+cHRzLCAoaHctPmxhc3RfcHRzICsgRFVSMlBUUyhody0+ZnJhbWVfZHVyKSksIDEwMCkpIHsKKwkJCQl2Zi0+cHRzID0gaHctPmxhc3RfcHRzICsgRFVSMlBUUyhody0+ZnJhbWVfZHVyKTsKKwkJCQl2Zi0+cHRzX3VzNjQgPSBody0+bGFzdF9wdHNfdXM2NCArCisJCQkJCShEVVIyUFRTKGh3LT5mcmFtZV9kdXIpICogMTAwIC8gOSk7CisJCQkJcmVjbGFjX2ZsYWcgPSAyOworCQkJfQorCisJCQlpZiAoaHctPmlzX3VzZWRfdjRsKQorCQkJCXJlY2xhY19mbGFnID0gMDsKKworCQkJLyogdHJ5IGZpbmQgdGhlIGNsb3NlZCBwdHMgaW4gc2F2ZWQgcHRzIHBvb2wgKi8KKwkJCWlmIChyZWNsYWNfZmxhZykgeworCQkJCWZvciAoaSA9IDA7IGkgPCBGUkFNRV9CVUZGRVJTIC0gMTsgaSsrKSB7CisJCQkJCWlmICgoaHctPmZyYW1lX21vZGVfcHRzX3NhdmVbaV0gPiB2Zi0+cHRzKSAmJgorCQkJCQkJKGh3LT5mcmFtZV9tb2RlX3B0c19zYXZlW2kgKyAxXSA8IHZmLT5wdHMpKSB7CisJCQkJCQlpZiAoKGh3LT5mcmFtZV9tb2RlX3B0c19zYXZlW2ldIC0gdmYtPnB0cykgPgorCQkJCQkJCSh2Zi0+cHRzIC0gaHctPmZyYW1lX21vZGVfcHRzX3NhdmVbaSArIDFdKSkgeworCQkJCQkJCXZmLT5wdHMgPSBody0+ZnJhbWVfbW9kZV9wdHNfc2F2ZVtpICsgMV07CisJCQkJCQkJdmYtPnB0c191czY0ID0gaHctPmZyYW1lX21vZGVfcHRzNjRfc2F2ZVtpICsgMV07CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXZmLT5wdHMgPSBody0+ZnJhbWVfbW9kZV9wdHNfc2F2ZVtpXTsKKwkJCQkJCQl2Zi0+cHRzX3VzNjQgPSBody0+ZnJhbWVfbW9kZV9wdHM2NF9zYXZlW2ldOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKGkgPT0gKEZSQU1FX0JVRkZFUlMgLSAxKSkKKwkJCQkJaHctPmR1cl9yZWNhbGNfZmxhZyA9IDE7CisJCQl9CisJCX0gZWxzZSB7CisJCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19PVVRfUFRTLAorCQkJCSJmaXJzdCBwdHMgJWQgY2hhbmdlIHRvIHNhdmVbJWRdICVkXG4iLAorCQkJCXZmLT5wdHMsIGh3LT5maXJzdF9wdHNfaW5kZXggLSAxLAorCQkJCWh3LT5mcmFtZV9tb2RlX3B0c19zYXZlW2h3LT5maXJzdF9wdHNfaW5kZXggLSAxXSk7CisJCQl2Zi0+cHRzID0gaHctPmZyYW1lX21vZGVfcHRzX3NhdmVbaHctPmZpcnN0X3B0c19pbmRleCAtIDFdOworCQkJdmYtPnB0c191czY0ID0gaHctPmZyYW1lX21vZGVfcHRzNjRfc2F2ZVtody0+Zmlyc3RfcHRzX2luZGV4IC0gMV07CisJCX0KKwkJaHctPmxhc3RfcHRzID0gdmYtPnB0czsKKwkJaHctPmxhc3RfcHRzX3VzNjQgPSB2Zi0+cHRzX3VzNjQ7CisJCWh3LT5hdjFfZmlyc3RfcHRzX3JlYWR5ID0gdHJ1ZTsKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfT1VUX1BUUywKKwkJCSJhdjEgb3V0cHV0IHNsaWNlIHR5cGUgJWQsIGR1ciAlZCwgcHRzICVkLCBwdHM2NCAlbGxkLCB0czogJWxsdVxuIiwKKwkJCXBpY19jb25maWctPnNsaWNlX3R5cGUsIGh3LT5mcmFtZV9kdXIsIHZmLT5wdHMsIHZmLT5wdHNfdXM2NCwgdmYtPnRpbWVzdGFtcCk7CisKKwkJZmlsbF9mcmFtZV9pbmZvKGh3LCBwaWNfY29uZmlnLCBmcmFtZV9zaXplLCB2Zi0+cHRzKTsKKworCQl2Zi0+aW5kZXggPSAweGZmMDAgfCBwaWNfY29uZmlnLT52NGxfYnVmX2luZGV4OworCQlpZiAocGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDEwKSB7CisJCQkvKiBkb3VibGUgd3JpdGUgb25seSAqLworCQkJdmYtPmNvbXBCb2R5QWRkciA9IDA7CisJCQl2Zi0+Y29tcEhlYWRBZGRyID0gMDsKKyNpZmRlZiBBT01fQVYxX01NVV9EVworCQkJdmYtPmR3Qm9keUFkZHIgPSAwOworCQkJdmYtPmR3SGVhZEFkZHIgPSAwOworI2VuZGlmCisJCX0gZWxzZSB7CisJCQlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hMKSAmJgorCQkJCShnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpICE9IDB4MTApKSB7CisJCQkJdmYtPmNvbXBCb2R5QWRkciA9IDA7CisJCQkJdmYtPmNvbXBIZWFkQWRkciA9IHBpY19jb25maWctPmhlYWRlcl9hZHI7CisJCQkJaWYgKCgoZ2V0X2RlYnVnX2ZncygpICYgREVCVUdfRkdTX0JZUEFTUykgPT0gMCkKKwkJCQkJJiYgaHctPmFzc2l0X3Rhc2sudXNlX3NmZ3MpCisJCQkJCXZmLT5mZ3NfdGFibGVfYWRyID0gcGljX2NvbmZpZy0+c2Znc190YWJsZV9waHk7CisJCQkJZWxzZQorCQkJCQl2Zi0+ZmdzX3RhYmxlX2FkciA9IHBpY19jb25maWctPmZnc190YWJsZV9hZHI7CisJCQkJdmYtPmZnc192YWxpZCA9IGh3LT5mZ3NfdmFsaWQ7CisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKwkJCQl2Zi0+ZHdCb2R5QWRkciA9IDA7CisJCQkJdmYtPmR3SGVhZEFkZHIgPSAwOworCQkJCWlmIChwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MjApIHsKKwkJCQkJdTMyIG1vZGUgPSBwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4ZjsKKwkJCQkJaWYgKG1vZGUgPT0gNSB8fCBtb2RlID09IDMpCisJCQkJCQl2Zi0+ZHdIZWFkQWRkciA9IHBpY19jb25maWctPmhlYWRlcl9kd19hZHI7CisJCQkJCWVsc2UgaWYgKChtb2RlID09IDEgfHwgbW9kZSA9PSAyIHx8IG1vZGUgPT0gNCkKKwkJCQkJJiYgKGRlYnVnICYgQU9NX0RFQlVHX0RXX0RJU1BfTUFJTikgPT0gMCkgeworCQkJCQl2Zi0+Y29tcEhlYWRBZGRyID0gcGljX2NvbmZpZy0+aGVhZGVyX2R3X2FkcjsKKwkJCQkJdmYtPmZnc192YWxpZCA9IDA7CisJCQkJCWF2MV9wcmludChodywgQU9NX0RFQlVHX1ZGUkFNRSwKKwkJCQkJCSJVc2UgZHcgbW11IGZvciBkaXNwbGF5XG4iKTsKKwkJCQkJfQorCQkJCX0KKyNlbmRpZgorCQkJfSBlbHNlIHsKKwkJCQkvKnZmLT5jb21wQm9keUFkZHIgPSBwaWNfY29uZmlnLT5tY195X2FkcjsKKwkJCQkgKnZmLT5jb21wSGVhZEFkZHIgPSBwaWNfY29uZmlnLT5tY195X2FkciArCisJCQkJICpwaWNfY29uZmlnLT5jb21wX2JvZHlfc2l6ZTsgKi8KKwkJCQkvKmhlYWQgYWRyKi8KKwkJCX0KKwkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IDA7CisJCX0KKwkJaWYgKHBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlICYmCisJCQkocGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDIwKSA9PSAwKSB7CisJCQl2Zi0+dHlwZSA9IFZJRFRZUEVfUFJPR1JFU1NJVkUgfAorCQkJCVZJRFRZUEVfVklVX0ZJRUxEOworCQkJdmYtPnR5cGUgfD0gbnZfb3JkZXI7CisJCQlpZiAoKHBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlID09IDMgfHwKKwkJCQlwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSA9PSA1KSAmJgorCQkJCSghSVNfOEtfU0laRShwaWNfY29uZmlnLT55X2Nyb3Bfd2lkdGgsCisJCQkJcGljX2NvbmZpZy0+eV9jcm9wX2hlaWdodCkpKSB7CisJCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9DT01QUkVTUzsKKwkJCQlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hMKSAmJgorCQkJCQkoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSAhPSAweDEwKSkgeworCQkJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX1NDQVRURVI7CisJCQkJfQorCQkJfQorCQkJaWYgKGh3LT5pc191c2VkX3Y0bCAmJiBwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSAhPSAxNiAmJgorCQkJCSghSVNfOEtfU0laRShwaWNfY29uZmlnLT55X2Nyb3Bfd2lkdGgsCisJCQkJcGljX2NvbmZpZy0+eV9jcm9wX2hlaWdodCkpKSB7CisJCQkJaWYgKChnZXRfY3B1X21ham9yX2lkKCkgIT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1M0ICYmCisJCQkJCWdldF9jcHVfbWFqb3JfaWQoKSAhPSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfUzREKQorCQkJCQl8fCAoIWh3LT5maWxtX2dyYWluX3ByZXNlbnQpIHx8IChnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpICE9IDEpKSB7CisJCQkJCXZmLT50eXBlIHw9IFZJRFRZUEVfQ09NUFJFU1MgfCBWSURUWVBFX1NDQVRURVI7CisJCQkJfQorCQkJfQorI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwkJCWlmIChody0+bV9pbnNfZmxhZykgeworCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IC0xOworCQkJCXZmLT5wbGFuZV9udW0gPSAyOworCQkJCXZmLT5jYW52YXMwX2NvbmZpZ1swXSA9CisJCQkJCXBpY19jb25maWctPmNhbnZhc19jb25maWdbMF07CisJCQkJdmYtPmNhbnZhczBfY29uZmlnWzFdID0KKwkJCQkJcGljX2NvbmZpZy0+Y2FudmFzX2NvbmZpZ1sxXTsKKwkJCQl2Zi0+Y2FudmFzMV9jb25maWdbMF0gPQorCQkJCQlwaWNfY29uZmlnLT5jYW52YXNfY29uZmlnWzBdOworCQkJCXZmLT5jYW52YXMxX2NvbmZpZ1sxXSA9CisJCQkJCXBpY19jb25maWctPmNhbnZhc19jb25maWdbMV07CisKKwkJCX0gZWxzZQorI2VuZGlmCisJCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0KKwkJCQkJc3BlYzJjYW52YXMocGljX2NvbmZpZyk7CisJCX0gZWxzZSB7CisJCQl2Zi0+Y2FudmFzMEFkZHIgPSB2Zi0+Y2FudmFzMUFkZHIgPSAwOworCQkJdmYtPnR5cGUgPSBWSURUWVBFX0NPTVBSRVNTIHwgVklEVFlQRV9WSVVfRklFTEQ7CisJCQlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hMKSAmJgorCQkJCShnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpICE9IDB4MTApKSB7CisJCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9TQ0FUVEVSOworCQkJfQorCQl9CisKKwkJc3dpdGNoIChwaWNfY29uZmlnLT5iaXRfZGVwdGgpIHsKKwkJY2FzZSBBT01fQklUU184OgorCQkJdmYtPmJpdGRlcHRoID0gQklUREVQVEhfWTggfAorCQkJCUJJVERFUFRIX1U4IHwgQklUREVQVEhfVjg7CisJCQlicmVhazsKKwkJY2FzZSBBT01fQklUU18xMDoKKwkJY2FzZSBBT01fQklUU18xMjoKKwkJCXZmLT5iaXRkZXB0aCA9IEJJVERFUFRIX1kxMCB8CisJCQkJQklUREVQVEhfVTEwIHwgQklUREVQVEhfVjEwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl2Zi0+Yml0ZGVwdGggPSBCSVRERVBUSF9ZMTAgfAorCQkJCUJJVERFUFRIX1UxMCB8IEJJVERFUFRIX1YxMDsKKwkJCWJyZWFrOworCQl9CisJCWlmICgodmYtPnR5cGUgJiBWSURUWVBFX0NPTVBSRVNTKSA9PSAwKQorCQkJdmYtPmJpdGRlcHRoID0KKwkJCQlCSVRERVBUSF9ZOCB8IEJJVERFUFRIX1U4IHwgQklUREVQVEhfVjg7CisJCWlmIChwaWNfY29uZmlnLT5iaXRfZGVwdGggPT0gQU9NX0JJVFNfOCkKKwkJCXZmLT5iaXRkZXB0aCB8PSBCSVRERVBUSF9TQVZJTkdfTU9ERTsKKworCQkvKiBpZiAoKHZmLT53aWR0aCE9cGljX2NvbmZpZy0+d2lkdGgpfAorCQkgKgkodmYtPmhlaWdodCE9cGljX2NvbmZpZy0+aGVpZ2h0KSkKKwkJICovCisJCS8qIHByX2luZm8oImFhYTogJWQvJWQsICVkLyVkXG4iLAorCQkgICB2Zi0+d2lkdGgsdmYtPmhlaWdodCwgcGljX2NvbmZpZy0+d2lkdGgsCisJCQlwaWNfY29uZmlnLT5oZWlnaHQpOyAqLworCQl2Zi0+d2lkdGggPSBwaWNfY29uZmlnLT55X2Nyb3Bfd2lkdGggLworCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbygKKwkJCQlwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4Zik7CisJCXZmLT5oZWlnaHQgPSBwaWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0IC8KKwkJCWdldF9kb3VibGVfd3JpdGVfcmF0aW8oCisJCQkJcGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweGYpOworCQlpZiAoZm9yY2Vfd19oICE9IDApIHsKKwkJCXZmLT53aWR0aCA9IChmb3JjZV93X2ggPj4gMTYpICYgMHhmZmZmOworCQkJdmYtPmhlaWdodCA9IGZvcmNlX3dfaCAmIDB4ZmZmZjsKKwkJfQorCQlpZiAoKHBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlICYgMHgyMCkgJiYKKwkJCSgocGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweGYpID09IDIgfHwKKwkJCShwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4ZikgPT0gNCkpIHsKKwkJCXZmLT5jb21wV2lkdGggPSBwaWNfY29uZmlnLT55X2Nyb3Bfd2lkdGggLworCQkJCWdldF9kb3VibGVfd3JpdGVfcmF0aW8oCisJCQkJCXBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlICYgMHhmKTsKKwkJCXZmLT5jb21wSGVpZ2h0ID0gcGljX2NvbmZpZy0+eV9jcm9wX2hlaWdodCAvCisJCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbygKKwkJCQkJcGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweGYpOworCQl9IGVsc2UgeworCQkJdmYtPmNvbXBXaWR0aCA9IHBpY19jb25maWctPnlfY3JvcF93aWR0aDsKKwkJCXZmLT5jb21wSGVpZ2h0ID0gcGljX2NvbmZpZy0+eV9jcm9wX2hlaWdodDsKKwkJfQorCQlzZXRfZnJhbWVfaW5mbyhodywgdmYpOworCQlpZiAoZm9yY2VfZnBzICYgMHgxMDApIHsKKwkJCXUzMiByYXRlID0gZm9yY2VfZnBzICYgMHhmZjsKKworCQkJaWYgKHJhdGUpCisJCQkJdmYtPmR1cmF0aW9uID0gOTYwMDAvcmF0ZTsKKwkJCWVsc2UKKwkJCQl2Zi0+ZHVyYXRpb24gPSAwOworCQl9CisJCXVwZGF0ZV92Zl9tZW1oYW5kbGUoaHcsIHZmLCBwaWNfY29uZmlnKTsKKworCQlhdjFfaW5jX3ZmX3JlZihodywgcGljX2NvbmZpZy0+djRsX2J1Zl9pbmRleCk7CisKKwkJdmRlY192ZnJhbWVfcmVhZHkoaHdfdG9fdmRlYyhodyksIHZmKTsKKwkJaWYgKHBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlICYmCisJCQkoKHBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlICYgMHgyMCkgPT0gMCkgJiYKKwkJCShwaWNfY29uZmlnLT52NGxfYnVmX2luZGV4ICE9IHBpY19jb25maWctPkJVRl9pbmRleCkpIHsKKwkJCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpkc3RfcGljID0KKwkJCQkmaHctPmNvbW1vbi5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmc1twaWNfY29uZmlnLT52NGxfYnVmX2luZGV4XS5idWY7CisJCQlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqc3JjX3BpYyA9CisJCQkJJmh3LT5jb21tb24uYnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnNbcGljX2NvbmZpZy0+QlVGX2luZGV4XS5idWY7CisJCQlzdHJ1Y3QgdmRlY19nZTJkX2luZm8gZ2UyZF9pbmZvOworCisJCQlhdjFfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfVjRMX0RFVEFJTCwKKwkJCQkiZ2UyZCBjb3B5IHN0YXJ0IHY0bF9idWZfaW5kZXg6JWQgcmVwZWF0X2J1ZmZfaW5kZXg6JWRcbiIsCisJCQkJcGljX2NvbmZpZy0+djRsX2J1Zl9pbmRleCwKKwkJCQlwaWNfY29uZmlnLT5CVUZfaW5kZXgpOworCQkJZ2UyZF9pbmZvLmRzdF92ZiA9IHZmOworCQkJZ2UyZF9pbmZvLnNyY19jYW52YXMwQWRkciA9IGdlMmRfaW5mby5zcmNfY2FudmFzMUFkZHIgPSAwOworCQkJaWYgKGRzdF9waWMtPmRvdWJsZV93cml0ZV9tb2RlKSB7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQkJCWlmIChody0+bV9pbnNfZmxhZykgeworCQkJCQl2Zi0+Y2FudmFzMEFkZHIgPSB2Zi0+Y2FudmFzMUFkZHIgPSAtMTsKKwkJCQkJZ2UyZF9pbmZvLnNyY19jYW52YXMwQWRkciA9IGdlMmRfaW5mby5zcmNfY2FudmFzMUFkZHIgPSAtMTsKKwkJCQkJdmYtPnBsYW5lX251bSA9IDI7CisJCQkJCXZmLT5jYW52YXMwX2NvbmZpZ1swXSA9CisJCQkJCQlkc3RfcGljLT5jYW52YXNfY29uZmlnWzBdOworCQkJCQl2Zi0+Y2FudmFzMF9jb25maWdbMV0gPQorCQkJCQkJZHN0X3BpYy0+Y2FudmFzX2NvbmZpZ1sxXTsKKwkJCQkJdmYtPmNhbnZhczFfY29uZmlnWzBdID0KKwkJCQkJCWRzdF9waWMtPmNhbnZhc19jb25maWdbMF07CisJCQkJCXZmLT5jYW52YXMxX2NvbmZpZ1sxXSA9CisJCQkJCQlkc3RfcGljLT5jYW52YXNfY29uZmlnWzFdOworCQkJCQlnZTJkX2luZm8uc3JjX2NhbnZhczBfY29uZmlnWzBdID0KKwkJCQkJCXNyY19waWMtPmNhbnZhc19jb25maWdbMF07CisJCQkJCWdlMmRfaW5mby5zcmNfY2FudmFzMF9jb25maWdbMV0gPQorCQkJCQkJc3JjX3BpYy0+Y2FudmFzX2NvbmZpZ1sxXTsKKwkJCQkJZ2UyZF9pbmZvLnNyY19jYW52YXMxX2NvbmZpZ1swXSA9CisJCQkJCQlzcmNfcGljLT5jYW52YXNfY29uZmlnWzBdOworCQkJCQlnZTJkX2luZm8uc3JjX2NhbnZhczFfY29uZmlnWzFdID0KKwkJCQkJCXNyY19waWMtPmNhbnZhc19jb25maWdbMV07CisJCQkJfSBlbHNlCisjZW5kaWYKKwkJCQl7CisJCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9CisJCQkJCQlzcGVjMmNhbnZhcyhkc3RfcGljKTsKKwkJCQkJZ2UyZF9pbmZvLnNyY19jYW52YXMwQWRkciA9IGdlMmRfaW5mby5zcmNfY2FudmFzMUFkZHIgPQorCQkJCQkJc3BlYzJjYW52YXMoc3JjX3BpYyk7CisJCQkJfQorCQkJfQorCisJCQlpZiAoIWh3LT5nZTJkKSB7CisJCQkJaW50IG1vZGUgPSBudl9vcmRlciA9PSBWSURUWVBFX1ZJVV9OVjIxID8gR0UyRF9NT0RFX0NPTlZFUlRfTlYyMSA6IEdFMkRfTU9ERV9DT05WRVJUX05WMTI7CisJCQkJbW9kZSB8PSBHRTJEX01PREVfQ09OVkVSVF9MRTsKKwkJCQl2ZGVjX2dlMmRfaW5pdCgmaHctPmdlMmQsICBtb2RlKTsKKwkJCX0KKwkJCXZkZWNfZ2UyZF9jb3B5X2RhdGEoaHctPmdlMmQsICZnZTJkX2luZm8pOworCQkJYXYxX3ByaW50KGh3LCBQUklOVF9GTEFHX1Y0TF9ERVRBSUwsICJnZTJkIGNvcHkgZG9uZVxuIik7CisJCX0KKwkJZGVjb2Rlcl9kb19mcmFtZV9jaGVjayhod190b192ZGVjKGh3KSwgdmYpOworCQlrZmlmb19wdXQoJmh3LT5kaXNwbGF5X3EsIChjb25zdCBzdHJ1Y3QgdmZyYW1lX3MgKil2Zik7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5wdHNfbmFtZSwgdmYtPnRpbWVzdGFtcCk7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5uZXdfcV9uYW1lLCBrZmlmb19sZW4oJmh3LT5uZXdmcmFtZV9xKSk7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kaXNwX3FfbmFtZSwga2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKSk7CisKKwkJYXRvbWljX2FkZCgxLCAmaHctPnZmX3ByZV9jb3VudCk7CisJCS8qY291bnQgaW5mbyovCisJCWh3LT5ndnMtPmZyYW1lX2R1ciA9IGh3LT5mcmFtZV9kdXI7CisJCXZkZWNfY291bnRfaW5mbyhody0+Z3ZzLCAwLCBzdHJlYW1fb2Zmc2V0KTsKKwkJaHdfdG9fdmRlYyhodyktPnZkZWNfZnBzX2RldGVjKGh3X3RvX3ZkZWMoaHcpLT5pZCk7CisKKyNpZmRlZiBBVVhfREFUQV9DUkMKKwkJZGVjb2Rlcl9kb19hdXhfZGF0YV9jaGVjayhod190b192ZGVjKGh3KSwgcGljX2NvbmZpZy0+YXV4X2RhdGFfYnVmLAorCQkJcGljX2NvbmZpZy0+YXV4X2RhdGFfc2l6ZSk7CisjZW5kaWYKKworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19TRUlfREVUQUlMLCAiJXMgYXV4X2RhdGFfc2l6ZSA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCBwaWNfY29uZmlnLT5hdXhfZGF0YV9zaXplKTsKKworCQlpZiAoZGVidWcgJiBBVjFfREVCVUdfU0VJX0RFVEFJTCkgeworCQkJaW50IGkgPSAwOworCQkJUFJfSU5JVCgxMjgpOworCQkJZm9yIChpID0gMDsgaSA8IHBpY19jb25maWctPmF1eF9kYXRhX3NpemU7IGkrKykgeworCQkJCVBSX0ZJTEwoIiUwMnggIiwgcGljX2NvbmZpZy0+YXV4X2RhdGFfYnVmW2ldKTsKKwkJCQlpZiAoKChpICsgMSkgJiAweGYpID09IDApCisJCQkJCVBSX0lORk8oaHctPmluZGV4KTsKKwkJCX0KKwkJCVBSX0lORk8oaHctPmluZGV4KTsKKwkJfQorCisJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCWlmICgocGljX2NvbmZpZy0+YXV4X2RhdGFfc2l6ZSA9PSAwKSAmJgorCQkJCShwaWNfY29uZmlnLT5zbGljZV90eXBlID09IEtFWV9GUkFNRSkgJiYKKwkJCQkoYXRvbWljX3JlYWQoJmh3LT52Zl9wcmVfY291bnQpID09IDEpKSB7CisJCQkJaHctPm5vX25lZWRfYXV4X2RhdGEgPSB0cnVlOworCQkJfQorCisJCQlpZiAoaHctPm5vX25lZWRfYXV4X2RhdGEpIHsKKwkJCQl2NGwyX2N0eC0+YXV4X2luZm9zLmZyZWVfYnVmZmVyKHY0bDJfY3R4LCBEVl9UWVBFKTsKKwkJCQl2NGwyX2N0eC0+YXV4X2luZm9zLmZyZWVfb25lX3NlaV9idWZmZXIodjRsMl9jdHgsCisJCQkJCSZwaWNfY29uZmlnLT5hdXhfZGF0YV9idWYsCisJCQkJCSZwaWNfY29uZmlnLT5hdXhfZGF0YV9zaXplLAorCQkJCQlwaWNfY29uZmlnLT5jdHhfYnVmX2lkeCk7CisJCQl9IGVsc2UgeworCQkJCXY0bDJfY3R4LT5hdXhfaW5mb3MuYmluZF9kdl9idWZmZXIodjRsMl9jdHgsICZ2Zi0+c3JjX2ZtdC5jb21wX2J1ZiwKKwkJCQkJJnZmLT5zcmNfZm10Lm1kX2J1Zik7CisJCQl9CisKKwkJCXVwZGF0ZV92ZnJhbWVfc3JjX2ZtdCh2ZiwKKwkJCQlwaWNfY29uZmlnLT5hdXhfZGF0YV9idWYsCisJCQkJcGljX2NvbmZpZy0+YXV4X2RhdGFfc2l6ZSwKKwkJCQlmYWxzZSwgaHctPnByb3ZpZGVyX25hbWUsIE5VTEwpOworCQl9CisKKwkJYXYxX3VwZGF0ZV9ndnMoaHcsIHZmLCBwaWNfY29uZmlnKTsKKwkJbWVtY3B5KCZ0bXA0eCwgaHctPmd2cywgc2l6ZW9mKHN0cnVjdCB2ZGVjX2luZm8pKTsKKwkJdG1wNHguYml0X2RlcHRoX2x1bWEgPSBiaXRfZGVwdGhfbHVtYTsKKwkJdG1wNHguYml0X2RlcHRoX2Nocm9tYSA9IGJpdF9kZXB0aF9jaHJvbWE7CisJCXRtcDR4LmRvdWJsZV93cml0ZV9tb2RlID0gcGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGU7CisJCXZkZWNfZmlsbF92ZGVjX2ZyYW1lKGh3X3RvX3ZkZWMoaHcpLCAmaHctPnZmcmFtZV9xb3MsICZ0bXA0eCwgdmYsIHBpY19jb25maWctPmh3X2RlY29kZV90aW1lKTsKKwkJaWYgKHdpdGhvdXRfZGlzcGxheV9tb2RlID09IDApIHsKKwkJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCQlpZiAodjRsMl9jdHgtPmlzX3N0cmVhbV9vZmYpIHsKKwkJCQkJdmF2MV92Zl9wdXQodmF2MV92Zl9nZXQoaHcpLCBodyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJQVRSQUNFX0NPVU5URVIoIlZDX09VVF9ERUMtc3VibWl0IiwgZmItPmJ1Zl9pZHgpOworCQkJCQlmYi0+dGFzay0+c3VibWl0KGZiLT50YXNrLCBUQVNLX1RZUEVfREVDKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXZmX25vdGlmeV9yZWNlaXZlcihody0+cHJvdmlkZXJfbmFtZSwKKwkJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1ZGUkFNRV9SRUFEWSwgTlVMTCk7CisJCQl9CisJCX0gZWxzZQorCQkJdmF2MV92Zl9wdXQodmF2MV92Zl9nZXQoaHcpLCBodyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYXYxX3Jhd193cml0ZV9pbWFnZShBVjFEZWNvZGVyICpwYmksIFBJQ19CVUZGRVJfQ09ORklHICpzZCkKK3sKKwlzZC0+c3RyZWFtX29mZnNldCA9IHBiaS0+cHJlX3N0cmVhbV9vZmZzZXQ7CisJcHJlcGFyZV9kaXNwbGF5X2J1Zigoc3RydWN0IEFWMUhXX3MgKikocGJpLT5wcml2YXRlX2RhdGEpLCBzZCk7CisJcGJpLT5wcmVfc3RyZWFtX29mZnNldCA9IFJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpOworfQorCitzdGF0aWMgYm9vbCBpc19hdmFsaWFibGVfYnVmZmVyKHN0cnVjdCBBVjFIV19zICpodyk7CisKK3N0YXRpYyBpbnQgbm90aWZ5X3Y0bF9lb3Moc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzdHJ1Y3QgQVYxSFdfcyAqaHcgPSAoc3RydWN0IEFWMUhXX3MgKil2ZGVjLT5wcml2YXRlOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShody0+djRsMl9jdHgpOworCXN0cnVjdCB2ZnJhbWVfcyAqdmYgPSAmaHctPnZmcmFtZV9kdW1teTsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPSBOVUxMOworCWludCBpbmRleCA9IElOVkFMSURfSURYOworCXVsb25nIGV4cGlyZXM7CisKKwlpZiAoaHctPmVvcykgeworCQlleHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjAwMCk7CisJCXdoaWxlICghaXNfYXZhbGlhYmxlX2J1ZmZlcihodykpIHsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGV4cGlyZXMpKSB7CisJCQkJcHJfZXJyKCJbJWRdIEFWMSBpc24ndCBlbm91Z2ggYnVmZiBmb3Igbm90aWZ5IGVvcy5cbiIsIGN0eC0+aWQpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisKKwkJaW5kZXggPSB2NGxfZ2V0X2ZyZWVfZmIoaHcpOworCQlpZiAoSU5WQUxJRF9JRFggPT0gaW5kZXgpIHsKKwkJCXByX2VycigiWyVkXSBBVjEgRU9TIGdldCBmcmVlIGJ1ZmYgZmFpbC5cbiIsIGN0eC0+aWQpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlmYiA9IChzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqKQorCQkJaHctPm1fQlVGW2luZGV4XS52NGxfcmVmX2J1Zl9hZGRyOworCisJCXZmLT50eXBlCQl8PSBWSURUWVBFX1Y0TF9FT1M7CisJCXZmLT50aW1lc3RhbXAJCT0gVUxPTkdfTUFYOworCQl2Zi0+ZmxhZwkJPSBWRlJBTUVfRkxBR19FTVBUWV9GUkFNRV9WNEw7CisJCXZmLT52NGxfbWVtX2hhbmRsZQk9ICh1bG9uZylmYjsKKworCQl2ZGVjX3ZmcmFtZV9yZWFkeSh2ZGVjLCB2Zik7CisJCWtmaWZvX3B1dCgmaHctPmRpc3BsYXlfcSwgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKworCQlBVFJBQ0VfQ09VTlRFUigiVkNfT1VUX0RFQy1zdWJtaXQiLCBmYi0+YnVmX2lkeCk7CisJCWZiLT50YXNrLT5zdWJtaXQoZmItPnRhc2ssIFRBU0tfVFlQRV9ERUMpOworCisJCWF2MV9wcmludChodywgMCwgIlslZF0gQVYxIEVPUyBub3RpZnkuXG4iLCBjdHgtPmlkKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2V0X3JwbV9wYXJhbSh1bmlvbiBwYXJhbV91ICpwYXJhbXMpCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IGRhdGEzMjsKKworCWlmIChkZWJ1ZyAmIEFWMV9ERUJVR19CVUZNR1IpCisJCXByX2luZm8oImVudGVyICVzXHJcbiIsIF9fZnVuY19fKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKKwkJZG8geworCQkJZGF0YTMyID0gUkVBRF9WUkVHKFJQTV9DTURfUkVHKTsKKwkJCS8qcHJfaW5mbygiJXhcbiIsIGRhdGEzMik7Ki8KKwkJfSB3aGlsZSAoKGRhdGEzMiAmIDB4MTAwMDApID09IDApOworCQlwYXJhbXMtPmwuZGF0YVtpXSA9IGRhdGEzMiYweGZmZmY7CisJCS8qcHJfaW5mbygiJXhcbiIsIGRhdGEzMik7Ki8KKwkJV1JJVEVfVlJFRyhSUE1fQ01EX1JFRywgMCk7CisJfQorCWlmIChkZWJ1ZyAmIEFWMV9ERUJVR19CVUZNR1IpCisJCXByX2luZm8oImxlYXZlICVzXHJcbiIsIF9fZnVuY19fKTsKK30KKworI2lmZGVmIENIQU5HRV9SRU1PVkVECitzdGF0aWMgaW50IHJlY3ljbGVfbW11X2J1Zl90YWlsKHN0cnVjdCBBVjFIV19zICpodywKKwkJYm9vbCBjaGVja19kbWEpCit7CisJc3RydWN0IEFWMV9Db21tb25fcyAqY29uc3QgY20gPSAmaHctPmNvbW1vbjsKKworCWh3LT51c2VkXzRrX251bSA9CisJCVJFQURfVlJFRyhIRVZDX1NBT19NTVVfU1RBVFVTKSA+PiAxNjsKKworCWF2MV9wcmludChodywgMCwgInBpYyBpbmRleCAlZCBwYWdlX3N0YXJ0ICVkXG4iLAorCQljbS0+Y3VyX2ZiX2lkeF9tbXUsIGh3LT51c2VkXzRrX251bSk7CisKKwlpZiAoY2hlY2tfZG1hKQorCQloZXZjX21tdV9kbWFfY2hlY2soaHdfdG9fdmRlYyhodykpOworCisJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQlpbnQgaW5kZXggPSBjbS0+Y3VyX2ZiX2lkeF9tbXU7CisJCXN0cnVjdCBpbnRlcm5hbF9jb21wX2J1ZiAqaWJ1ZiA9CisJCQlpbmRleF90b19pY29tcF9idWYoaHcsIGluZGV4KTsKKworCQlkZWNvZGVyX21tdV9ib3hfZnJlZV9pZHhfdGFpbCgKKwkJCQlpYnVmLT5tbXVfYm94LAorCQkJCWlidWYtPmluZGV4LAorCQkJCWh3LT51c2VkXzRrX251bSk7CisJfSBlbHNlIHsKKwkJZGVjb2Rlcl9tbXVfYm94X2ZyZWVfaWR4X3RhaWwoCisJCQkJaHctPm1tdV9ib3gsCisJCQkJY20tPmN1cl9mYl9pZHhfbW11LAorCQkJCWh3LT51c2VkXzRrX251bSk7CisJfQorCisJY20tPmN1cl9mYl9pZHhfbW11ID0gSU5WQUxJRF9JRFg7CisJaHctPnVzZWRfNGtfbnVtID0gLTE7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWZkZWYgQ0hBTkdFX1JFTU9WRUQKK3N0YXRpYyB2b2lkIGF2MV9yZWN5Y2xlX21tdV9idWZfdGFpbChzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJc3RydWN0IEFWMV9Db21tb25fcyAqY29uc3QgY20gPSAmaHctPmNvbW1vbjsKKwlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSAmIDB4MTApCisJCXJldHVybjsKKworCWlmIChjbS0+Y3VyX2ZiX2lkeF9tbXUgIT0gSU5WQUxJRF9JRFgpIHsKKwkJcmVjeWNsZV9tbXVfYnVmX3RhaWwoaHcsCisJCQkoKGh3LT51c2VkXzRrX251bSA9PSAtMSkgJiYKKwkJCWh3LT5tX2luc19mbGFnKSA/IDEgOiAwKTsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgYXYxX3JlY3ljbGVfbW11X2J1ZihzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJc3RydWN0IEFWMV9Db21tb25fcyAqY29uc3QgY20gPSAmaHctPmNvbW1vbjsKKworCWlmIChody0+aXNfdXNlZF92NGwpCisJCXJldHVybjsKKworCWlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpICYgMHgxMCkKKwkJcmV0dXJuOworCWlmIChjbS0+Y3VyX2ZiX2lkeF9tbXUgIT0gSU5WQUxJRF9JRFgpIHsKKwkJZGVjb2Rlcl9tbXVfYm94X2ZyZWVfaWR4KGh3LT5tbXVfYm94LAorCQkJY20tPmN1cl9mYl9pZHhfbW11KTsKKworCQljbS0+Y3VyX2ZiX2lkeF9tbXUgPSBJTlZBTElEX0lEWDsKKwkJaHctPnVzZWRfNGtfbnVtID0gLTE7CisJfQorfQorCitzdGF0aWMgdm9pZCBkZWNfYWdhaW5fcHJvY2VzcyhzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJYW1oZXZjX3N0b3AoKTsKKwlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfQUdBSU47CisJaWYgKGh3LT5wcm9jZXNzX3N0YXRlID09CisJCVBST0NfU1RBVEVfREVDT0RFU0xJQ0UpIHsKKwkJaHctPnByb2Nlc3Nfc3RhdGUgPQorCQlQUk9DX1NUQVRFX1NFTkRBR0FJTjsKKwkJaWYgKChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTCkgJiYKKwkJCShnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpICE9IDB4MTApKSB7CisJCQlhdjFfcmVjeWNsZV9tbXVfYnVmKGh3KTsKKwkJfQorCX0KKwlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworfQorCitzdGF0aWMgdm9pZCByZWFkX2ZpbG1fZ3JhaW5fcmVnKHN0cnVjdCBBVjFIV19zICpodykKK3sKKyAgICBBVjFfQ09NTU9OICpjbSA9ICZody0+Y29tbW9uOworICAgIGludCBpOworICAgIGlmIChjbS0+Y3VyX2ZyYW1lID09IE5VTEwpIHsKKwkgICAgYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwgIiVzLCBjdXJfZnJhbWUgbm90IGV4aXN0ISEhXG4iLCBfX2Z1bmNfXyk7CisJICAgIHJldHVybjsKKwl9IGVsc2UKKwkgICAgYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwgIiVzXG4iLCBfX2Z1bmNfXyk7CisgICAgV1JJVEVfVlJFRyhIRVZDX0ZHU19JRFgsIDApOworICAgIGZvciAoaSA9IDA7IGkgPCBGSUxNX0dSQUlOX1JFR19TSVpFOyBpKyspIHsKKwkgICAgY20tPmN1cl9mcmFtZS0+ZmlsbV9ncmFpbl9yZWdbaV0gPSBSRUFEX1ZSRUcoSEVWQ19GR1NfREFUQSk7CisJfQorCWNtLT5jdXJfZnJhbWUtPmZpbG1fZ3JhaW5fcmVnX3ZhbGlkID0gMTsKKwljbS0+Y3VyX2ZyYW1lLT5maWxtX2dyYWluX2N0cmwgPSBSRUFEX1ZSRUcoSEVWQ19GR1NfQ1RSTCk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19maWxtX2dyYWluX3JlZyhzdHJ1Y3QgQVYxSFdfcyAqaHcsIGludCBmaWxtX2dyYWluX3BhcmFtc19yZWZfaWR4KQoreworCUFWMV9DT01NT04gKmNtID0gJmh3LT5jb21tb247CisJaW50IGk7CisJdW5zaWduZWQgY2hhciBmb3VuZCA9IDA7CisJUmVmQ250QnVmZmVyICpidWY7CisKKwlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkiICMjICVzIGZyb21lIHJlZmVyZW5jZSBpZHggJWRcbiIsCisJCV9fZnVuY19fLCBmaWxtX2dyYWluX3BhcmFtc19yZWZfaWR4KTsKKwlmb3IgKGkgPSAwOyBpIDwgSU5URVJfUkVGU19QRVJfRlJBTUU7ICsraSkgeworCQlpZiAoZmlsbV9ncmFpbl9wYXJhbXNfcmVmX2lkeCA9PSBjbS0+cmVtYXBwZWRfcmVmX2lkeFtpXSkgeworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCFmb3VuZCkgeworCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkJIiVzIEVycm9yLCBJbnZhbGlkIGZpbG0gZ3JhaW4gcmVmZXJlbmNlIGlkeCAlZFxuIiwKKwkJCV9fZnVuY19fLCBmaWxtX2dyYWluX3BhcmFtc19yZWZfaWR4KTsKKwkJcmV0dXJuOworCX0KKwlidWYgPSBjbS0+cmVmX2ZyYW1lX21hcFtmaWxtX2dyYWluX3BhcmFtc19yZWZfaWR4XTsKKworCWlmIChidWYtPmZpbG1fZ3JhaW5fcmVnX3ZhbGlkID09IDApIHsKKwkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJCSIlcyBFcnJvciwgZmlsbSBncmFpbiByZWdpc3RlciBkYXRhIGludmFsaWQgZm9yIHJlZmVyZW5jZSBpZHggJWRcbiIsCisJCQlfX2Z1bmNfXywgZmlsbV9ncmFpbl9wYXJhbXNfcmVmX2lkeCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoY20tPmN1cl9mcmFtZSA9PSBOVUxMKSB7CisJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCSIlcywgY3VyX2ZyYW1lIG5vdCBleGlzdCEhIVxuIiwgX19mdW5jX18pOworCX0KKwlXUklURV9WUkVHKEhFVkNfRkdTX0lEWCwgMCk7CisJZm9yIChpID0gMDsgaSA8IEZJTE1fR1JBSU5fUkVHX1NJWkU7IGkrKykgeworCQlXUklURV9WUkVHKEhFVkNfRkdTX0RBVEEsIGJ1Zi0+ZmlsbV9ncmFpbl9yZWdbaV0pOworCQlpZiAoY20tPmN1cl9mcmFtZSkKKwkJCWNtLT5jdXJfZnJhbWUtPmZpbG1fZ3JhaW5fcmVnW2ldID0gYnVmLT5maWxtX2dyYWluX3JlZ1tpXTsKKwl9CisJaWYgKGNtLT5jdXJfZnJhbWUpCisJCWNtLT5jdXJfZnJhbWUtPmZpbG1fZ3JhaW5fcmVnX3ZhbGlkID0gMTsKKwlXUklURV9WUkVHKEhFVkNfRkdTX0NUUkwsIFJFQURfVlJFRyhIRVZDX0ZHU19DVFJMKSB8IDEpOyAvLyBzZXQgZmlsX2dyYWluX3N0YXJ0CisJaWYgKGNtLT5jdXJfZnJhbWUpCisJCWNtLT5jdXJfZnJhbWUtPmZpbG1fZ3JhaW5fY3RybCA9IFJFQURfVlJFRyhIRVZDX0ZHU19DVFJMKTsKK30KKwordm9pZCBjb25maWdfbmV4dF9yZWZfaW5mb19odyhzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJaW50IGo7CisJQVYxX0NPTU1PTiAqY29uc3QgY20gPSAmaHctPmNvbW1vbjsKKworCWF2MV9zZXRfbmV4dF9yZWZfZnJhbWVfbWFwKGh3LT5wYmkpOworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NDMikKKwkJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9NRU1fV1JfQUREUiwgMHgxMWEwKTsKKwllbHNlCisJCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfTUVNX1dSX0FERFIsIDB4MTAwMCk7CisKKwlmb3IgKGogPSAwOyBqIDwgMTI7IGorKykgeworCQl1bnNpZ25lZCBpbnQgaW5mbyA9CisJCQlhdjFfZ2V0X25leHRfdXNlZF9yZWZfaW5mbyhjbSwgaik7CisKKwkJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9NRU1fUldfREFUQSwgaW5mbyk7CisJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCQkiY29uZmlnIG5leHQgcmVmIGluZm8gJWQgMHgleFxuIiwgaiwgaW5mbyk7CisJfQorfQorCisKKworI2lmZGVmIFBSSU5UX0hFVkNfREFUQV9QQVRIX01PTklUT1IKK3ZvaWQgZGF0YXBhdGhfbW9uaXRvcihzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJCSAgdWludDMyX3QgdG90YWxfY2xrX2NvdW50OworCQkgIHVpbnQzMl90IHBhdGhfdHJhbnNmZXJfY291bnQ7CisJCSAgdWludDMyX3QgcGF0aF93YWl0X2NvdW50OworICBmbG9hdCBwYXRoX3dhaXRfcmF0aW87CisgIGlmIChwYmktPmRlY29kZV9pZHggPiAxKSB7CisgICAgV1JJVEVfVlJFRyhIRVZDX1BBVEhfTU9OSVRPUl9DVFJMLCAwKTsgLy8gRGlzYWJibGUgbW9uaXRvciBhbmQgc2V0IHJkX2lkeCB0byAwCisgICAgdG90YWxfY2xrX2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUEFUSF9NT05JVE9SX0RBVEEpOworCisgICAgV1JJVEVfVlJFRyhIRVZDX1BBVEhfTU9OSVRPUl9DVFJMLCAoMTw8NCkpOyAvLyBEaXNhYmJsZSBtb25pdG9yIGFuZCBzZXQgcmRfaWR4IHRvIDAKKworLy8gcGFyc2VyIC0tPiBpcWl0CisgICAgcGF0aF90cmFuc2Zlcl9jb3VudCA9IFJFQURfVlJFRyhIRVZDX1BBVEhfTU9OSVRPUl9EQVRBKTsKKyAgICBwYXRoX3dhaXRfY291bnQgPSBSRUFEX1ZSRUcoSEVWQ19QQVRIX01PTklUT1JfREFUQSk7CisgICAgaWYgKHBhdGhfdHJhbnNmZXJfY291bnQgPT0gMCkgcGF0aF93YWl0X3JhdGlvID0gMC4wOworICAgIGVsc2UgcGF0aF93YWl0X3JhdGlvID0gKGZsb2F0KXBhdGhfd2FpdF9jb3VudC8oZmxvYXQpcGF0aF90cmFuc2Zlcl9jb3VudDsKKyAgICBwcmludGsoIltQJWQgSEVWQyBQQVRIXSBQYXJzZXIvSVFJVC9JUFAvREJMSy9PVy9ERFIvQ01EIFdBSVRJTkcgXCUgOiAlLjJmIiwKKyAgICAgICAgcGJpLT5kZWNvZGVfaWR4IC0gMiwgcGF0aF93YWl0X3JhdGlvKTsKKworLy8gaXFpdCAtLT4gaXBwCisgICAgcGF0aF90cmFuc2Zlcl9jb3VudCA9IFJFQURfVlJFRyhIRVZDX1BBVEhfTU9OSVRPUl9EQVRBKTsKKyAgICBwYXRoX3dhaXRfY291bnQgPSBSRUFEX1ZSRUcoSEVWQ19QQVRIX01PTklUT1JfREFUQSk7CisgICAgaWYgKHBhdGhfdHJhbnNmZXJfY291bnQgPT0gMCkgcGF0aF93YWl0X3JhdGlvID0gMC4wOworICAgIGVsc2UgcGF0aF93YWl0X3JhdGlvID0gKGZsb2F0KXBhdGhfd2FpdF9jb3VudC8oZmxvYXQpcGF0aF90cmFuc2Zlcl9jb3VudDsKKyAgICBwcmludGsoIiAlLjJmIiwgcGF0aF93YWl0X3JhdGlvKTsKKworLy8gZGJsayA8LS0gaXBwCisgICAgcGF0aF90cmFuc2Zlcl9jb3VudCA9IFJFQURfVlJFRyhIRVZDX1BBVEhfTU9OSVRPUl9EQVRBKTsKKyAgICBwYXRoX3dhaXRfY291bnQgPSBSRUFEX1ZSRUcoSEVWQ19QQVRIX01PTklUT1JfREFUQSk7CisgICAgaWYgKHBhdGhfdHJhbnNmZXJfY291bnQgPT0gMCkgcGF0aF93YWl0X3JhdGlvID0gMC4wOworICAgIGVsc2UgcGF0aF93YWl0X3JhdGlvID0gKGZsb2F0KXBhdGhfd2FpdF9jb3VudC8oZmxvYXQpcGF0aF90cmFuc2Zlcl9jb3VudDsKKyAgICBwcmludGsoIiAlLjJmIiwgcGF0aF93YWl0X3JhdGlvKTsKKworLy8gZGJsayAtLT4gb3cKKyAgICBwYXRoX3RyYW5zZmVyX2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUEFUSF9NT05JVE9SX0RBVEEpOworICAgIHBhdGhfd2FpdF9jb3VudCA9IFJFQURfVlJFRyhIRVZDX1BBVEhfTU9OSVRPUl9EQVRBKTsKKyAgICBpZiAocGF0aF90cmFuc2Zlcl9jb3VudCA9PSAwKSBwYXRoX3dhaXRfcmF0aW8gPSAwLjA7CisgICAgZWxzZSBwYXRoX3dhaXRfcmF0aW8gPSAoZmxvYXQpcGF0aF93YWl0X2NvdW50LyhmbG9hdClwYXRoX3RyYW5zZmVyX2NvdW50OworICAgIHByaW50aygiICUuMmYiLCBwYXRoX3dhaXRfcmF0aW8pOworCisvLyA8LS0+IEREUgorICAgIHBhdGhfdHJhbnNmZXJfY291bnQgPSBSRUFEX1ZSRUcoSEVWQ19QQVRIX01PTklUT1JfREFUQSk7CisgICAgcGF0aF93YWl0X2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUEFUSF9NT05JVE9SX0RBVEEpOworICAgIGlmIChwYXRoX3RyYW5zZmVyX2NvdW50ID09IDApIHBhdGhfd2FpdF9yYXRpbyA9IDAuMDsKKyAgICBlbHNlIHBhdGhfd2FpdF9yYXRpbyA9IChmbG9hdClwYXRoX3dhaXRfY291bnQvKGZsb2F0KXBhdGhfdHJhbnNmZXJfY291bnQ7CisgICAgcHJpbnRrKCIgJS4yZiIsIHBhdGhfd2FpdF9yYXRpbyk7CisKKy8vIENNRAorICAgIHBhdGhfdHJhbnNmZXJfY291bnQgPSBSRUFEX1ZSRUcoSEVWQ19QQVRIX01PTklUT1JfREFUQSk7CisgICAgcGF0aF93YWl0X2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUEFUSF9NT05JVE9SX0RBVEEpOworICAgIGlmIChwYXRoX3RyYW5zZmVyX2NvdW50ID09IDApIHBhdGhfd2FpdF9yYXRpbyA9IDAuMDsKKyAgICBlbHNlIHBhdGhfd2FpdF9yYXRpbyA9IChmbG9hdClwYXRoX3dhaXRfY291bnQvKGZsb2F0KXBhdGhfdHJhbnNmZXJfY291bnQ7CisgICAgcHJpbnRrKCIgJS4yZlxuIiwgcGF0aF93YWl0X3JhdGlvKTsKKyAgfQorfQorCisjZW5kaWYKKworI2lmZGVmIE1DUkNDX0VOQUJMRQorCitzdGF0aWMgaW50IG1jcmNjX2hpdF9yYXRlOworc3RhdGljIGludCBtY3JjY19ieXBhc3NfcmF0ZTsKKworI2RlZmluZSBDX1JlZ19XciAgV1JJVEVfVlJFRworc3RhdGljIHZvaWQgQ19SZWdfUmQodW5zaWduZWQgaW50IGFkciwgdW5zaWduZWQgaW50ICp2YWwpCit7CisJKnZhbCA9IFJFQURfVlJFRyhhZHIpOworfQorCitzdGF0aWMgdm9pZCBtY3JjY19wZXJmY291bnRfcmVzZXQoc3RydWN0IEFWMUhXX3MgKmh3KQoreworCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLAorCQkiW2NhY2hlX3V0aWwuY10gRW50ZXJlZCBtY3JjY19wZXJmY291bnRfcmVzZXQuLi5cbiIpOworCUNfUmVnX1dyKEhFVkNEX01DUkNDX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KTB4MSk7CisJQ19SZWdfV3IoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpMHgwKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB1bnNpZ25lZCByYXdfbWNyX2NudF90b3RhbF9wcmV2Oworc3RhdGljIHVuc2lnbmVkIGhpdF9tY3JfMF9jbnRfdG90YWxfcHJldjsKK3N0YXRpYyB1bnNpZ25lZCBoaXRfbWNyXzFfY250X3RvdGFsX3ByZXY7CitzdGF0aWMgdW5zaWduZWQgYnlwX21jcl9jbnRfbmNoY2Fudl90b3RhbF9wcmV2Oworc3RhdGljIHVuc2lnbmVkIGJ5cF9tY3JfY250X25jaG91dHdpbl90b3RhbF9wcmV2OworCitzdGF0aWMgdm9pZCBtY3JjY19nZXRfaGl0cmF0ZShzdHJ1Y3QgQVYxSFdfcyAqaHcsIHVuc2lnbmVkIHJlc2V0X3ByZSkKK3sKKwl1bnNpZ25lZCAgZGVsdGFfaGl0X21jcl8wX2NudDsKKwl1bnNpZ25lZCAgZGVsdGFfaGl0X21jcl8xX2NudDsKKwl1bnNpZ25lZCAgZGVsdGFfcmF3X21jcl9jbnQ7CisJdW5zaWduZWQgIGRlbHRhX21jcl9jbnRfbmNoY2FudjsKKwl1bnNpZ25lZCAgZGVsdGFfbWNyX2NudF9uY2hvdXR3aW47CisKKwl1bnNpZ25lZCAgIHRtcDsKKwl1bnNpZ25lZCAgIHJhd19tY3JfY250OworCXVuc2lnbmVkICAgaGl0X21jcl9jbnQ7CisJdW5zaWduZWQgICBieXBfbWNyX2NudF9uY2hvdXR3aW47CisJdW5zaWduZWQgICBieXBfbWNyX2NudF9uY2hjYW52OworCWludCAgICAgIGhpdHJhdGU7CisKKwlpZiAocmVzZXRfcHJlKSB7CisJCXJhd19tY3JfY250X3RvdGFsX3ByZXYgPSAwOworCQloaXRfbWNyXzBfY250X3RvdGFsX3ByZXYgPSAwOworCQloaXRfbWNyXzFfY250X3RvdGFsX3ByZXYgPSAwOworCQlieXBfbWNyX2NudF9uY2hjYW52X3RvdGFsX3ByZXYgPSAwOworCQlieXBfbWNyX2NudF9uY2hvdXR3aW5fdG90YWxfcHJldiA9IDA7CisJfQorCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLCAiW2NhY2hlX3V0aWwuY10gRW50ZXJlZCBtY3JjY19nZXRfaGl0cmF0ZS4uLlxuIik7CisJQ19SZWdfV3IoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4MDw8MSkpOworCUNfUmVnX1JkKEhFVkNEX01DUkNDX1BFUkZNT05fREFUQSwgJnJhd19tY3JfY250KTsKKwlDX1JlZ19XcihIRVZDRF9NQ1JDQ19QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHgxPDwxKSk7CisJQ19SZWdfUmQoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9EQVRBLCAmaGl0X21jcl9jbnQpOworCUNfUmVnX1dyKEhFVkNEX01DUkNDX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDI8PDEpKTsKKwlDX1JlZ19SZChIRVZDRF9NQ1JDQ19QRVJGTU9OX0RBVEEsICZieXBfbWNyX2NudF9uY2hvdXR3aW4pOworCUNfUmVnX1dyKEhFVkNEX01DUkNDX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDM8PDEpKTsKKwlDX1JlZ19SZChIRVZDRF9NQ1JDQ19QRVJGTU9OX0RBVEEsICZieXBfbWNyX2NudF9uY2hjYW52KTsKKworCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLCAicmF3X21jcl9jbnRfdG90YWw6ICVkXG4iLHJhd19tY3JfY250KTsKKwlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19DQUNIRV9ISVRfUkFURSwgImhpdF9tY3JfY250X3RvdGFsOiAlZFxuIixoaXRfbWNyX2NudCk7CisJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsICJieXBfbWNyX2NudF9uY2hvdXR3aW5fdG90YWw6ICVkXG4iLGJ5cF9tY3JfY250X25jaG91dHdpbik7CisJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsICJieXBfbWNyX2NudF9uY2hjYW52X3RvdGFsOiAlZFxuIixieXBfbWNyX2NudF9uY2hjYW52KTsKKworCWRlbHRhX3Jhd19tY3JfY250ID0gcmF3X21jcl9jbnQgLSByYXdfbWNyX2NudF90b3RhbF9wcmV2OworCWRlbHRhX21jcl9jbnRfbmNoY2FudiA9IGJ5cF9tY3JfY250X25jaGNhbnYgLSBieXBfbWNyX2NudF9uY2hjYW52X3RvdGFsX3ByZXY7CisJZGVsdGFfbWNyX2NudF9uY2hvdXR3aW4gPSBieXBfbWNyX2NudF9uY2hvdXR3aW4gLSBieXBfbWNyX2NudF9uY2hvdXR3aW5fdG90YWxfcHJldjsKKwlyYXdfbWNyX2NudF90b3RhbF9wcmV2ID0gcmF3X21jcl9jbnQ7CisJYnlwX21jcl9jbnRfbmNoY2Fudl90b3RhbF9wcmV2ID0gYnlwX21jcl9jbnRfbmNoY2FudjsKKwlieXBfbWNyX2NudF9uY2hvdXR3aW5fdG90YWxfcHJldiA9IGJ5cF9tY3JfY250X25jaG91dHdpbjsKKworCUNfUmVnX1dyKEhFVkNEX01DUkNDX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDQ8PDEpKTsKKwlDX1JlZ19SZChIRVZDRF9NQ1JDQ19QRVJGTU9OX0RBVEEsICZ0bXApOworCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLCAibWlzc19tY3JfMF9jbnRfdG90YWw6ICVkXG4iLHRtcCk7CisJQ19SZWdfV3IoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4NTw8MSkpOworCUNfUmVnX1JkKEhFVkNEX01DUkNDX1BFUkZNT05fREFUQSwgJnRtcCk7CisJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsICJtaXNzX21jcl8xX2NudF90b3RhbDogJWRcbiIsdG1wKTsKKwlDX1JlZ19XcihIRVZDRF9NQ1JDQ19QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHg2PDwxKSk7CisJQ19SZWdfUmQoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9EQVRBLCAmdG1wKTsKKwlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19DQUNIRV9ISVRfUkFURSwgImhpdF9tY3JfMF9jbnRfdG90YWw6ICVkXG4iLHRtcCk7CisJZGVsdGFfaGl0X21jcl8wX2NudCA9IHRtcCAtIGhpdF9tY3JfMF9jbnRfdG90YWxfcHJldjsKKwloaXRfbWNyXzBfY250X3RvdGFsX3ByZXYgPSB0bXA7CisJQ19SZWdfV3IoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4Nzw8MSkpOworCUNfUmVnX1JkKEhFVkNEX01DUkNDX1BFUkZNT05fREFUQSwgJnRtcCk7CisJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsICJoaXRfbWNyXzFfY250X3RvdGFsOiAlZFxuIix0bXApOworCWRlbHRhX2hpdF9tY3JfMV9jbnQgPSB0bXAgLSBoaXRfbWNyXzFfY250X3RvdGFsX3ByZXY7CisJaGl0X21jcl8xX2NudF90b3RhbF9wcmV2ID0gdG1wOworCisJaWYgKCBkZWx0YV9yYXdfbWNyX2NudCAhPSAwICkgeworCQloaXRyYXRlID0gMTAwICogZGVsdGFfaGl0X21jcl8wX2NudC8gZGVsdGFfcmF3X21jcl9jbnQ7CisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLCAiQ0FOVjBfSElUX1JBVEUgOiAlZFxuIiwgaGl0cmF0ZSk7CisJCWhpdHJhdGUgPSAxMDAgKiBkZWx0YV9oaXRfbWNyXzFfY250L2RlbHRhX3Jhd19tY3JfY250OworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19DQUNIRV9ISVRfUkFURSwgIkNBTlYxX0hJVF9SQVRFIDogJWRcbiIsIGhpdHJhdGUpOworCQloaXRyYXRlID0gMTAwICogZGVsdGFfbWNyX2NudF9uY2hjYW52L2RlbHRhX3Jhd19tY3JfY250OworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19DQUNIRV9ISVRfUkFURSwgIk5PTkNBQ0hfQ0FOVl9CWVBfUkFURSA6ICVkXG4iLCBoaXRyYXRlKTsKKwkJaGl0cmF0ZSA9IDEwMCAqIGRlbHRhX21jcl9jbnRfbmNob3V0d2luL2RlbHRhX3Jhd19tY3JfY250OworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19DQUNIRV9ISVRfUkFURSwgIkNBQ0hFX09VVFdJTl9CWVBfUkFURSA6ICVkXG4iLCBoaXRyYXRlKTsKKwl9CisKKwlpZiAocmF3X21jcl9jbnQgIT0gMCkKKwl7CisJCWhpdHJhdGUgPSAxMDAqaGl0X21jcl9jbnQvcmF3X21jcl9jbnQ7CisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLCAiTUNSQ0NfSElUX1JBVEUgOiAlZFxuIiwgaGl0cmF0ZSk7CisJCWhpdHJhdGUgPSAxMDAqKGJ5cF9tY3JfY250X25jaG91dHdpbiArIGJ5cF9tY3JfY250X25jaGNhbnYpL3Jhd19tY3JfY250OworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19DQUNIRV9ISVRfUkFURSwgIk1DUkNDX0JZUF9SQVRFIDogJWRcbiIsIGhpdHJhdGUpOworCX0gZWxzZSB7CisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLCAiTUNSQ0NfSElUX1JBVEUgOiBuYVxuIik7CisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLCAiTUNSQ0NfQllQX1JBVEUgOiBuYVxuIik7CisJfQorCW1jcmNjX2hpdF9yYXRlID0gMTAwKmhpdF9tY3JfY250L3Jhd19tY3JfY250OworCW1jcmNjX2J5cGFzc19yYXRlID0gMTAwKihieXBfbWNyX2NudF9uY2hvdXR3aW4gKyBieXBfbWNyX2NudF9uY2hjYW52KS9yYXdfbWNyX2NudDsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgZGVjb21wX3BlcmZjb3VudF9yZXNldChzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsICJbY2FjaGVfdXRpbC5jXSBFbnRlcmVkIGRlY29tcF9wZXJmY291bnRfcmVzZXQuLi5cbiIpOworCUNfUmVnX1dyKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpMHgxKTsKKwlDX1JlZ19XcihIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KTB4MCk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBkZWNvbXBfZ2V0X2hpdHJhdGUoc3RydWN0IEFWMUhXX3MgKmh3KQoreworCXVuc2lnbmVkICAgcmF3X21jcl9jbnQ7CisJdW5zaWduZWQgICBoaXRfbWNyX2NudDsKKwlpbnQgIGhpdHJhdGU7CisKKwlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19DQUNIRV9ISVRfUkFURSwgIltjYWNoZV91dGlsLmNdIEVudGVyZWQgZGVjb21wX2dldF9oaXRyYXRlLi4uXG4iKTsKKwlDX1JlZ19XcihIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDA8PDEpKTsKKwlDX1JlZ19SZChIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fREFUQSwgJnJhd19tY3JfY250KTsKKwlDX1JlZ19XcihIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDE8PDEpKTsKKwlDX1JlZ19SZChIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fREFUQSwgJmhpdF9tY3JfY250KTsKKworCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLCAiaGNhY2hlX3Jhd19jbnRfdG90YWw6ICVkXG4iLHJhd19tY3JfY250KTsKKwlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19DQUNIRV9ISVRfUkFURSwgImhjYWNoZV9oaXRfY250X3RvdGFsOiAlZFxuIixoaXRfbWNyX2NudCk7CisKKwlpZiAoIHJhd19tY3JfY250ICE9IDAgKSB7CisJCWhpdHJhdGUgPSAxMDAqaGl0X21jcl9jbnQvcmF3X21jcl9jbnQ7CisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLCAiREVDT01QX0hDQUNIRV9ISVRfUkFURSA6ICUuMmZcJVxuIiwgaGl0cmF0ZSk7CisJfSBlbHNlIHsKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsICJERUNPTVBfSENBQ0hFX0hJVF9SQVRFIDogbmFcbiIpOworCX0KKwlDX1JlZ19XcihIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDI8PDEpKTsKKwlDX1JlZ19SZChIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fREFUQSwgJnJhd19tY3JfY250KTsKKwlDX1JlZ19XcihIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDM8PDEpKTsKKwlDX1JlZ19SZChIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fREFUQSwgJmhpdF9tY3JfY250KTsKKworCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLCAiZGNhY2hlX3Jhd19jbnRfdG90YWw6ICVkXG4iLHJhd19tY3JfY250KTsKKwlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19DQUNIRV9ISVRfUkFURSwgImRjYWNoZV9oaXRfY250X3RvdGFsOiAlZFxuIixoaXRfbWNyX2NudCk7CisKKwlpZiAoIHJhd19tY3JfY250ICE9IDAgKSB7CisJCWhpdHJhdGUgPSAxMDAqaGl0X21jcl9jbnQvcmF3X21jcl9jbnQ7CisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLCAiREVDT01QX0RDQUNIRV9ISVRfUkFURSA6ICVkXG4iLCBoaXRyYXRlKTsKKworCQkvL2hpdHJhdGUgPSAoKGZsb2F0KWhpdF9tY3JfY250LyhmbG9hdClyYXdfbWNyX2NudCk7CisJCS8vaGl0cmF0ZSA9IChtY3JjY19oaXRfcmF0ZSArIChtY3JjY19ieXBhc3NfcmF0ZSAqIGhpdHJhdGUpKSoxMDA7CisJCWhpdHJhdGUgPSBtY3JjY19oaXRfcmF0ZSArIChtY3JjY19ieXBhc3NfcmF0ZSAqIGhpdF9tY3JfY250L3Jhd19tY3JfY250KTsKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsICJNQ1JDQ19ERUNPTVBfRENBQ0hFX0VGRkVDVElWRV9ISVRfUkFURSA6ICVkXG4iLCBoaXRyYXRlKTsKKworCX0gZWxzZSB7CisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLCAiREVDT01QX0RDQUNIRV9ISVRfUkFURSA6IG5hXG4iKTsKKwl9CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGRlY29tcF9nZXRfY29tcHJhdGUoc3RydWN0IEFWMUhXX3MgKmh3KQoreworCXVuc2lnbmVkICAgcmF3X3Vjb21wX2NudDsKKwl1bnNpZ25lZCAgIGZhc3RfY29tcF9jbnQ7CisJdW5zaWduZWQgICBzbG93X2NvbXBfY250OworCWludCAgICAgIGNvbXByYXRlOworCisJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsICJbY2FjaGVfdXRpbC5jXSBFbnRlcmVkIGRlY29tcF9nZXRfY29tcHJhdGUuLi5cbiIpOworCUNfUmVnX1dyKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4NDw8MSkpOworCUNfUmVnX1JkKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9EQVRBLCAmZmFzdF9jb21wX2NudCk7CisJQ19SZWdfV3IoSEVWQ0RfTVBQX0RFQ09NUF9QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHg1PDwxKSk7CisJQ19SZWdfUmQoSEVWQ0RfTVBQX0RFQ09NUF9QRVJGTU9OX0RBVEEsICZzbG93X2NvbXBfY250KTsKKwlDX1JlZ19XcihIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDY8PDEpKTsKKwlDX1JlZ19SZChIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fREFUQSwgJnJhd191Y29tcF9jbnQpOworCisJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsICJkZWNvbXBfZmFzdF9jb21wX3RvdGFsOiAlZFxuIixmYXN0X2NvbXBfY250KTsKKwlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19DQUNIRV9ISVRfUkFURSwgImRlY29tcF9zbG93X2NvbXBfdG90YWw6ICVkXG4iLHNsb3dfY29tcF9jbnQpOworCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLCAiZGVjb21wX3Jhd191bmNvbXBfdG90YWw6ICVkXG4iLHJhd191Y29tcF9jbnQpOworCisJaWYgKCByYXdfdWNvbXBfY250ICE9IDAgKQorCXsKKwkJY29tcHJhdGUgPSAxMDAqKGZhc3RfY29tcF9jbnQgKyBzbG93X2NvbXBfY250KS9yYXdfdWNvbXBfY250OworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19DQUNIRV9ISVRfUkFURSwgIkRFQ09NUF9DT01QX1JBVElPIDogJWRcbiIsIGNvbXByYXRlKTsKKwl9IGVsc2UKKwl7CisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLCAiREVDT01QX0NPTVBfUkFUSU8gOiBuYVxuIik7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgZHVtcF9oaXRfcmF0ZShzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJaWYgKGRlYnVnICYgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFKSB7CisJCW1jcmNjX2dldF9oaXRyYXRlKGh3LCBody0+bV9pbnNfZmxhZyk7CisJCWRlY29tcF9nZXRfaGl0cmF0ZShodyk7CisJCWRlY29tcF9nZXRfY29tcHJhdGUoaHcpOworCX0KK30KKworc3RhdGljICB1aW50MzJfdCAgbWNyY2NfZ2V0X2Fic19mcmFtZV9kaXN0YW5jZShzdHJ1Y3QgQVYxSFdfcyAqaHcsIHVpbnQzMl90IHJlZmlkLCB1aW50MzJfdCByZWZfb2hpbnQsIHVpbnQzMl90IGN1cnJfb2hpbnQsIHVpbnQzMl90IG9oaW50X2JpdHNfbWluMSkKK3sKKwlpbnQzMl90IGRpZmZfb2hpbnQwOworCWludDMyX3QgZGlmZl9vaGludDE7CisJdWludDMyX3QgYWJzX2Rpc3Q7CisJdWludDMyX3QgbTsKKwl1aW50MzJfdCBtX21pbjE7CisKKwlkaWZmX29oaW50MCA9IHJlZl9vaGludCAtIGN1cnJfb2hpbnQ7CisKKwltID0gKDEgPDwgb2hpbnRfYml0c19taW4xKTsKKwltX21pbjEgPSBtIC0xOworCisJZGlmZl9vaGludDEgPSAoZGlmZl9vaGludDAgJiBtX21pbjEgKSAtIChkaWZmX29oaW50MCAmIG0pOworCisJYWJzX2Rpc3QgPSAoZGlmZl9vaGludDEgPCAwKSA/IC1kaWZmX29oaW50MSA6IGRpZmZfb2hpbnQxOworCisJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsCisJCSJbY2FjaGVfdXRpbC5jXSByZWZpZDolMHggcmVmX29yZGVyaGludDolMHggY3Vycl9vcmRlcmhpbnQ6JTB4IG9yZGVyaGludF9iaXRzX21pbjE6JTB4IGFiZF9kaXN0OiUweFxuIiwKKwkJcmVmaWQsIHJlZl9vaGludCwgY3Vycl9vaGludCwgb2hpbnRfYml0c19taW4xLGFic19kaXN0KTsKKworCXJldHVybiAgYWJzX2Rpc3Q7Cit9CisKK3N0YXRpYyB2b2lkICBjb25maWdfbWNyY2NfYXhpX2h3X25lYXJlc3RfcmVmKHN0cnVjdCBBVjFIV19zICpodykKK3sKKwl1aW50MzJfdCBpOworCXVpbnQzMl90IHJkYXRhMzI7CisJdWludDMyX3QgZGlzdF9hcnJheVs4XTsKKwl1aW50MzJfdCByZWZjYW52YXNfYXJyYXlbMl07CisJdWludDMyX3Qgb3JkZXJoaW50X2JpdHM7CisJdW5zaWduZWQgY2hhciBpc19pbnRlcjsKKwlBVjFfQ09NTU9OICpjbSA9ICZody0+Y29tbW9uOworCVBJQ19CVUZGRVJfQ09ORklHICpjdXJyX3BpY19jb25maWc7CisJaW50MzJfdCAgY3Vycl9vcmRlcmhpbnQ7CisJaW50IGNpbmRleDAgPSBMQVNUX0ZSQU1FOworCXVpbnQzMl90ICAgIGxhc3RfcmVmX29yZGVyaGludF9kaXN0ID0gMTAyMzsgLy8gbGFyZ2UgZGlzdGFuY2UKKwl1aW50MzJfdCAgICBjdXJyX3JlZl9vcmRlcmhpbnRfZGlzdCA9IDEwMjM7IC8vIGxhcmdlIGRpc3RhbmNlCisJaW50IGNpbmRleDE7CisJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQ0FDSEVfSElUX1JBVEUsCisJCSJbdGVzdC5jXSAjIyMjIGNvbmZpZ19tY3JjY19heGlfaHcgIyMjI1xuIik7CisKKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDEsIDB4Mik7IC8vIHJlc2V0IG1jcmNjCisKKwlpc19pbnRlciA9IGF2MV9mcmFtZV9pc19pbnRlcigmaHctPmNvbW1vbik7IC8vKChwYmktPmNvbW1vbi5mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkgJiYgKCFwYmktPmNvbW1vbi5pbnRyYV9vbmx5KSkgPyAxIDogMDsKKwlpZiAoICFpc19pbnRlciApIHsgLy8gSS1QSUMKKwkJLy9XUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDEsIDB4MSk7IC8vIHJlbW92ZSByZXNldCAtLSBkaXNhYmxlcyBjbG9jaworCQlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDIsIDB4ZmZmZmZmZmYpOyAvLyBSZXBsYWNlIHdpdGggY3VycmVudC1mcmFtZSBjYW52YXMKKwkJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwzLCAweGZmZmZmZmZmKTsgLy8KKwkJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwxLCAweGZmMCk7IC8vIGVuYWJsZSBtY3JjYyBwcm9ncmVzc2l2ZS1tb2RlCisJCXJldHVybjsKKwl9CisKKyNpZiAwCisJLy9wcmludGsoImJlZm9yZSBjYWxsIG1jcmNjX2dldF9oaXRyYXRlXHJcbiIpOworCW1jcmNjX2dldF9oaXRyYXRlKGh3KTsKKwlkZWNvbXBfZ2V0X2hpdHJhdGUoaHcpOworCWRlY29tcF9nZXRfY29tcHJhdGUoaHcpOworI2VuZGlmCisKKwkvLyBGaW5kIGFic29sdXRlIG9yZGVyaGludCBkZWx0YQorCWN1cnJfcGljX2NvbmZpZyA9ICAmY20tPmN1cl9mcmFtZS0+YnVmOworCWN1cnJfb3JkZXJoaW50ID0gY3Vycl9waWNfY29uZmlnLT5vcmRlcl9oaW50OworCW9yZGVyaGludF9iaXRzID0gY20tPnNlcV9wYXJhbXMub3JkZXJfaGludF9pbmZvLm9yZGVyX2hpbnRfYml0c19taW51c18xOworCWZvciAoaSA9IExBU1RfRlJBTUU7IGkgPD0gQUxUUkVGX0ZSQU1FOyBpKyspIHsKKwkJaW50MzJfdCAgcmVmX29yZGVyaGludCA9IDA7CisJCVBJQ19CVUZGRVJfQ09ORklHICpwaWNfY29uZmlnOworCQkvL2ludDMyX3QgIHRtcDsKKwkJcGljX2NvbmZpZyA9IGF2MV9nZXRfcmVmX2ZyYW1lX3NwZWNfYnVmKGNtLGkpOworCQlpZiAocGljX2NvbmZpZykKKwkJCXJlZl9vcmRlcmhpbnQgPSBwaWNfY29uZmlnLT5vcmRlcl9oaW50OworCQkvL3RtcCA9IGN1cnJfb3JkZXJoaW50IC0gcmVmX29yZGVyaGludDsKKwkJLy9kaXN0X2FycmF5W2ldID0gICh0bXAgPCAwKSA/IC10bXAgOiB0bXA7CisJCWRpc3RfYXJyYXlbaV0gPSAgbWNyY2NfZ2V0X2Fic19mcmFtZV9kaXN0YW5jZShodywgaSxyZWZfb3JkZXJoaW50LCBjdXJyX29yZGVyaGludCwgb3JkZXJoaW50X2JpdHMpOworCX0KKwkvLyBHZXQgc21hbGxlc3Qgb3JkZXJoaW50IGRpc3RhbmNlIHJlZmlkCisJZm9yIChpID0gTEFTVF9GUkFNRTsgaSA8PSBBTFRSRUZfRlJBTUU7IGkrKykgeworCQlQSUNfQlVGRkVSX0NPTkZJRyAqcGljX2NvbmZpZzsKKwkJcGljX2NvbmZpZyA9IGF2MV9nZXRfcmVmX2ZyYW1lX3NwZWNfYnVmKGNtLCBpKTsKKwkJY3Vycl9yZWZfb3JkZXJoaW50X2Rpc3QgPSBkaXN0X2FycmF5W2ldOworCQlpZiAoIGN1cnJfcmVmX29yZGVyaGludF9kaXN0IDwgbGFzdF9yZWZfb3JkZXJoaW50X2Rpc3QpIHsKKwkJCWNpbmRleDAgPSBpOworCQkJbGFzdF9yZWZfb3JkZXJoaW50X2Rpc3QgPSBjdXJyX3JlZl9vcmRlcmhpbnRfZGlzdDsKKwkJfQorCX0KKwlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0FDQ0NPTkZJR19BRERSLCAoY2luZGV4MCA8PCA4KSB8ICgxPDwxKSB8IDApOworCXJlZmNhbnZhc19hcnJheVswXSA9IFJFQURfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIpICYgMHhmZmZmOworCisJbGFzdF9yZWZfb3JkZXJoaW50X2Rpc3QgPSAxMDIzOyAvLyBsYXJnZSBkaXN0YW5jZQorCWN1cnJfcmVmX29yZGVyaGludF9kaXN0ID0gMTAyMzsgLy8gbGFyZ2UgZGlzdGFuY2UKKwkvLyBHZXQgMm5kIHNtYWxsZXN0IG9yZGVyaGludCBkaXN0YW5jZSByZWZpZAorCWNpbmRleDEgPSBMQVNUX0ZSQU1FOworCWZvciAoaSA9IExBU1RfRlJBTUU7IGkgPD0gQUxUUkVGX0ZSQU1FOyBpKyspIHsKKwkJUElDX0JVRkZFUl9DT05GSUcgKnBpY19jb25maWc7CisJCXBpY19jb25maWcgPSBhdjFfZ2V0X3JlZl9mcmFtZV9zcGVjX2J1ZihjbSwgaSk7CisJCWN1cnJfcmVmX29yZGVyaGludF9kaXN0ID0gZGlzdF9hcnJheVtpXTsKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwgKGkgPDwgOCkgfCAoMTw8MSkgfCAwKTsKKwkJcmVmY2FudmFzX2FycmF5WzFdID0gUkVBRF9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUikgJiAweGZmZmY7CisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLCAiW2NhY2hlX3V0aWwuY10gY3Vycl9yZWZfb3JkZXJoaW50X2Rpc3Q6JXggbGFzdF9yZWZfb3JkZXJoaW50X2Rpc3Q6JXggcmVmY2FudmFzX2FycmF5WzBdOiV4IHJlZmNhbnZhc19hcnJheVsxXToleFxuIiwKKwkJY3Vycl9yZWZfb3JkZXJoaW50X2Rpc3QsIGxhc3RfcmVmX29yZGVyaGludF9kaXN0LCByZWZjYW52YXNfYXJyYXlbMF0scmVmY2FudmFzX2FycmF5WzFdKTsKKwkJaWYgKChjdXJyX3JlZl9vcmRlcmhpbnRfZGlzdCA8IGxhc3RfcmVmX29yZGVyaGludF9kaXN0KSAmJiAocmVmY2FudmFzX2FycmF5WzBdICE9IHJlZmNhbnZhc19hcnJheVsxXSkpIHsKKwkJCWNpbmRleDEgPSBpOworCQkJbGFzdF9yZWZfb3JkZXJoaW50X2Rpc3QgPSBjdXJyX3JlZl9vcmRlcmhpbnRfZGlzdDsKKwkJfQorCX0KKworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfQUNDQ09ORklHX0FERFIsIChjaW5kZXgwIDw8IDgpIHwgKDE8PDEpIHwgMCk7CisJcmVmY2FudmFzX2FycmF5WzBdID0gUkVBRF9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUik7CisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwgKGNpbmRleDEgPDwgOCkgfCAoMTw8MSkgfCAwKTsKKwlyZWZjYW52YXNfYXJyYXlbMV0gPSBSRUFEX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSKTsKKworCWF2MV9wcmludChodywgQVYxX0RFQlVHX0NBQ0hFX0hJVF9SQVRFLCAiW2NhY2hlX3V0aWwuY10gcmVmY2FudmFzX2FycmF5WzBdKGluZGV4ICVkKToleCByZWZjYW52YXNfYXJyYXlbMV0oaW5kZXggJWQpOiV4XG4iLAorCWNpbmRleDAsIHJlZmNhbnZhc19hcnJheVswXSwgY2luZGV4MSwgcmVmY2FudmFzX2FycmF5WzFdKTsKKworCS8vIGxvd2VzdCBkZWx0YV9waWNudW0KKwlyZGF0YTMyID0gcmVmY2FudmFzX2FycmF5WzBdOworCXJkYXRhMzIgPSByZGF0YTMyICYgMHhmZmZmOworCXJkYXRhMzIgPSByZGF0YTMyIHwgKCByZGF0YTMyIDw8IDE2KTsKKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDIsIHJkYXRhMzIpOworCisJLy8gMm5kLWxvd2VzdCBkZWx0YV9waWNudW0KKwlyZGF0YTMyID0gcmVmY2FudmFzX2FycmF5WzFdOworCXJkYXRhMzIgPSByZGF0YTMyICYgMHhmZmZmOworCXJkYXRhMzIgPSByZGF0YTMyIHwgKCByZGF0YTMyIDw8IDE2KTsKKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDMsIHJkYXRhMzIpOworCisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwxLCAweGZmMCk7IC8vIGVuYWJsZSBtY3JjYyBwcm9ncmVzc2l2ZS1tb2RlCisJcmV0dXJuOworfQorCisKKyNlbmRpZgorCitpbnQgYXYxX2NvbnRpbnVlX2RlY29kaW5nKHN0cnVjdCBBVjFIV19zICpodywgaW50IG9idV90eXBlKQoreworCWludCByZXQgPSAwOworI2lmZGVmIFNBTklUWV9DSEVDSworCXBhcmFtX3QqIHBhcmFtcyA9ICZody0+YW9tX3BhcmFtOworI2VuZGlmCisjaWYgMQorCS8vZGVmIENIQU5HRV9ET05FCisJQVYxRGVjb2RlciAqcGJpID0gaHctPnBiaTsKKwlBVjFfQ09NTU9OICpjb25zdCBjbSA9IHBiaS0+Y29tbW9uOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShody0+djRsMl9jdHgpOworCWludCBpOworCisJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJIiVzOiBwYmkgJXAgY20gJXAgY3VyX2ZyYW1lICVwICVkIGhhc19zZXEgJWQgaGFzX2tleWZyYW1lICVkXG4iLAorCQlfX2Z1bmNfXywgcGJpLCBjbSwgY20tPmN1cl9mcmFtZSwKKwkJcGJpLT5idWZtZ3JfcHJvY19jb3VudCwKKwkJaHctPmhhc19zZXF1ZW5jZSwKKwkJaHctPmhhc19rZXlmcmFtZSk7CisKKwlpZiAoaHctPmhhc19zZXF1ZW5jZSA9PSAwKSB7CisJCWF2MV9wcmludChodywgMCwKKwkJCSJubyBzZXF1ZW5jZSBoZWFkLCBza2lwXG4iKTsKKwkJaWYgKCFody0+bV9pbnNfZmxhZykKKwkJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgQU9NX0FWMV9TRUFSQ0hfSEVBRCk7CisJCXJldHVybiAtMjsKKwl9IGVsc2UgaWYgKGh3LT5oYXNfa2V5ZnJhbWUgPT0gMCAmJgorCQlody0+YW9tX3BhcmFtLnAuZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUpeworCQlhdjFfcHJpbnQoaHcsIDAsCisJCQkibm8ga2V5IGZyYW1lLCBza2lwXG4iKTsKKwkJb25fbm9fa2V5ZnJhbWVfc2tpcGVkKys7CisJCWlmICghaHctPm1faW5zX2ZsYWcpCisJCQlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIEFPTV9BVjFfU0VBUkNIX0hFQUQpOworCQlyZXR1cm4gLTI7CisJfQorCWh3LT5oYXNfa2V5ZnJhbWUgPSAxOworCW9uX25vX2tleWZyYW1lX3NraXBlZCA9IDA7CisKKwlpZiAoaHctPmlzX3VzZWRfdjRsICYmIGN0eC0+cGFyYW1fc2V0c19mcm9tX3Vjb2RlKQorCQlody0+cmVzX2NoX2ZsYWcgPSAwOworCisJLy9wcmVfZGVjb2RlX2lkeCA9IHBiaS0+ZGVjb2RlX2lkeDsKKwlpZiAocGJpLT5idWZtZ3JfcHJvY19jb3VudCA9PSAwIHx8CisJaHctPm9uZV9jb21wcmVzc2VkX2RhdGFfZG9uZSkgeworCQlody0+bmV3X2NvbXByZXNzZWRfZGF0YSA9IDE7CisJCWh3LT5vbmVfY29tcHJlc3NlZF9kYXRhX2RvbmUgPSAwOworCX0gZWxzZSB7CisJCWh3LT5uZXdfY29tcHJlc3NlZF9kYXRhID0gMDsKKwl9CisjaWZkZWYgU0FOSVRZX0NIRUNLCisJcmV0ID0gMDsKKwlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkiQ2hlY2sgUGljdHVyZSBzaXplLCBtYXggKCVkLCAlZCksIHdpZHRoL2hlaWdodCAoJWQsICVkKSwgZGVjX3dpZHRoICVkXG4iLAorCQlwYXJhbXMtPnAubWF4X2ZyYW1lX3dpZHRoLAorCQlwYXJhbXMtPnAubWF4X2ZyYW1lX2hlaWdodCwKKwkJcGFyYW1zLT5wLmZyYW1lX3dpZHRoX3NjYWxlZCwKKwkJcGFyYW1zLT5wLmZyYW1lX2hlaWdodCwKKwkJcGFyYW1zLT5wLmRlY19mcmFtZV93aWR0aAorCSk7CisKKwlpZiAoLypwYXJhbXMtPnAubWF4X2ZyYW1lX3dpZHRoID4gTUFYX1BJQ19XSURUSCB8fAorCXBhcmFtcy0+cC5tYXhfZnJhbWVfaGVpZ2h0ID4gTUFYX1BJQ19IRUlHSFQgfHwqLworCShwYXJhbXMtPnAuZnJhbWVfd2lkdGhfc2NhbGVkICogcGFyYW1zLT5wLmZyYW1lX2hlaWdodCkgPiBNQVhfU0laRV84SyB8fAorCShwYXJhbXMtPnAuZGVjX2ZyYW1lX3dpZHRoICogcGFyYW1zLT5wLmZyYW1lX2hlaWdodCkgPiBNQVhfU0laRV84SyB8fAorCXBhcmFtcy0+cC5mcmFtZV93aWR0aF9zY2FsZWQgPD0gMCB8fAorCXBhcmFtcy0+cC5kZWNfZnJhbWVfd2lkdGggPD0gMCB8fAorCXBhcmFtcy0+cC5mcmFtZV9oZWlnaHQgPD0gMCkgeworCQlhdjFfcHJpbnQoaHcsIDAsICIhIVBpY3R1cmUgc2l6ZSBlcnJvciwgbWF4ICglZCwgJWQpLCB3aWR0aC9oZWlnaHQgKCVkLCAlZCksIGRlY193aWR0aCAlZFxuIiwKKwkJCXBhcmFtcy0+cC5tYXhfZnJhbWVfd2lkdGgsCisJCQlwYXJhbXMtPnAubWF4X2ZyYW1lX2hlaWdodCwKKwkJCXBhcmFtcy0+cC5mcmFtZV93aWR0aF9zY2FsZWQsCisJCQlwYXJhbXMtPnAuZnJhbWVfaGVpZ2h0LAorCQkJcGFyYW1zLT5wLmRlY19mcmFtZV93aWR0aAorCQkpOworCQlyZXQgPSAtMTsKKwl9CisjZW5kaWYKKwlpZiAocmV0ID49IDApIHsKKwkJcmV0ID0gYXYxX2J1Zm1ncl9wcm9jZXNzKHBiaSwgJmh3LT5hb21fcGFyYW0sCisJCQlody0+bmV3X2NvbXByZXNzZWRfZGF0YSwgb2J1X3R5cGUpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiAtMTsKKwkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJCSIlczogcGJpICVwIGNtICVwIGN1cl9mcmFtZSAlcFxuIiwKKwkJCV9fZnVuY19fLCBwYmksIGNtLCBjbS0+Y3VyX2ZyYW1lKTsKKworCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkJIjErKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyVkICVwXG4iLAorCQkJcmV0LCBjbS0+Y3VyX2ZyYW1lKTsKKwkJaWYgKGNtLT5jdXJfZnJhbWUpIHsKKwkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNtLT5jdXJfZnJhbWUtPndhaXRfc2Zncyk7CisJCQlhdG9taWNfc2V0KCZjbS0+Y3VyX2ZyYW1lLT5mZ3NfZG9uZSwgMSk7CisJCX0KKwkJaWYgKGh3LT5uZXdfY29tcHJlc3NlZF9kYXRhKQorCQkJV1JJVEVfVlJFRyhQSUNfRU5EX0xDVV9DT1VOVCwgMCk7CisJfQorCWlmIChyZXQgPiAwKSB7CisJCS8qIHRoZSBjYXNlIHdoZW4gY20tPnNob3dfZXhpc3RpbmdfZnJhbWUgaXMgMSAqLworCQkvKmNhc2UgMzAxNiovCisJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCQkiRGVjb2RpbmcgZG9uZSAoaW5kZXg9JWQsIHNob3dfZXhpc3RpbmdfZnJhbWUgPSAlZClcbiIsCisJCQljbS0+Y3VyX2ZyYW1lPyBjbS0+Y3VyX2ZyYW1lLT5idWYuaW5kZXg6LTEsCisJCQljbS0+c2hvd19leGlzdGluZ19mcmFtZQorCQkJKTsKKworCQlpZiAoY20tPmN1cl9mcmFtZSkgeworCQkJUElDX0JVRkZFUl9DT05GSUcqIGN1cl9waWNfY29uZmlnID0gJmNtLT5jdXJfZnJhbWUtPmJ1ZjsKKwkJCWlmIChkZWJ1ZyAmCisJCQkJQVYxX0RFQlVHX0JVRk1HUl9NT1JFKQorCQkJCWR1bXBfYXV4X2J1Zihodyk7CisJCQlzZXRfcGljX2F1eF9kYXRhKGh3LAorCQkJCWN1cl9waWNfY29uZmlnLCAwLCAwKTsKKwkJfQorCQljb25maWdfbmV4dF9yZWZfaW5mb19odyhodyk7CisKKwkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJCSJhb21fYnVmbWdyX3Byb2Nlc3M9PiAlZCxkZWNvZGUgZG9uZSwgQU9NX0FWMV9TRUFSQ0hfSEVBRFxyXG4iLCByZXQpOworCQlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIEFPTV9BVjFfU0VBUkNIX0hFQUQpOworCQlwYmktPmRlY29kZV9pZHgrKzsKKwkJcGJpLT5idWZtZ3JfcHJvY19jb3VudCsrOworCQlody0+ZnJhbWVfZGVjb2RlZCA9IDE7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAocmV0IDwgMCkgeworCQlody0+ZnJhbWVfZGVjb2RlZCA9IDE7CisJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCSJhb21fYnVmbWdyX3Byb2Nlc3M9PiAlZCwgYnVmbWdyIGUuci5yLm8uci4gJWQsIEFPTV9BVjFfU0VBUkNIX0hFQURcclxuIiwKKwkJcmV0LCBjbS0+ZXJyb3IuZXJyb3JfY29kZSk7CisJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgQU9NX0FWMV9TRUFSQ0hfSEVBRCk7CisJCXJldHVybiAwOworCX0KKwllbHNlIGlmIChyZXQgPT0gMCkgeworCQlQSUNfQlVGRkVSX0NPTkZJRyogY3VyX3BpY19jb25maWcgPSAmY20tPmN1cl9mcmFtZS0+YnVmOworCQlQSUNfQlVGRkVSX0NPTkZJRyogcHJldl9waWNfY29uZmlnID0gJmNtLT5wcmV2X2ZyYW1lLT5idWY7CisJCS8vc3RydWN0IHNlZ21lbnRhdGlvbl9sZiAqc2VnXzRsZiA9ICZody0+c2VnXzRsZl9zdG9yZTsKKwkJaWYgKGRlYnVnICYKKwkJCUFWMV9ERUJVR19CVUZNR1JfTU9SRSkKKwkJCWR1bXBfYXV4X2J1Zihodyk7CisJCXNldF9kdl9kYXRhKGh3KTsKKwkJaWYgKGNtLT5zaG93X2ZyYW1lICYmCisJCQlody0+ZHZfZGF0YV9idWYgIT0gTlVMTCkKKwkJCWNvcHlfZHZfZGF0YShodywgY3VyX3BpY19jb25maWcpOworCQkvKiB0byBkbzouLgorCQlzZXRfcGljX2F1eF9kYXRhKGh3LAorCQkJY3VyX3BpY19jb25maWcsIDAsIDIpOyovCisJCWh3LT5mcmFtZV9kZWNvZGVkID0gMDsKKwkJcGJpLT5idWZtZ3JfcHJvY19jb3VudCsrOworCQlpZiAoaHctPm5ld19jb21wcmVzc2VkX2RhdGEgPT0gMCkgeworCQkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCBBT01fQVYxX0RFQ09ERV9TTElDRSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkiIFtQSUNUVVJFICVkXSBjbS0+Y3VyX2ZyYW1lLT5taV9zaXplIDogKCVkIFggJWQpIHlfY3JvcF9zaXplIDooJWQgWCAlZClcbiIsCisJCWh3LT5mcmFtZV9jb3VudCwKKwkJY20tPmN1cl9mcmFtZS0+bWlfY29scywKKwkJY20tPmN1cl9mcmFtZS0+bWlfcm93cywKKwkJY3VyX3BpY19jb25maWctPnlfY3JvcF93aWR0aCwKKwkJY3VyX3BpY19jb25maWctPnlfY3JvcF9oZWlnaHQpOworCQlpZiAoY20tPnByZXZfZnJhbWUgPiAwKSB7CisJCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkJIiBbU0VHTUVOVF0gY20tPnByZXZfZnJhbWUtPnNlZ21lbnRhdGlvbl9lbmFibGVkIDogJWRcbiIsCisJCQljbS0+cHJldl9mcmFtZS0+c2VnbWVudGF0aW9uX2VuYWJsZWQpOworCQkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJCSIgW1NFR01FTlRdIGNtLT5wcmV2X2ZyYW1lLT5taV9zaXplIDogKCVkIFggJWQpXG4iLAorCQkJY20tPnByZXZfZnJhbWUtPm1pX2NvbHMsIGNtLT5wcmV2X2ZyYW1lLT5taV9yb3dzKTsKKwkJfQorCQljbS0+Y3VyX2ZyYW1lLT5wcmV2X3NlZ21lbnRhdGlvbl9lbmFibGVkID0gKGNtLT5wcmV2X2ZyYW1lID4gMCkgPworCQkoY20tPnByZXZfZnJhbWUtPnNlZ21lbnRhdGlvbl9lbmFibGVkICYgKGNtLT5wcmV2X2ZyYW1lLT5zZWdtZW50YXRpb25fdXBkYXRlX21hcAorCQl8IGNtLT5wcmV2X2ZyYW1lLT5wcmV2X3NlZ21lbnRhdGlvbl9lbmFibGVkKSAmCisJCShjbS0+Y3VyX2ZyYW1lLT5taV9yb3dzID09IGNtLT5wcmV2X2ZyYW1lLT5taV9yb3dzKSAmCisJCShjbS0+Y3VyX2ZyYW1lLT5taV9jb2xzID09IGNtLT5wcmV2X2ZyYW1lLT5taV9jb2xzKSkgOiAwOworCQlXUklURV9WUkVHKEFWMV9TS0lQX01PREVfSU5GTywKKwkJCShjbS0+Y3VyX2ZyYW1lLT5wcmV2X3NlZ21lbnRhdGlvbl9lbmFibGVkIDw8IDMxKSB8CisJCQkoKChjbS0+cHJldl9mcmFtZSA+IDApID8gY20tPnByZXZfZnJhbWUtPmludHJhX29ubHkgOiAwKSA8PCAzMCkgfAorCQkJKCgoY20tPnByZXZfZnJhbWUgPiAwKSA/IHByZXZfcGljX2NvbmZpZy0+aW5kZXggOiAweDFmKSA8PCAyNCkgfAorCQkJKCgoY20tPmN1cl9mcmFtZSA+IDApID8gY3VyX3BpY19jb25maWctPmluZGV4IDogMHgxZikgPDwgMTYpIHwKKwkJCShjbS0+Y3VycmVudF9mcmFtZS5za2lwX21vZGVfaW5mby5yZWZfZnJhbWVfaWR4XzAgJiAweGYpIHwKKwkJCSgoY20tPmN1cnJlbnRfZnJhbWUuc2tpcF9tb2RlX2luZm8ucmVmX2ZyYW1lX2lkeF8xICYgMHhmKSA8PCA0KSB8CisJCQkoY20tPmN1cnJlbnRfZnJhbWUuc2tpcF9tb2RlX2luZm8uc2tpcF9tb2RlX2FsbG93ZWQgPDwgOCkpOworCQljdXJfcGljX2NvbmZpZy0+ZGVjb2RlX2lkeCA9IHBiaS0+ZGVjb2RlX2lkeDsKKworCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkJIkRlY29kZSBGcmFtZSBEYXRhICVkIGZyYW1lX3R5cGUgJWQgKCVkKSBidWZtZ3JfcHJvY19jb3VudCAlZFxuIiwKKwkJcGJpLT5kZWNvZGVfaWR4LAorCQljbS0+Y3VyX2ZyYW1lLT5mcmFtZV90eXBlLAorCQljbS0+Y3VycmVudF9mcmFtZS5mcmFtZV90eXBlLAorCQlwYmktPmJ1Zm1ncl9wcm9jX2NvdW50KTsKKwkJcGJpLT5kZWNvZGVfaWR4Kys7CisJCWh3LT5mcmFtZV9jb3VudCsrOworCQljdXJfcGljX2NvbmZpZy0+c2xpY2VfdHlwZSA9IGNtLT5jdXJfZnJhbWUtPmZyYW1lX3R5cGU7CisJCWlmIChody0+Y2h1bmspIHsKKwkJCWF2MV9wcmludChodywgQVYxX0RFQlVHX09VVF9QVFMsCisJCQkJIiVzLCBjb25maWcgcGljIHB0cyAlZCwgcHRzNjQgJWxsZCwgdHM6ICVsbGRcbiIsCisJCQkJX19mdW5jX18sIGh3LT5jaHVuay0+cHRzLCBody0+Y2h1bmstPnB0czY0LCBody0+Y2h1bmstPnRpbWVzdGFtcCk7CisJCQljdXJfcGljX2NvbmZpZy0+cHRzID0gaHctPmNodW5rLT5wdHM7CisJCQljdXJfcGljX2NvbmZpZy0+cHRzNjQgPSBody0+Y2h1bmstPnB0czY0OworCisJCQlpZiAoaHctPmlzX3VzZWRfdjRsICYmICF2NGxfYml0c3RyZWFtX2lkX2VuYWJsZSkgeworCQkJCWN1cl9waWNfY29uZmlnLT5wdHM2NCA9IGh3LT5jaHVuay0+dGltZXN0YW1wOworCQkJCWh3LT5jaHVuay0+dGltZXN0YW1wID0gMDsKKwkJCX0KKworCQkJaHctPmNodW5rLT5wdHMgPSAwOworCQkJaHctPmNodW5rLT5wdHM2NCA9IDA7CisJCX0KKwkJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV9oZWFkZXJfbWVtb3J5X3RpbWVfbmFtZSwgVFJBQ0VfSEVBREVSX1JFR0lTVEVSX1NUQVJUKTsKKyNpZmRlZiBEVUFMX0RFQ09ERQorI2Vsc2UKKwkJY29uZmlnX3BpY19zaXplKGh3LCBody0+YW9tX3BhcmFtLnAuYml0X2RlcHRoKTsKKyNlbmRpZgorCQlpZiAoZ2V0X212X2J1ZihodywgJmNtLT5jdXJfZnJhbWUtPmJ1ZikgPCAwKSB7CisJCQlhdjFfcHJpbnQoaHcsIDAsCisJCQkJIiVzOiBFcnJvciBnZXRfbXZfYnVmIGZhaWxcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmV0ID0gLTE7CisJCX0KKworCQlpZiAocmV0ID49IDAgJiYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hMKSAmJgorCQkJKGdldF9kb3VibGVfd3JpdGVfbW9kZShodykgIT0gMHgxMCkpIHsKKwkJCXJldCA9IGF2MV9hbGxvY19tbXUoaHcsCisJCQkJY20tPmN1cl9mcmFtZS0+YnVmLmluZGV4LAorCQkJCWN1cl9waWNfY29uZmlnLT55X2Nyb3Bfd2lkdGgsCisJCQkJY3VyX3BpY19jb25maWctPnlfY3JvcF9oZWlnaHQsCisJCQkJaHctPmFvbV9wYXJhbS5wLmJpdF9kZXB0aCwKKwkJCQlody0+ZnJhbWVfbW11X21hcF9hZGRyKTsKKwkJCWlmIChyZXQgPj0gMCkKKwkJCQljbS0+Y3VyX2ZiX2lkeF9tbXUgPSBjbS0+Y3VyX2ZyYW1lLT5idWYuaW5kZXg7CisJCQllbHNlCisJCQkJcHJfZXJyKCJjYW4ndCBhbGxvYyBuZWVkIG1tdTEsaWR4ICVkIHJldCA9JWRcbiIsCisJCQkJY20tPmN1cl9mcmFtZS0+YnVmLmluZGV4LCByZXQpOworI2lmZGVmIEFPTV9BVjFfTU1VX0RXCisJCQlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSAmIDB4MjApIHsKKwkJCQlyZXQgPSBhdjFfYWxsb2NfbW11X2R3KGh3LAorCQkJCWNtLT5jdXJfZnJhbWUtPmJ1Zi5pbmRleCwKKwkJCQljdXJfcGljX2NvbmZpZy0+eV9jcm9wX3dpZHRoLAorCQkJCWN1cl9waWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0LAorCQkJCWh3LT5hb21fcGFyYW0ucC5iaXRfZGVwdGgsCisJCQkJaHctPmR3X2ZyYW1lX21tdV9tYXBfYWRkcik7CisJCQkJaWYgKHJldCA+PSAwKQorCQkJCQljbS0+Y3VyX2ZiX2lkeF9tbXVfZHcgPSBjbS0+Y3VyX2ZyYW1lLT5idWYuaW5kZXg7CisJCQkJZWxzZQorCQkJCQlwcl9lcnIoImNhbid0IGFsbG9jIG5lZWQgZHcgbW11MSxpZHggJWQgcmV0ID0lZFxuIiwKKwkJCQkJY20tPmN1cl9mcmFtZS0+YnVmLmluZGV4LCByZXQpOworCQkJfQorI2VuZGlmCisjaWZkZWYgREVCVUdfQ1JDX0VSUk9SCisJCQlpZiAoY3JjX2RlYnVnX2ZsYWcgJiAweDQwKQorCQkJCW12X2J1ZmZlcl9maWxsX3plcm8oaHcsICZjbS0+Y3VyX2ZyYW1lLT5idWYpOworI2VuZGlmCisJCX0gZWxzZSB7CisJCQlyZXQgPSAwOworCQl9CisJCWlmIChhdjFfZnJhbWVfaXNfaW50ZXIoJmh3LT5jb21tb24pKSB7CisJCQkvL2lmICgocGJpLT5jb21tb24uZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUpICYmICghcGJpLT5jb21tb24uaW50cmFfb25seSkpIHsKKyNpZmRlZiBEVUFMX0RFQ09ERQorI2Vsc2UKKwkJCWNvbmZpZ19tY19idWZmZXIoaHcsIGh3LT5hb21fcGFyYW0ucC5iaXRfZGVwdGgsIDEpOworI2VuZGlmCisJCQljb25maWdfbXByZWRfaHcoaHcsIDEpOworCQl9CisJCWVsc2UgeworCQkJY29uZmlnX21jX2J1ZmZlcihodywgaHctPmFvbV9wYXJhbS5wLmJpdF9kZXB0aCwgMCk7CisJCQljbGVhcl9tcHJlZF9odyhodyk7CisJCQljb25maWdfbXByZWRfaHcoaHcsIDApOworCQl9CisjaWZkZWYgRFVBTF9ERUNPREUKKyNlbHNlCisjaWZkZWYgTUNSQ0NfRU5BQkxFCisJCWNvbmZpZ19tY3JjY19heGlfaHdfbmVhcmVzdF9yZWYoaHcpOworI2VuZGlmCisJCWNvbmZpZ19zYW9faHcoaHcsICZody0+YW9tX3BhcmFtKTsKKyNlbmRpZgorCisJCWNvbmZpZ19kYmxrX2h3KGh3KTsKKworCQkvKiBzdG9yZSBzZWdtZW50X2ZlYXR1cmUgYmVmb3JlIHNoYXJlZCBzdWItbW9kdWxlIHJ1biB0byBmaXggbW9zYWljIG9uIHQ1ZCAqLworCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TQzIpCisJCQlXUklURV9WUkVHKEhFVkNfUEFSU0VSX01FTV9XUl9BRERSLCAweDExYjAgKyAoY3VyX3BpY19jb25maWctPmluZGV4KSk7CisJCWVsc2UKKwkJCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfTUVNX1dSX0FERFIsIDB4MTAxMCArIChjdXJfcGljX2NvbmZpZy0+aW5kZXgpKTsKKwkJaWYgKGh3LT5hb21fcGFyYW0ucC5zZWdtZW50YXRpb25fZW5hYmxlZCAmIDEpIC8vIHNlZ21lbnRhdGlvbl9lbmFibGVkCisJCQlXUklURV9WUkVHKEhFVkNfUEFSU0VSX01FTV9SV19EQVRBLCBSRUFEX1ZSRUcoQVYxX1JFRl9TRUdfSU5GTykpOworCQllbHNlCisJCQlXUklURV9WUkVHKEhFVkNfUEFSU0VSX01FTV9SV19EQVRBLCAwKTsKKworCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLCAiSEVWQ19ERUNfU1RBVFVTX1JFRyA8PSBBT01fQVYxX0RFQ09ERV9TTElDRVxuIik7CisJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgQU9NX0FWMV9ERUNPREVfU0xJQ0UpOworCisJCS8vIFNhdmUgc2VnbWVudF9mZWF0dXJlIHdoaWxlIGhhcmR3YXJlIGRlY29kaW5nCisJCWlmIChody0+c2VnXzRsZi0+ZW5hYmxlZCkgeworCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJY20tPmN1cl9mcmFtZS0+c2VnbWVudF9mZWF0dXJlW2ldID0gUkVBRF9WUkVHKEFPTV9BVjFfU0VHTUVOVF9GRUFUVVJFKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCQljbS0+Y3VyX2ZyYW1lLT5zZWdtZW50X2ZlYXR1cmVbaV0gPSAoMHg4MDAwMDAwMCB8IChpIDw8IDIyKSk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLCAiU2VxdWVuY2UgaGVhZCwgU2VhcmNoIG5leHQgc3RhcnQgY29kZVxuIik7CisJCWNtLT5wcmV2X2ZiX2lkeCA9IElOVkFMSURfSURYOworCQkvL3NraXAsIHNlYXJjaCBuZXh0IHN0YXJ0IGNvZGUKKwkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCBBT01fQVYxX0RFQ09ERV9TTElDRSk7CisJfQorCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfaGVhZGVyX21lbW9yeV90aW1lX25hbWUsIFRSQUNFX0hFQURFUl9SRUdJU1RFUl9FTkQpOworCXJldHVybiByZXQ7CisKKyNlbHNlCisKKwliaXRfZGVwdGhfbHVtYSA9IGF2MV9wYXJhbS5wLmJpdF9kZXB0aDsKKwliaXRfZGVwdGhfY2hyb21hID0gYXYxX3BhcmFtLnAuYml0X2RlcHRoOworCisJaWYgKGh3LT5wcm9jZXNzX3N0YXRlICE9IFBST0NfU1RBVEVfU0VOREFHQUlOKSB7CisJCXJldCA9IGF2MV9idWZtZ3JfcHJvY2VzcyhodywgJmF2MV9wYXJhbSk7CisJCWlmICghaHctPm1faW5zX2ZsYWcpCisJCQlody0+cmVzdWx0X2RvbmVfY291bnQrKzsKKwl9IGVsc2UgeworCQl1bmlvbiBwYXJhbV91ICpwYXJhbXMgPSAmYXYxX3BhcmFtOworCQlpZiAoaHctPm1tdV9lbmFibGUgJiYgKChody0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDEwKSA9PSAwKSkgeworCQkJcmV0ID0gYXYxX2FsbG9jX21tdShodywKKwkJCQljbS0+bmV3X2ZiX2lkeCwKKwkJCQlwYXJhbXMtPnAud2lkdGgsCisJCQkJcGFyYW1zLT5wLmhlaWdodCwKKwkJCQlwYXJhbXMtPnAuYml0X2RlcHRoLAorCQkJCWh3LT5mcmFtZV9tbXVfbWFwX2FkZHIpOworCQkJaWYgKHJldCA+PSAwKQorCQkJCWNtLT5jdXJfZmJfaWR4X21tdSA9IGNtLT5uZXdfZmJfaWR4OworCQkJZWxzZQorCQkJCXByX2VycigiY2FuJ3QgYWxsb2MgbmVlZCBtbXUxLGlkeCAlZCByZXQgPSVkXG4iLAorCQkJCQljbS0+bmV3X2ZiX2lkeCwgcmV0KTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IDA7CisJCX0KKwkJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9QSUNUVVJFX1NJWkUsCisJCQkocGFyYW1zLT5wLmhlaWdodCA8PCAxNikgfCBwYXJhbXMtPnAud2lkdGgpOworCX0KKwlpZiAocmV0IDwgMCkgeworCQkJcHJfaW5mbygiYXYxX2J1Zm1ncl9wcm9jZXNzPT4gJWQsIEFWMV8xMEJfRElTQ0FSRF9OQUxcclxuIiwgcmV0KTsKKwkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCBBVjFfMTBCX0RJU0NBUkRfTkFMKTsKKwkJY20tPnNob3dfZnJhbWUgPSAwOworCQlpZiAoaHctPm1tdV9lbmFibGUpCisJCQlhdjFfcmVjeWNsZV9tbXVfYnVmKGh3KTsKKworCQlpZiAoaHctPm1faW5zX2ZsYWcpIHsKKwkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworCQkJYW1oZXZjX3N0b3AoKTsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQl9CisJCXJldHVybiByZXQ7CisJfSBlbHNlIGlmIChyZXQgPT0gMCkgeworCQlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqY3VyX3BpY19jb25maWcKKwkJCT0gJmNtLT5jdXJfZnJhbWUtPmJ1ZjsKKwkJY3VyX3BpY19jb25maWctPmRlY29kZV9pZHggPSBody0+ZnJhbWVfY291bnQ7CisKKwkJaWYgKGh3LT5wcm9jZXNzX3N0YXRlICE9IFBST0NfU1RBVEVfU0VOREFHQUlOKSB7CisJCQlpZiAoIWh3LT5tX2luc19mbGFnKSB7CisJCQkJaHctPmZyYW1lX2NvdW50Kys7CisJCQkJZGVjb2RlX2ZyYW1lX2NvdW50W2h3LT5pbmRleF0KKwkJCQkJPSBody0+ZnJhbWVfY291bnQ7CisJCQl9CisJCQlpZiAoaHctPmNodW5rKSB7CisJCQkJY3VyX3BpY19jb25maWctPnB0cyA9IGh3LT5jaHVuay0+cHRzOworCQkJCWN1cl9waWNfY29uZmlnLT5wdHM2NCA9IGh3LT5jaHVuay0+cHRzNjQ7CisJCQl9CisJCX0KKwkJLypwcl9pbmZvKCJEZWNvZGUgRnJhbWUgRGF0YSAlZFxuIiwgaHctPmZyYW1lX2NvdW50KTsqLworCQljb25maWdfcGljX3NpemUoaHcsIGF2MV9wYXJhbS5wLmJpdF9kZXB0aCk7CisKKwkJaWYgKChody0+Y29tbW9uLmZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKQorCQkJJiYgKCFody0+Y29tbW9uLmludHJhX29ubHkpKSB7CisJCQljb25maWdfbWNfYnVmZmVyKGh3LCBhdjFfcGFyYW0ucC5iaXRfZGVwdGgpOworCQkJY29uZmlnX21wcmVkX2h3KGh3KTsKKwkJfSBlbHNlIHsKKwkJCWNsZWFyX21wcmVkX2h3KGh3KTsKKwkJfQorI2lmZGVmIE1DUkNDX0VOQUJMRQorCQlpZiAobWNyY2NfY2FjaGVfYWxnX2ZsYWcpCisJCQljb25maWdfbWNyY2NfYXhpX2h3X25ldyhodyk7CisJCWVsc2UKKwkJCWNvbmZpZ19tY3JjY19heGlfaHcoaHcpOworI2VuZGlmCisJCWNvbmZpZ19zYW9faHcoaHcsICZhdjFfcGFyYW0pOworCQkvKnByX2luZm8oIkhFVkNfREVDX1NUQVRVU19SRUcgPD0gQVYxXzEwQl9ERUNPREVfU0xJQ0VcbiIpOyovCisJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgQVYxXzEwQl9ERUNPREVfU0xJQ0UpOworCX0gZWxzZSB7CisJCXByX2luZm8oIlNraXAgc2VhcmNoIG5leHQgc3RhcnQgY29kZVxuIik7CisJCWNtLT5wcmV2X2ZiX2lkeCA9IElOVkFMSURfSURYOworCQkvKnNraXAsIHNlYXJjaCBuZXh0IHN0YXJ0IGNvZGUqLworCQlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIEFWMV8xMEJfREVDT0RFX1NMSUNFKTsKKwl9CisJaHctPnByb2Nlc3Nfc3RhdGUgPSBQUk9DX1NUQVRFX0RFQ09ERVNMSUNFOworCWlmIChody0+bW11X2VuYWJsZSAmJiAoKGh3LT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MTApID09IDApKSB7CisJCWlmIChody0+bGFzdF9wdXRfaWR4IDwgaHctPnVzZWRfYnVmX251bSkgeworCQkJc3RydWN0IFJlZkNudEJ1ZmZlcl9zICpmcmFtZV9idWZzID0KKwkJCQljbS0+YnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnM7CisJCQlpbnQgaSA9IGh3LT5sYXN0X3B1dF9pZHg7CisJCQkvKmZyZWUgbm90IHVzZWQgYnVmZmVycy4qLworCQkJaWYgKChmcmFtZV9idWZzW2ldLnJlZl9jb3VudCA9PSAwKSAmJgorCQkJKGZyYW1lX2J1ZnNbaV0uYnVmLnZmX3JlZiA9PSAwKSAmJgorCQkJKGZyYW1lX2J1ZnNbaV0uYnVmLmluZGV4ICE9IC0xKSkgeworCQkJCWlmIChwYmktPmlzX3VzZWRfdjRsKSB7CisJCQkJCXN0cnVjdCBpbnRlcm5hbF9jb21wX2J1ZiAqaWJ1ZiA9CisJCQkJCQlpbmRleF90b19pY29tcF9idWYocGJpLCBpKTsKKworCQkJCQlkZWNvZGVyX21tdV9ib3hfZnJlZV9pZHgoaWJ1Zi0+bW11X2JveCwgaSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZGVjb2Rlcl9tbXVfYm94X2ZyZWVfaWR4KHBiaS0+bW11X2JveCwgaSk7CisJCQkJfQorCQkJfQorCQkJaHctPmxhc3RfcHV0X2lkeCA9IC0xOworCQl9CisJfQorCXJldHVybiByZXQ7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgZmlsbF9mcmFtZV9pbmZvKHN0cnVjdCBBVjFIV19zICpodywKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqZnJhbWUsCisJdW5zaWduZWQgaW50IGZyYW1lc2l6ZSwKKwl1bnNpZ25lZCBpbnQgcHRzKQoreworCXN0cnVjdCB2ZnJhbWVfcW9zX3MgKnZmcmFtZV9xb3MgPSAmaHctPnZmcmFtZV9xb3M7CisKKwlpZiAoZnJhbWUtPnNsaWNlX3R5cGUgPT0gS0VZX0ZSQU1FKQorCQl2ZnJhbWVfcW9zLT50eXBlID0gMTsKKwllbHNlIGlmIChmcmFtZS0+c2xpY2VfdHlwZSA9PSBJTlRFUl9GUkFNRSkKKwkJdmZyYW1lX3Fvcy0+dHlwZSA9IDI7CisvKgorI2RlZmluZSBTSE9XX1FPU19JTkZPCisqLworCXZmcmFtZV9xb3MtPnNpemUgPSBmcmFtZXNpemU7CisJdmZyYW1lX3Fvcy0+cHRzID0gcHRzOworI2lmZGVmIFNIT1dfUU9TX0lORk8KKwlhdjFfcHJpbnQoaHcsIDAsICJzbGljZTolZFxuIiwgZnJhbWUtPnNsaWNlX3R5cGUpOworI2VuZGlmCisJdmZyYW1lX3Fvcy0+bWF4X212ID0gZnJhbWUtPm1heF9tdjsKKwl2ZnJhbWVfcW9zLT5hdmdfbXYgPSBmcmFtZS0+YXZnX212OworCXZmcmFtZV9xb3MtPm1pbl9tdiA9IGZyYW1lLT5taW5fbXY7CisjaWZkZWYgU0hPV19RT1NfSU5GTworCWF2MV9wcmludChodywgMCwgIm12OiBtYXg6JWQsICBhdmc6JWQsIG1pbjolZFxuIiwKKwkJCXZmcmFtZV9xb3MtPm1heF9tdiwKKwkJCXZmcmFtZV9xb3MtPmF2Z19tdiwKKwkJCXZmcmFtZV9xb3MtPm1pbl9tdik7CisjZW5kaWYKKwl2ZnJhbWVfcW9zLT5tYXhfcXAgPSBmcmFtZS0+bWF4X3FwOworCXZmcmFtZV9xb3MtPmF2Z19xcCA9IGZyYW1lLT5hdmdfcXA7CisJdmZyYW1lX3Fvcy0+bWluX3FwID0gZnJhbWUtPm1pbl9xcDsKKyNpZmRlZiBTSE9XX1FPU19JTkZPCisJYXYxX3ByaW50KGh3LCAwLCAicXA6IG1heDolZCwgIGF2ZzolZCwgbWluOiVkXG4iLAorCQkJdmZyYW1lX3Fvcy0+bWF4X3FwLAorCQkJdmZyYW1lX3Fvcy0+YXZnX3FwLAorCQkJdmZyYW1lX3Fvcy0+bWluX3FwKTsKKyNlbmRpZgorCXZmcmFtZV9xb3MtPm1heF9za2lwID0gZnJhbWUtPm1heF9za2lwOworCXZmcmFtZV9xb3MtPmF2Z19za2lwID0gZnJhbWUtPmF2Z19za2lwOworCXZmcmFtZV9xb3MtPm1pbl9za2lwID0gZnJhbWUtPm1pbl9za2lwOworI2lmZGVmIFNIT1dfUU9TX0lORk8KKwlhdjFfcHJpbnQoaHcsIDAsICJza2lwOiBtYXg6JWQsCWF2ZzolZCwgbWluOiVkXG4iLAorCQkJdmZyYW1lX3Fvcy0+bWF4X3NraXAsCisJCQl2ZnJhbWVfcW9zLT5hdmdfc2tpcCwKKwkJCXZmcmFtZV9xb3MtPm1pbl9za2lwKTsKKyNlbmRpZgorCXZmcmFtZV9xb3MtPm51bSsrOworCS8qCisJaWYgKGh3LT5mcmFtZWluZm9fZW5hYmxlKQorCQl2ZGVjX2ZpbGxfZnJhbWVfaW5mbyh2ZnJhbWVfcW9zLCAxKTsKKwkqLworfQorCisvKiBvbmx5IHdoZW4gd2UgZGVjb2RlZCBvbmUgZmllbGQgb3Igb25lIGZyYW1lLAord2UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBnZXQgcW9zIGluZm8qLworc3RhdGljIHZvaWQgZ2V0X3BpY3R1cmVfcW9zX2luZm8oc3RydWN0IEFWMUhXX3MgKmh3KQoreworCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpmcmFtZSA9ICZody0+Y3VyX2J1Zi0+YnVmOworCisJaWYgKCFmcmFtZSkKKwkJcmV0dXJuOworCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA8IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKSB7CisJCXVuc2lnbmVkIGNoYXIgYVszXTsKKwkJdW5zaWduZWQgY2hhciBpLCBqLCB0OworCQl1bnNpZ25lZCBsb25nICBkYXRhOworCisJCWRhdGEgPSBSRUFEX1ZSRUcoSEVWQ19NVl9JTkZPKTsKKwkJaWYgKGZyYW1lLT5zbGljZV90eXBlID09IEtFWV9GUkFNRSkKKwkJCWRhdGEgPSAwOworCQlhWzBdID0gZGF0YSAmIDB4ZmY7CisJCWFbMV0gPSAoZGF0YSA+PiA4KSAmIDB4ZmY7CisJCWFbMl0gPSAoZGF0YSA+PiAxNikgJiAweGZmOworCisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCWZvciAoaiA9IGkrMTsgaiA8IDM7IGorKykgeworCQkJCWlmIChhW2pdIDwgYVtpXSkgeworCQkJCQl0ID0gYVtqXTsKKwkJCQkJYVtqXSA9IGFbaV07CisJCQkJCWFbaV0gPSB0OworCQkJCX0gZWxzZSBpZiAoYVtqXSA9PSBhW2ldKSB7CisJCQkJCWFbaV0rKzsKKwkJCQkJdCA9IGFbal07CisJCQkJCWFbal0gPSBhW2ldOworCQkJCQlhW2ldID0gdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJZnJhbWUtPm1heF9tdiA9IGFbMl07CisJCWZyYW1lLT5hdmdfbXYgPSBhWzFdOworCQlmcmFtZS0+bWluX212ID0gYVswXTsKKworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19RT1NfSU5GTywKKwkJCSJtdiBkYXRhICV4ICBhWzBdPSAleCBhWzFdPSAleCBhWzJdPSAleFxuIiwKKwkJCWRhdGEsIGFbMF0sIGFbMV0sIGFbMl0pOworCisJCWRhdGEgPSBSRUFEX1ZSRUcoSEVWQ19RUF9JTkZPKTsKKwkJYVswXSA9IGRhdGEgJiAweDFmOworCQlhWzFdID0gKGRhdGEgPj4gOCkgJiAweDNmOworCQlhWzJdID0gKGRhdGEgPj4gMTYpICYgMHg3ZjsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlmb3IgKGogPSBpKzE7IGogPCAzOyBqKyspIHsKKwkJCQlpZiAoYVtqXSA8IGFbaV0pIHsKKwkJCQkJdCA9IGFbal07CisJCQkJCWFbal0gPSBhW2ldOworCQkJCQlhW2ldID0gdDsKKwkJCQl9IGVsc2UgaWYgKGFbal0gPT0gYVtpXSkgeworCQkJCQlhW2ldKys7CisJCQkJCXQgPSBhW2pdOworCQkJCQlhW2pdID0gYVtpXTsKKwkJCQkJYVtpXSA9IHQ7CisJCQkJfQorCQkJfQorCQl9CisJCWZyYW1lLT5tYXhfcXAgPSBhWzJdOworCQlmcmFtZS0+YXZnX3FwID0gYVsxXTsKKwkJZnJhbWUtPm1pbl9xcCA9IGFbMF07CisKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfUU9TX0lORk8sCisJCQkicXAgZGF0YSAleCAgYVswXT0gJXggYVsxXT0gJXggYVsyXT0gJXhcbiIsCisJCQlkYXRhLCBhWzBdLCBhWzFdLCBhWzJdKTsKKworCQlkYXRhID0gUkVBRF9WUkVHKEhFVkNfU0tJUF9JTkZPKTsKKwkJYVswXSA9IGRhdGEgJiAweDFmOworCQlhWzFdID0gKGRhdGEgPj4gOCkgJiAweDNmOworCQlhWzJdID0gKGRhdGEgPj4gMTYpICYgMHg3ZjsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlmb3IgKGogPSBpKzE7IGogPCAzOyBqKyspIHsKKwkJCQlpZiAoYVtqXSA8IGFbaV0pIHsKKwkJCQkJdCA9IGFbal07CisJCQkJCWFbal0gPSBhW2ldOworCQkJCQlhW2ldID0gdDsKKwkJCQl9IGVsc2UgaWYgKGFbal0gPT0gYVtpXSkgeworCQkJCQlhW2ldKys7CisJCQkJCXQgPSBhW2pdOworCQkJCQlhW2pdID0gYVtpXTsKKwkJCQkJYVtpXSA9IHQ7CisJCQkJfQorCQkJfQorCQl9CisJCWZyYW1lLT5tYXhfc2tpcCA9IGFbMl07CisJCWZyYW1lLT5hdmdfc2tpcCA9IGFbMV07CisJCWZyYW1lLT5taW5fc2tpcCA9IGFbMF07CisKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfUU9TX0lORk8sCisJCQkic2tpcCBkYXRhICV4ICBhWzBdPSAleCBhWzFdPSAleCBhWzJdPSAleFxuIiwKKwkJCWRhdGEsIGFbMF0sIGFbMV0sIGFbMl0pOworCX0gZWxzZSB7CisJCXVpbnQzMl90IGJsazg4X3lfY291bnQ7CisJCXVpbnQzMl90IGJsazg4X2NfY291bnQ7CisJCXVpbnQzMl90IGJsazIyX212X2NvdW50OworCQl1aW50MzJfdCByZGF0YTMyOworCQlpbnQzMl90IG12X2hpOworCQlpbnQzMl90IG12X2xvOworCQl1aW50MzJfdCByZGF0YTMyX2w7CisJCXVpbnQzMl90IG12eF9MMF9oaTsKKwkJdWludDMyX3QgbXZ5X0wwX2hpOworCQl1aW50MzJfdCBtdnhfTDFfaGk7CisJCXVpbnQzMl90IG12eV9MMV9oaTsKKwkJaW50NjRfdCB2YWx1ZTsKKwkJdWludDY0X3QgdGVtcF92YWx1ZTsKKwkJaW50IHBpY19udW1iZXIgPSBmcmFtZS0+ZGVjb2RlX2lkeDsKKworCQlmcmFtZS0+bWF4X212ID0gMDsKKwkJZnJhbWUtPmF2Z19tdiA9IDA7CisJCWZyYW1lLT5taW5fbXYgPSAwOworCisJCWZyYW1lLT5tYXhfc2tpcCA9IDA7CisJCWZyYW1lLT5hdmdfc2tpcCA9IDA7CisJCWZyYW1lLT5taW5fc2tpcCA9IDA7CisKKwkJZnJhbWUtPm1heF9xcCA9IDA7CisJCWZyYW1lLT5hdmdfcXAgPSAwOworCQlmcmFtZS0+bWluX3FwID0gMDsKKworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19RT1NfSU5GTywgInNsaWNlX3R5cGU6JWQsIHBvYzolZFxuIiwKKwkJCWZyYW1lLT5zbGljZV90eXBlLAorCQkJcGljX251bWJlcik7CisKKwkJLyogc2V0IHJkX2lkeCB0byAwICovCisJCVdSSVRFX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9DVFJMLCAwKTsKKworCQlibGs4OF95X2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJCWlmIChibGs4OF95X2NvdW50ID09IDApIHsKKworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBOTyBEYXRhIHlldC5cbiIsCisJCQlwaWNfbnVtYmVyKTsKKworCQkJLyogcmVzZXQgYWxsIGNvdW50cyAqLworCQkJV1JJVEVfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0NUUkwsICgxPDw4KSk7CisJCQlyZXR1cm47CisJCX0KKwkJLyogcXBfeV9zdW0gKi8KKwkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIFkgUVAgQVZHIDogJWQgKCVkLyVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzIvYmxrODhfeV9jb3VudCwKKwkJCXJkYXRhMzIsIGJsazg4X3lfY291bnQpOworCisJCWZyYW1lLT5hdmdfcXAgPSByZGF0YTMyL2Jsazg4X3lfY291bnQ7CisJCS8qIGludHJhX3lfY291bnQgKi8KKwkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIFkgaW50cmEgcmF0ZSA6ICVkJWMgKCVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzIqMTAwL2Jsazg4X3lfY291bnQsCisJCQknJScsIHJkYXRhMzIpOworCisJCS8qIHNraXBwZWRfeV9jb3VudCAqLworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gWSBza2lwcGVkIHJhdGUgOiAlZCVjICglZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyKjEwMC9ibGs4OF95X2NvdW50LAorCQkJJyUnLCByZGF0YTMyKTsKKworCQlmcmFtZS0+YXZnX3NraXAgPSByZGF0YTMyKjEwMC9ibGs4OF95X2NvdW50OworCQkvKiBjb2VmZl9ub25femVyb195X2NvdW50ICovCisJCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBZIFpFUk9fQ29lZmYgcmF0ZSA6ICVkJWMgKCVkKVxuIiwKKwkJCXBpY19udW1iZXIsICgxMDAgLSByZGF0YTMyKjEwMC8oYmxrODhfeV9jb3VudCoxKSksCisJCQknJScsIHJkYXRhMzIpOworCisJCS8qIGJsazY2X2NfY291bnQgKi8KKwkJYmxrODhfY19jb3VudCA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCQlpZiAoYmxrODhfY19jb3VudCA9PSAwKSB7CisJCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19RT1NfSU5GTywKKwkJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTk8gRGF0YSB5ZXQuXG4iLAorCQkJCXBpY19udW1iZXIpOworCQkJLyogcmVzZXQgYWxsIGNvdW50cyAqLworCQkJV1JJVEVfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0NUUkwsICgxPDw4KSk7CisJCQlyZXR1cm47CisJCX0KKwkJLyogcXBfY19zdW0gKi8KKwkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX1FPU19JTkZPLAorCQkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBDIFFQIEFWRyA6ICVkICglZC8lZClcbiIsCisJCQkJcGljX251bWJlciwgcmRhdGEzMi9ibGs4OF9jX2NvdW50LAorCQkJCXJkYXRhMzIsIGJsazg4X2NfY291bnQpOworCisJCS8qIGludHJhX2NfY291bnQgKi8KKwkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIEMgaW50cmEgcmF0ZSA6ICVkJWMgKCVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzIqMTAwL2Jsazg4X2NfY291bnQsCisJCQknJScsIHJkYXRhMzIpOworCisJCS8qIHNraXBwZWRfY3VfY19jb3VudCAqLworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gQyBza2lwcGVkIHJhdGUgOiAlZCVjICglZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyKjEwMC9ibGs4OF9jX2NvdW50LAorCQkJJyUnLCByZGF0YTMyKTsKKworCQkvKiBjb2VmZl9ub25femVyb19jX2NvdW50ICovCisJCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBDIFpFUk9fQ29lZmYgcmF0ZSA6ICVkJWMgKCVkKVxuIiwKKwkJCXBpY19udW1iZXIsICgxMDAgLSByZGF0YTMyKjEwMC8oYmxrODhfY19jb3VudCoxKSksCisJCQknJScsIHJkYXRhMzIpOworCisJCS8qIDEnaDAsIHFwX2NfbWF4WzY6MF0sIDEnaDAsIHFwX2NfbWluWzY6MF0sCisJCTEnaDAsIHFwX3lfbWF4WzY6MF0sIDEnaDAsIHFwX3lfbWluWzY6MF0gKi8KKwkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIFkgUVAgbWluIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCAocmRhdGEzMj4+MCkmMHhmZik7CisKKwkJZnJhbWUtPm1pbl9xcCA9IChyZGF0YTMyPj4wKSYweGZmOworCisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIFkgUVAgbWF4IDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCAocmRhdGEzMj4+OCkmMHhmZik7CisKKwkJZnJhbWUtPm1heF9xcCA9IChyZGF0YTMyPj44KSYweGZmOworCisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIEMgUVAgbWluIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCAocmRhdGEzMj4+MTYpJjB4ZmYpOworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBDIFFQIG1heCA6ICVkXG4iLAorCQkJcGljX251bWJlciwgKHJkYXRhMzI+PjI0KSYweGZmKTsKKworCQkvKiBibGsyMl9tdl9jb3VudCAqLworCQlibGsyMl9tdl9jb3VudCA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCQlpZiAoYmxrMjJfbXZfY291bnQgPT0gMCkgeworCQkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfUU9TX0lORk8sCisJCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE5PIE1WIERhdGEgeWV0LlxuIiwKKwkJCQlwaWNfbnVtYmVyKTsKKwkJCS8qIHJlc2V0IGFsbCBjb3VudHMgKi8KKwkJCVdSSVRFX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9DVFJMLCAoMTw8OCkpOworCQkJcmV0dXJuOworCQl9CisJCS8qIG12eV9MMV9jb3VudFszOTozMl0sIG12eF9MMV9jb3VudFszOTozMl0sCisJCW12eV9MMF9jb3VudFszOTozMl0sIG12eF9MMF9jb3VudFszOTozMl0gKi8KKwkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCQkvKiBzaG91bGQgYWxsIGJlIDB4MDAgb3IgMHhmZiAqLworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNViBBVkcgSGlnaCBCaXRzOiAweCVYXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMik7CisKKwkJbXZ4X0wwX2hpID0gKChyZGF0YTMyPj4wKSYweGZmKTsKKwkJbXZ5X0wwX2hpID0gKChyZGF0YTMyPj44KSYweGZmKTsKKwkJbXZ4X0wxX2hpID0gKChyZGF0YTMyPj4xNikmMHhmZik7CisJCW12eV9MMV9oaSA9ICgocmRhdGEzMj4+MjQpJjB4ZmYpOworCisJCS8qIG12eF9MMF9jb3VudFszMTowXSAqLworCQlyZGF0YTMyX2wgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkJdGVtcF92YWx1ZSA9IG12eF9MMF9oaTsKKwkJdGVtcF92YWx1ZSA9ICh0ZW1wX3ZhbHVlIDw8IDMyKSB8IHJkYXRhMzJfbDsKKworCQlpZiAobXZ4X0wwX2hpICYgMHg4MCkKKwkJCXZhbHVlID0gMHhGRkZGRkZGMDAwMDAwMDAwIHwgdGVtcF92YWx1ZTsKKwkJZWxzZQorCQkJdmFsdWUgPSB0ZW1wX3ZhbHVlOworCisJCXZhbHVlID0gZGl2X3M2NCh2YWx1ZSwgYmxrMjJfbXZfY291bnQpOworCisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWF9MMCBBVkcgOiAlZCAoJWxsZC8lZClcbiIsCisJCQlwaWNfbnVtYmVyLCAoaW50KXZhbHVlLAorCQkJdmFsdWUsIGJsazIyX212X2NvdW50KTsKKworCQlmcmFtZS0+YXZnX212ID0gdmFsdWU7CisKKwkJLyogbXZ5X0wwX2NvdW50WzMxOjBdICovCisJCXJkYXRhMzJfbCA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCQl0ZW1wX3ZhbHVlID0gbXZ5X0wwX2hpOworCQl0ZW1wX3ZhbHVlID0gKHRlbXBfdmFsdWUgPDwgMzIpIHwgcmRhdGEzMl9sOworCisJCWlmIChtdnlfTDBfaGkgJiAweDgwKQorCQkJdmFsdWUgPSAweEZGRkZGRkYwMDAwMDAwMDAgfCB0ZW1wX3ZhbHVlOworCQllbHNlCisJCQl2YWx1ZSA9IHRlbXBfdmFsdWU7CisKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZZX0wwIEFWRyA6ICVkICglbGxkLyVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzJfbC9ibGsyMl9tdl9jb3VudCwKKwkJCXZhbHVlLCBibGsyMl9tdl9jb3VudCk7CisKKwkJLyogbXZ4X0wxX2NvdW50WzMxOjBdICovCisJCXJkYXRhMzJfbCA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCQl0ZW1wX3ZhbHVlID0gbXZ4X0wxX2hpOworCQl0ZW1wX3ZhbHVlID0gKHRlbXBfdmFsdWUgPDwgMzIpIHwgcmRhdGEzMl9sOworCQlpZiAobXZ4X0wxX2hpICYgMHg4MCkKKwkJCXZhbHVlID0gMHhGRkZGRkZGMDAwMDAwMDAwIHwgdGVtcF92YWx1ZTsKKwkJZWxzZQorCQkJdmFsdWUgPSB0ZW1wX3ZhbHVlOworCisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWF9MMSBBVkcgOiAlZCAoJWxsZC8lZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyX2wvYmxrMjJfbXZfY291bnQsCisJCQl2YWx1ZSwgYmxrMjJfbXZfY291bnQpOworCisJCS8qIG12eV9MMV9jb3VudFszMTowXSAqLworCQlyZGF0YTMyX2wgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkJdGVtcF92YWx1ZSA9IG12eV9MMV9oaTsKKwkJdGVtcF92YWx1ZSA9ICh0ZW1wX3ZhbHVlIDw8IDMyKSB8IHJkYXRhMzJfbDsKKwkJaWYgKG12eV9MMV9oaSAmIDB4ODApCisJCQl2YWx1ZSA9IDB4RkZGRkZGRjAwMDAwMDAwMCB8IHRlbXBfdmFsdWU7CisJCWVsc2UKKwkJCXZhbHVlID0gdGVtcF92YWx1ZTsKKworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVllfTDEgQVZHIDogJWQgKCVsbGQvJWQpXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMl9sL2JsazIyX212X2NvdW50LAorCQkJdmFsdWUsIGJsazIyX212X2NvdW50KTsKKworCQkvKiB7bXZ4X0wwX21heCwgbXZ4X0wwX21pbn0gLy8gZm9ybWF0IDoge3NpZ24sIGFic1sxNDowXX0gICovCisJCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkJbXZfaGkgPSAocmRhdGEzMj4+MTYpJjB4ZmZmZjsKKwkJaWYgKG12X2hpICYgMHg4MDAwKQorCQkJbXZfaGkgPSAweDgwMDAgLSBtdl9oaTsKKworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVlhfTDAgTUFYIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9oaSk7CisKKwkJZnJhbWUtPm1heF9tdiA9IG12X2hpOworCisJCW12X2xvID0gKHJkYXRhMzI+PjApJjB4ZmZmZjsKKwkJaWYgKG12X2xvICYgMHg4MDAwKQorCQkJbXZfbG8gPSAweDgwMDAgLSBtdl9sbzsKKworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVlhfTDAgTUlOIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9sbyk7CisKKwkJZnJhbWUtPm1pbl9tdiA9IG12X2xvOworCisJCS8qIHttdnlfTDBfbWF4LCBtdnlfTDBfbWlufSAqLworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJCW12X2hpID0gKHJkYXRhMzI+PjE2KSYweGZmZmY7CisJCWlmIChtdl9oaSAmIDB4ODAwMCkKKwkJCW12X2hpID0gMHg4MDAwIC0gbXZfaGk7CisKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZZX0wwIE1BWCA6ICVkXG4iLAorCQkJcGljX251bWJlciwgbXZfaGkpOworCisJCW12X2xvID0gKHJkYXRhMzI+PjApJjB4ZmZmZjsKKwkJaWYgKG12X2xvICYgMHg4MDAwKQorCQkJbXZfbG8gPSAweDgwMDAgLSBtdl9sbzsKKworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVllfTDAgTUlOIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9sbyk7CisKKwkJLyoge212eF9MMV9tYXgsIG12eF9MMV9taW59ICovCisJCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkJbXZfaGkgPSAocmRhdGEzMj4+MTYpJjB4ZmZmZjsKKwkJaWYgKG12X2hpICYgMHg4MDAwKQorCQkJbXZfaGkgPSAweDgwMDAgLSBtdl9oaTsKKworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVlhfTDEgTUFYIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9oaSk7CisKKwkJbXZfbG8gPSAocmRhdGEzMj4+MCkmMHhmZmZmOworCQlpZiAobXZfbG8gJiAweDgwMDApCisJCQltdl9sbyA9IDB4ODAwMCAtIG12X2xvOworCisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWF9MMSBNSU4gOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIG12X2xvKTsKKworCQkvKiB7bXZ5X0wxX21heCwgbXZ5X0wxX21pbn0gKi8KKwkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCQltdl9oaSA9IChyZGF0YTMyPj4xNikmMHhmZmZmOworCQlpZiAobXZfaGkgJiAweDgwMDApCisJCQltdl9oaSA9IDB4ODAwMCAtIG12X2hpOworCisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWV9MMSBNQVggOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIG12X2hpKTsKKworCQltdl9sbyA9IChyZGF0YTMyPj4wKSYweGZmZmY7CisJCWlmIChtdl9sbyAmIDB4ODAwMCkKKwkJCW12X2xvID0gMHg4MDAwIC0gbXZfbG87CisKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZZX0wxIE1JTiA6ICVkXG4iLAorCQkJcGljX251bWJlciwgbXZfbG8pOworCisJCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9DVFJMKTsKKworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBBZnRlciBSZWFkIDogVkRFQ19QSUNfUVVBTElUWV9DVFJMIDogMHgleFxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzIpOworCisJCS8qIHJlc2V0IGFsbCBjb3VudHMgKi8KKwkJV1JJVEVfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0NUUkwsICgxPDw4KSk7CisJfQorfQorCitzdGF0aWMgaW50IGxvYWRfcGFyYW0oc3RydWN0IEFWMUhXX3MgKmh3LCB1bmlvbiBwYXJhbV91ICpwYXJhbXMsIHVpbnQzMl90IGRlY19zdGF0dXMpCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBpbnQgaGVhZF90eXBlID0gMDsKKyAgICBpZiAoZGVjX3N0YXR1cyA9PSBBT01fQVYxX1NFUV9IRUFEX1BBUlNFUl9ET05FKQorCSAgaGVhZF90eXBlID0gT0JVX1NFUVVFTkNFX0hFQURFUjsKKyAgICBlbHNlIGlmIChkZWNfc3RhdHVzID09IEFPTV9BVjFfRlJBTUVfSEVBRF9QQVJTRVJfRE9ORSkKKwkgIGhlYWRfdHlwZSA9IE9CVV9GUkFNRV9IRUFERVI7CisgICAgZWxzZSBpZiAoZGVjX3N0YXR1cyA9PSBBT01fQVYxX0ZSQU1FX1BBUlNFUl9ET05FKQorCSAgaGVhZF90eXBlID0gT0JVX0ZSQU1FOworICAgIGVsc2UgaWYgKGRlY19zdGF0dXMgPT0gQU9NX0FWMV9SRURVTkRBTlRfRlJBTUVfSEVBRF9QQVJTRVJfRE9ORSkKKwkgIGhlYWRfdHlwZSA9IE9CVV9SRURVTkRBTlRfRlJBTUVfSEVBREVSOworICAgIGVsc2UgeworCSAgLy9wcmludGYoIkVycm9yLCBkZWNfc3RhdHVzIG9mIDB4JXgsIG5vdCBzdXBwb3J0ZWQhISFcbiIsIGRlY19zdGF0dXMpOworCSAgcmV0dXJuIC0xOworCX0KKwlhdjFfcHJpbnQyKEFPTV9ERUJVR19IV19NT1JFLCAibG9hZF9wYXJhbTogcmV0IDB4JXhcbiIsIGhlYWRfdHlwZSk7CisJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV9oZWFkZXJfbWVtb3J5X3RpbWVfbmFtZSwgVFJBQ0VfSEVBREVSX1JQTV9TVEFSVCk7CisJaWYgKGRlYnVnJkFPTV9BVjFfREVCVUdfU0VORF9QQVJBTV9XSVRIX1JFRykgeworCSAgICBnZXRfcnBtX3BhcmFtKHBhcmFtcyk7CisJfQorCWVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgKFJQTV9FTkQtUlBNX0JFR0lOKTsgaSArPSA0KSB7CisJCQlpbnQzMl90IGlpOworCQkJZm9yIChpaSA9IDA7IGlpIDwgNDsgaWkrKykgeworCQkJCXBhcmFtcy0+bC5kYXRhW2kraWldPWh3LT5ycG1fcHRyW2krMy1paV07CisJCQl9CisJCX0KKwl9CisJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV9oZWFkZXJfbWVtb3J5X3RpbWVfbmFtZSwgVFJBQ0VfSEVBREVSX1JQTV9FTkQpOworCXBhcmFtcy0+cC5lbmFibGVfcmVmX2ZyYW1lX212cyA9IChwYXJhbXMtPnAuc2VxX2ZsYWdzID4+IDcpICYgMHgxOworCXBhcmFtcy0+cC5lbmFibGVfc3VwZXJyZXMgPSAocGFyYW1zLT5wLnNlcV9mbGFncyA+PiAxNSkgJiAweDE7CisKKyAgICBpZiAoZGVidWcgJiBBVjFfREVCVUdfQlVGTUdSX01PUkUpIHsKKwkJbG9ja19idWZmZXJfcG9vbChody0+Y29tbW9uLmJ1ZmZlcl9wb29sLCBmbGFncyk7CisJICAgIHByX2luZm8oImFvbV9wYXJhbTogKCVkKVxuIiwgaHctPnBiaS0+ZGVjb2RlX2lkeCk7CisJCS8vcGJpLT5zbGljZV9pZHgrKzsKKwkgICAgZm9yICggaSA9IDA7IGkgPCAoUlBNX0VORC1SUE1fQkVHSU4pOyBpKyspIHsKKwkJICAgIHByX2luZm8oIiUwNHggIiwgcGFyYW1zLT5sLmRhdGFbaV0pOworCQkgICAgaWYgKCgoaSArIDEpICYgMHhmKSA9PSAwKQorCQkJICAgIHByX2luZm8oIlxuIik7CisJCX0KKwkJdW5sb2NrX2J1ZmZlcl9wb29sKGh3LT5jb21tb24uYnVmZmVyX3Bvb2wsIGZsYWdzKTsKKwl9CisgIHJldHVybiBoZWFkX3R5cGU7Cit9CisKK3N0YXRpYyBpbnQgYXYxX3Bvc3Rwcm9jKHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlpZiAoaHctPnBvc3Rwcm9jX2RvbmUpCisJCXJldHVybiAwOworCWh3LT5wb3N0cHJvY19kb25lID0gMTsKKwlyZXR1cm4gYXYxX2J1Zm1ncl9wb3N0cHJvYyhody0+cGJpLCBody0+ZnJhbWVfZGVjb2RlZCk7Cit9CisKK3N0YXRpYyB2b2lkIHZhdjFfZ2V0X2NvbXBfYnVmX2luZm8oc3RydWN0IEFWMUhXX3MgKmh3LAorCQkJCQlzdHJ1Y3QgdmRlY19jb21wX2J1Zl9pbmZvICppbmZvKQoreworCXUxNiBiaXRfZGVwdGggPSBody0+cGFyYW0ucC5iaXRfZGVwdGg7CisKKwlpbmZvLT5tYXhfc2l6ZSA9IGF2MV9tYXhfbW11X2J1Zl9zaXplKAorCQkJaHctPm1heF9waWNfdywKKwkJCWh3LT5tYXhfcGljX2gpOworCWluZm8tPmhlYWRlcl9zaXplID0gYXYxX2dldF9oZWFkZXJfc2l6ZSgKKwkJCWh3LT5mcmFtZV93aWR0aCwKKwkJCWh3LT5mcmFtZV9oZWlnaHQpOworCWluZm8tPmZyYW1lX2J1ZmZlcl9zaXplID0gYXYxX21tdV9wYWdlX251bSgKKwkJCWh3LCBody0+ZnJhbWVfd2lkdGgsCisJCQlody0+ZnJhbWVfaGVpZ2h0LAorCQkJYml0X2RlcHRoID09IDApOworfQorCitzdGF0aWMgaW50IHZhdjFfZ2V0X3BzX2luZm8oc3RydWN0IEFWMUhXX3MgKmh3LCBzdHJ1Y3QgYW1sX3ZkZWNfcHNfaW5mb3MgKnBzKQoreworCXBzLT52aXNpYmxlX3dpZHRoIAk9IGh3LT5mcmFtZV93aWR0aDsKKwlwcy0+dmlzaWJsZV9oZWlnaHQgCT0gaHctPmZyYW1lX2hlaWdodDsKKwlwcy0+Y29kZWRfd2lkdGggCT0gQUxJR04oaHctPmZyYW1lX3dpZHRoLCA2NCk7CisJcHMtPmNvZGVkX2hlaWdodCAJPSBBTElHTihody0+ZnJhbWVfaGVpZ2h0LCA2NCk7CisJcHMtPmRwYl9zaXplIAkJPSBody0+dXNlZF9idWZfbnVtOworCXBzLT5kcGJfbWFyZ2luCQk9IGh3LT5keW5hbWljX2J1Zl9udW1fbWFyZ2luOworCWlmIChody0+ZnJhbWVfd2lkdGggPiAxOTIwICYmIGh3LT5mcmFtZV9oZWlnaHQgPiAxMDg4KQorCQlwcy0+ZHBiX2ZyYW1lcyA9IDg7CisJZWxzZQorCQlwcy0+ZHBiX2ZyYW1lcyA9IDEwOworCisJcHMtPmRwYl9mcmFtZXMgKz0gMjsKKworCWlmIChwcy0+ZHBiX21hcmdpbiArIHBzLT5kcGJfZnJhbWVzID4gTUFYX0JVRl9OVU1fTk9STUFMKSB7CisJCXUzMiBkZWx0YTsKKwkJZGVsdGEgPSBwcy0+ZHBiX21hcmdpbiArIHBzLT5kcGJfZnJhbWVzIC0gTUFYX0JVRl9OVU1fTk9STUFMOworCQlwcy0+ZHBiX21hcmdpbiAtPSBkZWx0YTsKKwkJaHctPmR5bmFtaWNfYnVmX251bV9tYXJnaW4gPSBwcy0+ZHBiX21hcmdpbjsKKwl9CisJcHMtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdjRsX3Jlc19jaGFuZ2Uoc3RydWN0IEFWMUhXX3MgKmh3KQoreworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShody0+djRsMl9jdHgpOworCXN0cnVjdCBBVjFfQ29tbW9uX3MgKmNvbnN0IGNtID0gJmh3LT5jb21tb247CisJaW50IHJldCA9IDA7CisKKwlpZiAoY3R4LT5wYXJhbV9zZXRzX2Zyb21fdWNvZGUgJiYKKwkJaHctPnJlc19jaF9mbGFnID09IDApIHsKKwkJc3RydWN0IGFtbF92ZGVjX3BzX2luZm9zIHBzOworCQlzdHJ1Y3QgdmRlY19jb21wX2J1Zl9pbmZvIGNvbXA7CisKKwkJaWYgKChjbS0+d2lkdGggIT0gMCAmJgorCQkJY20tPmhlaWdodCAhPSAwKSAmJgorCQkJKGh3LT5mcmFtZV93aWR0aCAhPSBjbS0+d2lkdGggfHwKKwkJCWh3LT5mcmFtZV9oZWlnaHQgIT0gY20tPmhlaWdodCkpIHsKKworCQkJYXYxX3ByaW50KGh3LCAwLAorCQkJCSIlcyAoJWQsJWQpPT4oJWQsJWQpXHJcbiIsIF9fZnVuY19fLCBjbS0+d2lkdGgsCisJCQkJY20tPmhlaWdodCwgaHctPmZyYW1lX3dpZHRoLCBody0+ZnJhbWVfaGVpZ2h0KTsKKworCQkJaWYgKGdldF92YWxpZF9kb3VibGVfd3JpdGVfbW9kZShodykgIT0gMTYpIHsKKwkJCQl2YXYxX2dldF9jb21wX2J1Zl9pbmZvKGh3LCAmY29tcCk7CisJCQkJdmRlY192NGxfc2V0X2NvbXBfYnVmX2luZm8oY3R4LCAmY29tcCk7CisJCQl9CisKKwkJCXZhdjFfZ2V0X3BzX2luZm8oaHcsICZwcyk7CisJCQl2ZGVjX3Y0bF9zZXRfcHNfaW5mb3MoY3R4LCAmcHMpOworCQkJdmRlY192NGxfcmVzX2NoX2V2ZW50KGN0eCk7CisJCQlody0+djRsX3BhcmFtc19wYXJzZWQgPSBmYWxzZTsKKwkJCWh3LT5yZXNfY2hfZmxhZyA9IDE7CisJCQljdHgtPnY0bF9yZXNvbHV0aW9uX2NoYW5nZSA9IDE7CisJCQltdXRleF9sb2NrKCZody0+YXNzaXRfdGFzay5hc3NpdF9tdXRleCk7CisJCQlody0+ZW9zID0gMTsKKworCQkJYXYxX3Bvc3Rwcm9jKGh3KTsKKworCQkJQVRSQUNFX0NPVU5URVIoIlZfU1RfREVDLXN1Ym1pdF9lb3MiLCBfX0xJTkVfXyk7CisJCQlub3RpZnlfdjRsX2Vvcyhod190b192ZGVjKGh3KSk7CisJCQlBVFJBQ0VfQ09VTlRFUigiVl9TVF9ERUMtc3VibWl0X2VvcyIsIDApOworCQkJbXV0ZXhfdW5sb2NrKCZody0+YXNzaXRfdGFzay5hc3NpdF9tdXRleCk7CisJCQlyZXQgPSAxOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3b3JrX3NwYWNlX3NpemVfdXBkYXRlKHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlpbnQgd29ya2J1Zl9zaXplLCBjbWFfYWxsb2NfY250LCByZXQ7CisJc3RydWN0IEJ1ZmZJbmZvX3MgKnBfYnVmX2luZm8gPSAmaHctPndvcmtfc3BhY2VfYnVmX3N0b3JlOworCisJLyogb25seSBmb3IgOGsgd29ya3NwYWNlIHVwZGF0ZSAqLworCWlmICghSVNfOEtfU0laRShody0+bWF4X3BpY193LCBody0+bWF4X3BpY19oKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoaHctPmNtYV9hbGxvY19hZGRyICYmIGh3LT5idWZfc2l6ZSkgeworCQltZW1jcHkocF9idWZfaW5mbywgJmFvbV93b3JrYnVmZl9zcGVjWzJdLAorCQkJc2l6ZW9mKHN0cnVjdCBCdWZmSW5mb19zKSk7CisJCXdvcmtidWZfc2l6ZSA9IChwX2J1Zl9pbmZvLT5lbmRfYWRyIC0KKwkJCXBfYnVmX2luZm8tPnN0YXJ0X2FkciArIDB4ZmZmZikgJiAofjB4ZmZmZik7CisJCWNtYV9hbGxvY19jbnQgPSBQQUdFX0FMSUdOKHdvcmtidWZfc2l6ZSkgLyBQQUdFX1NJWkU7CisJCWlmIChody0+Y21hX2FsbG9jX2NvdW50IDwgY21hX2FsbG9jX2NudCkgeworCQkJZGVjb2Rlcl9ibW11X2JveF9mcmVlX2lkeChody0+Ym1tdV9ib3gsIFdPUktfU1BBQ0VfQlVGX0lEKTsKKwkJCWh3LT5idWZmZXJfc3BlY19pbmRleCA9IDI7CisJCQlody0+Y21hX2FsbG9jX2NvdW50ID0gY21hX2FsbG9jX2NudDsKKwkJCXJldCA9IGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeShody0+Ym1tdV9ib3gsCisJCQkJV09SS19TUEFDRV9CVUZfSUQsIGh3LT5jbWFfYWxsb2NfY291bnQgKiBQQUdFX1NJWkUsCisJCQkJRFJJVkVSX05BTUUsICZody0+Y21hX2FsbG9jX2FkZHIpOworCQkJaWYocmV0IDwgMCkgeworCQkJCWh3LT5mYXRhbF9lcnJvciB8PSBERUNPREVSX0ZBVEFMX0VSUk9SX05PX01FTTsKKwkJCQlwcl9lcnIoIjhrIHdvcmtzcGFjZSByZWNhbGxvYyBmYWlsZWRcbiIpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCQlody0+YnVmX3N0YXJ0ID0gaHctPmNtYV9hbGxvY19hZGRyOworCQkJaHctPmJ1Zl9zaXplID0gd29ya2J1Zl9zaXplOworCQkJcHJfaW5mbygiOGsgd29ya19zcGFjZV9idWYgcmVjYWxsb2MsIHNpemUgMHgleFxuIiwgaHctPmJ1Zl9zaXplKTsKKwkJCXBfYnVmX2luZm8tPnN0YXJ0X2FkciA9IGh3LT5idWZfc3RhcnQ7CisJCQlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA8IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWEwpIHx8CisJCQkJKGdldF9kb3VibGVfd3JpdGVfbW9kZShodykgPT0gMHgxMCkpIHsKKwkJCQlody0+bWNfYnVmX3NwZWMuYnVmX2VuZCA9IGh3LT5idWZfc3RhcnQgKyBody0+YnVmX3NpemU7CisJCQl9CisJCQlpbml0X2J1ZmZfc3BlYyhodywgcF9idWZfaW5mbyk7CisJCQlody0+d29ya19zcGFjZV9idWYgPSBwX2J1Zl9pbmZvOworCQkJaHctPnBiaS0+d29ya19zcGFjZV9idWYgPSBwX2J1Zl9pbmZvOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB2YXYxX2lzcl90aHJlYWRfZm4oaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgQVYxSFdfcyAqaHcgPSAoc3RydWN0IEFWMUhXX3MgKilkYXRhOworCXVuc2lnbmVkIGludCBkZWNfc3RhdHVzID0gaHctPmRlY19zdGF0dXM7CisJaW50IG9idV90eXBlOworCWludCByZXQgPSAwOworCisJaWYgKGRlY19zdGF0dXMgPT0gQU9NX0FWMV9GUkFNRV9IRUFEX1BBUlNFUl9ET05FIHx8CisJCWRlY19zdGF0dXMgPT0gQU9NX0FWMV9TRVFfSEVBRF9QQVJTRVJfRE9ORSB8fAorCQlkZWNfc3RhdHVzID09IEFPTV9BVjFfRlJBTUVfUEFSU0VSX0RPTkUpIHsKKwkJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX1RIUkVBRF9IRUFEX1NUQVJUKTsKKwl9CisJZWxzZSBpZiAoZGVjX3N0YXR1cyA9PSBBT01fQVYxX0RFQ19QSUNfRU5EIHx8CisJCWRlY19zdGF0dXMgPT0gQU9NX05BTF9ERUNPREVfRE9ORSkgeworCQlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9JU1JfVEhSRUFEX1BJQ19ET05FX1NUQVJUKTsKKwl9CisKKwlpZiAoaHctPmVvcykKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCWh3LT53YWl0X2J1ZiA9IDA7CisJaWYgKChkZWNfc3RhdHVzID09IEFPTV9OQUxfREVDT0RFX0RPTkUpIHx8CisJCQkoZGVjX3N0YXR1cyA9PSBBT01fU0VBUkNIX0JVRkVNUFRZKSB8fAorCQkJKGRlY19zdGF0dXMgPT0gQU9NX0RFQ09ERV9CVUZFTVBUWSkKKwkJKSB7CisJCWlmIChody0+bV9pbnNfZmxhZykgeworCQkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwkJCWlmICghdmRlY19mcmFtZV9iYXNlZChod190b192ZGVjKGh3KSkpCisJCQkJZGVjX2FnYWluX3Byb2Nlc3MoaHcpOworCQkJZWxzZSB7CisJCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJCQkJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX1RIUkVBRF9FRE4pOworCQkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJfQorCQl9CisJCWh3LT5wcm9jZXNzX2J1c3kgPSAwOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfSBlbHNlIGlmIChkZWNfc3RhdHVzID09IEFPTV9BVjFfREVDX1BJQ19FTkQpIHsKKwkJc3RydWN0IEFWMV9Db21tb25fcyAqY29uc3QgY20gPSAmaHctPmNvbW1vbjsKKwkJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKmZyYW1lID0gJmNtLT5jdXJfZnJhbWUtPmJ1ZjsKKwkJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaHcpOworI2lmIDEKKwkJdTMyIGZnX3JlZzAsIGZnX3JlZzEsIG51bV95X3BvaW50cywgbnVtX2NiX3BvaW50cywgbnVtX2NyX3BvaW50czsKKwkJV1JJVEVfVlJFRyhIRVZDX0ZHU19JRFgsIDApOworCQlmZ19yZWcwID0gUkVBRF9WUkVHKEhFVkNfRkdTX0RBVEEpOworCQlmZ19yZWcxID0gUkVBRF9WUkVHKEhFVkNfRkdTX0RBVEEpOworCQludW1feV9wb2ludHMgPSBmZ19yZWcxICYgMHhmOworCQludW1fY3JfcG9pbnRzID0gKGZnX3JlZzEgPj4gOCkgJiAweGY7CisJCW51bV9jYl9wb2ludHMgPSAoZmdfcmVnMSA+PiA0KSAmIDB4ZjsKKwkJaWYgKChudW1feV9wb2ludHMgPiAwKSB8fAorCQkoKG51bV9jYl9wb2ludHMgPiAwKSB8ICgoZmdfcmVnMCA+PiAxNykgJiAweDEpKSB8fAorCQkoKG51bV9jcl9wb2ludHMgPiAwKSB8ICgoZmdfcmVnMCA+PiAxNykgJiAweDEpKSkKKwkJCWh3LT5mZ3NfdmFsaWQgPSAxOworCQllbHNlCisJCQlody0+ZmdzX3ZhbGlkID0gMDsKKwkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwKKwkJCSJmZ19kYXRhMCAweCV4IGZnX2RhdGExIDB4JXggZmdfdmFsaWQgJWRcbiIsCisJCQlmZ19yZWcwLCBmZ19yZWcxLCBody0+ZmdzX3ZhbGlkKTsKKyNlbHNlCisJCWlmIChSRUFEX1ZSRUcoSEVWQ19GR1NfQ1RSTCkgJgorCQkJCSgoMSA8PCA0KSB8ICgxIDw8IDUpIHwgKDEgPDwgNikpKQorCQkJaHctPmZnc192YWxpZCA9IDE7CisJCWVsc2UKKwkJCWh3LT5mZ3NfdmFsaWQgPSAwOworI2VuZGlmCisJCWRlY29kZV9mcmFtZV9jb3VudFtody0+aW5kZXhdID0gaHctPmZyYW1lX2NvdW50OworCQlpZiAoaHctPm1faW5zX2ZsYWcpIHsKKyNpZmRlZiBVU0VfREVDX1BJQ19FTkQKKwkJCWlmIChSRUFEX1ZSRUcoUElDX0VORF9MQ1VfQ09VTlQpICE9IDApIHsKKwkJCQlody0+ZnJhbWVfZGVjb2RlZCA9IDE7CisJCQkJaWYgKGNtLT5jdXJfZnJhbWUgJiYgdmRlYy0+bXZmcm0gJiYgZnJhbWUpIHsKKwkJCQkJZnJhbWUtPmh3X2RlY29kZV90aW1lID0KKwkJCQkJbG9jYWxfY2xvY2soKSAtIHZkZWMtPm12ZnJtLT5od19kZWNvZGVfc3RhcnQ7CisJCQkJCWZyYW1lLT5mcmFtZV9zaXplMiA9IHZkZWMtPm12ZnJtLT5mcmFtZV9zaXplOworCQkJCX0KKwkJCQlody0+Z3ZzLT5mcmFtZV9jb3VudCA9IGh3LT5mcmFtZV9jb3VudDsKKwkJCQkvKgorCQkJCUluIGMgbW9kdWxlLCBtdWx0aSBvYnVzIGFyZSBwdXQgaW4gb25lIHBhY2tldCwgd2hpY2ggaXMgZGVjb2RlZAorCQkJCXdpdGggYXYxX3JlY2VpdmVfY29tcHJlc3NlZF9kYXRhKCkuCisJCQkJRm9yIFNUUkVBTV9NT0RFIG9yIFNJTkdMRV9NT0RFLCB0aGVyZSBpcyBubyBwYWNrZXQgYm91bmRhcnksCisJCQkJd2UgYXNzdW1lIGVhY2ggcGFja2V0IG11c3QgYW5kIG9ubHkgaW5jbHVkZSBvbmUgcGljdHVyZSBvZiBkYXRhIChMQ1VzKQorCQkJCSBvciBjbS0+c2hvd19leGlzdGluZ19mcmFtZSBpcyAxCisJCQkJKi8KKwkJCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkJCQkiRGVjb2RpbmcgZG9uZSAoaW5kZXggJWQpLCBmZ3NfdmFsaWQgJWQgZGF0YV9zaXplIDB4JXggc2hpZnRieXRlIDB4JXhcbiIsCisJCQkJCWNtLT5jdXJfZnJhbWU/IGNtLT5jdXJfZnJhbWUtPmJ1Zi5pbmRleDotMSwKKwkJCQkJaHctPmZnc192YWxpZCwKKwkJCQkJaHctPmRhdGFfc2l6ZSwKKwkJCQkJUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCkpOworCQkJCWh3LT5jb25maWdfbmV4dF9yZWZfaW5mb19mbGFnID0gMTsgLyp0byBkbzogbG93X2xhdGVuY3lfZmxhZyAgY2FzZSovCisJCQkJLy9jb25maWdfbmV4dF9yZWZfaW5mb19odyhodyk7CisJCQl9CisjZW5kaWYKKworCQkJaWYgKGdldF9waWN0dXJlX3FvcykKKwkJCQlnZXRfcGljdHVyZV9xb3NfaW5mbyhodyk7CisKKwkJCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisKKwkJCWlmIChody0+bV9pbnNfZmxhZyAmJgorCQkJCShnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTCkgJiYKKwkJCQkoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSAhPSAweDEwKSAmJgorCQkJCShkZWJ1ZyAmIEFPTV9ERUJVR19ESVNfUkVDWUNMRV9NTVVfVEFJTCkgPT0gMCkgeworCQkJCWxvbmcgdXNlZF80a19udW0gPQorCQkJCShSRUFEX1ZSRUcoSEVWQ19TQU9fTU1VX1NUQVRVUykgPj4gMTYpOworCQkJCWlmICgoY20tPmN1cl9mcmFtZSAhPSBOVUxMKSAmJiAoY20tPmN1cl9mYl9pZHhfbW11ICE9IElOVkFMSURfSURYKSkgeworCQkJCQloZXZjX21tdV9kbWFfY2hlY2soaHdfdG9fdmRlYyhodykpOworCisJCQkJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsICJtbXUgZnJlZSB0YWlsLCBpbmRleCAlZCB1c2VkX251bSAweCV4XG4iLAorCQkJCQkJY20tPmN1cl9mYl9pZHhfbW11LCB1c2VkXzRrX251bSk7CisJCQkJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCQkJCXN0cnVjdCBpbnRlcm5hbF9jb21wX2J1ZiAqaWJ1ZiA9CisJCQkJCQkJaW5kZXhfdG9faWNvbXBfYnVmKGh3LCBjbS0+Y3VyX2ZiX2lkeF9tbXUpOworCisJCQkJCQlkZWNvZGVyX21tdV9ib3hfZnJlZV9pZHhfdGFpbCgKKwkJCQkJCQlpYnVmLT5tbXVfYm94LAorCQkJCQkJCWlidWYtPmluZGV4LAorCQkJCQkJCXVzZWRfNGtfbnVtKTsKKyNpZmRlZiBBT01fQVYxX01NVV9EVworCQkJCQkJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShodykgJiAweDIwKSB7CisJCQkJCQkJdXNlZF80a19udW0gPQorCQkJCQkJCQkoUkVBRF9WUkVHKEhFVkNfU0FPX01NVV9TVEFUVVMyKSA+PiAxNik7CisJCQkJCQkJZGVjb2Rlcl9tbXVfYm94X2ZyZWVfaWR4X3RhaWwoCisJCQkJCQkJCWlidWYtPm1tdV9ib3hfZHcsCisJCQkJCQkJCWlidWYtPmluZGV4LAorCQkJCQkJCQl1c2VkXzRrX251bSk7CisJCQkJCQkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwgImR3IG1tdSBmcmVlIHRhaWwsIGluZGV4ICVkIHVzZWRfbnVtIDB4JXhcbiIsCisJCQkJCQkJCWNtLT5jdXJfZnJhbWUtPmJ1Zi5pbmRleCwgdXNlZF80a19udW0pOworCQkJCQkJfQorI2VuZGlmCisJCQkJCQljbS0+Y3VyX2ZiX2lkeF9tbXUgPSBJTlZBTElEX0lEWDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWRlY29kZXJfbW11X2JveF9mcmVlX2lkeF90YWlsKGh3LT5tbXVfYm94LAorCQkJCQkJCWNtLT5jdXJfZnJhbWUtPmJ1Zi5pbmRleCwgdXNlZF80a19udW0pOworI2lmZGVmIEFPTV9BVjFfTU1VX0RXCisJCQkJCQlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSAmIDB4MjApIHsKKwkJCQkJCQl1c2VkXzRrX251bSA9CisJCQkJCQkJKFJFQURfVlJFRyhIRVZDX1NBT19NTVVfU1RBVFVTMikgPj4gMTYpOworCQkJCQkJCWRlY29kZXJfbW11X2JveF9mcmVlX2lkeF90YWlsKGh3LT5tbXVfYm94X2R3LAorCQkJCQkJCQljbS0+Y3VyX2ZyYW1lLT5idWYuaW5kZXgsIHVzZWRfNGtfbnVtKTsKKwkJCQkJCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLCAiZHcgbW11IGZyZWUgdGFpbCwgaW5kZXggJWQgdXNlZF9udW0gMHgleFxuIiwKKwkJCQkJCQkJY20tPmN1cl9mcmFtZS0+YnVmLmluZGV4LCB1c2VkXzRrX251bSk7CisJCQkJCQl9CisjZW5kaWYKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYgKGh3LT5hc3NpdF90YXNrLnVzZV9zZmdzKSB7CisJCQkJdWxvbmcgc3RhcnRfdGltZTsKKwkJCQlzdGFydF90aW1lID0gbG9jYWxfY2xvY2soKTsKKwkJCQlpZiAoY20tPmN1cl9mcmFtZSkKKwkJCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoY20tPmN1cl9mcmFtZS0+d2FpdF9zZmdzLAorCQkJCQkJKGF0b21pY19yZWFkKCZjbS0+Y3VyX2ZyYW1lLT5mZ3NfZG9uZSkgPT0gMSksIG1zZWNzX3RvX2ppZmZpZXMoNTApKTsKKwkJCQlpZiAoZ2V0X2RlYnVnX2ZncygpICYgREVCVUdfRkdTX0NPTlNVTUVfVElNRSkgeworCQkJCQlwcl9pbmZvKCIlcywgcGljICVkLCBmZ3NfdmFsaWQgJWQsIHdhaXQgY29uc3VtZSB0aW1lICVkIHVzXG4iLCBfX2Z1bmNfXywKKwkJCQkJCWh3LT5mcmFtZV9jb3VudCAtIDEsIGh3LT5mZ3NfdmFsaWQsCisJCQkJCQlkaXY2NF91NjQobG9jYWxfY2xvY2soKSAtIHN0YXJ0X3RpbWUsIDEwMDApKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoaHctPmxvd19sYXRlbmN5X2ZsYWcpCisJCQkJYXYxX3Bvc3Rwcm9jKGh3KTsKKworCQkJaWYgKG11bHRpX2ZyYW1lc19pbl9vbmVfcGFjayAmJgorCQkJaHctPmZyYW1lX2RlY29kZWQgJiYKKwkJCVJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpIDwgaHctPmRhdGFfc2l6ZSkgeworCQkJCWlmIChlbmFibGVfc2luZ2xlX3NsaWNlID09IDEpIHsKKwkJCQkJaHctPmNvbnN1bWVfYnl0ZSA9IFJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpIC0gNDsKKwkJCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX1VORklOSVNIOworCQkJCQlhbWhldmNfc3RvcCgpOworI2lmZGVmIE1DUkNDX0VOQUJMRQorCQkJCQlpZiAobWNyY2NfY2FjaGVfYWxnX2ZsYWcpCisJCQkJCQlkdW1wX2hpdF9yYXRlKGh3KTsKKyNlbmRpZgorCQkJCQlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9JU1JfVEhSRUFEX0VETik7CisJCQkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJCX1lbHNlIHsKKyNpZmRlZiBERUJVR19DUkNfRVJST1IKKwkJCQlpZiAoKGNyY19kZWJ1Z19mbGFnICYgMHg0MCkgJiYgY20tPmN1cl9mcmFtZSkKKwkJCQkJZHVtcF9tdl9idWZmZXIoaHcsICZjbS0+Y3VyX2ZyYW1lLT5idWYpOworI2VuZGlmCisJCQkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCBBT01fQVYxX1NFQVJDSF9IRUFEKTsKKwkJCQlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCQkJCSJQSUNfRU5ELCBmZ3NfdmFsaWQgJWQgc2VhcmNoIGhlYWQgLi4uXG4iLAorCQkJCWh3LT5mZ3NfdmFsaWQpOworCQkJCWlmIChody0+Y29uZmlnX25leHRfcmVmX2luZm9fZmxhZykKKwkJCQkJY29uZmlnX25leHRfcmVmX2luZm9faHcoaHcpOworCQkJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9USFJFQURfRUROKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWh3LT5kYXRhX3NpemUgPSAwOworCQkJCWh3LT5kYXRhX29mZnNldCA9IDA7CisjaWZkZWYgREVCVUdfQ1JDX0VSUk9SCisJCQkJaWYgKChjcmNfZGVidWdfZmxhZyAmIDB4NDApICYmIGNtLT5jdXJfZnJhbWUpCisJCQkJCWR1bXBfbXZfYnVmZmVyKGh3LCAmY20tPmN1cl9mcmFtZS0+YnVmKTsKKyNlbmRpZgorCQkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworCQkJCWFtaGV2Y19zdG9wKCk7CisjaWZkZWYgTUNSQ0NfRU5BQkxFCisJCQkJaWYgKG1jcmNjX2NhY2hlX2FsZ19mbGFnKQorCQkJCQlkdW1wX2hpdF9yYXRlKGh3KTsKKyNlbmRpZgorCQkJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9USFJFQURfRUROKTsKKwkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCQkJIlBJQ19FTkQsIGZnc192YWxpZCAlZCBzZWFyY2ggaGVhZCAuLi5cbiIsCisJCQkJaHctPmZnc192YWxpZCk7CisjaWZkZWYgVVNFX0RFQ19QSUNfRU5ECisJCQlpZiAoUkVBRF9WUkVHKFBJQ19FTkRfTENVX0NPVU5UKSAhPSAwKSB7CisJCQkJaHctPmZyYW1lX2RlY29kZWQgPSAxOworCQkJCS8qCisJCQkJSW4gYyBtb2R1bGUsIG11bHRpIG9idXMgYXJlIHB1dCBpbiBvbmUgcGFja2V0LCB3aGljaCBpcyBkZWNvZGVkCisJCQkJd2l0aCBhdjFfcmVjZWl2ZV9jb21wcmVzc2VkX2RhdGEoKS4KKwkJCQlGb3IgU1RSRUFNX01PREUgb3IgU0lOR0xFX01PREUsIHRoZXJlIGlzIG5vIHBhY2tldCBib3VuZGFyeSwKKwkJCQl3ZSBhc3N1bWUgZWFjaCBwYWNrZXQgbXVzdCBhbmQgb25seSBpbmNsdWRlIG9uZSBwaWN0dXJlIG9mIGRhdGEgKExDVXMpCisJCQkJb3IgY20tPnNob3dfZXhpc3RpbmdfZnJhbWUgaXMgMQorCQkJCSovCisJCQkJaWYgKGNtLT5jdXJfZnJhbWUpCisJCQkJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsICJEZWNvZGluZyBkb25lIChpbmRleCAlZClcbiIsCisJCQkJCQljbS0+Y3VyX2ZyYW1lPyBjbS0+Y3VyX2ZyYW1lLT5idWYuaW5kZXg6LTEpOworCQkJCWNvbmZpZ19uZXh0X3JlZl9pbmZvX2h3KGh3KTsKKwkJCX0KKyNlbmRpZgorCQkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCBBT01fQVYxX1NFQVJDSF9IRUFEKTsKKwkJCS8qCisJCQlpZiAoZGVidWcgJgorCQkJCUFWMV9ERUJVR19CVUZNR1JfTU9SRSkKKwkJCQlkdW1wX2F1eF9idWYoaHcpOworCQkJc2V0X2F1eF9kYXRhKGh3LAorCQkJCSZjbS0+Y3VyX2ZyYW1lLT5idWYsIDAsIDApOworCQkJKi8KKwkJCWlmIChody0+bG93X2xhdGVuY3lfZmxhZykgeworCQkJCWF2MV9wb3N0cHJvYyhodyk7CisJCQkJdmRlY19wcm9maWxlKGh3X3RvX3ZkZWMoaHcpLCBWREVDX1BST0ZJTEVfRVZFTlRfQ0IpOworCQkJCWlmIChkZWJ1ZyAmIFBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwpCisJCQkJCXByX2luZm8oIiVzIEFWMSBmcmFtZSBkb25lIFxuIiwgX19mdW5jX18pOworCQkJfQorCQl9CisKKwkJc3RhcnRfcHJvY2Vzc190aW1lKGh3KTsKKwkJaHctPnByb2Nlc3NfYnVzeSA9IDA7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAoZGVjX3N0YXR1cyA9PSBBT01fRU9TKSB7CisJCWlmIChody0+bV9pbnNfZmxhZykKKwkJCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisKKwkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwgIkFWMV9FT1MsIGZsdXNoIGJ1ZmZlclxyXG4iKTsKKworCQlhdjFfcG9zdHByb2MoaHcpOworCisJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsICJzZW5kIEFWMV8xMEJfRElTQ0FSRF9OQUxcclxuIik7CisJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgQU9NX0FWMV9ESVNDQVJEX05BTCk7CisJCWh3LT5wcm9jZXNzX2J1c3kgPSAwOworCQlpZiAoaHctPm1faW5zX2ZsYWcpIHsKKwkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworCQkJYW1oZXZjX3N0b3AoKTsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQl9CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9IGVsc2UgaWYgKGRlY19zdGF0dXMgPT0gQU9NX0RFQ09ERV9PVkVSX1NJWkUpIHsKKwkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwgImF2MSAgZGVjb2RlIG92ZXJzaXplICEhXG4iKTsKKwkJLypkZWJ1ZyB8PSAoQVYxX0RFQlVHX0RJU19MT0NfRVJST1JfUFJPQyB8CisJCQlBVjFfREVCVUdfRElTX1NZU19FUlJPUl9QUk9DKTsqLworCQlody0+ZmF0YWxfZXJyb3IgfD0gREVDT0RFUl9GQVRBTF9FUlJPUl9TSVpFX09WRVJGTE9XOworCQlody0+cHJvY2Vzc19idXN5ID0gMDsKKwkJaWYgKGh3LT5tX2luc19mbGFnKQorCQkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCW9idV90eXBlID0gbG9hZF9wYXJhbShodywgJmh3LT5hb21fcGFyYW0sIGRlY19zdGF0dXMpOworCWlmIChvYnVfdHlwZSA8IDApIHsKKwkJaHctPnByb2Nlc3NfYnVzeSA9IDA7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAob2J1X3R5cGUgPT0gT0JVX1NFUVVFTkNFX0hFQURFUikgeworCQlpbnQgbmV4dF9sY3Vfc2l6ZTsKKworCQlhdjFfYnVmbWdyX3Byb2Nlc3MoaHctPnBiaSwgJmh3LT5hb21fcGFyYW0sIDAsIG9idV90eXBlKTsKKworCQlpZiAoKGh3LT5tYXhfcGljX3cgPCBody0+YW9tX3BhcmFtLnAubWF4X2ZyYW1lX3dpZHRoKSB8fAorCQkJKGh3LT5tYXhfcGljX2ggPCBody0+YW9tX3BhcmFtLnAubWF4X2ZyYW1lX2hlaWdodCkpIHsKKwkJCWF2MV9wcmludChodywgMCwgIiVzLCBtYXggc2l6ZSBjaGFuZ2UgKCVkLCAlZCkgLT4gKCVkLCAlZClcbiIsCisJCQkJX19mdW5jX18sIGh3LT5tYXhfcGljX3csIGh3LT5tYXhfcGljX2gsCisJCQkJaHctPmFvbV9wYXJhbS5wLm1heF9mcmFtZV93aWR0aCwgaHctPmFvbV9wYXJhbS5wLm1heF9mcmFtZV9oZWlnaHQpOworCisJCQl2YXYxX21tdV9tYXBfZnJlZShodyk7CisKKwkJCWh3LT5tYXhfcGljX3cgPSBody0+YW9tX3BhcmFtLnAubWF4X2ZyYW1lX3dpZHRoOworCQkJaHctPm1heF9waWNfaCA9IGh3LT5hb21fcGFyYW0ucC5tYXhfZnJhbWVfaGVpZ2h0OworCQkJaHctPmluaXRfcGljX3cgPSBody0+bWF4X3BpY193OworCQkJaHctPmluaXRfcGljX2ggPSBody0+bWF4X3BpY19oOworCQkJaHctPnBiaS0+ZnJhbWVfd2lkdGggPSBody0+aW5pdF9waWNfdzsKKwkJCWh3LT5wYmktPmZyYW1lX2hlaWdodCA9IGh3LT5pbml0X3BpY19oOworCisJCQl2YXYxX21tdV9tYXBfYWxsb2MoaHcpOworCisJCQlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hMKSAmJgorCQkJCShnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpICE9IDB4MTApKSB7CisJCQkJV1JJVEVfVlJFRyhIRVZDX1NBT19NTVVfRE1BX0NUUkwsIGh3LT5mcmFtZV9tbXVfbWFwX3BoeV9hZGRyKTsKKwkJCX0KKyNpZmRlZiBBT01fQVYxX01NVV9EVworCQkJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShodykgJiAweDIwKSB7CisJCQkJV1JJVEVfVlJFRyhIRVZDX1NBT19NTVVfRE1BX0NUUkwyLCBody0+ZHdfZnJhbWVfbW11X21hcF9waHlfYWRkcik7CisJCQkJLy9kZWZhdWx0IG9mIDB4ZmZmZmZmZmYgd2lsbCBkaXNhYmxlIGR3CisJCQkJV1JJVEVfVlJFRyhIRVZDX1NBT19ZX1NUQVJUX0FERFIsIDApOworCQkJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ19TVEFSVF9BRERSLCAwKTsKKwkJCX0KKyNlbmRpZgorCisJCQkvKnY0bDIgYWxsb2MgbmV3IG12IHdoZW4gbWF4IHNpemUgY2hhbmdlZCAqLworCQkJaWYgKGh3LT5pc191c2VkX3Y0bCAmJiBJU184S19TSVpFKGh3LT5tYXhfcGljX3csIGh3LT5tYXhfcGljX2gpKSB7CisJCQkJLyogbm93IGxlc3MgdGhhbiA4ayB1c2UgZml4IG12IGJ1ZiBzaXplICovCisJCQkJaWYgKGh3LT5waWNfbGlzdF9pbml0X2RvbmUpIHsKKwkJCQkJaWYgKGluaXRfbXZfYnVmX2xpc3QoaHcpIDwgMCkKKwkJCQkJCXByX2VycigiJXM6ICEhISFFcnJvciwgcmVpbml0X212X2J1Zl9saXN0IGZhaWxcbiIsIF9fZnVuY19fKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQliaXRfZGVwdGhfbHVtYSA9IGh3LT5hb21fcGFyYW0ucC5iaXRfZGVwdGg7CisJCWJpdF9kZXB0aF9jaHJvbWEgPSBody0+YW9tX3BhcmFtLnAuYml0X2RlcHRoOworCQlody0+ZmlsbV9ncmFpbl9wcmVzZW50ID0gaHctPmFvbV9wYXJhbS5wLmZpbG1fZ3JhaW5fcHJlc2VudF9mbGFnOworCisJCW5leHRfbGN1X3NpemUgPSAoKGh3LT5hb21fcGFyYW0ucC5zZXFfZmxhZ3MgPj4gNikgJiAweDEpID8gMTI4IDogNjQ7CisJCQlody0+dmlkZW9fc2lnbmFsX3R5cGUgPSAoaHctPmFvbV9wYXJhbS5wLnZpZGVvX3NpZ25hbF90eXBlIDw8IDE2CisJCQl8IGh3LT5hb21fcGFyYW0ucC5jb2xvcl9kZXNjcmlwdGlvbik7CisKKwkJaWYgKG5leHRfbGN1X3NpemUgIT0gaHctPmN1cnJlbnRfbGN1X3NpemUpIHsKKwkJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCQkJIiAjIyBsY3Vfc2l6ZSBjaGFuZ2VkIGZyb20gJWQgdG8gJWRcbiIsCisJCQkJaHctPmN1cnJlbnRfbGN1X3NpemUsIG5leHRfbGN1X3NpemUpOworCQkJCWh3LT5jdXJyZW50X2xjdV9zaXplID0gbmV4dF9sY3Vfc2l6ZTsKKwkJfQorCisJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCQkiQU9NX0FWMV9TRVFfSEVBRF9QQVJTRVJfRE9ORSwgc2VhcmNoIGhlYWQgLi4uXG4iKTsKKwkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCBBT01fQVYxX1NFQVJDSF9IRUFEKTsKKworCQlody0+cHJvY2Vzc19idXN5ID0gMDsKKwkJaHctPmhhc19zZXF1ZW5jZSA9IDE7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9USFJFQURfSEVBRF9FTkQpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKGh3LT5pc191c2VkX3Y0bCkgeworCQlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisKKwkJaHctPmZyYW1lX3dpZHRoID0gaHctPmNvbW1vbi5zZXFfcGFyYW1zLm1heF9mcmFtZV93aWR0aDsKKwkJaHctPmZyYW1lX2hlaWdodCA9IGh3LT5jb21tb24uc2VxX3BhcmFtcy5tYXhfZnJhbWVfaGVpZ2h0OworCisJCWlmIChody0+ZnJhbWVfd2lkdGggPT0gMCB8fCBody0+ZnJhbWVfaGVpZ2h0ID09IDApIHsKKwkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ESVNDQVJEX0RBVEE7CisJCQlody0+cHJvY2Vzc19idXN5ID0gMDsKKwkJCWFtaGV2Y19zdG9wKCk7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCisJCWlmICghdjRsX3Jlc19jaGFuZ2UoaHcpKSB7CisJCQlpZiAoY3R4LT5wYXJhbV9zZXRzX2Zyb21fdWNvZGUgJiYgIWh3LT52NGxfcGFyYW1zX3BhcnNlZCkgeworCQkJCXN0cnVjdCBhbWxfdmRlY19wc19pbmZvcyBwczsKKwkJCQlzdHJ1Y3QgdmRlY19jb21wX2J1Zl9pbmZvIGNvbXA7CisKKwkJCQlwcl9pbmZvKCJzZXQgdWNvZGUgcGFyc2VcbiIpOworCisJCQkJY3R4LT5maWxtX2dyYWluX3ByZXNlbnQgPSBody0+ZmlsbV9ncmFpbl9wcmVzZW50OworCQkJCWlmIChjdHgtPmZpbG1fZ3JhaW5fcHJlc2VudCAmJgorCQkJCQkhZGlzYWJsZV9mZyAmJgorCQkJCQkoZ2V0X2NwdV9tYWpvcl9pZCgpID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TNCB8fAorCQkJCQlnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1M0RCkpIHsKKyNpZmRlZiBBT01fQVYxX01NVV9EVworCQkJCQljdHgtPmNvbmZpZy5wYXJtLmRlYy5jZmcuZG91YmxlX3dyaXRlX21vZGUgPSAweDIxOworCQkJCQlwcl9pbmZvKCJBVjEgaGFzIGZnLCB1c2UgZHcgMHgyMSFcbiIpOworCQkJCQlpZiAoaHctPmR3X2ZyYW1lX21tdV9tYXBfYWRkciA9PSBOVUxMKSB7CisJCQkJCQl1MzIgbW11X21hcF9zaXplID0gdmFvbV9kd19mcmFtZV9tbXVfbWFwX3NpemUoaHcpOworCQkJCQkJaHctPmR3X2ZyYW1lX21tdV9tYXBfYWRkciA9CisJCQkJCQkJZG1hX2FsbG9jX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQkJCQkJbW11X21hcF9zaXplLAorCQkJCQkJCQkmaHctPmR3X2ZyYW1lX21tdV9tYXBfcGh5X2FkZHIsIEdGUF9LRVJORUwpOworCQkJCQkJaWYgKGh3LT5kd19mcmFtZV9tbXVfbWFwX2FkZHIgPT0gTlVMTCkgeworCQkJCQkJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvYyBjb3VudF9idWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJCQkJCQlyZXR1cm4gLTE7CisJCQkJCQl9CisJCQkJCQltZW1zZXQoaHctPmR3X2ZyYW1lX21tdV9tYXBfYWRkciwgMCwgbW11X21hcF9zaXplKTsKKwkJCQkJfQorI2VuZGlmCisJCQkJfQorCQkJCWlmIChnZXRfdmFsaWRfZG91YmxlX3dyaXRlX21vZGUoaHcpICE9IDE2KSB7CisJCQkJCXZhdjFfZ2V0X2NvbXBfYnVmX2luZm8oaHcsICZjb21wKTsKKwkJCQkJdmRlY192NGxfc2V0X2NvbXBfYnVmX2luZm8oY3R4LCAmY29tcCk7CisJCQkJfQorCQkJCXZhdjFfZ2V0X3BzX2luZm8oaHcsICZwcyk7CisJCQkJLypub3RpY2UgdGhlIHY0bDIgY29kZWMuKi8KKwkJCQl2ZGVjX3Y0bF9zZXRfcHNfaW5mb3MoY3R4LCAmcHMpOworCQkJCWh3LT52NGxfcGFyYW1zX3BhcnNlZCA9IHRydWU7CisJCQkJd29ya19zcGFjZV9zaXplX3VwZGF0ZShodyk7CisJCQkJaHctPnBvc3Rwcm9jX2RvbmUgPSAwOworCQkJCWh3LT5wcm9jZXNzX2J1c3kgPSAwOworCQkJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9USFJFQURfSEVBRF9FTkQpOworCQkJCWRlY19hZ2Fpbl9wcm9jZXNzKGh3KTsKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQl9IGVsc2UgeworCQkJCXN0cnVjdCB2ZGVjX3BpY19pbmZvIHBpYzsKKworCQkJCWlmICghaHctPnBpY19saXN0X2luaXRfZG9uZSkgeworCQkJCQl2ZGVjX3Y0bF9nZXRfcGljX2luZm8oY3R4LCAmcGljKTsKKwkJCQkJaHctPnVzZWRfYnVmX251bSA9IHBpYy5kcGJfZnJhbWVzICsKKwkJCQkJCXBpYy5kcGJfbWFyZ2luOworCisJCQkJCWlmIChJU180S19TSVpFKGh3LT5pbml0X3BpY193LCBody0+aW5pdF9waWNfaCkpIHsKKwkJCQkJCWh3LT51c2VkX2J1Zl9udW0gPSBNQVhfQlVGX05VTV9MRVNTICsgcGljLmRwYl9tYXJnaW47CisJCQkJCQlpZiAoaHctPnVzZWRfYnVmX251bSA+IFJFRl9GUkFNRVNfNEspCisJCQkJCQkJaHctPm12X2J1Zl9tYXJnaW4gPSBody0+dXNlZF9idWZfbnVtIC0gUkVGX0ZSQU1FU180SyArIDE7CisJCQkJCX0KKworCQkJCQlpZiAoSVNfOEtfU0laRShody0+bWF4X3BpY193LCBody0+bWF4X3BpY19oKSkgeworCQkJCQkJaHctPmRvdWJsZV93cml0ZV9tb2RlID0gNDsKKwkJCQkJCWh3LT51c2VkX2J1Zl9udW0gPSBNQVhfQlVGX05VTV9MRVNTOworCQkJCQkJaWYgKGh3LT51c2VkX2J1Zl9udW0gPiBSRUZfRlJBTUVTXzRLKQorCQkJCQkJCWh3LT5tdl9idWZfbWFyZ2luID0gaHctPnVzZWRfYnVmX251bSAtIFJFRl9GUkFNRVNfNEsgKyAxOworCQkJCQkJaWYgKCgoaHctPm1heF9waWNfdyAlIDY0KSAhPSAwKSAmJgorCQkJCQkJCShod190b192ZGVjKGh3KS0+Y2FudmFzX21vZGUgIT0gQ0FOVkFTX0JMS01PREVfTElORUFSKSkKKwkJCQkJCQlody0+bWVtX21hcF9tb2RlID0gMjsKKwkJCQkJCWF2MV9wcmludChodywgMCwKKwkJCQkJCQkiZm9yY2UgOGsgZG91YmxlIHdyaXRlIDQsIG1lbV9tYXBfbW9kZSAlZFxuIiwgaHctPm1lbV9tYXBfbW9kZSk7CisJCQkJCX0KKworCQkJCQlpZiAoaHctPnVzZWRfYnVmX251bSA+IE1BWF9CVUZfTlVNKQorCQkJCQkJaHctPnVzZWRfYnVmX251bSA9IE1BWF9CVUZfTlVNOworCisJCQkJCWluaXRfcGljX2xpc3QoaHcpOworCQkJCQlpbml0X3BpY19saXN0X2h3KGh3KTsKKyNpZm5kZWYgTVZfVVNFX0ZJWEVEX0JVRgorCQkJCQlpZiAoaW5pdF9tdl9idWZfbGlzdChodykgPCAwKSB7CisJCQkJCQlwcl9lcnIoIiVzOiAhISEhRXJyb3IsIGluaXRfbXZfYnVmX2xpc3QgZmFpbFxuIiwgX19mdW5jX18pOworCQkJCQl9CisjZW5kaWYKKwkJCQkJaHctPnBpY19saXN0X2luaXRfZG9uZSA9IHRydWU7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaHctPnBvc3Rwcm9jX2RvbmUgPSAwOworCQkJaHctPnByb2Nlc3NfYnVzeSA9IDA7CisJCQlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9JU1JfVEhSRUFEX0hFQURfRU5EKTsKKwkJCWRlY19hZ2Fpbl9wcm9jZXNzKGh3KTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCX0KKworI2lmbmRlZiBVU0VfREVDX1BJQ19FTkQKKwkJLy9pZiAocGJpLT53YWl0X2J1ZikgeworCSAgICBpZiAocGJpLT5idWZtZ3JfcHJvY19jb3VudCA+IDApIHsKKwkJICAgIGlmIChSRUFEX1ZSRUcoUElDX0VORF9MQ1VfQ09VTlQpICE9IDApIHsKKwkJCSAgICBody0+ZnJhbWVfZGVjb2RlZCA9IDE7CisJCQkJLyoKKwkJCSAgICBJbiBjIG1vZHVsZSwgbXVsdGkgb2J1cyBhcmUgcHV0IGluIG9uZSBwYWNrZXQsIHdoaWNoIGlzIGRlY29kZWQKKwkJCSAgICB3aXRoIGF2MV9yZWNlaXZlX2NvbXByZXNzZWRfZGF0YSgpLgorCQkJICAgIEZvciBTVFJFQU1fTU9ERSBvciBTSU5HTEVfTU9ERSwgdGhlcmUgaXMgbm8gcGFja2V0IGJvdW5kYXJ5LAorCQkJICAgIHdlIGFzc3VtZSBlYWNoIHBhY2tldCBtdXN0IGFuZCBvbmx5IGluY2x1ZGUgb25lIHBpY3R1cmUgb2YgZGF0YSAoTENVcykKKwkJCQkgb3IgY20tPnNob3dfZXhpc3RpbmdfZnJhbWUgaXMgMQorCQkJCSovCisJCQkJaWYgKGNtLT5jdXJfZnJhbWUpCisJCQkJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsICJEZWNvZGluZyBkb25lIChpbmRleCAlZClcbiIsCisJCQkJCQljbS0+Y3VyX2ZyYW1lPyBjbS0+Y3VyX2ZyYW1lLT5idWYuaW5kZXg6LTEpOworCQkJfQorCQl9CisjZW5kaWYKKyNpZiAxCisvKmRlZiBDSEVDS19PQlVfUkVEVU5EQU5UX0ZSQU1FX0hFQURFUiovCisJICAgIGlmIChkZWJ1ZyAmIEFPTV9ERUJVR19CVUZNR1JfT05MWSkgeworCQkgICAgaWYgKFJFQURfVlJFRyhQSUNfRU5EX0xDVV9DT1VOVCkgIT0gMCkKKwkJCSAgICBody0+b2J1X2ZyYW1lX2ZyYW1lX2hlYWRfY29tZV9hZnRlcl90aWxlID0gMDsKKworCQkgICAgaWYgKG9idV90eXBlID09IE9CVV9GUkFNRV9IRUFERVIgfHwKKwkJCSAgb2J1X3R5cGUgPT0gT0JVX0ZSQU1FKSB7CisJCQkgIGh3LT5vYnVfZnJhbWVfZnJhbWVfaGVhZF9jb21lX2FmdGVyX3RpbGUgPSAxOworCQkJfSBlbHNlIGlmIChvYnVfdHlwZSA9PSBPQlVfUkVEVU5EQU5UX0ZSQU1FX0hFQURFUiAmJgorCQkJCWh3LT5vYnVfZnJhbWVfZnJhbWVfaGVhZF9jb21lX2FmdGVyX3RpbGUgPT0gMCkgeworCQkJCWlmIChody0+ZnJhbWVfZGVjb2RlZCA9PSAxKSB7CisJCQkJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsCisJCQkJCQkiV2FybmluZywgT0JVX1JFRFVOREFOVF9GUkFNRV9IRUFERVIgY29tZSB3aXRob3V0IE9CVV9GUkFNRSBvciBPQlVfRlJBTUVfSEVBRFxuIik7CisJCQkJCWh3LT5mcmFtZV9kZWNvZGVkID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKyNlbmRpZgorCWlmIChody0+ZnJhbWVfZGVjb2RlZCkKKwkJaHctPm9uZV9jb21wcmVzc2VkX2RhdGFfZG9uZSA9IDE7CisKKwlpZiAoaHctPm1faW5zX2ZsYWcpCisJCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisKKwlpZiAoaHctPnByb2Nlc3Nfc3RhdGUgIT0gUFJPQ19TVEFURV9TRU5EQUdBSU4KKwkJKSB7CisJICAgIGlmIChody0+b25lX2NvbXByZXNzZWRfZGF0YV9kb25lKSB7CisJICAgICAgICBhdjFfcG9zdHByb2MoaHcpOworCSAgICAgICAgYXYxX3JlbGVhc2VfYnVmcyhodyk7CisjaWZuZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwkgICAgICAgIHB1dF91bl91c2VkX212X2J1ZnMoaHcpOworI2VuZGlmCisJICAgIH0KKwl9CisKKwlpZiAoaHctPm9uZV9wYWNrYWdlX2ZyYW1lX2NudCkgeworCQlpZiAoZ2V0X2ZyZWVfYnVmX2NvdW50KGh3KSA8PSAwKSB7CisJCQlody0+ZGVjX3Jlc3VsdCA9IEFPTV9BVjFfUkVTVUxUX05FRURfTU9SRV9CVUZGRVI7CisJCQlody0+Y3VyX29idV90eXBlID0gb2J1X3R5cGU7CisJCQlody0+cHJvY2Vzc19idXN5ID0gMDsKKwkJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9USFJFQURfSEVBRF9FTkQpOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKwl9CisJaHctPm9uZV9wYWNrYWdlX2ZyYW1lX2NudCsrOworCisJcmV0ID0gYXYxX2NvbnRpbnVlX2RlY29kaW5nKGh3LCBvYnVfdHlwZSk7CisJaHctPnBvc3Rwcm9jX2RvbmUgPSAwOworCWh3LT5wcm9jZXNzX2J1c3kgPSAwOworCisJaWYgKGh3LT5tX2luc19mbGFnKSB7CisJCWlmIChyZXQgPj0gMCkKKwkJCXN0YXJ0X3Byb2Nlc3NfdGltZShodyk7CisJCWVsc2UgeworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisJCQlhbWhldmNfc3RvcCgpOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCX0KKwl9CisJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX1RIUkVBRF9IRUFEX0VORCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgdmF2MV9pc3IoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgZGVjX3N0YXR1czsKKwlzdHJ1Y3QgQVYxSFdfcyAqaHcgPSAoc3RydWN0IEFWMUhXX3MgKilkYXRhOworCS8vc3RydWN0IEFWMV9Db21tb25fcyAqY29uc3QgY20gPSAmaHctPmNvbW1vbjsKKwl1aW50IGRlYnVnX3RhZzsKKworCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTUJPWDBfQ0xSX1JFRywgMSk7CisKKwlkZWNfc3RhdHVzID0gUkVBRF9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcpICYgMHhmZjsKKworCWlmIChkZWNfc3RhdHVzID09IEFPTV9BVjFfRlJBTUVfSEVBRF9QQVJTRVJfRE9ORSB8fAorCQlkZWNfc3RhdHVzID09IEFPTV9BVjFfU0VRX0hFQURfUEFSU0VSX0RPTkUgfHwKKwkJZGVjX3N0YXR1cyA9PSBBT01fQVYxX0ZSQU1FX1BBUlNFUl9ET05FKSB7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9IRUFEX0RPTkUpOworCX0KKwllbHNlIGlmIChkZWNfc3RhdHVzID09IEFPTV9BVjFfREVDX1BJQ19FTkQgfHwKKwkJZGVjX3N0YXR1cyA9PSBBT01fTkFMX0RFQ09ERV9ET05FKSB7CisJCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9QSUNfRE9ORSk7CisJfQorCWlmICghaHcpCisJCXJldHVybiBJUlFfSEFORExFRDsKKwlpZiAoaHctPmluaXRfZmxhZyA9PSAwKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJaWYgKGh3LT5wcm9jZXNzX2J1c3kpIHsvKm9uIHByb2Nlc3MuKi8KKwkJcHJfZXJyKCJlcnI6ICVzLCBwcm9jZXNzIGJ1c3lcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy1kZWNvZGVfc3RhdGUiLCBkZWNfc3RhdHVzKTsKKworCWh3LT5kZWNfc3RhdHVzID0gZGVjX3N0YXR1czsKKwlody0+cHJvY2Vzc19idXN5ID0gMTsKKwlpZiAoZGVidWcgJiBBVjFfREVCVUdfQlVGTUdSKQorCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19CVUZNR1IsCisJCQkiYXYxIGlzciAoJWQpIGRlYyBzdGF0dXMgID0gMHgleCAoMHgleCksIGxjdSAweCV4IHNoaWZ0Ynl0ZSAweCV4IHNoaWZ0ZWRfZGF0YSAweCV4ICgleCAleCBsZXYgJXgsIHdyICV4LCByZCAleCkgbG9nICV4XG4iLAorCQkJaXJxLAorCQkJZGVjX3N0YXR1cywgUkVBRF9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcpLAorCQkJUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0xDVV9TVEFSVCksCisJCQlSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NISUZURURfREFUQSksCisJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fU1RBUlRfQUREUiksCisJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fRU5EX0FERFIpLAorCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0xFVkVMKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9XUl9QVFIpLAorCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1JEX1BUUiksCisjaWZkZWYgREVCVUdfVUNPREVfTE9HCisJCQlSRUFEX1ZSRUcoSEVWQ19EQkdfTE9HX0FEUikKKyNlbHNlCisJCQkwCisjZW5kaWYKKwkJKTsKKyNpZmRlZiBERUJVR19VQ09ERV9MT0cKKwlpZiAoKHVkZWJ1Z19mbGFnICYgMHg4KSAmJgorCQkoaHctPnVjb2RlX2xvZ19hZGRyICE9IDApICYmCisJCShSRUFEX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRykgJiAweDEwMCkpIHsKKwkgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJdW5zaWduZWQgc2hvcnQgKmxvZ19hZHIgPQorCQkJKHVuc2lnbmVkIHNob3J0ICopaHctPnVjb2RlX2xvZ19hZGRyOworCQlsb2NrX2J1ZmZlcl9wb29sKGh3LT5wYmktPmNvbW1vbi5idWZmZXJfcG9vbCwgZmxhZ3MpOworCQl3aGlsZSAoKihsb2dfYWRyICsgMykpIHsKKwkJCXByX2luZm8oImRiZyUwNHggJTA0eCAlMDR4ICUwNHhcbiIsCisJCQkJKihsb2dfYWRyICsgMyksICoobG9nX2FkciArIDIpLCAqKGxvZ19hZHIgKyAxKSwgKihsb2dfYWRyICsgMCkKKwkJCQkpOworCQkJbG9nX2FkciArPSA0OworCQl9CisJCXVubG9ja19idWZmZXJfcG9vbChody0+cGJpLT5jb21tb24uYnVmZmVyX3Bvb2wsIGZsYWdzKTsKKwl9CisjZW5kaWYKKwlkZWJ1Z190YWcgPSBSRUFEX0hSRUcoREVCVUdfUkVHMSk7CisJaWYgKGRlYnVnX3RhZyAmIDB4MTAwMDApIHsKKwkJcHJfaW5mbygiTE1FTTx0YWcgJXg+OlxuIiwgUkVBRF9IUkVHKERFQlVHX1JFRzEpKTsKKwkJZm9yIChpID0gMDsgaSA8IDB4NDAwOyBpICs9IDQpIHsKKwkJCWludCBpaTsKKwkJCWlmICgoaSAmIDB4ZikgPT0gMCkKKwkJCQlwcl9pbmZvKCIlMDN4OiAiLCBpKTsKKwkJCWZvciAoaWkgPSAwOyBpaSA8IDQ7IGlpKyspIHsKKwkJCQlwcl9pbmZvKCIlMDR4ICIsCisJCQkJCSAgIGh3LT5sbWVtX3B0cltpICsgMyAtIGlpXSk7CisJCQl9CisJCQlpZiAoKChpICsgaWkpICYgMHhmKSA9PSAwKQorCQkJCXByX2luZm8oIlxuIik7CisJCX0KKwkJaWYgKCgodWRlYnVnX3BhdXNlX3BvcyAmIDB4ZmZmZikKKwkJCT09IChkZWJ1Z190YWcgJiAweGZmZmYpKSAmJgorCQkJKHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4ID09IDAgfHwKKwkJCXVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4ID09IGh3LT5yZXN1bHRfZG9uZV9jb3VudCkgJiYKKwkJCSh1ZGVidWdfcGF1c2VfdmFsID09IDAgfHwKKwkJCXVkZWJ1Z19wYXVzZV92YWwgPT0gUkVBRF9IUkVHKERFQlVHX1JFRzIpKSkgeworCQkJdWRlYnVnX3BhdXNlX3BvcyAmPSAweGZmZmY7CisJCQlody0+dWNvZGVfcGF1c2VfcG9zID0gdWRlYnVnX3BhdXNlX3BvczsKKwkJfQorCQllbHNlIGlmIChkZWJ1Z190YWcgJiAweDIwMDAwKQorCQkJaHctPnVjb2RlX3BhdXNlX3BvcyA9IDB4ZmZmZmZmZmY7CisJCWlmIChody0+dWNvZGVfcGF1c2VfcG9zKQorCQkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwkJZWxzZQorCQkJV1JJVEVfSFJFRyhERUJVR19SRUcxLCAwKTsKKwl9IGVsc2UgaWYgKGRlYnVnX3RhZyAhPSAwKSB7CisJCXByX2luZm8oCisJCQkiZGJnJXg6ICV4IGxjdSAleFxuIiwgUkVBRF9IUkVHKERFQlVHX1JFRzEpLAorCQkJICAgUkVBRF9IUkVHKERFQlVHX1JFRzIpLAorCQkJICAgUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0xDVV9TVEFSVCkpOworCisJCWlmICgoKHVkZWJ1Z19wYXVzZV9wb3MgJiAweGZmZmYpCisJCQk9PSAoZGVidWdfdGFnICYgMHhmZmZmKSkgJiYKKwkJCSh1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeCA9PSAwIHx8CisJCQl1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeCA9PSBody0+cmVzdWx0X2RvbmVfY291bnQpICYmCisJCQkodWRlYnVnX3BhdXNlX3ZhbCA9PSAwIHx8CisJCQl1ZGVidWdfcGF1c2VfdmFsID09IFJFQURfSFJFRyhERUJVR19SRUcyKSkpIHsKKwkJCXVkZWJ1Z19wYXVzZV9wb3MgJj0gMHhmZmZmOworCQkJaHctPnVjb2RlX3BhdXNlX3BvcyA9IHVkZWJ1Z19wYXVzZV9wb3M7CisJCX0KKwkJaWYgKGh3LT51Y29kZV9wYXVzZV9wb3MpCisJCQlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCQllbHNlCisJCQlXUklURV9IUkVHKERFQlVHX1JFRzEsIDApOworCQlody0+cHJvY2Vzc19idXN5ID0gMDsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworICAgIC8vaWYgKFJFQURfVlJFRyhIRVZDX0ZHX1NUQVRVUykgPT0gQU9NX0FWMV9GR1NfUEFSQU0pIHsKKwlpZiAoaHctPmRlY19zdGF0dXMgPT0gQU9NX0FWMV9GR1NfUEFSQU0pIHsKKwkJdWludDMyX3Qgc3RhdHVzX3ZhbCA9IFJFQURfVlJFRyhIRVZDX0ZHX1NUQVRVUyk7CisJCVdSSVRFX1ZSRUcoSEVWQ19GR19TVEFUVVMsIEFPTV9BVjFfRkdTX1BBUkFNX0NPTlQpOworCQlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIEFPTV9BVjFfRkdTX1BBUkFNX0NPTlQpOworCQkJLy8gQml0WzExXSAtIDAgUmVhZCwgMSAtIFdyaXRlCisJCQkvLyBCaXRbMTA6OF0gLSBmaWxtX2dyYWluX3BhcmFtc19yZWZfaWR4IC8vIEZvciBXcml0ZSByZXF1ZXN0CisJCWlmICgoc3RhdHVzX3ZhbCA+PiAxMSkgJiAweDEpIHsKKwkJCXVpbnQzMl90IGZpbG1fZ3JhaW5fcGFyYW1zX3JlZl9pZHggPSAoc3RhdHVzX3ZhbCA+PiA4KSAmIDB4NzsKKwkJCWNvbmZpZ19maWxtX2dyYWluX3JlZyhodywgZmlsbV9ncmFpbl9wYXJhbXNfcmVmX2lkeCk7CisJCX0KKwkJZWxzZQorCQkJcmVhZF9maWxtX2dyYWluX3JlZyhodyk7CisKKwkJZmlsbV9ncmFpbl90YXNrX3dha2V1cChodyk7CisKKwkJaHctPnByb2Nlc3NfYnVzeSA9IDA7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAoIWh3LT5tX2luc19mbGFnKSB7CisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX0JVRk1HUiwKKwkJCSJlcnJvciBmbGFnID0gJWRcbiIsIGh3LT5lcnJvcl9mbGFnKTsKKwkJaWYgKGh3LT5lcnJvcl9mbGFnID09IDEpIHsKKwkJCWh3LT5lcnJvcl9mbGFnID0gMjsKKwkJCWh3LT5wcm9jZXNzX2J1c3kgPSAwOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9IGVsc2UgaWYgKGh3LT5lcnJvcl9mbGFnID09IDMpIHsKKwkJCWh3LT5wcm9jZXNzX2J1c3kgPSAwOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisJCWlmIChnZXRfZnJlZV9idWZfY291bnQoaHcpIDw9IDApIHsKKwkJCS8qCisJCQlpZiAoaHctPndhaXRfYnVmID09IDApCisJCQlwcl9pbmZvKCJzZXQgd2FpdF9idWYgdG8gMVxyXG4iKTsKKwkJCSovCisJCQlody0+d2FpdF9idWYgPSAxOworCQkJaHctPnByb2Nlc3NfYnVzeSA9IDA7CisJCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19CVUZNR1IsCisJCQkJImZyZWUgYnVmIG5vdCBlbm91Z2ggPSAlZFxuIiwKKwkJCQlnZXRfZnJlZV9idWZfY291bnQoaHcpKTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCX0KKwlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9JU1JfRU5EKTsKKwlyZXR1cm4gSVJRX1dBS0VfVEhSRUFEOworfQorCitzdGF0aWMgdm9pZCBhdjFfc2V0X2NsayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IEFWMUhXX3MgKmh3ID0gY29udGFpbmVyX29mKHdvcmssCisJCXN0cnVjdCBBVjFIV19zLCBzZXRfY2xrX3dvcmspOworCWludCBmcHMgPSA5NjAwMCAvIGh3LT5mcmFtZV9kdXI7CisKKwlpZiAoaGV2Y19zb3VyY2VfY2hhbmdlZChWRk9STUFUX0FWMSwKKwkJZnJhbWVfd2lkdGgsIGZyYW1lX2hlaWdodCwgZnBzKSA+IDApCisJCWh3LT5zYXZlZF9yZXNvbHV0aW9uID0gZnJhbWVfd2lkdGggKgorCQlmcmFtZV9oZWlnaHQgKiBmcHM7Cit9CisKK3N0YXRpYyB2b2lkIHZhdjFfcHV0X3RpbWVyX2Z1bmMoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworCXN0cnVjdCBBVjFIV19zICpodyA9IGNvbnRhaW5lcl9vZih0aW1lciwKKwkJc3RydWN0IEFWMUhXX3MsIHRpbWVyKTsKKwl1aW50OF90IGVtcHR5X2ZsYWc7CisJdW5zaWduZWQgaW50IGJ1Zl9sZXZlbDsKKworCWVudW0gcmVjZXZpdmVyX3N0YXJ0X2Ugc3RhdGUgPSBSRUNFSVZFUl9JTkFDVElWRTsKKworCWlmIChody0+bV9pbnNfZmxhZykgeworCQlpZiAoaHdfdG9fdmRlYyhodyktPm5leHRfc3RhdHVzCisJCQk9PSBWREVDX1NUQVRVU19ESVNDT05ORUNURUQpIHsKKwkJCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisJCQlpZiAoIWh3LT5pc191c2VkX3Y0bCB8fCBjdHgtPmlzX3N0cmVhbV9vZmYpIHsKKwkJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRk9SQ0VfRVhJVDsKKwkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCQlwcl9kZWJ1ZygidmRlYyByZXF1ZXN0ZWQgdG8gYmUgZGlzY29ubmVjdGVkXG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9CisJaWYgKGh3LT5pbml0X2ZsYWcgPT0gMCkgeworCQlpZiAoaHctPnN0YXQgJiBTVEFUX1RJTUVSX0FSTSkgeworCQkJdGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgUFVUX0lOVEVSVkFMOworCQkJYWRkX3RpbWVyKCZody0+dGltZXIpOworCQl9CisJCXJldHVybjsKKwl9CisJaWYgKGh3LT5tX2luc19mbGFnID09IDApIHsKKwkJaWYgKHZmX2dldF9yZWNlaXZlcihody0+cHJvdmlkZXJfbmFtZSkpIHsKKwkJCXN0YXRlID0KKwkJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoaHctPnByb3ZpZGVyX25hbWUsCisJCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9RVVJFWV9TVEFURSwKKwkJCQkJTlVMTCk7CisJCQlpZiAoKHN0YXRlID09IFJFQ0VJVkVSX1NUQVRFX05VTEwpCisJCQkJfHwgKHN0YXRlID09IFJFQ0VJVkVSX1NUQVRFX05PTkUpKQorCQkJCXN0YXRlID0gUkVDRUlWRVJfSU5BQ1RJVkU7CisJCX0gZWxzZQorCQkJc3RhdGUgPSBSRUNFSVZFUl9JTkFDVElWRTsKKworCQllbXB0eV9mbGFnID0gKFJFQURfVlJFRyhIRVZDX1BBUlNFUl9JTlRfU1RBVFVTKSA+PiA2KSAmIDB4MTsKKwkJLyogZXJyb3Igd2F0Y2hkb2cgKi8KKwkJaWYgKGVtcHR5X2ZsYWcgPT0gMCkgeworCQkJLyogZGVjb2RlciBoYXMgaW5wdXQgKi8KKwkJCWlmICgoZGVidWcgJiBBVjFfREVCVUdfRElTX0xPQ19FUlJPUl9QUk9DKSA9PSAwKSB7CisKKwkJCQlidWZfbGV2ZWwgPSBSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fTEVWRUwpOworCQkJCS8qIHJlY2VpdmVyIGhhcyBubyBidWZmZXIgdG8gcmVjeWNsZSAqLworCQkJCWlmICgoc3RhdGUgPT0gUkVDRUlWRVJfSU5BQ1RJVkUpICYmCisJCQkJCShrZmlmb19pc19lbXB0eSgmaHctPmRpc3BsYXlfcSkgJiYKKwkJCQkJIGJ1Zl9sZXZlbCA+IDB4MjAwKQorCQkJCQkpIHsKKwkJCQkJCVdSSVRFX1ZSRUcKKwkJCQkJCShIRVZDX0FTU0lTVF9NQk9YMF9JUlFfUkVHLAorCQkJCQkJIDB4MSk7CisJCQkJfQorCQkJfQorCisJCX0KKwl9CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCWVsc2UgeworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19USU1FT1VUX0lORk8sICJ0aW1lb3V0ISEhc3RhcnRfcHJvY2Vzc190aW1lICVsZFxuIiwKKwkJCWh3LT5zdGFydF9wcm9jZXNzX3RpbWUpOworCQlpZiAoCisJCQkoZGVjb2RlX3RpbWVvdXRfdmFsID4gMCkgJiYKKwkJCShody0+c3RhcnRfcHJvY2Vzc190aW1lID4gMCkgJiYKKwkJCSgoMTAwMCAqIChqaWZmaWVzIC0gaHctPnN0YXJ0X3Byb2Nlc3NfdGltZSkgLyBIWikKKwkJCQk+IGRlY29kZV90aW1lb3V0X3ZhbCkKKwkJKSB7CisJCQlpbnQgY3VycmVudF9sY3VfaWR4ID0KKwkJCQlSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfTENVX1NUQVJUKQorCQkJCSYgMHhmZmZmZmY7CisJCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19USU1FT1VUX0lORk8sICJ0aW1lb3V0ISEhY3VycmVudF9sY3VfaWR4ID0gJXUgbGFzdF9sY3VfaWR4ID0gJXUgZGVjb2RlX3RpbWVvdXRfY291bnQgPSAlZFxuIiwKKwkJCQkJCWN1cnJlbnRfbGN1X2lkeCwgaHctPmxhc3RfbGN1X2lkeCwgaHctPmRlY29kZV90aW1lb3V0X2NvdW50KTsKKwkJCWlmIChody0+bGFzdF9sY3VfaWR4ID09IGN1cnJlbnRfbGN1X2lkeCkgeworCQkJCWlmIChody0+ZGVjb2RlX3RpbWVvdXRfY291bnQgPiAwKQorCQkJCQlody0+ZGVjb2RlX3RpbWVvdXRfY291bnQtLTsKKwkJCQlpZiAoaHctPmRlY29kZV90aW1lb3V0X2NvdW50ID09IDApIHsKKwkJCQkJaWYgKGlucHV0X2ZyYW1lX2Jhc2VkKAorCQkJCQkJaHdfdG9fdmRlYyhodykpIHx8CisJCQkJCShSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fTEVWRUwpID4gMHgyMDApKQorCQkJCQkJdGltZW91dF9wcm9jZXNzKGh3KTsKKwkJCQkJZWxzZSB7CisJCQkJCQlhdjFfcHJpbnQoaHcsIDAsCisJCQkJCQkJInRpbWVvdXQgJiBlbXB0eSwgYWdhaW5cbiIpOworCQkJCQkJZGVjX2FnYWluX3Byb2Nlc3MoaHcpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlzdGFydF9wcm9jZXNzX3RpbWUoaHcpOworCQkJCWh3LT5sYXN0X2xjdV9pZHggPSBjdXJyZW50X2xjdV9pZHg7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKworCWlmICgoaHctPnVjb2RlX3BhdXNlX3BvcyAhPSAwKSAmJgorCQkoaHctPnVjb2RlX3BhdXNlX3BvcyAhPSAweGZmZmZmZmZmKSAmJgorCQl1ZGVidWdfcGF1c2VfcG9zICE9IGh3LT51Y29kZV9wYXVzZV9wb3MpIHsKKwkJaHctPnVjb2RlX3BhdXNlX3BvcyA9IDA7CisJCVdSSVRFX0hSRUcoREVCVUdfUkVHMSwgMCk7CisJfQorI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlpZiAoZGVidWcgJiBBVjFfREVCVUdfRFVNUF9EQVRBKSB7CisJCWRlYnVnICY9IH5BVjFfREVCVUdfRFVNUF9EQVRBOworCQlhdjFfcHJpbnQoaHcsIDAsCisJCQkiJXM6IGNodW5rIHNpemUgMHgleCBvZmYgMHgleCBzdW0gMHgleFxuIiwKKwkJCV9fZnVuY19fLAorCQkJaHctPmRhdGFfc2l6ZSwKKwkJCWh3LT5kYXRhX29mZnNldCwKKwkJCWdldF9kYXRhX2NoZWNrX3N1bShodywgaHctPmRhdGFfc2l6ZSkKKwkJCSk7CisJCWR1bXBfZGF0YShodywgaHctPmRhdGFfc2l6ZSk7CisJfQorI2VuZGlmCisJaWYgKGRlYnVnICYgQVYxX0RFQlVHX0RVTVBfUElDX0xJU1QpIHsKKwkJLypkdW1wX3BpY19saXN0KGh3KTsqLworCQlhdjFfZHVtcF9zdGF0ZShod190b192ZGVjKGh3KSk7CisJCWRlYnVnICY9IH5BVjFfREVCVUdfRFVNUF9QSUNfTElTVDsKKwl9CisJaWYgKGRlYnVnICYgQVYxX0RFQlVHX1RSSUdfU0xJQ0VfU0VHTUVOVF9QUk9DKSB7CisJCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTUJPWDBfSVJRX1JFRywgMHgxKTsKKwkJZGVidWcgJj0gfkFWMV9ERUJVR19UUklHX1NMSUNFX1NFR01FTlRfUFJPQzsKKwl9CisJLyppZiAoZGVidWcgJiBBVjFfREVCVUdfSFdfUkVTRVQpIHsKKwl9Ki8KKworCWlmIChyYWRyICE9IDApIHsKKwkJaWYgKChyYWRyID4+IDI0KSAhPSAwKSB7CisJCQlpbnQgY291bnQgPSByYWRyID4+IDI0OworCQkJaW50IGFkciA9IHJhZHIgJiAweGZmZmZmZjsKKwkJCWludCBpOworCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCQkJcHJfaW5mbygiUkVBRF9WUkVHKCV4KT0leFxuIiwgYWRyK2ksIFJFQURfVlJFRyhhZHIraSkpOworCQl9IGVsc2UgaWYgKHJ2YWwgIT0gMCkgeworCQkJV1JJVEVfVlJFRyhyYWRyLCBydmFsKTsKKwkJCXByX2luZm8oIldSSVRFX1ZSRUcoJXgsJXgpXG4iLCByYWRyLCBydmFsKTsKKwkJfSBlbHNlCisJCQlwcl9pbmZvKCJSRUFEX1ZSRUcoJXgpPSV4XG4iLCByYWRyLCBSRUFEX1ZSRUcocmFkcikpOworCQlydmFsID0gMDsKKwkJcmFkciA9IDA7CisJfQorCWlmIChwb3Bfc2hvcnRzICE9IDApIHsKKwkJaW50IGk7CisJCXUzMiBzdW0gPSAwOworCisJCXByX2luZm8oInBvcCBzdHJlYW0gMHgleCBzaG9ydHNcclxuIiwgcG9wX3Nob3J0cyk7CisJCWZvciAoaSA9IDA7IGkgPCBwb3Bfc2hvcnRzOyBpKyspIHsKKwkJCXUzMiBkYXRhID0KKwkJCShSRUFEX0hSRUcoSEVWQ19TSElGVEVEX0RBVEEpID4+IDE2KTsKKwkJCVdSSVRFX0hSRUcoSEVWQ19TSElGVF9DT01NQU5ELAorCQkJKDE8PDcpfDE2KTsKKwkJCWlmICgoaSAmIDB4ZikgPT0gMCkKKwkJCQlwcl9pbmZvKCIlMDR4OiIsIGkpOworCQkJcHJfaW5mbygiJTA0eCAiLCBkYXRhKTsKKwkJCWlmICgoKGkgKyAxKSAmIDB4ZikgPT0gMCkKKwkJCQlwcl9pbmZvKCJcclxuIik7CisJCQlzdW0gKz0gZGF0YTsKKwkJfQorCQlwcl9pbmZvKCJcclxuc3VtID0gJXhcclxuIiwgc3VtKTsKKwkJcG9wX3Nob3J0cyA9IDA7CisJfQorCWlmIChkYmdfY21kICE9IDApIHsKKwkJaWYgKGRiZ19jbWQgPT0gMSkgeworCQkJdTMyIGRpc3BfbGFkZHI7CisKKwkJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYQkIgJiYKKwkJCQlnZXRfZG91YmxlX3dyaXRlX21vZGUoaHcpID09IDApIHsKKwkJCQlkaXNwX2xhZGRyID0KKwkJCQkJUkVBRF9WQ0JVU19SRUcoQUZCQ19CT0RZX0JBRERSKSA8PCA0OworCQkJfSBlbHNlIHsKKwkJCQlzdHJ1Y3QgY2FudmFzX3MgY3VyX2NhbnZhczsKKworCQkJCWNhbnZhc19yZWFkKChSRUFEX1ZDQlVTX1JFRyhWRDFfSUYwX0NBTlZBUzApCisJCQkJCSYgMHhmZiksICZjdXJfY2FudmFzKTsKKwkJCQlkaXNwX2xhZGRyID0gY3VyX2NhbnZhcy5hZGRyOworCQkJfQorCQkJcHJfaW5mbygiY3VycmVudCBkaXNwbGF5ZWQgYnVmZmVyIGFkZHJlc3MgJXhcclxuIiwKKwkJCQlkaXNwX2xhZGRyKTsKKwkJfQorCQlkYmdfY21kID0gMDsKKwl9CisJLypkb24ndCBjaGFuZ2VkIGF0IHN0YXJ0LiovCisJaWYgKGh3LT5nZXRfZnJhbWVfZHVyICYmIGh3LT5zaG93X2ZyYW1lX251bSA+IDYwICYmCisJCWh3LT5mcmFtZV9kdXIgPiAwICYmIGh3LT5zYXZlZF9yZXNvbHV0aW9uICE9CisJCWZyYW1lX3dpZHRoICogZnJhbWVfaGVpZ2h0ICoKKwkJCSg5NjAwMCAvIGh3LT5mcmFtZV9kdXIpKQorCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT5zZXRfY2xrX3dvcmspOworCisJdGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgUFVUX0lOVEVSVkFMOworCWFkZF90aW1lcih0aW1lcik7Cit9CisKKworaW50IHZhdjFfZGVjX3N0YXR1cyhzdHJ1Y3QgdmRlY19zICp2ZGVjLCBzdHJ1Y3QgdmRlY19pbmZvICp2c3RhdHVzKQoreworCXN0cnVjdCBBVjFIV19zICphdjEgPQorCQkoc3RydWN0IEFWMUhXX3MgKil2ZGVjLT5wcml2YXRlOworCisJaWYgKCFhdjEpCisJCXJldHVybiAtMTsKKworCXZzdGF0dXMtPmZyYW1lX3dpZHRoID0gZnJhbWVfd2lkdGg7CisJdnN0YXR1cy0+ZnJhbWVfaGVpZ2h0ID0gZnJhbWVfaGVpZ2h0OworCWlmIChhdjEtPmZyYW1lX2R1ciAhPSAwKQorCQl2c3RhdHVzLT5mcmFtZV9yYXRlID0gOTYwMDAgLyBhdjEtPmZyYW1lX2R1cjsKKwllbHNlCisJCXZzdGF0dXMtPmZyYW1lX3JhdGUgPSAtMTsKKwl2c3RhdHVzLT5lcnJvcl9jb3VudCA9IDA7CisJdnN0YXR1cy0+c3RhdHVzID0gYXYxLT5zdGF0IHwgYXYxLT5mYXRhbF9lcnJvcjsKKwl2c3RhdHVzLT5mcmFtZV9kdXIgPSBhdjEtPmZyYW1lX2R1cjsKKy8vI2lmbmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9NVUxUSV9ERUMKKwl2c3RhdHVzLT5iaXRfcmF0ZSA9IGF2MS0+Z3ZzLT5iaXRfcmF0ZTsKKwl2c3RhdHVzLT5mcmFtZV9kYXRhID0gYXYxLT5ndnMtPmZyYW1lX2RhdGE7CisJdnN0YXR1cy0+dG90YWxfZGF0YSA9IGF2MS0+Z3ZzLT50b3RhbF9kYXRhOworCXZzdGF0dXMtPmZyYW1lX2NvdW50ID0gYXYxLT5ndnMtPmZyYW1lX2NvdW50OworCXZzdGF0dXMtPmVycm9yX2ZyYW1lX2NvdW50ID0gYXYxLT5ndnMtPmVycm9yX2ZyYW1lX2NvdW50OworCXZzdGF0dXMtPmRyb3BfZnJhbWVfY291bnQgPSBhdjEtPmd2cy0+ZHJvcF9mcmFtZV9jb3VudDsKKwl2c3RhdHVzLT5zYW1wX2NudCA9IGF2MS0+Z3ZzLT5zYW1wX2NudDsKKwl2c3RhdHVzLT5vZmZzZXQgPSBhdjEtPmd2cy0+b2Zmc2V0OworCXNucHJpbnRmKHZzdGF0dXMtPnZkZWNfbmFtZSwgc2l6ZW9mKHZzdGF0dXMtPnZkZWNfbmFtZSksCisJCSIlcyIsIERSSVZFUl9OQU1FKTsKKy8vI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK2ludCB2YXYxX3NldF9pc3Jlc2V0KHN0cnVjdCB2ZGVjX3MgKnZkZWMsIGludCBpc3Jlc2V0KQoreworCWlzX3Jlc2V0ID0gaXNyZXNldDsKKwlyZXR1cm4gMDsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIEFWMV9ERUNPREVfSU5JVCh2b2lkKQoreworCS8qIGVuYWJsZSBhdjEgY2xvY2tzICovCisJV1JJVEVfVlJFRyhET1NfR0NMS19FTjMsIDB4ZmZmZmZmZmYpOworCS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCS8qIFBvd2VyIE9OIEhFVkMgKi8KKwkvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwkvKiBQb3dlcnVwIEhFVkMgKi8KKwlXUklURV9WUkVHKEFPX1JUSV9HRU5fUFdSX1NMRUVQMCwKKwkJCVJFQURfVlJFRyhBT19SVElfR0VOX1BXUl9TTEVFUDApICYgKH4oMHgzIDw8IDYpKSk7CisJV1JJVEVfVlJFRyhET1NfTUVNX1BEX0hFVkMsIDB4MCk7CisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQzLCBSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMykgfCAoMHgzZmZmZiA8PCAyKSk7CisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQzLCBSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMykgJiAofigweDNmZmZmIDw8IDIpKSk7CisJLyogcmVtb3ZlIGlzb2xhdGlvbnMgKi8KKwlXUklURV9WUkVHKEFPX1JUSV9HRU5fUFdSX0lTTzAsCisJCQlSRUFEX1ZSRUcoQU9fUlRJX0dFTl9QV1JfSVNPMCkgJiAofigweDMgPDwgMTApKSk7CisKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB2YXYxX3Byb3RfaW5pdChzdHJ1Y3QgQVYxSFdfcyAqaHcsIHUzMiBtYXNrKQoreworCXVuc2lnbmVkIGludCBkYXRhMzI7CisJLyogQVYxX0RFQ09ERV9JTklUKCk7ICovCisJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwgIiVzICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJYW9tX2NvbmZpZ193b3JrX3NwYWNlX2h3KGh3LCBtYXNrKTsKKwlpZiAobWFzayAmIEhXX01BU0tfQkFDSykgeworCQkvL3RvIGRvOiAuLiBmb3Igc2luZ2xlIGluc3RhbmNlLCBjYWxsZWQgYWZ0ZXIgaW5pdF9waWNfbGlzdCgpCisJCWlmIChody0+bV9pbnNfZmxhZykKKwkJCWluaXRfcGljX2xpc3RfaHcoaHcpOworCX0KKworCWFvbV9pbml0X2RlY29kZXJfaHcoaHcsIG1hc2spOworCisjaWZkZWYgQU9NX0FWMV9EQkxLX0lOSVQKKwlhdjFfcHJpbnQoaHcsIEFPTV9ERUJVR19IV19NT1JFLAorCSJbdGVzdC5jXSBhdjFfbG9vcF9maWx0ZXJfaW5pdCAocnVuIG9uY2UgYmVmb3JlIGRlY29kaW5nIHN0YXJ0KVxuIik7CisgICAgYXYxX2xvb3BfZmlsdGVyX2luaXQoaHctPmxmaSwgaHctPmxmKTsKKyNlbmRpZgorCWlmICgobWFzayAmIEhXX01BU0tfRlJPTlQpID09IDApCisJCXJldHVybjsKKyNpZiAxCisJaWYgKGRlYnVnICYgQVYxX0RFQlVHX0JVRk1HUl9NT1JFKQorCQlwcl9pbmZvKCIlc1xuIiwgX19mdW5jX18pOworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NUUkVBTV9DT05UUk9MKTsKKwlkYXRhMzIgPSBkYXRhMzIgfAorCQkoMSA8PCAwKS8qc3RyZWFtX2ZldGNoX2VuYWJsZSovCisJCTsKKwlXUklURV9WUkVHKEhFVkNfU1RSRUFNX0NPTlRST0wsIGRhdGEzMik7CisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKSB7CisJICAgIGlmIChkZWJ1ZyAmIEFWMV9ERUJVR19CVUZNR1IpCisJCSAgICBwcl9pbmZvKCJbdGVzdC5jXSBDb25maWcgU1RSRUFNX0ZJRk9fQ1RMXG4iKTsKKwkgICAgZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0ZJRk9fQ1RMKTsKKwkgICAgZGF0YTMyID0gZGF0YTMyIHwKKwkJCQkgKDEgPDwgMjkpIC8vIHN0cmVhbV9maWZvX2hvbGUKKwkJCQkgOworCSAgICBXUklURV9WUkVHKEhFVkNfU1RSRUFNX0ZJRk9fQ1RMLCBkYXRhMzIpOworCX0KKyNpZiAwCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0hJRlRfU1RBUlRDT0RFKTsKKwlpZiAoZGF0YTMyICE9IDB4MDAwMDAxMDApIHsKKwkJcHJfaW5mbygiYXYxIHByb3QgaW5pdCBlcnJvciAlZFxuIiwgX19MSU5FX18pOworCQlyZXR1cm47CisJfQorCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NISUZUX0VNVUxBVEVDT0RFKTsKKwlpZiAoZGF0YTMyICE9IDB4MDAwMDAzMDApIHsKKwkJcHJfaW5mbygiYXYxIHByb3QgaW5pdCBlcnJvciAlZFxuIiwgX19MSU5FX18pOworCQlyZXR1cm47CisJfQorCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9TVEFSVENPREUsIDB4MTIzNDU2NzgpOworCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9FTVVMQVRFQ09ERSwgMHg5YWJjZGVmMCk7CisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0hJRlRfU1RBUlRDT0RFKTsKKwlpZiAoZGF0YTMyICE9IDB4MTIzNDU2NzgpIHsKKwkJcHJfaW5mbygiYXYxIHByb3QgaW5pdCBlcnJvciAlZFxuIiwgX19MSU5FX18pOworCQlyZXR1cm47CisJfQorCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NISUZUX0VNVUxBVEVDT0RFKTsKKwlpZiAoZGF0YTMyICE9IDB4OWFiY2RlZjApIHsKKwkJcHJfaW5mbygiYXYxIHByb3QgaW5pdCBlcnJvciAlZFxuIiwgX19MSU5FX18pOworCQlyZXR1cm47CisJfQorI2VuZGlmCisJV1JJVEVfVlJFRyhIRVZDX1NISUZUX1NUQVJUQ09ERSwgMHgwMDAwMDAwMDEpOworCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9FTVVMQVRFQ09ERSwgMHgwMDAwMDMwMCk7CisjZW5kaWYKKworCisKKwlXUklURV9WUkVHKEhFVkNfV0FJVF9GTEFHLCAxKTsKKworCS8qIFdSSVRFX1ZSRUcoSEVWQ19NUFNSLCAxKTsgKi8KKworCS8qIGNsZWFyIG1haWxib3ggaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9NQk9YMF9DTFJfUkVHLCAxKTsKKworCS8qIGVuYWJsZSBtYWlsYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTUJPWDBfTUFTSywgMSk7CisKKwkvKiBkaXNhYmxlIFBTQ0FMRSBmb3IgaGFyZHdhcmUgc2hhcmluZyAqLworCVdSSVRFX1ZSRUcoSEVWQ19QU0NBTEVfQ1RSTCwgMCk7CisKKwlXUklURV9WUkVHKERFQlVHX1JFRzEsIDB4MCk7CisJLypjaGVjayB2cHMvc3BzL3Bwcy9pLXNsaWNlIGluIHVjb2RlKi8KKwlXUklURV9WUkVHKE5BTF9TRUFSQ0hfQ1RMLCAweDgpOworCisJV1JJVEVfVlJFRyhERUNPREVfU1RPUF9QT1MsIHVkZWJ1Z19mbGFnKTsKKy8vI2lmIChkZWZpbmVkIERFQlVHX1VDT0RFX0xPRykgfHwgKGRlZmluZWQgREVCVUdfQ01EKQorLy8JV1JJVEVfVlJFRyhIRVZDX0RCR19MT0dfQURSLCBody0+dWNvZGVfbG9nX3BoeV9hZGRyKTsKKy8vI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgdmF2MV9sb2NhbF9pbml0KHN0cnVjdCBBVjFIV19zICpodywgYm9vbCByZXNldF9mbGFnKQoreworCWludCBpOworCWludCByZXQ7CisJaW50IHdpZHRoLCBoZWlnaHQ7CisKKwlody0+Z3ZzID0gdnphbGxvYyhzaXplb2Yoc3RydWN0IHZkZWNfaW5mbykpOworCWlmIChOVUxMID09IGh3LT5ndnMpIHsKKwkJcHJfaW5mbygidGhlIHN0cnVjdCBvZiB2ZGVjIHN0YXR1cyBtYWxsb2MgZmFpbGVkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisjaWZkZWYgREVCVUdfUFRTCisJaHctPnB0c19taXNzZWQgPSAwOworCWh3LT5wdHNfaGl0ID0gMDsKKyNlbmRpZgorCWh3LT5uZXdfZnJhbWVfZGlzcGxheWVkID0gMDsKKwlody0+bGFzdF9wdXRfaWR4ID0gLTE7CisJaHctPnNhdmVkX3Jlc29sdXRpb24gPSAwOworCWh3LT5nZXRfZnJhbWVfZHVyID0gZmFsc2U7CisJb25fbm9fa2V5ZnJhbWVfc2tpcGVkID0gMDsKKwlody0+Zmlyc3RfcHRzX2luZGV4ID0gMDsKKwlody0+ZHVyX3JlY2FsY19mbGFnID0gMDsKKwlody0+YXYxX2ZpcnN0X3B0c19yZWFkeSA9IGZhbHNlOworCXdpZHRoID0gaHctPnZhdjFfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGg7CisJaGVpZ2h0ID0gaHctPnZhdjFfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0OworCWh3LT5mcmFtZV9kdXIgPQorCQkoaHctPnZhdjFfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSA9PQorCQkgMCkgPyAzMjAwIDogaHctPnZhdjFfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZTsKKwlpZiAod2lkdGggJiYgaGVpZ2h0KQorCQlody0+ZnJhbWVfYXIgPSBoZWlnaHQgKiAweDEwMCAvIHdpZHRoOworLyoKKyAqVE9ETzpGT1IgVkVSU0lPTgorICovCisJcHJfaW5mbygiYXYxOiB2ZXIgKCVkLCVkKSBkZWNpbmZvOiAlZHglZCByYXRlPSVkXG4iLCBhdjFfdmVyc2lvbiwKKwkJICAgMCwgd2lkdGgsIGhlaWdodCwgaHctPmZyYW1lX2R1cik7CisKKwlpZiAoaHctPmZyYW1lX2R1ciA9PSAwKQorCQlody0+ZnJhbWVfZHVyID0gOTYwMDAgLyAyNDsKKworCUlOSVRfS0ZJRk8oaHctPmRpc3BsYXlfcSk7CisJSU5JVF9LRklGTyhody0+bmV3ZnJhbWVfcSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRlJBTUVfQlVGRkVSUzsgaSsrKSB7CisJCWh3LT5idWZmZXJfd3JhcFtpXSA9IGk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFZGX1BPT0xfU0laRTsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqdmYgPSAmaHctPnZmcG9vbFtpXTsKKworCQlody0+dmZwb29sW2ldLmluZGV4ID0gLTE7CisJCWtmaWZvX3B1dCgmaHctPm5ld2ZyYW1lX3EsIHZmKTsKKwl9CisKKwlyZXQgPSBhdjFfbG9jYWxfaW5pdChodywgcmVzZXRfZmxhZyk7CisKKwlpZiAoZm9yY2VfcHRzX3Vuc3RhYmxlKSB7CisJCWlmICghaHctPnB0c191bnN0YWJsZSkgeworCQkJaHctPnB0c191bnN0YWJsZSA9CisJCQkoaHctPnZhdjFfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZSA9PSAwKT8xOjA7CisJCQlwcl9pbmZvKCJzZXQgcHRzIHVuc3RhYmxlXG4iKTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKK3N0YXRpYyBzMzIgdmF2MV9pbml0KHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IEFWMUhXX3MgKmh3ID0gKHN0cnVjdCBBVjFIV19zICopdmRlYy0+cHJpdmF0ZTsKKyNlbHNlCitzdGF0aWMgczMyIHZhdjFfaW5pdChzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisjZW5kaWYKKwlpbnQgcmV0OworCWludCBpOworCWludCBmd19zaXplID0gMHgxMDAwICogMTY7CisJc3RydWN0IGZpcm13YXJlX3MgKmZ3ID0gTlVMTDsKKworCWh3LT5zdGF0IHw9IFNUQVRfVElNRVJfSU5JVDsKKworCWlmICh2YXYxX2xvY2FsX2luaXQoaHcsIGZhbHNlKSA8IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlmdyA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBmaXJtd2FyZV9zKSArIGZ3X3NpemUpOworCWlmIChJU19FUlJfT1JfTlVMTChmdykpCisJCXJldHVybiAtRU5PTUVNOworCisJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwgIiVzICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworI2lmZGVmIERFQlVHX1VTRV9WUDlfREVWSUNFX05BTUUKKwlpZiAoZ2V0X2Zpcm13YXJlX2RhdGEoVklERU9fREVDX1ZQOV9NTVUsIGZ3LT5kYXRhKSA8IDApIHsKKyNlbHNlCisJaWYgKGdldF9maXJtd2FyZV9kYXRhKFZJREVPX0RFQ19BVjFfTU1VLCBmdy0+ZGF0YSkgPCAwKSB7CisjZW5kaWYKKwkJcHJfZXJyKCJnZXQgZmlybXdhcmUgZmFpbC5cbiIpOworCQlwcmludGsoIiVzICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQl2ZnJlZShmdyk7CisJCXJldHVybiAtMTsKKwl9CisJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwgIiVzICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCWZ3LT5sZW4gPSBmd19zaXplOworCisJSU5JVF9XT1JLKCZody0+c2V0X2Nsa193b3JrLCBhdjFfc2V0X2Nsayk7CisJdGltZXJfc2V0dXAoJmh3LT50aW1lciwgdmF2MV9wdXRfdGltZXJfZnVuYywgMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRklMTV9HUkFJTl9SRUdfU0laRTsgaSsrKSB7CisJCVdSSVRFX1ZSRUcoSEVWQ19GR1NfREFUQSwgMCk7CisJfQorCVdSSVRFX1ZSRUcoSEVWQ19GR1NfQ1RSTCwgMCk7CisKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJaWYgKGh3LT5tX2luc19mbGFnKSB7CisJCWh3LT50aW1lci5leHBpcmVzID0gamlmZmllcyArIFBVVF9JTlRFUlZBTDsKKworCQkvKmFkZF90aW1lcigmaHctPnRpbWVyKTsKKworCQlody0+c3RhdCB8PSBTVEFUX1RJTUVSX0FSTTsKKwkJaHctPnN0YXQgfD0gU1RBVF9JU1JfUkVHOyovCisKKwkJSU5JVF9XT1JLKCZody0+d29yaywgYXYxX3dvcmspOworCQlody0+ZncgPSBmdzsKKworCQlyZXR1cm4gMDsJLyptdWx0aSBpbnN0YW5jZSByZXR1cm4gKi8KKwl9CisjZW5kaWYKKwlhbWhldmNfZW5hYmxlKCk7CisKKwlyZXQgPSBhbWhldmNfbG9hZG1jX2V4KFZGT1JNQVRfQVYxLCBOVUxMLCBmdy0+ZGF0YSk7CisJaWYgKHJldCA8IDApIHsKKwkJYW1oZXZjX2Rpc2FibGUoKTsKKwkJdmZyZWUoZncpOworCQlwcl9lcnIoIkFWMTogdGhlICVzIGZ3IGxvYWRpbmcgZmFpbGVkLCBlcnI6ICV4XG4iLAorCQkJdGVlX2VuYWJsZWQoKSA/ICJURUUiIDogImxvY2FsIiwgcmV0KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwl2ZnJlZShmdyk7CisKKwlody0+c3RhdCB8PSBTVEFUX01DX0xPQUQ7CisKKwkvKiBlbmFibGUgQU1SSVNDIHNpZGUgcHJvdG9jb2wgKi8KKwl2YXYxX3Byb3RfaW5pdChodywgSFdfTUFTS19GUk9OVCB8IEhXX01BU0tfQkFDSyk7CisKKwlpZiAodmRlY19yZXF1ZXN0X3RocmVhZGVkX2lycShWREVDX0lSUV8wLAorCQkJCXZhdjFfaXNyLAorCQkJCXZhdjFfaXNyX3RocmVhZF9mbiwKKwkJCQlJUlFGX09ORVNIT1QsLypydW4gdGhyZWFkIG9uIHRoaXMgaXJxIGRpc2FibGVkKi8KKwkJCQkidmF2MS1pcnEiLCAodm9pZCAqKWh3KSkgeworCQlwcl9pbmZvKCJ2YXYxIGlycSByZWdpc3RlciBlcnJvci5cbiIpOworCQlhbWhldmNfZGlzYWJsZSgpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlody0+c3RhdCB8PSBTVEFUX0lTUl9SRUc7CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwlpZiAoZm9yY2VfZHZfZW5hYmxlKQorCQlody0+cHJvdmlkZXJfbmFtZSA9IERWX1BST1ZJREVSX05BTUU7CisJZWxzZQorI2VuZGlmCisJCWh3LT5wcm92aWRlcl9uYW1lID0gUFJPVklERVJfTkFNRTsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJaWYgKCFody0+aXNfdXNlZF92NGwpIHsKKwkJdmZfcHJvdmlkZXJfaW5pdCgmdmF2MV92Zl9wcm92LCBody0+cHJvdmlkZXJfbmFtZSwKKwkJCQkJJnZhdjFfdmZfcHJvdmlkZXIsIGh3KTsKKwkJdmZfcmVnX3Byb3ZpZGVyKCZ2YXYxX3ZmX3Byb3YpOworCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoaHctPnByb3ZpZGVyX25hbWUsIFZGUkFNRV9FVkVOVF9QUk9WSURFUl9TVEFSVCwgTlVMTCk7CisJCWlmIChody0+ZnJhbWVfZHVyICE9IDApIHsKKwkJCWlmICghaXNfcmVzZXQpCisJCQkJdmZfbm90aWZ5X3JlY2VpdmVyKGh3LT5wcm92aWRlcl9uYW1lLAorCQkJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX0ZSX0hJTlQsCisJCQkJCQkodm9pZCAqKQorCQkJCQkJKCh1bnNpZ25lZCBsb25nKWh3LT5mcmFtZV9kdXIpKTsKKwkJfQorCX0KKyNlbHNlCisJdmZfcHJvdmlkZXJfaW5pdCgmdmF2MV92Zl9wcm92LCBody0+cHJvdmlkZXJfbmFtZSwgJnZhdjFfdmZfcHJvdmlkZXIsCisJCQkJCSBodyk7CisJdmZfcmVnX3Byb3ZpZGVyKCZ2YXYxX3ZmX3Byb3YpOworCXZmX25vdGlmeV9yZWNlaXZlcihody0+cHJvdmlkZXJfbmFtZSwgVkZSQU1FX0VWRU5UX1BST1ZJREVSX1NUQVJULCBOVUxMKTsKKwlpZiAoIWlzX3Jlc2V0KQorCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoaHctPnByb3ZpZGVyX25hbWUsIFZGUkFNRV9FVkVOVF9QUk9WSURFUl9GUl9ISU5ULAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZylody0+ZnJhbWVfZHVyKSk7CisjZW5kaWYKKwlody0+c3RhdCB8PSBTVEFUX1ZGX0hPT0s7CisKKwlody0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBQVVRfSU5URVJWQUw7CisJYWRkX3RpbWVyKCZody0+dGltZXIpOworCisJaHctPnN0YXQgfD0gU1RBVF9WREVDX1JVTjsKKwlody0+c3RhdCB8PSBTVEFUX1RJTUVSX0FSTTsKKworCWFtaGV2Y19zdGFydCgpOworCisJaHctPmluaXRfZmxhZyA9IDE7CisJaHctPnByb2Nlc3NfYnVzeSA9IDA7CisJcHJfaW5mbygiJWQsIHZhdjFfaW5pdCwgUlA9MHgleFxuIiwKKwkJX19MSU5FX18sIFJFQURfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bWF2MV9zdG9wKHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlody0+aW5pdF9mbGFnID0gMDsKKworCWlmIChody0+c3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJYW1oZXZjX3N0b3AoKTsKKwkJaHctPnN0YXQgJj0gflNUQVRfVkRFQ19SVU47CisJfQorCWlmIChody0+c3RhdCAmIFNUQVRfSVNSX1JFRykgeworCQl2ZGVjX2ZyZWVfaXJxKFZERUNfSVJRXzAsICh2b2lkICopaHcpOworCQlody0+c3RhdCAmPSB+U1RBVF9JU1JfUkVHOworCX0KKwlpZiAoaHctPnN0YXQgJiBTVEFUX1RJTUVSX0FSTSkgeworCQlkZWxfdGltZXJfc3luYygmaHctPnRpbWVyKTsKKwkJaHctPnN0YXQgJj0gflNUQVRfVElNRVJfQVJNOworCX0KKworCWlmICghaHctPmlzX3VzZWRfdjRsICYmIChody0+c3RhdCAmIFNUQVRfVkZfSE9PSykpIHsKKwkJaWYgKCFpc19yZXNldCkKKwkJCXZmX25vdGlmeV9yZWNlaXZlcihody0+cHJvdmlkZXJfbmFtZSwKKwkJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX0ZSX0VORF9ISU5ULAorCQkJCQlOVUxMKTsKKworCQl2Zl91bnJlZ19wcm92aWRlcigmdmF2MV92Zl9wcm92KTsKKwkJaHctPnN0YXQgJj0gflNUQVRfVkZfSE9PSzsKKwl9CisJYXYxX2xvY2FsX3VuaW5pdChodywgZmFsc2UpOworCXJlc2V0X3Byb2Nlc3NfdGltZShodyk7CisJY2FuY2VsX3dvcmtfc3luYygmaHctPndvcmspOworCWNhbmNlbF93b3JrX3N5bmMoJmh3LT5zZXRfY2xrX3dvcmspOworCXVuaW5pdF9tbXVfYnVmZmVycyhodyk7CisJaWYgKGh3LT5mdykKKwkJdmZyZWUoaHctPmZ3KTsKKwlody0+ZncgPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtdmRlY19hdjFfbW11X2luaXQoc3RydWN0IEFWMUhXX3MgKmh3KQoreworCWludCB0dnBfZmxhZyA9IHZkZWNfc2VjdXJlKGh3X3RvX3ZkZWMoaHcpKSA/CisJCUNPREVDX01NX0ZMQUdTX1RWUCA6IDA7CisJaW50IGJ1Zl9zaXplID0gNDg7CisKKwlpZiAoKGh3LT5tYXhfcGljX3cgKiBody0+bWF4X3BpY19oID4gMTI4MCo3MzYpICYmCisJCShody0+bWF4X3BpY193ICogaHctPm1heF9waWNfaCA8PSAxOTIwKjEwODgpKSB7CisJCWJ1Zl9zaXplID0gMTI7CisJfSBlbHNlIGlmICgoaHctPm1heF9waWNfdyAqIGh3LT5tYXhfcGljX2ggPiAwKSAmJgorCQkoaHctPm1heF9waWNfdyAqIGh3LT5tYXhfcGljX2ggPD0gMTI4MCo3MzYpKSB7CisJCWJ1Zl9zaXplID0gNDsKKwl9CisJaHctPm5lZWRfY2FjaGVfc2l6ZSA9IGJ1Zl9zaXplICogU1pfMU07CisJaHctPnNjX3N0YXJ0X3RpbWUgPSBnZXRfamlmZmllc182NCgpOworCWlmIChody0+bW11X2VuYWJsZSAmJiAhaHctPmlzX3VzZWRfdjRsKSB7CisJCWludCBjb3VudCA9IEZSQU1FX0JVRkZFUlM7CisJCWh3LT5tbXVfYm94ID0gZGVjb2Rlcl9tbXVfYm94X2FsbG9jX2JveChEUklWRVJfTkFNRSwKKwkJCWh3LT5pbmRleCAvKiAqIDIqLywgY291bnQsCisJCQlody0+bmVlZF9jYWNoZV9zaXplLAorCQkJdHZwX2ZsYWcKKwkJCSk7CisJCWlmICghaHctPm1tdV9ib3gpIHsKKwkJCXByX2VycigiYXYxIGFsbG9jIG1tdSBib3ggZmFpbGVkISFcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKKwkJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShodykgJiAweDIwKSB7CisJCQlody0+bW11X2JveF9kdyA9IGRlY29kZXJfbW11X2JveF9hbGxvY19ib3goRFJJVkVSX05BTUUsCisJCQkJaHctPmluZGV4IC8qKiAyICsgMSovLCBjb3VudCwKKwkJCQlody0+bmVlZF9jYWNoZV9zaXplLAorCQkJCXR2cF9mbGFnCisJCQkJKTsKKwkJCWlmICghaHctPm1tdV9ib3hfZHcpIHsKKwkJCQlwcl9lcnIoImF2MSBhbGxvYyBkdyBtbXUgYm94IGZhaWxlZCEhXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKyNlbmRpZgorCisJfQorCWh3LT5ibW11X2JveCA9IGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYm94KAorCQkJRFJJVkVSX05BTUUsCisJCQlody0+aW5kZXgsCisJCQlNQVhfQk1NVV9CVUZGRVJfTlVNLAorCQkJNCArIFBBR0VfU0hJRlQsCisJCQlDT0RFQ19NTV9GTEFHU19DTUFfQ0xFQVIgfAorCQkJQ09ERUNfTU1fRkxBR1NfRk9SX1ZERUNPREVSIHwKKwkJCXR2cF9mbGFnKTsKKwlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19CVUZNR1IsCisJCSIlcywgTUFYX0JNTVVfQlVGRkVSX05VTSA9ICVkXG4iLAorCQlfX2Z1bmNfXywKKwkJTUFYX0JNTVVfQlVGRkVSX05VTSk7CisJaWYgKCFody0+Ym1tdV9ib3gpIHsKKwkJcHJfZXJyKCJhdjEgYWxsb2MgYm1tdSBib3ggZmFpbGVkISFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYXYxX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWFtaGV2Y19zdXNwZW5kKHRvX3BsYXRmb3JtX2RldmljZShkZXYpLCBkZXYtPnBvd2VyLnBvd2VyX3N0YXRlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdjFfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlhbWhldmNfcmVzdW1lKHRvX3BsYXRmb3JtX2RldmljZShkZXYpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGF2MV9wbV9vcHMgPSB7CisJU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMoYXYxX3N1c3BlbmQsIGF2MV9yZXN1bWUpCit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgY29kZWNfcHJvZmlsZV90IGFtdmRlY19hdjFfcHJvZmlsZSA9IHsKKwkubmFtZSA9ICJBVjEtVjRMIiwKKwkucHJvZmlsZSA9ICIiCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGdldF9kYXRhX2NoZWNrX3N1bQorCShzdHJ1Y3QgQVYxSFdfcyAqaHcsIGludCBzaXplKQoreworCWludCBzdW0gPSAwOworCXU4ICpkYXRhID0gTlVMTDsKKworCWlmICghaHctPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQlkYXRhID0gY29kZWNfbW1fdm1hcChody0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQlody0+ZGF0YV9vZmZzZXQsIHNpemUpOworCWVsc2UKKwkJZGF0YSA9ICgodTggKilody0+Y2h1bmstPmJsb2NrLT5zdGFydF92aXJ0KSArCisJCQlody0+ZGF0YV9vZmZzZXQ7CisKKwlzdW0gPSBjcmMzMl9sZSgwLCBkYXRhLCBzaXplKTsKKworCWlmICghaHctPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQljb2RlY19tbV91bm1hcF9waHlhZGRyKGRhdGEpOworCXJldHVybiBzdW07Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfZGF0YShzdHJ1Y3QgQVYxSFdfcyAqaHcsIGludCBzaXplKQoreworCWludCBqajsKKwl1OCAqZGF0YSA9IE5VTEw7CisJaW50IHBhZGRpbmdfc2l6ZSA9IGh3LT5kYXRhX29mZnNldCAmCisJCShWREVDX0ZJRk9fQUxJR04gLSAxKTsKKworCWlmICghaHctPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQlkYXRhID0gY29kZWNfbW1fdm1hcChody0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQlody0+ZGF0YV9vZmZzZXQsIHNpemUpOworCWVsc2UKKwkJZGF0YSA9ICgodTggKilody0+Y2h1bmstPmJsb2NrLT5zdGFydF92aXJ0KSArCisJCQlody0+ZGF0YV9vZmZzZXQ7CisKKwlhdjFfcHJpbnQoaHcsIDAsICJwYWRkaW5nOiAiKTsKKwlmb3IgKGpqID0gcGFkZGluZ19zaXplOyBqaiA+IDA7IGpqLS0pCisJCWF2MV9wcmludF9jb250KGh3LAorCQkJMCwKKwkJCSIlMDJ4ICIsICooZGF0YSAtIGpqKSk7CisJYXYxX3ByaW50X2NvbnQoaHcsIDAsICJkYXRhIGFkciAlcFxuIiwKKwkJZGF0YSk7CisKKwlmb3IgKGpqID0gMDsgamogPCBzaXplOyBqaisrKSB7CisJCWlmICgoamogJiAweGYpID09IDApCisJCQlhdjFfcHJpbnQoaHcsCisJCQkJMCwKKwkJCQkiJTA2eDoiLCBqaik7CisJCWF2MV9wcmludF9jb250KGh3LAorCQkJMCwKKwkJCSIlMDJ4ICIsIGRhdGFbampdKTsKKwkJaWYgKCgoamogKyAxKSAmIDB4ZikgPT0gMCkKKwkJCWF2MV9wcmludChodywKKwkJCSAwLAorCQkJCSJcbiIpOworCX0KKwlhdjFfcHJpbnQoaHcsCisJIDAsCisJCSJcbiIpOworCisJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIoZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgYXYxX3dhaXRfY2FwX2J1Zih2b2lkICphcmdzKQoreworCXN0cnVjdCBBVjFIV19zICpodyA9CisJCShzdHJ1Y3QgQVYxSFdfcyAqKSBhcmdzOworCXN0cnVjdCBBVjFfQ29tbW9uX3MgKmNvbnN0IGNtID0gJmh3LT5jb21tb247CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICogY3R4ID0KKwkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKWh3LT52NGwyX2N0eDsKKwl1bG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGN0eC0+Y2FwX3dxLAorCQkoY3R4LT5pc19zdHJlYW1fb2ZmIHx8IChnZXRfZnJlZV9idWZfY291bnQoaHcpID4gMCkpLAorCQltc2Vjc190b19qaWZmaWVzKDMwMCkpOworCWlmIChyZXQgPD0gMCl7CisJCWF2MV9wcmludChodywgUFJJTlRfRkxBR19WNExfREVUQUlMLCAiJXMsIHdhaXQgY2FwIGJ1ZiB0aW1lb3V0IG9yIGVyciAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCX0KKworCWxvY2tfYnVmZmVyX3Bvb2woY20tPmJ1ZmZlcl9wb29sLCBmbGFncyk7CisJaWYgKGh3LT53YWl0X21vcmVfYnVmKSB7CisJCWh3LT53YWl0X21vcmVfYnVmID0gZmFsc2U7CisJCWh3LT5kZWNfcmVzdWx0ID0gY3R4LT5pc19zdHJlYW1fb2ZmID8KKwkJREVDX1JFU1VMVF9GT1JDRV9FWElUIDoKKwkJQU9NX0FWMV9SRVNVTFRfTkVFRF9NT1JFX0JVRkZFUjsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJfQorCXVubG9ja19idWZmZXJfcG9vbChjbS0+YnVmZmVyX3Bvb2wsIGZsYWdzKTsKKworCWF2MV9wcmludChodywgUFJJTlRfRkxBR19WNExfREVUQUlMLAorCQkiJXMgd2FpdCBjYXB0dXJlIGJ1ZmZlciBlbmQsIHJldDolZFxuIiwKKwkJX19mdW5jX18sIHJldCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGF2MV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgQVYxSFdfcyAqaHcgPSBjb250YWluZXJfb2Yod29yaywKKwkJc3RydWN0IEFWMUhXX3MsIHdvcmspOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKGh3KTsKKwkvKiBmaW5pc2hlZCBkZWNvZGluZyBvbmUgZnJhbWUgb3IgZXJyb3IsCisJICogbm90aWZ5IHZkZWMgY29yZSB0byBzd2l0Y2ggY29udGV4dAorCSAqLworCWlmIChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0FHQUlOKQorCQlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9XT1JLRVJfQUdBSU4pOworCWlmIChody0+ZGVjX3Jlc3VsdCAhPSBBT01fQVYxX1JFU1VMVF9ORUVEX01PUkVfQlVGRkVSKQorCQlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9XT1JLRVJfU1RBUlQpOworCWF2MV9wcmludChodywgUFJJTlRfRkxBR19WREVDX0RFVEFJTCwKKwkJIiVzIGRlY19yZXN1bHQgJWQgJXggJXggJXhcbiIsCisJCV9fZnVuY19fLAorCQlody0+ZGVjX3Jlc3VsdCwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0xFVkVMKSwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1dSX1BUUiksCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIpKTsKKworCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy13b3JrX3N0YXRlIiwgaHctPmRlY19yZXN1bHQpOworCisJaWYgKGh3LT5kZWNfcmVzdWx0ID09IEFPTV9BVjFfUkVTVUxUX05FRURfTU9SRV9CVUZGRVIpIHsKKwkJcmVzZXRfcHJvY2Vzc190aW1lKGh3KTsKKwkJaWYgKGdldF9mcmVlX2J1Zl9jb3VudChodykgPD0gMCkgeworCQkJc3RydWN0IEFWMV9Db21tb25fcyAqY29uc3QgY20gPSAmaHctPmNvbW1vbjsKKwkJCXVsb25nIGZsYWdzOworCQkJaW50IHJldDsKKworCQkJbG9ja19idWZmZXJfcG9vbChjbS0+YnVmZmVyX3Bvb2wsIGZsYWdzKTsKKworCQkJaHctPmRlY19yZXN1bHQgPSBBT01fQVYxX1JFU1VMVF9ORUVEX01PUkVfQlVGRkVSOworCQkJaWYgKHZkZWMtPm5leHRfc3RhdHVzID09IFZERUNfU1RBVFVTX0RJU0NPTk5FQ1RFRCkgeworCQkJCWh3LT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKwkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCX0gZWxzZSB7CisJCQkJaHctPndhaXRfbW9yZV9idWYgPSB0cnVlOworCQkJfQorCQkJdW5sb2NrX2J1ZmZlcl9wb29sKGNtLT5idWZmZXJfcG9vbCwgZmxhZ3MpOworCisJCQlpZiAoaHctPndhaXRfbW9yZV9idWYpIHsKKwkJCQlBVFJBQ0VfQ09VTlRFUigiVl9TVF9ERUMtd2FpdF9tb3JlX2J1ZmYiLCBfX0xJTkVfXyk7CisJCQkJcmV0ID0gdmRlY19wb3N0X3Rhc2soYXYxX3dhaXRfY2FwX2J1ZiwgaHcpOworCQkJCWlmIChyZXQgIT0gMCkgeworCQkJCQlwcl9lcnIoInBvc3QgdGFzayBjcmVhdGUgZmFpbGVkISEhISByZXQgJWRcbiIsIHJldCk7CisJCQkJCWxvY2tfYnVmZmVyX3Bvb2woY20tPmJ1ZmZlcl9wb29sLCBmbGFncyk7CisJCQkJCWh3LT53YWl0X21vcmVfYnVmID0gZmFsc2U7CisJCQkJCWh3LT5kZWNfcmVzdWx0ID0gQU9NX0FWMV9SRVNVTFRfTkVFRF9NT1JFX0JVRkZFUjsKKwkJCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQkJCXVubG9ja19idWZmZXJfcG9vbChjbS0+YnVmZmVyX3Bvb2wsIGZsYWdzKTsKKwkJCQl9CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy13YWl0X21vcmVfYnVmZiIsIDApOworCQkJYXYxX3JlbGVhc2VfYnVmcyhodyk7CisJCQlhdjFfY29udGludWVfZGVjb2RpbmcoaHcsIGh3LT5jdXJfb2J1X3R5cGUpOworCQkJaHctPnBvc3Rwcm9jX2RvbmUgPSAwOworCQkJc3RhcnRfcHJvY2Vzc190aW1lKGh3KTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJaWYgKCgoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9HRVRfREFUQSkgfHwKKwkJKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfR0VUX0RBVEFfUkVUUlkpKQorCQkmJiAoaHdfdG9fdmRlYyhodyktPm5leHRfc3RhdHVzICE9CisJCVZERUNfU1RBVFVTX0RJU0NPTk5FQ1RFRCkpIHsKKwkJaWYgKCF2ZGVjX2hhc19tb3JlX2lucHV0KHZkZWMpKSB7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRU9TOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9HRVRfREFUQSkgeworCQkJYXYxX3ByaW50KGh3LCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJCSIlcyBERUNfUkVTVUxUX0dFVF9EQVRBICV4ICV4ICV4XG4iLAorCQkJCV9fZnVuY19fLAorCQkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9MRVZFTCksCisJCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1dSX1BUUiksCisJCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1JEX1BUUikpOworCQkJdmRlY192ZnJhbWVfZGlydHkodmRlYywgaHctPmNodW5rKTsKKwkJCXZkZWNfY2xlYW5faW5wdXQodmRlYyk7CisJCX0KKworCQlpZiAoZ2V0X2ZyZWVfYnVmX2NvdW50KGh3KSA+PQorCQkJaHctPnJ1bl9yZWFkeV9taW5fYnVmX251bSkgeworCQkJaW50IHI7CisJCQlpbnQgZGVjb2RlX3NpemU7CisJCQlyID0gdmRlY19wcmVwYXJlX2lucHV0KHZkZWMsICZody0+Y2h1bmspOworCQkJaWYgKHIgPCAwKSB7CisJCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0dFVF9EQVRBX1JFVFJZOworCisJCQkJYXYxX3ByaW50KGh3LAorCQkJCQlQUklOVF9GTEFHX1ZERUNfREVUQUlMLAorCQkJCQkiYW12ZGVjX3ZoMjY1OiBJbnN1ZmZpY2llbnQgZGF0YVxuIik7CisKKwkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfTk9ORTsKKwkJCWF2MV9wcmludChodywgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCQkiJXM6IGNodW5rIHNpemUgMHgleCBzdW0gMHgleFxuIiwKKwkJCQlfX2Z1bmNfXywgciwKKwkJCQkoZGVidWcgJiBQUklOVF9GTEFHX1ZERUNfU1RBVFVTKSA/CisJCQkJZ2V0X2RhdGFfY2hlY2tfc3VtKGh3LCByKSA6IDAKKwkJCQkpOworCisJCQlpZiAoZGVidWcgJiBQUklOVF9GTEFHX1ZERUNfREFUQSkKKwkJCQlkdW1wX2RhdGEoaHcsIGh3LT5kYXRhX3NpemUpOworCisJCQlkZWNvZGVfc2l6ZSA9IGh3LT5kYXRhX3NpemUgKworCQkJCShody0+ZGF0YV9vZmZzZXQgJiAoVkRFQ19GSUZPX0FMSUdOIC0gMSkpOworCisJCQlXUklURV9WUkVHKEhFVkNfREVDT0RFX1NJWkUsCisJCQkJUkVBRF9WUkVHKEhFVkNfREVDT0RFX1NJWkUpICsgZGVjb2RlX3NpemUpOworCisJCQl2ZGVjX2VuYWJsZV9pbnB1dCh2ZGVjKTsKKworCQkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCBIRVZDX0FDVElPTl9ET05FKTsKKworCQkJc3RhcnRfcHJvY2Vzc190aW1lKGh3KTsKKworCQl9IGVsc2UgeworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0dFVF9EQVRBX1JFVFJZOworCisJCQlhdjFfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsCisJCQkJImFtdmRlY192aDI2NTogSW5zdWZmaWNpZW50IGRhdGFcbiIpOworCisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJmh3LT53b3JrKTsKKwkJfQorCQlyZXR1cm47CisJfSBlbHNlIGlmIChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0RPTkUpIHsKKwkJLyogaWYgKCFody0+Y3R4X3ZhbGlkKQorCQkJaHctPmN0eF92YWxpZCA9IDE7ICovCisJCWh3LT5yZXN1bHRfZG9uZV9jb3VudCsrOworCQlody0+cHJvY2Vzc19zdGF0ZSA9IFBST0NfU1RBVEVfSU5JVDsKKworCQlhdjFfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkiJXMgKD09PT4gJWQpIGRlY19yZXN1bHQgJWQgKCVkKSAleCAleCAleCBzaGlmdGJ5dGVzIDB4JXggZGVjYnl0ZXMgMHgleFxuIiwKKwkJCV9fZnVuY19fLAorCQkJaHctPmZyYW1lX2NvdW50LAorCQkJaHctPmRlY19yZXN1bHQsCisJCQlody0+cmVzdWx0X2RvbmVfY291bnQsCisJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fTEVWRUwpLAorCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1dSX1BUUiksCisJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpLAorCQkJUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCkgLQorCQkJaHctPnN0YXJ0X3NoaWZ0X2J5dGVzCisJCQkpOworCQl2ZGVjX3ZmcmFtZV9kaXJ0eShod190b192ZGVjKGh3KSwgaHctPmNodW5rKTsKKwl9IGVsc2UgaWYgKGh3LT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfQUdBSU4pIHsKKwkJLyoKKwkJCXN0cmVhbSBiYXNlOiBzdHJlYW0gYnVmIGVtcHR5IG9yIHRpbWVvdXQKKwkJCWZyYW1lIGJhc2U6IHZkZWNfcHJlcGFyZV9pbnB1dCBmYWlsCisJCSovCisJCWlmICghdmRlY19oYXNfbW9yZV9pbnB1dCh2ZGVjKSkgeworCQkJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0VPUzsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIGlmIChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0VPUykgeworCQlhdjFfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkiJXM6IGVuZCBvZiBzdHJlYW1cbiIsIF9fZnVuY19fKTsKKwkJbXV0ZXhfbG9jaygmaHctPmFzc2l0X3Rhc2suYXNzaXRfbXV0ZXgpOworCQlody0+ZW9zID0gMTsKKwkJYXYxX3Bvc3Rwcm9jKGh3KTsKKworCQlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCQlBVFJBQ0VfQ09VTlRFUigiVl9TVF9ERUMtc3VibWl0X2VvcyIsIF9fTElORV9fKTsKKwkJCW5vdGlmeV92NGxfZW9zKGh3X3RvX3ZkZWMoaHcpKTsKKwkJCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy1zdWJtaXRfZW9zIiwgMCk7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZody0+YXNzaXRfdGFzay5hc3NpdF9tdXRleCk7CisKKwkJdmRlY192ZnJhbWVfZGlydHkoaHdfdG9fdmRlYyhodyksIGh3LT5jaHVuayk7CisJfSBlbHNlIGlmIChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0ZPUkNFX0VYSVQpIHsKKwkJYXYxX3ByaW50KGh3LCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJIiVzOiBmb3JjZSBleGl0XG4iLAorCQkJX19mdW5jX18pOworCQlpZiAoaHctPnN0YXQgJiBTVEFUX1ZERUNfUlVOKSB7CisJCQlhbWhldmNfc3RvcCgpOworCQkJaHctPnN0YXQgJj0gflNUQVRfVkRFQ19SVU47CisJCX0KKworCQlpZiAoaHctPnN0YXQgJiBTVEFUX0lTUl9SRUcpIHsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCQlpZiAoIWh3LT5tX2luc19mbGFnKQorI2VuZGlmCisJCQkJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9NQk9YMF9NQVNLLCAwKTsKKwkJCXZkZWNfZnJlZV9pcnEoVkRFQ19JUlFfMCwgKHZvaWQgKilodyk7CisJCQlody0+c3RhdCAmPSB+U1RBVF9JU1JfUkVHOworCQl9CisJfSBlbHNlIGlmIChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0RJU0NBUkRfREFUQSkgeworCQlhdjFfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkiJXMgKD09PT4gJWQpIGRlY19yZXN1bHQgJWQgKCVkKSAleCAleCAleCBzaGlmdGJ5dGVzIDB4JXggZGVjYnl0ZXMgMHgleCBkaXNjYXJkIHBpYyFcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWh3LT5mcmFtZV9jb3VudCwKKwkJCWh3LT5kZWNfcmVzdWx0LAorCQkJaHctPnJlc3VsdF9kb25lX2NvdW50LAorCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0xFVkVMKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9XUl9QVFIpLAorCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1JEX1BUUiksCisJCQlSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpIC0KKwkJCWh3LT5zdGFydF9zaGlmdF9ieXRlcworCQkJKTsKKwkJdmRlY192ZnJhbWVfZGlydHkoaHdfdG9fdmRlYyhodyksIGh3LT5jaHVuayk7CisJfSBlbHNlIGlmIChody0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX1VORklOSVNIKSB7CisJCWh3LT5yZXN1bHRfZG9uZV9jb3VudCsrOworCQlody0+cHJvY2Vzc19zdGF0ZSA9IFBST0NfU1RBVEVfSU5JVDsKKworCQlhdjFfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkiJXMgKD09PT4gJWQpIGRlY19yZXN1bHQgJWQgKCVkKSAleCAleCAleCBzaGlmdGJ5dGVzIDB4JXggZGVjYnl0ZXMgMHgleFxuIiwKKwkJCV9fZnVuY19fLAorCQkJaHctPmZyYW1lX2NvdW50LAorCQkJaHctPmRlY19yZXN1bHQsCisJCQlody0+cmVzdWx0X2RvbmVfY291bnQsCisJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fTEVWRUwpLAorCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1dSX1BUUiksCisJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpLAorCQkJUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCkgLSBody0+c3RhcnRfc2hpZnRfYnl0ZXMpOworCQlhbWhldmNfc3RvcCgpOworCX0KKworCWlmIChody0+c3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJYW1oZXZjX3N0b3AoKTsKKwkJaHctPnN0YXQgJj0gflNUQVRfVkRFQ19SVU47CisJfQorCisJaWYgKGh3LT5zdGF0ICYgU1RBVF9USU1FUl9BUk0pIHsKKwkJZGVsX3RpbWVyX3N5bmMoJmh3LT50aW1lcik7CisJCWh3LT5zdGF0ICY9IH5TVEFUX1RJTUVSX0FSTTsKKwl9CisJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfV09SS0VSX0VORCk7CisJLyogbWFyayBpdHNlbGYgaGFzIGFsbCBIVyByZXNvdXJjZSByZWxlYXNlZCBhbmQgaW5wdXQgcmVsZWFzZWQgKi8KKwlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpCisJCXZkZWNfY29yZV9maW5pc2hfcnVuKHZkZWMsIENPUkVfTUFTS19IRVZDKTsKKwllbHNlCisJCXZkZWNfY29yZV9maW5pc2hfcnVuKGh3X3RvX3ZkZWMoaHcpLCBDT1JFX01BU0tfVkRFQ18xCisJCQkJCXwgQ09SRV9NQVNLX0hFVkMpOworCXRyaWdnZXJfc2NoZWR1bGUoaHcpOworfQorCitzdGF0aWMgaW50IGF2MV9od19jdHhfcmVzdG9yZShzdHJ1Y3QgQVYxSFdfcyAqaHcpCit7CisJdmF2MV9wcm90X2luaXQoaHcsIEhXX01BU0tfRlJPTlQgfCBIV19NQVNLX0JBQ0spOworCXJldHVybiAwOworfQorCitzdGF0aWMgYm9vbCBpc19hdmFsaWFibGVfYnVmZmVyKHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlBVjFfQ09NTU9OICpjbSA9ICZody0+Y29tbW9uOworCVJlZkNudEJ1ZmZlciAqY29uc3QgZnJhbWVfYnVmcyA9IGNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmczsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KTsKKwlpbnQgaSwgZnJlZV9jb3VudCA9IDA7CisJaW50IHVzZWRfY291bnQgPSAwOworCisJaWYgKChody0+dXNlZF9idWZfbnVtID09IDApIHx8CisJCShjdHgtPmNhcF9wb29sLmRlYyA8IGh3LT51c2VkX2J1Zl9udW0pKSB7CisJCWlmIChjdHgtPmZiX29wcy5xdWVyeSgmY3R4LT5mYl9vcHMsICZody0+ZmJfdG9rZW4pKSB7CisJCQlmcmVlX2NvdW50ID0KKwkJCQl2NGwyX20ybV9udW1fZHN0X2J1ZnNfcmVhZHkoY3R4LT5tMm1fY3R4KSArIDE7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaHctPnVzZWRfYnVmX251bTsgKytpKSB7CisJCWlmICgoZnJhbWVfYnVmc1tpXS5yZWZfY291bnQgPT0gMCkgJiYKKwkJCShmcmFtZV9idWZzW2ldLmJ1Zi52Zl9yZWYgPT0gMCkgJiYKKwkJCShmcmFtZV9idWZzW2ldLmJ1Zi5yZXBlYXRfY291bnQgPT0gMCkgJiYKKwkJCShmcmFtZV9idWZzW2ldLmJ1Zi5pbmRleCA+PSAwKSAmJgorCQkJZnJhbWVfYnVmc1tpXS5idWYuY21hX2FsbG9jX2FkZHIpIHsKKwkJCWZyZWVfY291bnQrKzsKKwkJfSBlbHNlIGlmIChmcmFtZV9idWZzW2ldLmJ1Zi5jbWFfYWxsb2NfYWRkcikKKwkJCXVzZWRfY291bnQrKzsKKwl9CisKKwlBVFJBQ0VfQ09VTlRFUigiYXYxX2ZyZWVfYnVmZl9jb3VudCIsIGZyZWVfY291bnQpOworCUFUUkFDRV9DT1VOVEVSKCJhdjFfdXNlZF9idWZmX2NvdW50IiwgdXNlZF9jb3VudCk7CisKKwlyZXR1cm4gZnJlZV9jb3VudCA+PSBody0+cnVuX3JlYWR5X21pbl9idWZfbnVtID8gMSA6IDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJ1bl9yZWFkeShzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1bnNpZ25lZCBsb25nIG1hc2spCit7CisJc3RydWN0IEFWMUhXX3MgKmh3ID0KKwkJKHN0cnVjdCBBVjFIV19zICopdmRlYy0+cHJpdmF0ZTsKKwlpbnQgdHZwID0gdmRlY19zZWN1cmUoaHdfdG9fdmRlYyhodykpID8KKwkJQ09ERUNfTU1fRkxBR1NfVFZQIDogMDsKKwl1bnNpZ25lZCBsb25nIHJldCA9IDA7CisKKwlpZiAoIWh3LT5waWNfbGlzdF9pbml0X2RvbmUyIHx8IGh3LT5lb3MpCisJCXJldHVybiByZXQ7CisKKwlpZiAoIWh3LT5maXJzdF9zY19jaGVja2VkICYmCisJCShnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTCkgJiYKKwkJKGdldF9kb3VibGVfd3JpdGVfbW9kZShodykgIT0gMHgxMCkpIHsKKwkJaW50IHNpemU7CisJCXZvaWQgKiBtbXVfYm94OworCisJCWlmIChody0+aXNfdXNlZF92NGwpIHsKKwkJCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisJCQltbXVfYm94ID0gY3R4LT5tbXVfYm94OworCQl9IGVsc2UKKwkJCW1tdV9ib3ggPSBody0+bW11X2JveDsKKworCQlzaXplID0gZGVjb2Rlcl9tbXVfYm94X3NjX2NoZWNrKG1tdV9ib3gsIHR2cCk7CisJCWh3LT5maXJzdF9zY19jaGVja2VkID0gMTsKKwkJYXYxX3ByaW50KGh3LCAwLCAiYXYxIGNhY2hlZD0lZCAgbmVlZF9zaXplPSVkIHNwZWVkPSAlZCBtc1xuIiwKKwkJCXNpemUsIChody0+bmVlZF9jYWNoZV9zaXplID4+IFBBR0VfU0hJRlQpLAorCQkJKGludCkoZ2V0X2ppZmZpZXNfNjQoKSAtIGh3LT5zY19zdGFydF90aW1lKSAqIDEwMDAvSFopOworI2lmZGVmIEFPTV9BVjFfTU1VX0RXCisJCS8qISEhISEhIFRvIGRvIC4uLiAqLworCQlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKGh3KSAmIDB4MjApIHsKKworCQl9CisjZW5kaWYKKwl9CisKKwlpZiAoaHctPmlzX3VzZWRfdjRsKSB7CisJCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikoaHctPnY0bDJfY3R4KTsKKworCQlpZiAoaHctPnY0bF9wYXJhbXNfcGFyc2VkKSB7CisJCQlpZiAoaXNfYXZhbGlhYmxlX2J1ZmZlcihodykpCisJCQkJcmV0ID0gQ09SRV9NQVNLX0hFVkM7CisJCQllbHNlCisJCQkJcmV0ID0gMDsKKwkJfSBlbHNlIHsKKwkJCWlmIChjdHgtPnY0bF9yZXNvbHV0aW9uX2NoYW5nZSkKKwkJCQlyZXQgPSAwOworCQkJZWxzZQorCQkJCXJldCA9IENPUkVfTUFTS19IRVZDOworCQl9CisJfQorCisJaWYgKHJldCkKKwkJbm90X3J1bl9yZWFkeVtody0+aW5kZXhdID0gMDsKKwllbHNlCisJCW5vdF9ydW5fcmVhZHlbaHctPmluZGV4XSsrOworCisJLyphdjFfcHJpbnQoaHcsCisJCVBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsICIlcyBtYXNrICVseD0+JWx4XHJcbiIsCisJCV9fZnVuY19fLCBtYXNrLCByZXQpOyovCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYXYxX2ZyYW1lX21vZGVfcHRzX3NhdmUoc3RydWN0IEFWMUhXX3MgKmh3KQoreworCXU2NCBpLCB2YWxpZF9wdHNfZGlmZl9jbnQsIHB0c19kaWZmX3N1bTsKKwl1NjQgaW5fcHRzX2RpZmYsIGxhc3RfdmFsaWRfcHRzX2RpZmYsIGNhbGNfZHVyOworCisJaWYgKGh3LT5jaHVuayA9PSBOVUxMKQorCQlyZXR1cm47CisJLyogbm8gcmV0dXJuIHdoZW4gZmlyc3QgcHRzIGlzIDAgKi8KKwlpZiAoIWh3LT5pc191c2VkX3Y0bCAmJiBody0+Zmlyc3RfcHRzX2luZGV4KSB7CisJCS8qIGZpbHRyYXRpb24gcHRzIDAgYW5kIGNvbnRpbnVvdXMgc2FtZSBwdHMgKi8KKwkJaWYgKChody0+Y2h1bmstPnB0cyA9PSAwKSB8fAorCQkJKGh3LT5mcmFtZV9tb2RlX3B0c19zYXZlWzBdID09IGh3LT5jaHVuay0+cHRzKSkKKwkJCXJldHVybjsKKworCQkvKiBmcHMgY2hhbmdlLCBmcmFtZSBkdXIgY2hhbmdlIHRvIGxvd2VyIG9yIGhpZ2hlciwKKwkJICogY2FuJ3QgZmluZCBjbG9zZWQgcHRzIGluIHNhdmVkIHBvb2wgKi8KKwkJaWYgKGh3LT5kdXJfcmVjYWxjX2ZsYWcgfHwKKwkJCShody0+bGFzdF9wdHMgPiAgaHctPmNodW5rLT5wdHMpKSB7CisJCQlody0+YXYxX2ZpcnN0X3B0c19yZWFkeSA9IDA7CisJCQlody0+Zmlyc3RfcHRzX2luZGV4ID0gMDsKKwkJCWh3LT5nZXRfZnJhbWVfZHVyID0gMDsKKwkJCWh3LT5kdXJfcmVjYWxjX2ZsYWcgPSAwOworCQkJbWVtc2V0KGh3LT5mcmFtZV9tb2RlX3B0c19zYXZlLCAwLAorCQkJICAgICAgICBzaXplb2YoaHctPmZyYW1lX21vZGVfcHRzX3NhdmUpKTsKKwkJCW1lbXNldChody0+ZnJhbWVfbW9kZV9wdHM2NF9zYXZlLCAwLAorCQkJICAgICAgICBzaXplb2YoaHctPmZyYW1lX21vZGVfcHRzNjRfc2F2ZSkpOworCQl9CisJfQorCWF2MV9wcmludChodywgQVYxX0RFQlVHX09VVF9QVFMsCisJCSJydW5fZnJvbnQ6IHB0cyAlZCwgcHRzNjQgJWxsZCwgdHM6ICVsbGRcbiIsCisJCWh3LT5jaHVuay0+cHRzLCBody0+Y2h1bmstPnB0czY0LCBody0+Y2h1bmstPnRpbWVzdGFtcCk7CisKKwlmb3IgKGkgPSAoRlJBTUVfQlVGRkVSUyAtIDEpOyBpID4gMDsgaS0tKSB7CisJCWh3LT5mcmFtZV9tb2RlX3B0c19zYXZlW2ldID0gaHctPmZyYW1lX21vZGVfcHRzX3NhdmVbaSAtIDFdOworCQlody0+ZnJhbWVfbW9kZV9wdHM2NF9zYXZlW2ldID0gaHctPmZyYW1lX21vZGVfcHRzNjRfc2F2ZVtpIC0gMV07CisJfQorCWh3LT5mcmFtZV9tb2RlX3B0c19zYXZlWzBdID0gaHctPmNodW5rLT5wdHM7CisJaHctPmZyYW1lX21vZGVfcHRzNjRfc2F2ZVswXSA9IGh3LT5jaHVuay0+cHRzNjQ7CisKKwlpZiAoaHctPmlzX3VzZWRfdjRsICYmICF2NGxfYml0c3RyZWFtX2lkX2VuYWJsZSkKKwkJaHctPmZyYW1lX21vZGVfcHRzNjRfc2F2ZVswXSA9IGh3LT5jaHVuay0+dGltZXN0YW1wOworCisJaWYgKGh3LT5maXJzdF9wdHNfaW5kZXggPCBBUlJBWV9TSVpFKGh3LT5mcmFtZV9tb2RlX3B0c19zYXZlKSkKKwkJaHctPmZpcnN0X3B0c19pbmRleCsrOworCS8qIGZyYW1lIGR1cmF0aW9uIGNoZWNrLCB2ZGVjX3NlY3VyZSByZXR1cm4gZm9yIG50cyBwcm9ibGVtICovCisJaWYgKCghaHctPmZpcnN0X3B0c19pbmRleCkgfHwKKwkJaHctPmdldF9mcmFtZV9kdXIgfHwKKwkJdmRlY19zZWN1cmUoaHdfdG9fdmRlYyhodykpKQorCQlyZXR1cm47CisJdmFsaWRfcHRzX2RpZmZfY250ID0gMDsKKwlwdHNfZGlmZl9zdW0gPSAwOworCisJZm9yIChpID0gMDsgaSA8IEZSQU1FX0JVRkZFUlMgLSAxOyBpKyspIHsKKwkJaWYgKChody0+ZnJhbWVfbW9kZV9wdHNfc2F2ZVtpXSA+IGh3LT5mcmFtZV9tb2RlX3B0c19zYXZlW2kgKyAxXSkgJiYKKwkJCShody0+ZnJhbWVfbW9kZV9wdHNfc2F2ZVtpICsgMV0gIT0gMCkpCisJCQlpbl9wdHNfZGlmZiA9IGh3LT5mcmFtZV9tb2RlX3B0c19zYXZlW2ldCisJCQkJLSBody0+ZnJhbWVfbW9kZV9wdHNfc2F2ZVtpICsgMV07CisJCWVsc2UKKwkJCWluX3B0c19kaWZmID0gMDsKKworCQlpZiAoaW5fcHRzX2RpZmYgPCAxMDAgfHwKKwkJCSh2YWxpZF9wdHNfZGlmZl9jbnQgJiYgKCFjbG9zZV90byhpbl9wdHNfZGlmZiwgbGFzdF92YWxpZF9wdHNfZGlmZiwgMTAwKSkpKQorCQkJaW5fcHRzX2RpZmYgPSAwOworCQllbHNlIHsKKwkJCWxhc3RfdmFsaWRfcHRzX2RpZmYgPSBpbl9wdHNfZGlmZjsKKwkJCXZhbGlkX3B0c19kaWZmX2NudCsrOworCQl9CisKKwkJcHRzX2RpZmZfc3VtICs9IGluX3B0c19kaWZmOworCX0KKworCWlmICghdmFsaWRfcHRzX2RpZmZfY250KSB7CisJCWF2MV9wcmludChodywgQVYxX0RFQlVHX09VVF9QVFMsICJjaGVja2VkIG5vIGF2YWxpYWJsZSBwdHNcbiIpOworCQlyZXR1cm47CisJfQorCisJY2FsY19kdXIgPSBQVFMyRFVSX3U2NChkaXZfdTY0KHB0c19kaWZmX3N1bSwgdmFsaWRfcHRzX2RpZmZfY250KSk7CisKKwlpZiAoKCFjbG9zZV90byhjYWxjX2R1ciwgaHctPmZyYW1lX2R1ciwgMTApKSAmJgorCQkoY2FsY19kdXIgPCA0ODAwKSAmJiAoY2FsY19kdXIgPiA4MDApKSB7CisJCWF2MV9wcmludChodywgMCwgImNoYW5nZSB0byBjYWxjIGR1ciAlbGx1LCBvbGQgZHVyICV1XG4iLCBjYWxjX2R1ciwgaHctPmZyYW1lX2R1cik7CisJCWh3LT5mcmFtZV9kdXIgPSBjYWxjX2R1cjsKKwkJaHctPmdldF9mcmFtZV9kdXIgPSB0cnVlOworCX0gZWxzZSB7CisJCWlmIChody0+ZnJhbWVfY291bnQgPiBGUkFNRV9CVUZGRVJTKQorCQkJaHctPmdldF9mcmFtZV9kdXIgPSB0cnVlOworCX0KK30KKworc3RhdGljIHZvaWQgcnVuX2Zyb250KHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IEFWMUhXX3MgKmh3ID0KKwkJKHN0cnVjdCBBVjFIV19zICopdmRlYy0+cHJpdmF0ZTsKKwlpbnQgcmV0LCBzaXplOworCisJcnVuX2NvdW50W2h3LT5pbmRleF0rKzsKKwkvKiBody0+Y2h1bmsgPSB2ZGVjX3ByZXBhcmVfaW5wdXQodmRlYyk7ICovCisJaGV2Y19yZXNldF9jb3JlKHZkZWMpOworCisJaWYgKCh2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpKSAmJgorCQkoaHctPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9VTkZJTklTSCkpIHsKKwkJdTMyIHJlc19ieXRlID0gaHctPmRhdGFfc2l6ZSAtIGh3LT5jb25zdW1lX2J5dGU7CisKKwkJYXYxX3ByaW50KGh3LCBBVjFfREVCVUdfQlVGTUdSLAorCQkJIiVzIGJlZm9yZSwgY29uc3VtZSAweCV4LCBzaXplIDB4JXgsIG9mZnNldCAweCV4LCByZXMgMHgleFxuIiwgX19mdW5jX18sCisJCQlody0+Y29uc3VtZV9ieXRlLCBody0+ZGF0YV9zaXplLCBody0+ZGF0YV9vZmZzZXQgKyBody0+Y29uc3VtZV9ieXRlLCByZXNfYnl0ZSk7CisKKwkJaHctPmRhdGFfaW52YWxpZCA9IHZkZWNfb2Zmc2V0X3ByZXBhcmVfaW5wdXQodmRlYywgaHctPmNvbnN1bWVfYnl0ZSwgaHctPmRhdGFfb2Zmc2V0LCBody0+ZGF0YV9zaXplKTsKKwkJaHctPmRhdGFfb2Zmc2V0IC09IChody0+ZGF0YV9pbnZhbGlkIC0gaHctPmNvbnN1bWVfYnl0ZSk7CisJCWh3LT5kYXRhX3NpemUgKz0gKGh3LT5kYXRhX2ludmFsaWQgLSBody0+Y29uc3VtZV9ieXRlKTsKKwkJc2l6ZSA9IGh3LT5kYXRhX3NpemU7CisJCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfU0NSQVRDSF9DLCBody0+ZGF0YV9pbnZhbGlkKTsKKworCQlhdjFfcHJpbnQoaHcsIEFWMV9ERUJVR19CVUZNR1IsCisJCQkiJXMgYWZ0ZXIsIGNvbnN1bWUgMHgleCwgc2l6ZSAweCV4LCBvZmZzZXQgMHgleCwgaW52YWxpZCAweCV4LCByZXMgMHgleFxuIiwgX19mdW5jX18sCisJCQlody0+Y29uc3VtZV9ieXRlLCBody0+ZGF0YV9zaXplLCBody0+ZGF0YV9vZmZzZXQsIGh3LT5kYXRhX2ludmFsaWQsIHJlc19ieXRlKTsKKwl9IGVsc2UgeworCXNpemUgPSB2ZGVjX3ByZXBhcmVfaW5wdXQodmRlYywgJmh3LT5jaHVuayk7CisJaWYgKHNpemUgPCAwKSB7CisJCWlucHV0X2VtcHR5W2h3LT5pbmRleF0rKzsKKworCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfQUdBSU47CisKKwkJYXYxX3ByaW50KGh3LCBQUklOVF9GTEFHX1ZERUNfREVUQUlMLAorCQkJImFtbXZkZWNfYXYxOiBJbnN1ZmZpY2llbnQgZGF0YVxuIik7CisKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCXJldHVybjsKKwl9CisJCWlmICgodmRlY19mcmFtZV9iYXNlZCh2ZGVjKSkgJiYKKwkJCShody0+Y2h1bmsgIT0gTlVMTCkpIHsKKwkJCWh3LT5kYXRhX29mZnNldCA9IGh3LT5jaHVuay0+b2Zmc2V0OworCQkJaHctPmRhdGFfc2l6ZSA9IHNpemU7CisJCX0KKwkJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9TQ1JBVENIX0MsIDApOworCX0KKworCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy1jaHVua19zaXplIiwgc2l6ZSk7CisKKwlpbnB1dF9lbXB0eVtody0+aW5kZXhdID0gMDsKKwlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfTk9ORTsKKwlody0+c3RhcnRfc2hpZnRfYnl0ZXMgPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKTsKKworCWF2MV9mcmFtZV9tb2RlX3B0c19zYXZlKGh3KTsKKwlpZiAoZGVidWcgJiBQUklOVF9GTEFHX1ZERUNfU1RBVFVTKSB7CisJCWlmICh2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpICYmIGh3LT5jaHVuayAmJiAhdmRlY19zZWN1cmUodmRlYykpIHsKKwkJCXU4ICpkYXRhID0gTlVMTDsKKworCQkJaWYgKCFody0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQkJZGF0YSA9IGNvZGVjX21tX3ZtYXAoaHctPmNodW5rLT5ibG9jay0+c3RhcnQgKworCQkJCQlody0+ZGF0YV9vZmZzZXQsIHNpemUpOworCQkJZWxzZQorCQkJCWRhdGEgPSAoKHU4ICopaHctPmNodW5rLT5ibG9jay0+c3RhcnRfdmlydCkgKworCQkJCQlody0+ZGF0YV9vZmZzZXQ7CisKKwkJCS8vcHJpbnRfaGV4X2RlYnVnKGRhdGEsIHNpemUsIHNpemUgPiA2NCA/IDY0IDogc2l6ZSk7CisJCQlhdjFfcHJpbnQoaHcsIDAsCisJCQkJIiVzOiBzaXplIDB4JXggc3VtIDB4JXggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggLi4gJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCQlfX2Z1bmNfXywgc2l6ZSwgZ2V0X2RhdGFfY2hlY2tfc3VtKGh3LCBzaXplKSwKKwkJCQlkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdLCBkYXRhWzNdLAorCQkJCWRhdGFbNF0sIGRhdGFbNV0sIGRhdGFbc2l6ZSAtIDRdLAorCQkJCWRhdGFbc2l6ZSAtIDNdLCBkYXRhW3NpemUgLSAyXSwKKwkJCQlkYXRhW3NpemUgLSAxXSk7CisJCQlhdjFfcHJpbnQoaHcsIDAsCisJCQkJIiVzIGZybSBjbnQgKCVkKTogY2h1bmsgKDB4JXggMHgleCkgKCV4ICV4ICV4ICV4ICV4KSBieXRlcyAweCV4XG4iLAorCQkJCV9fZnVuY19fLCBody0+ZnJhbWVfY291bnQsIGh3LT5kYXRhX3NpemUsIGh3LT5kYXRhX29mZnNldCwKKwkJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fU1RBUlRfQUREUiksCisJCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0VORF9BRERSKSwKKwkJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fTEVWRUwpLAorCQkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9XUl9QVFIpLAorCQkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIpLAorCQkJCWh3LT5zdGFydF9zaGlmdF9ieXRlcyk7CisKKwkJCWlmICghaHctPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQkJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIoZGF0YSk7CisJCX0gZWxzZSB7CisJCQlhdjFfcHJpbnQoaHcsIDAsCisJCQkJIiVzICglZCk6IHNpemUgMHgleCAoMHgleCAweCV4KSAoJXggJXggJXggJXggJXgpIGJ5dGVzIDB4JXhcbiIsCisJCQkJX19mdW5jX18sCisJCQkJaHctPmZyYW1lX2NvdW50LCBzaXplLAorCQkJCWh3LT5jaHVuayA/IGh3LT5kYXRhX3NpemUgOiAwLAorCQkJCWh3LT5jaHVuayA/IGh3LT5kYXRhX29mZnNldCA6IDAsCisJCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1NUQVJUX0FERFIpLAorCQkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9FTkRfQUREUiksCisJCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0xFVkVMKSwKKwkJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fV1JfUFRSKSwKKwkJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSKSwKKwkJCQlody0+c3RhcnRfc2hpZnRfYnl0ZXMpOworCQl9CisJfQorCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfcnVuX3RpbWVfbmFtZSwgVFJBQ0VfUlVOX0xPQURJTkdfRldfU1RBUlQpOworCWlmICh2ZGVjLT5tY19sb2FkZWQpIHsKKwkvKmZpcm13YXJlIGhhdmUgbG9hZCBiZWZvcmUsCisJICBhbmQgbm90IGNoYW5nZXMgdG8gYW5vdGhlci4KKwkgIGlnbm9yZSByZWxvYWQuCisJKi8KKwl9IGVsc2UgeworI2lmZGVmIERFQlVHX1VTRV9WUDlfREVWSUNFX05BTUUKKwkJCXJldCA9IGFtaGV2Y19sb2FkbWNfZXgoVkZPUk1BVF9WUDksIE5VTEwsIGh3LT5mdy0+ZGF0YSk7CisjZWxzZQorCQkJcmV0ID0gYW1oZXZjX2xvYWRtY19leChWRk9STUFUX0FWMSwgTlVMTCwgaHctPmZ3LT5kYXRhKTsKKyNlbmRpZgorCQkJaWYgKHJldCA8IDApIHsKKwkJCWFtaGV2Y19kaXNhYmxlKCk7CisJCQlhdjFfcHJpbnQoaHcsIFBSSU5UX0ZMQUdfRVJST1IsCisJCQkJIkFWMTogdGhlICVzIGZ3IGxvYWRpbmcgZmFpbGVkLCBlcnI6ICV4XG4iLAorCQkJCXRlZV9lbmFibGVkKCkgPyAiVEVFIiA6ICJsb2NhbCIsIHJldCk7CisJCQlody0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRk9SQ0VfRVhJVDsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmaHctPndvcmspOworCQkJcmV0dXJuOworCQl9CisJCXZkZWMtPm1jX2xvYWRlZCA9IDE7CisjaWZkZWYgREVCVUdfVVNFX1ZQOV9ERVZJQ0VfTkFNRQorCQl2ZGVjLT5tY190eXBlID0gVkZPUk1BVF9WUDk7CisjZWxzZQorCQl2ZGVjLT5tY190eXBlID0gVkZPUk1BVF9BVjE7CisjZW5kaWYKKwl9CisJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV9ydW5fdGltZV9uYW1lLCBUUkFDRV9SVU5fTE9BRElOR19GV19FTkQpOworCisJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV9ydW5fdGltZV9uYW1lLCBUUkFDRV9SVU5fTE9BRElOR19SRVNUT1JFX1NUQVJUKTsKKwlpZiAoYXYxX2h3X2N0eF9yZXN0b3JlKGh3KSA8IDApIHsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZody0+d29yayk7CisJCXJldHVybjsKKwl9CisJQVRSQUNFX0NPVU5URVIoaHctPnRyYWNlLmRlY29kZV9ydW5fdGltZV9uYW1lLCBUUkFDRV9SVU5fTE9BRElOR19SRVNUT1JFX0VORCk7CisJdmRlY19lbmFibGVfaW5wdXQodmRlYyk7CisKKwlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIEhFVkNfQUNUSU9OX0RPTkUpOworCisJaWYgKHZkZWNfZnJhbWVfYmFzZWQodmRlYykpIHsKKwkJaWYgKGRlYnVnICYgUFJJTlRfRkxBR19WREVDX0RBVEEpCisJCQlkdW1wX2RhdGEoaHcsIGh3LT5kYXRhX3NpemUpOworCisJCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5ULCAwKTsKKwkJc2l6ZSA9IGh3LT5kYXRhX3NpemUgKworCQkJKGh3LT5kYXRhX29mZnNldCAmIChWREVDX0ZJRk9fQUxJR04gLSAxKSk7CisJCWlmICh2ZGVjLT5tdmZybSkKKwkJCXZkZWMtPm12ZnJtLT5mcmFtZV9zaXplID0gaHctPmRhdGFfc2l6ZTsKKwl9CisJaHctPmRhdGFfc2l6ZSA9IHNpemU7CisJV1JJVEVfVlJFRyhIRVZDX0RFQ09ERV9TSVpFLCBzaXplKTsKKwlXUklURV9WUkVHKEhFVkNfREVDT0RFX0NPVU5ULCBody0+cmVzdWx0X2RvbmVfY291bnQpOworCVdSSVRFX1ZSRUcoTE1FTV9EVU1QX0FEUiwgKHUzMilody0+bG1lbV9waHlfYWRkcik7CisJaWYgKGh3LT5jb25maWdfbmV4dF9yZWZfaW5mb19mbGFnKQorCSAgICBjb25maWdfbmV4dF9yZWZfaW5mb19odyhodyk7CisJaHctPmNvbmZpZ19uZXh0X3JlZl9pbmZvX2ZsYWcgPSAwOworCWh3LT5pbml0X2ZsYWcgPSAxOworCisJYXYxX3ByaW50KGh3LCBQUklOVF9GTEFHX1ZERUNfREVUQUlMLAorCQkiJXM6IHN0YXJ0IGh3ICgleCAleCAleCkgSEVWQ19ERUNPREVfU0laRSAweCV4XG4iLAorCQlfX2Z1bmNfXywKKwkJUkVBRF9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcpLAorCQlSRUFEX1ZSRUcoSEVWQ19NUENfRSksCisJCVJFQURfVlJFRyhIRVZDX01QU1IpLAorCQlSRUFEX1ZSRUcoSEVWQ19ERUNPREVfU0laRSkpOworCisJc3RhcnRfcHJvY2Vzc190aW1lKGh3KTsKKwltb2RfdGltZXIoJmh3LT50aW1lciwgamlmZmllcyk7CisJaHctPnN0YXQgfD0gU1RBVF9USU1FUl9BUk07CisJaHctPnN0YXQgfD0gU1RBVF9JU1JfUkVHOworCWFtaGV2Y19zdGFydCgpOworCWh3LT5zdGF0IHw9IFNUQVRfVkRFQ19SVU47Cit9CisKK3N0YXRpYyB2b2lkIHJ1bihzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1bnNpZ25lZCBsb25nIG1hc2ssCisJdm9pZCAoKmNhbGxiYWNrKShzdHJ1Y3QgdmRlY19zICosIHZvaWQgKiksIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgQVYxSFdfcyAqaHcgPQorCQkoc3RydWN0IEFWMUhXX3MgKil2ZGVjLT5wcml2YXRlOworCUFUUkFDRV9DT1VOVEVSKGh3LT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX1JVTl9TVEFSVCk7CisJYXYxX3ByaW50KGh3LAorCQlQUklOVF9GTEFHX1ZERUNfREVUQUlMLCAiJXMgbWFzayAlbHhcclxuIiwKKwkJX19mdW5jX18sIG1hc2spOworCisJcnVuX2NvdW50W2h3LT5pbmRleF0rKzsKKwlpZiAodmRlYy0+bXZmcm0pCisJCXZkZWMtPm12ZnJtLT5od19kZWNvZGVfc3RhcnQgPSBsb2NhbF9jbG9jaygpOworCWh3LT52ZGVjX2NiX2FyZyA9IGFyZzsKKwlody0+dmRlY19jYiA9IGNhbGxiYWNrOworCWh3LT5vbmVfcGFja2FnZV9mcmFtZV9jbnQgPSAwOworCXJ1bl9mcm9udCh2ZGVjKTsKKwlBVFJBQ0VfQ09VTlRFUihody0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9SVU5fRU5EKTsKK30KKworc3RhdGljIHZvaWQgIGF2MV9kZWNvZGVfY3R4X3Jlc2V0KHN0cnVjdCBBVjFIV19zICpodykKK3sKKwlzdHJ1Y3QgQVYxX0NvbW1vbl9zICpjb25zdCBjbSA9ICZody0+Y29tbW9uOworCXN0cnVjdCBSZWZDbnRCdWZmZXJfcyAqY29uc3QgZnJhbWVfYnVmcyA9IGNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmczsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBGUkFNRV9CVUZGRVJTOyArK2kpIHsKKwkJZnJhbWVfYnVmc1tpXS5yZWZfY291bnQJCT0gMDsKKwkJZnJhbWVfYnVmc1tpXS5idWYudmZfcmVmCT0gMDsKKwkJZnJhbWVfYnVmc1tpXS5idWYuZGVjb2RlX2lkeAk9IDA7CisJCWZyYW1lX2J1ZnNbaV0uYnVmLmNtYV9hbGxvY19hZGRyID0gMDsKKwkJZnJhbWVfYnVmc1tpXS5idWYuaW5kZXgJCT0gaTsKKwkJZnJhbWVfYnVmc1tpXS5idWYuQlVGX2luZGV4CT0gLTE7CisJCWZyYW1lX2J1ZnNbaV0uYnVmLm12X2J1Zl9pbmRleAk9IC0xOworCQlmcmFtZV9idWZzW2ldLmJ1Zi5yZXBlYXRfcGljID0gTlVMTDsKKwkJZnJhbWVfYnVmc1tpXS5idWYucmVwZWF0X2NvdW50ID0gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTVZfQlVGRkVSX05VTTsgaSsrKSB7CisJCWlmIChody0+bV9tdl9CVUZbaV0uc3RhcnRfYWRyKSB7CisJCQlpZiAobXZfYnVmX2R5bmFtaWNfYWxsb2MpIHsKKwkJCQlkZWNvZGVyX2JtbXVfYm94X2ZyZWVfaWR4KGh3LT5ibW11X2JveCwgTVZfQlVGRkVSX0lEWChpKSk7CisJCQkJaHctPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciA9IDA7CisJCQkJaHctPm1fbXZfQlVGW2ldLnNpemUgPSAwOworCQkJfQorCQkJaHctPm1fbXZfQlVGW2ldLnVzZWRfZmxhZyA9IDA7CisJCX0KKwl9CisKKwlody0+b25lX2NvbXByZXNzZWRfZGF0YV9kb25lID0gMDsKKwlody0+Y29uZmlnX25leHRfcmVmX2luZm9fZmxhZyA9IDA7CisJaHctPmluaXRfZmxhZwkJPSAwOworCWh3LT5maXJzdF9zY19jaGVja2VkCT0gMDsKKwlody0+ZmF0YWxfZXJyb3IJCT0gMDsKKwlody0+c2hvd19mcmFtZV9udW0JPSAwOworCWh3LT5wb3N0cHJvY19kb25lCT0gMDsKKwlody0+cHJvY2Vzc19idXN5CT0gMDsKKwlody0+cHJvY2Vzc19zdGF0ZQk9IDA7CisJaHctPmZyYW1lX2RlY29kZWQJPSAwOworCWh3LT5lb3MJCQk9IDA7CisJaHctPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX05PTkU7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0KHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IEFWMUhXX3MgKmh3ID0KKwkJKHN0cnVjdCBBVjFIV19zICopdmRlYy0+cHJpdmF0ZTsKKworCWNhbmNlbF93b3JrX3N5bmMoJmh3LT53b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZody0+c2V0X2Nsa193b3JrKTsKKworCWlmIChody0+c3RhdCAmIFNUQVRfVkRFQ19SVU4pIHsKKwkJYW1oZXZjX3N0b3AoKTsKKwkJaHctPnN0YXQgJj0gflNUQVRfVkRFQ19SVU47CisJfQorCisJaWYgKGh3LT5zdGF0ICYgU1RBVF9USU1FUl9BUk0pIHsKKwkJZGVsX3RpbWVyX3N5bmMoJmh3LT50aW1lcik7CisJCWh3LT5zdGF0ICY9IH5TVEFUX1RJTUVSX0FSTTsKKwl9CisKKwlyZXNldF9wcm9jZXNzX3RpbWUoaHcpOworCisJYXYxX2J1Zm1ncl9jdHhfcmVzZXQoaHctPnBiaSwgJmh3LT5hdjFfYnVmZmVyX3Bvb2wsICZody0+Y29tbW9uKTsKKwlody0+cGJpLT5wcml2YXRlX2RhdGEgPSBodzsKKwltdXRleF9sb2NrKCZody0+YXNzaXRfdGFzay5hc3NpdF9tdXRleCk7CisJYXYxX2xvY2FsX3VuaW5pdChodywgdHJ1ZSk7CisJaWYgKHZhdjFfbG9jYWxfaW5pdChodywgdHJ1ZSkgPCAwKQorCQlhdjFfcHJpbnQoaHcsIDAsICIlcyBsb2NhbF9pbml0IGZhaWxlZCBcclxuIiwgX19mdW5jX18pOworCW11dGV4X3VubG9jaygmaHctPmFzc2l0X3Rhc2suYXNzaXRfbXV0ZXgpOworCisJYXYxX2RlY29kZV9jdHhfcmVzZXQoaHcpOworCisJYXRvbWljX3NldCgmaHctPnZmX3ByZV9jb3VudCwgMCk7CisJYXRvbWljX3NldCgmaHctPnZmX2dldF9jb3VudCwgMCk7CisJYXRvbWljX3NldCgmaHctPnZmX3B1dF9jb3VudCwgMCk7CisKKwlpZiAoaHctPmdlMmQpIHsKKwkJdmRlY19nZTJkX2Rlc3Ryb3koaHctPmdlMmQpOworCQlody0+Z2UyZCA9IE5VTEw7CisJfQorCisJYXYxX3ByaW50KGh3LCBQUklOVF9GTEFHX1ZERUNfREVUQUlMLCAiJXNcclxuIiwgX19mdW5jX18pOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYXYxX2lycV9jYihzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgaXJxKQoreworCXN0cnVjdCBBVjFIV19zICpodyA9CisJCShzdHJ1Y3QgQVYxSFdfcyAqKXZkZWMtPnByaXZhdGU7CisJcmV0dXJuIHZhdjFfaXNyKDAsIGh3KTsKK30KKworc3RhdGljIGlycXJldHVybl90IGF2MV90aHJlYWRlZF9pcnFfY2Ioc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGlycSkKK3sKKwlzdHJ1Y3QgQVYxSFdfcyAqaHcgPQorCQkoc3RydWN0IEFWMUhXX3MgKil2ZGVjLT5wcml2YXRlOworCXJldHVybiB2YXYxX2lzcl90aHJlYWRfZm4oMCwgaHcpOworfQorCitzdGF0aWMgdm9pZCBhdjFfZHVtcF9zdGF0ZShzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXN0cnVjdCBBVjFIV19zICpodyA9CisJCShzdHJ1Y3QgQVYxSFdfcyAqKXZkZWMtPnByaXZhdGU7CisJc3RydWN0IEFWMV9Db21tb25fcyAqY29uc3QgY20gPSAmaHctPmNvbW1vbjsKKwlpbnQgaTsKKwlhdjFfcHJpbnQoaHcsIDAsICI9PT09PT0gJXNcbiIsIF9fZnVuY19fKTsKKworCWF2MV9wcmludChodywgMCwKKwkJIndpZHRoL2hlaWdodCAoJWQvJWQpLCB1c2VkX2J1Zl9udW0gJWRcbiIsCisJCWNtLT53aWR0aCwKKwkJY20tPmhlaWdodCwKKwkJaHctPnVzZWRfYnVmX251bQorCQkpOworCisJYXYxX3ByaW50KGh3LCAwLAorCQkiaXNfZnJhbWViYXNlKCVkKSwgZW9zICVkLCBkZWNfcmVzdWx0IDB4JXggZGVjX2ZybSAlZCBkaXNwX2ZybSAlZCBydW4gJWQgbm90X3J1bl9yZWFkeSAlZCBpbnB1dF9lbXB0eSAlZCBsb3dfbGF0ZW5jeSAlZCBub19oZWFkICVkIFxuIiwKKwkJaW5wdXRfZnJhbWVfYmFzZWQodmRlYyksCisJCWh3LT5lb3MsCisJCWh3LT5kZWNfcmVzdWx0LAorCQlkZWNvZGVfZnJhbWVfY291bnRbaHctPmluZGV4XSwKKwkJZGlzcGxheV9mcmFtZV9jb3VudFtody0+aW5kZXhdLAorCQlydW5fY291bnRbaHctPmluZGV4XSwKKwkJbm90X3J1bl9yZWFkeVtody0+aW5kZXhdLAorCQlpbnB1dF9lbXB0eVtody0+aW5kZXhdLAorCQlody0+bG93X2xhdGVuY3lfZmxhZywKKwkJaHctPm5vX2hlYWQKKwkJKTsKKworCWlmICghaHctPmlzX3VzZWRfdjRsICYmIHZmX2dldF9yZWNlaXZlcih2ZGVjLT52Zl9wcm92aWRlcl9uYW1lKSkgeworCQllbnVtIHJlY2V2aXZlcl9zdGFydF9lIHN0YXRlID0KKwkJdmZfbm90aWZ5X3JlY2VpdmVyKHZkZWMtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQlWRlJBTUVfRVZFTlRfUFJPVklERVJfUVVSRVlfU1RBVEUsCisJCQlOVUxMKTsKKwkJYXYxX3ByaW50KGh3LCAwLAorCQkJIlxucmVjZWl2ZXIoJXMpIHN0YXRlICVkXG4iLAorCQkJdmRlYy0+dmZfcHJvdmlkZXJfbmFtZSwKKwkJCXN0YXRlKTsKKwl9CisKKwlhdjFfcHJpbnQoaHcsIDAsCisJIiVzLCBuZXdxKCVkLyVkKSwgZGlzcHEoJWQvJWQpLCB2ZiBwcmVwYXJlL2dldC9wdXQgKCVkLyVkLyVkKSwgZnJlZV9idWZfY291bnQgJWQgKG1pbiAlZCBmb3IgcnVuX3JlYWR5KVxuIiwKKwlfX2Z1bmNfXywKKwlrZmlmb19sZW4oJmh3LT5uZXdmcmFtZV9xKSwKKwlWRl9QT09MX1NJWkUsCisJa2ZpZm9fbGVuKCZody0+ZGlzcGxheV9xKSwKKwlWRl9QT09MX1NJWkUsCisJaHctPnZmX3ByZV9jb3VudCwKKwlody0+dmZfZ2V0X2NvdW50LAorCWh3LT52Zl9wdXRfY291bnQsCisJZ2V0X2ZyZWVfYnVmX2NvdW50KGh3KSwKKwlody0+cnVuX3JlYWR5X21pbl9idWZfbnVtCisJKTsKKworCWR1bXBfcGljX2xpc3QoaHcpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9CVUZfTlVNOyBpKyspIHsKKwkJYXYxX3ByaW50KGh3LCAwLAorCQkJIm12X0J1ZiglZCkgc3RhcnRfYWRyIDB4JXggc2l6ZSAweCV4IHVzZWQgJWRcbiIsCisJCQlpLAorCQkJaHctPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciwKKwkJCWh3LT5tX212X0JVRltpXS5zaXplLAorCQkJaHctPm1fbXZfQlVGW2ldLnVzZWRfZmxhZyk7CisJfQorCisJYXYxX3ByaW50KGh3LCAwLAorCQkiSEVWQ19ERUNfU1RBVFVTX1JFRz0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRykpOworCWF2MV9wcmludChodywgMCwKKwkJIkhFVkNfTVBDX0U9MHgleFxuIiwKKwkJUkVBRF9WUkVHKEhFVkNfTVBDX0UpKTsKKwlhdjFfcHJpbnQoaHcsIDAsCisJCSJERUNPREVfTU9ERT0weCV4XG4iLAorCQlSRUFEX1ZSRUcoREVDT0RFX01PREUpKTsKKwlhdjFfcHJpbnQoaHcsIDAsCisJCSJOQUxfU0VBUkNIX0NUTD0weCV4XG4iLAorCQlSRUFEX1ZSRUcoTkFMX1NFQVJDSF9DVEwpKTsKKwlhdjFfcHJpbnQoaHcsIDAsCisJCSJIRVZDX1BBUlNFUl9MQ1VfU1RBUlQ9MHgleFxuIiwKKwkJUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0xDVV9TVEFSVCkpOworCWF2MV9wcmludChodywgMCwKKwkJIkhFVkNfREVDT0RFX1NJWkU9MHgleFxuIiwKKwkJUkVBRF9WUkVHKEhFVkNfREVDT0RFX1NJWkUpKTsKKwlhdjFfcHJpbnQoaHcsIDAsCisJCSJIRVZDX1NISUZUX0JZVEVfQ09VTlQ9MHgleFxuIiwKKwkJUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCkpOworCWF2MV9wcmludChodywgMCwKKwkJIkhFVkNfU0hJRlRFRF9EQVRBPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX1NISUZURURfREFUQSkpOworCWF2MV9wcmludChodywgMCwKKwkJIkhFVkNfU1RSRUFNX1NUQVJUX0FERFI9MHgleFxuIiwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1NUQVJUX0FERFIpKTsKKwlhdjFfcHJpbnQoaHcsIDAsCisJCSJIRVZDX1NUUkVBTV9FTkRfQUREUj0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fRU5EX0FERFIpKTsKKwlhdjFfcHJpbnQoaHcsIDAsCisJCSJIRVZDX1NUUkVBTV9MRVZFTD0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fTEVWRUwpKTsKKwlhdjFfcHJpbnQoaHcsIDAsCisJCSJIRVZDX1NUUkVBTV9XUl9QVFI9MHgleFxuIiwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1dSX1BUUikpOworCWF2MV9wcmludChodywgMCwKKwkJIkhFVkNfU1RSRUFNX1JEX1BUUj0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSKSk7CisJYXYxX3ByaW50KGh3LCAwLAorCQkiUEFSU0VSX1ZJREVPX1JQPTB4JXhcbiIsCisJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF9ycCkpOworCWF2MV9wcmludChodywgMCwKKwkJIlBBUlNFUl9WSURFT19XUD0weCV4XG4iLAorCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfd3ApKTsKKworCWlmIChpbnB1dF9mcmFtZV9iYXNlZCh2ZGVjKSAmJgorCQkoZGVidWcgJiBQUklOVF9GTEFHX1ZERUNfREFUQSkKKwkJKSB7CisJCWludCBqajsKKwkJaWYgKGh3LT5jaHVuayAmJiBody0+Y2h1bmstPmJsb2NrICYmCisJCQlody0+ZGF0YV9zaXplID4gMCkgeworCQkJdTggKmRhdGEgPSBOVUxMOworCisJCQlpZiAoIWh3LT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJCQlkYXRhID0gY29kZWNfbW1fdm1hcCgKKwkJCQkJaHctPmNodW5rLT5ibG9jay0+c3RhcnQgKworCQkJCQlody0+ZGF0YV9vZmZzZXQsCisJCQkJCWh3LT5kYXRhX3NpemUpOworCQkJZWxzZQorCQkJCWRhdGEgPSAoKHU4ICopaHctPmNodW5rLT5ibG9jay0+c3RhcnRfdmlydCkKKwkJCQkJKyBody0+ZGF0YV9vZmZzZXQ7CisJCQlhdjFfcHJpbnQoaHcsIDAsCisJCQkJImZyYW1lIGRhdGEgc2l6ZSAweCV4XG4iLAorCQkJCWh3LT5kYXRhX3NpemUpOworCQkJZm9yIChqaiA9IDA7IGpqIDwgaHctPmRhdGFfc2l6ZTsgamorKykgeworCQkJCWlmICgoamogJiAweGYpID09IDApCisJCQkJCWF2MV9wcmludChodywgMCwKKwkJCQkJCSIlMDZ4OiIsIGpqKTsKKwkJCQlhdjFfcHJpbnRfY29udChodywgMCwKKwkJCQkJIiUwMnggIiwgZGF0YVtqal0pOworCQkJCWlmICgoKGpqICsgMSkgJiAweGYpID09IDApCisJCQkJCWF2MV9wcmludF9jb250KGh3LCAwLAorCQkJCQkJIlxuIik7CisJCQl9CisKKwkJCWlmICghaHctPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQkJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIoZGF0YSk7CisJCX0KKwl9CisKK30KKworc3RhdGljIGludCBhbW12ZGVjX2F2MV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB2ZGVjX3MgKnBkYXRhID0gKihzdHJ1Y3QgdmRlY19zICoqKXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCByZXQ7CisJaW50IGNvbmZpZ192YWw7CisJaW50IGk7CisJc3RydWN0IHZmcmFtZV9jb250ZW50X2xpZ2h0X2xldmVsX3MgY29udGVudF9saWdodF9sZXZlbDsKKwlzdHJ1Y3QgdmZyYW1lX21hc3Rlcl9kaXNwbGF5X2NvbG91cl9zIHZmX2RwOworCXUzMiB3b3JrX2J1Zl9zaXplOworCXN0cnVjdCBCdWZmSW5mb19zICpwX2J1Zl9pbmZvOworCXN0cnVjdCBBVjFIV19zICpodyA9IE5VTEw7CisKKwlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA8IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UTTIpIHx8CisJCShnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1KSB8fAorCQkoKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVE0yKSAmJiAhaXNfbWVzb25fcmV2X2IoKSkpIHsKKwkJcHJfZXJyKCJhdjEgdW5zdXBwb3J0ZWQgb24gY3B1ICVkLCBpc190bTJfcmV2YiAlZFxuIiwKKwkJCWdldF9jcHVfbWFqb3JfaWQoKSwgaXNfY3B1X3RtMl9yZXZiKCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocGRhdGEgPT0gTlVMTCkgeworCQlhdjFfcHJpbnQoaHcsIDAsICJcbmFtbXZkZWNfYXYxIG1lbW9yeSByZXNvdXJjZSB1bmRlZmluZWQuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCW1lbXNldCgmdmZfZHAsIDAsIHNpemVvZihzdHJ1Y3QgdmZyYW1lX21hc3Rlcl9kaXNwbGF5X2NvbG91cl9zKSk7CisKKwlodyA9IHZ6YWxsb2Moc2l6ZW9mKHN0cnVjdCBBVjFIV19zKSk7CisJaWYgKGh3ID09IE5VTEwpIHsKKwkJYXYxX3ByaW50KGh3LCAwLCAiXG5hbW12ZGVjX2F2MSBkZXZpY2UgZGF0YSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChpbml0X2RibGtfc3RydWMoaHcpIDwgMCkgeworCQlhdjFfcHJpbnQoaHcsIDAsICJcbmFtbXZkZWNfYXYxIGRldmljZSBkYXRhIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJdmZyZWUoaHcpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlody0+cGJpID0gYXYxX2RlY29kZXJfY3JlYXRlKCZody0+YXYxX2J1ZmZlcl9wb29sLCAmaHctPmNvbW1vbik7IC8vJmFvbV9kZWNvZGVyOworCWlmIChody0+cGJpID09IE5VTEwpIHsKKwkJYXYxX3ByaW50KGh3LCAwLCAiXG5hbW12ZGVjX2F2MSBkZXZpY2UgZGF0YSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJlbGVhc2VfZGJsa19zdHJ1Y3QoaHcpOworCQl2ZnJlZShodyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWh3LT5wYmktPnByaXZhdGVfZGF0YSA9IGh3OworCS8qIHRoZSBjdHggZnJvbSB2NGwyIGRyaXZlci4gKi8KKwlody0+djRsMl9jdHggPSBwZGF0YS0+cHJpdmF0ZTsKKworCXBkYXRhLT5wcml2YXRlID0gaHc7CisJcGRhdGEtPmRlY19zdGF0dXMgPSB2YXYxX2RlY19zdGF0dXM7CisJLyogcGRhdGEtPnNldF90cmlja21vZGUgPSBzZXRfdHJpY2ttb2RlOyAqLworCXBkYXRhLT5ydW5fcmVhZHkgPSBydW5fcmVhZHk7CisJcGRhdGEtPnJ1biA9IHJ1bjsKKwlwZGF0YS0+cmVzZXQgPSByZXNldDsKKwlwZGF0YS0+aXJxX2hhbmRsZXIgPSBhdjFfaXJxX2NiOworCXBkYXRhLT50aHJlYWRlZF9pcnFfaGFuZGxlciA9IGF2MV90aHJlYWRlZF9pcnFfY2I7CisJcGRhdGEtPmR1bXBfc3RhdGUgPSBhdjFfZHVtcF9zdGF0ZTsKKworCWh3LT5pbmRleCA9IHBkZXYtPmlkOworCWlmIChpc19yZG1hX2VuYWJsZSgpKSB7CisJCWh3LT5yZG1hX2FkciA9IGRtYV9hbGxvY19jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksIFJETUFfU0laRSwgJmh3LT5yZG1hX3BoeV9hZHIsIEdGUF9LRVJORUwpOworCQlmb3IgKGkgPSAwOyBpIDwgU0NBTEVMVVRfREFUQV9XUklURV9OVU07IGkrKykgeworCQkJaHctPnJkbWFfYWRyW2kgKiA0XSA9IEhFVkNfSVFJVF9TQ0FMRUxVVF9XUl9BRERSICYgMHhmZmY7CisJCQlody0+cmRtYV9hZHJbaSAqIDQgKyAxXSA9IGk7CisJCQlody0+cmRtYV9hZHJbaSAqIDQgKyAyXSA9IEhFVkNfSVFJVF9TQ0FMRUxVVF9EQVRBICYgMHhmZmY7CisJCQlody0+cmRtYV9hZHJbaSAqIDQgKyAzXSA9IDA7CisJCQlpZiAoaSA9PSBTQ0FMRUxVVF9EQVRBX1dSSVRFX05VTSAtIDEpIHsKKwkJCQlody0+cmRtYV9hZHJbaSAqIDQgKyAyXSA9IChIRVZDX0lRSVRfU0NBTEVMVVRfREFUQSAmIDB4ZmZmKSB8IDB4MjAwMDA7CisJCQl9CisJCX0KKwl9CisJc25wcmludGYoaHctPnRyYWNlLnZkZWNfbmFtZSwgc2l6ZW9mKGh3LT50cmFjZS52ZGVjX25hbWUpLAorCQkiYXYxLSVkIiwgaHctPmluZGV4KTsKKwlzbnByaW50Zihody0+dHJhY2UucHRzX25hbWUsIHNpemVvZihody0+dHJhY2UucHRzX25hbWUpLAorCQkiJXMtdGltZXN0YW1wIiwgaHctPnRyYWNlLnZkZWNfbmFtZSk7CisJc25wcmludGYoaHctPnRyYWNlLm5ld19xX25hbWUsIHNpemVvZihody0+dHJhY2UubmV3X3FfbmFtZSksCisJCSIlcy1uZXdmcmFtZV9xIiwgaHctPnRyYWNlLnZkZWNfbmFtZSk7CisJc25wcmludGYoaHctPnRyYWNlLmRpc3BfcV9uYW1lLCBzaXplb2YoaHctPnRyYWNlLmRpc3BfcV9uYW1lKSwKKwkJIiVzLWRpc3BmcmFtZV9xIiwgaHctPnRyYWNlLnZkZWNfbmFtZSk7CisJc25wcmludGYoaHctPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIHNpemVvZihody0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSksCisJCSJkZWNvZGVyX3RpbWUlZCIsIHBkZXYtPmlkKTsKKwlzbnByaW50Zihody0+dHJhY2UuZGVjb2RlX3J1bl90aW1lX25hbWUsIHNpemVvZihody0+dHJhY2UuZGVjb2RlX3J1bl90aW1lX25hbWUpLAorCQkiZGVjb2Rlcl9ydW5fdGltZSVkIiwgcGRldi0+aWQpOworCXNucHJpbnRmKGh3LT50cmFjZS5kZWNvZGVfaGVhZGVyX21lbW9yeV90aW1lX25hbWUsIHNpemVvZihody0+dHJhY2UuZGVjb2RlX2hlYWRlcl9tZW1vcnlfdGltZV9uYW1lKSwKKwkJImRlY29kZXJfaGVhZGVyX3RpbWUlZCIsIHBkZXYtPmlkKTsKKwlzbnByaW50Zihody0+dHJhY2UuZGVjb2RlX3dvcmtfdGltZV9uYW1lLCBzaXplb2YoaHctPnRyYWNlLmRlY29kZV93b3JrX3RpbWVfbmFtZSksCisJCSJkZWNvZGVyX3dvcmtfdGltZSVkIiwgcGRldi0+aWQpOworCWlmIChwZGF0YS0+dXNlX3ZmbV9wYXRoKQorCQlzbnByaW50ZihwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwgVkRFQ19QUk9WSURFUl9OQU1FX1NJWkUsCisJCQlWRk1fREVDX1BST1ZJREVSX05BTUUpOworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0VOSEFOQ0VNRU5UX0RPTEJZVklTSU9OCisJZWxzZSBpZiAodmRlY19kdWFsKHBkYXRhKSkgeworCQlzdHJ1Y3QgQVYxSFdfcyAqaGV2Y19wYWlyID0gTlVMTDsKKworCQlpZiAoZHZfdG9nZ2xlX3Byb3ZfbmFtZSkgLypkZWJ1ZyBwdXJwb3NlKi8KKwkJCXNucHJpbnRmKHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJVkRFQ19QUk9WSURFUl9OQU1FX1NJWkUsCisJCQkJKHBkYXRhLT5tYXN0ZXIpID8gVkZNX0RFQ19EVkJMX1BST1ZJREVSX05BTUUgOgorCQkJCVZGTV9ERUNfRFZFTF9QUk9WSURFUl9OQU1FKTsKKwkJZWxzZQorCQkJc25wcmludGYocGRhdGEtPnZmX3Byb3ZpZGVyX25hbWUsCisJCQlWREVDX1BST1ZJREVSX05BTUVfU0laRSwKKwkJCQkocGRhdGEtPm1hc3RlcikgPyBWRk1fREVDX0RWRUxfUFJPVklERVJfTkFNRSA6CisJCQkJVkZNX0RFQ19EVkJMX1BST1ZJREVSX05BTUUpOworCQlpZiAocGRhdGEtPm1hc3RlcikKKwkJCWhldmNfcGFpciA9IChzdHJ1Y3QgQVYxSFdfcyAqKXBkYXRhLT5tYXN0ZXItPnByaXZhdGU7CisJCWVsc2UgaWYgKHBkYXRhLT5zbGF2ZSkKKwkJCWhldmNfcGFpciA9IChzdHJ1Y3QgQVYxSFdfcyAqKXBkYXRhLT5zbGF2ZS0+cHJpdmF0ZTsKKworCQlpZiAoaGV2Y19wYWlyKQorCQkJaHctPnNoaWZ0X2J5dGVfY291bnRfbG8gPSBoZXZjX3BhaXItPnNoaWZ0X2J5dGVfY291bnRfbG87CisJfQorI2VuZGlmCisJZWxzZQorCQlzbnByaW50ZihwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwgVkRFQ19QUk9WSURFUl9OQU1FX1NJWkUsCisJCQlNVUxUSV9JTlNUQU5DRV9QUk9WSURFUl9OQU1FICIuJTAyeCIsIHBkZXYtPmlkICYgMHhmZik7CisKKwlody0+cHJvdmlkZXJfbmFtZSA9IHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBkYXRhKTsKKworCWh3LT5wbGF0Zm9ybV9kZXYgPSBwZGV2OworCWh3LT52aWRlb19zaWduYWxfdHlwZSA9IDA7CisJaHctPm1faW5zX2ZsYWcgPSAxOworCisJZmlsbV9ncmFpbl90YXNrX2NyZWF0ZShodyk7CisKKwlpZiAocGRhdGEtPnN5c19pbmZvKSB7CisJCWh3LT52YXYxX2Ftc3RyZWFtX2RlY19pbmZvID0gKnBkYXRhLT5zeXNfaW5mbzsKKwkJaWYgKCh1bnNpZ25lZCBsb25nKSBody0+dmF2MV9hbXN0cmVhbV9kZWNfaW5mby5wYXJhbQorCQkJCSYgMHgwOCkgeworCQkJCWh3LT5sb3dfbGF0ZW5jeV9mbGFnID0gMTsKKwkJCX0gZWxzZQorCQkJCWh3LT5sb3dfbGF0ZW5jeV9mbGFnID0gMDsKKwl9IGVsc2UgeworCQlody0+dmF2MV9hbXN0cmVhbV9kZWNfaW5mby53aWR0aCA9IDA7CisJCWh3LT52YXYxX2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodCA9IDA7CisJCWh3LT52YXYxX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgPSAzMDsKKwl9CisKKwlpZiAoKGRlYnVnICYgSUdOT1JFX1BBUkFNX0ZST01fQ09ORklHKSA9PSAwICYmCisJCQlwZGF0YS0+Y29uZmlnX2xlbikgeworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwkJaW50IGF2MV9idWZfd2lkdGggPSAwOworCQlpbnQgYXYxX2J1Zl9oZWlnaHQgPSAwOworCQkvKnVzZSBwdHIgY29uZmlnIGZvciBkb3ViZWxfd3JpdGVfbW9kZSwgZXRjKi8KKwkJYXYxX3ByaW50KGh3LCAwLCAicGRhdGEtPmNvbmZpZz0lc1xuIiwgcGRhdGEtPmNvbmZpZyk7CisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAiYXYxX2RvdWJsZV93cml0ZV9tb2RlIiwKKwkJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWh3LT5kb3VibGVfd3JpdGVfbW9kZSA9IGNvbmZpZ192YWw7CisJCWVsc2UKKwkJCWh3LT5kb3VibGVfd3JpdGVfbW9kZSA9IGRvdWJsZV93cml0ZV9tb2RlOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAic2F2ZV9idWZmZXJfbW9kZSIsCisJCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+c2F2ZV9idWZmZXJfbW9kZSA9IGNvbmZpZ192YWw7CisJCWVsc2UKKwkJCWh3LT5zYXZlX2J1ZmZlcl9tb2RlID0gMDsKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJhdjFfYnVmX3dpZHRoIiwKKwkJCQkmY29uZmlnX3ZhbCkgPT0gMCkgeworCQkJYXYxX2J1Zl93aWR0aCA9IGNvbmZpZ192YWw7CisJCX0KKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJhdjFfYnVmX2hlaWdodCIsCisJCQkJJmNvbmZpZ192YWwpID09IDApIHsKKwkJCWF2MV9idWZfaGVpZ2h0ID0gY29uZmlnX3ZhbDsKKwkJfQorCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAibm9faGVhZCIsCisJCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+bm9faGVhZCA9IGNvbmZpZ192YWw7CisJCWVsc2UKKwkJCWh3LT5ub19oZWFkID0gbm9faGVhZDsKKworCQkvKnVzZSBwdHIgY29uZmlnIGZvciBtYXhfcGljX3csIGV0YyovCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAiYXYxX21heF9waWNfdyIsCisJCQkJJmNvbmZpZ192YWwpID09IDApIHsKKwkJCQlody0+bWF4X3BpY193ID0gY29uZmlnX3ZhbDsKKwkJfQorCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgImF2MV9tYXhfcGljX2giLAorCQkJCSZjb25maWdfdmFsKSA9PSAwKSB7CisJCQkJaHctPm1heF9waWNfaCA9IGNvbmZpZ192YWw7CisJCX0KKwkJaWYgKChody0+bWF4X3BpY193ICogaHctPm1heF9waWNfaCkKKwkJCTwgKGF2MV9idWZfd2lkdGggKiBhdjFfYnVmX2hlaWdodCkpIHsKKwkJCWh3LT5tYXhfcGljX3cgPSBhdjFfYnVmX3dpZHRoOworCQkJaHctPm1heF9waWNfaCA9IGF2MV9idWZfaGVpZ2h0OworCQkJYXYxX3ByaW50KGh3LCAwLCAidXNlIGJ1ZiByZXNvbHV0aW9uXG4iKTsKKwkJfQorCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAic2lkZWJpbmRfdHlwZSIsCisJCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+c2lkZWJpbmRfdHlwZSA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJzaWRlYmluZF9jaGFubmVsX2lkIiwKKwkJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWh3LT5zaWRlYmluZF9jaGFubmVsX2lkID0gY29uZmlnX3ZhbDsKKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywKKwkJCSJwYXJtX3Y0bF9jb2RlY19lbmFibGUiLAorCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+aXNfdXNlZF92NGwgPSBjb25maWdfdmFsOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLAorCQkJInBhcm1fdjRsX2J1ZmZlcl9tYXJnaW4iLAorCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlody0+ZHluYW1pY19idWZfbnVtX21hcmdpbiA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV92NGxfY2FudmFzX21lbV9tb2RlIiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJaHctPm1lbV9tYXBfbW9kZSA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV92NGxfbG93X2xhdGVuY3lfbW9kZSIsCisJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCWh3LT5sb3dfbGF0ZW5jeV9mbGFnID0gY29uZmlnX3ZhbDsKKwkJLyppZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywKKwkJCSJwYXJtX3Y0bF9kdXJhdGlvbiIsCisJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCXZkZWNfZnJhbWVfcmF0ZV91ZXZlbnQoY29uZmlnX3ZhbCk7Ki8KKworI2VuZGlmCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAiSERSU3RhdGljSW5mbyIsCisJCQkJJnZmX2RwLnByZXNlbnRfZmxhZykgPT0gMAorCQkJCSYmIHZmX2RwLnByZXNlbnRfZmxhZyA9PSAxKSB7CisJCQlnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAic2lnbmFsX3R5cGUiLAorCQkJCQkmaHctPnZpZGVvX3NpZ25hbF90eXBlKTsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtRy54IiwKKwkJCQkJJnZmX2RwLnByaW1hcmllc1swXVswXSk7CisJCQlnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAibUcueSIsCisJCQkJCSZ2Zl9kcC5wcmltYXJpZXNbMF1bMV0pOworCQkJZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm1CLngiLAorCQkJCQkmdmZfZHAucHJpbWFyaWVzWzFdWzBdKTsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtQi55IiwKKwkJCQkJJnZmX2RwLnByaW1hcmllc1sxXVsxXSk7CisJCQlnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAibVIueCIsCisJCQkJCSZ2Zl9kcC5wcmltYXJpZXNbMl1bMF0pOworCQkJZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm1SLnkiLAorCQkJCQkmdmZfZHAucHJpbWFyaWVzWzJdWzFdKTsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtVy54IiwKKwkJCQkJJnZmX2RwLndoaXRlX3BvaW50WzBdKTsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtVy55IiwKKwkJCQkJJnZmX2RwLndoaXRlX3BvaW50WzFdKTsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtTWF4REwiLAorCQkJCQkmdmZfZHAubHVtaW5hbmNlWzBdKTsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtTWluREwiLAorCQkJCQkmdmZfZHAubHVtaW5hbmNlWzFdKTsKKwkJCXZmX2RwLmNvbnRlbnRfbGlnaHRfbGV2ZWwucHJlc2VudF9mbGFnID0gMTsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtTWF4Q0xMIiwKKwkJCQkJJmNvbnRlbnRfbGlnaHRfbGV2ZWwubWF4X2NvbnRlbnQpOworCQkJZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm1NYXhGQUxMIiwKKwkJCQkJJmNvbnRlbnRfbGlnaHRfbGV2ZWwubWF4X3BpY19hdmVyYWdlKTsKKwkJCXZmX2RwLmNvbnRlbnRfbGlnaHRfbGV2ZWwgPSBjb250ZW50X2xpZ2h0X2xldmVsOworCQkJaWYgKCFody0+dmlkZW9fc2lnbmFsX3R5cGUpIHsKKwkJCQlody0+dmlkZW9fc2lnbmFsX3R5cGUgPSAoMSA8PCAyOSkKKwkJCQkJfCAoNSA8PCAyNikJLyogdW5zcGVjaWZpZWQgKi8KKwkJCQkJfCAoMCA8PCAyNSkJLyogbGltaXQgKi8KKwkJCQkJfCAoMSA8PCAyNCkJLyogY29sb3IgYXZhaWxhYmxlICovCisJCQkJCXwgKDkgPDwgMTYpCS8qIDIwMjAgKi8KKwkJCQkJfCAoMTYgPDwgOCkJLyogMjA4NCAqLworCQkJCQl8ICg5IDw8IDApOwkvKiAyMDIwICovCisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCX0KKwkJaHctPnZmX2RwID0gdmZfZHA7CisJfSBlbHNlIHsKKwkJdTMyIGZvcmNlX3csIGZvcmNlX2g7CisJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1RCkgeworCQkJZm9yY2VfdyA9IDE5MjA7CisJCQlmb3JjZV9oID0gMTA4ODsKKwkJfSBlbHNlIHsKKwkJCWZvcmNlX3cgPSA4MTkyOworCQkJZm9yY2VfaCA9IDQ2MDg7CisJCX0KKwkJaWYgKGh3LT52YXYxX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoKQorCQkJaHctPm1heF9waWNfdyA9IGh3LT52YXYxX2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoOworCQllbHNlCisJCQlody0+bWF4X3BpY193ID0gZm9yY2VfdzsKKworCQlpZiAoaHctPnZhdjFfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0KQorCQkJaHctPm1heF9waWNfaCA9IGh3LT52YXYxX2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodDsKKwkJZWxzZQorCQkJaHctPm1heF9waWNfaCA9IGZvcmNlX2g7CisJCWh3LT5kb3VibGVfd3JpdGVfbW9kZSA9IGRvdWJsZV93cml0ZV9tb2RlOworCX0KKworCWh3LT5lbmRpYW4gPSBIRVZDX0NPTkZJR19MSVRUTEVfRU5ESUFOOworCWlmIChlbmRpYW4pCisJCWh3LT5lbmRpYW4gPSBlbmRpYW47CisKKwlpZiAoaXNfb3ZlcnNpemUoaHctPm1heF9waWNfdywgaHctPm1heF9waWNfaCkpIHsKKwkJcHJfZXJyKCJvdmVyIHNpemU6ICVkeCVkLCBwcm9iZSBmYWlsZWRcbiIsCisJCQlody0+bWF4X3BpY193LCBody0+bWF4X3BpY19oKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoZm9yY2VfYnVmc3BlYykgeworCQlody0+YnVmZmVyX3NwZWNfaW5kZXggPSBmb3JjZV9idWZzcGVjICYgMHhmOworCQlwcl9pbmZvKCJmb3JjZSBidWZmZXIgc3BlYyAlZFxuIiwgZm9yY2VfYnVmc3BlYyAmIDB4Zik7CisJfSBlbHNlIGlmICh2ZGVjX2lzX3N1cHBvcnRfNGsoKSkgeworCQlody0+YnVmZmVyX3NwZWNfaW5kZXggPSAxOworCX0gZWxzZQorCQlody0+YnVmZmVyX3NwZWNfaW5kZXggPSAwOworCisJaWYgKGh3LT5idWZmZXJfc3BlY19pbmRleCA9PSAwKQorCQlody0+bWF4X29uZV9tdl9idWZmZXJfc2l6ZSA9CisJCQkoZ2V0X2NwdV9tYWpvcl9pZCgpID4gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NDMikgPworCQkJCU1BWF9PTkVfTVZfQlVGRkVSX1NJWkVfMTA4MFAgOiBNQVhfT05FX01WX0JVRkZFUl9TSVpFXzEwODBQX1RNMlJFVkI7CisJZWxzZSBpZiAoaHctPmJ1ZmZlcl9zcGVjX2luZGV4ID09IDEpCisJCWh3LT5tYXhfb25lX212X2J1ZmZlcl9zaXplID0KKwkJKGdldF9jcHVfbWFqb3JfaWQoKSA+IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TQzIpID8KKwkJCU1BWF9PTkVfTVZfQlVGRkVSX1NJWkVfNEsgOiBNQVhfT05FX01WX0JVRkZFUl9TSVpFXzRLX1RNMlJFVkI7CisJZWxzZQorCQlody0+bWF4X29uZV9tdl9idWZmZXJfc2l6ZSA9CisJCShnZXRfY3B1X21ham9yX2lkKCkgPiBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU0MyKSA/CisJCQlNQVhfT05FX01WX0JVRkZFUl9TSVpFXzhLIDogTUFYX09ORV9NVl9CVUZGRVJfU0laRV84S19UTTJSRVZCOworCisJcF9idWZfaW5mbyA9ICZhb21fd29ya2J1ZmZfc3BlY1tody0+YnVmZmVyX3NwZWNfaW5kZXhdOworCXdvcmtfYnVmX3NpemUgPSAocF9idWZfaW5mby0+ZW5kX2FkciAtIHBfYnVmX2luZm8tPnN0YXJ0X2FkcgorCQkgKyAweGZmZmYpICYgKH4weGZmZmYpOworCisJaWYgKHZkZWNfaXNfc3VwcG9ydF80aygpICYmCisJCShody0+bWF4X3BpY193ICogaHctPm1heF9waWNfaCA8IE1BWF9TSVpFXzRLKSkgeworCQlody0+bWF4X3BpY193ID0gNDA5NjsKKwkJaHctPm1heF9waWNfaCA9IDIzMDQ7CisJfQorCWF2MV9wcmludChodywgMCwKKwkJCSJ2ZGVjX2lzX3N1cHBvcnRfNGsoKSAlZCAgbWF4X3BpY193ICVkIG1heF9waWNfaCAlZCBidWZmZXJfc3BlY19pbmRleCAlZCB3b3JrX2J1Zl9zaXplIDB4JXhcbiIsCisJCQl2ZGVjX2lzX3N1cHBvcnRfNGsoKSwgaHctPm1heF9waWNfdywgaHctPm1heF9waWNfaCwKKwkJCWh3LT5idWZmZXJfc3BlY19pbmRleCwgd29ya19idWZfc2l6ZSk7CisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTCB8fAorCQlody0+ZG91YmxlX3dyaXRlX21vZGUgPT0gMHgxMCkKKwkJaHctPm1tdV9lbmFibGUgPSAwOworCWVsc2UKKwkJaHctPm1tdV9lbmFibGUgPSAxOworCisJdmlkZW9fc2lnbmFsX3R5cGUgPSBody0+dmlkZW9fc2lnbmFsX3R5cGU7CisKKwlpZiAocGRhdGEtPnN5c19pbmZvKSB7CisJCWh3LT52YXYxX2Ftc3RyZWFtX2RlY19pbmZvID0gKnBkYXRhLT5zeXNfaW5mbzsKKwkJaWYgKCh1bnNpZ25lZCBsb25nKSBody0+dmF2MV9hbXN0cmVhbV9kZWNfaW5mby5wYXJhbQorCQkJCSYgMHgwOCkgeworCQkJCWh3LT5sb3dfbGF0ZW5jeV9mbGFnID0gMTsKKwkJCX0gZWxzZQorCQkJCWh3LT5sb3dfbGF0ZW5jeV9mbGFnID0gMDsKKwl9IGVsc2UgeworCQlody0+dmF2MV9hbXN0cmVhbV9kZWNfaW5mby53aWR0aCA9IDA7CisJCWh3LT52YXYxX2Ftc3RyZWFtX2RlY19pbmZvLmhlaWdodCA9IDA7CisJCWh3LT52YXYxX2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgPSAzMDsKKwl9CisKKyNpZmRlZiBBT01fQVYxX01NVV9EVworCWh3LT5kd19tbXVfZW5hYmxlID0KKwkJZ2V0X2RvdWJsZV93cml0ZV9tb2RlX2luaXQoaHcpICYgMHgyMCA/IDEgOiAwOworCisjZW5kaWYKKwlhdjFfcHJpbnQoaHcsIDAsCisJCQkibm9faGVhZCAlZCAgbG93X2xhdGVuY3kgJWQgdmlkZW9fc2lnbmFsX3R5cGUgMHgleFxuIiwKKwkJCWh3LT5ub19oZWFkLCBody0+bG93X2xhdGVuY3lfZmxhZywgaHctPnZpZGVvX3NpZ25hbF90eXBlKTsKKyNpZiAwCisJaHctPmJ1Zl9zdGFydCA9IHBkYXRhLT5tZW1fc3RhcnQ7CisJaHctPmJ1Zl9zaXplID0gcGRhdGEtPm1lbV9lbmQgLSBwZGF0YS0+bWVtX3N0YXJ0ICsgMTsKKyNlbHNlCisJaWYgKGFtdmRlY19hdjFfbW11X2luaXQoaHcpIDwgMCkgeworCQlwcl9lcnIoImF2MSBhbGxvYyBibW11IGJveCBmYWlsZWQhIVxuIik7CisJCS8qIGRldm1fa2ZyZWUoJnBkZXYtPmRldiwgKHZvaWQgKilodyk7ICovCisJCXZmcmVlKCh2b2lkICopaHcpOworCQlwZGF0YS0+ZGVjX3N0YXR1cyA9IE5VTEw7CisJCXJldHVybiAtMTsKKwl9CisKKwlody0+Y21hX2FsbG9jX2NvdW50ID0gUEFHRV9BTElHTih3b3JrX2J1Zl9zaXplKSAvIFBBR0VfU0laRTsKKwlyZXQgPSBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkoaHctPmJtbXVfYm94LCBXT1JLX1NQQUNFX0JVRl9JRCwKKwkJCWh3LT5jbWFfYWxsb2NfY291bnQgKiBQQUdFX1NJWkUsIERSSVZFUl9OQU1FLAorCQkJJmh3LT5jbWFfYWxsb2NfYWRkcik7CisJaWYgKHJldCA8IDApIHsKKwkJdW5pbml0X21tdV9idWZmZXJzKGh3KTsKKwkJLyogZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCAodm9pZCAqKWh3KTsgKi8KKwkJdmZyZWUoKHZvaWQgKilodyk7CisJCXBkYXRhLT5kZWNfc3RhdHVzID0gTlVMTDsKKwkJcmV0dXJuIHJldDsKKwl9CisJaHctPmJ1Zl9zdGFydCA9IGh3LT5jbWFfYWxsb2NfYWRkcjsKKwlody0+YnVmX3NpemUgPSB3b3JrX2J1Zl9zaXplOworI2VuZGlmCisKKwlody0+aW5pdF9mbGFnID0gMDsKKwlody0+Zmlyc3Rfc2NfY2hlY2tlZCA9IDA7CisJaHctPmZhdGFsX2Vycm9yID0gMDsKKwlody0+c2hvd19mcmFtZV9udW0gPSAwOworCWh3LT5ydW5fcmVhZHlfbWluX2J1Zl9udW0gPSBydW5fcmVhZHlfbWluX2J1Zl9udW07CisKKwlpZiAoaHctPmlzX3VzZWRfdjRsICYmIChody0+djRsMl9jdHggIT0gTlVMTCkpIHsKKwkJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPSBody0+djRsMl9jdHg7CisKKwkJY3R4LT5hdXhfaW5mb3MuYWxsb2NfYnVmZmVyKGN0eCwgU0VJX1RZUEUgfCBEVl9UWVBFKTsKKwl9CisKKwlody0+YXV4X2RhdGFfc2l6ZSA9IEFVWF9CVUZfQUxJR04ocHJlZml4X2F1eF9idWZfc2l6ZSkgKworCQlBVVhfQlVGX0FMSUdOKHN1ZmZpeF9hdXhfYnVmX3NpemUpOworCWh3LT5kdl9kYXRhX2J1ZiA9IHZtYWxsb2MoaHctPmF1eF9kYXRhX3NpemUpOworCWh3LT5kdl9kYXRhX3NpemUgPSAwOworCisJaWYgKGRlYnVnKSB7CisJCWF2MV9wcmludChodywgQU9NX0RFQlVHX0hXX01PUkUsICI9PT1BVjEgZGVjb2RlciBtZW0gcmVzb3VyY2UgMHglbHggc2l6ZSAweCV4XG4iLAorCQkJICAgaHctPmJ1Zl9zdGFydCwKKwkJCSAgIGh3LT5idWZfc2l6ZSk7CisJfQorCisJaHctPmNtYV9kZXYgPSBwZGF0YS0+Y21hX2RldjsKKwlpZiAodmF2MV9pbml0KHBkYXRhKSA8IDApIHsKKwkJYXYxX3ByaW50KGh3LCAwLCAiXG5hbXZkZWNfYXYxIGluaXQgZmFpbGVkLlxuIik7CisJCWF2MV9sb2NhbF91bmluaXQoaHcsIGZhbHNlKTsKKwkJdW5pbml0X21tdV9idWZmZXJzKGh3KTsKKwkJLyogZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCAodm9pZCAqKWh3KTsgKi8KKwkJdmZyZWUoKHZvaWQgKilodyk7CisJCXBkYXRhLT5kZWNfc3RhdHVzID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisjaWZkZWYgQVVYX0RBVEFfQ1JDCisJdmRlY19hdXhfZGF0YV9jaGVja19pbml0KHBkYXRhKTsKKyNlbmRpZgorCisJdmRlY19zZXRfcHJlcGFyZV9sZXZlbChwZGF0YSwgc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCk7CisJaGV2Y19zb3VyY2VfY2hhbmdlZChWRk9STUFUX0FWMSwgNDA5NiwgMjA0OCwgNjApOworCisJaWYgKHBkYXRhLT5wYXJhbGxlbF9kZWMgPT0gMSkKKwkJdmRlY19jb3JlX3JlcXVlc3QocGRhdGEsIENPUkVfTUFTS19IRVZDKTsKKwllbHNlCisJCXZkZWNfY29yZV9yZXF1ZXN0KHBkYXRhLCBDT1JFX01BU0tfVkRFQ18xIHwgQ09SRV9NQVNLX0hFVkMKKwkJCQkJfCBDT1JFX01BU0tfQ09NQklORSk7CisKKwlody0+cGljX2xpc3RfaW5pdF9kb25lMiA9IHRydWU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1tdmRlY19hdjFfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IEFWMUhXX3MgKmh3ID0gKHN0cnVjdCBBVjFIV19zICopCisJCSgoKHN0cnVjdCB2ZGVjX3MgKikocGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldikpKS0+cHJpdmF0ZSk7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMoaHcpOworCWludCBpOworCWlmIChkZWJ1ZykKKwkJYXYxX3ByaW50KGh3LCBBT01fREVCVUdfSFdfTU9SRSwgImFtdmRlY19hdjFfcmVtb3ZlXG4iKTsKKworI2lmZGVmIEFVWF9EQVRBX0NSQworCXZkZWNfYXV4X2RhdGFfY2hlY2tfZXhpdCh2ZGVjKTsKKyNlbmRpZgorCisJaWYgKGh3LT5kdl9kYXRhX2J1ZiAhPSBOVUxMKSB7CisJCXZmcmVlKGh3LT5kdl9kYXRhX2J1Zik7CisJCWh3LT5kdl9kYXRhX2J1ZiA9IE5VTEw7CisJfQorCisJdm1hdjFfc3RvcChodyk7CisKKwlmaWxtX2dyYWluX3Rhc2tfZXhpdChodyk7CisKKwlpZiAoaHctPmdlMmQpIHsKKwkJdmRlY19nZTJkX2Rlc3Ryb3koaHctPmdlMmQpOworCQlody0+Z2UyZCA9IE5VTEw7CisJfQorCisJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKQorCQl2ZGVjX2NvcmVfcmVsZWFzZShod190b192ZGVjKGh3KSwgQ09SRV9NQVNLX0hFVkMpOworCWVsc2UKKwkJdmRlY19jb3JlX3JlbGVhc2UoaHdfdG9fdmRlYyhodyksIENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQyk7CisKKwl2ZGVjX3NldF9zdGF0dXMoaHdfdG9fdmRlYyhodyksIFZERUNfU1RBVFVTX0RJU0NPTk5FQ1RFRCk7CisKKwlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJZm9yIChpID0gMDsgaSA8IEZSQU1FX0JVRkZFUlM7IGkrKykgeworCQkJdmRlYy0+ZnJlZV9jYW52YXNfZXgKKwkJCQkoaHctPmNvbW1vbi5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmc1tpXS5idWYueV9jYW52YXNfaW5kZXgsCisJCQkJdmRlYy0+aWQpOworCQkJdmRlYy0+ZnJlZV9jYW52YXNfZXgKKwkJCQkoaHctPmNvbW1vbi5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmc1tpXS5idWYudXZfY2FudmFzX2luZGV4LAorCQkJCXZkZWMtPmlkKTsKKwkJfQorCX0KKworI2lmZGVmIERFQlVHX1BUUworCXByX2luZm8oInB0cyBtaXNzZWQgJWxkLCBwdHMgaGl0ICVsZCwgZHVyYXRpb24gJWRcbiIsCisJCSAgIGh3LT5wdHNfbWlzc2VkLCBody0+cHRzX2hpdCwgaHctPmZyYW1lX2R1cik7CisjZW5kaWYKKwkvKiBkZXZtX2tmcmVlKCZwZGV2LT5kZXYsICh2b2lkICopaHcpOyAqLworCWlmIChpc19yZG1hX2VuYWJsZSgpKQorCQlkbWFfZnJlZV9jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksIFJETUFfU0laRSwgaHctPnJkbWFfYWRyLCBody0+cmRtYV9waHlfYWRyKTsKKwl2ZnJlZShody0+cGJpKTsKKwlyZWxlYXNlX2RibGtfc3RydWN0KGh3KTsKKwl2ZnJlZSgodm9pZCAqKWh3KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYW1tdmRlY19hdjFfZHJpdmVyID0geworCS5wcm9iZSA9IGFtbXZkZWNfYXYxX3Byb2JlLAorCS5yZW1vdmUgPSBhbW12ZGVjX2F2MV9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBNVUxUSV9EUklWRVJfTkFNRSwKKyNpZmRlZiBDT05GSUdfUE0KKwkJLnBtID0gJmF2MV9wbV9vcHMsCisjZW5kaWYKKwl9Cit9OworI2VuZGlmCitzdGF0aWMgc3RydWN0IG1jb25maWcgYXYxX2NvbmZpZ3NbXSA9IHsKKwlNQ19QVTMyKCJiaXRfZGVwdGhfbHVtYSIsICZiaXRfZGVwdGhfbHVtYSksCisJTUNfUFUzMigiYml0X2RlcHRoX2Nocm9tYSIsICZiaXRfZGVwdGhfY2hyb21hKSwKKwlNQ19QVTMyKCJmcmFtZV93aWR0aCIsICZmcmFtZV93aWR0aCksCisJTUNfUFUzMigiZnJhbWVfaGVpZ2h0IiwgJmZyYW1lX2hlaWdodCksCisJTUNfUFUzMigiZGVidWciLCAmZGVidWcpLAorCU1DX1BVMzIoInJhZHIiLCAmcmFkciksCisJTUNfUFUzMigicnZhbCIsICZydmFsKSwKKwlNQ19QVTMyKCJwb3Bfc2hvcnRzIiwgJnBvcF9zaG9ydHMpLAorCU1DX1BVMzIoImRiZ19jbWQiLCAmZGJnX2NtZCksCisJTUNfUFUzMigiZGJnX3NraXBfZGVjb2RlX2luZGV4IiwgJmRiZ19za2lwX2RlY29kZV9pbmRleCksCisJTUNfUFUzMigiZW5kaWFuIiwgJmVuZGlhbiksCisJTUNfUFUzMigic3RlcCIsICZzdGVwKSwKKwlNQ19QVTMyKCJ1ZGVidWdfZmxhZyIsICZ1ZGVidWdfZmxhZyksCisJTUNfUFUzMigiZGVjb2RlX3BpY19iZWdpbiIsICZkZWNvZGVfcGljX2JlZ2luKSwKKwlNQ19QVTMyKCJzbGljZV9wYXJzZV9iZWdpbiIsICZzbGljZV9wYXJzZV9iZWdpbiksCisJTUNfUFUzMigiaV9vbmx5X2ZsYWciLCAmaV9vbmx5X2ZsYWcpLAorCU1DX1BVMzIoImVycm9yX2hhbmRsZV9wb2xpY3kiLCAmZXJyb3JfaGFuZGxlX3BvbGljeSksCisJTUNfUFUzMigiYnVmX2FsbG9jX3dpZHRoIiwgJmJ1Zl9hbGxvY193aWR0aCksCisJTUNfUFUzMigiYnVmX2FsbG9jX2hlaWdodCIsICZidWZfYWxsb2NfaGVpZ2h0KSwKKwlNQ19QVTMyKCJidWZfYWxsb2NfZGVwdGgiLCAmYnVmX2FsbG9jX2RlcHRoKSwKKwlNQ19QVTMyKCJidWZfYWxsb2Nfc2l6ZSIsICZidWZfYWxsb2Nfc2l6ZSksCisJTUNfUFUzMigiYnVmZmVyX21vZGUiLCAmYnVmZmVyX21vZGUpLAorCU1DX1BVMzIoImJ1ZmZlcl9tb2RlX2RiZyIsICZidWZmZXJfbW9kZV9kYmcpLAorCU1DX1BVMzIoIm1heF9idWZfbnVtIiwgJm1heF9idWZfbnVtKSwKKwlNQ19QVTMyKCJkeW5hbWljX2J1Zl9udW1fbWFyZ2luIiwgJmR5bmFtaWNfYnVmX251bV9tYXJnaW4pLAorCU1DX1BVMzIoIm1lbV9tYXBfbW9kZSIsICZtZW1fbWFwX21vZGUpLAorCU1DX1BVMzIoImRvdWJsZV93cml0ZV9tb2RlIiwgJmRvdWJsZV93cml0ZV9tb2RlKSwKKwlNQ19QVTMyKCJlbmFibGVfbWVtX3NhdmluZyIsICZlbmFibGVfbWVtX3NhdmluZyksCisJTUNfUFUzMigiZm9yY2Vfd19oIiwgJmZvcmNlX3dfaCksCisJTUNfUFUzMigiZm9yY2VfZnBzIiwgJmZvcmNlX2ZwcyksCisJTUNfUFUzMigibWF4X2RlY29kaW5nX3RpbWUiLCAmbWF4X2RlY29kaW5nX3RpbWUpLAorCU1DX1BVMzIoIm9uX25vX2tleWZyYW1lX3NraXBlZCIsICZvbl9ub19rZXlmcmFtZV9za2lwZWQpLAorCU1DX1BVMzIoInN0YXJ0X2RlY29kZV9idWZfbGV2ZWwiLCAmc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCksCisJTUNfUFUzMigiZGVjb2RlX3RpbWVvdXRfdmFsIiwgJmRlY29kZV90aW1lb3V0X3ZhbCksCisJTUNfUFUzMigiYXYxX21heF9waWNfdyIsICZhdjFfbWF4X3BpY193KSwKKwlNQ19QVTMyKCJhdjFfbWF4X3BpY19oIiwgJmF2MV9tYXhfcGljX2gpLAorfTsKK3N0YXRpYyBzdHJ1Y3QgbWNvbmZpZ19ub2RlIGF2MV9ub2RlOworCitzdGF0aWMgaW50IF9faW5pdCBhbXZkZWNfYXYxX2RyaXZlcl9pbml0X21vZHVsZSh2b2lkKQoreworCS8vc3RydWN0IEJ1ZmZJbmZvX3MgKnBfYnVmX2luZm87CisJaW50IGk7CisjaWZkZWYgQlVGTUdSX09OTFlfT0xEX0NISVAKKwlkZWJ1ZyB8PSBBT01fREVCVUdfQlVGTUdSX09OTFk7CisjZW5kaWYKKwkvKgorCWlmICh2ZGVjX2lzX3N1cHBvcnRfNGsoKSkgeworCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpCisJCQlwX2J1Zl9pbmZvID0gJmFvbV93b3JrYnVmZl9zcGVjWzFdOworCQllbHNlCisJCQlwX2J1Zl9pbmZvID0gJmFvbV93b3JrYnVmZl9zcGVjWzFdOworCX0gZWxzZQorCQlwX2J1Zl9pbmZvID0gJmFvbV93b3JrYnVmZl9zcGVjWzBdOworCisJaW5pdF9idWZmX3NwZWMoTlVMTCwgcF9idWZfaW5mbyk7CisJd29ya19idWZfc2l6ZSA9CisJCShwX2J1Zl9pbmZvLT5lbmRfYWRyIC0gcF9idWZfaW5mby0+c3RhcnRfYWRyCisJCSArIDB4ZmZmZikgJiAofjB4ZmZmZik7CisJKi8KKwlmb3IgKGkgPSAwOyBpIDwgV09SS19CVUZfU1BFQ19OVU07IGkrKykKKwkJaW5pdF9idWZmX3NwZWMoTlVMTCwgJmFvbV93b3JrYnVmZl9zcGVjW2ldKTsKKworCXByX2RlYnVnKCJhbXZkZWNfYXYxIG1vZHVsZSBpbml0XG4iKTsKKworCWVycm9yX2hhbmRsZV9wb2xpY3kgPSAwOworCisjaWZkZWYgRVJST1JfSEFORExFX0RFQlVHCisJZGJnX25hbF9za2lwX2ZsYWcgPSAwOworCWRiZ19uYWxfc2tpcF9jb3VudCA9IDA7CisjZW5kaWYKKwl1ZGVidWdfZmxhZyA9IDA7CisJZGVjb2RlX3BpY19iZWdpbiA9IDA7CisJc2xpY2VfcGFyc2VfYmVnaW4gPSAwOworCXN0ZXAgPSAwOworCWJ1Zl9hbGxvY19zaXplID0gMDsKKworCWlmIChwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFtbXZkZWNfYXYxX2RyaXZlcikpIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gcmVnaXN0ZXIgYW1tdmRlY19hdjEgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q1RCkgeworCQlhbXZkZWNfYXYxX3Byb2ZpbGUucHJvZmlsZSA9CisJCQkJIjEwYml0LCBkd3JpdGUsIGNvbXByZXNzZWQsIG5vX2hlYWQsIHV2bSI7CisJfSBlbHNlIGlmICgoKGdldF9jcHVfbWFqb3JfaWQoKSA+IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UTTIpIHx8IGlzX2NwdV90bTJfcmV2YigpKQorCQkmJiAoZ2V0X2NwdV9tYWpvcl9pZCgpICE9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNSkpIHsKKwkJYW12ZGVjX2F2MV9wcm9maWxlLnByb2ZpbGUgPQorCQkJCSI4aywgMTBiaXQsIGR3cml0ZSwgY29tcHJlc3NlZCwgbm9faGVhZCwgZnJhbWVfZHYsIHV2bSI7CisJfSBlbHNlIHsKKwkJYW12ZGVjX2F2MV9wcm9maWxlLm5hbWUgPSAiYXYxX3Vuc3VwcG9ydCI7CisJfQorCisJdmNvZGVjX3Byb2ZpbGVfcmVnaXN0ZXIoJmFtdmRlY19hdjFfcHJvZmlsZSk7CisKKwlJTklUX1JFR19OT0RFX0NPTkZJR1MoIm1lZGlhLmRlY29kZXIiLCAmYXYxX25vZGUsCisJCSJhdjEtdjRsIiwgYXYxX2NvbmZpZ3MsIENPTkZJR19GT1JfUlcpOworCXZjb2RlY19mZWF0dXJlX3JlZ2lzdGVyKFZGT1JNQVRfQVYxLCAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYW12ZGVjX2F2MV9kcml2ZXJfcmVtb3ZlX21vZHVsZSh2b2lkKQoreworCXByX2RlYnVnKCJhbXZkZWNfYXYxIG1vZHVsZSByZW1vdmUuXG4iKTsKKworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhbW12ZGVjX2F2MV9kcml2ZXIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorbW9kdWxlX3BhcmFtKGZvcmNlX2R2X2VuYWJsZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2R2X2VuYWJsZSwgIlxuIGFtdmRlY19hdjEgZm9yY2VfZHZfZW5hYmxlXG4iKTsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0oYml0X2RlcHRoX2x1bWEsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhiaXRfZGVwdGhfbHVtYSwgIlxuIGFtdmRlY19hdjEgYml0X2RlcHRoX2x1bWFcbiIpOworCittb2R1bGVfcGFyYW0oYml0X2RlcHRoX2Nocm9tYSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGJpdF9kZXB0aF9jaHJvbWEsICJcbiBhbXZkZWNfYXYxIGJpdF9kZXB0aF9jaHJvbWFcbiIpOworCittb2R1bGVfcGFyYW0oZnJhbWVfd2lkdGgsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmcmFtZV93aWR0aCwgIlxuIGFtdmRlY19hdjEgZnJhbWVfd2lkdGhcbiIpOworCittb2R1bGVfcGFyYW0oZnJhbWVfaGVpZ2h0LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZnJhbWVfaGVpZ2h0LCAiXG4gYW12ZGVjX2F2MSBmcmFtZV9oZWlnaHRcbiIpOworCittb2R1bGVfcGFyYW0obXVsdGlfZnJhbWVzX2luX29uZV9wYWNrLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobXVsdGlfZnJhbWVzX2luX29uZV9wYWNrLCAiXG4gbXVsdGlfZnJhbWVzX2luX29uZV9wYWNrXG4iKTsKKworbW9kdWxlX3BhcmFtKGRlYnVnLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJcbiBhbXZkZWNfYXYxIGRlYnVnXG4iKTsKKworbW9kdWxlX3BhcmFtKGRpc2FibGVfZmcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkaXNhYmxlX2ZnLCAiXG4gYW12ZGVjX2F2MSBkaXNhYmxlX2ZnXG4iKTsKKworbW9kdWxlX3BhcmFtKHJhZHIsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhyYWRyLCAiXG4gcmFkclxuIik7CisKK21vZHVsZV9wYXJhbShydmFsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocnZhbCwgIlxuIHJ2YWxcbiIpOworCittb2R1bGVfcGFyYW0ocG9wX3Nob3J0cywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBvcF9zaG9ydHMsICJcbiBydmFsXG4iKTsKKworbW9kdWxlX3BhcmFtKGRiZ19jbWQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkYmdfY21kLCAiXG4gZGJnX2NtZFxuIik7CisKK21vZHVsZV9wYXJhbShkYmdfc2tpcF9kZWNvZGVfaW5kZXgsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkYmdfc2tpcF9kZWNvZGVfaW5kZXgsICJcbiBkYmdfc2tpcF9kZWNvZGVfaW5kZXhcbiIpOworCittb2R1bGVfcGFyYW0oZW5kaWFuLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5kaWFuLCAiXG4gcnZhbFxuIik7CisKK21vZHVsZV9wYXJhbShkaXNhYmxlX3JlcGVhdCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVfcmVwZWF0LCAiXG4gZGlzYWJsZV9yZXBlYXRcbiIpOworCittb2R1bGVfcGFyYW0oc3RlcCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHN0ZXAsICJcbiBhbXZkZWNfYXYxIHN0ZXBcbiIpOworCittb2R1bGVfcGFyYW0oZGVjb2RlX3BpY19iZWdpbiwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlY29kZV9waWNfYmVnaW4sICJcbiBhbXZkZWNfYXYxIGRlY29kZV9waWNfYmVnaW5cbiIpOworCittb2R1bGVfcGFyYW0oc2xpY2VfcGFyc2VfYmVnaW4sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhzbGljZV9wYXJzZV9iZWdpbiwgIlxuIGFtdmRlY19hdjEgc2xpY2VfcGFyc2VfYmVnaW5cbiIpOworCittb2R1bGVfcGFyYW0oaV9vbmx5X2ZsYWcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhpX29ubHlfZmxhZywgIlxuIGFtdmRlY19hdjEgaV9vbmx5X2ZsYWdcbiIpOworCittb2R1bGVfcGFyYW0obG93X2xhdGVuY3lfZmxhZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGxvd19sYXRlbmN5X2ZsYWcsICJcbiBhbXZkZWNfYXYxIGxvd19sYXRlbmN5X2ZsYWdcbiIpOworCittb2R1bGVfcGFyYW0obm9faGVhZCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vX2hlYWQsICJcbiBhbXZkZWNfYXYxIG5vX2hlYWRcbiIpOworCittb2R1bGVfcGFyYW0oZXJyb3JfaGFuZGxlX3BvbGljeSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVycm9yX2hhbmRsZV9wb2xpY3ksICJcbiBhbXZkZWNfYXYxIGVycm9yX2hhbmRsZV9wb2xpY3lcbiIpOworCittb2R1bGVfcGFyYW0oYnVmX2FsbG9jX3dpZHRoLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoYnVmX2FsbG9jX3dpZHRoLCAiXG4gYnVmX2FsbG9jX3dpZHRoXG4iKTsKKworbW9kdWxlX3BhcmFtKGJ1Zl9hbGxvY19oZWlnaHQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhidWZfYWxsb2NfaGVpZ2h0LCAiXG4gYnVmX2FsbG9jX2hlaWdodFxuIik7CisKK21vZHVsZV9wYXJhbShidWZfYWxsb2NfZGVwdGgsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhidWZfYWxsb2NfZGVwdGgsICJcbiBidWZfYWxsb2NfZGVwdGhcbiIpOworCittb2R1bGVfcGFyYW0oYnVmX2FsbG9jX3NpemUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhidWZfYWxsb2Nfc2l6ZSwgIlxuIGJ1Zl9hbGxvY19zaXplXG4iKTsKKworbW9kdWxlX3BhcmFtKGJ1ZmZlcl9tb2RlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoYnVmZmVyX21vZGUsICJcbiBidWZmZXJfbW9kZVxuIik7CisKK21vZHVsZV9wYXJhbShidWZmZXJfbW9kZV9kYmcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhidWZmZXJfbW9kZV9kYmcsICJcbiBidWZmZXJfbW9kZV9kYmdcbiIpOworLypVU0VfQlVGX0JMT0NLKi8KK21vZHVsZV9wYXJhbShtYXhfYnVmX251bSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9idWZfbnVtLCAiXG4gbWF4X2J1Zl9udW1cbiIpOworCittb2R1bGVfcGFyYW0oZHluYW1pY19idWZfbnVtX21hcmdpbiwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGR5bmFtaWNfYnVmX251bV9tYXJnaW4sICJcbiBkeW5hbWljX2J1Zl9udW1fbWFyZ2luXG4iKTsKKworbW9kdWxlX3BhcmFtKG12X2J1Zl9tYXJnaW4sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhtdl9idWZfbWFyZ2luLCAiXG4gbXZfYnVmX21hcmdpblxuIik7CisKK21vZHVsZV9wYXJhbShtdl9idWZfZHluYW1pY19hbGxvYywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG12X2J1Zl9keW5hbWljX2FsbG9jLCAiXG4gbXZfYnVmX2R5bmFtaWNfYWxsb2NcbiIpOworCittb2R1bGVfcGFyYW0oZm9yY2VfbWF4X29uZV9tdl9idWZmZXJfc2l6ZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX21heF9vbmVfbXZfYnVmZmVyX3NpemUsICJcbiBmb3JjZV9tYXhfb25lX212X2J1ZmZlcl9zaXplXG4iKTsKKworbW9kdWxlX3BhcmFtKHJ1bl9yZWFkeV9taW5fYnVmX251bSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJ1bl9yZWFkeV9taW5fYnVmX251bSwgIlxuIHJ1bl9yZWFkeV9taW5fYnVmX251bVxuIik7CisKKy8qKi8KKworbW9kdWxlX3BhcmFtKG1lbV9tYXBfbW9kZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG1lbV9tYXBfbW9kZSwgIlxuIG1lbV9tYXBfbW9kZVxuIik7CisKKyNpZmRlZiBTVVBQT1JUXzEwQklUCittb2R1bGVfcGFyYW0oZG91YmxlX3dyaXRlX21vZGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkb3VibGVfd3JpdGVfbW9kZSwgIlxuIGRvdWJsZV93cml0ZV9tb2RlXG4iKTsKKworbW9kdWxlX3BhcmFtKGVuYWJsZV9tZW1fc2F2aW5nLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlX21lbV9zYXZpbmcsICJcbiBlbmFibGVfbWVtX3NhdmluZ1xuIik7CisKK21vZHVsZV9wYXJhbShmb3JjZV93X2gsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV93X2gsICJcbiBmb3JjZV93X2hcbiIpOworI2VuZGlmCisKK21vZHVsZV9wYXJhbShmb3JjZV9mcHMsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9mcHMsICJcbiBmb3JjZV9mcHNcbiIpOworCittb2R1bGVfcGFyYW0obWF4X2RlY29kaW5nX3RpbWUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfZGVjb2RpbmdfdGltZSwgIlxuIG1heF9kZWNvZGluZ190aW1lXG4iKTsKKworbW9kdWxlX3BhcmFtKG9uX25vX2tleWZyYW1lX3NraXBlZCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG9uX25vX2tleWZyYW1lX3NraXBlZCwgIlxuIG9uX25vX2tleWZyYW1lX3NraXBlZFxuIik7CisKKyNpZmRlZiBNQ1JDQ19FTkFCTEUKK21vZHVsZV9wYXJhbShtY3JjY19jYWNoZV9hbGdfZmxhZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG1jcmNjX2NhY2hlX2FsZ19mbGFnLCAiXG4gbWNyY2NfY2FjaGVfYWxnX2ZsYWdcbiIpOworI2VuZGlmCisKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCittb2R1bGVfcGFyYW0oc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCwgaW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCwKKwkJIlxuIGF2MSBzdGFydF9kZWNvZGVfYnVmX2xldmVsXG4iKTsKKworbW9kdWxlX3BhcmFtKGRlY29kZV90aW1lb3V0X3ZhbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlY29kZV90aW1lb3V0X3ZhbCwKKwkiXG4gYXYxIGRlY29kZV90aW1lb3V0X3ZhbFxuIik7CisKK21vZHVsZV9wYXJhbShhdjFfbWF4X3BpY193LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoYXYxX21heF9waWNfdywgIlxuIGF2MV9tYXhfcGljX3dcbiIpOworCittb2R1bGVfcGFyYW0oYXYxX21heF9waWNfaCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGF2MV9tYXhfcGljX2gsICJcbiBhdjFfbWF4X3BpY19oXG4iKTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGRlY29kZV9mcmFtZV9jb3VudCwgdWludCwKKwkmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCittb2R1bGVfcGFyYW1fYXJyYXkoZGlzcGxheV9mcmFtZV9jb3VudCwgdWludCwKKwkmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCittb2R1bGVfcGFyYW1fYXJyYXkobWF4X3Byb2Nlc3NfdGltZSwgdWludCwKKwkmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCittb2R1bGVfcGFyYW1fYXJyYXkocnVuX2NvdW50LCB1aW50LAorCSZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisKK21vZHVsZV9wYXJhbV9hcnJheShpbnB1dF9lbXB0eSwgdWludCwKKwkmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCittb2R1bGVfcGFyYW1fYXJyYXkobm90X3J1bl9yZWFkeSwgdWludCwKKwkmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCisjaWZkZWYgQU9NX0FWMV9NTVVfRFcKK21vZHVsZV9wYXJhbV9hcnJheShkd19tbXVfZW5hYmxlLCB1aW50LAorCSZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKHByZWZpeF9hdXhfYnVmX3NpemUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhwcmVmaXhfYXV4X2J1Zl9zaXplLCAiXG4gcHJlZml4X2F1eF9idWZfc2l6ZVxuIik7CisKK21vZHVsZV9wYXJhbShzdWZmaXhfYXV4X2J1Zl9zaXplLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3VmZml4X2F1eF9idWZfc2l6ZSwgIlxuIHN1ZmZpeF9hdXhfYnVmX3NpemVcbiIpOworCisjZW5kaWYKKworI2lmZGVmIERVTVBfRklMTUdSQUlOCittb2R1bGVfcGFyYW0oZmdfZHVtcF9pbmRleCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZnX2R1bXBfaW5kZXgsICJcbiBmZ19kdW1wX2luZGV4XG4iKTsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0oZ2V0X3BpY3R1cmVfcW9zLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZ2V0X3BpY3R1cmVfcW9zLCAiXG4gYW12ZGVjX2F2MSBnZXRfcGljdHVyZV9xb3NcbiIpOworCittb2R1bGVfcGFyYW0oZm9yY2VfYnVmc3BlYywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2J1ZnNwZWMsICJcbiBhbXZkZWNfaDI2NSBmb3JjZV9idWZzcGVjXG4iKTsKKworbW9kdWxlX3BhcmFtKHVkZWJ1Z19mbGFnLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModWRlYnVnX2ZsYWcsICJcbiBhbXZkZWNfaDI2NSB1ZGVidWdfZmxhZ1xuIik7CisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9FTkhBTkNFTUVOVF9ET0xCWVZJU0lPTgorbW9kdWxlX3BhcmFtKGR2X3RvZ2dsZV9wcm92X25hbWUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkdl90b2dnbGVfcHJvdl9uYW1lLCAiXG4gZHZfdG9nZ2xlX3Byb3ZfbmFtZVxuIik7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKHVkZWJ1Z19wYXVzZV9wb3MsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh1ZGVidWdfcGF1c2VfcG9zLCAiXG4gdWRlYnVnX3BhdXNlX3Bvc1xuIik7CisKK21vZHVsZV9wYXJhbSh1ZGVidWdfcGF1c2VfdmFsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModWRlYnVnX3BhdXNlX3ZhbCwgIlxuIHVkZWJ1Z19wYXVzZV92YWxcbiIpOworCittb2R1bGVfcGFyYW0odWRlYnVnX3BhdXNlX2RlY29kZV9pZHgsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeCwgIlxuIHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4XG4iKTsKKworI2lmZGVmIERFQlVHX0NSQ19FUlJPUgorbW9kdWxlX3BhcmFtKGNyY19kZWJ1Z19mbGFnLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoY3JjX2RlYnVnX2ZsYWcsICJcbiBjcmNfZGVidWdfZmxhZ1xuIik7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX0NNRAorbW9kdWxlX3BhcmFtKGRlYnVnX2NtZF93YWl0X3R5cGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1Z19jbWRfd2FpdF90eXBlLCAiXG4gZGVidWdfY21kX3dhaXRfdHlwZVxuIik7CisKK21vZHVsZV9wYXJhbShkZWJ1Z19jbWRfd2FpdF9jb3VudCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnX2NtZF93YWl0X2NvdW50LCAiXG4gZGVidWdfY21kX3dhaXRfY291bnRcbiIpOworCittb2R1bGVfcGFyYW0oaGVhZGVyX2R1bXBfc2l6ZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGhlYWRlcl9kdW1wX3NpemUsICJcbiBoZWFkZXJfZHVtcF9zaXplXG4iKTsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0oZm9yY2VfcHRzX3Vuc3RhYmxlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2VfcHRzX3Vuc3RhYmxlLCAiXG4gZm9yY2VfcHRzX3Vuc3RhYmxlXG4iKTsKKworbW9kdWxlX3BhcmFtKHdpdGhvdXRfZGlzcGxheV9tb2RlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Mod2l0aG91dF9kaXNwbGF5X21vZGUsICJcbiB3aXRob3V0X2Rpc3BsYXlfbW9kZVxuIik7CisKK21vZHVsZV9wYXJhbSh2NGxfYml0c3RyZWFtX2lkX2VuYWJsZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHY0bF9iaXRzdHJlYW1faWRfZW5hYmxlLCAiXG4gdjRsX2JpdHN0cmVhbV9pZF9lbmFibGVcbiIpOworCittb2R1bGVfcGFyYW0oZW5hYmxlX3NpbmdsZV9zbGljZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZV9zaW5nbGVfc2xpY2UsICJcbiAgZW5hYmxlX3NpbmdsZV9zbGljZVxuIik7CisKK21vZHVsZV9pbml0KGFtdmRlY19hdjFfZHJpdmVyX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGFtdmRlY19hdjFfZHJpdmVyX3JlbW92ZV9tb2R1bGUpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFNTE9HSUMgYXYxIFZpZGVvIERlY29kZXIgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlcl92NGwvdmF2MS92YXYxLmggYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL3ZhdjEvdmF2MS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YzcxNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL3ZhdjEvdmF2MS5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvYW1wb3J0cy92YXYxLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBWQVYxX0gKKyNkZWZpbmUgVkFWMV9ICisKKyNkZWZpbmUgREVCVUdfRkdTX1JFR1MgICAgICAgICAgICAoMSA8PCAwKSAgIC8vMHgwMDAwMDAwMQorI2RlZmluZSBERUJVR19GR1NfUkVHU19QQVJTRSAgICAgICgxIDw8IDEpICAgLy8weDAwMDAwMDAyCisjZGVmaW5lIERFQlVHX0ZHU19ERVRBSUwgICAgICAgICAgKDEgPDwgMikgICAvLzB4MDAwMDAwMDQKKyNkZWZpbmUgREVCVUdfRkdTX1RBQkxFX0RVTVAgICAgICAoMSA8PCAzKSAgIC8vMHgwMDAwMDAwOAorI2RlZmluZSBERUJVR19GR1NfQ09OU1VNRV9USU1FICAgICgxIDw8IDQpICAgLy8weDAwMDAwMDEwCisjZGVmaW5lIERFQlVHX0ZHU19CWVBBU1MgICAgICAgICAgKDEgPDwgNSkgICAvLzB4MDAwMDAwMjAKKworaW50IGdldF9kZWJ1Z19mZ3Modm9pZCk7CitpbnQgcGljX2ZpbG1fZ3JhaW5fcnVuKHUzMiBmcmFtZV9jb3VudCwgY2hhciAqZmdfdGFibGVfYWRkciwgdTMyIGZnc19jdHJsLCB1MzIgKmZnc19kYXRhKTsKKwordm9pZCBhZGFwdF9jb2VmX3Byb2JzKGludCBwaWNfY291bnQsIGludCBwcmV2X2tmLCBpbnQgY3VyX2tmLCBpbnQgcHJlX2ZjLAordW5zaWduZWQgaW50ICpwcmV2X3Byb2IsIHVuc2lnbmVkIGludCAqY3VyX3Byb2IsIHVuc2lnbmVkIGludCAqY291bnQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL3ZwOS9NYWtlZmlsZSBiL2RyaXZlcnMvZnJhbWVfcHJvdmlkZXIvZGVjb2Rlcl92NGwvdnA5L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYmQ5MTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL3ZwOS9NYWtlZmlsZQpAQCAtMCwwICsxLDIgQEAKK29iai0kKENPTkZJR19BTUxPR0lDX01FRElBX1ZERUNfVlA5KSArPSBhbXZkZWNfdnA5X3Y0bC5vCithbXZkZWNfdnA5X3Y0bC1vYmpzICs9IHZ2cDkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC92cDkvdnZwOS5jIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC92cDkvdnZwOS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU4NTdjNjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL3ZwOS92dnA5LmMKQEAgLTAsMCArMSwxMjQ0OSBAQAorIC8qCisgICogZHJpdmVycy9hbWxvZ2ljL2FtcG9ydHMvdnZwOS5jCisgICoKKyAgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAqCisgICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgKgorICAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAgKiBtb3JlIGRldGFpbHMuCisgICoKKyAgKi8KKyNkZWZpbmUgREVCVUcKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy9hbXN0cmVhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmZvcm1hdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZnJhbWVfc3luYy9wdHNzZXJ2Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jYW52YXMvY2FudmFzLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3Byb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3JlY2VpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtY29udGlndW91cy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvdGVlLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC90ZWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC9jbG9jay5oPgorI2luY2x1ZGUgIi4uLy4uLy4uL3N0cmVhbV9pbnB1dC9hbXBvcnRzL2FtcG9ydHNfcHJpdi5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29kZWNfbW0uaD4KKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL2RlY29kZXJfbW11X2JveC5oIgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvZGVjb2Rlcl9ibW11X2JveC5oIgorCisjZGVmaW5lIE1FTV9OQU1FICJjb2RlY192cDkiCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy92ZGVjX3JlZy5oPgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvdmRlYy5oIgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvYW12ZGVjLmgiCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfTVVMVElfREVDCisjaW5jbHVkZSAiLi4vLi4vZGVjb2Rlci91dGlscy92ZGVjX3Byb2ZpbGUuaCIKKyNlbmRpZgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvdmRlY19nZTJkX3V0aWxzLmgiCisKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZpZGVvX3NpbmsvdmlkZW8uaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvbmZpZ3MuaD4KKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL2NvbmZpZ19wYXJzZXIuaCIKKyNpbmNsdWRlICIuLi8uLi9kZWNvZGVyL3V0aWxzL2Zpcm13YXJlLmgiCisjaW5jbHVkZSAiLi4vLi4vLi4vY29tbW9uL2NoaXBzL2RlY29kZXJfY3B1X3Zlcl9pbmZvLmgiCisjaW5jbHVkZSAiLi4vLi4vZGVjb2Rlci91dGlscy92ZGVjX3Y0bDJfYnVmZmVyX29wcy5oIgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItbWVtMm1lbS5oPgorI2luY2x1ZGUgIi4uLy4uL2RlY29kZXIvdXRpbHMvdmRlY19mZWF0dXJlLmgiCisKKyNkZWZpbmUgTUlYX1NUUkVBTV9TVVBQT1JUCisKKyNpbmNsdWRlICJ2dnA5LmgiCisKKy8qI2RlZmluZSBTVVBQT1JUX0ZCX0RFQ09ESU5HKi8KKy8qI2RlZmluZSBGQl9ERUNPRElOR19URVNUX1NDSEVEVUxFKi8KKworI2RlZmluZSBDT19NVl9DT01QUkVTUworI2RlZmluZSBIV19NQVNLX0ZST05UICAgIDB4MQorI2RlZmluZSBIV19NQVNLX0JBQ0sgICAgIDB4MgorCisjZGVmaW5lIFZQOURfTVBQX1JFRklORk9fVEJMX0FDQ0NPTkZJRyAgICAgICAgICAgICAweDM0NDIKKyNkZWZpbmUgVlA5RF9NUFBfUkVGSU5GT19EQVRBICAgICAgICAgICAgICAgICAgICAgIDB4MzQ0MworI2RlZmluZSBWUDlEX01QUF9SRUZfU0NBTEVfRU5CTCAgICAgICAgICAgICAgICAgICAgMHgzNDQxCisjZGVmaW5lIEhFVkNfTVBSRURfQ1RSTDQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMyNGMKKyNkZWZpbmUgSEVWQ19DTV9IRUFERVJfU1RBUlRfQUREUiAgICAgICAgICAgICAgICAgIDB4MzYyOAorI2RlZmluZSBIRVZDX0RCTEtfQ0ZHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNTBiCisjZGVmaW5lIEhFVkNEX01QUF9BTkMyQVhJX1RCTF9EQVRBICAgICAgICAgICAgICAgICAweDM0NjQKKyNkZWZpbmUgSEVWQ19TQU9fTU1VX1ZIMV9BRERSICAgICAgICAgICAgICAgICAgICAgIDB4MzYzYgorI2RlZmluZSBIRVZDX1NBT19NTVVfVkgwX0FERFIgICAgICAgICAgICAgICAgICAgICAgMHgzNjNhCisKKyNkZWZpbmUgSEVWQ19NVl9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzEwZAorI2RlZmluZSBIRVZDX1FQX0lORk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMTM3CisjZGVmaW5lIEhFVkNfU0tJUF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMxMzYKKworI2RlZmluZSBWUDlfMTBCX0RFQ19JRExFICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBWUDlfMTBCX0RFQ19GUkFNRV9IRUFERVIgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBWUDlfMTBCX0RFQ19TTElDRV9TRUdNRU5UICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBWUDlfMTBCX0RFQ09ERV9TTElDRSAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgVlA5XzEwQl9ESVNDQVJEX05BTCAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgVlA5X0RVTVBfTE1FTSAgICAgICAgICAgICAgICA3CisjZGVmaW5lIEhFVkNfREVDUElDX0RBVEFfRE9ORSAgICAgICAgICAgIDB4YQorI2RlZmluZSBIRVZDX0RFQ1BJQ19EQVRBX0VSUk9SICAgICAgICAgICAgMHhiCisjZGVmaW5lIEhFVkNfTkFMX0RFQ09ERV9ET05FICAgICAgICAgICAgMHhlCisjZGVmaW5lIEhFVkNfREVDT0RFX0JVRkVNUFRZICAgICAgICAweDIwCisjZGVmaW5lIEhFVkNfREVDT0RFX1RJTUVPVVQgICAgICAgICAweDIxCisjZGVmaW5lIEhFVkNfU0VBUkNIX0JVRkVNUFRZICAgICAgICAweDIyCisjZGVmaW5lIEhFVkNfREVDT0RFX09WRVJfU0laRSAgICAgICAweDIzCisjZGVmaW5lIEhFVkNfUzJfREVDT0RJTkdfRE9ORSAgICAgICAweDUwCisjZGVmaW5lIFZQOV9IRUFEX1BBUlNFUl9ET05FICAgICAgICAgICAgMHhmMAorI2RlZmluZSBWUDlfSEVBRF9TRUFSQ0hfRE9ORSAgICAgICAgICAweGYxCisjZGVmaW5lIFZQOV9FT1MgICAgICAgICAgICAgICAgICAgICAgICAweGYyCisjZGVmaW5lIEhFVkNfQUNUSU9OX0RPTkUgICAgICAgICAgICAgICAgMHhmZgorCisjZGVmaW5lIFZGX1BPT0xfU0laRSAgICAgICAgMzIKKworI3VuZGVmIHByX2luZm8KKyNkZWZpbmUgcHJfaW5mbyBwcmludGsKKworI2RlZmluZSBERUNPREVfTU9ERV9TSU5HTEUJCSgoMHg4MCA8PCAyNCkgfCAwKQorI2RlZmluZSBERUNPREVfTU9ERV9NVUxUSV9TVFJFQU1CQVNFCSgoMHg4MCA8PCAyNCkgfCAxKQorI2RlZmluZSBERUNPREVfTU9ERV9NVUxUSV9GUkFNRUJBU0UJKCgweDgwIDw8IDI0KSB8IDIpCisjZGVmaW5lIERFQ09ERV9NT0RFX1NJTkdMRV9MT1dfTEFURU5DWSAoKDB4ODAgPDwgMjQpIHwgMykKKyNkZWZpbmUgREVDT0RFX01PREVfTVVMVElfRlJBTUVCQVNFX05PSEVBRCAoKDB4ODAgPDwgMjQpIHwgNCkKKworI2RlZmluZSAgVlA5X1RSSUdHRVJfRlJBTUVfRE9ORQkJMHgxMDAKKyNkZWZpbmUgIFZQOV9UUklHR0VSX0ZSQU1FX0VOQUJMRQkweDIwMAorCisjZGVmaW5lIE1WX01FTV9VTklUIDB4MjQwCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSAicGFyc2VyX2NtZC5oIgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2RlZmluZSBQQVJTRVJfQ01EX1NLSVBfQ0ZHXzAgMHgwMDAwMDkwYgorCisjZGVmaW5lIFBBUlNFUl9DTURfU0tJUF9DRkdfMSAweDFiMTQxNDBmCisKKyNkZWZpbmUgUEFSU0VSX0NNRF9TS0lQX0NGR18yIDB4MDAxYjE5MTAKKworI2RlZmluZSBQQVJTRVJfQ01EX05VTUJFUiAzNworCisvKiNkZWZpbmUgSEVWQ19QSUNfU1RSVUNUX1NVUFBPUlQqLworLyogdG8gcmVtb3ZlLCBmaXggYnVpbGQgZXJyb3IgKi8KKworLyojZGVmaW5lIENPREVDX01NX0ZMQUdTX0ZPUl9WREVDT0RFUiAgMCovCisKKyNkZWZpbmUgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorI2RlZmluZSBTVVBQT1JUXzEwQklUCisvKiAjZGVmaW5lIEVSUk9SX0hBTkRMRV9ERUJVRyAqLworCisjaWZuZGVmIFNUQVRfS1RIUkVBRAorI2RlZmluZSBTVEFUX0tUSFJFQUQgMHg0MAorI2VuZGlmCisKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisjZGVmaW5lIE1BWF9ERUNPREVfSU5TVEFOQ0VfTlVNICAgICA5CisjZGVmaW5lIE1VTFRJX0RSSVZFUl9OQU1FICJhbW12ZGVjX3ZwOV92NGwiCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X2RlY29kZV9pbnN0YW5jZV9udW0KKwkJCQk9IE1BWF9ERUNPREVfSU5TVEFOQ0VfTlVNOworc3RhdGljIHVuc2lnbmVkIGludCBkZWNvZGVfZnJhbWVfY291bnRbTUFYX0RFQ09ERV9JTlNUQU5DRV9OVU1dOworc3RhdGljIHVuc2lnbmVkIGludCBkaXNwbGF5X2ZyYW1lX2NvdW50W01BWF9ERUNPREVfSU5TVEFOQ0VfTlVNXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X3Byb2Nlc3NfdGltZVtNQVhfREVDT0RFX0lOU1RBTkNFX05VTV07CitzdGF0aWMgdW5zaWduZWQgaW50IHJ1bl9jb3VudFtNQVhfREVDT0RFX0lOU1RBTkNFX05VTV07CitzdGF0aWMgdW5zaWduZWQgaW50IGlucHV0X2VtcHR5W01BWF9ERUNPREVfSU5TVEFOQ0VfTlVNXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm90X3J1bl9yZWFkeVtNQVhfREVDT0RFX0lOU1RBTkNFX05VTV07CisKK3N0YXRpYyB1MzIgZGVjb2RlX3RpbWVvdXRfdmFsID0gMjAwOworc3RhdGljIGludCBzdGFydF9kZWNvZGVfYnVmX2xldmVsID0gMHg4MDAwOworc3RhdGljIHUzMiB3b3JrX2J1Zl9zaXplOworCitzdGF0aWMgdTMyIGZvcmNlX3B0c191bnN0YWJsZTsKKworc3RhdGljIHUzMiBtdl9idWZfbWFyZ2luOworCitzdGF0aWMgdTMyIG12X2J1Zl9keW5hbWljX2FsbG9jOworCisvKiBET1VCTEVfV1JJVEVfTU9ERSBpcyBlbmFibGVkIG9ubHkgd2hlbiBOVjIxIDggYml0IG91dHB1dCBpcyBuZWVkZWQgKi8KKy8qIGRvdWJsZV93cml0ZV9tb2RlOgorICoJMCwgbm8gZG91YmxlIHdyaXRlOworICoJMSwgMToxIHJhdGlvOworICoJMiwgKDEvNCk6KDEvNCkgcmF0aW87CisgKgkzLCAoMS80KTooMS80KSByYXRpbywgd2l0aCBib3RoIGNvbXByZXNzZWQgZnJhbWUgaW5jbHVkZWQKKyAqCTQsICgxLzIpOigxLzIpIHJhdGlvOworICoJOCwgKDEvOCk6KDEvOCkgcmF0aW87CisgKgkweDEwLCBkb3VibGUgd3JpdGUgb25seQorICoJMHgxMDAsIGlmID4gMTA4MHAsdXNlIG1vZGUgNCxlbHNlIHVzZSBtb2RlIDE7CisgKgkweDIwMCwgaWYgPiAxMDgwcCx1c2UgbW9kZSAyLGVsc2UgdXNlIG1vZGUgMTsKKyAqCTB4MzAwLCBpZiA+IDcyMHAsIHVzZSBtb2RlIDQsIGVsc2UgdXNlIG1vZGUgMTsKKyAqLworc3RhdGljIHUzMiBkb3VibGVfd3JpdGVfbW9kZTsKKworI2RlZmluZSBEUklWRVJfTkFNRSAiYW12ZGVjX3ZwOV92NGwiCisjZGVmaW5lIERSSVZFUl9IRUFERVJfTkFNRSAiYW12ZGVjX3ZwOV9oZWFkZXIiCisKKworI2RlZmluZSBQVVRfSU5URVJWQUwgICAgICAgIChIWi8xMDApCisjZGVmaW5lIEVSUk9SX1NZU1RFTV9SRVNFVF9DT1VOVCAgIDIwMAorCisjZGVmaW5lIFBUU19OT1JNQUwgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQVFNfTk9ORV9SRUZfVVNFX0RVUkFUSU9OIDEKKworI2RlZmluZSBQVFNfTU9ERV9TV0lUQ0hJTkdfVEhSRVNIT0xEICAgICAgICAgICAzCisjZGVmaW5lIFBUU19NT0RFX1NXSVRDSElOR19SRUNPVkVSWV9USFJFQVNIT0xEIDMKKworI2RlZmluZSBEVVIyUFRTKHgpICgoeCkqOTAvOTYpCisKK3N0cnVjdCBWUDlEZWNvZGVyX3M7CitzdGF0aWMgaW50IHZ2cDlfdmZfc3RhdGVzKHN0cnVjdCB2ZnJhbWVfc3RhdGVzICpzdGF0ZXMsIHZvaWQgKik7CitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2dnA5X3ZmX3BlZWsodm9pZCAqKTsKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3MgKnZ2cDlfdmZfZ2V0KHZvaWQgKik7CitzdGF0aWMgdm9pZCB2dnA5X3ZmX3B1dChzdHJ1Y3QgdmZyYW1lX3MgKiwgdm9pZCAqKTsKK3N0YXRpYyBpbnQgdnZwOV9ldmVudF9jYihpbnQgdHlwZSwgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCitzdGF0aWMgczMyIHZ2cDlfaW5pdChzdHJ1Y3QgdmRlY19zICp2ZGVjKTsKKyNlbHNlCitzdGF0aWMgczMyIHZ2cDlfaW5pdChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpOworI2VuZGlmCitzdGF0aWMgdm9pZCB2dnA5X3Byb3RfaW5pdChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksIHUzMiBtYXNrKTsKK3N0YXRpYyBpbnQgdnZwOV9sb2NhbF9pbml0KHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSk7CitzdGF0aWMgdm9pZCB2dnA5X3B1dF90aW1lcl9mdW5jKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcik7CitzdGF0aWMgdm9pZCBkdW1wX2RhdGEoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLCBpbnQgc2l6ZSk7CitzdGF0aWMgdW5zaWduZWQgY2hhciBnZXRfZGF0YV9jaGVja19zdW0KKwkoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLCBpbnQgc2l6ZSk7CitzdGF0aWMgdm9pZCBkdW1wX3BpY19saXN0KHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSk7CitzdGF0aWMgaW50IHZwOV9hbGxvY19tbXUoCisJCXN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwKKwkJaW50IGN1cl9idWZfaWR4LAorCQlpbnQgcGljX3dpZHRoLAorCQlpbnQgcGljX2hlaWdodCwKKwkJdW5zaWduZWQgc2hvcnQgYml0X2RlcHRoLAorCQl1bnNpZ25lZCBpbnQgKm1tdV9pbmRleF9hZHIpOworCitzdGF0aWMgY29uc3QgY2hhciB2dnA5X2RlY19pZFtdID0gInZ2cDktZGV2IjsKKworI2RlZmluZSBQUk9WSURFUl9OQU1FICAgImRlY29kZXIudnA5IgorI2RlZmluZSBNVUxUSV9JTlNUQU5DRV9QUk9WSURFUl9OQU1FICAgICJ2ZGVjLnZwOSIKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2ZnJhbWVfb3BlcmF0aW9uc19zIHZ2cDlfdmZfcHJvdmlkZXIgPSB7CisJLnBlZWsgPSB2dnA5X3ZmX3BlZWssCisJLmdldCA9IHZ2cDlfdmZfZ2V0LAorCS5wdXQgPSB2dnA5X3ZmX3B1dCwKKwkuZXZlbnRfY2IgPSB2dnA5X2V2ZW50X2NiLAorCS52Zl9zdGF0ZXMgPSB2dnA5X3ZmX3N0YXRlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmZyYW1lX3Byb3ZpZGVyX3MgdnZwOV92Zl9wcm92OworCitzdGF0aWMgdTMyIGJpdF9kZXB0aF9sdW1hOworc3RhdGljIHUzMiBiaXRfZGVwdGhfY2hyb21hOworc3RhdGljIHUzMiBmcmFtZV93aWR0aDsKK3N0YXRpYyB1MzIgZnJhbWVfaGVpZ2h0Oworc3RhdGljIHUzMiB2aWRlb19zaWduYWxfdHlwZTsKKworc3RhdGljIHUzMiBvbl9ub19rZXlmcmFtZV9za2lwZWQ7CisKKyNkZWZpbmUgUFJPQl9TSVpFICAgICg0OTYgKiAyICogNCkKKyNkZWZpbmUgUFJPQl9CVUZfU0laRSAgICAoMHg1MDAwKQorI2RlZmluZSBDT1VOVF9CVUZfU0laRSAgICgweDMwMCAqIDQgKiA0KQorLypjb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemUoNDA5NiwgMjMwNCwgMSkgPSAxODg3NDM2OCgweDEyMDAwMDApKi8KKyNkZWZpbmUgTUFYX0ZSQU1FXzRLX05VTSAweDEyMDAKKyNkZWZpbmUgTUFYX0ZSQU1FXzhLX05VTSAweDQ4MDAKKworI2RlZmluZSBIRVZDX0FTU0lTVF9NTVVfTUFQX0FERFIgICAgICAgICAgICAgICAgICAgMHgzMDA5CisKKyNpZmRlZiBTVVBQT1JUX0ZCX0RFQ09ESU5HCisvKiByZWdpc3RlciBkZWZpbmUgKi8KKyNkZWZpbmUgSEVWQ19BU1NJU1RfSEVEX0ZCX1dfQ1RMICAgICAgICAgICAgICAgICAgIDB4MzAwNgorI2RlZmluZSBIRVZDX0FTU0lTVF9IRURfRkJfUl9DVEwgICAgICAgICAgICAgICAgICAgMHgzMDA3CisjZGVmaW5lIEhFVkNfQVNTSVNUX0hFRF9GQl9BRERSICAgICAgICAgICAgICAgICAgICAweDMwMDgKKyNkZWZpbmUgSEVWQ19BU1NJU1RfRkJfTU1VX01BUF9BRERSICAgICAgICAgICAgICAgIDB4MzAwYQorI2RlZmluZSBIRVZDX0FTU0lTVF9GQkRfTU1VX01BUF9BRERSICAgICAgICAgICAgICAgMHgzMDBiCisKKworI2RlZmluZSBNQVhfU1RBR0VfUEFHRV9OVU0gMHgxMjAwCisjZGVmaW5lIFNUQUdFX01NVV9NQVBfU0laRSAoTUFYX1NUQUdFX1BBR0VfTlVNICogNCkKKyNlbmRpZgorc3RhdGljIGlubGluZSBpbnQgZGl2X3IzMihpbnQ2NF90IG0sIGludCBuKQoreworLyoKKyAqcmV0dXJuIChpbnQpKG0vbikKKyAqLworI2lmbmRlZiBDT05GSUdfQVJNNjQKKwlpbnQ2NF90IHF1ID0gMDsKKwlxdSA9IGRpdl9zNjQobSwgbik7CisJcmV0dXJuIChpbnQpcXU7CisjZWxzZQorCXJldHVybiAoaW50KShtL24pOworI2VuZGlmCit9CisKKy8qVVNFX0JVRl9CTE9DSyovCitzdHJ1Y3QgQlVGX3MgeworCWludCBpbmRleDsKKwl1bnNpZ25lZCBpbnQgYWxsb2NfZmxhZzsKKwkvKmJ1ZmZlciAqLworCXVuc2lnbmVkIGludCBjbWFfcGFnZV9jb3VudDsKKwl1bnNpZ25lZCBsb25nIGFsbG9jX2FkZHI7CisJdW5zaWduZWQgbG9uZyBzdGFydF9hZHI7CisJdW5zaWduZWQgaW50IHNpemU7CisKKwl1bnNpZ25lZCBpbnQgZnJlZV9zdGFydF9hZHI7CisJdWxvbmcgdjRsX3JlZl9idWZfYWRkcjsKKwl1bG9uZwloZWFkZXJfYWRkcjsKKwl1MzIgCWhlYWRlcl9zaXplOworCXUzMglsdW1hX3NpemU7CisJdWxvbmcJY2hyb21hX2FkZHI7CisJdTMyCWNocm9tYV9zaXplOworfSAvKkJVRl90ICovOworCitzdHJ1Y3QgTVZCVUZfcyB7CisJdW5zaWduZWQgbG9uZyBzdGFydF9hZHI7CisJdW5zaWduZWQgaW50IHNpemU7CisJaW50IHVzZWRfZmxhZzsKK30gLypNVkJVRl90ICovOworCisJLyogI3VuZGVmIEJVRk1HUl9PTkxZIHRvIGVuYWJsZSBoYXJkd2FyZSBjb25maWd1cmF0aW9uICovCisKKy8qI2RlZmluZSBURVNUX1dSX1BUUl9JTkMqLworLyojZGVmaW5lIFdSX1BUUl9JTkNfTlVNIDEyOCovCisjZGVmaW5lIFdSX1BUUl9JTkNfTlVNIDEKKworI2RlZmluZSBTSU1VTEFUSU9OCisjZGVmaW5lIERPU19QUk9KRUNUCisjdW5kZWYgTUVNT1JZX01BUF9JTl9SRUFMX0NISVAKKworLyojdW5kZWYgRE9TX1BST0pFQ1QqLworLyojZGVmaW5lIE1FTU9SWV9NQVBfSU5fUkVBTF9DSElQKi8KKworLyojZGVmaW5lIEJVRkZFUl9NR1JfT05MWSovCisvKiNkZWZpbmUgQ09ORklHX0hFVkNfQ0xLX0ZPUkNFRF9PTiovCisvKiNkZWZpbmUgRU5BQkxFX1NXQVBfVEVTVCovCisjZGVmaW5lICAgTUNSQ0NfRU5BQkxFCisKKyNkZWZpbmUgVlA5X0xQRl9MVkxfVVBEQVRFCisvKiNkZWZpbmUgREJHX0xGX1BSSU5UKi8KKworI2lmZGVmIFZQOV8xMEJfTlYyMQorI2Vsc2UKKyNkZWZpbmUgTE9TTEVTU19DT01QUkVTU19NT0RFCisjZW5kaWYKKworI2RlZmluZSBET1VCTEVfV1JJVEVfWVNUQVJUX1RFTVAgMHgwMjAwMDAwMAorI2RlZmluZSBET1VCTEVfV1JJVEVfQ1NUQVJUX1RFTVAgMHgwMjkwMDAwMAorCisjZGVmaW5lIFZQOV9ERUJVR19CVUZNR1IgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBWUDlfREVCVUdfQlVGTUdSX01PUkUgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgVlA5X0RFQlVHX0JVRk1HUl9ERVRBSUwgICAgICAgICAgICAweDA0CisjZGVmaW5lIFZQOV9ERUJVR19PVVRfUFRTICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBWUDlfREVCVUdfU0VORF9QQVJBTV9XSVRIX1JFRyAgICAgIDB4MTAwCisjZGVmaW5lIFZQOV9ERUJVR19NRVJHRSAgICAgICAgICAgICAgICAgICAgMHgyMDAKKyNkZWZpbmUgVlA5X0RFQlVHX0RCR19MRl9QUklOVCAgICAgICAgICAgICAweDQwMAorI2RlZmluZSBWUDlfREVCVUdfUkVHICAgICAgICAgICAgICAgICAgICAgIDB4ODAwCisjZGVmaW5lIFZQOV9ERUJVR18yX1NUQUdFICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFZQOV9ERUJVR18yX1NUQUdFX01PUkUgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFZQOV9ERUJVR19RT1NfSU5GTyAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFZQOV9ERUJVR19ESVNfTE9DX0VSUk9SX1BST0MgICAgICAgMHgxMDAwMAorI2RlZmluZSBWUDlfREVCVUdfRElTX1NZU19FUlJPUl9QUk9DICAgMHgyMDAwMAorI2RlZmluZSBWUDlfREVCVUdfRFVNUF9QSUNfTElTVCAgICAgICAweDQwMDAwCisjZGVmaW5lIFZQOV9ERUJVR19UUklHX1NMSUNFX1NFR01FTlRfUFJPQyAweDgwMDAwCisjZGVmaW5lIFZQOV9ERUJVR19OT19UUklHR0VSX0ZSQU1FICAgICAgIDB4MTAwMDAwCisjZGVmaW5lIFZQOV9ERUJVR19MT0FEX1VDT0RFX0ZST01fRklMRSAgIDB4MjAwMDAwCisjZGVmaW5lIFZQOV9ERUJVR19GT1JDRV9TRU5EX0FHQUlOICAgICAgIDB4NDAwMDAwCisjZGVmaW5lIFZQOV9ERUJVR19EVU1QX0RBVEEgICAgICAgICAgICAgIDB4ODAwMDAwCisjZGVmaW5lIFZQOV9ERUJVR19DQUNIRSAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMAorI2RlZmluZSBWUDlfREVCVUdfQ0FDSEVfSElUX1JBVEUgICAgICAgICAweDIwMDAwMDAKKyNkZWZpbmUgSUdOT1JFX1BBUkFNX0ZST01fQ09ORklHICAgICAgICAgMHg4MDAwMDAwCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorI2RlZmluZSBQUklOVF9GTEFHX0VSUk9SCQkweDAKKyNkZWZpbmUgUFJJTlRfRkxBR19WNExfREVUQUlMCQkweDEwMDAwMDAwCisjZGVmaW5lIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMJCTB4MjAwMDAwMDAKKyNkZWZpbmUgUFJJTlRfRkxBR19WREVDX0RFVEFJTAkJMHg0MDAwMDAwMAorI2RlZmluZSBQUklOVF9GTEFHX1ZERUNfREFUQQkJMHg4MDAwMDAwMAorI2VuZGlmCitzdGF0aWMgdTMyIGZvcmNlX2J1ZnNwZWM7CitzdGF0aWMgdTMyIGRlYnVnOworc3RhdGljIGJvb2wgaXNfcmVzZXQ7CisvKmZvciBkZWJ1ZyovCisvKgorCXVkZWJ1Z19mbGFnOgorCWJpdCAwLCBlbmFibGUgdWNvZGUgcHJpbnQKKwliaXQgMSwgZW5hYmxlIHVjb2RlIGRldGFpbCBwcmludAorCWJpdCBbMzE6MTZdIG5vdCAwLCBwb3MgdG8gZHVtcCBsbWVtCisJCWJpdCAyLCBwb3AgYml0cyB0byBsbWVtCisJCWJpdCBbMTE6OF0sIHByZS1wb3AgYml0cyBmb3IgYWxpZ25tZW50ICh3aGVuIGJpdCAyIGlzIDEpCisqLworc3RhdGljIHUzMiB1ZGVidWdfZmxhZzsKKy8qCisJd2hlbiB1ZGVidWdfZmxhZ1sxOjBdIGlzIG5vdCAwCisJdWRlYnVnX3BhdXNlX3BvcyBub3QgMCwKKwkJcGF1c2UgcG9zaXRpb24KKyovCitzdGF0aWMgdTMyIHVkZWJ1Z19wYXVzZV9wb3M7CisvKgorCXdoZW4gdWRlYnVnX2ZsYWdbMTowXSBpcyBub3QgMAorCWFuZCB1ZGVidWdfcGF1c2VfcG9zIGlzIG5vdCAwLAorCQlwYXVzZSBvbmx5IHdoZW4gREVCVUdfUkVHMiBpcyBlcXVhbCB0byB0aGlzIHZhbAorKi8KK3N0YXRpYyB1MzIgdWRlYnVnX3BhdXNlX3ZhbDsKKworc3RhdGljIHUzMiB1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeDsKKworc3RhdGljIHUzMiBkaXNhYmxlX3JlcGVhdDsKKworc3RhdGljIHUzMiB3aXRob3V0X2Rpc3BsYXlfbW9kZTsKKworc3RhdGljIHUzMiB2NGxfYml0c3RyZWFtX2lkX2VuYWJsZSA9IDE7CisKKy8qCisgKlszOjBdIDA6IGRlZmF1bHQgdXNlIGNvbmZpZyBmcm9tIG9teC4KKyAqICAgICAgMTogZm9yY2UgZW5hYmxlIGZlbmNlLgorICogICAgICAyOiBkaXNhYmxlIGZlbmNlLgorICpbNzo0XSAwOiBmZW5jZSB1c2UgZm9yIGRyaXZlci4KKyAqICAgICAgMTogZmVuY2UgZmQgdXNlIGZvciBhcHAuCisgKi8KK3N0YXRpYyB1MzIgZm9yY2VfY29uZmlnX2ZlbmNlOworCisjZGVmaW5lIERFQlVHX1JFRworI2lmZGVmIERFQlVHX1JFRwordm9pZCBXUklURV9WUkVHX0RCRzIodW5zaWduZWQgaW50IGFkciwgdW5zaWduZWQgaW50IHZhbCkKK3sKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfUkVHKQorCQlwcl9pbmZvKCIlcygleCwgJXgpXG4iLCBfX2Z1bmNfXywgYWRyLCB2YWwpOworCWlmIChhZHIgIT0gMCkKKwkJV1JJVEVfVlJFRyhhZHIsIHZhbCk7Cit9CisKKyN1bmRlZiBXUklURV9WUkVHCisjZGVmaW5lIFdSSVRFX1ZSRUcgV1JJVEVfVlJFR19EQkcyCisjZW5kaWYKKworI2RlZmluZSBGUkFNRV9DTlRfV0lORE9XX1NJWkUgNTkKKyNkZWZpbmUgUkFURV9DT1JSRUNUSU9OX1RIUkVTSE9MRCA1CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworVlA5IGJ1ZmZlciBtYW5hZ2VtZW50IHN0YXJ0CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFXzEwODBQICAweDEwMDAwCisjZGVmaW5lIE1NVV9DT01QUkVTU19IRUFERVJfU0laRV80SyAgMHg0ODAwMAorI2RlZmluZSBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfOEsgIDB4MTIwMDAwCisKKworLy8jZGVmaW5lIE1NVV9DT01QUkVTU19IRUFERVJfU0laRSAgMHg0ODAwMAorLy8jZGVmaW5lIE1NVV9DT01QUkVTU19IRUFERVJfU0laRV9EVyAgMHg0ODAwMAorLy8jZGVmaW5lIE1NVV9DT01QUkVTU184S19IRUFERVJfU0laRSAgKE1NVV9DT01QUkVTU19IRUFERVJfU0laRSAqIDQpCisKKyNkZWZpbmUgTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFICAweDQ4MDAwCisjZGVmaW5lIE1NVV9DT01QUkVTU184S19IRUFERVJfU0laRSAgKDB4NDgwMDAqNCkKKyNkZWZpbmUgTUFYX1NJWkVfOEsgKDgxOTIgKiA0NjA4KQorI2RlZmluZSBNQVhfU0laRV80SyAoNDA5NiAqIDIzMDQpCisjZGVmaW5lIE1BWF9TSVpFXzJLICgxOTIwICogMTA4OCkKKyNkZWZpbmUgSVNfOEtfU0laRSh3LCBoKQkoKCh3KSAqIChoKSkgPiBNQVhfU0laRV80SykKKyNkZWZpbmUgSVNfNEtfU0laRSh3LCBoKSAgKCgodykgKiAoaCkpID4gKDE5MjAqMTA4OCkpCisKKyNkZWZpbmUgSU5WQUxJRF9JRFggLTEgIC8qIEludmFsaWQgYnVmZmVyIGluZGV4LiovCisKKyNkZWZpbmUgUlBNX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwCisjZGVmaW5lIFJQTV9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDI4MAorCit1bmlvbiBwYXJhbV91IHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBzaG9ydCBkYXRhW1JQTV9FTkQgLSBSUE1fQkVHSU5dOworCX0gbDsKKwlzdHJ1Y3QgeworCQkvKiBmcm9tIHVjb2RlIGxtZW0sIGRvIG5vdCBjaGFuZ2UgdGhpcyBzdHJ1Y3QgKi8KKwkJdW5zaWduZWQgc2hvcnQgcHJvZmlsZTsKKwkJdW5zaWduZWQgc2hvcnQgc2hvd19leGlzdGluZ19mcmFtZTsKKwkJdW5zaWduZWQgc2hvcnQgZnJhbWVfdG9fc2hvd19pZHg7CisJCXVuc2lnbmVkIHNob3J0IGZyYW1lX3R5cGU7IC8qMSBiaXQqLworCQl1bnNpZ25lZCBzaG9ydCBzaG93X2ZyYW1lOyAvKjEgYml0Ki8KKwkJdW5zaWduZWQgc2hvcnQgZXJyb3JfcmVzaWxpZW50X21vZGU7IC8qMSBiaXQqLworCQl1bnNpZ25lZCBzaG9ydCBpbnRyYV9vbmx5OyAvKjEgYml0Ki8KKwkJdW5zaWduZWQgc2hvcnQgZGlzcGxheV9zaXplX3ByZXNlbnQ7IC8qMSBiaXQqLworCQl1bnNpZ25lZCBzaG9ydCByZXNldF9mcmFtZV9jb250ZXh0OworCQl1bnNpZ25lZCBzaG9ydCByZWZyZXNoX2ZyYW1lX2ZsYWdzOworCQl1bnNpZ25lZCBzaG9ydCB3aWR0aDsKKwkJdW5zaWduZWQgc2hvcnQgaGVpZ2h0OworCQl1bnNpZ25lZCBzaG9ydCBkaXNwbGF5X3dpZHRoOworCQl1bnNpZ25lZCBzaG9ydCBkaXNwbGF5X2hlaWdodDsKKwkvKgorCSAqYml0WzExOjhdIC0gcmVmX2ZyYW1lX2luZm9fMCAocmVmKDMtYml0cyksIHJlZl9mcmFtZV9zaWduX2JpYXMoMS1iaXQpKQorCSAqYml0Wzc6NF0gIC0gcmVmX2ZyYW1lX2luZm9fMSAocmVmKDMtYml0cyksIHJlZl9mcmFtZV9zaWduX2JpYXMoMS1iaXQpKQorCSAqYml0WzM6MF0gIC0gcmVmX2ZyYW1lX2luZm9fMiAocmVmKDMtYml0cyksIHJlZl9mcmFtZV9zaWduX2JpYXMoMS1iaXQpKQorCSAqLworCQl1bnNpZ25lZCBzaG9ydCByZWZfaW5mbzsKKwkJLyoKKwkJICpiaXRbMl06IHNhbWVfZnJhbWVfc2l6ZTAKKwkJICpiaXRbMV06IHNhbWVfZnJhbWVfc2l6ZTEKKwkJICpiaXRbMF06IHNhbWVfZnJhbWVfc2l6ZTIKKwkJICovCisJCXVuc2lnbmVkIHNob3J0IHNhbWVfZnJhbWVfc2l6ZTsKKworCQl1bnNpZ25lZCBzaG9ydCBtb2RlX3JlZl9kZWx0YV9lbmFibGVkOworCQl1bnNpZ25lZCBzaG9ydCByZWZfZGVsdGFzWzRdOworCQl1bnNpZ25lZCBzaG9ydCBtb2RlX2RlbHRhc1syXTsKKwkJdW5zaWduZWQgc2hvcnQgZmlsdGVyX2xldmVsOworCQl1bnNpZ25lZCBzaG9ydCBzaGFycG5lc3NfbGV2ZWw7CisJCXVuc2lnbmVkIHNob3J0IGJpdF9kZXB0aDsKKwkJdW5zaWduZWQgc2hvcnQgc2VnX3F1YW50X2luZm9bOF07CisJCXVuc2lnbmVkIHNob3J0IHNlZ19lbmFibGVkOworCQl1bnNpZ25lZCBzaG9ydCBzZWdfYWJzX2RlbHRhOworCQkvKiBiaXQgMTU6IGZlYXR1cmUgZW5hYmxlZDsgYml0IDgsIHNpZ247IGJpdFs1OjBdLCBkYXRhICovCisJCXVuc2lnbmVkIHNob3J0IHNlZ19sZl9pbmZvWzhdOworCX0gcDsKK307CisKKworc3RydWN0IHZweF9jb2RlY19mcmFtZV9idWZmZXJfcyB7CisJdWludDhfdCAqZGF0YTsgIC8qKjwgUG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgKi8KKwlzaXplX3Qgc2l6ZTsgIC8qKjwgU2l6ZSBvZiBkYXRhIGluIGJ5dGVzICovCisJdm9pZCAqcHJpdjsgIC8qKjwgRnJhbWUncyBwcml2YXRlIGRhdGEgKi8KK307CisKK2VudW0gdnB4X2NvbG9yX3NwYWNlX3QgeworCVZQWF9DU19VTktOT1dOICAgID0gMCwgIC8qKjwgVW5rbm93biAqLworCVZQWF9DU19CVF82MDEgICAgID0gMSwgIC8qKjwgQlQuNjAxICovCisJVlBYX0NTX0JUXzcwOSAgICAgPSAyLCAgLyoqPCBCVC43MDkgKi8KKwlWUFhfQ1NfU01QVEVfMTcwICA9IDMsICAvKio8IFNNUFRFLjE3MCAqLworCVZQWF9DU19TTVBURV8yNDAgID0gNCwgIC8qKjwgU01QVEUuMjQwICovCisJVlBYX0NTX0JUXzIwMjAgICAgPSA1LCAgLyoqPCBCVC4yMDIwICovCisJVlBYX0NTX1JFU0VSVkVEICAgPSA2LCAgLyoqPCBSZXNlcnZlZCAqLworCVZQWF9DU19TUkdCICAgICAgID0gNyAgIC8qKjwgc1JHQiAqLworfTsgLyoqPCBhbGlhcyBmb3IgZW51bSB2cHhfY29sb3Jfc3BhY2UgKi8KKworZW51bSB2cHhfYml0X2RlcHRoX3QgeworCVZQWF9CSVRTXzggID0gIDgsICAvKio8ICA4IGJpdHMgKi8KKwlWUFhfQklUU18xMCA9IDEwLCAgLyoqPCAxMCBiaXRzICovCisJVlBYX0JJVFNfMTIgPSAxMiwgIC8qKjwgMTIgYml0cyAqLworfTsKKworI2RlZmluZSBNQVhfU0xJQ0VfTlVNIDEwMjQKK3N0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zIHsKKwlpbnQgaW5kZXg7CisJaW50IEJVRl9pbmRleDsKKwlpbnQgbXZfYnVmX2luZGV4OworCWludCBjb21wX2JvZHlfc2l6ZTsKKwlpbnQgYnVmX3NpemU7CisJaW50IHZmX3JlZjsKKwlpbnQgeV9jYW52YXNfaW5kZXg7CisJaW50IHV2X2NhbnZhc19pbmRleDsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJc3RydWN0IGNhbnZhc19jb25maWdfcyBjYW52YXNfY29uZmlnWzJdOworI2VuZGlmCisJaW50IGRlY29kZV9pZHg7CisJaW50IHNsaWNlX3R5cGU7CisJaW50IHN0cmVhbV9vZmZzZXQ7CisJdTMyIHB0czsKKwl1NjQgcHRzNjQ7CisJdTY0IHRpbWVzdGFtcDsKKwl1aW50OF90IGVycm9yX21hcms7CisJLyoqLworCWludCBzbGljZV9pZHg7CisJLypidWZmZXIqLworCXVuc2lnbmVkIGxvbmcgaGVhZGVyX2FkcjsKKwl1bnNpZ25lZCBsb25nIG1wcmVkX212X3dyX3N0YXJ0X2FkZHI7CisJaW50IG12X3NpemU7CisJLyp1bnNpZ25lZCBsb25nIG1jX3lfYWRyOworCSAqdW5zaWduZWQgbG9uZyBtY191X3ZfYWRyOworCSAqLworCXVuc2lnbmVkIGludCBkd195X2FkcjsKKwl1bnNpZ25lZCBpbnQgZHdfdV92X2FkcjsKKwl1MzIJbHVtYV9zaXplOworCXUzMgljaHJvbWFfc2l6ZTsKKwlpbnQgbWNfY2FudmFzX3k7CisJaW50IG1jX2NhbnZhc191X3Y7CisKKwlpbnQgbGN1X3RvdGFsOworCS8qKi8KKwlpbnQgICB5X3dpZHRoOworCWludCAgIHlfaGVpZ2h0OworCWludCAgIHlfY3JvcF93aWR0aDsKKwlpbnQgICB5X2Nyb3BfaGVpZ2h0OworCWludCAgIHlfc3RyaWRlOworCisJaW50ICAgdXZfd2lkdGg7CisJaW50ICAgdXZfaGVpZ2h0OworCWludCAgIHV2X2Nyb3Bfd2lkdGg7CisJaW50ICAgdXZfY3JvcF9oZWlnaHQ7CisJaW50ICAgdXZfc3RyaWRlOworCisJaW50ICAgYWxwaGFfd2lkdGg7CisJaW50ICAgYWxwaGFfaGVpZ2h0OworCWludCAgIGFscGhhX3N0cmlkZTsKKworCXVpbnQ4X3QgKnlfYnVmZmVyOworCXVpbnQ4X3QgKnVfYnVmZmVyOworCXVpbnQ4X3QgKnZfYnVmZmVyOworCXVpbnQ4X3QgKmFscGhhX2J1ZmZlcjsKKworCXVpbnQ4X3QgKmJ1ZmZlcl9hbGxvYzsKKwlpbnQgYnVmZmVyX2FsbG9jX3N6OworCWludCBib3JkZXI7CisJaW50IGZyYW1lX3NpemU7CisJaW50IHN1YnNhbXBsaW5nX3g7CisJaW50IHN1YnNhbXBsaW5nX3k7CisJdW5zaWduZWQgaW50IGJpdF9kZXB0aDsKKwllbnVtIHZweF9jb2xvcl9zcGFjZV90IGNvbG9yX3NwYWNlOworCisJaW50IGNvcnJ1cHRlZDsKKwlpbnQgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBjbWFfYWxsb2NfYWRkcjsKKworCWludCBkb3VibGVfd3JpdGVfbW9kZTsKKworCS8qIHBpY3R1cmUgcW9zIGluZm9tYXRpb24qLworCWludCBtYXhfcXA7CisJaW50IGF2Z19xcDsKKwlpbnQgbWluX3FwOworCWludCBtYXhfc2tpcDsKKwlpbnQgYXZnX3NraXA7CisJaW50IG1pbl9za2lwOworCWludCBtYXhfbXY7CisJaW50IG1pbl9tdjsKKwlpbnQgYXZnX212OworCisJdTMyIGh3X2RlY29kZV90aW1lOworCXUzMiBmcmFtZV9zaXplMjsgLy8gRm9yIGZyYW1lIGJhc2UgbW9kZQorCisJLyogdmRlYyBzeW5jLiAqLworCXN0cnVjdCBkbWFfZmVuY2UgKmZlbmNlOworCisJLyogaGRyMTAgcGx1cyBkYXRhICovCisJdTMyIGhkcjEwcF9kYXRhX3NpemU7CisJY2hhciAqaGRyMTBwX2RhdGFfYnVmOworCWludCB2NGxfYnVmX2luZGV4OworCWludCByZXBlYXRfY291bnQ7CisJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnJlcGVhdF9waWM7Cit9IFBJQ19CVUZGRVJfQ09ORklHOworCitlbnVtIEJJVFNUUkVBTV9QUk9GSUxFIHsKKwlQUk9GSUxFXzAsCisJUFJPRklMRV8xLAorCVBST0ZJTEVfMiwKKwlQUk9GSUxFXzMsCisJTUFYX1BST0ZJTEVTCit9OworCitlbnVtIEZSQU1FX1RZUEUgeworCUtFWV9GUkFNRSA9IDAsCisJSU5URVJfRlJBTUUgPSAxLAorCUZSQU1FX1RZUEVTLAorfTsKKworZW51bSBSRUZFUkVOQ0VfTU9ERSB7CisJU0lOR0xFX1JFRkVSRU5DRSAgICAgID0gMCwKKwlDT01QT1VORF9SRUZFUkVOQ0UgICAgPSAxLAorCVJFRkVSRU5DRV9NT0RFX1NFTEVDVCA9IDIsCisJUkVGRVJFTkNFX01PREVTICAgICAgID0gMywKK307CisKKyNkZWZpbmUgTk9ORSAgICAgICAgICAgLTEKKyNkZWZpbmUgSU5UUkFfRlJBTUUgICAgIDAKKyNkZWZpbmUgTEFTVF9GUkFNRSAgICAgIDEKKyNkZWZpbmUgR09MREVOX0ZSQU1FICAgIDIKKyNkZWZpbmUgQUxUUkVGX0ZSQU1FICAgIDMKKyNkZWZpbmUgTUFYX1JFRl9GUkFNRVMgIDQKKworI2RlZmluZSBSRUZTX1BFUl9GUkFNRSAzCisKKyNkZWZpbmUgUkVGX0ZSQU1FU19MT0cyIDMKKyNkZWZpbmUgUkVGX0ZSQU1FUyAoMSA8PCBSRUZfRlJBTUVTX0xPRzIpCisjZGVmaW5lIFJFRl9GUkFNRVNfNEsgKDYpCisKKy8qNCBzY3JhdGNoIGZyYW1lcyBmb3IgdGhlIG5ldyBmcmFtZXMgdG8gc3VwcG9ydCBhIG1heGltdW0gb2YgNCBjb3JlcyBkZWNvZGluZworICppbiBwYXJhbGxlbCwgMyBmb3Igc2NhbGVkIHJlZmVyZW5jZXMgb24gdGhlIGVuY29kZXIuCisgKlRPRE8oaGt1YW5nKTogQWRkIG9uZGVtYW5kIGZyYW1lIGJ1ZmZlcnMgaW5zdGVhZCBvZiBoYXJkY29kaW5nIHRoZSBudW1iZXIKKyAqIC8vIG9mIGZyYW1lYnVmZmVycy4KKyAqVE9ETyhqa29sZXN6YXIpOiBUaGVzZSAzIGV4dHJhIHJlZmVyZW5jZXMgY291bGQgcHJvYmFibHkgY29tZSBmcm9tIHRoZQorICpub3JtYWwgcmVmZXJlbmNlIHBvb2wuCisgKi8KKyNkZWZpbmUgRlJBTUVfQlVGRkVSUyAoUkVGX0ZSQU1FUyArIDE2KQorI2RlZmluZSBIRUFERVJfRlJBTUVfQlVGRkVSUyAoRlJBTUVfQlVGRkVSUykKKyNkZWZpbmUgTUFYX0JVRl9OVU0gKEZSQU1FX0JVRkZFUlMpCisjZGVmaW5lIE1WX0JVRkZFUl9OVU0JRlJBTUVfQlVGRkVSUworI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKKyNkZWZpbmUgU1RBR0VfTUFYX0JVRkZFUlMJCTE2CisjZWxzZQorI2RlZmluZSBTVEFHRV9NQVhfQlVGRkVSUwkJMAorI2VuZGlmCisKKyNkZWZpbmUgRlJBTUVfQ09OVEVYVFNfTE9HMiAyCisjZGVmaW5lIEZSQU1FX0NPTlRFWFRTICgxIDw8IEZSQU1FX0NPTlRFWFRTX0xPRzIpCisvKmJ1ZmZlciArIGhlYWRlciBidWZmZXIgKyB3b3Jrc3BhY2UqLworI2lmZGVmIE1WX1VTRV9GSVhFRF9CVUYKKyNkZWZpbmUgTUFYX0JNTVVfQlVGRkVSX05VTSAoRlJBTUVfQlVGRkVSUyArIEhFQURFUl9GUkFNRV9CVUZGRVJTICsgMSkKKyNkZWZpbmUgVkZfQlVGRkVSX0lEWChuKSAobikKKyNkZWZpbmUgSEVBREVSX0JVRkZFUl9JRFgobikgKEZSQU1FX0JVRkZFUlMgKyBuKQorI2RlZmluZSBXT1JLX1NQQUNFX0JVRl9JRCAoRlJBTUVfQlVGRkVSUyArIEhFQURFUl9GUkFNRV9CVUZGRVJTKQorI2Vsc2UKKyNkZWZpbmUgTUFYX0JNTVVfQlVGRkVSX05VTSBcCisJKEZSQU1FX0JVRkZFUlMgKyBIRUFERVJfRlJBTUVfQlVGRkVSUyArIE1WX0JVRkZFUl9OVU0gKyAxKQorI2RlZmluZSBWRl9CVUZGRVJfSURYKG4pIChuKQorI2RlZmluZSBIRUFERVJfQlVGRkVSX0lEWChuKSAoRlJBTUVfQlVGRkVSUyArIG4pCisjZGVmaW5lIE1WX0JVRkZFUl9JRFgobikgKEZSQU1FX0JVRkZFUlMgKyBIRUFERVJfRlJBTUVfQlVGRkVSUyArIG4pCisjZGVmaW5lIFdPUktfU1BBQ0VfQlVGX0lEIFwKKwkoRlJBTUVfQlVGRkVSUyArIEhFQURFUl9GUkFNRV9CVUZGRVJTICsgTVZfQlVGRkVSX05VTSkKKyNlbmRpZgorCitzdHJ1Y3QgUmVmQ250QnVmZmVyX3MgeworCWludCByZWZfY291bnQ7CisJLypNVl9SRUYgKm12czsqLworCWludCBtaV9yb3dzOworCWludCBtaV9jb2xzOworCXN0cnVjdCB2cHhfY29kZWNfZnJhbWVfYnVmZmVyX3MgcmF3X2ZyYW1lX2J1ZmZlcjsKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyBidWY7CisKKy8qVGhlIEZvbGxvd2luZyB2YXJpYWJsZXMgd2lsbCBvbmx5IGJlIHVzZWQgaW4gZnJhbWUgcGFyYWxsZWwgZGVjb2RlLgorICoKKyAqZnJhbWVfd29ya2VyX293bmVyIGluZGljYXRlcyB3aGljaCBGcmFtZVdvcmtlciBvd25zIHRoaXMgYnVmZmVyLiBOVUxMIG1lYW5zCisgKnRoYXQgbm8gRnJhbWVXb3JrZXIgb3ducywgb3IgaXMgZGVjb2RpbmcsIHRoaXMgYnVmZmVyLgorICpWUDlXb3JrZXIgKmZyYW1lX3dvcmtlcl9vd25lcjsKKyAqCisgKnJvdyBhbmQgY29sIGluZGljYXRlIHdoaWNoIHBvc2l0aW9uIGZyYW1lIGhhcyBiZWVuIGRlY29kZWQgdG8gaW4gcmVhbAorICpwaXhlbCB1bml0LiBUaGV5IGFyZSByZXNldCB0byAtMSB3aGVuIGRlY29kaW5nIGJlZ2lucyBhbmQgc2V0IHRvIElOVF9NQVgKKyAqd2hlbiB0aGUgZnJhbWUgaXMgZnVsbHkgZGVjb2RlZC4KKyAqLworCWludCByb3c7CisJaW50IGNvbDsKKworCWludCBzaG93X2ZyYW1lOworfSBSZWZDbnRCdWZmZXI7CisKK3N0cnVjdCBSZWZCdWZmZXJfcyB7CisvKlRPRE8oZGtvdmFsZXYpOiBpZHggaXMgbm90IHJlYWxseSByZXF1aXJlZCBhbmQgc2hvdWxkIGJlIHJlbW92ZWQsIG5vdyBpdAorICppcyB1c2VkIGluIHZwOV9vbnl4ZF9pZi5jCisgKi8KKwlpbnQgaWR4OworCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpidWY7CisJLypzdHJ1Y3Qgc2NhbGVfZmFjdG9ycyBzZjsqLworfSBSZWZCdWZmZXI7CisKK3N0cnVjdCBJbnRlcm5hbEZyYW1lQnVmZmVyX3MgeworCXVpbnQ4X3QgKmRhdGE7CisJc2l6ZV90IHNpemU7CisJaW50IGluX3VzZTsKK30gSW50ZXJuYWxGcmFtZUJ1ZmZlcjsKKworc3RydWN0IEludGVybmFsRnJhbWVCdWZmZXJMaXN0X3MgeworCWludCBudW1faW50ZXJuYWxfZnJhbWVfYnVmZmVyczsKKwlzdHJ1Y3QgSW50ZXJuYWxGcmFtZUJ1ZmZlcl9zICppbnRfZmI7Cit9IEludGVybmFsRnJhbWVCdWZmZXJMaXN0OworCitzdHJ1Y3QgQnVmZmVyUG9vbF9zIHsKKy8qUHJvdGVjdCBCdWZmZXJQb29sIGZyb20gYmVpbmcgYWNjZXNzZWQgYnkgc2V2ZXJhbCBGcmFtZVdvcmtlcnMgYXQKKyAqdGhlIHNhbWUgdGltZSBkdXJpbmcgZnJhbWUgcGFyYWxsZWwgZGVjb2RlLgorICpUT0RPKGhrdWFuZyk6IFRyeSB0byB1c2UgYXRvbWljIHZhcmlhYmxlIGluc3RlYWQgb2YgbG9ja2luZyB0aGUgd2hvbGUgcG9vbC4KKyAqCisgKlByaXZhdGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGZyYW1lIGJ1ZmZlciBjYWxsYmFja3MuCisgKnZvaWQgKmNiX3ByaXY7CisgKgorICp2cHhfZ2V0X2ZyYW1lX2J1ZmZlcl9jYl9mbl90IGdldF9mYl9jYjsKKyAqdnB4X3JlbGVhc2VfZnJhbWVfYnVmZmVyX2NiX2ZuX3QgcmVsZWFzZV9mYl9jYjsKKyAqLworCisJc3RydWN0IFJlZkNudEJ1ZmZlcl9zIGZyYW1lX2J1ZnNbRlJBTUVfQlVGRkVSU107CisKKy8qRnJhbWUgYnVmZmVycyBhbGxvY2F0ZWQgaW50ZXJuYWxseSBieSB0aGUgY29kZWMuKi8KKwlzdHJ1Y3QgSW50ZXJuYWxGcmFtZUJ1ZmZlckxpc3RfcyBpbnRfZnJhbWVfYnVmZmVyczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5sb2NrX3QgbG9jazsKKworfSBCdWZmZXJQb29sOworCisjZGVmaW5lIGxvY2tfYnVmZmVyX3Bvb2wocG9vbCwgZmxhZ3MpIFwKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKQorCisjZGVmaW5lIHVubG9ja19idWZmZXJfcG9vbChwb29sLCBmbGFncykgXAorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBmbGFncykKKworc3RydWN0IFZQOV9Db21tb25fcyB7CisJZW51bSB2cHhfY29sb3Jfc3BhY2VfdCBjb2xvcl9zcGFjZTsKKwlpbnQgd2lkdGg7CisJaW50IGhlaWdodDsKKwlpbnQgZGlzcGxheV93aWR0aDsKKwlpbnQgZGlzcGxheV9oZWlnaHQ7CisJaW50IGxhc3Rfd2lkdGg7CisJaW50IGxhc3RfaGVpZ2h0OworCisJaW50IHN1YnNhbXBsaW5nX3g7CisJaW50IHN1YnNhbXBsaW5nX3k7CisKKwlpbnQgdXNlX2hpZ2hiaXRkZXB0aDsvKk1hcmtzIGlmIHdlIG5lZWQgdG8gdXNlIDE2Yml0IGZyYW1lIGJ1ZmZlcnMuKi8KKworCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpmcmFtZV90b19zaG93OworCXN0cnVjdCBSZWZDbnRCdWZmZXJfcyAqcHJldl9mcmFtZTsKKworCS8qVE9ETyhoa3VhbmcpOiBDb21iaW5lIHRoaXMgd2l0aCBjdXJfYnVmIGluIG1hY3JvYmxvY2tkLiovCisJc3RydWN0IFJlZkNudEJ1ZmZlcl9zICpjdXJfZnJhbWU7CisKKwlpbnQgcmVmX2ZyYW1lX21hcFtSRUZfRlJBTUVTXTsgLyogbWFwcyBmYl9pZHggdG8gcmVmZXJlbmNlIHNsb3QgKi8KKworCS8qUHJlcGFyZSByZWZfZnJhbWVfbWFwIGZvciB0aGUgbmV4dCBmcmFtZS4KKwkgKk9ubHkgdXNlZCBpbiBmcmFtZSBwYXJhbGxlbCBkZWNvZGUuCisJICovCisJaW50IG5leHRfcmVmX2ZyYW1lX21hcFtSRUZfRlJBTUVTXTsKKworCS8qIFRPRE8oamtvbGVzemFyKTogY291bGQgZXhwYW5kIGFjdGl2ZV9yZWZfaWR4IHRvIDQsCisJICp3aXRoIDAgYXMgaW50cmEsIGFuZCByb2xsIG5ld19mYl9pZHggaW50byBpdC4KKwkgKi8KKworCS8qRWFjaCBmcmFtZSBjYW4gcmVmZXJlbmNlIFJFRlNfUEVSX0ZSQU1FIGJ1ZmZlcnMqLworCXN0cnVjdCBSZWZCdWZmZXJfcyBmcmFtZV9yZWZzW1JFRlNfUEVSX0ZSQU1FXTsKKworCWludCBwcmV2X2ZiX2lkeDsKKwlpbnQgbmV3X2ZiX2lkeDsKKwlpbnQgY3VyX2ZiX2lkeF9tbXU7CisJLypsYXN0IGZyYW1lJ3MgZnJhbWUgdHlwZSBmb3IgbW90aW9uIHNlYXJjaCovCisJZW51bSBGUkFNRV9UWVBFIGxhc3RfZnJhbWVfdHlwZTsKKwllbnVtIEZSQU1FX1RZUEUgZnJhbWVfdHlwZTsKKworCWludCBzaG93X2ZyYW1lOworCWludCBsYXN0X3Nob3dfZnJhbWU7CisJaW50IHNob3dfZXhpc3RpbmdfZnJhbWU7CisKKwkvKkZsYWcgc2lnbmFsaW5nIHRoYXQgdGhlIGZyYW1lIGlzIGVuY29kZWQgdXNpbmcgb25seSBJTlRSQSBtb2Rlcy4qLworCXVpbnQ4X3QgaW50cmFfb25seTsKKwl1aW50OF90IGxhc3RfaW50cmFfb25seTsKKworCWludCBhbGxvd19oaWdoX3ByZWNpc2lvbl9tdjsKKworCS8qRmxhZyBzaWduYWxpbmcgdGhhdCB0aGUgZnJhbWUgY29udGV4dCBzaG91bGQgYmUgcmVzZXQgdG8gZGVmYXVsdAorCSAqdmFsdWVzLiAwIG9yIDEgaW1wbGllcyBkb24ndCByZXNldCwgMiByZXNldCBqdXN0IHRoZSBjb250ZXh0CisJICpzcGVjaWZpZWQgaW4gdGhlICBmcmFtZSBoZWFkZXIsIDMgcmVzZXQgYWxsIGNvbnRleHRzLgorCSAqLworCWludCByZXNldF9mcmFtZV9jb250ZXh0OworCisJLypNQnMsIG1iX3Jvd3MvY29scyBpcyBpbiAxNi1waXhlbCB1bml0czsgbWlfcm93cy9jb2xzIGlzIGluCisJICoJTU9ERV9JTkZPICg4LXBpeGVsKSB1bml0cy4KKwkgKi8KKwlpbnQgTUJzOworCWludCBtYl9yb3dzLCBtaV9yb3dzOworCWludCBtYl9jb2xzLCBtaV9jb2xzOworCWludCBtaV9zdHJpZGU7CisKKwkvKldoZXRoZXIgdG8gdXNlIHByZXZpb3VzIGZyYW1lJ3MgbW90aW9uIHZlY3RvcnMgZm9yIHByZWRpY3Rpb24uKi8KKwlpbnQgdXNlX3ByZXZfZnJhbWVfbXZzOworCisJaW50IHJlZnJlc2hfZnJhbWVfY29udGV4dDsgICAgLyogVHdvIHN0YXRlIDAgPSBOTywgMSA9IFlFUyAqLworCisJaW50IHJlZl9mcmFtZV9zaWduX2JpYXNbTUFYX1JFRl9GUkFNRVNdOyAgICAvKiBUd28gc3RhdGUgMCwgMSAqLworCisJLypzdHJ1Y3QgbG9vcGZpbHRlciBsZjsqLworCS8qc3RydWN0IHNlZ21lbnRhdGlvbiBzZWc7Ki8KKworCS8qVE9ETyhoa3VhbmcpOlJlbW92ZSB0aGlzIGFzIGl0IGlzIHRoZSBzYW1lIGFzIGZyYW1lX3BhcmFsbGVsX2RlY29kZSovCisJLyogaW4gcGJpLiovCisJaW50IGZyYW1lX3BhcmFsbGVsX2RlY29kZTsgIC8qIGZyYW1lLWJhc2VkIHRocmVhZGluZy4qLworCisJLypDb250ZXh0IHByb2JhYmlsaXRpZXMgZm9yIHJlZmVyZW5jZSBmcmFtZSBwcmVkaWN0aW9uKi8KKwkvKk1WX1JFRkVSRU5DRV9GUkFNRSBjb21wX2ZpeGVkX3JlZjsqLworCS8qTVZfUkVGRVJFTkNFX0ZSQU1FIGNvbXBfdmFyX3JlZlsyXTsqLworCWVudW0gUkVGRVJFTkNFX01PREUgcmVmZXJlbmNlX21vZGU7CisKKwkvKkZSQU1FX0NPTlRFWFQgKmZjOyAqLyAvKiB0aGlzIGZyYW1lIGVudHJvcHkgKi8KKwkvKkZSQU1FX0NPTlRFWFQgKmZyYW1lX2NvbnRleHRzOyAqLyAgLypGUkFNRV9DT05URVhUUyovCisJLyp1bnNpZ25lZCBpbnQgIGZyYW1lX2NvbnRleHRfaWR4OyAqLy8qIENvbnRleHQgdG8gdXNlL3VwZGF0ZSAqLworCS8qRlJBTUVfQ09VTlRTIGNvdW50czsqLworCisJdW5zaWduZWQgaW50IGN1cnJlbnRfdmlkZW9fZnJhbWU7CisJZW51bSBCSVRTVFJFQU1fUFJPRklMRSBwcm9maWxlOworCisJZW51bSB2cHhfYml0X2RlcHRoX3QgYml0X2RlcHRoOworCisJaW50IGVycm9yX3Jlc2lsaWVudF9tb2RlOworCWludCBmcmFtZV9wYXJhbGxlbF9kZWNvZGluZ19tb2RlOworCisJaW50IGJ5dGVfYWxpZ25tZW50OworCWludCBza2lwX2xvb3BfZmlsdGVyOworCisJLypFeHRlcm5hbCBCdWZmZXJQb29sIHBhc3NlZCBmcm9tIG91dHNpZGUuKi8KKwlzdHJ1Y3QgQnVmZmVyUG9vbF9zICpidWZmZXJfcG9vbDsKKworCWludCBhYm92ZV9jb250ZXh0X2FsbG9jX2NvbHM7Cit9OworCitzdGF0aWMgdm9pZCBzZXRfY2FudmFzKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljX2NvbmZpZyk7CitzdGF0aWMgaW50IHByZXBhcmVfZGlzcGxheV9idWYoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLAorCQkJCQlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljX2NvbmZpZyk7CisKK3N0YXRpYyB2b2lkIGZpbGxfZnJhbWVfaW5mbyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksCisJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKmZyYW1lLAorCXVuc2lnbmVkIGludCBmcmFtZXNpemUsCisJdW5zaWduZWQgaW50IHB0cyk7CisKK3N0YXRpYyBzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqZ2V0X2ZyYW1lX25ld19idWZmZXIoc3RydWN0IFZQOV9Db21tb25fcyAqY20pCit7CisJcmV0dXJuICZjbS0+YnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnNbY20tPm5ld19mYl9pZHhdLmJ1ZjsKK30KKworc3RhdGljIHZvaWQgcmVmX2NudF9mYihzdHJ1Y3QgUmVmQ250QnVmZmVyX3MgKmJ1ZnMsIGludCAqaWR4LCBpbnQgbmV3X2lkeCkKK3sKKwljb25zdCBpbnQgcmVmX2luZGV4ID0gKmlkeDsKKworCWlmIChyZWZfaW5kZXggPj0gMCAmJiBidWZzW3JlZl9pbmRleF0ucmVmX2NvdW50ID4gMCkgeworCQlidWZzW3JlZl9pbmRleF0ucmVmX2NvdW50LS07CisJCS8qcHJfaW5mbygiW01NVSBERUJVRyAyXSBkZWMgcmVmX2NvdW50WyVkXSA6ICVkXHJcbiIsCisJCSAqCQlyZWZfaW5kZXgsIGJ1ZnNbcmVmX2luZGV4XS5yZWZfY291bnQpOworCQkgKi8KKwl9CisKKwkqaWR4ID0gbmV3X2lkeDsKKworCWJ1ZnNbbmV3X2lkeF0ucmVmX2NvdW50Kys7CisJLypwcl9pbmZvKCJbTU1VIERFQlVHIDNdIGluYyByZWZfY291bnRbJWRdIDogJWRcclxuIiwKKwkgKgkJCW5ld19pZHgsIGJ1ZnNbbmV3X2lkeF0ucmVmX2NvdW50KTsKKwkgKi8KK30KKworaW50IHZwOV9yZWxlYXNlX2ZyYW1lX2J1ZmZlcihzdHJ1Y3QgdnB4X2NvZGVjX2ZyYW1lX2J1ZmZlcl9zICpmYikKK3sKKwlzdHJ1Y3QgSW50ZXJuYWxGcmFtZUJ1ZmZlcl9zICpjb25zdCBpbnRfZmIgPQorCQkJCShzdHJ1Y3QgSW50ZXJuYWxGcmFtZUJ1ZmZlcl9zICopZmItPnByaXY7CisJaWYgKGludF9mYikKKwkJaW50X2ZiLT5pbl91c2UgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50ICBjb21wdXRlX2xvc2xlc3NfY29tcF9ib2R5X3NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCQkJCXVpbnQ4X3QgaXNfYml0X2RlcHRoXzEwKTsKKworc3RhdGljIHZvaWQgc2V0dXBfZGlzcGxheV9zaXplKHN0cnVjdCBWUDlfQ29tbW9uX3MgKmNtLCB1bmlvbiBwYXJhbV91ICpwYXJhbXMsCisJCQkJCQlpbnQgcHJpbnRfaGVhZGVyX2luZm8pCit7CisJY20tPmRpc3BsYXlfd2lkdGggPSBjbS0+d2lkdGg7CisJY20tPmRpc3BsYXlfaGVpZ2h0ID0gY20tPmhlaWdodDsKKwlpZiAocGFyYW1zLT5wLmRpc3BsYXlfc2l6ZV9wcmVzZW50KSB7CisJCWlmIChwcmludF9oZWFkZXJfaW5mbykKKwkJCXByX2luZm8oIiAqIDEtYml0IGRpc3BsYXlfc2l6ZV9wcmVzZW50IHJlYWQgOiAxXG4iKTsKKwkJY20tPmRpc3BsYXlfd2lkdGggPSBwYXJhbXMtPnAuZGlzcGxheV93aWR0aDsKKwkJY20tPmRpc3BsYXlfaGVpZ2h0ID0gcGFyYW1zLT5wLmRpc3BsYXlfaGVpZ2h0OworCQkvKnZwOV9yZWFkX2ZyYW1lX3NpemUocmIsICZjbS0+ZGlzcGxheV93aWR0aCwKKwkJICoJCQkJCSZjbS0+ZGlzcGxheV9oZWlnaHQpOworCQkgKi8KKwl9IGVsc2UgeworCQlpZiAocHJpbnRfaGVhZGVyX2luZm8pCisJCQlwcl9pbmZvKCIgKiAxLWJpdCBkaXNwbGF5X3NpemVfcHJlc2VudCByZWFkIDogMFxuIik7CisJfQorfQorCisKK3VpbnQ4X3QgcHJpbnRfaGVhZGVyX2luZm8gPSAwOworCitzdHJ1Y3QgYnVmZl9zIHsKKwl1MzIgYnVmX3N0YXJ0OworCXUzMiBidWZfc2l6ZTsKKwl1MzIgYnVmX2VuZDsKK30gYnVmZl90OworCitzdHJ1Y3QgQnVmZkluZm9fcyB7CisJdTMyIG1heF93aWR0aDsKKwl1MzIgbWF4X2hlaWdodDsKKwl1MzIgc3RhcnRfYWRyOworCXUzMiBlbmRfYWRyOworCXN0cnVjdCBidWZmX3MgaXBwOworCXN0cnVjdCBidWZmX3Mgc2FvX2FidjsKKwlzdHJ1Y3QgYnVmZl9zIHNhb192YjsKKwlzdHJ1Y3QgYnVmZl9zIHNob3J0X3Rlcm1fcnBzOworCXN0cnVjdCBidWZmX3MgdnBzOworCXN0cnVjdCBidWZmX3Mgc3BzOworCXN0cnVjdCBidWZmX3MgcHBzOworCXN0cnVjdCBidWZmX3Mgc2FvX3VwOworCXN0cnVjdCBidWZmX3Mgc3dhcF9idWY7CisJc3RydWN0IGJ1ZmZfcyBzd2FwX2J1ZjI7CisJc3RydWN0IGJ1ZmZfcyBzY2FsZWx1dDsKKwlzdHJ1Y3QgYnVmZl9zIGRibGtfcGFyYTsKKwlzdHJ1Y3QgYnVmZl9zIGRibGtfZGF0YTsKKwlzdHJ1Y3QgYnVmZl9zIHNlZ19tYXA7CisJc3RydWN0IGJ1ZmZfcyBtbXVfdmJoOworCXN0cnVjdCBidWZmX3MgY21faGVhZGVyOworCXN0cnVjdCBidWZmX3MgbXByZWRfYWJvdmU7CisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCXN0cnVjdCBidWZmX3MgbXByZWRfbXY7CisjZW5kaWYKKwlzdHJ1Y3QgYnVmZl9zIHJwbTsKKwlzdHJ1Y3QgYnVmZl9zIGxtZW07Cit9IEJ1ZmZJbmZvX3Q7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorI2RlZmluZSBERUNfUkVTVUxUX05PTkUgICAgICAgICAgICAgMAorI2RlZmluZSBERUNfUkVTVUxUX0RPTkUgICAgICAgICAgICAgMQorI2RlZmluZSBERUNfUkVTVUxUX0FHQUlOICAgICAgICAgICAgMgorI2RlZmluZSBERUNfUkVTVUxUX0NPTkZJR19QQVJBTSAgICAgMworI2RlZmluZSBERUNfUkVTVUxUX0VSUk9SICAgICAgICAgICAgNAorI2RlZmluZSBERUNfSU5JVF9QSUNMSVNUCQkJNQorI2RlZmluZSBERUNfVU5JTklUX1BJQ0xJU1QJCQk2CisjZGVmaW5lIERFQ19SRVNVTFRfR0VUX0RBVEEgICAgICAgICA3CisjZGVmaW5lIERFQ19SRVNVTFRfR0VUX0RBVEFfUkVUUlkgICA4CisjZGVmaW5lIERFQ19SRVNVTFRfRU9TICAgICAgICAgICAgICA5CisjZGVmaW5lIERFQ19SRVNVTFRfRk9SQ0VfRVhJVCAgICAgICAxMAorI2RlZmluZSBERUNfUkVTVUxUX05FRURfTU9SRV9CVUZGRVIJMTEKKyNkZWZpbmUgREVDX1Y0TDJfQ09OVElOVUVfREVDT0RJTkcgIDE4CisKKyNkZWZpbmUgREVDX1MxX1JFU1VMVF9OT05FICAgICAgICAgIDAKKyNkZWZpbmUgREVDX1MxX1JFU1VMVF9ET05FICAgICAgICAgIDEKKyNkZWZpbmUgREVDX1MxX1JFU1VMVF9GT1JDRV9FWElUICAgICAgIDIKKyNkZWZpbmUgREVDX1MxX1JFU1VMVF9URVNUX1RSSUdHRVJfRE9ORQkweGYwCisKKyNpZmRlZiBGQl9ERUNPRElOR19URVNUX1NDSEVEVUxFCisjZGVmaW5lIFRFU1RfU0VUX05PTkUgICAgICAgIDAKKyNkZWZpbmUgVEVTVF9TRVRfUElDX0RPTkUgICAgMQorI2RlZmluZSBURVNUX1NFVF9TMl9ET05FICAgICAyCisjZW5kaWYKKworc3RhdGljIHZvaWQgdnA5X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKyNlbmRpZgorc3RydWN0IGxvb3BfZmlsdGVyX2luZm9fbjsKK3N0cnVjdCBsb29wZmlsdGVyOworc3RydWN0IHNlZ21lbnRhdGlvbjsKKworI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKK3N0YXRpYyB2b2lkIG1wcmVkX3Byb2Nlc3Moc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKTsKK3N0YXRpYyB2b2lkIHZwOV9zMV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKK3N0cnVjdCBzdGFnZV9idWZfcyB7CisJaW50IGluZGV4OworCXVuc2lnbmVkIHNob3J0IHJwbVtSUE1fRU5EIC0gUlBNX0JFR0lOXTsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm90X3J1bjJfcmVhZHlbTUFYX0RFQ09ERV9JTlNUQU5DRV9OVU1dOworCitzdGF0aWMgdW5zaWduZWQgaW50IHJ1bjJfY291bnRbTUFYX0RFQ09ERV9JTlNUQU5DRV9OVU1dOworCisjaWZkZWYgRkJfREVDT0RJTkdfVEVTVF9TQ0hFRFVMRQordTMyIHN0YWdlX2J1Zl9udW07IC8qID0gMTY7Ki8KKyNlbHNlCit1MzIgc3RhZ2VfYnVmX251bTsKKyNlbmRpZgorI2VuZGlmCisKK3N0cnVjdCB2cDlfZmVuY2VfdmZfdCB7CisJdTMyIHVzZWRfc2l6ZTsKKwlzdHJ1Y3QgdmZyYW1lX3MgKmZlbmNlX3ZmW1ZGX1BPT0xfU0laRV07Cit9OworCitzdHJ1Y3QgVlA5RGVjb2Rlcl9zIHsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJdW5zaWduZWQgY2hhciBpbmRleDsKKworCXN0cnVjdCBkZXZpY2UgKmNtYV9kZXY7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2OworCXZvaWQgKCp2ZGVjX2NiKShzdHJ1Y3QgdmRlY19zICosIHZvaWQgKik7CisJdm9pZCAqdmRlY19jYl9hcmc7CisJc3RydWN0IHZmcmFtZV9jaHVua19zICpjaHVuazsKKwlpbnQgZGVjX3Jlc3VsdDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVjeWNsZV9tbXVfd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc2V0X2Nsa193b3JrOworCXUzMiBzdGFydF9zaGlmdF9ieXRlczsKKworCXN0cnVjdCBCdWZmSW5mb19zIHdvcmtfc3BhY2VfYnVmX3N0b3JlOworCXVuc2lnbmVkIGxvbmcgYnVmX3N0YXJ0OworCXUzMiBidWZfc2l6ZTsKKwl1MzIgY21hX2FsbG9jX2NvdW50OworCXVuc2lnbmVkIGxvbmcgY21hX2FsbG9jX2FkZHI7CisJdWludDhfdCBlb3M7CisJdW5zaWduZWQgbG9uZyBpbnQgc3RhcnRfcHJvY2Vzc190aW1lOworCXVuc2lnbmVkIGxhc3RfbGN1X2lkeDsKKwlpbnQgZGVjb2RlX3RpbWVvdXRfY291bnQ7CisJdW5zaWduZWQgdGltZW91dF9udW07CisJaW50IHNhdmVfYnVmZmVyX21vZGU7CisKKwlpbnQgZG91YmxlX3dyaXRlX21vZGU7CisjZW5kaWYKKwlsb25nIHVzZWRfNGtfbnVtOworCisJdW5zaWduZWQgY2hhciBtX2luc19mbGFnOworCWNoYXIgKnByb3ZpZGVyX25hbWU7CisJdW5pb24gcGFyYW1fdSBwYXJhbTsKKwlpbnQgZnJhbWVfY291bnQ7CisJaW50IHBpY19jb3VudDsKKwl1MzIgc3RhdDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwl1MzIgZnJhbWVfZHVyOworCXUzMiBmcmFtZV9hcjsKKwlpbnQgZmF0YWxfZXJyb3I7CisJdWludDhfdCBpbml0X2ZsYWc7CisJdWludDhfdCBmaXJzdF9zY19jaGVja2VkOworCXVpbnQ4X3QgcHJvY2Vzc19idXN5OworI2RlZmluZSBQUk9DX1NUQVRFX0lOSVQJCQkwCisjZGVmaW5lIFBST0NfU1RBVEVfREVDT0RFU0xJQ0UJMQorI2RlZmluZSBQUk9DX1NUQVRFX1NFTkRBR0FJTgkyCisJdWludDhfdCBwcm9jZXNzX3N0YXRlOworCXUzMiB1Y29kZV9wYXVzZV9wb3M7CisKKwlpbnQgc2hvd19mcmFtZV9udW07CisJc3RydWN0IGJ1ZmZfcyBtY19idWZfc3BlYzsKKwlzdHJ1Y3QgZGVjX3N5c2luZm8gdnZwOV9hbXN0cmVhbV9kZWNfaW5mbzsKKwl2b2lkICpycG1fYWRkcjsKKwl2b2lkICpsbWVtX2FkZHI7CisJZG1hX2FkZHJfdCBycG1fcGh5X2FkZHI7CisJZG1hX2FkZHJfdCBsbWVtX3BoeV9hZGRyOworCXVuc2lnbmVkIHNob3J0ICpsbWVtX3B0cjsKKwl1bnNpZ25lZCBzaG9ydCAqZGVidWdfcHRyOworCisJdm9pZCAqcHJvYl9idWZmZXJfYWRkcjsKKwl2b2lkICpjb3VudF9idWZmZXJfYWRkcjsKKwlkbWFfYWRkcl90IHByb2JfYnVmZmVyX3BoeV9hZGRyOworCWRtYV9hZGRyX3QgY291bnRfYnVmZmVyX3BoeV9hZGRyOworCisJdm9pZCAqZnJhbWVfbW11X21hcF9hZGRyOworCWRtYV9hZGRyX3QgZnJhbWVfbW11X21hcF9waHlfYWRkcjsKKworCXVuc2lnbmVkIGludCB1c2VfY21hX2ZsYWc7CisKKwlzdHJ1Y3QgQlVGX3MgbV9CVUZbTUFYX0JVRl9OVU1dOworCXN0cnVjdCBNVkJVRl9zIG1fbXZfQlVGW01WX0JVRkZFUl9OVU1dOworCXUzMiB1c2VkX2J1Zl9udW07CisJREVDTEFSRV9LRklGTyhuZXdmcmFtZV9xLCBzdHJ1Y3QgdmZyYW1lX3MgKiwgVkZfUE9PTF9TSVpFKTsKKwlERUNMQVJFX0tGSUZPKGRpc3BsYXlfcSwgc3RydWN0IHZmcmFtZV9zICosIFZGX1BPT0xfU0laRSk7CisJREVDTEFSRV9LRklGTyhwZW5kaW5nX3EsIHN0cnVjdCB2ZnJhbWVfcyAqLCBWRl9QT09MX1NJWkUpOworCXN0cnVjdCB2ZnJhbWVfcyB2ZnBvb2xbVkZfUE9PTF9TSVpFXTsKKwlhdG9taWNfdCB2Zl9wcmVfY291bnQ7CisJYXRvbWljX3QgdmZfZ2V0X2NvdW50OworCWF0b21pY190IHZmX3B1dF9jb3VudDsKKwlpbnQgYnVmX251bTsKKwlpbnQgcGljX251bTsKKwlpbnQgbGN1X3NpemVfbG9nMjsKKwl1bnNpZ25lZCBpbnQgbG9zbGVzc19jb21wX2JvZHlfc2l6ZTsKKworCXUzMiB2aWRlb19zaWduYWxfdHlwZTsKKworCWludCBwdHNfbW9kZTsKKwlpbnQgbGFzdF9sb29rdXBfcHRzOworCWludCBsYXN0X3B0czsKKwl1NjQgbGFzdF9sb29rdXBfcHRzX3VzNjQ7CisJdTY0IGxhc3RfcHRzX3VzNjQ7CisJdTY0IHNoaWZ0X2J5dGVfY291bnQ7CisKKwl1MzIgcHRzX3Vuc3RhYmxlOworCXUzMiBmcmFtZV9jbnRfd2luZG93OworCXUzMiBwdHMxLCBwdHMyOworCXUzMiBsYXN0X2R1cmF0aW9uOworCXUzMiBkdXJhdGlvbl9mcm9tX3B0c19kb25lOworCWJvb2wgdnA5X2ZpcnN0X3B0c19yZWFkeTsKKworCXUzMiBzaGlmdF9ieXRlX2NvdW50X2xvOworCXUzMiBzaGlmdF9ieXRlX2NvdW50X2hpOworCWludCBwdHNfbW9kZV9zd2l0Y2hpbmdfY291bnQ7CisJaW50IHB0c19tb2RlX3JlY292ZXJ5X2NvdW50OworCisJYm9vbCBnZXRfZnJhbWVfZHVyOworCXUzMiBzYXZlZF9yZXNvbHV0aW9uOworCisJLyoqLworCXN0cnVjdCBWUDlfQ29tbW9uX3MgY29tbW9uOworCXN0cnVjdCBSZWZDbnRCdWZmZXJfcyAqY3VyX2J1ZjsKKwlpbnQgcmVmcmVzaF9mcmFtZV9mbGFnczsKKwl1aW50OF90IG5lZWRfcmVzeW5jOworCXVpbnQ4X3QgaG9sZF9yZWZfYnVmOworCXVpbnQ4X3QgcmVhZHlfZm9yX25ld19kYXRhOworCXN0cnVjdCBCdWZmZXJQb29sX3MgdnA5X2J1ZmZlcl9wb29sOworCisJc3RydWN0IEJ1ZmZJbmZvX3MgKndvcmtfc3BhY2VfYnVmOworCisJc3RydWN0IGJ1ZmZfcyAqbWNfYnVmOworCisJdW5zaWduZWQgaW50IGZyYW1lX3dpZHRoOworCXVuc2lnbmVkIGludCBmcmFtZV9oZWlnaHQ7CisKKwl1bnNpZ25lZCBzaG9ydCAqcnBtX3B0cjsKKwlpbnQgICAgIGluaXRfcGljX3c7CisJaW50ICAgICBpbml0X3BpY19oOworCWludCAgICAgbGN1X3RvdGFsOworCWludCAgICAgbGN1X3NpemU7CisKKwlpbnQgICAgIHNsaWNlX3R5cGU7CisKKwlpbnQgc2tpcF9mbGFnOworCWludCBkZWNvZGVfaWR4OworCWludCBzbGljZV9pZHg7CisJdWludDhfdCBoYXNfa2V5ZnJhbWU7CisJdWludDhfdCB3YWl0X2J1ZjsKKwl1aW50OF90IGVycm9yX2ZsYWc7CisKKwkvKiBiaXQgMCwgZm9yIGRlY29kaW5nOyBiaXQgMSwgZm9yIGRpc3BsYXlpbmcgKi8KKwl1aW50OF90IGlnbm9yZV9idWZtZ3JfZXJyb3I7CisJaW50IFBCX3NraXBfbW9kZTsKKwlpbnQgUEJfc2tpcF9jb3VudF9hZnRlcl9kZWNvZGluZzsKKwkvKmh3Ki8KKworCS8qbGYqLworCWludCBkZWZhdWx0X2ZpbHRfbHZsOworCXN0cnVjdCBsb29wX2ZpbHRlcl9pbmZvX24gKmxmaTsKKwlzdHJ1Y3QgbG9vcGZpbHRlciAqbGY7CisJc3RydWN0IHNlZ21lbnRhdGlvbiAqc2VnXzRsZjsKKwkvKiovCisJc3RydWN0IHZkZWNfaW5mbyAqZ3ZzOworCisJdTMyIHByZV9zdHJlYW1fb2Zmc2V0OworCisJdW5zaWduZWQgaW50IGRlY19zdGF0dXM7CisJdTMyIGxhc3RfcHV0X2lkeDsKKwlpbnQgbmV3X2ZyYW1lX2Rpc3BsYXllZDsKKwl2b2lkICptbXVfYm94OworCXZvaWQgKmJtbXVfYm94OworCWludCBtbXVfZW5hYmxlOworCXN0cnVjdCB2ZnJhbWVfbWFzdGVyX2Rpc3BsYXlfY29sb3VyX3MgdmZfZHA7CisJc3RydWN0IGZpcm13YXJlX3MgKmZ3OworCWludCBtYXhfcGljX3c7CisJaW50IG1heF9waWNfaDsKKyNpZmRlZiBTVVBQT1JUX0ZCX0RFQ09ESU5HCisJaW50IGRlY19zMV9yZXN1bHQ7CisJaW50IHMxX3Rlc3RfY21kOworCXN0cnVjdCB3b3JrX3N0cnVjdCBzMV93b3JrOworCWludCB1c2VkX3N0YWdlX2J1Zl9udW07CisJaW50IHMxX3BvczsKKwlpbnQgczJfcG9zOworCXZvaWQgKnN0YWdlX21tdV9tYXBfYWRkcjsKKwlkbWFfYWRkcl90IHN0YWdlX21tdV9tYXBfcGh5X2FkZHI7CisJc3RydWN0IHN0YWdlX2J1Zl9zICpzMV9idWY7CisJc3RydWN0IHN0YWdlX2J1Zl9zICpzMl9idWY7CisJc3RydWN0IHN0YWdlX2J1Zl9zICpzdGFnZV9idWZzCisJCVtTVEFHRV9NQVhfQlVGRkVSU107CisJdW5zaWduZWQgY2hhciBydW4yX2J1c3k7CisKKwlpbnQgczFfbXZfYnVmX2luZGV4OworCWludCBzMV9tdl9idWZfaW5kZXhfcHJlOworCWludCBzMV9tdl9idWZfaW5kZXhfcHJlX3ByZTsKKwl1bnNpZ25lZCBsb25nIHMxX21wcmVkX212X3dyX3N0YXJ0X2FkZHI7CisJdW5zaWduZWQgbG9uZyBzMV9tcHJlZF9tdl93cl9zdGFydF9hZGRyX3ByZTsKKwl1bnNpZ25lZCBzaG9ydCBzMV9pbnRyYV9vbmx5OworCXVuc2lnbmVkIHNob3J0IHMxX2ZyYW1lX3R5cGU7CisJdW5zaWduZWQgc2hvcnQgczFfd2lkdGg7CisJdW5zaWduZWQgc2hvcnQgczFfaGVpZ2h0OworCXVuc2lnbmVkIHNob3J0IHMxX2xhc3Rfc2hvd19mcmFtZTsKKwl1bmlvbiBwYXJhbV91IHMxX3BhcmFtOworCXU4IGJhY2tfbm90X3J1bl9yZWFkeTsKKyNlbmRpZgorCWludCBuZWVkX2NhY2hlX3NpemU7CisJdTY0IHNjX3N0YXJ0X3RpbWU7CisJYm9vbCBwb3N0cHJvY19kb25lOworCWludCBsb3dfbGF0ZW5jeV9mbGFnOworCWJvb2wgbm9faGVhZDsKKwlib29sIHBpY19saXN0X2luaXRfZG9uZTsKKwlib29sIHBpY19saXN0X2luaXRfZG9uZTI7CisJYm9vbCBpc191c2VkX3Y0bDsKKwl2b2lkICp2NGwyX2N0eDsKKwlib29sIHY0bF9wYXJhbXNfcGFyc2VkOworCWludCBmcmFtZWluZm9fZW5hYmxlOworCXN0cnVjdCB2ZnJhbWVfcW9zX3MgdmZyYW1lX3FvczsKKwl1MzIgbWVtX21hcF9tb2RlOworCXUzMiBkeW5hbWljX2J1Zl9udW1fbWFyZ2luOworCXN0cnVjdCB2ZnJhbWVfcyB2ZnJhbWVfZHVtbXk7CisJdTMyIHJlc19jaF9mbGFnOworCS8qc3RydWN0IFZQOURlY29kZXJfcyB2cDlfZGVjb2RlcjsqLworCXVuaW9uIHBhcmFtX3UgdnA5X3BhcmFtOworCWludCBzaWRlYmluZF90eXBlOworCWludCBzaWRlYmluZF9jaGFubmVsX2lkOworCWJvb2wgZW5hYmxlX2ZlbmNlOworCWludCBmZW5jZV91c2FnZTsKKwl1MzIgZnJhbWVfbW9kZV9wdHNfc2F2ZVtGUkFNRV9CVUZGRVJTXTsKKwl1NjQgZnJhbWVfbW9kZV9wdHM2NF9zYXZlW0ZSQU1FX0JVRkZFUlNdOworCWludCBydW5fcmVhZHlfbWluX2J1Zl9udW07CisJaW50IG9uZV9wYWNrYWdlX2ZyYW1lX2NudDsKKwlpbnQgYnVmZmVyX3dyYXBbRlJBTUVfQlVGRkVSU107CisJaW50IGxhc3Rfd2lkdGg7CisJaW50IGxhc3RfaGVpZ2h0OworCXUzMiBlcnJvcl9mcmFtZV93aWR0aDsKKwl1MzIgZXJyb3JfZnJhbWVfaGVpZ2h0OworCXUzMiBlbmRpYW47CisJdWxvbmcgZmJfdG9rZW47CisJYm9vbCB3YWl0X21vcmVfYnVmOworCXNwaW5sb2NrX3Qgd2FpdF9idWZfbG9jazsKKwlzdHJ1Y3QgdnA5X2ZlbmNlX3ZmX3QgZmVuY2VfdmZfczsKKwlzdHJ1Y3QgbXV0ZXggZmVuY2VfbXV0ZXg7CisJZG1hX2FkZHJfdCByZG1hX3BoeV9hZHI7CisJdW5zaWduZWQgKnJkbWFfYWRyOworCXN0cnVjdCB0cmFjZV9kZWNvZGVyX25hbWUgdHJhY2U7CisJc3RydWN0IHZkZWNfZ2UyZCAqZ2UyZDsKK307CisKK3N0YXRpYyBpbnQgdnA5X3ByaW50KHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwKKwlpbnQgZmxhZywgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisjZGVmaW5lIEhFVkNfUFJJTlRfQlVGCQk1MTIKKwl1bnNpZ25lZCBjaGFyIGJ1ZltIRVZDX1BSSU5UX0JVRl07CisJaW50IGxlbiA9IDA7CisKKwlpZiAocGJpID09IE5VTEwgfHwKKwkJKGZsYWcgPT0gMCkgfHwKKwkJKGRlYnVnICYgZmxhZykpIHsKKwkJdmFfbGlzdCBhcmdzOworCisJCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJCWlmIChwYmkpCisJCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIlslZF0iLCBwYmktPmluZGV4KTsKKwkJdnNucHJpbnRmKGJ1ZiArIGxlbiwgSEVWQ19QUklOVF9CVUYgLSBsZW4sIGZtdCwgYXJncyk7CisJCXByX2RlYnVnKCIlcyIsIGJ1Zik7CisJCXZhX2VuZChhcmdzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXNfb3ZlcnNpemUoaW50IHcsIGludCBoKQoreworCWludCBtYXggPSAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpPworCQlNQVhfU0laRV84SyA6IE1BWF9TSVpFXzRLOworCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDVEKQorCQltYXggPSBNQVhfU0laRV8ySzsKKworCWlmICh3IDw9IDAgfHwgaCA8PSAwKQorCQlyZXR1cm4gdHJ1ZTsKKworCWlmIChoICE9IDAgJiYgKHcgPiBtYXggLyBoKSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgdnZwOV9tbXVfY29tcHJlc3NfaGVhZGVyX3NpemUoaW50IHcsIGludCBoKQoreworCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpICYmCisJCUlTXzhLX1NJWkUodywgaCkpCisJCXJldHVybiAoTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFXzhLKTsKKwlpZiAoSVNfNEtfU0laRSh3LCBoKSkKKwkJcmV0dXJuIChNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkVfNEspOworCXJldHVybiAoTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFXzEwODBQKTsKK30KKworLyojZGVmaW5lIEZSQU1FX01NVV9NQVBfU0laRSAgKE1BWF9GUkFNRV80S19OVU0gKiA0KSovCitzdGF0aWMgaW50IHZ2cDlfZnJhbWVfbW11X21hcF9zaXplKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKSAmJgorCQlJU184S19TSVpFKHBiaS0+bWF4X3BpY193LCBwYmktPm1heF9waWNfaCkpCisJCXJldHVybiAoTUFYX0ZSQU1FXzhLX05VTSA8PCAyKTsKKworCXJldHVybiAoTUFYX0ZSQU1FXzRLX05VTSA8PCAyKTsKK30KKworc3RhdGljIGludCB2NGxfYWxsb2NfYW5kX2NvbmZpZ19waWMoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLAorCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpwaWMpOworCitzdGF0aWMgdm9pZCByZXNpemVfY29udGV4dF9idWZmZXJzKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwKKwlzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjbSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworCWlmIChjbS0+d2lkdGggIT0gd2lkdGggfHwgY20tPmhlaWdodCAhPSBoZWlnaHQpIHsKKwkJLyogdG8gZG8gLi4qLworCQlpZiAocGJpICE9IE5VTEwpIHsKKwkJCXBiaS0+dnA5X2ZpcnN0X3B0c19yZWFkeSA9IDA7CisJCQlwYmktPmR1cmF0aW9uX2Zyb21fcHRzX2RvbmUgPSAwOworCQl9CisJCXByX2luZm8oIiVzICglZCwlZCk9PiglZCwlZClcclxuIiwgX19mdW5jX18sCisJCQljbS0+d2lkdGgsIGNtLT5oZWlnaHQsCisJCQl3aWR0aCwgaGVpZ2h0KTsKKwkJY20tPndpZHRoID0gd2lkdGg7CisJCWNtLT5oZWlnaHQgPSBoZWlnaHQ7CisJfQorCS8qCisJICppZiAoY20tPmN1cl9mcmFtZS0+bXZzID09IE5VTEwgfHwKKwkgKgljbS0+bWlfcm93cyA+IGNtLT5jdXJfZnJhbWUtPm1pX3Jvd3MgfHwKKwkgKgljbS0+bWlfY29scyA+IGNtLT5jdXJfZnJhbWUtPm1pX2NvbHMpIHsKKwkgKglyZXNpemVfbXZfYnVmZmVyKGNtKTsKKwkgKn0KKwkgKi8KK30KKworc3RhdGljIGludCB2YWxpZF9yZWZfZnJhbWVfc2l6ZShpbnQgcmVmX3dpZHRoLCBpbnQgcmVmX2hlaWdodCwKKwkJCQlpbnQgdGhpc193aWR0aCwgaW50IHRoaXNfaGVpZ2h0KSB7CisJcmV0dXJuIDIgKiB0aGlzX3dpZHRoID49IHJlZl93aWR0aCAmJgorCQkyICogdGhpc19oZWlnaHQgPj0gcmVmX2hlaWdodCAmJgorCQl0aGlzX3dpZHRoIDw9IDE2ICogcmVmX3dpZHRoICYmCisJCXRoaXNfaGVpZ2h0IDw9IDE2ICogcmVmX2hlaWdodDsKK30KKworLyoKKyAqc3RhdGljIGludCB2YWxpZF9yZWZfZnJhbWVfaW1nX2ZtdChlbnVtIHZweF9iaXRfZGVwdGhfdCByZWZfYml0X2RlcHRoLAorICoJCQkJCWludCByZWZfeHNzLCBpbnQgcmVmX3lzcywKKyAqCQkJCQllbnVtIHZweF9iaXRfZGVwdGhfdCB0aGlzX2JpdF9kZXB0aCwKKyAqCQkJCQlpbnQgdGhpc194c3MsIGludCB0aGlzX3lzcykgeworICoJcmV0dXJuIHJlZl9iaXRfZGVwdGggPT0gdGhpc19iaXRfZGVwdGggJiYgcmVmX3hzcyA9PSB0aGlzX3hzcyAmJgorICoJCXJlZl95c3MgPT0gdGhpc195c3M7CisgKn0KKyAqLworCisKK3N0YXRpYyBpbnQgc2V0dXBfZnJhbWVfc2l6ZSgKKwkJc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLAorCQlzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjbSwgdW5pb24gcGFyYW1fdSAqcGFyYW1zLAorCQl1bnNpZ25lZCBpbnQgKm1tdV9pbmRleF9hZHIsCisJCWludCBwcmludF9oZWFkZXJfaW5mbykgeworCWludCB3aWR0aCwgaGVpZ2h0OworCXN0cnVjdCBCdWZmZXJQb29sX3MgKiBjb25zdCBwb29sID0gY20tPmJ1ZmZlcl9wb29sOworCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICp5YmY7CisJaW50IHJldCA9IDA7CisKKwl3aWR0aCA9IHBhcmFtcy0+cC53aWR0aDsKKwloZWlnaHQgPSBwYXJhbXMtPnAuaGVpZ2h0OworCWlmIChpc19vdmVyc2l6ZSh3aWR0aCwgaGVpZ2h0KSkgeworCQlwYmktPmVycm9yX2ZyYW1lX3dpZHRoID0gd2lkdGg7CisJCXBiaS0+ZXJyb3JfZnJhbWVfaGVpZ2h0ID0gaGVpZ2h0OworCQl2cDlfcHJpbnQocGJpLCAwLCAiJXMsIEVycm9yOiBJbnZhbGlkIGZyYW1lIHNpemVcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwYmktPmVycm9yX2ZyYW1lX3dpZHRoID0gMDsKKwlwYmktPmVycm9yX2ZyYW1lX2hlaWdodCA9IDA7CisKKwkvKnZwOV9yZWFkX2ZyYW1lX3NpemUocmIsICZ3aWR0aCwgJmhlaWdodCk7Ki8KKwlpZiAocHJpbnRfaGVhZGVyX2luZm8pCisJCXByX2luZm8oIiAqIDE2LWJpdHMgdyByZWFkIDogJWQgKHdpZHRoIDogJWQpXG4iLCB3aWR0aCwgaGVpZ2h0KTsKKwlpZiAocHJpbnRfaGVhZGVyX2luZm8pCisJCXByX2luZm8KKwkJKCIgKiAxNi1iaXRzIGggcmVhZCA6ICVkIChoZWlnaHQgOiAlZClcbiIsIHdpZHRoLCBoZWlnaHQpOworCisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9QSUNUVVJFX1NJWkUsIChoZWlnaHQgPDwgMTYpIHwgd2lkdGgpOworI2lmZGVmIFZQOV8xMEJfSEVEX0ZCCisJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9QSUNfU0laRV9GQl9SRUFELCAoaGVpZ2h0IDw8IDE2KSB8IHdpZHRoKTsKKyNlbmRpZgorCWlmIChwYmktPm1tdV9lbmFibGUgJiYgKChwYmktPmRvdWJsZV93cml0ZV9tb2RlICYgMHgxMCkgPT0gMCkpIHsKKwkJcmV0ID0gdnA5X2FsbG9jX21tdShwYmksCisJCQljbS0+bmV3X2ZiX2lkeCwKKwkJCXBhcmFtcy0+cC53aWR0aCwKKwkJCXBhcmFtcy0+cC5oZWlnaHQsCisJCQlwYXJhbXMtPnAuYml0X2RlcHRoLAorCQkJbW11X2luZGV4X2Fkcik7CisJCWlmIChyZXQgIT0gMCkgeworCQkJcHJfZXJyKCJjYW4ndCBhbGxvYyBuZWVkIG1tdTEsaWR4ICVkIHJldCA9JWRcbiIsCisJCQkJY20tPm5ld19mYl9pZHgsCisJCQkJcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJY20tPmN1cl9mYl9pZHhfbW11ID0gY20tPm5ld19mYl9pZHg7CisJfQorCisJcmVzaXplX2NvbnRleHRfYnVmZmVycyhwYmksIGNtLCB3aWR0aCwgaGVpZ2h0KTsKKwlzZXR1cF9kaXNwbGF5X3NpemUoY20sIHBhcmFtcywgcHJpbnRfaGVhZGVyX2luZm8pOworI2lmIDAKKwlsb2NrX2J1ZmZlcl9wb29sKHBvb2wpOworCWlmICh2cDlfcmVhbGxvY19mcmFtZV9idWZmZXIoCisJCWdldF9mcmFtZV9uZXdfYnVmZmVyKGNtKSwgY20tPndpZHRoLCBjbS0+aGVpZ2h0LAorCQljbS0+c3Vic2FtcGxpbmdfeCwgY20tPnN1YnNhbXBsaW5nX3ksCisjaWYgQ09ORklHX1ZQOV9ISUdIQklUREVQVEgKKwkJY20tPnVzZV9oaWdoYml0ZGVwdGgsCisjZW5kaWYKKwkJVlA5X0RFQ19CT1JERVJfSU5fUElYRUxTLAorCQljbS0+Ynl0ZV9hbGlnbm1lbnQsCisJCSZwb29sLT5mcmFtZV9idWZzW2NtLT5uZXdfZmJfaWR4XS5yYXdfZnJhbWVfYnVmZmVyLAorCQlwb29sLT5nZXRfZmJfY2IsIHBvb2wtPmNiX3ByaXYpKSB7CisJCXVubG9ja19idWZmZXJfcG9vbChwb29sKTsKKwkJdnB4X2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIFZQWF9DT0RFQ19NRU1fRVJST1IsCisJCQkiRmFpbGVkIHRvIGFsbG9jYXRlIGZyYW1lIGJ1ZmZlciIpOworCX0KKwl1bmxvY2tfYnVmZmVyX3Bvb2wocG9vbCk7CisjZWxzZQorCS8qIHBvcnRpbmcgKi8KKwl5YmYgPSBnZXRfZnJhbWVfbmV3X2J1ZmZlcihjbSk7CisJaWYgKCF5YmYpCisJCXJldHVybiAtMTsKKworCXliZi0+eV9jcm9wX3dpZHRoID0gd2lkdGg7CisJeWJmLT55X2Nyb3BfaGVpZ2h0ID0gaGVpZ2h0OworCXliZi0+Yml0X2RlcHRoID0gcGFyYW1zLT5wLmJpdF9kZXB0aDsKKyNlbmRpZgorCXBvb2wtPmZyYW1lX2J1ZnNbY20tPm5ld19mYl9pZHhdLmJ1Zi5zdWJzYW1wbGluZ194ID0gY20tPnN1YnNhbXBsaW5nX3g7CisJcG9vbC0+ZnJhbWVfYnVmc1tjbS0+bmV3X2ZiX2lkeF0uYnVmLnN1YnNhbXBsaW5nX3kgPSBjbS0+c3Vic2FtcGxpbmdfeTsKKwlwb29sLT5mcmFtZV9idWZzW2NtLT5uZXdfZmJfaWR4XS5idWYuYml0X2RlcHRoID0KKwkJCQkJCSh1bnNpZ25lZCBpbnQpY20tPmJpdF9kZXB0aDsKKwlwb29sLT5mcmFtZV9idWZzW2NtLT5uZXdfZmJfaWR4XS5idWYuY29sb3Jfc3BhY2UgPSBjbS0+Y29sb3Jfc3BhY2U7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzZXR1cF9mcmFtZV9zaXplX3dpdGhfcmVmcygKKwkJc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLAorCQlzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjbSwKKwkJdW5pb24gcGFyYW1fdSAqcGFyYW1zLAorCQl1bnNpZ25lZCBpbnQgKm1tdV9pbmRleF9hZHIsCisJCWludCBwcmludF9oZWFkZXJfaW5mbykgeworCisJaW50IHdpZHRoLCBoZWlnaHQ7CisJaW50IGZvdW5kID0gMCwgaTsKKwlpbnQgaGFzX3ZhbGlkX3JlZl9mcmFtZSA9IDA7CisJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnliZjsKKwlzdHJ1Y3QgQnVmZmVyUG9vbF9zICogY29uc3QgcG9vbCA9IGNtLT5idWZmZXJfcG9vbDsKKwlpbnQgcmV0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBSRUZTX1BFUl9GUkFNRTsgKytpKSB7CisJCWlmICgocGFyYW1zLT5wLnNhbWVfZnJhbWVfc2l6ZSA+PgorCQkJCShSRUZTX1BFUl9GUkFNRSAtIGkgLSAxKSkgJiAweDEpIHsKKwkJCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpjb25zdCBidWYgPQorCQkJCQkJCWNtLT5mcmFtZV9yZWZzW2ldLmJ1ZjsKKwkJCS8qaWYgKHByaW50X2hlYWRlcl9pbmZvKQorCQkJICoJcHJfaW5mbworCQkJICoJKCIxLWJpdCBzYW1lX2ZyYW1lX3NpemVbJWRdIHJlYWQgOiAxXG4iLCBpKTsKKwkJCSAqLworCQkJCXdpZHRoID0gYnVmLT55X2Nyb3Bfd2lkdGg7CisJCQkJaGVpZ2h0ID0gYnVmLT55X2Nyb3BfaGVpZ2h0OworCQkJLyppZiAocHJpbnRfaGVhZGVyX2luZm8pCisJCQkgKglwcl9pbmZvCisJCQkgKgkoIiAtIHNhbWVfZnJhbWVfc2l6ZSB3aWR0aCA6ICVkXG4iLCB3aWR0aCk7CisJCQkgKi8KKwkJCS8qaWYgKHByaW50X2hlYWRlcl9pbmZvKQorCQkJICoJcHJfaW5mbworCQkJICoJKCIgLSBzYW1lX2ZyYW1lX3NpemUgaGVpZ2h0IDogJWRcbiIsIGhlaWdodCk7CisJCQkgKi8KKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJLyppZiAocHJpbnRfaGVhZGVyX2luZm8pCisJCQkgKglwcl9pbmZvCisJCQkgKgkoIjEtYml0IHNhbWVfZnJhbWVfc2l6ZVslZF0gcmVhZCA6IDBcbiIsIGkpOworCQkJICovCisJCX0KKwl9CisKKwlpZiAoIWZvdW5kKSB7CisJCS8qdnA5X3JlYWRfZnJhbWVfc2l6ZShyYiwgJndpZHRoLCAmaGVpZ2h0KTsqLworCQl3aWR0aCA9IHBhcmFtcy0+cC53aWR0aDsKKwkJaGVpZ2h0ID0gcGFyYW1zLT5wLmhlaWdodDsKKwkJLyppZiAocHJpbnRfaGVhZGVyX2luZm8pCisJCSAqCXByX2luZm8KKwkJICoJKCIgKiAxNi1iaXRzIHcgcmVhZCA6ICVkICh3aWR0aCA6ICVkKVxuIiwKKwkJICoJCXdpZHRoLCBoZWlnaHQpOworCQkgKmlmIChwcmludF9oZWFkZXJfaW5mbykKKwkJICoJcHJfaW5mbworCQkgKgkoIiAqIDE2LWJpdHMgaCByZWFkIDogJWQgKGhlaWdodCA6ICVkKVxuIiwKKwkJICoJCXdpZHRoLCBoZWlnaHQpOworCQkgKi8KKwl9CisKKwlpZiAoaXNfb3ZlcnNpemUod2lkdGgsIGhlaWdodCkpIHsKKwkJcGJpLT5lcnJvcl9mcmFtZV93aWR0aCA9IHdpZHRoOworCQlwYmktPmVycm9yX2ZyYW1lX2hlaWdodCA9IGhlaWdodDsKKwkJdnA5X3ByaW50KHBiaSwgMCwgIiVzLCBFcnJvcjogSW52YWxpZCBmcmFtZSBzaXplXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtMTsKKwl9CisJcGJpLT5lcnJvcl9mcmFtZV93aWR0aCA9IDA7CisJcGJpLT5lcnJvcl9mcmFtZV9oZWlnaHQgPSAwOworCisJcGFyYW1zLT5wLndpZHRoID0gd2lkdGg7CisJcGFyYW1zLT5wLmhlaWdodCA9IGhlaWdodDsKKworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfUElDVFVSRV9TSVpFLCAoaGVpZ2h0IDw8IDE2KSB8IHdpZHRoKTsKKwlpZiAocGJpLT5tbXVfZW5hYmxlICYmICgocGJpLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MTApID09IDApKSB7CisJCS8qaWYoY20tPnByZXZfZmJfaWR4ID49IDApIHJlbGVhc2VfdW51c2VkXzRrKGNtLT5wcmV2X2ZiX2lkeCk7CisJCSAqY20tPnByZXZfZmJfaWR4ID0gY20tPm5ld19mYl9pZHg7CisJCSAqLworCS8qCXByX2luZm8KKwkgKgkoIltERUJVRyBERUJVR11CZWZvcmUgYWxsb2NfbW11LAorCSAqCXByZXZfZmJfaWR4IDogJWQsIG5ld19mYl9pZHggOiAlZFxyXG4iLAorCSAqCWNtLT5wcmV2X2ZiX2lkeCwgY20tPm5ld19mYl9pZHgpOworCSAqLworCQlyZXQgPSB2cDlfYWxsb2NfbW11KHBiaSwgY20tPm5ld19mYl9pZHgsCisJCQkJcGFyYW1zLT5wLndpZHRoLCBwYXJhbXMtPnAuaGVpZ2h0LAorCQlwYXJhbXMtPnAuYml0X2RlcHRoLCBtbXVfaW5kZXhfYWRyKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlwcl9lcnIoImNhbid0IGFsbG9jIG5lZWQgbW11LGlkeCAlZFxyXG4iLAorCQkJCWNtLT5uZXdfZmJfaWR4KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJY20tPmN1cl9mYl9pZHhfbW11ID0gY20tPm5ld19mYl9pZHg7CisJfQorCisJLypDaGVjayB0byBtYWtlIHN1cmUgYXQgbGVhc3Qgb25lIG9mIGZyYW1lcyB0aGF0IHRoaXMgZnJhbWUgcmVmZXJlbmNlcworCSAqaGFzIHZhbGlkIGRpbWVuc2lvbnMuCisJICovCisJZm9yIChpID0gMDsgaSA8IFJFRlNfUEVSX0ZSQU1FOyArK2kpIHsKKwkJc3RydWN0IFJlZkJ1ZmZlcl9zICogY29uc3QgcmVmX2ZyYW1lID0gJmNtLT5mcmFtZV9yZWZzW2ldOworCisJCWhhc192YWxpZF9yZWZfZnJhbWUgfD0KKwkJCXZhbGlkX3JlZl9mcmFtZV9zaXplKHJlZl9mcmFtZS0+YnVmLT55X2Nyb3Bfd2lkdGgsCisJCQlyZWZfZnJhbWUtPmJ1Zi0+eV9jcm9wX2hlaWdodCwKKwkJCXdpZHRoLCBoZWlnaHQpOworCX0KKwlpZiAoIWhhc192YWxpZF9yZWZfZnJhbWUpIHsKKwkJcHJfZXJyKCJFcnJvcjogUmVmZXJlbmNlZCBmcmFtZSBoYXMgaW52YWxpZCBzaXplXHJcbiIpOworCQlyZXR1cm4gLTE7CisJfQorI2lmIDAKKwlmb3IgKGkgPSAwOyBpIDwgUkVGU19QRVJfRlJBTUU7ICsraSkgeworCQkJc3RydWN0IFJlZkJ1ZmZlcl9zICogY29uc3QgcmVmX2ZyYW1lID0KKwkJCQkJCQkmY20tPmZyYW1lX3JlZnNbaV07CisJCQlpZiAoIXZhbGlkX3JlZl9mcmFtZV9pbWdfZm10KAorCQkJCXJlZl9mcmFtZS0+YnVmLT5iaXRfZGVwdGgsCisJCQkJcmVmX2ZyYW1lLT5idWYtPnN1YnNhbXBsaW5nX3gsCisJCQkJcmVmX2ZyYW1lLT5idWYtPnN1YnNhbXBsaW5nX3ksCisJCQkJY20tPmJpdF9kZXB0aCwKKwkJCQljbS0+c3Vic2FtcGxpbmdfeCwKKwkJCQljbS0+c3Vic2FtcGxpbmdfeSkpCisJCQkJcHJfZXJyCisJCQkJKCJSZWZlcmVuY2VkIGZyYW1lIGluY29tcGF0aWJsZSBjb2xvciBmbXRcclxuIik7CisJCQkJcmV0dXJuIC0xOworCX0KKyNlbmRpZgorCXJlc2l6ZV9jb250ZXh0X2J1ZmZlcnMocGJpLCBjbSwgd2lkdGgsIGhlaWdodCk7CisJc2V0dXBfZGlzcGxheV9zaXplKGNtLCBwYXJhbXMsIHByaW50X2hlYWRlcl9pbmZvKTsKKworI2lmIDAKKwlsb2NrX2J1ZmZlcl9wb29sKHBvb2wpOworCWlmICh2cDlfcmVhbGxvY19mcmFtZV9idWZmZXIoCisJCWdldF9mcmFtZV9uZXdfYnVmZmVyKGNtKSwgY20tPndpZHRoLCBjbS0+aGVpZ2h0LAorCQljbS0+c3Vic2FtcGxpbmdfeCwgY20tPnN1YnNhbXBsaW5nX3ksCisjaWYgQ09ORklHX1ZQOV9ISUdIQklUREVQVEgKKwkJY20tPnVzZV9oaWdoYml0ZGVwdGgsCisjZW5kaWYKKwkJVlA5X0RFQ19CT1JERVJfSU5fUElYRUxTLAorCQljbS0+Ynl0ZV9hbGlnbm1lbnQsCisJCSZwb29sLT5mcmFtZV9idWZzW2NtLT5uZXdfZmJfaWR4XS5yYXdfZnJhbWVfYnVmZmVyLAorCQlwb29sLT5nZXRfZmJfY2IsCisJCXBvb2wtPmNiX3ByaXYpKSB7CisJCXVubG9ja19idWZmZXJfcG9vbChwb29sKTsKKwkJdnB4X2ludGVybmFsX2Vycm9yKCZjbS0+ZXJyb3IsIFZQWF9DT0RFQ19NRU1fRVJST1IsCisJCSJGYWlsZWQgdG8gYWxsb2NhdGUgZnJhbWUgYnVmZmVyIik7CisJfQorCXVubG9ja19idWZmZXJfcG9vbChwb29sKTsKKyNlbHNlCisJLyogcG9ydGluZyAqLworCXliZiA9IGdldF9mcmFtZV9uZXdfYnVmZmVyKGNtKTsKKwlpZiAoIXliZikKKwkJcmV0dXJuIC0xOworCisJeWJmLT55X2Nyb3Bfd2lkdGggPSB3aWR0aDsKKwl5YmYtPnlfY3JvcF9oZWlnaHQgPSBoZWlnaHQ7CisJeWJmLT5iaXRfZGVwdGggPSBwYXJhbXMtPnAuYml0X2RlcHRoOworI2VuZGlmCisJcG9vbC0+ZnJhbWVfYnVmc1tjbS0+bmV3X2ZiX2lkeF0uYnVmLnN1YnNhbXBsaW5nX3ggPSBjbS0+c3Vic2FtcGxpbmdfeDsKKwlwb29sLT5mcmFtZV9idWZzW2NtLT5uZXdfZmJfaWR4XS5idWYuc3Vic2FtcGxpbmdfeSA9IGNtLT5zdWJzYW1wbGluZ195OworCXBvb2wtPmZyYW1lX2J1ZnNbY20tPm5ld19mYl9pZHhdLmJ1Zi5iaXRfZGVwdGggPQorCQkJCQkJKHVuc2lnbmVkIGludCljbS0+Yml0X2RlcHRoOworCXBvb2wtPmZyYW1lX2J1ZnNbY20tPm5ld19mYl9pZHhdLmJ1Zi5jb2xvcl9zcGFjZSA9IGNtLT5jb2xvcl9zcGFjZTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgY2xvc2VfdG8oaW50IGEsIGludCBiLCBpbnQgbSkKK3sKKwlyZXR1cm4gKGFicyhhIC0gYikgPCBtKSA/IHRydWUgOiBmYWxzZTsKK30KKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKK3N0YXRpYyBpbnQgdnA5X3ByaW50X2NvbnQoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLAorCWludCBmbGFnLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZltIRVZDX1BSSU5UX0JVRl07CisJaW50IGxlbiA9IDA7CisKKwlpZiAocGJpID09IE5VTEwgfHwKKwkJKGZsYWcgPT0gMCkgfHwKKwkJKGRlYnVnICYgZmxhZykpIHsKKwkJdmFfbGlzdCBhcmdzOworCisJCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJCXZzbnByaW50ZihidWYgKyBsZW4sIEhFVkNfUFJJTlRfQlVGIC0gbGVuLCBmbXQsIGFyZ3MpOworCQlwcl9kZWJ1ZygiJXMiLCBidWYpOworCQl2YV9lbmQoYXJncyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0cmlnZ2VyX3NjaGVkdWxlKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlpZiAocGJpLT5pc191c2VkX3Y0bCkgeworCQlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKHBiaS0+djRsMl9jdHgpOworCisJCWlmIChjdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSAmJgorCQkJIXBiaS0+djRsX3BhcmFtc19wYXJzZWQpCisJCQl2ZGVjX3Y0bF93cml0ZV9mcmFtZV9zeW5jKGN0eCk7CisJfQorCisJQVRSQUNFX0NPVU5URVIoIlZfU1RfREVDLWNodW5rX3NpemUiLCAwKTsKKworCWlmIChwYmktPnZkZWNfY2IpCisJCXBiaS0+dmRlY19jYihod190b192ZGVjKHBiaSksIHBiaS0+dmRlY19jYl9hcmcpOworfQorCitzdGF0aWMgdm9pZCByZXNldF9wcm9jZXNzX3RpbWUoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCWlmIChwYmktPnN0YXJ0X3Byb2Nlc3NfdGltZSkgeworCQl1bnNpZ25lZCBwcm9jZXNzX3RpbWUgPQorCQkJMTAwMCAqIChqaWZmaWVzIC0gcGJpLT5zdGFydF9wcm9jZXNzX3RpbWUpIC8gSFo7CisJCXBiaS0+c3RhcnRfcHJvY2Vzc190aW1lID0gMDsKKwkJaWYgKHByb2Nlc3NfdGltZSA+IG1heF9wcm9jZXNzX3RpbWVbcGJpLT5pbmRleF0pCisJCQltYXhfcHJvY2Vzc190aW1lW3BiaS0+aW5kZXhdID0gcHJvY2Vzc190aW1lOworCX0KK30KKworc3RhdGljIHZvaWQgc3RhcnRfcHJvY2Vzc190aW1lKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlwYmktPnN0YXJ0X3Byb2Nlc3NfdGltZSA9IGppZmZpZXM7CisJcGJpLT5kZWNvZGVfdGltZW91dF9jb3VudCA9IDA7CisJcGJpLT5sYXN0X2xjdV9pZHggPSAwOworfQorCitzdGF0aWMgdm9pZCB0aW1lb3V0X3Byb2Nlc3Moc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCXBiaS0+dGltZW91dF9udW0rKzsKKwlpZiAocGJpLT5wcm9jZXNzX2J1c3kpIHsKKwkJdnA5X3ByaW50KHBiaSwKKwkJCTAsICIlcyBkZWNvZGVyIHRpbWVvdXQgYnV0IHByb2Nlc3NfYnVzeVxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCWFtaGV2Y19zdG9wKCk7CisJdnA5X3ByaW50KHBiaSwKKwkJMCwgIiVzIGRlY29kZXIgdGltZW91dFxuIiwgX19mdW5jX18pOworCisJcGJpLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworCXJlc2V0X3Byb2Nlc3NfdGltZShwYmkpOworCXZkZWNfc2NoZWR1bGVfd29yaygmcGJpLT53b3JrKTsKK30KKworc3RhdGljIHUzMiBnZXRfdmFsaWRfZG91YmxlX3dyaXRlX21vZGUoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCXJldHVybiAoKGRvdWJsZV93cml0ZV9tb2RlICYgMHg4MDAwMDAwMCkgPT0gMCkgPworCQlwYmktPmRvdWJsZV93cml0ZV9tb2RlIDoKKwkJKGRvdWJsZV93cml0ZV9tb2RlICYgMHg3ZmZmZmZmZik7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2RvdWJsZV93cml0ZV9tb2RlKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwl1MzIgdmFsaWRfZHdfbW9kZSA9IGdldF92YWxpZF9kb3VibGVfd3JpdGVfbW9kZShwYmkpOworCXUzMiBkdzsKKwlpbnQgdywgaDsKKwlzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjbSA9ICZwYmktPmNvbW1vbjsKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqY3VyX3BpY19jb25maWc7CisKKwlpZiAocGJpLT5pc191c2VkX3Y0bCkgeworCQl1bnNpZ25lZCBpbnQgb3V0OworCisJCXZkZWNfdjRsX2dldF9kd19tb2RlKHBiaS0+djRsMl9jdHgsICZvdXQpOworCQlkdyA9IG91dDsKKwkJcmV0dXJuIGR3OworCX0KKworCS8qIG1hc2sgZm9yIHN1cHBvcnRpbmcgZG91YmxlIHdyaXRlIHZhbHVlIGJpZ2dlciB0aGFuIDB4MTAwICovCisJaWYgKHZhbGlkX2R3X21vZGUgJiAweGZmZmZmZjAwKSB7CisJCWlmICghY20tPmN1cl9mcmFtZSkKKwkJCXJldHVybiAxOy8qbm8gdmFsaWQgZnJhbWUsKi8KKwkJY3VyX3BpY19jb25maWcgPSAmY20tPmN1cl9mcmFtZS0+YnVmOworCQl3ID0gY3VyX3BpY19jb25maWctPnlfY3JvcF93aWR0aDsKKwkJaCA9IGN1cl9waWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0OworCisJCWR3ID0gMHgxOyAvKjE6MSovCisJCXN3aXRjaCAodmFsaWRfZHdfbW9kZSkgeworCQljYXNlIDB4MTAwOgorCQkJaWYgKHcgPiAxOTIwICYmIGggPiAxMDg4KQorCQkJCWR3ID0gMHg0OyAvKjE6MiovCisJCQlicmVhazsKKwkJY2FzZSAweDIwMDoKKwkJCWlmICh3ID4gMTkyMCAmJiBoID4gMTA4OCkKKwkJCQlkdyA9IDB4MjsgLyoxOjQqLworCQkJYnJlYWs7CisJCWNhc2UgMHgzMDA6CisJCQlpZiAodyA+IDEyODAgJiYgaCA+IDcyMCkKKwkJCQlkdyA9IDB4NDsgLyoxOjIqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gZHc7CisJfQorCisJcmV0dXJuIHZhbGlkX2R3X21vZGU7Cit9CisKKy8qIGZvciBkb3VibGUgd3JpdGUgYnVmIGFsbG9jICovCitzdGF0aWMgaW50IGdldF9kb3VibGVfd3JpdGVfbW9kZV9pbml0KHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwl1MzIgdmFsaWRfZHdfbW9kZSA9IGdldF92YWxpZF9kb3VibGVfd3JpdGVfbW9kZShwYmkpOworCXUzMiBkdzsKKwlpbnQgdyA9IHBiaS0+aW5pdF9waWNfdzsKKwlpbnQgaCA9IHBiaS0+aW5pdF9waWNfaDsKKworCWR3ID0gMHgxOyAvKjE6MSovCisJc3dpdGNoICh2YWxpZF9kd19tb2RlKSB7CisJY2FzZSAweDEwMDoKKwkJaWYgKHcgPiAxOTIwICYmIGggPiAxMDg4KQorCQkJZHcgPSAweDQ7IC8qMToyKi8KKwkJYnJlYWs7CisJY2FzZSAweDIwMDoKKwkJaWYgKHcgPiAxOTIwICYmIGggPiAxMDg4KQorCQkJZHcgPSAweDI7IC8qMTo0Ki8KKwkJYnJlYWs7CisJY2FzZSAweDMwMDoKKwkJaWYgKHcgPiAxMjgwICYmIGggPiA3MjApCisJCQlkdyA9IDB4NDsgLyoxOjIqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkdyA9IHZhbGlkX2R3X21vZGU7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gZHc7Cit9CisjZW5kaWYKKworLy8jZGVmaW5lCU1BWF80S19OVU0JCTB4MTIwMAorCisvKiByZXR1cm4gcGFnZSBudW1iZXIgKi8KK3N0YXRpYyBpbnQgdnA5X21tdV9wYWdlX251bShzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksCisJCWludCB3LCBpbnQgaCwgaW50IHNhdmVfbW9kZSkKK3sKKwlpbnQgcGljdHVyZV9zaXplOworCWludCBjdXJfbW11XzRrX251bWJlciwgbWF4X2ZyYW1lX251bTsKKworCXBpY3R1cmVfc2l6ZSA9IGNvbXB1dGVfbG9zbGVzc19jb21wX2JvZHlfc2l6ZSh3LCBoLCBzYXZlX21vZGUpOworCWN1cl9tbXVfNGtfbnVtYmVyID0gKChwaWN0dXJlX3NpemUgKyAoUEFHRV9TSVpFIC0gMSkpID4+IFBBR0VfU0hJRlQpOworCisJbWF4X2ZyYW1lX251bSA9ICh2dnA5X2ZyYW1lX21tdV9tYXBfc2l6ZShwYmkpID4+IDIpOworCisJaWYgKGN1cl9tbXVfNGtfbnVtYmVyID4gbWF4X2ZyYW1lX251bSkgeworCQlwcl9lcnIoIm92ZXIgbWF4ICEhIGN1cl9tbXVfNGtfbnVtYmVyIDB4JXggd2lkdGggJWQgaGVpZ2h0ICVkXG4iLAorCQkJY3VyX21tdV80a19udW1iZXIsIHcsIGgpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIGN1cl9tbXVfNGtfbnVtYmVyOworfQorCitzdGF0aWMgc3RydWN0IGludGVybmFsX2NvbXBfYnVmKiB2NGxmYl90b19pY29tcF9idWYoCisJCXN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwKKwkJc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKmZiKQoreworCXN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1ZiAqYW1sX2ZiID0gTlVMTDsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKiB2NGwyX2N0eCA9IHBiaS0+djRsMl9jdHg7CisKKwlhbWxfZmIgPSBjb250YWluZXJfb2YoZmIsIHN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1ZiwgZnJhbWVfYnVmZmVyKTsKKwlyZXR1cm4gJnY0bDJfY3R4LT5jb21wX2J1ZnNbYW1sX2ZiLT5pbnRlcm5hbF9pbmRleF07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZXJuYWxfY29tcF9idWYqIGluZGV4X3RvX2ljb21wX2J1ZigKKwkJc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLCBpbnQgaW5kZXgpCit7CisJc3RydWN0IGFtbF92aWRlb19kZWNfYnVmICphbWxfZmIgPSBOVUxMOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqIHY0bDJfY3R4ID0gcGJpLT52NGwyX2N0eDsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPSBOVUxMOworCisJZmIgPSAoc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKikKKwkJcGJpLT5tX0JVRltpbmRleF0udjRsX3JlZl9idWZfYWRkcjsKKwlhbWxfZmIgPSBjb250YWluZXJfb2YoZmIsIHN0cnVjdCBhbWxfdmlkZW9fZGVjX2J1ZiwgZnJhbWVfYnVmZmVyKTsKKwlyZXR1cm4gJnY0bDJfY3R4LT5jb21wX2J1ZnNbYW1sX2ZiLT5pbnRlcm5hbF9pbmRleF07Cit9CisKK2ludCB2cDlfYWxsb2NfbW11KAorCXN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwKKwlpbnQgY3VyX2J1Zl9pZHgsCisJaW50IHBpY193aWR0aCwKKwlpbnQgcGljX2hlaWdodCwKKwl1bnNpZ25lZCBzaG9ydCBiaXRfZGVwdGgsCisJdW5zaWduZWQgaW50ICptbXVfaW5kZXhfYWRyKQoreworCWludCByZXQ7CisJaW50IGJpdF9kZXB0aF8xMCA9IChiaXRfZGVwdGggPT0gVlBYX0JJVFNfMTApOworCWludCBjdXJfbW11XzRrX251bWJlcjsKKworCWlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUocGJpKSA9PSAweDEwKQorCQlyZXR1cm4gMDsKKworCWlmIChiaXRfZGVwdGggPj0gVlBYX0JJVFNfMTIpIHsKKwkJcGJpLT5mYXRhbF9lcnJvciA9IERFQ09ERVJfRkFUQUxfRVJST1JfU0laRV9PVkVSRkxPVzsKKwkJcHJfZXJyKCJmYXRhbF9lcnJvciwgdW4gc3VwcG9ydCBiaXQgZGVwdGggMTIhXG5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJY3VyX21tdV80a19udW1iZXIgPSB2cDlfbW11X3BhZ2VfbnVtKHBiaSwKKwkJCQlwaWNfd2lkdGgsCisJCQkJcGljX2hlaWdodCwKKwkJCQliaXRfZGVwdGhfMTApOworCWlmIChjdXJfbW11XzRrX251bWJlciA8IDApCisJCXJldHVybiAtMTsKKwlBVFJBQ0VfQ09VTlRFUihwYmktPnRyYWNlLmRlY29kZV9oZWFkZXJfbWVtb3J5X3RpbWVfbmFtZSwgVFJBQ0VfSEVBREVSX01FTU9SWV9TVEFSVCk7CisJaWYgKHBiaS0+aXNfdXNlZF92NGwpIHsKKwkJc3RydWN0IGludGVybmFsX2NvbXBfYnVmICppYnVmID0KKwkJCWluZGV4X3RvX2ljb21wX2J1ZihwYmksIGN1cl9idWZfaWR4KTsKKworCQlyZXQgPSBkZWNvZGVyX21tdV9ib3hfYWxsb2NfaWR4KAorCQkJCWlidWYtPm1tdV9ib3gsCisJCQkJaWJ1Zi0+aW5kZXgsCisJCQkJaWJ1Zi0+ZnJhbWVfYnVmZmVyX3NpemUsCisJCQkJbW11X2luZGV4X2Fkcik7CisJfSBlbHNlIHsKKwkJcmV0ID0gZGVjb2Rlcl9tbXVfYm94X2FsbG9jX2lkeCgKKwkJCQlwYmktPm1tdV9ib3gsCisJCQkJY3VyX2J1Zl9pZHgsCisJCQkJY3VyX21tdV80a19udW1iZXIsCisJCQkJbW11X2luZGV4X2Fkcik7CisJfQorCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UuZGVjb2RlX2hlYWRlcl9tZW1vcnlfdGltZV9uYW1lLCBUUkFDRV9IRUFERVJfTUVNT1JZX0VORCk7CisJcmV0dXJuIHJldDsKK30KKworI2lmbmRlZiBNVl9VU0VfRklYRURfQlVGCitzdGF0aWMgdm9pZCBkZWFsbG9jX212X2J1ZnMoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBNVl9CVUZGRVJfTlVNOyBpKyspIHsKKwkJaWYgKHBiaS0+bV9tdl9CVUZbaV0uc3RhcnRfYWRyKSB7CisJCQlpZiAoZGVidWcpCisJCQkJcHJfaW5mbygKKwkJCQkiZGVhbGxvYyBtdiBidWYoJWQpIGFkciAlbGQgc2l6ZSAweCV4IHVzZWRfZmxhZyAlZFxuIiwKKwkJCQlpLCBwYmktPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciwKKwkJCQlwYmktPm1fbXZfQlVGW2ldLnNpemUsCisJCQkJcGJpLT5tX212X0JVRltpXS51c2VkX2ZsYWcpOworCQkJZGVjb2Rlcl9ibW11X2JveF9mcmVlX2lkeCgKKwkJCQlwYmktPmJtbXVfYm94LAorCQkJCU1WX0JVRkZFUl9JRFgoaSkpOworCQkJcGJpLT5tX212X0JVRltpXS5zdGFydF9hZHIgPSAwOworCQkJcGJpLT5tX212X0JVRltpXS5zaXplID0gMDsKKwkJCXBiaS0+bV9tdl9CVUZbaV0udXNlZF9mbGFnID0gMDsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBhbGxvY19tdl9idWYoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLAorCWludCBpLCBpbnQgc2l6ZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChwYmktPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciAmJgorCQlzaXplID4gcGJpLT5tX212X0JVRltpXS5zaXplKSB7CisJCWRlYWxsb2NfbXZfYnVmcyhwYmkpOworCX0gZWxzZSBpZiAocGJpLT5tX212X0JVRltpXS5zdGFydF9hZHIpCisJCXJldHVybiAwOworCisJaWYgKGRlY29kZXJfYm1tdV9ib3hfYWxsb2NfYnVmX3BoeQorCQkocGJpLT5ibW11X2JveCwKKwkJTVZfQlVGRkVSX0lEWChpKSwgc2l6ZSwKKwkJRFJJVkVSX05BTUUsCisJCSZwYmktPm1fbXZfQlVGW2ldLnN0YXJ0X2FkcikgPCAwKSB7CisJCXBiaS0+bV9tdl9CVUZbaV0uc3RhcnRfYWRyID0gMDsKKwkJcmV0ID0gLTE7CisJfSBlbHNlIHsKKwkJcGJpLT5tX212X0JVRltpXS5zaXplID0gc2l6ZTsKKwkJcGJpLT5tX212X0JVRltpXS51c2VkX2ZsYWcgPSAwOworCQlyZXQgPSAwOworCQlpZiAoZGVidWcpIHsKKwkJCXByX2luZm8oCisJCQkiTVYgQnVmZmVyICVkOiBzdGFydF9hZHIgJXB4IHNpemUgJXhcbiIsCisJCQlpLAorCQkJKHZvaWQgKilwYmktPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciwKKwkJCXBiaS0+bV9tdl9CVUZbaV0uc2l6ZSk7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjYWxfbXZfYnVmX3NpemUoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLCBpbnQgcGljX3dpZHRoLCBpbnQgcGljX2hlaWdodCkKK3sKKwlpbnQgbGN1X3NpemUgPSA2NDsgLypmaXhlZCA2NCovCisJaW50IHBpY193aWR0aF82NCA9IChwaWNfd2lkdGggKyA2MykgJiAofjB4M2YpOworCWludCBwaWNfaGVpZ2h0XzMyID0gKHBpY19oZWlnaHQgKyAzMSkgJiAofjB4MWYpOworCWludCBwaWNfd2lkdGhfbGN1ICA9IChwaWNfd2lkdGhfNjQgJSBsY3Vfc2l6ZSkgPworCQkJCXBpY193aWR0aF82NCAvIGxjdV9zaXplICArIDEKKwkJCQk6IHBpY193aWR0aF82NCAvIGxjdV9zaXplOworCWludCBwaWNfaGVpZ2h0X2xjdSA9IChwaWNfaGVpZ2h0XzMyICUgbGN1X3NpemUpID8KKwkJCQlwaWNfaGVpZ2h0XzMyIC8gbGN1X3NpemUgKyAxCisJCQkJOiBwaWNfaGVpZ2h0XzMyIC8gbGN1X3NpemU7CisJaW50IGxjdV90b3RhbCAgICAgICA9IHBpY193aWR0aF9sY3UgKiBwaWNfaGVpZ2h0X2xjdTsKKwlpbnQgc2l6ZV9hID0gbGN1X3RvdGFsICogMzYgKiAxNjsKKwlpbnQgc2l6ZV9iID0gcGljX3dpZHRoX2xjdSAqIDE2ICoKKwkJKChwaWNfaGVpZ2h0X2xjdSA+PiAzKSArIChwaWNfaGVpZ2h0X2xjdSAmIDB4NykpOworCWludCBzaXplID0gKHNpemVfYSArIHNpemVfYiArIDB4ZmZmZikgJgorCQkofjB4ZmZmZik7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworCitzdGF0aWMgaW50IGluaXRfbXZfYnVmX2xpc3Qoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCWludCBpOworCWludCByZXQgPSAwOworCWludCBjb3VudCA9IE1WX0JVRkZFUl9OVU07CisJaW50IHBpY193aWR0aCA9IHBiaS0+aW5pdF9waWNfdzsKKwlpbnQgcGljX2hlaWdodCA9IHBiaS0+aW5pdF9waWNfaDsKKwlpbnQgc2l6ZSA9IGNhbF9tdl9idWZfc2l6ZShwYmksIHBpY193aWR0aCwgcGljX2hlaWdodCk7CisKKwlpZiAobXZfYnVmX2R5bmFtaWNfYWxsb2MpCisJCXJldHVybiAwOworCisJaWYgKG12X2J1Zl9tYXJnaW4gPiAwKQorCQljb3VudCA9IFJFRl9GUkFNRVMgKyBtdl9idWZfbWFyZ2luOworCisJaWYgKHBiaS0+aW5pdF9waWNfdyA+IDIwNDggJiYgcGJpLT5pbml0X3BpY19oID4gMTA4OCkKKwkJY291bnQgPSBSRUZfRlJBTUVTXzRLICsgbXZfYnVmX21hcmdpbjsKKwllbHNlCisJCWNvdW50ID0gUkVGX0ZSQU1FUyArIG12X2J1Zl9tYXJnaW47CisKKwlpZiAoZGVidWcpIHsKKwkJcHJfaW5mbygiJXMgdzolZCwgaDolZCwgY291bnQ6ICVkXG4iLAorCQlfX2Z1bmNfXywgcGJpLT5pbml0X3BpY193LCBwYmktPmluaXRfcGljX2gsIGNvdW50KTsKKwl9CisKKwlmb3IgKGkgPSAwOworCQlpIDwgY291bnQgJiYgaSA8IE1WX0JVRkZFUl9OVU07IGkrKykgeworCQlpZiAoYWxsb2NfbXZfYnVmKHBiaSwgaSwgc2l6ZSkgPCAwKSB7CisJCQlyZXQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X212X2J1ZihzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksCisJCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpwaWNfY29uZmlnKQoreworCWludCBpOworCWludCByZXQgPSAtMTsKKwlpZiAobXZfYnVmX2R5bmFtaWNfYWxsb2MpIHsKKwkJdW5pb24gcGFyYW1fdSAqcGFyYW1zID0gJnBiaS0+dnA5X3BhcmFtOworCQlpbnQgc2l6ZSA9IGNhbF9tdl9idWZfc2l6ZShwYmksCisJCQlwYXJhbXMtPnAud2lkdGgsIHBhcmFtcy0+cC5oZWlnaHQpOworCQlmb3IgKGkgPSAwOyBpIDwgTVZfQlVGRkVSX05VTTsgaSsrKSB7CisJCQlpZiAocGJpLT5tX212X0JVRltpXS5zdGFydF9hZHIgPT0gMCkgeworCQkJCXJldCA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGkgPT0gTVZfQlVGRkVSX05VTSkgeworCQkJcHJfaW5mbygKKwkJCSIlczogRXJyb3IsIG12IGJ1ZiBNVl9CVUZGRVJfTlVNIGlzIG5vdCBlbm91Z2hcbiIsCisJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJaWYgKGFsbG9jX212X2J1ZihwYmksIHJldCwgc2l6ZSkgPj0gMCkgeworCQkJcGljX2NvbmZpZy0+bXZfYnVmX2luZGV4ID0gcmV0OworCQkJcGljX2NvbmZpZy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkciA9CisJCQkJKHBiaS0+bV9tdl9CVUZbcmV0XS5zdGFydF9hZHIgKyAweGZmZmYpICYKKwkJCQkofjB4ZmZmZik7CisJCQlwaWNfY29uZmlnLT5tdl9zaXplID0gc2l6ZTsKKworCQkJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0JVRk1HUl9NT1JFKQorCQkJCXByX2luZm8oCisJCQkJIiVzIGFsbG9jID0+ICVkICglbGQpIHNpemUgMHgleFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0LAorCQkJCXBpY19jb25maWctPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIsCisJCQkJcGljX2NvbmZpZy0+bXZfc2l6ZSk7CisJCX0gZWxzZSB7CisJCQlwcl9pbmZvKAorCQkJIiVzOiBFcnJvciwgbXYgYnVmIGFsbG9jIGZhaWxcbiIsCisJCQlfX2Z1bmNfXyk7CisJCX0KKwkJcmV0dXJuIHJldDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTVZfQlVGRkVSX05VTTsgaSsrKSB7CisJCWlmIChwYmktPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciAmJgorCQkJcGJpLT5tX212X0JVRltpXS51c2VkX2ZsYWcgPT0gMCkgeworCQkJcGJpLT5tX212X0JVRltpXS51c2VkX2ZsYWcgPSAxOworCQkJcmV0ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHJldCA+PSAwKSB7CisJCXBpY19jb25maWctPm12X2J1Zl9pbmRleCA9IHJldDsKKwkJcGljX2NvbmZpZy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkciA9CisJCQkocGJpLT5tX212X0JVRltyZXRdLnN0YXJ0X2FkciArIDB4ZmZmZikgJgorCQkJKH4weGZmZmYpOworCQlwaWNfY29uZmlnLT5tdl9zaXplID0gcGJpLT5tX212X0JVRltyZXRdLnNpemU7CisJCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19CVUZNR1JfTU9SRSkKKwkJCXByX2luZm8oCisJCQkiJXMgPT4gJWQgKCVseCkgc2l6ZSAweCV4XG4iLAorCQkJX19mdW5jX18sIHJldCwKKwkJCXBpY19jb25maWctPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIsCisJCQlwaWNfY29uZmlnLT5tdl9zaXplKTsKKwl9IGVsc2UgeworCQlwcl9pbmZvKAorCQkiJXM6IEVycm9yLCBtdiBidWYgaXMgbm90IGVub3VnaFxuIiwKKwkJX19mdW5jX18pOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBwdXRfbXZfYnVmKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwKKwkJCQlpbnQgKm12X2J1Zl9pbmRleCkKK3sKKwlpbnQgaSA9ICptdl9idWZfaW5kZXg7CisJaWYgKGkgPj0gTVZfQlVGRkVSX05VTSkgeworCQlpZiAoZGVidWcgJiBWUDlfREVCVUdfQlVGTUdSX01PUkUpCisJCQlwcl9pbmZvKAorCQkJIiVzOiBpbmRleCAlZCBiZXlvbmQgcmFuZ2VcbiIsCisJCQlfX2Z1bmNfXywgaSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAobXZfYnVmX2R5bmFtaWNfYWxsb2MpIHsKKwkJaWYgKHBiaS0+bV9tdl9CVUZbaV0uc3RhcnRfYWRyKSB7CisJCQlpZiAoZGVidWcpCisJCQkJcHJfaW5mbygKKwkJCQkiZGVhbGxvYyBtdiBidWYoJWQpIGFkciAlbGQgc2l6ZSAweCV4IHVzZWRfZmxhZyAlZFxuIiwKKwkJCQlpLCBwYmktPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciwKKwkJCQlwYmktPm1fbXZfQlVGW2ldLnNpemUsCisJCQkJcGJpLT5tX212X0JVRltpXS51c2VkX2ZsYWcpOworCQkJZGVjb2Rlcl9ibW11X2JveF9mcmVlX2lkeCgKKwkJCQlwYmktPmJtbXVfYm94LAorCQkJCU1WX0JVRkZFUl9JRFgoaSkpOworCQkJcGJpLT5tX212X0JVRltpXS5zdGFydF9hZHIgPSAwOworCQkJcGJpLT5tX212X0JVRltpXS5zaXplID0gMDsKKwkJCXBiaS0+bV9tdl9CVUZbaV0udXNlZF9mbGFnID0gMDsKKwkJfQorCQkqbXZfYnVmX2luZGV4ID0gLTE7CisJCXJldHVybjsKKwl9CisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0JVRk1HUl9NT1JFKQorCQlwcl9pbmZvKAorCQkiJXMoJWQpOiB1c2VkX2ZsYWcoJWQpXG4iLAorCQlfX2Z1bmNfXywgaSwKKwkJcGJpLT5tX212X0JVRltpXS51c2VkX2ZsYWcpOworCisJKm12X2J1Zl9pbmRleCA9IC0xOworCWlmIChwYmktPm1fbXZfQlVGW2ldLnN0YXJ0X2FkciAmJgorCQlwYmktPm1fbXZfQlVGW2ldLnVzZWRfZmxhZykKKwkJcGJpLT5tX212X0JVRltpXS51c2VkX2ZsYWcgPSAwOworfQorCitzdGF0aWMgdm9pZAlwdXRfdW5fdXNlZF9tdl9idWZzKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjb25zdCBjbSA9ICZwYmktPmNvbW1vbjsKKwlzdHJ1Y3QgUmVmQ250QnVmZmVyX3MgKmNvbnN0IGZyYW1lX2J1ZnMgPSBjbS0+YnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnM7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHBiaS0+dXNlZF9idWZfbnVtOyArK2kpIHsKKwkJaWYgKCgmZnJhbWVfYnVmc1tpXSAhPSBjbS0+cHJldl9mcmFtZSkgJiYKKwkJCShmcmFtZV9idWZzW2ldLmJ1Zi5pbmRleCAhPSAtMSkgJiYKKwkJCShmcmFtZV9idWZzW2ldLmJ1Zi5tdl9idWZfaW5kZXggPj0gMCkKKwkJCSkKKwkJCXB1dF9tdl9idWYocGJpLCAmZnJhbWVfYnVmc1tpXS5idWYubXZfYnVmX2luZGV4KTsKKwl9Cit9CisKKyNpZmRlZiBTVVBQT1JUX0ZCX0RFQ09ESU5HCitzdGF0aWMgYm9vbCBtdl9idWZfYXZhaWxhYmxlKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlpbnQgaTsKKwlib29sIHJldCA9IDA7CisJZm9yIChpID0gMDsgaSA8IE1WX0JVRkZFUl9OVU07IGkrKykgeworCQlpZiAocGJpLT5tX212X0JVRltpXS5zdGFydF9hZHIgJiYKKwkJCXBiaS0+bV9tdl9CVUZbaV0udXNlZF9mbGFnID09IDApIHsKKwkJCXJldCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKK3N0YXRpYyB2b2lkIGluaXRfc3RhZ2VfYnVmKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwl1aW50IGk7CisJZm9yIChpID0gMDsgaSA8IFNUQUdFX01BWF9CVUZGRVJTCisJCSYmIGkgPCBzdGFnZV9idWZfbnVtOyBpKyspIHsKKwkJcGJpLT5zdGFnZV9idWZzW2ldID0KKwkJCXZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdGFnZV9idWZfcykpOworCQlpZiAocGJpLT5zdGFnZV9idWZzW2ldID09IE5VTEwpIHsKKwkJCXZwOV9wcmludChwYmksCisJCQkJMCwgIiVzIHZtYWxsb2MgZmFpbFxuIiwgX19mdW5jX18pOworCQkJYnJlYWs7CisJCX0KKwkJcGJpLT5zdGFnZV9idWZzW2ldLT5pbmRleCA9IGk7CisJfQorCXBiaS0+dXNlZF9zdGFnZV9idWZfbnVtID0gaTsKKwlwYmktPnMxX3BvcyA9IDA7CisJcGJpLT5zMl9wb3MgPSAwOworCXBiaS0+czFfYnVmID0gTlVMTDsKKwlwYmktPnMyX2J1ZiA9IE5VTEw7CisJcGJpLT5zMV9tdl9idWZfaW5kZXggPSBGUkFNRV9CVUZGRVJTOworCXBiaS0+czFfbXZfYnVmX2luZGV4X3ByZSA9IEZSQU1FX0JVRkZFUlM7CisJcGJpLT5zMV9tdl9idWZfaW5kZXhfcHJlX3ByZSA9IEZSQU1FX0JVRkZFUlM7CisKKwlpZiAocGJpLT51c2VkX3N0YWdlX2J1Zl9udW0gPiAwKQorCQl2cDlfcHJpbnQocGJpLAorCQkJMCwgIiVzIDIgc3RhZ2UgZGVjb2RpbmcgYnVmICVkXG4iLAorCQkJX19mdW5jX18sCisJCQlwYmktPnVzZWRfc3RhZ2VfYnVmX251bSk7Cit9CisKK3N0YXRpYyB2b2lkIHVuaW5pdF9zdGFnZV9idWYoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBwYmktPnVzZWRfc3RhZ2VfYnVmX251bTsgaSsrKSB7CisJCWlmIChwYmktPnN0YWdlX2J1ZnNbaV0pCisJCQl2ZnJlZShwYmktPnN0YWdlX2J1ZnNbaV0pOworCQlwYmktPnN0YWdlX2J1ZnNbaV0gPSBOVUxMOworCX0KKwlwYmktPnVzZWRfc3RhZ2VfYnVmX251bSA9IDA7CisJcGJpLT5zMV9wb3MgPSAwOworCXBiaS0+czJfcG9zID0gMDsKKwlwYmktPnMxX2J1ZiA9IE5VTEw7CisJcGJpLT5zMl9idWYgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGdldF9zMV9idWYoCisJc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCXN0cnVjdCBzdGFnZV9idWZfcyAqYnVmID0gTlVMTDsKKwlpbnQgcmV0ID0gLTE7CisJaW50IGJ1Zl9wYWdlX251bSA9IE1BWF9TVEFHRV9QQUdFX05VTTsKKwlpbnQgbmV4dF9zMV9wb3MgPSBwYmktPnMxX3BvcyArIDE7CisKKwlpZiAobmV4dF9zMV9wb3MgPj0gcGJpLT51c2VkX3N0YWdlX2J1Zl9udW0pCisJCW5leHRfczFfcG9zID0gMDsKKwlpZiAobmV4dF9zMV9wb3MgPT0gcGJpLT5zMl9wb3MpIHsKKwkJcGJpLT5zMV9idWYgPSBOVUxMOworCQlyZXR1cm4gcmV0OworCX0KKworCWJ1ZiA9IHBiaS0+c3RhZ2VfYnVmc1twYmktPnMxX3Bvc107CisJcmV0ID0gZGVjb2Rlcl9tbXVfYm94X2FsbG9jX2lkeCgKKwkJcGJpLT5tbXVfYm94LAorCQlidWYtPmluZGV4LAorCQlidWZfcGFnZV9udW0sCisJCXBiaS0+c3RhZ2VfbW11X21hcF9hZGRyKTsKKwlpZiAocmV0IDwgMCkgeworCQl2cDlfcHJpbnQocGJpLCAwLAorCQkJIiVzIGRlY29kZXJfbW11X2JveF9hbGxvYyBmYWlsIGZvciBpbmRleCAlZCAoczFfcG9zICVkIHMyX3BvcyAlZClcbiIsCisJCQlfX2Z1bmNfXywgYnVmLT5pbmRleCwKKwkJCXBiaS0+czFfcG9zLCBwYmktPnMyX3Bvcyk7CisJCWJ1ZiA9IE5VTEw7CisJfSBlbHNlIHsKKwkJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHXzJfU1RBR0UsCisJCQkiJXMgZGVjb2Rlcl9tbXVfYm94X2FsbG9jICVkIHBhZ2UgZm9yIGluZGV4ICVkIChzMV9wb3MgJWQgczJfcG9zICVkKVxuIiwKKwkJCV9fZnVuY19fLCBidWZfcGFnZV9udW0sIGJ1Zi0+aW5kZXgsCisJCQlwYmktPnMxX3BvcywgcGJpLT5zMl9wb3MpOworCX0KKwlwYmktPnMxX2J1ZiA9IGJ1ZjsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpbmNfczFfcG9zKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlzdHJ1Y3Qgc3RhZ2VfYnVmX3MgKmJ1ZiA9CisJCXBiaS0+c3RhZ2VfYnVmc1twYmktPnMxX3Bvc107CisKKwlpbnQgdXNlZF9wYWdlX251bSA9CisjaWZkZWYgRkJfREVDT0RJTkdfVEVTVF9TQ0hFRFVMRQorCQlNQVhfU1RBR0VfUEFHRV9OVU0vMjsKKyNlbHNlCisJCShSRUFEX1ZSRUcoSEVWQ19BU1NJU1RfSEVEX0ZCX1dfQ1RMKSA+PiAxNik7CisjZW5kaWYKKwlkZWNvZGVyX21tdV9ib3hfZnJlZV9pZHhfdGFpbChwYmktPm1tdV9ib3gsCisJCUZSQU1FX0JVRkZFUlMgKyBidWYtPmluZGV4LCB1c2VkX3BhZ2VfbnVtKTsKKworCXBiaS0+czFfcG9zKys7CisJaWYgKHBiaS0+czFfcG9zID49IHBiaS0+dXNlZF9zdGFnZV9idWZfbnVtKQorCQlwYmktPnMxX3BvcyA9IDA7CisKKwl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfMl9TVEFHRSwKKwkJIiVzICh1c2VkX3BhZ2VfbnVtICVkKSBmb3IgaW5kZXggJWQgKHMxX3BvcyAlZCBzMl9wb3MgJWQpXG4iLAorCQlfX2Z1bmNfXywgdXNlZF9wYWdlX251bSwgYnVmLT5pbmRleCwKKwkJcGJpLT5zMV9wb3MsIHBiaS0+czJfcG9zKTsKK30KKworI2RlZmluZSBzMl9idWZfYXZhaWxhYmxlKHBiaSkgKHBiaS0+czFfcG9zICE9IHBiaS0+czJfcG9zKQorCitzdGF0aWMgaW50IGdldF9zMl9idWYoCisJc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCWludCByZXQgPSAtMTsKKwlzdHJ1Y3Qgc3RhZ2VfYnVmX3MgKmJ1ZiA9IE5VTEw7CisJaWYgKHMyX2J1Zl9hdmFpbGFibGUocGJpKSkgeworCQlidWYgPSBwYmktPnN0YWdlX2J1ZnNbcGJpLT5zMl9wb3NdOworCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfMl9TVEFHRSwKKwkJCSIlcyBmb3IgaW5kZXggJWQgKHMxX3BvcyAlZCBzMl9wb3MgJWQpXG4iLAorCQkJX19mdW5jX18sIGJ1Zi0+aW5kZXgsCisJCQlwYmktPnMxX3BvcywgcGJpLT5zMl9wb3MpOworCQlwYmktPnMyX2J1ZiA9IGJ1ZjsKKwkJcmV0ID0gMDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaW5jX3MyX3BvcyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJc3RydWN0IHN0YWdlX2J1Zl9zICpidWYgPQorCQlwYmktPnN0YWdlX2J1ZnNbcGJpLT5zMl9wb3NdOworCWRlY29kZXJfbW11X2JveF9mcmVlX2lkeChwYmktPm1tdV9ib3gsCisJCUZSQU1FX0JVRkZFUlMgKyBidWYtPmluZGV4KTsKKwlwYmktPnMyX3BvcysrOworCWlmIChwYmktPnMyX3BvcyA+PSBwYmktPnVzZWRfc3RhZ2VfYnVmX251bSkKKwkJcGJpLT5zMl9wb3MgPSAwOworCXZwOV9wcmludChwYmksIFZQOV9ERUJVR18yX1NUQUdFLAorCQkiJXMgZm9yIGluZGV4ICVkIChzMV9wb3MgJWQgczJfcG9zICVkKVxuIiwKKwkJX19mdW5jX18sIGJ1Zi0+aW5kZXgsCisJCXBiaS0+czFfcG9zLCBwYmktPnMyX3Bvcyk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2ZyZWVfc3RhZ2VfYnVmX251bShzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJaW50IG51bTsKKwlpZiAocGJpLT5zMV9wb3MgPj0gcGJpLT5zMl9wb3MpCisJCW51bSA9IHBiaS0+dXNlZF9zdGFnZV9idWZfbnVtIC0KKwkJCShwYmktPnMxX3BvcyAtIHBiaS0+czJfcG9zKSAtIDE7CisJZWxzZQorCQludW0gPSAocGJpLT5zMl9wb3MgLSBwYmktPnMxX3BvcykgLSAxOworCXJldHVybiBudW07Cit9CisKKyNpZm5kZWYgRkJfREVDT0RJTkdfVEVTVF9TQ0hFRFVMRQorc3RhdGljIERFRklORV9TUElOTE9DSyhmYl9jb3JlX3NwaW5fbG9jayk7CisKK3N0YXRpYyB1OCBpc19zMl9kZWNvZGluZ19maW5pc2hlZChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJLyogdG8gZG86IFZMU0kgcmV2aWV3CisJCWNvbXBsZXRpb24gb2YgbGFzdCBMQ1UgZGVjb2RpbmcgaW4gQkFDSworCSAqLworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBzdGFydF9zMV9kZWNvZGluZyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJLyogdG8gZG86IFZMU0kgcmV2aWV3CisJIGFmdGVyIHBhcnNlciwgaG93IHRvIHN0YXJ0IExDVSBkZWNvZGluZyBpbiBCQUNLCisJKi8KK30KKworc3RhdGljIHZvaWQgZmJfcmVzZXRfY29yZShzdHJ1Y3QgdmRlY19zICp2ZGVjLCB1MzIgbWFzaykKK3sKKwkvKiB0byBkbzogVkxTSSByZXZpZXcKKwkJMS4gaG93IHRvIGRpc2Nvbm5lY3QgRE1DIGZvciBGUk9OVCBhbmQgQkFDSworCQkyLiByZXNldCBiaXQgMTMsIDI0LCBGUk9OVCBvciBCQUNLID8/CisJKi8KKworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHJlc2V0X2JpdHMgPSAwOworCWlmIChtYXNrICYgSFdfTUFTS19GUk9OVCkKKwkJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9DT05UUk9MLCAwKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmJfY29yZV9zcGluX2xvY2ssIGZsYWdzKTsKKwljb2RlY19kbWNidXNfd3JpdGUoRE1DX1JFUV9DVFJMLAorCQljb2RlY19kbWNidXNfcmVhZChETUNfUkVRX0NUUkwpICYgKH4oMSA8PCA0KSkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZiX2NvcmVfc3Bpbl9sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAoIShjb2RlY19kbWNidXNfcmVhZChETUNfQ0hBTl9TVFMpCisJCSYgKDEgPDwgNCkpKQorCQk7CisKKwlpZiAoKG1hc2sgJiBIV19NQVNLX0ZST05UKSAmJgorCQlpbnB1dF9mcmFtZV9iYXNlZCh2ZGVjKSkKKwkJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9DT05UUk9MLCAwKTsKKworCQkvKgorCSAqIDI6IGFzc2lzdAorCSAqIDM6IHBhcnNlcgorCSAqIDQ6IHBhcnNlcl9zdGF0ZQorCSAqIDg6IGRibGsKKwkgKiAxMTptY3B1CisJICogMTI6Y2NwdQorCSAqIDEzOmRkcgorCSAqIDE0OmlxaXQKKwkgKiAxNTppcHAKKwkgKiAxNzpxZGN0CisJICogMTg6bXByZWQKKwkgKiAxOTpzYW8KKwkgKiAyNDpoZXZjX2FmaWZvCisJICovCisJaWYgKG1hc2sgJiBIV19NQVNLX0ZST05UKSB7CisJCXJlc2V0X2JpdHMgPQorCQkoMTw8Myl8KDE8PDQpfCgxPDwxMSl8CisJCSgxPDwxMil8KDE8PDE4KTsKKwl9CisJaWYgKG1hc2sgJiBIV19NQVNLX0JBQ0spIHsKKwkJcmVzZXRfYml0cyA9CisJCSgxPDw4KXwoMTw8MTMpfCgxPDwxNCl8KDE8PDE1KXwKKwkJKDE8PDE3KXwoMTw8MTkpfCgxPDwyNCk7CisJfQorCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMywgcmVzZXRfYml0cyk7CisjaWYgMAorCQkoMTw8Myl8KDE8PDQpfCgxPDw4KXwoMTw8MTEpfAorCQkoMTw8MTIpfCgxPDwxMyl8KDE8PDE0KXwoMTw8MTUpfAorCQkoMTw8MTcpfCgxPDwxOCl8KDE8PDE5KXwoMTw8MjQpOworI2VuZGlmCisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQzLCAwKTsKKworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZiX2NvcmVfc3Bpbl9sb2NrLCBmbGFncyk7CisJY29kZWNfZG1jYnVzX3dyaXRlKERNQ19SRVFfQ1RSTCwKKwkJY29kZWNfZG1jYnVzX3JlYWQoRE1DX1JFUV9DVFJMKSB8ICgxIDw8IDQpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmYl9jb3JlX3NwaW5fbG9jaywgZmxhZ3MpOworCit9CisjZW5kaWYKKworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGluaXRfcGljX2xpc3RfaHcoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKTsKKworc3RhdGljIGludCBnZXRfZnJlZV9mYihzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJc3RydWN0IFZQOV9Db21tb25fcyAqY29uc3QgY20gPSAmcGJpLT5jb21tb247CisJc3RydWN0IFJlZkNudEJ1ZmZlcl9zICpjb25zdCBmcmFtZV9idWZzID0gY20tPmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NrX2J1ZmZlcl9wb29sKGNtLT5idWZmZXJfcG9vbCwgZmxhZ3MpOworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19CVUZNR1JfTU9SRSkgeworCQlmb3IgKGkgPSAwOyBpIDwgcGJpLT51c2VkX2J1Zl9udW07ICsraSkgeworCQkJcHJfaW5mbygiJXM6JWQsIHJlZl9jb3VudCAlZCB2Zl9yZWYgJWQgaW5kZXggJWRcclxuIiwKKwkJCV9fZnVuY19fLCBpLCBmcmFtZV9idWZzW2ldLnJlZl9jb3VudCwKKwkJCWZyYW1lX2J1ZnNbaV0uYnVmLnZmX3JlZiwKKwkJCWZyYW1lX2J1ZnNbaV0uYnVmLmluZGV4KTsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgcGJpLT51c2VkX2J1Zl9udW07ICsraSkgeworCQlpZiAoKGZyYW1lX2J1ZnNbaV0ucmVmX2NvdW50ID09IDApICYmCisJCQkoZnJhbWVfYnVmc1tpXS5idWYudmZfcmVmID09IDApICYmCisJCQkoZnJhbWVfYnVmc1tpXS5idWYuaW5kZXggIT0gLTEpCisJCQkpCisJCQlicmVhazsKKwl9CisJaWYgKGkgIT0gcGJpLT51c2VkX2J1Zl9udW0pIHsKKwkJZnJhbWVfYnVmc1tpXS5yZWZfY291bnQgPSAxOworCQkvKnByX2luZm8oIltNTVUgREVCVUcgMV0gc2V0IHJlZl9jb3VudFslZF0gOiAlZFxyXG4iLAorCQkJCQlpLCBmcmFtZV9idWZzW2ldLnJlZl9jb3VudCk7Ki8KKwl9IGVsc2UgeworCQkvKiBSZXNldCBpIHRvIGJlIElOVkFMSURfSURYIHRvIGluZGljYXRlCisJCQlubyBmcmVlIGJ1ZmZlciBmb3VuZCovCisJCWkgPSBJTlZBTElEX0lEWDsKKwl9CisKKwl1bmxvY2tfYnVmZmVyX3Bvb2woY20tPmJ1ZmZlcl9wb29sLCBmbGFncyk7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9oaWRlX2ZyYW1lX3RpbWVzdGFtcChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJc3RydWN0IFJlZkNudEJ1ZmZlcl9zICpjb25zdCBmcmFtZV9idWZzID0KKwkJcGJpLT5jb21tb24uYnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnM7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGJpLT51c2VkX2J1Zl9udW07ICsraSkgeworCQlpZiAoKCFmcmFtZV9idWZzW2ldLnNob3dfZnJhbWUpICYmCisJCQkoIWZyYW1lX2J1ZnNbaV0uYnVmLnZmX3JlZikgJiYKKwkJCShmcmFtZV9idWZzW2ldLmJ1Zi5CVUZfaW5kZXggIT0gLTEpKSB7CisJCQlmcmFtZV9idWZzW2ldLmJ1Zi50aW1lc3RhbXAgPSBwYmktPmNodW5rLT50aW1lc3RhbXA7CisJCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfT1VUX1BUUywKKwkJCQkiJXMsIHVwZGF0ZSAlZCBoaWRlIGZyYW1lIHRzOiAlbGxkXG4iLAorCQkJCV9fZnVuY19fLCBpLCBmcmFtZV9idWZzW2ldLmJ1Zi50aW1lc3RhbXApOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGdldF9mcmVlX2ZiX2lkeChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJaW50IGk7CisJc3RydWN0IFZQOV9Db21tb25fcyAqY29uc3QgY20gPSAmcGJpLT5jb21tb247CisJc3RydWN0IFJlZkNudEJ1ZmZlcl9zICpjb25zdCBmcmFtZV9idWZzID0gY20tPmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzOworCisJZm9yIChpID0gMDsgaSA8IHBiaS0+dXNlZF9idWZfbnVtOyArK2kpIHsKKwkJaWYgKChmcmFtZV9idWZzW2ldLnJlZl9jb3VudCA9PSAwKSAmJgorCQkJKGZyYW1lX2J1ZnNbaV0uYnVmLnZmX3JlZiA9PSAwKSAmJgorCQkJKGZyYW1lX2J1ZnNbaV0uYnVmLnJlcGVhdF9jb3VudCA9PSAwKSAmJgorCQkJKGNtLT5jdXJfZnJhbWUgIT0gJmZyYW1lX2J1ZnNbaV0pKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgdjRsX2dldF9mcmVlX2ZiKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjb25zdCBjbSA9ICZwYmktPmNvbW1vbjsKKwlzdHJ1Y3QgUmVmQ250QnVmZmVyX3MgKmNvbnN0IGZyYW1lX2J1ZnMgPSBjbS0+YnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnM7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICogdjRsID0gcGJpLT52NGwyX2N0eDsKKwlzdHJ1Y3QgdjRsX2J1ZmZfcG9vbCAqcG9vbCA9ICZ2NGwtPmNhcF9wb29sOworCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpwaWMgPSBOVUxMOworCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpmcmVlX3BpYyA9IE5VTEw7CisJdWxvbmcgZmxhZ3M7CisJaW50IGlkeCwgaTsKKworCWxvY2tfYnVmZmVyX3Bvb2woY20tPmJ1ZmZlcl9wb29sLCBmbGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcG9vbC0+aW47ICsraSkgeworCQl1MzIgc3RhdGUgPSAocG9vbC0+c2VxW2ldID4+IDE2KTsKKwkJdTMyIGluZGV4ID0gKHBvb2wtPnNlcVtpXSAmIDB4ZmZmZik7CisKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIFY0TF9DQVBfQlVGRl9JTl9ERUM6CisJCQlwaWMgPSAmZnJhbWVfYnVmc1tpXS5idWY7CisJCQlpZiAoKGZyYW1lX2J1ZnNbaV0ucmVmX2NvdW50ID09IDApICYmCisJCQkJKHBpYy0+dmZfcmVmID09IDApICYmCisJCQkJKHBpYy0+cmVwZWF0X2NvdW50ID09IDApICYmCisJCQkJKHBpYy0+aW5kZXggIT0gLTEpICYmCisJCQkJcGljLT5jbWFfYWxsb2NfYWRkciAmJgorCQkJCShjbS0+Y3VyX2ZyYW1lICE9ICZmcmFtZV9idWZzW2ldKSkgeworCQkJCWZyZWVfcGljID0gcGljOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVjRMX0NBUF9CVUZGX0lOX00yTToKKwkJCWlkeCA9IGdldF9mcmVlX2ZiX2lkeChwYmkpOworCQkJcGljID0gJmZyYW1lX2J1ZnNbaWR4XS5idWY7CisJCQlwaWMtPnlfY3JvcF93aWR0aCA9IHBiaS0+ZnJhbWVfd2lkdGg7CisJCQlwaWMtPnlfY3JvcF9oZWlnaHQgPSBwYmktPmZyYW1lX2hlaWdodDsKKwkJCXBiaS0+YnVmZmVyX3dyYXBbaWR4XSA9IGluZGV4OworCQkJaWYgKCF2NGxfYWxsb2NfYW5kX2NvbmZpZ19waWMocGJpLCBwaWMpKSB7CisJCQkJc2V0X2NhbnZhcyhwYmksIHBpYyk7CisJCQkJaW5pdF9waWNfbGlzdF9odyhwYmkpOworCQkJCWZyZWVfcGljID0gcGljOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCWlmIChmcmVlX3BpYykgeworCQkJZnJhbWVfYnVmc1tpXS5yZWZfY291bnQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoZnJlZV9waWMgJiYgcGJpLT5jaHVuaykgeworCQlmcmVlX3BpYy0+dGltZXN0YW1wID0gcGJpLT5jaHVuay0+dGltZXN0YW1wOworCQl1cGRhdGVfaGlkZV9mcmFtZV90aW1lc3RhbXAocGJpKTsKKwl9CisKKwl1bmxvY2tfYnVmZmVyX3Bvb2woY20tPmJ1ZmZlcl9wb29sLCBmbGFncyk7CisKKwlpZiAoZnJlZV9waWMpIHsKKwkJc3RydWN0IHZkZWNfdjRsMl9idWZmZXIgKmZiID0KKwkJCShzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqKQorCQkJcGJpLT5tX0JVRltpXS52NGxfcmVmX2J1Zl9hZGRyOworCisJCWZiLT5zdGF0dXMgPSBGQl9TVF9ERUNPREVSOworCX0KKworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19PVVRfUFRTKSB7CisJCWlmIChmcmVlX3BpYykgeworCQkJcHJfZGVidWcoIiVzLCBpZHg6ICVkLCB0czogJWxsZFxuIiwKKwkJCQlfX2Z1bmNfXywgZnJlZV9waWMtPmluZGV4LCBmcmVlX3BpYy0+dGltZXN0YW1wKTsKKwkJfSBlbHNlIHsKKwkJCXByX2RlYnVnKCIlcywgdnA5IGdldCBmcmVlIHBpYyBudWxsXG4iLCBfX2Z1bmNfXyk7CisJCQlkdW1wX3BpY19saXN0KHBiaSk7CisJCX0KKwl9CisKKwlyZXR1cm4gZnJlZV9waWMgPyBmcmVlX3BpYy0+aW5kZXggOiBJTlZBTElEX0lEWDsKK30KKworc3RhdGljIGludCBnZXRfZnJlZV9idWZfY291bnQoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCXN0cnVjdCBWUDlfQ29tbW9uX3MgKmNvbnN0IGNtID0gJnBiaS0+Y29tbW9uOworCXN0cnVjdCBSZWZDbnRCdWZmZXJfcyAqY29uc3QgZnJhbWVfYnVmcyA9IGNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmczsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IChzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikocGJpLT52NGwyX2N0eCk7CisJaW50IGksIGZyZWVfYnVmX2NvdW50ID0gMDsKKworCWlmIChwYmktPmlzX3VzZWRfdjRsKSB7CisJCWZvciAoaSA9IDA7IGkgPCBwYmktPnVzZWRfYnVmX251bTsgKytpKSB7CisJCQlpZiAoKGZyYW1lX2J1ZnNbaV0ucmVmX2NvdW50ID09IDApICYmCisJCQkJKGZyYW1lX2J1ZnNbaV0uYnVmLnZmX3JlZiA9PSAwKSAmJgorCQkJCShmcmFtZV9idWZzW2ldLmJ1Zi5yZXBlYXRfY291bnQgPT0gMCkgJiYKKwkJCQlmcmFtZV9idWZzW2ldLmJ1Zi5jbWFfYWxsb2NfYWRkciAmJgorCQkJCShjbS0+Y3VyX2ZyYW1lICE9ICZmcmFtZV9idWZzW2ldKSkgeworCQkJCWZyZWVfYnVmX2NvdW50Kys7CisJCQl9CisJCX0KKworCQlpZiAoY3R4LT5jYXBfcG9vbC5kZWMgPCBwYmktPnVzZWRfYnVmX251bSkgeworCQkJaWYgKGN0eC0+ZmJfb3BzLnF1ZXJ5KCZjdHgtPmZiX29wcywgJnBiaS0+ZmJfdG9rZW4pKSB7CisJCQkJZnJlZV9idWZfY291bnQgKz0KKwkJCQkJdjRsMl9tMm1fbnVtX2RzdF9idWZzX3JlYWR5KGN0eC0+bTJtX2N0eCkgKyAxOworCQkJfQorCQl9CisKKwkJLyogdHJpZ2dlciB0byBwYXJzZSBoZWFkIGRhdGEuICovCisJCWlmICghcGJpLT52NGxfcGFyYW1zX3BhcnNlZCkgeworCQkJZnJlZV9idWZfY291bnQgPSBwYmktPnJ1bl9yZWFkeV9taW5fYnVmX251bTsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBwYmktPnVzZWRfYnVmX251bTsgKytpKSB7CisJCQlpZiAoKGZyYW1lX2J1ZnNbaV0ucmVmX2NvdW50ID09IDApICYmCisJCQkJKGZyYW1lX2J1ZnNbaV0uYnVmLnZmX3JlZiA9PSAwKSAmJgorCQkJCShmcmFtZV9idWZzW2ldLmJ1Zi5pbmRleCAhPSAtMSkpCisJCQkJZnJlZV9idWZfY291bnQrKzsKKwkJfQorCX0KKworCXJldHVybiBmcmVlX2J1Zl9jb3VudDsKK30KKworc3RhdGljIHZvaWQgZGVjcmVhc2VfcmVmX2NvdW50KGludCBpZHgsIHN0cnVjdCBSZWZDbnRCdWZmZXJfcyAqY29uc3QgZnJhbWVfYnVmcywKKwkJCQkJc3RydWN0IEJ1ZmZlclBvb2xfcyAqY29uc3QgcG9vbCkKK3sKKwlpZiAoaWR4ID49IDApIHsKKwkJLS1mcmFtZV9idWZzW2lkeF0ucmVmX2NvdW50OworCQkvKnByX2luZm8oIltNTVUgREVCVUcgN10gZGVjIHJlZl9jb3VudFslZF0gOiAlZFxyXG4iLCBpZHgsCisJCSAqCWZyYW1lX2J1ZnNbaWR4XS5yZWZfY291bnQpOworCQkgKi8KKwkJLypBIHdvcmtlciBtYXkgb25seSBnZXQgYSBmcmVlIGZyYW1lYnVmZmVyIGluZGV4IHdoZW4KKwkJICpjYWxsaW5nIGdldF9mcmVlX2ZiLiBCdXQgdGhlIHByaXZhdGUgYnVmZmVyIGlzIG5vdCBzZXQgdXAKKwkJICp1bnRpbCBmaW5pc2ggZGVjb2RpbmcgaGVhZGVyLiBTbyBhbnkgZXJyb3IgaGFwcGVucyBkdXJpbmcKKwkJICpkZWNvZGluZyBoZWFkZXIsIHRoZSBmcmFtZV9idWZzIHdpbGwgbm90IGhhdmUgdmFsaWQgcHJpdgorCQkgKmJ1ZmZlci4KKwkJICovCisKKwkJaWYgKGZyYW1lX2J1ZnNbaWR4XS5yZWZfY291bnQgPT0gMCAmJgorCQkJZnJhbWVfYnVmc1tpZHhdLnJhd19mcmFtZV9idWZmZXIucHJpdikKKwkJCXZwOV9yZWxlYXNlX2ZyYW1lX2J1ZmZlcgorCQkJKCZmcmFtZV9idWZzW2lkeF0ucmF3X2ZyYW1lX2J1ZmZlcik7CisJfQorfQorCitzdGF0aWMgdm9pZCBnZW5lcmF0ZV9uZXh0X3JlZl9mcmFtZXMoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCXN0cnVjdCBWUDlfQ29tbW9uX3MgKmNvbnN0IGNtID0gJnBiaS0+Y29tbW9uOworCXN0cnVjdCBSZWZDbnRCdWZmZXJfcyAqZnJhbWVfYnVmcyA9IGNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmczsKKwlzdHJ1Y3QgQnVmZmVyUG9vbF9zICpjb25zdCBwb29sID0gY20tPmJ1ZmZlcl9wb29sOworCWludCBtYXNrLCByZWZfaW5kZXggPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBHZW5lcmF0ZSBuZXh0X3JlZl9mcmFtZV9tYXAuKi8KKwlsb2NrX2J1ZmZlcl9wb29sKHBvb2wsIGZsYWdzKTsKKwlmb3IgKG1hc2sgPSBwYmktPnJlZnJlc2hfZnJhbWVfZmxhZ3M7IG1hc2s7IG1hc2sgPj49IDEpIHsKKwkJaWYgKG1hc2sgJiAxKSB7CisJCQljbS0+bmV4dF9yZWZfZnJhbWVfbWFwW3JlZl9pbmRleF0gPSBjbS0+bmV3X2ZiX2lkeDsKKwkJCSsrZnJhbWVfYnVmc1tjbS0+bmV3X2ZiX2lkeF0ucmVmX2NvdW50OworCQkJLypwcl9pbmZvKCJbTU1VIERFQlVHIDRdIGluYyByZWZfY291bnRbJWRdIDogJWRcclxuIiwKKwkJCSAqY20tPm5ld19mYl9pZHgsIGZyYW1lX2J1ZnNbY20tPm5ld19mYl9pZHhdLnJlZl9jb3VudCk7CisJCQkgKi8KKwkJfSBlbHNlCisJCQljbS0+bmV4dF9yZWZfZnJhbWVfbWFwW3JlZl9pbmRleF0gPQorCQkJCWNtLT5yZWZfZnJhbWVfbWFwW3JlZl9pbmRleF07CisJCS8qIEN1cnJlbnQgdGhyZWFkIGhvbGRzIHRoZSByZWZlcmVuY2UgZnJhbWUuKi8KKwkJaWYgKGNtLT5yZWZfZnJhbWVfbWFwW3JlZl9pbmRleF0gPj0gMCkgeworCQkJKytmcmFtZV9idWZzW2NtLT5yZWZfZnJhbWVfbWFwW3JlZl9pbmRleF1dLnJlZl9jb3VudDsKKwkJCS8qcHJfaW5mbworCQkJICooIltNTVUgREVCVUcgNV0gaW5jIHJlZl9jb3VudFslZF0gOiAlZFxyXG4iLAorCQkJICpjbS0+cmVmX2ZyYW1lX21hcFtyZWZfaW5kZXhdLAorCQkJICpmcmFtZV9idWZzW2NtLT5yZWZfZnJhbWVfbWFwW3JlZl9pbmRleF1dLnJlZl9jb3VudCk7CisJCQkgKi8KKwkJfQorCQkrK3JlZl9pbmRleDsKKwl9CisKKwlmb3IgKDsgcmVmX2luZGV4IDwgUkVGX0ZSQU1FUzsgKytyZWZfaW5kZXgpIHsKKwkJY20tPm5leHRfcmVmX2ZyYW1lX21hcFtyZWZfaW5kZXhdID0KKwkJCWNtLT5yZWZfZnJhbWVfbWFwW3JlZl9pbmRleF07CisJCS8qIEN1cnJlbnQgdGhyZWFkIGhvbGRzIHRoZSByZWZlcmVuY2UgZnJhbWUuKi8KKwkJaWYgKGNtLT5yZWZfZnJhbWVfbWFwW3JlZl9pbmRleF0gPj0gMCkgeworCQkJKytmcmFtZV9idWZzW2NtLT5yZWZfZnJhbWVfbWFwW3JlZl9pbmRleF1dLnJlZl9jb3VudDsKKwkJCS8qcHJfaW5mbygiW01NVSBERUJVRyA2XSBpbmMgcmVmX2NvdW50WyVkXSA6ICVkXHJcbiIsCisJCQkgKmNtLT5yZWZfZnJhbWVfbWFwW3JlZl9pbmRleF0sCisJCQkgKmZyYW1lX2J1ZnNbY20tPnJlZl9mcmFtZV9tYXBbcmVmX2luZGV4XV0ucmVmX2NvdW50KTsKKwkJCSAqLworCQl9CisJfQorCXVubG9ja19idWZmZXJfcG9vbChwb29sLCBmbGFncyk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCByZWZyZXNoX3JlZl9mcmFtZXMoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQorCit7CisJc3RydWN0IFZQOV9Db21tb25fcyAqY29uc3QgY20gPSAmcGJpLT5jb21tb247CisJc3RydWN0IEJ1ZmZlclBvb2xfcyAqcG9vbCA9IGNtLT5idWZmZXJfcG9vbDsKKwlzdHJ1Y3QgUmVmQ250QnVmZmVyX3MgKmZyYW1lX2J1ZnMgPSBjbS0+YnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnM7CisJaW50IG1hc2ssIHJlZl9pbmRleCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2tfYnVmZmVyX3Bvb2wocG9vbCwgZmxhZ3MpOworCWZvciAobWFzayA9IHBiaS0+cmVmcmVzaF9mcmFtZV9mbGFnczsgbWFzazsgbWFzayA+Pj0gMSkgeworCQljb25zdCBpbnQgb2xkX2lkeCA9IGNtLT5yZWZfZnJhbWVfbWFwW3JlZl9pbmRleF07CisJCS8qQ3VycmVudCB0aHJlYWQgcmVsZWFzZXMgdGhlIGhvbGRpbmcgb2YgcmVmZXJlbmNlIGZyYW1lLiovCisJCWRlY3JlYXNlX3JlZl9jb3VudChvbGRfaWR4LCBmcmFtZV9idWZzLCBwb29sKTsKKworCQkvKlJlbGVhc2UgdGhlIHJlZmVyZW5jZSBmcmFtZSBpbiByZWZlcmVuY2UgbWFwLiovCisJCWlmICgobWFzayAmIDEpICYmIG9sZF9pZHggPj0gMCkKKwkJCWRlY3JlYXNlX3JlZl9jb3VudChvbGRfaWR4LCBmcmFtZV9idWZzLCBwb29sKTsKKwkJY20tPnJlZl9mcmFtZV9tYXBbcmVmX2luZGV4XSA9CisJCQljbS0+bmV4dF9yZWZfZnJhbWVfbWFwW3JlZl9pbmRleF07CisJCSsrcmVmX2luZGV4OworCX0KKworCS8qQ3VycmVudCB0aHJlYWQgcmVsZWFzZXMgdGhlIGhvbGRpbmcgb2YgcmVmZXJlbmNlIGZyYW1lLiovCisJZm9yICg7IHJlZl9pbmRleCA8IFJFRl9GUkFNRVMgJiYgIWNtLT5zaG93X2V4aXN0aW5nX2ZyYW1lOworCQkrK3JlZl9pbmRleCkgeworCQljb25zdCBpbnQgb2xkX2lkeCA9IGNtLT5yZWZfZnJhbWVfbWFwW3JlZl9pbmRleF07CisKKwkJZGVjcmVhc2VfcmVmX2NvdW50KG9sZF9pZHgsIGZyYW1lX2J1ZnMsIHBvb2wpOworCQljbS0+cmVmX2ZyYW1lX21hcFtyZWZfaW5kZXhdID0KKwkJCWNtLT5uZXh0X3JlZl9mcmFtZV9tYXBbcmVmX2luZGV4XTsKKwl9CisJdW5sb2NrX2J1ZmZlcl9wb29sKHBvb2wsIGZsYWdzKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfYnVmZl9oYXNfc2hvdyhzdHJ1Y3QgUmVmQ250QnVmZmVyX3MgKmZyYW1lX2J1ZikKK3sKKwlpbnQgcmV0ID0gMTsKKworCWlmIChkaXNhYmxlX3JlcGVhdCB8fAorCQkoKGZyYW1lX2J1Zi0+YnVmLnZmX3JlZiA9PSAwKSAmJgorCQkoZnJhbWVfYnVmLT5idWYuaW5kZXggIT0gLTEpICYmCisJCWZyYW1lX2J1Zi0+YnVmLmNtYV9hbGxvY19hZGRyKSkgeworCQlyZXQgPSAwOworCQlpZiAoZGVidWcgJiBWUDlfREVCVUdfQlVGTUdSKQorCQkJcHJfaW5mbygiZXhpc3RpbmcgYnVmZiBjYW4gdXNlXG4iKTsKKwl9IGVsc2UgeworCQlpZiAoZGVidWcgJiBWUDlfREVCVUdfQlVGTUdSKQorCQkJcHJfaW5mbygiZXhpc3RpbmcgYnVmZiBjYW4ndCB1c2VcbiIpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgdnA5X2J1Zm1ncl9wcm9jZXNzKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwgdW5pb24gcGFyYW1fdSAqcGFyYW1zKQoreworCXN0cnVjdCBWUDlfQ29tbW9uX3MgKmNvbnN0IGNtID0gJnBiaS0+Y29tbW9uOworCXN0cnVjdCBCdWZmZXJQb29sX3MgKnBvb2wgPSBjbS0+YnVmZmVyX3Bvb2w7CisJc3RydWN0IFJlZkNudEJ1ZmZlcl9zICpmcmFtZV9idWZzID0gY20tPmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzOworCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpwaWMgPSBOVUxMOworCWludCBpOworCWludCByZXQ7CisKKwlwYmktPnJlYWR5X2Zvcl9uZXdfZGF0YSA9IDA7CisKKwlpZiAoKHBiaS0+aGFzX2tleWZyYW1lID09IDApICYmCisJCShwYXJhbXMtPnAuZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUpICYmCisJCSghcGFyYW1zLT5wLmludHJhX29ubHkpKXsKKwkJb25fbm9fa2V5ZnJhbWVfc2tpcGVkKys7CisJCXByX2luZm8oInZwOV9idWZtZ3JfcHJvY2VzcyBubyBrZXkgZnJhbWUgcmV0dXJuXG4iKTsKKwkJcmV0dXJuIC0yOworCX0KKwlwYmktPmhhc19rZXlmcmFtZSA9IDE7CisJb25fbm9fa2V5ZnJhbWVfc2tpcGVkID0gMDsKKyNpZiAwCisJaWYgKHBiaS0+bW11X2VuYWJsZSkgeworCQlpZiAoIXBiaS0+bV9pbnNfZmxhZykKKwkJCXBiaS0+dXNlZF80a19udW0gPSAoUkVBRF9WUkVHKEhFVkNfU0FPX01NVV9TVEFUVVMpID4+IDE2KTsKKwkJaWYgKGNtLT5wcmV2X2ZiX2lkeCA+PSAwKSB7CisJCQlkZWNvZGVyX21tdV9ib3hfZnJlZV9pZHhfdGFpbChwYmktPm1tdV9ib3gsCisJCQljbS0+cHJldl9mYl9pZHgsIHBiaS0+dXNlZF80a19udW0pOworCQl9CisJfQorI2VuZGlmCisJaWYgKGNtLT5uZXdfZmJfaWR4ID49IDAKKwkJJiYgZnJhbWVfYnVmc1tjbS0+bmV3X2ZiX2lkeF0ucmVmX2NvdW50ID09IDApeworCQl2cDlfcmVsZWFzZV9mcmFtZV9idWZmZXIKKwkJCSgmZnJhbWVfYnVmc1tjbS0+bmV3X2ZiX2lkeF0ucmF3X2ZyYW1lX2J1ZmZlcik7CisJfQorCS8qcHJfaW5mbygiQmVmb3JlIGdldF9mcmVlX2ZiLCBwcmV2X2ZiX2lkeCA6ICVkLCBuZXdfZmJfaWR4IDogJWRcclxuIiwKKwkJY20tPnByZXZfZmJfaWR4LCBjbS0+bmV3X2ZiX2lkeCk7Ki8KKyNpZm5kZWYgTVZfVVNFX0ZJWEVEX0JVRgorCXB1dF91bl91c2VkX212X2J1ZnMocGJpKTsKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfQlVGTUdSX0RFVEFJTCkKKwkJZHVtcF9waWNfbGlzdChwYmkpOworI2VuZGlmCisJY20tPm5ld19mYl9pZHggPSBwYmktPmlzX3VzZWRfdjRsID8KKwkJdjRsX2dldF9mcmVlX2ZiKHBiaSkgOgorCQlnZXRfZnJlZV9mYihwYmkpOworCWlmIChjbS0+bmV3X2ZiX2lkeCA9PSBJTlZBTElEX0lEWCkgeworCQlwcl9pbmZvKCJnZXRfZnJlZV9mYiBlcnJvclxyXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlmcmFtZV9idWZzW2NtLT5uZXdfZmJfaWR4XS5idWYudjRsX2J1Zl9pbmRleCA9IGNtLT5uZXdfZmJfaWR4OworI2lmbmRlZiBNVl9VU0VfRklYRURfQlVGCisjaWZkZWYgU1VQUE9SVF9GQl9ERUNPRElORworCWlmIChwYmktPnVzZWRfc3RhZ2VfYnVmX251bSA9PSAwKSB7CisjZW5kaWYKKwkJaWYgKGdldF9tdl9idWYocGJpLAorCQkJJnBvb2wtPmZyYW1lX2J1ZnNbY20tPm5ld19mYl9pZHhdLgorCQkJYnVmKSA8IDApIHsKKwkJCXByX2luZm8oImdldF9tdl9idWYgZmFpbFxyXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAoZGVidWcgJiBWUDlfREVCVUdfQlVGTUdSX0RFVEFJTCkKKwkJCWR1bXBfcGljX2xpc3QocGJpKTsKKyNpZmRlZiBTVVBQT1JUX0ZCX0RFQ09ESU5HCisJfQorI2VuZGlmCisjZW5kaWYKKwljbS0+Y3VyX2ZyYW1lID0gJnBvb2wtPmZyYW1lX2J1ZnNbY20tPm5ld19mYl9pZHhdOworCS8qaWYgKGRlYnVnICYgVlA5X0RFQlVHX0JVRk1HUikKKwkJcHJfaW5mbygiW1ZQOSBERUJVR10lcyhnZXRfZnJlZV9mYik6ICVkXHJcbiIsIF9fZnVuY19fLAorCQkJCWNtLT5uZXdfZmJfaWR4KTsqLworCisJcGJpLT5jdXJfYnVmID0gJmZyYW1lX2J1ZnNbY20tPm5ld19mYl9pZHhdOworCWlmIChwYmktPm1tdV9lbmFibGUpIHsKKwkJLyogbW92ZWQgdG8gYWZ0ZXIgcGljdHVyZSBzaXplIHJlYWR5CisJCSAqYWxsb2NfbW11KGNtLCBwYXJhbXMtPnAud2lkdGgsIHBhcmFtcy0+cC5oZWlnaHQsCisJCSAqcGFyYW1zLT5wLmJpdF9kZXB0aCwgcGJpLT5mcmFtZV9tbXVfbWFwX2FkZHIpOworCQkgKi8KKwkJY20tPnByZXZfZmJfaWR4ID0gY20tPm5ld19mYl9pZHg7CisJfQorCS8qcmVhZF91bmNvbXByZXNzZWRfaGVhZGVyKCkqLworCWNtLT5sYXN0X2ZyYW1lX3R5cGUgPSBjbS0+ZnJhbWVfdHlwZTsKKwljbS0+bGFzdF9pbnRyYV9vbmx5ID0gY20tPmludHJhX29ubHk7CisJY20tPnByb2ZpbGUgPSBwYXJhbXMtPnAucHJvZmlsZTsKKwlpZiAoY20tPnByb2ZpbGUgPj0gTUFYX1BST0ZJTEVTKSB7CisJCXByX2VycigiRXJyb3I6IFVuc3VwcG9ydGVkIHByb2ZpbGUgJWRcclxuIiwgY20tPnByb2ZpbGUpOworCQlyZXR1cm4gLTE7CisJfQorCWNtLT5zaG93X2V4aXN0aW5nX2ZyYW1lID0gcGFyYW1zLT5wLnNob3dfZXhpc3RpbmdfZnJhbWU7CisJaWYgKGNtLT5zaG93X2V4aXN0aW5nX2ZyYW1lKSB7CisJCS8qIFNob3cgYW4gZXhpc3RpbmcgZnJhbWUgZGlyZWN0bHkuKi8KKwkJaW50IGZyYW1lX3RvX3Nob3dfaWR4ID0gcGFyYW1zLT5wLmZyYW1lX3RvX3Nob3dfaWR4OworCQlpbnQgZnJhbWVfdG9fc2hvdzsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJaWYgKGZyYW1lX3RvX3Nob3dfaWR4ID49IFJFRl9GUkFNRVMpIHsKKwkJCXByX2luZm8oImZyYW1lX3RvX3Nob3dfaWR4ICVkIGV4Y2VlZCBtYXggaW5kZXhcclxuIiwKKwkJCQkJZnJhbWVfdG9fc2hvd19pZHgpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJZnJhbWVfdG9fc2hvdyA9IGNtLT5yZWZfZnJhbWVfbWFwW2ZyYW1lX3RvX3Nob3dfaWR4XTsKKwkJLypwcl9pbmZvKCJmcmFtZV90b19zaG93ICVkXHJcbiIsIGZyYW1lX3RvX3Nob3cpOyovCisJCWxvY2tfYnVmZmVyX3Bvb2wocG9vbCwgZmxhZ3MpOworCQlpZiAoZnJhbWVfdG9fc2hvdyA8IDAgfHwKKwkJCWZyYW1lX2J1ZnNbZnJhbWVfdG9fc2hvd10ucmVmX2NvdW50IDwgMSkgeworCQkJdW5sb2NrX2J1ZmZlcl9wb29sKHBvb2wsIGZsYWdzKTsKKwkJCXByX2VycgorCQkJKCJFcnJvcjpCdWZmZXIgJWQgZG9lcyBub3QgY29udGFpbiBhIGRlY29kZWQgZnJhbWUiLAorCQkJZnJhbWVfdG9fc2hvdyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAoY2hlY2tfYnVmZl9oYXNfc2hvdygmZnJhbWVfYnVmc1tmcmFtZV90b19zaG93XSkpIHsKKwkJCWZyYW1lX2J1ZnNbZnJhbWVfdG9fc2hvd10uYnVmLnJlcGVhdF9jb3VudCArKzsKKwkJCWZyYW1lX2J1ZnNbZnJhbWVfdG9fc2hvd10uYnVmLnY0bF9idWZfaW5kZXggPSBjbS0+bmV3X2ZiX2lkeDsKKwkJCWZyYW1lX2J1ZnNbY20tPm5ld19mYl9pZHhdLmJ1Zi5yZXBlYXRfcGljID0gJmZyYW1lX2J1ZnNbZnJhbWVfdG9fc2hvd10uYnVmOworCQl9CisJCWZyYW1lX2J1ZnNbZnJhbWVfdG9fc2hvd10uYnVmLnRpbWVzdGFtcCA9IGZyYW1lX2J1ZnNbY20tPm5ld19mYl9pZHhdLmJ1Zi50aW1lc3RhbXA7CisJCXJlZl9jbnRfZmIoZnJhbWVfYnVmcywgJmNtLT5uZXdfZmJfaWR4LCBmcmFtZV90b19zaG93KTsKKwkJdXBkYXRlX2hpZGVfZnJhbWVfdGltZXN0YW1wKHBiaSk7CisJCXVubG9ja19idWZmZXJfcG9vbChwb29sLCBmbGFncyk7CisJCXBiaS0+cmVmcmVzaF9mcmFtZV9mbGFncyA9IDA7CisJCS8qY20tPmxmLmZpbHRlcl9sZXZlbCA9IDA7Ki8KKwkJY20tPnNob3dfZnJhbWUgPSAxOworCQljbS0+Y3VyX2ZyYW1lLT5zaG93X2ZyYW1lID0gMTsKKworCQkvKgorCQkgKmlmIChwYmktPmZyYW1lX3BhcmFsbGVsX2RlY29kZSkgeworCQkgKglmb3IgKGkgPSAwOyBpIDwgUkVGX0ZSQU1FUzsgKytpKQorCQkgKgkJY20tPm5leHRfcmVmX2ZyYW1lX21hcFtpXSA9CisJCSAqCQljbS0+cmVmX2ZyYW1lX21hcFtpXTsKKwkJICp9CisJCSAqLworCQkvKiBkbyBub3QgZGVjb2RlLCBzZWFyY2ggbmV4dCBzdGFydCBjb2RlICovCisJCXJldHVybiAxOworCX0KKwljbS0+ZnJhbWVfdHlwZSA9IHBhcmFtcy0+cC5mcmFtZV90eXBlOworCWNtLT5zaG93X2ZyYW1lID0gcGFyYW1zLT5wLnNob3dfZnJhbWU7CisJY20tPmJpdF9kZXB0aCA9IHBhcmFtcy0+cC5iaXRfZGVwdGg7CisJY20tPmVycm9yX3Jlc2lsaWVudF9tb2RlID0gcGFyYW1zLT5wLmVycm9yX3Jlc2lsaWVudF9tb2RlOworCWNtLT5jdXJfZnJhbWUtPnNob3dfZnJhbWUgPSBjbS0+c2hvd19mcmFtZTsKKworCWlmIChjbS0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpIHsKKwkJcGJpLT5yZWZyZXNoX2ZyYW1lX2ZsYWdzID0gKDEgPDwgUkVGX0ZSQU1FUykgLSAxOworCisJCWZvciAoaSA9IDA7IGkgPCBSRUZTX1BFUl9GUkFNRTsgKytpKSB7CisJCQljbS0+ZnJhbWVfcmVmc1tpXS5pZHggPSBJTlZBTElEX0lEWDsKKwkJCWNtLT5mcmFtZV9yZWZzW2ldLmJ1ZiA9IE5VTEw7CisJCX0KKworCQlyZXQgPSBzZXR1cF9mcmFtZV9zaXplKHBiaSwKKwkJCWNtLCBwYXJhbXMsICBwYmktPmZyYW1lX21tdV9tYXBfYWRkciwKKwkJCQlwcmludF9oZWFkZXJfaW5mbyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gLTE7CisJCWlmIChwYmktPm5lZWRfcmVzeW5jKSB7CisJCQltZW1zZXQoJmNtLT5yZWZfZnJhbWVfbWFwLCAtMSwKKwkJCQlzaXplb2YoY20tPnJlZl9mcmFtZV9tYXApKTsKKwkJCXBiaS0+bmVlZF9yZXN5bmMgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJY20tPmludHJhX29ubHkgPSBjbS0+c2hvd19mcmFtZSA/IDAgOiBwYXJhbXMtPnAuaW50cmFfb25seTsKKwkJLyppZiAocHJpbnRfaGVhZGVyX2luZm8pIHsKKwkJICoJaWYgKGNtLT5zaG93X2ZyYW1lKQorCQkgKgkJcHJfaW5mbworCQkgKgkJKCJpbnRyYV9vbmx5IHNldCB0byAwIGJlY2F1c2Ugb2Ygc2hvd19mcmFtZVxuIik7CisJCSAqCWVsc2UKKwkJICoJCXByX2luZm8KKwkJICoJCSgiMS1iaXQgaW50cmFfb25seSByZWFkOiAlZFxuIiwgY20tPmludHJhX29ubHkpOworCQkgKn0KKwkJICovCisKKworCQljbS0+cmVzZXRfZnJhbWVfY29udGV4dCA9IGNtLT5lcnJvcl9yZXNpbGllbnRfbW9kZSA/CisJCQkwIDogcGFyYW1zLT5wLnJlc2V0X2ZyYW1lX2NvbnRleHQ7CisJCWlmIChwcmludF9oZWFkZXJfaW5mbykgeworCQkJaWYgKGNtLT5lcnJvcl9yZXNpbGllbnRfbW9kZSkKKwkJCQlwcl9pbmZvCisJCQkJKCJyZXNldCB0byAwIGVycm9yX3Jlc2lsaWVudF9tb2RlXG4iKTsKKwkJZWxzZQorCQkJcHJfaW5mbworCQkJCSgiICogMi1iaXRzIHJlc2V0X2ZyYW1lX2NvbnRleHQgcmVhZCA6ICVkXG4iLAorCQkJCWNtLT5yZXNldF9mcmFtZV9jb250ZXh0KTsKKwkJfQorCisJCWlmIChjbS0+aW50cmFfb25seSkgeworCQkJaWYgKGNtLT5wcm9maWxlID4gUFJPRklMRV8wKSB7CisJCQkJLypyZWFkX2JpdGRlcHRoX2NvbG9yc3BhY2Vfc2FtcGxpbmcoY20sCisJCQkJICoJcmIsIHByaW50X2hlYWRlcl9pbmZvKTsKKwkJCQkgKi8KKwkJCX0gZWxzZSB7CisJCQkJLypOT1RFOiBUaGUgaW50cmEtb25seSBmcmFtZSBoZWFkZXIKKwkJCQkgKmRvZXMgbm90IGluY2x1ZGUgdGhlIHNwZWNpZmljYXRpb24KKwkJCQkgKm9mIGVpdGhlciB0aGUgY29sb3IgZm9ybWF0IG9yCisJCQkJICpjb2xvciBzdWItc2FtcGxpbmcKKwkJCQkgKmluIHByb2ZpbGUgMC4gVlA5IHNwZWNpZmllcyB0aGF0IHRoZSBkZWZhdWx0CisJCQkJICpjb2xvciBmb3JtYXQgc2hvdWxkIGJlIFlVViA0OjI6MCBpbiB0aGlzCisJCQkJICpjYXNlIChub3JtYXRpdmUpLgorCQkJCSAqLworCQkJCWNtLT5jb2xvcl9zcGFjZSA9IFZQWF9DU19CVF82MDE7CisJCQkJY20tPnN1YnNhbXBsaW5nX3kgPSBjbS0+c3Vic2FtcGxpbmdfeCA9IDE7CisJCQkJY20tPmJpdF9kZXB0aCA9IFZQWF9CSVRTXzg7CisJCQkJY20tPnVzZV9oaWdoYml0ZGVwdGggPSAwOworCQkJfQorCisJCQlwYmktPnJlZnJlc2hfZnJhbWVfZmxhZ3MgPQorCQkJCXBhcmFtcy0+cC5yZWZyZXNoX2ZyYW1lX2ZsYWdzOworCQkJLyppZiAocHJpbnRfaGVhZGVyX2luZm8pCisJCQkgKglwcl9pbmZvKCIqJWQtYml0cyByZWZyZXNoX2ZyYW1lIHJlYWQ6MHgleFxuIiwKKwkJCSAqCVJFRl9GUkFNRVMsIHBiaS0+cmVmcmVzaF9mcmFtZV9mbGFncyk7CisJCQkgKi8KKwkJCXJldCA9IHNldHVwX2ZyYW1lX3NpemUocGJpLAorCQkJCWNtLAorCQkJCXBhcmFtcywKKwkJCQlwYmktPmZyYW1lX21tdV9tYXBfYWRkciwKKwkJCQlwcmludF9oZWFkZXJfaW5mbyk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiAtMTsKKwkJCWlmIChwYmktPm5lZWRfcmVzeW5jKSB7CisJCQkJbWVtc2V0KCZjbS0+cmVmX2ZyYW1lX21hcCwgLTEsCisJCQkJCXNpemVvZihjbS0+cmVmX2ZyYW1lX21hcCkpOworCQkJCXBiaS0+bmVlZF9yZXN5bmMgPSAwOworCQkJfQorCQl9IGVsc2UgaWYgKHBiaS0+bmVlZF9yZXN5bmMgIT0gMSkgeyAgLyogU2tpcCBpZiBuZWVkIHJlc3luYyAqLworCQkJcGJpLT5yZWZyZXNoX2ZyYW1lX2ZsYWdzID0KKwkJCQkJcGFyYW1zLT5wLnJlZnJlc2hfZnJhbWVfZmxhZ3M7CisJCQlpZiAocHJpbnRfaGVhZGVyX2luZm8pCisJCQkJcHJfaW5mbworCQkJCSgiKiVkLWJpdHMgcmVmcmVzaF9mcmFtZSByZWFkOjB4JXhcbiIsCisJCQkJUkVGX0ZSQU1FUywgcGJpLT5yZWZyZXNoX2ZyYW1lX2ZsYWdzKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBSRUZTX1BFUl9GUkFNRTsgKytpKSB7CisJCQkJY29uc3QgaW50IHJlZiA9CisJCQkJCShwYXJhbXMtPnAucmVmX2luZm8gPj4KKwkJCQkJKCgoUkVGU19QRVJfRlJBTUUtaS0xKSo0KSsxKSkKKwkJCQkJJiAweDc7CisJCQkJY29uc3QgaW50IGlkeCA9CisJCQkJCWNtLT5yZWZfZnJhbWVfbWFwW3JlZl07CisJCQkJc3RydWN0IFJlZkJ1ZmZlcl9zICogY29uc3QgcmVmX2ZyYW1lID0KKwkJCQkJJmNtLT5mcmFtZV9yZWZzW2ldOworCQkJCWlmIChwcmludF9oZWFkZXJfaW5mbykKKwkJCQkJcHJfaW5mbygiKiVkLWJpdHMgcmVmWyVkXXJlYWQ6JWRcbiIsCisJCQkJCQlSRUZfRlJBTUVTX0xPRzIsIGksIHJlZik7CisJCQkJcmVmX2ZyYW1lLT5pZHggPSBpZHg7CisJCQkJcmVmX2ZyYW1lLT5idWYgPSAmZnJhbWVfYnVmc1tpZHhdLmJ1ZjsKKwkJCQljbS0+cmVmX2ZyYW1lX3NpZ25fYmlhc1tMQVNUX0ZSQU1FICsgaV0KKwkJCQk9IChwYXJhbXMtPnAucmVmX2luZm8gPj4KKwkJCQkoKFJFRlNfUEVSX0ZSQU1FLWktMSkqNCkpICYgMHgxOworCQkJCWlmIChwcmludF9oZWFkZXJfaW5mbykKKwkJCQkJcHJfaW5mbygiMWJpdCByZWZfZnJhbWVfc2lnbl9iaWFzIik7CisJCQkJLypwcl9pbmZvCisJCQkJICooIiVkcmVhZDogJWRcbiIsCisJCQkJICpMQVNUX0ZSQU1FK2ksCisJCQkJICpjbS0+cmVmX2ZyYW1lX3NpZ25fYmlhcworCQkJCSAqW0xBU1RfRlJBTUUgKyBpXSk7CisJCQkJICovCisJCQkJLypwcl9pbmZvCisJCQkJICooIltWUDkgREVCVUddJXMoZ2V0IHJlZik6JWRcclxuIiwKKwkJCQkgKl9fZnVuY19fLCByZWZfZnJhbWUtPmlkeCk7CisJCQkJICovCisKKwkJCX0KKworCQkJcmV0ID0gc2V0dXBfZnJhbWVfc2l6ZV93aXRoX3JlZnMoCisJCQkJcGJpLAorCQkJCWNtLAorCQkJCXBhcmFtcywKKwkJCQlwYmktPmZyYW1lX21tdV9tYXBfYWRkciwKKwkJCQlwcmludF9oZWFkZXJfaW5mbyk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiAtMTsKKwkJCWZvciAoaSA9IDA7IGkgPCBSRUZTX1BFUl9GUkFNRTsgKytpKSB7CisJCQkJLypzdHJ1Y3QgUmVmQnVmZmVyX3MgKmNvbnN0IHJlZl9idWYgPQorCQkJCSAqJmNtLT5mcmFtZV9yZWZzW2ldOworCQkJCSAqLworCQkJCS8qIHRvIGRvOgorCQkJCSAqdnA5X3NldHVwX3NjYWxlX2ZhY3RvcnNfZm9yX2ZyYW1lCisJCQkJICovCisJCQl9CisJCX0KKwl9CisKKwlwaWMgPSBnZXRfZnJhbWVfbmV3X2J1ZmZlcihjbSk7CisJaWYgKCFwaWMpCisJCXJldHVybiAtMTsKKworCXBpYy0+Yml0X2RlcHRoID0gY20tPmJpdF9kZXB0aDsKKwlwaWMtPmNvbG9yX3NwYWNlID0gY20tPmNvbG9yX3NwYWNlOworCXBpYy0+c2xpY2VfdHlwZSA9IGNtLT5mcmFtZV90eXBlOworCisJaWYgKHBiaS0+bmVlZF9yZXN5bmMpIHsKKwkJcHJfZXJyCisJCSgiRXJyb3I6IEtleWZyYW1lL2ludHJhLW9ubHkgZnJhbWUgcmVxdWlyZWQgdG8gcmVzZXRcclxuIik7CisJCXJldHVybiAtMTsKKwl9CisJZ2VuZXJhdGVfbmV4dF9yZWZfZnJhbWVzKHBiaSk7CisJcGJpLT5ob2xkX3JlZl9idWYgPSAxOworCisjaWYgMAorCWlmIChmcmFtZV9pc19pbnRyYV9vbmx5KGNtKSB8fCBjbS0+ZXJyb3JfcmVzaWxpZW50X21vZGUpCisJCXZwOV9zZXR1cF9wYXN0X2luZGVwZW5kZW5jZShjbSk7CisJc2V0dXBfbG9vcGZpbHRlcigmY20tPmxmLCByYiwgcHJpbnRfaGVhZGVyX2luZm8pOworCXNldHVwX3F1YW50aXphdGlvbihjbSwgJnBiaS0+bWIsIHJiLCBwcmludF9oZWFkZXJfaW5mbyk7CisJc2V0dXBfc2VnbWVudGF0aW9uKCZjbS0+c2VnLCByYiwgcHJpbnRfaGVhZGVyX2luZm8pOworCXNldHVwX3NlZ21lbnRhdGlvbl9kZXF1YW50KGNtLCBwcmludF9oZWFkZXJfaW5mbyk7CisKKwlzZXR1cF90aWxlX2luZm8oY20sIHJiLCBwcmludF9oZWFkZXJfaW5mbyk7CisJc3ogPSB2cDlfcmJfcmVhZF9saXRlcmFsKHJiLCAxNik7CisJaWYgKHByaW50X2hlYWRlcl9pbmZvKQorCQlwcl9pbmZvKCIgKiAxNi1iaXRzIHNpemUgcmVhZCA6ICVkICgweCV4KVxuIiwgc3osIHN6KTsKKworCWlmIChzeiA9PSAwKQorCQl2cHhfaW50ZXJuYWxfZXJyb3IoJmNtLT5lcnJvciwgVlBYX0NPREVDX0NPUlJVUFRfRlJBTUUsCisJCSJJbnZhbGlkIGhlYWRlciBzaXplIik7CisjZW5kaWYKKwkvKmVuZCByZWFkX3VuY29tcHJlc3NlZF9oZWFkZXIoKSovCisJY20tPnVzZV9wcmV2X2ZyYW1lX212cyA9ICFjbS0+ZXJyb3JfcmVzaWxpZW50X21vZGUgJiYKKwkJCWNtLT53aWR0aCA9PSBjbS0+bGFzdF93aWR0aCAmJgorCQkJY20tPmhlaWdodCA9PSBjbS0+bGFzdF9oZWlnaHQgJiYKKwkJCSFjbS0+bGFzdF9pbnRyYV9vbmx5ICYmCisJCQljbS0+bGFzdF9zaG93X2ZyYW1lICYmCisJCQkoY20tPmxhc3RfZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUpOworCisJLypwcl9pbmZvCisJICooInNldCB1c2VfcHJldl9mcmFtZV9tdnMgdG8gJWQgKGxhc3Rfd2lkdGggJWQgbGFzdF9oZWlnaHQgJWQiLAorCSAqY20tPnVzZV9wcmV2X2ZyYW1lX212cywgY20tPmxhc3Rfd2lkdGgsIGNtLT5sYXN0X2hlaWdodCk7CisJICpwcl9pbmZvCisJICooIiBsYXN0X2ludHJhX29ubHkgJWQgbGFzdF9zaG93X2ZyYW1lICVkIGxhc3RfZnJhbWVfdHlwZSAlZClcbiIsCisJICpjbS0+bGFzdF9pbnRyYV9vbmx5LCBjbS0+bGFzdF9zaG93X2ZyYW1lLCBjbS0+bGFzdF9mcmFtZV90eXBlKTsKKwkgKi8KKworCWlmIChwYmktPmVuYWJsZV9mZW5jZSAmJiBjbS0+c2hvd19mcmFtZSkgeworCQlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljID0gJmNtLT5jdXJfZnJhbWUtPmJ1ZjsKKwkJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMocGJpKTsKKworCQkvKiBjcmVhdGUgZmVuY2UgZm9yIGVhY2ggYnVmZmVycy4gKi8KKwkJcmV0ID0gdmRlY190aW1lbGluZV9jcmVhdGVfZmVuY2UodmRlYy0+c3luYyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlwaWMtPmZlbmNlCQk9IHZkZWMtPnN5bmMtPmZlbmNlOworCQlwaWMtPmJpdF9kZXB0aAkJPSBjbS0+Yml0X2RlcHRoOworCQlwaWMtPnNsaWNlX3R5cGUJCT0gY20tPmZyYW1lX3R5cGU7CisJCXBpYy0+c3RyZWFtX29mZnNldAk9IHBiaS0+cHJlX3N0cmVhbV9vZmZzZXQ7CisKKwkJaWYgKHBiaS0+Y2h1bmspIHsKKwkJCXBpYy0+cHRzCT0gcGJpLT5jaHVuay0+cHRzOworCQkJcGljLT5wdHM2NAk9IHBiaS0+Y2h1bmstPnB0czY0OworCQkJcGljLT50aW1lc3RhbXAJPSBwYmktPmNodW5rLT50aW1lc3RhbXA7CisJCX0KKworCQkvKiBwb3N0IHZpZGVvIHZmcmFtZS4gKi8KKwkJcHJlcGFyZV9kaXNwbGF5X2J1ZihwYmksIHBpYyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBzd2FwX2ZyYW1lX2J1ZmZlcnMoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCWludCByZWZfaW5kZXggPSAwOworCXN0cnVjdCBWUDlfQ29tbW9uX3MgKmNvbnN0IGNtID0gJnBiaS0+Y29tbW9uOworCXN0cnVjdCBCdWZmZXJQb29sX3MgKmNvbnN0IHBvb2wgPSBjbS0+YnVmZmVyX3Bvb2w7CisJc3RydWN0IFJlZkNudEJ1ZmZlcl9zICpjb25zdCBmcmFtZV9idWZzID0gY20tPmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJcmVmcmVzaF9yZWZfZnJhbWVzKHBiaSk7CisJcGJpLT5ob2xkX3JlZl9idWYgPSAwOworCWNtLT5mcmFtZV90b19zaG93ID0gZ2V0X2ZyYW1lX25ld19idWZmZXIoY20pOworCisJaWYgKGNtLT5mcmFtZV90b19zaG93KSB7CisJCS8qaWYgKCFwYmktPmZyYW1lX3BhcmFsbGVsX2RlY29kZSB8fCAhY20tPnNob3dfZnJhbWUpIHsqLworCQlsb2NrX2J1ZmZlcl9wb29sKHBvb2wsIGZsYWdzKTsKKwkJLS1mcmFtZV9idWZzW2NtLT5uZXdfZmJfaWR4XS5yZWZfY291bnQ7CisJCS8qcHJfaW5mbygiW01NVSBERUJVRyA4XSBkZWMgcmVmX2NvdW50WyVkXSA6ICVkXHJcbiIsIGNtLT5uZXdfZmJfaWR4LAorCQkgKglmcmFtZV9idWZzW2NtLT5uZXdfZmJfaWR4XS5yZWZfY291bnQpOworCQkgKi8KKwkJdW5sb2NrX2J1ZmZlcl9wb29sKHBvb2wsIGZsYWdzKTsKKwkJLyp9Ki8KKwl9CisKKwkvKkludmFsaWRhdGUgdGhlc2UgcmVmZXJlbmNlcyB1bnRpbCB0aGUgbmV4dCBmcmFtZSBzdGFydHMuKi8KKwlmb3IgKHJlZl9pbmRleCA9IDA7IHJlZl9pbmRleCA8IDM7IHJlZl9pbmRleCsrKQorCQljbS0+ZnJhbWVfcmVmc1tyZWZfaW5kZXhdLmlkeCA9IC0xOworfQorCisjaWYgMAorc3RhdGljIHZvaWQgY2hlY2tfcmVzeW5jKHZweF9jb2RlY19hbGdfcHJpdl90ICpjb25zdCBjdHgsCisJCQkJY29uc3Qgc3RydWN0IFZQOURlY29kZXJfcyAqY29uc3QgcGJpKQoreworCS8qIENsZWFyIHJlc3luYyBmbGFnIGlmIHdvcmtlciBnb3QgYSBrZXkgZnJhbWUgb3IgaW50cmEgb25seSBmcmFtZS4qLworCWlmIChjdHgtPm5lZWRfcmVzeW5jID09IDEgJiYgcGJpLT5uZWVkX3Jlc3luYyA9PSAwICYmCisJCShwYmktPmNvbW1vbi5pbnRyYV9vbmx5IHx8IHBiaS0+Y29tbW9uLmZyYW1lX3R5cGUgPT0gS0VZX0ZSQU1FKSkKKwkJY3R4LT5uZWVkX3Jlc3luYyA9IDA7Cit9CisjZW5kaWYKKworaW50IHZwOV9nZXRfcmF3X2ZyYW1lKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwgc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnNkKQoreworCXN0cnVjdCBWUDlfQ29tbW9uX3MgKmNvbnN0IGNtID0gJnBiaS0+Y29tbW9uOworCWludCByZXQgPSAtMTsKKworCWlmIChwYmktPnJlYWR5X2Zvcl9uZXdfZGF0YSA9PSAxKQorCQlyZXR1cm4gcmV0OworCisJcGJpLT5yZWFkeV9mb3JfbmV3X2RhdGEgPSAxOworCisJLyogbm8gcmF3IGZyYW1lIHRvIHNob3chISEgKi8KKwlpZiAoIWNtLT5zaG93X2ZyYW1lKQorCQlyZXR1cm4gcmV0OworCisJLyogbWF5IG5vdCBiZSBnZXQgYnVmZiBpbiB2NGwyICovCisJaWYgKCFjbS0+ZnJhbWVfdG9fc2hvdykKKwkJcmV0dXJuIHJldDsKKworCXBiaS0+cmVhZHlfZm9yX25ld19kYXRhID0gMTsKKworCSpzZCA9ICpjbS0+ZnJhbWVfdG9fc2hvdzsKKwlyZXQgPSAwOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHZwOV9idWZtZ3JfaW5pdChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksIHN0cnVjdCBCdWZmSW5mb19zICpidWZfc3BlY19pLAorCQlzdHJ1Y3QgYnVmZl9zICptY19idWZfaSkgeworCXN0cnVjdCBWUDlfQ29tbW9uX3MgKmNtID0gJnBiaS0+Y29tbW9uOworCisJLyptZW1zZXQocGJpLCAwLCBzaXplb2Yoc3RydWN0IFZQOURlY29kZXJfcykpOyovCisJcGJpLT5mcmFtZV9jb3VudCA9IDA7CisJcGJpLT5waWNfY291bnQgPSAwOworCXBiaS0+cHJlX3N0cmVhbV9vZmZzZXQgPSAwOworCWNtLT5idWZmZXJfcG9vbCA9ICZwYmktPnZwOV9idWZmZXJfcG9vbDsKKwlzcGluX2xvY2tfaW5pdCgmY20tPmJ1ZmZlcl9wb29sLT5sb2NrKTsKKwljbS0+cHJldl9mYl9pZHggPSBJTlZBTElEX0lEWDsKKwljbS0+bmV3X2ZiX2lkeCA9IElOVkFMSURfSURYOworCXBiaS0+dXNlZF80a19udW0gPSAtMTsKKwljbS0+Y3VyX2ZiX2lkeF9tbXUgPSBJTlZBTElEX0lEWDsKKwlwcl9kZWJ1ZworCSgiQWZ0ZXIgdnA5X2J1Zm1ncl9pbml0LCBwcmV2X2ZiX2lkeCA6ICVkLCBuZXdfZmJfaWR4IDogJWRcclxuIiwKKwkJY20tPnByZXZfZmJfaWR4LCBjbS0+bmV3X2ZiX2lkeCk7CisJcGJpLT5uZWVkX3Jlc3luYyA9IDE7CisJLyogSW5pdGlhbGl6ZSB0aGUgcmVmZXJlbmNlcyB0byBub3QgcG9pbnQgdG8gYW55IGZyYW1lIGJ1ZmZlcnMuKi8KKwltZW1zZXQoJmNtLT5yZWZfZnJhbWVfbWFwLCAtMSwgc2l6ZW9mKGNtLT5yZWZfZnJhbWVfbWFwKSk7CisJbWVtc2V0KCZjbS0+bmV4dF9yZWZfZnJhbWVfbWFwLCAtMSwgc2l6ZW9mKGNtLT5uZXh0X3JlZl9mcmFtZV9tYXApKTsKKwljbS0+Y3VycmVudF92aWRlb19mcmFtZSA9IDA7CisJcGJpLT5yZWFkeV9mb3JfbmV3X2RhdGEgPSAxOworCisJLyogcHJpdmF0ZSBpbml0ICovCisJcGJpLT53b3JrX3NwYWNlX2J1ZiA9IGJ1Zl9zcGVjX2k7CisJaWYgKCFwYmktPm1tdV9lbmFibGUpCisJCXBiaS0+bWNfYnVmID0gbWNfYnVmX2k7CisKKwlwYmktPnJwbV9hZGRyID0gTlVMTDsKKwlwYmktPmxtZW1fYWRkciA9IE5VTEw7CisKKwlwYmktPnVzZV9jbWFfZmxhZyA9IDA7CisJcGJpLT5kZWNvZGVfaWR4ID0gMDsKKwlwYmktPnNsaWNlX2lkeCA9IDA7CisJLyppbnQgbV91aU1heENVV2lkdGggPSAxPDw3OyovCisJLyppbnQgbV91aU1heENVSGVpZ2h0ID0gMTw8NzsqLworCXBiaS0+aGFzX2tleWZyYW1lID0gMDsKKwlwYmktPnNraXBfZmxhZyA9IDA7CisJcGJpLT53YWl0X2J1ZiA9IDA7CisJcGJpLT5lcnJvcl9mbGFnID0gMDsKKworCXBiaS0+cHRzX21vZGUgPSBQVFNfTk9STUFMOworCXBiaS0+bGFzdF9wdHMgPSAwOworCXBiaS0+bGFzdF9sb29rdXBfcHRzID0gMDsKKwlwYmktPmxhc3RfcHRzX3VzNjQgPSAwOworCXBiaS0+bGFzdF9sb29rdXBfcHRzX3VzNjQgPSAwOworCXBiaS0+c2hpZnRfYnl0ZV9jb3VudCA9IDA7CisJcGJpLT5zaGlmdF9ieXRlX2NvdW50X2xvID0gMDsKKwlwYmktPnNoaWZ0X2J5dGVfY291bnRfaGkgPSAwOworCXBiaS0+cHRzX21vZGVfc3dpdGNoaW5nX2NvdW50ID0gMDsKKwlwYmktPnB0c19tb2RlX3JlY292ZXJ5X2NvdW50ID0gMDsKKworCXBiaS0+YnVmX251bSA9IDA7CisJcGJpLT5waWNfbnVtID0gMDsKKworCXJldHVybiAwOworfQorCitpbnQgdnA5X2J1Zm1ncl9wb3N0cHJvYyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMocGJpKTsKKwlzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjbSA9ICZwYmktPmNvbW1vbjsKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyBzZDsKKworCWlmIChwYmktPnBvc3Rwcm9jX2RvbmUpCisJCXJldHVybiAwOworCXBiaS0+cG9zdHByb2NfZG9uZSA9IDE7CisJc3dhcF9mcmFtZV9idWZmZXJzKHBiaSk7CisJaWYgKCFjbS0+c2hvd19leGlzdGluZ19mcmFtZSkgeworCQljbS0+bGFzdF9zaG93X2ZyYW1lID0gY20tPnNob3dfZnJhbWU7CisJCWNtLT5wcmV2X2ZyYW1lID0gY20tPmN1cl9mcmFtZTsKKyNpZiAwCisJaWYgKGNtLT5zZWcuZW5hYmxlZCAmJiAhcGJpLT5mcmFtZV9wYXJhbGxlbF9kZWNvZGUpCisJCXZwOV9zd2FwX2N1cnJlbnRfYW5kX2xhc3Rfc2VnX21hcChjbSk7CisjZW5kaWYKKwl9CisJY20tPmxhc3Rfd2lkdGggPSBjbS0+d2lkdGg7CisJY20tPmxhc3RfaGVpZ2h0ID0gY20tPmhlaWdodDsKKwkvL3BiaS0+bGFzdF93aWR0aCA9IGNtLT53aWR0aDsKKwkvL3BiaS0+bGFzdF9oZWlnaHQgPSBjbS0+aGVpZ2h0OworCisJaWYgKGNtLT5zaG93X2ZyYW1lKQorCQljbS0+Y3VycmVudF92aWRlb19mcmFtZSsrOworCisJaWYgKHZwOV9nZXRfcmF3X2ZyYW1lKHBiaSwgJnNkKSA9PSAwKSB7CisJCS8qcHJfaW5mbygiRGlzcGxheSBmcmFtZSBpbmRleCAlZFxyXG4iLCBzZC5pbmRleCk7Ki8KKwkJc2Quc3RyZWFtX29mZnNldCA9IHBiaS0+cHJlX3N0cmVhbV9vZmZzZXQ7CisKKwkJaWYgKHBiaS0+ZW5hYmxlX2ZlbmNlKSB7CisJCQlpbnQgaSwgaiwgdXNlZF9zaXplLCByZXQ7CisJCQlpbnQgc2lnbmVkX2NvdW50ID0gMDsKKwkJCXN0cnVjdCB2ZnJhbWVfcyAqc2lnbmVkX2ZlbmNlW1ZGX1BPT0xfU0laRV07CisJCQkvKiBub3RpZnkgc2lnbmFsIHRvIHdha2UgdXAgd3Egb2YgZmVuY2UuICovCisJCQl2ZGVjX3RpbWVsaW5lX2luY3JlYXNlKHZkZWMtPnN5bmMsIDEpOworCQkJbXV0ZXhfbG9jaygmcGJpLT5mZW5jZV9tdXRleCk7CisJCQl1c2VkX3NpemUgPSBwYmktPmZlbmNlX3ZmX3MudXNlZF9zaXplOworCQkJaWYgKHVzZWRfc2l6ZSkgeworCQkJCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgVkZfUE9PTF9TSVpFICYmIGogPCB1c2VkX3NpemU7IGkrKykgeworCQkJCQlpZiAocGJpLT5mZW5jZV92Zl9zLmZlbmNlX3ZmW2ldICE9IE5VTEwpIHsKKwkJCQkJCXJldCA9IGRtYV9mZW5jZV9nZXRfc3RhdHVzKHBiaS0+ZmVuY2VfdmZfcy5mZW5jZV92ZltpXS0+ZmVuY2UpOworCQkJCQkJaWYgKHJldCA9PSAxKSB7CisJCQkJCQkJc2lnbmVkX2ZlbmNlW3NpZ25lZF9jb3VudF0gPSBwYmktPmZlbmNlX3ZmX3MuZmVuY2VfdmZbaV07CisJCQkJCQkJcGJpLT5mZW5jZV92Zl9zLmZlbmNlX3ZmW2ldID0gTlVMTDsKKwkJCQkJCQlwYmktPmZlbmNlX3ZmX3MudXNlZF9zaXplLS07CisJCQkJCQkJc2lnbmVkX2NvdW50Kys7CisJCQkJCQl9CisJCQkJCQlqKys7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQltdXRleF91bmxvY2soJnBiaS0+ZmVuY2VfbXV0ZXgpOworCQkJaWYgKHNpZ25lZF9jb3VudCAhPSAwKSB7CisJCQkJZm9yIChpID0gMDsgaSA8IHNpZ25lZF9jb3VudDsgaSsrKQorCQkJCQl2dnA5X3ZmX3B1dChzaWduZWRfZmVuY2VbaV0sIHZkZWMpOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJlcGFyZV9kaXNwbGF5X2J1ZihwYmksICZzZCk7CisJCX0KKworCQlwYmktPnByZV9zdHJlYW1fb2Zmc2V0ID0gUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCk7CisJfQorCisvKiBlbHNlCisgKgkJcHJfaW5mbworICoJCSgiTm90IGRpc3BsYXkgdGhpcyBmcmFtZSxyZWFkeV9mb3JfbmV3X2RhdGElZCBzaG93X2ZyYW1lJWRcclxuIiwKKyAqCQlwYmktPnJlYWR5X2Zvcl9uZXdfZGF0YSwgY20tPnNob3dfZnJhbWUpOworICovCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqVlA5IGJ1ZmZlciBtYW5hZ2VtZW50IGVuZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisKKyNkZWZpbmUgSEVWQ19DTV9CT0RZX1NUQVJUX0FERFIgICAgICAgICAgICAgICAgICAgIDB4MzYyNgorI2RlZmluZSBIRVZDX0NNX0JPRFlfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgMHgzNjI3CisjZGVmaW5lIEhFVkNfQ01fSEVBREVSX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgICAweDM2MjkKKyNkZWZpbmUgSEVWQ19DTV9IRUFERVJfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgIDB4MzYyYgorCisjZGVmaW5lIExPU0xFU1NfQ09NUFJFU1NfTU9ERQorCisvKiNkZWZpbmUgREVDT01QX0hFQURSX1NVUkdFTlQqLworI2lmZGVmIFZQOV8xMEJfTlYyMQorc3RhdGljIHUzMiBtZW1fbWFwX21vZGUgPSAyICAvKiAwOmxpbmVhciAxOjMyeDMyIDI6NjR4MzIqLworI2Vsc2UKK3N0YXRpYyB1MzIgbWVtX21hcF9tb2RlOyAvKiAwOmxpbmVhciAxOjMyeDMyIDI6NjR4MzIgOyBtOGJhYnkgdGVzdDE5MDIgKi8KKyNlbmRpZgorc3RhdGljIHUzMiBlbmFibGVfbWVtX3NhdmluZyA9IDE7CitzdGF0aWMgdTMyIGZvcmNlX3dfaDsKKworc3RhdGljIHUzMiBmb3JjZV9mcHM7CisKKworY29uc3QgdTMyIHZwOV92ZXJzaW9uID0gMjAxNjAyMTAxOworc3RhdGljIHUzMiBkZWJ1ZzsKK3N0YXRpYyB1MzIgcmFkcjsKK3N0YXRpYyB1MzIgcnZhbDsKK3N0YXRpYyB1MzIgcG9wX3Nob3J0czsKK3N0YXRpYyB1MzIgZGJnX2NtZDsKK3N0YXRpYyB1MzIgZGJnX3NraXBfZGVjb2RlX2luZGV4OworCisvKgorICogYml0IDB+MywgZm9yIEhFVkNEX0lQUF9BWElJRl9DT05GSUcgZW5kaWFuIGNvbmZpZworICogYml0IDh+MjMsIGZvciBIRVZDX1NBT19DVFJMMSBlbmRpYW4gY29uZmlnCisgKi8KK3N0YXRpYyB1MzIgZW5kaWFuOworI2RlZmluZSBIRVZDX0NPTkZJR19CSUdfRU5ESUFOICAgICAoKDB4ODgwIDw8IDgpIHwgMHg4KQorI2RlZmluZSBIRVZDX0NPTkZJR19MSVRUTEVfRU5ESUFOICAoKDB4ZmYwIDw8IDgpIHwgMHhmKQorCisjaWZkZWYgRVJST1JfSEFORExFX0RFQlVHCitzdGF0aWMgdTMyIGRiZ19uYWxfc2tpcF9mbGFnOworCQkvKiBiaXRbMF0sIHNraXAgdnBzOyBiaXRbMV0sIHNraXAgc3BzOyBiaXRbMl0sIHNraXAgcHBzICovCitzdGF0aWMgdTMyIGRiZ19uYWxfc2tpcF9jb3VudDsKKyNlbmRpZgorLypmb3IgZGVidWcqLworc3RhdGljIHUzMiBkZWNvZGVfcGljX2JlZ2luOworc3RhdGljIHVpbnQgc2xpY2VfcGFyc2VfYmVnaW47CitzdGF0aWMgdTMyIHN0ZXA7CisjaWZkZWYgTUlYX1NUUkVBTV9TVVBQT1JUCitzdGF0aWMgdTMyIGJ1Zl9hbGxvY193aWR0aCA9IDQwOTY7CitzdGF0aWMgdTMyIGJ1Zl9hbGxvY19oZWlnaHQgPSAyMzA0Oworc3RhdGljIHUzMiB2cDlfbWF4X3BpY193ID0gNDA5NjsKK3N0YXRpYyB1MzIgdnA5X21heF9waWNfaCA9IDIzMDQ7CisKK3N0YXRpYyB1MzIgZHluYW1pY19idWZfbnVtX21hcmdpbjsKKyNlbHNlCitzdGF0aWMgdTMyIGJ1Zl9hbGxvY193aWR0aDsKK3N0YXRpYyB1MzIgYnVmX2FsbG9jX2hlaWdodDsKK3N0YXRpYyB1MzIgZHluYW1pY19idWZfbnVtX21hcmdpbiA9IDc7CisjZW5kaWYKK3N0YXRpYyB1MzIgYnVmX2FsbG9jX2RlcHRoID0gMTA7CitzdGF0aWMgdTMyIGJ1Zl9hbGxvY19zaXplOworLyoKKyAqYml0WzBdOiAwLAorICogICAgYml0WzFdOiAwLCBhbHdheXMgcmVsZWFzZSBjbWEgYnVmZmVyIHdoZW4gc3RvcAorICogICAgYml0WzFdOiAxLCBuZXZlciByZWxlYXNlIGNtYSBidWZmZXIgd2hlbiBzdG9wCisgKmJpdFswXTogMSwgd2hlbiBzdG9wLCByZWxlYXNlIGNtYSBidWZmZXIgaWYgYmxhY2tvdXQgaXMgMTsKKyAqZG8gbm90IHJlbGVhc2UgY21hIGJ1ZmZlciBpcyBibGFja291dCBpcyBub3QgMQorICoKKyAqYml0WzJdOiAwLCB3aGVuIHN0YXJ0IGRlY29kaW5nLCBjaGVjayBjdXJyZW50IGRpc3BsYXllZCBidWZmZXIKKyAqCSAob25seSBmb3IgYnVmZmVyIGRlY29kZWQgYnkgdnA5KSBpZiBibGFja291dCBpcyAwCisgKgkgMSwgZG8gbm90IGNoZWNrIGN1cnJlbnQgZGlzcGxheWVkIGJ1ZmZlcgorICoKKyAqYml0WzNdOiAxLCBpZiBibGFja291dCBpcyBub3QgMSwgZG8gbm90IHJlbGVhc2UgY3VycmVudAorICoJCQlkaXNwbGF5ZWQgY21hIGJ1ZmZlciBhbHdheXMuCisgKi8KKy8qIHNldCB0byAxIGZvciBmYXN0IHBsYXk7CisgKglzZXQgdG8gOCBmb3Igb3RoZXIgY2FzZSBvZiAia2VlcCBsYXN0IGZyYW1lIgorICovCitzdGF0aWMgdTMyIGJ1ZmZlcl9tb2RlID0gMTsKKy8qIGJ1ZmZlcl9tb2RlX2RiZzogZGVidWcgb25seSovCitzdGF0aWMgdTMyIGJ1ZmZlcl9tb2RlX2RiZyA9IDB4ZmZmZjAwMDA7CisvKiovCisKKy8qCisgKmJpdCAwLCAxOiBvbmx5IGRpc3BsYXkgSSBwaWN0dXJlOworICpiaXQgMSwgMTogb25seSBkZWNvZGUgSSBwaWN0dXJlOworICovCitzdGF0aWMgdTMyIGlfb25seV9mbGFnOworCitzdGF0aWMgdTMyIGxvd19sYXRlbmN5X2ZsYWc7CisKK3N0YXRpYyB1MzIgbm9faGVhZDsKKworc3RhdGljIHUzMiBtYXhfZGVjb2RpbmdfdGltZTsKKy8qCisgKmVycm9yIGhhbmRsaW5nCisgKi8KKy8qZXJyb3JfaGFuZGxlX3BvbGljeToKKyAqYml0IDA6IDAsIGF1dG8gc2tpcCBlcnJvcl9za2lwX25hbF9jb3VudCBuYWxzIGJlZm9yZSBlcnJvciByZWNvdmVyeTsKKyAqMSwgc2tpcCBlcnJvcl9za2lwX25hbF9jb3VudCBuYWxzIGJlZm9yZSBlcnJvciByZWNvdmVyeTsKKyAqYml0IDEgKHZhbGlkIG9ubHkgd2hlbiBiaXQwID09IDEpOgorICoxLCB3YWl0IHZwcy9zcHMvcHBzIGFmdGVyIGVycm9yIHJlY292ZXJ5OworICpiaXQgMiAodmFsaWQgb25seSB3aGVuIGJpdDAgPT0gMCk6CisgKjAsIGF1dG8gc2VhcmNoIGFmdGVyIGVycm9yIHJlY292ZXJ5ICh2cDlfcmVjb3ZlcigpIGNhbGxlZCk7CisgKjEsIG1hbnVhbCBzZWFyY2ggYWZ0ZXIgZXJyb3IgcmVjb3ZlcnkKKyAqKGNoYW5nZSB0byBhdXRvIHNlYXJjaCBhZnRlciBnZXQgSURSOiBXUklURV9WUkVHKE5BTF9TRUFSQ0hfQ1RMLCAweDIpKQorICoKKyAqYml0IDQ6IDAsIHNldCBlcnJvcl9tYXJrIGFmdGVyIHJlc2V0L3JlY292ZXIKKyAqICAgIDEsIGRvIG5vdCBzZXQgZXJyb3JfbWFyayBhZnRlciByZXNldC9yZWNvdmVyCisgKmJpdCA1OiAwLCBjaGVjayB0b3RhbCBsY3UgZm9yIGV2ZXJ5IHBpY3R1cmUKKyAqICAgIDEsIGRvIG5vdCBjaGVjayB0b3RhbCBsY3UKKyAqCisgKi8KKworc3RhdGljIHUzMiBlcnJvcl9oYW5kbGVfcG9saWN5OworLypzdGF0aWMgdTMyIHBhcnNlcl9zZWlfZW5hYmxlID0gMTsqLworI2RlZmluZSBNQVhfQlVGX05VTV9OT1JNQUwgICAgIDE1CisjZGVmaW5lIE1BWF9CVUZfTlVNX0xFU1MgICAxMAorc3RhdGljIHUzMiBtYXhfYnVmX251bSA9IE1BWF9CVUZfTlVNX05PUk1BTDsKKyNkZWZpbmUgTUFYX0JVRl9OVU1fU0FWRV9CVUYgIDgKKworc3RhdGljIHUzMiBydW5fcmVhZHlfbWluX2J1Zl9udW0gPSAyOworCitzdGF0aWMgREVGSU5FX01VVEVYKHZ2cDlfbXV0ZXgpOworI2lmbmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCitzdGF0aWMgc3RydWN0IGRldmljZSAqY21hX2RldjsKKyNlbmRpZgorCisjZGVmaW5lIEhFVkNfREVDX1NUQVRVU19SRUcgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF8wCisjZGVmaW5lIEhFVkNfUlBNX0JVRkZFUiAgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF8xCisjZGVmaW5lIEhFVkNfU0hPUlRfVEVSTV9SUFMgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF8yCisjZGVmaW5lIFZQOV9BREFQVF9QUk9CX1JFRyAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF8zCisjZGVmaW5lIFZQOV9NTVVfTUFQX0JVRkZFUiAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF80CisjZGVmaW5lIEhFVkNfUFBTX0JVRkZFUiAgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF81CisvLyNkZWZpbmUgSEVWQ19TQU9fVVAgICAgICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzYKKyNkZWZpbmUgSEVWQ19TVFJFQU1fU1dBUF9CVUZGRVIgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzcKKyNkZWZpbmUgSEVWQ19TVFJFQU1fU1dBUF9CVUZGRVIyICBIRVZDX0FTU0lTVF9TQ1JBVENIXzgKKyNkZWZpbmUgVlA5X1BST0JfU1dBUF9CVUZGRVIgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIXzkKKyNkZWZpbmUgVlA5X0NPVU5UX1NXQVBfQlVGRkVSICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0EKKyNkZWZpbmUgVlA5X1NFR19NQVBfQlVGRkVSICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0IKKy8vI2RlZmluZSBIRVZDX1NDQUxFTFVUICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfRAorI2RlZmluZSBIRVZDX1dBSVRfRkxBRyAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfRQorI2RlZmluZSBSUE1fQ01EX1JFRyAgICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfRgorI2RlZmluZSBMTUVNX0RVTVBfQURSICAgICAgICAgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0YKKyNkZWZpbmUgSEVWQ19TVFJFQU1fU1dBUF9URVNUICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0wKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisjZGVmaW5lIEhFVkNfREVDT0RFX0NPVU5UICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfTQorI2RlZmluZSBIRVZDX0RFQ09ERV9TSVpFCQlIRVZDX0FTU0lTVF9TQ1JBVENIX04KKyNlbHNlCisjZGVmaW5lIEhFVkNfREVDT0RFX1BJQ19CRUdJTl9SRUcgSEVWQ19BU1NJU1RfU0NSQVRDSF9NCisjZGVmaW5lIEhFVkNfREVDT0RFX1BJQ19OVU1fUkVHICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9OCisjZW5kaWYKKyNkZWZpbmUgREVCVUdfUkVHMSAgICAgICAgICAgICAgSEVWQ19BU1NJU1RfU0NSQVRDSF9HCisjZGVmaW5lIERFQlVHX1JFRzIgICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfSAorCisKKy8qCisgKnVjb2RlIHBhcnNlci9zZWFyY2ggY29udHJvbAorICpiaXQgMDogIDAsIGhlYWRlciBhdXRvIHBhcnNlOyAxLCBoZWFkZXIgbWFudWFsIHBhcnNlCisgKmJpdCAxOiAgMCwgYXV0byBza2lwIGZvciBub25lc2VhbWxlc3Mgc3RyZWFtOyAxLCBubyBza2lwCisgKmJpdCBbMzoyXTogdmFsaWQgd2hlbiBiaXQxPT0wOworICowLCBhdXRvIHNraXAgbmFsIGJlZm9yZSBmaXJzdCB2cHMvc3BzL3Bwcy9pZHI7CisgKjEsIGF1dG8gc2tpcCBuYWwgYmVmb3JlIGZpcnN0IHZwcy9zcHMvcHBzCisgKjIsIGF1dG8gc2tpcCBuYWwgYmVmb3JlIGZpcnN0ICB2cHMvc3BzL3BwcywKKyAqCWFuZCBub3QgZGVjb2RlIHVudGlsIHRoZSBmaXJzdCBJIHNsaWNlICh3aXRoIHNsaWNlIGFkZHJlc3Mgb2YgMCkKKyAqCisgKjMsIGF1dG8gc2tpcCBiZWZvcmUgZmlyc3QgSSBzbGljZSAobmFsX3R5cGUgPj0xNiAmJiBuYWxfdHlwZTw9MjEpCisgKmJpdCBbMTU6NF0gbmFsIHNraXAgY291bnQgKHZhbGlkIHdoZW4gYml0MCA9PSAxIChtYW51YWwgbW9kZSkgKQorICpiaXQgWzE2XTogZm9yIE5BTF9VTklUX0VPUyB3aGVuIGJpdDAgaXMgMDoKKyAqCTAsIHNlbmQgU0VBUkNIX0RPTkUgdG8gYXJtIDsgIDEsIGRvIG5vdCBzZW5kIFNFQVJDSF9ET05FIHRvIGFybQorICpiaXQgWzE3XTogZm9yIE5BTF9TRUkgd2hlbiBiaXQwIGlzIDA6CisgKgkwLCBkbyBub3QgcGFyc2UgU0VJIGluIHVjb2RlOyAxLCBwYXJzZSBTRUkgaW4gdWNvZGUKKyAqYml0IFszMToyMF06IHVzZWQgYnkgdWNvZGUgZm9yIGRlYnVnIHB1cnBvc2UKKyAqLworI2RlZmluZSBOQUxfU0VBUkNIX0NUTCAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfSQorCS8qWzMxOjI0XSBjaGlwIGZlYXR1cmUKKwkJMzE6IDAsIHVzZSBNQk9YMTsgMSwgdXNlIE1CT1gwCisJKi8KKyNkZWZpbmUgREVDT0RFX01PREUgICAgICAgICAgICAgIEhFVkNfQVNTSVNUX1NDUkFUQ0hfSgorI2RlZmluZSBERUNPREVfU1RPUF9QT1MgICAgICAgICBIRVZDX0FTU0lTVF9TQ1JBVENIX0sKKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKyNkZWZpbmUgUlBNX0JVRl9TSVpFICgweDQwMCAqIDIpCisjZWxzZQorI2RlZmluZSBSUE1fQlVGX1NJWkUgKDB4ODAqMikKKyNlbmRpZgorI2RlZmluZSBMTUVNX0JVRl9TSVpFICgweDQwMCAqIDIpCisKKy8vI2RlZmluZSBWQkhfQlVGX1NJWkUgKDIgKiAxNiAqIDIzMDQpCisvLyNkZWZpbmUgVkJIX0JVRl9DT1VOVCA0CisKKwkvKm1tdV92YmggYnVmIGlzIHVzZWQgYnkgSEVWQ19TQU9fTU1VX1ZIMF9BRERSLCBIRVZDX1NBT19NTVVfVkgxX0FERFIqLworI2RlZmluZSBWQkhfQlVGX1NJWkVfMTA4MFAgMHgzMDAwCisjZGVmaW5lIFZCSF9CVUZfU0laRV80SyAweDUwMDAKKyNkZWZpbmUgVkJIX0JVRl9TSVpFXzhLIDB4YTAwMAorI2RlZmluZSBWQkhfQlVGX1NJWkUoYnVmc3BlYykgKGJ1ZnNwZWMtPm1tdV92YmguYnVmX3NpemUgLyAyKQorCS8qbW11X3ZiaF9kdyBidWYgaXMgdXNlZCBieSBIRVZDX1NBT19NTVVfVkgwX0FERFIyLEhFVkNfU0FPX01NVV9WSDFfQUREUjIsCisJCUhFVkNfRFdfVkgwX0FERERSLCBIRVZDX0RXX1ZIMV9BREREUiovCisjZGVmaW5lIERXX1ZCSF9CVUZfU0laRV8xMDgwUCAoVkJIX0JVRl9TSVpFXzEwODBQICogMikKKyNkZWZpbmUgRFdfVkJIX0JVRl9TSVpFXzRLIChWQkhfQlVGX1NJWkVfNEsgKiAyKQorI2RlZmluZSBEV19WQkhfQlVGX1NJWkVfOEsgKFZCSF9CVUZfU0laRV84SyAqIDIpCisjZGVmaW5lIERXX1ZCSF9CVUZfU0laRShidWZzcGVjKSAoYnVmc3BlYy0+bW11X3ZiaF9kdy5idWZfc2l6ZSAvIDQpCisKKy8qIG5lY2Vzc2FyeSA0SyBwYWdlIHNpemUgYWxpZ24gZm9yIHQ3L3QzIGRlY29kZXIgYW5kIGFmdGVyICovCisjZGVmaW5lIFdPUktCVUZfQUxJR04oYWRkcikgKEFMSUdOKGFkZHIsIFBBR0VfU0laRSkpCisKKyNkZWZpbmUgV09SS19CVUZfU1BFQ19OVU0gNgorc3RhdGljIHN0cnVjdCBCdWZmSW5mb19zIGFtdnZwOV93b3JrYnVmZl9zcGVjW1dPUktfQlVGX1NQRUNfTlVNXSA9IHsKKwl7CisJCS8qIDhNIGJ5dGVzICovCisJCS5tYXhfd2lkdGggPSAxOTIwLAorCQkubWF4X2hlaWdodCA9IDEwODgsCisJCS5pcHAgPSB7CisJCQkvKiBJUFAgd29yayBzcGFjZSBjYWxjdWxhdGlvbiA6CisJCQkgKiAgIDQwOTYgKiAoWStDYkNyK0ZsYWdzKSA9IDEyaywgcm91bmQgdG8gMTZrCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4NDAwMCwKKwkJfSwKKwkJLnNhb19hYnYgPSB7CisJCQkuYnVmX3NpemUgPSAweDMwMDAwLAorCQl9LAorCQkuc2FvX3ZiID0geworCQkJLmJ1Zl9zaXplID0gMHgzMDAwMCwKKwkJfSwKKwkJLnNob3J0X3Rlcm1fcnBzID0geworCQkJLyogU0hPUlRfVEVSTV9SUFMgLSBNYXggNjQgc2V0LCAxNiBlbnRyeSBldmVyeSBzZXQsCisJCQkgKiAgIHRvdGFsIDY0eDE2eDIgPSAyMDQ4IGJ5dGVzICgweDgwMCkKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS52cHMgPSB7CisJCQkvKiBWUFMgU1RPUkUgQVJFQSAtIE1heCAxNiBWUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsCisJCQkgKiAgIHRvdGFsIDB4MDgwMCBieXRlcworCQkJICovCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNwcyA9IHsKKwkJCS8qIFNQUyBTVE9SRSBBUkVBIC0gTWF4IDE2IFNQUywgZWFjaCBoYXMgMHg4MCBieXRlcywKKwkJCSAqICAgdG90YWwgMHgwODAwIGJ5dGVzCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkucHBzID0geworCQkJLyogUFBTIFNUT1JFIEFSRUEgLSBNYXggNjQgUFBTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLAorCQkJICogICB0b3RhbCAweDIwMDAgYnl0ZXMKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHgyMDAwLAorCQl9LAorCQkuc2FvX3VwID0geworCQkJLyogU0FPIFVQIFNUT1JFIEFSRUEgLSBNYXggNjQwKDEwMjQwLzE2KSBMQ1UsCisJCQkgKiAgIGVhY2ggaGFzIDE2IGJ5dGVzIHRvdGFsIDB4MjgwMCBieXRlcworCQkJICovCisJCQkuYnVmX3NpemUgPSAweDI4MDAsCisJCX0sCisJCS5zd2FwX2J1ZiA9IHsKKwkJCS8qIDI1NmN5Y2xleDY0Yml0ID0gMksgYnl0ZXMgMHg4MDAKKwkJCSAqICAgKG9ubHkgMTQ0IGN5Y2xlcyB2YWxpZCkKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zd2FwX2J1ZjIgPSB7CisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNjYWxlbHV0ID0geworCQkJLyogc3VwcG9ydCB1cCB0byAzMiBTQ0FMRUxVVCAxMDI0eDMyID0KKwkJCSAqICAgMzJLYnl0ZXMgKDB4ODAwMCkKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAwLAorCQl9LAorCQkuZGJsa19wYXJhID0geworCQkJLyogREJMSyAtPiBNYXggMjU2KDQwOTYvMTYpIExDVSwKKwkJCSAqZWFjaCBwYXJhIDEwMjRieXRlcyh0b3RhbDoweDQwMDAwKSwKKwkJCSAqZGF0YSAxMDI0Ynl0ZXModG90YWw6MHg0MDAwMCkKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAwMCwKKwkJfSwKKwkJLmRibGtfZGF0YSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4ODAwMDAsCisJCX0sCisJCS5zZWdfbWFwID0geworCQkvKjQwOTZ4MjMwNC82NC82NCAqMjQgPSAweGQ4MDAgQnl0ZXMqLworCQkJLmJ1Zl9zaXplID0gMHhkODAwLAorCQl9LAorCQkubW11X3ZiaCA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4NTAwMCwgLyoyKjE2Kihtb3JlIHRoYW4gMjMwNCkvNCwgNEsqLworCQl9LAorI2lmIDAKKwkJLmNtX2hlYWRlciA9IHsKKwkJCS8qYWRkIG9uZSBmb3Iga2VlcGVyLiovCisJCQkuYnVmX3NpemUgPSBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkUgKgorCQkJCQkJKEZSQU1FX0JVRkZFUlMgKyAxKSwKKwkJCS8qIDB4NDQwMDAgPSAoKDEwODgqMioxMDI0KjQpLzMyLzQpKigzMi84KSAqLworCQl9LAorI2VuZGlmCisJCS5tcHJlZF9hYm92ZSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MTAwMDAsIC8qIDIgKiBzaXplIG9mIGhldmMqLworCQl9LAorI2lmZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwkJLm1wcmVkX212ID0gey8qIDEwODBwLCAweDQwMDAwIHBlciBidWZmZXIgKi8KKwkJCS5idWZfc2l6ZSA9IDB4NDAwMDAgKiBGUkFNRV9CVUZGRVJTLAorCQl9LAorI2VuZGlmCisJCS5ycG0gPSB7CisJCQkuYnVmX3NpemUgPSBSUE1fQlVGX1NJWkUsCisJCX0sCisJCS5sbWVtID0geworCQkJLmJ1Zl9zaXplID0gMHg0MDAgKiAyLAorCQl9CisJfSwKKwl7CisJCS5tYXhfd2lkdGggPSA0MDk2LAorCQkubWF4X2hlaWdodCA9IDIzMDQsCisJCS5pcHAgPSB7CisJCQkvKiBJUFAgd29yayBzcGFjZSBjYWxjdWxhdGlvbiA6CisJCQkgKiAgIDQwOTYgKiAoWStDYkNyK0ZsYWdzKSA9IDEyaywgcm91bmQgdG8gMTZrCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4NDAwMCwKKwkJfSwKKwkJLnNhb19hYnYgPSB7CisJCQkuYnVmX3NpemUgPSAweDMwMDAwLAorCQl9LAorCQkuc2FvX3ZiID0geworCQkJLmJ1Zl9zaXplID0gMHgzMDAwMCwKKwkJfSwKKwkJLnNob3J0X3Rlcm1fcnBzID0geworCQkJLyogU0hPUlRfVEVSTV9SUFMgLSBNYXggNjQgc2V0LCAxNiBlbnRyeSBldmVyeSBzZXQsCisJCQkgKiAgIHRvdGFsIDY0eDE2eDIgPSAyMDQ4IGJ5dGVzICgweDgwMCkKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS52cHMgPSB7CisJCQkvKiBWUFMgU1RPUkUgQVJFQSAtIE1heCAxNiBWUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsCisJCQkgKiAgIHRvdGFsIDB4MDgwMCBieXRlcworCQkJICovCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNwcyA9IHsKKwkJCS8qIFNQUyBTVE9SRSBBUkVBIC0gTWF4IDE2IFNQUywgZWFjaCBoYXMgMHg4MCBieXRlcywKKwkJCSAqICAgdG90YWwgMHgwODAwIGJ5dGVzCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkucHBzID0geworCQkJLyogUFBTIFNUT1JFIEFSRUEgLSBNYXggNjQgUFBTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLAorCQkJICogICB0b3RhbCAweDIwMDAgYnl0ZXMKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHgyMDAwLAorCQl9LAorCQkuc2FvX3VwID0geworCQkJLyogU0FPIFVQIFNUT1JFIEFSRUEgLSBNYXggNjQwKDEwMjQwLzE2KSBMQ1UsCisJCQkgKiAgIGVhY2ggaGFzIDE2IGJ5dGVzIHRvdGFsIDB4MjgwMCBieXRlcworCQkJICovCisJCQkuYnVmX3NpemUgPSAweDI4MDAsCisJCX0sCisJCS5zd2FwX2J1ZiA9IHsKKwkJCS8qIDI1NmN5Y2xleDY0Yml0ID0gMksgYnl0ZXMgMHg4MDAKKwkJCSAqICAgKG9ubHkgMTQ0IGN5Y2xlcyB2YWxpZCkKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zd2FwX2J1ZjIgPSB7CisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNjYWxlbHV0ID0geworCQkJLyogc3VwcG9ydCB1cCB0byAzMiBTQ0FMRUxVVCAxMDI0eDMyID0gMzJLYnl0ZXMKKwkJCSAqICAgKDB4ODAwMCkKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAwLAorCQl9LAorCQkuZGJsa19wYXJhID0geworCQkJLyogREJMSyAtPiBNYXggMjU2KDQwOTYvMTYpIExDVSwKKwkJCSAqZWFjaCBwYXJhIDEwMjRieXRlcyh0b3RhbDoweDQwMDAwKSwKKwkJCSAqZGF0YSAxMDI0Ynl0ZXModG90YWw6MHg0MDAwMCkKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAwMCwKKwkJfSwKKwkJLmRibGtfZGF0YSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4ODAwMDAsCisJCX0sCisJCS5zZWdfbWFwID0geworCQkJLyo0MDk2eDIzMDQvNjQvNjQgKjI0ID0gMHhkODAwIEJ5dGVzKi8KKwkJCS5idWZfc2l6ZSA9IDB4ZDgwMCwKKwkJfSwKKwkJLm1tdV92YmggPSB7CisJCQkuYnVmX3NpemUgPSAweDUwMDAsLyoyKjE2Kihtb3JlIHRoYW4gMjMwNCkvNCwgNEsqLworCQl9LAorI2lmIDAKKwkJLmNtX2hlYWRlciA9IHsKKwkJCS8qYWRkIG9uZSBmb3Iga2VlcGVyLiovCisJCQkuYnVmX3NpemUgPSBNTVVfQ09NUFJFU1NfSEVBREVSX1NJWkUgKgorCQkJCQkJKEZSQU1FX0JVRkZFUlMgKyAxKSwKKwkJCS8qIDB4NDQwMDAgPSAoKDEwODgqMioxMDI0KjQpLzMyLzQpKigzMi84KSAqLworCQl9LAorI2VuZGlmCisJCS5tcHJlZF9hYm92ZSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MTAwMDAsIC8qIDIgKiBzaXplIG9mIGhldmMqLworCQl9LAorI2lmZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwkJLm1wcmVkX212ID0geworCQkJLyogLmJ1Zl9zaXplID0gMHgxMDAwMDAqMTYsCisJCQkgKiAvLzRrMmsgLCAweDEwMDAwMCBwZXIgYnVmZmVyCisJCQkgKi8KKwkJCS8qIDQwOTZ4MjMwNCAsIDB4MTIwMDAwIHBlciBidWZmZXIgKi8KKwkJCS5idWZfc2l6ZSA9IDB4MTIwMDAwICogRlJBTUVfQlVGRkVSUywKKwkJfSwKKyNlbmRpZgorCQkucnBtID0geworCQkJLmJ1Zl9zaXplID0gUlBNX0JVRl9TSVpFLAorCQl9LAorCQkubG1lbSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4NDAwICogMiwKKwkJfQorCX0sCisJeworCQkubWF4X3dpZHRoID0gNDA5NioyLAorCQkubWF4X2hlaWdodCA9IDIzMDQqMiwKKwkJLmlwcCA9IHsKKwkJCS8vIElQUCB3b3JrIHNwYWNlIGNhbGN1bGF0aW9uIDogNDA5NiAqIChZK0NiQ3IrRmxhZ3MpID0gMTJrLCByb3VuZCB0byAxNmsKKwkJCS5idWZfc2l6ZSA9IDB4NDAwMCoyLAorCQl9LAorCQkuc2FvX2FidiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MzAwMDAqMiwKKwkJfSwKKwkJLnNhb192YiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4MzAwMDAqMiwKKwkJfSwKKwkJLnNob3J0X3Rlcm1fcnBzID0geworCQkJLy8gU0hPUlRfVEVSTV9SUFMgLSBNYXggNjQgc2V0LCAxNiBlbnRyeSBldmVyeSBzZXQsIHRvdGFsIDY0eDE2eDIgPSAyMDQ4IGJ5dGVzICgweDgwMCkKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkudnBzID0geworCQkJLy8gVlBTIFNUT1JFIEFSRUEgLSBNYXggMTYgVlBTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLCB0b3RhbCAweDA4MDAgYnl0ZXMKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc3BzID0geworCQkJLy8gU1BTIFNUT1JFIEFSRUEgLSBNYXggMTYgU1BTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLCB0b3RhbCAweDA4MDAgYnl0ZXMKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkucHBzID0geworCQkJLy8gUFBTIFNUT1JFIEFSRUEgLSBNYXggNjQgUFBTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLCB0b3RhbCAweDIwMDAgYnl0ZXMKKwkJCS5idWZfc2l6ZSA9IDB4MjAwMCwKKwkJfSwKKwkJLnNhb191cCA9IHsKKwkJCS8vIFNBTyBVUCBTVE9SRSBBUkVBIC0gTWF4IDY0MCgxMDI0MC8xNikgTENVLCBlYWNoIGhhcyAxNiBieXRlcyB0b3RhbCAweDI4MDAgYnl0ZXMKKwkJCS5idWZfc2l6ZSA9IDB4MjgwMCoyLAorCQl9LAorCQkuc3dhcF9idWYgPSB7CisJCQkvLyAyNTZjeWNsZXg2NGJpdCA9IDJLIGJ5dGVzIDB4ODAwIChvbmx5IDE0NCBjeWNsZXMgdmFsaWQpCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnN3YXBfYnVmMiA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc2NhbGVsdXQgPSB7CisJCQkvLyBzdXBwb3J0IHVwIHRvIDMyIFNDQUxFTFVUIDEwMjR4MzIgPSAzMktieXRlcyAoMHg4MDAwKQorCQkJLmJ1Zl9zaXplID0gMHg4MDAwKjIsCisJCX0sCisJCS5kYmxrX3BhcmEgPSB7CisJCQkvLyBEQkxLIC0+IE1heCAyNTYoNDA5Ni8xNikgTENVLCBlYWNoIHBhcmEgMTAyNGJ5dGVzKHRvdGFsOjB4NDAwMDApLCBkYXRhIDEwMjRieXRlcyh0b3RhbDoweDQwMDAwKQorCQkJLmJ1Zl9zaXplID0gMHg4MDAwMCoyLAorCQl9LAorCQkuZGJsa19kYXRhID0geworCQkJLmJ1Zl9zaXplID0gMHg4MDAwMCoyLAorCQl9LAorCQkuc2VnX21hcCA9IHsKKwkJCS8qNDA5NngyMzA0LzY0LzY0ICoyNCA9IDB4ZDgwMCBCeXRlcyovCisJCQkuYnVmX3NpemUgPSAweGQ4MDAqNCwKKwkJfSwKKwkJLm1tdV92YmggPSB7CisJCQkuYnVmX3NpemUgPSAweDUwMDAqMiwgLy8yKjE2Kihtb3JlIHRoYW4gMjMwNCkvNCwgNEsKKwkJfSwKKyNpZiAwCisJCS5jbV9oZWFkZXIgPSB7CisJCQkvLy5idWZfc2l6ZSA9IE1NVV9DT01QUkVTU19IRUFERVJfU0laRSo4LCAvLyAweDQ0MDAwID0gKCgxMDg4KjIqMTAyNCo0KS8zMi80KSooMzIvOCkKKwkJCS5idWZfc2l6ZSA9IE1NVV9DT01QUkVTU19IRUFERVJfU0laRSoxNiwgLy8gMHg0NDAwMCA9ICgoMTA4OCoyKjEwMjQqNCkvMzIvNCkqKDMyLzgpCisJCX0sCisjZW5kaWYKKwkJLm1wcmVkX2Fib3ZlID0geworCQkJLmJ1Zl9zaXplID0gMHgxMDAwMCoyLCAvKiAyICogc2l6ZSBvZiBoZXZjKi8KKwkJfSwKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJCS5tcHJlZF9tdiA9IHsKKwkJCS8vNGsyayAsIDB4MTAwMDAwIHBlciBidWZmZXIgKi8KKwkJCS8qIDQwOTZ4MjMwNCAsIDB4MTIwMDAwIHBlciBidWZmZXIgKi8KKwkJCS5idWZfc2l6ZSA9IDB4MTIwMDAwICogRlJBTUVfQlVGRkVSUyAqIDQsCisJCX0sCisjZW5kaWYKKwkJLnJwbSA9IHsKKwkJCS5idWZfc2l6ZSA9IFJQTV9CVUZfU0laRSwKKwkJfSwKKwkJLmxtZW0gPSB7CisJCQkuYnVmX3NpemUgPSAweDQwMCAqIDIsCisJCX0KKwl9LAorCXsKKwkJLyogOE0gYnl0ZXMgKi8KKwkJLm1heF93aWR0aCA9IDE5MjAsCisJCS5tYXhfaGVpZ2h0ID0gMTA4OCwKKwkJLmlwcCA9IHsKKwkJCS8qIElQUCB3b3JrIHNwYWNlIGNhbGN1bGF0aW9uIDoKKwkJCSAqICAgNDA5NiAqIChZK0NiQ3IrRmxhZ3MpID0gMTJrLCByb3VuZCB0byAxNmsKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHgxZTAwLAorCQl9LAorCQkuc2FvX2FidiA9IHsKKwkJCS5idWZfc2l6ZSA9IDAsCisJCX0sCisJCS5zYW9fdmIgPSB7CisJCQkuYnVmX3NpemUgPSAwLAorCQl9LAorCQkuc2hvcnRfdGVybV9ycHMgPSB7CisJCQkvKiBTSE9SVF9URVJNX1JQUyAtIE1heCA2NCBzZXQsIDE2IGVudHJ5IGV2ZXJ5IHNldCwKKwkJCSAqICAgdG90YWwgNjR4MTZ4MiA9IDIwNDggYnl0ZXMgKDB4ODAwKQorCQkJICovCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnZwcyA9IHsKKwkJCS8qIFZQUyBTVE9SRSBBUkVBIC0gTWF4IDE2IFZQUywgZWFjaCBoYXMgMHg4MCBieXRlcywKKwkJCSAqICAgdG90YWwgMHgwODAwIGJ5dGVzCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc3BzID0geworCQkJLyogU1BTIFNUT1JFIEFSRUEgLSBNYXggMTYgU1BTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLAorCQkJICogICB0b3RhbCAweDA4MDAgYnl0ZXMKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5wcHMgPSB7CisJCQkvKiBQUFMgU1RPUkUgQVJFQSAtIE1heCA2NCBQUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsCisJCQkgKiAgIHRvdGFsIDB4MjAwMCBieXRlcworCQkJICovCisJCQkuYnVmX3NpemUgPSAweDIwMDAsCisJCX0sCisJCS5zYW9fdXAgPSB7CisJCQkvKiBTQU8gVVAgU1RPUkUgQVJFQSAtIE1heCA2NDAoMTAyNDAvMTYpIExDVSwKKwkJCSAqICAgZWFjaCBoYXMgMTYgYnl0ZXMgdG90YWwgMHgyODAwIGJ5dGVzCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDAsCisJCX0sCisJCS5zd2FwX2J1ZiA9IHsKKwkJCS8qIDI1NmN5Y2xleDY0Yml0ID0gMksgYnl0ZXMgMHg4MDAKKwkJCSAqICAgKG9ubHkgMTQ0IGN5Y2xlcyB2YWxpZCkKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zd2FwX2J1ZjIgPSB7CisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNjYWxlbHV0ID0geworCQkJLyogc3VwcG9ydCB1cCB0byAzMiBTQ0FMRUxVVCAxMDI0eDMyID0KKwkJCSAqICAgMzJLYnl0ZXMgKDB4ODAwMCkKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMCwKKwkJfSwKKwkJLmRibGtfcGFyYSA9IHsKKwkJCS8qIERCTEsgLT4gTWF4IDI1Nig0MDk2LzE2KSBMQ1UsCisJCQkgKmVhY2ggcGFyYSAxMDI0Ynl0ZXModG90YWw6MHg0MDAwMCksCisJCQkgKmRhdGEgMTAyNGJ5dGVzKHRvdGFsOjB4NDAwMDApCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4NDkwMDAsCisJCX0sCisJCS5kYmxrX2RhdGEgPSB7CisJCQkuYnVmX3NpemUgPSAweDQ5MDAwLAorCQl9LAorCQkuc2VnX21hcCA9IHsKKwkJLyo0MDk2eDIzMDQvNjQvNjQgKjI0ID0gMHhkODAwIEJ5dGVzKi8KKwkJCS5idWZfc2l6ZSA9IDB4MzAwMCwgLy8weDJmZDAsCisJCX0sCisJCS5tbXVfdmJoID0geworCQkJLmJ1Zl9zaXplID0gVkJIX0JVRl9TSVpFXzEwODBQLCAvKjIqMTYqKG1vcmUgdGhhbiAyMzA0KS80LCA0SyovCisJCX0sCisjaWYgMAorCQkuY21faGVhZGVyID0geworCQkJLyphZGQgb25lIGZvciBrZWVwZXIuKi8KKwkJCS5idWZfc2l6ZSA9IE1NVV9DT01QUkVTU19IRUFERVJfU0laRSAqCisJCQkJCQkoRlJBTUVfQlVGRkVSUyArIDEpLAorCQkJLyogMHg0NDAwMCA9ICgoMTA4OCoyKjEwMjQqNCkvMzIvNCkqKDMyLzgpICovCisJCX0sCisjZW5kaWYKKwkJLm1wcmVkX2Fib3ZlID0geworCQkJLmJ1Zl9zaXplID0gMHgyMjAwLCAvLzB4MjFjMCwgLyogMiAqIHNpemUgb2YgaGV2YyovCisJCX0sCisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCQkubXByZWRfbXYgPSB7LyogMTA4MHAsIDB4NDAwMDAgcGVyIGJ1ZmZlciAqLworCQkJLmJ1Zl9zaXplID0gMHg0ODIwMCAqIEZSQU1FX0JVRkZFUlMsCisJCX0sCisjZW5kaWYKKwkJLnJwbSA9IHsKKwkJCS5idWZfc2l6ZSA9IFJQTV9CVUZfU0laRSwKKwkJfSwKKwkJLmxtZW0gPSB7CisJCQkuYnVmX3NpemUgPSAweDQwMCAqIDIsCisJCX0KKwl9LAorCXsKKwkJLm1heF93aWR0aCA9IDQwOTYsCisJCS5tYXhfaGVpZ2h0ID0gMjMwNCwKKwkJLmlwcCA9IHsKKwkJCS8qIElQUCB3b3JrIHNwYWNlIGNhbGN1bGF0aW9uIDoKKwkJCSAqICAgNDA5NiAqIChZK0NiQ3IrRmxhZ3MpID0gMTJrLCByb3VuZCB0byAxNmsKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg0MDAwLAorCQl9LAorCQkuc2FvX2FidiA9IHsKKwkJCS5idWZfc2l6ZSA9IDAsCisJCX0sCisJCS5zYW9fdmIgPSB7CisJCQkuYnVmX3NpemUgPSAwLAorCQl9LAorCQkuc2hvcnRfdGVybV9ycHMgPSB7CisJCQkvKiBTSE9SVF9URVJNX1JQUyAtIE1heCA2NCBzZXQsIDE2IGVudHJ5IGV2ZXJ5IHNldCwKKwkJCSAqICAgdG90YWwgNjR4MTZ4MiA9IDIwNDggYnl0ZXMgKDB4ODAwKQorCQkJICovCisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnZwcyA9IHsKKwkJCS8qIFZQUyBTVE9SRSBBUkVBIC0gTWF4IDE2IFZQUywgZWFjaCBoYXMgMHg4MCBieXRlcywKKwkJCSAqICAgdG90YWwgMHgwODAwIGJ5dGVzCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4ODAwLAorCQl9LAorCQkuc3BzID0geworCQkJLyogU1BTIFNUT1JFIEFSRUEgLSBNYXggMTYgU1BTLCBlYWNoIGhhcyAweDgwIGJ5dGVzLAorCQkJICogICB0b3RhbCAweDA4MDAgYnl0ZXMKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5wcHMgPSB7CisJCQkvKiBQUFMgU1RPUkUgQVJFQSAtIE1heCA2NCBQUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsCisJCQkgKiAgIHRvdGFsIDB4MjAwMCBieXRlcworCQkJICovCisJCQkuYnVmX3NpemUgPSAweDIwMDAsCisJCX0sCisJCS5zYW9fdXAgPSB7CisJCQkvKiBTQU8gVVAgU1RPUkUgQVJFQSAtIE1heCA2NDAoMTAyNDAvMTYpIExDVSwKKwkJCSAqICAgZWFjaCBoYXMgMTYgYnl0ZXMgdG90YWwgMHgyODAwIGJ5dGVzCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDAsCisJCX0sCisJCS5zd2FwX2J1ZiA9IHsKKwkJCS8qIDI1NmN5Y2xleDY0Yml0ID0gMksgYnl0ZXMgMHg4MDAKKwkJCSAqICAgKG9ubHkgMTQ0IGN5Y2xlcyB2YWxpZCkKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zd2FwX2J1ZjIgPSB7CisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNjYWxlbHV0ID0geworCQkJLyogc3VwcG9ydCB1cCB0byAzMiBTQ0FMRUxVVCAxMDI0eDMyID0gMzJLYnl0ZXMKKwkJCSAqICAgKDB4ODAwMCkKKwkJCSAqLworCQkJLmJ1Zl9zaXplID0gMCwKKwkJfSwKKwkJLmRibGtfcGFyYSA9IHsKKwkJCS8qIERCTEsgLT4gTWF4IDI1Nig0MDk2LzE2KSBMQ1UsCisJCQkgKmVhY2ggcGFyYSAxMDI0Ynl0ZXModG90YWw6MHg0MDAwMCksCisJCQkgKmRhdGEgMTAyNGJ5dGVzKHRvdGFsOjB4NDAwMDApCisJCQkgKi8KKwkJCS5idWZfc2l6ZSA9IDB4NTI4MDAsCisJCX0sCisJCS5kYmxrX2RhdGEgPSB7CisJCQkuYnVmX3NpemUgPSAweDUyODAwLAorCQl9LAorCQkuc2VnX21hcCA9IHsKKwkJCS8qNDA5NngyMzA0LzY0LzY0ICoyNCA9IDB4ZDgwMCBCeXRlcyovCisJCQkuYnVmX3NpemUgPSAweGQ4MDAsCisJCX0sCisJCS5tbXVfdmJoID0geworCQkJLmJ1Zl9zaXplID0gVkJIX0JVRl9TSVpFXzRLLC8qMioxNioobW9yZSB0aGFuIDIzMDQpLzQsIDRLKi8KKwkJfSwKKyNpZiAwCisJCS5jbV9oZWFkZXIgPSB7CisJCQkvKmFkZCBvbmUgZm9yIGtlZXBlci4qLworCQkJLmJ1Zl9zaXplID0gTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFICoKKwkJCQkJCShGUkFNRV9CVUZGRVJTICsgMSksCisJCQkvKiAweDQ0MDAwID0gKCgxMDg4KjIqMTAyNCo0KS8zMi80KSooMzIvOCkgKi8KKwkJfSwKKyNlbmRpZgorCQkubXByZWRfYWJvdmUgPSB7CisJCQkuYnVmX3NpemUgPSAweDQ4MDAsIC8qIDIgKiBzaXplIG9mIGhldmMqLworCQl9LAorI2lmZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwkJLm1wcmVkX212ID0geworCQkJLyogLmJ1Zl9zaXplID0gMHgxMDAwMDAqMTYsCisJCQkgKiAvLzRrMmsgLCAweDEwMDAwMCBwZXIgYnVmZmVyCisJCQkgKi8KKwkJCS8qIDQwOTZ4MjMwNCAsIDB4MTIwMDAwIHBlciBidWZmZXIgKi8KKwkJCS5idWZfc2l6ZSA9IDB4MTQ1NDAwICogRlJBTUVfQlVGRkVSUywKKwkJfSwKKyNlbmRpZgorCQkucnBtID0geworCQkJLmJ1Zl9zaXplID0gUlBNX0JVRl9TSVpFLAorCQl9LAorCQkubG1lbSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4NDAwICogMiwKKwkJfQorCX0sCisJeworCQkubWF4X3dpZHRoID0gNDA5NioyLAorCQkubWF4X2hlaWdodCA9IDIzMDQqMiwKKwkJLmlwcCA9IHsKKwkJCS8vIElQUCB3b3JrIHNwYWNlIGNhbGN1bGF0aW9uIDogNDA5NiAqIChZK0NiQ3IrRmxhZ3MpID0gMTJrLCByb3VuZCB0byAxNmsKKwkJCS5idWZfc2l6ZSA9IDB4NDAwMCoyLAorCQl9LAorCQkuc2FvX2FidiA9IHsKKwkJCS5idWZfc2l6ZSA9IDAsCisJCX0sCisJCS5zYW9fdmIgPSB7CisJCQkuYnVmX3NpemUgPSAwLAorCQl9LAorCQkuc2hvcnRfdGVybV9ycHMgPSB7CisJCQkvLyBTSE9SVF9URVJNX1JQUyAtIE1heCA2NCBzZXQsIDE2IGVudHJ5IGV2ZXJ5IHNldCwgdG90YWwgNjR4MTZ4MiA9IDIwNDggYnl0ZXMgKDB4ODAwKQorCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS52cHMgPSB7CisJCQkvLyBWUFMgU1RPUkUgQVJFQSAtIE1heCAxNiBWUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsIHRvdGFsIDB4MDgwMCBieXRlcworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zcHMgPSB7CisJCQkvLyBTUFMgU1RPUkUgQVJFQSAtIE1heCAxNiBTUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsIHRvdGFsIDB4MDgwMCBieXRlcworCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5wcHMgPSB7CisJCQkvLyBQUFMgU1RPUkUgQVJFQSAtIE1heCA2NCBQUFMsIGVhY2ggaGFzIDB4ODAgYnl0ZXMsIHRvdGFsIDB4MjAwMCBieXRlcworCQkJLmJ1Zl9zaXplID0gMHgyMDAwLAorCQl9LAorCQkuc2FvX3VwID0geworCQkJLy8gU0FPIFVQIFNUT1JFIEFSRUEgLSBNYXggNjQwKDEwMjQwLzE2KSBMQ1UsIGVhY2ggaGFzIDE2IGJ5dGVzIHRvdGFsIDB4MjgwMCBieXRlcworCQkJLmJ1Zl9zaXplID0gMCwKKwkJfSwKKwkJLnN3YXBfYnVmID0geworCQkJLy8gMjU2Y3ljbGV4NjRiaXQgPSAySyBieXRlcyAweDgwMCAob25seSAxNDQgY3ljbGVzIHZhbGlkKQorCQkJLmJ1Zl9zaXplID0gMHg4MDAsCisJCX0sCisJCS5zd2FwX2J1ZjIgPSB7CisJCQkuYnVmX3NpemUgPSAweDgwMCwKKwkJfSwKKwkJLnNjYWxlbHV0ID0geworCQkJLy8gc3VwcG9ydCB1cCB0byAzMiBTQ0FMRUxVVCAxMDI0eDMyID0gMzJLYnl0ZXMgKDB4ODAwMCkKKwkJCS5idWZfc2l6ZSA9IDAsCisJCX0sCisJCS5kYmxrX3BhcmEgPSB7CisJCQkvLyBEQkxLIC0+IE1heCAyNTYoNDA5Ni8xNikgTENVLCBlYWNoIHBhcmEgMTAyNGJ5dGVzKHRvdGFsOjB4NDAwMDApLCBkYXRhIDEwMjRieXRlcyh0b3RhbDoweDQwMDAwKQorCQkJLmJ1Zl9zaXplID0gMHhhNDgwMCwKKwkJfSwKKwkJLmRibGtfZGF0YSA9IHsKKwkJCS5idWZfc2l6ZSA9IDB4YTQ4MDAsCisJCX0sCisJCS5zZWdfbWFwID0geworCQkJLyo0MDk2eDIzMDQvNjQvNjQgKjI0ID0gMHhkODAwIEJ5dGVzKi8KKwkJCS5idWZfc2l6ZSA9IDB4MzYwMDAsCisJCX0sCisJCS5tbXVfdmJoID0geworCQkJLmJ1Zl9zaXplID0gVkJIX0JVRl9TSVpFXzhLLCAvLzIqMTYqKG1vcmUgdGhhbiAyMzA0KS80LCA0SworCQl9LAorI2lmIDAKKwkJLmNtX2hlYWRlciA9IHsKKwkJCS8vLmJ1Zl9zaXplID0gTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFKjgsIC8vIDB4NDQwMDAgPSAoKDEwODgqMioxMDI0KjQpLzMyLzQpKigzMi84KQorCQkJLmJ1Zl9zaXplID0gTU1VX0NPTVBSRVNTX0hFQURFUl9TSVpFKjE2LCAvLyAweDQ0MDAwID0gKCgxMDg4KjIqMTAyNCo0KS8zMi80KSooMzIvOCkKKwkJfSwKKyNlbmRpZgorCQkubXByZWRfYWJvdmUgPSB7CisJCQkuYnVmX3NpemUgPSAweDkwMDAsCisJCX0sCisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCQkubXByZWRfbXYgPSB7CisJCQkvLzRrMmsgLCAweDEwMDAwMCBwZXIgYnVmZmVyICovCisJCQkvKiA0MDk2eDIzMDQgLCAweDEyMDAwMCBwZXIgYnVmZmVyICovCisJCQkuYnVmX3NpemUgPSAweDUxNDgwMCAqIEZSQU1FX0JVRkZFUlMsCisJCX0sCisjZW5kaWYKKwkJLnJwbSA9IHsKKwkJCS5idWZfc2l6ZSA9IFJQTV9CVUZfU0laRSwKKwkJfSwKKwkJLmxtZW0gPSB7CisJCQkuYnVmX3NpemUgPSAweDQwMCAqIDIsCisJCX0KKwl9Cit9OworCisKKy8qTG9zbGVzcyBjb21wcmVzc2lvbiBib2R5IGJ1ZmZlciBzaXplIDRLIHBlciA2NHgzMiAoanQpKi8KK2ludCAgY29tcHV0ZV9sb3NsZXNzX2NvbXBfYm9keV9zaXplKGludCB3aWR0aCwgaW50IGhlaWdodCwKKwkJCQl1aW50OF90IGlzX2JpdF9kZXB0aF8xMCkKK3sKKwlpbnQgICAgIHdpZHRoX3g2NDsKKwlpbnQgICAgIGhlaWdodF94MzI7CisJaW50ICAgICBic2l6ZTsKKworCXdpZHRoX3g2NCA9IHdpZHRoICsgNjM7CisJd2lkdGhfeDY0ID4+PSA2OworCWhlaWdodF94MzIgPSBoZWlnaHQgKyAzMTsKKwloZWlnaHRfeDMyID4+PSA1OworCWJzaXplID0gKGlzX2JpdF9kZXB0aF8xMD80MDk2OjMyMDApKndpZHRoX3g2NCpoZWlnaHRfeDMyOworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19CVUZNR1JfTU9SRSkKKwkJcHJfaW5mbygiJXMoJWQsJWQsJWQpPT4lZFxuIiwKKwkJCV9fZnVuY19fLCB3aWR0aCwgaGVpZ2h0LAorCQkJaXNfYml0X2RlcHRoXzEwLCBic2l6ZSk7CisKKwlyZXR1cm4gIGJzaXplOworfQorCisvKiBMb3NsZXNzIGNvbXByZXNzaW9uIGhlYWRlciBidWZmZXIgc2l6ZSAzMmJ5dGVzIHBlciAxMjh4NjQgKGp0KSovCitzdGF0aWMgIGludCAgY29tcHV0ZV9sb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworCWludCAgICAgd2lkdGhfeDEyODsKKwlpbnQgICAgIGhlaWdodF94NjQ7CisJaW50ICAgICBoc2l6ZTsKKworCXdpZHRoX3gxMjggPSB3aWR0aCArIDEyNzsKKwl3aWR0aF94MTI4ID4+PSA3OworCWhlaWdodF94NjQgPSBoZWlnaHQgKyA2MzsKKwloZWlnaHRfeDY0ID4+PSA2OworCisJaHNpemUgPSAzMiAqIHdpZHRoX3gxMjggKiBoZWlnaHRfeDY0OworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19CVUZNR1JfTU9SRSkKKwkJcHJfaW5mbygiJXMoJWQsJWQpPT4lZFxuIiwKKwkJCV9fZnVuY19fLCB3aWR0aCwgaGVpZ2h0LAorCQkJaHNpemUpOworCisJcmV0dXJuICBoc2l6ZTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9idWZmX3NwZWMoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLAorCXN0cnVjdCBCdWZmSW5mb19zICpidWZfc3BlYykKK3sKKwl2b2lkICptZW1fc3RhcnRfdmlydDsKKworCWJ1Zl9zcGVjLT5pcHAuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c3RhcnRfYWRyKTsKKwlidWZfc3BlYy0+c2FvX2Fidi5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5pcHAuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPmlwcC5idWZfc2l6ZSk7CisJYnVmX3NwZWMtPnNhb192Yi5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5zYW9fYWJ2LmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5zYW9fYWJ2LmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+c2hvcnRfdGVybV9ycHMuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c2FvX3ZiLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5zYW9fdmIuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT52cHMuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c2hvcnRfdGVybV9ycHMuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnNob3J0X3Rlcm1fcnBzLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+c3BzLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnZwcy5idWZfc3RhcnQgKyBidWZfc3BlYy0+dnBzLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+cHBzLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnNwcy5idWZfc3RhcnQgKyBidWZfc3BlYy0+c3BzLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+c2FvX3VwLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnBwcy5idWZfc3RhcnQgKyBidWZfc3BlYy0+cHBzLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+c3dhcF9idWYuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c2FvX3VwLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5zYW9fdXAuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5zd2FwX2J1ZjIuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c3dhcF9idWYuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnN3YXBfYnVmLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+c2NhbGVsdXQuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c3dhcF9idWYyLmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5zd2FwX2J1ZjIuYnVmX3NpemUpOworCWJ1Zl9zcGVjLT5kYmxrX3BhcmEuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c2NhbGVsdXQuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnNjYWxlbHV0LmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+ZGJsa19kYXRhLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc3RhcnQgKyBidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+c2VnX21hcC5idWZfc3RhcnQgPQorCQlXT1JLQlVGX0FMSUdOKGJ1Zl9zcGVjLT5kYmxrX2RhdGEuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPmRibGtfZGF0YS5idWZfc2l6ZSk7CisJaWYgKHBiaSA9PSBOVUxMIHx8IHBiaS0+bW11X2VuYWJsZSkgeworCQlidWZfc3BlYy0+bW11X3ZiaC5idWZfc3RhcnQgID0KKwkJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnNlZ19tYXAuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPnNlZ19tYXAuYnVmX3NpemUpOworCQlidWZfc3BlYy0+bXByZWRfYWJvdmUuYnVmX3N0YXJ0ID0KKwkJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPm1tdV92YmguYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPm1tdV92YmguYnVmX3NpemUpOworCX0gZWxzZSB7CisJCWJ1Zl9zcGVjLT5tcHJlZF9hYm92ZS5idWZfc3RhcnQgPQorCQkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+c2VnX21hcC5idWZfc3RhcnQgKyBidWZfc3BlYy0+c2VnX21hcC5idWZfc2l6ZSk7CisJfQorI2lmZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwlidWZfc3BlYy0+bXByZWRfbXYuYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+bXByZWRfYWJvdmUuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPm1wcmVkX2Fib3ZlLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+cnBtLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPm1wcmVkX212LmJ1Zl9zdGFydCArIGJ1Zl9zcGVjLT5tcHJlZF9tdi5idWZfc2l6ZSk7CisjZWxzZQorCWJ1Zl9zcGVjLT5ycG0uYnVmX3N0YXJ0ID0KKwkJV09SS0JVRl9BTElHTihidWZfc3BlYy0+bXByZWRfYWJvdmUuYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPm1wcmVkX2Fib3ZlLmJ1Zl9zaXplKTsKKyNlbmRpZgorCWJ1Zl9zcGVjLT5sbWVtLmJ1Zl9zdGFydCA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPnJwbS5idWZfc3RhcnQgKyBidWZfc3BlYy0+cnBtLmJ1Zl9zaXplKTsKKwlidWZfc3BlYy0+ZW5kX2FkciA9CisJCVdPUktCVUZfQUxJR04oYnVmX3NwZWMtPmxtZW0uYnVmX3N0YXJ0ICsgYnVmX3NwZWMtPmxtZW0uYnVmX3NpemUpOworCisJaWYgKCFwYmkpCisJCXJldHVybjsKKworCWlmICghdmRlY19zZWN1cmUoaHdfdG9fdmRlYyhwYmkpKSkgeworCQltZW1fc3RhcnRfdmlydCA9CisJCQljb2RlY19tbV9waHlzX3RvX3ZpcnQoYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc3RhcnQpOworCQlpZiAobWVtX3N0YXJ0X3ZpcnQpIHsKKwkJCW1lbXNldChtZW1fc3RhcnRfdmlydCwgMCwKKwkJCQlidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zaXplKTsKKwkJCWNvZGVjX21tX2RtYV9mbHVzaChtZW1fc3RhcnRfdmlydCwKKwkJCQlidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zaXplLAorCQkJCURNQV9UT19ERVZJQ0UpOworCQl9IGVsc2UgeworCQkJbWVtX3N0YXJ0X3ZpcnQgPSBjb2RlY19tbV92bWFwKAorCQkJCWJ1Zl9zcGVjLT5kYmxrX3BhcmEuYnVmX3N0YXJ0LAorCQkJCWJ1Zl9zcGVjLT5kYmxrX3BhcmEuYnVmX3NpemUpOworCQkJaWYgKG1lbV9zdGFydF92aXJ0KSB7CisJCQkJbWVtc2V0KG1lbV9zdGFydF92aXJ0LCAwLAorCQkJCQlidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zaXplKTsKKwkJCQljb2RlY19tbV9kbWFfZmx1c2gobWVtX3N0YXJ0X3ZpcnQsCisJCQkJCWJ1Zl9zcGVjLT5kYmxrX3BhcmEuYnVmX3NpemUsCisJCQkJCURNQV9UT19ERVZJQ0UpOworCQkJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIobWVtX3N0YXJ0X3ZpcnQpOworCQkJfSBlbHNlIHsKKwkJCQkvKm5vdCB2aXJ0IGZvciB0dnAgcGxheWluZywKKwkJCQltYXkgbmVlZCBjbGVhciBvbiB1Y29kZS4qLworCQkJCXByX2VycigibWVtX3N0YXJ0X3ZpcnQgZmFpbGVkXG4iKTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChkZWJ1ZykgeworCQlwcl9pbmZvKCIlcyB3b3Jrc3BhY2UgKCV4ICV4KSBzaXplID0gJXhcbiIsIF9fZnVuY19fLAorCQkJICAgYnVmX3NwZWMtPnN0YXJ0X2FkciwgYnVmX3NwZWMtPmVuZF9hZHIsCisJCQkgICBidWZfc3BlYy0+ZW5kX2FkciAtIGJ1Zl9zcGVjLT5zdGFydF9hZHIpOworCX0KKworCWlmIChkZWJ1ZykgeworCQlwcl9pbmZvKCJpcHAuYnVmX3N0YXJ0ICAgICAgICAgICAgIDoleFxuIiwKKwkJCSAgIGJ1Zl9zcGVjLT5pcHAuYnVmX3N0YXJ0KTsKKwkJcHJfaW5mbygic2FvX2Fidi5idWZfc3RhcnQgICAgICAgICAgOiV4XG4iLAorCQkJICAgYnVmX3NwZWMtPnNhb19hYnYuYnVmX3N0YXJ0KTsKKwkJcHJfaW5mbygic2FvX3ZiLmJ1Zl9zdGFydCAgICAgICAgICA6JXhcbiIsCisJCQkgICBidWZfc3BlYy0+c2FvX3ZiLmJ1Zl9zdGFydCk7CisJCXByX2luZm8oInNob3J0X3Rlcm1fcnBzLmJ1Zl9zdGFydCAgOiV4XG4iLAorCQkJICAgYnVmX3NwZWMtPnNob3J0X3Rlcm1fcnBzLmJ1Zl9zdGFydCk7CisJCXByX2luZm8oInZwcy5idWZfc3RhcnQgICAgICAgICAgICAgOiV4XG4iLAorCQkJICAgYnVmX3NwZWMtPnZwcy5idWZfc3RhcnQpOworCQlwcl9pbmZvKCJzcHMuYnVmX3N0YXJ0ICAgICAgICAgICAgIDoleFxuIiwKKwkJCSAgIGJ1Zl9zcGVjLT5zcHMuYnVmX3N0YXJ0KTsKKwkJcHJfaW5mbygicHBzLmJ1Zl9zdGFydCAgICAgICAgICAgICA6JXhcbiIsCisJCQkgICBidWZfc3BlYy0+cHBzLmJ1Zl9zdGFydCk7CisJCXByX2luZm8oInNhb191cC5idWZfc3RhcnQgICAgICAgICAgOiV4XG4iLAorCQkJICAgYnVmX3NwZWMtPnNhb191cC5idWZfc3RhcnQpOworCQlwcl9pbmZvKCJzd2FwX2J1Zi5idWZfc3RhcnQgICAgICAgIDoleFxuIiwKKwkJCSAgIGJ1Zl9zcGVjLT5zd2FwX2J1Zi5idWZfc3RhcnQpOworCQlwcl9pbmZvKCJzd2FwX2J1ZjIuYnVmX3N0YXJ0ICAgICAgIDoleFxuIiwKKwkJCSAgIGJ1Zl9zcGVjLT5zd2FwX2J1ZjIuYnVmX3N0YXJ0KTsKKwkJcHJfaW5mbygic2NhbGVsdXQuYnVmX3N0YXJ0ICAgICAgICA6JXhcbiIsCisJCQkgICBidWZfc3BlYy0+c2NhbGVsdXQuYnVmX3N0YXJ0KTsKKwkJcHJfaW5mbygiZGJsa19wYXJhLmJ1Zl9zdGFydCAgICAgICA6JXhcbiIsCisJCQkgICBidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zdGFydCk7CisJCXByX2luZm8oImRibGtfZGF0YS5idWZfc3RhcnQgICAgICAgOiV4XG4iLAorCQkJICAgYnVmX3NwZWMtPmRibGtfZGF0YS5idWZfc3RhcnQpOworCQlwcl9pbmZvKCJzZWdfbWFwLmJ1Zl9zdGFydCAgICAgICA6JXhcbiIsCisJCQlidWZfc3BlYy0+c2VnX21hcC5idWZfc3RhcnQpOworCWlmIChwYmktPm1tdV9lbmFibGUpIHsKKwkJcHJfaW5mbygibW11X3ZiaC5idWZfc3RhcnQgICAgIDoleFxuIiwKKwkJCWJ1Zl9zcGVjLT5tbXVfdmJoLmJ1Zl9zdGFydCk7CisJfQorCQlwcl9pbmZvKCJtcHJlZF9hYm92ZS5idWZfc3RhcnQgICAgIDoleFxuIiwKKwkJCSAgIGJ1Zl9zcGVjLT5tcHJlZF9hYm92ZS5idWZfc3RhcnQpOworI2lmZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwkJcHJfaW5mbygibXByZWRfbXYuYnVmX3N0YXJ0ICAgICAgICA6JXhcbiIsCisJCQkgICBidWZfc3BlYy0+bXByZWRfbXYuYnVmX3N0YXJ0KTsKKyNlbmRpZgorCQlpZiAoKGRlYnVnICYgVlA5X0RFQlVHX1NFTkRfUEFSQU1fV0lUSF9SRUcpID09IDApIHsKKwkJCXByX2luZm8oInJwbS5idWZfc3RhcnQgICAgICAgICAgICAgOiV4XG4iLAorCQkJCSAgIGJ1Zl9zcGVjLT5ycG0uYnVmX3N0YXJ0KTsKKwkJfQorCX0KK30KKworLyogY2FjaGVfdXRpbC5jICovCisjZGVmaW5lICAgVEhPRElZSUxfTUNSQ0NfQ0FOVkFTX0FMR1ggICAgNAorCitzdGF0aWMgdTMyIG1jcmNjX2NhY2hlX2FsZ19mbGFnID0gVEhPRElZSUxfTUNSQ0NfQ0FOVkFTX0FMR1g7CisKK3N0YXRpYyB2b2lkIG1jcmNjX3BlcmZjb3VudF9yZXNldCh2b2lkKQoreworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19DQUNIRSkKKwkJcHJfaW5mbygiW2NhY2hlX3V0aWwuY10gRW50ZXJlZCBtY3JjY19wZXJmY291bnRfcmVzZXQuLi5cbiIpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpMHgxKTsKKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KTB4MCk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdW5zaWduZWQgcmF3X21jcl9jbnRfdG90YWxfcHJldjsKK3N0YXRpYyB1bnNpZ25lZCBoaXRfbWNyXzBfY250X3RvdGFsX3ByZXY7CitzdGF0aWMgdW5zaWduZWQgaGl0X21jcl8xX2NudF90b3RhbF9wcmV2Oworc3RhdGljIHVuc2lnbmVkIGJ5cF9tY3JfY250X25jaGNhbnZfdG90YWxfcHJldjsKK3N0YXRpYyB1bnNpZ25lZCBieXBfbWNyX2NudF9uY2hvdXR3aW5fdG90YWxfcHJldjsKKworc3RhdGljIHZvaWQgbWNyY2NfZ2V0X2hpdHJhdGUodW5zaWduZWQgcmVzZXRfcHJlKQoreworCXVuc2lnbmVkIGRlbHRhX2hpdF9tY3JfMF9jbnQ7CisJdW5zaWduZWQgZGVsdGFfaGl0X21jcl8xX2NudDsKKwl1bnNpZ25lZCBkZWx0YV9yYXdfbWNyX2NudDsKKwl1bnNpZ25lZCBkZWx0YV9tY3JfY250X25jaGNhbnY7CisJdW5zaWduZWQgZGVsdGFfbWNyX2NudF9uY2hvdXR3aW47CisKKwl1bnNpZ25lZCB0bXA7CisJdW5zaWduZWQgcmF3X21jcl9jbnQ7CisJdW5zaWduZWQgaGl0X21jcl9jbnQ7CisJdW5zaWduZWQgYnlwX21jcl9jbnRfbmNob3V0d2luOworCXVuc2lnbmVkIGJ5cF9tY3JfY250X25jaGNhbnY7CisJaW50IGhpdHJhdGU7CisJaWYgKHJlc2V0X3ByZSkgeworCQlyYXdfbWNyX2NudF90b3RhbF9wcmV2ID0gMDsKKwkJaGl0X21jcl8wX2NudF90b3RhbF9wcmV2ID0gMDsKKwkJaGl0X21jcl8xX2NudF90b3RhbF9wcmV2ID0gMDsKKwkJYnlwX21jcl9jbnRfbmNoY2Fudl90b3RhbF9wcmV2ID0gMDsKKwkJYnlwX21jcl9jbnRfbmNob3V0d2luX3RvdGFsX3ByZXYgPSAwOworCX0KKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEUpCisJCXByX2luZm8oIltjYWNoZV91dGlsLmNdIEVudGVyZWQgbWNyY2NfZ2V0X2hpdHJhdGUuLi5cbiIpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4MDw8MSkpOworCXJhd19tY3JfY250ID0gUkVBRF9WUkVHKEhFVkNEX01DUkNDX1BFUkZNT05fREFUQSk7CisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHgxPDwxKSk7CisJaGl0X21jcl9jbnQgPSBSRUFEX1ZSRUcoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9EQVRBKTsKKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDI8PDEpKTsKKwlieXBfbWNyX2NudF9uY2hvdXR3aW4gPSBSRUFEX1ZSRUcoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9EQVRBKTsKKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDM8PDEpKTsKKwlieXBfbWNyX2NudF9uY2hjYW52ID0gUkVBRF9WUkVHKEhFVkNEX01DUkNDX1BFUkZNT05fREFUQSk7CisKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEUpCisJCXByX2luZm8oInJhd19tY3JfY250X3RvdGFsOiAlZFxuIiwKKwkJCXJhd19tY3JfY250KTsKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEUpCisJCXByX2luZm8oImhpdF9tY3JfY250X3RvdGFsOiAlZFxuIiwKKwkJCWhpdF9tY3JfY250KTsKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEUpCisJCXByX2luZm8oImJ5cF9tY3JfY250X25jaG91dHdpbl90b3RhbDogJWRcbiIsCisJCQlieXBfbWNyX2NudF9uY2hvdXR3aW4pOworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19DQUNIRSkKKwkJcHJfaW5mbygiYnlwX21jcl9jbnRfbmNoY2Fudl90b3RhbDogJWRcbiIsCisJCQlieXBfbWNyX2NudF9uY2hjYW52KTsKKworCWRlbHRhX3Jhd19tY3JfY250ID0gcmF3X21jcl9jbnQgLQorCQlyYXdfbWNyX2NudF90b3RhbF9wcmV2OworCWRlbHRhX21jcl9jbnRfbmNoY2FudiA9IGJ5cF9tY3JfY250X25jaGNhbnYgLQorCQlieXBfbWNyX2NudF9uY2hjYW52X3RvdGFsX3ByZXY7CisJZGVsdGFfbWNyX2NudF9uY2hvdXR3aW4gPSBieXBfbWNyX2NudF9uY2hvdXR3aW4gLQorCQlieXBfbWNyX2NudF9uY2hvdXR3aW5fdG90YWxfcHJldjsKKwlyYXdfbWNyX2NudF90b3RhbF9wcmV2ID0gcmF3X21jcl9jbnQ7CisJYnlwX21jcl9jbnRfbmNoY2Fudl90b3RhbF9wcmV2ID0gYnlwX21jcl9jbnRfbmNoY2FudjsKKwlieXBfbWNyX2NudF9uY2hvdXR3aW5fdG90YWxfcHJldiA9IGJ5cF9tY3JfY250X25jaG91dHdpbjsKKworCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4NDw8MSkpOworCXRtcCA9IFJFQURfVlJFRyhIRVZDRF9NQ1JDQ19QRVJGTU9OX0RBVEEpOworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19DQUNIRSkKKwkJcHJfaW5mbygibWlzc19tY3JfMF9jbnRfdG90YWw6ICVkXG4iLCB0bXApOworCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4NTw8MSkpOworCXRtcCA9IFJFQURfVlJFRyhIRVZDRF9NQ1JDQ19QRVJGTU9OX0RBVEEpOworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19DQUNIRSkKKwkJcHJfaW5mbygibWlzc19tY3JfMV9jbnRfdG90YWw6ICVkXG4iLCB0bXApOworCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4Njw8MSkpOworCXRtcCA9IFJFQURfVlJFRyhIRVZDRF9NQ1JDQ19QRVJGTU9OX0RBVEEpOworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19DQUNIRSkKKwkJcHJfaW5mbygiaGl0X21jcl8wX2NudF90b3RhbDogJWRcbiIsIHRtcCk7CisJZGVsdGFfaGl0X21jcl8wX2NudCA9IHRtcCAtIGhpdF9tY3JfMF9jbnRfdG90YWxfcHJldjsKKwloaXRfbWNyXzBfY250X3RvdGFsX3ByZXYgPSB0bXA7CisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHg3PDwxKSk7CisJdG1wID0gUkVBRF9WUkVHKEhFVkNEX01DUkNDX1BFUkZNT05fREFUQSk7CisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0NBQ0hFKQorCQlwcl9pbmZvKCJoaXRfbWNyXzFfY250X3RvdGFsOiAlZFxuIiwgdG1wKTsKKwlkZWx0YV9oaXRfbWNyXzFfY250ID0gdG1wIC0gaGl0X21jcl8xX2NudF90b3RhbF9wcmV2OworCWhpdF9tY3JfMV9jbnRfdG90YWxfcHJldiA9IHRtcDsKKworCWlmIChkZWx0YV9yYXdfbWNyX2NudCAhPSAwKSB7CisJCWhpdHJhdGUgPSAxMDAgKiBkZWx0YV9oaXRfbWNyXzBfY250CisJCQkvIGRlbHRhX3Jhd19tY3JfY250OworCQlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEUpCisJCQlwcl9pbmZvKCJDQU5WMF9ISVRfUkFURSA6ICVkXG4iLCBoaXRyYXRlKTsKKwkJaGl0cmF0ZSA9IDEwMCAqIGRlbHRhX2hpdF9tY3JfMV9jbnQKKwkJCS8gZGVsdGFfcmF3X21jcl9jbnQ7CisJCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19DQUNIRSkKKwkJCXByX2luZm8oIkNBTlYxX0hJVF9SQVRFIDogJWRcbiIsIGhpdHJhdGUpOworCQloaXRyYXRlID0gMTAwICogZGVsdGFfbWNyX2NudF9uY2hjYW52CisJCQkvIGRlbHRhX3Jhd19tY3JfY250OworCQlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEUpCisJCQlwcl9pbmZvKCJOT05DQUNIX0NBTlZfQllQX1JBVEUgOiAlZFxuIiwgaGl0cmF0ZSk7CisJCWhpdHJhdGUgPSAxMDAgKiBkZWx0YV9tY3JfY250X25jaG91dHdpbgorCQkJLyBkZWx0YV9yYXdfbWNyX2NudDsKKwkJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0NBQ0hFKQorCQkJcHJfaW5mbygiQ0FDSEVfT1VUV0lOX0JZUF9SQVRFIDogJWRcbiIsIGhpdHJhdGUpOworCX0KKworCisJaWYgKHJhd19tY3JfY250ICE9IDApIHsKKwkJaGl0cmF0ZSA9IDEwMCAqIGhpdF9tY3JfY250IC8gcmF3X21jcl9jbnQ7CisJCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19DQUNIRSkKKwkJCXByX2luZm8oIk1DUkNDX0hJVF9SQVRFIDogJWRcbiIsIGhpdHJhdGUpOworCQloaXRyYXRlID0gMTAwICogKGJ5cF9tY3JfY250X25jaG91dHdpbiArIGJ5cF9tY3JfY250X25jaGNhbnYpCisJCQkvIHJhd19tY3JfY250OworCQlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEUpCisJCQlwcl9pbmZvKCJNQ1JDQ19CWVBfUkFURSA6ICVkXG4iLCBoaXRyYXRlKTsKKwl9IGVsc2UgeworCQlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEUpCisJCQlwcl9pbmZvKCJNQ1JDQ19ISVRfUkFURSA6IG5hXG4iKTsKKwkJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0NBQ0hFKQorCQkJcHJfaW5mbygiTUNSQ0NfQllQX1JBVEUgOiBuYVxuIik7CisJfQorCXJldHVybjsKK30KKworCitzdGF0aWMgdm9pZCBkZWNvbXBfcGVyZmNvdW50X3Jlc2V0KHZvaWQpCit7CisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0NBQ0hFKQorCQlwcl9pbmZvKCJbY2FjaGVfdXRpbC5jXSBFbnRlcmVkIGRlY29tcF9wZXJmY291bnRfcmVzZXQuLi5cbiIpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkweDEpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkweDApOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgZGVjb21wX2dldF9oaXRyYXRlKHZvaWQpCit7CisJdW5zaWduZWQgICByYXdfbWNyX2NudDsKKwl1bnNpZ25lZCAgIGhpdF9tY3JfY250OworCWludCAgICAgIGhpdHJhdGU7CisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0NBQ0hFKQorCQlwcl9pbmZvKCJbY2FjaGVfdXRpbC5jXSBFbnRlcmVkIGRlY29tcF9nZXRfaGl0cmF0ZS4uLlxuIik7CisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDA8PDEpKTsKKwlyYXdfbWNyX2NudCA9IFJFQURfVlJFRyhIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fREFUQSk7CisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDE8PDEpKTsKKwloaXRfbWNyX2NudCA9IFJFQURfVlJFRyhIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fREFUQSk7CisKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEUpCisJCXByX2luZm8oImhjYWNoZV9yYXdfY250X3RvdGFsOiAlZFxuIiwgcmF3X21jcl9jbnQpOworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19DQUNIRSkKKwkJcHJfaW5mbygiaGNhY2hlX2hpdF9jbnRfdG90YWw6ICVkXG4iLCBoaXRfbWNyX2NudCk7CisKKwlpZiAocmF3X21jcl9jbnQgIT0gMCkgeworCQloaXRyYXRlID0gaGl0X21jcl9jbnQgKiAxMDAgLyByYXdfbWNyX2NudDsKKwkJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0NBQ0hFKQorCQkJcHJfaW5mbygiREVDT01QX0hDQUNIRV9ISVRfUkFURSA6ICVkXG4iLCBoaXRyYXRlKTsKKwl9IGVsc2UgeworCQlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEUpCisJCQlwcl9pbmZvKCJERUNPTVBfSENBQ0hFX0hJVF9SQVRFIDogbmFcbiIpOworCX0KKwlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4Mjw8MSkpOworCXJhd19tY3JfY250ID0gUkVBRF9WUkVHKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9EQVRBKTsKKwlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4Mzw8MSkpOworCWhpdF9tY3JfY250ID0gUkVBRF9WUkVHKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9EQVRBKTsKKworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19DQUNIRSkKKwkJcHJfaW5mbygiZGNhY2hlX3Jhd19jbnRfdG90YWw6ICVkXG4iLCByYXdfbWNyX2NudCk7CisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0NBQ0hFKQorCQlwcl9pbmZvKCJkY2FjaGVfaGl0X2NudF90b3RhbDogJWRcbiIsIGhpdF9tY3JfY250KTsKKworCWlmIChyYXdfbWNyX2NudCAhPSAwKSB7CisJCWhpdHJhdGUgPSBoaXRfbWNyX2NudCAqIDEwMCAvIHJhd19tY3JfY250OworCQlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEUpCisJCQlwcl9pbmZvKCJERUNPTVBfRENBQ0hFX0hJVF9SQVRFIDogJWRcbiIsIGhpdHJhdGUpOworCX0gZWxzZSB7CisJCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19DQUNIRSkKKwkJCXByX2luZm8oIkRFQ09NUF9EQ0FDSEVfSElUX1JBVEUgOiBuYVxuIik7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgZGVjb21wX2dldF9jb21wcmF0ZSh2b2lkKQoreworCXVuc2lnbmVkICAgcmF3X3Vjb21wX2NudDsKKwl1bnNpZ25lZCAgIGZhc3RfY29tcF9jbnQ7CisJdW5zaWduZWQgICBzbG93X2NvbXBfY250OworCWludCAgICAgIGNvbXByYXRlOworCisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0NBQ0hFKQorCQlwcl9pbmZvKCJbY2FjaGVfdXRpbC5jXSBFbnRlcmVkIGRlY29tcF9nZXRfY29tcHJhdGUuLi5cbiIpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9QRVJGTU9OX0NUTCwgKHVuc2lnbmVkIGludCkoMHg0PDwxKSk7CisJZmFzdF9jb21wX2NudCA9IFJFQURfVlJFRyhIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fREFUQSk7CisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX1BFUkZNT05fQ1RMLCAodW5zaWduZWQgaW50KSgweDU8PDEpKTsKKwlzbG93X2NvbXBfY250ID0gUkVBRF9WUkVHKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9EQVRBKTsKKwlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfUEVSRk1PTl9DVEwsICh1bnNpZ25lZCBpbnQpKDB4Njw8MSkpOworCXJhd191Y29tcF9jbnQgPSBSRUFEX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9QRVJGTU9OX0RBVEEpOworCisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0NBQ0hFKQorCQlwcl9pbmZvKCJkZWNvbXBfZmFzdF9jb21wX3RvdGFsOiAlZFxuIiwgZmFzdF9jb21wX2NudCk7CisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0NBQ0hFKQorCQlwcl9pbmZvKCJkZWNvbXBfc2xvd19jb21wX3RvdGFsOiAlZFxuIiwgc2xvd19jb21wX2NudCk7CisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0NBQ0hFKQorCQlwcl9pbmZvKCJkZWNvbXBfcmF3X3VuY29tcF90b3RhbDogJWRcbiIsIHJhd191Y29tcF9jbnQpOworCisJaWYgKHJhd191Y29tcF9jbnQgIT0gMCkgeworCQljb21wcmF0ZSA9IChmYXN0X2NvbXBfY250ICsgc2xvd19jb21wX2NudCkKKwkJKiAxMDAgLyByYXdfdWNvbXBfY250OworCQlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEUpCisJCQlwcl9pbmZvKCJERUNPTVBfQ09NUF9SQVRJTyA6ICVkXG4iLCBjb21wcmF0ZSk7CisJfSBlbHNlIHsKKwkJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0NBQ0hFKQorCQkJcHJfaW5mbygiREVDT01QX0NPTVBfUkFUSU8gOiBuYVxuIik7CisJfQorCXJldHVybjsKK30KKy8qIGNhY2hlX3V0aWwuYyBlbmQgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICp2cDlfcHJvYiBkZWZpbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKyNkZWZpbmUgVlA5X1BBUlRJVElPTl9TVEFSVCAgICAgIDAKKyNkZWZpbmUgVlA5X1BBUlRJVElPTl9TSVpFX1NURVAgICgzICogNCkKKyNkZWZpbmUgVlA5X1BBUlRJVElPTl9PTkVfU0laRSAgICg0ICogVlA5X1BBUlRJVElPTl9TSVpFX1NURVApCisjZGVmaW5lIFZQOV9QQVJUSVRJT05fS0VZX1NUQVJUICAwCisjZGVmaW5lIFZQOV9QQVJUSVRJT05fUF9TVEFSVCAgICBWUDlfUEFSVElUSU9OX09ORV9TSVpFCisjZGVmaW5lIFZQOV9QQVJUSVRJT05fU0laRSAgICAgICAoMiAqIFZQOV9QQVJUSVRJT05fT05FX1NJWkUpCisjZGVmaW5lIFZQOV9TS0lQX1NUQVJUICAgICAgICAgICAoVlA5X1BBUlRJVElPTl9TVEFSVCArIFZQOV9QQVJUSVRJT05fU0laRSkKKyNkZWZpbmUgVlA5X1NLSVBfU0laRSAgICAgICAgICAgIDQgLyogb25seSB1c2UgMyovCisjZGVmaW5lIFZQOV9UWF9NT0RFX1NUQVJUICAgICAgICAoVlA5X1NLSVBfU1RBUlQrVlA5X1NLSVBfU0laRSkKKyNkZWZpbmUgVlA5X1RYX01PREVfOF8wX09GRlNFVCAgIDAKKyNkZWZpbmUgVlA5X1RYX01PREVfOF8xX09GRlNFVCAgIDEKKyNkZWZpbmUgVlA5X1RYX01PREVfMTZfMF9PRkZTRVQgIDIKKyNkZWZpbmUgVlA5X1RYX01PREVfMTZfMV9PRkZTRVQgIDQKKyNkZWZpbmUgVlA5X1RYX01PREVfMzJfMF9PRkZTRVQgIDYKKyNkZWZpbmUgVlA5X1RYX01PREVfMzJfMV9PRkZTRVQgIDkKKyNkZWZpbmUgVlA5X1RYX01PREVfU0laRSAgICAgICAgIDEyCisjZGVmaW5lIFZQOV9DT0VGX1NUQVJUICAgICAgICAgICAoVlA5X1RYX01PREVfU1RBUlQrVlA5X1RYX01PREVfU0laRSkKKyNkZWZpbmUgVlA5X0NPRUZfQkFORF8wX09GRlNFVCAgIDAKKyNkZWZpbmUgVlA5X0NPRUZfQkFORF8xX09GRlNFVCAgIChWUDlfQ09FRl9CQU5EXzBfT0ZGU0VUICsgMyAqIDMgKyAxKQorI2RlZmluZSBWUDlfQ09FRl9CQU5EXzJfT0ZGU0VUICAgKFZQOV9DT0VGX0JBTkRfMV9PRkZTRVQgKyA2ICogMykKKyNkZWZpbmUgVlA5X0NPRUZfQkFORF8zX09GRlNFVCAgIChWUDlfQ09FRl9CQU5EXzJfT0ZGU0VUICsgNiAqIDMpCisjZGVmaW5lIFZQOV9DT0VGX0JBTkRfNF9PRkZTRVQgICAoVlA5X0NPRUZfQkFORF8zX09GRlNFVCArIDYgKiAzKQorI2RlZmluZSBWUDlfQ09FRl9CQU5EXzVfT0ZGU0VUICAgKFZQOV9DT0VGX0JBTkRfNF9PRkZTRVQgKyA2ICogMykKKyNkZWZpbmUgVlA5X0NPRUZfU0laRV9PTkVfU0VUICAgIDEwMCAvKiAoKDMgKzUqNikqMyArIDEgcGFkZGluZykqLworI2RlZmluZSBWUDlfQ09FRl80WDRfU1RBUlQgICAgICAgKFZQOV9DT0VGX1NUQVJUICsgMCAqIFZQOV9DT0VGX1NJWkVfT05FX1NFVCkKKyNkZWZpbmUgVlA5X0NPRUZfOFg4X1NUQVJUICAgICAgIChWUDlfQ09FRl9TVEFSVCArIDQgKiBWUDlfQ09FRl9TSVpFX09ORV9TRVQpCisjZGVmaW5lIFZQOV9DT0VGXzE2WDE2X1NUQVJUICAgICAoVlA5X0NPRUZfU1RBUlQgKyA4ICogVlA5X0NPRUZfU0laRV9PTkVfU0VUKQorI2RlZmluZSBWUDlfQ09FRl8zMlgzMl9TVEFSVCAgICAgKFZQOV9DT0VGX1NUQVJUICsgMTIgKiBWUDlfQ09FRl9TSVpFX09ORV9TRVQpCisjZGVmaW5lIFZQOV9DT0VGX1NJWkVfUExBTkUgICAgICAoMiAqIFZQOV9DT0VGX1NJWkVfT05FX1NFVCkKKyNkZWZpbmUgVlA5X0NPRUZfU0laRSAgICAgICAgICAgICg0ICogMiAqIDIgKiBWUDlfQ09FRl9TSVpFX09ORV9TRVQpCisjZGVmaW5lIFZQOV9JTlRFUl9NT0RFX1NUQVJUICAgICAoVlA5X0NPRUZfU1RBUlQrVlA5X0NPRUZfU0laRSkKKyNkZWZpbmUgVlA5X0lOVEVSX01PREVfU0laRSAgICAgIDI0IC8qIG9ubHkgdXNlIDIxICggIyo3KSovCisjZGVmaW5lIFZQOV9JTlRFUlBfU1RBUlQgICAgICAgICAoVlA5X0lOVEVSX01PREVfU1RBUlQrVlA5X0lOVEVSX01PREVfU0laRSkKKyNkZWZpbmUgVlA5X0lOVEVSUF9TSVpFICAgICAgICAgIDgKKyNkZWZpbmUgVlA5X0lOVFJBX0lOVEVSX1NUQVJUICAgIChWUDlfSU5URVJQX1NUQVJUK1ZQOV9JTlRFUlBfU0laRSkKKyNkZWZpbmUgVlA5X0lOVFJBX0lOVEVSX1NJWkUgICAgIDQKKyNkZWZpbmUgVlA5X0lOVEVSUF9JTlRSQV9JTlRFUl9TVEFSVCAgVlA5X0lOVEVSUF9TVEFSVAorI2RlZmluZSBWUDlfSU5URVJQX0lOVFJBX0lOVEVSX1NJWkUgICAoVlA5X0lOVEVSUF9TSVpFICsgVlA5X0lOVFJBX0lOVEVSX1NJWkUpCisjZGVmaW5lIFZQOV9DT01QX0lOVEVSX1NUQVJUICAgICBcCisJCShWUDlfSU5URVJQX0lOVFJBX0lOVEVSX1NUQVJUK1ZQOV9JTlRFUlBfSU5UUkFfSU5URVJfU0laRSkKKyNkZWZpbmUgVlA5X0NPTVBfSU5URVJfU0laRSAgICAgIDUKKyNkZWZpbmUgVlA5X0NPTVBfUkVGX1NUQVJUICAgICAgIChWUDlfQ09NUF9JTlRFUl9TVEFSVCtWUDlfQ09NUF9JTlRFUl9TSVpFKQorI2RlZmluZSBWUDlfQ09NUF9SRUZfU0laRSAgICAgICAgNQorI2RlZmluZSBWUDlfU0lOR0xFX1JFRl9TVEFSVCAgICAgKFZQOV9DT01QX1JFRl9TVEFSVCtWUDlfQ09NUF9SRUZfU0laRSkKKyNkZWZpbmUgVlA5X1NJTkdMRV9SRUZfU0laRSAgICAgIDEwCisjZGVmaW5lIFZQOV9SRUZfTU9ERV9TVEFSVCAgICAgICBWUDlfQ09NUF9JTlRFUl9TVEFSVAorI2RlZmluZSBWUDlfUkVGX01PREVfU0laRSAgICAgICAgXAorCQkoVlA5X0NPTVBfSU5URVJfU0laRStWUDlfQ09NUF9SRUZfU0laRStWUDlfU0lOR0xFX1JFRl9TSVpFKQorI2RlZmluZSBWUDlfSUZfWV9NT0RFX1NUQVJUICAgICAgKFZQOV9SRUZfTU9ERV9TVEFSVCtWUDlfUkVGX01PREVfU0laRSkKKyNkZWZpbmUgVlA5X0lGX1lfTU9ERV9TSVpFICAgICAgIDM2CisjZGVmaW5lIFZQOV9JRl9VVl9NT0RFX1NUQVJUICAgICAoVlA5X0lGX1lfTU9ERV9TVEFSVCtWUDlfSUZfWV9NT0RFX1NJWkUpCisjZGVmaW5lIFZQOV9JRl9VVl9NT0RFX1NJWkUgICAgICA5MiAvKiBvbmx5IHVzZSA5MCovCisjZGVmaW5lIFZQOV9NVl9KT0lOVFNfU1RBUlQgICAgICAoVlA5X0lGX1VWX01PREVfU1RBUlQrVlA5X0lGX1VWX01PREVfU0laRSkKKyNkZWZpbmUgVlA5X01WX0pPSU5UU19TSVpFICAgICAgIDMKKyNkZWZpbmUgVlA5X01WX1NJR05fMF9TVEFSVCAgICAgIChWUDlfTVZfSk9JTlRTX1NUQVJUK1ZQOV9NVl9KT0lOVFNfU0laRSkKKyNkZWZpbmUgVlA5X01WX1NJR05fMF9TSVpFICAgICAgIDEKKyNkZWZpbmUgVlA5X01WX0NMQVNTRVNfMF9TVEFSVCAgIChWUDlfTVZfU0lHTl8wX1NUQVJUK1ZQOV9NVl9TSUdOXzBfU0laRSkKKyNkZWZpbmUgVlA5X01WX0NMQVNTRVNfMF9TSVpFICAgIDEwCisjZGVmaW5lIFZQOV9NVl9DTEFTUzBfMF9TVEFSVCAgICAoVlA5X01WX0NMQVNTRVNfMF9TVEFSVCtWUDlfTVZfQ0xBU1NFU18wX1NJWkUpCisjZGVmaW5lIFZQOV9NVl9DTEFTUzBfMF9TSVpFICAgICAxCisjZGVmaW5lIFZQOV9NVl9CSVRTXzBfU1RBUlQgICAgICAoVlA5X01WX0NMQVNTMF8wX1NUQVJUK1ZQOV9NVl9DTEFTUzBfMF9TSVpFKQorI2RlZmluZSBWUDlfTVZfQklUU18wX1NJWkUgICAgICAgMTAKKyNkZWZpbmUgVlA5X01WX1NJR05fMV9TVEFSVCAgICAgIChWUDlfTVZfQklUU18wX1NUQVJUK1ZQOV9NVl9CSVRTXzBfU0laRSkKKyNkZWZpbmUgVlA5X01WX1NJR05fMV9TSVpFICAgICAgIDEKKyNkZWZpbmUgVlA5X01WX0NMQVNTRVNfMV9TVEFSVCAgIFwKKwkJCShWUDlfTVZfU0lHTl8xX1NUQVJUK1ZQOV9NVl9TSUdOXzFfU0laRSkKKyNkZWZpbmUgVlA5X01WX0NMQVNTRVNfMV9TSVpFICAgIDEwCisjZGVmaW5lIFZQOV9NVl9DTEFTUzBfMV9TVEFSVCAgICBcCisJCQkoVlA5X01WX0NMQVNTRVNfMV9TVEFSVCtWUDlfTVZfQ0xBU1NFU18xX1NJWkUpCisjZGVmaW5lIFZQOV9NVl9DTEFTUzBfMV9TSVpFICAgICAxCisjZGVmaW5lIFZQOV9NVl9CSVRTXzFfU1RBUlQgICAgICBcCisJCQkoVlA5X01WX0NMQVNTMF8xX1NUQVJUK1ZQOV9NVl9DTEFTUzBfMV9TSVpFKQorI2RlZmluZSBWUDlfTVZfQklUU18xX1NJWkUgICAgICAgMTAKKyNkZWZpbmUgVlA5X01WX0NMQVNTMF9GUF8wX1NUQVJUIFwKKwkJCShWUDlfTVZfQklUU18xX1NUQVJUK1ZQOV9NVl9CSVRTXzFfU0laRSkKKyNkZWZpbmUgVlA5X01WX0NMQVNTMF9GUF8wX1NJWkUgIDkKKyNkZWZpbmUgVlA5X01WX0NMQVNTMF9GUF8xX1NUQVJUIFwKKwkJCShWUDlfTVZfQ0xBU1MwX0ZQXzBfU1RBUlQrVlA5X01WX0NMQVNTMF9GUF8wX1NJWkUpCisjZGVmaW5lIFZQOV9NVl9DTEFTUzBfRlBfMV9TSVpFICA5CisjZGVmaW5lIFZQOV9NVl9DTEFTUzBfSFBfMF9TVEFSVCBcCisJCQkoVlA5X01WX0NMQVNTMF9GUF8xX1NUQVJUK1ZQOV9NVl9DTEFTUzBfRlBfMV9TSVpFKQorI2RlZmluZSBWUDlfTVZfQ0xBU1MwX0hQXzBfU0laRSAgMgorI2RlZmluZSBWUDlfTVZfQ0xBU1MwX0hQXzFfU1RBUlQgXAorCQkJKFZQOV9NVl9DTEFTUzBfSFBfMF9TVEFSVCtWUDlfTVZfQ0xBU1MwX0hQXzBfU0laRSkKKyNkZWZpbmUgVlA5X01WX0NMQVNTMF9IUF8xX1NJWkUgIDIKKyNkZWZpbmUgVlA5X01WX1NUQVJUICAgICAgICAgICAgIFZQOV9NVl9KT0lOVFNfU1RBUlQKKyNkZWZpbmUgVlA5X01WX1NJWkUgICAgICAgICAgICAgIDcyIC8qb25seSB1c2UgNjkqLworCisjZGVmaW5lIFZQOV9UT1RBTF9TSVpFICAgICAgICAgICAoVlA5X01WX1NUQVJUICsgVlA5X01WX1NJWkUpCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCXZwOV9jb3VudF9tZW0gZGVmaW5lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisjZGVmaW5lIFZQOV9DT0VGX0NPVU5UX1NUQVJUICAgICAgICAgICAwCisjZGVmaW5lIFZQOV9DT0VGX0NPVU5UX0JBTkRfMF9PRkZTRVQgICAwCisjZGVmaW5lIFZQOV9DT0VGX0NPVU5UX0JBTkRfMV9PRkZTRVQgICBcCisJCQkoVlA5X0NPRUZfQ09VTlRfQkFORF8wX09GRlNFVCArIDMqNSkKKyNkZWZpbmUgVlA5X0NPRUZfQ09VTlRfQkFORF8yX09GRlNFVCAgIFwKKwkJCShWUDlfQ09FRl9DT1VOVF9CQU5EXzFfT0ZGU0VUICsgNio1KQorI2RlZmluZSBWUDlfQ09FRl9DT1VOVF9CQU5EXzNfT0ZGU0VUICAgXAorCQkJKFZQOV9DT0VGX0NPVU5UX0JBTkRfMl9PRkZTRVQgKyA2KjUpCisjZGVmaW5lIFZQOV9DT0VGX0NPVU5UX0JBTkRfNF9PRkZTRVQgICBcCisJCQkoVlA5X0NPRUZfQ09VTlRfQkFORF8zX09GRlNFVCArIDYqNSkKKyNkZWZpbmUgVlA5X0NPRUZfQ09VTlRfQkFORF81X09GRlNFVCAgIFwKKwkJCShWUDlfQ09FRl9DT1VOVF9CQU5EXzRfT0ZGU0VUICsgNio1KQorI2RlZmluZSBWUDlfQ09FRl9DT1VOVF9TSVpFX09ORV9TRVQgICAgMTY1IC8qICgoMyArNSo2KSo1ICovCisjZGVmaW5lIFZQOV9DT0VGX0NPVU5UXzRYNF9TVEFSVCAgICAgICBcCisJKFZQOV9DT0VGX0NPVU5UX1NUQVJUICsgMCpWUDlfQ09FRl9DT1VOVF9TSVpFX09ORV9TRVQpCisjZGVmaW5lIFZQOV9DT0VGX0NPVU5UXzhYOF9TVEFSVCAgICAgICBcCisJKFZQOV9DT0VGX0NPVU5UX1NUQVJUICsgNCpWUDlfQ09FRl9DT1VOVF9TSVpFX09ORV9TRVQpCisjZGVmaW5lIFZQOV9DT0VGX0NPVU5UXzE2WDE2X1NUQVJUICAgICBcCisJKFZQOV9DT0VGX0NPVU5UX1NUQVJUICsgOCpWUDlfQ09FRl9DT1VOVF9TSVpFX09ORV9TRVQpCisjZGVmaW5lIFZQOV9DT0VGX0NPVU5UXzMyWDMyX1NUQVJUICAgICBcCisJKFZQOV9DT0VGX0NPVU5UX1NUQVJUICsgMTIqVlA5X0NPRUZfQ09VTlRfU0laRV9PTkVfU0VUKQorI2RlZmluZSBWUDlfQ09FRl9DT1VOVF9TSVpFX1BMQU5FICAgICAgKDIgKiBWUDlfQ09FRl9DT1VOVF9TSVpFX09ORV9TRVQpCisjZGVmaW5lIFZQOV9DT0VGX0NPVU5UX1NJWkUgICAgICAgICAgICAoNCAqIDIgKiAyICogVlA5X0NPRUZfQ09VTlRfU0laRV9PTkVfU0VUKQorCisjZGVmaW5lIFZQOV9JTlRSQV9JTlRFUl9DT1VOVF9TVEFSVCAgICBcCisJKFZQOV9DT0VGX0NPVU5UX1NUQVJUK1ZQOV9DT0VGX0NPVU5UX1NJWkUpCisjZGVmaW5lIFZQOV9JTlRSQV9JTlRFUl9DT1VOVF9TSVpFICAgICAoNCoyKQorI2RlZmluZSBWUDlfQ09NUF9JTlRFUl9DT1VOVF9TVEFSVCAgICAgXAorCShWUDlfSU5UUkFfSU5URVJfQ09VTlRfU1RBUlQrVlA5X0lOVFJBX0lOVEVSX0NPVU5UX1NJWkUpCisjZGVmaW5lIFZQOV9DT01QX0lOVEVSX0NPVU5UX1NJWkUgICAgICAoNSoyKQorI2RlZmluZSBWUDlfQ09NUF9SRUZfQ09VTlRfU1RBUlQgICAgICAgXAorCShWUDlfQ09NUF9JTlRFUl9DT1VOVF9TVEFSVCtWUDlfQ09NUF9JTlRFUl9DT1VOVF9TSVpFKQorI2RlZmluZSBWUDlfQ09NUF9SRUZfQ09VTlRfU0laRSAgICAgICAgKDUqMikKKyNkZWZpbmUgVlA5X1NJTkdMRV9SRUZfQ09VTlRfU1RBUlQgICAgIFwKKwkoVlA5X0NPTVBfUkVGX0NPVU5UX1NUQVJUK1ZQOV9DT01QX1JFRl9DT1VOVF9TSVpFKQorI2RlZmluZSBWUDlfU0lOR0xFX1JFRl9DT1VOVF9TSVpFICAgICAgKDEwKjIpCisjZGVmaW5lIFZQOV9UWF9NT0RFX0NPVU5UX1NUQVJUICAgICAgICBcCisJKFZQOV9TSU5HTEVfUkVGX0NPVU5UX1NUQVJUK1ZQOV9TSU5HTEVfUkVGX0NPVU5UX1NJWkUpCisjZGVmaW5lIFZQOV9UWF9NT0RFX0NPVU5UX1NJWkUgICAgICAgICAoMTIqMikKKyNkZWZpbmUgVlA5X1NLSVBfQ09VTlRfU1RBUlQgICAgICAgICAgIFwKKwkoVlA5X1RYX01PREVfQ09VTlRfU1RBUlQrVlA5X1RYX01PREVfQ09VTlRfU0laRSkKKyNkZWZpbmUgVlA5X1NLSVBfQ09VTlRfU0laRSAgICAgICAgICAgICgzKjIpCisjZGVmaW5lIFZQOV9NVl9TSUdOXzBfQ09VTlRfU1RBUlQgICAgICBcCisJKFZQOV9TS0lQX0NPVU5UX1NUQVJUK1ZQOV9TS0lQX0NPVU5UX1NJWkUpCisjZGVmaW5lIFZQOV9NVl9TSUdOXzBfQ09VTlRfU0laRSAgICAgICAoMSoyKQorI2RlZmluZSBWUDlfTVZfU0lHTl8xX0NPVU5UX1NUQVJUICAgICAgXAorCShWUDlfTVZfU0lHTl8wX0NPVU5UX1NUQVJUK1ZQOV9NVl9TSUdOXzBfQ09VTlRfU0laRSkKKyNkZWZpbmUgVlA5X01WX1NJR05fMV9DT1VOVF9TSVpFICAgICAgICgxKjIpCisjZGVmaW5lIFZQOV9NVl9CSVRTXzBfQ09VTlRfU1RBUlQgICAgICBcCisJKFZQOV9NVl9TSUdOXzFfQ09VTlRfU1RBUlQrVlA5X01WX1NJR05fMV9DT1VOVF9TSVpFKQorI2RlZmluZSBWUDlfTVZfQklUU18wX0NPVU5UX1NJWkUgICAgICAgKDEwKjIpCisjZGVmaW5lIFZQOV9NVl9CSVRTXzFfQ09VTlRfU1RBUlQgICAgICBcCisJKFZQOV9NVl9CSVRTXzBfQ09VTlRfU1RBUlQrVlA5X01WX0JJVFNfMF9DT1VOVF9TSVpFKQorI2RlZmluZSBWUDlfTVZfQklUU18xX0NPVU5UX1NJWkUgICAgICAgKDEwKjIpCisjZGVmaW5lIFZQOV9NVl9DTEFTUzBfSFBfMF9DT1VOVF9TVEFSVCBcCisJKFZQOV9NVl9CSVRTXzFfQ09VTlRfU1RBUlQrVlA5X01WX0JJVFNfMV9DT1VOVF9TSVpFKQorI2RlZmluZSBWUDlfTVZfQ0xBU1MwX0hQXzBfQ09VTlRfU0laRSAgKDIqMikKKyNkZWZpbmUgVlA5X01WX0NMQVNTMF9IUF8xX0NPVU5UX1NUQVJUIFwKKwkoVlA5X01WX0NMQVNTMF9IUF8wX0NPVU5UX1NUQVJUK1ZQOV9NVl9DTEFTUzBfSFBfMF9DT1VOVF9TSVpFKQorI2RlZmluZSBWUDlfTVZfQ0xBU1MwX0hQXzFfQ09VTlRfU0laRSAgKDIqMikKKy8qIFN0YXJ0IG1lcmdlX3RyZWUqLworI2RlZmluZSBWUDlfSU5URVJfTU9ERV9DT1VOVF9TVEFSVCAgICAgXAorCShWUDlfTVZfQ0xBU1MwX0hQXzFfQ09VTlRfU1RBUlQrVlA5X01WX0NMQVNTMF9IUF8xX0NPVU5UX1NJWkUpCisjZGVmaW5lIFZQOV9JTlRFUl9NT0RFX0NPVU5UX1NJWkUgICAgICAoNyo0KQorI2RlZmluZSBWUDlfSUZfWV9NT0RFX0NPVU5UX1NUQVJUICAgICAgXAorCShWUDlfSU5URVJfTU9ERV9DT1VOVF9TVEFSVCtWUDlfSU5URVJfTU9ERV9DT1VOVF9TSVpFKQorI2RlZmluZSBWUDlfSUZfWV9NT0RFX0NPVU5UX1NJWkUgICAgICAgKDEwKjQpCisjZGVmaW5lIFZQOV9JRl9VVl9NT0RFX0NPVU5UX1NUQVJUICAgICBcCisJKFZQOV9JRl9ZX01PREVfQ09VTlRfU1RBUlQrVlA5X0lGX1lfTU9ERV9DT1VOVF9TSVpFKQorI2RlZmluZSBWUDlfSUZfVVZfTU9ERV9DT1VOVF9TSVpFICAgICAgKDEwKjEwKQorI2RlZmluZSBWUDlfUEFSVElUSU9OX1BfQ09VTlRfU1RBUlQgICAgXAorCShWUDlfSUZfVVZfTU9ERV9DT1VOVF9TVEFSVCtWUDlfSUZfVVZfTU9ERV9DT1VOVF9TSVpFKQorI2RlZmluZSBWUDlfUEFSVElUSU9OX1BfQ09VTlRfU0laRSAgICAgKDQqNCo0KQorI2RlZmluZSBWUDlfSU5URVJQX0NPVU5UX1NUQVJUICAgICAgICAgXAorCShWUDlfUEFSVElUSU9OX1BfQ09VTlRfU1RBUlQrVlA5X1BBUlRJVElPTl9QX0NPVU5UX1NJWkUpCisjZGVmaW5lIFZQOV9JTlRFUlBfQ09VTlRfU0laRSAgICAgICAgICAoNCozKQorI2RlZmluZSBWUDlfTVZfSk9JTlRTX0NPVU5UX1NUQVJUICAgICAgXAorCShWUDlfSU5URVJQX0NPVU5UX1NUQVJUK1ZQOV9JTlRFUlBfQ09VTlRfU0laRSkKKyNkZWZpbmUgVlA5X01WX0pPSU5UU19DT1VOVF9TSVpFICAgICAgICgxICogNCkKKyNkZWZpbmUgVlA5X01WX0NMQVNTRVNfMF9DT1VOVF9TVEFSVCAgIFwKKwkoVlA5X01WX0pPSU5UU19DT1VOVF9TVEFSVCtWUDlfTVZfSk9JTlRTX0NPVU5UX1NJWkUpCisjZGVmaW5lIFZQOV9NVl9DTEFTU0VTXzBfQ09VTlRfU0laRSAgICAoMSoxMSkKKyNkZWZpbmUgVlA5X01WX0NMQVNTMF8wX0NPVU5UX1NUQVJUICAgIFwKKwkoVlA5X01WX0NMQVNTRVNfMF9DT1VOVF9TVEFSVCtWUDlfTVZfQ0xBU1NFU18wX0NPVU5UX1NJWkUpCisjZGVmaW5lIFZQOV9NVl9DTEFTUzBfMF9DT1VOVF9TSVpFICAgICAoMSoyKQorI2RlZmluZSBWUDlfTVZfQ0xBU1NFU18xX0NPVU5UX1NUQVJUICAgXAorCShWUDlfTVZfQ0xBU1MwXzBfQ09VTlRfU1RBUlQrVlA5X01WX0NMQVNTMF8wX0NPVU5UX1NJWkUpCisjZGVmaW5lIFZQOV9NVl9DTEFTU0VTXzFfQ09VTlRfU0laRSAgICAoMSoxMSkKKyNkZWZpbmUgVlA5X01WX0NMQVNTMF8xX0NPVU5UX1NUQVJUICAgIFwKKwkoVlA5X01WX0NMQVNTRVNfMV9DT1VOVF9TVEFSVCtWUDlfTVZfQ0xBU1NFU18xX0NPVU5UX1NJWkUpCisjZGVmaW5lIFZQOV9NVl9DTEFTUzBfMV9DT1VOVF9TSVpFICAgICAoMSoyKQorI2RlZmluZSBWUDlfTVZfQ0xBU1MwX0ZQXzBfQ09VTlRfU1RBUlQgXAorCShWUDlfTVZfQ0xBU1MwXzFfQ09VTlRfU1RBUlQrVlA5X01WX0NMQVNTMF8xX0NPVU5UX1NJWkUpCisjZGVmaW5lIFZQOV9NVl9DTEFTUzBfRlBfMF9DT1VOVF9TSVpFICAoMyo0KQorI2RlZmluZSBWUDlfTVZfQ0xBU1MwX0ZQXzFfQ09VTlRfU1RBUlQgXAorCShWUDlfTVZfQ0xBU1MwX0ZQXzBfQ09VTlRfU1RBUlQrVlA5X01WX0NMQVNTMF9GUF8wX0NPVU5UX1NJWkUpCisjZGVmaW5lIFZQOV9NVl9DTEFTUzBfRlBfMV9DT1VOVF9TSVpFICAoMyo0KQorCisKKyNkZWZpbmUgRENfUFJFRCAgICAwICAgICAgIC8qIEF2ZXJhZ2Ugb2YgYWJvdmUgYW5kIGxlZnQgcGl4ZWxzKi8KKyNkZWZpbmUgVl9QUkVEICAgICAxICAgICAgIC8qIFZlcnRpY2FsKi8KKyNkZWZpbmUgSF9QUkVEICAgICAyICAgICAgIC8qIEhvcml6b250YWwqLworI2RlZmluZSBENDVfUFJFRCAgIDMgICAgICAgLypEaXJlY3Rpb25hbCA0NSBkZWcgPSByb3VuZChhcmN0YW4oMS8xKSAqIDE4MC9waSkqLworI2RlZmluZSBEMTM1X1BSRUQgIDQgICAgICAgLyogRGlyZWN0aW9uYWwgMTM1IGRlZyA9IDE4MCAtIDQ1Ki8KKyNkZWZpbmUgRDExN19QUkVEICA1ICAgICAgIC8qIERpcmVjdGlvbmFsIDExNyBkZWcgPSAxODAgLSA2MyovCisjZGVmaW5lIEQxNTNfUFJFRCAgNiAgICAgICAvKiBEaXJlY3Rpb25hbCAxNTMgZGVnID0gMTgwIC0gMjcqLworI2RlZmluZSBEMjA3X1BSRUQgIDcgICAgICAgLyogRGlyZWN0aW9uYWwgMjA3IGRlZyA9IDE4MCArIDI3Ki8KKyNkZWZpbmUgRDYzX1BSRUQgICA4ICAgICAgIC8qRGlyZWN0aW9uYWwgNjMgZGVnID0gcm91bmQoYXJjdGFuKDIvMSkgKiAxODAvcGkpKi8KKyNkZWZpbmUgVE1fUFJFRCAgICA5ICAgICAgIC8qVHJ1ZS1tb3Rpb24qLworCitpbnQgY2xpcF9wcm9iKGludCBwKQoreworCXJldHVybiAocCA+IDI1NSkgPyAyNTUgOiAocCA8IDEpID8gMSA6IHA7Cit9CisKKyNkZWZpbmUgUk9VTkRfUE9XRVJfT0ZfVFdPKHZhbHVlLCBuKSBcCisJKCgodmFsdWUpICsgKDEgPDwgKChuKSAtIDEpKSkgPj4gKG4pKQorCisjZGVmaW5lIE1PREVfTVZfQ09VTlRfU0FUIDIwCitzdGF0aWMgY29uc3QgaW50IGNvdW50X3RvX3VwZGF0ZV9mYWN0b3JbTU9ERV9NVl9DT1VOVF9TQVQgKyAxXSA9IHsKKwkwLCA2LCAxMiwgMTksIDI1LCAzMiwgMzgsIDQ0LCA1MSwgNTcsIDY0LAorCTcwLCA3NiwgODMsIDg5LCA5NiwgMTAyLCAxMDgsIDExNSwgMTIxLCAxMjgKK307CisKK3ZvaWQgICB2cDlfdHJlZV9tZXJnZV9wcm9icyh1bnNpZ25lZCBpbnQgKnByZXZfcHJvYiwgdW5zaWduZWQgaW50ICpjdXJfcHJvYiwKKwlpbnQgY29lZl9ub2RlX3N0YXJ0LCBpbnQgdHJlZV9sZWZ0LCBpbnQgdHJlZV9yaWdodCwgaW50IHRyZWVfaSwKKwlpbnQgbm9kZSkgeworCisJaW50IHByb2JfMzIsIHByb2JfcmVzLCBwcm9iX3NoaWZ0OworCWludCBwcmVfcHJvYiwgbmV3X3Byb2I7CisJaW50IGRlbiwgbV9jb3VudCwgZ2V0X3Byb2IsIGZhY3RvcjsKKworCXByb2JfMzIgPSBwcmV2X3Byb2JbY29lZl9ub2RlX3N0YXJ0IC8gNCAqIDJdOworCXByb2JfcmVzID0gY29lZl9ub2RlX3N0YXJ0ICYgMzsKKwlwcm9iX3NoaWZ0ID0gcHJvYl9yZXMgKiA4OworCXByZV9wcm9iID0gKHByb2JfMzIgPj4gcHJvYl9zaGlmdCkgJiAweGZmOworCisJZGVuID0gdHJlZV9sZWZ0ICsgdHJlZV9yaWdodDsKKworCWlmIChkZW4gPT0gMCkKKwkJbmV3X3Byb2IgPSBwcmVfcHJvYjsKKwllbHNlIHsKKwkJbV9jb3VudCA9IChkZW4gPCBNT0RFX01WX0NPVU5UX1NBVCkgPworCQkJZGVuIDogTU9ERV9NVl9DT1VOVF9TQVQ7CisJCWdldF9wcm9iID0gY2xpcF9wcm9iKAorCQkJCWRpdl9yMzIoKChpbnQ2NF90KXRyZWVfbGVmdCAqIDI1NiArIChkZW4gPj4gMSkpLAorCQkJCWRlbikpOworCQkvKndlaWdodGVkX3Byb2IqLworCQlmYWN0b3IgPSBjb3VudF90b191cGRhdGVfZmFjdG9yW21fY291bnRdOworCQluZXdfcHJvYiA9IFJPVU5EX1BPV0VSX09GX1RXTyhwcmVfcHJvYiAqICgyNTYgLSBmYWN0b3IpCisJCQkJKyBnZXRfcHJvYiAqIGZhY3RvciwgOCk7CisJfQorCWN1cl9wcm9iW2NvZWZfbm9kZV9zdGFydCAvIDQgKiAyXSA9IChjdXJfcHJvYltjb2VmX25vZGVfc3RhcnQgLyA0ICogMl0KKwkJCSYgKH4oMHhmZiA8PCBwcm9iX3NoaWZ0KSkpIHwgKG5ld19wcm9iIDw8IHByb2Jfc2hpZnQpOworCisJLypwcl9pbmZvKCIgLSBbJWRdWyVkXSAweCUwMlggLS0+IDB4JTAyWCAoMHglWCAweCVYKSAoJVgpXG4iLAorCSAqdHJlZV9pLCBub2RlLCBwcmVfcHJvYiwgbmV3X3Byb2IsIHRyZWVfbGVmdCwgdHJlZV9yaWdodCwKKwkgKmN1cl9wcm9iW2NvZWZfbm9kZV9zdGFydC80KjJdKTsKKwkgKi8KK30KKworCisvKnZvaWQgYWRhcHRfY29lZl9wcm9icyh2b2lkKSovCit2b2lkIGFkYXB0X2NvZWZfcHJvYnMoaW50IHBpY19jb3VudCwgaW50IHByZXZfa2YsIGludCBjdXJfa2YsIGludCBwcmVfZmMsCisJdW5zaWduZWQgaW50ICpwcmV2X3Byb2IsIHVuc2lnbmVkIGludCAqY3VyX3Byb2IsIHVuc2lnbmVkIGludCAqY291bnQpCit7CisJLyogODAgKiA2NGJpdHMgPSAweEYwMCAoIHVzZSAweDEwMDAgNEsgYnl0ZXMpCisJICp1bnNpZ25lZCBpbnQgcHJldl9wcm9iWzQ5NioyXTsKKwkgKnVuc2lnbmVkIGludCBjdXJfcHJvYls0OTYqMl07CisJICoweDMwMCAqIDEyOGJpdHMgPSAweDMwMDAgKDMySyBCeXRlcykKKwkgKnVuc2lnbmVkIGludCBjb3VudFsweDMwMCo0XTsKKwkgKi8KKworCWludCB0eF9zaXplLCBjb2VmX3R4X3NpemVfc3RhcnQsIGNvZWZfY291bnRfdHhfc2l6ZV9zdGFydDsKKwlpbnQgcGxhbmUsIGNvZWZfcGxhbmVfc3RhcnQsIGNvZWZfY291bnRfcGxhbmVfc3RhcnQ7CisJaW50IHR5cGUsIGNvZWZfdHlwZV9zdGFydCwgY29lZl9jb3VudF90eXBlX3N0YXJ0OworCWludCBiYW5kLCBjb2VmX2JhbmRfc3RhcnQsIGNvZWZfY291bnRfYmFuZF9zdGFydDsKKwlpbnQgY3h0X251bTsKKwlpbnQgY3h0LCBjb2VmX2N4dF9zdGFydCwgY29lZl9jb3VudF9jeHRfc3RhcnQ7CisJaW50IG5vZGUsIGNvZWZfbm9kZV9zdGFydCwgY29lZl9jb3VudF9ub2RlX3N0YXJ0OworCisJaW50IHRyZWVfaSwgdHJlZV9sZWZ0LCB0cmVlX3JpZ2h0OworCWludCBtdmRfaTsKKworCWludCBjb3VudF9zYXQgPSAyNDsKKwkvKmludCB1cGRhdGVfZmFjdG9yID0gMTEyOyovIC8qSWYgQ09FRl9NQVhfVVBEQVRFX0ZBQ1RPUl9BRlRFUl9LRVksCisJICp1c2UgMTI4CisJICovCisJLyogSWYgQ09FRl9NQVhfVVBEQVRFX0ZBQ1RPUl9BRlRFUl9LRVksIHVzZSAxMjgqLworCS8qaW50IHVwZGF0ZV9mYWN0b3IgPSAocGljX2NvdW50ID09IDEpID8gMTI4IDogMTEyOyovCisJaW50IHVwZGF0ZV9mYWN0b3IgPSAgIGN1cl9rZiA/IDExMiA6CisJCQlwcmV2X2tmID8gMTI4IDogMTEyOworCisJaW50IHByb2JfMzI7CisJaW50IHByb2JfcmVzOworCWludCBwcm9iX3NoaWZ0OworCWludCBwcmVfcHJvYjsKKworCWludCBudW0sIGRlbjsKKwlpbnQgZ2V0X3Byb2I7CisJaW50IG1fY291bnQ7CisJaW50IGZhY3RvcjsKKworCWludCBuZXdfcHJvYjsKKworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19NRVJHRSkKKwkJcHJfaW5mbworCSgiXG4gIyNhZGFwdF9jb2VmX3Byb2JzIChwcmVfZmMgOiAlZCAscHJldl9rZiA6ICVkLGN1cl9rZiA6ICVkKSMjXG5cbiIsCisJcHJlX2ZjLCBwcmV2X2tmLCBjdXJfa2YpOworCisJLyphZGFwdF9jb2VmX3Byb2JzKi8KKwlmb3IgKHR4X3NpemUgPSAwOyB0eF9zaXplIDwgNDsgdHhfc2l6ZSsrKSB7CisJCWNvZWZfdHhfc2l6ZV9zdGFydCA9IFZQOV9DT0VGX1NUQVJUCisJCQkrIHR4X3NpemUgKiA0ICogVlA5X0NPRUZfU0laRV9PTkVfU0VUOworCQljb2VmX2NvdW50X3R4X3NpemVfc3RhcnQgPSBWUDlfQ09FRl9DT1VOVF9TVEFSVAorCQkJKyB0eF9zaXplICogNCAqIFZQOV9DT0VGX0NPVU5UX1NJWkVfT05FX1NFVDsKKwkJY29lZl9wbGFuZV9zdGFydCA9IGNvZWZfdHhfc2l6ZV9zdGFydDsKKwkJY29lZl9jb3VudF9wbGFuZV9zdGFydCA9IGNvZWZfY291bnRfdHhfc2l6ZV9zdGFydDsKKwkJZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgMjsgcGxhbmUrKykgeworCQkJY29lZl90eXBlX3N0YXJ0ID0gY29lZl9wbGFuZV9zdGFydDsKKwkJCWNvZWZfY291bnRfdHlwZV9zdGFydCA9IGNvZWZfY291bnRfcGxhbmVfc3RhcnQ7CisJCQlmb3IgKHR5cGUgPSAwOyB0eXBlIDwgMjsgdHlwZSsrKSB7CisJCQkJY29lZl9iYW5kX3N0YXJ0ID0gY29lZl90eXBlX3N0YXJ0OworCQkJCWNvZWZfY291bnRfYmFuZF9zdGFydCA9IGNvZWZfY291bnRfdHlwZV9zdGFydDsKKwkJCQlmb3IgKGJhbmQgPSAwOyBiYW5kIDwgNjsgYmFuZCsrKSB7CisJCQkJCWlmIChiYW5kID09IDApCisJCQkJCQljeHRfbnVtID0gMzsKKwkJCQkJZWxzZQorCQkJCQkJY3h0X251bSA9IDY7CisJCQkJCWNvZWZfY3h0X3N0YXJ0ID0gY29lZl9iYW5kX3N0YXJ0OworCQkJCQljb2VmX2NvdW50X2N4dF9zdGFydCA9CisJCQkJCQljb2VmX2NvdW50X2JhbmRfc3RhcnQ7CisJCQkJCWZvciAoY3h0ID0gMDsgY3h0IDwgY3h0X251bTsgY3h0KyspIHsKKwkJCQkJCWNvbnN0IGludCBuMCA9CisJCQkJCQljb3VudFtjb2VmX2NvdW50X2N4dF9zdGFydF07CisJCQkJCQljb25zdCBpbnQgbjEgPQorCQkJCQkJY291bnRbY29lZl9jb3VudF9jeHRfc3RhcnQgKyAxXTsKKwkJCQkJCWNvbnN0IGludCBuMiA9CisJCQkJCQljb3VudFtjb2VmX2NvdW50X2N4dF9zdGFydCArIDJdOworCQkJCQkJY29uc3QgaW50IG5lb2IgPQorCQkJCQkJY291bnRbY29lZl9jb3VudF9jeHRfc3RhcnQgKyAzXTsKKwkJCQkJCWNvbnN0IGludCBubmVvYiA9CisJCQkJCQljb3VudFtjb2VmX2NvdW50X2N4dF9zdGFydCArIDRdOworCQkJCQkJY29uc3QgdW5zaWduZWQgaW50CisJCQkJCQlicmFuY2hfY3RbM11bMl0gPSB7CisJCQkJCQl7IG5lb2IsIG5uZW9iIH0sCisJCQkJCQl7IG4wLCBuMSArIG4yIH0sCisJCQkJCQl7IG4xLCBuMiB9CisJCQkJCQl9OworCQkJCQkJY29lZl9ub2RlX3N0YXJ0ID0KKwkJCQkJCQljb2VmX2N4dF9zdGFydDsKKwkJCQkJCWZvcgorCQkJCQkJKG5vZGUgPSAwOyBub2RlIDwgMzsgbm9kZSsrKSB7CisJCQkJCQkJcHJvYl8zMiA9CisJCQkJCQkJcHJldl9wcm9iWworCQkJCQkJCWNvZWZfbm9kZV9zdGFydAorCQkJCQkJCS8gNCAqIDJdOworCQkJCQkJCXByb2JfcmVzID0KKwkJCQkJCQljb2VmX25vZGVfc3RhcnQgJiAzOworCQkJCQkJCXByb2Jfc2hpZnQgPQorCQkJCQkJCXByb2JfcmVzICogODsKKwkJCQkJCQlwcmVfcHJvYiA9CisJCQkJCQkJKHByb2JfMzIgPj4gcHJvYl9zaGlmdCkKKwkJCQkJCQkmIDB4ZmY7CisKKwkJCQkJCQkvKmdldF9iaW5hcnlfcHJvYiovCisJCQkJCQkJbnVtID0KKwkJCQkJCQlicmFuY2hfY3Rbbm9kZV1bMF07CisJCQkJCQkJZGVuID0KKwkJCQkJCQlicmFuY2hfY3Rbbm9kZV1bMF0gKworCQkJCQkJCSBicmFuY2hfY3Rbbm9kZV1bMV07CisJCQkJCQkJbV9jb3VudCA9IChkZW4gPAorCQkJCQkJCWNvdW50X3NhdCkKKwkJCQkJCQk/IGRlbiA6IGNvdW50X3NhdDsKKworCQkJCQkJCWdldF9wcm9iID0KKwkJCQkJCQkoZGVuID09IDApID8gMTI4dSA6CisJCQkJCQkJY2xpcF9wcm9iKAorCQkJCQkJCWRpdl9yMzIoKChpbnQ2NF90KQorCQkJCQkJCW51bSAqIDI1NgorCQkJCQkJCSsgKGRlbiA+PiAxKSksCisJCQkJCQkJZGVuKSk7CisKKwkJCQkJCQlmYWN0b3IgPQorCQkJCQkJCXVwZGF0ZV9mYWN0b3IgKiBtX2NvdW50CisJCQkJCQkJLyBjb3VudF9zYXQ7CisJCQkJCQkJbmV3X3Byb2IgPQorCQkJCQkJCVJPVU5EX1BPV0VSX09GX1RXTworCQkJCQkJCShwcmVfcHJvYiAqCisJCQkJCQkJKDI1NiAtIGZhY3RvcikgKworCQkJCQkJCWdldF9wcm9iICogZmFjdG9yLCA4KTsKKworCQkJCQkJCWN1cl9wcm9iW2NvZWZfbm9kZV9zdGFydAorCQkJCQkJCS8gNCAqIDJdID0KKwkJCQkJCQkoY3VyX3Byb2IKKwkJCQkJCQlbY29lZl9ub2RlX3N0YXJ0CisJCQkJCQkJLyA0ICogMl0gJiAofigweGZmIDw8CisJCQkJCQkJcHJvYl9zaGlmdCkpKSB8CisJCQkJCQkJKG5ld19wcm9iIDw8CisJCQkJCQkJcHJvYl9zaGlmdCk7CisKKwkJCQkJCQljb2VmX25vZGVfc3RhcnQgKz0gMTsKKwkJCQkJCX0KKworCQkJCQkJY29lZl9jeHRfc3RhcnQgPQorCQkJCQkJCWNvZWZfY3h0X3N0YXJ0ICsgMzsKKwkJCQkJCWNvZWZfY291bnRfY3h0X3N0YXJ0ID0KKwkJCQkJCQljb2VmX2NvdW50X2N4dF9zdGFydAorCQkJCQkJCSsgNTsKKwkJCQkJfQorCQkJCQlpZiAoYmFuZCA9PSAwKSB7CisJCQkJCQljb2VmX2JhbmRfc3RhcnQgKz0gMTA7CisJCQkJCQljb2VmX2NvdW50X2JhbmRfc3RhcnQgKz0gMTU7CisJCQkJCX0gZWxzZSB7CisJCQkJCQljb2VmX2JhbmRfc3RhcnQgKz0gMTg7CisJCQkJCQljb2VmX2NvdW50X2JhbmRfc3RhcnQgKz0gMzA7CisJCQkJCX0KKwkJCQl9CisJCQkJY29lZl90eXBlX3N0YXJ0ICs9IFZQOV9DT0VGX1NJWkVfT05FX1NFVDsKKwkJCQljb2VmX2NvdW50X3R5cGVfc3RhcnQgKz0KKwkJCQkJVlA5X0NPRUZfQ09VTlRfU0laRV9PTkVfU0VUOworCQkJfQorCQkJY29lZl9wbGFuZV9zdGFydCArPSAyICogVlA5X0NPRUZfU0laRV9PTkVfU0VUOworCQkJY29lZl9jb3VudF9wbGFuZV9zdGFydCArPQorCQkJCQkyICogVlA5X0NPRUZfQ09VTlRfU0laRV9PTkVfU0VUOworCQl9CisJfQorCisJaWYgKGN1cl9rZiA9PSAwKSB7CisJCS8qbW9kZV9tdl9tZXJnZV9wcm9icyAtIG1lcmdlX2ludHJhX2ludGVyX3Byb2IqLworCQlmb3IgKGNvZWZfY291bnRfbm9kZV9zdGFydCA9IFZQOV9JTlRSQV9JTlRFUl9DT1VOVF9TVEFSVDsKKwkJY29lZl9jb3VudF9ub2RlX3N0YXJ0IDwgKFZQOV9NVl9DTEFTUzBfSFBfMV9DT1VOVF9TVEFSVCArCisJCVZQOV9NVl9DTEFTUzBfSFBfMV9DT1VOVF9TSVpFKTsJY29lZl9jb3VudF9ub2RlX3N0YXJ0ICs9IDIpIHsKKworCQkJaWYgKGNvZWZfY291bnRfbm9kZV9zdGFydCA9PQorCQkJCVZQOV9JTlRSQV9JTlRFUl9DT1VOVF9TVEFSVCkgeworCQkJCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19NRVJHRSkKKwkJCQkJcHJfaW5mbygiICMgbWVyZ2VfaW50cmFfaW50ZXJfcHJvYlxuIik7CisJCQkJY29lZl9ub2RlX3N0YXJ0ID0gVlA5X0lOVFJBX0lOVEVSX1NUQVJUOworCQkJfSBlbHNlIGlmIChjb2VmX2NvdW50X25vZGVfc3RhcnQgPT0KKwkJCQlWUDlfQ09NUF9JTlRFUl9DT1VOVF9TVEFSVCkgeworCQkJCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19NRVJHRSkKKwkJCQkJcHJfaW5mbygiICMgbWVyZ2VfY29tcF9pbnRlcl9wcm9iXG4iKTsKKwkJCQljb2VmX25vZGVfc3RhcnQgPSBWUDlfQ09NUF9JTlRFUl9TVEFSVDsKKwkJCX0KKwkJCS8qCisJCQkgKmVsc2UgaWYgKGNvZWZfY291bnRfbm9kZV9zdGFydCA9PQorCQkJICoJVlA5X0NPTVBfUkVGX0NPVU5UX1NUQVJUKSB7CisJCQkgKglwcl9pbmZvKCIgIyBtZXJnZV9jb21wX2ludGVyX3Byb2JcbiIpOworCQkJICoJY29lZl9ub2RlX3N0YXJ0ID0gVlA5X0NPTVBfUkVGX1NUQVJUOworCQkJICp9CisJCQkgKmVsc2UgaWYgKGNvZWZfY291bnRfbm9kZV9zdGFydCA9PQorCQkJICoJVlA5X1NJTkdMRV9SRUZfQ09VTlRfU1RBUlQpIHsKKwkJCSAqCXByX2luZm8oIiAjIG1lcmdlX2NvbXBfaW50ZXJfcHJvYlxuIik7CisJCQkgKgljb2VmX25vZGVfc3RhcnQgPSBWUDlfU0lOR0xFX1JFRl9TVEFSVDsKKwkJCSAqfQorCQkJICovCisJCQllbHNlIGlmIChjb2VmX2NvdW50X25vZGVfc3RhcnQgPT0KKwkJCQlWUDlfVFhfTU9ERV9DT1VOVF9TVEFSVCkgeworCQkJCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19NRVJHRSkKKwkJCQkJcHJfaW5mbygiICMgbWVyZ2VfdHhfbW9kZV9wcm9ic1xuIik7CisJCQkJY29lZl9ub2RlX3N0YXJ0ID0gVlA5X1RYX01PREVfU1RBUlQ7CisJCQl9IGVsc2UgaWYgKGNvZWZfY291bnRfbm9kZV9zdGFydCA9PQorCQkJCVZQOV9TS0lQX0NPVU5UX1NUQVJUKSB7CisJCQkJaWYgKGRlYnVnICYgVlA5X0RFQlVHX01FUkdFKQorCQkJCQlwcl9pbmZvKCIgIyBtZXJnZV9za2lwX3Byb2JzXG4iKTsKKwkJCQljb2VmX25vZGVfc3RhcnQgPSBWUDlfU0tJUF9TVEFSVDsKKwkJCX0gZWxzZSBpZiAoY29lZl9jb3VudF9ub2RlX3N0YXJ0ID09CisJCQkJVlA5X01WX1NJR05fMF9DT1VOVF9TVEFSVCkgeworCQkJCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19NRVJHRSkKKwkJCQkJcHJfaW5mbygiICMgbWVyZ2Vfc2lnbl8wXG4iKTsKKwkJCQljb2VmX25vZGVfc3RhcnQgPSBWUDlfTVZfU0lHTl8wX1NUQVJUOworCQkJfSBlbHNlIGlmIChjb2VmX2NvdW50X25vZGVfc3RhcnQgPT0KKwkJCQlWUDlfTVZfU0lHTl8xX0NPVU5UX1NUQVJUKSB7CisJCQkJaWYgKGRlYnVnICYgVlA5X0RFQlVHX01FUkdFKQorCQkJCQlwcl9pbmZvKCIgIyBtZXJnZV9zaWduXzFcbiIpOworCQkJCWNvZWZfbm9kZV9zdGFydCA9IFZQOV9NVl9TSUdOXzFfU1RBUlQ7CisJCQl9IGVsc2UgaWYgKGNvZWZfY291bnRfbm9kZV9zdGFydCA9PQorCQkJCVZQOV9NVl9CSVRTXzBfQ09VTlRfU1RBUlQpIHsKKwkJCQlpZiAoZGVidWcgJiBWUDlfREVCVUdfTUVSR0UpCisJCQkJCXByX2luZm8oIiAjIG1lcmdlX2JpdHNfMFxuIik7CisJCQkJY29lZl9ub2RlX3N0YXJ0ID0gVlA5X01WX0JJVFNfMF9TVEFSVDsKKwkJCX0gZWxzZSBpZiAoY29lZl9jb3VudF9ub2RlX3N0YXJ0ID09CisJCQkJVlA5X01WX0JJVFNfMV9DT1VOVF9TVEFSVCkgeworCQkJCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19NRVJHRSkKKwkJCQkJcHJfaW5mbygiICMgbWVyZ2VfYml0c18xXG4iKTsKKwkJCQljb2VmX25vZGVfc3RhcnQgPSBWUDlfTVZfQklUU18xX1NUQVJUOworCQkJfSBlbHNlIGlmIChjb2VmX2NvdW50X25vZGVfc3RhcnQgPT0KKwkJCQkJVlA5X01WX0NMQVNTMF9IUF8wX0NPVU5UX1NUQVJUKSB7CisJCQkJaWYgKGRlYnVnICYgVlA5X0RFQlVHX01FUkdFKQorCQkJCQlwcl9pbmZvKCIgIyBtZXJnZV9jbGFzczBfaHBcbiIpOworCQkJCWNvZWZfbm9kZV9zdGFydCA9IFZQOV9NVl9DTEFTUzBfSFBfMF9TVEFSVDsKKwkJCX0KKworCisJCWRlbiA9IGNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydF0gKworCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMV07CisKKwkJcHJvYl8zMiA9IHByZXZfcHJvYltjb2VmX25vZGVfc3RhcnQgLyA0ICogMl07CisJCXByb2JfcmVzID0gY29lZl9ub2RlX3N0YXJ0ICYgMzsKKwkJcHJvYl9zaGlmdCA9IHByb2JfcmVzICogODsKKwkJcHJlX3Byb2IgPSAocHJvYl8zMiA+PiBwcm9iX3NoaWZ0KSAmIDB4ZmY7CisKKwkJaWYgKGRlbiA9PSAwKQorCQkJbmV3X3Byb2IgPSBwcmVfcHJvYjsKKwkJZWxzZSB7CisJCQltX2NvdW50ID0gKGRlbiA8IE1PREVfTVZfQ09VTlRfU0FUKSA/CisJCQkJZGVuIDogTU9ERV9NVl9DT1VOVF9TQVQ7CisJCQlnZXRfcHJvYiA9CisJCQkJY2xpcF9wcm9iKAorCQkJCWRpdl9yMzIoKChpbnQ2NF90KWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydF0KKwkJCQkqIDI1NiArIChkZW4gPj4gMSkpLAorCQkJCWRlbikpOworCQkJLyp3ZWlnaHRlZF9wcm9iKi8KKwkJCWZhY3RvciA9IGNvdW50X3RvX3VwZGF0ZV9mYWN0b3JbbV9jb3VudF07CisJCQluZXdfcHJvYiA9CisJCQkJUk9VTkRfUE9XRVJfT0ZfVFdPKHByZV9wcm9iICogKDI1NiAtIGZhY3RvcikKKwkJCQkrIGdldF9wcm9iICogZmFjdG9yLCA4KTsKKwkJfQorCQljdXJfcHJvYltjb2VmX25vZGVfc3RhcnQgLyA0ICogMl0gPQorCQkJKGN1cl9wcm9iW2NvZWZfbm9kZV9zdGFydCAvIDQgKiAyXSAmCisJCQkofigweGZmIDw8IHByb2Jfc2hpZnQpKSkKKwkJCXwgKG5ld19wcm9iIDw8IHByb2Jfc2hpZnQpOworCisJCWNvZWZfbm9kZV9zdGFydCA9IGNvZWZfbm9kZV9zdGFydCArIDE7CisJfQorCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19NRVJHRSkKKwkJcHJfaW5mbygiICMgbWVyZ2VfdnA5X2ludGVyX21vZGVfdHJlZVxuIik7CisJY29lZl9ub2RlX3N0YXJ0ID0gVlA5X0lOVEVSX01PREVfU1RBUlQ7CisJY29lZl9jb3VudF9ub2RlX3N0YXJ0ID0gVlA5X0lOVEVSX01PREVfQ09VTlRfU1RBUlQ7CisJZm9yICh0cmVlX2kgPSAwOyB0cmVlX2kgPCA3OyB0cmVlX2krKykgeworCQlmb3IgKG5vZGUgPSAwOyBub2RlIDwgMzsgbm9kZSsrKSB7CisJCQlzd2l0Y2ggKG5vZGUpIHsKKwkJCWNhc2UgMjoKKwkJCQl0cmVlX2xlZnQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDFdOworCQkJCXRyZWVfcmlnaHQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDNdOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCXRyZWVfbGVmdCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMF07CisJCQkJdHJlZV9yaWdodCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMV0KKwkJCQkrIGNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDNdOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl0cmVlX2xlZnQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDJdOworCQkJCXRyZWVfcmlnaHQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDBdCisJCQkJKyBjb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAxXQorCQkJCSsgY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgM107CisJCQkJYnJlYWs7CisKKwkJCX0KKworCQkJdnA5X3RyZWVfbWVyZ2VfcHJvYnMocHJldl9wcm9iLCBjdXJfcHJvYiwKKwkJCQljb2VmX25vZGVfc3RhcnQsIHRyZWVfbGVmdCwgdHJlZV9yaWdodCwKKwkJCQl0cmVlX2ksIG5vZGUpOworCisJCQljb2VmX25vZGVfc3RhcnQgPSBjb2VmX25vZGVfc3RhcnQgKyAxOworCQl9CisJCWNvZWZfY291bnRfbm9kZV9zdGFydCA9IGNvZWZfY291bnRfbm9kZV9zdGFydCArIDQ7CisJfQorCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19NRVJHRSkKKwkJcHJfaW5mbygiICMgbWVyZ2VfdnA5X2ludHJhX21vZGVfdHJlZVxuIik7CisJY29lZl9ub2RlX3N0YXJ0ID0gVlA5X0lGX1lfTU9ERV9TVEFSVDsKKwljb2VmX2NvdW50X25vZGVfc3RhcnQgPSBWUDlfSUZfWV9NT0RFX0NPVU5UX1NUQVJUOworCWZvciAodHJlZV9pID0gMDsgdHJlZV9pIDwgMTQ7IHRyZWVfaSsrKSB7CisJCWZvciAobm9kZSA9IDA7IG5vZGUgPCA5OyBub2RlKyspIHsKKwkJCXN3aXRjaCAobm9kZSkgeworCQkJY2FzZSA4OgorCQkJCXRyZWVfbGVmdCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K0QxNTNfUFJFRF07CisJCQkJdHJlZV9yaWdodCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K0QyMDdfUFJFRF07CisJCQkJYnJlYWs7CisJCQljYXNlIDc6CisJCQkJdHJlZV9sZWZ0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrRDYzX1BSRURdOworCQkJCXRyZWVfcmlnaHQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtEMjA3X1BSRURdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrRDE1M19QUkVEXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNjoKKwkJCQl0cmVlX2xlZnQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIEQ0NV9QUkVEXTsKKwkJCQl0cmVlX3JpZ2h0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrRDIwN19QUkVEXSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K0QxNTNfUFJFRF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtENjNfUFJFRF07CisJCQkJYnJlYWs7CisJCQljYXNlIDU6CisJCQkJdHJlZV9sZWZ0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrRDEzNV9QUkVEXTsKKwkJCQl0cmVlX3JpZ2h0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrRDExN19QUkVEXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQl0cmVlX2xlZnQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtIX1BSRURdOworCQkJCXRyZWVfcmlnaHQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtEMTE3X1BSRURdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrRDEzNV9QUkVEXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQl0cmVlX2xlZnQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtIX1BSRURdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrRDExN19QUkVEXSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K0QxMzVfUFJFRF07CisJCQkJdHJlZV9yaWdodCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K0Q0NV9QUkVEXSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K0QyMDdfUFJFRF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtEMTUzX1BSRURdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrRDYzX1BSRURdOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCXRyZWVfbGVmdCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K1ZfUFJFRF07CisJCQkJdHJlZV9yaWdodCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K0hfUFJFRF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtEMTE3X1BSRURdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrRDEzNV9QUkVEXSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K0Q0NV9QUkVEXSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K0QyMDdfUFJFRF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtEMTUzX1BSRURdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrRDYzX1BSRURdOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCXRyZWVfbGVmdCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K1RNX1BSRURdOworCQkJCXRyZWVfcmlnaHQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtWX1BSRURdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrSF9QUkVEXSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K0QxMTdfUFJFRF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtEMTM1X1BSRURdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrRDQ1X1BSRURdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrRDIwN19QUkVEXSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K0QxNTNfUFJFRF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtENjNfUFJFRF07CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXRyZWVfbGVmdCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K0RDX1BSRURdOworCQkJCXRyZWVfcmlnaHQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtUTV9QUkVEXSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K1ZfUFJFRF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtIX1BSRURdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrRDExN19QUkVEXSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K0QxMzVfUFJFRF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtENDVfUFJFRF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCtEMjA3X1BSRURdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQrRDE1M19QUkVEXSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0K0Q2M19QUkVEXTsKKwkJCQlicmVhazsKKworCQkJCX0KKworCQkJdnA5X3RyZWVfbWVyZ2VfcHJvYnMocHJldl9wcm9iLCBjdXJfcHJvYiwKKwkJCQljb2VmX25vZGVfc3RhcnQsIHRyZWVfbGVmdCwgdHJlZV9yaWdodCwKKwkJCQl0cmVlX2ksIG5vZGUpOworCisJCQljb2VmX25vZGVfc3RhcnQgPSBjb2VmX25vZGVfc3RhcnQgKyAxOworCQl9CisJCWNvZWZfY291bnRfbm9kZV9zdGFydCA9IGNvZWZfY291bnRfbm9kZV9zdGFydCArIDEwOworCX0KKworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19NRVJHRSkKKwkJcHJfaW5mbygiICMgbWVyZ2VfdnA5X3BhcnRpdGlvbl90cmVlXG4iKTsKKwljb2VmX25vZGVfc3RhcnQgPSBWUDlfUEFSVElUSU9OX1BfU1RBUlQ7CisJY29lZl9jb3VudF9ub2RlX3N0YXJ0ID0gVlA5X1BBUlRJVElPTl9QX0NPVU5UX1NUQVJUOworCWZvciAodHJlZV9pID0gMDsgdHJlZV9pIDwgMTY7IHRyZWVfaSsrKSB7CisJCWZvciAobm9kZSA9IDA7IG5vZGUgPCAzOyBub2RlKyspIHsKKwkJCXN3aXRjaCAobm9kZSkgeworCQkJY2FzZSAyOgorCQkJCXRyZWVfbGVmdCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMl07CisJCQkJdHJlZV9yaWdodCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgM107CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJdHJlZV9sZWZ0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAxXTsKKwkJCQl0cmVlX3JpZ2h0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAyXSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgM107CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXRyZWVfbGVmdCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMF07CisJCQkJdHJlZV9yaWdodCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMV0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDJdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAzXTsKKwkJCQlicmVhazsKKworCQkJfQorCisJCQl2cDlfdHJlZV9tZXJnZV9wcm9icyhwcmV2X3Byb2IsIGN1cl9wcm9iLAorCQkJCWNvZWZfbm9kZV9zdGFydCwKKwkJCQl0cmVlX2xlZnQsIHRyZWVfcmlnaHQsIHRyZWVfaSwgbm9kZSk7CisKKwkJCWNvZWZfbm9kZV9zdGFydCA9IGNvZWZfbm9kZV9zdGFydCArIDE7CisJCX0KKwkJY29lZl9jb3VudF9ub2RlX3N0YXJ0ID0gY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgNDsKKwl9CisKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfTUVSR0UpCisJCXByX2luZm8oIiAjIG1lcmdlX3ZwOV9zd2l0Y2hhYmxlX2ludGVycF90cmVlXG4iKTsKKwljb2VmX25vZGVfc3RhcnQgPSBWUDlfSU5URVJQX1NUQVJUOworCWNvZWZfY291bnRfbm9kZV9zdGFydCA9IFZQOV9JTlRFUlBfQ09VTlRfU1RBUlQ7CisJZm9yICh0cmVlX2kgPSAwOyB0cmVlX2kgPCA0OyB0cmVlX2krKykgeworCQlmb3IgKG5vZGUgPSAwOyBub2RlIDwgMjsgbm9kZSsrKSB7CisJCQlzd2l0Y2ggKG5vZGUpIHsKKwkJCWNhc2UgMToKKwkJCQl0cmVlX2xlZnQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDFdOworCQkJCXRyZWVfcmlnaHQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDJdOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl0cmVlX2xlZnQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDBdOworCQkJCXRyZWVfcmlnaHQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDFdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAyXTsKKwkJCQlicmVhazsKKworCQkJfQorCisJCQl2cDlfdHJlZV9tZXJnZV9wcm9icyhwcmV2X3Byb2IsIGN1cl9wcm9iLAorCQkJCWNvZWZfbm9kZV9zdGFydCwKKwkJCQl0cmVlX2xlZnQsIHRyZWVfcmlnaHQsIHRyZWVfaSwgbm9kZSk7CisKKwkJCWNvZWZfbm9kZV9zdGFydCA9IGNvZWZfbm9kZV9zdGFydCArIDE7CisJCX0KKwkJY29lZl9jb3VudF9ub2RlX3N0YXJ0ID0gY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMzsKKwl9CisKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfTUVSR0UpCisJCXByX2luZm8oIiMgbWVyZ2VfdnA5X212X2pvaW50X3RyZWVcbiIpOworCWNvZWZfbm9kZV9zdGFydCA9IFZQOV9NVl9KT0lOVFNfU1RBUlQ7CisJY29lZl9jb3VudF9ub2RlX3N0YXJ0ID0gVlA5X01WX0pPSU5UU19DT1VOVF9TVEFSVDsKKwlmb3IgKHRyZWVfaSA9IDA7IHRyZWVfaSA8IDE7IHRyZWVfaSsrKSB7CisJCWZvciAobm9kZSA9IDA7IG5vZGUgPCAzOyBub2RlKyspIHsKKwkJCXN3aXRjaCAobm9kZSkgeworCQkJY2FzZSAyOgorCQkJCXRyZWVfbGVmdCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMl07CisJCQkJdHJlZV9yaWdodCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgM107CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJdHJlZV9sZWZ0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAxXTsKKwkJCQl0cmVlX3JpZ2h0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAyXSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgM107CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXRyZWVfbGVmdCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMF07CisJCQkJdHJlZV9yaWdodCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMV0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDJdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAzXTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJdnA5X3RyZWVfbWVyZ2VfcHJvYnMocHJldl9wcm9iLCBjdXJfcHJvYiwKKwkJCQljb2VmX25vZGVfc3RhcnQsCisJCQkJdHJlZV9sZWZ0LCB0cmVlX3JpZ2h0LCB0cmVlX2ksIG5vZGUpOworCisJCQljb2VmX25vZGVfc3RhcnQgPSBjb2VmX25vZGVfc3RhcnQgKyAxOworCQl9CisJCWNvZWZfY291bnRfbm9kZV9zdGFydCA9IGNvZWZfY291bnRfbm9kZV9zdGFydCArIDQ7CisJfQorCisJZm9yIChtdmRfaSA9IDA7IG12ZF9pIDwgMjsgbXZkX2krKykgeworCQlpZiAoZGVidWcgJiBWUDlfREVCVUdfTUVSR0UpCisJCQlwcl9pbmZvKCIgIyBtZXJnZV92cDlfbXZfY2xhc3NfdHJlZSBbJWRdICAtXG4iLCBtdmRfaSk7CisJCWNvZWZfbm9kZV9zdGFydCA9CisJCQltdmRfaSA/IFZQOV9NVl9DTEFTU0VTXzFfU1RBUlQgOiBWUDlfTVZfQ0xBU1NFU18wX1NUQVJUOworCQljb2VmX2NvdW50X25vZGVfc3RhcnQgPQorCQkJbXZkX2kgPyBWUDlfTVZfQ0xBU1NFU18xX0NPVU5UX1NUQVJUCisJCQk6IFZQOV9NVl9DTEFTU0VTXzBfQ09VTlRfU1RBUlQ7CisJCXRyZWVfaSA9IDA7CisJCWZvciAobm9kZSA9IDA7IG5vZGUgPCAxMDsgbm9kZSsrKSB7CisJCQlzd2l0Y2ggKG5vZGUpIHsKKwkJCWNhc2UgOToKKwkJCQl0cmVlX2xlZnQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDldOworCQkJCXRyZWVfcmlnaHQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDEwXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgODoKKwkJCQl0cmVlX2xlZnQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDddOworCQkJCXRyZWVfcmlnaHQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDhdOworCQkJCWJyZWFrOworCQkJY2FzZSA3OgorCQkJCXRyZWVfbGVmdCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgN10gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDhdOworCQkJCXRyZWVfcmlnaHQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDldICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAxMF07CisJCQkJYnJlYWs7CisJCQljYXNlIDY6CisJCQkJdHJlZV9sZWZ0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyA2XTsKKwkJCQl0cmVlX3JpZ2h0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyA3XSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgOF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDldICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAxMF07CisJCQkJYnJlYWs7CisJCQljYXNlIDU6CisJCQkJdHJlZV9sZWZ0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyA0XTsKKwkJCQl0cmVlX3JpZ2h0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyA1XTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQl0cmVlX2xlZnQgPQorCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDRdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyA1XTsKKwkJCQl0cmVlX3JpZ2h0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyA2XSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgN10gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDhdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyA5XSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMTBdOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCXRyZWVfbGVmdCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMl07CisJCQkJdHJlZV9yaWdodCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgM107CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJdHJlZV9sZWZ0ID0KKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAyXSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgM107CisJCQkJdHJlZV9yaWdodCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgNF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDVdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyA2XSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgN10gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDhdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyA5XSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMTBdOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCXRyZWVfbGVmdCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMV07CisJCQkJdHJlZV9yaWdodCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMl0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDNdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyA0XSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgNV0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDZdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyA3XSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgOF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDldICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAxMF07CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXRyZWVfbGVmdCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMF07CisJCQkJdHJlZV9yaWdodCA9CisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMV0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDJdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAzXSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgNF0gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDVdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyA2XSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgN10gKworCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDhdICsKKwkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyA5XSArCisJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMTBdOworCQkJCWJyZWFrOworCisJCQl9CisKKwkJCXZwOV90cmVlX21lcmdlX3Byb2JzKHByZXZfcHJvYiwgY3VyX3Byb2IsCisJCQkJY29lZl9ub2RlX3N0YXJ0LCB0cmVlX2xlZnQsIHRyZWVfcmlnaHQsCisJCQkJdHJlZV9pLCBub2RlKTsKKworCQkJY29lZl9ub2RlX3N0YXJ0ID0gY29lZl9ub2RlX3N0YXJ0ICsgMTsKKwkJfQorCisJCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19NRVJHRSkKKwkJCXByX2luZm8oIiAjIG1lcmdlX3ZwOV9tdl9jbGFzczBfdHJlZSBbJWRdICAtXG4iLCBtdmRfaSk7CisJCWNvZWZfbm9kZV9zdGFydCA9CisJCQltdmRfaSA/IFZQOV9NVl9DTEFTUzBfMV9TVEFSVCA6IFZQOV9NVl9DTEFTUzBfMF9TVEFSVDsKKwkJY29lZl9jb3VudF9ub2RlX3N0YXJ0ID0KKwkJCW12ZF9pID8gVlA5X01WX0NMQVNTMF8xX0NPVU5UX1NUQVJUIDoKKwkJCVZQOV9NVl9DTEFTUzBfMF9DT1VOVF9TVEFSVDsKKwkJdHJlZV9pID0gMDsKKwkJbm9kZSA9IDA7CisJCXRyZWVfbGVmdCA9IGNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDBdOworCQl0cmVlX3JpZ2h0ID0gY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMV07CisKKwkJdnA5X3RyZWVfbWVyZ2VfcHJvYnMocHJldl9wcm9iLCBjdXJfcHJvYiwgY29lZl9ub2RlX3N0YXJ0LAorCQkJdHJlZV9sZWZ0LCB0cmVlX3JpZ2h0LCB0cmVlX2ksIG5vZGUpOworCQlpZiAoZGVidWcgJiBWUDlfREVCVUdfTUVSR0UpCisJCQlwcl9pbmZvKCIgIyBtZXJnZV92cDlfbXZfZnBfdHJlZV9jbGFzczBfZnAgWyVkXSAgLVxuIiwKKwkJCQltdmRfaSk7CisJCWNvZWZfbm9kZV9zdGFydCA9CisJCQltdmRfaSA/IFZQOV9NVl9DTEFTUzBfRlBfMV9TVEFSVCA6CisJCQlWUDlfTVZfQ0xBU1MwX0ZQXzBfU1RBUlQ7CisJCWNvZWZfY291bnRfbm9kZV9zdGFydCA9CisJCQltdmRfaSA/IFZQOV9NVl9DTEFTUzBfRlBfMV9DT1VOVF9TVEFSVCA6CisJCQlWUDlfTVZfQ0xBU1MwX0ZQXzBfQ09VTlRfU1RBUlQ7CisJCWZvciAodHJlZV9pID0gMDsgdHJlZV9pIDwgMzsgdHJlZV9pKyspIHsKKwkJCWZvciAobm9kZSA9IDA7IG5vZGUgPCAzOyBub2RlKyspIHsKKwkJCQlzd2l0Y2ggKG5vZGUpIHsKKwkJCQljYXNlIDI6CisJCQkJCXRyZWVfbGVmdCA9CisJCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDJdOworCQkJCQl0cmVlX3JpZ2h0ID0KKwkJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgM107CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMToKKwkJCQkJdHJlZV9sZWZ0ID0KKwkJCQkJY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMV07CisJCQkJCXRyZWVfcmlnaHQgPQorCQkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAyXQorCQkJCQkrIGNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDNdOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQl0cmVlX2xlZnQgPQorCQkJCQljb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAwXTsKKwkJCQkJdHJlZV9yaWdodCA9CisJCQkJCWNvdW50W2NvZWZfY291bnRfbm9kZV9zdGFydCArIDFdCisJCQkJCSsgY291bnRbY29lZl9jb3VudF9ub2RlX3N0YXJ0ICsgMl0KKwkJCQkJKyBjb3VudFtjb2VmX2NvdW50X25vZGVfc3RhcnQgKyAzXTsKKwkJCQkJYnJlYWs7CisKKwkJCQl9CisKKwkJCQl2cDlfdHJlZV9tZXJnZV9wcm9icyhwcmV2X3Byb2IsIGN1cl9wcm9iLAorCQkJCQljb2VmX25vZGVfc3RhcnQsIHRyZWVfbGVmdCwgdHJlZV9yaWdodCwKKwkJCQkJdHJlZV9pLCBub2RlKTsKKworCQkJCWNvZWZfbm9kZV9zdGFydCA9IGNvZWZfbm9kZV9zdGFydCArIDE7CisJCQl9CisJCQljb2VmX2NvdW50X25vZGVfc3RhcnQgPSBjb2VmX2NvdW50X25vZGVfc3RhcnQgKyA0OworCQl9CisKKwl9IC8qIGZvciBtdmRfaSAobXZkX3kgb3IgbXZkX3gpKi8KK30KKworfQorCitzdGF0aWMgdm9pZCB1bmluaXRfbW11X2J1ZmZlcnMoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworI2lmbmRlZiBNVl9VU0VfRklYRURfQlVGCisJZGVhbGxvY19tdl9idWZzKHBiaSk7CisjZW5kaWYKKwlpZiAocGJpLT5tbXVfYm94KSB7CisJCWRlY29kZXJfbW11X2JveF9mcmVlKHBiaS0+bW11X2JveCk7CisJCXBiaS0+bW11X2JveCA9IE5VTEw7CisJfQorCisJaWYgKHBiaS0+Ym1tdV9ib3gpIHsKKwkJZGVjb2Rlcl9ibW11X2JveF9mcmVlKHBiaS0+Ym1tdV9ib3gpOworCQlwYmktPmJtbXVfYm94ID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY2FsY19sdWNfcXVhbnRpdHkodTMyIHcsIHUzMiBoKQoreworCWludCBsY3Vfc2l6ZSA9IDY0OyAvKmZpeGVkIDY0Ki8KKwlpbnQgcGljX3dpZHRoXzY0ID0gKHcgKyA2MykgJiAofjB4M2YpOworCWludCBwaWNfaGVpZ2h0XzMyID0gKGggKyAzMSkgJiAofjB4MWYpOworCWludCBwaWNfd2lkdGhfbGN1ICA9IChwaWNfd2lkdGhfNjQgJSBsY3Vfc2l6ZSkgPworCQlwaWNfd2lkdGhfNjQgLyBsY3Vfc2l6ZSAgKyAxIDogcGljX3dpZHRoXzY0IC8gbGN1X3NpemU7CisJaW50IHBpY19oZWlnaHRfbGN1ID0gKHBpY19oZWlnaHRfMzIgJSBsY3Vfc2l6ZSkgPworCQlwaWNfaGVpZ2h0XzMyIC8gbGN1X3NpemUgKyAxIDogcGljX2hlaWdodF8zMiAvIGxjdV9zaXplOworCisJcmV0dXJuIHBpY193aWR0aF9sY3UgKiBwaWNfaGVpZ2h0X2xjdTsKK30KKworLyogcmV0dXJuIGluIE1CICovCitzdGF0aWMgaW50IHZwOV9tYXhfbW11X2J1Zl9zaXplKGludCBtYXhfdywgaW50IG1heF9oKQoreworCWludCBidWZfc2l6ZSA9IDQ4OworCisJaWYgKChtYXhfdyAqIG1heF9oID4gMTI4MCo3MzYpICYmCisJCShtYXhfdyAqIG1heF9oIDw9IDE5MjAqMTA4OCkpIHsKKwkJYnVmX3NpemUgPSAxMjsKKwl9IGVsc2UgaWYgKChtYXhfdyAqIG1heF9oID4gMCkgJiYKKwkJKG1heF93ICogbWF4X2ggPD0gMTI4MCo3MzYpKSB7CisJCWJ1Zl9zaXplID0gNDsKKwl9CisKKwlyZXR1cm4gYnVmX3NpemU7Cit9CisKK3N0YXRpYyB2b2lkIHZwOV9wdXRfdmlkZW9fZnJhbWUodm9pZCAqdmRlY19jdHgsIHN0cnVjdCB2ZnJhbWVfcyAqdmYpCit7CisJdnZwOV92Zl9wdXQodmYsIHZkZWNfY3R4KTsKK30KKworc3RhdGljIHZvaWQgdnA5X2dldF92aWRlb19mcmFtZSh2b2lkICp2ZGVjX2N0eCwgc3RydWN0IHZmcmFtZV9zICoqdmYpCit7CisJKnZmID0gdnZwOV92Zl9nZXQodmRlY19jdHgpOworfQorCitzdGF0aWMgc3RydWN0IHRhc2tfb3BzX3MgdGFza19kZWNfb3BzID0geworCS50eXBlCQk9IFRBU0tfVFlQRV9ERUMsCisJLmdldF92ZnJhbWUJPSB2cDlfZ2V0X3ZpZGVvX2ZyYW1lLAorCS5wdXRfdmZyYW1lCT0gdnA5X3B1dF92aWRlb19mcmFtZSwKK307CisKK3N0YXRpYyBpbnQgdjRsX2FsbG9jX2FuZF9jb25maWdfcGljKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljKQoreworCWludCByZXQgPSAtMTsKKwlpbnQgaSA9IHBpYy0+aW5kZXg7CisJaW50IGR3X21vZGUgPSBnZXRfZG91YmxlX3dyaXRlX21vZGVfaW5pdChwYmkpOworCWludCBsY3VfdG90YWwgPSBjYWxjX2x1Y19xdWFudGl0eShwYmktPmZyYW1lX3dpZHRoLCBwYmktPmZyYW1lX2hlaWdodCk7CisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCXUzMiBtcHJlZF9tdl9lbmQgPSBwYmktPndvcmtfc3BhY2VfYnVmLT5tcHJlZF9tdi5idWZfc3RhcnQgKworCQlwYmktPndvcmtfc3BhY2VfYnVmLT5tcHJlZF9tdi5idWZfc2l6ZTsKKwlpbnQgbXZfc2l6ZSA9IGNhbF9tdl9idWZfc2l6ZShwYmksIHBiaS0+ZnJhbWVfd2lkdGgsIHBiaS0+ZnJhbWVfaGVpZ2h0KTsKKyNlbmRpZgorCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqIGN0eCA9IChzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKilwYmktPnY0bDJfY3R4OworCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9IE5VTEw7CisKKwlpZiAoaSA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBjdHgtPmZiX29wcy5hbGxvYygmY3R4LT5mYl9vcHMsIHBiaS0+ZmJfdG9rZW4sICZmYiwgQU1MX0ZCX1JFUV9ERUMpOworCWlmIChyZXQgPCAwKSB7CisJCXZwOV9wcmludChwYmksIDAsICJbJWRdIFZQOSBnZXQgYnVmZmVyIGZhaWwuXG4iLCBjdHgtPmlkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlmYi0+dGFzay0+YXR0YWNoKGZiLT50YXNrLCAmdGFza19kZWNfb3BzLCBwYmkpOworCWZiLT5zdGF0dXMgPSBGQl9TVF9ERUNPREVSOworCisJaWYgKHBiaS0+bW11X2VuYWJsZSkgeworCQlzdHJ1Y3QgaW50ZXJuYWxfY29tcF9idWYgKmlidWYgPSB2NGxmYl90b19pY29tcF9idWYocGJpLCBmYik7CisKKwkJcGJpLT5tX0JVRltpXS5oZWFkZXJfYWRkciA9IGlidWYtPmhlYWRlcl9hZGRyOworCQlpZiAoZGVidWcgJiBWUDlfREVCVUdfQlVGTUdSX01PUkUpIHsKKwkJCXByX2luZm8oIk1NVSBoZWFkZXJfYWRyICVkOiAlbGRcbiIsCisJCQkJaSwgcGJpLT5tX0JVRltpXS5oZWFkZXJfYWRkcik7CisJCX0KKwl9CisKKwlwaWMtPnJlcGVhdF9waWMgPSBOVUxMOworCXBpYy0+cmVwZWF0X2NvdW50ID0gMDsKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJaWYgKChwYmktPndvcmtfc3BhY2VfYnVmLT5tcHJlZF9tdi5idWZfc3RhcnQgKworCQkoKGkgKyAxKSAqIG12X3NpemUpKQorCQk8PSBtcHJlZF9tdl9lbmQpIHsKKyNlbmRpZgorCXBiaS0+bV9CVUZbaV0udjRsX3JlZl9idWZfYWRkciA9ICh1bG9uZylmYjsKKwlwaWMtPmNtYV9hbGxvY19hZGRyID0gZmItPm0ubWVtWzBdLmFkZHI7CisJaWYgKGZiLT5udW1fcGxhbmVzID09IDEpIHsKKwkJcGJpLT5tX0JVRltpXS5zdGFydF9hZHIgPSBmYi0+bS5tZW1bMF0uYWRkcjsKKwkJcGJpLT5tX0JVRltpXS5sdW1hX3NpemUgPSBmYi0+bS5tZW1bMF0ub2Zmc2V0OworCQlwYmktPm1fQlVGW2ldLnNpemUgPSBmYi0+bS5tZW1bMF0uc2l6ZTsKKwkJZmItPm0ubWVtWzBdLmJ5dGVzX3VzZWQgPSBmYi0+bS5tZW1bMF0uc2l6ZTsKKwkJcGljLT5kd195X2FkciA9IHBiaS0+bV9CVUZbaV0uc3RhcnRfYWRyOworCQlwaWMtPmR3X3Vfdl9hZHIgPSBwaWMtPmR3X3lfYWRyICsgcGJpLT5tX0JVRltpXS5sdW1hX3NpemU7CisJCXBpYy0+bHVtYV9zaXplID0gZmItPm0ubWVtWzBdLm9mZnNldDsKKwkJcGljLT5jaHJvbWFfc2l6ZSA9IGZiLT5tLm1lbVswXS5zaXplIC0gZmItPm0ubWVtWzBdLm9mZnNldDsKKwl9IGVsc2UgaWYgKGZiLT5udW1fcGxhbmVzID09IDIpIHsKKwkJcGJpLT5tX0JVRltpXS5zdGFydF9hZHIgPSBmYi0+bS5tZW1bMF0uYWRkcjsKKwkJcGJpLT5tX0JVRltpXS5zaXplID0gZmItPm0ubWVtWzBdLnNpemU7CisJCXBiaS0+bV9CVUZbaV0uY2hyb21hX2FkZHIgPSBmYi0+bS5tZW1bMV0uYWRkcjsKKwkJcGJpLT5tX0JVRltpXS5jaHJvbWFfc2l6ZSA9IGZiLT5tLm1lbVsxXS5zaXplOworCQlmYi0+bS5tZW1bMF0uYnl0ZXNfdXNlZCA9IGZiLT5tLm1lbVswXS5zaXplOworCQlmYi0+bS5tZW1bMV0uYnl0ZXNfdXNlZCA9IGZiLT5tLm1lbVsxXS5zaXplOworCQlwaWMtPmR3X3lfYWRyID0gcGJpLT5tX0JVRltpXS5zdGFydF9hZHI7CisJCXBpYy0+ZHdfdV92X2FkciA9IHBiaS0+bV9CVUZbaV0uY2hyb21hX2FkZHI7CisJCXBpYy0+bHVtYV9zaXplID0gZmItPm0ubWVtWzBdLnNpemU7CisJCXBpYy0+Y2hyb21hX3NpemUgPSBmYi0+bS5tZW1bMV0uc2l6ZTsKKwl9CisKKwkvKiBjb25maWcgZnJhbWUgYnVmZmVyICovCisJaWYgKHBiaS0+bW11X2VuYWJsZSkKKwkJcGljLT5oZWFkZXJfYWRyID0gcGJpLT5tX0JVRltpXS5oZWFkZXJfYWRkcjsKKworCXBpYy0+QlVGX2luZGV4CQk9IGk7CisJcGljLT5sY3VfdG90YWwJCT0gbGN1X3RvdGFsOworCXBpYy0+bWNfY2FudmFzX3kJPSBwaWMtPmluZGV4OworCXBpYy0+bWNfY2FudmFzX3Vfdgk9IHBpYy0+aW5kZXg7CisKKwlpZiAoZHdfbW9kZSAmIDB4MTApIHsKKwkJcGljLT5tY19jYW52YXNfeSA9IChwaWMtPmluZGV4IDw8IDEpOworCQlwaWMtPm1jX2NhbnZhc191X3YgPSAocGljLT5pbmRleCA8PCAxKSArIDE7CisJfQorCisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCXBpYy0+bXByZWRfbXZfd3Jfc3RhcnRfYWRkciA9CisJCXBiaS0+d29ya19zcGFjZV9idWYtPm1wcmVkX212LmJ1Zl9zdGFydCArCisJCShwaWMtPmluZGV4ICogbXZfc2l6ZSk7CisJcGljLT5tdl9zaXplID0gbXZfc2l6ZTsKKyNlbmRpZgorCWlmIChkZWJ1ZykgeworCQlwcl9pbmZvKCIlcyBpbmRleCAlZCBCVUZfaW5kZXggJWQgIiwKKwkJCV9fZnVuY19fLCBwaWMtPmluZGV4LAorCQkJcGljLT5CVUZfaW5kZXgpOworCQlwcl9pbmZvKCJjb21wX2JvZHlfc2l6ZSAleCBjb21wX2J1Zl9zaXplICV4ICIsCisJCQlwaWMtPmNvbXBfYm9keV9zaXplLAorCQkJcGljLT5idWZfc2l6ZSk7CisJCXByX2luZm8oIm1wcmVkX212X3dyX3N0YXJ0X2FkciAlbGRcbiIsCisJCQlwaWMtPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIpOworCQlwcl9pbmZvKCJkd195X2FkciAlZCwgcGljX2NvbmZpZy0+ZHdfdV92X2FkciA9JWRcbiIsCisJCQlwaWMtPmR3X3lfYWRyLAorCQkJcGljLT5kd191X3ZfYWRyKTsKKwl9CisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCX0KKyNlbmRpZgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3BpYyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksCisJCQkJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnBpY19jb25maWcpCit7CisJaW50IHJldCA9IC0xOworCWludCBpOworCWludCBwaWNfd2lkdGggPSBwYmktPmluaXRfcGljX3c7CisJaW50IHBpY19oZWlnaHQgPSBwYmktPmluaXRfcGljX2g7CisJaW50IGxjdV9zaXplID0gNjQ7IC8qZml4ZWQgNjQqLworCWludCBwaWNfd2lkdGhfNjQgPSAocGljX3dpZHRoICsgNjMpICYgKH4weDNmKTsKKwlpbnQgcGljX2hlaWdodF8zMiA9IChwaWNfaGVpZ2h0ICsgMzEpICYgKH4weDFmKTsKKwlpbnQgcGljX3dpZHRoX2xjdSAgPSAocGljX3dpZHRoXzY0ICUgbGN1X3NpemUpID8KKwkJCQlwaWNfd2lkdGhfNjQgLyBsY3Vfc2l6ZSAgKyAxCisJCQkJOiBwaWNfd2lkdGhfNjQgLyBsY3Vfc2l6ZTsKKwlpbnQgcGljX2hlaWdodF9sY3UgPSAocGljX2hlaWdodF8zMiAlIGxjdV9zaXplKSA/CisJCQkJcGljX2hlaWdodF8zMiAvIGxjdV9zaXplICsgMQorCQkJCTogcGljX2hlaWdodF8zMiAvIGxjdV9zaXplOworCWludCBsY3VfdG90YWwgICAgICAgPSBwaWNfd2lkdGhfbGN1ICogcGljX2hlaWdodF9sY3U7CisjaWZkZWYgTVZfVVNFX0ZJWEVEX0JVRgorCXUzMiBtcHJlZF9tdl9lbmQgPSBwYmktPndvcmtfc3BhY2VfYnVmLT5tcHJlZF9tdi5idWZfc3RhcnQgKworCQkJcGJpLT53b3JrX3NwYWNlX2J1Zi0+bXByZWRfbXYuYnVmX3NpemU7CisJaW50IG12X3NpemUgPSBjYWxfbXZfYnVmX3NpemUocGJpLCBwYmktPmluaXRfcGljX3csIHBiaS0+aW5pdF9waWNfaCk7CisjZW5kaWYKKwl1MzIgeV9hZHIgPSAwOworCWludCBidWZfc2l6ZSA9IDA7CisKKwlpbnQgbG9zbGVzc19jb21wX2hlYWRlcl9zaXplID0KKwkJCWNvbXB1dGVfbG9zbGVzc19jb21wX2hlYWRlcl9zaXplKHBpY193aWR0aCwKKwkJCXBpY19oZWlnaHQpOworCWludCBsb3NsZXNzX2NvbXBfYm9keV9zaXplID0gY29tcHV0ZV9sb3NsZXNzX2NvbXBfYm9keV9zaXplKHBpY193aWR0aCwKKwkJCXBpY19oZWlnaHQsIGJ1Zl9hbGxvY19kZXB0aCA9PSAxMCk7CisJaW50IG1jX2J1ZmZlcl9zaXplID0gbG9zbGVzc19jb21wX2hlYWRlcl9zaXplICsgbG9zbGVzc19jb21wX2JvZHlfc2l6ZTsKKwlpbnQgbWNfYnVmZmVyX3NpemVfaCA9IChtY19idWZmZXJfc2l6ZSArIDB4ZmZmZikgPj4gMTY7CisJaW50IG1jX2J1ZmZlcl9zaXplX3VfdiA9IDA7CisJaW50IG1jX2J1ZmZlcl9zaXplX3Vfdl9oID0gMDsKKwlpbnQgZHdfbW9kZSA9IGdldF9kb3VibGVfd3JpdGVfbW9kZV9pbml0KHBiaSk7CisKKwlwYmktPmxjdV90b3RhbCA9IGxjdV90b3RhbDsKKworCWlmIChkd19tb2RlKSB7CisJCWludCBwaWNfd2lkdGhfZHcgPSBwaWNfd2lkdGggLworCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbyhkd19tb2RlKTsKKwkJaW50IHBpY19oZWlnaHRfZHcgPSBwaWNfaGVpZ2h0IC8KKwkJCWdldF9kb3VibGVfd3JpdGVfcmF0aW8oZHdfbW9kZSk7CisKKwkJaW50IHBpY193aWR0aF82NF9kdyA9IChwaWNfd2lkdGhfZHcgKyA2MykgJiAofjB4M2YpOworCQlpbnQgcGljX2hlaWdodF8zMl9kdyA9IChwaWNfaGVpZ2h0X2R3ICsgMzEpICYgKH4weDFmKTsKKwkJaW50IHBpY193aWR0aF9sY3VfZHcgID0gKHBpY193aWR0aF82NF9kdyAlIGxjdV9zaXplKSA/CisJCQkJCXBpY193aWR0aF82NF9kdyAvIGxjdV9zaXplICArIDEKKwkJCQkJOiBwaWNfd2lkdGhfNjRfZHcgLyBsY3Vfc2l6ZTsKKwkJaW50IHBpY19oZWlnaHRfbGN1X2R3ID0gKHBpY19oZWlnaHRfMzJfZHcgJSBsY3Vfc2l6ZSkgPworCQkJCQlwaWNfaGVpZ2h0XzMyX2R3IC8gbGN1X3NpemUgKyAxCisJCQkJCTogcGljX2hlaWdodF8zMl9kdyAvIGxjdV9zaXplOworCQlpbnQgbGN1X3RvdGFsX2R3ICAgICAgID0gcGljX3dpZHRoX2xjdV9kdyAqIHBpY19oZWlnaHRfbGN1X2R3OworCQltY19idWZmZXJfc2l6ZV91X3YgPSBsY3VfdG90YWxfZHcgKiBsY3Vfc2l6ZSAqIGxjdV9zaXplIC8gMjsKKwkJbWNfYnVmZmVyX3NpemVfdV92X2ggPSAobWNfYnVmZmVyX3NpemVfdV92ICsgMHhmZmZmKSA+PiAxNjsKKwkJLyo2NGsgYWxpZ25tZW50Ki8KKwkJYnVmX3NpemUgPSAoKG1jX2J1ZmZlcl9zaXplX3Vfdl9oIDw8IDE2KSAqIDMpOworCQlidWZfc2l6ZSA9ICgoYnVmX3NpemUgKyAweGZmZmYpID4+IDE2KSA8PCAxNjsKKwl9CisKKwlpZiAobWNfYnVmZmVyX3NpemUgJiAweGZmZmYpIC8qNjRrIGFsaWdubWVudCovCisJCW1jX2J1ZmZlcl9zaXplX2ggKz0gMTsKKwlpZiAoKCFwYmktPm1tdV9lbmFibGUpICYmICgoZHdfbW9kZSAmIDB4MTApID09IDApKQorCQlidWZfc2l6ZSArPSAobWNfYnVmZmVyX3NpemVfaCA8PCAxNik7CisKKwlpZiAocGJpLT5tbXVfZW5hYmxlKSB7CisJCXBpY19jb25maWctPmhlYWRlcl9hZHIgPSBkZWNvZGVyX2JtbXVfYm94X2dldF9waHlfYWRkcigKKwkJCXBiaS0+Ym1tdV9ib3gsIEhFQURFUl9CVUZGRVJfSURYKHBpY19jb25maWctPmluZGV4KSk7CisKKwkJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0JVRk1HUl9NT1JFKSB7CisJCQlwcl9pbmZvKCJNTVUgaGVhZGVyX2FkciAlZDogJWxkXG4iLAorCQkJCXBpY19jb25maWctPmluZGV4LCBwaWNfY29uZmlnLT5oZWFkZXJfYWRyKTsKKwkJfQorCX0KKworCWkgPSBwaWNfY29uZmlnLT5pbmRleDsKKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJaWYgKChwYmktPndvcmtfc3BhY2VfYnVmLT5tcHJlZF9tdi5idWZfc3RhcnQgKworCQkoKGkgKyAxKSAqIG12X3NpemUpKQorCQk8PSBtcHJlZF9tdl9lbmQKKwkpIHsKKyNlbmRpZgorCQlpZiAoYnVmX3NpemUgPiAwKSB7CisJCQlyZXQgPSBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkocGJpLT5ibW11X2JveCwKKwkJCQkJVkZfQlVGRkVSX0lEWChpKSwKKwkJCQkJYnVmX3NpemUsIERSSVZFUl9OQU1FLAorCQkJCQkmcGljX2NvbmZpZy0+Y21hX2FsbG9jX2FkZHIpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlwcl9pbmZvKAorCQkJCQkiZGVjb2Rlcl9ibW11X2JveF9hbGxvY19idWZfcGh5IGlkeCAlZCBzaXplICVkIGZhaWxcbiIsCisJCQkJCVZGX0JVRkZFUl9JRFgoaSksCisJCQkJCWJ1Zl9zaXplCisJCQkJCSk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKworCQkJaWYgKHBpY19jb25maWctPmNtYV9hbGxvY19hZGRyKQorCQkJCXlfYWRyID0gcGljX2NvbmZpZy0+Y21hX2FsbG9jX2FkZHI7CisJCQllbHNlIHsKKwkJCQlwcl9pbmZvKAorCQkJCQkiZGVjb2Rlcl9ibW11X2JveF9hbGxvY19idWZfcGh5IGlkeCAlZCBzaXplICVkIHJldHVybiBudWxsXG4iLAorCQkJCQlWRl9CVUZGRVJfSURYKGkpLAorCQkJCQlidWZfc2l6ZQorCQkJCQkpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCQl7CisJCQkvKmVuc3VyZSBnZXRfcGljX2J5X1BPQygpCisJCQlub3QgZ2V0IHRoZSBidWZmZXIgbm90IGRlY29kZWQqLworCQkJcGljX2NvbmZpZy0+QlVGX2luZGV4ID0gaTsKKwkJCXBpY19jb25maWctPmxjdV90b3RhbCA9IGxjdV90b3RhbDsKKworCQkJcGljX2NvbmZpZy0+Y29tcF9ib2R5X3NpemUgPSBsb3NsZXNzX2NvbXBfYm9keV9zaXplOworCQkJcGljX2NvbmZpZy0+YnVmX3NpemUgPSBidWZfc2l6ZTsKKworCQkJcGljX2NvbmZpZy0+bWNfY2FudmFzX3kgPSBwaWNfY29uZmlnLT5pbmRleDsKKwkJCXBpY19jb25maWctPm1jX2NhbnZhc191X3YgPSBwaWNfY29uZmlnLT5pbmRleDsKKwkJCWlmIChkd19tb2RlICYgMHgxMCkgeworCQkJCXBpY19jb25maWctPmR3X3lfYWRyID0geV9hZHI7CisJCQkJcGljX2NvbmZpZy0+ZHdfdV92X2FkciA9IHlfYWRyICsKKwkJCQkJKChtY19idWZmZXJfc2l6ZV91X3ZfaCA8PCAxNikgPDwgMSk7CisKKwkJCQlwaWNfY29uZmlnLT5tY19jYW52YXNfeSA9CisJCQkJCShwaWNfY29uZmlnLT5pbmRleCA8PCAxKTsKKwkJCQlwaWNfY29uZmlnLT5tY19jYW52YXNfdV92ID0KKwkJCQkJKHBpY19jb25maWctPmluZGV4IDw8IDEpICsgMTsKKwkJCX0gZWxzZSBpZiAoZHdfbW9kZSkgeworCQkJCXBpY19jb25maWctPmR3X3lfYWRyID0geV9hZHI7CisJCQkJcGljX2NvbmZpZy0+ZHdfdV92X2FkciA9IHBpY19jb25maWctPmR3X3lfYWRyICsKKwkJCQkoKG1jX2J1ZmZlcl9zaXplX3Vfdl9oIDw8IDE2KSA8PCAxKTsKKwkJCX0KKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJCQlwaWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyID0KKwkJCXBiaS0+d29ya19zcGFjZV9idWYtPm1wcmVkX212LmJ1Zl9zdGFydCArCisJCQkJCShwaWNfY29uZmlnLT5pbmRleCAqIG12X3NpemUpOworCQkJcGljX2NvbmZpZy0+bXZfc2l6ZSA9IG12X3NpemU7CisjZW5kaWYKKwkJCWlmIChkZWJ1ZykgeworCQkJCXByX2luZm8KKwkJCQkoIiVzIGluZGV4ICVkIEJVRl9pbmRleCAlZCAiLAorCQkJCV9fZnVuY19fLCBwaWNfY29uZmlnLT5pbmRleCwKKwkJCQlwaWNfY29uZmlnLT5CVUZfaW5kZXgpOworCQkJCXByX2luZm8KKwkJCQkoImNvbXBfYm9keV9zaXplICV4IGNvbXBfYnVmX3NpemUgJXggIiwKKwkJCQlwaWNfY29uZmlnLT5jb21wX2JvZHlfc2l6ZSwKKwkJCQlwaWNfY29uZmlnLT5idWZfc2l6ZSk7CisJCQkJcHJfaW5mbworCQkJCSgibXByZWRfbXZfd3Jfc3RhcnRfYWRyICVsZFxuIiwKKwkJCQlwaWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyKTsKKwkJCQlwcl9pbmZvKCJkd195X2FkciAlZCwgcGljX2NvbmZpZy0+ZHdfdV92X2FkciA9JWRcbiIsCisJCQkJCXBpY19jb25maWctPmR3X3lfYWRyLAorCQkJCQlwaWNfY29uZmlnLT5kd191X3ZfYWRyKTsKKwkJCX0KKwkJCXJldCA9IDA7CisJCX0KKyNpZmRlZiBNVl9VU0VfRklYRURfQlVGCisJfQorI2VuZGlmCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgdm9pZCBpbml0X3BpY19saXN0KHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjbSA9ICZwYmktPmNvbW1vbjsKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljX2NvbmZpZzsKKwl1MzIgaGVhZGVyX3NpemU7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGh3X3RvX3ZkZWMocGJpKTsKKworCWlmICghcGJpLT5pc191c2VkX3Y0bCAmJiBwYmktPm1tdV9lbmFibGUgJiYgKChwYmktPmRvdWJsZV93cml0ZV9tb2RlICYgMHgxMCkgPT0gMCkpIHsKKwkJaGVhZGVyX3NpemUgPSB2dnA5X21tdV9jb21wcmVzc19oZWFkZXJfc2l6ZShwYmktPm1heF9waWNfdywgcGJpLT5tYXhfcGljX2gpOworCQkvKmFsbG9jIFZQOSBjb21wcmVzcyBoZWFkZXIgZmlyc3QqLworCQlmb3IgKGkgPSAwOyBpIDwgcGJpLT51c2VkX2J1Zl9udW07IGkrKykgeworCQkJdW5zaWduZWQgbG9uZyBidWZfYWRkcjsKKwkJCWlmIChkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkKKwkJCQkocGJpLT5ibW11X2JveCwKKwkJCQlIRUFERVJfQlVGRkVSX0lEWChpKSwgaGVhZGVyX3NpemUsCisJCQkJRFJJVkVSX0hFQURFUl9OQU1FLAorCQkJCSZidWZfYWRkcikgPCAwKSB7CisJCQkJcHJfaW5mbygiJXMgbWFsbG9jIGNvbXByZXNzIGhlYWRlciBmYWlsZWQgJWRcbiIsCisJCQkJRFJJVkVSX0hFQURFUl9OQU1FLCBpKTsKKwkJCQlwYmktPmZhdGFsX2Vycm9yIHw9IERFQ09ERVJfRkFUQUxfRVJST1JfTk9fTUVNOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgcGJpLT51c2VkX2J1Zl9udW07IGkrKykgeworCQlwaWNfY29uZmlnID0gJmNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmc1tpXS5idWY7CisJCXBpY19jb25maWctPmluZGV4ID0gaTsKKwkJcGljX2NvbmZpZy0+QlVGX2luZGV4ID0gLTE7CisJCXBpY19jb25maWctPm12X2J1Zl9pbmRleCA9IC0xOworCQlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJCXBpY19jb25maWctPnlfY2FudmFzX2luZGV4ID0gLTE7CisJCQlwaWNfY29uZmlnLT51dl9jYW52YXNfaW5kZXggPSAtMTsKKwkJfQorCQlwaWNfY29uZmlnLT55X2Nyb3Bfd2lkdGggPSBwYmktPmluaXRfcGljX3c7CisJCXBpY19jb25maWctPnlfY3JvcF9oZWlnaHQgPSBwYmktPmluaXRfcGljX2g7CisJCXBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlID0gZ2V0X2RvdWJsZV93cml0ZV9tb2RlKHBiaSk7CisKKwkJaWYgKCFwYmktPmlzX3VzZWRfdjRsKSB7CisJCQlpZiAoY29uZmlnX3BpYyhwYmksIHBpY19jb25maWcpIDwgMCkgeworCQkJCWlmIChkZWJ1ZykKKwkJCQkJcHJfaW5mbygiQ29uZmlnX3BpYyAlZCBmYWlsXG4iLAorCQkJCQkJcGljX2NvbmZpZy0+aW5kZXgpOworCQkJCXBpY19jb25maWctPmluZGV4ID0gLTE7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSkgeworCQkJCXNldF9jYW52YXMocGJpLCBwaWNfY29uZmlnKTsKKwkJCX0KKwkJfQorCX0KKwlmb3IgKDsgaSA8IHBiaS0+dXNlZF9idWZfbnVtOyBpKyspIHsKKwkJcGljX2NvbmZpZyA9ICZjbS0+YnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnNbaV0uYnVmOworCQlwaWNfY29uZmlnLT5pbmRleCA9IC0xOworCQlwaWNfY29uZmlnLT5CVUZfaW5kZXggPSAtMTsKKwkJcGljX2NvbmZpZy0+bXZfYnVmX2luZGV4ID0gLTE7CisJCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQkJcGljX2NvbmZpZy0+eV9jYW52YXNfaW5kZXggPSAtMTsKKwkJCXBpY19jb25maWctPnV2X2NhbnZhc19pbmRleCA9IC0xOworCQl9CisJfQorCXByX2luZm8oIiVzIG9rLCB1c2VkX2J1Zl9udW0gPSAlZFxuIiwKKwkJX19mdW5jX18sIHBiaS0+dXNlZF9idWZfbnVtKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9waWNfbGlzdF9odyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJaW50IGk7CisJc3RydWN0IFZQOV9Db21tb25fcyAqY20gPSAmcGJpLT5jb21tb247CisJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnBpY19jb25maWc7CisJLypXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9DT05GX0FERFIsIDB4MCk7Ki8KKwlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9DT05GX0FERFIsCisJCSgweDEgPDwgMSkgfCAoMHgxIDw8IDIpKTsKKworCWZvciAoaSA9IDA7IGkgPCBwYmktPnVzZWRfYnVmX251bTsgaSsrKSB7CisJCXBpY19jb25maWcgPSAmY20tPmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzW2ldLmJ1ZjsKKwkJaWYgKHBpY19jb25maWctPmluZGV4IDwgMCkKKwkJCWJyZWFrOworCisJCWlmIChwYmktPm1tdV9lbmFibGUgJiYgKChwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MTApID09IDApKSB7CisJCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9EQVRBLAorCQkJCXBpY19jb25maWctPmhlYWRlcl9hZHIgPj4gNSk7CisJCX0gZWxzZSB7CisJCQkvKldSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0NNRF9BRERSLAorCQkJICoJcGljX2NvbmZpZy0+bWNfeV9hZHIKKwkJCSAqCXwgKHBpY19jb25maWctPm1jX2NhbnZhc195IDw8IDgpIHwgMHgxKTsKKwkJCSAqLworCQkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DMkFYSV9UQkxfREFUQSwKKwkJCQlwaWNfY29uZmlnLT5kd195X2FkciA+PiA1KTsKKwkJfQorI2lmbmRlZiBMT1NMRVNTX0NPTVBSRVNTX01PREUKKwkJLypXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9DTURfQUREUiwKKwkJICoJcGljX2NvbmZpZy0+bWNfdV92X2FkcgorCQkgKgl8IChwaWNfY29uZmlnLT5tY19jYW52YXNfdV92IDw8IDgpfCAweDEpOworCQkgKi8KKwkJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQzJBWElfVEJMX0RBVEEsCisJCQkJcGljX2NvbmZpZy0+aGVhZGVyX2FkciA+PiA1KTsKKyNlbHNlCisJCWlmIChwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MTApIHsKKwkJCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9EQVRBLAorCQkJCXBpY19jb25maWctPmR3X3Vfdl9hZHIgPj4gNSk7CisJCX0KKyNlbmRpZgorCX0KKwlXUklURV9WUkVHKEhFVkNEX01QUF9BTkMyQVhJX1RCTF9DT05GX0FERFIsIDB4MSk7CisKKwkvKlplcm8gb3V0IGNhbnZhcyByZWdpc3RlcnMgaW4gSVBQIC0tIGF2b2lkIHNpbXVsYXRpb24gWCovCisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwKKwkJCSgwIDw8IDgpIHwgKDAgPDwgMSkgfCAxKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIsIDApOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3BpY19saXN0KHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjb25zdCBjbSA9ICZwYmktPmNvbW1vbjsKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljX2NvbmZpZzsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgRlJBTUVfQlVGRkVSUzsgaSsrKSB7CisJCXBpY19jb25maWcgPSAmY20tPmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzW2ldLmJ1ZjsKKwkJdnA5X3ByaW50KHBiaSwgMCwKKwkJCSJCdWYoJWQpIGluZGV4ICVkIG12X2J1Zl9pbmRleCAlZCByZWZfY291bnQgJWQgdmZfcmVmICVkIHJlcGVhdF9jb3VudCAlZCBkZWNfaWR4ICVkIHNsaWNlX3R5cGUgJWQgdy9oICVkLyVkIGFkcjogJXhcbiIsCisJCQlpLAorCQkJcGljX2NvbmZpZy0+aW5kZXgsCisjaWZuZGVmIE1WX1VTRV9GSVhFRF9CVUYKKwkJCXBpY19jb25maWctPm12X2J1Zl9pbmRleCwKKyNlbHNlCisJCQktMSwKKyNlbmRpZgorCQkJY20tPmJ1ZmZlcl9wb29sLT4KKwkJCWZyYW1lX2J1ZnNbaV0ucmVmX2NvdW50LAorCQkJcGljX2NvbmZpZy0+dmZfcmVmLAorCQkJcGljX2NvbmZpZy0+cmVwZWF0X2NvdW50LAorCQkJcGljX2NvbmZpZy0+ZGVjb2RlX2lkeCwKKwkJCXBpY19jb25maWctPnNsaWNlX3R5cGUsCisJCQlwaWNfY29uZmlnLT55X2Nyb3Bfd2lkdGgsCisJCQlwaWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0LAorCQkJcGljX2NvbmZpZy0+Y21hX2FsbG9jX2FkZHIKKwkJCSk7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIGludCBjb25maWdfcGljX3NpemUoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLCB1bnNpZ25lZCBzaG9ydCBiaXRfZGVwdGgpCit7CisjaWZkZWYgTE9TTEVTU19DT01QUkVTU19NT0RFCisJdW5zaWduZWQgaW50IGRhdGEzMjsKKyNlbmRpZgorCWludCBsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUsIGxvc2xlc3NfY29tcF9ib2R5X3NpemU7CisJc3RydWN0IFZQOV9Db21tb25fcyAqY20gPSAmcGJpLT5jb21tb247CisJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKmN1cl9waWNfY29uZmlnID0gJmNtLT5jdXJfZnJhbWUtPmJ1ZjsKKworCWZyYW1lX3dpZHRoID0gY3VyX3BpY19jb25maWctPnlfY3JvcF93aWR0aDsKKwlmcmFtZV9oZWlnaHQgPSBjdXJfcGljX2NvbmZpZy0+eV9jcm9wX2hlaWdodDsKKwljdXJfcGljX2NvbmZpZy0+Yml0X2RlcHRoID0gYml0X2RlcHRoOworCWN1cl9waWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSA9IGdldF9kb3VibGVfd3JpdGVfbW9kZShwYmkpOworCWxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSA9CisJCWNvbXB1dGVfbG9zbGVzc19jb21wX2hlYWRlcl9zaXplKGN1cl9waWNfY29uZmlnLT55X2Nyb3Bfd2lkdGgsCisJCWN1cl9waWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0KTsKKwlsb3NsZXNzX2NvbXBfYm9keV9zaXplID0KKwkJY29tcHV0ZV9sb3NsZXNzX2NvbXBfYm9keV9zaXplKGN1cl9waWNfY29uZmlnLT55X2Nyb3Bfd2lkdGgsCisJCWN1cl9waWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0LCAoYml0X2RlcHRoID09IFZQWF9CSVRTXzEwKSk7CisJY3VyX3BpY19jb25maWctPmNvbXBfYm9keV9zaXplID0gbG9zbGVzc19jb21wX2JvZHlfc2l6ZTsKKyNpZmRlZiBMT1NMRVNTX0NPTVBSRVNTX01PREUKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDUpOworCWlmIChiaXRfZGVwdGggPT0gVlBYX0JJVFNfMTApCisJCWRhdGEzMiAmPSB+KDEgPDwgOSk7CisJZWxzZQorCQlkYXRhMzIgfD0gKDEgPDwgOSk7CisKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw1LCBkYXRhMzIpOworCisJaWYgKHBiaS0+bW11X2VuYWJsZSkgeworCQkvKmJpdFs0XSA6IHBhZ2VkX21lbV9tb2RlKi8KKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDEsICgweDEgPDwgNCkpOworCX0gZWxzZSB7CisJLypiaXRbM10gc21lbSBtZG9lKi8KKwkJaWYgKGJpdF9kZXB0aCA9PSBWUFhfQklUU18xMCkKKwkJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLCAoMCA8PCAzKSk7CisJCWVsc2UKKwkJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLCAoMSA8PCAzKSk7CisJfQorCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPCBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKQorCQlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMiwgKGxvc2xlc3NfY29tcF9ib2R5X3NpemUgPj4gNSkpOworCS8qV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDMsKDB4ZmY8PDIwKSB8ICgweGZmPDwxMCkgfCAweGZmKTsqLworCVdSSVRFX1ZSRUcoSEVWQ19DTV9CT0RZX0xFTkdUSCwgbG9zbGVzc19jb21wX2JvZHlfc2l6ZSk7CisJV1JJVEVfVlJFRyhIRVZDX0NNX0hFQURFUl9PRkZTRVQsIGxvc2xlc3NfY29tcF9ib2R5X3NpemUpOworCVdSSVRFX1ZSRUcoSEVWQ19DTV9IRUFERVJfTEVOR1RILCBsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUpOworCWlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUocGJpKSAmIDB4MTApCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLCAweDEgPDwgMzEpOworI2Vsc2UKKwlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMSwgMHgxIDw8IDMxKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19tY19idWZmZXIoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLCB1bnNpZ25lZCBzaG9ydCBiaXRfZGVwdGgpCit7CisJaW50IGk7CisJc3RydWN0IFZQOV9Db21tb25fcyAqY20gPSAmcGJpLT5jb21tb247CisJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKmN1cl9waWNfY29uZmlnID0gJmNtLT5jdXJfZnJhbWUtPmJ1ZjsKKwl1aW50OF90IHNjYWxlX2VuYWJsZSA9IDA7CisKKwlpZiAoZGVidWcmVlA5X0RFQlVHX0JVRk1HUl9NT1JFKQorCQlwcl9pbmZvKCJjb25maWdfbWNfYnVmZmVyIGVudGVyZWQgLi4uLi5cbiIpOworCisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwKKwkJCSgwIDw8IDgpIHwgKDAgPDwgMSkgfCAxKTsKKwlmb3IgKGkgPSAwOyBpIDwgUkVGU19QRVJfRlJBTUU7ICsraSkgeworCQlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljX2NvbmZpZyA9IGNtLT5mcmFtZV9yZWZzW2ldLmJ1ZjsKKwkJaWYgKCFwaWNfY29uZmlnKQorCQkJY29udGludWU7CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfREFUQV9BRERSLAorCQkocGljX2NvbmZpZy0+bWNfY2FudmFzX3VfdiA8PCAxNikKKwkJfCAocGljX2NvbmZpZy0+bWNfY2FudmFzX3VfdiA8PCA4KQorCQl8IHBpY19jb25maWctPm1jX2NhbnZhc195KTsKKwkJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0JVRk1HUl9NT1JFKQorCQkJcHJfaW5mbygicmVmaWQgJXggbWNfY2FudmFzX3VfdiAleCBtY19jYW52YXNfeSAleFxuIiwKKwkJCQlpLCBwaWNfY29uZmlnLT5tY19jYW52YXNfdV92LAorCQkJCXBpY19jb25maWctPm1jX2NhbnZhc195KTsKKwl9CisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwKKwkJCSgxNiA8PCA4KSB8ICgwIDw8IDEpIHwgMSk7CisJZm9yIChpID0gMDsgaSA8IFJFRlNfUEVSX0ZSQU1FOyArK2kpIHsKKwkJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnBpY19jb25maWcgPSBjbS0+ZnJhbWVfcmVmc1tpXS5idWY7CisJCWlmICghcGljX2NvbmZpZykKKwkJCWNvbnRpbnVlOworCQlXUklURV9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUiwKKwkJCShwaWNfY29uZmlnLT5tY19jYW52YXNfdV92IDw8IDE2KQorCQkJfCAocGljX2NvbmZpZy0+bWNfY2FudmFzX3VfdiA8PCA4KQorCQkJfCBwaWNfY29uZmlnLT5tY19jYW52YXNfeSk7CisJfQorCisJLyphdXRvX2luYyBzdGFydCBpbmRleDowIGZpZWxkOjAqLworCVdSSVRFX1ZSRUcoVlA5RF9NUFBfUkVGSU5GT19UQkxfQUNDQ09ORklHLCAweDEgPDwgMik7CisJLyppbmRleCAwOmxhc3QgMTpnb2xkZW4gMjphbHRyZWYqLworCWZvciAoaSA9IDA7IGkgPCBSRUZTX1BFUl9GUkFNRTsgaSsrKSB7CisJCWludCByZWZfcGljX2JvZHlfc2l6ZTsKKwkJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnBpY19jb25maWcgPSBjbS0+ZnJhbWVfcmVmc1tpXS5idWY7CisJCWlmICghcGljX2NvbmZpZykKKwkJCWNvbnRpbnVlOworCQlXUklURV9WUkVHKFZQOURfTVBQX1JFRklORk9fREFUQSwgcGljX2NvbmZpZy0+eV9jcm9wX3dpZHRoKTsKKwkJV1JJVEVfVlJFRyhWUDlEX01QUF9SRUZJTkZPX0RBVEEsIHBpY19jb25maWctPnlfY3JvcF9oZWlnaHQpOworCisJaWYgKHBpY19jb25maWctPnlfY3JvcF93aWR0aCAhPSBjdXJfcGljX2NvbmZpZy0+eV9jcm9wX3dpZHRoIHx8CisJCXBpY19jb25maWctPnlfY3JvcF9oZWlnaHQgIT0gY3VyX3BpY19jb25maWctPnlfY3JvcF9oZWlnaHQpIHsKKwkJc2NhbGVfZW5hYmxlIHw9ICgxIDw8IGkpOworCX0KKwlyZWZfcGljX2JvZHlfc2l6ZSA9CisJCWNvbXB1dGVfbG9zbGVzc19jb21wX2JvZHlfc2l6ZShwaWNfY29uZmlnLT55X2Nyb3Bfd2lkdGgsCisJCXBpY19jb25maWctPnlfY3JvcF9oZWlnaHQsIChiaXRfZGVwdGggPT0gVlBYX0JJVFNfMTApKTsKKwlXUklURV9WUkVHKFZQOURfTVBQX1JFRklORk9fREFUQSwKKwkJKHBpY19jb25maWctPnlfY3JvcF93aWR0aCA8PCAxNCkKKwkJLyBjdXJfcGljX2NvbmZpZy0+eV9jcm9wX3dpZHRoKTsKKwlXUklURV9WUkVHKFZQOURfTVBQX1JFRklORk9fREFUQSwKKwkJKHBpY19jb25maWctPnlfY3JvcF9oZWlnaHQgPDwgMTQpCisJCS8gY3VyX3BpY19jb25maWctPnlfY3JvcF9oZWlnaHQpOworCWlmIChwYmktPm1tdV9lbmFibGUpCisJCVdSSVRFX1ZSRUcoVlA5RF9NUFBfUkVGSU5GT19EQVRBLCAwKTsKKwllbHNlCisJCVdSSVRFX1ZSRUcoVlA5RF9NUFBfUkVGSU5GT19EQVRBLCByZWZfcGljX2JvZHlfc2l6ZSA+PiA1KTsKKwl9CisJV1JJVEVfVlJFRyhWUDlEX01QUF9SRUZfU0NBTEVfRU5CTCwgc2NhbGVfZW5hYmxlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfbXByZWRfaHcoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCXVuc2lnbmVkIGludCBkYXRhMzI7CisKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19NUFJFRF9DVFJMNCk7CisJZGF0YTMyICY9ICAofigxIDw8IDYpKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfQ1RSTDQsIGRhdGEzMik7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19tcHJlZF9odyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJc3RydWN0IFZQOV9Db21tb25fcyAqY20gPSAmcGJpLT5jb21tb247CisJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKmN1cl9waWNfY29uZmlnID0gJmNtLT5jdXJfZnJhbWUtPmJ1ZjsKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqbGFzdF9mcmFtZV9waWNfY29uZmlnID0KKwkJCQkJCSZjbS0+cHJldl9mcmFtZS0+YnVmOworCisJdW5zaWduZWQgaW50IGRhdGEzMjsKKwlpbnQgICAgIG1wcmVkX2N1cnJfbGN1X3g7CisJaW50ICAgICBtcHJlZF9jdXJyX2xjdV95OworCWludCAgICAgbXByZWRfbXZfcmRfZW5kX2FkZHI7CisKKworCW1wcmVkX212X3JkX2VuZF9hZGRyID0gbGFzdF9mcmFtZV9waWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyCisJCQkrIGxhc3RfZnJhbWVfcGljX2NvbmZpZy0+bXZfc2l6ZTsKKwkJCS8vKyAobGFzdF9mcmFtZV9waWNfY29uZmlnLT5sY3VfdG90YWwgKiBNVl9NRU1fVU5JVCk7CisKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19NUFJFRF9DVVJSX0xDVSk7CisJbXByZWRfY3Vycl9sY3VfeCAgID0gZGF0YTMyICYgMHhmZmZmOworCW1wcmVkX2N1cnJfbGN1X3kgICA9IChkYXRhMzIgPj4gMTYpICYgMHhmZmZmOworCisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0JVRk1HUikKKwkJcHJfaW5mbygiY3VyIHBpY19jb25maWcgaW5kZXggJWQgIGNvbCBwaWNfY29uZmlnIGluZGV4ICVkXG4iLAorCQkJY3VyX3BpY19jb25maWctPmluZGV4LCBsYXN0X2ZyYW1lX3BpY19jb25maWctPmluZGV4KTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfQ1RSTDMsIDB4MjQxMjI0MTIpOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9BQlZfU1RBUlRfQUREUiwKKwkJCXBiaS0+d29ya19zcGFjZV9idWYtPm1wcmVkX2Fib3ZlLmJ1Zl9zdGFydCk7CisKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19NUFJFRF9DVFJMNCk7CisKKwlkYXRhMzIgJj0gICh+KDEgPDwgNikpOworCWRhdGEzMiB8PSAoY20tPnVzZV9wcmV2X2ZyYW1lX212cyA8PCA2KTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfQ1RSTDQsIGRhdGEzMik7CisKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfV1JfU1RBUlRfQUREUiwKKwkJCWN1cl9waWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyKTsKKwlXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfV1BUUiwgY3VyX3BpY19jb25maWctPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIpOworCisJV1JJVEVfVlJFRyhIRVZDX01QUkVEX01WX1JEX1NUQVJUX0FERFIsCisJCQlsYXN0X2ZyYW1lX3BpY19jb25maWctPm1wcmVkX212X3dyX3N0YXJ0X2FkZHIpOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9NVl9SUFRSLAorCQkJbGFzdF9mcmFtZV9waWNfY29uZmlnLT5tcHJlZF9tdl93cl9zdGFydF9hZGRyKTsKKwkvKmRhdGEzMiA9ICgocGJpLT5sY3VfeF9udW0gLSBwYmktPnRpbGVfd2lkdGhfbGN1KSpNVl9NRU1fVU5JVCk7Ki8KKwkvKldSSVRFX1ZSRUcoSEVWQ19NUFJFRF9NVl9XUl9ST1dfSlVNUCxkYXRhMzIpOyovCisJLypXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfUkRfUk9XX0pVTVAsZGF0YTMyKTsqLworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9NVl9SRF9FTkRfQUREUiwgbXByZWRfbXZfcmRfZW5kX2FkZHIpOworCit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19zYW9faHcoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLCB1bmlvbiBwYXJhbV91ICpwYXJhbXMpCit7CisJc3RydWN0IFZQOV9Db21tb25fcyAqY20gPSAmcGJpLT5jb21tb247CisJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnBpY19jb25maWcgPSAmY20tPmN1cl9mcmFtZS0+YnVmOworCisJdW5zaWduZWQgaW50IGRhdGEzMjsKKwlpbnQgbGN1X3NpemUgPSA2NDsKKwlpbnQgbWNfYnVmZmVyX3NpemVfdV92ID0KKwkJcGljX2NvbmZpZy0+bGN1X3RvdGFsICogbGN1X3NpemUqbGN1X3NpemUvMjsKKwlpbnQgbWNfYnVmZmVyX3NpemVfdV92X2ggPQorCQkobWNfYnVmZmVyX3NpemVfdV92ICsgMHhmZmZmKSA+PiAxNjsvKjY0ayBhbGlnbm1lbnQqLworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqIHY0bDJfY3R4ID0gcGJpLT52NGwyX2N0eDsKKworCWlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUocGJpKSkgeworCQlXUklURV9WUkVHKEhFVkNfU0FPX1lfU1RBUlRfQUREUiwgcGljX2NvbmZpZy0+ZHdfeV9hZHIpOworCQlXUklURV9WUkVHKEhFVkNfU0FPX0NfU1RBUlRfQUREUiwgcGljX2NvbmZpZy0+ZHdfdV92X2Fkcik7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fWV9XUFRSLCBwaWNfY29uZmlnLT5kd195X2Fkcik7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ19XUFRSLCBwaWNfY29uZmlnLT5kd191X3ZfYWRyKTsKKwl9IGVsc2UgeworCQlXUklURV9WUkVHKEhFVkNfU0FPX1lfU1RBUlRfQUREUiwgMHhmZmZmZmZmZik7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ19TVEFSVF9BRERSLCAweGZmZmZmZmZmKTsKKwl9CisJaWYgKHBiaS0+bW11X2VuYWJsZSkKKwkJV1JJVEVfVlJFRyhIRVZDX0NNX0hFQURFUl9TVEFSVF9BRERSLCBwaWNfY29uZmlnLT5oZWFkZXJfYWRyKTsKKworCWlmIChwYmktPmlzX3VzZWRfdjRsKSB7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fWV9MRU5HVEgsIHBpY19jb25maWctPmx1bWFfc2l6ZSk7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ19MRU5HVEgsIHBpY19jb25maWctPmNocm9tYV9zaXplKTsKKwkJaWYgKGRlYnVnICYgUFJJTlRfRkxBR19WNExfREVUQUlMKSB7CisJCQlwcl9pbmZvKCJbJWRdIGNvbmZpZyBwaWMsIGlkOiAlZCwgWTooJXgsICVkKSBDOigleCwgJWQpLlxuIiwKKwkJCQl2NGwyX2N0eC0+aWQsIHBpY19jb25maWctPmluZGV4LAorCQkJCXBpY19jb25maWctPmR3X3lfYWRyLCBwaWNfY29uZmlnLT5sdW1hX3NpemUsCisJCQkJcGljX2NvbmZpZy0+ZHdfdV92X2FkciwgcGljX2NvbmZpZy0+Y2hyb21hX3NpemUpOworCQl9CisJfSBlbHNlIHsKKwkJZGF0YTMyID0gKG1jX2J1ZmZlcl9zaXplX3Vfdl9oIDw8IDE2KSA8PCAxOworCQkvKnByX2luZm8oImRhdGEzMj0leCxtY19idWZmZXJfc2l6ZV91X3ZfaD0leCxsY3VfdG90YWw9JXhcbiIsCisJCQlkYXRhMzIsIG1jX2J1ZmZlcl9zaXplX3Vfdl9oLCBwaWNfY29uZmlnLT5sY3VfdG90YWwpOyovCisKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19ZX0xFTkdUSCwgZGF0YTMyKTsKKworCQlkYXRhMzIgPSAobWNfYnVmZmVyX3NpemVfdV92X2ggPDwgMTYpOworCQlXUklURV9WUkVHKEhFVkNfU0FPX0NfTEVOR1RILCBkYXRhMzIpOworCX0KKworI2lmZGVmIFZQOV8xMEJfTlYyMQorI2lmZGVmIERPU19QUk9KRUNUCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkwxKTsKKwlkYXRhMzIgJj0gKH4weDMwMDApOworCS8qWzEzOjEyXSBheGlfYWZvcm1hdCwgMC1MaW5lYXIsIDEtMzJ4MzIsIDItNjR4MzIqLworCWRhdGEzMiB8PSAocGJpLT5tZW1fbWFwX21vZGUgPDwgMTIpOworCWRhdGEzMiAmPSAofjB4Myk7CisJZGF0YTMyIHw9IDB4MTsgLyogWzFdOmR3X2Rpc2FibGUgWzBdOmNtX2Rpc2FibGUqLworCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDEsIGRhdGEzMik7CisJLypbMjM6MjJdIGR3X3YxX2N0cmwgWzIxOjIwXSBkd192MF9jdHJsIFsxOToxOF0gZHdfaDFfY3RybAorCSAqCVsxNzoxNl0gZHdfaDBfY3RybAorCSAqLworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NBT19DVFJMNSk7CisJLypzZXQgdGhlbSBhbGwgMCBmb3IgSDI2NV9OVjIxIChubyBkb3duLXNjYWxlKSovCisJZGF0YTMyICY9IH4oMHhmZiA8PCAxNik7CisJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMNSwgZGF0YTMyKTsKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ0RfSVBQX0FYSUlGX0NPTkZJRyk7CisJZGF0YTMyICY9ICh+MHgzMCk7CisJLypbNTo0XSBhZGRyZXNzX2Zvcm1hdCAwMDpsaW5lYXIgMDE6MzJ4MzIgMTA6NjR4MzIqLworCWRhdGEzMiB8PSAocGJpLT5tZW1fbWFwX21vZGUgPDwgNCk7CisJV1JJVEVfVlJFRyhIRVZDRF9JUFBfQVhJSUZfQ09ORklHLCBkYXRhMzIpOworI2Vsc2UKKwkvKm04YmFieSB0ZXN0MTkwMiovCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkwxKTsKKwlkYXRhMzIgJj0gKH4weDMwMDApOworCS8qWzEzOjEyXSBheGlfYWZvcm1hdCwgMC1MaW5lYXIsIDEtMzJ4MzIsIDItNjR4MzIqLworCWRhdGEzMiB8PSAocGJpLT5tZW1fbWFwX21vZGUgPDwgMTIpOworCWRhdGEzMiAmPSAofjB4ZmYwKTsKKwkvKmRhdGEzMiB8PSAweDY3MDsqLyAvKkJpZy1FbmRpYW4gcGVyIDY0LWJpdCovCisJZGF0YTMyIHw9IDB4ODgwOyAgLyouQmlnLUVuZGlhbiBwZXIgNjQtYml0ICovCisJZGF0YTMyICY9ICh+MHgzKTsKKwlkYXRhMzIgfD0gMHgxOyAvKlsxXTpkd19kaXNhYmxlIFswXTpjbV9kaXNhYmxlKi8KKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkwxLCBkYXRhMzIpOworCS8qIFsyMzoyMl0gZHdfdjFfY3RybCBbMjE6MjBdIGR3X3YwX2N0cmwKKwkgKlsxOToxOF0gZHdfaDFfY3RybCBbMTc6MTZdIGR3X2gwX2N0cmwKKwkgKi8KKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDUpOworCS8qIHNldCB0aGVtIGFsbCAwIGZvciBIMjY1X05WMjEgKG5vIGRvd24tc2NhbGUpKi8KKwlkYXRhMzIgJj0gfigweGZmIDw8IDE2KTsKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkw1LCBkYXRhMzIpOworCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNEX0lQUF9BWElJRl9DT05GSUcpOworCWRhdGEzMiAmPSAofjB4MzApOworCS8qWzU6NF0gYWRkcmVzc19mb3JtYXQgMDA6bGluZWFyIDAxOjMyeDMyIDEwOjY0eDMyKi8KKwlkYXRhMzIgfD0gKHBiaS0+bWVtX21hcF9tb2RlIDw8IDQpOworCWRhdGEzMiAmPSAofjB4Rik7CisJZGF0YTMyIHw9IDB4ODsgLypCaWctRW5kaWFuIHBlciA2NC1iaXQqLworCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX0FYSUlGX0NPTkZJRywgZGF0YTMyKTsKKyNlbmRpZgorI2Vsc2UKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDEpOworCWRhdGEzMiAmPSAofigzIDw8IDE0KSk7CisJZGF0YTMyIHw9ICgyIDw8IDE0KTsJLyogbGluZSBhbGlnbiB3aXRoIDY0Ki8KKworCWRhdGEzMiAmPSAofjB4MzAwMCk7CisJLyogWzEzOjEyXSBheGlfYWZvcm1hdCwgMC1MaW5lYXIsIDEtMzJ4MzIsIDItNjR4MzIgKi8KKwlkYXRhMzIgfD0gKHBiaS0+bWVtX21hcF9tb2RlIDw8IDEyKTsKKworCWRhdGEzMiAmPSAofjB4ZmYwKTsKKwlkYXRhMzIgfD0gKChwYmktPmVuZGlhbiA+PiA4KSAmIDB4ZmZmKTsJLyogQmlnLUVuZGlhbiBwZXIgNjQtYml0ICovCisJZGF0YTMyICY9ICh+MHgzKTsgCQkvKlsxXTpkd19kaXNhYmxlIFswXTpjbV9kaXNhYmxlKi8KKwlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKHBiaSkgPT0gMCkKKwkJZGF0YTMyIHw9IDB4MjsgLypkaXNhYmxlIGRvdWJsZSB3cml0ZSovCisJZWxzZSBpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKHBiaSkgJiAweDEwKQorCQlkYXRhMzIgfD0gMHgxOyAvKmRpc2FibGUgY20qLworCSBpZiAgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQSkgeyAvKiA+PSBHMTJBIGR3IHdyaXRlIGNvbnRyb2wgKi8KKwkJdW5zaWduZWQgaW50IGRhdGE7CisJCWRhdGEgPSBSRUFEX1ZSRUcoSEVWQ19EQkxLX0NGR0IpOworCQlkYXRhICY9ICh+MHgzMDApOyAvKls4XTpmaXJzdCB3cml0ZSBlbmFibGUgKGNvbXByZXNzKSAgWzldOmRvdWJsZSB3cml0ZSBlbmFibGUgKHVuY29tcHJlc3MpKi8KKwkJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShwYmkpID09IDApCisJCQlkYXRhIHw9ICgweDEgPDwgOCk7IC8qZW5hYmxlIGZpcnN0IHdyaXRlKi8KKwkJZWxzZSBpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKHBiaSkgJiAweDEwKQorCQkJZGF0YSB8PSAoMHgxIDw8IDkpOyAvKmRvdWJsZSB3cml0ZSBvbmx5Ki8KKwkJZWxzZQorCQkJZGF0YSB8PSAoKDB4MSA8PCA4KSAgfCgweDEgPDwgOSkpOworCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkdCLCBkYXRhKTsKKwl9CisKKwkvKiBzd2FwIHV2ICovCisJaWYgKHBiaS0+aXNfdXNlZF92NGwpIHsKKwkJaWYgKCh2NGwyX2N0eC0+cV9kYXRhW0FNTF9RX0RBVEFfRFNUXS5mbXQtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfTlYyMSkgfHwKKwkJCSh2NGwyX2N0eC0+cV9kYXRhW0FNTF9RX0RBVEFfRFNUXS5mbXQtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfTlYyMU0pKQorCQkJZGF0YTMyICY9IH4oMSA8PCA4KTsgLyogTlYyMSAqLworCQllbHNlCisJCQlkYXRhMzIgfD0gKDEgPDwgOCk7IC8qIE5WMTIgKi8KKwl9CisKKwkvKgorCSogIFszMToyNF0gYXJfZmlmbzFfYXhpX3RocmVkCisJKiAgWzIzOjE2XSBhcl9maWZvMF9heGlfdGhyZWQKKwkqICBbMTU6MTRdIGF4aV9saW5lYWxpZ24sIDAtMTZieXRlcywgMS0zMmJ5dGVzLCAyLTY0Ynl0ZXMKKwkqICBbMTM6MTJdIGF4aV9hZm9ybWF0LCAwLUxpbmVhciwgMS0zMngzMiwgMi02NHgzMgorCSogIFsxMTowOF0gYXhpX2xlbmRpYW5fQworCSogIFswNzowNF0gYXhpX2xlbmRpYW5fWQorCSogIFszXSAgICAgcmVzZXJ2ZWQKKwkqICBbMl0gICAgIGNsa19mb3JjZW9uCisJKiAgWzFdICAgICBkd19kaXNhYmxlOmRpc2FibGUgZG91YmxlIHdyaXRlIG91dHB1dAorCSogIFswXSAgICAgY21fZGlzYWJsZTpkaXNhYmxlIGNvbXByZXNzIG91dHB1dAorCSovCisJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMMSwgZGF0YTMyKTsKKworCWlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUocGJpKSAmIDB4MTApIHsKKwkJLyogWzIzOjIyXSBkd192MV9jdHJsCisJCSAqWzIxOjIwXSBkd192MF9jdHJsCisJCSAqWzE5OjE4XSBkd19oMV9jdHJsCisJCSAqWzE3OjE2XSBkd19oMF9jdHJsCisJCSAqLworCQlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDUpOworCQkvKnNldCB0aGVtIGFsbCAwIGZvciBIMjY1X05WMjEgKG5vIGRvd24tc2NhbGUpKi8KKwkJZGF0YTMyICY9IH4oMHhmZiA8PCAxNik7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDUsIGRhdGEzMik7CisJfSBlbHNlIHsKKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDcpCisJCQlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkwyNiwgMCk7CisKKwkJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkw1KTsKKwkJZGF0YTMyICY9ICh+KDB4ZmYgPDwgMTYpKTsKKwkJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShwYmkpID09IDggfHwKKwkJCWdldF9kb3VibGVfd3JpdGVfbW9kZShwYmkpID09IDkpIHsKKwkJCWRhdGEzMiB8PSAoMHhmZiA8PCAxNik7CisJCQlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkwyNiwgMHhmKTsKKwkJfSBlbHNlIGlmIChnZXRfZG91YmxlX3dyaXRlX21vZGUocGJpKSA9PSAyIHx8CisJCQlnZXRfZG91YmxlX3dyaXRlX21vZGUocGJpKSA9PSAzKQorCQkJZGF0YTMyIHw9ICgweGZmIDw8IDE2KTsKKwkJZWxzZSBpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKHBiaSkgPT0gNCkKKwkJCWRhdGEzMiB8PSAoMHgzMyA8PCAxNik7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fQ1RSTDUsIGRhdGEzMik7CisJfQorCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNEX0lQUF9BWElJRl9DT05GSUcpOworCWRhdGEzMiAmPSAofjB4MzApOworCS8qIFs1OjRdICAgIC0tIGFkZHJlc3NfZm9ybWF0IDAwOmxpbmVhciAwMTozMngzMiAxMDo2NHgzMiAqLworCWRhdGEzMiB8PSAocGJpLT5tZW1fbWFwX21vZGUgPDwgNCk7CisJZGF0YTMyICY9ICh+MHhmKTsKKwlkYXRhMzIgfD0gKHBiaS0+ZW5kaWFuICYgMHhmKTsgIC8qIHZhbGlkIG9ubHkgd2hlbiBkb3VibGUgd3JpdGUgb25seSAqLworCisJLyogc3dhcCB1diAqLworCWlmIChwYmktPmlzX3VzZWRfdjRsKSB7CisJCWlmICgodjRsMl9jdHgtPnFfZGF0YVtBTUxfUV9EQVRBX0RTVF0uZm10LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX05WMjEpIHx8CisJCQkodjRsMl9jdHgtPnFfZGF0YVtBTUxfUV9EQVRBX0RTVF0uZm10LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX05WMjFNKSkKKwkJCWRhdGEzMiB8PSAoMSA8PCAxMik7IC8qIE5WMjEgKi8KKwkJZWxzZQorCQkJZGF0YTMyICY9IH4oMSA8PCAxMik7IC8qIE5WMTIgKi8KKwl9CisJZGF0YTMyICY9ICh+KDMgPDwgOCkpOworCWRhdGEzMiB8PSAoMiA8PCA4KTsJCS8qIGxpbmUgYWxpZ24gd2l0aCA2NCBmb3IgZHcgb25seSAqLworCS8qCisJKiBbMzowXSAgIGxpdHRsZV9lbmRpYW4KKwkqIFs1OjRdICAgYWRkcmVzc19mb3JtYXQgMDA6bGluZWFyIDAxOjMyeDMyIDEwOjY0eDMyCisJKiBbNzo2XSAgIHJlc2VydmVkCisJKiBbOTo4XSAgIExpbmVhcl9MaW5lQWxpZ25tZW50IDAwOjE2Ynl0ZSAwMTozMmJ5dGUgMTA6NjRieXRlCisJKiBbMTE6MTBdIHJlc2VydmVkCisJKiBbMTJdICAgIENiQ3JfYnl0ZV9zd2FwCisJKiBbMzE6MTNdIHJlc2VydmVkCisJKi8KKwlXUklURV9WUkVHKEhFVkNEX0lQUF9BWElJRl9DT05GSUcsIGRhdGEzMik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgdnA5X2NvbmZpZ193b3JrX3NwYWNlX2h3KHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwgdTMyIG1hc2spCit7CisJc3RydWN0IEJ1ZmZJbmZvX3MgKmJ1Zl9zcGVjID0gcGJpLT53b3JrX3NwYWNlX2J1ZjsKKwl1bnNpZ25lZCBpbnQgZGF0YTMyOworCWludCBsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUsIGxvc2xlc3NfY29tcF9ib2R5X3NpemU7CisKKwlpZiAoZGVidWcgJiYgcGJpLT5pbml0X2ZsYWcgPT0gMCkKKwkJcHJfaW5mbygiJXMgdyAlZCBoICVkICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4XG4iLAorCQkJX19mdW5jX18sCisJCQlidWZfc3BlYy0+bWF4X3dpZHRoLAorCQkJYnVmX3NwZWMtPm1heF9oZWlnaHQsCisJCQlidWZfc3BlYy0+aXBwLmJ1Zl9zdGFydCwKKwkJCWJ1Zl9zcGVjLT5zdGFydF9hZHIsCisJCQlidWZfc3BlYy0+c2hvcnRfdGVybV9ycHMuYnVmX3N0YXJ0LAorCQkJYnVmX3NwZWMtPnZwcy5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+c3BzLmJ1Zl9zdGFydCwKKwkJCWJ1Zl9zcGVjLT5wcHMuYnVmX3N0YXJ0LAorCQkJYnVmX3NwZWMtPnNhb191cC5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+c3dhcF9idWYuYnVmX3N0YXJ0LAorCQkJYnVmX3NwZWMtPnN3YXBfYnVmMi5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+c2NhbGVsdXQuYnVmX3N0YXJ0LAorCQkJYnVmX3NwZWMtPmRibGtfcGFyYS5idWZfc3RhcnQsCisJCQlidWZfc3BlYy0+ZGJsa19kYXRhLmJ1Zl9zdGFydCk7CisKKwlpZiAobWFzayAmIEhXX01BU0tfRlJPTlQpIHsKKwkJaWYgKChkZWJ1ZyAmIFZQOV9ERUJVR19TRU5EX1BBUkFNX1dJVEhfUkVHKSA9PSAwKQorCQkJV1JJVEVfVlJFRyhIRVZDX1JQTV9CVUZGRVIsICh1MzIpcGJpLT5ycG1fcGh5X2FkZHIpOworCisJCVdSSVRFX1ZSRUcoSEVWQ19TSE9SVF9URVJNX1JQUywKKwkJCWJ1Zl9zcGVjLT5zaG9ydF90ZXJtX3Jwcy5idWZfc3RhcnQpOworCQkvKldSSVRFX1ZSRUcoSEVWQ19WUFNfQlVGRkVSLCBidWZfc3BlYy0+dnBzLmJ1Zl9zdGFydCk7Ki8KKwkJLypXUklURV9WUkVHKEhFVkNfU1BTX0JVRkZFUiwgYnVmX3NwZWMtPnNwcy5idWZfc3RhcnQpOyovCisJCVdSSVRFX1ZSRUcoSEVWQ19QUFNfQlVGRkVSLCBidWZfc3BlYy0+cHBzLmJ1Zl9zdGFydCk7CisJCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fU1dBUF9CVUZGRVIsCisJCQlidWZfc3BlYy0+c3dhcF9idWYuYnVmX3N0YXJ0KTsKKwkJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9TV0FQX0JVRkZFUjIsCisJCQlidWZfc3BlYy0+c3dhcF9idWYyLmJ1Zl9zdGFydCk7CisJCVdSSVRFX1ZSRUcoTE1FTV9EVU1QX0FEUiwgKHUzMilwYmktPmxtZW1fcGh5X2FkZHIpOworCisJfQorCisJaWYgKG1hc2sgJiBIV19NQVNLX0JBQ0spIHsKKyNpZmRlZiBMT1NMRVNTX0NPTVBSRVNTX01PREUKKwlsb3NsZXNzX2NvbXBfaGVhZGVyX3NpemUgPQorCQljb21wdXRlX2xvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZShwYmktPmluaXRfcGljX3csCisJCXBiaS0+aW5pdF9waWNfaCk7CisJbG9zbGVzc19jb21wX2JvZHlfc2l6ZSA9CisJCWNvbXB1dGVfbG9zbGVzc19jb21wX2JvZHlfc2l6ZShwYmktPmluaXRfcGljX3csCisJCXBiaS0+aW5pdF9waWNfaCwgYnVmX2FsbG9jX2RlcHRoID09IDEwKTsKKyNlbmRpZgorCVdSSVRFX1ZSRUcoSEVWQ0RfSVBQX0xJTkVCVUZGX0JBU0UsCisJCWJ1Zl9zcGVjLT5pcHAuYnVmX3N0YXJ0KTsKKwkvL1dSSVRFX1ZSRUcoSEVWQ19TQU9fVVAsIGJ1Zl9zcGVjLT5zYW9fdXAuYnVmX3N0YXJ0KTsKKwkvL1dSSVRFX1ZSRUcoSEVWQ19TQ0FMRUxVVCwgYnVmX3NwZWMtPnNjYWxlbHV0LmJ1Zl9zdGFydCk7CisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQSkgeworCQkvKiBjZmdfYWRkcl9hZHAqLworCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkdFLCBidWZfc3BlYy0+ZGJsa19wYXJhLmJ1Zl9zdGFydCk7CisJCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19CVUZNR1JfTU9SRSkKKwkJCXByX2luZm8oIldyaXRlIEhFVkNfREJMS19DRkdFXG4iKTsKKwl9CisJLyogY2ZnX3BfYWRkciAqLworCVdSSVRFX1ZSRUcoSEVWQ19EQkxLX0NGRzQsIGJ1Zl9zcGVjLT5kYmxrX3BhcmEuYnVmX3N0YXJ0KTsKKworCS8qIGNmZ19kX2FkZHIgKi8KKwlXUklURV9WUkVHKEhFVkNfREJMS19DRkc1LCBidWZfc3BlYy0+ZGJsa19kYXRhLmJ1Zl9zdGFydCk7CisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpIHsKKwkJIC8qCisJICAgICAqIGRhdGEzMiA9IChSRUFEX1ZSRUcoUF9IRVZDX0RCTEtfQ0ZHMyk+PjgpICYgMHhmZjsgLy8geGlvIGxlZnQgb2Zmc2V0LCBkZWZhdWx0IGlzIDB4NDAKKwkgICAgICogZGF0YTMyID0gZGF0YTMyICogMjsKKwkgICAgICogZGF0YTMyID0gKFJFQURfVlJFRyhQX0hFVkNfREJMS19DRkczKT4+MTYpICYgMHhmZjsgLy8gYWRwIGxlZnQgb2Zmc2V0LCBkZWZhdWx0IGlzIDB4MDQwCisJICAgICAqIGRhdGEzMiA9IGRhdGEzMiAqIDI7CisJICAgICAqLworCQlpZiAoYnVmX3NwZWMtPm1heF93aWR0aCA8PSA0MDk2ICYmIGJ1Zl9zcGVjLT5tYXhfaGVpZ2h0IDw9IDIzMDQpCisJCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkczLCAweDQwNDAxMCk7IC8vZGVmYXVsdCB2YWx1ZQorCQllbHNlCisJCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkczLCAweDgwODAyMCk7IC8vIG1ha2UgbGVmdCBzdG9yYWdlIDIgeCA0a10KKwkJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHX0JVRk1HUl9NT1JFLAorCQkJIkhFVkNfREJMS19DRkczID0gJXhcbiIsIFJFQURfVlJFRyhIRVZDX0RCTEtfQ0ZHMykpOworCX0KKyNpZmRlZiBMT1NMRVNTX0NPTVBSRVNTX01PREUKKwlpZiAocGJpLT5tbXVfZW5hYmxlKSB7CisJCS8qYml0WzRdIDogcGFnZWRfbWVtX21vZGUqLworCQlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMSwgKDB4MSA8PCA0KSk7CisJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPCBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKQorCQkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDIsIDApOworCX0gZWxzZSB7CisJCS8qaWYoY3VyX3BpY19jb25maWctPmJpdF9kZXB0aCA9PSBWUFhfQklUU18xMCkKKwkJICoJV1JJVEVfVlJFRyhQX0hFVkNEX01QUF9ERUNPTVBfQ1RMMSwgKDA8PDMpKTsKKwkJICovCisJCS8qYml0WzNdIHNtZW0gbWRvZSovCisJCS8qZWxzZSBXUklURV9WUkVHKFBfSEVWQ0RfTVBQX0RFQ09NUF9DVEwxLCAoMTw8MykpOyovCisJCS8qYml0WzNdIHNtZW0gbWRvZSovCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwyLAorCQkJKGxvc2xlc3NfY29tcF9ib2R5X3NpemUgPj4gNSkpOworCX0KKwkvKldSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwyLAorCQkobG9zbGVzc19jb21wX2JvZHlfc2l6ZSA+PiA1KSk7Ki8KKwkvKldSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9DVEwzLAorCQkoMHhmZjw8MjApIHwgKDB4ZmY8PDEwKSB8IDB4ZmYpOyovCisJLyo4LWJpdCBtb2RlICovCisJV1JJVEVfVlJFRyhIRVZDX0NNX0JPRFlfTEVOR1RILCBsb3NsZXNzX2NvbXBfYm9keV9zaXplKTsKKwlXUklURV9WUkVHKEhFVkNfQ01fSEVBREVSX09GRlNFVCwgbG9zbGVzc19jb21wX2JvZHlfc2l6ZSk7CisJV1JJVEVfVlJFRyhIRVZDX0NNX0hFQURFUl9MRU5HVEgsIGxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSk7CisKKwlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKHBiaSkgJiAweDEwKQorCQlXUklURV9WUkVHKEhFVkNEX01QUF9ERUNPTVBfQ1RMMSwgMHgxIDw8IDMxKTsKKyNlbHNlCisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDEsIDB4MSA8PCAzMSk7CisjZW5kaWYKKworCWlmIChwYmktPm1tdV9lbmFibGUpIHsKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19NTVVfVkgwX0FERFIsIGJ1Zl9zcGVjLT5tbXVfdmJoLmJ1Zl9zdGFydCk7CisJCVdSSVRFX1ZSRUcoSEVWQ19TQU9fTU1VX1ZIMV9BRERSLCBidWZfc3BlYy0+bW11X3ZiaC5idWZfc3RhcnQKKwkJCQkrIFZCSF9CVUZfU0laRShidWZfc3BlYykpOworCQkvKmRhdGEzMiA9IFJFQURfVlJFRyhQX0hFVkNfU0FPX0NUUkw5KTsqLworCQkvKmRhdGEzMiB8PSAweDE7Ki8KKwkJLypXUklURV9WUkVHKFBfSEVWQ19TQU9fQ1RSTDksIGRhdGEzMik7Ki8KKworCQkvKiB1c2UgSEVWQ19DTV9IRUFERVJfU1RBUlRfQUREUiAqLworCQlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TQU9fQ1RSTDUpOworCQlkYXRhMzIgfD0gKDE8PDEwKTsKKwkJV1JJVEVfVlJFRyhIRVZDX1NBT19DVFJMNSwgZGF0YTMyKTsKKwl9CisKKwkvKiBjb25maWcgbXByZWQgYXhpIGJ1cnN0IHRocmVzaG9sZCAqLworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9DVFJMMywgMHgyNDEyMjQxMik7CisKKyNpZmRlZiBDT19NVl9DT01QUkVTUworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3KSB7CisJICAgIGRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX01QUkVEX0NUUkw0KTsKKwkgICAgZGF0YTMyIHw9ICAoMSA8PCAxKTsKKwkgICAgV1JJVEVfVlJFRyhIRVZDX01QUkVEX0NUUkw0LCBkYXRhMzIpOworCX0KKyNlbmRpZgorCVdSSVRFX1ZSRUcoVlA5X1NFR19NQVBfQlVGRkVSLCBidWZfc3BlYy0+c2VnX21hcC5idWZfc3RhcnQpOworCisJV1JJVEVfVlJFRyhMTUVNX0RVTVBfQURSLCAodTMyKXBiaS0+bG1lbV9waHlfYWRkcik7CisJCSAvKiovCisJCVdSSVRFX1ZSRUcoVlA5X1BST0JfU1dBUF9CVUZGRVIsIHBiaS0+cHJvYl9idWZmZXJfcGh5X2FkZHIpOworCQlXUklURV9WUkVHKFZQOV9DT1VOVF9TV0FQX0JVRkZFUiwgcGJpLT5jb3VudF9idWZmZXJfcGh5X2FkZHIpOworCQlpZiAocGJpLT5tbXVfZW5hYmxlKSB7CisJCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKQorCQkJCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTU1VX01BUF9BRERSLCBwYmktPmZyYW1lX21tdV9tYXBfcGh5X2FkZHIpOworCQkJZWxzZQorCQkJCVdSSVRFX1ZSRUcoVlA5X01NVV9NQVBfQlVGRkVSLCBwYmktPmZyYW1lX21tdV9tYXBfcGh5X2FkZHIpOworCQl9CisJfQorfQorCisKKyNpZmRlZiBWUDlfTFBGX0xWTF9VUERBVEUKKy8qCisgKiBEZWZpbmVzLCBkZWNsYXJhdGlvbnMsIHN1Yi1mdW5jdGlvbnMgZm9yIHZwOSBkZS1ibG9jayBsb29wCisJZmlsdGVyIFRoci9MdmwgdGFibGUgdXBkYXRlCisgKiAtIHN0cnVjdCBzZWdtZW50YXRpb24gaXMgZm9yIGxvb3AgZmlsdGVyIG9ubHkgKHJlbW92ZWQgc29tZXRoaW5nKQorICogLSBmdW5jdGlvbiAidnA5X2xvb3BfZmlsdGVyX2luaXQiIGFuZCAidnA5X2xvb3BfZmlsdGVyX2ZyYW1lX2luaXQiIHdpbGwKKwliZSBpbnN0YW50aWF0ZWQgaW4gQ19FbnRyeQorICogLSB2cDlfbG9vcF9maWx0ZXJfaW5pdCBydW4gb25jZSBiZWZvcmUgZGVjb2Rpbmcgc3RhcnQKKyAqIC0gdnA5X2xvb3BfZmlsdGVyX2ZyYW1lX2luaXQgcnVuIGJlZm9yZSBldmVyeSBmcmFtZSBkZWNvZGluZyBzdGFydAorICogLSBzZXQgdmlkZW8gZm9ybWF0IHRvIFZQOSBpcyBpbiB2cDlfbG9vcF9maWx0ZXJfaW5pdAorICovCisjZGVmaW5lIE1BWF9MT09QX0ZJTFRFUiA2MworI2RlZmluZSBNQVhfUkVGX0xGX0RFTFRBUyA0CisjZGVmaW5lIE1BWF9NT0RFX0xGX0RFTFRBUyAyCisvKiNkZWZpbmUgSU5UUkFfRlJBTUUgMCovCisvKiNkZWZpbmUgTEFTVF9GUkFNRSAxKi8KKy8qI2RlZmluZSBNQVhfUkVGX0ZSQU1FUyA0Ki8KKyNkZWZpbmUgU0VHTUVOVF9ERUxUQURBVEEgICAwCisjZGVmaW5lIFNFR01FTlRfQUJTREFUQSAgICAgMQorI2RlZmluZSBNQVhfU0VHTUVOVFMgICAgIDgKKy8qLiNkZWZpbmUgU0VHX1RSRUVfUFJPQlMgICAoTUFYX1NFR01FTlRTLTEpKi8KKy8qbm8gdXNlIGZvciBsb29wIGZpbHRlciwgaWYgdGhpcyBzdHJ1Y3QgZm9yIGNvbW1vbiB1c2UsIHBscyBhZGQgaXQgYmFjayovCisvKiNkZWZpbmUgUFJFRElDVElPTl9QUk9CUyAzKi8KKy8qIG5vIHVzZSBmb3IgbG9vcCBmaWx0ZXIsIGlmIHRoaXMgc3RydWN0IGZvciBjb21tb24gdXNlLCBwbHMgYWRkIGl0IGJhY2sqLworCitlbnVtIFNFR19MVkxfRkVBVFVSRVMgeworCVNFR19MVkxfQUxUX1EgPSAwLCAvKlVzZSBhbHRlcm5hdGUgUXVhbnRpemVyIC4uLi4qLworCVNFR19MVkxfQUxUX0xGID0gMSwgLypVc2UgYWx0ZXJuYXRlIGxvb3AgZmlsdGVyIHZhbHVlLi4uKi8KKwlTRUdfTFZMX1JFRl9GUkFNRSA9IDIsIC8qT3B0aW9uYWwgU2VnbWVudCByZWZlcmVuY2UgZnJhbWUqLworCVNFR19MVkxfU0tJUCA9IDMsICAvKk9wdGlvbmFsIFNlZ21lbnQgKDAsMCkgKyBza2lwIG1vZGUqLworCVNFR19MVkxfTUFYID0gNCAgICAvKk51bWJlciBvZiBmZWF0dXJlcyBzdXBwb3J0ZWQqLworfTsKKworc3RydWN0IHNlZ21lbnRhdGlvbiB7CisJdWludDhfdCBlbmFibGVkOworCXVpbnQ4X3QgdXBkYXRlX21hcDsKKwl1aW50OF90IHVwZGF0ZV9kYXRhOworCXVpbnQ4X3QgYWJzX2RlbHRhOworCXVpbnQ4X3QgdGVtcG9yYWxfdXBkYXRlOworCisJLypubyB1c2UgZm9yIGxvb3AgZmlsdGVyLCBpZiB0aGlzIHN0cnVjdAorCSAqZm9yIGNvbW1vbiB1c2UsIHBscyBhZGQgaXQgYmFjaworCSAqLworCS8qdnA5X3Byb2IgdHJlZV9wcm9ic1tTRUdfVFJFRV9QUk9CU107ICovCisJLyogbm8gdXNlIGZvciBsb29wIGZpbHRlciwgaWYgdGhpcyBzdHJ1Y3QKKwkgKglmb3IgY29tbW9uIHVzZSwgcGxzIGFkZCBpdCBiYWNrCisJICovCisJLyp2cDlfcHJvYiBwcmVkX3Byb2JzW1BSRURJQ1RJT05fUFJPQlNdOyovCisKKwlpbnQxNl90IGZlYXR1cmVfZGF0YVtNQVhfU0VHTUVOVFNdW1NFR19MVkxfTUFYXTsKKwl1bnNpZ25lZCBpbnQgZmVhdHVyZV9tYXNrW01BWF9TRUdNRU5UU107Cit9OworCitzdHJ1Y3QgbG9vcF9maWx0ZXJfdGhyZXNoIHsKKwl1aW50OF90IG1ibGltOworCXVpbnQ4X3QgbGltOworCXVpbnQ4X3QgaGV2X3RocjsKK307CisKK3N0cnVjdCBsb29wX2ZpbHRlcl9pbmZvX24geworCXN0cnVjdCBsb29wX2ZpbHRlcl90aHJlc2ggbGZ0aHJbTUFYX0xPT1BfRklMVEVSICsgMV07CisJdWludDhfdCBsdmxbTUFYX1NFR01FTlRTXVtNQVhfUkVGX0ZSQU1FU11bTUFYX01PREVfTEZfREVMVEFTXTsKK307CisKK3N0cnVjdCBsb29wZmlsdGVyIHsKKwlpbnQgZmlsdGVyX2xldmVsOworCisJaW50IHNoYXJwbmVzc19sZXZlbDsKKwlpbnQgbGFzdF9zaGFycG5lc3NfbGV2ZWw7CisKKwl1aW50OF90IG1vZGVfcmVmX2RlbHRhX2VuYWJsZWQ7CisJdWludDhfdCBtb2RlX3JlZl9kZWx0YV91cGRhdGU7CisKKwkvKjAgPSBJbnRyYSwgTGFzdCwgR0YsIEFSRiovCisJc2lnbmVkIGNoYXIgcmVmX2RlbHRhc1tNQVhfUkVGX0xGX0RFTFRBU107CisJc2lnbmVkIGNoYXIgbGFzdF9yZWZfZGVsdGFzW01BWF9SRUZfTEZfREVMVEFTXTsKKworCS8qMCA9IFpFUk9fTVYsIE1WKi8KKwlzaWduZWQgY2hhciBtb2RlX2RlbHRhc1tNQVhfTU9ERV9MRl9ERUxUQVNdOworCXNpZ25lZCBjaGFyIGxhc3RfbW9kZV9kZWx0YXNbTUFYX01PREVfTEZfREVMVEFTXTsKK307CisKK3N0YXRpYyBpbnQgdnA5X2NsYW1wKGludCB2YWx1ZSwgaW50IGxvdywgaW50IGhpZ2gpCit7CisJcmV0dXJuIHZhbHVlIDwgbG93ID8gbG93IDogKHZhbHVlID4gaGlnaCA/IGhpZ2ggOiB2YWx1ZSk7Cit9CisKK2ludCBzZWdmZWF0dXJlX2FjdGl2ZShzdHJ1Y3Qgc2VnbWVudGF0aW9uICpzZWcsCisJCQlpbnQgc2VnbWVudF9pZCwKKwkJCWVudW0gU0VHX0xWTF9GRUFUVVJFUyBmZWF0dXJlX2lkKSB7CisJcmV0dXJuIHNlZy0+ZW5hYmxlZCAmJgorCQkoc2VnLT5mZWF0dXJlX21hc2tbc2VnbWVudF9pZF0gJiAoMSA8PCBmZWF0dXJlX2lkKSk7Cit9CisKK2ludCBnZXRfc2VnZGF0YShzdHJ1Y3Qgc2VnbWVudGF0aW9uICpzZWcsIGludCBzZWdtZW50X2lkLAorCQkJCWVudW0gU0VHX0xWTF9GRUFUVVJFUyBmZWF0dXJlX2lkKSB7CisJcmV0dXJuIHNlZy0+ZmVhdHVyZV9kYXRhW3NlZ21lbnRfaWRdW2ZlYXR1cmVfaWRdOworfQorCitzdGF0aWMgdm9pZCB2cDlfdXBkYXRlX3NoYXJwbmVzcyhzdHJ1Y3QgbG9vcF9maWx0ZXJfaW5mb19uICpsZmksCisJCQkJCWludCBzaGFycG5lc3NfbHZsKQoreworCWludCBsdmw7CisJLypGb3IgZWFjaCBwb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIGxvb3AgZmlsdGVyIGZpbGwgb3V0IGxpbWl0cyovCisJZm9yIChsdmwgPSAwOyBsdmwgPD0gTUFYX0xPT1BfRklMVEVSOyBsdmwrKykgeworCQkvKlNldCBsb29wIGZpbHRlciBwYXJhbWV0ZXJzIHRoYXQgY29udHJvbCBzaGFycG5lc3MuKi8KKwkJaW50IGJsb2NrX2luc2lkZV9saW1pdCA9IGx2bCA+PiAoKHNoYXJwbmVzc19sdmwgPiAwKSArCisJCQkJCShzaGFycG5lc3NfbHZsID4gNCkpOworCisJCWlmIChzaGFycG5lc3NfbHZsID4gMCkgeworCQkJaWYgKGJsb2NrX2luc2lkZV9saW1pdCA+ICg5IC0gc2hhcnBuZXNzX2x2bCkpCisJCQkJYmxvY2tfaW5zaWRlX2xpbWl0ID0gKDkgLSBzaGFycG5lc3NfbHZsKTsKKwkJfQorCisJCWlmIChibG9ja19pbnNpZGVfbGltaXQgPCAxKQorCQkJYmxvY2tfaW5zaWRlX2xpbWl0ID0gMTsKKworCQlsZmktPmxmdGhyW2x2bF0ubGltID0gKHVpbnQ4X3QpYmxvY2tfaW5zaWRlX2xpbWl0OworCQlsZmktPmxmdGhyW2x2bF0ubWJsaW0gPSAodWludDhfdCkoMiAqIChsdmwgKyAyKSArCisJCQkJYmxvY2tfaW5zaWRlX2xpbWl0KTsKKwl9Cit9CisKKy8qaW5zdGFudGlhdGUgdGhpcyBmdW5jdGlvbiBvbmNlIHdoZW4gZGVjb2RlIGlzIHN0YXJ0ZWQqLwordm9pZCB2cDlfbG9vcF9maWx0ZXJfaW5pdChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJc3RydWN0IGxvb3BfZmlsdGVyX2luZm9fbiAqbGZpID0gcGJpLT5sZmk7CisJc3RydWN0IGxvb3BmaWx0ZXIgKmxmID0gcGJpLT5sZjsKKwlzdHJ1Y3Qgc2VnbWVudGF0aW9uICpzZWdfNGxmID0gcGJpLT5zZWdfNGxmOworCWludCBpOworCXVuc2lnbmVkIGludCBkYXRhMzI7CisKKwltZW1zZXQobGZpLCAwLCBzaXplb2Yoc3RydWN0IGxvb3BfZmlsdGVyX2luZm9fbikpOworCW1lbXNldChsZiwgMCwgc2l6ZW9mKHN0cnVjdCBsb29wZmlsdGVyKSk7CisJbWVtc2V0KHNlZ180bGYsIDAsIHNpemVvZihzdHJ1Y3Qgc2VnbWVudGF0aW9uKSk7CisJbGYtPnNoYXJwbmVzc19sZXZlbCA9IDA7IC8qaW5pdCB0byAwICovCisJLyppbml0IGxpbWl0cyBmb3IgZ2l2ZW4gc2hhcnBuZXNzKi8KKwl2cDlfdXBkYXRlX3NoYXJwbmVzcyhsZmksIGxmLT5zaGFycG5lc3NfbGV2ZWwpOworCWxmLT5sYXN0X3NoYXJwbmVzc19sZXZlbCA9IGxmLT5zaGFycG5lc3NfbGV2ZWw7CisJLyppbml0IGhldiB0aHJlc2hvbGQgY29uc3QgdmVjdG9ycyAoYWN0dWFsbHkgbm8gdXNlKQorCSAqZm9yIChpID0gMDsgaSA8PSBNQVhfTE9PUF9GSUxURVI7IGkrKykKKwkgKglsZmktPmxmdGhyW2ldLmhldl90aHIgPSAodWludDhfdCkoaSA+PiA0KTsKKwkgKi8KKworCS8qV3JpdGUgdG8gcmVnaXN0ZXIqLworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCXVuc2lnbmVkIGludCB0aHI7CisKKwkJdGhyID0gKChsZmktPmxmdGhyW2kgKiAyICsgMV0ubGltICYgMHgzZik8PDgpIHwKKwkJCShsZmktPmxmdGhyW2kgKiAyICsgMV0ubWJsaW0gJiAweGZmKTsKKwkJdGhyID0gKHRocjw8MTYpIHwgKChsZmktPmxmdGhyW2kqMl0ubGltICYgMHgzZik8PDgpIHwKKwkJCShsZmktPmxmdGhyW2kgKiAyXS5tYmxpbSAmIDB4ZmYpOworCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkc5LCB0aHIpOworCX0KKworCS8qdmlkZW8gZm9ybWF0IGlzIFZQOSovCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKSB7CisJCWRhdGEzMiA9ICgweDMgPDwgMTQpIHwgLy8gKGR3IGZpZm8gdGhyZXMgciBhbmQgYikKKwkJKDB4MyA8PCAxMikgfCAvLyAoZHcgZmlmbyB0aHJlcyByIG9yIGIpCisJCSgweDMgPDwgMTApIHwgLy8gKGR3IGZpZm8gdGhyZXMgbm90IHIvYikKKwkJKDB4MyA8PCA4KSB8IC8vIDFzdC8ybmQgd3JpdGUgYm90aCBlbmFibGUKKwkJKDB4MSA8PCAwKTsgLy8gdnA5IHZpZGVvIGZvcm1hdAorCQlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKHBiaSkgPT0gMHgxMCkKKwkJCSBkYXRhMzIgJj0gKH4weDEwMCk7CisJfSBlbHNlIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpIHsKKwkJZGF0YTMyID0gKDB4NTcgPDwgOCkgfCAgLyoxc3QvMm5kIHdyaXRlIGJvdGggZW5hYmxlKi8KKwkJCSgweDEgIDw8IDApOyAvKnZwOSB2aWRlbyBmb3JtYXQqLworCQlpZiAoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKHBiaSkgPT0gMHgxMCkKKwkJCSBkYXRhMzIgJj0gKH4weDEwMCk7CisJfSBlbHNlCisJCWRhdGEzMiA9IDB4NDA0MDAwMDE7CisKKwlXUklURV9WUkVHKEhFVkNfREJMS19DRkdCLCBkYXRhMzIpOworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19CVUZNR1JfTU9SRSkKKwkJcHJfaW5mbygiW0RCTEsgREVCVUddIENGR0IgOiAweCV4XG4iLCBkYXRhMzIpOworfQorCS8qIHBlcmZvcm0gdGhpcyBmdW5jdGlvbiBwZXIgZnJhbWUqLwordm9pZCB2cDlfbG9vcF9maWx0ZXJfZnJhbWVfaW5pdChzdHJ1Y3Qgc2VnbWVudGF0aW9uICpzZWcsCisJCXN0cnVjdCBsb29wX2ZpbHRlcl9pbmZvX24gKmxmaSwgc3RydWN0IGxvb3BmaWx0ZXIgKmxmLAorCQlpbnQgZGVmYXVsdF9maWx0X2x2bCkgeworCWludCBpOworCWludCBzZWdfaWQ7CisJLypuX3NoaWZ0IGlzIHRoZSBtdWx0aXBsaWVyIGZvciBsZl9kZWx0YXMKKwkgKnRoZSBtdWx0aXBsaWVyIGlzIDEgZm9yIHdoZW4gZmlsdGVyX2x2bCBpcyBiZXR3ZWVuIDAgYW5kIDMxOworCSAqMiB3aGVuIGZpbHRlcl9sdmwgaXMgYmV0d2VlbiAzMiBhbmQgNjMKKwkgKi8KKwljb25zdCBpbnQgc2NhbGUgPSAxIDw8IChkZWZhdWx0X2ZpbHRfbHZsID4+IDUpOworCisJLyp1cGRhdGUgbGltaXRzIGlmIHNoYXJwbmVzcyBoYXMgY2hhbmdlZCovCisJaWYgKGxmLT5sYXN0X3NoYXJwbmVzc19sZXZlbCAhPSBsZi0+c2hhcnBuZXNzX2xldmVsKSB7CisJCXZwOV91cGRhdGVfc2hhcnBuZXNzKGxmaSwgbGYtPnNoYXJwbmVzc19sZXZlbCk7CisJCWxmLT5sYXN0X3NoYXJwbmVzc19sZXZlbCA9IGxmLT5zaGFycG5lc3NfbGV2ZWw7CisKKwkvKldyaXRlIHRvIHJlZ2lzdGVyKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgdGhyOworCisJCXRociA9ICgobGZpLT5sZnRocltpICogMiArIDFdLmxpbSAmIDB4M2YpIDw8IDgpCisJCQl8IChsZmktPmxmdGhyW2kgKiAyICsgMV0ubWJsaW0gJiAweGZmKTsKKwkJdGhyID0gKHRociA8PCAxNikgfCAoKGxmaS0+bGZ0aHJbaSAqIDJdLmxpbSAmIDB4M2YpIDw8IDgpCisJCQl8IChsZmktPmxmdGhyW2kgKiAyXS5tYmxpbSAmIDB4ZmYpOworCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkc5LCB0aHIpOworCQl9CisJfQorCisJZm9yIChzZWdfaWQgPSAwOyBzZWdfaWQgPCBNQVhfU0VHTUVOVFM7IHNlZ19pZCsrKSB7LypNQVhfU0VHTUVOVFMgPSA4Ki8KKwkJaW50IGx2bF9zZWcgPSBkZWZhdWx0X2ZpbHRfbHZsOworCisJCWlmIChzZWdmZWF0dXJlX2FjdGl2ZShzZWcsIHNlZ19pZCwgU0VHX0xWTF9BTFRfTEYpKSB7CisJCQljb25zdCBpbnQgZGF0YSA9IGdldF9zZWdkYXRhKHNlZywgc2VnX2lkLAorCQkJCQkJU0VHX0xWTF9BTFRfTEYpOworCQkJbHZsX3NlZyA9IHZwOV9jbGFtcChzZWctPmFic19kZWx0YSA9PSBTRUdNRU5UX0FCU0RBVEEgPworCQkJCWRhdGEgOiBkZWZhdWx0X2ZpbHRfbHZsICsgZGF0YSwKKwkJCQkwLCBNQVhfTE9PUF9GSUxURVIpOworI2lmZGVmIERCR19MRl9QUklOVAorCXByX2luZm8oInNlZ2ZlYXR1cmVfYWN0aXZlISEhc2VnX2lkPSVkLGx2bF9zZWc9JWRcbiIsIHNlZ19pZCwgbHZsX3NlZyk7CisjZW5kaWYKKwl9CisKKwlpZiAoIWxmLT5tb2RlX3JlZl9kZWx0YV9lbmFibGVkKSB7CisJCS8qd2UgY291bGQgZ2V0IHJpZCBvZiB0aGlzIGlmIHdlIGFzc3VtZSB0aGF0IGRlbHRhcyBhcmUgc2V0IHRvCisJCSAqemVybyB3aGVuIG5vdCBpbiB1c2U7IGVuY29kZXIgYWx3YXlzIHVzZXMgZGVsdGFzCisJCSAqLworCQltZW1zZXQobGZpLT5sdmxbc2VnX2lkXSwgbHZsX3NlZywgc2l6ZW9mKGxmaS0+bHZsW3NlZ19pZF0pKTsKKwl9IGVsc2UgeworCQlpbnQgcmVmLCBtb2RlOworCQljb25zdCBpbnQgaW50cmFfbHZsID0gbHZsX3NlZyArCWxmLT5yZWZfZGVsdGFzW0lOVFJBX0ZSQU1FXQorCQkJCQkqIHNjYWxlOworI2lmZGVmIERCR19MRl9QUklOVAorCXByX2luZm8oIkxGX1BSSU5UOnZwOV9sb29wX2ZpbHRlcl9mcmFtZV9pbml0LHNlZ19pZD0lZFxuIiwgc2VnX2lkKTsKKwlwcl9pbmZvKCJyZWZfZGVsdGFzW0lOVFJBX0ZSQU1FXT0lZFxuIiwgbGYtPnJlZl9kZWx0YXNbSU5UUkFfRlJBTUVdKTsKKyNlbmRpZgorCQlsZmktPmx2bFtzZWdfaWRdW0lOVFJBX0ZSQU1FXVswXSA9CisJCQkJdnA5X2NsYW1wKGludHJhX2x2bCwgMCwgTUFYX0xPT1BfRklMVEVSKTsKKworCQlmb3IgKHJlZiA9IExBU1RfRlJBTUU7IHJlZiA8IE1BWF9SRUZfRlJBTUVTOyArK3JlZikgeworCQkJLyogTEFTVF9GUkFNRSA9IDEsIE1BWF9SRUZfRlJBTUVTID0gNCovCisJCQlmb3IgKG1vZGUgPSAwOyBtb2RlIDwgTUFYX01PREVfTEZfREVMVEFTOyArK21vZGUpIHsKKwkJCQkvKk1BWF9NT0RFX0xGX0RFTFRBUyA9IDIqLworCQkJCWNvbnN0IGludCBpbnRlcl9sdmwgPQorCQkJCQlsdmxfc2VnICsgbGYtPnJlZl9kZWx0YXNbcmVmXSAqIHNjYWxlCisJCQkJCSsgbGYtPm1vZGVfZGVsdGFzW21vZGVdICogc2NhbGU7CisjaWZkZWYgREJHX0xGX1BSSU5UCisjZW5kaWYKKwkJCQlsZmktPmx2bFtzZWdfaWRdW3JlZl1bbW9kZV0gPQorCQkJCQl2cDlfY2xhbXAoaW50ZXJfbHZsLCAwLAorCQkJCQlNQVhfTE9PUF9GSUxURVIpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworI2lmZGVmIERCR19MRl9QUklOVAorCS8qcHJpbnQgb3V0IHRoci9sdmwgdGFibGUgcGVyIGZyYW1lKi8KKwlmb3IgKGkgPSAwOyBpIDw9IE1BWF9MT09QX0ZJTFRFUjsgaSsrKSB7CisJCXByX2luZm8oIkxGX1BSSU5UOiglZCl0aHI9JWQsYmxpbT0lZCxsaW09JWRcbiIsCisJCQlpLCBsZmktPmxmdGhyW2ldLmhldl90aHIsIGxmaS0+bGZ0aHJbaV0ubWJsaW0sCisJCQlsZmktPmxmdGhyW2ldLmxpbSk7CisJfQorCWZvciAoc2VnX2lkID0gMDsgc2VnX2lkIDwgTUFYX1NFR01FTlRTOyBzZWdfaWQrKykgeworCQlwcl9pbmZvKCJMRl9QUklOVDpsdmwoc2VnX2lkPSVkKShtb2RlPTAsJWQsJWQsJWQsJWQpXG4iLAorCQkJc2VnX2lkLCBsZmktPmx2bFtzZWdfaWRdWzBdWzBdLAorCQkJbGZpLT5sdmxbc2VnX2lkXVsxXVswXSwgbGZpLT5sdmxbc2VnX2lkXVsyXVswXSwKKwkJCWxmaS0+bHZsW3NlZ19pZF1bM11bMF0pOworCQlwcl9pbmZvKCJpKG1vZGU9MSwlZCwlZCwlZCwlZClcbiIsIGxmaS0+bHZsW3NlZ19pZF1bMF1bMV0sCisJCQlsZmktPmx2bFtzZWdfaWRdWzFdWzFdLCBsZmktPmx2bFtzZWdfaWRdWzJdWzFdLAorCQkJbGZpLT5sdmxbc2VnX2lkXVszXVsxXSk7CisJfQorI2VuZGlmCisKKwkvKldyaXRlIHRvIHJlZ2lzdGVyICovCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJdW5zaWduZWQgaW50IGxldmVsOworCisJCWxldmVsID0gKChsZmktPmx2bFtpID4+IDFdWzNdW2kgJiAxXSAmIDB4M2YpIDw8IDI0KSB8CisJCQkoKGxmaS0+bHZsW2kgPj4gMV1bMl1baSAmIDFdICYgMHgzZikgPDwgMTYpIHwKKwkJCSgobGZpLT5sdmxbaSA+PiAxXVsxXVtpICYgMV0gJiAweDNmKSA8PCA4KSB8CisJCQkobGZpLT5sdmxbaSA+PiAxXVswXVtpICYgMV0gJiAweDNmKTsKKwkJaWYgKCFkZWZhdWx0X2ZpbHRfbHZsKQorCQkJbGV2ZWwgPSAwOworCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkdBLCBsZXZlbCk7CisJfQorfQorLyogVlA5X0xQRl9MVkxfVVBEQVRFICovCisjZW5kaWYKKworc3RhdGljIHZvaWQgdnA5X2luaXRfZGVjb2Rlcl9odyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksIHUzMiBtYXNrKQoreworCXVuc2lnbmVkIGludCBkYXRhMzI7CisJaW50IGk7CisJY29uc3QgdW5zaWduZWQgc2hvcnQgcGFyc2VyX2NtZFtQQVJTRVJfQ01EX05VTUJFUl0gPSB7CisJCTB4MDQwMSwgMHg4NDAxLCAweDA4MDAsIDB4MDQwMiwgMHg5MDAyLCAweDE0MjMsCisJCTB4OENDMywgMHgxNDIzLCAweDg4MDQsIDB4OTgyNSwgMHgwODAwLCAweDA0RkUsCisJCTB4ODQwNiwgMHg4NDExLCAweDE4MDAsIDB4ODQwOCwgMHg4NDA5LCAweDhDMkEsCisJCTB4OUMyQiwgMHgxQzAwLCAweDg0MEYsIDB4ODQwNywgMHg4MDAwLCAweDg0MDgsCisJCTB4MjAwMCwgMHhBODAwLCAweDg0MTAsIDB4MDRERSwgMHg4NDBDLCAweDg0MEQsCisJCTB4QUMwMCwgMHhBMDAwLCAweDA4QzAsIDB4MDhFMCwgMHhBNDBFLCAweEZDMDAsCisJCTB4N0MwMAorCX07CisjaWYgMAorCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpIHsKKwkJLyogU2V0IE1DUiBmZXRjaCBwcmlvcml0aWVzKi8KKwkJZGF0YTMyID0gMHgxIHwgKDB4MSA8PCAyKSB8ICgweDEgPDwzKSB8CisJCQkoMjQgPDwgNCkgfCAoMzIgPDwgMTEpIHwgKDI0IDw8IDE4KSB8ICgzMiA8PCAyNSk7CisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0RFQ09NUF9BWElVUkdfQ1RMLCBkYXRhMzIpOworCX0KKyNlbmRpZgorCS8qaWYgKGRlYnVnICYgVlA5X0RFQlVHX0JVRk1HUl9NT1JFKQorCQlwcl9pbmZvKCIlc1xuIiwgX19mdW5jX18pOyovCisJaWYgKG1hc2sgJiBIV19NQVNLX0ZST05UKSB7CisJCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BBUlNFUl9JTlRfQ09OVFJPTCk7CisjaWYgMQorCQkvKiBzZXQgYml0IDMxfjI5IHRvIDMgaWYgSEVWQ19TVFJFQU1fRklGT19DVExbMjldIGlzIDEgKi8KKwkJZGF0YTMyICY9IH4oNyA8PCAyOSk7CisJCWRhdGEzMiB8PSAoMyA8PCAyOSk7CisjZW5kaWYKKwkJZGF0YTMyID0gZGF0YTMyIHwKKwkJKDEgPDwgMjQpIHwvKnN0cmVhbV9idWZmZXJfZW1wdHlfaW50X2FtcmlzY19lbmFibGUqLworCQkoMSA8PCAyMikgfC8qc3RyZWFtX2ZpZm9fZW1wdHlfaW50X2FtcmlzY19lbmFibGUqLworCQkoMSA8PCA3KSB8LypkZWNfZG9uZV9pbnRfY3B1X2VuYWJsZSovCisJCSgxIDw8IDQpIHwvKnN0YXJ0Y29kZV9mb3VuZF9pbnRfY3B1X2VuYWJsZSovCisJCSgwIDw8IDMpIHwvKnN0YXJ0Y29kZV9mb3VuZF9pbnRfYW1yaXNjX2VuYWJsZSovCisJCSgxIDw8IDApICAgIC8qcGFyc2VyX2ludF9lbmFibGUqLworCQk7CisjaWZkZWYgU1VQUE9SVF9GQl9ERUNPRElORworI2lmbmRlZiBGQl9ERUNPRElOR19URVNUX1NDSEVEVUxFCisJCS8qZmVkX2ZiX3NsaWNlX2RvbmVfaW50X2NwdV9lbmFibGUqLworCQlpZiAocGJpLT51c2VkX3N0YWdlX2J1Zl9udW0gPiAwKQorCQkJZGF0YTMyIHw9ICgxIDw8IDEwKTsKKyNlbmRpZgorI2VuZGlmCisJCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfSU5UX0NPTlRST0wsIGRhdGEzMik7CisKKwlkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19TSElGVF9TVEFUVVMpOworCWRhdGEzMiA9IGRhdGEzMiB8CisJKDAgPDwgMSkgfC8qZW11bGF0aW9uX2NoZWNrX29mZiBWUDkKKwkJZG8gbm90IGhhdmUgZW11bGF0aW9uKi8KKwkoMSA8PCAwKS8qc3RhcnRjb2RlX2NoZWNrX29uKi8KKwk7CisJV1JJVEVfVlJFRyhIRVZDX1NISUZUX1NUQVRVUywgZGF0YTMyKTsKKwlXUklURV9WUkVHKEhFVkNfU0hJRlRfQ09OVFJPTCwKKwkoMCA8PCAxNCkgfCAvKmRpc2FibGVfc3RhcnRfY29kZV9wcm90ZWN0Ki8KKwkoMSA8PCAxMCkgfCAvKmxlbmd0aF96ZXJvX3N0YXJ0Y29kZV9lbiBmb3IgVlA5Ki8KKwkoMSA8PCA5KSB8IC8qbGVuZ3RoX3ZhbGlkX3N0YXJ0Y29kZV9lbiBmb3IgVlA5Ki8KKwkoMyA8PCA2KSB8IC8qc2Z0X3ZhbGlkX3dyX3Bvc2l0aW9uKi8KKwkoMiA8PCA0KSB8IC8qZW11bGF0ZV9jb2RlX2xlbmd0aF9zdWJfMSovCisJKDMgPDwgMSkgfCAvKnN0YXJ0X2NvZGVfbGVuZ3RoX3N1Yl8xCisJVlA5IHVzZSAweDAwMDAwMDAxIGFzIHN0YXJ0Y29kZSAoNCBCeXRlcykqLworCSgxIDw8IDApICAgLypzdHJlYW1fc2hpZnRfZW5hYmxlKi8KKwkpOworCisJV1JJVEVfVlJFRyhIRVZDX0NBQkFDX0NPTlRST0wsCisJCSgxIDw8IDApLypjYWJhY19lbmFibGUqLworCSk7CisKKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0NPUkVfQ09OVFJPTCwKKwkJKDEgPDwgMCkvKiBoZXZjX3BhcnNlcl9jb3JlX2Nsa19lbiovCisJKTsKKworCisJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCAwKTsKKworCX0KKworCWlmIChtYXNrICYgSFdfTUFTS19CQUNLKSB7CisJCS8qSW5pdGlhbCBJUUlUX1NDQUxFTFVUIG1lbW9yeQorCQktLSBqdXN0IHRvIGF2b2lkIFggaW4gc2ltdWxhdGlvbiovCisJCWlmIChpc19yZG1hX2VuYWJsZSgpKQorCQkJcmRtYV9iYWNrX2VuZF93b3JrKHBiaS0+cmRtYV9waHlfYWRyLCBSRE1BX1NJWkUpOworCQllbHNlIHsKKwkJCVdSSVRFX1ZSRUcoSEVWQ19JUUlUX1NDQUxFTFVUX1dSX0FERFIsIDApOy8qY2ZnX3BfYWRkciovCisJCQlmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorCQkJCVdSSVRFX1ZSRUcoSEVWQ19JUUlUX1NDQUxFTFVUX0RBVEEsIDApOworCQl9CisJfQorCisJaWYgKG1hc2sgJiBIV19NQVNLX0ZST05UKSB7CisJCXUzMiBkZWNvZGVfbW9kZTsKKyNpZmRlZiBFTkFCTEVfU1dBUF9URVNUCisJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9TV0FQX1RFU1QsIDEwMCk7CisjZWxzZQorCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fU1dBUF9URVNULCAwKTsKKyNlbmRpZgorI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwkJaWYgKCFwYmktPm1faW5zX2ZsYWcpIHsKKwkJCWlmIChwYmktPmxvd19sYXRlbmN5X2ZsYWcpCisJCQkJZGVjb2RlX21vZGUgPSBERUNPREVfTU9ERV9TSU5HTEVfTE9XX0xBVEVOQ1k7CisJCQllbHNlCisJCQkJZGVjb2RlX21vZGUgPSBERUNPREVfTU9ERV9TSU5HTEU7CisJCX0gZWxzZSBpZiAodmRlY19mcmFtZV9iYXNlZChod190b192ZGVjKHBiaSkpKQorCQkJZGVjb2RlX21vZGUgPSBwYmktPm5vX2hlYWQgPworCQkJCURFQ09ERV9NT0RFX01VTFRJX0ZSQU1FQkFTRV9OT0hFQUQgOgorCQkJCURFQ09ERV9NT0RFX01VTFRJX0ZSQU1FQkFTRTsKKwkJZWxzZQorCQkJZGVjb2RlX21vZGUgPSBERUNPREVfTU9ERV9NVUxUSV9TVFJFQU1CQVNFOworI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKKyNpZm5kZWYgRkJfREVDT0RJTkdfVEVTVF9TQ0hFRFVMRQorCQlpZiAocGJpLT51c2VkX3N0YWdlX2J1Zl9udW0gPiAwKQorCQkJZGVjb2RlX21vZGUgfD0gKDB4MDEgPDwgMjQpOworI2VuZGlmCisjZW5kaWYKKwkJV1JJVEVfVlJFRyhERUNPREVfTU9ERSwgZGVjb2RlX21vZGUpOworCQlXUklURV9WUkVHKEhFVkNfREVDT0RFX1NJWkUsIDApOworCQlXUklURV9WUkVHKEhFVkNfREVDT0RFX0NPVU5ULCAwKTsKKyNlbHNlCisJV1JJVEVfVlJFRyhERUNPREVfTU9ERSwgREVDT0RFX01PREVfU0lOR0xFKTsKKwlXUklURV9WUkVHKEhFVkNfREVDT0RFX1BJQ19CRUdJTl9SRUcsIDApOworCVdSSVRFX1ZSRUcoSEVWQ19ERUNPREVfUElDX05VTV9SRUcsIDB4N2ZmZmZmZmYpOyAvKnRvIHJlbW92ZSovCisjZW5kaWYKKwkvKlNlbmQgcGFyc2VyX2NtZCovCisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9DTURfV1JJVEUsICgxIDw8IDE2KSB8ICgwIDw8IDApKTsKKwlmb3IgKGkgPSAwOyBpIDwgUEFSU0VSX0NNRF9OVU1CRVI7IGkrKykKKwkJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9DTURfV1JJVEUsIHBhcnNlcl9jbWRbaV0pOworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfQ01EX1NLSVBfMCwgUEFSU0VSX0NNRF9TS0lQX0NGR18wKTsKKwlXUklURV9WUkVHKEhFVkNfUEFSU0VSX0NNRF9TS0lQXzEsIFBBUlNFUl9DTURfU0tJUF9DRkdfMSk7CisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9DTURfU0tJUF8yLCBQQVJTRVJfQ01EX1NLSVBfQ0ZHXzIpOworCisKKwkJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9JRl9DT05UUk9MLAorCQkJLyogICgxIDw8IDgpIHwqLyAvKnNhb19zd19wcmVkX2VuYWJsZSovCisJCQkoMSA8PCA1KSB8IC8qcGFyc2VyX3Nhb19pZl9lbiovCisJCQkoMSA8PCAyKSB8IC8qcGFyc2VyX21wcmVkX2lmX2VuKi8KKwkJCSgxIDw8IDApIC8qcGFyc2VyX3NjYWxlcl9pZl9lbiovCisJCSk7CisJfQorCisJaWYgKG1hc2sgJiBIV19NQVNLX0JBQ0spIHsKKwkJLypDaGFuZ2VkIHRvIFN0YXJ0IE1QUkVEIGluIG1pY3JvY29kZSovCisJCS8qCisJCXByX2luZm8oIlt0ZXN0LmNdIFN0YXJ0IE1QUkVEXG4iKTsKKwkJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0lOVF9TVEFUVVMsCisJCSgxPDwzMSkKKwkJKTsKKwkJKi8KKwkJV1JJVEVfVlJFRyhIRVZDRF9JUFBfVE9QX0NOVEwsCisJCQkoMCA8PCAxKSB8IC8qZW5hYmxlIGlwcCovCisJCQkoMSA8PCAwKSAgIC8qc29mdHdhcmUgcmVzZXQgaXBwIGFuZCBtcHAqLworCQkpOworCQlXUklURV9WUkVHKEhFVkNEX0lQUF9UT1BfQ05UTCwKKwkJCSgxIDw8IDEpIHwgLyplbmFibGUgaXBwKi8KKwkJCSgwIDw8IDApICAgLypzb2Z0d2FyZSByZXNldCBpcHAgYW5kIG1wcCovCisJCSk7CisJaWYgKGdldF9kb3VibGVfd3JpdGVfbW9kZShwYmkpICYgMHgxMCkgeworCQkvKkVuYWJsZSBOVjIxIHJlZmVyZW5jZSByZWFkIG1vZGUgZm9yIE1DKi8KKwkJV1JJVEVfVlJFRyhIRVZDRF9NUFBfREVDT01QX0NUTDEsIDB4MSA8PCAzMSk7CisJfQorCisJCS8qSW5pdGlhbGl6ZSBtY3JjYyBhbmQgZGVjb21wIHBlcmYgY291bnRlcnMqLworCQlpZiAobWNyY2NfY2FjaGVfYWxnX2ZsYWcgJiYKKwkJCXBiaS0+aW5pdF9mbGFnID09IDApIHsKKwkJCW1jcmNjX3BlcmZjb3VudF9yZXNldCgpOworCQkJZGVjb21wX3BlcmZjb3VudF9yZXNldCgpOworCQl9CisJfQorCXJldHVybjsKK30KKworCisjaWZkZWYgQ09ORklHX0hFVkNfQ0xLX0ZPUkNFRF9PTgorc3RhdGljIHZvaWQgY29uZmlnX3ZwOV9jbGtfZm9yY2VkX29uKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHJkYXRhMzI7CisJLypJUUlUKi8KKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfSVFJVF9DTEtfUlNUX0NUUkwpOworCVdSSVRFX1ZSRUcoSEVWQ19JUUlUX0NMS19SU1RfQ1RSTCwgcmRhdGEzMiB8ICgweDEgPDwgMikpOworCisJLyogREJMSyovCisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX0RCTEtfQ0ZHMCk7CisJV1JJVEVfVlJFRyhIRVZDX0RCTEtfQ0ZHMCwgcmRhdGEzMiB8ICgweDEgPDwgMikpOworCisJLyogU0FPKi8KKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0FPX0NUUkwxKTsKKwlXUklURV9WUkVHKEhFVkNfU0FPX0NUUkwxLCByZGF0YTMyIHwgKDB4MSA8PCAyKSk7CisKKwkvKk1QUkVEKi8KKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfTVBSRURfQ1RSTDEpOworCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9DVFJMMSwgcmRhdGEzMiB8ICgweDEgPDwgMjQpKTsKKworCS8qIFBBUlNFUiovCisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NUUkVBTV9DT05UUk9MKTsKKwlXUklURV9WUkVHKEhFVkNfU1RSRUFNX0NPTlRST0wsIHJkYXRhMzIgfCAoMHgxIDw8IDE1KSk7CisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NISUZUX0NPTlRST0wpOworCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9DT05UUk9MLCByZGF0YTMyIHwgKDB4MSA8PCAxNSkpOworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19DQUJBQ19DT05UUk9MKTsKKwlXUklURV9WUkVHKEhFVkNfQ0FCQUNfQ09OVFJPTCwgcmRhdGEzMiB8ICgweDEgPDwgMTMpKTsKKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0NPUkVfQ09OVFJPTCk7CisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9DT1JFX0NPTlRST0wsIHJkYXRhMzIgfCAoMHgxIDw8IDE1KSk7CisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BBUlNFUl9JTlRfQ09OVFJPTCk7CisJV1JJVEVfVlJFRyhIRVZDX1BBUlNFUl9JTlRfQ09OVFJPTCwgcmRhdGEzMiB8ICgweDEgPDwgMTUpKTsKKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0lGX0NPTlRST0wpOworCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfSUZfQ09OVFJPTCwKKwkJCXJkYXRhMzIgfCAoMHgxIDw8IDYpIHwgKDB4MSA8PCAzKSB8ICgweDEgPDwgMSkpOworCisJLypJUFAqLworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ0RfSVBQX0RZTkNMS0dBVEVfQ09ORklHKTsKKwlXUklURV9WUkVHKEhFVkNEX0lQUF9EWU5DTEtHQVRFX0NPTkZJRywgcmRhdGEzMiB8IDB4ZmZmZmZmZmYpOworCisJLyogTUNSQ0MqLworCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMSk7CisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwxLCByZGF0YTMyIHwgKDB4MSA8PCAzKSk7Cit9CisjZW5kaWYKKworCisjaWZkZWYgTUNSQ0NfRU5BQkxFCitzdGF0aWMgdm9pZCBkdW1wX2hpdF9yYXRlKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEVfSElUX1JBVEUpIHsKKwkJbWNyY2NfZ2V0X2hpdHJhdGUocGJpLT5tX2luc19mbGFnKTsKKwkJZGVjb21wX2dldF9oaXRyYXRlKCk7CisJCWRlY29tcF9nZXRfY29tcHJhdGUoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkICBjb25maWdfbWNyY2NfYXhpX2h3KHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwl1bnNpZ25lZCBpbnQgcmRhdGEzMjsKKwl1bnNpZ25lZCBzaG9ydCBpc19pbnRlcjsKKwkvKnByX2luZm8oIkVudGVyZWQgY29uZmlnX21jcmNjX2F4aV9ody4uLlxuIik7Ki8KKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDEsIDB4Mik7LyogcmVzZXQgbWNyY2MqLworCWlzX2ludGVyID0gKChwYmktPmNvbW1vbi5mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkgJiYKKwkJCSghcGJpLT5jb21tb24uaW50cmFfb25seSkpID8gMSA6IDA7CisJaWYgKCFpc19pbnRlcikgeyAvKiBJLVBJQyovCisJCS8qcmVtb3ZlIHJlc2V0IC0tIGRpc2FibGVzIGNsb2NrKi8KKwkJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwxLCAweDApOworCQlyZXR1cm47CisJfQorCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKSB7CisJCW1jcmNjX2dldF9oaXRyYXRlKHBiaS0+bV9pbnNfZmxhZyk7CisJCWRlY29tcF9nZXRfaGl0cmF0ZSgpOworCQlkZWNvbXBfZ2V0X2NvbXByYXRlKCk7CisJfQorCisJV1JJVEVfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19BQ0NDT05GSUdfQUREUiwKKwkJCSgwIDw8IDgpIHwgKDEgPDwgMSkgfCAwKTsKKwlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUik7CisJcmRhdGEzMiA9IHJkYXRhMzIgJiAweGZmZmY7CisJcmRhdGEzMiA9IHJkYXRhMzIgfCAocmRhdGEzMiA8PCAxNik7CisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwyLCByZGF0YTMyKTsKKwkvKlByb2dyYW1tZSBjYW52YXMxICovCisJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIpOworCXJkYXRhMzIgPSByZGF0YTMyICYgMHhmZmZmOworCXJkYXRhMzIgPSByZGF0YTMyIHwgKHJkYXRhMzIgPDwgMTYpOworCVdSSVRFX1ZSRUcoSEVWQ0RfTUNSQ0NfQ1RMMywgcmRhdGEzMik7CisJLyplbmFibGUgbWNyY2MgcHJvZ3Jlc3NpdmUtbW9kZSovCisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwxLCAweGZmMCk7Cit9CisKK3N0YXRpYyB2b2lkICBjb25maWdfbWNyY2NfYXhpX2h3X25ldyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJdTMyIGN1cnJfcGljbnVtID0gLTE7CisJdTMyIGxhc3RyZWZfcGljbnVtID0gLTE7CisJdTMyIGdvbGRlbnJlZl9waWNudW0gPSAtMTsKKwl1MzIgYWx0cmVmX3BpY251bSA9IC0xOworCisJdTMyIGxhc3RyZWZfZGVsdGFfcGljbnVtOworCXUzMiBnb2xkZW5yZWZfZGVsdGFfcGljbnVtOworCXUzMiBhbHRyZWZfZGVsdGFfcGljbnVtOworCisJdTMyIHJkYXRhMzI7CisKKwl1MzIgbGFzdGNhbnZhczsKKwl1MzIgZ29sZGVuY2FudmFzOworCXUzMiBhbHRyZWZjYW52YXM7CisKKwl1MTYgaXNfaW50ZXI7CisJdTE2IGxhc3RyZWZfaW5yZWY7CisJdTE2IGdvbGRlbnJlZl9pbnJlZjsKKwl1MTYgYWx0cmVmX2lucmVmOworCisJdTMyIHJlZmNhbnZhc19hcnJheVszXSwgdXRtcDsKKwlpbnQgZGVsdGFwaWNudW1fYXJyYXlbM10sIHRtcDsKKworCXN0cnVjdCBWUDlfQ29tbW9uX3MgKmNtID0gJnBiaS0+Y29tbW9uOworCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpjdXJfcGljX2NvbmZpZworCQk9ICZjbS0+Y3VyX2ZyYW1lLT5idWY7CisJY3Vycl9waWNudW0gPSBjdXJfcGljX2NvbmZpZy0+ZGVjb2RlX2lkeDsKKwlpZiAoY20tPmZyYW1lX3JlZnNbMF0uYnVmKQorCQlsYXN0cmVmX3BpY251bSA9IGNtLT5mcmFtZV9yZWZzWzBdLmJ1Zi0+ZGVjb2RlX2lkeDsKKwlpZiAoY20tPmZyYW1lX3JlZnNbMV0uYnVmKQorCQlnb2xkZW5yZWZfcGljbnVtID0gY20tPmZyYW1lX3JlZnNbMV0uYnVmLT5kZWNvZGVfaWR4OworCWlmIChjbS0+ZnJhbWVfcmVmc1syXS5idWYpCisJCWFsdHJlZl9waWNudW0gPSBjbS0+ZnJhbWVfcmVmc1syXS5idWYtPmRlY29kZV9pZHg7CisKKwlsYXN0cmVmX2RlbHRhX3BpY251bSA9IChsYXN0cmVmX3BpY251bSA+PSBjdXJyX3BpY251bSkgPworCQkobGFzdHJlZl9waWNudW0gLSBjdXJyX3BpY251bSkgOiAoY3Vycl9waWNudW0gLSBsYXN0cmVmX3BpY251bSk7CisJZ29sZGVucmVmX2RlbHRhX3BpY251bSA9IChnb2xkZW5yZWZfcGljbnVtID49IGN1cnJfcGljbnVtKSA/CisJCShnb2xkZW5yZWZfcGljbnVtIC0gY3Vycl9waWNudW0pIDoKKwkJKGN1cnJfcGljbnVtIC0gZ29sZGVucmVmX3BpY251bSk7CisJYWx0cmVmX2RlbHRhX3BpY251bSA9CisJCShhbHRyZWZfcGljbnVtID49IGN1cnJfcGljbnVtKSA/CisJCShhbHRyZWZfcGljbnVtIC0gY3Vycl9waWNudW0pIDogKGN1cnJfcGljbnVtIC0gYWx0cmVmX3BpY251bSk7CisKKwlsYXN0cmVmX2lucmVmID0gKGNtLT5mcmFtZV9yZWZzWzBdLmlkeCAhPSBJTlZBTElEX0lEWCkgPyAxIDogMDsKKwlnb2xkZW5yZWZfaW5yZWYgPSAoY20tPmZyYW1lX3JlZnNbMV0uaWR4ICE9IElOVkFMSURfSURYKSA/IDEgOiAwOworCWFsdHJlZl9pbnJlZiA9IChjbS0+ZnJhbWVfcmVmc1syXS5pZHggIT0gSU5WQUxJRF9JRFgpID8gMSA6IDA7CisKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfQ0FDSEUpCisJCXByX2luZm8oIiVzLS0wLS1sYXN0cmVmX2lucmVmOiVkIGdvbGRlbnJlZl9pbnJlZjolZCBhbHRyZWZfaW5yZWY6JWRcbiIsCisJCQlfX2Z1bmNfXywgbGFzdHJlZl9pbnJlZiwgZ29sZGVucmVmX2lucmVmLCBhbHRyZWZfaW5yZWYpOworCisJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwxLCAweDIpOyAvKiByZXNldCBtY3JjYyAqLworCisJaXNfaW50ZXIgPSAoKHBiaS0+Y29tbW9uLmZyYW1lX3R5cGUgIT0gS0VZX0ZSQU1FKQorCQkmJiAoIXBiaS0+Y29tbW9uLmludHJhX29ubHkpKSA/IDEgOiAwOworCisJaWYgKCFpc19pbnRlcikgeyAvKiBJLVBJQyAqLworCQkvKiByZW1vdmUgcmVzZXQgLS0gZGlzYWJsZXMgY2xvY2sgKi8KKwkJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwxLCAweDApOworCQlyZXR1cm47CisJfQorCisJaWYgKCFwYmktPm1faW5zX2ZsYWcpCisJCWR1bXBfaGl0X3JhdGUocGJpKTsKKworCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfQUNDQ09ORklHX0FERFIsICgwIDw8IDgpIHwgKDE8PDEpIHwgMCk7CisJbGFzdGNhbnZhcyA9IFJFQURfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIpOworCWdvbGRlbmNhbnZhcyA9IFJFQURfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIpOworCWFsdHJlZmNhbnZhcyA9IFJFQURfVlJFRyhIRVZDRF9NUFBfQU5DX0NBTlZBU19EQVRBX0FERFIpOworCisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0NBQ0hFKQorCQlwcl9pbmZvKCJbdGVzdC5jXSBsYXN0cmVmX2NhbnY6JXggZ29sZGVucmVmX2NhbnY6JXggYWx0cmVmX2NhbnY6JXhcbiIsCisJCQlsYXN0Y2FudmFzLCBnb2xkZW5jYW52YXMsIGFsdHJlZmNhbnZhcyk7CisKKwlhbHRyZWZfaW5yZWYgPSAoKGFsdHJlZl9pbnJlZiA9PSAxKSAmJgorCQkJKGFsdHJlZmNhbnZhcyAhPSAoZ29sZGVucmVmX2lucmVmCisJCQk/IGdvbGRlbmNhbnZhcyA6IDB4ZmZmZmZmZmYpKSAmJgorCQkJKGFsdHJlZmNhbnZhcyAhPSAobGFzdHJlZl9pbnJlZiA/CisJCQlsYXN0Y2FudmFzIDogMHhmZmZmZmZmZikpKSA/IDEgOiAwOworCWdvbGRlbnJlZl9pbnJlZiA9ICgoZ29sZGVucmVmX2lucmVmID09IDEpICYmCisJCShnb2xkZW5jYW52YXMgIT0gKGxhc3RyZWZfaW5yZWYgPworCQlsYXN0Y2FudmFzIDogMHhmZmZmZmZmZikpKSA/IDEgOiAwOworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19DQUNIRSkKKwkJcHJfaW5mbygiW3Rlc3QuY10tLTEtLWxhc3RyZWZfaW5yZWY6JWQgZ29sZGVucmVmX2lucmVmOiVkIGFsdHJlZl9pbnJlZjolZFxuIiwKKwkJCWxhc3RyZWZfaW5yZWYsIGdvbGRlbnJlZl9pbnJlZiwgYWx0cmVmX2lucmVmKTsKKworCWFsdHJlZl9kZWx0YV9waWNudW0gPSBhbHRyZWZfaW5yZWYgPyBhbHRyZWZfZGVsdGFfcGljbnVtIDogMHg3ZmZmZmZmZjsKKwlnb2xkZW5yZWZfZGVsdGFfcGljbnVtID0gZ29sZGVucmVmX2lucmVmID8KKwkJZ29sZGVucmVmX2RlbHRhX3BpY251bSA6IDB4N2ZmZmZmZmY7CisJbGFzdHJlZl9kZWx0YV9waWNudW0gPSBsYXN0cmVmX2lucmVmID8KKwkJbGFzdHJlZl9kZWx0YV9waWNudW0gOiAweDdmZmZmZmZmOworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19DQUNIRSkKKwkJcHJfaW5mbygiW3Rlc3QuY10tLTEtLWxhc3RyZWZfZGVsdGFfcGljbnVtOiVkIGdvbGRlbnJlZl9kZWx0YV9waWNudW06JWQgYWx0cmVmX2RlbHRhX3BpY251bTolZFxuIiwKKwkJCWxhc3RyZWZfZGVsdGFfcGljbnVtLCBnb2xkZW5yZWZfZGVsdGFfcGljbnVtLAorCQkJYWx0cmVmX2RlbHRhX3BpY251bSk7CisJLypBUlJBWSBTT1JUIEhFUkUgREVMVEEvQ0FOVkFTIEFSUkFZIFNPUlQgLS0gdXNlIERFTFRBKi8KKworCXJlZmNhbnZhc19hcnJheVswXSA9IGxhc3RjYW52YXM7CisJcmVmY2FudmFzX2FycmF5WzFdID0gZ29sZGVuY2FudmFzOworCXJlZmNhbnZhc19hcnJheVsyXSA9IGFsdHJlZmNhbnZhczsKKworCWRlbHRhcGljbnVtX2FycmF5WzBdID0gbGFzdHJlZl9kZWx0YV9waWNudW07CisJZGVsdGFwaWNudW1fYXJyYXlbMV0gPSBnb2xkZW5yZWZfZGVsdGFfcGljbnVtOworCWRlbHRhcGljbnVtX2FycmF5WzJdID0gYWx0cmVmX2RlbHRhX3BpY251bTsKKworCS8qIHNvcnQwIDogMi10by0xICovCisJaWYgKGRlbHRhcGljbnVtX2FycmF5WzJdIDwgZGVsdGFwaWNudW1fYXJyYXlbMV0pIHsKKwkJdXRtcCA9IHJlZmNhbnZhc19hcnJheVsyXTsKKwkJcmVmY2FudmFzX2FycmF5WzJdID0gcmVmY2FudmFzX2FycmF5WzFdOworCQlyZWZjYW52YXNfYXJyYXlbMV0gPSB1dG1wOworCQl0bXAgPSBkZWx0YXBpY251bV9hcnJheVsyXTsKKwkJZGVsdGFwaWNudW1fYXJyYXlbMl0gPSBkZWx0YXBpY251bV9hcnJheVsxXTsKKwkJZGVsdGFwaWNudW1fYXJyYXlbMV0gPSB0bXA7CisJfQorCS8qIHNvcnQxIDogMS10by0wICovCisJaWYgKGRlbHRhcGljbnVtX2FycmF5WzFdIDwgZGVsdGFwaWNudW1fYXJyYXlbMF0pIHsKKwkJdXRtcCA9IHJlZmNhbnZhc19hcnJheVsxXTsKKwkJcmVmY2FudmFzX2FycmF5WzFdID0gcmVmY2FudmFzX2FycmF5WzBdOworCQlyZWZjYW52YXNfYXJyYXlbMF0gPSB1dG1wOworCQl0bXAgPSBkZWx0YXBpY251bV9hcnJheVsxXTsKKwkJZGVsdGFwaWNudW1fYXJyYXlbMV0gPSBkZWx0YXBpY251bV9hcnJheVswXTsKKwkJZGVsdGFwaWNudW1fYXJyYXlbMF0gPSB0bXA7CisJfQorCS8qIHNvcnQyIDogMi10by0xICovCisJaWYgKGRlbHRhcGljbnVtX2FycmF5WzJdIDwgZGVsdGFwaWNudW1fYXJyYXlbMV0pIHsKKwkJdXRtcCA9IHJlZmNhbnZhc19hcnJheVsyXTsgIHJlZmNhbnZhc19hcnJheVsyXSA9CisJCQlyZWZjYW52YXNfYXJyYXlbMV07IHJlZmNhbnZhc19hcnJheVsxXSA9ICB1dG1wOworCQl0bXAgID0gZGVsdGFwaWNudW1fYXJyYXlbMl07IGRlbHRhcGljbnVtX2FycmF5WzJdID0KKwkJCWRlbHRhcGljbnVtX2FycmF5WzFdOyBkZWx0YXBpY251bV9hcnJheVsxXSA9IHRtcDsKKwl9CisJaWYgKG1jcmNjX2NhY2hlX2FsZ19mbGFnID09CisJCVRIT0RJWUlMX01DUkNDX0NBTlZBU19BTEdYKSB7IC8qMDkvMTUvMjAxNyovCisJCS8qIGxvd2VzdCBkZWx0YV9waWNudW0gKi8KKwkJcmRhdGEzMiA9IHJlZmNhbnZhc19hcnJheVswXTsKKwkJcmRhdGEzMiA9IHJkYXRhMzIgJiAweGZmZmY7CisJCXJkYXRhMzIgPSByZGF0YTMyIHwgKHJkYXRhMzIgPDwgMTYpOworCQlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDIsIHJkYXRhMzIpOworCisJCS8qIDJuZC1sb3dlc3QgZGVsdGFfcGljbnVtICovCisJCXJkYXRhMzIgPSByZWZjYW52YXNfYXJyYXlbMV07CisJCXJkYXRhMzIgPSByZGF0YTMyICYgMHhmZmZmOworCQlyZGF0YTMyID0gcmRhdGEzMiB8IChyZGF0YTMyIDw8IDE2KTsKKwkJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwzLCByZGF0YTMyKTsKKwl9IGVsc2UgeworCQkvKiBwcmV2aW91cyB2ZXJzaW9uIC0tIExBU1QvR09MREVOIEFMV0FZUyAtLSBiZWZvcmUgMDkvMTMvMjAxNyovCisJCVdSSVRFX1ZSRUcoSEVWQ0RfTVBQX0FOQ19DQU5WQVNfQUNDQ09ORklHX0FERFIsCisJCQkoMCA8PCA4KSB8ICgxPDwxKSB8IDApOworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUik7CisJCXJkYXRhMzIgPSByZGF0YTMyICYgMHhmZmZmOworCQlyZGF0YTMyID0gcmRhdGEzMiB8IChyZGF0YTMyIDw8IDE2KTsKKwkJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwyLCByZGF0YTMyKTsKKworCQkvKiBQcm9ncmFtbWUgY2FudmFzMSAqLworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNEX01QUF9BTkNfQ0FOVkFTX0RBVEFfQUREUik7CisJCXJkYXRhMzIgPSByZGF0YTMyICYgMHhmZmZmOworCQlyZGF0YTMyID0gcmRhdGEzMiB8IChyZGF0YTMyIDw8IDE2KTsKKwkJV1JJVEVfVlJFRyhIRVZDRF9NQ1JDQ19DVEwzLCByZGF0YTMyKTsKKwl9CisKKwlXUklURV9WUkVHKEhFVkNEX01DUkNDX0NUTDEsIDB4ZmYwKTsgLyogZW5hYmxlIG1jcmNjIHByb2dyZXNzaXZlLW1vZGUgKi8KKwlyZXR1cm47Cit9CisKKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkIGZyZWVfbGZfYnVmKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlpZiAocGJpLT5sZmkpCisJCXZmcmVlKHBiaS0+bGZpKTsKKwlpZiAocGJpLT5sZikKKwkJdmZyZWUocGJpLT5sZik7CisJaWYgKHBiaS0+c2VnXzRsZikKKwkJdmZyZWUocGJpLT5zZWdfNGxmKTsKKwlwYmktPmxmaSA9IE5VTEw7CisJcGJpLT5sZiA9IE5VTEw7CisJcGJpLT5zZWdfNGxmID0gTlVMTDsKK30KKworc3RhdGljIGludCBhbGxvY19sZl9idWYoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCXBiaS0+bGZpID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IGxvb3BfZmlsdGVyX2luZm9fbikpOworCXBiaS0+bGYgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgbG9vcGZpbHRlcikpOworCXBiaS0+c2VnXzRsZiA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZWdtZW50YXRpb24pKTsKKwlpZiAocGJpLT5sZmkgPT0gTlVMTCB8fCBwYmktPmxmID09IE5VTEwgfHwgcGJpLT5zZWdfNGxmID09IE5VTEwpIHsKKwkJZnJlZV9sZl9idWYocGJpKTsKKwkJcHJfZXJyKCJbdGVzdC5jXSB2cDlfbG9vcF9maWx0ZXIgaW5pdCBtYWxsb2MgZXJyb3IhISFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2cDlfbG9jYWxfdW5pbml0KHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlwYmktPnJwbV9wdHIgPSBOVUxMOworCXBiaS0+bG1lbV9wdHIgPSBOVUxMOworCWlmIChwYmktPnJwbV9hZGRyKSB7CisJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQkJUlBNX0JVRl9TSVpFLAorCQkJCQlwYmktPnJwbV9hZGRyLAorCQkJCQlwYmktPnJwbV9waHlfYWRkcik7CisJCXBiaS0+cnBtX2FkZHIgPSBOVUxMOworCX0KKwlpZiAocGJpLT5sbWVtX2FkZHIpIHsKKwkJaWYgKHBiaS0+bG1lbV9waHlfYWRkcikKKwkJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlMTUVNX0JVRl9TSVpFLCBwYmktPmxtZW1fYWRkciwKKwkJCQlwYmktPmxtZW1fcGh5X2FkZHIpOworCQlwYmktPmxtZW1fYWRkciA9IE5VTEw7CisJfQorCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKSAmJgorCQkodmRlY19zZWN1cmUoaHdfdG9fdmRlYyhwYmkpKSkpIHsKKwkJdGVlX3ZwOV9wcm9iX2ZyZWUoKHUzMilwYmktPnByb2JfYnVmZmVyX3BoeV9hZGRyKTsKKwkJcGJpLT5wcm9iX2J1ZmZlcl9waHlfYWRkciA9IDA7CisJCXBiaS0+Y291bnRfYnVmZmVyX3BoeV9hZGRyID0gMDsKKwkJcGJpLT5wcm9iX2J1ZmZlcl9hZGRyID0gTlVMTDsKKwkJcGJpLT5jb3VudF9idWZmZXJfYWRkciA9IE5VTEw7CisJfSBlbHNlIHsKKwkJaWYgKHBiaS0+cHJvYl9idWZmZXJfYWRkcikgeworCQkJaWYgKHBiaS0+cHJvYl9idWZmZXJfcGh5X2FkZHIpCisJCQkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCQlQUk9CX0JVRl9TSVpFLCBwYmktPnByb2JfYnVmZmVyX2FkZHIsCisJCQkJCXBiaS0+cHJvYl9idWZmZXJfcGh5X2FkZHIpOworCisJCQlwYmktPnByb2JfYnVmZmVyX2FkZHIgPSBOVUxMOworCQl9CisJCWlmIChwYmktPmNvdW50X2J1ZmZlcl9hZGRyKSB7CisJCQlpZiAocGJpLT5jb3VudF9idWZmZXJfcGh5X2FkZHIpCisJCQkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCQlDT1VOVF9CVUZfU0laRSwgcGJpLT5jb3VudF9idWZmZXJfYWRkciwKKwkJCQkJcGJpLT5jb3VudF9idWZmZXJfcGh5X2FkZHIpOworCisJCQlwYmktPmNvdW50X2J1ZmZlcl9hZGRyID0gTlVMTDsKKwkJfQorCX0KKwlpZiAocGJpLT5tbXVfZW5hYmxlKSB7CisJCXUzMiBtbXVfbWFwX3NpemUgPSB2dnA5X2ZyYW1lX21tdV9tYXBfc2l6ZShwYmkpOworCQlpZiAocGJpLT5mcmFtZV9tbXVfbWFwX2FkZHIpIHsKKwkJCWlmIChwYmktPmZyYW1lX21tdV9tYXBfcGh5X2FkZHIpCisJCQkJZG1hX2ZyZWVfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCQltbXVfbWFwX3NpemUsCisJCQkJCXBiaS0+ZnJhbWVfbW11X21hcF9hZGRyLAorCQkJCQlwYmktPmZyYW1lX21tdV9tYXBfcGh5X2FkZHIpOworCQkJcGJpLT5mcmFtZV9tbXVfbWFwX2FkZHIgPSBOVUxMOworCQl9CisJfQorI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKKwlpZiAocGJpLT5zdGFnZV9tbXVfbWFwX2FkZHIpIHsKKwkJaWYgKHBiaS0+c3RhZ2VfbW11X21hcF9waHlfYWRkcikKKwkJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlTVEFHRV9NTVVfTUFQX1NJWkUgKiBTVEFHRV9NQVhfQlVGRkVSUywKKwkJCQlwYmktPnN0YWdlX21tdV9tYXBfYWRkciwKKwkJCQkJcGJpLT5zdGFnZV9tbXVfbWFwX3BoeV9hZGRyKTsKKwkJcGJpLT5zdGFnZV9tbXVfbWFwX2FkZHIgPSBOVUxMOworCX0KKworCXVuaW5pdF9zdGFnZV9idWYocGJpKTsKKyNlbmRpZgorCisjaWZkZWYgVlA5X0xQRl9MVkxfVVBEQVRFCisJZnJlZV9sZl9idWYocGJpKTsKKyNlbmRpZgorCWlmIChwYmktPmd2cykKKwkJdmZyZWUocGJpLT5ndnMpOworCXBiaS0+Z3ZzID0gTlVMTDsKK30KKworc3RhdGljIGludCB2cDlfbG9jYWxfaW5pdChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJaW50IHJldCA9IC0xOworCS8qaW50IGxvc2xlc3NfY29tcF9oZWFkZXJfc2l6ZSwgbG9zbGVzc19jb21wX2JvZHlfc2l6ZTsqLworCisJc3RydWN0IEJ1ZmZJbmZvX3MgKmN1cl9idWZfaW5mbyA9IE5VTEw7CisKKwltZW1zZXQoJnBiaS0+cGFyYW0sIDAsIHNpemVvZih1bmlvbiBwYXJhbV91KSk7CisJbWVtc2V0KCZwYmktPmNvbW1vbiwgMCwgc2l6ZW9mKHN0cnVjdCBWUDlfQ29tbW9uX3MpKTsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJY3VyX2J1Zl9pbmZvID0gJnBiaS0+d29ya19zcGFjZV9idWZfc3RvcmU7CisJaWYgKGZvcmNlX2J1ZnNwZWMpIHsKKwkJbWVtY3B5KGN1cl9idWZfaW5mbywgJmFtdnZwOV93b3JrYnVmZl9zcGVjW2ZvcmNlX2J1ZnNwZWMgJiAweGZdLAorCQlzaXplb2Yoc3RydWN0IEJ1ZmZJbmZvX3MpKTsKKwkJcHJfaW5mbygiZm9yY2UgYnVmZmVyIHNwZWMgJWRcbiIsIGZvcmNlX2J1ZnNwZWMgJiAweGYpOworCX0gZWxzZSB7CisJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPD0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RNMiAmJiAhaXNfY3B1X3RtMl9yZXZiKCkpIHsKKwkJCWlmICh2ZGVjX2lzX3N1cHBvcnRfNGsoKSkgeworCQkJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkgeworCQkJCQltZW1jcHkoY3VyX2J1Zl9pbmZvLCAmYW12dnA5X3dvcmtidWZmX3NwZWNbMl0sCS8qIDhrICovCisJCQkJCXNpemVvZihzdHJ1Y3QgQnVmZkluZm9fcykpOworCQkJCX0gZWxzZQorCQkJCQltZW1jcHkoY3VyX2J1Zl9pbmZvLCAmYW12dnA5X3dvcmtidWZmX3NwZWNbMV0sCS8qIDRrICovCisJCQkJCXNpemVvZihzdHJ1Y3QgQnVmZkluZm9fcykpOworCQkJfSBlbHNlCisJCQkJbWVtY3B5KGN1cl9idWZfaW5mbywgJmFtdnZwOV93b3JrYnVmZl9zcGVjWzBdLC8qIDEwODBwICovCisJCQkJc2l6ZW9mKHN0cnVjdCBCdWZmSW5mb19zKSk7CisJCX0gZWxzZSB7IC8vZ2V0X2NwdV9tYWpvcl9pZCgpID4gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RNMiB8fCBpc19jcHVfdG0yX3JldmIoKQorCQkJaWYgKHZkZWNfaXNfc3VwcG9ydF80aygpKSB7CisJCQkJbWVtY3B5KGN1cl9idWZfaW5mbywgJmFtdnZwOV93b3JrYnVmZl9zcGVjWzVdLAkvKiA4ayAqLworCQkJCXNpemVvZihzdHJ1Y3QgQnVmZkluZm9fcykpOworCQkJfSBlbHNlCisJCQkJbWVtY3B5KGN1cl9idWZfaW5mbywgJmFtdnZwOV93b3JrYnVmZl9zcGVjWzNdLC8qIDEwODBwICovCisJCQkJc2l6ZW9mKHN0cnVjdCBCdWZmSW5mb19zKSk7CisJCX0KKwl9CisKKwljdXJfYnVmX2luZm8tPnN0YXJ0X2FkciA9IHBiaS0+YnVmX3N0YXJ0OworCWlmICghcGJpLT5tbXVfZW5hYmxlKQorCQlwYmktPm1jX2J1Zl9zcGVjLmJ1Zl9lbmQgPSBwYmktPmJ1Zl9zdGFydCArIHBiaS0+YnVmX3NpemU7CisKKyNlbHNlCisvKiEgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVCovCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA8PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVE0yICYmICFpc19jcHVfdG0yX3JldmIoKSkgeworCQlpZiAodmRlY19pc19zdXBwb3J0XzRrKCkpIHsKKwkJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkKKwkJCQljdXJfYnVmX2luZm8gPSAmYW12dnA5X3dvcmtidWZmX3NwZWNbMl07LyogOGsgd29yayBzcGFjZSAqLworCQkJZWxzZQorCQkJCWN1cl9idWZfaW5mbyA9ICZhbXZ2cDlfd29ya2J1ZmZfc3BlY1sxXTsvKiA0azJrIHdvcmsgc3BhY2UgKi8KKwkJfSBlbHNlCisJCQljdXJfYnVmX2luZm8gPSAmYW12dnA5X3dvcmtidWZmX3NwZWNbMF07LyogMTA4MHAgd29yayBzcGFjZSAqLworCX0gZWxzZSB7IC8vZ2V0X2NwdV9tYWpvcl9pZCgpID4gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RNMiB8fCBpc19jcHVfdG0yX3JldmIoKQorCQlpZiAodmRlY19pc19zdXBwb3J0XzRrKCkpIHsKKwkJCWN1cl9idWZfaW5mbyA9ICZhbXZ2cDlfd29ya2J1ZmZfc3BlY1s1XTsvKiA4ayB3b3JrIHNwYWNlICovCisJCX0gZWxzZQorCQkJY3VyX2J1Zl9pbmZvID0gJmFtdnZwOV93b3JrYnVmZl9zcGVjWzNdOy8qIDEwODBwIHdvcmsgc3BhY2UgKi8KKwl9CisKKyNlbmRpZgorCisJaW5pdF9idWZmX3NwZWMocGJpLCBjdXJfYnVmX2luZm8pOworCXZwOV9idWZtZ3JfaW5pdChwYmksIGN1cl9idWZfaW5mbywgTlVMTCk7CisKKwlpZiAoIXZkZWNfaXNfc3VwcG9ydF80aygpCisJCSYmIChidWZfYWxsb2Nfd2lkdGggPiAxOTIwICYmICBidWZfYWxsb2NfaGVpZ2h0ID4gMTA4OCkpIHsKKwkJYnVmX2FsbG9jX3dpZHRoID0gMTkyMDsKKwkJYnVmX2FsbG9jX2hlaWdodCA9IDEwODg7CisJCWlmIChwYmktPm1heF9waWNfdyA+IDE5MjAgJiYgcGJpLT5tYXhfcGljX2ggPiAxMDg4KSB7CisJCQlwYmktPm1heF9waWNfdyA9IDE5MjA7CisJCQlwYmktPm1heF9waWNfaCA9IDEwODg7CisJCX0KKwl9IGVsc2UgaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfU00xKSB7CisJCWJ1Zl9hbGxvY193aWR0aCA9IDgxOTI7CisJCWJ1Zl9hbGxvY19oZWlnaHQgPSA0NjA4OworCX0KKwlwYmktPmluaXRfcGljX3cgPSBwYmktPm1heF9waWNfdyA/IHBiaS0+bWF4X3BpY193IDoKKwkJKGJ1Zl9hbGxvY193aWR0aCA/IGJ1Zl9hbGxvY193aWR0aCA6CisJCShwYmktPnZ2cDlfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGggPworCQlwYmktPnZ2cDlfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGggOgorCQlwYmktPndvcmtfc3BhY2VfYnVmLT5tYXhfd2lkdGgpKTsKKwlwYmktPmluaXRfcGljX2ggPSBwYmktPm1heF9waWNfaCA/IHBiaS0+bWF4X3BpY19oIDoKKwkJKGJ1Zl9hbGxvY19oZWlnaHQgPyBidWZfYWxsb2NfaGVpZ2h0IDoKKwkJKHBiaS0+dnZwOV9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQgPworCQlwYmktPnZ2cDlfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0IDoKKwkJcGJpLT53b3JrX3NwYWNlX2J1Zi0+bWF4X2hlaWdodCkpOworCisJLyogdmlkZW8gaXMgbm90IHN1cHBvcnQgdW5hbGlnbmVkIHdpdGggNjQgaW4gdGwxCisJKiogdmRlYyBjYW52YXMgbW9kZSB3aWxsIGJlIGxpbmVhciB3aGVuIGR1bXAgeXV2IGlzIHNldAorCSovCisJaWYgKChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpICYmCisJCShwYmktPmRvdWJsZV93cml0ZV9tb2RlICE9IDApICYmCisJCSgoKHBiaS0+bWF4X3BpY193ICUgNjQpICE9IDApIHx8CisJCShwYmktPnZ2cDlfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGggJSA2NCkgIT0gMCkpIHsKKwkJaWYgKGh3X3RvX3ZkZWMocGJpKS0+Y2FudmFzX21vZGUgIT0KKwkJCUNBTlZBU19CTEtNT0RFX0xJTkVBUikKKwkJCXBiaS0+bWVtX21hcF9tb2RlID0gMjsKKwkJZWxzZSB7CisJCQlwYmktPm1lbV9tYXBfbW9kZSA9IDA7CisJCQlwcl9pbmZvKCJ2ZGVjIGJsa21vZCBsaW5lYXIsIGZvcmNlIG1lbV9tYXBfbW9kZSAwXG4iKTsKKwkJfQorCX0KKworI2lmbmRlZiBNVl9VU0VfRklYRURfQlVGCisJaWYgKCFwYmktPmlzX3VzZWRfdjRsKSB7CisJCWlmIChpbml0X212X2J1Zl9saXN0KHBiaSkgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBpbml0X212X2J1Zl9saXN0IGZhaWxcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKyNlbmRpZgorCisJcGJpLT5wdHNfdW5zdGFibGUgPSAoKHVuc2lnbmVkIGxvbmcpKHBiaS0+dnZwOV9hbXN0cmVhbV9kZWNfaW5mby5wYXJhbSkKKwkJCSYgMHg0MCkgPj4gNjsKKworCWlmICgoZGVidWcgJiBWUDlfREVCVUdfU0VORF9QQVJBTV9XSVRIX1JFRykgPT0gMCkgeworCQlwYmktPnJwbV9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlSUE1fQlVGX1NJWkUsCisJCQkJJnBiaS0+cnBtX3BoeV9hZGRyLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHBiaS0+cnBtX2FkZHIgPT0gTlVMTCkgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFsbG9jIHJwbSBidWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXBiaS0+cnBtX3B0ciA9IHBiaS0+cnBtX2FkZHI7CisJfQorCisJcGJpLT5sbWVtX2FkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJTE1FTV9CVUZfU0laRSwKKwkJCSZwYmktPmxtZW1fcGh5X2FkZHIsIEdGUF9LRVJORUwpOworCWlmIChwYmktPmxtZW1fYWRkciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvYyBsbWVtIGJ1ZmZlclxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLTE7CisJfQorCXBiaS0+bG1lbV9wdHIgPSBwYmktPmxtZW1fYWRkcjsKKworCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKSAmJgorCQkodmRlY19zZWN1cmUoaHdfdG9fdmRlYyhwYmkpKSkpIHsKKwkJdTMyIHByb2JfYWRkciwgaWQ7CisJCWlkID0gdGVlX3ZwOV9wcm9iX21hbGxvYygmcHJvYl9hZGRyKTsKKwkJaWYgKHByb2JfYWRkciA8PSAwKQorCQkJcHJfZXJyKCIlcywgdGVlWyVkXSBtYWxsb2MgcHJvYiBidWYgZmFpbGVkXG4iLCBfX2Z1bmNfXywgaWQpOworCQllbHNlIHsKKwkJCXBiaS0+cHJvYl9idWZmZXJfcGh5X2FkZHIgPSBwcm9iX2FkZHI7CisJCQlwYmktPmNvdW50X2J1ZmZlcl9waHlfYWRkciA9IHBiaS0+cHJvYl9idWZmZXJfcGh5X2FkZHIgKyBQUk9CX0JVRl9TSVpFOworCQl9CisJCXBiaS0+cHJvYl9idWZmZXJfYWRkciA9IE5VTEw7CisJCXBiaS0+Y291bnRfYnVmZmVyX2FkZHIgPSBOVUxMOworCX0gZWxzZSB7CisJCXBiaS0+cHJvYl9idWZmZXJfYWRkciA9IGRtYV9hbGxvY19jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJCVBST0JfQlVGX1NJWkUsCisJCQkJCSZwYmktPnByb2JfYnVmZmVyX3BoeV9hZGRyLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHBiaS0+cHJvYl9idWZmZXJfYWRkciA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgcHJvYl9idWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQltZW1zZXQocGJpLT5wcm9iX2J1ZmZlcl9hZGRyLCAwLCBQUk9CX0JVRl9TSVpFKTsKKwkJcGJpLT5jb3VudF9idWZmZXJfYWRkciA9IGRtYV9hbGxvY19jb2hlcmVudChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJCUNPVU5UX0JVRl9TSVpFLAorCQkJCQkmcGJpLT5jb3VudF9idWZmZXJfcGh5X2FkZHIsIEdGUF9LRVJORUwpOworCQlpZiAocGJpLT5jb3VudF9idWZmZXJfYWRkciA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2MgY291bnRfYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbWVtc2V0KHBiaS0+Y291bnRfYnVmZmVyX2FkZHIsIDAsIENPVU5UX0JVRl9TSVpFKTsKKwl9CisKKwlpZiAocGJpLT5tbXVfZW5hYmxlKSB7CisJCXUzMiBtbXVfbWFwX3NpemUgPSB2dnA5X2ZyYW1lX21tdV9tYXBfc2l6ZShwYmkpOworCQlwYmktPmZyYW1lX21tdV9tYXBfYWRkciA9CisJCQlkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCW1tdV9tYXBfc2l6ZSwKKwkJCQkmcGJpLT5mcmFtZV9tbXVfbWFwX3BoeV9hZGRyLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHBiaS0+ZnJhbWVfbW11X21hcF9hZGRyID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvYyBjb3VudF9idWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQltZW1zZXQocGJpLT5mcmFtZV9tbXVfbWFwX2FkZHIsIDAsIENPVU5UX0JVRl9TSVpFKTsKKwl9CisjaWZkZWYgU1VQUE9SVF9GQl9ERUNPRElORworCWlmIChwYmktPm1faW5zX2ZsYWcgJiYgc3RhZ2VfYnVmX251bSA+IDApIHsKKwkJcGJpLT5zdGFnZV9tbXVfbWFwX2FkZHIgPQorCQkJZG1hX2FsbG9jX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQlTVEFHRV9NTVVfTUFQX1NJWkUgKiBTVEFHRV9NQVhfQlVGRkVSUywKKwkJCQkmcGJpLT5zdGFnZV9tbXVfbWFwX3BoeV9hZGRyLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHBiaS0+c3RhZ2VfbW11X21hcF9hZGRyID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvYyBjb3VudF9idWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQltZW1zZXQocGJpLT5zdGFnZV9tbXVfbWFwX2FkZHIsCisJCQkwLCBTVEFHRV9NTVVfTUFQX1NJWkUgKiBTVEFHRV9NQVhfQlVGRkVSUyk7CisKKwkJaW5pdF9zdGFnZV9idWYocGJpKTsKKwl9CisjZW5kaWYKKworCXJldCA9IDA7CisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgTWFpbGJveCBjb21tYW5kCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENNRF9GSU5JU0hFRCAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ01EX0FMTE9DX1ZJRVcgICAgICAgICAgICAgMQorI2RlZmluZSBDTURfRlJBTUVfRElTUExBWSAgICAgICAgICAzCisjZGVmaW5lIENNRF9ERUJVRyAgICAgICAgICAgICAgICAgIDEwCisKKworI2RlZmluZSBERUNPREVfQlVGRkVSX05VTV9NQVggICAgMzIKKyNkZWZpbmUgRElTUExBWV9CVUZGRVJfTlVNICAgICAgIDYKKworI2RlZmluZSB2aWRlb19kb21haW5fYWRkcihhZHIpIChhZHImMHg3ZmZmZmZmZikKKyNkZWZpbmUgREVDT0RFUl9XT1JLX1NQQUNFX1NJWkUgMHg4MDAwMDAKKworI2RlZmluZSBzcGVjMmNhbnZhcyh4KSAgXAorCSgoKHgpLT51dl9jYW52YXNfaW5kZXggPDwgMTYpIHwgXAorCSAoKHgpLT51dl9jYW52YXNfaW5kZXggPDwgOCkgIHwgXAorCSAoKHgpLT55X2NhbnZhc19pbmRleCA8PCAwKSkKKworCitzdGF0aWMgdm9pZCBzZXRfY2FudmFzKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwKKwlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljX2NvbmZpZykKK3sKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhwYmkpOworCWludCBjYW52YXNfdyA9IEFMSUdOKHBpY19jb25maWctPnlfY3JvcF93aWR0aCwgNjQpLzQ7CisJaW50IGNhbnZhc19oID0gQUxJR04ocGljX2NvbmZpZy0+eV9jcm9wX2hlaWdodCwgMzIpLzQ7CisJaW50IGJsa21vZGUgPSBwYmktPm1lbV9tYXBfbW9kZTsKKwkvKkNBTlZBU19CTEtNT0RFXzY0WDMyKi8KKwlpZgkocGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGUpIHsKKwkJY2FudmFzX3cgPSBwaWNfY29uZmlnLT55X2Nyb3Bfd2lkdGgJLworCQkJCWdldF9kb3VibGVfd3JpdGVfcmF0aW8oCisJCQkJCXBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlKTsKKwkJY2FudmFzX2ggPSBwaWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0IC8KKwkJCQlnZXRfZG91YmxlX3dyaXRlX3JhdGlvKAorCQkJCQlwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSk7CisKKwkJLyogc2FvIGN0cmwxIHJlZyBhbGlnbmxpbmUgd2l0aCA2NCwgYWxpZ24gd2l0aCA2NCAqLworCQljYW52YXNfdyA9IEFMSUdOKGNhbnZhc193LCA2NCk7CisJCWNhbnZhc19oID0gQUxJR04oY2FudmFzX2gsIDMyKTsKKworCQlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpIHsKKwkJCWlmIChwaWNfY29uZmlnLT55X2NhbnZhc19pbmRleCA9PSAtMSkKKwkJCQlwaWNfY29uZmlnLT55X2NhbnZhc19pbmRleCA9CisJCQkJCXZkZWMtPmdldF9jYW52YXNfZXgoQ09SRV9NQVNLX0hFVkMsIHZkZWMtPmlkKTsKKwkJCWlmIChwaWNfY29uZmlnLT51dl9jYW52YXNfaW5kZXggPT0gLTEpCisJCQkJcGljX2NvbmZpZy0+dXZfY2FudmFzX2luZGV4ID0KKwkJCQkJdmRlYy0+Z2V0X2NhbnZhc19leChDT1JFX01BU0tfSEVWQywgdmRlYy0+aWQpOworCQl9IGVsc2UgeworCQkJcGljX2NvbmZpZy0+eV9jYW52YXNfaW5kZXggPSAxMjggKyBwaWNfY29uZmlnLT5pbmRleCAqIDI7CisJCQlwaWNfY29uZmlnLT51dl9jYW52YXNfaW5kZXggPSAxMjggKyBwaWNfY29uZmlnLT5pbmRleCAqIDIgKyAxOworCQl9CisKKwkJY29uZmlnX2Nhdl9sdXRfZXgocGljX2NvbmZpZy0+eV9jYW52YXNfaW5kZXgsCisJCQlwaWNfY29uZmlnLT5kd195X2FkciwgY2FudmFzX3csIGNhbnZhc19oLAorCQkJQ0FOVkFTX0FERFJfTk9XUkFQLCBibGttb2RlLCBwYmktPmlzX3VzZWRfdjRsID8gMCA6IDcsIFZERUNfSEVWQyk7CisJCWNvbmZpZ19jYXZfbHV0X2V4KHBpY19jb25maWctPnV2X2NhbnZhc19pbmRleCwKKwkJCXBpY19jb25maWctPmR3X3Vfdl9hZHIsCWNhbnZhc193LCBjYW52YXNfaCwKKwkJCUNBTlZBU19BRERSX05PV1JBUCwgYmxrbW9kZSwgcGJpLT5pc191c2VkX3Y0bCA/IDAgOiA3LCBWREVDX0hFVkMpOworCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQlwaWNfY29uZmlnLT5jYW52YXNfY29uZmlnWzBdLnBoeV9hZGRyID0KKwkJCQlwaWNfY29uZmlnLT5kd195X2FkcjsKKwkJcGljX2NvbmZpZy0+Y2FudmFzX2NvbmZpZ1swXS53aWR0aCA9CisJCQkJY2FudmFzX3c7CisJCXBpY19jb25maWctPmNhbnZhc19jb25maWdbMF0uaGVpZ2h0ID0KKwkJCQljYW52YXNfaDsKKwkJcGljX2NvbmZpZy0+Y2FudmFzX2NvbmZpZ1swXS5ibG9ja19tb2RlID0KKwkJCQlibGttb2RlOworCQlwaWNfY29uZmlnLT5jYW52YXNfY29uZmlnWzBdLmVuZGlhbiA9IHBiaS0+aXNfdXNlZF92NGwgPyAwIDogNzsKKworCQlwaWNfY29uZmlnLT5jYW52YXNfY29uZmlnWzFdLnBoeV9hZGRyID0KKwkJCQlwaWNfY29uZmlnLT5kd191X3ZfYWRyOworCQlwaWNfY29uZmlnLT5jYW52YXNfY29uZmlnWzFdLndpZHRoID0KKwkJCQljYW52YXNfdzsKKwkJcGljX2NvbmZpZy0+Y2FudmFzX2NvbmZpZ1sxXS5oZWlnaHQgPQorCQkJCWNhbnZhc19oOworCQlwaWNfY29uZmlnLT5jYW52YXNfY29uZmlnWzFdLmJsb2NrX21vZGUgPQorCQkJCWJsa21vZGU7CisJCXBpY19jb25maWctPmNhbnZhc19jb25maWdbMV0uZW5kaWFuID0gcGJpLT5pc191c2VkX3Y0bCA/IDAgOiA3OworI2VuZGlmCisJfQorfQorCisKK3N0YXRpYyB2b2lkIHNldF9mcmFtZV9pbmZvKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwgc3RydWN0IHZmcmFtZV9zICp2ZikKK3sKKwl1bnNpZ25lZCBpbnQgYXI7CisJdmYtPmR1cmF0aW9uID0gcGJpLT5mcmFtZV9kdXI7CisJdmYtPmR1cmF0aW9uX3B1bGxkb3duID0gMDsKKwl2Zi0+ZmxhZyA9IDA7CisJdmYtPnByb3AubWFzdGVyX2Rpc3BsYXlfY29sb3VyID0gcGJpLT52Zl9kcDsKKwl2Zi0+c2lnbmFsX3R5cGUgPSBwYmktPnZpZGVvX3NpZ25hbF90eXBlOworCWlmICh2Zi0+Y29tcFdpZHRoICYmIHZmLT5jb21wSGVpZ2h0KQorCQlwYmktPmZyYW1lX2FyID0gdmYtPmNvbXBIZWlnaHQgKiAweDEwMCAvIHZmLT5jb21wV2lkdGg7CisJYXIgPSBtaW5fdCh1MzIsIHBiaS0+ZnJhbWVfYXIsIERJU1BfUkFUSU9fQVNQRUNUX1JBVElPX01BWCk7CisJdmYtPnJhdGlvX2NvbnRyb2wgPSAoYXIgPDwgRElTUF9SQVRJT19BU1BFQ1RfUkFUSU9fQklUKTsKKworCWlmIChwYmktPmlzX3VzZWRfdjRsICYmIHBiaS0+dmZfZHAucHJlc2VudF9mbGFnKSB7CisJCXN0cnVjdCBhbWxfdmRlY19oZHJfaW5mb3MgaGRyOworCQlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKHBiaS0+djRsMl9jdHgpOworCisJCW1lbXNldCgmaGRyLCAwLCBzaXplb2YoaGRyKSk7CisJCWhkci5zaWduYWxfdHlwZSA9IHZmLT5zaWduYWxfdHlwZTsKKwkJaGRyLmNvbG9yX3Bhcm1zID0gcGJpLT52Zl9kcDsKKworCQloZHIuY29sb3JfcGFybXMubHVtaW5hbmNlWzBdID0gaGRyLmNvbG9yX3Bhcm1zLmx1bWluYW5jZVswXSAvIDEwMDAwOworCisJCXZkZWNfdjRsX3NldF9oZHJfaW5mb3MoY3R4LCAmaGRyKTsKKwl9CisKKwlpZiAoKHBiaS0+Y2h1bmsgIT0gTlVMTCkgJiYgKHBiaS0+Y2h1bmstPmhkcjEwcF9kYXRhX2J1ZiAhPSBOVUxMKQorCQkmJiAocGJpLT5jaHVuay0+aGRyMTBwX2RhdGFfc2l6ZSAhPSAwKSkgeworCQlpZiAocGJpLT5jaHVuay0+aGRyMTBwX2RhdGFfc2l6ZSA8PSAxMjgpIHsKKwkJCWNoYXIgKm5ld19idWY7CisJCQlpbnQgaSA9IDA7CisJCQluZXdfYnVmID0ga3phbGxvYyhwYmktPmNodW5rLT5oZHIxMHBfZGF0YV9zaXplLCBHRlBfQVRPTUlDKTsKKworCQkJaWYgKG5ld19idWYpIHsKKwkJCQltZW1jcHkobmV3X2J1ZiwgcGJpLT5jaHVuay0+aGRyMTBwX2RhdGFfYnVmLCBwYmktPmNodW5rLT5oZHIxMHBfZGF0YV9zaXplKTsKKwkJCQlpZiAoZGVidWcgJiBWUDlfREVCVUdfQlVGTUdSX01PUkUpIHsKKwkJCQkJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHX0JVRk1HUl9NT1JFLAorCQkJCQkJImhkcjEwcCBkYXRhOiAoc2l6ZSAlZClcbiIsCisJCQkJCQlwYmktPmNodW5rLT5oZHIxMHBfZGF0YV9zaXplKTsKKwkJCQkJZm9yIChpID0gMDsgaSA8IHBiaS0+Y2h1bmstPmhkcjEwcF9kYXRhX3NpemU7IGkrKykgeworCQkJCQkJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHX0JVRk1HUl9NT1JFLAorCQkJCQkJCSIlMDJ4ICIsIHBiaS0+Y2h1bmstPmhkcjEwcF9kYXRhX2J1ZltpXSk7CisJCQkJCQlpZiAoKChpICsgMSkgJiAweGYpID09IDApCisJCQkJCQkJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHX0JVRk1HUl9NT1JFLCAiXG4iKTsKKwkJCQkJfQorCQkJCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfQlVGTUdSX01PUkUsICJcbiIpOworCQkJCX0KKworCQkJCXZmLT5oZHIxMHBfZGF0YV9zaXplID0gcGJpLT5jaHVuay0+aGRyMTBwX2RhdGFfc2l6ZTsKKwkJCQl2Zi0+aGRyMTBwX2RhdGFfYnVmID0gbmV3X2J1ZjsKKwkJCQlzZXRfbWV0YV9kYXRhX3RvX3ZmKHZmLCBVVk1fTUVUQV9EQVRBX0hEUjEwUF9EQVRBLCBwYmktPnY0bDJfY3R4KTsKKwkJCX0gZWxzZSB7CisJCQkJdnA5X3ByaW50KHBiaSwgMCwgIiVzOmhkcjEwcCBkYXRhIHZ6YWxsb2Mgc2l6ZSglZCkgZmFpbFxuIiwKKwkJCQkJX19mdW5jX18sIHBiaS0+Y2h1bmstPmhkcjEwcF9kYXRhX3NpemUpOworCQkJCXZmLT5oZHIxMHBfZGF0YV9zaXplID0gcGJpLT5jaHVuay0+aGRyMTBwX2RhdGFfc2l6ZTsKKwkJCQl2Zi0+aGRyMTBwX2RhdGFfYnVmID0gbmV3X2J1ZjsKKwkJCX0KKwkJfQorCisJCXZmcmVlKHBiaS0+Y2h1bmstPmhkcjEwcF9kYXRhX2J1Zik7CisJCXBiaS0+Y2h1bmstPmhkcjEwcF9kYXRhX2J1ZiA9IE5VTEw7CisJCXBiaS0+Y2h1bmstPmhkcjEwcF9kYXRhX3NpemUgPSAwOworCX0KKworCXZmLT5zaWRlYmluZF90eXBlID0gcGJpLT5zaWRlYmluZF90eXBlOworCXZmLT5zaWRlYmluZF9jaGFubmVsX2lkID0gcGJpLT5zaWRlYmluZF9jaGFubmVsX2lkOworfQorCitzdGF0aWMgaW50IHZ2cDlfdmZfc3RhdGVzKHN0cnVjdCB2ZnJhbWVfc3RhdGVzICpzdGF0ZXMsIHZvaWQgKm9wX2FyZykKK3sKKwlzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkgPSAoc3RydWN0IFZQOURlY29kZXJfcyAqKW9wX2FyZzsKKworCXN0YXRlcy0+dmZfcG9vbF9zaXplID0gVkZfUE9PTF9TSVpFOworCXN0YXRlcy0+YnVmX2ZyZWVfbnVtID0ga2ZpZm9fbGVuKCZwYmktPm5ld2ZyYW1lX3EpOworCXN0YXRlcy0+YnVmX2F2YWlsX251bSA9IGtmaWZvX2xlbigmcGJpLT5kaXNwbGF5X3EpOworCisJaWYgKHN0ZXAgPT0gMikKKwkJc3RhdGVzLT5idWZfYXZhaWxfbnVtID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB2ZnJhbWVfcyAqdnZwOV92Zl9wZWVrKHZvaWQgKm9wX2FyZykKK3sKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmWzJdID0gezAsIDB9OworCXN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSA9IChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICopb3BfYXJnOworCisJaWYgKHN0ZXAgPT0gMikKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoa2ZpZm9fb3V0X3BlZWsoJnBiaS0+ZGlzcGxheV9xLCAodm9pZCAqKSZ2ZiwgMikpIHsKKwkJaWYgKHZmWzFdKSB7CisJCQl2ZlswXS0+bmV4dF92Zl9wdHNfdmFsaWQgPSB0cnVlOworCQkJdmZbMF0tPm5leHRfdmZfcHRzID0gdmZbMV0tPnB0czsKKwkJfSBlbHNlCisJCQl2ZlswXS0+bmV4dF92Zl9wdHNfdmFsaWQgPSBmYWxzZTsKKwkJcmV0dXJuIHZmWzBdOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHZmcmFtZV9zICp2dnA5X3ZmX2dldCh2b2lkICpvcF9hcmcpCit7CisJc3RydWN0IHZmcmFtZV9zICp2ZjsKKwlzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkgPSAoc3RydWN0IFZQOURlY29kZXJfcyAqKW9wX2FyZzsKKworCWlmIChzdGVwID09IDIpCisJCXJldHVybiBOVUxMOworCWVsc2UgaWYgKHN0ZXAgPT0gMSkKKwkJCXN0ZXAgPSAyOworCisJaWYgKGtmaWZvX2dldCgmcGJpLT5kaXNwbGF5X3EsICZ2ZikpIHsKKwkJc3RydWN0IHZmcmFtZV9zICpuZXh0X3ZmID0gTlVMTDsKKwkJdWludDhfdCBpbmRleCA9IHZmLT5pbmRleCAmIDB4ZmY7CisJCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UuZGlzcF9xX25hbWUsIGtmaWZvX2xlbigmcGJpLT5kaXNwbGF5X3EpKTsKKwkJaWYgKGluZGV4IDwgcGJpLT51c2VkX2J1Zl9udW0gfHwKKwkJCSh2Zi0+dHlwZSAmIFZJRFRZUEVfVjRMX0VPUykpIHsKKwkJCXZmLT5pbmRleF9kaXNwID0gYXRvbWljX3JlYWQoJnBiaS0+dmZfZ2V0X2NvdW50KTsKKwkJCWF0b21pY19hZGQoMSwgJnBiaS0+dmZfZ2V0X2NvdW50KTsKKworCQkJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0JVRk1HUikKKwkJCQlwcl9pbmZvKCIlcyBpZHg6ICVkLCB0eXBlIDB4JXggdy9oICVkLyVkLCBwdHMgJWQsICVsbGQsIHRzOiAlbGxkXG4iLAorCQkJCQlfX2Z1bmNfXywgaW5kZXgsIHZmLT50eXBlLAorCQkJCQl2Zi0+d2lkdGgsIHZmLT5oZWlnaHQsCisJCQkJCXZmLT5wdHMsCisJCQkJCXZmLT5wdHNfdXM2NCwKKwkJCQkJdmYtPnRpbWVzdGFtcCk7CisKKwkJCWlmIChrZmlmb19wZWVrKCZwYmktPmRpc3BsYXlfcSwgJm5leHRfdmYpICYmIG5leHRfdmYpIHsKKwkJCQl2Zi0+bmV4dF92Zl9wdHNfdmFsaWQgPSB0cnVlOworCQkJCXZmLT5uZXh0X3ZmX3B0cyA9IG5leHRfdmYtPnB0czsKKwkJCX0gZWxzZQorCQkJCXZmLT5uZXh0X3ZmX3B0c192YWxpZCA9IGZhbHNlOworCisJCQlyZXR1cm4gdmY7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgdnZwOV92Zl9wdXQoc3RydWN0IHZmcmFtZV9zICp2Ziwgdm9pZCAqb3BfYXJnKQoreworCXN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSA9IChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICopb3BfYXJnOworCXVpbnQ4X3QgaW5kZXg7CisKKwlpZiAodmYgPT0gKCZwYmktPnZmcmFtZV9kdW1teSkpCisJCXJldHVybjsKKworCWlmICghdmYpCisJCXJldHVybjsKKworCWlmIChwYmktPmVuYWJsZV9mZW5jZSAmJiB2Zi0+ZmVuY2UpIHsKKwkJaW50IHJldCwgaTsKKworCQltdXRleF9sb2NrKCZwYmktPmZlbmNlX211dGV4KTsKKwkJcmV0ID0gZG1hX2ZlbmNlX2dldF9zdGF0dXModmYtPmZlbmNlKTsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgVkZfUE9PTF9TSVpFOyBpKyspIHsKKwkJCQlpZiAocGJpLT5mZW5jZV92Zl9zLmZlbmNlX3ZmW2ldID09IE5VTEwpIHsKKwkJCQkJcGJpLT5mZW5jZV92Zl9zLmZlbmNlX3ZmW2ldID0gdmY7CisJCQkJCXBiaS0+ZmVuY2VfdmZfcy51c2VkX3NpemUrKzsKKwkJCQkJbXV0ZXhfdW5sb2NrKCZwYmktPmZlbmNlX211dGV4KTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCQltdXRleF91bmxvY2soJnBiaS0+ZmVuY2VfbXV0ZXgpOworCX0KKworCWluZGV4ID0gdmYtPmluZGV4ICYgMHhmZjsKKworCWlmIChwYmktPmVuYWJsZV9mZW5jZSAmJiB2Zi0+ZmVuY2UpIHsKKwkJdmRlY19mZW5jZV9wdXQodmYtPmZlbmNlKTsKKwkJdmYtPmZlbmNlID0gTlVMTDsKKwl9CisKKwlpZiAodmYtPmhkcjEwcF9kYXRhX2J1ZikgeworCQlrZnJlZSh2Zi0+aGRyMTBwX2RhdGFfYnVmKTsKKwkJdmYtPmhkcjEwcF9kYXRhX2J1ZiA9IE5VTEw7CisJCXZmLT5oZHIxMHBfZGF0YV9zaXplID0gMDsKKwl9CisKKwlpZiAodmYtPm1ldGFfZGF0YV9idWYpIHsKKwkJdmYtPm1ldGFfZGF0YV9idWYgPSBOVUxMOworCQl2Zi0+bWV0YV9kYXRhX3NpemUgPSAwOworCX0KKworCWtmaWZvX3B1dCgmcGJpLT5uZXdmcmFtZV9xLCAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UubmV3X3FfbmFtZSwga2ZpZm9fbGVuKCZwYmktPm5ld2ZyYW1lX3EpKTsKKwlhdG9taWNfYWRkKDEsICZwYmktPnZmX3B1dF9jb3VudCk7CisKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfQlVGTUdSKQorCQlwcl9pbmZvKCIlcyB2ZjolcHgsIGlkeDogJWQsIHR5cGUgMHgleCB3L2ggJWQvJWQsIHB0cyAlZCwgJWxsZCwgdHM6ICVsbGRcbiIsCisJCQlfX2Z1bmNfXywgdmYsIGluZGV4LCB2Zi0+dHlwZSwKKwkJCXZmLT53aWR0aCwgdmYtPmhlaWdodCwKKwkJCXZmLT5wdHMsCisJCQl2Zi0+cHRzX3VzNjQsCisJCQl2Zi0+dGltZXN0YW1wKTsKKworCWlmIChpbmRleCA8IHBiaS0+dXNlZF9idWZfbnVtKSB7CisJCXN0cnVjdCBWUDlfQ29tbW9uX3MgKmNtID0gJnBiaS0+Y29tbW9uOworCQlzdHJ1Y3QgQnVmZmVyUG9vbF9zICpwb29sID0gY20tPmJ1ZmZlcl9wb29sOworCQlzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljID0gJnBvb2wtPmZyYW1lX2J1ZnNbaW5kZXhdLmJ1ZjsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlpZiAodmYtPnY0bF9tZW1faGFuZGxlICE9CisJCQlwYmktPm1fQlVGW3BpYy0+QlVGX2luZGV4XS52NGxfcmVmX2J1Zl9hZGRyKSB7CisJCQl2cDlfcHJpbnQocGJpLCBQUklOVF9GTEFHX1Y0TF9ERVRBSUwsCisJCQkJIlZQOSB1cGRhdGUgZmIgaGFuZGxlLCBvbGQ6JWxseCwgbmV3OiVsbHhcbiIsCisJCQkJcGJpLT5tX0JVRltwaWMtPkJVRl9pbmRleF0udjRsX3JlZl9idWZfYWRkciwKKwkJCQl2Zi0+djRsX21lbV9oYW5kbGUpOworCisJCQlwYmktPm1fQlVGW3BpYy0+QlVGX2luZGV4XS52NGxfcmVmX2J1Zl9hZGRyID0KKwkJCQl2Zi0+djRsX21lbV9oYW5kbGU7CisJCX0KKworCQlsb2NrX2J1ZmZlcl9wb29sKHBvb2wsIGZsYWdzKTsKKwkJaWYgKHBpYy0+cmVwZWF0X3BpYykgeworCQkJaWYgKHBpYy0+cmVwZWF0X3BpYy0+cmVwZWF0X2NvdW50ID4gMCkKKwkJCQlwaWMtPnJlcGVhdF9waWMtPnJlcGVhdF9jb3VudCAtLTsKKwkJCWVsc2UKKwkJCQl2cDlfcHJpbnQocGJpLCBQUklOVF9GTEFHX0VSUk9SLCAicmVwZWF0X2NvdW50IDw9IDAgcGljOiVweFxuIiwgcGljKTsKKwkJCXBpYy0+cmVwZWF0X3BpYyA9IE5VTEw7CisJCX0KKwkJaWYgKHBvb2wtPmZyYW1lX2J1ZnNbaW5kZXhdLmJ1Zi52Zl9yZWYgPiAwKQorCQkJcG9vbC0+ZnJhbWVfYnVmc1tpbmRleF0uYnVmLnZmX3JlZi0tOworCisJCWlmIChwYmktPndhaXRfYnVmKQorCQkJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9NQk9YMF9JUlFfUkVHLAorCQkJCQkJMHgxKTsKKwkJcGJpLT5sYXN0X3B1dF9pZHggPSBpbmRleDsKKwkJcGJpLT5uZXdfZnJhbWVfZGlzcGxheWVkKys7CisJCXVubG9ja19idWZmZXJfcG9vbChwb29sLCBmbGFncyk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBiaS0+d2FpdF9idWZfbG9jaywgZmxhZ3MpOworCisJCWlmIChwYmktPndhaXRfbW9yZV9idWYpIHsKKwkJCXBiaS0+d2FpdF9tb3JlX2J1ZiA9IGZhbHNlOworCQkJcGJpLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ORUVEX01PUkVfQlVGRkVSOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZwYmktPndvcmspOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBiaS0+d2FpdF9idWZfbG9jaywgZmxhZ3MpOworCisjaWZkZWYgU1VQUE9SVF9GQl9ERUNPRElORworCQlpZiAocGJpLT51c2VkX3N0YWdlX2J1Zl9udW0gPiAwICYmCisJCQlwYmktPmJhY2tfbm90X3J1bl9yZWFkeSkKKwkJCXRyaWdnZXJfc2NoZWR1bGUocGJpKTsKKyNlbmRpZgorCX0KKworfQorCisKK3N0YXRpYyBpbnQgdnZwOV9ldmVudF9jYihpbnQgdHlwZSwgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZV9kYXRhKQoreworCXN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSA9IChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICopcHJpdmF0ZV9kYXRhOworCisJaWYgKHR5cGUgJiBWRlJBTUVfRVZFTlRfUkVDRUlWRVJfUkVTRVQpIHsKKyNpZiAwCisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJYW1oZXZjX3N0b3AoKTsKKyNpZm5kZWYgQ09ORklHX0FNTE9HSUNfUE9TVF9QUk9DRVNTX01BTkFHRVIKKwkJdmZfbGlnaHRfdW5yZWdfcHJvdmlkZXIoJnZ2cDlfdmZfcHJvdik7CisjZW5kaWYKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBiaS0+bG9jaywgZmxhZ3MpOworCQl2dnA5X2xvY2FsX2luaXQoKTsKKwkJdnZwOV9wcm90X2luaXQoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGJpLT5sb2NrLCBmbGFncyk7CisjaWZuZGVmIENPTkZJR19BTUxPR0lDX1BPU1RfUFJPQ0VTU19NQU5BR0VSCisJCXZmX3JlZ19wcm92aWRlcigmdnZwOV92Zl9wcm92KTsKKyNlbmRpZgorCQlhbWhldmNfc3RhcnQoKTsKKyNlbmRpZgorCX0gZWxzZSBpZiAodHlwZSAmIFZGUkFNRV9FVkVOVF9SRUNFSVZFUl9SRVFfU1RBVEUpIHsKKwkJc3RydWN0IHByb3ZpZGVyX3N0YXRlX3JlcV9zICpyZXEgPQorCQkJKHN0cnVjdCBwcm92aWRlcl9zdGF0ZV9yZXFfcyAqKWRhdGE7CisJCWlmIChyZXEtPnJlcV90eXBlID09IFJFUV9TVEFURV9TRUNVUkUpCisJCQlyZXEtPnJlcV9yZXN1bHRbMF0gPSB2ZGVjX3NlY3VyZShod190b192ZGVjKHBiaSkpOworCQllbHNlCisJCQlyZXEtPnJlcV9yZXN1bHRbMF0gPSAweGZmZmZmZmZmOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIGluY192Zl9yZWYoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLCBpbnQgaW5kZXgpCit7CisJc3RydWN0IFZQOV9Db21tb25fcyAqY20gPSAmcGJpLT5jb21tb247CisKKwljbS0+YnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnNbaW5kZXhdLmJ1Zi52Zl9yZWYrKzsKKworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19CVUZNR1JfTU9SRSkKKwkJcHJfaW5mbygiJXMgaW5kZXggPSAlZCBuZXcgdmZfcmVmID0gJWRcclxuIiwKKwkJCV9fZnVuY19fLCBpbmRleCwKKwkJCWNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmc1tpbmRleF0uYnVmLnZmX3JlZik7Cit9CisKK3N0YXRpYyBpbnQgZnJhbWVfZHVyYXRpb25fYWRhcHQoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLCBzdHJ1Y3QgdmZyYW1lX3MgKnZmLCB1MzIgdmFsaWQpCit7CisJdTMyIG9sZF9kdXJhdGlvbiwgcHRzX2R1cmF0aW9uID0gMDsKKwl1MzIgcHRzID0gdmYtPnB0czsKKworCWlmIChwYmktPmdldF9mcmFtZV9kdXIgPT0gdHJ1ZSkKKwkJcmV0dXJuIHRydWU7CisKKwlwYmktPmZyYW1lX2NudF93aW5kb3crKzsKKwlpZiAoIShwYmktPnZwOV9maXJzdF9wdHNfcmVhZHkgPT0gMSkpIHsKKwkJaWYgKHZhbGlkKSB7CisJCQlwYmktPnB0czEgPSBwdHM7CisJCQlwYmktPmZyYW1lX2NudF93aW5kb3cgPSAwOworCQkJcGJpLT5kdXJhdGlvbl9mcm9tX3B0c19kb25lID0gMDsKKwkJCXBiaS0+dnA5X2ZpcnN0X3B0c19yZWFkeSA9IDE7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9IGVsc2UgeworCQlpZiAocHRzIDwgcGJpLT5wdHMxKSB7CisJCQlpZiAocGJpLT5mcmFtZV9jbnRfd2luZG93ID4gRlJBTUVfQ05UX1dJTkRPV19TSVpFKSB7CisJCQkJcGJpLT5wdHMxID0gcHRzOworCQkJCXBiaS0+ZnJhbWVfY250X3dpbmRvdyA9IDA7CisJCQl9CisJCX0KKworCQlpZiAodmFsaWQgJiYgKHBiaS0+ZnJhbWVfY250X3dpbmRvdyA+IEZSQU1FX0NOVF9XSU5ET1dfU0laRSkgJiYKKwkJCShwdHMgPiBwYmktPnB0czEpICYmIChwYmktPmR1cmF0aW9uX2Zyb21fcHRzX2RvbmUgPT0gMCkpIHsKKwkJCQlvbGRfZHVyYXRpb24gPSBwYmktPmZyYW1lX2R1cjsKKwkJCQlwYmktPnB0czIgPSBwdHM7CisJCQkJcHRzX2R1cmF0aW9uID0gKCgocGJpLT5wdHMyIC0gcGJpLT5wdHMxKSAqIDE2KSAvCisJCQkJCShwYmktPmZyYW1lX2NudF93aW5kb3cgKiAxNSkpOworCisJCQlpZiAoY2xvc2VfdG8ocHRzX2R1cmF0aW9uLCBvbGRfZHVyYXRpb24sIDIwMDApKSB7CisJCQkJcGJpLT5mcmFtZV9kdXIgPSBwdHNfZHVyYXRpb247CisJCQkJaWYgKChkZWJ1ZyAmIFZQOV9ERUJVR19PVVRfUFRTKSAhPSAwKQorCQkJCQlwcl9pbmZvKCJ1c2UgY2FsYyBkdXJhdGlvbiAlZFxuIiwgcHRzX2R1cmF0aW9uKTsKKwkJCX0KKworCQkJaWYgKHBiaS0+ZHVyYXRpb25fZnJvbV9wdHNfZG9uZSA9PSAwKSB7CisJCQkJaWYgKGNsb3NlX3RvKHB0c19kdXJhdGlvbiwgb2xkX2R1cmF0aW9uLCBSQVRFX0NPUlJFQ1RJT05fVEhSRVNIT0xEKSkgeworCQkJCQlwYmktPmR1cmF0aW9uX2Zyb21fcHRzX2RvbmUgPSAxOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICghY2xvc2VfdG8ocHRzX2R1cmF0aW9uLAorCQkJCQkJIG9sZF9kdXJhdGlvbiwgMTAwMCkgJiYKKwkJCQkJCSFjbG9zZV90byhwdHNfZHVyYXRpb24sCisJCQkJCQlwYmktPmZyYW1lX2R1ciwgMTAwMCkgJiYKKwkJCQkJCWNsb3NlX3RvKHB0c19kdXJhdGlvbiwKKwkJCQkJCXBiaS0+bGFzdF9kdXJhdGlvbiwgMjAwKSkgeworCQkJCQkJLyogZnJhbWVfZHVyIG11c3QKKwkJCQkJCSAqICB3cm9uZyxyZWNvdmVyIGl0LgorCQkJCQkJICovCisJCQkJCQlwYmktPmZyYW1lX2R1ciA9IHB0c19kdXJhdGlvbjsKKwkJCQkJfQorCQkJCQlwYmktPnB0czEgPSBwYmktPnB0czI7CisJCQkJCXBiaS0+ZnJhbWVfY250X3dpbmRvdyA9IDA7CisJCQkJCXBiaS0+ZHVyYXRpb25fZnJvbV9wdHNfZG9uZSA9IDA7CisJCQkJfQorCQkJfQorCQkJcGJpLT5sYXN0X2R1cmF0aW9uID0gcHRzX2R1cmF0aW9uOworCQl9CisJfQorCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfdmZfbWVtaGFuZGxlKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwKKwlzdHJ1Y3QgdmZyYW1lX3MgKnZmLCBzdHJ1Y3QgUElDX0JVRkZFUl9DT05GSUdfcyAqcGljKQoreworCXZmLT5tZW1faGFuZGxlID0gTlVMTDsKKwl2Zi0+bWVtX2hlYWRfaGFuZGxlID0gTlVMTDsKKwl2Zi0+bWVtX2R3X2hhbmRsZSA9IE5VTEw7CisKKwkvKiBrZWVwZXIgbm90IG5lZWRlZCBmb3IgdjRsIHNvbHV0aW9uICovCisJaWYgKHBiaS0+aXNfdXNlZF92NGwpCisJCXJldHVybjsKKworCWlmICh2Zi0+dHlwZSAmIFZJRFRZUEVfU0NBVFRFUikgeworCQl2Zi0+bWVtX2hhbmRsZSA9CisJCQlkZWNvZGVyX21tdV9ib3hfZ2V0X21lbV9oYW5kbGUoCisJCQkJcGJpLT5tbXVfYm94LCBwaWMtPmluZGV4KTsKKwkJdmYtPm1lbV9oZWFkX2hhbmRsZSA9CisJCQlkZWNvZGVyX2JtbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCXBiaS0+Ym1tdV9ib3gsCisJCQkJSEVBREVSX0JVRkZFUl9JRFgocGljLT5CVUZfaW5kZXgpKTsKKwkJaWYgKHBiaS0+ZG91YmxlX3dyaXRlX21vZGUgPT0gMykKKwkJCXZmLT5tZW1fZHdfaGFuZGxlID0KKwkJCQlkZWNvZGVyX2JtbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCQlwYmktPmJtbXVfYm94LAorCQkJCQlWRl9CVUZGRVJfSURYKHBpYy0+QlVGX2luZGV4KSk7CisJCWVsc2UKKwkJCXZmLT5tZW1fZHdfaGFuZGxlID0gTlVMTDsKKwl9IGVsc2UgeworCQl2Zi0+bWVtX2hhbmRsZSA9CisJCQlkZWNvZGVyX2JtbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkJCXBiaS0+Ym1tdV9ib3gsIFZGX0JVRkZFUl9JRFgocGljLT5CVUZfaW5kZXgpKTsKKwkJdmYtPm1lbV9oZWFkX2hhbmRsZSA9IE5VTEw7CisJCXZmLT5tZW1fZHdfaGFuZGxlID0gTlVMTDsKKwkJLyp2Zi0+bWVtX2hlYWRfaGFuZGxlID0KKwkJICpkZWNvZGVyX2JtbXVfYm94X2dldF9tZW1faGFuZGxlKAorCQkgKmhldmMtPmJtbXVfYm94LCBWRl9CVUZGRVJfSURYKEJVRl9pbmRleCkpOworCQkgKi8KKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYmlfdXBkYXRlX2d2cyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJaWYgKHBiaS0+Z3ZzLT5mcmFtZV9oZWlnaHQgIT0gZnJhbWVfaGVpZ2h0KSB7CisJCXBiaS0+Z3ZzLT5mcmFtZV93aWR0aCA9IGZyYW1lX3dpZHRoOworCQlwYmktPmd2cy0+ZnJhbWVfaGVpZ2h0ID0gZnJhbWVfaGVpZ2h0OworCX0KKwlpZiAocGJpLT5ndnMtPmZyYW1lX2R1ciAhPSBwYmktPmZyYW1lX2R1cikgeworCQlwYmktPmd2cy0+ZnJhbWVfZHVyID0gcGJpLT5mcmFtZV9kdXI7CisJCWlmIChwYmktPmZyYW1lX2R1ciAhPSAwKQorCQkJcGJpLT5ndnMtPmZyYW1lX3JhdGUgPSAoKDk2MDAwICogMTAgLyBwYmktPmZyYW1lX2R1cikgJSAxMCkgPCA1ID8KKwkJCQkJOTYwMDAgLyBwYmktPmZyYW1lX2R1ciA6ICg5NjAwMCAvIHBiaS0+ZnJhbWVfZHVyICsxKTsKKwkJZWxzZQorCQkJcGJpLT5ndnMtPmZyYW1lX3JhdGUgPSAtMTsKKwl9CisJcGJpLT5ndnMtPnN0YXR1cyA9IHBiaS0+c3RhdCB8IHBiaS0+ZmF0YWxfZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgcHJlcGFyZV9kaXNwbGF5X2J1ZihzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksCisJCQkJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKnBpY19jb25maWcpCit7CisJc3RydWN0IHZmcmFtZV9zICp2ZiA9IE5VTEw7CisJc3RydWN0IHZkZWNfcyAqcHZkZWMgPSBod190b192ZGVjKHBiaSk7CisJaW50IHN0cmVhbV9vZmZzZXQgPSBwaWNfY29uZmlnLT5zdHJlYW1fb2Zmc2V0OworCXVuc2lnbmVkIHNob3J0IHNsaWNlX3R5cGUgPSBwaWNfY29uZmlnLT5zbGljZV90eXBlOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqIHY0bDJfY3R4ID0gcGJpLT52NGwyX2N0eDsKKwlzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqZmIgPSBOVUxMOworCXVsb25nIG52X29yZGVyID0gVklEVFlQRV9WSVVfTlYyMTsKKwl1MzIgcHRzX3ZhbGlkID0gMCwgcHRzX3VzNjRfdmFsaWQgPSAwOworCXUzMiBwdHNfc2F2ZTsKKwl1NjQgcHRzX3VzNjRfc2F2ZTsKKwl1MzIgZnJhbWVfc2l6ZSA9IDA7CisJaW50IGkgPSAwOworCisKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfQlVGTUdSKQorCQlwcl9pbmZvKCIlcyBpbmRleCA9ICVkXHJcbiIsIF9fZnVuY19fLCBwaWNfY29uZmlnLT5pbmRleCk7CisJaWYgKGtmaWZvX2dldCgmcGJpLT5uZXdmcmFtZV9xLCAmdmYpID09IDApIHsKKwkJcHJfaW5mbygiZmF0YWwgZXJyb3IsIG5vIGF2YWlsYWJsZSBidWZmZXIgc2xvdC4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHN3YXAgdXYgKi8KKwlpZiAocGJpLT5pc191c2VkX3Y0bCkgeworCQlpZiAoKHY0bDJfY3R4LT5jYXBfcGl4X2ZtdCA9PSBWNEwyX1BJWF9GTVRfTlYxMikgfHwKKwkJCSh2NGwyX2N0eC0+Y2FwX3BpeF9mbXQgPT0gVjRMMl9QSVhfRk1UX05WMTJNKSkKKwkJCW52X29yZGVyID0gVklEVFlQRV9WSVVfTlYxMjsKKwl9CisKKwlpZiAocGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGUpCisJCXNldF9jYW52YXMocGJpLCBwaWNfY29uZmlnKTsKKworCWRpc3BsYXlfZnJhbWVfY291bnRbcGJpLT5pbmRleF0rKzsKKwlpZiAodmYpIHsKKwkJaWYgKCFmb3JjZV9wdHNfdW5zdGFibGUpIHsKKwkJCWlmICgocGljX2NvbmZpZy0+cHRzID09IDApIHx8ICgocGljX2NvbmZpZy0+cHRzIDw9IHBiaS0+bGFzdF9wdHMpICYmCisJCQkJKHBpY19jb25maWctPnB0czY0IDw9IHBiaS0+bGFzdF9wdHNfdXM2NCkpKSB7CisJCQkJZm9yIChpID0gKEZSQU1FX0JVRkZFUlMgLSAxKTsgaSA+IDA7IGktLSkgeworCQkJCQlpZiAoKHBiaS0+bGFzdF9wdHMgPT0gcGJpLT5mcmFtZV9tb2RlX3B0c19zYXZlW2ldKSB8fAorCQkJCQkJKHBiaS0+bGFzdF9wdHNfdXM2NCA9PSBwYmktPmZyYW1lX21vZGVfcHRzNjRfc2F2ZVtpXSkpIHsKKwkJCQkJCXBpY19jb25maWctPnB0cyA9IHBiaS0+ZnJhbWVfbW9kZV9wdHNfc2F2ZVtpIC0gMV07CisJCQkJCQlwaWNfY29uZmlnLT5wdHM2NCA9IHBiaS0+ZnJhbWVfbW9kZV9wdHM2NF9zYXZlW2kgLSAxXTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCWlmICgoaSA9PSAwKSB8fCAocGljX2NvbmZpZy0+cHRzIDw9IHBiaS0+bGFzdF9wdHMpKSB7CisJCQkJCXZwOV9wcmludChwYmksIFZQOV9ERUJVR19PVVRfUFRTLAorCQkJCQkJIm5vIGZvdW5kIHB0cyAlZCwgc2V0IDAuICVkLCAlZFxuIiwKKwkJCQkJCWksIHBpY19jb25maWctPnB0cywgcGJpLT5sYXN0X3B0cyk7CisJCQkJCXBpY19jb25maWctPnB0cyA9IDA7CisJCQkJCXBpY19jb25maWctPnB0czY0ID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAocGJpLT5pc191c2VkX3Y0bCkgeworCQkJdmYtPnY0bF9tZW1faGFuZGxlCisJCQkJPSBwYmktPm1fQlVGW3BpY19jb25maWctPnY0bF9idWZfaW5kZXhdLnY0bF9yZWZfYnVmX2FkZHI7CisJCQlmYiA9IChzdHJ1Y3QgdmRlY192NGwyX2J1ZmZlciAqKXZmLT52NGxfbWVtX2hhbmRsZTsKKworCQkJaWYgKHBiaS0+bW11X2VuYWJsZSkgeworCQkJCXZmLT5tbV9ib3guYm1tdV9ib3gJPSBwYmktPmJtbXVfYm94OworCQkJCXZmLT5tbV9ib3guYm1tdV9pZHgJPSBIRUFERVJfQlVGRkVSX0lEWChwYmktPmJ1ZmZlcl93cmFwW3BpY19jb25maWctPnY0bF9idWZfaW5kZXhdKTsKKwkJCQl2Zi0+bW1fYm94Lm1tdV9ib3gJPSBwYmktPm1tdV9ib3g7CisJCQkJdmYtPm1tX2JveC5tbXVfaWR4CT0gcGJpLT5idWZmZXJfd3JhcFtwaWNfY29uZmlnLT5pbmRleF07CisJCQl9CisJCX0KKworCQlpZiAocGJpLT5lbmFibGVfZmVuY2UpIHsKKwkJCS8qIGZpbGwgZmVuY2UgaW5mb3JtYXRpb24uICovCisJCQlpZiAocGJpLT5mZW5jZV91c2FnZSA9PSBGRU5DRV9VU0VfRk9SX0RSSVZFUikKKwkJCQl2Zi0+ZmVuY2UJPSBwaWNfY29uZmlnLT5mZW5jZTsKKwkJfQorCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQlpZiAodmRlY19mcmFtZV9iYXNlZChwdmRlYykpIHsKKwkJCXZmLT5wdHMgPSBwaWNfY29uZmlnLT5wdHM7CisJCQl2Zi0+cHRzX3VzNjQgPSBwaWNfY29uZmlnLT5wdHM2NDsKKworCQkJaWYgKHBiaS0+aXNfdXNlZF92NGwgJiYgdjRsX2JpdHN0cmVhbV9pZF9lbmFibGUpCisJCQkJdmYtPnRpbWVzdGFtcCA9IHBpY19jb25maWctPnRpbWVzdGFtcDsKKwkJCWVsc2UKKwkJCQl2Zi0+dGltZXN0YW1wID0gcGljX2NvbmZpZy0+cHRzNjQ7CisKKwkJCWlmICh2Zi0+cHRzICE9IDAgfHwgdmYtPnB0c191czY0ICE9IDApIHsKKwkJCQlwdHNfdmFsaWQgPSAxOworCQkJCXB0c191czY0X3ZhbGlkID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJcHRzX3ZhbGlkID0gMDsKKwkJCQlwdHNfdXM2NF92YWxpZCA9IDA7CisJCQl9CisJCX0gZWxzZQorI2VuZGlmCisJCS8qIGlmIChwdHNfbG9va3VwX29mZnNldChQVFNfVFlQRV9WSURFTywKKwkJICogICBzdHJlYW1fb2Zmc2V0LCAmdmYtPnB0cywgMCkgIT0gMCkgeworCQkgKi8KKwkJaWYgKChwdmRlYy0+dmJ1Zi5ub19wYXJzZXIgPT0gMCkgfHwgKHB2ZGVjLT52YnVmLnVzZV9wdHNzZXJ2KSkgeworCQkJaWYgKHB0c19sb29rdXBfb2Zmc2V0X3VzNjQKKwkJCQkoUFRTX1RZUEVfVklERU8sIHN0cmVhbV9vZmZzZXQsICZ2Zi0+cHRzLAorCQkJCSZmcmFtZV9zaXplLCAwLAorCQkJCSZ2Zi0+cHRzX3VzNjQpICE9IDApIHsKKyNpZmRlZiBERUJVR19QVFMKKwkJCQlwYmktPnB0c19taXNzZWQrKzsKKyNlbmRpZgorCQkJCXZmLT5wdHMgPSAwOworCQkJCXZmLT5wdHNfdXM2NCA9IDA7CisJCQkJcHRzX3ZhbGlkID0gMDsKKwkJCQlwdHNfdXM2NF92YWxpZCA9IDA7CisJCQl9IGVsc2UgeworI2lmZGVmIERFQlVHX1BUUworCQkJCXBiaS0+cHRzX2hpdCsrOworI2VuZGlmCisJCQkJcHRzX3ZhbGlkID0gMTsKKwkJCQlwdHNfdXM2NF92YWxpZCA9IDE7CisJCQl9CisJCX0KKworCQlmaWxsX2ZyYW1lX2luZm8ocGJpLCBwaWNfY29uZmlnLCBmcmFtZV9zaXplLCB2Zi0+cHRzKTsKKworCQlwdHNfc2F2ZSA9IHZmLT5wdHM7CisJCXB0c191czY0X3NhdmUgPSB2Zi0+cHRzX3VzNjQ7CisJCWlmIChwYmktPmlzX3VzZWRfdjRsIHx8IHBiaS0+cHRzX3Vuc3RhYmxlKSB7CisJCQlmcmFtZV9kdXJhdGlvbl9hZGFwdChwYmksIHZmLCBwdHNfdmFsaWQpOworCQkJaWYgKHBiaS0+ZHVyYXRpb25fZnJvbV9wdHNfZG9uZSkgeworCQkJCXBiaS0+cHRzX21vZGUgPSBQVFNfTk9ORV9SRUZfVVNFX0RVUkFUSU9OOworCQkJfSBlbHNlIHsKKwkJCQlpZiAocHRzX3ZhbGlkIHx8IHB0c191czY0X3ZhbGlkKQorCQkJCQlwYmktPnB0c19tb2RlID0gUFRTX05PUk1BTDsKKwkJCX0KKwkJfQorCisJCWlmICgocGJpLT5wdHNfbW9kZSA9PSBQVFNfTk9STUFMKSAmJiAodmYtPnB0cyAhPSAwKQorCQkJJiYgcGJpLT5nZXRfZnJhbWVfZHVyKSB7CisJCQlpbnQgcHRzX2RpZmYgPSAoaW50KXZmLT5wdHMgLSBwYmktPmxhc3RfbG9va3VwX3B0czsKKworCQkJaWYgKHB0c19kaWZmIDwgMCkgeworCQkJCXBiaS0+cHRzX21vZGVfc3dpdGNoaW5nX2NvdW50Kys7CisJCQkJcGJpLT5wdHNfbW9kZV9yZWNvdmVyeV9jb3VudCA9IDA7CisKKwkJCQlpZiAocGJpLT5wdHNfbW9kZV9zd2l0Y2hpbmdfY291bnQgPj0KKwkJCQkJUFRTX01PREVfU1dJVENISU5HX1RIUkVTSE9MRCkgeworCQkJCQlwYmktPnB0c19tb2RlID0KKwkJCQkJCVBUU19OT05FX1JFRl9VU0VfRFVSQVRJT047CisJCQkJCXByX2luZm8KKwkJCQkJKCJIRVZDOiBzd2l0Y2ggdG8gbl9kIG1vZGUuXG4iKTsKKwkJCQl9CisKKwkJCX0gZWxzZSB7CisJCQkJaW50IHAgPSBQVFNfTU9ERV9TV0lUQ0hJTkdfUkVDT1ZFUllfVEhSRUFTSE9MRDsKKworCQkJCXBiaS0+cHRzX21vZGVfcmVjb3ZlcnlfY291bnQrKzsKKwkJCQlpZiAocGJpLT5wdHNfbW9kZV9yZWNvdmVyeV9jb3VudCA+IHApIHsKKwkJCQkJcGJpLT5wdHNfbW9kZV9zd2l0Y2hpbmdfY291bnQgPSAwOworCQkJCQlwYmktPnB0c19tb2RlX3JlY292ZXJ5X2NvdW50ID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAodmYtPnB0cyAhPSAwKQorCQkJcGJpLT5sYXN0X2xvb2t1cF9wdHMgPSB2Zi0+cHRzOworCisJCWlmICgocGJpLT5wdHNfbW9kZSA9PSBQVFNfTk9ORV9SRUZfVVNFX0RVUkFUSU9OKQorCQkJJiYgKHNsaWNlX3R5cGUgIT0gS0VZX0ZSQU1FKSkKKwkJCXZmLT5wdHMgPSBwYmktPmxhc3RfcHRzICsgRFVSMlBUUyhwYmktPmZyYW1lX2R1cik7CisJCXBiaS0+bGFzdF9wdHMgPSB2Zi0+cHRzOworCisJCWlmICh2Zi0+cHRzX3VzNjQgIT0gMCkKKwkJCXBiaS0+bGFzdF9sb29rdXBfcHRzX3VzNjQgPSB2Zi0+cHRzX3VzNjQ7CisKKwkJaWYgKChwYmktPnB0c19tb2RlID09IFBUU19OT05FX1JFRl9VU0VfRFVSQVRJT04pCisJCQkmJiAoc2xpY2VfdHlwZSAhPSBLRVlfRlJBTUUpKSB7CisJCQl2Zi0+cHRzX3VzNjQgPQorCQkJCXBiaS0+bGFzdF9wdHNfdXM2NCArCisJCQkJKERVUjJQVFMocGJpLT5mcmFtZV9kdXIpICogMTAwIC8gOSk7CisJCX0KKwkJcGJpLT5sYXN0X3B0c191czY0ID0gdmYtPnB0c191czY0OworCisJCWlmIChwYmktPnB0c19tb2RlID09IFBUU19OT05FX1JFRl9VU0VfRFVSQVRJT04pIHsKKwkJCXZmLT5kaXNwX3B0cyA9IHZmLT5wdHM7CisJCQl2Zi0+ZGlzcF9wdHNfdXM2NCA9IHZmLT5wdHNfdXM2NDsKKwkJCXZmLT5wdHMgPSBwdHNfc2F2ZTsKKwkJCXZmLT5wdHNfdXM2NCA9IHB0c191czY0X3NhdmU7CisJCX0gZWxzZSB7CisJCQl2Zi0+ZGlzcF9wdHMgPSAwOworCQkJdmYtPmRpc3BfcHRzX3VzNjQgPSAwOworCQl9CisKKwkJdmYtPmluZGV4ID0gMHhmZjAwIHwgcGljX2NvbmZpZy0+djRsX2J1Zl9pbmRleDsKKworCQlpZiAocGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDEwKSB7CisJCQkvKiBkb3VibGUgd3JpdGUgb25seSAqLworCQkJdmYtPmNvbXBCb2R5QWRkciA9IDA7CisJCQl2Zi0+Y29tcEhlYWRBZGRyID0gMDsKKwkJfSBlbHNlIHsKKwkJCWlmIChwYmktPm1tdV9lbmFibGUpIHsKKwkJCQl2Zi0+Y29tcEJvZHlBZGRyID0gMDsKKwkJCQl2Zi0+Y29tcEhlYWRBZGRyID0gcGljX2NvbmZpZy0+aGVhZGVyX2FkcjsKKwkJCX0gZWxzZSB7CisJCQkJLyp2Zi0+Y29tcEJvZHlBZGRyID0gcGljX2NvbmZpZy0+bWNfeV9hZHI7CisJCQkJICp2Zi0+Y29tcEhlYWRBZGRyID0gcGljX2NvbmZpZy0+bWNfeV9hZHIgKworCQkJCSAqcGljX2NvbmZpZy0+Y29tcF9ib2R5X3NpemU7ICovCisJCQkJLypoZWFkIGFkciovCisJCQl9CisJCQl2Zi0+Y2FudmFzMEFkZHIgPSB2Zi0+Y2FudmFzMUFkZHIgPSAwOworCQl9CisJCWlmIChwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSkgeworCQkJdmYtPnR5cGUgPSBWSURUWVBFX1BST0dSRVNTSVZFIHwKKwkJCQlWSURUWVBFX1ZJVV9GSUVMRDsKKwkJCXZmLT50eXBlIHw9IG52X29yZGVyOworCQkJaWYgKChwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSA9PSAzKSAmJgorCQkJCSghSVNfOEtfU0laRShwaWNfY29uZmlnLT55X2Nyb3Bfd2lkdGgsCisJCQkJcGljX2NvbmZpZy0+eV9jcm9wX2hlaWdodCkpKSB7CisJCQkJdmYtPnR5cGUgfD0gVklEVFlQRV9DT01QUkVTUzsKKwkJCQlpZiAocGJpLT5tbXVfZW5hYmxlKQorCQkJCQl2Zi0+dHlwZSB8PSBWSURUWVBFX1NDQVRURVI7CisJCQl9CisJCQlpZiAocGJpLT5pc191c2VkX3Y0bCAmJiBwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSAhPSAxNiAmJgorCQkJCSghSVNfOEtfU0laRShwaWNfY29uZmlnLT55X2Nyb3Bfd2lkdGgsCisJCQkJcGljX2NvbmZpZy0+eV9jcm9wX2hlaWdodCkpKQorCQkJCXZmLT50eXBlIHw9IFZJRFRZUEVfQ09NUFJFU1MgfCBWSURUWVBFX1NDQVRURVI7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQkJaWYgKHBiaS0+bV9pbnNfZmxhZykgeworCQkJCXZmLT5jYW52YXMwQWRkciA9IHZmLT5jYW52YXMxQWRkciA9IC0xOworCQkJCXZmLT5wbGFuZV9udW0gPSAyOworCQkJCXZmLT5jYW52YXMwX2NvbmZpZ1swXSA9CisJCQkJCXBpY19jb25maWctPmNhbnZhc19jb25maWdbMF07CisJCQkJdmYtPmNhbnZhczBfY29uZmlnWzFdID0KKwkJCQkJcGljX2NvbmZpZy0+Y2FudmFzX2NvbmZpZ1sxXTsKKwkJCQl2Zi0+Y2FudmFzMV9jb25maWdbMF0gPQorCQkJCQlwaWNfY29uZmlnLT5jYW52YXNfY29uZmlnWzBdOworCQkJCXZmLT5jYW52YXMxX2NvbmZpZ1sxXSA9CisJCQkJCXBpY19jb25maWctPmNhbnZhc19jb25maWdbMV07CisKKwkJCX0gZWxzZQorI2VuZGlmCisJCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0KKwkJCQkJc3BlYzJjYW52YXMocGljX2NvbmZpZyk7CisJCX0gZWxzZSB7CisJCQl2Zi0+Y2FudmFzMEFkZHIgPSB2Zi0+Y2FudmFzMUFkZHIgPSAwOworCQkJdmYtPnR5cGUgPSBWSURUWVBFX0NPTVBSRVNTIHwgVklEVFlQRV9WSVVfRklFTEQ7CisJCQlpZiAocGJpLT5tbXVfZW5hYmxlKQorCQkJCXZmLT50eXBlIHw9IFZJRFRZUEVfU0NBVFRFUjsKKwkJfQorCisJCXN3aXRjaCAocGljX2NvbmZpZy0+Yml0X2RlcHRoKSB7CisJCWNhc2UgVlBYX0JJVFNfODoKKwkJCXZmLT5iaXRkZXB0aCA9IEJJVERFUFRIX1k4IHwKKwkJCQlCSVRERVBUSF9VOCB8IEJJVERFUFRIX1Y4OworCQkJYnJlYWs7CisJCWNhc2UgVlBYX0JJVFNfMTA6CisJCWNhc2UgVlBYX0JJVFNfMTI6CisJCQl2Zi0+Yml0ZGVwdGggPSBCSVRERVBUSF9ZMTAgfAorCQkJCUJJVERFUFRIX1UxMCB8IEJJVERFUFRIX1YxMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdmYtPmJpdGRlcHRoID0gQklUREVQVEhfWTEwIHwKKwkJCQlCSVRERVBUSF9VMTAgfCBCSVRERVBUSF9WMTA7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKHZmLT50eXBlICYgVklEVFlQRV9DT01QUkVTUykgPT0gMCkKKwkJCXZmLT5iaXRkZXB0aCA9CisJCQkJQklUREVQVEhfWTggfCBCSVRERVBUSF9VOCB8IEJJVERFUFRIX1Y4OworCQlpZiAocGljX2NvbmZpZy0+Yml0X2RlcHRoID09IFZQWF9CSVRTXzgpCisJCQl2Zi0+Yml0ZGVwdGggfD0gQklUREVQVEhfU0FWSU5HX01PREU7CisKKwkJLyogaWYoKHZmLT53aWR0aCE9cGljX2NvbmZpZy0+d2lkdGgpfAorCQkgKgkodmYtPmhlaWdodCE9cGljX2NvbmZpZy0+aGVpZ2h0KSkKKwkJICovCisJCS8qIHByX2luZm8oImFhYTogJWQvJWQsICVkLyVkXG4iLAorCQkgICB2Zi0+d2lkdGgsdmYtPmhlaWdodCwgcGljX2NvbmZpZy0+d2lkdGgsCisJCQlwaWNfY29uZmlnLT5oZWlnaHQpOyAqLworCQl2Zi0+d2lkdGggPSBwaWNfY29uZmlnLT55X2Nyb3Bfd2lkdGggLworCQkJZ2V0X2RvdWJsZV93cml0ZV9yYXRpbygKKwkJCQlwaWNfY29uZmlnLT5kb3VibGVfd3JpdGVfbW9kZSk7CisJCXZmLT5oZWlnaHQgPSBwaWNfY29uZmlnLT55X2Nyb3BfaGVpZ2h0IC8KKwkJCWdldF9kb3VibGVfd3JpdGVfcmF0aW8oCisJCQkJcGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGUpOworCQlpZiAoZm9yY2Vfd19oICE9IDApIHsKKwkJCXZmLT53aWR0aCA9IChmb3JjZV93X2ggPj4gMTYpICYgMHhmZmZmOworCQkJdmYtPmhlaWdodCA9IGZvcmNlX3dfaCAmIDB4ZmZmZjsKKwkJfQorCQl2Zi0+Y29tcFdpZHRoID0gcGljX2NvbmZpZy0+eV9jcm9wX3dpZHRoOworCQl2Zi0+Y29tcEhlaWdodCA9IHBpY19jb25maWctPnlfY3JvcF9oZWlnaHQ7CisJCXNldF9mcmFtZV9pbmZvKHBiaSwgdmYpOworCQlpZiAoZm9yY2VfZnBzICYgMHgxMDApIHsKKwkJCXUzMiByYXRlID0gZm9yY2VfZnBzICYgMHhmZjsKKworCQkJaWYgKHJhdGUpCisJCQkJdmYtPmR1cmF0aW9uID0gOTYwMDAvcmF0ZTsKKwkJCWVsc2UKKwkJCQl2Zi0+ZHVyYXRpb24gPSAwOworCQl9CisJCXVwZGF0ZV92Zl9tZW1oYW5kbGUocGJpLCB2ZiwgcGljX2NvbmZpZyk7CisJCWlmICh2ZGVjX3N0cmVhbV9iYXNlZChwdmRlYykgJiYgKCFwdmRlYy0+dmJ1Zi51c2VfcHRzc2VydikpIHsKKwkJCXZmLT5wdHNfdXM2NCA9IHN0cmVhbV9vZmZzZXQ7CisJCQl2Zi0+cHRzID0gMDsKKwkJfQorCQlpZiAoKGRlYnVnICYgVlA5X0RFQlVHX09VVF9QVFMpICE9IDApIHsKKwkJCXByX2luZm8KKwkJCSgiVlA5IGRlYyBvdXQgcHRzOiBwdHNfbW9kZT0lZCxkdXI9JWQscHRzKCVkLCVsbGQsJWxsZCkoJWQsJWxsZClcbiIsCisJCQlwYmktPnB0c19tb2RlLCBwYmktPmZyYW1lX2R1ciwgdmYtPnB0cywKKwkJCXZmLT5wdHNfdXM2NCwgdmYtPnRpbWVzdGFtcCwgcHRzX3NhdmUsCisJCQlwdHNfdXM2NF9zYXZlKTsKKwkJfQorCQlpZiAoIShwaWNfY29uZmlnLT55X2Nyb3Bfd2lkdGggPT0gMTk2CisJCSYmIHBpY19jb25maWctPnlfY3JvcF9oZWlnaHQgPT0gMTk2CisJCSYmIChkZWJ1ZyAmIFZQOV9ERUJVR19OT19UUklHR0VSX0ZSQU1FKSA9PSAwCisJCSYmIChnZXRfY3B1X21ham9yX2lkKCkgPCBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVFhMWCkpKSB7CisJCQlzdHJ1Y3QgdmRlY19pbmZvIHRtcDR4OworCisJCQlpbmNfdmZfcmVmKHBiaSwgcGljX2NvbmZpZy0+djRsX2J1Zl9pbmRleCk7CisKKwkJCXZkZWNfdmZyYW1lX3JlYWR5KHB2ZGVjLCB2Zik7CisJCQlpZiAocGljX2NvbmZpZy0+ZG91YmxlX3dyaXRlX21vZGUgJiYKKwkJCQkocGljX2NvbmZpZy0+djRsX2J1Zl9pbmRleCAhPSBwaWNfY29uZmlnLT5CVUZfaW5kZXgpKSB7CisJCQkJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKmRzdF9waWMgPQorCQkJCQkmcGJpLT5jb21tb24uYnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnNbcGljX2NvbmZpZy0+djRsX2J1Zl9pbmRleF0uYnVmOworCQkJCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpzcmNfcGljID0KKwkJCQkJJnBiaS0+Y29tbW9uLmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzW3BpY19jb25maWctPkJVRl9pbmRleF0uYnVmOworCQkJCXN0cnVjdCB2ZGVjX2dlMmRfaW5mbyBnZTJkX2luZm87CisKKwkJCQl2cDlfcHJpbnQocGJpLCBQUklOVF9GTEFHX1Y0TF9ERVRBSUwsCisJCQkJCSJnZTJkIGNvcHkgc3RhcnQgdjRsX2J1Zl9pbmRleDolZCByZXBlYXRfYnVmZl9pbmRleDolZFxuIiwKKwkJCQkJcGljX2NvbmZpZy0+djRsX2J1Zl9pbmRleCwKKwkJCQkJcGljX2NvbmZpZy0+QlVGX2luZGV4KTsKKwkJCQlnZTJkX2luZm8uZHN0X3ZmID0gdmY7CisJCQkJZ2UyZF9pbmZvLnNyY19jYW52YXMwQWRkciA9IGdlMmRfaW5mby5zcmNfY2FudmFzMUFkZHIgPSAwOworCQkJCWlmIChkc3RfcGljLT5kb3VibGVfd3JpdGVfbW9kZSkgeworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwkJCQkJaWYgKHBiaS0+bV9pbnNfZmxhZykgeworCQkJCQkJdmYtPmNhbnZhczBBZGRyID0gdmYtPmNhbnZhczFBZGRyID0gLTE7CisJCQkJCQlnZTJkX2luZm8uc3JjX2NhbnZhczBBZGRyID0gZ2UyZF9pbmZvLnNyY19jYW52YXMxQWRkciA9IC0xOworCQkJCQkJdmYtPnBsYW5lX251bSA9IDI7CisJCQkJCQl2Zi0+Y2FudmFzMF9jb25maWdbMF0gPQorCQkJCQkJCWRzdF9waWMtPmNhbnZhc19jb25maWdbMF07CisJCQkJCQl2Zi0+Y2FudmFzMF9jb25maWdbMV0gPQorCQkJCQkJCWRzdF9waWMtPmNhbnZhc19jb25maWdbMV07CisJCQkJCQl2Zi0+Y2FudmFzMV9jb25maWdbMF0gPQorCQkJCQkJCWRzdF9waWMtPmNhbnZhc19jb25maWdbMF07CisJCQkJCQl2Zi0+Y2FudmFzMV9jb25maWdbMV0gPQorCQkJCQkJCWRzdF9waWMtPmNhbnZhc19jb25maWdbMV07CisJCQkJCQlnZTJkX2luZm8uc3JjX2NhbnZhczBfY29uZmlnWzBdID0KKwkJCQkJCQlzcmNfcGljLT5jYW52YXNfY29uZmlnWzBdOworCQkJCQkJZ2UyZF9pbmZvLnNyY19jYW52YXMwX2NvbmZpZ1sxXSA9CisJCQkJCQkJc3JjX3BpYy0+Y2FudmFzX2NvbmZpZ1sxXTsKKwkJCQkJCWdlMmRfaW5mby5zcmNfY2FudmFzMV9jb25maWdbMF0gPQorCQkJCQkJCXNyY19waWMtPmNhbnZhc19jb25maWdbMF07CisJCQkJCQlnZTJkX2luZm8uc3JjX2NhbnZhczFfY29uZmlnWzFdID0KKwkJCQkJCQlzcmNfcGljLT5jYW52YXNfY29uZmlnWzFdOworCQkJCQl9IGVsc2UKKyNlbmRpZgorCQkJCQl7CisJCQkJCQl2Zi0+Y2FudmFzMEFkZHIgPSB2Zi0+Y2FudmFzMUFkZHIgPQorCQkJCQkJCXNwZWMyY2FudmFzKGRzdF9waWMpOworCQkJCQkJZ2UyZF9pbmZvLnNyY19jYW52YXMwQWRkciA9IGdlMmRfaW5mby5zcmNfY2FudmFzMUFkZHIgPQorCQkJCQkJCXNwZWMyY2FudmFzKHNyY19waWMpOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKCFwYmktPmdlMmQpIHsKKwkJCQkJaW50IG1vZGUgPSBudl9vcmRlciA9PSBWSURUWVBFX1ZJVV9OVjIxID8gR0UyRF9NT0RFX0NPTlZFUlRfTlYyMSA6IEdFMkRfTU9ERV9DT05WRVJUX05WMTI7CisJCQkJCW1vZGUgfD0gR0UyRF9NT0RFX0NPTlZFUlRfTEU7CisJCQkJCXZkZWNfZ2UyZF9pbml0KCZwYmktPmdlMmQsIG1vZGUpOworCQkJCX0KKwkJCQl2ZGVjX2dlMmRfY29weV9kYXRhKHBiaS0+Z2UyZCwgJmdlMmRfaW5mbyk7CisJCQkJdnA5X3ByaW50KHBiaSwgUFJJTlRfRkxBR19WNExfREVUQUlMLCAiZ2UyZCBjb3B5IGRvbmVcbiIpOworCQkJfQorCQkJZGVjb2Rlcl9kb19mcmFtZV9jaGVjayhwdmRlYywgdmYpOworCQkJa2ZpZm9fcHV0KCZwYmktPmRpc3BsYXlfcSwgKGNvbnN0IHN0cnVjdCB2ZnJhbWVfcyAqKXZmKTsKKwkJCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UucHRzX25hbWUsIHZmLT50aW1lc3RhbXApOworCQkJQVRSQUNFX0NPVU5URVIocGJpLT50cmFjZS5uZXdfcV9uYW1lLCBrZmlmb19sZW4oJnBiaS0+bmV3ZnJhbWVfcSkpOworCQkJQVRSQUNFX0NPVU5URVIocGJpLT50cmFjZS5kaXNwX3FfbmFtZSwga2ZpZm9fbGVuKCZwYmktPmRpc3BsYXlfcSkpOworCQkJYXRvbWljX2FkZCgxLCAmcGJpLT52Zl9wcmVfY291bnQpOworCQkJcGJpX3VwZGF0ZV9ndnMocGJpKTsKKwkJCS8qY291bnQgaW5mbyovCisJCQl2ZGVjX2NvdW50X2luZm8ocGJpLT5ndnMsIDAsIHN0cmVhbV9vZmZzZXQpOworCQkJaWYgKHN0cmVhbV9vZmZzZXQpIHsKKwkJCQlpZiAoc2xpY2VfdHlwZSA9PSBLRVlfRlJBTUUpIHsKKwkJCQkJcGJpLT5ndnMtPmlfZGVjb2RlZF9mcmFtZXMrKzsKKwkJCQl9IGVsc2UgaWYgKHNsaWNlX3R5cGUgPT0gSU5URVJfRlJBTUUpIHsKKwkJCQkJcGJpLT5ndnMtPnBfZGVjb2RlZF9mcmFtZXMrKzsKKwkJCQl9IGVsc2UgaWYgKHNsaWNlX3R5cGUgPT0gRlJBTUVfVFlQRVMpIHsKKwkJCQkJcGJpLT5ndnMtPmJfZGVjb2RlZF9mcmFtZXMrKzsKKwkJCQl9CisJCQl9CisJCQltZW1jcHkoJnRtcDR4LCBwYmktPmd2cywgc2l6ZW9mKHN0cnVjdCB2ZGVjX2luZm8pKTsKKwkJCXRtcDR4LmJpdF9kZXB0aF9sdW1hID0gcGJpLT52cDlfcGFyYW0ucC5iaXRfZGVwdGg7CisJCQl0bXA0eC5iaXRfZGVwdGhfY2hyb21hID0gcGJpLT52cDlfcGFyYW0ucC5iaXRfZGVwdGg7CisJCQl0bXA0eC5kb3VibGVfd3JpdGVfbW9kZSA9IHBpY19jb25maWctPmRvdWJsZV93cml0ZV9tb2RlOworCQkJdmRlY19maWxsX3ZkZWNfZnJhbWUocHZkZWMsICZwYmktPnZmcmFtZV9xb3MsICZ0bXA0eCwKKwkJCQl2ZiwgcGljX2NvbmZpZy0+aHdfZGVjb2RlX3RpbWUpOworCQkJcHZkZWMtPnZkZWNfZnBzX2RldGVjKHB2ZGVjLT5pZCk7CisJCQlpZiAod2l0aG91dF9kaXNwbGF5X21vZGUgPT0gMCkgeworCQkJCWlmIChwYmktPmlzX3VzZWRfdjRsKSB7CisJCQkJCWlmICh2NGwyX2N0eC0+aXNfc3RyZWFtX29mZikgeworCQkJCQkJdnZwOV92Zl9wdXQodnZwOV92Zl9nZXQocGJpKSwgcGJpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCUFUUkFDRV9DT1VOVEVSKCJWQ19PVVRfREVDLXN1Ym1pdCIsIGZiLT5idWZfaWR4KTsKKwkJCQkJCWZiLT50YXNrLT5zdWJtaXQoZmItPnRhc2ssIFRBU0tfVFlQRV9ERUMpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJdmZfbm90aWZ5X3JlY2VpdmVyKHBiaS0+cHJvdmlkZXJfbmFtZSwKKwkJCQkJCVZGUkFNRV9FVkVOVF9QUk9WSURFUl9WRlJBTUVfUkVBRFksIE5VTEwpOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCXZ2cDlfdmZfcHV0KHZ2cDlfdmZfZ2V0KHBiaSksIHBiaSk7CisJCX0gZWxzZSB7CisJCQlwYmktPnN0YXQgfD0gVlA5X1RSSUdHRVJfRlJBTUVfRE9ORTsKKwkJCWhldmNfc291cmNlX2NoYW5nZWQoVkZPUk1BVF9WUDksIDE5NiwgMTk2LCAzMCk7CisJCQlwcl9kZWJ1ZygiWyVzICVkXSBkcm9wIHRyaWdnZXIgZnJhbWUgd2lkdGggJWQgaGVpZ2h0ICVkICBzdGF0ZSAweCV4XG4iLAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgdmYtPndpZHRoLAorCQkJCXZmLT5oZWlnaHQsIHBiaS0+c3RhdCk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2wgaXNfYXZhbGlhYmxlX2J1ZmZlcihzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpOworCitzdGF0aWMgaW50IG5vdGlmeV92NGxfZW9zKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IFZQOURlY29kZXJfcyAqaHcgPSAoc3RydWN0IFZQOURlY29kZXJfcyAqKXZkZWMtPnByaXZhdGU7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPSAoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKGh3LT52NGwyX2N0eCk7CisJc3RydWN0IHZmcmFtZV9zICp2ZiA9ICZody0+dmZyYW1lX2R1bW15OworCXN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICpmYiA9IE5VTEw7CisJaW50IGluZGV4ID0gSU5WQUxJRF9JRFg7CisJdWxvbmcgZXhwaXJlczsKKworCWlmIChody0+ZW9zKSB7CisJCWV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMDAwKTsKKwkJd2hpbGUgKCFpc19hdmFsaWFibGVfYnVmZmVyKGh3KSkgeworCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZXhwaXJlcykpIHsKKwkJCQlwcl9lcnIoIlslZF0gVlA5IGlzbid0IGVub3VnaCBidWZmIGZvciBub3RpZnkgZW9zLlxuIiwgY3R4LT5pZCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKworCQlpbmRleCA9IHY0bF9nZXRfZnJlZV9mYihodyk7CisJCWlmIChJTlZBTElEX0lEWCA9PSBpbmRleCkgeworCQkJcHJfZXJyKCJbJWRdIFZQOSBFT1MgZ2V0IGZyZWUgYnVmZiBmYWlsLlxuIiwgY3R4LT5pZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWZiID0gKHN0cnVjdCB2ZGVjX3Y0bDJfYnVmZmVyICopCisJCQlody0+bV9CVUZbaW5kZXhdLnY0bF9yZWZfYnVmX2FkZHI7CisKKwkJdmYtPnR5cGUJCXw9IFZJRFRZUEVfVjRMX0VPUzsKKwkJdmYtPnRpbWVzdGFtcAkJPSBVTE9OR19NQVg7CisJCXZmLT5mbGFnCQk9IFZGUkFNRV9GTEFHX0VNUFRZX0ZSQU1FX1Y0TDsKKwkJdmYtPnY0bF9tZW1faGFuZGxlCT0gKHVsb25nKWZiOworCisJCXZkZWNfdmZyYW1lX3JlYWR5KHZkZWMsIHZmKTsKKwkJa2ZpZm9fcHV0KCZody0+ZGlzcGxheV9xLCAoY29uc3Qgc3RydWN0IHZmcmFtZV9zICopdmYpOworCisJCUFUUkFDRV9DT1VOVEVSKCJWQ19PVVRfREVDLXN1Ym1pdCIsIGZiLT5idWZfaWR4KTsKKwkJZmItPnRhc2stPnN1Ym1pdChmYi0+dGFzaywgVEFTS19UWVBFX0RFQyk7CisKKwkJcHJfaW5mbygiWyVkXSBWUDkgRU9TIG5vdGlmeS5cbiIsIGN0eC0+aWQpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnZXRfcnBtX3BhcmFtKHVuaW9uIHBhcmFtX3UgKnBhcmFtcykKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgZGF0YTMyOworCisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0JVRk1HUikKKwkJcHJfaW5mbygiZW50ZXIgJXNcclxuIiwgX19mdW5jX18pOworCWZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykgeworCQlkbyB7CisJCQlkYXRhMzIgPSBSRUFEX1ZSRUcoUlBNX0NNRF9SRUcpOworCQkJLypwcl9pbmZvKCIleFxuIiwgZGF0YTMyKTsqLworCQl9IHdoaWxlICgoZGF0YTMyICYgMHgxMDAwMCkgPT0gMCk7CisJCXBhcmFtcy0+bC5kYXRhW2ldID0gZGF0YTMyJjB4ZmZmZjsKKwkJLypwcl9pbmZvKCIleFxuIiwgZGF0YTMyKTsqLworCQlXUklURV9WUkVHKFJQTV9DTURfUkVHLCAwKTsKKwl9CisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0JVRk1HUikKKwkJcHJfaW5mbygibGVhdmUgJXNcclxuIiwgX19mdW5jX18pOworfQorc3RhdGljIHZvaWQgZGVidWdfYnVmZmVyX21ncl9tb3JlKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlpbnQgaTsKKworCWlmICghKGRlYnVnICYgVlA5X0RFQlVHX0JVRk1HUl9NT1JFKSkKKwkJcmV0dXJuOworCXByX2luZm8oInZwOV9wYXJhbTogKCVkKVxuIiwgcGJpLT5zbGljZV9pZHgpOworCWZvciAoaSA9IDA7IGkgPCAoUlBNX0VORC1SUE1fQkVHSU4pOyBpKyspIHsKKwkJcHJfaW5mbygiJTA0eCAiLCBwYmktPnZwOV9wYXJhbS5sLmRhdGFbaV0pOworCQlpZiAoKChpICsgMSkgJiAweGYpID09IDApCisJCQlwcl9pbmZvKCJcbiIpOworCX0KKwlwcl9pbmZvKCI9PT09PT09PT09PT09cGFyYW09PT09PT09PT09XHJcbiIpOworCXByX2luZm8oInByb2ZpbGUgICAgICAgICAgICAgICAleFxyXG4iLCBwYmktPnZwOV9wYXJhbS5wLnByb2ZpbGUpOworCXByX2luZm8oInNob3dfZXhpc3RpbmdfZnJhbWUgICAleFxyXG4iLAorCXBiaS0+dnA5X3BhcmFtLnAuc2hvd19leGlzdGluZ19mcmFtZSk7CisJcHJfaW5mbygiZnJhbWVfdG9fc2hvd19pZHggICAgICV4XHJcbiIsCisJcGJpLT52cDlfcGFyYW0ucC5mcmFtZV90b19zaG93X2lkeCk7CisJcHJfaW5mbygiZnJhbWVfdHlwZSAgICAgICAgICAgICV4XHJcbiIsIHBiaS0+dnA5X3BhcmFtLnAuZnJhbWVfdHlwZSk7CisJcHJfaW5mbygic2hvd19mcmFtZSAgICAgICAgICAgICV4XHJcbiIsIHBiaS0+dnA5X3BhcmFtLnAuc2hvd19mcmFtZSk7CisJcHJfaW5mbygiZS5yLnIuby5yX3Jlc2lsaWVudF9tb2RlICAleFxyXG4iLAorCXBiaS0+dnA5X3BhcmFtLnAuZXJyb3JfcmVzaWxpZW50X21vZGUpOworCXByX2luZm8oImludHJhX29ubHkgICAgICAgICAgICAleFxyXG4iLCBwYmktPnZwOV9wYXJhbS5wLmludHJhX29ubHkpOworCXByX2luZm8oImRpc3BsYXlfc2l6ZV9wcmVzZW50ICAleFxyXG4iLAorCXBiaS0+dnA5X3BhcmFtLnAuZGlzcGxheV9zaXplX3ByZXNlbnQpOworCXByX2luZm8oInJlc2V0X2ZyYW1lX2NvbnRleHQgICAleFxyXG4iLAorCXBiaS0+dnA5X3BhcmFtLnAucmVzZXRfZnJhbWVfY29udGV4dCk7CisJcHJfaW5mbygicmVmcmVzaF9mcmFtZV9mbGFncyAgICV4XHJcbiIsCisJcGJpLT52cDlfcGFyYW0ucC5yZWZyZXNoX2ZyYW1lX2ZsYWdzKTsKKwlwcl9pbmZvKCJiaXRfZGVwdGggICAgICAgICAgICAgJXhcclxuIiwgcGJpLT52cDlfcGFyYW0ucC5iaXRfZGVwdGgpOworCXByX2luZm8oIndpZHRoICAgICAgICAgICAgICAgICAleFxyXG4iLCBwYmktPnZwOV9wYXJhbS5wLndpZHRoKTsKKwlwcl9pbmZvKCJoZWlnaHQgICAgICAgICAgICAgICAgJXhcclxuIiwgcGJpLT52cDlfcGFyYW0ucC5oZWlnaHQpOworCXByX2luZm8oImRpc3BsYXlfd2lkdGggICAgICAgICAleFxyXG4iLCBwYmktPnZwOV9wYXJhbS5wLmRpc3BsYXlfd2lkdGgpOworCXByX2luZm8oImRpc3BsYXlfaGVpZ2h0ICAgICAgICAleFxyXG4iLCBwYmktPnZwOV9wYXJhbS5wLmRpc3BsYXlfaGVpZ2h0KTsKKwlwcl9pbmZvKCJyZWZfaW5mbyAgICAgICAgICAgICAgJXhcclxuIiwgcGJpLT52cDlfcGFyYW0ucC5yZWZfaW5mbyk7CisJcHJfaW5mbygic2FtZV9mcmFtZV9zaXplICAgICAgICV4XHJcbiIsIHBiaS0+dnA5X3BhcmFtLnAuc2FtZV9mcmFtZV9zaXplKTsKKwlpZiAoIShkZWJ1ZyAmIFZQOV9ERUJVR19EQkdfTEZfUFJJTlQpKQorCQlyZXR1cm47CisJcHJfaW5mbygibW9kZV9yZWZfZGVsdGFfZW5hYmxlZDogMHgleFxyXG4iLAorCXBiaS0+dnA5X3BhcmFtLnAubW9kZV9yZWZfZGVsdGFfZW5hYmxlZCk7CisJcHJfaW5mbygic2hhcnBuZXNzX2xldmVsOiAweCV4XHJcbiIsCisJcGJpLT52cDlfcGFyYW0ucC5zaGFycG5lc3NfbGV2ZWwpOworCXByX2luZm8oInJlZl9kZWx0YXM6IDB4JXgsIDB4JXgsIDB4JXgsIDB4JXhcclxuIiwKKwlwYmktPnZwOV9wYXJhbS5wLnJlZl9kZWx0YXNbMF0sIHBiaS0+dnA5X3BhcmFtLnAucmVmX2RlbHRhc1sxXSwKKwlwYmktPnZwOV9wYXJhbS5wLnJlZl9kZWx0YXNbMl0sIHBiaS0+dnA5X3BhcmFtLnAucmVmX2RlbHRhc1szXSk7CisJcHJfaW5mbygibW9kZV9kZWx0YXM6IDB4JXgsIDB4JXhcclxuIiwgcGJpLT52cDlfcGFyYW0ucC5tb2RlX2RlbHRhc1swXSwKKwlwYmktPnZwOV9wYXJhbS5wLm1vZGVfZGVsdGFzWzFdKTsKKwlwcl9pbmZvKCJmaWx0ZXJfbGV2ZWw6IDB4JXhcclxuIiwgcGJpLT52cDlfcGFyYW0ucC5maWx0ZXJfbGV2ZWwpOworCXByX2luZm8oInNlZ19lbmFibGVkOiAweCV4XHJcbiIsIHBiaS0+dnA5X3BhcmFtLnAuc2VnX2VuYWJsZWQpOworCXByX2luZm8oInNlZ19hYnNfZGVsdGE6IDB4JXhcclxuIiwgcGJpLT52cDlfcGFyYW0ucC5zZWdfYWJzX2RlbHRhKTsKKwlwcl9pbmZvKCJzZWdfbGZfZmVhdHVyZV9lbmFibGVkOiAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXhcclxuIiwKKwkocGJpLT52cDlfcGFyYW0ucC5zZWdfbGZfaW5mb1swXT4+MTUgJiAxKSwKKwkocGJpLT52cDlfcGFyYW0ucC5zZWdfbGZfaW5mb1sxXT4+MTUgJiAxKSwKKwkocGJpLT52cDlfcGFyYW0ucC5zZWdfbGZfaW5mb1syXT4+MTUgJiAxKSwKKwkocGJpLT52cDlfcGFyYW0ucC5zZWdfbGZfaW5mb1szXT4+MTUgJiAxKSwKKwkocGJpLT52cDlfcGFyYW0ucC5zZWdfbGZfaW5mb1s0XT4+MTUgJiAxKSwKKwkocGJpLT52cDlfcGFyYW0ucC5zZWdfbGZfaW5mb1s1XT4+MTUgJiAxKSwKKwkocGJpLT52cDlfcGFyYW0ucC5zZWdfbGZfaW5mb1s2XT4+MTUgJiAxKSwKKwkocGJpLT52cDlfcGFyYW0ucC5zZWdfbGZfaW5mb1s3XT4+MTUgJiAxKSk7CisJcHJfaW5mbygic2VnX2xmX2ZlYXR1cmVfZGF0YTogMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4XHJcbiIsCisJKHBiaS0+dnA5X3BhcmFtLnAuc2VnX2xmX2luZm9bMF0gJiAweDEzZiksCisJKHBiaS0+dnA5X3BhcmFtLnAuc2VnX2xmX2luZm9bMV0gJiAweDEzZiksCisJKHBiaS0+dnA5X3BhcmFtLnAuc2VnX2xmX2luZm9bMl0gJiAweDEzZiksCisJKHBiaS0+dnA5X3BhcmFtLnAuc2VnX2xmX2luZm9bM10gJiAweDEzZiksCisJKHBiaS0+dnA5X3BhcmFtLnAuc2VnX2xmX2luZm9bNF0gJiAweDEzZiksCisJKHBiaS0+dnA5X3BhcmFtLnAuc2VnX2xmX2luZm9bNV0gJiAweDEzZiksCisJKHBiaS0+dnA5X3BhcmFtLnAuc2VnX2xmX2luZm9bNl0gJiAweDEzZiksCisJKHBiaS0+dnA5X3BhcmFtLnAuc2VnX2xmX2luZm9bN10gJiAweDEzZikpOworCit9CisKK3N0YXRpYyBpbnQgcmVjeWNsZV9tbXVfYnVmX3RhaWwoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLAorCQlib29sIGNoZWNrX2RtYSkKK3sKKwlzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjb25zdCBjbSA9ICZwYmktPmNvbW1vbjsKKworCWlmIChwYmktPnVzZWRfNGtfbnVtID09IC0xKSB7CisJCXBiaS0+dXNlZF80a19udW0gPQorCQkJUkVBRF9WUkVHKEhFVkNfU0FPX01NVV9TVEFUVVMpID4+IDE2OworCX0KKwl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfQlVGTUdSX01PUkUsCisJCSJwaWMgaW5kZXggJWQgcGFnZV9zdGFydCAlZFxuIiwKKwkJY20tPmN1cl9mYl9pZHhfbW11LCBwYmktPnVzZWRfNGtfbnVtKTsKKworCWlmIChjaGVja19kbWEpCisJCWhldmNfbW11X2RtYV9jaGVjayhod190b192ZGVjKHBiaSkpOworCisJaWYgKHBiaS0+aXNfdXNlZF92NGwpIHsKKwkJaW50IGluZGV4ID0gY20tPmN1cl9mYl9pZHhfbW11OworCQlzdHJ1Y3QgaW50ZXJuYWxfY29tcF9idWYgKmlidWYgPQorCQkJaW5kZXhfdG9faWNvbXBfYnVmKHBiaSwgaW5kZXgpOworCisJCWRlY29kZXJfbW11X2JveF9mcmVlX2lkeF90YWlsKAorCQkJCWlidWYtPm1tdV9ib3gsCisJCQkJaWJ1Zi0+aW5kZXgsCisJCQkJcGJpLT51c2VkXzRrX251bSk7CisJfSBlbHNlIHsKKwkJZGVjb2Rlcl9tbXVfYm94X2ZyZWVfaWR4X3RhaWwoCisJCQkJcGJpLT5tbXVfYm94LAorCQkJCWNtLT5jdXJfZmJfaWR4X21tdSwKKwkJCQlwYmktPnVzZWRfNGtfbnVtKTsKKwl9CisKKwljbS0+Y3VyX2ZiX2lkeF9tbXUgPSBJTlZBTElEX0lEWDsKKwlwYmktPnVzZWRfNGtfbnVtID0gLTE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdnA5X3JlY3ljbGVfbW11X2J1Zl90YWlsKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjb25zdCBjbSA9ICZwYmktPmNvbW1vbjsKKwlpZiAocGJpLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MTApCisJCXJldHVybjsKKwlpZiAoY20tPmN1cl9mYl9pZHhfbW11ICE9IElOVkFMSURfSURYKSB7CisJCXJlY3ljbGVfbW11X2J1Zl90YWlsKHBiaSwKKwkJCSgocGJpLT51c2VkXzRrX251bSA9PSAtMSkgJiYKKwkJCXBiaS0+bV9pbnNfZmxhZykgPyAxIDogMCk7CisJfQorfQorCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorc3RhdGljIHZvaWQgdnA5X3JlY3ljbGVfbW11X2J1ZihzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJc3RydWN0IFZQOV9Db21tb25fcyAqY29uc3QgY20gPSAmcGJpLT5jb21tb247CisKKwlpZiAocGJpLT5pc191c2VkX3Y0bCkKKwkJcmV0dXJuOworCisJaWYgKHBiaS0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDEwKQorCQlyZXR1cm47CisJaWYgKGNtLT5jdXJfZmJfaWR4X21tdSAhPSBJTlZBTElEX0lEWCkgeworCQlkZWNvZGVyX21tdV9ib3hfZnJlZV9pZHgocGJpLT5tbXVfYm94LAorCQkJY20tPmN1cl9mYl9pZHhfbW11KTsKKworCQljbS0+Y3VyX2ZiX2lkeF9tbXUgPSBJTlZBTElEX0lEWDsKKwkJcGJpLT51c2VkXzRrX251bSA9IC0xOworCX0KK30KKwordm9pZCB2cDlfcmVjeWNsZV9tbXVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IFZQOURlY29kZXJfcyAqcGJpID0gY29udGFpbmVyX29mKHdvcmssCisJCXN0cnVjdCBWUDlEZWNvZGVyX3MsIHJlY3ljbGVfbW11X3dvcmspOworCisJaWYgKHBiaSkKKwkJdnA5X3JlY3ljbGVfbW11X2J1ZihwYmkpOworfQorI2VuZGlmCisKKworc3RhdGljIHZvaWQgZGVjX2FnYWluX3Byb2Nlc3Moc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCWFtaGV2Y19zdG9wKCk7CisJcGJpLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKwlpZiAocGJpLT5wcm9jZXNzX3N0YXRlID09CisJCVBST0NfU1RBVEVfREVDT0RFU0xJQ0UpIHsKKwkJcGJpLT5wcm9jZXNzX3N0YXRlID0KKwkJUFJPQ19TVEFURV9TRU5EQUdBSU47CisJCWlmIChwYmktPm1tdV9lbmFibGUpIHsKKwkJCS8qCisJCQkgKiBCZWNhdXNlIHZwOV9yZWN5Y2xlX21tdV9idWYgaGFzIHNsZWVwIGZ1bmN0aW9uLHdlIGNhbid0CisJCQkgKiBjYWxsIGl0IGRpcmVjdGx5LiBVc2UgYSByZWN5Y2xlX21tdV93b3JrIHRvIHN1YnN0aXR1ZGUgaXQuCisJCQkgKi8KKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmcGJpLT5yZWN5Y2xlX21tdV93b3JrKTsKKwkJfQorCX0KKwlyZXNldF9wcm9jZXNzX3RpbWUocGJpKTsKKwl2ZGVjX3NjaGVkdWxlX3dvcmsoJnBiaS0+d29yayk7Cit9CisKK2ludCBjb250aW51ZV9kZWNvZGluZyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJaW50IHJldDsKKwlpbnQgaTsKKwlzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjb25zdCBjbSA9ICZwYmktPmNvbW1vbjsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9IChzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikocGJpLT52NGwyX2N0eCk7CisJZGVidWdfYnVmZmVyX21ncl9tb3JlKHBiaSk7CisKKwlpZiAocGJpLT5pc191c2VkX3Y0bCAmJiBjdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSkKKwkJcGJpLT5yZXNfY2hfZmxhZyA9IDA7CisJYml0X2RlcHRoX2x1bWEgPSBwYmktPnZwOV9wYXJhbS5wLmJpdF9kZXB0aDsKKwliaXRfZGVwdGhfY2hyb21hID0gcGJpLT52cDlfcGFyYW0ucC5iaXRfZGVwdGg7CisKKwlpZiAoKHBiaS0+dnA5X3BhcmFtLnAuYml0X2RlcHRoID49IFZQWF9CSVRTXzEwKSAmJgorCQkoZ2V0X2RvdWJsZV93cml0ZV9tb2RlKHBiaSkgPT0gMHgxMCkpIHsKKwkJcGJpLT5mYXRhbF9lcnJvciB8PSBERUNPREVSX0ZBVEFMX0VSUk9SX1NJWkVfT1ZFUkZMT1c7CisJCXByX2VycigiZmF0YWwgZXJyLCBiaXRfZGVwdGggJWQsIHVuc3VwcG9ydCBkdyAweDEwXG4iLAorCQkJcGJpLT52cDlfcGFyYW0ucC5iaXRfZGVwdGgpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHBiaS0+cHJvY2Vzc19zdGF0ZSAhPSBQUk9DX1NUQVRFX1NFTkRBR0FJTikgeworCQlyZXQgPSB2cDlfYnVmbWdyX3Byb2Nlc3MocGJpLCAmcGJpLT52cDlfcGFyYW0pOworCQlpZiAoIXBiaS0+bV9pbnNfZmxhZykKKwkJCXBiaS0+c2xpY2VfaWR4Kys7CisJfSBlbHNlIHsKKwkJdW5pb24gcGFyYW1fdSAqcGFyYW1zID0gJnBiaS0+dnA5X3BhcmFtOworCQlpZiAocGJpLT5tbXVfZW5hYmxlICYmICgocGJpLT5kb3VibGVfd3JpdGVfbW9kZSAmIDB4MTApID09IDApKSB7CisJCQlyZXQgPSB2cDlfYWxsb2NfbW11KHBiaSwKKwkJCQljbS0+bmV3X2ZiX2lkeCwKKwkJCQlwYXJhbXMtPnAud2lkdGgsCisJCQkJcGFyYW1zLT5wLmhlaWdodCwKKwkJCQlwYXJhbXMtPnAuYml0X2RlcHRoLAorCQkJCXBiaS0+ZnJhbWVfbW11X21hcF9hZGRyKTsKKwkJCWlmIChyZXQgPj0gMCkKKwkJCQljbS0+Y3VyX2ZiX2lkeF9tbXUgPSBjbS0+bmV3X2ZiX2lkeDsKKwkJCWVsc2UKKwkJCQlwcl9lcnIoImNhbid0IGFsbG9jIG5lZWQgbW11MSxpZHggJWQgcmV0ID0lZFxuIiwKKwkJCQkJY20tPm5ld19mYl9pZHgsCisJCQkJCXJldCk7CisJCX0gZWxzZSB7CisJCQlyZXQgPSAwOworCQl9CisJCVdSSVRFX1ZSRUcoSEVWQ19QQVJTRVJfUElDVFVSRV9TSVpFLAorCQkocGFyYW1zLT5wLmhlaWdodCA8PCAxNikgfCBwYXJhbXMtPnAud2lkdGgpOworCX0KKwlpZiAocmV0IDwgMCkgeworCQlwcl9pbmZvKCJ2cDlfYnVmbWdyX3Byb2Nlc3M9PiAlZCwgVlA5XzEwQl9ESVNDQVJEX05BTFxyXG4iLAorCQkgcmV0KTsKKwkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCBWUDlfMTBCX0RJU0NBUkRfTkFMKTsKKwkJY20tPnNob3dfZnJhbWUgPSAwOworCQlpZiAocGJpLT5tbXVfZW5hYmxlKSB7CisJCQlBVFJBQ0VfQ09VTlRFUihwYmktPnRyYWNlLmRlY29kZV9oZWFkZXJfbWVtb3J5X3RpbWVfbmFtZSwgVFJBQ0VfSEVBREVSX01FTU9SWV9TVEFSVCk7CisJCQl2cDlfcmVjeWNsZV9tbXVfYnVmKHBiaSk7CisJCQlBVFJBQ0VfQ09VTlRFUihwYmktPnRyYWNlLmRlY29kZV9oZWFkZXJfbWVtb3J5X3RpbWVfbmFtZSwgVFJBQ0VfSEVBREVSX01FTU9SWV9FTkQpOworCQl9CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCQlpZiAocGJpLT5tX2luc19mbGFnKSB7CisJCQlwYmktPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0RPTkU7CisjaWZkZWYgU1VQUE9SVF9GQl9ERUNPRElORworCQkJaWYgKHBiaS0+dXNlZF9zdGFnZV9idWZfbnVtID09IDApCisjZW5kaWYKKwkJCQlhbWhldmNfc3RvcCgpOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZwYmktPndvcmspOworCQl9CisjZW5kaWYKKwkJcmV0dXJuIHJldDsKKwl9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisJCXN0cnVjdCBQSUNfQlVGRkVSX0NPTkZJR19zICpjdXJfcGljX2NvbmZpZworCQkJPSAmY20tPmN1cl9mcmFtZS0+YnVmOworCQljdXJfcGljX2NvbmZpZy0+ZGVjb2RlX2lkeCA9IHBiaS0+ZnJhbWVfY291bnQ7CisKKwkJaWYgKHBiaS0+cHJvY2Vzc19zdGF0ZSAhPSBQUk9DX1NUQVRFX1NFTkRBR0FJTikgeworCQkJaWYgKCFwYmktPm1faW5zX2ZsYWcpIHsKKwkJCQlwYmktPmZyYW1lX2NvdW50Kys7CisJCQkJZGVjb2RlX2ZyYW1lX2NvdW50W3BiaS0+aW5kZXhdCisJCQkJCT0gcGJpLT5mcmFtZV9jb3VudDsKKwkJCX0KKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCQlpZiAocGJpLT5jaHVuaykgeworCQkJCWN1cl9waWNfY29uZmlnLT5wdHMgPSBwYmktPmNodW5rLT5wdHM7CisJCQkJY3VyX3BpY19jb25maWctPnB0czY0ID0gcGJpLT5jaHVuay0+cHRzNjQ7CisKKwkJCQlpZiAocGJpLT5pc191c2VkX3Y0bCAmJiAhdjRsX2JpdHN0cmVhbV9pZF9lbmFibGUpCisJCQkJCWN1cl9waWNfY29uZmlnLT5wdHM2NCA9IHBiaS0+Y2h1bmstPnRpbWVzdGFtcDsKKwkJCX0KKyNlbmRpZgorCQl9CisJCS8qcHJfaW5mbygiRGVjb2RlIEZyYW1lIERhdGEgJWRcbiIsIHBiaS0+ZnJhbWVfY291bnQpOyovCisJCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UuZGVjb2RlX2hlYWRlcl9tZW1vcnlfdGltZV9uYW1lLCBUUkFDRV9IRUFERVJfUkVHSVNURVJfU1RBUlQpOworCQljb25maWdfcGljX3NpemUocGJpLCBwYmktPnZwOV9wYXJhbS5wLmJpdF9kZXB0aCk7CisKKwkJaWYgKChwYmktPmNvbW1vbi5mcmFtZV90eXBlICE9IEtFWV9GUkFNRSkKKwkJCSYmICghcGJpLT5jb21tb24uaW50cmFfb25seSkpIHsKKwkJCWNvbmZpZ19tY19idWZmZXIocGJpLCBwYmktPnZwOV9wYXJhbS5wLmJpdF9kZXB0aCk7CisjaWZkZWYgU1VQUE9SVF9GQl9ERUNPRElORworCQkJaWYgKHBiaS0+dXNlZF9zdGFnZV9idWZfbnVtID09IDApCisjZW5kaWYKKwkJCQljb25maWdfbXByZWRfaHcocGJpKTsKKwkJfSBlbHNlIHsKKyNpZmRlZiBTVVBQT1JUX0ZCX0RFQ09ESU5HCisJCQlpZiAocGJpLT51c2VkX3N0YWdlX2J1Zl9udW0gPT0gMCkKKyNlbmRpZgorCQkJCWNsZWFyX21wcmVkX2h3KHBiaSk7CisJCX0KKyNpZmRlZiBNQ1JDQ19FTkFCTEUKKwkJaWYgKG1jcmNjX2NhY2hlX2FsZ19mbGFnKQorCQkJY29uZmlnX21jcmNjX2F4aV9od19uZXcocGJpKTsKKwkJZWxzZQorCQkJY29uZmlnX21jcmNjX2F4aV9odyhwYmkpOworI2VuZGlmCisJCWNvbmZpZ19zYW9faHcocGJpLCAmcGJpLT52cDlfcGFyYW0pOworCisjaWZkZWYgVlA5X0xQRl9MVkxfVVBEQVRFCisJCS8qCisJCSogR2V0IGxvb3AgZmlsdGVyIHJlbGF0ZWQgcGljdHVyZSBsZXZlbCBwYXJhbWV0ZXJzIGZyb20gUGFyc2VyCisJCSovCisJCXBiaS0+bGYtPm1vZGVfcmVmX2RlbHRhX2VuYWJsZWQgPSBwYmktPnZwOV9wYXJhbS5wLm1vZGVfcmVmX2RlbHRhX2VuYWJsZWQ7CisJCXBiaS0+bGYtPnNoYXJwbmVzc19sZXZlbCA9IHBiaS0+dnA5X3BhcmFtLnAuc2hhcnBuZXNzX2xldmVsOworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQkJcGJpLT5sZi0+cmVmX2RlbHRhc1tpXSA9IHBiaS0+dnA5X3BhcmFtLnAucmVmX2RlbHRhc1tpXTsKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkJCXBiaS0+bGYtPm1vZGVfZGVsdGFzW2ldID0gcGJpLT52cDlfcGFyYW0ucC5tb2RlX2RlbHRhc1tpXTsKKwkJcGJpLT5kZWZhdWx0X2ZpbHRfbHZsID0gcGJpLT52cDlfcGFyYW0ucC5maWx0ZXJfbGV2ZWw7CisJCXBiaS0+c2VnXzRsZi0+ZW5hYmxlZCA9IHBiaS0+dnA5X3BhcmFtLnAuc2VnX2VuYWJsZWQ7CisJCXBiaS0+c2VnXzRsZi0+YWJzX2RlbHRhID0gcGJpLT52cDlfcGFyYW0ucC5zZWdfYWJzX2RlbHRhOworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1NFR01FTlRTOyBpKyspCisJCQlwYmktPnNlZ180bGYtPmZlYXR1cmVfbWFza1tpXSA9IChwYmktPnZwOV9wYXJhbS5wLnNlZ19sZl9pbmZvW2ldICYKKwkJCTB4ODAwMCkgPyAoMSA8PCBTRUdfTFZMX0FMVF9MRikgOiAwOworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1NFR01FTlRTOyBpKyspCisJCQlwYmktPnNlZ180bGYtPmZlYXR1cmVfZGF0YVtpXVtTRUdfTFZMX0FMVF9MRl0KKwkJCT0gKHBiaS0+dnA5X3BhcmFtLnAuc2VnX2xmX2luZm9baV0KKwkJCSYgMHgxMDApID8gLShwYmktPnZwOV9wYXJhbS5wLnNlZ19sZl9pbmZvW2ldCisJCQkmIDB4M2YpIDogKHBiaS0+dnA5X3BhcmFtLnAuc2VnX2xmX2luZm9baV0gJiAweDNmKTsKKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQSkgeworCQkJLypTZXQgcGlwZWxpbmUgbW9kZSovCisJCQl1aW50MzJfdCBscGZfZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfREJMS19DRkdCKTsKKwkJCS8qZGJsayBwaXBlbGluZSBtb2RlPTEgZm9yIHBlcmZvcm1hbmNlKi8KKwkJCWlmIChwYmktPnZwOV9wYXJhbS5wLndpZHRoID49IDEyODApCisJCQkJbHBmX2RhdGEzMiB8PSAoMHgxIDw8IDQpOworCQkJZWxzZQorCQkJCWxwZl9kYXRhMzIgJj0gfigweDMgPDwgNCk7CisJCQlXUklURV9WUkVHKEhFVkNfREJMS19DRkdCLCBscGZfZGF0YTMyKTsKKwkJfQorCQkvKgorCQkqIFVwZGF0ZSBsb29wIGZpbHRlciBUaHIvTHZsIHRhYmxlIGZvciBldmVyeSBmcmFtZQorCQkqLworCQkvKnByX2luZm8KKwkJKCJ2cDlfbG9vcF9maWx0ZXIgKHJ1biBiZWZvcmUgZXZlcnkgZnJhbWUgZGVjb2Rpbmcgc3RhcnQpXG4iKTsqLworCQl2cDlfbG9vcF9maWx0ZXJfZnJhbWVfaW5pdChwYmktPnNlZ180bGYsCisJCQlwYmktPmxmaSwgcGJpLT5sZiwgcGJpLT5kZWZhdWx0X2ZpbHRfbHZsKTsKKyNlbmRpZgorCQkvKnByX2luZm8oIkhFVkNfREVDX1NUQVRVU19SRUcgPD0gVlA5XzEwQl9ERUNPREVfU0xJQ0VcbiIpOyovCisJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgVlA5XzEwQl9ERUNPREVfU0xJQ0UpOworCX0gZWxzZSB7CisJCXZwOV9wcmludChwYmksIFZQOV9ERUJVR19CVUZNR1IsICJTa2lwIHNlYXJjaCBuZXh0IHN0YXJ0IGNvZGVcbiIpOworCQljbS0+cHJldl9mYl9pZHggPSBJTlZBTElEX0lEWDsKKwkJLypza2lwLCBzZWFyY2ggbmV4dCBzdGFydCBjb2RlKi8KKwkJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCBWUDlfMTBCX0RFQ09ERV9TTElDRSk7CisJfQorCXBiaS0+cHJvY2Vzc19zdGF0ZSA9IFBST0NfU1RBVEVfREVDT0RFU0xJQ0U7CisJaWYgKHBiaS0+bW11X2VuYWJsZSAmJiAoKHBiaS0+ZG91YmxlX3dyaXRlX21vZGUgJiAweDEwKSA9PSAwKSkgeworCQlpZiAocGJpLT5sYXN0X3B1dF9pZHggPCBwYmktPnVzZWRfYnVmX251bSkgeworCQkJc3RydWN0IFJlZkNudEJ1ZmZlcl9zICpmcmFtZV9idWZzID0KKwkJCQljbS0+YnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnM7CisJCQlpbnQgaSA9IHBiaS0+bGFzdF9wdXRfaWR4OworCQkJLypmcmVlIG5vdCB1c2VkIGJ1ZmZlcnMuKi8KKwkJCWlmICgoZnJhbWVfYnVmc1tpXS5yZWZfY291bnQgPT0gMCkgJiYKKwkJCQkoZnJhbWVfYnVmc1tpXS5idWYudmZfcmVmID09IDApICYmCisJCQkJKGZyYW1lX2J1ZnNbaV0uYnVmLmluZGV4ICE9IC0xKSkgeworCQkJCWlmIChwYmktPmlzX3VzZWRfdjRsKSB7CisJCQkJCXN0cnVjdCBpbnRlcm5hbF9jb21wX2J1ZiAqaWJ1ZiA9CisJCQkJCQlpbmRleF90b19pY29tcF9idWYocGJpLCBpKTsKKworCQkJCQlBVFJBQ0VfQ09VTlRFUihwYmktPnRyYWNlLmRlY29kZV9oZWFkZXJfbWVtb3J5X3RpbWVfbmFtZSwgVFJBQ0VfSEVBREVSX01FTU9SWV9TVEFSVCk7CisJCQkJCWRlY29kZXJfbW11X2JveF9mcmVlX2lkeChpYnVmLT5tbXVfYm94LCBpYnVmLT5pbmRleCk7CisJCQkJCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UuZGVjb2RlX2hlYWRlcl9tZW1vcnlfdGltZV9uYW1lLCBUUkFDRV9IRUFERVJfTUVNT1JZX0VORCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJQVRSQUNFX0NPVU5URVIocGJpLT50cmFjZS5kZWNvZGVfaGVhZGVyX21lbW9yeV90aW1lX25hbWUsIFRSQUNFX0hFQURFUl9NRU1PUllfU1RBUlQpOworCQkJCQlkZWNvZGVyX21tdV9ib3hfZnJlZV9pZHgocGJpLT5tbXVfYm94LCBpKTsKKwkJCQkJQVRSQUNFX0NPVU5URVIocGJpLT50cmFjZS5kZWNvZGVfaGVhZGVyX21lbW9yeV90aW1lX25hbWUsIFRSQUNFX0hFQURFUl9NRU1PUllfRU5EKTsKKwkJCQl9CisJCQl9CisJCQlwYmktPmxhc3RfcHV0X2lkeCA9IC0xOworCQl9CisJfQorCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UuZGVjb2RlX2hlYWRlcl9tZW1vcnlfdGltZV9uYW1lLCBUUkFDRV9IRUFERVJfUkVHSVNURVJfU1RBUlQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfZnJhbWVfaW5mbyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksCisJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKmZyYW1lLAorCXVuc2lnbmVkIGludCBmcmFtZXNpemUsCisJdW5zaWduZWQgaW50IHB0cykKK3sKKwlzdHJ1Y3QgdmZyYW1lX3Fvc19zICp2ZnJhbWVfcW9zID0gJnBiaS0+dmZyYW1lX3FvczsKKworCWlmIChmcmFtZS0+c2xpY2VfdHlwZSA9PSBLRVlfRlJBTUUpCisJCXZmcmFtZV9xb3MtPnR5cGUgPSAxOworCWVsc2UgaWYgKGZyYW1lLT5zbGljZV90eXBlID09IElOVEVSX0ZSQU1FKQorCQl2ZnJhbWVfcW9zLT50eXBlID0gMjsKKy8qCisjZGVmaW5lIFNIT1dfUU9TX0lORk8KKyovCisJaWYgKGlucHV0X2ZyYW1lX2Jhc2VkKGh3X3RvX3ZkZWMocGJpKSkpCisJCXZmcmFtZV9xb3MtPnNpemUgPSBmcmFtZS0+ZnJhbWVfc2l6ZTI7CisJZWxzZQorCQl2ZnJhbWVfcW9zLT5zaXplID0gZnJhbWVzaXplOworCXZmcmFtZV9xb3MtPnB0cyA9IHB0czsKKyNpZmRlZiBTSE9XX1FPU19JTkZPCisJdnA5X3ByaW50KHBiaSwgMCwgInNsaWNlOiVkXG4iLCBmcmFtZS0+c2xpY2VfdHlwZSk7CisjZW5kaWYKKwl2ZnJhbWVfcW9zLT5tYXhfbXYgPSBmcmFtZS0+bWF4X212OworCXZmcmFtZV9xb3MtPmF2Z19tdiA9IGZyYW1lLT5hdmdfbXY7CisJdmZyYW1lX3Fvcy0+bWluX212ID0gZnJhbWUtPm1pbl9tdjsKKyNpZmRlZiBTSE9XX1FPU19JTkZPCisJdnA5X3ByaW50KHBiaSwgMCwgIm12OiBtYXg6JWQsICBhdmc6JWQsIG1pbjolZFxuIiwKKwkJCXZmcmFtZV9xb3MtPm1heF9tdiwKKwkJCXZmcmFtZV9xb3MtPmF2Z19tdiwKKwkJCXZmcmFtZV9xb3MtPm1pbl9tdik7CisjZW5kaWYKKwl2ZnJhbWVfcW9zLT5tYXhfcXAgPSBmcmFtZS0+bWF4X3FwOworCXZmcmFtZV9xb3MtPmF2Z19xcCA9IGZyYW1lLT5hdmdfcXA7CisJdmZyYW1lX3Fvcy0+bWluX3FwID0gZnJhbWUtPm1pbl9xcDsKKyNpZmRlZiBTSE9XX1FPU19JTkZPCisJdnA5X3ByaW50KHBiaSwgMCwgInFwOiBtYXg6JWQsICBhdmc6JWQsIG1pbjolZFxuIiwKKwkJCXZmcmFtZV9xb3MtPm1heF9xcCwKKwkJCXZmcmFtZV9xb3MtPmF2Z19xcCwKKwkJCXZmcmFtZV9xb3MtPm1pbl9xcCk7CisjZW5kaWYKKwl2ZnJhbWVfcW9zLT5tYXhfc2tpcCA9IGZyYW1lLT5tYXhfc2tpcDsKKwl2ZnJhbWVfcW9zLT5hdmdfc2tpcCA9IGZyYW1lLT5hdmdfc2tpcDsKKwl2ZnJhbWVfcW9zLT5taW5fc2tpcCA9IGZyYW1lLT5taW5fc2tpcDsKKyNpZmRlZiBTSE9XX1FPU19JTkZPCisJdnA5X3ByaW50KHBiaSwgMCwgInNraXA6IG1heDolZCwJYXZnOiVkLCBtaW46JWRcbiIsCisJCQl2ZnJhbWVfcW9zLT5tYXhfc2tpcCwKKwkJCXZmcmFtZV9xb3MtPmF2Z19za2lwLAorCQkJdmZyYW1lX3Fvcy0+bWluX3NraXApOworI2VuZGlmCisJdmZyYW1lX3Fvcy0+bnVtKys7Cit9CisKKy8qIG9ubHkgd2hlbiB3ZSBkZWNvZGVkIG9uZSBmaWVsZCBvciBvbmUgZnJhbWUsCit3ZSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGdldCBxb3MgaW5mbyovCitzdGF0aWMgdm9pZCBnZXRfcGljdHVyZV9xb3NfaW5mbyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJc3RydWN0IFBJQ19CVUZGRVJfQ09ORklHX3MgKmZyYW1lID0gJnBiaS0+Y3VyX2J1Zi0+YnVmOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKHBiaSk7CisKKwlpZiAoIWZyYW1lKQorCQlyZXR1cm47CisJaWYgKHZkZWMtPm12ZnJtKSB7CisJCWZyYW1lLT5mcmFtZV9zaXplMiA9IHZkZWMtPm12ZnJtLT5mcmFtZV9zaXplOworCQlmcmFtZS0+aHdfZGVjb2RlX3RpbWUgPQorCQlsb2NhbF9jbG9jaygpIC0gdmRlYy0+bXZmcm0tPmh3X2RlY29kZV9zdGFydDsKKwl9CisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpIHsKKwkJdW5zaWduZWQgY2hhciBhWzNdOworCQl1bnNpZ25lZCBjaGFyIGksIGosIHQ7CisJCXVuc2lnbmVkIGxvbmcgIGRhdGE7CisKKwkJZGF0YSA9IFJFQURfVlJFRyhIRVZDX01WX0lORk8pOworCQlpZiAoZnJhbWUtPnNsaWNlX3R5cGUgPT0gS0VZX0ZSQU1FKQorCQkJZGF0YSA9IDA7CisJCWFbMF0gPSBkYXRhICYgMHhmZjsKKwkJYVsxXSA9IChkYXRhID4+IDgpICYgMHhmZjsKKwkJYVsyXSA9IChkYXRhID4+IDE2KSAmIDB4ZmY7CisKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJZm9yIChqID0gaSsxOyBqIDwgMzsgaisrKSB7CisJCQkJaWYgKGFbal0gPCBhW2ldKSB7CisJCQkJCXQgPSBhW2pdOworCQkJCQlhW2pdID0gYVtpXTsKKwkJCQkJYVtpXSA9IHQ7CisJCQkJfSBlbHNlIGlmIChhW2pdID09IGFbaV0pIHsKKwkJCQkJYVtpXSsrOworCQkJCQl0ID0gYVtqXTsKKwkJCQkJYVtqXSA9IGFbaV07CisJCQkJCWFbaV0gPSB0OworCQkJCX0KKwkJCX0KKwkJfQorCQlmcmFtZS0+bWF4X212ID0gYVsyXTsKKwkJZnJhbWUtPmF2Z19tdiA9IGFbMV07CisJCWZyYW1lLT5taW5fbXYgPSBhWzBdOworCisJCXZwOV9wcmludChwYmksIFZQOV9ERUJVR19RT1NfSU5GTywKKwkJCSJtdiBkYXRhICV4ICBhWzBdPSAleCBhWzFdPSAleCBhWzJdPSAleFxuIiwKKwkJCWRhdGEsIGFbMF0sIGFbMV0sIGFbMl0pOworCisJCWRhdGEgPSBSRUFEX1ZSRUcoSEVWQ19RUF9JTkZPKTsKKwkJYVswXSA9IGRhdGEgJiAweDFmOworCQlhWzFdID0gKGRhdGEgPj4gOCkgJiAweDNmOworCQlhWzJdID0gKGRhdGEgPj4gMTYpICYgMHg3ZjsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlmb3IgKGogPSBpKzE7IGogPCAzOyBqKyspIHsKKwkJCQlpZiAoYVtqXSA8IGFbaV0pIHsKKwkJCQkJdCA9IGFbal07CisJCQkJCWFbal0gPSBhW2ldOworCQkJCQlhW2ldID0gdDsKKwkJCQl9IGVsc2UgaWYgKGFbal0gPT0gYVtpXSkgeworCQkJCQlhW2ldKys7CisJCQkJCXQgPSBhW2pdOworCQkJCQlhW2pdID0gYVtpXTsKKwkJCQkJYVtpXSA9IHQ7CisJCQkJfQorCQkJfQorCQl9CisJCWZyYW1lLT5tYXhfcXAgPSBhWzJdOworCQlmcmFtZS0+YXZnX3FwID0gYVsxXTsKKwkJZnJhbWUtPm1pbl9xcCA9IGFbMF07CisKKwkJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHX1FPU19JTkZPLAorCQkJInFwIGRhdGEgJXggIGFbMF09ICV4IGFbMV09ICV4IGFbMl09ICV4XG4iLAorCQkJZGF0YSwgYVswXSwgYVsxXSwgYVsyXSk7CisKKwkJZGF0YSA9IFJFQURfVlJFRyhIRVZDX1NLSVBfSU5GTyk7CisJCWFbMF0gPSBkYXRhICYgMHgxZjsKKwkJYVsxXSA9IChkYXRhID4+IDgpICYgMHgzZjsKKwkJYVsyXSA9IChkYXRhID4+IDE2KSAmIDB4N2Y7CisKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJZm9yIChqID0gaSsxOyBqIDwgMzsgaisrKSB7CisJCQkJaWYgKGFbal0gPCBhW2ldKSB7CisJCQkJCXQgPSBhW2pdOworCQkJCQlhW2pdID0gYVtpXTsKKwkJCQkJYVtpXSA9IHQ7CisJCQkJfSBlbHNlIGlmIChhW2pdID09IGFbaV0pIHsKKwkJCQkJYVtpXSsrOworCQkJCQl0ID0gYVtqXTsKKwkJCQkJYVtqXSA9IGFbaV07CisJCQkJCWFbaV0gPSB0OworCQkJCX0KKwkJCX0KKwkJfQorCQlmcmFtZS0+bWF4X3NraXAgPSBhWzJdOworCQlmcmFtZS0+YXZnX3NraXAgPSBhWzFdOworCQlmcmFtZS0+bWluX3NraXAgPSBhWzBdOworCisJCXZwOV9wcmludChwYmksIFZQOV9ERUJVR19RT1NfSU5GTywKKwkJCSJza2lwIGRhdGEgJXggIGFbMF09ICV4IGFbMV09ICV4IGFbMl09ICV4XG4iLAorCQkJZGF0YSwgYVswXSwgYVsxXSwgYVsyXSk7CisJfSBlbHNlIHsKKwkJdWludDMyX3QgYmxrODhfeV9jb3VudDsKKwkJdWludDMyX3QgYmxrODhfY19jb3VudDsKKwkJdWludDMyX3QgYmxrMjJfbXZfY291bnQ7CisJCXVpbnQzMl90IHJkYXRhMzI7CisJCWludDMyX3QgbXZfaGk7CisJCWludDMyX3QgbXZfbG87CisJCXVpbnQzMl90IHJkYXRhMzJfbDsKKwkJdWludDMyX3QgbXZ4X0wwX2hpOworCQl1aW50MzJfdCBtdnlfTDBfaGk7CisJCXVpbnQzMl90IG12eF9MMV9oaTsKKwkJdWludDMyX3QgbXZ5X0wxX2hpOworCQlpbnQ2NF90IHZhbHVlOworCQl1aW50NjRfdCB0ZW1wX3ZhbHVlOworCQlpbnQgcGljX251bWJlciA9IGZyYW1lLT5kZWNvZGVfaWR4OworCisJCWZyYW1lLT5tYXhfbXYgPSAwOworCQlmcmFtZS0+YXZnX212ID0gMDsKKwkJZnJhbWUtPm1pbl9tdiA9IDA7CisKKwkJZnJhbWUtPm1heF9za2lwID0gMDsKKwkJZnJhbWUtPmF2Z19za2lwID0gMDsKKwkJZnJhbWUtPm1pbl9za2lwID0gMDsKKworCQlmcmFtZS0+bWF4X3FwID0gMDsKKwkJZnJhbWUtPmF2Z19xcCA9IDA7CisJCWZyYW1lLT5taW5fcXAgPSAwOworCisJCXZwOV9wcmludChwYmksIFZQOV9ERUJVR19RT1NfSU5GTywgInNsaWNlX3R5cGU6JWQsIHBvYzolZFxuIiwKKwkJCWZyYW1lLT5zbGljZV90eXBlLAorCQkJcGljX251bWJlcik7CisKKwkJLyogc2V0IHJkX2lkeCB0byAwICovCisJCVdSSVRFX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9DVFJMLCAwKTsKKworCQlibGs4OF95X2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJCWlmIChibGs4OF95X2NvdW50ID09IDApIHsKKworCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTk8gRGF0YSB5ZXQuXG4iLAorCQkJcGljX251bWJlcik7CisKKwkJCS8qIHJlc2V0IGFsbCBjb3VudHMgKi8KKwkJCVdSSVRFX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9DVFJMLCAoMTw8OCkpOworCQkJcmV0dXJuOworCQl9CisJCS8qIHFwX3lfc3VtICovCisJCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKworCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gWSBRUCBBVkcgOiAlZCAoJWQvJWQpXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMi9ibGs4OF95X2NvdW50LAorCQkJcmRhdGEzMiwgYmxrODhfeV9jb3VudCk7CisKKwkJZnJhbWUtPmF2Z19xcCA9IHJkYXRhMzIvYmxrODhfeV9jb3VudDsKKwkJLyogaW50cmFfeV9jb3VudCAqLworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisKKwkJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIFkgaW50cmEgcmF0ZSA6ICVkJWMgKCVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzIqMTAwL2Jsazg4X3lfY291bnQsCisJCQknJScsIHJkYXRhMzIpOworCisJCS8qIHNraXBwZWRfeV9jb3VudCAqLworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisKKwkJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIFkgc2tpcHBlZCByYXRlIDogJWQlYyAoJWQpXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMioxMDAvYmxrODhfeV9jb3VudCwKKwkJCSclJywgcmRhdGEzMik7CisKKwkJZnJhbWUtPmF2Z19za2lwID0gcmRhdGEzMioxMDAvYmxrODhfeV9jb3VudDsKKwkJLyogY29lZmZfbm9uX3plcm9feV9jb3VudCAqLworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisKKwkJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIFkgWkVST19Db2VmZiByYXRlIDogJWQlYyAoJWQpXG4iLAorCQkJcGljX251bWJlciwgKDEwMCAtIHJkYXRhMzIqMTAwLyhibGs4OF95X2NvdW50KjEpKSwKKwkJCSclJywgcmRhdGEzMik7CisKKwkJLyogYmxrNjZfY19jb3VudCAqLworCQlibGs4OF9jX2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJCWlmIChibGs4OF9jX2NvdW50ID09IDApIHsKKwkJCXZwOV9wcmludChwYmksIFZQOV9ERUJVR19RT1NfSU5GTywKKwkJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTk8gRGF0YSB5ZXQuXG4iLAorCQkJCXBpY19udW1iZXIpOworCQkJLyogcmVzZXQgYWxsIGNvdW50cyAqLworCQkJV1JJVEVfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0NUUkwsICgxPDw4KSk7CisJCQlyZXR1cm47CisJCX0KKwkJLyogcXBfY19zdW0gKi8KKwkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCisJCXZwOV9wcmludChwYmksIFZQOV9ERUJVR19RT1NfSU5GTywKKwkJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gQyBRUCBBVkcgOiAlZCAoJWQvJWQpXG4iLAorCQkJCXBpY19udW1iZXIsIHJkYXRhMzIvYmxrODhfY19jb3VudCwKKwkJCQlyZGF0YTMyLCBibGs4OF9jX2NvdW50KTsKKworCQkvKiBpbnRyYV9jX2NvdW50ICovCisJCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKworCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gQyBpbnRyYSByYXRlIDogJWQlYyAoJWQpXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMioxMDAvYmxrODhfY19jb3VudCwKKwkJCSclJywgcmRhdGEzMik7CisKKwkJLyogc2tpcHBlZF9jdV9jX2NvdW50ICovCisJCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKworCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gQyBza2lwcGVkIHJhdGUgOiAlZCVjICglZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyKjEwMC9ibGs4OF9jX2NvdW50LAorCQkJJyUnLCByZGF0YTMyKTsKKworCQkvKiBjb2VmZl9ub25femVyb19jX2NvdW50ICovCisJCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKworCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gQyBaRVJPX0NvZWZmIHJhdGUgOiAlZCVjICglZClcbiIsCisJCQlwaWNfbnVtYmVyLCAoMTAwIC0gcmRhdGEzMioxMDAvKGJsazg4X2NfY291bnQqMSkpLAorCQkJJyUnLCByZGF0YTMyKTsKKworCQkvKiAxJ2gwLCBxcF9jX21heFs2OjBdLCAxJ2gwLCBxcF9jX21pbls2OjBdLAorCQkxJ2gwLCBxcF95X21heFs2OjBdLCAxJ2gwLCBxcF95X21pbls2OjBdICovCisJCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKworCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gWSBRUCBtaW4gOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIChyZGF0YTMyPj4wKSYweGZmKTsKKworCQlmcmFtZS0+bWluX3FwID0gKHJkYXRhMzI+PjApJjB4ZmY7CisKKwkJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIFkgUVAgbWF4IDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCAocmRhdGEzMj4+OCkmMHhmZik7CisKKwkJZnJhbWUtPm1heF9xcCA9IChyZGF0YTMyPj44KSYweGZmOworCisJCXZwOV9wcmludChwYmksIFZQOV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBDIFFQIG1pbiA6ICVkXG4iLAorCQkJcGljX251bWJlciwgKHJkYXRhMzI+PjE2KSYweGZmKTsKKwkJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIEMgUVAgbWF4IDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCAocmRhdGEzMj4+MjQpJjB4ZmYpOworCisJCS8qIGJsazIyX212X2NvdW50ICovCisJCWJsazIyX212X2NvdW50ID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJCWlmIChibGsyMl9tdl9jb3VudCA9PSAwKSB7CisJCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfUU9TX0lORk8sCisJCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE5PIE1WIERhdGEgeWV0LlxuIiwKKwkJCQlwaWNfbnVtYmVyKTsKKwkJCS8qIHJlc2V0IGFsbCBjb3VudHMgKi8KKwkJCVdSSVRFX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9DVFJMLCAoMTw8OCkpOworCQkJcmV0dXJuOworCQl9CisJCS8qIG12eV9MMV9jb3VudFszOTozMl0sIG12eF9MMV9jb3VudFszOTozMl0sCisJCW12eV9MMF9jb3VudFszOTozMl0sIG12eF9MMF9jb3VudFszOTozMl0gKi8KKwkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCQkvKiBzaG91bGQgYWxsIGJlIDB4MDAgb3IgMHhmZiAqLworCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVYgQVZHIEhpZ2ggQml0czogMHglWFxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzIpOworCisJCW12eF9MMF9oaSA9ICgocmRhdGEzMj4+MCkmMHhmZik7CisJCW12eV9MMF9oaSA9ICgocmRhdGEzMj4+OCkmMHhmZik7CisJCW12eF9MMV9oaSA9ICgocmRhdGEzMj4+MTYpJjB4ZmYpOworCQltdnlfTDFfaGkgPSAoKHJkYXRhMzI+PjI0KSYweGZmKTsKKworCQkvKiBtdnhfTDBfY291bnRbMzE6MF0gKi8KKwkJcmRhdGEzMl9sID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJCXRlbXBfdmFsdWUgPSBtdnhfTDBfaGk7CisJCXRlbXBfdmFsdWUgPSAodGVtcF92YWx1ZSA8PCAzMikgfCByZGF0YTMyX2w7CisKKwkJaWYgKG12eF9MMF9oaSAmIDB4ODApCisJCQl2YWx1ZSA9IDB4RkZGRkZGRjAwMDAwMDAwMCB8IHRlbXBfdmFsdWU7CisJCWVsc2UKKwkJCXZhbHVlID0gdGVtcF92YWx1ZTsKKworCQl2YWx1ZSA9IGRpdl9zNjQodmFsdWUsIGJsazIyX212X2NvdW50KTsKKworCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZYX0wwIEFWRyA6ICVkICglbGxkLyVkKVxuIiwKKwkJCXBpY19udW1iZXIsIChpbnQpdmFsdWUsCisJCQl2YWx1ZSwgYmxrMjJfbXZfY291bnQpOworCisJCWZyYW1lLT5hdmdfbXYgPSB2YWx1ZTsKKworCQkvKiBtdnlfTDBfY291bnRbMzE6MF0gKi8KKwkJcmRhdGEzMl9sID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJCXRlbXBfdmFsdWUgPSBtdnlfTDBfaGk7CisJCXRlbXBfdmFsdWUgPSAodGVtcF92YWx1ZSA8PCAzMikgfCByZGF0YTMyX2w7CisKKwkJaWYgKG12eV9MMF9oaSAmIDB4ODApCisJCQl2YWx1ZSA9IDB4RkZGRkZGRjAwMDAwMDAwMCB8IHRlbXBfdmFsdWU7CisJCWVsc2UKKwkJCXZhbHVlID0gdGVtcF92YWx1ZTsKKworCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZZX0wwIEFWRyA6ICVkICglbGxkLyVkKVxuIiwKKwkJCXBpY19udW1iZXIsIHJkYXRhMzJfbC9ibGsyMl9tdl9jb3VudCwKKwkJCXZhbHVlLCBibGsyMl9tdl9jb3VudCk7CisKKwkJLyogbXZ4X0wxX2NvdW50WzMxOjBdICovCisJCXJkYXRhMzJfbCA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCQl0ZW1wX3ZhbHVlID0gbXZ4X0wxX2hpOworCQl0ZW1wX3ZhbHVlID0gKHRlbXBfdmFsdWUgPDwgMzIpIHwgcmRhdGEzMl9sOworCQlpZiAobXZ4X0wxX2hpICYgMHg4MCkKKwkJCXZhbHVlID0gMHhGRkZGRkZGMDAwMDAwMDAwIHwgdGVtcF92YWx1ZTsKKwkJZWxzZQorCQkJdmFsdWUgPSB0ZW1wX3ZhbHVlOworCisJCXZwOV9wcmludChwYmksIFZQOV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVlhfTDEgQVZHIDogJWQgKCVsbGQvJWQpXG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMl9sL2JsazIyX212X2NvdW50LAorCQkJdmFsdWUsIGJsazIyX212X2NvdW50KTsKKworCQkvKiBtdnlfTDFfY291bnRbMzE6MF0gKi8KKwkJcmRhdGEzMl9sID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJCXRlbXBfdmFsdWUgPSBtdnlfTDFfaGk7CisJCXRlbXBfdmFsdWUgPSAodGVtcF92YWx1ZSA8PCAzMikgfCByZGF0YTMyX2w7CisJCWlmIChtdnlfTDFfaGkgJiAweDgwKQorCQkJdmFsdWUgPSAweEZGRkZGRkYwMDAwMDAwMDAgfCB0ZW1wX3ZhbHVlOworCQllbHNlCisJCQl2YWx1ZSA9IHRlbXBfdmFsdWU7CisKKwkJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWV9MMSBBVkcgOiAlZCAoJWxsZC8lZClcbiIsCisJCQlwaWNfbnVtYmVyLCByZGF0YTMyX2wvYmxrMjJfbXZfY291bnQsCisJCQl2YWx1ZSwgYmxrMjJfbXZfY291bnQpOworCisJCS8qIHttdnhfTDBfbWF4LCBtdnhfTDBfbWlufSAvLyBmb3JtYXQgOiB7c2lnbiwgYWJzWzE0OjBdfSAgKi8KKwkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCQltdl9oaSA9IChyZGF0YTMyPj4xNikmMHhmZmZmOworCQlpZiAobXZfaGkgJiAweDgwMDApCisJCQltdl9oaSA9IDB4ODAwMCAtIG12X2hpOworCisJCXZwOV9wcmludChwYmksIFZQOV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVlhfTDAgTUFYIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9oaSk7CisKKwkJZnJhbWUtPm1heF9tdiA9IG12X2hpOworCisJCW12X2xvID0gKHJkYXRhMzI+PjApJjB4ZmZmZjsKKwkJaWYgKG12X2xvICYgMHg4MDAwKQorCQkJbXZfbG8gPSAweDgwMDAgLSBtdl9sbzsKKworCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZYX0wwIE1JTiA6ICVkXG4iLAorCQkJcGljX251bWJlciwgbXZfbG8pOworCisJCWZyYW1lLT5taW5fbXYgPSBtdl9sbzsKKworCQkvKiB7bXZ5X0wwX21heCwgbXZ5X0wwX21pbn0gKi8KKwkJcmRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1BJQ19RVUFMSVRZX0RBVEEpOworCQltdl9oaSA9IChyZGF0YTMyPj4xNikmMHhmZmZmOworCQlpZiAobXZfaGkgJiAweDgwMDApCisJCQltdl9oaSA9IDB4ODAwMCAtIG12X2hpOworCisJCXZwOV9wcmludChwYmksIFZQOV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVllfTDAgTUFYIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9oaSk7CisKKwkJbXZfbG8gPSAocmRhdGEzMj4+MCkmMHhmZmZmOworCQlpZiAobXZfbG8gJiAweDgwMDApCisJCQltdl9sbyA9IDB4ODAwMCAtIG12X2xvOworCisJCXZwOV9wcmludChwYmksIFZQOV9ERUJVR19RT1NfSU5GTywKKwkJCSJbUGljdHVyZSAlZCBRdWFsaXR5XSBNVllfTDAgTUlOIDogJWRcbiIsCisJCQlwaWNfbnVtYmVyLCBtdl9sbyk7CisKKwkJLyoge212eF9MMV9tYXgsIG12eF9MMV9taW59ICovCisJCXJkYXRhMzIgPSBSRUFEX1ZSRUcoSEVWQ19QSUNfUVVBTElUWV9EQVRBKTsKKwkJbXZfaGkgPSAocmRhdGEzMj4+MTYpJjB4ZmZmZjsKKwkJaWYgKG12X2hpICYgMHg4MDAwKQorCQkJbXZfaGkgPSAweDgwMDAgLSBtdl9oaTsKKworCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZYX0wxIE1BWCA6ICVkXG4iLAorCQkJcGljX251bWJlciwgbXZfaGkpOworCisJCW12X2xvID0gKHJkYXRhMzI+PjApJjB4ZmZmZjsKKwkJaWYgKG12X2xvICYgMHg4MDAwKQorCQkJbXZfbG8gPSAweDgwMDAgLSBtdl9sbzsKKworCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfUU9TX0lORk8sCisJCQkiW1BpY3R1cmUgJWQgUXVhbGl0eV0gTVZYX0wxIE1JTiA6ICVkXG4iLAorCQkJcGljX251bWJlciwgbXZfbG8pOworCisJCS8qIHttdnlfTDFfbWF4LCBtdnlfTDFfbWlufSAqLworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfREFUQSk7CisJCW12X2hpID0gKHJkYXRhMzI+PjE2KSYweGZmZmY7CisJCWlmIChtdl9oaSAmIDB4ODAwMCkKKwkJCW12X2hpID0gMHg4MDAwIC0gbXZfaGk7CisKKwkJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWV9MMSBNQVggOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIG12X2hpKTsKKworCQltdl9sbyA9IChyZGF0YTMyPj4wKSYweGZmZmY7CisJCWlmIChtdl9sbyAmIDB4ODAwMCkKKwkJCW12X2xvID0gMHg4MDAwIC0gbXZfbG87CisKKwkJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIE1WWV9MMSBNSU4gOiAlZFxuIiwKKwkJCXBpY19udW1iZXIsIG12X2xvKTsKKworCQlyZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfUElDX1FVQUxJVFlfQ1RSTCk7CisKKwkJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHX1FPU19JTkZPLAorCQkJIltQaWN0dXJlICVkIFF1YWxpdHldIEFmdGVyIFJlYWQgOiBWREVDX1BJQ19RVUFMSVRZX0NUUkwgOiAweCV4XG4iLAorCQkJcGljX251bWJlciwgcmRhdGEzMik7CisKKwkJLyogcmVzZXQgYWxsIGNvdW50cyAqLworCQlXUklURV9WUkVHKEhFVkNfUElDX1FVQUxJVFlfQ1RSTCwgKDE8PDgpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHZ2cDlfZ2V0X2NvbXBfYnVmX2luZm8oc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLAorCQkJCQlzdHJ1Y3QgdmRlY19jb21wX2J1Zl9pbmZvICppbmZvKQoreworCXUxNiBiaXRfZGVwdGggPSBwYmktPnBhcmFtLnAuYml0X2RlcHRoOworCisJaW5mby0+bWF4X3NpemUgPSB2cDlfbWF4X21tdV9idWZfc2l6ZSgKKwkJCXBiaS0+bWF4X3BpY193LAorCQkJcGJpLT5tYXhfcGljX2gpOworCWluZm8tPmhlYWRlcl9zaXplID0gdnZwOV9tbXVfY29tcHJlc3NfaGVhZGVyX3NpemUoCisJCQlwYmktPmZyYW1lX3dpZHRoLAorCQkJcGJpLT5mcmFtZV9oZWlnaHQpOworCWluZm8tPmZyYW1lX2J1ZmZlcl9zaXplID0gdnA5X21tdV9wYWdlX251bSgKKwkJCXBiaSwgcGJpLT5mcmFtZV93aWR0aCwKKwkJCXBiaS0+ZnJhbWVfaGVpZ2h0LAorCQkJYml0X2RlcHRoID09IDApOworfQorCitzdGF0aWMgaW50IHZ2cDlfZ2V0X3BzX2luZm8oc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLCBzdHJ1Y3QgYW1sX3ZkZWNfcHNfaW5mb3MgKnBzKQoreworCXBzLT52aXNpYmxlX3dpZHRoIAk9IHBiaS0+ZnJhbWVfd2lkdGg7CisJcHMtPnZpc2libGVfaGVpZ2h0IAk9IHBiaS0+ZnJhbWVfaGVpZ2h0OworCXBzLT5jb2RlZF93aWR0aCAJPSBBTElHTihwYmktPmZyYW1lX3dpZHRoLCA2NCk7CisJcHMtPmNvZGVkX2hlaWdodCAJPSBBTElHTihwYmktPmZyYW1lX2hlaWdodCwgNjQpOworCXBzLT5kcGJfc2l6ZSAJCT0gcGJpLT51c2VkX2J1Zl9udW07CisJcHMtPmRwYl9tYXJnaW4JPSBwYmktPmR5bmFtaWNfYnVmX251bV9tYXJnaW47CisJaWYgKHBiaS0+ZnJhbWVfd2lkdGggPiAyMDQ4ICYmIHBiaS0+ZnJhbWVfaGVpZ2h0ID4gMTA4OCkKKwkJcHMtPmRwYl9mcmFtZXMJPSA0OwkgLyogPiBsZXZlbCA0LjEqLworCWVsc2UKKwkJcHMtPmRwYl9mcmFtZXMJPSA4OwkvKiA8IGxldmVsIDQuMSAqLworCS8qCisJMS4gY3VycnVlbnQgZGVjb2RpbmcgZnJhbWUgaXMgbm90IGluY2x1ZGUgaW4gZHBiOworCTIuIGZvciBmcmFtZSBwdXNoIG91dCwgb25lIG1vcmUgYnVmZmVyIG5lY2Vzc2FyeS4KKwkzLiBUd28gY29uc2VjdXRpdmUgZnJhbWVzIGNhbm5vdCB1c2UgdGhlIHNhbWUgYnVmZmVyLgorCSovCisJcHMtPmRwYl9mcmFtZXMgKz0gMzsKKworCWlmIChwcy0+ZHBiX21hcmdpbiArIHBzLT5kcGJfZnJhbWVzID4gTUFYX0JVRl9OVU1fTk9STUFMKSB7CisJCXUzMiBkZWx0YTsKKwkJZGVsdGEgPSBwcy0+ZHBiX21hcmdpbiArIHBzLT5kcGJfZnJhbWVzIC0gTUFYX0JVRl9OVU1fTk9STUFMOworCQlwcy0+ZHBiX21hcmdpbiAtPSBkZWx0YTsKKwkJcGJpLT5keW5hbWljX2J1Zl9udW1fbWFyZ2luID0gcHMtPmRwYl9tYXJnaW47CisJfQorCXBzLT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgdjRsX3Jlc19jaGFuZ2Uoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKShwYmktPnY0bDJfY3R4KTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChjdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSAmJgorCQlwYmktPnJlc19jaF9mbGFnID09IDApIHsKKwkJc3RydWN0IGFtbF92ZGVjX3BzX2luZm9zIHBzOworCQlzdHJ1Y3QgdmRlY19jb21wX2J1Zl9pbmZvIGNvbXA7CisKKwkJaWYgKChwYmktPmxhc3Rfd2lkdGggIT0gMCAmJgorCQkJcGJpLT5sYXN0X2hlaWdodCAhPSAwKSAmJgorCQkJKHBiaS0+ZnJhbWVfd2lkdGggIT0gcGJpLT5sYXN0X3dpZHRoIHx8CisJCQlwYmktPmZyYW1lX2hlaWdodCAhPSBwYmktPmxhc3RfaGVpZ2h0KSkgeworCisJCQl2cDlfcHJpbnQocGJpLCAwLCAiJXMgKCVkLCVkKT0+KCVkLCVkKVxyXG4iLCBfX2Z1bmNfXywgcGJpLT5sYXN0X3dpZHRoLAorCQkJCXBiaS0+bGFzdF9oZWlnaHQsIHBiaS0+ZnJhbWVfd2lkdGgsIHBiaS0+ZnJhbWVfaGVpZ2h0KTsKKworCQkJaWYgKGdldF92YWxpZF9kb3VibGVfd3JpdGVfbW9kZShwYmkpICE9IDE2KSB7CisJCQkJdnZwOV9nZXRfY29tcF9idWZfaW5mbyhwYmksICZjb21wKTsKKwkJCQl2ZGVjX3Y0bF9zZXRfY29tcF9idWZfaW5mbyhjdHgsICZjb21wKTsKKwkJCX0KKworCQkJdnZwOV9nZXRfcHNfaW5mbyhwYmksICZwcyk7CisJCQl2ZGVjX3Y0bF9zZXRfcHNfaW5mb3MoY3R4LCAmcHMpOworCQkJdmRlY192NGxfcmVzX2NoX2V2ZW50KGN0eCk7CisKKwkJCXBiaS0+aW5pdF9waWNfdyA9IHBiaS0+ZnJhbWVfd2lkdGg7CisJCQlwYmktPmluaXRfcGljX2ggPSBwYmktPmZyYW1lX2hlaWdodDsKKwkJCWluaXRfbXZfYnVmX2xpc3QocGJpKTsKKworCQkJcGJpLT5wcm9jZXNzX3N0YXRlID0gUFJPQ19TVEFURV9JTklUOworCQkJcGJpLT52NGxfcGFyYW1zX3BhcnNlZCA9IGZhbHNlOworCQkJcGJpLT5yZXNfY2hfZmxhZyA9IDE7CisJCQljdHgtPnY0bF9yZXNvbHV0aW9uX2NoYW5nZSA9IDE7CisJCQlwYmktPmVvcyA9IDE7CisJCQl2cDlfYnVmbWdyX3Bvc3Rwcm9jKHBiaSk7CisJCQkvL2RlbF90aW1lcl9zeW5jKCZwYmktPnRpbWVyKTsKKwkJCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy1zdWJtaXRfZW9zIiwgX19MSU5FX18pOworCQkJbm90aWZ5X3Y0bF9lb3MoaHdfdG9fdmRlYyhwYmkpKTsKKwkJCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy1zdWJtaXRfZW9zIiwgMCk7CisJCQlyZXQgPSAxOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlycXJldHVybl90IHZ2cDlfaXNyX3RocmVhZF9mbihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSA9IChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICopZGF0YTsKKwl1bnNpZ25lZCBpbnQgZGVjX3N0YXR1cyA9IHBiaS0+ZGVjX3N0YXR1czsKKwlpbnQgaTsKKworCWlmIChkZWNfc3RhdHVzID09IFZQOV9IRUFEX1BBUlNFUl9ET05FKSB7CisJCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9JU1JfVEhSRUFEX0hFQURfU1RBUlQpOworCX0KKwllbHNlIGlmIChkZWNfc3RhdHVzID09IEhFVkNfREVDUElDX0RBVEFfRE9ORSkgeworCQlBVFJBQ0VfQ09VTlRFUihwYmktPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX1RIUkVBRF9QSUNfRE9ORV9TVEFSVCk7CisJfQorCisJLyppZiAocGJpLT53YWl0X2J1ZikKKwkgKglwcl9pbmZvKCJzZXQgd2FpdF9idWYgdG8gMFxyXG4iKTsKKwkgKi8KKwlpZiAocGJpLT5lb3MpCisJCXJldHVybiBJUlFfSEFORExFRDsKKwlwYmktPndhaXRfYnVmID0gMDsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisjaWZkZWYgU1VQUE9SVF9GQl9ERUNPRElORworI2lmZGVmIEZCX0RFQ09ESU5HX1RFU1RfU0NIRURVTEUKKwlpZiAocGJpLT5zMV90ZXN0X2NtZCA9PSBURVNUX1NFVF9QSUNfRE9ORSkKKwkJZGVjX3N0YXR1cyA9IEhFVkNfREVDUElDX0RBVEFfRE9ORTsKKwllbHNlIGlmIChwYmktPnMxX3Rlc3RfY21kID09IFRFU1RfU0VUX1MyX0RPTkUKKwkJJiYgZGVjX3N0YXR1cyA9PSBIRVZDX0RFQ1BJQ19EQVRBX0RPTkUpCisJCWRlY19zdGF0dXMgPSBIRVZDX1MyX0RFQ09ESU5HX0RPTkU7CisJcGJpLT5zMV90ZXN0X2NtZCA9IFRFU1RfU0VUX05PTkU7CisjZWxzZQorCS8qaWYgKGlycSAhPSBWREVDX0lSUV8wKQorCQlkZWNfc3RhdHVzID0gSEVWQ19TMl9ERUNPRElOR19ET05FOyovCisjZW5kaWYKKwlpZiAoZGVjX3N0YXR1cyA9PSBIRVZDX1MyX0RFQ09ESU5HX0RPTkUpIHsKKwkJcGJpLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ET05FOworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJnBiaS0+d29yayk7CisjaWZkZWYgRkJfREVDT0RJTkdfVEVTVF9TQ0hFRFVMRQorCQlhbWhldmNfc3RvcCgpOworCQlwYmktPmRlY19zMV9yZXN1bHQgPSBERUNfUzFfUkVTVUxUX0RPTkU7CisJCXZkZWNfc2NoZWR1bGVfd29yaygmcGJpLT5zMV93b3JrKTsKKyNlbmRpZgorCX0gZWxzZQorI2VuZGlmCisJaWYgKChkZWNfc3RhdHVzID09IEhFVkNfTkFMX0RFQ09ERV9ET05FKSB8fAorCQkJKGRlY19zdGF0dXMgPT0gSEVWQ19TRUFSQ0hfQlVGRU1QVFkpIHx8CisJCQkoZGVjX3N0YXR1cyA9PSBIRVZDX0RFQ09ERV9CVUZFTVBUWSkKKwkJKSB7CisJCWlmIChwYmktPm1faW5zX2ZsYWcpIHsKKwkJCXJlc2V0X3Byb2Nlc3NfdGltZShwYmkpOworCQkJaWYgKCF2ZGVjX2ZyYW1lX2Jhc2VkKGh3X3RvX3ZkZWMocGJpKSkpCisJCQkJZGVjX2FnYWluX3Byb2Nlc3MocGJpKTsKKwkJCWVsc2UgeworCQkJCWlmIChwYmktPmNvbW1vbi5zaG93X2V4aXN0aW5nX2ZyYW1lKSB7CisJCQkJCXBiaS0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwkJCQkJYW1oZXZjX3N0b3AoKTsKKwkJCQkJdmRlY19zY2hlZHVsZV93b3JrKCZwYmktPndvcmspOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJcGJpLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9HRVRfREFUQTsKKwkJCQkJdmRlY19zY2hlZHVsZV93b3JrKCZwYmktPndvcmspOworCQkJCX0KKwkJCX0KKwkJfQorCQlwYmktPnByb2Nlc3NfYnVzeSA9IDA7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9IGVsc2UgaWYgKGRlY19zdGF0dXMgPT0gSEVWQ19ERUNQSUNfREFUQV9ET05FKSB7CisJCWlmIChwYmktPm1faW5zX2ZsYWcpIHsKKwkJCWdldF9waWN0dXJlX3Fvc19pbmZvKHBiaSk7CisjaWZkZWYgU1VQUE9SVF9GQl9ERUNPRElORworCQkJaWYgKHBiaS0+dXNlZF9zdGFnZV9idWZfbnVtID4gMCkgeworCQkJCXJlc2V0X3Byb2Nlc3NfdGltZShwYmkpOworCQkJCWluY19zMV9wb3MocGJpKTsKKwkJCQl0cmlnZ2VyX3NjaGVkdWxlKHBiaSk7CisjaWZkZWYgRkJfREVDT0RJTkdfVEVTVF9TQ0hFRFVMRQorCQkJCXBiaS0+czFfdGVzdF9jbWQgPSBURVNUX1NFVF9TMl9ET05FOworI2Vsc2UKKwkJCQlhbWhldmNfc3RvcCgpOworCQkJCXBiaS0+ZGVjX3MxX3Jlc3VsdCA9IERFQ19TMV9SRVNVTFRfRE9ORTsKKwkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJnBiaS0+czFfd29yayk7CisjZW5kaWYKKwkJCX0gZWxzZQorI2VuZGlmCisJCQl7CisJCQkJcmVzZXRfcHJvY2Vzc190aW1lKHBiaSk7CisJCQkJaWYgKGF0b21pY19yZWFkKCZwYmktPnZmX3ByZV9jb3VudCkgPT0gMCB8fCBwYmktPmxvd19sYXRlbmN5X2ZsYWcpCisJCQkJCXZwOV9idWZtZ3JfcG9zdHByb2MocGJpKTsKKworCQkJCXBiaS0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwkJCQlhbWhldmNfc3RvcCgpOworCQkJCWlmIChtY3JjY19jYWNoZV9hbGdfZmxhZykKKwkJCQkJZHVtcF9oaXRfcmF0ZShwYmkpOworCQkJCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9JU1JfVEhSRUFEX0VETik7CisJCQkJdmRlY19zY2hlZHVsZV93b3JrKCZwYmktPndvcmspOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHBiaS0+bG93X2xhdGVuY3lfZmxhZykgeworCQkJCXZwOV9idWZtZ3JfcG9zdHByb2MocGJpKTsKKwkJCQlXUklURV9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcsIEhFVkNfQUNUSU9OX0RPTkUpOworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX01VTFRJX0RFQworCQkJCXZkZWNfcHJvZmlsZShod190b192ZGVjKHBiaSksIFZERUNfUFJPRklMRV9FVkVOVF9DQik7CisJCQkJaWYgKGRlYnVnICYgUFJJTlRfRkxBR19WREVDX0RFVEFJTCkKKwkJCQkJcHJfaW5mbygiJXMgVlA5IGZyYW1lIGRvbmUgXG4iLCBfX2Z1bmNfXyk7CisjZW5kaWYKKwkJCX0KKwkJfQorCisJCXBiaS0+cHJvY2Vzc19idXN5ID0gMDsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKyNlbmRpZgorCisJaWYgKGRlY19zdGF0dXMgPT0gVlA5X0VPUykgeworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwkJaWYgKHBiaS0+bV9pbnNfZmxhZykKKwkJCXJlc2V0X3Byb2Nlc3NfdGltZShwYmkpOworI2VuZGlmCisKKwkJcHJfaW5mbygiVlA5X0VPUywgZmx1c2ggYnVmZmVyXHJcbiIpOworCisJCXZwOV9idWZtZ3JfcG9zdHByb2MocGJpKTsKKworCQlwcl9pbmZvKCJzZW5kIFZQOV8xMEJfRElTQ0FSRF9OQUxcclxuIik7CisJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgVlA5XzEwQl9ESVNDQVJEX05BTCk7CisJCXBiaS0+cHJvY2Vzc19idXN5ID0gMDsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCWlmIChwYmktPm1faW5zX2ZsYWcpIHsKKwkJCXBiaS0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRE9ORTsKKwkJCWFtaGV2Y19zdG9wKCk7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJnBiaS0+d29yayk7CisJCX0KKyNlbmRpZgorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfSBlbHNlIGlmIChkZWNfc3RhdHVzID09IEhFVkNfREVDT0RFX09WRVJfU0laRSkgeworCQlwcl9pbmZvKCJ2cDkgIGRlY29kZSBvdmVyc2l6ZSAhIVxuIik7CisJCWRlYnVnIHw9IChWUDlfREVCVUdfRElTX0xPQ19FUlJPUl9QUk9DIHwKKwkJCVZQOV9ERUJVR19ESVNfU1lTX0VSUk9SX1BST0MpOworCQlwYmktPmZhdGFsX2Vycm9yIHw9IERFQ09ERVJfRkFUQUxfRVJST1JfU0laRV9PVkVSRkxPVzsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJaWYgKHBiaS0+bV9pbnNfZmxhZykKKwkJcmVzZXRfcHJvY2Vzc190aW1lKHBiaSk7CisjZW5kaWYKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWlmIChkZWNfc3RhdHVzICE9IFZQOV9IRUFEX1BBUlNFUl9ET05FKSB7CisJCXBiaS0+cHJvY2Vzc19idXN5ID0gMDsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWlmIChwYmktPm1faW5zX2ZsYWcgJiYKKwkJCSFnZXRfZnJlZV9idWZfY291bnQocGJpKSAmJiBwYmktPnBpY19saXN0X2luaXRfZG9uZSkgeworCQl2cDlfcHJpbnQocGJpLCBWUDlfREVCVUdfT1VUX1BUUywKKwkJCSJkZXRlY3RlZCAlZCBmcmFtZXMgaW4gYSBwYWNrZXQsIHRzOiAlbGxkLlxuIiwKKwkJCXBiaS0+b25lX3BhY2thZ2VfZnJhbWVfY250ICsgMSwKKwkJCXBiaS0+Y2h1bmstPnRpbWVzdGFtcCk7CisJCXBiaS0+cHJvY2Vzc19idXN5ID0gMDsKKwkJcGJpLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9ORUVEX01PUkVfQlVGRkVSOworCQlBVFJBQ0VfQ09VTlRFUihwYmktPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX1RIUkVBRF9IRUFEX0VORCk7CisJCXZkZWNfc2NoZWR1bGVfd29yaygmcGJpLT53b3JrKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCXBiaS0+b25lX3BhY2thZ2VfZnJhbWVfY250Kys7CisKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfTVVMVElfREVDCisJaWYgKHBiaS0+bV9pbnNfZmxhZyA9PTAgJiYgcGJpLT5sb3dfbGF0ZW5jeV9mbGFnKSB7CisJCXZkZWNfcHJvZmlsZShod190b192ZGVjKHBiaSksIFZERUNfUFJPRklMRV9FVkVOVF9SVU4pOworCQlpZiAoZGVidWcgJiBQUklOVF9GTEFHX1ZERUNfREVUQUlMKQorCQkJcHJfaW5mbygiJXMgVlA5IGZyYW1lIGhlYWRlciBmb3VuZCBcbiIsIF9fZnVuY19fKTsKKwl9CisjZW5kaWYKKwlpZiAocGJpLT5tX2luc19mbGFnKQorCQlyZXNldF9wcm9jZXNzX3RpbWUocGJpKTsKKyNlbmRpZgorCWlmIChwYmktPnByb2Nlc3Nfc3RhdGUgIT0gUFJPQ19TVEFURV9TRU5EQUdBSU4KKyNpZmRlZiBTVVBQT1JUX0ZCX0RFQ09ESU5HCisJCSYmIHBiaS0+dXNlZF9zdGFnZV9idWZfbnVtID09IDAKKyNlbmRpZgorCQkpIHsKKwkJaWYgKHBiaS0+bW11X2VuYWJsZSkgeworCQkJQVRSQUNFX0NPVU5URVIocGJpLT50cmFjZS5kZWNvZGVfaGVhZGVyX21lbW9yeV90aW1lX25hbWUsIFRSQUNFX0hFQURFUl9NRU1PUllfU1RBUlQpOworCQkJdnA5X3JlY3ljbGVfbW11X2J1Zl90YWlsKHBiaSk7CisJCQlBVFJBQ0VfQ09VTlRFUihwYmktPnRyYWNlLmRlY29kZV9oZWFkZXJfbWVtb3J5X3RpbWVfbmFtZSwgVFJBQ0VfSEVBREVSX01FTU9SWV9FTkQpOworCQl9CisKKwkJaWYgKHBiaS0+ZnJhbWVfY291bnQgPiAwKQorCQkJdnA5X2J1Zm1ncl9wb3N0cHJvYyhwYmkpOworCX0KKworCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19TRU5EX1BBUkFNX1dJVEhfUkVHKSB7CisJCWdldF9ycG1fcGFyYW0oJnBiaS0+dnA5X3BhcmFtKTsKKwl9IGVsc2UgeworI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKKwkJaWYgKHBiaS0+dXNlZF9zdGFnZV9idWZfbnVtID4gMCkgeworCQkJcmVzZXRfcHJvY2Vzc190aW1lKHBiaSk7CisJCQlnZXRfczFfYnVmKHBiaSk7CisKKwkJCWlmIChnZXRfbXZfYnVmKHBiaSwKKwkJCQkmcGJpLT5zMV9tdl9idWZfaW5kZXgsCisJCQkJJnBiaS0+czFfbXByZWRfbXZfd3Jfc3RhcnRfYWRkcgorCQkJCSkgPCAwKSB7CisJCQkJdnA5X3ByaW50KHBiaSwgMCwKKwkJCQkJIiVzOiBFcnJvciBnZXRfbXZfYnVmIGZhaWxcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCX0KKworCQkJaWYgKHBiaS0+czFfYnVmID09IE5VTEwpIHsKKwkJCQl2cDlfcHJpbnQocGJpLCAwLAorCQkJCQkiJXM6IEVycm9yIGdldF9zMV9idWYgZmFpbFxuIiwKKwkJCQkJX19mdW5jX18pOworCQkJCXBiaS0+cHJvY2Vzc19idXN5ID0gMDsKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQl9CisKKwkJCWZvciAoaSA9IDA7IGkgPCAoUlBNX0VORCAtIFJQTV9CRUdJTik7IGkgKz0gNCkgeworCQkJCWludCBpaTsKKwkJCQlmb3IgKGlpID0gMDsgaWkgPCA0OyBpaSsrKSB7CisJCQkJCXBiaS0+czFfYnVmLT5ycG1baSArIDMgLSBpaV0gPQorCQkJCQkJcGJpLT5ycG1fcHRyW2kgKyAzIC0gaWldOworCQkJCQlwYmktPnMxX3BhcmFtLmwuZGF0YVtpICsgaWldID0KKwkJCQkJCXBiaS0+cnBtX3B0cltpICsgMyAtIGlpXTsKKwkJCQl9CisJCQl9CisKKwkJCW1wcmVkX3Byb2Nlc3MocGJpKTsKKyNpZmRlZiBGQl9ERUNPRElOR19URVNUX1NDSEVEVUxFCisJCQlwYmktPmRlY19zMV9yZXN1bHQgPQorCQkJCURFQ19TMV9SRVNVTFRfVEVTVF9UUklHR0VSX0RPTkU7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJnBiaS0+czFfd29yayk7CisjZWxzZQorCQkJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9GQl9NTVVfTUFQX0FERFIsCisJCQkJcGJpLT5zdGFnZV9tbXVfbWFwX3BoeV9hZGRyICsKKwkJCQlwYmktPnMxX2J1Zi0+aW5kZXggKiBTVEFHRV9NTVVfTUFQX1NJWkUpOworCisJCQlzdGFydF9zMV9kZWNvZGluZyhwYmkpOworI2VuZGlmCisJCQlzdGFydF9wcm9jZXNzX3RpbWUocGJpKTsKKwkJCXBiaS0+cHJvY2Vzc19idXN5ID0gMDsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfSBlbHNlCisjZW5kaWYKKwkJeworCQkJQVRSQUNFX0NPVU5URVIocGJpLT50cmFjZS5kZWNvZGVfaGVhZGVyX21lbW9yeV90aW1lX25hbWUsIFRSQUNFX0hFQURFUl9SUE1fU1RBUlQpOworCQkJZm9yIChpID0gMDsgaSA8IChSUE1fRU5EIC0gUlBNX0JFR0lOKTsgaSArPSA0KSB7CisJCQkJaW50IGlpOworCQkJCWZvciAoaWkgPSAwOyBpaSA8IDQ7IGlpKyspCisJCQkJCXBiaS0+dnA5X3BhcmFtLmwuZGF0YVtpICsgaWldID0KKwkJCQkJCXBiaS0+cnBtX3B0cltpICsgMyAtIGlpXTsKKwkJCX0KKwkJCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UuZGVjb2RlX2hlYWRlcl9tZW1vcnlfdGltZV9uYW1lLCBUUkFDRV9IRUFERVJfUlBNX0VORCk7CisJCX0KKwl9CisKKwlpZiAocGJpLT5pc191c2VkX3Y0bCkgeworCQlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCQkoc3RydWN0IGFtbF92Y29kZWNfY3R4ICopKHBiaS0+djRsMl9jdHgpOworCisJCXBiaS0+ZnJhbWVfd2lkdGggPSBwYmktPnZwOV9wYXJhbS5wLndpZHRoOworCQlwYmktPmZyYW1lX2hlaWdodCA9IHBiaS0+dnA5X3BhcmFtLnAuaGVpZ2h0OworCisJCWlmIChpc19vdmVyc2l6ZShwYmktPmZyYW1lX3dpZHRoLCBwYmktPmZyYW1lX2hlaWdodCkpIHsKKwkJCWNvbnRpbnVlX2RlY29kaW5nKHBiaSk7CisJCQl2cDlfcHJpbnQocGJpLCAwLCAicGljIHNpemUoJWQgeCAlZCkgaXMgb3ZlcnNpemVcbiIsCisJCQkJcGJpLT5mcmFtZV93aWR0aCwgcGJpLT5mcmFtZV9oZWlnaHQpOworCQkJaWYgKHBiaS0+bV9pbnNfZmxhZykKKwkJCQlzdGFydF9wcm9jZXNzX3RpbWUocGJpKTsKKwkJCXBiaS0+cG9zdHByb2NfZG9uZSA9IDA7CisJCQlwYmktPnByb2Nlc3NfYnVzeSA9IDA7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKworCQlpZiAoIXY0bF9yZXNfY2hhbmdlKHBiaSkpIHsKKwkJCWlmIChjdHgtPnBhcmFtX3NldHNfZnJvbV91Y29kZSAmJiAhcGJpLT52NGxfcGFyYW1zX3BhcnNlZCkgeworCQkJCXN0cnVjdCBhbWxfdmRlY19wc19pbmZvcyBwczsKKwkJCQlzdHJ1Y3QgdmRlY19jb21wX2J1Zl9pbmZvIGNvbXA7CisKKwkJCQlwcl9kZWJ1Zygic2V0IHVjb2RlIHBhcnNlXG4iKTsKKwkJCQlpZiAoZ2V0X3ZhbGlkX2RvdWJsZV93cml0ZV9tb2RlKHBiaSkgIT0gMTYpIHsKKwkJCQkJdnZwOV9nZXRfY29tcF9idWZfaW5mbyhwYmksICZjb21wKTsKKwkJCQkJdmRlY192NGxfc2V0X2NvbXBfYnVmX2luZm8oY3R4LCAmY29tcCk7CisJCQkJfQorCisJCQkJdnZwOV9nZXRfcHNfaW5mbyhwYmksICZwcyk7CisJCQkJLypub3RpY2UgdGhlIHY0bDIgY29kZWMuKi8KKwkJCQl2ZGVjX3Y0bF9zZXRfcHNfaW5mb3MoY3R4LCAmcHMpOworCisJCQkJcGJpLT5pbml0X3BpY193ID0gcGJpLT5mcmFtZV93aWR0aDsKKwkJCQlwYmktPmluaXRfcGljX2ggPSBwYmktPmZyYW1lX2hlaWdodDsKKworCQkJCXBiaS0+bGFzdF93aWR0aCA9IHBiaS0+ZnJhbWVfd2lkdGg7CisJCQkJcGJpLT5sYXN0X2hlaWdodCA9IHBiaS0+ZnJhbWVfaGVpZ2h0OworCisJCQkJcGJpLT52NGxfcGFyYW1zX3BhcnNlZAk9IHRydWU7CisJCQkJcGJpLT5wb3N0cHJvY19kb25lID0gMDsKKwkJCQlwYmktPnByb2Nlc3NfYnVzeSA9IDA7CisJCQkJQVRSQUNFX0NPVU5URVIocGJpLT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9USFJFQURfSEVBRF9FTkQpOworCQkJCWRlY19hZ2Fpbl9wcm9jZXNzKHBiaSk7CisJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIXBiaS0+cGljX2xpc3RfaW5pdF9kb25lKSB7CisJCQkJCXN0cnVjdCB2ZGVjX3BpY19pbmZvIHBpYzsKKworCQkJCQl2ZGVjX3Y0bF9nZXRfcGljX2luZm8oY3R4LCAmcGljKTsKKwkJCQkJcGJpLT51c2VkX2J1Zl9udW0gPSBwaWMuZHBiX2ZyYW1lcyArCisJCQkJCQlwaWMuZHBiX21hcmdpbjsKKwkJCQkJaW5pdF9waWNfbGlzdChwYmkpOworCQkJCQlpbml0X3BpY19saXN0X2h3KHBiaSk7CisKKwkJCQkJaW5pdF9tdl9idWZfbGlzdChwYmkpOworCQkJCQlwYmktPnBpY19saXN0X2luaXRfZG9uZSA9IHRydWU7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJcGJpLT5wb3N0cHJvY19kb25lID0gMDsKKwkJCXBiaS0+cHJvY2Vzc19idXN5ID0gMDsKKwkJCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9JU1JfVEhSRUFEX0hFQURfRU5EKTsKKwkJCWRlY19hZ2Fpbl9wcm9jZXNzKHBiaSk7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKwl9CisKKwljb250aW51ZV9kZWNvZGluZyhwYmkpOworCXBiaS0+cG9zdHByb2NfZG9uZSA9IDA7CisJcGJpLT5wcm9jZXNzX2J1c3kgPSAwOworCisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCWlmIChwYmktPm1faW5zX2ZsYWcpCisJCXN0YXJ0X3Byb2Nlc3NfdGltZShwYmkpOworI2VuZGlmCisJQVRSQUNFX0NPVU5URVIocGJpLT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX0lTUl9USFJFQURfSEVBRF9FTkQpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IHZ2cDlfaXNyKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IGRlY19zdGF0dXM7CisJc3RydWN0IFZQOURlY29kZXJfcyAqcGJpID0gKHN0cnVjdCBWUDlEZWNvZGVyX3MgKilkYXRhOworCXVuc2lnbmVkIGludCBhZGFwdF9wcm9iX3N0YXR1czsKKwl1aW50IGRlYnVnX3RhZzsKKworCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTUJPWDBfQ0xSX1JFRywgMSk7CisJZGVjX3N0YXR1cyA9IFJFQURfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHKTsKKwlBVFJBQ0VfQ09VTlRFUigiVl9TVF9ERUMtZGVjb2RlX3N0YXRlIiwgZGVjX3N0YXR1cyk7CisKKwlpZiAoZGVjX3N0YXR1cyA9PSBWUDlfSEVBRF9QQVJTRVJfRE9ORSkgeworCQlBVFJBQ0VfQ09VTlRFUihwYmktPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX0hFQURfRE9ORSk7CisJfQorCWVsc2UgaWYgKGRlY19zdGF0dXMgPT0gSEVWQ19ERUNQSUNfREFUQV9ET05FKSB7CisJCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9JU1JfUElDX0RPTkUpOworCX0KKworCWFkYXB0X3Byb2Jfc3RhdHVzID0gUkVBRF9WUkVHKFZQOV9BREFQVF9QUk9CX1JFRyk7CisJaWYgKCFwYmkpCisJCXJldHVybiBJUlFfSEFORExFRDsKKwlpZiAocGJpLT5pbml0X2ZsYWcgPT0gMCkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCWlmIChwYmktPnByb2Nlc3NfYnVzeSkgeyAvKm9uIHByb2Nlc3MuKi8KKwkJdnA5X3ByaW50KHBiaSwgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCSIlczogcHJvY2Vzc19idXN5IGlzciByZXR1cm5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwlwYmktPmRlY19zdGF0dXMgPSBkZWNfc3RhdHVzOworCXBiaS0+cHJvY2Vzc19idXN5ID0gMTsKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfQlVGTUdSKQorCQlwcl9pbmZvKCJ2cDkgaXNyICglZCkgZGVjIHN0YXR1cyAgPSAweCV4LCBsY3UgMHgleCBzaGlmdGJ5dGUgMHgleCAoJXggJXggbGV2ICV4LCB3ciAleCwgcmQgJXgpXG4iLAorCQkJaXJxLAorCQkJZGVjX3N0YXR1cywgUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0xDVV9TVEFSVCksCisJCQlSRUFEX1ZSRUcoSEVWQ19TSElGVF9CWVRFX0NPVU5UKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9TVEFSVF9BRERSKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9FTkRfQUREUiksCisJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fTEVWRUwpLAorCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1dSX1BUUiksCisJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSKQorCQkpOworI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKKwkvKmlmIChpcnEgIT0gVkRFQ19JUlFfMCkKKwkJcmV0dXJuIElSUV9XQUtFX1RIUkVBRDsqLworI2VuZGlmCisKKwlkZWJ1Z190YWcgPSBSRUFEX0hSRUcoREVCVUdfUkVHMSk7CisJaWYgKGRlYnVnX3RhZyAmIDB4MTAwMDApIHsKKwkJcHJfaW5mbygiTE1FTTx0YWcgJXg+OlxuIiwgUkVBRF9IUkVHKERFQlVHX1JFRzEpKTsKKwkJZm9yIChpID0gMDsgaSA8IDB4NDAwOyBpICs9IDQpIHsKKwkJCWludCBpaTsKKwkJCWlmICgoaSAmIDB4ZikgPT0gMCkKKwkJCQlwcl9pbmZvKCIlMDN4OiAiLCBpKTsKKwkJCWZvciAoaWkgPSAwOyBpaSA8IDQ7IGlpKyspIHsKKwkJCQlwcl9pbmZvKCIlMDR4ICIsCisJCQkJCSAgIHBiaS0+bG1lbV9wdHJbaSArIDMgLSBpaV0pOworCQkJfQorCQkJaWYgKCgoaSArIGlpKSAmIDB4ZikgPT0gMCkKKwkJCQlwcl9pbmZvKCJcbiIpOworCQl9CisKKwkJaWYgKCh1ZGVidWdfcGF1c2VfcG9zID09IChkZWJ1Z190YWcgJiAweGZmZmYpKSAmJgorCQkJKHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4ID09IDAgfHwKKwkJCXVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4ID09IHBiaS0+c2xpY2VfaWR4KSAmJgorCQkJKHVkZWJ1Z19wYXVzZV92YWwgPT0gMCB8fAorCQkJdWRlYnVnX3BhdXNlX3ZhbCA9PSBSRUFEX0hSRUcoREVCVUdfUkVHMikpKQorCQkJcGJpLT51Y29kZV9wYXVzZV9wb3MgPSB1ZGVidWdfcGF1c2VfcG9zOworCQllbHNlIGlmIChkZWJ1Z190YWcgJiAweDIwMDAwKQorCQkJcGJpLT51Y29kZV9wYXVzZV9wb3MgPSAweGZmZmZmZmZmOworCQlpZiAocGJpLT51Y29kZV9wYXVzZV9wb3MpCisJCQlyZXNldF9wcm9jZXNzX3RpbWUocGJpKTsKKwkJZWxzZQorCQkJV1JJVEVfSFJFRyhERUJVR19SRUcxLCAwKTsKKwl9IGVsc2UgaWYgKGRlYnVnX3RhZyAhPSAwKSB7CisJCXByX2luZm8oCisJCQkiZGJnJXg6ICV4IGxjdSAleFxuIiwgUkVBRF9IUkVHKERFQlVHX1JFRzEpLAorCQkJICAgUkVBRF9IUkVHKERFQlVHX1JFRzIpLAorCQkJICAgUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0xDVV9TVEFSVCkpOworCQlpZiAoKHVkZWJ1Z19wYXVzZV9wb3MgPT0gKGRlYnVnX3RhZyAmIDB4ZmZmZikpICYmCisJCQkodWRlYnVnX3BhdXNlX2RlY29kZV9pZHggPT0gMCB8fAorCQkJdWRlYnVnX3BhdXNlX2RlY29kZV9pZHggPT0gcGJpLT5zbGljZV9pZHgpICYmCisJCQkodWRlYnVnX3BhdXNlX3ZhbCA9PSAwIHx8CisJCQl1ZGVidWdfcGF1c2VfdmFsID09IFJFQURfSFJFRyhERUJVR19SRUcyKSkpCisJCQlwYmktPnVjb2RlX3BhdXNlX3BvcyA9IHVkZWJ1Z19wYXVzZV9wb3M7CisJCWlmIChwYmktPnVjb2RlX3BhdXNlX3BvcykKKwkJCXJlc2V0X3Byb2Nlc3NfdGltZShwYmkpOworCQllbHNlCisJCQlXUklURV9IUkVHKERFQlVHX1JFRzEsIDApOworCQlwYmktPnByb2Nlc3NfYnVzeSA9IDA7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJaWYgKCFwYmktPm1faW5zX2ZsYWcpIHsKKyNlbmRpZgorCQlpZiAocGJpLT5lcnJvcl9mbGFnID09IDEpIHsKKwkJCXBiaS0+ZXJyb3JfZmxhZyA9IDI7CisJCQlwYmktPnByb2Nlc3NfYnVzeSA9IDA7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0gZWxzZSBpZiAocGJpLT5lcnJvcl9mbGFnID09IDMpIHsKKwkJCXBiaS0+cHJvY2Vzc19idXN5ID0gMDsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCisJCWlmIChnZXRfZnJlZV9idWZfY291bnQocGJpKSA8PSAwKSB7CisJCQkvKgorCQkJaWYgKHBiaS0+d2FpdF9idWYgPT0gMCkKKwkJCQlwcl9pbmZvKCJzZXQgd2FpdF9idWYgdG8gMVxyXG4iKTsKKwkJCSovCisJCQlwYmktPndhaXRfYnVmID0gMTsKKwkJCXBiaS0+cHJvY2Vzc19idXN5ID0gMDsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwl9CisjZW5kaWYKKwlpZiAoKGFkYXB0X3Byb2Jfc3RhdHVzICYgMHhmZikgPT0gMHhmZCkgeworCQlzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjb25zdCBjbSA9ICZwYmktPmNvbW1vbjsKKwkJaW50IHByZV9mYyA9IDA7CisKKwkJaWYgKHBiaS0+bV9pbnNfZmxhZykKKwkJCQlyZXNldF9wcm9jZXNzX3RpbWUocGJpKTsKKworCQlpZiAoKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfRzEyQSkgJiYKKwkJCSh2ZGVjX3NlY3VyZShod190b192ZGVjKHBiaSkpKSkgeworCQkJcHJlX2ZjID0gKChjbS0+ZnJhbWVfdHlwZSA9PSBLRVlfRlJBTUUpIHx8IChjbS0+aW50cmFfb25seSkpID8gMCA6IDE7CisJCQl0ZWVfdnA5X3Byb2JfcHJvY2VzcyhwcmVfZmMsIGNtLT5sYXN0X2ZyYW1lX3R5cGUsCisJCQkJYWRhcHRfcHJvYl9zdGF0dXMsICh1bnNpZ25lZCBpbnQpcGJpLT5wcm9iX2J1ZmZlcl9waHlfYWRkcik7CisJCX0gZWxzZSB7CisJCQl1aW50OF90ICpwcmV2X3Byb2JfYiwgKmN1cl9wcm9iX2IsICpjb3VudF9iOworCisJCQkvKlZQOV9SRVFfQURBUFRfUFJPQiovCisJCQlwcmVfZmMgPSAoKGNtLT5mcmFtZV90eXBlID09IEtFWV9GUkFNRSkgfHwgKGNtLT5pbnRyYV9vbmx5KSk7CisJCQlwcmV2X3Byb2JfYiA9ICgodWludDhfdCAqKXBiaS0+cHJvYl9idWZmZXJfYWRkcikgKworCQkJCSgoYWRhcHRfcHJvYl9zdGF0dXMgPj4gOCkgKiAweDEwMDApOworCQkJY3VyX3Byb2JfYiA9ICgodWludDhfdCAqKXBiaS0+cHJvYl9idWZmZXJfYWRkcikgKyAweDQwMDA7CisJCQljb3VudF9iID0gKHVpbnQ4X3QgKilwYmktPmNvdW50X2J1ZmZlcl9hZGRyOworCisJCQlhZGFwdF9jb2VmX3Byb2JzKHBiaS0+cGljX2NvdW50LAorCQkJCShjbS0+bGFzdF9mcmFtZV90eXBlID09IEtFWV9GUkFNRSksCisJCQkJcHJlX2ZjLCAoYWRhcHRfcHJvYl9zdGF0dXMgPj4gOCksCisJCQkJKHVuc2lnbmVkIGludCAqKXByZXZfcHJvYl9iLAorCQkJCSh1bnNpZ25lZCBpbnQgKiljdXJfcHJvYl9iLCAodW5zaWduZWQgaW50ICopY291bnRfYik7CisKKwkJCW1lbWNweShwcmV2X3Byb2JfYiwgY3VyX3Byb2JfYiwgUFJPQl9TSVpFKTsKKwkJfQorCisJCVdSSVRFX1ZSRUcoVlA5X0FEQVBUX1BST0JfUkVHLCAwKTsKKwkJcGJpLT5waWNfY291bnQgKz0gMTsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCWlmIChwYmktPm1faW5zX2ZsYWcpCisJCQlzdGFydF9wcm9jZXNzX3RpbWUocGJpKTsKKyNlbmRpZgorCX0KKwlBVFJBQ0VfQ09VTlRFUihwYmktPnRyYWNlLmRlY29kZV90aW1lX25hbWUsIERFQ09ERVJfSVNSX0VORCk7CisJcmV0dXJuIElSUV9XQUtFX1RIUkVBRDsKK30KKworc3RhdGljIHZvaWQgdnA5X3NldF9jbGsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQlzdHJ1Y3QgVlA5RGVjb2Rlcl9zLCBzZXRfY2xrX3dvcmspOworCWludCBmcHMgPSA5NjAwMCAvIHBiaS0+ZnJhbWVfZHVyOworCisJaWYgKGhldmNfc291cmNlX2NoYW5nZWQoVkZPUk1BVF9WUDksCisJCWZyYW1lX3dpZHRoLCBmcmFtZV9oZWlnaHQsIGZwcykgPiAwKQorCQlwYmktPnNhdmVkX3Jlc29sdXRpb24gPSBmcmFtZV93aWR0aCAqCisJCWZyYW1lX2hlaWdodCAqIGZwczsKK30KKworc3RhdGljIHZvaWQgdnZwOV9wdXRfdGltZXJfZnVuYyhzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpCit7CisJc3RydWN0IFZQOURlY29kZXJfcyAqcGJpID0gY29udGFpbmVyX29mKHRpbWVyLAorCQlzdHJ1Y3QgVlA5RGVjb2Rlcl9zLCB0aW1lcik7CisJZW51bSByZWNldml2ZXJfc3RhcnRfZSBzdGF0ZSA9IFJFQ0VJVkVSX0lOQUNUSVZFOworCXVpbnQ4X3QgZW1wdHlfZmxhZzsKKwl1bnNpZ25lZCBpbnQgYnVmX2xldmVsOworCisJaWYgKHBiaS0+bV9pbnNfZmxhZykgeworCQlpZiAoaHdfdG9fdmRlYyhwYmkpLT5uZXh0X3N0YXR1cworCQkJPT0gVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEICYmCisJCQkhcGJpLT5pc191c2VkX3Y0bCkgeworI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKKwkJCWlmIChwYmktPnJ1bjJfYnVzeSkKKwkJCQlyZXR1cm47CisKKwkJCXBiaS0+ZGVjX3MxX3Jlc3VsdCA9IERFQ19TMV9SRVNVTFRfRk9SQ0VfRVhJVDsKKwkJCXZkZWNfc2NoZWR1bGVfd29yaygmcGJpLT5zMV93b3JrKTsKKyNlbmRpZgorCQkJcGJpLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9GT1JDRV9FWElUOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZwYmktPndvcmspOworCQkJcHJfZGVidWcoCisJCQkidmRlYyByZXF1ZXN0ZWQgdG8gYmUgZGlzY29ubmVjdGVkXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlpZiAocGJpLT5pbml0X2ZsYWcgPT0gMCkgeworCQlpZiAocGJpLT5zdGF0ICYgU1RBVF9USU1FUl9BUk0pIHsKKwkJCXRpbWVyLT5leHBpcmVzID0gamlmZmllcyArIFBVVF9JTlRFUlZBTDsKKwkJCWFkZF90aW1lcigmcGJpLT50aW1lcik7CisJCX0KKwkJcmV0dXJuOworCX0KKwlpZiAocGJpLT5tX2luc19mbGFnID09IDApIHsKKwkJaWYgKHZmX2dldF9yZWNlaXZlcihwYmktPnByb3ZpZGVyX25hbWUpKSB7CisJCQlzdGF0ZSA9CisJCQkJdmZfbm90aWZ5X3JlY2VpdmVyKHBiaS0+cHJvdmlkZXJfbmFtZSwKKwkJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1FVUkVZX1NUQVRFLAorCQkJCQlOVUxMKTsKKwkJCWlmICgoc3RhdGUgPT0gUkVDRUlWRVJfU1RBVEVfTlVMTCkKKwkJCQl8fCAoc3RhdGUgPT0gUkVDRUlWRVJfU1RBVEVfTk9ORSkpCisJCQkJc3RhdGUgPSBSRUNFSVZFUl9JTkFDVElWRTsKKwkJfSBlbHNlCisJCQlzdGF0ZSA9IFJFQ0VJVkVSX0lOQUNUSVZFOworCisJCWVtcHR5X2ZsYWcgPSAoUkVBRF9WUkVHKEhFVkNfUEFSU0VSX0lOVF9TVEFUVVMpID4+IDYpICYgMHgxOworCQkvKiBlcnJvciB3YXRjaGRvZyAqLworCQlpZiAoZW1wdHlfZmxhZyA9PSAwKSB7CisJCQkvKiBkZWNvZGVyIGhhcyBpbnB1dCAqLworCQkJaWYgKChkZWJ1ZyAmIFZQOV9ERUJVR19ESVNfTE9DX0VSUk9SX1BST0MpID09IDApIHsKKworCQkJCWJ1Zl9sZXZlbCA9IFJFQURfVlJFRyhIRVZDX1NUUkVBTV9MRVZFTCk7CisJCQkJLyogcmVjZWl2ZXIgaGFzIG5vIGJ1ZmZlciB0byByZWN5Y2xlICovCisJCQkJaWYgKChzdGF0ZSA9PSBSRUNFSVZFUl9JTkFDVElWRSkgJiYKKwkJCQkJKGtmaWZvX2lzX2VtcHR5KCZwYmktPmRpc3BsYXlfcSkgJiYKKwkJCQkJIGJ1Zl9sZXZlbCA+IDB4MjAwKQorCQkJCQkpIHsKKwkJCQkJCVdSSVRFX1ZSRUcKKwkJCQkJCShIRVZDX0FTU0lTVF9NQk9YMF9JUlFfUkVHLAorCQkJCQkJIDB4MSk7CisJCQkJfQorCQkJfQorCisJCQlpZiAoKGRlYnVnICYgVlA5X0RFQlVHX0RJU19TWVNfRVJST1JfUFJPQykgPT0gMCkgeworCQkJCS8qIHJlY2VpdmVyIGhhcyBubyBidWZmZXIgdG8gcmVjeWNsZSAqLworCQkJCS8qaWYgKChzdGF0ZSA9PSBSRUNFSVZFUl9JTkFDVElWRSkgJiYKKwkJCQkgKgkoa2ZpZm9faXNfZW1wdHkoJnBiaS0+ZGlzcGxheV9xKSkpIHsKKwkJCQkgKnByX2luZm8oInZwOSBzb21ldGhpbmcgZXJyb3IsbmVlZCByZXNldFxuIik7CisJCQkJICp9CisJCQkJICovCisJCQl9CisJCX0KKwl9CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCWVsc2UgeworCQlpZiAoCisJCQkoZGVjb2RlX3RpbWVvdXRfdmFsID4gMCkgJiYKKwkJCShwYmktPnN0YXJ0X3Byb2Nlc3NfdGltZSA+IDApICYmCisJCQkoKDEwMDAgKiAoamlmZmllcyAtIHBiaS0+c3RhcnRfcHJvY2Vzc190aW1lKSAvIEhaKQorCQkJCT4gZGVjb2RlX3RpbWVvdXRfdmFsKQorCQkpIHsKKwkJCWludCBjdXJyZW50X2xjdV9pZHggPQorCQkJCVJFQURfVlJFRyhIRVZDX1BBUlNFUl9MQ1VfU1RBUlQpCisJCQkJJiAweGZmZmZmZjsKKwkJCWlmIChwYmktPmxhc3RfbGN1X2lkeCA9PSBjdXJyZW50X2xjdV9pZHgpIHsKKwkJCQlpZiAocGJpLT5kZWNvZGVfdGltZW91dF9jb3VudCA+IDApCisJCQkJCXBiaS0+ZGVjb2RlX3RpbWVvdXRfY291bnQtLTsKKwkJCQlpZiAocGJpLT5kZWNvZGVfdGltZW91dF9jb3VudCA9PSAwKSB7CisJCQkJCWlmIChpbnB1dF9mcmFtZV9iYXNlZCgKKwkJCQkJCWh3X3RvX3ZkZWMocGJpKSkgfHwKKwkJCQkJKFJFQURfVlJFRyhIRVZDX1NUUkVBTV9MRVZFTCkgPiAweDIwMCkpCisJCQkJCQl0aW1lb3V0X3Byb2Nlc3MocGJpKTsKKwkJCQkJZWxzZSB7CisJCQkJCQl2cDlfcHJpbnQocGJpLCAwLAorCQkJCQkJCSJ0aW1lb3V0ICYgZW1wdHksIGFnYWluXG4iKTsKKwkJCQkJCWRlY19hZ2Fpbl9wcm9jZXNzKHBiaSk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXN0YXJ0X3Byb2Nlc3NfdGltZShwYmkpOworCQkJCXBiaS0+bGFzdF9sY3VfaWR4ID0gY3VycmVudF9sY3VfaWR4OworCQkJfQorCQl9CisJfQorI2VuZGlmCisKKwlpZiAoKHBiaS0+dWNvZGVfcGF1c2VfcG9zICE9IDApICYmCisJCShwYmktPnVjb2RlX3BhdXNlX3BvcyAhPSAweGZmZmZmZmZmKSAmJgorCQl1ZGVidWdfcGF1c2VfcG9zICE9IHBiaS0+dWNvZGVfcGF1c2VfcG9zKSB7CisJCXBiaS0+dWNvZGVfcGF1c2VfcG9zID0gMDsKKwkJV1JJVEVfSFJFRyhERUJVR19SRUcxLCAwKTsKKwl9CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19GT1JDRV9TRU5EX0FHQUlOKSB7CisJCXByX2luZm8oCisJCSJGb3JjZSBTZW5kIEFnYWluXHJcbiIpOworCQlkZWJ1ZyAmPSB+VlA5X0RFQlVHX0ZPUkNFX1NFTkRfQUdBSU47CisJCXJlc2V0X3Byb2Nlc3NfdGltZShwYmkpOworCQlwYmktPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0FHQUlOOworCQlpZiAocGJpLT5wcm9jZXNzX3N0YXRlID09CisJCQlQUk9DX1NUQVRFX0RFQ09ERVNMSUNFKSB7CisJCQlpZiAocGJpLT5tbXVfZW5hYmxlKQorCQkJCXZwOV9yZWN5Y2xlX21tdV9idWYocGJpKTsKKwkJCXBiaS0+cHJvY2Vzc19zdGF0ZSA9CisJCQlQUk9DX1NUQVRFX1NFTkRBR0FJTjsKKwkJfQorCQlhbWhldmNfc3RvcCgpOworCisJCXZkZWNfc2NoZWR1bGVfd29yaygmcGJpLT53b3JrKTsKKwl9CisKKwlpZiAoZGVidWcgJiBWUDlfREVCVUdfRFVNUF9EQVRBKSB7CisJCWRlYnVnICY9IH5WUDlfREVCVUdfRFVNUF9EQVRBOworCQl2cDlfcHJpbnQocGJpLCAwLAorCQkJIiVzOiBjaHVuayBzaXplIDB4JXggb2ZmIDB4JXggc3VtIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywKKwkJCXBiaS0+Y2h1bmstPnNpemUsCisJCQlwYmktPmNodW5rLT5vZmZzZXQsCisJCQlnZXRfZGF0YV9jaGVja19zdW0ocGJpLCBwYmktPmNodW5rLT5zaXplKQorCQkJKTsKKwkJZHVtcF9kYXRhKHBiaSwgcGJpLT5jaHVuay0+c2l6ZSk7CisJfQorI2VuZGlmCisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0RVTVBfUElDX0xJU1QpIHsKKwkJZHVtcF9waWNfbGlzdChwYmkpOworCQlkZWJ1ZyAmPSB+VlA5X0RFQlVHX0RVTVBfUElDX0xJU1Q7CisJfQorCWlmIChkZWJ1ZyAmIFZQOV9ERUJVR19UUklHX1NMSUNFX1NFR01FTlRfUFJPQykgeworCQlXUklURV9WUkVHKEhFVkNfQVNTSVNUX01CT1gwX0lSUV9SRUcsIDB4MSk7CisJCWRlYnVnICY9IH5WUDlfREVCVUdfVFJJR19TTElDRV9TRUdNRU5UX1BST0M7CisJfQorCS8qaWYgKGRlYnVnICYgVlA5X0RFQlVHX0hXX1JFU0VUKSB7CisJfSovCisKKwlpZiAocmFkciAhPSAwKSB7CisJCWlmIChydmFsICE9IDApIHsKKwkJCVdSSVRFX1ZSRUcocmFkciwgcnZhbCk7CisJCQlwcl9pbmZvKCJXUklURV9WUkVHKCV4LCV4KVxuIiwgcmFkciwgcnZhbCk7CisJCX0gZWxzZQorCQkJcHJfaW5mbygiUkVBRF9WUkVHKCV4KT0leFxuIiwgcmFkciwgUkVBRF9WUkVHKHJhZHIpKTsKKwkJcnZhbCA9IDA7CisJCXJhZHIgPSAwOworCX0KKwlpZiAocG9wX3Nob3J0cyAhPSAwKSB7CisJCWludCBpOworCQl1MzIgc3VtID0gMDsKKworCQlwcl9pbmZvKCJwb3Agc3RyZWFtIDB4JXggc2hvcnRzXHJcbiIsIHBvcF9zaG9ydHMpOworCQlmb3IgKGkgPSAwOyBpIDwgcG9wX3Nob3J0czsgaSsrKSB7CisJCQl1MzIgZGF0YSA9CisJCQkoUkVBRF9IUkVHKEhFVkNfU0hJRlRFRF9EQVRBKSA+PiAxNik7CisJCQlXUklURV9IUkVHKEhFVkNfU0hJRlRfQ09NTUFORCwKKwkJCSgxPDw3KXwxNik7CisJCQlpZiAoKGkgJiAweGYpID09IDApCisJCQkJcHJfaW5mbygiJTA0eDoiLCBpKTsKKwkJCXByX2luZm8oIiUwNHggIiwgZGF0YSk7CisJCQlpZiAoKChpICsgMSkgJiAweGYpID09IDApCisJCQkJcHJfaW5mbygiXHJcbiIpOworCQkJc3VtICs9IGRhdGE7CisJCX0KKwkJcHJfaW5mbygiXHJcbnN1bSA9ICV4XHJcbiIsIHN1bSk7CisJCXBvcF9zaG9ydHMgPSAwOworCX0KKwlpZiAoZGJnX2NtZCAhPSAwKSB7CisJCWlmIChkYmdfY21kID09IDEpIHsKKwkJCXUzMiBkaXNwX2xhZGRyOworCisJCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWEJCICYmCisJCQkJZ2V0X2RvdWJsZV93cml0ZV9tb2RlKHBiaSkgPT0gMCkgeworCQkJCWRpc3BfbGFkZHIgPQorCQkJCQlSRUFEX1ZDQlVTX1JFRyhBRkJDX0JPRFlfQkFERFIpIDw8IDQ7CisJCQl9IGVsc2UgeworCQkJCXN0cnVjdCBjYW52YXNfcyBjdXJfY2FudmFzOworCisJCQkJY2FudmFzX3JlYWQoKFJFQURfVkNCVVNfUkVHKFZEMV9JRjBfQ0FOVkFTMCkKKwkJCQkJJiAweGZmKSwgJmN1cl9jYW52YXMpOworCQkJCWRpc3BfbGFkZHIgPSBjdXJfY2FudmFzLmFkZHI7CisJCQl9CisJCQlwcl9pbmZvKCJjdXJyZW50IGRpc3BsYXllZCBidWZmZXIgYWRkcmVzcyAleFxyXG4iLAorCQkJCWRpc3BfbGFkZHIpOworCQl9CisJCWRiZ19jbWQgPSAwOworCX0KKwkvKmRvbid0IGNoYW5nZWQgYXQgc3RhcnQuKi8KKwlpZiAocGJpLT5nZXRfZnJhbWVfZHVyICYmIHBiaS0+c2hvd19mcmFtZV9udW0gPiA2MCAmJgorCQlwYmktPmZyYW1lX2R1ciA+IDAgJiYgcGJpLT5zYXZlZF9yZXNvbHV0aW9uICE9CisJCWZyYW1lX3dpZHRoICogZnJhbWVfaGVpZ2h0ICoKKwkJCSg5NjAwMCAvIHBiaS0+ZnJhbWVfZHVyKSkKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZwYmktPnNldF9jbGtfd29yayk7CisKKwl0aW1lci0+ZXhwaXJlcyA9IGppZmZpZXMgKyBQVVRfSU5URVJWQUw7CisJYWRkX3RpbWVyKHRpbWVyKTsKK30KKworCitpbnQgdnZwOV9kZWNfc3RhdHVzKHN0cnVjdCB2ZGVjX3MgKnZkZWMsIHN0cnVjdCB2ZGVjX2luZm8gKnZzdGF0dXMpCit7CisJc3RydWN0IFZQOURlY29kZXJfcyAqdnA5ID0KKwkJKHN0cnVjdCBWUDlEZWNvZGVyX3MgKil2ZGVjLT5wcml2YXRlOworCisJaWYgKCF2cDkpCisJCXJldHVybiAtMTsKKworCXZzdGF0dXMtPmZyYW1lX3dpZHRoID0gZnJhbWVfd2lkdGg7CisJdnN0YXR1cy0+ZnJhbWVfaGVpZ2h0ID0gZnJhbWVfaGVpZ2h0OworCWlmICh2cDktPmVycm9yX2ZyYW1lX3dpZHRoICYmCisJCXZwOS0+ZXJyb3JfZnJhbWVfaGVpZ2h0KSB7CisJCXZzdGF0dXMtPmZyYW1lX3dpZHRoID0gdnA5LT5lcnJvcl9mcmFtZV93aWR0aDsKKwkJdnN0YXR1cy0+ZnJhbWVfaGVpZ2h0ID0gdnA5LT5lcnJvcl9mcmFtZV9oZWlnaHQ7CisJfQorCisJaWYgKHZwOS0+ZnJhbWVfZHVyICE9IDApCisJCXZzdGF0dXMtPmZyYW1lX3JhdGUgPSAoKDk2MDAwICogMTAgLyB2cDktPmZyYW1lX2R1cikgJSAxMCkgPCA1ID8KKwkJCQk5NjAwMCAvIHZwOS0+ZnJhbWVfZHVyIDogKDk2MDAwIC8gdnA5LT5mcmFtZV9kdXIgKzEpOworCWVsc2UKKwkJdnN0YXR1cy0+ZnJhbWVfcmF0ZSA9IC0xOworCXZzdGF0dXMtPmVycm9yX2NvdW50ID0gMDsKKwl2c3RhdHVzLT5zdGF0dXMgPSB2cDktPnN0YXQgfCB2cDktPmZhdGFsX2Vycm9yOworCXZzdGF0dXMtPmZyYW1lX2R1ciA9IHZwOS0+ZnJhbWVfZHVyOworCXZzdGF0dXMtPmJpdF9yYXRlID0gdnA5LT5ndnMtPmJpdF9yYXRlOworCXZzdGF0dXMtPmZyYW1lX2RhdGEgPSB2cDktPmd2cy0+ZnJhbWVfZGF0YTsKKwl2c3RhdHVzLT50b3RhbF9kYXRhID0gdnA5LT5ndnMtPnRvdGFsX2RhdGE7CisJdnN0YXR1cy0+ZnJhbWVfY291bnQgPSB2cDktPmd2cy0+ZnJhbWVfY291bnQ7CisJdnN0YXR1cy0+ZXJyb3JfZnJhbWVfY291bnQgPSB2cDktPmd2cy0+ZXJyb3JfZnJhbWVfY291bnQ7CisJdnN0YXR1cy0+ZHJvcF9mcmFtZV9jb3VudCA9IHZwOS0+Z3ZzLT5kcm9wX2ZyYW1lX2NvdW50OworCXZzdGF0dXMtPmlfZGVjb2RlZF9mcmFtZXMgPSB2cDktPmd2cy0+aV9kZWNvZGVkX2ZyYW1lczsKKwl2c3RhdHVzLT5pX2xvc3RfZnJhbWVzID0gdnA5LT5ndnMtPmlfbG9zdF9mcmFtZXM7CisJdnN0YXR1cy0+aV9jb25jZWFsZWRfZnJhbWVzID0gdnA5LT5ndnMtPmlfY29uY2VhbGVkX2ZyYW1lczsKKwl2c3RhdHVzLT5wX2RlY29kZWRfZnJhbWVzID0gdnA5LT5ndnMtPnBfZGVjb2RlZF9mcmFtZXM7CisJdnN0YXR1cy0+cF9sb3N0X2ZyYW1lcyA9IHZwOS0+Z3ZzLT5wX2xvc3RfZnJhbWVzOworCXZzdGF0dXMtPnBfY29uY2VhbGVkX2ZyYW1lcyA9IHZwOS0+Z3ZzLT5wX2NvbmNlYWxlZF9mcmFtZXM7CisJdnN0YXR1cy0+Yl9kZWNvZGVkX2ZyYW1lcyA9IHZwOS0+Z3ZzLT5iX2RlY29kZWRfZnJhbWVzOworCXZzdGF0dXMtPmJfbG9zdF9mcmFtZXMgPSB2cDktPmd2cy0+Yl9sb3N0X2ZyYW1lczsKKwl2c3RhdHVzLT5iX2NvbmNlYWxlZF9mcmFtZXMgPSB2cDktPmd2cy0+Yl9jb25jZWFsZWRfZnJhbWVzOworCXZzdGF0dXMtPnRvdGFsX2RhdGEgPSB2cDktPmd2cy0+dG90YWxfZGF0YTsKKwl2c3RhdHVzLT5zYW1wX2NudCA9IHZwOS0+Z3ZzLT5zYW1wX2NudDsKKwl2c3RhdHVzLT5vZmZzZXQgPSB2cDktPmd2cy0+b2Zmc2V0OworCXNucHJpbnRmKHZzdGF0dXMtPnZkZWNfbmFtZSwgc2l6ZW9mKHZzdGF0dXMtPnZkZWNfbmFtZSksCisJCSIlcyIsIERSSVZFUl9OQU1FKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHZ2cDlfc2V0X2lzcmVzZXQoc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGlzcmVzZXQpCit7CisJaXNfcmVzZXQgPSBpc3Jlc2V0OworCXJldHVybiAwOworfQorCisjaWYgMAorc3RhdGljIHZvaWQgVlA5X0RFQ09ERV9JTklUKHZvaWQpCit7CisJLyogZW5hYmxlIHZwOSBjbG9ja3MgKi8KKwlXUklURV9WUkVHKERPU19HQ0xLX0VOMywgMHhmZmZmZmZmZik7CisJLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisJLyogUG93ZXIgT04gSEVWQyAqLworCS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCS8qIFBvd2VydXAgSEVWQyAqLworCVdSSVRFX1ZSRUcoQU9fUlRJX0dFTl9QV1JfU0xFRVAwLAorCQkJUkVBRF9WUkVHKEFPX1JUSV9HRU5fUFdSX1NMRUVQMCkgJiAofigweDMgPDwgNikpKTsKKwlXUklURV9WUkVHKERPU19NRU1fUERfSEVWQywgMHgwKTsKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDMsIFJFQURfVlJFRyhET1NfU1dfUkVTRVQzKSB8ICgweDNmZmZmIDw8IDIpKTsKKwlXUklURV9WUkVHKERPU19TV19SRVNFVDMsIFJFQURfVlJFRyhET1NfU1dfUkVTRVQzKSAmICh+KDB4M2ZmZmYgPDwgMikpKTsKKwkvKiByZW1vdmUgaXNvbGF0aW9ucyAqLworCVdSSVRFX1ZSRUcoQU9fUlRJX0dFTl9QV1JfSVNPMCwKKwkJCVJFQURfVlJFRyhBT19SVElfR0VOX1BXUl9JU08wKSAmICh+KDB4MyA8PCAxMCkpKTsKKworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHZ2cDlfcHJvdF9pbml0KHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwgdTMyIG1hc2spCit7CisJdW5zaWduZWQgaW50IGRhdGEzMjsKKwkvKiBWUDlfREVDT0RFX0lOSVQoKTsgKi8KKwl2cDlfY29uZmlnX3dvcmtfc3BhY2VfaHcocGJpLCBtYXNrKTsKKwlpZiAobWFzayAmIEhXX01BU0tfQkFDSykKKwkJaW5pdF9waWNfbGlzdF9odyhwYmkpOworCisJdnA5X2luaXRfZGVjb2Rlcl9odyhwYmksIG1hc2spOworCisjaWZkZWYgVlA5X0xQRl9MVkxfVVBEQVRFCisJaWYgKG1hc2sgJiBIV19NQVNLX0JBQ0spCisJCXZwOV9sb29wX2ZpbHRlcl9pbml0KHBiaSk7CisjZW5kaWYKKworCWlmICgobWFzayAmIEhXX01BU0tfRlJPTlQpID09IDApCisJCXJldHVybjsKKyNpZiAxCisJaWYgKGRlYnVnICYgVlA5X0RFQlVHX0JVRk1HUl9NT1JFKQorCQlwcl9pbmZvKCIlc1xuIiwgX19mdW5jX18pOworCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NUUkVBTV9DT05UUk9MKTsKKwlkYXRhMzIgPSBkYXRhMzIgfAorCQkoMSA8PCAwKS8qc3RyZWFtX2ZldGNoX2VuYWJsZSovCisJCTsKKwlXUklURV9WUkVHKEhFVkNfU1RSRUFNX0NPTlRST0wsIGRhdGEzMik7CisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKSB7CisJICAgIGlmIChkZWJ1ZyAmIFZQOV9ERUJVR19CVUZNR1IpCisJICAgICAgICBwcl9pbmZvKCJbdGVzdC5jXSBDb25maWcgU1RSRUFNX0ZJRk9fQ1RMXG4iKTsKKwkgICAgZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0ZJRk9fQ1RMKTsKKwkgICAgZGF0YTMyID0gZGF0YTMyIHwKKwkgICAgICAgICAgICAgKDEgPDwgMjkpIC8vIHN0cmVhbV9maWZvX2hvbGUKKwkgICAgICAgICAgICAgOworCSAgICBXUklURV9WUkVHKEhFVkNfU1RSRUFNX0ZJRk9fQ1RMLCBkYXRhMzIpOworCX0KKyNpZiAwCisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0hJRlRfU1RBUlRDT0RFKTsKKwlpZiAoZGF0YTMyICE9IDB4MDAwMDAxMDApIHsKKwkJcHJfaW5mbygidnA5IHByb3QgaW5pdCBlcnJvciAlZFxuIiwgX19MSU5FX18pOworCQlyZXR1cm47CisJfQorCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NISUZUX0VNVUxBVEVDT0RFKTsKKwlpZiAoZGF0YTMyICE9IDB4MDAwMDAzMDApIHsKKwkJcHJfaW5mbygidnA5IHByb3QgaW5pdCBlcnJvciAlZFxuIiwgX19MSU5FX18pOworCQlyZXR1cm47CisJfQorCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9TVEFSVENPREUsIDB4MTIzNDU2NzgpOworCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9FTVVMQVRFQ09ERSwgMHg5YWJjZGVmMCk7CisJZGF0YTMyID0gUkVBRF9WUkVHKEhFVkNfU0hJRlRfU1RBUlRDT0RFKTsKKwlpZiAoZGF0YTMyICE9IDB4MTIzNDU2NzgpIHsKKwkJcHJfaW5mbygidnA5IHByb3QgaW5pdCBlcnJvciAlZFxuIiwgX19MSU5FX18pOworCQlyZXR1cm47CisJfQorCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX1NISUZUX0VNVUxBVEVDT0RFKTsKKwlpZiAoZGF0YTMyICE9IDB4OWFiY2RlZjApIHsKKwkJcHJfaW5mbygidnA5IHByb3QgaW5pdCBlcnJvciAlZFxuIiwgX19MSU5FX18pOworCQlyZXR1cm47CisJfQorI2VuZGlmCisJV1JJVEVfVlJFRyhIRVZDX1NISUZUX1NUQVJUQ09ERSwgMHgwMDAwMDAwMDEpOworCVdSSVRFX1ZSRUcoSEVWQ19TSElGVF9FTVVMQVRFQ09ERSwgMHgwMDAwMDMwMCk7CisjZW5kaWYKKworCisKKwlXUklURV9WUkVHKEhFVkNfV0FJVF9GTEFHLCAxKTsKKworCS8qIFdSSVRFX1ZSRUcoSEVWQ19NUFNSLCAxKTsgKi8KKworCS8qIGNsZWFyIG1haWxib3ggaW50ZXJydXB0ICovCisJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9NQk9YMF9DTFJfUkVHLCAxKTsKKworCS8qIGVuYWJsZSBtYWlsYm94IGludGVycnVwdCAqLworCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTUJPWDBfTUFTSywgMSk7CisKKwkvKiBkaXNhYmxlIFBTQ0FMRSBmb3IgaGFyZHdhcmUgc2hhcmluZyAqLworCVdSSVRFX1ZSRUcoSEVWQ19QU0NBTEVfQ1RSTCwgMCk7CisKKwlXUklURV9WUkVHKERFQlVHX1JFRzEsIDB4MCk7CisJLypjaGVjayB2cHMvc3BzL3Bwcy9pLXNsaWNlIGluIHVjb2RlKi8KKwlXUklURV9WUkVHKE5BTF9TRUFSQ0hfQ1RMLCAweDgpOworCisJV1JJVEVfVlJFRyhERUNPREVfU1RPUF9QT1MsIHVkZWJ1Z19mbGFnKTsKKyNpZmRlZiBTVVBQT1JUX0ZCX0RFQ09ESU5HCisjaWZuZGVmIEZCX0RFQ09ESU5HX1RFU1RfU0NIRURVTEUKKwlpZiAocGJpLT51c2VkX3N0YWdlX2J1Zl9udW0gPiAwKSB7CisJCWlmIChtYXNrICYgSFdfTUFTS19GUk9OVCkgeworCQkJZGF0YTMyID0gUkVBRF9WUkVHKAorCQkJCUhFVkNfQVNTSVNUX0hFRF9GQl9XX0NUTCk7CisJCQlkYXRhMzIgPSBkYXRhMzIgfAorCQkJCSgxIDw8IDApIC8qaGVkX2ZiX3dyX2VuKi8KKwkJCQk7CisJCQlXUklURV9WUkVHKEhFVkNfQVNTSVNUX0hFRF9GQl9XX0NUTCwKKwkJCQlkYXRhMzIpOworCQl9CisJCWlmIChtYXNrICYgSFdfTUFTS19CQUNLKSB7CisJCQlkYXRhMzIgPSBSRUFEX1ZSRUcoCisJCQkJSEVWQ19BU1NJU1RfSEVEX0ZCX1JfQ1RMKTsKKwkJCXdoaWxlIChkYXRhMzIgJiAoMSA8PCA3KSkgeworCQkJCS8qd2FpdCBmaW5pc2gqLworCQkJCWRhdGEzMiA9IFJFQURfVlJFRygKKwkJCQkJSEVWQ19BU1NJU1RfSEVEX0ZCX1JfQ1RMKTsKKwkJCX0KKwkJCWRhdGEzMiAmPSAofigweDEgPDwgMCkpOworCQkJLypoZWRfZmJfcmRfYWRkcl9hdXRvX3JkKi8KKwkJCWRhdGEzMiAmPSAofigweDEgPDwgMSkpOworCQkJLypyZF9pZCA9IDAsIGhlZF9yZF9tYXBfYXV0b19oYWx0X251bSwKKwkJCWFmdGVyIHdyIDIgcmVhZHksIHRoZW4gc3RhcnQgcmVhZGluZyovCisJCQlkYXRhMzIgfD0gKDB4MiA8PCAxNik7CisJCQlXUklURV9WUkVHKEhFVkNfQVNTSVNUX0hFRF9GQl9SX0NUTCwKKwkJCQlkYXRhMzIpOworCisJCQlkYXRhMzIgfD0gKDB4MSA8PCAxMSk7IC8qaGVkX3JkX21hcF9hdXRvX2hhbHRfZW4qLworCQkJZGF0YTMyIHw9ICgweDEgPDwgMSk7IC8qaGVkX2ZiX3JkX2FkZHJfYXV0b19yZCovCisJCQlkYXRhMzIgfD0gKDB4MSA8PCAwKTsgLypoZWRfZmJfcmRfZW4qLworCQkJV1JJVEVfVlJFRyhIRVZDX0FTU0lTVF9IRURfRkJfUl9DVEwsCisJCQkJZGF0YTMyKTsKKwkJfQorCisJfQorI2VuZGlmCisjZW5kaWYKK30KKworc3RhdGljIGludCB2dnA5X2xvY2FsX2luaXQoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCWludCBpOworCWludCByZXQ7CisJaW50IHdpZHRoLCBoZWlnaHQ7CisJaWYgKGFsbG9jX2xmX2J1ZihwYmkpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJcGJpLT5ndnMgPSB2emFsbG9jKHNpemVvZihzdHJ1Y3QgdmRlY19pbmZvKSk7CisJaWYgKE5VTEwgPT0gcGJpLT5ndnMpIHsKKwkJcHJfaW5mbygidGhlIHN0cnVjdCBvZiB2ZGVjIHN0YXR1cyBtYWxsb2MgZmFpbGVkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJdmRlY19zZXRfdmZyYW1lX2NvbW0oaHdfdG9fdmRlYyhwYmkpLCBEUklWRVJfTkFNRSk7CisjaWZkZWYgREVCVUdfUFRTCisJcGJpLT5wdHNfbWlzc2VkID0gMDsKKwlwYmktPnB0c19oaXQgPSAwOworI2VuZGlmCisJcGJpLT5uZXdfZnJhbWVfZGlzcGxheWVkID0gMDsKKwlwYmktPmxhc3RfcHV0X2lkeCA9IC0xOworCXBiaS0+c2F2ZWRfcmVzb2x1dGlvbiA9IDA7CisJcGJpLT5nZXRfZnJhbWVfZHVyID0gZmFsc2U7CisJb25fbm9fa2V5ZnJhbWVfc2tpcGVkID0gMDsKKwlwYmktPmR1cmF0aW9uX2Zyb21fcHRzX2RvbmUgPSAwOworCXBiaS0+dnA5X2ZpcnN0X3B0c19yZWFkeSA9IDA7CisJcGJpLT5mcmFtZV9jbnRfd2luZG93ID0gMDsKKwl3aWR0aCA9IHBiaS0+dnZwOV9hbXN0cmVhbV9kZWNfaW5mby53aWR0aDsKKwloZWlnaHQgPSBwYmktPnZ2cDlfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0OworCXBiaS0+ZnJhbWVfZHVyID0KKwkJKHBiaS0+dnZwOV9hbXN0cmVhbV9kZWNfaW5mby5yYXRlID09CisJCSAwKSA/IDMyMDAgOiBwYmktPnZ2cDlfYW1zdHJlYW1fZGVjX2luZm8ucmF0ZTsKKwlpZiAod2lkdGggJiYgaGVpZ2h0KQorCQlwYmktPmZyYW1lX2FyID0gaGVpZ2h0ICogMHgxMDAgLyB3aWR0aDsKKy8qCisgKlRPRE86Rk9SIFZFUlNJT04KKyAqLworCXByX2luZm8oInZwOTogdmVyICglZCwlZCkgZGVjaW5mbzogJWR4JWQgcmF0ZT0lZFxuIiwgdnA5X3ZlcnNpb24sCisJCSAgIDAsIHdpZHRoLCBoZWlnaHQsIHBiaS0+ZnJhbWVfZHVyKTsKKworCWlmIChwYmktPmZyYW1lX2R1ciA9PSAwKQorCQlwYmktPmZyYW1lX2R1ciA9IDk2MDAwIC8gMjQ7CisKKwlJTklUX0tGSUZPKHBiaS0+ZGlzcGxheV9xKTsKKwlJTklUX0tGSUZPKHBiaS0+bmV3ZnJhbWVfcSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVkZfUE9PTF9TSVpFOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IHZmcmFtZV9zICp2ZiA9ICZwYmktPnZmcG9vbFtpXTsKKworCQlwYmktPnZmcG9vbFtpXS5pbmRleCA9IC0xOworCQlrZmlmb19wdXQoJnBiaS0+bmV3ZnJhbWVfcSwgdmYpOworCX0KKworCisJcmV0ID0gdnA5X2xvY2FsX2luaXQocGJpKTsKKworCWlmICghcGJpLT5wdHNfdW5zdGFibGUpIHsKKwkJcGJpLT5wdHNfdW5zdGFibGUgPQorCQkocGJpLT52dnA5X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgPT0gMCk/MTowOworCQlwcl9pbmZvKCJzZXQgcHRzIHVuc3RhYmxlXG4iKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCitzdGF0aWMgczMyIHZ2cDlfaW5pdChzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSA9IChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICopdmRlYy0+cHJpdmF0ZTsKKyNlbHNlCitzdGF0aWMgczMyIHZ2cDlfaW5pdChzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisjZW5kaWYKKwlpbnQgcmV0OworCWludCBmd19zaXplID0gMHgxMDAwICogMTY7CisJc3RydWN0IGZpcm13YXJlX3MgKmZ3ID0gTlVMTDsKKworCXBiaS0+c3RhdCB8PSBTVEFUX1RJTUVSX0lOSVQ7CisKKwlpZiAodnZwOV9sb2NhbF9pbml0KHBiaSkgPCAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJZncgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgZmlybXdhcmVfcykgKyBmd19zaXplKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZncpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChnZXRfZmlybXdhcmVfZGF0YShWSURFT19ERUNfVlA5X01NVSwgZnctPmRhdGEpIDwgMCkgeworCQlwcl9lcnIoImdldCBmaXJtd2FyZSBmYWlsLlxuIik7CisJCXZmcmVlKGZ3KTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZ3LT5sZW4gPSBmd19zaXplOworCisJSU5JVF9XT1JLKCZwYmktPnNldF9jbGtfd29yaywgdnA5X3NldF9jbGspOworCXRpbWVyX3NldHVwKCZwYmktPnRpbWVyLCB2dnA5X3B1dF90aW1lcl9mdW5jLCAwKTsKKwlzcGluX2xvY2tfaW5pdCgmcGJpLT53YWl0X2J1Zl9sb2NrKTsKKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKKwlpZiAocGJpLT5tX2luc19mbGFnKSB7CisJCXBiaS0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBQVVRfSU5URVJWQUw7CisKKwkJLyphZGRfdGltZXIoJnBiaS0+dGltZXIpOworCisJCXBiaS0+c3RhdCB8PSBTVEFUX1RJTUVSX0FSTTsKKwkJcGJpLT5zdGF0IHw9IFNUQVRfSVNSX1JFRzsqLworCisJCUlOSVRfV09SSygmcGJpLT53b3JrLCB2cDlfd29yayk7CisJCUlOSVRfV09SSygmcGJpLT5yZWN5Y2xlX21tdV93b3JrLCB2cDlfcmVjeWNsZV9tbXVfd29yayk7CisjaWZkZWYgU1VQUE9SVF9GQl9ERUNPRElORworCQlpZiAocGJpLT51c2VkX3N0YWdlX2J1Zl9udW0gPiAwKQorCQkJSU5JVF9XT1JLKCZwYmktPnMxX3dvcmssIHZwOV9zMV93b3JrKTsKKyNlbmRpZgorCQlwYmktPmZ3ID0gZnc7CisKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisJYW1oZXZjX2VuYWJsZSgpOworCisJaW5pdF9waWNfbGlzdChwYmkpOworCisJcmV0ID0gYW1oZXZjX2xvYWRtY19leChWRk9STUFUX1ZQOSwgTlVMTCwgZnctPmRhdGEpOworCWlmIChyZXQgPCAwKSB7CisJCWFtaGV2Y19kaXNhYmxlKCk7CisJCXZmcmVlKGZ3KTsKKwkJcHJfZXJyKCJWUDk6IHRoZSAlcyBmdyBsb2FkaW5nIGZhaWxlZCwgZXJyOiAleFxuIiwKKwkJCXRlZV9lbmFibGVkKCkgPyAiVEVFIiA6ICJsb2NhbCIsIHJldCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJdmZyZWUoZncpOworCisJcGJpLT5zdGF0IHw9IFNUQVRfTUNfTE9BRDsKKworCS8qIGVuYWJsZSBBTVJJU0Mgc2lkZSBwcm90b2NvbCAqLworCXZ2cDlfcHJvdF9pbml0KHBiaSwgSFdfTUFTS19GUk9OVCB8IEhXX01BU0tfQkFDSyk7CisKKwlpZiAodmRlY19yZXF1ZXN0X3RocmVhZGVkX2lycShWREVDX0lSUV8wLAorCQkJCXZ2cDlfaXNyLAorCQkJCXZ2cDlfaXNyX3RocmVhZF9mbiwKKwkJCQlJUlFGX09ORVNIT1QsLypydW4gdGhyZWFkIG9uIHRoaXMgaXJxIGRpc2FibGVkKi8KKwkJCQkidnZwOS1pcnEiLCAodm9pZCAqKXBiaSkpIHsKKwkJcHJfaW5mbygidnZwOSBpcnEgcmVnaXN0ZXIgZXJyb3IuXG4iKTsKKwkJYW1oZXZjX2Rpc2FibGUoKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJcGJpLT5zdGF0IHw9IFNUQVRfSVNSX1JFRzsKKworCXBiaS0+cHJvdmlkZXJfbmFtZSA9IFBST1ZJREVSX05BTUU7CisjaWZkZWYgTVVMVElfSU5TVEFOQ0VfU1VQUE9SVAorCWlmICghcGJpLT5pc191c2VkX3Y0bCkgeworCQl2Zl9wcm92aWRlcl9pbml0KCZ2dnA5X3ZmX3Byb3YsIFBST1ZJREVSX05BTUUsCisJCQkJCSZ2dnA5X3ZmX3Byb3ZpZGVyLCBwYmkpOworCQl2Zl9yZWdfcHJvdmlkZXIoJnZ2cDlfdmZfcHJvdik7CisJCXZmX25vdGlmeV9yZWNlaXZlcihQUk9WSURFUl9OQU1FLCBWRlJBTUVfRVZFTlRfUFJPVklERVJfU1RBUlQsIE5VTEwpOworCQlpZiAocGJpLT5mcmFtZV9kdXIgIT0gMCkgeworCQkJaWYgKCFpc19yZXNldCkKKwkJCQl2Zl9ub3RpZnlfcmVjZWl2ZXIocGJpLT5wcm92aWRlcl9uYW1lLAorCQkJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX0ZSX0hJTlQsCisJCQkJCQkodm9pZCAqKQorCQkJCQkJKCh1bnNpZ25lZCBsb25nKXBiaS0+ZnJhbWVfZHVyKSk7CisJCX0KKwl9CisjZWxzZQorCXZmX3Byb3ZpZGVyX2luaXQoJnZ2cDlfdmZfcHJvdiwgUFJPVklERVJfTkFNRSwgJnZ2cDlfdmZfcHJvdmlkZXIsCisJCQkJCSBwYmkpOworCXZmX3JlZ19wcm92aWRlcigmdnZwOV92Zl9wcm92KTsKKwl2Zl9ub3RpZnlfcmVjZWl2ZXIoUFJPVklERVJfTkFNRSwgVkZSQU1FX0VWRU5UX1BST1ZJREVSX1NUQVJULCBOVUxMKTsKKwlpZiAoIWlzX3Jlc2V0KQorCQl2Zl9ub3RpZnlfcmVjZWl2ZXIoUFJPVklERVJfTkFNRSwgVkZSQU1FX0VWRU5UX1BST1ZJREVSX0ZSX0hJTlQsCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKXBiaS0+ZnJhbWVfZHVyKSk7CisjZW5kaWYKKwlwYmktPnN0YXQgfD0gU1RBVF9WRl9IT09LOworCisJcGJpLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIFBVVF9JTlRFUlZBTDsKKwlhZGRfdGltZXIoJnBiaS0+dGltZXIpOworCisJcGJpLT5zdGF0IHw9IFNUQVRfVkRFQ19SVU47CisKKwlwYmktPnN0YXQgfD0gU1RBVF9USU1FUl9BUk07CisKKwlhbWhldmNfc3RhcnQoKTsKKworCXBiaS0+aW5pdF9mbGFnID0gMTsKKwlwYmktPnByb2Nlc3NfYnVzeSA9IDA7CisJcHJfaW5mbygiJWQsIHZ2cDlfaW5pdCwgUlA9MHgleFxuIiwKKwkJX19MSU5FX18sIFJFQURfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bXZwOV9zdG9wKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlwYmktPmluaXRfZmxhZyA9IDA7CisKKwlpZiAocGJpLT5zdGF0ICYgU1RBVF9WREVDX1JVTikgeworCQlhbWhldmNfc3RvcCgpOworCQlwYmktPnN0YXQgJj0gflNUQVRfVkRFQ19SVU47CisJfQorCWlmIChwYmktPnN0YXQgJiBTVEFUX0lTUl9SRUcpIHsKKwkJdmRlY19mcmVlX2lycShWREVDX0lSUV8wLCAodm9pZCAqKXBiaSk7CisJCXBiaS0+c3RhdCAmPSB+U1RBVF9JU1JfUkVHOworCX0KKwlpZiAocGJpLT5zdGF0ICYgU1RBVF9USU1FUl9BUk0pIHsKKwkJZGVsX3RpbWVyX3N5bmMoJnBiaS0+dGltZXIpOworCQlwYmktPnN0YXQgJj0gflNUQVRfVElNRVJfQVJNOworCX0KKworCWlmICghcGJpLT5pc191c2VkX3Y0bCAmJiAocGJpLT5zdGF0ICYgU1RBVF9WRl9IT09LKSkgeworCQlpZiAoIWlzX3Jlc2V0KQorCQkJdmZfbm90aWZ5X3JlY2VpdmVyKHBiaS0+cHJvdmlkZXJfbmFtZSwKKwkJCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX0ZSX0VORF9ISU5ULAorCQkJCQlOVUxMKTsKKworCQl2Zl91bnJlZ19wcm92aWRlcigmdnZwOV92Zl9wcm92KTsKKwkJcGJpLT5zdGF0ICY9IH5TVEFUX1ZGX0hPT0s7CisJfQorCXZwOV9sb2NhbF91bmluaXQocGJpKTsKKwlyZXNldF9wcm9jZXNzX3RpbWUocGJpKTsKKwljYW5jZWxfd29ya19zeW5jKCZwYmktPndvcmspOworCWNhbmNlbF93b3JrX3N5bmMoJnBiaS0+cmVjeWNsZV9tbXVfd29yayk7CisjaWZkZWYgU1VQUE9SVF9GQl9ERUNPRElORworCWlmIChwYmktPnVzZWRfc3RhZ2VfYnVmX251bSA+IDApCisJCWNhbmNlbF93b3JrX3N5bmMoJnBiaS0+czFfd29yayk7CisjZW5kaWYKKwljYW5jZWxfd29ya19zeW5jKCZwYmktPnNldF9jbGtfd29yayk7CisJdW5pbml0X21tdV9idWZmZXJzKHBiaSk7CisJaWYgKHBiaS0+ZncpCisJCXZmcmVlKHBiaS0+ZncpOworCXBiaS0+ZncgPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtdmRlY192cDlfbW11X2luaXQoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCWludCB0dnBfZmxhZyA9IHZkZWNfc2VjdXJlKGh3X3RvX3ZkZWMocGJpKSkgPworCQlDT0RFQ19NTV9GTEFHU19UVlAgOiAwOworCWludCBidWZfc2l6ZSA9IHZwOV9tYXhfbW11X2J1Zl9zaXplKHBiaS0+bWF4X3BpY193LCBwYmktPm1heF9waWNfaCk7CisKKwlwYmktPm5lZWRfY2FjaGVfc2l6ZSA9IGJ1Zl9zaXplICogU1pfMU07CisJcGJpLT5zY19zdGFydF90aW1lID0gZ2V0X2ppZmZpZXNfNjQoKTsKKwlpZiAocGJpLT5tbXVfZW5hYmxlICYmICFwYmktPmlzX3VzZWRfdjRsKSB7CisJCXBiaS0+bW11X2JveCA9IGRlY29kZXJfbW11X2JveF9hbGxvY19ib3goRFJJVkVSX05BTUUsCisJCQlwYmktPmluZGV4LCBGUkFNRV9CVUZGRVJTLAorCQkJcGJpLT5uZWVkX2NhY2hlX3NpemUsCisJCQl0dnBfZmxhZworCQkJKTsKKwkJaWYgKCFwYmktPm1tdV9ib3gpIHsKKwkJCXByX2VycigidnA5IGFsbG9jIG1tdSBib3ggZmFpbGVkISFcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXBiaS0+Ym1tdV9ib3ggPSBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2JveCgKKwkJCURSSVZFUl9OQU1FLAorCQkJcGJpLT5pbmRleCwKKwkJCU1BWF9CTU1VX0JVRkZFUl9OVU0sCisJCQk0ICsgUEFHRV9TSElGVCwKKwkJCUNPREVDX01NX0ZMQUdTX0NNQV9DTEVBUiB8CisJCQlDT0RFQ19NTV9GTEFHU19GT1JfVkRFQ09ERVIgfAorCQkJdHZwX2ZsYWcpOworCWlmICghcGJpLT5ibW11X2JveCkgeworCQlwcl9lcnIoInZwOSBhbGxvYyBibW11IGJveCBmYWlsZWQhIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZkZWNfZmVuY2VfcmVsZWFzZShzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmksCisJCQkgICAgICAgc3RydWN0IHZkZWNfc3luYyAqc3luYykKK3sKKwl1bG9uZyBleHBpcmVzOworCisJLyogbm90aWZ5IHNpZ25hbCB0byB3YWtlIHVwIGFsbCBmZW5jZXMuICovCisJdmRlY190aW1lbGluZV9pbmNyZWFzZShzeW5jLCBWRl9QT09MX1NJWkUpOworCisJZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDIwMDApOworCXdoaWxlICghY2hlY2tfb2Jqc19hbGxfc2lnbmFsZWQoc3luYykpIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZXhwaXJlcykpIHsKKwkJCXByX2Vycigid2FpdCBmZW5jZSBzaWduYWxlZCB0aW1lb3V0LlxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIGRlY3JlYXNlcyByZWZjbnQgb2YgdGltZWxpbmUuICovCisJdmRlY190aW1lbGluZV9wdXQoc3luYyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IGNvZGVjX3Byb2ZpbGVfdCBhbXZkZWNfdnA5X3Byb2ZpbGUgPSB7CisJLm5hbWUgPSAiVlA5LVY0TCIsCisJLnByb2ZpbGUgPSAiIgorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgZ2V0X2RhdGFfY2hlY2tfc3VtCisJKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSwgaW50IHNpemUpCit7CisJaW50IGpqOworCWludCBzdW0gPSAwOworCXU4ICpkYXRhID0gTlVMTDsKKworCWlmICh2ZGVjX3NlY3VyZShod190b192ZGVjKHBiaSkpKQorCQlyZXR1cm4gMDsKKworCWlmICghcGJpLT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJZGF0YSA9IGNvZGVjX21tX3ZtYXAocGJpLT5jaHVuay0+YmxvY2stPnN0YXJ0ICsKKwkJCXBiaS0+Y2h1bmstPm9mZnNldCwgc2l6ZSk7CisJZWxzZQorCQlkYXRhID0gKCh1OCAqKXBiaS0+Y2h1bmstPmJsb2NrLT5zdGFydF92aXJ0KSArCisJCQlwYmktPmNodW5rLT5vZmZzZXQ7CisKKwlmb3IgKGpqID0gMDsgamogPCBzaXplOyBqaisrKQorCQlzdW0gKz0gZGF0YVtqal07CisKKwl2cDlfcHJpbnQocGJpLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkiJXM6IHNpemUgMHgleCBzdW0gMHgleCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAuLiAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQlfX2Z1bmNfXywgc2l6ZSwgc3VtLAorCQkoc2l6ZSA8IDEpID8gMCA6IGRhdGFbMF0sCisJCShzaXplIDwgMikgPyAwIDogZGF0YVsxXSwKKwkJKHNpemUgPCAzKSA/IDAgOiBkYXRhWzJdLAorCQkoc2l6ZSA8IDQpID8gMCA6IGRhdGFbM10sCisJCShzaXplIDwgNSkgPyAwIDogZGF0YVs0XSwKKwkJKHNpemUgPCA2KSA/IDAgOiBkYXRhWzVdLAorCQkoc2l6ZSA8IDQpID8gMCA6IGRhdGFbc2l6ZSAtIDRdLAorCQkoc2l6ZSA8IDMpID8gMCA6IGRhdGFbc2l6ZSAtIDNdLAorCQkoc2l6ZSA8IDIpID8gMCA6IGRhdGFbc2l6ZSAtIDJdLAorCQkoc2l6ZSA8IDEpID8gMCA6IGRhdGFbc2l6ZSAtIDFdKTsKKworCWlmICghcGJpLT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcihkYXRhKTsKKwlyZXR1cm4gc3VtOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2RhdGEoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpLCBpbnQgc2l6ZSkKK3sKKwlpbnQgamo7CisJdTggKmRhdGEgPSBOVUxMOworCWludCBwYWRkaW5nX3NpemUgPSBwYmktPmNodW5rLT5vZmZzZXQgJgorCQkoVkRFQ19GSUZPX0FMSUdOIC0gMSk7CisKKwlpZiAoIXBiaS0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCWRhdGEgPSBjb2RlY19tbV92bWFwKHBiaS0+Y2h1bmstPmJsb2NrLT5zdGFydCArCisJCQlwYmktPmNodW5rLT5vZmZzZXQsIHNpemUpOworCWVsc2UKKwkJZGF0YSA9ICgodTggKilwYmktPmNodW5rLT5ibG9jay0+c3RhcnRfdmlydCkgKworCQkJcGJpLT5jaHVuay0+b2Zmc2V0OworCisJdnA5X3ByaW50KHBiaSwgMCwgInBhZGRpbmc6ICIpOworCWZvciAoamogPSBwYWRkaW5nX3NpemU7IGpqID4gMDsgamotLSkKKwkJdnA5X3ByaW50X2NvbnQocGJpLAorCQkJMCwKKwkJCSIlMDJ4ICIsICooZGF0YSAtIGpqKSk7CisJdnA5X3ByaW50X2NvbnQocGJpLCAwLCAiZGF0YSBhZHIgJXBcbiIsCisJCWRhdGEpOworCisJZm9yIChqaiA9IDA7IGpqIDwgc2l6ZTsgamorKykgeworCQlpZiAoKGpqICYgMHhmKSA9PSAwKQorCQkJdnA5X3ByaW50KHBiaSwKKwkJCQkwLAorCQkJCSIlMDZ4OiIsIGpqKTsKKwkJdnA5X3ByaW50X2NvbnQocGJpLAorCQkJMCwKKwkJCSIlMDJ4ICIsIGRhdGFbampdKTsKKwkJaWYgKCgoamogKyAxKSAmIDB4ZikgPT0gMCkKKwkJCXZwOV9wcmludChwYmksCisJCQkgMCwKKwkJCQkiXG4iKTsKKwl9CisJdnA5X3ByaW50KHBiaSwKKwkgMCwKKwkJIlxuIik7CisKKwlpZiAoIXBiaS0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIoZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgdnA5X3dhaXRfY2FwX2J1Zih2b2lkICphcmdzKQoreworCXN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSA9CisJCShzdHJ1Y3QgVlA5RGVjb2Rlcl9zICopIGFyZ3M7CisJc3RydWN0IGFtbF92Y29kZWNfY3R4ICogY3R4ID0KKwkJKHN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqKXBiaS0+djRsMl9jdHg7CisJdWxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChjdHgtPmNhcF93cSwKKwkJKGN0eC0+aXNfc3RyZWFtX29mZiB8fCAoZ2V0X2ZyZWVfYnVmX2NvdW50KHBiaSkgPiAwKSksCisJCW1zZWNzX3RvX2ppZmZpZXMoMzAwKSk7CisJaWYgKHJldCA8PSAwKXsKKwkJcHJfZXJyKCIlcywgd2FpdCBjYXAgYnVmIHRpbWVvdXQgb3IgZXJyICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBiaS0+d2FpdF9idWZfbG9jaywgZmxhZ3MpOworCWlmIChwYmktPndhaXRfbW9yZV9idWYpIHsKKwkJcGJpLT53YWl0X21vcmVfYnVmID0gZmFsc2U7CisJCXBiaS0+ZGVjX3Jlc3VsdCA9IGN0eC0+aXNfc3RyZWFtX29mZiA/CisJCURFQ19SRVNVTFRfRk9SQ0VfRVhJVCA6CisJCURFQ19SRVNVTFRfTkVFRF9NT1JFX0JVRkZFUjsKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZwYmktPndvcmspOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYmktPndhaXRfYnVmX2xvY2ssIGZsYWdzKTsKKworCXZwOV9wcmludChwYmksIFBSSU5UX0ZMQUdfVjRMX0RFVEFJTCwKKwkJIiVzIHdhaXQgY2FwdHVyZSBidWZmZXIgZW5kLCByZXQ6JWRcbiIsCisJCV9fZnVuY19fLCByZXQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2cDlfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IFZQOURlY29kZXJfcyAqcGJpID0gY29udGFpbmVyX29mKHdvcmssCisJCXN0cnVjdCBWUDlEZWNvZGVyX3MsIHdvcmspOworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBod190b192ZGVjKHBiaSk7CisJLyogZmluaXNoZWQgZGVjb2Rpbmcgb25lIGZyYW1lIG9yIGVycm9yLAorCSAqIG5vdGlmeSB2ZGVjIGNvcmUgdG8gc3dpdGNoIGNvbnRleHQKKwkgKi8KKwlpZiAocGJpLT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfQUdBSU4pCisJCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9XT1JLRVJfQUdBSU4pOworCisJaWYgKHBiaS0+ZGVjX3Jlc3VsdCAhPSBERUNfUkVTVUxUX05FRURfTU9SRV9CVUZGRVIpCisJCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9XT1JLRVJfU1RBUlQpOworCXZwOV9wcmludChwYmksIFBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsCisJCSIlcyBkZWNfcmVzdWx0ICVkICV4ICV4ICV4XG4iLAorCQlfX2Z1bmNfXywKKwkJcGJpLT5kZWNfcmVzdWx0LAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fTEVWRUwpLAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fV1JfUFRSKSwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1JEX1BUUikpOworCisJQVRSQUNFX0NPVU5URVIoIlZfU1RfREVDLXdvcmtfc3RhdGUiLCBwYmktPmRlY19yZXN1bHQpOworCisJaWYgKHBiaS0+ZGVjX3Jlc3VsdCA9PSBERUNfSU5JVF9QSUNMSVNUKSB7CisJCWluaXRfcGljX2xpc3QocGJpKTsKKwkJcGJpLT5waWNfbGlzdF9pbml0X2RvbmUgPSB0cnVlOworCQlyZXR1cm47CisJfQorCisJaWYgKHBiaS0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX05FRURfTU9SRV9CVUZGRVIpIHsKKwkJcmVzZXRfcHJvY2Vzc190aW1lKHBiaSk7CisJCWlmICghZ2V0X2ZyZWVfYnVmX2NvdW50KHBiaSkpIHsKKwkJCXVsb25nIGZsYWdzOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGJpLT53YWl0X2J1Zl9sb2NrLCBmbGFncyk7CisJCQlpZiAodmRlYy0+bmV4dF9zdGF0dXMgPT0gVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEKSB7CisJCQkJcGJpLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9BR0FJTjsKKwkJCQlwYmktPnBvc3Rwcm9jX2RvbmUgPSAwOworCQkJCXBiaS0+cHJvY2Vzc19idXN5ID0gMDsKKwkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJnBiaS0+d29yayk7CisJCQl9IGVsc2UgeworCQkJCXBiaS0+d2FpdF9tb3JlX2J1ZiA9IHRydWU7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYmktPndhaXRfYnVmX2xvY2ssIGZsYWdzKTsKKworCQkJaWYgKHBiaS0+d2FpdF9tb3JlX2J1ZikgeworCQkJCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy13YWl0X21vcmVfYnVmZiIsIF9fTElORV9fKTsKKwkJCQl2ZGVjX3Bvc3RfdGFzayh2cDlfd2FpdF9jYXBfYnVmLCBwYmkpOworCQkJfQorCQl9IGVsc2UgeworCQkJaW50IGk7CisKKwkJCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy13YWl0X21vcmVfYnVmZiIsIDApOworCisJCQlpZiAocGJpLT5tbXVfZW5hYmxlKQorCQkJCXZwOV9yZWN5Y2xlX21tdV9idWZfdGFpbChwYmkpOworCisJCQlpZiAocGJpLT5mcmFtZV9jb3VudCA+IDApCisJCQkJdnA5X2J1Zm1ncl9wb3N0cHJvYyhwYmkpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgKFJQTV9FTkQgLSBSUE1fQkVHSU4pOyBpICs9IDQpIHsKKwkJCQlpbnQgaWk7CisJCQkJZm9yIChpaSA9IDA7IGlpIDwgNDsgaWkrKykKKwkJCQkJcGJpLT52cDlfcGFyYW0ubC5kYXRhW2kgKyBpaV0gPQorCQkJCQkJcGJpLT5ycG1fcHRyW2kgKyAzIC0gaWldOworCQkJfQorCQkJY29udGludWVfZGVjb2RpbmcocGJpKTsKKwkJCXBiaS0+cG9zdHByb2NfZG9uZSA9IDA7CisJCQlwYmktPnByb2Nlc3NfYnVzeSA9IDA7CisKKwkJCXN0YXJ0X3Byb2Nlc3NfdGltZShwYmkpOworCQl9CisKKwkJcmV0dXJuOworCX0KKworCWlmICgoKHBiaS0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0dFVF9EQVRBKSB8fAorCQkocGJpLT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfR0VUX0RBVEFfUkVUUlkpKQorCQkmJiAoaHdfdG9fdmRlYyhwYmkpLT5uZXh0X3N0YXR1cyAhPQorCQlWREVDX1NUQVRVU19ESVNDT05ORUNURUQpKSB7CisJCWlmICghdmRlY19oYXNfbW9yZV9pbnB1dCh2ZGVjKSkgeworCQkJcGJpLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9FT1M7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJnBiaS0+d29yayk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAocGJpLT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfR0VUX0RBVEEpIHsKKwkJCXZwOV9wcmludChwYmksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkJIiVzIERFQ19SRVNVTFRfR0VUX0RBVEEgJXggJXggJXhcbiIsCisJCQkJX19mdW5jX18sCisJCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0xFVkVMKSwKKwkJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fV1JfUFRSKSwKKwkJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSKSk7CisJCQl2ZGVjX3ZmcmFtZV9kaXJ0eSh2ZGVjLCBwYmktPmNodW5rKTsKKwkJCXZkZWNfY2xlYW5faW5wdXQodmRlYyk7CisJCX0KKworCQlpZiAoZ2V0X2ZyZWVfYnVmX2NvdW50KHBiaSkgPj0KKwkJCXBiaS0+cnVuX3JlYWR5X21pbl9idWZfbnVtKSB7CisJCQlpbnQgcjsKKwkJCWludCBkZWNvZGVfc2l6ZTsKKwkJCXIgPSB2ZGVjX3ByZXBhcmVfaW5wdXQodmRlYywgJnBiaS0+Y2h1bmspOworCQkJaWYgKHIgPCAwKSB7CisJCQkJcGJpLT5kZWNfcmVzdWx0ID0gREVDX1JFU1VMVF9HRVRfREFUQV9SRVRSWTsKKworCQkJCXZwOV9wcmludChwYmksCisJCQkJCVBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsCisJCQkJCSJhbXZkZWNfdmgyNjU6IEluc3VmZmljaWVudCBkYXRhXG4iKTsKKworCQkJCXZkZWNfc2NoZWR1bGVfd29yaygmcGJpLT53b3JrKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlwYmktPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX05PTkU7CisJCQl2cDlfcHJpbnQocGJpLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJCSIlczogY2h1bmsgc2l6ZSAweCV4IHN1bSAweCV4XG4iLAorCQkJCV9fZnVuY19fLCByLAorCQkJCShkZWJ1ZyAmIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMpID8KKwkJCQlnZXRfZGF0YV9jaGVja19zdW0ocGJpLCByKSA6IDAKKwkJCQkpOworCisJCQlpZiAoZGVidWcgJiBQUklOVF9GTEFHX1ZERUNfREFUQSkKKwkJCQlkdW1wX2RhdGEocGJpLCBwYmktPmNodW5rLT5zaXplKTsKKworCQkJZGVjb2RlX3NpemUgPSBwYmktPmNodW5rLT5zaXplICsKKwkJCQkocGJpLT5jaHVuay0+b2Zmc2V0ICYgKFZERUNfRklGT19BTElHTiAtIDEpKTsKKworCQkJV1JJVEVfVlJFRyhIRVZDX0RFQ09ERV9TSVpFLAorCQkJCVJFQURfVlJFRyhIRVZDX0RFQ09ERV9TSVpFKSArIGRlY29kZV9zaXplKTsKKworCQkJdmRlY19lbmFibGVfaW5wdXQodmRlYyk7CisKKwkJCVdSSVRFX1ZSRUcoSEVWQ19ERUNfU1RBVFVTX1JFRywgSEVWQ19BQ1RJT05fRE9ORSk7CisKKwkJCXN0YXJ0X3Byb2Nlc3NfdGltZShwYmkpOworCisJCX0gZWxzZXsKKwkJCXBiaS0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfR0VUX0RBVEFfUkVUUlk7CisKKwkJCXZwOV9wcmludChwYmksIFBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsCisJCQkJImFtdmRlY192aDI2NTogSW5zdWZmaWNpZW50IGRhdGFcbiIpOworCisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJnBiaS0+d29yayk7CisJCX0KKwkJcmV0dXJuOworCX0gZWxzZSBpZiAocGJpLT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfRE9ORSkgeworI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKKwkJaWYgKHBiaS0+dXNlZF9zdGFnZV9idWZfbnVtID4gMCkgeworI2lmbmRlZiBGQl9ERUNPRElOR19URVNUX1NDSEVEVUxFCisJCQlpZiAoIWlzX3MyX2RlY29kaW5nX2ZpbmlzaGVkKHBiaSkpIHsKKwkJCQl2cDlfcHJpbnQocGJpLCBQUklOVF9GTEFHX1ZERUNfREVUQUlMLAorCQkJCQkiczIgZGVjb2Rpbmcgbm90IGRvbmUsIGNoZWNrIGFnYWluIGxhdGVyXG4iKTsKKwkJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJnBiaS0+d29yayk7CisJCQl9CisjZW5kaWYKKwkJCWluY19zMl9wb3MocGJpKTsKKwkJCWlmIChtY3JjY19jYWNoZV9hbGdfZmxhZykKKwkJCQlkdW1wX2hpdF9yYXRlKHBiaSk7CisJCX0KKyNlbmRpZgorCQkvKiBpZiAoIXBiaS0+Y3R4X3ZhbGlkKQorCQkJcGJpLT5jdHhfdmFsaWQgPSAxOyAqLworCQlwYmktPnNsaWNlX2lkeCsrOworCQlwYmktPmZyYW1lX2NvdW50Kys7CisJCXBiaS0+cHJvY2Vzc19zdGF0ZSA9IFBST0NfU1RBVEVfSU5JVDsKKwkJZGVjb2RlX2ZyYW1lX2NvdW50W3BiaS0+aW5kZXhdID0gcGJpLT5mcmFtZV9jb3VudDsKKworCQlpZiAocGJpLT5tbXVfZW5hYmxlKQorCQkJcGJpLT51c2VkXzRrX251bSA9CisJCQkJKFJFQURfVlJFRyhIRVZDX1NBT19NTVVfU1RBVFVTKSA+PiAxNik7CisJCXZwOV9wcmludChwYmksIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMsCisJCQkiJXMgKD09PT4gJWQpIGRlY19yZXN1bHQgJWQgJXggJXggJXggc2hpZnRieXRlcyAweCV4IGRlY2J5dGVzIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywKKwkJCXBiaS0+ZnJhbWVfY291bnQsCisJCQlwYmktPmRlY19yZXN1bHQsCisJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fTEVWRUwpLAorCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1dSX1BUUiksCisJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSKSwKKwkJCVJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpLAorCQkJUkVBRF9WUkVHKEhFVkNfU0hJRlRfQllURV9DT1VOVCkgLQorCQkJcGJpLT5zdGFydF9zaGlmdF9ieXRlcworCQkJKTsKKwkJdmRlY192ZnJhbWVfZGlydHkoaHdfdG9fdmRlYyhwYmkpLCBwYmktPmNodW5rKTsKKwl9IGVsc2UgaWYgKHBiaS0+ZGVjX3Jlc3VsdCA9PSBERUNfUkVTVUxUX0FHQUlOKSB7CisJCS8qCisJCQlzdHJlYW0gYmFzZTogc3RyZWFtIGJ1ZiBlbXB0eSBvciB0aW1lb3V0CisJCQlmcmFtZSBiYXNlOiB2ZGVjX3ByZXBhcmVfaW5wdXQgZmFpbAorCQkqLworCQlpZiAoIXZkZWNfaGFzX21vcmVfaW5wdXQodmRlYykpIHsKKwkJCXBiaS0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfRU9TOworCQkJdmRlY19zY2hlZHVsZV93b3JrKCZwYmktPndvcmspOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIGlmIChwYmktPmRlY19yZXN1bHQgPT0gREVDX1JFU1VMVF9FT1MpIHsKKwkJdnA5X3ByaW50KHBiaSwgUFJJTlRfRkxBR19WREVDX1NUQVRVUywKKwkJCSIlczogZW5kIG9mIHN0cmVhbVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcGJpLT5lb3MgPSAxOworCQl2cDlfYnVmbWdyX3Bvc3Rwcm9jKHBiaSk7CisKKwkJaWYgKHBiaS0+aXNfdXNlZF92NGwpIHsKKwkJCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy1zdWJtaXRfZW9zIiwgX19MSU5FX18pOworCQkJbm90aWZ5X3Y0bF9lb3MoaHdfdG9fdmRlYyhwYmkpKTsKKwkJCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy1zdWJtaXRfZW9zIiwgMCk7CisJCX0KKworCQl2ZGVjX3ZmcmFtZV9kaXJ0eShod190b192ZGVjKHBiaSksIHBiaS0+Y2h1bmspOworCX0gZWxzZSBpZiAocGJpLT5kZWNfcmVzdWx0ID09IERFQ19SRVNVTFRfRk9SQ0VfRVhJVCkgeworCQl2cDlfcHJpbnQocGJpLCBQUklOVF9GTEFHX1ZERUNfU1RBVFVTLAorCQkJIiVzOiBmb3JjZSBleGl0XG4iLAorCQkJX19mdW5jX18pOworCQlpZiAocGJpLT5zdGF0ICYgU1RBVF9WREVDX1JVTikgeworCQkJYW1oZXZjX3N0b3AoKTsKKwkJCXBiaS0+c3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwkJfQorCisJCWlmIChwYmktPnN0YXQgJiBTVEFUX0lTUl9SRUcpIHsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCQlpZiAoIXBiaS0+bV9pbnNfZmxhZykKKyNlbmRpZgorCQkJCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfTUJPWDBfTUFTSywgMCk7CisJCQl2ZGVjX2ZyZWVfaXJxKFZERUNfSVJRXzAsICh2b2lkICopcGJpKTsKKwkJCXBiaS0+c3RhdCAmPSB+U1RBVF9JU1JfUkVHOworCQl9CisJfQorCWlmIChwYmktPnN0YXQgJiBTVEFUX1ZERUNfUlVOKSB7CisJCWFtaGV2Y19zdG9wKCk7CisJCXBiaS0+c3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwl9CisKKwlpZiAocGJpLT5zdGF0ICYgU1RBVF9USU1FUl9BUk0pIHsKKwkJZGVsX3RpbWVyX3N5bmMoJnBiaS0+dGltZXIpOworCQlwYmktPnN0YXQgJj0gflNUQVRfVElNRVJfQVJNOworCX0KKwlpZiAocGJpLT5kZWNfcmVzdWx0ICE9IERFQ19SRVNVTFRfTkVFRF9NT1JFX0JVRkZFUikKKwkJQVRSQUNFX0NPVU5URVIocGJpLT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX1dPUktFUl9FTkQpOworCS8qIG1hcmsgaXRzZWxmIGhhcyBhbGwgSFcgcmVzb3VyY2UgcmVsZWFzZWQgYW5kIGlucHV0IHJlbGVhc2VkICovCisjaWZkZWYgU1VQUE9SVF9GQl9ERUNPRElORworCWlmIChwYmktPnVzZWRfc3RhZ2VfYnVmX251bSA+IDApCisJCXZkZWNfY29yZV9maW5pc2hfcnVuKGh3X3RvX3ZkZWMocGJpKSwgQ09SRV9NQVNLX0hFVkNfQkFDSyk7CisJZWxzZQorCQl2ZGVjX2NvcmVfZmluaXNoX3J1bihod190b192ZGVjKHBiaSksIENPUkVfTUFTS19WREVDXzEKKwkJCQl8IENPUkVfTUFTS19IRVZDCisJCQkJfCBDT1JFX01BU0tfSEVWQ19GUk9OVAorCQkJCXwgQ09SRV9NQVNLX0hFVkNfQkFDSworCQkJCSk7CisjZWxzZQorCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkKKwkJdmRlY19jb3JlX2ZpbmlzaF9ydW4odmRlYywgQ09SRV9NQVNLX0hFVkMpOworCWVsc2UKKwkJdmRlY19jb3JlX2ZpbmlzaF9ydW4oaHdfdG9fdmRlYyhwYmkpLCBDT1JFX01BU0tfVkRFQ18xCisJCQkJCXwgQ09SRV9NQVNLX0hFVkMpOworI2VuZGlmCisJdHJpZ2dlcl9zY2hlZHVsZShwYmkpOworfQorCitzdGF0aWMgaW50IHZwOV9od19jdHhfcmVzdG9yZShzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJLyogbmV3IHRvIGRvIC4uLiAqLworI2lmICghZGVmaW5lZCBTVVBQT1JUX0ZCX0RFQ09ESU5HKQorCXZ2cDlfcHJvdF9pbml0KHBiaSwgSFdfTUFTS19GUk9OVCB8IEhXX01BU0tfQkFDSyk7CisjZWxpZiAoZGVmaW5lZCBGQl9ERUNPRElOR19URVNUX1NDSEVEVUxFKQorCXZ2cDlfcHJvdF9pbml0KHBiaSwgSFdfTUFTS19GUk9OVCB8IEhXX01BU0tfQkFDSyk7CisjZWxzZQorCWlmIChwYmktPnVzZWRfc3RhZ2VfYnVmX251bSA+IDApCisJCXZ2cDlfcHJvdF9pbml0KHBiaSwgSFdfTUFTS19GUk9OVCk7CisJZWxzZQorCQl2dnA5X3Byb3RfaW5pdChwYmksIEhXX01BU0tfRlJPTlQgfCBIV19NQVNLX0JBQ0spOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sIGlzX2F2YWxpYWJsZV9idWZmZXIoc3RydWN0IFZQOURlY29kZXJfcyAqcGJpKQoreworCXN0cnVjdCBWUDlfQ29tbW9uX3MgKmNvbnN0IGNtID0gJnBiaS0+Y29tbW9uOworCXN0cnVjdCBSZWZDbnRCdWZmZXJfcyAqY29uc3QgZnJhbWVfYnVmcyA9IGNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmczsKKwlzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKmN0eCA9CisJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikocGJpLT52NGwyX2N0eCk7CisJaW50IGksIGZyZWVfY291bnQgPSAwOworCWludCB1c2VkX2NvdW50ID0gMDsKKworCWlmICgocGJpLT51c2VkX2J1Zl9udW0gPT0gMCkgfHwKKwkJKGN0eC0+Y2FwX3Bvb2wuZGVjIDwgcGJpLT51c2VkX2J1Zl9udW0pKSB7CisJCWlmIChjdHgtPmZiX29wcy5xdWVyeSgmY3R4LT5mYl9vcHMsICZwYmktPmZiX3Rva2VuKSkgeworCQkJZnJlZV9jb3VudCA9CisJCQkJdjRsMl9tMm1fbnVtX2RzdF9idWZzX3JlYWR5KGN0eC0+bTJtX2N0eCkgKyAxOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IHBiaS0+dXNlZF9idWZfbnVtOyArK2kpIHsKKwkJaWYgKChmcmFtZV9idWZzW2ldLnJlZl9jb3VudCA9PSAwKSAmJgorCQkJKGZyYW1lX2J1ZnNbaV0uYnVmLnZmX3JlZiA9PSAwKSAmJgorCQkJKGZyYW1lX2J1ZnNbaV0uYnVmLnJlcGVhdF9jb3VudCA9PSAwKSAmJgorCQkJZnJhbWVfYnVmc1tpXS5idWYuY21hX2FsbG9jX2FkZHIgJiYKKwkJCShjbS0+Y3VyX2ZyYW1lICE9ICZmcmFtZV9idWZzW2ldKSkgeworCQkJZnJlZV9jb3VudCsrOworCQl9IGVsc2UgaWYgKGZyYW1lX2J1ZnNbaV0uYnVmLmNtYV9hbGxvY19hZGRyKQorCQkJdXNlZF9jb3VudCsrOworCX0KKworCUFUUkFDRV9DT1VOVEVSKCJWX1NUX0RFQy1mcmVlX2J1ZmZfY291bnQiLCBmcmVlX2NvdW50KTsKKwlBVFJBQ0VfQ09VTlRFUigiVl9TVF9ERUMtdXNlZF9idWZmX2NvdW50IiwgdXNlZF9jb3VudCk7CisKKwlyZXR1cm4gZnJlZV9jb3VudCA+PSBwYmktPnJ1bl9yZWFkeV9taW5fYnVmX251bSA/IDEgOiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBydW5fcmVhZHkoc3RydWN0IHZkZWNfcyAqdmRlYywgdW5zaWduZWQgbG9uZyBtYXNrKQoreworCXN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSA9CisJCShzdHJ1Y3QgVlA5RGVjb2Rlcl9zICopdmRlYy0+cHJpdmF0ZTsKKwlpbnQgdHZwID0gdmRlY19zZWN1cmUoaHdfdG9fdmRlYyhwYmkpKSA/CisJCUNPREVDX01NX0ZMQUdTX1RWUCA6IDA7CisJdW5zaWduZWQgbG9uZyByZXQgPSAwOworCisJaWYgKCFwYmktPnBpY19saXN0X2luaXRfZG9uZTIgfHwgcGJpLT5lb3MpCisJCXJldHVybiByZXQ7CisJaWYgKCFwYmktPmZpcnN0X3NjX2NoZWNrZWQgJiYgcGJpLT5tbXVfZW5hYmxlKSB7CisJCWludCBzaXplOworCQl2b2lkICogbW11X2JveDsKKworCQlpZiAocGJpLT5pc191c2VkX3Y0bCkgeworCQkJc3RydWN0IGFtbF92Y29kZWNfY3R4ICpjdHggPQorCQkJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikocGJpLT52NGwyX2N0eCk7CisJCQltbXVfYm94ID0gY3R4LT5tbXVfYm94OworCQl9IGVsc2UKKwkJCW1tdV9ib3ggPSBwYmktPm1tdV9ib3g7CisKKwkJc2l6ZSA9IGRlY29kZXJfbW11X2JveF9zY19jaGVjayhtbXVfYm94LCB0dnApOworCQlwYmktPmZpcnN0X3NjX2NoZWNrZWQgPSAxOworCQl2cDlfcHJpbnQocGJpLCAwLCAidnA5IGNhY2hlZD0lZCAgbmVlZF9zaXplPSVkIHNwZWVkPSAlZCBtc1xuIiwKKwkJCXNpemUsIChwYmktPm5lZWRfY2FjaGVfc2l6ZSA+PiBQQUdFX1NISUZUKSwKKwkJCShpbnQpKGdldF9qaWZmaWVzXzY0KCkgLSBwYmktPnNjX3N0YXJ0X3RpbWUpICogMTAwMC9IWik7CisJfQorCisjaWZkZWYgU1VQUE9SVF9GQl9ERUNPRElORworCWlmIChwYmktPnVzZWRfc3RhZ2VfYnVmX251bSA+IDApIHsKKwkJaWYgKG1hc2sgJiBDT1JFX01BU0tfSEVWQ19GUk9OVCkgeworCQkJaWYgKGdldF9mcmVlX3N0YWdlX2J1Zl9udW0ocGJpKSA+IDAKKwkJCQkmJiBtdl9idWZfYXZhaWxhYmxlKHBiaSkpCisJCQkJcmV0IHw9IENPUkVfTUFTS19IRVZDX0ZST05UOworCQl9CisJCWlmIChtYXNrICYgQ09SRV9NQVNLX0hFVkNfQkFDSykgeworCQkJaWYgKHMyX2J1Zl9hdmFpbGFibGUocGJpKSAmJgorCQkJCShnZXRfZnJlZV9idWZfY291bnQocGJpKSA+PQorCQkJCXBiaS0+cnVuX3JlYWR5X21pbl9idWZfbnVtKSkgeworCQkJCXJldCB8PSBDT1JFX01BU0tfSEVWQ19CQUNLOworCQkJCXBiaS0+YmFja19ub3RfcnVuX3JlYWR5ID0gMDsKKwkJCX0gZWxzZQorCQkJCXBiaS0+YmFja19ub3RfcnVuX3JlYWR5ID0gMTsKKyNpZiAwCisJCQlpZiAoZ2V0X2ZyZWVfYnVmX2NvdW50KHBiaSkgPAorCQkJCXJ1bl9yZWFkeV9taW5fYnVmX251bSkKKwkJCQlkdW1wX3BpY19saXN0KHBiaSk7CisjZW5kaWYKKwkJfQorCX0gZWxzZSBpZiAoZ2V0X2ZyZWVfYnVmX2NvdW50KHBiaSkgPj0KKwkJcGJpLT5ydW5fcmVhZHlfbWluX2J1Zl9udW0pCisJCXJldCA9IENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQworCQkJfCBDT1JFX01BU0tfSEVWQ19GUk9OVAorCQkJfCBDT1JFX01BU0tfSEVWQ19CQUNLOworCisJaWYgKHJldCAmIENPUkVfTUFTS19IRVZDX0ZST05UKQorCQlub3RfcnVuX3JlYWR5W3BiaS0+aW5kZXhdID0gMDsKKwllbHNlCisJCW5vdF9ydW5fcmVhZHlbcGJpLT5pbmRleF0rKzsKKworCWlmIChyZXQgJiBDT1JFX01BU0tfSEVWQ19CQUNLKQorCQlub3RfcnVuMl9yZWFkeVtwYmktPmluZGV4XSA9IDA7CisJZWxzZQorCQlub3RfcnVuMl9yZWFkeVtwYmktPmluZGV4XSsrOworCisJdnA5X3ByaW50KHBiaSwKKwkJUFJJTlRfRkxBR19WREVDX0RFVEFJTCwgIiVzIG1hc2sgJWx4PT4lbHggKCVkICVkICVkICVkKVxyXG4iLAorCQlfX2Z1bmNfXywgbWFzaywgcmV0LAorCQlnZXRfZnJlZV9zdGFnZV9idWZfbnVtKHBiaSksCisJCW12X2J1Zl9hdmFpbGFibGUocGJpKSwKKwkJczJfYnVmX2F2YWlsYWJsZShwYmkpLAorCQlnZXRfZnJlZV9idWZfY291bnQocGJpKQorCQkpOworCisJcmV0dXJuIHJldDsKKworI2Vsc2UKKworCWlmIChwYmktPmlzX3VzZWRfdjRsKSB7CisJCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0KKwkJCShzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikocGJpLT52NGwyX2N0eCk7CisKKwkJaWYgKHBiaS0+djRsX3BhcmFtc19wYXJzZWQpIHsKKwkJCWlmIChpc19hdmFsaWFibGVfYnVmZmVyKHBiaSkpCisJCQkJcmV0ID0gQ09SRV9NQVNLX0hFVkM7CisJCQllbHNlCisJCQkJcmV0ID0gMDsKKwkJfSBlbHNlIHsKKwkJCWlmIChjdHgtPnY0bF9yZXNvbHV0aW9uX2NoYW5nZSkKKwkJCQlyZXQgPSAwOworCQkJZWxzZQorCQkJCXJldCA9IENPUkVfTUFTS19IRVZDOworCQl9CisJfQorCisJaWYgKHJldCkKKwkJbm90X3J1bl9yZWFkeVtwYmktPmluZGV4XSA9IDA7CisJZWxzZQorCQlub3RfcnVuX3JlYWR5W3BiaS0+aW5kZXhdKys7CisKKwl2cDlfcHJpbnQocGJpLAorCQlQUklOVF9GTEFHX1ZERUNfREVUQUlMLCAiJXMgbWFzayAlbHg9PiVseFxyXG4iLAorCQlfX2Z1bmNfXywgbWFzaywgcmV0KTsKKwlyZXR1cm4gcmV0OworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHZwOV9mcmFtZV9tb2RlX3B0c19zYXZlKHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlpbnQgaSA9IDA7CisKKwlpZiAocGJpLT5jaHVuayA9PSBOVUxMKQorCSAgICAgICByZXR1cm47CisJdnA5X3ByaW50KHBiaSwgVlA5X0RFQlVHX09VVF9QVFMsCisJICAgICAgICJydW4gZnJvbnQ6IHB0cyAlZCwgcHRzNjQgJWxsZCwgdHM6ICVsbGRcbiIsCisJICAgICAgIHBiaS0+Y2h1bmstPnB0cywgcGJpLT5jaHVuay0+cHRzNjQsIHBiaS0+Y2h1bmstPnRpbWVzdGFtcCk7CisJZm9yIChpID0gKEZSQU1FX0JVRkZFUlMgLSAxKTsgaSA+IDA7IGktLSkgeworCQlwYmktPmZyYW1lX21vZGVfcHRzX3NhdmVbaV0gPSBwYmktPmZyYW1lX21vZGVfcHRzX3NhdmVbaSAtIDFdOworCQlwYmktPmZyYW1lX21vZGVfcHRzNjRfc2F2ZVtpXSA9IHBiaS0+ZnJhbWVfbW9kZV9wdHM2NF9zYXZlW2kgLSAxXTsKKwl9CisJcGJpLT5mcmFtZV9tb2RlX3B0c19zYXZlWzBdID0gcGJpLT5jaHVuay0+cHRzOworCXBiaS0+ZnJhbWVfbW9kZV9wdHM2NF9zYXZlWzBdID0gcGJpLT5jaHVuay0+cHRzNjQ7CisKKwlpZiAocGJpLT5pc191c2VkX3Y0bCAmJiAhdjRsX2JpdHN0cmVhbV9pZF9lbmFibGUpCisJCXBiaS0+ZnJhbWVfbW9kZV9wdHM2NF9zYXZlWzBdID0gcGJpLT5jaHVuay0+dGltZXN0YW1wOworfQorCitzdGF0aWMgdm9pZCBydW5fZnJvbnQoc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkgPQorCQkoc3RydWN0IFZQOURlY29kZXJfcyAqKXZkZWMtPnByaXZhdGU7CisJaW50IHJldCwgc2l6ZTsKKworCXJ1bl9jb3VudFtwYmktPmluZGV4XSsrOworCS8qIHBiaS0+Y2h1bmsgPSB2ZGVjX3ByZXBhcmVfaW5wdXQodmRlYyk7ICovCisjaWYgKCFkZWZpbmVkIFNVUFBPUlRfRkJfREVDT0RJTkcpCisJaGV2Y19yZXNldF9jb3JlKHZkZWMpOworI2VsaWYgKGRlZmluZWQgRkJfREVDT0RJTkdfVEVTVF9TQ0hFRFVMRSkKKwloZXZjX3Jlc2V0X2NvcmUodmRlYyk7CisjZWxzZQorCWlmIChwYmktPnVzZWRfc3RhZ2VfYnVmX251bSA+IDApCisJCWZiX3Jlc2V0X2NvcmUodmRlYywgSFdfTUFTS19GUk9OVCk7CisJZWxzZQorCQloZXZjX3Jlc2V0X2NvcmUodmRlYyk7CisjZW5kaWYKKworCXNpemUgPSB2ZGVjX3ByZXBhcmVfaW5wdXQodmRlYywgJnBiaS0+Y2h1bmspOworCWlmIChzaXplIDwgMCkgeworCQlpbnB1dF9lbXB0eVtwYmktPmluZGV4XSsrOworCisJCXBiaS0+ZGVjX3Jlc3VsdCA9IERFQ19SRVNVTFRfQUdBSU47CisKKwkJdnA5X3ByaW50KHBiaSwgUFJJTlRfRkxBR19WREVDX0RFVEFJTCwKKwkJCSJhbW12ZGVjX3ZoMjY1OiBJbnN1ZmZpY2llbnQgZGF0YVxuIik7CisKKwkJdmRlY19zY2hlZHVsZV93b3JrKCZwYmktPndvcmspOworCQlyZXR1cm47CisJfQorCisJQVRSQUNFX0NPVU5URVIoIlZfU1RfREVDLWNodW5rX3NpemUiLCBzaXplKTsKKworCWlucHV0X2VtcHR5W3BiaS0+aW5kZXhdID0gMDsKKwlwYmktPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX05PTkU7CisJcGJpLT5zdGFydF9zaGlmdF9ieXRlcyA9IFJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpOworCisJdnA5X2ZyYW1lX21vZGVfcHRzX3NhdmUocGJpKTsKKworCWlmIChkZWJ1ZyAmIFBSSU5UX0ZMQUdfVkRFQ19TVEFUVVMpIHsKKwkJaW50IGlpOworCQl2cDlfcHJpbnQocGJpLCAwLAorCQkJIiVzICglZCk6IHNpemUgMHgleCAoMHgleCAweCV4KSBzdW0gMHgleCAoJXggJXggJXggJXggJXgpIGJ5dGVzIDB4JXgiLAorCQkJX19mdW5jX18sCisJCQlwYmktPmZyYW1lX2NvdW50LCBzaXplLAorCQkJcGJpLT5jaHVuayA/IHBiaS0+Y2h1bmstPnNpemUgOiAwLAorCQkJcGJpLT5jaHVuayA/IHBiaS0+Y2h1bmstPm9mZnNldCA6IDAsCisJCQlwYmktPmNodW5rID8gKCh2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpICYmCisJCQkoZGVidWcgJiBQUklOVF9GTEFHX1ZERUNfU1RBVFVTKSkgPworCQkJZ2V0X2RhdGFfY2hlY2tfc3VtKHBiaSwgc2l6ZSkgOiAwKSA6IDAsCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9TVEFSVF9BRERSKSwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0VORF9BRERSKSwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0xFVkVMKSwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1dSX1BUUiksCisJCVJFQURfVlJFRyhIRVZDX1NUUkVBTV9SRF9QVFIpLAorCQlwYmktPnN0YXJ0X3NoaWZ0X2J5dGVzKTsKKworCQlpZiAoIXZkZWNfc2VjdXJlKGh3X3RvX3ZkZWMocGJpKSkgJiYKKwkJCXZkZWNfZnJhbWVfYmFzZWQodmRlYykgJiYgcGJpLT5jaHVuaykgeworCQkJdTggKmRhdGEgPSBOVUxMOworCisJCQlpZiAoIXBiaS0+Y2h1bmstPmJsb2NrLT5pc19tYXBwZWQpCisJCQkJZGF0YSA9IGNvZGVjX21tX3ZtYXAocGJpLT5jaHVuay0+YmxvY2stPnN0YXJ0ICsKKwkJCQkJcGJpLT5jaHVuay0+b2Zmc2V0LCA4KTsKKwkJCWVsc2UKKwkJCQlkYXRhID0gKCh1OCAqKXBiaS0+Y2h1bmstPmJsb2NrLT5zdGFydF92aXJ0KSArCisJCQkJCXBiaS0+Y2h1bmstPm9mZnNldDsKKworCQkJdnA5X3ByaW50X2NvbnQocGJpLCAwLCAiZGF0YSBhZHIgJXA6IiwKKwkJCQlkYXRhKTsKKwkJCWZvciAoaWkgPSAwOyBpaSA8IDg7IGlpKyspCisJCQkJdnA5X3ByaW50X2NvbnQocGJpLCAwLCAiJTAyeCAiLAorCQkJCQlkYXRhW2lpXSk7CisKKwkJCWlmICghcGJpLT5jaHVuay0+YmxvY2stPmlzX21hcHBlZCkKKwkJCQljb2RlY19tbV91bm1hcF9waHlhZGRyKGRhdGEpOworCQl9CisJCXZwOV9wcmludF9jb250KHBiaSwgMCwgIlxyXG4iKTsKKwl9CisJQVRSQUNFX0NPVU5URVIocGJpLT50cmFjZS5kZWNvZGVfcnVuX3RpbWVfbmFtZSwgVFJBQ0VfUlVOX0xPQURJTkdfRldfU1RBUlQpOworCWlmICh2ZGVjLT5tY19sb2FkZWQpIHsKKwkvKmZpcm13YXJlIGhhdmUgbG9hZCBiZWZvcmUsCisJICBhbmQgbm90IGNoYW5nZXMgdG8gYW5vdGhlci4KKwkgIGlnbm9yZSByZWxvYWQuCisJKi8KKwl9IGVsc2UgeworCQkJcmV0ID0gYW1oZXZjX2xvYWRtY19leChWRk9STUFUX1ZQOSwgTlVMTCwgcGJpLT5mdy0+ZGF0YSk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJYW1oZXZjX2Rpc2FibGUoKTsKKwkJCXZwOV9wcmludChwYmksIFBSSU5UX0ZMQUdfRVJST1IsCisJCQkJIlZQOTogdGhlICVzIGZ3IGxvYWRpbmcgZmFpbGVkLCBlcnI6ICV4XG4iLAorCQkJCXRlZV9lbmFibGVkKCkgPyAiVEVFIiA6ICJsb2NhbCIsIHJldCk7CisJCQlwYmktPmRlY19yZXN1bHQgPSBERUNfUkVTVUxUX0ZPUkNFX0VYSVQ7CisJCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJnBiaS0+d29yayk7CisJCQlyZXR1cm47CisJCX0KKwkJdmRlYy0+bWNfbG9hZGVkID0gMTsKKwkJdmRlYy0+bWNfdHlwZSA9IFZGT1JNQVRfVlA5OworCX0KKwlBVFJBQ0VfQ09VTlRFUihwYmktPnRyYWNlLmRlY29kZV9ydW5fdGltZV9uYW1lLCBUUkFDRV9SVU5fTE9BRElOR19GV19FTkQpOworCisJQVRSQUNFX0NPVU5URVIocGJpLT50cmFjZS5kZWNvZGVfcnVuX3RpbWVfbmFtZSwgVFJBQ0VfUlVOX0xPQURJTkdfUkVTVE9SRV9TVEFSVCk7CisJaWYgKHZwOV9od19jdHhfcmVzdG9yZShwYmkpIDwgMCkgeworCQl2ZGVjX3NjaGVkdWxlX3dvcmsoJnBiaS0+d29yayk7CisJCXJldHVybjsKKwl9CisJQVRSQUNFX0NPVU5URVIocGJpLT50cmFjZS5kZWNvZGVfcnVuX3RpbWVfbmFtZSwgVFJBQ0VfUlVOX0xPQURJTkdfUkVTVE9SRV9FTkQpOworCXZkZWNfZW5hYmxlX2lucHV0KHZkZWMpOworCisJV1JJVEVfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHLCBIRVZDX0FDVElPTl9ET05FKTsKKworCWlmICh2ZGVjX2ZyYW1lX2Jhc2VkKHZkZWMpKSB7CisJCWlmIChkZWJ1ZyAmIFBSSU5UX0ZMQUdfVkRFQ19EQVRBKQorCQkJZHVtcF9kYXRhKHBiaSwgcGJpLT5jaHVuay0+c2l6ZSk7CisKKwkJV1JJVEVfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQsIDApOworCQlzaXplID0gcGJpLT5jaHVuay0+c2l6ZSArCisJCQkocGJpLT5jaHVuay0+b2Zmc2V0ICYgKFZERUNfRklGT19BTElHTiAtIDEpKTsKKwkJaWYgKHZkZWMtPm12ZnJtKQorCQkJdmRlYy0+bXZmcm0tPmZyYW1lX3NpemUgPSBwYmktPmNodW5rLT5zaXplOworCX0KKwlXUklURV9WUkVHKEhFVkNfREVDT0RFX1NJWkUsIHNpemUpOworCVdSSVRFX1ZSRUcoSEVWQ19ERUNPREVfQ09VTlQsIHBiaS0+c2xpY2VfaWR4KTsKKwlwYmktPmluaXRfZmxhZyA9IDE7CisKKwl2cDlfcHJpbnQocGJpLCBQUklOVF9GTEFHX1ZERUNfREVUQUlMLAorCQkiJXM6IHN0YXJ0IGhldmMgKCV4ICV4ICV4KVxuIiwKKwkJX19mdW5jX18sCisJCVJFQURfVlJFRyhIRVZDX0RFQ19TVEFUVVNfUkVHKSwKKwkJUkVBRF9WUkVHKEhFVkNfTVBDX0UpLAorCQlSRUFEX1ZSRUcoSEVWQ19NUFNSKSk7CisKKwlzdGFydF9wcm9jZXNzX3RpbWUocGJpKTsKKwltb2RfdGltZXIoJnBiaS0+dGltZXIsIGppZmZpZXMpOworCXBiaS0+c3RhdCB8PSBTVEFUX1RJTUVSX0FSTTsKKwlwYmktPnN0YXQgfD0gU1RBVF9JU1JfUkVHOworCWFtaGV2Y19zdGFydCgpOworCXBiaS0+c3RhdCB8PSBTVEFUX1ZERUNfUlVOOworfQorCisjaWZkZWYgU1VQUE9SVF9GQl9ERUNPRElORworc3RhdGljIHZvaWQgbXByZWRfcHJvY2VzcyhzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkpCit7CisJdW5pb24gcGFyYW1fdSAqcGFyYW1zID0gJnBiaS0+czFfcGFyYW07CisJdW5zaWduZWQgY2hhciB1c2VfcHJldl9mcmFtZV9tdnMgPQorCQkhcGFyYW1zLT5wLmVycm9yX3Jlc2lsaWVudF9tb2RlICYmCisJCXBhcmFtcy0+cC53aWR0aCA9PSBwYmktPnMxX3dpZHRoICYmCisJCXBhcmFtcy0+cC5oZWlnaHQgPT0gcGJpLT5zMV9oZWlnaHQgJiYKKwkJIXBiaS0+czFfaW50cmFfb25seSAmJgorCQlwYmktPnMxX2xhc3Rfc2hvd19mcmFtZSAmJgorCQkocGJpLT5zMV9mcmFtZV90eXBlICE9IEtFWV9GUkFNRSk7CisJcGJpLT5zMV93aWR0aCA9IHBhcmFtcy0+cC53aWR0aDsKKwlwYmktPnMxX2hlaWdodCA9IHBhcmFtcy0+cC5oZWlnaHQ7CisJcGJpLT5zMV9mcmFtZV90eXBlID0gcGFyYW1zLT5wLmZyYW1lX3R5cGU7CisJcGJpLT5zMV9pbnRyYV9vbmx5ID0KKwkJKHBhcmFtcy0+cC5zaG93X2ZyYW1lIHx8CisJCXBhcmFtcy0+cC5zaG93X2V4aXN0aW5nX2ZyYW1lKQorCQk/IDAgOiBwYXJhbXMtPnAuaW50cmFfb25seTsKKwlpZiAoKHBiaS0+czFfZnJhbWVfdHlwZSAhPSBLRVlfRlJBTUUpCisJCSYmICghcGJpLT5zMV9pbnRyYV9vbmx5KSkgeworCQl1bnNpZ25lZCBpbnQgZGF0YTMyOworCQlpbnQgbXByZWRfbXZfcmRfZW5kX2FkZHI7CisKKwkJbXByZWRfbXZfcmRfZW5kX2FkZHIgPQorCQkJcGJpLT5zMV9tcHJlZF9tdl93cl9zdGFydF9hZGRyX3ByZQorCQkJKyAocGJpLT5sY3VfdG90YWwgKiBNVl9NRU1fVU5JVCk7CisKKwkJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0NUUkwzLCAweDI0MTIyNDEyKTsKKwkJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0FCVl9TVEFSVF9BRERSLAorCQkJcGJpLT53b3JrX3NwYWNlX2J1Zi0+CisJCQltcHJlZF9hYm92ZS5idWZfc3RhcnQpOworCisJCWRhdGEzMiA9IFJFQURfVlJFRyhIRVZDX01QUkVEX0NUUkw0KTsKKworCQlkYXRhMzIgJj0gICh+KDEgPDwgNikpOworCQlkYXRhMzIgfD0gKHVzZV9wcmV2X2ZyYW1lX212cyA8PCA2KTsKKwkJV1JJVEVfVlJFRyhIRVZDX01QUkVEX0NUUkw0LCBkYXRhMzIpOworCisJCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9NVl9XUl9TVEFSVF9BRERSLAorCQkJCXBiaS0+czFfbXByZWRfbXZfd3Jfc3RhcnRfYWRkcik7CisJCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9NVl9XUFRSLAorCQkJcGJpLT5zMV9tcHJlZF9tdl93cl9zdGFydF9hZGRyKTsKKworCQlXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfUkRfU1RBUlRfQUREUiwKKwkJCXBiaS0+czFfbXByZWRfbXZfd3Jfc3RhcnRfYWRkcl9wcmUpOworCQlXUklURV9WUkVHKEhFVkNfTVBSRURfTVZfUlBUUiwKKwkJCXBiaS0+czFfbXByZWRfbXZfd3Jfc3RhcnRfYWRkcl9wcmUpOworCisJCVdSSVRFX1ZSRUcoSEVWQ19NUFJFRF9NVl9SRF9FTkRfQUREUiwKKwkJCW1wcmVkX212X3JkX2VuZF9hZGRyKTsKKworCX0gZWxzZQorCQljbGVhcl9tcHJlZF9odyhwYmkpOworCisJaWYgKCFwYXJhbXMtPnAuc2hvd19leGlzdGluZ19mcmFtZSkgeworCQlwYmktPnMxX21wcmVkX212X3dyX3N0YXJ0X2FkZHJfcHJlID0KKwkJCXBiaS0+czFfbXByZWRfbXZfd3Jfc3RhcnRfYWRkcjsKKwkJcGJpLT5zMV9sYXN0X3Nob3dfZnJhbWUgPQorCQkJcGFyYW1zLT5wLnNob3dfZnJhbWU7CisJCWlmIChwYmktPnMxX212X2J1Zl9pbmRleF9wcmVfcHJlICE9IE1WX0JVRkZFUl9OVU0pCisJCQlwdXRfbXZfYnVmKHBiaSwgJnBiaS0+czFfbXZfYnVmX2luZGV4X3ByZV9wcmUpOworCQlwYmktPnMxX212X2J1Zl9pbmRleF9wcmVfcHJlID0KKwkJCXBiaS0+czFfbXZfYnVmX2luZGV4X3ByZTsKKwkJcGJpLT5zMV9tdl9idWZfaW5kZXhfcHJlID0gcGJpLT5zMV9tdl9idWZfaW5kZXg7CisJfSBlbHNlCisJCXB1dF9tdl9idWYocGJpLCAmcGJpLT5zMV9tdl9idWZfaW5kZXgpOworfQorCitzdGF0aWMgdm9pZCB2cDlfczFfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnMxX3dvcmspCit7CisJc3RydWN0IFZQOURlY29kZXJfcyAqcGJpID0gY29udGFpbmVyX29mKHMxX3dvcmssCisJCXN0cnVjdCBWUDlEZWNvZGVyX3MsIHMxX3dvcmspOworCXZwOV9wcmludChwYmksIFBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsCisJCSIlcyBkZWNfczFfcmVzdWx0ICVkXG4iLAorCQlfX2Z1bmNfXywKKwkJcGJpLT5kZWNfczFfcmVzdWx0KTsKKworI2lmZGVmIEZCX0RFQ09ESU5HX1RFU1RfU0NIRURVTEUKKwlpZiAocGJpLT5kZWNfczFfcmVzdWx0ID09CisJCURFQ19TMV9SRVNVTFRfVEVTVF9UUklHR0VSX0RPTkUpIHsKKwkJcGJpLT5zMV90ZXN0X2NtZCA9IFRFU1RfU0VUX1BJQ19ET05FOworCQlXUklURV9WUkVHKEhFVkNfQVNTSVNUX01CT1gwX0lSUV9SRUcsIDB4MSk7CisJfQorI2VuZGlmCisJaWYgKHBiaS0+ZGVjX3MxX3Jlc3VsdCA9PSBERUNfUzFfUkVTVUxUX0RPTkUgfHwKKwkJcGJpLT5kZWNfczFfcmVzdWx0ID09IERFQ19TMV9SRVNVTFRfRk9SQ0VfRVhJVCkgeworCisJCXZkZWNfY29yZV9maW5pc2hfcnVuKGh3X3RvX3ZkZWMocGJpKSwKKwkJCUNPUkVfTUFTS19IRVZDX0ZST05UKTsKKworCQl0cmlnZ2VyX3NjaGVkdWxlKHBiaSk7CisJCS8qcGJpLT5kZWNfczFfcmVzdWx0ID0gREVDX1MxX1JFU1VMVF9OT05FOyovCisJfQorCit9CisKK3N0YXRpYyB2b2lkIHJ1bl9iYWNrKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJc3RydWN0IFZQOURlY29kZXJfcyAqcGJpID0KKwkJKHN0cnVjdCBWUDlEZWNvZGVyX3MgKil2ZGVjLT5wcml2YXRlOworCWludCBpOworCXJ1bjJfY291bnRbcGJpLT5pbmRleF0rKzsKKwlpZiAoZGVidWcgJiBQUklOVF9GTEFHX1ZERUNfU1RBVFVTKSB7CisJCXZwOV9wcmludChwYmksIDAsCisJCQkiJXMiLCBfX2Z1bmNfXyk7CisJfQorCXBiaS0+cnVuMl9idXN5ID0gMTsKKyNpZm5kZWYgRkJfREVDT0RJTkdfVEVTVF9TQ0hFRFVMRQorCWZiX3Jlc2V0X2NvcmUodmRlYywgSFdfTUFTS19CQUNLKTsKKworCXZ2cDlfcHJvdF9pbml0KHBiaSwgSFdfTUFTS19CQUNLKTsKKyNlbmRpZgorCXZwOV9yZWN5Y2xlX21tdV9idWZfdGFpbChwYmkpOworCisJaWYgKHBiaS0+ZnJhbWVfY291bnQgPiAwKQorCQl2cDlfYnVmbWdyX3Bvc3Rwcm9jKHBiaSk7CisKKwlpZiAoZ2V0X3MyX2J1ZihwYmkpID49IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IChSUE1fRU5EIC0gUlBNX0JFR0lOKTsgaSArPSA0KSB7CisJCQlpbnQgaWk7CisJCQlmb3IgKGlpID0gMDsgaWkgPCA0OyBpaSsrKQorCQkJCXBiaS0+dnA5X3BhcmFtLmwuZGF0YVtpICsgaWldID0KKwkJCQkJcGJpLT5zMl9idWYtPnJwbVtpICsgMyAtIGlpXTsKKwkJfQorI2lmbmRlZiBGQl9ERUNPRElOR19URVNUX1NDSEVEVUxFCisJCVdSSVRFX1ZSRUcoSEVWQ19BU1NJU1RfRkJEX01NVV9NQVBfQUREUiwKKwkJCXBiaS0+c3RhZ2VfbW11X21hcF9waHlfYWRkciArCisJCQlwYmktPnMyX2J1Zi0+aW5kZXggKiBTVEFHRV9NTVVfTUFQX1NJWkUpOworI2VuZGlmCisJCWNvbnRpbnVlX2RlY29kaW5nKHBiaSk7CisJfQorCXBiaS0+cnVuMl9idXN5ID0gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBydW4oc3RydWN0IHZkZWNfcyAqdmRlYywgdW5zaWduZWQgbG9uZyBtYXNrLAorCXZvaWQgKCpjYWxsYmFjaykoc3RydWN0IHZkZWNfcyAqLCB2b2lkICopLCB2b2lkICphcmcpCit7CisJc3RydWN0IFZQOURlY29kZXJfcyAqcGJpID0KKwkJKHN0cnVjdCBWUDlEZWNvZGVyX3MgKil2ZGVjLT5wcml2YXRlOworCUFUUkFDRV9DT1VOVEVSKHBiaS0+dHJhY2UuZGVjb2RlX3RpbWVfbmFtZSwgREVDT0RFUl9SVU5fU1RBUlQpOworCXZwOV9wcmludChwYmksCisJCVBSSU5UX0ZMQUdfVkRFQ19ERVRBSUwsICIlcyBtYXNrICVseFxyXG4iLAorCQlfX2Z1bmNfXywgbWFzayk7CisKKwlpZiAodmRlYy0+bXZmcm0pCisJCXZkZWMtPm12ZnJtLT5od19kZWNvZGVfc3RhcnQgPSBsb2NhbF9jbG9jaygpOworCXJ1bl9jb3VudFtwYmktPmluZGV4XSsrOworCXBiaS0+dmRlY19jYl9hcmcgPSBhcmc7CisJcGJpLT52ZGVjX2NiID0gY2FsbGJhY2s7CisJcGJpLT5vbmVfcGFja2FnZV9mcmFtZV9jbnQgPSAwOworI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKKwlpZiAoKG1hc2sgJiBDT1JFX01BU0tfSEVWQykgfHwKKwkJKG1hc2sgJiBDT1JFX01BU0tfSEVWQ19GUk9OVCkpCisJCXJ1bl9mcm9udCh2ZGVjKTsKKworCWlmICgocGJpLT51c2VkX3N0YWdlX2J1Zl9udW0gPiAwKQorCQkmJiAobWFzayAmIENPUkVfTUFTS19IRVZDX0JBQ0spKQorCQlydW5fYmFjayh2ZGVjKTsKKyNlbHNlCisJcnVuX2Zyb250KHZkZWMpOworI2VuZGlmCisJQVRSQUNFX0NPVU5URVIocGJpLT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBERUNPREVSX1JVTl9FTkQpOworfQorCitzdGF0aWMgdm9pZCAgdnA5X2RlY29kZXJfY3R4X3Jlc2V0KHN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSkKK3sKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhwYmkpOworCXN0cnVjdCBWUDlfQ29tbW9uX3MgKmNvbnN0IGNtID0gJnBiaS0+Y29tbW9uOworCXN0cnVjdCBSZWZDbnRCdWZmZXJfcyAqY29uc3QgZnJhbWVfYnVmcyA9IGNtLT5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmczsKKwlzdHJ1Y3QgQnVmZmVyUG9vbF9zICpidWZmZXJfcG9vbCA9IGNtLT5idWZmZXJfcG9vbDsKKwlpbnQgaTsKKworCWNtLT5idWZmZXJfcG9vbCA9IGJ1ZmZlcl9wb29sOworCisJZm9yIChpID0gMDsgaSA8IEZSQU1FX0JVRkZFUlM7ICsraSkgeworCQlmcmFtZV9idWZzW2ldLmJ1Zi5pbmRleAkJPSBpOworCQlmcmFtZV9idWZzW2ldLnJlZl9jb3VudAkJPSAwOworCQlmcmFtZV9idWZzW2ldLmJ1Zi52Zl9yZWYJPSAwOworCQlmcmFtZV9idWZzW2ldLmJ1Zi5kZWNvZGVfaWR4CT0gMDsKKwkJZnJhbWVfYnVmc1tpXS5idWYuY21hX2FsbG9jX2FkZHIgPSAwOworCQlmcmFtZV9idWZzW2ldLmJ1Zi5CVUZfaW5kZXgJPSAtMTsKKwkJZnJhbWVfYnVmc1tpXS5idWYuc2xpY2VfdHlwZQk9IDA7CisJCWZyYW1lX2J1ZnNbaV0uYnVmLnJlcGVhdF9waWMgPSBOVUxMOworCQlmcmFtZV9idWZzW2ldLmJ1Zi5yZXBlYXRfY291bnQgPSAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBNVl9CVUZGRVJfTlVNOyArK2kpIHsKKwkJcGJpLT5tX212X0JVRltpXS51c2VkX2ZsYWcgPSAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBGUkFNRV9CVUZGRVJTOyBpKyspIHsKKwkJcGJpLT5idWZmZXJfd3JhcFtpXSA9IGk7CisJfQorCisJaWYgKHZkZWMtPnBhcmFsbGVsX2RlYyA9PSAxKSB7CisJCWZvciAoaSA9IDA7IGkgPCBGUkFNRV9CVUZGRVJTOyBpKyspIHsKKwkJCXZkZWMtPmZyZWVfY2FudmFzX2V4CisJCQkJKHBiaS0+Y29tbW9uLmJ1ZmZlcl9wb29sLT5mcmFtZV9idWZzW2ldLmJ1Zi55X2NhbnZhc19pbmRleCwKKwkJCQl2ZGVjLT5pZCk7CisJCQl2ZGVjLT5mcmVlX2NhbnZhc19leAorCQkJCShwYmktPmNvbW1vbi5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmc1tpXS5idWYudXZfY2FudmFzX2luZGV4LAorCQkJCXZkZWMtPmlkKTsKKwkJfQorCX0KKworCXBiaS0+aW5pdF9mbGFnCQk9IDA7CisJcGJpLT5maXJzdF9zY19jaGVja2VkCT0gMDsKKwlwYmktPmZhdGFsX2Vycm9yCT0gMDsKKwlwYmktPnNob3dfZnJhbWVfbnVtCT0gMDsKKwlwYmktPmVvcwkJPSAwOworCXBiaS0+cG9zdHByb2NfZG9uZQk9IDA7CisJcGJpLT5wcm9jZXNzX2J1c3kJPSAwOworfQorCitzdGF0aWMgdm9pZCByZXNldChzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSA9CisJCShzdHJ1Y3QgVlA5RGVjb2Rlcl9zICopdmRlYy0+cHJpdmF0ZTsKKworCWNhbmNlbF93b3JrX3N5bmMoJnBiaS0+c2V0X2Nsa193b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZwYmktPndvcmspOworCWlmIChwYmktPnN0YXQgJiBTVEFUX1ZERUNfUlVOKSB7CisJCWFtaGV2Y19zdG9wKCk7CisJCXBiaS0+c3RhdCAmPSB+U1RBVF9WREVDX1JVTjsKKwl9CisKKwlpZiAocGJpLT5zdGF0ICYgU1RBVF9USU1FUl9BUk0pIHsKKwkJZGVsX3RpbWVyX3N5bmMoJnBiaS0+dGltZXIpOworCQlwYmktPnN0YXQgJj0gflNUQVRfVElNRVJfQVJNOworCX0KKworCXJlc2V0X3Byb2Nlc3NfdGltZShwYmkpOworCisJdnA5X2xvY2FsX3VuaW5pdChwYmkpOworCWlmICh2dnA5X2xvY2FsX2luaXQocGJpKSA8IDApCisJCXZwOV9wcmludChwYmksIDAsICIlcyBsb2NhbF9pbml0IGZhaWxlZCBcclxuIiwgX19mdW5jX18pOworCisJdnA5X2RlY29kZXJfY3R4X3Jlc2V0KHBiaSk7CisKKwlhdG9taWNfc2V0KCZwYmktPnZmX3ByZV9jb3VudCwgMCk7CisJYXRvbWljX3NldCgmcGJpLT52Zl9nZXRfY291bnQsIDApOworCWF0b21pY19zZXQoJnBiaS0+dmZfcHV0X2NvdW50LCAwKTsKKworCWlmIChwYmktPmdlMmQpIHsKKwkJdmRlY19nZTJkX2Rlc3Ryb3kocGJpLT5nZTJkKTsKKwkJcGJpLT5nZTJkID0gTlVMTDsKKwl9CisKKwl2cDlfcHJpbnQocGJpLCAwLCAiJXNcclxuIiwgX19mdW5jX18pOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgdnA5X2lycV9jYihzdHJ1Y3QgdmRlY19zICp2ZGVjLCBpbnQgaXJxKQoreworCXN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSA9CisJCShzdHJ1Y3QgVlA5RGVjb2Rlcl9zICopdmRlYy0+cHJpdmF0ZTsKKwlyZXR1cm4gdnZwOV9pc3IoMCwgcGJpKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHZwOV90aHJlYWRlZF9pcnFfY2Ioc3RydWN0IHZkZWNfcyAqdmRlYywgaW50IGlycSkKK3sKKwlzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkgPQorCQkoc3RydWN0IFZQOURlY29kZXJfcyAqKXZkZWMtPnByaXZhdGU7CisJcmV0dXJuIHZ2cDlfaXNyX3RocmVhZF9mbigwLCBwYmkpOworfQorCitzdGF0aWMgdm9pZCB2cDlfZHVtcF9zdGF0ZShzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXN0cnVjdCBWUDlEZWNvZGVyX3MgKnBiaSA9CisJCShzdHJ1Y3QgVlA5RGVjb2Rlcl9zICopdmRlYy0+cHJpdmF0ZTsKKwlzdHJ1Y3QgVlA5X0NvbW1vbl9zICpjb25zdCBjbSA9ICZwYmktPmNvbW1vbjsKKwlpbnQgaTsKKwl2cDlfcHJpbnQocGJpLCAwLCAiPT09PT09ICVzXG4iLCBfX2Z1bmNfXyk7CisKKwl2cDlfcHJpbnQocGJpLCAwLAorCQkid2lkdGgvaGVpZ2h0ICglZC8lZCksIHVzZWRfYnVmX251bSAlZCB2aWRlb19zaWduYWxfdHlwZSAweCV4XG4iLAorCQljbS0+d2lkdGgsCisJCWNtLT5oZWlnaHQsCisJCXBiaS0+dXNlZF9idWZfbnVtLAorCQlwYmktPnZpZGVvX3NpZ25hbF90eXBlCisJCSk7CisKKwl2cDlfcHJpbnQocGJpLCAwLAorCQkiaXNfZnJhbWViYXNlKCVkKSwgZW9zICVkLCBkZWNfcmVzdWx0IDB4JXggZGVjX2ZybSAlZCBkaXNwX2ZybSAlZCBydW4gJWQgbm90X3J1bl9yZWFkeSAlZCBpbnB1dF9lbXB0eSAlZCBsb3dfbGF0ZW5jeSAlZCBub19oZWFkICVkIFxuIiwKKwkJaW5wdXRfZnJhbWVfYmFzZWQodmRlYyksCisJCXBiaS0+ZW9zLAorCQlwYmktPmRlY19yZXN1bHQsCisJCWRlY29kZV9mcmFtZV9jb3VudFtwYmktPmluZGV4XSwKKwkJZGlzcGxheV9mcmFtZV9jb3VudFtwYmktPmluZGV4XSwKKwkJcnVuX2NvdW50W3BiaS0+aW5kZXhdLAorCQlub3RfcnVuX3JlYWR5W3BiaS0+aW5kZXhdLAorCQlpbnB1dF9lbXB0eVtwYmktPmluZGV4XSwKKwkJcGJpLT5sb3dfbGF0ZW5jeV9mbGFnLAorCQlwYmktPm5vX2hlYWQKKwkJKTsKKworCWlmICghcGJpLT5pc191c2VkX3Y0bCAmJiB2Zl9nZXRfcmVjZWl2ZXIodmRlYy0+dmZfcHJvdmlkZXJfbmFtZSkpIHsKKwkJZW51bSByZWNldml2ZXJfc3RhcnRfZSBzdGF0ZSA9CisJCXZmX25vdGlmeV9yZWNlaXZlcih2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJVkZSQU1FX0VWRU5UX1BST1ZJREVSX1FVUkVZX1NUQVRFLAorCQkJTlVMTCk7CisJCXZwOV9wcmludChwYmksIDAsCisJCQkiXG5yZWNlaXZlciglcykgc3RhdGUgJWRcbiIsCisJCQl2ZGVjLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJc3RhdGUpOworCX0KKworCXZwOV9wcmludChwYmksIDAsCisJIiVzLCBuZXdxKCVkLyVkKSwgZGlzcHEoJWQvJWQpLCB2ZiBwcmVwYXJlL2dldC9wdXQgKCVkLyVkLyVkKSwgZnJlZV9idWZfY291bnQgJWQgKG1pbiAlZCBmb3IgcnVuX3JlYWR5KVxuIiwKKwlfX2Z1bmNfXywKKwlrZmlmb19sZW4oJnBiaS0+bmV3ZnJhbWVfcSksCisJVkZfUE9PTF9TSVpFLAorCWtmaWZvX2xlbigmcGJpLT5kaXNwbGF5X3EpLAorCVZGX1BPT0xfU0laRSwKKwlwYmktPnZmX3ByZV9jb3VudCwKKwlwYmktPnZmX2dldF9jb3VudCwKKwlwYmktPnZmX3B1dF9jb3VudCwKKwlnZXRfZnJlZV9idWZfY291bnQocGJpKSwKKwlwYmktPnJ1bl9yZWFkeV9taW5fYnVmX251bQorCSk7CisKKwlkdW1wX3BpY19saXN0KHBiaSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0JVRl9OVU07IGkrKykgeworCQl2cDlfcHJpbnQocGJpLCAwLAorCQkJIm12X0J1ZiglZCkgc3RhcnRfYWRyIDB4JXggc2l6ZSAweCV4IHVzZWQgJWRcbiIsCisJCQlpLAorCQkJcGJpLT5tX212X0JVRltpXS5zdGFydF9hZHIsCisJCQlwYmktPm1fbXZfQlVGW2ldLnNpemUsCisJCQlwYmktPm1fbXZfQlVGW2ldLnVzZWRfZmxhZyk7CisJfQorCisJdnA5X3ByaW50KHBiaSwgMCwKKwkJIkhFVkNfREVDX1NUQVRVU19SRUc9MHgleFxuIiwKKwkJUkVBRF9WUkVHKEhFVkNfREVDX1NUQVRVU19SRUcpKTsKKwl2cDlfcHJpbnQocGJpLCAwLAorCQkiSEVWQ19NUENfRT0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19NUENfRSkpOworCXZwOV9wcmludChwYmksIDAsCisJCSJERUNPREVfTU9ERT0weCV4XG4iLAorCQlSRUFEX1ZSRUcoREVDT0RFX01PREUpKTsKKwl2cDlfcHJpbnQocGJpLCAwLAorCQkiTkFMX1NFQVJDSF9DVEw9MHgleFxuIiwKKwkJUkVBRF9WUkVHKE5BTF9TRUFSQ0hfQ1RMKSk7CisJdnA5X3ByaW50KHBiaSwgMCwKKwkJIkhFVkNfUEFSU0VSX0xDVV9TVEFSVD0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19QQVJTRVJfTENVX1NUQVJUKSk7CisJdnA5X3ByaW50KHBiaSwgMCwKKwkJIkhFVkNfREVDT0RFX1NJWkU9MHgleFxuIiwKKwkJUkVBRF9WUkVHKEhFVkNfREVDT0RFX1NJWkUpKTsKKwl2cDlfcHJpbnQocGJpLCAwLAorCQkiSEVWQ19TSElGVF9CWVRFX0NPVU5UPTB4JXhcbiIsCisJCVJFQURfVlJFRyhIRVZDX1NISUZUX0JZVEVfQ09VTlQpKTsKKwl2cDlfcHJpbnQocGJpLCAwLAorCQkiSEVWQ19TVFJFQU1fU1RBUlRfQUREUj0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fU1RBUlRfQUREUikpOworCXZwOV9wcmludChwYmksIDAsCisJCSJIRVZDX1NUUkVBTV9FTkRfQUREUj0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fRU5EX0FERFIpKTsKKwl2cDlfcHJpbnQocGJpLCAwLAorCQkiSEVWQ19TVFJFQU1fTEVWRUw9MHgleFxuIiwKKwkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX0xFVkVMKSk7CisJdnA5X3ByaW50KHBiaSwgMCwKKwkJIkhFVkNfU1RSRUFNX1dSX1BUUj0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fV1JfUFRSKSk7CisJdnA5X3ByaW50KHBiaSwgMCwKKwkJIkhFVkNfU1RSRUFNX1JEX1BUUj0weCV4XG4iLAorCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fUkRfUFRSKSk7CisJdnA5X3ByaW50KHBiaSwgMCwKKwkJIlBBUlNFUl9WSURFT19SUD0weCV4XG4iLAorCQlTVEJVRl9SRUFEKCZ2ZGVjLT52YnVmLCBnZXRfcnApKTsKKwl2cDlfcHJpbnQocGJpLCAwLAorCQkiUEFSU0VSX1ZJREVPX1dQPTB4JXhcbiIsCisJCVNUQlVGX1JFQUQoJnZkZWMtPnZidWYsIGdldF93cCkpOworCisJaWYgKGlucHV0X2ZyYW1lX2Jhc2VkKHZkZWMpICYmCisJCShkZWJ1ZyAmIFBSSU5UX0ZMQUdfVkRFQ19EQVRBKQorCQkpIHsKKwkJaW50IGpqOworCQlpZiAocGJpLT5jaHVuayAmJiBwYmktPmNodW5rLT5ibG9jayAmJgorCQkJcGJpLT5jaHVuay0+c2l6ZSA+IDApIHsKKwkJCXU4ICpkYXRhID0gTlVMTDsKKworCQkJaWYgKCFwYmktPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQkJCWRhdGEgPSBjb2RlY19tbV92bWFwKAorCQkJCQlwYmktPmNodW5rLT5ibG9jay0+c3RhcnQgKworCQkJCQlwYmktPmNodW5rLT5vZmZzZXQsCisJCQkJCXBiaS0+Y2h1bmstPnNpemUpOworCQkJZWxzZQorCQkJCWRhdGEgPSAoKHU4ICopcGJpLT5jaHVuay0+YmxvY2stPnN0YXJ0X3ZpcnQpCisJCQkJCSsgcGJpLT5jaHVuay0+b2Zmc2V0OworCQkJdnA5X3ByaW50KHBiaSwgMCwKKwkJCQkiZnJhbWUgZGF0YSBzaXplIDB4JXhcbiIsCisJCQkJcGJpLT5jaHVuay0+c2l6ZSk7CisJCQlmb3IgKGpqID0gMDsgamogPCBwYmktPmNodW5rLT5zaXplOyBqaisrKSB7CisJCQkJaWYgKChqaiAmIDB4ZikgPT0gMCkKKwkJCQkJdnA5X3ByaW50KHBiaSwgMCwKKwkJCQkJCSIlMDZ4OiIsIGpqKTsKKwkJCQl2cDlfcHJpbnRfY29udChwYmksIDAsCisJCQkJCSIlMDJ4ICIsIGRhdGFbampdKTsKKwkJCQlpZiAoKChqaiArIDEpICYgMHhmKSA9PSAwKQorCQkJCQl2cDlfcHJpbnRfY29udChwYmksIDAsCisJCQkJCQkiXG4iKTsKKwkJCX0KKworCQkJaWYgKCFwYmktPmNodW5rLT5ibG9jay0+aXNfbWFwcGVkKQorCQkJCWNvZGVjX21tX3VubWFwX3BoeWFkZHIoZGF0YSk7CisJCX0KKwl9CisKK30KKworc3RhdGljIGludCBhbW12ZGVjX3ZwOV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB2ZGVjX3MgKnBkYXRhID0gKihzdHJ1Y3QgdmRlY19zICoqKXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCByZXQ7CisJaW50IGk7CisJaW50IGNvbmZpZ192YWw7CisJaW50IHRyYW5zZmVyX3ZhbDsKKwlzdHJ1Y3QgdmZyYW1lX2NvbnRlbnRfbGlnaHRfbGV2ZWxfcyBjb250ZW50X2xpZ2h0X2xldmVsOworCXN0cnVjdCB2ZnJhbWVfbWFzdGVyX2Rpc3BsYXlfY29sb3VyX3MgdmZfZHA7CisKKwlzdHJ1Y3QgVlA5RGVjb2Rlcl9zICpwYmkgPSBOVUxMOworCXN0cnVjdCBhbWxfdmNvZGVjX2N0eCAqY3R4ID0gTlVMTDsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPCBBTV9NRVNPTl9DUFVfTUFKT1JfSURfR1hMIHx8CisJCWdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVFhMIHx8CisJCWdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDUpIHsKKwkJcHJfaW5mbygidnA5IHVuc3VwcG9ydGVkIG9uIGNwdSAweCV4XG4iLCBnZXRfY3B1X21ham9yX2lkKCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAocGRhdGEgPT0gTlVMTCkgeworCQlwcl9pbmZvKCJcbmFtbXZkZWNfdnA5IG1lbW9yeSByZXNvdXJjZSB1bmRlZmluZWQuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCS8qcGJpID0gKHN0cnVjdCBWUDlEZWNvZGVyX3MgKilkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwKKwkJc2l6ZW9mKHN0cnVjdCBWUDlEZWNvZGVyX3MpLCBHRlBfS0VSTkVMKTsqLworCW1lbXNldCgmdmZfZHAsIDAsIHNpemVvZihzdHJ1Y3QgdmZyYW1lX21hc3Rlcl9kaXNwbGF5X2NvbG91cl9zKSk7CisJcGJpID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IFZQOURlY29kZXJfcykpOworCWlmIChwYmkgPT0gTlVMTCkgeworCQlwcl9pbmZvKCJcbmFtbXZkZWNfdnA5IGRldmljZSBkYXRhIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChwYmksIDAsIHNpemVvZihzdHJ1Y3QgVlA5RGVjb2Rlcl9zKSk7CisKKwkvKiB0aGUgY3R4IGZyb20gdjRsMiBkcml2ZXIuICovCisJcGJpLT52NGwyX2N0eCA9IHBkYXRhLT5wcml2YXRlOworCWN0eCA9IChzdHJ1Y3QgYW1sX3Zjb2RlY19jdHggKikocGJpLT52NGwyX2N0eCk7CisJcGRhdGEtPnByaXZhdGUgPSBwYmk7CisJcGRhdGEtPmRlY19zdGF0dXMgPSB2dnA5X2RlY19zdGF0dXM7CisJLyogcGRhdGEtPnNldF90cmlja21vZGUgPSBzZXRfdHJpY2ttb2RlOyAqLworCXBkYXRhLT5ydW5fcmVhZHkgPSBydW5fcmVhZHk7CisJcGRhdGEtPnJ1biA9IHJ1bjsKKwlwZGF0YS0+cmVzZXQgPSByZXNldDsKKwlwZGF0YS0+aXJxX2hhbmRsZXIgPSB2cDlfaXJxX2NiOworCXBkYXRhLT50aHJlYWRlZF9pcnFfaGFuZGxlciA9IHZwOV90aHJlYWRlZF9pcnFfY2I7CisJcGRhdGEtPmR1bXBfc3RhdGUgPSB2cDlfZHVtcF9zdGF0ZTsKKworCXBiaS0+aW5kZXggPSBwZGV2LT5pZDsKKworCWlmIChpc19yZG1hX2VuYWJsZSgpKSB7CisJCXBiaS0+cmRtYV9hZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLCBSRE1BX1NJWkUsICZwYmktPnJkbWFfcGh5X2FkciwgR0ZQX0tFUk5FTCk7CisJCWZvciAoaSA9IDA7IGkgPCBTQ0FMRUxVVF9EQVRBX1dSSVRFX05VTTsgaSsrKSB7CisJCQlwYmktPnJkbWFfYWRyW2kgKiA0XSA9IEhFVkNfSVFJVF9TQ0FMRUxVVF9XUl9BRERSICYgMHhmZmY7CisJCQlwYmktPnJkbWFfYWRyW2kgKiA0ICsgMV0gPSBpOworCQkJcGJpLT5yZG1hX2FkcltpICogNCArIDJdID0gSEVWQ19JUUlUX1NDQUxFTFVUX0RBVEEgJiAweGZmZjsKKwkJCXBiaS0+cmRtYV9hZHJbaSAqIDQgKyAzXSA9IDA7CisJCQlpZiAoaSA9PSBTQ0FMRUxVVF9EQVRBX1dSSVRFX05VTSAtIDEpIHsKKwkJCQlwYmktPnJkbWFfYWRyW2kgKiA0ICsgMl0gPSAoSEVWQ19JUUlUX1NDQUxFTFVUX0RBVEEgJiAweGZmZikgfCAweDIwMDAwOworCQkJfQorCQl9CisJfQorCisJc25wcmludGYocGJpLT50cmFjZS52ZGVjX25hbWUsIHNpemVvZihwYmktPnRyYWNlLnZkZWNfbmFtZSksCisJCSJ2cDktJWQiLCBwYmktPmluZGV4KTsKKwlzbnByaW50ZihwYmktPnRyYWNlLnB0c19uYW1lLCBzaXplb2YocGJpLT50cmFjZS5wdHNfbmFtZSksCisJCSIlcy10aW1lc3RhbXAiLCBwYmktPnRyYWNlLnZkZWNfbmFtZSk7CisJc25wcmludGYocGJpLT50cmFjZS5uZXdfcV9uYW1lLCBzaXplb2YocGJpLT50cmFjZS5uZXdfcV9uYW1lKSwKKwkJIiVzLW5ld2ZyYW1lX3EiLCBwYmktPnRyYWNlLnZkZWNfbmFtZSk7CisJc25wcmludGYocGJpLT50cmFjZS5kaXNwX3FfbmFtZSwgc2l6ZW9mKHBiaS0+dHJhY2UuZGlzcF9xX25hbWUpLAorCQkiJXMtZGlzcGZyYW1lX3EiLCBwYmktPnRyYWNlLnZkZWNfbmFtZSk7CisJc25wcmludGYocGJpLT50cmFjZS5kZWNvZGVfdGltZV9uYW1lLCBzaXplb2YocGJpLT50cmFjZS5kZWNvZGVfdGltZV9uYW1lKSwKKwkJImRlY29kZXJfdGltZSVkIiwgcGRldi0+aWQpOworCXNucHJpbnRmKHBiaS0+dHJhY2UuZGVjb2RlX3J1bl90aW1lX25hbWUsIHNpemVvZihwYmktPnRyYWNlLmRlY29kZV9ydW5fdGltZV9uYW1lKSwKKwkJImRlY29kZXJfcnVuX3RpbWUlZCIsIHBkZXYtPmlkKTsKKwlzbnByaW50ZihwYmktPnRyYWNlLmRlY29kZV9oZWFkZXJfbWVtb3J5X3RpbWVfbmFtZSwgc2l6ZW9mKHBiaS0+dHJhY2UuZGVjb2RlX2hlYWRlcl9tZW1vcnlfdGltZV9uYW1lKSwKKwkJImRlY29kZXJfaGVhZGVyX3RpbWUlZCIsIHBkZXYtPmlkKTsKKworCWlmIChwZGF0YS0+dXNlX3ZmbV9wYXRoKQorCQlzbnByaW50ZihwZGF0YS0+dmZfcHJvdmlkZXJfbmFtZSwgVkRFQ19QUk9WSURFUl9OQU1FX1NJWkUsCisJCQlWRk1fREVDX1BST1ZJREVSX05BTUUpOworCWVsc2UKKwkJc25wcmludGYocGRhdGEtPnZmX3Byb3ZpZGVyX25hbWUsIFZERUNfUFJPVklERVJfTkFNRV9TSVpFLAorCQkJTVVMVElfSU5TVEFOQ0VfUFJPVklERVJfTkFNRSAiLiUwMngiLCBwZGV2LT5pZCAmIDB4ZmYpOworCisJcGJpLT5wcm92aWRlcl9uYW1lID0gcGRhdGEtPnZmX3Byb3ZpZGVyX25hbWU7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGRhdGEpOworCisJcGJpLT5wbGF0Zm9ybV9kZXYgPSBwZGV2OworCXBiaS0+dmlkZW9fc2lnbmFsX3R5cGUgPSAwOworCXBiaS0+bV9pbnNfZmxhZyA9IDE7CisJaWYgKCF2ZGVjX2lzX3N1cHBvcnRfNGsoKSkgeworCQlwYmktPm1heF9waWNfdyA9IDE5MjA7CisJCXBiaS0+bWF4X3BpY19oID0gMTA4ODsKKwl9IGVsc2UgaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA8IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpIHsKKwkJcGJpLT5tYXhfcGljX3cgPSA0MDk2OworCQlwYmktPm1heF9waWNfaCA9IDIzMDQ7CisJfSBlbHNlIHsKKwkJcGJpLT5tYXhfcGljX3cgPSA4MTkyOworCQlwYmktPm1heF9waWNfaCA9IDQ2MDg7CisJfQorCisJaWYgKChkZWJ1ZyAmIElHTk9SRV9QQVJBTV9GUk9NX0NPTkZJRykgPT0gMCAmJgorCQkJcGRhdGEtPmNvbmZpZ19sZW4pIHsKKyNpZmRlZiBNVUxUSV9JTlNUQU5DRV9TVVBQT1JUCisJCWludCB2cDlfYnVmX3dpZHRoID0gMDsKKwkJaW50IHZwOV9idWZfaGVpZ2h0ID0gMDsKKwkJLyp1c2UgcHRyIGNvbmZpZyBmb3IgZG91YmVsX3dyaXRlX21vZGUsIGV0YyovCisJCXZwOV9wcmludChwYmksIDAsICJwZGF0YS0+Y29uZmlnPSVzXG4iLCBwZGF0YS0+Y29uZmlnKTsKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJ2cDlfZG91YmxlX3dyaXRlX21vZGUiLAorCQkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJcGJpLT5kb3VibGVfd3JpdGVfbW9kZSA9IGNvbmZpZ192YWw7CisJCWVsc2UKKwkJCXBiaS0+ZG91YmxlX3dyaXRlX21vZGUgPSBkb3VibGVfd3JpdGVfbW9kZTsKKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgInNhdmVfYnVmZmVyX21vZGUiLAorCQkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJcGJpLT5zYXZlX2J1ZmZlcl9tb2RlID0gY29uZmlnX3ZhbDsKKwkJZWxzZQorCQkJcGJpLT5zYXZlX2J1ZmZlcl9tb2RlID0gMDsKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJ2cDlfYnVmX3dpZHRoIiwKKwkJCQkmY29uZmlnX3ZhbCkgPT0gMCkgeworCQkJdnA5X2J1Zl93aWR0aCA9IGNvbmZpZ192YWw7CisJCX0KKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJ2cDlfYnVmX2hlaWdodCIsCisJCQkJJmNvbmZpZ192YWwpID09IDApIHsKKwkJCXZwOV9idWZfaGVpZ2h0ID0gY29uZmlnX3ZhbDsKKwkJfQorCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAibm9faGVhZCIsCisJCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlwYmktPm5vX2hlYWQgPSBjb25maWdfdmFsOworCQllbHNlCisJCQlwYmktPm5vX2hlYWQgPSBub19oZWFkOworCisJCS8qdXNlIHB0ciBjb25maWcgZm9yIG1heF9waWNfdywgZXRjKi8KKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJ2cDlfbWF4X3BpY193IiwKKwkJCQkmY29uZmlnX3ZhbCkgPT0gMCkgeworCQkJCXBiaS0+bWF4X3BpY193ID0gY29uZmlnX3ZhbDsKKwkJfQorCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgInZwOV9tYXhfcGljX2giLAorCQkJCSZjb25maWdfdmFsKSA9PSAwKSB7CisJCQkJcGJpLT5tYXhfcGljX2ggPSBjb25maWdfdmFsOworCQl9CisKKwkJaWYgKChwYmktPm1heF9waWNfdyAqIHBiaS0+bWF4X3BpY19oKQorCQkJPCAodnA5X2J1Zl93aWR0aCAqIHZwOV9idWZfaGVpZ2h0KSkgeworCQkJcGJpLT5tYXhfcGljX3cgPSB2cDlfYnVmX3dpZHRoOworCQkJcGJpLT5tYXhfcGljX2ggPSB2cDlfYnVmX2hlaWdodDsKKwkJCXZwOV9wcmludChwYmksIDAsICJ1c2UgYnVmIHJlc29sdXRpb25cbiIpOworCQl9CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJzaWRlYmluZF90eXBlIiwKKwkJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCXBiaS0+c2lkZWJpbmRfdHlwZSA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJzaWRlYmluZF9jaGFubmVsX2lkIiwKKwkJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCXBiaS0+c2lkZWJpbmRfY2hhbm5lbF9pZCA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV92NGxfY29kZWNfZW5hYmxlIiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJcGJpLT5pc191c2VkX3Y0bCA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV92NGxfYnVmZmVyX21hcmdpbiIsCisJCQkmY29uZmlnX3ZhbCkgPT0gMCkKKwkJCXBiaS0+ZHluYW1pY19idWZfbnVtX21hcmdpbiA9IGNvbmZpZ192YWw7CisKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV92NGxfY2FudmFzX21lbV9tb2RlIiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJcGJpLT5tZW1fbWFwX21vZGUgPSBjb25maWdfdmFsOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLAorCQkJInBhcm1fZW5hYmxlX2ZlbmNlIiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKQorCQkJcGJpLT5lbmFibGVfZmVuY2UgPSBjb25maWdfdmFsOworCisJCWlmIChnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLAorCQkJInBhcm1fZmVuY2VfdXNhZ2UiLAorCQkJJmNvbmZpZ192YWwpID09IDApCisJCQlwYmktPmZlbmNlX3VzYWdlID0gY29uZmlnX3ZhbDsKKworCQlpZiAoZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywKKwkJCSJwYXJtX3Y0bF9sb3dfbGF0ZW5jeV9tb2RlIiwKKwkJCSZjb25maWdfdmFsKSA9PSAwKSB7CisJCQlwYmktPmxvd19sYXRlbmN5X2ZsYWcgPSAoY29uZmlnX3ZhbCAmIDEpID8gMSA6IDA7CisJCQlwYmktPmVuYWJsZV9mZW5jZSA9IChjb25maWdfdmFsICYgMikgPyAxIDogMDsKKwkJfQorCisJCS8qaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsCisJCQkicGFybV92NGxfZHVyYXRpb24iLAorCQkJJmNvbmZpZ192YWwpID09IDApCisJCQl2ZGVjX2ZyYW1lX3JhdGVfdWV2ZW50KGNvbmZpZ192YWwpOyovCisjZW5kaWYKKwkJaWYgKGdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJIRFJTdGF0aWNJbmZvIiwKKwkJCQkmdmZfZHAucHJlc2VudF9mbGFnKSA9PSAwCisJCQkJJiYgdmZfZHAucHJlc2VudF9mbGFnID09IDEpIHsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJzaWduYWxfdHlwZSIsCisJCQkJCSZwYmktPnZpZGVvX3NpZ25hbF90eXBlKTsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtRy54IiwKKwkJCQkJJnZmX2RwLnByaW1hcmllc1swXVswXSk7CisJCQlnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAibUcueSIsCisJCQkJCSZ2Zl9kcC5wcmltYXJpZXNbMF1bMV0pOworCQkJZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm1CLngiLAorCQkJCQkmdmZfZHAucHJpbWFyaWVzWzFdWzBdKTsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtQi55IiwKKwkJCQkJJnZmX2RwLnByaW1hcmllc1sxXVsxXSk7CisJCQlnZXRfY29uZmlnX2ludChwZGF0YS0+Y29uZmlnLCAibVIueCIsCisJCQkJCSZ2Zl9kcC5wcmltYXJpZXNbMl1bMF0pOworCQkJZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm1SLnkiLAorCQkJCQkmdmZfZHAucHJpbWFyaWVzWzJdWzFdKTsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtVy54IiwKKwkJCQkJJnZmX2RwLndoaXRlX3BvaW50WzBdKTsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtVy55IiwKKwkJCQkJJnZmX2RwLndoaXRlX3BvaW50WzFdKTsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtTWF4REwiLAorCQkJCQkmdmZfZHAubHVtaW5hbmNlWzBdKTsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtTWluREwiLAorCQkJCQkmdmZfZHAubHVtaW5hbmNlWzFdKTsKKwkJCXZmX2RwLmNvbnRlbnRfbGlnaHRfbGV2ZWwucHJlc2VudF9mbGFnID0gMTsKKwkJCWdldF9jb25maWdfaW50KHBkYXRhLT5jb25maWcsICJtTWF4Q0xMIiwKKwkJCQkJJmNvbnRlbnRfbGlnaHRfbGV2ZWwubWF4X2NvbnRlbnQpOworCQkJZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm1NYXhGQUxMIiwKKwkJCQkJJmNvbnRlbnRfbGlnaHRfbGV2ZWwubWF4X3BpY19hdmVyYWdlKTsKKworCQkJZ2V0X2NvbmZpZ19pbnQocGRhdGEtPmNvbmZpZywgIm1UcmFuc2ZlciIsCisJCQkJCSZ0cmFuc2Zlcl92YWwpOworCisJCQlpZiAodHJhbnNmZXJfdmFsID09IDApCisJCQkJdHJhbnNmZXJfdmFsID0gMTY7CisKKwkJCXZwOV9wcmludChwYmksIDAsICJ0cmFuc2Zlcl92YWw9JWRcbiIsdHJhbnNmZXJfdmFsKTsKKworCQkJdmZfZHAuY29udGVudF9saWdodF9sZXZlbCA9IGNvbnRlbnRfbGlnaHRfbGV2ZWw7CisJCQlpZiAoIXBiaS0+dmlkZW9fc2lnbmFsX3R5cGUpIHsKKwkJCQlwYmktPnZpZGVvX3NpZ25hbF90eXBlID0gKDEgPDwgMjkpCisJCQkJCXwgKDUgPDwgMjYpCS8qIHVuc3BlY2lmaWVkICovCisJCQkJCXwgKDAgPDwgMjUpCS8qIGxpbWl0ICovCisJCQkJCXwgKDEgPDwgMjQpCS8qIGNvbG9yIGF2YWlsYWJsZSAqLworCQkJCQl8ICg5IDw8IDE2KQkvKiAyMDIwICovCisJCQkJCXwgKHRyYW5zZmVyX3ZhbCA8PCA4KQkvKiAyMDg0ICovCisJCQkJCXwgKDkgPDwgMCk7CS8qIDIwMjAgKi8KKwkJCX0KKwkJfQorCQlwYmktPnZmX2RwID0gdmZfZHA7CisJfSBlbHNlIHsKKwkJaWYgKHBkYXRhLT5zeXNfaW5mbykgeworCQkJcGJpLT52dnA5X2Ftc3RyZWFtX2RlY19pbmZvID0gKnBkYXRhLT5zeXNfaW5mbzsKKwkJCWlmICgocGJpLT52dnA5X2Ftc3RyZWFtX2RlY19pbmZvLndpZHRoICE9IDApICYmCisJCQkJKHBiaS0+dnZwOV9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQgIT0gMCkpIHsKKwkJCQlwYmktPm1heF9waWNfdyA9IHBiaS0+dnZwOV9hbXN0cmVhbV9kZWNfaW5mby53aWR0aDsKKwkJCQlwYmktPm1heF9waWNfaCA9IHBiaS0+dnZwOV9hbXN0cmVhbV9kZWNfaW5mby5oZWlnaHQ7CisJCQl9CisJCX0KKwkJLypwYmktPnZ2cDlfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGggPSAwOworCQlwYmktPnZ2cDlfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0ID0gMDsKKwkJcGJpLT52dnA5X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgPSAzMDsqLworCQlwYmktPmRvdWJsZV93cml0ZV9tb2RlID0gZG91YmxlX3dyaXRlX21vZGU7CisJfQorCisJaWYgKCFwYmktPmlzX3VzZWRfdjRsKSB7CisJCXZmX3Byb3ZpZGVyX2luaXQoJnBkYXRhLT52ZnJhbWVfcHJvdmlkZXIsIHBkYXRhLT52Zl9wcm92aWRlcl9uYW1lLAorCQkJJnZ2cDlfdmZfcHJvdmlkZXIsIHBiaSk7CisJfQorCisJaWYgKG5vX2hlYWQgJiAweDEwKSB7CisJCXBiaS0+bm9faGVhZCA9IChub19oZWFkICYgMHhmKTsKKwl9CisKKwlwYmktPmVuZGlhbiA9IEhFVkNfQ09ORklHX0xJVFRMRV9FTkRJQU47CisJaWYgKCFwYmktPmlzX3VzZWRfdjRsKSB7CisJCXBiaS0+bWVtX21hcF9tb2RlID0gbWVtX21hcF9tb2RlOworCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNykKKwkJCXBiaS0+ZW5kaWFuID0gSEVWQ19DT05GSUdfQklHX0VORElBTjsKKwl9CisJaWYgKGVuZGlhbikKKwkJcGJpLT5lbmRpYW4gPSBlbmRpYW47CisKKwlpZiAocGJpLT5pc191c2VkX3Y0bCkKKwkJcGJpLT5ydW5fcmVhZHlfbWluX2J1Zl9udW0gPSBydW5fcmVhZHlfbWluX2J1Zl9udW0gLSAxIDsKKwllbHNlCisJCXBiaS0+cnVuX3JlYWR5X21pbl9idWZfbnVtID0gcnVuX3JlYWR5X21pbl9idWZfbnVtOworCisJaWYgKGlzX292ZXJzaXplKHBiaS0+bWF4X3BpY193LCBwYmktPm1heF9waWNfaCkpIHsKKwkJcHJfZXJyKCJvdmVyIHNpemU6ICVkeCVkLCBwcm9iZSBmYWlsZWRcbiIsCisJCQlwYmktPm1heF9waWNfdywgcGJpLT5tYXhfcGljX2gpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGZvcmNlX2NvbmZpZ19mZW5jZSkgeworCQlwYmktPmVuYWJsZV9mZW5jZSA9IHRydWU7CisJCXBiaS0+ZmVuY2VfdXNhZ2UgPQorCQkJKGZvcmNlX2NvbmZpZ19mZW5jZSA+PiA0KSAmIDB4ZjsKKwkJaWYgKGZvcmNlX2NvbmZpZ19mZW5jZSAmIDB4MikKKwkJCXBiaS0+ZW5hYmxlX2ZlbmNlID0gZmFsc2U7CisJCXZwOV9wcmludChwYmksIDAsICJlbmFibGUgZmVuY2U6ICVkLCBmZW5jZSB1c2FnZTogJWRcbiIsCisJCQlwYmktPmVuYWJsZV9mZW5jZSwgcGJpLT5mZW5jZV91c2FnZSk7CisJfQorCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA8IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWEwgfHwKKwkJcGJpLT5kb3VibGVfd3JpdGVfbW9kZSA9PSAweDEwKQorCQlwYmktPm1tdV9lbmFibGUgPSAwOworCWVsc2UKKwkJcGJpLT5tbXVfZW5hYmxlID0gMTsKKworCXZpZGVvX3NpZ25hbF90eXBlID0gcGJpLT52aWRlb19zaWduYWxfdHlwZTsKKworCWlmIChwZGF0YS0+c3lzX2luZm8pIHsKKwkJcGJpLT52dnA5X2Ftc3RyZWFtX2RlY19pbmZvID0gKnBkYXRhLT5zeXNfaW5mbzsKKwl9IGVsc2UgeworCQlwYmktPnZ2cDlfYW1zdHJlYW1fZGVjX2luZm8ud2lkdGggPSAwOworCQlwYmktPnZ2cDlfYW1zdHJlYW1fZGVjX2luZm8uaGVpZ2h0ID0gMDsKKwkJcGJpLT52dnA5X2Ftc3RyZWFtX2RlY19pbmZvLnJhdGUgPSAzMDsKKwl9CisKKwlwYmktPmxvd19sYXRlbmN5X2ZsYWcgPSAxOworCXZwOV9wcmludChwYmksIDAsCisJCQkibm9faGVhZCAlZCAgbG93X2xhdGVuY3kgJWQgdmlkZW9fc2lnbmFsX3R5cGUgMHgleFxuIiwKKwkJCXBiaS0+bm9faGVhZCwgcGJpLT5sb3dfbGF0ZW5jeV9mbGFnLCBwYmktPnZpZGVvX3NpZ25hbF90eXBlKTsKKyNpZiAwCisJcGJpLT5idWZfc3RhcnQgPSBwZGF0YS0+bWVtX3N0YXJ0OworCXBiaS0+YnVmX3NpemUgPSBwZGF0YS0+bWVtX2VuZCAtIHBkYXRhLT5tZW1fc3RhcnQgKyAxOworI2Vsc2UKKwlpZiAoYW12ZGVjX3ZwOV9tbXVfaW5pdChwYmkpIDwgMCkgeworCQlwcl9lcnIoInZwOSBhbGxvYyBibW11IGJveCBmYWlsZWQhIVxuIik7CisJCS8qIGRldm1fa2ZyZWUoJnBkZXYtPmRldiwgKHZvaWQgKilwYmkpOyAqLworCQl2ZnJlZSgodm9pZCAqKXBiaSk7CisJCXBkYXRhLT5kZWNfc3RhdHVzID0gTlVMTDsKKwkJcmV0dXJuIC0xOworCX0KKworCXBiaS0+Y21hX2FsbG9jX2NvdW50ID0gUEFHRV9BTElHTih3b3JrX2J1Zl9zaXplKSAvIFBBR0VfU0laRTsKKwlyZXQgPSBkZWNvZGVyX2JtbXVfYm94X2FsbG9jX2J1Zl9waHkocGJpLT5ibW11X2JveCwgV09SS19TUEFDRV9CVUZfSUQsCisJCQlwYmktPmNtYV9hbGxvY19jb3VudCAqIFBBR0VfU0laRSwgRFJJVkVSX05BTUUsCisJCQkmcGJpLT5jbWFfYWxsb2NfYWRkcik7CisJaWYgKHJldCA8IDApIHsKKwkJdW5pbml0X21tdV9idWZmZXJzKHBiaSk7CisJCS8qIGRldm1fa2ZyZWUoJnBkZXYtPmRldiwgKHZvaWQgKilwYmkpOyAqLworCQl2ZnJlZSgodm9pZCAqKXBiaSk7CisJCXBkYXRhLT5kZWNfc3RhdHVzID0gTlVMTDsKKwkJcmV0dXJuIHJldDsKKwl9CisJcGJpLT5idWZfc3RhcnQgPSBwYmktPmNtYV9hbGxvY19hZGRyOworCXBiaS0+YnVmX3NpemUgPSB3b3JrX2J1Zl9zaXplOworI2VuZGlmCisKKwlwYmktPmluaXRfZmxhZyA9IDA7CisJcGJpLT5maXJzdF9zY19jaGVja2VkID0gMDsKKwlwYmktPmZhdGFsX2Vycm9yID0gMDsKKwlwYmktPnNob3dfZnJhbWVfbnVtID0gMDsKKworCWlmIChkZWJ1ZykgeworCQlwcl9pbmZvKCI9PT1WUDkgZGVjb2RlciBtZW0gcmVzb3VyY2UgMHglbHggc2l6ZSAweCV4XG4iLAorCQkJICAgcGJpLT5idWZfc3RhcnQsCisJCQkgICBwYmktPmJ1Zl9zaXplKTsKKwl9CisKKwlwYmktPmNtYV9kZXYgPSBwZGF0YS0+Y21hX2RldjsKKworCW11dGV4X2luaXQoJnBiaS0+ZmVuY2VfbXV0ZXgpOworCisJaWYgKHBiaS0+ZW5hYmxlX2ZlbmNlKSB7CisJCXBkYXRhLT5zeW5jID0gdmRlY19zeW5jX2dldCgpOworCQlpZiAoIXBkYXRhLT5zeW5jKSB7CisJCQl2cDlfcHJpbnQocGJpLCAwLCAiYWxsb2MgZmVuY2UgdGltZWxpbmUgZXJyb3JcbiIpOworCQkJdnA5X2xvY2FsX3VuaW5pdChwYmkpOworCQkJdW5pbml0X21tdV9idWZmZXJzKHBiaSk7CisJCQkvKiBkZXZtX2tmcmVlKCZwZGV2LT5kZXYsICh2b2lkICopcGJpKTsgKi8KKwkJCXZmcmVlKCh2b2lkICopcGJpKTsKKwkJCXBkYXRhLT5kZWNfc3RhdHVzID0gTlVMTDsKKwkJCXJldHVybiAtMTsKKwkJfQorCQljdHgtPnN5bmMgPSBwZGF0YS0+c3luYzsKKwkJcGRhdGEtPnN5bmMtPnVzYWdlID0gcGJpLT5mZW5jZV91c2FnZTsKKwkJdmRlY190aW1lbGluZV9jcmVhdGUocGRhdGEtPnN5bmMsIERSSVZFUl9OQU1FKTsKKwkJdmRlY190aW1lbGluZV9nZXQocGRhdGEtPnN5bmMpOworCX0KKworCWlmICh2dnA5X2luaXQocGRhdGEpIDwgMCkgeworCQlwcl9pbmZvKCJcbmFtdmRlY192cDkgaW5pdCBmYWlsZWQuXG4iKTsKKwkJdmRlY190aW1lbGluZV9wdXQocGRhdGEtPnN5bmMpOworCQl2cDlfbG9jYWxfdW5pbml0KHBiaSk7CisJCXVuaW5pdF9tbXVfYnVmZmVycyhwYmkpOworCQkvKiBkZXZtX2tmcmVlKCZwZGV2LT5kZXYsICh2b2lkICopcGJpKTsgKi8KKwkJdmZyZWUoKHZvaWQgKilwYmkpOworCQlwZGF0YS0+ZGVjX3N0YXR1cyA9IE5VTEw7CisJCXJldHVybiAtRU5PREVWOworCX0KKwl2ZGVjX3NldF9wcmVwYXJlX2xldmVsKHBkYXRhLCBzdGFydF9kZWNvZGVfYnVmX2xldmVsKTsKKwloZXZjX3NvdXJjZV9jaGFuZ2VkKFZGT1JNQVRfVlA5LAorCQkJNDA5NiwgMjA0OCwgNjApOworI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKKwlpZiAocGJpLT51c2VkX3N0YWdlX2J1Zl9udW0gPiAwKQorCQl2ZGVjX2NvcmVfcmVxdWVzdChwZGF0YSwKKwkJCUNPUkVfTUFTS19IRVZDX0ZST05UIHwgQ09SRV9NQVNLX0hFVkNfQkFDSyk7CisJZWxzZQorCQl2ZGVjX2NvcmVfcmVxdWVzdChwZGF0YSwgQ09SRV9NQVNLX1ZERUNfMSB8IENPUkVfTUFTS19IRVZDCisJCQl8IENPUkVfTUFTS19IRVZDX0ZST05UIHwgQ09SRV9NQVNLX0hFVkNfQkFDSworCQkJCQl8IENPUkVfTUFTS19DT01CSU5FKTsKKyNlbHNlCisJaWYgKHBkYXRhLT5wYXJhbGxlbF9kZWMgPT0gMSkKKwkJdmRlY19jb3JlX3JlcXVlc3QocGRhdGEsIENPUkVfTUFTS19IRVZDKTsKKwllbHNlCisJCXZkZWNfY29yZV9yZXF1ZXN0KHBkYXRhLCBDT1JFX01BU0tfVkRFQ18xIHwgQ09SRV9NQVNLX0hFVkMKKwkJCQkJfCBDT1JFX01BU0tfQ09NQklORSk7CisjZW5kaWYKKwlwYmktPnBpY19saXN0X2luaXRfZG9uZTIgPSB0cnVlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1tdmRlY192cDlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IFZQOURlY29kZXJfcyAqcGJpID0gKHN0cnVjdCBWUDlEZWNvZGVyX3MgKikKKwkJKCgoc3RydWN0IHZkZWNfcyAqKShwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KSkpLT5wcml2YXRlKTsKKwlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gaHdfdG9fdmRlYyhwYmkpOworCWludCBpOworCWlmIChkZWJ1ZykKKwkJcHJfaW5mbygiYW12ZGVjX3ZwOV9yZW1vdmVcbiIpOworCisJdm12cDlfc3RvcChwYmkpOworCisJaWYgKHBiaS0+Z2UyZCkgeworCQl2ZGVjX2dlMmRfZGVzdHJveShwYmktPmdlMmQpOworCQlwYmktPmdlMmQgPSBOVUxMOworCX0KKworI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKKwl2ZGVjX2NvcmVfcmVsZWFzZShod190b192ZGVjKHBiaSksIENPUkVfTUFTS19WREVDXzEgfCBDT1JFX01BU0tfSEVWQworCQl8IENPUkVfTUFTS19IRVZDX0ZST05UIHwgQ09SRV9NQVNLX0hFVkNfQkFDSworCQkpOworI2Vsc2UKKwlpZiAodmRlYy0+cGFyYWxsZWxfZGVjID09IDEpCisJCXZkZWNfY29yZV9yZWxlYXNlKGh3X3RvX3ZkZWMocGJpKSwgQ09SRV9NQVNLX0hFVkMpOworCWVsc2UKKwkJdmRlY19jb3JlX3JlbGVhc2UoaHdfdG9fdmRlYyhwYmkpLCBDT1JFX01BU0tfVkRFQ18xIHwgQ09SRV9NQVNLX0hFVkMpOworI2VuZGlmCisJdmRlY19zZXRfc3RhdHVzKGh3X3RvX3ZkZWMocGJpKSwgVkRFQ19TVEFUVVNfRElTQ09OTkVDVEVEKTsKKworCWlmICh2ZGVjLT5wYXJhbGxlbF9kZWMgPT0gMSkgeworCQlmb3IgKGkgPSAwOyBpIDwgRlJBTUVfQlVGRkVSUzsgaSsrKSB7CisJCQl2ZGVjLT5mcmVlX2NhbnZhc19leAorCQkJCShwYmktPmNvbW1vbi5idWZmZXJfcG9vbC0+ZnJhbWVfYnVmc1tpXS5idWYueV9jYW52YXNfaW5kZXgsCisJCQkJdmRlYy0+aWQpOworCQkJdmRlYy0+ZnJlZV9jYW52YXNfZXgKKwkJCQkocGJpLT5jb21tb24uYnVmZmVyX3Bvb2wtPmZyYW1lX2J1ZnNbaV0uYnVmLnV2X2NhbnZhc19pbmRleCwKKwkJCQl2ZGVjLT5pZCk7CisJCX0KKwl9CisKKwlpZiAocGJpLT5lbmFibGVfZmVuY2UpCisJCXZkZWNfZmVuY2VfcmVsZWFzZShwYmksIHZkZWMtPnN5bmMpOworCisjaWZkZWYgREVCVUdfUFRTCisJcHJfaW5mbygicHRzIG1pc3NlZCAlbGQsIHB0cyBoaXQgJWxkLCBkdXJhdGlvbiAlZFxuIiwKKwkJICAgcGJpLT5wdHNfbWlzc2VkLCBwYmktPnB0c19oaXQsIHBiaS0+ZnJhbWVfZHVyKTsKKyNlbmRpZgorCW1lbV9tYXBfbW9kZSA9IDA7CisJaWYgKGlzX3JkbWFfZW5hYmxlKCkpCisJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwgUkRNQV9TSVpFLCBwYmktPnJkbWFfYWRyLCBwYmktPnJkbWFfcGh5X2Fkcik7CisKKwkvKiBkZXZtX2tmcmVlKCZwZGV2LT5kZXYsICh2b2lkICopcGJpKTsgKi8KKwl2ZnJlZSgodm9pZCAqKXBiaSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFtbXZkZWNfdnA5X2RyaXZlciA9IHsKKwkucHJvYmUgPSBhbW12ZGVjX3ZwOV9wcm9iZSwKKwkucmVtb3ZlID0gYW1tdmRlY192cDlfcmVtb3ZlLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kID0gYW1oZXZjX3N1c3BlbmQsCisJLnJlc3VtZSA9IGFtaGV2Y19yZXN1bWUsCisjZW5kaWYKKwkuZHJpdmVyID0geworCQkubmFtZSA9IE1VTFRJX0RSSVZFUl9OQU1FLAorCX0KK307CisjZW5kaWYKK3N0YXRpYyBzdHJ1Y3QgbWNvbmZpZyB2cDlfY29uZmlnc1tdID0geworCU1DX1BVMzIoImJpdF9kZXB0aF9sdW1hIiwgJmJpdF9kZXB0aF9sdW1hKSwKKwlNQ19QVTMyKCJiaXRfZGVwdGhfY2hyb21hIiwgJmJpdF9kZXB0aF9jaHJvbWEpLAorCU1DX1BVMzIoImZyYW1lX3dpZHRoIiwgJmZyYW1lX3dpZHRoKSwKKwlNQ19QVTMyKCJmcmFtZV9oZWlnaHQiLCAmZnJhbWVfaGVpZ2h0KSwKKwlNQ19QVTMyKCJkZWJ1ZyIsICZkZWJ1ZyksCisJTUNfUFUzMigicmFkciIsICZyYWRyKSwKKwlNQ19QVTMyKCJydmFsIiwgJnJ2YWwpLAorCU1DX1BVMzIoInBvcF9zaG9ydHMiLCAmcG9wX3Nob3J0cyksCisJTUNfUFUzMigiZGJnX2NtZCIsICZkYmdfY21kKSwKKwlNQ19QVTMyKCJkYmdfc2tpcF9kZWNvZGVfaW5kZXgiLCAmZGJnX3NraXBfZGVjb2RlX2luZGV4KSwKKwlNQ19QVTMyKCJlbmRpYW4iLCAmZW5kaWFuKSwKKwlNQ19QVTMyKCJzdGVwIiwgJnN0ZXApLAorCU1DX1BVMzIoInVkZWJ1Z19mbGFnIiwgJnVkZWJ1Z19mbGFnKSwKKwlNQ19QVTMyKCJkZWNvZGVfcGljX2JlZ2luIiwgJmRlY29kZV9waWNfYmVnaW4pLAorCU1DX1BVMzIoInNsaWNlX3BhcnNlX2JlZ2luIiwgJnNsaWNlX3BhcnNlX2JlZ2luKSwKKwlNQ19QVTMyKCJpX29ubHlfZmxhZyIsICZpX29ubHlfZmxhZyksCisJTUNfUFUzMigiZXJyb3JfaGFuZGxlX3BvbGljeSIsICZlcnJvcl9oYW5kbGVfcG9saWN5KSwKKwlNQ19QVTMyKCJidWZfYWxsb2Nfd2lkdGgiLCAmYnVmX2FsbG9jX3dpZHRoKSwKKwlNQ19QVTMyKCJidWZfYWxsb2NfaGVpZ2h0IiwgJmJ1Zl9hbGxvY19oZWlnaHQpLAorCU1DX1BVMzIoImJ1Zl9hbGxvY19kZXB0aCIsICZidWZfYWxsb2NfZGVwdGgpLAorCU1DX1BVMzIoImJ1Zl9hbGxvY19zaXplIiwgJmJ1Zl9hbGxvY19zaXplKSwKKwlNQ19QVTMyKCJidWZmZXJfbW9kZSIsICZidWZmZXJfbW9kZSksCisJTUNfUFUzMigiYnVmZmVyX21vZGVfZGJnIiwgJmJ1ZmZlcl9tb2RlX2RiZyksCisJTUNfUFUzMigibWF4X2J1Zl9udW0iLCAmbWF4X2J1Zl9udW0pLAorCU1DX1BVMzIoImR5bmFtaWNfYnVmX251bV9tYXJnaW4iLCAmZHluYW1pY19idWZfbnVtX21hcmdpbiksCisJTUNfUFUzMigibWVtX21hcF9tb2RlIiwgJm1lbV9tYXBfbW9kZSksCisJTUNfUFUzMigiZG91YmxlX3dyaXRlX21vZGUiLCAmZG91YmxlX3dyaXRlX21vZGUpLAorCU1DX1BVMzIoImVuYWJsZV9tZW1fc2F2aW5nIiwgJmVuYWJsZV9tZW1fc2F2aW5nKSwKKwlNQ19QVTMyKCJmb3JjZV93X2giLCAmZm9yY2Vfd19oKSwKKwlNQ19QVTMyKCJmb3JjZV9mcHMiLCAmZm9yY2VfZnBzKSwKKwlNQ19QVTMyKCJtYXhfZGVjb2RpbmdfdGltZSIsICZtYXhfZGVjb2RpbmdfdGltZSksCisJTUNfUFUzMigib25fbm9fa2V5ZnJhbWVfc2tpcGVkIiwgJm9uX25vX2tleWZyYW1lX3NraXBlZCksCisJTUNfUFUzMigic3RhcnRfZGVjb2RlX2J1Zl9sZXZlbCIsICZzdGFydF9kZWNvZGVfYnVmX2xldmVsKSwKKwlNQ19QVTMyKCJkZWNvZGVfdGltZW91dF92YWwiLCAmZGVjb2RlX3RpbWVvdXRfdmFsKSwKKwlNQ19QVTMyKCJ2cDlfbWF4X3BpY193IiwgJnZwOV9tYXhfcGljX3cpLAorCU1DX1BVMzIoInZwOV9tYXhfcGljX2giLCAmdnA5X21heF9waWNfaCksCit9Oworc3RhdGljIHN0cnVjdCBtY29uZmlnX25vZGUgdnA5X25vZGU7CisKK3N0YXRpYyBpbnQgX19pbml0IGFtdmRlY192cDlfZHJpdmVyX2luaXRfbW9kdWxlKHZvaWQpCit7CisKKwlzdHJ1Y3QgQnVmZkluZm9fcyAqcF9idWZfaW5mbzsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPD0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RNMiAmJiAhaXNfY3B1X3RtMl9yZXZiKCkpIHsKKwkJaWYgKHZkZWNfaXNfc3VwcG9ydF80aygpKSB7CisJCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9TTTEpCisJCQkJcF9idWZfaW5mbyA9ICZhbXZ2cDlfd29ya2J1ZmZfc3BlY1syXTsKKwkJCWVsc2UKKwkJCQlwX2J1Zl9pbmZvID0gJmFtdnZwOV93b3JrYnVmZl9zcGVjWzFdOworCQl9IGVsc2UKKwkJCXBfYnVmX2luZm8gPSAmYW12dnA5X3dvcmtidWZmX3NwZWNbMF07CisJfSBlbHNlIHsgLy9nZXRfY3B1X21ham9yX2lkKCkgPiBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVE0yIHx8IGlzX2NwdV90bTJfcmV2YigpCisJCWlmICh2ZGVjX2lzX3N1cHBvcnRfNGsoKSkKKwkJCXBfYnVmX2luZm8gPSAmYW12dnA5X3dvcmtidWZmX3NwZWNbNV07CisJCWVsc2UKKwkJCXBfYnVmX2luZm8gPSAmYW12dnA5X3dvcmtidWZmX3NwZWNbNF07CisJfQorCisKKwlpbml0X2J1ZmZfc3BlYyhOVUxMLCBwX2J1Zl9pbmZvKTsKKwl3b3JrX2J1Zl9zaXplID0KKwkJKHBfYnVmX2luZm8tPmVuZF9hZHIgLSBwX2J1Zl9pbmZvLT5zdGFydF9hZHIKKwkJICsgMHhmZmZmKSAmICh+MHhmZmZmKTsKKworCXByX2RlYnVnKCJhbXZkZWNfdnA5IG1vZHVsZSBpbml0XG4iKTsKKworCWVycm9yX2hhbmRsZV9wb2xpY3kgPSAwOworCisjaWZkZWYgRVJST1JfSEFORExFX0RFQlVHCisJZGJnX25hbF9za2lwX2ZsYWcgPSAwOworCWRiZ19uYWxfc2tpcF9jb3VudCA9IDA7CisjZW5kaWYKKwl1ZGVidWdfZmxhZyA9IDA7CisJZGVjb2RlX3BpY19iZWdpbiA9IDA7CisJc2xpY2VfcGFyc2VfYmVnaW4gPSAwOworCXN0ZXAgPSAwOworCWJ1Zl9hbGxvY19zaXplID0gMDsKKworCWlmIChwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFtbXZkZWNfdnA5X2RyaXZlcikpIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gcmVnaXN0ZXIgYW1tdmRlY192cDkgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA8IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWEwgfHwKKwkJZ2V0X2NwdV9tYWpvcl9pZCgpID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UWEwgfHwKKwkJZ2V0X2NwdV9tYWpvcl9pZCgpID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNSkgeworCQlhbXZkZWNfdnA5X3Byb2ZpbGUubmFtZSA9ICJ2cDlfdW5zdXBwb3J0IjsKKwl9IGVsc2UgaWYgKChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkgJiYKKwkJKGdldF9jcHVfbWFqb3JfaWQoKSAhPSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDVEKSkgeworCQlhbXZkZWNfdnA5X3Byb2ZpbGUucHJvZmlsZSA9CisJCQkiOGssIDEwYml0LCBkd3JpdGUsIGNvbXByZXNzZWQsIGZlbmNlLCB1dm0iOworCX0gZWxzZSB7CisJCWlmICh2ZGVjX2lzX3N1cHBvcnRfNGsoKSkKKwkJCWFtdmRlY192cDlfcHJvZmlsZS5wcm9maWxlID0KKwkJCQkiNGssIDEwYml0LCBkd3JpdGUsIGNvbXByZXNzZWQsIGZlbmNlLCB1dm0iOworCQllbHNlCisJCQlhbXZkZWNfdnA5X3Byb2ZpbGUucHJvZmlsZSA9CisJCQkJIjEwYml0LCBkd3JpdGUsIGNvbXByZXNzZWQsIGZlbmNlLCB1dm0iOworCX0KKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpCisJCW1heF9idWZfbnVtID0gTUFYX0JVRl9OVU1fTEVTUzsKKworCXZjb2RlY19wcm9maWxlX3JlZ2lzdGVyKCZhbXZkZWNfdnA5X3Byb2ZpbGUpOworCUlOSVRfUkVHX05PREVfQ09ORklHUygibWVkaWEuZGVjb2RlciIsICZ2cDlfbm9kZSwKKwkJInZwOS12NGwiLCB2cDlfY29uZmlncywgQ09ORklHX0ZPUl9SVyk7CisJdmNvZGVjX2ZlYXR1cmVfcmVnaXN0ZXIoVkZPUk1BVF9WUDksIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhbXZkZWNfdnA5X2RyaXZlcl9yZW1vdmVfbW9kdWxlKHZvaWQpCit7CisJcHJfZGVidWcoImFtdmRlY192cDkgbW9kdWxlIHJlbW92ZS5cbiIpOworCisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFtbXZkZWNfdnA5X2RyaXZlcik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCittb2R1bGVfcGFyYW0oYml0X2RlcHRoX2x1bWEsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhiaXRfZGVwdGhfbHVtYSwgIlxuIGFtdmRlY192cDkgYml0X2RlcHRoX2x1bWFcbiIpOworCittb2R1bGVfcGFyYW0oYml0X2RlcHRoX2Nocm9tYSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGJpdF9kZXB0aF9jaHJvbWEsICJcbiBhbXZkZWNfdnA5IGJpdF9kZXB0aF9jaHJvbWFcbiIpOworCittb2R1bGVfcGFyYW0oZnJhbWVfd2lkdGgsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmcmFtZV93aWR0aCwgIlxuIGFtdmRlY192cDkgZnJhbWVfd2lkdGhcbiIpOworCittb2R1bGVfcGFyYW0oZnJhbWVfaGVpZ2h0LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZnJhbWVfaGVpZ2h0LCAiXG4gYW12ZGVjX3ZwOSBmcmFtZV9oZWlnaHRcbiIpOworCittb2R1bGVfcGFyYW0oZGVidWcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIlxuIGFtdmRlY192cDkgZGVidWdcbiIpOworCittb2R1bGVfcGFyYW0ocmFkciwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJhZHIsICJcbiByYWRyXG4iKTsKKworbW9kdWxlX3BhcmFtKHJ2YWwsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhydmFsLCAiXG4gcnZhbFxuIik7CisKK21vZHVsZV9wYXJhbShwb3Bfc2hvcnRzLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocG9wX3Nob3J0cywgIlxuIHJ2YWxcbiIpOworCittb2R1bGVfcGFyYW0oZGJnX2NtZCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRiZ19jbWQsICJcbiBkYmdfY21kXG4iKTsKKworbW9kdWxlX3BhcmFtKGRiZ19za2lwX2RlY29kZV9pbmRleCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRiZ19za2lwX2RlY29kZV9pbmRleCwgIlxuIGRiZ19za2lwX2RlY29kZV9pbmRleFxuIik7CisKK21vZHVsZV9wYXJhbShlbmRpYW4sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhlbmRpYW4sICJcbiBydmFsXG4iKTsKKworbW9kdWxlX3BhcmFtKHN0ZXAsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhzdGVwLCAiXG4gYW12ZGVjX3ZwOSBzdGVwXG4iKTsKKworbW9kdWxlX3BhcmFtKGRlY29kZV9waWNfYmVnaW4sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkZWNvZGVfcGljX2JlZ2luLCAiXG4gYW12ZGVjX3ZwOSBkZWNvZGVfcGljX2JlZ2luXG4iKTsKKworbW9kdWxlX3BhcmFtKHNsaWNlX3BhcnNlX2JlZ2luLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Moc2xpY2VfcGFyc2VfYmVnaW4sICJcbiBhbXZkZWNfdnA5IHNsaWNlX3BhcnNlX2JlZ2luXG4iKTsKKworbW9kdWxlX3BhcmFtKGlfb25seV9mbGFnLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoaV9vbmx5X2ZsYWcsICJcbiBhbXZkZWNfdnA5IGlfb25seV9mbGFnXG4iKTsKKworbW9kdWxlX3BhcmFtKGxvd19sYXRlbmN5X2ZsYWcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhsb3dfbGF0ZW5jeV9mbGFnLCAiXG4gYW12ZGVjX3ZwOSBsb3dfbGF0ZW5jeV9mbGFnXG4iKTsKKworbW9kdWxlX3BhcmFtKG5vX2hlYWQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhub19oZWFkLCAiXG4gYW12ZGVjX3ZwOSBub19oZWFkXG4iKTsKKworbW9kdWxlX3BhcmFtKGVycm9yX2hhbmRsZV9wb2xpY3ksIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhlcnJvcl9oYW5kbGVfcG9saWN5LCAiXG4gYW12ZGVjX3ZwOSBlcnJvcl9oYW5kbGVfcG9saWN5XG4iKTsKKworbW9kdWxlX3BhcmFtKGJ1Zl9hbGxvY193aWR0aCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGJ1Zl9hbGxvY193aWR0aCwgIlxuIGJ1Zl9hbGxvY193aWR0aFxuIik7CisKK21vZHVsZV9wYXJhbShkaXNhYmxlX3JlcGVhdCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVfcmVwZWF0LCAiXG4gZGlzYWJsZV9yZXBlYXRcbiIpOworCittb2R1bGVfcGFyYW0oYnVmX2FsbG9jX2hlaWdodCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGJ1Zl9hbGxvY19oZWlnaHQsICJcbiBidWZfYWxsb2NfaGVpZ2h0XG4iKTsKKworbW9kdWxlX3BhcmFtKGJ1Zl9hbGxvY19kZXB0aCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGJ1Zl9hbGxvY19kZXB0aCwgIlxuIGJ1Zl9hbGxvY19kZXB0aFxuIik7CisKK21vZHVsZV9wYXJhbShidWZfYWxsb2Nfc2l6ZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGJ1Zl9hbGxvY19zaXplLCAiXG4gYnVmX2FsbG9jX3NpemVcbiIpOworCittb2R1bGVfcGFyYW0oYnVmZmVyX21vZGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhidWZmZXJfbW9kZSwgIlxuIGJ1ZmZlcl9tb2RlXG4iKTsKKworbW9kdWxlX3BhcmFtKGJ1ZmZlcl9tb2RlX2RiZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGJ1ZmZlcl9tb2RlX2RiZywgIlxuIGJ1ZmZlcl9tb2RlX2RiZ1xuIik7CisvKlVTRV9CVUZfQkxPQ0sqLworbW9kdWxlX3BhcmFtKG1heF9idWZfbnVtLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2J1Zl9udW0sICJcbiBtYXhfYnVmX251bVxuIik7CisKK21vZHVsZV9wYXJhbShkeW5hbWljX2J1Zl9udW1fbWFyZ2luLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZHluYW1pY19idWZfbnVtX21hcmdpbiwgIlxuIGR5bmFtaWNfYnVmX251bV9tYXJnaW5cbiIpOworCittb2R1bGVfcGFyYW0obXZfYnVmX21hcmdpbiwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG12X2J1Zl9tYXJnaW4sICJcbiBtdl9idWZfbWFyZ2luXG4iKTsKKworbW9kdWxlX3BhcmFtKG12X2J1Zl9keW5hbWljX2FsbG9jLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobXZfYnVmX2R5bmFtaWNfYWxsb2MsICJcbiBtdl9idWZfZHluYW1pY19hbGxvY1xuIik7CisKK21vZHVsZV9wYXJhbShydW5fcmVhZHlfbWluX2J1Zl9udW0sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhydW5fcmVhZHlfbWluX2J1Zl9udW0sICJcbiBydW5fcmVhZHlfbWluX2J1Zl9udW1cbiIpOworCisvKiovCisKK21vZHVsZV9wYXJhbShtZW1fbWFwX21vZGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhtZW1fbWFwX21vZGUsICJcbiBtZW1fbWFwX21vZGVcbiIpOworCisjaWZkZWYgU1VQUE9SVF8xMEJJVAorbW9kdWxlX3BhcmFtKGRvdWJsZV93cml0ZV9tb2RlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZG91YmxlX3dyaXRlX21vZGUsICJcbiBkb3VibGVfd3JpdGVfbW9kZVxuIik7CisKK21vZHVsZV9wYXJhbShlbmFibGVfbWVtX3NhdmluZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZV9tZW1fc2F2aW5nLCAiXG4gZW5hYmxlX21lbV9zYXZpbmdcbiIpOworCittb2R1bGVfcGFyYW0oZm9yY2Vfd19oLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2Vfd19oLCAiXG4gZm9yY2Vfd19oXG4iKTsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0oZm9yY2VfZnBzLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2VfZnBzLCAiXG4gZm9yY2VfZnBzXG4iKTsKKworbW9kdWxlX3BhcmFtKG1heF9kZWNvZGluZ190aW1lLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2RlY29kaW5nX3RpbWUsICJcbiBtYXhfZGVjb2RpbmdfdGltZVxuIik7CisKK21vZHVsZV9wYXJhbShvbl9ub19rZXlmcmFtZV9za2lwZWQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhvbl9ub19rZXlmcmFtZV9za2lwZWQsICJcbiBvbl9ub19rZXlmcmFtZV9za2lwZWRcbiIpOworCittb2R1bGVfcGFyYW0obWNyY2NfY2FjaGVfYWxnX2ZsYWcsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhtY3JjY19jYWNoZV9hbGdfZmxhZywgIlxuIG1jcmNjX2NhY2hlX2FsZ19mbGFnXG4iKTsKKworI2lmZGVmIE1VTFRJX0lOU1RBTkNFX1NVUFBPUlQKK21vZHVsZV9wYXJhbShzdGFydF9kZWNvZGVfYnVmX2xldmVsLCBpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhzdGFydF9kZWNvZGVfYnVmX2xldmVsLAorCQkiXG4gdnA5IHN0YXJ0X2RlY29kZV9idWZfbGV2ZWxcbiIpOworCittb2R1bGVfcGFyYW0oZGVjb2RlX3RpbWVvdXRfdmFsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVjb2RlX3RpbWVvdXRfdmFsLAorCSJcbiB2cDkgZGVjb2RlX3RpbWVvdXRfdmFsXG4iKTsKKworbW9kdWxlX3BhcmFtKHZwOV9tYXhfcGljX3csIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh2cDlfbWF4X3BpY193LCAiXG4gdnA5X21heF9waWNfd1xuIik7CisKK21vZHVsZV9wYXJhbSh2cDlfbWF4X3BpY19oLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0ModnA5X21heF9waWNfaCwgIlxuIHZwOV9tYXhfcGljX2hcbiIpOworCittb2R1bGVfcGFyYW1fYXJyYXkoZGVjb2RlX2ZyYW1lX2NvdW50LCB1aW50LAorCSZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisKK21vZHVsZV9wYXJhbV9hcnJheShkaXNwbGF5X2ZyYW1lX2NvdW50LCB1aW50LAorCSZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisKK21vZHVsZV9wYXJhbV9hcnJheShtYXhfcHJvY2Vzc190aW1lLCB1aW50LAorCSZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisKK21vZHVsZV9wYXJhbV9hcnJheShydW5fY291bnQsIHVpbnQsCisJJm1heF9kZWNvZGVfaW5zdGFuY2VfbnVtLCAwNjY0KTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGlucHV0X2VtcHR5LCB1aW50LAorCSZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisKK21vZHVsZV9wYXJhbV9hcnJheShub3RfcnVuX3JlYWR5LCB1aW50LAorCSZtYXhfZGVjb2RlX2luc3RhbmNlX251bSwgMDY2NCk7CisjZW5kaWYKKworI2lmZGVmIFNVUFBPUlRfRkJfREVDT0RJTkcKK21vZHVsZV9wYXJhbV9hcnJheShub3RfcnVuMl9yZWFkeSwgdWludCwKKwkmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCittb2R1bGVfcGFyYW1fYXJyYXkocnVuMl9jb3VudCwgdWludCwKKwkmbWF4X2RlY29kZV9pbnN0YW5jZV9udW0sIDA2NjQpOworCittb2R1bGVfcGFyYW0oc3RhZ2VfYnVmX251bSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHN0YWdlX2J1Zl9udW0sICJcbiBhbXZkZWNfaDI2NSBzdGFnZV9idWZfbnVtXG4iKTsKKyNlbmRpZgorbW9kdWxlX3BhcmFtKGZvcmNlX2J1ZnNwZWMsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9idWZzcGVjLCAiXG4gYW12ZGVjX2gyNjUgZm9yY2VfYnVmc3BlY1xuIik7CisKK21vZHVsZV9wYXJhbSh1ZGVidWdfZmxhZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHVkZWJ1Z19mbGFnLCAiXG4gYW12ZGVjX2gyNjUgdWRlYnVnX2ZsYWdcbiIpOworCittb2R1bGVfcGFyYW0odWRlYnVnX3BhdXNlX3BvcywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHVkZWJ1Z19wYXVzZV9wb3MsICJcbiB1ZGVidWdfcGF1c2VfcG9zXG4iKTsKKworbW9kdWxlX3BhcmFtKHVkZWJ1Z19wYXVzZV92YWwsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh1ZGVidWdfcGF1c2VfdmFsLCAiXG4gdWRlYnVnX3BhdXNlX3ZhbFxuIik7CisKK21vZHVsZV9wYXJhbSh1ZGVidWdfcGF1c2VfZGVjb2RlX2lkeCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHVkZWJ1Z19wYXVzZV9kZWNvZGVfaWR4LCAiXG4gdWRlYnVnX3BhdXNlX2RlY29kZV9pZHhcbiIpOworCittb2R1bGVfcGFyYW0od2l0aG91dF9kaXNwbGF5X21vZGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh3aXRob3V0X2Rpc3BsYXlfbW9kZSwgIlxuIHdpdGhvdXRfZGlzcGxheV9tb2RlXG4iKTsKKworbW9kdWxlX3BhcmFtKGZvcmNlX2NvbmZpZ19mZW5jZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2NvbmZpZ19mZW5jZSwgIlxuIGZvcmNlIGVuYWJsZSBmZW5jZVxuIik7CisKK21vZHVsZV9wYXJhbShmb3JjZV9wdHNfdW5zdGFibGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9wdHNfdW5zdGFibGUsICJcbiBmb3JjZV9wdHNfdW5zdGFibGVcbiIpOworCittb2R1bGVfcGFyYW0odjRsX2JpdHN0cmVhbV9pZF9lbmFibGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh2NGxfYml0c3RyZWFtX2lkX2VuYWJsZSwgIlxuIHY0bF9iaXRzdHJlYW1faWRfZW5hYmxlXG4iKTsKKworbW9kdWxlX2luaXQoYW12ZGVjX3ZwOV9kcml2ZXJfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoYW12ZGVjX3ZwOV9kcml2ZXJfcmVtb3ZlX21vZHVsZSk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQU1MT0dJQyB2cDkgVmlkZW8gRGVjb2RlciBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC92cDkvdnZwOS5oIGIvZHJpdmVycy9mcmFtZV9wcm92aWRlci9kZWNvZGVyX3Y0bC92cDkvdnZwOS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYjlkMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXJfdjRsL3ZwOS92dnA5LmgKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9hbXBvcnRzL3Z2cDkuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIFZWUDlfSAorI2RlZmluZSBWVlA5X0gKKwordm9pZCBhZGFwdF9jb2VmX3Byb2JzKGludCBwaWNfY291bnQsIGludCBwcmV2X2tmLCBpbnQgY3VyX2tmLCBpbnQgcHJlX2ZjLAordW5zaWduZWQgaW50ICpwcmV2X3Byb2IsIHVuc2lnbmVkIGludCAqY3VyX3Byb2IsIHVuc2lnbmVkIGludCAqY291bnQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3NpbmsvTWFrZWZpbGUgYi9kcml2ZXJzL2ZyYW1lX3NpbmsvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI5NzU0YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfc2luay9NYWtlZmlsZQpAQCAtMCwwICsxIEBACitvYmoteQkrPQllbmNvZGVyLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9zaW5rL2VuY29kZXIvTWFrZWZpbGUgYi9kcml2ZXJzL2ZyYW1lX3NpbmsvZW5jb2Rlci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTMxYmI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9zaW5rL2VuY29kZXIvTWFrZWZpbGUKQEAgLTAsMCArMSw0IEBACitvYmotJChDT05GSUdfQU1MT0dJQ19NRURJQV9WRU5DX0gyNjQpCSs9CWgyNjQvCitvYmotJChDT05GSUdfQU1MT0dJQ19NRURJQV9WRU5DX0gyNjUpCSs9CWgyNjUvCitvYmotJChDT05GSUdfQU1MT0dJQ19NRURJQV9WRU5DX01VTFRJKSArPSBtdWx0aS8KK29iai0kKENPTkZJR19BTUxPR0lDX01FRElBX1ZFTkNfSlBFRykgKz0ganBlZy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfc2luay9lbmNvZGVyL2gyNjQvTWFrZWZpbGUgYi9kcml2ZXJzL2ZyYW1lX3NpbmsvZW5jb2Rlci9oMjY0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMmQ3YzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3NpbmsvZW5jb2Rlci9oMjY0L01ha2VmaWxlCkBAIC0wLDAgKzEgQEAKK29iai1tCSs9CWVuY29kZXIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9zaW5rL2VuY29kZXIvaDI2NC9lbmNvZGVyLmMgYi9kcml2ZXJzL2ZyYW1lX3NpbmsvZW5jb2Rlci9oMjY0L2VuY29kZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDRlYTU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9mcmFtZV9zaW5rL2VuY29kZXIvaDI2NC9lbmNvZGVyLmMKQEAgLTAsMCArMSw1MzA0IEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL2FtcG9ydHMvZW5jb2Rlci5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorLy8jaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9mcmFtZV9zeW5jL3B0c3NlcnYuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL2Ftc3RyZWFtLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jYW52YXMvY2FudmFzLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jYW52YXMvY2FudmFzX21nci5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29kZWNfbW0uaD4KKyNpbmNsdWRlICIuLi8uLi8uLi9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWNfY2FudmFzX3V0aWxzLmgiCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy92ZGVjX3JlZy5oPgorI2luY2x1ZGUgIi4uLy4uLy4uL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdmRlYy5oIgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZmR0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLWNvbnRpZ3VvdXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL2FtcG9ydHNfY29uZmlnLmg+CisjaW5jbHVkZSAiZW5jb2Rlci5oIgorI2luY2x1ZGUgIi4uLy4uLy4uL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvYW12ZGVjLmgiCisjaW5jbHVkZSAiLi4vLi4vLi4vY29tbW9uL2NoaXBzL2RlY29kZXJfY3B1X3Zlcl9pbmZvLmgiCisjaW5jbHVkZSAiLi4vLi4vLi4vZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjLmgiCisjaW5jbHVkZSAiLi4vLi4vLi4vZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjX3Bvd2VyX2N0cmwuaCIKKworI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmRlY19yZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL3Bvd2VyX2N0cmwuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9wb3dlci9zYzItcGQuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9wb3dlci90My1wZC5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvcG93ZXJfZG9tYWluLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9wb3dlcl9jdHJsLmg+CisKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL2FtbG9nLmg+CisjaW5jbHVkZSAiLi4vLi4vLi4vc3RyZWFtX2lucHV0L2FtcG9ydHMvYW1wb3J0c19wcml2LmgiCisjaW5jbHVkZSAiLi4vLi4vLi4vZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy9maXJtd2FyZS5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvcmVnaXN0ZXJzL3JlZ2lzdGVyLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcmVzZXJ2ZWRfbWVtLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDQsMTEsMSkKKyNpbmNsdWRlIDx1YXBpL2xpbnV4L3NjaGVkL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQvc2lnbmFsLmg+CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BTV9KUEVHX0VOQ09ERVIKKyNpbmNsdWRlICJqcGVnZW5jLmgiCisjZW5kaWYKKworI2RlZmluZSBNSHogKDEwMDAwMDApCisKKyNkZWZpbmUgQ0hFQ0tfUkVUKF9yZXQpIGlmIChyZXQpIHtlbmNfcHIoTE9HX0VSUk9SLCBcCisJCSIlczolZDpmdW5jdGlvbiBjYWxsIGZhaWxlZCB3aXRoIHJlc3VsdDogJWRcbiIsXAorCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBfcmV0KTt9CisKKyNkZWZpbmUgRU5DT0RFX05BTUUgImVuY29kZXIiCisjZGVmaW5lIEFNVkVOQ19DQU5WQVNfSU5ERVggMHg2NAorI2RlZmluZSBBTVZFTkNfQ0FOVkFTX01BWF9JTkRFWCAweDZGCisKKyNkZWZpbmUgTUlOX1NJWkUgYW12ZW5jX2J1ZmZzcGVjWzBdLm1pbl9idWZmc2l6ZQorI2RlZmluZSBEVU1QX0lORk9fQllURVNfUEVSX01CIDgwCisKKyNkZWZpbmUgQURKVVNURURfUVBfRkxBRyA2NAorCitzdGF0aWMgczMyIGF2Y19kZXZpY2VfbWFqb3I7CitzdGF0aWMgc3RydWN0IGRldmljZSAqYW12ZW5jX2F2Y19kZXY7CisjZGVmaW5lIERSSVZFUl9OQU1FICJhbXZlbmNfYXZjIgorI2RlZmluZSBDTEFTU19OQU1FICJhbXZlbmNfYXZjIgorI2RlZmluZSBERVZJQ0VfTkFNRSAiYW12ZW5jX2F2YyIKKworc3RhdGljIHN0cnVjdCBlbmNvZGVfbWFuYWdlcl9zIGVuY29kZV9tYW5hZ2VyOworCisjZGVmaW5lIE1VTFRJX1NMSUNFX01DCisjZGVmaW5lIEgyNjRfRU5DX0NCUgorLyogI2RlZmluZSBNT1JFX01PRFVMRV9QQVJBTSAqLworCisjZGVmaW5lIEVOQ19DQU5WQVNfT0ZGU0VUICBBTVZFTkNfQ0FOVkFTX0lOREVYCisKKyNkZWZpbmUgVUNPREVfTU9ERV9GVUxMIDAKKworLyogI2RlZmluZSBFTkFCTEVfSUdOT1JFX0ZVTkNUSU9OICovCisKK3N0YXRpYyB1MzIgaWVfbWVfbWJfdHlwZTsKK3N0YXRpYyB1MzIgaWVfbWVfbW9kZTsKK3N0YXRpYyB1MzIgaWVfcGlwcGVsaW5lX2Jsb2NrID0gMzsKK3N0YXRpYyB1MzIgaWVfY3VyX3JlZl9zZWw7CisvKiBzdGF0aWMgdTMyIGF2Y19lbmRpYW4gPSA2OyAqLworc3RhdGljIHUzMiBjbG9ja19sZXZlbCA9IDU7CisKK3N0YXRpYyB1MzIgZW5jb2RlX3ByaW50X2xldmVsID0gTE9HX0RFQlVHOworc3RhdGljIHUzMiBub190aW1lb3V0Oworc3RhdGljIGludCBucl9tb2RlID0gLTE7CitzdGF0aWMgdTMyIHFwX3RhYmxlX2RlYnVnOworc3RhdGljIHUzMiB1c2VfcmVzZXRfY29udHJvbDsKK3N0YXRpYyB1MzIgdXNlX2dlMmQ7CitzdGF0aWMgdTMyIGR1bXBfaW5wdXQ7CisKKyNpZmRlZiBIMjY0X0VOQ19TVkMKK3N0YXRpYyB1MzIgc3ZjX2VuYWJsZSA9IDA7IC8qIEVuYWJsZSBzYWMgZmVhdHVyZSBvciBub3QgKi8KK3N0YXRpYyB1MzIgc3ZjX3JlZl9jb25mID0gMDsgLyogQ29udGludW91cyBubyByZWZlcmVuY2UgbnVtYmVycyAqLworI2VuZGlmCisKK3N0cnVjdCBoY29kZWNfY2xrcyB7CisJc3RydWN0IGNsayAqaGNvZGVjX2FjbGs7CisJLy9zdHJ1Y3QgY2xrICpoY29kZWNfYmNsazsKKwkvL3N0cnVjdCBjbGsgKmhjb2RlY19jY2xrOworfTsKKworc3RhdGljIHN0cnVjdCBoY29kZWNfY2xrcyBzX2hjb2RlY19jbGtzOworc3RydWN0IHJlc2V0X2NvbnRyb2wgKmhjb2RlY19yc3Q7CisKK3N0YXRpYyB1MzIgbWVfbXZfbWVyZ2VfY3RsID0KKwkoMHgxIDw8IDMxKSAgfCAgLyogWzMxXSBtZV9tZXJnZV9tdl9lbl8xNiAqLworCSgweDEgPDwgMzApICB8ICAvKiBbMzBdIG1lX21lcmdlX3NtYWxsX212X2VuXzE2ICovCisJKDB4MSA8PCAyOSkgIHwgIC8qIFsyOV0gbWVfbWVyZ2VfZmxleF9lbl8xNiAqLworCSgweDEgPDwgMjgpICB8ICAvKiBbMjhdIG1lX21lcmdlX3NhZF9lbl8xNiAqLworCSgweDEgPDwgMjcpICB8ICAvKiBbMjddIG1lX21lcmdlX212X2VuXzggKi8KKwkoMHgxIDw8IDI2KSAgfCAgLyogWzI2XSBtZV9tZXJnZV9zbWFsbF9tdl9lbl84ICovCisJKDB4MSA8PCAyNSkgIHwgIC8qIFsyNV0gbWVfbWVyZ2VfZmxleF9lbl84ICovCisJKDB4MSA8PCAyNCkgIHwgIC8qIFsyNF0gbWVfbWVyZ2Vfc2FkX2VuXzggKi8KKwkvKiBbMjM6MThdIG1lX21lcmdlX212X2RpZmZfMTYgLSBNViBkaWZmIDw9IG4gcGl4ZWwgY2FuIGJlIG1lcmdlZCAqLworCSgweDEyIDw8IDE4KSB8CisJLyogWzE3OjEyXSBtZV9tZXJnZV9tdl9kaWZmXzggLSBNViBkaWZmIDw9IG4gcGl4ZWwgY2FuIGJlIG1lcmdlZCAqLworCSgweDJiIDw8IDEyKSB8CisJLyogWzExOjBdIG1lX21lcmdlX21pbl9zYWQgLSBTQUQgPj0gMHgxODAgY2FuIGJlIG1lcmdlZCB3aXRoIG90aGVyIE1WICovCisJKDB4ODAgPDwgMCk7CisJLyogKCAweDQgPDwgMTgpICB8CisJICogLy8gWzIzOjE4XSBtZV9tZXJnZV9tdl9kaWZmXzE2IC0gTVYgZGlmZiA8PSBuIHBpeGVsIGNhbiBiZSBtZXJnZWQKKwkgKi8KKwkvKiAoIDB4M2YgPDwgMTIpICB8CisJICogLy8gWzE3OjEyXSBtZV9tZXJnZV9tdl9kaWZmXzggLSBNViBkaWZmIDw9IG4gcGl4ZWwgY2FuIGJlIG1lcmdlZAorCSAqLworCS8qICggMHhjMCA8PCAwKTsKKwkgKiAvLyBbMTE6MF0gbWVfbWVyZ2VfbWluX3NhZCAtIFNBRCA+PSAweDE4MCBjYW4gYmUgbWVyZ2VkIHdpdGggb3RoZXIgTVYKKwkgKi8KKworc3RhdGljIHUzMiBtZV9tdl93ZWlnaHRfMDEgPSAoMHg0MCA8PCAyNCkgfCAoMHgzMCA8PCAxNikgfCAoMHgyMCA8PCA4KSB8IDB4MzA7CitzdGF0aWMgdTMyIG1lX212X3dlaWdodF8yMyA9ICgweDQwIDw8IDgpIHwgMHgzMDsKK3N0YXRpYyB1MzIgbWVfc2FkX3JhbmdlX2luYyA9IDB4MDMwMzAzMDM7CitzdGF0aWMgdTMyIG1lX3N0ZXAwX2Nsb3NlX212ID0gMHgwMDNmZmMyMTsKK3N0YXRpYyB1MzIgbWVfZl9za2lwX3NhZDsKK3N0YXRpYyB1MzIgbWVfZl9za2lwX3dlaWdodDsKK3N0YXRpYyB1MzIgbWVfc2FkX2Vub3VnaF8wMTsvKiAweDAwMDE4MDEwOyAqLworc3RhdGljIHUzMiBtZV9zYWRfZW5vdWdoXzIzOy8qIDB4MDAwMDAwMjA7ICovCisKKy8qIFszMTowXSBOVU1fUk9XU19QRVJfU0xJQ0VfUCAqLworLyogWzE1OjBdIE5VTV9ST1dTX1BFUl9TTElDRV9JICovCitzdGF0aWMgdTMyIGZpeGVkX3NsaWNlX2NmZzsKKworLyogeSB0bnIgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgeV90bnJfbWNfZW4gPSAxOworc3RhdGljIHVuc2lnbmVkIGludCB5X3Rucl90eHRfbW9kZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgeV90bnJfbW90X3NhZF9tYXJnaW4gPSAxOworc3RhdGljIHVuc2lnbmVkIGludCB5X3Rucl9tb3RfY29ydHh0X3JhdGUgPSAxOworc3RhdGljIHVuc2lnbmVkIGludCB5X3Rucl9tb3RfZGlzdHh0X29mc3QgPSA1Oworc3RhdGljIHVuc2lnbmVkIGludCB5X3Rucl9tb3RfZGlzdHh0X3JhdGUgPSA0Oworc3RhdGljIHVuc2lnbmVkIGludCB5X3Rucl9tb3RfZGlzbW90X29mc3QgPSA0Oworc3RhdGljIHVuc2lnbmVkIGludCB5X3Rucl9tb3RfZnJjc2FkX2xvY2sgPSA4Oworc3RhdGljIHVuc2lnbmVkIGludCB5X3Rucl9tb3QyYWxwX2ZyY19nYWluID0gMTA7CitzdGF0aWMgdW5zaWduZWQgaW50IHlfdG5yX21vdDJhbHBfbnJtX2dhaW4gPSAyMTY7CitzdGF0aWMgdW5zaWduZWQgaW50IHlfdG5yX21vdDJhbHBfZGlzX2dhaW4gPSAxMjg7CitzdGF0aWMgdW5zaWduZWQgaW50IHlfdG5yX21vdDJhbHBfZGlzX29mc3QgPSAzMjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgeV90bnJfYWxwaGFfbWluID0gMzI7CitzdGF0aWMgdW5zaWduZWQgaW50IHlfdG5yX2FscGhhX21heCA9IDYzOworc3RhdGljIHVuc2lnbmVkIGludCB5X3Rucl9kZWdob3N0X29zOworLyogYyB0bnIgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgY190bnJfbWNfZW4gPSAxOworc3RhdGljIHVuc2lnbmVkIGludCBjX3Rucl90eHRfbW9kZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY190bnJfbW90X3NhZF9tYXJnaW4gPSAxOworc3RhdGljIHVuc2lnbmVkIGludCBjX3Rucl9tb3RfY29ydHh0X3JhdGUgPSAxOworc3RhdGljIHVuc2lnbmVkIGludCBjX3Rucl9tb3RfZGlzdHh0X29mc3QgPSA1Oworc3RhdGljIHVuc2lnbmVkIGludCBjX3Rucl9tb3RfZGlzdHh0X3JhdGUgPSA0Oworc3RhdGljIHVuc2lnbmVkIGludCBjX3Rucl9tb3RfZGlzbW90X29mc3QgPSA0Oworc3RhdGljIHVuc2lnbmVkIGludCBjX3Rucl9tb3RfZnJjc2FkX2xvY2sgPSA4Oworc3RhdGljIHVuc2lnbmVkIGludCBjX3Rucl9tb3QyYWxwX2ZyY19nYWluID0gMTA7CitzdGF0aWMgdW5zaWduZWQgaW50IGNfdG5yX21vdDJhbHBfbnJtX2dhaW4gPSAyMTY7CitzdGF0aWMgdW5zaWduZWQgaW50IGNfdG5yX21vdDJhbHBfZGlzX2dhaW4gPSAxMjg7CitzdGF0aWMgdW5zaWduZWQgaW50IGNfdG5yX21vdDJhbHBfZGlzX29mc3QgPSAzMjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY190bnJfYWxwaGFfbWluID0gMzI7CitzdGF0aWMgdW5zaWduZWQgaW50IGNfdG5yX2FscGhhX21heCA9IDYzOworc3RhdGljIHVuc2lnbmVkIGludCBjX3Rucl9kZWdob3N0X29zOworLyogeSBzbnIgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgeV9zbnJfZXJyX25vcm0gPSAxOworc3RhdGljIHVuc2lnbmVkIGludCB5X3Nucl9nYXVfYmxkX2NvcmUgPSAxOworc3RhdGljIGludCB5X3Nucl9nYXVfYmxkX29mc3QgPSAtMTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgeV9zbnJfZ2F1X2JsZF9yYXRlID0gNDg7CitzdGF0aWMgdW5zaWduZWQgaW50IHlfc25yX2dhdV9hbHAwX21pbjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgeV9zbnJfZ2F1X2FscDBfbWF4ID0gNjM7CitzdGF0aWMgdW5zaWduZWQgaW50IHlfYmxkX2JldGEyYWxwX3JhdGUgPSAxNjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgeV9ibGRfYmV0YV9taW47CitzdGF0aWMgdW5zaWduZWQgaW50IHlfYmxkX2JldGFfbWF4ID0gNjM7CisvKiBjIHNuciAqLworc3RhdGljIHVuc2lnbmVkIGludCBjX3Nucl9lcnJfbm9ybSA9IDE7CitzdGF0aWMgdW5zaWduZWQgaW50IGNfc25yX2dhdV9ibGRfY29yZSA9IDE7CitzdGF0aWMgaW50IGNfc25yX2dhdV9ibGRfb2ZzdCA9IC0xOworc3RhdGljIHVuc2lnbmVkIGludCBjX3Nucl9nYXVfYmxkX3JhdGUgPSA0ODsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY19zbnJfZ2F1X2FscDBfbWluOworc3RhdGljIHVuc2lnbmVkIGludCBjX3Nucl9nYXVfYWxwMF9tYXggPSA2MzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY19ibGRfYmV0YTJhbHBfcmF0ZSA9IDE2Oworc3RhdGljIHVuc2lnbmVkIGludCBjX2JsZF9iZXRhX21pbjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY19ibGRfYmV0YV9tYXggPSA2MzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcXBfbW9kZTsKKworc3RhdGljIERFRklORV9TUElOTE9DSyhsb2NrKTsKKworI2RlZmluZSBBRFZfTVZfTEFSR0VfMTZ4OCAxCisjZGVmaW5lIEFEVl9NVl9MQVJHRV84eDE2IDEKKyNkZWZpbmUgQURWX01WX0xBUkdFXzE2eDE2IDEKKworLyogbWUgd2VpZ2h0IG9mZnNldCBzaG91bGQgbm90IHZlcnkgc21hbGwsIGl0IHVzZWQgYnkgdjEgbWUgbW9kdWxlLiAqLworLyogdGhlIG1pbiByZWFsIHNhZCBmb3IgbWUgaXMgMTYgYnkgaGFyZHdhcmUuICovCisjZGVmaW5lIE1FX1dFSUdIVF9PRkZTRVQgMHg1MjAKKyNkZWZpbmUgSTRNQl9XRUlHSFRfT0ZGU0VUIDB4NjU1CisjZGVmaW5lIEkxNk1CX1dFSUdIVF9PRkZTRVQgMHg1NjAKKworI2RlZmluZSBBRFZfTVZfMTZ4MTZfV0VJR0hUIDB4MDgwCisjZGVmaW5lIEFEVl9NVl8xNl84X1dFSUdIVCAweDBlMAorI2RlZmluZSBBRFZfTVZfOHg4X1dFSUdIVCAweDI0MAorI2RlZmluZSBBRFZfTVZfNHg0eDRfV0VJR0hUIDB4MzAwMAorCisjZGVmaW5lIElFX1NBRF9TSElGVF9JMTYgMHgwMDEKKyNkZWZpbmUgSUVfU0FEX1NISUZUX0k0IDB4MDAxCisjZGVmaW5lIE1FX1NBRF9TSElGVF9JTlRFUiAweDAwMQorCisjZGVmaW5lIFNURVBfMl9TS0lQX1NBRCAwCisjZGVmaW5lIFNURVBfMV9TS0lQX1NBRCAwCisjZGVmaW5lIFNURVBfMF9TS0lQX1NBRCAwCisjZGVmaW5lIFNURVBfMl9TS0lQX1dFSUdIVCAwCisjZGVmaW5lIFNURVBfMV9TS0lQX1dFSUdIVCAwCisjZGVmaW5lIFNURVBfMF9TS0lQX1dFSUdIVCAwCisKKyNkZWZpbmUgTUVfU0FEX1JBTkdFXzAgMHgxIC8qIDB4MCAqLworI2RlZmluZSBNRV9TQURfUkFOR0VfMSAweDAKKyNkZWZpbmUgTUVfU0FEX1JBTkdFXzIgMHgwCisjZGVmaW5lIE1FX1NBRF9SQU5HRV8zIDB4MAorCisvKiB1c2UgMCBmb3IgdjMsIDB4MTggZm9yIHYyICovCisjZGVmaW5lIE1FX01WX1BSRV9XRUlHSFRfMCAweDE4CisvKiB1c2UgMCBmb3IgdjMsIDB4MTggZm9yIHYyICovCisjZGVmaW5lIE1FX01WX1BSRV9XRUlHSFRfMSAweDE4CisjZGVmaW5lIE1FX01WX1BSRV9XRUlHSFRfMiAweDAKKyNkZWZpbmUgTUVfTVZfUFJFX1dFSUdIVF8zIDB4MAorCisvKiB1c2UgMCBmb3IgdjMsIDB4MTggZm9yIHYyICovCisjZGVmaW5lIE1FX01WX1NURVBfV0VJR0hUXzAgMHgxOAorLyogdXNlIDAgZm9yIHYzLCAweDE4IGZvciB2MiAqLworI2RlZmluZSBNRV9NVl9TVEVQX1dFSUdIVF8xIDB4MTgKKyNkZWZpbmUgTUVfTVZfU1RFUF9XRUlHSFRfMiAweDAKKyNkZWZpbmUgTUVfTVZfU1RFUF9XRUlHSFRfMyAweDAKKworI2RlZmluZSBNRV9TQURfRU5PVUdIXzBfREFUQSAweDAwCisjZGVmaW5lIE1FX1NBRF9FTk9VR0hfMV9EQVRBIDB4MDQKKyNkZWZpbmUgTUVfU0FEX0VOT1VHSF8yX0RBVEEgMHgxMQorI2RlZmluZSBBRFZfTVZfOHg4X0VOT1VHSF9EQVRBIDB4MjAKKworLyogVjRfQ09MT1JfQkxPQ0tfRklYICovCisjZGVmaW5lIFYzX0ZPUkNFX1NLSVBfU0FEXzAgMHgxMAorLyogNCBCbG9ja3MgKi8KKyNkZWZpbmUgVjNfRk9SQ0VfU0tJUF9TQURfMSAweDYwCisvKiAxNiBCbG9ja3MgKyBWM19TS0lQX1dFSUdIVF8yICovCisjZGVmaW5lIFYzX0ZPUkNFX1NLSVBfU0FEXzIgMHgyNTAKKy8qIGFsbW9zdCBkaXNhYmxlIGl0IC0tIHVzZSB0X2xhY19jb2VmZl8yIG91dHB1dCB0byBGX1pFUk8gaXMgYmV0dGVyICovCisjZGVmaW5lIFYzX01FX0ZfWkVST19TQUQgKE1FX1dFSUdIVF9PRkZTRVQgKyAweDEwKQorCisjZGVmaW5lIFYzX0lFX0ZfWkVST19TQURfSTE2IChJMTZNQl9XRUlHSFRfT0ZGU0VUICsgMHgxMCkKKyNkZWZpbmUgVjNfSUVfRl9aRVJPX1NBRF9JNCAoSTRNQl9XRUlHSFRfT0ZGU0VUICsgMHgyMCkKKworI2RlZmluZSBWM19TS0lQX1dFSUdIVF8wIDB4MTAKKy8qIDQgQmxvY2tzICA4IHNlcGFyYXRlIHNlYXJjaCBzYWQgY2FuIGJlIHZlcnkgbG93ICovCisjZGVmaW5lIFYzX1NLSVBfV0VJR0hUXzEgMHg4IC8qICg0ICogTUVfTVZfU1RFUF9XRUlHSFRfMSArIDB4MTAwKSAqLworI2RlZmluZSBWM19TS0lQX1dFSUdIVF8yIDB4MworCisjZGVmaW5lIFYzX0xFVkVMXzFfRl9TS0lQX01BWF9TQUQgMHgwCisjZGVmaW5lIFYzX0xFVkVMXzFfU0tJUF9NQVhfU0FEIDB4NgorCisjZGVmaW5lIEk0X2lwcmVkX3dlaWdodF9tb3N0ICAgMHgxOAorI2RlZmluZSBJNF9pcHJlZF93ZWlnaHRfZWxzZSAgIDB4MjgKKworI2RlZmluZSBDX2lwcmVkX3dlaWdodF9WICAgICAgIDB4MDQKKyNkZWZpbmUgQ19pcHJlZF93ZWlnaHRfSCAgICAgICAweDA4CisjZGVmaW5lIENfaXByZWRfd2VpZ2h0X0RDICAgICAgMHgwYworCisjZGVmaW5lIEkxNl9pcHJlZF93ZWlnaHRfViAgICAgICAweDA0CisjZGVmaW5lIEkxNl9pcHJlZF93ZWlnaHRfSCAgICAgICAweDA4CisjZGVmaW5lIEkxNl9pcHJlZF93ZWlnaHRfREMgICAgICAweDBjCisKKy8qIDB4MDAgc2FtZSBhcyBkaXNhYmxlICovCisjZGVmaW5lIHYzX2xlZnRfc21hbGxfbWF4X2llX3NhZCAweDAwCisjZGVmaW5lIHYzX2xlZnRfc21hbGxfbWF4X21lX3NhZCAweDQwCisKKyNkZWZpbmUgdjVfdXNlX3NtYWxsX2RpZmZfY250IDAKKyNkZWZpbmUgdjVfc2ltcGxlX21iX2ludGVyX2FsbF9lbiAxCisjZGVmaW5lIHY1X3NpbXBsZV9tYl9pbnRlcl84eDhfZW4gMQorI2RlZmluZSB2NV9zaW1wbGVfbWJfaW50ZXJfMTZfOF9lbiAxCisjZGVmaW5lIHY1X3NpbXBsZV9tYl9pbnRlcl8xNngxNl9lbiAxCisjZGVmaW5lIHY1X3NpbXBsZV9tYl9pbnRyYV9lbiAxCisjZGVmaW5lIHY1X3NpbXBsZV9tYl9DX2VuIDAKKyNkZWZpbmUgdjVfc2ltcGxlX21iX1lfZW4gMQorI2RlZmluZSB2NV9zbWFsbF9kaWZmX1kgMHgxMAorI2RlZmluZSB2NV9zbWFsbF9kaWZmX0MgMHgxOAorLyogc2hpZnQgOC1iaXRzLCAyLCAxLCAwLCAtMSwgLTIsIC0zLCAtNCAqLworI2RlZmluZSB2NV9zaW1wbGVfZHFfc2V0dGluZyAweDQzMjEwZmVkCisjZGVmaW5lIHY1X3NpbXBsZV9tZV93ZWlnaHRfc2V0dGluZyAwCisKKyNpZmRlZiBIMjY0X0VOQ19DQlIKKyNkZWZpbmUgQ0JSX1RBQkxFX1NJWkUgIDB4ODAwCisjZGVmaW5lIENCUl9TSE9SVF9TSElGVCAxMiAvKiBzYW1lIGFzIGRpc2FibGUgKi8KKyNkZWZpbmUgQ0JSX0xPTkdfTUJfTlVNIDIKKyNkZWZpbmUgU1RBUlRfVEFCTEVfSUQgOAorI2RlZmluZSBDQlJfTE9OR19USFJFU0ggNAorI2VuZGlmCisKK3N0YXRpYyB1MzIgdjNfbXZfc2FkWzY0XSA9IHsKKwkvKiBGb3Igc3RlcDAgKi8KKwkweDAwMDAwMDA0LAorCTB4MDAwMTAwMDgsCisJMHgwMDAyMDAxMCwKKwkweDAwMDMwMDE4LAorCTB4MDAwNDAwMjAsCisJMHgwMDA1MDAyOCwKKwkweDAwMDYwMDM4LAorCTB4MDAwNzAwNDgsCisJMHgwMDA4MDA1OCwKKwkweDAwMDkwMDY4LAorCTB4MDAwYTAwODAsCisJMHgwMDBiMDA5OCwKKwkweDAwMGMwMGIwLAorCTB4MDAwZDAwYzgsCisJMHgwMDBlMDBlOCwKKwkweDAwMGYwMTEwLAorCS8qIEZvciBzdGVwMSAqLworCTB4MDAxMDAwMDIsCisJMHgwMDExMDAwNCwKKwkweDAwMTIwMDA4LAorCTB4MDAxMzAwMGMsCisJMHgwMDE0MDAxMCwKKwkweDAwMTUwMDE0LAorCTB4MDAxNjAwMWMsCisJMHgwMDE3MDAyNCwKKwkweDAwMTgwMDJjLAorCTB4MDAxOTAwMzQsCisJMHgwMDFhMDA0NCwKKwkweDAwMWIwMDU0LAorCTB4MDAxYzAwNjQsCisJMHgwMDFkMDA3NCwKKwkweDAwMWUwMDk0LAorCTB4MDAxZjAwYjQsCisJLyogRm9yIHN0ZXAyICovCisJMHgwMDIwMDAwNiwKKwkweDAwMjEwMDBjLAorCTB4MDAyMjAwMGMsCisJMHgwMDIzMDAxOCwKKwkweDAwMjQwMDE4LAorCTB4MDAyNTAwMTgsCisJMHgwMDI2MDAxOCwKKwkweDAwMjcwMDMwLAorCTB4MDAyODAwMzAsCisJMHgwMDI5MDAzMCwKKwkweDAwMmEwMDMwLAorCTB4MDAyYjAwMzAsCisJMHgwMDJjMDAzMCwKKwkweDAwMmQwMDMwLAorCTB4MDAyZTAwMzAsCisJMHgwMDJmMDA1MCwKKwkvKiBGb3Igc3RlcDIgNHg0LTh4OCAqLworCTB4MDAzMDAwMDEsCisJMHgwMDMxMDAwMiwKKwkweDAwMzIwMDAyLAorCTB4MDAzMzAwMDQsCisJMHgwMDM0MDAwNCwKKwkweDAwMzUwMDA0LAorCTB4MDAzNjAwMDQsCisJMHgwMDM3MDAwNiwKKwkweDAwMzgwMDA2LAorCTB4MDAzOTAwMDYsCisJMHgwMDNhMDAwNiwKKwkweDAwM2IwMDA2LAorCTB4MDAzYzAwMDYsCisJMHgwMDNkMDAwNiwKKwkweDAwM2UwMDA2LAorCTB4MDAzZjAwMDYKK307CisKK3N0YXRpYyBzdHJ1Y3QgQnVmZkluZm9fcyBhbXZlbmNfYnVmZnNwZWNbXSA9IHsKKwl7CisJCS5sZXZfaWQgPSAwLAorCQkubWF4X3dpZHRoID0gMTkyMCwKKwkJLm1heF9oZWlnaHQgPSAxMDg4LAorCQkubWluX2J1ZmZzaXplID0gMHgxNDAwMDAwLAorCQkuZGN0ID0geworCQkJLmJ1Zl9zdGFydCA9IDAsCisJCQkuYnVmX3NpemUgPSAweDgwMDAwMCwgLyogMTkyMHgxMDg4eDQgKi8KKwkJfSwKKwkJLmRlYzBfeSA9IHsKKwkJCS5idWZfc3RhcnQgPSAweDgwMDAwMCwKKwkJCS5idWZfc2l6ZSA9IDB4MzAwMDAwLAorCQl9LAorCQkuZGVjMV95ID0geworCQkJLmJ1Zl9zdGFydCA9IDB4YjAwMDAwLAorCQkJLmJ1Zl9zaXplID0gMHgzMDAwMDAsCisJCX0sCisJCS5hc3NpdCA9IHsKKwkJCS5idWZfc3RhcnQgPSAweGUxMDAwMCwKKwkJCS5idWZfc2l6ZSA9IDB4YzAwMDAsCisJCX0sCisJCS5iaXRzdHJlYW0gPSB7CisJCQkuYnVmX3N0YXJ0ID0gMHhmMDAwMDAsCisJCQkuYnVmX3NpemUgPSAweDEwMDAwMCwKKwkJfSwKKwkJLnNjYWxlX2J1ZmYgPSB7CisJCQkuYnVmX3N0YXJ0ID0gMHgxMDAwMDAwLAorCQkJLmJ1Zl9zaXplID0gMHgzMDAwMDAsCisJCX0sCisJCS5kdW1wX2luZm8gPSB7CisJCQkuYnVmX3N0YXJ0ID0gMHgxMzAwMDAwLAorCQkJLmJ1Zl9zaXplID0gMHhhMDAwMCwgLyogKDE5MjB4MTA4OC8yNTYpeDgwICovCisJCX0sCisJCS5jYnJfaW5mbyA9IHsKKwkJCS5idWZfc3RhcnQgPSAweDEzYjAwMDAsCisJCQkuYnVmX3NpemUgPSAweDIwMDAsCisJCX0KKwl9Cit9OworCitlbnVtIHVjb2RlX3R5cGVfZSB7CisJVUNPREVfR1hMLAorCVVDT0RFX1RYTCwKKwlVQ09ERV9HMTJBLAorCVVDT0RFX01BWAorfTsKKworY29uc3QgY2hhciAqdWNvZGVfbmFtZVtdID0geworCSJneGxfaDI2NF9lbmMiLAorCSJ0eGxfaDI2NF9lbmNfY2F2bGMiLAorCSJnYV9oMjY0X2VuY19jYWJhYyIsCit9OworCitzdGF0aWMgdm9pZCBkbWFfZmx1c2godTMyIGJ1Zl9zdGFydCwgdTMyIGJ1Zl9zaXplKTsKK3N0YXRpYyB2b2lkIGNhY2hlX2ZsdXNoKHUzMiBidWZfc3RhcnQsIHUzMiBidWZfc2l6ZSk7CitzdGF0aWMgaW50IGVuY19kbWFfYnVmX2dldF9waHlzKHN0cnVjdCBlbmNfZG1hX2NmZyAqY2ZnLCB1bnNpZ25lZCBsb25nICphZGRyKTsKK3N0YXRpYyB2b2lkIGVuY19kbWFfYnVmX3VubWFwKHN0cnVjdCBlbmNfZG1hX2NmZyAqY2ZnKTsKKworLy9zdGF0aWMgc3RydWN0IGNhbnZhc19zdGF0dXNfcyBjYW52YXNfc3RhdFtDQU5WQVNfTUFYX1NJWkVdOworLy9zdGF0aWMgc3RydWN0IGNhbnZhc19zdGF0dXNfcyBtZGVjX2Nhdl9zdGF0W01ERUNfQ0FWX0xVVF9NQVhdOworLyoKK3N0YXRpYyBzdHJ1Y3QgY2FudmFzX2NvbmZpZ19zICptZGVjX2Nhdl9wb29sID0gTlVMTDsKKworc3RhdGljIHZvaWQgY2F2X2x1dF9pbmZvX3N0b3JlKHUzMiBpbmRleCwgdWxvbmcgYWRkciwgdTMyIHdpZHRoLAorCXUzMiBoZWlnaHQsIHUzMiB3cmFwLCB1MzIgYmxrbW9kZSwgdTMyIGVuZGlhbikKK3sKKwlzdHJ1Y3QgY2FudmFzX2NvbmZpZ19zICpwb29sID0gTlVMTDsKKworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTURFQ19DQVZfTFVUX01BWCkgeworCQlwcl9lcnIoIiVzLCBlcnJvciBpbmRleCAlZFxuIiwgX19mdW5jX18sIGluZGV4KTsKKwkJcmV0dXJuOworCX0KKwlpZiAobWRlY19jYXZfcG9vbCA9PSBOVUxMKQorCQltZGVjX2Nhdl9wb29sID0gdnphbGxvYyhzaXplb2Yoc3RydWN0IGNhbnZhc19jb25maWdfcykKKwkJCSogKE1ERUNfQ0FWX0xVVF9NQVggKyAxKSk7CisKKwlpZiAobWRlY19jYXZfcG9vbCA9PSBOVUxMKSB7CisJCXByX2VycigiJXMgZmFpbGVkLCBtZGVjX2Nhdl9wb29sIG51bGxcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlwb29sID0gJm1kZWNfY2F2X3Bvb2xbaW5kZXhdOworCXBvb2wtPndpZHRoID0gd2lkdGg7CisJcG9vbC0+aGVpZ2h0ID0gaGVpZ2h0OworCXBvb2wtPmJsb2NrX21vZGUgPSBibGttb2RlOworCXBvb2wtPmVuZGlhbiA9IGVuZGlhbjsKKwlwb29sLT5waHlfYWRkciA9IGFkZHI7Cit9CisKKyovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZSAqZmlsZV9vcGVuKGNvbnN0IGNoYXIgKnBhdGgsIGludCBmbGFncywgaW50IHJpZ2h0cykKK3sKKyAgICBzdHJ1Y3QgZmlsZSAqZmlscCA9IE5VTEw7CisgICAgbW1fc2VnbWVudF90IG9sZGZzOworICAgIGludCBlcnIgPSAwOworCisgICAgb2xkZnMgPSBnZXRfZnMoKTsKKyAgICAvL3NldF9mcyhnZXRfZHMoKSk7CisgICAgc2V0X2ZzKEtFUk5FTF9EUyk7CisgICAgZmlscCA9IGZpbHBfb3BlbihwYXRoLCBmbGFncywgcmlnaHRzKTsKKyAgICBzZXRfZnMob2xkZnMpOworICAgIGlmIChJU19FUlIoZmlscCkpIHsKKyAgICAgICAgZXJyID0gUFRSX0VSUihmaWxwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBmaWxwOworfQorc3RhdGljIHZvaWQgZmlsZV9jbG9zZShzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKyAgICBmaWxwX2Nsb3NlKGZpbGUsIE5VTEwpOworfQorLyoKK3N0YXRpYyBpbnQgZmlsZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKyAgICBtbV9zZWdtZW50X3Qgb2xkZnM7CisgICAgaW50IHJldDsKKworICAgIG9sZGZzID0gZ2V0X2ZzKCk7CisgICAgc2V0X2ZzKEtFUk5FTF9EUyk7CisKKyAgICByZXQgPSB2ZnNfcmVhZChmaWxlLCBkYXRhLCBzaXplLCAmb2Zmc2V0KTsKKworICAgIHNldF9mcyhvbGRmcyk7CisgICAgcmV0dXJuIHJldDsKK30qLworc3RhdGljIGludCBmaWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKyAgICBtbV9zZWdtZW50X3Qgb2xkZnM7CisgICAgaW50IHJldDsKKworICAgIG9sZGZzID0gZ2V0X2ZzKCk7CisgICAgc2V0X2ZzKEtFUk5FTF9EUyk7CisKKyAgICByZXQgPSB2ZnNfd3JpdGUoZmlsZSwgZGF0YSwgc2l6ZSwgJm9mZnNldCk7CisKKyAgICBzZXRfZnMob2xkZnMpOworICAgIHJldHVybiByZXQ7Cit9CitzdGF0aWMgaW50IGZpbGVfc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKyAgICB2ZnNfZnN5bmMoZmlsZSwgMCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNhbnZhc19jb25maWdfcHJveHkodTMyIGluZGV4LCB1bG9uZyBhZGRyLCB1MzIgd2lkdGgsIHUzMiBoZWlnaHQsCisJCSAgIHUzMiB3cmFwLCB1MzIgYmxrbW9kZSkgeworCXVuc2lnbmVkIGxvbmcgZGF0YWhfdGVtcCwgZGF0YWxfdGVtcDsKKworCWlmICghaXNfc3VwcG9ydF92ZGVjX2NhbnZhcygpKSB7CisJCWNhbnZhc19jb25maWcoaW5kZXgsIGFkZHIsIHdpZHRoLCBoZWlnaHQsIHdyYXAsIGJsa21vZGUpOworCX0gZWxzZSB7CisjaWYgMQorCQl1bG9uZyBzdGFydF9hZGRyID0gYWRkciA+PiAzOworCQl1MzIgY2F2X3dpZHRoID0gKCgod2lkdGggKyAzMSk+PjUpPDwyKTsKKwkJdTMyIGNhdl9oZWlnaHQgPSBoZWlnaHQ7CisJCXUzMiB4X3dyYXBfZW4gPSAwOworCQl1MzIgeV93cmFwX2VuID0gMDsKKwkJdTMyIGJsa19tb2RlID0gMDsvL2Jsa21vZGU7CisJCXUzMiBjYXZfZW5kaWFuID0gMDsKKworCQlkYXRhbF90ZW1wID0gKHN0YXJ0X2FkZHIgJiAweDFmZmZmZmZmKSB8CisJCQkJCSgoY2F2X3dpZHRoICYgMHg3ICkgPDwgMjkgKTsKKworCQlkYXRhaF90ZW1wID0gKChjYXZfd2lkdGggID4+IDMpICYgMHgxZmYpIHwKKwkJCQkJKChjYXZfaGVpZ2h0ICYgMHgxZmZmKSA8PDkgKSB8CisJCQkJCSgoeF93cmFwX2VuICYgMSkgPDwgMjIgKSB8CisJCQkJCSgoeV93cmFwX2VuICYgMSkgPDwgMjMpIHwKKwkJCQkJKChibGtfbW9kZSAmIDB4MykgPDwgMjQpIHwKKwkJCQkJKCBjYXZfZW5kaWFuIDw8IDI2KTsKKworI2Vsc2UKKwkJdTMyIGVuZGlhbiA9IDA7CisJCXUzMiBhZGRyX2JpdHNfbCA9ICgoKChhZGRyICsgNykgPj4gMykgJiBDQU5WQVNfQUREUl9MTUFTSykgPDwgQ0FWX1dBRERSX0xCSVQpOworCQl1MzIgd2lkdGhfbCAgICAgPSAoKCgod2lkdGggICAgKyA3KSA+PiAzKSAmIENBTlZBU19XSURUSF9MTUFTSykgPDwgQ0FWX1dJRFRIX0xCSVQpOworCQl1MzIgd2lkdGhfaCAgICAgPSAoKCgod2lkdGggICAgKyA3KSA+PiAzKSA+PiBDQU5WQVNfV0lEVEhfTFdJRCkgPDwgQ0FWX1dJRFRIX0hCSVQpOworCQl1MzIgaGVpZ2h0X2ggICAgPSAoaGVpZ2h0ICYgQ0FOVkFTX0hFSUdIVF9NQVNLKSA8PCBDQVZfSEVJR0hUX0hCSVQ7CisJCXUzMiBibGttb2RfaCAgICA9IChibGttb2RlICYgQ0FOVkFTX0JMS01PREVfTUFTSykgPDwgQ0FWX0JMS01PREVfSEJJVDsKKwkJdTMyIHN3aXRjaF9iaXRzX2N0bCA9IChlbmRpYW4gJiAweGYpIDw8IENBVl9FTkRJQU5fSEJJVDsKKwkJdTMyIHdyYXBfaCAgICAgID0gKDAgPDwgMjMpOworCQlkYXRhbF90ZW1wID0gYWRkcl9iaXRzX2wgfCB3aWR0aF9sOworCQlkYXRhaF90ZW1wID0gd2lkdGhfaCB8IGhlaWdodF9oIHwgd3JhcF9oIHwgYmxrbW9kX2ggfCBzd2l0Y2hfYml0c19jdGw7CisjZW5kaWYKKwkJLyoKKwkJaWYgKGNvcmUgPT0gVkRFQ18xKSB7CisJCQlXUklURV9WUkVHKE1ERUNfQ0FWX0NGRzAsIDApOwkvL1swXWNhbnZfbW9kZSwgYnkgZGVmYXVsdCBpcyBub24tY2Fudi1tb2RlCisJCQlXUklURV9WUkVHKE1ERUNfQ0FWX0xVVF9EQVRBTCwgZGF0YWxfdGVtcCk7CisJCQlXUklURV9WUkVHKE1ERUNfQ0FWX0xVVF9EQVRBSCwgZGF0YWhfdGVtcCk7CisJCQlXUklURV9WUkVHKE1ERUNfQ0FWX0xVVF9BRERSLCAgaW5kZXgpOworCQl9IGVsc2UgaWYgKGNvcmUgPT0gVkRFQ19IQ09ERUMpICovIHsKKwkJCVdSSVRFX0hSRUcoSENPREVDX01ERUNfQ0FWX0NGRzAsIDApOwkvL1swXWNhbnZfbW9kZSwgYnkgZGVmYXVsdCBpcyBub24tY2Fudi1tb2RlCisJCQlXUklURV9IUkVHKEhDT0RFQ19NREVDX0NBVl9MVVRfREFUQUwsIGRhdGFsX3RlbXApOworCQkJV1JJVEVfSFJFRyhIQ09ERUNfTURFQ19DQVZfTFVUX0RBVEFILCBkYXRhaF90ZW1wKTsKKwkJCVdSSVRFX0hSRUcoSENPREVDX01ERUNfQ0FWX0xVVF9BRERSLCAgaW5kZXgpOworCQl9CisKKwkJLyoKKwkJY2F2X2x1dF9pbmZvX3N0b3JlKGluZGV4LCBhZGRyLCB3aWR0aCwgaGVpZ2h0LCB3cmFwLCBibGttb2RlLCAwKTsKKworCQlpZiAodmRlY19nZXRfZGVidWcoKSAmIDB4NDAwMDAwMDApIHsKKwkJCXByX2luZm8oIiglcyAlMmQpIGFkZHI6ICVseCwgd2lkdGg6ICVkLCBoZWlnaHQ6ICVkLCBibGttOiAlZCwgZW5kaWFuOiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgaW5kZXgsIGFkZHIsIHdpZHRoLCBoZWlnaHQsIGJsa21vZGUsIDApOworCQkJcHJfaW5mbygiZGF0YShoLGwpOiAweCU4bHgsIDB4JThseFxuIiwgZGF0YWhfdGVtcCwgZGF0YWxfdGVtcCk7CisJICAgIH0KKwkgICAgKi8KKwl9Cit9CisKK3MzMiBoY29kZWNfaHdfcmVzZXQodm9pZCkKK3sKKwlpZiAoZ2V0X2NwdV90eXBlKCkgPj0gTUVTT05fQ1BVX01BSk9SX0lEX1NDMiAmJiB1c2VfcmVzZXRfY29udHJvbCkgeworCQlyZXNldF9jb250cm9sX3Jlc2V0KGhjb2RlY19yc3QpOworCQllbmNfcHIoTE9HX0RFQlVHLCAicmVxdWVzdCBoY29kZWMgcmVzZXQgZnJvbSBhcHBsaWNhdGlvbi5cbiIpOworCX0KKwlyZXR1cm4gMDsKK30KKworczMyIGhjb2RlY19jbGtfcHJlcGFyZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBoY29kZWNfY2xrcyAqY2xrcykKK3sKKwlpbnQgcmV0OworCisJY2xrcy0+aGNvZGVjX2FjbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAiY3RzX2hjb2RlY19hY2xrIik7CisKKwlpZiAoSVNfRVJSX09SX05VTEwoY2xrcy0+aGNvZGVjX2FjbGspKSB7CisJCWVuY19wcihMT0dfRVJST1IsICJmYWlsZWQgdG8gZ2V0IGhjb2RlYyBhY2xrXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldCA9IGNsa19zZXRfcmF0ZShjbGtzLT5oY29kZWNfYWNsaywgNjY3ICogTUh6KTsKKwlDSEVDS19SRVQocmV0KTsKKworCXJldCA9IGNsa19wcmVwYXJlKGNsa3MtPmhjb2RlY19hY2xrKTsKKwlDSEVDS19SRVQocmV0KTsKKworCWVuY19wcihMT0dfRVJST1IsICJoY29kZWNfY2xrX2E6ICVsdSBNSHpcbiIsIGNsa19nZXRfcmF0ZShjbGtzLT5oY29kZWNfYWNsaykgLyAxMDAwMDAwKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGhjb2RlY19jbGtfdW5wcmVwYXJlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGhjb2RlY19jbGtzICpjbGtzKQoreworCWNsa191bnByZXBhcmUoY2xrcy0+aGNvZGVjX2FjbGspOworCWRldm1fY2xrX3B1dChkZXYsIGNsa3MtPmhjb2RlY19hY2xrKTsKKworCS8vY2xrX3VucHJlcGFyZShjbGtzLT53YXZlX2JjbGspOworCS8vZGV2bV9jbGtfcHV0KGRldiwgY2xrcy0+d2F2ZV9iY2xrKTsKKworCS8vY2xrX3VucHJlcGFyZShjbGtzLT53YXZlX2FjbGspOworCS8vZGV2bV9jbGtfcHV0KGRldiwgY2xrcy0+d2F2ZV9hY2xrKTsKK30KKworczMyIGhjb2RlY19jbGtfY29uZmlnKHUzMiBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkgeworCQljbGtfZW5hYmxlKHNfaGNvZGVjX2Nsa3MuaGNvZGVjX2FjbGspOworCQkvL2Nsa19lbmFibGUoc19oY29kZWNfY2xrcy53YXZlX2JjbGspOworCQkvL2Nsa19lbmFibGUoc19oY29kZWNfY2xrcy53YXZlX2NjbGspOworCX0gZWxzZSB7CisJCWNsa19kaXNhYmxlKHNfaGNvZGVjX2Nsa3MuaGNvZGVjX2FjbGspOworCQkvL2Nsa19kaXNhYmxlKHNfaGNvZGVjX2Nsa3Mud2F2ZV9iY2xrKTsKKwkJLy9jbGtfZGlzYWJsZShzX2hjb2RlY19jbGtzLndhdmVfYWNsayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpzZWxlY3RfdWNvZGUodTMyIHVjb2RlX2luZGV4KQoreworCWVudW0gdWNvZGVfdHlwZV9lIHVjb2RlID0gVUNPREVfR1hMOworCisJc3dpdGNoICh1Y29kZV9pbmRleCkgeworCWNhc2UgVUNPREVfTU9ERV9GVUxMOgorCQlpZiAoZ2V0X2NwdV90eXBlKCkgPj0gTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpCisJCQl1Y29kZSA9IFVDT0RFX0cxMkE7CisJCWVsc2UgaWYgKGdldF9jcHVfdHlwZSgpID49IE1FU09OX0NQVV9NQUpPUl9JRF9UWEwpCisJCQl1Y29kZSA9IFVDT0RFX1RYTDsKKwkJZWxzZSAvKiAoZ2V0X2NwdV90eXBlKCkgPj0gTUVTT05fQ1BVX01BSk9SX0lEX0dYTCkgKi8KKwkJCXVjb2RlID0gVUNPREVfR1hMOworCQlicmVhazsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAoY29uc3QgY2hhciAqKXVjb2RlX25hbWVbdWNvZGVdOworfQorCitzdGF0aWMgdm9pZCBoY29kZWNfcHJvZ19xdGJsKHN0cnVjdCBlbmNvZGVfd3FfcyAqd3EpCit7CisJV1JJVEVfSFJFRyhIQ09ERUNfUV9RVUFOVF9DT05UUk9MLAorCQkoMCA8PCAyMykgfCAgLyogcXVhbnRfdGFibGVfYWRkciAqLworCQkoMSA8PCAyMikpOyAgLyogcXVhbnRfdGFibGVfYWRkcl91cGRhdGUgKi8KKworCVdSSVRFX0hSRUcoSENPREVDX1FVQU5UX1RBQkxFX0RBVEEsCisJCXdxLT5xdWFudF90YmxfaTRbMF0pOworCVdSSVRFX0hSRUcoSENPREVDX1FVQU5UX1RBQkxFX0RBVEEsCisJCXdxLT5xdWFudF90YmxfaTRbMV0pOworCVdSSVRFX0hSRUcoSENPREVDX1FVQU5UX1RBQkxFX0RBVEEsCisJCXdxLT5xdWFudF90YmxfaTRbMl0pOworCVdSSVRFX0hSRUcoSENPREVDX1FVQU5UX1RBQkxFX0RBVEEsCisJCXdxLT5xdWFudF90YmxfaTRbM10pOworCVdSSVRFX0hSRUcoSENPREVDX1FVQU5UX1RBQkxFX0RBVEEsCisJCXdxLT5xdWFudF90YmxfaTRbNF0pOworCVdSSVRFX0hSRUcoSENPREVDX1FVQU5UX1RBQkxFX0RBVEEsCisJCXdxLT5xdWFudF90YmxfaTRbNV0pOworCVdSSVRFX0hSRUcoSENPREVDX1FVQU5UX1RBQkxFX0RBVEEsCisJCXdxLT5xdWFudF90YmxfaTRbNl0pOworCVdSSVRFX0hSRUcoSENPREVDX1FVQU5UX1RBQkxFX0RBVEEsCisJCXdxLT5xdWFudF90YmxfaTRbN10pOworCisJV1JJVEVfSFJFRyhIQ09ERUNfUV9RVUFOVF9DT05UUk9MLAorCQkoOCA8PCAyMykgfCAgLyogcXVhbnRfdGFibGVfYWRkciAqLworCQkoMSA8PCAyMikpOyAgLyogcXVhbnRfdGFibGVfYWRkcl91cGRhdGUgKi8KKworCVdSSVRFX0hSRUcoSENPREVDX1FVQU5UX1RBQkxFX0RBVEEsCisJCXdxLT5xdWFudF90YmxfaTE2WzBdKTsKKwlXUklURV9IUkVHKEhDT0RFQ19RVUFOVF9UQUJMRV9EQVRBLAorCQl3cS0+cXVhbnRfdGJsX2kxNlsxXSk7CisJV1JJVEVfSFJFRyhIQ09ERUNfUVVBTlRfVEFCTEVfREFUQSwKKwkJd3EtPnF1YW50X3RibF9pMTZbMl0pOworCVdSSVRFX0hSRUcoSENPREVDX1FVQU5UX1RBQkxFX0RBVEEsCisJCXdxLT5xdWFudF90YmxfaTE2WzNdKTsKKwlXUklURV9IUkVHKEhDT0RFQ19RVUFOVF9UQUJMRV9EQVRBLAorCQl3cS0+cXVhbnRfdGJsX2kxNls0XSk7CisJV1JJVEVfSFJFRyhIQ09ERUNfUVVBTlRfVEFCTEVfREFUQSwKKwkJd3EtPnF1YW50X3RibF9pMTZbNV0pOworCVdSSVRFX0hSRUcoSENPREVDX1FVQU5UX1RBQkxFX0RBVEEsCisJCXdxLT5xdWFudF90YmxfaTE2WzZdKTsKKwlXUklURV9IUkVHKEhDT0RFQ19RVUFOVF9UQUJMRV9EQVRBLAorCQl3cS0+cXVhbnRfdGJsX2kxNls3XSk7CisKKwlXUklURV9IUkVHKEhDT0RFQ19RX1FVQU5UX0NPTlRST0wsCisJCSgxNiA8PCAyMykgfCAvKiBxdWFudF90YWJsZV9hZGRyICovCisJCSgxIDw8IDIyKSk7ICAvKiBxdWFudF90YWJsZV9hZGRyX3VwZGF0ZSAqLworCisJV1JJVEVfSFJFRyhIQ09ERUNfUVVBTlRfVEFCTEVfREFUQSwKKwkJd3EtPnF1YW50X3RibF9tZVswXSk7CisJV1JJVEVfSFJFRyhIQ09ERUNfUVVBTlRfVEFCTEVfREFUQSwKKwkJd3EtPnF1YW50X3RibF9tZVsxXSk7CisJV1JJVEVfSFJFRyhIQ09ERUNfUVVBTlRfVEFCTEVfREFUQSwKKwkJd3EtPnF1YW50X3RibF9tZVsyXSk7CisJV1JJVEVfSFJFRyhIQ09ERUNfUVVBTlRfVEFCTEVfREFUQSwKKwkJd3EtPnF1YW50X3RibF9tZVszXSk7CisJV1JJVEVfSFJFRyhIQ09ERUNfUVVBTlRfVEFCTEVfREFUQSwKKwkJd3EtPnF1YW50X3RibF9tZVs0XSk7CisJV1JJVEVfSFJFRyhIQ09ERUNfUVVBTlRfVEFCTEVfREFUQSwKKwkJd3EtPnF1YW50X3RibF9tZVs1XSk7CisJV1JJVEVfSFJFRyhIQ09ERUNfUVVBTlRfVEFCTEVfREFUQSwKKwkJd3EtPnF1YW50X3RibF9tZVs2XSk7CisJV1JJVEVfSFJFRyhIQ09ERUNfUVVBTlRfVEFCTEVfREFUQSwKKwkJd3EtPnF1YW50X3RibF9tZVs3XSk7Cit9CisKK3N0YXRpYyB2b2lkIEluaXRFbmNvZGVXZWlnaHQodm9pZCkKK3sKKwltZV9tdl9tZXJnZV9jdGwgPQorCQkoMHgxIDw8IDMxKSAgfCAgLyogWzMxXSBtZV9tZXJnZV9tdl9lbl8xNiAqLworCQkoMHgxIDw8IDMwKSAgfCAgLyogWzMwXSBtZV9tZXJnZV9zbWFsbF9tdl9lbl8xNiAqLworCQkoMHgxIDw8IDI5KSAgfCAgLyogWzI5XSBtZV9tZXJnZV9mbGV4X2VuXzE2ICovCisJCSgweDEgPDwgMjgpICB8ICAvKiBbMjhdIG1lX21lcmdlX3NhZF9lbl8xNiAqLworCQkoMHgxIDw8IDI3KSAgfCAgLyogWzI3XSBtZV9tZXJnZV9tdl9lbl84ICovCisJCSgweDEgPDwgMjYpICB8ICAvKiBbMjZdIG1lX21lcmdlX3NtYWxsX212X2VuXzggKi8KKwkJKDB4MSA8PCAyNSkgIHwgIC8qIFsyNV0gbWVfbWVyZ2VfZmxleF9lbl84ICovCisJCSgweDEgPDwgMjQpICB8ICAvKiBbMjRdIG1lX21lcmdlX3NhZF9lbl84ICovCisJCSgweDEyIDw8IDE4KSB8CisJCS8qIFsyMzoxOF0gbWVfbWVyZ2VfbXZfZGlmZl8xNiAtIE1WIGRpZmYKKwkJICoJPD0gbiBwaXhlbCBjYW4gYmUgbWVyZ2VkCisJCSAqLworCQkoMHgyYiA8PCAxMikgfAorCQkvKiBbMTc6MTJdIG1lX21lcmdlX212X2RpZmZfOCAtIE1WIGRpZmYKKwkJICoJPD0gbiBwaXhlbCBjYW4gYmUgbWVyZ2VkCisJCSAqLworCQkoMHg4MCA8PCAwKTsKKwkJLyogWzExOjBdIG1lX21lcmdlX21pbl9zYWQgLSBTQUQKKwkJICoJPj0gMHgxODAgY2FuIGJlIG1lcmdlZCB3aXRoIG90aGVyIE1WCisJCSAqLworCisJbWVfbXZfd2VpZ2h0XzAxID0gKE1FX01WX1NURVBfV0VJR0hUXzEgPDwgMjQpIHwKKwkJKE1FX01WX1BSRV9XRUlHSFRfMSA8PCAxNikgfAorCQkoTUVfTVZfU1RFUF9XRUlHSFRfMCA8PCA4KSB8CisJCShNRV9NVl9QUkVfV0VJR0hUXzAgPDwgMCk7CisKKwltZV9tdl93ZWlnaHRfMjMgPSAoTUVfTVZfU1RFUF9XRUlHSFRfMyA8PCAyNCkgfAorCQkoTUVfTVZfUFJFX1dFSUdIVF8zICA8PCAxNikgfAorCQkoTUVfTVZfU1RFUF9XRUlHSFRfMiA8PCA4KSB8CisJCShNRV9NVl9QUkVfV0VJR0hUXzIgIDw8IDApOworCisJbWVfc2FkX3JhbmdlX2luYyA9IChNRV9TQURfUkFOR0VfMyA8PCAyNCkgfAorCQkoTUVfU0FEX1JBTkdFXzIgPDwgMTYpIHwKKwkJKE1FX1NBRF9SQU5HRV8xIDw8IDgpIHwKKwkJKE1FX1NBRF9SQU5HRV8wIDw8IDApOworCisJbWVfc3RlcDBfY2xvc2VfbXYgPSAoMHgxMDAgPDwgMTApIHwKKwkJLyogbWVfc3RlcDBfYmlnX3NhZCAtLSB0d28gTVYgc2FkCisJCSAqICBkaWZmIGJpZ2dlciB3aWxsIHVzZSB1c2UgMQorCQkgKi8KKwkJKDIgPDwgNSkgfCAvKiBtZV9zdGVwMF9jbG9zZV9tdl95ICovCisJCSgyIDw8IDApOyAvKiBtZV9zdGVwMF9jbG9zZV9tdl94ICovCisKKwltZV9mX3NraXBfc2FkID0gKDB4MDAgPDwgMjQpIHwgLyogZm9yY2Vfc2tpcF9zYWRfMyAqLworCQkoU1RFUF8yX1NLSVBfU0FEIDw8IDE2KSB8IC8qIGZvcmNlX3NraXBfc2FkXzIgKi8KKwkJKFNURVBfMV9TS0lQX1NBRCA8PCA4KSB8IC8qIGZvcmNlX3NraXBfc2FkXzEgKi8KKwkJKFNURVBfMF9TS0lQX1NBRCA8PCAwKTsgLyogZm9yY2Vfc2tpcF9zYWRfMCAqLworCisJbWVfZl9za2lwX3dlaWdodCA9ICgweDAwIDw8IDI0KSB8IC8qIGZvcmNlX3NraXBfd2VpZ2h0XzMgKi8KKwkJLyogZm9yY2Vfc2tpcF93ZWlnaHRfMiAqLworCQkoU1RFUF8yX1NLSVBfV0VJR0hUIDw8IDE2KSB8CisJCS8qIGZvcmNlX3NraXBfd2VpZ2h0XzEgKi8KKwkJKFNURVBfMV9TS0lQX1dFSUdIVCA8PCA4KSB8CisJCS8qIGZvcmNlX3NraXBfd2VpZ2h0XzAgKi8KKwkJKFNURVBfMF9TS0lQX1dFSUdIVCA8PCAwKTsKKworCWlmIChnZXRfY3B1X3R5cGUoKSA+PSBNRVNPTl9DUFVfTUFKT1JfSURfR1hUVkJCKSB7CisJCW1lX2Zfc2tpcF9zYWQgPSAwOworCQltZV9mX3NraXBfd2VpZ2h0ID0gMDsKKwkJbWVfbXZfd2VpZ2h0XzAxID0gMDsKKwkJbWVfbXZfd2VpZ2h0XzIzID0gMDsKKwl9CisKKwltZV9zYWRfZW5vdWdoXzAxID0gKE1FX1NBRF9FTk9VR0hfMV9EQVRBIDw8IDEyKSB8CisJCS8qIG1lX3NhZF9lbm91Z2hfMSAqLworCQkoTUVfU0FEX0VOT1VHSF8wX0RBVEEgPDwgMCkgfAorCQkvKiBtZV9zYWRfZW5vdWdoXzAgKi8KKwkJKDAgPDwgMTIpIHwgLyogbWVfc2FkX2Vub3VnaF8xICovCisJCSgwIDw8IDApOyAvKiBtZV9zYWRfZW5vdWdoXzAgKi8KKworCW1lX3NhZF9lbm91Z2hfMjMgPSAoQURWX01WXzh4OF9FTk9VR0hfREFUQSA8PCAxMikgfAorCQkvKiBhZHZfbXZfOHg4X2Vub3VnaCAqLworCQkoTUVfU0FEX0VOT1VHSF8yX0RBVEEgPDwgMCkgfAorCQkvKiBtZV9zYWRfZW5vdWdoXzIgKi8KKwkJKDAgPDwgMTIpIHwgLyogbWVfc2FkX2Vub3VnaF8zICovCisJCSgwIDw8IDApOyAvKiBtZV9zYWRfZW5vdWdoXzIgKi8KK30KKworLypvdXRwdXQgc3RyZWFtIGJ1ZmZlciBzZXR0aW5nKi8KK3N0YXRpYyB2b2lkIGF2Y19pbml0X291dHB1dF9idWZmZXIoc3RydWN0IGVuY29kZV93cV9zICp3cSkKK3sKKwlXUklURV9IUkVHKEhDT0RFQ19WTENfVkJfTUVNX0NUTCwKKwkJKCgxIDw8IDMxKSB8ICgweDNmIDw8IDI0KSB8CisJCSgweDIwIDw8IDE2KSB8ICgyIDw8IDApKSk7CisJV1JJVEVfSFJFRyhIQ09ERUNfVkxDX1ZCX1NUQVJUX1BUUiwKKwkJd3EtPm1lbS5CaXRzdHJlYW1TdGFydCk7CisJV1JJVEVfSFJFRyhIQ09ERUNfVkxDX1ZCX1dSX1BUUiwKKwkJd3EtPm1lbS5CaXRzdHJlYW1TdGFydCk7CisJV1JJVEVfSFJFRyhIQ09ERUNfVkxDX1ZCX1NXX1JEX1BUUiwKKwkJd3EtPm1lbS5CaXRzdHJlYW1TdGFydCk7CisJV1JJVEVfSFJFRyhIQ09ERUNfVkxDX1ZCX0VORF9QVFIsCisJCXdxLT5tZW0uQml0c3RyZWFtRW5kKTsKKwlXUklURV9IUkVHKEhDT0RFQ19WTENfVkJfQ09OVFJPTCwgMSk7CisJV1JJVEVfSFJFRyhIQ09ERUNfVkxDX1ZCX0NPTlRST0wsCisJCSgoMCA8PCAxNCkgfCAoNyA8PCAzKSB8CisJCSgxIDw8IDEpIHwgKDAgPDwgMCkpKTsKK30KKworLyppbnB1dCBkY3QgYnVmZmVyIHNldHRpbmcqLworc3RhdGljIHZvaWQgYXZjX2luaXRfaW5wdXRfYnVmZmVyKHN0cnVjdCBlbmNvZGVfd3FfcyAqd3EpCit7CisJV1JJVEVfSFJFRyhIQ09ERUNfUURDVF9NQl9TVEFSVF9QVFIsCisJCXdxLT5tZW0uZGN0X2J1ZmZfc3RhcnRfYWRkcik7CisJV1JJVEVfSFJFRyhIQ09ERUNfUURDVF9NQl9FTkRfUFRSLAorCQl3cS0+bWVtLmRjdF9idWZmX2VuZF9hZGRyKTsKKwlXUklURV9IUkVHKEhDT0RFQ19RRENUX01CX1dSX1BUUiwKKwkJd3EtPm1lbS5kY3RfYnVmZl9zdGFydF9hZGRyKTsKKwlXUklURV9IUkVHKEhDT0RFQ19RRENUX01CX1JEX1BUUiwKKwkJd3EtPm1lbS5kY3RfYnVmZl9zdGFydF9hZGRyKTsKKwlXUklURV9IUkVHKEhDT0RFQ19RRENUX01CX0JVRkYsIDApOworfQorCisvKmlucHV0IHJlZmVyZW5jZSBidWZmZXIgc2V0dGluZyovCitzdGF0aWMgdm9pZCBhdmNfaW5pdF9yZWZlcmVuY2VfYnVmZmVyKHMzMiBjYW52YXMpCit7CisJV1JJVEVfSFJFRyhIQ09ERUNfQU5DMF9DQU5WQVNfQUREUiwgY2FudmFzKTsKKwlXUklURV9IUkVHKEhDT0RFQ19WTENfSENNRF9DT05GSUcsIDApOworfQorCitzdGF0aWMgdm9pZCBhdmNfaW5pdF9hc3NpdF9idWZmZXIoc3RydWN0IGVuY29kZV93cV9zICp3cSkKK3sKKwlXUklURV9IUkVHKE1FTV9PRkZTRVRfUkVHLCB3cS0+bWVtLmFzc2l0X2J1ZmZlcl9vZmZzZXQpOworfQorCisvKmRlYmxvY2sgYnVmZmVyIHNldHRpbmcsIHNhbWUgYXMgSU5JX0NBTlZBUyovCitzdGF0aWMgdm9pZCBhdmNfaW5pdF9kYmxrX2J1ZmZlcihzMzIgY2FudmFzKQoreworCVdSSVRFX0hSRUcoSENPREVDX1JFQ19DQU5WQVNfQUREUiwgY2FudmFzKTsKKwlXUklURV9IUkVHKEhDT0RFQ19EQktSX0NBTlZBU19BRERSLCBjYW52YXMpOworCVdSSVRFX0hSRUcoSENPREVDX0RCS1dfQ0FOVkFTX0FERFIsIGNhbnZhcyk7Cit9CisKK3N0YXRpYyB2b2lkIGF2Y19pbml0X2VuY29kZXIoc3RydWN0IGVuY29kZV93cV9zICp3cSwgYm9vbCBpZHIpCit7CisJV1JJVEVfSFJFRyhIQ09ERUNfVkxDX1RPVEFMX0JZVEVTLCAwKTsKKwlXUklURV9IUkVHKEhDT0RFQ19WTENfQ09ORklHLCAweDA3KTsKKwlXUklURV9IUkVHKEhDT0RFQ19WTENfSU5UX0NPTlRST0wsIDApOworCisJV1JJVEVfSFJFRyhIQ09ERUNfQVNTSVNUX0FNUjFfSU5UMCwgMHgxNSk7CisJV1JJVEVfSFJFRyhIQ09ERUNfQVNTSVNUX0FNUjFfSU5UMSwgMHg4KTsKKwlXUklURV9IUkVHKEhDT0RFQ19BU1NJU1RfQU1SMV9JTlQzLCAweDE0KTsKKworCVdSSVRFX0hSRUcoSURSX1BJQ19JRCwgd3EtPnBpYy5pZHJfcGljX2lkKTsKKwlXUklURV9IUkVHKEZSQU1FX05VTUJFUiwKKwkJKGlkciA9PSB0cnVlKSA/IDAgOiB3cS0+cGljLmZyYW1lX251bWJlcik7CisJV1JJVEVfSFJFRyhQSUNfT1JERVJfQ05UX0xTQiwKKwkJKGlkciA9PSB0cnVlKSA/IDAgOiB3cS0+cGljLnBpY19vcmRlcl9jbnRfbHNiKTsKKworCVdSSVRFX0hSRUcoTE9HMl9NQVhfUElDX09SREVSX0NOVF9MU0IsCisJCXdxLT5waWMubG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2IpOworCVdSSVRFX0hSRUcoTE9HMl9NQVhfRlJBTUVfTlVNLAorCQl3cS0+cGljLmxvZzJfbWF4X2ZyYW1lX251bSk7CisJV1JJVEVfSFJFRyhBTkMwX0JVRkZFUl9JRCwgMCk7CisJV1JJVEVfSFJFRyhRUFBJQ1RVUkUsIHdxLT5waWMuaW5pdF9xcHBpY3R1cmUpOworfQorCitzdGF0aWMgdm9pZCBhdmNfY2FudmFzX2luaXQoc3RydWN0IGVuY29kZV93cV9zICp3cSkKK3sKKwl1MzIgY2FudmFzX3dpZHRoLCBjYW52YXNfaGVpZ2h0OworCXUzMiBzdGFydF9hZGRyID0gd3EtPm1lbS5idWZfc3RhcnQ7CisJY2FudmFzX3dpZHRoID0gKCh3cS0+cGljLmVuY29kZXJfd2lkdGggKyAzMSkgPj4gNSkgPDwgNTsKKwljYW52YXNfaGVpZ2h0ID0gKCh3cS0+cGljLmVuY29kZXJfaGVpZ2h0ICsgMTUpID4+IDQpIDw8IDQ7CisKKwljYW52YXNfY29uZmlnX3Byb3h5KEVOQ19DQU5WQVNfT0ZGU0VULAorCSAgICAgIHN0YXJ0X2FkZHIgKyB3cS0+bWVtLmJ1ZnNwZWMuZGVjMF95LmJ1Zl9zdGFydCwKKwkgICAgICBjYW52YXNfd2lkdGgsIGNhbnZhc19oZWlnaHQsCisJICAgICAgQ0FOVkFTX0FERFJfTk9XUkFQLCBDQU5WQVNfQkxLTU9ERV9MSU5FQVIpOworCWNhbnZhc19jb25maWdfcHJveHkoMSArIEVOQ19DQU5WQVNfT0ZGU0VULAorCSAgICAgIHN0YXJ0X2FkZHIgKyB3cS0+bWVtLmJ1ZnNwZWMuZGVjMF91di5idWZfc3RhcnQsCisJICAgICAgY2FudmFzX3dpZHRoLCBjYW52YXNfaGVpZ2h0IC8gMiwKKwkgICAgICBDQU5WQVNfQUREUl9OT1dSQVAsIENBTlZBU19CTEtNT0RFX0xJTkVBUik7CisJLypoZXJlIHRoZSB0aGlyZCBwbGFuZSB1c2UgdGhlIHNhbWUgYWRkcmVzcyBhcyB0aGUgc2Vjb25kIHBsYW5lKi8KKwljYW52YXNfY29uZmlnX3Byb3h5KDIgKyBFTkNfQ0FOVkFTX09GRlNFVCwKKwkgICAgICBzdGFydF9hZGRyICsgd3EtPm1lbS5idWZzcGVjLmRlYzBfdXYuYnVmX3N0YXJ0LAorCSAgICAgIGNhbnZhc193aWR0aCwgY2FudmFzX2hlaWdodCAvIDIsCisJICAgICAgQ0FOVkFTX0FERFJfTk9XUkFQLCBDQU5WQVNfQkxLTU9ERV9MSU5FQVIpOworCisJY2FudmFzX2NvbmZpZ19wcm94eSgzICsgRU5DX0NBTlZBU19PRkZTRVQsCisJICAgICAgc3RhcnRfYWRkciArIHdxLT5tZW0uYnVmc3BlYy5kZWMxX3kuYnVmX3N0YXJ0LAorCSAgICAgIGNhbnZhc193aWR0aCwgY2FudmFzX2hlaWdodCwKKwkgICAgICBDQU5WQVNfQUREUl9OT1dSQVAsIENBTlZBU19CTEtNT0RFX0xJTkVBUik7CisJY2FudmFzX2NvbmZpZ19wcm94eSg0ICsgRU5DX0NBTlZBU19PRkZTRVQsCisJICAgICAgc3RhcnRfYWRkciArIHdxLT5tZW0uYnVmc3BlYy5kZWMxX3V2LmJ1Zl9zdGFydCwKKwkgICAgICBjYW52YXNfd2lkdGgsIGNhbnZhc19oZWlnaHQgLyAyLAorCSAgICAgIENBTlZBU19BRERSX05PV1JBUCwgQ0FOVkFTX0JMS01PREVfTElORUFSKTsKKwkvKmhlcmUgdGhlIHRoaXJkIHBsYW5lIHVzZSB0aGUgc2FtZSBhZGRyZXNzIGFzIHRoZSBzZWNvbmQgcGxhbmUqLworCWNhbnZhc19jb25maWdfcHJveHkoNSArIEVOQ19DQU5WQVNfT0ZGU0VULAorCSAgICAgIHN0YXJ0X2FkZHIgKyB3cS0+bWVtLmJ1ZnNwZWMuZGVjMV91di5idWZfc3RhcnQsCisJICAgICAgY2FudmFzX3dpZHRoLCBjYW52YXNfaGVpZ2h0IC8gMiwKKwkgICAgICBDQU5WQVNfQUREUl9OT1dSQVAsIENBTlZBU19CTEtNT0RFX0xJTkVBUik7Cit9CisKK3N0YXRpYyB2b2lkIGF2Y19idWZmc3BlY19pbml0KHN0cnVjdCBlbmNvZGVfd3FfcyAqd3EpCit7CisJdTMyIGNhbnZhc193aWR0aCwgY2FudmFzX2hlaWdodDsKKwl1MzIgc3RhcnRfYWRkciA9IHdxLT5tZW0uYnVmX3N0YXJ0OworCXUzMiBtYl93ID0gKHdxLT5waWMuZW5jb2Rlcl93aWR0aCArIDE1KSA+PiA0OworCXUzMiBtYl9oID0gKHdxLT5waWMuZW5jb2Rlcl9oZWlnaHQgKyAxNSkgPj4gNDsKKwl1MzIgbWJzID0gbWJfdyAqIG1iX2g7CisKKwljYW52YXNfd2lkdGggPSAoKHdxLT5waWMuZW5jb2Rlcl93aWR0aCArIDMxKSA+PiA1KSA8PCA1OworCWNhbnZhc19oZWlnaHQgPSAoKHdxLT5waWMuZW5jb2Rlcl9oZWlnaHQgKyAxNSkgPj4gNCkgPDwgNDsKKworCXdxLT5tZW0uZGN0X2J1ZmZfc3RhcnRfYWRkciA9IHN0YXJ0X2FkZHIgKworCQl3cS0+bWVtLmJ1ZnNwZWMuZGN0LmJ1Zl9zdGFydDsKKwl3cS0+bWVtLmRjdF9idWZmX2VuZF9hZGRyID0KKwkJd3EtPm1lbS5kY3RfYnVmZl9zdGFydF9hZGRyICsKKwkJd3EtPm1lbS5idWZzcGVjLmRjdC5idWZfc2l6ZSAtIDE7CisJZW5jX3ByKExPR19JTkZPLCAiZGN0X2J1ZmZfc3RhcnRfYWRkciBpcyAweCV4LCB3cTolcC5cbiIsCisJCXdxLT5tZW0uZGN0X2J1ZmZfc3RhcnRfYWRkciwgKHZvaWQgKil3cSk7CisKKwl3cS0+bWVtLmJ1ZnNwZWMuZGVjMF91di5idWZfc3RhcnQgPQorCQl3cS0+bWVtLmJ1ZnNwZWMuZGVjMF95LmJ1Zl9zdGFydCArCisJCWNhbnZhc193aWR0aCAqIGNhbnZhc19oZWlnaHQ7CisJd3EtPm1lbS5idWZzcGVjLmRlYzBfdXYuYnVmX3NpemUgPSBjYW52YXNfd2lkdGggKiBjYW52YXNfaGVpZ2h0IC8gMjsKKwl3cS0+bWVtLmJ1ZnNwZWMuZGVjMV91di5idWZfc3RhcnQgPQorCQl3cS0+bWVtLmJ1ZnNwZWMuZGVjMV95LmJ1Zl9zdGFydCArCisJCWNhbnZhc193aWR0aCAqIGNhbnZhc19oZWlnaHQ7CisJd3EtPm1lbS5idWZzcGVjLmRlYzFfdXYuYnVmX3NpemUgPSBjYW52YXNfd2lkdGggKiBjYW52YXNfaGVpZ2h0IC8gMjsKKwl3cS0+bWVtLmFzc2l0X2J1ZmZlcl9vZmZzZXQgPSBzdGFydF9hZGRyICsKKwkJd3EtPm1lbS5idWZzcGVjLmFzc2l0LmJ1Zl9zdGFydDsKKwllbmNfcHIoTE9HX0lORk8sICJhc3NpdF9idWZmZXJfb2Zmc2V0IGlzIDB4JXgsIHdxOiAlcC5cbiIsCisJCXdxLT5tZW0uYXNzaXRfYnVmZmVyX29mZnNldCwgKHZvaWQgKil3cSk7CisJLypvdXRwdXQgc3RyZWFtIGJ1ZmZlciBjb25maWcqLworCXdxLT5tZW0uQml0c3RyZWFtU3RhcnQgPSBzdGFydF9hZGRyICsKKwkJd3EtPm1lbS5idWZzcGVjLmJpdHN0cmVhbS5idWZfc3RhcnQ7CisJd3EtPm1lbS5CaXRzdHJlYW1FbmQgPQorCQl3cS0+bWVtLkJpdHN0cmVhbVN0YXJ0ICsKKwkJd3EtPm1lbS5idWZzcGVjLmJpdHN0cmVhbS5idWZfc2l6ZSAtIDE7CisJZW5jX3ByKExPR19JTkZPLCAiQml0c3RyZWFtU3RhcnQgaXMgMHgleCwgd3E6ICVwLlxuIiwKKwkJd3EtPm1lbS5CaXRzdHJlYW1TdGFydCwgKHZvaWQgKil3cSk7CisKKwl3cS0+bWVtLnNjYWxlcl9idWZmX3N0YXJ0X2FkZHIgPQorCQl3cS0+bWVtLmJ1Zl9zdGFydCArIHdxLT5tZW0uYnVmc3BlYy5zY2FsZV9idWZmLmJ1Zl9zdGFydDsKKwl3cS0+bWVtLmR1bXBfaW5mb19kZHJfc3RhcnRfYWRkciA9CisJCXdxLT5tZW0uYnVmX3N0YXJ0ICsgd3EtPm1lbS5idWZzcGVjLmR1bXBfaW5mby5idWZfc3RhcnQ7CisJZW5jX3ByKExPR19JTkZPLAorCQkiQ0JSOiBkdW1wX2luZm9fZGRyX3N0YXJ0X2FkZHI6JXguXG4iLAorCQl3cS0+bWVtLmR1bXBfaW5mb19kZHJfc3RhcnRfYWRkcik7CisJZW5jX3ByKExPR19JTkZPLCAiQ0JSOiBidWZfc3RhcnQgOiVkLlxuIiwKKwkJd3EtPm1lbS5idWZfc3RhcnQpOworCWVuY19wcihMT0dfSU5GTywgIkNCUjogZHVtcF9pbmZvLmJ1Zl9zdGFydCA6JWQuXG4iLAorCQl3cS0+bWVtLmJ1ZnNwZWMuZHVtcF9pbmZvLmJ1Zl9zdGFydCk7CisJd3EtPm1lbS5kdW1wX2luZm9fZGRyX3NpemUgPQorCQlEVU1QX0lORk9fQllURVNfUEVSX01CICogbWJzOworCXdxLT5tZW0uZHVtcF9pbmZvX2Rkcl9zaXplID0KKwkJKHdxLT5tZW0uZHVtcF9pbmZvX2Rkcl9zaXplICsgUEFHRV9TSVpFIC0gMSkKKwkJJiB+KFBBR0VfU0laRSAtIDEpOworCXdxLT5tZW0uY2JyX2luZm9fZGRyX3N0YXJ0X2FkZHIgPQorCQl3cS0+bWVtLmJ1Zl9zdGFydCArIHdxLT5tZW0uYnVmc3BlYy5jYnJfaW5mby5idWZfc3RhcnQ7CisJd3EtPm1lbS5jYnJfaW5mb19kZHJfc2l6ZSA9CisJCXdxLT5tZW0uYnVmc3BlYy5jYnJfaW5mby5idWZfc2l6ZTsKKwl3cS0+bWVtLmNicl9pbmZvX2Rkcl92aXJ0X2FkZHIgPQorCQljb2RlY19tbV92bWFwKHdxLT5tZW0uY2JyX2luZm9fZGRyX3N0YXJ0X2FkZHIsCisJCSAgICAgICAgICAgIHdxLT5tZW0uYnVmc3BlYy5jYnJfaW5mby5idWZfc2l6ZSk7CisKKwl3cS0+bWVtLmRibGtfYnVmX2NhbnZhcyA9CisJCSgoRU5DX0NBTlZBU19PRkZTRVQgKyAyKSA8PCAxNikgfAorCQkoKEVOQ19DQU5WQVNfT0ZGU0VUICsgMSkgPDwgOCkgfAorCQkoRU5DX0NBTlZBU19PRkZTRVQpOworCXdxLT5tZW0ucmVmX2J1Zl9jYW52YXMgPQorCQkoKEVOQ19DQU5WQVNfT0ZGU0VUICsgNSkgPDwgMTYpIHwKKwkJKChFTkNfQ0FOVkFTX09GRlNFVCArIDQpIDw8IDgpIHwKKwkJKEVOQ19DQU5WQVNfT0ZGU0VUICsgMyk7Cit9CisKK3N0YXRpYyB2b2lkIGF2Y19pbml0X2llX21lX3BhcmFtZXRlcihzdHJ1Y3QgZW5jb2RlX3dxX3MgKndxLCB1MzIgcXVhbnQpCit7CisJaWVfY3VyX3JlZl9zZWwgPSAwOworCWllX3BpcHBlbGluZV9ibG9jayA9IDEyOworCS8qIGN1cnJlbnRseSBkaXNhYmxlIGhhbGYgYW5kIHN1YiBwaXhlbCAqLworCWllX21lX21vZGUgPQorCQkoaWVfcGlwcGVsaW5lX2Jsb2NrICYgSUVfUElQUEVMSU5FX0JMT0NLX01BU0spIDw8CisJICAgICAgSUVfUElQUEVMSU5FX0JMT0NLX1NISUZUOworCisJV1JJVEVfSFJFRyhJRV9NRV9NT0RFLCBpZV9tZV9tb2RlKTsKKwlXUklURV9IUkVHKElFX1JFRl9TRUwsIGllX2N1cl9yZWZfc2VsKTsKKwlXUklURV9IUkVHKElFX01FX01CX1RZUEUsIGllX21lX21iX3R5cGUpOworI2lmZGVmIE1VTFRJX1NMSUNFX01DCisJaWYgKGZpeGVkX3NsaWNlX2NmZykKKwkJV1JJVEVfSFJFRyhGSVhFRF9TTElDRV9DRkcsIGZpeGVkX3NsaWNlX2NmZyk7CisJZWxzZSBpZiAod3EtPnBpYy5yb3dzX3Blcl9zbGljZSAhPQorCQkJKHdxLT5waWMuZW5jb2Rlcl9oZWlnaHQgKyAxNSkgPj4gNCkgeworCQl1MzIgbWJfcGVyX3NsaWNlID0gKHdxLT5waWMuZW5jb2Rlcl9oZWlnaHQgKyAxNSkgPj4gNDsKKworCQltYl9wZXJfc2xpY2UgPSBtYl9wZXJfc2xpY2UgKiB3cS0+cGljLnJvd3NfcGVyX3NsaWNlOworCQlXUklURV9IUkVHKEZJWEVEX1NMSUNFX0NGRywgbWJfcGVyX3NsaWNlKTsKKwl9IGVsc2UKKwkJV1JJVEVfSFJFRyhGSVhFRF9TTElDRV9DRkcsIDApOworI2Vsc2UKKwlXUklURV9IUkVHKEZJWEVEX1NMSUNFX0NGRywgMCk7CisjZW5kaWYKK30KKworLyogZm9yIHRlbXAgKi8KKyNkZWZpbmUgSENPREVDX01GRElOX1JFR0NfTUJMUAkJKEhDT0RFQ19NRkRJTl9SRUdCX0FNUEMgKyAweDEpCisjZGVmaW5lIEhDT0RFQ19NRkRJTl9SRUcwRAkJCShIQ09ERUNfTUZESU5fUkVHQl9BTVBDICsgMHgyKQorI2RlZmluZSBIQ09ERUNfTUZESU5fUkVHMEUJCQkoSENPREVDX01GRElOX1JFR0JfQU1QQyArIDB4MykKKyNkZWZpbmUgSENPREVDX01GRElOX1JFRzBGCQkJKEhDT0RFQ19NRkRJTl9SRUdCX0FNUEMgKyAweDQpCisjZGVmaW5lIEhDT0RFQ19NRkRJTl9SRUcxMAkJCShIQ09ERUNfTUZESU5fUkVHQl9BTVBDICsgMHg1KQorI2RlZmluZSBIQ09ERUNfTUZESU5fUkVHMTEJCQkoSENPREVDX01GRElOX1JFR0JfQU1QQyArIDB4NikKKyNkZWZpbmUgSENPREVDX01GRElOX1JFRzEyCQkJKEhDT0RFQ19NRkRJTl9SRUdCX0FNUEMgKyAweDcpCisjZGVmaW5lIEhDT0RFQ19NRkRJTl9SRUcxMwkJCShIQ09ERUNfTUZESU5fUkVHQl9BTVBDICsgMHg4KQorI2RlZmluZSBIQ09ERUNfTUZESU5fUkVHMTQJCQkoSENPREVDX01GRElOX1JFR0JfQU1QQyArIDB4OSkKKyNkZWZpbmUgSENPREVDX01GRElOX1JFRzE1CQkJKEhDT0RFQ19NRkRJTl9SRUdCX0FNUEMgKyAweGEpCisjZGVmaW5lIEhDT0RFQ19NRkRJTl9SRUcxNgkJCShIQ09ERUNfTUZESU5fUkVHQl9BTVBDICsgMHhiKQorCitzdGF0aWMgdm9pZCBtZmRpbl9iYXNpYyh1MzIgaW5wdXQsIHU4IGlmb3JtYXQsCisJdTggb2Zvcm1hdCwgdTMyIHBpY3NpemVfeCwgdTMyIHBpY3NpemVfeSwKKwl1OCByMnlfZW4sIHU4IG5yLCB1OCBpZm10X2V4dHJhKQoreworCXU4IGRzYW1wbGVfZW47IC8qIERvd25zYW1wbGUgRW5hYmxlICovCisJdTggaW50ZXJwX2VuOyAgLyogSW50ZXJwb2xhdGlvbiBFbmFibGUgKi8KKwl1OCB5X3NpemU7ICAgICAvKiAwOjE2IFBpeGVscyBmb3IgeSBkaXJlY3Rpb24gcGlja3VwOyAxOjggcGl4ZWxzICovCisJdTggcjJ5X21vZGU7ICAgLyogUkdCMllVViBNb2RlLCByYW5nZSgwfjMpICovCisJLyogbWZkaW5fcmVnM19jYW52WzI1OjI0XTsKKwkgKiAgLy8gYnl0ZXMgcGVyIHBpeGVsIGluIHggZGlyZWN0aW9uIGZvciBpbmRleDAsIDA6aGFsZiAxOjEgMjoyIDM6MworCSAqLworCXU4IGNhbnZfaWR4MF9icHB4OworCS8qIG1mZGluX3JlZzNfY2FudlsyNzoyNl07CisJICogIC8vIGJ5dGVzIHBlciBwaXhlbCBpbiB4IGRpcmVjdGlvbiBmb3IgaW5kZXgxLTIsIDA6aGFsZiAxOjEgMjoyIDM6MworCSAqLworCXU4IGNhbnZfaWR4MV9icHB4OworCS8qIG1mZGluX3JlZzNfY2FudlsyOToyOF07CisJICogIC8vIGJ5dGVzIHBlciBwaXhlbCBpbiB5IGRpcmVjdGlvbiBmb3IgaW5kZXgwLCAwOmhhbGYgMToxIDI6MiAzOjMKKwkgKi8KKwl1OCBjYW52X2lkeDBfYnBweTsKKwkvKiBtZmRpbl9yZWczX2NhbnZbMzE6MzBdOworCSAqICAvLyBieXRlcyBwZXIgcGl4ZWwgaW4geSBkaXJlY3Rpb24gZm9yIGluZGV4MS0yLCAwOmhhbGYgMToxIDI6MiAzOjMKKwkgKi8KKwl1OCBjYW52X2lkeDFfYnBweTsKKwl1OCBpZm10NDQ0LCBpZm10NDIyLCBpZm10NDIwLCBsaW5lYXJfYnl0ZXM0cDsKKwl1OCBucl9lbmFibGU7CisJdTggY2ZnX3lfc25yX2VuOworCXU4IGNmZ195X3Rucl9lbjsKKwl1OCBjZmdfY19zbnJfZW47CisJdTggY2ZnX2NfdG5yX2VuOworCXUzMiBsaW5lYXJfYnl0ZXNwZXJsaW5lOworCXMzMiByZWdfb2Zmc2V0OworCWJvb2wgbGluZWFyX2VuYWJsZSA9IGZhbHNlOworCWJvb2wgZm9ybWF0X2VyciA9IGZhbHNlOworCisJaWYgKGdldF9jcHVfdHlwZSgpID49IE1FU09OX0NQVV9NQUpPUl9JRF9UWEwpIHsKKwkJaWYgKChpZm9ybWF0ID09IDcpICYmIChpZm10X2V4dHJhID4gMikpCisJCQlmb3JtYXRfZXJyID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKGlmb3JtYXQgPT0gNykKKwkJZm9ybWF0X2VyciA9IHRydWU7CisKKwlpZiAoZm9ybWF0X2VycikgeworCQllbmNfcHIoTE9HX0VSUk9SLAorCQkJIm1mZGluIGZvcm1hdCBlcnIsIGlmb3JtYXQ6JWQsIGlmbXRfZXh0cmE6JWRcbiIsCisJCQlpZm9ybWF0LCBpZm10X2V4dHJhKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoaWZvcm1hdCAhPSA3KQorCQlpZm10X2V4dHJhID0gMDsKKworCWlmbXQ0NDQgPSAoKGlmb3JtYXQgPT0gMSkgfHwgKGlmb3JtYXQgPT0gNSkgfHwgKGlmb3JtYXQgPT0gOCkgfHwKKwkJKGlmb3JtYXQgPT0gOSkgfHwgKGlmb3JtYXQgPT0gMTIpKSA/IDEgOiAwOworCWlmIChpZm9ybWF0ID09IDcgJiYgaWZtdF9leHRyYSA9PSAxKQorCQlpZm10NDQ0ID0gMTsKKwlpZm10NDIyID0gKChpZm9ybWF0ID09IDApIHx8IChpZm9ybWF0ID09IDEwKSkgPyAxIDogMDsKKwlpZiAoaWZvcm1hdCA9PSA3ICYmIGlmbXRfZXh0cmEgIT0gMSkKKwkJaWZtdDQyMiA9IDE7CisJaWZtdDQyMCA9ICgoaWZvcm1hdCA9PSAyKSB8fCAoaWZvcm1hdCA9PSAzKSB8fCAoaWZvcm1hdCA9PSA0KSB8fAorCQkoaWZvcm1hdCA9PSAxMSkpID8gMSA6IDA7CisJZHNhbXBsZV9lbiA9ICgoaWZtdDQ0NCAmJiAob2Zvcm1hdCAhPSAyKSkgfHwKKwkJKGlmbXQ0MjIgJiYgKG9mb3JtYXQgPT0gMCkpKSA/IDEgOiAwOworCWludGVycF9lbiA9ICgoaWZtdDQyMiAmJiAob2Zvcm1hdCA9PSAyKSkgfHwKKwkJKGlmbXQ0MjAgJiYgKG9mb3JtYXQgIT0gMCkpKSA/IDEgOiAwOworCXlfc2l6ZSA9IChvZm9ybWF0ICE9IDApID8gMSA6IDA7CisJaWYgKGlmb3JtYXQgPT0gMTIpCisJCXlfc2l6ZSA9IDA7CisJcjJ5X21vZGUgPSAocjJ5X2VuID09IDEpID8gMSA6IDA7IC8qIEZpeGVkIHRvIDEgKFRPRE8pICovCisJY2Fudl9pZHgwX2JwcHggPSAoaWZvcm1hdCA9PSAxKSA/IDMgOiAoaWZvcm1hdCA9PSAwKSA/IDIgOiAxOworCWNhbnZfaWR4MV9icHB4ID0gKGlmb3JtYXQgPT0gNCkgPyAwIDogMTsKKwljYW52X2lkeDBfYnBweSA9IDE7CisJY2Fudl9pZHgxX2JwcHkgPSAoaWZvcm1hdCA9PSA1KSA/IDEgOiAwOworCisJaWYgKChpZm9ybWF0ID09IDgpIHx8IChpZm9ybWF0ID09IDkpIHx8IChpZm9ybWF0ID09IDEyKSkKKwkJbGluZWFyX2J5dGVzNHAgPSAzOworCWVsc2UgaWYgKGlmb3JtYXQgPT0gMTApCisJCWxpbmVhcl9ieXRlczRwID0gMjsKKwllbHNlIGlmIChpZm9ybWF0ID09IDExKQorCQlsaW5lYXJfYnl0ZXM0cCA9IDE7CisJZWxzZQorCQlsaW5lYXJfYnl0ZXM0cCA9IDA7CisJaWYgKGlmb3JtYXQgPT0gMTIpCisJCWxpbmVhcl9ieXRlc3BlcmxpbmUgPSBwaWNzaXplX3ggKiA0OworCWVsc2UKKwkJbGluZWFyX2J5dGVzcGVybGluZSA9IHBpY3NpemVfeCAqIGxpbmVhcl9ieXRlczRwOworCisJaWYgKGlmb3JtYXQgPCA4KQorCQlsaW5lYXJfZW5hYmxlID0gZmFsc2U7CisJZWxzZQorCQlsaW5lYXJfZW5hYmxlID0gdHJ1ZTsKKworCWlmIChnZXRfY3B1X3R5cGUoKSA+PSBNRVNPTl9DUFVfTUFKT1JfSURfR1hCQikgeworCQlyZWdfb2Zmc2V0ID0gLTg7CisJCS8qIG5yX21vZGU6IDA6RGlzYWJsZWQgMTpTTlIgT25seSAyOlROUiBPbmx5IDM6M0ROUiAqLworCQlucl9lbmFibGUgPSAobnIpID8gMSA6IDA7CisJCWNmZ195X3Nucl9lbiA9ICgobnIgPT0gMSkgfHwgKG5yID09IDMpKSA/IDEgOiAwOworCQljZmdfeV90bnJfZW4gPSAoKG5yID09IDIpIHx8IChuciA9PSAzKSkgPyAxIDogMDsKKwkJY2ZnX2Nfc25yX2VuID0gY2ZnX3lfc25yX2VuOworCQkvKiBjZmdfY190bnJfZW4gPSBjZmdfeV90bnJfZW47ICovCisJCWNmZ19jX3Rucl9lbiA9IDA7CisKKwkJLyogTlIgRm9yIFkgKi8KKwkJV1JJVEVfSFJFRygoSENPREVDX01GRElOX1JFRzBEICsgcmVnX29mZnNldCksCisJCQkoKGNmZ195X3Nucl9lbiA8PCAwKSB8CisJCQkoeV9zbnJfZXJyX25vcm0gPDwgMSkgfAorCQkJKHlfc25yX2dhdV9ibGRfY29yZSA8PCAyKSB8CisJCQkoKCh5X3Nucl9nYXVfYmxkX29mc3QpICYgMHhmZikgPDwgNikgfAorCQkJKHlfc25yX2dhdV9ibGRfcmF0ZSA8PCAxNCkgfAorCQkJKHlfc25yX2dhdV9hbHAwX21pbiA8PCAyMCkgfAorCQkJKHlfc25yX2dhdV9hbHAwX21heCA8PCAyNikpKTsKKwkJV1JJVEVfSFJFRygoSENPREVDX01GRElOX1JFRzBFICsgcmVnX29mZnNldCksCisJCQkoKGNmZ195X3Rucl9lbiA8PCAwKSB8CisJCQkoeV90bnJfbWNfZW4gPDwgMSkgfAorCQkJKHlfdG5yX3R4dF9tb2RlIDw8IDIpIHwKKwkJCSh5X3Rucl9tb3Rfc2FkX21hcmdpbiA8PCAzKSB8CisJCQkoeV90bnJfYWxwaGFfbWluIDw8IDcpIHwKKwkJCSh5X3Rucl9hbHBoYV9tYXggPDwgMTMpIHwKKwkJCSh5X3Rucl9kZWdob3N0X29zIDw8IDE5KSkpOworCQlXUklURV9IUkVHKChIQ09ERUNfTUZESU5fUkVHMEYgKyByZWdfb2Zmc2V0KSwKKwkJCSgoeV90bnJfbW90X2NvcnR4dF9yYXRlIDw8IDApIHwKKwkJCSh5X3Rucl9tb3RfZGlzdHh0X29mc3QgPDwgOCkgfAorCQkJKHlfdG5yX21vdF9kaXN0eHRfcmF0ZSA8PCA0KSB8CisJCQkoeV90bnJfbW90X2Rpc21vdF9vZnN0IDw8IDE2KSB8CisJCQkoeV90bnJfbW90X2ZyY3NhZF9sb2NrIDw8IDI0KSkpOworCQlXUklURV9IUkVHKChIQ09ERUNfTUZESU5fUkVHMTAgKyByZWdfb2Zmc2V0KSwKKwkJCSgoeV90bnJfbW90MmFscF9mcmNfZ2FpbiA8PCAwKSB8CisJCQkoeV90bnJfbW90MmFscF9ucm1fZ2FpbiA8PCA4KSB8CisJCQkoeV90bnJfbW90MmFscF9kaXNfZ2FpbiA8PCAxNikgfAorCQkJKHlfdG5yX21vdDJhbHBfZGlzX29mc3QgPDwgMjQpKSk7CisJCVdSSVRFX0hSRUcoKEhDT0RFQ19NRkRJTl9SRUcxMSArIHJlZ19vZmZzZXQpLAorCQkJKCh5X2JsZF9iZXRhMmFscF9yYXRlIDw8IDApIHwKKwkJCSh5X2JsZF9iZXRhX21pbiA8PCA4KSB8CisJCQkoeV9ibGRfYmV0YV9tYXggPDwgMTQpKSk7CisKKwkJLyogTlIgRm9yIEMgKi8KKwkJV1JJVEVfSFJFRygoSENPREVDX01GRElOX1JFRzEyICsgcmVnX29mZnNldCksCisJCQkoKGNmZ195X3Nucl9lbiA8PCAwKSB8CisJCQkoY19zbnJfZXJyX25vcm0gPDwgMSkgfAorCQkJKGNfc25yX2dhdV9ibGRfY29yZSA8PCAyKSB8CisJCQkoKChjX3Nucl9nYXVfYmxkX29mc3QpICYgMHhmZikgPDwgNikgfAorCQkJKGNfc25yX2dhdV9ibGRfcmF0ZSA8PCAxNCkgfAorCQkJKGNfc25yX2dhdV9hbHAwX21pbiA8PCAyMCkgfAorCQkJKGNfc25yX2dhdV9hbHAwX21heCA8PCAyNikpKTsKKworCQlXUklURV9IUkVHKChIQ09ERUNfTUZESU5fUkVHMTMgKyByZWdfb2Zmc2V0KSwKKwkJCSgoY2ZnX2NfdG5yX2VuIDw8IDApIHwKKwkJCShjX3Rucl9tY19lbiA8PCAxKSB8CisJCQkoY190bnJfdHh0X21vZGUgPDwgMikgfAorCQkJKGNfdG5yX21vdF9zYWRfbWFyZ2luIDw8IDMpIHwKKwkJCShjX3Rucl9hbHBoYV9taW4gPDwgNykgfAorCQkJKGNfdG5yX2FscGhhX21heCA8PCAxMykgfAorCQkJKGNfdG5yX2RlZ2hvc3Rfb3MgPDwgMTkpKSk7CisJCVdSSVRFX0hSRUcoKEhDT0RFQ19NRkRJTl9SRUcxNCArIHJlZ19vZmZzZXQpLAorCQkJKChjX3Rucl9tb3RfY29ydHh0X3JhdGUgPDwgMCkgfAorCQkJKGNfdG5yX21vdF9kaXN0eHRfb2ZzdCA8PCA4KSB8CisJCQkoY190bnJfbW90X2Rpc3R4dF9yYXRlIDw8IDQpIHwKKwkJCShjX3Rucl9tb3RfZGlzbW90X29mc3QgPDwgMTYpIHwKKwkJCShjX3Rucl9tb3RfZnJjc2FkX2xvY2sgPDwgMjQpKSk7CisJCVdSSVRFX0hSRUcoKEhDT0RFQ19NRkRJTl9SRUcxNSArIHJlZ19vZmZzZXQpLAorCQkJKChjX3Rucl9tb3QyYWxwX2ZyY19nYWluIDw8IDApIHwKKwkJCShjX3Rucl9tb3QyYWxwX25ybV9nYWluIDw8IDgpIHwKKwkJCShjX3Rucl9tb3QyYWxwX2Rpc19nYWluIDw8IDE2KSB8CisJCQkoY190bnJfbW90MmFscF9kaXNfb2ZzdCA8PCAyNCkpKTsKKworCQlXUklURV9IUkVHKChIQ09ERUNfTUZESU5fUkVHMTYgKyByZWdfb2Zmc2V0KSwKKwkJCSgoY19ibGRfYmV0YTJhbHBfcmF0ZSA8PCAwKSB8CisJCQkoY19ibGRfYmV0YV9taW4gPDwgOCkgfAorCQkJKGNfYmxkX2JldGFfbWF4IDw8IDE0KSkpOworCisJCVdSSVRFX0hSRUcoKEhDT0RFQ19NRkRJTl9SRUcxX0NUUkwgKyByZWdfb2Zmc2V0KSwKKwkJCShpZm9ybWF0IDw8IDApIHwgKG9mb3JtYXQgPDwgNCkgfAorCQkJKGRzYW1wbGVfZW4gPDwgNikgfCAoeV9zaXplIDw8IDgpIHwKKwkJCShpbnRlcnBfZW4gPDwgOSkgfCAocjJ5X2VuIDw8IDEyKSB8CisJCQkocjJ5X21vZGUgPDwgMTMpIHwgKGlmbXRfZXh0cmEgPDwgMTYpIHwKKwkJCShucl9lbmFibGUgPDwgMTkpKTsKKwkJaWYgKGdldF9jcHVfdHlwZSgpID49IE1FU09OX0NQVV9NQUpPUl9JRF9TQzIpIHsKKwkJCVdSSVRFX0hSRUcoKEhDT0RFQ19NRkRJTl9SRUc4X0RNQkwgKyByZWdfb2Zmc2V0KSwKKwkJCQkocGljc2l6ZV94IDw8IDE2KSB8IChwaWNzaXplX3kgPDwgMCkpOworCQl9IGVsc2UgeworCQkJV1JJVEVfSFJFRygoSENPREVDX01GRElOX1JFRzhfRE1CTCArIHJlZ19vZmZzZXQpLAorCQkJCShwaWNzaXplX3ggPDwgMTQpIHwgKHBpY3NpemVfeSA8PCAwKSk7CisJCX0KKwl9IGVsc2UgeworCQlyZWdfb2Zmc2V0ID0gMDsKKwkJV1JJVEVfSFJFRygoSENPREVDX01GRElOX1JFRzFfQ1RSTCArIHJlZ19vZmZzZXQpLAorCQkJKGlmb3JtYXQgPDwgMCkgfCAob2Zvcm1hdCA8PCA0KSB8CisJCQkoZHNhbXBsZV9lbiA8PCA2KSB8ICh5X3NpemUgPDwgOCkgfAorCQkJKGludGVycF9lbiA8PCA5KSB8IChyMnlfZW4gPDwgMTIpIHwKKwkJCShyMnlfbW9kZSA8PCAxMykpOworCisJCVdSSVRFX0hSRUcoKEhDT0RFQ19NRkRJTl9SRUc4X0RNQkwgKyByZWdfb2Zmc2V0KSwKKwkJCShwaWNzaXplX3ggPDwgMTIpIHwgKHBpY3NpemVfeSA8PCAwKSk7CisJfQorCisJaWYgKGxpbmVhcl9lbmFibGUgPT0gZmFsc2UpIHsKKwkJV1JJVEVfSFJFRygoSENPREVDX01GRElOX1JFRzNfQ0FOViArIHJlZ19vZmZzZXQpLAorCQkJKGlucHV0ICYgMHhmZmZmZmYpIHwKKwkJCShjYW52X2lkeDFfYnBweSA8PCAzMCkgfAorCQkJKGNhbnZfaWR4MF9icHB5IDw8IDI4KSB8CisJCQkoY2Fudl9pZHgxX2JwcHggPDwgMjYpIHwKKwkJCShjYW52X2lkeDBfYnBweCA8PCAyNCkpOworCQlXUklURV9IUkVHKChIQ09ERUNfTUZESU5fUkVHNF9MTlIwICsgcmVnX29mZnNldCksCisJCQkoMCA8PCAxNikgfCAoMCA8PCAwKSk7CisJCVdSSVRFX0hSRUcoKEhDT0RFQ19NRkRJTl9SRUc1X0xOUjEgKyByZWdfb2Zmc2V0KSwgMCk7CisJfSBlbHNlIHsKKwkJV1JJVEVfSFJFRygoSENPREVDX01GRElOX1JFRzNfQ0FOViArIHJlZ19vZmZzZXQpLAorCQkJKGNhbnZfaWR4MV9icHB5IDw8IDMwKSB8CisJCQkoY2Fudl9pZHgwX2JwcHkgPDwgMjgpIHwKKwkJCShjYW52X2lkeDFfYnBweCA8PCAyNikgfAorCQkJKGNhbnZfaWR4MF9icHB4IDw8IDI0KSk7CisJCVdSSVRFX0hSRUcoKEhDT0RFQ19NRkRJTl9SRUc0X0xOUjAgKyByZWdfb2Zmc2V0KSwKKwkJCShsaW5lYXJfYnl0ZXM0cCA8PCAxNikgfCAobGluZWFyX2J5dGVzcGVybGluZSA8PCAwKSk7CisJCVdSSVRFX0hSRUcoKEhDT0RFQ19NRkRJTl9SRUc1X0xOUjEgKyByZWdfb2Zmc2V0KSwgaW5wdXQpOworCX0KKworCWlmIChpZm9ybWF0ID09IDEyKQorCQlXUklURV9IUkVHKChIQ09ERUNfTUZESU5fUkVHOV9FTkROICsgcmVnX29mZnNldCksCisJCQkoMiA8PCAwKSB8ICgxIDw8IDMpIHwgKDAgPDwgNikgfAorCQkJKDMgPDwgOSkgfCAoNiA8PCAxMikgfCAoNSA8PCAxNSkgfAorCQkJKDQgPDwgMTgpIHwgKDcgPDwgMjEpKTsKKwllbHNlCisJCVdSSVRFX0hSRUcoKEhDT0RFQ19NRkRJTl9SRUc5X0VORE4gKyByZWdfb2Zmc2V0KSwKKwkJCSg3IDw8IDApIHwgKDYgPDwgMykgfCAoNSA8PCA2KSB8CisJCQkoNCA8PCA5KSB8ICgzIDw8IDEyKSB8ICgyIDw8IDE1KSB8CisJCQkoMSA8PCAxOCkgfCAoMCA8PCAyMSkpOworfQorCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfR0UyRAorc3RhdGljIGludCBzY2FsZV9mcmFtZShzdHJ1Y3QgZW5jb2RlX3dxX3MgKndxLAorCXN0cnVjdCBlbmNvZGVfcmVxdWVzdF9zICpyZXF1ZXN0LAorCXN0cnVjdCBjb25maWdfcGFyYV9leF9zICpnZTJkX2NvbmZpZywKKwl1MzIgc3JjX2FkZHIsIGJvb2wgY2FudmFzKQoreworCXN0cnVjdCBnZTJkX2NvbnRleHRfcyAqY29udGV4dCA9IGVuY29kZV9tYW5hZ2VyLmNvbnRleHQ7CisJaW50IHNyY190b3AsIHNyY19sZWZ0LCBzcmNfd2lkdGgsIHNyY19oZWlnaHQ7CisJc3RydWN0IGNhbnZhc19zIGNzMCwgY3MxLCBjczIsIGNkOworCXUzMiBzcmNfY2FudmFzLCBkc3RfY2FudmFzOworCXUzMiBzcmNfY2FudmFzX3csIGRzdF9jYW52YXNfdzsKKwl1MzIgc3JjX2ggPSByZXF1ZXN0LT5zcmNfaDsKKwl1MzIgZHN0X3cgPSAoKHdxLT5waWMuZW5jb2Rlcl93aWR0aCArIDE1KSA+PiA0KSA8PCA0OworCXUzMiBkc3RfaCA9ICgod3EtPnBpYy5lbmNvZGVyX2hlaWdodCArIDE1KSA+PiA0KSA8PCA0OworCWludCBpbnB1dF9mb3JtYXQgPSBHRTJEX0ZPUk1BVF9NMjRfTlYyMTsKKworCXNyY190b3AgPSByZXF1ZXN0LT5jcm9wX3RvcDsKKwlzcmNfbGVmdCA9IHJlcXVlc3QtPmNyb3BfbGVmdDsKKwlzcmNfd2lkdGggPSByZXF1ZXN0LT5zcmNfdyAtIHNyY19sZWZ0IC0gcmVxdWVzdC0+Y3JvcF9yaWdodDsKKwlzcmNfaGVpZ2h0ID0gcmVxdWVzdC0+c3JjX2ggLSBzcmNfdG9wIC0gcmVxdWVzdC0+Y3JvcF9ib3R0b207CisJZW5jX3ByKExPR19JTkZPLCAicmVxdWVzdC0+Zm10PSVkLCAlZCAlZCwgY2FudmFzPSVkXG4iLCByZXF1ZXN0LT5mbXQsIEZNVF9OVjIxLCBGTVRfQkdSODg4LCBjYW52YXMpOworCisJaWYgKGNhbnZhcykgeworCQlpZiAoKHJlcXVlc3QtPmZtdCA9PSBGTVRfTlYyMSkKKwkJCXx8IChyZXF1ZXN0LT5mbXQgPT0gRk1UX05WMTIpKSB7CisJCQlzcmNfY2FudmFzID0gc3JjX2FkZHIgJiAweGZmZmY7CisJCQlpbnB1dF9mb3JtYXQgPSBHRTJEX0ZPUk1BVF9NMjRfTlYyMTsKKwkJfSBlbHNlIGlmIChyZXF1ZXN0LT5mbXQgPT0gRk1UX0JHUjg4OCkgeworCQkJc3JjX2NhbnZhcyA9IHNyY19hZGRyICYgMHhmZmZmZmY7CisJCQlpbnB1dF9mb3JtYXQgPSBHRTJEX0ZPUk1BVF9TMjRfUkdCOyAvL09wcG9zaXRlIGNvbG9yIGFmdGVyIGdlMmQKKwkJfSBlbHNlIGlmIChyZXF1ZXN0LT5mbXQgPT0gRk1UX1JHQkE4ODg4KSB7CisJCQlzcmNfY2FudmFzID0gc3JjX2FkZHIgJiAweGZmZmZmZjsKKwkJCWlucHV0X2Zvcm1hdCA9IEdFMkRfRk9STUFUX1MzMl9BQkdSOworCQl9IGVsc2UgeworCQkJc3JjX2NhbnZhcyA9IHNyY19hZGRyICYgMHhmZmZmZmY7CisJCQlpbnB1dF9mb3JtYXQgPSBHRTJEX0ZPUk1BVF9NMjRfWVVWNDIwOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKChyZXF1ZXN0LT5mbXQgPT0gRk1UX05WMjEpCisJCQl8fCAocmVxdWVzdC0+Zm10ID09IEZNVF9OVjEyKSkgeworCQkJc3JjX2NhbnZhc193ID0KKwkJCQkoKHJlcXVlc3QtPnNyY193ICsgMzEpID4+IDUpIDw8IDU7CisJCQljYW52YXNfY29uZmlnKEVOQ19DQU5WQVNfT0ZGU0VUICsgOSwKKwkJCQlzcmNfYWRkciwKKwkJCQlzcmNfY2FudmFzX3csIHNyY19oLAorCQkJCUNBTlZBU19BRERSX05PV1JBUCwKKwkJCQlDQU5WQVNfQkxLTU9ERV9MSU5FQVIpOworCQkJY2FudmFzX2NvbmZpZyhFTkNfQ0FOVkFTX09GRlNFVCArIDEwLAorCQkJCXNyY19hZGRyICsgc3JjX2NhbnZhc193ICogc3JjX2gsCisJCQkJc3JjX2NhbnZhc193LCBzcmNfaCAvIDIsCisJCQkJQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJCUNBTlZBU19CTEtNT0RFX0xJTkVBUik7CisJCQlzcmNfY2FudmFzID0KKwkJCQkoKEVOQ19DQU5WQVNfT0ZGU0VUICsgMTApIDw8IDgpCisJCQkJfCAoRU5DX0NBTlZBU19PRkZTRVQgKyA5KTsKKwkJCWlucHV0X2Zvcm1hdCA9IEdFMkRfRk9STUFUX00yNF9OVjIxOworCQl9IGVsc2UgaWYgKHJlcXVlc3QtPmZtdCA9PSBGTVRfQkdSODg4KSB7CisJCQlzcmNfY2FudmFzX3cgPQorCQkJCSgocmVxdWVzdC0+c3JjX3cgKyAzMSkgPj4gNSkgPDwgNTsKKworCQkJY2FudmFzX2NvbmZpZyhFTkNfQ0FOVkFTX09GRlNFVCArIDksCisJCQkJc3JjX2FkZHIsCisJCQkJc3JjX2NhbnZhc193ICogMywgc3JjX2gsCisJCQkJQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJCUNBTlZBU19CTEtNT0RFX0xJTkVBUik7CisJCQlzcmNfY2FudmFzID0gRU5DX0NBTlZBU19PRkZTRVQgKyA5OworCQkJaW5wdXRfZm9ybWF0ID0gR0UyRF9GT1JNQVRfUzI0X1JHQjsgLy9PcHBvc2l0ZSBjb2xvciBhZnRlciBnZTJkCisJCX0gZWxzZSBpZiAocmVxdWVzdC0+Zm10ID09IEZNVF9SR0JBODg4OCkgeworCQkJc3JjX2NhbnZhc193ID0KKwkJCQkoKHJlcXVlc3QtPnNyY193ICsgMzEpID4+IDUpIDw8IDU7CisJCQljYW52YXNfY29uZmlnKAorCQkJCUVOQ19DQU5WQVNfT0ZGU0VUICsgOSwKKwkJCQlzcmNfYWRkciwKKwkJCQlzcmNfY2FudmFzX3cgKiA0LAorCQkJCXNyY19oLAorCQkJCUNBTlZBU19BRERSX05PV1JBUCwKKwkJCQlDQU5WQVNfQkxLTU9ERV9MSU5FQVIpOworCQkJc3JjX2NhbnZhcyA9IEVOQ19DQU5WQVNfT0ZGU0VUICsgOTsKKwkJCWlucHV0X2Zvcm1hdCA9IEdFMkRfRk9STUFUX1MzMl9BQkdSOyAvL09wcG9zaXRlIGNvbG9yIGFmdGVyIGdlMmQKKwkJfSBlbHNlIHsKKwkJCXNyY19jYW52YXNfdyA9CisJCQkJKChyZXF1ZXN0LT5zcmNfdyArIDYzKSA+PiA2KSA8PCA2OworCQkJY2FudmFzX2NvbmZpZyhFTkNfQ0FOVkFTX09GRlNFVCArIDksCisJCQkJc3JjX2FkZHIsCisJCQkJc3JjX2NhbnZhc193LCBzcmNfaCwKKwkJCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCQkJQ0FOVkFTX0JMS01PREVfTElORUFSKTsKKwkJCWNhbnZhc19jb25maWcoRU5DX0NBTlZBU19PRkZTRVQgKyAxMCwKKwkJCQlzcmNfYWRkciArIHNyY19jYW52YXNfdyAqIHNyY19oLAorCQkJCXNyY19jYW52YXNfdyAvIDIsIHNyY19oIC8gMiwKKwkJCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCQkJQ0FOVkFTX0JMS01PREVfTElORUFSKTsKKwkJCWNhbnZhc19jb25maWcoRU5DX0NBTlZBU19PRkZTRVQgKyAxMSwKKwkJCQlzcmNfYWRkciArIHNyY19jYW52YXNfdyAqIHNyY19oICogNSAvIDQsCisJCQkJc3JjX2NhbnZhc193IC8gMiwgc3JjX2ggLyAyLAorCQkJCUNBTlZBU19BRERSX05PV1JBUCwKKwkJCQlDQU5WQVNfQkxLTU9ERV9MSU5FQVIpOworCQkJc3JjX2NhbnZhcyA9CisJCQkJKChFTkNfQ0FOVkFTX09GRlNFVCArIDExKSA8PCAxNikgfAorCQkJCSgoRU5DX0NBTlZBU19PRkZTRVQgKyAxMCkgPDwgOCkgfAorCQkJCShFTkNfQ0FOVkFTX09GRlNFVCArIDkpOworCQkJaW5wdXRfZm9ybWF0ID0gR0UyRF9GT1JNQVRfTTI0X1lVVjQyMDsKKwkJfQorCX0KKworCWRzdF9jYW52YXNfdyA9ICAoKGRzdF93ICsgMzEpID4+IDUpIDw8IDU7CisKKwljYW52YXNfY29uZmlnKEVOQ19DQU5WQVNfT0ZGU0VUICsgNiwKKwkJd3EtPm1lbS5zY2FsZXJfYnVmZl9zdGFydF9hZGRyLAorCQlkc3RfY2FudmFzX3csIGRzdF9oLAorCQlDQU5WQVNfQUREUl9OT1dSQVAsIENBTlZBU19CTEtNT0RFX0xJTkVBUik7CisKKwljYW52YXNfY29uZmlnKEVOQ19DQU5WQVNfT0ZGU0VUICsgNywKKwkJd3EtPm1lbS5zY2FsZXJfYnVmZl9zdGFydF9hZGRyICsgZHN0X2NhbnZhc193ICogZHN0X2gsCisJCWRzdF9jYW52YXNfdywgZHN0X2ggLyAyLAorCQlDQU5WQVNfQUREUl9OT1dSQVAsIENBTlZBU19CTEtNT0RFX0xJTkVBUik7CisKKwlkc3RfY2FudmFzID0gKChFTkNfQ0FOVkFTX09GRlNFVCArIDcpIDw8IDgpIHwKKwkJKEVOQ19DQU5WQVNfT0ZGU0VUICsgNik7CisKKwlnZTJkX2NvbmZpZy0+YWx1X2NvbnN0X2NvbG9yID0gMDsKKwlnZTJkX2NvbmZpZy0+Yml0bWFza19lbiAgPSAwOworCWdlMmRfY29uZmlnLT5zcmMxX2diX2FscGhhID0gMDsKKwlnZTJkX2NvbmZpZy0+ZHN0X3h5X3N3YXAgPSAwOworCWNhbnZhc19yZWFkKHNyY19jYW52YXMgJiAweGZmLCAmY3MwKTsKKwljYW52YXNfcmVhZCgoc3JjX2NhbnZhcyA+PiA4KSAmIDB4ZmYsICZjczEpOworCWNhbnZhc19yZWFkKChzcmNfY2FudmFzID4+IDE2KSAmIDB4ZmYsICZjczIpOworCWdlMmRfY29uZmlnLT5zcmNfcGxhbmVzWzBdLmFkZHIgPSBjczAuYWRkcjsKKwlnZTJkX2NvbmZpZy0+c3JjX3BsYW5lc1swXS53ID0gZHN0X3cgKiA0Oy8vY3MwLndpZHRoOworCWdlMmRfY29uZmlnLT5zcmNfcGxhbmVzWzBdLmggPSBkc3RfaDsvL2NzMC5oZWlnaHQ7CisJZ2UyZF9jb25maWctPnNyY19wbGFuZXNbMV0uYWRkciA9IGNzMS5hZGRyOworCWdlMmRfY29uZmlnLT5zcmNfcGxhbmVzWzFdLncgPSBjczEud2lkdGg7CisJZ2UyZF9jb25maWctPnNyY19wbGFuZXNbMV0uaCA9IGNzMS5oZWlnaHQ7CisJZ2UyZF9jb25maWctPnNyY19wbGFuZXNbMl0uYWRkciA9IGNzMi5hZGRyOworCWdlMmRfY29uZmlnLT5zcmNfcGxhbmVzWzJdLncgPSBjczIud2lkdGg7CisJZ2UyZF9jb25maWctPnNyY19wbGFuZXNbMl0uaCA9IGNzMi5oZWlnaHQ7CisKKwljYW52YXNfcmVhZChkc3RfY2FudmFzICYgMHhmZiwgJmNkKTsKKworCWdlMmRfY29uZmlnLT5kc3RfcGxhbmVzWzBdLmFkZHIgPSBjZC5hZGRyOworCWdlMmRfY29uZmlnLT5kc3RfcGxhbmVzWzBdLncgPSBkc3RfdyAqIDQ7Ly9jZC53aWR0aDsKKwlnZTJkX2NvbmZpZy0+ZHN0X3BsYW5lc1swXS5oID0gZHN0X2g7Ly9jZC5oZWlnaHQ7CisJZ2UyZF9jb25maWctPnNyY19rZXkua2V5X2VuYWJsZSA9IDA7CisJZ2UyZF9jb25maWctPnNyY19rZXkua2V5X21hc2sgPSAwOworCWdlMmRfY29uZmlnLT5zcmNfa2V5LmtleV9tb2RlID0gMDsKKwlnZTJkX2NvbmZpZy0+c3JjX3BhcmEuY2FudmFzX2luZGV4ID0gc3JjX2NhbnZhczsKKwlnZTJkX2NvbmZpZy0+c3JjX3BhcmEubWVtX3R5cGUgPSBDQU5WQVNfVFlQRV9JTlZBTElEOworCWdlMmRfY29uZmlnLT5zcmNfcGFyYS5mb3JtYXQgPSBpbnB1dF9mb3JtYXQgfCBHRTJEX0xJVFRMRV9FTkRJQU47CisJZ2UyZF9jb25maWctPnNyY19wYXJhLmZpbGxfY29sb3JfZW4gPSAwOworCWdlMmRfY29uZmlnLT5zcmNfcGFyYS5maWxsX21vZGUgPSAwOworCWdlMmRfY29uZmlnLT5zcmNfcGFyYS54X3JldiA9IDA7CisJZ2UyZF9jb25maWctPnNyY19wYXJhLnlfcmV2ID0gMDsKKwlnZTJkX2NvbmZpZy0+c3JjX3BhcmEuY29sb3IgPSAweGZmZmZmZmZmOworCWdlMmRfY29uZmlnLT5zcmNfcGFyYS50b3AgPSAwOworCWdlMmRfY29uZmlnLT5zcmNfcGFyYS5sZWZ0ID0gMDsKKwlnZTJkX2NvbmZpZy0+c3JjX3BhcmEud2lkdGggPSBkc3RfdzsvL3JlcXVlc3QtPnNyY193OworCWdlMmRfY29uZmlnLT5zcmNfcGFyYS5oZWlnaHQgPSBkc3RfaDsvL3JlcXVlc3QtPnNyY19oOworCWdlMmRfY29uZmlnLT5zcmMyX3BhcmEubWVtX3R5cGUgPSBDQU5WQVNfVFlQRV9JTlZBTElEOworCWdlMmRfY29uZmlnLT5kc3RfcGFyYS5jYW52YXNfaW5kZXggPSBkc3RfY2FudmFzOworCWdlMmRfY29uZmlnLT5kc3RfcGFyYS5tZW1fdHlwZSA9IENBTlZBU19UWVBFX0lOVkFMSUQ7CisJZ2UyZF9jb25maWctPmRzdF9wYXJhLmZvcm1hdCA9CisJCUdFMkRfRk9STUFUX00yNF9OVjIxIHwgR0UyRF9MSVRUTEVfRU5ESUFOOworCisJaWYgKHdxLT5waWMuZW5jb2Rlcl93aWR0aCA+PSAxMjgwICYmIHdxLT5waWMuZW5jb2Rlcl9oZWlnaHQgPj0gNzIwKSB7CisJCWdlMmRfY29uZmlnLT5kc3RfcGFyYS5mb3JtYXQgfD0gd3EtPnBpYy5jb2xvcl9zcGFjZTsKKwl9CisKKwlnZTJkX2NvbmZpZy0+ZHN0X3BhcmEuZmlsbF9jb2xvcl9lbiA9IDA7CisJZ2UyZF9jb25maWctPmRzdF9wYXJhLmZpbGxfbW9kZSA9IDA7CisJZ2UyZF9jb25maWctPmRzdF9wYXJhLnhfcmV2ID0gMDsKKwlnZTJkX2NvbmZpZy0+ZHN0X3BhcmEueV9yZXYgPSAwOworCWdlMmRfY29uZmlnLT5kc3RfcGFyYS5jb2xvciA9IDA7CisJZ2UyZF9jb25maWctPmRzdF9wYXJhLnRvcCA9IDA7CisJZ2UyZF9jb25maWctPmRzdF9wYXJhLmxlZnQgPSAwOworCWdlMmRfY29uZmlnLT5kc3RfcGFyYS53aWR0aCA9IGRzdF93OworCWdlMmRfY29uZmlnLT5kc3RfcGFyYS5oZWlnaHQgPSBkc3RfaDsKKwlnZTJkX2NvbmZpZy0+ZHN0X3BhcmEueF9yZXYgPSAwOworCWdlMmRfY29uZmlnLT5kc3RfcGFyYS55X3JldiA9IDA7CisKKworCWlmIChnZTJkX2NvbnRleHRfY29uZmlnX2V4KGNvbnRleHQsIGdlMmRfY29uZmlnKSA8IDApIHsKKwkJcHJfZXJyKCIrK2dlMmQgY29uZmlnaW5nIGVycm9yLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJc3RyZXRjaGJsdF9ub2FscGhhKGNvbnRleHQsIHNyY19sZWZ0LCBzcmNfdG9wLCBzcmNfd2lkdGgsIHNyY19oZWlnaHQsCisJCTAsIDAsIHdxLT5waWMuZW5jb2Rlcl93aWR0aCwgd3EtPnBpYy5lbmNvZGVyX2hlaWdodCk7CisJcmV0dXJuIGRzdF9jYW52YXNfdypkc3RfaCAqIDMgLyAyOworfQorI2VuZGlmCisKK3N0YXRpYyBzMzIgZHVtcF9yYXdfaW5wdXQoc3RydWN0IGVuY29kZV93cV9zICp3cSwgc3RydWN0IGVuY29kZV9yZXF1ZXN0X3MgKnJlcXVlc3QpIHsKKwl1OCAqZGF0YTsKKwlzdHJ1Y3QgY2FudmFzX3MgY3MwLCBjczE7Ly8sIGNzMgorCXUzMiB5X2FkZHIsIHV2X2FkZHIsIGNhbnZhc193LCBwaWNzaXplX3k7CisJdTMyIGlucHV0ID0gcmVxdWVzdC0+c3JjOworCS8vdTggaWZvcm1hdCA9IE1BWF9GUkFNRV9GTVQ7CisJc3RydWN0IGZpbGUgKmZpbHA7CisJaWYgKHJlcXVlc3QtPnR5cGUgPT0gQ0FOVkFTX0JVRkYpIHsKKwkJaWYgKChyZXF1ZXN0LT5mbXQgPT0gRk1UX05WMjEpIHx8IChyZXF1ZXN0LT5mbXQgPT0gRk1UX05WMTIpKSB7CisJCQlpbnB1dCA9IGlucHV0ICYgMHhmZmZmOworCQkJY2FudmFzX3JlYWQoaW5wdXQgJiAweGZmLCAmY3MwKTsKKwkJCWNhbnZhc19yZWFkKChpbnB1dCA+PiA4KSAmIDB4ZmYsICZjczEpOworCQkJcHJfZXJyKCJkdW1wIHJhdyBpbnB1dCBmb3IgY2FudmFzIHNvdXJjZVxuIik7CisJCQl5X2FkZHIgPSBjczAuYWRkcjsKKwkJCXV2X2FkZHIgPSBjczEuYWRkcjsKKworCQkJY2FudmFzX3cgPSAoKHdxLT5waWMuZW5jb2Rlcl93aWR0aCArIDMxKSA+PiA1KSA8PCA1OworCQkJcGljc2l6ZV95ID0gd3EtPnBpYy5lbmNvZGVyX2hlaWdodDsKKworCQkJZGF0YSA9ICh1OCopcGh5c190b192aXJ0KHlfYWRkcik7CisJCQlmaWxwID0gZmlsZV9vcGVuKCIvZGF0YS9lbmNvZGVyLnl1diIsIE9fQVBQRU5EIHwgT19SRFdSLCAwNjQ0KTsKKwkJCWlmIChmaWxwKSB7CisJCQkJZmlsZV93cml0ZShmaWxwLCAwLCBkYXRhLCBjYW52YXNfdyAqIHBpY3NpemVfeSk7CisJCQkJZmlsZV9zeW5jKGZpbHApOworCQkJCWZpbGVfY2xvc2UoZmlscCk7CisJCQl9IGVsc2UKKwkJCQlwcl9lcnIoIm9wZW4gZW5jb2Rlci55dXYgZmFpbGVkXG4iKTsKKworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgczMyIHNldF9pbnB1dF9mb3JtYXQoc3RydWN0IGVuY29kZV93cV9zICp3cSwKKwkJCSAgICBzdHJ1Y3QgZW5jb2RlX3JlcXVlc3RfcyAqcmVxdWVzdCkKK3sKKwlzMzIgcmV0ID0gMDsKKwl1OCBpZm9ybWF0ID0gTUFYX0ZSQU1FX0ZNVCwgb2Zvcm1hdCA9IE1BWF9GUkFNRV9GTVQsIHIyeV9lbiA9IDA7CisJdTMyIHBpY3NpemVfeCwgcGljc2l6ZV95LCBzcmNfYWRkcjsKKwl1MzIgY2FudmFzX3cgPSAwOworCXUzMiBpbnB1dCA9IHJlcXVlc3QtPnNyYzsKKwl1MzIgaW5wdXRfeSA9IDA7CisJdTMyIGlucHV0X3UgPSAwOworCXUzMiBpbnB1dF92ID0gMDsKKwl1OCBpZm10X2V4dHJhID0gMDsKKworCWlmICgocmVxdWVzdC0+Zm10ID09IEZNVF9SR0I1NjUpIHx8IChyZXF1ZXN0LT5mbXQgPj0gTUFYX0ZSQU1FX0ZNVCkpCisJCXJldHVybiAtMTsKKworCWlmIChkdW1wX2lucHV0KQorCQlkdW1wX3Jhd19pbnB1dCh3cSwgcmVxdWVzdCk7CisKKwlwaWNzaXplX3ggPSAoKHdxLT5waWMuZW5jb2Rlcl93aWR0aCArIDE1KSA+PiA0KSA8PCA0OworCXBpY3NpemVfeSA9ICgod3EtPnBpYy5lbmNvZGVyX2hlaWdodCArIDE1KSA+PiA0KSA8PCA0OworCW9mb3JtYXQgPSAwOworCisJaWYgKChyZXF1ZXN0LT50eXBlID09IExPQ0FMX0JVRkYpCisJCXx8IChyZXF1ZXN0LT50eXBlID09IFBIWVNJQ0FMX0JVRkYpCisJCXx8IChyZXF1ZXN0LT50eXBlID09IERNQV9CVUZGKSkgeworCQlpZiAoKHJlcXVlc3QtPnR5cGUgPT0gTE9DQUxfQlVGRikgJiYKKwkJCShyZXF1ZXN0LT5mbHVzaF9mbGFnICYgQU1WRU5DX0ZMVVNIX0ZMQUdfSU5QVVQpKQorCQkJZG1hX2ZsdXNoKHdxLT5tZW0uZGN0X2J1ZmZfc3RhcnRfYWRkciwKKwkJCQlyZXF1ZXN0LT5mcmFtZXNpemUpOworCQlpZiAocmVxdWVzdC0+dHlwZSA9PSBMT0NBTF9CVUZGKSB7CisJCQlpbnB1dCA9IHdxLT5tZW0uZGN0X2J1ZmZfc3RhcnRfYWRkcjsKKwkJCXNyY19hZGRyID0KKwkJCQl3cS0+bWVtLmRjdF9idWZmX3N0YXJ0X2FkZHI7CisJCX0gZWxzZSBpZiAocmVxdWVzdC0+dHlwZSA9PSBETUFfQlVGRikgeworCQkJaWYgKHJlcXVlc3QtPnBsYW5lX251bSA9PSAzKSB7CisJCQkJaW5wdXRfeSA9ICh1bnNpZ25lZCBsb25nKXJlcXVlc3QtPmRtYV9jZmdbMF0ucGFkZHI7CisJCQkJaW5wdXRfdSA9ICh1bnNpZ25lZCBsb25nKXJlcXVlc3QtPmRtYV9jZmdbMV0ucGFkZHI7CisJCQkJaW5wdXRfdiA9ICh1bnNpZ25lZCBsb25nKXJlcXVlc3QtPmRtYV9jZmdbMl0ucGFkZHI7CisJCQl9IGVsc2UgaWYgKHJlcXVlc3QtPnBsYW5lX251bSA9PSAyKSB7CisJCQkJaW5wdXRfeSA9ICh1bnNpZ25lZCBsb25nKXJlcXVlc3QtPmRtYV9jZmdbMF0ucGFkZHI7CisJCQkJaW5wdXRfdSA9ICh1bnNpZ25lZCBsb25nKXJlcXVlc3QtPmRtYV9jZmdbMV0ucGFkZHI7CisJCQkJaW5wdXRfdiA9IGlucHV0X3U7CisJCQl9IGVsc2UgaWYgKHJlcXVlc3QtPnBsYW5lX251bSA9PSAxKSB7CisJCQkJaW5wdXRfeSA9ICh1bnNpZ25lZCBsb25nKXJlcXVlc3QtPmRtYV9jZmdbMF0ucGFkZHI7CisJCQkJaWYgKHJlcXVlc3QtPmZtdCA9PSBGTVRfTlYyMQorCQkJCQl8fCByZXF1ZXN0LT5mbXQgPT0gRk1UX05WMTIpIHsKKwkJCQkJaW5wdXRfdSA9IGlucHV0X3kgKyBwaWNzaXplX3ggKiBwaWNzaXplX3k7CisJCQkJCWlucHV0X3YgPSBpbnB1dF91OworCQkJCX0KKwkJCQlpZiAocmVxdWVzdC0+Zm10ID09IEZNVF9ZVVY0MjApIHsKKwkJCQkJaW5wdXRfdSA9IGlucHV0X3kgKyBwaWNzaXplX3ggKiBwaWNzaXplX3k7CisJCQkJCWlucHV0X3YgPSBpbnB1dF91ICsgcGljc2l6ZV94ICogcGljc2l6ZV95ICAvIDQ7CisJCQkJfQorCQkJfQorCQkJc3JjX2FkZHIgPSBpbnB1dF95OworCQkJcGljc2l6ZV95ID0gd3EtPnBpYy5lbmNvZGVyX2hlaWdodDsKKwkJCWVuY19wcihMT0dfSU5GTywgImRtYSBhZGRyWzB4JWx4IDB4JWx4IDB4JWx4IDB4JWx4IDB4JWx4IDB4JWx4XVxuIiwKKwkJCQkodW5zaWduZWQgbG9uZylyZXF1ZXN0LT5kbWFfY2ZnWzBdLnZhZGRyLAorCQkJCSh1bnNpZ25lZCBsb25nKXJlcXVlc3QtPmRtYV9jZmdbMF0ucGFkZHIsCisJCQkJKHVuc2lnbmVkIGxvbmcpcmVxdWVzdC0+ZG1hX2NmZ1sxXS52YWRkciwKKwkJCQkodW5zaWduZWQgbG9uZylyZXF1ZXN0LT5kbWFfY2ZnWzFdLnBhZGRyLAorCQkJCSh1bnNpZ25lZCBsb25nKXJlcXVlc3QtPmRtYV9jZmdbMl0udmFkZHIsCisJCQkJKHVuc2lnbmVkIGxvbmcpcmVxdWVzdC0+ZG1hX2NmZ1syXS5wYWRkcik7CisJCX0gZWxzZSB7CisJCQlzcmNfYWRkciA9IGlucHV0OworCQkJcGljc2l6ZV95ID0gd3EtPnBpYy5lbmNvZGVyX2hlaWdodDsKKwkJfQorCQlpZiAocmVxdWVzdC0+c2NhbGVfZW5hYmxlKSB7CisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfR0UyRAorCQkJc3RydWN0IGNvbmZpZ19wYXJhX2V4X3MgZ2UyZF9jb25maWc7CisKKwkJCW1lbXNldCgmZ2UyZF9jb25maWcsIDAsCisJCQkJc2l6ZW9mKHN0cnVjdCBjb25maWdfcGFyYV9leF9zKSk7CisJCQlzY2FsZV9mcmFtZSgKKwkJCQl3cSwgcmVxdWVzdCwKKwkJCQkmZ2UyZF9jb25maWcsCisJCQkJc3JjX2FkZHIsCisJCQkJZmFsc2UpOworCQkJaWZvcm1hdCA9IDI7CisJCQlyMnlfZW4gPSAwOworCQkJaW5wdXQgPSAoKEVOQ19DQU5WQVNfT0ZGU0VUICsgNykgPDwgOCkgfAorCQkJCShFTkNfQ0FOVkFTX09GRlNFVCArIDYpOworCQkJcmV0ID0gMDsKKworCQkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDMpIHsKKwkJCQkvKgorCQkJCSAqIGZvciB0MywgYWZ0ZXIgc2NhbGluZyBiZWZvcmUgZ290byBNRkRJTiwgbmVlZCB0byBjb25maWcgY2FudmFzIHdpdGggc2NhbGVyIGJ1ZmZlcgorCQkJCSAqICovCisJCQkJZW5jX3ByKExPR19JTkZPLCAicmVjb25maWcgd2l0aCBzY2FsZXIgYnVmZmVyXG4iKTsKKwkJCQljYW52YXNfdyA9ICgod3EtPnBpYy5lbmNvZGVyX3dpZHRoICsgMzEpID4+IDUpIDw8IDU7CisJCQkJaWZvcm1hdCA9IDI7CisKKwkJCQljYW52YXNfY29uZmlnX3Byb3h5KEVOQ19DQU5WQVNfT0ZGU0VUICsgNiwKKwkJCQkJd3EtPm1lbS5zY2FsZXJfYnVmZl9zdGFydF9hZGRyLAorCQkJCQljYW52YXNfdywgcGljc2l6ZV95LAorCQkJCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCQkJCUNBTlZBU19CTEtNT0RFX0xJTkVBUik7CisJCQkJY2FudmFzX2NvbmZpZ19wcm94eShFTkNfQ0FOVkFTX09GRlNFVCArIDcsCisJCQkJCXdxLT5tZW0uc2NhbGVyX2J1ZmZfc3RhcnRfYWRkciArIGNhbnZhc193ICogcGljc2l6ZV95LAorCQkJCQljYW52YXNfdywgcGljc2l6ZV95IC8gMiwKKwkJCQkJQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJCQlDQU5WQVNfQkxLTU9ERV9MSU5FQVIpOworCisJCQkJaW5wdXQgPSAoKEVOQ19DQU5WQVNfT0ZGU0VUICsgNykgPDwgOCkgfAorCQkJCQkoRU5DX0NBTlZBU19PRkZTRVQgKyA2KTsKKwkJCX0KKworCQkJZ290byBNRkRJTjsKKyNlbHNlCisJCQllbmNfcHIoTE9HX0VSUk9SLAorCQkJCSJXYXJuaW5nOiBuZWVkIGVuYWJsZSBnZTJkIGZvciBzY2FsZSBmcmFtZSFcbiIpOworCQkJcmV0dXJuIC0xOworI2VuZGlmCisJCX0KKwkJaWYgKChyZXF1ZXN0LT5mbXQgPD0gRk1UX1lVVjQ0NF9QTEFORSkgfHwKKwkJCShyZXF1ZXN0LT5mbXQgPj0gRk1UX1lVVjQyMl8xMkJJVCkpCisJCQlyMnlfZW4gPSAwOworCQllbHNlCisJCQlyMnlfZW4gPSAxOworCisJCWlmIChyZXF1ZXN0LT5mbXQgPj0gRk1UX1lVVjQyMl8xMkJJVCkgeworCQkJaWZvcm1hdCA9IDc7CisJCQlpZm10X2V4dHJhID0gcmVxdWVzdC0+Zm10IC0gRk1UX1lVVjQyMl8xMkJJVDsKKwkJCWlmIChyZXF1ZXN0LT5mbXQgPT0gRk1UX1lVVjQyMl8xMkJJVCkKKwkJCQljYW52YXNfdyA9IHBpY3NpemVfeCAqIDI0IC8gODsKKwkJCWVsc2UgaWYgKHJlcXVlc3QtPmZtdCA9PSBGTVRfWVVWNDQ0XzEwQklUKQorCQkJCWNhbnZhc193ID0gcGljc2l6ZV94ICogMzIgLyA4OworCQkJZWxzZQorCQkJCWNhbnZhc193ID0gKHBpY3NpemVfeCAqIDIwICsgNykgLyA4OworCQkJY2FudmFzX3cgPSAoKGNhbnZhc193ICsgMzEpID4+IDUpIDw8IDU7CisJCQljYW52YXNfY29uZmlnX3Byb3h5KEVOQ19DQU5WQVNfT0ZGU0VUICsgNiwKKwkJCQlpbnB1dCwKKwkJCQljYW52YXNfdywgcGljc2l6ZV95LAorCQkJCUNBTlZBU19BRERSX05PV1JBUCwKKwkJCQlDQU5WQVNfQkxLTU9ERV9MSU5FQVIpOworCQkJaW5wdXQgPSBFTkNfQ0FOVkFTX09GRlNFVCArIDY7CisJCQlpbnB1dCA9IGlucHV0ICYgMHhmZjsKKwkJfSBlbHNlIGlmIChyZXF1ZXN0LT5mbXQgPT0gRk1UX1lVVjQyMl9TSU5HTEUpCisJCQlpZm9ybWF0ID0gMTA7CisJCWVsc2UgaWYgKChyZXF1ZXN0LT5mbXQgPT0gRk1UX1lVVjQ0NF9TSU5HTEUpCisJCQl8fCAocmVxdWVzdC0+Zm10ID09IEZNVF9SR0I4ODgpKSB7CisJCQlpZm9ybWF0ID0gMTsKKwkJCWlmIChyZXF1ZXN0LT5mbXQgPT0gRk1UX1JHQjg4OCkKKwkJCQlyMnlfZW4gPSAxOworCQkJY2FudmFzX3cgPSAgcGljc2l6ZV94ICogMzsKKwkJCWNhbnZhc193ID0gKChjYW52YXNfdyArIDMxKSA+PiA1KSA8PCA1OworCQkJY2FudmFzX2NvbmZpZ19wcm94eShFTkNfQ0FOVkFTX09GRlNFVCArIDYsCisJCQkJaW5wdXQsCisJCQkJY2FudmFzX3csIHBpY3NpemVfeSwKKwkJCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCQkJQ0FOVkFTX0JMS01PREVfTElORUFSKTsKKwkJCWlucHV0ID0gRU5DX0NBTlZBU19PRkZTRVQgKyA2OworCQl9IGVsc2UgaWYgKChyZXF1ZXN0LT5mbXQgPT0gRk1UX05WMjEpCisJCQl8fCAocmVxdWVzdC0+Zm10ID09IEZNVF9OVjEyKSkgeworCQkJY2FudmFzX3cgPSAoKHdxLT5waWMuZW5jb2Rlcl93aWR0aCArIDMxKSA+PiA1KSA8PCA1OworCQkJaWZvcm1hdCA9IChyZXF1ZXN0LT5mbXQgPT0gRk1UX05WMjEpID8gMiA6IDM7CisJCQlpZiAocmVxdWVzdC0+dHlwZSA9PSBETUFfQlVGRikgeworCQkJCWNhbnZhc19jb25maWdfcHJveHkoRU5DX0NBTlZBU19PRkZTRVQgKyA2LAorCQkJCQlpbnB1dF95LAorCQkJCQljYW52YXNfdywgcGljc2l6ZV95LAorCQkJCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCQkJCUNBTlZBU19CTEtNT0RFX0xJTkVBUik7CisJCQkJY2FudmFzX2NvbmZpZ19wcm94eShFTkNfQ0FOVkFTX09GRlNFVCArIDcsCisJCQkJCWlucHV0X3UsCisJCQkJCWNhbnZhc193LCBwaWNzaXplX3kgLyAyLAorCQkJCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCQkJCUNBTlZBU19CTEtNT0RFX0xJTkVBUik7CisJCQl9IGVsc2UgeworCQkJCWNhbnZhc19jb25maWdfcHJveHkoRU5DX0NBTlZBU19PRkZTRVQgKyA2LAorCQkJCQlpbnB1dCwKKwkJCQkJY2FudmFzX3csIHBpY3NpemVfeSwKKwkJCQkJQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJCQlDQU5WQVNfQkxLTU9ERV9MSU5FQVIpOworCQkJCWNhbnZhc19jb25maWdfcHJveHkoRU5DX0NBTlZBU19PRkZTRVQgKyA3LAorCQkJCQlpbnB1dCArIGNhbnZhc193ICogcGljc2l6ZV95LAorCQkJCQljYW52YXNfdywgcGljc2l6ZV95IC8gMiwKKwkJCQkJQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJCQlDQU5WQVNfQkxLTU9ERV9MSU5FQVIpOworCQkJfQorCQkJaW5wdXQgPSAoKEVOQ19DQU5WQVNfT0ZGU0VUICsgNykgPDwgOCkgfAorCQkJCShFTkNfQ0FOVkFTX09GRlNFVCArIDYpOworCQl9IGVsc2UgaWYgKHJlcXVlc3QtPmZtdCA9PSBGTVRfWVVWNDIwKSB7CisJCQlpZm9ybWF0ID0gNDsKKwkJCWNhbnZhc193ID0gKCh3cS0+cGljLmVuY29kZXJfd2lkdGggKyA2MykgPj4gNikgPDwgNjsKKwkJCWlmIChyZXF1ZXN0LT50eXBlID09IERNQV9CVUZGKSB7CisJCQkJY2FudmFzX2NvbmZpZ19wcm94eShFTkNfQ0FOVkFTX09GRlNFVCArIDYsCisJCQkJCWlucHV0X3ksCisJCQkJCWNhbnZhc193LCBwaWNzaXplX3ksCisJCQkJCUNBTlZBU19BRERSX05PV1JBUCwKKwkJCQkJQ0FOVkFTX0JMS01PREVfTElORUFSKTsKKwkJCQljYW52YXNfY29uZmlnX3Byb3h5KEVOQ19DQU5WQVNfT0ZGU0VUICsgNywKKwkJCQkJaW5wdXRfdSwKKwkJCQkJY2FudmFzX3cgLyAyLCBwaWNzaXplX3kgLyAyLAorCQkJCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCQkJCUNBTlZBU19CTEtNT0RFX0xJTkVBUik7CisJCQkJY2FudmFzX2NvbmZpZ19wcm94eShFTkNfQ0FOVkFTX09GRlNFVCArIDgsCisJCQkJCWlucHV0X3YsCisJCQkJCWNhbnZhc193IC8gMiwgcGljc2l6ZV95IC8gMiwKKwkJCQkJQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJCQlDQU5WQVNfQkxLTU9ERV9MSU5FQVIpOworCQkJfSBlbHNlIHsKKwkJCQljYW52YXNfY29uZmlnX3Byb3h5KEVOQ19DQU5WQVNfT0ZGU0VUICsgNiwKKwkJCQkJaW5wdXQsCisJCQkJCWNhbnZhc193LCBwaWNzaXplX3ksCisJCQkJCUNBTlZBU19BRERSX05PV1JBUCwKKwkJCQkJQ0FOVkFTX0JMS01PREVfTElORUFSKTsKKwkJCQljYW52YXNfY29uZmlnX3Byb3h5KEVOQ19DQU5WQVNfT0ZGU0VUICsgNywKKwkJCQkJaW5wdXQgKyBjYW52YXNfdyAqIHBpY3NpemVfeSwKKwkJCQkJY2FudmFzX3cgLyAyLCBwaWNzaXplX3kgLyAyLAorCQkJCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCQkJCUNBTlZBU19CTEtNT0RFX0xJTkVBUik7CisJCQkJY2FudmFzX2NvbmZpZ19wcm94eShFTkNfQ0FOVkFTX09GRlNFVCArIDgsCisJCQkJCWlucHV0ICsgY2FudmFzX3cgKiBwaWNzaXplX3kgKiA1IC8gNCwKKwkJCQkJY2FudmFzX3cgLyAyLCBwaWNzaXplX3kgLyAyLAorCQkJCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCQkJCUNBTlZBU19CTEtNT0RFX0xJTkVBUik7CisKKwkJCX0KKwkJCWlucHV0ID0gKChFTkNfQ0FOVkFTX09GRlNFVCArIDgpIDw8IDE2KSB8CisJCQkJKChFTkNfQ0FOVkFTX09GRlNFVCArIDcpIDw8IDgpIHwKKwkJCQkoRU5DX0NBTlZBU19PRkZTRVQgKyA2KTsKKwkJfSBlbHNlIGlmICgocmVxdWVzdC0+Zm10ID09IEZNVF9ZVVY0NDRfUExBTkUpCisJCQl8fCAocmVxdWVzdC0+Zm10ID09IEZNVF9SR0I4ODhfUExBTkUpKSB7CisJCQlpZiAocmVxdWVzdC0+Zm10ID09IEZNVF9SR0I4ODhfUExBTkUpCisJCQkJcjJ5X2VuID0gMTsKKwkJCWlmb3JtYXQgPSA1OworCQkJY2FudmFzX3cgPSAoKHdxLT5waWMuZW5jb2Rlcl93aWR0aCArIDMxKSA+PiA1KSA8PCA1OworCQkJY2FudmFzX2NvbmZpZ19wcm94eShFTkNfQ0FOVkFTX09GRlNFVCArIDYsCisJCQkJaW5wdXQsCisJCQkJY2FudmFzX3csIHBpY3NpemVfeSwKKwkJCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCQkJQ0FOVkFTX0JMS01PREVfTElORUFSKTsKKwkJCWNhbnZhc19jb25maWdfcHJveHkoRU5DX0NBTlZBU19PRkZTRVQgKyA3LAorCQkJCWlucHV0ICsgY2FudmFzX3cgKiBwaWNzaXplX3ksCisJCQkJY2FudmFzX3csIHBpY3NpemVfeSwKKwkJCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCQkJQ0FOVkFTX0JMS01PREVfTElORUFSKTsKKwkJCWNhbnZhc19jb25maWdfcHJveHkoRU5DX0NBTlZBU19PRkZTRVQgKyA4LAorCQkJCWlucHV0ICsgY2FudmFzX3cgKiBwaWNzaXplX3kgKiAyLAorCQkJCWNhbnZhc193LCBwaWNzaXplX3ksCisJCQkJQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJCUNBTlZBU19CTEtNT0RFX0xJTkVBUik7CisJCQlpbnB1dCA9ICgoRU5DX0NBTlZBU19PRkZTRVQgKyA4KSA8PCAxNikgfAorCQkJCSgoRU5DX0NBTlZBU19PRkZTRVQgKyA3KSA8PCA4KSB8CisJCQkJKEVOQ19DQU5WQVNfT0ZGU0VUICsgNik7CisJCX0gZWxzZSBpZiAocmVxdWVzdC0+Zm10ID09IEZNVF9SR0JBODg4OCkgeworCQkJcjJ5X2VuID0gMTsKKwkJCWlmb3JtYXQgPSAxMjsKKwkJfQorCQlyZXQgPSAwOworCX0gZWxzZSBpZiAocmVxdWVzdC0+dHlwZSA9PSBDQU5WQVNfQlVGRikgeworCisJCXIyeV9lbiA9IDA7CisJCWlmIChyZXF1ZXN0LT5zY2FsZV9lbmFibGUpIHsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9HRTJECisJCQlzdHJ1Y3QgY29uZmlnX3BhcmFfZXhfcyBnZTJkX2NvbmZpZzsKKwkJCW1lbXNldCgmZ2UyZF9jb25maWcsIDAsCisJCQkJc2l6ZW9mKHN0cnVjdCBjb25maWdfcGFyYV9leF9zKSk7CisJCQlzY2FsZV9mcmFtZSgKKwkJCQl3cSwgcmVxdWVzdCwKKwkJCQkmZ2UyZF9jb25maWcsCisJCQkJaW5wdXQsIHRydWUpOworCQkJaWZvcm1hdCA9IDI7CisJCQlyMnlfZW4gPSAwOworCQkJaW5wdXQgPSAoKEVOQ19DQU5WQVNfT0ZGU0VUICsgNykgPDwgOCkgfAorCQkJCShFTkNfQ0FOVkFTX09GRlNFVCArIDYpOworCQkJcmV0ID0gMDsKKworCQkJLyoKKwkJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1QzKSB7CisJCQkJcHJfaW5mbygicmVjb25maWcgd2l0aCBzY2FsZXIgYnVmZmVyXG4iKTsKKwkJCQljYW52YXNfdyA9ICgod3EtPnBpYy5lbmNvZGVyX3dpZHRoICsgMzEpID4+IDUpIDw8IDU7CisJCQkJaWZvcm1hdCA9IDI7CisKKwkJCQljYW52YXNfY29uZmlnX3Byb3h5KEVOQ19DQU5WQVNfT0ZGU0VUICsgNiwKKwkJCQkJd3EtPm1lbS5zY2FsZXJfYnVmZl9zdGFydF9hZGRyLAorCQkJCQljYW52YXNfdywgcGljc2l6ZV95LAorCQkJCQlDQU5WQVNfQUREUl9OT1dSQVAsCisJCQkJCUNBTlZBU19CTEtNT0RFX0xJTkVBUik7CisJCQkJY2FudmFzX2NvbmZpZ19wcm94eShFTkNfQ0FOVkFTX09GRlNFVCArIDcsCisJCQkJCXdxLT5tZW0uc2NhbGVyX2J1ZmZfc3RhcnRfYWRkciArIGNhbnZhc193ICogcGljc2l6ZV95LAorCQkJCQljYW52YXNfdywgcGljc2l6ZV95IC8gMiwKKwkJCQkJQ0FOVkFTX0FERFJfTk9XUkFQLAorCQkJCQlDQU5WQVNfQkxLTU9ERV9MSU5FQVIpOworCisJCQkJaW5wdXQgPSAoKEVOQ19DQU5WQVNfT0ZGU0VUICsgNykgPDwgOCkgfAorCQkJCQkoRU5DX0NBTlZBU19PRkZTRVQgKyA2KTsKKwkJCX0KKwkJCSovCisKKwkJCWdvdG8gTUZESU47CisjZWxzZQorCQkJZW5jX3ByKExPR19FUlJPUiwKKwkJCQkiV2FybmluZzogbmVlZCBlbmFibGUgZ2UyZCBmb3Igc2NhbGUgZnJhbWUhXG4iKTsKKwkJCXJldHVybiAtMTsKKyNlbmRpZgorCQl9CisJCS8vcHJfZXJyKCJyZXF1ZXN0LT50eXBlPSV1XG4iLCByZXF1ZXN0LT50eXBlKTsKKwkJaWYgKHJlcXVlc3QtPmZtdCA9PSBGTVRfWVVWNDIyX1NJTkdMRSkgeworCQkJaWZvcm1hdCA9IDA7CisJCQlpbnB1dCA9IGlucHV0ICYgMHhmZjsKKwkJfSBlbHNlIGlmIChyZXF1ZXN0LT5mbXQgPT0gRk1UX1lVVjQ0NF9TSU5HTEUpIHsKKwkJCWlmb3JtYXQgPSAxOworCQkJaW5wdXQgPSBpbnB1dCAmIDB4ZmY7CisJCX0gZWxzZSBpZiAoKHJlcXVlc3QtPmZtdCA9PSBGTVRfTlYyMSkKKwkJCXx8IChyZXF1ZXN0LT5mbXQgPT0gRk1UX05WMTIpKSB7CisJCQlpZm9ybWF0ID0gKHJlcXVlc3QtPmZtdCA9PSBGTVRfTlYyMSkgPyAyIDogMzsKKwkJCWlucHV0ID0gaW5wdXQgJiAweGZmZmY7CisKKwkJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1QzKSB7CisJCQkJc3RydWN0IGNhbnZhc19zIGNzMCwgY3MxOy8vLCBjczIKKwkJCQl1MzIgeV9hZGRyLCB1dl9hZGRyLCBjYW52YXNfdywgcGljc2l6ZV95OworCQkJCXU4IGlmb3JtYXQgPSBNQVhfRlJBTUVfRk1UOworCQkJCWNhbnZhc19yZWFkKGlucHV0ICYgMHhmZiwgJmNzMCk7CisJCQkJY2FudmFzX3JlYWQoKGlucHV0ID4+IDgpICYgMHhmZiwgJmNzMSk7CisJCQkJLy9wcl9lcnIoInQzIGNhbnZhcyBzb3VyY2UgaW5wdXQgcmVjb25maWdcbiIpOworCQkJCXlfYWRkciA9IGNzMC5hZGRyOworCQkJCXV2X2FkZHIgPSBjczEuYWRkcjsKKworCQkJCWNhbnZhc193ID0gKCh3cS0+cGljLmVuY29kZXJfd2lkdGggKyAzMSkgPj4gNSkgPDwgNTsKKwkJCQlwaWNzaXplX3kgPSB3cS0+cGljLmVuY29kZXJfaGVpZ2h0OworCQkJCWlmb3JtYXQgPSAocmVxdWVzdC0+Zm10ID09IEZNVF9OVjIxKSA/IDIgOiAzOworCisJCQkJY2FudmFzX2NvbmZpZ19wcm94eSgKKwkJCQkJRU5DX0NBTlZBU19PRkZTRVQgKyA2LAorCQkJCQl5X2FkZHIsCisJCQkJCWNhbnZhc193LAorCQkJCQlwaWNzaXplX3ksCisJCQkJCUNBTlZBU19BRERSX05PV1JBUCwKKwkJCQkJQ0FOVkFTX0JMS01PREVfTElORUFSKTsKKworCQkJCWNhbnZhc19jb25maWdfcHJveHkoCisJCQkJCUVOQ19DQU5WQVNfT0ZGU0VUICsgNywKKwkJCQkJdXZfYWRkciwKKwkJCQkJY2FudmFzX3csCisJCQkJCXBpY3NpemVfeSAvIDIsCisJCQkJCUNBTlZBU19BRERSX05PV1JBUCwKKwkJCQkJQ0FOVkFTX0JMS01PREVfTElORUFSKTsKKworCQkJCWlucHV0ID0gKChFTkNfQ0FOVkFTX09GRlNFVCArIDcpIDw8IDgpIHwKKwkJCQkJKEVOQ19DQU5WQVNfT0ZGU0VUICsgNik7CisJCQl9CisJCX0gZWxzZSBpZiAocmVxdWVzdC0+Zm10ID09IEZNVF9ZVVY0MjApIHsKKwkJCWlmb3JtYXQgPSA0OworCQkJaW5wdXQgPSBpbnB1dCAmIDB4ZmZmZmZmOworCQl9IGVsc2UgaWYgKChyZXF1ZXN0LT5mbXQgPT0gRk1UX1lVVjQ0NF9QTEFORSkKKwkJCXx8IChyZXF1ZXN0LT5mbXQgPT0gRk1UX1JHQjg4OF9QTEFORSkpIHsKKwkJCWlmIChyZXF1ZXN0LT5mbXQgPT0gRk1UX1JHQjg4OF9QTEFORSkKKwkJCQlyMnlfZW4gPSAxOworCQkJaWZvcm1hdCA9IDU7CisJCQlpbnB1dCA9IGlucHV0ICYgMHhmZmZmZmY7CisJCX0gZWxzZSBpZiAoKHJlcXVlc3QtPmZtdCA9PSBGTVRfWVVWNDIyXzEyQklUKQorCQkJfHwgKHJlcXVlc3QtPmZtdCA9PSBGTVRfWVVWNDQ0XzEwQklUKQorCQkJfHwgKHJlcXVlc3QtPmZtdCA9PSBGTVRfWVVWNDIyXzEwQklUKSkgeworCQkJaWZvcm1hdCA9IDc7CisJCQlpZm10X2V4dHJhID0gcmVxdWVzdC0+Zm10IC0gRk1UX1lVVjQyMl8xMkJJVDsKKwkJCWlucHV0ID0gaW5wdXQgJiAweGZmOworCQl9IGVsc2UKKwkJCXJldCA9IC0xOworCX0KKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9HRTJECitNRkRJTjoKKyNlbmRpZgorCWlmIChyZXQgPT0gMCkKKwkJbWZkaW5fYmFzaWMoaW5wdXQsIGlmb3JtYXQsIG9mb3JtYXQsCisJCQlwaWNzaXplX3gsIHBpY3NpemVfeSwgcjJ5X2VuLAorCQkJcmVxdWVzdC0+bnJfbW9kZSwgaWZtdF9leHRyYSk7CisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIEgyNjRfRU5DX0NCUgorc3RhdGljIHZvaWQgQ29udmVydFRhYmxlMlJpc2Modm9pZCAqdGFibGUsIHUzMiBsZW4pCit7CisJdTMyIGksIGo7CisJdTE2IHRlbXA7CisJdTE2ICp0YmwgPSAodTE2ICopdGFibGU7CisKKwlpZiAoKGxlbiA8IDgpIHx8IChsZW4gJSA4KSB8fCAoIXRhYmxlKSkgeworCQllbmNfcHIoTE9HX0VSUk9SLCAiQ29udmVydFRhYmxlMlJpc2MgdGJsICVwLCBsZW4gJWQgZXJyb3JcbiIsCisJCQl0YWJsZSwgbGVuKTsKKwkJcmV0dXJuOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgbGVuIC8gODsgaSsrKSB7CisJCWogPSBpIDw8IDI7CisJCXRlbXAgPSB0Ymxbal07CisJCXRibFtqXSA9IHRibFtqICsgM107CisJCXRibFtqICsgM10gPSB0ZW1wOworCisJCXRlbXAgPSB0YmxbaiArIDFdOworCQl0YmxbaiArIDFdID0gdGJsW2ogKyAyXTsKKwkJdGJsW2ogKyAyXSA9IHRlbXA7CisJfQorCit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgYXZjX3Byb3RfaW5pdChzdHJ1Y3QgZW5jb2RlX3dxX3MgKndxLAorCXN0cnVjdCBlbmNvZGVfcmVxdWVzdF9zICpyZXF1ZXN0LCB1MzIgcXVhbnQsIGJvb2wgSURSKQoreworCXUzMiBkYXRhMzI7CisJdTMyIHBpY193aWR0aCwgcGljX2hlaWdodDsKKwl1MzIgcGljX21iX25yOworCXUzMiBwaWNfbWJ4LCBwaWNfbWJ5OworCXUzMiBpX3BpY19xcCwgcF9waWNfcXA7CisJdTMyIGlfcGljX3FwX2MsIHBfcGljX3FwX2M7CisJdTMyIHBpY193aWR0aF9pbl9tYjsKKwl1MzIgc2xpY2VfcXA7CisKKwlwaWNfd2lkdGggID0gd3EtPnBpYy5lbmNvZGVyX3dpZHRoOworCXBpY19oZWlnaHQgPSB3cS0+cGljLmVuY29kZXJfaGVpZ2h0OworCXBpY19tYl9uciAgPSAwOworCXBpY19tYnggICAgPSAwOworCXBpY19tYnkgICAgPSAwOworCWlfcGljX3FwICAgPSBxdWFudDsKKwlwX3BpY19xcCAgID0gcXVhbnQ7CisKKwlwaWNfd2lkdGhfaW5fbWIgPSAocGljX3dpZHRoICsgMTUpIC8gMTY7CisJV1JJVEVfSFJFRyhIQ09ERUNfSERFQ19NQ19PTUVNX0FVVE8sCisJCSgxIDw8IDMxKSB8IC8qIHVzZV9vbWVtX21iX3h5ICovCisJCSgocGljX3dpZHRoX2luX21iIC0gMSkgPDwgMTYpKTsgLyogb21lbV9tYXhfbWJfeCAqLworCisJV1JJVEVfSFJFRyhIQ09ERUNfVkxDX0FEVl9DT05GSUcsCisJCS8qIGVhcmx5X21peF9tY19oY21kIC0tIHdpbGwgZW5hYmxlIGluIFAgUGljdHVyZSAqLworCQkoMCA8PCAxMCkgfAorCQkoMSA8PCA5KSB8IC8qIHVwZGF0ZV90b3BfbGVmdF9taXggKi8KKwkJKDEgPDwgOCkgfCAvKiBwX3RvcF9sZWZ0X21peCAqLworCQkvKiBtdl9jYWxfbWl4ZWRfdHlwZSAtLSB3aWxsIGVuYWJsZSBpbiBQIFBpY3R1cmUgKi8KKwkJKDAgPDwgNykgfAorCQkvKiBtY19oY21kX21peGVkX3R5cGUgLS0gd2lsbCBlbmFibGUgaW4gUCBQaWN0dXJlICovCisJCSgwIDw8IDYpIHwKKwkJKDEgPDwgNSkgfCAvKiB1c2Vfc2VwYXJhdGVfaW50X2NvbnRyb2wgKi8KKwkJKDEgPDwgNCkgfCAvKiBoY21kX2ludHJhX3VzZV9xX2luZm8gKi8KKwkJKDEgPDwgMykgfCAvKiBoY21kX2xlZnRfdXNlX3ByZXZfaW5mbyAqLworCQkoMSA8PCAyKSB8IC8qIGhjbWRfdXNlX3FfaW5mbyAqLworCQkoMSA8PCAxKSB8IC8qIHVzZV9xX2RlbHRhX3F1YW50ICovCisJCS8qIGRldGVjdF9JMTZfZnJvbV9JNCB1c2UgcWRjdCBkZXRlY3RlZCBtYl90eXBlICovCisJCSgwIDw8IDApKTsKKworCVdSSVRFX0hSRUcoSENPREVDX1FEQ1RfQURWX0NPTkZJRywKKwkJKDEgPDwgMjkpIHwgLyogbWJfaW5mb19sYXRjaF9ub19JMTZfcHJlZF9tb2RlICovCisJCSgxIDw8IDI4KSB8IC8qIGllX2RtYV9tYnh5X3VzZV9pX3ByZWQgKi8KKwkJKDEgPDwgMjcpIHwgLyogaWVfZG1hX3JlYWRfd3JpdGVfdXNlX2lwX2lkeCAqLworCQkoMSA8PCAyNikgfCAvKiBpZV9zdGFydF91c2VfdG9wX2RtYV9jb3VudCAqLworCQkoMSA8PCAyNSkgfCAvKiBpX3ByZWRfdG9wX2RtYV9yZF9tYmJvdCAqLworCQkoMSA8PCAyNCkgfCAvKiBpX3ByZWRfdG9wX2RtYV93cl9kaXNhYmxlICovCisJCS8qIGlfcHJlZF9taXggLS0gd2lsbCBlbmFibGUgaW4gUCBQaWN0dXJlICovCisJCSgwIDw8IDIzKSB8CisJCSgxIDw8IDIyKSB8IC8qIG1lX2FiX3JkX3doZW5faW50cmFfaW5fcCAqLworCQkoMSA8PCAyMSkgfCAvKiBmb3JjZV9tYl9za2lwX3J1bl93aGVuX2ludHJhICovCisJCS8qIG1jX291dF9taXhlZF90eXBlIC0tIHdpbGwgZW5hYmxlIGluIFAgUGljdHVyZSAqLworCQkoMCA8PCAyMCkgfAorCQkoMSA8PCAxOSkgfCAvKiBpZV9zdGFydF93aGVuX3F1YW50X25vdF9mdWxsICovCisJCSgxIDw8IDE4KSB8IC8qIG1iX2luZm9fc3RhdGVfbWl4ICovCisJCS8qIG1iX3R5cGVfdXNlX21peF9yZXN1bHQgLS0gd2lsbCBlbmFibGUgaW4gUCBQaWN0dXJlICovCisJCSgwIDw8IDE3KSB8CisJCS8qIG1lX2NiX2llX3JlYWRfZW5hYmxlIC0tIHdpbGwgZW5hYmxlIGluIFAgUGljdHVyZSAqLworCQkoMCA8PCAxNikgfAorCQkvKiBpZV9jdXJfZGF0YV9mcm9tX21lIC0tIHdpbGwgZW5hYmxlIGluIFAgUGljdHVyZSAqLworCQkoMCA8PCAxNSkgfAorCQkoMSA8PCAxNCkgfCAvKiByZW1fcGVyX3VzZV90YWJsZSAqLworCQkoMCA8PCAxMykgfCAvKiBxX2xhdGNoX2ludF9lbmFibGUgKi8KKwkJKDEgPDwgMTIpIHwgLyogcV91c2VfdGFibGUgKi8KKwkJKDAgPDwgMTEpIHwgLyogcV9zdGFydF93YWl0ICovCisJCSgxIDw8IDEwKSB8IC8qIExVTUFfMTZfTEVGVF91c2VfY3VyICovCisJCSgxIDw8IDkpIHwgLyogRENfMTZfTEVGVF9TVU1fdXNlX2N1ciAqLworCQkoMSA8PCA4KSB8IC8qIGNfcmVmX2llX3NlbF9jdXIgKi8KKwkJKDAgPDwgNykgfCAvKiBjX2lwcmVkX3BlcmZlY3RfbW9kZSAqLworCQkoMSA8PCA2KSB8IC8qIHJlZl9pZV91bF9zZWwgKi8KKwkJKDEgPDwgNSkgfCAvKiBtYl90eXBlX3VzZV9pZV9yZXN1bHQgKi8KKwkJKDEgPDwgNCkgfCAvKiBkZXRlY3RfSTE2X2Zyb21fSTQgKi8KKwkJKDEgPDwgMykgfCAvKiBpZV9ub3Rfd2FpdF9yZWZfYnVzeSAqLworCQkoMSA8PCAyKSB8IC8qIGllX0kxNl9lbmFibGUgKi8KKwkJKDMgPDwgMCkpOyAvKiBpZV9kb25lX3NlbCAgLy8gZmFzdGVzdCB3aGVuIHdhaXRpbmcgKi8KKworCWlmIChyZXF1ZXN0ICE9IE5VTEwpIHsKKwkJV1JJVEVfSFJFRyhIQ09ERUNfSUVfV0VJR0hULAorCQkJKHJlcXVlc3QtPmkxNl93ZWlnaHQgPDwgMTYpIHwKKwkJCShyZXF1ZXN0LT5pNF93ZWlnaHQgPDwgMCkpOworCQlXUklURV9IUkVHKEhDT0RFQ19NRV9XRUlHSFQsCisJCQkocmVxdWVzdC0+bWVfd2VpZ2h0IDw8IDApKTsKKwkJV1JJVEVfSFJFRyhIQ09ERUNfU0FEX0NPTlRST0xfMCwKKwkJCS8qIGllX3NhZF9vZmZzZXRfSTE2ICovCisJCQkocmVxdWVzdC0+aTE2X3dlaWdodCA8PCAxNikgfAorCQkJLyogaWVfc2FkX29mZnNldF9JNCAqLworCQkJKHJlcXVlc3QtPmk0X3dlaWdodCA8PCAwKSk7CisJCVdSSVRFX0hSRUcoSENPREVDX1NBRF9DT05UUk9MXzEsCisJCQkvKiBpZV9zYWRfc2hpZnRfSTE2ICovCisJCQkoSUVfU0FEX1NISUZUX0kxNiA8PCAyNCkgfAorCQkJLyogaWVfc2FkX3NoaWZ0X0k0ICovCisJCQkoSUVfU0FEX1NISUZUX0k0IDw8IDIwKSB8CisJCQkvKiBtZV9zYWRfc2hpZnRfSU5URVIgKi8KKwkJCShNRV9TQURfU0hJRlRfSU5URVIgPDwgMTYpIHwKKwkJCS8qIG1lX3NhZF9vZmZzZXRfSU5URVIgKi8KKwkJCShyZXF1ZXN0LT5tZV93ZWlnaHQgPDwgMCkpOworCQl3cS0+bWVfd2VpZ2h0ID0gcmVxdWVzdC0+bWVfd2VpZ2h0OworCQl3cS0+aTRfd2VpZ2h0ID0gcmVxdWVzdC0+aTRfd2VpZ2h0OworCQl3cS0+aTE2X3dlaWdodCA9IHJlcXVlc3QtPmkxNl93ZWlnaHQ7CisJfSBlbHNlIHsKKwkJV1JJVEVfSFJFRyhIQ09ERUNfSUVfV0VJR0hULAorCQkJKEkxNk1CX1dFSUdIVF9PRkZTRVQgPDwgMTYpIHwKKwkJCShJNE1CX1dFSUdIVF9PRkZTRVQgPDwgMCkpOworCQlXUklURV9IUkVHKEhDT0RFQ19NRV9XRUlHSFQsCisJCQkoTUVfV0VJR0hUX09GRlNFVCA8PCAwKSk7CisJCVdSSVRFX0hSRUcoSENPREVDX1NBRF9DT05UUk9MXzAsCisJCQkvKiBpZV9zYWRfb2Zmc2V0X0kxNiAqLworCQkJKEkxNk1CX1dFSUdIVF9PRkZTRVQgPDwgMTYpIHwKKwkJCS8qIGllX3NhZF9vZmZzZXRfSTQgKi8KKwkJCShJNE1CX1dFSUdIVF9PRkZTRVQgPDwgMCkpOworCQlXUklURV9IUkVHKEhDT0RFQ19TQURfQ09OVFJPTF8xLAorCQkJLyogaWVfc2FkX3NoaWZ0X0kxNiAqLworCQkJKElFX1NBRF9TSElGVF9JMTYgPDwgMjQpIHwKKwkJCS8qIGllX3NhZF9zaGlmdF9JNCAqLworCQkJKElFX1NBRF9TSElGVF9JNCA8PCAyMCkgfAorCQkJLyogbWVfc2FkX3NoaWZ0X0lOVEVSICovCisJCQkoTUVfU0FEX1NISUZUX0lOVEVSIDw8IDE2KSB8CisJCQkvKiBtZV9zYWRfb2Zmc2V0X0lOVEVSICovCisJCQkoTUVfV0VJR0hUX09GRlNFVCA8PCAwKSk7CisJfQorCisJV1JJVEVfSFJFRyhIQ09ERUNfQURWX01WX0NUTDAsCisJCShBRFZfTVZfTEFSR0VfMTZ4OCA8PCAzMSkgfAorCQkoQURWX01WX0xBUkdFXzh4MTYgPDwgMzApIHwKKwkJKEFEVl9NVl84eDhfV0VJR0hUIDw8IDE2KSB8ICAgLyogYWR2X212Xzh4OF93ZWlnaHQgKi8KKwkJLyogYWR2X212XzR4NHg0X3dlaWdodCBzaG91bGQgYmUgc2V0IGJpZ2dlciAqLworCQkoQURWX01WXzR4NHg0X1dFSUdIVCA8PCAwKSk7CisJV1JJVEVfSFJFRyhIQ09ERUNfQURWX01WX0NUTDEsCisJCS8qIGFkdl9tdl8xNngxNl93ZWlnaHQgKi8KKwkJKEFEVl9NVl8xNngxNl9XRUlHSFQgPDwgMTYpIHwKKwkJKEFEVl9NVl9MQVJHRV8xNngxNiA8PCAxNSkgfAorCQkoQURWX01WXzE2XzhfV0VJR0hUIDw8IDApKTsgIC8qIGFkdl9tdl8xNl84X3dlaWdodCAqLworCisJaGNvZGVjX3Byb2dfcXRibCh3cSk7CisJaWYgKElEUikgeworCQlpX3BpY19xcCA9CisJCQl3cS0+cXVhbnRfdGJsX2k0WzBdICYgMHhmZjsKKwkJaV9waWNfcXAgKz0KKwkJCXdxLT5xdWFudF90YmxfaTE2WzBdICYgMHhmZjsKKwkJaV9waWNfcXAgLz0gMjsKKwkJcF9waWNfcXAgPSBpX3BpY19xcDsKKwl9IGVsc2UgeworCQlpX3BpY19xcCA9CisJCQl3cS0+cXVhbnRfdGJsX2k0WzBdICYgMHhmZjsKKwkJaV9waWNfcXAgKz0KKwkJCXdxLT5xdWFudF90YmxfaTE2WzBdICYgMHhmZjsKKwkJcF9waWNfcXAgPSB3cS0+cXVhbnRfdGJsX21lWzBdICYgMHhmZjsKKwkJc2xpY2VfcXAgPSAoaV9waWNfcXAgKyBwX3BpY19xcCkgLyAzOworCQlpX3BpY19xcCA9IHNsaWNlX3FwOworCQlwX3BpY19xcCA9IGlfcGljX3FwOworCX0KKyNpZmRlZiBIMjY0X0VOQ19DQlIKKwlpZiAoZ2V0X2NwdV90eXBlKCkgPj0gTUVTT05fQ1BVX01BSk9SX0lEX0dYVFZCQikgeworCQlkYXRhMzIgPSBSRUFEX0hSRUcoSENPREVDX1NBRF9DT05UUk9MXzEpOworCQlkYXRhMzIgPSBkYXRhMzIgJiAweGZmZmY7IC8qIHJlbW92ZSBzYWQgc2hpZnQgKi8KKwkJV1JJVEVfSFJFRyhIQ09ERUNfU0FEX0NPTlRST0xfMSwgZGF0YTMyKTsKKwkJV1JJVEVfSFJFRyhIMjY0X0VOQ19DQlJfVEFCTEVfQUREUiwKKwkJCXdxLT5tZW0uY2JyX2luZm9fZGRyX3N0YXJ0X2FkZHIpOworCQlXUklURV9IUkVHKEgyNjRfRU5DX0NCUl9NQl9TSVpFX0FERFIsCisJCQl3cS0+bWVtLmNicl9pbmZvX2Rkcl9zdGFydF9hZGRyCisJCQkrIENCUl9UQUJMRV9TSVpFKTsKKwkJV1JJVEVfSFJFRyhIMjY0X0VOQ19DQlJfQ1RMLAorCQkJKHdxLT5jYnJfaW5mby5zdGFydF90YmxfaWQgPDwgMjgpIHwKKwkJCSh3cS0+Y2JyX2luZm8uc2hvcnRfc2hpZnQgPDwgMjQpIHwKKwkJCSh3cS0+Y2JyX2luZm8ubG9uZ19tYl9udW0gPDwgMTYpIHwKKwkJCSh3cS0+Y2JyX2luZm8ubG9uZ190aCA8PCAwKSk7CisJCVdSSVRFX0hSRUcoSDI2NF9FTkNfQ0JSX1JFR0lPTl9TSVpFLAorCQkJKHdxLT5jYnJfaW5mby5ibG9ja193IDw8IDE2KSB8CisJCQkod3EtPmNicl9pbmZvLmJsb2NrX2ggPDwgMCkpOworCX0KKyNlbmRpZgorCVdSSVRFX0hSRUcoSENPREVDX1FEQ1RfVkxDX1FVQU5UX0NUTF8wLAorCQkoMCA8PCAxOSkgfCAvKiB2bGNfZGVsdGFfcXVhbnRfMSAqLworCQkoaV9waWNfcXAgPDwgMTMpIHwgLyogdmxjX3F1YW50XzEgKi8KKwkJKDAgPDwgNikgfCAvKiB2bGNfZGVsdGFfcXVhbnRfMCAqLworCQkoaV9waWNfcXAgPDwgMCkpOyAvKiB2bGNfcXVhbnRfMCAqLworCVdSSVRFX0hSRUcoSENPREVDX1FEQ1RfVkxDX1FVQU5UX0NUTF8xLAorCQkoMTQgPDwgNikgfCAvKiB2bGNfbWF4X2RlbHRhX3FfbmVnICovCisJCSgxMyA8PCAwKSk7IC8qIHZsY19tYXhfZGVsdGFfcV9wb3MgKi8KKwlXUklURV9IUkVHKEhDT0RFQ19WTENfUElDX1NJWkUsCisJCXBpY193aWR0aCB8IChwaWNfaGVpZ2h0IDw8IDE2KSk7CisJV1JJVEVfSFJFRyhIQ09ERUNfVkxDX1BJQ19QT1NJVElPTiwKKwkJKHBpY19tYl9uciA8PCAxNikgfAorCQkocGljX21ieSA8PCA4KSB8CisJCShwaWNfbWJ4IDw8IDApKTsKKworCS8qIHN5bm9wc3lzIHBhcmFsbGVsX2Nhc2UgZnVsbF9jYXNlICovCisJc3dpdGNoIChpX3BpY19xcCkgeworCWNhc2UgMDoKKwkJaV9waWNfcXBfYyA9IDA7CisJCWJyZWFrOworCWNhc2UgMToKKwkJaV9waWNfcXBfYyA9IDE7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaV9waWNfcXBfYyA9IDI7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJaV9waWNfcXBfYyA9IDM7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJaV9waWNfcXBfYyA9IDQ7CisJCWJyZWFrOworCWNhc2UgNToKKwkJaV9waWNfcXBfYyA9IDU7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJaV9waWNfcXBfYyA9IDY7CisJCWJyZWFrOworCWNhc2UgNzoKKwkJaV9waWNfcXBfYyA9IDc7CisJCWJyZWFrOworCWNhc2UgODoKKwkJaV9waWNfcXBfYyA9IDg7CisJCWJyZWFrOworCWNhc2UgOToKKwkJaV9waWNfcXBfYyA9IDk7CisJCWJyZWFrOworCWNhc2UgMTA6CisJCWlfcGljX3FwX2MgPSAxMDsKKwkJYnJlYWs7CisJY2FzZSAxMToKKwkJaV9waWNfcXBfYyA9IDExOworCQlicmVhazsKKwljYXNlIDEyOgorCQlpX3BpY19xcF9jID0gMTI7CisJCWJyZWFrOworCWNhc2UgMTM6CisJCWlfcGljX3FwX2MgPSAxMzsKKwkJYnJlYWs7CisJY2FzZSAxNDoKKwkJaV9waWNfcXBfYyA9IDE0OworCQlicmVhazsKKwljYXNlIDE1OgorCQlpX3BpY19xcF9jID0gMTU7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCWlfcGljX3FwX2MgPSAxNjsKKwkJYnJlYWs7CisJY2FzZSAxNzoKKwkJaV9waWNfcXBfYyA9IDE3OworCQlicmVhazsKKwljYXNlIDE4OgorCQlpX3BpY19xcF9jID0gMTg7CisJCWJyZWFrOworCWNhc2UgMTk6CisJCWlfcGljX3FwX2MgPSAxOTsKKwkJYnJlYWs7CisJY2FzZSAyMDoKKwkJaV9waWNfcXBfYyA9IDIwOworCQlicmVhazsKKwljYXNlIDIxOgorCQlpX3BpY19xcF9jID0gMjE7CisJCWJyZWFrOworCWNhc2UgMjI6CisJCWlfcGljX3FwX2MgPSAyMjsKKwkJYnJlYWs7CisJY2FzZSAyMzoKKwkJaV9waWNfcXBfYyA9IDIzOworCQlicmVhazsKKwljYXNlIDI0OgorCQlpX3BpY19xcF9jID0gMjQ7CisJCWJyZWFrOworCWNhc2UgMjU6CisJCWlfcGljX3FwX2MgPSAyNTsKKwkJYnJlYWs7CisJY2FzZSAyNjoKKwkJaV9waWNfcXBfYyA9IDI2OworCQlicmVhazsKKwljYXNlIDI3OgorCQlpX3BpY19xcF9jID0gMjc7CisJCWJyZWFrOworCWNhc2UgMjg6CisJCWlfcGljX3FwX2MgPSAyODsKKwkJYnJlYWs7CisJY2FzZSAyOToKKwkJaV9waWNfcXBfYyA9IDI5OworCQlicmVhazsKKwljYXNlIDMwOgorCQlpX3BpY19xcF9jID0gMjk7CisJCWJyZWFrOworCWNhc2UgMzE6CisJCWlfcGljX3FwX2MgPSAzMDsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwkJaV9waWNfcXBfYyA9IDMxOworCQlicmVhazsKKwljYXNlIDMzOgorCQlpX3BpY19xcF9jID0gMzI7CisJCWJyZWFrOworCWNhc2UgMzQ6CisJCWlfcGljX3FwX2MgPSAzMjsKKwkJYnJlYWs7CisJY2FzZSAzNToKKwkJaV9waWNfcXBfYyA9IDMzOworCQlicmVhazsKKwljYXNlIDM2OgorCQlpX3BpY19xcF9jID0gMzQ7CisJCWJyZWFrOworCWNhc2UgMzc6CisJCWlfcGljX3FwX2MgPSAzNDsKKwkJYnJlYWs7CisJY2FzZSAzODoKKwkJaV9waWNfcXBfYyA9IDM1OworCQlicmVhazsKKwljYXNlIDM5OgorCQlpX3BpY19xcF9jID0gMzU7CisJCWJyZWFrOworCWNhc2UgNDA6CisJCWlfcGljX3FwX2MgPSAzNjsKKwkJYnJlYWs7CisJY2FzZSA0MToKKwkJaV9waWNfcXBfYyA9IDM2OworCQlicmVhazsKKwljYXNlIDQyOgorCQlpX3BpY19xcF9jID0gMzc7CisJCWJyZWFrOworCWNhc2UgNDM6CisJCWlfcGljX3FwX2MgPSAzNzsKKwkJYnJlYWs7CisJY2FzZSA0NDoKKwkJaV9waWNfcXBfYyA9IDM3OworCQlicmVhazsKKwljYXNlIDQ1OgorCQlpX3BpY19xcF9jID0gMzg7CisJCWJyZWFrOworCWNhc2UgNDY6CisJCWlfcGljX3FwX2MgPSAzODsKKwkJYnJlYWs7CisJY2FzZSA0NzoKKwkJaV9waWNfcXBfYyA9IDM4OworCQlicmVhazsKKwljYXNlIDQ4OgorCQlpX3BpY19xcF9jID0gMzk7CisJCWJyZWFrOworCWNhc2UgNDk6CisJCWlfcGljX3FwX2MgPSAzOTsKKwkJYnJlYWs7CisJY2FzZSA1MDoKKwkJaV9waWNfcXBfYyA9IDM5OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpX3BpY19xcF9jID0gMzk7CisJCWJyZWFrOworCX0KKworCS8qIHN5bm9wc3lzIHBhcmFsbGVsX2Nhc2UgZnVsbF9jYXNlICovCisJc3dpdGNoIChwX3BpY19xcCkgeworCWNhc2UgMDoKKwkJcF9waWNfcXBfYyA9IDA7CisJCWJyZWFrOworCWNhc2UgMToKKwkJcF9waWNfcXBfYyA9IDE7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcF9waWNfcXBfYyA9IDI7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJcF9waWNfcXBfYyA9IDM7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJcF9waWNfcXBfYyA9IDQ7CisJCWJyZWFrOworCWNhc2UgNToKKwkJcF9waWNfcXBfYyA9IDU7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJcF9waWNfcXBfYyA9IDY7CisJCWJyZWFrOworCWNhc2UgNzoKKwkJcF9waWNfcXBfYyA9IDc7CisJCWJyZWFrOworCWNhc2UgODoKKwkJcF9waWNfcXBfYyA9IDg7CisJCWJyZWFrOworCWNhc2UgOToKKwkJcF9waWNfcXBfYyA9IDk7CisJCWJyZWFrOworCWNhc2UgMTA6CisJCXBfcGljX3FwX2MgPSAxMDsKKwkJYnJlYWs7CisJY2FzZSAxMToKKwkJcF9waWNfcXBfYyA9IDExOworCQlicmVhazsKKwljYXNlIDEyOgorCQlwX3BpY19xcF9jID0gMTI7CisJCWJyZWFrOworCWNhc2UgMTM6CisJCXBfcGljX3FwX2MgPSAxMzsKKwkJYnJlYWs7CisJY2FzZSAxNDoKKwkJcF9waWNfcXBfYyA9IDE0OworCQlicmVhazsKKwljYXNlIDE1OgorCQlwX3BpY19xcF9jID0gMTU7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCXBfcGljX3FwX2MgPSAxNjsKKwkJYnJlYWs7CisJY2FzZSAxNzoKKwkJcF9waWNfcXBfYyA9IDE3OworCQlicmVhazsKKwljYXNlIDE4OgorCQlwX3BpY19xcF9jID0gMTg7CisJCWJyZWFrOworCWNhc2UgMTk6CisJCXBfcGljX3FwX2MgPSAxOTsKKwkJYnJlYWs7CisJY2FzZSAyMDoKKwkJcF9waWNfcXBfYyA9IDIwOworCQlicmVhazsKKwljYXNlIDIxOgorCQlwX3BpY19xcF9jID0gMjE7CisJCWJyZWFrOworCWNhc2UgMjI6CisJCXBfcGljX3FwX2MgPSAyMjsKKwkJYnJlYWs7CisJY2FzZSAyMzoKKwkJcF9waWNfcXBfYyA9IDIzOworCQlicmVhazsKKwljYXNlIDI0OgorCQlwX3BpY19xcF9jID0gMjQ7CisJCWJyZWFrOworCWNhc2UgMjU6CisJCXBfcGljX3FwX2MgPSAyNTsKKwkJYnJlYWs7CisJY2FzZSAyNjoKKwkJcF9waWNfcXBfYyA9IDI2OworCQlicmVhazsKKwljYXNlIDI3OgorCQlwX3BpY19xcF9jID0gMjc7CisJCWJyZWFrOworCWNhc2UgMjg6CisJCXBfcGljX3FwX2MgPSAyODsKKwkJYnJlYWs7CisJY2FzZSAyOToKKwkJcF9waWNfcXBfYyA9IDI5OworCQlicmVhazsKKwljYXNlIDMwOgorCQlwX3BpY19xcF9jID0gMjk7CisJCWJyZWFrOworCWNhc2UgMzE6CisJCXBfcGljX3FwX2MgPSAzMDsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwkJcF9waWNfcXBfYyA9IDMxOworCQlicmVhazsKKwljYXNlIDMzOgorCQlwX3BpY19xcF9jID0gMzI7CisJCWJyZWFrOworCWNhc2UgMzQ6CisJCXBfcGljX3FwX2MgPSAzMjsKKwkJYnJlYWs7CisJY2FzZSAzNToKKwkJcF9waWNfcXBfYyA9IDMzOworCQlicmVhazsKKwljYXNlIDM2OgorCQlwX3BpY19xcF9jID0gMzQ7CisJCWJyZWFrOworCWNhc2UgMzc6CisJCXBfcGljX3FwX2MgPSAzNDsKKwkJYnJlYWs7CisJY2FzZSAzODoKKwkJcF9waWNfcXBfYyA9IDM1OworCQlicmVhazsKKwljYXNlIDM5OgorCQlwX3BpY19xcF9jID0gMzU7CisJCWJyZWFrOworCWNhc2UgNDA6CisJCXBfcGljX3FwX2MgPSAzNjsKKwkJYnJlYWs7CisJY2FzZSA0MToKKwkJcF9waWNfcXBfYyA9IDM2OworCQlicmVhazsKKwljYXNlIDQyOgorCQlwX3BpY19xcF9jID0gMzc7CisJCWJyZWFrOworCWNhc2UgNDM6CisJCXBfcGljX3FwX2MgPSAzNzsKKwkJYnJlYWs7CisJY2FzZSA0NDoKKwkJcF9waWNfcXBfYyA9IDM3OworCQlicmVhazsKKwljYXNlIDQ1OgorCQlwX3BpY19xcF9jID0gMzg7CisJCWJyZWFrOworCWNhc2UgNDY6CisJCXBfcGljX3FwX2MgPSAzODsKKwkJYnJlYWs7CisJY2FzZSA0NzoKKwkJcF9waWNfcXBfYyA9IDM4OworCQlicmVhazsKKwljYXNlIDQ4OgorCQlwX3BpY19xcF9jID0gMzk7CisJCWJyZWFrOworCWNhc2UgNDk6CisJCXBfcGljX3FwX2MgPSAzOTsKKwkJYnJlYWs7CisJY2FzZSA1MDoKKwkJcF9waWNfcXBfYyA9IDM5OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwX3BpY19xcF9jID0gMzk7CisJCWJyZWFrOworCX0KKwlXUklURV9IUkVHKEhDT0RFQ19RRENUX1FfUVVBTlRfSSwKKwkJKGlfcGljX3FwX2MgPDwgMjIpIHwKKwkJKGlfcGljX3FwIDw8IDE2KSB8CisJCSgoaV9waWNfcXBfYyAlIDYpIDw8IDEyKSB8CisJCSgoaV9waWNfcXBfYyAvIDYpIDw8IDgpIHwKKwkJKChpX3BpY19xcCAlIDYpIDw8IDQpIHwKKwkJKChpX3BpY19xcCAvIDYpIDw8IDApKTsKKworCVdSSVRFX0hSRUcoSENPREVDX1FEQ1RfUV9RVUFOVF9QLAorCQkocF9waWNfcXBfYyA8PCAyMikgfAorCQkocF9waWNfcXAgPDwgMTYpIHwKKwkJKChwX3BpY19xcF9jICUgNikgPDwgMTIpIHwKKwkJKChwX3BpY19xcF9jIC8gNikgPDwgOCkgfAorCQkoKHBfcGljX3FwICUgNikgPDwgNCkgfAorCQkoKHBfcGljX3FwIC8gNikgPDwgMCkpOworCisjaWZkZWYgRU5BQkxFX0lHTk9SRV9GVU5DVElPTgorCVdSSVRFX0hSRUcoSENPREVDX0lHTk9SRV9DT05GSUcsCisJCSgxIDw8IDMxKSB8IC8qIGlnbm9yZV9sYWNfY29lZmZfZW4gKi8KKwkJKDEgPDwgMjYpIHwgLyogaWdub3JlX2xhY19jb2VmZl9lbHNlICg8MSkgKi8KKwkJKDEgPDwgMjEpIHwgLyogaWdub3JlX2xhY19jb2VmZl8yICg8MSkgKi8KKwkJKDIgPDwgMTYpIHwgLyogaWdub3JlX2xhY19jb2VmZl8xICg8MikgKi8KKwkJKDEgPDwgMTUpIHwgLyogaWdub3JlX2NhY19jb2VmZl9lbiAqLworCQkoMSA8PCAxMCkgfCAvKiBpZ25vcmVfY2FjX2NvZWZmX2Vsc2UgKDwxKSAqLworCQkoMSA8PCA1KSAgfCAvKiBpZ25vcmVfY2FjX2NvZWZmXzIgKDwxKSAqLworCQkoMyA8PCAwKSk7ICAvKiBpZ25vcmVfY2FjX2NvZWZmXzEgKDwyKSAqLworCisJaWYgKGdldF9jcHVfdHlwZSgpID49IE1FU09OX0NQVV9NQUpPUl9JRF9HWFRWQkIpCisJCVdSSVRFX0hSRUcoSENPREVDX0lHTk9SRV9DT05GSUdfMiwKKwkJCSgxIDw8IDMxKSB8IC8qIGlnbm9yZV90X2xhY19jb2VmZl9lbiAqLworCQkJKDEgPDwgMjYpIHwgLyogaWdub3JlX3RfbGFjX2NvZWZmX2Vsc2UgKDwxKSAqLworCQkJKDIgPDwgMjEpIHwgLyogaWdub3JlX3RfbGFjX2NvZWZmXzIgKDwyKSAqLworCQkJKDYgPDwgMTYpIHwgLyogaWdub3JlX3RfbGFjX2NvZWZmXzEgKDw2KSAqLworCQkJKDE8PDE1KSB8IC8qIGlnbm9yZV9jZGNfY29lZmZfZW4gKi8KKwkJCSgwPDwxNCkgfCAvKiBpZ25vcmVfdF9sYWNfY29lZmZfZWxzZV9sZV8zICovCisJCQkoMTw8MTMpIHwgLyogaWdub3JlX3RfbGFjX2NvZWZmX2Vsc2VfbGVfNCAqLworCQkJKDE8PDEyKSB8IC8qIGlnbm9yZV9jZGNfb25seV93aGVuX2VtcHR5X2NhY19pbnRlciAqLworCQkJKDE8PDExKSB8IC8qIGlnbm9yZV9jZGNfb25seV93aGVuX29uZV9lbXB0eV9pbnRlciAqLworCQkJLyogaWdub3JlX2NkY19yYW5nZV9tYXhfaW50ZXIgMC0wLCAxLTEsIDItMiwgMy0zICovCisJCQkoMjw8OSkgfAorCQkJLyogaWdub3JlX2NkY19hYnNfbWF4X2ludGVyIDAtMSwgMS0yLCAyLTMsIDMtNCAqLworCQkJKDA8PDcpIHwKKwkJCS8qIGlnbm9yZV9jZGNfb25seV93aGVuX2VtcHR5X2NhY19pbnRyYSAqLworCQkJKDE8PDUpIHwKKwkJCS8qIGlnbm9yZV9jZGNfb25seV93aGVuX29uZV9lbXB0eV9pbnRyYSAqLworCQkJKDE8PDQpIHwKKwkJCS8qIGlnbm9yZV9jZGNfcmFuZ2VfbWF4X2ludHJhIDAtMCwgMS0xLCAyLTIsIDMtMyAqLworCQkJKDE8PDIpIHwKKwkJCS8qIGlnbm9yZV9jZGNfYWJzX21heF9pbnRyYSAwLTEsIDEtMiwgMi0zLCAzLTQgKi8KKwkJCSgwPDwwKSk7CisJZWxzZQorCQlXUklURV9IUkVHKEhDT0RFQ19JR05PUkVfQ09ORklHXzIsCisJCQkoMSA8PCAzMSkgfCAvKiBpZ25vcmVfdF9sYWNfY29lZmZfZW4gKi8KKwkJCSgxIDw8IDI2KSB8IC8qIGlnbm9yZV90X2xhY19jb2VmZl9lbHNlICg8MSkgKi8KKwkJCSgxIDw8IDIxKSB8IC8qIGlnbm9yZV90X2xhY19jb2VmZl8yICg8MSkgKi8KKwkJCSg1IDw8IDE2KSB8IC8qIGlnbm9yZV90X2xhY19jb2VmZl8xICg8NSkgKi8KKwkJCSgwIDw8IDApKTsKKyNlbHNlCisJV1JJVEVfSFJFRyhIQ09ERUNfSUdOT1JFX0NPTkZJRywgMCk7CisJV1JJVEVfSFJFRyhIQ09ERUNfSUdOT1JFX0NPTkZJR18yLCAwKTsKKyNlbmRpZgorCisJV1JJVEVfSFJFRyhIQ09ERUNfUURDVF9NQl9DT05UUk9MLAorCQkoMSA8PCA5KSB8IC8qIG1iX2luZm9fc29mdF9yZXNldCAqLworCQkoMSA8PCAwKSk7IC8qIG1iIHJlYWQgYnVmZmVyIHNvZnQgcmVzZXQgKi8KKworCVdSSVRFX0hSRUcoSENPREVDX1FEQ1RfTUJfQ09OVFJPTCwKKwkJKDEgPDwgMjgpIHwgLyogaWdub3JlX3RfcDh4OCAqLworCQkoMCA8PCAyNykgfCAvKiB6ZXJvX21jX291dF9udWxsX25vbl9za2lwcGVkX21iICovCisJCSgwIDw8IDI2KSB8IC8qIG5vX21jX291dF9udWxsX25vbl9za2lwcGVkX21iICovCisJCSgwIDw8IDI1KSB8IC8qIG1jX291dF9ldmVuX3NraXBwZWRfbWIgKi8KKwkJKDAgPDwgMjQpIHwgLyogbWNfb3V0X3dhaXRfY2JwX3JlYWR5ICovCisJCSgwIDw8IDIzKSB8IC8qIG1jX291dF93YWl0X21iX3R5cGVfcmVhZHkgKi8KKwkJKDEgPDwgMjkpIHwgLyogaWVfc3RhcnRfaW50X2VuYWJsZSAqLworCQkoMSA8PCAxOSkgfCAvKiBpX3ByZWRfZW5hYmxlICovCisJCSgxIDw8IDIwKSB8IC8qIGllX3N1Yl9lbmFibGUgKi8KKwkJKDEgPDwgMTgpIHwgLyogaXFfZW5hYmxlICovCisJCSgxIDw8IDE3KSB8IC8qIGlkY3RfZW5hYmxlICovCisJCSgxIDw8IDE0KSB8IC8qIG1iX3BhdXNlX2VuYWJsZSAqLworCQkoMSA8PCAxMykgfCAvKiBxX2VuYWJsZSAqLworCQkoMSA8PCAxMikgfCAvKiBkY3RfZW5hYmxlICovCisJCSgxIDw8IDEwKSB8IC8qIG1iX2luZm9fZW4gKi8KKwkJKDAgPDwgMykgfCAvKiBlbmRpYW4gKi8KKwkJKDAgPDwgMSkgfCAvKiBtYl9yZWFkX2VuICovCisJCSgwIDw8IDApKTsgLyogc29mdCByZXNldCAqLworCisJV1JJVEVfSFJFRyhIQ09ERUNfU0FEX0NPTlRST0wsCisJCSgwIDw8IDMpIHwgLyogaWVfcmVzdWx0X2J1ZmZfZW5hYmxlICovCisJCSgxIDw8IDIpIHwgLyogaWVfcmVzdWx0X2J1ZmZfc29mdF9yZXNldCAqLworCQkoMCA8PCAxKSB8IC8qIHNhZF9lbmFibGUgKi8KKwkJKDEgPDwgMCkpOyAvKiBzYWQgc29mdCByZXNldCAqLworCVdSSVRFX0hSRUcoSENPREVDX0lFX1JFU1VMVF9CVUZGRVIsIDApOworCisJV1JJVEVfSFJFRyhIQ09ERUNfU0FEX0NPTlRST0wsCisJCSgxIDw8IDMpIHwgLyogaWVfcmVzdWx0X2J1ZmZfZW5hYmxlICovCisJCSgwIDw8IDIpIHwgLyogaWVfcmVzdWx0X2J1ZmZfc29mdF9yZXNldCAqLworCQkoMSA8PCAxKSB8IC8qIHNhZF9lbmFibGUgKi8KKwkJKDAgPDwgMCkpOyAvKiBzYWQgc29mdCByZXNldCAqLworCisJV1JJVEVfSFJFRyhIQ09ERUNfSUVfQ09OVFJPTCwKKwkJKDEgPDwgMzApIHwgLyogYWN0aXZlX3VsX2Jsb2NrICovCisJCSgwIDw8IDEpIHwgLyogaWVfZW5hYmxlICovCisJCSgxIDw8IDApKTsgLyogaWUgc29mdCByZXNldCAqLworCisJV1JJVEVfSFJFRyhIQ09ERUNfSUVfQ09OVFJPTCwKKwkJKDEgPDwgMzApIHwgLyogYWN0aXZlX3VsX2Jsb2NrICovCisJCSgwIDw8IDEpIHwgLyogaWVfZW5hYmxlICovCisJCSgwIDw8IDApKTsgLyogaWUgc29mdCByZXNldCAqLworCisJV1JJVEVfSFJFRyhIQ09ERUNfTUVfU0tJUF9MSU5FLAorCQkoOCA8PCAyNCkgfCAvKiBzdGVwXzNfc2tpcF9saW5lICovCisJCSg4IDw8IDE4KSB8IC8qIHN0ZXBfMl9za2lwX2xpbmUgKi8KKwkJKDIgPDwgMTIpIHwgLyogc3RlcF8xX3NraXBfbGluZSAqLworCQkoMCA8PCA2KSB8IC8qIHN0ZXBfMF9za2lwX2xpbmUgKi8KKwkJKDAgPDwgMCkpOworCisJV1JJVEVfSFJFRyhIQ09ERUNfTUVfTVZfTUVSR0VfQ1RMLCBtZV9tdl9tZXJnZV9jdGwpOworCVdSSVRFX0hSRUcoSENPREVDX01FX1NURVAwX0NMT1NFX01WLCBtZV9zdGVwMF9jbG9zZV9tdik7CisJV1JJVEVfSFJFRyhIQ09ERUNfTUVfU0FEX0VOT1VHSF8wMSwgbWVfc2FkX2Vub3VnaF8wMSk7CisJV1JJVEVfSFJFRyhIQ09ERUNfTUVfU0FEX0VOT1VHSF8yMywgbWVfc2FkX2Vub3VnaF8yMyk7CisJV1JJVEVfSFJFRyhIQ09ERUNfTUVfRl9TS0lQX1NBRCwgbWVfZl9za2lwX3NhZCk7CisJV1JJVEVfSFJFRyhIQ09ERUNfTUVfRl9TS0lQX1dFSUdIVCwgbWVfZl9za2lwX3dlaWdodCk7CisJV1JJVEVfSFJFRyhIQ09ERUNfTUVfTVZfV0VJR0hUXzAxLCBtZV9tdl93ZWlnaHRfMDEpOworCVdSSVRFX0hSRUcoSENPREVDX01FX01WX1dFSUdIVF8yMywgbWVfbXZfd2VpZ2h0XzIzKTsKKwlXUklURV9IUkVHKEhDT0RFQ19NRV9TQURfUkFOR0VfSU5DLCBtZV9zYWRfcmFuZ2VfaW5jKTsKKworCWlmIChnZXRfY3B1X3R5cGUoKSA+PSBNRVNPTl9DUFVfTUFKT1JfSURfVFhMKSB7CisJCVdSSVRFX0hSRUcoSENPREVDX1Y1X1NJTVBMRV9NQl9DVEwsIDApOworCQlXUklURV9IUkVHKEhDT0RFQ19WNV9TSU1QTEVfTUJfQ1RMLAorCQkJKHY1X3VzZV9zbWFsbF9kaWZmX2NudCA8PCA3KSB8CisJCQkodjVfc2ltcGxlX21iX2ludGVyX2FsbF9lbiA8PCA2KSB8CisJCQkodjVfc2ltcGxlX21iX2ludGVyXzh4OF9lbiA8PCA1KSB8CisJCQkodjVfc2ltcGxlX21iX2ludGVyXzE2XzhfZW4gPDwgNCkgfAorCQkJKHY1X3NpbXBsZV9tYl9pbnRlcl8xNngxNl9lbiA8PCAzKSB8CisJCQkodjVfc2ltcGxlX21iX2ludHJhX2VuIDw8IDIpIHwKKwkJCSh2NV9zaW1wbGVfbWJfQ19lbiA8PCAxKSB8CisJCQkodjVfc2ltcGxlX21iX1lfZW4gPDwgMCkpOworCQlXUklURV9IUkVHKEhDT0RFQ19WNV9NQl9ESUZGX1NVTSwgMCk7CisJCVdSSVRFX0hSRUcoSENPREVDX1Y1X1NNQUxMX0RJRkZfQ05ULAorCQkJKHY1X3NtYWxsX2RpZmZfQzw8MTYpIHwKKwkJCSh2NV9zbWFsbF9kaWZmX1k8PDApKTsKKwkJaWYgKHFwX21vZGUgPT0gMSkgeworCQkJV1JJVEVfSFJFRyhIQ09ERUNfVjVfU0lNUExFX01CX0RRVUFOVCwKKwkJCQkwKTsKKwkJfSBlbHNlIHsKKwkJCVdSSVRFX0hSRUcoSENPREVDX1Y1X1NJTVBMRV9NQl9EUVVBTlQsCisJCQkJdjVfc2ltcGxlX2RxX3NldHRpbmcpOworCQl9CisJCVdSSVRFX0hSRUcoSENPREVDX1Y1X1NJTVBMRV9NQl9NRV9XRUlHSFQsCisJCQl2NV9zaW1wbGVfbWVfd2VpZ2h0X3NldHRpbmcpOworCQkvKiB0eGx4IGNhbiByZW1vdmUgaXQgKi8KKwkJV1JJVEVfSFJFRyhIQ09ERUNfUURDVF9DT05GSUcsIDEgPDwgMCk7CisJfQorCisJaWYgKGdldF9jcHVfdHlwZSgpID49IE1FU09OX0NQVV9NQUpPUl9JRF9HWEwpIHsKKwkJV1JJVEVfSFJFRyhIQ09ERUNfVjRfRk9SQ0VfU0tJUF9DRkcsCisJCQkoaV9waWNfcXAgPDwgMjYpIHwgLyogdjRfZm9yY2VfcV9yX2ludHJhICovCisJCQkoaV9waWNfcXAgPDwgMjApIHwgLyogdjRfZm9yY2VfcV9yX2ludGVyICovCisJCQkoMCA8PCAxOSkgfCAvKiB2NF9mb3JjZV9xX3lfZW5hYmxlICovCisJCQkoNSA8PCAxNikgfCAvKiB2NF9mb3JjZV9xcl95ICovCisJCQkoNiA8PCAxMikgfCAvKiB2NF9mb3JjZV9xcF95ICovCisJCQkoMCA8PCAwKSk7IC8qIHY0X2ZvcmNlX3NraXBfc2FkICovCisKKwkJLyogVjMgRm9yY2Ugc2tpcCAqLworCQlXUklURV9IUkVHKEhDT0RFQ19WM19TS0lQX0NPTlRST0wsCisJCQkoMSA8PCAzMSkgfCAvKiB2M19za2lwX2VuYWJsZSAqLworCQkJKDAgPDwgMzApIHwgLyogdjNfc3RlcF8xX3dlaWdodF9lbmFibGUgKi8KKwkJCSgxIDw8IDI4KSB8IC8qIHYzX212X3NhZF93ZWlnaHRfZW5hYmxlICovCisJCQkoMSA8PCAyNykgfCAvKiB2M19pcHJlZF90eXBlX2VuYWJsZSAqLworCQkJKFYzX0ZPUkNFX1NLSVBfU0FEXzEgPDwgMTIpIHwKKwkJCShWM19GT1JDRV9TS0lQX1NBRF8wIDw8IDApKTsKKwkJV1JJVEVfSFJFRyhIQ09ERUNfVjNfU0tJUF9XRUlHSFQsCisJCQkoVjNfU0tJUF9XRUlHSFRfMSA8PCAxNikgfAorCQkJKFYzX1NLSVBfV0VJR0hUXzAgPDwgMCkpOworCQlXUklURV9IUkVHKEhDT0RFQ19WM19MMV9TS0lQX01BWF9TQUQsCisJCQkoVjNfTEVWRUxfMV9GX1NLSVBfTUFYX1NBRCA8PCAxNikgfAorCQkJKFYzX0xFVkVMXzFfU0tJUF9NQVhfU0FEIDw8IDApKTsKKwkJV1JJVEVfSFJFRyhIQ09ERUNfVjNfTDJfU0tJUF9XRUlHSFQsCisJCQkoVjNfRk9SQ0VfU0tJUF9TQURfMiA8PCAxNikgfAorCQkJKFYzX1NLSVBfV0VJR0hUXzIgPDwgMCkpOworCQlpZiAocmVxdWVzdCAhPSBOVUxMKSB7CisJCQl1bnNpZ25lZCBpbnQgb2ZmMSwgb2ZmMjsKKworCQkJb2ZmMSA9IFYzX0lFX0ZfWkVST19TQURfSTQgLSBJNE1CX1dFSUdIVF9PRkZTRVQ7CisJCQlvZmYyID0gVjNfSUVfRl9aRVJPX1NBRF9JMTYKKwkJCQktIEkxNk1CX1dFSUdIVF9PRkZTRVQ7CisJCQlXUklURV9IUkVHKEhDT0RFQ19WM19GX1pFUk9fQ1RMXzAsCisJCQkJKChyZXF1ZXN0LT5pMTZfd2VpZ2h0ICsgb2ZmMikgPDwgMTYpIHwKKwkJCQkoKHJlcXVlc3QtPmk0X3dlaWdodCArIG9mZjEpIDw8IDApKTsKKwkJCW9mZjEgPSBWM19NRV9GX1pFUk9fU0FEIC0gTUVfV0VJR0hUX09GRlNFVDsKKwkJCVdSSVRFX0hSRUcoSENPREVDX1YzX0ZfWkVST19DVExfMSwKKwkJCQkoMCA8PCAyNSkgfAorCQkJCS8qIHYzX25vX3Zlcl93aGVuX3RvcF96ZXJvX2VuICovCisJCQkJKDAgPDwgMjQpIHwKKwkJCQkvKiB2M19ub19ob3Jfd2hlbl9sZWZ0X3plcm9fZW4gKi8KKwkJCQkoMyA8PCAxNikgfCAgLyogdHlwZV9ob3IgYnJlYWsgKi8KKwkJCQkoKHJlcXVlc3QtPm1lX3dlaWdodCArIG9mZjEpIDw8IDApKTsKKwkJfSBlbHNlIHsKKwkJCVdSSVRFX0hSRUcoSENPREVDX1YzX0ZfWkVST19DVExfMCwKKwkJCQkoVjNfSUVfRl9aRVJPX1NBRF9JMTYgPDwgMTYpIHwKKwkJCQkoVjNfSUVfRl9aRVJPX1NBRF9JNCA8PCAwKSk7CisJCQlXUklURV9IUkVHKEhDT0RFQ19WM19GX1pFUk9fQ1RMXzEsCisJCQkJKDAgPDwgMjUpIHwKKwkJCQkvKiB2M19ub192ZXJfd2hlbl90b3BfemVyb19lbiAqLworCQkJCSgwIDw8IDI0KSB8CisJCQkJLyogdjNfbm9faG9yX3doZW5fbGVmdF96ZXJvX2VuICovCisJCQkJKDMgPDwgMTYpIHwgIC8qIHR5cGVfaG9yIGJyZWFrICovCisJCQkJKFYzX01FX0ZfWkVST19TQUQgPDwgMCkpOworCQl9CisJfSBlbHNlIGlmIChnZXRfY3B1X3R5cGUoKSA+PSBNRVNPTl9DUFVfTUFKT1JfSURfR1hUVkJCKSB7CisJCS8qIFYzIEZvcmNlIHNraXAgKi8KKwkJV1JJVEVfSFJFRyhIQ09ERUNfVjNfU0tJUF9DT05UUk9MLAorCQkJKDEgPDwgMzEpIHwgLyogdjNfc2tpcF9lbmFibGUgKi8KKwkJCSgwIDw8IDMwKSB8IC8qIHYzX3N0ZXBfMV93ZWlnaHRfZW5hYmxlICovCisJCQkoMSA8PCAyOCkgfCAvKiB2M19tdl9zYWRfd2VpZ2h0X2VuYWJsZSAqLworCQkJKDEgPDwgMjcpIHwgLyogdjNfaXByZWRfdHlwZV9lbmFibGUgKi8KKwkJCSgwIDw8IDEyKSB8IC8qIFYzX0ZPUkNFX1NLSVBfU0FEXzEgKi8KKwkJCSgwIDw8IDApKTsgLyogVjNfRk9SQ0VfU0tJUF9TQURfMCAqLworCQlXUklURV9IUkVHKEhDT0RFQ19WM19TS0lQX1dFSUdIVCwKKwkJCShWM19TS0lQX1dFSUdIVF8xIDw8IDE2KSB8CisJCQkoVjNfU0tJUF9XRUlHSFRfMCA8PCAwKSk7CisJCVdSSVRFX0hSRUcoSENPREVDX1YzX0wxX1NLSVBfTUFYX1NBRCwKKwkJCShWM19MRVZFTF8xX0ZfU0tJUF9NQVhfU0FEIDw8IDE2KSB8CisJCQkoVjNfTEVWRUxfMV9TS0lQX01BWF9TQUQgPDwgMCkpOworCQlXUklURV9IUkVHKEhDT0RFQ19WM19MMl9TS0lQX1dFSUdIVCwKKwkJCSgwIDw8IDE2KSB8IC8qIFYzX0ZPUkNFX1NLSVBfU0FEXzIgKi8KKwkJCShWM19TS0lQX1dFSUdIVF8yIDw8IDApKTsKKwkJV1JJVEVfSFJFRyhIQ09ERUNfVjNfRl9aRVJPX0NUTF8wLAorCQkJKDAgPDwgMTYpIHwgLyogVjNfSUVfRl9aRVJPX1NBRF9JMTYgKi8KKwkJCSgwIDw8IDApKTsgLyogVjNfSUVfRl9aRVJPX1NBRF9JNCAqLworCQlXUklURV9IUkVHKEhDT0RFQ19WM19GX1pFUk9fQ1RMXzEsCisJCQkoMCA8PCAyNSkgfCAvKiB2M19ub192ZXJfd2hlbl90b3BfemVyb19lbiAqLworCQkJKDAgPDwgMjQpIHwgLyogdjNfbm9faG9yX3doZW5fbGVmdF96ZXJvX2VuICovCisJCQkoMyA8PCAxNikgfCAgLyogdHlwZV9ob3IgYnJlYWsgKi8KKwkJCSgwIDw8IDApKTsgLyogVjNfTUVfRl9aRVJPX1NBRCAqLworCX0KKwlpZiAoZ2V0X2NwdV90eXBlKCkgPj0gTUVTT05fQ1BVX01BSk9SX0lEX0dYVFZCQikgeworCQlpbnQgaTsKKwkJLyogTVYgU0FEIFRhYmxlICovCisJCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorCQkJV1JJVEVfSFJFRyhIQ09ERUNfVjNfTVZfU0FEX1RBQkxFLAorCQkJCXYzX212X3NhZFtpXSk7CisKKwkJLyogSUUgUFJFRCBTQUQgVGFibGUqLworCQlXUklURV9IUkVHKEhDT0RFQ19WM19JUFJFRF9UWVBFX1dFSUdIVF8wLAorCQkJKENfaXByZWRfd2VpZ2h0X0ggPDwgMjQpIHwKKwkJCShDX2lwcmVkX3dlaWdodF9WIDw8IDE2KSB8CisJCQkoSTRfaXByZWRfd2VpZ2h0X2Vsc2UgPDwgOCkgfAorCQkJKEk0X2lwcmVkX3dlaWdodF9tb3N0IDw8IDApKTsKKwkJV1JJVEVfSFJFRyhIQ09ERUNfVjNfSVBSRURfVFlQRV9XRUlHSFRfMSwKKwkJCShJMTZfaXByZWRfd2VpZ2h0X0RDIDw8IDI0KSB8CisJCQkoSTE2X2lwcmVkX3dlaWdodF9IIDw8IDE2KSB8CisJCQkoSTE2X2lwcmVkX3dlaWdodF9WIDw8IDgpIHwKKwkJCShDX2lwcmVkX3dlaWdodF9EQyA8PCAwKSk7CisJCVdSSVRFX0hSRUcoSENPREVDX1YzX0xFRlRfU01BTExfTUFYX1NBRCwKKwkJCSh2M19sZWZ0X3NtYWxsX21heF9tZV9zYWQgPDwgMTYpIHwKKwkJCSh2M19sZWZ0X3NtYWxsX21heF9pZV9zYWQgPDwgMCkpOworCX0KKwlXUklURV9IUkVHKEhDT0RFQ19JRV9EQVRBX0ZFRURfQlVGRl9JTkZPLCAwKTsKKwlXUklURV9IUkVHKEhDT0RFQ19DVVJSX0NBTlZBU19DVFJMLCAwKTsKKwlkYXRhMzIgPSBSRUFEX0hSRUcoSENPREVDX1ZMQ19DT05GSUcpOworCWRhdGEzMiA9IGRhdGEzMiB8ICgxIDw8IDApOyAvKiBzZXQgcG9wX2NvZWZmX2V2ZW5fYWxsX3plcm8gKi8KKwlXUklURV9IUkVHKEhDT0RFQ19WTENfQ09ORklHLCBkYXRhMzIpOworCisJV1JJVEVfSFJFRyhJTkZPX0RVTVBfU1RBUlRfQUREUiwKKwkJd3EtPm1lbS5kdW1wX2luZm9fZGRyX3N0YXJ0X2FkZHIpOworCisJLyogY2xlYXIgbWFpbGJveCBpbnRlcnJ1cHQgKi8KKwlXUklURV9IUkVHKEhDT0RFQ19JUlFfTUJPWF9DTFIsIDEpOworCisJLyogZW5hYmxlIG1haWxib3ggaW50ZXJydXB0ICovCisJV1JJVEVfSFJFRyhIQ09ERUNfSVJRX01CT1hfTUFTSywgMSk7Cit9CisKK3ZvaWQgYW12ZW5jX3Jlc2V0KHZvaWQpCit7CisJaWYgKGdldF9jcHVfdHlwZSgpID49IE1FU09OX0NQVV9NQUpPUl9JRF9TQzIgJiYKKwkJCXVzZV9yZXNldF9jb250cm9sKSB7CisJCWhjb2RlY19od19yZXNldCgpOworCX0gZWxzZSB7CisJCVJFQURfVlJFRyhET1NfU1dfUkVTRVQxKTsKKwkJUkVBRF9WUkVHKERPU19TV19SRVNFVDEpOworCQlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMSk7CisJCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMSwKKwkJCSgxIDw8IDIpIHwgKDEgPDwgNikgfAorCQkJKDEgPDwgNykgfCAoMSA8PCA4KSB8CisJCQkoMSA8PCAxNCkgfCAoMSA8PCAxNikgfAorCQkJKDEgPDwgMTcpKTsKKwkJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQxLCAwKTsKKwkJUkVBRF9WUkVHKERPU19TV19SRVNFVDEpOworCQlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMSk7CisJCVJFQURfVlJFRyhET1NfU1dfUkVTRVQxKTsKKwl9Cit9CisKK3ZvaWQgYW12ZW5jX3N0YXJ0KHZvaWQpCit7CisJaWYgKGdldF9jcHVfdHlwZSgpID49IE1FU09OX0NQVV9NQUpPUl9JRF9TQzIgJiYKKwkJCXVzZV9yZXNldF9jb250cm9sKSB7CisJCWhjb2RlY19od19yZXNldCgpOworCX0gZWxzZSB7CisJCVJFQURfVlJFRyhET1NfU1dfUkVTRVQxKTsKKwkJUkVBRF9WUkVHKERPU19TV19SRVNFVDEpOworCQlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMSk7CisJCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMSwKKwkJCSgxIDw8IDEyKSB8ICgxIDw8IDExKSk7CisJCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMSwgMCk7CisJCVJFQURfVlJFRyhET1NfU1dfUkVTRVQxKTsKKwkJUkVBRF9WUkVHKERPU19TV19SRVNFVDEpOworCQlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMSk7CisJfQorCisJV1JJVEVfSFJFRyhIQ09ERUNfTVBTUiwgMHgwMDAxKTsKK30KKwordm9pZCBhbXZlbmNfc3RvcCh2b2lkKQoreworCXVsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgSFo7CisKKwlXUklURV9IUkVHKEhDT0RFQ19NUFNSLCAwKTsKKwlXUklURV9IUkVHKEhDT0RFQ19DUFNSLCAwKTsKKworCXdoaWxlIChSRUFEX0hSRUcoSENPREVDX0lNRU1fRE1BX0NUUkwpICYgMHg4MDAwKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGdldF9jcHVfdHlwZSgpID49IE1FU09OX0NQVV9NQUpPUl9JRF9TQzIgJiYKKwkJCXVzZV9yZXNldF9jb250cm9sKSB7CisJCWhjb2RlY19od19yZXNldCgpOworCX0gZWxzZSB7CisJCVJFQURfVlJFRyhET1NfU1dfUkVTRVQxKTsKKwkJUkVBRF9WUkVHKERPU19TV19SRVNFVDEpOworCQlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMSk7CisKKwkJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQxLAorCQkJKDEgPDwgMTIpIHwgKDEgPDwgMTEpIHwKKwkJCSgxIDw8IDIpIHwgKDEgPDwgNikgfAorCQkJKDEgPDwgNykgfCAoMSA8PCA4KSB8CisJCQkoMSA8PCAxNCkgfCAoMSA8PCAxNikgfAorCQkJKDEgPDwgMTcpKTsKKworCQlXUklURV9WUkVHKERPU19TV19SRVNFVDEsIDApOworCisJCVJFQURfVlJFRyhET1NfU1dfUkVTRVQxKTsKKwkJUkVBRF9WUkVHKERPU19TV19SRVNFVDEpOworCQlSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMSk7CisJfQorCit9CisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKm1jX2FkZHI7CitzdGF0aWMgdTMyIG1jX2FkZHJfbWFwOworI2RlZmluZSBNQ19TSVpFICg0MDk2ICogOCkKK3MzMiBhbXZlbmNfbG9hZG1jKGNvbnN0IGNoYXIgKnAsIHN0cnVjdCBlbmNvZGVfd3FfcyAqd3EpCit7CisJdWxvbmcgdGltZW91dDsKKwlzMzIgcmV0ID0gMDsKKyAgICBpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNykgeworICAgICAgICBjaGFyICpidWYgPSB2bWFsbG9jKDB4MTAwMCAqIDE2KTsKKyAgICAgICAgaW50IHJldCA9IC0xOworICAgICAgICBwcl9lcnIoImxvYWQgZmlybXdhcmUgZm9yIHQzIGF2YyBlbmNvZGVyXG4iKTsKKyAgICAgICAgaWYgKGdldF9maXJtd2FyZV9kYXRhKFZJREVPX0VOQ19IMjY0LCBidWYpIDwgMCkgeworICAgICAgICAgICAgLy9hbXZkZWNfZGlzYWJsZSgpOworICAgICAgICAgICAgcHJfZXJyKCJnZXQgZmlybXdhcmUgZm9yIDI2NCBlbmMgZmFpbCFcbiIpOworICAgICAgICAgICAgdmZyZWUoYnVmKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIFdSSVRFX0hSRUcoSENPREVDX01QU1IsIDApOworICAgICAgICBXUklURV9IUkVHKEhDT0RFQ19DUFNSLCAwKTsKKyAgICAgICAgcmV0ID0gYW12ZGVjX2xvYWRtY19leChWRk9STUFUX0gyNjRfRU5DLCBOVUxMLCBidWYpOworCisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAvL2FtdmRlY19kaXNhYmxlKCk7CisgICAgICAgICAgICB2ZnJlZShidWYpOworICAgICAgICAgICAgcHJfZXJyKCJhbXZlbmM6IHRoZSAlcyBmdyBsb2FkaW5nIGZhaWxlZCwgZXJyOiAleFxuIiwKKyAgICAgICAgICAgICAgICB0ZWVfZW5hYmxlZCgpID8gIlRFRSIgOiAibG9jYWwiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgfQorICAgICAgICB2ZnJlZShidWYpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKwkvKiB1c2Ugc3RhdGljIG1lbXByeSovCisJaWYgKG1jX2FkZHIgPT0gTlVMTCkgeworCQltY19hZGRyID0ga21hbGxvYyhNQ19TSVpFLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFtY19hZGRyKSB7CisJCQllbmNfcHIoTE9HX0VSUk9SLCAiYXZjIGxvYWRtYyBpb21hcCBtYyBhZGRyIGVycm9yLlxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCWVuY19wcihMT0dfQUxMLCAiYXZjIGVuY29kZSB1Y29kZSBuYW1lIGlzICVzXG4iLCBwKTsKKwlyZXQgPSBnZXRfZGF0YV9mcm9tX25hbWUocCwgKHU4ICopbWNfYWRkcik7CisJaWYgKHJldCA8IDApIHsKKwkJZW5jX3ByKExPR19FUlJPUiwKKwkJCSJhdmMgbWljcm9jb2RlIGZhaWwgcmV0PSVkLCBuYW1lOiAlcywgd3E6JXAuXG4iLAorCQkJcmV0LCBwLCAodm9pZCAqKXdxKTsKKwl9CisKKwltY19hZGRyX21hcCA9IGRtYV9tYXBfc2luZ2xlKAorCQkmZW5jb2RlX21hbmFnZXIudGhpc19wZGV2LT5kZXYsCisJCW1jX2FkZHIsIE1DX1NJWkUsIERNQV9UT19ERVZJQ0UpOworCisJLyogbWNfYWRkcl9tYXAgPSB3cS0+bWVtLmFzc2l0X2J1ZmZlcl9vZmZzZXQ7ICovCisJLyogbWNfYWRkciA9IGlvcmVtYXBfd2MobWNfYWRkcl9tYXAsIE1DX1NJWkUpOyAqLworCS8qIG1lbWNweShtY19hZGRyLCBwLCBNQ19TSVpFKTsgKi8KKwllbmNfcHIoTE9HX0FMTCwgImFkZHJlc3MgMCBpcyAweCV4XG4iLCAqKCh1MzIgKiltY19hZGRyKSk7CisJZW5jX3ByKExPR19BTEwsICJhZGRyZXNzIDEgaXMgMHgleFxuIiwgKigodTMyICopbWNfYWRkciArIDEpKTsKKwllbmNfcHIoTE9HX0FMTCwgImFkZHJlc3MgMiBpcyAweCV4XG4iLCAqKCh1MzIgKiltY19hZGRyICsgMikpOworCWVuY19wcihMT0dfQUxMLCAiYWRkcmVzcyAzIGlzIDB4JXhcbiIsICooKHUzMiAqKW1jX2FkZHIgKyAzKSk7CisJV1JJVEVfSFJFRyhIQ09ERUNfTVBTUiwgMCk7CisJV1JJVEVfSFJFRyhIQ09ERUNfQ1BTUiwgMCk7CisKKwkvKiBSZWFkIENCVVMgcmVnaXN0ZXIgZm9yIHRpbWluZyAqLworCXRpbWVvdXQgPSBSRUFEX0hSRUcoSENPREVDX01QU1IpOworCXRpbWVvdXQgPSBSRUFEX0hSRUcoSENPREVDX01QU1IpOworCisJdGltZW91dCA9IGppZmZpZXMgKyBIWjsKKworCVdSSVRFX0hSRUcoSENPREVDX0lNRU1fRE1BX0FEUiwgbWNfYWRkcl9tYXApOworCVdSSVRFX0hSRUcoSENPREVDX0lNRU1fRE1BX0NPVU5ULCAweDEwMDApOworCS8vV1JJVEVfSFJFRyhIQ09ERUNfSU1FTV9ETUFfQ1RSTCwgKDB4ODAwMCB8ICg3IDw8IDE2KSkpOworCVdSSVRFX1ZSRUcoSENPREVDX0lNRU1fRE1BX0NUUkwsICgweDgwMDAgfCAoMHhmIDw8IDE2KSkpOworCisJd2hpbGUgKFJFQURfSFJFRyhIQ09ERUNfSU1FTV9ETUFfQ1RSTCkgJiAweDgwMDApIHsKKwkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJc2NoZWR1bGUoKTsKKwkJZWxzZSB7CisJCQllbmNfcHIoTE9HX0VSUk9SLCAiaGNvZGVjIGxvYWQgbWMgZXJyb3JcbiIpOworCQkJcmV0ID0gLUVCVVNZOworCQkJYnJlYWs7CisJCX0KKwl9CisJZG1hX3VubWFwX3NpbmdsZSgKKwkJJmVuY29kZV9tYW5hZ2VyLnRoaXNfcGRldi0+ZGV2LAorCQltY19hZGRyX21hcCwgTUNfU0laRSwgRE1BX1RPX0RFVklDRSk7CisJcmV0dXJuIHJldDsKK30KKworY29uc3QgdTMyIGZpeF9tY1tdIF9fYWxpZ25lZCg4KSA9IHsKKwkweDA4MDljMDVhLCAweDA2Njk2MDAwLCAweDBjNzgwMDAwLCAweDAwMDAwMDAwCit9OworCisKKy8qCisgKiBET1MgdG9wIGxldmVsIHJlZ2lzdGVyIGFjY2VzcyBmaXguCisgKiBXaGVuIGhjb2RlYyBpcyBydW5uaW5nLCBhIHByb3RvY29sIHJlZ2lzdGVyIEhDT0RFQ19DQ1BVX0lOVFJfTVNLCisgKiBpcyBzZXQgdG8gbWFrZSBoY29kZWMgYWNjZXNzIG9uZSBDQlVTIG91dCBvZiBET1MgZG9tYWluIG9uY2UKKyAqIHRvIHdvcmsgYXJvdW5kIGEgSFcgYnVnIGZvciA0azJrIGR1YWwgZGVjb2RlciBpbXBsZW1lbnRhdGlvbi4KKyAqIElmIGhjb2RlYyBpcyBub3QgcnVubmluZywgdGhlbiBhIHVjb2RlIGlzIGxvYWRlZCBhbmQgZXhlY3V0ZWQKKyAqIGluc3RlYWQuCisgKi8KKy8qdm9pZCBhbXZlbmNfZG9zX3RvcF9yZWdfZml4KHZvaWQpCit7CisJYm9vbCBoY29kZWNfb247CisJdWxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCisJaGNvZGVjX29uID0gdmRlY19vbihWREVDX0hDT0RFQyk7CisKKwlpZiAoKGhjb2RlY19vbikgJiYgKFJFQURfVlJFRyhIQ09ERUNfTVBTUikgJiAxKSkgeworCQlXUklURV9IUkVHKEhDT0RFQ19DQ1BVX0lOVFJfTVNLLCAxKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFoY29kZWNfb24pCisJCXZkZWNfcG93ZXJvbihWREVDX0hDT0RFQyk7CisKKwlhbWhjb2RlY19sb2FkbWMoZml4X21jKTsKKworCWFtaGNvZGVjX3N0YXJ0KCk7CisKKwl1ZGVsYXkoMTAwMCk7CisKKwlhbWhjb2RlY19zdG9wKCk7CisKKwlpZiAoIWhjb2RlY19vbikKKwkJdmRlY19wb3dlcm9mZihWREVDX0hDT0RFQyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7Cit9CisKK2Jvb2wgYW12ZW5jX2F2Y19vbih2b2lkKQoreworCWJvb2wgaGNvZGVjX29uOworCXVsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKKworCWhjb2RlY19vbiA9IHZkZWNfb24oVkRFQ19IQ09ERUMpOworCWhjb2RlY19vbiAmPSAoZW5jb2RlX21hbmFnZXIud3FfY291bnQgPiAwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gaGNvZGVjX29uOworfQorKi8KKworc3RhdGljIHMzMiBhdmNfcG93ZXJvbih1MzIgY2xvY2spCit7CisJdWxvbmcgZmxhZ3M7CisJdTMyIGRhdGEzMjsKKworCWRhdGEzMiA9IDA7CisJYW1wb3J0c19zd2l0Y2hfZ2F0ZSgidmRlYyIsIDEpOworCWlmIChnZXRfY3B1X3R5cGUoKSA+PSBNRVNPTl9DUFVfTUFKT1JfSURfU0MyKSB7CisJCWhjb2RlY19jbGtfY29uZmlnKDEpOworCQl1ZGVsYXkoMjApOworCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UMykgeworCQkJdmRlY19wb3dlcm9uKFZERUNfSENPREVDKTsKKwkJCXByX2VycigidmRlY19wb3dlcm9uIFZERUNfSENPREVDXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXB3cl9jdHJsX3BzY2lfc21jKFBESURfVDNfRE9TX0hDT0RFQywgUFdSX09OKTsKKwkJCXByX2VycigicHdyX2N0cmxfcHNjaV9zbWMgUERJRF9UM19ET1NfSENPREVDIG9mZlxuIik7CisJCX0KKwkJdWRlbGF5KDIwKTsKKyAgICAgICAgLyoKKyAgICAgICAgcHJfZXJyKCJoY29kZWMgcG93ZXJlZCBvbiwgaGNvZGVjIGNsayByYXRlOiVsZCwgcHdyX3N0YXRlOiVkXG4iLAorICAgICAgICAgICAgY2xrX2dldF9yYXRlKHNfaGNvZGVjX2Nsa3MuaGNvZGVjX2FjbGspLAorICAgICAgICAgICAgIXB3cl9jdHJsX3N0YXR1c19wc2NpX3NtYyhQRElEX1QzX0RPU19IQ09ERUMpKTsKKyAgICAgICAgKi8KKwl9IGVsc2UgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCQlXUklURV9BT1JFRyhBT19SVElfUFdSX0NOVExfUkVHMCwKKwkJCShSRUFEX0FPUkVHKEFPX1JUSV9QV1JfQ05UTF9SRUcwKSAmICh+MHgxOCkpKTsKKwkJdWRlbGF5KDEwKTsKKwkJLyogUG93ZXJ1cCBIQ09ERUMgKi8KKwkJLyogWzE6MF0gSENPREVDICovCisJCVdSSVRFX0FPUkVHKEFPX1JUSV9HRU5fUFdSX1NMRUVQMCwKKwkJCQlSRUFEX0FPUkVHKEFPX1JUSV9HRU5fUFdSX1NMRUVQMCkgJgorCQkJCSgoZ2V0X2NwdV90eXBlKCkgPT0gTUVTT05fQ1BVX01BSk9SX0lEX1NNMSB8fAorCQkJCSBnZXRfY3B1X3R5cGUoKSA+PSBNRVNPTl9DUFVfTUFKT1JfSURfVE0yKQorCQkJCT8gfjB4MSA6IH4weDMpKTsKKwkJdWRlbGF5KDEwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMSwgMHhmZmZmZmZmZik7CisJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQxLCAwKTsKKwkvKiBFbmFibGUgRG9zIGludGVybmFsIGNsb2NrIGdhdGluZyAqLworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1QzKSB7CisJCVdSSVRFX1ZSRUdfQklUUyhET1NfR0NMS19FTjAsIDB4N2ZmZiwgMTIsIDE1KTsKKwkJLyoKKwkJICogV1JJVEVfVlJFRyhET1NfR0NMS19FTjAsIDB4ZmZmZmZmZmYpOworCQkqLworCX0gZWxzZQorCQlodmRlY19jbG9ja19lbmFibGUoY2xvY2spOworCS8qIFBvd2VydXAgSENPREVDIG1lbW9yaWVzICovCisJV1JJVEVfVlJFRyhET1NfTUVNX1BEX0hDT0RFQywgMHgwKTsKKworCWlmIChnZXRfY3B1X3R5cGUoKSA+PSBNRVNPTl9DUFVfTUFKT1JfSURfU0MyKSB7CisJfSBlbHNlICB7CisJCS8qIFJlbW92ZSBIQ09ERUMgSVNPICovCisJCVdSSVRFX0FPUkVHKEFPX1JUSV9HRU5fUFdSX0lTTzAsCisJCQkJUkVBRF9BT1JFRyhBT19SVElfR0VOX1BXUl9JU08wKSAmCisJCQkJKChnZXRfY3B1X3R5cGUoKSA9PSBNRVNPTl9DUFVfTUFKT1JfSURfU00xIHx8CisJCQkJICBnZXRfY3B1X3R5cGUoKSA+PSBNRVNPTl9DUFVfTUFKT1JfSURfVE0yKQorCQkJCT8gfjB4MSA6IH4weDMwKSk7CisJfQorCXVkZWxheSgxMCk7CisJLyogRGlzYWJsZSBhdXRvLWNsb2NrIGdhdGUgKi8KKwlXUklURV9WUkVHKERPU19HRU5fQ1RSTDAsCisJCShSRUFEX1ZSRUcoRE9TX0dFTl9DVFJMMCkgfCAweDEpKTsKKwlXUklURV9WUkVHKERPU19HRU5fQ1RSTDAsCisJCShSRUFEX1ZSRUcoRE9TX0dFTl9DVFJMMCkgJiAweEZGRkZGRkZFKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOworCW1kZWxheSgxMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHMzMiBhdmNfcG93ZXJvZmYodm9pZCkKK3sKKwl1bG9uZyBmbGFnczsKKworCWlmIChnZXRfY3B1X3R5cGUoKSA+PSBNRVNPTl9DUFVfTUFKT1JfSURfU0MyKSB7CisJCWhjb2RlY19jbGtfY29uZmlnKDApOworCQl1ZGVsYXkoMjApOworCisJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1QzKSB7CisJCQl2ZGVjX3Bvd2Vyb2ZmKFZERUNfSENPREVDKTsKKwkJCXByX2VycigidmRlY19wb3dlcm9mZiBWREVDX0hDT0RFQ1xuIik7CisJCX0gZWxzZSB7CisJCQlwd3JfY3RybF9wc2NpX3NtYyhQRElEX1QzX0RPU19IQ09ERUMsIFBXUl9PRkYpOworCQkJcHJfZXJyKCJwd3JfY3RybF9wc2NpX3NtYyBQRElEX1QzX0RPU19IQ09ERUMgb25cbiIpOworCQl9CisJCXVkZWxheSgyMCk7CisJfSBlbHNlIHsKKwkJLyogZW5hYmxlIEhDT0RFQyBpc29sYXRpb24gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKKwkJV1JJVEVfQU9SRUcoQU9fUlRJX0dFTl9QV1JfSVNPMCwKKwkJCQlSRUFEX0FPUkVHKEFPX1JUSV9HRU5fUFdSX0lTTzApIHwKKwkJCQkoKGdldF9jcHVfdHlwZSgpID09IE1FU09OX0NQVV9NQUpPUl9JRF9TTTEgfHwKKwkJCQkgIGdldF9jcHVfdHlwZSgpID49IE1FU09OX0NQVV9NQUpPUl9JRF9UTTIpCisJCQkJPyAweDEgOiAweDMwKSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKKwkvKiBwb3dlciBvZmYgSENPREVDIG1lbW9yaWVzICovCisJV1JJVEVfVlJFRyhET1NfTUVNX1BEX0hDT0RFQywgMHhmZmZmZmZmZlVMKTsKKworCS8qIGRpc2FibGUgSENPREVDIGNsb2NrICovCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDMpIHsKKwkJV1JJVEVfVlJFR19CSVRTKERPU19HQ0xLX0VOMCwgMCwgMTIsIDE1KTsKKwl9IGVsc2UKKwkJaHZkZWNfY2xvY2tfZGlzYWJsZSgpOworCisJaWYgKGdldF9jcHVfdHlwZSgpID49IE1FU09OX0NQVV9NQUpPUl9JRF9TQzIpIHsKKworCX0gZWxzZSB7CisJCS8qIEhDT0RFQyBwb3dlciBvZmYgKi8KKwkJV1JJVEVfQU9SRUcoQU9fUlRJX0dFTl9QV1JfU0xFRVAwLAorCQkJCVJFQURfQU9SRUcoQU9fUlRJX0dFTl9QV1JfU0xFRVAwKSB8CisJCQkJKChnZXRfY3B1X3R5cGUoKSA9PSBNRVNPTl9DUFVfTUFKT1JfSURfU00xIHx8CisJCQkJICBnZXRfY3B1X3R5cGUoKSA+PSBNRVNPTl9DUFVfTUFKT1JfSURfVE0yKQorCQkJCT8gMHgxIDogMHgzKSk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOworCisJLyogcmVsZWFzZSBET1MgY2xrODEgY2xvY2sgZ2F0aW5nICovCisJYW1wb3J0c19zd2l0Y2hfZ2F0ZSgidmRlYyIsIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgczMyIHJlbG9hZF9tYyhzdHJ1Y3QgZW5jb2RlX3dxX3MgKndxKQoreworCWNvbnN0IGNoYXIgKnAgPSBzZWxlY3RfdWNvZGUoZW5jb2RlX21hbmFnZXIudWNvZGVfaW5kZXgpOworCisJYW12ZW5jX3N0b3AoKTsKKworCWlmIChnZXRfY3B1X3R5cGUoKSA+PSBNRVNPTl9DUFVfTUFKT1JfSURfU0MyICYmIHVzZV9yZXNldF9jb250cm9sKSB7CisJCWhjb2RlY19od19yZXNldCgpOworCX0gZWxzZSB7CisJCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMSwgMHhmZmZmZmZmZik7CisJCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMSwgMCk7CisJfQorCisJdWRlbGF5KDEwKTsKKworCVdSSVRFX0hSRUcoSENPREVDX0FTU0lTVF9NTUNfQ1RSTDEsIDB4MzIpOworCWVuY19wcihMT0dfSU5GTywgInJlbG9hZCBtaWNyb2NvZGVcbiIpOworCisJaWYgKGFtdmVuY19sb2FkbWMocCwgd3EpIDwgMCkKKwkJcmV0dXJuIC1FQlVTWTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZW5jb2RlX2lzcl90YXNrbGV0KHVsb25nIGRhdGEpCit7CisJc3RydWN0IGVuY29kZV9tYW5hZ2VyX3MgKm1hbmFnZXIgPSAoc3RydWN0IGVuY29kZV9tYW5hZ2VyX3MgKilkYXRhOworCisJZW5jX3ByKExPR19JTkZPLCAiZW5jb2RlciBpcyBkb25lICVkXG4iLCBtYW5hZ2VyLT5lbmNvZGVfaHdfc3RhdHVzKTsKKwlpZiAoKChtYW5hZ2VyLT5lbmNvZGVfaHdfc3RhdHVzID09IEVOQ09ERVJfSURSX0RPTkUpCisJCXx8IChtYW5hZ2VyLT5lbmNvZGVfaHdfc3RhdHVzID09IEVOQ09ERVJfTk9OX0lEUl9ET05FKQorCQl8fCAobWFuYWdlci0+ZW5jb2RlX2h3X3N0YXR1cyA9PSBFTkNPREVSX1NFUVVFTkNFX0RPTkUpCisJCXx8IChtYW5hZ2VyLT5lbmNvZGVfaHdfc3RhdHVzID09IEVOQ09ERVJfUElDVFVSRV9ET05FKSkKKwkJJiYgKG1hbmFnZXItPnByb2Nlc3NfaXJxKSkgeworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJm1hbmFnZXItPmV2ZW50Lmh3X2NvbXBsZXRlKTsKKwl9Cit9CisKKy8qIGlycSBmdW5jdGlvbiAqLworc3RhdGljIGlycXJldHVybl90IGVuY19pc3IoczMyIGlycV9udW1iZXIsIHZvaWQgKnBhcmEpCit7CisJc3RydWN0IGVuY29kZV9tYW5hZ2VyX3MgKm1hbmFnZXIgPSAoc3RydWN0IGVuY29kZV9tYW5hZ2VyX3MgKilwYXJhOworCisJZW5jX3ByKExPR19JTkZPLCAiKioqKipFTkNfSVNSKioqKipcbiIpOworCVdSSVRFX0hSRUcoSENPREVDX0lSUV9NQk9YX0NMUiwgMSk7CisKKwltYW5hZ2VyLT5lbmNvZGVfaHdfc3RhdHVzICA9IFJFQURfSFJFRyhFTkNPREVSX1NUQVRVUyk7CisJaWYgKChtYW5hZ2VyLT5lbmNvZGVfaHdfc3RhdHVzID09IEVOQ09ERVJfSURSX0RPTkUpCisJCXx8IChtYW5hZ2VyLT5lbmNvZGVfaHdfc3RhdHVzID09IEVOQ09ERVJfTk9OX0lEUl9ET05FKQorCQl8fCAobWFuYWdlci0+ZW5jb2RlX2h3X3N0YXR1cyA9PSBFTkNPREVSX1NFUVVFTkNFX0RPTkUpCisJCXx8IChtYW5hZ2VyLT5lbmNvZGVfaHdfc3RhdHVzID09IEVOQ09ERVJfUElDVFVSRV9ET05FKSkgeworCQllbmNfcHIoTE9HX0FMTCwgImVuY29kZXIgc3RhZ2UgaXMgJWRcbiIsCisJCQltYW5hZ2VyLT5lbmNvZGVfaHdfc3RhdHVzKTsKKwl9CisKKwlpZiAoKChtYW5hZ2VyLT5lbmNvZGVfaHdfc3RhdHVzID09IEVOQ09ERVJfSURSX0RPTkUpCisJCXx8IChtYW5hZ2VyLT5lbmNvZGVfaHdfc3RhdHVzID09IEVOQ09ERVJfTk9OX0lEUl9ET05FKQorCQl8fCAobWFuYWdlci0+ZW5jb2RlX2h3X3N0YXR1cyA9PSBFTkNPREVSX1NFUVVFTkNFX0RPTkUpCisJCXx8IChtYW5hZ2VyLT5lbmNvZGVfaHdfc3RhdHVzID09IEVOQ09ERVJfUElDVFVSRV9ET05FKSkKKwkJJiYgKCFtYW5hZ2VyLT5wcm9jZXNzX2lycSkpIHsKKwkJbWFuYWdlci0+cHJvY2Vzc19pcnEgPSB0cnVlOworCQlpZiAobWFuYWdlci0+ZW5jb2RlX2h3X3N0YXR1cyAhPSBFTkNPREVSX1NFUVVFTkNFX0RPTkUpCisJCQltYW5hZ2VyLT5uZWVkX3Jlc2V0ID0gdHJ1ZTsKKworCQl0YXNrbGV0X3NjaGVkdWxlKCZtYW5hZ2VyLT5lbmNvZGVfdGFza2xldCk7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHMzMiBjb252ZXJ0X3JlcXVlc3Qoc3RydWN0IGVuY29kZV93cV9zICp3cSwgdTMyICpjbWRfaW5mbykKK3sKKwlpbnQgaSA9IDA7CisJdTggKnB0cjsKKwl1MzIgZGF0YV9vZmZzZXQ7CisJdTMyIGNtZCA9IGNtZF9pbmZvWzBdOworCXVuc2lnbmVkIGxvbmcgcGFkZHIgPSAwOworCXN0cnVjdCBlbmNfZG1hX2NmZyAqY2ZnID0gTlVMTDsKKwlzMzIgcmV0ID0gMDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCisJaWYgKCF3cSkKKwkJcmV0dXJuIC0xOworCisJbWVtc2V0KCZ3cS0+cmVxdWVzdCwgMCwgc2l6ZW9mKHN0cnVjdCBlbmNvZGVfcmVxdWVzdF9zKSk7CisJd3EtPnJlcXVlc3QubWVfd2VpZ2h0ID0gTUVfV0VJR0hUX09GRlNFVDsKKwl3cS0+cmVxdWVzdC5pNF93ZWlnaHQgPSBJNE1CX1dFSUdIVF9PRkZTRVQ7CisJd3EtPnJlcXVlc3QuaTE2X3dlaWdodCA9IEkxNk1CX1dFSUdIVF9PRkZTRVQ7CisKKwlpZiAoY21kID09IEVOQ09ERVJfU0VRVUVOQ0UpIHsKKwkJd3EtPnJlcXVlc3QuY21kID0gY21kOworCQl3cS0+cmVxdWVzdC51Y29kZV9tb2RlID0gY21kX2luZm9bMV07CisJCXdxLT5yZXF1ZXN0LnF1YW50ID0gY21kX2luZm9bMl07CisJCXdxLT5yZXF1ZXN0LmZsdXNoX2ZsYWcgPSBjbWRfaW5mb1szXTsKKwkJLy93cS0+cmVxdWVzdC50aW1lb3V0ID0gY21kX2luZm9bNF07CisJCXdxLT5yZXF1ZXN0LnRpbWVvdXQgPSA1MDAwOyAvKiA1MDAwIG1zICovCisJfSBlbHNlIGlmICgoY21kID09IEVOQ09ERVJfSURSKSB8fCAoY21kID09IEVOQ09ERVJfTk9OX0lEUikpIHsKKwkJd3EtPnJlcXVlc3QuY21kID0gY21kOworCQl3cS0+cmVxdWVzdC51Y29kZV9tb2RlID0gY21kX2luZm9bMV07CisJCXdxLT5yZXF1ZXN0LnR5cGUgPSBjbWRfaW5mb1syXTsKKwkJd3EtPnJlcXVlc3QuZm10ID0gY21kX2luZm9bM107CisJCXdxLT5yZXF1ZXN0LnNyYyA9IGNtZF9pbmZvWzRdOworCQl3cS0+cmVxdWVzdC5mcmFtZXNpemUgPSBjbWRfaW5mb1s1XTsKKwkJd3EtPnJlcXVlc3QucXVhbnQgPSBjbWRfaW5mb1s2XTsKKwkJd3EtPnJlcXVlc3QuZmx1c2hfZmxhZyA9IGNtZF9pbmZvWzddOworCQl3cS0+cmVxdWVzdC50aW1lb3V0ID0gY21kX2luZm9bOF07CisJCXdxLT5yZXF1ZXN0LmNyb3BfdG9wID0gY21kX2luZm9bOV07CisJCXdxLT5yZXF1ZXN0LmNyb3BfYm90dG9tID0gY21kX2luZm9bMTBdOworCQl3cS0+cmVxdWVzdC5jcm9wX2xlZnQgPSBjbWRfaW5mb1sxMV07CisJCXdxLT5yZXF1ZXN0LmNyb3BfcmlnaHQgPSBjbWRfaW5mb1sxMl07CisJCXdxLT5yZXF1ZXN0LnNyY193ID0gY21kX2luZm9bMTNdOworCQl3cS0+cmVxdWVzdC5zcmNfaCA9IGNtZF9pbmZvWzE0XTsKKwkJd3EtPnJlcXVlc3Quc2NhbGVfZW5hYmxlID0gY21kX2luZm9bMTVdOworCisJCWVuY19wcihMT0dfSU5GTywgImh3ZW5jOiB3cS0+cGljLmVuY29kZXJfd2lkdGggJWQsICIsCisJCSAgICAgIHdxLT5waWMuZW5jb2Rlcl93aWR0aCk7CisJCWVuY19wcihMT0dfSU5GTywgIndxLT5waWMuZW5jb2Rlcl9oZWlnaHQ6JWQsIHJlcXVlc3QgZm10PSVkXG4iLAorCQkgICAgICB3cS0+cGljLmVuY29kZXJfaGVpZ2h0LCB3cS0+cmVxdWVzdC5mbXQpOworCisJCWlmICh3cS0+cGljLmVuY29kZXJfd2lkdGggPj0gMTI4MCAmJiB3cS0+cGljLmVuY29kZXJfaGVpZ2h0ID49IDcyMAorCQkJJiYgd3EtPnJlcXVlc3QuZm10ID09IEZNVF9SR0JBODg4OCAmJiB3cS0+cGljLmNvbG9yX3NwYWNlICE9IEdFMkRfRk9STUFUX0JUNjAxKSB7CisJCQl3cS0+cmVxdWVzdC5zY2FsZV9lbmFibGUgPSAxOworCQkJd3EtPnJlcXVlc3Quc3JjX3cgPSB3cS0+cGljLmVuY29kZXJfd2lkdGg7CisJCQl3cS0+cmVxdWVzdC5zcmNfaCA9IHdxLT5waWMuZW5jb2Rlcl9oZWlnaHQ7CisJCQllbmNfcHIoTE9HX0lORk8sICJod2VuYzogZm9yY2Ugd3EtPnJlcXVlc3Quc2NhbGVfZW5hYmxlPSVkXG4iLCB3cS0+cmVxdWVzdC5zY2FsZV9lbmFibGUpOworCQl9CisJCS8qCisJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1QzICYmIHdxLT5yZXF1ZXN0LnR5cGUgPT0gQ0FOVkFTX0JVRkYpIHsKKwkJCXdxLT5yZXF1ZXN0LnNjYWxlX2VuYWJsZSA9IDE7CisJCQl3cS0+cmVxdWVzdC5zcmNfdyA9IHdxLT5waWMuZW5jb2Rlcl93aWR0aDsKKwkJCXdxLT5yZXF1ZXN0LnNyY19oID0gd3EtPnBpYy5lbmNvZGVyX2hlaWdodDsKKwkJCWVuY19wcihMT0dfREVCVUcsICJod2VuYzogdDMgY2FudmFzIHNvdXJjZSwgZm9yY2Ugd3EtPnJlcXVlc3Quc2NhbGVfZW5hYmxlPSVkXG4iLCB3cS0+cmVxdWVzdC5zY2FsZV9lbmFibGUpOworCQl9CisJCSovCisKKwkJd3EtPnJlcXVlc3QubnJfbW9kZSA9CisJCQkobnJfbW9kZSA+IDApID8gbnJfbW9kZSA6IGNtZF9pbmZvWzE2XTsKKwkJaWYgKGNtZCA9PSBFTkNPREVSX0lEUikKKwkJCXdxLT5yZXF1ZXN0Lm5yX21vZGUgPSAwOworCisJCWRhdGFfb2Zmc2V0ID0gMTcgKworCQkJKHNpemVvZih3cS0+cXVhbnRfdGJsX2k0KQorCQkJKyBzaXplb2Yod3EtPnF1YW50X3RibF9pMTYpCisJCQkrIHNpemVvZih3cS0+cXVhbnRfdGJsX21lKSkgLyA0OworCisJCWlmICh3cS0+cmVxdWVzdC5xdWFudCA9PSBBREpVU1RFRF9RUF9GTEFHKSB7CisJCQlwdHIgPSAodTggKikgJmNtZF9pbmZvWzE3XTsKKwkJCW1lbWNweSh3cS0+cXVhbnRfdGJsX2k0LCBwdHIsCisJCQkJc2l6ZW9mKHdxLT5xdWFudF90YmxfaTQpKTsKKwkJCXB0ciArPSBzaXplb2Yod3EtPnF1YW50X3RibF9pNCk7CisJCQltZW1jcHkod3EtPnF1YW50X3RibF9pMTYsIHB0ciwKKwkJCQlzaXplb2Yod3EtPnF1YW50X3RibF9pMTYpKTsKKwkJCXB0ciArPSBzaXplb2Yod3EtPnF1YW50X3RibF9pMTYpOworCQkJbWVtY3B5KHdxLT5xdWFudF90YmxfbWUsIHB0ciwKKwkJCQlzaXplb2Yod3EtPnF1YW50X3RibF9tZSkpOworCQkJd3EtPnJlcXVlc3QuaTRfd2VpZ2h0IC09CisJCQkJY21kX2luZm9bZGF0YV9vZmZzZXQrK107CisJCQl3cS0+cmVxdWVzdC5pMTZfd2VpZ2h0IC09CisJCQkJY21kX2luZm9bZGF0YV9vZmZzZXQrK107CisJCQl3cS0+cmVxdWVzdC5tZV93ZWlnaHQgLT0KKwkJCQljbWRfaW5mb1tkYXRhX29mZnNldCsrXTsKKwkJCWlmIChxcF90YWJsZV9kZWJ1ZykgeworCQkJCXU4ICpxcF90YiA9ICh1OCAqKSgmd3EtPnF1YW50X3RibF9pNFswXSk7CisKKwkJCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQkJCQllbmNfcHIoTE9HX0lORk8sICIlZCAiLCAqcXBfdGIpOworCQkJCQlxcF90YisrOworCQkJCX0KKwkJCQllbmNfcHIoTE9HX0lORk8sICJcbiIpOworCisJCQkJcXBfdGIgPSAodTggKikoJndxLT5xdWFudF90YmxfaTE2WzBdKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQkJCQllbmNfcHIoTE9HX0lORk8sICIlZCAiLCAqcXBfdGIpOworCQkJCQlxcF90YisrOworCQkJCX0KKwkJCQllbmNfcHIoTE9HX0lORk8sICJcbiIpOworCisJCQkJcXBfdGIgPSAodTggKikoJndxLT5xdWFudF90YmxfbWVbMF0pOworCQkJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCQkJCWVuY19wcihMT0dfSU5GTywgIiVkICIsICpxcF90Yik7CisJCQkJCXFwX3RiKys7CisJCQkJfQorCQkJCWVuY19wcihMT0dfSU5GTywgIlxuIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQltZW1zZXQod3EtPnF1YW50X3RibF9tZSwgd3EtPnJlcXVlc3QucXVhbnQsCisJCQkJc2l6ZW9mKHdxLT5xdWFudF90YmxfbWUpKTsKKwkJCW1lbXNldCh3cS0+cXVhbnRfdGJsX2k0LCB3cS0+cmVxdWVzdC5xdWFudCwKKwkJCQlzaXplb2Yod3EtPnF1YW50X3RibF9pNCkpOworCQkJbWVtc2V0KHdxLT5xdWFudF90YmxfaTE2LCB3cS0+cmVxdWVzdC5xdWFudCwKKwkJCQlzaXplb2Yod3EtPnF1YW50X3RibF9pMTYpKTsKKwkJCWRhdGFfb2Zmc2V0ICs9IDM7CisJCX0KKwkJLy9hZGQgcXAgcmFuZ2UgY2hlY2sKKwkJZW5jX3ByKExPR19JTkZPLCAid3EtPnJlcXVlc3QucXVhbnQgJWQgXG4iLCB3cS0+cmVxdWVzdC5xdWFudCk7CisJCXsKKwkJCXU4ICpxcF90YiA9ICh1OCAqKSgmd3EtPnF1YW50X3RibF9pNFswXSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQkJCWlmICgqcXBfdGIgPiA1MSkgeworCQkJCQllbmNfcHIoTE9HX0VSUk9SLCAiaTQgJWQgIiwgKnFwX3RiKTsKKwkJCQkJKnFwX3RiID0gNTE7CisJCQkJfQorCQkJCXFwX3RiKys7CisJCQl9CisKKwkJCXFwX3RiID0gKHU4ICopKCZ3cS0+cXVhbnRfdGJsX2kxNlswXSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQkJCWlmICgqcXBfdGIgPiA1MSkgeworCQkJCQllbmNfcHIoTE9HX0VSUk9SLCAiaTE2ICVkICIsICpxcF90Yik7CisJCQkJCSpxcF90YiA9IDUxOworCQkJCX0KKwkJCQlxcF90YisrOworCQkJfQorCisJCQlxcF90YiA9ICh1OCAqKSgmd3EtPnF1YW50X3RibF9tZVswXSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQkJCWlmICgqcXBfdGIgPiA1MSkgeworCQkJCQllbmNfcHIoTE9HX0VSUk9SLCAibWUgJWQgIiwgKnFwX3RiKTsKKwkJCQkJKnFwX3RiID0gNTE7CisJCQkJfQorCQkJCXFwX3RiKys7CisJCQl9CisJCX0KKyNpZmRlZiBIMjY0X0VOQ19DQlIKKwkJd3EtPmNicl9pbmZvLmJsb2NrX3cgPSBjbWRfaW5mb1tkYXRhX29mZnNldCsrXTsKKwkJd3EtPmNicl9pbmZvLmJsb2NrX2ggPSBjbWRfaW5mb1tkYXRhX29mZnNldCsrXTsKKwkJd3EtPmNicl9pbmZvLmxvbmdfdGggPSBjbWRfaW5mb1tkYXRhX29mZnNldCsrXTsKKwkJd3EtPmNicl9pbmZvLnN0YXJ0X3RibF9pZCA9IGNtZF9pbmZvW2RhdGFfb2Zmc2V0KytdOworCQl3cS0+Y2JyX2luZm8uc2hvcnRfc2hpZnQgPSBDQlJfU0hPUlRfU0hJRlQ7CisJCXdxLT5jYnJfaW5mby5sb25nX21iX251bSA9IENCUl9MT05HX01CX05VTTsKKyNlbmRpZgorCQlkYXRhX29mZnNldCA9IDE3ICsKKwkJCQkoc2l6ZW9mKHdxLT5xdWFudF90YmxfaTQpCisJCQkJKyBzaXplb2Yod3EtPnF1YW50X3RibF9pMTYpCisJCQkJKyBzaXplb2Yod3EtPnF1YW50X3RibF9tZSkpIC8gNCArIDc7CisKKwkJaWYgKHdxLT5yZXF1ZXN0LnR5cGUgPT0gRE1BX0JVRkYpIHsKKwkJCXdxLT5yZXF1ZXN0LnBsYW5lX251bSA9IGNtZF9pbmZvW2RhdGFfb2Zmc2V0KytdOworCQkJZW5jX3ByKExPR19JTkZPLCAid3EtPnJlcXVlc3QucGxhbmVfbnVtICVkXG4iLAorCQkJCXdxLT5yZXF1ZXN0LnBsYW5lX251bSk7CisJCQlpZiAod3EtPnJlcXVlc3QuZm10ID09IEZNVF9OVjEyIHx8CisJCQkJd3EtPnJlcXVlc3QuZm10ID09IEZNVF9OVjIxIHx8CisJCQkJd3EtPnJlcXVlc3QuZm10ID09IEZNVF9ZVVY0MjApIHsKKwkJCQlpZiAod3EtPnJlcXVlc3QucGxhbmVfbnVtID4gMykgeworCQkJCQllbmNfcHIoTE9HX0VSUk9SLCAid3EtPnJlcXVlc3QucGxhbmVfbnVtIGlzIGludmFsaWQgJWQuXG4iLAorCQkJCQkJCXdxLT5yZXF1ZXN0LnBsYW5lX251bSk7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJZm9yIChpID0gMDsgaSA8IHdxLT5yZXF1ZXN0LnBsYW5lX251bTsgaSsrKSB7CisJCQkJCWNmZyA9ICZ3cS0+cmVxdWVzdC5kbWFfY2ZnW2ldOworCQkJCQljZmctPmRpciA9IERNQV9UT19ERVZJQ0U7CisJCQkJCWNmZy0+ZmQgPSBjbWRfaW5mb1tkYXRhX29mZnNldCsrXTsKKwkJCQkJcGRldiA9IGVuY29kZV9tYW5hZ2VyLnRoaXNfcGRldjsKKwkJCQkJY2ZnLT5kZXYgPSAmKHBkZXYtPmRldik7CisKKwkJCQkJcmV0ID0gZW5jX2RtYV9idWZfZ2V0X3BoeXMoY2ZnLCAmcGFkZHIpOworCQkJCQlpZiAocmV0IDwgMCkgeworCQkJCQkJZW5jX3ByKExPR19FUlJPUiwKKwkJCQkJCQkiaW1wb3J0IGZkICVkIGZhaWxlZFxuIiwKKwkJCQkJCQljZmctPmZkKTsKKwkJCQkJCWNmZy0+cGFkZHIgPSBOVUxMOworCQkJCQkJY2ZnLT52YWRkciA9IE5VTEw7CisJCQkJCQlyZXR1cm4gLTE7CisJCQkJCX0KKwkJCQkJY2ZnLT5wYWRkciA9ICh2b2lkICopcGFkZHI7CisJCQkJCWVuY19wcihMT0dfSU5GTywgInZhZGRyICVwXG4iLAorCQkJCQkJY2ZnLT52YWRkcik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQllbmNfcHIoTE9HX0VSUk9SLCAiZXJyb3IgZm10ID0gJWRcbiIsCisJCQkJCXdxLT5yZXF1ZXN0LmZtdCk7CisJCQl9CisJCX0KKworCX0gZWxzZSB7CisJCWVuY19wcihMT0dfRVJST1IsICJlcnJvciBjbWQgPSAlZCwgd3E6ICVwLlxuIiwKKwkJCWNtZCwgKHZvaWQgKil3cSk7CisJCXJldHVybiAtMTsKKwl9CisJd3EtPnJlcXVlc3QucGFyZW50ID0gd3E7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYW12ZW5jX2F2Y19zdGFydF9jbWQoc3RydWN0IGVuY29kZV93cV9zICp3cSwKKwkJCSAgc3RydWN0IGVuY29kZV9yZXF1ZXN0X3MgKnJlcXVlc3QpCit7CisJdTMyIHJlbG9hZF9mbGFnID0gMDsKKworCWlmIChyZXF1ZXN0LT51Y29kZV9tb2RlICE9IGVuY29kZV9tYW5hZ2VyLnVjb2RlX2luZGV4KSB7CisJCWVuY29kZV9tYW5hZ2VyLnVjb2RlX2luZGV4ID0gcmVxdWVzdC0+dWNvZGVfbW9kZTsKKwkJaWYgKHJlbG9hZF9tYyh3cSkpIHsKKwkJCWVuY19wcihMT0dfRVJST1IsCisJCQkJInJlbG9hZCBtYyBmYWlsLCB3cTolcFxuIiwgKHZvaWQgKil3cSk7CisJCQlyZXR1cm47CisJCX0KKwkJcmVsb2FkX2ZsYWcgPSAxOworCQllbmNvZGVfbWFuYWdlci5uZWVkX3Jlc2V0ID0gdHJ1ZTsKKwl9CisKKwl3cS0+aHdfc3RhdHVzID0gMDsKKwl3cS0+b3V0cHV0X3NpemUgPSAwOworCXdxLT51Y29kZV9pbmRleCA9IGVuY29kZV9tYW5hZ2VyLnVjb2RlX2luZGV4OworCisJaWVfbWVfbW9kZSA9ICgwICYgTUVfUElYRUxfTU9ERV9NQVNLKSA8PCBNRV9QSVhFTF9NT0RFX1NISUZUOworCisJaWYgKGVuY29kZV9tYW5hZ2VyLm5lZWRfcmVzZXQpIHsKKwkJYW12ZW5jX3N0b3AoKTsKKwkJcmVsb2FkX2ZsYWcgPSAxOworCQllbmNvZGVfbWFuYWdlci5uZWVkX3Jlc2V0ID0gZmFsc2U7CisJCWVuY29kZV9tYW5hZ2VyLmVuY29kZV9od19zdGF0dXMgPSBFTkNPREVSX0lETEU7CisJCWFtdmVuY19yZXNldCgpOworCQlhdmNfY2FudmFzX2luaXQod3EpOworCQlhdmNfaW5pdF9lbmNvZGVyKHdxLCAocmVxdWVzdC0+Y21kID09IEVOQ09ERVJfSURSKSA/IHRydWUgOiBmYWxzZSk7CisJCWF2Y19pbml0X2lucHV0X2J1ZmZlcih3cSk7CisJCWF2Y19pbml0X291dHB1dF9idWZmZXIod3EpOworCisJCWF2Y19wcm90X2luaXQoCisJCQl3cSwgcmVxdWVzdCwgcmVxdWVzdC0+cXVhbnQsCisJCQkocmVxdWVzdC0+Y21kID09IEVOQ09ERVJfSURSKSA/IHRydWUgOiBmYWxzZSk7CisKKwkJYXZjX2luaXRfYXNzaXRfYnVmZmVyKHdxKTsKKworCQllbmNfcHIoTE9HX0lORk8sCisJCQkiYmVnaW4gdG8gbmV3IGZyYW1lLCByZXF1ZXN0LT5jbWQ6ICVkLCB1Y29kZSBtb2RlOiAlZCwgd3E6JXBcbiIsCisJCQlyZXF1ZXN0LT5jbWQsIHJlcXVlc3QtPnVjb2RlX21vZGUsICh2b2lkICopd3EpOworCX0KKworCWlmICgocmVxdWVzdC0+Y21kID09IEVOQ09ERVJfSURSKSB8fAorCQkocmVxdWVzdC0+Y21kID09IEVOQ09ERVJfTk9OX0lEUikpIHsKKyNpZmRlZiBIMjY0X0VOQ19TVkMKKwkJLyogZW5jb2RlIG5vbiByZWZlcmVuY2UgZnJhbWUgb3Igbm90ICovCisJCWlmIChyZXF1ZXN0LT5jbWQgPT0gRU5DT0RFUl9JRFIpCisJCQl3cS0+cGljLm5vbl9yZWZfY250ID0gMDsgLy9JRFIgcmVzZXQgY291bnRlcgorCisJCWlmICh3cS0+cGljLmVuYWJsZV9zdmMgJiYgd3EtPnBpYy5ub25fcmVmX2NudCkgeworCQkJZW5jX3ByKExPR19JTkZPLAorCQkJCSJQSUMgaXMgTk9OIFJFRiBjbWQgJWQgY250ICVkIHZhbHVlIDB4JXhcbiIsCisJCQkJcmVxdWVzdC0+Y21kLCB3cS0+cGljLm5vbl9yZWZfY250LAorCQkJCUVOQ19TTENfTk9OX1JFRik7CisJCQlXUklURV9IUkVHKEgyNjRfRU5DX1NWQ19QSUNfVFlQRSwgRU5DX1NMQ19OT05fUkVGKTsKKwkJfSBlbHNlIHsKKwkJCWVuY19wcihMT0dfSU5GTywKKwkJCQkiUElDIGlzIFJFRiBjbWQgJWQgY250ICVkIHZhbCAweCV4XG4iLAorCQkJCXJlcXVlc3QtPmNtZCwgd3EtPnBpYy5ub25fcmVmX2NudCwKKwkJCQlFTkNfU0xDX1JFRik7CisJCQlXUklURV9IUkVHKEgyNjRfRU5DX1NWQ19QSUNfVFlQRSwgRU5DX1NMQ19SRUYpOworCQl9CisjZWxzZQorCQkvKiBpZiBGVyBkZWZpbmVkIGJ1dCBub3QgZGVmaW5lZCBTVkMgaW4gZHJpdmVyIGhlcmUqLworCQlXUklURV9IUkVHKEgyNjRfRU5DX1NWQ19QSUNfVFlQRSwgRU5DX1NMQ19SRUYpOworI2VuZGlmCisJCWF2Y19pbml0X2RibGtfYnVmZmVyKHdxLT5tZW0uZGJsa19idWZfY2FudmFzKTsKKwkJYXZjX2luaXRfcmVmZXJlbmNlX2J1ZmZlcih3cS0+bWVtLnJlZl9idWZfY2FudmFzKTsKKwl9CisJaWYgKChyZXF1ZXN0LT5jbWQgPT0gRU5DT0RFUl9JRFIpIHx8CisJCShyZXF1ZXN0LT5jbWQgPT0gRU5DT0RFUl9OT05fSURSKSkKKwkJc2V0X2lucHV0X2Zvcm1hdCh3cSwgcmVxdWVzdCk7CisKKwlpZiAocmVxdWVzdC0+Y21kID09IEVOQ09ERVJfSURSKQorCQlpZV9tZV9tYl90eXBlID0gSEVOQ19NQl9UeXBlX0k0TUI7CisJZWxzZSBpZiAocmVxdWVzdC0+Y21kID09IEVOQ09ERVJfTk9OX0lEUikKKwkJaWVfbWVfbWJfdHlwZSA9CisJCQkoSEVOQ19TS0lQX1JVTl9BVVRPIDw8IDE2KSB8CisJCQkoSEVOQ19NQl9UeXBlX0FVVE8gPDwgNCkgfAorCQkJKEhFTkNfTUJfVHlwZV9BVVRPIDw8IDApOworCWVsc2UKKwkJaWVfbWVfbWJfdHlwZSA9IDA7CisJYXZjX2luaXRfaWVfbWVfcGFyYW1ldGVyKHdxLCByZXF1ZXN0LT5xdWFudCk7CisKKyNpZmRlZiBNVUxUSV9TTElDRV9NQworCWlmIChmaXhlZF9zbGljZV9jZmcpCisJCVdSSVRFX0hSRUcoRklYRURfU0xJQ0VfQ0ZHLCBmaXhlZF9zbGljZV9jZmcpOworCWVsc2UgaWYgKHdxLT5waWMucm93c19wZXJfc2xpY2UgIT0KKwkJKHdxLT5waWMuZW5jb2Rlcl9oZWlnaHQgKyAxNSkgPj4gNCkgeworCQl1MzIgbWJfcGVyX3NsaWNlID0gKHdxLT5waWMuZW5jb2Rlcl9oZWlnaHQgKyAxNSkgPj4gNDsKKworCQltYl9wZXJfc2xpY2UgPSBtYl9wZXJfc2xpY2UgKiB3cS0+cGljLnJvd3NfcGVyX3NsaWNlOworCQlXUklURV9IUkVHKEZJWEVEX1NMSUNFX0NGRywgbWJfcGVyX3NsaWNlKTsKKwl9IGVsc2UKKwkJV1JJVEVfSFJFRyhGSVhFRF9TTElDRV9DRkcsIDApOworI2Vsc2UKKwlXUklURV9IUkVHKEZJWEVEX1NMSUNFX0NGRywgMCk7CisjZW5kaWYKKworCWVuY29kZV9tYW5hZ2VyLmVuY29kZV9od19zdGF0dXMgPSByZXF1ZXN0LT5jbWQ7CisJd3EtPmh3X3N0YXR1cyA9IHJlcXVlc3QtPmNtZDsKKwlXUklURV9IUkVHKEVOQ09ERVJfU1RBVFVTLCByZXF1ZXN0LT5jbWQpOworCWlmICgocmVxdWVzdC0+Y21kID09IEVOQ09ERVJfSURSKQorCQl8fCAocmVxdWVzdC0+Y21kID09IEVOQ09ERVJfTk9OX0lEUikKKwkJfHwgKHJlcXVlc3QtPmNtZCA9PSBFTkNPREVSX1NFUVVFTkNFKQorCQl8fCAocmVxdWVzdC0+Y21kID09IEVOQ09ERVJfUElDVFVSRSkpCisJCWVuY29kZV9tYW5hZ2VyLnByb2Nlc3NfaXJxID0gZmFsc2U7CisKKwlpZiAocmVsb2FkX2ZsYWcpCisJCWFtdmVuY19zdGFydCgpOworCWVuY19wcihMT0dfQUxMLCAiYW12ZW5jX2F2Y19zdGFydCBjbWQgb3V0LCByZXF1ZXN0OiVwLlxuIiwgKHZvaWQqKXJlcXVlc3QpOworfQorCitzdGF0aWMgdm9pZCBkbWFfZmx1c2godTMyIGJ1Zl9zdGFydCwgdTMyIGJ1Zl9zaXplKQoreworCWlmICgoYnVmX3N0YXJ0ID09IDApIHx8IChidWZfc2l6ZSA9PSAwKSkKKwkJcmV0dXJuOworCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKAorCQkmZW5jb2RlX21hbmFnZXIudGhpc19wZGV2LT5kZXYsIGJ1Zl9zdGFydCwKKwkJYnVmX3NpemUsIERNQV9UT19ERVZJQ0UpOworfQorCitzdGF0aWMgdm9pZCBjYWNoZV9mbHVzaCh1MzIgYnVmX3N0YXJ0LCB1MzIgYnVmX3NpemUpCit7CisJaWYgKChidWZfc3RhcnQgPT0gMCkgfHwgKGJ1Zl9zaXplID09IDApKQorCQlyZXR1cm47CisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoCisJCSZlbmNvZGVfbWFuYWdlci50aGlzX3BkZXYtPmRldiwgYnVmX3N0YXJ0LAorCQlidWZfc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKK30KKworc3RhdGljIHUzMiBnZXRidWZmZXIoc3RydWN0IGVuY29kZV93cV9zICp3cSwgdTMyIHR5cGUpCit7CisJdTMyIHJldCA9IDA7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEVOQ09ERVJfQlVGRkVSX0lOUFVUOgorCQlyZXQgPSB3cS0+bWVtLmRjdF9idWZmX3N0YXJ0X2FkZHI7CisJCWJyZWFrOworCWNhc2UgRU5DT0RFUl9CVUZGRVJfUkVGMDoKKwkJcmV0ID0gd3EtPm1lbS5kY3RfYnVmZl9zdGFydF9hZGRyICsKKwkJCXdxLT5tZW0uYnVmc3BlYy5kZWMwX3kuYnVmX3N0YXJ0OworCQlicmVhazsKKwljYXNlIEVOQ09ERVJfQlVGRkVSX1JFRjE6CisJCXJldCA9IHdxLT5tZW0uZGN0X2J1ZmZfc3RhcnRfYWRkciArCisJCQl3cS0+bWVtLmJ1ZnNwZWMuZGVjMV95LmJ1Zl9zdGFydDsKKwkJYnJlYWs7CisJY2FzZSBFTkNPREVSX0JVRkZFUl9PVVRQVVQ6CisJCXJldCA9IHdxLT5tZW0uQml0c3RyZWFtU3RhcnQ7CisJCWJyZWFrOworCWNhc2UgRU5DT0RFUl9CVUZGRVJfRFVNUDoKKwkJcmV0ID0gd3EtPm1lbS5kdW1wX2luZm9fZGRyX3N0YXJ0X2FkZHI7CisJCWJyZWFrOworCWNhc2UgRU5DT0RFUl9CVUZGRVJfQ0JSOgorCQlyZXQgPSB3cS0+bWVtLmNicl9pbmZvX2Rkcl9zdGFydF9hZGRyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworczMyIGFtdmVuY19hdmNfc3RhcnQoc3RydWN0IGVuY29kZV93cV9zICp3cSwgdTMyIGNsb2NrKQoreworCWNvbnN0IGNoYXIgKnAgPSBzZWxlY3RfdWNvZGUoZW5jb2RlX21hbmFnZXIudWNvZGVfaW5kZXgpOworCisJYXZjX3Bvd2Vyb24oY2xvY2spOworCisJYXZjX2NhbnZhc19pbml0KHdxKTsKKworCVdSSVRFX0hSRUcoSENPREVDX0FTU0lTVF9NTUNfQ1RSTDEsIDB4MzIpOworCisJaWYgKGFtdmVuY19sb2FkbWMocCwgd3EpIDwgMCkKKwkJcmV0dXJuIC1FQlVTWTsKKwllbmNvZGVfbWFuYWdlci5uZWVkX3Jlc2V0ID0gdHJ1ZTsKKwllbmNvZGVfbWFuYWdlci5wcm9jZXNzX2lycSA9IGZhbHNlOworCWVuY29kZV9tYW5hZ2VyLmVuY29kZV9od19zdGF0dXMgPSBFTkNPREVSX0lETEU7CisJYW12ZW5jX3Jlc2V0KCk7CisJYXZjX2luaXRfZW5jb2Rlcih3cSwgdHJ1ZSk7CisJYXZjX2luaXRfaW5wdXRfYnVmZmVyKHdxKTsgIC8qIGRjdCBidWZmZXIgc2V0dGluZyAqLworCWF2Y19pbml0X291dHB1dF9idWZmZXIod3EpOyAgLyogb3V0cHV0IHN0cmVhbSBidWZmZXIgKi8KKworCWllX21lX21vZGUgPSAoMCAmIE1FX1BJWEVMX01PREVfTUFTSykgPDwgTUVfUElYRUxfTU9ERV9TSElGVDsKKwlhdmNfcHJvdF9pbml0KHdxLCBOVUxMLCB3cS0+cGljLmluaXRfcXBwaWN0dXJlLCB0cnVlKTsKKwlpZiAocmVxdWVzdF9pcnEoZW5jb2RlX21hbmFnZXIuaXJxX251bSwgZW5jX2lzciwgSVJRRl9TSEFSRUQsCisJCSJlbmMtaXJxIiwgKHZvaWQgKikmZW5jb2RlX21hbmFnZXIpID09IDApCisJCWVuY29kZV9tYW5hZ2VyLmlycV9yZXF1ZXN0ZWQgPSB0cnVlOworCWVsc2UKKwkJZW5jb2RlX21hbmFnZXIuaXJxX3JlcXVlc3RlZCA9IGZhbHNlOworCisJLyogZGVjb2RlciBidWZmZXIgLCBuZWVkIHNldCBiZWZvcmUgZWFjaCBmcmFtZSBzdGFydCAqLworCWF2Y19pbml0X2RibGtfYnVmZmVyKHdxLT5tZW0uZGJsa19idWZfY2FudmFzKTsKKwkvKiByZWZlcmVuY2UgIGJ1ZmZlciAsIG5lZWQgc2V0IGJlZm9yZSBlYWNoIGZyYW1lIHN0YXJ0ICovCisJYXZjX2luaXRfcmVmZXJlbmNlX2J1ZmZlcih3cS0+bWVtLnJlZl9idWZfY2FudmFzKTsKKwlhdmNfaW5pdF9hc3NpdF9idWZmZXIod3EpOyAvKiBhc3NpdGFudCBidWZmZXIgZm9yIG1pY3JvY29kZSAqLworCWllX21lX21iX3R5cGUgPSAwOworCWF2Y19pbml0X2llX21lX3BhcmFtZXRlcih3cSwgd3EtPnBpYy5pbml0X3FwcGljdHVyZSk7CisJV1JJVEVfSFJFRyhFTkNPREVSX1NUQVRVUywgRU5DT0RFUl9JRExFKTsKKworI2lmZGVmIE1VTFRJX1NMSUNFX01DCisJaWYgKGZpeGVkX3NsaWNlX2NmZykKKwkJV1JJVEVfSFJFRyhGSVhFRF9TTElDRV9DRkcsIGZpeGVkX3NsaWNlX2NmZyk7CisJZWxzZSBpZiAod3EtPnBpYy5yb3dzX3Blcl9zbGljZSAhPQorCQkod3EtPnBpYy5lbmNvZGVyX2hlaWdodCArIDE1KSA+PiA0KSB7CisJCXUzMiBtYl9wZXJfc2xpY2UgPSAod3EtPnBpYy5lbmNvZGVyX2hlaWdodCArIDE1KSA+PiA0OworCisJCW1iX3Blcl9zbGljZSA9IG1iX3Blcl9zbGljZSAqIHdxLT5waWMucm93c19wZXJfc2xpY2U7CisJCVdSSVRFX0hSRUcoRklYRURfU0xJQ0VfQ0ZHLCBtYl9wZXJfc2xpY2UpOworCX0gZWxzZQorCQlXUklURV9IUkVHKEZJWEVEX1NMSUNFX0NGRywgMCk7CisjZWxzZQorCVdSSVRFX0hSRUcoRklYRURfU0xJQ0VfQ0ZHLCAwKTsKKyNlbmRpZgorCisJYW12ZW5jX3N0YXJ0KCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBhbXZlbmNfYXZjX3N0b3Aodm9pZCkKK3sKKwlpZiAoKGVuY29kZV9tYW5hZ2VyLmlycV9udW0gPj0gMCkgJiYKKwkJKGVuY29kZV9tYW5hZ2VyLmlycV9yZXF1ZXN0ZWQgPT0gdHJ1ZSkpIHsKKwkJZW5jb2RlX21hbmFnZXIuaXJxX3JlcXVlc3RlZCA9IGZhbHNlOworCQlmcmVlX2lycShlbmNvZGVfbWFuYWdlci5pcnFfbnVtLCAmZW5jb2RlX21hbmFnZXIpOworCX0KKwlhbXZlbmNfc3RvcCgpOworCWF2Y19wb3dlcm9mZigpOworfQorCitzdGF0aWMgczMyIGF2Y19pbml0KHN0cnVjdCBlbmNvZGVfd3FfcyAqd3EpCit7CisJczMyIHIgPSAwOworCisJZW5jb2RlX21hbmFnZXIudWNvZGVfaW5kZXggPSB3cS0+dWNvZGVfaW5kZXg7CisJciA9IGFtdmVuY19hdmNfc3RhcnQod3EsIGNsb2NrX2xldmVsKTsKKworCWVuY19wcihMT0dfREVCVUcsCisJCSJpbml0IGF2YyBlbmNvZGUuIG1pY3JvY29kZSAlZCwgcmV0PSVkLCB3cTolcHhcbiIsCisJCWVuY29kZV9tYW5hZ2VyLnVjb2RlX2luZGV4LCByLCAodm9pZCAqKXdxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHMzMiBhbXZlbmNfYXZjX2xpZ2h0X3Jlc2V0KHN0cnVjdCBlbmNvZGVfd3FfcyAqd3EsIHUzMiB2YWx1ZSkKK3sKKwlzMzIgciA9IDA7CisKKwlhbXZlbmNfYXZjX3N0b3AoKTsKKworCW1kZWxheSh2YWx1ZSk7CisKKwllbmNvZGVfbWFuYWdlci51Y29kZV9pbmRleCA9IFVDT0RFX01PREVfRlVMTDsKKwlyID0gYW12ZW5jX2F2Y19zdGFydCh3cSwgY2xvY2tfbGV2ZWwpOworCisJZW5jX3ByKExPR19ERUJVRywKKwkJImFtdmVuY19hdmNfbGlnaHRfcmVzZXQgZmluaXNoLCB3cTolcHgsIHJldD0lZFxuIiwKKwkJICh2b2lkICopd3EsIHIpOworCXJldHVybiByOworfQorCisjaWZkZWYgQ09ORklHX0NNQQorc3RhdGljIHUzMiBjaGVja0NNQSh2b2lkKQoreworCXUzMiByZXQ7CisKKwlpZiAoZW5jb2RlX21hbmFnZXIuY21hX3Bvb2xfc2l6ZSA+IDApIHsKKwkJcmV0ID0gZW5jb2RlX21hbmFnZXIuY21hX3Bvb2xfc2l6ZTsKKwkJcmV0ID0gcmV0IC8gTUlOX1NJWkU7CisJfSBlbHNlCisJCXJldCA9IDA7CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisvKiBmaWxlIG9wZXJhdGlvbiAqLworc3RhdGljIHMzMiBhbXZlbmNfYXZjX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJczMyIHIgPSAwOworCXN0cnVjdCBlbmNvZGVfd3FfcyAqd3EgPSBOVUxMOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwllbmNfcHIoTE9HX0RFQlVHLCAiYXZjIG9wZW5cbiIpOworCisjaWZkZWYgQ09ORklHX0FNX0pQRUdfRU5DT0RFUgorCWlmIChqcGVnZW5jX29uKCkgPT0gdHJ1ZSkgeworCQllbmNfcHIoTE9HX0VSUk9SLAorCQkJImhjb2RlYyBpbiB1c2UgZm9yIEpQRUcgRW5jb2RlIG5vdy5cbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NNQQorCWlmICgoZW5jb2RlX21hbmFnZXIudXNlX3Jlc2VydmUgPT0gZmFsc2UpICYmCisJICAgIChlbmNvZGVfbWFuYWdlci5jaGVja19jbWEgPT0gZmFsc2UpKSB7CisJCWVuY29kZV9tYW5hZ2VyLm1heF9pbnN0YW5jZSA9IGNoZWNrQ01BKCk7CisJCWlmIChlbmNvZGVfbWFuYWdlci5tYXhfaW5zdGFuY2UgPiAwKSB7CisJCQllbmNfcHIoTE9HX0RFQlVHLAorCQkJCSJhbXZlbmNfYXZjICBjaGVjayBDTUEgcG9vbCBzdWNjZXNzLCBtYXggaW5zdGFuY2U6ICVkLlxuIiwKKwkJCQllbmNvZGVfbWFuYWdlci5tYXhfaW5zdGFuY2UpOworCQl9IGVsc2UgeworCQkJZW5jX3ByKExPR19FUlJPUiwKKwkJCQkiYW12ZW5jX2F2YyBDTUEgcG9vbCB0b28gc21hbGwuXG4iKTsKKwkJfQorCQllbmNvZGVfbWFuYWdlci5jaGVja19jbWEgPSB0cnVlOworCX0KKyNlbmRpZgorCisJd3EgPSBjcmVhdGVfZW5jb2RlX3dvcmtfcXVldWUoKTsKKwlpZiAod3EgPT0gTlVMTCkgeworCQllbmNfcHIoTE9HX0VSUk9SLCAiYW12ZW5jX2F2YyBjcmVhdGUgaW5zdGFuY2UgZmFpbC5cbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworI2lmZGVmIENPTkZJR19DTUEKKwlpZiAoZW5jb2RlX21hbmFnZXIudXNlX3Jlc2VydmUgPT0gZmFsc2UpIHsKKwkJd3EtPm1lbS5idWZfc3RhcnQgPSBjb2RlY19tbV9hbGxvY19mb3JfZG1hKEVOQ09ERV9OQU1FLAorCQkJTUlOX1NJWkUgID4+IFBBR0VfU0hJRlQsIDAsCisJCQlDT0RFQ19NTV9GTEFHU19DUFUpOworCQlpZiAod3EtPm1lbS5idWZfc3RhcnQpIHsKKwkJCXdxLT5tZW0uYnVmX3NpemUgPSBNSU5fU0laRTsKKwkJCWVuY19wcihMT0dfREVCVUcsCisJCQkJImFsbG9jYXRpbmcgcGh5cyAweCV4LCBzaXplICVkaywgd3E6JXAuXG4iLAorCQkJCXdxLT5tZW0uYnVmX3N0YXJ0LAorCQkJCXdxLT5tZW0uYnVmX3NpemUgPj4gMTAsICh2b2lkICopd3EpOworCQl9IGVsc2UgeworCQkJZW5jX3ByKExPR19FUlJPUiwKKwkJCQkiQ01BIGZhaWxlZCB0byBhbGxvY2F0ZSBkbWEgYnVmZmVyIGZvciAlcywgd3E6JXAuXG4iLAorCQkJCWVuY29kZV9tYW5hZ2VyLnRoaXNfcGRldi0+bmFtZSwKKwkJCQkodm9pZCAqKXdxKTsKKwkJCWRlc3Ryb3lfZW5jb2RlX3dvcmtfcXVldWUod3EpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisjZW5kaWYKKworCWlmICh3cS0+bWVtLmJ1Zl9zdGFydCA9PSAwIHx8CisJCXdxLT5tZW0uYnVmX3NpemUgPCBNSU5fU0laRSkgeworCQllbmNfcHIoTE9HX0VSUk9SLAorCQkJImFsbG9jIG1lbSBmYWlsZWQsIHN0YXJ0OiAweCV4LCBzaXplOjB4JXgsIHdxOiVwLlxuIiwKKwkJCXdxLT5tZW0uYnVmX3N0YXJ0LAorCQkJd3EtPm1lbS5idWZfc2l6ZSwgKHZvaWQgKil3cSk7CisJCWRlc3Ryb3lfZW5jb2RlX3dvcmtfcXVldWUod3EpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1jcHkoJndxLT5tZW0uYnVmc3BlYywgJmFtdmVuY19idWZmc3BlY1swXSwKKwkJc2l6ZW9mKHN0cnVjdCBCdWZmSW5mb19zKSk7CisKKwllbmNfcHIoTE9HX0RFQlVHLAorCQkiYW12ZW5jX2F2YyAgbWVtb3J5IGNvbmZpZyBzdWNjZXNzLCBidWZmIHN0YXJ0OjB4JXgsIHNpemUgaXMgMHgleCwgd3E6JXAuXG4iLAorCQl3cS0+bWVtLmJ1Zl9zdGFydCwgd3EtPm1lbS5idWZfc2l6ZSwgKHZvaWQgKil3cSk7CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKSB3cTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHMzMiBhbXZlbmNfYXZjX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGVuY29kZV93cV9zICp3cSA9IChzdHJ1Y3QgZW5jb2RlX3dxX3MgKilmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAod3EpIHsKKwkJZW5jX3ByKExPR19ERUJVRywgImF2YyByZWxlYXNlLCB3cTolcFxuIiwgKHZvaWQgKil3cSk7CisJCWRlc3Ryb3lfZW5jb2RlX3dvcmtfcXVldWUod3EpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgYW12ZW5jX2F2Y19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdTMyIGNtZCwgdWxvbmcgYXJnKQoreworCWxvbmcgciA9IDA7CisJdTMyIGFtcmlzY19jbWQgPSAwOworCXN0cnVjdCBlbmNvZGVfd3FfcyAqd3EgPSAoc3RydWN0IGVuY29kZV93cV9zICopZmlsZS0+cHJpdmF0ZV9kYXRhOworI2RlZmluZSBNQVhfQUREUl9JTkZPX1NJWkUgNTIKKwl1MzIgYWRkcl9pbmZvW01BWF9BRERSX0lORk9fU0laRSArIDRdOworCXVsb25nIGFyZ1Y7CisJdTMyIGJ1Zl9zdGFydDsKKwlzMzIgY2FudmFzID0gLTE7CisJc3RydWN0IGNhbnZhc19zIGRzdDsKKwl1MzIgY3B1aWQ7CisJbWVtc2V0KCZkc3QsIDAsIHNpemVvZihzdHJ1Y3QgY2FudmFzX3MpKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQU1WRU5DX0FWQ19JT0NfR0VUX0FERFI6CisJCWlmICgod3EtPm1lbS5yZWZfYnVmX2NhbnZhcyAmIDB4ZmYpID09IChFTkNfQ0FOVkFTX09GRlNFVCkpCisJCQlwdXRfdXNlcigxLCAodTMyICopYXJnKTsKKwkJZWxzZQorCQkJcHV0X3VzZXIoMiwgKHUzMiAqKWFyZyk7CisJCWJyZWFrOworCWNhc2UgQU1WRU5DX0FWQ19JT0NfSU5QVVRfVVBEQVRFOgorCQlicmVhazsKKwljYXNlIEFNVkVOQ19BVkNfSU9DX05FV19DTUQ6CisJCWlmIChjb3B5X2Zyb21fdXNlcihhZGRyX2luZm8sICh2b2lkICopYXJnLAorCQkJTUFYX0FERFJfSU5GT19TSVpFICogc2l6ZW9mKHUzMikpKSB7CisJCQllbmNfcHIoTE9HX0VSUk9SLAorCQkJCSJhdmMgZ2V0IG5ldyBjbWQgZXJyb3IsIHdxOiVwLlxuIiwgKHZvaWQgKil3cSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJciA9IGNvbnZlcnRfcmVxdWVzdCh3cSwgYWRkcl9pbmZvKTsKKwkJaWYgKHIgPT0gMCkKKwkJCXIgPSBlbmNvZGVfd3FfYWRkX3JlcXVlc3Qod3EpOworCQlpZiAocikgeworCQkJZW5jX3ByKExPR19FUlJPUiwKKwkJCQkiYXZjIGFkZCBuZXcgcmVxdWVzdCBlcnJvciwgd3E6JXAuXG4iLAorCQkJCSh2b2lkICopd3EpOworCQl9CisJCWJyZWFrOworCWNhc2UgQU1WRU5DX0FWQ19JT0NfR0VUX1NUQUdFOgorCQlwdXRfdXNlcih3cS0+aHdfc3RhdHVzLCAodTMyICopYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBBTVZFTkNfQVZDX0lPQ19HRVRfT1VUUFVUX1NJWkU6CisJCWFkZHJfaW5mb1swXSA9IHdxLT5vdXRwdXRfc2l6ZTsKKwkJYWRkcl9pbmZvWzFdID0gd3EtPm1lX3dlaWdodDsKKwkJYWRkcl9pbmZvWzJdID0gd3EtPmk0X3dlaWdodDsKKwkJYWRkcl9pbmZvWzNdID0gd3EtPmkxNl93ZWlnaHQ7CisJCXIgPSBjb3B5X3RvX3VzZXIoKHUzMiAqKWFyZywKKwkJCWFkZHJfaW5mbywgNCAqIHNpemVvZih1MzIpKTsKKwkJYnJlYWs7CisJY2FzZSBBTVZFTkNfQVZDX0lPQ19DT05GSUdfSU5JVDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGFkZHJfaW5mbywgKHZvaWQgKilhcmcsCisJCQlNQVhfQUREUl9JTkZPX1NJWkUgKiBzaXplb2YodTMyKSkpIHsKKwkJCWVuY19wcihMT0dfRVJST1IsCisJCQkJImF2YyBjb25maWcgaW5pdCBlcnJvciwgd3E6JXAuXG4iLCAodm9pZCAqKXdxKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQl3cS0+dWNvZGVfaW5kZXggPSBVQ09ERV9NT0RFX0ZVTEw7CisjaWZkZWYgTVVMVElfU0xJQ0VfTUMKKwkJd3EtPnBpYy5yb3dzX3Blcl9zbGljZSA9IGFkZHJfaW5mb1sxXTsKKwkJZW5jX3ByKExPR19ERUJVRywKKwkJCSJhdmMgaW5pdCAtLSByb3dzX3Blcl9zbGljZTogJWQsIHdxOiAlcC5cbiIsCisJCQl3cS0+cGljLnJvd3NfcGVyX3NsaWNlLCAodm9pZCAqKXdxKTsKKyNlbmRpZgorCQllbmNfcHIoTE9HX0RFQlVHLAorCQkJImF2YyBpbml0IGFzIG1vZGUgJWQsIHdxOiAlcHguXG4iLAorCQkJd3EtPnVjb2RlX2luZGV4LCAodm9pZCAqKXdxKTsKKworCQlpZiAoYWRkcl9pbmZvWzJdID4gd3EtPm1lbS5idWZzcGVjLm1heF93aWR0aCB8fAorCQkgICAgYWRkcl9pbmZvWzNdID4gd3EtPm1lbS5idWZzcGVjLm1heF9oZWlnaHQpIHsKKwkJCWVuY19wcihMT0dfRVJST1IsCisJCQkJImF2YyBjb25maWcgaW5pdC0gZW5jb2RlIHNpemUgJWR4JWQgaXMgbGFyZ2VyIHRoYW4gc3VwcG9ydGVkICglZHglZCkuICB3cTolcC5cbiIsCisJCQkJYWRkcl9pbmZvWzJdLCBhZGRyX2luZm9bM10sCisJCQkJd3EtPm1lbS5idWZzcGVjLm1heF93aWR0aCwKKwkJCQl3cS0+bWVtLmJ1ZnNwZWMubWF4X2hlaWdodCwgKHZvaWQgKil3cSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQl3cS0+cGljLmVuY29kZXJfd2lkdGggPSBhZGRyX2luZm9bMl07CisJCXdxLT5waWMuZW5jb2Rlcl9oZWlnaHQgPSBhZGRyX2luZm9bM107CisJCXByX2VycigiaHdlbmM6IEFNVkVOQ19BVkNfSU9DX0NPTkZJR19JTklUOiB3OiVkLCBoOiVkXG4iLCB3cS0+cGljLmVuY29kZXJfd2lkdGgsIHdxLT5waWMuZW5jb2Rlcl9oZWlnaHQpOworCisJCXdxLT5waWMuY29sb3Jfc3BhY2UgPSBhZGRyX2luZm9bNF07CisJCXByX2VycigiaHdlbmM6IEFNVkVOQ19BVkNfSU9DX0NPTkZJR19JTklULCB3cS0+cGljLmNvbG9yX3NwYWNlPSUjeFxuIiwgd3EtPnBpYy5jb2xvcl9zcGFjZSk7CisKKwkJLyoKKwkJaWYgKHdxLT5waWMuZW5jb2Rlcl93aWR0aCAqCisJCQl3cS0+cGljLmVuY29kZXJfaGVpZ2h0ID49IDEyODAgKiA3MjApCisJCQljbG9ja19sZXZlbCA9IDY7CisJCWVsc2UKKwkJCWNsb2NrX2xldmVsID0gNTsKKwkJKi8KKwkJYXZjX2J1ZmZzcGVjX2luaXQod3EpOworCQljb21wbGV0ZSgmZW5jb2RlX21hbmFnZXIuZXZlbnQucmVxdWVzdF9pbl9jb20pOworCQlhZGRyX2luZm9bMV0gPSB3cS0+bWVtLmJ1ZnNwZWMuZGN0LmJ1Zl9zdGFydDsKKwkJYWRkcl9pbmZvWzJdID0gd3EtPm1lbS5idWZzcGVjLmRjdC5idWZfc2l6ZTsKKwkJYWRkcl9pbmZvWzNdID0gd3EtPm1lbS5idWZzcGVjLmJpdHN0cmVhbS5idWZfc3RhcnQ7CisJCWFkZHJfaW5mb1s0XSA9IHdxLT5tZW0uYnVmc3BlYy5iaXRzdHJlYW0uYnVmX3NpemU7CisJCWFkZHJfaW5mb1s1XSA9IHdxLT5tZW0uYnVmc3BlYy5zY2FsZV9idWZmLmJ1Zl9zdGFydDsKKwkJYWRkcl9pbmZvWzZdID0gd3EtPm1lbS5idWZzcGVjLnNjYWxlX2J1ZmYuYnVmX3NpemU7CisJCWFkZHJfaW5mb1s3XSA9IHdxLT5tZW0uYnVmc3BlYy5kdW1wX2luZm8uYnVmX3N0YXJ0OworCQlhZGRyX2luZm9bOF0gPSB3cS0+bWVtLmJ1ZnNwZWMuZHVtcF9pbmZvLmJ1Zl9zaXplOworCQlhZGRyX2luZm9bOV0gPSB3cS0+bWVtLmJ1ZnNwZWMuY2JyX2luZm8uYnVmX3N0YXJ0OworCQlhZGRyX2luZm9bMTBdID0gd3EtPm1lbS5idWZzcGVjLmNicl9pbmZvLmJ1Zl9zaXplOworCQlyID0gY29weV90b191c2VyKCh1MzIgKilhcmcsIGFkZHJfaW5mbywgMTEqc2l6ZW9mKHUzMikpOworCQlicmVhazsKKwljYXNlIEFNVkVOQ19BVkNfSU9DX0ZMVVNIX0NBQ0hFOgorCQlpZiAoY29weV9mcm9tX3VzZXIoYWRkcl9pbmZvLCAodm9pZCAqKWFyZywKKwkJCQkgICBNQVhfQUREUl9JTkZPX1NJWkUgKiBzaXplb2YodTMyKSkpIHsKKwkJCWVuY19wcihMT0dfRVJST1IsCisJCQkJImF2YyBmbHVzaCBjYWNoZSBlcnJvciwgd3E6ICVwLlxuIiwgKHZvaWQgKil3cSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYnVmX3N0YXJ0ID0gZ2V0YnVmZmVyKHdxLCBhZGRyX2luZm9bMF0pOworCQlkbWFfZmx1c2goYnVmX3N0YXJ0ICsgYWRkcl9pbmZvWzFdLAorCQkJYWRkcl9pbmZvWzJdIC0gYWRkcl9pbmZvWzFdKTsKKwkJYnJlYWs7CisJY2FzZSBBTVZFTkNfQVZDX0lPQ19GTFVTSF9ETUE6CisJCWlmIChjb3B5X2Zyb21fdXNlcihhZGRyX2luZm8sICh2b2lkICopYXJnLAorCQkJCU1BWF9BRERSX0lORk9fU0laRSAqIHNpemVvZih1MzIpKSkgeworCQkJZW5jX3ByKExPR19FUlJPUiwKKwkJCQkiYXZjIGZsdXNoIGRtYSBlcnJvciwgd3E6JXAuXG4iLCAodm9pZCAqKXdxKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlidWZfc3RhcnQgPSBnZXRidWZmZXIod3EsIGFkZHJfaW5mb1swXSk7CisJCWNhY2hlX2ZsdXNoKGJ1Zl9zdGFydCArIGFkZHJfaW5mb1sxXSwKKwkJCWFkZHJfaW5mb1syXSAtIGFkZHJfaW5mb1sxXSk7CisJCWJyZWFrOworCWNhc2UgQU1WRU5DX0FWQ19JT0NfR0VUX0JVRkZJTkZPOgorCQlwdXRfdXNlcih3cS0+bWVtLmJ1Zl9zaXplLCAodTMyICopYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBBTVZFTkNfQVZDX0lPQ19HRVRfREVWSU5GTzoKKwkJaWYgKGdldF9jcHVfdHlwZSgpID49IE1FU09OX0NQVV9NQUpPUl9JRF9HWEwpIHsKKwkJCS8qIHNlbmQgdGhlIHNhbWUgaWQgYXMgR1hUVkJCIHRvIHVwcGVyKi8KKwkJCXIgPSBjb3B5X3RvX3VzZXIoKHM4ICopYXJnLCBBTVZFTkNfREVWSU5GT19HWFRWQkIsCisJCQkJc3RybGVuKEFNVkVOQ19ERVZJTkZPX0dYVFZCQikpOworCQl9IGVsc2UgaWYgKGdldF9jcHVfdHlwZSgpID09IE1FU09OX0NQVV9NQUpPUl9JRF9HWFRWQkIpIHsKKwkJCXIgPSBjb3B5X3RvX3VzZXIoKHM4ICopYXJnLCBBTVZFTkNfREVWSU5GT19HWFRWQkIsCisJCQkJc3RybGVuKEFNVkVOQ19ERVZJTkZPX0dYVFZCQikpOworCQl9IGVsc2UgaWYgKGdldF9jcHVfdHlwZSgpID09IE1FU09OX0NQVV9NQUpPUl9JRF9HWEJCKSB7CisJCQlyID0gY29weV90b191c2VyKChzOCAqKWFyZywgQU1WRU5DX0RFVklORk9fR1hCQiwKKwkJCQlzdHJsZW4oQU1WRU5DX0RFVklORk9fR1hCQikpOworCQl9IGVsc2UgaWYgKGdldF9jcHVfdHlwZSgpID09IE1FU09OX0NQVV9NQUpPUl9JRF9NRzlUVikgeworCQkJciA9IGNvcHlfdG9fdXNlcigoczggKilhcmcsIEFNVkVOQ19ERVZJTkZPX0c5LAorCQkJCXN0cmxlbihBTVZFTkNfREVWSU5GT19HOSkpOworCQl9IGVsc2UgeworCQkJciA9IGNvcHlfdG9fdXNlcigoczggKilhcmcsIEFNVkVOQ19ERVZJTkZPX004LAorCQkJCXN0cmxlbihBTVZFTkNfREVWSU5GT19NOCkpOworCQl9CisJCWJyZWFrOworCWNhc2UgQU1WRU5DX0FWQ19JT0NfU1VCTUlUOgorCQlnZXRfdXNlcihhbXJpc2NfY21kLCAoKHUzMiAqKWFyZykpOworCQlpZiAoYW1yaXNjX2NtZCA9PSBFTkNPREVSX0lEUikgeworCQkJd3EtPnBpYy5pZHJfcGljX2lkKys7CisJCQlpZiAod3EtPnBpYy5pZHJfcGljX2lkID4gNjU1MzUpCisJCQkJd3EtPnBpYy5pZHJfcGljX2lkID0gMDsKKwkJCXdxLT5waWMucGljX29yZGVyX2NudF9sc2IgPSAyOworCQkJd3EtPnBpYy5mcmFtZV9udW1iZXIgPSAxOworCQl9IGVsc2UgaWYgKGFtcmlzY19jbWQgPT0gRU5DT0RFUl9OT05fSURSKSB7CisjaWZkZWYgSDI2NF9FTkNfU1ZDCisJCQkvKiBvbmx5IHVwZGF0ZSB3aGVuIHRoZXJlIGlzIHJlZmVyZW5jZSBmcmFtZSAqLworCQkJaWYgKHdxLT5waWMuZW5hYmxlX3N2YyA9PSAwIHx8IHdxLT5waWMubm9uX3JlZl9jbnQgPT0gMCkgeworCQkJCXdxLT5waWMuZnJhbWVfbnVtYmVyKys7CisJCQkJZW5jX3ByKExPR19JTkZPLCAiSW5jcmVhc2UgZnJhbWVfbnVtIHRvICVkXG4iLAorCQkJCQl3cS0+cGljLmZyYW1lX251bWJlcik7CisJCQl9CisjZWxzZQorCQkJd3EtPnBpYy5mcmFtZV9udW1iZXIrKzsKKyNlbmRpZgorCisJCQl3cS0+cGljLnBpY19vcmRlcl9jbnRfbHNiICs9IDI7CisJCQlpZiAod3EtPnBpYy5mcmFtZV9udW1iZXIgPiA2NTUzNSkKKwkJCQl3cS0+cGljLmZyYW1lX251bWJlciA9IDA7CisJCX0KKyNpZmRlZiBIMjY0X0VOQ19TVkMKKwkJLyogb25seSB1cGRhdGUgd2hlbiB0aGVyZSBpcyByZWZlcmVuY2UgZnJhbWUgKi8KKwkJaWYgKHdxLT5waWMuZW5hYmxlX3N2YyA9PSAwIHx8IHdxLT5waWMubm9uX3JlZl9jbnQgPT0gMCkgeworCQkJYW1yaXNjX2NtZCA9IHdxLT5tZW0uZGJsa19idWZfY2FudmFzOworCQkJd3EtPm1lbS5kYmxrX2J1Zl9jYW52YXMgPSB3cS0+bWVtLnJlZl9idWZfY2FudmFzOworCQkJLyogY3VycmVudCBkYmxrIGJ1ZmZlciBhcyBuZXh0IHJlZmVyZW5jZSBidWZmZXIgKi8KKwkJCXdxLT5tZW0ucmVmX2J1Zl9jYW52YXMgPSBhbXJpc2NfY21kOworCQkJZW5jX3ByKExPR19JTkZPLAorCQkJCSJzd2l0Y2ggYnVmZmVyIGVuYWJsZSAlZCAgY250ICVkXG4iLAorCQkJCXdxLT5waWMuZW5hYmxlX3N2Yywgd3EtPnBpYy5ub25fcmVmX2NudCk7CisJCX0KKwkJaWYgKHdxLT5waWMuZW5hYmxlX3N2YykgeworCQkJd3EtPnBpYy5ub25fcmVmX2NudCArKzsKKwkJCWlmICh3cS0+cGljLm5vbl9yZWZfY250ID4gd3EtPnBpYy5ub25fcmVmX2xpbWl0KSB7CisJCQkJZW5jX3ByKExPR19JTkZPLCAiU3ZjIGNsZWFyIGNudCAlZCBjb25mICVkXG4iLAorCQkJCQl3cS0+cGljLm5vbl9yZWZfY250LAorCQkJCQl3cS0+cGljLm5vbl9yZWZfbGltaXQpOworCQkJCXdxLT5waWMubm9uX3JlZl9jbnQgPSAwOworCQkJfSBlbHNlCisJCQllbmNfcHIoTE9HX0lORk8sIlN2YyBpbmNyZWFzZSBub24gcmVmIGNvdW50ZXIgdG8gJWRcbiIsCisJCQkJd3EtPnBpYy5ub25fcmVmX2NudCApOworCQl9CisjZWxzZQorCQlhbXJpc2NfY21kID0gd3EtPm1lbS5kYmxrX2J1Zl9jYW52YXM7CisJCXdxLT5tZW0uZGJsa19idWZfY2FudmFzID0gd3EtPm1lbS5yZWZfYnVmX2NhbnZhczsKKwkJLyogY3VycmVudCBkYmxrIGJ1ZmZlciBhcyBuZXh0IHJlZmVyZW5jZSBidWZmZXIgKi8KKwkJd3EtPm1lbS5yZWZfYnVmX2NhbnZhcyA9IGFtcmlzY19jbWQ7CisjZW5kaWYKKwkJYnJlYWs7CisJY2FzZSBBTVZFTkNfQVZDX0lPQ19SRUFEX0NBTlZBUzoKKwkJZ2V0X3VzZXIoYXJnViwgKCh1MzIgKilhcmcpKTsKKwkJY2FudmFzID0gYXJnVjsKKwkJaWYgKGNhbnZhcyAmIDB4ZmYpIHsKKwkJCWNhbnZhc19yZWFkKGNhbnZhcyAmIDB4ZmYsICZkc3QpOworCQkJYWRkcl9pbmZvWzBdID0gZHN0LmFkZHI7CisJCQlpZiAoKGNhbnZhcyAmIDB4ZmYwMCkgPj4gOCkKKwkJCQljYW52YXNfcmVhZCgoY2FudmFzICYgMHhmZjAwKSA+PiA4LCAmZHN0KTsKKwkJCWlmICgoY2FudmFzICYgMHhmZjAwMDApID4+IDE2KQorCQkJCWNhbnZhc19yZWFkKChjYW52YXMgJiAweGZmMDAwMCkgPj4gMTYsICZkc3QpOworCQkJYWRkcl9pbmZvWzFdID0gZHN0LmFkZHIgLSBhZGRyX2luZm9bMF0gKworCQkJCWRzdC53aWR0aCAqIGRzdC5oZWlnaHQ7CisJCX0gZWxzZSB7CisJCQlhZGRyX2luZm9bMF0gPSAwOworCQkJYWRkcl9pbmZvWzFdID0gMDsKKwkJfQorCQlkbWFfZmx1c2goZHN0LmFkZHIsIGRzdC53aWR0aCAqIGRzdC5oZWlnaHQgKiAzIC8gMik7CisJCXIgPSBjb3B5X3RvX3VzZXIoKHUzMiAqKWFyZywgYWRkcl9pbmZvLCAyICogc2l6ZW9mKHUzMikpOworCQlicmVhazsKKwljYXNlIEFNVkVOQ19BVkNfSU9DX01BWF9JTlNUQU5DRToKKwkJcHV0X3VzZXIoZW5jb2RlX21hbmFnZXIubWF4X2luc3RhbmNlLCAodTMyICopYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBBTVZFTkNfQVZDX0lPQ19RUF9NT0RFOgorCQlnZXRfdXNlcihxcF9tb2RlLCAoKHUzMiAqKWFyZykpOworCQlwcl9pbmZvKCJxcF9tb2RlICVkXG4iLCBxcF9tb2RlKTsKKwkJYnJlYWs7CisJY2FzZSBBTVZFTkNfQVZDX0lPQ19HRVRfQ1BVX0lEOgorCQljcHVpZCA9ICh1MzIpIGdldF9jcHVfbWFqb3JfaWQoKTsKKwkJcHJfZXJyKCJBTVZFTkNfQVZDX0lPQ19HRVRfQ1BVX0lEIHJldHVybiAldVxuIiwgY3B1aWQpOworCQlwdXRfdXNlcihjcHVpZCwgKHUzMiAqKWFyZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXIgPSAtMTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByOworfQorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RhdGljIGxvbmcgYW12ZW5jX2F2Y19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsCisJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmdzKQoreworCXVuc2lnbmVkIGxvbmcgcmV0OworCisJYXJncyA9ICh1bnNpZ25lZCBsb25nKWNvbXBhdF9wdHIoYXJncyk7CisJcmV0ID0gYW12ZW5jX2F2Y19pb2N0bChmaWxwLCBjbWQsIGFyZ3MpOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworc3RhdGljIHMzMiBhdmNfbW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGVuY29kZV93cV9zICp3cSA9IChzdHJ1Y3QgZW5jb2RlX3dxX3MgKilmaWxwLT5wcml2YXRlX2RhdGE7CisJdWxvbmcgb2ZmID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOworCXVsb25nIHZtYV9zaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCisJaWYgKHZtYV9zaXplID09IDApIHsKKwkJZW5jX3ByKExPR19FUlJPUiwgInZtYV9zaXplIGlzIDAsIHdxOiVwLlxuIiwgKHZvaWQgKil3cSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlpZiAoIW9mZikKKwkJb2ZmICs9IHdxLT5tZW0uYnVmX3N0YXJ0OworCWVuY19wcihMT0dfQUxMLAorCQkidm1hX3NpemUgaXMgJWxkICwgb2ZmIGlzICVsZCwgd3E6JXAuXG4iLAorCQl2bWFfc2l6ZSwgb2ZmLCAodm9pZCAqKXdxKTsKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX0RPTlRFWFBBTkQgfCBWTV9ET05URFVNUCB8IFZNX0lPOworCS8qIHZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X25vbmNhY2hlZCh2bWEtPnZtX3BhZ2VfcHJvdCk7ICovCisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIG9mZiA+PiBQQUdFX1NISUZULAorCQl2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGFnZV9wcm90KSkgeworCQllbmNfcHIoTE9HX0VSUk9SLAorCQkJInNldF9jYWNoZWQ6IGZhaWxlZCByZW1hcF9wZm5fcmFuZ2UsIHdxOiVwLlxuIiwKKwkJCSh2b2lkICopd3EpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgYW12ZW5jX2F2Y19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0X3RhYmxlKQoreworCXN0cnVjdCBlbmNvZGVfd3FfcyAqd3EgPSAoc3RydWN0IGVuY29kZV93cV9zICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcG9sbF93YWl0KGZpbGUsICZ3cS0+cmVxdWVzdF9jb21wbGV0ZSwgd2FpdF90YWJsZSk7CisKKwlpZiAoYXRvbWljX3JlYWQoJndxLT5yZXF1ZXN0X3JlYWR5KSkgeworCQlhdG9taWNfZGVjKCZ3cS0+cmVxdWVzdF9yZWFkeSk7CisJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYW12ZW5jX2F2Y19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gYW12ZW5jX2F2Y19vcGVuLAorCS5tbWFwID0gYXZjX21tYXAsCisJLnJlbGVhc2UgPSBhbXZlbmNfYXZjX3JlbGVhc2UsCisJLnVubG9ja2VkX2lvY3RsID0gYW12ZW5jX2F2Y19pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bCA9IGFtdmVuY19hdmNfY29tcGF0X2lvY3RsLAorI2VuZGlmCisJLnBvbGwgPSBhbXZlbmNfYXZjX3BvbGwsCit9OworCisvKiB3b3JrIHF1ZXVlIGZ1bmN0aW9uICovCitzdGF0aWMgczMyIGVuY29kZV9wcm9jZXNzX3JlcXVlc3Qoc3RydWN0IGVuY29kZV9tYW5hZ2VyX3MgKm1hbmFnZXIsCisJc3RydWN0IGVuY29kZV9xdWV1ZV9pdGVtX3MgKnBpdGVtKQoreworCXMzMiByZXQgPSAwOworCXN0cnVjdCBlbmNvZGVfd3FfcyAqd3EgPSBwaXRlbS0+cmVxdWVzdC5wYXJlbnQ7CisJc3RydWN0IGVuY29kZV9yZXF1ZXN0X3MgKnJlcXVlc3QgPSAmcGl0ZW0tPnJlcXVlc3Q7CisJdTMyIHRpbWVvdXQgPSAocmVxdWVzdC0+dGltZW91dCA9PSAwKSA/CisJCTEgOiBtc2Vjc190b19qaWZmaWVzKHJlcXVlc3QtPnRpbWVvdXQpOworCXUzMiBidWZfc3RhcnQgPSAwOworCXUzMiBzaXplID0gMDsKKwl1MzIgZmx1c2hfc2l6ZSA9ICgod3EtPnBpYy5lbmNvZGVyX3dpZHRoICsgMzEpID4+IDUgPDwgNSkgKgorCQkoKHdxLT5waWMuZW5jb2Rlcl9oZWlnaHQgKyAxNSkgPj4gNCA8PCA0KSAqIDMgLyAyOworCisJc3RydWN0IGVuY19kbWFfY2ZnICpjZmcgPSBOVUxMOworCWludCBpID0gMDsKKworI2lmZGVmIEgyNjRfRU5DX0NCUgorCWlmIChyZXF1ZXN0LT5jbWQgPT0gRU5DT0RFUl9JRFIgfHwgcmVxdWVzdC0+Y21kID09IEVOQ09ERVJfTk9OX0lEUikgeworCQlpZiAocmVxdWVzdC0+Zmx1c2hfZmxhZyAmIEFNVkVOQ19GTFVTSF9GTEFHX0NCUgorCQkJJiYgZ2V0X2NwdV90eXBlKCkgPj0gTUVTT05fQ1BVX01BSk9SX0lEX0dYVFZCQikgeworCQkJdm9pZCAqdmFkZHIgPSB3cS0+bWVtLmNicl9pbmZvX2Rkcl92aXJ0X2FkZHI7CisJCQlDb252ZXJ0VGFibGUyUmlzYyh2YWRkciwgMHhhMDApOworCQkJLy9idWZfc3RhcnQgPSBnZXRidWZmZXIod3EsIEVOQ09ERVJfQlVGRkVSX0NCUik7CisJCQljb2RlY19tbV9kbWFfZmx1c2godmFkZHIsIHdxLT5tZW0uY2JyX2luZm9fZGRyX3NpemUsIERNQV9UT19ERVZJQ0UpOworCQl9CisJfQorI2VuZGlmCisKKworCitBZ2FpbjoKKwlhbXZlbmNfYXZjX3N0YXJ0X2NtZCh3cSwgcmVxdWVzdCk7CisKKwlpZiAobm9fdGltZW91dCkgeworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUobWFuYWdlci0+ZXZlbnQuaHdfY29tcGxldGUsCisJCQkobWFuYWdlci0+ZW5jb2RlX2h3X3N0YXR1cyA9PSBFTkNPREVSX0lEUl9ET05FCisJCQl8fCBtYW5hZ2VyLT5lbmNvZGVfaHdfc3RhdHVzID09IEVOQ09ERVJfTk9OX0lEUl9ET05FCisJCQl8fCBtYW5hZ2VyLT5lbmNvZGVfaHdfc3RhdHVzID09IEVOQ09ERVJfU0VRVUVOQ0VfRE9ORQorCQkJfHwgbWFuYWdlci0+ZW5jb2RlX2h3X3N0YXR1cyA9PSBFTkNPREVSX1BJQ1RVUkVfRE9ORSkpOworCX0gZWxzZSB7CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KG1hbmFnZXItPmV2ZW50Lmh3X2NvbXBsZXRlLAorCQkJKChtYW5hZ2VyLT5lbmNvZGVfaHdfc3RhdHVzID09IEVOQ09ERVJfSURSX0RPTkUpCisJCQl8fCAobWFuYWdlci0+ZW5jb2RlX2h3X3N0YXR1cyA9PSBFTkNPREVSX05PTl9JRFJfRE9ORSkKKwkJCXx8IChtYW5hZ2VyLT5lbmNvZGVfaHdfc3RhdHVzID09IEVOQ09ERVJfU0VRVUVOQ0VfRE9ORSkKKwkJCXx8IChtYW5hZ2VyLT5lbmNvZGVfaHdfc3RhdHVzID09IEVOQ09ERVJfUElDVFVSRV9ET05FKSksCisJCQl0aW1lb3V0KTsKKwl9CisKKwlpZiAoKHJlcXVlc3QtPmNtZCA9PSBFTkNPREVSX1NFUVVFTkNFKSAmJgorCSAgICAobWFuYWdlci0+ZW5jb2RlX2h3X3N0YXR1cyA9PSBFTkNPREVSX1NFUVVFTkNFX0RPTkUpKSB7CisJCXdxLT5zcHNfc2l6ZSA9IFJFQURfSFJFRyhIQ09ERUNfVkxDX1RPVEFMX0JZVEVTKTsKKwkJd3EtPmh3X3N0YXR1cyA9IG1hbmFnZXItPmVuY29kZV9od19zdGF0dXM7CisJCXJlcXVlc3QtPmNtZCA9IEVOQ09ERVJfUElDVFVSRTsKKwkJZ290byBBZ2FpbjsKKwl9IGVsc2UgaWYgKChyZXF1ZXN0LT5jbWQgPT0gRU5DT0RFUl9QSUNUVVJFKSAmJgorCQkgICAobWFuYWdlci0+ZW5jb2RlX2h3X3N0YXR1cyA9PSBFTkNPREVSX1BJQ1RVUkVfRE9ORSkpIHsKKwkJd3EtPnBwc19zaXplID0KKwkJCVJFQURfSFJFRyhIQ09ERUNfVkxDX1RPVEFMX0JZVEVTKSAtIHdxLT5zcHNfc2l6ZTsKKwkJd3EtPmh3X3N0YXR1cyA9IG1hbmFnZXItPmVuY29kZV9od19zdGF0dXM7CisJCWlmIChyZXF1ZXN0LT5mbHVzaF9mbGFnICYgQU1WRU5DX0ZMVVNIX0ZMQUdfT1VUUFVUKSB7CisJCQlidWZfc3RhcnQgPSBnZXRidWZmZXIod3EsIEVOQ09ERVJfQlVGRkVSX09VVFBVVCk7CisJCQljYWNoZV9mbHVzaChidWZfc3RhcnQsCisJCQkJd3EtPnNwc19zaXplICsgd3EtPnBwc19zaXplKTsKKwkJfQorCQl3cS0+b3V0cHV0X3NpemUgPSAod3EtPnNwc19zaXplIDw8IDE2KSB8IHdxLT5wcHNfc2l6ZTsKKwl9IGVsc2UgeworCQl3cS0+aHdfc3RhdHVzID0gbWFuYWdlci0+ZW5jb2RlX2h3X3N0YXR1czsKKworCQlpZiAoKG1hbmFnZXItPmVuY29kZV9od19zdGF0dXMgPT0gRU5DT0RFUl9JRFJfRE9ORSkgfHwKKwkJICAgIChtYW5hZ2VyLT5lbmNvZGVfaHdfc3RhdHVzID09IEVOQ09ERVJfTk9OX0lEUl9ET05FKSkgeworCQkJd3EtPm91dHB1dF9zaXplID0gUkVBRF9IUkVHKEhDT0RFQ19WTENfVE9UQUxfQllURVMpOworCisJCQlpZiAocmVxdWVzdC0+Zmx1c2hfZmxhZyAmIEFNVkVOQ19GTFVTSF9GTEFHX09VVFBVVCkgeworCQkJCWJ1Zl9zdGFydCA9IGdldGJ1ZmZlcih3cSwgRU5DT0RFUl9CVUZGRVJfT1VUUFVUKTsKKwkJCQljYWNoZV9mbHVzaChidWZfc3RhcnQsIHdxLT5vdXRwdXRfc2l6ZSk7CisJCQl9CisKKwkJCWlmIChyZXF1ZXN0LT5mbHVzaF9mbGFnICYgQU1WRU5DX0ZMVVNIX0ZMQUdfRFVNUCkgeworCQkJCWJ1Zl9zdGFydCA9IGdldGJ1ZmZlcih3cSwgRU5DT0RFUl9CVUZGRVJfRFVNUCk7CisJCQkJc2l6ZSA9IHdxLT5tZW0uZHVtcF9pbmZvX2Rkcl9zaXplOworCQkJCWNhY2hlX2ZsdXNoKGJ1Zl9zdGFydCwgc2l6ZSk7CisJCQkJLy9lbmNfcHIoTE9HX0RFQlVHLCAiQ0JSIGZsdXNoIGR1bXBfaW5mbyBkb25lIik7CisJCQl9CisKKwkJCWlmIChyZXF1ZXN0LT5mbHVzaF9mbGFnICYgQU1WRU5DX0ZMVVNIX0ZMQUdfUkVGRVJFTkNFKSB7CisJCQkJdTMyIHJlZl9pZCA9IEVOQ09ERVJfQlVGRkVSX1JFRjA7CisKKwkJCQlpZiAoKHdxLT5tZW0ucmVmX2J1Zl9jYW52YXMgJiAweGZmKSA9PSAoRU5DX0NBTlZBU19PRkZTRVQpKQorCQkJCQlyZWZfaWQgPSBFTkNPREVSX0JVRkZFUl9SRUYwOworCQkJCWVsc2UKKwkJCQkJcmVmX2lkID0gRU5DT0RFUl9CVUZGRVJfUkVGMTsKKworCQkJCWJ1Zl9zdGFydCA9IGdldGJ1ZmZlcih3cSwgcmVmX2lkKTsKKwkJCQljYWNoZV9mbHVzaChidWZfc3RhcnQsIGZsdXNoX3NpemUpOworCQkJfQorCQl9IGVsc2UgeworCQkJbWFuYWdlci0+ZW5jb2RlX2h3X3N0YXR1cyA9IEVOQ09ERVJfRVJST1I7CisJCQllbmNfcHIoTE9HX0RFQlVHLCAiYXZjIGVuY29kZSBsaWdodCByZXNldCAtLS0gIik7CisJCQllbmNfcHIoTE9HX0RFQlVHLAorCQkJCSJmcmFtZSB0eXBlOiAlcywgc2l6ZTogJWR4JWQsIHdxOiAlcHhcbiIsCisJCQkJKHJlcXVlc3QtPmNtZCA9PSBFTkNPREVSX0lEUikgPyAiSURSIiA6ICJQIiwKKwkJCQl3cS0+cGljLmVuY29kZXJfd2lkdGgsCisJCQkJd3EtPnBpYy5lbmNvZGVyX2hlaWdodCwgKHZvaWQgKil3cSk7CisJCQllbmNfcHIoTE9HX0RFQlVHLAorCQkJCSJtYiBpbmZvOiAweCV4LCBlbmNvZGUgc3RhdHVzOiAweCV4LCBkY3Qgc3RhdHVzOiAweCV4ICIsCisJCQkJUkVBRF9IUkVHKEhDT0RFQ19WTENfTUJfSU5GTyksCisJCQkJUkVBRF9IUkVHKEVOQ09ERVJfU1RBVFVTKSwKKwkJCQlSRUFEX0hSRUcoSENPREVDX1FEQ1RfU1RBVFVTX0NUUkwpKTsKKwkJCWVuY19wcihMT0dfREVCVUcsCisJCQkJInZsYyBzdGF0dXM6IDB4JXgsIG1lIHN0YXR1czogMHgleCwgcmlzYyBwYzoweCV4LCBkZWJ1ZzoweCV4XG4iLAorCQkJCVJFQURfSFJFRyhIQ09ERUNfVkxDX1NUQVRVU19DVFJMKSwKKwkJCQlSRUFEX0hSRUcoSENPREVDX01FX1NUQVRVUyksCisJCQkJUkVBRF9IUkVHKEhDT0RFQ19NUENfRSksCisJCQkJUkVBRF9IUkVHKERFQlVHX1JFRykpOworCQkJYW12ZW5jX2F2Y19saWdodF9yZXNldCh3cSwgMzApOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IHJlcXVlc3QtPnBsYW5lX251bTsgaSsrKSB7CisJCQljZmcgPSAmcmVxdWVzdC0+ZG1hX2NmZ1tpXTsKKwkJCWVuY19wcihMT0dfSU5GTywgInJlcXVlc3QgdmFkZHIgJXAsIHBhZGRyICVwXG4iLAorCQkJCWNmZy0+dmFkZHIsIGNmZy0+cGFkZHIpOworCQkJaWYgKGNmZy0+ZmQgPj0gMCAmJiBjZmctPnZhZGRyICE9IE5VTEwpCisJCQkJZW5jX2RtYV9idWZfdW5tYXAoY2ZnKTsKKwkJfQorCX0KKwlhdG9taWNfaW5jKCZ3cS0+cmVxdWVzdF9yZWFkeSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ3cS0+cmVxdWVzdF9jb21wbGV0ZSk7CisJcmV0dXJuIHJldDsKK30KKworczMyIGVuY29kZV93cV9hZGRfcmVxdWVzdChzdHJ1Y3QgZW5jb2RlX3dxX3MgKndxKQoreworCXN0cnVjdCBlbmNvZGVfcXVldWVfaXRlbV9zICpwaXRlbSA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9IE5VTEw7CisJc3RydWN0IGVuY29kZV93cV9zICp0bXAgPSBOVUxMOworCWJvb2wgZmluZCA9IGZhbHNlOworCisJc3Bpbl9sb2NrKCZlbmNvZGVfbWFuYWdlci5ldmVudC5zZW1fbG9jayk7CisKKwloZWFkID0gICZlbmNvZGVfbWFuYWdlci53cTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgaGVhZCwgbGlzdCkgeworCQlpZiAoKHdxID09IHRtcCkgJiYgKHdxICE9IE5VTEwpKSB7CisJCQlmaW5kID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGZpbmQgPT0gZmFsc2UpIHsKKwkJZW5jX3ByKExPR19FUlJPUiwgImN1cnJlbnQgd3EgKCVwKSBkb2Vzbid0IHJlZ2lzdGVyLlxuIiwKKwkJCSh2b2lkICopd3EpOworCQlnb3RvIGVycm9yOworCX0KKworCWlmIChsaXN0X2VtcHR5KCZlbmNvZGVfbWFuYWdlci5mcmVlX3F1ZXVlKSkgeworCQllbmNfcHIoTE9HX0VSUk9SLCAid29yayBxdWV1ZSBubyBzcGFjZSwgd3E6JXAuXG4iLAorCQkJKHZvaWQgKil3cSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcGl0ZW0gPSBsaXN0X2VudHJ5KGVuY29kZV9tYW5hZ2VyLmZyZWVfcXVldWUubmV4dCwKKwkJc3RydWN0IGVuY29kZV9xdWV1ZV9pdGVtX3MsIGxpc3QpOworCisJaWYgKElTX0VSUihwaXRlbSkpCisJCWdvdG8gZXJyb3I7CisKKwltZW1jcHkoJnBpdGVtLT5yZXF1ZXN0LCAmd3EtPnJlcXVlc3QsIHNpemVvZihzdHJ1Y3QgZW5jb2RlX3JlcXVlc3RfcykpOworCisJZW5jX3ByKExPR19JTkZPLCAibmV3IHdvcmsgcmVxdWVzdCAlcCwgdmFkZHIgJXAsIHBhZGRyICVwXG4iLCAmcGl0ZW0tPnJlcXVlc3QsCisJCXBpdGVtLT5yZXF1ZXN0LmRtYV9jZmdbMF0udmFkZHIscGl0ZW0tPnJlcXVlc3QuZG1hX2NmZ1swXS5wYWRkcik7CisKKwltZW1zZXQoJndxLT5yZXF1ZXN0LCAwLCBzaXplb2Yoc3RydWN0IGVuY29kZV9yZXF1ZXN0X3MpKTsKKwl3cS0+cmVxdWVzdC5kbWFfY2ZnWzBdLmZkID0gLTE7CisJd3EtPnJlcXVlc3QuZG1hX2NmZ1sxXS5mZCA9IC0xOworCXdxLT5yZXF1ZXN0LmRtYV9jZmdbMl0uZmQgPSAtMTsKKwl3cS0+aHdfc3RhdHVzID0gMDsKKwl3cS0+b3V0cHV0X3NpemUgPSAwOworCXBpdGVtLT5yZXF1ZXN0LnBhcmVudCA9IHdxOworCWxpc3RfbW92ZV90YWlsKCZwaXRlbS0+bGlzdCwgJmVuY29kZV9tYW5hZ2VyLnByb2Nlc3NfcXVldWUpOworCXNwaW5fdW5sb2NrKCZlbmNvZGVfbWFuYWdlci5ldmVudC5zZW1fbG9jayk7CisKKwllbmNfcHIoTE9HX0lORk8sCisJCSJhZGQgbmV3IHdvcmsgb2ssIGNtZDolZCwgdWNvZGUgbW9kZTogJWQsIHdxOiVwLlxuIiwKKwkJcGl0ZW0tPnJlcXVlc3QuY21kLCBwaXRlbS0+cmVxdWVzdC51Y29kZV9tb2RlLAorCQkodm9pZCAqKXdxKTsKKwljb21wbGV0ZSgmZW5jb2RlX21hbmFnZXIuZXZlbnQucmVxdWVzdF9pbl9jb20pOy8qIG5ldyBjbWQgY29tZSBpbiAqLworCisJcmV0dXJuIDA7CitlcnJvcjoKKwlzcGluX3VubG9jaygmZW5jb2RlX21hbmFnZXIuZXZlbnQuc2VtX2xvY2spOworCisJcmV0dXJuIC0xOworfQorCitzdHJ1Y3QgZW5jb2RlX3dxX3MgKmNyZWF0ZV9lbmNvZGVfd29ya19xdWV1ZSh2b2lkKQoreworCXN0cnVjdCBlbmNvZGVfd3FfcyAqZW5jb2RlX3dvcmtfcXVldWUgPSBOVUxMOworCWJvb2wgZG9uZSA9IGZhbHNlOworCXUzMiBpLCBtYXhfaW5zdGFuY2U7CisJc3RydWN0IEJ1ZmZfcyAqcmVzZXJ2ZV9idWZmOworCisJZW5jb2RlX3dvcmtfcXVldWUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZW5jb2RlX3dxX3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSKGVuY29kZV93b3JrX3F1ZXVlKSkgeworCQllbmNfcHIoTE9HX0VSUk9SLCAiY2FuJ3QgY3JlYXRlIHdvcmsgcXVldWVcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWF4X2luc3RhbmNlID0gZW5jb2RlX21hbmFnZXIubWF4X2luc3RhbmNlOworCWVuY29kZV93b3JrX3F1ZXVlLT5waWMuaW5pdF9xcHBpY3R1cmUgPSAyNjsKKwllbmNvZGVfd29ya19xdWV1ZS0+cGljLmxvZzJfbWF4X2ZyYW1lX251bSA9IDQ7CisJZW5jb2RlX3dvcmtfcXVldWUtPnBpYy5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYiA9IDQ7CisJZW5jb2RlX3dvcmtfcXVldWUtPnBpYy5pZHJfcGljX2lkID0gMDsKKwllbmNvZGVfd29ya19xdWV1ZS0+cGljLmZyYW1lX251bWJlciA9IDA7CisJZW5jb2RlX3dvcmtfcXVldWUtPnBpYy5waWNfb3JkZXJfY250X2xzYiA9IDA7CisjaWZkZWYgSDI2NF9FTkNfU1ZDCisJLyogR2V0IHNldHRpbmdzIGZyb20gdGhlIGdsb2JhbCovCisJZW5jb2RlX3dvcmtfcXVldWUtPnBpYy5lbmFibGVfc3ZjID0gc3ZjX2VuYWJsZTsKKwllbmNvZGVfd29ya19xdWV1ZS0+cGljLm5vbl9yZWZfbGltaXQgPSBzdmNfcmVmX2NvbmY7CisJZW5jb2RlX3dvcmtfcXVldWUtPnBpYy5ub25fcmVmX2NudCA9IDA7CisJZW5jX3ByKExPR19JTkZPLCAic3ZjIGNvbmYgZW5hYmxlICVkLCBkdXJhdGlvbiAlZFxuIiwKKwkJZW5jb2RlX3dvcmtfcXVldWUtPnBpYy5lbmFibGVfc3ZjLAorCQllbmNvZGVfd29ya19xdWV1ZS0+cGljLm5vbl9yZWZfbGltaXQpOworI2VuZGlmCisJZW5jb2RlX3dvcmtfcXVldWUtPnVjb2RlX2luZGV4ID0gVUNPREVfTU9ERV9GVUxMOworCisjaWZkZWYgSDI2NF9FTkNfQ0JSCisJZW5jb2RlX3dvcmtfcXVldWUtPmNicl9pbmZvLmJsb2NrX3cgPSAxNjsKKwllbmNvZGVfd29ya19xdWV1ZS0+Y2JyX2luZm8uYmxvY2tfaCA9IDk7CisJZW5jb2RlX3dvcmtfcXVldWUtPmNicl9pbmZvLmxvbmdfdGggPSBDQlJfTE9OR19USFJFU0g7CisJZW5jb2RlX3dvcmtfcXVldWUtPmNicl9pbmZvLnN0YXJ0X3RibF9pZCA9IFNUQVJUX1RBQkxFX0lEOworCWVuY29kZV93b3JrX3F1ZXVlLT5jYnJfaW5mby5zaG9ydF9zaGlmdCA9IENCUl9TSE9SVF9TSElGVDsKKwllbmNvZGVfd29ya19xdWV1ZS0+Y2JyX2luZm8ubG9uZ19tYl9udW0gPSBDQlJfTE9OR19NQl9OVU07CisjZW5kaWYKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZlbmNvZGVfd29ya19xdWV1ZS0+cmVxdWVzdF9jb21wbGV0ZSk7CisJYXRvbWljX3NldCgmZW5jb2RlX3dvcmtfcXVldWUtPnJlcXVlc3RfcmVhZHksIDApOworCXNwaW5fbG9jaygmZW5jb2RlX21hbmFnZXIuZXZlbnQuc2VtX2xvY2spOworCWlmIChlbmNvZGVfbWFuYWdlci53cV9jb3VudCA8IGVuY29kZV9tYW5hZ2VyLm1heF9pbnN0YW5jZSkgeworCQlsaXN0X2FkZF90YWlsKCZlbmNvZGVfd29ya19xdWV1ZS0+bGlzdCwgJmVuY29kZV9tYW5hZ2VyLndxKTsKKwkJZW5jb2RlX21hbmFnZXIud3FfY291bnQrKzsKKwkJaWYgKGVuY29kZV9tYW5hZ2VyLnVzZV9yZXNlcnZlID09IHRydWUpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBtYXhfaW5zdGFuY2U7IGkrKykgeworCQkJCXJlc2VydmVfYnVmZiA9ICZlbmNvZGVfbWFuYWdlci5yZXNlcnZlX2J1ZmZbaV07CisJCQkJaWYgKHJlc2VydmVfYnVmZi0+dXNlZCA9PSBmYWxzZSkgeworCQkJCQllbmNvZGVfd29ya19xdWV1ZS0+bWVtLmJ1Zl9zdGFydCA9CisJCQkJCQlyZXNlcnZlX2J1ZmYtPmJ1Zl9zdGFydDsKKwkJCQkJZW5jb2RlX3dvcmtfcXVldWUtPm1lbS5idWZfc2l6ZSA9CisJCQkJCQlyZXNlcnZlX2J1ZmYtPmJ1Zl9zaXplOworCQkJCQlyZXNlcnZlX2J1ZmYtPnVzZWQgPSB0cnVlOworCQkJCQlkb25lID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9IGVsc2UKKwkJCWRvbmUgPSB0cnVlOworCX0KKwlzcGluX3VubG9jaygmZW5jb2RlX21hbmFnZXIuZXZlbnQuc2VtX2xvY2spOworCWlmIChkb25lID09IGZhbHNlKSB7CisJCWtmcmVlKGVuY29kZV93b3JrX3F1ZXVlKTsKKwkJZW5jb2RlX3dvcmtfcXVldWUgPSBOVUxMOworCQllbmNfcHIoTE9HX0VSUk9SLCAidG9vIG1hbnkgd29yayBxdWV1ZSFcbiIpOworCX0KKwlyZXR1cm4gZW5jb2RlX3dvcmtfcXVldWU7IC8qIGZpbmQgaXQgKi8KK30KKworc3RhdGljIHZvaWQgX2Rlc3Ryb3lfZW5jb2RlX3dvcmtfcXVldWUoc3RydWN0IGVuY29kZV9tYW5hZ2VyX3MgKm1hbmFnZXIsCisJc3RydWN0IGVuY29kZV93cV9zICoqd3EsCisJc3RydWN0IGVuY29kZV93cV9zICplbmNvZGVfd29ya19xdWV1ZSwKKwlib29sICpmaW5kKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7CisJc3RydWN0IGVuY29kZV93cV9zICp3cF90bXAgPSBOVUxMOworCXUzMiBpLCBtYXhfaW5zdGFuY2U7CisJc3RydWN0IEJ1ZmZfcyAqcmVzZXJ2ZV9idWZmOworCXUzMiBidWZfc3RhcnQgPSBlbmNvZGVfd29ya19xdWV1ZS0+bWVtLmJ1Zl9zdGFydDsKKworCW1heF9pbnN0YW5jZSA9IG1hbmFnZXItPm1heF9pbnN0YW5jZTsKKwloZWFkID0gICZtYW5hZ2VyLT53cTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoKCp3cSksIHdwX3RtcCwgaGVhZCwgbGlzdCkgeworCQlpZiAoKCp3cSkgJiYgKCp3cSA9PSBlbmNvZGVfd29ya19xdWV1ZSkpIHsKKwkJCWxpc3RfZGVsKCYoKndxKS0+bGlzdCk7CisJCQlpZiAobWFuYWdlci0+dXNlX3Jlc2VydmUgPT0gdHJ1ZSkgeworCQkJCWZvciAoaSA9IDA7IGkgPCBtYXhfaW5zdGFuY2U7IGkrKykgeworCQkJCQlyZXNlcnZlX2J1ZmYgPQorCQkJCQkJJm1hbmFnZXItPnJlc2VydmVfYnVmZltpXTsKKwkJCQkJaWYgKHJlc2VydmVfYnVmZi0+dXNlZAk9PSB0cnVlICYmCisJCQkJCQlidWZfc3RhcnQgPT0KKwkJCQkJCXJlc2VydmVfYnVmZi0+YnVmX3N0YXJ0KSB7CisJCQkJCQlyZXNlcnZlX2J1ZmYtPnVzZWQgPSBmYWxzZTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJKmZpbmQgPSB0cnVlOworCQkJbWFuYWdlci0+d3FfY291bnQtLTsKKwkJCWVuY19wcihMT0dfREVCVUcsCisJCQkJInJlbW92ZSAgZW5jb2RlX3dvcmtfcXVldWUgJXAgc3VjY2VzcywgJXMgbGluZSAlZC5cbiIsCisJCQkJKHZvaWQgKillbmNvZGVfd29ya19xdWV1ZSwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3MzMiBkZXN0cm95X2VuY29kZV93b3JrX3F1ZXVlKHN0cnVjdCBlbmNvZGVfd3FfcyAqZW5jb2RlX3dvcmtfcXVldWUpCit7CisJc3RydWN0IGVuY29kZV9xdWV1ZV9pdGVtX3MgKnBpdGVtLCAqdG1wOworCXN0cnVjdCBlbmNvZGVfd3FfcyAqd3EgPSBOVUxMOworCWJvb2wgZmluZCA9IGZhbHNlOworCisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKKworCWlmIChlbmNvZGVfd29ya19xdWV1ZSkgeworCQlzcGluX2xvY2soJmVuY29kZV9tYW5hZ2VyLmV2ZW50LnNlbV9sb2NrKTsKKwkJaWYgKGVuY29kZV9tYW5hZ2VyLmN1cnJlbnRfd3EgPT0gZW5jb2RlX3dvcmtfcXVldWUpIHsKKwkJCWVuY29kZV9tYW5hZ2VyLnJlbW92ZV9mbGFnID0gdHJ1ZTsKKwkJCXNwaW5fdW5sb2NrKCZlbmNvZGVfbWFuYWdlci5ldmVudC5zZW1fbG9jayk7CisJCQllbmNfcHIoTE9HX0RFQlVHLAorCQkJCSJ3YXJuaW5nLS1EZXN0cm95IHRoZSBydW5uaW5nIHF1ZXVlLCBzaG91bGQgbm90IGJlIGhlcmUuXG4iKTsKKwkJCXdhaXRfZm9yX2NvbXBsZXRpb24oCisJCQkJJmVuY29kZV9tYW5hZ2VyLmV2ZW50LnByb2Nlc3NfY29tcGxldGUpOworCQkJc3Bpbl9sb2NrKCZlbmNvZGVfbWFuYWdlci5ldmVudC5zZW1fbG9jayk7CisJCX0gLyogZWxzZSB3ZSBjYW4gZGVsZXRlIGl0IHNhZmVseS4gKi8KKworCQloZWFkID0gICZlbmNvZGVfbWFuYWdlci5wcm9jZXNzX3F1ZXVlOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGl0ZW0sIHRtcCwgaGVhZCwgbGlzdCkgeworCQkJaWYgKHBpdGVtICYmIHBpdGVtLT5yZXF1ZXN0LnBhcmVudCA9PQorCQkJCWVuY29kZV93b3JrX3F1ZXVlKSB7CisJCQkJcGl0ZW0tPnJlcXVlc3QucGFyZW50ID0gTlVMTDsKKwkJCQllbmNfcHIoTE9HX0RFQlVHLAorCQkJCQkid2FybmluZy0tcmVtb3ZlIG5vdCBwcm9jZXNzIHJlcXVlc3QsIHNob3VsZCBub3QgYmUgaGVyZS5cbiIpOworCQkJCWxpc3RfbW92ZV90YWlsKCZwaXRlbS0+bGlzdCwKKwkJCQkJJmVuY29kZV9tYW5hZ2VyLmZyZWVfcXVldWUpOworCQkJfQorCQl9CisKKwkJX2Rlc3Ryb3lfZW5jb2RlX3dvcmtfcXVldWUoJmVuY29kZV9tYW5hZ2VyLCAmd3EsCisJCQllbmNvZGVfd29ya19xdWV1ZSwgJmZpbmQpOworCQlzcGluX3VubG9jaygmZW5jb2RlX21hbmFnZXIuZXZlbnQuc2VtX2xvY2spOworI2lmZGVmIENPTkZJR19DTUEKKwkJaWYgKGVuY29kZV93b3JrX3F1ZXVlLT5tZW0uYnVmX3N0YXJ0KSB7CisJCQlpZiAod3EtPm1lbS5jYnJfaW5mb19kZHJfdmlydF9hZGRyICE9IE5VTEwpIHsKKwkJCQljb2RlY19tbV91bm1hcF9waHlhZGRyKHdxLT5tZW0uY2JyX2luZm9fZGRyX3ZpcnRfYWRkcik7CisJCQkJd3EtPm1lbS5jYnJfaW5mb19kZHJfdmlydF9hZGRyID0gTlVMTDsKKwkJCX0KKwkJCWNvZGVjX21tX2ZyZWVfZm9yX2RtYSgKKwkJCQlFTkNPREVfTkFNRSwKKwkJCQllbmNvZGVfd29ya19xdWV1ZS0+bWVtLmJ1Zl9zdGFydCk7CisJCQllbmNvZGVfd29ya19xdWV1ZS0+bWVtLmJ1Zl9zdGFydCA9IDA7CisKKwkJfQorI2VuZGlmCisJCWtmcmVlKGVuY29kZV93b3JrX3F1ZXVlKTsKKwkJY29tcGxldGUoJmVuY29kZV9tYW5hZ2VyLmV2ZW50LnJlcXVlc3RfaW5fY29tKTsKKwl9CisJcmV0dXJuICAwOworfQorCitzdGF0aWMgczMyIGVuY29kZV9tb25pdG9yX3RocmVhZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBlbmNvZGVfbWFuYWdlcl9zICptYW5hZ2VyID0gKHN0cnVjdCBlbmNvZGVfbWFuYWdlcl9zICopZGF0YTsKKwlzdHJ1Y3QgZW5jb2RlX3F1ZXVlX2l0ZW1fcyAqcGl0ZW0gPSBOVUxMOworCXN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbSA9IHsuc2NoZWRfcHJpb3JpdHkgPSBNQVhfUlRfUFJJTyAtIDEgfTsKKwlzMzIgcmV0ID0gMDsKKworCWVuY19wcihMT0dfREVCVUcsICJlbmNvZGUgd29ya3F1ZXVlIG1vbml0b3Igc3RhcnQuXG4iKTsKKwlzY2hlZF9zZXRzY2hlZHVsZXIoY3VycmVudCwgU0NIRURfRklGTywgJnBhcmFtKTsKKwlhbGxvd19zaWduYWwoU0lHVEVSTSk7CisKKwkvKiBzZXR1cCBjdXJyZW50X3dxIGhlcmUuICovCisJd2hpbGUgKG1hbmFnZXItPnByb2Nlc3NfcXVldWVfc3RhdGUgIT0gRU5DT0RFX1BST0NFU1NfUVVFVUVfU1RPUCkgeworCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQkJYnJlYWs7CisKKwkJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKAorCQkJCSZtYW5hZ2VyLT5ldmVudC5yZXF1ZXN0X2luX2NvbSk7CisKKwkJaWYgKHJldCA9PSAtRVJFU1RBUlRTWVMpCisJCQlicmVhazsKKworCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQkJYnJlYWs7CisKKwkJaWYgKG1hbmFnZXItPmluaXRlZCA9PSBmYWxzZSkgeworCQkJc3Bpbl9sb2NrKCZtYW5hZ2VyLT5ldmVudC5zZW1fbG9jayk7CisKKwkJCWlmICghbGlzdF9lbXB0eSgmbWFuYWdlci0+d3EpKSB7CisJCQkJc3RydWN0IGVuY29kZV93cV9zICpmaXJzdF93cSA9CisJCQkJCWxpc3RfZW50cnkobWFuYWdlci0+d3EubmV4dCwKKwkJCQkJc3RydWN0IGVuY29kZV93cV9zLCBsaXN0KTsKKwkJCQltYW5hZ2VyLT5jdXJyZW50X3dxID0gZmlyc3Rfd3E7CisJCQkJc3Bpbl91bmxvY2soJm1hbmFnZXItPmV2ZW50LnNlbV9sb2NrKTsKKworCQkJCWlmIChmaXJzdF93cSkgeworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0dFMkQKKwkJCQkJaWYgKCFtYW5hZ2VyLT5jb250ZXh0KQorCQkJCQkJbWFuYWdlci0+Y29udGV4dCA9CisJCQkJCQljcmVhdGVfZ2UyZF93b3JrX3F1ZXVlKCk7CisjZW5kaWYKKwkJCQkJYXZjX2luaXQoZmlyc3Rfd3EpOworCQkJCQltYW5hZ2VyLT5pbml0ZWQgPSB0cnVlOworCQkJCX0KKwkJCQlzcGluX2xvY2soJm1hbmFnZXItPmV2ZW50LnNlbV9sb2NrKTsKKwkJCQltYW5hZ2VyLT5jdXJyZW50X3dxID0gTlVMTDsKKwkJCQlzcGluX3VubG9jaygmbWFuYWdlci0+ZXZlbnQuc2VtX2xvY2spOworCQkJCWlmIChtYW5hZ2VyLT5yZW1vdmVfZmxhZykgeworCQkJCQljb21wbGV0ZSgKKwkJCQkJCSZtYW5hZ2VyCisJCQkJCQktPmV2ZW50LnByb2Nlc3NfY29tcGxldGUpOworCQkJCQltYW5hZ2VyLT5yZW1vdmVfZmxhZyA9IGZhbHNlOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCXNwaW5fdW5sb2NrKCZtYW5hZ2VyLT5ldmVudC5zZW1fbG9jayk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXNwaW5fbG9jaygmbWFuYWdlci0+ZXZlbnQuc2VtX2xvY2spOworCQlwaXRlbSA9IE5VTEw7CisKKwkJaWYgKGxpc3RfZW1wdHkoJm1hbmFnZXItPndxKSkgeworCQkJc3Bpbl91bmxvY2soJm1hbmFnZXItPmV2ZW50LnNlbV9sb2NrKTsKKwkJCW1hbmFnZXItPmluaXRlZCA9IGZhbHNlOworCQkJYW12ZW5jX2F2Y19zdG9wKCk7CisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9HRTJECisJCQlpZiAobWFuYWdlci0+Y29udGV4dCkgeworCQkJCWRlc3Ryb3lfZ2UyZF93b3JrX3F1ZXVlKG1hbmFnZXItPmNvbnRleHQpOworCQkJCW1hbmFnZXItPmNvbnRleHQgPSBOVUxMOworCQkJfQorI2VuZGlmCisKKwkJCWVuY19wcihMT0dfREVCVUcsICJwb3dlciBvZmYgZW5jb2RlLlxuIik7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmICghbGlzdF9lbXB0eSgmbWFuYWdlci0+cHJvY2Vzc19xdWV1ZSkpIHsKKwkJCXBpdGVtID0gbGlzdF9lbnRyeShtYW5hZ2VyLT5wcm9jZXNzX3F1ZXVlLm5leHQsCisJCQkJc3RydWN0IGVuY29kZV9xdWV1ZV9pdGVtX3MsIGxpc3QpOworCQkJbGlzdF9kZWwoJnBpdGVtLT5saXN0KTsKKwkJCW1hbmFnZXItPmN1cnJlbnRfaXRlbSA9IHBpdGVtOworCQkJbWFuYWdlci0+Y3VycmVudF93cSA9IHBpdGVtLT5yZXF1ZXN0LnBhcmVudDsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZtYW5hZ2VyLT5ldmVudC5zZW1fbG9jayk7CisKKwkJaWYgKHBpdGVtKSB7CisJCQllbmNvZGVfcHJvY2Vzc19yZXF1ZXN0KG1hbmFnZXIsIHBpdGVtKTsKKwkJCXNwaW5fbG9jaygmbWFuYWdlci0+ZXZlbnQuc2VtX2xvY2spOworCQkJbGlzdF9hZGRfdGFpbCgmcGl0ZW0tPmxpc3QsICZtYW5hZ2VyLT5mcmVlX3F1ZXVlKTsKKwkJCW1hbmFnZXItPmN1cnJlbnRfaXRlbSA9IE5VTEw7CisJCQltYW5hZ2VyLT5sYXN0X3dxID0gbWFuYWdlci0+Y3VycmVudF93cTsKKwkJCW1hbmFnZXItPmN1cnJlbnRfd3EgPSBOVUxMOworCQkJc3Bpbl91bmxvY2soJm1hbmFnZXItPmV2ZW50LnNlbV9sb2NrKTsKKwkJfQorCisJCWlmIChtYW5hZ2VyLT5yZW1vdmVfZmxhZykgeworCQkJY29tcGxldGUoJm1hbmFnZXItPmV2ZW50LnByb2Nlc3NfY29tcGxldGUpOworCQkJbWFuYWdlci0+cmVtb3ZlX2ZsYWcgPSBmYWxzZTsKKwkJfQorCX0KKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKKwkJbXNsZWVwKDIwKTsKKworCWVuY19wcihMT0dfREVCVUcsICJleGl0IGVuY29kZV9tb25pdG9yX3RocmVhZC5cbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgczMyIGVuY29kZV9zdGFydF9tb25pdG9yKHZvaWQpCit7CisJczMyIHJldCA9IDA7CisKKwlpZiAoZ2V0X2NwdV90eXBlKCkgPj0gTUVTT05fQ1BVX01BSk9SX0lEX0dYVFZCQikgeworCQl5X3Rucl9tb3QyYWxwX25ybV9nYWluID0gMjE2OworCQl5X3Rucl9tb3QyYWxwX2Rpc19nYWluID0gMTQ0OworCQljX3Rucl9tb3QyYWxwX25ybV9nYWluID0gMjE2OworCQljX3Rucl9tb3QyYWxwX2Rpc19nYWluID0gMTQ0OworCX0gZWxzZSB7CisJCS8qIG1vcmUgdG5yICovCisJCXlfdG5yX21vdDJhbHBfbnJtX2dhaW4gPSAxNDQ7CisJCXlfdG5yX21vdDJhbHBfZGlzX2dhaW4gPSA5NjsKKwkJY190bnJfbW90MmFscF9ucm1fZ2FpbiA9IDE0NDsKKwkJY190bnJfbW90MmFscF9kaXNfZ2FpbiA9IDk2OworCX0KKworCWVuY19wcihMT0dfREVCVUcsICJlbmNvZGUgc3RhcnQgbW9uaXRvci5cbiIpOworCWVuY29kZV9tYW5hZ2VyLnByb2Nlc3NfcXVldWVfc3RhdGUgPSBFTkNPREVfUFJPQ0VTU19RVUVVRV9TVEFSVDsKKwllbmNvZGVfbWFuYWdlci5lbmNvZGVfdGhyZWFkID0ga3RocmVhZF9ydW4oZW5jb2RlX21vbml0b3JfdGhyZWFkLAorCQkmZW5jb2RlX21hbmFnZXIsICJlbmNvZGVfbW9uaXRvciIpOworCWlmIChJU19FUlIoZW5jb2RlX21hbmFnZXIuZW5jb2RlX3RocmVhZCkpIHsKKwkJcmV0ID0gUFRSX0VSUihlbmNvZGVfbWFuYWdlci5lbmNvZGVfdGhyZWFkKTsKKwkJZW5jb2RlX21hbmFnZXIucHJvY2Vzc19xdWV1ZV9zdGF0ZSA9IEVOQ09ERV9QUk9DRVNTX1FVRVVFX1NUT1A7CisJCWVuY19wcihMT0dfRVJST1IsCisJCQkiZW5jb2RlIG1vbml0b3IgOiBmYWlsZWQgdG8gc3RhcnQga3RocmVhZCAoJWQpXG4iLCByZXQpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgczMyICBlbmNvZGVfc3RvcF9tb25pdG9yKHZvaWQpCit7CisJZW5jX3ByKExPR19ERUJVRywgInN0b3AgZW5jb2RlIG1vbml0b3IgdGhyZWFkXG4iKTsKKwlpZiAoZW5jb2RlX21hbmFnZXIuZW5jb2RlX3RocmVhZCkgeworCQlzcGluX2xvY2soJmVuY29kZV9tYW5hZ2VyLmV2ZW50LnNlbV9sb2NrKTsKKwkJaWYgKCFsaXN0X2VtcHR5KCZlbmNvZGVfbWFuYWdlci53cSkpIHsKKwkJCXUzMiBjb3VudCA9IGVuY29kZV9tYW5hZ2VyLndxX2NvdW50OworCisJCQlzcGluX3VubG9jaygmZW5jb2RlX21hbmFnZXIuZXZlbnQuc2VtX2xvY2spOworCQkJZW5jX3ByKExPR19FUlJPUiwKKwkJCQkic3RvcCBlbmNvZGUgbW9uaXRvciB0aHJlYWQgZXJyb3IsIGFjdGl2ZSB3cSAoJWQpIGlzIG5vdCAwLlxuIiwKKwkJCQkgY291bnQpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXNwaW5fdW5sb2NrKCZlbmNvZGVfbWFuYWdlci5ldmVudC5zZW1fbG9jayk7CisJCWVuY29kZV9tYW5hZ2VyLnByb2Nlc3NfcXVldWVfc3RhdGUgPSBFTkNPREVfUFJPQ0VTU19RVUVVRV9TVE9QOworCQlzZW5kX3NpZyhTSUdURVJNLCBlbmNvZGVfbWFuYWdlci5lbmNvZGVfdGhyZWFkLCAxKTsKKwkJY29tcGxldGUoJmVuY29kZV9tYW5hZ2VyLmV2ZW50LnJlcXVlc3RfaW5fY29tKTsKKwkJa3RocmVhZF9zdG9wKGVuY29kZV9tYW5hZ2VyLmVuY29kZV90aHJlYWQpOworCQllbmNvZGVfbWFuYWdlci5lbmNvZGVfdGhyZWFkID0gTlVMTDsKKwkJa2ZyZWUobWNfYWRkcik7CisJCW1jX2FkZHIgPSBOVUxMOworCX0KKwlyZXR1cm4gIDA7Cit9CisKK3N0YXRpYyBzMzIgZW5jb2RlX3dxX2luaXQodm9pZCkKK3sKKwl1MzIgaSA9IDA7CisJc3RydWN0IGVuY29kZV9xdWV1ZV9pdGVtX3MgKnBpdGVtID0gTlVMTDsKKworCWVuY19wcihMT0dfREVCVUcsICJlbmNvZGVfd3FfaW5pdC5cbiIpOworCisJc3Bpbl9sb2NrX2luaXQoJmVuY29kZV9tYW5hZ2VyLmV2ZW50LnNlbV9sb2NrKTsKKwlzcGluX2xvY2soJmVuY29kZV9tYW5hZ2VyLmV2ZW50LnNlbV9sb2NrKTsKKwllbmNvZGVfbWFuYWdlci5pcnFfcmVxdWVzdGVkID0gZmFsc2U7CisJaW5pdF9jb21wbGV0aW9uKCZlbmNvZGVfbWFuYWdlci5ldmVudC5yZXF1ZXN0X2luX2NvbSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZW5jb2RlX21hbmFnZXIuZXZlbnQuaHdfY29tcGxldGUpOworCWluaXRfY29tcGxldGlvbigmZW5jb2RlX21hbmFnZXIuZXZlbnQucHJvY2Vzc19jb21wbGV0ZSk7CisJSU5JVF9MSVNUX0hFQUQoJmVuY29kZV9tYW5hZ2VyLnByb2Nlc3NfcXVldWUpOworCUlOSVRfTElTVF9IRUFEKCZlbmNvZGVfbWFuYWdlci5mcmVlX3F1ZXVlKTsKKwlJTklUX0xJU1RfSEVBRCgmZW5jb2RlX21hbmFnZXIud3EpOworCisJdGFza2xldF9pbml0KCZlbmNvZGVfbWFuYWdlci5lbmNvZGVfdGFza2xldCwKKwkJZW5jb2RlX2lzcl90YXNrbGV0LAorCQkodWxvbmcpJmVuY29kZV9tYW5hZ2VyKTsKKworCXNwaW5fdW5sb2NrKCZlbmNvZGVfbWFuYWdlci5ldmVudC5zZW1fbG9jayk7CisJZm9yIChpID0gMDsgaSA8IE1BWF9FTkNPREVfUkVRVUVTVDsgaSsrKSB7CisJCXBpdGVtID0ga2NhbGxvYygxLAorCQkJc2l6ZW9mKHN0cnVjdCBlbmNvZGVfcXVldWVfaXRlbV9zKSwKKwkJCUdGUF9LRVJORUwpOworCQlpZiAoSVNfRVJSKHBpdGVtKSkgeworCQkJZW5jX3ByKExPR19FUlJPUiwgImNhbid0IHJlcXVlc3QgcXVldWUgaXRlbSBtZW1vcnkuXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlwaXRlbS0+cmVxdWVzdC5wYXJlbnQgPSBOVUxMOworCQlsaXN0X2FkZF90YWlsKCZwaXRlbS0+bGlzdCwgJmVuY29kZV9tYW5hZ2VyLmZyZWVfcXVldWUpOworCX0KKwlzcGluX2xvY2soJmVuY29kZV9tYW5hZ2VyLmV2ZW50LnNlbV9sb2NrKTsKKwllbmNvZGVfbWFuYWdlci5jdXJyZW50X3dxID0gTlVMTDsKKwllbmNvZGVfbWFuYWdlci5sYXN0X3dxID0gTlVMTDsKKwllbmNvZGVfbWFuYWdlci5lbmNvZGVfdGhyZWFkID0gTlVMTDsKKwllbmNvZGVfbWFuYWdlci5jdXJyZW50X2l0ZW0gPSBOVUxMOworCWVuY29kZV9tYW5hZ2VyLndxX2NvdW50ID0gMDsKKwllbmNvZGVfbWFuYWdlci5yZW1vdmVfZmxhZyA9IGZhbHNlOworCXNwaW5fdW5sb2NrKCZlbmNvZGVfbWFuYWdlci5ldmVudC5zZW1fbG9jayk7CisJSW5pdEVuY29kZVdlaWdodCgpOworCWlmIChlbmNvZGVfc3RhcnRfbW9uaXRvcigpKSB7CisJCWVuY19wcihMT0dfRVJST1IsICJlbmNvZGUgY3JlYXRlIHRocmVhZCBlcnJvci5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgczMyIGVuY29kZV93cV91bmluaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZW5jb2RlX3F1ZXVlX2l0ZW1fcyAqcGl0ZW0sICp0bXA7CisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKKwl1MzIgY291bnQgPSAwOworCXMzMiByID0gLTE7CisKKwllbmNfcHIoTE9HX0RFQlVHLCAidW5pbml0IGVuY29kZSB3cS5cbiIpOworCWlmIChlbmNvZGVfc3RvcF9tb25pdG9yKCkgPT0gMCkgeworCQlpZiAoKGVuY29kZV9tYW5hZ2VyLmlycV9udW0gPj0gMCkgJiYKKwkJCShlbmNvZGVfbWFuYWdlci5pcnFfcmVxdWVzdGVkID09IHRydWUpKSB7CisJCQlmcmVlX2lycShlbmNvZGVfbWFuYWdlci5pcnFfbnVtLCAmZW5jb2RlX21hbmFnZXIpOworCQkJZW5jb2RlX21hbmFnZXIuaXJxX3JlcXVlc3RlZCA9IGZhbHNlOworCQl9CisJCXNwaW5fbG9jaygmZW5jb2RlX21hbmFnZXIuZXZlbnQuc2VtX2xvY2spOworCQloZWFkID0gICZlbmNvZGVfbWFuYWdlci5wcm9jZXNzX3F1ZXVlOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGl0ZW0sIHRtcCwgaGVhZCwgbGlzdCkgeworCQkJaWYgKHBpdGVtKSB7CisJCQkJbGlzdF9kZWwoJnBpdGVtLT5saXN0KTsKKwkJCQlrZnJlZShwaXRlbSk7CisJCQkJY291bnQrKzsKKwkJCX0KKwkJfQorCQloZWFkID0gICZlbmNvZGVfbWFuYWdlci5mcmVlX3F1ZXVlOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGl0ZW0sIHRtcCwgaGVhZCwgbGlzdCkgeworCQkJaWYgKHBpdGVtKSB7CisJCQkJbGlzdF9kZWwoJnBpdGVtLT5saXN0KTsKKwkJCQlrZnJlZShwaXRlbSk7CisJCQkJY291bnQrKzsKKwkJCX0KKwkJfQorCQlzcGluX3VubG9jaygmZW5jb2RlX21hbmFnZXIuZXZlbnQuc2VtX2xvY2spOworCQlpZiAoY291bnQgPT0gTUFYX0VOQ09ERV9SRVFVRVNUKQorCQkJciA9IDA7CisJCWVsc2UgeworCQkJZW5jX3ByKExPR19FUlJPUiwgImxvc3Qgc29tZSByZXF1ZXN0IGl0ZW0gJWQuXG4iLAorCQkJCU1BWF9FTkNPREVfUkVRVUVTVCAtIGNvdW50KTsKKwkJfQorCX0KKwlyZXR1cm4gIHI7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGVuY29kZV9zdGF0dXNfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYSwKKwkJCQkgIHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwl1MzIgcHJvY2Vzc19jb3VudCA9IDA7CisJdTMyIGZyZWVfY291bnQgPSAwOworCXN0cnVjdCBlbmNvZGVfcXVldWVfaXRlbV9zICpwaXRlbSA9IE5VTEw7CisJc3RydWN0IGVuY29kZV93cV9zICpjdXJyZW50X3dxID0gTlVMTDsKKwlzdHJ1Y3QgZW5jb2RlX3dxX3MgKmxhc3Rfd3EgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSBOVUxMOworCXMzMiBpcnFfbnVtID0gMDsKKwl1MzIgaHdfc3RhdHVzID0gMDsKKwl1MzIgcHJvY2Vzc19xdWV1ZV9zdGF0ZSA9IDA7CisJdTMyIHdxX2NvdW50ID0gMDsKKwl1MzIgdWNvZGVfaW5kZXg7CisJYm9vbCBuZWVkX3Jlc2V0OworCWJvb2wgcHJvY2Vzc19pcnE7CisJYm9vbCBpbml0ZWQ7CisJYm9vbCB1c2VfcmVzZXJ2ZTsKKwlzdHJ1Y3QgQnVmZl9zIHJlc2VydmVfbWVtOworCXUzMiBtYXhfaW5zdGFuY2U7CisjaWZkZWYgQ09ORklHX0NNQQorCWJvb2wgY2hlY2tfY21hID0gZmFsc2U7CisjZW5kaWYKKworCXNwaW5fbG9jaygmZW5jb2RlX21hbmFnZXIuZXZlbnQuc2VtX2xvY2spOworCWhlYWQgPSAmZW5jb2RlX21hbmFnZXIuZnJlZV9xdWV1ZTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBpdGVtLCBoZWFkLCBsaXN0KSB7CisJCWZyZWVfY291bnQrKzsKKwkJaWYgKGZyZWVfY291bnQgPiBNQVhfRU5DT0RFX1JFUVVFU1QpCisJCQlicmVhazsKKwl9CisKKwloZWFkID0gJmVuY29kZV9tYW5hZ2VyLnByb2Nlc3NfcXVldWU7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwaXRlbSwgaGVhZCwgbGlzdCkgeworCQlwcm9jZXNzX2NvdW50Kys7CisJCWlmIChwcm9jZXNzX2NvdW50ID4gTUFYX0VOQ09ERV9SRVFVRVNUKQorCQkJYnJlYWs7CisJfQorCisJY3VycmVudF93cSA9IGVuY29kZV9tYW5hZ2VyLmN1cnJlbnRfd3E7CisJbGFzdF93cSA9IGVuY29kZV9tYW5hZ2VyLmxhc3Rfd3E7CisJcGl0ZW0gPSBlbmNvZGVfbWFuYWdlci5jdXJyZW50X2l0ZW07CisJaXJxX251bSA9IGVuY29kZV9tYW5hZ2VyLmlycV9udW07CisJaHdfc3RhdHVzID0gZW5jb2RlX21hbmFnZXIuZW5jb2RlX2h3X3N0YXR1czsKKwlwcm9jZXNzX3F1ZXVlX3N0YXRlID0gZW5jb2RlX21hbmFnZXIucHJvY2Vzc19xdWV1ZV9zdGF0ZTsKKwl3cV9jb3VudCA9IGVuY29kZV9tYW5hZ2VyLndxX2NvdW50OworCXVjb2RlX2luZGV4ID0gZW5jb2RlX21hbmFnZXIudWNvZGVfaW5kZXg7CisJbmVlZF9yZXNldCA9IGVuY29kZV9tYW5hZ2VyLm5lZWRfcmVzZXQ7CisJcHJvY2Vzc19pcnEgPSBlbmNvZGVfbWFuYWdlci5wcm9jZXNzX2lycTsKKwlpbml0ZWQgPSBlbmNvZGVfbWFuYWdlci5pbml0ZWQ7CisJdXNlX3Jlc2VydmUgPSBlbmNvZGVfbWFuYWdlci51c2VfcmVzZXJ2ZTsKKwlyZXNlcnZlX21lbS5idWZfc3RhcnQgPSBlbmNvZGVfbWFuYWdlci5yZXNlcnZlX21lbS5idWZfc3RhcnQ7CisJcmVzZXJ2ZV9tZW0uYnVmX3NpemUgPSBlbmNvZGVfbWFuYWdlci5yZXNlcnZlX21lbS5idWZfc2l6ZTsKKworCW1heF9pbnN0YW5jZSA9IGVuY29kZV9tYW5hZ2VyLm1heF9pbnN0YW5jZTsKKyNpZmRlZiBDT05GSUdfQ01BCisJY2hlY2tfY21hID0gZW5jb2RlX21hbmFnZXIuY2hlY2tfY21hOworI2VuZGlmCisKKwlzcGluX3VubG9jaygmZW5jb2RlX21hbmFnZXIuZXZlbnQuc2VtX2xvY2spOworCisJZW5jX3ByKExPR19ERUJVRywKKwkJImVuY29kZSBwcm9jZXNzIHF1ZXVlIGNvdW50OiAlZCwgZnJlZSBxdWV1ZSBjb3VudDogJWQuXG4iLAorCQlwcm9jZXNzX2NvdW50LCBmcmVlX2NvdW50KTsKKwllbmNfcHIoTE9HX0RFQlVHLAorCQkiZW5jb2RlIGN1cmVudCB3cTogJXAsIGxhc3Qgd3E6ICVwLCB3cSBjb3VudDogJWQsIG1heF9pbnN0YW5jZTogJWQuXG4iLAorCQljdXJyZW50X3dxLCBsYXN0X3dxLCB3cV9jb3VudCwgbWF4X2luc3RhbmNlKTsKKwlpZiAoY3VycmVudF93cSkKKwkJZW5jX3ByKExPR19ERUJVRywKKwkJCSJlbmNvZGUgY3VyZW50IHdxIC0tIGVuY29kZSB3aWR0aDogJWQsIGVuY29kZSBoZWlnaHQ6ICVkLlxuIiwKKwkJCWN1cnJlbnRfd3EtPnBpYy5lbmNvZGVyX3dpZHRoLAorCQkJY3VycmVudF93cS0+cGljLmVuY29kZXJfaGVpZ2h0KTsKKwllbmNfcHIoTE9HX0RFQlVHLAorCQkiZW5jb2RlIGN1cmVudCBwaXRlbTogJXAsIHVjb2RlX2luZGV4OiAlZCwgaHdfc3RhdHVzOiAlZCwgbmVlZF9yZXNldDogJXMsIHByb2Nlc3NfaXJxOiAlcy5cbiIsCisJCXBpdGVtLCB1Y29kZV9pbmRleCwgaHdfc3RhdHVzLCBuZWVkX3Jlc2V0ID8gInRydWUiIDogImZhbHNlIiwKKwkJcHJvY2Vzc19pcnEgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKwllbmNfcHIoTE9HX0RFQlVHLAorCQkiZW5jb2RlIGlycSBudW06ICVkLCAgaW5pdGVkOiAlcywgcHJvY2Vzc19xdWV1ZV9zdGF0ZTogJWQuXG4iLAorCQlpcnFfbnVtLCBpbml0ZWQgPyAidHJ1ZSIgOiAiZmFsc2UiLCAgcHJvY2Vzc19xdWV1ZV9zdGF0ZSk7CisJaWYgKHVzZV9yZXNlcnZlKSB7CisJCWVuY19wcihMT0dfREVCVUcsCisJCQkiZW5jb2RlIHVzZSByZXNlcnZlIG1lbW9yeSwgYnVmZmVyIHN0YXJ0OiAweCV4LCBzaXplOiAlZCBNQi5cbiIsCisJCQkgcmVzZXJ2ZV9tZW0uYnVmX3N0YXJ0LAorCQkJIHJlc2VydmVfbWVtLmJ1Zl9zaXplIC8gU1pfMU0pOworCX0gZWxzZSB7CisjaWZkZWYgQ09ORklHX0NNQQorCQllbmNfcHIoTE9HX0RFQlVHLCAiZW5jb2RlIGNoZWNrIGNtYTogJXMuXG4iLAorCQkJY2hlY2tfY21hID8gInRydWUiIDogImZhbHNlIik7CisjZW5kaWYKKwl9CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgNDAsICJlbmNvZGUgbWF4IGluc3RhbmNlOiAlZFxuIiwgbWF4X2luc3RhbmNlKTsKK30KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gS0VSTkVMX1ZFUlNJT04oNCwxMywxKQorc3RhdGljIHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgYW12ZW5jX2NsYXNzX2F0dHJzW10gPSB7CisJX19BVFRSKGVuY29kZV9zdGF0dXMsCisJU19JUlVHTyB8IFNfSVdVU1IsCisJZW5jb2RlX3N0YXR1c19zaG93LAorCU5VTEwpLAorCV9fQVRUUl9OVUxMCit9OworCitzdGF0aWMgc3RydWN0IGNsYXNzIGFtdmVuY19hdmNfY2xhc3MgPSB7CisJLm5hbWUgPSBDTEFTU19OQU1FLAorCS5jbGFzc19hdHRycyA9IGFtdmVuY19jbGFzc19hdHRycywKK307CisjZWxzZSAvKiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gS0VSTkVMX1ZFUlNJT04oNCwxMywxKSAgKi8KK3N0YXRpYyBDTEFTU19BVFRSX1JPKGVuY29kZV9zdGF0dXMpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYW12ZW5jX2F2Y19jbGFzc19hdHRyc1tdID0geworCSZjbGFzc19hdHRyX2VuY29kZV9zdGF0dXMuYXR0ciwKKwlOVUxMCit9OworCitBVFRSSUJVVEVfR1JPVVBTKGFtdmVuY19hdmNfY2xhc3MpOworCitzdGF0aWMgc3RydWN0IGNsYXNzIGFtdmVuY19hdmNfY2xhc3MgPSB7CisJLm5hbWUgPSBDTEFTU19OQU1FLAorCS5jbGFzc19ncm91cHMgPSBhbXZlbmNfYXZjX2NsYXNzX2dyb3VwcywKK307CisjZW5kaWYgLyogTElOVVhfVkVSU0lPTl9DT0RFIDw9IEtFUk5FTF9WRVJTSU9OKDQsMTMsMSkgICovCitzMzIgaW5pdF9hdmNfZGV2aWNlKHZvaWQpCit7CisJczMyICByID0gMDsKKworCXIgPSByZWdpc3Rlcl9jaHJkZXYoMCwgREVWSUNFX05BTUUsICZhbXZlbmNfYXZjX2ZvcHMpOworCWlmIChyIDw9IDApIHsKKwkJZW5jX3ByKExPR19FUlJPUiwgInJlZ2lzdGVyIGFtdmVuY19hdmMgZGV2aWNlIGVycm9yLlxuIik7CisJCXJldHVybiAgcjsKKwl9CisJYXZjX2RldmljZV9tYWpvciA9IHI7CisKKwlyID0gY2xhc3NfcmVnaXN0ZXIoJmFtdmVuY19hdmNfY2xhc3MpOworCWlmIChyIDwgMCkgeworCQllbmNfcHIoTE9HX0VSUk9SLCAiZXJyb3IgY3JlYXRlIGFtdmVuY19hdmMgY2xhc3MuXG4iKTsKKwkJcmV0dXJuIHI7CisJfQorCisJYW12ZW5jX2F2Y19kZXYgPSBkZXZpY2VfY3JlYXRlKCZhbXZlbmNfYXZjX2NsYXNzLCBOVUxMLAorCQlNS0RFVihhdmNfZGV2aWNlX21ham9yLCAwKSwgTlVMTCwKKwkJREVWSUNFX05BTUUpOworCisJaWYgKElTX0VSUihhbXZlbmNfYXZjX2RldikpIHsKKwkJZW5jX3ByKExPR19FUlJPUiwgImNyZWF0ZSBhbXZlbmNfYXZjIGRldmljZSBlcnJvci5cbiIpOworCQljbGFzc191bnJlZ2lzdGVyKCZhbXZlbmNfYXZjX2NsYXNzKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gcjsKK30KKworczMyIHVuaW5pdF9hdmNfZGV2aWNlKHZvaWQpCit7CisJaWYgKGFtdmVuY19hdmNfZGV2KQorCQlkZXZpY2VfZGVzdHJveSgmYW12ZW5jX2F2Y19jbGFzcywgTUtERVYoYXZjX2RldmljZV9tYWpvciwgMCkpOworCisJY2xhc3NfZGVzdHJveSgmYW12ZW5jX2F2Y19jbGFzcyk7CisKKwl1bnJlZ2lzdGVyX2NocmRldihhdmNfZGV2aWNlX21ham9yLCBERVZJQ0VfTkFNRSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzMzIgYXZjX21lbV9kZXZpY2VfaW5pdChzdHJ1Y3QgcmVzZXJ2ZWRfbWVtICpybWVtLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJczMyIHI7CisJc3RydWN0IHJlc291cmNlIHJlczsKKworCWlmICghcm1lbSkgeworCQllbmNfcHIoTE9HX0VSUk9SLAorCQkJIkNhbiBub3Qgb2J0YWluIEkvTyBtZW1vcnksIGFuZCB3aWxsIGFsbG9jYXRlIGF2YyBidWZmZXIhXG4iKTsKKwkJciA9IC1FRkFVTFQ7CisJCXJldHVybiByOworCX0KKwlyZXMuc3RhcnQgPSAocGh5c19hZGRyX3Qpcm1lbS0+YmFzZTsKKwlyZXMuZW5kID0gcmVzLnN0YXJ0ICsgKHBoeXNfYWRkcl90KXJtZW0tPnNpemUgLSAxOworCWVuY29kZV9tYW5hZ2VyLnJlc2VydmVfbWVtLmJ1Zl9zdGFydCA9IHJlcy5zdGFydDsKKwllbmNvZGVfbWFuYWdlci5yZXNlcnZlX21lbS5idWZfc2l6ZSA9IHJlcy5lbmQgLSByZXMuc3RhcnQgKyAxOworCisJaWYgKGVuY29kZV9tYW5hZ2VyLnJlc2VydmVfbWVtLmJ1Zl9zaXplID49CisJCWFtdmVuY19idWZmc3BlY1swXS5taW5fYnVmZnNpemUpIHsKKwkJZW5jb2RlX21hbmFnZXIubWF4X2luc3RhbmNlID0KKwkJCWVuY29kZV9tYW5hZ2VyLnJlc2VydmVfbWVtLmJ1Zl9zaXplIC8KKwkJCWFtdmVuY19idWZmc3BlY1swXS5taW5fYnVmZnNpemU7CisJCWlmIChlbmNvZGVfbWFuYWdlci5tYXhfaW5zdGFuY2UgPiBNQVhfRU5DT0RFX0lOU1RBTkNFKQorCQkJZW5jb2RlX21hbmFnZXIubWF4X2luc3RhbmNlID0gTUFYX0VOQ09ERV9JTlNUQU5DRTsKKwkJZW5jb2RlX21hbmFnZXIucmVzZXJ2ZV9idWZmID0ga3phbGxvYygKKwkJCWVuY29kZV9tYW5hZ2VyLm1heF9pbnN0YW5jZSAqCisJCQlzaXplb2Yoc3RydWN0IEJ1ZmZfcyksIEdGUF9LRVJORUwpOworCQlpZiAoZW5jb2RlX21hbmFnZXIucmVzZXJ2ZV9idWZmKSB7CisJCQl1MzIgaTsKKwkJCXN0cnVjdCBCdWZmX3MgKnJlc2VydmVfYnVmZjsKKwkJCXUzMiBtYXhfaW5zdGFuY2UgPSBlbmNvZGVfbWFuYWdlci5tYXhfaW5zdGFuY2U7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBtYXhfaW5zdGFuY2U7IGkrKykgeworCQkJCXJlc2VydmVfYnVmZiA9ICZlbmNvZGVfbWFuYWdlci5yZXNlcnZlX2J1ZmZbaV07CisJCQkJcmVzZXJ2ZV9idWZmLT5idWZfc3RhcnQgPQorCQkJCQlpICoKKwkJCQkJYW12ZW5jX2J1ZmZzcGVjWzBdCisJCQkJCS5taW5fYnVmZnNpemUgKworCQkJCQllbmNvZGVfbWFuYWdlci5yZXNlcnZlX21lbS5idWZfc3RhcnQ7CisJCQkJcmVzZXJ2ZV9idWZmLT5idWZfc2l6ZSA9CisJCQkJCWVuY29kZV9tYW5hZ2VyLnJlc2VydmVfbWVtLmJ1Zl9zdGFydDsKKwkJCQlyZXNlcnZlX2J1ZmYtPnVzZWQgPSBmYWxzZTsKKwkJCX0KKwkJCWVuY29kZV9tYW5hZ2VyLnVzZV9yZXNlcnZlID0gdHJ1ZTsKKwkJCXIgPSAwOworCQkJZW5jX3ByKExPR19ERUJVRywKKwkJCQkiYW12ZW5jX2F2YyAgdXNlIHJlc2VydmUgbWVtb3J5LCBidWZmIHN0YXJ0OiAweCV4LCBzaXplOiAweCV4LCBtYXggaW5zdGFuY2UgaXMgJWRcbiIsCisJCQkJZW5jb2RlX21hbmFnZXIucmVzZXJ2ZV9tZW0uYnVmX3N0YXJ0LAorCQkJCWVuY29kZV9tYW5hZ2VyLnJlc2VydmVfbWVtLmJ1Zl9zaXplLAorCQkJCWVuY29kZV9tYW5hZ2VyLm1heF9pbnN0YW5jZSk7CisJCX0gZWxzZSB7CisJCQllbmNfcHIoTE9HX0VSUk9SLAorCQkJCSJhbXZlbmNfYXZjIGFsbG9jIHJlc2VydmUgYnVmZmVyIHBvaW50ZXIgZmFpbC4gbWF4IGluc3RhbmNlIGlzICVkLlxuIiwKKwkJCQllbmNvZGVfbWFuYWdlci5tYXhfaW5zdGFuY2UpOworCQkJZW5jb2RlX21hbmFnZXIubWF4X2luc3RhbmNlID0gMDsKKwkJCWVuY29kZV9tYW5hZ2VyLnJlc2VydmVfbWVtLmJ1Zl9zdGFydCA9IDA7CisJCQllbmNvZGVfbWFuYWdlci5yZXNlcnZlX21lbS5idWZfc2l6ZSA9IDA7CisJCQlyID0gLUVOT01FTTsKKwkJfQorCX0gZWxzZSB7CisJCWVuY19wcihMT0dfRVJST1IsCisJCQkiYW12ZW5jX2F2YyBtZW1vcnkgcmVzb3VyY2UgdG9vIHNtYWxsLCBzaXplIGlzIDB4JXguIE5lZWQgMHgleCBieXRlcyBhdCBsZWFzdC5cbiIsCisJCQllbmNvZGVfbWFuYWdlci5yZXNlcnZlX21lbS5idWZfc2l6ZSwKKwkJCWFtdmVuY19idWZmc3BlY1swXQorCQkJLm1pbl9idWZmc2l6ZSk7CisJCWVuY29kZV9tYW5hZ2VyLnJlc2VydmVfbWVtLmJ1Zl9zdGFydCA9IDA7CisJCWVuY29kZV9tYW5hZ2VyLnJlc2VydmVfbWVtLmJ1Zl9zaXplID0gMDsKKwkJciA9IC1FTk9NRU07CisJfQorCXJldHVybiByOworfQorCitzdGF0aWMgczMyIGFtdmVuY19hdmNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwkvKiBzdHJ1Y3QgcmVzb3VyY2UgbWVtOyAqLworCXMzMiByZXNfaXJxOworCXMzMiBpZHg7CisJczMyIHI7CisKKwllbmNfcHIoTE9HX0lORk8sICJhbXZlbmNfYXZjIHByb2JlIHN0YXJ0LlxuIik7CisKKwllbmNvZGVfbWFuYWdlci50aGlzX3BkZXYgPSBwZGV2OworI2lmZGVmIENPTkZJR19DTUEKKwllbmNvZGVfbWFuYWdlci5jaGVja19jbWEgPSBmYWxzZTsKKyNlbmRpZgorCWVuY29kZV9tYW5hZ2VyLnJlc2VydmVfbWVtLmJ1Zl9zdGFydCA9IDA7CisJZW5jb2RlX21hbmFnZXIucmVzZXJ2ZV9tZW0uYnVmX3NpemUgPSAwOworCWVuY29kZV9tYW5hZ2VyLnVzZV9yZXNlcnZlID0gZmFsc2U7CisJZW5jb2RlX21hbmFnZXIubWF4X2luc3RhbmNlID0gMDsKKwllbmNvZGVfbWFuYWdlci5yZXNlcnZlX2J1ZmYgPSBOVUxMOworCisJaWR4ID0gb2ZfcmVzZXJ2ZWRfbWVtX2RldmljZV9pbml0KCZwZGV2LT5kZXYpOworCisJaWYgKGlkeCAhPSAwKSB7CisJCWVuY19wcihMT0dfREVCVUcsCisJCQkiYW12ZW5jX2F2Y19wcm9iZSAtLSByZXNlcnZlZCBtZW1vcnkgY29uZmlnIGZhaWwuXG4iKTsKKwl9CisKKworCWlmIChlbmNvZGVfbWFuYWdlci51c2VfcmVzZXJ2ZSA9PSBmYWxzZSkgeworI2lmbmRlZiBDT05GSUdfQ01BCisJCWVuY19wcihMT0dfRVJST1IsCisJCQkiYW12ZW5jX2F2YyBtZW1vcnkgaXMgaW52YWlsZCwgcHJvYmUgZmFpbCFcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKyNlbHNlCisJCWVuY29kZV9tYW5hZ2VyLmNtYV9wb29sX3NpemUgPQorCQkJKGNvZGVjX21tX2dldF90b3RhbF9zaXplKCkgPiAoTUlOX1NJWkUgKiAzKSkgPworCQkJKE1JTl9TSVpFICogMykgOiBjb2RlY19tbV9nZXRfdG90YWxfc2l6ZSgpOworCQllbmNfcHIoTE9HX0RFQlVHLAorCQkJImFtdmVuY19hdmMgLSBjbWEgbWVtb3J5IHBvb2wgc2l6ZTogJWQgTUJcbiIsCisJCQkodTMyKWVuY29kZV9tYW5hZ2VyLmNtYV9wb29sX3NpemUgLyBTWl8xTSk7CisjZW5kaWYKKwl9CisKKwlpZiAoZ2V0X2NwdV90eXBlKCkgPj0gTUVTT05fQ1BVX01BSk9SX0lEX1NDMikgeworCQlpZiAoaGNvZGVjX2Nsa19wcmVwYXJlKCZwZGV2LT5kZXYsICZzX2hjb2RlY19jbGtzKSkgeworCQkJLy9lcnIgPSAtRU5PRU5UOworCQkJZW5jX3ByKExPR19FUlJPUiwgIlslczolZF0gcHJvYmUgaGNvZGVjIGVuYyBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworCQkJLy9nb3RvIEVSUk9SX1BST0JFX0RFVklDRTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJaWYgKGdldF9jcHVfdHlwZSgpID49IE1FU09OX0NQVV9NQUpPUl9JRF9TQzIpIHsKKwkJaGNvZGVjX3JzdCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoJnBkZXYtPmRldiwgImhjb2RlY19yc3QiKTsKKwkJaWYgKElTX0VSUihoY29kZWNfcnN0KSkKKwkJCXByX2VycigiYW12ZW5jIHByb2JlLCBoY29kZWMgZ2V0IHJlc2V0IGZhaWxlZDogJWxkXG4iLCBQVFJfRVJSKGhjb2RlY19yc3QpKTsKKwl9CisKKwlyZXNfaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAocmVzX2lycSA8IDApIHsKKwkJZW5jX3ByKExPR19FUlJPUiwgIlslc10gZ2V0IGlycSBlcnJvciEiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWVuY29kZV9tYW5hZ2VyLmlycV9udW0gPSByZXNfaXJxOworCWlmIChlbmNvZGVfd3FfaW5pdCgpKSB7CisJCWtmcmVlKGVuY29kZV9tYW5hZ2VyLnJlc2VydmVfYnVmZik7CisJCWVuY29kZV9tYW5hZ2VyLnJlc2VydmVfYnVmZiA9IE5VTEw7CisJCWVuY19wcihMT0dfRVJST1IsICJlbmNvZGUgd29yayBxdWV1ZSBpbml0IGVycm9yLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXIgPSBpbml0X2F2Y19kZXZpY2UoKTsKKwllbmNfcHIoTE9HX0lORk8sICJhbXZlbmNfYXZjIHByb2JlIGVuZC5cbiIpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBzMzIgYW12ZW5jX2F2Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlrZnJlZShlbmNvZGVfbWFuYWdlci5yZXNlcnZlX2J1ZmYpOworCWVuY29kZV9tYW5hZ2VyLnJlc2VydmVfYnVmZiA9IE5VTEw7CisJaWYgKGVuY29kZV93cV91bmluaXQoKSkKKwkJZW5jX3ByKExPR19FUlJPUiwgImVuY29kZSB3b3JrIHF1ZXVlIHVuaW5pdCBlcnJvci5cbiIpOworCXVuaW5pdF9hdmNfZGV2aWNlKCk7CisJaGNvZGVjX2Nsa191bnByZXBhcmUoJnBkZXYtPmRldiwgJnNfaGNvZGVjX2Nsa3MpOworCWVuY19wcihMT0dfSU5GTywgImFtdmVuY19hdmMgcmVtb3ZlLlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFtbG9naWNfYXZjZW5jX2R0X21hdGNoW10gPSB7CisJeworCQkuY29tcGF0aWJsZSA9ICJhbWxvZ2ljLCBhbXZlbmNfYXZjIiwKKwl9LAorCXt9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYW12ZW5jX2F2Y19kcml2ZXIgPSB7CisJLnByb2JlID0gYW12ZW5jX2F2Y19wcm9iZSwKKwkucmVtb3ZlID0gYW12ZW5jX2F2Y19yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gYW1sb2dpY19hdmNlbmNfZHRfbWF0Y2gsCisJfQorfTsKKworLyoKK3N0YXRpYyBzdHJ1Y3QgY29kZWNfcHJvZmlsZV90IGFtdmVuY19hdmNfcHJvZmlsZSA9IHsKKwkubmFtZSA9ICJhdmMiLAorCS5wcm9maWxlID0gIiIKK307CisqLworCitzdGF0aWMgczMyIF9faW5pdCBhbXZlbmNfYXZjX2RyaXZlcl9pbml0X21vZHVsZSh2b2lkKQoreworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3KSB7CisJCXByX2VycigiVDcgZG9lc24ndCBzdXBwb3J0IGhjb2RlYyBhdmMgZW5jb2RlciEhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWVuY19wcihMT0dfSU5GTywgImFtdmVuY19hdmMgbW9kdWxlIGluaXRcbiIpOworCisJaWYgKHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYW12ZW5jX2F2Y19kcml2ZXIpKSB7CisJCWVuY19wcihMT0dfRVJST1IsCisJCQkiZmFpbGVkIHRvIHJlZ2lzdGVyIGFtdmVuY19hdmMgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8vdmNvZGVjX3Byb2ZpbGVfcmVnaXN0ZXIoJmFtdmVuY19hdmNfcHJvZmlsZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhbXZlbmNfYXZjX2RyaXZlcl9yZW1vdmVfbW9kdWxlKHZvaWQpCit7CisJZW5jX3ByKExPR19JTkZPLCAiYW12ZW5jX2F2YyBtb2R1bGUgcmVtb3ZlLlxuIik7CisKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYW12ZW5jX2F2Y19kcml2ZXIpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlc2VydmVkX21lbV9vcHMgcm1lbV9hdmNfb3BzID0geworCS5kZXZpY2VfaW5pdCA9IGF2Y19tZW1fZGV2aWNlX2luaXQsCit9OworCitzdGF0aWMgczMyIF9faW5pdCBhdmNfbWVtX3NldHVwKHN0cnVjdCByZXNlcnZlZF9tZW0gKnJtZW0pCit7CisJcm1lbS0+b3BzID0gJnJtZW1fYXZjX29wczsKKwllbmNfcHIoTE9HX0RFQlVHLCAiYW12ZW5jX2F2YyByZXNlcnZlZCBtZW0gc2V0dXAuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNfZG1hX2J1Zl9tYXAoc3RydWN0IGVuY19kbWFfY2ZnICpjZmcpCit7CisJbG9uZyByZXQgPSAtMTsKKwlpbnQgZmQgPSAtMTsKKwlzdHJ1Y3QgZG1hX2J1ZiAqZGJ1ZiA9IE5VTEw7CisJc3RydWN0IGRtYV9idWZfYXR0YWNobWVudCAqZF9hdHQgPSBOVUxMOworCXN0cnVjdCBzZ190YWJsZSAqc2cgPSBOVUxMOworCXZvaWQgKnZhZGRyID0gTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBOVUxMOworCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcjsKKworCWlmIChjZmcgPT0gTlVMTCB8fCAoY2ZnLT5mZCA8IDApIHx8IGNmZy0+ZGV2ID09IE5VTEwpIHsKKwkJZW5jX3ByKExPR19FUlJPUiwgImVycm9yIGlucHV0IHBhcmFtXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWVuY19wcihMT0dfSU5GTywgImVuY19kbWFfYnVmX21hcCwgZmQgJWRcbiIsIGNmZy0+ZmQpOworCisJZmQgPSBjZmctPmZkOworCWRldiA9IGNmZy0+ZGV2OworCWRpciA9IGNmZy0+ZGlyOworCWVuY19wcihMT0dfSU5GTywgImVuY19kbWFfYnVmZmVyX21hcCBmZCAlZFxuIiwgZmQpOworCisJZGJ1ZiA9IGRtYV9idWZfZ2V0KGZkKTsKKwlpZiAoZGJ1ZiA9PSBOVUxMKSB7CisJCWVuY19wcihMT0dfRVJST1IsICJmYWlsZWQgdG8gZ2V0IGRtYSBidWZmZXIsZmQgJWRcbiIsZmQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkX2F0dCA9IGRtYV9idWZfYXR0YWNoKGRidWYsIGRldik7CisJaWYgKGRfYXR0ID09IE5VTEwpIHsKKwkJZW5jX3ByKExPR19FUlJPUiwgImZhaWxlZCB0byBzZXQgZG1hIGF0dGFjaFxuIik7CisJCWdvdG8gYXR0YWNoX2VycjsKKwl9CisKKwlzZyA9IGRtYV9idWZfbWFwX2F0dGFjaG1lbnQoZF9hdHQsIGRpcik7CisJaWYgKHNnID09IE5VTEwpIHsKKwkJZW5jX3ByKExPR19FUlJPUiwgImZhaWxlZCB0byBnZXQgZG1hIHNnXG4iKTsKKwkJZ290byBtYXBfYXR0YWNoX2VycjsKKwl9CisKKwlyZXQgPSBkbWFfYnVmX2JlZ2luX2NwdV9hY2Nlc3MoZGJ1ZiwgZGlyKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZW5jX3ByKExPR19FUlJPUiwgImZhaWxlZCB0byBhY2Nlc3MgZG1hIGJ1ZmZcbiIpOworCQlnb3RvIGFjY2Vzc19lcnI7CisJfQorCisJdmFkZHIgPSBkbWFfYnVmX3ZtYXAoZGJ1Zik7CisJaWYgKHZhZGRyID09IE5VTEwpIHsKKwkJZW5jX3ByKExPR19FUlJPUiwgImZhaWxlZCB0byB2bWFwIGRtYSBidWZcbiIpOworCQlnb3RvIHZtYXBfZXJyOworCX0KKwljZmctPmRidWYgPSBkYnVmOworCWNmZy0+YXR0YWNoID0gZF9hdHQ7CisJY2ZnLT52YWRkciA9IHZhZGRyOworCWNmZy0+c2cgPSBzZzsKKworCXJldHVybiByZXQ7CisKK3ZtYXBfZXJyOgorCWRtYV9idWZfZW5kX2NwdV9hY2Nlc3MoZGJ1ZiwgZGlyKTsKKworYWNjZXNzX2VycjoKKwlkbWFfYnVmX3VubWFwX2F0dGFjaG1lbnQoZF9hdHQsIHNnLCBkaXIpOworCittYXBfYXR0YWNoX2VycjoKKwlkbWFfYnVmX2RldGFjaChkYnVmLCBkX2F0dCk7CisKK2F0dGFjaF9lcnI6CisJZG1hX2J1Zl9wdXQoZGJ1Zik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGVuY19kbWFfYnVmX2dldF9waHlzKHN0cnVjdCBlbmNfZG1hX2NmZyAqY2ZnLCB1bnNpZ25lZCBsb25nICphZGRyKQoreworCXN0cnVjdCBzZ190YWJsZSAqc2dfdGFibGU7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IHJldDsKKwllbmNfcHIoTE9HX0lORk8sICJlbmNfZG1hX2J1Zl9nZXRfcGh5cyBpblxuIik7CisKKwlyZXQgPSBlbmNfZG1hX2J1Zl9tYXAoY2ZnKTsKKwlpZiAocmV0IDwgMCkgeworCQllbmNfcHIoTE9HX0VSUk9SLCAiZ2RjX2RtYV9idWZfbWFwIGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCWlmIChjZmctPnNnKSB7CisJCXNnX3RhYmxlID0gY2ZnLT5zZzsKKwkJcGFnZSA9IHNnX3BhZ2Uoc2dfdGFibGUtPnNnbCk7CisJCSphZGRyID0gUEZOX1BIWVMocGFnZV90b19wZm4ocGFnZSkpOworCQlyZXQgPSAwOworCX0KKwllbmNfcHIoTE9HX0lORk8sICJlbmNfZG1hX2J1Zl9nZXRfcGh5cyAweCVseFxuIiwgKmFkZHIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGVuY19kbWFfYnVmX3VubWFwKHN0cnVjdCBlbmNfZG1hX2NmZyAqY2ZnKQoreworCWludCBmZCA9IC0xOworCXN0cnVjdCBkbWFfYnVmICpkYnVmID0gTlVMTDsKKwlzdHJ1Y3QgZG1hX2J1Zl9hdHRhY2htZW50ICpkX2F0dCA9IE5VTEw7CisJc3RydWN0IHNnX3RhYmxlICpzZyA9IE5VTEw7CisJdm9pZCAqdmFkZHIgPSBOVUxMOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IE5VTEw7CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyOworCisJaWYgKGNmZyA9PSBOVUxMIHx8IChjZmctPmZkIDwgMCkgfHwgY2ZnLT5kZXYgPT0gTlVMTAorCQkJfHwgY2ZnLT5kYnVmID09IE5VTEwgfHwgY2ZnLT52YWRkciA9PSBOVUxMCisJCQl8fCBjZmctPmF0dGFjaCA9PSBOVUxMIHx8IGNmZy0+c2cgPT0gTlVMTCkgeworCQllbmNfcHIoTE9HX0VSUk9SLCAiRXJyb3IgaW5wdXQgcGFyYW1cbiIpOworCQlyZXR1cm47CisJfQorCisJZmQgPSBjZmctPmZkOworCWRldiA9IGNmZy0+ZGV2OworCWRpciA9IGNmZy0+ZGlyOworCWRidWYgPSBjZmctPmRidWY7CisJdmFkZHIgPSBjZmctPnZhZGRyOworCWRfYXR0ID0gY2ZnLT5hdHRhY2g7CisJc2cgPSBjZmctPnNnOworCisJZG1hX2J1Zl92dW5tYXAoZGJ1ZiwgdmFkZHIpOworCisJZG1hX2J1Zl9lbmRfY3B1X2FjY2VzcyhkYnVmLCBkaXIpOworCisJZG1hX2J1Zl91bm1hcF9hdHRhY2htZW50KGRfYXR0LCBzZywgZGlyKTsKKworCWRtYV9idWZfZGV0YWNoKGRidWYsIGRfYXR0KTsKKworCWRtYV9idWZfcHV0KGRidWYpOworCWVuY19wcihMT0dfREVCVUcsICJlbmNfZG1hX2J1ZmZlcl91bm1hcCB2YWRkciAlcFxuIiwodW5zaWduZWQgKil2YWRkcik7Cit9CisKKworbW9kdWxlX3BhcmFtKGZpeGVkX3NsaWNlX2NmZywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZpeGVkX3NsaWNlX2NmZywgIlxuIGZpeGVkX3NsaWNlX2NmZ1xuIik7CisKK21vZHVsZV9wYXJhbShjbG9ja19sZXZlbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNsb2NrX2xldmVsLCAiXG4gY2xvY2tfbGV2ZWxcbiIpOworCittb2R1bGVfcGFyYW0oZW5jb2RlX3ByaW50X2xldmVsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5jb2RlX3ByaW50X2xldmVsLCAiXG4gZW5jb2RlX3ByaW50X2xldmVsXG4iKTsKKworbW9kdWxlX3BhcmFtKG5vX3RpbWVvdXQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhub190aW1lb3V0LCAiXG4gbm9fdGltZW91dCBmbGFnIGZvciBwcm9jZXNzIHJlcXVlc3RcbiIpOworCittb2R1bGVfcGFyYW0obnJfbW9kZSwgaW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobnJfbW9kZSwgIlxuIG5yX21vZGUgb3B0aW9uXG4iKTsKKworbW9kdWxlX3BhcmFtKHFwX3RhYmxlX2RlYnVnLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocXBfdGFibGVfZGVidWcsICJcbiBwcmludCBxcCB0YWJsZVxuIik7CisKK21vZHVsZV9wYXJhbSh1c2VfcmVzZXRfY29udHJvbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHVzZV9yZXNldF9jb250cm9sLCAiXG4gdXNlX3Jlc2V0X2NvbnRyb2xcbiIpOworCittb2R1bGVfcGFyYW0odXNlX2dlMmQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh1c2VfZ2UyZCwgIlxuIHVzZV9nZTJkXG4iKTsKKworbW9kdWxlX3BhcmFtKGR1bXBfaW5wdXQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkdW1wX2lucHV0LCAiXG4gZHVtcF9pbnB1dFxuIik7CisKKyNpZmRlZiBIMjY0X0VOQ19TVkMKK21vZHVsZV9wYXJhbShzdmNfZW5hYmxlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3ZjX2VuYWJsZSwgIlxuIHN2YyBlbmFibGVcbiIpOworbW9kdWxlX3BhcmFtKHN2Y19yZWZfY29uZiwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHN2Y19yZWZfY29uZiwgIlxuIHN2YyByZWZlcmVuY2UgZHVyYXRpb24gY29uZmlnXG4iKTsKKyNlbmRpZgorCisjaWZkZWYgTU9SRV9NT0RVTEVfUEFSQU0KK21vZHVsZV9wYXJhbShtZV9tdl9tZXJnZV9jdGwsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhtZV9tdl9tZXJnZV9jdGwsICJcbiBtZV9tdl9tZXJnZV9jdGxcbiIpOworCittb2R1bGVfcGFyYW0obWVfc3RlcDBfY2xvc2VfbXYsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhtZV9zdGVwMF9jbG9zZV9tdiwgIlxuIG1lX3N0ZXAwX2Nsb3NlX212XG4iKTsKKworbW9kdWxlX3BhcmFtKG1lX2Zfc2tpcF9zYWQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhtZV9mX3NraXBfc2FkLCAiXG4gbWVfZl9za2lwX3NhZFxuIik7CisKK21vZHVsZV9wYXJhbShtZV9mX3NraXBfd2VpZ2h0LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobWVfZl9za2lwX3dlaWdodCwgIlxuIG1lX2Zfc2tpcF93ZWlnaHRcbiIpOworCittb2R1bGVfcGFyYW0obWVfbXZfd2VpZ2h0XzAxLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobWVfbXZfd2VpZ2h0XzAxLCAiXG4gbWVfbXZfd2VpZ2h0XzAxXG4iKTsKKworbW9kdWxlX3BhcmFtKG1lX212X3dlaWdodF8yMywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG1lX212X3dlaWdodF8yMywgIlxuIG1lX212X3dlaWdodF8yM1xuIik7CisKK21vZHVsZV9wYXJhbShtZV9zYWRfcmFuZ2VfaW5jLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MobWVfc2FkX3JhbmdlX2luYywgIlxuIG1lX3NhZF9yYW5nZV9pbmNcbiIpOworCittb2R1bGVfcGFyYW0obWVfc2FkX2Vub3VnaF8wMSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKG1lX3NhZF9lbm91Z2hfMDEsICJcbiBtZV9zYWRfZW5vdWdoXzAxXG4iKTsKKworbW9kdWxlX3BhcmFtKG1lX3NhZF9lbm91Z2hfMjMsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhtZV9zYWRfZW5vdWdoXzIzLCAiXG4gbWVfc2FkX2Vub3VnaF8yM1xuIik7CisKK21vZHVsZV9wYXJhbSh5X3Rucl9tY19lbiwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHlfdG5yX21jX2VuLCAiXG4geV90bnJfbWNfZW4gb3B0aW9uXG4iKTsKK21vZHVsZV9wYXJhbSh5X3Rucl90eHRfbW9kZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHlfdG5yX3R4dF9tb2RlLCAiXG4geV90bnJfdHh0X21vZGUgb3B0aW9uXG4iKTsKK21vZHVsZV9wYXJhbSh5X3Rucl9tb3Rfc2FkX21hcmdpbiwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHlfdG5yX21vdF9zYWRfbWFyZ2luLCAiXG4geV90bnJfbW90X3NhZF9tYXJnaW4gb3B0aW9uXG4iKTsKK21vZHVsZV9wYXJhbSh5X3Rucl9tb3RfY29ydHh0X3JhdGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh5X3Rucl9tb3RfY29ydHh0X3JhdGUsICJcbiB5X3Rucl9tb3RfY29ydHh0X3JhdGUgb3B0aW9uXG4iKTsKK21vZHVsZV9wYXJhbSh5X3Rucl9tb3RfZGlzdHh0X29mc3QsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh5X3Rucl9tb3RfZGlzdHh0X29mc3QsICJcbiB5X3Rucl9tb3RfZGlzdHh0X29mc3Qgb3B0aW9uXG4iKTsKK21vZHVsZV9wYXJhbSh5X3Rucl9tb3RfZGlzdHh0X3JhdGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh5X3Rucl9tb3RfZGlzdHh0X3JhdGUsICJcbiB5X3Rucl9tb3RfZGlzdHh0X3JhdGUgb3B0aW9uXG4iKTsKK21vZHVsZV9wYXJhbSh5X3Rucl9tb3RfZGlzbW90X29mc3QsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh5X3Rucl9tb3RfZGlzbW90X29mc3QsICJcbiB5X3Rucl9tb3RfZGlzbW90X29mc3Qgb3B0aW9uXG4iKTsKK21vZHVsZV9wYXJhbSh5X3Rucl9tb3RfZnJjc2FkX2xvY2ssIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh5X3Rucl9tb3RfZnJjc2FkX2xvY2ssICJcbiB5X3Rucl9tb3RfZnJjc2FkX2xvY2sgb3B0aW9uXG4iKTsKK21vZHVsZV9wYXJhbSh5X3Rucl9tb3QyYWxwX2ZyY19nYWluLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoeV90bnJfbW90MmFscF9mcmNfZ2FpbiwgIlxuIHlfdG5yX21vdDJhbHBfZnJjX2dhaW4gb3B0aW9uXG4iKTsKK21vZHVsZV9wYXJhbSh5X3Rucl9tb3QyYWxwX25ybV9nYWluLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoeV90bnJfbW90MmFscF9ucm1fZ2FpbiwgIlxuIHlfdG5yX21vdDJhbHBfbnJtX2dhaW4gb3B0aW9uXG4iKTsKK21vZHVsZV9wYXJhbSh5X3Rucl9tb3QyYWxwX2Rpc19nYWluLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoeV90bnJfbW90MmFscF9kaXNfZ2FpbiwgIlxuIHlfdG5yX21vdDJhbHBfZGlzX2dhaW4gb3B0aW9uXG4iKTsKK21vZHVsZV9wYXJhbSh5X3Rucl9tb3QyYWxwX2Rpc19vZnN0LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoeV90bnJfbW90MmFscF9kaXNfb2ZzdCwgIlxuIHlfdG5yX21vdDJhbHBfZGlzX29mc3Qgb3B0aW9uXG4iKTsKK21vZHVsZV9wYXJhbSh5X3Rucl9hbHBoYV9taW4sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh5X3Rucl9hbHBoYV9taW4sICJcbiB5X3Rucl9hbHBoYV9taW4gb3B0aW9uXG4iKTsKK21vZHVsZV9wYXJhbSh5X3Rucl9hbHBoYV9tYXgsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh5X3Rucl9hbHBoYV9tYXgsICJcbiB5X3Rucl9hbHBoYV9tYXggb3B0aW9uXG4iKTsKK21vZHVsZV9wYXJhbSh5X3Rucl9kZWdob3N0X29zLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoeV90bnJfZGVnaG9zdF9vcywgIlxuIHlfdG5yX2RlZ2hvc3Rfb3Mgb3B0aW9uXG4iKTsKKworbW9kdWxlX3BhcmFtKGNfdG5yX21jX2VuLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoY190bnJfbWNfZW4sICJcbiBjX3Rucl9tY19lbiBvcHRpb25cbiIpOworbW9kdWxlX3BhcmFtKGNfdG5yX3R4dF9tb2RlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoY190bnJfdHh0X21vZGUsICJcbiBjX3Rucl90eHRfbW9kZSBvcHRpb25cbiIpOworbW9kdWxlX3BhcmFtKGNfdG5yX21vdF9zYWRfbWFyZ2luLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoY190bnJfbW90X3NhZF9tYXJnaW4sICJcbiBjX3Rucl9tb3Rfc2FkX21hcmdpbiBvcHRpb25cbiIpOworbW9kdWxlX3BhcmFtKGNfdG5yX21vdF9jb3J0eHRfcmF0ZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNfdG5yX21vdF9jb3J0eHRfcmF0ZSwgIlxuIGNfdG5yX21vdF9jb3J0eHRfcmF0ZSBvcHRpb25cbiIpOworbW9kdWxlX3BhcmFtKGNfdG5yX21vdF9kaXN0eHRfb2ZzdCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNfdG5yX21vdF9kaXN0eHRfb2ZzdCwgIlxuIGNfdG5yX21vdF9kaXN0eHRfb2ZzdCBvcHRpb25cbiIpOworbW9kdWxlX3BhcmFtKGNfdG5yX21vdF9kaXN0eHRfcmF0ZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNfdG5yX21vdF9kaXN0eHRfcmF0ZSwgIlxuIGNfdG5yX21vdF9kaXN0eHRfcmF0ZSBvcHRpb25cbiIpOworbW9kdWxlX3BhcmFtKGNfdG5yX21vdF9kaXNtb3Rfb2ZzdCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNfdG5yX21vdF9kaXNtb3Rfb2ZzdCwgIlxuIGNfdG5yX21vdF9kaXNtb3Rfb2ZzdCBvcHRpb25cbiIpOworbW9kdWxlX3BhcmFtKGNfdG5yX21vdF9mcmNzYWRfbG9jaywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNfdG5yX21vdF9mcmNzYWRfbG9jaywgIlxuIGNfdG5yX21vdF9mcmNzYWRfbG9jayBvcHRpb25cbiIpOworbW9kdWxlX3BhcmFtKGNfdG5yX21vdDJhbHBfZnJjX2dhaW4sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhjX3Rucl9tb3QyYWxwX2ZyY19nYWluLCAiXG4gY190bnJfbW90MmFscF9mcmNfZ2FpbiBvcHRpb25cbiIpOworbW9kdWxlX3BhcmFtKGNfdG5yX21vdDJhbHBfbnJtX2dhaW4sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhjX3Rucl9tb3QyYWxwX25ybV9nYWluLCAiXG4gY190bnJfbW90MmFscF9ucm1fZ2FpbiBvcHRpb25cbiIpOworbW9kdWxlX3BhcmFtKGNfdG5yX21vdDJhbHBfZGlzX2dhaW4sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhjX3Rucl9tb3QyYWxwX2Rpc19nYWluLCAiXG4gY190bnJfbW90MmFscF9kaXNfZ2FpbiBvcHRpb25cbiIpOworbW9kdWxlX3BhcmFtKGNfdG5yX21vdDJhbHBfZGlzX29mc3QsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhjX3Rucl9tb3QyYWxwX2Rpc19vZnN0LCAiXG4gY190bnJfbW90MmFscF9kaXNfb2ZzdCBvcHRpb25cbiIpOworbW9kdWxlX3BhcmFtKGNfdG5yX2FscGhhX21pbiwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNfdG5yX2FscGhhX21pbiwgIlxuIGNfdG5yX2FscGhhX21pbiBvcHRpb25cbiIpOworbW9kdWxlX3BhcmFtKGNfdG5yX2FscGhhX21heCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNfdG5yX2FscGhhX21heCwgIlxuIGNfdG5yX2FscGhhX21heCBvcHRpb25cbiIpOworbW9kdWxlX3BhcmFtKGNfdG5yX2RlZ2hvc3Rfb3MsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhjX3Rucl9kZWdob3N0X29zLCAiXG4gY190bnJfZGVnaG9zdF9vcyBvcHRpb25cbiIpOworCittb2R1bGVfcGFyYW0oeV9zbnJfZXJyX25vcm0sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh5X3Nucl9lcnJfbm9ybSwgIlxuIHlfc25yX2Vycl9ub3JtIG9wdGlvblxuIik7Cittb2R1bGVfcGFyYW0oeV9zbnJfZ2F1X2JsZF9jb3JlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoeV9zbnJfZ2F1X2JsZF9jb3JlLCAiXG4geV9zbnJfZ2F1X2JsZF9jb3JlIG9wdGlvblxuIik7Cittb2R1bGVfcGFyYW0oeV9zbnJfZ2F1X2JsZF9vZnN0LCBpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh5X3Nucl9nYXVfYmxkX29mc3QsICJcbiB5X3Nucl9nYXVfYmxkX29mc3Qgb3B0aW9uXG4iKTsKK21vZHVsZV9wYXJhbSh5X3Nucl9nYXVfYmxkX3JhdGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh5X3Nucl9nYXVfYmxkX3JhdGUsICJcbiB5X3Nucl9nYXVfYmxkX3JhdGUgb3B0aW9uXG4iKTsKK21vZHVsZV9wYXJhbSh5X3Nucl9nYXVfYWxwMF9taW4sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh5X3Nucl9nYXVfYWxwMF9taW4sICJcbiB5X3Nucl9nYXVfYWxwMF9taW4gb3B0aW9uXG4iKTsKK21vZHVsZV9wYXJhbSh5X3Nucl9nYXVfYWxwMF9tYXgsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh5X3Nucl9nYXVfYWxwMF9tYXgsICJcbiB5X3Nucl9nYXVfYWxwMF9tYXggb3B0aW9uXG4iKTsKK21vZHVsZV9wYXJhbSh5X2JsZF9iZXRhMmFscF9yYXRlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoeV9ibGRfYmV0YTJhbHBfcmF0ZSwgIlxuIHlfYmxkX2JldGEyYWxwX3JhdGUgb3B0aW9uXG4iKTsKK21vZHVsZV9wYXJhbSh5X2JsZF9iZXRhX21pbiwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHlfYmxkX2JldGFfbWluLCAiXG4geV9ibGRfYmV0YV9taW4gb3B0aW9uXG4iKTsKK21vZHVsZV9wYXJhbSh5X2JsZF9iZXRhX21heCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHlfYmxkX2JldGFfbWF4LCAiXG4geV9ibGRfYmV0YV9tYXggb3B0aW9uXG4iKTsKKworbW9kdWxlX3BhcmFtKGNfc25yX2Vycl9ub3JtLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoY19zbnJfZXJyX25vcm0sICJcbiBjX3Nucl9lcnJfbm9ybSBvcHRpb25cbiIpOworbW9kdWxlX3BhcmFtKGNfc25yX2dhdV9ibGRfY29yZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNfc25yX2dhdV9ibGRfY29yZSwgIlxuIGNfc25yX2dhdV9ibGRfY29yZSBvcHRpb25cbiIpOworbW9kdWxlX3BhcmFtKGNfc25yX2dhdV9ibGRfb2ZzdCwgaW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoY19zbnJfZ2F1X2JsZF9vZnN0LCAiXG4gY19zbnJfZ2F1X2JsZF9vZnN0IG9wdGlvblxuIik7Cittb2R1bGVfcGFyYW0oY19zbnJfZ2F1X2JsZF9yYXRlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoY19zbnJfZ2F1X2JsZF9yYXRlLCAiXG4gY19zbnJfZ2F1X2JsZF9yYXRlIG9wdGlvblxuIik7Cittb2R1bGVfcGFyYW0oY19zbnJfZ2F1X2FscDBfbWluLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoY19zbnJfZ2F1X2FscDBfbWluLCAiXG4gY19zbnJfZ2F1X2FscDBfbWluIG9wdGlvblxuIik7Cittb2R1bGVfcGFyYW0oY19zbnJfZ2F1X2FscDBfbWF4LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoY19zbnJfZ2F1X2FscDBfbWF4LCAiXG4gY19zbnJfZ2F1X2FscDBfbWF4IG9wdGlvblxuIik7Cittb2R1bGVfcGFyYW0oY19ibGRfYmV0YTJhbHBfcmF0ZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNfYmxkX2JldGEyYWxwX3JhdGUsICJcbiBjX2JsZF9iZXRhMmFscF9yYXRlIG9wdGlvblxuIik7Cittb2R1bGVfcGFyYW0oY19ibGRfYmV0YV9taW4sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhjX2JsZF9iZXRhX21pbiwgIlxuIGNfYmxkX2JldGFfbWluIG9wdGlvblxuIik7Cittb2R1bGVfcGFyYW0oY19ibGRfYmV0YV9tYXgsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhjX2JsZF9iZXRhX21heCwgIlxuIGNfYmxkX2JldGFfbWF4IG9wdGlvblxuIik7CisjZW5kaWYKKworbW9kdWxlX2luaXQoYW12ZW5jX2F2Y19kcml2ZXJfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoYW12ZW5jX2F2Y19kcml2ZXJfcmVtb3ZlX21vZHVsZSk7CitSRVNFUlZFRE1FTV9PRl9ERUNMQVJFKGFtdmVuY19hdmMsICJhbWxvZ2ljLCBhbXZlbmMtbWVtb3J5IiwgYXZjX21lbV9zZXR1cCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQU1MT0dJQyBBVkMgVmlkZW8gRW5jb2RlciBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoInNpbW9uLnpoZW5nIDxzaW1vbi56aGVuZ0BhbWxvZ2ljLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfc2luay9lbmNvZGVyL2gyNjQvZW5jb2Rlci5oIGIvZHJpdmVycy9mcmFtZV9zaW5rL2VuY29kZXIvaDI2NC9lbmNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ5N2JiNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfc2luay9lbmNvZGVyL2gyNjQvZW5jb2Rlci5oCkBAIC0wLDAgKzEsNTAzIEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL2FtcG9ydHMvZW5jb2Rlci5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgX19IMjY0X0hfXworI2RlZmluZSBfX0gyNjRfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0dFMkQKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2dlMmQvZ2UyZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9kbWEtYnVmLmg+CisKKyNkZWZpbmUgQU1WRU5DX0RFVklORk9fTTggIkFNTC1NOCIKKyNkZWZpbmUgQU1WRU5DX0RFVklORk9fRzkgIkFNTC1HOSIKKyNkZWZpbmUgQU1WRU5DX0RFVklORk9fR1hCQiAiQU1MLUdYQkIiCisjZGVmaW5lIEFNVkVOQ19ERVZJTkZPX0dYVFZCQiAiQU1MLUdYVFZCQiIKKyNkZWZpbmUgQU1WRU5DX0RFVklORk9fR1hMICJBTUwtR1hMIgorCisjZGVmaW5lIEhDT0RFQ19JUlFfTUJPWF9DTFIgSENPREVDX0FTU0lTVF9NQk9YMl9DTFJfUkVHCisjZGVmaW5lIEhDT0RFQ19JUlFfTUJPWF9NQVNLIEhDT0RFQ19BU1NJU1RfTUJPWDJfTUFTSworCisjZGVmaW5lIEgyNjRfRU5DX1NWQworCisvKiBNODogMjU1MC8xMCA9IDI1NU0gR1g6IDIwMDAvMTAgPSAyMDBNICovCisjZGVmaW5lIEhERUNfTDAoKSAgIFdSSVRFX0hISV9SRUcoSEhJX1ZERUNfQ0xLX0NOVEwsIFwKKwkJCSAoMiA8PCAyNSkgfCAoMSA8PCAxNikgfCAoMSA8PCAyNCkgfCBcCisJCQkgKDB4ZmZmZiAmIFJFQURfSEhJX1JFRyhISElfVkRFQ19DTEtfQ05UTCkpKQorLyogTTg6IDI1NTAvOCA9IDMxOU0gR1g6IDIwMDAvOCA9IDI1ME0gKi8KKyNkZWZpbmUgSERFQ19MMSgpICAgV1JJVEVfSEhJX1JFRyhISElfVkRFQ19DTEtfQ05UTCwgXAorCQkJICgwIDw8IDI1KSB8ICgxIDw8IDE2KSB8ICgxIDw8IDI0KSB8IFwKKwkJCSAoMHhmZmZmICYgUkVBRF9ISElfUkVHKEhISV9WREVDX0NMS19DTlRMKSkpCisvKiBNODogMjU1MC83ID0gMzY0TSBHWDogMjAwMC83ID0gMjg1TSAqLworI2RlZmluZSBIREVDX0wyKCkgICBXUklURV9ISElfUkVHKEhISV9WREVDX0NMS19DTlRMLCBcCisJCQkgKDMgPDwgMjUpIHwgKDAgPDwgMTYpIHwgKDEgPDwgMjQpIHwgXAorCQkJICgweGZmZmYgJiBSRUFEX0hISV9SRUcoSEhJX1ZERUNfQ0xLX0NOVEwpKSkKKy8qIE04OiAyNTUwLzYgPSA0MjVNIEdYOiAyMDAwLzYgPSAzMzNNICovCisjZGVmaW5lIEhERUNfTDMoKSAgIFdSSVRFX0hISV9SRUcoSEhJX1ZERUNfQ0xLX0NOVEwsIFwKKwkJCSAoMSA8PCAyNSkgfCAoMSA8PCAxNikgfCAoMSA8PCAyNCkgfCBcCisJCQkgKDB4ZmZmZiAmIFJFQURfSEhJX1JFRyhISElfVkRFQ19DTEtfQ05UTCkpKQorLyogTTg6IDI1NTAvNSA9IDUxME0gR1g6IDIwMDAvNSA9IDQwME0gKi8KKyNkZWZpbmUgSERFQ19MNCgpICAgV1JJVEVfSEhJX1JFRyhISElfVkRFQ19DTEtfQ05UTCwgXAorCQkJICgyIDw8IDI1KSB8ICgwIDw8IDE2KSB8ICgxIDw8IDI0KSB8IFwKKwkJCSAoMHhmZmZmICYgUkVBRF9ISElfUkVHKEhISV9WREVDX0NMS19DTlRMKSkpCisvKiBNODogMjU1MC80ID0gNjM4TSBHWDogMjAwMC80ID0gNTAwTSAqLworI2RlZmluZSBIREVDX0w1KCkgICBXUklURV9ISElfUkVHKEhISV9WREVDX0NMS19DTlRMLCBcCisJCQkgKDAgPDwgMjUpIHwgKDAgPDwgMTYpIHwgKDEgPDwgMjQpIHwgXAorCQkJICgweGZmZmYgJiBSRUFEX0hISV9SRUcoSEhJX1ZERUNfQ0xLX0NOVEwpKSkKKy8qIE04OiAyNTUwLzMgPSA4NTBNIEdYOiAyMDAwLzMgPSA2NjdNICovCisjZGVmaW5lIEhERUNfTDYoKSAgIFdSSVRFX0hISV9SRUcoSEhJX1ZERUNfQ0xLX0NOVEwsIFwKKwkJCSAoMSA8PCAyNSkgfCAoMCA8PCAxNikgfCAoMSA8PCAyNCkgfCBcCisJCQkgKDB4ZmZmZiAmIFJFQURfSEhJX1JFRyhISElfVkRFQ19DTEtfQ05UTCkpKQorCisjZGVmaW5lIGh2ZGVjX2Nsb2NrX2VuYWJsZShsZXZlbCkgXAorCWRvIHsgXAorCQlpZiAobGV2ZWwgPT0gMCkgIFwKKwkJCUhERUNfTDAoKTsgXAorCQllbHNlIGlmIChsZXZlbCA9PSAxKSAgXAorCQkJSERFQ19MMSgpOyBcCisJCWVsc2UgaWYgKGxldmVsID09IDIpICBcCisJCQlIREVDX0wyKCk7IFwKKwkJZWxzZSBpZiAobGV2ZWwgPT0gMykgIFwKKwkJCUhERUNfTDMoKTsgXAorCQllbHNlIGlmIChsZXZlbCA9PSA0KSAgXAorCQkJSERFQ19MNCgpOyBcCisJCWVsc2UgaWYgKGxldmVsID09IDUpICBcCisJCQlIREVDX0w1KCk7IFwKKwkJZWxzZSBpZiAobGV2ZWwgPT0gNikgIFwKKwkJCUhERUNfTDYoKTsgXAorCQlXUklURV9WUkVHX0JJVFMoRE9TX0dDTEtfRU4wLCAweDdmZmYsIDEyLCAxNSk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIGh2ZGVjX2Nsb2NrX2Rpc2FibGUoKSBcCisJZG8geyBcCisJCVdSSVRFX1ZSRUdfQklUUyhET1NfR0NMS19FTjAsIDAsIDEyLCAxNSk7IFwKKwkJV1JJVEVfSEhJX1JFR19CSVRTKEhISV9WREVDX0NMS19DTlRMLCAgMCwgMjQsIDEpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBMT0dfQUxMIDAKKyNkZWZpbmUgTE9HX0lORk8gMQorI2RlZmluZSBMT0dfREVCVUcgMgorI2RlZmluZSBMT0dfRVJST1IgMworCisjZGVmaW5lIGVuY19wcihsZXZlbCwgeC4uLikgXAorCWRvIHsgXAorCQlpZiAobGV2ZWwgPj0gZW5jb2RlX3ByaW50X2xldmVsKSBcCisJCQlwcmludGsoeCk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEFNVkVOQ19BVkNfSU9DX01BR0lDICAnRScKKworI2RlZmluZSBBTVZFTkNfQVZDX0lPQ19HRVRfREVWSU5GTwlfSU9XKEFNVkVOQ19BVkNfSU9DX01BR0lDLCAweGYwLCB1MzIpCisjZGVmaW5lIEFNVkVOQ19BVkNfSU9DX01BWF9JTlNUQU5DRQlfSU9XKEFNVkVOQ19BVkNfSU9DX01BR0lDLCAweGYxLCB1MzIpCisjZGVmaW5lIEFNVkVOQ19BVkNfSU9DX0dFVF9DUFVfSUQJX0lPVyhBTVZFTkNfQVZDX0lPQ19NQUdJQywgMHhmMiwgdTMyKQorCisjZGVmaW5lIEFNVkVOQ19BVkNfSU9DX0dFVF9BRERSIF9JT1coQU1WRU5DX0FWQ19JT0NfTUFHSUMsIDB4MDAsIHUzMikKKyNkZWZpbmUgQU1WRU5DX0FWQ19JT0NfSU5QVVRfVVBEQVRFCV9JT1coQU1WRU5DX0FWQ19JT0NfTUFHSUMsIDB4MDEsIHUzMikKKyNkZWZpbmUgQU1WRU5DX0FWQ19JT0NfTkVXX0NNRCBfSU9XKEFNVkVOQ19BVkNfSU9DX01BR0lDLCAweDAyLCB1MzIpCisjZGVmaW5lIEFNVkVOQ19BVkNfSU9DX0dFVF9TVEFHRSBfSU9XKEFNVkVOQ19BVkNfSU9DX01BR0lDLCAweDAzLCB1MzIpCisjZGVmaW5lIEFNVkVOQ19BVkNfSU9DX0dFVF9PVVRQVVRfU0laRSBfSU9XKEFNVkVOQ19BVkNfSU9DX01BR0lDLCAweDA0LCB1MzIpCisjZGVmaW5lIEFNVkVOQ19BVkNfSU9DX0NPTkZJR19JTklUIF9JT1coQU1WRU5DX0FWQ19JT0NfTUFHSUMsIDB4MDUsIHUzMikKKyNkZWZpbmUgQU1WRU5DX0FWQ19JT0NfRkxVU0hfQ0FDSEUgX0lPVyhBTVZFTkNfQVZDX0lPQ19NQUdJQywgMHgwNiwgdTMyKQorI2RlZmluZSBBTVZFTkNfQVZDX0lPQ19GTFVTSF9ETUEgX0lPVyhBTVZFTkNfQVZDX0lPQ19NQUdJQywgMHgwNywgdTMyKQorI2RlZmluZSBBTVZFTkNfQVZDX0lPQ19HRVRfQlVGRklORk8gX0lPVyhBTVZFTkNfQVZDX0lPQ19NQUdJQywgMHgwOCwgdTMyKQorI2RlZmluZSBBTVZFTkNfQVZDX0lPQ19TVUJNSVQJX0lPVyhBTVZFTkNfQVZDX0lPQ19NQUdJQywgMHgwOSwgdTMyKQorI2RlZmluZSBBTVZFTkNfQVZDX0lPQ19SRUFEX0NBTlZBUyBfSU9XKEFNVkVOQ19BVkNfSU9DX01BR0lDLCAweDBhLCB1MzIpCisjZGVmaW5lIEFNVkVOQ19BVkNfSU9DX1FQX01PREUgX0lPVyhBTVZFTkNfQVZDX0lPQ19NQUdJQywgMHgwYiwgdTMyKQorCisKKworI2RlZmluZSBJRV9QSVBQRUxJTkVfQkxPQ0tfU0hJRlQgMAorI2RlZmluZSBJRV9QSVBQRUxJTkVfQkxPQ0tfTUFTSyAgMHgxZgorI2RlZmluZSBNRV9QSVhFTF9NT0RFX1NISUZUIDUKKyNkZWZpbmUgTUVfUElYRUxfTU9ERV9NQVNLICAweDMKKworZW51bSBhbXZlbmNfbWVtX3R5cGVfZSB7CisJTE9DQUxfQlVGRiA9IDAsCisJQ0FOVkFTX0JVRkYsCisJUEhZU0lDQUxfQlVGRiwKKwlETUFfQlVGRiwKKwlNQVhfQlVGRl9UWVBFCit9OworCitlbnVtIGFtdmVuY19mcmFtZV9mbXRfZSB7CisJRk1UX1lVVjQyMl9TSU5HTEUgPSAwLAorCUZNVF9ZVVY0NDRfU0lOR0xFLAorCUZNVF9OVjIxLAorCUZNVF9OVjEyLAorCUZNVF9ZVVY0MjAsCisJRk1UX1lVVjQ0NF9QTEFORSwKKwlGTVRfUkdCODg4LAorCUZNVF9SR0I4ODhfUExBTkUsCisJRk1UX1JHQjU2NSwKKwlGTVRfUkdCQTg4ODgsCisJRk1UX1lVVjQyMl8xMkJJVCwKKwlGTVRfWVVWNDQ0XzEwQklULAorCUZNVF9ZVVY0MjJfMTBCSVQsCisJRk1UX0JHUjg4OCwKKwlNQVhfRlJBTUVfRk1UCit9OworCisjZGVmaW5lIE1BWF9FTkNPREVfUkVRVUVTVCAgOCAgIC8qIDY0ICovCisKKyNkZWZpbmUgTUFYX0VOQ09ERV9JTlNUQU5DRSAgOCAgIC8qIDY0ICovCisKKyNkZWZpbmUgRU5DT0RFX1BST0NFU1NfUVVFVUVfU1RBUlQJMAorI2RlZmluZSBFTkNPREVfUFJPQ0VTU19RVUVVRV9TVE9QCTEKKworI2RlZmluZSBBTVZFTkNfRkxVU0hfRkxBR19JTlBVVAkJCTB4MQorI2RlZmluZSBBTVZFTkNfRkxVU0hfRkxBR19PVVRQVVQJCTB4MgorI2RlZmluZSBBTVZFTkNfRkxVU0hfRkxBR19SRUZFUkVOQ0UJCTB4NAorI2RlZmluZSBBTVZFTkNfRkxVU0hfRkxBR19JTlRSQV9JTkZPCTB4OAorI2RlZmluZSBBTVZFTkNfRkxVU0hfRkxBR19JTlRFUl9JTkZPCTB4MTAKKyNkZWZpbmUgQU1WRU5DX0ZMVVNIX0ZMQUdfUVAJCQkJMHgyMAorI2RlZmluZSBBTVZFTkNfRkxVU0hfRkxBR19EVU1QCQkJMHg0MAorI2RlZmluZSBBTVZFTkNfRkxVU0hfRkxBR19DQlIJCQkJMHg4MAorCisjZGVmaW5lIEVOQ09ERVJfQlVGRkVSX0lOUFVUICAgICAgICAgICAgICAwCisjZGVmaW5lIEVOQ09ERVJfQlVGRkVSX1JFRjAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBFTkNPREVSX0JVRkZFUl9SRUYxICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgRU5DT0RFUl9CVUZGRVJfT1VUUFVUICAgICAgICAgICAzCisjZGVmaW5lIEVOQ09ERVJfQlVGRkVSX0lOVEVSX0lORk8gICAgICAgICAgNAorI2RlZmluZSBFTkNPREVSX0JVRkZFUl9JTlRSQV9JTkZPICAgICAgICAgIDUKKyNkZWZpbmUgRU5DT0RFUl9CVUZGRVJfUVAJCSAgICAgICAgICA2CisjZGVmaW5lIEVOQ09ERVJfQlVGRkVSX0RVTVAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgRU5DT0RFUl9CVUZGRVJfQ0JSICAgICAgICAgICAgICA4CisKK3N0cnVjdCBlbmNvZGVfd3FfczsKKworc3RydWN0IGVuY19kbWFfY2ZnIHsKKwlpbnQgZmQ7CisJdm9pZCAqZGV2OworCXZvaWQgKnZhZGRyOworCXZvaWQgKnBhZGRyOworCXN0cnVjdCBkbWFfYnVmICpkYnVmOworCXN0cnVjdCBkbWFfYnVmX2F0dGFjaG1lbnQgKmF0dGFjaDsKKwlzdHJ1Y3Qgc2dfdGFibGUgKnNnOworCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcjsKK307CisKK3N0cnVjdCBlbmNvZGVfcmVxdWVzdF9zIHsKKwl1MzIgcXVhbnQ7CisJdTMyIGNtZDsKKwl1MzIgdWNvZGVfbW9kZTsKKwl1MzIgc3JjOworCXUzMiBmcmFtZXNpemU7CisKKwl1MzIgbWVfd2VpZ2h0OworCXUzMiBpNF93ZWlnaHQ7CisJdTMyIGkxNl93ZWlnaHQ7CisKKwl1MzIgY3JvcF90b3A7CisJdTMyIGNyb3BfYm90dG9tOworCXUzMiBjcm9wX2xlZnQ7CisJdTMyIGNyb3BfcmlnaHQ7CisJdTMyIHNyY193OworCXUzMiBzcmNfaDsKKwl1MzIgc2NhbGVfZW5hYmxlOworCisJdTMyIG5yX21vZGU7CisJdTMyIGZsdXNoX2ZsYWc7CisJdTMyIHRpbWVvdXQ7CisJZW51bSBhbXZlbmNfbWVtX3R5cGVfZSB0eXBlOworCWVudW0gYW12ZW5jX2ZyYW1lX2ZtdF9lIGZtdDsKKwlzdHJ1Y3QgZW5jb2RlX3dxX3MgKnBhcmVudDsKKwlzdHJ1Y3QgZW5jX2RtYV9jZmcgZG1hX2NmZ1szXTsKKwl1MzIgcGxhbmVfbnVtOworfTsKKworc3RydWN0IGVuY29kZV9xdWV1ZV9pdGVtX3MgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgZW5jb2RlX3JlcXVlc3RfcyByZXF1ZXN0OworfTsKKworc3RydWN0IEJ1ZmZfcyB7CisJdTMyIGJ1Zl9zdGFydDsKKwl1MzIgYnVmX3NpemU7CisJYm9vbCB1c2VkOworfTsKKworc3RydWN0IEJ1ZmZJbmZvX3MgeworCXUzMiBsZXZfaWQ7CisJdTMyIG1pbl9idWZmc2l6ZTsKKwl1MzIgbWF4X3dpZHRoOworCXUzMiBtYXhfaGVpZ2h0OworCXN0cnVjdCBCdWZmX3MgZGN0OworCXN0cnVjdCBCdWZmX3MgZGVjMF95OworCXN0cnVjdCBCdWZmX3MgZGVjMF91djsKKwlzdHJ1Y3QgQnVmZl9zIGRlYzFfeTsKKwlzdHJ1Y3QgQnVmZl9zIGRlYzFfdXY7CisJc3RydWN0IEJ1ZmZfcyBhc3NpdDsKKwlzdHJ1Y3QgQnVmZl9zIGJpdHN0cmVhbTsKKwlzdHJ1Y3QgQnVmZl9zIHNjYWxlX2J1ZmY7CisJc3RydWN0IEJ1ZmZfcyBkdW1wX2luZm87CisJc3RydWN0IEJ1ZmZfcyBjYnJfaW5mbzsKK307CisKK3N0cnVjdCBlbmNvZGVfbWVtaW5mb19zIHsKKwl1MzIgYnVmX3N0YXJ0OworCXUzMiBidWZfc2l6ZTsKKworCXUzMiBCaXRzdHJlYW1TdGFydDsKKwl1MzIgQml0c3RyZWFtRW5kOworCisJLyppbnB1dCBidWZmZXIgZGVmaW5lKi8KKwl1MzIgZGN0X2J1ZmZfc3RhcnRfYWRkcjsKKwl1MzIgZGN0X2J1ZmZfZW5kX2FkZHI7CisKKwkvKm1pY3JvY29kZSBhc3NpdGFudCBidWZmZXIqLworCXUzMiBhc3NpdF9idWZmZXJfb2Zmc2V0OworCisJdTMyIHNjYWxlcl9idWZmX3N0YXJ0X2FkZHI7CisKKwl1MzIgZHVtcF9pbmZvX2Rkcl9zdGFydF9hZGRyOworCXUzMiBkdW1wX2luZm9fZGRyX3NpemU7CisKKwl1MzIgY2JyX2luZm9fZGRyX3N0YXJ0X2FkZHI7CisJdTMyIGNicl9pbmZvX2Rkcl9zaXplOworCisJdTggKiBjYnJfaW5mb19kZHJfdmlydF9hZGRyOworCisJczMyIGRibGtfYnVmX2NhbnZhczsKKwlzMzIgcmVmX2J1Zl9jYW52YXM7CisJc3RydWN0IEJ1ZmZJbmZvX3MgYnVmc3BlYzsKKyNpZmRlZiBDT05GSUdfQ01BCisJc3RydWN0IHBhZ2UgKnZlbmNfcGFnZXM7CisjZW5kaWYKK307CisKK3N0cnVjdCBlbmNvZGVfcGljaW5mb19zIHsKKwl1MzIgZW5jb2Rlcl93aWR0aDsKKwl1MzIgZW5jb2Rlcl9oZWlnaHQ7CisKKwl1MzIgcm93c19wZXJfc2xpY2U7CisKKwl1MzIgaWRyX3BpY19pZDsgIC8qIG5lZWQgcmVzZXQgYXMgMCBmb3IgSURSICovCisJdTMyIGZyYW1lX251bWJlcjsgICAvKiBuZWVkIHBsdXMgZWFjaCBmcmFtZSAqLworCS8qIG5lZWQgcmVzZXQgYXMgMCBmb3IgSURSIGFuZCBwbHVzIDIgZm9yIE5PTi1JRFIgKi8KKwl1MzIgcGljX29yZGVyX2NudF9sc2I7CisKKwl1MzIgbG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2I7CisJdTMyIGxvZzJfbWF4X2ZyYW1lX251bTsKKwl1MzIgaW5pdF9xcHBpY3R1cmU7CisjaWZkZWYgSDI2NF9FTkNfU1ZDCisJdTMyIGVuYWJsZV9zdmM7CisJdTMyIG5vbl9yZWZfbGltaXQ7CisJdTMyIG5vbl9yZWZfY250OworI2VuZGlmCisJdTMyIGNvbG9yX3NwYWNlOworfTsKKworc3RydWN0IGVuY29kZV9jYnJfcyB7CisJdTE2IGJsb2NrX3c7CisJdTE2IGJsb2NrX2g7CisJdTE2IGxvbmdfdGg7CisJdTggc3RhcnRfdGJsX2lkOworCXU4IHNob3J0X3NoaWZ0OworCXU4IGxvbmdfbWJfbnVtOworfTsKKworc3RydWN0IGVuY29kZV93cV9zIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiBkZXYgaW5mbyAqLworCXUzMiB1Y29kZV9pbmRleDsKKwl1MzIgaHdfc3RhdHVzOworCXUzMiBvdXRwdXRfc2l6ZTsKKworCXUzMiBzcHNfc2l6ZTsKKwl1MzIgcHBzX3NpemU7CisKKwl1MzIgbWVfd2VpZ2h0OworCXUzMiBpNF93ZWlnaHQ7CisJdTMyIGkxNl93ZWlnaHQ7CisKKwl1MzIgcXVhbnRfdGJsX2k0WzhdOworCXUzMiBxdWFudF90YmxfaTE2WzhdOworCXUzMiBxdWFudF90YmxfbWVbOF07CisKKwlzdHJ1Y3QgZW5jb2RlX21lbWluZm9fcyBtZW07CisJc3RydWN0IGVuY29kZV9waWNpbmZvX3MgcGljOworCXN0cnVjdCBlbmNvZGVfcmVxdWVzdF9zIHJlcXVlc3Q7CisJc3RydWN0IGVuY29kZV9jYnJfcyBjYnJfaW5mbzsKKwlhdG9taWNfdCByZXF1ZXN0X3JlYWR5OworCXdhaXRfcXVldWVfaGVhZF90IHJlcXVlc3RfY29tcGxldGU7Cit9OworCitzdHJ1Y3QgZW5jb2RlX2V2ZW50X3MgeworCXdhaXRfcXVldWVfaGVhZF90IGh3X2NvbXBsZXRlOworCXN0cnVjdCBjb21wbGV0aW9uIHByb2Nlc3NfY29tcGxldGU7CisJc3BpbmxvY2tfdCBzZW1fbG9jazsgLyogZm9yIHF1ZXVlIHN3aXRjaCBhbmQgY3JlYXRlIGRlc3Ryb3kgcXVldWUuICovCisJc3RydWN0IGNvbXBsZXRpb24gcmVxdWVzdF9pbl9jb207Cit9OworCitzdHJ1Y3QgZW5jb2RlX21hbmFnZXJfcyB7CisJc3RydWN0IGxpc3RfaGVhZCB3cTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHByb2Nlc3NfcXVldWU7CisJc3RydWN0IGxpc3RfaGVhZCBmcmVlX3F1ZXVlOworCisJdTMyIGVuY29kZV9od19zdGF0dXM7CisJdTMyIHByb2Nlc3NfcXVldWVfc3RhdGU7CisJczMyIGlycV9udW07CisJdTMyIHdxX2NvdW50OworCXUzMiB1Y29kZV9pbmRleDsKKwl1MzIgbWF4X2luc3RhbmNlOworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0dFMkQKKwlzdHJ1Y3QgZ2UyZF9jb250ZXh0X3MgKmNvbnRleHQ7CisjZW5kaWYKKwlib29sIGlycV9yZXF1ZXN0ZWQ7CisJYm9vbCBuZWVkX3Jlc2V0OworCWJvb2wgcHJvY2Vzc19pcnE7CisJYm9vbCBpbml0ZWQ7IC8qIHBvd2VyIG9uIGVuY29kZSAqLworCWJvb2wgcmVtb3ZlX2ZsYWc7IC8qIHJlbW92ZSB3cTsgKi8KKwlib29sIHVuaW5pdF9mbGFnOyAvKiBwb3dlciBvZmYgZW5jb2RlICovCisJYm9vbCB1c2VfcmVzZXJ2ZTsKKworI2lmZGVmIENPTkZJR19DTUEKKwlib29sIGNoZWNrX2NtYTsKKwl1bG9uZyBjbWFfcG9vbF9zaXplOworI2VuZGlmCisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqdGhpc19wZGV2OworCXN0cnVjdCBCdWZmX3MgKnJlc2VydmVfYnVmZjsKKwlzdHJ1Y3QgZW5jb2RlX3dxX3MgKmN1cnJlbnRfd3E7CisJc3RydWN0IGVuY29kZV93cV9zICpsYXN0X3dxOworCXN0cnVjdCBlbmNvZGVfcXVldWVfaXRlbV9zICpjdXJyZW50X2l0ZW07CisJc3RydWN0IHRhc2tfc3RydWN0ICplbmNvZGVfdGhyZWFkOworCXN0cnVjdCBCdWZmX3MgcmVzZXJ2ZV9tZW07CisJc3RydWN0IGVuY29kZV9ldmVudF9zIGV2ZW50OworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBlbmNvZGVfdGFza2xldDsKK307CisKK2V4dGVybiBzMzIgZW5jb2RlX3dxX2FkZF9yZXF1ZXN0KHN0cnVjdCBlbmNvZGVfd3FfcyAqd3EpOworZXh0ZXJuIHN0cnVjdCBlbmNvZGVfd3FfcyAqY3JlYXRlX2VuY29kZV93b3JrX3F1ZXVlKHZvaWQpOworZXh0ZXJuIHMzMiBkZXN0cm95X2VuY29kZV93b3JrX3F1ZXVlKHN0cnVjdCBlbmNvZGVfd3FfcyAqZW5jb2RlX3dvcmtfcXVldWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBBViBTY3JhdGNoIFJlZ2lzdGVyIFJlLURlZmluZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqCisgKi8KKyNkZWZpbmUgRU5DT0RFUl9TVEFUVVMgICAgICAgICAgICBIQ09ERUNfSEVOQ19TQ1JBVENIXzAKKyNkZWZpbmUgTUVNX09GRlNFVF9SRUcgICAgICAgICAgICBIQ09ERUNfSEVOQ19TQ1JBVENIXzEKKyNkZWZpbmUgREVCVUdfUkVHICAgICAgICAgICAgICAgICBIQ09ERUNfSEVOQ19TQ1JBVENIXzIKKyNkZWZpbmUgSURSX1BJQ19JRCAgICAgICAgICAgICAgICBIQ09ERUNfSEVOQ19TQ1JBVENIXzUKKyNkZWZpbmUgRlJBTUVfTlVNQkVSICAgICAgICAgICAgICBIQ09ERUNfSEVOQ19TQ1JBVENIXzYKKyNkZWZpbmUgUElDX09SREVSX0NOVF9MU0IgICAgICAgICBIQ09ERUNfSEVOQ19TQ1JBVENIXzcKKyNkZWZpbmUgTE9HMl9NQVhfUElDX09SREVSX0NOVF9MU0IgIEhDT0RFQ19IRU5DX1NDUkFUQ0hfOAorI2RlZmluZSBMT0cyX01BWF9GUkFNRV9OVU0gICAgICAgICAgSENPREVDX0hFTkNfU0NSQVRDSF85CisjZGVmaW5lIEFOQzBfQlVGRkVSX0lEICAgICAgICAgICAgICBIQ09ERUNfSEVOQ19TQ1JBVENIX0EKKyNkZWZpbmUgUVBQSUNUVVJFICAgICAgICAgICAgICAgICAgIEhDT0RFQ19IRU5DX1NDUkFUQ0hfQgorCisjZGVmaW5lIElFX01FX01CX1RZUEUgICAgICAgICAgICAgICBIQ09ERUNfSEVOQ19TQ1JBVENIX0QKKworLyogYml0IDAtNCwgSUVfUElQUEVMSU5FX0JMT0NLCisgKiBiaXQgNSAgICBtZSBoYWxmIHBpeGVsIGluIG04CisgKgkJZGlzYWJsZSBpNHg0IGluIGd4YmIKKyAqIGJpdCA2ICAgIG1lIHN0ZXAyIHN1YiBwaXhlbCBpbiBtOAorICoJCWRpc2FibGUgaTE2eDE2IGluIGd4YmIKKyAqLworI2RlZmluZSBJRV9NRV9NT0RFICAgICAgICAgICAgICAgICAgSENPREVDX0hFTkNfU0NSQVRDSF9FCisjZGVmaW5lIElFX1JFRl9TRUwgICAgICAgICAgICAgICAgICBIQ09ERUNfSEVOQ19TQ1JBVENIX0YKKworLyogWzMxOjBdIE5VTV9ST1dTX1BFUl9TTElDRV9QICovCisvKiBbMTU6MF0gTlVNX1JPV1NfUEVSX1NMSUNFX0kgKi8KKyNkZWZpbmUgRklYRURfU0xJQ0VfQ0ZHICAgICAgICAgICAgIEhDT0RFQ19IRU5DX1NDUkFUQ0hfTAorCisvKiBGb3IgR1ggKi8KKyNkZWZpbmUgSU5GT19EVU1QX1NUQVJUX0FERFIgICAgICBIQ09ERUNfSEVOQ19TQ1JBVENIX0kKKworLyogRm9yIENCUiAqLworI2RlZmluZSBIMjY0X0VOQ19DQlJfVEFCTEVfQUREUiAgIEhDT0RFQ19IRU5DX1NDUkFUQ0hfMworI2RlZmluZSBIMjY0X0VOQ19DQlJfTUJfU0laRV9BRERSICAgICAgSENPREVDX0hFTkNfU0NSQVRDSF80CisvKiBCeXRlcyhGbG9hdCkgKiAyNTYgKi8KKyNkZWZpbmUgSDI2NF9FTkNfQ0JSX0NUTCAgICAgICAgICBIQ09ERUNfSEVOQ19TQ1JBVENIX0cKKy8qIFszMToyOF0gOiBpbml0IHFwIHRhYmxlIGlkeCAqLworLyogWzI3OjI0XSA6IHNob3J0X3Rlcm0gYWRqdXN0IHNoaWZ0ICovCisvKiBbMjM6MTZdIDogTG9uZ190ZXJtIE1CX051bWJlciBiZXR3ZWVuIGFkanVzdCwgKi8KKy8qIFsxNTowXSBMb25nX3Rlcm0gYWRqdXN0IHRocmVzaG9sZChCeXRlcykgKi8KKyNkZWZpbmUgSDI2NF9FTkNfQ0JSX1RBUkdFVF9TSVpFICBIQ09ERUNfSEVOQ19TQ1JBVENIX0gKKy8qIEJ5dGVzKEZsb2F0KSAqIDI1NiAqLworI2RlZmluZSBIMjY0X0VOQ19DQlJfUFJFVl9CWVRFUyAgIEhDT0RFQ19IRU5DX1NDUkFUQ0hfSgorI2RlZmluZSBIMjY0X0VOQ19DQlJfUkVHSU9OX1NJWkUgICBIQ09ERUNfSEVOQ19TQ1JBVENIX0oKKworLyogZm9yIFNWQyAqLworI2RlZmluZSBIMjY0X0VOQ19TVkNfUElDX1RZUEUgICAgICBIQ09ERUNfSEVOQ19TQ1JBVENIX0sKKworLyogZGVmaW5lIGZvciBQSUMgIGhlYWRlciAqLworI2RlZmluZSBFTkNfU0xDX1JFRiAweDg0MTAKKyNkZWZpbmUgRU5DX1NMQ19OT05fUkVGIDB4ODAxMAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEVOQ09ERVJfU1RBVFVTIGRlZmluZSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIEVOQ09ERVJfSURMRSAgICAgICAgICAgICAgMAorI2RlZmluZSBFTkNPREVSX1NFUVVFTkNFICAgICAgICAgIDEKKyNkZWZpbmUgRU5DT0RFUl9QSUNUVVJFICAgICAgICAgICAyCisjZGVmaW5lIEVOQ09ERVJfSURSICAgICAgICAgICAgICAgMworI2RlZmluZSBFTkNPREVSX05PTl9JRFIgICAgICAgICAgIDQKKyNkZWZpbmUgRU5DT0RFUl9NQl9IRUFERVIgICAgICAgICA1CisjZGVmaW5lIEVOQ09ERVJfTUJfREFUQSAgICAgICAgICAgNgorCisjZGVmaW5lIEVOQ09ERVJfU0VRVUVOQ0VfRE9ORSAgICAgICAgICA3CisjZGVmaW5lIEVOQ09ERVJfUElDVFVSRV9ET05FICAgICAgICAgICA4CisjZGVmaW5lIEVOQ09ERVJfSURSX0RPTkUgICAgICAgICAgICAgICA5CisjZGVmaW5lIEVOQ09ERVJfTk9OX0lEUl9ET05FICAgICAgICAgICAxMAorI2RlZmluZSBFTkNPREVSX01CX0hFQURFUl9ET05FICAgICAgICAgMTEKKyNkZWZpbmUgRU5DT0RFUl9NQl9EQVRBX0RPTkUgICAgICAgICAgIDEyCisKKyNkZWZpbmUgRU5DT0RFUl9OT05fSURSX0lOVFJBICAgICAxMworI2RlZmluZSBFTkNPREVSX05PTl9JRFJfSU5URVIgICAgIDE0CisKKyNkZWZpbmUgRU5DT0RFUl9FUlJPUiAgICAgMHhmZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGRlZmluZXMgZm9yIEguMjY0IG1iX3R5cGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKyNkZWZpbmUgSEVOQ19NQl9UeXBlX1BCU0tJUCAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgSEVOQ19NQl9UeXBlX1BTS0lQICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgSEVOQ19NQl9UeXBlX0JTS0lQX0RJUkVDVCAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgSEVOQ19NQl9UeXBlX1AxNngxNiAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgSEVOQ19NQl9UeXBlX1AxNng4ICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgSEVOQ19NQl9UeXBlX1A4eDE2ICAgICAgICAgICAgICAgICAgICAgICAweDMKKyNkZWZpbmUgSEVOQ19NQl9UeXBlX1NNQjh4OCAgICAgICAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgSEVOQ19NQl9UeXBlX1NNQjh4NCAgICAgICAgICAgICAgICAgICAgICAweDUKKyNkZWZpbmUgSEVOQ19NQl9UeXBlX1NNQjR4OCAgICAgICAgICAgICAgICAgICAgICAweDYKKyNkZWZpbmUgSEVOQ19NQl9UeXBlX1NNQjR4NCAgICAgICAgICAgICAgICAgICAgICAweDcKKyNkZWZpbmUgSEVOQ19NQl9UeXBlX1A4eDggICAgICAgICAgICAgICAgICAgICAgICAweDgKKyNkZWZpbmUgSEVOQ19NQl9UeXBlX0k0TUIgICAgICAgICAgICAgICAgICAgICAgICAweDkKKyNkZWZpbmUgSEVOQ19NQl9UeXBlX0kxNk1CICAgICAgICAgICAgICAgICAgICAgICAweGEKKyNkZWZpbmUgSEVOQ19NQl9UeXBlX0lCTE9DSyAgICAgICAgICAgICAgICAgICAgICAweGIKKyNkZWZpbmUgSEVOQ19NQl9UeXBlX1NJNE1CICAgICAgICAgICAgICAgICAgICAgICAweGMKKyNkZWZpbmUgSEVOQ19NQl9UeXBlX0k4TUIgICAgICAgICAgICAgICAgICAgICAgICAweGQKKyNkZWZpbmUgSEVOQ19NQl9UeXBlX0lQQ00gICAgICAgICAgICAgICAgICAgICAgICAweGUKKyNkZWZpbmUgSEVOQ19NQl9UeXBlX0FVVE8gICAgICAgICAgICAgICAgICAgICAgICAweGYKKworI2RlZmluZSBIRU5DX01CX0NCUF9BVVRPICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYKKyNkZWZpbmUgSEVOQ19TS0lQX1JVTl9BVVRPICAgICAgICAgICAgICAgICAgICAgMHhmZmZmCisKKworZXh0ZXJuIGJvb2wgYW12ZW5jX2F2Y19vbih2b2lkKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9zaW5rL2VuY29kZXIvaDI2NS9NYWtlZmlsZSBiL2RyaXZlcnMvZnJhbWVfc2luay9lbmNvZGVyL2gyNjUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMzODIyYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfc2luay9lbmNvZGVyL2gyNjUvTWFrZWZpbGUKQEAgLTAsMCArMSBAQAorb2JqLSQoQ09ORklHX0FNTE9HSUNfTUVESUFfVkVOQ19IMjY1KQkrPQl2cHUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9zaW5rL2VuY29kZXIvaDI2NS92bW0uaCBiL2RyaXZlcnMvZnJhbWVfc2luay9lbmNvZGVyL2gyNjUvdm1tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMyZGQwNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfc2luay9lbmNvZGVyL2gyNjUvdm1tLmgKQEAgLTAsMCArMSw2NjUgQEAKKy8qCisgKiB2bW0uaAorICoKKyAqIG1lbW9yeSBhbGxvY2F0b3IgZm9yIFZQVQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiAtIDIwMTMgIENISVBTJk1FRElBIElOQy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgX19DTk1fVklERU9fTUVNT1JZX01BTkFHRU1FTlRfSF9fCisjZGVmaW5lIF9fQ05NX1ZJREVPX01FTU9SWV9NQU5BR0VNRU5UX0hfXworCisjZGVmaW5lIFZNRU1fUEFHRV9TSVpFICgxNiAqIDEwMjQpCisjZGVmaW5lIE1BS0VfS0VZKF9hLCBfYikgKCgodm1lbV9rZXlfdClfYSkgPDwgMzIgfCBfYikKKyNkZWZpbmUgS0VZX1RPX1ZBTFVFKF9rZXkpIChfa2V5ID4+IDMyKQorCisjZGVmaW5lIFZNRU1fUF9BTExPQyhfeCkgdm1hbGxvYyhfeCkKKyNkZWZpbmUgVk1FTV9QX0ZSRUUoX3gpIHZmcmVlKF94KQorCisjZGVmaW5lIFZNRU1fQVNTRVJUIFwKKwlwcl9pbmZvKCJWTUVNX0FTU0VSVCBhdCAlczolZFxuIiwgX19GSUxFX18sIF9fTElORV9fKQorCisKKyNkZWZpbmUgVk1FTV9IRUlHSFQoX3RyZWUpIChfdHJlZSA9PSBOVUxMID8gLTEgOiBfdHJlZS0+aGVpZ2h0KQorCisjZGVmaW5lIE1BWChfYSwgX2IpIChfYSA+PSBfYiA/IF9hIDogX2IpCisKK3N0cnVjdCBhdmxfbm9kZV90OworI2RlZmluZSB2bWVtX2tleV90IHVuc2lnbmVkIGxvbmcgbG9uZworCitzdHJ1Y3Qgdm1lbV9pbmZvX3QgeworCXVsb25nIHRvdGFsX3BhZ2VzOworCXVsb25nIGFsbG9jX3BhZ2VzOworCXVsb25nIGZyZWVfcGFnZXM7CisJdWxvbmcgcGFnZV9zaXplOworfTsKKworc3RydWN0IHBhZ2VfdCB7CisJczMyIHBhZ2VubzsKKwl1bG9uZyBhZGRyOworCXMzMiB1c2VkOworCXMzMiBhbGxvY19wYWdlczsKKwlzMzIgZmlyc3RfcGFnZW5vOworfTsKKworc3RydWN0IGF2bF9ub2RlX3QgeworCXZtZW1fa2V5X3Qga2V5OworCXMzMiBoZWlnaHQ7CisJc3RydWN0IHBhZ2VfdCAqcGFnZTsKKwlzdHJ1Y3QgYXZsX25vZGVfdCAqbGVmdDsKKwlzdHJ1Y3QgYXZsX25vZGVfdCAqcmlnaHQ7Cit9OworCitzdHJ1Y3QgdmlkZW9fbW1fdCB7CisJc3RydWN0IGF2bF9ub2RlX3QgKmZyZWVfdHJlZTsKKwlzdHJ1Y3QgYXZsX25vZGVfdCAqYWxsb2NfdHJlZTsKKwlzdHJ1Y3QgcGFnZV90ICpwYWdlX2xpc3Q7CisJczMyIG51bV9wYWdlczsKKwl1bG9uZyBiYXNlX2FkZHI7CisJdWxvbmcgbWVtX3NpemU7CisJczMyIGZyZWVfcGFnZV9jb3VudDsKKwlzMzIgYWxsb2NfcGFnZV9jb3VudDsKK307CisKK2VudW0gcm90YXRpb25fZGlyX3QgeworCUxFRlQsCisJUklHSFQKK307CisKK3N0cnVjdCBhdmxfbm9kZV9kYXRhX3QgeworCXMzMiBrZXk7CisJc3RydWN0IHBhZ2VfdCAqcGFnZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXZsX25vZGVfdCAqbWFrZV9hdmxfbm9kZSgKKwl2bWVtX2tleV90IGtleSwKKwlzdHJ1Y3QgcGFnZV90ICpwYWdlKQoreworCXN0cnVjdCBhdmxfbm9kZV90ICpub2RlID0KKwkJKHN0cnVjdCBhdmxfbm9kZV90ICopVk1FTV9QX0FMTE9DKHNpemVvZihzdHJ1Y3QgYXZsX25vZGVfdCkpOworCW5vZGUtPmtleSA9IGtleTsKKwlub2RlLT5wYWdlID0gcGFnZTsKKwlub2RlLT5oZWlnaHQgPSAwOworCW5vZGUtPmxlZnQgPSBOVUxMOworCW5vZGUtPnJpZ2h0ID0gTlVMTDsKKwlyZXR1cm4gbm9kZTsKK30KKworc3RhdGljIHMzMiBnZXRfYmFsYW5jZV9mYWN0b3Ioc3RydWN0IGF2bF9ub2RlX3QgKnRyZWUpCit7CisJczMyIGZhY3RvciA9IDA7CisKKwlpZiAodHJlZSkKKwkJZmFjdG9yID0gVk1FTV9IRUlHSFQodHJlZS0+cmlnaHQpIC0gVk1FTV9IRUlHSFQodHJlZS0+bGVmdCk7CisJcmV0dXJuIGZhY3RvcjsKK30KKworLyoKKyAqIExlZnQgUm90YXRpb24KKyAqCisgKgkgIEEJCQkJCSAgQgorICoJICAgXAkJCQkJLyBcCisgKgkJQgkJID0+CSAgIEEgICBDCisgKgkgICAvICBcCQkJCSBcCisgKgkgIEQJQwkJCQkgRAorICoKKyAqLworc3RhdGljIHN0cnVjdCBhdmxfbm9kZV90ICpyb3RhdGlvbl9sZWZ0KHN0cnVjdCBhdmxfbm9kZV90ICp0cmVlKQoreworCXN0cnVjdCBhdmxfbm9kZV90ICpyY2hpbGQ7CisJc3RydWN0IGF2bF9ub2RlX3QgKmxjaGlsZDsKKworCWlmICh0cmVlID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJcmNoaWxkID0gdHJlZS0+cmlnaHQ7CisJaWYgKHJjaGlsZCA9PSBOVUxMKQorCQlyZXR1cm4gdHJlZTsKKworCWxjaGlsZCA9IHJjaGlsZC0+bGVmdDsKKwlyY2hpbGQtPmxlZnQgPSB0cmVlOworCXRyZWUtPnJpZ2h0ID0gbGNoaWxkOworCisJdHJlZS0+aGVpZ2h0ID0KKwkJTUFYKFZNRU1fSEVJR0hUKHRyZWUtPmxlZnQpLCBWTUVNX0hFSUdIVCh0cmVlLT5yaWdodCkpICsgMTsKKwlyY2hpbGQtPmhlaWdodCA9CisJCU1BWChWTUVNX0hFSUdIVChyY2hpbGQtPmxlZnQpLCBWTUVNX0hFSUdIVChyY2hpbGQtPnJpZ2h0KSkgKyAxOworCXJldHVybiByY2hpbGQ7Cit9CisKKworLyoKKyAqIFJlZnQgUm90YXRpb24KKyAqCisgKgkJIEEJCQkJICBCCisgKgkgICBcCQkJCSAgLyAgXAorICoJICBCCQkgPT4JICAgRAlBCisgKgkvICBcCQkJCQkgLworICogICBECUMJCQkJICAgQworICoKKyAqLworc3RhdGljIHN0cnVjdCBhdmxfbm9kZV90ICpyb3RhdGlvbl9yaWdodChzdHJ1Y3QgYXZsX25vZGVfdCAqdHJlZSkKK3sKKwlzdHJ1Y3QgYXZsX25vZGVfdCAqcmNoaWxkOworCXN0cnVjdCBhdmxfbm9kZV90ICpsY2hpbGQ7CisKKwlpZiAodHJlZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWxjaGlsZCA9IHRyZWUtPmxlZnQ7CisJaWYgKGxjaGlsZCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXJjaGlsZCA9IGxjaGlsZC0+cmlnaHQ7CisJbGNoaWxkLT5yaWdodCA9IHRyZWU7CisJdHJlZS0+bGVmdCA9IHJjaGlsZDsKKworCXRyZWUtPmhlaWdodCA9CisJCU1BWChWTUVNX0hFSUdIVCh0cmVlLT5sZWZ0KSwKKwkJVk1FTV9IRUlHSFQodHJlZS0+cmlnaHQpKSArIDE7CisJbGNoaWxkLT5oZWlnaHQgPQorCQlNQVgoVk1FTV9IRUlHSFQobGNoaWxkLT5sZWZ0KSwKKwkJVk1FTV9IRUlHSFQobGNoaWxkLT5yaWdodCkpICsgMTsKKwlyZXR1cm4gbGNoaWxkOworfQorCitzdGF0aWMgc3RydWN0IGF2bF9ub2RlX3QgKmRvX2JhbGFuY2Uoc3RydWN0IGF2bF9ub2RlX3QgKnRyZWUpCit7CisJczMyIGJmYWN0b3IgPSAwLCBjaGlsZF9iZmFjdG9yOworCisJYmZhY3RvciA9IGdldF9iYWxhbmNlX2ZhY3Rvcih0cmVlKTsKKwlpZiAoYmZhY3RvciA+PSAyKSB7CisJCWNoaWxkX2JmYWN0b3IgPSBnZXRfYmFsYW5jZV9mYWN0b3IodHJlZS0+cmlnaHQpOworCQlpZiAoY2hpbGRfYmZhY3RvciA9PSAxIHx8IGNoaWxkX2JmYWN0b3IgPT0gMCkgeworCQkJdHJlZSA9IHJvdGF0aW9uX2xlZnQodHJlZSk7CisJCX0gZWxzZSBpZiAoY2hpbGRfYmZhY3RvciA9PSAtMSkgeworCQkJdHJlZS0+cmlnaHQgPSByb3RhdGlvbl9yaWdodCh0cmVlLT5yaWdodCk7CisJCQl0cmVlCSA9IHJvdGF0aW9uX2xlZnQodHJlZSk7CisJCX0gZWxzZSB7CisJCQlwcl9pbmZvKAorCQkJCSJpbnZhbGlkIGJhbGFuY2luZyBmYWN0b3I6ICVkXG4iLAorCQkJCWNoaWxkX2JmYWN0b3IpOworCQkJVk1FTV9BU1NFUlQ7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0gZWxzZSBpZiAoYmZhY3RvciA8PSAtMikgeworCQljaGlsZF9iZmFjdG9yID0gZ2V0X2JhbGFuY2VfZmFjdG9yKHRyZWUtPmxlZnQpOworCQlpZiAoY2hpbGRfYmZhY3RvciA9PSAtMSB8fCBjaGlsZF9iZmFjdG9yID09IDApIHsKKwkJCXRyZWUgPSByb3RhdGlvbl9yaWdodCh0cmVlKTsKKwkJfSBlbHNlIGlmIChjaGlsZF9iZmFjdG9yID09IDEpIHsKKwkJCXRyZWUtPmxlZnQgPSByb3RhdGlvbl9sZWZ0KHRyZWUtPmxlZnQpOworCQkJdHJlZQkgPSByb3RhdGlvbl9yaWdodCh0cmVlKTsKKwkJfSBlbHNlIHsKKwkJCXByX2luZm8oCisJCQkJImludmFsaWQgYmFsYW5jaW5nIGZhY3RvcjogJWRcbiIsCisJCQkJY2hpbGRfYmZhY3Rvcik7CisJCQlWTUVNX0FTU0VSVDsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCXJldHVybiB0cmVlOworfQorCitzdGF0aWMgc3RydWN0IGF2bF9ub2RlX3QgKnVubGlua19lbmRfbm9kZSgKKwlzdHJ1Y3QgYXZsX25vZGVfdCAqdHJlZSwKKwlzMzIgZGlyLAorCXN0cnVjdCBhdmxfbm9kZV90ICoqZm91bmRfbm9kZSkKK3sKKwlzdHJ1Y3QgYXZsX25vZGVfdCAqbm9kZTsKKwkqZm91bmRfbm9kZSA9IE5VTEw7CisKKwlpZiAodHJlZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChkaXIgPT0gTEVGVCkgeworCQlpZiAodHJlZS0+bGVmdCA9PSBOVUxMKSB7CisJCQkqZm91bmRfbm9kZSA9IHRyZWU7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCWlmICh0cmVlLT5yaWdodCA9PSBOVUxMKSB7CisJCQkqZm91bmRfbm9kZSA9IHRyZWU7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCWlmIChkaXIgPT0gTEVGVCkgeworCQlub2RlID0gdHJlZS0+bGVmdDsKKwkJdHJlZS0+bGVmdCA9IHVubGlua19lbmRfbm9kZSh0cmVlLT5sZWZ0LCBMRUZULCBmb3VuZF9ub2RlKTsKKwkJaWYgKHRyZWUtPmxlZnQgPT0gTlVMTCkgeworCQkJdHJlZS0+bGVmdCA9ICgqZm91bmRfbm9kZSktPnJpZ2h0OworCQkJKCpmb3VuZF9ub2RlKS0+bGVmdCA9IE5VTEw7CisJCQkoKmZvdW5kX25vZGUpLT5yaWdodCA9IE5VTEw7CisJCX0KKwl9IGVsc2UgeworCQlub2RlID0gdHJlZS0+cmlnaHQ7CisJCXRyZWUtPnJpZ2h0ID0gdW5saW5rX2VuZF9ub2RlKHRyZWUtPnJpZ2h0LCBSSUdIVCwgZm91bmRfbm9kZSk7CisJCWlmICh0cmVlLT5yaWdodCA9PSBOVUxMKSB7CisJCQl0cmVlLT5yaWdodCA9ICgqZm91bmRfbm9kZSktPmxlZnQ7CisJCQkoKmZvdW5kX25vZGUpLT5sZWZ0ID0gTlVMTDsKKwkJCSgqZm91bmRfbm9kZSktPnJpZ2h0ID0gTlVMTDsKKwkJfQorCX0KKwl0cmVlLT5oZWlnaHQgPQorCQlNQVgoVk1FTV9IRUlHSFQodHJlZS0+bGVmdCksIFZNRU1fSEVJR0hUKHRyZWUtPnJpZ2h0KSkgKyAxOworCXJldHVybiBkb19iYWxhbmNlKHRyZWUpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgYXZsX25vZGVfdCAqYXZsdHJlZV9pbnNlcnQoCisJc3RydWN0IGF2bF9ub2RlX3QgKnRyZWUsCisJdm1lbV9rZXlfdCBrZXksCisJc3RydWN0IHBhZ2VfdCAqcGFnZSkKK3sKKwlpZiAodHJlZSA9PSBOVUxMKSB7CisJCXRyZWUgPSBtYWtlX2F2bF9ub2RlKGtleSwgcGFnZSk7CisJfSBlbHNlIHsKKwkJaWYgKGtleSA+PSB0cmVlLT5rZXkpCisJCQl0cmVlLT5yaWdodCA9CisJCQkJYXZsdHJlZV9pbnNlcnQodHJlZS0+cmlnaHQsIGtleSwgcGFnZSk7CisJCWVsc2UKKwkJCXRyZWUtPmxlZnQgPQorCQkJCWF2bHRyZWVfaW5zZXJ0KHRyZWUtPmxlZnQsIGtleSwgcGFnZSk7CisJfQorCXRyZWUgPSBkb19iYWxhbmNlKHRyZWUpOworCXRyZWUtPmhlaWdodCA9CisJCU1BWChWTUVNX0hFSUdIVCh0cmVlLT5sZWZ0KSwgVk1FTV9IRUlHSFQodHJlZS0+cmlnaHQpKSArIDE7CisJcmV0dXJuIHRyZWU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXZsX25vZGVfdCAqZG9fdW5saW5rKHN0cnVjdCBhdmxfbm9kZV90ICp0cmVlKQoreworCXN0cnVjdCBhdmxfbm9kZV90ICpub2RlOworCXN0cnVjdCBhdmxfbm9kZV90ICplbmRfbm9kZTsKKworCW5vZGUgPSB1bmxpbmtfZW5kX25vZGUodHJlZS0+cmlnaHQsIExFRlQsICZlbmRfbm9kZSk7CisJaWYgKG5vZGUpIHsKKwkJdHJlZS0+cmlnaHQgPSBub2RlOworCX0gZWxzZSB7CisJCW5vZGUgPQorCQkJdW5saW5rX2VuZF9ub2RlKHRyZWUtPmxlZnQsIFJJR0hULCAmZW5kX25vZGUpOworCQlpZiAobm9kZSkKKwkJCXRyZWUtPmxlZnQgPSBub2RlOworCX0KKworCWlmIChub2RlID09IE5VTEwpIHsKKwkJbm9kZSA9IHRyZWUtPnJpZ2h0ID8gdHJlZS0+cmlnaHQgOiB0cmVlLT5sZWZ0OworCQllbmRfbm9kZSA9IG5vZGU7CisJfQorCisJaWYgKGVuZF9ub2RlKSB7CisJCWVuZF9ub2RlLT5sZWZ0ID0KKwkJCSh0cmVlLT5sZWZ0ICE9IGVuZF9ub2RlKSA/CisJCQl0cmVlLT5sZWZ0IDogZW5kX25vZGUtPmxlZnQ7CisJCWVuZF9ub2RlLT5yaWdodCA9CisJCQkodHJlZS0+cmlnaHQgIT0gZW5kX25vZGUpID8KKwkJCXRyZWUtPnJpZ2h0IDogZW5kX25vZGUtPnJpZ2h0OworCQllbmRfbm9kZS0+aGVpZ2h0ID0KKwkJCU1BWChWTUVNX0hFSUdIVChlbmRfbm9kZS0+bGVmdCksCisJCQlWTUVNX0hFSUdIVChlbmRfbm9kZS0+cmlnaHQpKSArIDE7CisJfQorCXRyZWUgPSBlbmRfbm9kZTsKKwlyZXR1cm4gdHJlZTsKK30KKworc3RhdGljIHN0cnVjdCBhdmxfbm9kZV90ICphdmx0cmVlX3JlbW92ZSgKKwlzdHJ1Y3QgYXZsX25vZGVfdCAqdHJlZSwKKwlzdHJ1Y3QgYXZsX25vZGVfdCAqKmZvdW5kX25vZGUsCisJdm1lbV9rZXlfdCBrZXkpCit7CisJKmZvdW5kX25vZGUgPSBOVUxMOworCWlmICh0cmVlID09IE5VTEwpIHsKKwkJcHJfaW5mbygiZmFpbGVkIHRvIGZpbmQga2V5ICVkXG4iLCAoczMyKWtleSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChrZXkgPT0gdHJlZS0+a2V5KSB7CisJCSpmb3VuZF9ub2RlID0gdHJlZTsKKwkJdHJlZSA9IGRvX3VubGluayh0cmVlKTsKKwl9IGVsc2UgaWYgKGtleSA+IHRyZWUtPmtleSkgeworCQl0cmVlLT5yaWdodCA9CisJCQlhdmx0cmVlX3JlbW92ZSh0cmVlLT5yaWdodCwgZm91bmRfbm9kZSwga2V5KTsKKwl9IGVsc2UgeworCQl0cmVlLT5sZWZ0ID0KKwkJCWF2bHRyZWVfcmVtb3ZlKHRyZWUtPmxlZnQsIGZvdW5kX25vZGUsIGtleSk7CisJfQorCisJaWYgKHRyZWUpCisJCXRyZWUtPmhlaWdodCA9CisJCQlNQVgoVk1FTV9IRUlHSFQodHJlZS0+bGVmdCksCisJCQlWTUVNX0hFSUdIVCh0cmVlLT5yaWdodCkpICsgMTsKKworCXRyZWUgPSBkb19iYWxhbmNlKHRyZWUpOworCXJldHVybiB0cmVlOworfQorCit2b2lkIGF2bHRyZWVfZnJlZShzdHJ1Y3QgYXZsX25vZGVfdCAqdHJlZSkKK3sKKwlpZiAodHJlZSA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKHRyZWUtPmxlZnQgPT0gTlVMTCAmJiB0cmVlLT5yaWdodCA9PSBOVUxMKSB7CisJCVZNRU1fUF9GUkVFKHRyZWUpOworCQlyZXR1cm47CisJfQorCisJYXZsdHJlZV9mcmVlKHRyZWUtPmxlZnQpOworCXRyZWUtPmxlZnQgPSBOVUxMOworCWF2bHRyZWVfZnJlZSh0cmVlLT5yaWdodCk7CisJdHJlZS0+cmlnaHQgPSBOVUxMOworCVZNRU1fUF9GUkVFKHRyZWUpOworfQorCitzdGF0aWMgc3RydWN0IGF2bF9ub2RlX3QgKnJlbW92ZV9hcHByb3hfdmFsdWUoCisJc3RydWN0IGF2bF9ub2RlX3QgKnRyZWUsCisJc3RydWN0IGF2bF9ub2RlX3QgKipmb3VuZCwKKwl2bWVtX2tleV90IGtleSkKK3sKKwkqZm91bmQgPSBOVUxMOworCWlmICh0cmVlID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJaWYgKGtleSA9PSB0cmVlLT5rZXkpIHsKKwkJKmZvdW5kID0gdHJlZTsKKwkJdHJlZSA9IGRvX3VubGluayh0cmVlKTsKKwl9IGVsc2UgaWYgKGtleSA+IHRyZWUtPmtleSkgeworCQl0cmVlLT5yaWdodCA9IHJlbW92ZV9hcHByb3hfdmFsdWUodHJlZS0+cmlnaHQsIGZvdW5kLCBrZXkpOworCX0gZWxzZSB7CisJCXRyZWUtPmxlZnQgPSByZW1vdmVfYXBwcm94X3ZhbHVlKHRyZWUtPmxlZnQsIGZvdW5kLCBrZXkpOworCQlpZiAoKmZvdW5kID09IE5VTEwpIHsKKwkJCSpmb3VuZCA9IHRyZWU7CisJCQl0cmVlID0gZG9fdW5saW5rKHRyZWUpOworCQl9CisJfQorCWlmICh0cmVlKQorCQl0cmVlLT5oZWlnaHQgPQorCQkJTUFYKFZNRU1fSEVJR0hUKHRyZWUtPmxlZnQpLAorCQkJVk1FTV9IRUlHSFQodHJlZS0+cmlnaHQpKSArIDE7CisJdHJlZSA9IGRvX2JhbGFuY2UodHJlZSk7CisJcmV0dXJuIHRyZWU7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9ibG9ja3NfZnJlZSgKKwlzdHJ1Y3QgdmlkZW9fbW1fdCAqbW0sCisJczMyIHBhZ2VubywKKwlzMzIgbnBhZ2VzKQoreworCXMzMiBsYXN0X3BhZ2VubyA9IHBhZ2VubyArIG5wYWdlcyAtIDE7CisJczMyIGk7CisJc3RydWN0IHBhZ2VfdCAqcGFnZTsKKwlzdHJ1Y3QgcGFnZV90ICpsYXN0X3BhZ2U7CisKKwlpZiAobnBhZ2VzID09IDApCisJCVZNRU1fQVNTRVJUOworCisJaWYgKGxhc3RfcGFnZW5vID49IG1tLT5udW1fcGFnZXMpIHsKKwkJcHJfaW5mbygKKwkJCSJzZXRfYmxvY2tzX2ZyZWU6IGludmFsaWQgbGFzdCBwYWdlIG51bWJlcjogJWRcbiIsCisJCQlsYXN0X3BhZ2Vubyk7CisJCVZNRU1fQVNTRVJUOworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gcGFnZW5vOyBpIDw9IGxhc3RfcGFnZW5vOyBpKyspIHsKKwkJbW0tPnBhZ2VfbGlzdFtpXS51c2VkCT0gMDsKKwkJbW0tPnBhZ2VfbGlzdFtpXS5hbGxvY19wYWdlcyA9IDA7CisJCW1tLT5wYWdlX2xpc3RbaV0uZmlyc3RfcGFnZW5vID0gLTE7CisJfQorCisJcGFnZSA9ICZtbS0+cGFnZV9saXN0W3BhZ2Vub107CisJcGFnZS0+YWxsb2NfcGFnZXMgPSBucGFnZXM7CisJbGFzdF9wYWdlID0gJm1tLT5wYWdlX2xpc3RbbGFzdF9wYWdlbm9dOworCWxhc3RfcGFnZS0+Zmlyc3RfcGFnZW5vID0gcGFnZW5vOworCW1tLT5mcmVlX3RyZWUgPQorCQlhdmx0cmVlX2luc2VydChtbS0+ZnJlZV90cmVlLCBNQUtFX0tFWShucGFnZXMsIHBhZ2VubyksIHBhZ2UpOworfQorCitzdGF0aWMgdm9pZCBzZXRfYmxvY2tzX2FsbG9jKAorCXN0cnVjdCB2aWRlb19tbV90ICptbSwKKwlzMzIgcGFnZW5vLAorCXMzMiBucGFnZXMpCit7CisJczMyIGxhc3RfcGFnZW5vID0gcGFnZW5vICsgbnBhZ2VzIC0gMTsKKwlzMzIgaTsKKwlzdHJ1Y3QgcGFnZV90ICpwYWdlOworCXN0cnVjdCBwYWdlX3QgKmxhc3RfcGFnZTsKKworCWlmIChsYXN0X3BhZ2VubyA+PSBtbS0+bnVtX3BhZ2VzKSB7CisJCXByX2luZm8oCisJCQkic2V0X2Jsb2Nrc19mcmVlOiBpbnZhbGlkIGxhc3QgcGFnZSBudW1iZXI6ICVkXG4iLAorCQkJbGFzdF9wYWdlbm8pOworCQlWTUVNX0FTU0VSVDsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IHBhZ2VubzsgaSA8PSBsYXN0X3BhZ2VubzsgaSsrKSB7CisJCW1tLT5wYWdlX2xpc3RbaV0udXNlZAk9IDE7CisJCW1tLT5wYWdlX2xpc3RbaV0uYWxsb2NfcGFnZXMgPSAwOworCQltbS0+cGFnZV9saXN0W2ldLmZpcnN0X3BhZ2VubyA9IC0xOworCX0KKworCXBhZ2UgPSAmbW0tPnBhZ2VfbGlzdFtwYWdlbm9dOworCXBhZ2UtPmFsbG9jX3BhZ2VzID0gbnBhZ2VzOworCWxhc3RfcGFnZSA9ICZtbS0+cGFnZV9saXN0W2xhc3RfcGFnZW5vXTsKKwlsYXN0X3BhZ2UtPmZpcnN0X3BhZ2VubyA9IHBhZ2VubzsKKwltbS0+YWxsb2NfdHJlZSA9CisJCWF2bHRyZWVfaW5zZXJ0KG1tLT5hbGxvY190cmVlLCBNQUtFX0tFWShwYWdlLT5hZGRyLCAwKSwgcGFnZSk7Cit9CisKKworczMyIHZtZW1faW5pdChzdHJ1Y3QgdmlkZW9fbW1fdCAqbW0sIHVsb25nIGFkZHIsIHVsb25nIHNpemUpCit7CisJczMyIGk7CisKKwlpZiAobW0gPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJbW0tPmJhc2VfYWRkciA9IChhZGRyICsgKFZNRU1fUEFHRV9TSVpFIC0gMSkpCisJCSYgfihWTUVNX1BBR0VfU0laRSAtIDEpOworCW1tLT5tZW1fc2l6ZSA9IHNpemUgJiB+Vk1FTV9QQUdFX1NJWkU7CisJbW0tPm51bV9wYWdlcyA9IG1tLT5tZW1fc2l6ZSAvIFZNRU1fUEFHRV9TSVpFOworCW1tLT5mcmVlX3RyZWUgPSBOVUxMOworCW1tLT5hbGxvY190cmVlID0gTlVMTDsKKwltbS0+ZnJlZV9wYWdlX2NvdW50ID0gbW0tPm51bV9wYWdlczsKKwltbS0+YWxsb2NfcGFnZV9jb3VudCA9IDA7CisJbW0tPnBhZ2VfbGlzdCA9CisJCShzdHJ1Y3QgcGFnZV90ICopVk1FTV9QX0FMTE9DKAorCQltbS0+bnVtX3BhZ2VzICogc2l6ZW9mKHN0cnVjdCBwYWdlX3QpKTsKKwlpZiAobW0tPnBhZ2VfbGlzdCA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6JWQgZmFpbGVkIHRvIGttYWxsb2MoJXp1KVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywKKwkJCW1tLT5udW1fcGFnZXMgKiBzaXplb2Yoc3RydWN0IHBhZ2VfdCkpOworCQlyZXR1cm4gLTE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG1tLT5udW1fcGFnZXM7IGkrKykgeworCQltbS0+cGFnZV9saXN0W2ldLnBhZ2VubyA9IGk7CisJCW1tLT5wYWdlX2xpc3RbaV0uYWRkciA9CisJCQltbS0+YmFzZV9hZGRyICsgaSAqIFZNRU1fUEFHRV9TSVpFOworCQltbS0+cGFnZV9saXN0W2ldLmFsbG9jX3BhZ2VzID0gMDsKKwkJbW0tPnBhZ2VfbGlzdFtpXS51c2VkID0gMDsKKwkJbW0tPnBhZ2VfbGlzdFtpXS5maXJzdF9wYWdlbm8gPSAtMTsKKwl9CisJc2V0X2Jsb2Nrc19mcmVlKG1tLCAwLCBtbS0+bnVtX3BhZ2VzKTsKKwlyZXR1cm4gMDsKK30KKworczMyIHZtZW1fZXhpdChzdHJ1Y3QgdmlkZW9fbW1fdCAqbW0pCit7CisJaWYgKG1tID09IE5VTEwpIHsKKwkJcHJfaW5mbygidm1lbV9leGl0OiBpbnZhbGlkIGhhbmRsZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAobW0tPmZyZWVfdHJlZSkKKwkJYXZsdHJlZV9mcmVlKG1tLT5mcmVlX3RyZWUpOworCWlmIChtbS0+YWxsb2NfdHJlZSkKKwkJYXZsdHJlZV9mcmVlKG1tLT5hbGxvY190cmVlKTsKKworCWlmIChtbS0+cGFnZV9saXN0KSB7CisJCVZNRU1fUF9GUkVFKG1tLT5wYWdlX2xpc3QpOworCQltbS0+cGFnZV9saXN0ID0gTlVMTDsKKwl9CisKKwltbS0+YmFzZV9hZGRyID0gMDsKKwltbS0+bWVtX3NpemUgPSAwOworCW1tLT5udW1fcGFnZXMgPSAwOworCW1tLT5wYWdlX2xpc3QgPSBOVUxMOworCW1tLT5mcmVlX3RyZWUgPSBOVUxMOworCW1tLT5hbGxvY190cmVlID0gTlVMTDsKKwltbS0+ZnJlZV9wYWdlX2NvdW50ID0gMDsKKwltbS0+YWxsb2NfcGFnZV9jb3VudCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3Vsb25nIHZtZW1fYWxsb2Moc3RydWN0IHZpZGVvX21tX3QgKm1tLCBzMzIgc2l6ZSwgdWxvbmcgcGlkKQoreworCXN0cnVjdCBhdmxfbm9kZV90ICpub2RlOworCXN0cnVjdCBwYWdlX3QgKmZyZWVfcGFnZTsKKwlzMzIgbnBhZ2VzLCBmcmVlX3NpemU7CisJczMyIGFsbG9jX3BhZ2VubzsKKwl1bG9uZyBwdHI7CisKKwlpZiAobW0gPT0gTlVMTCkgeworCQlwcl9pbmZvKCJ2bWVtX2FsbG9jOiBpbnZhbGlkIGhhbmRsZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoc2l6ZSA8PSAwKQorCQlyZXR1cm4gLTE7CisKKwlucGFnZXMgPSAoc2l6ZSArIFZNRU1fUEFHRV9TSVpFIC0gMSkgLyBWTUVNX1BBR0VfU0laRTsKKwltbS0+ZnJlZV90cmVlID0gcmVtb3ZlX2FwcHJveF92YWx1ZShtbS0+ZnJlZV90cmVlLAorCQkmbm9kZSwgTUFLRV9LRVkobnBhZ2VzLCAwKSk7CisKKwlpZiAobm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlmcmVlX3BhZ2UgPSBub2RlLT5wYWdlOworCWZyZWVfc2l6ZSA9IEtFWV9UT19WQUxVRShub2RlLT5rZXkpOworCWFsbG9jX3BhZ2VubyA9IGZyZWVfcGFnZS0+cGFnZW5vOworCXNldF9ibG9ja3NfYWxsb2MobW0sIGFsbG9jX3BhZ2VubywgbnBhZ2VzKTsKKwlpZiAobnBhZ2VzICE9IGZyZWVfc2l6ZSkgeworCQlzMzIgZnJlZV9wYWdlbm8gPSBhbGxvY19wYWdlbm8gKyBucGFnZXM7CisKKwkJc2V0X2Jsb2Nrc19mcmVlKG1tLCBmcmVlX3BhZ2VubywgKGZyZWVfc2l6ZS1ucGFnZXMpKTsKKwl9CisJVk1FTV9QX0ZSRUUobm9kZSk7CisKKwlwdHIgPSBtbS0+cGFnZV9saXN0W2FsbG9jX3BhZ2Vub10uYWRkcjsKKwltbS0+YWxsb2NfcGFnZV9jb3VudCArPSBucGFnZXM7CisJbW0tPmZyZWVfcGFnZV9jb3VudCAtPSBucGFnZXM7CisJcmV0dXJuIHB0cjsKK30KKworczMyIHZtZW1fZnJlZShzdHJ1Y3QgdmlkZW9fbW1fdCAqbW0sIHVsb25nIHB0ciwgdWxvbmcgcGlkKQoreworCXVsb25nIGFkZHI7CisJc3RydWN0IGF2bF9ub2RlX3QgKmZvdW5kOworCXN0cnVjdCBwYWdlX3QgKnBhZ2U7CisJczMyIHBhZ2VubywgcHJldl9mcmVlX3BhZ2VubywgbmV4dF9mcmVlX3BhZ2VubzsKKwlzMzIgcHJldl9zaXplLCBuZXh0X3NpemU7CisJczMyIG1lcmdlX3BhZ2Vfbm8sIG1lcmdlX3BhZ2Vfc2l6ZSwgZnJlZV9wYWdlX3NpemU7CisKKwlpZiAobW0gPT0gTlVMTCkgeworCQlwcl9pbmZvKCJ2bWVtX2ZyZWU6IGludmFsaWQgaGFuZGxlXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWFkZHIgPSBwdHI7CisJbW0tPmFsbG9jX3RyZWUgPSBhdmx0cmVlX3JlbW92ZShtbS0+YWxsb2NfdHJlZSwgJmZvdW5kLAorCQlNQUtFX0tFWShhZGRyLCAwKSk7CisKKwlpZiAoZm91bmQgPT0gTlVMTCkgeworCQlwcl9pbmZvKCJ2bWVtX2ZyZWU6IDB4JTA4eCBub3QgZm91bmRcbiIsIChzMzIpYWRkcik7CisJCVZNRU1fQVNTRVJUOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogZmluZCBwcmV2aW91cyBmcmVlIGJsb2NrICovCisJcGFnZSA9IGZvdW5kLT5wYWdlOworCXBhZ2VubyA9IHBhZ2UtPnBhZ2VubzsKKwlmcmVlX3BhZ2Vfc2l6ZSA9IHBhZ2UtPmFsbG9jX3BhZ2VzOworCXByZXZfZnJlZV9wYWdlbm8gPSBwYWdlbm8gLSAxOworCXByZXZfc2l6ZSA9IC0xOworCWlmIChwcmV2X2ZyZWVfcGFnZW5vID49IDApIHsKKwkJaWYgKG1tLT5wYWdlX2xpc3RbcHJldl9mcmVlX3BhZ2Vub10udXNlZCA9PSAwKSB7CisJCQlwcmV2X2ZyZWVfcGFnZW5vID0KKwkJCQltbS0+cGFnZV9saXN0W3ByZXZfZnJlZV9wYWdlbm9dLmZpcnN0X3BhZ2VubzsKKwkJCXByZXZfc2l6ZSA9CisJCQkJbW0tPnBhZ2VfbGlzdFtwcmV2X2ZyZWVfcGFnZW5vXS5hbGxvY19wYWdlczsKKwkJfQorCX0KKworCS8qIGZpbmQgbmV4dCBmcmVlIGJsb2NrICovCisJbmV4dF9mcmVlX3BhZ2VubyA9IHBhZ2VubyArIHBhZ2UtPmFsbG9jX3BhZ2VzOworCW5leHRfZnJlZV9wYWdlbm8gPQorCQkobmV4dF9mcmVlX3BhZ2VubyA9PSBtbS0+bnVtX3BhZ2VzKSA/IC0xIDogbmV4dF9mcmVlX3BhZ2VubzsKKwluZXh0X3NpemUgPSAtMTsKKwlpZiAobmV4dF9mcmVlX3BhZ2VubyA+PSAwKSB7CisJCWlmIChtbS0+cGFnZV9saXN0W25leHRfZnJlZV9wYWdlbm9dLnVzZWQgPT0gMCkgeworCQkJbmV4dF9zaXplID0KKwkJCQltbS0+cGFnZV9saXN0W25leHRfZnJlZV9wYWdlbm9dLmFsbG9jX3BhZ2VzOworCQl9CisJfQorCVZNRU1fUF9GUkVFKGZvdW5kKTsKKworCS8qIG1lcmdlICovCisJbWVyZ2VfcGFnZV9ubyA9IHBhZ2UtPnBhZ2VubzsKKwltZXJnZV9wYWdlX3NpemUgPSBwYWdlLT5hbGxvY19wYWdlczsKKwlpZiAocHJldl9zaXplID49IDApIHsKKwkJbW0tPmZyZWVfdHJlZSA9IGF2bHRyZWVfcmVtb3ZlKG1tLT5mcmVlX3RyZWUsICZmb3VuZCwKKwkJCU1BS0VfS0VZKHByZXZfc2l6ZSwgcHJldl9mcmVlX3BhZ2VubykpOworCQlpZiAoZm91bmQgPT0gTlVMTCkgeworCQkJVk1FTV9BU1NFUlQ7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbWVyZ2VfcGFnZV9ubyA9IGZvdW5kLT5wYWdlLT5wYWdlbm87CisJCW1lcmdlX3BhZ2Vfc2l6ZSArPSBmb3VuZC0+cGFnZS0+YWxsb2NfcGFnZXM7CisJCVZNRU1fUF9GUkVFKGZvdW5kKTsKKwl9CisJaWYgKG5leHRfc2l6ZSA+PSAwKSB7CisJCW1tLT5mcmVlX3RyZWUgPSBhdmx0cmVlX3JlbW92ZShtbS0+ZnJlZV90cmVlLCAmZm91bmQsCisJCQlNQUtFX0tFWShuZXh0X3NpemUsIG5leHRfZnJlZV9wYWdlbm8pKTsKKwkJaWYgKGZvdW5kID09IE5VTEwpIHsKKwkJCVZNRU1fQVNTRVJUOworCQkJcmV0dXJuIC0xOworCQl9CisJCW1lcmdlX3BhZ2Vfc2l6ZSArPSBmb3VuZC0+cGFnZS0+YWxsb2NfcGFnZXM7CisJCVZNRU1fUF9GUkVFKGZvdW5kKTsKKwl9CisJcGFnZS0+YWxsb2NfcGFnZXMgPSAwOworCXBhZ2UtPmZpcnN0X3BhZ2VubyA9IC0xOworCXNldF9ibG9ja3NfZnJlZShtbSwgbWVyZ2VfcGFnZV9ubywgbWVyZ2VfcGFnZV9zaXplKTsKKwltbS0+YWxsb2NfcGFnZV9jb3VudCAtPSBmcmVlX3BhZ2Vfc2l6ZTsKKwltbS0+ZnJlZV9wYWdlX2NvdW50ICs9IGZyZWVfcGFnZV9zaXplOworCXJldHVybiAwOworfQorCitzMzIgdm1lbV9nZXRfaW5mbyhzdHJ1Y3QgdmlkZW9fbW1fdCAqbW0sIHN0cnVjdCB2bWVtX2luZm9fdCAqaW5mbykKK3sKKwlpZiAobW0gPT0gTlVMTCkgeworCQlwcl9pbmZvKCJ2bWVtX2dldF9pbmZvOiBpbnZhbGlkIGhhbmRsZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoaW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpbmZvLT50b3RhbF9wYWdlcyA9IG1tLT5udW1fcGFnZXM7CisJaW5mby0+YWxsb2NfcGFnZXMgPSBtbS0+YWxsb2NfcGFnZV9jb3VudDsKKwlpbmZvLT5mcmVlX3BhZ2VzID0gbW0tPmZyZWVfcGFnZV9jb3VudDsKKwlpbmZvLT5wYWdlX3NpemUgPSBWTUVNX1BBR0VfU0laRTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBfX0NOTV9WSURFT19NRU1PUllfTUFOQUdFTUVOVF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfc2luay9lbmNvZGVyL2gyNjUvdnB1LmMgYi9kcml2ZXJzL2ZyYW1lX3NpbmsvZW5jb2Rlci9oMjY1L3ZwdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1Y2IwNTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3NpbmsvZW5jb2Rlci9oMjY1L3ZwdS5jCkBAIC0wLDAgKzEsMjUyOCBAQAorLyoKKyAqIHZwdS5jCisgKgorICogbGludXggZGV2aWNlIGRyaXZlciBmb3IgVlBVLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiAtIDIwMTMgIENISVBTJk1FRElBIElOQy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9mZHQuaD4KKyNpbmNsdWRlIDxsaW51eC9yZXNldC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3Jlc2VydmVkX21lbS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvZGVjX21tLmg+CisKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3JlZ2lzdGVycy9jcHVfdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlICIuLi8uLi8uLi9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWNfcG93ZXJfY3RybC5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmRlY19yZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL3Bvd2VyX2N0cmwuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9wb3dlci9zYzItcGQuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL3Bvd2VyX2RvbWFpbi5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvcG93ZXJfY3RybC5oPgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTig0LDExLDEpCisjaW5jbHVkZSA8bGludXgvc2NoZWQvc2lnbmFsLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmRlY19yZWcuaD4KKyNpbmNsdWRlICIuLi8uLi8uLi9jb21tb24vbWVkaWFfY2xvY2svc3dpdGNoL2FtcG9ydHNfZ2F0ZS5oIgorCisjaW5jbHVkZSAidnB1LmgiCisjaW5jbHVkZSAidm1tLmgiCisKKy8qIGRlZmluaXRpb25zIHRvIGJlIGNoYW5nZWQgYXMgY3VzdG9tZXIgIGNvbmZpZ3VyYXRpb24gKi8KKy8qIGlmIHlvdSB3YW50IHRvIGhhdmUgY2xvY2sgZ2F0aW5nIHNjaGVtZSBmcmFtZSBieSBmcmFtZSAqLworLyogI2RlZmluZSBWUFVfU1VQUE9SVF9DTE9DS19DT05UUk9MICovCisKKy8vI2RlZmluZSBWUFVfU1VQUE9SVF9DTE9DS19DT05UUk9MCisKKworI2RlZmluZSBWUFVfUExBVEZPUk1fREVWSUNFX05BTUUgIkhldmNFbmMiCisjZGVmaW5lIFZQVV9ERVZfTkFNRSAiSGV2Y0VuYyIKKyNkZWZpbmUgVlBVX0NMQVNTX05BTUUgIkhldmNFbmMiCisKKyNpZm5kZWYgVk1fUkVTRVJWRUQJLypmb3Iga2VybmVsIHVwIHRvIDMuNy4wIHZlcnNpb24qLworI2RlZmluZSBWTV9SRVNFUlZFRCAoVk1fRE9OVEVYUEFORCB8IFZNX0RPTlREVU1QKQorI2VuZGlmCisKKyNkZWZpbmUgTUh6ICgxMDAwMDAwKQorCisjZGVmaW5lIFZQVV9JTklUX1ZJREVPX01FTU9SWV9TSVpFX0lOX0JZVEUgKDY0ICogU1pfMU0pCisKKyNkZWZpbmUgTE9HX0FMTCAwCisjZGVmaW5lIExPR19JTkZPIDEKKyNkZWZpbmUgTE9HX0RFQlVHIDIKKyNkZWZpbmUgTE9HX0VSUk9SIDMKKworI2RlZmluZSBlbmNfcHIobGV2ZWwsIHguLi4pIFwKKwlkbyB7IFwKKwkJaWYgKGxldmVsID49IHByaW50X2xldmVsKSBcCisJCQlwcmludGsoeCk7IFwKKwl9IHdoaWxlICgwKQorCitzdGF0aWMgczMyIHByaW50X2xldmVsID0gTE9HX0RFQlVHOworc3RhdGljIHMzMiBjbG9ja19sZXZlbCA9IDQ7CisKK3N0YXRpYyBzMzIgd2F2ZV9jbG9ja2E7CitzdGF0aWMgczMyIHdhdmVfY2xvY2tiOworc3RhdGljIHMzMiB3YXZlX2Nsb2NrYzsKKworc3RhdGljIHN0cnVjdCB2aWRlb19tbV90IHNfdm1lbTsKK3N0YXRpYyBzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90IHNfdmlkZW9fbWVtb3J5ID0gezB9Oworc3RhdGljIGJvb2wgdXNlX3Jlc2VydmU7CitzdGF0aWMgdWxvbmcgY21hX3Bvb2xfc2l6ZTsKKworLyogZW5kIGN1c3RvbWVyIGRlZmluaXRpb24gKi8KK3N0YXRpYyBzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90IHNfaW5zdGFuY2VfcG9vbCA9IHswfTsKK3N0YXRpYyBzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90IHNfY29tbW9uX21lbW9yeSA9IHswfTsKK3N0YXRpYyBzdHJ1Y3QgdnB1X2Rydl9jb250ZXh0X3Qgc192cHVfZHJ2X2NvbnRleHQ7CitzdGF0aWMgczMyIHNfdnB1X21ham9yOworc3RhdGljIHN0cnVjdCBkZXZpY2UgKmhldmNlbmNfZGV2OworCitzdGF0aWMgczMyIHNfdnB1X29wZW5fcmVmX2NvdW50Oworc3RhdGljIHMzMiBzX3ZwdV9pcnE7CitzdGF0aWMgYm9vbCBzX3ZwdV9pcnFfcmVxdWVzdGVkOworCitzdGF0aWMgc3RydWN0IHZwdWRydl9idWZmZXJfdCBzX3ZwdV9yZWdpc3RlciA9IHswfTsKKworc3RhdGljIHMzMiBzX2ludGVycnVwdF9mbGFnOworc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IHNfaW50ZXJydXB0X3dhaXRfcTsKKworc3RhdGljIHNwaW5sb2NrX3Qgc192cHVfbG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKHNfdnB1X2xvY2spOworc3RhdGljIERFRklORV9TRU1BUEhPUkUoc192cHVfc2VtKTsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHNfdmJwX2hlYWQgPSBMSVNUX0hFQURfSU5JVChzX3ZicF9oZWFkKTsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHNfaW5zdF9saXN0X2hlYWQgPSBMSVNUX0hFQURfSU5JVChzX2luc3RfbGlzdF9oZWFkKTsKK3N0YXRpYyBzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgaGV2Y190YXNrbGV0Oworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmhldmNfcGRldjsKKworc3RhdGljIHN0cnVjdCB2cHVfYml0X2Zpcm13YXJlX2luZm9fdCBzX2JpdF9maXJtd2FyZV9pbmZvW01BWF9OVU1fVlBVX0NPUkVdOworCitzdGF0aWMgc3RydWN0IHZwdV9kbWFfY2ZnIGRtYV9jZmdbM107CisKK3N0cnVjdCB2cHVfY2xrcyB7CisJc3RydWN0IGNsayAqd2F2ZV9hY2xrOworCXN0cnVjdCBjbGsgKndhdmVfYmNsazsKKwlzdHJ1Y3QgY2xrICp3YXZlX2NjbGs7Cit9OworCitzdGF0aWMgc3RydWN0IHZwdV9jbGtzIHNfdnB1X2Nsa3M7CisKKyNkZWZpbmUgQ0hFQ0tfUkVUKF9yZXQpIGlmIChyZXQpIHtlbmNfcHIoTE9HX0VSUk9SLCBcCisJCSIlczolZDpmdW5jdGlvbiBjYWxsIGZhaWxlZCB3aXRoIHJlc3VsdDogJWRcbiIsXAorCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBfcmV0KTt9CisKK3N0YXRpYyB1MzIgdnB1X3NyY19hZGRyX2NvbmZpZyhzdHJ1Y3QgdnB1X2RtYV9idWZfaW5mb190KTsKK3N0YXRpYyB2b2lkIHZwdV9kbWFfYnVmZmVyX3VubWFwKHN0cnVjdCB2cHVfZG1hX2NmZyAqY2ZnKTsKKworc3RhdGljIHZvaWQgZG1hX2ZsdXNoKHUzMiBidWZfc3RhcnQsIHUzMiBidWZfc2l6ZSkKK3sKKwlpZiAoaGV2Y19wZGV2KQorCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSgKKwkJCSZoZXZjX3BkZXYtPmRldiwgYnVmX3N0YXJ0LAorCQkJYnVmX3NpemUsIERNQV9UT19ERVZJQ0UpOworfQorCitzdGF0aWMgdm9pZCBjYWNoZV9mbHVzaCh1MzIgYnVmX3N0YXJ0LCB1MzIgYnVmX3NpemUpCit7CisJaWYgKGhldmNfcGRldikKKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoCisJCQkmaGV2Y19wZGV2LT5kZXYsIGJ1Zl9zdGFydCwKKwkJCWJ1Zl9zaXplLCBETUFfRlJPTV9ERVZJQ0UpOworfQorCitzMzIgdnB1X2h3X3Jlc2V0KHZvaWQpCit7CisJZW5jX3ByKExPR19ERUJVRywgInJlcXVlc3QgdnB1IHJlc2V0IGZyb20gYXBwbGljYXRpb24uXG4iKTsKKwlyZXR1cm4gMDsKK30KKworczMyIHZwdV9jbGtfcHJlcGFyZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCB2cHVfY2xrcyAqY2xrcykKK3sKKwlpbnQgcmV0OworCisJczMyIG5ld19jbG9ja2EgPSA2Njc7CisJczMyIG5ld19jbG9ja2IgPSA0MDA7CisJczMyIG5ld19jbG9ja2MgPSA0MDA7CisKKwlpZiAod2F2ZV9jbG9ja2EgPiAwKQorCQluZXdfY2xvY2thID0gd2F2ZV9jbG9ja2E7CisJaWYgKHdhdmVfY2xvY2tiID4gMCkKKwkJbmV3X2Nsb2NrYiA9IHdhdmVfY2xvY2tiOworCWlmICh3YXZlX2Nsb2NrYyA+IDApCisJCW5ld19jbG9ja2MgPSB3YXZlX2Nsb2NrYzsKKworCWNsa3MtPndhdmVfYWNsayA9IGRldm1fY2xrX2dldChkZXYsICJjdHNfd2F2ZTQyMF9hY2xrIik7CisJaWYgKElTX0VSUl9PUl9OVUxMKGNsa3MtPndhdmVfYWNsaykpIHsKKwkJZW5jX3ByKExPR19FUlJPUiwgImZhaWxlZCB0byBnZXQgd2F2ZSBhY2xrXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNsa3MtPndhdmVfYmNsayA9IGRldm1fY2xrX2dldChkZXYsICJjdHNfd2F2ZTQyMF9iY2xrIik7CisJaWYgKElTX0VSUl9PUl9OVUxMKGNsa3MtPndhdmVfYWNsaykpIHsKKwkJZW5jX3ByKExPR19FUlJPUiwgImZhaWxlZCB0byBnZXQgd2F2ZSBhY2xrXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNsa3MtPndhdmVfY2NsayA9IGRldm1fY2xrX2dldChkZXYsICJjdHNfd2F2ZTQyMF9jY2xrIik7CisJaWYgKElTX0VSUl9PUl9OVUxMKGNsa3MtPndhdmVfYWNsaykpIHsKKwkJZW5jX3ByKExPR19FUlJPUiwgImZhaWxlZCB0byBnZXQgd2F2ZSBhY2xrXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldCA9IGNsa19zZXRfcmF0ZShjbGtzLT53YXZlX2FjbGssIG5ld19jbG9ja2EgKiBNSHopOworCUNIRUNLX1JFVChyZXQpOworCXJldCA9IGNsa19zZXRfcmF0ZShjbGtzLT53YXZlX2JjbGssIG5ld19jbG9ja2IgKiBNSHopOworCUNIRUNLX1JFVChyZXQpOworCXJldCA9IGNsa19zZXRfcmF0ZShjbGtzLT53YXZlX2NjbGssIG5ld19jbG9ja2MgKiBNSHopOworCisJQ0hFQ0tfUkVUKHJldCk7CisJcmV0ID0gY2xrX3ByZXBhcmUoY2xrcy0+d2F2ZV9hY2xrKTsKKwlDSEVDS19SRVQocmV0KTsKKwlyZXQgPSBjbGtfcHJlcGFyZShjbGtzLT53YXZlX2JjbGspOworCUNIRUNLX1JFVChyZXQpOworCXJldCA9IGNsa19wcmVwYXJlKGNsa3MtPndhdmVfY2Nsayk7CisJQ0hFQ0tfUkVUKHJldCk7CisKKwllbmNfcHIoTE9HX0VSUk9SLCAid2F2ZV9jbGtfYTogJWx1IE1IelxuIiwgY2xrX2dldF9yYXRlKGNsa3MtPndhdmVfYWNsaykgLyAxMDAwMDAwKTsKKwllbmNfcHIoTE9HX0VSUk9SLCAid2F2ZV9jbGtfYjogJWx1IE1IelxuIiwgY2xrX2dldF9yYXRlKGNsa3MtPndhdmVfYmNsaykgLyAxMDAwMDAwKTsKKwllbmNfcHIoTE9HX0VSUk9SLCAid2F2ZV9jbGtfYzogJWx1IE1IelxuIiwgY2xrX2dldF9yYXRlKGNsa3MtPndhdmVfY2NsaykgLyAxMDAwMDAwKTsKKworCXJldHVybiAwOworfQorCit2b2lkIHZwdV9jbGtfdW5wcmVwYXJlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHZwdV9jbGtzICpjbGtzKQoreworCWNsa191bnByZXBhcmUoY2xrcy0+d2F2ZV9jY2xrKTsKKwlkZXZtX2Nsa19wdXQoZGV2LCBjbGtzLT53YXZlX2NjbGspOworCisJY2xrX3VucHJlcGFyZShjbGtzLT53YXZlX2JjbGspOworCWRldm1fY2xrX3B1dChkZXYsIGNsa3MtPndhdmVfYmNsayk7CisKKwljbGtfdW5wcmVwYXJlKGNsa3MtPndhdmVfYWNsayk7CisJZGV2bV9jbGtfcHV0KGRldiwgY2xrcy0+d2F2ZV9hY2xrKTsKK30KKworczMyIHZwdV9jbGtfY29uZmlnKHUzMiBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkgeworCQlpZiAoZ2V0X2NwdV90eXBlKCkgPj0gTUVTT05fQ1BVX01BSk9SX0lEX1NDMikgeworCQkJY2xrX2VuYWJsZShzX3ZwdV9jbGtzLndhdmVfYWNsayk7CisJCQljbGtfZW5hYmxlKHNfdnB1X2Nsa3Mud2F2ZV9iY2xrKTsKKwkJCWNsa19lbmFibGUoc192cHVfY2xrcy53YXZlX2NjbGspOworCQl9IGVsc2UgeworCQkJaWYgKGdldF9jcHVfdHlwZSgpID49IE1FU09OX0NQVV9NQUpPUl9JRF9HMTJBKQorCQkJCUhldmNFbmNfTW9yZUNsb2NrX2VuYWJsZSgpOworCQkJSGV2Y0VuY19jbG9ja19lbmFibGUoY2xvY2tfbGV2ZWwpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGdldF9jcHVfdHlwZSgpID49IE1FU09OX0NQVV9NQUpPUl9JRF9TQzIpIHsKKwkJCWNsa19kaXNhYmxlKHNfdnB1X2Nsa3Mud2F2ZV9jY2xrKTsKKwkJCWNsa19kaXNhYmxlKHNfdnB1X2Nsa3Mud2F2ZV9iY2xrKTsKKwkJCWNsa19kaXNhYmxlKHNfdnB1X2Nsa3Mud2F2ZV9hY2xrKTsKKwkJfSBlbHNlIHsKKwkJCUhldmNFbmNfY2xvY2tfZGlzYWJsZSgpOworCQkJaWYgKGdldF9jcHVfdHlwZSgpID49IE1FU09OX0NQVV9NQUpPUl9JRF9HMTJBKQorCQkJCUhldmNFbmNfTW9yZUNsb2NrX2Rpc2FibGUoKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgczMyIHZwdV9hbGxvY19kbWFfYnVmZmVyKHN0cnVjdCB2cHVkcnZfYnVmZmVyX3QgKnZiKQoreworCWlmICghdmIpCisJCXJldHVybiAtMTsKKworCXZiLT5waHlzX2FkZHIgPSAodWxvbmcpdm1lbV9hbGxvYygmc192bWVtLCB2Yi0+c2l6ZSwgMCk7CisJaWYgKCh1bG9uZyl2Yi0+cGh5c19hZGRyID09ICh1bG9uZyktMSkgeworCQllbmNfcHIoTE9HX0VSUk9SLAorCQkJIlBoeXNpY2FsIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yIHNpemU9JWRcbiIsIHZiLT5zaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWVuY19wcihMT0dfSU5GTywgInZwdV9hbGxvY19kbWFfYnVmZmVyOiB2Yi0+cGh5c19hZGRyIDB4JWx4IFxuIix2Yi0+cGh5c19hZGRyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdnB1X2ZyZWVfZG1hX2J1ZmZlcihzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90ICp2YikKK3sKKwlpZiAoIXZiKQorCQlyZXR1cm47CisJZW5jX3ByKExPR19JTkZPLCAidnB1X2ZyZWVfZG1hX2J1ZmZlciAweCVseFxuIix2Yi0+cGh5c19hZGRyKTsKKworCWlmICh2Yi0+cGh5c19hZGRyKQorCQl2bWVtX2ZyZWUoJnNfdm1lbSwgdmItPnBoeXNfYWRkciwgMCk7Cit9CisKK3N0YXRpYyBzMzIgdnB1X2ZyZWVfaW5zdGFuY2VzKHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCB2cHVkcnZfaW5zdGFuYWNlX2xpc3RfdCAqdmlsLCAqbjsKKwlzdHJ1Y3QgdnB1ZHJ2X2luc3RhbmNlX3Bvb2xfdCAqdmlwOworCXZvaWQgKnZpcF9iYXNlOworCisJZW5jX3ByKExPR19ERUJVRywgInZwdV9mcmVlX2luc3RhbmNlc1xuIik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodmlsLCBuLCAmc19pbnN0X2xpc3RfaGVhZCwgbGlzdCkgeworCQlpZiAodmlsLT5maWxwID09IGZpbHApIHsKKwkJCXZpcF9iYXNlID0gKHZvaWQgKilzX2luc3RhbmNlX3Bvb2wuYmFzZTsKKwkJCWVuY19wcihMT0dfSU5GTywKKwkJCQkiZnJlZV9pbnN0YW5jZXMgaW5zdElkeD0lZCwgY29yZUlkeD0lZCwgdmlwX2Jhc2U9JXBcbiIsCisJCQkJKHMzMil2aWwtPmluc3RfaWR4LAorCQkJCShzMzIpdmlsLT5jb3JlX2lkeCwKKwkJCQl2aXBfYmFzZSk7CisJCQl2aXAgPSAoc3RydWN0IHZwdWRydl9pbnN0YW5jZV9wb29sX3QgKil2aXBfYmFzZTsKKwkJCWlmICh2aXApIHsKKwkJCQkvKiBvbmx5IGZpcnN0IDQgYnl0ZSBpcyBrZXkgcG9pbnQKKwkJCQkgKgkoaW5Vc2Ugb2YgQ29kZWNJbnN0IGluIHZwdWFwaSkKKwkJCQkgKiAgICB0byBmcmVlIHRoZSBjb3JyZXNwb25kaW5nIGluc3RhbmNlLgorCQkJCSAqLworCQkJCW1lbXNldCgmdmlwLT5jb2RlY0luc3RQb29sW3ZpbC0+aW5zdF9pZHhdLAorCQkJCQkweDAwLCA0KTsKKwkJCX0KKwkJCXNfdnB1X29wZW5fcmVmX2NvdW50LS07CisJCQlsaXN0X2RlbCgmdmlsLT5saXN0KTsKKwkJCWtmcmVlKHZpbCk7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzMzIgdnB1X2ZyZWVfYnVmZmVycyhzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl9wb29sX3QgKnBvb2wsICpuOworCXN0cnVjdCB2cHVkcnZfYnVmZmVyX3QgdmI7CisKKwllbmNfcHIoTE9HX0RFQlVHLCAidnB1X2ZyZWVfYnVmZmVyc1xuIik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9vbCwgbiwgJnNfdmJwX2hlYWQsIGxpc3QpIHsKKwkJaWYgKHBvb2wtPmZpbHAgPT0gZmlscCkgeworCQkJdmIgPSBwb29sLT52YjsKKwkJCWlmICh2Yi5waHlzX2FkZHIpIHsKKwkJCQl2cHVfZnJlZV9kbWFfYnVmZmVyKCZ2Yik7CisJCQkJbGlzdF9kZWwoJnBvb2wtPmxpc3QpOworCQkJCWtmcmVlKHBvb2wpOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIHZwdV9pc19idWZmZXJfY2FjaGVkKHN0cnVjdCBmaWxlICpmaWxwLCB1bG9uZyB2bV9wZ29mZikKK3sKKwlzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl9wb29sX3QgKnBvb2wsICpuOworCXN0cnVjdCB2cHVkcnZfYnVmZmVyX3QgdmI7CisJYm9vbCBmaW5kID0gZmFsc2U7CisJdTMyIGNhY2hlZCA9IDA7CisKKwllbmNfcHIoTE9HX0FMTCwgIlsrXXZwdV9pc19idWZmZXJfY2FjaGVkXG4iKTsKKwlzcGluX2xvY2soJnNfdnB1X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb29sLCBuLCAmc192YnBfaGVhZCwgbGlzdCkgeworCQlpZiAocG9vbC0+ZmlscCA9PSBmaWxwKSB7CisJCQl2YiA9IHBvb2wtPnZiOworCQkJaWYgKCgodmIucGh5c19hZGRyICA+PiBQQUdFX1NISUZUKSA9PSB2bV9wZ29mZikKKwkJCQkmJiBmaW5kID09IGZhbHNlKXsKKwkJCQljYWNoZWQgPSB2Yi5jYWNoZWQ7CisJCQkJZmluZCA9IHRydWU7CisJCQl9CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJnNfdnB1X2xvY2spOworCWVuY19wcihMT0dfQUxMLCAiWy1ddnB1X2lzX2J1ZmZlcl9jYWNoZWQsIHJldDolZFxuIiwgY2FjaGVkKTsKKwlyZXR1cm4gY2FjaGVkOworfQorCitzdGF0aWMgdm9pZCBoZXZjZW5jX2lzcl90YXNrbGV0KHVsb25nIGRhdGEpCit7CisJc3RydWN0IHZwdV9kcnZfY29udGV4dF90ICpkZXYgPSAoc3RydWN0IHZwdV9kcnZfY29udGV4dF90ICopZGF0YTsKKworCWVuY19wcihMT0dfSU5GTywgImhldmNlbmNfaXNyX3Rhc2tsZXQgIGludGVycnVwdXQ6MHglMDhseFxuIiwKKwkJZGV2LT5pbnRlcnJ1cHRfcmVhc29uKTsKKwlpZiAoZGV2LT5pbnRlcnJ1cHRfcmVhc29uKSB7CisJCS8qIG5vdGlmeSB0aGUgaW50ZXJydXB0IHRvIHVzZXIgc3BhY2UgKi8KKwkJaWYgKGRldi0+YXN5bmNfcXVldWUpIHsKKwkJCWVuY19wcihMT0dfQUxMLCAia2lsbF9mYXN5bmMgZSAlc1xuIiwgX19mdW5jX18pOworCQkJa2lsbF9mYXN5bmMoJmRldi0+YXN5bmNfcXVldWUsIFNJR0lPLCBQT0xMX0lOKTsKKwkJfQorCQlzX2ludGVycnVwdF9mbGFnID0gMTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzX2ludGVycnVwdF93YWl0X3EpOworCX0KKwllbmNfcHIoTE9HX0FMTCwgIlstXSVzXG4iLCBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB2cHVfaXJxX2hhbmRsZXIoczMyIGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCB2cHVfZHJ2X2NvbnRleHRfdCAqZGV2ID0gKHN0cnVjdCB2cHVfZHJ2X2NvbnRleHRfdCAqKWRldl9pZDsKKwkvKiB0aGlzIGNhbiBiZSByZW1vdmVkLgorCSAqCWl0IGFsc28gd29yayBpbiBWUFVfV2FpdEludGVycnVwdCBvZiBBUEkgZnVuY3Rpb24KKwkgKi8KKwl1MzIgY29yZTsKKwl1bG9uZyBpbnRlcnJ1cHRfcmVhc29uID0gMDsKKworCWVuY19wcihMT0dfQUxMLCAiWytdJXNcbiIsIF9fZnVuY19fKTsKKworCWZvciAoY29yZSA9IDA7IGNvcmUgPCBNQVhfTlVNX1ZQVV9DT1JFOyBjb3JlKyspIHsKKwkJaWYgKHNfYml0X2Zpcm13YXJlX2luZm9bY29yZV0uc2l6ZSA9PSAwKSB7CisJCQkvKiBpdCBtZWFucyB0aGF0IHdlIGRpZG4ndCBnZXQgYW4gaW5mb3JtYXRpb24KKwkJCSAqCXRoZSBjdXJyZW50IGNvcmUgZnJvbSBBUEkgbGF5ZXIuCisJCQkgKglObyBjb3JlIGFjdGl2YXRlZC4KKwkJCSAqLworCQkJZW5jX3ByKExPR19FUlJPUiwKKwkJCQkic19iaXRfZmlybXdhcmVfaW5mb1tjb3JlXS5zaXplIGlzIHplcm9cbiIpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKFJlYWRWcHVSZWdpc3RlcihXNF9WUFVfVlBVX0lOVF9TVFMpKSB7CisJCQlpbnRlcnJ1cHRfcmVhc29uID0gUmVhZFZwdVJlZ2lzdGVyKFc0X1ZQVV9JTlRfUkVBU09OKTsKKwkJCVdyaXRlVnB1UmVnaXN0ZXIoVzRfVlBVX0lOVF9SRUFTT05fQ0xFQVIsCisJCQkJaW50ZXJydXB0X3JlYXNvbik7CisJCQlXcml0ZVZwdVJlZ2lzdGVyKFc0X1ZQVV9WSU5UX0NMRUFSLCAweDEpOworCQkJZGV2LT5pbnRlcnJ1cHRfcmVhc29uIHw9IGludGVycnVwdF9yZWFzb247CisJCX0KKwkJZW5jX3ByKExPR19JTkZPLAorCQkJImludHJfcmVhc29uOiAweCUwOGx4XG4iLCBkZXYtPmludGVycnVwdF9yZWFzb24pOworCX0KKwlpZiAoZGV2LT5pbnRlcnJ1cHRfcmVhc29uKQorCQl0YXNrbGV0X3NjaGVkdWxlKCZoZXZjX3Rhc2tsZXQpOworCWVuY19wcihMT0dfQUxMLCAiWy1dJXNcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBzMzIgdnB1X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJYm9vbCBhbGxvY19idWZmZXIgPSBmYWxzZTsKKwlzMzIgciA9IDA7CisKKwllbmNfcHIoTE9HX0RFQlVHLCAiWytdICVzLCBvcGVuX2NvdW50PSVkXG4iLCBfX2Z1bmNfXywKKwkJCXNfdnB1X2Rydl9jb250ZXh0Lm9wZW5fY291bnQpOworCWVuY19wcihMT0dfREVCVUcsICJ2cHVfb3BlbiwgY2FsbGluZyBwcm9jZXNzOiAlZDolc1xuIiwgY3VycmVudC0+cGlkLCBjdXJyZW50LT5jb21tKTsKKwlzcGluX2xvY2soJnNfdnB1X2xvY2spOworCXNfdnB1X2Rydl9jb250ZXh0Lm9wZW5fY291bnQrKzsKKwlpZiAoc192cHVfZHJ2X2NvbnRleHQub3Blbl9jb3VudCA9PSAxKSB7CisJCWFsbG9jX2J1ZmZlciA9IHRydWU7CisJfSBlbHNlIHsKKwkJciA9IC1FQlVTWTsKKwkJZW5jX3ByKExPR19FUlJPUiwgInZwdV9vcGVuLCBkZXZpY2UgaXMgYnVzeSwgc192cHVfZHJ2X2NvbnRleHQub3Blbl9jb3VudD0lZFxuIiwKKwkJCQlzX3ZwdV9kcnZfY29udGV4dC5vcGVuX2NvdW50KTsKKwkJc192cHVfZHJ2X2NvbnRleHQub3Blbl9jb3VudC0tOworCQlzcGluX3VubG9jaygmc192cHVfbG9jayk7CisJCXJldHVybiByOworCX0KKwlmaWxwLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKSgmc192cHVfZHJ2X2NvbnRleHQpOworCXNwaW5fdW5sb2NrKCZzX3ZwdV9sb2NrKTsKKwlpZiAoYWxsb2NfYnVmZmVyICYmICF1c2VfcmVzZXJ2ZSkgeworI2lmZGVmIENPTkZJR19DTUEKKwkJc192aWRlb19tZW1vcnkuc2l6ZSA9IFZQVV9JTklUX1ZJREVPX01FTU9SWV9TSVpFX0lOX0JZVEU7CisJCXNfdmlkZW9fbWVtb3J5LnBoeXNfYWRkciA9CisJCQkodWxvbmcpY29kZWNfbW1fYWxsb2NfZm9yX2RtYShWUFVfREVWX05BTUUsCisJCQlWUFVfSU5JVF9WSURFT19NRU1PUllfU0laRV9JTl9CWVRFID4+IFBBR0VfU0hJRlQsIDAsIDApOworCQlpZiAoc192aWRlb19tZW1vcnkucGh5c19hZGRyKSB7CisJCQllbmNfcHIoTE9HX0RFQlVHLAorCQkJCSJhbGxvY2F0aW5nIHBoeXMgMHglbHgsIHZpcnQgYWRkciAweCVseCwgc2l6ZSAlZGtcbiIsCisJCQkJc192aWRlb19tZW1vcnkucGh5c19hZGRyLAorCQkJCXNfdmlkZW9fbWVtb3J5LmJhc2UsCisJCQkJc192aWRlb19tZW1vcnkuc2l6ZSA+PiAxMCk7CisJCQlpZiAodm1lbV9pbml0KCZzX3ZtZW0sCisJCQkJc192aWRlb19tZW1vcnkucGh5c19hZGRyLAorCQkJCXNfdmlkZW9fbWVtb3J5LnNpemUpIDwgMCkgeworCQkJCWVuY19wcihMT0dfRVJST1IsICJmYWlsIHRvIGluaXQgdm1lbSBzeXN0ZW1cbiIpOworCQkJCXIgPSAtRU5PTUVNOworCQkJCWNvZGVjX21tX2ZyZWVfZm9yX2RtYSgKKwkJCQkJVlBVX0RFVl9OQU1FLAorCQkJCQkodTMyKXNfdmlkZW9fbWVtb3J5LnBoeXNfYWRkcik7CisJCQkJdm1lbV9leGl0KCZzX3ZtZW0pOworCQkJCW1lbXNldCgmc192aWRlb19tZW1vcnksIDAsCisJCQkJCXNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90KSk7CisJCQkJbWVtc2V0KCZzX3ZtZW0sIDAsCisJCQkJCXNpemVvZihzdHJ1Y3QgdmlkZW9fbW1fdCkpOworCQkJfQorCQl9IGVsc2UgeworCQkJZW5jX3ByKExPR19FUlJPUiwKKwkJCQkiQ01BIGZhaWxlZCB0byBhbGxvY2F0ZSBkbWEgYnVmZmVyIGZvciAlcywgcGh5czogMHglbHhcbiIsCisJCQkJVlBVX0RFVl9OQU1FLCBzX3ZpZGVvX21lbW9yeS5waHlzX2FkZHIpOworCQkJaWYgKHNfdmlkZW9fbWVtb3J5LnBoeXNfYWRkcikKKwkJCQljb2RlY19tbV9mcmVlX2Zvcl9kbWEoCisJCQkJCVZQVV9ERVZfTkFNRSwKKwkJCQkJKHUzMilzX3ZpZGVvX21lbW9yeS5waHlzX2FkZHIpOworCQkJc192aWRlb19tZW1vcnkucGh5c19hZGRyID0gMDsKKwkJCXIgPSAtRU5PTUVNOworCQl9CisjZWxzZQorCQllbmNfcHIoTE9HX0VSUk9SLAorCQkJIk5vIENNQSBhbmQgcmVzZXJ2ZWQgbWVtb3J5IGZvciBIZXZjRW5jISEhXG4iKTsKKwkJciA9IC1FTk9NRU07CisjZW5kaWYKKwl9IGVsc2UgaWYgKCFzX3ZpZGVvX21lbW9yeS5waHlzX2FkZHIpIHsKKwkJZW5jX3ByKExPR19FUlJPUiwKKwkJCSJIZXZjRW5jIG1lbW9yeSBpcyBub3QgbWFsbG9jZWQhISFcbiIpOworCQlyID0gLUVOT01FTTsKKwl9CisJaWYgKGFsbG9jX2J1ZmZlcikgeworCQl1bG9uZyBmbGFnczsKKwkJdTMyIGRhdGEzMjsKKworCQlpZiAoKHNfdnB1X2lycSA+PSAwKSAmJiAoc192cHVfaXJxX3JlcXVlc3RlZCA9PSBmYWxzZSkpIHsKKwkJCXMzMiBlcnI7CisKKwkJCWVyciA9IHJlcXVlc3RfaXJxKHNfdnB1X2lycSwgdnB1X2lycV9oYW5kbGVyLCAwLAorCQkJCSJIZXZjRW5jLWlycSIsICh2b2lkICopKCZzX3ZwdV9kcnZfY29udGV4dCkpOworCQkJaWYgKGVycikgeworCQkJCWVuY19wcihMT0dfRVJST1IsCisJCQkJCSJmYWlsIHRvIHJlZ2lzdGVyIGludGVycnVwdCBoYW5kbGVyXG4iKTsKKwkJCQlzcGluX2xvY2soJnNfdnB1X2xvY2spOworCQkJCXNfdnB1X2Rydl9jb250ZXh0Lm9wZW5fY291bnQtLTsKKwkJCQlzcGluX3VubG9jaygmc192cHVfbG9jayk7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCQlzX3ZwdV9pcnFfcmVxdWVzdGVkID0gdHJ1ZTsKKwkJfQorCQlpZiAoZ2V0X2NwdV90eXBlKCkgPj0gTUVTT05fQ1BVX01BSk9SX0lEX1NDMikgeworCQl9IGVsc2UKKwkJICAgIGFtcG9ydHNfc3dpdGNoX2dhdGUoInZkZWMiLCAxKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc192cHVfbG9jaywgZmxhZ3MpOworCisJCWlmIChnZXRfY3B1X3R5cGUoKSA+PSBNRVNPTl9DUFVfTUFKT1JfSURfU0MyKSB7CisJCQkvL3ZwdV9jbGtfY29uZmlnKDEpOworCQkJcHdyX2N0cmxfcHNjaV9zbWMoUERJRF9TQzJfRE9TX1dBVkUsIFBXUl9PTik7CisJCX0gZWxzZSB7CisJCQlXUklURV9BT1JFRyhBT19SVElfR0VOX1BXUl9TTEVFUDAsCisJCQkJUkVBRF9BT1JFRyhBT19SVElfR0VOX1BXUl9TTEVFUDApICYKKwkJCQkoZ2V0X2NwdV90eXBlKCkgPT0gTUVTT05fQ1BVX01BSk9SX0lEX1NNMQorCQkJCT8gfjB4OCA6IH4oMHgzPDwyNCkpKTsKKwkJfQorCQl1ZGVsYXkoMTApOworCisJCWlmIChnZXRfY3B1X3R5cGUoKSA8PSBNRVNPTl9DUFVfTUFKT1JfSURfVFhMWCkgeworCQkJZGF0YTMyID0gMHg3MDA7CisJCQlkYXRhMzIgfD0gUkVBRF9WUkVHKERPU19TV19SRVNFVDQpOworCQkJV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQ0LCBkYXRhMzIpOworCQkJZGF0YTMyICY9IH4weDcwMDsKKwkJCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUNCwgZGF0YTMyKTsKKwkJfSBlbHNlIHsKKwkJCWRhdGEzMiA9IDB4ZjAwOworCQkJZGF0YTMyIHw9IFJFQURfVlJFRyhET1NfU1dfUkVTRVQ0KTsKKwkJCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUNCwgZGF0YTMyKTsKKwkJCWRhdGEzMiAmPSB+MHhmMDA7CisJCQlXUklURV9WUkVHKERPU19TV19SRVNFVDQsIGRhdGEzMik7CisJCX0KKworCQlpZiAoZ2V0X2NwdV90eXBlKCkgPj0gTUVTT05fQ1BVX01BSk9SX0lEX1NDMikgeworCQkJcHJfZXJyKCJjb25zaWRlciB1c2luZyByZXNldCBjb250cm9sXG4iKTsKKwkJfSBlbHNlIHsKKwkJCVdSSVRFX01QRUdfUkVHKFJFU0VUMF9SRUdJU1RFUiwgZGF0YTMyICYgfigxPDwyMSkpOworCQkJV1JJVEVfTVBFR19SRUcoUkVTRVQwX1JFR0lTVEVSLCBkYXRhMzIgfCAoMTw8MjEpKTsKKwkJCVJFQURfTVBFR19SRUcoUkVTRVQwX1JFR0lTVEVSKTsKKwkJCVJFQURfTVBFR19SRUcoUkVTRVQwX1JFR0lTVEVSKTsKKwkJCVJFQURfTVBFR19SRUcoUkVTRVQwX1JFR0lTVEVSKTsKKwkJCVJFQURfTVBFR19SRUcoUkVTRVQwX1JFR0lTVEVSKTsKKwkJfQorCisjaWZuZGVmIFZQVV9TVVBQT1JUX0NMT0NLX0NPTlRST0wKKwkJdnB1X2Nsa19jb25maWcoMSk7CisjZW5kaWYKKwkJLyogRW5hYmxlIHdhdmU0MjBsX3ZwdV9pZGxlX3Jpc2VfaXJxLAorCQkgKglEaXNhYmxlIHdhdmU0MjBsX3ZwdV9pZGxlX2ZhbGxfaXJxCisJCSAqLworCQlXUklURV9WUkVHKERPU19XQVZFNDIwTF9DTlRMX1NUQVQsIDB4MSk7CisJCVdSSVRFX1ZSRUcoRE9TX01FTV9QRF9XQVZFNDIwTCwgMHgwKTsKKworCQlpZiAoZ2V0X2NwdV90eXBlKCkgPj0gTUVTT05fQ1BVX01BSk9SX0lEX1NDMikgeworCisJCX0gZWxzZSB7CisJCQlXUklURV9BT1JFRyhBT19SVElfR0VOX1BXUl9JU08wLAorCQkJCVJFQURfQU9SRUcoQU9fUlRJX0dFTl9QV1JfSVNPMCkgJgorCQkJCShnZXRfY3B1X3R5cGUoKSA9PSBNRVNPTl9DUFVfTUFKT1JfSURfU00xCisJCQkJPyB+MHg4IDogfigweDM8PDEyKSkpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNfdnB1X2xvY2ssIGZsYWdzKTsKKwl9CisJbWVtc2V0KGRtYV9jZmcsIDAsIHNpemVvZihkbWFfY2ZnKSk7CisJZG1hX2NmZ1swXS5mZCA9IC0xOworCWRtYV9jZmdbMV0uZmQgPSAtMTsKKwlkbWFfY2ZnWzJdLmZkID0gLTE7CisKKwlpZiAociAhPSAwKSB7CisJCXNwaW5fbG9jaygmc192cHVfbG9jayk7CisJCWVuY19wcihMT0dfREVCVUcsICJ2cHVfb3BlbiwgZXJyb3IgaGFuZGxpbmcsIHI9JWQsIHNfdnB1X2Rydl9jb250ZXh0Lm9wZW5fY291bnQ9JWRcbiIsCisJCQkJciwgc192cHVfZHJ2X2NvbnRleHQub3Blbl9jb3VudCk7CisJCXNfdnB1X2Rydl9jb250ZXh0Lm9wZW5fY291bnQtLTsKKwkJc3Bpbl91bmxvY2soJnNfdnB1X2xvY2spOworCX0KKwllbmNfcHIoTE9HX0RFQlVHLCAiWy1dICVzLCByZXQ6ICVkXG4iLCBfX2Z1bmNfXywgcik7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBsb25nIHZwdV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdTMyIGNtZCwgdWxvbmcgYXJnKQoreworCXMzMiByZXQgPSAwOworCXN0cnVjdCB2cHVfZHJ2X2NvbnRleHRfdCAqZGV2ID0KKwkJKHN0cnVjdCB2cHVfZHJ2X2NvbnRleHRfdCAqKWZpbHAtPnByaXZhdGVfZGF0YTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBWRElfSU9DVExfQUxMT0NBVEVfUEhZU0lDQUxfTUVNT1JZOgorCQl7CisJCQlzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl9wb29sX3QgKnZicDsKKworCQkJZW5jX3ByKExPR19BTEwsCisJCQkJIlsrXVZESV9JT0NUTF9BTExPQ0FURV9QSFlTSUNBTF9NRU1PUllcbiIpOworCQkJcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZzX3ZwdV9zZW0pOworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJdmJwID0ga3phbGxvYyhzaXplb2YoKnZicCksIEdGUF9LRVJORUwpOworCQkJCWlmICghdmJwKSB7CisJCQkJCXVwKCZzX3ZwdV9zZW0pOworCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQl9CisKKwkJCQlyZXQgPSBjb3B5X2Zyb21fdXNlcigmKHZicC0+dmIpLAorCQkJCQkoc3RydWN0IHZwdWRydl9idWZmZXJfdCAqKWFyZywKKwkJCQkJc2l6ZW9mKHN0cnVjdCB2cHVkcnZfYnVmZmVyX3QpKTsKKwkJCQlpZiAocmV0KSB7CisJCQkJCWtmcmVlKHZicCk7CisJCQkJCXVwKCZzX3ZwdV9zZW0pOworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisKKwkJCQlyZXQgPSB2cHVfYWxsb2NfZG1hX2J1ZmZlcigmKHZicC0+dmIpKTsKKwkJCQlpZiAocmV0ID09IC0xKSB7CisJCQkJCXJldCA9IC1FTk9NRU07CisJCQkJCWtmcmVlKHZicCk7CisJCQkJCXVwKCZzX3ZwdV9zZW0pOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcmV0ID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkJJih2YnAtPnZiKSwKKwkJCQkJc2l6ZW9mKHN0cnVjdCB2cHVkcnZfYnVmZmVyX3QpKTsKKwkJCQlpZiAocmV0KSB7CisJCQkJCWtmcmVlKHZicCk7CisJCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJCXVwKCZzX3ZwdV9zZW0pOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQl2YnAtPmZpbHAgPSBmaWxwOworCQkJCXNwaW5fbG9jaygmc192cHVfbG9jayk7CisJCQkJbGlzdF9hZGQoJnZicC0+bGlzdCwgJnNfdmJwX2hlYWQpOworCQkJCXNwaW5fdW5sb2NrKCZzX3ZwdV9sb2NrKTsKKworCQkJCXVwKCZzX3ZwdV9zZW0pOworCQkJfQorCQkJZW5jX3ByKExPR19BTEwsCisJCQkJIlstXVZESV9JT0NUTF9BTExPQ0FURV9QSFlTSUNBTF9NRU1PUllcbiIpOworCQl9CisJCWJyZWFrOworI2lmZGVmIENPTkZJR19DT01QQVQKKwljYXNlIFZESV9JT0NUTF9BTExPQ0FURV9QSFlTSUNBTF9NRU1PUlkzMjoKKwkJeworCQkJc3RydWN0IHZwdWRydl9idWZmZXJfcG9vbF90ICp2YnA7CisJCQlzdHJ1Y3QgY29tcGF0X3ZwdWRydl9idWZmZXJfdCBidWYzMjsKKworCQkJZW5jX3ByKExPR19BTEwsCisJCQkJIlsrXVZESV9JT0NUTF9BTExPQ0FURV9QSFlTSUNBTF9NRU1PUlkzMlxuIik7CisJCQltZW1zZXQoJmJ1ZjMyLCAwLCBzaXplb2Yoc3RydWN0IGNvbXBhdF92cHVkcnZfYnVmZmVyX3QpKTsKKwkJCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmc192cHVfc2VtKTsKKwkJCWlmIChyZXQgPT0gMCkgeworCQkJCXZicCA9IGt6YWxsb2Moc2l6ZW9mKCp2YnApLCBHRlBfS0VSTkVMKTsKKwkJCQlpZiAoIXZicCkgeworCQkJCQl1cCgmc192cHVfc2VtKTsKKwkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJfQorCisJCQkJcmV0ID0gY29weV9mcm9tX3VzZXIoJmJ1ZjMyLAorCQkJCQkoc3RydWN0IGNvbXBhdF92cHVkcnZfYnVmZmVyX3QgKilhcmcsCisJCQkJCXNpemVvZihzdHJ1Y3QgY29tcGF0X3ZwdWRydl9idWZmZXJfdCkpOworCQkJCWlmIChyZXQpIHsKKwkJCQkJa2ZyZWUodmJwKTsKKwkJCQkJdXAoJnNfdnB1X3NlbSk7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKworCQkJCXZicC0+dmIuc2l6ZSA9IGJ1ZjMyLnNpemU7CisJCQkJdmJwLT52Yi5jYWNoZWQgPSBidWYzMi5jYWNoZWQ7CisJCQkJdmJwLT52Yi5waHlzX2FkZHIgPQorCQkJCQkodWxvbmcpYnVmMzIucGh5c19hZGRyOworCQkJCXZicC0+dmIudmlydF9hZGRyID0KKwkJCQkJKHVsb25nKWJ1ZjMyLnZpcnRfYWRkcjsKKwkJCQlyZXQgPSB2cHVfYWxsb2NfZG1hX2J1ZmZlcigmKHZicC0+dmIpKTsKKwkJCQlpZiAocmV0ID09IC0xKSB7CisJCQkJCXJldCA9IC1FTk9NRU07CisJCQkJCWtmcmVlKHZicCk7CisJCQkJCXVwKCZzX3ZwdV9zZW0pOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlidWYzMi5zaXplID0gdmJwLT52Yi5zaXplOworCQkJCWJ1ZjMyLnBoeXNfYWRkciA9CisJCQkJCShjb21wYXRfdWxvbmdfdCl2YnAtPnZiLnBoeXNfYWRkcjsKKwkJCQlidWYzMi52aXJ0X2FkZHIgPQorCQkJCQkoY29tcGF0X3Vsb25nX3QpdmJwLT52Yi52aXJ0X2FkZHI7CisKKwkJCQlyZXQgPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLAorCQkJCQkmYnVmMzIsCisJCQkJCXNpemVvZihzdHJ1Y3QgY29tcGF0X3ZwdWRydl9idWZmZXJfdCkpOworCQkJCWlmIChyZXQpIHsKKwkJCQkJa2ZyZWUodmJwKTsKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQkJdXAoJnNfdnB1X3NlbSk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCXZicC0+ZmlscCA9IGZpbHA7CisJCQkJc3Bpbl9sb2NrKCZzX3ZwdV9sb2NrKTsKKwkJCQlsaXN0X2FkZCgmdmJwLT5saXN0LCAmc192YnBfaGVhZCk7CisJCQkJc3Bpbl91bmxvY2soJnNfdnB1X2xvY2spOworCisJCQkJdXAoJnNfdnB1X3NlbSk7CisJCQl9CisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkiWy1dVkRJX0lPQ1RMX0FMTE9DQVRFX1BIWVNJQ0FMX01FTU9SWTMyXG4iKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorCWNhc2UgVkRJX0lPQ1RMX0ZSRUVfUEhZU0lDQUxNRU1PUlk6CisJCXsKKwkJCXN0cnVjdCB2cHVkcnZfYnVmZmVyX3Bvb2xfdCAqdmJwLCAqbjsKKwkJCXN0cnVjdCB2cHVkcnZfYnVmZmVyX3QgdmI7CisKKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbK11WRElfSU9DVExfRlJFRV9QSFlTSUNBTE1FTU9SWVxuIik7CisJCQlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJnNfdnB1X3NlbSk7CisJCQlpZiAocmV0ID09IDApIHsKKwkJCQlyZXQgPSBjb3B5X2Zyb21fdXNlcigmdmIsCisJCQkJCShzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90ICopYXJnLAorCQkJCQlzaXplb2Yoc3RydWN0IHZwdWRydl9idWZmZXJfdCkpOworCQkJCWlmIChyZXQpIHsKKwkJCQkJdXAoJnNfdnB1X3NlbSk7CisJCQkJCXJldHVybiAtRUFDQ0VTOworCQkJCX0KKworCQkJCWlmICh2Yi5waHlzX2FkZHIpCisJCQkJCXZwdV9mcmVlX2RtYV9idWZmZXIoJnZiKTsKKworCQkJCXNwaW5fbG9jaygmc192cHVfbG9jayk7CisJCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZicCwgbiwKKwkJCQkJJnNfdmJwX2hlYWQsIGxpc3QpIHsKKwkJCQkJaWYgKHZicC0+dmIucGh5c19hZGRyID09IHZiLnBoeXNfYWRkcikgeworCQkJCQkJbGlzdF9kZWwoJnZicC0+bGlzdCk7CisJCQkJCQlrZnJlZSh2YnApOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJc3Bpbl91bmxvY2soJnNfdnB1X2xvY2spOworCisJCQkJdXAoJnNfdnB1X3NlbSk7CisJCQl9CisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkiWy1dVkRJX0lPQ1RMX0ZSRUVfUEhZU0lDQUxNRU1PUllcbiIpOworCQl9CisJCWJyZWFrOworI2lmZGVmIENPTkZJR19DT01QQVQKKwljYXNlIFZESV9JT0NUTF9GUkVFX1BIWVNJQ0FMTUVNT1JZMzI6CisJCXsKKwkJCXN0cnVjdCB2cHVkcnZfYnVmZmVyX3Bvb2xfdCAqdmJwLCAqbjsKKwkJCXN0cnVjdCBjb21wYXRfdnB1ZHJ2X2J1ZmZlcl90IGJ1ZjMyOworCQkJc3RydWN0IHZwdWRydl9idWZmZXJfdCB2YjsKKworCQkJZW5jX3ByKExPR19BTEwsCisJCQkJIlsrXVZESV9JT0NUTF9GUkVFX1BIWVNJQ0FMTUVNT1JZMzJcbiIpOworCQkJcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZzX3ZwdV9zZW0pOworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJcmV0ID0gY29weV9mcm9tX3VzZXIoJmJ1ZjMyLAorCQkJCQkoc3RydWN0IGNvbXBhdF92cHVkcnZfYnVmZmVyX3QgKilhcmcsCisJCQkJCXNpemVvZihzdHJ1Y3QgY29tcGF0X3ZwdWRydl9idWZmZXJfdCkpOworCQkJCWlmIChyZXQpIHsKKwkJCQkJdXAoJnNfdnB1X3NlbSk7CisJCQkJCXJldHVybiAtRUFDQ0VTOworCQkJCX0KKworCQkJCXZiLnNpemUgPSBidWYzMi5zaXplOworCQkJCXZiLnBoeXNfYWRkciA9CisJCQkJCSh1bG9uZylidWYzMi5waHlzX2FkZHI7CisJCQkJdmIudmlydF9hZGRyID0KKwkJCQkJKHVsb25nKWJ1ZjMyLnZpcnRfYWRkcjsKKworCQkJCWlmICh2Yi5waHlzX2FkZHIpCisJCQkJCXZwdV9mcmVlX2RtYV9idWZmZXIoJnZiKTsKKworCQkJCXNwaW5fbG9jaygmc192cHVfbG9jayk7CisJCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZicCwgbiwKKwkJCQkJJnNfdmJwX2hlYWQsIGxpc3QpIHsKKwkJCQkJaWYgKChjb21wYXRfdWxvbmdfdCl2YnAtPnZiLmJhc2UKKwkJCQkJCT09IGJ1ZjMyLmJhc2UpIHsKKwkJCQkJCWxpc3RfZGVsKCZ2YnAtPmxpc3QpOworCQkJCQkJa2ZyZWUodmJwKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCXNwaW5fdW5sb2NrKCZzX3ZwdV9sb2NrKTsKKwkJCQl1cCgmc192cHVfc2VtKTsKKwkJCX0KKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbLV1WRElfSU9DVExfRlJFRV9QSFlTSUNBTE1FTU9SWTMyXG4iKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorCWNhc2UgVkRJX0lPQ1RMX0dFVF9SRVNFUlZFRF9WSURFT19NRU1PUllfSU5GTzoKKwkJeworCQkJZW5jX3ByKExPR19BTEwsCisJCQkJIlsrXVZESV9JT0NUTF9HRVRfUkVTRVJWRURfVklERU9fTUVNT1JZX0lORk9cbiIpOworCQkJaWYgKHNfdmlkZW9fbWVtb3J5LnBoeXNfYWRkciAhPSAwKSB7CisJCQkJcmV0ID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkJJnNfdmlkZW9fbWVtb3J5LAorCQkJCQlzaXplb2Yoc3RydWN0IHZwdWRydl9idWZmZXJfdCkpOworCQkJCWlmIChyZXQgIT0gMCkKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCX0gZWxzZSB7CisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCX0KKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbLV1WRElfSU9DVExfR0VUX1JFU0VSVkVEX1ZJREVPX01FTU9SWV9JTkZPXG4iKTsKKwkJfQorCQlicmVhazsKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJY2FzZSBWRElfSU9DVExfR0VUX1JFU0VSVkVEX1ZJREVPX01FTU9SWV9JTkZPMzI6CisJCXsKKwkJCXN0cnVjdCBjb21wYXRfdnB1ZHJ2X2J1ZmZlcl90IGJ1ZjMyOworCisJCQltZW1zZXQoJmJ1ZjMyLCAwLCBzaXplb2Yoc3RydWN0IGNvbXBhdF92cHVkcnZfYnVmZmVyX3QpKTsKKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbK11WRElfSU9DVExfR0VUX1JFU0VSVkVEX1ZJREVPX01FTU9SWV9JTkZPMzJcbiIpOworCisJCQlidWYzMi5zaXplID0gc192aWRlb19tZW1vcnkuc2l6ZTsKKwkJCWJ1ZjMyLnBoeXNfYWRkciA9CisJCQkJKGNvbXBhdF91bG9uZ190KXNfdmlkZW9fbWVtb3J5LnBoeXNfYWRkcjsKKwkJCWJ1ZjMyLnZpcnRfYWRkciA9CisJCQkJKGNvbXBhdF91bG9uZ190KXNfdmlkZW9fbWVtb3J5LnZpcnRfYWRkcjsKKwkJCWlmIChzX3ZpZGVvX21lbW9yeS5waHlzX2FkZHIgIT0gMCkgeworCQkJCXJldCA9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJCSZidWYzMiwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBjb21wYXRfdnB1ZHJ2X2J1ZmZlcl90KSk7CisJCQkJaWYgKHJldCAhPSAwKQorCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJfSBlbHNlIHsKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJfQorCQkJZW5jX3ByKExPR19BTEwsCisJCQkJIlstXVZESV9JT0NUTF9HRVRfUkVTRVJWRURfVklERU9fTUVNT1JZX0lORk8zMlxuIik7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIFZESV9JT0NUTF9XQUlUX0lOVEVSUlVQVDoKKwkJeworCQkJc3RydWN0IHZwdWRydl9pbnRyX2luZm9fdCBpbmZvOworCisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkiWytdVkRJX0lPQ1RMX1dBSVRfSU5URVJSVVBUXG4iKTsKKwkJCXJldCA9IGNvcHlfZnJvbV91c2VyKCZpbmZvLAorCQkJCShzdHJ1Y3QgdnB1ZHJ2X2ludHJfaW5mb190ICopYXJnLAorCQkJCXNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2ludHJfaW5mb190KSk7CisJCQlpZiAocmV0ICE9IDApCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KAorCQkJCXNfaW50ZXJydXB0X3dhaXRfcSwKKwkJCQlzX2ludGVycnVwdF9mbGFnICE9IDAsCisJCQkJbXNlY3NfdG9famlmZmllcyhpbmZvLnRpbWVvdXQpKTsKKwkJCWlmICghcmV0KSB7CisJCQkJcmV0ID0gLUVUSU1FOworCQkJCWJyZWFrOworCQkJfQorCQkJZW5jX3ByKExPR19JTkZPLAorCQkJICAgICAgICJzX2ludGVycnVwdF9mbGFnKCVkKSwgcmVhc29uKDB4JTA4bHgpXG4iLAorCQkJICAgICAgIHNfaW50ZXJydXB0X2ZsYWcsIGRldi0+aW50ZXJydXB0X3JlYXNvbik7CisJCQlpZiAoZGV2LT5pbnRlcnJ1cHRfcmVhc29uICYgKDEgPDwgVzRfSU5UX0VOQ19QSUMpKSB7CisJCQkJdTMyIHN0YXJ0LCBlbmQsIHNpemUsIGNvcmUgPSAwOworCisJCQkJc3RhcnQgPSBSZWFkVnB1UmVnaXN0ZXIoVzRfQlNfUkRfUFRSKTsKKwkJCQllbmQgPSBSZWFkVnB1UmVnaXN0ZXIoVzRfQlNfV1JfUFRSKTsKKwkJCQlzaXplID0gUmVhZFZwdVJlZ2lzdGVyKFc0X1JFVF9FTkNfUElDX0JZVEUpOworCQkJCWVuY19wcihMT0dfSU5GTywgImZsdXNoIG91dHB1dCBidWZmZXIsICIpOworCQkJCWVuY19wcihMT0dfSU5GTywKKwkJCQkJInN0YXJ0OjB4JXgsIGVuZDoweCV4LCBzaXplOjB4JXhcbiIsCisJCQkJCXN0YXJ0LCBlbmQsIHNpemUpOworCQkJCWlmIChlbmQgLSBzdGFydCA+IHNpemUgJiYgZW5kID4gc3RhcnQpCisJCQkJCXNpemUgPSBlbmQgLSBzdGFydDsKKwkJCQlpZiAoc2l6ZSA+IDApCisJCQkJCWNhY2hlX2ZsdXNoKHN0YXJ0LCBzaXplKTsKKwkJCX0KKworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCisJCQllbmNfcHIoTE9HX0lORk8sCisJCQkJInNfaW50ZXJydXB0X2ZsYWcoJWQpLCByZWFzb24oMHglMDhseClcbiIsCisJCQkJc19pbnRlcnJ1cHRfZmxhZywgZGV2LT5pbnRlcnJ1cHRfcmVhc29uKTsKKworCQkJaW5mby5pbnRyX3JlYXNvbiA9IGRldi0+aW50ZXJydXB0X3JlYXNvbjsKKwkJCXNfaW50ZXJydXB0X2ZsYWcgPSAwOworCQkJZGV2LT5pbnRlcnJ1cHRfcmVhc29uID0gMDsKKwkJCXJldCA9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJJmluZm8sIHNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2ludHJfaW5mb190KSk7CisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkiWy1dVkRJX0lPQ1RMX1dBSVRfSU5URVJSVVBUXG4iKTsKKwkJCWlmIChyZXQgIT0gMCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlicmVhazsKKwljYXNlIFZESV9JT0NUTF9TRVRfQ0xPQ0tfR0FURToKKwkJeworCQkJdTMyIGNsa2dhdGU7CisKKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbK11WRElfSU9DVExfU0VUX0NMT0NLX0dBVEVcbiIpOworCQkJaWYgKGdldF91c2VyKGNsa2dhdGUsICh1MzIgX191c2VyICopIGFyZykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisjaWZkZWYgVlBVX1NVUFBPUlRfQ0xPQ0tfQ09OVFJPTAorCQkJdnB1X2Nsa19jb25maWcoY2xrZ2F0ZSk7CisjZW5kaWYKKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbLV1WRElfSU9DVExfU0VUX0NMT0NLX0dBVEVcbiIpOworCQl9CisJCWJyZWFrOworCWNhc2UgVkRJX0lPQ1RMX0dFVF9JTlNUQU5DRV9QT09MOgorCQl7CisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkiWytdVkRJX0lPQ1RMX0dFVF9JTlNUQU5DRV9QT09MXG4iKTsKKwkJCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmc192cHVfc2VtKTsKKwkJCWlmIChyZXQgIT0gMCkKKwkJCQlicmVhazsKKworCQkJaWYgKHNfaW5zdGFuY2VfcG9vbC5iYXNlICE9IDApIHsKKwkJCQlyZXQgPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLAorCQkJCQkmc19pbnN0YW5jZV9wb29sLAorCQkJCQlzaXplb2Yoc3RydWN0IHZwdWRydl9idWZmZXJfdCkpOworCQkJCXJldCA9IChyZXQgIT0gMCkgPyAtRUZBVUxUIDogMDsKKwkJCX0gZWxzZSB7CisJCQkJcmV0ID0gY29weV9mcm9tX3VzZXIoJnNfaW5zdGFuY2VfcG9vbCwKKwkJCQkJKHN0cnVjdCB2cHVkcnZfYnVmZmVyX3QgKilhcmcsCisJCQkJCXNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90KSk7CisJCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJCXNfaW5zdGFuY2VfcG9vbC5zaXplID0KKwkJCQkJCVBBR0VfQUxJR04oCisJCQkJCQlzX2luc3RhbmNlX3Bvb2wuc2l6ZSk7CisJCQkJCXNfaW5zdGFuY2VfcG9vbC5iYXNlID0KKwkJCQkJCSh1bG9uZyl2bWFsbG9jKAorCQkJCQkJc19pbnN0YW5jZV9wb29sLnNpemUpOworCQkJCQlzX2luc3RhbmNlX3Bvb2wucGh5c19hZGRyID0KKwkJCQkJCXNfaW5zdGFuY2VfcG9vbC5iYXNlOworCQkJCQlpZiAoc19pbnN0YW5jZV9wb29sLmJhc2UgPT0gMCkgeworCQkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQkJCXVwKCZzX3ZwdV9zZW0pOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJLypjbGVhcmluZyBtZW1vcnkqLworCQkJCQltZW1zZXQoKHZvaWQgKilzX2luc3RhbmNlX3Bvb2wuYmFzZSwKKwkJCQkJCTAsIHNfaW5zdGFuY2VfcG9vbC5zaXplKTsKKwkJCQkJcmV0ID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkJCSZzX2luc3RhbmNlX3Bvb2wsCisJCQkJCQlzaXplb2Yoc3RydWN0IHZwdWRydl9idWZmZXJfdCkpOworCQkJCQlpZiAocmV0ICE9IDApCisJCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCX0gZWxzZQorCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJfQorCQkJdXAoJnNfdnB1X3NlbSk7CisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkiWy1dVkRJX0lPQ1RMX0dFVF9JTlNUQU5DRV9QT09MXG4iKTsKKwkJfQorCQlicmVhazsKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJY2FzZSBWRElfSU9DVExfR0VUX0lOU1RBTkNFX1BPT0wzMjoKKwkJeworCQkJc3RydWN0IGNvbXBhdF92cHVkcnZfYnVmZmVyX3QgYnVmMzI7CisKKwkJCW1lbXNldCgmYnVmMzIsIDAsIHNpemVvZihzdHJ1Y3QgY29tcGF0X3ZwdWRydl9idWZmZXJfdCkpOworCQkJZW5jX3ByKExPR19BTEwsCisJCQkJIlsrXVZESV9JT0NUTF9HRVRfSU5TVEFOQ0VfUE9PTDMyXG4iKTsKKwkJCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmc192cHVfc2VtKTsKKwkJCWlmIChyZXQgIT0gMCkKKwkJCQlicmVhazsKKwkJCWlmIChzX2luc3RhbmNlX3Bvb2wuYmFzZSAhPSAwKSB7CisJCQkJYnVmMzIuc2l6ZSA9IHNfaW5zdGFuY2VfcG9vbC5zaXplOworCQkJCWJ1ZjMyLnBoeXNfYWRkciA9CisJCQkJCShjb21wYXRfdWxvbmdfdCkKKwkJCQkJc19pbnN0YW5jZV9wb29sLnBoeXNfYWRkcjsKKwkJCQlidWYzMi52aXJ0X2FkZHIgPQorCQkJCQkoY29tcGF0X3Vsb25nX3QpCisJCQkJCXNfaW5zdGFuY2VfcG9vbC52aXJ0X2FkZHI7CisJCQkJcmV0ID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkJJmJ1ZjMyLAorCQkJCQlzaXplb2Yoc3RydWN0IGNvbXBhdF92cHVkcnZfYnVmZmVyX3QpKTsKKwkJCQlyZXQgPSAocmV0ICE9IDApID8gLUVGQVVMVCA6IDA7CisJCQl9IGVsc2UgeworCQkJCXJldCA9IGNvcHlfZnJvbV91c2VyKCZidWYzMiwKKwkJCQkJKHN0cnVjdCBjb21wYXRfdnB1ZHJ2X2J1ZmZlcl90ICopYXJnLAorCQkJCQlzaXplb2Yoc3RydWN0IGNvbXBhdF92cHVkcnZfYnVmZmVyX3QpKTsKKwkJCQlpZiAocmV0ID09IDApIHsKKwkJCQkJc19pbnN0YW5jZV9wb29sLnNpemUgPSBidWYzMi5zaXplOworCQkJCQlzX2luc3RhbmNlX3Bvb2wuc2l6ZSA9CisJCQkJCQlQQUdFX0FMSUdOKAorCQkJCQkJc19pbnN0YW5jZV9wb29sLnNpemUpOworCQkJCQlzX2luc3RhbmNlX3Bvb2wuYmFzZSA9CisJCQkJCQkodWxvbmcpdm1hbGxvYygKKwkJCQkJCXNfaW5zdGFuY2VfcG9vbC5zaXplKTsKKwkJCQkJc19pbnN0YW5jZV9wb29sLnBoeXNfYWRkciA9CisJCQkJCQlzX2luc3RhbmNlX3Bvb2wuYmFzZTsKKwkJCQkJYnVmMzIuc2l6ZSA9CisJCQkJCQlzX2luc3RhbmNlX3Bvb2wuc2l6ZTsKKwkJCQkJYnVmMzIucGh5c19hZGRyID0KKwkJCQkJCShjb21wYXRfdWxvbmdfdCkKKwkJCQkJCXNfaW5zdGFuY2VfcG9vbC5waHlzX2FkZHI7CisJCQkJCWJ1ZjMyLmJhc2UgPQorCQkJCQkJKGNvbXBhdF91bG9uZ190KQorCQkJCQkJc19pbnN0YW5jZV9wb29sLmJhc2U7CisJCQkJCWJ1ZjMyLnZpcnRfYWRkciA9CisJCQkJCQkoY29tcGF0X3Vsb25nX3QpCisJCQkJCQlzX2luc3RhbmNlX3Bvb2wudmlydF9hZGRyOworCQkJCQlpZiAoc19pbnN0YW5jZV9wb29sLmJhc2UgPT0gMCkgeworCQkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQkJCXVwKCZzX3ZwdV9zZW0pOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJLypjbGVhcmluZyBtZW1vcnkqLworCQkJCQltZW1zZXQoKHZvaWQgKilzX2luc3RhbmNlX3Bvb2wuYmFzZSwKKwkJCQkJCTB4MCwgc19pbnN0YW5jZV9wb29sLnNpemUpOworCQkJCQlyZXQgPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLAorCQkJCQkJJmJ1ZjMyLAorCQkJCQkJc2l6ZW9mKAorCQkJCQkJc3RydWN0IGNvbXBhdF92cHVkcnZfYnVmZmVyX3QpKTsKKwkJCQkJaWYgKHJldCAhPSAwKQorCQkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQl9IGVsc2UKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCX0KKwkJCXVwKCZzX3ZwdV9zZW0pOworCQkJZW5jX3ByKExPR19BTEwsCisJCQkJIlstXVZESV9JT0NUTF9HRVRfSU5TVEFOQ0VfUE9PTDMyXG4iKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorCWNhc2UgVkRJX0lPQ1RMX0dFVF9DT01NT05fTUVNT1JZOgorCQl7CisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkiWytdVkRJX0lPQ1RMX0dFVF9DT01NT05fTUVNT1JZXG4iKTsKKwkJCWlmIChzX2NvbW1vbl9tZW1vcnkucGh5c19hZGRyICE9IDApIHsKKwkJCQlyZXQgPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLAorCQkJCQkmc19jb21tb25fbWVtb3J5LAorCQkJCQlzaXplb2Yoc3RydWN0IHZwdWRydl9idWZmZXJfdCkpOworCQkJCWlmIChyZXQgIT0gMCkKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCX0gZWxzZSB7CisJCQkJcmV0ID0gY29weV9mcm9tX3VzZXIoJnNfY29tbW9uX21lbW9yeSwKKwkJCQkJKHN0cnVjdCB2cHVkcnZfYnVmZmVyX3QgKilhcmcsCisJCQkJCXNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90KSk7CisJCQkJaWYgKHJldCAhPSAwKSB7CisJCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAodnB1X2FsbG9jX2RtYV9idWZmZXIoCisJCQkJCSZzX2NvbW1vbl9tZW1vcnkpICE9IC0xKSB7CisJCQkJCXJldCA9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJCQkmc19jb21tb25fbWVtb3J5LAorCQkJCQkJc2l6ZW9mKHN0cnVjdCB2cHVkcnZfYnVmZmVyX3QpKTsKKwkJCQkJaWYgKHJldCAhPSAwKQorCQkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQl9IGVsc2UKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCX0KKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbLV1WRElfSU9DVExfR0VUX0NPTU1PTl9NRU1PUllcbiIpOworCQl9CisJCWJyZWFrOworI2lmZGVmIENPTkZJR19DT01QQVQKKwljYXNlIFZESV9JT0NUTF9HRVRfQ09NTU9OX01FTU9SWTMyOgorCQl7CisJCQlzdHJ1Y3QgY29tcGF0X3ZwdWRydl9idWZmZXJfdCBidWYzMjsKKworCQkJbWVtc2V0KCZidWYzMiwgMCwgc2l6ZW9mKHN0cnVjdCBjb21wYXRfdnB1ZHJ2X2J1ZmZlcl90KSk7CisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkiWytdVkRJX0lPQ1RMX0dFVF9DT01NT05fTUVNT1JZMzJcbiIpOworCisJCQlidWYzMi5zaXplID0gc19jb21tb25fbWVtb3J5LnNpemU7CisJCQlidWYzMi5waHlzX2FkZHIgPQorCQkJCShjb21wYXRfdWxvbmdfdCkKKwkJCQlzX2NvbW1vbl9tZW1vcnkucGh5c19hZGRyOworCQkJYnVmMzIudmlydF9hZGRyID0KKwkJCQkoY29tcGF0X3Vsb25nX3QpCisJCQkJc19jb21tb25fbWVtb3J5LnZpcnRfYWRkcjsKKwkJCWlmIChzX2NvbW1vbl9tZW1vcnkucGh5c19hZGRyICE9IDApIHsKKwkJCQlyZXQgPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLAorCQkJCQkmYnVmMzIsCisJCQkJCXNpemVvZihzdHJ1Y3QgY29tcGF0X3ZwdWRydl9idWZmZXJfdCkpOworCQkJCWlmIChyZXQgIT0gMCkKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCX0gZWxzZSB7CisJCQkJcmV0ID0gY29weV9mcm9tX3VzZXIoJmJ1ZjMyLAorCQkJCQkoc3RydWN0IGNvbXBhdF92cHVkcnZfYnVmZmVyX3QgKilhcmcsCisJCQkJCXNpemVvZihzdHJ1Y3QgY29tcGF0X3ZwdWRydl9idWZmZXJfdCkpOworCQkJCWlmIChyZXQgIT0gMCkgeworCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJc19jb21tb25fbWVtb3J5LnNpemUgPSBidWYzMi5zaXplOworCQkJCWlmICh2cHVfYWxsb2NfZG1hX2J1ZmZlcigKKwkJCQkJJnNfY29tbW9uX21lbW9yeSkgIT0gLTEpIHsKKwkJCQkJYnVmMzIuc2l6ZSA9CisJCQkJCQlzX2NvbW1vbl9tZW1vcnkuc2l6ZTsKKwkJCQkJYnVmMzIucGh5c19hZGRyID0KKwkJCQkJCShjb21wYXRfdWxvbmdfdCkKKwkJCQkJCXNfY29tbW9uX21lbW9yeS5waHlzX2FkZHI7CisJCQkJCWJ1ZjMyLnZpcnRfYWRkciA9CisJCQkJCQkoY29tcGF0X3Vsb25nX3QpCisJCQkJCQlzX2NvbW1vbl9tZW1vcnkudmlydF9hZGRyOworCQkJCQlyZXQgPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLAorCQkJCQkJJmJ1ZjMyLAorCQkJCQkJc2l6ZW9mKAorCQkJCQkJc3RydWN0IGNvbXBhdF92cHVkcnZfYnVmZmVyX3QpKTsKKwkJCQkJaWYgKHJldCAhPSAwKQorCQkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQl9IGVsc2UKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCX0KKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbLV1WRElfSU9DVExfR0VUX0NPTU1PTl9NRU1PUlkzMlxuIik7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIFZESV9JT0NUTF9PUEVOX0lOU1RBTkNFOgorCQl7CisJCQlzdHJ1Y3QgdnB1ZHJ2X2luc3RfaW5mb190IGluc3RfaW5mbzsKKwkJCXN0cnVjdCB2cHVkcnZfaW5zdGFuYWNlX2xpc3RfdCAqdmlsLCAqbjsKKworCQkJdmlsID0ga3phbGxvYyhzaXplb2YoKnZpbCksIEdGUF9LRVJORUwpOworCQkJaWYgKCF2aWwpCisJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmaW5zdF9pbmZvLAorCQkJCShzdHJ1Y3QgdnB1ZHJ2X2luc3RfaW5mb190ICopYXJnLAorCQkJCXNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2luc3RfaW5mb190KSkpCisJCQl7CisJCQkJa2ZyZWUodmlsKTsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKworCQkJdmlsLT5pbnN0X2lkeCA9IGluc3RfaW5mby5pbnN0X2lkeDsKKwkJCXZpbC0+Y29yZV9pZHggPSBpbnN0X2luZm8uY29yZV9pZHg7CisJCQl2aWwtPmZpbHAgPSBmaWxwOworCisJCQlzcGluX2xvY2soJnNfdnB1X2xvY2spOworCQkJbGlzdF9hZGQoJnZpbC0+bGlzdCwgJnNfaW5zdF9saXN0X2hlYWQpOworCisJCQkvKiBjb3VudGluZyB0aGUgY3VycmVudCBvcGVuIGluc3RhbmNlIG51bWJlciAqLworCQkJaW5zdF9pbmZvLmluc3Rfb3Blbl9jb3VudCA9IDA7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodmlsLCBuLAorCQkJCSZzX2luc3RfbGlzdF9oZWFkLCBsaXN0KSB7CisJCQkJaWYgKHZpbC0+Y29yZV9pZHggPT0gaW5zdF9pbmZvLmNvcmVfaWR4KQorCQkJCQlpbnN0X2luZm8uaW5zdF9vcGVuX2NvdW50Kys7CisJCQl9CisKKwkJCSAvKiBmbGFnIGp1c3QgZm9yIHRoYXQgdnB1IGlzIGluIG9wZW5lZCBvciBjbG9zZWQgKi8KKwkJCXNfdnB1X29wZW5fcmVmX2NvdW50Kys7CisJCQlzcGluX3VubG9jaygmc192cHVfbG9jayk7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLAorCQkJCSZpbnN0X2luZm8sCisJCQkJc2l6ZW9mKHN0cnVjdCB2cHVkcnZfaW5zdF9pbmZvX3QpKSkgeworCQkJCWtmcmVlKHZpbCk7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisKKwkJCWVuY19wcihMT0dfREVCVUcsCisJCQkJIlZESV9JT0NUTF9PUEVOX0lOU1RBTkNFICIpOworCQkJZW5jX3ByKExPR19ERUJVRywKKwkJCQkiY29yZV9pZHg9JWQsIGluc3RfaWR4PSVkLCAiLAorCQkJCSh1MzIpaW5zdF9pbmZvLmNvcmVfaWR4LAorCQkJCSh1MzIpaW5zdF9pbmZvLmluc3RfaWR4KTsKKwkJCWVuY19wcihMT0dfREVCVUcsCisJCQkJInNfdnB1X29wZW5fcmVmX2NvdW50PSVkLCBpbnN0X29wZW5fY291bnQ9JWRcbiIsCisJCQkJc192cHVfb3Blbl9yZWZfY291bnQsCisJCQkJaW5zdF9pbmZvLmluc3Rfb3Blbl9jb3VudCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBWRElfSU9DVExfQ0xPU0VfSU5TVEFOQ0U6CisJCXsKKwkJCXN0cnVjdCB2cHVkcnZfaW5zdF9pbmZvX3QgaW5zdF9pbmZvOworCQkJc3RydWN0IHZwdWRydl9pbnN0YW5hY2VfbGlzdF90ICp2aWwsICpuOworCisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkiWytdVkRJX0lPQ1RMX0NMT1NFX0lOU1RBTkNFXG4iKTsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmaW5zdF9pbmZvLAorCQkJCShzdHJ1Y3QgdnB1ZHJ2X2luc3RfaW5mb190ICopYXJnLAorCQkJCXNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2luc3RfaW5mb190KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXNwaW5fbG9jaygmc192cHVfbG9jayk7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodmlsLCBuLAorCQkJCSZzX2luc3RfbGlzdF9oZWFkLCBsaXN0KSB7CisJCQkJaWYgKHZpbC0+aW5zdF9pZHggPT0gaW5zdF9pbmZvLmluc3RfaWR4ICYmCisJCQkJCXZpbC0+Y29yZV9pZHggPT0gaW5zdF9pbmZvLmNvcmVfaWR4KSB7CisJCQkJCWxpc3RfZGVsKCZ2aWwtPmxpc3QpOworCQkJCQlrZnJlZSh2aWwpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCS8qIGNvdW50aW5nIHRoZSBjdXJyZW50IG9wZW4gaW5zdGFuY2UgbnVtYmVyICovCisJCQlpbnN0X2luZm8uaW5zdF9vcGVuX2NvdW50ID0gMDsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2aWwsIG4sCisJCQkJJnNfaW5zdF9saXN0X2hlYWQsIGxpc3QpIHsKKwkJCQlpZiAodmlsLT5jb3JlX2lkeCA9PSBpbnN0X2luZm8uY29yZV9pZHgpCisJCQkJCWluc3RfaW5mby5pbnN0X29wZW5fY291bnQrKzsKKwkJCX0KKworCQkJLyogZmxhZyBqdXN0IGZvciB0aGF0IHZwdSBpcyBpbiBvcGVuZWQgb3IgY2xvc2VkICovCisJCQlzX3ZwdV9vcGVuX3JlZl9jb3VudC0tOworCQkJc3Bpbl91bmxvY2soJnNfdnB1X2xvY2spOworCisJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkmaW5zdF9pbmZvLAorCQkJCXNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2luc3RfaW5mb190KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWVuY19wcihMT0dfREVCVUcsCisJCQkJIlZESV9JT0NUTF9DTE9TRV9JTlNUQU5DRSAiKTsKKwkJCWVuY19wcihMT0dfREVCVUcsCisJCQkJImNvcmVfaWR4PSVkLCBpbnN0X2lkeD0lZCwgIiwKKwkJCQkodTMyKWluc3RfaW5mby5jb3JlX2lkeCwKKwkJCQkodTMyKWluc3RfaW5mby5pbnN0X2lkeCk7CisJCQllbmNfcHIoTE9HX0RFQlVHLAorCQkJCSJzX3ZwdV9vcGVuX3JlZl9jb3VudD0lZCwgaW5zdF9vcGVuX2NvdW50PSVkXG4iLAorCQkJCXNfdnB1X29wZW5fcmVmX2NvdW50LAorCQkJCWluc3RfaW5mby5pbnN0X29wZW5fY291bnQpOworCQl9CisJCWJyZWFrOworCWNhc2UgVkRJX0lPQ1RMX0dFVF9JTlNUQU5DRV9OVU06CisJCXsKKwkJCXN0cnVjdCB2cHVkcnZfaW5zdF9pbmZvX3QgaW5zdF9pbmZvOworCQkJc3RydWN0IHZwdWRydl9pbnN0YW5hY2VfbGlzdF90ICp2aWwsICpuOworCisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkiWytdVkRJX0lPQ1RMX0dFVF9JTlNUQU5DRV9OVU1cbiIpOworCisJCQlyZXQgPSBjb3B5X2Zyb21fdXNlcigmaW5zdF9pbmZvLAorCQkJCShzdHJ1Y3QgdnB1ZHJ2X2luc3RfaW5mb190ICopYXJnLAorCQkJCXNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2luc3RfaW5mb190KSk7CisJCQlpZiAocmV0ICE9IDApCisJCQkJYnJlYWs7CisKKwkJCWluc3RfaW5mby5pbnN0X29wZW5fY291bnQgPSAwOworCisJCQlzcGluX2xvY2soJnNfdnB1X2xvY2spOworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZpbCwgbiwKKwkJCQkmc19pbnN0X2xpc3RfaGVhZCwgbGlzdCkgeworCQkJCWlmICh2aWwtPmNvcmVfaWR4ID09IGluc3RfaW5mby5jb3JlX2lkeCkKKwkJCQkJaW5zdF9pbmZvLmluc3Rfb3Blbl9jb3VudCsrOworCQkJfQorCQkJc3Bpbl91bmxvY2soJnNfdnB1X2xvY2spOworCisJCQlyZXQgPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLAorCQkJCSZpbnN0X2luZm8sCisJCQkJc2l6ZW9mKHN0cnVjdCB2cHVkcnZfaW5zdF9pbmZvX3QpKTsKKworCQkJZW5jX3ByKExPR19ERUJVRywKKwkJCQkiVkRJX0lPQ1RMX0dFVF9JTlNUQU5DRV9OVU0gIik7CisJCQllbmNfcHIoTE9HX0RFQlVHLAorCQkJCSJjb3JlX2lkeD0lZCwgaW5zdF9pZHg9JWQsIG9wZW5fY291bnQ9JWRcbiIsCisJCQkJKHUzMilpbnN0X2luZm8uY29yZV9pZHgsCisJCQkJKHUzMilpbnN0X2luZm8uaW5zdF9pZHgsCisJCQkJaW5zdF9pbmZvLmluc3Rfb3Blbl9jb3VudCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBWRElfSU9DVExfUkVTRVQ6CisJCXsKKwkJCXZwdV9od19yZXNldCgpOworCQl9CisJCWJyZWFrOworCWNhc2UgVkRJX0lPQ1RMX0dFVF9SRUdJU1RFUl9JTkZPOgorCQl7CisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkiWytdVkRJX0lPQ1RMX0dFVF9SRUdJU1RFUl9JTkZPXG4iKTsKKwkJCXJldCA9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJJnNfdnB1X3JlZ2lzdGVyLAorCQkJCXNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90KSk7CisJCQlpZiAocmV0ICE9IDApCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbLV1WRElfSU9DVExfR0VUX1JFR0lTVEVSX0lORk8gIik7CisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkic192cHVfcmVnaXN0ZXIucGh5c19hZGRyPTB4JWx4LCAiLAorCQkJCXNfdnB1X3JlZ2lzdGVyLnBoeXNfYWRkcik7CisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkic192cHVfcmVnaXN0ZXIudmlydF9hZGRyPTB4JWx4LCAiLAorCQkJCXNfdnB1X3JlZ2lzdGVyLnZpcnRfYWRkcik7CisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkic192cHVfcmVnaXN0ZXIuc2l6ZT0weCV4XG4iLAorCQkJCXNfdnB1X3JlZ2lzdGVyLnNpemUpOworCQl9CisJCWJyZWFrOworI2lmZGVmIENPTkZJR19DT01QQVQKKwljYXNlIFZESV9JT0NUTF9HRVRfUkVHSVNURVJfSU5GTzMyOgorCQl7CisJCQlzdHJ1Y3QgY29tcGF0X3ZwdWRydl9idWZmZXJfdCBidWYzMjsKKworCQkJbWVtc2V0KCZidWYzMiwgMCwgc2l6ZW9mKHN0cnVjdCBjb21wYXRfdnB1ZHJ2X2J1ZmZlcl90KSk7CisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkiWytdVkRJX0lPQ1RMX0dFVF9SRUdJU1RFUl9JTkZPMzJcbiIpOworCisJCQlidWYzMi5zaXplID0gc192cHVfcmVnaXN0ZXIuc2l6ZTsKKwkJCWJ1ZjMyLnBoeXNfYWRkciA9CisJCQkJKGNvbXBhdF91bG9uZ190KQorCQkJCXNfdnB1X3JlZ2lzdGVyLnBoeXNfYWRkcjsKKwkJCWJ1ZjMyLnZpcnRfYWRkciA9CisJCQkJKGNvbXBhdF91bG9uZ190KQorCQkJCXNfdnB1X3JlZ2lzdGVyLnZpcnRfYWRkcjsKKwkJCXJldCA9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJJmJ1ZjMyLAorCQkJCXNpemVvZigKKwkJCQlzdHJ1Y3QgY29tcGF0X3ZwdWRydl9idWZmZXJfdCkpOworCQkJaWYgKHJldCAhPSAwKQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkiWy1dVkRJX0lPQ1RMX0dFVF9SRUdJU1RFUl9JTkZPMzIgIik7CisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkic192cHVfcmVnaXN0ZXIucGh5c19hZGRyPTB4JWx4LCAiLAorCQkJCXNfdnB1X3JlZ2lzdGVyLnBoeXNfYWRkcik7CisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkic192cHVfcmVnaXN0ZXIudmlydF9hZGRyPTB4JWx4LCAiLAorCQkJCXNfdnB1X3JlZ2lzdGVyLnZpcnRfYWRkcik7CisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkic192cHVfcmVnaXN0ZXIuc2l6ZT0weCV4XG4iLAorCQkJCXNfdnB1X3JlZ2lzdGVyLnNpemUpOworCQl9CisJCWJyZWFrOworCWNhc2UgVkRJX0lPQ1RMX0ZMVVNIX0JVRkZFUjMyOgorCQl7CisJCQlzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl9wb29sX3QgKnBvb2wsICpuOworCQkJc3RydWN0IGNvbXBhdF92cHVkcnZfYnVmZmVyX3QgYnVmMzI7CisJCQlzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90IHZiOworCQkJYm9vbCBmaW5kID0gZmFsc2U7CisJCQl1MzIgY2FjaGVkID0gMDsKKworCQkJZW5jX3ByKExPR19BTEwsCisJCQkJIlsrXVZESV9JT0NUTF9GTFVTSF9CVUZGRVIzMlxuIik7CisKKwkJCXJldCA9IGNvcHlfZnJvbV91c2VyKCZidWYzMiwKKwkJCQkoc3RydWN0IGNvbXBhdF92cHVkcnZfYnVmZmVyX3QgKilhcmcsCisJCQkJc2l6ZW9mKHN0cnVjdCBjb21wYXRfdnB1ZHJ2X2J1ZmZlcl90KSk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJc3Bpbl9sb2NrKCZzX3ZwdV9sb2NrKTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb29sLCBuLAorCQkJCSZzX3ZicF9oZWFkLCBsaXN0KSB7CisJCQkJaWYgKHBvb2wtPmZpbHAgPT0gZmlscCkgeworCQkJCQl2YiA9IHBvb2wtPnZiOworCQkJCQlpZiAoKChjb21wYXRfdWxvbmdfdCl2Yi5waHlzX2FkZHIKKwkJCQkJCT09IGJ1ZjMyLnBoeXNfYWRkcikKKwkJCQkJCSYmIGZpbmQgPT0gZmFsc2UpeworCQkJCQkJY2FjaGVkID0gdmIuY2FjaGVkOworCQkJCQkJZmluZCA9IHRydWU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlzcGluX3VubG9jaygmc192cHVfbG9jayk7CisJCQlpZiAoZmluZCAmJiBjYWNoZWQpCisJCQkJZG1hX2ZsdXNoKAorCQkJCQkodTMyKWJ1ZjMyLnBoeXNfYWRkciwKKwkJCQkJKHUzMilidWYzMi5zaXplKTsKKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbLV1WRElfSU9DVExfRkxVU0hfQlVGRkVSMzJcbiIpOworCQl9CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBWRElfSU9DVExfRkxVU0hfQlVGRkVSOgorCQl7CisJCQlzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl9wb29sX3QgKnBvb2wsICpuOworCQkJc3RydWN0IHZwdWRydl9idWZmZXJfdCB2YiwgYnVmOworCQkJYm9vbCBmaW5kID0gZmFsc2U7CisJCQl1MzIgY2FjaGVkID0gMDsKKworCQkJZW5jX3ByKExPR19BTEwsCisJCQkJIlsrXVZESV9JT0NUTF9GTFVTSF9CVUZGRVJcbiIpOworCisJCQlyZXQgPSBjb3B5X2Zyb21fdXNlcigmYnVmLAorCQkJCShzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90ICopYXJnLAorCQkJCXNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90KSk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJc3Bpbl9sb2NrKCZzX3ZwdV9sb2NrKTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb29sLCBuLAorCQkJCSZzX3ZicF9oZWFkLCBsaXN0KSB7CisJCQkJaWYgKHBvb2wtPmZpbHAgPT0gZmlscCkgeworCQkJCQl2YiA9IHBvb2wtPnZiOworCQkJCQlpZiAoKHZiLnBoeXNfYWRkcgorCQkJCQkJPT0gYnVmLnBoeXNfYWRkcikKKwkJCQkJCSYmIGZpbmQgPT0gZmFsc2UpeworCQkJCQkJY2FjaGVkID0gdmIuY2FjaGVkOworCQkJCQkJZmluZCA9IHRydWU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlzcGluX3VubG9jaygmc192cHVfbG9jayk7CisJCQlpZiAoZmluZCAmJiBjYWNoZWQpCisJCQkJZG1hX2ZsdXNoKAorCQkJCQkodTMyKWJ1Zi5waHlzX2FkZHIsCisJCQkJCSh1MzIpYnVmLnNpemUpOworCQkJZW5jX3ByKExPR19BTEwsCisJCQkJIlstXVZESV9JT0NUTF9GTFVTSF9CVUZGRVJcbiIpOworCQl9CisJCWJyZWFrOworCWNhc2UgVkRJX0lPQ1RMX0NPTkZJR19ETUE6CisJCXsKKwkJCXN0cnVjdCB2cHVfZG1hX2J1Zl9pbmZvX3QgZG1hX2luZm87CisKKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbK11WRElfSU9DVExfQ09ORklHX0RNQVxuIik7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJmRtYV9pbmZvLAorCQkJCShzdHJ1Y3QgdnB1X2RtYV9idWZfaW5mb190ICopYXJnLAorCQkJCXNpemVvZihzdHJ1Y3QgdnB1X2RtYV9idWZfaW5mb190KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmICh2cHVfc3JjX2FkZHJfY29uZmlnKGRtYV9pbmZvKSkgeworCQkJCWVuY19wcihMT0dfRVJST1IsCisJCQkJCSJzcmMgYWRkciBjb25maWcgZXJyb3JcbiIpOworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkiWy1dVkRJX0lPQ1RMX0NPTkZJR19ETUEgJWQsICVkLCAlZFxuIiwKKwkJCQlkbWFfaW5mby5mZFswXSwKKwkJCQlkbWFfaW5mby5mZFsxXSwKKwkJCQlkbWFfaW5mby5mZFsyXSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBWRElfSU9DVExfVU5NQVBfRE1BOgorCQl7CisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkiWytdVkRJX0lPQ1RMX1VOTUFQX0RNQVxuIik7CisKKwkJCXZwdV9kbWFfYnVmZmVyX3VubWFwKCZkbWFfY2ZnWzBdKTsKKwkJCWlmIChkbWFfY2ZnWzFdLnBhZGRyICE9IDApIHsKKwkJCQl2cHVfZG1hX2J1ZmZlcl91bm1hcCgmZG1hX2NmZ1sxXSk7CisJCQl9CisJCQlpZiAoZG1hX2NmZ1syXS5wYWRkciAhPSAwKSB7CisJCQkJdnB1X2RtYV9idWZmZXJfdW5tYXAoJmRtYV9jZmdbMl0pOworCQkJfQorCQkJZW5jX3ByKExPR19BTEwsCisJCQkJIlstXVZESV9JT0NUTF9VTk1BUF9ETUFcbiIpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXsKKwkJCWVuY19wcihMT0dfRVJST1IsCisJCQkJIk5vIHN1Y2ggSU9DVEwsIGNtZCBpcyAweCV4XG4iLCBjbWQpOworCQkJcmV0ID0gLUVGQVVMVDsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIENPTkZJR19DT01QQVQKK3N0YXRpYyBsb25nIHZwdV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHUzMiBjbWQsIHVsb25nIGFyZykKK3sKKwlsb25nIHJldDsKKworCWFyZyA9ICh1bG9uZyljb21wYXRfcHRyKGFyZyk7CisJcmV0ID0gdnB1X2lvY3RsKGZpbHAsIGNtZCwgYXJnKTsKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKK3N0YXRpYyBzc2l6ZV90IHZwdV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwKKwljb25zdCBjaGFyICpidWYsCisJc2l6ZV90IGxlbiwKKwlsb2ZmX3QgKnBwb3MpCit7CisJZW5jX3ByKExPR19JTkZPLCAidnB1X3dyaXRlIGxlbj0lZFxuIiwgKGludClsZW4pOworCisJaWYgKCFidWYpIHsKKwkJZW5jX3ByKExPR19FUlJPUiwgInZwdV93cml0ZSBidWYgPSBOVUxMIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKGxlbiA9PSBzaXplb2Yoc3RydWN0IHZwdV9iaXRfZmlybXdhcmVfaW5mb190KSkJeworCQlzdHJ1Y3QgdnB1X2JpdF9maXJtd2FyZV9pbmZvX3QgKmJpdF9maXJtd2FyZV9pbmZvOworCisJCWJpdF9maXJtd2FyZV9pbmZvID0KKwkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2cHVfYml0X2Zpcm13YXJlX2luZm9fdCksCisJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKCFiaXRfZmlybXdhcmVfaW5mbykgeworCQkJZW5jX3ByKExPR19FUlJPUiwKKwkJCQkidnB1X3dyaXRlIGJpdF9maXJtd2FyZV9pbmZvIGFsbG9jYXRpb24gZXJyb3JcbiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlpZiAoY29weV9mcm9tX3VzZXIoYml0X2Zpcm13YXJlX2luZm8sIGJ1ZiwgbGVuKSkgeworCQkJZW5jX3ByKExPR19FUlJPUiwKKwkJCQkidnB1X3dyaXRlIGNvcHlfZnJvbV91c2VyIGVycm9yIGZvciBiaXRfZmlybXdhcmVfaW5mb1xuIik7CisJCQlrZnJlZShiaXRfZmlybXdhcmVfaW5mbyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCWlmIChiaXRfZmlybXdhcmVfaW5mby0+c2l6ZSA9PQorCQkJc2l6ZW9mKHN0cnVjdCB2cHVfYml0X2Zpcm13YXJlX2luZm9fdCkpIHsKKwkJCWVuY19wcihMT0dfSU5GTywKKwkJCQkidnB1X3dyaXRlIHNldCBiaXRfZmlybXdhcmVfaW5mbyBjb3JlSWR4PTB4JXgsICIsCisJCQkJYml0X2Zpcm13YXJlX2luZm8tPmNvcmVfaWR4KTsKKwkJCWVuY19wcihMT0dfSU5GTywKKwkJCQkicmVnX2Jhc2Vfb2Zmc2V0PTB4JXggc2l6ZT0weCV4LCBiaXRfY29kZVswXT0weCV4XG4iLAorCQkJCWJpdF9maXJtd2FyZV9pbmZvLT5yZWdfYmFzZV9vZmZzZXQsCisJCQkJYml0X2Zpcm13YXJlX2luZm8tPnNpemUsCisJCQkJYml0X2Zpcm13YXJlX2luZm8tPmJpdF9jb2RlWzBdKTsKKworCQkJaWYgKGJpdF9maXJtd2FyZV9pbmZvLT5jb3JlX2lkeAorCQkJCT4gTUFYX05VTV9WUFVfQ09SRSkgeworCQkJCWVuY19wcihMT0dfRVJST1IsCisJCQkJCSJ2cHVfd3JpdGUgY29yZUlkeFslZF0gaXMgIiwKKwkJCQkJYml0X2Zpcm13YXJlX2luZm8tPmNvcmVfaWR4KTsKKwkJCQllbmNfcHIoTE9HX0VSUk9SLAorCQkJCQkiZXhjZWVkZWQgdGhhbiBNQVhfTlVNX1ZQVV9DT1JFWyVkXVxuIiwKKwkJCQkJTUFYX05VTV9WUFVfQ09SRSk7CisJCQkJa2ZyZWUoYml0X2Zpcm13YXJlX2luZm8pOworCQkJCXJldHVybiAtRU5PREVWOworCQkJfQorCQkJaWYgKGJpdF9maXJtd2FyZV9pbmZvLT5jb3JlX2lkeCA+PSBNQVhfTlVNX1ZQVV9DT1JFKQorCQkJeworCQkJCWVuY19wcihMT0dfRVJST1IsImJpdF9maXJtd2FyZV9pbmZvLT5jb3JlX2lkeCAlZCBpcyBpbnZhbGlkIVxuIiwgYml0X2Zpcm13YXJlX2luZm8tPmNvcmVfaWR4KTsKKwkJCQlrZnJlZShiaXRfZmlybXdhcmVfaW5mbyk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJbWVtY3B5KCh2b2lkICopJnNfYml0X2Zpcm13YXJlX2luZm8KKwkJCQlbYml0X2Zpcm13YXJlX2luZm8tPmNvcmVfaWR4XSwKKwkJCQliaXRfZmlybXdhcmVfaW5mbywKKwkJCQlzaXplb2Yoc3RydWN0IHZwdV9iaXRfZmlybXdhcmVfaW5mb190KSk7CisJCQlrZnJlZShiaXRfZmlybXdhcmVfaW5mbyk7CisJCQlyZXR1cm4gbGVuOworCQl9CisJCWtmcmVlKGJpdF9maXJtd2FyZV9pbmZvKTsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgczMyIHZwdV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXMzMiByZXQgPSAwOworCXVsb25nIGZsYWdzOworCisJZW5jX3ByKExPR19ERUJVRywgInZwdV9yZWxlYXNlLCBjYWxsaW5nIHByb2Nlc3M6ICVkOiVzXG4iLCBjdXJyZW50LT5waWQsIGN1cnJlbnQtPmNvbW0pOworCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmc192cHVfc2VtKTsKKwllbmNfcHIoTE9HX0RFQlVHLCAidnB1X3JlbGVhc2UsIHJldCA9ICVkXG4iLCByZXQpOworCisJc3Bpbl9sb2NrKCZzX3ZwdV9sb2NrKTsKKwlpZiAoc192cHVfZHJ2X2NvbnRleHQub3Blbl9jb3VudCA8PSAwKSB7CisJCWVuY19wcihMT0dfREVCVUcsICJ2cHVfcmVsZWFzZSwgb3Blbl9jb3VudD0lZCwgYWxyZWFkeSByZWxlYXNlZCBvciBldmVuIG5vdCBpbml0ZWRcbiIsCisJCQlzX3ZwdV9kcnZfY29udGV4dC5vcGVuX2NvdW50KTsKKwkJc192cHVfZHJ2X2NvbnRleHQub3Blbl9jb3VudCA9IDA7CisJCXNwaW5fdW5sb2NrKCZzX3ZwdV9sb2NrKTsKKwkJZ290byBleGl0X3JlbGVhc2U7CisJfQorCXNwaW5fdW5sb2NrKCZzX3ZwdV9sb2NrKTsKKworCWlmIChyZXQgPT0gMCkgeworCQl2cHVfZnJlZV9idWZmZXJzKGZpbHApOworCQl2cHVfZnJlZV9pbnN0YW5jZXMoZmlscCk7CisKKwkJc3Bpbl9sb2NrKCZzX3ZwdV9sb2NrKTsKKwkJZW5jX3ByKExPR19ERUJVRywgInZwdV9yZWxlYXNlLCBkZWNyZWFzZSBvcGVuX2NvdW50IGZyb20gJWRcbiIsCisJCQkJc192cHVfZHJ2X2NvbnRleHQub3Blbl9jb3VudCk7CisKKwkJc192cHVfZHJ2X2NvbnRleHQub3Blbl9jb3VudC0tOworCQlzcGluX3VubG9jaygmc192cHVfbG9jayk7CisJCWlmIChzX3ZwdV9kcnZfY29udGV4dC5vcGVuX2NvdW50ID09IDApIHsKKwkJCWVuY19wcihMT0dfREVCVUcsCisJCQkgICAgICAgInZwdV9yZWxlYXNlOiBzX2ludGVycnVwdF9mbGFnKCVkKSwgcmVhc29uKDB4JTA4bHgpXG4iLAorCQkJICAgICAgIHNfaW50ZXJydXB0X2ZsYWcsIHNfdnB1X2Rydl9jb250ZXh0LmludGVycnVwdF9yZWFzb24pOworCQkJc192cHVfZHJ2X2NvbnRleHQuaW50ZXJydXB0X3JlYXNvbiA9IDA7CisJCQlzX2ludGVycnVwdF9mbGFnID0gMDsKKwkJCWlmIChzX2luc3RhbmNlX3Bvb2wuYmFzZSkgeworCQkJCWVuY19wcihMT0dfREVCVUcsICJmcmVlIGluc3RhbmNlIHBvb2xcbiIpOworCQkJCXZmcmVlKChjb25zdCB2b2lkICopc19pbnN0YW5jZV9wb29sLmJhc2UpOworCQkJCXNfaW5zdGFuY2VfcG9vbC5iYXNlID0gMDsKKwkJCX0KKwkJCWlmIChzX2NvbW1vbl9tZW1vcnkucGh5c19hZGRyKSB7CisJCQkJZW5jX3ByKExPR19JTkZPLCAidnB1X3JlbGVhc2UsIHNfY29tbW9uX21lbW9yeSAweCVseFxuIixzX2NvbW1vbl9tZW1vcnkucGh5c19hZGRyKTsKKwkJCQl2cHVfZnJlZV9kbWFfYnVmZmVyKCZzX2NvbW1vbl9tZW1vcnkpOworCQkJCXNfY29tbW9uX21lbW9yeS5waHlzX2FkZHIgPSAwOworCQkJfQorCisJCQlpZiAoc192aWRlb19tZW1vcnkucGh5c19hZGRyICYmICF1c2VfcmVzZXJ2ZSkgeworCQkJCWVuY19wcihMT0dfREVCVUcsICJ2cHVfcmVsZWFzZSwgc192aWRlb19tZW1vcnkgMHglbHhcbiIsc192aWRlb19tZW1vcnkucGh5c19hZGRyKTsKKwkJCQljb2RlY19tbV9mcmVlX2Zvcl9kbWEoCisJCQkJCVZQVV9ERVZfTkFNRSwKKwkJCQkJKHUzMilzX3ZpZGVvX21lbW9yeS5waHlzX2FkZHIpOworCQkJCXZtZW1fZXhpdCgmc192bWVtKTsKKwkJCQltZW1zZXQoJnNfdmlkZW9fbWVtb3J5LAorCQkJCQkwLCBzaXplb2Yoc3RydWN0IHZwdWRydl9idWZmZXJfdCkpOworCQkJCW1lbXNldCgmc192bWVtLAorCQkJCQkwLCBzaXplb2Yoc3RydWN0IHZpZGVvX21tX3QpKTsKKwkJCX0KKworCQkJaWYgKChzX3ZwdV9pcnEgPj0gMCkgJiYgKHNfdnB1X2lycV9yZXF1ZXN0ZWQgPT0gdHJ1ZSkpIHsKKwkJCQlmcmVlX2lycShzX3ZwdV9pcnEsICZzX3ZwdV9kcnZfY29udGV4dCk7CisJCQkJc192cHVfaXJxX3JlcXVlc3RlZCA9IGZhbHNlOworCQkJfQorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNfdnB1X2xvY2ssIGZsYWdzKTsKKworCQkJaWYgKGdldF9jcHVfdHlwZSgpID49IE1FU09OX0NQVV9NQUpPUl9JRF9TQzIpIHsKKwkJCQkvL3ZwdV9jbGtfY29uZmlnKDApOworCQkJCXB3cl9jdHJsX3BzY2lfc21jKFBESURfU0MyX0RPU19XQVZFLCBQV1JfT0ZGKTsKKwkJCX0gZWxzZSB7CisJCQkJV1JJVEVfQU9SRUcoQU9fUlRJX0dFTl9QV1JfSVNPMCwKKwkJCQkJUkVBRF9BT1JFRyhBT19SVElfR0VOX1BXUl9JU08wKSB8CisJCQkJCShnZXRfY3B1X3R5cGUoKSA9PSBNRVNPTl9DUFVfTUFKT1JfSURfU00xCisJCQkJCT8gMHg4IDogKDB4Mzw8MTIpKSk7CisJCQl9CisKKwkJCXVkZWxheSgxMCk7CisKKwkJCVdSSVRFX1ZSRUcoRE9TX01FTV9QRF9XQVZFNDIwTCwgMHhmZmZmZmZmZik7CisjaWZuZGVmIFZQVV9TVVBQT1JUX0NMT0NLX0NPTlRST0wKKwkJCXZwdV9jbGtfY29uZmlnKDApOworI2VuZGlmCisKKwkJCWlmIChnZXRfY3B1X3R5cGUoKSA+PSBNRVNPTl9DUFVfTUFKT1JfSURfU0MyKSB7CisKKwkJCX0gZWxzZSB7CisJCQkJV1JJVEVfQU9SRUcoQU9fUlRJX0dFTl9QV1JfU0xFRVAwLAorCQkJCQlSRUFEX0FPUkVHKEFPX1JUSV9HRU5fUFdSX1NMRUVQMCkgfAorCQkJCQkoZ2V0X2NwdV90eXBlKCkgPT0gTUVTT05fQ1BVX01BSk9SX0lEX1NNMQorCQkJCQk/IDB4OCA6ICgweDM8PDI0KSkpOworCQkJfQorCisJCQl1ZGVsYXkoMTApOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc192cHVfbG9jaywgZmxhZ3MpOworCQkJaWYgKGdldF9jcHVfdHlwZSgpID49IE1FU09OX0NQVV9NQUpPUl9JRF9TQzIpIHsKKwkJCX0gZWxzZQorCQkJICAgIGFtcG9ydHNfc3dpdGNoX2dhdGUoInZkZWMiLCAwKTsKKwkJfQorCX0KK2V4aXRfcmVsZWFzZToKKwl1cCgmc192cHVfc2VtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHMzMiB2cHVfZmFzeW5jKHMzMiBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIHMzMiBtb2RlKQoreworCXN0cnVjdCB2cHVfZHJ2X2NvbnRleHRfdCAqZGV2ID0KKwkJKHN0cnVjdCB2cHVfZHJ2X2NvbnRleHRfdCAqKWZpbHAtPnByaXZhdGVfZGF0YTsKKwlyZXR1cm4gZmFzeW5jX2hlbHBlcihmZCwgZmlscCwgbW9kZSwgJmRldi0+YXN5bmNfcXVldWUpOworfQorCitzdGF0aWMgczMyIHZwdV9tYXBfdG9fcmVnaXN0ZXIoc3RydWN0IGZpbGUgKmZwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtKQoreworCXVsb25nIHBmbjsKKworCXZtLT52bV9mbGFncyB8PSBWTV9JTyB8IFZNX1JFU0VSVkVEOworCXZtLT52bV9wYWdlX3Byb3QgPQorCQlwZ3Byb3Rfbm9uY2FjaGVkKHZtLT52bV9wYWdlX3Byb3QpOworCXBmbiA9IHNfdnB1X3JlZ2lzdGVyLnBoeXNfYWRkciA+PiBQQUdFX1NISUZUOworCXJldHVybiByZW1hcF9wZm5fcmFuZ2Uodm0sIHZtLT52bV9zdGFydCwgcGZuLAorCQl2bS0+dm1fZW5kIC0gdm0tPnZtX3N0YXJ0LAorCQl2bS0+dm1fcGFnZV9wcm90KSA/IC1FQUdBSU4gOiAwOworfQorCitzdGF0aWMgczMyIHZwdV9tYXBfdG9fcGh5c2ljYWxfbWVtb3J5KAorCXN0cnVjdCBmaWxlICpmcCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bSkKK3sKKwl2bS0+dm1fZmxhZ3MgfD0gVk1fSU8gfCBWTV9SRVNFUlZFRDsKKwlpZiAodm0tPnZtX3Bnb2ZmID09CisJCShzX2NvbW1vbl9tZW1vcnkucGh5c19hZGRyID4+IFBBR0VfU0hJRlQpKSB7CisJCXZtLT52bV9wYWdlX3Byb3QgPQorCQkJcGdwcm90X25vbmNhY2hlZCh2bS0+dm1fcGFnZV9wcm90KTsKKwl9IGVsc2UgeworCQlpZiAodnB1X2lzX2J1ZmZlcl9jYWNoZWQoZnAsIHZtLT52bV9wZ29mZikgPT0gMCkKKwkJCXZtLT52bV9wYWdlX3Byb3QgPQorCQkJCXBncHJvdF9ub25jYWNoZWQodm0tPnZtX3BhZ2VfcHJvdCk7CisJfQorCS8qIHZtLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfd3JpdGVjb21iaW5lKHZtLT52bV9wYWdlX3Byb3QpOyAqLworCWlmICghcGZuX3ZhbGlkKHZtLT52bV9wZ29mZikpIHsKKwkJZW5jX3ByKExPR19FUlJPUiwgIiVzIGludmFsaWQgcGZuXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJcmV0dXJuIHJlbWFwX3Bmbl9yYW5nZSh2bSwgdm0tPnZtX3N0YXJ0LCB2bS0+dm1fcGdvZmYsCisJCXZtLT52bV9lbmQgLSB2bS0+dm1fc3RhcnQsIHZtLT52bV9wYWdlX3Byb3QpID8gLUVBR0FJTiA6IDA7Cit9CisKK3N0YXRpYyBzMzIgdnB1X21hcF90b19pbnN0YW5jZV9wb29sX21lbW9yeSgKKwlzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm0pCit7CisJczMyIHJldDsKKwlsb25nIGxlbmd0aCA9IHZtLT52bV9lbmQgLSB2bS0+dm1fc3RhcnQ7CisJdWxvbmcgc3RhcnQgPSB2bS0+dm1fc3RhcnQ7CisJczggKnZtYWxsb2NfYXJlYV9wdHIgPSAoczggKilzX2luc3RhbmNlX3Bvb2wuYmFzZTsKKwl1bG9uZyBwZm47CisKKwl2bS0+dm1fZmxhZ3MgfD0gVk1fUkVTRVJWRUQ7CisKKwkvKiBsb29wIG92ZXIgYWxsIHBhZ2VzLCBtYXAgaXQgcGFnZSBpbmRpdmlkdWFsbHkgKi8KKwl3aGlsZSAobGVuZ3RoID4gMCkgeworCQlwZm4gPSB2bWFsbG9jX3RvX3Bmbih2bWFsbG9jX2FyZWFfcHRyKTsKKwkJcmV0ID0gcmVtYXBfcGZuX3JhbmdlKHZtLCBzdGFydCwgcGZuLAorCQkJUEFHRV9TSVpFLCBQQUdFX1NIQVJFRCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJc3RhcnQgKz0gUEFHRV9TSVpFOworCQl2bWFsbG9jX2FyZWFfcHRyICs9IFBBR0VfU0laRTsKKwkJbGVuZ3RoIC09IFBBR0VfU0laRTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBAYnJpZWYgbWVtb3J5IG1hcCBpbnRlcmZhY2UgZm9yIHZwdSBmaWxlIG9wZXJhdGlvbgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBlcnJvcgorICovCitzdGF0aWMgczMyIHZwdV9tbWFwKHN0cnVjdCBmaWxlICpmcCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bSkKK3sKKwkvKiBpZiAodm0tPnZtX3Bnb2ZmID09IChzX3ZwdV9yZWdpc3Rlci5waHlzX2FkZHIgPj4gUEFHRV9TSElGVCkpICovCisJaWYgKCh2bS0+dm1fZW5kIC0gdm0tPnZtX3N0YXJ0ID09IHNfdnB1X3JlZ2lzdGVyLnNpemUgKyAxKSAmJgorCQkJCQkJKHZtLT52bV9wZ29mZiA9PSAwKSkgeworCQl2bS0+dm1fcGdvZmYgPSAoc192cHVfcmVnaXN0ZXIucGh5c19hZGRyID4+IFBBR0VfU0hJRlQpOworCQlyZXR1cm4gdnB1X21hcF90b19yZWdpc3RlcihmcCwgdm0pOworCX0KKworCWlmICh2bS0+dm1fcGdvZmYgPT0gMCkKKwkJcmV0dXJuIHZwdV9tYXBfdG9faW5zdGFuY2VfcG9vbF9tZW1vcnkoZnAsIHZtKTsKKworCXJldHVybiB2cHVfbWFwX3RvX3BoeXNpY2FsX21lbW9yeShmcCwgdm0pOworfQorc3RhdGljIGludCB2cHVfZG1hX2J1ZmZlcl9tYXAoc3RydWN0IHZwdV9kbWFfY2ZnICpjZmcpCit7CisJaW50IHJldCA9IC0xOworCWludCBmZCA9IC0xOworCXN0cnVjdCBkbWFfYnVmICpkYnVmID0gTlVMTDsKKwlzdHJ1Y3QgZG1hX2J1Zl9hdHRhY2htZW50ICpkX2F0dCA9IE5VTEw7CisJc3RydWN0IHNnX3RhYmxlICpzZyA9IE5VTEw7CisJdm9pZCAqdmFkZHIgPSBOVUxMOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IE5VTEw7CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyOworCisJaWYgKGNmZyA9PSBOVUxMIHx8IChjZmctPmZkIDwgMCkgfHwgY2ZnLT5kZXYgPT0gTlVMTCkgeworCQllbmNfcHIoTE9HX0VSUk9SLCAiZXJyb3IgZG1hIHBhcmFtXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWZkID0gY2ZnLT5mZDsKKwlkZXYgPSBjZmctPmRldjsKKwlkaXIgPSBjZmctPmRpcjsKKworCWRidWYgPSBkbWFfYnVmX2dldChmZCk7CisJaWYgKGRidWYgPT0gTlVMTCkgeworCQllbmNfcHIoTE9HX0VSUk9SLCAiZmFpbGVkIHRvIGdldCBkbWEgYnVmZmVyLGZkICVkXG4iLGZkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZF9hdHQgPSBkbWFfYnVmX2F0dGFjaChkYnVmLCBkZXYpOworCWlmIChkX2F0dCA9PSBOVUxMKSB7CisJCWVuY19wcihMT0dfRVJST1IsICJmYWlsZWQgdG8gc2V0IGRtYSBhdHRhY2hcbiIpOworCQlnb3RvIGF0dGFjaF9lcnI7CisJfQorCisJc2cgPSBkbWFfYnVmX21hcF9hdHRhY2htZW50KGRfYXR0LCBkaXIpOworCWlmIChzZyA9PSBOVUxMKSB7CisJCWVuY19wcihMT0dfRVJST1IsICJmYWlsZWQgdG8gZ2V0IGRtYSBzZ1xuIik7CisJCWdvdG8gbWFwX2F0dGFjaF9lcnI7CisJfQorCWNmZy0+ZGJ1ZiA9IGRidWY7CisJY2ZnLT5hdHRhY2ggPSBkX2F0dDsKKwljZmctPnZhZGRyID0gdmFkZHI7CisJY2ZnLT5zZyA9IHNnOworCisJcmV0dXJuIDA7CisKK21hcF9hdHRhY2hfZXJyOgorCWRtYV9idWZfZGV0YWNoKGRidWYsIGRfYXR0KTsKK2F0dGFjaF9lcnI6CisJZG1hX2J1Zl9wdXQoZGJ1Zik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB2cHVfZG1hX2J1ZmZlcl91bm1hcChzdHJ1Y3QgdnB1X2RtYV9jZmcgKmNmZykKK3sKKwlpbnQgZmQgPSAtMTsKKwlzdHJ1Y3QgZG1hX2J1ZiAqZGJ1ZiA9IE5VTEw7CisJc3RydWN0IGRtYV9idWZfYXR0YWNobWVudCAqZF9hdHQgPSBOVUxMOworCXN0cnVjdCBzZ190YWJsZSAqc2cgPSBOVUxMOworCS8qdm9pZCAqdmFkZHIgPSBOVUxMOyovCisJc3RydWN0IGRldmljZSAqZGV2ID0gTlVMTDsKKwllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXI7CisKKwlpZiAoY2ZnID09IE5VTEwgfHwgKGNmZy0+ZmQgPCAwKSB8fCBjZmctPmRldiA9PSBOVUxMCisJCQl8fCBjZmctPmRidWYgPT0gTlVMTCAvKnx8IGNmZy0+dmFkZHIgPT0gTlVMTCovCisJCQl8fCBjZmctPmF0dGFjaCA9PSBOVUxMIHx8IGNmZy0+c2cgPT0gTlVMTCkgeworCQllbmNfcHIoTE9HX0VSUk9SLCAidW5tYXA6IEVycm9yIGRtYSBwYXJhbVxuIik7CisJCXJldHVybjsKKwl9CisKKwlmZCA9IGNmZy0+ZmQ7CisJZGV2ID0gY2ZnLT5kZXY7CisJZGlyID0gY2ZnLT5kaXI7CisJZGJ1ZiA9IGNmZy0+ZGJ1ZjsKKwlkX2F0dCA9IGNmZy0+YXR0YWNoOworCXNnID0gY2ZnLT5zZzsKKworCWRtYV9idWZfdW5tYXBfYXR0YWNobWVudChkX2F0dCwgc2csIGRpcik7CisJZG1hX2J1Zl9kZXRhY2goZGJ1ZiwgZF9hdHQpOworCWRtYV9idWZfcHV0KGRidWYpOworCisJZW5jX3ByKExPR19JTkZPLCAidnB1X2RtYV9idWZmZXJfdW5tYXAgZmQgJWRcbiIsZmQpOworfQorCitzdGF0aWMgaW50IHZwdV9kbWFfYnVmZmVyX2dldF9waHlzKHN0cnVjdCB2cHVfZG1hX2NmZyAqY2ZnLCB1bnNpZ25lZCBsb25nICphZGRyKQoreworCXN0cnVjdCBzZ190YWJsZSAqc2dfdGFibGU7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IHJldDsKKworCXJldCA9IHZwdV9kbWFfYnVmZmVyX21hcChjZmcpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50aygidnB1X2RtYV9idWZmZXJfbWFwIGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCWlmIChjZmctPnNnKSB7CisJCXNnX3RhYmxlID0gY2ZnLT5zZzsKKwkJcGFnZSA9IHNnX3BhZ2Uoc2dfdGFibGUtPnNnbCk7CisJCSphZGRyID0gUEZOX1BIWVMocGFnZV90b19wZm4ocGFnZSkpOworCQlyZXQgPSAwOworCX0KKwllbmNfcHIoTE9HX0lORk8sInZwdV9kbWFfYnVmZmVyX2dldF9waHlzXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1MzIgdnB1X3NyY19hZGRyX2NvbmZpZyhzdHJ1Y3QgdnB1X2RtYV9idWZfaW5mb190IGluZm8pIHsKKwl1bnNpZ25lZCBsb25nIHBoeV9hZGRyX3kgPSAwOworCXVuc2lnbmVkIGxvbmcgcGh5X2FkZHJfdSA9IDA7CisJdW5zaWduZWQgbG9uZyBwaHlfYWRkcl92ID0gMDsKKwl1bnNpZ25lZCBsb25nIFlzaXplID0gaW5mby53aWR0aCAqIGluZm8uaGVpZ2h0OworCXVuc2lnbmVkIGxvbmcgVXNpemUgPSBZc2l6ZSA+PiAyOworCXMzMiByZXQgPSAwOworCXUzMiBjb3JlID0gMDsKKworCS8veQorCWRtYV9jZmdbMF0uZGlyID0gRE1BX1RPX0RFVklDRTsKKwlkbWFfY2ZnWzBdLmZkID0gaW5mby5mZFswXTsKKwlkbWFfY2ZnWzBdLmRldiA9ICYoaGV2Y19wZGV2LT5kZXYpOworCXJldCA9IHZwdV9kbWFfYnVmZmVyX2dldF9waHlzKCZkbWFfY2ZnWzBdLCAmcGh5X2FkZHJfeSk7CisJaWYgKHJldCA8IDApIHsKKwkJZW5jX3ByKExPR19FUlJPUiwgImltcG9ydCBmZCAlZCBmYWlsZWRcbiIsIGluZm8uZmRbMF0pOworCQlyZXR1cm4gLTE7CisJfQorCisJLy91CisJaWYgKGluZm8ubnVtX3BsYW5lcyA+PTIpIHsKKwkJZG1hX2NmZ1sxXS5kaXIgPSBETUFfVE9fREVWSUNFOworCQlkbWFfY2ZnWzFdLmZkID0gaW5mby5mZFsxXTsKKwkJZG1hX2NmZ1sxXS5kZXYgPSAmKGhldmNfcGRldi0+ZGV2KTsKKwkJcmV0ID0gdnB1X2RtYV9idWZmZXJfZ2V0X3BoeXMoJmRtYV9jZmdbMV0sICZwaHlfYWRkcl91KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWVuY19wcihMT0dfRVJST1IsICJpbXBvcnQgZmQgJWQgZmFpbGVkXG4iLCBpbmZvLmZkWzFdKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCS8vdgorCWlmIChpbmZvLm51bV9wbGFuZXMgPj0zKSB7CisJCWRtYV9jZmdbMl0uZGlyID0gRE1BX1RPX0RFVklDRTsKKwkJZG1hX2NmZ1syXS5mZCA9IGluZm8uZmRbMl07CisJCWRtYV9jZmdbMl0uZGV2ID0gJihoZXZjX3BkZXYtPmRldik7CisJCXJldCA9IHZwdV9kbWFfYnVmZmVyX2dldF9waHlzKCZkbWFfY2ZnWzJdLCAmcGh5X2FkZHJfdik7CisJCWlmIChyZXQgPCAwKSB7CisJCQllbmNfcHIoTE9HX0VSUk9SLCAiaW1wb3J0IGZkICVkIGZhaWxlZFxuIiwgaW5mby5mZFsyXSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwllbmNfcHIoTE9HX0lORk8sICJ2cHVfc3JjX2FkZHJfY29uZmlnIHBoeV9hZGRyIDB4JWx4LCAweCVseCwgMHglbHhcbiIsCisJCXBoeV9hZGRyX3ksIHBoeV9hZGRyX3UsIHBoeV9hZGRyX3YpOworCisJZG1hX2NmZ1swXS5wYWRkciA9ICh2b2lkICopcGh5X2FkZHJfeTsKKwlkbWFfY2ZnWzFdLnBhZGRyID0gKHZvaWQgKilwaHlfYWRkcl91OworCWRtYV9jZmdbMl0ucGFkZHIgPSAodm9pZCAqKXBoeV9hZGRyX3Y7CisKKwllbmNfcHIoTE9HX0lORk8sICJpbmZvLm51bV9wbGFuZXMgJWQsIGluZm8uZm10ICVkXG4iLAorCQlpbmZvLm51bV9wbGFuZXMsIGluZm8uZm10KTsKKworCVdyaXRlVnB1UmVnaXN0ZXIoVzRfU1JDX0FERFJfWSwgcGh5X2FkZHJfeSk7CisJaWYgKGluZm8ubnVtX3BsYW5lcyA9PSAxKSB7CisJCWlmIChpbmZvLmZtdCA9PSBBTVZFTkNfWVVWNDIwKSB7CisJCQlXcml0ZVZwdVJlZ2lzdGVyKFc0X1NSQ19BRERSX1UsIHBoeV9hZGRyX3kgKyBZc2l6ZSk7CisJCQlXcml0ZVZwdVJlZ2lzdGVyKFc0X1NSQ19BRERSX1YsIHBoeV9hZGRyX3kgKyBZc2l6ZSArIFVzaXplKTsKKwkJfSBlbHNlIGlmIChpbmZvLmZtdCA9PSBBTVZFTkNfTlYxMiB8fCBpbmZvLmZtdCA9PSBBTVZFTkNfTlYyMSApIHsKKwkJCVdyaXRlVnB1UmVnaXN0ZXIoVzRfU1JDX0FERFJfVSwgcGh5X2FkZHJfeSArIFlzaXplKTsKKwkJCVdyaXRlVnB1UmVnaXN0ZXIoVzRfU1JDX0FERFJfViwgcGh5X2FkZHJfeSArIFlzaXplKTsKKwkJfSBlbHNlIHsKKwkJCWVuY19wcihMT0dfRVJST1IsICJub3Qgc3VwcG9ydCBmbXQgJWRcbiIsIGluZm8uZm10KTsKKwkJfQorCisJfSBlbHNlIGlmIChpbmZvLm51bV9wbGFuZXMgPT0gMikgeworCQlpZiAoaW5mby5mbXQgPT0gQU1WRU5DX05WMTIgfHwgaW5mby5mbXQgPT0gQU1WRU5DX05WMjEgKSB7CisJCQlXcml0ZVZwdVJlZ2lzdGVyKFc0X1NSQ19BRERSX1UsIHBoeV9hZGRyX3UpOworCQkJV3JpdGVWcHVSZWdpc3RlcihXNF9TUkNfQUREUl9WLCBwaHlfYWRkcl91KTsKKwkJfSBlbHNlIHsKKwkJCWVuY19wcihMT0dfRVJST1IsICJub3Qgc3VwcG9ydCBmbXQgJWRcbiIsIGluZm8uZm10KTsKKwkJfQorCisJfSBlbHNlIGlmIChpbmZvLm51bV9wbGFuZXMgPT0gMykgeworCQlpZiAoaW5mby5mbXQgPT0gQU1WRU5DX1lVVjQyMCkgeworCQkJV3JpdGVWcHVSZWdpc3RlcihXNF9TUkNfQUREUl9VLCBwaHlfYWRkcl91KTsKKwkJCVdyaXRlVnB1UmVnaXN0ZXIoVzRfU1JDX0FERFJfViwgcGh5X2FkZHJfdik7CisJCX0gZWxzZSB7CisJCQllbmNfcHIoTE9HX0VSUk9SLCAibm90IHN1cHBvcnQgZm10ICVkXG4iLCBpbmZvLmZtdCk7CisJCX0KKwl9CisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdnB1X2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSB2cHVfb3BlbiwKKwkucmVsZWFzZSA9IHZwdV9yZWxlYXNlLAorCS53cml0ZSA9IHZwdV93cml0ZSwKKwkudW5sb2NrZWRfaW9jdGwgPSB2cHVfaW9jdGwsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwgPSB2cHVfY29tcGF0X2lvY3RsLAorI2VuZGlmCisJLmZhc3luYyA9IHZwdV9mYXN5bmMsCisJLm1tYXAgPSB2cHVfbW1hcCwKK307CisKK3N0YXRpYyBzc2l6ZV90IGhldmNlbmNfc3RhdHVzX3Nob3coc3RydWN0IGNsYXNzICpjbGEsCisJCQkJICBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgNDAsICJoZXZjZW5jX3N0YXR1c19zaG93XG4iKTsKK30KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSBLRVJORUxfVkVSU0lPTig0LDEzLDEpCitzdGF0aWMgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSBoZXZjZW5jX2NsYXNzX2F0dHJzW10gPSB7CisJX19BVFRSKGVuY29kZV9zdGF0dXMsCisJU19JUlVHTyB8IFNfSVdVU1IsCisJaGV2Y2VuY19zdGF0dXNfc2hvdywKKwlOVUxMKSwKKwlfX0FUVFJfTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBjbGFzcyBoZXZjZW5jX2NsYXNzID0geworCS5uYW1lID0gVlBVX0NMQVNTX05BTUUsCisJLmNsYXNzX2F0dHJzID0gaGV2Y2VuY19jbGFzc19hdHRycywKK307CisjZWxzZSAvKiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gS0VSTkVMX1ZFUlNJT04oNCwxMywxKSAqLworCitzdGF0aWMgQ0xBU1NfQVRUUl9STyhoZXZjZW5jX3N0YXR1cyk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpoZXZjZW5jX2NsYXNzX2F0dHJzW10gPSB7CisJJmNsYXNzX2F0dHJfaGV2Y2VuY19zdGF0dXMuYXR0ciwKKwlOVUxMCit9OworCitBVFRSSUJVVEVfR1JPVVBTKGhldmNlbmNfY2xhc3MpOworCitzdGF0aWMgc3RydWN0IGNsYXNzIGhldmNlbmNfY2xhc3MgPSB7CisJLm5hbWUgPSBWUFVfQ0xBU1NfTkFNRSwKKwkuY2xhc3NfZ3JvdXBzID0gaGV2Y2VuY19jbGFzc19ncm91cHMsCit9OworI2VuZGlmIC8qIExJTlVYX1ZFUlNJT05fQ09ERSA8PSBLRVJORUxfVkVSU0lPTig0LDEzLDEpICovCisKKworczMyIGluaXRfSGV2Y0VuY19kZXZpY2Uodm9pZCkKK3sKKwlzMzIgIHIgPSAwOworCisJciA9IHJlZ2lzdGVyX2NocmRldigwLCBWUFVfREVWX05BTUUsICZ2cHVfZm9wcyk7CisJaWYgKHIgPD0gMCkgeworCQllbmNfcHIoTE9HX0VSUk9SLCAicmVnaXN0ZXIgaGV2Y2VuYyBkZXZpY2UgZXJyb3IuXG4iKTsKKwkJcmV0dXJuICByOworCX0KKwlzX3ZwdV9tYWpvciA9IHI7CisKKwlyID0gY2xhc3NfcmVnaXN0ZXIoJmhldmNlbmNfY2xhc3MpOworCWlmIChyIDwgMCkgeworCQllbmNfcHIoTE9HX0VSUk9SLCAiZXJyb3IgY3JlYXRlIGhldmNlbmMgY2xhc3MuXG4iKTsKKwkJcmV0dXJuIHI7CisJfQorCisJaGV2Y2VuY19kZXYgPSBkZXZpY2VfY3JlYXRlKCZoZXZjZW5jX2NsYXNzLCBOVUxMLAorCQkJCSAgICAgICBNS0RFVihzX3ZwdV9tYWpvciwgMCksIE5VTEwsCisJCQkJICAgICAgIFZQVV9ERVZfTkFNRSk7CisKKwlpZiAoSVNfRVJSKGhldmNlbmNfZGV2KSkgeworCQllbmNfcHIoTE9HX0VSUk9SLCAiY3JlYXRlIGhldmNlbmMgZGV2aWNlIGVycm9yLlxuIik7CisJCWNsYXNzX3VucmVnaXN0ZXIoJmhldmNlbmNfY2xhc3MpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiByOworfQorCitzMzIgdW5pbml0X0hldmNFbmNfZGV2aWNlKHZvaWQpCit7CisJaWYgKGhldmNlbmNfZGV2KQorCQlkZXZpY2VfZGVzdHJveSgmaGV2Y2VuY19jbGFzcywgTUtERVYoc192cHVfbWFqb3IsIDApKTsKKworCWNsYXNzX2Rlc3Ryb3koJmhldmNlbmNfY2xhc3MpOworCisJdW5yZWdpc3Rlcl9jaHJkZXYoc192cHVfbWFqb3IsIFZQVV9ERVZfTkFNRSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzMzIgaGV2Y19tZW1fZGV2aWNlX2luaXQoCisJc3RydWN0IHJlc2VydmVkX21lbSAqcm1lbSwgc3RydWN0IGRldmljZSAqZGV2KQoreworCXMzMiByOworCisJaWYgKCFybWVtKSB7CisJCWVuY19wcihMT0dfRVJST1IsCisJCQkiQ2FuIG5vdCBvYnRhaW4gSS9PIG1lbW9yeSwgd2lsbCBhbGxvY2F0ZSBoZXZjIGJ1ZmZlciFcbiIpOworCQlyID0gLUVGQVVMVDsKKwkJcmV0dXJuIHI7CisJfQorCisJaWYgKCghcm1lbS0+YmFzZSkgfHwKKwkJKHJtZW0tPnNpemUgPCBWUFVfSU5JVF9WSURFT19NRU1PUllfU0laRV9JTl9CWVRFKSkgeworCQllbmNfcHIoTE9HX0VSUk9SLAorCQkJIm1lbW9yeSByYW5nZSBlcnJvciwgMHglbHggLSAweCVseFxuIiwKKwkJCSAodWxvbmcpcm1lbS0+YmFzZSwgKHVsb25nKXJtZW0tPnNpemUpOworCQlyID0gLUVGQVVMVDsKKwkJcmV0dXJuIHI7CisJfQorCXIgPSAwOworCXNfdmlkZW9fbWVtb3J5LnNpemUgPSBybWVtLT5zaXplOworCXNfdmlkZW9fbWVtb3J5LnBoeXNfYWRkciA9ICh1bG9uZylybWVtLT5iYXNlOworCWVuY19wcihMT0dfREVCVUcsICJoZXZjX21lbV9kZXZpY2VfaW5pdCAlZCwgMHglbHhcbiAiLHNfdmlkZW9fbWVtb3J5LnNpemUsc192aWRlb19tZW1vcnkucGh5c19hZGRyKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgczMyIHZwdV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXMzMiBlcnIgPSAwLCBpcnEsIHJlZ19jb3VudCwgaWR4OworCXN0cnVjdCByZXNvdXJjZSByZXM7CisJc3RydWN0IGRldmljZV9ub2RlICpucCwgKmNoaWxkOworCisJZW5jX3ByKExPR19ERUJVRywgInZwdV9wcm9iZSwgY2xvY2tfYTogJWQsIGNsb2NrX2I6ICVkLCBjbG9ja19jOiAlZFxuIiwKKwkJd2F2ZV9jbG9ja2EsIHdhdmVfY2xvY2tiLCB3YXZlX2Nsb2NrYyk7CisKKwlzX3ZwdV9tYWpvciA9IDA7CisJdXNlX3Jlc2VydmUgPSBmYWxzZTsKKwlzX3ZwdV9pcnEgPSAtMTsKKwljbWFfcG9vbF9zaXplID0gMDsKKwlzX3ZwdV9pcnFfcmVxdWVzdGVkID0gZmFsc2U7CisJc192cHVfb3Blbl9yZWZfY291bnQgPSAwOworCWhldmNlbmNfZGV2ID0gTlVMTDsKKwloZXZjX3BkZXYgPSBOVUxMOworCW1lbXNldCgmc192aWRlb19tZW1vcnksIDAsIHNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90KSk7CisJbWVtc2V0KCZzX3ZwdV9yZWdpc3RlciwgMCwgc2l6ZW9mKHN0cnVjdCB2cHVkcnZfYnVmZmVyX3QpKTsKKwltZW1zZXQoJnNfdm1lbSwgMCwgc2l6ZW9mKHN0cnVjdCB2aWRlb19tbV90KSk7CisJbWVtc2V0KCZzX2JpdF9maXJtd2FyZV9pbmZvWzBdLCAwLCBzaXplb2Yoc19iaXRfZmlybXdhcmVfaW5mbykpOworCW1lbXNldCgmcmVzLCAwLCBzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CisKKwlpZHggPSBvZl9yZXNlcnZlZF9tZW1fZGV2aWNlX2luaXQoJnBkZXYtPmRldik7CisKKwlpZiAoaWR4ICE9IDApIHsKKwkJZW5jX3ByKExPR19ERUJVRywKKwkJCSJIZXZjRW5jIHJlc2VydmVkIG1lbW9yeSBjb25maWcgZmFpbC5cbiIpOworCX0gZWxzZSBpZiAoc192aWRlb19tZW1vcnkucGh5c19hZGRyKSB7CisJCXVzZV9yZXNlcnZlID0gdHJ1ZTsKKwl9CisKKwlpZiAodXNlX3Jlc2VydmUgPT0gZmFsc2UpIHsKKyNpZm5kZWYgQ09ORklHX0NNQQorCQllbmNfcHIoTE9HX0VSUk9SLAorCQkJIkhldmNFbmMgcmVzZXJ2ZWQgbWVtb3J5IGlzIGludmFpbGQsIHByb2JlIGZhaWwhXG4iKTsKKwkJZXJyID0gLUVGQVVMVDsKKwkJZ290byBFUlJPUl9QUk9WRV9ERVZJQ0U7CisjZWxzZQorCQljbWFfcG9vbF9zaXplID0KKwkJCShjb2RlY19tbV9nZXRfdG90YWxfc2l6ZSgpID4KKwkJCShWUFVfSU5JVF9WSURFT19NRU1PUllfU0laRV9JTl9CWVRFKSkgPworCQkJKFZQVV9JTklUX1ZJREVPX01FTU9SWV9TSVpFX0lOX0JZVEUpIDoKKwkJCWNvZGVjX21tX2dldF90b3RhbF9zaXplKCk7CisJCWVuY19wcihMT0dfREVCVUcsCisJCQkiSGV2Y0VuYyAtIGNtYSBtZW1vcnkgcG9vbCBzaXplOiAlZCBNQlxuIiwKKwkJCSh1MzIpY21hX3Bvb2xfc2l6ZSAvIFNaXzFNKTsKKyNlbmRpZgorCX0KKworCS8qIGdldCBpbnRlcnJ1cHQgcmVzb3VyY2UgKi8KKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAid2F2ZTQyMGxfaXJxIik7CisJaWYgKGlycSA8IDApIHsKKwkJZW5jX3ByKExPR19FUlJPUiwgImdldCBIZXZjRW5jIGlycSByZXNvdXJjZSBlcnJvclxuIik7CisJCWVyciA9IC1FTlhJTzsKKwkJZ290byBFUlJPUl9QUk9WRV9ERVZJQ0U7CisJfQorCXNfdnB1X2lycSA9IGlycTsKKwllbmNfcHIoTE9HX0RFQlVHLCAiSGV2Y0VuYyAtIHdhdmU0MjBsX2lycTogJWRcbiIsIHNfdnB1X2lycSk7CisjaWYgMAorCXJzdGMgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0KCZwZGV2LT5kZXYsICJIZXZjRW5jIik7CisJaWYgKElTX0VSUihyc3RjKSkgeworCQllbmNfcHIoTE9HX0VSUk9SLAorCQkJImdldCBIZXZjRW5jIHJzdGMgZXJyb3I6ICVseFxuIiwgUFRSX0VSUihyc3RjKSk7CisJCXJzdGMgPSBOVUxMOworCQllcnIgPSAtRU5PRU5UOworCQlnb3RvIEVSUk9SX1BST1ZFX0RFVklDRTsKKwl9CisJcmVzZXRfY29udHJvbF9hc3NlcnQocnN0Yyk7CisJc192cHVfcnN0YyA9IHJzdGM7CisKKwljbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJjbGtfSGV2Y0VuYyIpOworCWlmIChJU19FUlIoY2xrKSkgeworCQllbmNfcHIoTE9HX0VSUk9SLCAiY2Fubm90IGdldCBjbG9ja1xuIik7CisJCWNsayA9IE5VTEw7CisJCWVyciA9IC1FTk9FTlQ7CisJCWdvdG8gRVJST1JfUFJPVkVfREVWSUNFOworCX0KKwlzX3ZwdV9jbGsgPSBjbGs7CisjZW5kaWYKKworCWlmIChnZXRfY3B1X3R5cGUoKSA+PSBNRVNPTl9DUFVfTUFKT1JfSURfU0MyKSB7CisJCWlmICh2cHVfY2xrX3ByZXBhcmUoJnBkZXYtPmRldiwgJnNfdnB1X2Nsa3MpKSB7CisJCQllcnIgPSAtRU5PRU5UOworCQkJLy9nb3RvIEVSUk9SX1BST1ZFX0RFVklDRTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKyNpZm5kZWYgVlBVX1NVUFBPUlRfQ0xPQ0tfQ09OVFJPTAorCXZwdV9jbGtfY29uZmlnKDEpOworI2VuZGlmCisKKwlucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCXJlZ19jb3VudCA9IDA7CisJZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShucCwgY2hpbGQpIHsKKwkJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoY2hpbGQsIDAsICZyZXMpCisJCQl8fCAocmVnX2NvdW50ID4gMSkpIHsKKwkJCWVuY19wcihMT0dfRVJST1IsCisJCQkJIm5vIHJlZyByYW5nZXMgb3IgbW9yZSByZWcgcmFuZ2VzICVkXG4iLAorCQkJCXJlZ19jb3VudCk7CisJCQllcnIgPSAtRU5YSU87CisJCQlnb3RvIEVSUk9SX1BST1ZFX0RFVklDRTsKKwkJfQorCQkvKiBpZiBwbGF0Zm9ybSBkcml2ZXIgaXMgaW1wbGVtZW50ZWQgKi8KKwkJaWYgKHJlcy5zdGFydCAhPSAwKSB7CisJCQlzX3ZwdV9yZWdpc3Rlci5waHlzX2FkZHIgPSByZXMuc3RhcnQ7CisJCQlzX3ZwdV9yZWdpc3Rlci52aXJ0X2FkZHIgPQorCQkJCSh1bG9uZylpb3JlbWFwX25vY2FjaGUoCisJCQkJcmVzLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZyZXMpKTsKKwkJCXNfdnB1X3JlZ2lzdGVyLnNpemUgPSByZXMuZW5kIC0gcmVzLnN0YXJ0OworCQkJZW5jX3ByKExPR19ERUJVRywKKwkJCQkidnB1IGJhc2UgYWRkcmVzcyBnZXQgZnJvbSBwbGF0Zm9ybSBkcml2ZXIgIik7CisJCQllbmNfcHIoTE9HX0RFQlVHLAorCQkJCSJwaHlzaWNhbCBiYXNlIGFkZHI9MHglbHgsIHZpcnR1YWwgYmFzZT0weCVseFxuIiwKKwkJCQlzX3ZwdV9yZWdpc3Rlci5waHlzX2FkZHIsCisJCQkJc192cHVfcmVnaXN0ZXIudmlydF9hZGRyKTsKKwkJfSBlbHNlIHsKKwkJCXNfdnB1X3JlZ2lzdGVyLnBoeXNfYWRkciA9IFZQVV9SRUdfQkFTRV9BRERSOworCQkJc192cHVfcmVnaXN0ZXIudmlydF9hZGRyID0KKwkJCQkodWxvbmcpaW9yZW1hcF9ub2NhY2hlKAorCQkJCXNfdnB1X3JlZ2lzdGVyLnBoeXNfYWRkciwgVlBVX1JFR19TSVpFKTsKKwkJCXNfdnB1X3JlZ2lzdGVyLnNpemUgPSBWUFVfUkVHX1NJWkU7CisJCQllbmNfcHIoTE9HX0RFQlVHLAorCQkJCSJ2cHUgYmFzZSBhZGRyZXNzIGdldCBmcm9tIGRlZmluZWQgdmFsdWUgIik7CisJCQllbmNfcHIoTE9HX0RFQlVHLAorCQkJCSJwaHlzaWNhbCBiYXNlIGFkZHI9MHglbHgsIHZpcnR1YWwgYmFzZT0weCVseFxuIiwKKwkJCQlzX3ZwdV9yZWdpc3Rlci5waHlzX2FkZHIsCisJCQkJc192cHVfcmVnaXN0ZXIudmlydF9hZGRyKTsKKwkJfQorCQlyZWdfY291bnQrKzsKKwl9CisKKwkvKiBnZXQgdGhlIG1ham9yIG51bWJlciBvZiB0aGUgY2hhcmFjdGVyIGRldmljZSAqLworCWlmIChpbml0X0hldmNFbmNfZGV2aWNlKCkpIHsKKwkJZXJyID0gLUVCVVNZOworCQllbmNfcHIoTE9HX0VSUk9SLCAiY291bGQgbm90IGFsbG9jYXRlIG1ham9yIG51bWJlclxuIik7CisJCWdvdG8gRVJST1JfUFJPVkVfREVWSUNFOworCX0KKwllbmNfcHIoTE9HX0RFQlVHLCAiU1VDQ0VTUyBhbGxvY19jaHJkZXZfcmVnaW9uXG4iKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNfaW50ZXJydXB0X3dhaXRfcSk7CisJdGFza2xldF9pbml0KCZoZXZjX3Rhc2tsZXQsCisJCWhldmNlbmNfaXNyX3Rhc2tsZXQsCisJCSh1bG9uZykmc192cHVfZHJ2X2NvbnRleHQpOworCXNfY29tbW9uX21lbW9yeS5iYXNlID0gMDsKKwlzX2luc3RhbmNlX3Bvb2wuYmFzZSA9IDA7CisKKwlpZiAodXNlX3Jlc2VydmUgPT0gdHJ1ZSkgeworCQlpZiAodm1lbV9pbml0KCZzX3ZtZW0sIHNfdmlkZW9fbWVtb3J5LnBoeXNfYWRkciwKKwkJCXNfdmlkZW9fbWVtb3J5LnNpemUpIDwgMCkgeworCQkJZW5jX3ByKExPR19FUlJPUiwgImZhaWwgdG8gaW5pdCB2bWVtIHN5c3RlbVxuIik7CisJCQlnb3RvIEVSUk9SX1BST1ZFX0RFVklDRTsKKwkJfQorCQllbmNfcHIoTE9HX0RFQlVHLAorCQkJInN1Y2Nlc3MgdG8gcHJvYmUgdnB1IGRldmljZSB3aXRoIHZpZGVvIG1lbW9yeSAiKTsKKwkJZW5jX3ByKExPR19ERUJVRywKKwkJCSJwaHlzX2FkZHI9MHglbHgsIGJhc2UgPSAweCVseFxuIiwKKwkJCSh1bG9uZylzX3ZpZGVvX21lbW9yeS5waHlzX2FkZHIsCisJCQkodWxvbmcpc192aWRlb19tZW1vcnkuYmFzZSk7CisJfSBlbHNlCisJCWVuY19wcihMT0dfREVCVUcsCisJCQkic3VjY2VzcyB0byBwcm9iZSB2cHUgZGV2aWNlIHdpdGggdmlkZW8gbWVtb3J5IGZyb20gY21hXG4iKTsKKwloZXZjX3BkZXYgPSBwZGV2OworCXJldHVybiAwOworCitFUlJPUl9QUk9WRV9ERVZJQ0U6CisJaWYgKHNfdnB1X3JlZ2lzdGVyLnZpcnRfYWRkcikgeworCQlpb3VubWFwKCh2b2lkICopc192cHVfcmVnaXN0ZXIudmlydF9hZGRyKTsKKwkJbWVtc2V0KCZzX3ZwdV9yZWdpc3RlciwgMCwgc2l6ZW9mKHN0cnVjdCB2cHVkcnZfYnVmZmVyX3QpKTsKKwl9CisKKwlpZiAoc192aWRlb19tZW1vcnkucGh5c19hZGRyKSB7CisJCXZtZW1fZXhpdCgmc192bWVtKTsKKwkJbWVtc2V0KCZzX3ZpZGVvX21lbW9yeSwgMCwgc2l6ZW9mKHN0cnVjdCB2cHVkcnZfYnVmZmVyX3QpKTsKKwkJbWVtc2V0KCZzX3ZtZW0sIDAsIHNpemVvZihzdHJ1Y3QgdmlkZW9fbW1fdCkpOworCX0KKworI2lmbmRlZiBWUFVfU1VQUE9SVF9DTE9DS19DT05UUk9MCisJdnB1X2Nsa19jb25maWcoMCk7CisjZW5kaWYKKworCWlmIChnZXRfY3B1X3R5cGUoKSA+PSBNRVNPTl9DUFVfTUFKT1JfSURfU0MyKQorCQl2cHVfY2xrX3VucHJlcGFyZSgmcGRldi0+ZGV2LCAmc192cHVfY2xrcyk7CisKKwlpZiAoc192cHVfaXJxX3JlcXVlc3RlZCA9PSB0cnVlKSB7CisJCWlmIChzX3ZwdV9pcnEgPj0gMCkgeworCQkJZnJlZV9pcnEoc192cHVfaXJxLCAmc192cHVfZHJ2X2NvbnRleHQpOworCQkJc192cHVfaXJxID0gLTE7CisJCX0KKwkJc192cHVfaXJxX3JlcXVlc3RlZCA9IGZhbHNlOworCX0KKwl1bmluaXRfSGV2Y0VuY19kZXZpY2UoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgczMyIHZwdV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwllbmNfcHIoTE9HX0RFQlVHLCAidnB1X3JlbW92ZVxuIik7CisKKwlpZiAoc19pbnN0YW5jZV9wb29sLmJhc2UpIHsKKwkJdmZyZWUoKGNvbnN0IHZvaWQgKilzX2luc3RhbmNlX3Bvb2wuYmFzZSk7CisJCXNfaW5zdGFuY2VfcG9vbC5iYXNlID0gMDsKKwl9CisKKwlpZiAoc19jb21tb25fbWVtb3J5LnBoeXNfYWRkcikgeworCQl2cHVfZnJlZV9kbWFfYnVmZmVyKCZzX2NvbW1vbl9tZW1vcnkpOworCQlzX2NvbW1vbl9tZW1vcnkucGh5c19hZGRyID0gMDsKKwl9CisKKwlpZiAoc192aWRlb19tZW1vcnkucGh5c19hZGRyKSB7CisJCWlmICghdXNlX3Jlc2VydmUpIHsKKwkJCWNvZGVjX21tX2ZyZWVfZm9yX2RtYSgKKwkJCVZQVV9ERVZfTkFNRSwKKwkJCSh1MzIpc192aWRlb19tZW1vcnkucGh5c19hZGRyKTsKKwkJfQorCQl2bWVtX2V4aXQoJnNfdm1lbSk7CisJCW1lbXNldCgmc192aWRlb19tZW1vcnksCisJCQkwLCBzaXplb2Yoc3RydWN0IHZwdWRydl9idWZmZXJfdCkpOworCQltZW1zZXQoJnNfdm1lbSwKKwkJCTAsIHNpemVvZihzdHJ1Y3QgdmlkZW9fbW1fdCkpOworCX0KKworCWlmIChzX3ZwdV9pcnFfcmVxdWVzdGVkID09IHRydWUpIHsKKwkJaWYgKHNfdnB1X2lycSA+PSAwKSB7CisJCQlmcmVlX2lycShzX3ZwdV9pcnEsICZzX3ZwdV9kcnZfY29udGV4dCk7CisJCQlzX3ZwdV9pcnEgPSAtMTsKKwkJfQorCQlzX3ZwdV9pcnFfcmVxdWVzdGVkID0gZmFsc2U7CisJfQorCisJaWYgKHNfdnB1X3JlZ2lzdGVyLnZpcnRfYWRkcikgeworCQlpb3VubWFwKCh2b2lkICopc192cHVfcmVnaXN0ZXIudmlydF9hZGRyKTsKKwkJbWVtc2V0KCZzX3ZwdV9yZWdpc3RlciwKKwkJCTAsIHNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90KSk7CisJfQorCWhldmNfcGRldiA9IE5VTEw7CisjaWZuZGVmIFZQVV9TVVBQT1JUX0NMT0NLX0NPTlRST0wKKwl2cHVfY2xrX2NvbmZpZygwKTsKKyNlbmRpZgorCisJaWYgKGdldF9jcHVfdHlwZSgpID49IE1FU09OX0NQVV9NQUpPUl9JRF9TQzIpCisJCXZwdV9jbGtfdW5wcmVwYXJlKCZwZGV2LT5kZXYsICZzX3ZwdV9jbGtzKTsKKwl1bmluaXRfSGV2Y0VuY19kZXZpY2UoKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIHZvaWQgV2F2ZTRCaXRJc3N1ZUNvbW1hbmQodTMyIGNvcmUsIHUzMiBjbWQpCit7CisJV3JpdGVWcHVSZWdpc3RlcihXNF9WUFVfQlVTWV9TVEFUVVMsIDEpOworCVdyaXRlVnB1UmVnaXN0ZXIoVzRfQ09SRV9JTkRFWCwgMCk7CisJLyogY29yZUlkeCA9IFJlYWRWcHVSZWdpc3RlcihXNF9WUFVfQlVTWV9TVEFUVVMpOyAqLworCS8qIGNvcmVJZHggPSAwOyAqLworCS8qIFdyaXRlVnB1UmVnaXN0ZXIoVzRfSU5TVF9JTkRFWCwKKwkgKgkoaW5zdGFuY2VJbmRleCAmIDB4ZmZmZikgfCAoY29kZWNNb2RlIDw8IDE2KSk7CisJICovCisJV3JpdGVWcHVSZWdpc3RlcihXNF9DT01NQU5ELCBjbWQpOworCVdyaXRlVnB1UmVnaXN0ZXIoVzRfVlBVX0hPU1RfSU5UX1JFUSwgMSk7Cit9CisKK3N0YXRpYyBzMzIgdnB1X3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXUzMiBjb3JlOworCXVsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgSFo7IC8qIHZwdSB3YWl0IHRpbWVvdXQgdG8gMXNlYyAqLworCisJZW5jX3ByKExPR19ERUJVRywgInZwdV9zdXNwZW5kXG4iKTsKKworCXZwdV9jbGtfY29uZmlnKDEpOworCisJaWYgKHNfdnB1X29wZW5fcmVmX2NvdW50ID4gMCkgeworCQlmb3IgKGNvcmUgPSAwOyBjb3JlIDwgTUFYX05VTV9WUFVfQ09SRTsgY29yZSsrKSB7CisJCQlpZiAoc19iaXRfZmlybXdhcmVfaW5mb1tjb3JlXS5zaXplID09IDApCisJCQkJY29udGludWU7CisJCQl3aGlsZSAoUmVhZFZwdVJlZ2lzdGVyKFc0X1ZQVV9CVVNZX1NUQVRVUykpIHsKKwkJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJCQllbmNfcHIoTE9HX0VSUk9SLAorCQkJCQkJIlNMRUVQX1ZQVSBCVVNZIHRpbWVvdXQiKTsKKwkJCQkJZ290byBET05FX1NVU1BFTkQ7CisJCQkJfQorCQkJfQorCQkJV2F2ZTRCaXRJc3N1ZUNvbW1hbmQoY29yZSwgVzRfQ01EX1NMRUVQX1ZQVSk7CisKKwkJCXdoaWxlIChSZWFkVnB1UmVnaXN0ZXIoVzRfVlBVX0JVU1lfU1RBVFVTKSkgeworCQkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQkJCWVuY19wcihMT0dfRVJST1IsCisJCQkJCQkiU0xFRVBfVlBVIEJVU1kgdGltZW91dCIpOworCQkJCQlnb3RvIERPTkVfU1VTUEVORDsKKwkJCQl9CisJCQl9CisJCQlpZiAoUmVhZFZwdVJlZ2lzdGVyKFc0X1JFVF9TVUNDRVNTKSA9PSAwKSB7CisJCQkJZW5jX3ByKExPR19FUlJPUiwKKwkJCQkJIlNMRUVQX1ZQVSBmYWlsZWQgWzB4JXhdIiwKKwkJCQkJUmVhZFZwdVJlZ2lzdGVyKFc0X1JFVF9GQUlMX1JFQVNPTikpOworCQkJCWdvdG8gRE9ORV9TVVNQRU5EOworCQkJfQorCQl9CisJfQorCisJdnB1X2Nsa19jb25maWcoMCk7CisJcmV0dXJuIDA7CisKK0RPTkVfU1VTUEVORDoKKwl2cHVfY2xrX2NvbmZpZygwKTsKKwlyZXR1cm4gLUVBR0FJTjsKK30KK3N0YXRpYyBzMzIgdnB1X3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXUzMiBpOworCXUzMiBjb3JlOworCXUzMiB2YWw7CisJdWxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBIWjsgLyogdnB1IHdhaXQgdGltZW91dCB0byAxc2VjICovCisJdWxvbmcgY29kZV9iYXNlOworCXUzMiBjb2RlX3NpemU7CisJdTMyIHJlbWFwX3NpemU7CisJdTMyIHJlZ1ZhbDsKKwl1MzIgaHdPcHRpb24gPSAwOworCisJZW5jX3ByKExPR19ERUJVRywgInZwdV9yZXN1bWVcbiIpOworCisJdnB1X2Nsa19jb25maWcoMSk7CisJaWYgKHNfdnB1X29wZW5fcmVmX2NvdW50ID4gMCkgeworCQlmb3IgKGNvcmUgPSAwOyBjb3JlIDwgTUFYX05VTV9WUFVfQ09SRTsgY29yZSsrKSB7CisJCQlpZiAoc19iaXRfZmlybXdhcmVfaW5mb1tjb3JlXS5zaXplID09IDApCisJCQkJY29udGludWU7CisJCQljb2RlX2Jhc2UgPSBzX2NvbW1vbl9tZW1vcnkucGh5c19hZGRyOworCQkJLyogQUxJR04gVE8gNEtCICovCisJCQljb2RlX3NpemUgPSAoc19jb21tb25fbWVtb3J5LnNpemUgJiB+MHhmZmYpOworCQkJaWYgKGNvZGVfc2l6ZSA8IHNfYml0X2Zpcm13YXJlX2luZm9bY29yZV0uc2l6ZSAqIDIpCisJCQkJZ290byBET05FX1dBS0VVUDsKKworCQkJLyotLS0tIExPQUQgQk9PVCBDT0RFICovCisJCQlmb3IgKGkgPSAwOyBpIDwgNTEyOyBpICs9IDIpIHsKKwkJCQl2YWwgPSBzX2JpdF9maXJtd2FyZV9pbmZvW2NvcmVdLmJpdF9jb2RlW2ldOworCQkJCXZhbCB8PSAoc19iaXRfZmlybXdhcmVfaW5mb1tjb3JlXS5iaXRfY29kZVtpKzFdIDw8IDE2KTsKKwkJCQlXcml0ZVZwdShjb2RlX2Jhc2UrKGkqMiksIHZhbCk7CisJCQl9CisKKwkJCXJlZ1ZhbCA9IDA7CisJCQlXcml0ZVZwdVJlZ2lzdGVyKFc0X1BPX0NPTkYsIHJlZ1ZhbCk7CisKKwkJCS8qIFJlc2V0IEFsbCBibG9ja3MgKi8KKwkJCXJlZ1ZhbCA9IDB4N2ZmZmZmZjsKKwkJCVdyaXRlVnB1UmVnaXN0ZXIoVzRfVlBVX1JFU0VUX1JFUSwgcmVnVmFsKTsKKworCQkJLyogV2FpdGluZyByZXNldCBkb25lICovCisJCQl3aGlsZSAoUmVhZFZwdVJlZ2lzdGVyKFc0X1ZQVV9SRVNFVF9TVEFUVVMpKSB7CisJCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCisJCQkJCWdvdG8gRE9ORV9XQUtFVVA7CisJCQl9CisKKwkJCVdyaXRlVnB1UmVnaXN0ZXIoVzRfVlBVX1JFU0VUX1JFUSwgMCk7CisKKwkJCS8qIHJlbWFwIHBhZ2Ugc2l6ZSAqLworCQkJcmVtYXBfc2l6ZSA9IChjb2RlX3NpemUgPj4gMTIpICYgMHgxZmY7CisJCQlyZWdWYWwgPSAweDgwMDAwMDAwIHwgKFc0X1JFTUFQX0NPREVfSU5ERVg8PDEyKQorCQkJCXwgKDAgPDwgMTYpIHwgKDE8PDExKSB8IHJlbWFwX3NpemU7CisJCQlXcml0ZVZwdVJlZ2lzdGVyKFc0X1ZQVV9SRU1BUF9DVFJMLCByZWdWYWwpOworCQkJLyogRE8gTk9UIENIQU5HRSEgKi8KKwkJCVdyaXRlVnB1UmVnaXN0ZXIoVzRfVlBVX1JFTUFQX1ZBRERSLCAweDAwMDAwMDAwKTsKKwkJCVdyaXRlVnB1UmVnaXN0ZXIoVzRfVlBVX1JFTUFQX1BBRERSLCBjb2RlX2Jhc2UpOworCQkJV3JpdGVWcHVSZWdpc3RlcihXNF9BRERSX0NPREVfQkFTRSwgY29kZV9iYXNlKTsKKwkJCVdyaXRlVnB1UmVnaXN0ZXIoVzRfQ09ERV9TSVpFLCBjb2RlX3NpemUpOworCQkJV3JpdGVWcHVSZWdpc3RlcihXNF9DT0RFX1BBUkFNLCAwKTsKKwkJCVdyaXRlVnB1UmVnaXN0ZXIoVzRfSU5JVF9WUFVfVElNRV9PVVRfQ05ULCB0aW1lb3V0KTsKKwkJCVdyaXRlVnB1UmVnaXN0ZXIoVzRfSFdfT1BUSU9OLCBod09wdGlvbik7CisKKwkJCS8qIEludGVycnVwdCAqLworI2lmIDAKKwkJCXJlZ1ZhbCA9ICgxIDw8IFc0X0lOVF9ERUNfUElDX0hEUik7CisJCQlyZWdWYWwgfD0gKDEgPDwgVzRfSU5UX0RFQ19QSUMpOworCQkJcmVnVmFsIHw9ICgxIDw8IFc0X0lOVF9RVUVSWV9ERUMpOworCQkJcmVnVmFsIHw9ICgxIDw8IFc0X0lOVF9TTEVFUF9WUFUpOworCQkJcmVnVmFsIHw9ICgxIDw8IFc0X0lOVF9CU0JVRl9FTVBUWSk7CisjZW5kaWYKKwkJCXJlZ1ZhbCA9IDB4ZmZmZmZlZmU7CisJCQlXcml0ZVZwdVJlZ2lzdGVyKFc0X1ZQVV9WSU5UX0VOQUJMRSwgcmVnVmFsKTsKKwkJCVdhdmU0Qml0SXNzdWVDb21tYW5kKGNvcmUsIFc0X0NNRF9JTklUX1ZQVSk7CisJCQlXcml0ZVZwdVJlZ2lzdGVyKFc0X1ZQVV9SRU1BUF9DT1JFX1NUQVJULCAxKTsKKwkJCXdoaWxlIChSZWFkVnB1UmVnaXN0ZXIoVzRfVlBVX0JVU1lfU1RBVFVTKSkgeworCQkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJCQlnb3RvIERPTkVfV0FLRVVQOworCQkJfQorCisJCQlpZiAoUmVhZFZwdVJlZ2lzdGVyKFc0X1JFVF9TVUNDRVNTKSA9PSAwKSB7CisJCQkJZW5jX3ByKExPR19FUlJPUiwKKwkJCQkJIldBS0VVUF9WUFUgZmFpbGVkIFsweCV4XSIsCisJCQkJCVJlYWRWcHVSZWdpc3RlcihXNF9SRVRfRkFJTF9SRUFTT04pKTsKKwkJCQlnb3RvIERPTkVfV0FLRVVQOworCQkJfQorCQl9CisJfQorCisJaWYgKHNfdnB1X29wZW5fcmVmX2NvdW50ID09IDApCisJCXZwdV9jbGtfY29uZmlnKDApOworRE9ORV9XQUtFVVA6CisJaWYgKHNfdnB1X29wZW5fcmVmX2NvdW50ID4gMCkKKwkJdnB1X2Nsa19jb25maWcoMSk7CisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSB2cHVfc3VzcGVuZCBOVUxMCisjZGVmaW5lIHZwdV9yZXN1bWUgTlVMTAorI2VuZGlmIC8qICFDT05GSUdfUE0gKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgY25tX2hldmNlbmNfZHRfbWF0Y2hbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0gImNubSwgSGV2Y0VuYyIsCisJfSwKKwl7fSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHZwdV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBWUFVfUExBVEZPUk1fREVWSUNFX05BTUUsCisJCS5vZl9tYXRjaF90YWJsZSA9IGNubV9oZXZjZW5jX2R0X21hdGNoLAorCX0sCisJLnByb2JlID0gdnB1X3Byb2JlLAorCS5yZW1vdmUgPSB2cHVfcmVtb3ZlLAorCS5zdXNwZW5kID0gdnB1X3N1c3BlbmQsCisJLnJlc3VtZSA9IHZwdV9yZXN1bWUsCit9OworCitzdGF0aWMgczMyIF9faW5pdCB2cHVfaW5pdCh2b2lkKQoreworCXMzMiByZXM7CisKKwllbmNfcHIoTE9HX0RFQlVHLCAidnB1X2luaXRcbiIpOworCisJaWYgKChnZXRfY3B1X3R5cGUoKSAhPSBNRVNPTl9DUFVfTUFKT1JfSURfR1hNKQorCQkmJiAoZ2V0X2NwdV90eXBlKCkgIT0gTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpCisJCQkmJiAoZ2V0X2NwdV90eXBlKCkgIT0gTUVTT05fQ1BVX01BSk9SX0lEX0dYTFgpCisJCQkJJiYgKGdldF9jcHVfdHlwZSgpICE9IE1FU09OX0NQVV9NQUpPUl9JRF9HMTJCKQorCQkJCSYmIChnZXRfY3B1X3R5cGUoKSAhPSBNRVNPTl9DUFVfTUFKT1JfSURfU00xKQorCQkJCSYmIChnZXRfY3B1X3R5cGUoKSAhPSBNRVNPTl9DUFVfTUFKT1JfSURfU0MyKSkgeworCQllbmNfcHIoTE9HX0RFQlVHLAorCQkJIlRoZSBjaGlwIGlzIG5vdCBzdXBwb3J0IGhldmMgZW5jb2RlclxuIik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGdldF9jcHVfdHlwZSgpID09IE1FU09OX0NQVV9NQUpPUl9JRF9HMTJBKSB7CisJCWlmICgoUkVBRF9FRlVTRV9SRUcoRUZVU0VfTElDMikgID4+IDEyKSAmIDEpIHsKKwkJCWVuY19wcihMT0dfREVCVUcsCisJCQkJIkNoaXAgZWZ1c2UgZGlzYWJsZWQgSDI2NVxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZXMgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnZwdV9kcml2ZXIpOworCWVuY19wcihMT0dfSU5GTywKKwkJImVuZCB2cHVfaW5pdCByZXN1bHQ9MHgleFxuIiwgcmVzKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdnB1X2V4aXQodm9pZCkKK3sKKwllbmNfcHIoTE9HX0RFQlVHLCAidnB1X2V4aXRcbiIpOworCWlmICgoZ2V0X2NwdV90eXBlKCkgIT0gTUVTT05fQ1BVX01BSk9SX0lEX0dYTSkgJiYKKwkJKGdldF9jcHVfdHlwZSgpICE9IE1FU09OX0NQVV9NQUpPUl9JRF9HMTJBKSAmJgorCQkoZ2V0X2NwdV90eXBlKCkgIT0gTUVTT05fQ1BVX01BSk9SX0lEX0dYTFgpICYmCisJCShnZXRfY3B1X3R5cGUoKSAhPSBNRVNPTl9DUFVfTUFKT1JfSURfRzEyQikgJiYKKwkJKGdldF9jcHVfdHlwZSgpICE9IE1FU09OX0NQVV9NQUpPUl9JRF9TQzIpICYmCisJCShnZXRfY3B1X3R5cGUoKSAhPSBNRVNPTl9DUFVfTUFKT1JfSURfU00xKSkgeworCQllbmNfcHIoTE9HX0lORk8sCisJCQkiVGhlIGNoaXAgaXMgbm90IHN1cHBvcnQgaGV2YyBlbmNvZGVyXG4iKTsKKwkJcmV0dXJuOworCX0KKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdnB1X2RyaXZlcik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVzZXJ2ZWRfbWVtX29wcyBybWVtX2hldmNfb3BzID0geworCS5kZXZpY2VfaW5pdCA9IGhldmNfbWVtX2RldmljZV9pbml0LAorfTsKKworc3RhdGljIHMzMiBfX2luaXQgaGV2Y19tZW1fc2V0dXAoc3RydWN0IHJlc2VydmVkX21lbSAqcm1lbSkKK3sKKwlybWVtLT5vcHMgPSAmcm1lbV9oZXZjX29wczsKKwllbmNfcHIoTE9HX0RFQlVHLCAiSGV2Y0VuYyByZXNlcnZlZCBtZW0gc2V0dXAuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX3BhcmFtKHByaW50X2xldmVsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocHJpbnRfbGV2ZWwsICJcbiBwcmludF9sZXZlbFxuIik7CisKK21vZHVsZV9wYXJhbShjbG9ja19sZXZlbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNsb2NrX2xldmVsLCAiXG4gY2xvY2tfbGV2ZWxcbiIpOworCittb2R1bGVfcGFyYW0od2F2ZV9jbG9ja2EsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyh3YXZlX2Nsb2NrYSwgIlxuIHdhdmVfY2xvY2thXG4iKTsKKworbW9kdWxlX3BhcmFtKHdhdmVfY2xvY2tiLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Mod2F2ZV9jbG9ja2IsICJcbiB3YXZlX2Nsb2NrYlxuIik7CisKK21vZHVsZV9wYXJhbSh3YXZlX2Nsb2NrYywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHdhdmVfY2xvY2tjLCAiXG4gd2F2ZV9jbG9ja2NcbiIpOworCitNT0RVTEVfQVVUSE9SKCJBbWxvZ2ljIHVzaW5nIEMmTSBWUFUsIEluYy4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVlBVIGxpbnV4IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdCh2cHVfaW5pdCk7Cittb2R1bGVfZXhpdCh2cHVfZXhpdCk7CitSRVNFUlZFRE1FTV9PRl9ERUNMQVJFKGFtbG9naWMsICJhbWxvZ2ljLCBIZXZjRW5jLW1lbW9yeSIsIGhldmNfbWVtX3NldHVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfc2luay9lbmNvZGVyL2gyNjUvdnB1LmggYi9kcml2ZXJzL2ZyYW1lX3NpbmsvZW5jb2Rlci9oMjY1L3ZwdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4OTc0NGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3NpbmsvZW5jb2Rlci9oMjY1L3ZwdS5oCkBAIC0wLDAgKzEsMzU1IEBACisvKgorICogdnB1LmgKKyAqCisgKiBsaW51eCBkZXZpY2UgZHJpdmVyIGZvciBWUFUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IC0gMjAxMyAgQ0hJUFMmTUVESUEgSU5DLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBfX1ZQVV9EUlZfSF9fCisjZGVmaW5lIF9fVlBVX0RSVl9IX18KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtYnVmLmg+CisKKyNkZWZpbmUgTUFYX0lOU1RfSEFORExFX1NJWkUJICAgICAgICAoMzIqMTAyNCkKKyNkZWZpbmUgTUFYX05VTV9JTlNUQU5DRSAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1BWF9OVU1fVlBVX0NPUkUgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFc0X0NNRF9JTklUX1ZQVQkJCQkoMHgwMDAxKQorI2RlZmluZSBXNF9DTURfU0xFRVBfVlBVCQkJCSgweDA0MDApCisjZGVmaW5lIFc0X0NNRF9XQUtFVVBfVlBVCQkJKDB4MDgwMCkKKworLyogR1hNOiAyMDAwLzEwID0gMjAwTSAqLworI2RlZmluZSBIZXZjRW5jX0wwKCkgICBXUklURV9ISElfUkVHKEhISV9XQVZFNDIwTF9DTEtfQ05UTCwgXAorCQkJICgzIDw8IDI1KSB8ICgxIDw8IDE2KSB8ICgzIDw8IDkpIHwgKDEgPDwgMCkpCisvKiBHWE06IDIwMDAvOCA9IDI1ME0gKi8KKyNkZWZpbmUgSGV2Y0VuY19MMSgpICAgV1JJVEVfSEhJX1JFRyhISElfV0FWRTQyMExfQ0xLX0NOVEwsIFwKKwkJCSAoMSA8PCAyNSkgfCAoMSA8PCAxNikgfCAoMSA8PCA5KSB8ICgxIDw8IDApKQorLyogR1hNOiAyMDAwLzcgPSAyODVNICovCisjZGVmaW5lIEhldmNFbmNfTDIoKSAgIFdSSVRFX0hISV9SRUcoSEhJX1dBVkU0MjBMX0NMS19DTlRMLCBcCisJCQkgKDQgPDwgMjUpIHwgKDAgPDwgMTYpIHwgKDQgPDwgOSkgfCAoMCA8PCAwKSkKKy8qR1hNOiAyMDAwLzYgPSAzMzNNICovCisjZGVmaW5lIEhldmNFbmNfTDMoKSAgIFdSSVRFX0hISV9SRUcoSEhJX1dBVkU0MjBMX0NMS19DTlRMLCBcCisJCQkgKDIgPDwgMjUpIHwgKDEgPDwgMTYpIHwgKDIgPDwgOSkgfCAoMSA8PCAwKSkKKy8qIEdYTTogMjAwMC81ID0gNDAwTSAqLworI2RlZmluZSBIZXZjRW5jX0w0KCkgICBXUklURV9ISElfUkVHKEhISV9XQVZFNDIwTF9DTEtfQ05UTCwgXAorCQkJICgzIDw8IDI1KSB8ICgwIDw8IDE2KSB8ICgzIDw8IDkpIHwgKDAgPDwgMCkpCisvKiBHWE06IDIwMDAvNCA9IDUwME0gKi8KKyNkZWZpbmUgSGV2Y0VuY19MNSgpICAgV1JJVEVfSEhJX1JFRyhISElfV0FWRTQyMExfQ0xLX0NOVEwsIFwKKwkJCSAoMSA8PCAyNSkgfCAoMCA8PCAxNikgfCAoMSA8PCA5KSB8ICgwIDw8IDApKQorLyogR1hNOiAyMDAwLzMgPSA2NjdNICovCisjZGVmaW5lIEhldmNFbmNfTDYoKSAgIFdSSVRFX0hISV9SRUcoSEhJX1dBVkU0MjBMX0NMS19DTlRMLCBcCisJCQkgKDIgPDwgMjUpIHwgKDAgPDwgMTYpIHwgKDIgPDwgOSkgfCAoMCA8PCAwKSkKKworI2RlZmluZSBIZXZjRW5jX2Nsb2NrX2VuYWJsZShsZXZlbCkgXAorCWRvIHsgXAorCQlXUklURV9ISElfUkVHKEhISV9XQVZFNDIwTF9DTEtfQ05UTCwgXAorCQkJUkVBRF9ISElfUkVHKEhISV9XQVZFNDIwTF9DTEtfQ05UTCkgXAorCQkJJiAofigxIDw8IDgpKSAmICh+KDEgPDwgMjQpKSk7IFwKKwkJaWYgKGxldmVsID09IDApICBcCisJCQlIZXZjRW5jX0wwKCk7IFwKKwkJZWxzZSBpZiAobGV2ZWwgPT0gMSkgIFwKKwkJCUhldmNFbmNfTDEoKTsgXAorCQllbHNlIGlmIChsZXZlbCA9PSAyKSAgXAorCQkJSGV2Y0VuY19MMigpOyBcCisJCWVsc2UgaWYgKGxldmVsID09IDMpICBcCisJCQlIZXZjRW5jX0wzKCk7IFwKKwkJZWxzZSBpZiAobGV2ZWwgPT0gNCkgIFwKKwkJCUhldmNFbmNfTDQoKTsgXAorCQllbHNlIGlmIChsZXZlbCA9PSA1KSAgXAorCQkJSGV2Y0VuY19MNSgpOyBcCisJCWVsc2UgaWYgKGxldmVsID09IDYpICBcCisJCQlIZXZjRW5jX0w2KCk7IFwKKwkJV1JJVEVfSEhJX1JFRyhISElfV0FWRTQyMExfQ0xLX0NOVEwsIFwKKwkJCVJFQURfSEhJX1JFRyhISElfV0FWRTQyMExfQ0xLX0NOVEwpIFwKKwkJCXwgKDEgPDwgOCkgfCAoMSA8PCAyNCkpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBIZXZjRW5jX2Nsb2NrX2Rpc2FibGUoKSBcCisJV1JJVEVfSEhJX1JFRyhISElfV0FWRTQyMExfQ0xLX0NOVEwsIFwKKwlSRUFEX0hISV9SRUcoSEhJX1dBVkU0MjBMX0NMS19DTlRMKSBcCisJCSYgKH4oMSA8PCA4KSkgJiAofigxIDw8IDI0KSkpCisKKy8qIEFDTEsgNjY3TUhaICovCisjZGVmaW5lIEhldmNFbmNfTW9yZUNsb2NrX2VuYWJsZSgpIFwKKwlkbyB7IFwKKwkJV1JJVEVfSEhJX1JFRyhISElfV0FWRTQyMExfQ0xLX0NOVEwyLCBcCisJCQlSRUFEX0hISV9SRUcoSEhJX1dBVkU0MjBMX0NMS19DTlRMMikgXAorCQkJJiAofigxIDw8IDgpKSk7IFwKKwkJV1JJVEVfSEhJX1JFRyhISElfV0FWRTQyMExfQ0xLX0NOVEwyLCBcCisJCQkoMiA8PCA5KSB8ICgwIDw8IDApKTsgXAorCQlXUklURV9ISElfUkVHKEhISV9XQVZFNDIwTF9DTEtfQ05UTDIsIFwKKwkJCVJFQURfSEhJX1JFRyhISElfV0FWRTQyMExfQ0xLX0NOVEwyKSBcCisJCQl8ICgxIDw8IDgpKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgSGV2Y0VuY19Nb3JlQ2xvY2tfZGlzYWJsZSgpIFwKKwlXUklURV9ISElfUkVHKEhISV9XQVZFNDIwTF9DTEtfQ05UTDIsIFwKKwlSRUFEX0hISV9SRUcoSEhJX1dBVkU0MjBMX0NMS19DTlRMMikgXAorCQkmICh+KDEgPDwgOCkpKQorCit0eXBlZGVmIGVudW0KK3sKKyAgICBBTVZFTkNfWVVWNDIyX1NJTkdMRSA9IDAsCisgICAgQU1WRU5DX1lVVjQ0NF9TSU5HTEUsCisgICAgQU1WRU5DX05WMjEsCisgICAgQU1WRU5DX05WMTIsCisgICAgQU1WRU5DX1lVVjQyMCwKKyAgICBBTVZFTkNfWVVWNDQ0X1BMQU5FLAorICAgIEFNVkVOQ19SR0I4ODgsCisgICAgQU1WRU5DX1JHQjg4OF9QTEFORSwKKyAgICBBTVZFTkNfUkdCNTY1LAorICAgIEFNVkVOQ19SR0JBODg4OCwKKyAgICBBTVZFTkNfRlJBTUVfRk1UCit9IEFNVkVuY0ZyYW1lRm10OworCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RydWN0IGNvbXBhdF92cHVkcnZfYnVmZmVyX3QgeworCXUzMiBzaXplOworCXUzMiBjYWNoZWQ7CisJY29tcGF0X3Vsb25nX3QgcGh5c19hZGRyOworCWNvbXBhdF91bG9uZ190IGJhc2U7IC8qIGtlcm5lbCBsb2dpY2FsIGFkZHJlc3MgaW4gdXNlIGtlcm5lbCAqLworCWNvbXBhdF91bG9uZ190IHZpcnRfYWRkcjsgLyogdmlydHVhbCB1c2VyIHNwYWNlIGFkZHJlc3MgKi8KK307CisjZW5kaWYKKworc3RydWN0IHZwdWRydl9idWZmZXJfdCB7CisJdTMyIHNpemU7CisJdTMyIGNhY2hlZDsKKwl1bG9uZyBwaHlzX2FkZHI7CisJdWxvbmcgYmFzZTsgLyoga2VybmVsIGxvZ2ljYWwgYWRkcmVzcyBpbiB1c2Uga2VybmVsICovCisJdWxvbmcgdmlydF9hZGRyOyAvKiB2aXJ0dWFsIHVzZXIgc3BhY2UgYWRkcmVzcyAqLworfTsKKworc3RydWN0IHZwdV9iaXRfZmlybXdhcmVfaW5mb190IHsKKwl1MzIgc2l6ZTsgLyogc2l6ZSBvZiB0aGlzIHN0cnVjdHVyZSovCisJdTMyIGNvcmVfaWR4OworCXUzMiByZWdfYmFzZV9vZmZzZXQ7CisJdTE2IGJpdF9jb2RlWzUxMl07Cit9OworCitzdHJ1Y3QgdnB1ZHJ2X2luc3RfaW5mb190IHsKKwl1MzIgY29yZV9pZHg7CisJdTMyIGluc3RfaWR4OworCXMzMiBpbnN0X29wZW5fY291bnQ7CS8qIGZvciBvdXRwdXQgb25seSovCit9OworCitzdHJ1Y3QgdnB1ZHJ2X2ludHJfaW5mb190IHsKKwl1MzIgdGltZW91dDsKKwlzMzIgaW50cl9yZWFzb247Cit9OworCitzdHJ1Y3QgdnB1X2Rydl9jb250ZXh0X3QgeworCXN0cnVjdCBmYXN5bmNfc3RydWN0ICphc3luY19xdWV1ZTsKKwl1bG9uZyBpbnRlcnJ1cHRfcmVhc29uOworCXUzMiBvcGVuX2NvdW50OyAvKiE8PCBkZXZpY2UgcmVmZXJlbmNlIGNvdW50LiBOb3QgaW5zdGFuY2UgY291bnQgKi8KK307CisKKy8qIFRvIHRyYWNrIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGJ1ZmZlciAqLworc3RydWN0IHZwdWRydl9idWZmZXJfcG9vbF90IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHZwdWRydl9idWZmZXJfdCB2YjsKKwlzdHJ1Y3QgZmlsZSAqZmlscDsKK307CisKKy8qIFRvIHRyYWNrIHRoZSBpbnN0YW5jZSBpbmRleCBhbmQgYnVmZmVyIGluIGluc3RhbmNlIHBvb2wgKi8KK3N0cnVjdCB2cHVkcnZfaW5zdGFuYWNlX2xpc3RfdCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXVsb25nIGluc3RfaWR4OworCXVsb25nIGNvcmVfaWR4OworCXN0cnVjdCBmaWxlICpmaWxwOworfTsKKworc3RydWN0IHZwdWRydl9pbnN0YW5jZV9wb29sX3QgeworCXU4IGNvZGVjSW5zdFBvb2xbTUFYX05VTV9JTlNUQU5DRV1bTUFYX0lOU1RfSEFORExFX1NJWkVdOworfTsKKworc3RydWN0IHZwdV9kbWFfYnVmX2luZm9fdCB7CisgICAgdTMyIHdpZHRoOworICAgIHUzMiBoZWlnaHQ7CisgICAgQU1WRW5jRnJhbWVGbXQgZm10OworICAgIHUzMiBudW1fcGxhbmVzOworICAgIHMzMiBmZFszXTsKK307CisKK3N0cnVjdCB2cHVfZG1hX2NmZyB7CisJaW50IGZkOworCXZvaWQgKmRldjsKKwl2b2lkICp2YWRkcjsKKwl2b2lkICpwYWRkcjsKKwlzdHJ1Y3QgZG1hX2J1ZiAqZGJ1ZjsKKwlzdHJ1Y3QgZG1hX2J1Zl9hdHRhY2htZW50ICphdHRhY2g7CisJc3RydWN0IHNnX3RhYmxlICpzZzsKKwllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXI7Cit9OworCisjZGVmaW5lIFZQVURSVl9CVUZfTEVOIHN0cnVjdCB2cHVkcnZfYnVmZmVyX3QKKyNkZWZpbmUgVlBVRFJWX0JVRl9MRU4zMiBzdHJ1Y3QgY29tcGF0X3ZwdWRydl9idWZmZXJfdAorI2RlZmluZSBWUFVEUlZfSU5TVF9MRU4gc3RydWN0IHZwdWRydl9pbnN0X2luZm9fdAorCisjZGVmaW5lIFZESV9NQUdJQyAgJ1YnCisjZGVmaW5lIFZESV9JT0NUTF9BTExPQ0FURV9QSFlTSUNBTF9NRU1PUlkgXAorCV9JT1coVkRJX01BR0lDLCAwLCBWUFVEUlZfQlVGX0xFTikKKworI2RlZmluZSBWRElfSU9DVExfRlJFRV9QSFlTSUNBTE1FTU9SWSBcCisJX0lPVyhWRElfTUFHSUMsIDEsIFZQVURSVl9CVUZfTEVOKQorCisjZGVmaW5lIFZESV9JT0NUTF9XQUlUX0lOVEVSUlVQVCBcCisJX0lPVyhWRElfTUFHSUMsIDIsIHN0cnVjdCB2cHVkcnZfaW50cl9pbmZvX3QpCisKKyNkZWZpbmUgVkRJX0lPQ1RMX1NFVF9DTE9DS19HQVRFIFwKKwlfSU9XKFZESV9NQUdJQywgMywgdTMyKQorCisjZGVmaW5lIFZESV9JT0NUTF9SRVNFVCBcCisJX0lPVyhWRElfTUFHSUMsIDQsIHUzMikKKworI2RlZmluZSBWRElfSU9DVExfR0VUX0lOU1RBTkNFX1BPT0wgXAorCV9JT1coVkRJX01BR0lDLCA1LCBWUFVEUlZfQlVGX0xFTikKKworI2RlZmluZSBWRElfSU9DVExfR0VUX0NPTU1PTl9NRU1PUlkgXAorCV9JT1coVkRJX01BR0lDLCA2LCBWUFVEUlZfQlVGX0xFTikKKworI2RlZmluZSBWRElfSU9DVExfR0VUX1JFU0VSVkVEX1ZJREVPX01FTU9SWV9JTkZPIFwKKwlfSU9XKFZESV9NQUdJQywgOCwgVlBVRFJWX0JVRl9MRU4pCisKKyNkZWZpbmUgVkRJX0lPQ1RMX09QRU5fSU5TVEFOQ0UgXAorCV9JT1coVkRJX01BR0lDLCA5LCBWUFVEUlZfSU5TVF9MRU4pCisKKyNkZWZpbmUgVkRJX0lPQ1RMX0NMT1NFX0lOU1RBTkNFIFwKKwlfSU9XKFZESV9NQUdJQywgMTAsIFZQVURSVl9JTlNUX0xFTikKKworI2RlZmluZSBWRElfSU9DVExfR0VUX0lOU1RBTkNFX05VTSBcCisJX0lPVyhWRElfTUFHSUMsIDExLCBWUFVEUlZfSU5TVF9MRU4pCisKKyNkZWZpbmUgVkRJX0lPQ1RMX0dFVF9SRUdJU1RFUl9JTkZPIFwKKwlfSU9XKFZESV9NQUdJQywgMTIsIFZQVURSVl9CVUZfTEVOKQorCisjZGVmaW5lIFZESV9JT0NUTF9GTFVTSF9CVUZGRVIgXAorCV9JT1coVkRJX01BR0lDLCAxMywgVlBVRFJWX0JVRl9MRU4pCisKKyNkZWZpbmUgVkRJX0lPQ1RMX0NPTkZJR19ETUEgXAorICAgICAgICBfSU9XKFZESV9NQUdJQywgMTQsIHN0cnVjdCB2cHVfZG1hX2J1Zl9pbmZvX3QpCisKKyNkZWZpbmUgVkRJX0lPQ1RMX1VOTUFQX0RNQSBcCisgICAgICAgIF9JT1coVkRJX01BR0lDLCAxNSwgdTMyKQorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorI2RlZmluZSBWRElfSU9DVExfQUxMT0NBVEVfUEhZU0lDQUxfTUVNT1JZMzIgXAorCV9JT1coVkRJX01BR0lDLCAwLCBWUFVEUlZfQlVGX0xFTjMyKQorCisjZGVmaW5lIFZESV9JT0NUTF9GUkVFX1BIWVNJQ0FMTUVNT1JZMzIgXAorCV9JT1coVkRJX01BR0lDLCAxLCBWUFVEUlZfQlVGX0xFTjMyKQorCisjZGVmaW5lIFZESV9JT0NUTF9HRVRfSU5TVEFOQ0VfUE9PTDMyIFwKKwlfSU9XKFZESV9NQUdJQywgNSwgVlBVRFJWX0JVRl9MRU4zMikKKworI2RlZmluZSBWRElfSU9DVExfR0VUX0NPTU1PTl9NRU1PUlkzMiBcCisJX0lPVyhWRElfTUFHSUMsIDYsIFZQVURSVl9CVUZfTEVOMzIpCisKKyNkZWZpbmUgVkRJX0lPQ1RMX0dFVF9SRVNFUlZFRF9WSURFT19NRU1PUllfSU5GTzMyIFwKKwlfSU9XKFZESV9NQUdJQywgOCwgVlBVRFJWX0JVRl9MRU4zMikKKworI2RlZmluZSBWRElfSU9DVExfR0VUX1JFR0lTVEVSX0lORk8zMiBcCisJX0lPVyhWRElfTUFHSUMsIDEyLCBWUFVEUlZfQlVGX0xFTjMyKQorCisjZGVmaW5lIFZESV9JT0NUTF9GTFVTSF9CVUZGRVIzMiBcCisJX0lPVyhWRElfTUFHSUMsIDEzLCBWUFVEUlZfQlVGX0xFTjMyKQorI2VuZGlmCisKK2VudW0geworCVc0X0lOVF9JTklUX1ZQVSA9IDAsCisJVzRfSU5UX0RFQ19QSUNfSERSID0gMSwKKwlXNF9JTlRfU0VUX1BBUkFNID0gMSwKKwlXNF9JTlRfRU5DX0lOSVRfU0VRID0gMSwKKwlXNF9JTlRfRklOSV9TRVEgPSAyLAorCVc0X0lOVF9ERUNfUElDID0gMywKKwlXNF9JTlRfRU5DX1BJQyA9IDMsCisJVzRfSU5UX1NFVF9GUkFNRUJVRiA9IDQsCisJVzRfSU5UX0ZMVVNIX0RFQyA9IDUsCisJVzRfSU5UX0VOQ19TTElDRV9JTlQgPSA3LAorCVc0X0lOVF9HRVRfRldfVkVSU0lPTiA9IDgsCisJVzRfSU5UX1FVRVJZX0RFQyA9IDksCisJVzRfSU5UX1NMRUVQX1ZQVSA9IDEwLAorCVc0X0lOVF9XQUtFVVBfVlBVID0gMTEsCisJVzRfSU5UX0NIQU5HRV9JTlQgPSAxMiwKKwlXNF9JTlRfQ1JFQVRFX0lOU1RBTkNFID0gMTQsCisJVzRfSU5UX0JTQlVGX0VNUFRZID0gMTUsCisgICAgLyohPDwgQml0c3RyZWFtIGJ1ZmZlciBlbXB0eVtkZWNdL2Z1bGxbZW5jXSAqLworfTsKKworLyogV0FWRTQgcmVnaXN0ZXJzICovCisjZGVmaW5lIFZQVV9SRUdfQkFTRV9BRERSCTB4Yzg4MTAwMDAKKyNkZWZpbmUgVlBVX1JFR19TSVpFCSgweDQwMDAgKiBNQVhfTlVNX1ZQVV9DT1JFKQorCisjZGVmaW5lIFc0X1JFR19CQVNFCQkJCQkweDAwMDAKKyNkZWZpbmUgVzRfVlBVX0JVU1lfU1RBVFVTCQkJKFc0X1JFR19CQVNFICsgMHgwMDcwKQorI2RlZmluZSBXNF9WUFVfSU5UX1JFQVNPTl9DTEVBUgkJCShXNF9SRUdfQkFTRSArIDB4MDAzNCkKKyNkZWZpbmUgVzRfVlBVX1ZJTlRfQ0xFQVIJCQkJKFc0X1JFR19CQVNFICsgMHgwMDNDKQorI2RlZmluZSBXNF9WUFVfVlBVX0lOVF9TVFMJCQkoVzRfUkVHX0JBU0UgKyAweDAwNDQpCisjZGVmaW5lIFc0X1ZQVV9JTlRfUkVBU09OCQkJCShXNF9SRUdfQkFTRSArIDB4MDA0YykKKworI2RlZmluZSBXNF9SRVRfU1VDQ0VTUwkJCQkJKFc0X1JFR19CQVNFICsgMHgwMTEwKQorI2RlZmluZSBXNF9SRVRfRkFJTF9SRUFTT04JCQkoVzRfUkVHX0JBU0UgKyAweDAxMTQpCisKKy8qIFdBVkU0IElOSVQsIFdBS0VVUCAqLworI2RlZmluZSBXNF9QT19DT05GCQkJCQkoVzRfUkVHX0JBU0UgKyAweDAwMDApCisjZGVmaW5lIFc0X1ZDUFVfQ1VSX1BDCQkJCQkoVzRfUkVHX0JBU0UgKyAweDAwMDQpCisKKyNkZWZpbmUgVzRfVlBVX1ZJTlRfRU5BQkxFCQkJKFc0X1JFR19CQVNFICsgMHgwMDQ4KQorCisjZGVmaW5lIFc0X1ZQVV9SRVNFVF9SRVEJCQkJKFc0X1JFR19CQVNFICsgMHgwMDUwKQorI2RlZmluZSBXNF9WUFVfUkVTRVRfU1RBVFVTCQkJKFc0X1JFR19CQVNFICsgMHgwMDU0KQorCisjZGVmaW5lIFc0X1ZQVV9SRU1BUF9DVFJMCQkJCShXNF9SRUdfQkFTRSArIDB4MDA2MCkKKyNkZWZpbmUgVzRfVlBVX1JFTUFQX1ZBRERSCQkJKFc0X1JFR19CQVNFICsgMHgwMDY0KQorI2RlZmluZSBXNF9WUFVfUkVNQVBfUEFERFIJCQkoVzRfUkVHX0JBU0UgKyAweDAwNjgpCisjZGVmaW5lIFc0X1ZQVV9SRU1BUF9DT1JFX1NUQVJUCQkJKFc0X1JFR19CQVNFICsgMHgwMDZDKQorI2RlZmluZSBXNF9WUFVfQlVTWV9TVEFUVVMJCQkoVzRfUkVHX0JBU0UgKyAweDAwNzApCisKKyNkZWZpbmUgVzRfSFdfT1BUSU9OCQkJCQkoVzRfUkVHX0JBU0UgKyAweDAxMjQpCisjZGVmaW5lIFc0X0NPREVfU0laRQkJCQkJKFc0X1JFR19CQVNFICsgMHgwMTFDKQorLyogTm90ZTogVzRfSU5JVF9DT0RFX0JBU0VfQUREUiBzaG91bGQgYmUgYWxpZ25lZCB0byA0S0IgKi8KKyNkZWZpbmUgVzRfQUREUl9DT0RFX0JBU0UJCQkoVzRfUkVHX0JBU0UgKyAweDAxMTgpCisjZGVmaW5lIFc0X0NPREVfUEFSQU0JCQkJCShXNF9SRUdfQkFTRSArIDB4MDEyMCkKKyNkZWZpbmUgVzRfSU5JVF9WUFVfVElNRV9PVVRfQ05UCQkoVzRfUkVHX0JBU0UgKyAweDAxMzQpCisKKy8qIFdBVkU0IFdhdmU0Qml0SXNzdWVDb21tYW5kICovCisjZGVmaW5lIFc0X0NPUkVfSU5ERVgJCQkJCShXNF9SRUdfQkFTRSArIDB4MDEwNCkKKyNkZWZpbmUgVzRfSU5TVF9JTkRFWAkJCQkJKFc0X1JFR19CQVNFICsgMHgwMTA4KQorI2RlZmluZSBXNF9DT01NQU5ECQkJCQkoVzRfUkVHX0JBU0UgKyAweDAxMDApCisjZGVmaW5lIFc0X1ZQVV9IT1NUX0lOVF9SRVEJCQkoVzRfUkVHX0JBU0UgKyAweDAwMzgpCisKKyNkZWZpbmUgVzRfQlNfUkRfUFRSCQkJCQkoVzRfUkVHX0JBU0UgKyAweDAxMzApCisjZGVmaW5lIFc0X0JTX1dSX1BUUgkJCQkJKFc0X1JFR19CQVNFICsgMHgwMTM0KQorI2RlZmluZSBXNF9TUkNfQUREUl9ZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVzRfUkVHX0JBU0UgKyAweDAxNzQpCisjZGVmaW5lIFc0X1NSQ19BRERSX1UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXNF9SRUdfQkFTRSArIDB4MDE3OCkKKyNkZWZpbmUgVzRfU1JDX0FERFJfViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFc0X1JFR19CQVNFICsgMHgwMTdDKQorCisjZGVmaW5lIFc0X1JFVF9FTkNfUElDX0JZVEUJCQkoVzRfUkVHX0JBU0UgKyAweDAxQzgpCisKKyNkZWZpbmUgVzRfUkVNQVBfQ09ERV9JTkRFWAkJCSAwCisKKyNkZWZpbmUgUmVhZFZwdVJlZ2lzdGVyKGFkZHIpIFwKKwlyZWFkbCgodm9pZCBfX2lvbWVtICopKHNfdnB1X3JlZ2lzdGVyLnZpcnRfYWRkciBcCisJKyBzX2JpdF9maXJtd2FyZV9pbmZvW2NvcmVdLnJlZ19iYXNlX29mZnNldCArIGFkZHIpKQorCisjZGVmaW5lIFdyaXRlVnB1UmVnaXN0ZXIoYWRkciwgdmFsKSBcCisJd3JpdGVsKCh1MzIpdmFsLCAodm9pZCBfX2lvbWVtICopKHNfdnB1X3JlZ2lzdGVyLnZpcnRfYWRkciBcCisJKyBzX2JpdF9maXJtd2FyZV9pbmZvW2NvcmVdLnJlZ19iYXNlX29mZnNldCArIGFkZHIpKQorCisjZGVmaW5lIFdyaXRlVnB1KGFkZHIsIHZhbCkgd3JpdGVsKCh1MzIpdmFsLCAodm9pZCBfX2lvbWVtICopYWRkcikKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZV9zaW5rL2VuY29kZXIvanBlZy9NYWtlZmlsZSBiL2RyaXZlcnMvZnJhbWVfc2luay9lbmNvZGVyL2pwZWcvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY2YzQ5OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfc2luay9lbmNvZGVyL2pwZWcvTWFrZWZpbGUKQEAgLTAsMCArMSwyIEBACitvYmotJChDT05GSUdfQU1MT0dJQ19NRURJQV9WRU5DX0pQRUcpICs9IGpwZWdlbmMubworI2FtdmVuY19qcGVnLW9ianMgKz0ganBlZ2VuYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3NpbmsvZW5jb2Rlci9qcGVnL2pwZWdlbmMuYyBiL2RyaXZlcnMvZnJhbWVfc2luay9lbmNvZGVyL2pwZWcvanBlZ2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MTYzNzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3NpbmsvZW5jb2Rlci9qcGVnL2pwZWdlbmMuYwpAQCAtMCwwICsxLDQ4NzAgQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvYW1wb3J0cy9qcGVnZW5jLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisqLworI2RlZmluZSBMT0dfTElORSgpCisvL3ByX2VycigiWyVzOiVkXVxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1la2VlcGluZy5oPgorCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZnJhbWVfc3luYy9wdHNzZXJ2Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy9hbXN0cmVhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY2FudmFzL2NhbnZhcy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY2FudmFzL2NhbnZhc19tZ3IuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL3ZkZWNfcmVnLmg+CisjaW5jbHVkZSAiLi4vLi4vLi4vZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjX2NhbnZhc191dGlscy5oIgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZmR0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLWNvbnRpZ3VvdXMuaD4KKyNpbmNsdWRlICIuLi8uLi8uLi9jb21tb24vY2hpcHMvZGVjb2Rlcl9jcHVfdmVyX2luZm8uaCIKKyNpbmNsdWRlICIuLi8uLi8uLi9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL2FtdmRlYy5oIgorI2luY2x1ZGUgIi4uLy4uLy4uL3N0cmVhbV9pbnB1dC9hbXBvcnRzL2FtcG9ydHNfcHJpdi5oIgorI2luY2x1ZGUgIi4uLy4uLy4uL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvZmlybXdhcmUuaCIKKyNpbmNsdWRlICIuLi8uLi8uLi9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWMuaCIKKyNpbmNsdWRlICIuLi8uLi8uLi9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWNfcG93ZXJfY3RybC5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29kZWNfbW0uaD4KKyNpbmNsdWRlICJqcGVnZW5jLmgiCisjaW5jbHVkZSA8bGludXgvb2ZfcmVzZXJ2ZWRfbWVtLmg+CisKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL3Bvd2VyX2N0cmwuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9wb3dlci90Ny1wZC5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvcG93ZXJfZG9tYWluLmg+CisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNkZWZpbmUgSENPREVDX01GRElOX1JFRzE3ICAgICAgICAgICAgICAgICAgICAgICAweDEwMWYKKyNkZWZpbmUgSENPREVDX01GRElOX1JFRzE4ICAgICAgICAgICAgICAgICAgICAgICAweDEwMjAKKyNkZWZpbmUgSENPREVDX01GRElOX1JFRzE5ICAgICAgICAgICAgICAgICAgICAgICAweDEwMjEKKworI2lmZGVmIENPTkZJR19BTV9FTkNPREVSCisjaW5jbHVkZSAiZW5jb2Rlci5oIgorI2VuZGlmCisKKyNkZWZpbmUgSlBFR0VOQ19DQU5WQVNfSU5ERVggMHg2NAorI2RlZmluZSBKUEVHRU5DX0NBTlZBU19NQVhfSU5ERVggMHg2NworCisjZGVmaW5lIEVOQ19DQU5WQVNfT0ZGU0VUICBKUEVHRU5DX0NBTlZBU19JTkRFWAorCisjZGVmaW5lIExPR19BTEwgMAorI2RlZmluZSBMT0dfSU5GTyAxCisjZGVmaW5lIExPR19ERUJVRyAyCisjZGVmaW5lIExPR19FUlJPUiAzCisKKyNkZWZpbmUgamVuY19wcihsZXZlbCwgeC4uLikgXAorICAgIGRvIHsgXAorICAgICAgICBpZiAobGV2ZWwgPj0ganBlZ2VuY19wcmludF9sZXZlbCkgXAorICAgICAgICAgICAgcHJpbnRrKHgpOyBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBEUklWRVJfTkFNRSAianBlZ2VuYyIKKyNkZWZpbmUgQ0xBU1NfTkFNRSAianBlZ2VuYyIKKyNkZWZpbmUgREVWSUNFX05BTUUgImpwZWdlbmMiCisKKy8qICNkZWZpbmUgRVhURUFOX1FVQU5UX1RBQkxFICovCisKKy8qIyMjIyMjIyMjIERFQlVHLUJSSU5HVVAjIyMjIyMjIyMqLworc3RhdGljIHUzMiBtYW51YWxfY2xvY2s7CitzdGF0aWMgdTMyIG1hbnVhbF9pcnFfbnVtID0gMjsKK3N0YXRpYyB1MzIgbWFudWFsX2ludGVycnVwdCA9IDA7CisvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KKworc3RhdGljIHMzMiBqcGVnZW5jX2RldmljZV9tYWpvcjsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICpqcGVnZW5jX2RldjsKK3N0YXRpYyB1MzIganBlZ2VuY19wcmludF9sZXZlbCA9IExPR19FUlJPUjsKKworc3RhdGljIHMzMiByZWdfb2Zmc2V0OworCitzdGF0aWMgdTMyIHVzZV9kbWFfaW8gPSAxOworCitzdGF0aWMgdTMyIHVzZV9xdWFsaXR5PTE7CitzdGF0aWMgdTMyIGxlZ2FjeV9sb2FkPTA7CisKK3N0YXRpYyB1MzIgZHVtcG1lbV9saW5lID0gMDsKK3N0YXRpYyB1MzIgcG9pbnRlciA9IDA7CisKK3N0YXRpYyB1MzIgY2xvY2tfbGV2ZWwgPSAxOworc3RhdGljIHUxNiBnUXVhbnRUYWJsZVsyXVtEQ1RTSVpFMl07CisjaWZkZWYgRVhURUFOX1FVQU5UX1RBQkxFCitzdGF0aWMgdTE2ICpnRXh0ZXJuYWxRdWFudFRhYmxlUHRyOworc3RhdGljIGJvb2wgZXh0ZXJuYWxfcXVhbnRfdGFibGVfYXZhaWxhYmxlOworI2VuZGlmCisKK3N0YXRpYyB1MzIgc2ltdWxhdGlvbl9lbmFibGU7CitzdGF0aWMgdTMyIGdfYmxvY2tfbW9kZTsKK3N0YXRpYyB1MzIgZ19jYW52MF9zdHJpZGU7CitzdGF0aWMgdTMyIGdfY2FudjFfc3RyaWRlOworc3RhdGljIHUzMiBnX2NhbnYyX3N0cmlkZTsKK3N0YXRpYyB1MzIgZ19jYW52YXNfaGVpZ2h0OworCitzdGF0aWMgdTMyIGpwZWdfaW5fZnVsbF9oY29kZWM7CitzdGF0aWMgdTMyIG1mZGluX2FtYnVzX2NhbnZfY29udjsKKworI2RlZmluZSBNSHogKDEwMDAwMDApCisKKy8vc3RhdGljIERFRklORV9TUElOTE9DSyhsb2NrKTsKKworI2RlZmluZSBKUEVHRU5DX0JVRkZFUl9MRVZFTF9WR0EgICAwCisjZGVmaW5lIEpQRUdFTkNfQlVGRkVSX0xFVkVMXzJNICAgICAxCisjZGVmaW5lIEpQRUdFTkNfQlVGRkVSX0xFVkVMXzNNICAgICAyCisjZGVmaW5lIEpQRUdFTkNfQlVGRkVSX0xFVkVMXzVNICAgICAzCisjZGVmaW5lIEpQRUdFTkNfQlVGRkVSX0xFVkVMXzhNICAgICA0CisjZGVmaW5lIEpQRUdFTkNfQlVGRkVSX0xFVkVMXzEzTSAgIDUKKyNkZWZpbmUgSlBFR0VOQ19CVUZGRVJfTEVWRUxfSEQgICAgIDYKKworY29uc3QgczggKmdsZXZlbF9zdHJbXSA9IHsKKyAgICAiVkdBIiwKKyAgICAiMk0iLAorICAgICIzTSIsCisgICAgIjVNIiwKKyAgICAiOE0iLAorICAgICIxM00iLAorICAgICJIRCIsCit9OworCitjb25zdCBzdHJ1Y3QgSnBlZ2VuY19CdWZmSW5mb19zIGpwZWdlbmNfYnVmZnNwZWNbXSA9IHsKKyAgICB7CisgICAgICAgIC5sZXZfaWQgPSBKUEVHRU5DX0JVRkZFUl9MRVZFTF9WR0EsCisgICAgICAgIC5tYXhfd2lkdGggPSA2NDAsCisgICAgICAgIC5tYXhfaGVpZ2h0ID0gNjQwLAorICAgICAgICAubWluX2J1ZmZzaXplID0gMHgzMzAwMDAsCisgICAgICAgIC5pbnB1dCA9IHsKKyAgICAgICAgICAgIC5idWZfc3RhcnQgPSAwLAorICAgICAgICAgICAgLmJ1Zl9zaXplID0gMHgxMmMwMDAsCisgICAgICAgIH0sCisgICAgICAgIC5hc3NpdCA9IHsKKyAgICAgICAgICAgIC5idWZfc3RhcnQgPSAweDEyZDAwMCwKKyAgICAgICAgICAgIC5idWZfc2l6ZSA9IDB4MjAwMCwKKyAgICAgICAgfSwKKyAgICAgICAgLmJpdHN0cmVhbSA9IHsKKyAgICAgICAgICAgIC5idWZfc3RhcnQgPSAweDEzMDAwMCwKKyAgICAgICAgICAgIC5idWZfc2l6ZSA9IDB4MjAwMDAwLAorICAgICAgICB9CisgICAgfSwgeworICAgICAgICAubGV2X2lkID0gSlBFR0VOQ19CVUZGRVJfTEVWRUxfMk0sCisgICAgICAgIC5tYXhfd2lkdGggPSAxNjAwLAorICAgICAgICAubWF4X2hlaWdodCA9IDE2MDAsCisgICAgICAgIC5taW5fYnVmZnNpemUgPSAweDk2MDAwMCwKKyAgICAgICAgLmlucHV0ID0geworICAgICAgICAgICAgLmJ1Zl9zdGFydCA9IDAsCisgICAgICAgICAgICAuYnVmX3NpemUgPSAweDc1MzAwMCwKKyAgICAgICAgfSwKKyAgICAgICAgLmFzc2l0ID0geworICAgICAgICAgICAgLmJ1Zl9zdGFydCA9IDB4NzU0MDAwLAorICAgICAgICAgICAgLmJ1Zl9zaXplID0gMHgyMDAwLAorICAgICAgICB9LAorICAgICAgICAuYml0c3RyZWFtID0geworICAgICAgICAgICAgLmJ1Zl9zdGFydCA9IDB4NzYwMDAwLAorICAgICAgICAgICAgLmJ1Zl9zaXplID0gMHgyMDAwMDAsCisgICAgICAgIH0KKyAgICB9LCB7CisgICAgICAgIC5sZXZfaWQgPSBKUEVHRU5DX0JVRkZFUl9MRVZFTF8zTSwKKyAgICAgICAgLm1heF93aWR0aCA9IDIwNDgsCisgICAgICAgIC5tYXhfaGVpZ2h0ID0gMjA0OCwKKyAgICAgICAgLm1pbl9idWZmc2l6ZSA9IDB4ZTEwMDAwLAorICAgICAgICAuaW5wdXQgPSB7CisgICAgICAgICAgICAuYnVmX3N0YXJ0ID0gMCwKKyAgICAgICAgICAgIC5idWZfc2l6ZSA9IDB4YzAwMDAwLAorICAgICAgICB9LAorICAgICAgICAuYXNzaXQgPSB7CisgICAgICAgICAgICAuYnVmX3N0YXJ0ID0gMHhjMDEwMDAsCisgICAgICAgICAgICAuYnVmX3NpemUgPSAweDIwMDAsCisgICAgICAgIH0sCisgICAgICAgIC5iaXRzdHJlYW0gPSB7CisgICAgICAgICAgICAuYnVmX3N0YXJ0ID0gMHhjMTAwMDAsCisgICAgICAgICAgICAuYnVmX3NpemUgPSAweDIwMDAwMCwKKyAgICAgICAgfQorICAgIH0sIHsKKyAgICAgICAgLmxldl9pZCA9IEpQRUdFTkNfQlVGRkVSX0xFVkVMXzVNLAorICAgICAgICAubWF4X3dpZHRoID0gMjYyNCwKKyAgICAgICAgLm1heF9oZWlnaHQgPSAyNjI0LAorICAgICAgICAubWluX2J1ZmZzaXplID0gMHgxODAwMDAwLAorICAgICAgICAuaW5wdXQgPSB7CisgICAgICAgICAgICAuYnVmX3N0YXJ0ID0gMCwKKyAgICAgICAgICAgIC5idWZfc2l6ZSA9IDB4MTNCMzAwMCwKKyAgICAgICAgfSwKKyAgICAgICAgLmFzc2l0ID0geworICAgICAgICAgICAgLmJ1Zl9zdGFydCA9IDB4MTNCNDAwMCwKKyAgICAgICAgICAgIC5idWZfc2l6ZSA9IDB4MjAwMCwKKyAgICAgICAgfSwKKyAgICAgICAgLmJpdHN0cmVhbSA9IHsKKyAgICAgICAgICAgIC5idWZfc3RhcnQgPSAweDE0MDAwMDAsCisgICAgICAgICAgICAuYnVmX3NpemUgPSAweDQwMDAwMCwKKyAgICAgICAgfQorICAgIH0sIHsKKyAgICAgICAgLmxldl9pZCA9IEpQRUdFTkNfQlVGRkVSX0xFVkVMXzhNLAorICAgICAgICAubWF4X3dpZHRoID0gMzI2NCwKKyAgICAgICAgLm1heF9oZWlnaHQgPSAzMjY0LAorICAgICAgICAubWluX2J1ZmZzaXplID0gMHgyMzAwMDAwLAorICAgICAgICAuaW5wdXQgPSB7CisgICAgICAgICAgICAuYnVmX3N0YXJ0ID0gMCwKKyAgICAgICAgICAgIC5idWZfc2l6ZSA9IDB4MWU3YjAwMCwKKyAgICAgICAgfSwKKyAgICAgICAgLmFzc2l0ID0geworICAgICAgICAgICAgLmJ1Zl9zdGFydCA9IDB4MWU3YzAwMCwKKyAgICAgICAgICAgIC5idWZfc2l6ZSA9IDB4MjAwMCwKKyAgICAgICAgfSwKKyAgICAgICAgLmJpdHN0cmVhbSA9IHsKKyAgICAgICAgICAgIC5idWZfc3RhcnQgPSAweDFmMDAwMDAsCisgICAgICAgICAgICAuYnVmX3NpemUgPSAweDQwMDAwMCwKKyAgICAgICAgfQorICAgIH0sIHsKKyAgICAgICAgLmxldl9pZCA9IEpQRUdFTkNfQlVGRkVSX0xFVkVMXzEzTSwKKyAgICAgICAgLm1heF93aWR0aCA9IDgxOTIsCisgICAgICAgIC5tYXhfaGVpZ2h0ID0gODE5MiwKKyAgICAgICAgLm1pbl9idWZmc2l6ZSA9IDB4YzQwMDAwMCwKKyAgICAgICAgLmlucHV0ID0geworICAgICAgICAgICAgLmJ1Zl9zdGFydCA9IDAsCisgICAgICAgICAgICAuYnVmX3NpemUgPSAweGMwMDAwMDAsCisgICAgICAgIH0sCisgICAgICAgIC5hc3NpdCA9IHsKKyAgICAgICAgICAgIC5idWZfc3RhcnQgPSAweGMwMDEwMDAsCisgICAgICAgICAgICAuYnVmX3NpemUgPSAweDIwMDAsCisgICAgICAgIH0sCisgICAgICAgIC5iaXRzdHJlYW0gPSB7CisgICAgICAgICAgICAuYnVmX3N0YXJ0ID0gMHhjMDEwMDAwLAorICAgICAgICAgICAgLmJ1Zl9zaXplID0gMHgzZjAwMDAsCisgICAgICAgIH0KKyAgICB9LCB7CisgICAgICAgIC5sZXZfaWQgPSBKUEVHRU5DX0JVRkZFUl9MRVZFTF9IRCwKKyAgICAgICAgLm1heF93aWR0aCA9IDgxOTIsCisgICAgICAgIC5tYXhfaGVpZ2h0ID0gODE5MiwKKyAgICAgICAgLm1pbl9idWZmc2l6ZSA9IDB4YzQwMDAwMCwKKyAgICAgICAgLmlucHV0ID0geworICAgICAgICAgICAgLmJ1Zl9zdGFydCA9IDAsCisgICAgICAgICAgICAuYnVmX3NpemUgPSAweGMwMDAwMDAsCisgICAgICAgIH0sCisgICAgICAgIC5hc3NpdCA9IHsKKyAgICAgICAgICAgIC5idWZfc3RhcnQgPSAweGMwMDEwMDAsCisgICAgICAgICAgICAuYnVmX3NpemUgPSAweDIwMDAsCisgICAgICAgIH0sCisgICAgICAgIC5iaXRzdHJlYW0gPSB7CisgICAgICAgICAgICAuYnVmX3N0YXJ0ID0gMHhjMDEwMDAwLAorICAgICAgICAgICAgLmJ1Zl9zaXplID0gMHgzZjAwMDAsCisgICAgICAgIH0KKyAgICB9Cit9OworCitjb25zdCBjaGFyICpqcGVnZW5jX3Vjb2RlW10gPSB7CisgICAgImpwZWdlbmNfbWMiLAorfTsKKworc3RhdGljIHN0cnVjdCBqcGVnZW5jX21hbmFnZXJfcyBnSnBlZ2VuYzsKKworc3RhdGljIGNvbnN0IHUxNiBqcGVnX3F1YW50WzddW0RDVFNJWkUyXSA9IHsKKyAgICB7IC8qIGpwZWdfcXVhbnRbMF1bXSA6IEx1bWEsIENhbm9uICovCisgICAgICAgIDB4MDYsIDB4MDYsIDB4MDgsIDB4MEEsIDB4MEEsIDB4MTAsIDB4MTUsIDB4MTksCisgICAgICAgIDB4MDYsIDB4MEEsIDB4MEEsIDB4MEUsIDB4MTIsIDB4MUYsIDB4MjksIDB4MjksCisgICAgICAgIDB4MDgsIDB4MEEsIDB4MEUsIDB4MTIsIDB4MjEsIDB4MjksIDB4MjksIDB4MjksCisgICAgICAgIDB4MEEsIDB4MEUsIDB4MTIsIDB4MTQsIDB4MjMsIDB4MjksIDB4MjksIDB4MjksCisgICAgICAgIDB4MEEsIDB4MTIsIDB4MjEsIDB4MjMsIDB4MjcsIDB4MjksIDB4MjksIDB4MjksCisgICAgICAgIDB4MTAsIDB4MUYsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisgICAgICAgIDB4MTUsIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksCisgICAgICAgIDB4MTksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjksIDB4MjkKKyAgICB9LAorICAgIHsgLyoganBlZ19xdWFudFsxXVtdIDogQ2hyb21hLCBDYW5vbiAqLworICAgICAgICAweDBBLCAweDBFLCAweDEwLCAweDE0LCAweDE1LCAweDFELCAweDJCLCAweDM1LAorICAgICAgICAweDBFLCAweDEyLCAweDE0LCAweDFELCAweDI1LCAweDNFLCAweDU0LCAweDU0LAorICAgICAgICAweDEwLCAweDE0LCAweDE5LCAweDI1LCAweDQwLCAweDU0LCAweDU0LCAweDU0LAorICAgICAgICAweDE0LCAweDFELCAweDI1LCAweDI3LCAweDQ4LCAweDU0LCAweDU0LCAweDU0LAorICAgICAgICAweDE1LCAweDI1LCAweDQwLCAweDQ4LCAweDRFLCAweDU0LCAweDU0LCAweDU0LAorICAgICAgICAweDFELCAweDNFLCAweDU0LCAweDU0LCAweDU0LCAweDU0LCAweDU0LCAweDU0LAorICAgICAgICAweDJCLCAweDU0LCAweDU0LCAweDU0LCAweDU0LCAweDU0LCAweDU0LCAweDU0LAorICAgICAgICAweDM1LCAweDU0LCAweDU0LCAweDU0LCAweDU0LCAweDU0LCAweDU0LCAweDU0CisgICAgfSwKKyAgICB7IC8qIGpwZWdfcXVhbnRbMl1bXSA6IEx1bWEsIHNwZWMgZXhhbXBsZSBUYWJsZSBLLjEgKi8KKyAgICAgICAgMTYsIDExLCAxMCwgMTYsIDI0LCA0MCwgNTEsIDYxLAorICAgICAgICAxMiwgMTIsIDE0LCAxOSwgMjYsIDU4LCA2MCwgNTUsCisgICAgICAgIDE0LCAxMywgMTYsIDI0LCA0MCwgNTcsIDY5LCA1NiwKKyAgICAgICAgMTQsIDE3LCAyMiwgMjksIDUxLCA4NywgODAsIDYyLAorICAgICAgICAxOCwgMjIsIDM3LCA1NiwgNjgsIDEwOSwgMTAzLCA3NywKKyAgICAgICAgMjQsIDM1LCA1NSwgNjQsIDgxLCAxMDQsIDExMywgOTIsCisgICAgICAgIDQ5LCA2NCwgNzgsIDg3LCAxMDMsIDEyMSwgMTIwLCAxMDEsCisgICAgICAgIDcyLCA5MiwgOTUsIDk4LCAxMTIsIDEwMCwgMTAzLCA5OQorICAgIH0sCisgICAgeyAvKiBqcGVnX3F1YW50WzNdW10gOiBDaHJvbWEsIHNwZWMgZXhhbXBsZSBUYWJsZSBLLjIgKi8KKyAgICAgICAgMTcsIDE4LCAyNCwgNDcsIDk5LCA5OSwgOTksIDk5LAorICAgICAgICAxOCwgMjEsIDI2LCA2NiwgOTksIDk5LCA5OSwgOTksCisgICAgICAgIDI0LCAyNiwgNTYsIDk5LCA5OSwgOTksIDk5LCA5OSwKKyAgICAgICAgNDcsIDY2LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LAorICAgICAgICA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksCisgICAgICAgIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwKKyAgICAgICAgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LAorICAgICAgICA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTkKKyAgICB9LAorICAgIHsgLyoganBlZ19xdWFudFs0XVtdIDogTHVtYSwgc3BlYyBleGFtcGxlIFRhYmxlIEsuMSwKKyAgICAgICAgbW9kaWZpZWQgdG8gY3JlYXRlIGxvbmcgWlJMICovCisgICAgICAgIDE2LCAxMSwgMTAsIDE2LCAyNCwgNDAsIDUxLCA2MSwKKyAgICAgICAgMTIsIDEyLCAxNCwgMTksIDI2LCA1OCwgNjAsIDU1LAorICAgICAgICAxNCwgMTMsIDE2LCAyNCwgNDAsIDU3LCA2OSwgNTYsCisgICAgICAgIDE0LCAxNywgMjIsIDI5LCA1MSwgODcsIDgwLCA2MiwKKyAgICAgICAgMTgsIDIyLCAzNywgNTYsIDY4LCAxMDksIDEwMywgNzcsCisgICAgICAgIDI0LCAzNSwgNTUsIDY0LCA4MSwgMTA0LCAxMTMsIDkyLAorICAgICAgICA0OSwgNjQsIDc4LCA4NywgMTAzLCAxMjEsIDEyMCwgMTAxLAorICAgICAgICA3MiwgOTIsIDk1LCA5OCwgMTEyLCAxMDAsIDEwMywgMTYKKyAgICB9LAorICAgIHsgLyoganBlZ19xdWFudFs1XVtdIDogQ2hyb21hLCBzcGVjIGV4YW1wbGUgVGFibGUgSy4yLAorICAgICAgICBtb2RpZmllZCB0byBjcmVhdGUgbG9uZyBaUkwgKi8KKyAgICAgICAgMTcsIDE4LCAyNCwgNDcsIDk5LCA5OSwgOTksIDk5LAorICAgICAgICAxOCwgMjEsIDI2LCA2NiwgOTksIDk5LCA5OSwgOTksCisgICAgICAgIDI0LCAyNiwgNTYsIDk5LCA5OSwgOTksIDk5LCA5OSwKKyAgICAgICAgNDcsIDY2LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LAorICAgICAgICA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksCisgICAgICAgIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwKKyAgICAgICAgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LAorICAgICAgICA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgMTcKKyAgICB9LAorICAgIHsgLyoganBlZ19xdWFudFs2XVtdIDogbm8gY29tcHJlc3Npb24gKi8KKyAgICAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMQorICAgIH0KK307IC8qIGpwZWdfcXVhbnQgKi8KKworc3RhdGljIGNvbnN0IHU4IGpwZWdfaHVmZm1hbl9kY1syXVsxNiArIDEyXSA9IHsKKyAgICB7IC8qIGpwZWdfaHVmZm1hbl9kY1swXVtdICovCisgICAgICAgIDB4MDAsIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aD0xICovCisgICAgICAgIDB4MDEsCisgICAgICAgIDB4MDUsCisgICAgICAgIDB4MDEsCisgICAgICAgIDB4MDEsCisgICAgICAgIDB4MDEsCisgICAgICAgIDB4MDEsCisgICAgICAgIDB4MDEsCisgICAgICAgIDB4MDEsCisgICAgICAgIDB4MDAsCisgICAgICAgIDB4MDAsCisgICAgICAgIDB4MDAsCisgICAgICAgIDB4MDAsCisgICAgICAgIDB4MDAsCisgICAgICAgIDB4MDAsCisgICAgICAgIDB4MDAsIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aD0xNiAqLworCisgICAgICAgIC8qIEVudHJ5IGluZGV4IGZvciBjb2RlIHdpdGgKKyAgICAgICAgICAgIG1pbmltdW0gY29kZSBsZW5ndGggKD0yIGluIHRoaXMgY2FzZSkgKi8KKyAgICAgICAgMHgwMCwKKyAgICAgICAgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwKKyAgICAgICAgMHgwNiwKKyAgICAgICAgMHgwNywKKyAgICAgICAgMHgwOCwKKyAgICAgICAgMHgwOSwKKyAgICAgICAgMHgwQSwKKyAgICAgICAgMHgwQgorICAgIH0sCisgICAgeyAvKiBqcGVnX2h1ZmZtYW5fZGNbMV1bXSAqLworICAgICAgICAweDAwLCAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGg9MSAqLworICAgICAgICAweDAzLAorICAgICAgICAweDAxLAorICAgICAgICAweDAxLAorICAgICAgICAweDAxLAorICAgICAgICAweDAxLAorICAgICAgICAweDAxLAorICAgICAgICAweDAxLAorICAgICAgICAweDAxLAorICAgICAgICAweDAxLAorICAgICAgICAweDAxLAorICAgICAgICAweDAwLAorICAgICAgICAweDAwLAorICAgICAgICAweDAwLAorICAgICAgICAweDAwLAorICAgICAgICAweDAwLCAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGg9MTYgKi8KKworICAgICAgICAvKiBFbnRyeSBpbmRleCBmb3IgY29kZSB3aXRoCisgICAgICAgICAgICBtaW5pbXVtIGNvZGUgbGVuZ3RoICg9MiBpbiB0aGlzIGNhc2UpICovCisgICAgICAgIDB4MDAsIDB4MDEsIDB4MDIsCisgICAgICAgIDB4MDMsCisgICAgICAgIDB4MDQsCisgICAgICAgIDB4MDUsCisgICAgICAgIDB4MDYsCisgICAgICAgIDB4MDcsCisgICAgICAgIDB4MDgsCisgICAgICAgIDB4MDksCisgICAgICAgIDB4MEEsCisgICAgICAgIDB4MEIKKyAgICB9Cit9OyAvKiBqcGVnX2h1ZmZtYW5fZGMgKi8KKworc3RhdGljIGNvbnN0IHU4IGpwZWdfaHVmZm1hbl9hY1syXVsxNiArIDE2Ml0gPSB7CisgICAgeyAvKiBqcGVnX2h1ZmZtYW5fYWNbMF1bXSAqLworICAgICAgICAweDAwLCAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGg9MSAqLworICAgICAgICAweDAyLAorICAgICAgICAweDAxLAorICAgICAgICAweDAzLAorICAgICAgICAweDAzLAorICAgICAgICAweDAyLAorICAgICAgICAweDA0LAorICAgICAgICAweDAzLAorICAgICAgICAweDA1LAorICAgICAgICAweDA1LAorICAgICAgICAweDA0LAorICAgICAgICAweDA0LAorICAgICAgICAweDAwLAorICAgICAgICAweDAwLAorICAgICAgICAweDAxLAorICAgICAgICAweDdELCAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGg9MTYgKi8KKworICAgICAgICAvKiBFbnRyeSBpbmRleCBmb3IgY29kZSB3aXRoCisgICAgICAgICAgICBtaW5pbXVtIGNvZGUgbGVuZ3RoICg9MiBpbiB0aGlzIGNhc2UpICovCisgICAgICAgIDB4MDEsIDB4MDIsCisgICAgICAgIDB4MDMsCisgICAgICAgIDB4MDAsIDB4MDQsIDB4MTEsCisgICAgICAgIDB4MDUsIDB4MTIsIDB4MjEsCisgICAgICAgIDB4MzEsIDB4NDEsCisgICAgICAgIDB4MDYsIDB4MTMsIDB4NTEsIDB4NjEsCisgICAgICAgIDB4MDcsIDB4MjIsIDB4NzEsCisgICAgICAgIDB4MTQsIDB4MzIsIDB4ODEsIDB4OTEsIDB4QTEsCisgICAgICAgIDB4MDgsIDB4MjMsIDB4NDIsIDB4QjEsIDB4QzEsCisgICAgICAgIDB4MTUsIDB4NTIsIDB4RDEsIDB4RjAsCisgICAgICAgIDB4MjQsIDB4MzMsIDB4NjIsIDB4NzIsCisgICAgICAgIDB4ODIsCisgICAgICAgIDB4MDksIDB4MEEsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksCisgICAgICAgIDB4MUEsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksCisgICAgICAgIDB4MkEsIDB4MzQsIDB4MzUsIDB4MzYsCisgICAgICAgIDB4MzcsIDB4MzgsIDB4MzksIDB4M0EsIDB4NDMsIDB4NDQsCisgICAgICAgIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksIDB4NEEsCisgICAgICAgIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsCisgICAgICAgIDB4NTcsIDB4NTgsIDB4NTksIDB4NUEsIDB4NjMsIDB4NjQsCisgICAgICAgIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsIDB4NjksIDB4NkEsCisgICAgICAgIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsCisgICAgICAgIDB4NzcsIDB4NzgsIDB4NzksIDB4N0EsIDB4ODMsIDB4ODQsCisgICAgICAgIDB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsIDB4ODksIDB4OEEsCisgICAgICAgIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsCisgICAgICAgIDB4OTYsIDB4OTcsIDB4OTgsIDB4OTksIDB4OUEsIDB4QTIsCisgICAgICAgIDB4QTMsIDB4QTQsIDB4QTUsIDB4QTYsIDB4QTcsIDB4QTgsCisgICAgICAgIDB4QTksIDB4QUEsIDB4QjIsIDB4QjMsCisgICAgICAgIDB4QjQsIDB4QjUsIDB4QjYsIDB4QjcsIDB4QjgsIDB4QjksCisgICAgICAgIDB4QkEsIDB4QzIsIDB4QzMsIDB4QzQsIDB4QzUsIDB4QzYsCisgICAgICAgIDB4QzcsIDB4QzgsIDB4QzksIDB4Q0EsCisgICAgICAgIDB4RDIsIDB4RDMsIDB4RDQsIDB4RDUsIDB4RDYsIDB4RDcsCisgICAgICAgIDB4RDgsIDB4RDksIDB4REEsIDB4RTEsIDB4RTIsIDB4RTMsCisgICAgICAgIDB4RTQsIDB4RTUsIDB4RTYsIDB4RTcsCisgICAgICAgIDB4RTgsIDB4RTksIDB4RUEsIDB4RjEsIDB4RjIsIDB4RjMsCisgICAgICAgIDB4RjQsIDB4RjUsIDB4RjYsIDB4RjcsIDB4RjgsIDB4RjksCisgICAgICAgIDB4RkEKKyAgICB9LAorICAgIHsgLyoganBlZ19odWZmbWFuX2FjWzFdW10gKi8KKyAgICAgICAgMHgwMCwgLyogbnVtYmVyIG9mIGNvZGUgbGVuZ3RoPTEgKi8KKyAgICAgICAgMHgwMiwKKyAgICAgICAgMHgwMSwKKyAgICAgICAgMHgwMiwKKyAgICAgICAgMHgwNCwKKyAgICAgICAgMHgwNCwKKyAgICAgICAgMHgwMywKKyAgICAgICAgMHgwNCwKKyAgICAgICAgMHgwNywKKyAgICAgICAgMHgwNSwKKyAgICAgICAgMHgwNCwKKyAgICAgICAgMHgwNCwKKyAgICAgICAgMHgwMCwKKyAgICAgICAgMHgwMSwKKyAgICAgICAgMHgwMiwKKyAgICAgICAgMHg3NywgLyogbnVtYmVyIG9mIGNvZGUgbGVuZ3RoPTE2ICovCisKKyAgICAgICAgLyogRW50cnkgaW5kZXggZm9yIGNvZGUgd2l0aAorICAgICAgICAgICAgbWluaW11bSBjb2RlIGxlbmd0aCAoPTIgaW4gdGhpcyBjYXNlKSAqLworICAgICAgICAweDAwLCAweDAxLAorICAgICAgICAweDAyLAorICAgICAgICAweDAzLCAweDExLAorICAgICAgICAweDA0LCAweDA1LCAweDIxLCAweDMxLAorICAgICAgICAweDA2LCAweDEyLCAweDQxLCAweDUxLAorICAgICAgICAweDA3LCAweDYxLCAweDcxLAorICAgICAgICAweDEzLCAweDIyLCAweDMyLCAweDgxLAorICAgICAgICAweDA4LCAweDE0LCAweDQyLCAweDkxLCAweEExLCAweEIxLCAweEMxLAorICAgICAgICAweDA5LCAweDIzLCAweDMzLCAweDUyLCAweEYwLAorICAgICAgICAweDE1LCAweDYyLCAweDcyLCAweEQxLAorICAgICAgICAweDBBLCAweDE2LCAweDI0LCAweDM0LAorCisgICAgICAgIDB4RTEsCisgICAgICAgIDB4MjUsIDB4RjEsCisgICAgICAgIDB4MTcsIDB4MTgsIDB4MTksIDB4MUEsIDB4MjYsIDB4MjcsCisgICAgICAgIDB4MjgsIDB4MjksIDB4MkEsIDB4MzUsIDB4MzYsIDB4MzcsCisgICAgICAgIDB4MzgsIDB4MzksIDB4M0EsIDB4NDMsCisgICAgICAgIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksCisgICAgICAgIDB4NEEsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsCisgICAgICAgIDB4NTgsIDB4NTksIDB4NUEsIDB4NjMsCisgICAgICAgIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsIDB4NjksCisgICAgICAgIDB4NkEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsCisgICAgICAgIDB4NzgsIDB4NzksIDB4N0EsIDB4ODIsCisgICAgICAgIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsCisgICAgICAgIDB4ODksIDB4OEEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsCisgICAgICAgIDB4OTYsIDB4OTcsIDB4OTgsIDB4OTksCisgICAgICAgIDB4OUEsIDB4QTIsIDB4QTMsIDB4QTQsIDB4QTUsIDB4QTYsCisgICAgICAgIDB4QTcsIDB4QTgsIDB4QTksIDB4QUEsIDB4QjIsIDB4QjMsCisgICAgICAgIDB4QjQsIDB4QjUsIDB4QjYsIDB4QjcsCisgICAgICAgIDB4QjgsIDB4QjksIDB4QkEsIDB4QzIsIDB4QzMsIDB4QzQsCisgICAgICAgIDB4QzUsIDB4QzYsIDB4QzcsIDB4QzgsIDB4QzksIDB4Q0EsCisgICAgICAgIDB4RDIsIDB4RDMsIDB4RDQsIDB4RDUsCisgICAgICAgIDB4RDYsIDB4RDcsIDB4RDgsIDB4RDksIDB4REEsIDB4RTIsCisgICAgICAgIDB4RTMsIDB4RTQsIDB4RTUsIDB4RTYsIDB4RTcsIDB4RTgsCisgICAgICAgIDB4RTksIDB4RUEsIDB4RjIsIDB4RjMsCisgICAgICAgIDB4RjQsIDB4RjUsIDB4RjYsIDB4RjcsIDB4RjgsIDB4RjksIDB4RkEKKyAgICB9Cit9OyAvKiBqcGVnX2h1ZmZtYW5fYWMgKi8KKworc3RhdGljIHU2NCB0aW1lX2NudCA9IDA7CisKK3N0YXRpYyBpbnQgZW5jX2RtYV9idWZfZ2V0X3BoeXMoc3RydWN0IGVuY19kbWFfY2ZnICpjZmcsIHVuc2lnbmVkIGxvbmcgKmFkZHIpOworc3RhdGljIHZvaWQgZW5jX2RtYV9idWZfdW5tYXAoc3RydWN0IGVuY19kbWFfY2ZnICpjZmcpOworCitzdGF0aWMgdm9pZCBkdW1wX3JlcXVzdChzdHJ1Y3QganBlZ2VuY19yZXF1ZXN0X3MgKnJlcXVlc3QpIHsKKyAgICBqZW5jX3ByKExPR19ERUJVRywgImpwZWdlbmM6IGR1bXAgcmVxdWVzdCBzdGFydFxuIik7CisgICAgamVuY19wcihMT0dfREVCVUcsICJzcmM9JXVcbiIsIHJlcXVlc3QtPnNyYyk7CisgICAgamVuY19wcihMT0dfREVCVUcsICJlbmNvZGVyX3dpZHRoPSV1XG4iLCByZXF1ZXN0LT5lbmNvZGVyX3dpZHRoKTsKKyAgICBqZW5jX3ByKExPR19ERUJVRywgImVuY29kZXJfaGVpZ2h0PSV1XG4iLCByZXF1ZXN0LT5lbmNvZGVyX2hlaWdodCk7CisgICAgamVuY19wcihMT0dfREVCVUcsICJmcmFtZXNpemU9JXVcbiIsIHJlcXVlc3QtPmZyYW1lc2l6ZSk7CisgICAgamVuY19wcihMT0dfREVCVUcsICJqcGVnX3F1YWxpdHk9JXVcbiIsIHJlcXVlc3QtPmpwZWdfcXVhbGl0eSk7CisgICAgamVuY19wcihMT0dfREVCVUcsICJRdWFudFRhYmxlX2lkPSV1XG4iLCByZXF1ZXN0LT5RdWFudFRhYmxlX2lkKTsKKyAgICBqZW5jX3ByKExPR19ERUJVRywgImZsdXNoX2ZsYWc9JXVcbiIsIHJlcXVlc3QtPmZsdXNoX2ZsYWcpOworICAgIGplbmNfcHIoTE9HX0RFQlVHLCAiYmxvY2tfbW9kZT0ldVxuIiwgcmVxdWVzdC0+YmxvY2tfbW9kZSk7CisgICAgamVuY19wcihMT0dfREVCVUcsICJ0eXBlPSVkXG4iLCByZXF1ZXN0LT50eXBlKTsKKyAgICBqZW5jX3ByKExPR19ERUJVRywgImlucHV0X2ZtdD0lZFxuIiwgcmVxdWVzdC0+aW5wdXRfZm10KTsKKyAgICBqZW5jX3ByKExPR19ERUJVRywgIm91dHB1dF9mbXQ9JWRcbiIsIHJlcXVlc3QtPm91dHB1dF9mbXQpOworCisgICAgamVuY19wcihMT0dfREVCVUcsICJ5X29mZj0ldVxuIiwgcmVxdWVzdC0+eV9vZmYpOworICAgIGplbmNfcHIoTE9HX0RFQlVHLCAidV9vZmY9JXVcbiIsIHJlcXVlc3QtPnVfb2ZmKTsKKyAgICBqZW5jX3ByKExPR19ERUJVRywgInZfb2ZmPSV1XG4iLCByZXF1ZXN0LT52X29mZik7CisgICAgamVuY19wcihMT0dfREVCVUcsICJ5X3N0cmlkZT0ldVxuIiwgcmVxdWVzdC0+eV9zdHJpZGUpOworICAgIGplbmNfcHIoTE9HX0RFQlVHLCAidV9zdHJpZGU9JXVcbiIsIHJlcXVlc3QtPnVfc3RyaWRlKTsKKyAgICBqZW5jX3ByKExPR19ERUJVRywgInZfc3RyaWRlPSV1XG4iLCByZXF1ZXN0LT52X3N0cmlkZSk7CisgICAgamVuY19wcihMT0dfREVCVUcsICJoX3N0cmlkZT0ldVxuIiwgcmVxdWVzdC0+aF9zdHJpZGUpOworICAgIGplbmNfcHIoTE9HX0RFQlVHLCAianBlZ2VuYzogZHVtcCByZXF1ZXN0IGVuZFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGNhbnZhc19jb25maWdfcHJveHkodTMyIGluZGV4LCB1bG9uZyBhZGRyLCB1MzIgd2lkdGgsIHUzMiBoZWlnaHQsCisJCSAgIHUzMiB3cmFwLCB1MzIgYmxrbW9kZSkgeworCXVuc2lnbmVkIGxvbmcgZGF0YWhfdGVtcCwgZGF0YWxfdGVtcDsKKworCWlmICghaXNfc3VwcG9ydF92ZGVjX2NhbnZhcygpKSB7CisJCWNhbnZhc19jb25maWcoaW5kZXgsIGFkZHIsIHdpZHRoLCBoZWlnaHQsIHdyYXAsIGJsa21vZGUpOworCX0gZWxzZSB7CisjaWYgMQorCQl1bG9uZyBzdGFydF9hZGRyID0gYWRkciA+PiAzOworCQl1MzIgY2F2X3dpZHRoID0gKCgod2lkdGggKyAzMSk+PjUpPDwyKTsKKwkJdTMyIGNhdl9oZWlnaHQgPSBoZWlnaHQ7CisJCXUzMiB4X3dyYXBfZW4gPSAwOworCQl1MzIgeV93cmFwX2VuID0gMDsKKwkJdTMyIGJsa19tb2RlID0gMDsvL2Jsa21vZGU7CisJCXUzMiBjYXZfZW5kaWFuID0gMDsKKworCQlkYXRhbF90ZW1wID0gKHN0YXJ0X2FkZHIgJiAweDFmZmZmZmZmKSB8CisJCQkJCSgoY2F2X3dpZHRoICYgMHg3ICkgPDwgMjkgKTsKKworCQlkYXRhaF90ZW1wID0gKChjYXZfd2lkdGggID4+IDMpICYgMHgxZmYpIHwKKwkJCQkJKChjYXZfaGVpZ2h0ICYgMHgxZmZmKSA8PDkgKSB8CisJCQkJCSgoeF93cmFwX2VuICYgMSkgPDwgMjIgKSB8CisJCQkJCSgoeV93cmFwX2VuICYgMSkgPDwgMjMpIHwKKwkJCQkJKChibGtfbW9kZSAmIDB4MykgPDwgMjQpIHwKKwkJCQkJKCBjYXZfZW5kaWFuIDw8IDI2KTsKKworI2Vsc2UKKwkJdTMyIGVuZGlhbiA9IDA7CisJCXUzMiBhZGRyX2JpdHNfbCA9ICgoKChhZGRyICsgNykgPj4gMykgJiBDQU5WQVNfQUREUl9MTUFTSykgPDwgQ0FWX1dBRERSX0xCSVQpOworCQl1MzIgd2lkdGhfbCAgICAgPSAoKCgod2lkdGggICAgKyA3KSA+PiAzKSAmIENBTlZBU19XSURUSF9MTUFTSykgPDwgQ0FWX1dJRFRIX0xCSVQpOworCQl1MzIgd2lkdGhfaCAgICAgPSAoKCgod2lkdGggICAgKyA3KSA+PiAzKSA+PiBDQU5WQVNfV0lEVEhfTFdJRCkgPDwgQ0FWX1dJRFRIX0hCSVQpOworCQl1MzIgaGVpZ2h0X2ggICAgPSAoaGVpZ2h0ICYgQ0FOVkFTX0hFSUdIVF9NQVNLKSA8PCBDQVZfSEVJR0hUX0hCSVQ7CisJCXUzMiBibGttb2RfaCAgICA9IChibGttb2RlICYgQ0FOVkFTX0JMS01PREVfTUFTSykgPDwgQ0FWX0JMS01PREVfSEJJVDsKKwkJdTMyIHN3aXRjaF9iaXRzX2N0bCA9IChlbmRpYW4gJiAweGYpIDw8IENBVl9FTkRJQU5fSEJJVDsKKwkJdTMyIHdyYXBfaCAgICAgID0gKDAgPDwgMjMpOworCQlkYXRhbF90ZW1wID0gYWRkcl9iaXRzX2wgfCB3aWR0aF9sOworCQlkYXRhaF90ZW1wID0gd2lkdGhfaCB8IGhlaWdodF9oIHwgd3JhcF9oIHwgYmxrbW9kX2ggfCBzd2l0Y2hfYml0c19jdGw7CisjZW5kaWYKKwkJLyoKKwkJaWYgKGNvcmUgPT0gVkRFQ18xKSB7CisJCQlXUklURV9WUkVHKE1ERUNfQ0FWX0NGRzAsIDApOwkvL1swXWNhbnZfbW9kZSwgYnkgZGVmYXVsdCBpcyBub24tY2Fudi1tb2RlCisJCQlXUklURV9WUkVHKE1ERUNfQ0FWX0xVVF9EQVRBTCwgZGF0YWxfdGVtcCk7CisJCQlXUklURV9WUkVHKE1ERUNfQ0FWX0xVVF9EQVRBSCwgZGF0YWhfdGVtcCk7CisJCQlXUklURV9WUkVHKE1ERUNfQ0FWX0xVVF9BRERSLCAgaW5kZXgpOworCQl9IGVsc2UgaWYgKGNvcmUgPT0gVkRFQ19IQ09ERUMpICovIHsKKwkJCVdSSVRFX0hSRUcoSENPREVDX01ERUNfQ0FWX0NGRzAsIDApOwkvL1swXWNhbnZfbW9kZSwgYnkgZGVmYXVsdCBpcyBub24tY2Fudi1tb2RlCisJCQlXUklURV9IUkVHKEhDT0RFQ19NREVDX0NBVl9MVVRfREFUQUwsIGRhdGFsX3RlbXApOworCQkJV1JJVEVfSFJFRyhIQ09ERUNfTURFQ19DQVZfTFVUX0RBVEFILCBkYXRhaF90ZW1wKTsKKwkJCVdSSVRFX0hSRUcoSENPREVDX01ERUNfQ0FWX0xVVF9BRERSLCAgaW5kZXgpOworCQl9CisKKwkJLyoKKwkJY2F2X2x1dF9pbmZvX3N0b3JlKGluZGV4LCBhZGRyLCB3aWR0aCwgaGVpZ2h0LCB3cmFwLCBibGttb2RlLCAwKTsKKworCQlpZiAodmRlY19nZXRfZGVidWcoKSAmIDB4NDAwMDAwMDApIHsKKwkJCXByX2luZm8oIiglcyAlMmQpIGFkZHI6ICVseCwgd2lkdGg6ICVkLCBoZWlnaHQ6ICVkLCBibGttOiAlZCwgZW5kaWFuOiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgaW5kZXgsIGFkZHIsIHdpZHRoLCBoZWlnaHQsIGJsa21vZGUsIDApOworCQkJcHJfaW5mbygiZGF0YShoLGwpOiAweCU4bHgsIDB4JThseFxuIiwgZGF0YWhfdGVtcCwgZGF0YWxfdGVtcCk7CisJICAgIH0KKwkgICAgKi8KKwl9Cit9CisKK3N0YXRpYyB1NjQganBlZ2VuY190aW1lX2NvdW50X3N0YXJ0KHZvaWQpCit7CisgICAgLy9zdHJ1Y3QgdGltZXZhbCAgICB0djsKKworICAgIC8vZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisgICAgLy9lZmlfZ2V0dGltZW9mZGF5KCZ0dik7CisgICAgLy9yZXR1cm4gZGl2NjRfdTY0KHRpbWV2YWxfdG9fbnMoJnR2KSwgMTAwMCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGpwZWdlbmNfdGltZV9jb3VudF9lbmQodTY0ICp0aW1lKQoreworICAgIGplbmNfcHIoTE9HX0lORk8sICJ0aGUgZW5jb2RlciB0YWtlcyB0aW1lICVsbGQgdXMuXG4iLAorICAgICAgICBqcGVnZW5jX3RpbWVfY291bnRfc3RhcnQoKSAtICp0aW1lKTsKKyAgICAqdGltZSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgaXNfb3ZlcnNpemUoaW50IHcsIGludCBoLCBpbnQgbWF4KQoreworICAgIGlmICh3IDwgMCB8fCBoIDwgMCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAoaCAhPSAwICYmICh3ID4gbWF4IC8gaCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdHJ1Y3QganBlZ19lbmNfY2xrcyB7CisgICAgc3RydWN0IGNsayAqZG9zX2NsazsKKyAgICBzdHJ1Y3QgY2xrICpkb3NfYXBiX2NsazsKKyAgICBzdHJ1Y3QgY2xrICpqcGVnX2VuY19jbGs7CisKK307CisKK3N0YXRpYyBzdHJ1Y3QganBlZ19lbmNfY2xrcyBnX2pwZWdfZW5jX2Nsa3M7CisKK3N0YXRpYyB2b2lkIGpwZWdfZW5jX2Nsa19wdXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QganBlZ19lbmNfY2xrcyAqY2xrcykKK3sKKyAgICBpZiAoIShjbGtzLT5qcGVnX2VuY19jbGsgPT0gTlVMTCB8fCBJU19FUlIoY2xrcy0+anBlZ19lbmNfY2xrKSkpCisgICAgICAgIGRldm1fY2xrX3B1dChkZXYsIGNsa3MtPmpwZWdfZW5jX2Nsayk7CisKKyAgICBpZiAoIShjbGtzLT5kb3NfYXBiX2NsayA9PSBOVUxMIHx8IElTX0VSUihjbGtzLT5kb3NfYXBiX2NsaykpKQorICAgICAgICBkZXZtX2Nsa19wdXQoZGV2LCBjbGtzLT5kb3NfYXBiX2Nsayk7CisKKyAgICBpZiAoIShjbGtzLT5kb3NfY2xrID09IE5VTEwgfHwgSVNfRVJSKGNsa3MtPmRvc19jbGspKSkKKyAgICAgICAgZGV2bV9jbGtfcHV0KGRldiwgY2xrcy0+ZG9zX2Nsayk7Cit9CisKK3N0YXRpYyBpbnQganBlZ19lbmNfY2xrX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBqcGVnX2VuY19jbGtzICpjbGtzKQoreworICAgIC8vaW50IHJldCA9IDA7CisKKyAgICBjbGtzLT5kb3NfY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgImNsa19kb3MiKTsKKyAgICBpZiAoSVNfRVJSKGNsa3MtPmRvc19jbGspKSB7CisgICAgICAgIGplbmNfcHIoTE9HX0VSUk9SLCAiY2Fubm90IGdldCBjbGtfZG9zIGNsb2NrXG4iKTsKKyAgICAgICAgY2xrcy0+ZG9zX2NsayA9IE5VTEw7CisgICAgICAgIC8vcmV0ID0gLUVOT0VOVDsKKyAgICAgICAgLy9nb3RvIGVycjsKKyAgICB9IGVsc2UKKyAgICAgICAgcHJfZXJyKCJqcGVnX2VuY19jbGtfZ2V0OiBnZXQgY2xrX2RvcyBPS1xuIik7CisKKyAgICBjbGtzLT5kb3NfYXBiX2NsayA9IGRldm1fY2xrX2dldChkZXYsICJjbGtfYXBiX2RvcyIpOworICAgIGlmIChJU19FUlIoY2xrcy0+ZG9zX2FwYl9jbGspKSB7CisgICAgICAgIGplbmNfcHIoTE9HX0VSUk9SLCAiY2Fubm90IGdldCBjbGtfYXBiX2RvcyBjbG9ja1xuIik7CisgICAgICAgIGNsa3MtPmRvc19hcGJfY2xrID0gTlVMTDsKKyAgICAgICAgLy9yZXQgPSAtRU5PRU5UOworICAgICAgICAvL2dvdG8gZXJyOworICAgIH0gZWxzZQorICAgICAgICBwcl9lcnIoImpwZWdfZW5jX2Nsa19nZXQ6IGdldCBjbGtfYXBiX2RvcyBPS1xuIik7CisKKyAgICBjbGtzLT5qcGVnX2VuY19jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAiY2xrX2pwZWdfZW5jIik7CisgICAgaWYgKElTX0VSUihjbGtzLT5qcGVnX2VuY19jbGspKSB7CisgICAgICAgIGplbmNfcHIoTE9HX0VSUk9SLCAiY2Fubm90IGdldCBjbGtfanBlZ19lbmMgY2xvY2tcbiIpOworICAgICAgICBjbGtzLT5qcGVnX2VuY19jbGsgPSBOVUxMOworICAgICAgICAvL3JldCA9IC1FTk9FTlQ7CisgICAgICAgIC8vZ290byBlcnI7CisgICAgfSBlbHNlCisgICAgICAgIHByX2VycigianBlZ19lbmNfY2xrX2dldDogZ2V0IGNsa19qcGVnX2VuYyBPS1xuIik7CisKKyAgICByZXR1cm4gMDsKKy8vZXJyOgorLy8gICAganBlZ19lbmNfY2xrX3B1dChkZXYsIGNsa3MpOworCisvLyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBqcGVnX2VuY19jbGtfZW5hYmxlKHN0cnVjdCBqcGVnX2VuY19jbGtzICpjbGtzLCB1MzIgZnJxKQoreworICAgIGlmIChjbGtzLT5kb3NfY2xrICE9IE5VTEwpIHsKKyAgICAgICAgY2xrX3NldF9yYXRlKGNsa3MtPmRvc19jbGssIDQwMCAqIE1Ieik7CisgICAgICAgIGNsa19wcmVwYXJlX2VuYWJsZShjbGtzLT5kb3NfY2xrKTsKKyAgICAgICAgcHJfZXJyKCJkb3MgY2xrOiAlbGRcbiIsIGNsa19nZXRfcmF0ZShjbGtzLT5kb3NfY2xrKSk7CisgICAgfQorCisgICAgaWYgKGNsa3MtPmRvc19hcGJfY2xrICE9IE5VTEwpIHsKKyAgICAgICAgY2xrX3NldF9yYXRlKGNsa3MtPmRvc19hcGJfY2xrLCA0MDAgKiBNSHopOworICAgICAgICBjbGtfcHJlcGFyZV9lbmFibGUoY2xrcy0+ZG9zX2FwYl9jbGspOworICAgICAgICBwcl9lcnIoImFwYiBjbGs6ICVsZFxuIiwgY2xrX2dldF9yYXRlKGNsa3MtPmRvc19hcGJfY2xrKSk7CisgICAgfQorCisgICAgaWYgKGNsa3MtPmpwZWdfZW5jX2NsayAhPSBOVUxMKSB7CisgICAgICAgIGNsa19zZXRfcmF0ZShjbGtzLT5qcGVnX2VuY19jbGssIDY2NjY2NjY2Nik7CisgICAgICAgIGNsa19wcmVwYXJlX2VuYWJsZShjbGtzLT5qcGVnX2VuY19jbGspOworICAgICAgICBwcl9lcnIoImpwZWdlbmMgY2xrOiAlbGRcbiIsIGNsa19nZXRfcmF0ZShjbGtzLT5qcGVnX2VuY19jbGspKTsKKyAgICB9CisKKyAgICAvKgorICAgIGNsa19wcmVwYXJlX2VuYWJsZShjbGtzLT5kb3NfY2xrKTsKKyAgICBjbGtfcHJlcGFyZV9lbmFibGUoY2xrcy0+ZG9zX2FwYl9jbGspOworICAgIGNsa19wcmVwYXJlX2VuYWJsZShjbGtzLT5qcGVnX2VuY19jbGspOworICAgICovCisgICAgcHJfZXJyKCJkb3M6ICVsZCwgZG9zX2FwYjogJWxkLCBqcGVnIGNsazogJWxkXG4iLAorICAgICAgICBjbGtfZ2V0X3JhdGUoY2xrcy0+ZG9zX2NsayksCisgICAgICAgIGNsa19nZXRfcmF0ZShjbGtzLT5kb3NfYXBiX2NsayksCisgICAgICAgIGNsa19nZXRfcmF0ZShjbGtzLT5qcGVnX2VuY19jbGspKTsKKworfQorCitzdGF0aWMgdm9pZCBqcGVnX2VuY19jbGtfZGlzYWJsZShzdHJ1Y3QganBlZ19lbmNfY2xrcyAqY2xrcykKK3sKKyAgICBwcl9lcnIoInNldCBqcGVnX2VuY19jbGsgcmF0ZSB0byAwXG4iKTsKKyAgICBjbGtfc2V0X3JhdGUoY2xrcy0+anBlZ19lbmNfY2xrLCAwKTsKKyAgICBjbGtfZGlzYWJsZV91bnByZXBhcmUoY2xrcy0+anBlZ19lbmNfY2xrKTsKKworICAgIC8vY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGNsa3MtPmRvc19hcGJfY2xrKTsKKyAgICAvL2Nsa19kaXNhYmxlX3VucHJlcGFyZShjbGtzLT5kb3NfY2xrKTsKK30KKworc3RhdGljIHZvaWQgZG1hX2ZsdXNoKHUzMiBidWZfc3RhcnQsIHUzMiBidWZfc2l6ZSk7CisKK3N0YXRpYyBzMzIgemlnemFnKHMzMiBpKQoreworICAgIHMzMiB6aWd6YWdfaTsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIHppZ3phZ19pID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICB6aWd6YWdfaSA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgemlnemFnX2kgPSA4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIHppZ3phZ19pID0gMTY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgemlnemFnX2kgPSA5OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICAgIHppZ3phZ19pID0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgICB6aWd6YWdfaSA9IDM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgICAgemlnemFnX2kgPSAxMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgICB6aWd6YWdfaSA9IDE3OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDk6CisgICAgICAgIHppZ3phZ19pID0gMjQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTA6CisgICAgICAgIHppZ3phZ19pID0gMzI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTE6CisgICAgICAgIHppZ3phZ19pID0gMjU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTI6CisgICAgICAgIHppZ3phZ19pID0gMTg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTM6CisgICAgICAgIHppZ3phZ19pID0gMTE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTQ6CisgICAgICAgIHppZ3phZ19pID0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNToKKyAgICAgICAgemlnemFnX2kgPSA1OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE2OgorICAgICAgICB6aWd6YWdfaSA9IDEyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE3OgorICAgICAgICB6aWd6YWdfaSA9IDE5OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE4OgorICAgICAgICB6aWd6YWdfaSA9IDI2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE5OgorICAgICAgICB6aWd6YWdfaSA9IDMzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDIwOgorICAgICAgICB6aWd6YWdfaSA9IDQwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDIxOgorICAgICAgICB6aWd6YWdfaSA9IDQ4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDIyOgorICAgICAgICB6aWd6YWdfaSA9IDQxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDIzOgorICAgICAgICB6aWd6YWdfaSA9IDM0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI0OgorICAgICAgICB6aWd6YWdfaSA9IDI3OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI1OgorICAgICAgICB6aWd6YWdfaSA9IDIwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI2OgorICAgICAgICB6aWd6YWdfaSA9IDEzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI3OgorICAgICAgICB6aWd6YWdfaSA9IDY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjg6CisgICAgICAgIHppZ3phZ19pID0gNzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOToKKyAgICAgICAgemlnemFnX2kgPSAxNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzMDoKKyAgICAgICAgemlnemFnX2kgPSAyMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzMToKKyAgICAgICAgemlnemFnX2kgPSAyODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzMjoKKyAgICAgICAgemlnemFnX2kgPSAzNTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzMzoKKyAgICAgICAgemlnemFnX2kgPSA0MjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzNDoKKyAgICAgICAgemlnemFnX2kgPSA0OTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzNToKKyAgICAgICAgemlnemFnX2kgPSA1NjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzNjoKKyAgICAgICAgemlnemFnX2kgPSA1NzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzNzoKKyAgICAgICAgemlnemFnX2kgPSA1MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzODoKKyAgICAgICAgemlnemFnX2kgPSA0MzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOToKKyAgICAgICAgemlnemFnX2kgPSAzNjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0MDoKKyAgICAgICAgemlnemFnX2kgPSAyOTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0MToKKyAgICAgICAgemlnemFnX2kgPSAyMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0MjoKKyAgICAgICAgemlnemFnX2kgPSAxNTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0MzoKKyAgICAgICAgemlnemFnX2kgPSAyMzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0NDoKKyAgICAgICAgemlnemFnX2kgPSAzMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0NToKKyAgICAgICAgemlnemFnX2kgPSAzNzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0NjoKKyAgICAgICAgemlnemFnX2kgPSA0NDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0NzoKKyAgICAgICAgemlnemFnX2kgPSA1MTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0ODoKKyAgICAgICAgemlnemFnX2kgPSA1ODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OToKKyAgICAgICAgemlnemFnX2kgPSA1OTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1MDoKKyAgICAgICAgemlnemFnX2kgPSA1MjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1MToKKyAgICAgICAgemlnemFnX2kgPSA0NTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1MjoKKyAgICAgICAgemlnemFnX2kgPSAzODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1MzoKKyAgICAgICAgemlnemFnX2kgPSAzMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1NDoKKyAgICAgICAgemlnemFnX2kgPSAzOTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1NToKKyAgICAgICAgemlnemFnX2kgPSA0NjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1NjoKKyAgICAgICAgemlnemFnX2kgPSA1MzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1NzoKKyAgICAgICAgemlnemFnX2kgPSA2MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1ODoKKyAgICAgICAgemlnemFnX2kgPSA2MTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OToKKyAgICAgICAgemlnemFnX2kgPSA1NDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2MDoKKyAgICAgICAgemlnemFnX2kgPSA0NzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2MToKKyAgICAgICAgemlnemFnX2kgPSA1NTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2MjoKKyAgICAgICAgemlnemFnX2kgPSA2MjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgemlnemFnX2kgPSA2MzsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB6aWd6YWdfaTsKK30KKworLyogUGVyZm9ybSBjb252ZXJ0aW9uIGZyb20gUSB0byAxL1EgKi8KK3UzMiByZWNpcHJvY2FsKHUzMiBxKQoreworICAgIHUzMiBxX3JlY2lwOworCisgICAgLyogNjU1MzUgKiAoMS9xKSAqLworICAgIHN3aXRjaCAocSkgeworICAgIGNhc2UgMDoKKyAgICAgICAgcV9yZWNpcCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgcV9yZWNpcCA9IDY1NTM1OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHFfcmVjaXAgPSAzMjc2ODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBxX3JlY2lwID0gMjE4NDU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgcV9yZWNpcCA9IDE2Mzg0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICAgIHFfcmVjaXAgPSAxMzEwNzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgICBxX3JlY2lwID0gMTA5MjM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgICAgcV9yZWNpcCA9IDkzNjI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgICAgcV9yZWNpcCA9IDgxOTI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgOToKKyAgICAgICAgcV9yZWNpcCA9IDcyODI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTA6CisgICAgICAgIHFfcmVjaXAgPSA2NTU0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDExOgorICAgICAgICBxX3JlY2lwID0gNTk1ODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjoKKyAgICAgICAgcV9yZWNpcCA9IDU0NjE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTM6CisgICAgICAgIHFfcmVjaXAgPSA1MDQxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE0OgorICAgICAgICBxX3JlY2lwID0gNDY4MTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNToKKyAgICAgICAgcV9yZWNpcCA9IDQzNjk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTY6CisgICAgICAgIHFfcmVjaXAgPSA0MDk2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE3OgorICAgICAgICBxX3JlY2lwID0gMzg1NTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxODoKKyAgICAgICAgcV9yZWNpcCA9IDM2NDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTk6CisgICAgICAgIHFfcmVjaXAgPSAzNDQ5OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDIwOgorICAgICAgICBxX3JlY2lwID0gMzI3NzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMToKKyAgICAgICAgcV9yZWNpcCA9IDMxMjE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjI6CisgICAgICAgIHFfcmVjaXAgPSAyOTc5OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDIzOgorICAgICAgICBxX3JlY2lwID0gMjg0OTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDoKKyAgICAgICAgcV9yZWNpcCA9IDI3MzE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjU6CisgICAgICAgIHFfcmVjaXAgPSAyNjIxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI2OgorICAgICAgICBxX3JlY2lwID0gMjUyMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyNzoKKyAgICAgICAgcV9yZWNpcCA9IDI0Mjc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjg6CisgICAgICAgIHFfcmVjaXAgPSAyMzQxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI5OgorICAgICAgICBxX3JlY2lwID0gMjI2MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzMDoKKyAgICAgICAgcV9yZWNpcCA9IDIxODU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzE6CisgICAgICAgIHFfcmVjaXAgPSAyMTE0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDMyOgorICAgICAgICBxX3JlY2lwID0gMjA0ODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzMzoKKyAgICAgICAgcV9yZWNpcCA9IDE5ODY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzQ6CisgICAgICAgIHFfcmVjaXAgPSAxOTI4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM1OgorICAgICAgICBxX3JlY2lwID0gMTg3MjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzNjoKKyAgICAgICAgcV9yZWNpcCA9IDE4MjA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzc6CisgICAgICAgIHFfcmVjaXAgPSAxNzcxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM4OgorICAgICAgICBxX3JlY2lwID0gMTcyNTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOToKKyAgICAgICAgcV9yZWNpcCA9IDE2ODA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDA6CisgICAgICAgIHFfcmVjaXAgPSAxNjM4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQxOgorICAgICAgICBxX3JlY2lwID0gMTU5ODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0MjoKKyAgICAgICAgcV9yZWNpcCA9IDE1NjA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDM6CisgICAgICAgIHFfcmVjaXAgPSAxNTI0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ0OgorICAgICAgICBxX3JlY2lwID0gMTQ4OTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0NToKKyAgICAgICAgcV9yZWNpcCA9IDE0NTY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDY6CisgICAgICAgIHFfcmVjaXAgPSAxNDI1OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ3OgorICAgICAgICBxX3JlY2lwID0gMTM5NDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0ODoKKyAgICAgICAgcV9yZWNpcCA9IDEzNjU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDk6CisgICAgICAgIHFfcmVjaXAgPSAxMzM3OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDUwOgorICAgICAgICBxX3JlY2lwID0gMTMxMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1MToKKyAgICAgICAgcV9yZWNpcCA9IDEyODU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNTI6CisgICAgICAgIHFfcmVjaXAgPSAxMjYwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDUzOgorICAgICAgICBxX3JlY2lwID0gMTIzNzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1NDoKKyAgICAgICAgcV9yZWNpcCA9IDEyMTQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNTU6CisgICAgICAgIHFfcmVjaXAgPSAxMTkyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDU2OgorICAgICAgICBxX3JlY2lwID0gMTE3MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1NzoKKyAgICAgICAgcV9yZWNpcCA9IDExNTA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNTg6CisgICAgICAgIHFfcmVjaXAgPSAxMTMwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDU5OgorICAgICAgICBxX3JlY2lwID0gMTExMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2MDoKKyAgICAgICAgcV9yZWNpcCA9IDEwOTI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNjE6CisgICAgICAgIHFfcmVjaXAgPSAxMDc0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDYyOgorICAgICAgICBxX3JlY2lwID0gMTA1NzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2MzoKKyAgICAgICAgcV9yZWNpcCA9IDEwNDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNjQ6CisgICAgICAgIHFfcmVjaXAgPSAxMDI0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDY1OgorICAgICAgICBxX3JlY2lwID0gMTAwODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2NjoKKyAgICAgICAgcV9yZWNpcCA9IDk5MzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2NzoKKyAgICAgICAgcV9yZWNpcCA9IDk3ODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2ODoKKyAgICAgICAgcV9yZWNpcCA9IDk2NDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2OToKKyAgICAgICAgcV9yZWNpcCA9IDk1MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA3MDoKKyAgICAgICAgcV9yZWNpcCA9IDkzNjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA3MToKKyAgICAgICAgcV9yZWNpcCA9IDkyMzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA3MjoKKyAgICAgICAgcV9yZWNpcCA9IDkxMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA3MzoKKyAgICAgICAgcV9yZWNpcCA9IDg5ODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA3NDoKKyAgICAgICAgcV9yZWNpcCA9IDg4NjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA3NToKKyAgICAgICAgcV9yZWNpcCA9IDg3NDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA3NjoKKyAgICAgICAgcV9yZWNpcCA9IDg2MjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA3NzoKKyAgICAgICAgcV9yZWNpcCA9IDg1MTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA3ODoKKyAgICAgICAgcV9yZWNpcCA9IDg0MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA3OToKKyAgICAgICAgcV9yZWNpcCA9IDgzMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4MDoKKyAgICAgICAgcV9yZWNpcCA9IDgxOTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4MToKKyAgICAgICAgcV9yZWNpcCA9IDgwOTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4MjoKKyAgICAgICAgcV9yZWNpcCA9IDc5OTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4MzoKKyAgICAgICAgcV9yZWNpcCA9IDc5MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4NDoKKyAgICAgICAgcV9yZWNpcCA9IDc4MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4NToKKyAgICAgICAgcV9yZWNpcCA9IDc3MTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4NjoKKyAgICAgICAgcV9yZWNpcCA9IDc2MjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4NzoKKyAgICAgICAgcV9yZWNpcCA9IDc1MzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4ODoKKyAgICAgICAgcV9yZWNpcCA9IDc0NTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4OToKKyAgICAgICAgcV9yZWNpcCA9IDczNjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA5MDoKKyAgICAgICAgcV9yZWNpcCA9IDcyODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA5MToKKyAgICAgICAgcV9yZWNpcCA9IDcyMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA5MjoKKyAgICAgICAgcV9yZWNpcCA9IDcxMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA5MzoKKyAgICAgICAgcV9yZWNpcCA9IDcwNTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA5NDoKKyAgICAgICAgcV9yZWNpcCA9IDY5NzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA5NToKKyAgICAgICAgcV9yZWNpcCA9IDY5MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA5NjoKKyAgICAgICAgcV9yZWNpcCA9IDY4MzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA5NzoKKyAgICAgICAgcV9yZWNpcCA9IDY3NjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA5ODoKKyAgICAgICAgcV9yZWNpcCA9IDY2OTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA5OToKKyAgICAgICAgcV9yZWNpcCA9IDY2MjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDA6CisgICAgICAgIHFfcmVjaXAgPSA2NTU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTAxOgorICAgICAgICBxX3JlY2lwID0gNjQ5OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDEwMjoKKyAgICAgICAgcV9yZWNpcCA9IDY0MzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDM6CisgICAgICAgIHFfcmVjaXAgPSA2MzY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTA0OgorICAgICAgICBxX3JlY2lwID0gNjMwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDEwNToKKyAgICAgICAgcV9yZWNpcCA9IDYyNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDY6CisgICAgICAgIHFfcmVjaXAgPSA2MTg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTA3OgorICAgICAgICBxX3JlY2lwID0gNjEyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDEwODoKKyAgICAgICAgcV9yZWNpcCA9IDYwNzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDk6CisgICAgICAgIHFfcmVjaXAgPSA2MDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTEwOgorICAgICAgICBxX3JlY2lwID0gNTk2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDExMToKKyAgICAgICAgcV9yZWNpcCA9IDU5MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMTI6CisgICAgICAgIHFfcmVjaXAgPSA1ODU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTEzOgorICAgICAgICBxX3JlY2lwID0gNTgwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDExNDoKKyAgICAgICAgcV9yZWNpcCA9IDU3NTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMTU6CisgICAgICAgIHFfcmVjaXAgPSA1NzA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTE2OgorICAgICAgICBxX3JlY2lwID0gNTY1OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDExNzoKKyAgICAgICAgcV9yZWNpcCA9IDU2MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMTg6CisgICAgICAgIHFfcmVjaXAgPSA1NTU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTE5OgorICAgICAgICBxX3JlY2lwID0gNTUxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDEyMDoKKyAgICAgICAgcV9yZWNpcCA9IDU0NjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjE6CisgICAgICAgIHFfcmVjaXAgPSA1NDI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTIyOgorICAgICAgICBxX3JlY2lwID0gNTM3OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDEyMzoKKyAgICAgICAgcV9yZWNpcCA9IDUzMzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjQ6CisgICAgICAgIHFfcmVjaXAgPSA1Mjk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTI1OgorICAgICAgICBxX3JlY2lwID0gNTI0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDEyNjoKKyAgICAgICAgcV9yZWNpcCA9IDUyMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjc6CisgICAgICAgIHFfcmVjaXAgPSA1MTY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTI4OgorICAgICAgICBxX3JlY2lwID0gNTEyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDEyOToKKyAgICAgICAgcV9yZWNpcCA9IDUwODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMzA6CisgICAgICAgIHFfcmVjaXAgPSA1MDQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTMxOgorICAgICAgICBxX3JlY2lwID0gNTAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDEzMjoKKyAgICAgICAgcV9yZWNpcCA9IDQ5NjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMzM6CisgICAgICAgIHFfcmVjaXAgPSA0OTM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTM0OgorICAgICAgICBxX3JlY2lwID0gNDg5OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDEzNToKKyAgICAgICAgcV9yZWNpcCA9IDQ4NTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMzY6CisgICAgICAgIHFfcmVjaXAgPSA0ODI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTM3OgorICAgICAgICBxX3JlY2lwID0gNDc4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDEzODoKKyAgICAgICAgcV9yZWNpcCA9IDQ3NTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMzk6CisgICAgICAgIHFfcmVjaXAgPSA0NzE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTQwOgorICAgICAgICBxX3JlY2lwID0gNDY4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE0MToKKyAgICAgICAgcV9yZWNpcCA9IDQ2NTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNDI6CisgICAgICAgIHFfcmVjaXAgPSA0NjI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTQzOgorICAgICAgICBxX3JlY2lwID0gNDU4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE0NDoKKyAgICAgICAgcV9yZWNpcCA9IDQ1NTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNDU6CisgICAgICAgIHFfcmVjaXAgPSA0NTI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTQ2OgorICAgICAgICBxX3JlY2lwID0gNDQ5OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE0NzoKKyAgICAgICAgcV9yZWNpcCA9IDQ0NjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNDg6CisgICAgICAgIHFfcmVjaXAgPSA0NDM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTQ5OgorICAgICAgICBxX3JlY2lwID0gNDQwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE1MDoKKyAgICAgICAgcV9yZWNpcCA9IDQzNzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNTE6CisgICAgICAgIHFfcmVjaXAgPSA0MzQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTUyOgorICAgICAgICBxX3JlY2lwID0gNDMxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE1MzoKKyAgICAgICAgcV9yZWNpcCA9IDQyODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNTQ6CisgICAgICAgIHFfcmVjaXAgPSA0MjY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTU1OgorICAgICAgICBxX3JlY2lwID0gNDIzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE1NjoKKyAgICAgICAgcV9yZWNpcCA9IDQyMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNTc6CisgICAgICAgIHFfcmVjaXAgPSA0MTc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTU4OgorICAgICAgICBxX3JlY2lwID0gNDE1OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE1OToKKyAgICAgICAgcV9yZWNpcCA9IDQxMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjA6CisgICAgICAgIHFfcmVjaXAgPSA0MTA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTYxOgorICAgICAgICBxX3JlY2lwID0gNDA3OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE2MjoKKyAgICAgICAgcV9yZWNpcCA9IDQwNTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjM6CisgICAgICAgIHFfcmVjaXAgPSA0MDI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTY0OgorICAgICAgICBxX3JlY2lwID0gNDAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE2NToKKyAgICAgICAgcV9yZWNpcCA9IDM5NzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjY6CisgICAgICAgIHFfcmVjaXAgPSAzOTU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTY3OgorICAgICAgICBxX3JlY2lwID0gMzkyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE2ODoKKyAgICAgICAgcV9yZWNpcCA9IDM5MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjk6CisgICAgICAgIHFfcmVjaXAgPSAzODg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTcwOgorICAgICAgICBxX3JlY2lwID0gMzg2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE3MToKKyAgICAgICAgcV9yZWNpcCA9IDM4MzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNzI6CisgICAgICAgIHFfcmVjaXAgPSAzODE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTczOgorICAgICAgICBxX3JlY2lwID0gMzc5OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE3NDoKKyAgICAgICAgcV9yZWNpcCA9IDM3NzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNzU6CisgICAgICAgIHFfcmVjaXAgPSAzNzQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTc2OgorICAgICAgICBxX3JlY2lwID0gMzcyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE3NzoKKyAgICAgICAgcV9yZWNpcCA9IDM3MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNzg6CisgICAgICAgIHFfcmVjaXAgPSAzNjg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTc5OgorICAgICAgICBxX3JlY2lwID0gMzY2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE4MDoKKyAgICAgICAgcV9yZWNpcCA9IDM2NDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxODE6CisgICAgICAgIHFfcmVjaXAgPSAzNjI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTgyOgorICAgICAgICBxX3JlY2lwID0gMzYwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE4MzoKKyAgICAgICAgcV9yZWNpcCA9IDM1ODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxODQ6CisgICAgICAgIHFfcmVjaXAgPSAzNTY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTg1OgorICAgICAgICBxX3JlY2lwID0gMzU0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE4NjoKKyAgICAgICAgcV9yZWNpcCA9IDM1MjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxODc6CisgICAgICAgIHFfcmVjaXAgPSAzNTA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTg4OgorICAgICAgICBxX3JlY2lwID0gMzQ5OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE4OToKKyAgICAgICAgcV9yZWNpcCA9IDM0NzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOTA6CisgICAgICAgIHFfcmVjaXAgPSAzNDU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTkxOgorICAgICAgICBxX3JlY2lwID0gMzQzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE5MjoKKyAgICAgICAgcV9yZWNpcCA9IDM0MTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOTM6CisgICAgICAgIHFfcmVjaXAgPSAzNDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTk0OgorICAgICAgICBxX3JlY2lwID0gMzM4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE5NToKKyAgICAgICAgcV9yZWNpcCA9IDMzNjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOTY6CisgICAgICAgIHFfcmVjaXAgPSAzMzQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTk3OgorICAgICAgICBxX3JlY2lwID0gMzMzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE5ODoKKyAgICAgICAgcV9yZWNpcCA9IDMzMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOTk6CisgICAgICAgIHFfcmVjaXAgPSAzMjk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjAwOgorICAgICAgICBxX3JlY2lwID0gMzI4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDIwMToKKyAgICAgICAgcV9yZWNpcCA9IDMyNjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMDI6CisgICAgICAgIHFfcmVjaXAgPSAzMjQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjAzOgorICAgICAgICBxX3JlY2lwID0gMzIzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDIwNDoKKyAgICAgICAgcV9yZWNpcCA9IDMyMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMDU6CisgICAgICAgIHFfcmVjaXAgPSAzMjA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjA2OgorICAgICAgICBxX3JlY2lwID0gMzE4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDIwNzoKKyAgICAgICAgcV9yZWNpcCA9IDMxNzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMDg6CisgICAgICAgIHFfcmVjaXAgPSAzMTU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjA5OgorICAgICAgICBxX3JlY2lwID0gMzE0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDIxMDoKKyAgICAgICAgcV9yZWNpcCA9IDMxMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMTE6CisgICAgICAgIHFfcmVjaXAgPSAzMTE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjEyOgorICAgICAgICBxX3JlY2lwID0gMzA5OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDIxMzoKKyAgICAgICAgcV9yZWNpcCA9IDMwODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMTQ6CisgICAgICAgIHFfcmVjaXAgPSAzMDY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjE1OgorICAgICAgICBxX3JlY2lwID0gMzA1OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDIxNjoKKyAgICAgICAgcV9yZWNpcCA9IDMwMzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMTc6CisgICAgICAgIHFfcmVjaXAgPSAzMDI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjE4OgorICAgICAgICBxX3JlY2lwID0gMzAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDIxOToKKyAgICAgICAgcV9yZWNpcCA9IDI5OTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMjA6CisgICAgICAgIHFfcmVjaXAgPSAyOTg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjIxOgorICAgICAgICBxX3JlY2lwID0gMjk3OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDIyMjoKKyAgICAgICAgcV9yZWNpcCA9IDI5NTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMjM6CisgICAgICAgIHFfcmVjaXAgPSAyOTQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjI0OgorICAgICAgICBxX3JlY2lwID0gMjkzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDIyNToKKyAgICAgICAgcV9yZWNpcCA9IDI5MTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMjY6CisgICAgICAgIHFfcmVjaXAgPSAyOTA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjI3OgorICAgICAgICBxX3JlY2lwID0gMjg5OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDIyODoKKyAgICAgICAgcV9yZWNpcCA9IDI4NzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMjk6CisgICAgICAgIHFfcmVjaXAgPSAyODY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjMwOgorICAgICAgICBxX3JlY2lwID0gMjg1OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDIzMToKKyAgICAgICAgcV9yZWNpcCA9IDI4NDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMzI6CisgICAgICAgIHFfcmVjaXAgPSAyODI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjMzOgorICAgICAgICBxX3JlY2lwID0gMjgxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDIzNDoKKyAgICAgICAgcV9yZWNpcCA9IDI4MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMzU6CisgICAgICAgIHFfcmVjaXAgPSAyNzk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjM2OgorICAgICAgICBxX3JlY2lwID0gMjc4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDIzNzoKKyAgICAgICAgcV9yZWNpcCA9IDI3NzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMzg6CisgICAgICAgIHFfcmVjaXAgPSAyNzU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjM5OgorICAgICAgICBxX3JlY2lwID0gMjc0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI0MDoKKyAgICAgICAgcV9yZWNpcCA9IDI3MzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDE6CisgICAgICAgIHFfcmVjaXAgPSAyNzI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjQyOgorICAgICAgICBxX3JlY2lwID0gMjcxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI0MzoKKyAgICAgICAgcV9yZWNpcCA9IDI3MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDQ6CisgICAgICAgIHFfcmVjaXAgPSAyNjk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjQ1OgorICAgICAgICBxX3JlY2lwID0gMjY3OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI0NjoKKyAgICAgICAgcV9yZWNpcCA9IDI2NjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDc6CisgICAgICAgIHFfcmVjaXAgPSAyNjU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjQ4OgorICAgICAgICBxX3JlY2lwID0gMjY0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI0OToKKyAgICAgICAgcV9yZWNpcCA9IDI2MzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyNTA6CisgICAgICAgIHFfcmVjaXAgPSAyNjI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjUxOgorICAgICAgICBxX3JlY2lwID0gMjYxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI1MjoKKyAgICAgICAgcV9yZWNpcCA9IDI2MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyNTM6CisgICAgICAgIHFfcmVjaXAgPSAyNTk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjU0OgorICAgICAgICBxX3JlY2lwID0gMjU4OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBxX3JlY2lwID0gMjU3OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHFfcmVjaXA7Cit9IC8qIHJlY2lwcm9jYWwgKi8KKworc3RhdGljIHZvaWQgcHVzaF93b3JkKHU4ICpiYXNlLCBzMzIgKm9mZnNldCwgdTMyIHdvcmQpCit7CisgICAgdTggKnB0cjsKKyAgICBzMzIgaTsKKyAgICBzMzIgYnl0ZXMgPSAod29yZCA+PiAyNCkgJiAweGZmOworICAgIGZvciAoaSA9IGJ5dGVzIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgcHRyID0gYmFzZSArICpvZmZzZXQ7CisgICAgICAgICgqb2Zmc2V0KSsrOworICAgICAgICBpZiAoaSA9PSAwKQorICAgICAgICAgICAgKnB0ciA9IHdvcmQgJiAweGZmOworICAgICAgICBlbHNlIGlmIChpID09IDEpCisgICAgICAgICAgICAqcHRyID0gKHdvcmQgPj4gOCkgJiAweGZmOworICAgICAgICBlbHNlIGlmIChpID09IDIpCisgICAgICAgICAgICAqcHRyID0gKHdvcmQgPj4gMTYpICYgMHhmZjsKKyAgICB9Cit9CisKK3N0YXRpYyBzMzIganBlZ19xdWFsaXR5X3NjYWxpbmcoczMyIHF1YWxpdHkpCit7CisgICAgaWYgKHF1YWxpdHkgPD0gMCkKKyAgICAgICAgcXVhbGl0eSA9IDE7CisgICAgaWYgKHF1YWxpdHkgPiAxMDApCisgICAgICAgIHF1YWxpdHkgPSAxMDA7CisKKyAgICBpZiAocXVhbGl0eSA8IDUwKQorICAgICAgICBxdWFsaXR5ID0gNTAwMCAvIHF1YWxpdHk7CisgICAgZWxzZQorICAgICAgICBxdWFsaXR5ID0gMjAwIC0gcXVhbGl0eSAqIDI7CisgICAgcmV0dXJuIHF1YWxpdHk7Cit9CisKK3N0YXRpYyB2b2lkIF9jb252ZXJ0X3F1YW50X3RhYmxlKHUxNiAqcXRhYmxlLCB1MTYgKmJhc2ljX3RhYmxlLAorICAgIHMzMiBzY2FsZV9mYWN0b3IsIGJvb2wgZm9yY2VfYmFzZWxpbmUpCit7CisgICAgczMyIGkgPSAwOworICAgIHMzMiB0ZW1wOworICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7CisgICAgICAgIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0MxKSB7CisgICAgICAgICAgICBpZiAodXNlX3F1YWxpdHkpIHsKKyAgICAgICAgICAgICAgICAvL2plbmNfcHIoTE9HX0FMTCwgImMxIHVzaW5nIHF1YWxpdHkgZmFjdG9yICVkXG4iLCBzY2FsZV9mYWN0b3IpOworICAgICAgICAgICAgICAgIHRlbXAgPSAoKHMzMiliYXNpY190YWJsZVtpXSAqIHNjYWxlX2ZhY3RvciArIDUwKSAvIDEwMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy9qZW5jX3ByKExPR19JTkZPLCAiYzEgaWdub3JlIHF1YWxpdHkgZmFjdG9yXG4iKTsKKyAgICAgICAgICAgICAgICB0ZW1wID0gKHMzMiliYXNpY190YWJsZVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfWVsc2UKKyAgICAgICAgICAgIHRlbXAgPSAoKHMzMiliYXNpY190YWJsZVtpXSAqIHNjYWxlX2ZhY3RvciArIDUwKSAvIDEwMDsKKyAgICAgICAgLyogbGltaXQgdGhlIHZhbHVlcyB0byB0aGUgdmFsaWQgcmFuZ2UgKi8KKyAgICAgICAgaWYgKHRlbXAgPD0gMCkKKyAgICAgICAgICAgIHRlbXAgPSAxOworICAgICAgICAvKiBtYXggcXVhbnRpemVyIG5lZWRlZCBmb3IgMTIgYml0cyAqLworICAgICAgICBpZiAodGVtcCA+IDMyNzY3KQorICAgICAgICAgICAgdGVtcCA9IDMyNzY3OworICAgICAgICAvKiBsaW1pdCB0byBiYXNlbGluZSByYW5nZSBpZiByZXF1ZXN0ZWQgKi8KKyAgICAgICAgaWYgKGZvcmNlX2Jhc2VsaW5lICYmIHRlbXAgPiAyNTUpCisgICAgICAgICAgICB0ZW1wID0gMjU1OworICAgICAgICBxdGFibGVbaV0gPSAodTE2KXRlbXA7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb252ZXJ0X3F1YW50X3RhYmxlKHUxNiAqcXRhYmxlLCB1MTYgKmJhc2ljX3RhYmxlLAorICAgIHMzMiBzY2FsZV9mYWN0b3IpCit7CisgICAgX2NvbnZlcnRfcXVhbnRfdGFibGUocXRhYmxlLCBiYXNpY190YWJsZSwgc2NhbGVfZmFjdG9yLCB0cnVlKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfanBlZ19xdWFudF9sdXQoczMyIHRhYmxlX251bSkKK3sKKyAgICBzMzIgaTsKKyAgICB1MzIgZGF0YTMyOworCisgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpICs9IDIpIHsKKyAgICAgICAgZGF0YTMyID0gcmVjaXByb2NhbChnUXVhbnRUYWJsZVt0YWJsZV9udW1dW2ldKTsKKyAgICAgICAgZGF0YTMyIHw9IHJlY2lwcm9jYWwoZ1F1YW50VGFibGVbdGFibGVfbnVtXVtpICsgMV0pIDw8IDE2OworICAgICAgICBXUklURV9IUkVHKEhDT0RFQ19RRENUX0pQRUdfUVVBTlRfREFUQSwgZGF0YTMyKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2pwZWdfaHVmZm1hbl9sdXRfZGMoczMyIHRhYmxlX251bSkKK3sKKyAgICB1MzIgY29kZV9sZW4sIGNvZGVfd29yZCwgcG9zLCBhZGRyOworICAgIHUzMiBudW1fY29kZV9sZW47CisgICAgdTMyIGx1dFsxMl07CisgICAgdTMyIGksIGo7CisKKyAgICBjb2RlX2xlbiA9IDE7CisgICAgY29kZV93b3JkID0gMTsKKyAgICBwb3MgPSAxNjsKKworICAgIC8qIENvbnN0cnVjdCBEQyBIdWZmbWFuIHRhYmxlICovCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgbnVtX2NvZGVfbGVuID0ganBlZ19odWZmbWFuX2RjW3RhYmxlX251bV1baV07CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fY29kZV9sZW47IGorKykgeworICAgICAgICAgICAgY29kZV93b3JkID0gKGNvZGVfd29yZCArIDEpICYgKCgxIDw8IGNvZGVfbGVuKSAtIDEpOworICAgICAgICAgICAgaWYgKGNvZGVfbGVuIDwgaSArIDEpIHsKKyAgICAgICAgICAgICAgICBjb2RlX3dvcmQgPDw9IChpICsgMSAtIGNvZGVfbGVuKTsKKyAgICAgICAgICAgICAgICBjb2RlX2xlbiA9IGkgKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkciA9IGpwZWdfaHVmZm1hbl9kY1t0YWJsZV9udW1dW3Bvc107CisgICAgICAgICAgICBsdXRbYWRkcl0gPSAoKGNvZGVfbGVuIC0gMSkgPDwgMTYpIHwgKGNvZGVfd29yZCk7CisgICAgICAgICAgICBwb3MrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFdyaXRlIERDIEh1ZmZtYW4gdGFibGUgdG8gSFcgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykKKyAgICAgICAgV1JJVEVfSFJFRyhIQ09ERUNfVkxDX0hVRkZNQU5fREFUQSwgbHV0W2ldKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfanBlZ19odWZmbWFuX2x1dF9hYyhzMzIgdGFibGVfbnVtKQoreworICAgIHUzMiBjb2RlX2xlbiwgY29kZV93b3JkLCBwb3M7CisgICAgdTMyIG51bV9jb2RlX2xlbjsKKyAgICB1MzIgcnVuLCBzaXplOworICAgIHUzMiBkYXRhLCBhZGRyID0gMDsKKyAgICB1MzIgKmx1dCA9IE5VTEw7CisgICAgdTMyIGksIGo7CisgICAgY29kZV9sZW4gPSAxOworICAgIGNvZGVfd29yZCA9IDE7CisgICAgcG9zID0gMTY7CisKKyAgICBsdXQgPSAodTMyICopdm1hbGxvYygxNjIgKiBzaXplb2YodTMyKSk7CisgICAgaWYgKCFsdXQpIHsKKyAgICAgICAgcHJfZXJyKCJhbGxvYyBsdXQgZmFpbGVkLlxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBDb25zdHJ1Y3QgQUMgSHVmZm1hbiB0YWJsZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIG51bV9jb2RlX2xlbiA9IGpwZWdfaHVmZm1hbl9hY1t0YWJsZV9udW1dW2ldOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtX2NvZGVfbGVuOyBqKyspIHsKKyAgICAgICAgICAgIGNvZGVfd29yZCA9IChjb2RlX3dvcmQgKyAxKSAmICgoMSA8PCBjb2RlX2xlbikgLSAxKTsKKyAgICAgICAgICAgIGlmIChjb2RlX2xlbiA8IGkgKyAxKSB7CisgICAgICAgICAgICAgICAgY29kZV93b3JkIDw8PSAoaSArIDEgLSBjb2RlX2xlbik7CisgICAgICAgICAgICAgICAgY29kZV9sZW4gPSBpICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJ1biA9IGpwZWdfaHVmZm1hbl9hY1t0YWJsZV9udW1dW3Bvc10gPj4gNDsKKyAgICAgICAgICAgIHNpemUgPSBqcGVnX2h1ZmZtYW5fYWNbdGFibGVfbnVtXVtwb3NdICYgMHhmOworICAgICAgICAgICAgZGF0YSA9ICgoY29kZV9sZW4gLSAxKSA8PCAxNikgfCAoY29kZV93b3JkKTsKKyAgICAgICAgICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocnVuID09IDApCisgICAgICAgICAgICAgICAgICAgIGFkZHIgPSAwOyAgICAgLyogRU9CICovCisgICAgICAgICAgICAgICAgZWxzZSBpZiAocnVuID09IDB4ZikKKyAgICAgICAgICAgICAgICAgICAgYWRkciA9IDE2MTsgLyogWlJMICovCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBqZW5jX3ByKExPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvcjogSWxsZWdhbCBBQyBIdWZmbWFuIHRhYmxlIGZvcm1hdCFcbiIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzaXplIDw9IDB4YSkKKyAgICAgICAgICAgICAgICBhZGRyID0gMSArIDE2ICogKHNpemUgLSAxKSArIHJ1bjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBqZW5jX3ByKExPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIkVycm9yOiBJbGxlZ2FsIEFDIEh1ZmZtYW4gdGFibGUgZm9ybWF0IVxuIik7CisgICAgICAgICAgICBsdXRbYWRkcl0gPSBkYXRhOworICAgICAgICAgICAgcG9zKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBXcml0ZSBBQyBIdWZmbWFuIHRhYmxlIHRvIEhXICovCisgICAgZm9yIChpID0gMDsgaSA8IDE2MjsgaSsrKQorICAgICAgICBXUklURV9IUkVHKEhDT0RFQ19WTENfSFVGRk1BTl9EQVRBLCBsdXRbaV0pOworCisgICAgdmZyZWUobHV0KTsKK30KKworc3RhdGljIHZvaWQgcHJlcGFyZV9qcGVnX2hlYWRlcihzdHJ1Y3QganBlZ2VuY193cV9zICp3cSkKK3sKKyAgICBzMzIgcGljX2Zvcm1hdDsKKyAgICBzMzIgcGljX3dpZHRoLCBwaWNfaGVpZ2h0OworICAgIHMzMiBxX3NlbF9jb21wMCwgcV9zZWxfY29tcDEsIHFfc2VsX2NvbXAyOworICAgIHMzMiBkY19odWZmX3NlbF9jb21wMCwgZGNfaHVmZl9zZWxfY29tcDEsIGRjX2h1ZmZfc2VsX2NvbXAyOworICAgIHMzMiBhY19odWZmX3NlbF9jb21wMCwgYWNfaHVmZl9zZWxfY29tcDEsIGFjX2h1ZmZfc2VsX2NvbXAyOworICAgIHMzMiBsYXN0Y29lZmZfc2VsOworICAgIHMzMiBqZGN0X2ludHJfc2VsOworICAgIHMzMiBoX2ZhY3Rvcl9jb21wMCwgdl9mYWN0b3JfY29tcDA7CisgICAgczMyIGhfZmFjdG9yX2NvbXAxLCB2X2ZhY3Rvcl9jb21wMTsKKyAgICBzMzIgaF9mYWN0b3JfY29tcDIsIHZfZmFjdG9yX2NvbXAyOworICAgIHMzMiBxX251bTsKKyAgICBzMzIgdHFbMl07CisgICAgczMyIGRjX2h1ZmZfbnVtLCBhY19odWZmX251bTsKKyAgICBzMzIgZGNfdGhbMl0sIGFjX3RoWzJdOworICAgIHUzMiBoZWFkZXJfYnl0ZXMgPSAwOworICAgIHUzMiBiYWtfaGVhZGVyX2J5dGVzID0gMDsKKyAgICBzMzIgaSwgajsKKyAgICB1OCAqYXNzaXRidWYgPSAodTggKil3cS0+QXNzaXRzdHJlYW1TdGFydFZpcnRBZGRyOworCisgICAgaWYgKHdxLT5jbWQub3V0cHV0X2ZtdCA+PSBKUEVHRU5DX01BWF9GUkFNRV9GTVQpCisgICAgICAgIGplbmNfcHIoTE9HX0VSUk9SLCAiSW5wdXQgZm9ybWF0IGlzIHdyb25nIVxuIik7CisgICAgc3dpdGNoICh3cS0+Y21kLm91dHB1dF9mbXQpIHsKKyAgICBjYXNlIEpQRUdFTkNfRk1UX05WMjE6CisgICAgY2FzZSBKUEVHRU5DX0ZNVF9OVjEyOgorICAgIGNhc2UgSlBFR0VOQ19GTVRfWVVWNDIwOgorICAgICAgICBwaWNfZm9ybWF0ID0gMzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBKUEVHRU5DX0ZNVF9ZVVY0MjJfU0lOR0xFOgorICAgICAgICBwaWNfZm9ybWF0ID0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBKUEVHRU5DX0ZNVF9ZVVY0NDRfU0lOR0xFOgorICAgIGNhc2UgSlBFR0VOQ19GTVRfWVVWNDQ0X1BMQU5FOgorICAgICAgICBwaWNfZm9ybWF0ID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcGljX2Zvcm1hdCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHBpY193aWR0aCA9IHdxLT5jbWQuZW5jb2Rlcl93aWR0aDsKKyAgICBwaWNfaGVpZ2h0ID0gd3EtPmNtZC5lbmNvZGVyX2hlaWdodDsKKworICAgIHFfc2VsX2NvbXAwID0gUVVBTlRfU0VMX0NPTVAwOworICAgIHFfc2VsX2NvbXAxID0gUVVBTlRfU0VMX0NPTVAxOworICAgIHFfc2VsX2NvbXAyID0gUVVBTlRfU0VMX0NPTVAyOworCisgICAgZGNfaHVmZl9zZWxfY29tcDAgPSBEQ19IVUZGX1NFTF9DT01QMDsKKyAgICBkY19odWZmX3NlbF9jb21wMSA9IERDX0hVRkZfU0VMX0NPTVAxOworICAgIGRjX2h1ZmZfc2VsX2NvbXAyID0gRENfSFVGRl9TRUxfQ09NUDI7CisgICAgYWNfaHVmZl9zZWxfY29tcDAgPSBBQ19IVUZGX1NFTF9DT01QMDsKKyAgICBhY19odWZmX3NlbF9jb21wMSA9IEFDX0hVRkZfU0VMX0NPTVAxOworICAgIGFjX2h1ZmZfc2VsX2NvbXAyID0gQUNfSFVGRl9TRUxfQ09NUDI7CisgICAgbGFzdGNvZWZmX3NlbCA9IEpEQ1RfTEFTVENPRUZGX1NFTDsKKyAgICBqZGN0X2ludHJfc2VsID0gSkRDVF9JTlRSX1NFTDsKKworICAgIGlmIChwaWNfZm9ybWF0ID09IDIpIHsKKyAgICAgICAgLyogWVVWNDIyICovCisgICAgICAgIGhfZmFjdG9yX2NvbXAwID0gMTsKKyAgICAgICAgdl9mYWN0b3JfY29tcDAgPSAwOworICAgICAgICBoX2ZhY3Rvcl9jb21wMSA9IDA7CisgICAgICAgIHZfZmFjdG9yX2NvbXAxID0gMDsKKyAgICAgICAgaF9mYWN0b3JfY29tcDIgPSAwOworICAgICAgICB2X2ZhY3Rvcl9jb21wMiA9IDA7CisgICAgfSBlbHNlIGlmIChwaWNfZm9ybWF0ID09IDMpIHsKKyAgICAgICAgLyogWVVWNDIwICovCisgICAgICAgIGhfZmFjdG9yX2NvbXAwID0gMTsKKyAgICAgICAgdl9mYWN0b3JfY29tcDAgPSAxOworICAgICAgICBoX2ZhY3Rvcl9jb21wMSA9IDA7CisgICAgICAgIHZfZmFjdG9yX2NvbXAxID0gMDsKKyAgICAgICAgaF9mYWN0b3JfY29tcDIgPSAwOworICAgICAgICB2X2ZhY3Rvcl9jb21wMiA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogUkdCIG9yIFlVViAqLworICAgICAgICBoX2ZhY3Rvcl9jb21wMCA9IDA7CisgICAgICAgIHZfZmFjdG9yX2NvbXAwID0gMDsKKyAgICAgICAgaF9mYWN0b3JfY29tcDEgPSAwOworICAgICAgICB2X2ZhY3Rvcl9jb21wMSA9IDA7CisgICAgICAgIGhfZmFjdG9yX2NvbXAyID0gMDsKKyAgICAgICAgdl9mYWN0b3JfY29tcDIgPSAwOworICAgIH0KKworICAgIC8qIFNPSSBtYXJrZSAqLworICAgIHB1c2hfd29yZChhc3NpdGJ1ZiwgJmhlYWRlcl9ieXRlcywKKyAgICAgICAgKDIgPDwgMjQpIHwgLyogTnVtYmVyIG9mIGJ5dGVzICovCisgICAgICAgICgweGZmZDggPDwgMCkpOyAvKiBkYXRhOiBTT0kgbWFya2VyICovCisKKyAgICAvKiBEZWZpbmUgcXVhbnRpemF0aW9uIHRhYmxlcyAqLworICAgIHFfbnVtID0gMTsKKyNpZiAwCisgICAgaWYgKChxX3NlbF9jb21wMCAhPSBxX3NlbF9jb21wMSkgfHwKKyAgICAgICAgKHFfc2VsX2NvbXAwICE9IHFfc2VsX2NvbXAyKSB8fAorICAgICAgICAocV9zZWxfY29tcDEgIT0gcV9zZWxfY29tcDIpKQorI2VuZGlmCisgICAgICAgIHFfbnVtKys7CisjaWYgMAorICAgIHRxWzBdID0gcV9zZWxfY29tcDA7CisgICAgdHFbMV0gPSAocV9zZWxfY29tcDAgIT0gcV9zZWxfY29tcDEpID8gcV9zZWxfY29tcDEgOgorICAgICAgICAocV9zZWxfY29tcDAgIT0gcV9zZWxfY29tcDIpID8gcV9zZWxfY29tcDIgOgorICAgICAgICBxX3NlbF9jb21wMDsKKyNlbmRpZgorICAgIHRxWzBdID0gMDsKKyAgICB0cVsxXSA9IHFfbnVtIC0gMTsKKworICAgIC8qIGRhdGE6IERRVCBtYXJrZXIgKi8KKyAgICBwdXNoX3dvcmQoYXNzaXRidWYsICZoZWFkZXJfYnl0ZXMsCisgICAgICAgICgyIDw8IDI0KSB8ICgweGZmZGIgPDwgMCkpOworICAgIC8qIGRhdGE6IExxICovCisgICAgcHVzaF93b3JkKGFzc2l0YnVmLCAmaGVhZGVyX2J5dGVzLAorICAgICAgICAoMiA8PCAyNCkgfCAoKDIgKyA2NSAqIHFfbnVtKSA8PCAwKSk7CisKKyAgICAvKiBBZGQgUXVhbnRpemF0aW9uIHRhYmxlIGJ5dGVzICovCisgICAgLyogaGVhZGVyX2J5dGVzICs9ICgyICsgKDIgKyA2NSAqIHFfbnVtKSk7ICovCisgICAgZm9yIChpID0gMDsgaSA8IHFfbnVtOyBpKyspIHsKKyAgICAgICAgLyogZGF0YToge1BxLFRxfSAqLworICAgICAgICBwdXNoX3dvcmQoYXNzaXRidWYsICZoZWFkZXJfYnl0ZXMsCisgICAgICAgICAgICAoMSA8PCAyNCkgfCAoaSA8PCAwKSk7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBEQ1RTSVpFMjsgaisrKSB7CisgICAgICAgICAgICAvKiBkYXRhOiBRayAqLworICAgICAgICAgICAgcHVzaF93b3JkKGFzc2l0YnVmLCAmaGVhZGVyX2J5dGVzLAorICAgICAgICAgICAgICAgICgxIDw8IDI0KSB8CisgICAgICAgICAgICAgICAgKChnUXVhbnRUYWJsZVt0cVtpXV1bemlnemFnKGopXSkgPDwgMCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRGVmaW5lIEh1ZmZtYW4gdGFibGVzICovCisgICAgZGNfaHVmZl9udW0gPSAxOworICAgIGlmICgoZGNfaHVmZl9zZWxfY29tcDAgIT0gZGNfaHVmZl9zZWxfY29tcDEpIHx8CisgICAgICAgIChkY19odWZmX3NlbF9jb21wMCAhPSBkY19odWZmX3NlbF9jb21wMikgfHwKKyAgICAgICAgKGRjX2h1ZmZfc2VsX2NvbXAxICE9IGRjX2h1ZmZfc2VsX2NvbXAyKSkKKyAgICAgICAgZGNfaHVmZl9udW0rKzsKKworICAgIGFjX2h1ZmZfbnVtID0gMTsKKyAgICBpZiAoKGFjX2h1ZmZfc2VsX2NvbXAwICE9IGFjX2h1ZmZfc2VsX2NvbXAxKSB8fAorICAgICAgICAoYWNfaHVmZl9zZWxfY29tcDAgIT0gYWNfaHVmZl9zZWxfY29tcDIpIHx8CisgICAgICAgIChhY19odWZmX3NlbF9jb21wMSAhPSBhY19odWZmX3NlbF9jb21wMikpCisgICAgICAgIGFjX2h1ZmZfbnVtKys7CisKKyAgICBkY190aFswXSA9IGRjX2h1ZmZfc2VsX2NvbXAwOworICAgIGRjX3RoWzFdID0gKGRjX2h1ZmZfc2VsX2NvbXAwICE9IGRjX2h1ZmZfc2VsX2NvbXAxKSA/CisgICAgICAgIGRjX2h1ZmZfc2VsX2NvbXAxIDogKGRjX2h1ZmZfc2VsX2NvbXAwICE9IGRjX2h1ZmZfc2VsX2NvbXAyKSA/CisgICAgICAgIGRjX2h1ZmZfc2VsX2NvbXAyIDogZGNfaHVmZl9zZWxfY29tcDA7CisKKyAgICBhY190aFswXSA9IGFjX2h1ZmZfc2VsX2NvbXAwOworICAgIGFjX3RoWzFdID0gKGFjX2h1ZmZfc2VsX2NvbXAwICE9IGFjX2h1ZmZfc2VsX2NvbXAxKSA/CisgICAgICAgIGFjX2h1ZmZfc2VsX2NvbXAxIDogKGFjX2h1ZmZfc2VsX2NvbXAwICE9IGFjX2h1ZmZfc2VsX2NvbXAyKSA/CisgICAgICAgIGFjX2h1ZmZfc2VsX2NvbXAyIDogYWNfaHVmZl9zZWxfY29tcDA7CisKKyAgICAvKiBkYXRhOiBESFQgbWFya2VyICovCisgICAgcHVzaF93b3JkKGFzc2l0YnVmLCAmaGVhZGVyX2J5dGVzLAorICAgICAgICAoMiA8PCAyNCkgfCAoMHhmZmM0IDw8IDApKTsKKyAgICAvKiBkYXRhOiBMaCAqLworICAgIHB1c2hfd29yZChhc3NpdGJ1ZiwgJmhlYWRlcl9ieXRlcywKKyAgICAgICAgKDIgPDwgMjQpIHwKKyAgICAgICAgKCgyICsgKDEgKyAxNiArIDEyKSAqIGRjX2h1ZmZfbnVtICsKKyAgICAgICAgKDEgKyAxNiArIDE2MikgKiBhY19odWZmX251bSkgPDwgMCkpOworCisgICAgLyogQWRkIEh1ZmZtYW4gdGFibGUgYnl0ZXMgKi8KKyAgICAvKiBkYXRhOiB7VGMsVGh9ICovCisgICAgZm9yIChpID0gMDsgaSA8IGRjX2h1ZmZfbnVtOyBpKyspIHsKKyAgICAgICAgcHVzaF93b3JkKGFzc2l0YnVmLCAmaGVhZGVyX2J5dGVzLAorICAgICAgICAgICAgKDEgPDwgMjQpIHwgKGkgPDwgMCkpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTYgKyAxMjsgaisrKSB7CisgICAgICAgICAgICAvKiBkYXRhOiBMaSB0aGVuIFZpLGogKi8KKyAgICAgICAgICAgIHB1c2hfd29yZChhc3NpdGJ1ZiwgJmhlYWRlcl9ieXRlcywKKyAgICAgICAgICAgICAgICAoMSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICgoanBlZ19odWZmbWFuX2RjW2RjX3RoW2ldXVtqXSkgPDwgMCkpOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBhY19odWZmX251bTsgaSsrKSB7CisgICAgICAgIHB1c2hfd29yZChhc3NpdGJ1ZiwgJmhlYWRlcl9ieXRlcywKKyAgICAgICAgICAgICgxIDw8IDI0KSB8CisgICAgICAgICAgICAoMSA8PCA0KSB8IC8qIGRhdGE6IFRjICovCisgICAgICAgICAgICAoaSA8PCAwKSk7IC8qIGRhdGE6IFRoICovCisgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNiArIDE2MjsgaisrKSB7CisgICAgICAgICAgICAvKiBkYXRhOiBMaSB0aGVuIFZpLGogKi8KKyAgICAgICAgICAgIHB1c2hfd29yZChhc3NpdGJ1ZiwgJmhlYWRlcl9ieXRlcywKKyAgICAgICAgICAgICAgICAoMSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICgoanBlZ19odWZmbWFuX2FjW2FjX3RoW2ldXVtqXSkgPDwgMCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRnJhbWUgaGVhZGVyICovCisgICAgLyogQWRkIEZyYW1lIGhlYWRlciBieXRlcyAqLworICAgIC8qIGhlYWRlcl9ieXRlcyArPSAoMiArICg4ICsgMyAqIDMpKTsgKi8KKyAgICBwdXNoX3dvcmQoYXNzaXRidWYsICZoZWFkZXJfYnl0ZXMsCisgICAgICAgICgyIDw8IDI0KSB8IC8qIE51bWJlciBvZiBieXRlcyAqLworICAgICAgICAoMHhmZmMwIDw8IDApKTsgLyogZGF0YTogU09GXzAgbWFya2VyICovCisgICAgLyogZGF0YTogTGYgKi8KKyAgICBwdXNoX3dvcmQoYXNzaXRidWYsICZoZWFkZXJfYnl0ZXMsCisgICAgICAgICgyIDw8IDI0KSB8ICgoOCArIDMgKiAzKSA8PCAwKSk7CisgICAgLyogZGF0YTogUCAtLSBTYW1wbGUgcHJlY2lzaW9uICovCisgICAgcHVzaF93b3JkKGFzc2l0YnVmLAorICAgICAgICAmaGVhZGVyX2J5dGVzLCAoMSA8PCAyNCkgfCAoOCA8PCAwKSk7CisgICAgLyogZGF0YTogWSAtLSBOdW1iZXIgb2YgbGluZXMgKi8KKyAgICBwdXNoX3dvcmQoYXNzaXRidWYsCisgICAgICAgICZoZWFkZXJfYnl0ZXMsICgyIDw8IDI0KSB8IChwaWNfaGVpZ2h0IDw8IDApKTsKKyAgICAvKiBkYXRhOiBYIC0tIE51bWJlciBvZiBzYW1wbGVzIHBlciBsaW5lICovCisgICAgcHVzaF93b3JkKGFzc2l0YnVmLAorICAgICAgICAmaGVhZGVyX2J5dGVzLCAoMiA8PCAyNCkgfCAocGljX3dpZHRoIDw8IDApKTsKKyAgICAvKiBkYXRhOiBOZiAtLSBOdW1iZXIgb2YgY29tcG9uZW50cyBpbiBhIGZyYW1lICovCisgICAgcHVzaF93b3JkKGFzc2l0YnVmLAorICAgICAgICAmaGVhZGVyX2J5dGVzLCAoMSA8PCAyNCkgfCAoMyA8PCAwKSk7CisgICAgLyogZGF0YTogQzAgLS0gQ29tcDAgaWRlbnRpZmllciAqLworICAgIHB1c2hfd29yZChhc3NpdGJ1ZiwKKyAgICAgICAgJmhlYWRlcl9ieXRlcywgKDEgPDwgMjQpIHwgKDAgPDwgMCkpOworICAgIHB1c2hfd29yZChhc3NpdGJ1ZiwKKyAgICAgICAgJmhlYWRlcl9ieXRlcywgKDEgPDwgMjQpIHwKKyAgICAgICAgLyogZGF0YTogSDAgLS0gQ29tcDAgaG9yaXpvbnRhbCBzYW1wbGluZyBmYWN0b3IgKi8KKyAgICAgICAgKChoX2ZhY3Rvcl9jb21wMCArIDEpIDw8IDQpIHwKKyAgICAgICAgLyogZGF0YTogVjAgLS0gQ29tcDAgdmVydGljYWwgc2FtcGxpbmcgZmFjdG9yICovCisgICAgICAgICgodl9mYWN0b3JfY29tcDAgKyAxKSA8PCAwKSk7CisKKyAgICAvKiBkYXRhOiBUcTAgLS0gQ29tcDAgcXVhbnRpemF0aW9uIHRhYmxlIHNlbGV0b3IgKi8KKyAgICBwdXNoX3dvcmQoYXNzaXRidWYsCisgICAgICAgICZoZWFkZXJfYnl0ZXMsICgxIDw8IDI0KSB8ICgwIDw8IDApKTsKKyAgICAvKiBkYXRhOiBDMSAtLSBDb21wMSBpZGVudGlmaWVyICovCisgICAgcHVzaF93b3JkKGFzc2l0YnVmLAorICAgICAgICAmaGVhZGVyX2J5dGVzLCAoMSA8PCAyNCkgfCAoMSA8PCAwKSk7CisgICAgcHVzaF93b3JkKGFzc2l0YnVmLAorICAgICAgICAmaGVhZGVyX2J5dGVzLCAoMSA8PCAyNCkgfAorICAgICAgICAvKiBkYXRhOiBIMSAtLSBDb21wMSBob3Jpem9udGFsIHNhbXBsaW5nIGZhY3RvciAqLworICAgICAgICAoKGhfZmFjdG9yX2NvbXAxICsgMSkgPDwgNCkgfAorICAgICAgICAvKiBkYXRhOiBWMSAtLSBDb21wMSB2ZXJ0aWNhbCBzYW1wbGluZyBmYWN0b3IgKi8KKyAgICAgICAgKCh2X2ZhY3Rvcl9jb21wMSArIDEpIDw8IDApKTsKKyAgICAvKiBkYXRhOiBUcTEgLS0gQ29tcDEgcXVhbnRpemF0aW9uIHRhYmxlIHNlbGV0b3IgKi8KKyAgICBwdXNoX3dvcmQoYXNzaXRidWYsCisgICAgICAgICZoZWFkZXJfYnl0ZXMsICgxIDw8IDI0KSB8CisgICAgICAgICgoKHFfc2VsX2NvbXAwICE9IHFfc2VsX2NvbXAxKSA/IDEgOiAwKSA8PCAwKSk7CisgICAgLyogZGF0YTogQzIgLS0gQ29tcDIgaWRlbnRpZmllciAqLworICAgIHB1c2hfd29yZChhc3NpdGJ1ZiwKKyAgICAgICAgJmhlYWRlcl9ieXRlcywgKDEgPDwgMjQpIHwgKDIgPDwgMCkpOworICAgIHB1c2hfd29yZChhc3NpdGJ1ZiwKKyAgICAgICAgJmhlYWRlcl9ieXRlcywgKDEgPDwgMjQpIHwKKyAgICAgICAgLyogZGF0YTogSDIgLS0gQ29tcDIgaG9yaXpvbnRhbCBzYW1wbGluZyBmYWN0b3IgKi8KKyAgICAgICAgKChoX2ZhY3Rvcl9jb21wMiArIDEpIDw8IDQpIHwKKyAgICAgICAgLyogZGF0YTogVjIgLS0gQ29tcDIgdmVydGljYWwgc2FtcGxpbmcgZmFjdG9yICovCisgICAgICAgICgodl9mYWN0b3JfY29tcDIgKyAxKSA8PCAwKSk7CisgICAgLyogZGF0YTogVHEyIC0tIENvbXAyIHF1YW50aXphdGlvbiB0YWJsZSBzZWxldG9yICovCisgICAgcHVzaF93b3JkKGFzc2l0YnVmLAorICAgICAgICAmaGVhZGVyX2J5dGVzLCAoMSA8PCAyNCkgfAorICAgICAgICAoKChxX3NlbF9jb21wMCAhPSBxX3NlbF9jb21wMikgPyAxIDogMCkgPDwgMCkpOworCisgICAgLyogU2NhbiBoZWFkZXIgKi8KKyAgICBiYWtfaGVhZGVyX2J5dGVzID0gaGVhZGVyX2J5dGVzICsgKDIgKyAoNiArIDIgKiAzKSk7CisKKyAgICAvKiBBZGQgU2NhbiBoZWFkZXIgYnl0ZXMgKi8KKyAgICAvKiBoZWFkZXJfYnl0ZXMgKz0gKDIgKyAoNisyKjMpKTsgKi8KKyAgICAvKiBJZiB0b3RhbCBoZWFkZXIgYnl0ZXMgaXMgbm90IG11bHRpcGxlIG9mIDgsCisgICAgICAgICB0aGVuIGZpbGwgMHhmZiBieXRlIGJldHdlZW4gRnJhbWUgaGVhZGVyIHNlZ21lbnQKKyAgICAgICAgIGFuZCB0aGUgU2NhbiBoZWFkZXIgc2VnbWVudC4gKi8KKyAgICAvKiBoZWFkZXJfYnl0ZXMgPSAoKGhlYWRlcl9ieXRlcyArIDcpLzgpKjg7ICovCisgICAgYmFrX2hlYWRlcl9ieXRlcyA9ICgoYmFrX2hlYWRlcl9ieXRlcyArIDcpIC8gOCkgKiA4IC0gYmFrX2hlYWRlcl9ieXRlczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYmFrX2hlYWRlcl9ieXRlczsgaSsrKQorICAgICAgICBwdXNoX3dvcmQoYXNzaXRidWYsCisgICAgICAgICAgICAmaGVhZGVyX2J5dGVzLAorICAgICAgICAgICAgKDEgPDwgMjQpIHwgKDB4ZmYgPDwgMCkpOyAvKiAweGZmIGZpbGxlciAqLworCisgICAgcHVzaF93b3JkKGFzc2l0YnVmLAorICAgICAgICAmaGVhZGVyX2J5dGVzLAorICAgICAgICAoMiA8PCAyNCkgfCAvKiBOdW1iZXIgb2YgYnl0ZXMgKi8KKyAgICAgICAgKDB4ZmZkYSA8PCAwKSk7IC8qIGRhdGE6IFNPUyBtYXJrZXIgKi8KKworICAgIC8qIGRhdGE6IExzICovCisgICAgcHVzaF93b3JkKGFzc2l0YnVmLAorICAgICAgICAmaGVhZGVyX2J5dGVzLCAoMiA8PCAyNCkgfCAoKDYgKyAyICogMykgPDwgMCkpOworICAgIC8qIGRhdGE6IE5zIC0tIE51bWJlciBvZiBjb21wb25lbnRzIGluIGEgc2NhbiAqLworICAgIHB1c2hfd29yZChhc3NpdGJ1ZiwKKyAgICAgICAgJmhlYWRlcl9ieXRlcywgKDEgPDwgMjQpIHwgKDMgPDwgMCkpOworICAgIC8qIGRhdGE6IENzMCAtLSBDb21wMCBpZGVudGlmaWVyICovCisgICAgcHVzaF93b3JkKGFzc2l0YnVmLAorICAgICAgICAmaGVhZGVyX2J5dGVzLCAoMSA8PCAyNCkgfCAoMCA8PCAwKSk7CisgICAgcHVzaF93b3JkKGFzc2l0YnVmLAorICAgICAgICAmaGVhZGVyX2J5dGVzLCAoMSA8PCAyNCkgfAorICAgICAgICAoMCA8PCA0KSB8IC8qIGRhdGE6IFRkMCAtLSBDb21wMCBEQyBIdWZmbWFuIHRhYmxlIHNlbGVjdG9yICovCisgICAgICAgICgwIDw8IDApKTsgLyogZGF0YTogVGEwIC0tIENvbXAwIEFDIEh1ZmZtYW4gdGFibGUgc2VsZWN0b3IgKi8KKyAgICAvKiBkYXRhOiBDczEgLS0gQ29tcDEgaWRlbnRpZmllciAqLworICAgIHB1c2hfd29yZChhc3NpdGJ1ZiwKKyAgICAgICAgJmhlYWRlcl9ieXRlcywgKDEgPDwgMjQpIHwgKDEgPDwgMCkpOworICAgIHB1c2hfd29yZChhc3NpdGJ1ZiwKKyAgICAgICAgJmhlYWRlcl9ieXRlcywgKDEgPDwgMjQpIHwKKyAgICAgICAgLyogZGF0YTogVGQxIC0tIENvbXAxIERDIEh1ZmZtYW4gdGFibGUgc2VsZWN0b3IgKi8KKyAgICAgICAgKCgoZGNfaHVmZl9zZWxfY29tcDAgIT0gZGNfaHVmZl9zZWxfY29tcDEpID8gMSA6IDApIDw8IDQpIHwKKyAgICAgICAgLyogZGF0YTogVGExIC0tIENvbXAxIEFDIEh1ZmZtYW4gdGFibGUgc2VsZWN0b3IgKi8KKyAgICAgICAgKCgoYWNfaHVmZl9zZWxfY29tcDAgIT0gYWNfaHVmZl9zZWxfY29tcDEpID8gMSA6IDApIDw8IDApKTsKKyAgICAvKiBkYXRhOiBDczIgLS0gQ29tcDIgaWRlbnRpZmllciAqLworICAgIHB1c2hfd29yZChhc3NpdGJ1ZiwKKyAgICAgICAgJmhlYWRlcl9ieXRlcywgKDEgPDwgMjQpIHwgKDIgPDwgMCkpOworICAgIHB1c2hfd29yZChhc3NpdGJ1ZiwKKyAgICAgICAgJmhlYWRlcl9ieXRlcywgKDEgPDwgMjQpIHwKKyAgICAgICAgLyogZGF0YTogVGQyIC0tIENvbXAyIERDIEh1ZmZtYW4gdGFibGUgc2VsZWN0b3IgKi8KKyAgICAgICAgKCgoZGNfaHVmZl9zZWxfY29tcDAgIT0gZGNfaHVmZl9zZWxfY29tcDIpID8gMSA6IDApIDw8IDQpIHwKKyAgICAgICAgLyogZGF0YTogVGEyIC0tIENvbXAyIEFDIEh1ZmZtYW4gdGFibGUgc2VsZWN0b3IgKi8KKyAgICAgICAgKCgoYWNfaHVmZl9zZWxfY29tcDAgIT0gYWNfaHVmZl9zZWxfY29tcDIpID8gMSA6IDApIDw8IDApKTsKKyAgICBwdXNoX3dvcmQoYXNzaXRidWYsICZoZWFkZXJfYnl0ZXMsCisgICAgICAgICgzIDw8IDI0KSB8CisgICAgICAgICgwIDw8IDE2KSB8IC8qIGRhdGE6IFNzID0gMCAqLworICAgICAgICAoNjMgPDwgOCkgfCAvKiBkYXRhOiBTZSA9IDYzICovCisgICAgICAgICgwIDw8IDQpIHwgLyogZGF0YTogQWggPSAwICovCisgICAgICAgICgwIDw8IDApKTsgLyogZGF0YTogQWwgPSAwICovCisgICAgamVuY19wcihMT0dfSU5GTywgImpwZWcgaGVhZGVyIGJ5dGVzIGlzICVkXG4iLCBoZWFkZXJfYnl0ZXMpOworICAgIHdxLT5oZWFkYnl0ZXMgPSBoZWFkZXJfYnl0ZXM7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfanBlZ19lbmNvZGVyKHN0cnVjdCBqcGVnZW5jX3dxX3MgKndxKQoreworICAgIHUzMiBkYXRhMzI7CisgICAgczMyIHBpY19mb3JtYXQ7IC8qIDA9UkdCOyAxPVlVVjsgMj1ZVVY0MjI7IDM9WVVWNDIwICovCisgICAgczMyIHBpY194X3N0YXJ0LCBwaWNfeF9lbmQsIHBpY195X3N0YXJ0LCBwaWNfeV9lbmQ7CisgICAgczMyIHBpY193aWR0aCwgcGljX2hlaWdodDsKKyAgICB1MzIgcV9zZWxfY29tcDAsIHFfc2VsX2NvbXAxLCBxX3NlbF9jb21wMjsKKyAgICBzMzIgZGNfaHVmZl9zZWxfY29tcDAsIGRjX2h1ZmZfc2VsX2NvbXAxLCBkY19odWZmX3NlbF9jb21wMjsKKyAgICBzMzIgYWNfaHVmZl9zZWxfY29tcDAsIGFjX2h1ZmZfc2VsX2NvbXAxLCBhY19odWZmX3NlbF9jb21wMjsKKyAgICBzMzIgbGFzdGNvZWZmX3NlbDsKKyAgICBzMzIgamRjdF9pbnRyX3NlbDsKKyAgICBzMzIgaF9mYWN0b3JfY29tcDAsIHZfZmFjdG9yX2NvbXAwOworICAgIHMzMiBoX2ZhY3Rvcl9jb21wMSwgdl9mYWN0b3JfY29tcDE7CisgICAgczMyIGhfZmFjdG9yX2NvbXAyLCB2X2ZhY3Rvcl9jb21wMjsKKworICAgIGplbmNfcHIoTE9HX0lORk8sICJJbml0aWFsaXplIEpQRUcgRW5jb2RlciAuLi4uXG4iKTsKKyAgICBpZiAod3EtPmNtZC5vdXRwdXRfZm10ID49IEpQRUdFTkNfTUFYX0ZSQU1FX0ZNVCkKKyAgICAgICAgamVuY19wcihMT0dfRVJST1IsICJJbnB1dCBmb3JtYXQgaXMgd3JvbmchXG4iKTsKKyAgICBzd2l0Y2ggKHdxLT5jbWQub3V0cHV0X2ZtdCkgeworICAgIGNhc2UgSlBFR0VOQ19GTVRfTlYyMToKKyAgICBjYXNlIEpQRUdFTkNfRk1UX05WMTI6CisgICAgY2FzZSBKUEVHRU5DX0ZNVF9ZVVY0MjA6CisgICAgICAgIHBpY19mb3JtYXQgPSAzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEpQRUdFTkNfRk1UX1lVVjQyMl9TSU5HTEU6CisgICAgICAgIHBpY19mb3JtYXQgPSAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEpQRUdFTkNfRk1UX1lVVjQ0NF9TSU5HTEU6CisgICAgY2FzZSBKUEVHRU5DX0ZNVF9ZVVY0NDRfUExBTkU6CisgICAgICAgIHBpY19mb3JtYXQgPSAxOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBwaWNfZm9ybWF0ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcGljX3hfc3RhcnQgPSAwOworICAgIHBpY194X2VuZCA9IHdxLT5jbWQuZW5jb2Rlcl93aWR0aCAtIDE7CisKKyAgICBwaWNfeV9zdGFydCA9IDA7CisgICAgcGljX3lfZW5kID0gd3EtPmNtZC5lbmNvZGVyX2hlaWdodCAtIDE7CisKKyAgICBwaWNfd2lkdGggPSB3cS0+Y21kLmVuY29kZXJfd2lkdGg7CisgICAgcGljX2hlaWdodCA9IHdxLT5jbWQuZW5jb2Rlcl9oZWlnaHQ7CisKKyAgICBpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9DMSkgeworICAgICAgICBxX3NlbF9jb21wMCA9IFFVQU5UX1NFTF9DT01QMCAmIDB4ZmY7CisgICAgICAgIHFfc2VsX2NvbXAxID0gUVVBTlRfU0VMX0NPTVAxICYgMHhmZjsKKyAgICAgICAgcV9zZWxfY29tcDIgPSBRVUFOVF9TRUxfQ09NUDIgJiAweGZmOworICAgIH0gZWxzZSB7CisgICAgICAgIHFfc2VsX2NvbXAwID0gd3EtPmNtZC5RdWFudFRhYmxlX2lkICogMjsKKyAgICAgICAgcV9zZWxfY29tcDEgPSBxX3NlbF9jb21wMCArIDE7CisgICAgICAgIHFfc2VsX2NvbXAyID0gcV9zZWxfY29tcDE7CisgICAgfQorICAgIGlmIChxX3NlbF9jb21wMCA+PSA2IHx8IHFfc2VsX2NvbXAxID49IDYpCisgICAgeworICAgICAgICBqZW5jX3ByKExPR19FUlJPUiwgImVycm9yLCBxX3NlbF9jb21wMCwgcV9zZWxfY29tcDEgaXMgaW52YWxpZCAlZCwlZFxuIiwKKyAgICAgICAgICAgIHFfc2VsX2NvbXAwLCBxX3NlbF9jb21wMSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZGNfaHVmZl9zZWxfY29tcDAgPSBEQ19IVUZGX1NFTF9DT01QMDsKKyAgICBkY19odWZmX3NlbF9jb21wMSA9IERDX0hVRkZfU0VMX0NPTVAxOworICAgIGRjX2h1ZmZfc2VsX2NvbXAyID0gRENfSFVGRl9TRUxfQ09NUDI7CisgICAgYWNfaHVmZl9zZWxfY29tcDAgPSBBQ19IVUZGX1NFTF9DT01QMDsKKyAgICBhY19odWZmX3NlbF9jb21wMSA9IEFDX0hVRkZfU0VMX0NPTVAxOworICAgIGFjX2h1ZmZfc2VsX2NvbXAyID0gQUNfSFVGRl9TRUxfQ09NUDI7CisgICAgbGFzdGNvZWZmX3NlbCA9IEpEQ1RfTEFTVENPRUZGX1NFTDsKKyAgICBqZGN0X2ludHJfc2VsID0gSkRDVF9JTlRSX1NFTDsKKworICAgIGlmIChwaWNfZm9ybWF0ID09IDIpIHsKKyAgICAgICAgLyogWVVWNDIyICovCisgICAgICAgIGhfZmFjdG9yX2NvbXAwID0gMTsKKyAgICAgICAgdl9mYWN0b3JfY29tcDAgPSAwOworICAgICAgICBoX2ZhY3Rvcl9jb21wMSA9IDA7CisgICAgICAgIHZfZmFjdG9yX2NvbXAxID0gMDsKKyAgICAgICAgaF9mYWN0b3JfY29tcDIgPSAwOworICAgICAgICB2X2ZhY3Rvcl9jb21wMiA9IDA7CisgICAgfSBlbHNlIGlmIChwaWNfZm9ybWF0ID09IDMpIHsKKyAgICAgICAgLyogWVVWNDIwICovCisgICAgICAgIGhfZmFjdG9yX2NvbXAwID0gMTsKKyAgICAgICAgdl9mYWN0b3JfY29tcDAgPSAxOworICAgICAgICBoX2ZhY3Rvcl9jb21wMSA9IDA7CisgICAgICAgIHZfZmFjdG9yX2NvbXAxID0gMDsKKyAgICAgICAgaF9mYWN0b3JfY29tcDIgPSAwOworICAgICAgICB2X2ZhY3Rvcl9jb21wMiA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogUkdCIG9yIFlVViAqLworICAgICAgICBoX2ZhY3Rvcl9jb21wMCA9IDA7CisgICAgICAgIHZfZmFjdG9yX2NvbXAwID0gMDsKKyAgICAgICAgaF9mYWN0b3JfY29tcDEgPSAwOworICAgICAgICB2X2ZhY3Rvcl9jb21wMSA9IDA7CisgICAgICAgIGhfZmFjdG9yX2NvbXAyID0gMDsKKyAgICAgICAgdl9mYWN0b3JfY29tcDIgPSAwOworICAgIH0KKworICAgIC8qIENvbmZpZ3VyZSBwaWN0dXJlIHNpemUgYW5kIGZvcm1hdCAqLworICAgIFdSSVRFX0hSRUcoSENPREVDX1ZMQ19QSUNfU0laRSwgcGljX3dpZHRoIHwgKHBpY19oZWlnaHQgPDwgMTYpKTsKKyAgICBXUklURV9IUkVHKEhDT0RFQ19WTENfUElDX1BPU0lUSU9OLCBwaWNfZm9ybWF0IHwgKGxhc3Rjb2VmZl9zZWwgPDwgNCkpOworICAgIFdSSVRFX0hSRUcoSENPREVDX1FEQ1RfSlBFR19YX1NUQVJUX0VORCwKKyAgICAgICAgICAgKChwaWNfeF9lbmQgPDwgMTYpIHwgKHBpY194X3N0YXJ0IDw8IDApKSk7CisgICAgV1JJVEVfSFJFRyhIQ09ERUNfUURDVF9KUEVHX1lfU1RBUlRfRU5ELAorICAgICAgICAgICAoKHBpY195X2VuZCA8PCAxNikgfCAocGljX3lfc3RhcnQgPDwgMCkpKTsKKworICAgIC8qIENvbmZpZ3VyZSBxdWFudGl6YXRpb24gdGFibGVzICovCisjaWZkZWYgRVhURUFOX1FVQU5UX1RBQkxFCisgICAgaWYgKGV4dGVybmFsX3F1YW50X3RhYmxlX2F2YWlsYWJsZSkgeworICAgICAgICBjb252ZXJ0X3F1YW50X3RhYmxlKCZnUXVhbnRUYWJsZVswXVswXSwKKyAgICAgICAgICAgICZnRXh0ZXJuYWxRdWFudFRhYmxlUHRyWzBdLAorICAgICAgICAgICAgd3EtPmNtZC5qcGVnX3F1YWxpdHkpOworICAgICAgICBjb252ZXJ0X3F1YW50X3RhYmxlKCZnUXVhbnRUYWJsZVsxXVswXSwKKyAgICAgICAgICAgICZnRXh0ZXJuYWxRdWFudFRhYmxlUHRyW0RDVFNJWkUyXSwKKyAgICAgICAgICAgIHdxLT5jbWQuanBlZ19xdWFsaXR5KTsKKyAgICAgICAgcV9zZWxfY29tcDAgPSAwOworICAgICAgICBxX3NlbF9jb21wMSA9IDE7CisgICAgICAgIHFfc2VsX2NvbXAyID0gMTsKKyAgICB9IGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgICAgczMyIHRxWzJdOworICAgICAgICB0cVswXSA9IHFfc2VsX2NvbXAwOworICAgICAgICB0cVsxXSA9IChxX3NlbF9jb21wMCAhPSBxX3NlbF9jb21wMSkgPworICAgICAgICAgICAgcV9zZWxfY29tcDEgOiAocV9zZWxfY29tcDAgIT0gcV9zZWxfY29tcDIpID8KKyAgICAgICAgICAgIHFfc2VsX2NvbXAyIDogcV9zZWxfY29tcDA7CisgICAgICAgIGNvbnZlcnRfcXVhbnRfdGFibGUoJmdRdWFudFRhYmxlWzBdWzBdLAorICAgICAgICAgICAgKHUxNiAqKSZqcGVnX3F1YW50W3RxWzBdXSwKKyAgICAgICAgICAgIHdxLT5jbWQuanBlZ19xdWFsaXR5KTsKKyAgICAgICAgaWYgKHRxWzBdICE9IHRxWzFdKQorICAgICAgICAgICAgY29udmVydF9xdWFudF90YWJsZSgmZ1F1YW50VGFibGVbMV1bMF0sCisgICAgICAgICAgICAgICAgKHUxNiAqKSZqcGVnX3F1YW50W3RxWzFdXSwKKyAgICAgICAgICAgICAgICB3cS0+Y21kLmpwZWdfcXVhbGl0eSk7CisgICAgICAgIHFfc2VsX2NvbXAwID0gdHFbMF07CisgICAgICAgIHFfc2VsX2NvbXAxID0gdHFbMV07CisgICAgICAgIHFfc2VsX2NvbXAyID0gdHFbMV07CisgICAgfQorCisgICAgLyogU2V0IFF1YW50aXphdGlvbiBMVVQgc3RhcnQgYWRkcmVzcyAqLworICAgIGRhdGEzMiA9IDA7CisgICAgZGF0YTMyIHw9IDAgPDwgODsgLyogWzhdIDA9V3JpdGUgTFVULCAxPVJlYWQgKi8KKyAgICBkYXRhMzIgfD0gMCA8PCAwOyAvKiBbNTowXSBTdGFydCBhZGRyID0gMCAqLworCisgICAgV1JJVEVfSFJFRyhIQ09ERUNfUURDVF9KUEVHX1FVQU5UX0FERFIsIGRhdGEzMik7CisKKyAgICAvKiBCdXJzdC13cml0ZSBRdWFudGl6YXRpb24gTFVUIGRhdGEgKi8KKyAgICBpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX0MxKSB7CisgICAgICAgIHdyaXRlX2pwZWdfcXVhbnRfbHV0KDApOworICAgICAgICBpZiAocV9zZWxfY29tcDAgIT0gcV9zZWxfY29tcDEpCisgICAgICAgICAgICB3cml0ZV9qcGVnX3F1YW50X2x1dCgxKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3cml0ZV9qcGVnX3F1YW50X2x1dChxX3NlbF9jb21wMCk7CisgICAgICAgIGlmIChxX3NlbF9jb21wMSAhPSBxX3NlbF9jb21wMCkKKyAgICAgICAgICAgIHdyaXRlX2pwZWdfcXVhbnRfbHV0KHFfc2VsX2NvbXAxKTsKKyAgICAgICAgaWYgKChxX3NlbF9jb21wMiAhPSBxX3NlbF9jb21wMCkgJiYgKHFfc2VsX2NvbXAyICE9IHFfc2VsX2NvbXAxKSkKKyAgICAgICAgICAgIHdyaXRlX2pwZWdfcXVhbnRfbHV0KHFfc2VsX2NvbXAyKTsKKyAgICB9CisKKyAgICAvKiBDb25maWd1cmUgSHVmZm1hbiB0YWJsZXMgKi8KKworICAgIC8qIFNldCBEQyBIdWZmbWFuIExVVCBzdGFydCBhZGRyZXNzICovCisgICAgZGF0YTMyID0gMDsKKyAgICBkYXRhMzIgfD0gMCA8PCAxNjsgLyogWzE2XSAwPVdyaXRlIExVVCwgMT1SZWFkICovCisgICAgZGF0YTMyIHw9IDAgPDwgMDsgLyogWzg6MF0gU3RhcnQgYWRkciA9IDAgKi8KKyAgICBXUklURV9IUkVHKEhDT0RFQ19WTENfSFVGRk1BTl9BRERSLCBkYXRhMzIpOworCisgICAgLyogQnVyc3Qtd3JpdGUgREMgSHVmZm1hbiBMVVQgZGF0YSAqLworICAgIHdyaXRlX2pwZWdfaHVmZm1hbl9sdXRfZGMoZGNfaHVmZl9zZWxfY29tcDApOworICAgIGlmIChkY19odWZmX3NlbF9jb21wMSAhPSBkY19odWZmX3NlbF9jb21wMCkKKyAgICAgICAgd3JpdGVfanBlZ19odWZmbWFuX2x1dF9kYyhkY19odWZmX3NlbF9jb21wMSk7CisKKyAgICBpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9DMSkgeworICAgICAgICBpZiAoKGRjX2h1ZmZfc2VsX2NvbXAyICE9IGRjX2h1ZmZfc2VsX2NvbXAwKQorICAgICAgICAgICAgJiYgKGRjX2h1ZmZfc2VsX2NvbXAyICE9IGRjX2h1ZmZfc2VsX2NvbXAxKSkKKyAgICAgICAgICAgIHdyaXRlX2pwZWdfaHVmZm1hbl9sdXRfZGMoZGNfaHVmZl9zZWxfY29tcDIpOworICAgIH0KKworICAgIC8qIFNldCBBQyBIdWZmbWFuIExVVCBzdGFydCBhZGRyZXNzICovCisgICAgZGF0YTMyID0gMDsKKyAgICBkYXRhMzIgfD0gMCA8PCAxNjsgLyogWzE2XSAwPVdyaXRlIExVVCwgMT1SZWFkICovCisgICAgZGF0YTMyIHw9IDI0IDw8IDA7IC8qIFs4OjBdIFN0YXJ0IGFkZHIgPSAwICovCisgICAgV1JJVEVfSFJFRyhIQ09ERUNfVkxDX0hVRkZNQU5fQUREUiwgZGF0YTMyKTsKKworICAgIC8qIEJ1cnN0LXdyaXRlIEFDIEh1ZmZtYW4gTFVUIGRhdGEgKi8KKyAgICB3cml0ZV9qcGVnX2h1ZmZtYW5fbHV0X2FjKGFjX2h1ZmZfc2VsX2NvbXAwKTsKKyAgICBpZiAoYWNfaHVmZl9zZWxfY29tcDEgIT0gYWNfaHVmZl9zZWxfY29tcDApCisgICAgICAgIHdyaXRlX2pwZWdfaHVmZm1hbl9sdXRfYWMoYWNfaHVmZl9zZWxfY29tcDEpOworCisgICAgaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfQzEpIHsKKyAgICAgICAgaWYgKChhY19odWZmX3NlbF9jb21wMiAhPSBhY19odWZmX3NlbF9jb21wMCkKKyAgICAgICAgICAgICYmIChhY19odWZmX3NlbF9jb21wMiAhPSBhY19odWZmX3NlbF9jb21wMSkpCisgICAgICAgICAgICB3cml0ZV9qcGVnX2h1ZmZtYW5fbHV0X2FjKGFjX2h1ZmZfc2VsX2NvbXAyKTsKKyAgICB9CisKKyAgICAvKiBDb25maWd1cmUgZ2VuZXJhbCBjb250cm9sIHJlZ2lzdGVycyAqLworICAgIGRhdGEzMiA9IDA7CisgICAgLyogWzE5OjE4XSBkY3RfaW5mbG93X2N0cmw6IDA9Tm8gaGFsdDsgKi8KKyAgICAvKiAxPURDVCBoYWx0cyByZXF1ZXN0IGF0IGVuZCBvZiBlYWNoIDh4OCBibG9jazsgKi8KKyAgICAvKiAyPURDVCBoYWx0cyByZXF1ZXN0IGF0IGVuZCBvZiBlYWNoIE1DVS4gKi8KKyAgICBkYXRhMzIgfD0gMCA8PCAxODsKKyAgICAvKiBbMTc6MTZdIGpwZWdfY29lZmZfbGFzdF9zZWw6ICovCisgICAgLyogMD1NYXJrIGxhc3QgY29lZmYgYXQgdGhlIGVuZCBvZiBhbiA4eDggYmxvY2ssICovCisgICAgLyogMT1NYXJrIGxhc3QgY29lZmYgYXQgdGhlIGVuZCBvZiBhbiBNQ1UgKi8KKyAgICAvKiAyPU1hcmsgbGFzdCBjb2VmZiBhdCB0aGUgZW5kIG9mIGEgc2NhbiAqLworICAgIGRhdGEzMiB8PSBsYXN0Y29lZmZfc2VsIDw8IDE2OworICAgIC8qIFsxNV0ganBlZ19xdWFudF9zZWxfY29tcDIgKi8KKyAgICBkYXRhMzIgfD0gKChxX3NlbF9jb21wMiA9PSBxX3NlbF9jb21wMCkgPyAwIDogMSkgPDwgMTU7CisgICAgLyogWzE0XSBqcGVnX3ZfZmFjdG9yX2NvbXAyICovCisgICAgZGF0YTMyIHw9IHZfZmFjdG9yX2NvbXAyIDw8IDE0OworICAgIC8qIFsxM10ganBlZ19oX2ZhY3Rvcl9jb21wMiAqLworICAgIGRhdGEzMiB8PSBoX2ZhY3Rvcl9jb21wMiA8PCAxMzsKKyAgICAvKiBbMTJdIGpwZWdfY29tcDJfZW4gKi8KKyAgICBkYXRhMzIgfD0gMSA8PCAxMjsKKyAgICAvKiBbMTFdIGpwZWdfcXVhbnRfc2VsX2NvbXAxICovCisgICAgZGF0YTMyIHw9ICgocV9zZWxfY29tcDEgPT0gcV9zZWxfY29tcDApID8gMCA6IDEpIDw8IDExOworICAgIC8qIFsxMF0ganBlZ192X2ZhY3Rvcl9jb21wMSAqLworICAgIGRhdGEzMiB8PSB2X2ZhY3Rvcl9jb21wMSA8PCAxMDsKKyAgICAvKiBbOV0ganBlZ19oX2ZhY3Rvcl9jb21wMSAqLworICAgIGRhdGEzMiB8PSBoX2ZhY3Rvcl9jb21wMSA8PCA5OworICAgIC8qIFs4XSBqcGVnX2NvbXAxX2VuICovCisgICAgZGF0YTMyIHw9IDEgPDwgODsKKyAgICAvKiBbN10ganBlZ19xdWFudF9zZWxfY29tcDAgKi8KKyAgICBkYXRhMzIgfD0gMCA8PCA3OworICAgIC8qIFs2XSBqcGVnX3ZfZmFjdG9yX2NvbXAwICovCisgICAgZGF0YTMyIHw9IHZfZmFjdG9yX2NvbXAwIDw8IDY7CisgICAgLyogWzVdIGpwZWdfaF9mYWN0b3JfY29tcDAgKi8KKyAgICBkYXRhMzIgfD0gaF9mYWN0b3JfY29tcDAgPDwgNTsKKyAgICAvKiBbNF0ganBlZ19jb21wMF9lbiAqLworICAgIGRhdGEzMiB8PSAxIDw8IDQ7CisgICAgLyogWzM6MV0gamRjdF9pbnRyX3NlbDowPURpc2FibGUgaW50cjsgKi8KKyAgICAvKiAxPUludHIgYXQgZW5kIG9mIGVhY2ggOHg4IGJsb2NrIG9mIERDVCBpbnB1dDsgKi8KKyAgICAvKiAyPUludHIgYXQgZW5kIG9mIGVhY2ggTUNVIG9mIERDVCBpbnB1dDsgKi8KKyAgICAvKiAzPUludHIgYXQgZW5kIG9mIGEgc2NhbiBvZiBEQ1QgaW5wdXQ7ICovCisgICAgLyogND1JbnRyIGF0IGVuZCBvZiBlYWNoIDh4OCBibG9jayBvZiBEQ1Qgb3V0cHV0OyAqLworICAgIC8qIDU9SW50ciBhdCBlbmQgb2YgZWFjaCBNQ1Ugb2YgRENUIG91dHB1dDsgKi8KKyAgICAvKiA2PUludHIgYXQgZW5kIG9mIGEgc2NhbiBvZiBEQ1Qgb3V0cHV0LiAqLworICAgIGRhdGEzMiB8PSBqZGN0X2ludHJfc2VsIDw8IDE7CisgICAgLyogWzBdIGpwZWdfZW4gKi8KKyAgICBkYXRhMzIgfD0gMSA8PCAwOworICAgIFdSSVRFX0hSRUcoSENPREVDX1FEQ1RfSlBFR19DVFJMLCBkYXRhMzIpOworCisgICAgZGF0YTMyID0gMDsKKyAgICBkYXRhMzIgfD0gKChhY19odWZmX3NlbF9jb21wMiA9PSBhY19odWZmX3NlbF9jb21wMCk/IDAgOiAxKSA8PCAyOTsgIC8vIFsgICAyOV0ganBlZ19jb21wMl9hY190YWJsZV9zZWwKKyAgICBkYXRhMzIgfD0gKChkY19odWZmX3NlbF9jb21wMiA9PSBkY19odWZmX3NlbF9jb21wMCk/IDAgOiAxKSA8PCAyODsgIC8vIFsgICAyOF0ganBlZ19jb21wMl9kY190YWJsZV9zZWwKKyAgICAvKiBbMjY6MjVdIGpwZWdfY29tcDJfY250X21heCAqLworICAgIGRhdGEzMiB8PSAoKGhfZmFjdG9yX2NvbXAyICsgMSkgKiAodl9mYWN0b3JfY29tcDIgKyAxKSAtIDEpIDw8IDI1OworICAgIC8qIFsyNF0ganBlZ19jb21wMl9lbiAqLworICAgIGRhdGEzMiB8PSAxIDw8IDI0OworICAgIGRhdGEzMiB8PSAoKGFjX2h1ZmZfc2VsX2NvbXAxID09IGFjX2h1ZmZfc2VsX2NvbXAwKT8gMCA6IDEpIDw8IDIxOyAgLy8gWyAgIDIxXSBqcGVnX2NvbXAxX2FjX3RhYmxlX3NlbAorICAgIGRhdGEzMiB8PSAoKGRjX2h1ZmZfc2VsX2NvbXAxID09IGRjX2h1ZmZfc2VsX2NvbXAwKT8gMCA6IDEpIDw8IDIwOyAgLy8gWyAgIDIwXSBqcGVnX2NvbXAxX2RjX3RhYmxlX3NlbAorICAgIC8qIFsxODoxN10ganBlZ19jb21wMV9jbnRfbWF4ICovCisgICAgZGF0YTMyIHw9ICgoaF9mYWN0b3JfY29tcDEgKyAxKSAqICh2X2ZhY3Rvcl9jb21wMSArIDEpIC0gMSkgPDwgMTc7CisgICAgLyogWzE2XSBqcGVnX2NvbXAxX2VuICovCisgICAgZGF0YTMyIHw9IDEgPDwgMTY7CisgICAgLyogWzEzXSBqcGVnX2NvbXAwX2FjX3RhYmxlX3NlbCAqLworICAgIGRhdGEzMiB8PSAwIDw8IDEzOworICAgIC8qIFsxMl0ganBlZ19jb21wMF9kY190YWJsZV9zZWwgKi8KKyAgICBkYXRhMzIgfD0gMCA8PCAxMjsKKyAgICAvKiBbMTA6OV0ganBlZ19jb21wMF9jbnRfbWF4ICovCisgICAgZGF0YTMyIHw9ICgoaF9mYWN0b3JfY29tcDAgKyAxKSAqICh2X2ZhY3Rvcl9jb21wMCArIDEpIC0gMSkgPDwgOTsKKyAgICAvKiBbOF0ganBlZ19jb21wMF9lbiAqLworICAgIGRhdGEzMiB8PSAxIDw8IDg7CisgICAgLyogWzBdIGpwZWdfZW4sIHdpbGwgYmUgZW5ibGVkIGJ5IGFtcmlzYyAqLworICAgIGRhdGEzMiB8PSAwIDw8IDA7CisgICAgV1JJVEVfSFJFRyhIQ09ERUNfVkxDX0pQRUdfQ1RSTCwgZGF0YTMyKTsKKworICAgIFdSSVRFX0hSRUcoSENPREVDX1FEQ1RfTUJfQ09OVFJPTCwKKyAgICAgICAgKDEgPDwgOSkgfCAvKiBtYl9pbmZvX3NvZnRfcmVzZXQgKi8KKyAgICAgICAgKDEgPDwgMCkpOyAvKiBtYiByZWFkIGJ1ZmZlciBzb2Z0IHJlc2V0ICovCisKKyAgICBXUklURV9IUkVHKEhDT0RFQ19RRENUX01CX0NPTlRST0wsCisgICAgICAgICgwIDw8IDI4KSB8IC8qIGlnbm9yZV90X3A4eDggKi8KKyAgICAgICAgKDAgPDwgMjcpIHwgLyogemVyb19tY19vdXRfbnVsbF9ub25fc2tpcHBlZF9tYiAqLworICAgICAgICAoMCA8PCAyNikgfCAvKiBub19tY19vdXRfbnVsbF9ub25fc2tpcHBlZF9tYiAqLworICAgICAgICAoMCA8PCAyNSkgfCAvKiBtY19vdXRfZXZlbl9za2lwcGVkX21iICovCisgICAgICAgICgwIDw8IDI0KSB8IC8qIG1jX291dF93YWl0X2NicF9yZWFkeSAqLworICAgICAgICAoMCA8PCAyMykgfCAvKiBtY19vdXRfd2FpdF9tYl90eXBlX3JlYWR5ICovCisgICAgICAgICgwIDw8IDI5KSB8IC8qIGllX3N0YXJ0X2ludF9lbmFibGUgKi8KKyAgICAgICAgKDAgPDwgMTkpIHwgLyogaV9wcmVkX2VuYWJsZSAqLworICAgICAgICAoMCA8PCAyMCkgfCAvKiBpZV9zdWJfZW5hYmxlICovCisgICAgICAgICgwIDw8IDE4KSB8IC8qIGlxX2VuYWJsZSAqLworICAgICAgICAoMCA8PCAxNykgfCAvKiBpZGN0X2VuYWJsZSAqLworICAgICAgICAoMCA8PCAxNCkgfCAvKiBtYl9wYXVzZV9lbmFibGUgKi8KKyAgICAgICAgKDEgPDwgMTMpIHwgLyogcV9lbmFibGUgKi8KKyAgICAgICAgKDEgPDwgMTIpIHwgLyogZGN0X2VuYWJsZSAqLworICAgICAgICAoMCA8PCAxMCkgfCAvKiBtYl9pbmZvX2VuICovCisgICAgICAgICgwIDw8IDMpIHwgLyogZW5kaWFuICovCisgICAgICAgICgwIDw8IDEpIHwgLyogbWJfcmVhZF9lbiAqLworICAgICAgICAoMCA8PCAwKSk7IC8qIHNvZnQgcmVzZXQgKi8KKworICAgIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0MxKSB7CisgICAgICAgIC8vIElOSVRfRU5DT0RFUgorICAgICAgICBXUklURV9IUkVHKEhDT0RFQ19WTENfVE9UQUxfQllURVMsIDApOworICAgICAgICBXUklURV9IUkVHKEhDT0RFQ19WTENfSU5UX0NPTlRST0wsIDApOy8vIGRpc2FibGUgdmxjIGludGVycnVwdAorCisgICAgICAgIFdSSVRFX0hSRUcoSENPREVDX0hFTkNfU0NSQVRDSF8wLCAwKTsvLyBtdHNwaSAgIEVOQ09ERVJfSURMRSA9ICggRU5DT0RFUl9TVEFUVVMKKyAgICAgICAgV1JJVEVfSFJFRyhIQ09ERUNfSEVOQ19TQ1JBVENIXzEsIDB4ZmZmZmZmZmYpOy8vIHJlc2V0IE1DVV9YWV9SRUcKKworICAgICAgICBXUklURV9IUkVHKEhDT0RFQ19BU1NJU1RfQU1SMV9JTlQwLCAweDE1KTsvLyB2Yl9mdWxsX2lzcgorICAgICAgICBXUklURV9IUkVHKEhDT0RFQ19BU1NJU1RfQU1SMV9JTlQxLCA4KTsvLyB2bGNfaXNyCisgICAgICAgIFdSSVRFX0hSRUcoSENPREVDX0FTU0lTVF9BTVIxX0lOVDMsIDB4MTQpOy8vIHFkY3RfaXNyCisgICAgfQorCisgICAgLyogQXNzZW1iZXIgSlBFRyBmaWxlIGhlYWRlciAqLworICAgIHByZXBhcmVfanBlZ19oZWFkZXIod3EpOworfQorCitzdGF0aWMgdm9pZCBqcGVnZW5jX2luaXRfb3V0cHV0X2J1ZmZlcihzdHJ1Y3QganBlZ2VuY193cV9zICp3cSkKK3sKKyAgICBXUklURV9IUkVHKEhDT0RFQ19WTENfVkJfTUVNX0NUTCwKKyAgICAgICAgKCgxIDw8IDMxKSB8ICgweDNmIDw8IDI0KSB8CisgICAgICAgICgweDIwIDw8IDE2KSB8ICgyIDw8IDApKSk7CisKKyAgICBXUklURV9IUkVHKEhDT0RFQ19WTENfVkJfU1RBUlRfUFRSLCB3cS0+Qml0c3RyZWFtU3RhcnQpOworICAgIFdSSVRFX0hSRUcoSENPREVDX1ZMQ19WQl9XUl9QVFIsICAgIHdxLT5CaXRzdHJlYW1TdGFydCk7CisgICAgV1JJVEVfSFJFRyhIQ09ERUNfVkxDX1ZCX1NXX1JEX1BUUiwgd3EtPkJpdHN0cmVhbVN0YXJ0KTsKKyAgICBXUklURV9IUkVHKEhDT0RFQ19WTENfVkJfRU5EX1BUUiwgICB3cS0+Qml0c3RyZWFtRW5kKTsKKyAgICBXUklURV9IUkVHKEhDT0RFQ19WTENfVkJfQ09OVFJPTCwgICAxKTsKKyAgICBXUklURV9IUkVHKEhDT0RFQ19WTENfVkJfQ09OVFJPTCwKKyAgICAgICAgKCgwIDw8IDE0KSB8ICg3IDw8IDMpIHwKKyAgICAgICAgKDEgPDwgMSkgfCAoMCA8PCAwKSkpOworfQorCitzdGF0aWMgdm9pZCBqcGVnZW5jX2J1ZmZzcGVjX2luaXQoc3RydWN0IGpwZWdlbmNfd3FfcyAqd3EpCit7CisgICAgLyogaW5wdXQgZGN0IGJ1ZmZlciBjb25maWcgKi8KKyAgICB3cS0+SW5wdXRCdWZmU3RhcnQgPSB3cS0+YnVmX3N0YXJ0ICsgZ0pwZWdlbmMubWVtLmJ1ZnNwZWMtPmlucHV0LmJ1Zl9zdGFydDsKKyAgICB3cS0+SW5wdXRCdWZmRW5kID0gd3EtPklucHV0QnVmZlN0YXJ0ICsgZ0pwZWdlbmMubWVtLmJ1ZnNwZWMtPmlucHV0LmJ1Zl9zaXplIC0gMTsKKyAgICBqZW5jX3ByKExPR19JTkZPLCAiSW5wdXRCdWZmU3RhcnQgaXMgMHgleFxuIiwgd3EtPklucHV0QnVmZlN0YXJ0KTsKKworICAgIC8qIGFzc2l0IHN0cmVhbSBidWZmZXIgY29uZmlnICovCisgICAgd3EtPkFzc2l0U3RhcnQgPSAgd3EtPmJ1Zl9zdGFydCArIGdKcGVnZW5jLm1lbS5idWZzcGVjLT5hc3NpdC5idWZfc3RhcnQ7CisgICAgd3EtPkFzc2l0RW5kID0gd3EtPkFzc2l0U3RhcnQgKyBnSnBlZ2VuYy5tZW0uYnVmc3BlYy0+YXNzaXQuYnVmX3NpemUgLSAxOworICAgIC8qIG91dHB1dCBzdHJlYW0gYnVmZmVyIGNvbmZpZyAqLworICAgIHdxLT5CaXRzdHJlYW1TdGFydCA9ICB3cS0+YnVmX3N0YXJ0ICsgZ0pwZWdlbmMubWVtLmJ1ZnNwZWMtPmJpdHN0cmVhbS5idWZfc3RhcnQ7CisgICAgd3EtPkJpdHN0cmVhbUVuZCA9IHdxLT5CaXRzdHJlYW1TdGFydCArIGdKcGVnZW5jLm1lbS5idWZzcGVjLT5iaXRzdHJlYW0uYnVmX3NpemUgLSAxOworICAgIGplbmNfcHIoTE9HX0lORk8sICJCaXRzdHJlYW1TdGFydCBpcyAweCV4XG4iLCB3cS0+Qml0c3RyZWFtU3RhcnQpOworCisgICAgd3EtPkFzc2l0c3RyZWFtU3RhcnRWaXJ0QWRkciA9IHBoeXNfdG9fdmlydCh3cS0+QXNzaXRTdGFydCk7CisgICAgamVuY19wcihMT0dfSU5GTywgIkFzc2l0c3RyZWFtU3RhcnRWaXJ0QWRkciBpcyAlcFxuIiwgd3EtPkFzc2l0c3RyZWFtU3RhcnRWaXJ0QWRkcik7Cit9CisKKy8qIGZvciB0ZW1wICovCisjZGVmaW5lIEhDT0RFQ19NRkRJTl9SRUdDX01CTFAgICAgICAgIChIQ09ERUNfTUZESU5fUkVHQl9BTVBDICsgMHgxKQorI2RlZmluZSBIQ09ERUNfTUZESU5fUkVHMEQgICAgICAgICAgICAoSENPREVDX01GRElOX1JFR0JfQU1QQyArIDB4MikKKyNkZWZpbmUgSENPREVDX01GRElOX1JFRzBFICAgICAgICAgICAgKEhDT0RFQ19NRkRJTl9SRUdCX0FNUEMgKyAweDMpCisjZGVmaW5lIEhDT0RFQ19NRkRJTl9SRUcwRiAgICAgICAgICAgIChIQ09ERUNfTUZESU5fUkVHQl9BTVBDICsgMHg0KQorI2RlZmluZSBIQ09ERUNfTUZESU5fUkVHMTAgICAgICAgICAgICAoSENPREVDX01GRElOX1JFR0JfQU1QQyArIDB4NSkKKyNkZWZpbmUgSENPREVDX01GRElOX1JFRzExICAgICAgICAgICAgKEhDT0RFQ19NRkRJTl9SRUdCX0FNUEMgKyAweDYpCisjZGVmaW5lIEhDT0RFQ19NRkRJTl9SRUcxMiAgICAgICAgICAgIChIQ09ERUNfTUZESU5fUkVHQl9BTVBDICsgMHg3KQorI2RlZmluZSBIQ09ERUNfTUZESU5fUkVHMTMgICAgICAgICAgICAoSENPREVDX01GRElOX1JFR0JfQU1QQyArIDB4OCkKKyNkZWZpbmUgSENPREVDX01GRElOX1JFRzE0ICAgICAgICAgICAgKEhDT0RFQ19NRkRJTl9SRUdCX0FNUEMgKyAweDkpCisjZGVmaW5lIEhDT0RFQ19NRkRJTl9SRUcxNSAgICAgICAgICAgIChIQ09ERUNfTUZESU5fUkVHQl9BTVBDICsgMHhhKQorI2RlZmluZSBIQ09ERUNfTUZESU5fUkVHMTYgICAgICAgICAgICAoSENPREVDX01GRElOX1JFR0JfQU1QQyArIDB4YikKKworc3RhdGljIHZvaWQgbWZkaW5fYmFzaWNfanBlZygKKyAgICB1MzIgaW5wdXQsIHU4IGlmb3JtYXQsIHU4IG9mb3JtYXQsIHUzMiBwaWNzaXplX3gsCisgICAgdTMyIHBpY3NpemVfeSwgdTggcjJ5X2VuLCB1OCBpZm10X2V4dHJhLAorICAgIGludCBtZmRpbl9jYW52YXMwX3N0cmlkZSwKKyAgICBpbnQgbWZkaW5fY2FudmFzMV9zdHJpZGUsCisgICAgaW50IG1mZGluX2NhbnZhczJfc3RyaWRlLAorICAgIGludCBtZmRpbl9jYW52YXMwX2Jsa21vZGUsCisgICAgaW50IG1mZGluX2NhbnZhczFfYmxrbW9kZSwKKyAgICBpbnQgbWZkaW5fY2FudmFzMl9ibGttb2RlLAorICAgIGludCBtZmRpbl9jYW52YXMwX2FkZHIsCisgICAgaW50IG1mZGluX2NhbnZhczFfYWRkciwKKyAgICBpbnQgbWZkaW5fY2FudmFzMl9hZGRyLAorICAgIGludCBtZmRpbl9jYW52YXNfYmlhcywKKyAgICBib29sIG1mZGluX2JpZ19lbmRpYW4pCit7CisgICAgdTggZHNhbXBsZV9lbjsgLyogRG93bnNhbXBsZSBFbmFibGUgKi8KKyAgICB1OCBpbnRlcnBfZW47IC8qIEludGVycG9sYXRpb24gRW5hYmxlICovCisgICAgdTggeV9zaXplOyAvKiAwOjE2IFBpeGVscyBmb3IgeSBkaXJlY3Rpb24gcGlja3VwOyAxOjggcGl4ZWxzICovCisgICAgdTggcjJ5X21vZGU7IC8qIFJHQjJZVVYgTW9kZSwgcmFuZ2UoMH4zKSAqLworICAgIC8qIG1mZGluX3JlZzNfY2FudlsyNToyNF07ICovCisgICAgLyogYnl0ZXMgcGVyIHBpeGVsIGluIHggZGlyZWN0aW9uIGZvciBpbmRleDAsIDA6aGFsZiAxOjEgMjoyIDM6MyAqLworICAgIHU4IGNhbnZfaWR4MF9icHB4OworICAgIC8qIG1mZGluX3JlZzNfY2FudlsyNzoyNl07ICovCisgICAgLyogYnl0ZXMgcGVyIHBpeGVsIGluIHggZGlyZWN0aW9uIGZvciBpbmRleDEtMiwgMDpoYWxmIDE6MSAyOjIgMzozICovCisgICAgdTggY2Fudl9pZHgxX2JwcHg7CisgICAgLyogbWZkaW5fcmVnM19jYW52WzI5OjI4XTsgKi8KKyAgICAvKiBieXRlcyBwZXIgcGl4ZWwgaW4geSBkaXJlY3Rpb24gZm9yIGluZGV4MCwgMDpoYWxmIDE6MSAyOjIgMzozICovCisgICAgdTggY2Fudl9pZHgwX2JwcHk7CisgICAgLyogbWZkaW5fcmVnM19jYW52WzMxOjMwXTsgKi8KKyAgICAvKiBieXRlcyBwZXIgcGl4ZWwgaW4geSBkaXJlY3Rpb24gZm9yIGluZGV4MS0yLCAwOmhhbGYgMToxIDI6MiAzOjMgKi8KKyAgICB1OCBjYW52X2lkeDFfYnBweTsKKyAgICB1OCBpZm10NDQ0LCBpZm10NDIyLCBpZm10NDIwLCBsaW5lYXJfYnl0ZXM0cDsKKyAgICB1MzIgbGluZWFyX2J5dGVzcGVybGluZTsKKyAgICBpbnQgbWZkaW5faW5wdXRfbW9kZSA9IDA7CisgICAgLy9zMzIgcmVnX29mZnNldDsKKyAgICBib29sIGZvcm1hdF9lcnIgPSBmYWxzZTsKKyAgICB1MzIgZGF0YTMyOworCisgICAgaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVFhMKSB7CisgICAgICAgIGlmICgoaWZvcm1hdCA9PSA3KSAmJiAoaWZtdF9leHRyYSA+IDIpKQorICAgICAgICAgICAgZm9ybWF0X2VyciA9IHRydWU7CisgICAgfSBlbHNlIGlmIChpZm9ybWF0ID09IDcpCisgICAgICAgIGZvcm1hdF9lcnIgPSB0cnVlOworCisgICAgaWYgKGZvcm1hdF9lcnIpIHsKKyAgICAgICAgamVuY19wcihMT0dfRVJST1IsCisgICAgICAgICAgICAibWZkaW4gZm9ybWF0IGVyciwgaWZvcm1hdDolZCwgaWZtdF9leHRyYTolZFxuIiwKKyAgICAgICAgICAgIGlmb3JtYXQsIGlmbXRfZXh0cmEpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChpZm9ybWF0ICE9IDcpCisgICAgICAgIGlmbXRfZXh0cmEgPSAwOworCisgICAgaWZtdDQ0NCA9ICgoaWZvcm1hdCA9PSAxKSB8fCAoaWZvcm1hdCA9PSA1KSB8fCAoaWZvcm1hdCA9PSA4KQorICAgICAgICB8fCAoaWZvcm1hdCA9PSA5KSB8fCAoaWZvcm1hdCA9PSAxMikpID8gMSA6IDA7CisgICAgaWYgKGlmb3JtYXQgPT0gNyAmJiBpZm10X2V4dHJhID09IDEpCisgICAgICAgIGlmbXQ0NDQgPSAxOworICAgIGlmbXQ0MjIgPSAoKGlmb3JtYXQgPT0gMCkgfHwgKGlmb3JtYXQgPT0gMTApKSA/IDEgOiAwOworICAgIGlmIChpZm9ybWF0ID09IDcgJiYgaWZtdF9leHRyYSAhPSAxKQorICAgICAgICBpZm10NDIyID0gMTsKKyAgICBpZm10NDIwID0gKChpZm9ybWF0ID09IDIpIHx8IChpZm9ybWF0ID09IDMpIHx8IChpZm9ybWF0ID09IDQpCisgICAgICAgIHx8IChpZm9ybWF0ID09IDExKSkgPyAxIDogMDsKKyAgICBkc2FtcGxlX2VuID0gKChpZm10NDQ0ICYmIChvZm9ybWF0ICE9IDIpKQorICAgICAgICB8fCAoaWZtdDQyMiAmJiAob2Zvcm1hdCA9PSAwKSkpID8gMSA6IDA7CisgICAgaW50ZXJwX2VuID0gKChpZm10NDIyICYmIChvZm9ybWF0ID09IDIpKQorICAgICAgICAgICAgIHx8IChpZm10NDIwICYmIChvZm9ybWF0ICE9IDApKSkgPyAxIDogMDsKKyAgICB5X3NpemUgPSAob2Zvcm1hdCAhPSAwKSA/IDEgOiAwOworICAgIC8qIHIyeV9tb2RlID0gKHIyeV9lbiA9PSAxKSA/IDEgOiAwOyAqLworICAgIHIyeV9tb2RlID0gMTsKKyAgICBjYW52X2lkeDBfYnBweCA9IChpZm9ybWF0ID09IDEpID8gMyA6IChpZm9ybWF0ID09IDApID8gMiA6IDE7CisgICAgY2Fudl9pZHgxX2JwcHggPSAoaWZvcm1hdCA9PSA0KSA/IDAgOiAxOworICAgIGNhbnZfaWR4MF9icHB5ID0gMTsKKyAgICBjYW52X2lkeDFfYnBweSA9IChpZm9ybWF0ID09IDUpID8gMSA6IDA7CisKKyAgICBpZiAoKGlmb3JtYXQgPT0gOCkgfHwgKGlmb3JtYXQgPT0gOSkgfHwgKGlmb3JtYXQgPT0gMTIpKQorICAgICAgICBsaW5lYXJfYnl0ZXM0cCA9IDM7CisgICAgZWxzZSBpZiAoaWZvcm1hdCA9PSAxMCkKKyAgICAgICAgbGluZWFyX2J5dGVzNHAgPSAyOworICAgIGVsc2UgaWYgKGlmb3JtYXQgPT0gMTEpCisgICAgICAgIGxpbmVhcl9ieXRlczRwID0gMTsKKyAgICBlbHNlCisgICAgICAgIGxpbmVhcl9ieXRlczRwID0gMDsKKyAgICBsaW5lYXJfYnl0ZXNwZXJsaW5lID0gcGljc2l6ZV94ICogbGluZWFyX2J5dGVzNHA7CisKKyAgICBpZiAoaWZvcm1hdCA8IDgpCisgICAgICAgIG1mZGluX2lucHV0X21vZGUgPSAwOworICAgIGVsc2UKKyAgICAgICAgbWZkaW5faW5wdXRfbW9kZSA9IDE7CisKKyAgICBpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9DMSkKKyAgICAgICAgbWZkaW5faW5wdXRfbW9kZSA9IDI7CisKKyAgICBpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWEJCKSB7CisgICAgICAgIHJlZ19vZmZzZXQgPSAtODsKKyAgICAgICAgaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfQzEpCisgICAgICAgICAgICBXUklURV9IUkVHKChIQ09ERUNfTUZESU5fUkVHOF9ETUJMICsgcmVnX29mZnNldCksCisgICAgICAgICAgICAgICAgKHBpY3NpemVfeCA8PCAxNikgfCAocGljc2l6ZV95IDw8IDApKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgV1JJVEVfSFJFRygoSENPREVDX01GRElOX1JFRzhfRE1CTCArIHJlZ19vZmZzZXQpLAorICAgICAgICAgICAgICAgIChwaWNzaXplX3ggPDwgMTQpIHwgKHBpY3NpemVfeSA8PCAwKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVnX29mZnNldCA9IDA7CisgICAgICAgIFdSSVRFX0hSRUcoKEhDT0RFQ19NRkRJTl9SRUc4X0RNQkwgKyByZWdfb2Zmc2V0KSwKKyAgICAgICAgICAgIChwaWNzaXplX3ggPDwgMTIpIHwgKHBpY3NpemVfeSA8PCAwKSk7CisgICAgfQorCisgICAgV1JJVEVfSFJFRygoSENPREVDX01GRElOX1JFRzFfQ1RSTCArIHJlZ19vZmZzZXQpLAorICAgICAgICAoaWZvcm1hdCA8PCAwKSB8CisgICAgICAgIChvZm9ybWF0IDw8IDQpIHwKKyAgICAgICAgKGRzYW1wbGVfZW4gPDwgNikgfAorICAgICAgICAoeV9zaXplIDw8IDgpIHwKKyAgICAgICAgKGludGVycF9lbiA8PCA5KSB8CisgICAgICAgIChyMnlfZW4gPDwgMTIpIHwKKyAgICAgICAgKHIyeV9tb2RlIDw8IDEzKSB8CisgICAgICAgIChpZm10X2V4dHJhIDw8IDE2KSB8CisgICAgICAgICgwIDw8MTkpIHwgLy8gMDpOUiBOb3QgRW5hYmxlZAorICAgICAgICAoMiA8PDI5KSB8IC8vIDA6SDI2NF9JX1BJQ19BTExfNHg0LCAxOkgyNjRfUF9QSUNfWV8xNngxNl9DXzh4OCwgMjpKUEVHX0FMTF84eDgsIDM6UmVzZXJ2ZWQKKyAgICAgICAgKDAgPDwzMSkpOyAgLy8gMDpZQyBpbnRlcmxlYXZlZCAxOllDIG5vbi1pbnRlcmxlYXZlZChmb3IgSlBFRykKKworICAgIGlmIChtZmRpbl9pbnB1dF9tb2RlID09IDApIHsKKyAgICAgICAgV1JJVEVfSFJFRygoSENPREVDX01GRElOX1JFRzNfQ0FOViArIHJlZ19vZmZzZXQpLAorICAgICAgICAgICAgKGlucHV0ICYgMHhmZmZmZmYpIHwKKyAgICAgICAgICAgIChjYW52X2lkeDFfYnBweSA8PCAzMCkgfAorICAgICAgICAgICAgKGNhbnZfaWR4MF9icHB5IDw8IDI4KSB8CisgICAgICAgICAgICAoY2Fudl9pZHgxX2JwcHggPDwgMjYpIHwKKyAgICAgICAgICAgIChjYW52X2lkeDBfYnBweCA8PCAyNCkpOworICAgICAgICBXUklURV9IUkVHKChIQ09ERUNfTUZESU5fUkVHNF9MTlIwICsgcmVnX29mZnNldCksCisgICAgICAgICAgICAoMCA8PCAxNikgfCAoMCA8PCAwKSk7CisgICAgICAgIFdSSVRFX0hSRUcoKEhDT0RFQ19NRkRJTl9SRUc1X0xOUjEgKyByZWdfb2Zmc2V0KSwgMCk7CisgICAgfSBlbHNlIGlmIChtZmRpbl9pbnB1dF9tb2RlID09IDEpIHsKKyAgICAgICAgV1JJVEVfSFJFRygoSENPREVDX01GRElOX1JFRzNfQ0FOViArIHJlZ19vZmZzZXQpLAorICAgICAgICAgICAgKGNhbnZfaWR4MV9icHB5IDw8IDMwKSB8CisgICAgICAgICAgICAoY2Fudl9pZHgwX2JwcHkgPDwgMjgpIHwKKyAgICAgICAgICAgIChjYW52X2lkeDFfYnBweCA8PCAyNikgfAorICAgICAgICAgICAgKGNhbnZfaWR4MF9icHB4IDw8IDI0KSk7CisgICAgICAgIFdSSVRFX0hSRUcoKEhDT0RFQ19NRkRJTl9SRUc0X0xOUjAgKyByZWdfb2Zmc2V0KSwKKyAgICAgICAgICAgIChsaW5lYXJfYnl0ZXM0cCA8PCAxNikgfCAobGluZWFyX2J5dGVzcGVybGluZSA8PCAwKSk7CisgICAgICAgIFdSSVRFX0hSRUcoKEhDT0RFQ19NRkRJTl9SRUc1X0xOUjEgKyByZWdfb2Zmc2V0KSwgaW5wdXQpOworICAgIH0gZWxzZSBpZiAobWZkaW5faW5wdXRfbW9kZSA9PSAyKSB7CisgICAgICAgIFdSSVRFX0hSRUcoKEhDT0RFQ19NRkRJTl9SRUczX0NBTlYgKyByZWdfb2Zmc2V0KSwKKyAgICAgICAgICAgIChjYW52X2lkeDFfYnBweSA8PCAzMCkgfAorICAgICAgICAgICAgKGNhbnZfaWR4MF9icHB5IDw8IDI4KSB8CisgICAgICAgICAgICAoY2Fudl9pZHgxX2JwcHggPDwgMjYpIHwKKyAgICAgICAgICAgIChjYW52X2lkeDBfYnBweCA8PCAyNCkpOworICAgICAgICBXUklURV9IUkVHKChIQ09ERUNfTUZESU5fUkVHNF9MTlIwICsgcmVnX29mZnNldCksCisgICAgICAgICAgICBtZmRpbl9jYW52YXMwX3N0cmlkZSA8PCAwKTsKKyAgICAgICAgV1JJVEVfSFJFRygoSENPREVDX01GRElOX1JFRzVfTE5SMSArIHJlZ19vZmZzZXQpLCBtZmRpbl9jYW52YXMwX2FkZHIpOworCisgICAgICAgIFdSSVRFX0hSRUcoSENPREVDX01GRElOX1JFRzE3LCBtZmRpbl9jYW52YXMxX2FkZHIpOyAgICAgICAgLy8gVSBjYW52YXMgaW5pdGlhbCBhZGRyZXNzCisgICAgICAgIFdSSVRFX0hSRUcoSENPREVDX01GRElOX1JFRzE4LCBtZmRpbl9jYW52YXMyX2FkZHIpOyAgICAgICAgLy8gViBjYW52YXMgaW5pdGlhbCBhZGRyZXNzCisgICAgICAgIFdSSVRFX0hSRUcoSENPREVDX01GRElOX1JFRzE5LCAobWZkaW5fY2FudmFzMV9zdHJpZGUgPDwgMTYpIHwgICAgLy8gVSBjYW52YXMgc3RyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtZmRpbl9jYW52YXMyX3N0cmlkZSA8PCAwKSk7CisKKyAgICAgICAgZGF0YTMyID0gUkVBRF9IUkVHKEhDT0RFQ19NRkRJTl9SRUc2X0RDRkcgKyByZWdfb2Zmc2V0KTsKKyAgICAgICAgZGF0YTMyID0gZGF0YTMyICYgMHgzZmY7CisKKyAgICAgICAgaWYgKGpwZWdfaW5fZnVsbF9oY29kZWMpIHsKKyAgICAgICAgICAgIHByX2VycigiSlBFR19JTl9GVUxMX0hDT0RFQ1xuIik7CisgICAgICAgICAgICBkYXRhMzIgfD0gKDA8PDE2KTsKKworICAgICAgICAgICAgaWYobWZkaW5fYW1idXNfY2Fudl9jb252KSB7CisgICAgICAgICAgICAgICAgZGF0YTMyIHw9ICgxPDwxNyk7IC8vIEFNQlVTCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhMzIgfD0gKDEgPDwgMTYpOyAvLyBBWEkgRW5hYmxlCisgICAgICAgIH0KKworICAgICAgICBkYXRhMzIgfD0gKG1mZGluX2NhbnZhczBfYmxrbW9kZSA8PCAxNCkgfCAgICAgICAgLy8gViBjYW52YXMgYmxvY2sgbW9kZQorICAgICAgICAgICAgICAgICAgKG1mZGluX2NhbnZhczFfYmxrbW9kZSA8PCAxMikgfCAgICAgICAgLy8gVSBjYW52YXMgYmxvY2sgbW9kZQorICAgICAgICAgICAgICAgICAgKG1mZGluX2NhbnZhczJfYmxrbW9kZSA8PCAxMCk7ICAgICAgICAgLy8gWSBjYW52YXMgYmxvY2sgbW9kZQorCisgICAgICAgIFdSSVRFX0hSRUcoSENPREVDX01GRElOX1JFRzZfRENGRyArIHJlZ19vZmZzZXQsIGRhdGEzMik7CisKKyAgICAgICAgaWYgKG1mZGluX2NhbnZhc19iaWFzKQorICAgICAgICAgICAgV1JJVEVfSFJFRyhIQ09ERUNfTUZESU5fUkVHQV9DQVYxICsgcmVnX29mZnNldCwgbWZkaW5fY2FudmFzX2JpYXMpOworICAgIH0KKworICAgIGlmICghbWZkaW5fYmlnX2VuZGlhbikgeworICAgICAgICBXUklURV9IUkVHKChIQ09ERUNfTUZESU5fUkVHOV9FTkROICsgcmVnX29mZnNldCksCisgICAgICAgICAgICAoNyA8PCAwKSB8ICg2IDw8IDMpIHwgKDUgPDwgNikgfAorICAgICAgICAgICAgKDQgPDwgOSkgfCAoMyA8PCAxMikgfCAoMiA8PCAxNSkgfAorICAgICAgICAgICAgKDEgPDwgMTgpIHwgKDAgPDwgMjEpKTsKKyAgICB9CisKKyAgICBpZiAoanBlZ19pbl9mdWxsX2hjb2RlYykgey8vI2lmZGVmIEpQRUdfSU5fRlVMTF9IQ09ERUMKKyAgICAgICAgZGF0YTMyID0gUkVBRF9IUkVHKEhDT0RFQ19NRkRJTl9SRUczX0NBTlYgKyByZWdfb2Zmc2V0KTsKKyAgICAgICAgV1JJVEVfSFJFRyhIQ09ERUNfTUZESU5fUkVHM19DQU5WICsgcmVnX29mZnNldCwgZGF0YTMyfCgweDEgPDwgOCl8KDB4MiA8PCAxNikpOworICAgIH0KKworICAgIGRhdGEzMiA9IFJFQURfSFJFRyhIQ09ERUNfTUZESU5fUkVHN19TQ01EICsgcmVnX29mZnNldCk7CisgICAgV1JJVEVfSFJFRyhIQ09ERUNfTUZESU5fUkVHN19TQ01EICsgcmVnX29mZnNldCwgZGF0YTMyIHwgKDB4MSA8PCAyOCkpOyAvLyBNRkRJTiBFbmFibGVkCisKKyAgICBqZW5jX3ByKExPR19JTkZPLCAiTUZESU4gRW5hYmxlZFxuIik7CisKKyAgICByZXR1cm47Cit9CisKKy8vI2RlZmluZSBDT05GSUdfQU1MT0dJQ19NRURJQV9DQU5WQVMKKworc3RhdGljIHMzMiBzZXRfanBlZ19pbnB1dF9mb3JtYXQoc3RydWN0IGpwZWdlbmNfd3FfcyAqd3EsCisgICAgc3RydWN0IGpwZWdlbmNfcmVxdWVzdF9zICpjbWQpCit7CisgICAgczMyIHJldCA9IDA7CisgICAgdTggaWZvcm1hdCA9IEpQRUdFTkNfTUFYX0ZSQU1FX0ZNVDsKKyAgICB1OCBvZm9ybWF0ID0gSlBFR0VOQ19NQVhfRlJBTUVfRk1UOworICAgIHU4IHIyeV9lbiA9IDA7CisgICAgdTMyIHBpY3NpemVfeCA9IDAsIHBpY3NpemVfeSA9IDA7CisgICAgdTMyIGlucHV0ID0gY21kLT5zcmM7CisgICAgdTggaWZtdF9leHRyYSA9IDA7CisgICAgaW50IG1mZGluX2NhbnZhczBfc3RyaWRlID0gMCwgbWZkaW5fY2FudmFzMV9zdHJpZGUgPSAwLCBtZmRpbl9jYW52YXMyX3N0cmlkZSA9IDA7CisgICAgaW50IG1mZGluX2NhbnZhczBfYmxrbW9kZSA9IDAsIG1mZGluX2NhbnZhczFfYmxrbW9kZSA9IDAsIG1mZGluX2NhbnZhczJfYmxrbW9kZSA9IDA7CisgICAgaW50IG1mZGluX2NhbnZhczBfYWRkciA9IDAsIG1mZGluX2NhbnZhczFfYWRkciA9IDAsIG1mZGluX2NhbnZhczJfYWRkciA9IDA7CisgICAgaW50IG1mZGluX2NhbnZhc19oZWlnaHQgPSAwOworICAgIGludCBtZmRpbl9jYW52YXNfYmlhcyA9IDA7CisgICAgYm9vbCBtZmRpbl9iaWdfZW5kaWFuID0gZmFsc2U7CisgICAgdTMyIGJsb2NrX21vZGUgPSAwOworCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfQ0FOVkFTCisgICAgdTMyIGNhbnZhc193ID0gMDsKKyNlbmRpZgorCisgICAgamVuY19wcihMT0dfSU5GTywgIioqKioqKioqKioqKmJlZ2luIHNldCBpbnB1dCBmb3JtYXQqKioqKioqKioqKioqKlxuIik7CisgICAgamVuY19wcihMT0dfSU5GTywgInR5cGUgaXMgJWRcbiIsIGNtZC0+dHlwZSk7CisgICAgamVuY19wcihMT0dfSU5GTywgImlucHV0X2ZtdCBpcyAlZFxuIiwgY21kLT5pbnB1dF9mbXQpOworICAgIGplbmNfcHIoTE9HX0lORk8sICJvdXRwdXRfZm10IGlzICVkXG4iLCBjbWQtPm91dHB1dF9mbXQpOworICAgIGplbmNfcHIoTE9HX0lORk8sICJpbnB1dCBpcyAweCV4XG4iLCBjbWQtPnNyYyk7CisgICAgamVuY19wcihMT0dfSU5GTywgInNpemUgaXMgJWRcbiIsIGNtZC0+ZnJhbWVzaXplKTsKKyAgICBqZW5jX3ByKExPR19JTkZPLCAicXVhbGl0eSBpcyAlZFxuIiwgY21kLT5qcGVnX3F1YWxpdHkpOworICAgIGplbmNfcHIoTE9HX0lORk8sICJxdWFudCB0YmxfaWQgaXMgJWRcbiIsIGNtZC0+UXVhbnRUYWJsZV9pZCk7CisgICAgamVuY19wcihMT0dfSU5GTywgImZsdXNoIGZsYWcgaXMgJWRcbiIsIGNtZC0+Zmx1c2hfZmxhZyk7CisgICAgamVuY19wcihMT0dfSU5GTywgImJsb2NrIG1vZGUgaXMgJWRcbiIsIGNtZC0+YmxvY2tfbW9kZSk7CisgICAgamVuY19wcihMT0dfSU5GTywgIioqKioqKioqKioqKmVuZCBzZXQgaW5wdXQgZm9ybWF0KioqKioqKioqKioqKipcbiIpOworCisgICAgaWYgKChjbWQtPnR5cGUgPT0gSlBFR0VOQ19MT0NBTF9CVUZGKSB8fAorICAgICAgICAoY21kLT50eXBlID09IEpQRUdFTkNfRE1BX0JVRkYpIHx8CisgICAgICAgIChjbWQtPnR5cGUgPT0gSlBFR0VOQ19QSFlTSUNBTF9CVUZGKSkgeworCisgICAgICAgIGlmIChjbWQtPnR5cGUgPT0gSlBFR0VOQ19MT0NBTF9CVUZGKSB7CisgICAgICAgICAgICBpZiAoY21kLT5mbHVzaF9mbGFnICYgSlBFR0VOQ19GTFVTSF9GTEFHX0lOUFVUKQorICAgICAgICAgICAgICAgIGRtYV9mbHVzaCh3cS0+SW5wdXRCdWZmU3RhcnQsIGNtZC0+ZnJhbWVzaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjbWQtPnR5cGUgPT0gSlBFR0VOQ19MT0NBTF9CVUZGIHx8IGNtZC0+dHlwZSA9PSBKUEVHRU5DX0RNQV9CVUZGKQorICAgICAgICAgICAgaW5wdXQgPSB3cS0+SW5wdXRCdWZmU3RhcnQ7CisKKyAgICAgICAgcGljc2l6ZV94ID0gKChjbWQtPmVuY29kZXJfd2lkdGggKyAxNSkgPj4gNCkgPDwgNDsKKyAgICAgICAgcGljc2l6ZV95ID0gKChjbWQtPmVuY29kZXJfaGVpZ2h0ICsgMTUpID4+IDQpIDw8IDQ7CisKKyAgICAgICAgaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfQzEpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBtZmRpbiBpbiAgZm10OiAgMDo0MjIgc2luZ2xlLCAxOjQ0NCBzaW5nbGUsIDI6TlYyMSwgMzpOVjEyLCA0OjQyMCBwbGFuZSwgNTo0NDQgcGxhbmUKKyAgICAgICAgICAgICAqIG1mZGluIG91dCBmbXQ6ICAwOjQyMCwgMTo0MjIsIDI6NDQ0CisgICAgICAgICAgICAgKiBwaWN0dXJlICAgZm10OiAgMDpSR0IsIDE6NDQ0LCAyOjQyMiwgMzo0MjAKKyAgICAgICAgICAgICAqIChvdXQsIHBpYykgICA6ICAoMCwzKSwgKDEsMiksICgyLDEpCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChjbWQtPmlucHV0X2ZtdCAgICAgPT0gSlBFR0VOQ19GTVRfWVVWNDIyX1NJTkdMRSkKKyAgICAgICAgICAgICAgICBpZm9ybWF0ID0gMDsKKworICAgICAgICAgICAgZWxzZSBpZiAoY21kLT5pbnB1dF9mbXQgPT0gSlBFR0VOQ19GTVRfWVVWNDQ0X1NJTkdMRSkKKyAgICAgICAgICAgICAgICBpZm9ybWF0ID0gMTsKKworICAgICAgICAgICAgZWxzZSBpZiAoY21kLT5pbnB1dF9mbXQgPT0gSlBFR0VOQ19GTVRfTlYyMSkKKyAgICAgICAgICAgICAgICBpZm9ybWF0ID0gMjsKKworICAgICAgICAgICAgZWxzZSBpZiAoY21kLT5pbnB1dF9mbXQgPT0gSlBFR0VOQ19GTVRfTlYxMikKKyAgICAgICAgICAgICAgICBpZm9ybWF0ID0gMzsKKworICAgICAgICAgICAgZWxzZSBpZiAoY21kLT5pbnB1dF9mbXQgPT0gSlBFR0VOQ19GTVRfWVVWNDIwKQorICAgICAgICAgICAgICAgIGlmb3JtYXQgPSA0OworCisgICAgICAgICAgICBlbHNlIGlmIChjbWQtPmlucHV0X2ZtdCA9PSBKUEVHRU5DX0ZNVF9ZVVY0NDRfUExBTkUpCisgICAgICAgICAgICAgICAgaWZvcm1hdCA9IDU7CisKKyAgICAgICAgICAgIGlmIChjbWQtPm91dHB1dF9mbXQgICAgID09IEpQRUdFTkNfRk1UX1lVVjQyMCkKKyAgICAgICAgICAgICAgICBvZm9ybWF0ID0gMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGNtZC0+b3V0cHV0X2ZtdCA9PSBKUEVHRU5DX0ZNVF9ZVVY0MjJfU0lOR0xFKQorICAgICAgICAgICAgICAgIG9mb3JtYXQgPSAxOworICAgICAgICAgICAgZWxzZSBpZiAoY21kLT5vdXRwdXRfZm10ID09IEpQRUdFTkNfRk1UX1lVVjQ0NF9TSU5HTEUpCisgICAgICAgICAgICAgICAgb2Zvcm1hdCA9IDI7CisKKyAgICAgICAgICAgIGJsb2NrX21vZGUgPSBjbWQtPmJsb2NrX21vZGU7CisgICAgICAgICAgICBtZmRpbl9jYW52YXMwX3N0cmlkZSA9IGNtZC0+eV9zdHJpZGU7CisgICAgICAgICAgICBtZmRpbl9jYW52YXMxX3N0cmlkZSA9IGNtZC0+dV9zdHJpZGU7CisgICAgICAgICAgICBtZmRpbl9jYW52YXMyX3N0cmlkZSA9IGNtZC0+dl9zdHJpZGU7CisgICAgICAgICAgICBtZmRpbl9jYW52YXNfaGVpZ2h0ID0gY21kLT5oX3N0cmlkZTsKKworICAgICAgICAgICAgaWYgKHNpbXVsYXRpb25fZW5hYmxlKSB7CisgICAgICAgICAgICAgICAgaWYgKGdfYmxvY2tfbW9kZSkKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tfbW9kZSA9IGdfYmxvY2tfbW9kZTsKKyAgICAgICAgICAgICAgICBpZiAoZ19jYW52MF9zdHJpZGUpCisgICAgICAgICAgICAgICAgICAgIG1mZGluX2NhbnZhczBfc3RyaWRlID0gZ19jYW52MF9zdHJpZGU7CisgICAgICAgICAgICAgICAgaWYgKGdfY2FudjFfc3RyaWRlKQorICAgICAgICAgICAgICAgICAgICBtZmRpbl9jYW52YXMxX3N0cmlkZSA9IGdfY2FudjFfc3RyaWRlOworICAgICAgICAgICAgICAgIGlmIChnX2NhbnYyX3N0cmlkZSkKKyAgICAgICAgICAgICAgICAgICAgbWZkaW5fY2FudmFzMl9zdHJpZGUgPSBnX2NhbnYyX3N0cmlkZTsKKyAgICAgICAgICAgICAgICBpZiAoZ19jYW52YXNfaGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICBtZmRpbl9jYW52YXNfaGVpZ2h0ID0gZ19jYW52YXNfaGVpZ2h0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYmxvY2tfbW9kZSkgeworICAgICAgICAgICAgICAgIG1mZGluX2NhbnZhczBfYmxrbW9kZSA9IDE7CisgICAgICAgICAgICAgICAgbWZkaW5fY2FudmFzMV9ibGttb2RlID0gMTsKKyAgICAgICAgICAgICAgICBtZmRpbl9jYW52YXMyX2Jsa21vZGUgPSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZmRpbl9jYW52YXMwX2Jsa21vZGUgPSAwOworICAgICAgICAgICAgICAgIG1mZGluX2NhbnZhczFfYmxrbW9kZSA9IDA7CisgICAgICAgICAgICAgICAgbWZkaW5fY2FudmFzMl9ibGttb2RlID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChpZm9ybWF0ID09IDAgJiYgb2Zvcm1hdCA9PSAwKSB8fCAgICAvKmNhc2UxMDEzLCA0MjIgc2luZ2xlIC0+IDQyMCovCisgICAgICAgICAgICAgICAgKGlmb3JtYXQgPT0gMCAmJiBvZm9ybWF0ID09IDEpIHx8ICAgIC8qY2FzZTEwMDIsIDQyMiBzaW5nbGUgLT4gNDIyKi8KKyAgICAgICAgICAgICAgICAoaWZvcm1hdCA9PSAwICYmIG9mb3JtYXQgPT0gMikgfHwgICAgLypjYXNlMTAwNCwgNDIyIHNpbmdsZSAtPiA0NDQqLworICAgICAgICAgICAgICAgIChpZm9ybWF0ID09IDEgJiYgb2Zvcm1hdCA9PSAxKSB8fCAgICAvKmNhc2UxMDAzLCA0NDQgc2luZ2xlIC0+IDQ0NCovCisgICAgICAgICAgICAgICAgKGlmb3JtYXQgPT0gMSAmJiBvZm9ybWF0ID09IDApIHx8CisgICAgICAgICAgICAgICAgKGlmb3JtYXQgPT0gMSAmJiBvZm9ybWF0ID09IDIpKSB7ICAgIC8qY2FzZTEwMDUsIDQ0NCBzaW5nbGUgLT4gNDQ0Ki8KKyAgICAgICAgICAgICAgICBtZmRpbl9jYW52YXMwX2FkZHIgPSBpbnB1dDsKKyAgICAgICAgICAgICAgICBtZmRpbl9jYW52YXMxX2FkZHIgPSBpbnB1dDsKKyAgICAgICAgICAgICAgICBtZmRpbl9jYW52YXMyX2FkZHIgPSBpbnB1dDsKKworICAgICAgICAgICAgICAgIGlmIChpZm9ybWF0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbWZkaW5fY2FudmFzMF9zdHJpZGUgPSBjbWQtPnlfc3RyaWRlICogMjsKKyAgICAgICAgICAgICAgICAgICAgbWZkaW5fY2FudmFzMV9zdHJpZGUgPSBjbWQtPnVfc3RyaWRlICogMjsKKyAgICAgICAgICAgICAgICAgICAgbWZkaW5fY2FudmFzMl9zdHJpZGUgPSBjbWQtPnZfc3RyaWRlICogMzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlmb3JtYXQgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBtZmRpbl9jYW52YXMwX3N0cmlkZSA9IGNtZC0+eV9zdHJpZGUgKiAzOworICAgICAgICAgICAgICAgICAgICBtZmRpbl9jYW52YXMxX3N0cmlkZSA9IGNtZC0+dV9zdHJpZGUgKiAzOworICAgICAgICAgICAgICAgICAgICBtZmRpbl9jYW52YXMyX3N0cmlkZSA9IGNtZC0+dl9zdHJpZGUgKiAzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGlmb3JtYXQgPT0gMiAmJiBvZm9ybWF0ID09IDApIHx8CisgICAgICAgICAgICAgICAgKGlmb3JtYXQgPT0gMyAmJiBvZm9ybWF0ID09IDApIHx8ICAgIC8qY2FzZTEwMDEsIE5WMjEgLT4gNDIwKi8KKyAgICAgICAgICAgICAgICAoaWZvcm1hdCA9PSAzICYmIG9mb3JtYXQgPT0gMSkgfHwgICAgLypjYXNlMTAwMCwgTlYyMSAtPiA0MjIqLworICAgICAgICAgICAgICAgIChpZm9ybWF0ID09IDMgJiYgb2Zvcm1hdCA9PSAyKSB8fCAgICAvKmNhc2UxMDA2LCBOVjIxIC0+IDQ0NCovCisgICAgICAgICAgICAgICAgKGlmb3JtYXQgPT0gMiAmJiBvZm9ybWF0ID09IDIpIHx8CisgICAgICAgICAgICAgICAgKGlmb3JtYXQgPT0gMiAmJiBvZm9ybWF0ID09IDEpKSB7ICAgIC8qY2FzZTEwMDYsIE5WMTIgLT4gNDQ0LCBsaW5lYXIqLworICAgICAgICAgICAgICAgIG1mZGluX2NhbnZhczBfYWRkciA9IGlucHV0OworICAgICAgICAgICAgICAgIG1mZGluX2NhbnZhczFfYWRkciA9IGlucHV0ICsgbWZkaW5fY2FudmFzMF9zdHJpZGUgKiBtZmRpbl9jYW52YXNfaGVpZ2h0OworICAgICAgICAgICAgICAgIG1mZGluX2NhbnZhczJfYWRkciA9IG1mZGluX2NhbnZhczFfYWRkcjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGlmb3JtYXQgPT0gNCAmJiBvZm9ybWF0ID09IDApIHx8ICAgIC8qY2FzZTEwMTAsIDQyMCBwbGFuZSAtPiA0MjAqLworICAgICAgICAgICAgICAgIChpZm9ybWF0ID09IDQgJiYgb2Zvcm1hdCA9PSAyKSB8fAorICAgICAgICAgICAgICAgIChpZm9ybWF0ID09IDQgJiYgb2Zvcm1hdCA9PSAxKSkgeyAgICAgICAgICAgIC8qY2FzZTEwMDgsIGNhc2UxMDExLCBjYXNlMTAxMiwgNDIwIHBsYW5lIC0+IDQ0NCovCisgICAgICAgICAgICAgICAgaWYgKCFzaW11bGF0aW9uX2VuYWJsZSkgeworICAgICAgICAgICAgICAgICAgICBtZmRpbl9jYW52YXMxX3N0cmlkZSA9IG1mZGluX2NhbnZhczBfc3RyaWRlIC8gMjsKKyAgICAgICAgICAgICAgICAgICAgbWZkaW5fY2FudmFzMl9zdHJpZGUgPSBtZmRpbl9jYW52YXMwX3N0cmlkZSAvIDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1mZGluX2NhbnZhczBfYWRkciA9IGlucHV0OworICAgICAgICAgICAgICAgIG1mZGluX2NhbnZhczFfYWRkciA9IGlucHV0ICsgbWZkaW5fY2FudmFzMF9zdHJpZGUgKiBtZmRpbl9jYW52YXNfaGVpZ2h0OworCisgICAgICAgICAgICAgICAgbWZkaW5fY2FudmFzMl9hZGRyID0gaW5wdXQgKyBtZmRpbl9jYW52YXMwX3N0cmlkZSAqIG1mZGluX2NhbnZhc19oZWlnaHQgKworICAgICAgICAgICAgICAgICAgICAgICAgbWZkaW5fY2FudmFzMF9zdHJpZGUgKiBtZmRpbl9jYW52YXNfaGVpZ2h0IC8gNDsKKworICAgICAgICAgICAgICAgIGplbmNfcHIoTE9HX0lORk8sICIleDoleDoleCwgbWZkaW5fY2FudmFzMF9zdHJpZGU9JWQsIG1mZGluX2NhbnZhczFfc3RyaWRlPSVkLCBtZmRpbl9jYW52YXMyX3N0cmlkZT0lZCwgbWZkaW5fY2FudmFzX2hlaWdodD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgbWZkaW5fY2FudmFzMF9hZGRyLCBtZmRpbl9jYW52YXMxX2FkZHIsIG1mZGluX2NhbnZhczJfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgbWZkaW5fY2FudmFzMF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgIG1mZGluX2NhbnZhczFfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICBtZmRpbl9jYW52YXMyX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgbWZkaW5fY2FudmFzX2hlaWdodCk7CisKKyAgICAgICAgICAgICAgICBqZW5jX3ByKExPR19JTkZPLCAicHJvY2VzcyB5dXY0MjBwIGlucHV0LCB1b2ZmPSVkLCB2b2ZmPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbWZkaW5fY2FudmFzMF9zdHJpZGUgKiBtZmRpbl9jYW52YXNfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgbWZkaW5fY2FudmFzMF9zdHJpZGUgKiBtZmRpbl9jYW52YXNfaGVpZ2h0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1mZGluX2NhbnZhczBfc3RyaWRlICogbWZkaW5fY2FudmFzX2hlaWdodCAvIDQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpZm9ybWF0ID09IDQgJiYgb2Zvcm1hdCA9PSAxKSB7ICAgIC8qY2FzZTEwMDksIDQyMCBwbGFuZSAtPiA0MjIqLworICAgICAgICAgICAgICAgIGlmICghc2ltdWxhdGlvbl9lbmFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWZkaW5fY2FudmFzMV9zdHJpZGUgPSBtZmRpbl9jYW52YXMwX3N0cmlkZSAvIDI7CisgICAgICAgICAgICAgICAgICAgIG1mZGluX2NhbnZhczJfc3RyaWRlID0gbWZkaW5fY2FudmFzMF9zdHJpZGUgLyAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZmRpbl9jYW52YXMwX2FkZHIgPSBpbnB1dDsKKyAgICAgICAgICAgICAgICBtZmRpbl9jYW52YXMxX2FkZHIgPSBpbnB1dCArIG1mZGluX2NhbnZhczBfc3RyaWRlICogbWZkaW5fY2FudmFzX2hlaWdodDsKKyAgICAgICAgICAgICAgICBtZmRpbl9jYW52YXMyX2FkZHIgPSBpbnB1dCArIG1mZGluX2NhbnZhczBfc3RyaWRlICogbWZkaW5fY2FudmFzX2hlaWdodCArCisgICAgICAgICAgICAgICAgICAgICAgICBtZmRpbl9jYW52YXMwX3N0cmlkZSAqIG1mZGluX2NhbnZhc19oZWlnaHQgLyA0OworCisgICAgICAgICAgICAgICAgLy9tZmRpbl9jYW52YXNfYmlhcyA9IG1mZGluX2NhbnZhczFfc3RyaWRlIDw8IDE2OworICAgICAgICAgICAgfSBlbHNlIGlmIChpZm9ybWF0ID09IDUgLyomJiBvZm9ybWF0ID09IDAqLykgeyAgICAvKmNhc2UxMDA3LCA0NDQgcGxhbmUgLT4gNDIwKi8KKyAgICAgICAgICAgICAgICBtZmRpbl9jYW52YXMxX3N0cmlkZSA9IG1mZGluX2NhbnZhczBfc3RyaWRlOworICAgICAgICAgICAgICAgIG1mZGluX2NhbnZhczJfc3RyaWRlID0gbWZkaW5fY2FudmFzMF9zdHJpZGU7CisgICAgICAgICAgICAgICAgbWZkaW5fY2FudmFzMF9hZGRyID0gaW5wdXQ7CisgICAgICAgICAgICAgICAgbWZkaW5fY2FudmFzMV9hZGRyID0gaW5wdXQgICAgICAgICAgICAgICsgbWZkaW5fY2FudmFzMF9zdHJpZGUgKiBtZmRpbl9jYW52YXNfaGVpZ2h0OworICAgICAgICAgICAgICAgIG1mZGluX2NhbnZhczJfYWRkciA9IG1mZGluX2NhbnZhczFfYWRkciArIG1mZGluX2NhbnZhczFfc3RyaWRlICogbWZkaW5fY2FudmFzX2hlaWdodDsKKyAgICAgICAgICAgICAgICAvL21mZGluX2JpZ19lbmRpYW4gPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcl9lcnIoImNvbmZpZyBpbnB1dCBvciBvdXRwdXQgZm9ybWF0IGVyciFcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDMpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGNtZC0+aW5wdXRfZm10ID09IEpQRUdFTkNfRk1UX1JHQjU2NSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKGNtZC0+aW5wdXRfZm10ID49IEpQRUdFTkNfTUFYX0ZSQU1FX0ZNVCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgICAgIGlmIChjbWQtPm91dHB1dF9mbXQgICAgID09IEpQRUdFTkNfRk1UX1lVVjQyMCkgeworICAgICAgICAgICAgICAgICAgICBvZm9ybWF0ID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNtZC0+b3V0cHV0X2ZtdCA9PSBKUEVHRU5DX0ZNVF9ZVVY0MjJfU0lOR0xFKSB7CisgICAgICAgICAgICAgICAgICAgIG9mb3JtYXQgPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY21kLT5vdXRwdXRfZm10ID09IEpQRUdFTkNfRk1UX1lVVjQ0NF9TSU5HTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgb2Zvcm1hdCA9IDI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKChjbWQtPmlucHV0X2ZtdCA8PSBKUEVHRU5DX0ZNVF9ZVVY0NDRfUExBTkUpIHx8CisgICAgICAgICAgICAgICAgICAgIChjbWQtPmlucHV0X2ZtdCA+PSBKUEVHRU5DX0ZNVF9ZVVY0MjJfMTJCSVQpKQorICAgICAgICAgICAgICAgICAgICByMnlfZW4gPSAwOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcjJ5X2VuID0gMTsKKworICAgICAgICAgICAgICAgIGlmIChjbWQtPmlucHV0X2ZtdCA+PSBKUEVHRU5DX0ZNVF9ZVVY0MjJfMTJCSVQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWZvcm1hdCA9IDc7CisgICAgICAgICAgICAgICAgICAgIGlmbXRfZXh0cmEgPQorICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5pbnB1dF9mbXQgLSBKUEVHRU5DX0ZNVF9ZVVY0MjJfMTJCSVQ7CisKKyAgICAjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfQ0FOVkFTCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNtZC0+aW5wdXRfZm10ID09IEpQRUdFTkNfRk1UX1lVVjQyMl8xMkJJVCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhc193ID0gcGljc2l6ZV94ICogMjQgLyA4OworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjbWQtPmlucHV0X2ZtdCA9PSBKUEVHRU5DX0ZNVF9ZVVY0NDRfMTBCSVQpCisgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXNfdyA9IHBpY3NpemVfeCAqIDMyIC8gODsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzX3cgPSAocGljc2l6ZV94ICogMjAgKyA3KSAvIDg7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhc193ID0gKChjYW52YXNfdyArIDMxKSA+PiA1KSA8PCA1OworICAgICAgICAgICAgICAgICAgICBjYW52YXNfY29uZmlnX3Byb3h5KEVOQ19DQU5WQVNfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXNfdywgcGljc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgQ0FOVkFTX0FERFJfTk9XUkFQLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0FOVkFTX0JMS01PREVfTElORUFSKTsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBFTkNfQ0FOVkFTX09GRlNFVDsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBpbnB1dCAmIDB4ZmY7CisgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjbWQtPmlucHV0X2ZtdCA9PSBKUEVHRU5DX0ZNVF9ZVVY0MjJfU0lOR0xFKSB7CisgICAgICAgICAgICAgICAgICAgIGlmb3JtYXQgPSAwOworCisgICAgI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0NBTlZBUworICAgICAgICAgICAgICAgICAgICBjYW52YXNfdyA9IHBpY3NpemVfeCAqIDI7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhc193ID0gKChjYW52YXNfdyArIDMxKSA+PiA1KSA8PCA1OworICAgICAgICAgICAgICAgICAgICBjYW52YXNfY29uZmlnX3Byb3h5KEVOQ19DQU5WQVNfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXNfdywgcGljc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgQ0FOVkFTX0FERFJfTk9XUkFQLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0FOVkFTX0JMS01PREVfTElORUFSKTsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBFTkNfQ0FOVkFTX09GRlNFVDsKKyAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChjbWQtPmlucHV0X2ZtdCA9PSBKUEVHRU5DX0ZNVF9ZVVY0NDRfU0lOR0xFKQorICAgICAgICAgICAgICAgICAgICB8fCAoY21kLT5pbnB1dF9mbXQgPT0gSlBFR0VOQ19GTVRfUkdCODg4KSkgeworICAgICAgICAgICAgICAgICAgICBpZm9ybWF0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNtZC0+aW5wdXRfZm10ID09IEpQRUdFTkNfRk1UX1JHQjg4OCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHIyeV9lbiA9IDE7CisKKyAgICAjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfQ0FOVkFTCisgICAgICAgICAgICAgICAgICAgIGNhbnZhc193ID0gcGljc2l6ZV94ICogMzsKKyAgICAgICAgICAgICAgICAgICAgY2FudmFzX3cgPSAoKGNhbnZhc193ICsgMzEpID4+IDUpIDw8IDU7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhc19jb25maWdfcHJveHkoRU5DX0NBTlZBU19PRkZTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhc193LCBwaWNzaXplX3ksCisgICAgICAgICAgICAgICAgICAgICAgICBDQU5WQVNfQUREUl9OT1dSQVAsCisgICAgICAgICAgICAgICAgICAgICAgICBDQU5WQVNfQkxLTU9ERV9MSU5FQVIpOworICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IEVOQ19DQU5WQVNfT0ZGU0VUOworICAgICNlbmRpZgorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGNtZC0+aW5wdXRfZm10ID09IEpQRUdFTkNfRk1UX05WMjEpCisgICAgICAgICAgICAgICAgICAgIHx8IChjbWQtPmlucHV0X2ZtdCA9PSBKUEVHRU5DX0ZNVF9OVjEyKSkgeworICAgICAgICAgICAgICAgICAgICBpZm9ybWF0ID0gKGNtZC0+aW5wdXRfZm10ID09IEpQRUdFTkNfRk1UX05WMjEpID8gMiA6IDM7CisgICAgI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0NBTlZBUworICAgICAgICAgICAgICAgICAgICBjYW52YXNfdyA9ICgoY21kLT5lbmNvZGVyX3dpZHRoICsgMzEpID4+IDUpIDw8IDU7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhc19jb25maWdfcHJveHkoRU5DX0NBTlZBU19PRkZTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhc193LCBwaWNzaXplX3ksCisgICAgICAgICAgICAgICAgICAgICAgICBDQU5WQVNfQUREUl9OT1dSQVAsCisgICAgICAgICAgICAgICAgICAgICAgICBDQU5WQVNfQkxLTU9ERV9MSU5FQVIpOworICAgICAgICAgICAgICAgICAgICBjYW52YXNfY29uZmlnX3Byb3h5KEVOQ19DQU5WQVNfT0ZGU0VUICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0ICsgY2FudmFzX3cgKiBwaWNzaXplX3ksIGNhbnZhc193LAorICAgICAgICAgICAgICAgICAgICAgICAgcGljc2l6ZV95IC8gMiwgQ0FOVkFTX0FERFJfTk9XUkFQLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0FOVkFTX0JMS01PREVfTElORUFSKTsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSAoKEVOQ19DQU5WQVNfT0ZGU0VUICsgMSkgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgRU5DX0NBTlZBU19PRkZTRVQ7CisgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjbWQtPmlucHV0X2ZtdCA9PSBKUEVHRU5DX0ZNVF9ZVVY0MjApIHsKKyAgICAgICAgICAgICAgICAgICAgaWZvcm1hdCA9IDQ7CisKKyAgICAjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfQ0FOVkFTCisgICAgICAgICAgICAgICAgICAgIGNhbnZhc193ID0gKChjbWQtPmVuY29kZXJfd2lkdGggKyA2MykgPj4gNikgPDwgNjsKKyAgICAgICAgICAgICAgICAgICAgY2FudmFzX2NvbmZpZ19wcm94eShFTkNfQ0FOVkFTX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzX3csIHBpY3NpemVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTlZBU19BRERSX05PV1JBUCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTlZBU19CTEtNT0RFX0xJTkVBUik7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhc19jb25maWdfcHJveHkoRU5DX0NBTlZBU19PRkZTRVQgKyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgKyBjYW52YXNfdyAqIHBpY3NpemVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhc193IC8gMiwgcGljc2l6ZV95IC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTlZBU19BRERSX05PV1JBUCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTlZBU19CTEtNT0RFX0xJTkVBUik7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhc19jb25maWdfcHJveHkoRU5DX0NBTlZBU19PRkZTRVQgKyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgKyBjYW52YXNfdyAqIHBpY3NpemVfeSAqIDUgLyA0LAorICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzX3cgLyAyLCBwaWNzaXplX3kgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0FOVkFTX0FERFJfTk9XUkFQLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0FOVkFTX0JMS01PREVfTElORUFSKTsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSAoKEVOQ19DQU5WQVNfT0ZGU0VUICsgMikgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoRU5DX0NBTlZBU19PRkZTRVQgKyAxKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgICAgICAgICBFTkNfQ0FOVkFTX09GRlNFVDsKKyAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChjbWQtPmlucHV0X2ZtdCA9PSBKUEVHRU5DX0ZNVF9ZVVY0NDRfUExBTkUpCisgICAgICAgICAgICAgICAgICAgIHx8IChjbWQtPmlucHV0X2ZtdCA9PSBKUEVHRU5DX0ZNVF9SR0I4ODhfUExBTkUpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmb3JtYXQgPSA1OworICAgICAgICAgICAgICAgICAgICBpZiAoY21kLT5pbnB1dF9mbXQgPT0gSlBFR0VOQ19GTVRfUkdCODg4X1BMQU5FKQorICAgICAgICAgICAgICAgICAgICAgICAgcjJ5X2VuID0gMTsKKworICAgICNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9DQU5WQVMKKyAgICAgICAgICAgICAgICAgICAgY2FudmFzX3cgPSAoKGNtZC0+ZW5jb2Rlcl93aWR0aCArIDMxKSA+PiA1KSA8PCA1OworICAgICAgICAgICAgICAgICAgICBjYW52YXNfY29uZmlnX3Byb3h5KEVOQ19DQU5WQVNfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXNfdywgcGljc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgQ0FOVkFTX0FERFJfTk9XUkFQLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0FOVkFTX0JMS01PREVfTElORUFSKTsKKyAgICAgICAgICAgICAgICAgICAgY2FudmFzX2NvbmZpZ19wcm94eShFTkNfQ0FOVkFTX09GRlNFVCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCArIGNhbnZhc193ICogcGljc2l6ZV95LCBjYW52YXNfdywKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpY3NpemVfeSwgQ0FOVkFTX0FERFJfTk9XUkFQLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0FOVkFTX0JMS01PREVfTElORUFSKTsKKyAgICAgICAgICAgICAgICAgICAgY2FudmFzX2NvbmZpZ19wcm94eShFTkNfQ0FOVkFTX09GRlNFVCArIDIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCArIGNhbnZhc193ICogcGljc2l6ZV95ICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhc193LCBwaWNzaXplX3ksIENBTlZBU19BRERSX05PV1JBUCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTlZBU19CTEtNT0RFX0xJTkVBUik7CisgICAgICAgICAgICAgICAgICAgIGlucHV0ID0gKChFTkNfQ0FOVkFTX09GRlNFVCArIDIpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAoKEVOQ19DQU5WQVNfT0ZGU0VUICsgMSkgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgRU5DX0NBTlZBU19PRkZTRVQ7CisgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjbWQtPmlucHV0X2ZtdCA9PSBKUEVHRU5DX0ZNVF9SR0JBODg4OCkgeworICAgICAgICAgICAgICAgICAgICBpZm9ybWF0ID0gMTI7CisgICAgICAgICAgICAgICAgICAgIHIyeV9lbiA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgoY21kLT5pbnB1dF9mbXQgPT0gSlBFR0VOQ19GTVRfUkdCNTY1KQorICAgICAgICAgICAgICAgIHx8IChjbWQtPmlucHV0X2ZtdCA+PSBKUEVHRU5DX01BWF9GUkFNRV9GTVQpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgaWYgKGNtZC0+b3V0cHV0X2ZtdCA9PSBKUEVHRU5DX0ZNVF9ZVVY0MjJfU0lOR0xFKQorICAgICAgICAgICAgICAgIG9mb3JtYXQgPSAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG9mb3JtYXQgPSAwOworCisgICAgICAgICAgICBpZiAoKGNtZC0+aW5wdXRfZm10IDw9IEpQRUdFTkNfRk1UX1lVVjQ0NF9QTEFORSkgfHwKKyAgICAgICAgICAgICAgICAoY21kLT5pbnB1dF9mbXQgPj0gSlBFR0VOQ19GTVRfWVVWNDIyXzEyQklUKSkKKyAgICAgICAgICAgICAgICByMnlfZW4gPSAwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHIyeV9lbiA9IDE7CisKKyAgICAgICAgICAgIGlmIChjbWQtPmlucHV0X2ZtdCA+PSBKUEVHRU5DX0ZNVF9ZVVY0MjJfMTJCSVQpIHsKKyAgICAgICAgICAgICAgICBpZm9ybWF0ID0gNzsKKyAgICAgICAgICAgICAgICBpZm10X2V4dHJhID0KKyAgICAgICAgICAgICAgICAgICAgY21kLT5pbnB1dF9mbXQgLSBKUEVHRU5DX0ZNVF9ZVVY0MjJfMTJCSVQ7CisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9DQU5WQVMKKyAgICAgICAgICAgICAgICBpZiAoY21kLT5pbnB1dF9mbXQgPT0gSlBFR0VOQ19GTVRfWVVWNDIyXzEyQklUKQorICAgICAgICAgICAgICAgICAgICBjYW52YXNfdyA9IHBpY3NpemVfeCAqIDI0IC8gODsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChjbWQtPmlucHV0X2ZtdCA9PSBKUEVHRU5DX0ZNVF9ZVVY0NDRfMTBCSVQpCisgICAgICAgICAgICAgICAgICAgIGNhbnZhc193ID0gcGljc2l6ZV94ICogMzIgLyA4OworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY2FudmFzX3cgPSAocGljc2l6ZV94ICogMjAgKyA3KSAvIDg7CisgICAgICAgICAgICAgICAgY2FudmFzX3cgPSAoKGNhbnZhc193ICsgMzEpID4+IDUpIDw8IDU7CisgICAgICAgICAgICAgICAgY2FudmFzX2NvbmZpZ19wcm94eShFTkNfQ0FOVkFTX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgIGNhbnZhc193LCBwaWNzaXplX3ksCisgICAgICAgICAgICAgICAgICAgIENBTlZBU19BRERSX05PV1JBUCwKKyAgICAgICAgICAgICAgICAgICAgQ0FOVkFTX0JMS01PREVfTElORUFSKTsKKyAgICAgICAgICAgICAgICBpbnB1dCA9IEVOQ19DQU5WQVNfT0ZGU0VUOworICAgICAgICAgICAgICAgIGlucHV0ID0gaW5wdXQgJiAweGZmOworI2VuZGlmCisgICAgICAgICAgICB9IGVsc2UgaWYgKGNtZC0+aW5wdXRfZm10ID09IEpQRUdFTkNfRk1UX1lVVjQyMl9TSU5HTEUpIHsKKyAgICAgICAgICAgICAgICBpZm9ybWF0ID0gMDsKKworI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX0NBTlZBUworICAgICAgICAgICAgICAgIGNhbnZhc193ID0gcGljc2l6ZV94ICogMjsKKyAgICAgICAgICAgICAgICBjYW52YXNfdyA9ICgoY2FudmFzX3cgKyAzMSkgPj4gNSkgPDwgNTsKKyAgICAgICAgICAgICAgICBjYW52YXNfY29uZmlnX3Byb3h5KEVOQ19DQU5WQVNfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgY2FudmFzX3csIHBpY3NpemVfeSwKKyAgICAgICAgICAgICAgICAgICAgQ0FOVkFTX0FERFJfTk9XUkFQLAorICAgICAgICAgICAgICAgICAgICBDQU5WQVNfQkxLTU9ERV9MSU5FQVIpOworICAgICAgICAgICAgICAgIGlucHV0ID0gRU5DX0NBTlZBU19PRkZTRVQ7CisjZW5kaWYKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGNtZC0+aW5wdXRfZm10ID09IEpQRUdFTkNfRk1UX1lVVjQ0NF9TSU5HTEUpCisgICAgICAgICAgICAgICAgfHwgKGNtZC0+aW5wdXRfZm10ID09IEpQRUdFTkNfRk1UX1JHQjg4OCkpIHsKKyAgICAgICAgICAgICAgICBpZm9ybWF0ID0gMTsKKyAgICAgICAgICAgICAgICBpZiAoY21kLT5pbnB1dF9mbXQgPT0gSlBFR0VOQ19GTVRfUkdCODg4KQorICAgICAgICAgICAgICAgICAgICByMnlfZW4gPSAxOworCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfQ0FOVkFTCisgICAgICAgICAgICAgICAgY2FudmFzX3cgPSBwaWNzaXplX3ggKiAzOworICAgICAgICAgICAgICAgIGNhbnZhc193ID0gKChjYW52YXNfdyArIDMxKSA+PiA1KSA8PCA1OworICAgICAgICAgICAgICAgIGNhbnZhc19jb25maWdfcHJveHkoRU5DX0NBTlZBU19PRkZTRVQsCisgICAgICAgICAgICAgICAgICAgIGlucHV0LAorICAgICAgICAgICAgICAgICAgICBjYW52YXNfdywgcGljc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICBDQU5WQVNfQUREUl9OT1dSQVAsCisgICAgICAgICAgICAgICAgICAgIENBTlZBU19CTEtNT0RFX0xJTkVBUik7CisgICAgICAgICAgICAgICAgaW5wdXQgPSBFTkNfQ0FOVkFTX09GRlNFVDsKKyNlbmRpZgorICAgICAgICAgICAgfSBlbHNlIGlmICgoY21kLT5pbnB1dF9mbXQgPT0gSlBFR0VOQ19GTVRfTlYyMSkKKyAgICAgICAgICAgICAgICB8fCAoY21kLT5pbnB1dF9mbXQgPT0gSlBFR0VOQ19GTVRfTlYxMikpIHsKKyAgICAgICAgICAgICAgICBpZm9ybWF0ID0gKGNtZC0+aW5wdXRfZm10ID09IEpQRUdFTkNfRk1UX05WMjEpID8gMiA6IDM7CisKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9DQU5WQVMKKyAgICAgICAgICAgICAgICBjYW52YXNfdyA9ICgoY21kLT5lbmNvZGVyX3dpZHRoICsgMzEpID4+IDUpIDw8IDU7CisgICAgICAgICAgICAgICAgY2FudmFzX2NvbmZpZ19wcm94eShFTkNfQ0FOVkFTX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgIGNhbnZhc193LCBwaWNzaXplX3ksCisgICAgICAgICAgICAgICAgICAgIENBTlZBU19BRERSX05PV1JBUCwKKyAgICAgICAgICAgICAgICAgICAgQ0FOVkFTX0JMS01PREVfTElORUFSKTsKKyAgICAgICAgICAgICAgICBjYW52YXNfY29uZmlnX3Byb3h5KEVOQ19DQU5WQVNfT0ZGU0VUICsgMSwKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQgKyBjYW52YXNfdyAqIHBpY3NpemVfeSwgY2FudmFzX3csCisgICAgICAgICAgICAgICAgICAgIHBpY3NpemVfeSAvIDIsIENBTlZBU19BRERSX05PV1JBUCwKKyAgICAgICAgICAgICAgICAgICAgQ0FOVkFTX0JMS01PREVfTElORUFSKTsKKyAgICAgICAgICAgICAgICBpbnB1dCA9ICgoRU5DX0NBTlZBU19PRkZTRVQgKyAxKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgICAgIEVOQ19DQU5WQVNfT0ZGU0VUOworI2VuZGlmCisgICAgICAgICAgICB9IGVsc2UgaWYgKGNtZC0+aW5wdXRfZm10ID09IEpQRUdFTkNfRk1UX1lVVjQyMCkgeworICAgICAgICAgICAgICAgIGlmb3JtYXQgPSA0OworCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfQ0FOVkFTCisgICAgICAgICAgICAgICAgY2FudmFzX3cgPSAoKGNtZC0+ZW5jb2Rlcl93aWR0aCArIDYzKSA+PiA2KSA8PCA2OworICAgICAgICAgICAgICAgIGNhbnZhc19jb25maWdfcHJveHkoRU5DX0NBTlZBU19PRkZTRVQsCisgICAgICAgICAgICAgICAgICAgIGlucHV0LAorICAgICAgICAgICAgICAgICAgICBjYW52YXNfdywgcGljc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICBDQU5WQVNfQUREUl9OT1dSQVAsCisgICAgICAgICAgICAgICAgICAgIENBTlZBU19CTEtNT0RFX0xJTkVBUik7CisgICAgICAgICAgICAgICAgY2FudmFzX2NvbmZpZ19wcm94eShFTkNfQ0FOVkFTX09GRlNFVCArIDIsCisgICAgICAgICAgICAgICAgICAgIGlucHV0ICsgY2FudmFzX3cgKiBwaWNzaXplX3ksCisgICAgICAgICAgICAgICAgICAgIGNhbnZhc193IC8gMiwgcGljc2l6ZV95IC8gMiwKKyAgICAgICAgICAgICAgICAgICAgQ0FOVkFTX0FERFJfTk9XUkFQLAorICAgICAgICAgICAgICAgICAgICBDQU5WQVNfQkxLTU9ERV9MSU5FQVIpOworICAgICAgICAgICAgICAgIGNhbnZhc19jb25maWdfcHJveHkoRU5DX0NBTlZBU19PRkZTRVQgKyAyLAorICAgICAgICAgICAgICAgICAgICBpbnB1dCArIGNhbnZhc193ICogcGljc2l6ZV95ICogNSAvIDQsCisgICAgICAgICAgICAgICAgICAgIGNhbnZhc193IC8gMiwgcGljc2l6ZV95IC8gMiwKKyAgICAgICAgICAgICAgICAgICAgQ0FOVkFTX0FERFJfTk9XUkFQLAorICAgICAgICAgICAgICAgICAgICBDQU5WQVNfQkxLTU9ERV9MSU5FQVIpOworICAgICAgICAgICAgICAgIGlucHV0ID0gKChFTkNfQ0FOVkFTX09GRlNFVCArIDIpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgICAgICgoRU5DX0NBTlZBU19PRkZTRVQgKyAxKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgICAgIEVOQ19DQU5WQVNfT0ZGU0VUOworI2VuZGlmCisgICAgICAgICAgICB9IGVsc2UgaWYgKChjbWQtPmlucHV0X2ZtdCA9PSBKUEVHRU5DX0ZNVF9ZVVY0NDRfUExBTkUpCisgICAgICAgICAgICAgICAgfHwgKGNtZC0+aW5wdXRfZm10ID09IEpQRUdFTkNfRk1UX1JHQjg4OF9QTEFORSkpIHsKKyAgICAgICAgICAgICAgICBpZm9ybWF0ID0gNTsKKyAgICAgICAgICAgICAgICBpZiAoY21kLT5pbnB1dF9mbXQgPT0gSlBFR0VOQ19GTVRfUkdCODg4X1BMQU5FKQorICAgICAgICAgICAgICAgICAgICByMnlfZW4gPSAxOworCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfQ0FOVkFTCisgICAgICAgICAgICAgICAgY2FudmFzX3cgPSAoKGNtZC0+ZW5jb2Rlcl93aWR0aCArIDMxKSA+PiA1KSA8PCA1OworICAgICAgICAgICAgICAgIGNhbnZhc19jb25maWdfcHJveHkoRU5DX0NBTlZBU19PRkZTRVQsCisgICAgICAgICAgICAgICAgICAgIGlucHV0LAorICAgICAgICAgICAgICAgICAgICBjYW52YXNfdywgcGljc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICBDQU5WQVNfQUREUl9OT1dSQVAsCisgICAgICAgICAgICAgICAgICAgIENBTlZBU19CTEtNT0RFX0xJTkVBUik7CisgICAgICAgICAgICAgICAgY2FudmFzX2NvbmZpZ19wcm94eShFTkNfQ0FOVkFTX09GRlNFVCArIDEsCisgICAgICAgICAgICAgICAgICAgIGlucHV0ICsgY2FudmFzX3cgKiBwaWNzaXplX3ksIGNhbnZhc193LAorICAgICAgICAgICAgICAgICAgICBwaWNzaXplX3ksIENBTlZBU19BRERSX05PV1JBUCwKKyAgICAgICAgICAgICAgICAgICAgQ0FOVkFTX0JMS01PREVfTElORUFSKTsKKyAgICAgICAgICAgICAgICBjYW52YXNfY29uZmlnX3Byb3h5KEVOQ19DQU5WQVNfT0ZGU0VUICsgMiwKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQgKyBjYW52YXNfdyAqIHBpY3NpemVfeSAqIDIsCisgICAgICAgICAgICAgICAgICAgIGNhbnZhc193LCBwaWNzaXplX3ksIENBTlZBU19BRERSX05PV1JBUCwKKyAgICAgICAgICAgICAgICAgICAgQ0FOVkFTX0JMS01PREVfTElORUFSKTsKKyAgICAgICAgICAgICAgICBpbnB1dCA9ICgoRU5DX0NBTlZBU19PRkZTRVQgKyAyKSA8PCAxNikgfAorICAgICAgICAgICAgICAgICAgICAoKEVOQ19DQU5WQVNfT0ZGU0VUICsgMSkgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICBFTkNfQ0FOVkFTX09GRlNFVDsKKyNlbmRpZgorICAgICAgICAgICAgfSBlbHNlIGlmIChjbWQtPmlucHV0X2ZtdCA9PSBKUEVHRU5DX0ZNVF9SR0JBODg4OCkgeworICAgICAgICAgICAgICAgIGlmb3JtYXQgPSAxMjsKKyAgICAgICAgICAgICAgICByMnlfZW4gPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldCA9IDA7CisgICAgfSBlbHNlIGlmIChjbWQtPnR5cGUgPT0gSlBFR0VOQ19DQU5WQVNfQlVGRikgeworICAgICAgICByMnlfZW4gPSAwOworICAgICAgICBpZiAoY21kLT5pbnB1dF9mbXQgPT0gSlBFR0VOQ19GTVRfWVVWNDIyX1NJTkdMRSkgeworICAgICAgICAgICAgaWZvcm1hdCA9IDA7CisgICAgICAgICAgICBpbnB1dCA9IGlucHV0ICYgMHhmZjsKKyAgICAgICAgfSBlbHNlIGlmIChjbWQtPmlucHV0X2ZtdCA9PSBKUEVHRU5DX0ZNVF9ZVVY0NDRfU0lOR0xFKSB7CisgICAgICAgICAgICBpZm9ybWF0ID0gMTsKKyAgICAgICAgICAgIGlucHV0ID0gaW5wdXQgJiAweGZmOworICAgICAgICB9IGVsc2UgaWYgKChjbWQtPmlucHV0X2ZtdCA9PSBKUEVHRU5DX0ZNVF9OVjIxKQorICAgICAgICAgICAgfHwgKGNtZC0+aW5wdXRfZm10ID09IEpQRUdFTkNfRk1UX05WMTIpKSB7CisgICAgICAgICAgICBpZm9ybWF0ID0gKGNtZC0+aW5wdXRfZm10ID09IEpQRUdFTkNfRk1UX05WMjEpID8gMiA6IDM7CisgICAgICAgICAgICBpbnB1dCA9IGlucHV0ICYgMHhmZmZmOworICAgICAgICB9IGVsc2UgaWYgKGNtZC0+aW5wdXRfZm10ID09IEpQRUdFTkNfRk1UX1lVVjQyMCkgeworICAgICAgICAgICAgaWZvcm1hdCA9IDQ7CisgICAgICAgICAgICBpbnB1dCA9IGlucHV0ICYgMHhmZmZmZmY7CisgICAgICAgIH0gZWxzZSBpZiAoKGNtZC0+aW5wdXRfZm10ID09IEpQRUdFTkNfRk1UX1lVVjQ0NF9QTEFORSkKKyAgICAgICAgICAgIHx8IChjbWQtPmlucHV0X2ZtdCA9PSBKUEVHRU5DX0ZNVF9SR0I4ODhfUExBTkUpKSB7CisgICAgICAgICAgICBpZiAoY21kLT5pbnB1dF9mbXQgPT0gSlBFR0VOQ19GTVRfUkdCODg4X1BMQU5FKQorICAgICAgICAgICAgICAgIHIyeV9lbiA9IDE7CisgICAgICAgICAgICBpZm9ybWF0ID0gNTsKKyAgICAgICAgICAgIGlucHV0ID0gaW5wdXQgJiAweGZmZmZmZjsKKyAgICAgICAgfSBlbHNlIGlmICgoY21kLT5pbnB1dF9mbXQgPT0gSlBFR0VOQ19GTVRfWVVWNDIyXzEyQklUKQorICAgICAgICAgICAgfHwgKGNtZC0+aW5wdXRfZm10ID09IEpQRUdFTkNfRk1UX1lVVjQ0NF8xMEJJVCkKKyAgICAgICAgICAgIHx8IChjbWQtPmlucHV0X2ZtdCA9PSBKUEVHRU5DX0ZNVF9ZVVY0MjJfMTBCSVQpKSB7CisgICAgICAgICAgICBpZm9ybWF0ID0gNzsKKyAgICAgICAgICAgIGlmbXRfZXh0cmEgPSBjbWQtPmlucHV0X2ZtdCAtIEpQRUdFTkNfRk1UX1lVVjQyMl8xMkJJVDsKKyAgICAgICAgICAgIGlucHV0ID0gaW5wdXQgJiAweGZmOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldCA9IC0xOworICAgIH0KKworICAgIGlmIChyZXQgPT0gMCkKKyAgICAgICAgbWZkaW5fYmFzaWNfanBlZyhpbnB1dCwgaWZvcm1hdCwgb2Zvcm1hdCwKKyAgICAgICAgICAgIHBpY3NpemVfeCwgcGljc2l6ZV95LCByMnlfZW4sIGlmbXRfZXh0cmEsCisgICAgICAgICAgICBtZmRpbl9jYW52YXMwX3N0cmlkZSwKKyAgICAgICAgICAgIG1mZGluX2NhbnZhczFfc3RyaWRlLAorICAgICAgICAgICAgbWZkaW5fY2FudmFzMl9zdHJpZGUsCisgICAgICAgICAgICBtZmRpbl9jYW52YXMwX2Jsa21vZGUsCisgICAgICAgICAgICBtZmRpbl9jYW52YXMxX2Jsa21vZGUsCisgICAgICAgICAgICBtZmRpbl9jYW52YXMyX2Jsa21vZGUsCisgICAgICAgICAgICBtZmRpbl9jYW52YXMwX2FkZHIsCisgICAgICAgICAgICBtZmRpbl9jYW52YXMxX2FkZHIsCisgICAgICAgICAgICBtZmRpbl9jYW52YXMyX2FkZHIsCisgICAgICAgICAgICBtZmRpbl9jYW52YXNfYmlhcywKKyAgICAgICAgICAgIG1mZGluX2JpZ19lbmRpYW4pOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGpwZWdlbmNfaXNyX3Rhc2tsZXQodWxvbmcgZGF0YSkKK3sKKyAgICBzdHJ1Y3QganBlZ2VuY19tYW5hZ2VyX3MgKm1hbmFnZXIgPSAoc3RydWN0IGpwZWdlbmNfbWFuYWdlcl9zICopZGF0YTsKKworICAgIGplbmNfcHIoTE9HX0lORk8sICJlbmNvZGVyIGlzIGRvbmUgJWRcbiIsIG1hbmFnZXItPmVuY29kZV9od19zdGF0dXMpOworCisgICAgaWYgKChtYW5hZ2VyLT5lbmNvZGVfaHdfc3RhdHVzID09IEpQRUdFTkNfRU5DT0RFUl9ET05FKQorICAgICAgICAmJiAobWFuYWdlci0+cHJvY2Vzc19pcnEpKSB7CisgICAgICAgIG1hbmFnZXItPndxLmh3X3N0YXR1cyA9IG1hbmFnZXItPmVuY29kZV9od19zdGF0dXM7CisgICAgICAgIG1hbmFnZXItPndxLm91dHB1dF9zaXplID0gUkVBRF9IUkVHKEhDT0RFQ19WTENfVE9UQUxfQllURVMpOworICAgICAgICBqZW5jX3ByKExPR19JTkZPLCAiZW5jb2RlciBzaXplICVkXG4iLCBtYW5hZ2VyLT53cS5vdXRwdXRfc2l6ZSk7CisgICAgICAgIGF0b21pY19pbmMoJm1hbmFnZXItPndxLnJlYWR5KTsKKyAgICAgICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZtYW5hZ2VyLT53cS5jb21wbGV0ZSk7CisgICAgfQorfQorCitzdGF0aWMgaXJxcmV0dXJuX3QganBlZ2VuY19pc3IoczMyIGlycV9udW1iZXIsIHZvaWQgKnBhcmEpCit7CisgICAgc3RydWN0IGpwZWdlbmNfbWFuYWdlcl9zICptYW5hZ2VyID0gKHN0cnVjdCBqcGVnZW5jX21hbmFnZXJfcyAqKXBhcmE7CisgICAgamVuY19wcihMT0dfQUxMLCAianBlZ2VuYyBpbnRyIGlzIGZpcmVkXG4iKTsKKworICAgIGlmIChtYW5hZ2VyLT5pcnFfcmVxdWVzdGVkID09IGZhbHNlKQorICAgICAgICByZXR1cm4gSVJRX05PTkU7CisKKyAgICBpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9DMSkgeworICAgICAgICBpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNykKKyAgICAgICAgICAgIFdSSVRFX0hSRUcoSENPREVDX0FTU0lTVF9NQk9YMl9DTFJfUkVHLCAxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgV1JJVEVfSFJFRyhIQ09ERUNfQVNTSVNUX01CT1gwX0NMUl9SRUcsIDEpOworICAgIH0gZWxzZQorICAgICAgICBXUklURV9IUkVHKEhDT0RFQ19BU1NJU1RfTUJPWDJfQ0xSX1JFRywgMSk7CisKKyAgICBtYW5hZ2VyLT5lbmNvZGVfaHdfc3RhdHVzICA9IFJFQURfSFJFRyhKUEVHRU5DX0VOQ09ERVJfU1RBVFVTKTsKKworICAgIGlmIChtYW5hZ2VyLT5lbmNvZGVfaHdfc3RhdHVzID09IEpQRUdFTkNfRU5DT0RFUl9ET05FKSB7CisgICAgICAgIGpwZWdlbmNfdGltZV9jb3VudF9lbmQoJnRpbWVfY250KTsKKyAgICAgICAgbWFuYWdlci0+cHJvY2Vzc19pcnEgPSB0cnVlOworICAgICAgICB0YXNrbGV0X3NjaGVkdWxlKCZtYW5hZ2VyLT50YXNrbGV0KTsKKyAgICB9CisKKyAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIGpwZWdlbmNfc3RhcnQodm9pZCkKK3sKKyAgICBSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMSk7CisgICAgUkVBRF9WUkVHKERPU19TV19SRVNFVDEpOworICAgIFJFQURfVlJFRyhET1NfU1dfUkVTRVQxKTsKKyAgICBXUklURV9WUkVHKERPU19TV19SRVNFVDEsICgxIDw8IDEyKSB8ICgxIDw8IDExKSk7CisgICAgV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQxLCAwKTsKKyAgICBSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMSk7CisgICAgUkVBRF9WUkVHKERPU19TV19SRVNFVDEpOworICAgIFJFQURfVlJFRyhET1NfU1dfUkVTRVQxKTsKKyAgICBXUklURV9IUkVHKEhDT0RFQ19NUFNSLCAweDAwMDEpOworfQorCitzdGF0aWMgdm9pZCBfanBlZ2VuY19zdG9wKHZvaWQpCit7CisgICAgdWxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBIWjsKKworICAgIFdSSVRFX0hSRUcoSENPREVDX01QU1IsIDApOworICAgIFdSSVRFX0hSRUcoSENPREVDX0NQU1IsIDApOworCisgICAgd2hpbGUgKFJFQURfSFJFRyhIQ09ERUNfSU1FTV9ETUFfQ1RSTCkgJiAweDgwMDApIHsKKyAgICAgICAgaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgUkVBRF9WUkVHKERPU19TV19SRVNFVDEpOworICAgIFJFQURfVlJFRyhET1NfU1dfUkVTRVQxKTsKKyAgICBSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMSk7CisKKyAgICBpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWEJCKQorICAgICAgICBXUklURV9WUkVHKERPU19TV19SRVNFVDEsCisgICAgICAgICAgICAgICAoMSA8PCAxMikgfCAoMSA8PCAxMSkgfAorICAgICAgICAgICAgICAgKDEgPDwgMikgfCAoMSA8PCA2KSB8CisgICAgICAgICAgICAgICAoMSA8PCA3KSB8ICgxIDw8IDgpIHwKKyAgICAgICAgICAgICAgICgxIDw8IDE0KSB8ICgxIDw8IDE2KSB8CisgICAgICAgICAgICAgICAoMSA8PCAxNykpOworICAgIGVsc2UKKyAgICAgICAgV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQxLAorICAgICAgICAgICAgICAgKDEgPDwgMTIpIHwgKDEgPDwgMTEpIHwKKyAgICAgICAgICAgICAgICgxIDw8IDIpIHwgKDEgPDwgNikgfAorICAgICAgICAgICAgICAgKDEgPDwgNykgfCAoMSA8PCA4KSB8CisgICAgICAgICAgICAgICAoMSA8PCAxNikgfCAoMSA8PCAxNykpOworCisgICAgV1JJVEVfVlJFRyhET1NfU1dfUkVTRVQxLCAwKTsKKworICAgIFJFQURfVlJFRyhET1NfU1dfUkVTRVQxKTsKKyAgICBSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMSk7CisgICAgUkVBRF9WUkVHKERPU19TV19SRVNFVDEpOworfQorCitzdGF0aWMgdm9pZCBkdW1wX21lbSh1OCAqYWRkcikgeworICAgIGludCBpOworICAgIHU4ICpvZmZzZXQgPSBhZGRyOworCisgICAgZm9yIChpPTA7aTxkdW1wbWVtX2xpbmU7aSsrKSB7CisgICAgICAgIG9mZnNldCArPSBpICogODsKKyAgICAgICAgcHJfZXJyKCIlI3hcdCUjeFx0JSN4XHQlI3hcdCUjeFx0JSN4XHQlI3hcdCUjeFxuIiwKKyAgICAgICAgICAgICoob2Zmc2V0KzApLCAqKG9mZnNldCsxKSwgKihvZmZzZXQrMiksICoob2Zmc2V0KzMpLAorICAgICAgICAgICAgKihvZmZzZXQrNCksICoob2Zmc2V0KzUpLCAqKG9mZnNldCs2KSwgKihvZmZzZXQrNykpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgX19pb21lbSAqbWNfYWRkcjsKK3N0YXRpYyB1MzIgbWNfYWRkcl9tYXA7CisjZGVmaW5lIE1DX1NJWkUgKDQwOTYgKiA0KQorczMyIGpwZWdlbmNfbG9hZG1jKGNvbnN0IGNoYXIgKnApCit7CisgICAgdWxvbmcgdGltZW91dDsKKyAgICBzMzIgcmV0ID0gMDsKKyAgICAvL2ludCBpPTA7CisKKyAgICAvKiB1c2Ugc3RhdGljIG1lbXByeSovCisgICAgaWYgKG1jX2FkZHIgPT0gTlVMTCkgeworICAgICAgICBtY19hZGRyID0ga21hbGxvYyhNQ19TSVpFLCBHRlBfS0VSTkVMKTsKKworICAgICAgICBpZiAoIW1jX2FkZHIpIHsKKyAgICAgICAgICAgIGplbmNfcHIoTE9HX0VSUk9SLCAianBlZ2VuYyBsb2FkbWMgaW9tYXAgbWMgYWRkciBlcnJvci5cbiIpOworICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KG1jX2FkZHIsIDAsIE1DX1NJWkUpOworICAgIH0KKworICAgIC8vcmV0ID0gZ2V0X2RhdGFfZnJvbV9uYW1lKCJjMV9qcGVnX2VuYyIsICh1OCAqKW1jX2FkZHIpOworICAgIHJldCA9IGdldF9maXJtd2FyZV9kYXRhKFZJREVPX0VOQ19KUEVHLCAodTggKiltY19hZGRyKTsKKworICAgIGR1bXBfbWVtKG1jX2FkZHIpOworCisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGplbmNfcHIoTE9HX0VSUk9SLCAianBlZ2VuYyBtaWNyb2NvZGUgZmFpbCByZXQ9JWQsIG5hbWU6ICVzLlxuIiwgcmV0LCBwKTsKKworICAgIG1jX2FkZHJfbWFwID0gZG1hX21hcF9zaW5nbGUoJmdKcGVnZW5jLnRoaXNfcGRldi0+ZGV2LCBtY19hZGRyLCBNQ19TSVpFLCBETUFfVE9fREVWSUNFKTsKKworICAgIFdSSVRFX0hSRUcoSENPREVDX01QU1IsIDApOworICAgIFdSSVRFX0hSRUcoSENPREVDX0NQU1IsIDApOworCisgICAgLyogUmVhZCBDQlVTIHJlZ2lzdGVyIGZvciB0aW1pbmcgKi8KKyAgICAvL3RpbWVvdXQgPSBSRUFEX0hSRUcoSENPREVDX01QU1IpOworICAgIC8vdGltZW91dCA9IFJFQURfSFJFRyhIQ09ERUNfTVBTUik7CisgICAgdGltZW91dCA9IGppZmZpZXMgKyBIWjsKKyAgICBXUklURV9IUkVHKEhDT0RFQ19JTUVNX0RNQV9BRFIsIG1jX2FkZHJfbWFwKTsKKyAgICBXUklURV9IUkVHKEhDT0RFQ19JTUVNX0RNQV9DT1VOVCwgMHgxMDAwKTsKKworICAgIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3KQorICAgICAgICBXUklURV9IUkVHKEhDT0RFQ19JTUVNX0RNQV9DVFJMLCAoMHg4MDAwIHwgKDB4ZiA8PCAxNikpKTsgLy8gdWNvZGUgdGVzdCBjIGlzIDB4ODAwMCB8ICgweGYgPDwgMTYpCisgICAgZWxzZSBpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID09IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UMykgeworICAgICAgICBwcl9lcnIoInQzIEhDT0RFQ19JTUVNX0RNQV9DVFJMICgweDgwMDAgfCAoMCAmIDB4ZmZmZikpXG4iKTsKKyAgICAgICAgV1JJVEVfSFJFRyhIQ09ERUNfSU1FTV9ETUFfQ1RSTCwgKDB4ODAwMCB8ICgwICYgMHhmZmZmKSkpOyAvLyBFbmRpYW4gOiA0J2IxMDAwKTsKKyAgICB9IGVsc2UKKyAgICAgICAgV1JJVEVfSFJFRyhIQ09ERUNfSU1FTV9ETUFfQ1RSTCwgKDB4ODAwMCB8ICgwICYgMHhmZmZmKSkpOyAvLyBFbmRpYW4gOiA0J2IxMDAwKTsKKworICAgIHdoaWxlIChSRUFEX0hSRUcoSENPREVDX0lNRU1fRE1BX0NUUkwpICYgMHg4MDAwKSB7CisgICAgICAgIGlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworICAgICAgICAgICAgc2NoZWR1bGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGplbmNfcHIoTE9HX0VSUk9SLCAiaGNvZGVjIGxvYWQgbWMgZXJyb3JcbiIpOworICAgICAgICAgICAgcmV0ID0gLUVCVVNZOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkbWFfdW5tYXBfc2luZ2xlKCZnSnBlZ2VuYy50aGlzX3BkZXYtPmRldiwgbWNfYWRkcl9tYXAsIE1DX1NJWkUsIERNQV9UT19ERVZJQ0UpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzMzIganBlZ2VuY19wb3dlcm9uX2V4KHUzMiBjbG9jaykKK3sKKyAgICB1MzIgZnJxOworCisgICAgaWYgKGNsb2NrID09IDEpCisgICAgICAgIGZycSA9IDIwMDsKKyAgICBlbHNlIGlmIChjbG9jayA9PSAzKQorICAgICAgICBmcnEgPSAzMDA7CisgICAgZWxzZQorICAgICAgICBmcnEgPSA0MDA7CisKKyAgICBqcGVnX2VuY19jbGtfZW5hYmxlKCZnX2pwZWdfZW5jX2Nsa3MsIGZycSk7CisKKyAgICAvKiBQb3dlcnVwIEhDT0RFQyBtZW1vcmllcyAqLworICAgIFdSSVRFX1ZSRUcoRE9TX01FTV9QRF9IQ09ERUMsIDB4MCk7CisKKyAgICBpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNykgeworICAgICAgICBwcl9lcnIoInBvd2VyaW5nIG9uIGhjb2RlY1xuIik7CisgICAgICAgIHZkZWNfcG93ZXJvbihWREVDX0hDT0RFQyk7CisgICAgICAgIHByX2VycigiaGNvZGVjIHBvd2VyIHN0YXR1cyBhZnRlciBwb3dlcm9uOiVkXG4iLCB2ZGVjX29uKFZERUNfSENPREVDKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHdyX2N0cmxfcHNjaV9zbWMoUERJRF9UN19ET1NfSENPREVDLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFsyMV0gaGNvZGVjIGNsa19lbiBmb3IgaGVuYyBxZGN0CisgICAgICogWzIwXSBoY29kZWMgY2xrX2VuIGZvciBoZW5jIHZsYworICAgICAqIFsxOV0gaGNvZGVjIGNsa19lbiBmb3IgYXNzaXN0IGFuZCBjYnVzCisgICAgICogWzE4XSBoY29kZWMgY2xrX2VuIGZvciBkZHIKKyAgICAgKiBbMTddIGhjb2RlYyBjbGtfZW4gZm9yIHZjcHUKKyAgICAgKiBbMTZdIGhjb2RlYyBjbGtfZW4gZm9yIGhkZWMgYXNzaXN0CisgICAgICogWzE1XSBoY29kZWMgY2xrX2VuIGZvciBoZGVjIGRibGsKKyAgICAgKiBbMTRdIHJlc2VydmVkCisgICAgICogWzEzXSBoY29kZWMgY2xrX2VuIGZvciBoZGVjIG1jCisgICAgICogWzEyXSBoY29kZWMgY2xrX2VuIGZvciBoZGVjIHBpY19kYworICAgICAqLworICAgIFdSSVRFX1ZSRUdfQklUUyhET1NfR0NMS19FTjAsIDB4N2ZmZiwgMTIsIDE1KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgczMyIGpwZWdlbmNfcG93ZXJvZmZfZXgodm9pZCkKK3sKKyAgICBXUklURV9WUkVHX0JJVFMoRE9TX0dDTEtfRU4wLCAwLCAxMiwgMTUpOworCisgICAgaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDcpIHsKKyAgICAgICAgcHJfZXJyKCJwb3dlcmluZyBvZmYgaGNvZGVjIGZvciB0N1xuIik7CisgICAgICAgIHZkZWNfcG93ZXJvZmYoVkRFQ19IQ09ERUMpOworICAgICAgICBwcl9lcnIoImhjb2RlYyBwb3dlciBzdGF0dXMgYWZ0ZXIgcG93ZXJvZmY6JWRcbiIsIHZkZWNfb24oVkRFQ19IQ09ERUMpKTsKKyAgICB9IGVsc2UKKyAgICAgICAgcHdyX2N0cmxfcHNjaV9zbWMoUERJRF9UN19ET1NfSENPREVDLCBmYWxzZSk7CisKKyAgICAvKiBwb3dlciBvZmYgSENPREVDIG1lbW9yaWVzICovCisgICAgV1JJVEVfVlJFRyhET1NfTUVNX1BEX0hDT0RFQywgMHhmZmZmZmZmZlVMKTsKKworICAgIGpwZWdfZW5jX2Nsa19kaXNhYmxlKCZnX2pwZWdfZW5jX2Nsa3MpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiAwCitib29sIGpwZWdlbmNfb24odm9pZCkKK3sKKyAgICBib29sIGhjb2RlY19vbjsKKyAgICB1bG9uZyBmbGFnczsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CisKKyAgICBoY29kZWNfb24gPSB2ZGVjX29uKFZERUNfSENPREVDKTsKKyAgICBoY29kZWNfb24gJj0gKGdKcGVnZW5jLm9wZW5lZCA+IDApOworCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOworICAgIHJldHVybiBoY29kZWNfb247Cit9CisjZW5kaWYKKworc3RhdGljIHMzMiBqcGVnZW5jX3Bvd2Vyb24odTMyIGNsb2NrKQoreworICAgIC8vdWxvbmcgZmxhZ3M7CisgICAgdTMyIGRhdGEzMjsKKworICAgIC8vc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKKworICAgIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPCBBTV9NRVNPTl9DUFVfTUFKT1JfSURfQzEpIHsKKyAgICAgICAgZGF0YTMyID0gMDsKKyAgICAgICAgYW1wb3J0c19zd2l0Y2hfZ2F0ZSgidmRlYyIsIDEpOworCisgICAgICAgIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX004KSB7CisgICAgICAgICAgICBXUklURV9BT1JFRyhBT19SVElfUFdSX0NOVExfUkVHMCwKKyAgICAgICAgICAgICAgICAoUkVBRF9BT1JFRyhBT19SVElfUFdSX0NOVExfUkVHMCkgJiAofjB4MTgpKSk7CisgICAgICAgICAgICB1ZGVsYXkoMTApOworICAgICAgICAgICAgLyogUG93ZXJ1cCBIQ09ERUMgKi8KKyAgICAgICAgICAgIC8qIFsxOjBdIEhDT0RFQyAqLworICAgICAgICAgICAgV1JJVEVfQU9SRUcoQU9fUlRJX0dFTl9QV1JfU0xFRVAwLAorICAgICAgICAgICAgICAgIChSRUFEX0FPUkVHKEFPX1JUSV9HRU5fUFdSX1NMRUVQMCkgJiAofjB4MykpKTsKKyAgICAgICAgICAgIHVkZWxheSgxMCk7CisgICAgICAgIH0KKworICAgICAgICBXUklURV9WUkVHKERPU19TV19SRVNFVDEsIDB4ZmZmZmZmZmYpOworICAgICAgICBXUklURV9WUkVHKERPU19TV19SRVNFVDEsIDApOworCisgICAgICAgIC8qIEVuYWJsZSBEb3MgaW50ZXJuYWwgY2xvY2sgZ2F0aW5nICovCisgICAgICAgIGpwZWdlbmNfY2xvY2tfZW5hYmxlKGNsb2NrKTsKKworICAgICAgICBpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9NOCkgeworICAgICAgICAgICAgLyogUG93ZXJ1cCBIQ09ERUMgbWVtb3JpZXMgKi8KKyAgICAgICAgICAgIFdSSVRFX1ZSRUcoRE9TX01FTV9QRF9IQ09ERUMsIDB4MCk7CisKKyAgICAgICAgICAgIC8qIFJlbW92ZSBIQ09ERUMgSVNPICovCisgICAgICAgICAgICBXUklURV9BT1JFRyhBT19SVElfR0VOX1BXUl9JU08wLAorICAgICAgICAgICAgICAgIChSRUFEX0FPUkVHKEFPX1JUSV9HRU5fUFdSX0lTTzApICYgKH4weDMwKSkpOworICAgICAgICAgICAgdWRlbGF5KDEwKTsKKyAgICAgICAgfQorICAgICAgICAvKiBEaXNhYmxlIGF1dG8tY2xvY2sgZ2F0ZSAqLworICAgICAgICBXUklURV9WUkVHKERPU19HRU5fQ1RSTDAsIChSRUFEX1ZSRUcoRE9TX0dFTl9DVFJMMCkgfCAweDEpKTsKKyAgICAgICAgV1JJVEVfVlJFRyhET1NfR0VOX0NUUkwwLCAoUkVBRF9WUkVHKERPU19HRU5fQ1RSTDApICYgMHhGRkZGRkZGRSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGpwZWdlbmNfcG93ZXJvbl9leChjbG9jayk7CisgICAgfQorICAgIC8vc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOworCisgICAgbWRlbGF5KDEwKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHMzMiBqcGVnZW5jX3Bvd2Vyb2ZmKHZvaWQpCit7CisgICAgLy91bG9uZyBmbGFnczsKKyAgICAvL3NwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CisKKyAgICBpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX0MxKSB7CisgICAgICAgIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX004KSB7CisgICAgICAgICAgICAvKiBlbmFibGUgSENPREVDIGlzb2xhdGlvbiAqLworICAgICAgICAgICAgV1JJVEVfQU9SRUcoQU9fUlRJX0dFTl9QV1JfSVNPMCwKKyAgICAgICAgICAgICAgICBSRUFEX0FPUkVHKEFPX1JUSV9HRU5fUFdSX0lTTzApIHwgMHgzMCk7CisgICAgICAgICAgICAvKiBwb3dlciBvZmYgSENPREVDIG1lbW9yaWVzICovCisgICAgICAgICAgICBXUklURV9WUkVHKERPU19NRU1fUERfSENPREVDLCAweGZmZmZmZmZmVUwpOworICAgICAgICB9CisgICAgICAgIC8qIGRpc2FibGUgSENPREVDIGNsb2NrICovCisgICAgICAgIGpwZWdlbmNfY2xvY2tfZGlzYWJsZSgpOworCisgICAgICAgIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX004KSB7CisgICAgICAgICAgICAvKiBIQ09ERUMgcG93ZXIgb2ZmICovCisgICAgICAgICAgICBXUklURV9BT1JFRyhBT19SVElfR0VOX1BXUl9TTEVFUDAsCisgICAgICAgICAgICAgICAgUkVBRF9BT1JFRyhBT19SVElfR0VOX1BXUl9TTEVFUDApIHwgMHgzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHJlbGVhc2UgRE9TIGNsazgxIGNsb2NrIGdhdGluZyAqLworICAgICAgICBhbXBvcnRzX3N3aXRjaF9nYXRlKCJ2ZGVjIiwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAganBlZ2VuY19wb3dlcm9mZl9leCgpOworICAgIH0KKyAgICAvL3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKKworICAgIHJldHVybiAwOworfQorCit2b2lkIGpwZWdlbmNfcmVzZXQodm9pZCkKK3sKKyAgICBSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMSk7CisgICAgUkVBRF9WUkVHKERPU19TV19SRVNFVDEpOworICAgIFJFQURfVlJFRyhET1NfU1dfUkVTRVQxKTsKKyAgICBpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HWEJCKQorICAgICAgICBXUklURV9WUkVHKERPU19TV19SRVNFVDEsCisgICAgICAgICAgICAgICAoMSA8PCAyKSB8ICgxIDw8IDYpIHwKKyAgICAgICAgICAgICAgICgxIDw8IDcpIHwgKDEgPDwgOCkgfAorICAgICAgICAgICAgICAgKDEgPDwgMTQpIHwgKDEgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICgxIDw8IDE3KSk7CisgICAgZWxzZQorICAgICAgICBXUklURV9WUkVHKERPU19TV19SRVNFVDEsCisgICAgICAgICAgICAgICAoMSA8PCAyKSB8ICgxIDw8IDYpIHwgKDEgPDwgNykgfAorICAgICAgICAgICAgICAgKDEgPDwgOCkgfCAoMSA8PCAxNikgfCAoMSA8PCAxNykpOworICAgIFdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMSwgMCk7CisgICAgUkVBRF9WUkVHKERPU19TV19SRVNFVDEpOworICAgIFJFQURfVlJFRyhET1NfU1dfUkVTRVQxKTsKKyAgICBSRUFEX1ZSRUcoRE9TX1NXX1JFU0VUMSk7Cit9CisKK3N0YXRpYyBzMzIganBlZ2VuY19pbml0KHZvaWQpCit7CisgICAganBlZ2VuY19wb3dlcm9uKGNsb2NrX2xldmVsKTsKKworICAgIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX01HOVRWKQorICAgICAgICBXUklURV9IUkVHKEhDT0RFQ19BU1NJU1RfTU1DX0NUUkwxLCAweDMyKTsKKyAgICBlbHNlCisgICAgICAgIFdSSVRFX0hSRUcoSENPREVDX0FTU0lTVF9NTUNfQ1RSTDEsIDB4Mik7CisKKyAgICBqZW5jX3ByKExPR19BTEwsICJzdGFydCB0byBsb2FkIG1pY3JvY29kZVxuIik7CisKKyAgICBpZiAoIWxlZ2FjeV9sb2FkICYmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1Q3ICkpIHsKKyAgICAgICAgY2hhciAqYnVmID0gdm1hbGxvYygweDEwMDAgKiAxNik7CisgICAgICAgIGludCByZXQgPSAtMTsKKyAgICAgICAgcHJfZXJyKCJsb2FkIHVjb2RlXG4iKTsKKyAgICAgICAgaWYgKGdldF9maXJtd2FyZV9kYXRhKFZJREVPX0VOQ19KUEVHLCBidWYpIDwgMCkgeworICAgICAgICAgICAgLy9hbXZkZWNfZGlzYWJsZSgpOworICAgICAgICAgICAgcHJfZXJyKCJnZXQgZmlybXdhcmUgZm9yIGpwZWcgZW5jIGZhaWwhXG4iKTsKKyAgICAgICAgICAgIHZmcmVlKGJ1Zik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgV1JJVEVfSFJFRyhIQ09ERUNfTVBTUiwgMCk7CisgICAgICAgIFdSSVRFX0hSRUcoSENPREVDX0NQU1IsIDApOworICAgICAgICByZXQgPSBhbXZkZWNfbG9hZG1jX2V4KFZGT1JNQVRfSlBFR19FTkMsIE5VTEwsIGJ1Zik7CisKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIC8vYW12ZGVjX2Rpc2FibGUoKTsKKyAgICAgICAgICAgIHZmcmVlKGJ1Zik7CisgICAgICAgICAgICBwcl9lcnIoImpwZWdlbmM6IHRoZSAlcyBmdyBsb2FkaW5nIGZhaWxlZCwgZXJyOiAleFxuIiwKKyAgICAgICAgICAgICAgICB0ZWVfZW5hYmxlZCgpID8gIlRFRSIgOiAibG9jYWwiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgfQorICAgICAgICB2ZnJlZShidWYpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChqcGVnZW5jX2xvYWRtYyhqcGVnZW5jX3Vjb2RlWzBdKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgIH0KKworICAgIGplbmNfcHIoTE9HX0FMTCwgImpwZWdlbmMgbG9hZCBtaWNyb2NvZGUgc3VjY2Vzcy5cbiIpOworICAgIGdKcGVnZW5jLnByb2Nlc3NfaXJxID0gZmFsc2U7CisKKyAgICBpZiAocmVxdWVzdF9pcnEoZ0pwZWdlbmMuaXJxX251bSwganBlZ2VuY19pc3IsIElSUUZfU0hBUkVELAorICAgICAgICAianBlZ2VuYy1pcnEiLCAodm9pZCAqKSZnSnBlZ2VuYykgPT0gMCkKKyAgICAgICAgZ0pwZWdlbmMuaXJxX3JlcXVlc3RlZCA9IHRydWU7CisgICAgZWxzZQorICAgICAgICBnSnBlZ2VuYy5pcnFfcmVxdWVzdGVkID0gZmFsc2U7CisKKyAgICBXUklURV9IUkVHKEpQRUdFTkNfRU5DT0RFUl9TVEFUVVMsIEpQRUdFTkNfRU5DT0RFUl9JRExFKTsKKyAgICBnSnBlZ2VuYy5pbml0ZWQgPSB0cnVlOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgczMyIGNvbnZlcnRfY21kKHN0cnVjdCBqcGVnZW5jX3dxX3MgKndxLCB1MzIgKmNtZF9pbmZvKQoreworICAgIGlmICghd3EpIHsKKyAgICAgICAgamVuY19wcihMT0dfRVJST1IsICJqcGVnZW5jIGNvbnZlcnRfY21kIGVycm9yXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG1lbXNldCgmd3EtPmNtZCwgMCwgc2l6ZW9mKHN0cnVjdCBqcGVnZW5jX3JlcXVlc3RfcykpOworICAgIHdxLT5jbWQudHlwZSA9IGNtZF9pbmZvWzBdOworICAgIHdxLT5jbWQuaW5wdXRfZm10ID0gY21kX2luZm9bMV07CisgICAgd3EtPmNtZC5vdXRwdXRfZm10ID0gY21kX2luZm9bMl07CisgICAgd3EtPmNtZC5lbmNvZGVyX3dpZHRoID0gY21kX2luZm9bM107CisgICAgd3EtPmNtZC5lbmNvZGVyX2hlaWdodCA9IGNtZF9pbmZvWzRdOworICAgIHdxLT5jbWQuZnJhbWVzaXplID0gY21kX2luZm9bNV07CisgICAgd3EtPmNtZC5zcmMgPSBjbWRfaW5mb1s2XTsKKyAgICB3cS0+Y21kLmpwZWdfcXVhbGl0eSA9IGNtZF9pbmZvWzddOworICAgIHdxLT5jbWQuUXVhbnRUYWJsZV9pZCA9IGNtZF9pbmZvWzhdOworICAgIHdxLT5jbWQuZmx1c2hfZmxhZyA9IGNtZF9pbmZvWzldOworICAgIHdxLT5jbWQuYmxvY2tfbW9kZSA9IGNtZF9pbmZvWzEwXTsKKworICAgIHdxLT5jbWQueV9zdHJpZGUgPSBjbWRfaW5mb1sxMV07CisgICAgd3EtPmNtZC51X3N0cmlkZSA9IGNtZF9pbmZvWzEyXTsKKyAgICB3cS0+Y21kLnZfc3RyaWRlID0gY21kX2luZm9bMTNdOworICAgIHdxLT5jbWQuaF9zdHJpZGUgPSBjbWRfaW5mb1sxNF07CisgICAgamVuY19wcihMT0dfREVCVUcsICJjb252ZXJ0X2NtZDogeXN0cmlkZTolZCwgaF9zdHJpZGU6JWRcbiIsCisgICAgICAgICAgICBjbWRfaW5mb1sxMV0sIGNtZF9pbmZvWzE0XSk7CisKKyAgICBpZiAoaXNfb3ZlcnNpemUod3EtPmNtZC5lbmNvZGVyX3dpZHRoLAorICAgICAgICB3cS0+Y21kLmVuY29kZXJfaGVpZ2h0LAorICAgICAgICB3cS0+bWF4X3dpZHRoICogd3EtPm1heF9oZWlnaHQpKSB7CisgICAgICAgIGplbmNfcHIoTE9HX0VSUk9SLAorICAgICAgICAgICAgInNldCBlbmNvZGUgc2l6ZSAlZHglZCBpcyBsYXJnZXIgdGhhbiBzdXBwb3J0ZWQgKCVkeCVkKS5cbiIsCisgICAgICAgICAgICB3cS0+Y21kLmVuY29kZXJfd2lkdGgsCisgICAgICAgICAgICB3cS0+Y21kLmVuY29kZXJfaGVpZ2h0LAorICAgICAgICAgICAgd3EtPm1heF93aWR0aCwKKyAgICAgICAgICAgIHdxLT5tYXhfaGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHdxLT5jbWQuanBlZ19xdWFsaXR5ID0ganBlZ19xdWFsaXR5X3NjYWxpbmcod3EtPmNtZC5qcGVnX3F1YWxpdHkpOworICAgIGlmICh3cS0+Y21kLlF1YW50VGFibGVfaWQgPCA0KSB7CisgICAgICAgIGplbmNfcHIoTE9HX0lORk8sCisgICAgICAgICAgICAiSlBFR0VOQ19TRUxfUVVBTlRfVEFCTEUgOiAlZC5cbiIsCisgICAgICAgICAgICB3cS0+Y21kLlF1YW50VGFibGVfaWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHdxLT5jbWQuUXVhbnRUYWJsZV9pZCA9IDA7CisgICAgICAgIGplbmNfcHIoTE9HX0VSUk9SLAorICAgICAgICAgICAgIkpQRUdFTkNfU0VMX1FVQU5UX1RBQkxFIGludmFpbGQuIHRhcmdldCB2YWx1ZTogJWQuXG4iLAorICAgICAgICAgICAgY21kX2luZm9bOF0pOworICAgIH0KKyAgICBqZW5jX3ByKExPR19JTkZPLAorICAgICAgICAidGFyZ2V0IHF1YWxpdHkgOiAlZCwgIGpwZWdfcXVhbGl0eSB2YWx1ZTogJWQuXG4iLAorICAgICAgICBjbWRfaW5mb1s3XSwgd3EtPmNtZC5qcGVnX3F1YWxpdHkpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBqcGVnZW5jX3N0YXJ0X2NtZChzdHJ1Y3QganBlZ2VuY193cV9zICp3cSkKK3sKKyAgICBnSnBlZ2VuYy5wcm9jZXNzX2lycSA9IGZhbHNlOworICAgIGdKcGVnZW5jLmVuY29kZV9od19zdGF0dXMgPSBKUEVHRU5DX0VOQ09ERVJfSURMRTsKKworICAgIGpwZWdlbmNfcmVzZXQoKTsKKworICAgIHNldF9qcGVnX2lucHV0X2Zvcm1hdCh3cSwgJndxLT5jbWQpOworCisgICAgaW5pdF9qcGVnX2VuY29kZXIod3EpOworCisgICAganBlZ2VuY19pbml0X291dHB1dF9idWZmZXIod3EpOworCisgICAgLyogY2xlYXIgbWFpbGJveCBpbnRlcnJ1cHQgKi8KKyAgICBpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9DMSkgeworICAgICAgICBpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNykKKyAgICAgICAgICAgIFdSSVRFX0hSRUcoSENPREVDX0FTU0lTVF9NQk9YMl9DTFJfUkVHLCAxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgV1JJVEVfSFJFRyhIQ09ERUNfQVNTSVNUX01CT1gwX0NMUl9SRUcsIDEpOworICAgIH0gZWxzZQorICAgICAgICBXUklURV9IUkVHKEhDT0RFQ19BU1NJU1RfTUJPWDJfQ0xSX1JFRywgMSk7CisKKyAgICAvKiBlbmFibGUgbWFpbGJveCBpbnRlcnJ1cHQgKi8KKyAgICBpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9DMSkgeworICAgICAgICBpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNykKKyAgICAgICAgICAgIFdSSVRFX0hSRUcoSENPREVDX0FTU0lTVF9NQk9YMl9NQVNLLCAweGZmZmZmZmZmKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgV1JJVEVfSFJFRyhIQ09ERUNfQVNTSVNUX01CT1gwX01BU0ssIDB4ZmZmZmZmZmYpOworICAgIH0gZWxzZQorICAgICAgICBXUklURV9IUkVHKEhDT0RFQ19BU1NJU1RfTUJPWDJfTUFTSywgMSk7CisKKyAgICBnSnBlZ2VuYy5lbmNvZGVfaHdfc3RhdHVzID0gSlBFR0VOQ19FTkNPREVSX0lETEU7CisgICAgV1JJVEVfSFJFRyhKUEVHRU5DX0VOQ09ERVJfU1RBVFVTLCBKUEVHRU5DX0VOQ09ERVJfSURMRSk7CisgICAgZ0pwZWdlbmMucHJvY2Vzc19pcnEgPSBmYWxzZTsKKworICAgIHRpbWVfY250ID0ganBlZ2VuY190aW1lX2NvdW50X3N0YXJ0KCk7CisKKyAgICBqcGVnZW5jX3N0YXJ0KCk7CisgICAgamVuY19wcihMT0dfSU5GTywgImpwZWdlbmNfc3RhcnRcbiIpOworfQorCitzdGF0aWMgdm9pZCBqcGVnZW5jX3N0b3Aodm9pZCkKK3sKKyAgICBpZiAoKGdKcGVnZW5jLmlycV9udW0gPj0gMCkgJiYKKyAgICAgICAgKGdKcGVnZW5jLmlycV9yZXF1ZXN0ZWQgPT0gdHJ1ZSkpIHsKKyAgICAgICAgZ0pwZWdlbmMuaXJxX3JlcXVlc3RlZCA9IGZhbHNlOworICAgICAgICBmcmVlX2lycShnSnBlZ2VuYy5pcnFfbnVtLCAmZ0pwZWdlbmMpOworICAgIH0KKyAgICBfanBlZ2VuY19zdG9wKCk7CisgICAganBlZ2VuY19wb3dlcm9mZigpOworICAgIGplbmNfcHIoTE9HX0lORk8sICJqcGVnZW5jX3N0b3BcbiIpOworfQorCitzdGF0aWMgdm9pZCBkbWFfZmx1c2godTMyIGJ1Zl9zdGFydCwgdTMyIGJ1Zl9zaXplKQoreworICAgIGRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKCZnSnBlZ2VuYy50aGlzX3BkZXYtPmRldiwKKyAgICAgICAgYnVmX3N0YXJ0LCBidWZfc2l6ZSwgRE1BX1RPX0RFVklDRSk7Cit9CisKK3N0YXRpYyB2b2lkIGNhY2hlX2ZsdXNoKHUzMiBidWZfc3RhcnQsIHUzMiBidWZfc2l6ZSkKK3sKKyAgICBkbWFfc3luY19zaW5nbGVfZm9yX2NwdSgmZ0pwZWdlbmMudGhpc19wZGV2LT5kZXYsCisgICAgICAgIGJ1Zl9zdGFydCwgYnVmX3NpemUsIERNQV9GUk9NX0RFVklDRSk7Cit9CisKK3N0YXRpYyBzMzIganBlZ2VuY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworICAgIHN0cnVjdCBqcGVnZW5jX3dxX3MgKndxOworICAgIHMzMiByOworICAgIHByX2VycigianBlZ2VuYyBvcGVuLCBmaWxwPSVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpZmlsZSk7CisjaWZkZWYgQ09ORklHX0FNX0VOQ09ERVIKKyAgICBpZiAoYW12ZW5jX2F2Y19vbigpID09IHRydWUpIHsKKyAgICAgICAgamVuY19wcihMT0dfRVJST1IsICJoY29kZWMgaW4gdXNlIGZvciBBVkMgRW5jb2RlIG5vdy5cbiIpOworICAgICAgICByZXR1cm4gLUVCVVNZOworICAgIH0KKyNlbmRpZgorICAgIGZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisKKyAgICBzcGluX2xvY2soJmdKcGVnZW5jLnNlbV9sb2NrKTsKKyAgICBpZiAoZ0pwZWdlbmMub3BlbmVkID4gMCkgeworICAgICAgICBzcGluX3VubG9jaygmZ0pwZWdlbmMuc2VtX2xvY2spOworICAgICAgICBqZW5jX3ByKExPR19FUlJPUiwgImpwZWdlbmMgb3BlbiBidXN5LlxuIik7CisgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgfQorICAgIHdxID0gJmdKcGVnZW5jLndxOworICAgIHdxLT5idWZfc3RhcnQgPSBnSnBlZ2VuYy5tZW0uYnVmX3N0YXJ0OworICAgIHdxLT5idWZfc2l6ZSA9IGdKcGVnZW5jLm1lbS5idWZfc2l6ZTsKKyAgICBnSnBlZ2VuYy5vcGVuZWQrKzsKKyAgICBzcGluX3VubG9jaygmZ0pwZWdlbmMuc2VtX2xvY2spOworCisjaWZkZWYgQ09ORklHX0NNQQorICAgIGlmIChnSnBlZ2VuYy51c2VfcmVzZXJ2ZSA9PSBmYWxzZSkgeworICAgICAgICBpZiAoZ0pwZWdlbmMudXNlX2NtYSkgeworICAgICAgICAgICAgc3RydWN0IHBhZ2UgKmNtYV9wYWdlczsKKyAgICAgICAgICAgIGNtYV9wYWdlcyA9IGRtYV9hbGxvY19mcm9tX2NvbnRpZ3VvdXMoJmdKcGVnZW5jLnRoaXNfcGRldi0+ZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdKcGVnZW5jLm1lbS5idWZfc2l6ZSA+PiBQQUdFX1NISUZULCAwLCB0cnVlKTsKKyAgICAgICAgICAgIGlmIChjbWFfcGFnZXMpIHsKKyAgICAgICAgICAgICAgICB3cS0+YnVmX3N0YXJ0ID0gcGFnZV90b19waHlzKGNtYV9wYWdlcyk7CisgICAgICAgICAgICAgICAgd3EtPmJ1Zl9zaXplID0gZ0pwZWdlbmMubWVtLmJ1Zl9zaXplOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBqZW5jX3ByKExPR19FUlJPUiwgImpwZWdlbmMgLSBjbWEgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCF3cS0+YnVmX3N0YXJ0KSB7CisgICAgICAgICAgICBnSnBlZ2VuYy51c2VfY21hID0gZmFsc2U7CisgICAgICAgICAgICB3cS0+YnVmX3N0YXJ0ID0gY29kZWNfbW1fYWxsb2NfZm9yX2RtYShEUklWRVJfTkFNRSwKKyAgICAgICAgICAgICAgICBnSnBlZ2VuYy5tZW0uYnVmX3NpemUgPj4gUEFHRV9TSElGVCwgMCwgMCk7CisgICAgICAgICAgICBpZiAod3EtPmJ1Zl9zdGFydCkgeworICAgICAgICAgICAgICAgIHdxLT5idWZfc2l6ZSA9IGdKcGVnZW5jLm1lbS5idWZfc2l6ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgamVuY19wcihMT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJqcGVnZW5jIC0gY29kZWNfbW0gYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIHNwaW5fbG9jaygmZ0pwZWdlbmMuc2VtX2xvY2spOworICAgICAgICAgICAgICAgIGdKcGVnZW5jLm9wZW5lZC0tOworICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrKCZnSnBlZ2VuYy5zZW1fbG9jayk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGplbmNfcHIoTE9HX0RFQlVHLAorICAgICAgICAianBlZ2VuYyAtIGFsbG9jYXRlZCBmcm9tICVzOiBzdGFydDoweCV4LCAlZCBNQi5cbiIsCisgICAgICAgIGdKcGVnZW5jLnVzZV9yZXNlcnZlID8gInJlc2VydmVkIiA6CisgICAgICAgICAgICBnSnBlZ2VuYy51c2VfY21hID8gImNtYSIgOiAiY29kZWNfbW0iLAorICAgICAgICB3cS0+YnVmX3N0YXJ0LCBnSnBlZ2VuYy5tZW0uYnVmX3NpemUgLyBTWl8xTSk7CisKKyAgICBzcGluX2xvY2soJmdKcGVnZW5jLnNlbV9sb2NrKTsKKyAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZ3cS0+Y29tcGxldGUpOworICAgIGF0b21pY19zZXQoJndxLT5yZWFkeSwgMCk7CisgICAgd3EtPkFzc2l0c3RyZWFtU3RhcnRWaXJ0QWRkciA9IE5VTEw7CisgICAgbWVtc2V0KGdRdWFudFRhYmxlLCAwLCBzaXplb2YoZ1F1YW50VGFibGUpKTsKKyAgICB3cS0+Y21kLlF1YW50VGFibGVfaWQgPSAwOworICAgIHdxLT5jbWQuanBlZ19xdWFsaXR5ID0gOTA7CisgICAgd3EtPm1heF93aWR0aCA9IGdKcGVnZW5jLm1lbS5idWZzcGVjLT5tYXhfd2lkdGg7CisgICAgd3EtPm1heF9oZWlnaHQgPSBnSnBlZ2VuYy5tZW0uYnVmc3BlYy0+bWF4X2hlaWdodDsKKyAgICB3cS0+aGVhZGJ5dGVzID0gMDsKKyAgICBmaWxlLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKXdxOworI2lmZGVmIEVYVEVBTl9RVUFOVF9UQUJMRQorICAgIGdFeHRlcm5hbFF1YW50VGFibGVQdHIgPSBOVUxMOworICAgIGV4dGVybmFsX3F1YW50X3RhYmxlX2F2YWlsYWJsZSA9IGZhbHNlOworI2VuZGlmCisgICAgc3Bpbl91bmxvY2soJmdKcGVnZW5jLnNlbV9sb2NrKTsKKyAgICByID0gMDsKKworICAgIHJldHVybiByOworfQorCitzdGF0aWMgczMyIGpwZWdlbmNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKyAgICBzdHJ1Y3QganBlZ2VuY193cV9zICp3cSA9IChzdHJ1Y3QganBlZ2VuY193cV9zICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisgICAgaWYgKHdxICE9ICZnSnBlZ2VuYy53cSkgeworICAgICAgICBqZW5jX3ByKExPR19FUlJPUiwgImpwZWdlbmMgcmVsZWFzZSBlcnJvclxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGdKcGVnZW5jLmluaXRlZCkgeworICAgICAgICBqcGVnZW5jX3N0b3AoKTsKKyAgICAgICAgZ0pwZWdlbmMuaW5pdGVkID0gZmFsc2U7CisgICAgfQorICAgIGlmICh3cS0+ZG1hX2lucHV0ICE9IE5VTEwpIHsKKyAgICAgICAgZW5jX2RtYV9idWZfdW5tYXAod3EtPmRtYV9pbnB1dCk7CisgICAgICAgIGtmcmVlKHdxLT5kbWFfaW5wdXQpOworICAgICAgICB3cS0+ZG1hX2lucHV0ID0gTlVMTDsKKyAgICB9CisgICAgbWVtc2V0KGdRdWFudFRhYmxlLCAwLCBzaXplb2YoZ1F1YW50VGFibGUpKTsKKworICAgIGlmICh3cS0+QXNzaXRzdHJlYW1TdGFydFZpcnRBZGRyKQorICAgICAgICB3cS0+QXNzaXRzdHJlYW1TdGFydFZpcnRBZGRyID0gTlVMTDsKKworI2lmZGVmIENPTkZJR19DTUEKKyAgICBpZiAod3EtPmJ1Zl9zdGFydCkgeworICAgICAgICBpZiAoZ0pwZWdlbmMudXNlX2NtYSkgeworICAgICAgICAgICAgc3RydWN0IHBhZ2UgKmNtYV9wYWdlczsKKyAgICAgICAgICAgIGNtYV9wYWdlcyA9IHBoeXNfdG9fcGFnZSh3cS0+YnVmX3N0YXJ0KTsKKyAgICAgICAgICAgIGlmICghZG1hX3JlbGVhc2VfZnJvbV9jb250aWd1b3VzKCZnSnBlZ2VuYy50aGlzX3BkZXYtPmRldiwgY21hX3BhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cS0+YnVmX3NpemUgPj4gUEFHRV9TSElGVCkpIHsKKyAgICAgICAgICAgICAgICBqZW5jX3ByKExPR19FUlJPUiwgIlslc10gZmFpbGVkIHRvIHJlbGVhc2UgY21hIGJ1ZmZlclxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvZGVjX21tX2ZyZWVfZm9yX2RtYShEUklWRVJfTkFNRSwgd3EtPmJ1Zl9zdGFydCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICB3cS0+YnVmX3N0YXJ0ID0gMDsKKyAgICB3cS0+YnVmX3NpemUgPSAwOworI2lmZGVmIEVYVEVBTl9RVUFOVF9UQUJMRQorICAgIGtmcmVlKGdFeHRlcm5hbFF1YW50VGFibGVQdHIpOworICAgIGdFeHRlcm5hbFF1YW50VGFibGVQdHIgPSBOVUxMOworICAgIGV4dGVybmFsX3F1YW50X3RhYmxlX2F2YWlsYWJsZSA9IGZhbHNlOworI2VuZGlmCisgICAgc3Bpbl9sb2NrKCZnSnBlZ2VuYy5zZW1fbG9jayk7CisgICAgaWYgKGdKcGVnZW5jLm9wZW5lZCA+IDApCisgICAgICAgIGdKcGVnZW5jLm9wZW5lZC0tOworICAgIHNwaW5fdW5sb2NrKCZnSnBlZ2VuYy5zZW1fbG9jayk7CisgICAgamVuY19wcihMT0dfREVCVUcsICJqcGVnZW5jIHJlbGVhc2VcbiIpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBqcGVnZW5jX3JlY29uZmlnX2lucHV0KHN0cnVjdCBqcGVnZW5jX3dxX3MgKndxLCB1MzIgbmV3X2FkZHIsIHUzMiBuZXdfc2l6ZSkgeworICAgIHdxLT5JbnB1dEJ1ZmZTdGFydCA9IG5ld19hZGRyOworICAgIHdxLT5JbnB1dEJ1ZmZFbmQgPSB3cS0+SW5wdXRCdWZmU3RhcnQgKyBuZXdfc2l6ZSAtIDE7Cit9CisKK3N0YXRpYyB2b2lkIGpwZWdlbmNfcmVzdG9yZV9pbnB1dChzdHJ1Y3QganBlZ2VuY193cV9zICp3cSkgeworICAgIHdxLT5JbnB1dEJ1ZmZTdGFydCA9IHdxLT5idWZfc3RhcnQgKyBnSnBlZ2VuYy5tZW0uYnVmc3BlYy0+aW5wdXQuYnVmX3N0YXJ0OworICAgIHdxLT5JbnB1dEJ1ZmZFbmQgPSB3cS0+SW5wdXRCdWZmU3RhcnQgKyBnSnBlZ2VuYy5tZW0uYnVmc3BlYy0+aW5wdXQuYnVmX3NpemUgLSAxOworfQorc3RhdGljIGxvbmcganBlZ2VuY19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdTMyIGNtZCwgdWxvbmcgYXJnKQoreworICAgIGxvbmcgciA9IDA7CisgICAgc3RydWN0IGpwZWdlbmNfd3FfcyAqd3EgPSAoc3RydWN0IGpwZWdlbmNfd3FfcyAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKyNkZWZpbmUgTUFYX0FERFJfSU5GT19TSVpFIDMwCisgICAgdTMyIGFkZHJfaW5mb1tNQVhfQUREUl9JTkZPX1NJWkUgKyA0XTsKKyAgICBpbnQgc2hhcmVkX2ZkID0gLTE7CisgICAgLy9zdHJ1Y3QganBlZ2VuY19mcmFtZV9wYXJhbXMgKmZybV9wYXJhbXM7CisKKyAgICBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworICAgIHVuc2lnbmVkIGxvbmcgcGFkZHIgPSAwOworCisgICAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIEpQRUdFTkNfSU9DX1FVRVJZX0RNQV9TVVBQT1JUOgorICAgICAgICBqZW5jX3ByKExPR19ERUJVRywgImlvY3RsIEpQRUdFTkNfSU9DX1FVRVJZX0RNQV9TVVBQT1JUXG4iKTsKKyAgICAgICAgamVuY19wcihMT0dfSU5GTywgInVzZV9kbWFfaW89JXVcbiIsIHVzZV9kbWFfaW8pOworICAgICAgICBwdXRfdXNlcih1c2VfZG1hX2lvLCAodTMyICopYXJnKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBKUEVHRU5DX0lPQ19DT05GSUdfRE1BX0lOUFVUOgorICAgICAgICBqZW5jX3ByKExPR19ERUJVRywgImlvY3RsIEpQRUdFTkNfSU9DX0NPTkZJR19ETUFfSU5QVVRcbiIpOworICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJnNoYXJlZF9mZCwgKHZvaWQgKilhcmcsIHNpemVvZihzMzIpKSkgeworICAgICAgICAgICAgamVuY19wcihMT0dfRVJST1IsCisgICAgICAgICAgICAgICAgImpwZWdlbmMgSlBFR0VOQ19JT0NfQ09ORklHX0RNQV9JTlBVVCBlcnJvci5cbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgamVuY19wcihMT0dfSU5GTywgIkpQRUdFTkNfSU9DX0NPTkZJR19ETUFfSU5QVVQsIHNoYXJlZF9mZDolZFxuIiwKKyAgICAgICAgICAgIHNoYXJlZF9mZCk7CisKKyAgICAgICAgaWYgKHdxLT5kbWFfaW5wdXQgIT0gTlVMTCkgeworICAgICAgICAgICAgamVuY19wcihMT0dfSU5GTywgIlslZF0gcmVsZWFzZSBvbGQgc3RhbGUgZG1hIGJ1ZmZlclxuIiwgX19MSU5FX18pOworICAgICAgICAgICAgZW5jX2RtYV9idWZfdW5tYXAod3EtPmRtYV9pbnB1dCk7CisgICAgICAgICAgICB3cS0+ZG1hX2lucHV0LT5mZCA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHdxLT5kbWFfaW5wdXQgPT0gTlVMTCkKKyAgICAgICAgICAgIHdxLT5kbWFfaW5wdXQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZW5jX2RtYV9jZmcpLCBHRlBfS0VSTkVMKTsKKworICAgICAgICBpZiAod3EtPmRtYV9pbnB1dCAhPSBOVUxMKSB7CisgICAgICAgICAgICB3cS0+ZG1hX2lucHV0LT5kaXIgPSBETUFfVE9fREVWSUNFOworICAgICAgICAgICAgd3EtPmRtYV9pbnB1dC0+ZmQgPSBzaGFyZWRfZmQ7CisgICAgICAgICAgICBwZGV2ID0gZ0pwZWdlbmMudGhpc19wZGV2OworICAgICAgICAgICAgd3EtPmRtYV9pbnB1dC0+ZGV2ID0gJihwZGV2LT5kZXYpOworCisgICAgICAgICAgICByID0gZW5jX2RtYV9idWZfZ2V0X3BoeXMod3EtPmRtYV9pbnB1dCwgJnBhZGRyKTsKKworICAgICAgICAgICAgaWYgKHIgPCAwKSB7CisgICAgICAgICAgICAgICAgamVuY19wcihMT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJpbXBvcnQgZmQgJWQgZmFpbGVkXG4iLAorICAgICAgICAgICAgICAgICAgICB3cS0+ZG1hX2lucHV0LT5mZCk7CisgICAgICAgICAgICAgICAgd3EtPmRtYV9pbnB1dC0+cGFkZHIgPSBOVUxMOworICAgICAgICAgICAgICAgIHdxLT5kbWFfaW5wdXQtPnZhZGRyID0gTlVMTDsKKyAgICAgICAgICAgICAgICBlbmNfZG1hX2J1Zl91bm1hcCh3cS0+ZG1hX2lucHV0KTsKKyAgICAgICAgICAgICAgICBrZnJlZSh3cS0+ZG1hX2lucHV0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdxLT5kbWFfaW5wdXQtPnBhZGRyID0gKHZvaWQgKilwYWRkcjsKKyAgICAgICAgICAgIGplbmNfcHIoTE9HX0lORk8sICJwYWRkciAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgd3EtPmRtYV9pbnB1dC0+cGFkZHIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgamVuY19wcihMT0dfRVJST1IsICJrbWFsbG9jIHN0cnVjdCBlbmNfZG1hX2NmZyBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAganBlZ2VuY19yZWNvbmZpZ19pbnB1dCh3cSwgcGFkZHIsIHdxLT5kbWFfaW5wdXQtPnNpemUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEpQRUdFTkNfSU9DX1JFTEVBU0VfRE1BX0lOUFVUOgorICAgICAgICBqZW5jX3ByKExPR19ERUJVRywgImlvY3RsIEpQRUdFTkNfSU9DX1JFTEVBU0VfRE1BX0lOUFVUXG4iKTsKKyAgICAgICAgaWYgKHdxLT5kbWFfaW5wdXQgIT0gTlVMTCkgeworICAgICAgICAgICAgamVuY19wcihMT0dfSU5GTywgIlslZF0gcmVsZWFzZSBkbWEgYnVmZmVyXG4iLCBfX0xJTkVfXyk7CisgICAgICAgICAgICBlbmNfZG1hX2J1Zl91bm1hcCh3cS0+ZG1hX2lucHV0KTsKKyAgICAgICAgICAgIHdxLT5kbWFfaW5wdXQtPmZkID0gLTE7CisgICAgICAgICAgICAvLyByZXN0b3JlIHRvIG9yaWdpbmFsIGlucHV0IGJ1ZmZlciBjb25maWcgaWYgZG1hIGJ1ZmZlciBpcyByZXZva2VkCisgICAgICAgICAgICBqcGVnZW5jX3Jlc3RvcmVfaW5wdXQod3EpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSlBFR0VOQ19JT0NfTkVXX0NNRDoKKyAgICAgICAgamVuY19wcihMT0dfREVCVUcsICJpb2N0bCBKUEVHRU5DX0lPQ19ORVdfQ01EXG4iKTsKKyAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKGFkZHJfaW5mbywgKHZvaWQgKilhcmcsCisgICAgICAgICAgICBNQVhfQUREUl9JTkZPX1NJWkUgKiBzaXplb2YodTMyKSkpIHsKKyAgICAgICAgICAgIGplbmNfcHIoTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICJqcGVnZW5jIGdldCBuZXcgY21kIGVycm9yLlxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjb252ZXJ0X2NtZCh3cSwgYWRkcl9pbmZvKSkKKyAgICAgICAgICAgIGpwZWdlbmNfc3RhcnRfY21kKHdxKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBKUEVHRU5DX0lPQ19ORVdfQ01EMjoKKyAgICAgICAgamVuY19wcihMT0dfREVCVUcsICJpb2N0bCBKUEVHRU5DX0lPQ19ORVdfQ01EMlxuIik7CisgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmKHdxLT5jbWQpLCAodm9pZCAqKWFyZywgKHVuc2lnbmVkIGxvbmcpIHNpemVvZihzdHJ1Y3QganBlZ2VuY19yZXF1ZXN0X3MpKSkgeworICAgICAgICAgICAgamVuY19wcihMT0dfRVJST1IsCisgICAgICAgICAgICAgICAgImpwZWdlbmMgZ2V0IG5ldyBjbWQyIGVycm9yLlxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBkdW1wX3JlcXVzdCgmKHdxLT5jbWQpKTsKKworICAgICAgICBpZiAoaXNfb3ZlcnNpemUod3EtPmNtZC5lbmNvZGVyX3dpZHRoLAorICAgICAgICAgICAgd3EtPmNtZC5lbmNvZGVyX2hlaWdodCwKKyAgICAgICAgICAgIHdxLT5tYXhfd2lkdGggKiB3cS0+bWF4X2hlaWdodCkpIHsKKyAgICAgICAgICAgIGplbmNfcHIoTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICJzZXQgZW5jb2RlIHNpemUgJWR4JWQgaXMgbGFyZ2VyIHRoYW4gc3VwcG9ydGVkICglZHglZCkuXG4iLAorICAgICAgICAgICAgICAgIHdxLT5jbWQuZW5jb2Rlcl93aWR0aCwKKyAgICAgICAgICAgICAgICB3cS0+Y21kLmVuY29kZXJfaGVpZ2h0LAorICAgICAgICAgICAgICAgIHdxLT5tYXhfd2lkdGgsCisgICAgICAgICAgICAgICAgd3EtPm1heF9oZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgd3EtPmNtZC5qcGVnX3F1YWxpdHkgPSBqcGVnX3F1YWxpdHlfc2NhbGluZyh3cS0+Y21kLmpwZWdfcXVhbGl0eSk7CisKKyAgICAgICAgaWYgKHdxLT5jbWQuUXVhbnRUYWJsZV9pZCA8IDQpIHsKKyAgICAgICAgICAgIGplbmNfcHIoTE9HX0lORk8sICJKUEVHRU5DX1NFTF9RVUFOVF9UQUJMRTogJWRcbiIsIHdxLT5jbWQuUXVhbnRUYWJsZV9pZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cS0+Y21kLlF1YW50VGFibGVfaWQgPSAwOworICAgICAgICAgICAgamVuY19wcihMT0dfRVJST1IsICJKUEVHRU5DX1NFTF9RVUFOVF9UQUJMRSBpbnZhaWxkLCB1c2UgMCBpbnN0ZWFkXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGplbmNfcHIoTE9HX0lORk8sICJzY2FsZWQganBlZ19xdWFsaXR5OiAlZFxuIiwgd3EtPmNtZC5qcGVnX3F1YWxpdHkpOworCisgICAgICAgIC8vaWYgKCFjb252ZXJ0X2NtZCh3cSwgYWRkcl9pbmZvKSkKKyAgICAgICAganBlZ2VuY19zdGFydF9jbWQod3EpOworCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSlBFR0VOQ19JT0NfR0VUX1NUQUdFOgorICAgICAgICBqZW5jX3ByKExPR19ERUJVRywgImlvY3RsIEpQRUdFTkNfSU9DX0dFVF9TVEFHRVxuIik7CisgICAgICAgIHB1dF91c2VyKHdxLT5od19zdGF0dXMsICh1MzIgKilhcmcpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEpQRUdFTkNfSU9DX0dFVF9PVVRQVVRfU0laRToKKyAgICAgICAgamVuY19wcihMT0dfREVCVUcsICJpb2N0bCBKUEVHRU5DX0lPQ19HRVRfT1VUUFVUX1NJWkVcbiIpOworICAgICAgICBjYWNoZV9mbHVzaCh3cS0+Qml0c3RyZWFtU3RhcnQsIHdxLT5vdXRwdXRfc2l6ZSk7CisgICAgICAgIGFkZHJfaW5mb1swXSA9IHdxLT5oZWFkYnl0ZXM7CisgICAgICAgIGFkZHJfaW5mb1sxXSA9IHdxLT5vdXRwdXRfc2l6ZTsKKyAgICAgICAgciA9IGNvcHlfdG9fdXNlcigodTMyICopYXJnLCBhZGRyX2luZm8gLCAyICogc2l6ZW9mKHUzMikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEpQRUdFTkNfSU9DX0NPTkZJR19JTklUOgorICAgICAgICBqZW5jX3ByKExPR19ERUJVRywgImlvY3RsIEpQRUdFTkNfSU9DX0NPTkZJR19JTklUXG4iKTsKKyAgICAgICAganBlZ2VuY19pbml0KCk7CisgICAgICAgIGpwZWdlbmNfYnVmZnNwZWNfaW5pdCh3cSk7CisgICAgICAgIGplbmNfcHIoTE9HX0RFQlVHLCAiaW9jdGwgSlBFR0VOQ19JT0NfQ09ORklHX0lOSVQgZW5kXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBKUEVHRU5DX0lPQ19HRVRfQlVGRklORk86CisgICAgICAgIGplbmNfcHIoTE9HX0RFQlVHLCAiaW9jdGwgSlBFR0VOQ19JT0NfR0VUX0JVRkZJTkZPXG4iKTsKKyAgICAgICAgYWRkcl9pbmZvWzBdID0gZ0pwZWdlbmMubWVtLmJ1Zl9zaXplOworICAgICAgICBhZGRyX2luZm9bMV0gPSBnSnBlZ2VuYy5tZW0uYnVmc3BlYy0+aW5wdXQuYnVmX3N0YXJ0OworICAgICAgICBhZGRyX2luZm9bMl0gPSBnSnBlZ2VuYy5tZW0uYnVmc3BlYy0+aW5wdXQuYnVmX3NpemU7CisgICAgICAgIGFkZHJfaW5mb1szXSA9IGdKcGVnZW5jLm1lbS5idWZzcGVjLT5hc3NpdC5idWZfc3RhcnQ7CisgICAgICAgIGFkZHJfaW5mb1s0XSA9IGdKcGVnZW5jLm1lbS5idWZzcGVjLT5hc3NpdC5idWZfc2l6ZTsKKyAgICAgICAgYWRkcl9pbmZvWzVdID0gZ0pwZWdlbmMubWVtLmJ1ZnNwZWMtPmJpdHN0cmVhbS5idWZfc3RhcnQ7CisgICAgICAgIGFkZHJfaW5mb1s2XSA9IGdKcGVnZW5jLm1lbS5idWZzcGVjLT5iaXRzdHJlYW0uYnVmX3NpemU7CisgICAgICAgIHIgPSBjb3B5X3RvX3VzZXIoKHUzMiAqKWFyZywgYWRkcl9pbmZvICwgNyAqIHNpemVvZih1MzIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBKUEVHRU5DX0lPQ19HRVRfREVWSU5GTzoKKyAgICAgICAgamVuY19wcihMT0dfREVCVUcsICJpb2N0bCBKUEVHRU5DX0lPQ19HRVRfREVWSU5GT1xuIik7CisgICAgICAgIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYTCkgeworICAgICAgICAgICAgLyogR1hMIHNlbmQgc2FtZSBpZCBvZiBHWFRWQkIgdG8gdXBwZXIqLworICAgICAgICAgICAgciA9IGNvcHlfdG9fdXNlcigoczggKilhcmcsIEpQRUdFTkNfREVWSU5GT19HWFRWQkIsCisgICAgICAgICAgICAgICAgc3RybGVuKEpQRUdFTkNfREVWSU5GT19HWFRWQkIpKTsKKyAgICAgICAgfSBlbHNlIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYVFZCQikgeworICAgICAgICAgICAgciA9IGNvcHlfdG9fdXNlcigoczggKilhcmcsIEpQRUdFTkNfREVWSU5GT19HWFRWQkIsCisgICAgICAgICAgICAgICAgc3RybGVuKEpQRUdFTkNfREVWSU5GT19HWFRWQkIpKTsKKyAgICAgICAgfSBlbHNlIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYQkIpIHsKKyAgICAgICAgICAgIHIgPSBjb3B5X3RvX3VzZXIoKHM4ICopYXJnLCBKUEVHRU5DX0RFVklORk9fR1hCQiwKKyAgICAgICAgICAgICAgICBzdHJsZW4oSlBFR0VOQ19ERVZJTkZPX0dYQkIpKTsKKyAgICAgICAgfSBlbHNlIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX01HOVRWKSB7CisgICAgICAgICAgICByID0gY29weV90b191c2VyKChzOCAqKWFyZywgSlBFR0VOQ19ERVZJTkZPX0c5LAorICAgICAgICAgICAgICAgIHN0cmxlbihKUEVHRU5DX0RFVklORk9fRzkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHIgPSBjb3B5X3RvX3VzZXIoKHM4ICopYXJnLCBKUEVHRU5DX0RFVklORk9fTTgsCisgICAgICAgICAgICAgICAgc3RybGVuKEpQRUdFTkNfREVWSU5GT19NOCkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSlBFR0VOQ19JT0NfU0VUX0VYVF9RVUFOVF9UQUJMRToKKyAgICAgICAgamVuY19wcihMT0dfREVCVUcsICJpb2N0bCBKUEVHRU5DX0lPQ19TRVRfRVhUX1FVQU5UX1RBQkxFXG4iKTsKKyNpZmRlZiBFWFRFQU5fUVVBTlRfVEFCTEUKKyAgICAgICAgaWYgKGFyZyA9PSAwKSB7CisgICAgICAgICAgICBrZnJlZShnRXh0ZXJuYWxRdWFudFRhYmxlUHRyKTsKKyAgICAgICAgICAgIGdFeHRlcm5hbFF1YW50VGFibGVQdHIgPSBOVUxMOworICAgICAgICAgICAgZXh0ZXJuYWxfcXVhbnRfdGFibGVfYXZhaWxhYmxlID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKyAgICAgICAgICAgIGdFeHRlcm5hbFF1YW50VGFibGVQdHIgPQorICAgICAgICAgICAgICAgIGttYWxsb2Moc2l6ZW9mKHUxNikgKiBEQ1RTSVpFMiAqIDIsCisgICAgICAgICAgICAgICAgR0ZQX0tFUk5FTCk7CisgICAgICAgICAgICBpZiAoZ0V4dGVybmFsUXVhbnRUYWJsZVB0cikgeworICAgICAgICAgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcgorICAgICAgICAgICAgICAgICAgICAoZ0V4dGVybmFsUXVhbnRUYWJsZVB0ciwgYXJncCwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHUxNikgKiBEQ1RTSVpFMiAqIDIpKSB7CisgICAgICAgICAgICAgICAgICAgIHIgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGV4dGVybmFsX3F1YW50X3RhYmxlX2F2YWlsYWJsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgciA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGplbmNfcHIoTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiZ0V4dGVybmFsUXVhbnRUYWJsZVB0ciBtYWxsb2MgZmFpbFxuIik7CisgICAgICAgICAgICAgICAgciA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZWxzZQorICAgICAgICByID0gMDsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBqZW5jX3ByKExPR19ERUJVRywgImlvY3RsIEJBRCBjbWRcbiIpOworICAgICAgICByID0gLTE7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcjsKK30KKworI2lmZGVmIENPTkZJR19DT01QQVQKK3N0YXRpYyBsb25nIGpwZWdlbmNfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLAorICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJncykKK3sKKyAgICB1bnNpZ25lZCBsb25nIHJldDsKKworICAgIGFyZ3MgPSAodW5zaWduZWQgbG9uZyljb21wYXRfcHRyKGFyZ3MpOworICAgIHJldCA9IGpwZWdlbmNfaW9jdGwoZmlscCwgY21kLCBhcmdzKTsKKyAgICByZXR1cm4gcmV0OworfQorI2VuZGlmCisKK3N0YXRpYyBzMzIganBlZ2VuY19tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKyAgICBzdHJ1Y3QganBlZ2VuY193cV9zICp3cSA9IChzdHJ1Y3QganBlZ2VuY193cV9zICopZmlscC0+cHJpdmF0ZV9kYXRhOworICAgIHVsb25nIG9mZiA9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKKyAgICB1bG9uZyB2bWFfc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKworICAgIGlmICh2bWFfc2l6ZSA9PSAwKSB7CisgICAgICAgIGplbmNfcHIoTE9HX0VSUk9SLCAidm1hX3NpemUgaXMgMFxuIik7CisgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgIH0KKyAgICBvZmYgKz0gd3EtPmJ1Zl9zdGFydDsKKyAgICBqZW5jX3ByKExPR19JTkZPLCAidm1hX3NpemUgaXMgJWxkLCBvZmYgaXMgJWxkXG4iLCB2bWFfc2l6ZSwgb2ZmKTsKKyAgICB2bWEtPnZtX2ZsYWdzIHw9IFZNX0RPTlRFWFBBTkQgfCBWTV9ET05URFVNUCB8IFZNX0lPOworICAgIC8qIHZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X25vbmNhY2hlZCh2bWEtPnZtX3BhZ2VfcHJvdCk7ICovCisgICAgaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIG9mZiA+PiBQQUdFX1NISUZULAorICAgICAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGFnZV9wcm90KSkgeworICAgICAgICBqZW5jX3ByKExPR19FUlJPUiwgInNldF9jYWNoZWQ6IGZhaWxlZCByZW1hcF9wZm5fcmFuZ2VcbiIpOworICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIganBlZ2VuY19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0X3RhYmxlKQoreworICAgIHN0cnVjdCBqcGVnZW5jX3dxX3MgKndxID0gKHN0cnVjdCBqcGVnZW5jX3dxX3MgKilmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgcG9sbF93YWl0KGZpbGUsICZ3cS0+Y29tcGxldGUsIHdhaXRfdGFibGUpOworCisgICAgaWYgKGF0b21pY19yZWFkKCZ3cS0+cmVhZHkpKSB7CisgICAgICAgIGF0b21pY19kZWMoJndxLT5yZWFkeSk7CisgICAgICAgIHJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMganBlZ2VuY19mb3BzID0geworICAgIC5vd25lciA9IFRISVNfTU9EVUxFLAorICAgIC5vcGVuID0ganBlZ2VuY19vcGVuLAorICAgIC5tbWFwID0ganBlZ2VuY19tbWFwLAorICAgIC5yZWxlYXNlID0ganBlZ2VuY19yZWxlYXNlLAorICAgIC51bmxvY2tlZF9pb2N0bCA9IGpwZWdlbmNfaW9jdGwsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorICAgIC5jb21wYXRfaW9jdGwgPSBqcGVnZW5jX2NvbXBhdF9pb2N0bCwKKyNlbmRpZgorICAgIC5wb2xsID0ganBlZ2VuY19wb2xsLAorfTsKKworc3RhdGljIHMzMiBqcGVnZW5jX3dxX2luaXQodm9pZCkKK3sKKyAgICBqZW5jX3ByKExPR19ERUJVRywgImpwZWdlbmNfd3FfaW5pdC5cbiIpOworICAgIHNwaW5fbG9ja19pbml0KCZnSnBlZ2VuYy5zZW1fbG9jayk7CisgICAgc3Bpbl9sb2NrKCZnSnBlZ2VuYy5zZW1fbG9jayk7CisgICAgZ0pwZWdlbmMuaXJxX3JlcXVlc3RlZCA9IGZhbHNlOworICAgIGdKcGVnZW5jLnByb2Nlc3NfaXJxID0gZmFsc2U7CisgICAgZ0pwZWdlbmMuaW5pdGVkID0gZmFsc2U7CisgICAgZ0pwZWdlbmMub3BlbmVkID0gMDsKKyAgICBnSnBlZ2VuYy5lbmNvZGVfaHdfc3RhdHVzID0gSlBFR0VOQ19FTkNPREVSX0lETEU7CisKKyAgICB0YXNrbGV0X2luaXQoJmdKcGVnZW5jLnRhc2tsZXQsCisgICAgICAgICAgICAganBlZ2VuY19pc3JfdGFza2xldCwKKyAgICAgICAgICAgICAodWxvbmcpJmdKcGVnZW5jKTsKKyAgICBzcGluX3VubG9jaygmZ0pwZWdlbmMuc2VtX2xvY2spOworICAgIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0dYQkIpCisgICAgICAgIGNsb2NrX2xldmVsID0gNTsKKyAgICBlbHNlIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX004TTIpCisgICAgICAgIGNsb2NrX2xldmVsID0gMzsKKyAgICBlbHNlCisgICAgICAgIGNsb2NrX2xldmVsID0gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHMzMiBqcGVnZW5jX3dxX3VuaW5pdCh2b2lkKQoreworICAgIHMzMiByID0gLTE7CisgICAgamVuY19wcihMT0dfREVCVUcsICJ1bmluaXQgZW5jb2RlIHdxLlxuIik7CisgICAgaWYgKGdKcGVnZW5jLmVuY29kZV9od19zdGF0dXMgPT0gSlBFR0VOQ19FTkNPREVSX0lETEUpIHsKKyAgICAgICAgaWYgKChnSnBlZ2VuYy5pcnFfbnVtID49IDApICYmCisgICAgICAgICAgICAoZ0pwZWdlbmMuaXJxX3JlcXVlc3RlZCA9PSB0cnVlKSkgeworICAgICAgICAgICAgZnJlZV9pcnEoZ0pwZWdlbmMuaXJxX251bSwgJmdKcGVnZW5jKTsKKyAgICAgICAgICAgIGdKcGVnZW5jLmlycV9yZXF1ZXN0ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByID0gMDsKKyAgICB9CisgICAgcmV0dXJuICByOworfQorCitzdGF0aWMgc3NpemVfdCBlbmNvZGVfc3RhdHVzX3Nob3coc3RydWN0IGNsYXNzICpjbGEsCisgICAgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworICAgIHMzMiBpcnFfbnVtOworICAgIHUzMiBod19zdGF0dXMsIHdpZHRoLCBoZWlnaHQ7CisgICAgYm9vbCBwcm9jZXNzX2lycTsKKyAgICBib29sIGluaXRlZDsKKyAgICBib29sIHVzZV9yZXNlcnZlOworICAgIHUzMiBjbWFfc2l6ZSwgbWF4X3csIG1heF9oOworICAgIHUzMiBidWZmZXJfc3RhcnQsIGJ1ZmZlcl9zaXplOworICAgIHU4IGxldiwgb3BlbmVkOworICAgIHN0cnVjdCBKcGVnZW5jX0J1ZmZfcyByZXM7CisKKyAgICBzcGluX2xvY2soJmdKcGVnZW5jLnNlbV9sb2NrKTsKKworICAgIGlycV9udW0gPSBnSnBlZ2VuYy5pcnFfbnVtOworICAgIGh3X3N0YXR1cyA9IGdKcGVnZW5jLmVuY29kZV9od19zdGF0dXM7CisgICAgcHJvY2Vzc19pcnEgPSBnSnBlZ2VuYy5wcm9jZXNzX2lycTsKKyAgICBpbml0ZWQgPSBnSnBlZ2VuYy5pbml0ZWQ7CisgICAgb3BlbmVkID0gZ0pwZWdlbmMub3BlbmVkOworICAgIHVzZV9yZXNlcnZlID0gZ0pwZWdlbmMudXNlX3Jlc2VydmU7CisgICAgcmVzLmJ1Zl9zdGFydCA9IGdKcGVnZW5jLm1lbS5yZXNlcnZlX21lbS5idWZfc3RhcnQ7CisgICAgcmVzLmJ1Zl9zaXplID0gZ0pwZWdlbmMubWVtLnJlc2VydmVfbWVtLmJ1Zl9zaXplOworICAgIGJ1ZmZlcl9zdGFydCA9IGdKcGVnZW5jLm1lbS5idWZfc3RhcnQ7CisgICAgYnVmZmVyX3NpemUgPSBnSnBlZ2VuYy5tZW0uYnVmX3NpemU7CisgICAgbGV2ID0gZ0pwZWdlbmMubWVtLmN1cl9idWZfbGV2OworICAgIG1heF93ID0gZ0pwZWdlbmMubWVtLmJ1ZnNwZWMtPm1heF93aWR0aDsKKyAgICBtYXhfaCA9IGdKcGVnZW5jLm1lbS5idWZzcGVjLT5tYXhfaGVpZ2h0OworICAgIHdpZHRoID0gZ0pwZWdlbmMud3EuY21kLmVuY29kZXJfd2lkdGg7CisgICAgaGVpZ2h0ID0gZ0pwZWdlbmMud3EuY21kLmVuY29kZXJfaGVpZ2h0OworI2lmZGVmIENPTkZJR19DTUEKKyAgICBjbWFfc2l6ZSA9IGdKcGVnZW5jLm1lbS5jbWFfcG9vbF9zaXplIC8gU1pfMU07CisjZW5kaWYKKyAgICBzcGluX3VubG9jaygmZ0pwZWdlbmMuc2VtX2xvY2spOworCisgICAgamVuY19wcihMT0dfREVCVUcsCisgICAgICAgICJqcGVnZW5jIHdpZHRoOiAlZCwgZW5jb2RlIGhlaWdodDogJWQuXG4iLAorICAgICAgICB3aWR0aCwgaGVpZ2h0KTsKKyAgICBqZW5jX3ByKExPR19ERUJVRywKKyAgICAgICAgImpwZWdlbmMgaHdfc3RhdHVzOiAlZCwgcHJvY2Vzc19pcnE6ICVzLlxuIiwKKyAgICAgICAgaHdfc3RhdHVzLCBwcm9jZXNzX2lycSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgIGplbmNfcHIoTE9HX0RFQlVHLAorICAgICAgICAianBlZ2VuYyBpcnEgbnVtOiAlZCwgIGluaXRlZDogJXMsIG9wZW5lZDogJWRcbiIsCisgICAgICAgIGlycV9udW0sIGluaXRlZCA/ICJ0cnVlIiA6ICJmYWxzZSIsIG9wZW5lZCk7CisgICAgaWYgKHVzZV9yZXNlcnZlKSB7CisgICAgICAgIGplbmNfcHIoTE9HX0RFQlVHLAorICAgICAgICAgICAgImpwZWdlbmMgcmVzZXJ2ZSBtZW1vcnksIGJ1ZmZlciBzdGFydDogMHgleCwgc2l6ZTogJWQgTUIuXG4iLAorICAgICAgICAgICAgcmVzLmJ1Zl9zdGFydCwgcmVzLmJ1Zl9zaXplIC8gU1pfMU0pOworICAgIH0gZWxzZSB7CisjaWZkZWYgQ09ORklHX0NNQQorICAgICAgICBqZW5jX3ByKExPR19ERUJVRywgImpwZWdlbmMgY21hIHBvb2wgc2l6ZTogJWQuXG4iLCBjbWFfc2l6ZSk7CisjZW5kaWYKKyAgICB9CisgICAgamVuY19wcihMT0dfREVCVUcsICJqcGVnZW5jIGJ1ZmZlciBzdGFydDogMHgleCwgc2l6ZTogMHgleFxuIiwKKyAgICAgICAgYnVmZmVyX3N0YXJ0LCBidWZmZXJfc2l6ZSk7CisgICAgamVuY19wcihMT0dfREVCVUcsICJidWZmZXIgbGV2ZWw6ICVzXG4iLCBnbGV2ZWxfc3RyW2xldl0pOworICAgIHJldHVybiBzbnByaW50ZihidWYsIDQwLCAibWF4IHNpemU6ICVkeCVkXG4iLCBtYXhfdywgbWF4X2gpOworfQorCitzdGF0aWMgaW50IGVuY19kbWFfYnVmX21hcChzdHJ1Y3QgZW5jX2RtYV9jZmcgKmNmZykKK3sKKyAgICBsb25nIHJldCA9IC0xOworICAgIGludCBmZCA9IC0xOworICAgIHN0cnVjdCBkbWFfYnVmICpkYnVmID0gTlVMTDsKKyAgICBzdHJ1Y3QgZG1hX2J1Zl9hdHRhY2htZW50ICpkX2F0dCA9IE5VTEw7CisgICAgc3RydWN0IHNnX3RhYmxlICpzZyA9IE5VTEw7CisgICAgdm9pZCAqdmFkZHIgPSBOVUxMOworICAgIHN0cnVjdCBkZXZpY2UgKmRldiA9IE5VTEw7CisgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyOworCisgICAgaWYgKGNmZyA9PSBOVUxMIHx8IChjZmctPmZkIDwgMCkgfHwgY2ZnLT5kZXYgPT0gTlVMTCkgeworICAgICAgICBqZW5jX3ByKExPR19FUlJPUiwgImVycm9yIGlucHV0IHBhcmFtXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgamVuY19wcihMT0dfSU5GTywgImVuY19kbWFfYnVmX21hcCwgZmQgJWRcbiIsIGNmZy0+ZmQpOworCisgICAgZmQgPSBjZmctPmZkOworICAgIGRldiA9IGNmZy0+ZGV2OworICAgIGRpciA9IGNmZy0+ZGlyOworICAgIGplbmNfcHIoTE9HX0lORk8sICJlbmNfZG1hX2J1ZmZlcl9tYXAgZmQgJWRcbiIsIGZkKTsKKworICAgIGRidWYgPSBkbWFfYnVmX2dldChmZCk7CisKKyAgICBpZiAoZGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgIGplbmNfcHIoTE9HX0VSUk9SLCAiZmFpbGVkIHRvIGdldCBkbWEgYnVmZmVyLGZkICVkXG4iLGZkKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgZF9hdHQgPSBkbWFfYnVmX2F0dGFjaChkYnVmLCBkZXYpOworCisgICAgaWYgKGRfYXR0ID09IE5VTEwpIHsKKyAgICAgICAgamVuY19wcihMT0dfRVJST1IsICJmYWlsZWQgdG8gc2V0IGRtYSBhdHRhY2hcbiIpOworICAgICAgICBnb3RvIGF0dGFjaF9lcnI7CisgICAgfQorCisgICAgc2cgPSBkbWFfYnVmX21hcF9hdHRhY2htZW50KGRfYXR0LCBkaXIpOworCisgICAgaWYgKHNnID09IE5VTEwpIHsKKyAgICAgICAgamVuY19wcihMT0dfRVJST1IsICJmYWlsZWQgdG8gZ2V0IGRtYSBzZ1xuIik7CisgICAgICAgIGdvdG8gbWFwX2F0dGFjaF9lcnI7CisgICAgfQorCisgICAgcmV0ID0gZG1hX2J1Zl9iZWdpbl9jcHVfYWNjZXNzKGRidWYsIGRpcik7CisKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgamVuY19wcihMT0dfRVJST1IsICJmYWlsZWQgdG8gYWNjZXNzIGRtYSBidWZmXG4iKTsKKyAgICAgICAgZ290byBhY2Nlc3NfZXJyOworICAgIH0KKworICAgIHZhZGRyID0gZG1hX2J1Zl92bWFwKGRidWYpOworCisgICAgaWYgKHZhZGRyID09IE5VTEwpIHsKKyAgICAgICAgamVuY19wcihMT0dfRVJST1IsICJmYWlsZWQgdG8gdm1hcCBkbWEgYnVmXG4iKTsKKyAgICAgICAgZ290byB2bWFwX2VycjsKKyAgICB9CisKKyAgICBjZmctPmRidWYgPSBkYnVmOworICAgIGNmZy0+YXR0YWNoID0gZF9hdHQ7CisgICAgY2ZnLT52YWRkciA9IHZhZGRyOworICAgIGNmZy0+c2cgPSBzZzsKKyAgICBjZmctPnNpemUgPSBkYnVmLT5zaXplOworICAgIGplbmNfcHIoTE9HX0lORk8sICJkbWFidWYgc2l6ZSBpcyAlenVcbiIsIGNmZy0+c2l6ZSk7CisKKyAgICByZXR1cm4gcmV0OworCit2bWFwX2VycjoKKyAgICBkbWFfYnVmX2VuZF9jcHVfYWNjZXNzKGRidWYsIGRpcik7CisKK2FjY2Vzc19lcnI6CisgICAgZG1hX2J1Zl91bm1hcF9hdHRhY2htZW50KGRfYXR0LCBzZywgZGlyKTsKKworbWFwX2F0dGFjaF9lcnI6CisgICAgZG1hX2J1Zl9kZXRhY2goZGJ1ZiwgZF9hdHQpOworCithdHRhY2hfZXJyOgorICAgIGRtYV9idWZfcHV0KGRidWYpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBlbmNfZG1hX2J1Zl9nZXRfcGh5cyhzdHJ1Y3QgZW5jX2RtYV9jZmcgKmNmZywgdW5zaWduZWQgbG9uZyAqYWRkcikKK3sKKyAgICBzdHJ1Y3Qgc2dfdGFibGUgKnNnX3RhYmxlOworICAgIHN0cnVjdCBwYWdlICpwYWdlOworICAgIGludCByZXQ7CisgICAgamVuY19wcihMT0dfSU5GTywgImpwZWdlbmNfZG1hX2J1Zl9nZXRfcGh5cyBpblxuIik7CisKKyAgICByZXQgPSBlbmNfZG1hX2J1Zl9tYXAoY2ZnKTsKKworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGplbmNfcHIoTE9HX0VSUk9SLCAianBlZ2VuY19kbWFfYnVmX2dldF9waHlzIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKGNmZy0+c2cpIHsKKyAgICAgICAgc2dfdGFibGUgPSBjZmctPnNnOworICAgICAgICBwYWdlID0gc2dfcGFnZShzZ190YWJsZS0+c2dsKTsKKyAgICAgICAgKmFkZHIgPSBQRk5fUEhZUyhwYWdlX3RvX3BmbihwYWdlKSk7CisgICAgICAgIHJldCA9IDA7CisgICAgfQorCisgICAgamVuY19wcihMT0dfSU5GTywgImpwZWdlbmNfZG1hX2J1Zl9nZXRfcGh5cyAweCVseFxuIiwgKmFkZHIpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGVuY19kbWFfYnVmX3VubWFwKHN0cnVjdCBlbmNfZG1hX2NmZyAqY2ZnKQoreworICAgIGludCBmZCA9IC0xOworICAgIHN0cnVjdCBkbWFfYnVmICpkYnVmID0gTlVMTDsKKyAgICBzdHJ1Y3QgZG1hX2J1Zl9hdHRhY2htZW50ICpkX2F0dCA9IE5VTEw7CisgICAgc3RydWN0IHNnX3RhYmxlICpzZyA9IE5VTEw7CisgICAgdm9pZCAqdmFkZHIgPSBOVUxMOworICAgIHN0cnVjdCBkZXZpY2UgKmRldiA9IE5VTEw7CisgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyOworCisgICAgaWYgKGNmZyA9PSBOVUxMIHx8IChjZmctPmZkIDwgMCkgfHwgY2ZnLT5kZXYgPT0gTlVMTAorICAgICAgIHx8IGNmZy0+ZGJ1ZiA9PSBOVUxMIHx8IGNmZy0+dmFkZHIgPT0gTlVMTAorICAgICAgIHx8IGNmZy0+YXR0YWNoID09IE5VTEwgfHwgY2ZnLT5zZyA9PSBOVUxMKSB7CisgICAgICAgIGplbmNfcHIoTE9HX0VSUk9SLCAiRXJyb3IgaW5wdXQgcGFyYW1cbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZmQgPSBjZmctPmZkOworICAgIGRldiA9IGNmZy0+ZGV2OworICAgIGRpciA9IGNmZy0+ZGlyOworICAgIGRidWYgPSBjZmctPmRidWY7CisgICAgdmFkZHIgPSBjZmctPnZhZGRyOworICAgIGRfYXR0ID0gY2ZnLT5hdHRhY2g7CisgICAgc2cgPSBjZmctPnNnOworCisgICAgZG1hX2J1Zl92dW5tYXAoZGJ1ZiwgdmFkZHIpOworCisgICAgZG1hX2J1Zl9lbmRfY3B1X2FjY2VzcyhkYnVmLCBkaXIpOworCisgICAgZG1hX2J1Zl91bm1hcF9hdHRhY2htZW50KGRfYXR0LCBzZywgZGlyKTsKKworICAgIGRtYV9idWZfZGV0YWNoKGRidWYsIGRfYXR0KTsKKworICAgIGRtYV9idWZfcHV0KGRidWYpOworICAgIGplbmNfcHIoTE9HX0RFQlVHLCAiZW5jX2RtYV9idWZmZXJfdW5tYXAgdmFkZHIgJXBcbiIsKHVuc2lnbmVkICopdmFkZHIpOworfQorCitzdGF0aWMgc3NpemVfdCBwb3dlcl9jdHJsX3Nob3coc3RydWN0IGNsYXNzICpjbGEsIHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgeworICAgIHByX2VycigicG93ZXIgc3RhdHVzOiAlbHVcbiIsIHB3cl9jdHJsX3N0YXR1c19wc2NpX3NtYyhQRElEX1Q3X0RPU19IQ09ERUMpKTsKKyAgICBwcl9lcnIoImpwZWcgY2xrOiAlbGRcbiIsIGNsa19nZXRfcmF0ZShnX2pwZWdfZW5jX2Nsa3MuanBlZ19lbmNfY2xrKSk7CisgICAgcmV0dXJuIDE7Ly9zbnByaW50ZihidWYsIFBBR0VfU0laRSwgInBvd2VyIGNvbnRyb2wgc2hvdyBkb25lXG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgcG93ZXJfY3RybF9zdG9yZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsCisgICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSB7CisgICAgaWYgKHN0cm5jbXAoYnVmLCAicG93ZXJvbiIsIDcpID09IDApIHsKKyAgICAgICAgcHJfZXJyKCJub3cgcG93ZXJpbmcgb246XG4iKTsKKyAgICAgICAgLy9wd3JfY3RybF9wc2NpX3NtYyhQTV9IQ09ERUMsIHRydWUpOworICAgICAgICAvL2pwZWdlbmNfcG93ZXJvbl9leCg2KTsKKyAgICAgICAganBlZ2VuY19pbml0KCk7CisgICAgfSBlbHNlIGlmIChzdHJuY21wKGJ1ZiwgInBvd2Vyb2ZmIiwgOCkgPT0gMCkgeworICAgICAgICBwcl9lcnIoIm5vdyBwb3dlcmluZyBvZmY6XG4iKTsKKyAgICAgICAgLy9wd3JfY3RybF9wc2NpX3NtYyhQTV9IQ09ERUMsIGZhbHNlKTsKKyAgICAgICAganBlZ2VuY19wb3dlcm9mZl9leCgpOworICAgIH0gZWxzZSBpZiAoc3RybmNtcChidWYsICJtYm94MCIsIDUpID09IDApIHsKKyAgICAgICAgcHJfZXJyKCJ0cmlnZ2VyIG1ib3gwOlxuIik7CisKKyAgICAgICAgV1JJVEVfSFJFRyhIQ09ERUNfQVNTSVNUX01CT1gwX01BU0ssIDEpOyAgIC8vZW5hYmxlIGlycQorICAgICAgICBXUklURV9WUkVHKEhDT0RFQ19BU1NJU1RfTUJPWDBfSVJRX1JFRywgMHgxKTsgIC8vIHNldCBpcnEKKyAgICB9IGVsc2UgaWYgKHN0cm5jbXAoYnVmLCAibWJveDEiLCA1KSA9PSAwKSB7CisgICAgICAgIHByX2VycigidHJpZ2dlciBtYm94MTpcbiIpOworCisgICAgICAgIFdSSVRFX0hSRUcoSENPREVDX0FTU0lTVF9NQk9YMV9NQVNLLCAxKTsgICAvL2VuYWJsZSBpcnEKKyAgICAgICAgV1JJVEVfVlJFRyhIQ09ERUNfQVNTSVNUX01CT1gxX0lSUV9SRUcsIDB4MSk7ICAvLyBzZXQgaXJxCisgICAgfSBlbHNlIGlmIChzdHJuY21wKGJ1ZiwgIm1ib3gyIiwgNSkgPT0gMCkgeworICAgICAgICBwcl9lcnIoInRyaWdnZXIgbWJveDI6XG4iKTsKKworICAgICAgICBXUklURV9IUkVHKEhDT0RFQ19BU1NJU1RfTUJPWDJfTUFTSywgMSk7ICAgLy9lbmFibGUgaXJxCisgICAgICAgIFdSSVRFX1ZSRUcoSENPREVDX0FTU0lTVF9NQk9YMl9JUlFfUkVHLCAweDEpOyAgLy8gc2V0IGlycQorICAgIH0KKworICAgIHJldHVybiAxOy8vc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJwb2xpY3kgcmVhZCxqdXN0IGZvciB0ZXN0XG4iKTsKK30KKworc3RhdGljIENMQVNTX0FUVFJfUk8oZW5jb2RlX3N0YXR1cyk7CitzdGF0aWMgQ0xBU1NfQVRUUl9SVyhwb3dlcl9jdHJsKTsKKy8vc3RhdGljIENMQVNTX0FUVFIoY2xvY2tfY3RybCwgMDY2NCwgY2xvY2tfY3RybF9zaG93LCBjbG9ja19jdHJsX3N0b3JlKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmpwZWdlbmNfY2xhc3NfYXR0cnNbXSA9IHsKKyAgICAmY2xhc3NfYXR0cl9lbmNvZGVfc3RhdHVzLmF0dHIsCisgICAgJmNsYXNzX2F0dHJfcG93ZXJfY3RybC5hdHRyLAorICAgIC8vJmNsYXNzX2F0dHJfY2xvY2tfY3RybC5hdHRyLAorICAgIE5VTEwKK307CisKK0FUVFJJQlVURV9HUk9VUFMoanBlZ2VuY19jbGFzcyk7CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MganBlZ2VuY19jbGFzcyA9IHsKKyAgICAubmFtZSA9IENMQVNTX05BTUUsCisgICAgLmNsYXNzX2dyb3VwcyA9IGpwZWdlbmNfY2xhc3NfZ3JvdXBzLAorfTsKKworczMyIGluaXRfanBlZ2VuY19kZXZpY2Uodm9pZCkKK3sKKyAgICBzMzIgciA9IDA7CisgICAgciA9IHJlZ2lzdGVyX2NocmRldigwLCBERVZJQ0VfTkFNRSwgJmpwZWdlbmNfZm9wcyk7CisgICAgaWYgKHIgPD0gMCkgeworICAgICAgICBqZW5jX3ByKExPR19FUlJPUiwgInJlZ2lzdGVyIGpwZWdlbmMgZGV2aWNlIGVycm9yXG4iKTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorICAgIGpwZWdlbmNfZGV2aWNlX21ham9yID0gcjsKKworICAgIHIgPSBjbGFzc19yZWdpc3RlcigmanBlZ2VuY19jbGFzcyk7CisgICAgaWYgKHIgPCAwKSB7CisgICAgICAgIGplbmNfcHIoTE9HX0VSUk9SLCAiZXJyb3IgY3JlYXRlIGpwZWdlbmMgY2xhc3MuXG4iKTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAganBlZ2VuY19kZXYgPSBkZXZpY2VfY3JlYXRlKCZqcGVnZW5jX2NsYXNzLCBOVUxMLAorICAgICAgICBNS0RFVihqcGVnZW5jX2RldmljZV9tYWpvciwgMCksIE5VTEwsCisgICAgICAgIERFVklDRV9OQU1FKTsKKworICAgIGlmIChJU19FUlIoanBlZ2VuY19kZXYpKSB7CisgICAgICAgIGplbmNfcHIoTE9HX0VSUk9SLCAiY3JlYXRlIGpwZWdlbmMgZGV2aWNlIGVycm9yLlxuIik7CisgICAgICAgIGNsYXNzX3VucmVnaXN0ZXIoJmpwZWdlbmNfY2xhc3MpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiByOworfQorCitzMzIgdW5pbml0X2pwZWdlbmNfZGV2aWNlKHZvaWQpCit7CisgICAgaWYgKGpwZWdlbmNfZGV2KQorICAgICAgICBkZXZpY2VfZGVzdHJveSgmanBlZ2VuY19jbGFzcywgTUtERVYoanBlZ2VuY19kZXZpY2VfbWFqb3IsIDApKTsKKworICAgIGNsYXNzX2Rlc3Ryb3koJmpwZWdlbmNfY2xhc3MpOworCisgICAgdW5yZWdpc3Rlcl9jaHJkZXYoanBlZ2VuY19kZXZpY2VfbWFqb3IsIERFVklDRV9OQU1FKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHMzMiBqcGVnZW5jX21lbV9kZXZpY2VfaW5pdChzdHJ1Y3QgcmVzZXJ2ZWRfbWVtICpybWVtLAorICAgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisgICAgczMyIHIgPSAwOworICAgIHN0cnVjdCByZXNvdXJjZSByZXM7CisgICAgaWYgKCFybWVtKSB7CisgICAgICAgIGplbmNfcHIoTE9HX0VSUk9SLAorICAgICAgICAgICAgIkNhbid0IG9idGFpbiBJL08gbWVtb3J5LCB3aWxsIGFsbG9jYXRlIGpwZWdlbmMgYnVmZmVyIVxuIik7CisgICAgICAgIHIgPSAtRUZBVUxUOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisgICAgcmVzLnN0YXJ0ID0gKHBoeXNfYWRkcl90KSBybWVtLT5iYXNlOworICAgIHJlcy5lbmQgPSByZXMuc3RhcnQgKyAocGh5c19hZGRyX3QpIHJtZW0tPnNpemUgLSAxOworICAgIGdKcGVnZW5jLm1lbS5yZXNlcnZlX21lbS5idWZfc3RhcnQgPSByZXMuc3RhcnQ7CisgICAgZ0pwZWdlbmMubWVtLnJlc2VydmVfbWVtLmJ1Zl9zaXplID0gcmVzLmVuZCAtIHJlcy5zdGFydCArIDE7CisgICAgamVuY19wcihMT0dfREVCVUcsICJmb3VuZCByZXNlcnZlZCBtZW1vcnkgZGV2aWNlKHN0YXJ0OjB4JWxsdXgsIHNpemU6MHglbGx1eClcbiIsCisgICAgICAgIHJtZW0tPmJhc2UsIHJtZW0tPnNpemUpOworICAgIGlmIChnSnBlZ2VuYy5tZW0ucmVzZXJ2ZV9tZW0uYnVmX3NpemUgPj0KKyAgICAgICAganBlZ2VuY19idWZmc3BlY1tKUEVHRU5DX0JVRkZFUl9MRVZFTF9WR0FdLm1pbl9idWZmc2l6ZSkKKyAgICAgICAgZ0pwZWdlbmMudXNlX3Jlc2VydmUgPSB0cnVlOworICAgIGVsc2UgeworICAgICAgICBqZW5jX3ByKExPR19FUlJPUiwKKyAgICAgICAgICAgICJqcGVnZW5jIHJlc2VydmVfbWVtIHRvbyBzbWFsbCwgc2l6ZSBpcyAlZC5cbiIsCisgICAgICAgICAgICBnSnBlZ2VuYy5tZW0ucmVzZXJ2ZV9tZW0uYnVmX3NpemUpOworICAgICAgICBnSnBlZ2VuYy5tZW0ucmVzZXJ2ZV9tZW0uYnVmX3N0YXJ0ID0gMDsKKyAgICAgICAgZ0pwZWdlbmMubWVtLnJlc2VydmVfbWVtLmJ1Zl9zaXplID0gMDsKKyAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgfQorICAgIHJldHVybiByOworfQorCitzdGF0aWMgczMyIGpwZWdlbmNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKyAgICBzMzIgcmVzX2lycTsKKyAgICBzMzIgaWR4OworCisgICAgamVuY19wcihMT0dfREVCVUcsICJqcGVnZW5jIHByb2JlIHN0YXJ0LlxuIik7CisKKyAgICBnSnBlZ2VuYy50aGlzX3BkZXYgPSBwZGV2OworICAgIGdKcGVnZW5jLnVzZV9yZXNlcnZlID0gZmFsc2U7CisgICAgZ0pwZWdlbmMudXNlX2NtYSA9IGZhbHNlOworCisgICAganBlZ19pbl9mdWxsX2hjb2RlYyA9IDA7CisgICAgbWZkaW5fYW1idXNfY2Fudl9jb252ID0gMDsKKworICAgIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX1QzKSB7CisgICAgICAgIHByX2VycigianBlZ2VuY19wcm9iZToganBlZ19pbl9mdWxsX2hjb2RlY1xuIik7CisgICAgICAgIGpwZWdfaW5fZnVsbF9oY29kZWMgPSAxOworICAgICAgICBtZmRpbl9hbWJ1c19jYW52X2NvbnYgPSAxOworICAgIH0KKworICAgIG1lbXNldCgmZ0pwZWdlbmMubWVtLCAwLCBzaXplb2Yoc3RydWN0IGpwZWdlbmNfbWVtaW5mb19zKSk7CisKKyAgICBpZHggPSBvZl9yZXNlcnZlZF9tZW1fZGV2aWNlX2luaXQoJnBkZXYtPmRldik7CisgICAgaWYgKGlkeCAhPSAwKSB7CisgICAgICAgIGplbmNfcHIoTE9HX0RFQlVHLAorICAgICAgICAgICAgImpwZWdlbmMgbWVtb3J5IHJlc291cmNlIHVuZGVmaW5lZC4gZXJyPSVkXG4iLCBpZHgpOworICAgIH0KKworICAgIGlmIChnSnBlZ2VuYy51c2VfcmVzZXJ2ZSA9PSBmYWxzZSkgeworI2lmbmRlZiBDT05GSUdfQ01BCisgICAgICAgIGplbmNfcHIoTE9HX0VSUk9SLAorICAgICAgICAgICAgImpwZWdlbmMgbWVtb3J5IGlzIGludmFpbGQsIHByb2JlIGZhaWwhXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisjZWxzZQorICAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm1lbV9ub2RlOworICAgICAgICBzdHJ1Y3QgcmVzZXJ2ZWRfbWVtICpybWVtID0gTlVMTDsKKworICAgICAgICBtZW1fbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUocGRldi0+ZGV2Lm9mX25vZGUsICJtZW1vcnktcmVnaW9uIiwgMCk7CisgICAgICAgIGlmIChtZW1fbm9kZSkKKyAgICAgICAgICAgIHJtZW0gPSBvZl9yZXNlcnZlZF9tZW1fbG9va3VwKG1lbV9ub2RlKTsKKyAgICAgICAgb2Zfbm9kZV9wdXQobWVtX25vZGUpOworCisgICAgICAgIGlmIChybWVtKSB7CisgICAgICAgICAgICBqZW5jX3ByKExPR19ERUJVRywKKyAgICAgICAgICAgICAgICAianBlZ2VuYyAtIHJlc2VydmVkIGNtYSBub2RlIGZvdW5kOiAlcy5cbiIsIHJtZW0tPm5hbWUpOworICAgICAgICAgICAgZ0pwZWdlbmMubWVtLmNtYV9wb29sX3NpemUgPSBybWVtLT5zaXplOworICAgICAgICAgICAgZ0pwZWdlbmMudXNlX2NtYSA9IHRydWU7CisgICAgICAgICAgICBqZW5jX3ByKExPR19ERUJVRywKKyAgICAgICAgICAgICAgICAianBlZ2VuYyAtIGNvZGVjIG1tIHBvb2wgc2l6ZTogJWQgTUIuXG4iLCBjb2RlY19tbV9nZXRfZnJlZV9zaXplKCkgLyBTWl8xTSk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGplbmNfcHIoTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgICJqcGVnZW5jIC0gcmVzZXJ2ZWQgY21hIG5vZGUgbm90IGZvdW5kLCB1c2luZyBjb2RlYyBtbSBwb29sIHNpemUuXG4iKTsKKyAgICAgICAgICAgIGdKcGVnZW5jLm1lbS5jbWFfcG9vbF9zaXplID0gY29kZWNfbW1fZ2V0X2ZyZWVfc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgamVuY19wcihMT0dfREVCVUcsCisgICAgICAgICAgICAianBlZ2VuYyAtIGNtYSBtZW1vcnkgcG9vbCBzaXplOiAlZCBNQlxuIiwKKyAgICAgICAgICAgICh1MzIpZ0pwZWdlbmMubWVtLmNtYV9wb29sX3NpemUgLyBTWl8xTSk7CisgICAgICAgIGdKcGVnZW5jLm1lbS5idWZfc2l6ZSA9IGdKcGVnZW5jLm1lbS5jbWFfcG9vbF9zaXplOworI2VuZGlmCisgICAgfSBlbHNlIHsKKworICAgICAgICBqZW5jX3ByKExPR19ERUJVRywgInVzaW5nIHJlc2VydmVkIG1lbW9yeShzdGFydDoweCV4LCBzaXplOiVkIE1CKVxuIiwKKyAgICAgICAgICAgIGdKcGVnZW5jLm1lbS5yZXNlcnZlX21lbS5idWZfc3RhcnQsCisgICAgICAgICAgICAodTMyKWdKcGVnZW5jLm1lbS5yZXNlcnZlX21lbS5idWZfc2l6ZSAvIFNaXzFNKTsKKyAgICAgICAgZ0pwZWdlbmMubWVtLmJ1Zl9zdGFydCA9IGdKcGVnZW5jLm1lbS5yZXNlcnZlX21lbS5idWZfc3RhcnQ7CisgICAgICAgIGdKcGVnZW5jLm1lbS5idWZfc2l6ZSA9IGdKcGVnZW5jLm1lbS5yZXNlcnZlX21lbS5idWZfc2l6ZTsKKyAgICB9CisKKyAgICAvLyB3aGVuIHVzZV9jbWEgaXMgZmFsc2UsIGNob29zZSBKUEVHRU5DX0JVRkZFUl9MRVZFTF84TSBhcyBkZWZhdWx0CisgICAgaWYgKGdKcGVnZW5jLnVzZV9jbWEgPT0gZmFsc2UpIHsKKyAgICAgICAgamVuY19wcihMT0dfRVJST1IsICJzZXQgbWVtIHNwZWMgdG8gSlBFR0VOQ19CVUZGRVJfTEVWRUxfOE1cbiIpOworICAgICAgICBnSnBlZ2VuYy5tZW0uYnVmX3NpemUgPSBqcGVnZW5jX2J1ZmZzcGVjW0pQRUdFTkNfQlVGRkVSX0xFVkVMXzhNXS5taW5fYnVmZnNpemU7CisgICAgfQorCisgICAgaWYgKGdKcGVnZW5jLm1lbS5idWZfc2l6ZSA+PQorICAgICAgICBqcGVnZW5jX2J1ZmZzcGVjW0pQRUdFTkNfQlVGRkVSX0xFVkVMX0hEXS5taW5fYnVmZnNpemUpIHsKKyAgICAgICAgZ0pwZWdlbmMubWVtLmN1cl9idWZfbGV2ID0gSlBFR0VOQ19CVUZGRVJfTEVWRUxfSEQ7CisgICAgICAgIGdKcGVnZW5jLm1lbS5idWZzcGVjID0gKHN0cnVjdCBKcGVnZW5jX0J1ZmZJbmZvX3MgKikKKyAgICAgICAgICAgICZqcGVnZW5jX2J1ZmZzcGVjW0pQRUdFTkNfQlVGRkVSX0xFVkVMX0hEXTsKKyAgICB9IGVsc2UgaWYgKGdKcGVnZW5jLm1lbS5idWZfc2l6ZSA+PQorICAgICAgICBqcGVnZW5jX2J1ZmZzcGVjW0pQRUdFTkNfQlVGRkVSX0xFVkVMXzEzTV0ubWluX2J1ZmZzaXplKSB7CisgICAgICAgIGdKcGVnZW5jLm1lbS5jdXJfYnVmX2xldiA9IEpQRUdFTkNfQlVGRkVSX0xFVkVMXzEzTTsKKyAgICAgICAgZ0pwZWdlbmMubWVtLmJ1ZnNwZWMgPSAoc3RydWN0IEpwZWdlbmNfQnVmZkluZm9fcyAqKQorICAgICAgICAgICAgJmpwZWdlbmNfYnVmZnNwZWNbSlBFR0VOQ19CVUZGRVJfTEVWRUxfMTNNXTsKKyAgICB9IGVsc2UgaWYgKGdKcGVnZW5jLm1lbS5idWZfc2l6ZSA+PQorICAgICAgICBqcGVnZW5jX2J1ZmZzcGVjW0pQRUdFTkNfQlVGRkVSX0xFVkVMXzhNXS5taW5fYnVmZnNpemUpIHsKKyAgICAgICAgZ0pwZWdlbmMubWVtLmN1cl9idWZfbGV2ID0gSlBFR0VOQ19CVUZGRVJfTEVWRUxfOE07CisgICAgICAgIGdKcGVnZW5jLm1lbS5idWZzcGVjID0gKHN0cnVjdCBKcGVnZW5jX0J1ZmZJbmZvX3MgKikKKyAgICAgICAgICAgICZqcGVnZW5jX2J1ZmZzcGVjW0pQRUdFTkNfQlVGRkVSX0xFVkVMXzhNXTsKKyAgICB9IGVsc2UgaWYgKGdKcGVnZW5jLm1lbS5idWZfc2l6ZSA+PQorICAgICAgICBqcGVnZW5jX2J1ZmZzcGVjW0pQRUdFTkNfQlVGRkVSX0xFVkVMXzVNXS5taW5fYnVmZnNpemUpIHsKKyAgICAgICAgZ0pwZWdlbmMubWVtLmN1cl9idWZfbGV2ID0gSlBFR0VOQ19CVUZGRVJfTEVWRUxfNU07CisgICAgICAgIGdKcGVnZW5jLm1lbS5idWZzcGVjID0gKHN0cnVjdCBKcGVnZW5jX0J1ZmZJbmZvX3MgKikKKyAgICAgICAgICAgICZqcGVnZW5jX2J1ZmZzcGVjW0pQRUdFTkNfQlVGRkVSX0xFVkVMXzVNXTsKKyAgICB9IGVsc2UgaWYgKGdKcGVnZW5jLm1lbS5idWZfc2l6ZSA+PQorICAgICAgICBqcGVnZW5jX2J1ZmZzcGVjW0pQRUdFTkNfQlVGRkVSX0xFVkVMXzNNXS5taW5fYnVmZnNpemUpIHsKKyAgICAgICAgZ0pwZWdlbmMubWVtLmN1cl9idWZfbGV2ID0gSlBFR0VOQ19CVUZGRVJfTEVWRUxfM007CisgICAgICAgIGdKcGVnZW5jLm1lbS5idWZzcGVjID0gKHN0cnVjdCBKcGVnZW5jX0J1ZmZJbmZvX3MgKikKKyAgICAgICAgICAgICZqcGVnZW5jX2J1ZmZzcGVjW0pQRUdFTkNfQlVGRkVSX0xFVkVMXzNNXTsKKyAgICB9IGVsc2UgaWYgKGdKcGVnZW5jLm1lbS5idWZfc2l6ZSA+PQorICAgICAgICBqcGVnZW5jX2J1ZmZzcGVjW0pQRUdFTkNfQlVGRkVSX0xFVkVMXzJNXS5taW5fYnVmZnNpemUpIHsKKyAgICAgICAgZ0pwZWdlbmMubWVtLmN1cl9idWZfbGV2ID0gSlBFR0VOQ19CVUZGRVJfTEVWRUxfMk07CisgICAgICAgIGdKcGVnZW5jLm1lbS5idWZzcGVjID0gKHN0cnVjdCBKcGVnZW5jX0J1ZmZJbmZvX3MgKikKKyAgICAgICAgICAgICZqcGVnZW5jX2J1ZmZzcGVjW0pQRUdFTkNfQlVGRkVSX0xFVkVMXzJNXTsKKyAgICB9IGVsc2UgaWYgKGdKcGVnZW5jLm1lbS5idWZfc2l6ZSA+PQorICAgICAgICBqcGVnZW5jX2J1ZmZzcGVjW0pQRUdFTkNfQlVGRkVSX0xFVkVMX1ZHQV0ubWluX2J1ZmZzaXplKSB7CisgICAgICAgIGdKcGVnZW5jLm1lbS5jdXJfYnVmX2xldiA9IEpQRUdFTkNfQlVGRkVSX0xFVkVMX1ZHQTsKKyAgICAgICAgZ0pwZWdlbmMubWVtLmJ1ZnNwZWMgPSAoc3RydWN0IEpwZWdlbmNfQnVmZkluZm9fcyAqKQorICAgICAgICAgICAgJmpwZWdlbmNfYnVmZnNwZWNbSlBFR0VOQ19CVUZGRVJfTEVWRUxfVkdBXTsKKyAgICB9IGVsc2UgeworICAgICAgICBqZW5jX3ByKExPR19FUlJPUiwKKyAgICAgICAgICAgICJqcGVnZW5jIHByb2JlIG1lbW9yeSB0b28gc21hbGwsIHNpemUgaXMgJWQuXG4iLAorICAgICAgICAgICAgZ0pwZWdlbmMubWVtLmJ1Zl9zaXplKTsKKyAgICAgICAgZ0pwZWdlbmMubWVtLmJ1Zl9zdGFydCA9IDA7CisgICAgICAgIGdKcGVnZW5jLm1lbS5idWZfc2l6ZSA9IDA7CisgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgIH0KKyNpZiAxCisgICAgcmVzX2lycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisjZWxzZQorICAgIHN3aXRjaCAobWFudWFsX2lycV9udW0pIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgcmVzX2lycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJkb3NfbWJveF9zbG93X2lycTAiKTsKKyAgICAgICAgICAgIHByX2VycigiWyVzOiVkXSBnZXQgaXJxIGRvc19tYm94X3Nsb3dfaXJxMCwgcmVzX2lycT0lZFxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgcmVzX2lycSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcmVzX2lycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJkb3NfbWJveF9zbG93X2lycTEiKTsKKyAgICAgICAgICAgIHByX2VycigiWyVzOiVkXSBnZXQgaXJxIGRvc19tYm94X3Nsb3dfaXJxMSwgcmVzX2lycT0lZFxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgcmVzX2lycSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgcmVzX2lycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJkb3NfbWJveF9zbG93X2lycTIiKTsKKyAgICAgICAgICAgIHByX2VycigiWyVzOiVkXSBnZXQgaXJxIGRvc19tYm94X3Nsb3dfaXJxMiwgcmVzX2lycT0lZFxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgcmVzX2lycSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKworICAgICAgICAgICAgcmVzX2lycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJkb3NfbWJveF9zbG93X2lycTAiKTsKKyAgICAgICAgICAgIHByX2VycigiWyVzOiVkXSBnZXQgaXJxIGRvc19tYm94X3Nsb3dfaXJxMCwgcmVzX2lycT0lZFxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgcmVzX2lycSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChyZXNfaXJxIDwgMCkgeworICAgICAgICBqZW5jX3ByKExPR19FUlJPUiwgIlslc10gZ2V0IGlycSBlcnJvciEiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0gZWxzZQorICAgICAgICBqZW5jX3ByKExPR19FUlJPUiwgIlslc10gZ2V0IGlycSBzdWNjZXNzOiAlZCEsIG1hbnVhbF9pcnFfbnVtPSVkXG4iLCBfX2Z1bmNfXywgcmVzX2lycSwgbWFudWFsX2lycV9udW0pOworCisgICAgZ0pwZWdlbmMuaXJxX251bSA9IHJlc19pcnE7CisKKyAgICBqZW5jX3ByKExPR19ERUJVRywKKyAgICAgICAgImpwZWdlbmMgbWVtb3J5IGNvbmZpZyBzdWNlc3MsIGJ1ZmYgc2l6ZSBpcyAweCV4LCBsZXZlbDogJXNcbiIsCisgICAgICAgIGdKcGVnZW5jLm1lbS5idWZfc2l6ZSwKKyAgICAgICAgZ2xldmVsX3N0cltnSnBlZ2VuYy5tZW0uY3VyX2J1Zl9sZXZdKTsKKworICAgIGpwZWdlbmNfd3FfaW5pdCgpOworICAgIGluaXRfanBlZ2VuY19kZXZpY2UoKTsKKworICAgIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0MxKSB7CisgICAgICAgIGlmIChqcGVnX2VuY19jbGtfZ2V0KCZwZGV2LT5kZXYsICZnX2pwZWdfZW5jX2Nsa3MpICE9IDApIHsKKyAgICAgICAgICAgIHByX2VycigianBlZ19lbmNfY2xrX2dldCBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgamVuY19wcihMT0dfREVCVUcsICJqcGVnZW5jIHByb2JlIGVuZC5cbiIpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgczMyIGpwZWdlbmNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisgICAgaWYgKGpwZWdlbmNfd3FfdW5pbml0KCkpCisgICAgICAgIGplbmNfcHIoTE9HX0VSUk9SLCAianBlZ2VuY193cV91bmluaXQgZXJyb3IuXG4iKTsKKworICAgIG9mX3Jlc2VydmVkX21lbV9kZXZpY2VfcmVsZWFzZSgmcGRldi0+ZGV2KTsKKworICAgIGlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0MxKQorICAgICAgICBqcGVnX2VuY19jbGtfcHV0KCZwZGV2LT5kZXYsICZnX2pwZWdfZW5jX2Nsa3MpOworCisgICAgdW5pbml0X2pwZWdlbmNfZGV2aWNlKCk7CisgICAgamVuY19wcihMT0dfREVCVUcsICJqcGVnZW5jIHJlbW92ZS5cbiIpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhbWxvZ2ljX2pwZWdlbmNfZHRfbWF0Y2hbXSA9IHsKKyAgICB7CisgICAgICAgIC5jb21wYXRpYmxlID0gImFtbG9naWMsIGpwZWdlbmMiLAorICAgIH0sCisgICAge30sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBqcGVnZW5jX2RyaXZlciA9IHsKKyAgICAucHJvYmUgPSBqcGVnZW5jX3Byb2JlLAorICAgIC5yZW1vdmUgPSBqcGVnZW5jX3JlbW92ZSwKKyAgICAuZHJpdmVyID0geworICAgICAgICAubmFtZSA9IERSSVZFUl9OQU1FLAorICAgICAgICAub2ZfbWF0Y2hfdGFibGUgPSBhbWxvZ2ljX2pwZWdlbmNfZHRfbWF0Y2gsCisgICAgfQorfTsKKworI2lmIDAKK3N0YXRpYyBzdHJ1Y3QgY29kZWNfcHJvZmlsZV90IGpwZWdlbmNfcHJvZmlsZSA9IHsKKyAgICAubmFtZSA9ICJqcGVnZW5jIiwKKyAgICAucHJvZmlsZSA9ICIiCit9OworI2VuZGlmCisKK3N0YXRpYyBzMzIgX19pbml0IGpwZWdlbmNfZHJpdmVyX2luaXRfbW9kdWxlKHZvaWQpCit7CisgICAgamVuY19wcihMT0dfREVCVUcsICJqcGVnZW5jIG1vZHVsZSBpbml0XG4iKTsKKworICAgIGlmIChwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmpwZWdlbmNfZHJpdmVyKSkgeworICAgICAgICBqZW5jX3ByKExPR19FUlJPUiwgImZhaWxlZCB0byByZWdpc3RlciBqcGVnZW5jIGRyaXZlclxuIik7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKworI2lmIDAKKyAgICB2Y29kZWNfcHJvZmlsZV9yZWdpc3RlcigmanBlZ2VuY19wcm9maWxlKTsKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQganBlZ2VuY19kcml2ZXJfcmVtb3ZlX21vZHVsZSh2b2lkKQoreworICAgIGplbmNfcHIoTE9HX0RFQlVHLCAianBlZ2VuYyBtb2R1bGUgcmVtb3ZlLlxuIik7CisgICAgcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmpwZWdlbmNfZHJpdmVyKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCByZXNlcnZlZF9tZW1fb3BzIHJtZW1fanBlZ2VuY19vcHMgPSB7CisgICAgLmRldmljZV9pbml0ID0ganBlZ2VuY19tZW1fZGV2aWNlX2luaXQsCit9OworCitzdGF0aWMgczMyIF9faW5pdCBqcGVnZW5jX21lbV9zZXR1cChzdHJ1Y3QgcmVzZXJ2ZWRfbWVtICpybWVtKQoreworICAgIHJtZW0tPm9wcyA9ICZybWVtX2pwZWdlbmNfb3BzOworICAgIGplbmNfcHIoTE9HX0RFQlVHLCAianBlZ2VuYyByZXNlcnZlZCBtZW0gc2V0dXAuXG4iKTsKKyAgICByZXR1cm4gMDsKK30KKworbW9kdWxlX3BhcmFtKHNpbXVsYXRpb25fZW5hYmxlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Moc2ltdWxhdGlvbl9lbmFibGUsICJcbiBzaW11bGF0aW9uX2VuYWJsZVxuIik7CisKK21vZHVsZV9wYXJhbShnX2Jsb2NrX21vZGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhnX2Jsb2NrX21vZGUsICJcbiBnX2Jsb2NrX21vZGVcbiIpOworCittb2R1bGVfcGFyYW0oZ19jYW52MF9zdHJpZGUsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhnX2NhbnYwX3N0cmlkZSwgIlxuIGdfY2FudjBfc3RyaWRlXG4iKTsKKworbW9kdWxlX3BhcmFtKGdfY2FudjFfc3RyaWRlLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZ19jYW52MV9zdHJpZGUsICJcbiBnX2NhbnYxX3N0cmlkZVxuIik7CisKK21vZHVsZV9wYXJhbShnX2NhbnYyX3N0cmlkZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGdfY2FudjJfc3RyaWRlLCAiXG4gZ19jYW52Ml9zdHJpZGVcbiIpOworCittb2R1bGVfcGFyYW0oZ19jYW52YXNfaGVpZ2h0LCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZ19jYW52YXNfaGVpZ2h0LCAiXG4gZ19jYW52YXNfaGVpZ2h0XG4iKTsKKworbW9kdWxlX3BhcmFtKGNsb2NrX2xldmVsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoY2xvY2tfbGV2ZWwsICJcbiBjbG9ja19sZXZlbFxuIik7CisKK21vZHVsZV9wYXJhbShqcGVnZW5jX3ByaW50X2xldmVsLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoanBlZ2VuY19wcmludF9sZXZlbCwgIlxuIGpwZWdlbmNfcHJpbnRfbGV2ZWxcbiIpOworCittb2R1bGVfcGFyYW0ocmVnX29mZnNldCwgaW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocmVnX29mZnNldCwgIlxuIHJlZ19vZmZzZXRcbiIpOworCittb2R1bGVfcGFyYW0odXNlX2RtYV9pbywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHVzZV9kbWFfaW8sICJcbiB1c2UgZG1hIGlvIG9yIG5vdFxuIik7CisKK21vZHVsZV9wYXJhbSh1c2VfcXVhbGl0eSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHVzZV9xdWFsaXR5LCAiXG4gdXNlX3F1YWxpdHlcbiIpOworCittb2R1bGVfcGFyYW0obGVnYWN5X2xvYWQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhsZWdhY3lfbG9hZCwgIlxuIGxlZ2FjeV9sb2FkXG4iKTsKKworbW9kdWxlX3BhcmFtKGR1bXBtZW1fbGluZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGR1bXBtZW1fbGluZSwgIlxuIGR1bXBtZW1fbGluZVxuIik7CisKK21vZHVsZV9wYXJhbShwb2ludGVyLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MocG9pbnRlciwgIlxuIHBvaW50ZXJcbiIpOworCisvKiMjIyMjIyMjIyBERUJVRy1CUklOR1VQIyMjIyMjIyMjKi8KK21vZHVsZV9wYXJhbShtYW51YWxfY2xvY2ssIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhtYW51YWxfY2xvY2ssICJcbiBtYW51YWxfY2xvY2tcbiIpOworCittb2R1bGVfcGFyYW0obWFudWFsX2lycV9udW0sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhtYW51YWxfaXJxX251bSwgIlxuIG1hbnVhbF9pcnFfbnVtXG4iKTsKKworbW9kdWxlX3BhcmFtKG1hbnVhbF9pbnRlcnJ1cHQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhtYW51YWxfaW50ZXJydXB0LCAiXG4gbWFudWFsX2ludGVycnVwdFxuIik7CisvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KKworbW9kdWxlX2luaXQoanBlZ2VuY19kcml2ZXJfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoanBlZ2VuY19kcml2ZXJfcmVtb3ZlX21vZHVsZSk7CitSRVNFUlZFRE1FTV9PRl9ERUNMQVJFKGpwZWdlbmMsICJhbWxvZ2ljLCBqcGVnZW5jLW1lbW9yeSIsIGpwZWdlbmNfbWVtX3NldHVwKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTUxPR0lDIEpQRUcgRW5jb2RlciBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoInNpbW9uLnpoZW5nIDxzaW1vbi56aGVuZ0BhbWxvZ2ljLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfc2luay9lbmNvZGVyL2pwZWcvanBlZ2VuYy5oIGIvZHJpdmVycy9mcmFtZV9zaW5rL2VuY29kZXIvanBlZy9qcGVnZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhkY2Y4NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfc2luay9lbmNvZGVyL2pwZWcvanBlZ2VuYy5oCkBAIC0wLDAgKzEsMjY2IEBACisjaWZuZGVmIF9fSlBFR19FTkNfSF8KKyNkZWZpbmUgX19KUEVHX0VOQ19IXworCisjaW5jbHVkZSA8bGludXgvZG1hLWJ1Zi5oPgorI2RlZmluZSBKUEVHRU5DX0RFVklORk9fTTggIkFNTC1NOCIKKyNkZWZpbmUgSlBFR0VOQ19ERVZJTkZPX0c5ICJBTUwtRzkiCisjZGVmaW5lIEpQRUdFTkNfREVWSU5GT19HWEJCICJBTUwtR1hCQiIKKyNkZWZpbmUgSlBFR0VOQ19ERVZJTkZPX0dYVFZCQiAiQU1MLUdYVFZCQiIKKyNkZWZpbmUgSlBFR0VOQ19ERVZJTkZPX0dYTCAiQU1MLUdYTCIKKworLyogTTg6IDI1NTAvMTAgPSAyNTVNIEdYOiAyMDAwLzEwID0gMjAwTSAqLworI2RlZmluZSBKUEVHRU5DX0hERUNfTDAoKSAgIFdSSVRFX0hISV9SRUcoSEhJX1ZERUNfQ0xLX0NOVEwsIFwKKwkJCSAoMiA8PCAyNSkgfCAoMSA8PCAxNikgfCAoMSA8PCAyNCkgfCBcCisJCQkgKDB4ZmZmZiAmIFJFQURfSEhJX1JFRyhISElfVkRFQ19DTEtfQ05UTCkpKQorLyogTTg6IDI1NTAvOCA9IDMxOU0gR1g6IDIwMDAvOCA9IDI1ME0gKi8KKyNkZWZpbmUgSlBFR0VOQ19IREVDX0wxKCkgICBXUklURV9ISElfUkVHKEhISV9WREVDX0NMS19DTlRMLCBcCisJCQkgKDAgPDwgMjUpIHwgKDEgPDwgMTYpIHwgKDEgPDwgMjQpIHwgXAorCQkJICgweGZmZmYgJiBSRUFEX0hISV9SRUcoSEhJX1ZERUNfQ0xLX0NOVEwpKSkKKy8qIE04OiAyNTUwLzcgPSAzNjRNIEdYOiAyMDAwLzcgPSAyODVNICovCisjZGVmaW5lIEpQRUdFTkNfSERFQ19MMigpICAgV1JJVEVfSEhJX1JFRyhISElfVkRFQ19DTEtfQ05UTCwgXAorCQkJICgzIDw8IDI1KSB8ICgwIDw8IDE2KSB8ICgxIDw8IDI0KSB8IFwKKwkJCSAoMHhmZmZmICYgUkVBRF9ISElfUkVHKEhISV9WREVDX0NMS19DTlRMKSkpCisvKiBNODogMjU1MC82ID0gNDI1TSBHWDogMjAwMC82ID0gMzMzTSAqLworI2RlZmluZSBKUEVHRU5DX0hERUNfTDMoKSAgIFdSSVRFX0hISV9SRUcoSEhJX1ZERUNfQ0xLX0NOVEwsIFwKKwkJCSAoMSA8PCAyNSkgfCAoMSA8PCAxNikgfCAoMSA8PCAyNCkgfCBcCisJCQkgKDB4ZmZmZiAmIFJFQURfSEhJX1JFRyhISElfVkRFQ19DTEtfQ05UTCkpKQorLyogTTg6IDI1NTAvNSA9IDUxME0gR1g6IDIwMDAvNSA9IDQwME0gKi8KKyNkZWZpbmUgSlBFR0VOQ19IREVDX0w0KCkgICBXUklURV9ISElfUkVHKEhISV9WREVDX0NMS19DTlRMLCBcCisJCQkgKDIgPDwgMjUpIHwgKDAgPDwgMTYpIHwgKDEgPDwgMjQpIHwgXAorCQkJICgweGZmZmYgJiBSRUFEX0hISV9SRUcoSEhJX1ZERUNfQ0xLX0NOVEwpKSkKKy8qIE04OiAyNTUwLzQgPSA2MzhNIEdYOiAyMDAwLzQgPSA1MDBNICovCisjZGVmaW5lIEpQRUdFTkNfSERFQ19MNSgpICAgV1JJVEVfSEhJX1JFRyhISElfVkRFQ19DTEtfQ05UTCwgXAorCQkJICgwIDw8IDI1KSB8ICgwIDw8IDE2KSB8ICgxIDw8IDI0KSB8IFwKKwkJCSAoMHhmZmZmICYgUkVBRF9ISElfUkVHKEhISV9WREVDX0NMS19DTlRMKSkpCisvKiBNODogMjU1MC8zID0gODUwTSBHWDogMjAwMC8zID0gNjY3TSAqLworI2RlZmluZSBKUEVHRU5DX0hERUNfTDYoKSAgIFdSSVRFX0hISV9SRUcoSEhJX1ZERUNfQ0xLX0NOVEwsIFwKKwkJCSAoMSA8PCAyNSkgfCAoMCA8PCAxNikgfCAoMSA8PCAyNCkgfCBcCisJCQkgKDB4ZmZmZiAmIFJFQURfSEhJX1JFRyhISElfVkRFQ19DTEtfQ05UTCkpKQorCisjZGVmaW5lIGpwZWdlbmNfY2xvY2tfZW5hYmxlKGxldmVsKSBcCisJZG8geyBcCisJCWlmIChsZXZlbCA9PSAwKSAgXAorCQkJSlBFR0VOQ19IREVDX0wwKCk7IFwKKwkJZWxzZSBpZiAobGV2ZWwgPT0gMSkgIFwKKwkJCUpQRUdFTkNfSERFQ19MMSgpOyBcCisJCWVsc2UgaWYgKGxldmVsID09IDIpICBcCisJCQlKUEVHRU5DX0hERUNfTDIoKTsgXAorCQllbHNlIGlmIChsZXZlbCA9PSAzKSAgXAorCQkJSlBFR0VOQ19IREVDX0wzKCk7IFwKKwkJZWxzZSBpZiAobGV2ZWwgPT0gNCkgIFwKKwkJCUpQRUdFTkNfSERFQ19MNCgpOyBcCisJCWVsc2UgaWYgKGxldmVsID09IDUpICBcCisJCQlKUEVHRU5DX0hERUNfTDUoKTsgXAorCQllbHNlIGlmIChsZXZlbCA9PSA2KSAgXAorCQkJSlBFR0VOQ19IREVDX0w2KCk7IFwKKwkJV1JJVEVfVlJFR19CSVRTKERPU19HQ0xLX0VOMCwgMHg3ZmZmLCAxMiwgMTUpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBqcGVnZW5jX2Nsb2NrX2Rpc2FibGUoKSBcCisJZG8geyBcCisJCVdSSVRFX1ZSRUdfQklUUyhET1NfR0NMS19FTjAsIDAsIDEyLCAxNSk7IFwKKwkJV1JJVEVfSEhJX1JFR19CSVRTKEhISV9WREVDX0NMS19DTlRMLCAgMCwgMjQsIDEpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBKUEVHRU5DX0lPQ19NQUdJQyAgJ0onCisKKyNkZWZpbmUgSlBFR0VOQ19JT0NfR0VUX0RFVklORk8JX0lPVyhKUEVHRU5DX0lPQ19NQUdJQywgMHhmMCwgdTMyKQorCisjZGVmaW5lIEpQRUdFTkNfSU9DX0dFVF9CVUZGSU5GTwkgIAlfSU9XKEpQRUdFTkNfSU9DX01BR0lDLCAweDAwLCB1MzIpCisjZGVmaW5lIEpQRUdFTkNfSU9DX0NPTkZJR19JTklUCQkgIAlfSU9XKEpQRUdFTkNfSU9DX01BR0lDLCAweDAxLCB1MzIpCisjZGVmaW5lIEpQRUdFTkNfSU9DX05FV19DTUQJCQkgIAlfSU9XKEpQRUdFTkNfSU9DX01BR0lDLCAweDAyLCB1MzIpCisjZGVmaW5lIEpQRUdFTkNfSU9DX0dFVF9TVEFHRQkJICAJX0lPVyhKUEVHRU5DX0lPQ19NQUdJQywgMHgwMywgdTMyKQorI2RlZmluZSBKUEVHRU5DX0lPQ19HRVRfT1VUUFVUX1NJWkUJCV9JT1coSlBFR0VOQ19JT0NfTUFHSUMsIDB4MDQsIHUzMikKKyNkZWZpbmUgSlBFR0VOQ19JT0NfU0VUX0VYVF9RVUFOVF9UQUJMRQlfSU9XKEpQRUdFTkNfSU9DX01BR0lDLCAweDA1LCB1MzIpCisjZGVmaW5lIEpQRUdFTkNfSU9DX1FVRVJZX0RNQV9TVVBQT1JUCV9JT1coSlBFR0VOQ19JT0NfTUFHSUMsIDB4MDYsIHUzMikKKyNkZWZpbmUgSlBFR0VOQ19JT0NfQ09ORklHX0RNQV9JTlBVVAkJX0lPVyhKUEVHRU5DX0lPQ19NQUdJQywgMHgwNywgczMyKQorI2RlZmluZSBKUEVHRU5DX0lPQ19SRUxFQVNFX0RNQV9JTlBVVAkJX0lPVyhKUEVHRU5DX0lPQ19NQUdJQywgMHgwOCwgdTMyKQorCisjZGVmaW5lIERDVFNJWkUyCSAgICA2NAorCisjZGVmaW5lIEpQRUdFTkNfRkxVU0hfRkxBR19JTlBVVAkJCTB4MQorI2RlZmluZSBKUEVHRU5DX0ZMVVNIX0ZMQUdfT1VUUFVUCQkweDIKKworLyogRGVmaW5lIFF1YW50aXphdGlvbiB0YWJsZTogICBNYXggdHdvIHRhYmxlcyAqLworI2RlZmluZSBRVUFOVF9TRUxfQ09NUDAgICAgIDAKKyNkZWZpbmUgUVVBTlRfU0VMX0NPTVAxICAgICAxCisjZGVmaW5lIFFVQU5UX1NFTF9DT01QMiAgICAgMQorCisvKiBEZWZpbmUgSHVmZm1hbiB0YWJsZSBzZWxlY3Rpb246IE1heCB0d28gdGFibGVzIHBlciBEQy9BQyAqLworI2RlZmluZSBEQ19IVUZGX1NFTF9DT01QMCAgIDAKKyNkZWZpbmUgRENfSFVGRl9TRUxfQ09NUDEgICAxCisjZGVmaW5lIERDX0hVRkZfU0VMX0NPTVAyICAgMQorI2RlZmluZSBBQ19IVUZGX1NFTF9DT01QMCAgIDAKKyNkZWZpbmUgQUNfSFVGRl9TRUxfQ09NUDEgICAxCisjZGVmaW5lIEFDX0hVRkZfU0VMX0NPTVAyICAgMQorCisvKiBEQ1QgaW50ZXJydXB0IHNlbGVjdDowPURpc2FibGUgaW50cjsKKyAgICAxPUludHIgYXQgZW5kIG9mIGVhY2ggOHg4IGJsb2NrIG9mIERDVCBpbnB1dDsKKyAgICAyPUludHIgYXQgZW5kIG9mIGVhY2ggTUNVIG9mIERDVCBpbnB1dDsKKyAgICAzPUludHIgYXQgZW5kIG9mIGEgc2NhbiBvZiBEQ1QgaW5wdXQ7CisgICAgND1JbnRyIGF0IGVuZCBvZiBlYWNoIDh4OCBibG9jayBvZiBEQ1Qgb3V0cHV0OworICAgIDU9SW50ciBhdCBlbmQgb2YgZWFjaCBNQ1Ugb2YgRENUIG91dHB1dDsKKyAgICA2PUludHIgYXQgZW5kIG9mIGEgc2NhbiBvZiBEQ1Qgb3V0cHV0OyAqLworI2RlZmluZSBKRENUX0lOVFJfU0VMICAgICAgIDAKKworLyogMD1NYXJrIGxhc3QgY29lZmYgYXQgdGhlIGVuZCBvZiBhbiA4eDggYmxvY2ssCisgICAgMT1NYXJrIGxhc3QgY29lZmYgYXQgdGhlIGVuZCBvZiBhbiBNQ1UKKyAgICAyPU1hcmsgbGFzdCBjb2VmZiBhdCB0aGUgZW5kIG9mIGEgc2NhbiAqLworI2RlZmluZSBKRENUX0xBU1RDT0VGRl9TRUwgIDEKKworZW51bSBqcGVnZW5jX21lbV90eXBlX2UgeworCUpQRUdFTkNfTE9DQUxfQlVGRiA9IDAsCisJSlBFR0VOQ19DQU5WQVNfQlVGRiwKKwlKUEVHRU5DX1BIWVNJQ0FMX0JVRkYsCisJSlBFR0VOQ19ETUFfQlVGRiwKKwlKUEVHRU5DX01BWF9CVUZGX1RZUEUKK307CisKK2VudW0ganBlZ2VuY19mcmFtZV9mbXRfZSB7CisJSlBFR0VOQ19GTVRfWVVWNDIyX1NJTkdMRSA9IDAsCisJSlBFR0VOQ19GTVRfWVVWNDQ0X1NJTkdMRSwKKwlKUEVHRU5DX0ZNVF9OVjIxLAorCUpQRUdFTkNfRk1UX05WMTIsCisJSlBFR0VOQ19GTVRfWVVWNDIwLAorCUpQRUdFTkNfRk1UX1lVVjQ0NF9QTEFORSwKKwlKUEVHRU5DX0ZNVF9SR0I4ODgsCisJSlBFR0VOQ19GTVRfUkdCODg4X1BMQU5FLAorCUpQRUdFTkNfRk1UX1JHQjU2NSwKKwlKUEVHRU5DX0ZNVF9SR0JBODg4OCwKKwlKUEVHRU5DX0ZNVF9ZVVY0MjJfMTJCSVQsCisJSlBFR0VOQ19GTVRfWVVWNDQ0XzEwQklULAorCUpQRUdFTkNfRk1UX1lVVjQyMl8xMEJJVCwKKwlKUEVHRU5DX01BWF9GUkFNRV9GTVQKK307CisKK3N0cnVjdCBKcGVnZW5jX0J1ZmZfcyB7CisJdTMyIGJ1Zl9zdGFydDsKKwl1MzIgYnVmX3NpemU7Cit9OworCitzdHJ1Y3QgSnBlZ2VuY19CdWZmSW5mb19zIHsKKwl1MzIgbGV2X2lkOworCXUzMiBtYXhfd2lkdGg7CisJdTMyIG1heF9oZWlnaHQ7CisJdTMyIG1pbl9idWZmc2l6ZTsKKwlzdHJ1Y3QgSnBlZ2VuY19CdWZmX3MgaW5wdXQ7CisJc3RydWN0IEpwZWdlbmNfQnVmZl9zIGFzc2l0OworCXN0cnVjdCBKcGVnZW5jX0J1ZmZfcyBiaXRzdHJlYW07Cit9OworCitzdHJ1Y3QganBlZ2VuY19yZXF1ZXN0X3MgeworCXUzMiBzcmM7CisJdTMyIGVuY29kZXJfd2lkdGg7CisJdTMyIGVuY29kZXJfaGVpZ2h0OworCXUzMiBmcmFtZXNpemU7CisJdTMyIGpwZWdfcXVhbGl0eTsKKwl1MzIgUXVhbnRUYWJsZV9pZDsKKwl1MzIgZmx1c2hfZmxhZzsKKwl1MzIgYmxvY2tfbW9kZTsKKwllbnVtIGpwZWdlbmNfbWVtX3R5cGVfZSB0eXBlOworCWVudW0ganBlZ2VuY19mcmFtZV9mbXRfZSBpbnB1dF9mbXQ7CisJZW51bSBqcGVnZW5jX2ZyYW1lX2ZtdF9lIG91dHB1dF9mbXQ7CisKKwl1MzIgeV9vZmY7CisJdTMyIHVfb2ZmOworCXUzMiB2X29mZjsKKworCXUzMiB5X3N0cmlkZTsKKwl1MzIgdV9zdHJpZGU7CisJdTMyIHZfc3RyaWRlOworCisJdTMyIGhfc3RyaWRlOworfTsKKworc3RydWN0IGpwZWdlbmNfbWVtaW5mb19zIHsKKwl1MzIgYnVmX3N0YXJ0OworCXUzMiBidWZfc2l6ZTsKKwl1OCBjdXJfYnVmX2xldjsKKworI2lmZGVmIENPTkZJR19DTUEKKwl1bG9uZyBjbWFfcG9vbF9zaXplOworI2VuZGlmCisKKwlzdHJ1Y3QgSnBlZ2VuY19CdWZmX3MgcmVzZXJ2ZV9tZW07CisJc3RydWN0IEpwZWdlbmNfQnVmZkluZm9fcyAqYnVmc3BlYzsKK307CisKK3N0cnVjdCBqcGVnZW5jX3dxX3MgeworCXUzMiBod19zdGF0dXM7CisJdTMyIGhlYWRieXRlczsKKwl1MzIgb3V0cHV0X3NpemU7CisKKwl1MzIgYnVmX3N0YXJ0OworCXUzMiBidWZfc2l6ZTsKKworCXUzMiBJbnB1dEJ1ZmZTdGFydDsKKwl1MzIgSW5wdXRCdWZmRW5kOworCisJdTMyIEFzc2l0U3RhcnQ7CisJdTMyIEFzc2l0RW5kOworCisJdTMyIEJpdHN0cmVhbVN0YXJ0OworCXUzMiBCaXRzdHJlYW1FbmQ7CisJdm9pZCBfX2lvbWVtICpBc3NpdHN0cmVhbVN0YXJ0VmlydEFkZHI7CisKKwl1MzIgbWF4X3dpZHRoOworCXUzMiBtYXhfaGVpZ2h0OworCisJc3RydWN0IGpwZWdlbmNfcmVxdWVzdF9zIGNtZDsKKwlhdG9taWNfdCByZWFkeTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBjb21wbGV0ZTsKKyNpZmRlZiBDT05GSUdfQ01BCisJc3RydWN0IHBhZ2UgKnZlbmNfcGFnZXM7CisjZW5kaWYKKwlzdHJ1Y3QgZW5jX2RtYV9jZmcgKmRtYV9pbnB1dDsKK307CisKK3N0cnVjdCBqcGVnZW5jX21hbmFnZXJfcyB7CisJdTMyIGVuY29kZV9od19zdGF0dXM7CisJczMyIGlycV9udW07CisKKwlib29sIGlycV9yZXF1ZXN0ZWQ7CisJYm9vbCBwcm9jZXNzX2lycTsKKwlib29sIGluaXRlZDsKKwlib29sIHVzZV9yZXNlcnZlOworCWJvb2wgdXNlX2NtYTsKKworCXU4IG9wZW5lZDsKKworCXNwaW5sb2NrX3Qgc2VtX2xvY2s7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqdGhpc19wZGV2OworCXN0cnVjdCBqcGVnZW5jX21lbWluZm9fcyBtZW07CisJc3RydWN0IGpwZWdlbmNfd3FfcyB3cTsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdGFza2xldDsKK307CisKK3N0cnVjdCBlbmNfZG1hX2NmZyB7CisJaW50IGZkOworCXNpemVfdCBzaXplOworCXZvaWQgKmRldjsKKwl2b2lkICp2YWRkcjsKKwl2b2lkICpwYWRkcjsKKwlzdHJ1Y3QgZG1hX2J1ZiAqZGJ1ZjsKKwlzdHJ1Y3QgZG1hX2J1Zl9hdHRhY2htZW50ICphdHRhY2g7CisJc3RydWN0IHNnX3RhYmxlICpzZzsKKwllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXI7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBBViBTY3JhdGNoIFJlZ2lzdGVyIFJlLURlZmluZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEpQRUdFTkNfRU5DT0RFUl9TVEFUVVMJCUhDT0RFQ19IRU5DX1NDUkFUQ0hfMAorI2RlZmluZSBKUEVHRU5DX0JJVFNUUkVBTV9PRkZTRVQJSENPREVDX0hFTkNfU0NSQVRDSF8xCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEVOQ09ERVJfU1RBVFVTIGRlZmluZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEpQRUdFTkNfRU5DT0RFUl9JRExFCQkwCisjZGVmaW5lIEpQRUdFTkNfRU5DT0RFUl9TVEFSVAkJMQorLyogI2RlZmluZSBKUEVHRU5DX0VOQ09ERVJfU09TX0hFQURFUiAgICAgICAgICAyICovCisjZGVmaW5lIEpQRUdFTkNfRU5DT0RFUl9NQ1UJCTMKKyNkZWZpbmUgSlBFR0VOQ19FTkNPREVSX0RPTkUJCTQKKworZXh0ZXJuIGJvb2wganBlZ2VuY19vbih2b2lkKTsKKyNkZWZpbmUgSlBFR0VOQ19JT0NfTkVXX0NNRDIJCQkgIAlfSU9XKEpQRUdFTkNfSU9DX01BR0lDLCAweDA5LCBzdHJ1Y3QganBlZ2VuY19yZXF1ZXN0X3MpCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfc2luay9lbmNvZGVyL211bHRpL01ha2VmaWxlIGIvZHJpdmVycy9mcmFtZV9zaW5rL2VuY29kZXIvbXVsdGkvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzExZmZlNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfc2luay9lbmNvZGVyL211bHRpL01ha2VmaWxlCkBAIC0wLDAgKzEsMiBAQAorb2JqLSQoQ09ORklHX0FNTE9HSUNfTUVESUFfVkVOQ19NVUxUSSkJKz0gYW12ZW5jX211bHRpLm8KK2FtdmVuY19tdWx0aS1vYmpzICs9IHZwdV9tdWx0aS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lX3NpbmsvZW5jb2Rlci9tdWx0aS92bW1fbXVsdGkuaCBiL2RyaXZlcnMvZnJhbWVfc2luay9lbmNvZGVyL211bHRpL3ZtbV9tdWx0aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNWNiYWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lX3NpbmsvZW5jb2Rlci9tdWx0aS92bW1fbXVsdGkuaApAQCAtMCwwICsxLDY2MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgYnkgQW1sb2dpYywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX19DTk1fVklERU9fTUVNT1JZX01BTkFHRU1FTlRfSF9fCisjZGVmaW5lIF9fQ05NX1ZJREVPX01FTU9SWV9NQU5BR0VNRU5UX0hfXworCisjZGVmaW5lIFZNRU1fUEFHRV9TSVpFICgxNiAqIDEwMjQpCisjZGVmaW5lIE1BS0VfS0VZKF9hLCBfYikgKCgodm1lbV9rZXlfdClfYSkgPDwgMzIgfCBfYikKKyNkZWZpbmUgS0VZX1RPX1ZBTFVFKF9rZXkpIChfa2V5ID4+IDMyKQorCisjZGVmaW5lIFZNRU1fUF9BTExPQyhfeCkgdm1hbGxvYyhfeCkKKyNkZWZpbmUgVk1FTV9QX0ZSRUUoX3gpIHZmcmVlKF94KQorCisjZGVmaW5lIFZNRU1fQVNTRVJUIFwKKwlwcl9pbmZvKCJWTUVNX0FTU0VSVCBhdCAlczolZFxuIiwgX19GSUxFX18sIF9fTElORV9fKQorCisKKyNkZWZpbmUgVk1FTV9IRUlHSFQoX3RyZWUpIChfdHJlZSA9PSBOVUxMID8gLTEgOiBfdHJlZS0+aGVpZ2h0KQorCisjZGVmaW5lIE1BWChfYSwgX2IpIChfYSA+PSBfYiA/IF9hIDogX2IpCisKK3N0cnVjdCBhdmxfbm9kZV90OworI2RlZmluZSB2bWVtX2tleV90IHVuc2lnbmVkIGxvbmcgbG9uZworCitzdHJ1Y3Qgdm1lbV9pbmZvX3QgeworCXVsb25nIHRvdGFsX3BhZ2VzOworCXVsb25nIGFsbG9jX3BhZ2VzOworCXVsb25nIGZyZWVfcGFnZXM7CisJdWxvbmcgcGFnZV9zaXplOworfTsKKworc3RydWN0IHBhZ2VfdCB7CisJczMyIHBhZ2VubzsKKwl1bG9uZyBhZGRyOworCXMzMiB1c2VkOworCXMzMiBhbGxvY19wYWdlczsKKwlzMzIgZmlyc3RfcGFnZW5vOworfTsKKworc3RydWN0IGF2bF9ub2RlX3QgeworCXZtZW1fa2V5X3Qga2V5OworCXMzMiBoZWlnaHQ7CisJc3RydWN0IHBhZ2VfdCAqcGFnZTsKKwlzdHJ1Y3QgYXZsX25vZGVfdCAqbGVmdDsKKwlzdHJ1Y3QgYXZsX25vZGVfdCAqcmlnaHQ7Cit9OworCitzdHJ1Y3QgdmlkZW9fbW1fdCB7CisJc3RydWN0IGF2bF9ub2RlX3QgKmZyZWVfdHJlZTsKKwlzdHJ1Y3QgYXZsX25vZGVfdCAqYWxsb2NfdHJlZTsKKwlzdHJ1Y3QgcGFnZV90ICpwYWdlX2xpc3Q7CisJczMyIG51bV9wYWdlczsKKwl1bG9uZyBiYXNlX2FkZHI7CisJdWxvbmcgbWVtX3NpemU7CisJczMyIGZyZWVfcGFnZV9jb3VudDsKKwlzMzIgYWxsb2NfcGFnZV9jb3VudDsKK307CisKK2VudW0gcm90YXRpb25fZGlyX3QgeworCUxFRlQsCisJUklHSFQKK307CisKK3N0cnVjdCBhdmxfbm9kZV9kYXRhX3QgeworCXMzMiBrZXk7CisJc3RydWN0IHBhZ2VfdCAqcGFnZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXZsX25vZGVfdCAqbWFrZV9hdmxfbm9kZSgKKwl2bWVtX2tleV90IGtleSwKKwlzdHJ1Y3QgcGFnZV90ICpwYWdlKQoreworCXN0cnVjdCBhdmxfbm9kZV90ICpub2RlID0KKwkJKHN0cnVjdCBhdmxfbm9kZV90ICopVk1FTV9QX0FMTE9DKHNpemVvZihzdHJ1Y3QgYXZsX25vZGVfdCkpOworCW5vZGUtPmtleSA9IGtleTsKKwlub2RlLT5wYWdlID0gcGFnZTsKKwlub2RlLT5oZWlnaHQgPSAwOworCW5vZGUtPmxlZnQgPSBOVUxMOworCW5vZGUtPnJpZ2h0ID0gTlVMTDsKKwlyZXR1cm4gbm9kZTsKK30KKworc3RhdGljIHMzMiBnZXRfYmFsYW5jZV9mYWN0b3Ioc3RydWN0IGF2bF9ub2RlX3QgKnRyZWUpCit7CisJczMyIGZhY3RvciA9IDA7CisKKwlpZiAodHJlZSkKKwkJZmFjdG9yID0gVk1FTV9IRUlHSFQodHJlZS0+cmlnaHQpIC0gVk1FTV9IRUlHSFQodHJlZS0+bGVmdCk7CisJcmV0dXJuIGZhY3RvcjsKK30KKworLyoKKyAqIExlZnQgUm90YXRpb24KKyAqCisgKgkgIEEJCQkJCSAgQgorICoJICAgXAkJCQkJLyBcCisgKgkJQgkJID0+CSAgIEEgICBDCisgKgkgICAvICBcCQkJCSBcCisgKgkgIEQJQwkJCQkgRAorICoKKyAqLworc3RhdGljIHN0cnVjdCBhdmxfbm9kZV90ICpyb3RhdGlvbl9sZWZ0KHN0cnVjdCBhdmxfbm9kZV90ICp0cmVlKQoreworCXN0cnVjdCBhdmxfbm9kZV90ICpyY2hpbGQ7CisJc3RydWN0IGF2bF9ub2RlX3QgKmxjaGlsZDsKKworCWlmICh0cmVlID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJcmNoaWxkID0gdHJlZS0+cmlnaHQ7CisJaWYgKHJjaGlsZCA9PSBOVUxMKQorCQlyZXR1cm4gdHJlZTsKKworCWxjaGlsZCA9IHJjaGlsZC0+bGVmdDsKKwlyY2hpbGQtPmxlZnQgPSB0cmVlOworCXRyZWUtPnJpZ2h0ID0gbGNoaWxkOworCisJdHJlZS0+aGVpZ2h0ID0KKwkJTUFYKFZNRU1fSEVJR0hUKHRyZWUtPmxlZnQpLCBWTUVNX0hFSUdIVCh0cmVlLT5yaWdodCkpICsgMTsKKwlyY2hpbGQtPmhlaWdodCA9CisJCU1BWChWTUVNX0hFSUdIVChyY2hpbGQtPmxlZnQpLCBWTUVNX0hFSUdIVChyY2hpbGQtPnJpZ2h0KSkgKyAxOworCXJldHVybiByY2hpbGQ7Cit9CisKKworLyoKKyAqIFJlZnQgUm90YXRpb24KKyAqCisgKgkJIEEJCQkJICBCCisgKgkgICBcCQkJCSAgLyAgXAorICoJICBCCQkgPT4JICAgRAlBCisgKgkvICBcCQkJCQkgLworICogICBECUMJCQkJICAgQworICoKKyAqLworc3RhdGljIHN0cnVjdCBhdmxfbm9kZV90ICpyb3RhdGlvbl9yaWdodChzdHJ1Y3QgYXZsX25vZGVfdCAqdHJlZSkKK3sKKwlzdHJ1Y3QgYXZsX25vZGVfdCAqcmNoaWxkOworCXN0cnVjdCBhdmxfbm9kZV90ICpsY2hpbGQ7CisKKwlpZiAodHJlZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWxjaGlsZCA9IHRyZWUtPmxlZnQ7CisJaWYgKGxjaGlsZCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXJjaGlsZCA9IGxjaGlsZC0+cmlnaHQ7CisJbGNoaWxkLT5yaWdodCA9IHRyZWU7CisJdHJlZS0+bGVmdCA9IHJjaGlsZDsKKworCXRyZWUtPmhlaWdodCA9CisJCU1BWChWTUVNX0hFSUdIVCh0cmVlLT5sZWZ0KSwKKwkJVk1FTV9IRUlHSFQodHJlZS0+cmlnaHQpKSArIDE7CisJbGNoaWxkLT5oZWlnaHQgPQorCQlNQVgoVk1FTV9IRUlHSFQobGNoaWxkLT5sZWZ0KSwKKwkJVk1FTV9IRUlHSFQobGNoaWxkLT5yaWdodCkpICsgMTsKKwlyZXR1cm4gbGNoaWxkOworfQorCitzdGF0aWMgc3RydWN0IGF2bF9ub2RlX3QgKmRvX2JhbGFuY2Uoc3RydWN0IGF2bF9ub2RlX3QgKnRyZWUpCit7CisJczMyIGJmYWN0b3IgPSAwLCBjaGlsZF9iZmFjdG9yOworCisJYmZhY3RvciA9IGdldF9iYWxhbmNlX2ZhY3Rvcih0cmVlKTsKKwlpZiAoYmZhY3RvciA+PSAyKSB7CisJCWNoaWxkX2JmYWN0b3IgPSBnZXRfYmFsYW5jZV9mYWN0b3IodHJlZS0+cmlnaHQpOworCQlpZiAoY2hpbGRfYmZhY3RvciA9PSAxIHx8IGNoaWxkX2JmYWN0b3IgPT0gMCkgeworCQkJdHJlZSA9IHJvdGF0aW9uX2xlZnQodHJlZSk7CisJCX0gZWxzZSBpZiAoY2hpbGRfYmZhY3RvciA9PSAtMSkgeworCQkJdHJlZS0+cmlnaHQgPSByb3RhdGlvbl9yaWdodCh0cmVlLT5yaWdodCk7CisJCQl0cmVlCSA9IHJvdGF0aW9uX2xlZnQodHJlZSk7CisJCX0gZWxzZSB7CisJCQlwcl9pbmZvKAorCQkJCSJpbnZhbGlkIGJhbGFuY2luZyBmYWN0b3I6ICVkXG4iLAorCQkJCWNoaWxkX2JmYWN0b3IpOworCQkJVk1FTV9BU1NFUlQ7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0gZWxzZSBpZiAoYmZhY3RvciA8PSAtMikgeworCQljaGlsZF9iZmFjdG9yID0gZ2V0X2JhbGFuY2VfZmFjdG9yKHRyZWUtPmxlZnQpOworCQlpZiAoY2hpbGRfYmZhY3RvciA9PSAtMSB8fCBjaGlsZF9iZmFjdG9yID09IDApIHsKKwkJCXRyZWUgPSByb3RhdGlvbl9yaWdodCh0cmVlKTsKKwkJfSBlbHNlIGlmIChjaGlsZF9iZmFjdG9yID09IDEpIHsKKwkJCXRyZWUtPmxlZnQgPSByb3RhdGlvbl9sZWZ0KHRyZWUtPmxlZnQpOworCQkJdHJlZQkgPSByb3RhdGlvbl9yaWdodCh0cmVlKTsKKwkJfSBlbHNlIHsKKwkJCXByX2luZm8oCisJCQkJImludmFsaWQgYmFsYW5jaW5nIGZhY3RvcjogJWRcbiIsCisJCQkJY2hpbGRfYmZhY3Rvcik7CisJCQlWTUVNX0FTU0VSVDsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCXJldHVybiB0cmVlOworfQorCitzdGF0aWMgc3RydWN0IGF2bF9ub2RlX3QgKnVubGlua19lbmRfbm9kZSgKKwlzdHJ1Y3QgYXZsX25vZGVfdCAqdHJlZSwKKwlzMzIgZGlyLAorCXN0cnVjdCBhdmxfbm9kZV90ICoqZm91bmRfbm9kZSkKK3sKKwlzdHJ1Y3QgYXZsX25vZGVfdCAqbm9kZTsKKwkqZm91bmRfbm9kZSA9IE5VTEw7CisKKwlpZiAodHJlZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChkaXIgPT0gTEVGVCkgeworCQlpZiAodHJlZS0+bGVmdCA9PSBOVUxMKSB7CisJCQkqZm91bmRfbm9kZSA9IHRyZWU7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCWlmICh0cmVlLT5yaWdodCA9PSBOVUxMKSB7CisJCQkqZm91bmRfbm9kZSA9IHRyZWU7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCWlmIChkaXIgPT0gTEVGVCkgeworCQlub2RlID0gdHJlZS0+bGVmdDsKKwkJdHJlZS0+bGVmdCA9IHVubGlua19lbmRfbm9kZSh0cmVlLT5sZWZ0LCBMRUZULCBmb3VuZF9ub2RlKTsKKwkJaWYgKHRyZWUtPmxlZnQgPT0gTlVMTCkgeworCQkJdHJlZS0+bGVmdCA9ICgqZm91bmRfbm9kZSktPnJpZ2h0OworCQkJKCpmb3VuZF9ub2RlKS0+bGVmdCA9IE5VTEw7CisJCQkoKmZvdW5kX25vZGUpLT5yaWdodCA9IE5VTEw7CisJCX0KKwl9IGVsc2UgeworCQlub2RlID0gdHJlZS0+cmlnaHQ7CisJCXRyZWUtPnJpZ2h0ID0gdW5saW5rX2VuZF9ub2RlKHRyZWUtPnJpZ2h0LCBSSUdIVCwgZm91bmRfbm9kZSk7CisJCWlmICh0cmVlLT5yaWdodCA9PSBOVUxMKSB7CisJCQl0cmVlLT5yaWdodCA9ICgqZm91bmRfbm9kZSktPmxlZnQ7CisJCQkoKmZvdW5kX25vZGUpLT5sZWZ0ID0gTlVMTDsKKwkJCSgqZm91bmRfbm9kZSktPnJpZ2h0ID0gTlVMTDsKKwkJfQorCX0KKwl0cmVlLT5oZWlnaHQgPQorCQlNQVgoVk1FTV9IRUlHSFQodHJlZS0+bGVmdCksIFZNRU1fSEVJR0hUKHRyZWUtPnJpZ2h0KSkgKyAxOworCXJldHVybiBkb19iYWxhbmNlKHRyZWUpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgYXZsX25vZGVfdCAqYXZsdHJlZV9pbnNlcnQoCisJc3RydWN0IGF2bF9ub2RlX3QgKnRyZWUsCisJdm1lbV9rZXlfdCBrZXksCisJc3RydWN0IHBhZ2VfdCAqcGFnZSkKK3sKKwlpZiAodHJlZSA9PSBOVUxMKSB7CisJCXRyZWUgPSBtYWtlX2F2bF9ub2RlKGtleSwgcGFnZSk7CisJfSBlbHNlIHsKKwkJaWYgKGtleSA+PSB0cmVlLT5rZXkpCisJCQl0cmVlLT5yaWdodCA9CisJCQkJYXZsdHJlZV9pbnNlcnQodHJlZS0+cmlnaHQsIGtleSwgcGFnZSk7CisJCWVsc2UKKwkJCXRyZWUtPmxlZnQgPQorCQkJCWF2bHRyZWVfaW5zZXJ0KHRyZWUtPmxlZnQsIGtleSwgcGFnZSk7CisJfQorCXRyZWUgPSBkb19iYWxhbmNlKHRyZWUpOworCXRyZWUtPmhlaWdodCA9CisJCU1BWChWTUVNX0hFSUdIVCh0cmVlLT5sZWZ0KSwgVk1FTV9IRUlHSFQodHJlZS0+cmlnaHQpKSArIDE7CisJcmV0dXJuIHRyZWU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXZsX25vZGVfdCAqZG9fdW5saW5rKHN0cnVjdCBhdmxfbm9kZV90ICp0cmVlKQoreworCXN0cnVjdCBhdmxfbm9kZV90ICpub2RlOworCXN0cnVjdCBhdmxfbm9kZV90ICplbmRfbm9kZTsKKworCW5vZGUgPSB1bmxpbmtfZW5kX25vZGUodHJlZS0+cmlnaHQsIExFRlQsICZlbmRfbm9kZSk7CisJaWYgKG5vZGUpIHsKKwkJdHJlZS0+cmlnaHQgPSBub2RlOworCX0gZWxzZSB7CisJCW5vZGUgPQorCQkJdW5saW5rX2VuZF9ub2RlKHRyZWUtPmxlZnQsIFJJR0hULCAmZW5kX25vZGUpOworCQlpZiAobm9kZSkKKwkJCXRyZWUtPmxlZnQgPSBub2RlOworCX0KKworCWlmIChub2RlID09IE5VTEwpIHsKKwkJbm9kZSA9IHRyZWUtPnJpZ2h0ID8gdHJlZS0+cmlnaHQgOiB0cmVlLT5sZWZ0OworCQllbmRfbm9kZSA9IG5vZGU7CisJfQorCisJaWYgKGVuZF9ub2RlKSB7CisJCWVuZF9ub2RlLT5sZWZ0ID0KKwkJCSh0cmVlLT5sZWZ0ICE9IGVuZF9ub2RlKSA/CisJCQl0cmVlLT5sZWZ0IDogZW5kX25vZGUtPmxlZnQ7CisJCWVuZF9ub2RlLT5yaWdodCA9CisJCQkodHJlZS0+cmlnaHQgIT0gZW5kX25vZGUpID8KKwkJCXRyZWUtPnJpZ2h0IDogZW5kX25vZGUtPnJpZ2h0OworCQllbmRfbm9kZS0+aGVpZ2h0ID0KKwkJCU1BWChWTUVNX0hFSUdIVChlbmRfbm9kZS0+bGVmdCksCisJCQlWTUVNX0hFSUdIVChlbmRfbm9kZS0+cmlnaHQpKSArIDE7CisJfQorCXRyZWUgPSBlbmRfbm9kZTsKKwlyZXR1cm4gdHJlZTsKK30KKworc3RhdGljIHN0cnVjdCBhdmxfbm9kZV90ICphdmx0cmVlX3JlbW92ZSgKKwlzdHJ1Y3QgYXZsX25vZGVfdCAqdHJlZSwKKwlzdHJ1Y3QgYXZsX25vZGVfdCAqKmZvdW5kX25vZGUsCisJdm1lbV9rZXlfdCBrZXkpCit7CisJKmZvdW5kX25vZGUgPSBOVUxMOworCWlmICh0cmVlID09IE5VTEwpIHsKKwkJcHJfaW5mbygiZmFpbGVkIHRvIGZpbmQga2V5ICVkXG4iLCAoaW50KWtleSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChrZXkgPT0gdHJlZS0+a2V5KSB7CisJCSpmb3VuZF9ub2RlID0gdHJlZTsKKwkJdHJlZSA9IGRvX3VubGluayh0cmVlKTsKKwl9IGVsc2UgaWYgKGtleSA+IHRyZWUtPmtleSkgeworCQl0cmVlLT5yaWdodCA9CisJCQlhdmx0cmVlX3JlbW92ZSh0cmVlLT5yaWdodCwgZm91bmRfbm9kZSwga2V5KTsKKwl9IGVsc2UgeworCQl0cmVlLT5sZWZ0ID0KKwkJCWF2bHRyZWVfcmVtb3ZlKHRyZWUtPmxlZnQsIGZvdW5kX25vZGUsIGtleSk7CisJfQorCisJaWYgKHRyZWUpCisJCXRyZWUtPmhlaWdodCA9CisJCQlNQVgoVk1FTV9IRUlHSFQodHJlZS0+bGVmdCksCisJCQlWTUVNX0hFSUdIVCh0cmVlLT5yaWdodCkpICsgMTsKKworCXRyZWUgPSBkb19iYWxhbmNlKHRyZWUpOworCXJldHVybiB0cmVlOworfQorCit2b2lkIGF2bHRyZWVfZnJlZShzdHJ1Y3QgYXZsX25vZGVfdCAqdHJlZSkKK3sKKwlpZiAodHJlZSA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKHRyZWUtPmxlZnQgPT0gTlVMTCAmJiB0cmVlLT5yaWdodCA9PSBOVUxMKSB7CisJCVZNRU1fUF9GUkVFKHRyZWUpOworCQlyZXR1cm47CisJfQorCisJYXZsdHJlZV9mcmVlKHRyZWUtPmxlZnQpOworCXRyZWUtPmxlZnQgPSBOVUxMOworCWF2bHRyZWVfZnJlZSh0cmVlLT5yaWdodCk7CisJdHJlZS0+cmlnaHQgPSBOVUxMOworCVZNRU1fUF9GUkVFKHRyZWUpOworfQorCitzdGF0aWMgc3RydWN0IGF2bF9ub2RlX3QgKnJlbW92ZV9hcHByb3hfdmFsdWUoCisJc3RydWN0IGF2bF9ub2RlX3QgKnRyZWUsCisJc3RydWN0IGF2bF9ub2RlX3QgKipmb3VuZCwKKwl2bWVtX2tleV90IGtleSkKK3sKKwkqZm91bmQgPSBOVUxMOworCWlmICh0cmVlID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJaWYgKGtleSA9PSB0cmVlLT5rZXkpIHsKKwkJKmZvdW5kID0gdHJlZTsKKwkJdHJlZSA9IGRvX3VubGluayh0cmVlKTsKKwl9IGVsc2UgaWYgKGtleSA+IHRyZWUtPmtleSkgeworCQl0cmVlLT5yaWdodCA9IHJlbW92ZV9hcHByb3hfdmFsdWUodHJlZS0+cmlnaHQsIGZvdW5kLCBrZXkpOworCX0gZWxzZSB7CisJCXRyZWUtPmxlZnQgPSByZW1vdmVfYXBwcm94X3ZhbHVlKHRyZWUtPmxlZnQsIGZvdW5kLCBrZXkpOworCQlpZiAoKmZvdW5kID09IE5VTEwpIHsKKwkJCSpmb3VuZCA9IHRyZWU7CisJCQl0cmVlID0gZG9fdW5saW5rKHRyZWUpOworCQl9CisJfQorCWlmICh0cmVlKQorCQl0cmVlLT5oZWlnaHQgPQorCQkJTUFYKFZNRU1fSEVJR0hUKHRyZWUtPmxlZnQpLAorCQkJVk1FTV9IRUlHSFQodHJlZS0+cmlnaHQpKSArIDE7CisJdHJlZSA9IGRvX2JhbGFuY2UodHJlZSk7CisJcmV0dXJuIHRyZWU7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9ibG9ja3NfZnJlZSgKKwlzdHJ1Y3QgdmlkZW9fbW1fdCAqbW0sCisJczMyIHBhZ2VubywKKwlzMzIgbnBhZ2VzKQoreworCXMzMiBsYXN0X3BhZ2VubyA9IHBhZ2VubyArIG5wYWdlcyAtIDE7CisJczMyIGk7CisJc3RydWN0IHBhZ2VfdCAqcGFnZTsKKwlzdHJ1Y3QgcGFnZV90ICpsYXN0X3BhZ2U7CisKKwlpZiAobnBhZ2VzID09IDApCisJCVZNRU1fQVNTRVJUOworCisJaWYgKGxhc3RfcGFnZW5vID49IG1tLT5udW1fcGFnZXMpIHsKKwkJcHJfaW5mbygKKwkJCSJzZXRfYmxvY2tzX2ZyZWU6IGludmFsaWQgbGFzdCBwYWdlIG51bWJlcjogJWRcbiIsCisJCQlsYXN0X3BhZ2Vubyk7CisJCVZNRU1fQVNTRVJUOworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gcGFnZW5vOyBpIDw9IGxhc3RfcGFnZW5vOyBpKyspIHsKKwkJbW0tPnBhZ2VfbGlzdFtpXS51c2VkCT0gMDsKKwkJbW0tPnBhZ2VfbGlzdFtpXS5hbGxvY19wYWdlcyA9IDA7CisJCW1tLT5wYWdlX2xpc3RbaV0uZmlyc3RfcGFnZW5vID0gLTE7CisJfQorCisJcGFnZSA9ICZtbS0+cGFnZV9saXN0W3BhZ2Vub107CisJcGFnZS0+YWxsb2NfcGFnZXMgPSBucGFnZXM7CisJbGFzdF9wYWdlID0gJm1tLT5wYWdlX2xpc3RbbGFzdF9wYWdlbm9dOworCWxhc3RfcGFnZS0+Zmlyc3RfcGFnZW5vID0gcGFnZW5vOworCW1tLT5mcmVlX3RyZWUgPQorCQlhdmx0cmVlX2luc2VydChtbS0+ZnJlZV90cmVlLCBNQUtFX0tFWShucGFnZXMsIHBhZ2VubyksIHBhZ2UpOworfQorCitzdGF0aWMgdm9pZCBzZXRfYmxvY2tzX2FsbG9jKAorCXN0cnVjdCB2aWRlb19tbV90ICptbSwKKwlzMzIgcGFnZW5vLAorCXMzMiBucGFnZXMpCit7CisJczMyIGxhc3RfcGFnZW5vID0gcGFnZW5vICsgbnBhZ2VzIC0gMTsKKwlzMzIgaTsKKwlzdHJ1Y3QgcGFnZV90ICpwYWdlOworCXN0cnVjdCBwYWdlX3QgKmxhc3RfcGFnZTsKKworCWlmIChsYXN0X3BhZ2VubyA+PSBtbS0+bnVtX3BhZ2VzKSB7CisJCXByX2luZm8oCisJCQkic2V0X2Jsb2Nrc19mcmVlOiBpbnZhbGlkIGxhc3QgcGFnZSBudW1iZXI6ICVkXG4iLAorCQkJbGFzdF9wYWdlbm8pOworCQlWTUVNX0FTU0VSVDsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IHBhZ2VubzsgaSA8PSBsYXN0X3BhZ2VubzsgaSsrKSB7CisJCW1tLT5wYWdlX2xpc3RbaV0udXNlZAk9IDE7CisJCW1tLT5wYWdlX2xpc3RbaV0uYWxsb2NfcGFnZXMgPSAwOworCQltbS0+cGFnZV9saXN0W2ldLmZpcnN0X3BhZ2VubyA9IC0xOworCX0KKworCXBhZ2UgPSAmbW0tPnBhZ2VfbGlzdFtwYWdlbm9dOworCXBhZ2UtPmFsbG9jX3BhZ2VzID0gbnBhZ2VzOworCWxhc3RfcGFnZSA9ICZtbS0+cGFnZV9saXN0W2xhc3RfcGFnZW5vXTsKKwlsYXN0X3BhZ2UtPmZpcnN0X3BhZ2VubyA9IHBhZ2VubzsKKwltbS0+YWxsb2NfdHJlZSA9CisJCWF2bHRyZWVfaW5zZXJ0KG1tLT5hbGxvY190cmVlLCBNQUtFX0tFWShwYWdlLT5hZGRyLCAwKSwgcGFnZSk7Cit9CisKKworczMyIHZtZW1faW5pdChzdHJ1Y3QgdmlkZW9fbW1fdCAqbW0sIHVsb25nIGFkZHIsIHVsb25nIHNpemUpCit7CisJczMyIGk7CisKKwlpZiAobW0gPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJbW0tPmJhc2VfYWRkciA9IChhZGRyICsgKFZNRU1fUEFHRV9TSVpFIC0gMSkpCisJCSYgfihWTUVNX1BBR0VfU0laRSAtIDEpOworCW1tLT5tZW1fc2l6ZSA9IHNpemUgJiB+Vk1FTV9QQUdFX1NJWkU7CisJbW0tPm51bV9wYWdlcyA9IG1tLT5tZW1fc2l6ZSAvIFZNRU1fUEFHRV9TSVpFOworCW1tLT5mcmVlX3RyZWUgPSBOVUxMOworCW1tLT5hbGxvY190cmVlID0gTlVMTDsKKwltbS0+ZnJlZV9wYWdlX2NvdW50ID0gbW0tPm51bV9wYWdlczsKKwltbS0+YWxsb2NfcGFnZV9jb3VudCA9IDA7CisJbW0tPnBhZ2VfbGlzdCA9CisJCShzdHJ1Y3QgcGFnZV90ICopVk1FTV9QX0FMTE9DKAorCQltbS0+bnVtX3BhZ2VzICogc2l6ZW9mKHN0cnVjdCBwYWdlX3QpKTsKKwlpZiAobW0tPnBhZ2VfbGlzdCA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6JWQgZmFpbGVkIHRvIGttYWxsb2MoJWxkKVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywKKwkJCShsb25nKW1tLT5udW1fcGFnZXMgKiBzaXplb2Yoc3RydWN0IHBhZ2VfdCkpOworCQlyZXR1cm4gLTE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG1tLT5udW1fcGFnZXM7IGkrKykgeworCQltbS0+cGFnZV9saXN0W2ldLnBhZ2VubyA9IGk7CisJCW1tLT5wYWdlX2xpc3RbaV0uYWRkciA9CisJCQltbS0+YmFzZV9hZGRyICsgaSAqIFZNRU1fUEFHRV9TSVpFOworCQltbS0+cGFnZV9saXN0W2ldLmFsbG9jX3BhZ2VzID0gMDsKKwkJbW0tPnBhZ2VfbGlzdFtpXS51c2VkID0gMDsKKwkJbW0tPnBhZ2VfbGlzdFtpXS5maXJzdF9wYWdlbm8gPSAtMTsKKwl9CisJc2V0X2Jsb2Nrc19mcmVlKG1tLCAwLCBtbS0+bnVtX3BhZ2VzKTsKKwlyZXR1cm4gMDsKK30KKworczMyIHZtZW1fZXhpdChzdHJ1Y3QgdmlkZW9fbW1fdCAqbW0pCit7CisJaWYgKG1tID09IE5VTEwpIHsKKwkJcHJfaW5mbygidm1lbV9leGl0OiBpbnZhbGlkIGhhbmRsZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAobW0tPmZyZWVfdHJlZSkKKwkJYXZsdHJlZV9mcmVlKG1tLT5mcmVlX3RyZWUpOworCWlmIChtbS0+YWxsb2NfdHJlZSkKKwkJYXZsdHJlZV9mcmVlKG1tLT5hbGxvY190cmVlKTsKKworCWlmIChtbS0+cGFnZV9saXN0KSB7CisJCVZNRU1fUF9GUkVFKG1tLT5wYWdlX2xpc3QpOworCQltbS0+cGFnZV9saXN0ID0gTlVMTDsKKwl9CisKKwltbS0+YmFzZV9hZGRyID0gMDsKKwltbS0+bWVtX3NpemUgPSAwOworCW1tLT5udW1fcGFnZXMgPSAwOworCW1tLT5wYWdlX2xpc3QgPSBOVUxMOworCW1tLT5mcmVlX3RyZWUgPSBOVUxMOworCW1tLT5hbGxvY190cmVlID0gTlVMTDsKKwltbS0+ZnJlZV9wYWdlX2NvdW50ID0gMDsKKwltbS0+YWxsb2NfcGFnZV9jb3VudCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3Vsb25nIHZtZW1fYWxsb2Moc3RydWN0IHZpZGVvX21tX3QgKm1tLCBzMzIgc2l6ZSwgdWxvbmcgcGlkKQoreworCXN0cnVjdCBhdmxfbm9kZV90ICpub2RlOworCXN0cnVjdCBwYWdlX3QgKmZyZWVfcGFnZTsKKwlzMzIgbnBhZ2VzLCBmcmVlX3NpemU7CisJczMyIGFsbG9jX3BhZ2VubzsKKwl1bG9uZyBwdHI7CisKKwlpZiAobW0gPT0gTlVMTCkgeworCQlwcl9pbmZvKCJ2bWVtX2FsbG9jOiBpbnZhbGlkIGhhbmRsZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoc2l6ZSA8PSAwKQorCQlyZXR1cm4gLTE7CisKKwlucGFnZXMgPSAoc2l6ZSArIFZNRU1fUEFHRV9TSVpFIC0gMSkgLyBWTUVNX1BBR0VfU0laRTsKKwltbS0+ZnJlZV90cmVlID0gcmVtb3ZlX2FwcHJveF92YWx1ZShtbS0+ZnJlZV90cmVlLAorCQkmbm9kZSwgTUFLRV9LRVkobnBhZ2VzLCAwKSk7CisKKwlpZiAobm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlmcmVlX3BhZ2UgPSBub2RlLT5wYWdlOworCWZyZWVfc2l6ZSA9IEtFWV9UT19WQUxVRShub2RlLT5rZXkpOworCWFsbG9jX3BhZ2VubyA9IGZyZWVfcGFnZS0+cGFnZW5vOworCXNldF9ibG9ja3NfYWxsb2MobW0sIGFsbG9jX3BhZ2VubywgbnBhZ2VzKTsKKwlpZiAobnBhZ2VzICE9IGZyZWVfc2l6ZSkgeworCQlzMzIgZnJlZV9wYWdlbm8gPSBhbGxvY19wYWdlbm8gKyBucGFnZXM7CisKKwkJc2V0X2Jsb2Nrc19mcmVlKG1tLCBmcmVlX3BhZ2VubywgKGZyZWVfc2l6ZS1ucGFnZXMpKTsKKwl9CisJVk1FTV9QX0ZSRUUobm9kZSk7CisKKwlwdHIgPSBtbS0+cGFnZV9saXN0W2FsbG9jX3BhZ2Vub10uYWRkcjsKKwltbS0+YWxsb2NfcGFnZV9jb3VudCArPSBucGFnZXM7CisJbW0tPmZyZWVfcGFnZV9jb3VudCAtPSBucGFnZXM7CisJcmV0dXJuIHB0cjsKK30KKworczMyIHZtZW1fZnJlZShzdHJ1Y3QgdmlkZW9fbW1fdCAqbW0sIHVsb25nIHB0ciwgdWxvbmcgcGlkKQoreworCXVsb25nIGFkZHI7CisJc3RydWN0IGF2bF9ub2RlX3QgKmZvdW5kOworCXN0cnVjdCBwYWdlX3QgKnBhZ2U7CisJczMyIHBhZ2VubywgcHJldl9mcmVlX3BhZ2VubywgbmV4dF9mcmVlX3BhZ2VubzsKKwlzMzIgcHJldl9zaXplLCBuZXh0X3NpemU7CisJczMyIG1lcmdlX3BhZ2Vfbm8sIG1lcmdlX3BhZ2Vfc2l6ZSwgZnJlZV9wYWdlX3NpemU7CisKKwlpZiAobW0gPT0gTlVMTCkgeworCQlwcl9pbmZvKCJ2bWVtX2ZyZWU6IGludmFsaWQgaGFuZGxlXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWFkZHIgPSBwdHI7CisJbW0tPmFsbG9jX3RyZWUgPSBhdmx0cmVlX3JlbW92ZShtbS0+YWxsb2NfdHJlZSwgJmZvdW5kLAorCQlNQUtFX0tFWShhZGRyLCAwKSk7CisKKwlpZiAoZm91bmQgPT0gTlVMTCkgeworCQlwcl9pbmZvKCJ2bWVtX2ZyZWU6IDB4JTA4eCBub3QgZm91bmRcbiIsIChzMzIpYWRkcik7CisJCVZNRU1fQVNTRVJUOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogZmluZCBwcmV2aW91cyBmcmVlIGJsb2NrICovCisJcGFnZSA9IGZvdW5kLT5wYWdlOworCXBhZ2VubyA9IHBhZ2UtPnBhZ2VubzsKKwlmcmVlX3BhZ2Vfc2l6ZSA9IHBhZ2UtPmFsbG9jX3BhZ2VzOworCXByZXZfZnJlZV9wYWdlbm8gPSBwYWdlbm8gLSAxOworCXByZXZfc2l6ZSA9IC0xOworCWlmIChwcmV2X2ZyZWVfcGFnZW5vID49IDApIHsKKwkJaWYgKG1tLT5wYWdlX2xpc3RbcHJldl9mcmVlX3BhZ2Vub10udXNlZCA9PSAwKSB7CisJCQlwcmV2X2ZyZWVfcGFnZW5vID0KKwkJCQltbS0+cGFnZV9saXN0W3ByZXZfZnJlZV9wYWdlbm9dLmZpcnN0X3BhZ2VubzsKKwkJCXByZXZfc2l6ZSA9CisJCQkJbW0tPnBhZ2VfbGlzdFtwcmV2X2ZyZWVfcGFnZW5vXS5hbGxvY19wYWdlczsKKwkJfQorCX0KKworCS8qIGZpbmQgbmV4dCBmcmVlIGJsb2NrICovCisJbmV4dF9mcmVlX3BhZ2VubyA9IHBhZ2VubyArIHBhZ2UtPmFsbG9jX3BhZ2VzOworCW5leHRfZnJlZV9wYWdlbm8gPQorCQkobmV4dF9mcmVlX3BhZ2VubyA9PSBtbS0+bnVtX3BhZ2VzKSA/IC0xIDogbmV4dF9mcmVlX3BhZ2VubzsKKwluZXh0X3NpemUgPSAtMTsKKwlpZiAobmV4dF9mcmVlX3BhZ2VubyA+PSAwKSB7CisJCWlmIChtbS0+cGFnZV9saXN0W25leHRfZnJlZV9wYWdlbm9dLnVzZWQgPT0gMCkgeworCQkJbmV4dF9zaXplID0KKwkJCQltbS0+cGFnZV9saXN0W25leHRfZnJlZV9wYWdlbm9dLmFsbG9jX3BhZ2VzOworCQl9CisJfQorCVZNRU1fUF9GUkVFKGZvdW5kKTsKKworCS8qIG1lcmdlICovCisJbWVyZ2VfcGFnZV9ubyA9IHBhZ2UtPnBhZ2VubzsKKwltZXJnZV9wYWdlX3NpemUgPSBwYWdlLT5hbGxvY19wYWdlczsKKwlpZiAocHJldl9zaXplID49IDApIHsKKwkJbW0tPmZyZWVfdHJlZSA9IGF2bHRyZWVfcmVtb3ZlKG1tLT5mcmVlX3RyZWUsICZmb3VuZCwKKwkJCU1BS0VfS0VZKHByZXZfc2l6ZSwgcHJldl9mcmVlX3BhZ2VubykpOworCQlpZiAoZm91bmQgPT0gTlVMTCkgeworCQkJVk1FTV9BU1NFUlQ7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbWVyZ2VfcGFnZV9ubyA9IGZvdW5kLT5wYWdlLT5wYWdlbm87CisJCW1lcmdlX3BhZ2Vfc2l6ZSArPSBmb3VuZC0+cGFnZS0+YWxsb2NfcGFnZXM7CisJCVZNRU1fUF9GUkVFKGZvdW5kKTsKKwl9CisJaWYgKG5leHRfc2l6ZSA+PSAwKSB7CisJCW1tLT5mcmVlX3RyZWUgPSBhdmx0cmVlX3JlbW92ZShtbS0+ZnJlZV90cmVlLCAmZm91bmQsCisJCQlNQUtFX0tFWShuZXh0X3NpemUsIG5leHRfZnJlZV9wYWdlbm8pKTsKKwkJaWYgKGZvdW5kID09IE5VTEwpIHsKKwkJCVZNRU1fQVNTRVJUOworCQkJcmV0dXJuIC0xOworCQl9CisJCW1lcmdlX3BhZ2Vfc2l6ZSArPSBmb3VuZC0+cGFnZS0+YWxsb2NfcGFnZXM7CisJCVZNRU1fUF9GUkVFKGZvdW5kKTsKKwl9CisJcGFnZS0+YWxsb2NfcGFnZXMgPSAwOworCXBhZ2UtPmZpcnN0X3BhZ2VubyA9IC0xOworCXNldF9ibG9ja3NfZnJlZShtbSwgbWVyZ2VfcGFnZV9ubywgbWVyZ2VfcGFnZV9zaXplKTsKKwltbS0+YWxsb2NfcGFnZV9jb3VudCAtPSBmcmVlX3BhZ2Vfc2l6ZTsKKwltbS0+ZnJlZV9wYWdlX2NvdW50ICs9IGZyZWVfcGFnZV9zaXplOworCXJldHVybiAwOworfQorCitzMzIgdm1lbV9nZXRfaW5mbyhzdHJ1Y3QgdmlkZW9fbW1fdCAqbW0sIHN0cnVjdCB2bWVtX2luZm9fdCAqaW5mbykKK3sKKwlpZiAobW0gPT0gTlVMTCkgeworCQlwcl9pbmZvKCJ2bWVtX2dldF9pbmZvOiBpbnZhbGlkIGhhbmRsZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoaW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpbmZvLT50b3RhbF9wYWdlcyA9IG1tLT5udW1fcGFnZXM7CisJaW5mby0+YWxsb2NfcGFnZXMgPSBtbS0+YWxsb2NfcGFnZV9jb3VudDsKKwlpbmZvLT5mcmVlX3BhZ2VzID0gbW0tPmZyZWVfcGFnZV9jb3VudDsKKwlpbmZvLT5wYWdlX3NpemUgPSBWTUVNX1BBR0VfU0laRTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBfX0NOTV9WSURFT19NRU1PUllfTUFOQUdFTUVOVF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfc2luay9lbmNvZGVyL211bHRpL3ZwdV9tdWx0aS5jIGIvZHJpdmVycy9mcmFtZV9zaW5rL2VuY29kZXIvbXVsdGkvdnB1X211bHRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRhOGMyOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfc2luay9lbmNvZGVyL211bHRpL3ZwdV9tdWx0aS5jCkBAIC0wLDAgKzEsMzQ4OSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgYnkgQW1sb2dpYywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICovCisKKyNkZWZpbmUgTE9HX0xJTkUoKSBwcl9lcnIoIlslczolZF1cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2ZkdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcmVzZXJ2ZWRfbWVtLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29kZWNfbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL2NwdV92ZXJzaW9uLmg+CisvLyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL3B3cl9jdHJsLmg+CisKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NhbnZhcy9jYW52YXMuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NhbnZhcy9jYW52YXNfbWdyLmg+CisKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL3Bvd2VyX2N0cmwuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9wb3dlci90Ny1wZC5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvcG93ZXJfZG9tYWluLmg+CisjaW5jbHVkZSAiLi4vLi4vLi4vY29tbW9uL2NoaXBzL2RlY29kZXJfY3B1X3Zlcl9pbmZvLmgiCisjaW5jbHVkZSAiLi4vLi4vLi4vZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjLmgiCisjaW5jbHVkZSAiLi4vLi4vLi4vZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjX3Bvd2VyX2N0cmwuaCIKKyNpbmNsdWRlICJ2cHVfbXVsdGkuaCIKKyNpbmNsdWRlICJ2bW1fbXVsdGkuaCIKKworI2RlZmluZSBNQVhfSU5URVJSVVBUX1FVRVVFICgxNipNQVhfTlVNX0lOU1RBTkNFKQorCisvKiBkZWZpbml0aW9ucyB0byBiZSBjaGFuZ2VkIGFzIGN1c3RvbWVyICBjb25maWd1cmF0aW9uICovCisvKiBpZiB5b3Ugd2FudCB0byBoYXZlIGNsb2NrIGdhdGluZyBzY2hlbWUgZnJhbWUgYnkgZnJhbWUgKi8KKyNkZWZpbmUgVlBVX1NVUFBPUlRfQ0xPQ0tfQ09OVFJPTAorCisjZGVmaW5lIFZQVV9QTEFURk9STV9ERVZJQ0VfTkFNRSAiYW12ZW5jX211bHRpIgorI2RlZmluZSBWUFVfREVWX05BTUUgImFtdmVuY19tdWx0aSIKKyNkZWZpbmUgVlBVX0NMQVNTX05BTUUgImFtdmVuY19tdWx0aSIKKworI2lmbmRlZiBWTV9SRVNFUlZFRAkvKmZvciBrZXJuZWwgdXAgdG8gMy43LjAgdmVyc2lvbiovCisjZGVmaW5lIFZNX1JFU0VSVkVEIChWTV9ET05URVhQQU5EIHwgVk1fRE9OVERVTVApCisjZW5kaWYKKworI2RlZmluZSBNSHogKDEwMDAwMDApCisKKyNkZWZpbmUgVlBVX0lOSVRfVklERU9fTUVNT1JZX1NJWkVfSU5fQllURSAoMjU2ICogU1pfMU0pCisKKyNkZWZpbmUgTE9HX0FMTCAwCisjZGVmaW5lIExPR19JTkZPIDEKKyNkZWZpbmUgTE9HX0RFQlVHIDIKKyNkZWZpbmUgTE9HX0VSUk9SIDMKKworI2RlZmluZSBlbmNfcHIobGV2ZWwsIHguLi4pIFwKKwlkbyB7IFwKKwkJaWYgKGxldmVsID49IHByaW50X2xldmVsKSBcCisJCQlwcmludGsoeCk7IFwKKwl9IHdoaWxlICgwKQorCitzdGF0aWMgczMyIHByaW50X2xldmVsID0gTE9HX0RFQlVHOworc3RhdGljIHMzMiBjbG9ja19sZXZlbCA9IDQ7CitzdGF0aWMgczMyIGNsb2NrX2dhdGVfY291bnQgPSAwOworc3RhdGljIHUzMiBzZXRfY2xvY2tfZnJlcSA9IDA7CisKK3N0YXRpYyBzdHJ1Y3QgdmlkZW9fbW1fdCBzX3ZtZW07CitzdGF0aWMgc3RydWN0IHZwdWRydl9idWZmZXJfdCBzX3ZpZGVvX21lbW9yeSA9IHswfTsKK3N0YXRpYyBib29sIHVzZV9yZXNlcnZlOworc3RhdGljIHVsb25nIGNtYV9wb29sX3NpemU7CitzdGF0aWMgdTMyIGNtYV9jZmdfc2l6ZTsKKworc3RhdGljIHUzMiBjbG9ja19hLCBjbG9ja19iLCBjbG9ja19jOworc3RhdGljIGludCBkdW1wX2lucHV0Oworc3RhdGljIGludCBkdW1wX2VzOworc3RhdGljIGludCB2cHVfaHdfcmVzZXQodm9pZCk7CitzdGF0aWMgdm9pZCBod19yZXNldChib29sIHJlc2V0KTsKKworc3RydWN0IHZwdV9jbGtzIHsKKwlzdHJ1Y3QgY2xrICpkb3NfY2xrOworCXN0cnVjdCBjbGsgKmRvc19hcGJfY2xrOworCXN0cnVjdCBjbGsgKmFfY2xrOworCXN0cnVjdCBjbGsgKmJfY2xrOworCXN0cnVjdCBjbGsgKmNfY2xrOworfTsKKworc3RhdGljIHN0cnVjdCB2cHVfY2xrcyBzX3ZwdV9jbGtzOworCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RhdGljIHN0cnVjdCBmaWxlICpmaWxlX29wZW4oY29uc3QgY2hhciAqcGF0aCwgaW50IGZsYWdzLCBpbnQgcmlnaHRzKQoreworICAgIHN0cnVjdCBmaWxlICpmaWxwID0gTlVMTDsKKyAgICBtbV9zZWdtZW50X3Qgb2xkZnM7CisgICAgbG9uZyBlcnIxID0gMDsKKyAgICB2b2lkICplcnIyID0gTlVMTDsKKworICAgIG9sZGZzID0gZ2V0X2ZzKCk7CisgICAgLy9zZXRfZnMoZ2V0X2RzKCkpOworICAgIHNldF9mcyhLRVJORUxfRFMpOworICAgIGZpbHAgPSBmaWxwX29wZW4ocGF0aCwgZmxhZ3MsIHJpZ2h0cyk7CisgICAgc2V0X2ZzKG9sZGZzKTsKKworICAgIGlmIChJU19FUlIoZmlscCkpIHsKKyAgICAgICAgZXJyMSA9IFBUUl9FUlIoZmlscCk7CisgICAgICAgIGVycjIgPSBFUlJfUFRSKGVycjEpOworICAgICAgICBwcl9lcnIoImZpbHBfb3BlbiByZXR1cm4gJXAsICVsZCwgJXBcbiIsIGZpbHAsIGVycjEsIGVycjIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gZmlscDsKK30KKworc3RhdGljIHZvaWQgZmlsZV9jbG9zZShzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKyAgICBmaWxwX2Nsb3NlKGZpbGUsIE5VTEwpOworfQorLyoKK3N0YXRpYyBpbnQgZmlsZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKyAgICBtbV9zZWdtZW50X3Qgb2xkZnM7CisgICAgaW50IHJldDsKKworICAgIG9sZGZzID0gZ2V0X2ZzKCk7CisgICAgc2V0X2ZzKEtFUk5FTF9EUyk7CisKKyAgICByZXQgPSB2ZnNfcmVhZChmaWxlLCBkYXRhLCBzaXplLCAmb2Zmc2V0KTsKKworICAgIHNldF9mcyhvbGRmcyk7CisgICAgcmV0dXJuIHJldDsKK30qLworc3RhdGljIGludCBmaWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKyAgICBtbV9zZWdtZW50X3Qgb2xkZnM7CisgICAgaW50IHJldDsKKyAgICAvL2xvZmZfdCBwb3M7CisKKyAgICBvbGRmcyA9IGdldF9mcygpOworICAgIHNldF9mcyhLRVJORUxfRFMpOworICAgIC8vcG9zID0gZmlsZS0+Zl9wb3M7CisgICAgcmV0ID0gdmZzX3dyaXRlKGZpbGUsIGRhdGEsIHNpemUsICZvZmZzZXQpOworICAgIC8vZmlsZS0+Zl9wb3MgPSBwb3M7CisKKyAgICBzZXRfZnMob2xkZnMpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZmlsZV9zeW5jKHN0cnVjdCBmaWxlICpmaWxlKQoreworICAgIHZmc19mc3luYyhmaWxlLCAwKTsKKyAgICByZXR1cm4gMDsKK30KK3N0YXRpYyBzMzIgZHVtcF9yYXdfaW5wdXQoc3RydWN0IGNhbnZhc19zICpjczApIHsKKwl1OCAqZGF0YTsKKworCXUzMiBhZGRyLCBjYW52YXNfdywgcGljc2l6ZV95OworCS8vdTMyIGlucHV0ID0gcmVxdWVzdC0+c3JjOworCS8vdTggaWZvcm1hdCA9IE1BWF9GUkFNRV9GTVQ7CisJc3RydWN0IGZpbGUgKmZpbHA7CisJaW50IHJldDsKKworCWFkZHIgID0gY3MwLT5hZGRyOworCisJY2FudmFzX3cgID0gKChjczAtPndpZHRoICsgMzEpID4+IDUpIDw8IDU7CisJcGljc2l6ZV95ID0gY3MwLT5oZWlnaHQ7CisKKwlmaWxwID0gZmlsZV9vcGVuKCIvZGF0YS9tdWx0aWVuYy55dXYiLCBPX0NSRUFUIHwgT19SRFdSIHwgT19BUFBFTkQsIDA3NzcpOworCisJaWYgKGZpbHApIHsKKwkJZGF0YSA9ICh1OCopcGh5c190b192aXJ0KGFkZHIpOworCQlyZXQgPSBmaWxlX3dyaXRlKGZpbHAsIDAsIGRhdGEsIGNhbnZhc193ICogcGljc2l6ZV95KTsKKworCQlmaWxlX3N5bmMoZmlscCk7CisJCWZpbGVfY2xvc2UoZmlscCk7CisJfSBlbHNlCisJCXByX2Vycigib3BlbiBlbmNvZGVyLnl1diBmYWlsZWRcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzMzIgZHVtcF9kYXRhKHUzMiBwaHlfYWRkciwgdTMyIHNpemUpIHsKKwl1OCAqZGF0YSA7CisKKwlzdHJ1Y3QgZmlsZSAqZmlscDsKKwlpbnQgcmV0OworCisJZmlscCA9IGZpbGVfb3BlbigiL2RhdGEvbXVsdGllbmMuZXMiLCBPX0NSRUFUIHwgT19SRFdSIHwgT19BUFBFTkQsIDA3NzcpOworCisJaWYgKGZpbHApIHsKKwkJZGF0YSA9ICh1OCopcGh5c190b192aXJ0KHBoeV9hZGRyKTsKKwkJcmV0ID0gZmlsZV93cml0ZShmaWxwLCAwLCBkYXRhLCBzaXplKTsKKworCQlmaWxlX3N5bmMoZmlscCk7CisJCWZpbGVfY2xvc2UoZmlscCk7CisJfSBlbHNlCisJCXByX2Vycigib3BlbiBlbmNvZGVyLmVzIGZhaWxlZFxuIik7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKnN0YXRpYyBzMzIgZHVtcF9lbmNvZGVkX2RhdGEodTggKmRhdGEsIHUzMiBzaXplKSB7CisJc3RydWN0IGZpbGUgKmZpbHA7CisKKwlmaWxwID0gZmlsZV9vcGVuKCIvZGF0YS9tdWx0aWVuY19vdXRwdXQuZXMiLCBPX0FQUEVORCB8IE9fUkRXUiwgMDY0NCk7CisKKwlpZiAoZmlscCkgeworCQlmaWxlX3dyaXRlKGZpbHAsIDAsIGRhdGEsIHNpemUpOworCQlmaWxlX3N5bmMoZmlscCk7CisJCWZpbGVfY2xvc2UoZmlscCk7CisJfSBlbHNlCisJCXByX2VycigiL2RhdGEvbXVsdGllbmNfb3V0cHV0LmVzIGZhaWxlZFxuIik7CisKKwlyZXR1cm4gMDsKK30qLworCitzdGF0aWMgdm9pZCB2cHVfY2xrX3B1dChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCB2cHVfY2xrcyAqY2xrcykKK3sKKwlpZiAoIShjbGtzLT5jX2NsayA9PSBOVUxMIHx8IElTX0VSUihjbGtzLT5jX2NsaykpKQorCQlkZXZtX2Nsa19wdXQoZGV2LCBjbGtzLT5jX2Nsayk7CisJaWYgKCEoY2xrcy0+Yl9jbGsgPT0gTlVMTCB8fCBJU19FUlIoY2xrcy0+Yl9jbGspKSkKKwkJZGV2bV9jbGtfcHV0KGRldiwgY2xrcy0+Yl9jbGspOworCWlmICghKGNsa3MtPmFfY2xrID09IE5VTEwgfHwgSVNfRVJSKGNsa3MtPmFfY2xrKSkpCisJCWRldm1fY2xrX3B1dChkZXYsIGNsa3MtPmFfY2xrKTsKKwlpZiAoIShjbGtzLT5kb3NfYXBiX2NsayA9PSBOVUxMIHx8IElTX0VSUihjbGtzLT5kb3NfYXBiX2NsaykpKQorCQlkZXZtX2Nsa19wdXQoZGV2LCBjbGtzLT5kb3NfYXBiX2Nsayk7CisJaWYgKCEoY2xrcy0+ZG9zX2NsayA9PSBOVUxMIHx8IElTX0VSUihjbGtzLT5kb3NfY2xrKSkpCisJCWRldm1fY2xrX3B1dChkZXYsIGNsa3MtPmRvc19jbGspOworfQorCitzdGF0aWMgaW50IHZwdV9jbGtfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHZwdV9jbGtzICpjbGtzKQoreworCWludCByZXQgPSAwOworCisJY2xrcy0+ZG9zX2NsayA9IGRldm1fY2xrX2dldChkZXYsICJjbGtfZG9zIik7CisKKwlpZiAoSVNfRVJSKGNsa3MtPmRvc19jbGspKSB7CisJCWVuY19wcihMT0dfRVJST1IsICJjYW5ub3QgZ2V0IGNsa19kb3MgY2xvY2tcbiIpOworCQljbGtzLT5kb3NfY2xrID0gTlVMTDsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBlcnI7CisJfQorCisJY2xrcy0+ZG9zX2FwYl9jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAiY2xrX2FwYl9kb3MiKTsKKworCWlmIChJU19FUlIoY2xrcy0+ZG9zX2FwYl9jbGspKSB7CisJCWVuY19wcihMT0dfRVJST1IsICJjYW5ub3QgZ2V0IGNsa19hcGJfZG9zIGNsb2NrXG4iKTsKKwkJY2xrcy0+ZG9zX2FwYl9jbGsgPSBOVUxMOworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGVycjsKKwl9CisKKwljbGtzLT5hX2NsayA9IGRldm1fY2xrX2dldChkZXYsICJjbGtfTXVsdGlFbmNfQSIpOworCisJaWYgKElTX0VSUihjbGtzLT5hX2NsaykpIHsKKwkJZW5jX3ByKExPR19FUlJPUiwgImNhbm5vdCBnZXQgY2xvY2tcbiIpOworCQljbGtzLT5hX2NsayA9IE5VTEw7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyOworCX0KKworCWNsa3MtPmJfY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgImNsa19NdWx0aUVuY19CIik7CisKKwlpZiAoSVNfRVJSKGNsa3MtPmJfY2xrKSkgeworCQllbmNfcHIoTE9HX0VSUk9SLCAiY2Fubm90IGdldCBjbGtfTXVsdGlFbmNfQiBjbG9ja1xuIik7CisJCWNsa3MtPmJfY2xrID0gTlVMTDsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBlcnI7CisJfQorCisJY2xrcy0+Y19jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAiY2xrX011bHRpRW5jX0MiKTsKKworCWlmIChJU19FUlIoY2xrcy0+Y19jbGspKSB7CisJCWVuY19wcihMT0dfRVJST1IsICJjYW5ub3QgZ2V0IGNsa19NdWx0aUVuY19DIGNsb2NrXG4iKTsKKwkJY2xrcy0+Y19jbGsgPSBOVUxMOworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK2VycjoKKwl2cHVfY2xrX3B1dChkZXYsIGNsa3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdnB1X2Nsa19lbmFibGUoc3RydWN0IHZwdV9jbGtzICpjbGtzKQoreworCXUzMiBmcmVxID0gNDAwOworCisJaWYgKHNldF9jbG9ja19mcmVxICYmIHNldF9jbG9ja19mcmVxIDw9IDQwMCkKKwkJZnJlcSA9IHNldF9jbG9ja19mcmVxOworCisJY2xrX3NldF9yYXRlKGNsa3MtPmRvc19jbGssIGZyZXEgKiBNSHopOworCWNsa19zZXRfcmF0ZShjbGtzLT5kb3NfYXBiX2NsaywgZnJlcSAqIE1Ieik7CisKKwlpZiAoY2xvY2tfYSA+IDApIHsKKwkJcHJfaW5mbygidnB1X211bHRpOiBkZXNpcmVkIGNsb2NrX2EgZnJlcSAldVxuIiwgY2xvY2tfYSk7CisJCWNsa19zZXRfcmF0ZShjbGtzLT5hX2NsaywgY2xvY2tfYSk7CisJfSBlbHNlCisJCWNsa19zZXRfcmF0ZShjbGtzLT5hX2NsaywgNjY2NjY2NjY2KTsKKworCWlmIChjbG9ja19iID4gMCkgeworCQlwcl9pbmZvKCJ2cHVfbXVsdGk6IGRlc2lyZWQgY2xvY2tfYiBmcmVxICV1XG4iLCBjbG9ja19iKTsKKwkJY2xrX3NldF9yYXRlKGNsa3MtPmJfY2xrLCBjbG9ja19iKTsKKwl9IGVsc2UKKwkJY2xrX3NldF9yYXRlKGNsa3MtPmJfY2xrLCA1MDAgKiBNSHopOworCisJaWYgKGNsb2NrX2MgPiAwKSB7CisJCXByX2luZm8oInZwdV9tdWx0aTogZGVzaXJlZCBjbG9ja19jIGZyZXEgJXVcbiIsIGNsb2NrX2MpOworCQljbGtfc2V0X3JhdGUoY2xrcy0+Y19jbGssIGNsb2NrX2MpOworCX0gZWxzZQorCQljbGtfc2V0X3JhdGUoY2xrcy0+Y19jbGssIDUwMCAqIE1Ieik7CisKKwljbGtfcHJlcGFyZV9lbmFibGUoY2xrcy0+ZG9zX2Nsayk7CisJY2xrX3ByZXBhcmVfZW5hYmxlKGNsa3MtPmRvc19hcGJfY2xrKTsKKwljbGtfcHJlcGFyZV9lbmFibGUoY2xrcy0+YV9jbGspOworCWNsa19wcmVwYXJlX2VuYWJsZShjbGtzLT5iX2Nsayk7CisJY2xrX3ByZXBhcmVfZW5hYmxlKGNsa3MtPmNfY2xrKTsKKworCWVuY19wcihMT0dfREVCVUcsICJkb3M6ICVsZCwgZG9zX2FwYjogJWxkLCBhOiAlbGQsIGI6ICVsZCwgYzogJWxkXG4iLAorCSAgICAgICBjbGtfZ2V0X3JhdGUoY2xrcy0+ZG9zX2NsayksIGNsa19nZXRfcmF0ZShjbGtzLT5kb3NfYXBiX2NsayksCisJICAgICAgIGNsa19nZXRfcmF0ZShjbGtzLT5hX2NsayksIGNsa19nZXRfcmF0ZShjbGtzLT5iX2NsayksCisJICAgICAgIGNsa19nZXRfcmF0ZShjbGtzLT5jX2NsaykpOworCisJLyogdGhlIHBvd2VyIG9uICovCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDcpIHsKKwkJcHJfZXJyKCJwb3dlcmluZyBvbiB3YXZlNTIxIGZvciB0N1xuIik7CisJCXZkZWNfcG93ZXJvbihWREVDX1dBVkUpOworCQltZGVsYXkoNSk7CisJCXByX2Vycigid2F2ZSBwb3dlciBzdGF1dHMgYWZ0ZXIgcG93ZXJvbjogJWRcbiIsIHZkZWNfb24oVkRFQ19XQVZFKSk7CisJfSBlbHNlIHsKKwkJcHdyX2N0cmxfcHNjaV9zbWMoUERJRF9UN19ET1NfV0FWRSwgdHJ1ZSk7CisJCW1kZWxheSg1KTsKKwkJcHJfZXJyKCJ3YXZlIHBvd2VyIHN0YXV0cyBhZnRlciBwb3dlcm9uOiAlbHVcbiIsIHB3cl9jdHJsX3N0YXR1c19wc2NpX3NtYyhQRElEX1Q3X0RPU19XQVZFKSk7CisJfQorCisJLyogcmVzZXQgKi8KKwlod19yZXNldCh0cnVlKTsKKwltZGVsYXkoNSk7CisJaHdfcmVzZXQoZmFsc2UpOworCS8qIGdhdGUgdGhlIGNsb2NrcyAqLworI2lmZGVmIFZQVV9TVVBQT1JUX0NMT0NLX0NPTlRST0wKKwlwcl9lcnIoInZwdV9jbGtfZW5hYmxlLCBub3cgZ2F0ZSBvZmYgdGhlIGNsb2NrXG4iKTsKKwljbGtfZGlzYWJsZShjbGtzLT5jX2Nsayk7CisJY2xrX2Rpc2FibGUoY2xrcy0+Yl9jbGspOworCWNsa19kaXNhYmxlKGNsa3MtPmFfY2xrKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCB2cHVfY2xrX2Rpc2FibGUoc3RydWN0IHZwdV9jbGtzICpjbGtzKQoreworI2lmZGVmIFZQVV9TVVBQT1JUX0NMT0NLX0NPTlRST0wKKwlpZiAoY2xvY2tfZ2F0ZV9jb3VudCA+IDApCisjZW5kaWYKKwl7CisJCWVuY19wcihMT0dfSU5GTywgInZwdSB1bmNsb3NlZCBjbG9jayAlZFxuIiwgY2xvY2tfZ2F0ZV9jb3VudCk7CisJCWNsa19kaXNhYmxlKGNsa3MtPmNfY2xrKTsKKwkJY2xrX2Rpc2FibGUoY2xrcy0+Yl9jbGspOworCQljbGtfZGlzYWJsZShjbGtzLT5hX2Nsayk7CisJCWNsb2NrX2dhdGVfY291bnQgPSAwOworCX0KKwljbGtfdW5wcmVwYXJlKGNsa3MtPmNfY2xrKTsKKwljbGtfdW5wcmVwYXJlKGNsa3MtPmJfY2xrKTsKKwljbGtfdW5wcmVwYXJlKGNsa3MtPmFfY2xrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoY2xrcy0+ZG9zX2FwYl9jbGspOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShjbGtzLT5kb3NfY2xrKTsKKwkvKiB0aGUgcG93ZXIgb2ZmICovCisJLyogdGhlIHBvd2VyIG9uICovCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA9PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfVDcpIHsKKwkJcHJfZXJyKCJwb3dlcmluZyBvZmYgd2F2ZTUyMSBmb3IgdDdcbiIpOworCQl2ZGVjX3Bvd2Vyb24oVkRFQ19XQVZFKTsKKwkJbWRlbGF5KDUpOworCQlwcl9lcnIoIndhdmUgcG93ZXIgc3RhdXRzIGFmdGVyIHBvd2Vyb2ZmOiAlZFxuIiwgdmRlY19vbihWREVDX1dBVkUpKTsKKwl9IGVsc2UgeworCQlwd3JfY3RybF9wc2NpX3NtYyhQRElEX1Q3X0RPU19XQVZFLCBmYWxzZSk7CisJCW1kZWxheSg1KTsKKwkJcHJfZXJyKCJ3YXZlIHBvd2VyIHN0YXV0cyBhZnRlciBwb3dlcm9mZjogJWx1XG4iLCBwd3JfY3RybF9zdGF0dXNfcHNjaV9zbWMoUERJRF9UN19ET1NfV0FWRSkpOworCX0KK30KKworLyogZW5kIGN1c3RvbWVyIGRlZmluaXRpb24gKi8KK3N0YXRpYyBzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90IHNfaW5zdGFuY2VfcG9vbCA9IHswfTsKK3N0YXRpYyBzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90IHNfY29tbW9uX21lbW9yeSA9IHswfTsKK3N0YXRpYyBzdHJ1Y3QgdnB1X2Rydl9jb250ZXh0X3Qgc192cHVfZHJ2X2NvbnRleHQ7CitzdGF0aWMgczMyIHNfdnB1X21ham9yOworc3RhdGljIHMzMiBzX3JlZ2lzdGVyX2ZsYWc7CitzdGF0aWMgc3RydWN0IGRldmljZSAqbXVsdGllbmNfZGV2OworCitzdGF0aWMgczMyIHNfdnB1X29wZW5fcmVmX2NvdW50Oworc3RhdGljIHMzMiBzX3ZwdV9pcnE7CitzdGF0aWMgYm9vbCBzX3ZwdV9pcnFfcmVxdWVzdGVkOworCitzdGF0aWMgc3RydWN0IHZwdWRydl9idWZmZXJfdCBzX3ZwdV9yZWdpc3RlciA9IHswfTsKKworc3RhdGljIHMzMiBzX2ludGVycnVwdF9mbGFnW01BWF9OVU1fSU5TVEFOQ0VdOworc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IHNfaW50ZXJydXB0X3dhaXRfcVtNQVhfTlVNX0lOU1RBTkNFXTsKK3N0YXRpYyBzdHJ1Y3Qga2ZpZm8gc19pbnRlcnJ1cHRfcGVuZGluZ19xW01BWF9OVU1fSU5TVEFOQ0VdOworc3RhdGljIHMzMiBzX2ZpZm9fYWxsb2NfZmxhZ1tNQVhfTlVNX0lOU1RBTkNFXTsKK3N0YXRpYyBzcGlubG9ja190IHNfa2ZpZm9fbG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKHNfa2ZpZm9fbG9jayk7CisKK3N0YXRpYyBzcGlubG9ja190IHNfdnB1X2xvY2sgPSBfX1NQSU5fTE9DS19VTkxPQ0tFRChzX3ZwdV9sb2NrKTsKK3N0YXRpYyBERUZJTkVfU0VNQVBIT1JFKHNfdnB1X3NlbSk7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBzX3ZicF9oZWFkID0gTElTVF9IRUFEX0lOSVQoc192YnBfaGVhZCk7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBzX2luc3RfbGlzdF9oZWFkID0gTElTVF9IRUFEX0lOSVQoc19pbnN0X2xpc3RfaGVhZCk7CitzdGF0aWMgc3RydWN0IHRhc2tsZXRfc3RydWN0IG11bHRpZW5jX3Rhc2tsZXQ7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbXVsdGllbmNfcGRldjsKKworc3RhdGljIHN0cnVjdCB2cHVfYml0X2Zpcm13YXJlX2luZm9fdCBzX2JpdF9maXJtd2FyZV9pbmZvW01BWF9OVU1fVlBVX0NPUkVdOworCitzdGF0aWMgc3BpbmxvY2tfdCBzX2RtYV9idWZfbG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKHNfZG1hX2J1Zl9sb2NrKTsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHNfZG1hX2J1ZnBfaGVhZCA9IExJU1RfSEVBRF9JTklUKHNfZG1hX2J1ZnBfaGVhZCk7CisKK3N0YXRpYyBzMzIgdnB1X3NyY19hZGRyX2NvbmZpZyhzdHJ1Y3QgdnB1ZHJ2X2RtYV9idWZfaW5mb190ICpkbWFfaW5mbywKKwkJc3RydWN0IGZpbGUgKmZpbHApOworc3RhdGljIHMzMiB2cHVfc3JjX2FkZHJfdW5tYXAoc3RydWN0IHZwdWRydl9kbWFfYnVmX2luZm9fdCAqZG1hX2luZm8sCisJCXN0cnVjdCBmaWxlICpmaWxwKTsKK3N0YXRpYyB2b2lkIHZwdV9kbWFfYnVmZmVyX3VubWFwKHN0cnVjdCB2cHVfZG1hX2NmZyAqY2ZnKTsKKworc3RhdGljIHZvaWQgZG1hX2ZsdXNoKHUzMiBidWZfc3RhcnQsIHUzMiBidWZfc2l6ZSkKK3sKKwlpZiAobXVsdGllbmNfcGRldikKKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoCisJCQkmbXVsdGllbmNfcGRldi0+ZGV2LCBidWZfc3RhcnQsCisJCQlidWZfc2l6ZSwgRE1BX1RPX0RFVklDRSk7Cit9CisKK3N0YXRpYyB2b2lkIGNhY2hlX2ZsdXNoKHUzMiBidWZfc3RhcnQsIHUzMiBidWZfc2l6ZSkKK3sKKwlpZiAobXVsdGllbmNfcGRldikKKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoCisJCQkmbXVsdGllbmNfcGRldi0+ZGV2LCBidWZfc3RhcnQsCisJCQlidWZfc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKK30KKworczMyIHZwdV9od19yZXNldCh2b2lkKQoreworCWVuY19wcihMT0dfREVCVUcsICJyZXF1ZXN0IHZwdSByZXNldCBmcm9tIGFwcGxpY2F0aW9uXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdnB1X2Nsa19jb25maWcoaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgdnB1X2Nsa3MgKmNsa3MgPSAmc192cHVfY2xrczsKKworCWVuY19wcihMT0dfSU5GTywgIiB2cHUgY2xvY2sgY29uZmlnICVkXG4iLCBlbmFibGUpOworCisJaWYgKGVuYWJsZSA9PSAwKSB7CisJCWNsb2NrX2dhdGVfY291bnQgLS07CisJCWlmIChjbG9ja19nYXRlX2NvdW50ID09IDApIHsKKwkJCWNsa19kaXNhYmxlKGNsa3MtPmNfY2xrKTsKKwkJCWNsa19kaXNhYmxlKGNsa3MtPmJfY2xrKTsKKwkJCWNsa19kaXNhYmxlKGNsa3MtPmFfY2xrKTsKKwkJfSBlbHNlIGlmIChjbG9ja19nYXRlX2NvdW50IDwgMCkKKwkJCWVuY19wcihMT0dfRVJST1IsICJ2cHUgY2xvY2sgYWxyZWR5IGNsb3NlZCAlZFxuIiwKKwkJCQljbG9ja19nYXRlX2NvdW50KTsKKwl9IGVsc2UgeworCQljbG9ja19nYXRlX2NvdW50ICsrOworCQlpZiAoY2xvY2tfZ2F0ZV9jb3VudCA9PSAxKSB7CisJCQljbGtfZW5hYmxlKGNsa3MtPmFfY2xrKTsKKwkJCWNsa19lbmFibGUoY2xrcy0+Yl9jbGspOworCQkJY2xrX2VuYWJsZShjbGtzLT5jX2Nsayk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzMzIgdnB1X2FsbG9jX2RtYV9idWZmZXIoc3RydWN0IHZwdWRydl9idWZmZXJfdCAqdmIpCit7CisJaWYgKCF2YikKKwkJcmV0dXJuIC0xOworCisJdmItPnBoeXNfYWRkciA9ICh1bG9uZyl2bWVtX2FsbG9jKCZzX3ZtZW0sIHZiLT5zaXplLCAwKTsKKwlpZiAoKHVsb25nKXZiLT5waHlzX2FkZHIgPT0gKHVsb25nKS0xKSB7CisJCWVuY19wcihMT0dfRVJST1IsCisJCQkiUGh5c2ljYWwgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3Igc2l6ZT0lZFxuIiwKKwkJCXZiLT5zaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWVuY19wcihMT0dfSU5GTywKKwkJIiVzOiB2Yi0+cGh5c19hZGRyIDB4JWx4XG4iLCBfX2Z1bmNfXywKKwkJdmItPnBoeXNfYWRkcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZwdV9mcmVlX2RtYV9idWZmZXIoc3RydWN0IHZwdWRydl9idWZmZXJfdCAqdmIpCit7CisJaWYgKCF2YikKKwkJcmV0dXJuOworCWVuY19wcihMT0dfSU5GTywgInZwdV9mcmVlX2RtYV9idWZmZXIgMHglbHhcbiIsdmItPnBoeXNfYWRkcik7CisKKwlpZiAodmItPnBoeXNfYWRkcikKKwkJdm1lbV9mcmVlKCZzX3ZtZW0sIHZiLT5waHlzX2FkZHIsIDApOworfQorCitzdGF0aWMgczMyIHZwdV9mcmVlX2luc3RhbmNlcyhzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgdnB1ZHJ2X2luc3RhbmFjZV9saXN0X3QgKnZpbCwgKm47CisJc3RydWN0IHZwdWRydl9pbnN0YW5jZV9wb29sX3QgKnZpcDsKKwl2b2lkICp2aXBfYmFzZTsKKwlzMzIgaW5zdGFuY2VfcG9vbF9zaXplX3Blcl9jb3JlOworCXZvaWQgKnZkaV9tdXRleGVzX2Jhc2U7CisJY29uc3QgczMyIFBUSFJFQURfTVVURVhfVF9ERVNUUk9ZX1ZBTFVFID0gMHhkZWFkMTBjYzsKKworCWVuY19wcihMT0dfREVCVUcsICJbVlBVRFJWXSB2cHVfZnJlZV9pbnN0YW5jZXNcbiIpOworCisJLyogc19pbnN0YW5jZV9wb29sLnNpemUgd2FzIGFzc2lnbmVkIHRvIHRoZSBzaXplIG9mIGFsbCBjb3JlIG9uY2UKKwkJY2FsbCBWRElfSU9DVExfR0VUX0lOU1RBTkNFX1BPT0wgYnkgdXNlci4gKi8KKwlpbnN0YW5jZV9wb29sX3NpemVfcGVyX2NvcmUgPSAoc19pbnN0YW5jZV9wb29sLnNpemUvTUFYX05VTV9WUFVfQ09SRSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodmlsLCBuLCAmc19pbnN0X2xpc3RfaGVhZCwgbGlzdCkgeworCQlpZiAodmlsLT5maWxwID09IGZpbHApIHsKKwkJCXZpcF9iYXNlID0gKHZvaWQgKikoc19pbnN0YW5jZV9wb29sLmJhc2UgKworCQkJCShpbnN0YW5jZV9wb29sX3NpemVfcGVyX2NvcmUqdmlsLT5jb3JlX2lkeCkpOworCQkJZW5jX3ByKExPR19JTkZPLAorCQkJCSJmcmVlX2lucyBJZHg9JWQsIGNvcmU9JWQsIGJhc2U9JXAsIHN6PSVkXG4iLAorCQkJCShzMzIpdmlsLT5pbnN0X2lkeCwgKHMzMil2aWwtPmNvcmVfaWR4LAorCQkJCXZpcF9iYXNlLAorCQkJCShzMzIpaW5zdGFuY2VfcG9vbF9zaXplX3Blcl9jb3JlKTsKKwkJCXZpcCA9IChzdHJ1Y3QgdnB1ZHJ2X2luc3RhbmNlX3Bvb2xfdCAqKXZpcF9iYXNlOworCQkJaWYgKHZpcCkgeworCQkJCS8qCW9ubHkgZmlyc3QgNCBieXRlIGlzIGtleSBwb2ludAorCQkJCSAqCShpblVzZSBvZiBDb2RlY0luc3QgaW4gdnB1YXBpKQorCQkJCSAqCXRvIGZyZWUgdGhlIGNvcnJlc3BvbmRpbmcgaW5zdGFuY2UuCisJCQkJICovCisJCQkJbWVtc2V0KCZ2aXAtPmNvZGVjSW5zdFBvb2xbdmlsLT5pbnN0X2lkeF0sCisJCQkJCTB4MDAsIDQpOworCisjZGVmaW5lIFBUSFJFQURfTVVURVhfVF9IQU5ETEVfU0laRSA0CisJCQkJdmRpX211dGV4ZXNfYmFzZSA9ICh2aXBfYmFzZSArCisJCQkJCShpbnN0YW5jZV9wb29sX3NpemVfcGVyX2NvcmUgLQorCQkJCQlQVEhSRUFEX01VVEVYX1RfSEFORExFX1NJWkUqNCkpOworCQkJCWVuY19wcihMT0dfSU5GTywKKwkJCQkJIkZvcmNlIGRlc3Ryb3kgaW4gdXNlciBzcGFjZSAiKTsKKwkJCQllbmNfcHIoTE9HX0lORk8sIiB2ZGlfbXV0ZXhfYmFzZT0lcCBcbiIsCisJCQkJCXZkaV9tdXRleGVzX2Jhc2UpOworCQkJCWlmICh2ZGlfbXV0ZXhlc19iYXNlKSB7CisJCQkJCXMzMiBpOworCQkJCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQkJCQltZW1jcHkodmRpX211dGV4ZXNfYmFzZSwKKwkJCQkJCSZQVEhSRUFEX01VVEVYX1RfREVTVFJPWV9WQUxVRSwKKwkJCQkJCVBUSFJFQURfTVVURVhfVF9IQU5ETEVfU0laRSk7CisJCQkJCQl2ZGlfbXV0ZXhlc19iYXNlICs9CisJCQkJCQlQVEhSRUFEX01VVEVYX1RfSEFORExFX1NJWkU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlzcGluX2xvY2soJnNfdnB1X2xvY2spOworCQkJc192cHVfb3Blbl9yZWZfY291bnQtLTsKKwkJCWxpc3RfZGVsKCZ2aWwtPmxpc3QpOworCQkJc3Bpbl91bmxvY2soJnNfdnB1X2xvY2spOworCQkJa2ZyZWUodmlsKTsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHMzMiB2cHVfZnJlZV9idWZmZXJzKHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCB2cHVkcnZfYnVmZmVyX3Bvb2xfdCAqcG9vbCwgKm47CisJc3RydWN0IHZwdWRydl9idWZmZXJfdCB2YjsKKworCWVuY19wcihMT0dfREVCVUcsICJ2cHVfZnJlZV9idWZmZXJzXG4iKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9vbCwgbiwgJnNfdmJwX2hlYWQsIGxpc3QpIHsKKwkJaWYgKHBvb2wtPmZpbHAgPT0gZmlscCkgeworCQkJdmIgPSBwb29sLT52YjsKKwkJCWlmICh2Yi5waHlzX2FkZHIpIHsKKwkJCQl2cHVfZnJlZV9kbWFfYnVmZmVyKCZ2Yik7CisJCQkJc3Bpbl9sb2NrKCZzX3ZwdV9sb2NrKTsKKwkJCQlsaXN0X2RlbCgmcG9vbC0+bGlzdCk7CisJCQkJc3Bpbl91bmxvY2soJnNfdnB1X2xvY2spOworCQkJCWtmcmVlKHBvb2wpOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIHZwdV9pc19idWZmZXJfY2FjaGVkKHN0cnVjdCBmaWxlICpmaWxwLCB1bG9uZyB2bV9wZ29mZikKK3sKKwlzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl9wb29sX3QgKnBvb2wsICpuOworCXN0cnVjdCB2cHVkcnZfYnVmZmVyX3QgdmI7CisJYm9vbCBmaW5kID0gZmFsc2U7CisJdTMyIGNhY2hlZCA9IDA7CisKKwllbmNfcHIoTE9HX0FMTCwgIlsrXXZwdV9pc19idWZmZXJfY2FjaGVkXG4iKTsKKwlzcGluX2xvY2soJnNfdnB1X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb29sLCBuLCAmc192YnBfaGVhZCwgbGlzdCkgeworCQlpZiAocG9vbC0+ZmlscCA9PSBmaWxwKSB7CisJCQl2YiA9IHBvb2wtPnZiOworCQkJaWYgKCgodmIucGh5c19hZGRyID4+IFBBR0VfU0hJRlQpID09IHZtX3Bnb2ZmKQorCQkJCSYmIGZpbmQgPT0gZmFsc2UpeworCQkJCWNhY2hlZCA9IHZiLmNhY2hlZDsKKwkJCQlmaW5kID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlzcGluX3VubG9jaygmc192cHVfbG9jayk7CisJZW5jX3ByKExPR19BTEwsICJbLV12cHVfaXNfYnVmZmVyX2NhY2hlZCwgcmV0OiVkXG4iLCBjYWNoZWQpOworCXJldHVybiBjYWNoZWQ7Cit9CisKK3N0YXRpYyBzMzIgdnB1X2RtYV9idWZfcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgdnB1ZHJ2X2RtYV9idWZfcG9vbF90ICpwb29sLCAqbjsKKwlzdHJ1Y3QgdnB1X2RtYV9jZmcgdmI7CisKKwllbmNfcHIoTE9HX0RFQlVHLCAidnB1X3JlbGVhc2VfZG1hX2J1ZmZlcnNcbiIpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb29sLCBuLCAmc19kbWFfYnVmcF9oZWFkLCBsaXN0KSB7CisJCWlmIChwb29sLT5maWxwID09IGZpbHApIHsKKwkJCXZiID0gcG9vbC0+ZG1hX2NmZzsKKwkJCWlmICh2Yi5hdHRhY2gpIHsKKwkJCQl2cHVfZG1hX2J1ZmZlcl91bm1hcCgmdmIpOworCQkJCXNwaW5fbG9jaygmc19kbWFfYnVmX2xvY2spOworCQkJCWxpc3RfZGVsKCZwb29sLT5saXN0KTsKKwkJCQlzcGluX3VubG9jaygmc19kbWFfYnVmX2xvY2spOworCQkJCWtmcmVlKHBvb2wpOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBnZXRfaW5zdF9pZHgodTMyIHJlZ192YWwpCit7CisJdTMyIGluc3RfaWR4OworCWludCBpOworCWZvciAoaT0wOyBpIDwgTUFYX05VTV9JTlNUQU5DRTsgaSsrKQorCXsKKwkJaWYgKCgocmVnX3ZhbCA+PiBpKSYweDAxKSA9PSAxKQorCQkJYnJlYWs7CisJfQorCWluc3RfaWR4ID0gaTsKKwlyZXR1cm4gaW5zdF9pZHg7Cit9CisKK3N0YXRpYyBzMzIgZ2V0X3ZwdV9pbnN0X2lkeChzdHJ1Y3QgdnB1X2Rydl9jb250ZXh0X3QgKmRldiwgdTMyICpyZWFzb24sCisJCQkgICAgdTMyIGVtcHR5X2luc3QsIHUzMiBkb25lX2luc3QsIHUzMiBzZXFfaW5zdCkKK3sKKwlzMzIgaW5zdF9pZHg7CisJdTMyIHJlZ192YWw7CisJdTMyIGludF9yZWFzb247CisKKwlpbnRfcmVhc29uID0gKnJlYXNvbjsKKwllbmNfcHIoTE9HX0lORk8sCisJCSJbK10lcywgcmVhc29uPTB4JXgsIGVtcHR5X2luc3Q9MHgleCwgZG9uZV9pbnN0PTB4JXhcbiIsCisJCV9fZnVuY19fLCBpbnRfcmVhc29uLCBlbXB0eV9pbnN0LCBkb25lX2luc3QpOworCisJaWYgKGludF9yZWFzb24gJiAoMSA8PCBJTlRfQlNCVUZfRU1QVFkpKQorCXsKKwkJcmVnX3ZhbCA9IChlbXB0eV9pbnN0ICYgMHhmZmZmKTsKKwkJaW5zdF9pZHggPSBnZXRfaW5zdF9pZHgocmVnX3ZhbCk7CisJCSpyZWFzb24gPSAoMSA8PCBJTlRfQlNCVUZfRU1QVFkpOworCQllbmNfcHIoTE9HX0RFQlVHLAorCQkJIiVzLCBSRVRfQlNfRU1QVFlfSU5TVCByZWdfdmFsPTB4JXgsIGluc3RfaWR4PSVkXG4iLAorCQkJX19mdW5jX18sIHJlZ192YWwsIGluc3RfaWR4KTsKKwkJZ290byBHRVRfVlBVX0lOU1RfSURYX0hBTkRMRUQ7CisJfQorCisJaWYgKGludF9yZWFzb24gJiAoMSA8PCBJTlRfSU5JVF9TRVEpKQorCXsKKwkJcmVnX3ZhbCA9IChzZXFfaW5zdCAmIDB4ZmZmZik7CisJCWluc3RfaWR4ID0gZ2V0X2luc3RfaWR4KHJlZ192YWwpOworCQkqcmVhc29uID0gKDEgPDwgSU5UX0lOSVRfU0VRKTsKKwkJZW5jX3ByKExPR19ERUJVRywKKwkJCSIlcywgUkVUX1FVRVVFX0NNRF9ET05FIElOSVRfU0VRIHZhbD0weCV4LCBpZHg9JWRcbiIsCisJCQlfX2Z1bmNfXywgcmVnX3ZhbCwgaW5zdF9pZHgpOworCQlnb3RvIEdFVF9WUFVfSU5TVF9JRFhfSEFORExFRDsKKwl9CisKKwlpZiAoaW50X3JlYXNvbiAmICgxIDw8IElOVF9ERUNfUElDKSkKKwl7CisJCXJlZ192YWwgPSAoZG9uZV9pbnN0ICYgMHhmZmZmKTsKKwkJaW5zdF9pZHggPSBnZXRfaW5zdF9pZHgocmVnX3ZhbCk7CisJCSpyZWFzb24gPSAoMSA8PCBJTlRfREVDX1BJQyk7CisJCWVuY19wcihMT0dfSU5GTywKKwkJCSIlcywgUkVUX1FVRVVFX0NNRF9ET05FIERFQ19QSUMgdmFsPTB4JXgsIGlkeD0lZFxuIiwKKwkJCV9fZnVuY19fLCByZWdfdmFsLCBpbnN0X2lkeCk7CisKKwkJaWYgKGludF9yZWFzb24gJiAoMSA8PCBJTlRfRU5DX0xPV19MQVRFTkNZKSkKKwkJeworCQkJdTMyIGxsX2luc3RfaWR4OworCQkJcmVnX3ZhbCA9IChkb25lX2luc3QgPj4gMTYpOworCQkJbGxfaW5zdF9pZHggPSBnZXRfaW5zdF9pZHgocmVnX3ZhbCk7CisJCQlpZiAobGxfaW5zdF9pZHggPT0gaW5zdF9pZHgpCisJCQkJKnJlYXNvbiA9ICgoMSA8PCBJTlRfREVDX1BJQykKKwkJCQkJfCAoMSA8PCBJTlRfRU5DX0xPV19MQVRFTkNZKSk7CisJCQllbmNfcHIoTE9HX0RFQlVHLCAiJXMsIExPV19MQVRFTkNZICIsIF9fZnVuY19fKTsKKwkJCWVuY19wcihMT0dfREVCVUcsICJ2YWw9MHgleCwgaWR4PSVkLCBsbF9pZHg9JWRcbiIsCisJCQkJcmVnX3ZhbCwgaW5zdF9pZHgsIGxsX2luc3RfaWR4KTsKKwkJfQorCQlnb3RvIEdFVF9WUFVfSU5TVF9JRFhfSEFORExFRDsKKwl9CisKKwlpZiAoaW50X3JlYXNvbiAmICgxIDw8IElOVF9FTkNfU0VUX1BBUkFNKSkKKwl7CisJCXJlZ192YWwgPSAoc2VxX2luc3QgJiAweGZmZmYpOworCQlpbnN0X2lkeCA9IGdldF9pbnN0X2lkeChyZWdfdmFsKTsKKwkJKnJlYXNvbiA9ICgxIDw8IElOVF9FTkNfU0VUX1BBUkFNKTsKKwkJZW5jX3ByKExPR19ERUJVRywKKwkJCSIlcywgUkVUX1FVRVVFX0NNRF9ET05FIFNFVF9QQVJBTSB2YWw9MHgleCwgaWR4PSVkXG4iLAorCQkJX19mdW5jX18sIHJlZ192YWwsIGluc3RfaWR4KTsKKwkJZ290byBHRVRfVlBVX0lOU1RfSURYX0hBTkRMRUQ7CisJfQorCisjaWZkZWYgU1VQUE9SVF9TT1VSQ0VfUkVMRUFTRV9JTlRFUlJVUFQKKwlpZiAoaW50X3JlYXNvbiAmICgxIDw8IElOVF9FTkNfU1JDX1JFTEVBU0UpKQorCXsKKwkJcmVnX3ZhbCA9IChkb25lX2luc3QgJiAweGZmZmYpOworCQlpbnN0X2lkeCA9IGdldF9pbnN0X2lkeChyZWdfdmFsKTsKKwkJKnJlYXNvbiA9ICgxIDw8IElOVF9FTkNfU1JDX1JFTEVBU0UpOworCQllbmNfcHIoTE9HX0RFQlVHLAorCQkJIiVzLCBSRVRfUVVFVUVfQ01EX0RPTkUgU1JDX1JFTEVBU0UgIiwKKwkJCV9fZnVuY19fKTsKKwkJZW5jX3ByKExPR19ERUJVRywKKwkJCSJ2YWw9MHgleCwgaWR4PSVkXG4iLCByZWdfdmFsLCBpbnN0X2lkeCk7CisJCWdvdG8gR0VUX1ZQVV9JTlNUX0lEWF9IQU5ETEVEOworCX0KKyNlbmRpZgorCisJaWYgKGludF9yZWFzb24gJiAoMSA8PCBJTlRfRU5DX0xPV19MQVRFTkNZKSkKKwl7CisJCXJlZ192YWwgPSAoZG9uZV9pbnN0ID4+IDE2KTsKKwkJaW5zdF9pZHggPSBnZXRfaW5zdF9pZHgocmVnX3ZhbCk7CisJCSpyZWFzb24gPSAoMSA8PCBJTlRfRU5DX0xPV19MQVRFTkNZKTsKKwkJZW5jX3ByKExPR19ERUJVRywKKwkJCSIlcywgUkVUX1FVRVVFX0NNRF9ET05FIExPV19MQVRFTkNZICIsCisJCQlfX2Z1bmNfXyk7CisJCWVuY19wcihMT0dfREVCVUcsCisJCQkidmFsPTB4JXgsIGlkeD0lZFxuIiwgcmVnX3ZhbCwgaW5zdF9pZHgpOworCQlnb3RvIEdFVF9WUFVfSU5TVF9JRFhfSEFORExFRDsKKwl9CisKKwlpbnN0X2lkeCA9IC0xOworCSpyZWFzb24gPSAwOworCWVuY19wcihMT0dfREVCVUcsCisJCSIlcywgVU5LTk9XTiBJTlRFUlJVUFQgUkVBU09OOiAweCUwOHhcbiIsCisJCV9fZnVuY19fLCBpbnRfcmVhc29uKTsKKworR0VUX1ZQVV9JTlNUX0lEWF9IQU5ETEVEOgorCisJZW5jX3ByKExPR19JTkZPLCAiWy1dJXMsIGluc3RfaWR4PSVkLiAqcmVhc29uPTB4JXhcbiIsIF9fZnVuY19fLAorCQlpbnN0X2lkeCwgKnJlYXNvbik7CisKKwlyZXR1cm4gaW5zdF9pZHg7Cit9CisKK3N0YXRpYyB2b2lkIG11bHRpZW5jX2lzcl90YXNrbGV0KHVsb25nIGRhdGEpCit7CisJdTMyIGludHJfcmVhc29uOworCXUzMiBpbnN0X2luZGV4OworCXN0cnVjdCB2cHVfZHJ2X2NvbnRleHRfdCAqZGV2ID0gKHN0cnVjdCB2cHVfZHJ2X2NvbnRleHRfdCAqKWRhdGE7CisKKwkvKiBub3RpZnkgdGhlIGludGVycnVwdCB0byB1c2VyIHNwYWNlICovCisJaWYgKGRldi0+YXN5bmNfcXVldWUpIHsKKwkJZW5jX3ByKExPR19BTEwsICJraWxsX2Zhc3luYyBlICVzXG4iLCBfX2Z1bmNfXyk7CisJCWtpbGxfZmFzeW5jKCZkZXYtPmFzeW5jX3F1ZXVlLCBTSUdJTywgUE9MTF9JTik7CisJfQorCisJZm9yIChpbnN0X2luZGV4PTA7IGluc3RfaW5kZXggPCBNQVhfTlVNX0lOU1RBTkNFOyBpbnN0X2luZGV4KyspIHsKKwkJaW50cl9yZWFzb24gPSBkZXYtPmludGVycnVwdF9mbGFnW2luc3RfaW5kZXhdOworCQlpZiAoaW50cl9yZWFzb24pIHsKKwkJCWRldi0+aW50ZXJydXB0X2ZsYWdbaW5zdF9pbmRleF0gPSAwOworCQkJZW5jX3ByKExPR19JTkZPLAorCQkJCSJpc3JfdGFza2xldCBpbnRyOjB4JTA4eCBpbnNfaW5kZXggJWRcbiIsCisJCQkJaW50cl9yZWFzb24sIGluc3RfaW5kZXgpOworCQkJc19pbnRlcnJ1cHRfZmxhZ1tpbnN0X2luZGV4XSA9IDE7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNfaW50ZXJydXB0X3dhaXRfcVtpbnN0X2luZGV4XSk7CisJCX0KKwl9CisJZW5jX3ByKExPR19BTEwsICJbLV0lc1xuIiwgX19mdW5jX18pOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgdnB1X2lycV9oYW5kbGVyKHMzMiBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgdnB1X2Rydl9jb250ZXh0X3QgKmRldiA9IChzdHJ1Y3QgdnB1X2Rydl9jb250ZXh0X3QgKilkZXZfaWQ7CisJLyogdGhpcyBjYW4gYmUgcmVtb3ZlZC4KKwkgKglpdCBhbHNvIHdvcmsgaW4gVlBVX1dhaXRJbnRlcnJ1cHQgb2YgQVBJIGZ1bmN0aW9uCisJICovCisJdTMyIGNvcmU7CisJdTMyIGludHJfcmVhc29uOworCXUzMiBpbnRyX2luc3RfaW5kZXg7CisKKwllbmNfcHIoTE9HX0FMTCwgIlsrXSVzXG4iLCBfX2Z1bmNfXyk7CisKKyNpZmRlZiBWUFVfSVJRX0NPTlRST0wKKwlkaXNhYmxlX2lycV9ub3N5bmMoc192cHVfaXJxKTsKKyNlbmRpZgorCisJaW50cl9pbnN0X2luZGV4ID0gMDsKKwlpbnRyX3JlYXNvbiA9IDA7CisKKwlmb3IgKGNvcmUgPSAwOyBjb3JlIDwgTUFYX05VTV9WUFVfQ09SRTsgY29yZSsrKSB7CisJCXUzMiBlbXB0eV9pbnN0OworCQl1MzIgZG9uZV9pbnN0OworCQl1MzIgc2VxX2luc3Q7CisJCXUzMiBpLCByZWFzb24sIHJlYXNvbl9jbHI7CisJCWlmIChzX2JpdF9maXJtd2FyZV9pbmZvW2NvcmVdLnNpemUgPT0gMCkgeworCQkJLyogaXQgbWVhbnMgdGhhdCB3ZSBkaWRuJ3QgZ2V0IGFuIGluZm9ybWF0aW9uCisJCQkgKgl0aGUgY3VycmVudCBjb3JlIGZyb20gQVBJIGxheWVyLgorCQkJICoJTm8gY29yZSBhY3RpdmF0ZWQuCisJCQkgKi8KKwkJCWVuY19wcihMT0dfRVJST1IsCisJCQkJInNfYml0X2Zpcm13YXJlX2luZm9bY29yZV0uc2l6ZSBpcyB6ZXJvXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChSZWFkVnB1UmVnaXN0ZXIoVlA1X1ZQVV9WUFVfSU5UX1NUUykgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlyZWFzb24gPSBSZWFkVnB1UmVnaXN0ZXIoVlA1X1ZQVV9JTlRfUkVBU09OKTsKKwkJZW1wdHlfaW5zdCA9IFJlYWRWcHVSZWdpc3RlcihWUDVfUkVUX0JTX0VNUFRZX0lOU1QpOworCQlkb25lX2luc3QgPSBSZWFkVnB1UmVnaXN0ZXIoVlA1X1JFVF9RVUVVRV9DTURfRE9ORV9JTlNUKTsKKwkJc2VxX2luc3QgPSBSZWFkVnB1UmVnaXN0ZXIoVlA1X1JFVF9TRVFfRE9ORV9JTlNUQU5DRV9JTkZPKTsKKwkJcmVhc29uX2NsciAgPSByZWFzb247CisJCWVuY19wcihMT0dfSU5GTywgImlycSByZWFzb249MHgleCwgaW5zdDogZW1wdHk9MHgleCwiLAorCQkgICAgICAgcmVhc29uLCBlbXB0eV9pbnN0KTsKKwkJZW5jX3ByKExPR19JTkZPLCAiIGRvbmU9MHgleCwgc2VxX2luc3Q9MHgleFxuIiwKKwkJICAgICAgIGRvbmVfaW5zdCwgc2VxX2luc3QpOworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9JTlNUQU5DRTsgaSsrKSB7CisJCQlpZiAoZW1wdHlfaW5zdCA9PSAwICYmIGRvbmVfaW5zdCA9PSAwICYmIHNlcV9pbnN0ID09IDApCisJCQkJYnJlYWs7CisKKwkJCWludHJfcmVhc29uID0gcmVhc29uOworCQkJaW50cl9pbnN0X2luZGV4ID0gZ2V0X3ZwdV9pbnN0X2lkeChkZXYsCisJCQkJCQkJICAgJmludHJfcmVhc29uLAorCQkJCQkJCSAgIGVtcHR5X2luc3QsCisJCQkJCQkJICAgZG9uZV9pbnN0LAorCQkJCQkJCSAgIHNlcV9pbnN0KTsKKworCQkJZW5jX3ByKExPR19JTkZPLCAiaXJxIGluc3RhbmNlOiAlZCIsIGludHJfaW5zdF9pbmRleCk7CisJCQllbmNfcHIoTE9HX0lORk8sICIgcmVhc29uOiAlMDh4IiwgaW50cl9yZWFzb24pOworCQkJZW5jX3ByKExPR19JTkZPLCAiIGVtcHR5X2luc3Q6ICUwOHgiLCBlbXB0eV9pbnN0KTsKKwkJCWVuY19wcihMT0dfSU5GTywgIiBkb25lX2luc3Q6ICUwOHgiLCBkb25lX2luc3QpOworCQkJZW5jX3ByKExPR19JTkZPLCAiIHNlcV9pbnN0OiAlMDh4XG4iLCBzZXFfaW5zdCk7CisKKwkJCWlmIChpbnRyX2luc3RfaW5kZXggPCBNQVhfTlVNX0lOU1RBTkNFKSB7CisJCQkJaWYgKGludHJfcmVhc29uID09ICgxIDw8IElOVF9CU0JVRl9FTVBUWSkpIHsKKwkJCQkJZW1wdHlfaW5zdCA9IGVtcHR5X2luc3QgJgorCQkJCQkJfigxIDw8IGludHJfaW5zdF9pbmRleCk7CisJCQkJCVdyaXRlVnB1UmVnaXN0ZXIoVlA1X1JFVF9CU19FTVBUWV9JTlNULAorCQkJCQkJZW1wdHlfaW5zdCk7CisJCQkJCWlmIChlbXB0eV9pbnN0ID09IDApCisJCQkJCQlyZWFzb24gJj0KKwkJCQkJCQl+KDEgPDwgSU5UX0JTQlVGX0VNUFRZKTsKKwkJCQkJZW5jX3ByKExPR19JTkZPLAorCQkJCQkJIiVzLCBSRVRfQlNfRU1QVFlfSU5TVCBDbGVhciAiLAorCQkJCQkJX19mdW5jX18pOworCQkJCQllbmNfcHIoTE9HX0lORk8sCisJCQkJCQkiaW5zdD0weCV4LCBpbmRleD0lZFxuIiwKKwkJCQkJCWVtcHR5X2luc3QsIGludHJfaW5zdF9pbmRleCk7CisJCQkJfQorCQkJCWlmIChpbnRyX3JlYXNvbiA9PSAoMSA8PCBJTlRfREVDX1BJQykpIHsKKwkJCQkJZG9uZV9pbnN0ID0gZG9uZV9pbnN0ICYKKwkJCQkJCX4oMSA8PCBpbnRyX2luc3RfaW5kZXgpOworCQkJCQlXcml0ZVZwdVJlZ2lzdGVyKAorCQkJCQkJVlA1X1JFVF9RVUVVRV9DTURfRE9ORV9JTlNULAorCQkJCQkJZG9uZV9pbnN0KTsKKwkJCQkJaWYgKGRvbmVfaW5zdCA9PSAwKQorCQkJCQkJcmVhc29uICY9IH4oMSA8PCBJTlRfREVDX1BJQyk7CisJCQkJCWVuY19wcihMT0dfSU5GTywKKwkJCQkJCSIlcywgUkVUX1FVRVVFX0NNRF9ET05FICIsCisJCQkJCQlfX2Z1bmNfXyk7CisJCQkJCWVuY19wcihMT0dfSU5GTywKKwkJCQkJCSJpbnN0PTB4JXgsIGluZGV4PSVkXG4iLAorCQkJCQkJZG9uZV9pbnN0LCBpbnRyX2luc3RfaW5kZXgpOworCQkJCX0KKwkJCQlpZiAoKGludHJfcmVhc29uID09ICgxIDw8IElOVF9JTklUX1NFUSkpIHx8CisJCQkJICAgIChpbnRyX3JlYXNvbiA9PQorCQkJCSAgICAoMSA8PCBJTlRfRU5DX1NFVF9QQVJBTSkpKSB7CisJCQkJCXNlcV9pbnN0ID0gc2VxX2luc3QgJgorCQkJCQkJfigxIDw8IGludHJfaW5zdF9pbmRleCk7CisJCQkJCVdyaXRlVnB1UmVnaXN0ZXIKKwkJCQkJCShWUDVfUkVUX1NFUV9ET05FX0lOU1RBTkNFX0lORk8sCisJCQkJCQkgc2VxX2luc3QpOworCQkJCQlpZiAoc2VxX2luc3QgPT0gMCkKKwkJCQkJCXJlYXNvbiAmPSB+KDEgPDwgSU5UX0lOSVRfU0VRIHwKKwkJCQkJCQkxIDw8IElOVF9FTkNfU0VUX1BBUkFNKTsKKworCQkJCQllbmNfcHIoTE9HX0lORk8sICIlcywgUkVUXyIsIF9fZnVuY19fKTsKKwkJCQkJZW5jX3ByKExPR19JTkZPLAorCQkJCQkgICAgICAgIlNFUV9ET05FX0lOU1RBTkNFX0lORk8gaW5zdCIpOworCQkJCQllbmNfcHIoTE9HX0lORk8sCisJCQkJCSAgICAgICAiPTB4JXgsIGludHJfaW5zdF9pbmRleD0lZFxuIiwKKwkJCQkJCWRvbmVfaW5zdCwgaW50cl9pbnN0X2luZGV4KTsKKwkJCQl9CisJCQkJaWYgKGludHJfcmVhc29uID09ICgxIDw8IElOVF9FTkNfTE9XX0xBVEVOQ1kpKSB7CisJCQkJCWRvbmVfaW5zdCA9IChkb25lX2luc3QgPj4gMTYpOworCQkJCQlkb25lX2luc3QgPSBkb25lX2luc3QKKwkJCQkJCSYgfigxIDw8IGludHJfaW5zdF9pbmRleCk7CisJCQkJCWRvbmVfaW5zdCA9IChkb25lX2luc3QgPDwgMTYpOworCQkJCQlXcml0ZVZwdVJlZ2lzdGVyKAorCQkJCQkJVlA1X1JFVF9RVUVVRV9DTURfRE9ORV9JTlNULAorCQkJCQkJZG9uZV9pbnN0KTsKKwkJCQkJaWYgKGRvbmVfaW5zdCA9PSAwKQorCQkJCQkJcmVhc29uICY9CisJCQkJCQl+KDEgPDwgSU5UX0VOQ19MT1dfTEFURU5DWSk7CisKKwkJCQkJZW5jX3ByKExPR19JTkZPLAorCQkJCQkJIiVzLCBMT1dfTEFURU5DWSBDbGVhciAiLAorCQkJCQkJX19mdW5jX18pOworCQkJCQllbmNfcHIoTE9HX0lORk8sCisJCQkJCQkiaW5zdD0weCV4LCBpbmRleD0lZFxuIiwKKwkJCQkJCWRvbmVfaW5zdCwgaW50cl9pbnN0X2luZGV4KTsKKwkJCQl9CisJCQkJaWYgKCFrZmlmb19pc19mdWxsKAorCQkJCQkmc19pbnRlcnJ1cHRfcGVuZGluZ19xW2ludHJfaW5zdF9pbmRleF0KKwkJCQkJKSkgeworCQkJCQlpZiAoaW50cl9yZWFzb24gPT0KKwkJCQkJCSgoMSA8PCBJTlRfRU5DX1BJQykgfAorCQkJCQkJKDEgPDwKKwkJCQkJCUlOVF9FTkNfTE9XX0xBVEVOQ1kpKSkgeworCQkJCQkJdTMyIGxsX2ludHJfcmVhc29uID0KKwkJCQkJCQkoMSA8PAorCQkJCQkJCUlOVF9FTkNfUElDKTsKKwkJCQkJCWtmaWZvX2luX3NwaW5sb2NrZWQoCisJCQkJCQkJJnNfaW50ZXJydXB0X3BlbmRpbmdfcVsKKwkJCQkJCQlpbnRyX2luc3RfaW5kZXhdLAorCQkJCQkJCSZsbF9pbnRyX3JlYXNvbiwKKwkJCQkJCQlzaXplb2YodTMyKSwKKwkJCQkJCQkmc19rZmlmb19sb2NrKTsKKwkJCQkJfSBlbHNlCisJCQkJCQlrZmlmb19pbl9zcGlubG9ja2VkKAorCQkJCQkJCSZzX2ludGVycnVwdF9wZW5kaW5nX3FbCisJCQkJCQkJaW50cl9pbnN0X2luZGV4XSwKKwkJCQkJCQkmaW50cl9yZWFzb24sCisJCQkJCQkJc2l6ZW9mKHUzMiksCisJCQkJCQkJJnNfa2ZpZm9fbG9jayk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQllbmNfcHIoTE9HX0VSUk9SLCAia2ZpZm9faXNfZnVsbCAiKTsKKwkJCQkJZW5jX3ByKExPR19FUlJPUiwKKwkJCQkJCSJrZmlmb19jb3VudCAlZCBpbmRleCAlZFxuIiwKKwkJCQkJCWtmaWZvX2xlbigKKwkJCQkJCSZzX2ludGVycnVwdF9wZW5kaW5nX3FbCisJCQkJCQlpbnRyX2luc3RfaW5kZXhdKSwKKwkJCQkJCWludHJfaW5zdF9pbmRleCk7CisJCQkJfQorCQkJCWRldi0+aW50ZXJydXB0X2ZsYWdbaW50cl9pbnN0X2luZGV4XSA9CisJCQkJCWludHJfcmVhc29uOworCQkJfQorCQkJZWxzZSB7CisJCQkJZW5jX3ByKExPR19FUlJPUiwKKwkJCQkJImludHJfaW5zdF9pbmRleCAoJWQpIGlzIHdyb25nIFxuIiwKKwkJCQkJaW50cl9pbnN0X2luZGV4KTsKKwkJCX0KKwkJCWVuY19wcihMT0dfSU5GTywKKwkJCSAgICAgICAiaW50cl9yZWFzb246IDB4JTA4eFxuIiwgaW50cl9yZWFzb24pOworCQl9CisJCWlmIChyZWFzb24gIT0gMCkgeworCQkJZW5jX3ByKExPR19FUlJPUiwgIklOVEVSUlVQVCBSRUFTT04gUkVNQUlORUQ6ICUwOHhcbiIsCisJCQkgICAgICAgcmVhc29uKTsKKwkJfQorCQlXcml0ZVZwdVJlZ2lzdGVyKFZQNV9WUFVfSU5UX1JFQVNPTl9DTEVBUiwgcmVhc29uX2Nscik7CisJCVdyaXRlVnB1UmVnaXN0ZXIoVlA1X1ZQVV9WSU5UX0NMRUFSLCAweDEpOworCX0KKworCXRhc2tsZXRfc2NoZWR1bGUoJm11bHRpZW5jX3Rhc2tsZXQpOworCWVuY19wcihMT0dfQUxMLCAiWy1dJXNcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKyNkZWZpbmUgUkVTRVRDVFJMX1JFU0VUMV9MRVZFTCAoMHhmZTAwMDA0NCkKKworc3RhdGljIHZvaWQgaHdfcmVzZXQoYm9vbCByZXNldCkKK3sKKwl2b2lkIF9faW9tZW0gKnJlc2V0X2FkZHI7CisJdWludDMyX3QgdmFsOworCisJcmVzZXRfYWRkciA9IGlvcmVtYXBfbm9jYWNoZShSRVNFVENUUkxfUkVTRVQxX0xFVkVMLCA4KTsKKwlpZiAocmVzZXRfYWRkciA9PSBOVUxMKSB7CisJCWVuY19wcihMT0dfRVJST1IsICIlczogRmFpbGVkIHRvIGlvcmVtYXBcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXZhbCA9IF9fcmF3X3JlYWRsKHJlc2V0X2FkZHIpOworCWlmIChyZXNldCkKKwkJdmFsICY9IH4oMSA8PCAyOCk7CisJZWxzZQorCQl2YWwgfD0gKDEgPDwgMjgpOworCV9fcmF3X3dyaXRlbCh2YWwsIHJlc2V0X2FkZHIpOworCisJbWRlbGF5KDUpOworCisJaW91bm1hcChyZXNldF9hZGRyKTsKKwlpZiAocmVzZXQpCisJCWVuY19wcihMT0dfSU5GTywgIiVzOnJlc2V0XG4iLCBfX2Z1bmNfXyk7CisJZWxzZQorCQllbmNfcHIoTE9HX0lORk8sICIlczpyZWxlYXNlIHJlc2V0XG4iLCBfX2Z1bmNfXyk7CisKK30KKworc3RhdGljIHMzMiB2cHVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlib29sIGZpcnN0X29wZW4gPSBmYWxzZTsKKwlzMzIgciA9IDA7CisKKwkvL2VuY19wcihMT0dfREVCVUcsICJbK10gJXMsIGZpbHA9JWx1LCAlbHUsIGZfY291bnQ9JWxsZFxuIiwgX19mdW5jX18sCisJCQkvLyh1bnNpZ25lZCBsb25nKWZpbHAsICggKCh1bnNpZ25lZCBsb25nKWZpbHApJTgpLCBmaWxwLT5mX2NvdW50LmNvdW50ZXIpOworCXNwaW5fbG9jaygmc192cHVfbG9jayk7CisJc192cHVfZHJ2X2NvbnRleHQub3Blbl9jb3VudCsrOworCWlmIChzX3ZwdV9kcnZfY29udGV4dC5vcGVuX2NvdW50ID09IDEpIHsKKwkJZmlyc3Rfb3BlbiA9IHRydWU7CisJfSAvKmVsc2UgeworCQlyID0gLUVCVVNZOworCQlzX3ZwdV9kcnZfY29udGV4dC5vcGVuX2NvdW50LS07CisJCXNwaW5fdW5sb2NrKCZzX3ZwdV9sb2NrKTsKKwkJcmV0dXJuIHI7CisJfSovCisJZmlscC0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKikoJnNfdnB1X2Rydl9jb250ZXh0KTsKKwlzcGluX3VubG9jaygmc192cHVfbG9jayk7CisJaWYgKGZpcnN0X29wZW4gJiYgIXVzZV9yZXNlcnZlKSB7CisjaWZkZWYgQ09ORklHX0NNQQorCQlzX3ZpZGVvX21lbW9yeS5zaXplID0gY21hX2NmZ19zaXplOworCQlzX3ZpZGVvX21lbW9yeS5waHlzX2FkZHIgPSAodWxvbmcpY29kZWNfbW1fYWxsb2NfZm9yX2RtYShWUFVfREVWX05BTUUsIGNtYV9jZmdfc2l6ZSA+PiBQQUdFX1NISUZULCAwLCAwKTsKKworCQlpZiAoc192aWRlb19tZW1vcnkucGh5c19hZGRyKSB7CisJCQllbmNfcHIoTE9HX0RFQlVHLCAiYWxsb2NhdGluZyBwaHlzIDB4JWx4LCAiLCBzX3ZpZGVvX21lbW9yeS5waHlzX2FkZHIpOworCQkJZW5jX3ByKExPR19ERUJVRywgInZpcnQgYWRkciAweCVseCwgc2l6ZSAlZGtcbiIsIHNfdmlkZW9fbWVtb3J5LmJhc2UsIHNfdmlkZW9fbWVtb3J5LnNpemUgPj4gMTApOworCisJCQlpZiAodm1lbV9pbml0KCZzX3ZtZW0sIHNfdmlkZW9fbWVtb3J5LnBoeXNfYWRkciwgc192aWRlb19tZW1vcnkuc2l6ZSkgPCAwKSB7CisJCQkJZW5jX3ByKExPR19FUlJPUiwgImZhaWwgdG8gaW5pdCB2bWVtIHN5c3RlbVxuIik7CisJCQkJciA9IC1FTk9NRU07CisKKwkJCQljb2RlY19tbV9mcmVlX2Zvcl9kbWEoVlBVX0RFVl9OQU1FLCAodTMyKXNfdmlkZW9fbWVtb3J5LnBoeXNfYWRkcik7CisJCQkJdm1lbV9leGl0KCZzX3ZtZW0pOworCQkJCW1lbXNldCgmc192aWRlb19tZW1vcnksIDAsIHNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90KSk7CisJCQkJbWVtc2V0KCZzX3ZtZW0sIDAsIHNpemVvZihzdHJ1Y3QgdmlkZW9fbW1fdCkpOworCQkJfQorCQl9IGVsc2UgeworCQkJZW5jX3ByKExPR19FUlJPUiwgIkZhaWxlZCB0byBhbGxvYyBkbWEgYnVmZmVyICVzLCBwaHlzOjB4JWx4XG4iLCBWUFVfREVWX05BTUUsIHNfdmlkZW9fbWVtb3J5LnBoeXNfYWRkcik7CisKKwkJCWlmIChzX3ZpZGVvX21lbW9yeS5waHlzX2FkZHIpCisJCQkJY29kZWNfbW1fZnJlZV9mb3JfZG1hKFZQVV9ERVZfTkFNRSwgKHUzMilzX3ZpZGVvX21lbW9yeS5waHlzX2FkZHIpOworCisJCQlzX3ZpZGVvX21lbW9yeS5waHlzX2FkZHIgPSAwOworCQkJciA9IC1FTk9NRU07CisJCX0KKyNlbHNlCisJCWVuY19wcihMT0dfRVJST1IsICJObyBDTUEgYW5kIHJlc2VydmVkIG1lbW9yeSBmb3IgTXVsdGlFbmMhISFcbiIpOworCQlyID0gLUVOT01FTTsKKyNlbmRpZgorCX0gZWxzZSBpZiAoIXNfdmlkZW9fbWVtb3J5LnBoeXNfYWRkcikgeworCQllbmNfcHIoTE9HX0VSUk9SLCAiTXVsdGlFbmMgbWVtb3J5IGlzIG5vdCBtYWxsb2NlZCB5ZXQgd2FpdCAmIHJldHJ5IVxuIik7CisJCXIgPSAtRUJVU1k7CisJfQorCisJaWYgKGZpcnN0X29wZW4pIHsKKwkJaWYgKChzX3ZwdV9pcnEgPj0gMCkgJiYgKHNfdnB1X2lycV9yZXF1ZXN0ZWQgPT0gZmFsc2UpKSB7CisJCQlzMzIgZXJyOworCisJCQllcnIgPSByZXF1ZXN0X2lycShzX3ZwdV9pcnEsIHZwdV9pcnFfaGFuZGxlciwgMCwgIk11bHRpRW5jLWlycSIsICh2b2lkICopKCZzX3ZwdV9kcnZfY29udGV4dCkpOworCisJCQlpZiAoZXJyKSB7CisJCQkJZW5jX3ByKExPR19FUlJPUiwgIkZhaWxlZCB0byByZWdpc3RlciBpcnEgaGFuZGxlclxuIik7CisJCQkJc3Bpbl9sb2NrKCZzX3ZwdV9sb2NrKTsKKwkJCQlzX3ZwdV9kcnZfY29udGV4dC5vcGVuX2NvdW50LS07CisJCQkJc3Bpbl91bmxvY2soJnNfdnB1X2xvY2spOworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCisJCQlzX3ZwdV9pcnFfcmVxdWVzdGVkID0gdHJ1ZTsKKwkJfQorCisJCS8qIGVuYWJsZSB2cHUgY2xrcyBhbmQgcG93ZXIqLworCQl2cHVfY2xrX2VuYWJsZSgmc192cHVfY2xrcyk7CisJfQorCisJaWYgKHIgIT0gMCkgeworCQlzcGluX2xvY2soJnNfdnB1X2xvY2spOworCQlzX3ZwdV9kcnZfY29udGV4dC5vcGVuX2NvdW50LS07CisJCXNwaW5fdW5sb2NrKCZzX3ZwdV9sb2NrKTsKKwl9CisKKwllbmNfcHIoTE9HX0RFQlVHLCAiWy1dICVzLCByZXQ6ICVkXG4iLCBfX2Z1bmNfXywgcik7CisJcmV0dXJuIHI7Cit9Cit1bG9uZyBwaHlzX2FkZHJZOwordWxvbmcgcGh5c19hZGRyVTsKK3Vsb25nIHBoeXNfYWRkclY7CisKK3N0YXRpYyBsb25nIHZwdV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdTMyIGNtZCwgdWxvbmcgYXJnKQoreworCXMzMiByZXQgPSAwOworCXN0cnVjdCB2cHVfZHJ2X2NvbnRleHRfdCAqZGV2ID0KKwkJKHN0cnVjdCB2cHVfZHJ2X2NvbnRleHRfdCAqKWZpbHAtPnByaXZhdGVfZGF0YTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBWRElfSU9DVExfQUxMT0NBVEVfUEhZU0lDQUxfTUVNT1JZOgorCQl7CisJCQlzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl9wb29sX3QgKnZicDsKKworCQkJZW5jX3ByKExPR19BTEwsCisJCQkJIlsrXVZESV9JT0NUTF9BTExPQ0FURV9QSFlTSUNBTF9NRU1PUllcbiIpOworCQkJcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZzX3ZwdV9zZW0pOworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJdmJwID0ga3phbGxvYyhzaXplb2YoKnZicCksIEdGUF9LRVJORUwpOworCQkJCWlmICghdmJwKSB7CisJCQkJCXVwKCZzX3ZwdV9zZW0pOworCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQl9CisKKwkJCQlyZXQgPSBjb3B5X2Zyb21fdXNlcigmKHZicC0+dmIpLAorCQkJCQkoc3RydWN0IHZwdWRydl9idWZmZXJfdCAqKWFyZywKKwkJCQkJc2l6ZW9mKHN0cnVjdCB2cHVkcnZfYnVmZmVyX3QpKTsKKwkJCQlpZiAocmV0KSB7CisJCQkJCWtmcmVlKHZicCk7CisJCQkJCXVwKCZzX3ZwdV9zZW0pOworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisKKwkJCQlyZXQgPSB2cHVfYWxsb2NfZG1hX2J1ZmZlcigmKHZicC0+dmIpKTsKKwkJCQlpZiAocmV0ID09IC0xKSB7CisJCQkJCXJldCA9IC1FTk9NRU07CisJCQkJCWtmcmVlKHZicCk7CisJCQkJCXVwKCZzX3ZwdV9zZW0pOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcmV0ID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkJJih2YnAtPnZiKSwKKwkJCQkJc2l6ZW9mKHN0cnVjdCB2cHVkcnZfYnVmZmVyX3QpKTsKKwkJCQlpZiAocmV0KSB7CisJCQkJCWtmcmVlKHZicCk7CisJCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJCXVwKCZzX3ZwdV9zZW0pOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQl2YnAtPmZpbHAgPSBmaWxwOworCQkJCXNwaW5fbG9jaygmc192cHVfbG9jayk7CisJCQkJbGlzdF9hZGQoJnZicC0+bGlzdCwgJnNfdmJwX2hlYWQpOworCQkJCXNwaW5fdW5sb2NrKCZzX3ZwdV9sb2NrKTsKKworCQkJCXVwKCZzX3ZwdV9zZW0pOworCQkJfQorCQkJZW5jX3ByKExPR19BTEwsCisJCQkJIlstXVZESV9JT0NUTF9BTExPQ0FURV9QSFlTSUNBTF9NRU1PUllcbiIpOworCQl9CisJCWJyZWFrOworI2lmZGVmIENPTkZJR19DT01QQVQKKwljYXNlIFZESV9JT0NUTF9BTExPQ0FURV9QSFlTSUNBTF9NRU1PUlkzMjoKKwkJeworCQkJc3RydWN0IHZwdWRydl9idWZmZXJfcG9vbF90ICp2YnA7CisJCQlzdHJ1Y3QgY29tcGF0X3ZwdWRydl9idWZmZXJfdCBidWYzMjsKKworCQkJZW5jX3ByKExPR19BTEwsCisJCQkJIlsrXVZESV9JT0NUTF9BTExPQ0FURV9QSFlTSUNBTF9NRU1PUlkzMlxuIik7CisJCQlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJnNfdnB1X3NlbSk7CisJCQlpZiAocmV0ID09IDApIHsKKwkJCQl2YnAgPSBremFsbG9jKHNpemVvZigqdmJwKSwgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKCF2YnApIHsKKwkJCQkJdXAoJnNfdnB1X3NlbSk7CisJCQkJCXJldHVybiAtRU5PTUVNOworCQkJCX0KKworCQkJCXJldCA9IGNvcHlfZnJvbV91c2VyKCZidWYzMiwKKwkJCQkJKHN0cnVjdCBjb21wYXRfdnB1ZHJ2X2J1ZmZlcl90ICopYXJnLAorCQkJCQlzaXplb2Yoc3RydWN0IGNvbXBhdF92cHVkcnZfYnVmZmVyX3QpKTsKKwkJCQlpZiAocmV0KSB7CisJCQkJCWtmcmVlKHZicCk7CisJCQkJCXVwKCZzX3ZwdV9zZW0pOworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisKKwkJCQl2YnAtPnZiLnNpemUgPSBidWYzMi5zaXplOworCQkJCXZicC0+dmIuY2FjaGVkID0gYnVmMzIuY2FjaGVkOworCQkJCXZicC0+dmIucGh5c19hZGRyID0KKwkJCQkJKHVsb25nKWJ1ZjMyLnBoeXNfYWRkcjsKKwkJCQl2YnAtPnZiLnZpcnRfYWRkciA9CisJCQkJCSh1bG9uZylidWYzMi52aXJ0X2FkZHI7CisJCQkJcmV0ID0gdnB1X2FsbG9jX2RtYV9idWZmZXIoJih2YnAtPnZiKSk7CisJCQkJaWYgKHJldCA9PSAtMSkgeworCQkJCQlyZXQgPSAtRU5PTUVNOworCQkJCQlrZnJlZSh2YnApOworCQkJCQl1cCgmc192cHVfc2VtKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJYnVmMzIuc2l6ZSA9IHZicC0+dmIuc2l6ZTsKKwkJCQlidWYzMi5waHlzX2FkZHIgPQorCQkJCQkoY29tcGF0X3Vsb25nX3QpdmJwLT52Yi5waHlzX2FkZHI7CisJCQkJYnVmMzIudmlydF9hZGRyID0KKwkJCQkJKGNvbXBhdF91bG9uZ190KXZicC0+dmIudmlydF9hZGRyOworCisJCQkJcmV0ID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkJJmJ1ZjMyLAorCQkJCQlzaXplb2Yoc3RydWN0IGNvbXBhdF92cHVkcnZfYnVmZmVyX3QpKTsKKwkJCQlpZiAocmV0KSB7CisJCQkJCWtmcmVlKHZicCk7CisJCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJCXVwKCZzX3ZwdV9zZW0pOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQl2YnAtPmZpbHAgPSBmaWxwOworCQkJCXNwaW5fbG9jaygmc192cHVfbG9jayk7CisJCQkJbGlzdF9hZGQoJnZicC0+bGlzdCwgJnNfdmJwX2hlYWQpOworCQkJCXNwaW5fdW5sb2NrKCZzX3ZwdV9sb2NrKTsKKworCQkJCXVwKCZzX3ZwdV9zZW0pOworCQkJfQorCQkJZW5jX3ByKExPR19BTEwsCisJCQkJIlstXVZESV9JT0NUTF9BTExPQ0FURV9QSFlTSUNBTF9NRU1PUlkzMlxuIik7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIFZESV9JT0NUTF9GUkVFX1BIWVNJQ0FMTUVNT1JZOgorCQl7CisJCQlzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl9wb29sX3QgKnZicCwgKm47CisJCQlzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90IHZiOworCisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkiWytdVkRJX0lPQ1RMX0ZSRUVfUEhZU0lDQUxNRU1PUllcbiIpOworCQkJcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZzX3ZwdV9zZW0pOworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJcmV0ID0gY29weV9mcm9tX3VzZXIoJnZiLAorCQkJCQkoc3RydWN0IHZwdWRydl9idWZmZXJfdCAqKWFyZywKKwkJCQkJc2l6ZW9mKHN0cnVjdCB2cHVkcnZfYnVmZmVyX3QpKTsKKwkJCQlpZiAocmV0KSB7CisJCQkJCXVwKCZzX3ZwdV9zZW0pOworCQkJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJCQl9CisKKwkJCQlpZiAodmIucGh5c19hZGRyKQorCQkJCQl2cHVfZnJlZV9kbWFfYnVmZmVyKCZ2Yik7CisKKwkJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodmJwLCBuLAorCQkJCQkmc192YnBfaGVhZCwgbGlzdCkgeworCQkJCQlpZiAodmJwLT52Yi5waHlzX2FkZHIKKwkJCQkJCT09IHZiLnBoeXNfYWRkcikgeworCQkJCQkJc3Bpbl9sb2NrKCZzX3ZwdV9sb2NrKTsKKwkJCQkJCWxpc3RfZGVsKCZ2YnAtPmxpc3QpOworCQkJCQkJc3Bpbl91bmxvY2soJnNfdnB1X2xvY2spOworCQkJCQkJa2ZyZWUodmJwKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCXVwKCZzX3ZwdV9zZW0pOworCQkJfQorCQkJZW5jX3ByKExPR19BTEwsCisJCQkJIlstXVZESV9JT0NUTF9GUkVFX1BIWVNJQ0FMTUVNT1JZXG4iKTsKKwkJfQorCQlicmVhazsKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJY2FzZSBWRElfSU9DVExfRlJFRV9QSFlTSUNBTE1FTU9SWTMyOgorCQl7CisJCQlzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl9wb29sX3QgKnZicCwgKm47CisJCQlzdHJ1Y3QgY29tcGF0X3ZwdWRydl9idWZmZXJfdCBidWYzMjsKKwkJCXN0cnVjdCB2cHVkcnZfYnVmZmVyX3QgdmI7CisKKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbK11WRElfSU9DVExfRlJFRV9QSFlTSUNBTE1FTU9SWTMyXG4iKTsKKwkJCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmc192cHVfc2VtKTsKKwkJCWlmIChyZXQgPT0gMCkgeworCQkJCXJldCA9IGNvcHlfZnJvbV91c2VyKCZidWYzMiwKKwkJCQkJKHN0cnVjdCBjb21wYXRfdnB1ZHJ2X2J1ZmZlcl90ICopYXJnLAorCQkJCQlzaXplb2Yoc3RydWN0IGNvbXBhdF92cHVkcnZfYnVmZmVyX3QpKTsKKwkJCQlpZiAocmV0KSB7CisJCQkJCXVwKCZzX3ZwdV9zZW0pOworCQkJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJCQl9CisKKwkJCQl2Yi5zaXplID0gYnVmMzIuc2l6ZTsKKwkJCQl2Yi5waHlzX2FkZHIgPQorCQkJCQkodWxvbmcpYnVmMzIucGh5c19hZGRyOworCQkJCXZiLnZpcnRfYWRkciA9CisJCQkJCSh1bG9uZylidWYzMi52aXJ0X2FkZHI7CisKKwkJCQlpZiAodmIucGh5c19hZGRyKQorCQkJCQl2cHVfZnJlZV9kbWFfYnVmZmVyKCZ2Yik7CisJCQkJLypUT0RPIGNoZWNrIGVxdWFsIGNvbmRpdGlvbiovCisJCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZicCwgbiwKKwkJCQkJJnNfdmJwX2hlYWQsIGxpc3QpIHsKKwkJCQkJaWYgKChjb21wYXRfdWxvbmdfdCl2YnAtPnZiLnBoeXNfYWRkcgorCQkJCQkJPT0gYnVmMzIucGh5c19hZGRyKSB7CisJCQkJCQlzcGluX2xvY2soJnNfdnB1X2xvY2spOworCQkJCQkJbGlzdF9kZWwoJnZicC0+bGlzdCk7CisJCQkJCQlzcGluX3VubG9jaygmc192cHVfbG9jayk7CisJCQkJCQlrZnJlZSh2YnApOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJdXAoJnNfdnB1X3NlbSk7CisJCQl9CisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkiWy1dVkRJX0lPQ1RMX0ZSRUVfUEhZU0lDQUxNRU1PUlkzMlxuIik7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIFZESV9JT0NUTF9HRVRfUkVTRVJWRURfVklERU9fTUVNT1JZX0lORk86CisJCXsKKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbK11WRElfSU9DVExfR0VUX1JFU0VSVkVEX1ZJREVPX01FTU9SWVxuIik7CisJCQlpZiAoc192aWRlb19tZW1vcnkucGh5c19hZGRyICE9IDApIHsKKwkJCQlyZXQgPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLAorCQkJCQkmc192aWRlb19tZW1vcnksCisJCQkJCXNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90KSk7CisJCQkJaWYgKHJldCAhPSAwKQorCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJfSBlbHNlIHsKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJfQorCQkJZW5jX3ByKExPR19BTEwsCisJCQkJIlstXVZESV9JT0NUTF9HRVRfUkVTRVJWRURfVklERU9fTUVNT1JZXG4iKTsKKwkJfQorCQlicmVhazsKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJY2FzZSBWRElfSU9DVExfR0VUX1JFU0VSVkVEX1ZJREVPX01FTU9SWV9JTkZPMzI6CisJCXsKKwkJCXN0cnVjdCBjb21wYXRfdnB1ZHJ2X2J1ZmZlcl90IGJ1ZjMyOworCisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkiWytdVkRJX0lPQ1RMX0dFVF9SRVNFUlZFRF9WSURFT19NRU1PUlkzMlxuIik7CisJCQltZW1zZXQoJmJ1ZjMyLCAwLCBzaXplb2Yoc3RydWN0IGNvbXBhdF92cHVkcnZfYnVmZmVyX3QpKTsKKwkJCWJ1ZjMyLnNpemUgPSBzX3ZpZGVvX21lbW9yeS5zaXplOworCQkJYnVmMzIucGh5c19hZGRyID0KKwkJCQkoY29tcGF0X3Vsb25nX3Qpc192aWRlb19tZW1vcnkucGh5c19hZGRyOworCQkJYnVmMzIudmlydF9hZGRyID0KKwkJCQkoY29tcGF0X3Vsb25nX3Qpc192aWRlb19tZW1vcnkudmlydF9hZGRyOworCQkJaWYgKHNfdmlkZW9fbWVtb3J5LnBoeXNfYWRkciAhPSAwKSB7CisJCQkJcmV0ID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkJJmJ1ZjMyLAorCQkJCQlzaXplb2Yoc3RydWN0IGNvbXBhdF92cHVkcnZfYnVmZmVyX3QpKTsKKwkJCQlpZiAocmV0ICE9IDApCisJCQkJCXJldCA9IC1FRkFVTFQ7CisJCQl9IGVsc2UgeworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQl9CisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkiWy1dVkRJX0lPQ1RMX0dFVF9SRVNFUlZFRF9WSURFT19NRU1PUlkzMlxuIik7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIFZESV9JT0NUTF9XQUlUX0lOVEVSUlVQVDoKKwkJeworCQkJc3RydWN0IHZwdWRydl9pbnRyX2luZm9fdCBpbmZvOworCQkJdTMyIGludHJfaW5zdF9pbmRleDsKKwkJCXUzMiBpbnRyX3JlYXNvbl9pbl9xOworCQkJdTMyIGludGVycnVwdF9mbGFnX2luX3E7CisKKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbK11WRElfSU9DVExfV0FJVF9JTlRFUlJVUFRcbiIpOworCQkJcmV0ID0gY29weV9mcm9tX3VzZXIoJmluZm8sCisJCQkJKHN0cnVjdCB2cHVkcnZfaW50cl9pbmZvX3QgKilhcmcsCisJCQkJc2l6ZW9mKHN0cnVjdCB2cHVkcnZfaW50cl9pbmZvX3QpKTsKKwkJCWlmIChyZXQgIT0gMCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWludHJfaW5zdF9pbmRleCA9IGluZm8uaW50cl9pbnN0X2luZGV4OworCisJCQlpbnRyX3JlYXNvbl9pbl9xID0gMDsKKwkJCWlmIChpbnRyX2luc3RfaW5kZXggPj0gTUFYX05VTV9JTlNUQU5DRSkKKwkJCXsKKwkJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkJImVycm9yLCBpbnRyX2luc3RfaW5kZXggaXMgaW52YWxpZCAhXG4iKTsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJCWludGVycnVwdF9mbGFnX2luX3EgPSBrZmlmb19vdXRfc3BpbmxvY2tlZCgKKwkJCQkmc19pbnRlcnJ1cHRfcGVuZGluZ19xW2ludHJfaW5zdF9pbmRleF0sCisJCQkJJmludHJfcmVhc29uX2luX3EsIHNpemVvZih1MzIpLAorCQkJCSZzX2tmaWZvX2xvY2spOworCQkJaWYgKGludGVycnVwdF9mbGFnX2luX3EgPiAwKQorCQkJeworCQkJCWRldi0+aW50ZXJydXB0X3JlYXNvbltpbnRyX2luc3RfaW5kZXhdID0KKwkJCQkJaW50cl9yZWFzb25faW5fcTsKKwkJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkJIkludHIgUmVtYWluIGluIFE6IGluc3RfaW5kZXg9ICVkLCAiLAorCQkJCQlpbnRyX2luc3RfaW5kZXgpOworCQkJCWVuY19wcihMT0dfQUxMLCAicmVhc29uPSAweCV4LCBmbGFnPSAlZFxuIiwKKwkJCQkJaW50cl9yZWFzb25faW5fcSwKKwkJCQkJaW50ZXJydXB0X2ZsYWdfaW5fcSk7CisJCQkJZ290byBJTlRFUlJVUFRfUkVNQUlOX0lOX1FVRVVFOworCQkJfQorCisJCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCgKKwkJCQlzX2ludGVycnVwdF93YWl0X3FbaW50cl9pbnN0X2luZGV4XSwKKwkJCQlzX2ludGVycnVwdF9mbGFnW2ludHJfaW5zdF9pbmRleF0gIT0gMCwKKwkJCQltc2Vjc190b19qaWZmaWVzKGluZm8udGltZW91dCkpOworCQkJaWYgKCFyZXQpIHsKKwkJCQlyZXQgPSAtRVRJTUU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaW50cl9yZWFzb25faW5fcSA9IDA7CisJCQlpbnRlcnJ1cHRfZmxhZ19pbl9xID0ga2ZpZm9fb3V0X3NwaW5sb2NrZWQoCisJCQkJJnNfaW50ZXJydXB0X3BlbmRpbmdfcVtpbnRyX2luc3RfaW5kZXhdLAorCQkJCSZpbnRyX3JlYXNvbl9pbl9xLCBzaXplb2YodTMyKSwgJnNfa2ZpZm9fbG9jayk7CisJCQlpZiAoaW50ZXJydXB0X2ZsYWdfaW5fcSA+IDApIHsKKwkJCQlkZXYtPmludGVycnVwdF9yZWFzb25baW50cl9pbnN0X2luZGV4XSA9CisJCQkJCWludHJfcmVhc29uX2luX3E7CisJCQl9CisJCQllbHNlIHsKKwkJCQlkZXYtPmludGVycnVwdF9yZWFzb25baW50cl9pbnN0X2luZGV4XSA9IDA7CisJCQl9CisJCQllbmNfcHIoTE9HX0lORk8sCisJCQkJImluc3RfaW5kZXgoJWQpLHNfaW50ZXJydXB0X2ZsYWcoJWQpLCAiLAorCQkJCWludHJfaW5zdF9pbmRleCwKKwkJCQlzX2ludGVycnVwdF9mbGFnW2ludHJfaW5zdF9pbmRleF0pOworCQkJZW5jX3ByKExPR19JTkZPLAorCQkJCSJyZWFzb24oMHglMDhseClcbiIsCisJCQkJZGV2LT5pbnRlcnJ1cHRfcmVhc29uW2ludHJfaW5zdF9pbmRleF0pOworCitJTlRFUlJVUFRfUkVNQUlOX0lOX1FVRVVFOgorCQkJaW5mby5pbnRyX3JlYXNvbiA9CisJCQkJZGV2LT5pbnRlcnJ1cHRfcmVhc29uW2ludHJfaW5zdF9pbmRleF07CisJCQlzX2ludGVycnVwdF9mbGFnW2ludHJfaW5zdF9pbmRleF0gPSAwOworCQkJZGV2LT5pbnRlcnJ1cHRfcmVhc29uW2ludHJfaW5zdF9pbmRleF0gPSAwOworCisjaWZkZWYgVlBVX0lSUV9DT05UUk9MCisJCQllbmFibGVfaXJxKHNfdnB1X2lycSk7CisjZW5kaWYKKwkJCXJldCA9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJJmluZm8sIHNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2ludHJfaW5mb190KSk7CisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkiWy1dVkRJX0lPQ1RMX1dBSVRfSU5URVJSVVBUXG4iKTsKKwkJCWlmIChyZXQgIT0gMCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlicmVhazsKKwljYXNlIFZESV9JT0NUTF9TRVRfQ0xPQ0tfR0FURToKKwkJeworCQkJdTMyIGNsa2dhdGU7CisKKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbK11WRElfSU9DVExfU0VUX0NMT0NLX0dBVEVcbiIpOworCQkJaWYgKGdldF91c2VyKGNsa2dhdGUsICh1MzIgX191c2VyICopIGFyZykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisjaWZkZWYgVlBVX1NVUFBPUlRfQ0xPQ0tfQ09OVFJPTAorCQkJcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZzX3ZwdV9zZW0pOworCQkJaWYgKHJldCAhPSAwKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJdnB1X2Nsa19jb25maWcoY2xrZ2F0ZSk7CisJCQl1cCgmc192cHVfc2VtKTsKKyNlbmRpZgorCQkJZW5jX3ByKExPR19BTEwsCisJCQkJIlstXVZESV9JT0NUTF9TRVRfQ0xPQ0tfR0FURVxuIik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBWRElfSU9DVExfR0VUX0lOU1RBTkNFX1BPT0w6CisJCXsKKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbK11WRElfSU9DVExfR0VUX0lOU1RBTkNFX1BPT0xcbiIpOworCQkJcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZzX3ZwdV9zZW0pOworCQkJaWYgKHJldCAhPSAwKQorCQkJCWJyZWFrOworCisJCQlpZiAoc19pbnN0YW5jZV9wb29sLmJhc2UgIT0gMCkgeworCQkJCXJldCA9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJCSZzX2luc3RhbmNlX3Bvb2wsCisJCQkJCXNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90KSk7CisJCQkJcmV0ID0gKHJldCAhPSAwKSA/IC1FRkFVTFQgOiAwOworCQkJfSBlbHNlIHsKKwkJCQlyZXQgPSBjb3B5X2Zyb21fdXNlcigmc19pbnN0YW5jZV9wb29sLAorCQkJCQkoc3RydWN0IHZwdWRydl9idWZmZXJfdCAqKWFyZywKKwkJCQkJc2l6ZW9mKHN0cnVjdCB2cHVkcnZfYnVmZmVyX3QpKTsKKwkJCQlpZiAocmV0ID09IDApIHsKKwkJCQkJc19pbnN0YW5jZV9wb29sLnNpemUgPQorCQkJCQkJUEFHRV9BTElHTigKKwkJCQkJCXNfaW5zdGFuY2VfcG9vbC5zaXplKTsKKwkJCQkJc19pbnN0YW5jZV9wb29sLmJhc2UgPQorCQkJCQkJKHVsb25nKXZtYWxsb2MoCisJCQkJCQlzX2luc3RhbmNlX3Bvb2wuc2l6ZSk7CisJCQkJCXNfaW5zdGFuY2VfcG9vbC5waHlzX2FkZHIgPQorCQkJCQkJc19pbnN0YW5jZV9wb29sLmJhc2U7CisJCQkJCWlmIChzX2luc3RhbmNlX3Bvb2wuYmFzZSA9PSAwKSB7CisJCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCQkJdXAoJnNfdnB1X3NlbSk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQkvKmNsZWFyaW5nIG1lbW9yeSovCisJCQkJCW1lbXNldCgodm9pZCAqKXNfaW5zdGFuY2VfcG9vbC5iYXNlLAorCQkJCQkJMCwgc19pbnN0YW5jZV9wb29sLnNpemUpOworCQkJCQlyZXQgPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLAorCQkJCQkJJnNfaW5zdGFuY2VfcG9vbCwKKwkJCQkJCXNpemVvZihzdHJ1Y3QKKwkJCQkJCXZwdWRydl9idWZmZXJfdCkpOworCQkJCQlpZiAocmV0ICE9IDApCisJCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCX0gZWxzZQorCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJfQorCQkJdXAoJnNfdnB1X3NlbSk7CisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkiWy1dVkRJX0lPQ1RMX0dFVF9JTlNUQU5DRV9QT09MXG4iKTsKKwkJfQorCQlicmVhazsKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJY2FzZSBWRElfSU9DVExfR0VUX0lOU1RBTkNFX1BPT0wzMjoKKwkJeworCQkJc3RydWN0IGNvbXBhdF92cHVkcnZfYnVmZmVyX3QgYnVmMzI7CisKKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbK11WRElfSU9DVExfR0VUX0lOU1RBTkNFX1BPT0wzMlxuIik7CisJCQltZW1zZXQoJmJ1ZjMyLCAwLCBzaXplb2Yoc3RydWN0IGNvbXBhdF92cHVkcnZfYnVmZmVyX3QpKTsKKwkJCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmc192cHVfc2VtKTsKKwkJCWlmIChyZXQgIT0gMCkKKwkJCQlicmVhazsKKwkJCWlmIChzX2luc3RhbmNlX3Bvb2wuYmFzZSAhPSAwKSB7CisJCQkJYnVmMzIuc2l6ZSA9IHNfaW5zdGFuY2VfcG9vbC5zaXplOworCQkJCWJ1ZjMyLnBoeXNfYWRkciA9CisJCQkJCShjb21wYXRfdWxvbmdfdCkKKwkJCQkJc19pbnN0YW5jZV9wb29sLnBoeXNfYWRkcjsKKwkJCQlidWYzMi52aXJ0X2FkZHIgPQorCQkJCQkoY29tcGF0X3Vsb25nX3QpCisJCQkJCXNfaW5zdGFuY2VfcG9vbC52aXJ0X2FkZHI7CisJCQkJcmV0ID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkJJmJ1ZjMyLAorCQkJCQlzaXplb2Yoc3RydWN0CisJCQkJCWNvbXBhdF92cHVkcnZfYnVmZmVyX3QpKTsKKwkJCQlyZXQgPSAocmV0ICE9IDApID8gLUVGQVVMVCA6IDA7CisJCQl9IGVsc2UgeworCQkJCXJldCA9IGNvcHlfZnJvbV91c2VyKCZidWYzMiwKKwkJCQkJKHN0cnVjdCBjb21wYXRfdnB1ZHJ2X2J1ZmZlcl90ICopYXJnLAorCQkJCQlzaXplb2Yoc3RydWN0CisJCQkJCWNvbXBhdF92cHVkcnZfYnVmZmVyX3QpKTsKKwkJCQlpZiAocmV0ID09IDApIHsKKwkJCQkJc19pbnN0YW5jZV9wb29sLnNpemUgPSBidWYzMi5zaXplOworCQkJCQlzX2luc3RhbmNlX3Bvb2wuc2l6ZSA9CisJCQkJCQlQQUdFX0FMSUdOKAorCQkJCQkJc19pbnN0YW5jZV9wb29sLnNpemUpOworCQkJCQlzX2luc3RhbmNlX3Bvb2wuYmFzZSA9CisJCQkJCQkodWxvbmcpdm1hbGxvYygKKwkJCQkJCXNfaW5zdGFuY2VfcG9vbC5zaXplKTsKKwkJCQkJc19pbnN0YW5jZV9wb29sLnBoeXNfYWRkciA9CisJCQkJCQlzX2luc3RhbmNlX3Bvb2wuYmFzZTsKKwkJCQkJYnVmMzIuc2l6ZSA9CisJCQkJCQlzX2luc3RhbmNlX3Bvb2wuc2l6ZTsKKwkJCQkJYnVmMzIucGh5c19hZGRyID0KKwkJCQkJCShjb21wYXRfdWxvbmdfdCkKKwkJCQkJCXNfaW5zdGFuY2VfcG9vbC5waHlzX2FkZHI7CisJCQkJCWJ1ZjMyLmJhc2UgPQorCQkJCQkJKGNvbXBhdF91bG9uZ190KQorCQkJCQkJc19pbnN0YW5jZV9wb29sLmJhc2U7CisJCQkJCWJ1ZjMyLnZpcnRfYWRkciA9CisJCQkJCQkoY29tcGF0X3Vsb25nX3QpCisJCQkJCQlzX2luc3RhbmNlX3Bvb2wudmlydF9hZGRyOworCQkJCQlpZiAoc19pbnN0YW5jZV9wb29sLmJhc2UgPT0gMCkgeworCQkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQkJCXVwKCZzX3ZwdV9zZW0pOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJLypjbGVhcmluZyBtZW1vcnkqLworCQkJCQltZW1zZXQoKHZvaWQgKilzX2luc3RhbmNlX3Bvb2wuYmFzZSwKKwkJCQkJCTB4MCwgc19pbnN0YW5jZV9wb29sLnNpemUpOworCQkJCQlyZXQgPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLAorCQkJCQkJJmJ1ZjMyLAorCQkJCQkJc2l6ZW9mKHN0cnVjdAorCQkJCQkJY29tcGF0X3ZwdWRydl9idWZmZXJfdCkpOworCQkJCQlpZiAocmV0ICE9IDApCisJCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCX0gZWxzZQorCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJfQorCQkJdXAoJnNfdnB1X3NlbSk7CisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkiWy1dVkRJX0lPQ1RMX0dFVF9JTlNUQU5DRV9QT09MMzJcbiIpOworCQl9CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBWRElfSU9DVExfR0VUX0NPTU1PTl9NRU1PUlk6CisJCXsKKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbK11WRElfSU9DVExfR0VUX0NPTU1PTl9NRU1PUllcbiIpOworCQkJaWYgKHNfY29tbW9uX21lbW9yeS5waHlzX2FkZHIgIT0gMCkgeworCQkJCXJldCA9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJCSZzX2NvbW1vbl9tZW1vcnksCisJCQkJCXNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90KSk7CisJCQkJaWYgKHJldCAhPSAwKQorCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJfSBlbHNlIHsKKwkJCQlyZXQgPSBjb3B5X2Zyb21fdXNlcigmc19jb21tb25fbWVtb3J5LAorCQkJCQkoc3RydWN0IHZwdWRydl9idWZmZXJfdCAqKWFyZywKKwkJCQkJc2l6ZW9mKHN0cnVjdCB2cHVkcnZfYnVmZmVyX3QpKTsKKwkJCQlpZiAocmV0ICE9IDApIHsKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmc192cHVfc2VtKTsKKwkJCQlpZiAocmV0ICE9IDApCisJCQkJCWJyZWFrOworCQkJCWlmICh2cHVfYWxsb2NfZG1hX2J1ZmZlcigKKwkJCQkJJnNfY29tbW9uX21lbW9yeSkgIT0gLTEpIHsKKwkJCQkJcmV0ID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkJCSZzX2NvbW1vbl9tZW1vcnksCisJCQkJCQlzaXplb2Yoc3RydWN0CisJCQkJCQl2cHVkcnZfYnVmZmVyX3QpKTsKKwkJCQkJaWYgKHJldCAhPSAwKQorCQkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQl9IGVsc2UKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQl1cCgmc192cHVfc2VtKTsKKwkJCX0KKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbLV1WRElfSU9DVExfR0VUX0NPTU1PTl9NRU1PUllcbiIpOworCQl9CisJCWJyZWFrOworI2lmZGVmIENPTkZJR19DT01QQVQKKwljYXNlIFZESV9JT0NUTF9HRVRfQ09NTU9OX01FTU9SWTMyOgorCQl7CisJCQlzdHJ1Y3QgY29tcGF0X3ZwdWRydl9idWZmZXJfdCBidWYzMjsKKworCQkJZW5jX3ByKExPR19BTEwsCisJCQkJIlsrXVZESV9JT0NUTF9HRVRfQ09NTU9OX01FTU9SWTMyXG4iKTsKKworCQkJbWVtc2V0KCZidWYzMiwgMCwgc2l6ZW9mKHN0cnVjdCBjb21wYXRfdnB1ZHJ2X2J1ZmZlcl90KSk7CisJCQlidWYzMi5zaXplID0gc19jb21tb25fbWVtb3J5LnNpemU7CisJCQlidWYzMi5waHlzX2FkZHIgPQorCQkJCShjb21wYXRfdWxvbmdfdCkKKwkJCQlzX2NvbW1vbl9tZW1vcnkucGh5c19hZGRyOworCQkJYnVmMzIudmlydF9hZGRyID0KKwkJCQkoY29tcGF0X3Vsb25nX3QpCisJCQkJc19jb21tb25fbWVtb3J5LnZpcnRfYWRkcjsKKwkJCWlmIChzX2NvbW1vbl9tZW1vcnkucGh5c19hZGRyICE9IDApIHsKKwkJCQlyZXQgPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLAorCQkJCQkmYnVmMzIsCisJCQkJCXNpemVvZihzdHJ1Y3QgY29tcGF0X3ZwdWRydl9idWZmZXJfdCkpOworCQkJCWlmIChyZXQgIT0gMCkKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCX0gZWxzZSB7CisJCQkJcmV0ID0gY29weV9mcm9tX3VzZXIoJmJ1ZjMyLAorCQkJCQkoc3RydWN0IGNvbXBhdF92cHVkcnZfYnVmZmVyX3QgKilhcmcsCisJCQkJCXNpemVvZihzdHJ1Y3QgY29tcGF0X3ZwdWRydl9idWZmZXJfdCkpOworCQkJCWlmIChyZXQgIT0gMCkgeworCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJc19jb21tb25fbWVtb3J5LnNpemUgPSBidWYzMi5zaXplOworCQkJCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmc192cHVfc2VtKTsKKwkJCQlpZiAocmV0ICE9IDApCisJCQkJCWJyZWFrOworCQkJCWlmICh2cHVfYWxsb2NfZG1hX2J1ZmZlcigKKwkJCQkJJnNfY29tbW9uX21lbW9yeSkgIT0gLTEpIHsKKwkJCQkJYnVmMzIuc2l6ZSA9CisJCQkJCQlzX2NvbW1vbl9tZW1vcnkuc2l6ZTsKKwkJCQkJYnVmMzIucGh5c19hZGRyID0KKwkJCQkJCShjb21wYXRfdWxvbmdfdCkKKwkJCQkJCXNfY29tbW9uX21lbW9yeS5waHlzX2FkZHI7CisJCQkJCWJ1ZjMyLnZpcnRfYWRkciA9CisJCQkJCQkoY29tcGF0X3Vsb25nX3QpCisJCQkJCQlzX2NvbW1vbl9tZW1vcnkudmlydF9hZGRyOworCQkJCQlyZXQgPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLAorCQkJCQkJJmJ1ZjMyLCBzaXplb2Yoc3RydWN0CisJCQkJCQljb21wYXRfdnB1ZHJ2X2J1ZmZlcl90KSk7CisJCQkJCWlmIChyZXQgIT0gMCkKKwkJCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJfSBlbHNlCisJCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJdXAoJnNfdnB1X3NlbSk7CisJCQl9CisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkiWy1dVkRJX0lPQ1RMX0dFVF9DT01NT05fTUVNT1JZMzJcbiIpOworCQl9CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBWRElfSU9DVExfT1BFTl9JTlNUQU5DRToKKwkJeworCQkJc3RydWN0IHZwdWRydl9pbnN0X2luZm9fdCBpbnN0X2luZm87CisJCQlzdHJ1Y3QgdnB1ZHJ2X2luc3RhbmFjZV9saXN0X3QgKnZpbCwgKm47CisKKwkJCWVuY19wcihMT0dfREVCVUcsCisJCQkJIlsrXVZESV9JT0NUTF9PUEVOX0lOU1RBTkNFXG4iKTsKKworCQkJdmlsID0ga3phbGxvYyhzaXplb2YoKnZpbCksIEdGUF9LRVJORUwpOworCQkJaWYgKCF2aWwpCisJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmaW5zdF9pbmZvLAorCQkJCShzdHJ1Y3QgdnB1ZHJ2X2luc3RfaW5mb190ICopYXJnLAorCQkJCXNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2luc3RfaW5mb190KSkpCisJCQl7CisJCQkJa2ZyZWUodmlsKTsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmc192cHVfc2VtKTsKKwkJCWlmIChyZXQgIT0gMCkKKwkJCXsKKwkJCQlrZnJlZSh2aWwpOworCQkJCWJyZWFrOworCQkJfQorCQkJdmlsLT5pbnN0X2lkeCA9IGluc3RfaW5mby5pbnN0X2lkeDsKKwkJCXZpbC0+Y29yZV9pZHggPSBpbnN0X2luZm8uY29yZV9pZHg7CisJCQl2aWwtPmZpbHAgPSBmaWxwOworCQkJLyogY291bnRpbmcgdGhlIGN1cnJlbnQgb3BlbiBpbnN0YW5jZSBudW1iZXIgKi8KKwkJCWluc3RfaW5mby5pbnN0X29wZW5fY291bnQgPSAwOworCQkJc3Bpbl9sb2NrKCZzX3ZwdV9sb2NrKTsKKwkJCWxpc3RfYWRkKCZ2aWwtPmxpc3QsICZzX2luc3RfbGlzdF9oZWFkKTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2aWwsIG4sCisJCQkJJnNfaW5zdF9saXN0X2hlYWQsIGxpc3QpIHsKKwkJCQlpZiAodmlsLT5jb3JlX2lkeCA9PSBpbnN0X2luZm8uY29yZV9pZHgpCisJCQkJCWluc3RfaW5mby5pbnN0X29wZW5fY291bnQrKzsKKwkJCX0KKwkJCWlmIChpbnN0X2luZm8uaW5zdF9pZHggPj0gTUFYX05VTV9JTlNUQU5DRSkKKwkJCXsKKwkJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkJImVycm9yLCBpbnN0X2luZm8uaW5zdF9pZHggaXMgaW52YWxpZCAhXG4iKTsKKwkJCQlrZnJlZSh2aWwpOworCQkJCXNwaW5fdW5sb2NrKCZzX3ZwdV9sb2NrKTsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJCWtmaWZvX3Jlc2V0KAorCQkJCSZzX2ludGVycnVwdF9wZW5kaW5nX3FbaW5zdF9pbmZvLmluc3RfaWR4XSk7CisKKwkJCSAvKiBmbGFnIGp1c3QgZm9yIHRoYXQgdnB1IGlzIGluIG9wZW5lZCBvciBjbG9zZWQgKi8KKwkJCXNfdnB1X29wZW5fcmVmX2NvdW50Kys7CisJCQlzcGluX3VubG9jaygmc192cHVfbG9jayk7CisJCQl1cCgmc192cHVfc2VtKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLAorCQkJCSZpbnN0X2luZm8sCisJCQkJc2l6ZW9mKHN0cnVjdCB2cHVkcnZfaW5zdF9pbmZvX3QpKSkgeworCQkJCWtmcmVlKHZpbCk7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisKKwkJCWVuY19wcihMT0dfREVCVUcsCisJCQkJIlstXVZESV9JT0NUTF9PUEVOX0lOU1RBTkNFICIpOworCQkJZW5jX3ByKExPR19ERUJVRywKKwkJCQkiY29yZV9pZHggPSAlZCwgaW5zdF9pZHggPSAlZCwgIiwKKwkJCQkodTMyKWluc3RfaW5mby5jb3JlX2lkeCwKKwkJCQkodTMyKWluc3RfaW5mby5pbnN0X2lkeCk7CisJCQllbmNfcHIoTE9HX0RFQlVHLAorCQkJCSJzX3ZwdV9vcGVuX3JlZl9jb3VudCA9ICVkLCAiLAorCQkJCXNfdnB1X29wZW5fcmVmX2NvdW50KTsKKwkJCWVuY19wcihMT0dfREVCVUcsCisJCQkJImluc3Rfb3Blbl9jb3VudCA9ICVkXG4iLAorCQkJCWluc3RfaW5mby5pbnN0X29wZW5fY291bnQpOworCQl9CisJCWJyZWFrOworCWNhc2UgVkRJX0lPQ1RMX0NMT1NFX0lOU1RBTkNFOgorCQl7CisJCQlzdHJ1Y3QgdnB1ZHJ2X2luc3RfaW5mb190IGluc3RfaW5mbzsKKwkJCXN0cnVjdCB2cHVkcnZfaW5zdGFuYWNlX2xpc3RfdCAqdmlsLCAqbjsKKwkJCXUzMiBmb3VuZCA9IDA7CisKKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbK11WRElfSU9DVExfQ0xPU0VfSU5TVEFOQ0VcbiIpOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZpbnN0X2luZm8sCisJCQkJKHN0cnVjdCB2cHVkcnZfaW5zdF9pbmZvX3QgKilhcmcsCisJCQkJc2l6ZW9mKHN0cnVjdCB2cHVkcnZfaW5zdF9pbmZvX3QpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmc192cHVfc2VtKTsKKwkJCWlmIChyZXQgIT0gMCkKKwkJCQlicmVhazsKKworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZpbCwgbiwKKwkJCQkmc19pbnN0X2xpc3RfaGVhZCwgbGlzdCkgeworCQkJCWlmICh2aWwtPmluc3RfaWR4ID09IGluc3RfaW5mby5pbnN0X2lkeCAmJgorCQkJCQl2aWwtPmNvcmVfaWR4ID09IGluc3RfaW5mby5jb3JlX2lkeCkgeworCQkJCQlzcGluX2xvY2soJnNfdnB1X2xvY2spOworCQkJCQlsaXN0X2RlbCgmdmlsLT5saXN0KTsKKwkJCQkJc3Bpbl91bmxvY2soJnNfdnB1X2xvY2spOworCQkJCQlrZnJlZSh2aWwpOworCQkJCQlmb3VuZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGZvdW5kID09IDApIHsKKwkJCQl1cCgmc192cHVfc2VtKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQkJLyogY291bnRpbmcgdGhlIGN1cnJlbnQgb3BlbiBpbnN0YW5jZSBudW1iZXIgKi8KKwkJCWluc3RfaW5mby5pbnN0X29wZW5fY291bnQgPSAwOworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZpbCwgbiwKKwkJCQkmc19pbnN0X2xpc3RfaGVhZCwgbGlzdCkgeworCQkJCWlmICh2aWwtPmNvcmVfaWR4ID09IGluc3RfaW5mby5jb3JlX2lkeCkKKwkJCQkJaW5zdF9pbmZvLmluc3Rfb3Blbl9jb3VudCsrOworCQkJfQorCisJCQlrZmlmb19yZXNldCgKKwkJCQkmc19pbnRlcnJ1cHRfcGVuZGluZ19xW2luc3RfaW5mby5pbnN0X2lkeF0pOworCQkJLyogZmxhZyBqdXN0IGZvciB0aGF0IHZwdSBpcyBpbiBvcGVuZWQgb3IgY2xvc2VkICovCisJCQlzcGluX2xvY2soJnNfdnB1X2xvY2spOworCQkJc192cHVfb3Blbl9yZWZfY291bnQtLTsKKwkJCXNwaW5fdW5sb2NrKCZzX3ZwdV9sb2NrKTsKKwkJCXVwKCZzX3ZwdV9zZW0pOworCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJJmluc3RfaW5mbywKKwkJCQlzaXplb2Yoc3RydWN0IHZwdWRydl9pbnN0X2luZm9fdCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQllbmNfcHIoTE9HX0RFQlVHLAorCQkJCSJbLV1WRElfSU9DVExfQ0xPU0VfSU5TVEFOQ0UgIik7CisJCQllbmNfcHIoTE9HX0RFQlVHLAorCQkJCSJjb3JlX2lkeD0gJWQsIGluc3RfaWR4PSAlZCwgIiwKKwkJCQkodTMyKWluc3RfaW5mby5jb3JlX2lkeCwKKwkJCQkodTMyKWluc3RfaW5mby5pbnN0X2lkeCk7CisJCQllbmNfcHIoTE9HX0RFQlVHLAorCQkJCSJzX3ZwdV9vcGVuX3JlZl9jb3VudD0gJWQsICIsCisJCQkJc192cHVfb3Blbl9yZWZfY291bnQpOworCQkJZW5jX3ByKExPR19ERUJVRywKKwkJCQkiaW5zdF9vcGVuX2NvdW50PSAlZFxuIiwKKwkJCQlpbnN0X2luZm8uaW5zdF9vcGVuX2NvdW50KTsKKwkJfQorCQlicmVhazsKKwljYXNlIFZESV9JT0NUTF9HRVRfSU5TVEFOQ0VfTlVNOgorCQl7CisJCQlzdHJ1Y3QgdnB1ZHJ2X2luc3RfaW5mb190IGluc3RfaW5mbzsKKwkJCXN0cnVjdCB2cHVkcnZfaW5zdGFuYWNlX2xpc3RfdCAqdmlsLCAqbjsKKworCQkJZW5jX3ByKExPR19BTEwsCisJCQkJIlsrXVZESV9JT0NUTF9HRVRfSU5TVEFOQ0VfTlVNXG4iKTsKKworCQkJcmV0ID0gY29weV9mcm9tX3VzZXIoJmluc3RfaW5mbywKKwkJCQkoc3RydWN0IHZwdWRydl9pbnN0X2luZm9fdCAqKWFyZywKKwkJCQlzaXplb2Yoc3RydWN0IHZwdWRydl9pbnN0X2luZm9fdCkpOworCQkJaWYgKHJldCAhPSAwKQorCQkJCWJyZWFrOworCisJCQlpbnN0X2luZm8uaW5zdF9vcGVuX2NvdW50ID0gMDsKKworCQkJc3Bpbl9sb2NrKCZzX3ZwdV9sb2NrKTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2aWwsIG4sCisJCQkJJnNfaW5zdF9saXN0X2hlYWQsIGxpc3QpIHsKKwkJCQlpZiAodmlsLT5jb3JlX2lkeCA9PSBpbnN0X2luZm8uY29yZV9pZHgpCisJCQkJCWluc3RfaW5mby5pbnN0X29wZW5fY291bnQrKzsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrKCZzX3ZwdV9sb2NrKTsKKworCQkJcmV0ID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkmaW5zdF9pbmZvLAorCQkJCXNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2luc3RfaW5mb190KSk7CisKKwkJCWVuY19wcihMT0dfREVCVUcsCisJCQkJIlstXVZESV9JT0NUTF9HRVRfSU5TVEFOQ0VfTlVNICIpOworCQkJZW5jX3ByKExPR19ERUJVRywKKwkJCQkiY29yZV9pZHg9JWQsIGluc3RfaWR4PSVkLCBvcGVuX2NvdW50PSVkXG4iLAorCQkJCSh1MzIpaW5zdF9pbmZvLmNvcmVfaWR4LAorCQkJCSh1MzIpaW5zdF9pbmZvLmluc3RfaWR4LAorCQkJCWluc3RfaW5mby5pbnN0X29wZW5fY291bnQpOworCQl9CisJCWJyZWFrOworCWNhc2UgVkRJX0lPQ1RMX1JFU0VUOgorCQl7CisJCQl2cHVfaHdfcmVzZXQoKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFZESV9JT0NUTF9HRVRfUkVHSVNURVJfSU5GTzoKKwkJeworCQkJZW5jX3ByKExPR19BTEwsCisJCQkJIlsrXVZESV9JT0NUTF9HRVRfUkVHSVNURVJfSU5GT1xuIik7CisJCQlyZXQgPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLAorCQkJCSZzX3ZwdV9yZWdpc3RlciwKKwkJCQlzaXplb2Yoc3RydWN0IHZwdWRydl9idWZmZXJfdCkpOworCQkJaWYgKHJldCAhPSAwKQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkiWy1dVkRJX0lPQ1RMX0dFVF9SRUdJU1RFUl9JTkZPICIpOworCQkJZW5jX3ByKExPR19BTEwsCisJCQkJInNfdnB1X3JlZ2lzdGVyLnBoeXNfYWRkcj0weCVseCwgIiwKKwkJCQlzX3ZwdV9yZWdpc3Rlci5waHlzX2FkZHIpOworCQkJZW5jX3ByKExPR19BTEwsCisJCQkJInNfdnB1X3JlZ2lzdGVyLnZpcnRfYWRkcj0weCVseCwgIiwKKwkJCQlzX3ZwdV9yZWdpc3Rlci52aXJ0X2FkZHIpOworCQkJZW5jX3ByKExPR19BTEwsCisJCQkJInNfdnB1X3JlZ2lzdGVyLnNpemU9MHgleFxuIiwKKwkJCQlzX3ZwdV9yZWdpc3Rlci5zaXplKTsKKwkJfQorCQlicmVhazsKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJY2FzZSBWRElfSU9DVExfR0VUX1JFR0lTVEVSX0lORk8zMjoKKwkJeworCQkJc3RydWN0IGNvbXBhdF92cHVkcnZfYnVmZmVyX3QgYnVmMzI7CisKKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbK11WRElfSU9DVExfR0VUX1JFR0lTVEVSX0lORk8zMlxuIik7CisKKwkJCW1lbXNldCgmYnVmMzIsIDAsIHNpemVvZihzdHJ1Y3QgY29tcGF0X3ZwdWRydl9idWZmZXJfdCkpOworCQkJYnVmMzIuc2l6ZSA9IHNfdnB1X3JlZ2lzdGVyLnNpemU7CisJCQlidWYzMi5waHlzX2FkZHIgPQorCQkJCShjb21wYXRfdWxvbmdfdCkKKwkJCQlzX3ZwdV9yZWdpc3Rlci5waHlzX2FkZHI7CisJCQlidWYzMi52aXJ0X2FkZHIgPQorCQkJCShjb21wYXRfdWxvbmdfdCkKKwkJCQlzX3ZwdV9yZWdpc3Rlci52aXJ0X2FkZHI7CisJCQlyZXQgPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLAorCQkJCSZidWYzMiwKKwkJCQlzaXplb2YoCisJCQkJc3RydWN0IGNvbXBhdF92cHVkcnZfYnVmZmVyX3QpKTsKKwkJCWlmIChyZXQgIT0gMCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJZW5jX3ByKExPR19BTEwsCisJCQkJIlstXVZESV9JT0NUTF9HRVRfUkVHSVNURVJfSU5GTzMyICIpOworCQkJZW5jX3ByKExPR19BTEwsCisJCQkJInNfdnB1X3JlZ2lzdGVyLnBoeXNfYWRkcj0weCVseCwgIiwKKwkJCQlzX3ZwdV9yZWdpc3Rlci5waHlzX2FkZHIpOworCQkJZW5jX3ByKExPR19BTEwsCisJCQkJInNfdnB1X3JlZ2lzdGVyLnZpcnRfYWRkcj0weCVseCwgIiwKKwkJCQlzX3ZwdV9yZWdpc3Rlci52aXJ0X2FkZHIpOworCQkJZW5jX3ByKExPR19BTEwsCisJCQkJInNfdnB1X3JlZ2lzdGVyLnNpemU9MHgleFxuIiwKKwkJCQlzX3ZwdV9yZWdpc3Rlci5zaXplKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFZESV9JT0NUTF9GTFVTSF9CVUZGRVIzMjoKKwkJeworCQkJc3RydWN0IHZwdWRydl9idWZmZXJfcG9vbF90ICpwb29sLCAqbjsKKwkJCXN0cnVjdCBjb21wYXRfdnB1ZHJ2X2J1ZmZlcl90IGJ1ZjMyOworCQkJc3RydWN0IHZwdWRydl9idWZmZXJfdCB2YjsKKwkJCWJvb2wgZmluZCA9IGZhbHNlOworCQkJdTMyIGNhY2hlZCA9IDA7CisKKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbK11WRElfSU9DVExfRkxVU0hfQlVGRkVSMzJcbiIpOworCisJCQlyZXQgPSBjb3B5X2Zyb21fdXNlcigmYnVmMzIsCisJCQkJKHN0cnVjdCBjb21wYXRfdnB1ZHJ2X2J1ZmZlcl90ICopYXJnLAorCQkJCXNpemVvZihzdHJ1Y3QgY29tcGF0X3ZwdWRydl9idWZmZXJfdCkpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJc3Bpbl9sb2NrKCZzX3ZwdV9sb2NrKTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb29sLCBuLAorCQkJCSZzX3ZicF9oZWFkLCBsaXN0KSB7CisJCQkJaWYgKHBvb2wtPmZpbHAgPT0gZmlscCkgeworCQkJCQl2YiA9IHBvb2wtPnZiOworCQkJCQlpZiAoKChjb21wYXRfdWxvbmdfdCl2Yi5waHlzX2FkZHIgPD0KKwkJCQkJCWJ1ZjMyLnBoeXNfYWRkcikgJiYKKwkJCQkJCSgoKGNvbXBhdF91bG9uZ190KXZiLnBoeXNfYWRkcgorCQkJCQkJCSsgdmIuc2l6ZSkKKwkJCQkJCT4gYnVmMzIucGh5c19hZGRyKQorCQkJCQkJJiYgZmluZCA9PSBmYWxzZSl7CisJCQkJCQljYWNoZWQgPSB2Yi5jYWNoZWQ7CisJCQkJCQlmaW5kID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJc3Bpbl91bmxvY2soJnNfdnB1X2xvY2spOworCisJCQlpZiAoZmluZCAmJiBjYWNoZWQpCisJCQkJZG1hX2ZsdXNoKAorCQkJCQkodTMyKWJ1ZjMyLnBoeXNfYWRkciwKKwkJCQkJKHUzMilidWYzMi5zaXplKTsKKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbLV1WRElfSU9DVExfRkxVU0hfQlVGRkVSMzJcbiIpOworCQl9CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBWRElfSU9DVExfRkxVU0hfQlVGRkVSOgorCQl7CisJCQlzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl9wb29sX3QgKnBvb2wsICpuOworCQkJc3RydWN0IHZwdWRydl9idWZmZXJfdCB2YiwgYnVmOworCQkJYm9vbCBmaW5kID0gZmFsc2U7CisJCQl1MzIgY2FjaGVkID0gMDsKKworCQkJZW5jX3ByKExPR19BTEwsCisJCQkJIlsrXVZESV9JT0NUTF9GTFVTSF9CVUZGRVJcbiIpOworCisJCQlyZXQgPSBjb3B5X2Zyb21fdXNlcigmYnVmLAorCQkJCShzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90ICopYXJnLAorCQkJCXNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90KSk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlzcGluX2xvY2soJnNfdnB1X2xvY2spOworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvb2wsIG4sCisJCQkJJnNfdmJwX2hlYWQsIGxpc3QpIHsKKwkJCQlpZiAocG9vbC0+ZmlscCA9PSBmaWxwKSB7CisJCQkJCXZiID0gcG9vbC0+dmI7CisJCQkJCWlmICgodmIucGh5c19hZGRyIDw9IGJ1Zi5waHlzX2FkZHIpCisJCQkJCQkmJiAoKHZiLnBoeXNfYWRkciArIHZiLnNpemUpCisJCQkJCQkJPiBidWYucGh5c19hZGRyKQorCQkJCQkJJiYgZmluZCA9PSBmYWxzZSl7CisJCQkJCQljYWNoZWQgPSB2Yi5jYWNoZWQ7CisJCQkJCQlmaW5kID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJc3Bpbl91bmxvY2soJnNfdnB1X2xvY2spOworCQkJaWYgKGZpbmQgJiYgY2FjaGVkKQorCQkJCWRtYV9mbHVzaCgKKwkJCQkJKHUzMilidWYucGh5c19hZGRyLAorCQkJCQkodTMyKWJ1Zi5zaXplKTsKKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbLV1WRElfSU9DVExfRkxVU0hfQlVGRkVSXG4iKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFZESV9JT0NUTF9DQUNIRV9JTlZfQlVGRkVSOgorCQl7CisJCQlzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90IGJ1ZjsKKwkJCXN0cnVjdCB2cHVkcnZfYnVmZmVyX3Bvb2xfdCAqcG9vbCwgKm47CisJCQlzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90IHZiOworCQkJYm9vbCBmaW5kID0gZmFsc2U7CisJCQl1MzIgY2FjaGVkID0gMDsKKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbK11WRElfSU9DVExfQ0FDSEVfSU5WX0JVRkZFUlxuIik7CisKKwkJCXJldCA9IGNvcHlfZnJvbV91c2VyKCZidWYsCisJCQkJKHN0cnVjdCB2cHVkcnZfYnVmZmVyX3QgKilhcmcsCisJCQkJc2l6ZW9mKHN0cnVjdCB2cHVkcnZfYnVmZmVyX3QpKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXNwaW5fbG9jaygmc192cHVfbG9jayk7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9vbCwgbiwgJnNfdmJwX2hlYWQsIGxpc3QpIHsKKwkJCQlpZiAocG9vbC0+ZmlscCA9PSBmaWxwKSB7CisJCQkJCXZiID0gcG9vbC0+dmI7CisJCQkJCWlmICgodmIucGh5c19hZGRyIDw9IGJ1Zi5waHlzX2FkZHIpICYmICgodmIucGh5c19hZGRyICsgdmIuc2l6ZSkgPiBidWYucGh5c19hZGRyKSAmJiBmaW5kID09IGZhbHNlKSB7CisJCQkJCQljYWNoZWQgPSB2Yi5jYWNoZWQ7CisJCQkJCQlmaW5kID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJc3Bpbl91bmxvY2soJnNfdnB1X2xvY2spOworCQkJaWYgKGZpbmQgJiYgY2FjaGVkKSB7CisJCQkJLy9wcl9lcnIoIlslZF1kb2luZyBjYWNoZSBmbHVzaCBmb3IgJXB+JXBcbiIsIF9fTElORV9fLCAobG9uZykoYnVmLnBoeXNfYWRkciksIChsb25nKShidWYucGh5c19hZGRyK2J1Zi5zaXplKSk7CisJCQkJY2FjaGVfZmx1c2goKHUzMilidWYucGh5c19hZGRyLCh1MzIpYnVmLnNpemUpOworCQkJfQorCisJCQllbmNfcHIoTE9HX0FMTCwiWy1dVkRJX0lPQ1RMX0NBQ0hFX0lOVl9CVUZGRVJcbiIpOworCQl9CisJCWJyZWFrOworI2lmZGVmIENPTkZJR19DT01QQVQKKwljYXNlIFZESV9JT0NUTF9DQUNIRV9JTlZfQlVGRkVSMzI6CisJCXsKKwkJCXN0cnVjdCBjb21wYXRfdnB1ZHJ2X2J1ZmZlcl90IGJ1ZjMyOworCQkJc3RydWN0IHZwdWRydl9idWZmZXJfcG9vbF90ICpwb29sLCAqbjsKKwkJCXN0cnVjdCB2cHVkcnZfYnVmZmVyX3QgdmI7CisJCQlib29sIGZpbmQgPSBmYWxzZTsKKwkJCXUzMiBjYWNoZWQgPSAwOworCQkJZW5jX3ByKExPR19BTEwsICJbK11WRElfSU9DVExfQ0FDSEVfSU5WX0JVRkZFUjMyXG4iKTsKKworCQkJcmV0ID0gY29weV9mcm9tX3VzZXIoJmJ1ZjMyLAorCQkJCShzdHJ1Y3QgY29tcGF0X3ZwdWRydl9idWZmZXJfdCAqKWFyZywKKwkJCQlzaXplb2Yoc3RydWN0IGNvbXBhdF92cHVkcnZfYnVmZmVyX3QpKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXNwaW5fbG9jaygmc192cHVfbG9jayk7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9vbCwgbiwKKwkJCQkmc192YnBfaGVhZCwgbGlzdCkgeworCQkJCWlmIChwb29sLT5maWxwID09IGZpbHApIHsKKwkJCQkJdmIgPSBwb29sLT52YjsKKwkJCQkJaWYgKCgoY29tcGF0X3Vsb25nX3QpdmIucGh5c19hZGRyCisJCQkJCQk8PSBidWYzMi5waHlzX2FkZHIpCisJCQkJCSYmICgoKGNvbXBhdF91bG9uZ190KXZiLnBoeXNfYWRkciArCisJCQkJCQl2Yi5zaXplKSA+IGJ1ZjMyLnBoeXNfYWRkcikKKwkJCQkJJiYgZmluZCA9PSBmYWxzZSl7CisJCQkJCQljYWNoZWQgPSB2Yi5jYWNoZWQ7CisJCQkJCQlmaW5kID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJc3Bpbl91bmxvY2soJnNfdnB1X2xvY2spOworCisJCQlpZiAoZmluZCAmJiBjYWNoZWQpIHsKKwkJCQljYWNoZV9mbHVzaCgodTMyKWJ1ZjMyLnBoeXNfYWRkciwgKHUzMilidWYzMi5zaXplKTsKKworCQkJCWlmIChkdW1wX2VzKSB7CisJCQkJCXByX2VycigiZHVtcCBlcyBmcmFtZSwgc2l6ZT0ldVxuIiwgKHUzMilidWYzMi5zaXplKTsKKwkJCQkJZHVtcF9kYXRhKCh1MzIpYnVmMzIucGh5c19hZGRyLCAodTMyKWJ1ZjMyLnNpemUpOworCQkJCX0KKwkJCX0KKwkJCWVuY19wcihMT0dfSU5GTywgIlstXVZWRElfSU9DVExfQ0FDSEVfSU5WX0JVRkZFUjMyXG4iKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorCWNhc2UgVkRJX0lPQ1RMX0NPTkZJR19ETUE6CisJCXsKKwkJCXN0cnVjdCB2cHVkcnZfZG1hX2J1Zl9pbmZvX3QgZG1hX2luZm87CisJCQllbmNfcHIoTE9HX0RFQlVHLAorCQkJCSJbK11WRElfSU9DVExfQ09ORklHX0RNQV9CVUZcbiIpOworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoJmRtYV9pbmZvLAorCQkJCShzdHJ1Y3QgdnB1ZHJ2X2RtYV9idWZfaW5mb190ICopYXJnLAorCQkJCXNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2RtYV9idWZfaW5mb190KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJnNfdnB1X3NlbSk7CisJCQlpZiAocmV0ICE9IDApCisJCQkJYnJlYWs7CisJCQlpZiAodnB1X3NyY19hZGRyX2NvbmZpZygmZG1hX2luZm8sIGZpbHApKSB7CisJCQkJdXAoJnNfdnB1X3NlbSk7CisJCQkJZW5jX3ByKExPR19FUlJPUiwKKwkJCQkJCSJzcmMgYWRkciBjb25maWcgZXJyb3JcbiIpOworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQl1cCgmc192cHVfc2VtKTsKKwkJCXJldCA9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJJmRtYV9pbmZvLAorCQkJCXNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2RtYV9idWZfaW5mb190KSk7CisJCQlpZiAocmV0KSB7CisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVuY19wcihMT0dfREVCVUcsCisJCQkJIlstXVZESV9JT0NUTF9DT05GSUdfRE1BX0JVRiAlZCwgJWQsICVkXG4iLAorCQkJCWRtYV9pbmZvLmZkWzBdLAorCQkJCWRtYV9pbmZvLmZkWzFdLAorCQkJCWRtYV9pbmZvLmZkWzJdKTsKKwkJfQorCQlicmVhazsKKworCQkvL2hvYW4gYWRkIGZvciBjYW52YXMKKwkJY2FzZSBWRElfSU9DVExfUkVBRF9DQU5WQVM6CisJCXsKKwkJCXN0cnVjdCB2cHVkcnZfZG1hX2J1Zl9jYW52YXNfaW5mb190IGRtYV9pbmZvOworCisJCQlzdHJ1Y3QgY2FudmFzX3MgZHN0IDsKKwkJICAgIHUzMiBjYW52YXMgPSAwOworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoJmRtYV9pbmZvLAorCQkJCQkoc3RydWN0IHZwdWRydl9kbWFfYnVmX2NhbnZhc19pbmZvX3QgKilhcmcsCisJCQkJCXNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2RtYV9idWZfY2FudmFzX2luZm9fdCkpKQorCQkJeworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCisJCQlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJnNfdnB1X3NlbSk7CisJCQlpZiAocmV0ICE9IDApCisJCQl7CisJCQkJdXAoJnNfdnB1X3NlbSk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhbnZhcyA9IGRtYV9pbmZvLmNhbnZhc19pbmRleDsKKwkJCWVuY19wcihMT0dfREVCVUcsIlsrXVZESV9JT0NUTF9SRUFEX0NBTlZBUyxjYW52YXMgPSAweCV4XG4iLGNhbnZhcyk7CisJCQlpZiAoY2FudmFzICYgMHhmZikKKwkJCXsKKwkJCQljYW52YXNfcmVhZChjYW52YXMgJiAweGZmLCAmZHN0KTsKKwkJCQlkbWFfaW5mby5waHlzX2FkZHJbMF0gPSBkc3QuYWRkcjsKKworCQkJCWlmICgoY2FudmFzICYgMHhmZjAwKSA+PiA4KQorCQkJCXsKKwkJCQkJY2FudmFzX3JlYWQoKGNhbnZhcyAmIDB4ZmYwMCkgPj4gOCwgJmRzdCk7CisJCQkJCWRtYV9pbmZvLnBoeXNfYWRkclsxXSA9IGRzdC5hZGRyOworCisJCQkJfQorCisJCQkJaWYgKChjYW52YXMgJiAweGZmMDAwMCkgPj4gMTYpCisJCQkJeworCQkJCQljYW52YXNfcmVhZCgoY2FudmFzICYgMHhmZjAwMDApID4+IDE2LCAmZHN0KTsKKwkJCQkJZG1hX2luZm8ucGh5c19hZGRyWzJdID0gZHN0LmFkZHI7CisJCQkJfQorCisJCQkJZW5jX3ByKExPR19ERUJVRywiWytdVkRJX0lPQ1RMX1JFQURfQ0FOVkFTLHBoeXNfYWRkclswXSA9IDB4JWx4LHBoeXNfYWRkclsxXSA9IDB4JWx4LHBoeXNfYWRkclsyXSA9IDB4JWx4XG4iLGRtYV9pbmZvLnBoeXNfYWRkclswXSxkbWFfaW5mby5waHlzX2FkZHJbMV0sZG1hX2luZm8ucGh5c19hZGRyWzJdKTsKKworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWRtYV9pbmZvLnBoeXNfYWRkclswXSA9IDA7CisJCQkJZG1hX2luZm8ucGh5c19hZGRyWzFdID0gMDsKKwkJCQlkbWFfaW5mby5waHlzX2FkZHJbMl0gPSAwOworCQkJfQorCQkJdXAoJnNfdnB1X3NlbSk7CisJCQkjaWYgMAorCQkJZG1hX2luZm8ucGh5c19hZGRyWzBdID0gcGh5c19hZGRyWTsKKwkJCWRtYV9pbmZvLnBoeXNfYWRkclsxXSA9IHBoeXNfYWRkclU7CisJCQlkbWFfaW5mby5waHlzX2FkZHJbMl0gPSBwaHlzX2FkZHJWOworCQkJI2VuZGlmCisKKwkJCXJldCA9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJJmRtYV9pbmZvLAorCQkJCXNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2RtYV9idWZfY2FudmFzX2luZm9fdCkpOworCisJCQllbmNfcHIoTE9HX0RFQlVHLCJbLV1WRElfSU9DVExfUkVBRF9DQU5WQVMsY29weV90b191c2VyIEVuZFxuIik7CisJCQlpZiAocmV0KQorCQkJeworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJfQorCQlicmVhazsKKwkJLy9lbmQKKworI2lmZGVmIENPTkZJR19DT01QQVQKKwljYXNlIFZESV9JT0NUTF9DT05GSUdfRE1BMzI6CisJCXsKKwkJCXN0cnVjdCB2cHVkcnZfZG1hX2J1Zl9pbmZvX3QgZG1hX2luZm87CisJCQlzdHJ1Y3QgY29tcGF0X3ZwdWRydl9kbWFfYnVmX2luZm9fdCBkbWFfaW5mbzMyOworCQkJZW5jX3ByKExPR19BTEwsCisJCQkJIlsrXVZESV9JT0NUTF9DT05GSUdfRE1BX0JVRjMyXG4iKTsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZkbWFfaW5mbzMyLAorCQkJCShzdHJ1Y3QgY29tcGF0X3ZwdWRydl9kbWFfYnVmX2luZm9fdCAqKWFyZywKKwkJCQlzaXplb2Yoc3RydWN0IGNvbXBhdF92cHVkcnZfZG1hX2J1Zl9pbmZvX3QpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWRtYV9pbmZvLm51bV9wbGFuZXMgPSBkbWFfaW5mbzMyLm51bV9wbGFuZXM7CisJCQlkbWFfaW5mby5mZFswXSA9IChpbnQpIGRtYV9pbmZvMzIuZmRbMF07CisJCQlkbWFfaW5mby5mZFsxXSA9IChpbnQpIGRtYV9pbmZvMzIuZmRbMV07CisJCQlkbWFfaW5mby5mZFsyXSA9IChpbnQpIGRtYV9pbmZvMzIuZmRbMl07CisJCQlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJnNfdnB1X3NlbSk7CisJCQlpZiAocmV0ICE9IDApCisJCQkJYnJlYWs7CisJCQlpZiAodnB1X3NyY19hZGRyX2NvbmZpZygmZG1hX2luZm8sIGZpbHApKSB7CisJCQkJdXAoJnNfdnB1X3NlbSk7CisJCQkJZW5jX3ByKExPR19FUlJPUiwKKwkJCQkJCSJzcmMgYWRkciBjb25maWcgZXJyb3JcbiIpOworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQl1cCgmc192cHVfc2VtKTsKKwkJCWRtYV9pbmZvMzIucGh5c19hZGRyWzBdID0KKwkJCQkoY29tcGF0X3Vsb25nX3QpIGRtYV9pbmZvLnBoeXNfYWRkclswXTsKKwkJCWRtYV9pbmZvMzIucGh5c19hZGRyWzFdID0KKwkJCQkoY29tcGF0X3Vsb25nX3QpIGRtYV9pbmZvLnBoeXNfYWRkclsxXTsKKwkJCWRtYV9pbmZvMzIucGh5c19hZGRyWzJdID0KKwkJCQkoY29tcGF0X3Vsb25nX3QpIGRtYV9pbmZvLnBoeXNfYWRkclsyXTsKKwkJCXJldCA9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJJmRtYV9pbmZvMzIsCisJCQkJc2l6ZW9mKHN0cnVjdCBjb21wYXRfdnB1ZHJ2X2RtYV9idWZfaW5mb190KSk7CisJCQlpZiAocmV0KSB7CisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbLV1WRElfSU9DVExfQ09ORklHX0RNQV9CVUYzMiAlZCwgJWQsICVkXG4iLAorCQkJCWRtYV9pbmZvLmZkWzBdLAorCQkJCWRtYV9pbmZvLmZkWzFdLAorCQkJCWRtYV9pbmZvLmZkWzJdKTsKKwkJfQorCQlicmVhazsKKworI2lmIDEKKworCS8vaG9hbiBhZGQgZm9yIGNhbnZhcworCWNhc2UgVkRJX0lPQ1RMX1JFQURfQ0FOVkFTMzI6CisJeworCQlzdHJ1Y3QgdnB1ZHJ2X2RtYV9idWZfY2FudmFzX2luZm9fdCBkbWFfaW5mbzsKKwkJc3RydWN0IGNvbXBhdF92cHVkcnZfZG1hX2J1Zl9jYW52YXNfaW5mb190IGRtYV9pbmZvMzI7CisJCXN0cnVjdCBjYW52YXNfcyBkc3Q7CisJCXUzMiBjYW52YXMgPSAwOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmZG1hX2luZm8zMiwKKwkJCQkoc3RydWN0IGNvbXBhdF92cHVkcnZfZG1hX2J1Zl9jYW52YXNfaW5mb190ICopYXJnLAorCQkJCXNpemVvZihzdHJ1Y3QgY29tcGF0X3ZwdWRydl9kbWFfYnVmX2NhbnZhc19pbmZvX3QpKSkKKwkJeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJnNfdnB1X3NlbSk7CisJCWlmIChyZXQgIT0gMCkKKwkJeworCQkJdXAoJnNfdnB1X3NlbSk7CisJCQlicmVhazsKKwkJfQorCisJCWNhbnZhcyA9IGRtYV9pbmZvMzIuY2FudmFzX2luZGV4OworCQllbmNfcHIoTE9HX0lORk8sIlsrXVZESV9JT0NUTF9SRUFEX0NBTlZBUzMyLGNhbnZhcyA9IDB4JXhcbiIsZG1hX2luZm8zMi5jYW52YXNfaW5kZXgpOworCQlpZiAoY2FudmFzICYgMHhmZikKKwkJeworCQkJY2FudmFzX3JlYWQoY2FudmFzICYgMHhmZiwgJmRzdCk7CisJCQlkbWFfaW5mby5waHlzX2FkZHJbMF0gPSBkc3QuYWRkcjsKKworCQkJaWYgKGR1bXBfaW5wdXQpIHsKKwkJCQlkdW1wX3Jhd19pbnB1dCgmZHN0KTsKKwkJCX0KKworCQkJaWYgKChjYW52YXMgJiAweGZmMDApID4+IDgpCisJCQl7CisJCQkJY2FudmFzX3JlYWQoKGNhbnZhcyAmIDB4ZmYwMCkgPj4gOCwgJmRzdCk7CisJCQkJZG1hX2luZm8ucGh5c19hZGRyWzFdID0gZHN0LmFkZHI7CisJCQkJaWYgKGR1bXBfaW5wdXQpIHsKKwkJCQkJZHVtcF9yYXdfaW5wdXQoJmRzdCk7CisJCQkJfQorCQkJfQorCisJCQlpZiAoKGNhbnZhcyAmIDB4ZmYwMDAwKSA+PiAxNikKKwkJCXsKKwkJCQljYW52YXNfcmVhZCgoY2FudmFzICYgMHhmZjAwMDApID4+IDE2LCAmZHN0KTsKKwkJCQlkbWFfaW5mby5waHlzX2FkZHJbMl0gPSBkc3QuYWRkcjsKKwkJCQlpZiAoZHVtcF9pbnB1dCkgeworCQkJCQlkdW1wX3Jhd19pbnB1dCgmZHN0KTsKKwkJCQl9CisJCQl9CisKKwkJCWVuY19wcihMT0dfSU5GTywiVkRJX0lPQ1RMX1JFQURfQ0FOVkFTMzJfMSxwaHlzX2FkZHJbMF0gPSAweCVseCxwaHlzX2FkZHJbMV0gPSAweCVseCxwaHlzX2FkZHJbMl0gPSAweCVseFxuIiwKKwkJCQlkbWFfaW5mby5waHlzX2FkZHJbMF0sZG1hX2luZm8ucGh5c19hZGRyWzFdLGRtYV9pbmZvLnBoeXNfYWRkclsyXSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlkbWFfaW5mby5waHlzX2FkZHJbMF0gPSAwOworCQkJZG1hX2luZm8ucGh5c19hZGRyWzFdID0gMDsKKwkJCWRtYV9pbmZvLnBoeXNfYWRkclsyXSA9IDA7CisJCX0KKworCQl1cCgmc192cHVfc2VtKTsKKworCQlkbWFfaW5mbzMyLnBoeXNfYWRkclswXSA9ICAoY29tcGF0X3Vsb25nX3QpZG1hX2luZm8ucGh5c19hZGRyWzBdOworCQlkbWFfaW5mbzMyLnBoeXNfYWRkclsxXSA9ICAoY29tcGF0X3Vsb25nX3QpZG1hX2luZm8ucGh5c19hZGRyWzFdOworCQlkbWFfaW5mbzMyLnBoeXNfYWRkclsyXSA9ICAoY29tcGF0X3Vsb25nX3QpZG1hX2luZm8ucGh5c19hZGRyWzJdOworCisJCWVuY19wcihMT0dfSU5GTywiVkRJX0lPQ1RMX1JFQURfQ0FOVkFTMzJfMixwaHlzX2FkZHJbMF0gPSAweCVseCxwaHlzX2FkZHJbMV0gPSAweCVseCxwaHlzX2FkZHJbMl0gPSAweCVseFxuIixkbWFfaW5mby5waHlzX2FkZHJbMF0sICBkbWFfaW5mby5waHlzX2FkZHJbMV0sICBkbWFfaW5mby5waHlzX2FkZHJbMl0pOworCQllbmNfcHIoTE9HX0lORk8sIlZESV9JT0NUTF9SRUFEX0NBTlZBUzMyXzMscGh5c19hZGRyWzBdID0gMHgleCxwaHlzX2FkZHJbMV0gPSAweCV4LHBoeXNfYWRkclsyXSA9IDB4JXhcbiIsICAgZG1hX2luZm8zMi5waHlzX2FkZHJbMF0sZG1hX2luZm8zMi5waHlzX2FkZHJbMV0sZG1hX2luZm8zMi5waHlzX2FkZHJbMl0pOworCisJCXJldCA9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsCisJCQkmZG1hX2luZm8zMiwKKwkJCXNpemVvZihzdHJ1Y3QgY29tcGF0X3ZwdWRydl9kbWFfYnVmX2NhbnZhc19pbmZvX3QpKTsKKworCQllbmNfcHIoTE9HX0lORk8sIlstXVZESV9JT0NUTF9SRUFEX0NBTlZBUyxjb3B5X3RvX3VzZXIgRW5kXG4iKTsKKwkJaWYgKHJldCkKKwkJeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwl9CisJYnJlYWs7CisJLy9lbmQKKyNlbmRpZgorCisJY2FzZSBWRElfSU9DVExfVU5NQVBfRE1BMzI6CisJCXsKKwkJCXN0cnVjdCB2cHVkcnZfZG1hX2J1Zl9pbmZvX3QgZG1hX2luZm87CisJCQlzdHJ1Y3QgY29tcGF0X3ZwdWRydl9kbWFfYnVmX2luZm9fdCBkbWFfaW5mbzMyOworCisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkiWytdVkRJX0lPQ1RMX1VOTUFQX0RNQTMyXG4iKTsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZkbWFfaW5mbzMyLAorCQkJCShzdHJ1Y3QgY29tcGF0X3ZwdWRydl9kbWFfYnVmX2luZm9fdCAqKWFyZywKKwkJCQlzaXplb2Yoc3RydWN0IGNvbXBhdF92cHVkcnZfZG1hX2J1Zl9pbmZvX3QpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWRtYV9pbmZvLm51bV9wbGFuZXMgPSBkbWFfaW5mbzMyLm51bV9wbGFuZXM7CisJCQlkbWFfaW5mby5mZFswXSA9IChpbnQpIGRtYV9pbmZvMzIuZmRbMF07CisJCQlkbWFfaW5mby5mZFsxXSA9IChpbnQpIGRtYV9pbmZvMzIuZmRbMV07CisJCQlkbWFfaW5mby5mZFsyXSA9IChpbnQpIGRtYV9pbmZvMzIuZmRbMl07CisJCQlkbWFfaW5mby5waHlzX2FkZHJbMF0gPQorCQkJCSh1bG9uZykgZG1hX2luZm8zMi5waHlzX2FkZHJbMF07CisJCQlkbWFfaW5mby5waHlzX2FkZHJbMV0gPQorCQkJCSh1bG9uZykgZG1hX2luZm8zMi5waHlzX2FkZHJbMV07CisJCQlkbWFfaW5mby5waHlzX2FkZHJbMl0gPQorCQkJCSh1bG9uZykgZG1hX2luZm8zMi5waHlzX2FkZHJbMl07CisKKwkJCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmc192cHVfc2VtKTsKKwkJCWlmIChyZXQgIT0gMCkKKwkJCQlicmVhazsKKwkJCWlmICh2cHVfc3JjX2FkZHJfdW5tYXAoJmRtYV9pbmZvLCBmaWxwKSkgeworCQkJCXVwKCZzX3ZwdV9zZW0pOworCQkJCWVuY19wcihMT0dfRVJST1IsCisJCQkJCSJkbWEgYWRkciB1bm1hcCBjb25maWcgZXJyb3JcbiIpOworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQl1cCgmc192cHVfc2VtKTsKKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbLV1WRElfSU9DVExfVU5NQVBfRE1BMzJcbiIpOworCQl9CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBWRElfSU9DVExfVU5NQVBfRE1BOgorCQl7CisJCQlzdHJ1Y3QgdnB1ZHJ2X2RtYV9idWZfaW5mb190IGRtYV9pbmZvOworCisJCQllbmNfcHIoTE9HX0FMTCwKKwkJCQkiWytdVkRJX0lPQ1RMX1VOTUFQX0RNQVxuIik7CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmZG1hX2luZm8sCisJCQkJKHN0cnVjdCB2cHVkcnZfZG1hX2J1Zl9pbmZvX3QgKilhcmcsCisJCQkJc2l6ZW9mKHN0cnVjdCB2cHVkcnZfZG1hX2J1Zl9pbmZvX3QpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmc192cHVfc2VtKTsKKwkJCWlmIChyZXQgIT0gMCkKKwkJCQlicmVhazsKKwkJCWlmICh2cHVfc3JjX2FkZHJfdW5tYXAoJmRtYV9pbmZvLCBmaWxwKSkgeworCQkJCXVwKCZzX3ZwdV9zZW0pOworCQkJCWVuY19wcihMT0dfRVJST1IsCisJCQkJCSJkbWEgYWRkciB1bm1hcCBjb25maWcgZXJyb3JcbiIpOworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQl1cCgmc192cHVfc2VtKTsKKwkJCWVuY19wcihMT0dfQUxMLAorCQkJCSJbLV1WRElfSU9DVExfVU5NQVBfRE1BXG4iKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQl7CisJCQllbmNfcHIoTE9HX0VSUk9SLAorCQkJCSJObyBzdWNoIElPQ1RMLCBjbWQgaXMgMHgleFxuIiwgY21kKTsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdGF0aWMgbG9uZyB2cHVfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1MzIgY21kLCB1bG9uZyBhcmcpCit7CisJbG9uZyByZXQ7CisKKwlhcmcgPSAodWxvbmcpY29tcGF0X3B0cihhcmcpOworCXJldCA9IHZwdV9pb2N0bChmaWxwLCBjbWQsIGFyZyk7CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCitzdGF0aWMgc3NpemVfdCB2cHVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsCisJY29uc3QgY2hhciAqYnVmLAorCXNpemVfdCBsZW4sCisJbG9mZl90ICpwcG9zKQoreworCWVuY19wcihMT0dfSU5GTywgInZwdV93cml0ZSBsZW49JWRcbiIsIChpbnQpbGVuKTsKKworCWlmICghYnVmKSB7CisJCWVuY19wcihMT0dfRVJST1IsICJ2cHVfd3JpdGUgYnVmID0gTlVMTCBlcnJvclxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChsZW4gPT0gc2l6ZW9mKHN0cnVjdCB2cHVfYml0X2Zpcm13YXJlX2luZm9fdCkpCXsKKwkJc3RydWN0IHZwdV9iaXRfZmlybXdhcmVfaW5mb190ICpiaXRfZmlybXdhcmVfaW5mbzsKKworCQliaXRfZmlybXdhcmVfaW5mbyA9CisJCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdnB1X2JpdF9maXJtd2FyZV9pbmZvX3QpLAorCQkJR0ZQX0tFUk5FTCk7CisJCWlmICghYml0X2Zpcm13YXJlX2luZm8pIHsKKwkJCWVuY19wcihMT0dfRVJST1IsCisJCQkJImJpdF9maXJtd2FyZV9pbmZvIGFsbG9jYXRpb24gZXJyb3JcbiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlpZiAoY29weV9mcm9tX3VzZXIoYml0X2Zpcm13YXJlX2luZm8sIGJ1ZiwgbGVuKSkgeworCQkJZW5jX3ByKExPR19FUlJPUiwKKwkJCQkiY29weV9mcm9tX3VzZXIgZXJyb3IgZm9yIGZpcm13YXJlX2luZm9cbiIpOworCQkJa2ZyZWUoYml0X2Zpcm13YXJlX2luZm8pOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlpZiAoYml0X2Zpcm13YXJlX2luZm8tPnNpemUgPT0KKwkJCXNpemVvZihzdHJ1Y3QgdnB1X2JpdF9maXJtd2FyZV9pbmZvX3QpKSB7CisJCQllbmNfcHIoTE9HX0lORk8sCisJCQkJInNldCBiaXRfZmlybXdhcmVfaW5mbyBjb3JlSWR4PSAweCV4LCAiLAorCQkJCWJpdF9maXJtd2FyZV9pbmZvLT5jb3JlX2lkeCk7CisKKwkJCWVuY19wcihMT0dfSU5GTywKKwkJCQkiYmFzZV9vZmZzZXQgPSAweCV4LCBzaXplID0gMHgleCwgIiwKKwkJCQliaXRfZmlybXdhcmVfaW5mby0+cmVnX2Jhc2Vfb2Zmc2V0LAorCQkJCWJpdF9maXJtd2FyZV9pbmZvLT5zaXplKTsKKworCQkJZW5jX3ByKExPR19JTkZPLCJiaXRfY29kZVswXSA9IDB4JXhcbiIsCisJCQkJYml0X2Zpcm13YXJlX2luZm8tPmJpdF9jb2RlWzBdKTsKKworCQkJaWYgKGJpdF9maXJtd2FyZV9pbmZvLT5jb3JlX2lkeAorCQkJCT4gTUFYX05VTV9WUFVfQ09SRSkgeworCQkJCWVuY19wcihMT0dfRVJST1IsCisJCQkJCSJ2cHVfd3JpdGUgY29yZUlkeFslZF0gaXMgIiwKKwkJCQkJYml0X2Zpcm13YXJlX2luZm8tPmNvcmVfaWR4KTsKKwkJCQllbmNfcHIoTE9HX0VSUk9SLAorCQkJCQkiZXhjZWVkZWQgdGhhbiBNQVhfTlVNX1ZQVV9DT1JFWyVkXVxuIiwKKwkJCQkJTUFYX05VTV9WUFVfQ09SRSk7CisJCQkJa2ZyZWUoYml0X2Zpcm13YXJlX2luZm8pOworCQkJCXJldHVybiAtRU5PREVWOworCQkJfQorCQkJaWYgKGJpdF9maXJtd2FyZV9pbmZvLT5jb3JlX2lkeCA+PSBNQVhfTlVNX1ZQVV9DT1JFKQorCQkJeworCQkJCWVuY19wcihMT0dfRVJST1IsCisJCQkJCSJiaXRfZmlybXdhcmVfaW5mby0+Y29yZV9pZHggaW52YWxpZFxuIik7CisJCQkJa2ZyZWUoYml0X2Zpcm13YXJlX2luZm8pOworCQkJCXJldHVybiAtRU5PREVWOworCisJCQl9CisJCQltZW1jcHkoKHZvaWQgKikmc19iaXRfZmlybXdhcmVfaW5mb1tiaXRfZmlybXdhcmVfaW5mby0+Y29yZV9pZHhdLCBiaXRfZmlybXdhcmVfaW5mbywgc2l6ZW9mKHN0cnVjdCB2cHVfYml0X2Zpcm13YXJlX2luZm9fdCkpOworCQkJa2ZyZWUoYml0X2Zpcm13YXJlX2luZm8pOworCQkJcmV0dXJuIGxlbjsKKwkJfQorCisJCWtmcmVlKGJpdF9maXJtd2FyZV9pbmZvKTsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgczMyIHZwdV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXMzMiByZXQgPSAwOworCXUzMiBvcGVuX2NvdW50OworCXMzMiBpOworCisJLy9lbmNfcHIoTE9HX0RFQlVHLCAidnB1X3JlbGVhc2UgZmlscD0lbHUsIGZfY291bnRlcj0lbGxkXG4iLAorCQkJLy8odW5zaWduZWQgbG9uZylmaWxwLCBmaWxwLT5mX2NvdW50LmNvdW50ZXIpOworCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmc192cHVfc2VtKTsKKworCWlmIChyZXQgPT0gMCkgeworCQkvKiBmb3VuZCBhbmQgZnJlZSB0aGUgbm90IGhhbmRsZWQKKwkJYnVmZmVyIGJ5IHVzZXIgYXBwbGljYXRpb25zICovCisJCXZwdV9mcmVlX2J1ZmZlcnMoZmlscCk7CisJCXZwdV9kbWFfYnVmX3JlbGVhc2UoZmlscCk7CisJCS8qIGZvdW5kIGFuZCBmcmVlIHRoZSBub3QgY2xvc2VkCisJCWluc3RhbmNlIGJ5IHVzZXIgYXBwbGljYXRpb25zICovCisJCXZwdV9mcmVlX2luc3RhbmNlcyhmaWxwKTsKKworCQlzcGluX2xvY2soJnNfdnB1X2xvY2spOworCQlzX3ZwdV9kcnZfY29udGV4dC5vcGVuX2NvdW50LS07CisJCW9wZW5fY291bnQgPSBzX3ZwdV9kcnZfY29udGV4dC5vcGVuX2NvdW50OworCQlzcGluX3VubG9jaygmc192cHVfbG9jayk7CisKKwkJcHJfZXJyKCJvcGVuX2NvdW50PSV1XG4iLCBvcGVuX2NvdW50KTsKKworCQlpZiAob3Blbl9jb3VudCA9PSAwKSB7CisJCQlmb3IgKGk9MDsgaTxNQVhfTlVNX0lOU1RBTkNFOyBpKyspIHsKKwkJCQlrZmlmb19yZXNldCgmc19pbnRlcnJ1cHRfcGVuZGluZ19xW2ldKTsKKwkJCQlzX2ludGVycnVwdF9mbGFnW2ldID0gMDsKKwkJCQlzX3ZwdV9kcnZfY29udGV4dC5pbnRlcnJ1cHRfcmVhc29uW2ldID0gMDsKKwkJCQlzX3ZwdV9kcnZfY29udGV4dC5pbnRlcnJ1cHRfZmxhZ1tpXSA9IDA7CisJCQl9CisJCQlpZiAoc19pbnN0YW5jZV9wb29sLmJhc2UpIHsKKwkJCQllbmNfcHIoTE9HX0RFQlVHLCAiZnJlZSBpbnN0YW5jZSBwb29sXG4iKTsKKwkJCQl2ZnJlZSgoY29uc3Qgdm9pZCAqKXNfaW5zdGFuY2VfcG9vbC5iYXNlKTsKKwkJCQlzX2luc3RhbmNlX3Bvb2wuYmFzZSA9IDA7CisJCQl9CisJCQlpZiAoc19jb21tb25fbWVtb3J5LnBoeXNfYWRkcikgeworCQkJCWVuY19wcihMT0dfSU5GTywKKwkJCQkidnB1X3JlbGVhc2UsIHNfY29tbW9uX21lbW9yeSAweCVseFxuIiwKKwkJCQlzX2NvbW1vbl9tZW1vcnkucGh5c19hZGRyKTsKKwkJCQl2cHVfZnJlZV9kbWFfYnVmZmVyKCZzX2NvbW1vbl9tZW1vcnkpOworCQkJCXNfY29tbW9uX21lbW9yeS5waHlzX2FkZHIgPSAwOworCQkJfQorCisJCQlpZiAoc192aWRlb19tZW1vcnkucGh5c19hZGRyICYmICF1c2VfcmVzZXJ2ZSkgeworCQkJCWVuY19wcihMT0dfREVCVUcsCisJCQkJCSJ2cHVfcmVsZWFzZSwgc192aWRlb19tZW1vcnkgMHglbHhcbiIsCisJCQkJCXNfdmlkZW9fbWVtb3J5LnBoeXNfYWRkcik7CisJCQkJY29kZWNfbW1fZnJlZV9mb3JfZG1hKAorCQkJCQlWUFVfREVWX05BTUUsCisJCQkJCSh1MzIpc192aWRlb19tZW1vcnkucGh5c19hZGRyKTsKKwkJCQl2bWVtX2V4aXQoJnNfdm1lbSk7CisJCQkJbWVtc2V0KCZzX3ZpZGVvX21lbW9yeSwKKwkJCQkJMCwgc2l6ZW9mKHN0cnVjdCB2cHVkcnZfYnVmZmVyX3QpKTsKKwkJCQltZW1zZXQoJnNfdm1lbSwKKwkJCQkJMCwgc2l6ZW9mKHN0cnVjdCB2aWRlb19tbV90KSk7CisJCQl9CisJCQlpZiAoKHNfdnB1X2lycSA+PSAwKQorCQkJCSYmIChzX3ZwdV9pcnFfcmVxdWVzdGVkID09IHRydWUpKSB7CisJCQkJZnJlZV9pcnEoc192cHVfaXJxLCAmc192cHVfZHJ2X2NvbnRleHQpOworCQkJCXNfdnB1X2lycV9yZXF1ZXN0ZWQgPSBmYWxzZTsKKwkJCX0KKworCQkJLyogZGlzYWJsZSB2cHUgY2xrcy4qLworCQkJdnB1X2Nsa19kaXNhYmxlKCZzX3ZwdV9jbGtzKTsKKwkJfQorCX0KKwl1cCgmc192cHVfc2VtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHMzMiB2cHVfZmFzeW5jKHMzMiBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIHMzMiBtb2RlKQoreworCXN0cnVjdCB2cHVfZHJ2X2NvbnRleHRfdCAqZGV2ID0KKwkJKHN0cnVjdCB2cHVfZHJ2X2NvbnRleHRfdCAqKWZpbHAtPnByaXZhdGVfZGF0YTsKKwlyZXR1cm4gZmFzeW5jX2hlbHBlcihmZCwgZmlscCwgbW9kZSwgJmRldi0+YXN5bmNfcXVldWUpOworfQorCitzdGF0aWMgczMyIHZwdV9tYXBfdG9fcmVnaXN0ZXIoc3RydWN0IGZpbGUgKmZwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtKQoreworCXVsb25nIHBmbjsKKworCXZtLT52bV9mbGFncyB8PSBWTV9JTyB8IFZNX1JFU0VSVkVEOworCXZtLT52bV9wYWdlX3Byb3QgPQorCQlwZ3Byb3Rfbm9uY2FjaGVkKHZtLT52bV9wYWdlX3Byb3QpOworCXBmbiA9IHNfdnB1X3JlZ2lzdGVyLnBoeXNfYWRkciA+PiBQQUdFX1NISUZUOworCXJldHVybiByZW1hcF9wZm5fcmFuZ2Uodm0sIHZtLT52bV9zdGFydCwgcGZuLAorCQl2bS0+dm1fZW5kIC0gdm0tPnZtX3N0YXJ0LAorCQl2bS0+dm1fcGFnZV9wcm90KSA/IC1FQUdBSU4gOiAwOworfQorCitzdGF0aWMgczMyIHZwdV9tYXBfdG9fcGh5c2ljYWxfbWVtb3J5KAorCXN0cnVjdCBmaWxlICpmcCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bSkKK3sKKwl2bS0+dm1fZmxhZ3MgfD0gVk1fSU8gfCBWTV9SRVNFUlZFRDsKKwlpZiAodm0tPnZtX3Bnb2ZmID09CisJCShzX2NvbW1vbl9tZW1vcnkucGh5c19hZGRyID4+IFBBR0VfU0hJRlQpKSB7CisJCXZtLT52bV9wYWdlX3Byb3QgPQorCQkJcGdwcm90X25vbmNhY2hlZCh2bS0+dm1fcGFnZV9wcm90KTsKKwl9IGVsc2UgeworCQlpZiAodnB1X2lzX2J1ZmZlcl9jYWNoZWQoZnAsIHZtLT52bV9wZ29mZikgPT0gMCkKKwkJCXZtLT52bV9wYWdlX3Byb3QgPQorCQkJCXBncHJvdF9ub25jYWNoZWQodm0tPnZtX3BhZ2VfcHJvdCk7CisJfQorCS8qIHZtLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfd3JpdGVjb21iaW5lKHZtLT52bV9wYWdlX3Byb3QpOyAqLworCXJldHVybiByZW1hcF9wZm5fcmFuZ2Uodm0sIHZtLT52bV9zdGFydCwgdm0tPnZtX3Bnb2ZmLAorCQl2bS0+dm1fZW5kIC0gdm0tPnZtX3N0YXJ0LCB2bS0+dm1fcGFnZV9wcm90KSA/IC1FQUdBSU4gOiAwOworfQorCitzdGF0aWMgczMyIHZwdV9tYXBfdG9faW5zdGFuY2VfcG9vbF9tZW1vcnkoCisJc3RydWN0IGZpbGUgKmZwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtKQoreworCXMzMiByZXQ7CisJbG9uZyBsZW5ndGggPSB2bS0+dm1fZW5kIC0gdm0tPnZtX3N0YXJ0OworCXVsb25nIHN0YXJ0ID0gdm0tPnZtX3N0YXJ0OworCXM4ICp2bWFsbG9jX2FyZWFfcHRyID0gKHM4ICopc19pbnN0YW5jZV9wb29sLmJhc2U7CisJdWxvbmcgcGZuOworCisJdm0tPnZtX2ZsYWdzIHw9IFZNX1JFU0VSVkVEOworCisJLyogbG9vcCBvdmVyIGFsbCBwYWdlcywgbWFwIGl0IHBhZ2UgaW5kaXZpZHVhbGx5ICovCisJd2hpbGUgKGxlbmd0aCA+IDApIHsKKwkJcGZuID0gdm1hbGxvY190b19wZm4odm1hbGxvY19hcmVhX3B0cik7CisJCXJldCA9IHJlbWFwX3Bmbl9yYW5nZSh2bSwgc3RhcnQsIHBmbiwKKwkJCVBBR0VfU0laRSwgUEFHRV9TSEFSRUQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXN0YXJ0ICs9IFBBR0VfU0laRTsKKwkJdm1hbGxvY19hcmVhX3B0ciArPSBQQUdFX1NJWkU7CisJCWxlbmd0aCAtPSBQQUdFX1NJWkU7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogQGJyaWVmIG1lbW9yeSBtYXAgaW50ZXJmYWNlIGZvciB2cHUgZmlsZSBvcGVyYXRpb24KKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZXJyb3IKKyAqLworc3RhdGljIHMzMiB2cHVfbW1hcChzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm0pCit7CisJLyogaWYgKHZtLT52bV9wZ29mZiA9PSAoc192cHVfcmVnaXN0ZXIucGh5c19hZGRyID4+IFBBR0VfU0hJRlQpKSAqLworCWlmICgodm0tPnZtX2VuZCAtIHZtLT52bV9zdGFydCkgPT0gKHNfdnB1X3JlZ2lzdGVyLnNpemUgKyAxKSAmJgorCQkJKHZtLT52bV9wZ29mZiA9PSAwKSkgeworCQl2bS0+dm1fcGdvZmYgPSAoc192cHVfcmVnaXN0ZXIucGh5c19hZGRyID4+IFBBR0VfU0hJRlQpOworCQlyZXR1cm4gdnB1X21hcF90b19yZWdpc3RlcihmcCwgdm0pOworCX0KKworCWlmICh2bS0+dm1fcGdvZmYgPT0gMCkKKwkJcmV0dXJuIHZwdV9tYXBfdG9faW5zdGFuY2VfcG9vbF9tZW1vcnkoZnAsIHZtKTsKKworCXJldHVybiB2cHVfbWFwX3RvX3BoeXNpY2FsX21lbW9yeShmcCwgdm0pOworfQorc3RhdGljIGludCB2cHVfZG1hX2J1ZmZlcl9tYXAoc3RydWN0IHZwdV9kbWFfY2ZnICpjZmcpCit7CisJaW50IHJldCA9IC0xOworCWludCBmZCA9IC0xOworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwlzdHJ1Y3QgZG1hX2J1ZiAqZGJ1ZiA9IE5VTEw7CisJc3RydWN0IGRtYV9idWZfYXR0YWNobWVudCAqZF9hdHQgPSBOVUxMOworCXN0cnVjdCBzZ190YWJsZSAqc2cgPSBOVUxMOworCXZvaWQgKnZhZGRyID0gTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBOVUxMOworCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcjsKKworCWlmIChjZmcgPT0gTlVMTCB8fCAoY2ZnLT5mZCA8IDApIHx8IGNmZy0+ZGV2ID09IE5VTEwpIHsKKwkJZW5jX3ByKExPR19FUlJPUiwgImVycm9yIGRtYSBwYXJhbVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlmZCA9IGNmZy0+ZmQ7CisJZGV2ID0gY2ZnLT5kZXY7CisJZGlyID0gY2ZnLT5kaXI7CisKKwlkYnVmID0gZG1hX2J1Zl9nZXQoZmQpOworCWlmIChJU19FUlJfT1JfTlVMTChkYnVmKSkgeworCQllbmNfcHIoTE9HX0VSUk9SLCAiZmFpbGVkIHRvIGdldCBkbWEgYnVmZmVyLGZkICVkXG4iLGZkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZF9hdHQgPSBkbWFfYnVmX2F0dGFjaChkYnVmLCBkZXYpOworCWlmIChJU19FUlIoZF9hdHQpKSB7CisJCWVuY19wcihMT0dfRVJST1IsICJmYWlsZWQgdG8gc2V0IGRtYSBhdHRhY2hcbiIpOworCQlnb3RvIGF0dGFjaF9lcnI7CisJfQorCisJc2cgPSBkbWFfYnVmX21hcF9hdHRhY2htZW50KGRfYXR0LCBkaXIpOworCWlmIChJU19FUlIoc2cpKSB7CisJCWVuY19wcihMT0dfRVJST1IsICJmYWlsZWQgdG8gZ2V0IGRtYSBzZ1xuIik7CisJCWdvdG8gbWFwX2F0dGFjaF9lcnI7CisJfQorCisJcGFnZSA9IHNnX3BhZ2Uoc2ctPnNnbCk7CisJY2ZnLT5wYWRkciA9IFBGTl9QSFlTKHBhZ2VfdG9fcGZuKHBhZ2UpKTsKKwljZmctPmRidWYgPSBkYnVmOworCWNmZy0+YXR0YWNoID0gZF9hdHQ7CisJY2ZnLT52YWRkciA9IHZhZGRyOworCWNmZy0+c2cgPSBzZzsKKworCXJldHVybiAwOworCittYXBfYXR0YWNoX2VycjoKKwlkbWFfYnVmX2RldGFjaChkYnVmLCBkX2F0dCk7CithdHRhY2hfZXJyOgorCWRtYV9idWZfcHV0KGRidWYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdnB1X2RtYV9idWZmZXJfdW5tYXAoc3RydWN0IHZwdV9kbWFfY2ZnICpjZmcpCit7CisJaW50IGZkID0gLTE7CisJc3RydWN0IGRtYV9idWYgKmRidWYgPSBOVUxMOworCXN0cnVjdCBkbWFfYnVmX2F0dGFjaG1lbnQgKmRfYXR0ID0gTlVMTDsKKwlzdHJ1Y3Qgc2dfdGFibGUgKnNnID0gTlVMTDsKKwkvKnZvaWQgKnZhZGRyID0gTlVMTDsqLworCXN0cnVjdCBkZXZpY2UgKmRldiA9IE5VTEw7CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyOworCisJaWYgKGNmZyA9PSBOVUxMIHx8IChjZmctPmZkIDwgMCkgfHwgY2ZnLT5kZXYgPT0gTlVMTAorCQkJfHwgY2ZnLT5kYnVmID09IE5VTEwgLyp8fCBjZmctPnZhZGRyID09IE5VTEwqLworCQkJfHwgY2ZnLT5hdHRhY2ggPT0gTlVMTCB8fCBjZmctPnNnID09IE5VTEwpIHsKKwkJZW5jX3ByKExPR19FUlJPUiwgInVubWFwOiBFcnJvciBkbWEgcGFyYW1cbiIpOworCQlyZXR1cm47CisJfQorCisJZmQgPSBjZmctPmZkOworCWRldiA9IGNmZy0+ZGV2OworCWRpciA9IGNmZy0+ZGlyOworCWRidWYgPSBjZmctPmRidWY7CisJZF9hdHQgPSBjZmctPmF0dGFjaDsKKwlzZyA9IGNmZy0+c2c7CisKKwlkbWFfYnVmX3VubWFwX2F0dGFjaG1lbnQoZF9hdHQsIHNnLCBkaXIpOworCWRtYV9idWZfZGV0YWNoKGRidWYsIGRfYXR0KTsKKwlkbWFfYnVmX3B1dChkYnVmKTsKKworCWVuY19wcihMT0dfSU5GTywgInZwdV9kbWFfYnVmZmVyX3VubWFwIGZkICVkXG4iLGZkKTsKK30KKworc3RhdGljIHMzMiB2cHVfZG1hX2J1ZmZlcl9nZXRfcGh5cyhzdHJ1Y3QgdnB1X2RtYV9jZmcgKmNmZywKKwkJdW5zaWduZWQgbG9uZyAqYWRkcikKK3sKKwlpbnQgcmV0ID0gMDsKKwlpZiAoY2ZnLT5wYWRkciA9PSAwKQorCXsgLyogb25seSBtYXBwIG9uY2UgKi8KKwkJcmV0ID0gdnB1X2RtYV9idWZmZXJfbWFwKGNmZyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQllbmNfcHIoTE9HX0VSUk9SLCAidnB1X2RtYV9idWZmZXJfbWFwIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCWlmIChjZmctPnBhZGRyKSAqYWRkciA9IGNmZy0+cGFkZHI7CisJZW5jX3ByKExPR19JTkZPLCJ2cHVfZG1hX2J1ZmZlcl9nZXRfcGh5cyAweCVseFxuIiwgY2ZnLT5wYWRkcik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHMzMiB2cHVfc3JjX2FkZHJfY29uZmlnKHN0cnVjdCB2cHVkcnZfZG1hX2J1Zl9pbmZvX3QgKnBpbmZvLAorCQlzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgdnB1ZHJ2X2RtYV9idWZfcG9vbF90ICp2YnA7CisJdW5zaWduZWQgbG9uZyBwaHlfYWRkcjsKKwlzdHJ1Y3QgdnB1X2RtYV9jZmcgKmNmZzsKKwlzMzIgaWR4LCByZXQgPSAwOworCWlmIChwaW5mby0+bnVtX3BsYW5lcyA9PSAwIHx8IHBpbmZvLT5udW1fcGxhbmVzID4gMykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IHBpbmZvLT5udW1fcGxhbmVzOyBpZHgrKykKKwkJcGluZm8tPnBoeXNfYWRkcltpZHhdID0gMDsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IHBpbmZvLT5udW1fcGxhbmVzOyBpZHgrKykgeworCQl2YnAgPSBremFsbG9jKHNpemVvZigqdmJwKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghdmJwKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKwkJbWVtc2V0KHZicCwgMCwgc2l6ZW9mKHN0cnVjdCB2cHVkcnZfZG1hX2J1Zl9wb29sX3QpKTsKKwkJY2ZnID0gJnZicC0+ZG1hX2NmZzsKKwkJY2ZnLT5kaXIgPSBETUFfVE9fREVWSUNFOworCQljZmctPmZkID0gcGluZm8tPmZkW2lkeF07CisJCWNmZy0+ZGV2ID0gJihtdWx0aWVuY19wZGV2LT5kZXYpOworCQlwaHlfYWRkciA9IDA7CisJCXJldCA9IHZwdV9kbWFfYnVmZmVyX2dldF9waHlzKGNmZywgJnBoeV9hZGRyKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWVuY19wcihMT0dfRVJST1IsICJpbXBvcnQgZmQgJWQgZmFpbGVkXG4iLCBjZmctPmZkKTsKKwkJCWtmcmVlKHZicCk7CisJCQlyZXQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJCXBpbmZvLT5waHlzX2FkZHJbaWR4XSA9ICh1bG9uZykgcGh5X2FkZHI7CisJCXZicC0+ZmlscCA9IGZpbHA7CisJCXNwaW5fbG9jaygmc19kbWFfYnVmX2xvY2spOworCQlsaXN0X2FkZCgmdmJwLT5saXN0LCAmc19kbWFfYnVmcF9oZWFkKTsKKwkJc3Bpbl91bmxvY2soJnNfZG1hX2J1Zl9sb2NrKTsKKwl9CisJZW5jX3ByKExPR19JTkZPLCAidnB1X3NyY19hZGRyX2NvbmZpZyBwaHlfYWRkciAweCVseCwgMHglbHgsIDB4JWx4XG4iLAorCQlwaW5mby0+cGh5c19hZGRyWzBdLCBwaW5mby0+cGh5c19hZGRyWzFdLCBwaW5mby0+cGh5c19hZGRyWzJdKTsKKwkvL2hvYW4gYWRkIGZvciBjYW52YXMgdGVzdAorCXBoeXNfYWRkclkgPSBwaW5mby0+cGh5c19hZGRyWzBdOworCXBoeXNfYWRkclUgPSBwaW5mby0+cGh5c19hZGRyWzFdOworCXBoeXNfYWRkclYgPSBwaW5mby0+cGh5c19hZGRyWzJdOworCisJLy9lbmQKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgczMyIHZwdV9zcmNfYWRkcl91bm1hcChzdHJ1Y3QgdnB1ZHJ2X2RtYV9idWZfaW5mb190ICpwaW5mbywKKwkJc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IHZwdWRydl9kbWFfYnVmX3Bvb2xfdCAqcG9vbCwgKm47CisJc3RydWN0IHZwdV9kbWFfY2ZnIHZiOworCXVsb25nIHBoeXNfYWRkcjsKKwlzMzIgcGxhbmVfaWR4ID0gMDsKKwlzMzIgcmV0ID0gMDsKKwlzMzIgZm91bmQ7CisKKwlpZiAocGluZm8tPm51bV9wbGFuZXMgPT0gMCB8fCBwaW5mby0+bnVtX3BsYW5lcyA+IDMpCisJCXJldHVybiAtRUZBVUxUOworCisJZW5jX3ByKExPR19JTkZPLAorCQkiZG1hX3VubWFwIHBsYW5lcyAlZCBmZDogJWQtJWQtJWQsIHBoeV9hZGQ6IDB4JWx4LSVseC0lbHhcbiIsCisJCXBpbmZvLT5udW1fcGxhbmVzLCBwaW5mby0+ZmRbMF0scGluZm8tPmZkWzFdLCBwaW5mby0+ZmRbMl0sCisJCXBpbmZvLT5waHlzX2FkZHJbMF0sIHBpbmZvLT5waHlzX2FkZHJbMV0sIHBpbmZvLT5waHlzX2FkZHJbMl0pOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvb2wsIG4sICZzX2RtYV9idWZwX2hlYWQsIGxpc3QpIHsKKwkJZm91bmQgPSAwOworCQlpZiAocG9vbC0+ZmlscCA9PSBmaWxwKSB7CisJCQl2YiA9IHBvb2wtPmRtYV9jZmc7CisJCQlwaHlzX2FkZHIgPSB2Yi5wYWRkcjsKKwkJCWlmICh2Yi5mZCA9PSBwaW5mby0+ZmRbMF0pCisJCQl7CisJCQkJaWYgKHBoeXNfYWRkciAhPSBwaW5mby0+cGh5c19hZGRyWzBdKSB7CisJCQkJCWVuY19wcihMT0dfRVJST1IsICJkbWFfdW5tYXAgcGxhbmUgMCIpOworCQkJCQllbmNfcHIoTE9HX0VSUk9SLCAiIG5vIG1hdGNoICIpOworCQkJCQllbmNfcHIoTE9HX0VSUk9SLCAiMHglbHggJWx4XG4iLAorCQkJCQkJcGh5c19hZGRyLCBwaW5mby0+cGh5c19hZGRyWzBdKTsKKwkJCQl9CisJCQkJZm91bmQgPSAxOworCQkJCXBsYW5lX2lkeCsrOworCQkJfQorCQkJZWxzZSBpZiAodmIuZmQgPT0gcGluZm8tPmZkWzFdCisJCQkJJiYgcGluZm8tPm51bV9wbGFuZXMgPiAxKSB7CisJCQkJaWYgKHBoeXNfYWRkciAhPSBwaW5mby0+cGh5c19hZGRyWzFdKSB7CisJCQkJCWVuY19wcihMT0dfRVJST1IsICJkbWFfdW5tYXAgcGxhbmUgMSIpOworCQkJCQllbmNfcHIoTE9HX0VSUk9SLCAiIG5vIG1hdGNoICIpOworCQkJCQllbmNfcHIoTE9HX0VSUk9SLCAiMHglbHggJWx4XG4iLAorCQkJCQkJcGh5c19hZGRyLCBwaW5mby0+cGh5c19hZGRyWzFdKTsKKwkJCQl9CisJCQkJcGxhbmVfaWR4Kys7CisJCQkJZm91bmQgPSAxOworCQkJfQorCQkJZWxzZSBpZiAodmIuZmQgPT0gcGluZm8tPmZkWzJdCisJCQkJJiYgcGluZm8tPm51bV9wbGFuZXMgPiAyKSB7CisJCQkJaWYgKHBoeXNfYWRkciAhPSBwaW5mby0+cGh5c19hZGRyWzJdKSB7CisJCQkJCWVuY19wcihMT0dfRVJST1IsICJkbWFfdW5tYXAgcGxhbmUgMiIpOworCQkJCQllbmNfcHIoTE9HX0VSUk9SLCAiIG5vIG1hdGNoICIpOworCQkJCQllbmNfcHIoTE9HX0VSUk9SLCAiMHglbHggJWx4XG4iLAorCQkJCQkJcGh5c19hZGRyLCBwaW5mby0+cGh5c19hZGRyWzJdKTsKKwkJCQl9CisJCQkJcGxhbmVfaWR4Kys7CisJCQkJZm91bmQgPSAxOworCQkJfQorCQkJaWYgKGZvdW5kICYmIHZiLmF0dGFjaCkgeworCQkJCXZwdV9kbWFfYnVmZmVyX3VubWFwKCZ2Yik7CisJCQkJc3Bpbl9sb2NrKCZzX2RtYV9idWZfbG9jayk7CisJCQkJbGlzdF9kZWwoJnBvb2wtPmxpc3QpOworCQkJCXNwaW5fdW5sb2NrKCZzX2RtYV9idWZfbG9jayk7CisJCQkJa2ZyZWUocG9vbCk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAocGxhbmVfaWR4ICE9IHBpbmZvLT5udW1fcGxhbmVzKSB7CisJCWVuY19wcihMT0dfREVCVUcsICJkbWFfdW5tYXAgZmQgcGxhbmVzIG5vdCBtYXRjaFxuIik7CisJCWVuY19wcihMT0dfREVCVUcsICIgZm91bmQgJWQgbmVlZCAlZFxuIiwKKwkJICAgICAgIHBsYW5lX2lkeCwgcGluZm8tPm51bV9wbGFuZXMpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2cHVfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IHZwdV9vcGVuLAorCS5yZWxlYXNlID0gdnB1X3JlbGVhc2UsCisJLndyaXRlID0gdnB1X3dyaXRlLAorCS51bmxvY2tlZF9pb2N0bCA9IHZwdV9pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bCA9IHZwdV9jb21wYXRfaW9jdGwsCisjZW5kaWYKKwkuZmFzeW5jID0gdnB1X2Zhc3luYywKKwkubW1hcCA9IHZwdV9tbWFwLAorfTsKKworc3RhdGljIHNzaXplX3QgZW5jb2RlX3N0YXR1c19zaG93KHN0cnVjdCBjbGFzcyAqY2xhLAorCQkJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgdm1lbV9pbmZvX3QgaW5mbzsKKwljaGFyICpwYnVmID0gYnVmOworCXMzMiBvcGVuX2NvdW50OworCisJc3Bpbl9sb2NrKCZzX3ZwdV9sb2NrKTsKKwlvcGVuX2NvdW50ID0gc192cHVfZHJ2X2NvbnRleHQub3Blbl9jb3VudDsKKwlzcGluX3VubG9jaygmc192cHVfbG9jayk7CisKKwl2bWVtX2dldF9pbmZvKCZzX3ZtZW0sICZpbmZvKTsKKwlwYnVmICs9IHNucHJpbnRmKGJ1ZiwgNDAsICJcbm11bHRpZW5jIG1lbW9yeSB1c2FnZSBpbmZvOlxuIik7CisJcGJ1ZiArPSBzbnByaW50ZihidWYsIDEyMCwgIlRvdGFsICVsZCB1c2VkICVsZCBmcmVlICVsZCBwYWdlIHN6ICVsZCwgb3Blbl9jb3VudD0ldSwgaW5faW50ZXJydXB0PSVsdSwgZmxhZz0ldVxuIiwKKwkJaW5mby50b3RhbF9wYWdlcyppbmZvLnBhZ2Vfc2l6ZSwKKwkJaW5mby5hbGxvY19wYWdlcyppbmZvLnBhZ2Vfc2l6ZSwKKwkJaW5mby5mcmVlX3BhZ2VzKmluZm8ucGFnZV9zaXplLAorCQlpbmZvLnBhZ2Vfc2l6ZSwKKwkJb3Blbl9jb3VudCwKKwkJaW5faW50ZXJydXB0KCksCisJCWN1cnJlbnQtPmZsYWdzICYgUEZfS1RIUkVBRCk7CisJcmV0dXJuIHBidWYgLSBidWY7Cit9CisKK3N0YXRpYyBDTEFTU19BVFRSX1JPKGVuY29kZV9zdGF0dXMpOworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm11bHRpZW5jX2NsYXNzX2F0dHJzW10gPSB7CisJJmNsYXNzX2F0dHJfZW5jb2RlX3N0YXR1cy5hdHRyLAorCU5VTEwKK307CisKK0FUVFJJQlVURV9HUk9VUFMobXVsdGllbmNfY2xhc3MpOworCitzdGF0aWMgc3RydWN0IGNsYXNzIG11bHRpZW5jX2NsYXNzID0geworCS5uYW1lID0gVlBVX0NMQVNTX05BTUUsCisJLmNsYXNzX2dyb3VwcyA9IG11bHRpZW5jX2NsYXNzX2dyb3VwcywKK307CisKK3MzMiBpbml0X011bHRpRW5jX2RldmljZSh2b2lkKQoreworCXMzMiAgciA9IDA7CisKKwlyID0gcmVnaXN0ZXJfY2hyZGV2KDAsIFZQVV9ERVZfTkFNRSwgJnZwdV9mb3BzKTsKKwlpZiAociA8PSAwKSB7CisJCWVuY19wcihMT0dfRVJST1IsICJyZWdpc3RlciBtdWx0aWVuYyBkZXZpY2UgZXJyb3IuXG4iKTsKKwkJcmV0dXJuICByOworCX0KKwlzX3ZwdV9tYWpvciA9IHI7CisKKwlyID0gY2xhc3NfcmVnaXN0ZXIoJm11bHRpZW5jX2NsYXNzKTsKKwlpZiAociA8IDApIHsKKwkJZW5jX3ByKExPR19FUlJPUiwgImVycm9yIGNyZWF0ZSBtdWx0aWVuYyBjbGFzcy5cbiIpOworCQlyZXR1cm4gcjsKKwl9CisJc19yZWdpc3Rlcl9mbGFnID0gMTsKKwltdWx0aWVuY19kZXYgPSBkZXZpY2VfY3JlYXRlKCZtdWx0aWVuY19jbGFzcywgTlVMTCwKKwkJCQkJTUtERVYoc192cHVfbWFqb3IsIDApLCBOVUxMLAorCQkJCQlWUFVfREVWX05BTUUpOworCisJaWYgKElTX0VSUihtdWx0aWVuY19kZXYpKSB7CisJCWVuY19wcihMT0dfRVJST1IsICJjcmVhdGUgbXVsdGllbmMgZGV2aWNlIGVycm9yLlxuIik7CisJCWNsYXNzX3VucmVnaXN0ZXIoJm11bHRpZW5jX2NsYXNzKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gcjsKK30KKworczMyIHVuaW5pdF9NdWx0aUVuY19kZXZpY2Uodm9pZCkKK3sKKwlpZiAobXVsdGllbmNfZGV2KQorCQlkZXZpY2VfZGVzdHJveSgmbXVsdGllbmNfY2xhc3MsIE1LREVWKHNfdnB1X21ham9yLCAwKSk7CisKKwlpZiAoc19yZWdpc3Rlcl9mbGFnKQorCQljbGFzc19kZXN0cm95KCZtdWx0aWVuY19jbGFzcyk7CisJc19yZWdpc3Rlcl9mbGFnID0gMDsKKworCWlmIChzX3ZwdV9tYWpvcikKKwkJdW5yZWdpc3Rlcl9jaHJkZXYoc192cHVfbWFqb3IsIFZQVV9ERVZfTkFNRSk7CisJc192cHVfbWFqb3IgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgczMyIG11bHRpZW5jX21lbV9kZXZpY2VfaW5pdCgKKwlzdHJ1Y3QgcmVzZXJ2ZWRfbWVtICpybWVtLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJczMyIHI7CisKKwlpZiAoIXJtZW0pIHsKKwkJZW5jX3ByKExPR19FUlJPUiwgIkNhbiBub3Qgb2J0YWluIEkvTyBtZW1vcnksICIpOworCQllbmNfcHIoTE9HX0VSUk9SLCAid2lsbCBhbGxvY2F0ZSBtdWx0aWVuYyBidWZmZXIhXG4iKTsKKworCQlyID0gLUVGQVVMVDsKKwkJcmV0dXJuIHI7CisJfQorCisJaWYgKCghcm1lbS0+YmFzZSkgfHwKKwkJKHJtZW0tPnNpemUgPCBjbWFfY2ZnX3NpemUpKSB7CisJCWVuY19wcihMT0dfRVJST1IsCisJCQkibWVtb3J5IHJhbmdlIGVycm9yLCAweCVseCAtIDB4JWx4XG4iLAorCQkJICh1bG9uZylybWVtLT5iYXNlLCAodWxvbmcpcm1lbS0+c2l6ZSk7CisJCXIgPSAtRUZBVUxUOworCQlyZXR1cm4gcjsKKwl9CisJciA9IDA7CisJc192aWRlb19tZW1vcnkuc2l6ZSA9IHJtZW0tPnNpemU7CisJc192aWRlb19tZW1vcnkucGh5c19hZGRyID0gKHVsb25nKXJtZW0tPmJhc2U7CisJZW5jX3ByKExPR19ERUJVRywgIm11bHRpZW5jX21lbV9kZXZpY2VfaW5pdCAlZCwgMHglbHhcbiIsCisJCXNfdmlkZW9fbWVtb3J5LnNpemUsc192aWRlb19tZW1vcnkucGh5c19hZGRyKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgczMyIHZwdV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXMzMiBlcnIgPSAwLCBpcnEsIHJlZ19jb3VudCwgaWR4OworCXN0cnVjdCByZXNvdXJjZSByZXM7CisJc3RydWN0IGRldmljZV9ub2RlICpucCwgKmNoaWxkOworCisJZW5jX3ByKExPR19ERUJVRywgInZwdV9wcm9iZVxuIik7CisKKwlzX3ZwdV9tYWpvciA9IDA7CisJdXNlX3Jlc2VydmUgPSBmYWxzZTsKKwlzX3ZwdV9pcnEgPSAtMTsKKwljbWFfcG9vbF9zaXplID0gMDsKKwlzX3ZwdV9pcnFfcmVxdWVzdGVkID0gZmFsc2U7CisJc3Bpbl9sb2NrKCZzX3ZwdV9sb2NrKTsKKwlzX3ZwdV9vcGVuX3JlZl9jb3VudCA9IDA7CisJc3Bpbl91bmxvY2soJnNfdnB1X2xvY2spOworCW11bHRpZW5jX2RldiA9IE5VTEw7CisJbXVsdGllbmNfcGRldiA9IE5VTEw7CisJc19yZWdpc3Rlcl9mbGFnID0gMDsKKwltZW1zZXQoJnNfdmlkZW9fbWVtb3J5LCAwLCBzaXplb2Yoc3RydWN0IHZwdWRydl9idWZmZXJfdCkpOworCW1lbXNldCgmc192cHVfcmVnaXN0ZXIsIDAsIHNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90KSk7CisJbWVtc2V0KCZzX3ZtZW0sIDAsIHNpemVvZihzdHJ1Y3QgdmlkZW9fbW1fdCkpOworCW1lbXNldCgmc19iaXRfZmlybXdhcmVfaW5mb1swXSwgMCwgc2l6ZW9mKHNfYml0X2Zpcm13YXJlX2luZm8pKTsKKwltZW1zZXQoJnJlcywgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOworCW1lbXNldCgmc19maWZvX2FsbG9jX2ZsYWcsIDAsIHNpemVvZihzX2ZpZm9fYWxsb2NfZmxhZykpOworCW5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJZXJyID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJjb25maWdfbW1fc3pfbWIiLCAmY21hX2NmZ19zaXplKTsKKworCWNtYV9jZmdfc2l6ZSA9IDEwMDsKKwllbmNfcHIoTE9HX0VSUk9SLCAicmVzZXQgY21hX2NmZ19zaXplIHRvIDIwMCIpOworCisJaWYgKGVycikgeworCQllbmNfcHIoTE9HX0VSUk9SLCAiZmFpbGVkIHRvIGdldCBjb25maWdfbW1fc3pfbWIgbm9kZSwgdXNlIGRlZmF1bHRcbiIpOworCQljbWFfY2ZnX3NpemUgPSBWUFVfSU5JVF9WSURFT19NRU1PUllfU0laRV9JTl9CWVRFOworCQllcnIgPSAwOworCX0gZWxzZQorCQljbWFfY2ZnX3NpemUgPSBjbWFfY2ZnX3NpemUqU1pfMU07CisKKwllbmNfcHIoTE9HX0lORk8sICJjbWEgIGNmZyBzaXplICAlZFxuIiwgY21hX2NmZ19zaXplKTsKKwlpZHggPSBvZl9yZXNlcnZlZF9tZW1fZGV2aWNlX2luaXQoJnBkZXYtPmRldik7CisKKwlpZiAoaWR4ICE9IDApCisJCWVuY19wcihMT0dfREVCVUcsICJNdWx0aUVuYyByZXNlcnZlZCBtZW1vcnkgY29uZmlnIGZhaWwuXG4iKTsKKwllbHNlIGlmIChzX3ZpZGVvX21lbW9yeS5waHlzX2FkZHIpCisJCXVzZV9yZXNlcnZlID0gdHJ1ZTsKKworCWlmICh1c2VfcmVzZXJ2ZSA9PSBmYWxzZSkgeworI2lmbmRlZiBDT05GSUdfQ01BCisJCWVuY19wcihMT0dfRVJST1IsICJNdWx0aUVuYyByZXNlcnZlZCBtZW1vcnkgaXMgaW52YWlsZCwgcHJvYmUgZmFpbCFcbiIpOworCQllcnIgPSAtRUZBVUxUOworCQlnb3RvIEVSUk9SX1BST1ZFX0RFVklDRTsKKyNlbHNlCisJCWNtYV9wb29sX3NpemUgPQorCQkJKGNvZGVjX21tX2dldF90b3RhbF9zaXplKCkgPiAoY21hX2NmZ19zaXplKSkgPworCQkJKGNtYV9jZmdfc2l6ZSkgOgorCQkJY29kZWNfbW1fZ2V0X3RvdGFsX3NpemUoKTsKKworCQllbmNfcHIoTE9HX0RFQlVHLCAiTXVsdGlFbmMgLSBjbWEgbWVtb3J5IHBvb2wgc2l6ZTogJWQgTUJcbiIsICh1MzIpY21hX3Bvb2xfc2l6ZSAvIFNaXzFNKTsKKyNlbmRpZgorCX0KKworCS8qIGdldCBpbnRlcnJ1cHQgcmVzb3VyY2UgKi8KKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAibXVsdGllbmNfaXJxIik7CisKKwlpZiAoaXJxIDwgMCkgeworCQllbmNfcHIoTE9HX0VSUk9SLCAiZ2V0IE11bHRpRW5jIGlycSByZXNvdXJjZSBlcnJvclxuIik7CisJCWVyciA9IC1FRkFVTFQ7CisKKwkJZ290byBFUlJPUl9QUk9WRV9ERVZJQ0U7CisJfQorCisJc192cHVfaXJxID0gaXJxOworCWVuY19wcihMT0dfREVCVUcsICJNdWx0aUVuYyAtaXJxOiAlZFxuIiwgc192cHVfaXJxKTsKKworCS8qIGdldCB2cHUgY2xrcyAqLworCWlmICh2cHVfY2xrX2dldCgmcGRldi0+ZGV2LCAmc192cHVfY2xrcykpIHsKKwkJZW5jX3ByKExPR19ERUJVRywgImdldCB2cHUgY2xrcyBmYWlsLlxuIik7CisJCWdvdG8gRVJST1JfUFJPVkVfREVWSUNFOworCX0gZWxzZQorCQllbmNfcHIoTE9HX0RFQlVHLCAiTXVsdGlFbmMuIGNsb2NrIGdldCBzdWNjZXNzXG4iKTsKKworCXJlZ19jb3VudCA9IDA7CisJbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKworCWZvcl9lYWNoX2NoaWxkX29mX25vZGUobnAsIGNoaWxkKSB7CisJCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKGNoaWxkLCAwLCAmcmVzKSB8fCAocmVnX2NvdW50ID4gMSkpIHsKKwkJCWVuY19wcihMT0dfRVJST1IsICJubyByZWcgcmFuZ2VzIG9yIG1vcmUgcmVnIHJhbmdlcyAlZFxuIiwgcmVnX2NvdW50KTsKKwkJCWVyciA9IC1FTlhJTzsKKwkJCWdvdG8gRVJST1JfUFJPVkVfREVWSUNFOworCQl9CisKKwkJLyogaWYgcGxhdGZvcm0gZHJpdmVyIGlzIGltcGxlbWVudGVkICovCisJCWlmIChyZXMuc3RhcnQgIT0gMCkgeworCQkJc192cHVfcmVnaXN0ZXIucGh5c19hZGRyID0gcmVzLnN0YXJ0OworCQkJc192cHVfcmVnaXN0ZXIudmlydF9hZGRyID0gKHVsb25nKWlvcmVtYXBfbm9jYWNoZShyZXMuc3RhcnQsIHJlc291cmNlX3NpemUoJnJlcykpOworCQkJc192cHVfcmVnaXN0ZXIuc2l6ZSA9IHJlcy5lbmQgLSByZXMuc3RhcnQ7CisKKwkJCWVuY19wcihMT0dfREVCVUcsICJ2cHUgYmFzZSBhZGRyZXNzIGdldCBmcm9tIHBsYXRmb3JtIGRyaXZlciAiKTsKKwkJCWVuY19wcihMT0dfREVCVUcsICJwaHlzaWNhbCBhZGRyPTB4JWx4LCB2aXJ0dWFsIGFkZHI9MHglbHhcbiIsCisJCQkJCXNfdnB1X3JlZ2lzdGVyLnBoeXNfYWRkciwgc192cHVfcmVnaXN0ZXIudmlydF9hZGRyKTsKKwkJfSBlbHNlIHsKKwkJCXNfdnB1X3JlZ2lzdGVyLnBoeXNfYWRkciA9IFZQVV9SRUdfQkFTRV9BRERSOworCQkJc192cHVfcmVnaXN0ZXIudmlydF9hZGRyID0gKHVsb25nKWlvcmVtYXBfbm9jYWNoZShzX3ZwdV9yZWdpc3Rlci5waHlzX2FkZHIsIFZQVV9SRUdfU0laRSk7CisJCQlzX3ZwdV9yZWdpc3Rlci5zaXplID0gVlBVX1JFR19TSVpFOworCisJCQllbmNfcHIoTE9HX0RFQlVHLCAidnB1IGJhc2UgYWRkcmVzcyBnZXQgZnJvbSBkZWZpbmVkIHZhbHVlICIpOworCQkJZW5jX3ByKExPR19ERUJVRywgInBoeXNpY2FsIGFkZHI9MHglbHgsIHZpcnR1YWwgYWRkcj0weCVseFxuIiwKKwkJCQlzX3ZwdV9yZWdpc3Rlci5waHlzX2FkZHIsIHNfdnB1X3JlZ2lzdGVyLnZpcnRfYWRkcik7CisJCX0KKworCQlyZWdfY291bnQrKzsKKwl9CisKKwkvKiBnZXQgdGhlIG1ham9yIG51bWJlciBvZiB0aGUgY2hhcmFjdGVyIGRldmljZSAqLworCWlmIChpbml0X011bHRpRW5jX2RldmljZSgpKSB7CisJCWVyciA9IC1FQlVTWTsKKwkJZW5jX3ByKExPR19FUlJPUiwgImNvdWxkIG5vdCBhbGxvY2F0ZSBtYWpvciBudW1iZXJcbiIpOworCisJCWdvdG8gRVJST1JfUFJPVkVfREVWSUNFOworCX0KKworCWVuY19wcihMT0dfSU5GTywgIlNVQ0NFU1MgYWxsb2NfY2hyZGV2X3JlZ2lvblxuIik7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IE1BWF9OVU1fSU5TVEFOQ0U7IGlkeCArKykKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmc19pbnRlcnJ1cHRfd2FpdF9xW2lkeF0pOworCisJZm9yIChpZHggPSAwOyBpZHggPCBNQVhfTlVNX0lOU1RBTkNFOyBpZHggKyspIHsKKwkJZXJyID0ga2ZpZm9fYWxsb2MoJnNfaW50ZXJydXB0X3BlbmRpbmdfcVtpZHhdLCBNQVhfSU5URVJSVVBUX1FVRVVFKnNpemVvZih1MzIpLCBHRlBfS0VSTkVMKTsKKworCQlpZiAoZXJyKSB7CisJCQllbmNfcHIoTE9HX0VSUk9SLCJrZmlmb19hbGxvYyBmYWlsZWQgMHgleFxuIiwgZXJyKTsKKwkJCWdvdG8gRVJST1JfUFJPVkVfREVWSUNFOworCQl9CisKKwkJc19maWZvX2FsbG9jX2ZsYWdbaWR4XSA9IDE7CisJfQorCisJdGFza2xldF9pbml0KCZtdWx0aWVuY190YXNrbGV0LCBtdWx0aWVuY19pc3JfdGFza2xldCwgKHVsb25nKSZzX3ZwdV9kcnZfY29udGV4dCk7CisKKwlzX2NvbW1vbl9tZW1vcnkuYmFzZSA9IDA7CisJc19pbnN0YW5jZV9wb29sLmJhc2UgPSAwOworCisJaWYgKHVzZV9yZXNlcnZlID09IHRydWUpIHsKKwkJaWYgKHZtZW1faW5pdCgmc192bWVtLCBzX3ZpZGVvX21lbW9yeS5waHlzX2FkZHIsIHNfdmlkZW9fbWVtb3J5LnNpemUpIDwgMCkgeworCQkJZW5jX3ByKExPR19FUlJPUiwgImZhaWwgdG8gaW5pdCB2bWVtIHN5c3RlbVxuIik7CisJCQlnb3RvIEVSUk9SX1BST1ZFX0RFVklDRTsKKwkJfQorCisJCWVuY19wcihMT0dfREVCVUcsICJzdWNjZXNzIHRvIHByb2JlIHZwdSBkZXZpY2Ugd2l0aCB2aWRlbyBtZW1vcnkiKTsKKwkJZW5jX3ByKExPR19ERUJVRywgInBoeXNfYWRkcj0weCVseCwgYmFzZSA9IDB4JWx4XG4iLAorCQkJKHVsb25nKXNfdmlkZW9fbWVtb3J5LnBoeXNfYWRkciwgKHVsb25nKXNfdmlkZW9fbWVtb3J5LmJhc2UpOworCX0gZWxzZSB7CisJCWVuY19wcihMT0dfREVCVUcsICJzdWNjZXNzIHRvIHByb2JlIHZwdSBkZXZpY2Ugd2l0aCB2aWRlbyBtZW1vcnkgXG4iKTsKKwl9CisKKwllbmNfcHIoTE9HX0RFQlVHLCAidG8gYmUgYWxsb2NhdGUgZnJvbSBDTUEgcG9vbF9zaXplIDB4JWx4XG4iLCBjbWFfcG9vbF9zaXplKTsKKwltdWx0aWVuY19wZGV2ID0gcGRldjsKKworCXJldHVybiAwOworCitFUlJPUl9QUk9WRV9ERVZJQ0U6CisJZm9yIChpZHggPSAwOyBpZHggPCBNQVhfTlVNX0lOU1RBTkNFOyBpZHgrKykgeworCQlpZiAoc19maWZvX2FsbG9jX2ZsYWdbaWR4XSkKKwkJCWtmaWZvX2ZyZWUoJnNfaW50ZXJydXB0X3BlbmRpbmdfcVtpZHhdKTsKKwkJc19maWZvX2FsbG9jX2ZsYWdbaWR4XSA9IDA7CisJfQorCisJaWYgKHNfdnB1X3JlZ2lzdGVyLnZpcnRfYWRkcikgeworCQlpb3VubWFwKCh2b2lkICopc192cHVfcmVnaXN0ZXIudmlydF9hZGRyKTsKKwkJbWVtc2V0KCZzX3ZwdV9yZWdpc3RlciwgMCwgc2l6ZW9mKHN0cnVjdCB2cHVkcnZfYnVmZmVyX3QpKTsKKwl9CisKKwlpZiAoc192aWRlb19tZW1vcnkucGh5c19hZGRyKSB7CisJCXZtZW1fZXhpdCgmc192bWVtKTsKKwkJbWVtc2V0KCZzX3ZpZGVvX21lbW9yeSwgMCwgc2l6ZW9mKHN0cnVjdCB2cHVkcnZfYnVmZmVyX3QpKTsKKwkJbWVtc2V0KCZzX3ZtZW0sIDAsIHNpemVvZihzdHJ1Y3QgdmlkZW9fbW1fdCkpOworCX0KKworCWlmIChzX3ZwdV9pcnFfcmVxdWVzdGVkID09IHRydWUpIHsKKwkJaWYgKHNfdnB1X2lycSA+PSAwKSB7CisJCQlmcmVlX2lycShzX3ZwdV9pcnEsICZzX3ZwdV9kcnZfY29udGV4dCk7CisJCQlzX3ZwdV9pcnEgPSAtMTsKKwkJfQorCQlzX3ZwdV9pcnFfcmVxdWVzdGVkID0gZmFsc2U7CisJfQorCXVuaW5pdF9NdWx0aUVuY19kZXZpY2UoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgczMyIHZwdV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzMzIgaWR4OworCWVuY19wcihMT0dfREVCVUcsICJ2cHVfcmVtb3ZlXG4iKTsKKworCWlmIChzX2luc3RhbmNlX3Bvb2wuYmFzZSkgeworCQl2ZnJlZSgoY29uc3Qgdm9pZCAqKXNfaW5zdGFuY2VfcG9vbC5iYXNlKTsKKwkJc19pbnN0YW5jZV9wb29sLmJhc2UgPSAwOworCX0KKworCWlmIChzX2NvbW1vbl9tZW1vcnkucGh5c19hZGRyKSB7CisJCXZwdV9mcmVlX2RtYV9idWZmZXIoJnNfY29tbW9uX21lbW9yeSk7CisJCXNfY29tbW9uX21lbW9yeS5waHlzX2FkZHIgPSAwOworCX0KKworCWlmIChzX3ZpZGVvX21lbW9yeS5waHlzX2FkZHIpIHsKKwkJaWYgKCF1c2VfcmVzZXJ2ZSkgeworCQkJY29kZWNfbW1fZnJlZV9mb3JfZG1hKAorCQkJVlBVX0RFVl9OQU1FLAorCQkJKHUzMilzX3ZpZGVvX21lbW9yeS5waHlzX2FkZHIpOworCQl9CisJCXZtZW1fZXhpdCgmc192bWVtKTsKKwkJbWVtc2V0KCZzX3ZpZGVvX21lbW9yeSwKKwkJCTAsIHNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90KSk7CisJCW1lbXNldCgmc192bWVtLAorCQkJMCwgc2l6ZW9mKHN0cnVjdCB2aWRlb19tbV90KSk7CisJfQorCisJaWYgKHNfdnB1X2lycV9yZXF1ZXN0ZWQgPT0gdHJ1ZSkgeworCQlpZiAoc192cHVfaXJxID49IDApIHsKKwkJCWZyZWVfaXJxKHNfdnB1X2lycSwgJnNfdnB1X2Rydl9jb250ZXh0KTsKKwkJCXNfdnB1X2lycSA9IC0xOworCQl9CisJCXNfdnB1X2lycV9yZXF1ZXN0ZWQgPSBmYWxzZTsKKwl9CisJZm9yIChpZHggPSAwOyBpZHggPCBNQVhfTlVNX0lOU1RBTkNFOyBpZHgrKykKKwkJa2ZpZm9fZnJlZSgmc19pbnRlcnJ1cHRfcGVuZGluZ19xW2lkeF0pOworCisJaWYgKHNfdnB1X3JlZ2lzdGVyLnZpcnRfYWRkcikgeworCQlpb3VubWFwKCh2b2lkICopc192cHVfcmVnaXN0ZXIudmlydF9hZGRyKTsKKwkJbWVtc2V0KCZzX3ZwdV9yZWdpc3RlciwKKwkJCTAsIHNpemVvZihzdHJ1Y3QgdnB1ZHJ2X2J1ZmZlcl90KSk7CisJfQorCWlmIChjbG9ja19nYXRlX2NvdW50ID4gMCkKKwl7CisJCXZwdV9jbGtfZGlzYWJsZSgmc192cHVfY2xrcyk7CisJfQorCXZwdV9jbGtfcHV0KCZtdWx0aWVuY19wZGV2LT5kZXYsICZzX3ZwdV9jbGtzKTsKKwltdWx0aWVuY19wZGV2ID0gTlVMTDsKKwl1bmluaXRfTXVsdGlFbmNfZGV2aWNlKCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKyNkZWZpbmUgVlA1X0NNRF9JTklUX1ZQVSAgICAgICAgICgweDAwMDEpCisjZGVmaW5lIFZQNV9DTURfU0xFRVBfVlBVICAgICAgICAoMHgwMDA0KQorI2RlZmluZSBWUDVfQ01EX1dBS0VVUF9WUFUgICAgICAgKDB4MDAwMikKKworc3RhdGljIHZvaWQgVnA1Qml0SXNzdWVDb21tYW5kKGludCBjb3JlLCB1MzIgY21kKQoreworCVdyaXRlVnB1UmVnaXN0ZXIoVlA1X1ZQVV9CVVNZX1NUQVRVUywgMSk7CisJV3JpdGVWcHVSZWdpc3RlcihWUDVfQ09NTUFORCwgY21kKTsKKwlXcml0ZVZwdVJlZ2lzdGVyKFZQNV9WUFVfSE9TVF9JTlRfUkVRLCAxKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHMzMiB2cHVfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJdTMyIGNvcmU7CisJdWxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBIWjsgLyogdnB1IHdhaXQgdGltZW91dCB0byAxc2VjICovCisKKwllbmNfcHIoTE9HX0RFQlVHLCAidnB1X3N1c3BlbmRcbiIpOworCisJaWYgKHNfdnB1X29wZW5fcmVmX2NvdW50ID4gMCkgeworI2lmZGVmIFZQVV9TVVBQT1JUX0NMT0NLX0NPTlRST0wKKwkJdnB1X2Nsa19jb25maWcoMSk7CisjZW5kaWYKKwkJZm9yIChjb3JlID0gMDsgY29yZSA8IE1BWF9OVU1fVlBVX0NPUkU7IGNvcmUrKykgeworCQkJaWYgKHNfYml0X2Zpcm13YXJlX2luZm9bY29yZV0uc2l6ZSA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJd2hpbGUgKFJlYWRWcHVSZWdpc3RlcihWUDVfVlBVX0JVU1lfU1RBVFVTKSkgeworCQkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQkJCWVuY19wcihMT0dfRVJST1IsCisJCQkJCQkiU0xFRVBfVlBVIEJVU1kgdGltZW91dCIpOworCQkJCQlnb3RvIERPTkVfU1VTUEVORDsKKwkJCQl9CisJCQl9CisJCQlWcDVCaXRJc3N1ZUNvbW1hbmQoY29yZSwgVlA1X0NNRF9TTEVFUF9WUFUpOworCQkJd2hpbGUgKFJlYWRWcHVSZWdpc3RlcihWUDVfVlBVX0JVU1lfU1RBVFVTKSkgeworCQkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQkJCWVuY19wcihMT0dfRVJST1IsCisJCQkJCQkiU0xFRVBfVlBVIEJVU1kgdGltZW91dCIpOworCQkJCQlnb3RvIERPTkVfU1VTUEVORDsKKwkJCQl9CisJCQl9CisJCQlpZiAoUmVhZFZwdVJlZ2lzdGVyKFZQNV9SRVRfU1VDQ0VTUykgPT0gMCkgeworCQkJCWVuY19wcihMT0dfRVJST1IsCisJCQkJCSJTTEVFUF9WUFUgZmFpbGVkIFsweCV4XSIsCisJCQkJCVJlYWRWcHVSZWdpc3RlcihWUDVfUkVUX0ZBSUxfUkVBU09OKSk7CisJCQkJZ290byBET05FX1NVU1BFTkQ7CisJCQl9CisJCX0KKyNpZmRlZiBWUFVfU1VQUE9SVF9DTE9DS19DT05UUk9MCisJCXZwdV9jbGtfY29uZmlnKDApOworCQlpZiAoY2xvY2tfZ2F0ZV9jb3VudCA+IDApCisjZW5kaWYKKwkJeworCQkJY2xrX2Rpc2FibGUoc192cHVfY2xrcy5jX2Nsayk7CisJCQljbGtfZGlzYWJsZShzX3ZwdV9jbGtzLmJfY2xrKTsKKwkJCWNsa19kaXNhYmxlKHNfdnB1X2Nsa3MuYV9jbGspOworCQl9CisJCS8qIHRoZSBwb3dlciBvZmYgKi8KKwkJcHdyX2N0cmxfcHNjaV9zbWMoUERJRF9UN19ET1NfV0FWRSwgZmFsc2UpOworCX0KKwlyZXR1cm4gMDsKKworRE9ORV9TVVNQRU5EOgorI2lmZGVmIFZQVV9TVVBQT1JUX0NMT0NLX0NPTlRST0wKKwl2cHVfY2xrX2NvbmZpZygwKTsKKyNlbmRpZgorCXJldHVybiAtRUFHQUlOOworfQorc3RhdGljIHMzMiB2cHVfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJdTMyIGNvcmU7CisJdWxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBIWjsgLyogdnB1IHdhaXQgdGltZW91dCB0byAxc2VjICovCisJdWxvbmcgY29kZV9iYXNlOworCXUzMiBjb2RlX3NpemU7CisJdTMyIHJlbWFwX3NpemU7CisJdTMyIHJlZ1ZhbDsKKwl1MzIgaHdPcHRpb24gPSAwOworCisJZW5jX3ByKExPR19ERUJVRywgInZwdV9yZXN1bWVcbiIpOworCisJaWYgKHNfdnB1X29wZW5fcmVmX2NvdW50ID4gMCkgeworI2lmZGVmIFZQVV9TVVBQT1JUX0NMT0NLX0NPTlRST0wKKwkJaWYgKGNsb2NrX2dhdGVfY291bnQgPiAwKQorI2VuZGlmCisJCXsKKwkJCWNsa19lbmFibGUoc192cHVfY2xrcy5hX2Nsayk7CisJCQljbGtfZW5hYmxlKHNfdnB1X2Nsa3MuYl9jbGspOworCQkJY2xrX2VuYWJsZShzX3ZwdV9jbGtzLmNfY2xrKTsKKwkJfQorCQl2cHVfY2xrX2NvbmZpZygxKTsKKwkJLyogdGhlIHBvd2VyIG9uICovCisJCXB3cl9jdHJsX3BzY2lfc21jKFBESURfVDdfRE9TX1dBVkUsIHRydWUpOworCQlmb3IgKGNvcmUgPSAwOyBjb3JlIDwgTUFYX05VTV9WUFVfQ09SRTsgY29yZSsrKSB7CisJCQlpZiAoc19iaXRfZmlybXdhcmVfaW5mb1tjb3JlXS5zaXplID09IDApCisJCQkJY29udGludWU7CisJCQljb2RlX2Jhc2UgPSBzX2NvbW1vbl9tZW1vcnkucGh5c19hZGRyOworCQkJLyogQUxJR04gVE8gNEtCICovCisJCQljb2RlX3NpemUgPSAoc19jb21tb25fbWVtb3J5LnNpemUgJiB+MHhmZmYpOworCQkJaWYgKGNvZGVfc2l6ZSA8IHNfYml0X2Zpcm13YXJlX2luZm9bY29yZV0uc2l6ZSAqIDIpCisJCQkJZ290byBET05FX1dBS0VVUDsKKwkJCXJlZ1ZhbCA9IDA7CisJCQlXcml0ZVZwdVJlZ2lzdGVyKFZQNV9QT19DT05GLCByZWdWYWwpOworCisJCQkvKiBSZXNldCBBbGwgYmxvY2tzICovCisJCQlyZWdWYWwgPSAweDdmZmZmZmY7CisJCQlXcml0ZVZwdVJlZ2lzdGVyKFZQNV9WUFVfUkVTRVRfUkVRLCByZWdWYWwpOworCQkJLyogV2FpdGluZyByZXNldCBkb25lICovCisJCQl3aGlsZSAoUmVhZFZwdVJlZ2lzdGVyKFZQNV9WUFVfUkVTRVRfU1RBVFVTKSkgeworCQkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJCQlnb3RvIERPTkVfV0FLRVVQOworCQkJfQorCQkJV3JpdGVWcHVSZWdpc3RlcihWUDVfVlBVX1JFU0VUX1JFUSwgMCk7CisKKwkJCS8qIHJlbWFwIHBhZ2Ugc2l6ZSAqLworCQkJcmVtYXBfc2l6ZSA9IChjb2RlX3NpemUgPj4gMTIpICYgMHgxZmY7CisJCQlyZWdWYWwgPSAweDgwMDAwMDAwIHwgKFZQNV9SRU1BUF9DT0RFX0lOREVYPDwxMikKKwkJCQl8ICgwIDw8IDE2KSB8ICgxPDwxMSkgfCByZW1hcF9zaXplOworCQkJV3JpdGVWcHVSZWdpc3RlcihWUDVfVlBVX1JFTUFQX0NUUkwsIHJlZ1ZhbCk7CisJCQkvKiBETyBOT1QgQ0hBTkdFISAqLworCQkJV3JpdGVWcHVSZWdpc3RlcihWUDVfVlBVX1JFTUFQX1ZBRERSLCAweDAwMDAwMDAwKTsKKwkJCVdyaXRlVnB1UmVnaXN0ZXIoVlA1X1ZQVV9SRU1BUF9QQUREUiwgY29kZV9iYXNlKTsKKwkJCVdyaXRlVnB1UmVnaXN0ZXIoVlA1X0FERFJfQ09ERV9CQVNFLCBjb2RlX2Jhc2UpOworCQkJV3JpdGVWcHVSZWdpc3RlcihWUDVfQ09ERV9TSVpFLCBjb2RlX3NpemUpOworCQkJV3JpdGVWcHVSZWdpc3RlcihWUDVfQ09ERV9QQVJBTSwgMCk7CisJCQlXcml0ZVZwdVJlZ2lzdGVyKFZQNV9JTklUX1ZQVV9USU1FX09VVF9DTlQsIHRpbWVvdXQpOworCQkJV3JpdGVWcHVSZWdpc3RlcihWUDVfSFdfT1BUSU9OLCBod09wdGlvbik7CisKKwkJCS8qIEludGVycnVwdCAqLworCQkJcmVnVmFsID0gKDEgPDwgSU5UX0VOQ19TRVRfUEFSQU0pOworCQkJcmVnVmFsIHw9ICgxIDw8IElOVF9FTkNfUElDKTsKKwkJCXJlZ1ZhbCB8PSAoMSA8PCBJTlRfSU5JVF9TRVEpOworCQkJcmVnVmFsIHw9ICgxIDw8IElOVF9ERUNfUElDKTsKKwkJCXJlZ1ZhbCB8PSAoMSA8PCBJTlRfQlNCVUZfRU1QVFkpOworCQkJV3JpdGVWcHVSZWdpc3RlcihWUDVfVlBVX1ZJTlRfRU5BQkxFLCByZWdWYWwpOworCQkJVnA1Qml0SXNzdWVDb21tYW5kKGNvcmUsIFZQNV9DTURfSU5JVF9WUFUpOworCQkJV3JpdGVWcHVSZWdpc3RlcihWUDVfVlBVX1JFTUFQX0NPUkVfU1RBUlQsIDEpOworCQkJd2hpbGUgKFJlYWRWcHVSZWdpc3RlcihWUDVfVlBVX0JVU1lfU1RBVFVTKSkgeworCQkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJCQlnb3RvIERPTkVfV0FLRVVQOworCQkJfQorCisJCQlpZiAoUmVhZFZwdVJlZ2lzdGVyKFZQNV9SRVRfU1VDQ0VTUykgPT0gMCkgeworCQkJCWVuY19wcihMT0dfRVJST1IsCisJCQkJCSJXQUtFVVBfVlBVIGZhaWxlZCBbMHgleF0iLAorCQkJCQlSZWFkVnB1UmVnaXN0ZXIoVlA1X1JFVF9GQUlMX1JFQVNPTikpOworCQkJCWdvdG8gRE9ORV9XQUtFVVA7CisJCQl9CisJCX0KKwl9CitET05FX1dBS0VVUDoKKwlpZiAoc192cHVfb3Blbl9yZWZfY291bnQgPiAwKQorCQl2cHVfY2xrX2NvbmZpZygwKTsKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIHZwdV9zdXNwZW5kIE5VTEwKKyNkZWZpbmUgdnB1X3Jlc3VtZSBOVUxMCisjZW5kaWYgLyogIUNPTkZJR19QTSAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBjbm1fbXVsdGllbmNfZHRfbWF0Y2hbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0gImNubSwgTXVsdGlFbmMiLAorCX0sCisJe30sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB2cHVfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gVlBVX1BMQVRGT1JNX0RFVklDRV9OQU1FLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBjbm1fbXVsdGllbmNfZHRfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSB2cHVfcHJvYmUsCisJLnJlbW92ZSA9IHZwdV9yZW1vdmUsCisJLnN1c3BlbmQgPSB2cHVfc3VzcGVuZCwKKwkucmVzdW1lID0gdnB1X3Jlc3VtZSwKK307CisKK3N0YXRpYyBzMzIgX19pbml0IHZwdV9pbml0KHZvaWQpCit7CisJczMyIHJlczsKKworCWVuY19wcihMT0dfREVCVUcsICJ2cHVfaW5pdFxuIik7CisKKwlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpICE9IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UNykgeworCQlwcl9lcnIoIlRoZSBjaGlwIGlzIG5vdCBzdXBwb3J0IG11bHRpIGVuY29kZXIhIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXMgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnZwdV9kcml2ZXIpOworCWVuY19wcihMT0dfSU5GTywKKwkJImVuZCB2cHVfaW5pdCByZXN1bHQ9MHgleFxuIiwgcmVzKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdnB1X2V4aXQodm9pZCkKK3sKKwllbmNfcHIoTE9HX0RFQlVHLCAidnB1X2V4aXRcbiIpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ2cHVfZHJpdmVyKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCByZXNlcnZlZF9tZW1fb3BzIHJtZW1fbXVsdGllbmNfb3BzID0geworCS5kZXZpY2VfaW5pdCA9IG11bHRpZW5jX21lbV9kZXZpY2VfaW5pdCwKK307CisKK3N0YXRpYyBzMzIgX19pbml0IG11bHRpZW5jX21lbV9zZXR1cChzdHJ1Y3QgcmVzZXJ2ZWRfbWVtICpybWVtKQoreworCXJtZW0tPm9wcyA9ICZybWVtX211bHRpZW5jX29wczsKKwllbmNfcHIoTE9HX0RFQlVHLCAiTXVsdGlFbmMgcmVzZXJ2ZWQgbWVtIHNldHVwLlxuIik7CisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9wYXJhbShwcmludF9sZXZlbCwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHByaW50X2xldmVsLCAiXG4gcHJpbnRfbGV2ZWxcbiIpOworCittb2R1bGVfcGFyYW0oY2xvY2tfbGV2ZWwsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhjbG9ja19sZXZlbCwgIlxuIGNsb2NrX2xldmVsXG4iKTsKKworbW9kdWxlX3BhcmFtKGNsb2NrX2dhdGVfY291bnQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhjbG9ja19nYXRlX2NvdW50LCAiXG4gY2xvY2tfZ2F0ZV9jb3VudFxuIik7CisKK21vZHVsZV9wYXJhbShzZXRfY2xvY2tfZnJlcSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHNldF9jbG9ja19mcmVxLCAiXG4gc2V0IGNsayBmcmVxXG4iKTsKKworbW9kdWxlX3BhcmFtKGNsb2NrX2EsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhjbG9ja19hLCAiXG4gY2xvY2tfYVxuIik7CisKK21vZHVsZV9wYXJhbShjbG9ja19iLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoY2xvY2tfYiwgIlxuIGNsb2NrX2JcbiIpOworCittb2R1bGVfcGFyYW0oY2xvY2tfYywgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNsb2NrX2MsICJcbiBjbG9ja19jXG4iKTsKKworbW9kdWxlX3BhcmFtKGR1bXBfaW5wdXQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkdW1wX2lucHV0LCAiXG4gZHVtcF9pbnB1dFxuIik7CisKK21vZHVsZV9wYXJhbShkdW1wX2VzLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZHVtcF9lcywgIlxuIGR1bXBfZXNcbiIpOworCitNT0RVTEVfQVVUSE9SKCJBbWxvZ2ljIEluYy4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVlBVIGxpbnV4IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdCh2cHVfaW5pdCk7Cittb2R1bGVfZXhpdCh2cHVfZXhpdCk7CitSRVNFUlZFRE1FTV9PRl9ERUNMQVJFKGNubV9tdWx0aWVuYywgImNubSwgTXVsdGlFbmMtbWVtIiwgbXVsdGllbmNfbWVtX3NldHVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVfc2luay9lbmNvZGVyL211bHRpL3ZwdV9tdWx0aS5oIGIvZHJpdmVycy9mcmFtZV9zaW5rL2VuY29kZXIvbXVsdGkvdnB1X211bHRpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEyZGYwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVfc2luay9lbmNvZGVyL211bHRpL3ZwdV9tdWx0aS5oCkBAIC0wLDAgKzEsMzUyIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBieSBBbWxvZ2ljLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX1ZQVV9NVUxUSV9EUlZfSF9fCisjZGVmaW5lIF9fVlBVX01VTFRJX0RSVl9IX18KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtYnVmLmg+CisKKyNkZWZpbmUgU1VQUE9SVF9TT1VSQ0VfUkVMRUFTRV9JTlRFUlJVUFQKKworLyogRE8gTk9UIENIQU5HRSBUSElTIFZBTFVFICovCisjZGVmaW5lIE1BWF9JTlNUX0hBTkRMRV9TSVpFCTQ4CisjZGVmaW5lIE1BWF9OVU1fSU5TVEFOQ0UJNgorI2RlZmluZSBNQVhfTlVNX1ZQVV9DT1JFCTEKKworI2lmZGVmIENPTkZJR19DT01QQVQKK3N0cnVjdCBjb21wYXRfdnB1ZHJ2X2J1ZmZlcl90IHsKKwl1MzIgc2l6ZTsKKwl1MzIgY2FjaGVkOworCWNvbXBhdF91bG9uZ190IHBoeXNfYWRkcjsKKwljb21wYXRfdWxvbmdfdCBiYXNlOyAvKiBrZXJuZWwgbG9naWNhbCBhZGRyZXNzIGluIHVzZSBrZXJuZWwgKi8KKwljb21wYXRfdWxvbmdfdCB2aXJ0X2FkZHI7IC8qIHZpcnR1YWwgdXNlciBzcGFjZSBhZGRyZXNzICovCit9OworI2VuZGlmCisKK3N0cnVjdCB2cHVkcnZfYnVmZmVyX3QgeworCXUzMiBzaXplOworCXUzMiBjYWNoZWQ7CisJdWxvbmcgcGh5c19hZGRyOworCXVsb25nIGJhc2U7IC8qIGtlcm5lbCBsb2dpY2FsIGFkZHJlc3MgaW4gdXNlIGtlcm5lbCAqLworCXVsb25nIHZpcnRfYWRkcjsgLyogdmlydHVhbCB1c2VyIHNwYWNlIGFkZHJlc3MgKi8KK307CisKK3N0cnVjdCB2cHVfYml0X2Zpcm13YXJlX2luZm9fdCB7CisJdTMyIHNpemU7IC8qIHNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUqLworCXUzMiBjb3JlX2lkeDsKKwl1MzIgcmVnX2Jhc2Vfb2Zmc2V0OworCXUxNiBiaXRfY29kZVs1MTJdOworfTsKKworc3RydWN0IHZwdWRydl9pbnN0X2luZm9fdCB7CisJdTMyIGNvcmVfaWR4OworCXUzMiBpbnN0X2lkeDsKKwlzMzIgaW5zdF9vcGVuX2NvdW50OyAvKiBmb3Igb3V0cHV0IG9ubHkqLworfTsKKworc3RydWN0IHZwdWRydl9pbnRyX2luZm9fdCB7CisJdTMyIHRpbWVvdXQ7CisJczMyIGludHJfcmVhc29uOworCXMzMglpbnRyX2luc3RfaW5kZXg7Cit9OworCitzdHJ1Y3QgdnB1X2Rydl9jb250ZXh0X3QgeworCXN0cnVjdCBmYXN5bmNfc3RydWN0ICphc3luY19xdWV1ZTsKKwl1bG9uZyBpbnRlcnJ1cHRfcmVhc29uW01BWF9OVU1fSU5TVEFOQ0VdOworCXUzMiBpbnRlcnJ1cHRfZmxhZ1tNQVhfTlVNX0lOU1RBTkNFXTsKKwl1MzIgb3Blbl9jb3VudDsgLyohPDwgZGV2aWNlIHJlZmVyZW5jZSBjb3VudC4gTm90IGluc3RhbmNlIGNvdW50ICovCit9OworCisvKiBUbyB0cmFjayB0aGUgYWxsb2NhdGVkIG1lbW9yeSBidWZmZXIgKi8KK3N0cnVjdCB2cHVkcnZfYnVmZmVyX3Bvb2xfdCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCB2cHVkcnZfYnVmZmVyX3QgdmI7CisJc3RydWN0IGZpbGUgKmZpbHA7Cit9OworCisvKiBUbyB0cmFjayB0aGUgaW5zdGFuY2UgaW5kZXggYW5kIGJ1ZmZlciBpbiBpbnN0YW5jZSBwb29sICovCitzdHJ1Y3QgdnB1ZHJ2X2luc3RhbmFjZV9saXN0X3QgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1bG9uZyBpbnN0X2lkeDsKKwl1bG9uZyBjb3JlX2lkeDsKKwlzdHJ1Y3QgZmlsZSAqZmlscDsKK307CisKK3N0cnVjdCB2cHVkcnZfaW5zdGFuY2VfcG9vbF90IHsKKwl1OCBjb2RlY0luc3RQb29sW01BWF9OVU1fSU5TVEFOQ0VdW01BWF9JTlNUX0hBTkRMRV9TSVpFXTsKK307CisKK3N0cnVjdCB2cHVkcnZfZG1hX2J1Zl9pbmZvX3QgeworCXUzMiBudW1fcGxhbmVzOworCWludCBmZFszXTsKKwl1bG9uZyBwaHlzX2FkZHJbM107IC8qIHBoeXMgYWRkcmVzcyBmb3IgRE1BIGJ1ZmZlciAqLworfTsKKworLy9ob2FuIGFkZCBmb3IgY2FudmFzCitzdHJ1Y3QgdnB1ZHJ2X2RtYV9idWZfY2FudmFzX2luZm9fdCB7CisJdTMyIG51bV9wbGFuZXM7CisJdTMyIGNhbnZhc19pbmRleDsKKwlpbnQgZmRbM107CisJdWxvbmcgcGh5c19hZGRyWzNdOyAvKiBwaHlzIGFkZHJlc3MgZm9yIERNQSBidWZmZXIgKi8KK307CisKKworCisvL2VuZAorCisKKworI2lmZGVmIENPTkZJR19DT01QQVQKK3N0cnVjdCBjb21wYXRfdnB1ZHJ2X2RtYV9idWZfaW5mb190IHsKKwl1MzIgbnVtX3BsYW5lczsKKwljb21wYXRfaW50X3QgZmRbM107CisJY29tcGF0X3Vsb25nX3QgcGh5c19hZGRyWzNdOyAvKiBwaHlzIGFkZHJlc3MgZm9yIERNQSBidWZmZXIgKi8KK307CisKKworc3RydWN0IGNvbXBhdF92cHVkcnZfZG1hX2J1Zl9jYW52YXNfaW5mb190IHsKKwl1MzIgbnVtX3BsYW5lczsKKwl1MzIgY2FudmFzX2luZGV4OworCWNvbXBhdF9pbnRfdCBmZFszXTsKKwljb21wYXRfdWxvbmdfdCBwaHlzX2FkZHJbM107IC8qIHBoeXMgYWRkcmVzcyBmb3IgRE1BIGJ1ZmZlciAqLworfTsKKworCisjZW5kaWYKKworc3RydWN0IHZwdV9kbWFfY2ZnIHsKKwlpbnQgZmQ7CisJdm9pZCAqZGV2OworCXZvaWQgKnZhZGRyOworCXVuc2lnbmVkIGxvbmcgcGFkZHI7CisJc3RydWN0IGRtYV9idWYgKmRidWY7CisJc3RydWN0IGRtYV9idWZfYXR0YWNobWVudCAqYXR0YWNoOworCXN0cnVjdCBzZ190YWJsZSAqc2c7CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyOworfTsKKworLyogVG8gdHJhY2sgdGhlIG9jY3VwaWVkIGRtYV9idWYgICovCitzdHJ1Y3QgdnB1ZHJ2X2RtYV9idWZfcG9vbF90IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHZwdV9kbWFfY2ZnIGRtYV9jZmc7CisJc3RydWN0IGZpbGUgKmZpbHA7Cit9OworCisjZGVmaW5lIFZQVURSVl9CVUZfTEVOIHN0cnVjdCB2cHVkcnZfYnVmZmVyX3QKKyNkZWZpbmUgVlBVRFJWX0lOU1RfTEVOIHN0cnVjdCB2cHVkcnZfaW5zdF9pbmZvX3QKKyNkZWZpbmUgVlBVRFJWX0RNQUJVRl9MRU4gc3RydWN0IHZwdWRydl9kbWFfYnVmX2luZm9fdAorCS8vaG9hbiBhZGQgZm9yIGNhbnZhcworI2RlZmluZSBWUFVEUlZfRE1BQlVGX0NBTlZBU19MRU4gc3RydWN0IHZwdWRydl9kbWFfYnVmX2NhbnZhc19pbmZvX3QKKwkvL2VuZAorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorI2RlZmluZSBWUFVEUlZfQlVGX0xFTjMyIHN0cnVjdCBjb21wYXRfdnB1ZHJ2X2J1ZmZlcl90CisjZGVmaW5lIFZQVURSVl9ETUFCVUZfTEVOMzIgc3RydWN0IGNvbXBhdF92cHVkcnZfZG1hX2J1Zl9pbmZvX3QKKwkJLy9ob2FuIGFkZCBmb3IgY2FudmFzCisjZGVmaW5lIFZQVURSVl9ETUFCVUZfQ0FOVkFTX0xFTjMyIHN0cnVjdCBjb21wYXRfdnB1ZHJ2X2RtYV9idWZfY2FudmFzX2luZm9fdAorCQkvL2VuZAorCisjZW5kaWYKKworI2RlZmluZSBWRElfTUFHSUMgICdWJworI2RlZmluZSBWRElfSU9DVExfQUxMT0NBVEVfUEhZU0lDQUxfTUVNT1JZIFwKKwlfSU9XKFZESV9NQUdJQywgMCwgVlBVRFJWX0JVRl9MRU4pCisKKyNkZWZpbmUgVkRJX0lPQ1RMX0ZSRUVfUEhZU0lDQUxNRU1PUlkgXAorCV9JT1coVkRJX01BR0lDLCAxLCBWUFVEUlZfQlVGX0xFTikKKworI2RlZmluZSBWRElfSU9DVExfV0FJVF9JTlRFUlJVUFQgXAorCV9JT1coVkRJX01BR0lDLCAyLCBzdHJ1Y3QgdnB1ZHJ2X2ludHJfaW5mb190KQorCisjZGVmaW5lIFZESV9JT0NUTF9TRVRfQ0xPQ0tfR0FURSBcCisJX0lPVyhWRElfTUFHSUMsIDMsIHUzMikKKworI2RlZmluZSBWRElfSU9DVExfUkVTRVQgXAorCV9JT1coVkRJX01BR0lDLCA0LCB1MzIpCisKKyNkZWZpbmUgVkRJX0lPQ1RMX0dFVF9JTlNUQU5DRV9QT09MIFwKKwlfSU9XKFZESV9NQUdJQywgNSwgVlBVRFJWX0JVRl9MRU4pCisKKyNkZWZpbmUgVkRJX0lPQ1RMX0dFVF9DT01NT05fTUVNT1JZIFwKKwlfSU9XKFZESV9NQUdJQywgNiwgVlBVRFJWX0JVRl9MRU4pCisKKyNkZWZpbmUgVkRJX0lPQ1RMX0dFVF9SRVNFUlZFRF9WSURFT19NRU1PUllfSU5GTyBcCisJX0lPVyhWRElfTUFHSUMsIDgsIFZQVURSVl9CVUZfTEVOKQorCisjZGVmaW5lIFZESV9JT0NUTF9PUEVOX0lOU1RBTkNFIFwKKwlfSU9XKFZESV9NQUdJQywgOSwgVlBVRFJWX0lOU1RfTEVOKQorCisjZGVmaW5lIFZESV9JT0NUTF9DTE9TRV9JTlNUQU5DRSBcCisJX0lPVyhWRElfTUFHSUMsIDEwLCBWUFVEUlZfSU5TVF9MRU4pCisKKyNkZWZpbmUgVkRJX0lPQ1RMX0dFVF9JTlNUQU5DRV9OVU0gXAorCV9JT1coVkRJX01BR0lDLCAxMSwgVlBVRFJWX0lOU1RfTEVOKQorCisjZGVmaW5lIFZESV9JT0NUTF9HRVRfUkVHSVNURVJfSU5GTyBcCisJX0lPVyhWRElfTUFHSUMsIDEyLCBWUFVEUlZfQlVGX0xFTikKKworI2RlZmluZSBWRElfSU9DVExfR0VUX0ZSRUVfTUVNX1NJWkUJXAorCV9JT1coVkRJX01BR0lDLCAxMywgdTMyKQorCisjZGVmaW5lIFZESV9JT0NUTF9GTFVTSF9CVUZGRVIgXAorCV9JT1coVkRJX01BR0lDLCAxNCwgVlBVRFJWX0JVRl9MRU4pCisKKyNkZWZpbmUgVkRJX0lPQ1RMX0NBQ0hFX0lOVl9CVUZGRVIgXAorCV9JT1coVkRJX01BR0lDLCAxNSwgVlBVRFJWX0JVRl9MRU4pCisKKyNkZWZpbmUgVkRJX0lPQ1RMX0NPTkZJR19ETUEgXAorCV9JT1coVkRJX01BR0lDLCAxNiwgVlBVRFJWX0RNQUJVRl9MRU4pCisKKyNkZWZpbmUgVkRJX0lPQ1RMX1VOTUFQX0RNQSBcCisJX0lPVyhWRElfTUFHSUMsIDE3LCBWUFVEUlZfRE1BQlVGX0xFTikKKworCisvL2hvYW4gYWRkIGZvciBjYW52YXMKKyNkZWZpbmUgVkRJX0lPQ1RMX1JFQURfQ0FOVkFTIFwKKwlfSU9XKFZESV9NQUdJQywgMjAsIFZQVURSVl9ETUFCVUZfQ0FOVkFTX0xFTikKKy8vZW5kCisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisjZGVmaW5lIFZESV9JT0NUTF9BTExPQ0FURV9QSFlTSUNBTF9NRU1PUlkzMiBcCisJX0lPVyhWRElfTUFHSUMsIDAsIFZQVURSVl9CVUZfTEVOMzIpCisKKyNkZWZpbmUgVkRJX0lPQ1RMX0ZSRUVfUEhZU0lDQUxNRU1PUlkzMiBcCisJX0lPVyhWRElfTUFHSUMsIDEsIFZQVURSVl9CVUZfTEVOMzIpCisKKyNkZWZpbmUgVkRJX0lPQ1RMX0dFVF9JTlNUQU5DRV9QT09MMzIgXAorCV9JT1coVkRJX01BR0lDLCA1LCBWUFVEUlZfQlVGX0xFTjMyKQorCisjZGVmaW5lIFZESV9JT0NUTF9HRVRfQ09NTU9OX01FTU9SWTMyIFwKKwlfSU9XKFZESV9NQUdJQywgNiwgVlBVRFJWX0JVRl9MRU4zMikKKworI2RlZmluZSBWRElfSU9DVExfR0VUX1JFU0VSVkVEX1ZJREVPX01FTU9SWV9JTkZPMzIgXAorCV9JT1coVkRJX01BR0lDLCA4LCBWUFVEUlZfQlVGX0xFTjMyKQorCisjZGVmaW5lIFZESV9JT0NUTF9HRVRfUkVHSVNURVJfSU5GTzMyIFwKKwlfSU9XKFZESV9NQUdJQywgMTIsIFZQVURSVl9CVUZfTEVOMzIpCisKKyNkZWZpbmUgVkRJX0lPQ1RMX0ZMVVNIX0JVRkZFUjMyIFwKKwlfSU9XKFZESV9NQUdJQywgMTQsIFZQVURSVl9CVUZfTEVOMzIpCisKKyNkZWZpbmUgVkRJX0lPQ1RMX0NBQ0hFX0lOVl9CVUZGRVIzMiBcCisJX0lPVyhWRElfTUFHSUMsIDE1LCBWUFVEUlZfQlVGX0xFTjMyKQorCisjZGVmaW5lIFZESV9JT0NUTF9DT05GSUdfRE1BMzIgXAorCV9JT1coVkRJX01BR0lDLCAxNiwgVlBVRFJWX0RNQUJVRl9MRU4zMikKKworI2RlZmluZSBWRElfSU9DVExfVU5NQVBfRE1BMzIgXAorCV9JT1coVkRJX01BR0lDLCAxNywgVlBVRFJWX0RNQUJVRl9MRU4zMikKKworLy9ob2FuIGFkZCBmb3IgY2FudmFzCisjZGVmaW5lIFZESV9JT0NUTF9SRUFEX0NBTlZBUzMyIFwKKwlfSU9XKFZESV9NQUdJQywgMjAsIFZQVURSVl9ETUFCVUZfQ0FOVkFTX0xFTjMyKQorLy9lbmQKKworCisKKyNlbmRpZgorLyogaW1wbGVtZW50IHRvIHBvd2VyIG1hbmFnZW1lbnQgZnVuY3Rpb25zICovCisjZGVmaW5lIEJJVF9CQVNFCQkweDAwMDAKKyNkZWZpbmUgQklUX0NPREVfUlVOCQkoQklUX0JBU0UgKyAweDAwMCkKKyNkZWZpbmUgQklUX0NPREVfRE9XTgkJKEJJVF9CQVNFICsgMHgwMDQpCisjZGVmaW5lIEJJVF9JTlRfQ0xFQVIJCShCSVRfQkFTRSArIDB4MDBDKQorI2RlZmluZSBCSVRfSU5UX1NUUwkJKEJJVF9CQVNFICsgMHgwMTApCisjZGVmaW5lIEJJVF9DT0RFX1JFU0VUCQkoQklUX0JBU0UgKyAweDAxNCkKKyNkZWZpbmUgQklUX0lOVF9SRUFTT04JCShCSVRfQkFTRSArIDB4MTc0KQorI2RlZmluZSBCSVRfQlVTWV9GTEFHCQkoQklUX0JBU0UgKyAweDE2MCkKKyNkZWZpbmUgQklUX1JVTl9DT01NQU5ECQkoQklUX0JBU0UgKyAweDE2NCkKKyNkZWZpbmUgQklUX1JVTl9JTkRFWAkJKEJJVF9CQVNFICsgMHgxNjgpCisjZGVmaW5lIEJJVF9SVU5fQ09EX1NURAkJKEJJVF9CQVNFICsgMHgxNkMpCisKKworI2RlZmluZSBWUFVfUkVHX0JBU0VfQUREUiAweEZFMDcwMDAwCisjZGVmaW5lIFZQVV9SRUdfU0laRSAoMHg0MDAwKk1BWF9OVU1fVlBVX0NPUkUpCisKKy8qIHJlZ2lzdGVycyAqLworI2RlZmluZSBWUDVfUkVHX0JBU0UJCQkweDAwMDAKKyNkZWZpbmUgVlA1X1ZQVV9CVVNZX1NUQVRVUwkJKFZQNV9SRUdfQkFTRSArIDB4MDA3MCkKKyNkZWZpbmUgVlA1X1ZQVV9JTlRfUkVBU09OX0NMRUFSCShWUDVfUkVHX0JBU0UgKyAweDAwMzQpCisjZGVmaW5lIFZQNV9WUFVfVklOVF9DTEVBUgkJKFZQNV9SRUdfQkFTRSArIDB4MDAzQykKKyNkZWZpbmUgVlA1X1ZQVV9WUFVfSU5UX1NUUwkJKFZQNV9SRUdfQkFTRSArIDB4MDA0NCkKKyNkZWZpbmUgVlA1X1ZQVV9JTlRfUkVBU09OCQkoVlA1X1JFR19CQVNFICsgMHgwMDRjKQorI2RlZmluZSBWUDVfUkVUX0ZBSUxfUkVBU09OCQkoVlA1X1JFR19CQVNFICsgMHgwMTBDKQorCisjZGVmaW5lIFZQNV9SRVRfQlNfRU1QVFlfSU5TVAkJKFZQNV9SRUdfQkFTRSArIDB4MDFFNCkKKyNkZWZpbmUgVlA1X1JFVF9RVUVVRV9DTURfRE9ORV9JTlNUCShWUDVfUkVHX0JBU0UgKyAweDAxRTgpCisjZGVmaW5lIFZQNV9SRVRfU0VRX0RPTkVfSU5TVEFOQ0VfSU5GTwkoVlA1X1JFR19CQVNFICsgMHgwMUZDKQorCisvKiBpbnRlcnJydXB0IGJpdHMgKi8KK2VudW0geworCUlOVF9JTklUX1ZQVQkJPSAwLAorCUlOVF9XQUtFVVBfVlBVCQk9IDEsCisJSU5UX1NMRUVQX1ZQVQkJPSAyLAorCUlOVF9DUkVBVEVfSU5TVEFOQ0UJPSAzLAorCUlOVF9GTFVTSF9JTlNUQU5DRQk9IDQsCisJSU5UX0RFU1RPUllfSU5TVEFOQ0UJPSA1LAorCUlOVF9JTklUX1NFUQkJPSA2LAorCUlOVF9TRVRfRlJBTUVCVUYJPSA3LAorCUlOVF9ERUNfUElDCQk9IDgsCisJSU5UX0VOQ19QSUMJCT0gOCwKKwlJTlRfRU5DX1NFVF9QQVJBTQk9IDksCisjaWZkZWYgU1VQUE9SVF9TT1VSQ0VfUkVMRUFTRV9JTlRFUlJVUFQKKwlJTlRfRU5DX1NSQ19SRUxFQVNFCT0gMTAsCisjZW5kaWYKKwlJTlRfRU5DX0xPV19MQVRFTkNZCT0gMTMsCisJSU5UX0RFQ19RVUVSWQkJPSAxNCwKKwlJTlRfQlNCVUZfRU1QVFkJCT0gMTUsCisJSU5UX0JTQlVGX0ZVTEwJCT0gMTUsCit9OworCisvKiBJTklULCBXQUtFVVAgKi8KKyNkZWZpbmUgVlA1X1BPX0NPTkYJCQkoVlA1X1JFR19CQVNFICsgMHgwMDAwKQorI2RlZmluZSBWUDVfVlBVX1ZJTlRfRU5BQkxFCQkoVlA1X1JFR19CQVNFICsgMHgwMDQ4KQorCisjZGVmaW5lIFZQNV9WUFVfUkVTRVRfUkVRCQkoVlA1X1JFR19CQVNFICsgMHgwMDUwKQorI2RlZmluZSBWUDVfVlBVX1JFU0VUX1NUQVRVUwkJKFZQNV9SRUdfQkFTRSArIDB4MDA1NCkKKworI2RlZmluZSBWUDVfVlBVX1JFTUFQX0NUUkwJCShWUDVfUkVHX0JBU0UgKyAweDAwNjApCisjZGVmaW5lIFZQNV9WUFVfUkVNQVBfVkFERFIJCShWUDVfUkVHX0JBU0UgKyAweDAwNjQpCisjZGVmaW5lIFZQNV9WUFVfUkVNQVBfUEFERFIJCShWUDVfUkVHX0JBU0UgKyAweDAwNjgpCisjZGVmaW5lIFZQNV9WUFVfUkVNQVBfQ09SRV9TVEFSVAkoVlA1X1JFR19CQVNFICsgMHgwMDZDKQorCisjZGVmaW5lIFZQNV9SRU1BUF9DT0RFX0lOREVYCQkwCisKKy8qVlBVIHJlZ2lzdGVycyAqLworI2RlZmluZSBWUDVfQUREUl9DT0RFX0JBU0UJCShWUDVfUkVHX0JBU0UgKyAweDAxMTApCisjZGVmaW5lIFZQNV9DT0RFX1NJWkUJCQkoVlA1X1JFR19CQVNFICsgMHgwMTE0KQorI2RlZmluZSBWUDVfQ09ERV9QQVJBTQkJCShWUDVfUkVHX0JBU0UgKyAweDAxMTgpCisjZGVmaW5lIFZQNV9JTklUX1ZQVV9USU1FX09VVF9DTlQJKFZQNV9SRUdfQkFTRSArIDB4MDEzMCkKKyNkZWZpbmUgVlA1X0hXX09QVElPTgkJCShWUDVfUkVHX0JBU0UgKyAweDAxMkMpCisjZGVmaW5lIFZQNV9SRVRfU1VDQ0VTUwkJCShWUDVfUkVHX0JBU0UgKyAweDAxMDgpCisjZGVmaW5lIFZQNV9DT01NQU5ECQkJKFZQNV9SRUdfQkFTRSArIDB4MDEwMCkKKyNkZWZpbmUgVlA1X1ZQVV9IT1NUX0lOVF9SRVEJCShWUDVfUkVHX0JBU0UgKyAweDAwMzgpCisvKiBQcm9kdWN0IHJlZ2lzdGVyICovCisjZGVmaW5lIFZQVV9QUk9EVUNUX0NPREVfUkVHSVNURVIJKEJJVF9CQVNFICsgMHgxMDQ0KQorCisjZGVmaW5lIFJlYWRWcHVSZWdpc3RlcihhZGRyKSBcCisJcmVhZGwoKHZvaWQgX19pb21lbSAqKShzX3ZwdV9yZWdpc3Rlci52aXJ0X2FkZHIgXAorCSsgc19iaXRfZmlybXdhcmVfaW5mb1tjb3JlXS5yZWdfYmFzZV9vZmZzZXQgKyBhZGRyKSkKKworI2RlZmluZSBXcml0ZVZwdVJlZ2lzdGVyKGFkZHIsIHZhbCkgXAorCXdyaXRlbCgodTMyKXZhbCwgKHZvaWQgX19pb21lbSAqKShzX3ZwdV9yZWdpc3Rlci52aXJ0X2FkZHIgXAorCSsgc19iaXRfZmlybXdhcmVfaW5mb1tjb3JlXS5yZWdfYmFzZV9vZmZzZXQgKyBhZGRyKSkKKworI2RlZmluZSBXcml0ZVZwdShhZGRyLCB2YWwpIHdyaXRlbCgodTMyKXZhbCwgKHZvaWQgX19pb21lbSAqKWFkZHIpCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnJhbWVyYXRlX2FkYXB0ZXIvTWFrZWZpbGUgYi9kcml2ZXJzL2ZyYW1lcmF0ZV9hZGFwdGVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMTk5OGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lcmF0ZV9hZGFwdGVyL01ha2VmaWxlCkBAIC0wLDAgKzEgQEAKK29iai1tICAgKz0gICAgICB2aWRlb19mcmFtZXJhdGVfYWRhcHRlci5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZyYW1lcmF0ZV9hZGFwdGVyL3ZpZGVvX2ZyYW1lcmF0ZV9hZGFwdGVyLmMgYi9kcml2ZXJzL2ZyYW1lcmF0ZV9hZGFwdGVyL3ZpZGVvX2ZyYW1lcmF0ZV9hZGFwdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU5YmQ2NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZnJhbWVyYXRlX2FkYXB0ZXIvdmlkZW9fZnJhbWVyYXRlX2FkYXB0ZXIuYwpAQCAtMCwwICsxLDEzMyBAQAorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvbWFqb3IuaD4KKyNpbmNsdWRlICJ2aWRlb19mcmFtZXJhdGVfYWRhcHRlci5oIgorCisjZGVmaW5lIENMQVNTX05BTUUJImZyYW1lcmF0ZV9hZGFwdGVyIgorI2RlZmluZSBERVZfTkFNRQkiZnJhbWVyYXRlX2RldiIKKworI2lmbmRlZiBWSURFT0ZSQU1FX01BSk9SCisjZGVmaW5lIFZJREVPRlJBTUVfTUFKT1IgQU1TVFJFQU1fTUFKT1IKKyNlbmRpZgorCitzdHJ1Y3QgZnJhbWVfcmF0ZV9kZXZfcyogZnJhbWVfcmF0ZV9kZXY7CisKKyB2b2lkIHZmcmFtZV9yYXRlX3VldmVudChpbnQgZHVyYXRpb24pCit7CisJY2hhciAqY29uZmlndXJlZFsyXTsKKwljaGFyIGZyYW1lcmF0ZVs0MF0gPSB7MH07CisKKwlzcHJpbnRmKGZyYW1lcmF0ZSwgIkZSQU1FX1JBVEVfSElOVD0lbHUiLAorCQkodW5zaWduZWQgbG9uZylkdXJhdGlvbik7CisJY29uZmlndXJlZFswXSA9IGZyYW1lcmF0ZTsKKwljb25maWd1cmVkWzFdID0gTlVMTDsKKwlrb2JqZWN0X3VldmVudF9lbnYoJmZyYW1lX3JhdGVfZGV2LT5kZXYtPmtvYmosCisJCUtPQkpfQ0hBTkdFLCBjb25maWd1cmVkKTsKKworCXByX2luZm8oIiVzOiBzZW50IHVldmVudCAlc1xuIiwgX19mdW5jX18sIGNvbmZpZ3VyZWRbMF0pOworfQorCitFWFBPUlRfU1lNQk9MKHZmcmFtZV9yYXRlX3VldmVudCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZyYW1lX3JhdGVfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRQorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmZyYW1lX3JhdGVfY2xhc3NfYXR0cnNbXSA9IHsKKwlOVUxMCit9OworCitBVFRSSUJVVEVfR1JPVVBTKGZyYW1lX3JhdGVfY2xhc3MpOworCitzdGF0aWMgc3RydWN0IGNsYXNzIGZyYW1lX3JhdGVfY2xhc3MgPSB7CisJLm5hbWUgPSBDTEFTU19OQU1FLAorCS5jbGFzc19ncm91cHMgPSBmcmFtZV9yYXRlX2NsYXNzX2dyb3VwcywKK307CisKK3N0YXRpYyBpbnQgZnJhbWVfcmF0ZV9kcml2ZXJfaW5pdCh2b2lkKQoreworCWludCByZXQgPSAtMTsKKworCWZyYW1lX3JhdGVfZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZyYW1lX3JhdGVfZGV2X3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZnJhbWVfcmF0ZV9kZXYpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZyYW1lX3JhdGVfZGV2LT5kZXZfbm8gPSBNS0RFVihWSURFT0ZSQU1FX01BSk9SLCAxMDEpOworCisJcmV0ID0gcmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihmcmFtZV9yYXRlX2Rldi0+ZGV2X25vLCAxLCBERVZfTkFNRSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCJDYW4ndCBnZXQgbWFqb3IgbnVtYmVyICVkLlxuIiwgVklERU9GUkFNRV9NQUpPUik7CisJCWdvdG8gZXJyXzQ7CisJfQorCisJY2Rldl9pbml0KCZmcmFtZV9yYXRlX2Rldi0+Y2RldiwgJmZyYW1lX3JhdGVfZm9wcyk7CisJZnJhbWVfcmF0ZV9kZXYtPmNkZXYub3duZXIgPSBUSElTX01PRFVMRTsKKworCXJldCA9IGNkZXZfYWRkKCZmcmFtZV9yYXRlX2Rldi0+Y2RldiwgZnJhbWVfcmF0ZV9kZXYtPmRldl9ubywgMSk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIkVycm9yICVkIGFkZGluZyBjZGV2IGZhaWwuXG4iLCByZXQpOworCQlnb3RvIGVycl8zOworCX0KKworCXJldCA9IGNsYXNzX3JlZ2lzdGVyKCZmcmFtZV9yYXRlX2NsYXNzKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIkZhaWxlZCBpbiBjcmVhdGluZyBjbGFzcy5cbiIpOworCQlnb3RvIGVycl8yOworCX0KKworCWZyYW1lX3JhdGVfZGV2LT5kZXYgPSBkZXZpY2VfY3JlYXRlKCZmcmFtZV9yYXRlX2NsYXNzLCBOVUxMLAorCQlmcmFtZV9yYXRlX2Rldi0+ZGV2X25vLCBOVUxMLCBERVZfTkFNRSk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGZyYW1lX3JhdGVfZGV2LT5kZXYpKSB7CisJCXByX2VycigiQ3JlYXRlIGRldmljZSBmYWlsZWQuXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfMTsKKwl9CisJcHJfaW5mbygiUmVnaXN0ZXJlZCBmcmFtZSByYXRlIGRyaXZlciBzdWNjZXNzLlxuIik7CisJcmV0dXJuIDA7CisKK2Vycl8xOgorCWRldmljZV9kZXN0cm95KCZmcmFtZV9yYXRlX2NsYXNzLCBmcmFtZV9yYXRlX2Rldi0+ZGV2X25vKTsKK2Vycl8yOgorCWNsYXNzX3VucmVnaXN0ZXIoJmZyYW1lX3JhdGVfY2xhc3MpOworZXJyXzM6CisJY2Rldl9kZWwoJmZyYW1lX3JhdGVfZGV2LT5jZGV2KTsKK2Vycl80OgorCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihmcmFtZV9yYXRlX2Rldi0+ZGV2X25vLCAxKTsKKwlrZnJlZShmcmFtZV9yYXRlX2Rldik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZnJhbWVfcmF0ZV9kcml2ZXJfZXhpdCh2b2lkKQoreworCWRldmljZV9kZXN0cm95KCZmcmFtZV9yYXRlX2NsYXNzLCBmcmFtZV9yYXRlX2Rldi0+ZGV2X25vKTsKKwljbGFzc191bnJlZ2lzdGVyKCZmcmFtZV9yYXRlX2NsYXNzKTsKKwljZGV2X2RlbCgmZnJhbWVfcmF0ZV9kZXYtPmNkZXYpOworCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihmcmFtZV9yYXRlX2Rldi0+ZGV2X25vLCAxKTsKKwlrZnJlZShmcmFtZV9yYXRlX2Rldik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGZyYW1lX3JhdGVfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gLTE7CisKKwlyZXQgPSBmcmFtZV9yYXRlX2RyaXZlcl9pbml0KCk7CisJaWYgKHJldCkgeworCQlwcl9pbmZvKCJFcnJvciAlZCBmcmFtZV9yYXRlX21vZHVsZV9pbml0IGluaXQgZmFpbC5cbiIsIHJldCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmcmFtZV9yYXRlX21vZHVsZV9leGl0KHZvaWQpCit7CisJZnJhbWVfcmF0ZV9kcml2ZXJfZXhpdCgpOworCXByX2luZm8oImZyYW1lX3JhdGVfbW9kdWxlX2V4aXRcbiIpOworfQorCittb2R1bGVfaW5pdChmcmFtZV9yYXRlX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KGZyYW1lX3JhdGVfbW9kdWxlX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCI8c2hpbG9uZy55YW5nQGFtbG9naWMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJmcmFtZXJhdGUgYWRhcHRlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcmFtZXJhdGVfYWRhcHRlci92aWRlb19mcmFtZXJhdGVfYWRhcHRlci5oIGIvZHJpdmVycy9mcmFtZXJhdGVfYWRhcHRlci92aWRlb19mcmFtZXJhdGVfYWRhcHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NDg4NDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZyYW1lcmF0ZV9hZGFwdGVyL3ZpZGVvX2ZyYW1lcmF0ZV9hZGFwdGVyLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIGRyaXZlcnMvZnJhbWVyYXRlX2FkYXB0ZXIvdmlkZW9fZnJhbWVyYXRlX2FkYXBlci5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorKi8KKworI2lmbmRlZiBWSURFT0ZSQU1FUkFURUFEQVBURVJfSAorI2RlZmluZSBWSURFT0ZSQU1FUkFURUFEQVBURVJfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorCisKK3N0cnVjdCBmcmFtZV9yYXRlX2Rldl9zICB7CisJc3RydWN0IGNkZXYgY2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJZGV2X3QgZGV2X25vOworfTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5jbHVkZS9kdW1teS1mb3ItZ2l0LWVtcHR5LWRpciBiL2RyaXZlcnMvaW5jbHVkZS9kdW1teS1mb3ItZ2l0LWVtcHR5LWRpcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbmNsdWRlL2R1bW15LWZvci1naXQtZW1wdHktZGlyCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhX3N5bmMvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhX3N5bmMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VkNWI4MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWFfc3luYy9NYWtlZmlsZQpAQCAtMCwwICsxLDQgQEAKK29iai1tCSs9CSBtZWRpYV9zeW5jLm8KKworbWVkaWFfc3luYy1vYmpzCSs9CW1lZGlhX3N5bmNfZGV2Lm8KK21lZGlhX3N5bmMtb2JqcwkrPQltZWRpYV9zeW5jX2NvcmUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYV9zeW5jL21lZGlhX3N5bmNfY29yZS5jIGIvZHJpdmVycy9tZWRpYV9zeW5jL21lZGlhX3N5bmNfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYzAxNmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhX3N5bmMvbWVkaWFfc3luY19jb3JlLmMKQEAgLTAsMCArMSwxMjU2IEBACisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9jcHVfdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvdGltZTY0Lmg+CisjaW5jbHVkZSAibWVkaWFfc3luY19jb3JlLmgiCisKKyNkZWZpbmUgTUFYX0lOU1RBTkNFX05VTSAxMAorbWVkaWFzeW5jX2lucyogdk1lZGlhU3luY0luc0xpc3RbTUFYX0lOU1RBTkNFX05VTV0gPSB7MH07Cit1NjQgbGFzdF9zeXN0ZW07Cit1NjQgbGFzdF9wY3I7Cit0eXBlZGVmIGludCAoKnBmdW5fYW1sZGVtdXhfcGNyc2NyX2dldCkoaW50IGRlbXV4X2RldmljZV9pbmRleCwgaW50IGluZGV4LAorCQkJCQl1NjQgKnN0Yyk7CitzdGF0aWMgcGZ1bl9hbWxkZW11eF9wY3JzY3JfZ2V0IGFtbGRlbXV4X3BjcnNjcl9nZXQgPSBOVUxMOworLy9leHRlcm4gaW50IGRlbXV4X2dldF9zdGMoaW50IGRlbXV4X2RldmljZV9pbmRleCwgaW50IGluZGV4LAorLy8gICAgICAgICAgICAgICAgICB1NjQgKnN0YywgdW5zaWduZWQgaW50ICpiYXNlKTsKK2V4dGVybiBpbnQgZGVtdXhfZ2V0X3BjcihpbnQgZGVtdXhfZGV2aWNlX2luZGV4LCBpbnQgaW5kZXgsIHU2NCAqcGNyKTsKKworc3RhdGljIHU2NCBnZXRfbGxhYnMoczY0IHZhbHVlKXsKKwl1NjQgbGx2YWx1ZTsKKwlpZiAodmFsdWUgPiAwKSB7CisJCXJldHVybiB2YWx1ZTsKKwl9IGVsc2UgeworCQlsbHZhbHVlID0gKHU2NCkoMC12YWx1ZSk7CisJCXJldHVybiBsbHZhbHVlOworCX0KK30KKworc3RhdGljIHU2NCBnZXRfc3RjX3RpbWVfdXMoczMyIHNTeW5jSW5zSWQpCit7CisgICAgLyptZWRpYXN5bmNfaW5zKiBwSW5zdGFuY2UgPSBOVUxMOworCXU2NCBzdGM7CisJdW5zaWduZWQgaW50IGJhc2U7CisgICAgICBzMzIgaW5kZXggPSBzU3luY0luc0lkOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTUFYX0lOU1RBTkNFX05VTSkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlID0gdk1lZGlhU3luY0luc0xpc3RbaW5kZXhdOworCWRlbXV4X2dldF9zdGMocEluc3RhbmNlLT5tRGVtdXhJZCwgMCwgJnN0YywgJmJhc2UpOyovCisJbWVkaWFzeW5jX2lucyogcEluc3RhbmNlID0gTlVMTDsKKwlpbnQgcmV0ID0gLTE7CisJdTY0IHN0YzsKKwl1NjQgdGltZXVzOworCXU2NCBwY3I7CisJczY0IHBjcl9kaWZmOworCXM2NCB0aW1lX2RpZmY7CisJczMyIGluZGV4ID0gc1N5bmNJbnNJZDsKKwlzdHJ1Y3QgdGltZXNwZWM2NCB0c19tb25vdG9uaWM7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBNQVhfSU5TVEFOQ0VfTlVNKQorCQlyZXR1cm4gLTE7CisJcEluc3RhbmNlID0gdk1lZGlhU3luY0luc0xpc3RbaW5kZXhdOworCWlmIChwSW5zdGFuY2UtPm1TeW5jTW9kZSAhPSBNRURJQV9TWU5DX1BDUk1BU1RFUikKKwkJcmV0dXJuIDA7CisJaWYgKCFhbWxkZW11eF9wY3JzY3JfZ2V0KQorCQlhbWxkZW11eF9wY3JzY3JfZ2V0ID0gc3ltYm9sX3JlcXVlc3QoZGVtdXhfZ2V0X3Bjcik7CisJaWYgKCFhbWxkZW11eF9wY3JzY3JfZ2V0KQorCQlyZXR1cm4gMDsKKwlrdGltZV9nZXRfdHM2NCgmdHNfbW9ub3RvbmljKTsKKwl0aW1ldXMgPSB0c19tb25vdG9uaWMudHZfc2VjICogMTAwMDAwMExMICsgZGl2X3U2NCh0c19tb25vdG9uaWMudHZfbnNlYyAsIDEwMDApOworCWlmIChwSW5zdGFuY2UtPm1EZW11eElkIDwgMCkKKwkJcmV0dXJuIHRpbWV1czsKKworCisJcmV0ID0gYW1sZGVtdXhfcGNyc2NyX2dldChwSW5zdGFuY2UtPm1EZW11eElkLCAwLCAmcGNyKTsKKworCWlmIChyZXQgIT0gMCkgeworCQlzdGMgPSB0aW1ldXM7CisJfSBlbHNlIHsKKwkJaWYgKGxhc3RfcGNyID09IDApIHsKKwkJCXN0YyA9IHRpbWV1czsKKwkJCWxhc3RfcGNyID0gZGl2X3U2NChwY3IgKiAxMDAgLCA5KTsKKwkJCWxhc3Rfc3lzdGVtID0gdGltZXVzOworCQl9IGVsc2UgeworCQkJcGNyX2RpZmYgPSBkaXZfdTY0KHBjciAqIDEwMCAsIDkpIC0gbGFzdF9wY3I7CisJCQl0aW1lX2RpZmYgPSB0aW1ldXMgLSBsYXN0X3N5c3RlbTsKKwkJCWlmICh0aW1lX2RpZmYgJiYgKGRpdl91NjQoZ2V0X2xsYWJzKHBjcl9kaWZmKSAsIChzMzIpdGltZV9kaWZmKQorCQkJCQkgICAgPiAxMDApKSB7CisJCQkJbGFzdF9wY3IgPSBkaXZfdTY0KHBjciAqIDEwMCAsIDkpOworCQkJCWxhc3Rfc3lzdGVtID0gdGltZXVzOworCQkJCXN0YyA9IHRpbWV1czsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHRpbWVfZGlmZikKKwkJCQkJc3RjID0gbGFzdF9zeXN0ZW0gKyBwY3JfZGlmZjsKKwkJCQllbHNlCisJCQkJCXN0YyA9IHRpbWV1czsKKworCQkJCWxhc3RfcGNyID0gZGl2X3U2NChwY3IgKiAxMDAgLCA5KTsKKwkJCQlsYXN0X3N5c3RlbSA9IHN0YzsKKwkJCX0KKwkJfQorCX0KKwlwcl9kZWJ1ZygiZ2V0X3N0Y190aW1lX3VzIHN0YzolbGxkIHBjcjolbGxkIHN5c3RlbV90aW1lOiVsbGRcbiIsIHN0YywgIGRpdl91NjQocGNyICogMTAwICwgOSksICB0aW1ldXMpOworCXJldHVybiBzdGM7Cit9CisKK3N0YXRpYyBzNjQgZ2V0X3N5c3RlbV90aW1lX3VzKHZvaWQpIHsKKwlzNjQgVGltZVVzOworCXN0cnVjdCB0aW1lc3BlYzY0IHRzX21vbm90b25pYzsKKwlrdGltZV9nZXRfdHM2NCgmdHNfbW9ub3RvbmljKTsKKwlUaW1lVXMgPSB0c19tb25vdG9uaWMudHZfc2VjICogMTAwMDAwMExMICsgZGl2X3U2NCh0c19tb25vdG9uaWMudHZfbnNlYyAsIDEwMDApOworCXByX2RlYnVnKCJnZXRfc3lzdGVtX3RpbWVfdXMgJWxsZFxuIiwgVGltZVVzKTsKKwlyZXR1cm4gVGltZVVzOworfQorCitsb25nIG1lZGlhc3luY19pbnNfYWxsb2MoczMyIHNEZW11eElkLAorCQkJczMyIHNQY3JQaWQsCisJCQlzMzIgKnNTeW5jSW5zSWQsCisJCQltZWRpYXN5bmNfaW5zICoqcElucyl7CisJczMyIGluZGV4ID0gMDsKKwltZWRpYXN5bmNfaW5zKiBwSW5zdGFuY2UgPSBOVUxMOworCXBJbnN0YW5jZSA9IGt6YWxsb2Moc2l6ZW9mKG1lZGlhc3luY19pbnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAocEluc3RhbmNlID09IE5VTEwpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWF9JTlNUQU5DRV9OVU0gLSAxOyBpbmRleCsrKSB7CisJCWlmICh2TWVkaWFTeW5jSW5zTGlzdFtpbmRleF0gPT0gTlVMTCkgeworCQkJdk1lZGlhU3luY0luc0xpc3RbaW5kZXhdID0gcEluc3RhbmNlOworCQkJcEluc3RhbmNlLT5tU3luY0luc0lkID0gaW5kZXg7CisJCQkqc1N5bmNJbnNJZCA9IGluZGV4OworCQkJcHJfaW5mbygibWVkaWFzeW5jX2luc19hbGxvYyBpbmRleDolZFxuIiwgaW5kZXgpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaW5kZXggPT0gTUFYX0lOU1RBTkNFX05VTSkgeworCQlremZyZWUocEluc3RhbmNlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXBJbnN0YW5jZS0+bURlbXV4SWQgPSBzRGVtdXhJZDsKKwlwSW5zdGFuY2UtPm1QY3JQaWQgPSBzUGNyUGlkOworCW1lZGlhc3luY19pbnNfaW5pdF9zeW5jaW5mbyhwSW5zdGFuY2UtPm1TeW5jSW5zSWQpOworCXBJbnN0YW5jZS0+bUhhc0F1ZGlvID0gLTE7CisJcEluc3RhbmNlLT5tSGFzVmlkZW8gPSAtMTsKKwlwSW5zdGFuY2UtPm1WaWRlb1dvcmtNb2RlID0gMDsKKwlwSW5zdGFuY2UtPm1GY2NFbmFibGUgPSAwOworCXBJbnN0YW5jZS0+bVNvdXJjZUNsb2NrVHlwZSA9IFVOS05PV05fQ0xPQ0s7CisJcEluc3RhbmNlLT5tU3luY0luZm8uc3RhdGUgPSBNRURJQVNZTkNfSU5JVDsKKwlwSW5zdGFuY2UtPm1Tb3VyY2VDbG9ja1N0YXRlID0gQ0xPQ0tfUFJPVklERVJfTk9STUFMOworCXBJbnN0YW5jZS0+bXV0ZV9mbGFnID0gZmFsc2U7CisJcEluc3RhbmNlLT5tU291cmNlVHlwZSA9IFRTX0RFTU9EOworCXBJbnN0YW5jZS0+bVVwZGF0ZVRpbWVUaHJlc2hvbGQgPSBNSU5fVVBEQVRFVElNRV9USFJFU0hPTERfVVM7CisJKnBJbnMgPSBwSW5zdGFuY2U7CisJcmV0dXJuIDA7Cit9CisKKworbG9uZyBtZWRpYXN5bmNfaW5zX2RlbGV0ZShzMzIgc1N5bmNJbnNJZCkgeworCW1lZGlhc3luY19pbnMqIHBJbnN0YW5jZSA9IE5VTEw7CisJczMyIGluZGV4ID0gc1N5bmNJbnNJZDsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9JTlNUQU5DRV9OVU0pCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZSA9IHZNZWRpYVN5bmNJbnNMaXN0W2luZGV4XTsKKwlpZiAocEluc3RhbmNlID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWt6ZnJlZShwSW5zdGFuY2UpOworCXZNZWRpYVN5bmNJbnNMaXN0W2luZGV4XSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK2xvbmcgbWVkaWFzeW5jX2luc19iaW5kZXIoczMyIHNTeW5jSW5zSWQsCisJCQltZWRpYXN5bmNfaW5zICoqcElucykgeworCW1lZGlhc3luY19pbnMqIHBJbnN0YW5jZSA9IE5VTEw7CisJczMyIGluZGV4ID0gc1N5bmNJbnNJZDsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9JTlNUQU5DRV9OVU0pCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZSA9IHZNZWRpYVN5bmNJbnNMaXN0W2luZGV4XTsKKwlpZiAocEluc3RhbmNlID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZS0+bVJlZisrOworCSpwSW5zID0gcEluc3RhbmNlOworCXJldHVybiAwOworfQorCitsb25nIG1lZGlhc3luY19pbnNfdW5iaW5kZXIoczMyIHNTeW5jSW5zSWQpIHsKKwltZWRpYXN5bmNfaW5zKiBwSW5zdGFuY2UgPSBOVUxMOworCXMzMiBpbmRleCA9IHNTeW5jSW5zSWQ7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBNQVhfSU5TVEFOQ0VfTlVNKQorCQlyZXR1cm4gLTE7CisKKwlwSW5zdGFuY2UgPSB2TWVkaWFTeW5jSW5zTGlzdFtpbmRleF07CisJaWYgKHBJbnN0YW5jZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlwSW5zdGFuY2UtPm1SZWYtLTsKKworCWlmIChwSW5zdGFuY2UtPm1SZWYgPD0gMCkKKwkJbWVkaWFzeW5jX2luc19kZWxldGUoc1N5bmNJbnNJZCk7CisKKwlyZXR1cm4gMDsKK30KKworbG9uZyBtZWRpYXN5bmNfaW5zX2luaXRfc3luY2luZm8oczMyIHNTeW5jSW5zSWQpIHsKKwltZWRpYXN5bmNfaW5zKiBwSW5zdGFuY2UgPSBOVUxMOworCXMzMiBpbmRleCA9IHNTeW5jSW5zSWQ7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBNQVhfSU5TVEFOQ0VfTlVNKQorCQlyZXR1cm4gLTE7CisKKwlwSW5zdGFuY2UgPSB2TWVkaWFTeW5jSW5zTGlzdFtpbmRleF07CisJaWYgKHBJbnN0YW5jZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlwSW5zdGFuY2UtPm1TeW5jSW5mby5zdGF0ZSA9IE1FRElBU1lOQ19JTklUOworCXBJbnN0YW5jZS0+bVN5bmNJbmZvLmZpcnN0QWZyYW1lSW5mby5mcmFtZVB0cyA9IC0xOworCXBJbnN0YW5jZS0+bVN5bmNJbmZvLmZpcnN0QWZyYW1lSW5mby5mcmFtZVN5c3RlbVRpbWUgPSAtMTsKKwlwSW5zdGFuY2UtPm1TeW5jSW5mby5maXJzdFZmcmFtZUluZm8uZnJhbWVQdHMgPSAtMTsKKwlwSW5zdGFuY2UtPm1TeW5jSW5mby5maXJzdFZmcmFtZUluZm8uZnJhbWVTeXN0ZW1UaW1lID0gLTE7CisJcEluc3RhbmNlLT5tU3luY0luZm8uZmlyc3REbXhQY3JJbmZvLmZyYW1lUHRzID0gLTE7CisJcEluc3RhbmNlLT5tU3luY0luZm8uZmlyc3REbXhQY3JJbmZvLmZyYW1lU3lzdGVtVGltZSA9IC0xOworCXBJbnN0YW5jZS0+bVN5bmNJbmZvLnJlZkNsb2NrSW5mby5mcmFtZVB0cyA9IC0xOworCXBJbnN0YW5jZS0+bVN5bmNJbmZvLnJlZkNsb2NrSW5mby5mcmFtZVN5c3RlbVRpbWUgPSAtMTsKKwlwSW5zdGFuY2UtPm1TeW5jSW5mby5jdXJBdWRpb0luZm8uZnJhbWVQdHMgPSAtMTsKKwlwSW5zdGFuY2UtPm1TeW5jSW5mby5jdXJBdWRpb0luZm8uZnJhbWVTeXN0ZW1UaW1lID0gLTE7CisJcEluc3RhbmNlLT5tU3luY0luZm8uY3VyVmlkZW9JbmZvLmZyYW1lUHRzID0gLTE7CisJcEluc3RhbmNlLT5tU3luY0luZm8uY3VyVmlkZW9JbmZvLmZyYW1lU3lzdGVtVGltZSA9IC0xOworCXBJbnN0YW5jZS0+bVN5bmNJbmZvLmN1ckRteFBjckluZm8uZnJhbWVQdHMgPSAtMTsKKwlwSW5zdGFuY2UtPm1TeW5jSW5mby5jdXJEbXhQY3JJbmZvLmZyYW1lU3lzdGVtVGltZSA9IC0xOworCXBJbnN0YW5jZS0+bUF1ZGlvSW5mby5jYWNoZVNpemUgPSAtMTsKKwlwSW5zdGFuY2UtPm1BdWRpb0luZm8uY2FjaGVEdXJhdGlvbiA9IC0xOworCXBJbnN0YW5jZS0+bVZpZGVvSW5mby5jYWNoZVNpemUgPSAtMTsKKwlwSW5zdGFuY2UtPm1WaWRlb0luZm8uY2FjaGVEdXJhdGlvbiA9IC0xOworCXBJbnN0YW5jZS0+bVBhdXNlUmVzdW1lRmxhZyA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworbG9uZyBtZWRpYXN5bmNfaW5zX3VwZGF0ZV9tZWRpYXRpbWUoczMyIHNTeW5jSW5zSWQsCisJCQkJczY0IGxNZWRpYVRpbWUsCisJCQkJczY0IGxTeXN0ZW1UaW1lLCBib29sIGZvcmNlVXBkYXRlKSB7CisJbWVkaWFzeW5jX2lucyogcEluc3RhbmNlID0gTlVMTDsKKwl1NjQgY3VycmVudF9zdGMgPSAwOworCXM2NCBjdXJyZW50X3N5c3RlbXRpbWUgPSAwOworCXM2NCBkaWZmX3N5c3RlbV90aW1lID0gMDsKKwlzNjQgZGlmZl9tZWRpYXRpbWUgPSAwOworCXMzMiBpbmRleCA9IHNTeW5jSW5zSWQ7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBNQVhfSU5TVEFOQ0VfTlVNKQorCQlyZXR1cm4gLTE7CisKKwlwSW5zdGFuY2UgPSB2TWVkaWFTeW5jSW5zTGlzdFtpbmRleF07CisJaWYgKHBJbnN0YW5jZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwljdXJyZW50X3N0YyA9IGdldF9zdGNfdGltZV91cyhzU3luY0luc0lkKTsKKwljdXJyZW50X3N5c3RlbXRpbWUgPSBnZXRfc3lzdGVtX3RpbWVfdXMoKTsKKyNpZiAwCisJcEluc3RhbmNlLT5tU3luY01vZGUgPSBNRURJQV9TWU5DX1BDUk1BU1RFUjsKKyNlbmRpZgorCWlmIChwSW5zdGFuY2UtPm1TeW5jTW9kZSA9PSBNRURJQV9TWU5DX1BDUk1BU1RFUikgeworCQlpZiAobFN5c3RlbVRpbWUgPT0gMCkgeworCQkJaWYgKGN1cnJlbnRfc3RjICE9IDApIHsKKwkJCQlkaWZmX3N5c3RlbV90aW1lID0gY3VycmVudF9zdGMgLSBwSW5zdGFuY2UtPm1MYXN0U3RjOworCQkJCWRpZmZfbWVkaWF0aW1lID0gbE1lZGlhVGltZSAtIHBJbnN0YW5jZS0+bUxhc3RNZWRpYVRpbWU7CisJCQl9IGVsc2UgeworCQkJCWRpZmZfc3lzdGVtX3RpbWUgPSBjdXJyZW50X3N5c3RlbXRpbWUgLSBwSW5zdGFuY2UtPm1MYXN0UmVhbFRpbWU7CisJCQkJZGlmZl9tZWRpYXRpbWUgPSBsTWVkaWFUaW1lIC0gcEluc3RhbmNlLT5tTGFzdE1lZGlhVGltZTsKKwkJCX0KKwkJCWlmIChwSW5zdGFuY2UtPm1TeW5jTW9kZUNoYW5nZSA9PSAxCisJCQkJfHwgZGlmZl9tZWRpYXRpbWUgPCAwCisJCQkJfHwgKChkaWZmX21lZGlhdGltZSA+IDApCisJCQkJJiYgKGdldF9sbGFicyhkaWZmX3N5c3RlbV90aW1lIC0gZGlmZl9tZWRpYXRpbWUpID4gcEluc3RhbmNlLT5tVXBkYXRlVGltZVRocmVzaG9sZCkpKSB7CisJCQkJcHJfaW5mbygiTUVESUFfU1lOQ19QQ1JNQVNURVIgdXBkYXRlIHRpbWVcbiIpOworCQkJCXBJbnN0YW5jZS0+bUxhc3RNZWRpYVRpbWUgPSBsTWVkaWFUaW1lOworCQkJCXBJbnN0YW5jZS0+bUxhc3RSZWFsVGltZSA9IGN1cnJlbnRfc3lzdGVtdGltZTsKKwkJCQlwSW5zdGFuY2UtPm1MYXN0U3RjID0gY3VycmVudF9zdGM7CisJCQkJcEluc3RhbmNlLT5tU3luY01vZGVDaGFuZ2UgPSAwOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGN1cnJlbnRfc3RjICE9IDApIHsKKwkJCQlkaWZmX3N5c3RlbV90aW1lID0gbFN5c3RlbVRpbWUgLSBwSW5zdGFuY2UtPm1MYXN0UmVhbFRpbWU7CisJCQkJZGlmZl9tZWRpYXRpbWUgPSBsTWVkaWFUaW1lIC0gcEluc3RhbmNlLT5tTGFzdE1lZGlhVGltZTsKKwkJCX0gZWxzZSB7CisJCQkJZGlmZl9zeXN0ZW1fdGltZSA9IGxTeXN0ZW1UaW1lIC0gcEluc3RhbmNlLT5tTGFzdFJlYWxUaW1lOworCQkJCWRpZmZfbWVkaWF0aW1lID0gbE1lZGlhVGltZSAtIHBJbnN0YW5jZS0+bUxhc3RNZWRpYVRpbWU7CisJCQl9CisKKwkJCWlmIChwSW5zdGFuY2UtPm1TeW5jTW9kZUNoYW5nZSA9PSAxCisJCQkJfHwgZGlmZl9tZWRpYXRpbWUgPCAwCisJCQkJfHwgKChkaWZmX21lZGlhdGltZSA+IDApCisJCQkJJiYgKGdldF9sbGFicyhkaWZmX3N5c3RlbV90aW1lIC0gZGlmZl9tZWRpYXRpbWUpID4gcEluc3RhbmNlLT5tVXBkYXRlVGltZVRocmVzaG9sZCkpKSB7CisJCQkJcEluc3RhbmNlLT5tTGFzdE1lZGlhVGltZSA9IGxNZWRpYVRpbWU7CisJCQkJcEluc3RhbmNlLT5tTGFzdFJlYWxUaW1lID0gbFN5c3RlbVRpbWU7CisJCQkJcEluc3RhbmNlLT5tTGFzdFN0YyA9IGN1cnJlbnRfc3RjICsgbFN5c3RlbVRpbWUgLSBjdXJyZW50X3N5c3RlbXRpbWU7CisJCQkJcEluc3RhbmNlLT5tU3luY01vZGVDaGFuZ2UgPSAwOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWYgKGxTeXN0ZW1UaW1lID09IDApIHsKKwkJCWRpZmZfc3lzdGVtX3RpbWUgPSBjdXJyZW50X3N5c3RlbXRpbWUgLSBwSW5zdGFuY2UtPm1MYXN0UmVhbFRpbWU7CisJCQlkaWZmX21lZGlhdGltZSA9IGxNZWRpYVRpbWUgLSBwSW5zdGFuY2UtPm1MYXN0TWVkaWFUaW1lOworCisJCQlpZiAocEluc3RhbmNlLT5tU3luY01vZGVDaGFuZ2UgPT0gMQorCQkJCXx8IGZvcmNlVXBkYXRlCisJCQkJfHwgZGlmZl9tZWRpYXRpbWUgPCAwCisJCQkJfHwgKChkaWZmX21lZGlhdGltZSA+IDApCisJCQkJJiYgKGdldF9sbGFicyhkaWZmX3N5c3RlbV90aW1lIC0gZGlmZl9tZWRpYXRpbWUpID4gcEluc3RhbmNlLT5tVXBkYXRlVGltZVRocmVzaG9sZCkpKSB7CisJCQkJcHJfaW5mbygibVN5bmNNb2RlOiVkIHVwZGF0ZSB0aW1lIHN5c3RlbSBkaWZmOiVsbGQgbWVkaWEgZGlmZjolbGxkIGN1cnJlbnQ6JWxsZFxuIiwKKwkJCQkJcEluc3RhbmNlLT5tU3luY01vZGUsCisJCQkJCWRpZmZfc3lzdGVtX3RpbWUsCisJCQkJCWRpZmZfbWVkaWF0aW1lLAorCQkJCQljdXJyZW50X3N5c3RlbXRpbWUpOworCQkJCXBJbnN0YW5jZS0+bUxhc3RNZWRpYVRpbWUgPSBsTWVkaWFUaW1lOworCQkJCXBJbnN0YW5jZS0+bUxhc3RSZWFsVGltZSA9IGN1cnJlbnRfc3lzdGVtdGltZTsKKwkJCQlwSW5zdGFuY2UtPm1MYXN0U3RjID0gY3VycmVudF9zdGM7CisJCQkJcEluc3RhbmNlLT5tU3luY01vZGVDaGFuZ2UgPSAwOworCQkJfQorCX0gZWxzZSB7CisJCQlkaWZmX3N5c3RlbV90aW1lID0gbFN5c3RlbVRpbWUgLSBwSW5zdGFuY2UtPm1MYXN0UmVhbFRpbWU7CisJCQlkaWZmX21lZGlhdGltZSA9IGxNZWRpYVRpbWUgLSBwSW5zdGFuY2UtPm1MYXN0TWVkaWFUaW1lOworCQkJaWYgKHBJbnN0YW5jZS0+bVN5bmNNb2RlQ2hhbmdlID09IDEKKwkJCQl8fCBmb3JjZVVwZGF0ZQorCQkJCXx8IGRpZmZfbWVkaWF0aW1lIDwgMAorCQkJCXx8ICgoZGlmZl9tZWRpYXRpbWUgPiAwKQorCQkJCSYmIChnZXRfbGxhYnMoZGlmZl9zeXN0ZW1fdGltZSAtIGRpZmZfbWVkaWF0aW1lKSA+IHBJbnN0YW5jZS0+bVVwZGF0ZVRpbWVUaHJlc2hvbGQpKSkgeworCQkJCXByX2luZm8oIm1TeW5jTW9kZTolZCB1cGRhdGUgdGltZSBzdGMgZGlmZjolbGxkIG1lZGlhIGRpZmY6JWxsZCBsU3lzdGVtVGltZTolbGxkIGxNZWRpYVRpbWU6JWxsZFxuIiwKKwkJCQkJcEluc3RhbmNlLT5tU3luY01vZGUsCisJCQkJCWRpZmZfc3lzdGVtX3RpbWUsCisJCQkJCWRpZmZfbWVkaWF0aW1lLAorCQkJCQlsU3lzdGVtVGltZSwKKwkJCQkJbE1lZGlhVGltZSk7CisJCQkJcEluc3RhbmNlLT5tTGFzdE1lZGlhVGltZSA9IGxNZWRpYVRpbWU7CisJCQkJcEluc3RhbmNlLT5tTGFzdFJlYWxUaW1lID0gbFN5c3RlbVRpbWU7CisJCQkJcEluc3RhbmNlLT5tTGFzdFN0YyA9IGN1cnJlbnRfc3RjICsgbFN5c3RlbVRpbWUgLSBjdXJyZW50X3N5c3RlbXRpbWU7CisJCQkJcEluc3RhbmNlLT5tU3luY01vZGVDaGFuZ2UgPSAwOworCQkJfQorCQl9CisJfQorCXBJbnN0YW5jZS0+bVRyYWNrTWVkaWFUaW1lID0gbE1lZGlhVGltZTsKKwlyZXR1cm4gMDsKK30KKworbG9uZyBtZWRpYXN5bmNfaW5zX3NldF9tZWRpYXRpbWVfc3BlZWQoczMyIHNTeW5jSW5zSWQsCisJCQkJCW1lZGlhc3luY19zcGVlZCBmU3BlZWQpIHsKKwltZWRpYXN5bmNfaW5zKiBwSW5zdGFuY2UgPSBOVUxMOworCXMzMiBpbmRleCA9IHNTeW5jSW5zSWQ7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBNQVhfSU5TVEFOQ0VfTlVNKQorCQlyZXR1cm4gLTE7CisKKwlwSW5zdGFuY2UgPSB2TWVkaWFTeW5jSW5zTGlzdFtpbmRleF07CisJaWYgKHBJbnN0YW5jZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlwSW5zdGFuY2UtPm1TcGVlZC5tTnVtZXJhdG9yID0gZlNwZWVkLm1OdW1lcmF0b3I7CisJcEluc3RhbmNlLT5tU3BlZWQubURlbm9taW5hdG9yID0gZlNwZWVkLm1EZW5vbWluYXRvcjsKKwlyZXR1cm4gMDsKK30KKworbG9uZyBtZWRpYXN5bmNfaW5zX3NldF9wYXVzZWQoczMyIHNTeW5jSW5zSWQsIHMzMiBzUGF1c2VkKSB7CisKKwltZWRpYXN5bmNfaW5zKiBwSW5zdGFuY2UgPSBOVUxMOworCXU2NCBjdXJyZW50X3N0YyA9IDA7CisJczY0IGN1cnJlbnRfc3lzdGVtdGltZSA9IDA7CisJczMyIGluZGV4ID0gc1N5bmNJbnNJZDsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9JTlNUQU5DRV9OVU0pCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZSA9IHZNZWRpYVN5bmNJbnNMaXN0W2luZGV4XTsKKwlpZiAocEluc3RhbmNlID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChzUGF1c2VkICE9IDAgJiYgc1BhdXNlZCAhPSAxKQorCQlyZXR1cm4gLTE7CisJaWYgKHNQYXVzZWQgPT0gcEluc3RhbmNlLT5tUGF1c2VkKQorCQlyZXR1cm4gMDsKKworCWN1cnJlbnRfc3RjID0gZ2V0X3N0Y190aW1lX3VzKHNTeW5jSW5zSWQpOworCWN1cnJlbnRfc3lzdGVtdGltZSA9IGdldF9zeXN0ZW1fdGltZV91cygpOworCisJcEluc3RhbmNlLT5tUGF1c2VkID0gc1BhdXNlZDsKKworCWlmIChwSW5zdGFuY2UtPm1TeW5jTW9kZSA9PSBNRURJQV9TWU5DX0FNQVNURVIpCisJCXBJbnN0YW5jZS0+bUxhc3RNZWRpYVRpbWUgPSBwSW5zdGFuY2UtPm1MYXN0TWVkaWFUaW1lICsKKwkJKGN1cnJlbnRfc3lzdGVtdGltZSAtIHBJbnN0YW5jZS0+bUxhc3RSZWFsVGltZSk7CisKKwlwSW5zdGFuY2UtPm1MYXN0UmVhbFRpbWUgPSBjdXJyZW50X3N5c3RlbXRpbWU7CisJcEluc3RhbmNlLT5tTGFzdFN0YyA9IGN1cnJlbnRfc3RjOworCisJcmV0dXJuIDA7Cit9CisKK2xvbmcgbWVkaWFzeW5jX2luc19nZXRfcGF1c2VkKHMzMiBzU3luY0luc0lkLCBzMzIqIHNwUGF1c2VkKSB7CisKKwltZWRpYXN5bmNfaW5zKiBwSW5zdGFuY2UgPSBOVUxMOworCXMzMiBpbmRleCA9IHNTeW5jSW5zSWQ7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBNQVhfSU5TVEFOQ0VfTlVNKQorCQlyZXR1cm4gLTE7CisKKwlwSW5zdGFuY2UgPSB2TWVkaWFTeW5jSW5zTGlzdFtpbmRleF07CisJaWYgKHBJbnN0YW5jZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJKnNwUGF1c2VkID0gcEluc3RhbmNlLT5tUGF1c2VkIDsKKwlyZXR1cm4gMDsKK30KKworbG9uZyBtZWRpYXN5bmNfaW5zX3NldF9zeW5jbW9kZShzMzIgc1N5bmNJbnNJZCwgczMyIHNTeW5jTW9kZSl7CisJbWVkaWFzeW5jX2lucyogcEluc3RhbmNlID0gTlVMTDsKKwlzMzIgaW5kZXggPSBzU3luY0luc0lkOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTUFYX0lOU1RBTkNFX05VTSkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlID0gdk1lZGlhU3luY0luc0xpc3RbaW5kZXhdOworCWlmIChwSW5zdGFuY2UgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlLT5tU3luY01vZGUgPSBzU3luY01vZGU7CisJcEluc3RhbmNlLT5tU3luY01vZGVDaGFuZ2UgPSAxOworCXJldHVybiAwOworfQorCitsb25nIG1lZGlhc3luY19pbnNfZ2V0X3N5bmNtb2RlKHMzMiBzU3luY0luc0lkLCBzMzIgKnNTeW5jTW9kZSkgeworCW1lZGlhc3luY19pbnMqIHBJbnN0YW5jZSA9IE5VTEw7CisJczMyIGluZGV4ID0gc1N5bmNJbnNJZDsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9JTlNUQU5DRV9OVU0pCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZSA9IHZNZWRpYVN5bmNJbnNMaXN0W2luZGV4XTsKKwlpZiAocEluc3RhbmNlID09IE5VTEwpCisJCXJldHVybiAtMTsKKwkqc1N5bmNNb2RlID0gcEluc3RhbmNlLT5tU3luY01vZGU7CisJcmV0dXJuIDA7Cit9CisKK2xvbmcgbWVkaWFzeW5jX2luc19nZXRfbWVkaWF0aW1lX3NwZWVkKHMzMiBzU3luY0luc0lkLCBtZWRpYXN5bmNfc3BlZWQgKmZwU3BlZWQpIHsKKwltZWRpYXN5bmNfaW5zKiBwSW5zdGFuY2UgPSBOVUxMOworCXMzMiBpbmRleCA9IHNTeW5jSW5zSWQ7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBNQVhfSU5TVEFOQ0VfTlVNKQorCQlyZXR1cm4gLTE7CisKKwlwSW5zdGFuY2UgPSB2TWVkaWFTeW5jSW5zTGlzdFtpbmRleF07CisJaWYgKHBJbnN0YW5jZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJZnBTcGVlZC0+bU51bWVyYXRvciA9IHBJbnN0YW5jZS0+bVNwZWVkLm1OdW1lcmF0b3I7CisJZnBTcGVlZC0+bURlbm9taW5hdG9yID0gcEluc3RhbmNlLT5tU3BlZWQubURlbm9taW5hdG9yOworCXJldHVybiAwOworfQorCitsb25nIG1lZGlhc3luY19pbnNfZ2V0X2FuY2hvcl90aW1lKHMzMiBzU3luY0luc0lkLAorCQkJCXM2NCogbHBNZWRpYVRpbWUsCisJCQkJczY0KiBscFNUQ1RpbWUsCisJCQkJczY0KiBscFN5c3RlbVRpbWUpIHsKKwltZWRpYXN5bmNfaW5zKiBwSW5zdGFuY2UgPSBOVUxMOworCXMzMiBpbmRleCA9IHNTeW5jSW5zSWQ7CisKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9JTlNUQU5DRV9OVU0pCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZSA9IHZNZWRpYVN5bmNJbnNMaXN0W2luZGV4XTsKKwlpZiAocEluc3RhbmNlID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCSpscE1lZGlhVGltZSA9IHBJbnN0YW5jZS0+bUxhc3RNZWRpYVRpbWU7CisJKmxwU1RDVGltZSA9IHBJbnN0YW5jZS0+bUxhc3RTdGM7CisJKmxwU3lzdGVtVGltZSA9IHBJbnN0YW5jZS0+bUxhc3RSZWFsVGltZTsKKwlyZXR1cm4gMDsKK30KKworbG9uZyBtZWRpYXN5bmNfaW5zX2dldF9zeXN0ZW10aW1lKHMzMiBzU3luY0luc0lkLCBzNjQqIGxwU1RDLCBzNjQqIGxwU3lzdGVtVGltZSl7CisJbWVkaWFzeW5jX2lucyogcEluc3RhbmNlID0gTlVMTDsKKwl1NjQgY3VycmVudF9zdGMgPSAwOworCXM2NCBjdXJyZW50X3N5c3RlbXRpbWUgPSAwOworCXMzMiBpbmRleCA9IHNTeW5jSW5zSWQ7CisKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9JTlNUQU5DRV9OVU0pCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZSA9IHZNZWRpYVN5bmNJbnNMaXN0W2luZGV4XTsKKwlpZiAocEluc3RhbmNlID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWN1cnJlbnRfc3RjID0gZ2V0X3N0Y190aW1lX3VzKHNTeW5jSW5zSWQpOworCWN1cnJlbnRfc3lzdGVtdGltZSA9IGdldF9zeXN0ZW1fdGltZV91cygpOworCisJKmxwU1RDID0gY3VycmVudF9zdGM7CisJKmxwU3lzdGVtVGltZSA9IGN1cnJlbnRfc3lzdGVtdGltZTsKKworCXJldHVybiAwOworfQorCitsb25nIG1lZGlhc3luY19pbnNfZ2V0X25leHR2c3luY19zeXN0ZW10aW1lKHMzMiBzU3luY0luc0lkLCBzNjQqIGxwU3lzdGVtVGltZSkgeworCisJcmV0dXJuIDA7Cit9CisKK2xvbmcgbWVkaWFzeW5jX2luc19zZXRfdXBkYXRldGltZV90aHJlc2hvbGQoczMyIHNTeW5jSW5zSWQsIHM2NCBsVGltZVRocmVzaG9sZCkgeworCW1lZGlhc3luY19pbnMqIHBJbnN0YW5jZSA9IE5VTEw7CisJczMyIGluZGV4ID0gc1N5bmNJbnNJZDsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9JTlNUQU5DRV9OVU0pCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZSA9IHZNZWRpYVN5bmNJbnNMaXN0W2luZGV4XTsKKwlpZiAocEluc3RhbmNlID09IE5VTEwpCisJCXJldHVybiAtMTsKKwlwSW5zdGFuY2UtPm1VcGRhdGVUaW1lVGhyZXNob2xkID0gbFRpbWVUaHJlc2hvbGQ7CisJcmV0dXJuIDA7Cit9CisKK2xvbmcgbWVkaWFzeW5jX2luc19nZXRfdXBkYXRldGltZV90aHJlc2hvbGQoczMyIHNTeW5jSW5zSWQsIHM2NCogbHBUaW1lVGhyZXNob2xkKSB7CisJbWVkaWFzeW5jX2lucyogcEluc3RhbmNlID0gTlVMTDsKKwlzMzIgaW5kZXggPSBzU3luY0luc0lkOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTUFYX0lOU1RBTkNFX05VTSkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlID0gdk1lZGlhU3luY0luc0xpc3RbaW5kZXhdOworCWlmIChwSW5zdGFuY2UgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCSpscFRpbWVUaHJlc2hvbGQgPSBwSW5zdGFuY2UtPm1VcGRhdGVUaW1lVGhyZXNob2xkOworCXJldHVybiAwOworfQorCitsb25nIG1lZGlhc3luY19pbnNfZ2V0X3RyYWNrbWVkaWF0aW1lKHMzMiBzU3luY0luc0lkLCBzNjQqIGxwVHJhY2tNZWRpYVRpbWUpIHsKKworCW1lZGlhc3luY19pbnMqIHBJbnN0YW5jZSA9IE5VTEw7CisJczMyIGluZGV4ID0gc1N5bmNJbnNJZDsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9JTlNUQU5DRV9OVU0pCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZSA9IHZNZWRpYVN5bmNJbnNMaXN0W2luZGV4XTsKKwlpZiAocEluc3RhbmNlID09IE5VTEwpCisJCXJldHVybiAtMTsKKwkqbHBUcmFja01lZGlhVGltZSA9IHBJbnN0YW5jZS0+bVRyYWNrTWVkaWFUaW1lOworCXJldHVybiAwOworfQorbG9uZyBtZWRpYXN5bmNfaW5zX3NldF9jbG9ja3R5cGUoczMyIHNTeW5jSW5zSWQsIG1lZGlhc3luY19jbG9ja3R5cGUgdHlwZSkgeworCW1lZGlhc3luY19pbnMqIHBJbnN0YW5jZSA9IE5VTEw7CisJczMyIGluZGV4ID0gc1N5bmNJbnNJZDsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9JTlNUQU5DRV9OVU0pCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZSA9IHZNZWRpYVN5bmNJbnNMaXN0W2luZGV4XTsKKwlpZiAocEluc3RhbmNlID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZS0+bVNvdXJjZUNsb2NrVHlwZSA9IHR5cGU7CisJcmV0dXJuIDA7Cit9CisKK2xvbmcgbWVkaWFzeW5jX2luc19nZXRfY2xvY2t0eXBlKHMzMiBzU3luY0luc0lkLCBtZWRpYXN5bmNfY2xvY2t0eXBlKiB0eXBlKSB7CisJbWVkaWFzeW5jX2lucyogcEluc3RhbmNlID0gTlVMTDsKKwlzMzIgaW5kZXggPSBzU3luY0luc0lkOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTUFYX0lOU1RBTkNFX05VTSkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlID0gdk1lZGlhU3luY0luc0xpc3RbaW5kZXhdOworCWlmIChwSW5zdGFuY2UgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJKnR5cGUgPSBwSW5zdGFuY2UtPm1Tb3VyY2VDbG9ja1R5cGU7CisJcmV0dXJuIDA7Cit9CisKK2xvbmcgbWVkaWFzeW5jX2luc19zZXRfY2xvY2tzdGF0ZShzMzIgc1N5bmNJbnNJZCwgbWVkaWFzeW5jX2Nsb2NrcHJvdmlkZXJfc3RhdGUgc3RhdGUpIHsKKwltZWRpYXN5bmNfaW5zKiBwSW5zdGFuY2UgPSBOVUxMOworCXMzMiBpbmRleCA9IHNTeW5jSW5zSWQ7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBNQVhfSU5TVEFOQ0VfTlVNKQorCQlyZXR1cm4gLTE7CisKKwlwSW5zdGFuY2UgPSB2TWVkaWFTeW5jSW5zTGlzdFtpbmRleF07CisJaWYgKHBJbnN0YW5jZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlwSW5zdGFuY2UtPm1Tb3VyY2VDbG9ja1N0YXRlID0gc3RhdGU7CisJcmV0dXJuIDA7Cit9CisKK2xvbmcgbWVkaWFzeW5jX2luc19nZXRfY2xvY2tzdGF0ZShzMzIgc1N5bmNJbnNJZCwgbWVkaWFzeW5jX2Nsb2NrcHJvdmlkZXJfc3RhdGUqIHN0YXRlKSB7CisJbWVkaWFzeW5jX2lucyogcEluc3RhbmNlID0gTlVMTDsKKwlzMzIgaW5kZXggPSBzU3luY0luc0lkOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTUFYX0lOU1RBTkNFX05VTSkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlID0gdk1lZGlhU3luY0luc0xpc3RbaW5kZXhdOworCWlmIChwSW5zdGFuY2UgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJKnN0YXRlID0gcEluc3RhbmNlLT5tU291cmNlQ2xvY2tTdGF0ZTsKKwlyZXR1cm4gMDsKK30KKworbG9uZyBtZWRpYXN5bmNfaW5zX3NldF9oYXNhdWRpbyhzMzIgc1N5bmNJbnNJZCwgaW50IGhhc2F1ZGlvKSB7CisJbWVkaWFzeW5jX2lucyogcEluc3RhbmNlID0gTlVMTDsKKwlzMzIgaW5kZXggPSBzU3luY0luc0lkOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTUFYX0lOU1RBTkNFX05VTSkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlID0gdk1lZGlhU3luY0luc0xpc3RbaW5kZXhdOworCWlmIChwSW5zdGFuY2UgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlLT5tSGFzQXVkaW8gPSBoYXNhdWRpbzsKKwlyZXR1cm4gMDsKK30KKworbG9uZyBtZWRpYXN5bmNfaW5zX2dldF9oYXNhdWRpbyhzMzIgc1N5bmNJbnNJZCwgaW50KiBoYXNhdWRpbykgeworCW1lZGlhc3luY19pbnMqIHBJbnN0YW5jZSA9IE5VTEw7CisJczMyIGluZGV4ID0gc1N5bmNJbnNJZDsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9JTlNUQU5DRV9OVU0pCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZSA9IHZNZWRpYVN5bmNJbnNMaXN0W2luZGV4XTsKKwlpZiAocEluc3RhbmNlID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCSpoYXNhdWRpbyA9IHBJbnN0YW5jZS0+bUhhc0F1ZGlvOworCXJldHVybiAwOworfQorbG9uZyBtZWRpYXN5bmNfaW5zX3NldF9oYXN2aWRlbyhzMzIgc1N5bmNJbnNJZCwgaW50IGhhc3ZpZGVvKSB7CisJbWVkaWFzeW5jX2lucyogcEluc3RhbmNlID0gTlVMTDsKKwlzMzIgaW5kZXggPSBzU3luY0luc0lkOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTUFYX0lOU1RBTkNFX05VTSkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlID0gdk1lZGlhU3luY0luc0xpc3RbaW5kZXhdOworCWlmIChwSW5zdGFuY2UgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlLT5tSGFzVmlkZW8gPSBoYXN2aWRlbzsKKwlyZXR1cm4gMDsKK30KKworbG9uZyBtZWRpYXN5bmNfaW5zX2dldF9oYXN2aWRlbyhzMzIgc1N5bmNJbnNJZCwgaW50KiBoYXN2aWRlbykgeworCW1lZGlhc3luY19pbnMqIHBJbnN0YW5jZSA9IE5VTEw7CisJczMyIGluZGV4ID0gc1N5bmNJbnNJZDsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9JTlNUQU5DRV9OVU0pCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZSA9IHZNZWRpYVN5bmNJbnNMaXN0W2luZGV4XTsKKwlpZiAocEluc3RhbmNlID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCSpoYXN2aWRlbyA9IHBJbnN0YW5jZS0+bUhhc1ZpZGVvOworCXJldHVybiAwOworfQorCitsb25nIG1lZGlhc3luY19pbnNfc2V0X2ZpcnN0YXVkaW9mcmFtZWluZm8oczMyIHNTeW5jSW5zSWQsIG1lZGlhc3luY19mcmFtZWluZm8gaW5mbykgeworCW1lZGlhc3luY19pbnMqIHBJbnN0YW5jZSA9IE5VTEw7CisJczMyIGluZGV4ID0gc1N5bmNJbnNJZDsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9JTlNUQU5DRV9OVU0pCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZSA9IHZNZWRpYVN5bmNJbnNMaXN0W2luZGV4XTsKKwlpZiAocEluc3RhbmNlID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZS0+bVN5bmNJbmZvLmZpcnN0QWZyYW1lSW5mby5mcmFtZVB0cyA9IGluZm8uZnJhbWVQdHM7CisJcEluc3RhbmNlLT5tU3luY0luZm8uZmlyc3RBZnJhbWVJbmZvLmZyYW1lU3lzdGVtVGltZSA9IGluZm8uZnJhbWVTeXN0ZW1UaW1lOworCXJldHVybiAwOworfQorCitsb25nIG1lZGlhc3luY19pbnNfZ2V0X2ZpcnN0YXVkaW9mcmFtZWluZm8oczMyIHNTeW5jSW5zSWQsIG1lZGlhc3luY19mcmFtZWluZm8qIGluZm8pIHsKKwltZWRpYXN5bmNfaW5zKiBwSW5zdGFuY2UgPSBOVUxMOworCXMzMiBpbmRleCA9IHNTeW5jSW5zSWQ7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBNQVhfSU5TVEFOQ0VfTlVNKQorCQlyZXR1cm4gLTE7CisKKwlwSW5zdGFuY2UgPSB2TWVkaWFTeW5jSW5zTGlzdFtpbmRleF07CisJaWYgKHBJbnN0YW5jZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpbmZvLT5mcmFtZVB0cyA9IHBJbnN0YW5jZS0+bVN5bmNJbmZvLmZpcnN0QWZyYW1lSW5mby5mcmFtZVB0czsKKwlpbmZvLT5mcmFtZVN5c3RlbVRpbWUgPSBwSW5zdGFuY2UtPm1TeW5jSW5mby5maXJzdEFmcmFtZUluZm8uZnJhbWVTeXN0ZW1UaW1lOworCXJldHVybiAwOworfQorCitsb25nIG1lZGlhc3luY19pbnNfc2V0X2ZpcnN0dmlkZW9mcmFtZWluZm8oczMyIHNTeW5jSW5zSWQsIG1lZGlhc3luY19mcmFtZWluZm8gaW5mbykgeworCW1lZGlhc3luY19pbnMqIHBJbnN0YW5jZSA9IE5VTEw7CisJczMyIGluZGV4ID0gc1N5bmNJbnNJZDsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9JTlNUQU5DRV9OVU0pCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZSA9IHZNZWRpYVN5bmNJbnNMaXN0W2luZGV4XTsKKwlpZiAocEluc3RhbmNlID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZS0+bVN5bmNJbmZvLmZpcnN0VmZyYW1lSW5mby5mcmFtZVB0cyA9IGluZm8uZnJhbWVQdHM7CisJcEluc3RhbmNlLT5tU3luY0luZm8uZmlyc3RWZnJhbWVJbmZvLmZyYW1lU3lzdGVtVGltZSA9IGluZm8uZnJhbWVTeXN0ZW1UaW1lOworCXJldHVybiAwOworfQorCitsb25nIG1lZGlhc3luY19pbnNfZ2V0X2ZpcnN0dmlkZW9mcmFtZWluZm8oczMyIHNTeW5jSW5zSWQsIG1lZGlhc3luY19mcmFtZWluZm8qIGluZm8pIHsKKwltZWRpYXN5bmNfaW5zKiBwSW5zdGFuY2UgPSBOVUxMOworCXMzMiBpbmRleCA9IHNTeW5jSW5zSWQ7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBNQVhfSU5TVEFOQ0VfTlVNKQorCQlyZXR1cm4gLTE7CisKKwlwSW5zdGFuY2UgPSB2TWVkaWFTeW5jSW5zTGlzdFtpbmRleF07CisJaWYgKHBJbnN0YW5jZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpbmZvLT5mcmFtZVB0cyA9IHBJbnN0YW5jZS0+bVN5bmNJbmZvLmZpcnN0VmZyYW1lSW5mby5mcmFtZVB0czsKKwlpbmZvLT5mcmFtZVN5c3RlbVRpbWUgPSBwSW5zdGFuY2UtPm1TeW5jSW5mby5maXJzdFZmcmFtZUluZm8uZnJhbWVTeXN0ZW1UaW1lOworCXJldHVybiAwOworfQorCitsb25nIG1lZGlhc3luY19pbnNfc2V0X2ZpcnN0ZG14cGNyaW5mbyhzMzIgc1N5bmNJbnNJZCwgbWVkaWFzeW5jX2ZyYW1laW5mbyBpbmZvKSB7CisJbWVkaWFzeW5jX2lucyogcEluc3RhbmNlID0gTlVMTDsKKwlzMzIgaW5kZXggPSBzU3luY0luc0lkOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTUFYX0lOU1RBTkNFX05VTSkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlID0gdk1lZGlhU3luY0luc0xpc3RbaW5kZXhdOworCWlmIChwSW5zdGFuY2UgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlLT5tU3luY0luZm8uZmlyc3REbXhQY3JJbmZvLmZyYW1lUHRzID0gaW5mby5mcmFtZVB0czsKKwlwSW5zdGFuY2UtPm1TeW5jSW5mby5maXJzdERteFBjckluZm8uZnJhbWVTeXN0ZW1UaW1lID0gaW5mby5mcmFtZVN5c3RlbVRpbWU7CisJcmV0dXJuIDA7Cit9CisKK2xvbmcgbWVkaWFzeW5jX2luc19nZXRfZmlyc3RkbXhwY3JpbmZvKHMzMiBzU3luY0luc0lkLCBtZWRpYXN5bmNfZnJhbWVpbmZvKiBpbmZvKSB7CisJbWVkaWFzeW5jX2lucyogcEluc3RhbmNlID0gTlVMTDsKKwlzMzIgaW5kZXggPSBzU3luY0luc0lkOworCWludDY0X3QgcGNyID0gLTE7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBNQVhfSU5TVEFOQ0VfTlVNKQorCQlyZXR1cm4gLTE7CisKKwlwSW5zdGFuY2UgPSB2TWVkaWFTeW5jSW5zTGlzdFtpbmRleF07CisJaWYgKHBJbnN0YW5jZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAocEluc3RhbmNlLT5tU3luY0luZm8uZmlyc3REbXhQY3JJbmZvLmZyYW1lUHRzID09IC0xKSB7CisJCWlmIChhbWxkZW11eF9wY3JzY3JfZ2V0KSB7CisJCQlhbWxkZW11eF9wY3JzY3JfZ2V0KHBJbnN0YW5jZS0+bURlbXV4SWQsIDAsICZwY3IpOworCQkJcEluc3RhbmNlLT5tU3luY0luZm8uZmlyc3REbXhQY3JJbmZvLmZyYW1lUHRzID0gcGNyOworCQkJcEluc3RhbmNlLT5tU3luY0luZm8uZmlyc3REbXhQY3JJbmZvLmZyYW1lU3lzdGVtVGltZSA9IGdldF9zeXN0ZW1fdGltZV91cygpOworCQl9CisJfQorCisJaW5mby0+ZnJhbWVQdHMgPSBwSW5zdGFuY2UtPm1TeW5jSW5mby5maXJzdERteFBjckluZm8uZnJhbWVQdHM7CisJaW5mby0+ZnJhbWVTeXN0ZW1UaW1lID0gcEluc3RhbmNlLT5tU3luY0luZm8uZmlyc3REbXhQY3JJbmZvLmZyYW1lU3lzdGVtVGltZTsKKwlyZXR1cm4gMDsKK30KKworbG9uZyBtZWRpYXN5bmNfaW5zX3NldF9yZWZjbG9ja2luZm8oczMyIHNTeW5jSW5zSWQsIG1lZGlhc3luY19mcmFtZWluZm8gaW5mbykgeworCW1lZGlhc3luY19pbnMqIHBJbnN0YW5jZSA9IE5VTEw7CisJczMyIGluZGV4ID0gc1N5bmNJbnNJZDsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9JTlNUQU5DRV9OVU0pCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZSA9IHZNZWRpYVN5bmNJbnNMaXN0W2luZGV4XTsKKwlpZiAocEluc3RhbmNlID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZS0+bVN5bmNJbmZvLnJlZkNsb2NrSW5mby5mcmFtZVB0cyA9IGluZm8uZnJhbWVQdHM7CisJcEluc3RhbmNlLT5tU3luY0luZm8ucmVmQ2xvY2tJbmZvLmZyYW1lU3lzdGVtVGltZSA9IGluZm8uZnJhbWVTeXN0ZW1UaW1lOworCXJldHVybiAwOworfQorCitsb25nIG1lZGlhc3luY19pbnNfZ2V0X3JlZmNsb2NraW5mbyhzMzIgc1N5bmNJbnNJZCwgbWVkaWFzeW5jX2ZyYW1laW5mbyogaW5mbykgeworCW1lZGlhc3luY19pbnMqIHBJbnN0YW5jZSA9IE5VTEw7CisJczMyIGluZGV4ID0gc1N5bmNJbnNJZDsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9JTlNUQU5DRV9OVU0pCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZSA9IHZNZWRpYVN5bmNJbnNMaXN0W2luZGV4XTsKKwlpZiAocEluc3RhbmNlID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWluZm8tPmZyYW1lUHRzID0gcEluc3RhbmNlLT5tU3luY0luZm8ucmVmQ2xvY2tJbmZvLmZyYW1lUHRzOworCWluZm8tPmZyYW1lU3lzdGVtVGltZSA9IHBJbnN0YW5jZS0+bVN5bmNJbmZvLnJlZkNsb2NrSW5mby5mcmFtZVN5c3RlbVRpbWU7CisJcmV0dXJuIDA7Cit9CisKK2xvbmcgbWVkaWFzeW5jX2luc19zZXRfY3VyYXVkaW9mcmFtZWluZm8oczMyIHNTeW5jSW5zSWQsIG1lZGlhc3luY19mcmFtZWluZm8gaW5mbykgeworCW1lZGlhc3luY19pbnMqIHBJbnN0YW5jZSA9IE5VTEw7CisJczMyIGluZGV4ID0gc1N5bmNJbnNJZDsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9JTlNUQU5DRV9OVU0pCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZSA9IHZNZWRpYVN5bmNJbnNMaXN0W2luZGV4XTsKKwlpZiAocEluc3RhbmNlID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZS0+bVN5bmNJbmZvLmN1ckF1ZGlvSW5mby5mcmFtZVB0cyA9IGluZm8uZnJhbWVQdHM7CisJcEluc3RhbmNlLT5tU3luY0luZm8uY3VyQXVkaW9JbmZvLmZyYW1lU3lzdGVtVGltZSA9IGluZm8uZnJhbWVTeXN0ZW1UaW1lOworCXJldHVybiAwOworfQorCitsb25nIG1lZGlhc3luY19pbnNfZ2V0X2N1cmF1ZGlvZnJhbWVpbmZvKHMzMiBzU3luY0luc0lkLCBtZWRpYXN5bmNfZnJhbWVpbmZvKiBpbmZvKSB7CisJbWVkaWFzeW5jX2lucyogcEluc3RhbmNlID0gTlVMTDsKKwlzMzIgaW5kZXggPSBzU3luY0luc0lkOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTUFYX0lOU1RBTkNFX05VTSkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlID0gdk1lZGlhU3luY0luc0xpc3RbaW5kZXhdOworCWlmIChwSW5zdGFuY2UgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaW5mby0+ZnJhbWVQdHMgPSBwSW5zdGFuY2UtPm1TeW5jSW5mby5jdXJBdWRpb0luZm8uZnJhbWVQdHM7CisJaW5mby0+ZnJhbWVTeXN0ZW1UaW1lID0gcEluc3RhbmNlLT5tU3luY0luZm8uY3VyQXVkaW9JbmZvLmZyYW1lU3lzdGVtVGltZTsKKwlyZXR1cm4gMDsKK30KKworbG9uZyBtZWRpYXN5bmNfaW5zX3NldF9jdXJ2aWRlb2ZyYW1laW5mbyhzMzIgc1N5bmNJbnNJZCwgbWVkaWFzeW5jX2ZyYW1laW5mbyBpbmZvKSB7CisJbWVkaWFzeW5jX2lucyogcEluc3RhbmNlID0gTlVMTDsKKwlzMzIgaW5kZXggPSBzU3luY0luc0lkOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTUFYX0lOU1RBTkNFX05VTSkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlID0gdk1lZGlhU3luY0luc0xpc3RbaW5kZXhdOworCWlmIChwSW5zdGFuY2UgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlLT5tU3luY0luZm8uY3VyVmlkZW9JbmZvLmZyYW1lUHRzID0gaW5mby5mcmFtZVB0czsKKwlwSW5zdGFuY2UtPm1TeW5jSW5mby5jdXJWaWRlb0luZm8uZnJhbWVTeXN0ZW1UaW1lID0gaW5mby5mcmFtZVN5c3RlbVRpbWU7CisJcEluc3RhbmNlLT5tVHJhY2tNZWRpYVRpbWUgPSBkaXZfdTY0KGluZm8uZnJhbWVQdHMgKiAxMDAgLCA5KTsKKworCXJldHVybiAwOworfQorCitsb25nIG1lZGlhc3luY19pbnNfZ2V0X2N1cnZpZGVvZnJhbWVpbmZvKHMzMiBzU3luY0luc0lkLCBtZWRpYXN5bmNfZnJhbWVpbmZvKiBpbmZvKSB7CisJbWVkaWFzeW5jX2lucyogcEluc3RhbmNlID0gTlVMTDsKKwlzMzIgaW5kZXggPSBzU3luY0luc0lkOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTUFYX0lOU1RBTkNFX05VTSkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlID0gdk1lZGlhU3luY0luc0xpc3RbaW5kZXhdOworCWlmIChwSW5zdGFuY2UgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaW5mby0+ZnJhbWVQdHMgPSBwSW5zdGFuY2UtPm1TeW5jSW5mby5jdXJWaWRlb0luZm8uZnJhbWVQdHM7CisJaW5mby0+ZnJhbWVTeXN0ZW1UaW1lID0gcEluc3RhbmNlLT5tU3luY0luZm8uY3VyVmlkZW9JbmZvLmZyYW1lU3lzdGVtVGltZTsKKwlyZXR1cm4gMDsKK30KKworbG9uZyBtZWRpYXN5bmNfaW5zX3NldF9jdXJkbXhwY3JpbmZvKHMzMiBzU3luY0luc0lkLCBtZWRpYXN5bmNfZnJhbWVpbmZvIGluZm8pIHsKKwltZWRpYXN5bmNfaW5zKiBwSW5zdGFuY2UgPSBOVUxMOworCXMzMiBpbmRleCA9IHNTeW5jSW5zSWQ7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBNQVhfSU5TVEFOQ0VfTlVNKQorCQlyZXR1cm4gLTE7CisKKwlwSW5zdGFuY2UgPSB2TWVkaWFTeW5jSW5zTGlzdFtpbmRleF07CisJaWYgKHBJbnN0YW5jZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlwSW5zdGFuY2UtPm1TeW5jSW5mby5jdXJEbXhQY3JJbmZvLmZyYW1lUHRzID0gaW5mby5mcmFtZVB0czsKKwlwSW5zdGFuY2UtPm1TeW5jSW5mby5jdXJEbXhQY3JJbmZvLmZyYW1lU3lzdGVtVGltZSA9IGluZm8uZnJhbWVTeXN0ZW1UaW1lOworCXJldHVybiAwOworfQorCitsb25nIG1lZGlhc3luY19pbnNfZ2V0X2N1cmRteHBjcmluZm8oczMyIHNTeW5jSW5zSWQsIG1lZGlhc3luY19mcmFtZWluZm8qIGluZm8pIHsKKwltZWRpYXN5bmNfaW5zKiBwSW5zdGFuY2UgPSBOVUxMOworCXMzMiBpbmRleCA9IHNTeW5jSW5zSWQ7CisJaW50NjRfdCBwY3IgPSAtMTsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9JTlNUQU5DRV9OVU0pCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZSA9IHZNZWRpYVN5bmNJbnNMaXN0W2luZGV4XTsKKwlpZiAocEluc3RhbmNlID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChhbWxkZW11eF9wY3JzY3JfZ2V0KSB7CisJCWFtbGRlbXV4X3BjcnNjcl9nZXQocEluc3RhbmNlLT5tRGVtdXhJZCwgMCwgJnBjcik7CisJCXBJbnN0YW5jZS0+bVN5bmNJbmZvLmN1ckRteFBjckluZm8uZnJhbWVQdHMgPSBwY3I7CisJCXBJbnN0YW5jZS0+bVN5bmNJbmZvLmN1ckRteFBjckluZm8uZnJhbWVTeXN0ZW1UaW1lID0gZ2V0X3N5c3RlbV90aW1lX3VzKCk7CisJfQorCisJaW5mby0+ZnJhbWVQdHMgPSBwSW5zdGFuY2UtPm1TeW5jSW5mby5jdXJEbXhQY3JJbmZvLmZyYW1lUHRzOworCWluZm8tPmZyYW1lU3lzdGVtVGltZSA9IHBJbnN0YW5jZS0+bVN5bmNJbmZvLmN1ckRteFBjckluZm8uZnJhbWVTeXN0ZW1UaW1lOworCXJldHVybiAwOworfQorCitsb25nIG1lZGlhc3luY19pbnNfc2V0X2F1ZGlvbXV0ZShzMzIgc1N5bmNJbnNJZCwgaW50IG11dGVfZmxhZykgeworCW1lZGlhc3luY19pbnMqIHBJbnN0YW5jZSA9IE5VTEw7CisJczMyIGluZGV4ID0gc1N5bmNJbnNJZDsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9JTlNUQU5DRV9OVU0pCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZSA9IHZNZWRpYVN5bmNJbnNMaXN0W2luZGV4XTsKKwlpZiAocEluc3RhbmNlID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZS0+bXV0ZV9mbGFnID0gbXV0ZV9mbGFnOworCisJcmV0dXJuIDA7Cit9CisKK2xvbmcgbWVkaWFzeW5jX2luc19nZXRfYXVkaW9tdXRlKHMzMiBzU3luY0luc0lkLCBpbnQqIG11dGVfZmxhZykgeworCW1lZGlhc3luY19pbnMqIHBJbnN0YW5jZSA9IE5VTEw7CisJczMyIGluZGV4ID0gc1N5bmNJbnNJZDsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9JTlNUQU5DRV9OVU0pCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZSA9IHZNZWRpYVN5bmNJbnNMaXN0W2luZGV4XTsKKwlpZiAocEluc3RhbmNlID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCSptdXRlX2ZsYWcgPSBwSW5zdGFuY2UtPm11dGVfZmxhZzsKKwlyZXR1cm4gMDsKK30KKworbG9uZyBtZWRpYXN5bmNfaW5zX3NldF9hdWRpb2luZm8oczMyIHNTeW5jSW5zSWQsIG1lZGlhc3luY19hdWRpb2luZm8gaW5mbykgeworCW1lZGlhc3luY19pbnMqIHBJbnN0YW5jZSA9IE5VTEw7CisJczMyIGluZGV4ID0gc1N5bmNJbnNJZDsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9JTlNUQU5DRV9OVU0pCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZSA9IHZNZWRpYVN5bmNJbnNMaXN0W2luZGV4XTsKKwlpZiAocEluc3RhbmNlID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZS0+bUF1ZGlvSW5mby5jYWNoZUR1cmF0aW9uID0gaW5mby5jYWNoZUR1cmF0aW9uOworCXBJbnN0YW5jZS0+bUF1ZGlvSW5mby5jYWNoZVNpemUgPSBpbmZvLmNhY2hlU2l6ZTsKKwlyZXR1cm4gMDsKK30KKworbG9uZyBtZWRpYXN5bmNfaW5zX2dldF9hdWRpb2luZm8oczMyIHNTeW5jSW5zSWQsIG1lZGlhc3luY19hdWRpb2luZm8qIGluZm8pIHsKKwltZWRpYXN5bmNfaW5zKiBwSW5zdGFuY2UgPSBOVUxMOworCXMzMiBpbmRleCA9IHNTeW5jSW5zSWQ7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBNQVhfSU5TVEFOQ0VfTlVNKQorCQlyZXR1cm4gLTE7CisKKwlwSW5zdGFuY2UgPSB2TWVkaWFTeW5jSW5zTGlzdFtpbmRleF07CisJaWYgKHBJbnN0YW5jZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpbmZvLT5jYWNoZUR1cmF0aW9uID0gcEluc3RhbmNlLT5tQXVkaW9JbmZvLmNhY2hlRHVyYXRpb247CisJaW5mby0+Y2FjaGVEdXJhdGlvbiA9IHBJbnN0YW5jZS0+bUF1ZGlvSW5mby5jYWNoZUR1cmF0aW9uOworCXJldHVybiAwOworfQorCitsb25nIG1lZGlhc3luY19pbnNfc2V0X3ZpZGVvaW5mbyhzMzIgc1N5bmNJbnNJZCwgbWVkaWFzeW5jX3ZpZGVvaW5mbyBpbmZvKSB7CisJbWVkaWFzeW5jX2lucyogcEluc3RhbmNlID0gTlVMTDsKKwlzMzIgaW5kZXggPSBzU3luY0luc0lkOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTUFYX0lOU1RBTkNFX05VTSkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlID0gdk1lZGlhU3luY0luc0xpc3RbaW5kZXhdOworCWlmIChwSW5zdGFuY2UgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlLT5tVmlkZW9JbmZvLmNhY2hlRHVyYXRpb24gPSBpbmZvLmNhY2hlRHVyYXRpb247CisJcEluc3RhbmNlLT5tVmlkZW9JbmZvLmNhY2hlU2l6ZSA9IGluZm8uY2FjaGVTaXplOworCXBJbnN0YW5jZS0+bVZpZGVvSW5mby5zcGVjaWFsU2l6ZUNvdW50ID0gaW5mby5zcGVjaWFsU2l6ZUNvdW50OworCXJldHVybiAwOworCit9CisKK2xvbmcgbWVkaWFzeW5jX2luc19nZXRfdmlkZW9pbmZvKHMzMiBzU3luY0luc0lkLCBtZWRpYXN5bmNfdmlkZW9pbmZvKiBpbmZvKSB7CisJbWVkaWFzeW5jX2lucyogcEluc3RhbmNlID0gTlVMTDsKKwlzMzIgaW5kZXggPSBzU3luY0luc0lkOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTUFYX0lOU1RBTkNFX05VTSkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlID0gdk1lZGlhU3luY0luc0xpc3RbaW5kZXhdOworCWlmIChwSW5zdGFuY2UgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaW5mby0+Y2FjaGVEdXJhdGlvbiA9IHBJbnN0YW5jZS0+bVZpZGVvSW5mby5jYWNoZUR1cmF0aW9uOworCWluZm8tPmNhY2hlU2l6ZSA9IHBJbnN0YW5jZS0+bVZpZGVvSW5mby5jYWNoZVNpemU7CisJaW5mby0+c3BlY2lhbFNpemVDb3VudCA9IHBJbnN0YW5jZS0+bVZpZGVvSW5mby5zcGVjaWFsU2l6ZUNvdW50OworCXJldHVybiAwOworfQorCitsb25nIG1lZGlhc3luY19pbnNfc2V0X2F2c3luY3N0YXRlKHMzMiBzU3luY0luc0lkLCBzMzIgc3RhdGUpIHsKKwltZWRpYXN5bmNfaW5zKiBwSW5zdGFuY2UgPSBOVUxMOworCXMzMiBpbmRleCA9IHNTeW5jSW5zSWQ7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBNQVhfSU5TVEFOQ0VfTlVNKQorCQlyZXR1cm4gLTE7CisKKwlwSW5zdGFuY2UgPSB2TWVkaWFTeW5jSW5zTGlzdFtpbmRleF07CisJaWYgKHBJbnN0YW5jZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlwSW5zdGFuY2UtPm1TeW5jSW5mby5zdGF0ZSA9IHN0YXRlOworCXJldHVybiAwOworfQorCitsb25nIG1lZGlhc3luY19pbnNfZ2V0X2F2c3luY3N0YXRlKHMzMiBzU3luY0luc0lkLCBzMzIqIHN0YXRlKSB7CisJbWVkaWFzeW5jX2lucyogcEluc3RhbmNlID0gTlVMTDsKKwlzMzIgaW5kZXggPSBzU3luY0luc0lkOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTUFYX0lOU1RBTkNFX05VTSkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlID0gdk1lZGlhU3luY0luc0xpc3RbaW5kZXhdOworCWlmIChwSW5zdGFuY2UgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJKnN0YXRlID0gcEluc3RhbmNlLT5tU3luY0luZm8uc3RhdGU7CisJcmV0dXJuIDA7Cit9CisKK2xvbmcgbWVkaWFzeW5jX2luc19zZXRfc3RhcnR0aHJlc2hvbGQoczMyIHNTeW5jSW5zSWQsIHMzMiB0aHJlc2hvbGQpIHsKKwltZWRpYXN5bmNfaW5zKiBwSW5zdGFuY2UgPSBOVUxMOworCXMzMiBpbmRleCA9IHNTeW5jSW5zSWQ7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBNQVhfSU5TVEFOQ0VfTlVNKQorCQlyZXR1cm4gLTE7CisKKwlwSW5zdGFuY2UgPSB2TWVkaWFTeW5jSW5zTGlzdFtpbmRleF07CisJaWYgKHBJbnN0YW5jZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlwSW5zdGFuY2UtPm1TdGFydFRocmVzaG9sZCA9IHRocmVzaG9sZDsKKwlyZXR1cm4gMDsKK30KKworbG9uZyBtZWRpYXN5bmNfaW5zX2dldF9zdGFydHRocmVzaG9sZChzMzIgc1N5bmNJbnNJZCwgczMyKiB0aHJlc2hvbGQpIHsKKwltZWRpYXN5bmNfaW5zKiBwSW5zdGFuY2UgPSBOVUxMOworCXMzMiBpbmRleCA9IHNTeW5jSW5zSWQ7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBNQVhfSU5TVEFOQ0VfTlVNKQorCQlyZXR1cm4gLTE7CisKKwlwSW5zdGFuY2UgPSB2TWVkaWFTeW5jSW5zTGlzdFtpbmRleF07CisJaWYgKHBJbnN0YW5jZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwkqdGhyZXNob2xkID0gcEluc3RhbmNlLT5tU3RhcnRUaHJlc2hvbGQ7CisJcmV0dXJuIDA7Cit9CisKK2xvbmcgbWVkaWFzeW5jX2luc19zZXRfcHRzYWRqdXN0KHMzMiBzU3luY0luc0lkLCBzMzIgYWR1anN0cHRzKSB7CisJbWVkaWFzeW5jX2lucyogcEluc3RhbmNlID0gTlVMTDsKKwlzMzIgaW5kZXggPSBzU3luY0luc0lkOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTUFYX0lOU1RBTkNFX05VTSkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlID0gdk1lZGlhU3luY0luc0xpc3RbaW5kZXhdOworCWlmIChwSW5zdGFuY2UgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlLT5tUHRzQWRqdXN0ID0gYWR1anN0cHRzOworCXJldHVybiAwOworfQorCitsb25nIG1lZGlhc3luY19pbnNfZ2V0X3B0c2FkanVzdChzMzIgc1N5bmNJbnNJZCwgczMyKiBhZHVqc3RwdHMpIHsKKwltZWRpYXN5bmNfaW5zKiBwSW5zdGFuY2UgPSBOVUxMOworCXMzMiBpbmRleCA9IHNTeW5jSW5zSWQ7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBNQVhfSU5TVEFOQ0VfTlVNKQorCQlyZXR1cm4gLTE7CisKKwlwSW5zdGFuY2UgPSB2TWVkaWFTeW5jSW5zTGlzdFtpbmRleF07CisJaWYgKHBJbnN0YW5jZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwkqYWR1anN0cHRzID0gcEluc3RhbmNlLT5tUHRzQWRqdXN0OworCXJldHVybiAwOworfQorCitsb25nIG1lZGlhc3luY19pbnNfc2V0X3ZpZGVvd29ya21vZGUoczMyIHNTeW5jSW5zSWQsIHM2NCBtb2RlKSB7CisJbWVkaWFzeW5jX2lucyogcEluc3RhbmNlID0gTlVMTDsKKwlzMzIgaW5kZXggPSBzU3luY0luc0lkOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTUFYX0lOU1RBTkNFX05VTSkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlID0gdk1lZGlhU3luY0luc0xpc3RbaW5kZXhdOworCWlmIChwSW5zdGFuY2UgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlLT5tVmlkZW9Xb3JrTW9kZSA9IG1vZGU7CisJcmV0dXJuIDA7Cit9CisKK2xvbmcgbWVkaWFzeW5jX2luc19nZXRfdmlkZW93b3JrbW9kZShzMzIgc1N5bmNJbnNJZCwgczY0KiBtb2RlKSB7CisJbWVkaWFzeW5jX2lucyogcEluc3RhbmNlID0gTlVMTDsKKwlzMzIgaW5kZXggPSBzU3luY0luc0lkOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTUFYX0lOU1RBTkNFX05VTSkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlID0gdk1lZGlhU3luY0luc0xpc3RbaW5kZXhdOworCWlmIChwSW5zdGFuY2UgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJKm1vZGUgPSBwSW5zdGFuY2UtPm1WaWRlb1dvcmtNb2RlOworCXJldHVybiAwOworfQorCitsb25nIG1lZGlhc3luY19pbnNfc2V0X2ZjY2VuYWJsZShzMzIgc1N5bmNJbnNJZCwgczY0IGVuYWJsZSkgeworCW1lZGlhc3luY19pbnMqIHBJbnN0YW5jZSA9IE5VTEw7CisJczMyIGluZGV4ID0gc1N5bmNJbnNJZDsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9JTlNUQU5DRV9OVU0pCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZSA9IHZNZWRpYVN5bmNJbnNMaXN0W2luZGV4XTsKKwlpZiAocEluc3RhbmNlID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZS0+bUZjY0VuYWJsZSA9IGVuYWJsZTsKKwlyZXR1cm4gMDsKK30KKworbG9uZyBtZWRpYXN5bmNfaW5zX2dldF9mY2NlbmFibGUoczMyIHNTeW5jSW5zSWQsIHM2NCogZW5hYmxlKSB7CisJbWVkaWFzeW5jX2lucyogcEluc3RhbmNlID0gTlVMTDsKKwlzMzIgaW5kZXggPSBzU3luY0luc0lkOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTUFYX0lOU1RBTkNFX05VTSkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlID0gdk1lZGlhU3luY0luc0xpc3RbaW5kZXhdOworCWlmIChwSW5zdGFuY2UgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJKmVuYWJsZSA9IHBJbnN0YW5jZS0+bUZjY0VuYWJsZTsKKwlyZXR1cm4gMDsKK30KKworCitsb25nIG1lZGlhc3luY19pbnNfc2V0X3NvdXJjZV90eXBlKHMzMiBzU3luY0luc0lkLCBhbWxfU291cmNlX1R5cGUgc291cmNlVHlwZSkgeworCW1lZGlhc3luY19pbnMqIHBJbnN0YW5jZSA9IE5VTEw7CisJczMyIGluZGV4ID0gc1N5bmNJbnNJZDsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9JTlNUQU5DRV9OVU0pCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZSA9IHZNZWRpYVN5bmNJbnNMaXN0W2luZGV4XTsKKwlpZiAocEluc3RhbmNlID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZS0+bVNvdXJjZVR5cGUgPSBzb3VyY2VUeXBlOworCXJldHVybiAwOworfQorCitsb25nIG1lZGlhc3luY19pbnNfZ2V0X3NvdXJjZV90eXBlKHMzMiBzU3luY0luc0lkLCBhbWxfU291cmNlX1R5cGUqIHNvdXJjZVR5cGUpIHsKKwltZWRpYXN5bmNfaW5zKiBwSW5zdGFuY2UgPSBOVUxMOworCXMzMiBpbmRleCA9IHNTeW5jSW5zSWQ7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBNQVhfSU5TVEFOQ0VfTlVNKQorCQlyZXR1cm4gLTE7CisKKwlwSW5zdGFuY2UgPSB2TWVkaWFTeW5jSW5zTGlzdFtpbmRleF07CisJaWYgKHBJbnN0YW5jZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwkqc291cmNlVHlwZSA9IHBJbnN0YW5jZS0+bVNvdXJjZVR5cGU7CisJcmV0dXJuIDA7Cit9CisKK2xvbmcgbWVkaWFzeW5jX2luc19zZXRfc3RhcnRfbWVkaWFfdGltZShzMzIgc1N5bmNJbnNJZCwgczY0IHN0YXJ0aW1lKSB7CisJbWVkaWFzeW5jX2lucyogcEluc3RhbmNlID0gTlVMTDsKKwlzMzIgaW5kZXggPSBzU3luY0luc0lkOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTUFYX0lOU1RBTkNFX05VTSkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlID0gdk1lZGlhU3luY0luc0xpc3RbaW5kZXhdOworCWlmIChwSW5zdGFuY2UgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCXBJbnN0YW5jZS0+bVN0YXJ0TWVkaWFUaW1lID0gc3RhcnRpbWU7CisJcmV0dXJuIDA7Cit9CisKK2xvbmcgbWVkaWFzeW5jX2luc19nZXRfc3RhcnRfbWVkaWFfdGltZShzMzIgc1N5bmNJbnNJZCwgczY0KiBzdGFydHRpbWUpIHsKKwltZWRpYXN5bmNfaW5zKiBwSW5zdGFuY2UgPSBOVUxMOworCXMzMiBpbmRleCA9IHNTeW5jSW5zSWQ7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBNQVhfSU5TVEFOQ0VfTlVNKQorCQlyZXR1cm4gLTE7CisKKwlwSW5zdGFuY2UgPSB2TWVkaWFTeW5jSW5zTGlzdFtpbmRleF07CisJaWYgKHBJbnN0YW5jZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJKnN0YXJ0dGltZSA9IHBJbnN0YW5jZS0+bVN0YXJ0TWVkaWFUaW1lOworCXJldHVybiAwOworfQorCitsb25nIG1lZGlhc3luY19pbnNfc2V0X2F1ZGlvZm9ybWF0KHMzMiBzU3luY0luc0lkLCBtZWRpYXN5bmNfYXVkaW9fZm9ybWF0IGZvcm1hdCkgeworCisJbWVkaWFzeW5jX2lucyogcEluc3RhbmNlID0gTlVMTDsKKwlzMzIgaW5kZXggPSBzU3luY0luc0lkOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTUFYX0lOU1RBTkNFX05VTSkKKwlyZXR1cm4gLTE7CisKKwlwSW5zdGFuY2UgPSB2TWVkaWFTeW5jSW5zTGlzdFtpbmRleF07CisJaWYgKHBJbnN0YW5jZSA9PSBOVUxMKQorCXJldHVybiAtMTsKKwlwSW5zdGFuY2UtPm1BdWRpb0Zvcm1hdC5jaGFubmVscyA9IGZvcm1hdC5jaGFubmVsczsKKwlwSW5zdGFuY2UtPm1BdWRpb0Zvcm1hdC5kYXRhd2lkdGggPSBmb3JtYXQuZGF0YXdpZHRoOworCXBJbnN0YW5jZS0+bUF1ZGlvRm9ybWF0LmZvcm1hdCA9IGZvcm1hdC5mb3JtYXQ7CisJcEluc3RhbmNlLT5tQXVkaW9Gb3JtYXQuc2FtcGxlcmF0ZSA9IGZvcm1hdC5zYW1wbGVyYXRlOworCXJldHVybiAwOworCit9CisKK2xvbmcgbWVkaWFzeW5jX2luc19nZXRfYXVkaW9mb3JtYXQoczMyIHNTeW5jSW5zSWQsIG1lZGlhc3luY19hdWRpb19mb3JtYXQqIGZvcm1hdCkgeworCW1lZGlhc3luY19pbnMqIHBJbnN0YW5jZSA9IE5VTEw7CisJczMyIGluZGV4ID0gc1N5bmNJbnNJZDsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9JTlNUQU5DRV9OVU0pCisJcmV0dXJuIC0xOworCisJcEluc3RhbmNlID0gdk1lZGlhU3luY0luc0xpc3RbaW5kZXhdOworCWlmIChwSW5zdGFuY2UgPT0gTlVMTCkKKwlyZXR1cm4gLTE7CisKKwlmb3JtYXQtPmNoYW5uZWxzID0gcEluc3RhbmNlLT5tQXVkaW9Gb3JtYXQuY2hhbm5lbHM7CisJZm9ybWF0LT5kYXRhd2lkdGggPSBwSW5zdGFuY2UtPm1BdWRpb0Zvcm1hdC5kYXRhd2lkdGg7CisJZm9ybWF0LT5mb3JtYXQgPSBwSW5zdGFuY2UtPm1BdWRpb0Zvcm1hdC5mb3JtYXQ7CisJZm9ybWF0LT5zYW1wbGVyYXRlID0gcEluc3RhbmNlLT5tQXVkaW9Gb3JtYXQuc2FtcGxlcmF0ZTsKKworCXJldHVybiAwOworfQorCitsb25nIG1lZGlhc3luY19pbnNfc2V0X3BhdXNlcmVzdW1lKHMzMiBzU3luY0luc0lkLCBpbnQgZmxhZykgeworCW1lZGlhc3luY19pbnMqIHBJbnN0YW5jZSA9IE5VTEw7CisJczMyIGluZGV4ID0gc1N5bmNJbnNJZDsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9JTlNUQU5DRV9OVU0pCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZSA9IHZNZWRpYVN5bmNJbnNMaXN0W2luZGV4XTsKKwlpZiAocEluc3RhbmNlID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZS0+bVBhdXNlUmVzdW1lRmxhZyA9IGZsYWc7CisKKwlyZXR1cm4gMDsKK30KKworbG9uZyBtZWRpYXN5bmNfaW5zX2dldF9wYXVzZXJlc3VtZShzMzIgc1N5bmNJbnNJZCwgaW50KiBmbGFnKSB7CisJbWVkaWFzeW5jX2lucyogcEluc3RhbmNlID0gTlVMTDsKKwlzMzIgaW5kZXggPSBzU3luY0luc0lkOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTUFYX0lOU1RBTkNFX05VTSkKKwkJcmV0dXJuIC0xOworCisJcEluc3RhbmNlID0gdk1lZGlhU3luY0luc0xpc3RbaW5kZXhdOworCWlmIChwSW5zdGFuY2UgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJKmZsYWcgPSBwSW5zdGFuY2UtPm1QYXVzZVJlc3VtZUZsYWc7CisJcmV0dXJuIDA7Cit9CisKK2xvbmcgbWVkaWFzeW5jX2luc19zZXRfcGNyc2xvcGUoczMyIHNTeW5jSW5zSWQsIG1lZGlhc3luY19zcGVlZCBwY3JzbG9wZSkgeworCW1lZGlhc3luY19pbnMqIHBJbnN0YW5jZSA9IE5VTEw7CisJczMyIGluZGV4ID0gc1N5bmNJbnNJZDsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9JTlNUQU5DRV9OVU0pCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZSA9IHZNZWRpYVN5bmNJbnNMaXN0W2luZGV4XTsKKwlpZiAocEluc3RhbmNlID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBJbnN0YW5jZS0+bVBjclNsb3BlLm1OdW1lcmF0b3IgPSBwY3JzbG9wZS5tTnVtZXJhdG9yOworCXBJbnN0YW5jZS0+bVBjclNsb3BlLm1EZW5vbWluYXRvciA9IHBjcnNsb3BlLm1EZW5vbWluYXRvcjsKKwlyZXR1cm4gMDsKKworfQorCitsb25nIG1lZGlhc3luY19pbnNfZ2V0X3BjcnNsb3BlKHMzMiBzU3luY0luc0lkLCBtZWRpYXN5bmNfc3BlZWQgKnBjcnNsb3BlKXsKKwltZWRpYXN5bmNfaW5zKiBwSW5zdGFuY2UgPSBOVUxMOworCXMzMiBpbmRleCA9IHNTeW5jSW5zSWQ7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBNQVhfSU5TVEFOQ0VfTlVNKQorCQlyZXR1cm4gLTE7CisKKwlwSW5zdGFuY2UgPSB2TWVkaWFTeW5jSW5zTGlzdFtpbmRleF07CisJaWYgKHBJbnN0YW5jZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlwY3JzbG9wZS0+bU51bWVyYXRvciA9IHBJbnN0YW5jZS0+bVBjclNsb3BlLm1OdW1lcmF0b3I7CisJcGNyc2xvcGUtPm1EZW5vbWluYXRvciA9IHBJbnN0YW5jZS0+bVBjclNsb3BlLm1EZW5vbWluYXRvcjsKKwlyZXR1cm4gMDsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhX3N5bmMvbWVkaWFfc3luY19jb3JlLmggYi9kcml2ZXJzL21lZGlhX3N5bmMvbWVkaWFfc3luY19jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUwNWU4OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWFfc3luYy9tZWRpYV9zeW5jX2NvcmUuaApAQCAtMCwwICsxLDIwOCBAQAorI2lmbmRlZiBNRURJQV9TWU5DX0hFQURfSEgKKyNkZWZpbmUgTUVESUFfU1lOQ19IRUFEX0hICisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvY3B1X3ZlcnNpb24uaD4KKworCisjZGVmaW5lIE1JTl9VUERBVEVUSU1FX1RIUkVTSE9MRF9VUyA1MDAwMAordHlwZWRlZiBlbnVtIHsKKwlNRURJQV9TWU5DX1ZNQVNURVIgPSAwLAorCU1FRElBX1NZTkNfQU1BU1RFUiA9IDEsCisJTUVESUFfU1lOQ19QQ1JNQVNURVIgPSAyLAorCU1FRElBX1NZTkNfTU9ERV9NQVggPSAyNTUsCit9c3luY19tb2RlOworCit0eXBlZGVmIHN0cnVjdCBzcGVlZHsKKwl1MzIgbU51bWVyYXRvcjsKKwl1MzIgbURlbm9taW5hdG9yOworfW1lZGlhc3luY19zcGVlZDsKKwordHlwZWRlZiBlbnVtIHsKKwlNRURJQVNZTkNfSU5JVCA9IDAsCisJTUVESUFTWU5DX0FVRElPX0FSUklWRUQsCisJTUVESUFTWU5DX1ZJREVPX0FSUklWRUQsCisJTUVESUFTWU5DX0FWX0FSUklWRUQsCisJTUVESUFTWU5DX0FWX1NZTkNFRCwKKwlNRURJQVNZTkNfUlVOTklORywKKwlNRURJQVNZTkNfTE9TVF9TWU5DLAorCU1FRElBU1lOQ19FWElULAorfSBhdnN5bmNfc3RhdGU7CisKK3R5cGVkZWYgZW51bSB7CisJVU5LTk9XTl9DTE9DSyA9IDAsCisJQVVESU9fQ0xPQ0ssCisJVklERU9fQ0xPQ0ssCisJUENSX0NMT0NLLAorCVJFRl9DTE9DSywKK30gbWVkaWFzeW5jX2Nsb2NrdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgZnJhbWVpbmZveworCWludDY0X3QgZnJhbWVQdHM7CisJaW50NjRfdCBmcmFtZVN5c3RlbVRpbWU7Cit9bWVkaWFzeW5jX2ZyYW1laW5mbzsKKwordHlwZWRlZiBzdHJ1Y3Qgc3luY2luZm8geworCWF2c3luY19zdGF0ZSBzdGF0ZTsKKwltZWRpYXN5bmNfZnJhbWVpbmZvIGZpcnN0QWZyYW1lSW5mbzsKKwltZWRpYXN5bmNfZnJhbWVpbmZvIGZpcnN0VmZyYW1lSW5mbzsKKwltZWRpYXN5bmNfZnJhbWVpbmZvIGZpcnN0RG14UGNySW5mbzsKKwltZWRpYXN5bmNfZnJhbWVpbmZvIHJlZkNsb2NrSW5mbzsKKwltZWRpYXN5bmNfZnJhbWVpbmZvIGN1ckF1ZGlvSW5mbzsKKwltZWRpYXN5bmNfZnJhbWVpbmZvIGN1clZpZGVvSW5mbzsKKwltZWRpYXN5bmNfZnJhbWVpbmZvIGN1ckRteFBjckluZm87Cit9bWVkaWFzeW5jX3N5bmNpbmZvOworCit0eXBlZGVmIHN0cnVjdCBhdWRpb2luZm97CisJaW50IGNhY2hlU2l6ZTsKKwlpbnQgY2FjaGVEdXJhdGlvbjsKK31tZWRpYXN5bmNfYXVkaW9pbmZvOworCit0eXBlZGVmIHN0cnVjdCB2aWRlb2luZm97CisJaW50IGNhY2hlU2l6ZTsKKwlpbnQgc3BlY2lhbFNpemVDb3VudDsKKwlpbnQgY2FjaGVEdXJhdGlvbjsKK31tZWRpYXN5bmNfdmlkZW9pbmZvOworCit0eXBlZGVmIHN0cnVjdCBhdWRpb2ZvcmFtdHsKKwlpbnQgc2FtcGxlcmF0ZTsKKwlpbnQgZGF0YXdpZHRoOworCWludCBjaGFubmVsczsKKwlpbnQgZm9ybWF0OworfW1lZGlhc3luY19hdWRpb19mb3JtYXQ7CisKK3R5cGVkZWYgZW51bQoreworCVRTX0RFTU9EID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRTIERhdGEgaW5wdXQgZnJvbSBkZW1vZAorCVRTX01FTU9SWSA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRTIERhdGEgaW5wdXQgZnJvbSBtZW1vcnkKKwlFU19NRU1PUlkgPSAyLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFUyBEYXRhIGlucHV0IGZyb20gbWVtb3J5Cit9IGFtbF9Tb3VyY2VfVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDTE9DS19QUk9WSURFUl9OT05FID0gMCwKKyAgICBDTE9DS19QUk9WSURFUl9ESVNDT05USU5VRSwKKyAgICBDTE9DS19QUk9WSURFUl9OT1JNQUwsCisgICAgQ0xPQ0tfUFJPVklERVJfTE9TVCwKKyAgICBDTE9DS19QUk9WSURFUl9SRUNPVkVSSU5HLAorfSBtZWRpYXN5bmNfY2xvY2twcm92aWRlcl9zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgaW5zdGFuY2V7CisJczMyIG1TeW5jSW5zSWQ7CisJczMyIG1EZW11eElkOworCXMzMiBtUGNyUGlkOworCXMzMiBtUGF1c2VkOworCXMzMiBtUmVmOworCXMzMiBtU3luY01vZGU7CisJczY0IG1MYXN0U3RjOworCXM2NCBtTGFzdFJlYWxUaW1lOworCXM2NCBtTGFzdE1lZGlhVGltZTsKKwlzNjQgbVRyYWNrTWVkaWFUaW1lOworCXM2NCBtU3RhcnRNZWRpYVRpbWU7CisJbWVkaWFzeW5jX3NwZWVkIG1TcGVlZDsKKwltZWRpYXN5bmNfc3BlZWQgbVBjclNsb3BlOworCXMzMiBtU3luY01vZGVDaGFuZ2U7CisJczY0IG1VcGRhdGVUaW1lVGhyZXNob2xkOworCisJaW50IG1IYXNBdWRpbzsKKwlpbnQgbUhhc1ZpZGVvOworCWludCBtdXRlX2ZsYWc7CisJaW50IG1TdGFydFRocmVzaG9sZDsKKwlpbnQgbVB0c0FkanVzdDsKKwlpbnQgbVZpZGVvV29ya01vZGU7CisJaW50IG1GY2NFbmFibGU7CisgICAgaW50IG1QYXVzZVJlc3VtZUZsYWc7CisJbWVkaWFzeW5jX2Nsb2NrdHlwZSBtU291cmNlQ2xvY2tUeXBlOworCW1lZGlhc3luY19jbG9ja3Byb3ZpZGVyX3N0YXRlIG1Tb3VyY2VDbG9ja1N0YXRlOworCW1lZGlhc3luY19hdWRpb2luZm8gbUF1ZGlvSW5mbzsKKwltZWRpYXN5bmNfdmlkZW9pbmZvIG1WaWRlb0luZm87CisJbWVkaWFzeW5jX3N5bmNpbmZvIG1TeW5jSW5mbzsKKwlhbWxfU291cmNlX1R5cGUgbVNvdXJjZVR5cGU7CisJbWVkaWFzeW5jX2F1ZGlvX2Zvcm1hdCBtQXVkaW9Gb3JtYXQ7Cit9bWVkaWFzeW5jX2luczsKKworbG9uZyBtZWRpYXN5bmNfaW5zX2FsbG9jKHMzMiBzRGVtdXhJZCwKKwkJCXMzMiBzUGNyUGlkLAorCQkJczMyICpzU3luY0luc0lkLAorCQkJbWVkaWFzeW5jX2lucyAqKnBJbnMpOworCitsb25nIG1lZGlhc3luY19pbnNfZGVsZXRlKHMzMiBzU3luY0luc0lkKTsKK2xvbmcgbWVkaWFzeW5jX2luc19iaW5kZXIoczMyIHNTeW5jSW5zSWQsCisJCQltZWRpYXN5bmNfaW5zICoqcElucyk7Citsb25nIG1lZGlhc3luY19pbnNfdW5iaW5kZXIoczMyIHNTeW5jSW5zSWQpOworbG9uZyBtZWRpYXN5bmNfaW5zX3VwZGF0ZV9tZWRpYXRpbWUoczMyIHNTeW5jSW5zSWQsCisJCQkJCXM2NCBsTWVkaWFUaW1lLAorCQkJCQlzNjQgbFN5c3RlbVRpbWUsIGJvb2wgZm9yY2VVcGRhdGUpOworbG9uZyBtZWRpYXN5bmNfaW5zX3NldF9tZWRpYXRpbWVfc3BlZWQoczMyIHNTeW5jSW5zSWQsIG1lZGlhc3luY19zcGVlZCBmU3BlZWQpOworbG9uZyBtZWRpYXN5bmNfaW5zX3NldF9wYXVzZWQoczMyIHNTeW5jSW5zSWQsIHMzMiBzUGF1c2VkKTsKK2xvbmcgbWVkaWFzeW5jX2luc19nZXRfcGF1c2VkKHMzMiBzU3luY0luc0lkLCBzMzIqIHNwUGF1c2VkKTsKK2xvbmcgbWVkaWFzeW5jX2luc19nZXRfdHJhY2ttZWRpYXRpbWUoczMyIHNTeW5jSW5zSWQsIHM2NCogbHBUcmFja01lZGlhVGltZSk7Citsb25nIG1lZGlhc3luY19pbnNfc2V0X3N5bmNtb2RlKHMzMiBzU3luY0luc0lkLCBzMzIgc1N5bmNNb2RlKTsKK2xvbmcgbWVkaWFzeW5jX2luc19nZXRfc3luY21vZGUoczMyIHNTeW5jSW5zSWQsIHMzMiAqc1N5bmNNb2RlKTsKK2xvbmcgbWVkaWFzeW5jX2luc19nZXRfbWVkaWF0aW1lX3NwZWVkKHMzMiBzU3luY0luc0lkLCBtZWRpYXN5bmNfc3BlZWQgKmZwU3BlZWQpOworbG9uZyBtZWRpYXN5bmNfaW5zX2dldF9hbmNob3JfdGltZShzMzIgc1N5bmNJbnNJZCwKKwkJCQlzNjQqIGxwTWVkaWFUaW1lLAorCQkJCXM2NCogbHBTVENUaW1lLAorCQkJCXM2NCogbHBTeXN0ZW1UaW1lKTsKK2xvbmcgbWVkaWFzeW5jX2luc19nZXRfc3lzdGVtdGltZShzMzIgc1N5bmNJbnNJZCwKKwkJCQlzNjQqIGxwU1RDLAorCQkJCXM2NCogbHBTeXN0ZW1UaW1lKTsKK2xvbmcgbWVkaWFzeW5jX2luc19nZXRfbmV4dHZzeW5jX3N5c3RlbXRpbWUoczMyIHNTeW5jSW5zSWQsIHM2NCogbHBTeXN0ZW1UaW1lKTsKK2xvbmcgbWVkaWFzeW5jX2luc19zZXRfdXBkYXRldGltZV90aHJlc2hvbGQoczMyIHNTeW5jSW5zSWQsIHM2NCBsVGltZVRocmVzaG9sZCk7Citsb25nIG1lZGlhc3luY19pbnNfZ2V0X3VwZGF0ZXRpbWVfdGhyZXNob2xkKHMzMiBzU3luY0luc0lkLCBzNjQqIGxwVGltZVRocmVzaG9sZCk7CisKK2xvbmcgbWVkaWFzeW5jX2luc19pbml0X3N5bmNpbmZvKHMzMiBzU3luY0luc0lkKTsKK2xvbmcgbWVkaWFzeW5jX2luc19zZXRfY2xvY2t0eXBlKHMzMiBzU3luY0luc0lkLCBtZWRpYXN5bmNfY2xvY2t0eXBlIHR5cGUpOworbG9uZyBtZWRpYXN5bmNfaW5zX2dldF9jbG9ja3R5cGUoczMyIHNTeW5jSW5zSWQsIG1lZGlhc3luY19jbG9ja3R5cGUqIHR5cGUpOworbG9uZyBtZWRpYXN5bmNfaW5zX3NldF9hdnN5bmNzdGF0ZShzMzIgc1N5bmNJbnNJZCwgczMyIHN0YXRlKTsKK2xvbmcgbWVkaWFzeW5jX2luc19nZXRfYXZzeW5jc3RhdGUoczMyIHNTeW5jSW5zSWQsIHMzMiogc3RhdGUpOworbG9uZyBtZWRpYXN5bmNfaW5zX3NldF9oYXNhdWRpbyhzMzIgc1N5bmNJbnNJZCwgaW50IGhhc2F1ZGlvKTsKK2xvbmcgbWVkaWFzeW5jX2luc19nZXRfaGFzYXVkaW8oczMyIHNTeW5jSW5zSWQsIGludCogaGFzYXVkaW8pOworbG9uZyBtZWRpYXN5bmNfaW5zX3NldF9oYXN2aWRlbyhzMzIgc1N5bmNJbnNJZCwgaW50IGhhc3ZpZGVvKTsKK2xvbmcgbWVkaWFzeW5jX2luc19nZXRfaGFzdmlkZW8oczMyIHNTeW5jSW5zSWQsIGludCogaGFzdmlkZW8pOworbG9uZyBtZWRpYXN5bmNfaW5zX3NldF9hdWRpb2luZm8oczMyIHNTeW5jSW5zSWQsIG1lZGlhc3luY19hdWRpb2luZm8gaW5mbyk7Citsb25nIG1lZGlhc3luY19pbnNfZ2V0X2F1ZGlvaW5mbyhzMzIgc1N5bmNJbnNJZCwgbWVkaWFzeW5jX2F1ZGlvaW5mbyogaW5mbyk7Citsb25nIG1lZGlhc3luY19pbnNfc2V0X3ZpZGVvaW5mbyhzMzIgc1N5bmNJbnNJZCwgbWVkaWFzeW5jX3ZpZGVvaW5mbyBpbmZvKTsKK2xvbmcgbWVkaWFzeW5jX2luc19zZXRfYXVkaW9tdXRlKHMzMiBzU3luY0luc0lkLCBpbnQgbXV0ZV9mbGFnKTsKK2xvbmcgbWVkaWFzeW5jX2luc19nZXRfYXVkaW9tdXRlKHMzMiBzU3luY0luc0lkLCBpbnQqIG11dGVfZmxhZyk7Citsb25nIG1lZGlhc3luY19pbnNfZ2V0X3ZpZGVvaW5mbyhzMzIgc1N5bmNJbnNJZCwgbWVkaWFzeW5jX3ZpZGVvaW5mbyogaW5mbyk7Citsb25nIG1lZGlhc3luY19pbnNfc2V0X2ZpcnN0YXVkaW9mcmFtZWluZm8oczMyIHNTeW5jSW5zSWQsIG1lZGlhc3luY19mcmFtZWluZm8gaW5mbyk7Citsb25nIG1lZGlhc3luY19pbnNfZ2V0X2ZpcnN0YXVkaW9mcmFtZWluZm8oczMyIHNTeW5jSW5zSWQsIG1lZGlhc3luY19mcmFtZWluZm8qIGluZm8pOworbG9uZyBtZWRpYXN5bmNfaW5zX3NldF9maXJzdHZpZGVvZnJhbWVpbmZvKHMzMiBzU3luY0luc0lkLCBtZWRpYXN5bmNfZnJhbWVpbmZvIGluZm8pOworbG9uZyBtZWRpYXN5bmNfaW5zX2dldF9maXJzdHZpZGVvZnJhbWVpbmZvKHMzMiBzU3luY0luc0lkLCBtZWRpYXN5bmNfZnJhbWVpbmZvKiBpbmZvKTsKK2xvbmcgbWVkaWFzeW5jX2luc19zZXRfZmlyc3RkbXhwY3JpbmZvKHMzMiBzU3luY0luc0lkLCBtZWRpYXN5bmNfZnJhbWVpbmZvIGluZm8pOworbG9uZyBtZWRpYXN5bmNfaW5zX2dldF9maXJzdGRteHBjcmluZm8oczMyIHNTeW5jSW5zSWQsIG1lZGlhc3luY19mcmFtZWluZm8qIGluZm8pOworbG9uZyBtZWRpYXN5bmNfaW5zX3NldF9yZWZjbG9ja2luZm8oczMyIHNTeW5jSW5zSWQsIG1lZGlhc3luY19mcmFtZWluZm8gaW5mbyk7Citsb25nIG1lZGlhc3luY19pbnNfZ2V0X3JlZmNsb2NraW5mbyhzMzIgc1N5bmNJbnNJZCwgbWVkaWFzeW5jX2ZyYW1laW5mbyogaW5mbyk7Citsb25nIG1lZGlhc3luY19pbnNfc2V0X2N1cmF1ZGlvZnJhbWVpbmZvKHMzMiBzU3luY0luc0lkLCBtZWRpYXN5bmNfZnJhbWVpbmZvIGluZm8pOworbG9uZyBtZWRpYXN5bmNfaW5zX2dldF9jdXJhdWRpb2ZyYW1laW5mbyhzMzIgc1N5bmNJbnNJZCwgbWVkaWFzeW5jX2ZyYW1laW5mbyogaW5mbyk7Citsb25nIG1lZGlhc3luY19pbnNfc2V0X2N1cnZpZGVvZnJhbWVpbmZvKHMzMiBzU3luY0luc0lkLCBtZWRpYXN5bmNfZnJhbWVpbmZvIGluZm8pOworbG9uZyBtZWRpYXN5bmNfaW5zX2dldF9jdXJ2aWRlb2ZyYW1laW5mbyhzMzIgc1N5bmNJbnNJZCwgbWVkaWFzeW5jX2ZyYW1laW5mbyogaW5mbyk7Citsb25nIG1lZGlhc3luY19pbnNfc2V0X2N1cmRteHBjcmluZm8oczMyIHNTeW5jSW5zSWQsIG1lZGlhc3luY19mcmFtZWluZm8gaW5mbyk7Citsb25nIG1lZGlhc3luY19pbnNfZ2V0X2N1cmRteHBjcmluZm8oczMyIHNTeW5jSW5zSWQsIG1lZGlhc3luY19mcmFtZWluZm8qIGluZm8pOworbG9uZyBtZWRpYXN5bmNfaW5zX3NldF9jbG9ja3N0YXRlKHMzMiBzU3luY0luc0lkLCBtZWRpYXN5bmNfY2xvY2twcm92aWRlcl9zdGF0ZSBzdGF0ZSk7Citsb25nIG1lZGlhc3luY19pbnNfZ2V0X2Nsb2Nrc3RhdGUoczMyIHNTeW5jSW5zSWQsIG1lZGlhc3luY19jbG9ja3Byb3ZpZGVyX3N0YXRlKiBzdGF0ZSk7Citsb25nIG1lZGlhc3luY19pbnNfc2V0X3N0YXJ0dGhyZXNob2xkKHMzMiBzU3luY0luc0lkLCBzMzIgdGhyZXNob2xkKTsKK2xvbmcgbWVkaWFzeW5jX2luc19nZXRfc3RhcnR0aHJlc2hvbGQoczMyIHNTeW5jSW5zSWQsIHMzMiogdGhyZXNob2xkKTsKK2xvbmcgbWVkaWFzeW5jX2luc19zZXRfcHRzYWRqdXN0KHMzMiBzU3luY0luc0lkLCBzMzIgYWR1anN0cHRzKTsKK2xvbmcgbWVkaWFzeW5jX2luc19nZXRfcHRzYWRqdXN0KHMzMiBzU3luY0luc0lkLCBzMzIqIGFkdWpzdHB0cyk7Citsb25nIG1lZGlhc3luY19pbnNfc2V0X3ZpZGVvd29ya21vZGUoczMyIHNTeW5jSW5zSWQsIHM2NCBtb2RlKTsKK2xvbmcgbWVkaWFzeW5jX2luc19nZXRfdmlkZW93b3JrbW9kZShzMzIgc1N5bmNJbnNJZCwgczY0KiBtb2RlKTsKK2xvbmcgbWVkaWFzeW5jX2luc19zZXRfZmNjZW5hYmxlKHMzMiBzU3luY0luc0lkLCBzNjQgZW5hYmxlKTsKK2xvbmcgbWVkaWFzeW5jX2luc19nZXRfZmNjZW5hYmxlKHMzMiBzU3luY0luc0lkLCBzNjQqIGVuYWJsZSk7Citsb25nIG1lZGlhc3luY19pbnNfc2V0X3NvdXJjZV90eXBlKHMzMiBzU3luY0luc0lkLCBhbWxfU291cmNlX1R5cGUgc291cmNlVHlwZSk7Citsb25nIG1lZGlhc3luY19pbnNfZ2V0X3NvdXJjZV90eXBlKHMzMiBzU3luY0luc0lkLCBhbWxfU291cmNlX1R5cGUqIHNvdXJjZVR5cGUpOworbG9uZyBtZWRpYXN5bmNfaW5zX3NldF9zdGFydF9tZWRpYV90aW1lKHMzMiBzU3luY0luc0lkLCBzNjQgc3RhcnRpbWUpOworbG9uZyBtZWRpYXN5bmNfaW5zX2dldF9zdGFydF9tZWRpYV90aW1lKHMzMiBzU3luY0luc0lkLCBzNjQqIHN0YXJ0dGltZSk7Citsb25nIG1lZGlhc3luY19pbnNfc2V0X2F1ZGlvZm9ybWF0KHMzMiBzU3luY0luc0lkLCBtZWRpYXN5bmNfYXVkaW9fZm9ybWF0IGZvcm1hdCk7Citsb25nIG1lZGlhc3luY19pbnNfZ2V0X2F1ZGlvZm9ybWF0KHMzMiBzU3luY0luc0lkLCBtZWRpYXN5bmNfYXVkaW9fZm9ybWF0KiBmb3JtYXQpOworbG9uZyBtZWRpYXN5bmNfaW5zX3NldF9wYXVzZXJlc3VtZShzMzIgc1N5bmNJbnNJZCwgaW50IGZsYWcpOworbG9uZyBtZWRpYXN5bmNfaW5zX2dldF9wYXVzZXJlc3VtZShzMzIgc1N5bmNJbnNJZCwgaW50KiBmbGFnKTsKK2xvbmcgbWVkaWFzeW5jX2luc19zZXRfcGNyc2xvcGUoczMyIHNTeW5jSW5zSWQsIG1lZGlhc3luY19zcGVlZCBwY3JzbG9wZSk7Citsb25nIG1lZGlhc3luY19pbnNfZ2V0X3BjcnNsb3BlKHMzMiBzU3luY0luc0lkLCBtZWRpYXN5bmNfc3BlZWQgKnBjcnNsb3BlKTsKKworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYV9zeW5jL21lZGlhX3N5bmNfZGVidWcuYyBiL2RyaXZlcnMvbWVkaWFfc3luYy9tZWRpYV9zeW5jX2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWFfc3luYy9tZWRpYV9zeW5jX2RlYnVnLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWFfc3luYy9tZWRpYV9zeW5jX2Rldi5jIGIvZHJpdmVycy9tZWRpYV9zeW5jL21lZGlhX3N5bmNfZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUwZGYyNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWFfc3luYy9tZWRpYV9zeW5jX2Rldi5jCkBAIC0wLDAgKzEsMTE2NSBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9tZWRpYS9mcmFtZV9zeW5jL3RzeW5jX3Bjci5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9jcHVfdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWFqb3IuaD4KKyNpbmNsdWRlICJtZWRpYV9zeW5jX2NvcmUuaCIKKyNpbmNsdWRlICJtZWRpYV9zeW5jX2Rldi5oIgorCisjZGVmaW5lIE1FRElBU1lOQ19ERVZJQ0VfTkFNRSAgICJtZWRpYXN5bmMiCitzdGF0aWMgc3RydWN0IGRldmljZSAqbWVkaWFzeW5jX2RldjsKKwordHlwZWRlZiBzdHJ1Y3QgYWxsb2NfcGFyYSB7CisJczMyIG1EZW11eElkOworCXMzMiBtUGNyUGlkOworfSBtZWRpYXN5bmNfYWxsb2NfcGFyYTsKKwordHlwZWRlZiBzdHJ1Y3Qgc3lzdGltZV9wYXJhIHsKKyAgICAgICBzNjQgbVN0Y1VzOworICAgICAgIHM2NCBtU3lzdGVtVGltZVVzOworfW1lZGlhc3luY19zeXN0aW1lX3BhcmE7CisKK3R5cGVkZWYgc3RydWN0IHVwZGF0ZXRpbWVfcGFyYSB7CisJaW50NjRfdCBtTWVkaWFUaW1lVXM7CisJaW50NjRfdCBtU3lzdGVtVGltZVVzOworCWJvb2wgbUZvcmNlVXBkYXRlOworfW1lZGlhc3luY191cGRhdGV0aW1lX3BhcmE7CisKK3R5cGVkZWYgc3RydWN0IGFydGhvcnRpbWVfcGFyYSB7CisJaW50NjRfdCBtTWVkaWFUaW1lVXM7CisJaW50NjRfdCBtU3lzdGVtVGltZVVzOworCWludDY0X3QgbVN0Y1RpbWVVczsKK31tZWRpYXN5bmNfYXJ0aG9ydGltZV9wYXJhOworCit0eXBlZGVmIHN0cnVjdCBwcml2X3MgeworCXMzMiBtU3luY0luc0lkOworCW1lZGlhc3luY19pbnMgKm1TeW5jSW5zOworfW1lZGlhc3luY19wcml2X3M7CisKK3N0YXRpYyBpbnQgbWVkaWFzeW5jX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJbWVkaWFzeW5jX3ByaXZfcyAqcHJpdiA9IHswfTsKKwlwcml2ID0ga3phbGxvYyhzaXplb2YobWVkaWFzeW5jX3ByaXZfcyksIEdGUF9LRVJORUwpOworCWlmIChwcml2ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXByaXYtPm1TeW5jSW5zSWQgPSAtMTsKKwlwcml2LT5tU3luY0lucyA9IE5VTEw7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gcHJpdjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZWRpYXN5bmNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlsb25nIHJldCA9IDA7CisJbWVkaWFzeW5jX3ByaXZfcyAqcHJpdiA9IChtZWRpYXN5bmNfcHJpdl9zICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmIChwcml2ID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKHByaXYtPm1TeW5jSW5zSWQgIT0gLTEpIHsKKwkJcmV0ID0gbWVkaWFzeW5jX2luc191bmJpbmRlcihwcml2LT5tU3luY0luc0lkKTsKKwkJcHJpdi0+bVN5bmNJbnNJZCA9IC0xOworCQlwcml2LT5tU3luY0lucyA9IE5VTEw7CisJfQorCWtmcmVlKHByaXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgbG9uZyBtZWRpYXN5bmNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVsb25nIGFyZykKK3sKKwlsb25nIHJldCA9IDA7CisJbWVkaWFzeW5jX3NwZWVkIFN5bmNTcGVlZCA9IHswfTsKKwltZWRpYXN5bmNfc3BlZWQgUGNyU2xvcGUgPSB7MH07CisJbWVkaWFzeW5jX2ZyYW1laW5mbyBGcmFtZUluZm8gPSB7LTEsIC0xfTsKKwltZWRpYXN5bmNfYXVkaW9pbmZvIEF1ZGlvSW5mbyA9IHswLCAwfTsKKwltZWRpYXN5bmNfdmlkZW9pbmZvIFZpZGVvSW5mbyA9IHswLCAwfTsKKwltZWRpYXN5bmNfYXVkaW9fZm9ybWF0IEF1ZGlvRm9ybWF0OworCW1lZGlhc3luY19jbG9ja3R5cGUgQ2xvY2tUeXBlID0gVU5LTk9XTl9DTE9DSzsKKwltZWRpYXN5bmNfY2xvY2twcm92aWRlcl9zdGF0ZSBzdGF0ZTsKKwlzMzIgU3luY0luc0lkID0gLTE7CisJczMyIFN5bmNQYXVzZWQgPSAwOworCXMzMiBTeW5jTW9kZSA9IC0xOworCXMzMiBTeW5jU3RhdGUgPSAwOworCXM2NCBOZXh0VnN5bmNTeXN0ZW1UaW1lID0gMDsKKwlzNjQgVHJhY2tNZWRpYVRpbWUgPSAwOworCWludCBIYXNBdWRpbyA9IC0xOworCWludCBIYXNWaWRlbyA9IC0xOworCXMzMiBTdGFydFRocmVzaG9sZCA9IDA7CisJczMyIFB0c0FkanVzdCA9IDA7CisJczY0IFZpZGVvV29ya01vZGUgPSAwOworCXM2NCBGY2NFbmFibGUgPSAwOworCWludCBtdXRlX2ZsYWcgID0gMDsKKwlpbnQgUGF1c2VSZXN1bWVGbGFnICA9IDA7CisJbWVkaWFzeW5jX3ByaXZfcyAqcHJpdiA9IChtZWRpYXN5bmNfcHJpdl9zICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCW1lZGlhc3luY19pbnMgKlN5bmNJbnMgPSBOVUxMOworCW1lZGlhc3luY19hbGxvY19wYXJhIHBhcm0gPSB7MH07CisJbWVkaWFzeW5jX2FydGhvcnRpbWVfcGFyYSBBcnRob3JUaW1lID0gezB9OworCW1lZGlhc3luY191cGRhdGV0aW1lX3BhcmEgVXBkYXRlVGltZSA9IHswfTsKKwltZWRpYXN5bmNfc3lzdGltZV9wYXJhIFN5c3RlbVRpbWUgPSB7MH07CisJYW1sX1NvdXJjZV9UeXBlIHNvdXJjZVR5cGUgPSBUU19ERU1PRDsKKwlzNjQgVXBkYXRlVGltZVRocmVzaG9sZCA9IDA7CisJczY0IFN0YXJ0TWVkaWFUaW1lID0gLTE7CisKKworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgTUVESUFTWU5DX0lPQ19JTlNUQU5DRV9BTExPQzoKKwkJCWlmIChjb3B5X2Zyb21fdXNlciAoKHZvaWQgKikmcGFybSwKKwkJCQkJCSh2b2lkICopYXJnLAorCQkJCQkJc2l6ZW9mKHBhcm0pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChtZWRpYXN5bmNfaW5zX2FsbG9jKHBhcm0ubURlbXV4SWQsCisJCQkJCQlwYXJtLm1QY3JQaWQsCisJCQkJCQkmU3luY0luc0lkLAorCQkJCQkJJlN5bmNJbnMpIDwgMCkgeworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJaWYgKFN5bmNJbnMgPT0gTlVMTCkgeworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJaWYgKHByaXYgIT0gTlVMTCkgeworCQkJCXByaXYtPm1TeW5jSW5zSWQgPSBTeW5jSW5zSWQ7CisJCQkJcHJpdi0+bVN5bmNJbnMgPSBTeW5jSW5zOworCQkJCXByaXYtPm1TeW5jSW5zLT5tUmVmKys7CisJCQl9CisKKwkJYnJlYWs7CisJCWNhc2UgTUVESUFTWU5DX0lPQ19JTlNUQU5DRV9HRVQ6CisJCQlpZiAocHJpdi0+bVN5bmNJbnMgPT0gTlVMTCkgeworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCisJCQlTeW5jSW5zSWQgPSBwcml2LT5tU3luY0luc0lkOworCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywKKwkJCQkJJlN5bmNJbnNJZCwKKwkJCQkJc2l6ZW9mKFN5bmNJbnNJZCkpKSB7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCWJyZWFrOworCQljYXNlIE1FRElBU1lOQ19JT0NfSU5TVEFOQ0VfQklOREVSOgorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopJlN5bmNJbnNJZCwKKwkJCQkJCSh2b2lkICopYXJnLAorCQkJCQkJc2l6ZW9mKFN5bmNJbnNJZCkpKSB7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCQlyZXQgPSBtZWRpYXN5bmNfaW5zX2JpbmRlcihTeW5jSW5zSWQsICZTeW5jSW5zKTsKKwkJCWlmIChTeW5jSW5zID09IE5VTEwpIHsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKworCQkJcHJpdi0+bVN5bmNJbnNJZCA9IFN5bmNJbnNJZDsKKwkJCXByaXYtPm1TeW5jSW5zID0gU3luY0luczsKKwkJYnJlYWs7CisKKwkJY2FzZSBNRURJQVNZTkNfSU9DX1VQREFURV9NRURJQVRJTUU6CisJCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKikmVXBkYXRlVGltZSwKKwkJCQkJCSh2b2lkICopYXJnLAorCQkJCQkJc2l6ZW9mKFVwZGF0ZVRpbWUpKSkgeworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJaWYgKHByaXYtPm1TeW5jSW5zID09IE5VTEwpIHsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKworCQkJcmV0ID0gbWVkaWFzeW5jX2luc191cGRhdGVfbWVkaWF0aW1lKHByaXYtPm1TeW5jSW5zSWQsCisJCQkJCQkJVXBkYXRlVGltZS5tTWVkaWFUaW1lVXMsCisJCQkJCQkJVXBkYXRlVGltZS5tU3lzdGVtVGltZVVzLAorCQkJCQkJCVVwZGF0ZVRpbWUubUZvcmNlVXBkYXRlKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBNRURJQVNZTkNfSU9DX0dFVF9NRURJQVRJTUU6CisJCQlpZiAocHJpdi0+bVN5bmNJbnMgPT0gTlVMTCkgeworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJcmV0ID0gbWVkaWFzeW5jX2luc19nZXRfYW5jaG9yX3RpbWUocHJpdi0+bVN5bmNJbnNJZCwKKwkJCQkJCQkmKEFydGhvclRpbWUubU1lZGlhVGltZVVzKSwKKwkJCQkJCQkmKEFydGhvclRpbWUubVN0Y1RpbWVVcyksCisJCQkJCQkJJihBcnRob3JUaW1lLm1TeXN0ZW1UaW1lVXMpKTsKKwkJCWlmIChyZXQgPT0gMCkgeworCQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsCisJCQkJCQkmQXJ0aG9yVGltZSwKKwkJCQkJCXNpemVvZihBcnRob3JUaW1lKSkpIHsKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJfQorCQlicmVhazsKKworCQljYXNlIE1FRElBU1lOQ19JT0NfR0VUX1NZU1RFTVRJTUU6CisKKwkJCWlmIChwcml2LT5tU3luY0lucyA9PSBOVUxMKSB7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisKKwkJCXJldCA9IG1lZGlhc3luY19pbnNfZ2V0X3N5c3RlbXRpbWUocHJpdi0+bVN5bmNJbnNJZCwKKwkJCQkJCQkmKFN5c3RlbVRpbWUubVN0Y1VzKSwKKwkJCQkJCQkmKFN5c3RlbVRpbWUubVN5c3RlbVRpbWVVcykpOworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywKKwkJCQkJCSZTeXN0ZW1UaW1lLAorCQkJCQkJc2l6ZW9mKFN5c3RlbVRpbWUpKSkgeworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQl9CisJCWJyZWFrOworCisJCWNhc2UgTUVESUFTWU5DX0lPQ19HRVRfTkVYVFZTWU5DX1RJTUU6CisJCQlpZiAocHJpdi0+bVN5bmNJbnMgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcmV0ID0gbWVkaWFzeW5jX2luc19nZXRfbmV4dHZzeW5jX3N5c3RlbXRpbWUocHJpdi0+bVN5bmNJbnNJZCwKKwkJCQkJCQkJJk5leHRWc3luY1N5c3RlbVRpbWUpOworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywKKwkJCQkJCSZOZXh0VnN5bmNTeXN0ZW1UaW1lLAorCQkJCQkJc2l6ZW9mKE5leHRWc3luY1N5c3RlbVRpbWUpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCWJyZWFrOworCisJCWNhc2UgTUVESUFTWU5DX0lPQ19TRVRfU1BFRUQ6CisJCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKikmU3luY1NwZWVkLAorCQkJCQkodm9pZCAqKWFyZywKKwkJCQkJc2l6ZW9mKFN5bmNTcGVlZCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAocHJpdi0+bVN5bmNJbnMgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcmV0ID0gbWVkaWFzeW5jX2luc19zZXRfbWVkaWF0aW1lX3NwZWVkKHByaXYtPm1TeW5jSW5zSWQsCisJCQkJCQkJCVN5bmNTcGVlZCk7CisJCWJyZWFrOworCisJCWNhc2UgTUVESUFTWU5DX0lPQ19HRVRfU1BFRUQ6CisJCQlpZiAocHJpdi0+bVN5bmNJbnMgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcmV0ID0gbWVkaWFzeW5jX2luc19nZXRfbWVkaWF0aW1lX3NwZWVkKHByaXYtPm1TeW5jSW5zSWQsCisJCQkJCQkJCSZTeW5jU3BlZWQpOworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywKKwkJCQkJCSZTeW5jU3BlZWQsCisJCQkJCQlzaXplb2YoU3luY1NwZWVkKSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQlicmVhazsKKworCQljYXNlIE1FRElBU1lOQ19JT0NfU0VUX1BBVVNFOgorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopJlN5bmNQYXVzZWQsCisJCQkJCQkodm9pZCAqKWFyZywKKwkJCQkJCXNpemVvZihTeW5jUGF1c2VkKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChwcml2LT5tU3luY0lucyA9PSBOVUxMKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXQgPSBtZWRpYXN5bmNfaW5zX3NldF9wYXVzZWQocHJpdi0+bVN5bmNJbnNJZCwKKwkJCQkJCQlTeW5jUGF1c2VkKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBNRURJQVNZTkNfSU9DX0dFVF9QQVVTRToKKwkJCWlmIChwcml2LT5tU3luY0lucyA9PSBOVUxMKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXQgPSBtZWRpYXN5bmNfaW5zX2dldF9wYXVzZWQocHJpdi0+bVN5bmNJbnNJZCwKKwkJCQkJCQkmU3luY1BhdXNlZCk7CisJCQlpZiAocmV0ID09IDApIHsKKwkJCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLAorCQkJCQkJJlN5bmNQYXVzZWQsCisJCQkJCQlzaXplb2YoU3luY1BhdXNlZCkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBNRURJQVNZTkNfSU9DX1NFVF9TWU5DTU9ERToKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZTeW5jTW9kZSwKKwkJCQkJCSh2b2lkICopYXJnLAorCQkJCQkJc2l6ZW9mKFN5bmNNb2RlKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChwcml2LT5tU3luY0lucyA9PSBOVUxMKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXQgPSBtZWRpYXN5bmNfaW5zX3NldF9zeW5jbW9kZShwcml2LT5tU3luY0luc0lkLAorCQkJCQkJCVN5bmNNb2RlKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBNRURJQVNZTkNfSU9DX0dFVF9TWU5DTU9ERToKKwkJCWlmIChwcml2LT5tU3luY0lucyA9PSBOVUxMKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXQgPSBtZWRpYXN5bmNfaW5zX2dldF9zeW5jbW9kZShwcml2LT5tU3luY0luc0lkLAorCQkJCQkJCSZTeW5jTW9kZSk7CisJCQlpZiAocmV0ID09IDApIHsKKwkJCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLAorCQkJCQkJJlN5bmNNb2RlLAorCQkJCQkJc2l6ZW9mKFN5bmNNb2RlKSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQlicmVhazsKKwkJY2FzZSBNRURJQVNZTkNfSU9DX0dFVF9UUkFDS01FRElBVElNRToKKwkJCWlmIChwcml2LT5tU3luY0lucyA9PSBOVUxMKSB7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisKKwkJCXJldCA9IG1lZGlhc3luY19pbnNfZ2V0X3RyYWNrbWVkaWF0aW1lKHByaXYtPm1TeW5jSW5zSWQsCisJCQkJCQkJCSZUcmFja01lZGlhVGltZSk7CisJCQlpZiAocmV0ID09IDApIHsKKwkJCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLAorCQkJCQkJJlRyYWNrTWVkaWFUaW1lLAorCQkJCQkJc2l6ZW9mKFRyYWNrTWVkaWFUaW1lKSkpIHsKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJfQorCQlicmVhazsKKworCQljYXNlIE1FRElBU1lOQ19JT0NfU0VUX0ZJUlNUX0FGUkFNRV9JTkZPOgorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopJkZyYW1lSW5mbywKKwkJCQkJKHZvaWQgKilhcmcsCisJCQkJCXNpemVvZihGcmFtZUluZm8pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKHByaXYtPm1TeW5jSW5zID09IE5VTEwpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldCA9IG1lZGlhc3luY19pbnNfc2V0X2ZpcnN0YXVkaW9mcmFtZWluZm8ocHJpdi0+bVN5bmNJbnNJZCwKKwkJCQkJCQkJRnJhbWVJbmZvKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBNRURJQVNZTkNfSU9DX0dFVF9GSVJTVF9BRlJBTUVfSU5GTzoKKwkJCWlmIChwcml2LT5tU3luY0lucyA9PSBOVUxMKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXQgPSBtZWRpYXN5bmNfaW5zX2dldF9maXJzdGF1ZGlvZnJhbWVpbmZvKHByaXYtPm1TeW5jSW5zSWQsCisJCQkJCQkJCSZGcmFtZUluZm8pOworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywKKwkJCQkJCSZGcmFtZUluZm8sCisJCQkJCQlzaXplb2YoRnJhbWVJbmZvKSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQlicmVhazsKKworCQljYXNlIE1FRElBU1lOQ19JT0NfU0VUX0ZJUlNUX1ZGUkFNRV9JTkZPOgorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopJkZyYW1lSW5mbywKKwkJCQkJKHZvaWQgKilhcmcsCisJCQkJCXNpemVvZihGcmFtZUluZm8pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKHByaXYtPm1TeW5jSW5zID09IE5VTEwpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldCA9IG1lZGlhc3luY19pbnNfc2V0X2ZpcnN0dmlkZW9mcmFtZWluZm8ocHJpdi0+bVN5bmNJbnNJZCwKKwkJCQkJCQkJRnJhbWVJbmZvKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBNRURJQVNZTkNfSU9DX0dFVF9GSVJTVF9WRlJBTUVfSU5GTzoKKwkJCWlmIChwcml2LT5tU3luY0lucyA9PSBOVUxMKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXQgPSBtZWRpYXN5bmNfaW5zX2dldF9maXJzdHZpZGVvZnJhbWVpbmZvKHByaXYtPm1TeW5jSW5zSWQsCisJCQkJCQkJCSZGcmFtZUluZm8pOworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywKKwkJCQkJCSZGcmFtZUluZm8sCisJCQkJCQlzaXplb2YoRnJhbWVJbmZvKSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQlicmVhazsKKworCisJCWNhc2UgTUVESUFTWU5DX0lPQ19TRVRfRklSU1RfRE1YUENSX0lORk86CisJCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKikmRnJhbWVJbmZvLAorCQkJCQkodm9pZCAqKWFyZywKKwkJCQkJc2l6ZW9mKEZyYW1lSW5mbykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAocHJpdi0+bVN5bmNJbnMgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcmV0ID0gbWVkaWFzeW5jX2luc19zZXRfZmlyc3RkbXhwY3JpbmZvKHByaXYtPm1TeW5jSW5zSWQsCisJCQkJCQkJCUZyYW1lSW5mbyk7CisJCWJyZWFrOworCisJCWNhc2UgTUVESUFTWU5DX0lPQ19HRVRfRklSU1RfRE1YUENSX0lORk86CisJCQlpZiAocHJpdi0+bVN5bmNJbnMgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcmV0ID0gbWVkaWFzeW5jX2luc19nZXRfZmlyc3RkbXhwY3JpbmZvKHByaXYtPm1TeW5jSW5zSWQsCisJCQkJCQkJCSZGcmFtZUluZm8pOworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywKKwkJCQkJCSZGcmFtZUluZm8sCisJCQkJCQlzaXplb2YoRnJhbWVJbmZvKSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQlicmVhazsKKworCQljYXNlIE1FRElBU1lOQ19JT0NfU0VUX1JFRkNMT0NLX0lORk86CisJCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKikmRnJhbWVJbmZvLAorCQkJCQkodm9pZCAqKWFyZywKKwkJCQkJc2l6ZW9mKEZyYW1lSW5mbykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAocHJpdi0+bVN5bmNJbnMgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcmV0ID0gbWVkaWFzeW5jX2luc19zZXRfcmVmY2xvY2tpbmZvKHByaXYtPm1TeW5jSW5zSWQsCisJCQkJCQkJCUZyYW1lSW5mbyk7CisJCWJyZWFrOworCisJCWNhc2UgTUVESUFTWU5DX0lPQ19HRVRfUkVGQ0xPQ0tfSU5GTzoKKwkJCWlmIChwcml2LT5tU3luY0lucyA9PSBOVUxMKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXQgPSBtZWRpYXN5bmNfaW5zX2dldF9yZWZjbG9ja2luZm8ocHJpdi0+bVN5bmNJbnNJZCwKKwkJCQkJCQkJJkZyYW1lSW5mbyk7CisJCQlpZiAocmV0ID09IDApIHsKKwkJCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLAorCQkJCQkJJkZyYW1lSW5mbywKKwkJCQkJCXNpemVvZihGcmFtZUluZm8pKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCWJyZWFrOworCisJCWNhc2UgTUVESUFTWU5DX0lPQ19TRVRfQ1VSX0FGUkFNRV9JTkZPOgorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopJkZyYW1lSW5mbywKKwkJCQkJKHZvaWQgKilhcmcsCisJCQkJCXNpemVvZihGcmFtZUluZm8pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKHByaXYtPm1TeW5jSW5zID09IE5VTEwpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldCA9IG1lZGlhc3luY19pbnNfc2V0X2N1cmF1ZGlvZnJhbWVpbmZvKHByaXYtPm1TeW5jSW5zSWQsCisJCQkJCQkJCUZyYW1lSW5mbyk7CisJCWJyZWFrOworCisJCWNhc2UgTUVESUFTWU5DX0lPQ19HRVRfQ1VSX0FGUkFNRV9JTkZPOgorCQkJaWYgKHByaXYtPm1TeW5jSW5zID09IE5VTEwpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldCA9IG1lZGlhc3luY19pbnNfZ2V0X2N1cmF1ZGlvZnJhbWVpbmZvKHByaXYtPm1TeW5jSW5zSWQsCisJCQkJCQkJCSZGcmFtZUluZm8pOworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywKKwkJCQkJCSZGcmFtZUluZm8sCisJCQkJCQlzaXplb2YoRnJhbWVJbmZvKSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQlicmVhazsKKworCQljYXNlIE1FRElBU1lOQ19JT0NfU0VUX0NVUl9WRlJBTUVfSU5GTzoKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZGcmFtZUluZm8sCisJCQkJCSh2b2lkICopYXJnLAorCQkJCQlzaXplb2YoRnJhbWVJbmZvKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChwcml2LT5tU3luY0lucyA9PSBOVUxMKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXQgPSBtZWRpYXN5bmNfaW5zX3NldF9jdXJ2aWRlb2ZyYW1laW5mbyhwcml2LT5tU3luY0luc0lkLAorCQkJCQkJCQlGcmFtZUluZm8pOworCQlicmVhazsKKworCQljYXNlIE1FRElBU1lOQ19JT0NfR0VUX0NVUl9WRlJBTUVfSU5GTzoKKwkJCWlmIChwcml2LT5tU3luY0lucyA9PSBOVUxMKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXQgPSBtZWRpYXN5bmNfaW5zX2dldF9jdXJ2aWRlb2ZyYW1laW5mbyhwcml2LT5tU3luY0luc0lkLAorCQkJCQkJCQkmRnJhbWVJbmZvKTsKKwkJCWlmIChyZXQgPT0gMCkgeworCQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsCisJCQkJCQkmRnJhbWVJbmZvLAorCQkJCQkJc2l6ZW9mKEZyYW1lSW5mbykpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBNRURJQVNZTkNfSU9DX1NFVF9DVVJfRE1YUENSX0lORk86CisJCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKikmRnJhbWVJbmZvLAorCQkJCQkodm9pZCAqKWFyZywKKwkJCQkJc2l6ZW9mKEZyYW1lSW5mbykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAocHJpdi0+bVN5bmNJbnMgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcmV0ID0gbWVkaWFzeW5jX2luc19zZXRfY3VyZG14cGNyaW5mbyhwcml2LT5tU3luY0luc0lkLAorCQkJCQkJCQlGcmFtZUluZm8pOworCQlicmVhazsKKworCQljYXNlIE1FRElBU1lOQ19JT0NfR0VUX0NVUl9ETVhQQ1JfSU5GTzoKKwkJCWlmIChwcml2LT5tU3luY0lucyA9PSBOVUxMKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXQgPSBtZWRpYXN5bmNfaW5zX2dldF9jdXJkbXhwY3JpbmZvKHByaXYtPm1TeW5jSW5zSWQsCisJCQkJCQkJCSZGcmFtZUluZm8pOworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywKKwkJCQkJCSZGcmFtZUluZm8sCisJCQkJCQlzaXplb2YoRnJhbWVJbmZvKSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQlicmVhazsKKworCQljYXNlIE1FRElBU1lOQ19JT0NfU0VUX0FVRElPX0lORk86CisJCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKikmQXVkaW9JbmZvLAorCQkJCQkodm9pZCAqKWFyZywKKwkJCQkJc2l6ZW9mKEF1ZGlvSW5mbykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAocHJpdi0+bVN5bmNJbnMgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcmV0ID0gbWVkaWFzeW5jX2luc19zZXRfYXVkaW9pbmZvKHByaXYtPm1TeW5jSW5zSWQsCisJCQkJCQkJCUF1ZGlvSW5mbyk7CisJCWJyZWFrOworCisJCWNhc2UgTUVESUFTWU5DX0lPQ19HRVRfQVVESU9fSU5GTzoKKwkJCWlmIChwcml2LT5tU3luY0lucyA9PSBOVUxMKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXQgPSBtZWRpYXN5bmNfaW5zX2dldF9hdWRpb2luZm8ocHJpdi0+bVN5bmNJbnNJZCwKKwkJCQkJCQkJJkF1ZGlvSW5mbyk7CisJCQlpZiAocmV0ID09IDApIHsKKwkJCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLAorCQkJCQkJJkF1ZGlvSW5mbywKKwkJCQkJCXNpemVvZihBdWRpb0luZm8pKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCWJyZWFrOworCisKKwkJY2FzZSBNRURJQVNZTkNfSU9DX1NFVF9BVURJT19NVVRFRkxBRzoKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZtdXRlX2ZsYWcsCisJCQkJCSh2b2lkICopYXJnLAorCQkJCQlzaXplb2YobXV0ZV9mbGFnKSkpIHsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKworCQkJaWYgKHByaXYtPm1TeW5jSW5zID09IE5VTEwpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldCA9IG1lZGlhc3luY19pbnNfc2V0X2F1ZGlvbXV0ZShwcml2LT5tU3luY0luc0lkLAorCQkJCQkJCQltdXRlX2ZsYWcpOworCQlicmVhazsKKworCQljYXNlIE1FRElBU1lOQ19JT0NfR0VUX0FVRElPX01VVEVGTEFHOgorCQkJaWYgKHByaXYtPm1TeW5jSW5zID09IE5VTEwpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldCA9IG1lZGlhc3luY19pbnNfZ2V0X2F1ZGlvbXV0ZShwcml2LT5tU3luY0luc0lkLAorCQkJCQkJCQkmbXV0ZV9mbGFnKTsKKwkJCWlmIChyZXQgPT0gMCkgeworCQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsCisJCQkJCQkmbXV0ZV9mbGFnLAorCQkJCQkJc2l6ZW9mKG11dGVfZmxhZykpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBNRURJQVNZTkNfSU9DX1NFVF9WSURFT19JTkZPOgorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopJlZpZGVvSW5mbywKKwkJCQkJKHZvaWQgKilhcmcsCisJCQkJCXNpemVvZihWaWRlb0luZm8pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKHByaXYtPm1TeW5jSW5zID09IE5VTEwpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldCA9IG1lZGlhc3luY19pbnNfc2V0X3ZpZGVvaW5mbyhwcml2LT5tU3luY0luc0lkLAorCQkJCQkJCQlWaWRlb0luZm8pOworCQlicmVhazsKKworCQljYXNlIE1FRElBU1lOQ19JT0NfR0VUX1ZJREVPX0lORk86CisJCQlpZiAocHJpdi0+bVN5bmNJbnMgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcmV0ID0gbWVkaWFzeW5jX2luc19nZXRfdmlkZW9pbmZvKHByaXYtPm1TeW5jSW5zSWQsCisJCQkJCQkJCSZWaWRlb0luZm8pOworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywKKwkJCQkJCSZWaWRlb0luZm8sCisJCQkJCQlzaXplb2YoVmlkZW9JbmZvKSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQlicmVhazsKKworCQljYXNlIE1FRElBU1lOQ19JT0NfU0VUX0hBU0FVRElPOgorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopJkhhc0F1ZGlvLAorCQkJCQkodm9pZCAqKWFyZywKKwkJCQkJc2l6ZW9mKEhhc0F1ZGlvKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChwcml2LT5tU3luY0lucyA9PSBOVUxMKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXQgPSBtZWRpYXN5bmNfaW5zX3NldF9oYXNhdWRpbyhwcml2LT5tU3luY0luc0lkLAorCQkJCQkJCQlIYXNBdWRpbyk7CisJCWJyZWFrOworCisJCWNhc2UgTUVESUFTWU5DX0lPQ19HRVRfSEFTQVVESU86CisJCQlpZiAocHJpdi0+bVN5bmNJbnMgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcmV0ID0gbWVkaWFzeW5jX2luc19nZXRfaGFzYXVkaW8ocHJpdi0+bVN5bmNJbnNJZCwKKwkJCQkJCQkJJkhhc0F1ZGlvKTsKKwkJCWlmIChyZXQgPT0gMCkgeworCQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsCisJCQkJCQkmSGFzQXVkaW8sCisJCQkJCQlzaXplb2YoSGFzQXVkaW8pKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCWJyZWFrOworCisJCWNhc2UgTUVESUFTWU5DX0lPQ19TRVRfSEFTVklERU86CisJCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKikmSGFzVmlkZW8sCisJCQkJCSh2b2lkICopYXJnLAorCQkJCQlzaXplb2YoSGFzVmlkZW8pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKHByaXYtPm1TeW5jSW5zID09IE5VTEwpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldCA9IG1lZGlhc3luY19pbnNfc2V0X2hhc3ZpZGVvKHByaXYtPm1TeW5jSW5zSWQsCisJCQkJCQkJCUhhc1ZpZGVvKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBNRURJQVNZTkNfSU9DX0dFVF9IQVNWSURFTzoKKwkJCWlmIChwcml2LT5tU3luY0lucyA9PSBOVUxMKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXQgPSBtZWRpYXN5bmNfaW5zX2dldF9oYXN2aWRlbyhwcml2LT5tU3luY0luc0lkLAorCQkJCQkJCQkmSGFzVmlkZW8pOworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywKKwkJCQkJCSZIYXNWaWRlbywKKwkJCQkJCXNpemVvZihIYXNWaWRlbykpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBNRURJQVNZTkNfSU9DX1NFVF9BVlNUQVRFOgorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopJlN5bmNTdGF0ZSwKKwkJCQkJKHZvaWQgKilhcmcsCisJCQkJCXNpemVvZihTeW5jU3RhdGUpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKHByaXYtPm1TeW5jSW5zID09IE5VTEwpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldCA9IG1lZGlhc3luY19pbnNfc2V0X2F2c3luY3N0YXRlKHByaXYtPm1TeW5jSW5zSWQsCisJCQkJCQkJCVN5bmNTdGF0ZSk7CisJCWJyZWFrOworCisJCWNhc2UgTUVESUFTWU5DX0lPQ19HRVRfQVZTVEFURToKKwkJCWlmIChwcml2LT5tU3luY0lucyA9PSBOVUxMKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXQgPSBtZWRpYXN5bmNfaW5zX2dldF9hdnN5bmNzdGF0ZShwcml2LT5tU3luY0luc0lkLAorCQkJCQkJCQkmU3luY1N0YXRlKTsKKwkJCWlmIChyZXQgPT0gMCkgeworCQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsCisJCQkJCQkmU3luY1N0YXRlLAorCQkJCQkJc2l6ZW9mKFN5bmNTdGF0ZSkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBNRURJQVNZTkNfSU9DX1NFVF9DTE9DS1RZUEU6CisJCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKikmQ2xvY2tUeXBlLAorCQkJCQkodm9pZCAqKWFyZywKKwkJCQkJc2l6ZW9mKENsb2NrVHlwZSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAocHJpdi0+bVN5bmNJbnMgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcmV0ID0gbWVkaWFzeW5jX2luc19zZXRfY2xvY2t0eXBlKHByaXYtPm1TeW5jSW5zSWQsCisJCQkJCQkJCUNsb2NrVHlwZSk7CisJCWJyZWFrOworCisJCWNhc2UgTUVESUFTWU5DX0lPQ19HRVRfQ0xPQ0tUWVBFOgorCQkJaWYgKHByaXYtPm1TeW5jSW5zID09IE5VTEwpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldCA9IG1lZGlhc3luY19pbnNfZ2V0X2Nsb2NrdHlwZShwcml2LT5tU3luY0luc0lkLAorCQkJCQkJCQkmQ2xvY2tUeXBlKTsKKwkJCWlmIChyZXQgPT0gMCkgeworCQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsCisJCQkJCQkmQ2xvY2tUeXBlLAorCQkJCQkJc2l6ZW9mKENsb2NrVHlwZSkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBNRURJQVNZTkNfSU9DX1NFVF9DTE9DS1NUQVRFOgorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopJnN0YXRlLAorCQkJCQkodm9pZCAqKWFyZywKKwkJCQkJc2l6ZW9mKHN0YXRlKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChwcml2LT5tU3luY0lucyA9PSBOVUxMKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXQgPSBtZWRpYXN5bmNfaW5zX3NldF9jbG9ja3N0YXRlKHByaXYtPm1TeW5jSW5zSWQsCisJCQkJCQkJCXN0YXRlKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBNRURJQVNZTkNfSU9DX0dFVF9DTE9DS1NUQVRFOgorCQkJaWYgKHByaXYtPm1TeW5jSW5zID09IE5VTEwpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldCA9IG1lZGlhc3luY19pbnNfZ2V0X2Nsb2Nrc3RhdGUocHJpdi0+bVN5bmNJbnNJZCwKKwkJCQkJCQkJJnN0YXRlKTsKKwkJCWlmIChyZXQgPT0gMCkgeworCQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsCisJCQkJCQkmc3RhdGUsCisJCQkJCQlzaXplb2Yoc3RhdGUpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCWJyZWFrOworCisJCWNhc2UgTUVESUFTWU5DX0lPQ19TRVRfU1RBUlRUSFJFU0hPTEQ6CisJCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKikmU3RhcnRUaHJlc2hvbGQsCisJCQkJCSh2b2lkICopYXJnLAorCQkJCQlzaXplb2YoU3RhcnRUaHJlc2hvbGQpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKHByaXYtPm1TeW5jSW5zID09IE5VTEwpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldCA9IG1lZGlhc3luY19pbnNfc2V0X3N0YXJ0dGhyZXNob2xkKHByaXYtPm1TeW5jSW5zSWQsCisJCQkJCQkJCVN0YXJ0VGhyZXNob2xkKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBNRURJQVNZTkNfSU9DX0dFVF9TVEFSVFRIUkVTSE9MRDoKKwkJCWlmIChwcml2LT5tU3luY0lucyA9PSBOVUxMKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXQgPSBtZWRpYXN5bmNfaW5zX2dldF9zdGFydHRocmVzaG9sZChwcml2LT5tU3luY0luc0lkLAorCQkJCQkJCQkmU3RhcnRUaHJlc2hvbGQpOworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywKKwkJCQkJCSZTdGFydFRocmVzaG9sZCwKKwkJCQkJCXNpemVvZihTdGFydFRocmVzaG9sZCkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBNRURJQVNZTkNfSU9DX1NFVF9QVFNBREpVU1Q6CisJCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKikmUHRzQWRqdXN0LAorCQkJCQkodm9pZCAqKWFyZywKKwkJCQkJc2l6ZW9mKFB0c0FkanVzdCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAocHJpdi0+bVN5bmNJbnMgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcmV0ID0gbWVkaWFzeW5jX2luc19zZXRfcHRzYWRqdXN0KHByaXYtPm1TeW5jSW5zSWQsCisJCQkJCQkJCVB0c0FkanVzdCk7CisJCWJyZWFrOworCisJCWNhc2UgTUVESUFTWU5DX0lPQ19HRVRfUFRTQURKVVNUOgorCQkJaWYgKHByaXYtPm1TeW5jSW5zID09IE5VTEwpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldCA9IG1lZGlhc3luY19pbnNfZ2V0X3B0c2FkanVzdChwcml2LT5tU3luY0luc0lkLAorCQkJCQkJCQkmUHRzQWRqdXN0KTsKKwkJCWlmIChyZXQgPT0gMCkgeworCQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsCisJCQkJCQkmUHRzQWRqdXN0LAorCQkJCQkJc2l6ZW9mKFB0c0FkanVzdCkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBNRURJQVNZTkNfSU9DX1NFVF9WSURFT1dPUktNT0RFOgorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopJlZpZGVvV29ya01vZGUsCisJCQkJCSh2b2lkICopYXJnLAorCQkJCQlzaXplb2YoVmlkZW9Xb3JrTW9kZSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAocHJpdi0+bVN5bmNJbnMgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcmV0ID0gbWVkaWFzeW5jX2luc19zZXRfdmlkZW93b3JrbW9kZShwcml2LT5tU3luY0luc0lkLAorCQkJCQkJCQlWaWRlb1dvcmtNb2RlKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBNRURJQVNZTkNfSU9DX0dFVF9WSURFT1dPUktNT0RFOgorCQkJaWYgKHByaXYtPm1TeW5jSW5zID09IE5VTEwpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldCA9IG1lZGlhc3luY19pbnNfZ2V0X3ZpZGVvd29ya21vZGUocHJpdi0+bVN5bmNJbnNJZCwKKwkJCQkJCQkJJlZpZGVvV29ya01vZGUpOworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywKKwkJCQkJCSZWaWRlb1dvcmtNb2RlLAorCQkJCQkJc2l6ZW9mKFZpZGVvV29ya01vZGUpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCWJyZWFrOworCisJCWNhc2UgTUVESUFTWU5DX0lPQ19TRVRfRkNDRU5BQkxFOgorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopJkZjY0VuYWJsZSwKKwkJCQkJKHZvaWQgKilhcmcsCisJCQkJCXNpemVvZihGY2NFbmFibGUpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKHByaXYtPm1TeW5jSW5zID09IE5VTEwpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldCA9IG1lZGlhc3luY19pbnNfc2V0X2ZjY2VuYWJsZShwcml2LT5tU3luY0luc0lkLAorCQkJCQkJCQlGY2NFbmFibGUpOworCQlicmVhazsKKworCQljYXNlIE1FRElBU1lOQ19JT0NfR0VUX0ZDQ0VOQUJMRToKKwkJCWlmIChwcml2LT5tU3luY0lucyA9PSBOVUxMKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXQgPSBtZWRpYXN5bmNfaW5zX2dldF9mY2NlbmFibGUocHJpdi0+bVN5bmNJbnNJZCwKKwkJCQkJCQkJJkZjY0VuYWJsZSk7CisJCQlpZiAocmV0ID09IDApIHsKKwkJCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLAorCQkJCQkJJkZjY0VuYWJsZSwKKwkJCQkJCXNpemVvZihGY2NFbmFibGUpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCWJyZWFrOworCisJCWNhc2UgTUVESUFTWU5DX0lPQ19TRVRfU09VUkNFX1RZUEU6CisJCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKikmc291cmNlVHlwZSwKKwkJCQkJKHZvaWQgKilhcmcsCisJCQkJCXNpemVvZihzb3VyY2VUeXBlKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChwcml2LT5tU3luY0lucyA9PSBOVUxMKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXQgPSBtZWRpYXN5bmNfaW5zX3NldF9zb3VyY2VfdHlwZShwcml2LT5tU3luY0luc0lkLAorCQkJCQkJCQlzb3VyY2VUeXBlKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBNRURJQVNZTkNfSU9DX0dFVF9TT1VSQ0VfVFlQRToKKwkJCWlmIChwcml2LT5tU3luY0lucyA9PSBOVUxMKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXQgPSBtZWRpYXN5bmNfaW5zX2dldF9zb3VyY2VfdHlwZShwcml2LT5tU3luY0luc0lkLAorCQkJCQkJCQkmc291cmNlVHlwZSk7CisJCQlpZiAocmV0ID09IDApIHsKKwkJCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLAorCQkJCQkJJnNvdXJjZVR5cGUsCisJCQkJCQlzaXplb2Yoc291cmNlVHlwZSkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBNRURJQVNZTkNfSU9DX1NFVF9VUERBVEVUSU1FX1RIUkVTSE9MRDoKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZVcGRhdGVUaW1lVGhyZXNob2xkLAorCQkJCQkodm9pZCAqKWFyZywKKwkJCQkJc2l6ZW9mKFVwZGF0ZVRpbWVUaHJlc2hvbGQpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKHByaXYtPm1TeW5jSW5zID09IE5VTEwpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldCA9IG1lZGlhc3luY19pbnNfc2V0X3VwZGF0ZXRpbWVfdGhyZXNob2xkKHByaXYtPm1TeW5jSW5zSWQsCisJCQkJCQkJCVVwZGF0ZVRpbWVUaHJlc2hvbGQpOworCQlicmVhazsKKworCQljYXNlIE1FRElBU1lOQ19JT0NfR0VUX1VQREFURVRJTUVfVEhSRVNIT0xEOgorCQkJaWYgKHByaXYtPm1TeW5jSW5zID09IE5VTEwpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldCA9IG1lZGlhc3luY19pbnNfZ2V0X3VwZGF0ZXRpbWVfdGhyZXNob2xkKHByaXYtPm1TeW5jSW5zSWQsCisJCQkJCQkJCSZVcGRhdGVUaW1lVGhyZXNob2xkKTsKKwkJCWlmIChyZXQgPT0gMCkgeworCQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsCisJCQkJCQkmVXBkYXRlVGltZVRocmVzaG9sZCwKKwkJCQkJCXNpemVvZihVcGRhdGVUaW1lVGhyZXNob2xkKSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQlicmVhazsKKwkJY2FzZSBNRURJQVNZTkNfSU9DX1NFVF9TVEFSVF9NRURJQV9USU1FOgorCQkJaWYgKHByaXYtPm1TeW5jSW5zID09IE5VTEwpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZTdGFydE1lZGlhVGltZSwKKwkJCQkodm9pZCAqKWFyZywKKwkJCQlzaXplb2YoU3RhcnRNZWRpYVRpbWUpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0ID0gbWVkaWFzeW5jX2luc19zZXRfc3RhcnRfbWVkaWFfdGltZShwcml2LT5tU3luY0luc0lkLCBTdGFydE1lZGlhVGltZSk7CisJCWJyZWFrOworCisJCWNhc2UgTUVESUFTWU5DX0lPQ19HRVRfU1RBUlRfTUVESUFfVElNRToKKwkJCWlmIChwcml2LT5tU3luY0lucyA9PSBOVUxMKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXQgPSBtZWRpYXN5bmNfaW5zX2dldF9zdGFydF9tZWRpYV90aW1lKHByaXYtPm1TeW5jSW5zSWQsICZTdGFydE1lZGlhVGltZSk7CisJCQlpZiAocmV0ID09IDApIHsKKwkJCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLAorCQkJCQkmU3RhcnRNZWRpYVRpbWUsCisJCQkJCXNpemVvZihTdGFydE1lZGlhVGltZSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQlicmVhazsKKworCQljYXNlIE1FRElBU1lOQ19JT0NfU0VUX0FVRElPX0ZPUk1BVDoKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZBdWRpb0Zvcm1hdCwKKwkJCQkJKHZvaWQgKilhcmcsCisJCQkJCXNpemVvZihBdWRpb0Zvcm1hdCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAocHJpdi0+bVN5bmNJbnMgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcmV0ID0gbWVkaWFzeW5jX2luc19zZXRfYXVkaW9mb3JtYXQocHJpdi0+bVN5bmNJbnNJZCwKKwkJCQkJCQkJQXVkaW9Gb3JtYXQpOworCQlicmVhazsKKworCQljYXNlIE1FRElBU1lOQ19JT0NfR0VUX0FVRElPX0ZPUk1BVDoKKwkJCWlmIChwcml2LT5tU3luY0lucyA9PSBOVUxMKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXQgPSBtZWRpYXN5bmNfaW5zX2dldF9hdWRpb2Zvcm1hdChwcml2LT5tU3luY0luc0lkLAorCQkJCQkJCQkmQXVkaW9Gb3JtYXQpOworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywKKwkJCQkJCSZBdWRpb0Zvcm1hdCwKKwkJCQkJCXNpemVvZihBdWRpb0Zvcm1hdCkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBNRURJQVNZTkNfSU9DX1NFVF9QQVVTRVJFU1VNRV9GTEFHOgorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopJlBhdXNlUmVzdW1lRmxhZywKKwkJCQkJKHZvaWQgKilhcmcsCisJCQkJCXNpemVvZihQYXVzZVJlc3VtZUZsYWcpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKHByaXYtPm1TeW5jSW5zID09IE5VTEwpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldCA9IG1lZGlhc3luY19pbnNfc2V0X3BhdXNlcmVzdW1lKHByaXYtPm1TeW5jSW5zSWQsCisJCQkJCQkJCVBhdXNlUmVzdW1lRmxhZyk7CisJCWJyZWFrOworCisJCWNhc2UgTUVESUFTWU5DX0lPQ19HRVRfUEFVU0VSRVNVTUVfRkxBRzoKKwkJCWlmIChwcml2LT5tU3luY0lucyA9PSBOVUxMKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXQgPSBtZWRpYXN5bmNfaW5zX2dldF9wYXVzZXJlc3VtZShwcml2LT5tU3luY0luc0lkLAorCQkJCQkJCQkmUGF1c2VSZXN1bWVGbGFnKTsKKwkJCWlmIChyZXQgPT0gMCkgeworCQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsCisJCQkJCQkmUGF1c2VSZXN1bWVGbGFnLAorCQkJCQkJc2l6ZW9mKFBhdXNlUmVzdW1lRmxhZykpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBNRURJQVNZTkNfSU9DX1NFVF9QQ1JTTE9QRToKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZQY3JTbG9wZSwKKwkJCQkJKHZvaWQgKilhcmcsCisJCQkJCXNpemVvZihQY3JTbG9wZSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAocHJpdi0+bVN5bmNJbnMgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcmV0ID0gbWVkaWFzeW5jX2luc19zZXRfcGNyc2xvcGUocHJpdi0+bVN5bmNJbnNJZCwKKwkJCQkJCQkJUGNyU2xvcGUpOworCQlicmVhazsKKworCQljYXNlIE1FRElBU1lOQ19JT0NfR0VUX1BDUlNMT1BFOgorCQkJaWYgKHByaXYtPm1TeW5jSW5zID09IE5VTEwpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldCA9IG1lZGlhc3luY19pbnNfZ2V0X3BjcnNsb3BlKHByaXYtPm1TeW5jSW5zSWQsCisJCQkJCQkJCSZQY3JTbG9wZSk7CisJCQlpZiAocmV0ID09IDApIHsKKwkJCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLAorCQkJCQkJJlBjclNsb3BlLAorCQkJCQkJc2l6ZW9mKFBjclNsb3BlKSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcHJfaW5mbygiaW52YWxpZCBjbWQ6JWRcbiIsIGNtZCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdGF0aWMgbG9uZyBtZWRpYXN5bmNfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bG9uZyBhcmcpCit7CisJbG9uZyByZXQgPSAwOworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgTUVESUFTWU5DX0lPQ19JTlNUQU5DRV9BTExPQzoKKwkJY2FzZSBNRURJQVNZTkNfSU9DX0lOU1RBTkNFX0dFVDoKKwkJY2FzZSBNRURJQVNZTkNfSU9DX0lOU1RBTkNFX0JJTkRFUjoKKwkJY2FzZSBNRURJQVNZTkNfSU9DX1VQREFURV9NRURJQVRJTUU6CisJCWNhc2UgTUVESUFTWU5DX0lPQ19HRVRfTUVESUFUSU1FOgorCQljYXNlIE1FRElBU1lOQ19JT0NfR0VUX1NZU1RFTVRJTUU6CisJCWNhc2UgTUVESUFTWU5DX0lPQ19HRVRfTkVYVFZTWU5DX1RJTUU6CisJCWNhc2UgTUVESUFTWU5DX0lPQ19TRVRfU1BFRUQ6CisJCWNhc2UgTUVESUFTWU5DX0lPQ19HRVRfU1BFRUQ6CisJCWNhc2UgTUVESUFTWU5DX0lPQ19TRVRfUEFVU0U6CisJCWNhc2UgTUVESUFTWU5DX0lPQ19HRVRfUEFVU0U6CisJCWNhc2UgTUVESUFTWU5DX0lPQ19TRVRfU1lOQ01PREU6CisJCWNhc2UgTUVESUFTWU5DX0lPQ19HRVRfU1lOQ01PREU6CisJCWNhc2UgTUVESUFTWU5DX0lPQ19HRVRfVFJBQ0tNRURJQVRJTUU6CisJCWNhc2UgTUVESUFTWU5DX0lPQ19TRVRfRklSU1RfQUZSQU1FX0lORk86CisJCWNhc2UgTUVESUFTWU5DX0lPQ19HRVRfRklSU1RfQUZSQU1FX0lORk86CisJCWNhc2UgTUVESUFTWU5DX0lPQ19TRVRfRklSU1RfVkZSQU1FX0lORk86CisJCWNhc2UgTUVESUFTWU5DX0lPQ19HRVRfRklSU1RfVkZSQU1FX0lORk86CisJCWNhc2UgTUVESUFTWU5DX0lPQ19TRVRfRklSU1RfRE1YUENSX0lORk86CisJCWNhc2UgTUVESUFTWU5DX0lPQ19HRVRfRklSU1RfRE1YUENSX0lORk86CisJCWNhc2UgTUVESUFTWU5DX0lPQ19TRVRfUkVGQ0xPQ0tfSU5GTzoKKwkJY2FzZSBNRURJQVNZTkNfSU9DX0dFVF9SRUZDTE9DS19JTkZPOgorCQljYXNlIE1FRElBU1lOQ19JT0NfU0VUX0NVUl9BRlJBTUVfSU5GTzoKKwkJY2FzZSBNRURJQVNZTkNfSU9DX0dFVF9DVVJfQUZSQU1FX0lORk86CisJCWNhc2UgTUVESUFTWU5DX0lPQ19TRVRfQ1VSX1ZGUkFNRV9JTkZPOgorCQljYXNlIE1FRElBU1lOQ19JT0NfR0VUX0NVUl9WRlJBTUVfSU5GTzoKKwkJY2FzZSBNRURJQVNZTkNfSU9DX1NFVF9DVVJfRE1YUENSX0lORk86CisJCWNhc2UgTUVESUFTWU5DX0lPQ19HRVRfQ1VSX0RNWFBDUl9JTkZPOgorCQljYXNlIE1FRElBU1lOQ19JT0NfU0VUX0FVRElPX0lORk86CisJCWNhc2UgTUVESUFTWU5DX0lPQ19HRVRfQVVESU9fSU5GTzoKKwkJY2FzZSBNRURJQVNZTkNfSU9DX1NFVF9WSURFT19JTkZPOgorCQljYXNlIE1FRElBU1lOQ19JT0NfR0VUX1ZJREVPX0lORk86CisJCWNhc2UgTUVESUFTWU5DX0lPQ19TRVRfQVZTVEFURToKKwkJY2FzZSBNRURJQVNZTkNfSU9DX0dFVF9BVlNUQVRFOgorCQljYXNlIE1FRElBU1lOQ19JT0NfU0VUX0hBU0FVRElPOgorCQljYXNlIE1FRElBU1lOQ19JT0NfR0VUX0hBU0FVRElPOgorCQljYXNlIE1FRElBU1lOQ19JT0NfU0VUX0hBU1ZJREVPOgorCQljYXNlIE1FRElBU1lOQ19JT0NfR0VUX0hBU1ZJREVPOgorCQljYXNlIE1FRElBU1lOQ19JT0NfR0VUX0NMT0NLVFlQRToKKwkJY2FzZSBNRURJQVNZTkNfSU9DX1NFVF9DTE9DS1RZUEU6CisJCWNhc2UgTUVESUFTWU5DX0lPQ19HRVRfQ0xPQ0tTVEFURToKKwkJY2FzZSBNRURJQVNZTkNfSU9DX1NFVF9DTE9DS1NUQVRFOgorCQljYXNlIE1FRElBU1lOQ19JT0NfU0VUX1NUQVJUVEhSRVNIT0xEOgorCQljYXNlIE1FRElBU1lOQ19JT0NfR0VUX1NUQVJUVEhSRVNIT0xEOgorCQljYXNlIE1FRElBU1lOQ19JT0NfU0VUX1BUU0FESlVTVDoKKwkJY2FzZSBNRURJQVNZTkNfSU9DX0dFVF9QVFNBREpVU1Q6CisJCWNhc2UgTUVESUFTWU5DX0lPQ19TRVRfVklERU9XT1JLTU9ERToKKwkJY2FzZSBNRURJQVNZTkNfSU9DX0dFVF9WSURFT1dPUktNT0RFOgorCQljYXNlIE1FRElBU1lOQ19JT0NfU0VUX0ZDQ0VOQUJMRToKKwkJY2FzZSBNRURJQVNZTkNfSU9DX0dFVF9GQ0NFTkFCTEU6CisJCWNhc2UgTUVESUFTWU5DX0lPQ19TRVRfQVVESU9fTVVURUZMQUc6CisJCWNhc2UgTUVESUFTWU5DX0lPQ19HRVRfQVVESU9fTVVURUZMQUc6CisJCWNhc2UgTUVESUFTWU5DX0lPQ19TRVRfU09VUkNFX1RZUEU6CisJCWNhc2UgTUVESUFTWU5DX0lPQ19HRVRfU09VUkNFX1RZUEU6CisJCWNhc2UgTUVESUFTWU5DX0lPQ19TRVRfVVBEQVRFVElNRV9USFJFU0hPTEQ6CisJCWNhc2UgTUVESUFTWU5DX0lPQ19HRVRfVVBEQVRFVElNRV9USFJFU0hPTEQ6CisJCWNhc2UgTUVESUFTWU5DX0lPQ19TRVRfU1RBUlRfTUVESUFfVElNRToKKwkJY2FzZSBNRURJQVNZTkNfSU9DX0dFVF9TVEFSVF9NRURJQV9USU1FOgorCQljYXNlIE1FRElBU1lOQ19JT0NfU0VUX0FVRElPX0ZPUk1BVDoKKwkJY2FzZSBNRURJQVNZTkNfSU9DX0dFVF9BVURJT19GT1JNQVQ6CisJCWNhc2UgTUVESUFTWU5DX0lPQ19TRVRfUEFVU0VSRVNVTUVfRkxBRzoKKwkJY2FzZSBNRURJQVNZTkNfSU9DX0dFVF9QQVVTRVJFU1VNRV9GTEFHOgorCQljYXNlIE1FRElBU1lOQ19JT0NfU0VUX1BDUlNMT1BFOgorCQljYXNlIE1FRElBU1lOQ19JT0NfR0VUX1BDUlNMT1BFOgorCisJCQlyZXR1cm4gbWVkaWFzeW5jX2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1lZGlhc3luY19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gbWVkaWFzeW5jX29wZW4sCisJLnJlbGVhc2UgPSBtZWRpYXN5bmNfcmVsZWFzZSwKKwkudW5sb2NrZWRfaW9jdGwgPSBtZWRpYXN5bmNfaW9jdGwsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwgPSBtZWRpYXN5bmNfY29tcGF0X2lvY3RsLAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbWVkaWFzeW5jX2NsYXNzX2F0dHJzW10gPSB7CisJTlVMTAorfTsKKworQVRUUklCVVRFX0dST1VQUyhtZWRpYXN5bmNfY2xhc3MpOworCitzdGF0aWMgc3RydWN0IGNsYXNzIG1lZGlhc3luY19jbGFzcyA9IHsKKwkubmFtZSA9ICJtZWRpYXN5bmMiLAorCS5jbGFzc19ncm91cHMgPSBtZWRpYXN5bmNfY2xhc3NfZ3JvdXBzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbWVkaWFzeW5jX21vZHVsZV9pbml0KHZvaWQpCit7CisJaW50IHI7CisKKwlyID0gY2xhc3NfcmVnaXN0ZXIoJm1lZGlhc3luY19jbGFzcyk7CisKKwlpZiAocikgeworCQlwcl9lcnIoIm1lZGlhc3luYyBjbGFzcyBjcmVhdGUgZmFpbC5cbiIpOworCQlyZXR1cm4gcjsKKwl9CisKKwkvKiBjcmVhdGUgdHN5bmMgZGV2aWNlICovCisJciA9IHJlZ2lzdGVyX2NocmRldihNRURJQVNZTkNfTUFKT1IsICJtZWRpYXN5bmMiLCAmbWVkaWFzeW5jX2ZvcHMpOworCWlmIChyIDwgMCkgeworCQlwcl9pbmZvKCJDYW4ndCByZWdpc3RlciBtYWpvciBmb3IgdHN5bmNcbiIpOworCQlnb3RvIGVycjI7CisJfQorCisJbWVkaWFzeW5jX2RldiA9IGRldmljZV9jcmVhdGUoJm1lZGlhc3luY19jbGFzcywgTlVMTCwKKwkJCQlNS0RFVihNRURJQVNZTkNfTUFKT1IsIDApLCBOVUxMLCBNRURJQVNZTkNfREVWSUNFX05BTUUpOworCisJaWYgKElTX0VSUihtZWRpYXN5bmNfZGV2KSkgeworCQlwcl9lcnIoIkNhbid0IGNyZWF0ZSBtZWRpYXN5bmNfZGV2IGRldmljZVxuIik7CisJCWdvdG8gZXJyMTsKKwl9CisJcmV0dXJuIDA7CisKK2VycjE6CisJdW5yZWdpc3Rlcl9jaHJkZXYoTUVESUFTWU5DX01BSk9SLCAibWVkaWFzeW5jIik7CitlcnIyOgorCWNsYXNzX3VucmVnaXN0ZXIoJm1lZGlhc3luY19jbGFzcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1lZGlhc3luY19tb2R1bGVfZXhpdCh2b2lkKQoreworCWRldmljZV9kZXN0cm95KCZtZWRpYXN5bmNfY2xhc3MsIE1LREVWKE1FRElBU1lOQ19NQUpPUiwgMCkpOworCXVucmVnaXN0ZXJfY2hyZGV2KE1FRElBU1lOQ19NQUpPUiwgIm1lZGlhc3luYyIpOworCWNsYXNzX3VucmVnaXN0ZXIoJm1lZGlhc3luY19jbGFzcyk7Cit9CisKK21vZHVsZV9pbml0KG1lZGlhc3luY19tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChtZWRpYXN5bmNfbW9kdWxlX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFNTE9HSUMgbWVkaWEgc3luYyBtYW5hZ2VtZW50IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTGlmZW5nIENhbyA8bGlmZW5nLmNhb0BhbWxvZ2ljLmNvbT4iKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYV9zeW5jL21lZGlhX3N5bmNfZGV2LmggYi9kcml2ZXJzL21lZGlhX3N5bmMvbWVkaWFfc3luY19kZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmMyOGU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYV9zeW5jL21lZGlhX3N5bmNfZGV2LmgKQEAgLTAsMCArMSw3MiBAQAorI2lmbmRlZiBNRURJQV9TWU5DX0RFVl9IRUFEX0hICisjZGVmaW5lIE1FRElBX1NZTkNfREVWX0hFQURfSEgKKworI2RlZmluZSBNRURJQVNZTkNfSU9DX01BR0lDICdNJworCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfSU5TVEFOQ0VfQUxMT0MgX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDAxLCBpbnQpCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfSU5TVEFOQ0VfR0VUICAgX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDAyLCBpbnQpCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfSU5TVEFOQ0VfQklOREVSIF9JT1coTUVESUFTWU5DX0lPQ19NQUdJQywgMHgwMywgaW50KQorI2RlZmluZSBNRURJQVNZTkNfSU9DX1VQREFURV9NRURJQVRJTUUgX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDA0LCBpbnQpCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfR0VUX01FRElBVElNRSBfSU9XKE1FRElBU1lOQ19JT0NfTUFHSUMsIDB4MDUsIGludCkKKyNkZWZpbmUgTUVESUFTWU5DX0lPQ19HRVRfU1lTVEVNVElNRSBfSU9XKE1FRElBU1lOQ19JT0NfTUFHSUMsIDB4MDYsIGludCkKKyNkZWZpbmUgTUVESUFTWU5DX0lPQ19HRVRfTkVYVFZTWU5DX1RJTUUgX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDA3LCBpbnQpCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfU0VUX1NQRUVEIF9JT1coTUVESUFTWU5DX0lPQ19NQUdJQywgMHgwOCwgaW50KQorI2RlZmluZSBNRURJQVNZTkNfSU9DX0dFVF9TUEVFRCBfSU9XKE1FRElBU1lOQ19JT0NfTUFHSUMsIDB4MDksIGludCkKKyNkZWZpbmUgTUVESUFTWU5DX0lPQ19TRVRfUEFVU0UgX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDBBLCBpbnQpCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfR0VUX1BBVVNFIF9JT1coTUVESUFTWU5DX0lPQ19NQUdJQywgMHgwQiwgaW50KQorI2RlZmluZSBNRURJQVNZTkNfSU9DX1NFVF9TWU5DTU9ERSBfSU9XKE1FRElBU1lOQ19JT0NfTUFHSUMsIDB4MEMsIGludCkKKyNkZWZpbmUgTUVESUFTWU5DX0lPQ19HRVRfU1lOQ01PREUgX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDBELCBpbnQpCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfR0VUX1RSQUNLTUVESUFUSU1FIF9JT1coTUVESUFTWU5DX0lPQ19NQUdJQywgMHgwRSwgaW50KQorCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfU0VUX0ZJUlNUX0FGUkFNRV9JTkZPIF9JT1coTUVESUFTWU5DX0lPQ19NQUdJQywgMHgwRiwgaW50KQorI2RlZmluZSBNRURJQVNZTkNfSU9DX0dFVF9GSVJTVF9BRlJBTUVfSU5GTyBfSU9XKE1FRElBU1lOQ19JT0NfTUFHSUMsIDB4MTAsIGludCkKKyNkZWZpbmUgTUVESUFTWU5DX0lPQ19TRVRfRklSU1RfVkZSQU1FX0lORk8gX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDExLCBpbnQpCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfR0VUX0ZJUlNUX1ZGUkFNRV9JTkZPIF9JT1coTUVESUFTWU5DX0lPQ19NQUdJQywgMHgxMiwgaW50KQorI2RlZmluZSBNRURJQVNZTkNfSU9DX1NFVF9GSVJTVF9ETVhQQ1JfSU5GTyBfSU9XKE1FRElBU1lOQ19JT0NfTUFHSUMsIDB4MTMsIGludCkKKyNkZWZpbmUgTUVESUFTWU5DX0lPQ19HRVRfRklSU1RfRE1YUENSX0lORk8gX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDE0LCBpbnQpCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfU0VUX1JFRkNMT0NLX0lORk8gX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDE1LCBpbnQpCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfR0VUX1JFRkNMT0NLX0lORk8gX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDE2LCBpbnQpCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfU0VUX0NVUl9BRlJBTUVfSU5GTyBfSU9XKE1FRElBU1lOQ19JT0NfTUFHSUMsIDB4MTcsIGludCkKKyNkZWZpbmUgTUVESUFTWU5DX0lPQ19HRVRfQ1VSX0FGUkFNRV9JTkZPIF9JT1coTUVESUFTWU5DX0lPQ19NQUdJQywgMHgxOCwgaW50KQorI2RlZmluZSBNRURJQVNZTkNfSU9DX1NFVF9DVVJfVkZSQU1FX0lORk8gX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDE5LCBpbnQpCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfR0VUX0NVUl9WRlJBTUVfSU5GTyBfSU9XKE1FRElBU1lOQ19JT0NfTUFHSUMsIDB4MUEsIGludCkKKyNkZWZpbmUgTUVESUFTWU5DX0lPQ19TRVRfQ1VSX0RNWFBDUl9JTkZPIF9JT1coTUVESUFTWU5DX0lPQ19NQUdJQywgMHgxQiwgaW50KQorI2RlZmluZSBNRURJQVNZTkNfSU9DX0dFVF9DVVJfRE1YUENSX0lORk8gX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDFDLCBpbnQpCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfU0VUX0FVRElPX0lORk8gX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDFELCBpbnQpCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfR0VUX0FVRElPX0lORk8gX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDFFLCBpbnQpCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfU0VUX1ZJREVPX0lORk8gX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDFGLCBpbnQpCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfR0VUX1ZJREVPX0lORk8gX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDIwLCBpbnQpCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfU0VUX0FWU1RBVEUgX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDIxLCBpbnQpCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfR0VUX0FWU1RBVEUgX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDIyLCBpbnQpCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfU0VUX0hBU0FVRElPIF9JT1coTUVESUFTWU5DX0lPQ19NQUdJQywgMHgyMywgaW50KQorI2RlZmluZSBNRURJQVNZTkNfSU9DX0dFVF9IQVNBVURJTyBfSU9XKE1FRElBU1lOQ19JT0NfTUFHSUMsIDB4MjQsIGludCkKKyNkZWZpbmUgTUVESUFTWU5DX0lPQ19TRVRfSEFTVklERU8gX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDI1LCBpbnQpCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfR0VUX0hBU1ZJREVPIF9JT1coTUVESUFTWU5DX0lPQ19NQUdJQywgMHgyNiwgaW50KQorI2RlZmluZSBNRURJQVNZTkNfSU9DX1NFVF9DTE9DS1RZUEUgX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDI3LCBpbnQpCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfR0VUX0NMT0NLVFlQRSBfSU9XKE1FRElBU1lOQ19JT0NfTUFHSUMsIDB4MjgsIGludCkKKyNkZWZpbmUgTUVESUFTWU5DX0lPQ19TRVRfQ0xPQ0tTVEFURSBfSU9XKE1FRElBU1lOQ19JT0NfTUFHSUMsIDB4MjksIGludCkKKyNkZWZpbmUgTUVESUFTWU5DX0lPQ19HRVRfQ0xPQ0tTVEFURSBfSU9XKE1FRElBU1lOQ19JT0NfTUFHSUMsIDB4MkEsIGludCkKKyNkZWZpbmUgTUVESUFTWU5DX0lPQ19TRVRfU1RBUlRUSFJFU0hPTEQgX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDJCLCBpbnQpCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfR0VUX1NUQVJUVEhSRVNIT0xEIF9JT1coTUVESUFTWU5DX0lPQ19NQUdJQywgMHgyQywgaW50KQorI2RlZmluZSBNRURJQVNZTkNfSU9DX1NFVF9QVFNBREpVU1QgX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDJELCBpbnQpCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfR0VUX1BUU0FESlVTVCBfSU9XKE1FRElBU1lOQ19JT0NfTUFHSUMsIDB4MkUsIGludCkKKyNkZWZpbmUgTUVESUFTWU5DX0lPQ19TRVRfVklERU9XT1JLTU9ERSBfSU9XKE1FRElBU1lOQ19JT0NfTUFHSUMsIDB4MkYsIGludCkKKyNkZWZpbmUgTUVESUFTWU5DX0lPQ19HRVRfVklERU9XT1JLTU9ERSBfSU9XKE1FRElBU1lOQ19JT0NfTUFHSUMsIDB4MzAsIGludCkKKyNkZWZpbmUgTUVESUFTWU5DX0lPQ19TRVRfRkNDRU5BQkxFIF9JT1coTUVESUFTWU5DX0lPQ19NQUdJQywgMHgzMSwgaW50KQorI2RlZmluZSBNRURJQVNZTkNfSU9DX0dFVF9GQ0NFTkFCTEUgX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDMyLCBpbnQpCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfU0VUX0FVRElPX01VVEVGTEFHIF9JT1coTUVESUFTWU5DX0lPQ19NQUdJQywgMHgzMywgaW50KQorI2RlZmluZSBNRURJQVNZTkNfSU9DX0dFVF9BVURJT19NVVRFRkxBRyBfSU9XKE1FRElBU1lOQ19JT0NfTUFHSUMsIDB4MzQsIGludCkKKyNkZWZpbmUgTUVESUFTWU5DX0lPQ19TRVRfU09VUkNFX1RZUEUgX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDM1LCBpbnQpCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfR0VUX1NPVVJDRV9UWVBFIF9JT1coTUVESUFTWU5DX0lPQ19NQUdJQywgMHgzNiwgaW50KQorI2RlZmluZSBNRURJQVNZTkNfSU9DX1NFVF9VUERBVEVUSU1FX1RIUkVTSE9MRCBfSU9XKE1FRElBU1lOQ19JT0NfTUFHSUMsIDB4MzcsIGludCkKKyNkZWZpbmUgTUVESUFTWU5DX0lPQ19HRVRfVVBEQVRFVElNRV9USFJFU0hPTEQgX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDM4LCBpbnQpCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfU0VUX1NUQVJUX01FRElBX1RJTUUgX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDM5LCBpbnQpCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfR0VUX1NUQVJUX01FRElBX1RJTUUgX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDNBLCBpbnQpCisjZGVmaW5lIE1FRElBU1lOQ19JT0NfU0VUX0FVRElPX0ZPUk1BVCBfSU9XKE1FRElBU1lOQ19JT0NfTUFHSUMsIDB4M0IsIGludCkKKyNkZWZpbmUgTUVESUFTWU5DX0lPQ19HRVRfQVVESU9fRk9STUFUIF9JT1coTUVESUFTWU5DX0lPQ19NQUdJQywgMHgzQywgaW50KQorI2RlZmluZSBNRURJQVNZTkNfSU9DX1NFVF9QQVVTRVJFU1VNRV9GTEFHIF9JT1coTUVESUFTWU5DX0lPQ19NQUdJQywgMHgzRCwgaW50KQorI2RlZmluZSBNRURJQVNZTkNfSU9DX0dFVF9QQVVTRVJFU1VNRV9GTEFHIF9JT1coTUVESUFTWU5DX0lPQ19NQUdJQywgMHgzRSwgaW50KQorI2RlZmluZSBNRURJQVNZTkNfSU9DX1NFVF9QQ1JTTE9QRSBfSU9XKE1FRElBU1lOQ19JT0NfTUFHSUMsIDB4M0YsIGludCkKKyNkZWZpbmUgTUVESUFTWU5DX0lPQ19HRVRfUENSU0xPUEUgX0lPVyhNRURJQVNZTkNfSU9DX01BR0lDLCAweDQwLCBpbnQpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvTWFrZWZpbGUgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTdkNWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvTWFrZWZpbGUKQEAgLTAsMCArMSwyNiBAQAorb2JqLW0JKz0JIHN0cmVhbV9pbnB1dC5vCisKK3N0cmVhbV9pbnB1dC1vYmpzCSs9CWFtcG9ydHMvYW1zdHJlYW0ubworc3RyZWFtX2lucHV0LW9ianMJKz0JYW1wb3J0cy9hZGVjLm8KK3N0cmVhbV9pbnB1dC1vYmpzCSs9CWFtcG9ydHMvdGhyZWFkX3J3Lm8KK3N0cmVhbV9pbnB1dC1vYmpzCSs9CWFtcG9ydHMvc3RyZWFtYnVmLm8KK3N0cmVhbV9pbnB1dC1vYmpzCSs9CWFtcG9ydHMvc3RyZWFtX2J1ZmZlcl9iYXNlLm8KK3N0cmVhbV9pbnB1dC1vYmpzCSs9CWFtcG9ydHMvc3RyZWFtX2J1ZmZlcl9pbnRlcmZhY2UubworCitzdHJlYW1faW5wdXQtb2JqcwkrPQlwYXJzZXIvZXNwYXJzZXIubworc3RyZWFtX2lucHV0LW9ianMJKz0JcGFyc2VyL3RzZGVtdXgubworc3RyZWFtX2lucHV0LW9ianMJKz0JcGFyc2VyL3BzcGFyc2VyLm8KK3N0cmVhbV9pbnB1dC1vYmpzCSs9CXBhcnNlci9ybXBhcnNlci5vCitzdHJlYW1faW5wdXQtb2JqcwkrPQlzdWJ0aXRsZS9zdWJ0aXRsZS5vCisKK3N0cmVhbV9pbnB1dC1vYmpzCSs9CXBhcnNlci9kdmJfY29tbW9uLm8KK29iai0kKENPTkZJR19BTUxPR0lDX0RWQikgICArPSBwYXJzZXIvaHdfZGVtdXgvCitvYmotJChDT05GSUdfQU1MT0dJQ19EVkIpICAgKz0gcGFyc2VyL2R2Yl9jaS8KKworY2NmbGFncy15ICs9IC1JLgorY2NmbGFncy15ICs9IC1JJChzcmN0cmVlKS9pbmNsdWRlL21lZGlhCisKKyNvYmoteSAJKz0gCXR2X2Zyb250ZW5kLworIyBvYmoteQkrPQlib3gtZnJvbnRlbmQvYXZsNjIxMS8KKyMgb2JqLXkJKz0JYm94LWZyb250ZW5kL2F0Ym04ODgxLworIyBvYmoteQkrPQlib3gtZnJvbnRlbmQvYXZsNjh4eC8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RyZWFtX2lucHV0L2FtcG9ydHMvTWFrZWZpbGUgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9hbXBvcnRzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZjU5MzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9hbXBvcnRzL01ha2VmaWxlCkBAIC0wLDAgKzEsMiBAQAorb2JqLXkJKz0JYW1wb3J0cy5vCithbXBvcnRzLW9ianMJKz0gYW1zdHJlYW0ubyBhZGVjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RyZWFtX2lucHV0L2FtcG9ydHMvYWRlYy5jIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvYW1wb3J0cy9hZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FiNWU1YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L2FtcG9ydHMvYWRlYy5jCkBAIC0wLDAgKzEsNDI3IEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL21lZGlhL3N0cmVhbV9pbnB1dC9hbXBvcnRzL2FkZWMuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpb19kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL2Fmb3JtYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2ZyYW1lX3N5bmMvcHRzc2Vydi5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvcmVnaXN0ZXJzL3JlZ2lzdGVyLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jb2RlY19tbS9jb25maWdzLmg+CisjaW5jbHVkZSAiLi4vYW1wb3J0cy9zdHJlYW1idWYuaCIKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgImFtcG9ydHNfcHJpdi5oIgorI2luY2x1ZGUgIi4uLy4uL2NvbW1vbi9jaGlwcy9kZWNvZGVyX2NwdV92ZXJfaW5mby5oIgorI2RlZmluZSBJTkZPX1ZBTElEICgoYXN0cmVhbV9kZXYpICYmIChhc3RyZWFtX2Rldi0+Zm9ybWF0KSkKKworc3RydWN0IGFzdHJlYW1fZGV2aWNlX3MgeworCWNoYXIgKm5hbWU7CisJY2hhciAqZm9ybWF0OworCXMzMiBjaGFubnVtOworCXMzMiBzYW1wbGVyYXRlOworCXMzMiBkYXRhd2lkdGg7CisJaW50IG9mZnNldDsKKworCXN0cnVjdCBkZXZpY2UgZGV2OworfTsKKworc3RhdGljIGNoYXIgKmFzdHJlYW1fZm9ybWF0W10gPSB7CisJImFtYWRlY19tcGVnIiwKKwkiYW1hZGVjX3BjbV9zMTZsZSIsCisJImFtYWRlY19hYWMiLAorCSJhbWFkZWNfYWMzIiwKKwkiYW1hZGVjX2FsYXciLAorCSJhbWFkZWNfbXVsYXciLAorCSJhbWFkZWNfZHRzIiwKKwkiYW1hZGVjX3BjbV9zMTZiZSIsCisJImFtYWRlY19mbGFjIiwKKwkiYW1hZGVjX2Nvb2siLAorCSJhbWFkZWNfcGNtX3U4IiwKKwkiYW1hZGVjX2FkcGNtIiwKKwkiYW1hZGVjX2FtciIsCisJImFtYWRlY19yYWFjIiwKKwkiYW1hZGVjX3dtYSIsCisJImFtYWRlY193bWFwcm8iLAorCSJhbWFkZWNfcGNtX2JsdXJheSIsCisJImFtYWRlY19hbGFjIiwKKwkiYW1hZGVjX3ZvcmJpcyIsCisJImFtYWRlY19hYWNfbGF0bSIsCisJImFtYWRlY19hcGUiLAorCSJhbWFkZWNfZWFjMyIsCisJImFtYWRlY19wY21fd2lkaSIsCisJImFtYWRlY19kcmEiLAorCSJhbWFkZWNfc2lwciIsCisJImFtYWRlY190cnVlaGQiLAorCSJhbWFkZWNfbXBlZzEiLAorCSJhbWFkZWNfbXBlZzIiLAorCSJhbWFkZWNfd21hdm9pIiwKKwkiYW1hZGVjX3dtYWxvc3NsZXNzIiwKKwkiYW1hZGVjX3BjbV9zMjRsZSIsCisJImFkZWNfbWF4IgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKm5hX3N0cmluZyA9ICJOQSI7CitzdGF0aWMgc3RydWN0IGFzdHJlYW1fZGV2aWNlX3MgKmFzdHJlYW1fZGV2OworCitzdGF0aWMgc3NpemVfdCBmb3JtYXRfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLCBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQkJCQkJICAgY2hhciAqYnVmKQoreworCWlmIChJTkZPX1ZBTElEICYmIGFzdHJlYW1fZGV2LT5mb3JtYXQpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBhc3RyZWFtX2Rldi0+Zm9ybWF0KTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBuYV9zdHJpbmcpOworfQorCitzdGF0aWMgc3NpemVfdCBjaGFubnVtX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJCQljaGFyICpidWYpCit7CisJaWYgKElORk9fVkFMSUQpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBhc3RyZWFtX2Rldi0+Y2hhbm51bSk7CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgbmFfc3RyaW5nKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2FtcGxlcmF0ZV9zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCQkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWlmIChJTkZPX1ZBTElEKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgYXN0cmVhbV9kZXYtPnNhbXBsZXJhdGUpOworCWVsc2UKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIG5hX3N0cmluZyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRhdGF3aWR0aF9zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCQkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJY2hhciAqYnVmKQoreworCWlmIChJTkZPX1ZBTElEKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgYXN0cmVhbV9kZXYtPmRhdGF3aWR0aCk7CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgbmFfc3RyaW5nKTsKK30KKworc3RhdGljIHNzaXplX3QgcHRzX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJCWNoYXIgKmJ1ZikKK3sKKwl1MzIgcHRzLCBmcmFtZV9zaXplOworCXUzMiBwdHNfbWFyZ2luID0gMDsKKworCWlmIChhc3RyZWFtX2Rldi0+c2FtcGxlcmF0ZSA8PSAxMjAwMCkKKwkJcHRzX21hcmdpbiA9IDUxMjsKKworCWlmIChJTkZPX1ZBTElEICYmIChwdHNfbG9va3VwKFBUU19UWVBFX0FVRElPLCAmcHRzLAorCQkJJmZyYW1lX3NpemUsIHB0c19tYXJnaW4pID49IDApKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIweCV4XG4iLCBwdHMpOworCWVsc2UKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIG5hX3N0cmluZyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZHJfb2Zmc2V0X3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKKwkJCQlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGFzdHJlYW1fZGV2LT5vZmZzZXQpOworfQorCitzdGF0aWMgQ0xBU1NfQVRUUl9STyhmb3JtYXQpOworc3RhdGljIENMQVNTX0FUVFJfUk8oc2FtcGxlcmF0ZSk7CitzdGF0aWMgQ0xBU1NfQVRUUl9STyhjaGFubnVtKTsKK3N0YXRpYyBDTEFTU19BVFRSX1JPKGRhdGF3aWR0aCk7CitzdGF0aWMgQ0xBU1NfQVRUUl9STyhwdHMpOworc3RhdGljIENMQVNTX0FUVFJfUk8oYWRkcl9vZmZzZXQpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYXN0cmVhbV9jbGFzc19hdHRyc1tdID0geworCSZjbGFzc19hdHRyX2Zvcm1hdC5hdHRyLAorCSZjbGFzc19hdHRyX3NhbXBsZXJhdGUuYXR0ciwKKwkmY2xhc3NfYXR0cl9jaGFubnVtLmF0dHIsCisJJmNsYXNzX2F0dHJfZGF0YXdpZHRoLmF0dHIsCisJJmNsYXNzX2F0dHJfcHRzLmF0dHIsCisJJmNsYXNzX2F0dHJfYWRkcl9vZmZzZXQuYXR0ciwKKwlOVUxMCit9OworCitBVFRSSUJVVEVfR1JPVVBTKGFzdHJlYW1fY2xhc3MpOworCitzdGF0aWMgc3RydWN0IGNsYXNzIGFzdHJlYW1fY2xhc3MgPSB7CisJLm5hbWUgPSAiYXN0cmVhbSIsCisJLmNsYXNzX2dyb3VwcyA9IGFzdHJlYW1fY2xhc3NfZ3JvdXBzLAorfTsKKworI2lmIDEKKyNkZWZpbmUgSU9fQ0JVU19QSFlfQkFTRSAweGMxMTAwMDAwVUxMCisjZGVmaW5lIElPX0FPQlVTX1BIWV9CQVNFIDB4YzgxMDAwMDBVTEwKKyNkZWZpbmUgQ0JVU19SRUdfT0ZGU0VUKHJlZykgKChyZWcpIDw8IDIpCisjZGVmaW5lIElPX1NFQ0JVU19QSFlfQkFTRSAweGRhMDAwMDAwVUxMCisKKworI2RlZmluZSBJT19BT0JVU19QSFlfQkFTRV9BRlRFUl9HMTJBIDB4ZmY4MDAwMDBVTEwKKworc3RhdGljIHN0cnVjdCB1aW9faW5mbyBhc3RyZWFtX3Vpb19pbmZvID0geworCS5uYW1lID0gImFzdHJlYW1fdWlvIiwKKwkudmVyc2lvbiA9ICIwLjEiLAorCS5pcnEgPSBVSU9fSVJRX05PTkUsCisKKwkubWVtID0geworCQlbMF0gPSB7CisJCQkubmFtZSA9ICJBSUZJRk8iLAorCQkJLm1lbXR5cGUgPSBVSU9fTUVNX1BIWVMsCisJCQkuYWRkciA9CisJCQkoSU9fQ0JVU19QSFlfQkFTRSArIENCVVNfUkVHX09GRlNFVChBSVVfQUlGSUZPX0NUUkwpKQorCQkJJihQQUdFX01BU0spLAorCQkJLnNpemUgPSBQQUdFX1NJWkUsCisJCX0sCisJCVsxXSA9IHsKKwkJCS5tZW10eXBlID0gVUlPX01FTV9QSFlTLAorCQkJLmFkZHIgPQorCQkJKElPX0NCVVNfUEhZX0JBU0UgKyBDQlVTX1JFR19PRkZTRVQoVkNPUF9DVFJMX1JFRykpLAorCQkJLnNpemUgPSBQQUdFX1NJWkUsCisJCX0sCisvKgorCQlbMl0gPSB7CisJCQkubmFtZSA9ICJTRUNCVVMiLAorCQkJLm1lbXR5cGUgPSBVSU9fTUVNX1BIWVMsCisJCQkuYWRkciA9IChJT19TRUNCVVNfUEhZX0JBU0UpLAorCQkJLnNpemUgPSBQQUdFX1NJWkUsCisJCX0sCisqLworCQlbMl0gPSB7CisJCQkubmFtZSA9ICJDQlVTIiwKKwkJCS5tZW10eXBlID0gVUlPX01FTV9QSFlTLAorCQkJLmFkZHIgPQorCQkJKElPX0NCVVNfUEhZX0JBU0UgKyBDQlVTX1JFR19PRkZTRVQoQVNTSVNUX0hXX1JFVikpCisJCQkmKFBBR0VfTUFTSyksCisJCQkuc2l6ZSA9IFBBR0VfU0laRSwKKwkJfSwKKwkJWzNdID0geworCQkJLm5hbWUgPSAiQ0JVUy1TVEFSVCIsCisJCQkubWVtdHlwZSA9IFVJT19NRU1fUEhZUywKKwkJCS5hZGRyID0gKElPX0NCVVNfUEhZX0JBU0UgKyBDQlVTX1JFR19PRkZTRVQoMHgxMDAwKSksCisJCQkuc2l6ZSA9IFBBR0VfU0laRSwKKwkJfSwKKwkJWzRdID0geworCQkJLm5hbWUgPSAiQU9CVVMtU1RBUlQiLAorCQkJLm1lbXR5cGUgPSBVSU9fTUVNX1BIWVMsCisJCQkuYWRkciA9IChJT19BT0JVU19QSFlfQkFTRSksCisJCQkuc2l6ZSA9IFBBR0VfU0laRSwKKwkJfSwKKwl9LAorfTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBhc3RyZWFtX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCWtmcmVlKGFzdHJlYW1fZGV2KTsKKworCWFzdHJlYW1fZGV2ID0gTlVMTDsKK30KKworczMyIGFkZWNfaW5pdChzdHJ1Y3Qgc3RyZWFtX3BvcnRfcyAqcG9ydCkKK3sKKwllbnVtIGFmb3JtYXRfZSBhZjsKKworCWlmICghYXN0cmVhbV9kZXYpCisJCXJldHVybiAtRU5PREVWOworCisJYWYgPSBwb3J0LT5hZm9ybWF0OworCisJYXN0cmVhbV9kZXYtPmNoYW5udW0gPSBwb3J0LT5hY2hhbmw7CisJYXN0cmVhbV9kZXYtPnNhbXBsZXJhdGUgPSBwb3J0LT5hc2FtcHJhdGU7CisJYXN0cmVhbV9kZXYtPmRhdGF3aWR0aCA9IHBvcnQtPmFkYXRhd2lkdGg7CisKKwkvKndtYigpO2Rvbid0IG5lZWQgaXQuLi4qLworCWlmIChhZiA8IEFSUkFZX1NJWkUoYXN0cmVhbV9mb3JtYXQpKQorCQlhc3RyZWFtX2Rldi0+Zm9ybWF0ID0gYXN0cmVhbV9mb3JtYXRbYWZdOworCWVsc2UKKwkJYXN0cmVhbV9kZXYtPmZvcm1hdCA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGFkZWNfaW5pdCk7CisKK3MzMiBhZGVjX3JlbGVhc2UoZW51bSBhZm9ybWF0X2UgdmYpCit7CisJcHJfaW5mbygiYWRlY19yZWxlYXNlXG4iKTsKKworCWlmICghYXN0cmVhbV9kZXYpCisJCXJldHVybiAtRU5PREVWOworCisJYXN0cmVhbV9kZXYtPmZvcm1hdCA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYWRlY19yZWxlYXNlKTsKKworaW50IGFtc3RyZWFtX2FkZWNfc2hvd19mdW4oY29uc3QgY2hhciAqdHJpZ2dlciwgaW50IGlkLCBjaGFyICpzYnVmLCBpbnQgc2l6ZSkKK3sKKwlpbnQgcmV0ID0gLTE7CisJdm9pZCAqYnVmLCAqZ2V0YnVmID0gTlVMTDsKKwlpZiAoc2l6ZSA8IFBBR0VfU0laRSkgeworCQlnZXRidWYgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwkJaWYgKCFnZXRidWYpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJYnVmID0gZ2V0YnVmOworCX0gZWxzZSB7CisJCWJ1ZiA9IHNidWY7CisJfQorCXN3aXRjaCAodHJpZ2dlclswXSkgeworCWNhc2UgJ2YnOgorCQlyZXQgPSAgZm9ybWF0X3Nob3coTlVMTCwgTlVMTCwgYnVmKTsKKwkJYnJlYWs7CisJY2FzZSAncyc6CisJCXJldCA9ICBzYW1wbGVyYXRlX3Nob3coTlVMTCwgTlVMTCwgYnVmKTsKKwkJYnJlYWs7CisJY2FzZSAnYyc6CisJCXJldCA9ICBjaGFubnVtX3Nob3coTlVMTCwgTlVMTCwgYnVmKTsKKwkJYnJlYWs7CisJY2FzZSAnZCc6CisJCXJldCA9ICBkYXRhd2lkdGhfc2hvdyhOVUxMLCBOVUxMLCBidWYpOworCQlicmVhazsKKwljYXNlICdwJzoKKwkJcmV0ID0gIHB0c19zaG93KE5VTEwsIE5VTEwsIGJ1Zik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC0xOworCX0KKwlpZiAocmV0ID4gMCAmJiBnZXRidWYgIT0gTlVMTCkgeworCQlyZXQgPSBtaW5fdChpbnQsIHJldCwgc2l6ZSk7CisJCXN0cm5jcHkoc2J1ZiwgYnVmLCByZXQpOworCX0KKwlpZiAoZ2V0YnVmICE9IE5VTEwpCisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylnZXRidWYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWNvbmZpZyBhZGVjX2NvbmZpZ3NbXSA9IHsKKwlNQ19GVU4oImZvcm1hdCIsICZhbXN0cmVhbV9hZGVjX3Nob3dfZnVuLCBOVUxMKSwKKwlNQ19GVU4oInNhbXBsZXJhdGUiLCAmYW1zdHJlYW1fYWRlY19zaG93X2Z1biwgTlVMTCksCisJTUNfRlVOKCJjaGFubnVtIiwgJmFtc3RyZWFtX2FkZWNfc2hvd19mdW4sIE5VTEwpLAorCU1DX0ZVTigiZGF0YXdpZHRoIiwgJmFtc3RyZWFtX2FkZWNfc2hvd19mdW4sIE5VTEwpLAorCU1DX0ZVTigicHRzIiwgJmFtc3RyZWFtX2FkZWNfc2hvd19mdW4sIE5VTEwpLAorfTsKK3N0YXRpYyBzdHJ1Y3QgbWNvbmZpZ19ub2RlIGFkZWNfbm9kZTsKKworCitzMzIgYXN0cmVhbV9kZXZfcmVnaXN0ZXIodm9pZCkKK3sKKwlzMzIgcjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CisJdW5zaWduZWQgaW50IGNidXNfYmFzZSA9IDB4ZmZkMDAwMDA7CisKKwlyID0gY2xhc3NfcmVnaXN0ZXIoJmFzdHJlYW1fY2xhc3MpOworCWlmIChyKSB7CisJCXByX2luZm8oImFzdHJlYW0gY2xhc3MgY3JlYXRlIGZhaWwuXG4iKTsKKwkJcmV0dXJuIHI7CisJfQorCisJYXN0cmVhbV9kZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXN0cmVhbV9kZXZpY2VfcyksIEdGUF9LRVJORUwpOworCisJaWYgKCFhc3RyZWFtX2RldikgeworCQlwcl9pbmZvKCJhc3RyZWFtIGRldmljZSBjcmVhdGUgZmFpbC5cbiIpOworCQlyID0gLUVOT01FTTsKKwkJZ290byBlcnJfMzsKKwl9CisKKwlhc3RyZWFtX2Rldi0+ZGV2LmNsYXNzID0gJmFzdHJlYW1fY2xhc3M7CisJYXN0cmVhbV9kZXYtPmRldi5yZWxlYXNlID0gYXN0cmVhbV9yZWxlYXNlOworCWFzdHJlYW1fZGV2LT5vZmZzZXQgPSAwOworCWRldl9zZXRfbmFtZSgmYXN0cmVhbV9kZXYtPmRldiwgImFzdHJlYW0tZGV2Iik7CisKKwlkZXZfc2V0X2RydmRhdGEoJmFzdHJlYW1fZGV2LT5kZXYsIGFzdHJlYW1fZGV2KTsKKworCXIgPSBkZXZpY2VfcmVnaXN0ZXIoJmFzdHJlYW1fZGV2LT5kZXYpOworCWlmIChyKSB7CisJCXByX2luZm8oImFzdHJlYW0gZGV2aWNlIHJlZ2lzdGVyIGZhaWwuXG4iKTsKKwkJZ290byBlcnJfMjsKKwl9CisKKwlpZiAoQU1fTUVTT05fQ1BVX01BSk9SX0lEX1RYTCA8IGdldF9jcHVfbWFqb3JfaWQoKSkgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlc19tZW07CisJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisKKwkJbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvY29kZWNfaW8iKTsKKwkJaWYgKCFub2RlKSB7CisJCQlwcl9pbmZvKCJObyBpb19jYnVzX2Jhc2Ugbm9kZSBmb3VuZC4iKTsKKwkJCWdvdG8gZXJyXzE7CisJCX0KKworCQlwZGV2ID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShub2RlKTsKKwkJcmVzX21lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJjYnVzIik7CisJCWlmICghcmVzX21lbSkgeworCQkJcHJfaW5mbygiTm8gZmluZCBub2RlLlxuIik7CisJCQlnb3RvIGVycl8xOworCQl9CisJCWNidXNfYmFzZSA9IHJlc19tZW0tPnN0YXJ0OworCQlvZl9ub2RlX3B1dChub2RlKTsKKworCQkvKm5lZWQgdG8gb2Zmc2V0IC0weDEwMCBpbiB0eGx4LiovCisJCWFzdHJlYW1fZGV2LT5vZmZzZXQgPSAtMHgxMDA7CisKKwkJLypuZWVkIHRvIG9mZnNldCAtMHgxODAgaW4gZzEyYS4qLworCQlpZiAoQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEgPD0gZ2V0X2NwdV9tYWpvcl9pZCgpKSB7CisJCQlhc3RyZWFtX2Rldi0+b2Zmc2V0ID0gLTB4MTgwOworCQkJLyogYWZ0ZXIgRzEyQSBjaGlwLCB0aGUgYW9idXMgYmFzZSBhZGRyIGNoYW5nZWQgKi8KKwkJCWFzdHJlYW1fdWlvX2luZm8ubWVtWzRdLmFkZHIgPSBJT19BT0JVU19QSFlfQkFTRV9BRlRFUl9HMTJBOworCQl9CisJCWFzdHJlYW1fdWlvX2luZm8ubWVtWzBdLmFkZHIgPQorCQkJKGNidXNfYmFzZSArIENCVVNfUkVHX09GRlNFVChBSVVfQUlGSUZPX0NUUkwgKworCQkJYXN0cmVhbV9kZXYtPm9mZnNldCkpICYgKFBBR0VfTUFTSyk7CisKKwkJYXN0cmVhbV91aW9faW5mby5tZW1bM10uYWRkciA9CisJCQkoY2J1c19iYXNlICsgQ0JVU19SRUdfT0ZGU0VUKEFTU0lTVF9IV19SRVYgKworCQkJMHgxMDApKSAmIChQQUdFX01BU0spOworCX0KKworI2lmIDEKKwlpZiAodWlvX3JlZ2lzdGVyX2RldmljZSgmYXN0cmVhbV9kZXYtPmRldiwgJmFzdHJlYW1fdWlvX2luZm8pKSB7CisJCXByX2luZm8oImFzdHJlYW0gVUlPIGRldmljZSByZWdpc3RlciBmYWlsLlxuIik7CisJCXIgPSAtRU5PREVWOworCQlnb3RvIGVycl8xOworCX0KKyNlbmRpZgorCUlOSVRfUkVHX05PREVfQ09ORklHUygibWVkaWEiLCAmYWRlY19ub2RlLAorCQkiYWRlYyIsIGFkZWNfY29uZmlncywgQ09ORklHX0ZPUl9SKTsKKwlyZXR1cm4gMDsKKworZXJyXzE6CisJZGV2aWNlX3VucmVnaXN0ZXIoJmFzdHJlYW1fZGV2LT5kZXYpOworCitlcnJfMjoKKwlrZnJlZShhc3RyZWFtX2Rldik7CisJYXN0cmVhbV9kZXYgPSBOVUxMOworCitlcnJfMzoKKwljbGFzc191bnJlZ2lzdGVyKCZhc3RyZWFtX2NsYXNzKTsKKworCXJldHVybiByOworfQorCit2b2lkIGFzdHJlYW1fZGV2X3VucmVnaXN0ZXIodm9pZCkKK3sKKwlpZiAoYXN0cmVhbV9kZXYpIHsKKyNpZiAxCisJCXVpb191bnJlZ2lzdGVyX2RldmljZSgmYXN0cmVhbV91aW9faW5mbyk7CisjZW5kaWYKKworCQlkZXZpY2VfdW5yZWdpc3RlcigmYXN0cmVhbV9kZXYtPmRldik7CisKKwkJY2xhc3NfdW5yZWdpc3RlcigmYXN0cmVhbV9jbGFzcyk7CisJfQorfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0cmVhbV9pbnB1dC9hbXBvcnRzL2FkZWMuaCBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L2FtcG9ydHMvYWRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZDI3NmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9hbXBvcnRzL2FkZWMuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL21lZGlhL3N0cmVhbV9pbnB1dC9hbXBvcnRzL2FkZWMuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIEFERUNfSAorI2RlZmluZSBBREVDX0gKKworI2luY2x1ZGUgIi4uL2FtcG9ydHMvc3RyZWFtYnVmLmgiCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy9hZm9ybWF0Lmg+CisKK2V4dGVybiBzMzIgYWRlY19pbml0KHN0cnVjdCBzdHJlYW1fcG9ydF9zICpwb3J0KTsKKworZXh0ZXJuIHMzMiBhZGVjX3JlbGVhc2UoZW51bSBhZm9ybWF0X2UgYWYpOworCitleHRlcm4gczMyIGFzdHJlYW1fZGV2X3JlZ2lzdGVyKHZvaWQpOworCitleHRlcm4gczMyIGFzdHJlYW1fZGV2X3VucmVnaXN0ZXIodm9pZCk7CisKKyNlbmRpZiAvKiBBREVDX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RyZWFtX2lucHV0L2FtcG9ydHMvYW1wb3J0c19wcml2LmggYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9hbXBvcnRzL2FtcG9ydHNfcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZWFkMDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9hbXBvcnRzL2FtcG9ydHNfcHJpdi5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvbWVkaWEvc3RyZWFtX2lucHV0L2FtcG9ydHMvYW1wb3J0c19wcml2LmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBBTVBPUlRTX1BSSVZfSEVBRF9ISAorI2RlZmluZSBBTVBPUlRTX1BSSVZfSEVBRF9ISAorI2luY2x1ZGUgIi4uL2FtcG9ydHMvc3RyZWFtYnVmLmgiCisjaW5jbHVkZSAiLi4vLi4vY29tbW9uL21lZGlhX2Nsb2NrL3N3aXRjaC9hbXBvcnRzX2dhdGUuaCIKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3ZmbS92ZnJhbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3JlZ2lzdGVycy9yZWdpc3Rlci5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvbG9nLmg+CisKK3N0cnVjdCBwb3J0X3ByaXZfcyB7CisJc3RydWN0IHZkZWNfcyAqdmRlYzsKKwlzdHJ1Y3Qgc3RyZWFtX3BvcnRfcyAqcG9ydDsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7Cit9OworCitzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpnZXRfYnVmX2J5X3R5cGUodTMyIHR5cGUpOworCisvKnZpZGVvLmMgcHJvdmlkZSovCitleHRlcm4gdTMyIHRyaWNrbW9kZV9pOworc3RydWN0IGFtdmlkZW9jYXBfcmVxOworZXh0ZXJuIHUzMiBzZXRfYmxhY2tvdXRfcG9saWN5KGludCBwb2xpY3kpOworZXh0ZXJuIHUzMiBnZXRfYmxhY2tvdXRfcG9saWN5KHZvaWQpOworaW50IGNhbGN1bGF0aW9uX3N0cmVhbV9leHRfZGVsYXllZF9tcyh1OCB0eXBlKTsKK2ludCBleHRfZ2V0X2N1cl92aWRlb19mcmFtZShzdHJ1Y3QgdmZyYW1lX3MgKip2ZiwgaW50ICpjYW52YXNfaW5kZXgpOworaW50IGV4dF9wdXRfdmlkZW9fZnJhbWUoc3RydWN0IHZmcmFtZV9zICp2Zik7CitpbnQgZXh0X3JlZ2lzdGVyX2VuZF9mcmFtZV9jYWxsYmFjayhzdHJ1Y3QgYW12aWRlb2NhcF9yZXEgKnJlcSk7CitpbnQgYW1zdHJlYW1fcmVxdWVzdF9maXJtd2FyZV9mcm9tX3N5cyhjb25zdCBjaGFyICpmaWxlX25hbWUsCisJY2hhciAqYnVmLCBpbnQgc2l6ZSk7Cit2b2lkIHNldF92c3luY19wdHNfaW5jX21vZGUoaW50IGluYyk7CisKK3ZvaWQgc2V0X3JlYWxfYXVkaW9faW5mbyh2b2lkICphcmcpOwordm9pZCBhbXN0cmVhbV93YWtldXBfdXNlcmRhdGFfcG9sbChzdHJ1Y3QgdmRlY19zICp2ZGVjKTsKKyNkZWZpbmUgZGJnKCkgcHJfaW5mbygib24gJXMsbGluZSAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworc3RydWN0IGRldmljZSAqYW1wb3J0c19nZXRfZG1hX2RldmljZSh2b2lkKTsKK3N0cnVjdCBkZXZpY2UgKmdldF9jb2RlY19jbWFfZGV2aWNlKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RyZWFtX2lucHV0L2FtcG9ydHMvYW1zdHJlYW0uYyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L2FtcG9ydHMvYW1zdHJlYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjIxN2YyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvYW1wb3J0cy9hbXN0cmVhbS5jCkBAIC0wLDAgKzEsNDY2MiBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9tZWRpYS9zdHJlYW1faW5wdXQvYW1wb3J0cy9hbXN0cmVhbS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisjZGVmaW5lIERFQlVHCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy9hbXN0cmVhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmZvcm1hdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvYWZvcm1hdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZnJhbWVfc3luYy90c3luYy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZnJhbWVfc3luYy9wdHNzZXJ2Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9mcmFtZV9zeW5jL3RpbWVzdGFtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtY29udGlndW91cy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpZiAxCQkJCS8qIE1FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09ONiAqLworLyogI2luY2x1ZGUgPG1hY2gvbW9kX2dhdGUuaD4gKi8KKy8qICNpbmNsdWRlIDxtYWNoL3Bvd2VyX2dhdGUuaD4gKi8KKyNlbmRpZgorI2luY2x1ZGUgIi4uL2FtcG9ydHMvc3RyZWFtYnVmLmgiCisjaW5jbHVkZSAiLi4vYW1wb3J0cy9zdHJlYW1idWZfcmVnLmgiCisjaW5jbHVkZSAiLi4vcGFyc2VyL3RzZGVtdXguaCIKKyNpbmNsdWRlICIuLi9wYXJzZXIvcHNwYXJzZXIuaCIKKyNpbmNsdWRlICIuLi9wYXJzZXIvZXNwYXJzZXIuaCIKKyNpbmNsdWRlICIuLi8uLi9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWMuaCIKKyNpbmNsdWRlICJhZGVjLmgiCisjaW5jbHVkZSAiLi4vcGFyc2VyL3JtcGFyc2VyLmgiCisjaW5jbHVkZSAiYW1wb3J0c19wcml2LmgiCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy9hbXBvcnRzX2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZnJhbWVfc3luYy90c3luY19wY3IuaD4KKyNpbmNsdWRlICIuLi9hbXBvcnRzL3RocmVhZF9ydy5oIgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9mZHQuaD4KKyNpbmNsdWRlIDxsaW51eC9saWJmZHRfZW52Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcmVzZXJ2ZWRfbWVtLmg+CisjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KKyNpZmRlZiBDT05GSUdfQ09NUEFUCisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvZGVjX21tLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jb2RlY19tbS9jb25maWdzLmg+CisjaW5jbHVkZSAiLi4vLi4vZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy9maXJtd2FyZS5oIgorI2luY2x1ZGUgIi4uLy4uL2NvbW1vbi9jaGlwcy9jaGlwcy5oIgorI2luY2x1ZGUgIi4uLy4uL2NvbW1vbi9jaGlwcy9kZWNvZGVyX2NwdV92ZXJfaW5mby5oIgorI2luY2x1ZGUgIi4uL3N1YnRpdGxlL3N1YnRpdGxlLmgiCisjaW5jbHVkZSAic3RyZWFtX2J1ZmZlcl9iYXNlLmgiCisjaW5jbHVkZSAiLi4vLi4vZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjX2ZlYXR1cmUuaCIKKworLy8jZGVmaW5lIEcxMkFfQlJJTkdVUF9ERUJVRworCisjZGVmaW5lIENPTkZJR19BTV9WREVDX1JFQUwgLy9ERUJVR19UTVAKKworI2RlZmluZSBERVZJQ0VfTkFNRSAiYW1zdHJlYW0tZGV2IgorI2RlZmluZSBEUklWRVJfTkFNRSAiYW1zdHJlYW0iCisjZGVmaW5lIE1PRFVMRV9OQU1FICJhbXN0cmVhbSIKKworI2RlZmluZSBNQVhfQU1TVFJFQU1fUE9SVF9OVU0gQVJSQVlfU0laRShwb3J0cykKK3UzMiBhbXN0cmVhbV9wb3J0X251bTsKK3UzMiBhbXN0cmVhbV9idWZfbnVtOworCit1MzIgYW1zdHJlYW1fYXVkaW9fcmVzZXQgPSAwOworCisjaWYgMAorI2lmICBNRVNPTl9DUFVfVFlQRSA9PSBNRVNPTl9DUFVfVFlQRV9NRVNPTkc5VFYKKyNkZWZpbmUgTk9fVkRFQzJfSU5JVCAxCisjZWxpZiBNRVNPTl9DUFVfVFlQRSA+PSBNRVNPTl9DUFVfVFlQRV9NRVNPTjZUVkQKKyNkZWZpbmUgTk9fVkRFQzJfSU5JVCBJU19NRVNPTl9NOE0yX0NQVQorI2VuZGlmCisjZW5kaWYKKyNkZWZpbmUgTk9fVkRFQzJfSU5JVCAxCisKKyNkZWZpbmUgREVGQVVMVF9WSURFT19CVUZGRVJfU0laRSAgICAgICAoMTAyNCAqIDEwMjQgKiAzKQorI2RlZmluZSBERUZBVUxUX1ZJREVPX0JVRkZFUl9TSVpFXzRLICAgICAgICgxMDI0ICogMTAyNCAqIDYpCisjZGVmaW5lIERFRkFVTFRfVklERU9fQlVGRkVSX1NJWkVfVFZQICAgICAgICgxMDI0ICogMTAyNCAqIDEwKQorI2RlZmluZSBERUZBVUxUX1ZJREVPX0JVRkZFUl9TSVpFXzRLX1RWUCAgICAgICAoMTAyNCAqIDEwMjQgKiAxNSkKKworCisjZGVmaW5lIERFRkFVTFRfQVVESU9fQlVGRkVSX1NJWkUgICAgICAgKDEwMjQqNzY4KjIpCisjZGVmaW5lIERFRkFVTFRfU1VCVElUTEVfQlVGRkVSX1NJWkUgICAgICgxMDI0KjI1NikKKworc3RhdGljIGludCBkZWZfNGtfdnN0cmVhbWJ1Zl9zaXplTSA9CisJKERFRkFVTFRfVklERU9fQlVGRkVSX1NJWkVfNEsgPj4gMjApOworc3RhdGljIGludCBkZWZfdnN0cmVhbWJ1Zl9zaXplTSA9CisJKERFRkFVTFRfVklERU9fQlVGRkVSX1NJWkUgPj4gMjApOworc3RhdGljIGludCBzbG93X2lucHV0OworCisvKiAjZGVmaW5lIERBVEFfREVCVUcgKi8KK3N0YXRpYyBpbnQgdXNlX2J1ZmZlcmxldmVseDEwMDAwID0gMTAwMDA7CitzdGF0aWMgaW50IHJlc2V0X2NhbnVzZV9idWZlcmxldmVsKGludCBsZXZlbCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICphbXN0cmVhbV9wZGV2Oworc3RydWN0IGRldmljZSAqYW1wb3J0c19nZXRfZG1hX2RldmljZSh2b2lkKQoreworCXJldHVybiAmYW1zdHJlYW1fcGRldi0+ZGV2OworfQorRVhQT1JUX1NZTUJPTChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKTsKKworI2lmZGVmIERBVEFfREVCVUcKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCisjZGVmaW5lIERFQlVHX0ZJTEVfTkFNRSAgICAgIi9zZGNhcmQvZGVidWcudG1wIgorc3RhdGljIHN0cnVjdCBmaWxlICpkZWJ1Z19maWxwOworc3RhdGljIGxvZmZfdCBkZWJ1Z19maWxlX3BvczsKKwordm9pZCBkZWJ1Z19maWxlX3dyaXRlKGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwltbV9zZWdtZW50X3Qgb2xkX2ZzOworCisJaWYgKCFkZWJ1Z19maWxwKQorCQlyZXR1cm47CisKKwlvbGRfZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKworCWlmIChjb3VudCAhPSB2ZnNfd3JpdGUoZGVidWdfZmlscCwgYnVmLCBjb3VudCwgJmRlYnVnX2ZpbGVfcG9zKSkKKwkJcHJfZXJyKCJGYWlsZWQgdG8gd3JpdGUgZGVidWcgZmlsZVxuIik7CisKKwlzZXRfZnMob2xkX2ZzKTsKK30KKyNlbmRpZgorCisKKworc3RhdGljIGludCBhbXN0cmVhbV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgYW1zdHJlYW1fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgbG9uZyBhbXN0cmVhbV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdWxvbmcgYXJnKTsKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdGF0aWMgbG9uZyBhbXN0cmVhbV9jb21wYXRfaW9jdGwKKwkoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVsb25nIGFyZyk7CisjZW5kaWYKK3N0YXRpYyBzc2l6ZV90IGFtc3RyZWFtX3ZidWZfd3JpdGUKKyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CitzdGF0aWMgc3NpemVfdCBhbXN0cmVhbV92ZnJhbWVfd3JpdGUKKyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CitzdGF0aWMgc3NpemVfdCBhbXN0cmVhbV9hYnVmX3dyaXRlCisoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3RhdGljIHNzaXplX3QgYW1zdHJlYW1fbXB0c193cml0ZQorKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyBzc2l6ZV90IGFtc3RyZWFtX21wcHNfd3JpdGUKKyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CitzdGF0aWMgc3NpemVfdCBhbXN0cmVhbV9zdWJfcmVhZAorKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyBzc2l6ZV90IGFtc3RyZWFtX3N1Yl93cml0ZQorKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYW1zdHJlYW1fc3ViX3BvbGwKKyhzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdF90YWJsZSk7CitzdGF0aWMgdW5zaWduZWQgaW50IGFtc3RyZWFtX3VzZXJkYXRhX3BvbGwKKyhzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdF90YWJsZSk7CitzdGF0aWMgaW50ICgqYW1zdHJlYW1fYWRlY19zdGF0dXMpCisoc3RydWN0IGFkZWNfc3RhdHVzICphc3RhdHVzKTsKKyNpZmRlZiBDT05GSUdfQU1fVkRFQ19SRUFMCitzdGF0aWMgc3NpemVfdCBhbXN0cmVhbV9tcHJtX3dyaXRlCisoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZidWZfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IGFtc3RyZWFtX29wZW4sCisJLnJlbGVhc2UgPSBhbXN0cmVhbV9yZWxlYXNlLAorCS53cml0ZSA9IGFtc3RyZWFtX3ZidWZfd3JpdGUsCisJLnVubG9ja2VkX2lvY3RsID0gYW1zdHJlYW1faW9jdGwsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwgPSBhbXN0cmVhbV9jb21wYXRfaW9jdGwsCisjZW5kaWYKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZmcmFtZV9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gYW1zdHJlYW1fb3BlbiwKKwkucmVsZWFzZSA9IGFtc3RyZWFtX3JlbGVhc2UsCisJLndyaXRlID0gYW1zdHJlYW1fdmZyYW1lX3dyaXRlLAorCS51bmxvY2tlZF9pb2N0bCA9IGFtc3RyZWFtX2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsID0gYW1zdHJlYW1fY29tcGF0X2lvY3RsLAorI2VuZGlmCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhYnVmX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBhbXN0cmVhbV9vcGVuLAorCS5yZWxlYXNlID0gYW1zdHJlYW1fcmVsZWFzZSwKKwkud3JpdGUgPSBhbXN0cmVhbV9hYnVmX3dyaXRlLAorCS51bmxvY2tlZF9pb2N0bCA9IGFtc3RyZWFtX2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsID0gYW1zdHJlYW1fY29tcGF0X2lvY3RsLAorI2VuZGlmCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtcHRzX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBhbXN0cmVhbV9vcGVuLAorCS5yZWxlYXNlID0gYW1zdHJlYW1fcmVsZWFzZSwKKwkud3JpdGUgPSBhbXN0cmVhbV9tcHRzX3dyaXRlLAorCS51bmxvY2tlZF9pb2N0bCA9IGFtc3RyZWFtX2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsID0gYW1zdHJlYW1fY29tcGF0X2lvY3RsLAorI2VuZGlmCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtcHBzX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBhbXN0cmVhbV9vcGVuLAorCS5yZWxlYXNlID0gYW1zdHJlYW1fcmVsZWFzZSwKKwkud3JpdGUgPSBhbXN0cmVhbV9tcHBzX3dyaXRlLAorCS51bmxvY2tlZF9pb2N0bCA9IGFtc3RyZWFtX2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsID0gYW1zdHJlYW1fY29tcGF0X2lvY3RsLAorI2VuZGlmCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtcHJtX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBhbXN0cmVhbV9vcGVuLAorCS5yZWxlYXNlID0gYW1zdHJlYW1fcmVsZWFzZSwKKyNpZmRlZiBDT05GSUdfQU1fVkRFQ19SRUFMCisJLndyaXRlID0gYW1zdHJlYW1fbXBybV93cml0ZSwKKyNlbmRpZgorCS51bmxvY2tlZF9pb2N0bCA9IGFtc3RyZWFtX2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsID0gYW1zdHJlYW1fY29tcGF0X2lvY3RsLAorI2VuZGlmCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzdWJfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IGFtc3RyZWFtX29wZW4sCisJLnJlbGVhc2UgPSBhbXN0cmVhbV9yZWxlYXNlLAorCS53cml0ZSA9IGFtc3RyZWFtX3N1Yl93cml0ZSwKKwkudW5sb2NrZWRfaW9jdGwgPSBhbXN0cmVhbV9pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bCA9IGFtc3RyZWFtX2NvbXBhdF9pb2N0bCwKKyNlbmRpZgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3ViX3JlYWRfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IGFtc3RyZWFtX29wZW4sCisJLnJlbGVhc2UgPSBhbXN0cmVhbV9yZWxlYXNlLAorCS5yZWFkID0gYW1zdHJlYW1fc3ViX3JlYWQsCisJLnBvbGwgPSBhbXN0cmVhbV9zdWJfcG9sbCwKKwkudW5sb2NrZWRfaW9jdGwgPSBhbXN0cmVhbV9pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bCA9IGFtc3RyZWFtX2NvbXBhdF9pb2N0bCwKKyNlbmRpZgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdXNlcmRhdGFfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IGFtc3RyZWFtX29wZW4sCisJLnJlbGVhc2UgPSBhbXN0cmVhbV9yZWxlYXNlLAorCS5wb2xsID0gYW1zdHJlYW1fdXNlcmRhdGFfcG9sbCwKKwkudW5sb2NrZWRfaW9jdGwgPSBhbXN0cmVhbV9pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bCA9IGFtc3RyZWFtX2NvbXBhdF9pb2N0bCwKKyNlbmRpZgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYW1zdHJlYW1fZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IGFtc3RyZWFtX29wZW4sCisJLnJlbGVhc2UgPSBhbXN0cmVhbV9yZWxlYXNlLAorCS51bmxvY2tlZF9pb2N0bCA9IGFtc3RyZWFtX2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsID0gYW1zdHJlYW1fY29tcGF0X2lvY3RsLAorI2VuZGlmCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IGF1ZGlvX2luZm8gYXVkaW9fZGVjX2luZm87CitzdGF0aWMgc3RydWN0IGNsYXNzICphbXN0cmVhbV9kZXZfY2xhc3M7CitzdGF0aWMgREVGSU5FX01VVEVYKGFtc3RyZWFtX211dGV4KTsKKworYXRvbWljX3Qgc3ViZGF0YV9yZWFkeSA9IEFUT01JQ19JTklUKDApOworc3RhdGljIGludCBzdWJfdHlwZTsKK3N0YXRpYyBpbnQgc3ViX3BvcnRfaW5pdGVkOworLyogd2FpdCBxdWV1ZSBmb3IgcG9sbCAqLworc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IGFtc3RyZWFtX3N1Yl93YWl0OworYXRvbWljX3QgdXNlcmRhdGFfcmVhZHkgPSBBVE9NSUNfSU5JVCgwKTsKK3N0YXRpYyBpbnQgdXNlcmRhdGFfbGVuZ3RoOworc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IGFtc3RyZWFtX3VzZXJkYXRhX3dhaXQ7CisjZGVmaW5lIFVTRVJEQVRBX0ZJRk9fTlVNICAgIDEwMjQKK3N0YXRpYyBzdHJ1Y3QgdXNlcmRhdGFfcG9jX2luZm9fdCAqdXNlcmRhdGFfcG9jX2luZm87CitzdGF0aWMgaW50IHVzZXJkYXRhX3BvY19yaSwgdXNlcmRhdGFfcG9jX3dpOworc3RhdGljIGludCBsYXN0X3JlYWRfd2k7CisKKy8qYml0IDEgZm9yY2UgZHVhbCBsYXllcgorICpiaXQgMiBmb3JjZSBmcmFtZSBtb2RlCisgKi8KK3N0YXRpYyB1MzIgZm9yY2VfZHZfbW9kZTsKKworc3RhdGljIERFRklORV9NVVRFWCh1c2VyZGF0YV9tdXRleCk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3RyZWFtX3BvcnRfcyBwb3J0c1tdID0geworCXsKKwkJLm5hbWUgPSAiYW1zdHJlYW1fdmJ1ZiIsCisJCS50eXBlID0gUE9SVF9UWVBFX0VTIHwgUE9SVF9UWVBFX1ZJREVPLAorCQkuZm9wcyA9ICZ2YnVmX2ZvcHMsCisJfSwKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9NVUxUSV9ERUMKKwl7CisJCS5uYW1lID0gImFtc3RyZWFtX3ZidWZfc2NoZWQiLAorCQkudHlwZSA9IFBPUlRfVFlQRV9FUyB8IFBPUlRfVFlQRV9WSURFTyB8CisJCQlQT1JUX1RZUEVfREVDT0RFUl9TQ0hFRCwKKwkJLmZvcHMgPSAmdmJ1Zl9mb3BzLAorCX0sCisJeworCQkubmFtZSA9ICJhbXN0cmVhbV92ZnJhbWUiLAorCQkudHlwZSA9IFBPUlRfVFlQRV9FUyB8IFBPUlRfVFlQRV9WSURFTyB8CisJCQlQT1JUX1RZUEVfRlJBTUUgfCBQT1JUX1RZUEVfREVDT0RFUl9TQ0hFRCwKKwkJLmZvcHMgPSAmdmZyYW1lX2ZvcHMsCisJfSwKKyNlbmRpZgorCXsKKwkJLm5hbWUgPSAiYW1zdHJlYW1fYWJ1ZiIsCisJCS50eXBlID0gUE9SVF9UWVBFX0VTIHwgUE9SVF9UWVBFX0FVRElPLAorCQkuZm9wcyA9ICZhYnVmX2ZvcHMsCisJfSwKKwl7CisJCS5uYW1lID0gImFtc3RyZWFtX21wdHMiLAorCQkudHlwZSA9IFBPUlRfVFlQRV9NUFRTIHwgUE9SVF9UWVBFX1ZJREVPIHwKKwkJCVBPUlRfVFlQRV9BVURJTyB8IFBPUlRfVFlQRV9TVUIsCisJCS5mb3BzID0gJm1wdHNfZm9wcywKKwl9LAorI2lmZGVmIENPTkZJR19BTUxPR0lDX01FRElBX01VTFRJX0RFQworCXsKKwkJLm5hbWUgPSAiYW1zdHJlYW1fbXB0c19zY2hlZCIsCisJCS50eXBlID0gUE9SVF9UWVBFX01QVFMgfCBQT1JUX1RZUEVfVklERU8gfAorCQkJUE9SVF9UWVBFX0FVRElPIHwgUE9SVF9UWVBFX1NVQiB8CisJCQlQT1JUX1RZUEVfREVDT0RFUl9TQ0hFRCwKKwkJLmZvcHMgPSAmbXB0c19mb3BzLAorCX0sCisjZW5kaWYKKwl7CisJCS5uYW1lID0gImFtc3RyZWFtX21wcHMiLAorCQkudHlwZSA9IFBPUlRfVFlQRV9NUFBTIHwgUE9SVF9UWVBFX1ZJREVPIHwKKwkJCVBPUlRfVFlQRV9BVURJTyB8IFBPUlRfVFlQRV9TVUIsCisJCS5mb3BzID0gJm1wcHNfZm9wcywKKwl9LAorCXsKKwkJLm5hbWUgPSAiYW1zdHJlYW1fcm0iLAorCQkudHlwZSA9IFBPUlRfVFlQRV9STSB8IFBPUlRfVFlQRV9WSURFTyB8IFBPUlRfVFlQRV9BVURJTywKKwkJLmZvcHMgPSAmbXBybV9mb3BzLAorCX0sCisJeworCQkubmFtZSA9ICJhbXN0cmVhbV9zdWIiLAorCQkudHlwZSA9IFBPUlRfVFlQRV9TVUIsCisJCS5mb3BzID0gJnN1Yl9mb3BzLAorCX0sCisJeworCQkubmFtZSA9ICJhbXN0cmVhbV9zdWJfcmVhZCIsCisJCS50eXBlID0gUE9SVF9UWVBFX1NVQl9SRCwKKwkJLmZvcHMgPSAmc3ViX3JlYWRfZm9wcywKKwl9LAorCXsKKwkJLm5hbWUgPSAiYW1zdHJlYW1fdXNlcmRhdGEiLAorCQkudHlwZSA9IFBPUlRfVFlQRV9VU0VSREFUQSwKKwkJLmZvcHMgPSAmdXNlcmRhdGFfZm9wcywKKwl9LAorCXsKKwkJLm5hbWUgPSAiYW1zdHJlYW1faGV2YyIsCisJCS50eXBlID0gUE9SVF9UWVBFX0VTIHwgUE9SVF9UWVBFX1ZJREVPIHwgUE9SVF9UWVBFX0hFVkMsCisJCS5mb3BzID0gJnZidWZfZm9wcywKKwkJLnZmb3JtYXQgPSBWRk9STUFUX0hFVkMsCisJfSwKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9NVUxUSV9ERUMKKwl7CisJCS5uYW1lID0gImFtc3RyZWFtX2hldmNfZnJhbWUiLAorCQkudHlwZSA9IFBPUlRfVFlQRV9FUyB8IFBPUlRfVFlQRV9WSURFTyB8IFBPUlRfVFlQRV9IRVZDIHwKKwkJCVBPUlRfVFlQRV9GUkFNRSB8IFBPUlRfVFlQRV9ERUNPREVSX1NDSEVELAorCQkuZm9wcyA9ICZ2ZnJhbWVfZm9wcywKKwkJLnZmb3JtYXQgPSBWRk9STUFUX0hFVkMsCisJfSwKKwl7CisJCS5uYW1lID0gImFtc3RyZWFtX2hldmNfc2NoZWQiLAorCQkudHlwZSA9IFBPUlRfVFlQRV9FUyB8IFBPUlRfVFlQRV9WSURFTyB8IFBPUlRfVFlQRV9IRVZDIHwKKwkJCVBPUlRfVFlQRV9ERUNPREVSX1NDSEVELAorCQkuZm9wcyA9ICZ2YnVmX2ZvcHMsCisJCS52Zm9ybWF0ID0gVkZPUk1BVF9IRVZDLAorCX0sCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfTUVESUFfRU5IQU5DRU1FTlRfRE9MQllWSVNJT04KKwl7CisJCS5uYW1lID0gImFtc3RyZWFtX2R2ZXNfYXZjIiwKKwkJLnR5cGUgPSBQT1JUX1RZUEVfRVMgfCBQT1JUX1RZUEVfVklERU8gfAorCQkJUE9SVF9UWVBFX0RFQ09ERVJfU0NIRUQgfCBQT1JUX1RZUEVfRFVBTERFQywKKwkJLmZvcHMgPSAmdmJ1Zl9mb3BzLAorCX0sCisJeworCQkubmFtZSA9ICJhbXN0cmVhbV9kdmVzX2hldmMiLAorCQkudHlwZSA9IFBPUlRfVFlQRV9FUyB8IFBPUlRfVFlQRV9WSURFTyB8IFBPUlRfVFlQRV9IRVZDIHwKKwkJCVBPUlRfVFlQRV9ERUNPREVSX1NDSEVEIHwgUE9SVF9UWVBFX0RVQUxERUMsCisJCS5mb3BzID0gJnZidWZfZm9wcywKKwkJLnZmb3JtYXQgPSBWRk9STUFUX0hFVkMsCisJfSwKKwl7CisJCS5uYW1lID0gImFtc3RyZWFtX2R2ZXNfYXZjX2ZyYW1lIiwKKwkJLnR5cGUgPSBQT1JUX1RZUEVfRVMgfCBQT1JUX1RZUEVfVklERU8gfCBQT1JUX1RZUEVfRlJBTUUgfAorCQkJUE9SVF9UWVBFX0RFQ09ERVJfU0NIRUQgfCBQT1JUX1RZUEVfRFVBTERFQywKKwkJLmZvcHMgPSAmdmZyYW1lX2ZvcHMsCisJfSwKKwl7CisJCS5uYW1lID0gImFtc3RyZWFtX2R2ZXNfaGV2Y19mcmFtZSIsCisJCS50eXBlID0gUE9SVF9UWVBFX0VTIHwgUE9SVF9UWVBFX1ZJREVPIHwgUE9SVF9UWVBFX0hFVkMgfCBQT1JUX1RZUEVfRlJBTUUgfAorCQkJUE9SVF9UWVBFX0RFQ09ERVJfU0NIRUQgfCBQT1JUX1RZUEVfRFVBTERFQywKKwkJLmZvcHMgPSAmdmZyYW1lX2ZvcHMsCisJCS52Zm9ybWF0ID0gVkZPUk1BVF9IRVZDLAorCX0sCisJeworCQkubmFtZSA9ICJhbXN0cmVhbV9kdmVzX2F2MSIsCisJCS50eXBlID0gUE9SVF9UWVBFX0VTIHwgUE9SVF9UWVBFX1ZJREVPIHwgUE9SVF9UWVBFX0hFVkMgfCBQT1JUX1RZUEVfRlJBTUUgfAorCQkJUE9SVF9UWVBFX0RFQ09ERVJfU0NIRUQgfCBQT1JUX1RZUEVfRFVBTERFQywKKwkJLmZvcHMgPSAmdmZyYW1lX2ZvcHMsCisJCS52Zm9ybWF0ID0gVkZPUk1BVF9BVjEsCisJfSwKKyNlbmRpZgorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHN0cmVhbV9idWZfcyBidWZzW0JVRl9NQVhfTlVNXSA9IHsKKwl7CisJCS5yZWdfYmFzZSA9IFZMRF9NRU1fVklGSUZPX1JFR19CQVNFLAorCQkudHlwZSA9IEJVRl9UWVBFX1ZJREVPLAorCQkuYnVmX3N0YXJ0ID0gMCwKKwkJLmJ1Zl9zaXplID0gREVGQVVMVF9WSURFT19CVUZGRVJfU0laRSwKKwkJLmRlZmF1bHRfYnVmX3NpemUgPSBERUZBVUxUX1ZJREVPX0JVRkZFUl9TSVpFLAorCQkuZmlyc3RfdHN0YW1wID0gSU5WQUxJRF9QVFMKKwl9LAorCXsKKwkJLnJlZ19iYXNlID0gQUlVX01FTV9BSUZJRk9fUkVHX0JBU0UsCisJCS50eXBlID0gQlVGX1RZUEVfQVVESU8sCisJCS5idWZfc3RhcnQgPSAwLAorCQkuYnVmX3NpemUgPSBERUZBVUxUX0FVRElPX0JVRkZFUl9TSVpFLAorCQkuZGVmYXVsdF9idWZfc2l6ZSA9IERFRkFVTFRfQVVESU9fQlVGRkVSX1NJWkUsCisJCS5maXJzdF90c3RhbXAgPSBJTlZBTElEX1BUUworCX0sCisJeworCQkucmVnX2Jhc2UgPSAwLAorCQkudHlwZSA9IEJVRl9UWVBFX1NVQlRJVExFLAorCQkuYnVmX3N0YXJ0ID0gMCwKKwkJLmJ1Zl9zaXplID0gREVGQVVMVF9TVUJUSVRMRV9CVUZGRVJfU0laRSwKKwkJLmRlZmF1bHRfYnVmX3NpemUgPSBERUZBVUxUX1NVQlRJVExFX0JVRkZFUl9TSVpFLAorCQkuZmlyc3RfdHN0YW1wID0gSU5WQUxJRF9QVFMKKwl9LAorCXsKKwkJLnJlZ19iYXNlID0gMCwKKwkJLnR5cGUgPSBCVUZfVFlQRV9VU0VSREFUQSwKKwkJLmJ1Zl9zdGFydCA9IDAsCisJCS5idWZfc2l6ZSA9IDAsCisJCS5maXJzdF90c3RhbXAgPSBJTlZBTElEX1BUUworCX0sCisJeworCQkucmVnX2Jhc2UgPSBIRVZDX1NUUkVBTV9SRUdfQkFTRSwKKwkJLnR5cGUgPSBCVUZfVFlQRV9IRVZDLAorCQkuYnVmX3N0YXJ0ID0gMCwKKwkJLmJ1Zl9zaXplID0gREVGQVVMVF9WSURFT19CVUZGRVJfU0laRV80SywKKwkJLmRlZmF1bHRfYnVmX3NpemUgPSBERUZBVUxUX1ZJREVPX0JVRkZFUl9TSVpFXzRLLAorCQkuZmlyc3RfdHN0YW1wID0gSU5WQUxJRF9QVFMKKwl9LAorfTsKKworc3RydWN0IHN0cmVhbV9idWZfcyAqZ2V0X2J1Zl9ieV90eXBlKHUzMiB0eXBlKQoreworCWlmIChQVFNfVFlQRV9WSURFTyA9PSB0eXBlKQorCQlyZXR1cm4gJmJ1ZnNbQlVGX1RZUEVfVklERU9dOworCWlmIChQVFNfVFlQRV9BVURJTyA9PSB0eXBlKQorCQlyZXR1cm4gJmJ1ZnNbQlVGX1RZUEVfQVVESU9dOworCWlmIChoYXNfaGV2Y192ZGVjKCkpIHsKKwkJaWYgKFBUU19UWVBFX0hFVkMgPT0gdHlwZSkKKwkJCXJldHVybiAmYnVmc1tCVUZfVFlQRV9IRVZDXTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBzZXRfc2FtcGxlX3JhdGVfaW5mbyhpbnQgYXJnKQoreworCWF1ZGlvX2RlY19pbmZvLnNhbXBsZV9yYXRlID0gYXJnOworCWF1ZGlvX2RlY19pbmZvLnZhbGlkID0gMTsKK30KKwordm9pZCBzZXRfY2hfbnVtX2luZm8oaW50IGFyZykKK3sKKwlhdWRpb19kZWNfaW5mby5jaGFubmVscyA9IGFyZzsKK30KKworc3RydWN0IGF1ZGlvX2luZm8gKmdldF9hdWRpb19pbmZvKHZvaWQpCit7CisJcmV0dXJuICZhdWRpb19kZWNfaW5mbzsKK30KK0VYUE9SVF9TWU1CT0woZ2V0X2F1ZGlvX2luZm8pOworCitzdGF0aWMgdm9pZCBhbXN0cmVhbV9jaGFuZ2VfdmJ1ZnNpemUoc3RydWN0IHBvcnRfcHJpdl9zICpwcml2LAorCXN0cnVjdCBzdHJlYW1fYnVmX3MgKnB2YnVmKQoreworCWlmIChwdmJ1Zi0+YnVmX3N0YXJ0ICE9IDAgfHwgcHZidWYtPmV4dF9idWZfYWRkciAhPSAwKSB7CisJCXByX2luZm8oInN0cmVhbWJ1ZiBpcyBhbGxvY2VkLCBidWZfc3RhcnQgMHglbHgsIGV4dGJ1ZiAweCVseFxuIiwKKwkJCXB2YnVmLT5idWZfc3RhcnQsIHB2YnVmLT5leHRfYnVmX2FkZHIpOworCQlyZXR1cm47CisJfQorCWlmIChwcml2LT5wb3J0LT5pc180aykgeworCQlwdmJ1Zi0+YnVmX3NpemUgPSBkZWZfNGtfdnN0cmVhbWJ1Zl9zaXplTSAqIFNaXzFNOworCQlpZiAocHJpdi0+dmRlYy0+cG9ydF9mbGFnICYgUE9SVF9GTEFHX0RSTSkKKwkJCXB2YnVmLT5idWZfc2l6ZSA9IERFRkFVTFRfVklERU9fQlVGRkVSX1NJWkVfNEtfVFZQOworCQlpZiAoKHB2YnVmLT5idWZfc2l6ZSA+IDMwICogU1pfMU0pICYmCisJCShjb2RlY19tbV9nZXRfdG90YWxfc2l6ZSgpIDwgMjIwICogU1pfMU0pKSB7CisJCQkvKmlmIGxlc3MgdGhhbiAyNTBNLCB1c2VkIDIwTSBmb3IgNEsgJiAyNjUqLworCQkJcHZidWYtPmJ1Zl9zaXplID0gcHZidWYtPmJ1Zl9zaXplID4+IDE7CisJCX0KKwl9IGVsc2UgaWYgKHB2YnVmLT5idWZfc2l6ZSA+IGRlZl92c3RyZWFtYnVmX3NpemVNICogU1pfMU0pIHsKKwkJaWYgKHByaXYtPnZkZWMtPnBvcnRfZmxhZyAmIFBPUlRfRkxBR19EUk0pCisJCQlwdmJ1Zi0+YnVmX3NpemUgPSBERUZBVUxUX1ZJREVPX0JVRkZFUl9TSVpFX1RWUDsKKwl9IGVsc2UgeworCQlwdmJ1Zi0+YnVmX3NpemUgPSBkZWZfdnN0cmVhbWJ1Zl9zaXplTSAqIFNaXzFNOworCQlpZiAocHJpdi0+dmRlYy0+cG9ydF9mbGFnICYgUE9SVF9GTEFHX0RSTSkKKwkJCXB2YnVmLT5idWZfc2l6ZSA9IERFRkFVTFRfVklERU9fQlVGRkVSX1NJWkVfVFZQOworCX0KKwlyZXNldF9jYW51c2VfYnVmZXJsZXZlbCgxMDAwMCk7Cit9CisKK3N0YXRpYyBib29sIHBvcnRfZ2V0X2luaXRlZChzdHJ1Y3QgcG9ydF9wcml2X3MgKnByaXYpCit7CisJc3RydWN0IHN0cmVhbV9wb3J0X3MgKnBvcnQgPSBwcml2LT5wb3J0OworCisJaWYgKHBvcnQtPnR5cGUgJiBQT1JUX1RZUEVfVklERU8pIHsKKwkJc3RydWN0IHZkZWNfcyAqdmRlYyA9IHByaXYtPnZkZWM7CisKKwkJcmV0dXJuIHZkZWMgPyB2ZGVjLT5wb3J0X2ZsYWcgJiBQT1JUX0ZMQUdfSU5JVEVEIDogMDsKKwl9CisKKwlyZXR1cm4gcG9ydC0+ZmxhZyAmIFBPUlRfRkxBR19JTklURUQ7Cit9CisKK3N0YXRpYyB2b2lkIHBvcnRfc2V0X2luaXRlZChzdHJ1Y3QgcG9ydF9wcml2X3MgKnByaXYpCit7CisJc3RydWN0IHN0cmVhbV9wb3J0X3MgKnBvcnQgPSBwcml2LT5wb3J0OworCisJaWYgKHBvcnQtPnR5cGUgJiBQT1JUX1RZUEVfVklERU8pIHsKKwkJc3RydWN0IHZkZWNfcyAqdmRlYyA9IHByaXYtPnZkZWM7CisKKwkJdmRlYy0+cG9ydF9mbGFnIHw9IFBPUlRfRkxBR19JTklURUQ7CisJCXBvcnQtPmZsYWcgfD0gUE9SVF9GTEFHX0lOSVRFRDsKKwkJcHJfaW5mbygidmRlYy0+cG9ydF9mbGFnPTB4JXgsIHBvcnRfZmxhZz0weCV4XG4iLAorCQkJdmRlYy0+cG9ydF9mbGFnLCBwb3J0LT5mbGFnKTsKKwl9IGVsc2UKKwkJcG9ydC0+ZmxhZyB8PSBQT1JUX0ZMQUdfSU5JVEVEOworfQorCitzdGF0aWMgdm9pZCB2aWRlb19wb3J0X3JlbGVhc2Uoc3RydWN0IHBvcnRfcHJpdl9zICpwcml2LAorCSAgc3RydWN0IHN0cmVhbV9idWZfcyAqcGJ1ZiwgaW50IHJlbGVhc2VfbnVtKQoreworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBwcml2LT52ZGVjOworCXN0cnVjdCB2ZGVjX3MgKnNsYXZlID0gTlVMTDsKKworCWlmICghdmRlYykKKwkJcmV0dXJuOworCisJc3dpdGNoIChyZWxlYXNlX251bSkgeworCWRlZmF1bHQ6CisJLypmYWxsdGhyb3VnaCovCisJY2FzZSAwOgkJLypyZWxlYXNlIGFsbCAqLworCWNhc2UgMzoKKwkJaWYgKHZkZWMtPnNsYXZlKQorCQkJc2xhdmUgPSB2ZGVjLT5zbGF2ZTsKKwkJdmRlY19yZWxlYXNlKHZkZWMpOworCQlpZiAoc2xhdmUpCisJCQl2ZGVjX3JlbGVhc2Uoc2xhdmUpOworCQlwcml2LT52ZGVjID0gTlVMTDsKKwkvKmZhbGx0aHJvdWdoKi8KKwljYXNlIDE6CisJCTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdmlkZW9fcG9ydF9pbml0KHN0cnVjdCBwb3J0X3ByaXZfcyAqcHJpdiwKKwkJCSAgc3RydWN0IHN0cmVhbV9idWZfcyAqcGJ1ZikKK3sKKwlpbnQgcjsKKwlzdHJ1Y3Qgc3RyZWFtX3BvcnRfcyAqcG9ydCA9IHByaXYtPnBvcnQ7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9IHByaXYtPnZkZWM7CisKKwlpZiAoKHZkZWMtPnBvcnRfZmxhZyAmIFBPUlRfRkxBR19WRk9STUFUKSA9PSAwKSB7CisJCXByX2VycigidmZvcm1hdCBub3Qgc2V0XG4iKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisJaWYgKHZkZWNfZHVhbCh2ZGVjKSAmJiB2ZGVjX3NlY3VyZSh2ZGVjKSAmJiAodmRlYy0+c2xhdmUpKSB7CisJCS8qY29weSBkcm0gZmxhZ3MgZm9yIHNsYXZlIGRlYy4qLworCQl2ZGVjLT5zbGF2ZS0+cG9ydF9mbGFnIHw9IFBPUlRfRkxBR19EUk07CisJfQorCWlmIChwb3J0LT52Zm9ybWF0ID09IFZGT1JNQVRfSDI2NF80SzJLIHx8CisJCShwcml2LT52ZGVjLT5zeXNfaW5mby0+aGVpZ2h0ICoKKwkJCXByaXYtPnZkZWMtPnN5c19pbmZvLT53aWR0aCkgPiAxOTIwKjEwODgpIHsKKwkJcG9ydC0+aXNfNGsgPSB0cnVlOworCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UWExYCisJCQkJJiYgcG9ydC0+dmZvcm1hdCA9PSBWRk9STUFUX0gyNjQpIHsKKwkJCXZkZWNfcG93ZXJvbihWREVDX0hFVkMpOworCQl9CisJfSBlbHNlIHsKKwkJcG9ydC0+aXNfNGsgPSBmYWxzZTsKKwl9CisKKwlpZiAocG9ydC0+dHlwZSAmIFBPUlRfVFlQRV9GUkFNRSkgeworCQlyID0gdmRlY19pbml0KHZkZWMsCisJCQkocHJpdi0+dmRlYy0+c3lzX2luZm8tPmhlaWdodCAqCisJCQlwcml2LT52ZGVjLT5zeXNfaW5mby0+d2lkdGgpID4gMTkyMCoxMDg4LCBmYWxzZSk7CisJCWlmIChyIDwgMCkgeworCQkJcHJfZXJyKCJ2aWRlb19wb3J0X2luaXQgJWQsIHZkZWNfaW5pdCBmYWlsZWRcbiIsCisJCQkJX19MSU5FX18pOworCQkJcmV0dXJuIHI7CisJCX0KKyNpZiAwCisJCWlmICh2ZGVjX2R1YWwodmRlYykpIHsKKwkJCWlmIChwb3J0LT52Zm9ybWF0ID09IFZGT1JNQVRfQVYxKQkvKiBhdjEgZHYgb25seSBzaW5nbGUgbGF5ZXIgKi8KKwkJCQlyZXR1cm4gMDsKKwkJCXIgPSB2ZGVjX2luaXQodmRlYy0+c2xhdmUsCisJCQkJKHByaXYtPnZkZWMtPnN5c19pbmZvLT5oZWlnaHQgKgorCQkJCXByaXYtPnZkZWMtPnN5c19pbmZvLT53aWR0aCkgPiAxOTIwKjEwODgpOworCQkJaWYgKHIgPCAwKSB7CisJCQkJdmRlY19yZWxlYXNlKHZkZWMpOworCQkJCXByX2VycigidmlkZW9fcG9ydF9pbml0ICVkLCB2ZGVjX2luaXQgZmFpbGVkXG4iLAorCQkJCQlfX0xJTkVfXyk7CisJCQkJcmV0dXJuIHI7CisJCQl9CisJCX0KKyNlbmRpZgorCQlyZXR1cm4gMDsKKwl9CisKKwlhbXN0cmVhbV9jaGFuZ2VfdmJ1ZnNpemUocHJpdiwgcGJ1Zik7CisKKwlpZiAoaGFzX2hldmNfdmRlYygpKSB7CisJCWlmIChwb3J0LT50eXBlICYgUE9SVF9UWVBFX01QVFMpIHsKKwkJCWlmIChwYnVmLT50eXBlID09IEJVRl9UWVBFX0hFVkMpCisJCQkJdmRlY19wb3dlcm9mZihWREVDXzEpOworCQkJZWxzZQorCQkJCXZkZWNfcG93ZXJvZmYoVkRFQ19IRVZDKTsKKwkJfQorCX0KKworCS8qIHRvZG86IHNldCBwYXRoIGJhc2VkIG9uIHBvcnQgZmxhZyAqLworCXIgPSB2ZGVjX2luaXQodmRlYywKKwkJKHByaXYtPnZkZWMtPnN5c19pbmZvLT5oZWlnaHQgKgorCQkgcHJpdi0+dmRlYy0+c3lzX2luZm8tPndpZHRoKSA+IDE5MjAqMTA4OCwgZmFsc2UpOworCisJaWYgKHIgPCAwKSB7CisJCXByX2VycigidmlkZW9fcG9ydF9pbml0ICVkLCB2ZGVjX2luaXQgZmFpbGVkXG4iLCBfX0xJTkVfXyk7CisJCWdvdG8gZXJyOworCX0KKworCWlmICh2ZGVjX2R1YWwodmRlYykpIHsKKwkJciA9IHZkZWNfaW5pdCh2ZGVjLT5zbGF2ZSwKKwkJCShwcml2LT52ZGVjLT5zeXNfaW5mby0+aGVpZ2h0ICoKKwkJCXByaXYtPnZkZWMtPnN5c19pbmZvLT53aWR0aCkgPiAxOTIwKjEwODgsIGZhbHNlKTsKKwkJaWYgKHIgPCAwKSB7CisJCQlwcl9lcnIoInZpZGVvX3BvcnRfaW5pdCAlZCwgdmRlY19pbml0IGZhaWxlZFxuIiwgX19MSU5FX18pOworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK2VycjoKKwlpZiAodmRlYy0+c2xhdmUpCisJCXZkZWNfcmVsZWFzZSh2ZGVjLT5zbGF2ZSk7CisJaWYgKHZkZWMpCisJCXZkZWNfcmVsZWFzZSh2ZGVjKTsKKwlwcml2LT52ZGVjID0gTlVMTDsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBhdWRpb19wb3J0X3JlbGVhc2Uoc3RydWN0IHN0cmVhbV9wb3J0X3MgKnBvcnQsCisJCSAgIHN0cnVjdCBzdHJlYW1fYnVmX3MgKnBidWYsIGludCByZWxlYXNlX251bSkKK3sKKwlzd2l0Y2ggKHJlbGVhc2VfbnVtKSB7CisJZGVmYXVsdDoKKwkvKmZhbGx0aHJvdWdoKi8KKwljYXNlIDA6CQkvKnJlbGVhc2UgYWxsICovCisJLypmYWxsdGhyb3VnaCovCisJY2FzZSA0OgorCQllc3BhcnNlcl9yZWxlYXNlKHBidWYpOworCS8qZmFsbHRocm91Z2gqLworCWNhc2UgMzoKKwkJYWRlY19yZWxlYXNlKHBvcnQtPnZmb3JtYXQpOworCS8qZmFsbHRocm91Z2gqLworCWNhc2UgMjoKKwkJc3RidWZfcmVsZWFzZShwYnVmKTsKKwkvKmZhbGx0aHJvdWdoKi8KKwljYXNlIDE6CisJCTsKKwl9CisJYW1zdHJlYW1fYXVkaW9fcmVzZXQgPSAwOworCXJldHVybjsKK30KKworc3RhdGljIGludCBhdWRpb19wb3J0X3Jlc2V0KHN0cnVjdCBzdHJlYW1fcG9ydF9zICpwb3J0LAorCQkJCXN0cnVjdCBzdHJlYW1fYnVmX3MgKnBidWYpCit7CisJaW50IHI7CisJaWYgKChwb3J0LT5mbGFnICYgUE9SVF9GTEFHX0FGT1JNQVQpID09IDApIHsKKwkJcHJfZXJyKCJhZm9ybWF0IG5vdCBzZXRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwcl9pbmZvKCJhdWRpbyBwb3J0IHJlc2V0LCBmbGFnOjB4JXhcbiIsIHBvcnQtPmZsYWcpOworCWlmICgocG9ydC0+ZmxhZyAmIFBPUlRfRkxBR19JTklURUQpID09IDApIHsKKwkJcHJfaW5mbygiYXVkaW8gcG9ydCBub3QgaW5pdGVkLHJldHVyblxuIik7CisJCXJldHVybiAwOworCX0KKworCXByX2luZm8oImF1ZGlvX3BvcnRfcmVzZXQgYmVnaW5cbiIpOworCXB0c19zdG9wKFBUU19UWVBFX0FVRElPKTsKKworCXN0YnVmX3JlbGVhc2UocGJ1Zik7CisKKwlyID0gc3RidWZfaW5pdChwYnVmLCBOVUxMKTsKKwlpZiAociA8IDApIHsKKwkJcmV0dXJuIHI7CisJfQorCisJciA9IGFkZWNfaW5pdChwb3J0KTsKKwlpZiAociA8IDApIHsKKwkJYXVkaW9fcG9ydF9yZWxlYXNlKHBvcnQsIHBidWYsIDIpOworCQlyZXR1cm4gcjsKKwl9CisKKwlpZiAocG9ydC0+dHlwZSAmIFBPUlRfVFlQRV9FUykKKwkJZXNwYXJzZXJfYXVkaW9fcmVzZXRfcyhwYnVmKTsKKworCWlmIChwb3J0LT50eXBlICYgUE9SVF9UWVBFX01QVFMpCisJCXRzZGVtdXhfYXVkaW9fcmVzZXQoKTsKKworCWlmIChwb3J0LT50eXBlICYgUE9SVF9UWVBFX01QUFMpCisJCXBzcGFyc2VyX2F1ZGlvX3Jlc2V0KCk7CisKKyNpZmRlZiBDT05GSUdfQU1fVkRFQ19SRUFMCisJaWYgKHBvcnQtPnR5cGUgJiBQT1JUX1RZUEVfUk0pCisJCXJtX2F1ZGlvX3Jlc2V0KCk7CisjZW5kaWYKKworCXBidWYtPmZsYWcgfD0gQlVGX0ZMQUdfSU5fVVNFOworCWFtc3RyZWFtX2F1ZGlvX3Jlc2V0ID0gMTsKKworCXIgPSBwdHNfc3RhcnQoUFRTX1RZUEVfQVVESU8pOworCisJLy9jbGVhciBhdWRpbyBicmVhayBmbGFnIGFmdGVyIHJlc2V0CisJLy90c3luY19hdWRpb19icmVhaygwKTsKKworCXByX2luZm8oImF1ZGlvX3BvcnRfcmVzZXQgZG9uZVxuIik7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgc3ViX3BvcnRfcmVzZXQoc3RydWN0IHN0cmVhbV9wb3J0X3MgKnBvcnQsCisJCQkJc3RydWN0IHN0cmVhbV9idWZfcyAqcGJ1ZikKK3sKKwlpbnQgcjsKKworCXBvcnQtPmZsYWcgJj0gKH5QT1JUX0ZMQUdfSU5JVEVEKTsKKworCXN0YnVmX3JlbGVhc2UocGJ1Zik7CisKKwlyID0gc3RidWZfaW5pdChwYnVmLCBOVUxMKTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJaWYgKHBvcnQtPnR5cGUgJiBQT1JUX1RZUEVfTVBUUykKKwkJdHNkZW11eF9zdWJfcmVzZXQoKTsKKworCWlmIChwb3J0LT50eXBlICYgUE9SVF9UWVBFX01QUFMpCisJCXBzcGFyc2VyX3N1Yl9yZXNldCgpOworCisJaWYgKHBvcnQtPnNpZCA9PSAweGZmZmYpIHsJLyogZXMgc3ViICovCisJCWVzcGFyc2VyX3N1Yl9yZXNldCgpOworCQlwYnVmLT5mbGFnIHw9IEJVRl9GTEFHX1BBUlNFUjsKKwl9CisKKwlwYnVmLT5mbGFnIHw9IEJVRl9GTEFHX0lOX1VTRTsKKworCXBvcnQtPmZsYWcgfD0gUE9SVF9GTEFHX0lOSVRFRDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1ZGlvX3BvcnRfaW5pdChzdHJ1Y3Qgc3RyZWFtX3BvcnRfcyAqcG9ydCwKKwkJCXN0cnVjdCBzdHJlYW1fYnVmX3MgKnBidWYpCit7CisJaW50IHI7CisKKwlpZiAoKHBvcnQtPmZsYWcgJiBQT1JUX0ZMQUdfQUZPUk1BVCkgPT0gMCkgeworCQlwcl9lcnIoImFmb3JtYXQgbm90IHNldFxuIik7CisJCXJldHVybiAwOworCX0KKworCXIgPSBzdGJ1Zl9pbml0KHBidWYsIE5VTEwpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisJciA9IGFkZWNfaW5pdChwb3J0KTsKKwlpZiAociA8IDApIHsKKwkJYXVkaW9fcG9ydF9yZWxlYXNlKHBvcnQsIHBidWYsIDIpOworCQlyZXR1cm4gcjsKKwl9CisJaWYgKHBvcnQtPnR5cGUgJiBQT1JUX1RZUEVfRVMpIHsKKwkJciA9IGVzcGFyc2VyX2luaXQocGJ1ZiwgTlVMTCk7CisJCWlmIChyIDwgMCkgeworCQkJYXVkaW9fcG9ydF9yZWxlYXNlKHBvcnQsIHBidWYsIDMpOworCQkJcmV0dXJuIHI7CisJCX0KKwl9CisJcGJ1Zi0+ZmxhZyB8PSBCVUZfRkxBR19JTl9VU0U7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN1Yl9wb3J0X3JlbGVhc2Uoc3RydWN0IHN0cmVhbV9wb3J0X3MgKnBvcnQsCisJCQkJCXN0cnVjdCBzdHJlYW1fYnVmX3MgKnBidWYpCit7CisJaWYgKChwb3J0LT5zaWQgPT0gMHhmZmZmKSAmJgorCQkoKHBvcnQtPnR5cGUgJiAoUE9SVF9UWVBFX01QUFMgfCBQT1JUX1RZUEVfTVBUUykpID09IDApKSB7CisJCS8qIHRoaXMgaXMgZXMgc3ViICovCisJCWVzcGFyc2VyX3JlbGVhc2UocGJ1Zik7CisJfQorCXN0YnVmX3JlbGVhc2UocGJ1Zik7CisJc3ViX3BvcnRfaW5pdGVkID0gMDsKK30KKworc3RhdGljIGludCBzdWJfcG9ydF9pbml0KHN0cnVjdCBzdHJlYW1fcG9ydF9zICpwb3J0LCBzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpwYnVmKQoreworCWludCByOworCXIgPSBzdGJ1Zl9pbml0KHBidWYsIE5VTEwpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisJaWYgKChwb3J0LT5mbGFnICYgUE9SVF9GTEFHX1NJRCkgPT0gMCkgeworCQlwcl9lcnIoInN1YnRpdGxlIGlkIG5vdCBzZXRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKHBvcnQtPnNpZCA9PSAweGZmZmYpICYmCisJCSgocG9ydC0+dHlwZSAmIChQT1JUX1RZUEVfTVBQUyB8IFBPUlRfVFlQRV9NUFRTKSkgPT0gMCkpIHsKKwkJLyogZXMgc3ViICovCisJCXIgPSBlc3BhcnNlcl9pbml0KHBidWYsIE5VTEwpOworCQlpZiAociA8IDApIHsKKwkJCXN1Yl9wb3J0X3JlbGVhc2UocG9ydCwgcGJ1Zik7CisJCQlyZXR1cm4gcjsKKwkJfQorCX0KKworCXN1Yl9wb3J0X2luaXRlZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFtc3RyZWFtX3VzZXJfYnVmZmVyX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpwdWJ1ZiA9ICZidWZzW0JVRl9UWVBFX1VTRVJEQVRBXTsKKworCXB1YnVmLT5idWZfc2l6ZSA9IDA7CisJcHVidWYtPmJ1Zl9zdGFydCA9IDA7CisJcHVidWYtPmJ1Zl93cCA9IDA7CisJcHVidWYtPmJ1Zl9ycCA9IDA7Cit9CisKKyNpZiAxCisvKkRERCovCitzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpnZXRfdmJ1Zih2b2lkKQoreworCXJldHVybiAmYnVmc1tCVUZfVFlQRV9WSURFT107Cit9CisKK0VYUE9SVF9TWU1CT0woZ2V0X3ZidWYpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgYW1zdHJlYW1fcG9ydF9pbml0KHN0cnVjdCBwb3J0X3ByaXZfcyAqcHJpdikKK3sKKwlpbnQgciA9IDA7CisJc3RydWN0IHN0cmVhbV9idWZfcyAqcHZidWYgPSAmYnVmc1tCVUZfVFlQRV9WSURFT107CisJc3RydWN0IHN0cmVhbV9idWZfcyAqcGFidWYgPSAmYnVmc1tCVUZfVFlQRV9BVURJT107CisJc3RydWN0IHN0cmVhbV9idWZfcyAqcHNidWYgPSAmYnVmc1tCVUZfVFlQRV9TVUJUSVRMRV07CisJc3RydWN0IHN0cmVhbV9wb3J0X3MgKnBvcnQgPSBwcml2LT5wb3J0OworCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBwcml2LT52ZGVjOworCisJciA9IHZkZWNfcmVzb3VyY2VfY2hlY2tpbmcodmRlYyk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCW11dGV4X2xvY2soJmFtc3RyZWFtX211dGV4KTsKKworCWlmICgoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9HMTJBKSAmJgorCQkoZ2V0X2NwdV9tYWpvcl9pZCgpIDwgQU1fTUVTT05fQ1BVX01BSk9SX0lEX1NDMikpIHsKKwkJciA9IGNoZWNrX2VmdXNlX2NoaXAocG9ydC0+dmZvcm1hdCk7CisJCWlmIChyKSB7CisJCQlwcl9pbmZvKCJObyBzdXBwb3J0IHZpZGVvIGZvcm1hdCAlZC5cbiIsIHBvcnQtPnZmb3JtYXQpOworCQkJbXV0ZXhfdW5sb2NrKCZhbXN0cmVhbV9tdXRleCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qIHRyeSB0byByZWxvYWQgdGhlIGZ3LiovCisJciA9IHZpZGVvX2Z3X3JlbG9hZChGV19MT0FEX1RSWSk7CisJaWYgKHIpCisJCXByX2VycigidGhlIGZpcm13YXJlIHJlbG9hZCBmYWlsLlxuIik7CisKKwlzdGJ1Zl9mZXRjaF9pbml0KCk7CisKKwlhbXN0cmVhbV91c2VyX2J1ZmZlcl9pbml0KCk7CisKKwlpZiAocG9ydF9nZXRfaW5pdGVkKHByaXYpKSB7CisJCW11dGV4X3VubG9jaygmYW1zdHJlYW1fbXV0ZXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKHBvcnQtPnR5cGUgJiBQT1JUX1RZUEVfQVVESU8pICYmCisJCShwb3J0LT5mbGFnICYgUE9SVF9GTEFHX0FGT1JNQVQpKSB7CisJCXIgPSBhdWRpb19wb3J0X2luaXQocG9ydCwgcGFidWYpOworCQlpZiAociA8IDApIHsKKwkJCXByX2VycigiYXVkaW9fcG9ydF9pbml0ICBmYWlsZWRcbiIpOworCQkJZ290byBlcnJvcjE7CisJCX0KKwl9CisKKwlpZiAoKHBvcnQtPnR5cGUgJiBQT1JUX1RZUEVfVklERU8pICYmCisJCShwb3J0LT5mbGFnICYgUE9SVF9GTEFHX1ZGT1JNQVQpKSB7CisJCWlmICh2ZGVjX3N0cmVhbV9iYXNlZCh2ZGVjKSkgeworCQkJc3RydWN0IHN0cmVhbV9idWZfb3BzICpvcHMgPSBOVUxMOworCQkJc3RydWN0IHBhcnNlcl9hcmdzIHBhcnMJPSB7CisJCQkJLnZpZCA9IChwb3J0LT5mbGFnICYgUE9SVF9GTEFHX1ZJRCkgPyBwb3J0LT52aWQgOiAweGZmZmYsCisJCQkJLmFpZCA9IChwb3J0LT5mbGFnICYgUE9SVF9GTEFHX0FJRCkgPyBwb3J0LT5haWQgOiAweGZmZmYsCisJCQkJLnNpZCA9IChwb3J0LT5mbGFnICYgUE9SVF9GTEFHX1NJRCkgPyBwb3J0LT5zaWQgOiAweGZmZmYsCisJCQkJLnBjcmlkID0gKHBvcnQtPnBjcl9pbml0ZWQgPT0gMSkgPyBwb3J0LT5wY3JpZCA6IDB4ZmZmZiwKKwkJCX07CisKKwkJCWlmIChwb3J0LT50eXBlICYgUE9SVF9UWVBFX01QVFMpIHsKKwkJCQlvcHMgPSBnZXRfdHNwYXJzZXJfc3RidWZfb3BzKCk7CisJCQl9IGVsc2UgaWYgKHBvcnQtPnR5cGUgJiBQT1JUX1RZUEVfTVBQUykgeworCQkJCW9wcyA9IGdldF9wc3BhcnNlcl9zdGJ1Zl9vcHMoKTsKKwkJCX0gZWxzZSB7CisJCQkJb3BzID0gIXZkZWNfc2luZ2xlKHZkZWMpID8KKwkJCQkJZ2V0X3N0YnVmX29wcygpIDoKKwkJCQkJZ2V0X2VzcGFyc2VyX3N0YnVmX29wcygpOworCisJCQkJLyogZGVmIHVzZWQgc3RidWYgd2l0aCBwYXJzZXIgaWYgdGhlIGZlYXR1cmUgZGlzYWJsZS4gKi8KKwkJCQlpZiAoIWlzX3N1cHBvcnRfbm9fcGFyc2VyKCkpCisJCQkJCW9wcyA9IGdldF9lc3BhcnNlcl9zdGJ1Zl9vcHMoKTsKKwkJCQllbHNlIGlmICh2ZGVjLT5mb3JtYXQgPT0gVkZPUk1BVF9IMjY0TVZDIHx8CisJCQkJCXZkZWMtPmZvcm1hdCA9PSBWRk9STUFUX1ZDMSkKKwkJCQkJb3BzID0gZ2V0X3N0YnVmX29wcygpOworCQkJfQorCisJCQlyID0gc3RyZWFtX2J1ZmZlcl9iYXNlX2luaXQoJnZkZWMtPnZidWYsIG9wcywgJnBhcnMpOworCQkJaWYgKHIpIHsKKwkJCQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKKwkJCQlwcl9lcnIoInN0cmVhbSBidWZmZXIgYmFzZSBpbml0IGZhaWxlZFxuIik7CisJCQkJZ290byBlcnJvcjI7CisJCQl9CisJCX0KKworCQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7CisJCXIgPSB2aWRlb19wb3J0X2luaXQocHJpdiwgJnZkZWMtPnZidWYpOworCQlpZiAociA8IDApIHsKKwkJCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOworCQkJcHJfZXJyKCJ2aWRlb19wb3J0X2luaXQgZmFpbGVkXG4iKTsKKwkJCWdvdG8gZXJyb3IyOworCQl9CisJCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOworCX0KKworCWlmICgocG9ydC0+dHlwZSAmIFBPUlRfVFlQRV9NUFRTKSAmJgorCQkhKHBvcnQtPmZsYWcgJiBQT1JUX0ZMQUdfVkZPUk1BVCkpIHsKKwkJciA9IHRzZGVtdXhfaW5pdCgweGZmZmYsCisJCQkocG9ydC0+ZmxhZyAmIFBPUlRfRkxBR19BSUQpID8gcG9ydC0+YWlkIDogMHhmZmZmLAorCQkJKHBvcnQtPmZsYWcgJiBQT1JUX0ZMQUdfU0lEKSA/IHBvcnQtPnNpZCA6IDB4ZmZmZiwKKwkJCShwb3J0LT5wY3JfaW5pdGVkID09IDEpID8gcG9ydC0+cGNyaWQgOiAweGZmZmYsCisJCQkwLCB2ZGVjKTsKKwkJaWYgKHIgPCAwKSB7CisJCQlwcl9lcnIoInRzZGVtdXhfaW5pdCAgZmFpbGVkXG4iKTsKKwkJCWdvdG8gZXJyb3IzOworCQl9CisJCXRzeW5jX3Bjcl9zdGFydCgpOworCX0KKworCWlmICgocG9ydC0+dHlwZSAmIFBPUlRfVFlQRV9TVUIpICYmIChwb3J0LT5mbGFnICYgUE9SVF9GTEFHX1NJRCkpIHsKKwkJciA9IHN1Yl9wb3J0X2luaXQocG9ydCwgcHNidWYpOworCQlpZiAociA8IDApIHsKKwkJCXByX2Vycigic3ViX3BvcnRfaW5pdCAgZmFpbGVkXG4iKTsKKwkJCWdvdG8gZXJyb3I0OworCQl9CisJfQorCisjaWZkZWYgQ09ORklHX0FNX1ZERUNfUkVBTAorCWlmIChwb3J0LT50eXBlICYgUE9SVF9UWVBFX1JNKSB7CisJCXJtX3NldF92YXNpZCgKKwkJCShwb3J0LT5mbGFnICYgUE9SVF9GTEFHX1ZJRCkgPyBwb3J0LT52aWQgOiAweGZmZmYsCisJCQkocG9ydC0+ZmxhZyAmIFBPUlRfRkxBR19BSUQpID8gcG9ydC0+YWlkIDogMHhmZmZmKTsKKwl9CisjZW5kaWYKKyNpZiAxCS8qIE1FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09ONlRWRCAqLworCWlmICghTk9fVkRFQzJfSU5JVCkgeworCQlpZiAoKHBvcnQtPnR5cGUgJiBQT1JUX1RZUEVfVklERU8pCisJCQkmJiAocG9ydC0+dmZvcm1hdCA9PSBWRk9STUFUX0gyNjRfNEsySykpCisJCQlzdGJ1Zl92ZGVjMl9pbml0KHB2YnVmKTsKKwl9CisjZW5kaWYKKworCWlmICgocG9ydC0+dHlwZSAmIFBPUlRfVFlQRV9WSURFTykgJiYKKwkJKHZkZWMtPnBvcnRfZmxhZyAmIFBPUlRfRkxBR19WRk9STUFUKSkKKwkJLyogY29ubmVjdCB2ZGVjIGF0IHRoZSBlbmQgYWZ0ZXIgYWxsIEhXIGluaXRpYWxpemF0aW9uICovCisJCXZkZWNfY29ubmVjdCh2ZGVjKTsKKworCXRzeW5jX2F1ZGlvX2JyZWFrKDApOwkvKiBjbGVhciBhdWRpbyBicmVhayAqLworCXNldF92c3luY19wdHNfaW5jX21vZGUoMCk7CS8qIGNsZWFyIHZpZGVvIGluYyAqLworCisJcG9ydF9zZXRfaW5pdGVkKHByaXYpOworCisJbXV0ZXhfdW5sb2NrKCZhbXN0cmVhbV9tdXRleCk7CisJcmV0dXJuIDA7CisJLyplcnJvcnMgZm9sbG93IGhlcmUgKi8KKworZXJyb3I0OgorCWlmICgocG9ydC0+dHlwZSAmIFBPUlRfVFlQRV9NUFRTKSAmJgorCQkhKHBvcnQtPmZsYWcgJiBQT1JUX0ZMQUdfVkZPUk1BVCkpCisJCXRzZGVtdXhfcmVsZWFzZSgpOworZXJyb3IzOgorCWlmICgocG9ydC0+dHlwZSAmIFBPUlRfVFlQRV9WSURFTykgJiYKKwkJKHBvcnQtPmZsYWcgJiBQT1JUX0ZMQUdfVkZPUk1BVCkpCisJCXZpZGVvX3BvcnRfcmVsZWFzZShwcml2LCAmcHJpdi0+dmRlYy0+dmJ1ZiwgMCk7CitlcnJvcjI6CisJaWYgKChwb3J0LT50eXBlICYgUE9SVF9UWVBFX0FVRElPKSAmJgorCQkocG9ydC0+ZmxhZyAmIFBPUlRfRkxBR19BRk9STUFUKSkKKwkJYXVkaW9fcG9ydF9yZWxlYXNlKHBvcnQsIHBhYnVmLCAwKTsKK2Vycm9yMToKKwltdXRleF91bmxvY2soJmFtc3RyZWFtX211dGV4KTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBhbXN0cmVhbV9wb3J0X3JlbGVhc2Uoc3RydWN0IHBvcnRfcHJpdl9zICpwcml2KQoreworCXN0cnVjdCBzdHJlYW1fcG9ydF9zICpwb3J0ID0gcHJpdi0+cG9ydDsKKwlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpwdmJ1ZiA9ICZwcml2LT52ZGVjLT52YnVmOworCXN0cnVjdCBzdHJlYW1fYnVmX3MgKnBhYnVmID0gJmJ1ZnNbQlVGX1RZUEVfQVVESU9dOworCXN0cnVjdCBzdHJlYW1fYnVmX3MgKnBzYnVmID0gJmJ1ZnNbQlVGX1RZUEVfU1VCVElUTEVdOworCisJaWYgKChwb3J0LT50eXBlICYgUE9SVF9UWVBFX01QVFMpICYmCisJCSEocG9ydC0+ZmxhZyAmIFBPUlRfRkxBR19WRk9STUFUKSkgeworCQl0c3luY19wY3Jfc3RvcCgpOworCQl0c2RlbXV4X3JlbGVhc2UoKTsKKwl9CisKKwlpZiAoKHBvcnQtPnR5cGUgJiBQT1JUX1RZUEVfTVBQUykgJiYKKwkJIShwb3J0LT5mbGFnICYgUE9SVF9GTEFHX1ZGT1JNQVQpKSB7CisJCXBzcGFyc2VyX3JlbGVhc2UoKTsKKwl9CisKKwlpZiAocG9ydC0+dHlwZSAmIFBPUlRfVFlQRV9WSURFTykgeworCQl2aWRlb19wb3J0X3JlbGVhc2UocHJpdiwgcHZidWYsIDApOworCX0KKworCWlmIChwb3J0LT50eXBlICYgUE9SVF9UWVBFX0FVRElPKQorCQlhdWRpb19wb3J0X3JlbGVhc2UocG9ydCwgcGFidWYsIDApOworCisJaWYgKHBvcnQtPnR5cGUgJiBQT1JUX1RZUEVfU1VCKQorCQlzdWJfcG9ydF9yZWxlYXNlKHBvcnQsIHBzYnVmKTsKKworCXBvcnQtPnBjcl9pbml0ZWQgPSAwOworCisJaWYgKCFpc19tdWx0X2luYyhwb3J0LT50eXBlKSB8fAorCQkoaXNfbXVsdF9pbmMocG9ydC0+dHlwZSkgJiYKKwkJIWlzX3N1cHBvcnRfbm9fcGFyc2VyKCkpKQorCQlwb3J0LT5mbGFnID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhbXN0cmVhbV9jaGFuZ2VfYXZpZChzdHJ1Y3Qgc3RyZWFtX3BvcnRfcyAqcG9ydCkKK3sKKwlpZiAocG9ydC0+dHlwZSAmIFBPUlRfVFlQRV9NUFRTKSB7CisJCXRzZGVtdXhfY2hhbmdlX2F2aWQoCisJCShwb3J0LT5mbGFnICYgUE9SVF9GTEFHX1ZJRCkgPyBwb3J0LT52aWQgOiAweGZmZmYsCisJCShwb3J0LT5mbGFnICYgUE9SVF9GTEFHX0FJRCkgPyBwb3J0LT5haWQgOiAweGZmZmYpOworCX0KKworCWlmIChwb3J0LT50eXBlICYgUE9SVF9UWVBFX01QUFMpIHsKKwkJcHNwYXJzZXJfY2hhbmdlX2F2aWQoCisJCShwb3J0LT5mbGFnICYgUE9SVF9GTEFHX1ZJRCkgPyBwb3J0LT52aWQgOiAweGZmZmYsCisJCShwb3J0LT5mbGFnICYgUE9SVF9GTEFHX0FJRCkgPyBwb3J0LT5haWQgOiAweGZmZmYpOworCX0KKworI2lmZGVmIENPTkZJR19BTV9WREVDX1JFQUwKKwlpZiAocG9ydC0+dHlwZSAmIFBPUlRfVFlQRV9STSkgeworCQlybV9zZXRfdmFzaWQoCisJCShwb3J0LT5mbGFnICYgUE9SVF9GTEFHX1ZJRCkgPyBwb3J0LT52aWQgOiAweGZmZmYsCisJCShwb3J0LT5mbGFnICYgUE9SVF9GTEFHX0FJRCkgPyBwb3J0LT5haWQgOiAweGZmZmYpOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBhbXN0cmVhbV9jaGFuZ2Vfc2lkKHN0cnVjdCBzdHJlYW1fcG9ydF9zICpwb3J0KQoreworCWlmIChwb3J0LT50eXBlICYgUE9SVF9UWVBFX01QVFMpIHsKKwkJdHNkZW11eF9jaGFuZ2Vfc2lkKAorCQkocG9ydC0+ZmxhZyAmIFBPUlRfRkxBR19TSUQpID8gcG9ydC0+c2lkIDogMHhmZmZmKTsKKwl9CisKKwlpZiAocG9ydC0+dHlwZSAmIFBPUlRfVFlQRV9NUFBTKSB7CisJCXBzcGFyc2VyX2NoYW5nZV9zaWQoCisJCShwb3J0LT5mbGFnICYgUE9SVF9GTEFHX1NJRCkgPyBwb3J0LT5zaWQgOiAweGZmZmYpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHNzaXplX3QgYW1zdHJlYW1fdmJ1Zl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLAorCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgcG9ydF9wcml2X3MgKnByaXYgPSAoc3RydWN0IHBvcnRfcHJpdl9zICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzdHJlYW1fYnVmX3MgKnBidWYgPSAmcHJpdi0+dmRlYy0+dmJ1ZjsKKwlpbnQgcjsKKworCWlmICghKHBvcnRfZ2V0X2luaXRlZChwcml2KSkpIHsKKwkJciA9IGFtc3RyZWFtX3BvcnRfaW5pdChwcml2KTsKKwkJaWYgKHIgPCAwKQorCQkJcmV0dXJuIHI7CisJfQorCisJaWYgKHByaXYtPnZkZWMtPnBvcnRfZmxhZyAmIFBPUlRfRkxBR19EUk0pCisJCXIgPSBkcm1fd3JpdGUoZmlsZSwgcGJ1ZiwgYnVmLCBjb3VudCk7CisJZWxzZQorCQlyID0gc3RyZWFtX2J1ZmZlcl93cml0ZShmaWxlLCBwYnVmLCBidWYsIGNvdW50KTsKKwlpZiAoc2xvd19pbnB1dCkgeworCQlwcl9pbmZvKCJzbG93X2lucHV0OiBlcyBjb2RlYyB3cml0ZSBzaXplICV4XG4iLCByKTsKKwkJbXNsZWVwKDMwMDApOworCX0KKyNpZmRlZiBEQVRBX0RFQlVHCisJZGVidWdfZmlsZV93cml0ZShidWYsIHIpOworI2VuZGlmCisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHNzaXplX3QgYW1zdHJlYW1fdmZyYW1lX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWYsCisJCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBwb3J0X3ByaXZfcyAqcHJpdiA9IChzdHJ1Y3QgcG9ydF9wcml2X3MgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3NpemVfdCByZXQ7CisJaW50IHdhaXRfbWF4X2NudCA9IDU7CisjaWZkZWYgREFUQV9ERUJVRworCWRlYnVnX2ZpbGVfd3JpdGUoYnVmLCBjb3VudCk7CisjZW5kaWYKKwlkbyB7CisJCXJldCA9IHZkZWNfd3JpdGVfdmZyYW1lKHByaXYtPnZkZWMsIGJ1ZiwgY291bnQpOworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCWJyZWFrOy8qYWx3YXkgcmV0dXJuIGZvciBubyBibG9jayBtb2RlLiovCisJCX0gZWxzZSBpZiAocmV0ID09IC1FQUdBSU4pIHsKKwkJCWludCBsZXZlbDsKKwkJCWxldmVsID0gdmRlY19pbnB1dF9sZXZlbCgmcHJpdi0+dmRlYy0+aW5wdXQpOworCQkJaWYgKHdhaXRfbWF4X2NudC0tIDwgMCkKKwkJCQlicmVhazsKKwkJCW1zbGVlcCgyMCk7CisJCX0KKwl9IHdoaWxlIChyZXQgPT0gLUVBR0FJTik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYW1zdHJlYW1fYWJ1Zl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLAorCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgcG9ydF9wcml2X3MgKnByaXYgPSAoc3RydWN0IHBvcnRfcHJpdl9zICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzdHJlYW1fcG9ydF9zICpwb3J0ID0gcHJpdi0+cG9ydDsKKwlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpwYnVmID0gJmJ1ZnNbQlVGX1RZUEVfQVVESU9dOworCWludCByOworCisJaWYgKCEocG9ydF9nZXRfaW5pdGVkKHByaXYpKSkgeworCQlyID0gYW1zdHJlYW1fcG9ydF9pbml0KHByaXYpOworCQlpZiAociA8IDApCisJCQlyZXR1cm4gcjsKKwl9CisKKwlpZiAocG9ydC0+ZmxhZyAmIFBPUlRfRkxBR19EUk0pCisJCXIgPSBkcm1fd3JpdGUoZmlsZSwgcGJ1ZiwgYnVmLCBjb3VudCk7CisJZWxzZQorCQlyID0gZXNwYXJzZXJfd3JpdGUoZmlsZSwgcGJ1ZiwgYnVmLCBjb3VudCk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHNzaXplX3QgYW1zdHJlYW1fbXB0c193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgcG9ydF9wcml2X3MgKnByaXYgPSAoc3RydWN0IHBvcnRfcHJpdl9zICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzdHJlYW1fcG9ydF9zICpwb3J0ID0gcHJpdi0+cG9ydDsKKwlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpwYWJ1ZiA9ICZidWZzW0JVRl9UWVBFX0FVRElPXTsKKwlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpwdmJ1ZiA9ICZwcml2LT52ZGVjLT52YnVmOworCWludCByID0gMDsKKworCWlmICghKHBvcnRfZ2V0X2luaXRlZChwcml2KSkpIHsKKwkJciA9IGFtc3RyZWFtX3BvcnRfaW5pdChwcml2KTsKKwkJaWYgKHIgPCAwKQorCQkJcmV0dXJuIHI7CisJfQorI2lmZGVmIERBVEFfREVCVUcKKwlkZWJ1Z19maWxlX3dyaXRlKGJ1ZiwgY291bnQpOworI2VuZGlmCisJaWYgKHBvcnQtPmZsYWcgJiBQT1JUX0ZMQUdfRFJNKQorCQlyID0gZHJtX3Rzd3JpdGUoZmlsZSwgcHZidWYsIHBhYnVmLCBidWYsIGNvdW50KTsKKwllbHNlCisJCXIgPSB0c2RlbXV4X3dyaXRlKGZpbGUsIHB2YnVmLCBwYWJ1ZiwgYnVmLCBjb3VudCk7CisJaWYgKHNsb3dfaW5wdXQpIHsKKwkJcHJfaW5mbygic2xvd19pbnB1dDogdHMgY29kZWMgd3JpdGUgc2l6ZSAleFxuIiwgcik7CisJCW1zbGVlcCgzMDAwKTsKKwl9CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFtc3RyZWFtX21wcHNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHBvcnRfcHJpdl9zICpwcml2ID0gKHN0cnVjdCBwb3J0X3ByaXZfcyAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpwdmJ1ZiA9ICZidWZzW0JVRl9UWVBFX1ZJREVPXTsKKwlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpwYWJ1ZiA9ICZidWZzW0JVRl9UWVBFX0FVRElPXTsKKwlpbnQgcjsKKworCWlmICghKHBvcnRfZ2V0X2luaXRlZChwcml2KSkpIHsKKwkJciA9IGFtc3RyZWFtX3BvcnRfaW5pdChwcml2KTsKKwkJaWYgKHIgPCAwKQorCQkJcmV0dXJuIHI7CisJfQorCXJldHVybiBwc3BhcnNlcl93cml0ZShmaWxlLCBwdmJ1ZiwgcGFidWYsIGJ1ZiwgY291bnQpOworfQorCisjaWZkZWYgQ09ORklHX0FNX1ZERUNfUkVBTAorc3RhdGljIHNzaXplX3QgYW1zdHJlYW1fbXBybV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLAorCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgcG9ydF9wcml2X3MgKnByaXYgPSAoc3RydWN0IHBvcnRfcHJpdl9zICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzdHJlYW1fYnVmX3MgKnB2YnVmID0gJmJ1ZnNbQlVGX1RZUEVfVklERU9dOworCXN0cnVjdCBzdHJlYW1fYnVmX3MgKnBhYnVmID0gJmJ1ZnNbQlVGX1RZUEVfQVVESU9dOworCWludCByOworCisJaWYgKCEocG9ydF9nZXRfaW5pdGVkKHByaXYpKSkgeworCQlyID0gYW1zdHJlYW1fcG9ydF9pbml0KHByaXYpOworCQlpZiAociA8IDApCisJCQlyZXR1cm4gcjsKKwl9CisJcmV0dXJuIHJtcGFyc2VyX3dyaXRlKGZpbGUsIHB2YnVmLCBwYWJ1ZiwgYnVmLCBjb3VudCk7Cit9CisjZW5kaWYKKworc3RhdGljIHNzaXplX3QgYW1zdHJlYW1fc3ViX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXUzMiBzdWJfcnAsIHN1Yl93cCwgc3ViX3N0YXJ0LCBkYXRhX3NpemUsIHJlczsKKwlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpzX2J1ZiA9ICZidWZzW0JVRl9UWVBFX1NVQlRJVExFXTsKKworCWlmIChzdWJfcG9ydF9pbml0ZWQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlzdWJfcnAgPSBzdGJ1Zl9zdWJfcnBfZ2V0KCk7CisJc3ViX3dwID0gc3RidWZfc3ViX3dwX2dldCgpOworCXN1Yl9zdGFydCA9IHN0YnVmX3N1Yl9zdGFydF9nZXQoKTsKKworCWlmIChzdWJfd3AgPT0gc3ViX3JwIHx8IHN1Yl9ycCA9PSAwKQorCQlyZXR1cm4gMDsKKwkvKmZsdXNoIHN1YiBidWYgYmVmb3JlIHJlYWQqLworCWNvZGVjX21tX2RtYV9mbHVzaCgKKwkJCSh2b2lkKiljb2RlY19tbV9waHlzX3RvX3ZpcnQoc3ViX3N0YXJ0KSwKKwkJCXN0YnVmX3NpemUoc19idWYpLAorCQkJRE1BX0ZST01fREVWSUNFKTsKKwlpZiAoc3ViX3dwID4gc3ViX3JwKQorCQlkYXRhX3NpemUgPSBzdWJfd3AgLSBzdWJfcnA7CisJZWxzZQorCQlkYXRhX3NpemUgPSBzX2J1Zi0+YnVmX3NpemUgLSBzdWJfcnAgKyBzdWJfd3A7CisKKwlpZiAoZGF0YV9zaXplID4gY291bnQpCisJCWRhdGFfc2l6ZSA9IGNvdW50OworCisJaWYgKHN1Yl93cCA8IHN1Yl9ycCkgeworCQlpbnQgZmlyc3RfbnVtID0gc19idWYtPmJ1Zl9zaXplIC0gKHN1Yl9ycCAtIHN1Yl9zdGFydCk7CisKKwkJaWYgKGRhdGFfc2l6ZSA8PSBmaXJzdF9udW0pIHsKKwkJCXJlcyA9IGNvcHlfdG9fdXNlcigodm9pZCAqKWJ1ZiwKKwkJCQkodm9pZCAqKShjb2RlY19tbV9waHlzX3RvX3ZpcnQoc3ViX3JwKSksCisJCQkJZGF0YV9zaXplKTsKKwkJCXN0YnVmX3N1Yl9ycF9zZXQoc3ViX3JwICsgZGF0YV9zaXplIC0gcmVzKTsKKworCQkJcmV0dXJuIGRhdGFfc2l6ZSAtIHJlczsKKwkJfSBlbHNlIHsKKwkJCWlmIChmaXJzdF9udW0gPiAwKSB7CisJCQkJcmVzID0gY29weV90b191c2VyKCh2b2lkICopYnVmLAorCQkJCSh2b2lkICopKGNvZGVjX21tX3BoeXNfdG9fdmlydChzdWJfcnApKSwKKwkJCQkJZmlyc3RfbnVtKTsKKwkJCQlzdGJ1Zl9zdWJfcnBfc2V0KHN1Yl9ycCArIGZpcnN0X251bSAtCisJCQkJCQkJcmVzKTsKKworCQkJCXJldHVybiBmaXJzdF9udW0gLSByZXM7CisJCQl9CisKKwkJCXJlcyA9IGNvcHlfdG9fdXNlcigodm9pZCAqKWJ1ZiwKKwkJCQkodm9pZCAqKShjb2RlY19tbV9waHlzX3RvX3ZpcnQoc3ViX3N0YXJ0KSksCisJCQkJZGF0YV9zaXplIC0gZmlyc3RfbnVtKTsKKworCQkJc3RidWZfc3ViX3JwX3NldChzdWJfc3RhcnQgKyBkYXRhX3NpemUgLQorCQkJCWZpcnN0X251bSAtIHJlcyk7CisKKwkJCXJldHVybiBkYXRhX3NpemUgLSBmaXJzdF9udW0gLSByZXM7CisJCX0KKwl9IGVsc2UgeworCQlyZXMgPQorCQkJY29weV90b191c2VyKCh2b2lkICopYnVmLAorCQkJCSh2b2lkICopKGNvZGVjX21tX3BoeXNfdG9fdmlydChzdWJfcnApKSwKKwkJCQlkYXRhX3NpemUpOworCisJCXN0YnVmX3N1Yl9ycF9zZXQoc3ViX3JwICsgZGF0YV9zaXplIC0gcmVzKTsKKworCQlyZXR1cm4gZGF0YV9zaXplIC0gcmVzOworCX0KK30KKworc3RhdGljIHNzaXplX3QgYW1zdHJlYW1fc3ViX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWYsCisJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgcG9ydF9wcml2X3MgKnByaXYgPSAoc3RydWN0IHBvcnRfcHJpdl9zICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzdHJlYW1fYnVmX3MgKnBidWYgPSAmYnVmc1tCVUZfVFlQRV9TVUJUSVRMRV07CisJaW50IHI7CisKKwlpZiAoIShwb3J0X2dldF9pbml0ZWQocHJpdikpKSB7CisJCXIgPSBhbXN0cmVhbV9wb3J0X2luaXQocHJpdik7CisJCWlmIChyIDwgMCkKKwkJCXJldHVybiByOworCX0KKwlyID0gZXNwYXJzZXJfd3JpdGUoZmlsZSwgcGJ1ZiwgYnVmLCBjb3VudCk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCXdha2V1cF9zdWJfcG9sbCgpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYW1zdHJlYW1fc3ViX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCXBvbGxfdGFibGUgKndhaXRfdGFibGUpCit7CisJcG9sbF93YWl0KGZpbGUsICZhbXN0cmVhbV9zdWJfd2FpdCwgd2FpdF90YWJsZSk7CisKKwlpZiAoYXRvbWljX3JlYWQoJnN1YmRhdGFfcmVhZHkpKSB7CisJCWF0b21pY19kZWMoJnN1YmRhdGFfcmVhZHkpOworCQlyZXR1cm4gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF91c2VyZGF0YV9wb2Moc3RydWN0IHVzZXJkYXRhX3BvY19pbmZvX3QgcG9jKQoreworCXVzZXJkYXRhX3BvY19pbmZvW3VzZXJkYXRhX3BvY193aV0gPSBwb2M7CisJdXNlcmRhdGFfcG9jX3dpKys7CisJaWYgKHVzZXJkYXRhX3BvY193aSA9PSBVU0VSREFUQV9GSUZPX05VTSkKKwkJdXNlcmRhdGFfcG9jX3dpID0gMDsKK30KKwordm9pZCBpbml0X3VzZXJkYXRhX2ZpZm8odm9pZCkKK3sKKwl1c2VyZGF0YV9wb2NfcmkgPSAwOworCXVzZXJkYXRhX3BvY193aSA9IDA7CisJdXNlcmRhdGFfbGVuZ3RoID0gMDsKK30KK0VYUE9SVF9TWU1CT0woaW5pdF91c2VyZGF0YV9maWZvKTsKKwordm9pZCByZXNldF91c2VyZGF0YV9maWZvKGludCBiSW5pdCkKK3sKKwlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICp1c2VyZGF0YV9idWY7CisJaW50IHdpLCByaTsKKwl1MzIgcnAsIHdwOworCisJbXV0ZXhfbG9jaygmdXNlcmRhdGFfbXV0ZXgpOworCisJd2kgPSB1c2VyZGF0YV9wb2Nfd2k7CisJcmkgPSB1c2VyZGF0YV9wb2Nfcmk7CisKKwl1c2VyZGF0YV9idWYgPSAmYnVmc1tCVUZfVFlQRV9VU0VSREFUQV07CisJcnAgPSB1c2VyZGF0YV9idWYtPmJ1Zl9ycDsKKwl3cCA9IHVzZXJkYXRhX2J1Zi0+YnVmX3dwOworCWlmIChiSW5pdCkgeworCQkvKiBkZWNvZGVyIHJlc2V0ICovCisJCXVzZXJkYXRhX2J1Zi0+YnVmX3JwID0gMDsKKwkJdXNlcmRhdGFfYnVmLT5idWZfd3AgPSAwOworCQl1c2VyZGF0YV9wb2NfcmkgPSAwOworCQl1c2VyZGF0YV9wb2Nfd2kgPSAwOworCX0gZWxzZSB7CisJCS8qIGp1c3QgY2xlYW4gZmlmbyBidWZmZXIgKi8KKwkJdXNlcmRhdGFfYnVmLT5idWZfcnAgPSB1c2VyZGF0YV9idWYtPmJ1Zl93cDsKKwkJdXNlcmRhdGFfcG9jX3JpID0gdXNlcmRhdGFfcG9jX3dpOworCX0KKwl1c2VyZGF0YV9sZW5ndGggPSAwOworCWxhc3RfcmVhZF93aSA9IHVzZXJkYXRhX3BvY193aTsKKworCW11dGV4X3VubG9jaygmdXNlcmRhdGFfbXV0ZXgpOworCXByX2RlYnVnKCJyZXNldF91c2VyZGF0YV9maWZvLCBiSW5pdD0lZCwgd2k9JWQsIHJpPSVkLCBycD0lZCwgd3A9JWRcbiIsCisJCWJJbml0LCB3aSwgcmksIHJwLCB3cCk7Cit9CitFWFBPUlRfU1lNQk9MKHJlc2V0X3VzZXJkYXRhX2ZpZm8pOworCitpbnQgd2FrZXVwX3VzZXJkYXRhX3BvbGwoc3RydWN0IHVzZXJkYXRhX3BvY19pbmZvX3QgcG9jLAorCQkJCQkJaW50IHdwLAorCQkJCQkJdW5zaWduZWQgbG9uZyBzdGFydF9waHlhZGRyLAorCQkJCQkJaW50IGJ1Zl9zaXplLAorCQkJCQkJIGludCBkYXRhX2xlbmd0aCkKK3sKKwlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICp1c2VyZGF0YV9idWYgPSAmYnVmc1tCVUZfVFlQRV9VU0VSREFUQV07CisJbXV0ZXhfbG9jaygmdXNlcmRhdGFfbXV0ZXgpOworCisJaWYgKGRhdGFfbGVuZ3RoICYgMHg3KQorCQlkYXRhX2xlbmd0aCA9ICgoKGRhdGFfbGVuZ3RoICsgOCkgPj4gMykgPDwgMyk7CisJc2V0X3VzZXJkYXRhX3BvYyhwb2MpOworCXVzZXJkYXRhX2J1Zi0+YnVmX3N0YXJ0ID0gc3RhcnRfcGh5YWRkcjsKKwl1c2VyZGF0YV9idWYtPmJ1Zl93cCA9IHdwOworCXVzZXJkYXRhX2J1Zi0+YnVmX3NpemUgPSBidWZfc2l6ZTsKKwlhdG9taWNfc2V0KCZ1c2VyZGF0YV9yZWFkeSwgMSk7CisJdXNlcmRhdGFfbGVuZ3RoICs9IGRhdGFfbGVuZ3RoOworCW11dGV4X3VubG9jaygmdXNlcmRhdGFfbXV0ZXgpOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZhbXN0cmVhbV91c2VyZGF0YV93YWl0KTsKKwlyZXR1cm4gdXNlcmRhdGFfYnVmLT5idWZfcnA7Cit9CitFWFBPUlRfU1lNQk9MKHdha2V1cF91c2VyZGF0YV9wb2xsKTsKKworCit2b2lkIGFtc3RyZWFtX3dha2V1cF91c2VyZGF0YV9wb2xsKHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJaW50IGk7CisJc3RfdXNlcmRhdGEgKnVzZXJkYXRhID0gZ2V0X3ZkZWNfdXNlcmRhdGFfY3R4KCk7CisKKwlpZiAodmRlYyA9PSBOVUxMKSB7CisJCXByX2luZm8oIkVycm9yLCBpbnZhbGlkIHZkZWMgaW5zdGFuY2UhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW11dGV4X2xvY2soJnVzZXJkYXRhLT5tdXRleCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1VTRVJEQVRBX0NIQU5ORUxfTlVNOyBpKyspIHsKKwkJaWYgKHVzZXJkYXRhLT5zZXRfaWRfZmxhZyAmJiAodXNlcmRhdGEtPmlkW2ldID09IHZkZWMtPnZpZGVvX2lkKSkgeworCQkJdXNlcmRhdGEtPnJlYWR5X2ZsYWdbaV0gPSAxOworCQkJaWYgKHZkZWNfZ2V0X2RlYnVnX2ZsYWdzKCkgJiAweDEwMDAwMDAwKQorCQkJCXByX2luZm8oIiVzLCB3YWtldXAhIGlkID0gJWRcbiIsIF9fZnVuY19fLCB2ZGVjLT52aWRlb19pZCk7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICghdXNlcmRhdGEtPnNldF9pZF9mbGFnKSB7CisJCQlpZiAoIXVzZXJkYXRhLT51c2VkWzBdKSB7CisJCQkJdmRlYy0+dmlkZW9faWQgPSB2ZGVjLT5pZDsKKwkJCQl1c2VyZGF0YS0+aWRbMF0gPSB2ZGVjLT5pZDsKKwkJCQl1c2VyZGF0YS0+dXNlZFswXSA9IDE7CisJCQl9CisKKwkJCWlmICh2ZGVjX2dldF9kZWJ1Z19mbGFncygpICYgMHgxMDAwMDAwMCkKKwkJCQlwcl9pbmZvKCIlc1slZF0gdXNlcmRhdGEgaW5zdGFuY2UgJWQgcmVhZHkhXG4iLAorCQkJCV9fZnVuY19fLCBpLCB1c2VyZGF0YS0+aWRbaV0pOworCisJCQl1c2VyZGF0YS0+cmVhZHlfZmxhZ1tpXSA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCW11dGV4X3VubG9jaygmdXNlcmRhdGEtPm11dGV4KTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdXNlcmRhdGEtPnVzZXJkYXRhX3dhaXQpOworfQorRVhQT1JUX1NZTUJPTChhbXN0cmVhbV93YWtldXBfdXNlcmRhdGFfcG9sbCk7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYW1zdHJlYW1fdXNlcmRhdGFfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJcG9sbF90YWJsZSAqd2FpdF90YWJsZSkKK3sKKwlpbnQgZmRfbWF0Y2ggPSAwOworCWludCBpOworCXN0X3VzZXJkYXRhICp1c2VyZGF0YSA9IGdldF92ZGVjX3VzZXJkYXRhX2N0eCgpOworCisJcG9sbF93YWl0KGZpbGUsICZ1c2VyZGF0YS0+dXNlcmRhdGFfd2FpdCwgd2FpdF90YWJsZSk7CisJbXV0ZXhfbG9jaygmdXNlcmRhdGEtPm11dGV4KTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1VTRVJEQVRBX0NIQU5ORUxfTlVNOyBpKyspIHsKKwkJaWYgKHVzZXJkYXRhLT5pZFtpXSA9PSB1c2VyZGF0YS0+dmlkZW9faWQgJiYgdXNlcmRhdGEtPnJlYWR5X2ZsYWdbaV0gPT0gMSkgeworCQkJZmRfbWF0Y2ggPSAxOworCQkJaWYgKHZkZWNfZ2V0X2RlYnVnX2ZsYWdzKCkgJiAweDEwMDAwMDAwKQorCQkJCXByX2luZm8oIiVzLCBzdWNjZXNzISBpZCA9ICVkXG4iLCBfX2Z1bmNfXywgdXNlcmRhdGEtPnZpZGVvX2lkKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGZkX21hdGNoKSB7CisJCW11dGV4X3VubG9jaygmdXNlcmRhdGEtPm11dGV4KTsKKwkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCisJbXV0ZXhfdW5sb2NrKCZ1c2VyZGF0YS0+bXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhbXN0cmVhbV91c2VyZGF0YV9pbml0KHZvaWQpCit7CisJaW50IGk7CisJc3RfdXNlcmRhdGEgKnVzZXJkYXRhID0gZ2V0X3ZkZWNfdXNlcmRhdGFfY3R4KCk7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ1c2VyZGF0YS0+dXNlcmRhdGFfd2FpdCk7CisJbXV0ZXhfaW5pdCgmdXNlcmRhdGEtPm11dGV4KTsKKwl1c2VyZGF0YS0+c2V0X2lkX2ZsYWcgPSAwOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9VU0VSREFUQV9DSEFOTkVMX05VTTsgaSsrKSB7CisJCXVzZXJkYXRhLT5yZWFkeV9mbGFnW2ldID0gMDsKKwkJdXNlcmRhdGEtPmlkW2ldID0gLTE7CisJCXVzZXJkYXRhLT51c2VkW2ldID0gMDsKKwl9CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgYW1zdHJlYW1fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzMzIgaTsKKwlzdHJ1Y3Qgc3RyZWFtX3BvcnRfcyAqczsKKwlzdHJ1Y3Qgc3RyZWFtX3BvcnRfcyAqcG9ydCA9ICZwb3J0c1tpbWlub3IoaW5vZGUpXTsKKwlzdHJ1Y3QgcG9ydF9wcml2X3MgKnByaXY7CisKKwlWREVDX1BSSU5UX0ZVTl9MSU5FTk8oX19mdW5jX18sIF9fTElORV9fKTsKKwlpZiAodmRlY19nZXRfZGVidWdfZmxhZ3MoKSAmIDB4MTAwMDAwMDApCisJCXByX2luZm8oIiVzLCBwb3J0IHR5cGUgJWRcbiIsIF9fZnVuY19fLCBwb3J0LT50eXBlKTsKKyNpZmRlZiBHMTJBX0JSSU5HVVBfREVCVUcKKwlpZiAodmRlY19nZXRfZGVidWdfZmxhZ3MoKSAmIDB4ZmYwMDAwKSB7CisJCXByX2luZm8oIiVzIGZvcmNlIG9wZW4gcG9ydCAlZFxuIiwKKwkJCV9fZnVuY19fLAorCQkJKCh2ZGVjX2dldF9kZWJ1Z19mbGFncygpID4+IDE2KSAmIDB4ZmYpIC0gMSk7CisJCXBvcnQgPSAmcG9ydHNbKCh2ZGVjX2dldF9kZWJ1Z19mbGFncygpID4+IDE2KSAmIDB4ZmYpIC0gMV07CisJfQorCXByX2luZm8oIiVzLCBwb3J0IG5hbWUgJXNcbiIsIF9fZnVuY19fLCBwb3J0LT5uYW1lKTsKKyNlbmRpZgorCWlmIChpbWlub3IoaW5vZGUpID49IGFtc3RyZWFtX3BvcnRfbnVtKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW11dGV4X2xvY2soJmFtc3RyZWFtX211dGV4KTsKKworCWlmIChwb3J0LT50eXBlICYgUE9SVF9UWVBFX1ZJREVPKSB7CisJCWZvciAocyA9ICZwb3J0c1swXSwgaSA9IDA7IGkgPCBhbXN0cmVhbV9wb3J0X251bTsgaSsrLCBzKyspIHsKKwkJCWlmICgoIWlzX211bHRfaW5jKHMtPnR5cGUpKSAmJgorCQkJCShzLT50eXBlICYgUE9SVF9UWVBFX1ZJREVPKSAmJgorCQkJCShzLT5mbGFnICYgUE9SVF9GTEFHX0lOX1VTRSkpIHsKKwkJCQltdXRleF91bmxvY2soJmFtc3RyZWFtX211dGV4KTsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQl9CisJfQorCisJaWYgKCFpc19zdXBwb3J0X25vX3BhcnNlcigpKSB7CisJCWlmICgocG9ydC0+ZmxhZyAmIFBPUlRfRkxBR19JTl9VU0UpICYmCisJCQkoKHBvcnQtPnR5cGUgJiBQT1JUX1RZUEVfRlJBTUUpID09IDApKSB7CisJCQltdXRleF91bmxvY2soJmFtc3RyZWFtX211dGV4KTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisJLyogZm9yY2UgZHYgZnJhbWUgbW9kZSAqLworCWlmIChmb3JjZV9kdl9tb2RlICYgMHgyKSB7CisJCXBvcnQtPnR5cGUgfD0gUE9SVF9UWVBFX0ZSQU1FOworCQlwb3J0LT5mb3BzID0gJnZmcmFtZV9mb3BzOworCQlwcl9kZWJ1ZygiJXMsIGRvYmx5IHZpc2lvbiBmb3JjZSBmcmFtZSBtb2RlLlxuIiwgX19mdW5jX18pOworCX0KKworCS8qIGVzcGxheWVyIHN0cmVhbSBtb2RlIGZvcmNlIGR2ICovCisJaWYgKGZvcmNlX2R2X21vZGUgJiAweDEpCisJCXBvcnQtPnR5cGUgfD0gUE9SVF9UWVBFX0RVQUxERUM7CisKKwkvKiBjaGVjayBvdGhlciBwb3J0cyBjb25mbGljdHMgZm9yIGF1ZGlvICovCisJZm9yIChzID0gJnBvcnRzWzBdLCBpID0gMDsgaSA8IGFtc3RyZWFtX3BvcnRfbnVtOyBpKyssIHMrKykgeworCQlpZiAoKHMtPmZsYWcgJiBQT1JUX0ZMQUdfSU5fVVNFKSAmJgorCQkJKChwb3J0LT50eXBlKSAmIChzLT50eXBlKSAmIFBPUlRfVFlQRV9BVURJTykpIHsKKwkJCW11dGV4X3VubG9jaygmYW1zdHJlYW1fbXV0ZXgpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKworCXByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcG9ydF9wcml2X3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAocHJpdiA9PSBOVUxMKSB7CisJCW11dGV4X3VubG9jaygmYW1zdHJlYW1fbXV0ZXgpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltdXRleF9pbml0KCZwcml2LT5tdXRleCk7CisKKwlwcml2LT5wb3J0ID0gcG9ydDsKKworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX002KSB7CisJCS8qIFRPRE86IG1vZCBnYXRlICovCisJCS8qIHN3aXRjaF9tb2RfZ2F0ZV9ieV9uYW1lKCJkZW11eCIsIDEpOyAqLworCQlhbXBvcnRzX3N3aXRjaF9nYXRlKCJkZW11eCIsIDEpOworCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9NOCkgeworCQkJLyogVE9ETzogY2xjIGdhdGUgKi8KKwkJCS8qIENMS19HQVRFX09OKEhJVV9QQVJTRVJfVE9QKTsgKi8KKwkJCWFtcG9ydHNfc3dpdGNoX2dhdGUoInBhcnNlcl90b3AiLCAxKTsKKwkJfQorCisJCWlmIChwb3J0LT50eXBlICYgUE9SVF9UWVBFX1ZJREVPKSB7CisJCQkvKiBUT0RPOiBtb2QgZ2F0ZSAqLworCQkJLyogc3dpdGNoX21vZF9nYXRlX2J5X25hbWUoInZkZWMiLCAxKTsgKi8KKwkJCWFtcG9ydHNfc3dpdGNoX2dhdGUoInZkZWMiLCAxKTsKKworCQkJaWYgKGhhc19oZXZjX3ZkZWMoKSkgeworCQkJCWlmIChwb3J0LT50eXBlICYKKwkJCQkJKFBPUlRfVFlQRV9NUFRTIHwgUE9SVF9UWVBFX0hFVkMpKQorCQkJCQl2ZGVjX3Bvd2Vyb24oVkRFQ19IRVZDKTsKKworCQkJCWlmICgocG9ydC0+dHlwZSAmIFBPUlRfVFlQRV9IRVZDKSA9PSAwKQorCQkJCQl2ZGVjX3Bvd2Vyb24oVkRFQ18xKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfTTgpCisJCQkJCXZkZWNfcG93ZXJvbihWREVDXzEpOworCQkJfQorCQl9CisKKwkJaWYgKHBvcnQtPnR5cGUgJiBQT1JUX1RZUEVfQVVESU8pIHsKKwkJCS8qIFRPRE86IG1vZCBnYXRlICovCisJCQkvKiBzd2l0Y2hfbW9kX2dhdGVfYnlfbmFtZSgiYXVkaW8iLCAxKTsgKi8KKwkJCWFtcG9ydHNfc3dpdGNoX2dhdGUoImF1ZGlvIiwgMSk7CisJCX0KKwl9CisKKwlwb3J0LT52aWQgPSAwOworCXBvcnQtPmFpZCA9IDA7CisJcG9ydC0+c2lkID0gMDsKKwlwb3J0LT5wY3JpZCA9IDB4ZmZmZjsKKwlmaWxlLT5mX29wID0gcG9ydC0+Zm9wczsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBwcml2OworCisJcG9ydC0+ZmxhZyA9IFBPUlRfRkxBR19JTl9VU0U7CisJcG9ydC0+cGNyX2luaXRlZCA9IDA7CisjaWZkZWYgREFUQV9ERUJVRworCWRlYnVnX2ZpbHAgPSBmaWxwX29wZW4oREVCVUdfRklMRV9OQU1FLCBPX1dST05MWSwgMCk7CisJaWYgKElTX0VSUihkZWJ1Z19maWxwKSkgeworCQlwcl9lcnIoImFtc3RyZWFtOiBvcGVuIGRlYnVnIGZpbGUgZmFpbGVkXG4iKTsKKwkJZGVidWdfZmlscCA9IE5VTEw7CisJfQorI2VuZGlmCisJbXV0ZXhfdW5sb2NrKCZhbXN0cmVhbV9tdXRleCk7CisKKwlpZiAocG9ydC0+dHlwZSAmIFBPUlRfVFlQRV9WSURFTykgeworCQlwcml2LT52ZGVjID0gdmRlY19jcmVhdGUocG9ydCwgTlVMTCk7CisKKwkJaWYgKHByaXYtPnZkZWMgPT0gTlVMTCkgeworCQkJcG9ydC0+ZmxhZyA9IDA7CisJCQlrZnJlZShwcml2KTsKKwkJCXByX2VycigiYW1zdHJlYW06IHZkZWMgY3JlYXRpb24gZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWlmICghKHBvcnQtPnR5cGUgJiBQT1JUX1RZUEVfRlJBTUUpKSB7CisJCQlpZiAoKHBvcnQtPnR5cGUgJiBQT1JUX1RZUEVfRFVBTERFQykgfHwKKwkJCQkodmRlY19nZXRfZGVidWdfZmxhZ3MoKSAmIDB4MTAwKSkgeworCQkJCXByaXYtPnZkZWMtPnNsYXZlID0gdmRlY19jcmVhdGUocG9ydCwgcHJpdi0+dmRlYyk7CisKKwkJCQlpZiAocHJpdi0+dmRlYy0+c2xhdmUgPT0gTlVMTCkgeworCQkJCQl2ZGVjX3JlbGVhc2UocHJpdi0+dmRlYyk7CisJCQkJCXBvcnQtPmZsYWcgPSAwOworCQkJCQlrZnJlZShwcml2KTsKKwkJCQkJcHJfZXJyKCJhbXN0cmVhbTogc3ViIHZkZWMgY3JlYXRpb24gZmFpbGVkXG4iKTsKKwkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1zdHJlYW1fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcG9ydF9wcml2X3MgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHN0cmVhbV9wb3J0X3MgKnBvcnQgPSBwcml2LT5wb3J0OworCXN0cnVjdCB2ZGVjX3MgKnNsYXZlID0gTlVMTDsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9NVUxUSV9ERUMKKwl1MzIgcG9ydF9mbGFnID0gMDsKKyNlbmRpZgorCWlmICh2ZGVjX2dldF9kZWJ1Z19mbGFncygpICYgMHgxMDAwMDAwMCkKKwkJcHJfaW5mbygiJXMsIHBvcnQgdHlwZSAlZFxuIiwgX19mdW5jX18sIHBvcnQtPnR5cGUpOworCisJaWYgKGltaW5vcihpbm9kZSkgPj0gYW1zdHJlYW1fcG9ydF9udW0pCisJCXJldHVybiAtRU5PREVWOworCisJbXV0ZXhfbG9jaygmYW1zdHJlYW1fbXV0ZXgpOworCisJaWYgKHBvcnRfZ2V0X2luaXRlZChwcml2KSkKKwkJYW1zdHJlYW1fcG9ydF9yZWxlYXNlKHByaXYpOworCisJaWYgKHByaXYtPnZkZWMpIHsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9NVUxUSV9ERUMKKwkJcG9ydF9mbGFnID0gcHJpdi0+dmRlYy0+cG9ydF9mbGFnOworI2VuZGlmCisJCWlmIChwcml2LT52ZGVjLT5zbGF2ZSkKKwkJCXNsYXZlID0gcHJpdi0+dmRlYy0+c2xhdmU7CisJCXZkZWNfcmVsZWFzZShwcml2LT52ZGVjKTsKKwkJaWYgKHNsYXZlKQorCQkJdmRlY19yZWxlYXNlKHNsYXZlKTsKKwkJcHJpdi0+dmRlYyA9IE5VTEw7CisJfQorCisJaWYgKChwb3J0LT50eXBlICYgKFBPUlRfVFlQRV9BVURJTyB8IFBPUlRfVFlQRV9WSURFTykpID09CisJCVBPUlRfVFlQRV9BVURJTykgeworCQlzMzIgaTsKKwkJc3RydWN0IHN0cmVhbV9wb3J0X3MgKnM7CisKKwkJZm9yIChzID0gJnBvcnRzWzBdLCBpID0gMDsgaSA8IGFtc3RyZWFtX3BvcnRfbnVtOyBpKyssIHMrKykgeworCQkJaWYgKChzLT5mbGFnICYgUE9SVF9GTEFHX0lOX1VTRSkKKwkJCQkmJiAocy0+dHlwZSAmIFBPUlRfVFlQRV9WSURFTykpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGkgPT0gYW1zdHJlYW1fcG9ydF9udW0pCisJCQl0aW1lc3RhbXBfZmlyc3R2cHRzX3NldCgwKTsKKwl9CisKKwlpZiAoIWlzX211bHRfaW5jKHBvcnQtPnR5cGUpIHx8CisJCShpc19tdWx0X2luYyhwb3J0LT50eXBlKSAmJgorCQkhaXNfc3VwcG9ydF9ub19wYXJzZXIoKSkpCisJCXBvcnQtPmZsYWcgPSAwOworCisJLyogdGltZXN0YW1wX3BjcnNjcl9zZXQoMCk7ICovCisKKyNpZmRlZiBEQVRBX0RFQlVHCisJaWYgKGRlYnVnX2ZpbHApIHsKKwkJZmlscF9jbG9zZShkZWJ1Z19maWxwLCBjdXJyZW50LT5maWxlcyk7CisJCWRlYnVnX2ZpbHAgPSBOVUxMOworCQlkZWJ1Z19maWxlX3BvcyA9IDA7CisJfQorI2VuZGlmCisJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfTTYpIHsKKwkJaWYgKHBvcnQtPnR5cGUgJiBQT1JUX1RZUEVfVklERU8pIHsKKwkJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX004KSB7CisjaWZuZGVmIENPTkZJR19BTUxPR0lDX01FRElBX01VTFRJX0RFQworCQkJCWlmIChoYXNfaGV2Y192ZGVjKCkpCisJCQkJCXZkZWNfcG93ZXJvZmYoVkRFQ19IRVZDKTsKKworCQkJCXZkZWNfcG93ZXJvZmYoVkRFQ18xKTsKKyNlbHNlCisJCQlpZiAoZ2V0X2NwdV9tYWpvcl9pZCgpID49IEFNX01FU09OX0NQVV9NQUpPUl9JRF9UWExYCisJCQkJJiYgcG9ydC0+dmZvcm1hdCA9PSBWRk9STUFUX0gyNjQKKwkJCQkmJiBwb3J0LT5pc180aykgeworCQkJCXZkZWNfcG93ZXJvZmYoVkRFQ19IRVZDKTsKKwkJCX0KKworCQkJaWYgKChwb3J0LT52Zm9ybWF0ID09IFZGT1JNQVRfSEVWQworCQkJCQl8fCBwb3J0LT52Zm9ybWF0ID09IFZGT1JNQVRfQVZTMgorCQkJCQl8fCBwb3J0LT52Zm9ybWF0ID09IFZGT1JNQVRfQVYxCisJCQkJCXx8IHBvcnQtPnZmb3JtYXQgPT0gVkZPUk1BVF9WUDkpKSB7CisJCQkJCXZkZWNfcG93ZXJvZmYoVkRFQ19IRVZDKTsKKwkJCQl9IGVsc2UgeworCQkJCQl2ZGVjX3Bvd2Vyb2ZmKFZERUNfMSk7CisJCQkJfQorI2VuZGlmCisJCQl9CisJCQkvKiBUT0RPOiBtb2QgZ2F0ZSAqLworCQkJLyogc3dpdGNoX21vZF9nYXRlX2J5X25hbWUoInZkZWMiLCAwKTsgKi8KKwkJCWFtcG9ydHNfc3dpdGNoX2dhdGUoInZkZWMiLCAwKTsKKwkJfQorCisJCWlmIChwb3J0LT50eXBlICYgUE9SVF9UWVBFX0FVRElPKSB7CisJCQkvKiBUT0RPOiBtb2QgZ2F0ZSAqLworCQkJLyogc3dpdGNoX21vZF9nYXRlX2J5X25hbWUoImF1ZGlvIiwgMCk7ICovCisJCQkvKiBhbXBvcnRzX3N3aXRjaF9nYXRlKCJhdWRpbyIsIDApOyAqLworCQl9CisKKwkJaWYgKGdldF9jcHVfbWFqb3JfaWQoKSA+PSBBTV9NRVNPTl9DUFVfTUFKT1JfSURfTTgpIHsKKwkJCS8qIFRPRE86IGNsYyBnYXRlICovCisJCQkvKiBDTEtfR0FURV9PRkYoSElVX1BBUlNFUl9UT1ApOyAqLworCQkJYW1wb3J0c19zd2l0Y2hfZ2F0ZSgicGFyc2VyX3RvcCIsIDApOworCQl9CisJCS8qIFRPRE86IG1vZCBnYXRlICovCisJCS8qIHN3aXRjaF9tb2RfZ2F0ZV9ieV9uYW1lKCJkZW11eCIsIDApOyAqLworCQlhbXBvcnRzX3N3aXRjaF9nYXRlKCJkZW11eCIsIDApOworCX0KKworCW11dGV4X2Rlc3Ryb3koJnByaXYtPm11dGV4KTsKKworCWtmcmVlKHByaXYpOworCisJbXV0ZXhfdW5sb2NrKCZhbXN0cmVhbV9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nIGFtc3RyZWFtX2lvY3RsX2dldF92ZXJzaW9uKHN0cnVjdCBwb3J0X3ByaXZfcyAqcHJpdiwKKwl1bG9uZyBhcmcpCit7CisJaW50IHZlcnNpb24gPSAoQU1TVFJFQU1fSU9DX1ZFUlNJT05fRklSU1QgJiAweGZmZmYpIDw8IDE2CisJCXwgKEFNU1RSRUFNX0lPQ19WRVJTSU9OX1NFQ09ORCAmIDB4ZmZmZik7CisJcHV0X3VzZXIodmVyc2lvbiwgKHUzMiBfX3VzZXIgKilhcmcpOworCisJcmV0dXJuIDA7Cit9CitzdGF0aWMgbG9uZyBhbXN0cmVhbV9pb2N0bF9nZXQoc3RydWN0IHBvcnRfcHJpdl9zICpwcml2LCB1bG9uZyBhcmcpCit7CisJc3RydWN0IHN0cmVhbV9wb3J0X3MgKnRoaXMgPSBwcml2LT5wb3J0OworCWxvbmcgciA9IDA7CisKKwlzdHJ1Y3QgYW1faW9jdGxfcGFybSBwYXJtOworCisJaWYgKGNvcHlfZnJvbV91c2VyCisJCSgodm9pZCAqKSZwYXJtLCAodm9pZCAqKWFyZywKKwkJIHNpemVvZihwYXJtKSkpCisJCXIgPSAtRUZBVUxUOworCisJc3dpdGNoIChwYXJtLmNtZCkgeworCWNhc2UgQU1TVFJFQU1fR0VUX1NVQl9MRU5HVEg6CisJCWlmICgodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9TVUIpIHx8CisJCQkodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9TVUJfUkQpKSB7CisJCQl1MzIgc3ViX3dwLCBzdWJfcnA7CisJCQlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpwc2J1ZiA9ICZidWZzW0JVRl9UWVBFX1NVQlRJVExFXTsKKwkJCWludCB2YWw7CisKKwkJCXN1Yl93cCA9IHN0YnVmX3N1Yl93cF9nZXQoKTsKKwkJCXN1Yl9ycCA9IHN0YnVmX3N1Yl9ycF9nZXQoKTsKKworCQkJaWYgKHN1Yl93cCA9PSBzdWJfcnApCisJCQkJdmFsID0gMDsKKwkJCWVsc2UgaWYgKHN1Yl93cCA+IHN1Yl9ycCkKKwkJCQl2YWwgPSBzdWJfd3AgLSBzdWJfcnA7CisJCQllbHNlCisJCQkJdmFsID0gcHNidWYtPmJ1Zl9zaXplIC0gKHN1Yl9ycCAtIHN1Yl93cCk7CisJCQlwYXJtLmRhdGFfMzIgPSB2YWw7CisJCX0gZWxzZQorCQkJciA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fR0VUX1VEX0xFTkdUSDoKKwkJaWYgKHRoaXMtPnR5cGUgJiBQT1JUX1RZUEVfVVNFUkRBVEEpIHsKKwkJCXBhcm0uZGF0YV8zMiA9IHVzZXJkYXRhX2xlbmd0aDsKKwkJCXVzZXJkYXRhX2xlbmd0aCA9IDA7CisJCX0gZWxzZQorCQkJciA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fR0VUX0FQVFNfTE9PS1VQOgorCQlpZiAodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9BVURJTykgeworCQkJdTMyIHB0cyA9IDAsIGZyYW1lX3NpemUsIG9mZnNldDsKKworCQkJb2Zmc2V0ID0gcGFybS5kYXRhXzMyOworCQkJcHRzX2xvb2t1cF9vZmZzZXQoUFRTX1RZUEVfQVVESU8sIG9mZnNldCwgJnB0cywKKwkJCQkmZnJhbWVfc2l6ZSwgMzAwKTsKKwkJCXBhcm0uZGF0YV8zMiA9IHB0czsKKwkJfQorCQlicmVhazsKKwljYXNlIEFNU1RSRUFNX0dFVF9GSVJTVF9BUFRTX0ZMQUc6CisJCWlmICh0aGlzLT50eXBlICYgUE9SVF9UWVBFX0FVRElPKSB7CisJCQlwYXJtLmRhdGFfMzIgPSBmaXJzdF9wdHNfY2hlY2tpbl9jb21wbGV0ZSgKKwkJCQlQVFNfVFlQRV9BVURJTyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9HRVRfQVBUUzoKKwkJcGFybS5kYXRhXzMyID0gdGltZXN0YW1wX2FwdHNfZ2V0KCk7CisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fR0VUX1ZQVFM6CisJCXBhcm0uZGF0YV8zMiA9IHRpbWVzdGFtcF92cHRzX2dldCgpOworCQlicmVhazsKKwljYXNlIEFNU1RSRUFNX0dFVF9WUFRTX1U2NDoKKwkJcGFybS5kYXRhXzY0ID0gdGltZXN0YW1wX3ZwdHNfZ2V0X3U2NCgpOworCQlicmVhazsKKwljYXNlIEFNU1RSRUFNX0dFVF9BUFRTX1U2NDoKKwkJcGFybS5kYXRhXzY0ID0gdGltZXN0YW1wX2FwdHNfZ2V0X3U2NCgpOworCQlicmVhazsKKwljYXNlIEFNU1RSRUFNX0dFVF9QQ1JTQ1I6CisJCS8vcGFybS5kYXRhXzMyID0gdGltZXN0YW1wX3BjcnNjcl9nZXQoKTsKKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9HRVRfTEFTVF9DSEVDS0lOX0FQVFM6CisJCXBhcm0uZGF0YV8zMiA9IGdldF9sYXN0X2NoZWNraW5fcHRzKFBUU19UWVBFX0FVRElPKTsKKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9HRVRfTEFTVF9DSEVDS0lOX1ZQVFM6CisJCXBhcm0uZGF0YV8zMiA9IGdldF9sYXN0X2NoZWNraW5fcHRzKFBUU19UWVBFX1ZJREVPKTsKKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9HRVRfTEFTVF9DSEVDS09VVF9BUFRTOgorCQlwYXJtLmRhdGFfMzIgPSBnZXRfbGFzdF9jaGVja291dF9wdHMoUFRTX1RZUEVfQVVESU8pOworCQlicmVhazsKKwljYXNlIEFNU1RSRUFNX0dFVF9MQVNUX0NIRUNLT1VUX1ZQVFM6CisJCXBhcm0uZGF0YV8zMiA9IGdldF9sYXN0X2NoZWNrb3V0X3B0cyhQVFNfVFlQRV9WSURFTyk7CisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fR0VUX1NVQl9OVU06CisJCXBhcm0uZGF0YV8zMiA9IHBzcGFyc2VyX2dldF9zdWJfZm91bmRfbnVtKCk7CisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fR0VUX1ZJREVPX0RFTEFZX0xJTUlUX01TOgorCQlwYXJtLmRhdGFfMzIgPSBidWZzW0JVRl9UWVBFX1ZJREVPXS5tYXhfYnVmZmVyX2RlbGF5X21zOworCQlicmVhazsKKwljYXNlIEFNU1RSRUFNX0dFVF9BVURJT19ERUxBWV9MSU1JVF9NUzoKKwkJcGFybS5kYXRhXzMyID0gYnVmc1tCVUZfVFlQRV9BVURJT10ubWF4X2J1ZmZlcl9kZWxheV9tczsKKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9HRVRfVklERU9fQ1VSX0RFTEFZX01TOiB7CisJCQlpbnQgZGVsYXk7CisKKwkJCWRlbGF5ID0gY2FsY3VsYXRpb25fc3RyZWFtX2RlbGF5ZWRfbXMoCisJCQkJUFRTX1RZUEVfVklERU8sIE5VTEwsIE5VTEwpOworCQkJaWYgKGRlbGF5ID49IDApCisJCQkJcGFybS5kYXRhXzMyID0gZGVsYXk7CisJCQllbHNlCisJCQkJcGFybS5kYXRhXzMyID0gMDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQU1TVFJFQU1fR0VUX0FVRElPX0NVUl9ERUxBWV9NUzogeworCQkJaW50IGRlbGF5OworCisJCQlkZWxheSA9IGNhbGN1bGF0aW9uX3N0cmVhbV9kZWxheWVkX21zKAorCQkJCVBUU19UWVBFX0FVRElPLCBOVUxMLCBOVUxMKTsKKwkJCWlmIChkZWxheSA+PSAwKQorCQkJCXBhcm0uZGF0YV8zMiA9IGRlbGF5OworCQkJZWxzZQorCQkJCXBhcm0uZGF0YV8zMiA9IDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9HRVRfQVVESU9fQVZHX0JJVFJBVEVfQlBTOiB7CisJCQlpbnQgZGVsYXk7CisJCQl1MzIgYXZnYnBzOworCisJCQlkZWxheSA9IGNhbGN1bGF0aW9uX3N0cmVhbV9kZWxheWVkX21zKAorCQkJCVBUU19UWVBFX0FVRElPLCBOVUxMLCAmYXZnYnBzKTsKKwkJCWlmIChkZWxheSA+PSAwKQorCQkJCXBhcm0uZGF0YV8zMiA9IGF2Z2JwczsKKwkJCWVsc2UKKwkJCQlwYXJtLmRhdGFfMzIgPSAwOworCQl9CisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fR0VUX1ZJREVPX0FWR19CSVRSQVRFX0JQUzogeworCQkJaW50IGRlbGF5OworCQkJdTMyIGF2Z2JwczsKKworCQkJZGVsYXkgPSBjYWxjdWxhdGlvbl9zdHJlYW1fZGVsYXllZF9tcygKKwkJCQlQVFNfVFlQRV9WSURFTywgTlVMTCwgJmF2Z2Jwcyk7CisJCQlpZiAoZGVsYXkgPj0gMCkKKwkJCQlwYXJtLmRhdGFfMzIgPSBhdmdicHM7CisJCQllbHNlCisJCQkJcGFybS5kYXRhXzMyID0gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIEFNU1RSRUFNX0dFVF9JT05fSUQ6CisJCXBhcm0uZGF0YV8zMiA9IHByaXYtPnZkZWMtPnZmX3JlY2VpdmVyX2luc3Q7CisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fR0VUX05FRURfTU9SRV9EQVRBOgorCQlwYXJtLmRhdGFfMzIgPSB2ZGVjX25lZWRfbW9yZV9kYXRhKHByaXYtPnZkZWMpOworCQlicmVhazsKKwljYXNlIEFNU1RSRUFNX0dFVF9GUkVFRF9IQU5ETEU6CisJCXBhcm0uZGF0YV8zMiA9IHZkZWNfaW5wdXRfZ2V0X2ZyZWVkX2hhbmRsZShwcml2LT52ZGVjKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJciA9IC1FTk9JT0NUTENNRDsKKwkJYnJlYWs7CisJfQorCS8qIHByX2luZm8oInBhcm0gc2l6ZTolZFxuIiwgc2l6ZW9mKHBhcm0pKTsgKi8KKwlpZiAociA9PSAwKSB7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZwYXJtLCBzaXplb2YocGFybSkpKQorCQkJciA9IC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIHI7CisKK30KK3N0YXRpYyBsb25nIGFtc3RyZWFtX2lvY3RsX3NldChzdHJ1Y3QgcG9ydF9wcml2X3MgKnByaXYsIHVsb25nIGFyZykKK3sKKwlzdHJ1Y3QgIHN0cmVhbV9wb3J0X3MgKnRoaXMgPSBwcml2LT5wb3J0OworCXN0cnVjdCBhbV9pb2N0bF9wYXJtIHBhcm07CisJbG9uZyByID0gMDsKKwlpbnQgaTsKKwlzdF91c2VyZGF0YSAqdXNlcmRhdGEgPSBnZXRfdmRlY191c2VyZGF0YV9jdHgoKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcgorCQkoKHZvaWQgKikmcGFybSwgKHZvaWQgKilhcmcsCisJCSBzaXplb2YocGFybSkpKQorCQlyID0gLUVGQVVMVDsKKworCXN3aXRjaCAocGFybS5jbWQpIHsKKwljYXNlIEFNU1RSRUFNX1NFVF9WQl9TVEFSVDoKKwkJaWYgKCh0aGlzLT50eXBlICYgUE9SVF9UWVBFX1ZJREVPKSAmJgorCQkJKChwcml2LT52ZGVjLT52YnVmLmZsYWcgJiBCVUZfRkxBR19JTl9VU0UpID09IDApKSB7CisJCQlwcml2LT52ZGVjLT52YnVmLmJ1Zl9zdGFydCA9IHBhcm0uZGF0YV8zMjsKKwkJfSBlbHNlCisJCQlyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9TRVRfVkJfU0laRToKKwkJaWYgKCh0aGlzLT50eXBlICYgUE9SVF9UWVBFX1ZJREVPKSAmJgorCQkJKChwcml2LT52ZGVjLT52YnVmLmZsYWcgJiBCVUZfRkxBR19JTl9VU0UpID09IDApKSB7CisJCQlpZiAocHJpdi0+dmRlYy0+dmJ1Zi5mbGFnICYgQlVGX0ZMQUdfQUxMT0MpIHsKKwkJCQlyICs9IHN0YnVmX2NoYW5nZV9zaXplKAorCQkJCQkJJnByaXYtPnZkZWMtPnZidWYsCisJCQkJCQlwYXJtLmRhdGFfMzIsCisJCQkJCQlmYWxzZSk7CisJCQl9CisJCX0gZWxzZSBpZiAodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9GUkFNRSkgeworCQkJLyogdG9kbzogZnJhbWUgYmFzZWQgc2V0IG1heCBidWZmZXIgc2l6ZSAqLworCQkJciA9IDA7CisJCX0gZWxzZQorCQkJciA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fU0VUX0FCX1NUQVJUOgorCQlpZiAoKHRoaXMtPnR5cGUgJiBQT1JUX1RZUEVfQVVESU8pICYmCisJCQkoKGJ1ZnNbQlVGX1RZUEVfQVVESU9dLmZsYWcgJiBCVUZfRkxBR19JTl9VU0UpID09IDApKQorCQkJYnVmc1tCVUZfVFlQRV9BVURJT10uYnVmX3N0YXJ0ID0gcGFybS5kYXRhXzMyOworCQllbHNlCisJCQlyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9TRVRfQUJfU0laRToKKwkJaWYgKCh0aGlzLT50eXBlICYgUE9SVF9UWVBFX0FVRElPKSAmJgorCQkJKChidWZzW0JVRl9UWVBFX0FVRElPXS5mbGFnICYgQlVGX0ZMQUdfSU5fVVNFKSA9PSAwKSkgeworCQkJaWYgKGJ1ZnNbQlVGX1RZUEVfQVVESU9dLmZsYWcgJiBCVUZfRkxBR19BTExPQykgeworCQkJCXIgPSBzdGJ1Zl9jaGFuZ2Vfc2l6ZSgKKwkJCQkJJmJ1ZnNbQlVGX1RZUEVfQVVESU9dLAorCQkJCQlwYXJtLmRhdGFfMzIsCisJCQkJCWZhbHNlKTsKKwkJCX0KKwkJfSBlbHNlCisJCQlyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9TRVRfVkZPUk1BVDoKKwkJaWYgKCh0aGlzLT50eXBlICYgUE9SVF9UWVBFX1ZJREVPKSAmJgorCQkJKHBhcm0uZGF0YV92Zm9ybWF0IDwgVkZPUk1BVF9NQVgpKSB7CisJCQl0aGlzLT52Zm9ybWF0ID0gcGFybS5kYXRhX3Zmb3JtYXQ7CisJCQl0aGlzLT5mbGFnIHw9IFBPUlRfRkxBR19WRk9STUFUOworCisJCQl2ZGVjX3NldF9mb3JtYXQocHJpdi0+dmRlYywgdGhpcy0+dmZvcm1hdCk7CisJCX0gZWxzZQorCQkJciA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fU0VUX0FGT1JNQVQ6CisJCWlmICgodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9BVURJTykgJiYKKwkJCShwYXJtLmRhdGFfYWZvcm1hdCA8IEFGT1JNQVRfTUFYKSkgeworCQkJbWVtc2V0KCZhdWRpb19kZWNfaW5mbywgMCwKKwkJCQkgICBzaXplb2Yoc3RydWN0IGF1ZGlvX2luZm8pKTsKKwkJCS8qIGZvciBuZXcgZm9ybWF0LHJlc2V0IHRoZSBhdWRpbyBpbmZvLiAqLworCQkJdGhpcy0+YWZvcm1hdCA9IHBhcm0uZGF0YV9hZm9ybWF0OworCQkJdGhpcy0+ZmxhZyB8PSBQT1JUX0ZMQUdfQUZPUk1BVDsKKwkJfSBlbHNlCisJCQlyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9TRVRfVklEOgorCQlpZiAodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9WSURFTykgeworCQkJdGhpcy0+dmlkID0gcGFybS5kYXRhXzMyOworCQkJdGhpcy0+ZmxhZyB8PSBQT1JUX0ZMQUdfVklEOworCQl9IGVsc2UKKwkJCXIgPSAtRUlOVkFMOworCisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fU0VUX0FJRDoKKwkJaWYgKHRoaXMtPnR5cGUgJiBQT1JUX1RZUEVfQVVESU8pIHsKKwkJCXRoaXMtPmFpZCA9IHBhcm0uZGF0YV8zMjsKKwkJCXRoaXMtPmZsYWcgfD0gUE9SVF9GTEFHX0FJRDsKKworCQkJaWYgKHBvcnRfZ2V0X2luaXRlZChwcml2KSkgeworCQkJCS8vdHN5bmNfYXVkaW9fYnJlYWsoMSk7CisJCQkJYW1zdHJlYW1fY2hhbmdlX2F2aWQodGhpcyk7CisJCQl9CisJCX0gZWxzZQorCQkJciA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fU0VUX1NJRDoKKwkJaWYgKHRoaXMtPnR5cGUgJiBQT1JUX1RZUEVfU1VCKSB7CisJCQl0aGlzLT5zaWQgPSBwYXJtLmRhdGFfMzI7CisJCQl0aGlzLT5mbGFnIHw9IFBPUlRfRkxBR19TSUQ7CisKKwkJCWlmIChwb3J0X2dldF9pbml0ZWQocHJpdikpCisJCQkJYW1zdHJlYW1fY2hhbmdlX3NpZCh0aGlzKTsKKwkJfSBlbHNlCisJCQlyID0gLUVJTlZBTDsKKworCQlicmVhazsKKwljYXNlIEFNU1RSRUFNX0lPQ19QQ1JJRDoKKwkJdGhpcy0+cGNyaWQgPSBwYXJtLmRhdGFfMzI7CisJCXRoaXMtPnBjcl9pbml0ZWQgPSAxOworCQlwcl9lcnIoInNldCBwY3JpZCA9IDB4JXhcbiIsIHRoaXMtPnBjcmlkKTsKKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9TRVRfQUNIQU5ORUw6CisJCWlmICh0aGlzLT50eXBlICYgUE9SVF9UWVBFX0FVRElPKSB7CisJCQl0aGlzLT5hY2hhbmwgPSBwYXJtLmRhdGFfMzI7CisJCQlzZXRfY2hfbnVtX2luZm8ocGFybS5kYXRhXzMyKTsKKwkJfSBlbHNlCisJCQlyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9TRVRfU0FNUExFUkFURToKKwkJaWYgKHRoaXMtPnR5cGUgJiBQT1JUX1RZUEVfQVVESU8pIHsKKwkJCXRoaXMtPmFzYW1wcmF0ZSA9IHBhcm0uZGF0YV8zMjsKKwkJCXNldF9zYW1wbGVfcmF0ZV9pbmZvKHBhcm0uZGF0YV8zMik7CisJCX0gZWxzZQorCQkJciA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fU0VUX0RBVEFXSURUSDoKKwkJaWYgKHRoaXMtPnR5cGUgJiBQT1JUX1RZUEVfQVVESU8pCisJCQl0aGlzLT5hZGF0YXdpZHRoID0gcGFybS5kYXRhXzMyOworCQllbHNlCisJCQlyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9TRVRfVFNUQU1QOgorCQlpZiAoKHRoaXMtPnR5cGUgJiAoUE9SVF9UWVBFX0FVRElPIHwgUE9SVF9UWVBFX1ZJREVPKSkgPT0KKwkJCSgoUE9SVF9UWVBFX0FVRElPIHwgUE9SVF9UWVBFX1ZJREVPKSkpCisJCQlyID0gLUVJTlZBTDsKKwkJZWxzZSBpZiAodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9GUkFNRSkKKwkJCXIgPSB2ZGVjX3NldF9wdHMocHJpdi0+dmRlYywgcGFybS5kYXRhXzMyKTsKKwkJZWxzZSBpZiAoKHRoaXMtPnR5cGUgJiBQT1JUX1RZUEVfVklERU8pIHx8CisJCQkodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9IRVZDKSkgeworCQkJc3RydWN0IHN0cmVhbV9idWZfcyAqdmJ1ZiA9ICZwcml2LT52ZGVjLT52YnVmOworCQkJaWYgKHZidWYtPm5vX3BhcnNlcikgeworCQkJCXB0c19jaGVja2luX29mZnNldChQVFNfVFlQRV9WSURFTywKKwkJCQkJdmJ1Zi0+c3RyZWFtX29mZnNldCwgcGFybS5kYXRhXzMyKTsKKwkJCX0gZWxzZSB7CisJCQkJciA9IGVzX3ZwdHNfY2hlY2tpbih2YnVmLCBwYXJtLmRhdGFfMzIpOworCQkJfQorCQl9IGVsc2UgaWYgKHRoaXMtPnR5cGUgJiBQT1JUX1RZUEVfQVVESU8pCisJCQlyID0gZXNfYXB0c19jaGVja2luKCZidWZzW0JVRl9UWVBFX0FVRElPXSwKKwkJCQlwYXJtLmRhdGFfMzIpOworCQlicmVhazsKKwljYXNlIEFNU1RSRUFNX1NFVF9UU1RBTVBfVVM2NDoKKwkJaWYgKCh0aGlzLT50eXBlICYgKFBPUlRfVFlQRV9BVURJTyB8IFBPUlRfVFlQRV9WSURFTykpID09CisJCQkoKFBPUlRfVFlQRV9BVURJTyB8IFBPUlRfVFlQRV9WSURFTykpKQorCQkJciA9IC1FSU5WQUw7CisJCWVsc2UgeworCQkJdTY0IHB0cyA9IHBhcm0uZGF0YV82NDsKKworCQkJaWYgKHRoaXMtPnR5cGUgJiBQT1JUX1RZUEVfRlJBTUUpIHsKKwkJCQkvKgorCQkJCSAqdG9kbzogY2hlY2sgdXBwZXIgbGF5ZXIgZm9yIGRlY29kZXIgaGFuZGxlcgorCQkJCSAqIGxpZmUgc2VxdWVuY2Ugb3IgbXVsdGktdGFza2luZyBtYW5hZ2VtZW50CisJCQkJICovCisJCQkJciA9IHZkZWNfc2V0X3B0czY0KHByaXYtPnZkZWMsIHB0cyk7CisJCQl9IGVsc2UgaWYgKCh0aGlzLT50eXBlICYgUE9SVF9UWVBFX0hFVkMpIHx8CisJCQkJCSh0aGlzLT50eXBlICYgUE9SVF9UWVBFX1ZJREVPKSkgeworCQkJCQlyID0gZXNfdnB0c19jaGVja2luX3VzNjQoCisJCQkJCSZwcml2LT52ZGVjLT52YnVmLCBwdHMpOworCQkJfSBlbHNlIGlmICh0aGlzLT50eXBlICYgUE9SVF9UWVBFX0FVRElPKSB7CisJCQkJCXIgPSBlc192cHRzX2NoZWNraW5fdXM2NCgKKwkJCQkJJmJ1ZnNbQlVGX1RZUEVfQVVESU9dLCBwdHMpOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fUE9SVF9JTklUOgorCQlyID0gYW1zdHJlYW1fcG9ydF9pbml0KHByaXYpOworCQlicmVhazsKKwljYXNlIEFNU1RSRUFNX1NFVF9UUklDS01PREU6CisJCWlmICgodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9WSURFTykgPT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyID0gdmRlY19zZXRfdHJpY2ttb2RlKHByaXYtPnZkZWMsIHBhcm0uZGF0YV8zMik7CisJCWlmIChyID09IC0xKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWJyZWFrOworCisJY2FzZSBBTVNUUkVBTV9BVURJT19SRVNFVDoKKwkJaWYgKHRoaXMtPnR5cGUgJiBQT1JUX1RZUEVfQVVESU8pIHsKKwkJCXN0cnVjdCBzdHJlYW1fYnVmX3MgKnBhYnVmID0gJmJ1ZnNbQlVGX1RZUEVfQVVESU9dOworCisJCQltdXRleF9sb2NrKCZhbXN0cmVhbV9tdXRleCk7CisJCQlyID0gYXVkaW9fcG9ydF9yZXNldCh0aGlzLCBwYWJ1Zik7CisJCQltdXRleF91bmxvY2soJmFtc3RyZWFtX211dGV4KTsKKwkJfSBlbHNlCisJCQlyID0gLUVJTlZBTDsKKworCQlicmVhazsKKwljYXNlIEFNU1RSRUFNX1NVQl9SRVNFVDoKKwkJaWYgKHRoaXMtPnR5cGUgJiBQT1JUX1RZUEVfU1VCKSB7CisJCQlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpwc2J1ZiA9ICZidWZzW0JVRl9UWVBFX1NVQlRJVExFXTsKKworCQkJciA9IHN1Yl9wb3J0X3Jlc2V0KHRoaXMsIHBzYnVmKTsKKwkJfSBlbHNlCisJCQlyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9ERUNfUkVTRVQ6CisJCXRzeW5jX3NldF9kZWNfcmVzZXQoKTsKKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9TRVRfVFNfU0tJUEJZVEU6CisJCXRzZGVtdXhfc2V0X3NraXBieXRlKHBhcm0uZGF0YV8zMik7CisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fU0VUX1NVQl9UWVBFOgorCQlzdWJfdHlwZSA9IHBhcm0uZGF0YV8zMjsKKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9TRVRfUENSU0NSOgorCQl0aW1lc3RhbXBfcGNyc2NyX3NldChwYXJtLmRhdGFfMzIpOworCQlicmVhazsKKwljYXNlIEFNU1RSRUFNX1NFVF9ERU1VWDoKKwkJdHNkZW11eF9zZXRfZGVtdXgocGFybS5kYXRhXzMyKTsKKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9TRVRfVklERU9fREVMQVlfTElNSVRfTVM6CisJCXByaXYtPnZkZWMtPnZidWYubWF4X2J1ZmZlcl9kZWxheV9tcyA9IHBhcm0uZGF0YV8zMjsKKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9TRVRfQVVESU9fREVMQVlfTElNSVRfTVM6CisJCWJ1ZnNbQlVGX1RZUEVfQVVESU9dLm1heF9idWZmZXJfZGVsYXlfbXMgPSBwYXJtLmRhdGFfMzI7CisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fU0VUX0RSTU1PREU6CisJCWlmIChwYXJtLmRhdGFfMzIgPT0gMSkgeworCQkJcHJfZGVidWcoInNldCBkcm1tb2RlXG4iKTsKKwkJCXRoaXMtPmZsYWcgfD0gUE9SVF9GTEFHX0RSTTsKKwkJCWlmICgodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9WSURFTykgJiYKKwkJCQkocHJpdi0+dmRlYykpCisJCQkJcHJpdi0+dmRlYy0+cG9ydF9mbGFnIHw9IFBPUlRfRkxBR19EUk07CisJCX0gZWxzZSB7CisJCQl0aGlzLT5mbGFnICY9ICh+UE9SVF9GTEFHX0RSTSk7CisJCQlwcl9kZWJ1Zygibm8gZHJtbW9kZVxuIik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9TRVRfQVBUUzogeworCQl1bnNpZ25lZCBpbnQgcHRzOworCisJCXB0cyA9IHBhcm0uZGF0YV8zMjsKKwkJaWYgKHRzeW5jX2dldF9tb2RlKCkgPT0gVFNZTkNfTU9ERV9QQ1JNQVNURVIpCisJCQl0c3luY19wY3Jfc2V0X2FwdHMocHRzKTsKKwkJZWxzZQorCQkJdHN5bmNfc2V0X2FwdHMocHRzKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQU1TVFJFQU1fU0VUX0ZSQU1FX0JBU0VfUEFUSDoKKwkJaWYgKGlzX211bHRfaW5jKHRoaXMtPnR5cGUpICYmCisJCQkocGFybS5mcmFtZV9iYXNlX3ZpZGVvX3BhdGggPCBGUkFNRV9CQVNFX1BBVEhfTUFYKSkgeworCQkJdmRlY19zZXRfdmlkZW9fcGF0aChwcml2LT52ZGVjLCBwYXJtLmRhdGFfMzIpOworCQl9IGVsc2UKKwkJCXIgPSAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIEFNU1RSRUFNX1NFVF9FT1M6CisJCWlmIChwcml2LT52ZGVjKQorCQkJdmRlY19zZXRfZW9zKHByaXYtPnZkZWMsIHBhcm0uZGF0YV8zMik7CisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fU0VUX1JFQ0VJVkVfSUQ6CisJCWlmIChpc19tdWx0X2luYyh0aGlzLT50eXBlKSkKKwkJCXZkZWNfc2V0X3JlY2VpdmVfaWQocHJpdi0+dmRlYywgcGFybS5kYXRhXzMyKTsKKwkJZWxzZQorCQkJciA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fU0VUX0lTX1JFU0VUOgorCQlpZiAocHJpdi0+dmRlYykKKwkJCXZkZWNfc2V0X2lzcmVzZXQocHJpdi0+dmRlYywgcGFybS5kYXRhXzMyKTsKKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9TRVRfRFZfTUVUQV9XSVRIX0VMOgorCQlpZiAocHJpdi0+dmRlYykgeworCQkJdmRlY19zZXRfZHZfbWV0YXdpdGhlbChwcml2LT52ZGVjLCBwYXJtLmRhdGFfMzIpOworCQkJaWYgKHZkZWNfZHVhbChwcml2LT52ZGVjKSAmJiBwcml2LT52ZGVjLT5zbGF2ZSkKKwkJCQl2ZGVjX3NldF9kdl9tZXRhd2l0aGVsKHByaXYtPnZkZWMtPnNsYXZlLAorCQkJCXBhcm0uZGF0YV8zMik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9TRVRfTk9fUE9XRVJET1dOOgorCQl2ZGVjX3NldF9ub19wb3dlcmRvd24ocGFybS5kYXRhXzMyKTsKKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9TRVRfVklERU9fSUQ6CisJCXByaXYtPnZkZWMtPnZpZGVvX2lkID0gcGFybS5kYXRhXzMyOworCQltdXRleF9sb2NrKCZ1c2VyZGF0YS0+bXV0ZXgpOworCQlmb3IgKGkgPSAwO2kgPCBNQVhfVVNFUkRBVEFfQ0hBTk5FTF9OVU07IGkrKykgeworCQkJaWYgKHVzZXJkYXRhLT51c2VkW2ldID09IDApIHsKKwkJCQl1c2VyZGF0YS0+aWRbaV0gPSBwcml2LT52ZGVjLT52aWRlb19pZDsKKwkJCQl1c2VyZGF0YS0+dXNlZFtpXSA9IDE7CisJCQkJdXNlcmRhdGEtPnZpZGVvX2lkID0gcHJpdi0+dmRlYy0+dmlkZW9faWQ7CisJCQkJdXNlcmRhdGEtPnNldF9pZF9mbGFnID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQltdXRleF91bmxvY2soJnVzZXJkYXRhLT5tdXRleCk7CisKKwkJcHJfaW5mbygiQU1TVFJFQU1fU0VUX1ZJREVPX0lEIHZpZGVvX2lkOiAlZFxuIiwgcGFybS5kYXRhXzMyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJciA9IC1FTk9JT0NUTENNRDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByOworfQorCitzdGF0aWMgZW51bSBFX0FTUEVDVF9SQVRJTyAgZ2V0X25vcm1hbGl6ZWRfYXNwZWN0X3JhdGlvKHUzMiByYXRpb19jb250cm9sKQoreworCWVudW0gRV9BU1BFQ1RfUkFUSU8gZXVBc3BlY3RSYXRpbzsKKworCXJhdGlvX2NvbnRyb2wgPSByYXRpb19jb250cm9sID4+IERJU1BfUkFUSU9fQVNQRUNUX1JBVElPX0JJVDsKKworCXN3aXRjaCAocmF0aW9fY29udHJvbCkgeworCWNhc2UgMHg4YzoKKwljYXNlIDB4OTA6CisJCWV1QXNwZWN0UmF0aW8gPSBBU1BFQ1RfUkFUSU9fMTZfOTsKKwkJLypwcl9pbmZvKCJBU1BFQ1RfUkFUSU9fMTZfOVxuIik7Ki8KKwkJYnJlYWs7CisJY2FzZSAweGJiOgorCWNhc2UgMHhjMDoKKwkJZXVBc3BlY3RSYXRpbyA9IEFTUEVDVF9SQVRJT180XzM7CisJCS8qcHJfaW5mbygiQVNQRUNUX1JBVElPXzRfM1xuIik7Ki8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXVBc3BlY3RSYXRpbyA9IEFTUEVDVF9VTkRFRklORUQ7CisJCS8qcHJfaW5mbygiQVNQRUNUX1VOREVGSU5FRCBhbmQgcmF0aW9fY29udHJvbCA9IDB4JXhcbiIsCisJCQlyYXRpb19jb250cm9sKTsqLworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXVBc3BlY3RSYXRpbzsKK30KKworc3RhdGljIGxvbmcgYW1zdHJlYW1faW9jdGxfZ2V0X2V4KHN0cnVjdCBwb3J0X3ByaXZfcyAqcHJpdiwgdWxvbmcgYXJnKQoreworCXN0cnVjdCBzdHJlYW1fcG9ydF9zICp0aGlzID0gcHJpdi0+cG9ydDsKKwlsb25nIHIgPSAwOworCXN0cnVjdCBhbV9pb2N0bF9wYXJtX2V4IHBhcm07CisKKwlpZiAoY29weV9mcm9tX3VzZXIKKwkJKCh2b2lkICopJnBhcm0sICh2b2lkICopYXJnLAorCQkgc2l6ZW9mKHBhcm0pKSkKKwkJciA9IC1FRkFVTFQ7CisKKwlzd2l0Y2ggKHBhcm0uY21kKSB7CisJY2FzZSBBTVNUUkVBTV9HRVRfRVhfVkJfU1RBVFVTOgorCQlpZiAodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9WSURFTykgeworCQkJc3RydWN0IGFtX2lvY3RsX3Bhcm1fZXggKnAgPSAmcGFybTsKKwkJCXN0cnVjdCBzdHJlYW1fYnVmX3MgKmJ1ZiA9IE5VTEw7CisKKwkJCW11dGV4X2xvY2soJmFtc3RyZWFtX211dGV4KTsKKworCQkJLyoKKwkJCSAqdG9kbzogY2hlY2sgdXBwZXIgbGF5ZXIgZm9yIGRlY29kZXIKKwkJCSAqIGhhbmRsZXIgbGlmZWN5Y2xlCisJCQkgKi8KKwkJCWlmIChwcml2LT52ZGVjID09IE5VTEwpIHsKKwkJCQlyID0gLUVJTlZBTDsKKwkJCQltdXRleF91bmxvY2soJmFtc3RyZWFtX211dGV4KTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKHRoaXMtPnR5cGUgJiBQT1JUX1RZUEVfRlJBTUUpIHsKKwkJCQlzdHJ1Y3QgdmRlY19pbnB1dF9zdGF0dXNfcyBzdGF0dXM7CisKKwkJCQlyID0gdmRlY19pbnB1dF9nZXRfc3RhdHVzKCZwcml2LT52ZGVjLT5pbnB1dCwKKwkJCQkJCQkmc3RhdHVzKTsKKwkJCQlpZiAociA9PSAwKSB7CisJCQkJCXAtPnN0YXR1cy5zaXplID0gc3RhdHVzLnNpemU7CisJCQkJCXAtPnN0YXR1cy5kYXRhX2xlbiA9IHN0YXR1cy5kYXRhX2xlbjsKKwkJCQkJcC0+c3RhdHVzLmZyZWVfbGVuID0gc3RhdHVzLmZyZWVfbGVuOworCQkJCQlwLT5zdGF0dXMucmVhZF9wb2ludGVyID0KKwkJCQkJCQlzdGF0dXMucmVhZF9wb2ludGVyOworCQkJCX0KKwkJCQltdXRleF91bmxvY2soJmFtc3RyZWFtX211dGV4KTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJYnVmID0gJnByaXYtPnZkZWMtPnZidWY7CisJCQlwLT5zdGF0dXMuc2l6ZSA9IHN0YnVmX2NhbnVzZXNpemUoYnVmKTsKKwkJCXAtPnN0YXR1cy5kYXRhX2xlbiA9IHN0YnVmX2xldmVsKGJ1Zik7CisJCQlwLT5zdGF0dXMuZnJlZV9sZW4gPSBzdGJ1Zl9zcGFjZShidWYpOworCQkJcC0+c3RhdHVzLnJlYWRfcG9pbnRlciA9IHN0YnVmX3JwKGJ1Zik7CisJCQltdXRleF91bmxvY2soJmFtc3RyZWFtX211dGV4KTsKKwkJfSBlbHNlCisJCQlyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9HRVRfRVhfQUJfU1RBVFVTOgorCQlpZiAodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9BVURJTykgeworCQkJc3RydWN0IGFtX2lvY3RsX3Bhcm1fZXggKnAgPSAmcGFybTsKKwkJCXN0cnVjdCBzdHJlYW1fYnVmX3MgKmJ1ZiA9ICZidWZzW0JVRl9UWVBFX0FVRElPXTsKKworCisJCQlwLT5zdGF0dXMuc2l6ZSA9IHN0YnVmX2NhbnVzZXNpemUoYnVmKTsKKwkJCXAtPnN0YXR1cy5kYXRhX2xlbiA9IHN0YnVmX2xldmVsKGJ1Zik7CisJCQlwLT5zdGF0dXMuZnJlZV9sZW4gPSBzdGJ1Zl9zcGFjZShidWYpOworCQkJcC0+c3RhdHVzLnJlYWRfcG9pbnRlciA9IHN0YnVmX3JwKGJ1Zik7CisKKwkJfSBlbHNlCisJCQlyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9HRVRfRVhfVkRFQ1NUQVQ6CisJCWlmICgodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9WSURFTykgPT0gMCkgeworCQkJcHJfZXJyKCJubyB2aWRlb1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCB2ZGVjX2luZm8gdnN0YXR1czsKKwkJCXN0cnVjdCBhbV9pb2N0bF9wYXJtX2V4ICpwID0gJnBhcm07CisKKwkJCW1lbXNldCgmdnN0YXR1cywgMCwgc2l6ZW9mKHZzdGF0dXMpKTsKKworCQkJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOworCQkJaWYgKHZkZWNfc3RhdHVzKHByaXYtPnZkZWMsICZ2c3RhdHVzKSA9PSAtMSkgeworCQkJCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOworCQkJCXJldHVybiAtRU5PREVWOworCQkJfQorCQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CisKKwkJCXAtPnZzdGF0dXMud2lkdGggPSB2c3RhdHVzLmZyYW1lX3dpZHRoOworCQkJcC0+dnN0YXR1cy5oZWlnaHQgPSB2c3RhdHVzLmZyYW1lX2hlaWdodDsKKwkJCXAtPnZzdGF0dXMuZnBzID0gdnN0YXR1cy5mcmFtZV9yYXRlOworCQkJcC0+dnN0YXR1cy5lcnJvcl9jb3VudCA9IHZzdGF0dXMuZXJyb3JfY291bnQ7CisJCQlwLT52c3RhdHVzLnN0YXR1cyA9IHZzdGF0dXMuc3RhdHVzOworCQkJcC0+dnN0YXR1cy5ldUFzcGVjdFJhdGlvID0KKwkJCQlnZXRfbm9ybWFsaXplZF9hc3BlY3RfcmF0aW8oCisJCQkJCXZzdGF0dXMucmF0aW9fY29udHJvbCk7CisKKwkJfQorCQlicmVhazsKKwljYXNlIEFNU1RSRUFNX0dFVF9FWF9BREVDU1RBVDoKKwkJaWYgKCh0aGlzLT50eXBlICYgUE9SVF9UWVBFX0FVRElPKSA9PSAwKSB7CisJCQlwcl9lcnIoIm5vIGF1ZGlvXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChhbXN0cmVhbV9hZGVjX3N0YXR1cyA9PSBOVUxMKSB7CisJCQkvKgorCQkJICpwcl9lcnIoIm5vIGFtc3RyZWFtX2FkZWNfc3RhdHVzXG4iKTsKKwkJCSAqcmV0dXJuIC1FTk9ERVY7CisJCQkgKi8KKwkJCW1lbXNldCgmcGFybS5hc3RhdHVzLCAwLCBzaXplb2YocGFybS5hc3RhdHVzKSk7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgYWRlY19zdGF0dXMgYXN0YXR1czsKKwkJCXN0cnVjdCBhbV9pb2N0bF9wYXJtX2V4ICpwID0gJnBhcm07CisKKwkJCWFtc3RyZWFtX2FkZWNfc3RhdHVzKCZhc3RhdHVzKTsKKwkJCXAtPmFzdGF0dXMuY2hhbm5lbHMgPSBhc3RhdHVzLmNoYW5uZWxzOworCQkJcC0+YXN0YXR1cy5zYW1wbGVfcmF0ZSA9IGFzdGF0dXMuc2FtcGxlX3JhdGU7CisJCQlwLT5hc3RhdHVzLnJlc29sdXRpb24gPSBhc3RhdHVzLnJlc29sdXRpb247CisJCQlwLT5hc3RhdHVzLmVycm9yX2NvdW50ID0gYXN0YXR1cy5lcnJvcl9jb3VudDsKKwkJCXAtPmFzdGF0dXMuc3RhdHVzID0gYXN0YXR1cy5zdGF0dXM7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFNU1RSRUFNX0dFVF9FWF9VRF9QT0M6CisJCWlmICh0aGlzLT50eXBlICYgUE9SVF9UWVBFX1VTRVJEQVRBKSB7CisJCQlzdHJ1Y3QgdXNlcmRhdGFfcG9jX2luZm9fdCB1c2VyZGF0YV9wb2MgPQorCQkJCQl1c2VyZGF0YV9wb2NfaW5mb1t1c2VyZGF0YV9wb2NfcmldOworCQkJbWVtY3B5KCZwYXJtLmRhdGFfdXNlcmRhdGFfaW5mbywKKwkJCQkJJnVzZXJkYXRhX3BvYywKKwkJCQkJc2l6ZW9mKHN0cnVjdCB1c2VyZGF0YV9wb2NfaW5mb190KSk7CisKKwkJCXVzZXJkYXRhX3BvY19yaSsrOworCQkJaWYgKHVzZXJkYXRhX3BvY19yaSA9PSBVU0VSREFUQV9GSUZPX05VTSkKKwkJCQl1c2VyZGF0YV9wb2NfcmkgPSAwOworCQl9IGVsc2UKKwkJCXIgPSAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIEFNU1RSRUFNX0dFVF9FWF9XUl9DT1VOVDoKKwl7CisJCXN0cnVjdCBhbV9pb2N0bF9wYXJtX2V4ICpwID0gJnBhcm07CisJCXN0cnVjdCB2ZGVjX3MgKnZkZWMgPSBwcml2LT52ZGVjOworCisJCW11dGV4X2xvY2soJmFtc3RyZWFtX211dGV4KTsKKwkJaWYgKCF2ZGVjKQorCQkJdmRlYyA9IHZkZWNfZ2V0X3ZkZWNfYnlfaWQoMCk7IC8vVXNlIGlkIDAgYXMgZGVmYXVsdAorCQlpZiAodmRlYyAmJiB2ZGVjLT5tdmZybSkKKwkJCXAtPndyX2NvdW50ID0gdmRlYy0+bXZmcm0tPndyOworCQllbHNlCisJCQlwLT53cl9jb3VudCA9IDA7CisJCW11dGV4X3VubG9jaygmYW1zdHJlYW1fbXV0ZXgpOworCQlyID0gMDsKKwl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXIgPSAtRU5PSU9DVExDTUQ7CisJCWJyZWFrOworCX0KKwkvKiBwcl9pbmZvKCJwYXJtIHNpemU6JXp4XG4iLCBzaXplb2YocGFybSkpOyAqLworCWlmIChyID09IDApIHsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJnBhcm0sIHNpemVvZihwYXJtKSkpCisJCQlyID0gLUVGQVVMVDsKKwl9CisJcmV0dXJuIHI7CisKK30KK3N0YXRpYyBsb25nIGFtc3RyZWFtX2lvY3RsX3NldF9leChzdHJ1Y3QgcG9ydF9wcml2X3MgKnByaXYsIHVsb25nIGFyZykKK3sKKwlsb25nIHIgPSAwOworCXJldHVybiByOworfQorc3RhdGljIGxvbmcgYW1zdHJlYW1faW9jdGxfZ2V0X3B0cihzdHJ1Y3QgcG9ydF9wcml2X3MgKnByaXYsIHVsb25nIGFyZykKK3sKKwlsb25nIHIgPSAwOworCisJc3RydWN0IGFtX2lvY3RsX3Bhcm1fcHRyIHBhcm07CisKKwlpZiAoY29weV9mcm9tX3VzZXIKKwkJKCh2b2lkICopJnBhcm0sICh2b2lkICopYXJnLAorCQkgc2l6ZW9mKHBhcm0pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2ggKHBhcm0uY21kKSB7CisJY2FzZSBBTVNUUkVBTV9HRVRfUFRSX1NVQl9JTkZPOgorCQl7CisJCQlzdHJ1Y3Qgc3VidGl0bGVfaW5mbyBtc3ViX2luZm9bTUFYX1NVQl9OVU1dOworCQkJc3RydWN0IHN1YnRpdGxlX2luZm8gKnBzdWJfaW5mb1tNQVhfU1VCX05VTV07CisJCQlpbnQgaTsKKworCQkJZm9yIChpID0gMDsgaSA8IE1BWF9TVUJfTlVNOyBpKyspCisJCQkJcHN1Yl9pbmZvW2ldID0gJm1zdWJfaW5mb1tpXTsKKworCQkJciA9IHBzcGFyc2VyX2dldF9zdWJfaW5mbyhwc3ViX2luZm8pOworCisJCQlpZiAociA9PSAwKSB7CisJCQkJbWVtY3B5KHBhcm0ucGRhdGFfc3ViX2luZm8sIG1zdWJfaW5mbywKKwkJCQkJc2l6ZW9mKHN0cnVjdCBzdWJ0aXRsZV9pbmZvKQorCQkJCQkqIE1BWF9TVUJfTlVNKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyID0gLUVOT0lPQ1RMQ01EOworCQlicmVhazsKKwl9CisJLyogcHJfaW5mbygicGFybSBzaXplOiVkXG4iLCBzaXplb2YocGFybSkpOyAqLworCWlmIChyID09IDApIHsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJnBhcm0sIHNpemVvZihwYXJtKSkpCisJCQlyID0gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gcjsKKworfQorc3RhdGljIGxvbmcgYW1zdHJlYW1faW9jdGxfc2V0X3B0cihzdHJ1Y3QgcG9ydF9wcml2X3MgKnByaXYsIHVsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc3RyZWFtX3BvcnRfcyAqdGhpcyA9IHByaXYtPnBvcnQ7CisJc3RydWN0IGFtX2lvY3RsX3Bhcm1fcHRyIHBhcm07CisJbG9uZyByID0gMDsKKworCWlmIChjb3B5X2Zyb21fdXNlcgorCQkoKHZvaWQgKikmcGFybSwgKHZvaWQgKilhcmcsCisJCSBzaXplb2YocGFybSkpKSB7CisJCXByX2VycigiWyVzXSVkLCBhcmcgZXJyXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlyID0gLUVGQVVMVDsKKwl9CisJc3dpdGNoIChwYXJtLmNtZCkgeworCWNhc2UgQU1TVFJFQU1fU0VUX1BUUl9BVURJT19JTkZPOgorCQlpZiAoKHRoaXMtPnR5cGUgJiBQT1JUX1RZUEVfVklERU8pCisJCQl8fCAodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9BVURJTykpIHsKKwkJCWlmIChwYXJtLnBkYXRhX2F1ZGlvX2luZm8gIT0gTlVMTCkgeworCQkJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJCQkoKHZvaWQgKikmYXVkaW9fZGVjX2luZm8sICh2b2lkICopcGFybS5wZGF0YV9hdWRpb19pbmZvLAorCQkJCQkgc2l6ZW9mKGF1ZGlvX2RlY19pbmZvKSkpIHsKKwkJCQkJcHJfZXJyKCJbJXNdJWQsIGFyZyBlcnJcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCQkJCXIgPSAtRUZBVUxUOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlCisJCQlyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9TRVRfUFRSX0NPTkZJR1M6CisJCWlmICh0aGlzLT50eXBlICYgUE9SVF9UWVBFX1ZJREVPKSB7CisJCQlpZiAoIXBhcm0ucG9pbnRlciB8fCAocGFybS5sZW4gPD0gMCkgfHwKKwkJCQkocGFybS5sZW4gPiBQQUdFX1NJWkUpKSB7CisJCQkJciA9IC1FSU5WQUw7CisJCQl9IGVsc2UgeworCQkJCXIgPSBjb3B5X2Zyb21fdXNlcihwcml2LT52ZGVjLT5jb25maWcsCisJCQkJCQlwYXJtLnBvaW50ZXIsIHBhcm0ubGVuKTsKKwkJCQlpZiAocikKKwkJCQkJciA9IC1FSU5WQUw7CisJCQkJZWxzZQorCQkJCQlwcml2LT52ZGVjLT5jb25maWdfbGVuID0gcGFybS5sZW47CisJCQl9CisJCX0gZWxzZQorCQkJciA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fU0VUX1BUUl9IRFIxMFBfREFUQToKKwkJaWYgKCh0aGlzLT50eXBlICYgUE9SVF9UWVBFX1ZJREVPKSAmJiAodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9GUkFNRSkpIHsKKwkJCWlmICghcGFybS5wb2ludGVyIHx8IChwYXJtLmxlbiA8PSAwKSB8fAorCQkJCShwYXJtLmxlbiA+IFBBR0VfU0laRSkpIHsKKwkJCQlyID0gLUVJTlZBTDsKKwkJCX0gZWxzZSB7CisJCQkJciA9IGNvcHlfZnJvbV91c2VyKHByaXYtPnZkZWMtPmhkcjEwcF9kYXRhX2J1ZiwKKwkJCQkJCXBhcm0ucG9pbnRlciwgcGFybS5sZW4pOworCQkJCWlmIChyKSB7CisJCQkJCXByaXYtPnZkZWMtPmhkcjEwcF9kYXRhX3NpemUgPSAwOworCQkJCQlwcml2LT52ZGVjLT5oZHIxMHBfZGF0YV92YWxpZCA9IGZhbHNlOworCQkJCQlyID0gLUVJTlZBTDsKKwkJCQl9IGVsc2UgeworCQkJCQlwcml2LT52ZGVjLT5oZHIxMHBfZGF0YV9zaXplID0gcGFybS5sZW47CisJCQkJCXByaXYtPnZkZWMtPmhkcjEwcF9kYXRhX3ZhbGlkID0gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZQorCQkJciA9IC1FSU5WQUw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXIgPSAtRU5PSU9DVExDTUQ7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGxvbmcgYW1zdHJlYW1fZG9faW9jdGxfbmV3KHN0cnVjdCBwb3J0X3ByaXZfcyAqcHJpdiwKKwl1bnNpZ25lZCBpbnQgY21kLCB1bG9uZyBhcmcpCit7CisJbG9uZyByID0gMDsKKwlzdHJ1Y3Qgc3RyZWFtX3BvcnRfcyAqdGhpcyA9IHByaXYtPnBvcnQ7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQU1TVFJFQU1fSU9DX0dFVF9WRVJTSU9OOgorCQlyID0gYW1zdHJlYW1faW9jdGxfZ2V0X3ZlcnNpb24ocHJpdiwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9JT0NfR0VUOgorCQlyID0gYW1zdHJlYW1faW9jdGxfZ2V0KHByaXYsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fSU9DX1NFVDoKKwkJciA9IGFtc3RyZWFtX2lvY3RsX3NldChwcml2LCBhcmcpOworCQlicmVhazsKKwljYXNlIEFNU1RSRUFNX0lPQ19HRVRfRVg6CisJCXIgPSBhbXN0cmVhbV9pb2N0bF9nZXRfZXgocHJpdiwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9JT0NfU0VUX0VYOgorCQlyID0gYW1zdHJlYW1faW9jdGxfc2V0X2V4KHByaXYsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fSU9DX0dFVF9QVFI6CisJCXIgPSBhbXN0cmVhbV9pb2N0bF9nZXRfcHRyKHByaXYsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fSU9DX1NFVF9QVFI6CisJCXIgPSBhbXN0cmVhbV9pb2N0bF9zZXRfcHRyKHByaXYsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fSU9DX1NZU0lORk86CisJCWlmICh0aGlzLT50eXBlICYgUE9SVF9UWVBFX1ZJREVPKQorCQkJciA9IHZkZWNfc2V0X2RlY2luZm8ocHJpdi0+dmRlYywgKHZvaWQgKilhcmcpOworCQllbHNlCisJCQlyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9JT0NfR0VUX1FPU0lORk86CisJY2FzZSBBTVNUUkVBTV9JT0NfR0VUX01WREVDSU5GTzoKKwkJeworCQkJdTMyIHNsb3RzID0gMDsKKwkJCXUzMiBzdHJ1Y3Rfc2l6ZSA9IDA7CisJCQlpbnQgdmRlY19pZCA9IDA7CisJCQlzdHJ1Y3QgdmRlY19zICp2ZGVjID0gcHJpdi0+dmRlYzsKKwkJCXN0cnVjdCB2ZnJhbWVfY291bnRlcl9zICp0bXBidWYgPSBrbWFsbG9jKFFPU19GUkFNRV9OVU0gKgorCQkJCQkJc2l6ZW9mKHN0cnVjdCB2ZnJhbWVfY291bnRlcl9zKSxHRlBfS0VSTkVMKTsKKwkJCXN0cnVjdCBhdl9wYXJhbV9tdmRlY190ICBfX3VzZXIgKnVhcmcgPSAodm9pZCAqKWFyZzsKKworCQkJbXV0ZXhfbG9jaygmYW1zdHJlYW1fbXV0ZXgpOworCQkJaWYgKCF0bXBidWYpIHsKKwkJCQlyID0gLUVGQVVMVDsKKwkJCQlwcl9lcnIoImttYWxsb2MgdmZyYW1lX2NvdW50ZXJfcyBmYWlsZWQhXG4iKTsKKwkJCQltdXRleF91bmxvY2soJmFtc3RyZWFtX211dGV4KTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKGdldF91c2VyKHZkZWNfaWQsICZ1YXJnLT52ZGVjX2lkKSA8IDAgfHwKKwkJCQlnZXRfdXNlcihzdHJ1Y3Rfc2l6ZSwgJnVhcmctPnN0cnVjdF9zaXplKSA8IDApIHsKKwkJCQlyID0gLUVGQVVMVDsKKwkJCQlrZnJlZSh0bXBidWYpOworCQkJCW11dGV4X3VubG9jaygmYW1zdHJlYW1fbXV0ZXgpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAodmRlYyAmJiAhdmRlY19pZCkgLy9JZiB2ZGVjX2lkIGlzID4gMCwgaXQgbWVhbnMgdXNlciByZXF1aXJlIHRvIHVzZSBpdC4KKwkJCQlyID0gMDsvL3ZkZWMgPXByaXYtPnZkZWM7Ly9Ob3RoaW5nIHRvIGRvLgorCQkJZWxzZQorCQkJCXZkZWMgPSB2ZGVjX2dldF92ZGVjX2J5X2lkKHZkZWNfaWQpOworCQkJaWYgKCF2ZGVjKSB7CisJCQkJciA9IDA7CisJCQkJa2ZyZWUodG1wYnVmKTsKKwkJCQltdXRleF91bmxvY2soJmFtc3RyZWFtX211dGV4KTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJc2xvdHMgPSB2ZGVjX2dldF9mcmFtZV92ZGVjKHZkZWMsIHRtcGJ1Zik7CisJCQlpZiAoQU1TVFJFQU1fSU9DX0dFVF9NVkRFQ0lORk8gPT0gY21kKQorCQkJCXB1dF91c2VyKHNsb3RzLCAmdWFyZy0+c2xvdHMpOworCQkJaWYgKHNsb3RzKSB7CisJCQkJaWYgKEFNU1RSRUFNX0lPQ19HRVRfTVZERUNJTkZPID09IGNtZCkgeworCQkJCQlpZiAodmRlYy0+bXZmcm0gJiYgY29weV90b191c2VyKCh2b2lkICopJnVhcmctPmNvbW0sCisJCQkJCQkJCSZ2ZGVjLT5tdmZybS0+Y29tbSwKKwkJCQkJCQkJc2l6ZW9mKHN0cnVjdCB2ZnJhbWVfY29tbV9zKSkpIHsKKwkJCQkJCXIgPSAtRUZBVUxUOworCQkJCQkJa2ZyZWUodG1wYnVmKTsKKwkJCQkJCW11dGV4X3VubG9jaygmYW1zdHJlYW1fbXV0ZXgpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaWYgKHN0cnVjdF9zaXplID09IHNpemVvZihzdHJ1Y3QgYXZfcGFyYW1fbXZkZWNfdF9vbGQpKSB7Ly9vbGQgc3RydWN0CisJCQkJCQlzdHJ1Y3QgYXZfcGFyYW1fbXZkZWNfdF9vbGQgIF9fdXNlciAqdWFyZ19vbGQgPSAodm9pZCAqKWFyZzsKKwkJCQkJCWludCBtOworCQkJCQkJZm9yIChtPTA7IG08c2xvdHM7IG0rKykKKwkJCQkJCQlpZiAoY29weV90b191c2VyKCh2b2lkICopJnVhcmdfb2xkLT5taW5mb1ttXSwKKwkJCQkJCQkJCQkmdG1wYnVmW21dLAorCQkJCQkJCQkJCXNpemVvZihzdHJ1Y3QgdmZyYW1lX2NvdW50ZXJfc19vbGQpKSkgeworCQkJCQkJCQlyID0gLUVGQVVMVDsKKwkJCQkJCQkJa2ZyZWUodG1wYnVmKTsKKwkJCQkJCQkJbXV0ZXhfdW5sb2NrKCZhbXN0cmVhbV9tdXRleCk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJfSBlbHNlIGlmIChzdHJ1Y3Rfc2l6ZSA9PSBzaXplb2Yoc3RydWN0IGF2X3BhcmFtX212ZGVjX3QpKSB7Ly9uZXcgc3RydWN0CisJCQkJCQlpZiAoY29weV90b191c2VyKCh2b2lkICopJnVhcmctPm1pbmZvWzBdLAorCQkJCQkJCQkJdG1wYnVmLAorCQkJCQkJCQkJc2xvdHMqc2l6ZW9mKHN0cnVjdCB2ZnJhbWVfY291bnRlcl9zKSkpIHsKKwkJCQkJCQlyID0gLUVGQVVMVDsKKwkJCQkJCQlrZnJlZSh0bXBidWYpOworCQkJCQkJCW11dGV4X3VubG9jaygmYW1zdHJlYW1fbXV0ZXgpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJcHJfZXJyKCJwYXNzIGluIHNpemUgJXUsb2xkIHN0cnVjdCBzaXplICV1LGN1cnJlbnQgc3RydWN0IHNpemUgJXVcbiIsCisJCQkJCQlzdHJ1Y3Rfc2l6ZSwgKHUzMilzaXplb2Yoc3RydWN0IGF2X3BhcmFtX212ZGVjX3Rfb2xkKSwodTMyKXNpemVvZihzdHJ1Y3QgYXZfcGFyYW1fbXZkZWNfdCkpOworCQkJCQkJcHJfZXJyKCJBcHAgdXNlIGFub3RoZXIgcGljdHVyZSBzaXplLHdlIGhhdmVuJ3Qgc3VwcG9ydCBpdC5cbiIpOworCQkJCQl9CisJCQkJfWVsc2UgeyAvL0ZvciBjb21wYXRpYmlsaXR5LCBvbmx5IGNvcHkgdGhlIHFvcworCQkJCQlzdHJ1Y3QgYXZfcGFyYW1fcW9zaW5mb190ICBfX3VzZXIgKnVhcmcgPSAodm9pZCAqKWFyZzsKKwkJCQkJaW50IGk7CisJCQkJCWZvciAoaT0wOyBpPHNsb3RzOyBpKyspCisJCQkJCQlpZiAoY29weV90b191c2VyKCh2b2lkICopJnVhcmctPnZmcmFtZV9xb3NbaV0sCisJCQkJCQkJCQkmdG1wYnVmW2ldLnFvcywKKwkJCQkJCQkJCXNpemVvZihzdHJ1Y3QgdmZyYW1lX3Fvc19zKSkpIHsKKwkJCQkJCQlyID0gLUVGQVVMVDsKKwkJCQkJCQlrZnJlZSh0bXBidWYpOworCQkJCQkJCW11dGV4X3VubG9jaygmYW1zdHJlYW1fbXV0ZXgpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLypWZGVjIGRpZG4ndCBwcm9kdWNlIGl0ZW0sd2FpdCBmb3IgMTAgbXMgdG8gYXZvaWQgdXNlciBhcHBsaWNhdGlvbgorCQkJICAgICAgaW5maW5pdGVseSBjYWxsaW5nKi8KKwkJCQkvL21zbGVlcCgxMCk7IGxldCB1c2VyIGFwcCBoYW5kbGUgaXQuCisJCQl9CisJCQlrZnJlZSh0bXBidWYpOworCQl9CisJCW11dGV4X3VubG9jaygmYW1zdHJlYW1fbXV0ZXgpOworCQlicmVhazsKKwljYXNlIEFNU1RSRUFNX0lPQ19HRVRfQVZJTkZPOgorCQl7CisJCQlzdHJ1Y3QgYXZfcGFyYW1faW5mb190ICBfX3VzZXIgKnVhcmcgPSAodm9pZCAqKWFyZzsKKwkJCXN0cnVjdCBhdl9pbmZvX3QgIGF2X2luZm87CisJCQlpbnQgZGVsYXk7CisJCQl1MzIgYXZnYnBzOworCQkJaWYgKHRoaXMtPnR5cGUgJiBQT1JUX1RZUEVfVklERU8pIHsKKwkJCQlhdl9pbmZvLmZpcnN0X3BpY19jb21pbmcgPSBnZXRfZmlyc3RfcGljX2NvbWluZygpOworCQkJCWF2X2luZm8uY3VycmVudF9mcHMgPSAtMTsKKwkJCQlhdl9pbmZvLnZwdHMgPSB0aW1lc3RhbXBfdnB0c19nZXQoKTsKKwkJCQkvL2F2X2luZm8udnB0c19lcnIgPSB0c3luY19nZXRfdnB0c19lcnJvcl9udW0oKTsKKwkJCQlhdl9pbmZvLmFwdHMgPSB0aW1lc3RhbXBfYXB0c19nZXQoKTsKKwkJCQkvL2F2X2luZm8uYXB0c19lcnIgPSB0c3luY19nZXRfYXB0c19lcnJvcl9udW0oKTsKKwkJCQlhdl9pbmZvLnRzX2Vycm9yID0gZ2V0X2Rpc2NvbnRpbnVlX2NvdW50ZXIoKTsKKwkJCQlhdl9pbmZvLmZpcnN0X3ZwdHMgPSB0aW1lc3RhbXBfZmlyc3R2cHRzX2dldCgpOworCQkJCWF2X2luZm8udG9nZ2xlX2ZyYW1lX2NvdW50ID0gZ2V0X3RvZ2dsZV9mcmFtZV9jb3VudCgpOworCQkJCWRlbGF5ID0gY2FsY3VsYXRpb25fc3RyZWFtX2RlbGF5ZWRfbXMoCisJCQkJCVBUU19UWVBFX1ZJREVPLCBOVUxMLCAmYXZnYnBzKTsKKwkJCQlpZiAoZGVsYXkgPj0gMCkKKwkJCQkJYXZfaW5mby5kZWNfdmlkZW9fYnBzID0gYXZnYnBzOworCQkJCWVsc2UKKwkJCQkJYXZfaW5mby5kZWNfdmlkZW9fYnBzID0gMDsKKwkJCX0KKwkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikmdWFyZy0+YXZfaW5mbywgKHZvaWQgKikmYXZfaW5mbywKKwkJCQkJCXNpemVvZihzdHJ1Y3QgYXZfaW5mb190KSkpCisJCQkJciA9IC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJciA9IC1FTk9JT0NUTENNRDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBsb25nIGFtc3RyZWFtX2RvX2lvY3RsX29sZChzdHJ1Y3QgcG9ydF9wcml2X3MgKnByaXYsCisJdW5zaWduZWQgaW50IGNtZCwgdWxvbmcgYXJnKQoreworCXN0cnVjdCBzdHJlYW1fcG9ydF9zICp0aGlzID0gcHJpdi0+cG9ydDsKKwlsb25nIHIgPSAwOworCWludCBpOworCisJc3dpdGNoIChjbWQpIHsKKworCWNhc2UgQU1TVFJFQU1fSU9DX1ZCX1NUQVJUOgorCQlpZiAoKHRoaXMtPnR5cGUgJiBQT1JUX1RZUEVfVklERU8pICYmCisJCQkoKHByaXYtPnZkZWMtPnZidWYuZmxhZyAmIEJVRl9GTEFHX0lOX1VTRSkgPT0gMCkpIHsKKwkJCXByaXYtPnZkZWMtPnZidWYuYnVmX3N0YXJ0ID0gYXJnOworCQl9IGVsc2UKKwkJCXIgPSAtRUlOVkFMOworCQlicmVhazsKKworCWNhc2UgQU1TVFJFQU1fSU9DX1ZCX1NJWkU6CisJCWlmICgodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9WSURFTykgJiYKKwkJCSgocHJpdi0+dmRlYy0+dmJ1Zi5mbGFnICYgQlVGX0ZMQUdfSU5fVVNFKSA9PSAwKSkgeworCQkJaWYgKHByaXYtPnZkZWMtPnZidWYuZmxhZyAmIEJVRl9GTEFHX0FMTE9DKSB7CisJCQkJciArPSBzdGJ1Zl9jaGFuZ2Vfc2l6ZSgKKwkJCQkJCSZwcml2LT52ZGVjLT52YnVmLAorCQkJCQkJYXJnLCBmYWxzZSk7CisJCQl9CisJCX0gZWxzZQorCQkJciA9IC1FSU5WQUw7CisJCWJyZWFrOworCisJY2FzZSBBTVNUUkVBTV9JT0NfQUJfU1RBUlQ6CisJCWlmICgodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9BVURJTykgJiYKKwkJCSgoYnVmc1tCVUZfVFlQRV9BVURJT10uZmxhZyAmIEJVRl9GTEFHX0lOX1VTRSkgPT0gMCkpCisJCQlidWZzW0JVRl9UWVBFX0FVRElPXS5idWZfc3RhcnQgPSBhcmc7CisJCWVsc2UKKwkJCXIgPSAtRUlOVkFMOworCQlicmVhazsKKworCWNhc2UgQU1TVFJFQU1fSU9DX0FCX1NJWkU6CisJCWlmICgodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9BVURJTykgJiYKKwkJCSgoYnVmc1tCVUZfVFlQRV9BVURJT10uZmxhZyAmIEJVRl9GTEFHX0lOX1VTRSkgPT0gMCkpIHsKKwkJCWlmIChidWZzW0JVRl9UWVBFX0FVRElPXS5mbGFnICYgQlVGX0ZMQUdfQUxMT0MpIHsKKwkJCQlyID0gc3RidWZfY2hhbmdlX3NpemUoCisJCQkJCSZidWZzW0JVRl9UWVBFX0FVRElPXSwgYXJnLCBmYWxzZSk7CisJCQl9CisJCX0gZWxzZQorCQkJciA9IC1FSU5WQUw7CisJCWJyZWFrOworCisJY2FzZSBBTVNUUkVBTV9JT0NfVkZPUk1BVDoKKwkJaWYgKCh0aGlzLT50eXBlICYgUE9SVF9UWVBFX1ZJREVPKSAmJiAoYXJnIDwgVkZPUk1BVF9NQVgpKSB7CisJCQl0aGlzLT52Zm9ybWF0ID0gKGVudW0gdmZvcm1hdF9lKWFyZzsKKwkJCXRoaXMtPmZsYWcgfD0gUE9SVF9GTEFHX1ZGT1JNQVQ7CisKKwkJCXZkZWNfc2V0X2Zvcm1hdChwcml2LT52ZGVjLCB0aGlzLT52Zm9ybWF0KTsKKwkJfSBlbHNlCisJCQlyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwljYXNlIEFNU1RSRUFNX0lPQ19BRk9STUFUOgorCQlpZiAoKHRoaXMtPnR5cGUgJiBQT1JUX1RZUEVfQVVESU8pICYmIChhcmcgPCBBRk9STUFUX01BWCkpIHsKKwkJCW1lbXNldCgmYXVkaW9fZGVjX2luZm8sIDAsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBhdWRpb19pbmZvKSk7CisJCQkvKiBmb3IgbmV3IGZvcm1hdCxyZXNldCB0aGUgYXVkaW8gaW5mby4gKi8KKwkJCXRoaXMtPmFmb3JtYXQgPSAoZW51bSBhZm9ybWF0X2UpYXJnOworCQkJdGhpcy0+ZmxhZyB8PSBQT1JUX0ZMQUdfQUZPUk1BVDsKKwkJfSBlbHNlCisJCQlyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwljYXNlIEFNU1RSRUFNX0lPQ19WSUQ6CisJCWlmICh0aGlzLT50eXBlICYgUE9SVF9UWVBFX1ZJREVPKSB7CisJCQl0aGlzLT52aWQgPSAodTMyKSBhcmc7CisJCQl0aGlzLT5mbGFnIHw9IFBPUlRfRkxBR19WSUQ7CisJCX0gZWxzZQorCQkJciA9IC1FSU5WQUw7CisKKwkJYnJlYWs7CisKKwljYXNlIEFNU1RSRUFNX0lPQ19BSUQ6CisJCWlmICh0aGlzLT50eXBlICYgUE9SVF9UWVBFX0FVRElPKSB7CisJCQl0aGlzLT5haWQgPSAodTMyKSBhcmc7CisJCQl0aGlzLT5mbGFnIHw9IFBPUlRfRkxBR19BSUQ7CisKKwkJCWlmIChwb3J0X2dldF9pbml0ZWQocHJpdikpIHsKKwkJCQkvL3RzeW5jX2F1ZGlvX2JyZWFrKDEpOworCQkJCWFtc3RyZWFtX2NoYW5nZV9hdmlkKHRoaXMpOworCQkJfQorCQl9IGVsc2UKKwkJCXIgPSAtRUlOVkFMOworCQlicmVhazsKKworCWNhc2UgQU1TVFJFQU1fSU9DX1NJRDoKKwkJaWYgKHRoaXMtPnR5cGUgJiBQT1JUX1RZUEVfU1VCKSB7CisJCQl0aGlzLT5zaWQgPSAodTMyKSBhcmc7CisJCQl0aGlzLT5mbGFnIHw9IFBPUlRfRkxBR19TSUQ7CisKKwkJCWlmIChwb3J0X2dldF9pbml0ZWQocHJpdikpCisJCQkJYW1zdHJlYW1fY2hhbmdlX3NpZCh0aGlzKTsKKwkJfSBlbHNlCisJCQlyID0gLUVJTlZBTDsKKworCQlicmVhazsKKworCWNhc2UgQU1TVFJFQU1fSU9DX1BDUklEOgorCQl0aGlzLT5wY3JpZCA9ICh1MzIpIGFyZzsKKwkJdGhpcy0+cGNyX2luaXRlZCA9IDE7CisJCXByX2Vycigic2V0IHBjcmlkID0gMHgleFxuIiwgdGhpcy0+cGNyaWQpOworCQlicmVhazsKKworCWNhc2UgQU1TVFJFQU1fSU9DX1ZCX1NUQVRVUzoKKwkJaWYgKHRoaXMtPnR5cGUgJiBQT1JUX1RZUEVfVklERU8pIHsKKwkJCXN0cnVjdCBhbV9pb19wYXJhbSBwYXJhOworCQkJc3RydWN0IGFtX2lvX3BhcmFtICpwID0gJnBhcmE7CisJCQlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpidWYgPSBOVUxMOworCisJCQltdXRleF9sb2NrKCZhbXN0cmVhbV9tdXRleCk7CisKKwkJCS8qCisJCQkgKnRvZG86IGNoZWNrIHVwcGVyIGxheWVyIGZvciBkZWNvZGVyCisJCQkgKiBoYW5kbGVyIGxpZmVjeWNsZQorCQkJICovCisJCQlpZiAocHJpdi0+dmRlYyA9PSBOVUxMKSB7CisJCQkJciA9IC1FSU5WQUw7CisJCQkJbXV0ZXhfdW5sb2NrKCZhbXN0cmVhbV9tdXRleCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICh0aGlzLT50eXBlICYgUE9SVF9UWVBFX0ZSQU1FKSB7CisJCQkJc3RydWN0IHZkZWNfaW5wdXRfc3RhdHVzX3Mgc3RhdHVzOworCisJCQkJciA9IHZkZWNfaW5wdXRfZ2V0X3N0YXR1cygmcHJpdi0+dmRlYy0+aW5wdXQsCisJCQkJCQkJJnN0YXR1cyk7CisJCQkJaWYgKHIgPT0gMCkgeworCQkJCQlwLT5zdGF0dXMuc2l6ZSA9IHN0YXR1cy5zaXplOworCQkJCQlwLT5zdGF0dXMuZGF0YV9sZW4gPSBzdGF0dXMuZGF0YV9sZW47CisJCQkJCXAtPnN0YXR1cy5mcmVlX2xlbiA9IHN0YXR1cy5mcmVlX2xlbjsKKwkJCQkJcC0+c3RhdHVzLnJlYWRfcG9pbnRlciA9CisJCQkJCQkJc3RhdHVzLnJlYWRfcG9pbnRlcjsKKwkJCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgcCwKKwkJCQkJCXNpemVvZihwYXJhKSkpCisJCQkJCQlyID0gLUVGQVVMVDsKKwkJCQl9CisJCQkJbXV0ZXhfdW5sb2NrKCZhbXN0cmVhbV9tdXRleCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWJ1ZiA9ICZwcml2LT52ZGVjLT52YnVmOworCQkJcC0+c3RhdHVzLnNpemUgPSBzdGJ1Zl9jYW51c2VzaXplKGJ1Zik7CisJCQlwLT5zdGF0dXMuZGF0YV9sZW4gPSBzdGJ1Zl9sZXZlbChidWYpOworCQkJcC0+c3RhdHVzLmZyZWVfbGVuID0gc3RidWZfc3BhY2UoYnVmKTsKKwkJCXAtPnN0YXR1cy5yZWFkX3BvaW50ZXIgPSBzdGJ1Zl9ycChidWYpOworCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgcCwgc2l6ZW9mKHBhcmEpKSkKKwkJCQlyID0gLUVGQVVMVDsKKworCQkJbXV0ZXhfdW5sb2NrKCZhbXN0cmVhbV9tdXRleCk7CisJCQlyZXR1cm4gcjsKKwkJfQorCQlyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwljYXNlIEFNU1RSRUFNX0lPQ19BQl9TVEFUVVM6CisJCWlmICh0aGlzLT50eXBlICYgUE9SVF9UWVBFX0FVRElPKSB7CisJCQlzdHJ1Y3QgYW1faW9fcGFyYW0gcGFyYTsKKwkJCXN0cnVjdCBhbV9pb19wYXJhbSAqcCA9ICZwYXJhOworCQkJc3RydWN0IHN0cmVhbV9idWZfcyAqYnVmID0gJmJ1ZnNbQlVGX1RZUEVfQVVESU9dOworCisJCQlwLT5zdGF0dXMuc2l6ZSA9IHN0YnVmX2NhbnVzZXNpemUoYnVmKTsKKwkJCXAtPnN0YXR1cy5kYXRhX2xlbiA9IHN0YnVmX2xldmVsKGJ1Zik7CisJCQlwLT5zdGF0dXMuZnJlZV9sZW4gPSBzdGJ1Zl9zcGFjZShidWYpOworCQkJcC0+c3RhdHVzLnJlYWRfcG9pbnRlciA9IHN0YnVmX3JwKGJ1Zik7CisJCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCBwLCBzaXplb2YocGFyYSkpKQorCQkJCXIgPSAtRUZBVUxUOworCQkJcmV0dXJuIHI7CisJCX0KKwkJciA9IC1FSU5WQUw7CisJCWJyZWFrOworCisJY2FzZSBBTVNUUkVBTV9JT0NfU1lTSU5GTzoKKwkJaWYgKHRoaXMtPnR5cGUgJiBQT1JUX1RZUEVfVklERU8pCisJCQlyID0gdmRlY19zZXRfZGVjaW5mbyhwcml2LT52ZGVjLCAodm9pZCAqKWFyZyk7CisJCWVsc2UKKwkJCXIgPSAtRUlOVkFMOworCQlicmVhazsKKworCWNhc2UgQU1TVFJFQU1fSU9DX0FDSEFOTkVMOgorCQlpZiAodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9BVURJTykgeworCQkJdGhpcy0+YWNoYW5sID0gKHUzMikgYXJnOworCQkJc2V0X2NoX251bV9pbmZvKCh1MzIpIGFyZyk7CisJCX0gZWxzZQorCQkJciA9IC1FSU5WQUw7CisJCWJyZWFrOworCisJY2FzZSBBTVNUUkVBTV9JT0NfU0FNUExFUkFURToKKwkJaWYgKHRoaXMtPnR5cGUgJiBQT1JUX1RZUEVfQVVESU8pIHsKKwkJCXRoaXMtPmFzYW1wcmF0ZSA9ICh1MzIpIGFyZzsKKwkJCXNldF9zYW1wbGVfcmF0ZV9pbmZvKCh1MzIpIGFyZyk7CisJCX0gZWxzZQorCQkJciA9IC1FSU5WQUw7CisJCWJyZWFrOworCisJY2FzZSBBTVNUUkVBTV9JT0NfREFUQVdJRFRIOgorCQlpZiAodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9BVURJTykKKwkJCXRoaXMtPmFkYXRhd2lkdGggPSAodTMyKSBhcmc7CisJCWVsc2UKKwkJCXIgPSAtRUlOVkFMOworCQlicmVhazsKKworCWNhc2UgQU1TVFJFQU1fSU9DX1RTVEFNUDoKKwkJaWYgKCh0aGlzLT50eXBlICYgKFBPUlRfVFlQRV9BVURJTyB8IFBPUlRfVFlQRV9WSURFTykpID09CisJCQkoKFBPUlRfVFlQRV9BVURJTyB8IFBPUlRfVFlQRV9WSURFTykpKQorCQkJciA9IC1FSU5WQUw7CisJCWVsc2UgaWYgKHRoaXMtPnR5cGUgJiBQT1JUX1RZUEVfRlJBTUUpCisJCQlyID0gdmRlY19zZXRfcHRzKHByaXYtPnZkZWMsIGFyZyk7CisJCWVsc2UgaWYgKCh0aGlzLT50eXBlICYgUE9SVF9UWVBFX1ZJREVPKSB8fAorCQkJKHRoaXMtPnR5cGUgJiBQT1JUX1RZUEVfSEVWQykpIHsKKwkJCXN0cnVjdCBzdHJlYW1fYnVmX3MgKnZidWYgPSAmcHJpdi0+dmRlYy0+dmJ1ZjsKKwkJCWlmICh2YnVmLT5ub19wYXJzZXIpIHsKKwkJCQlwdHNfY2hlY2tpbl9vZmZzZXQoUFRTX1RZUEVfVklERU8sCisJCQkJCXZidWYtPnN0cmVhbV9vZmZzZXQsIGFyZyk7CisJCQl9IGVsc2UgeworCQkJCXIgPSBlc192cHRzX2NoZWNraW4odmJ1ZiwgYXJnKTsKKwkJCX0KKwkJfSBlbHNlIGlmICh0aGlzLT50eXBlICYgUE9SVF9UWVBFX0FVRElPKQorCQkJciA9IGVzX2FwdHNfY2hlY2tpbigmYnVmc1tCVUZfVFlQRV9BVURJT10sIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBBTVNUUkVBTV9JT0NfVFNUQU1QX3VTNjQ6CisJCWlmICgodGhpcy0+dHlwZSAmIChQT1JUX1RZUEVfQVVESU8gfCBQT1JUX1RZUEVfVklERU8pKSA9PQorCQkJKChQT1JUX1RZUEVfQVVESU8gfCBQT1JUX1RZUEVfVklERU8pKSkKKwkJCXIgPSAtRUlOVkFMOworCQllbHNlIHsKKwkJCXU2NCBwdHM7CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJCSgodm9pZCAqKSZwdHMsICh2b2lkICopYXJnLCBzaXplb2YodTY0KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9GUkFNRSkgeworCQkJCS8qCisJCQkJICp0b2RvOiBjaGVjayB1cHBlciBsYXllciBmb3IgZGVjb2RlciBoYW5kbGVyCisJCQkJICogbGlmZSBzZXF1ZW5jZSBvciBtdWx0aS10YXNraW5nIG1hbmFnZW1lbnQKKwkJCQkgKi8KKwkJCQlpZiAocHJpdi0+dmRlYykKKwkJCQkJciA9IHZkZWNfc2V0X3B0czY0KHByaXYtPnZkZWMsIHB0cyk7CisJCQl9IGVsc2UgaWYgKCh0aGlzLT50eXBlICYgUE9SVF9UWVBFX0hFVkMpIHx8CisJCQkJCSh0aGlzLT50eXBlICYgUE9SVF9UWVBFX1ZJREVPKSkgeworCQkJCQlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICp2YnVmID0gJnByaXYtPnZkZWMtPnZidWY7CisJCQkJCWlmICh2YnVmLT5ub19wYXJzZXIgJiYgIXZkZWNfc2luZ2xlKHByaXYtPnZkZWMpKSB7CisJCQkJCQlwdHNfY2hlY2tpbl9vZmZzZXRfdXM2NChQVFNfVFlQRV9WSURFTywKKwkJCQkJCQl2YnVmLT5zdHJlYW1fb2Zmc2V0LCBwdHMpOworCQkJCQl9IGVsc2UgeworCQkJCQkJciA9IGVzX3ZwdHNfY2hlY2tpbl91czY0KAorCQkJCQkJJnByaXYtPnZkZWMtPnZidWYsIHB0cyk7CisJCQkJCX0KKwkJCX0gZWxzZSBpZiAodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9BVURJTykgeworCQkJCQlyID0gZXNfdnB0c19jaGVja2luX3VzNjQoCisJCQkJCSZidWZzW0JVRl9UWVBFX0FVRElPXSwgcHRzKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgQU1TVFJFQU1fSU9DX1ZERUNTVEFUOgorCQlpZiAoKHRoaXMtPnR5cGUgJiBQT1JUX1RZUEVfVklERU8pID09IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJeworCQkJc3RydWN0IHZkZWNfaW5mbyB2c3RhdHVzOworCQkJc3RydWN0IGFtX2lvX3BhcmFtIHBhcmE7CisJCQlzdHJ1Y3QgYW1faW9fcGFyYW0gKnAgPSAmcGFyYTsKKworCQkJbWVtc2V0KCZ2c3RhdHVzLCAwLCBzaXplb2YodnN0YXR1cykpOworCisJCQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7CisJCQlpZiAodmRlY19zdGF0dXMocHJpdi0+dmRlYywgJnZzdGF0dXMpID09IC0xKSB7CisJCQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQl9CisJCQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKKworCQkJcC0+dnN0YXR1cy53aWR0aCA9IHZzdGF0dXMuZnJhbWVfd2lkdGg7CisJCQlwLT52c3RhdHVzLmhlaWdodCA9IHZzdGF0dXMuZnJhbWVfaGVpZ2h0OworCQkJcC0+dnN0YXR1cy5mcHMgPSB2c3RhdHVzLmZyYW1lX3JhdGU7CisJCQlwLT52c3RhdHVzLmVycm9yX2NvdW50ID0gdnN0YXR1cy5lcnJvcl9jb3VudDsKKwkJCXAtPnZzdGF0dXMuc3RhdHVzID0gdnN0YXR1cy5zdGF0dXM7CisJCQlwLT52c3RhdHVzLmV1QXNwZWN0UmF0aW8gPQorCQkJCWdldF9ub3JtYWxpemVkX2FzcGVjdF9yYXRpbygKKwkJCQkJdnN0YXR1cy5yYXRpb19jb250cm9sKTsKKworCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgcCwgc2l6ZW9mKHBhcmEpKSkKKwkJCQlyID0gLUVGQVVMVDsKKwkJCXJldHVybiByOworCQl9CisKKwljYXNlIEFNU1RSRUFNX0lPQ19WREVDSU5GTzoKKwkJaWYgKCh0aGlzLT50eXBlICYgUE9SVF9UWVBFX1ZJREVPKSA9PSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXsKKwkJCXN0cnVjdCB2ZGVjX2luZm8gdmluZm87CisJCQlzdHJ1Y3QgYW1faW9faW5mbyBwYXJhOworCisJCQltZW1zZXQoJnBhcmEsIDB4MCwgc2l6ZW9mKHN0cnVjdCBhbV9pb19pbmZvKSk7CisKKwkJCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKKwkJCWlmICh2ZGVjX3N0YXR1cyhwcml2LT52ZGVjLCAmdmluZm8pID09IC0xKSB7CisJCQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQl9CisJCQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKKworCQkJbWVtY3B5KCZwYXJhLnZpbmZvLCAmdmluZm8sIHNpemVvZihzdHJ1Y3QgdmRlY19pbmZvKSk7CisJCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmcGFyYSwgc2l6ZW9mKHBhcmEpKSkKKwkJCQlyID0gLUVGQVVMVDsKKwkJCXJldHVybiByOworCQl9CisKKwljYXNlIEFNU1RSRUFNX0lPQ19BREVDU1RBVDoKKwkJaWYgKCh0aGlzLT50eXBlICYgUE9SVF9UWVBFX0FVRElPKSA9PSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChhbXN0cmVhbV9hZGVjX3N0YXR1cyA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWVsc2UgeworCQkJc3RydWN0IGFkZWNfc3RhdHVzIGFzdGF0dXM7CisJCQlzdHJ1Y3QgYW1faW9fcGFyYW0gcGFyYTsKKwkJCXN0cnVjdCBhbV9pb19wYXJhbSAqcCA9ICZwYXJhOworCisJCQlhbXN0cmVhbV9hZGVjX3N0YXR1cygmYXN0YXR1cyk7CisJCQlwLT5hc3RhdHVzLmNoYW5uZWxzID0gYXN0YXR1cy5jaGFubmVsczsKKwkJCXAtPmFzdGF0dXMuc2FtcGxlX3JhdGUgPSBhc3RhdHVzLnNhbXBsZV9yYXRlOworCQkJcC0+YXN0YXR1cy5yZXNvbHV0aW9uID0gYXN0YXR1cy5yZXNvbHV0aW9uOworCQkJcC0+YXN0YXR1cy5lcnJvcl9jb3VudCA9IGFzdGF0dXMuZXJyb3JfY291bnQ7CisJCQlwLT5hc3RhdHVzLnN0YXR1cyA9IGFzdGF0dXMuc3RhdHVzOworCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgcCwgc2l6ZW9mKHBhcmEpKSkKKwkJCQlyID0gLUVGQVVMVDsKKwkJCXJldHVybiByOworCQl9CisJY2FzZSBBTVNUUkVBTV9JT0NfUE9SVF9JTklUOgorCQlyID0gYW1zdHJlYW1fcG9ydF9pbml0KHByaXYpOworCQlicmVhazsKKworCWNhc2UgQU1TVFJFQU1fSU9DX1ZERUNfUkVTRVQ6CisJCWlmICgodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9WSURFTykgPT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChwcml2LT52ZGVjID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT0RFVjsKKworCQlyID0gdmRlY19yZXNldChwcml2LT52ZGVjKTsKKwkJYnJlYWs7CisKKwljYXNlIEFNU1RSRUFNX0lPQ19UUklDS01PREU6CisJCWlmICgodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9WSURFTykgPT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyID0gdmRlY19zZXRfdHJpY2ttb2RlKHByaXYtPnZkZWMsIGFyZyk7CisJCWlmIChyID09IC0xKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWJyZWFrOworCisJY2FzZSBBTVNUUkVBTV9JT0NfQVVESU9fSU5GTzoKKwkJaWYgKCh0aGlzLT50eXBlICYgUE9SVF9UWVBFX1ZJREVPKQorCQkJfHwgKHRoaXMtPnR5cGUgJiBQT1JUX1RZUEVfQVVESU8pKSB7CisJCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCQkoJmF1ZGlvX2RlY19pbmZvLCAodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJIHNpemVvZihhdWRpb19kZWNfaW5mbykpKQorCQkJCXIgPSAtRUZBVUxUOworCQl9IGVsc2UKKwkJCXIgPSAtRUlOVkFMOworCQlicmVhazsKKworCWNhc2UgQU1TVFJFQU1fSU9DX0FVRElPX1JFU0VUOgorCQlpZiAodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9BVURJTykgeworCQkJc3RydWN0IHN0cmVhbV9idWZfcyAqcGFidWYgPSAmYnVmc1tCVUZfVFlQRV9BVURJT107CisKKwkJCW11dGV4X2xvY2soJmFtc3RyZWFtX211dGV4KTsKKwkJCXIgPSBhdWRpb19wb3J0X3Jlc2V0KHRoaXMsIHBhYnVmKTsKKwkJCW11dGV4X3VubG9jaygmYW1zdHJlYW1fbXV0ZXgpOworCQl9IGVsc2UKKwkJCXIgPSAtRUlOVkFMOworCisJCWJyZWFrOworCisJY2FzZSBBTVNUUkVBTV9JT0NfU1VCX1JFU0VUOgorCQlpZiAodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9TVUIpIHsKKwkJCXN0cnVjdCBzdHJlYW1fYnVmX3MgKnBzYnVmID0gJmJ1ZnNbQlVGX1RZUEVfU1VCVElUTEVdOworCisJCQlyID0gc3ViX3BvcnRfcmVzZXQodGhpcywgcHNidWYpOworCQl9IGVsc2UKKwkJCXIgPSAtRUlOVkFMOworCQlicmVhazsKKworCWNhc2UgQU1TVFJFQU1fSU9DX1NVQl9MRU5HVEg6CisJCWlmICgodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9TVUIpIHx8CisJCQkodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9TVUJfUkQpKSB7CisJCQl1MzIgc3ViX3dwLCBzdWJfcnA7CisJCQlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpwc2J1ZiA9ICZidWZzW0JVRl9UWVBFX1NVQlRJVExFXTsKKwkJCWludCB2YWw7CisKKwkJCXN1Yl93cCA9IHN0YnVmX3N1Yl93cF9nZXQoKTsKKwkJCXN1Yl9ycCA9IHN0YnVmX3N1Yl9ycF9nZXQoKTsKKworCQkJaWYgKHN1Yl93cCA9PSBzdWJfcnApCisJCQkJdmFsID0gMDsKKwkJCWVsc2UgaWYgKHN1Yl93cCA+IHN1Yl9ycCkKKwkJCQl2YWwgPSBzdWJfd3AgLSBzdWJfcnA7CisJCQllbHNlCisJCQkJdmFsID0gcHNidWYtPmJ1Zl9zaXplIC0gKHN1Yl9ycCAtIHN1Yl93cCk7CisJCQlwdXRfdXNlcih2YWwsIChpbnQgX191c2VyICopYXJnKTsKKwkJfSBlbHNlCisJCQlyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwljYXNlIEFNU1RSRUFNX0lPQ19VRF9MRU5HVEg6CisJCWlmICh0aGlzLT50eXBlICYgUE9SVF9UWVBFX1VTRVJEQVRBKSB7CisJCQkvKiAqKCh1MzIgKilhcmcpID0gdXNlcmRhdGFfbGVuZ3RoOyAqLworCQkJcHV0X3VzZXIodXNlcmRhdGFfbGVuZ3RoLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmcpOworCQkJdXNlcmRhdGFfbGVuZ3RoID0gMDsKKwkJfSBlbHNlCisJCQlyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwljYXNlIEFNU1RSRUFNX0lPQ19VRF9QT0M6CisJCWlmICh0aGlzLT50eXBlICYgUE9SVF9UWVBFX1VTRVJEQVRBKSB7CisJCQkvKiAqKCh1MzIgKilhcmcpID0gdXNlcmRhdGFfbGVuZ3RoOyAqLworCQkJaW50IHJpOworI2lmZGVmIERFQlVHX1VTRVJfREFUQQorCQkJaW50IHdpOworI2VuZGlmCisJCQlpbnQgYkRhdGFBdmFpbCA9IDA7CisKKwkJCW11dGV4X2xvY2soJnVzZXJkYXRhX211dGV4KTsKKwkJCWlmICh1c2VyZGF0YV9wb2Nfd2kgIT0gdXNlcmRhdGFfcG9jX3JpKSB7CisJCQkJYkRhdGFBdmFpbCA9IDE7CisJCQkJcmkgPSB1c2VyZGF0YV9wb2Nfcmk7CisjaWZkZWYgREVCVUdfVVNFUl9EQVRBCisJCQkJd2kgPSB1c2VyZGF0YV9wb2Nfd2k7CisjZW5kaWYKKwkJCQl1c2VyZGF0YV9wb2NfcmkrKzsKKwkJCQlpZiAodXNlcmRhdGFfcG9jX3JpID49IFVTRVJEQVRBX0ZJRk9fTlVNKQorCQkJCQl1c2VyZGF0YV9wb2NfcmkgPSAwOworCQkJfQorCQkJbXV0ZXhfdW5sb2NrKCZ1c2VyZGF0YV9tdXRleCk7CisJCQlpZiAoYkRhdGFBdmFpbCkgeworCQkJCWludCByZXM7CisJCQkJc3RydWN0IHVzZXJkYXRhX3BvY19pbmZvX3QgdXNlcmRhdGFfcG9jID0KKwkJCQkJdXNlcmRhdGFfcG9jX2luZm9bcmldOworI2lmZGVmIERFQlVHX1VTRVJfREFUQQorCQkJCXByX2luZm8oInJlYWQgcG9jOiByaT0lZCwgd2k9JWQsIHBvYz0lZCwgbGFzdF93aT0lZFxuIiwKKwkJCQkJcmksIHdpLAorCQkJCQl1c2VyZGF0YV9wb2MucG9jX251bWJlciwKKwkJCQkJbGFzdF9yZWFkX3dpKTsKKyNlbmRpZgorCQkJCXJlcyA9CisJCQkJY29weV90b191c2VyKCh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZywKKwkJCQkJJnVzZXJkYXRhX3BvYywKKwkJCQkJc2l6ZW9mKHN0cnVjdCB1c2VyZGF0YV9wb2NfaW5mb190KSk7CisJCQkJaWYgKHJlcyA8IDApCisJCQkJCXIgPSAtRUZBVUxUOworCQkJfSBlbHNlIHsKKwkJCQlyID0gLUVGQVVMVDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXIgPSAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBTVNUUkVBTV9JT0NfVURfQlVGX1JFQUQ6CisJCXsKKwkJCWlmICh0aGlzLT50eXBlICYgUE9SVF9UWVBFX1VTRVJEQVRBKSB7CisJCQkJc3RydWN0IHVzZXJkYXRhX3BhcmFtX3QgIHBhcmFtOworCQkJCXN0cnVjdCB1c2VyZGF0YV9wYXJhbV90ICAqcF91c2VyZGF0YV9wYXJhbTsKKwkJCQlzdHJ1Y3QgdmRlY19zICp2ZGVjOworCisJCQkJcF91c2VyZGF0YV9wYXJhbSA9ICZwYXJhbTsKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIocF91c2VyZGF0YV9wYXJhbSwKKwkJCQkJKHZvaWQgX191c2VyICopYXJnLAorCQkJCQlzaXplb2Yoc3RydWN0IHVzZXJkYXRhX3BhcmFtX3QpKSkgeworCQkJCQlyID0gLUVGQVVMVDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCW11dGV4X2xvY2soJmFtc3RyZWFtX211dGV4KTsKKwkJCQlpZiAodmRlY19nZXRfZGVidWdfZmxhZ3MoKSAmIDB4MTAwMDAwMDApCisJCQkJCXByX2luZm8oIiVzLCBpbnN0YW5jZV9pZCA9ICVkXG4iLCBfX2Z1bmNfXywgcF91c2VyZGF0YV9wYXJhbS0+aW5zdGFuY2VfaWQpOworCQkJCXZkZWMgPSB2ZGVjX2dldF92ZGVjX2J5X3ZpZGVvX2lkKHBfdXNlcmRhdGFfcGFyYW0tPmluc3RhbmNlX2lkKTsKKwkJCQlpZiAodmRlYykgeworCQkJCQlpZiAodmRlY19yZWFkX3VzZXJfZGF0YSh2ZGVjLAorCQkJCQkJCXBfdXNlcmRhdGFfcGFyYW0pID09IDApIHsKKwkJCQkJCXIgPSAtRUZBVUxUOworCQkJCQkJbXV0ZXhfdW5sb2NrKCZhbXN0cmVhbV9tdXRleCk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsCisJCQkJCQlwX3VzZXJkYXRhX3BhcmFtLAorCQkJCQkJc2l6ZW9mKHN0cnVjdCB1c2VyZGF0YV9wYXJhbV90KSkpCisJCQkJCQlyID0gLUVGQVVMVDsKKwkJCQl9IGVsc2UKKwkJCQkJciA9IC1FSU5WQUw7CisJCQkJbXV0ZXhfdW5sb2NrKCZhbXN0cmVhbV9tdXRleCk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFNU1RSRUFNX0lPQ19VRF9BVkFJTEFCTEVfVkRFQzoKKwkJeworCQkJdW5zaWduZWQgaW50IHJlYWR5X3ZkZWMgPSAwOworCQkJdTMyIHJlYWR5X2ZsYWcgPSAwOworCQkJc3RfdXNlcmRhdGEgKnVzZXJkYXRhID0gZ2V0X3ZkZWNfdXNlcmRhdGFfY3R4KCk7CisKKwkJCW11dGV4X2xvY2soJnVzZXJkYXRhLT5tdXRleCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1VTRVJEQVRBX0NIQU5ORUxfTlVNOyBpKyspIHsKKwkJCQlpZiAodXNlcmRhdGEtPnZpZGVvX2lkID09IHVzZXJkYXRhLT5pZFtpXSAmJgorCQkJCQl1c2VyZGF0YS0+cmVhZHlfZmxhZ1tpXSA9PSAxKSB7CisJCQkJCXJlYWR5X3ZkZWMgPSB1c2VyZGF0YS0+aWRbaV07CisJCQkJCXVzZXJkYXRhLT5yZWFkeV9mbGFnW2ldID0gMDsKKwkJCQkJcmVhZHlfZmxhZyA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmICghcmVhZHlfZmxhZykgeworCQkJCXByX2luZm8oImluc3RhbmNlICVkIG5vdCByZWFkeSFcbiIsIHVzZXJkYXRhLT52aWRlb19pZCk7CisJCQkJciA9IC1FSU5WQUw7CisJCQl9CisJCQltdXRleF91bmxvY2soJnVzZXJkYXRhLT5tdXRleCk7CisKKwkJCXB1dF91c2VyKHJlYWR5X3ZkZWMsICh1aW50MzJfdCBfX3VzZXIgKilhcmcpOworCQkJaWYgKHZkZWNfZ2V0X2RlYnVnX2ZsYWdzKCkgJiAweDEwMDAwMDAwKQorCQkJCXByX2luZm8oIiVzLCByZWFkeV92ZGVjID0gJXVcbiIsIF9fZnVuY19fLCByZWFkeV92ZGVjKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQU1TVFJFQU1fSU9DX0dFVF9WREVDX0lEOgorCQlpZiAodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9WSURFTyAmJiBwcml2LT52ZGVjKSB7CisJCQlwdXRfdXNlcihwcml2LT52ZGVjLT5pZCwgKGludDMyX3QgX191c2VyICopYXJnKTsKKwkJfSBlbHNlCisJCQlyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisKKworCWNhc2UgQU1TVFJFQU1fSU9DX1VEX0ZMVVNIX1VTRVJEQVRBOgorCQlpZiAodGhpcy0+dHlwZSAmIFBPUlRfVFlQRV9VU0VSREFUQSkgeworCQkJc3RydWN0IHZkZWNfcyAqdmRlYzsKKwkJCWludCB2aWRlb19pZDsKKworCQkJbXV0ZXhfbG9jaygmYW1zdHJlYW1fbXV0ZXgpOworCQkJZ2V0X3VzZXIodmlkZW9faWQsIChpbnQgX191c2VyICopYXJnKTsKKwkJCXByX2luZm8oInVzZXJkYXRhIGZsdXNoIGlkOiAlZFxuIiwgdmlkZW9faWQpOworCQkJdmRlYyA9IHZkZWNfZ2V0X3ZkZWNfYnlfdmlkZW9faWQodmlkZW9faWQpOworCQkJaWYgKHZkZWMpIHsKKwkJCQl2ZGVjX3Jlc2V0X3VzZXJkYXRhX2ZpZm8odmRlYywgMCk7CisJCQkJcHJfaW5mbygicmVzZXRfdXNlcmRhdGFfZmlmbyBmb3IgdmRlY19pZDogJWQgdmlkZW9faWQ6ICVkXFxuIiwKKwkJCQkJdmRlYy0+aWQsIHZkZWMtPnZpZGVvX2lkKTsKKwkJCX0KKwkJCW11dGV4X3VubG9jaygmYW1zdHJlYW1fbXV0ZXgpOworCQl9IGVsc2UKKwkJCXIgPSAtRUlOVkFMOworCQlicmVhazsKKworCWNhc2UgQU1TVFJFQU1fSU9DX1NFVF9ERUNfUkVTRVQ6CisJCXRzeW5jX3NldF9kZWNfcmVzZXQoKTsKKwkJYnJlYWs7CisKKwljYXNlIEFNU1RSRUFNX0lPQ19UU19TS0lQQllURToKKwkJaWYgKChpbnQpYXJnID49IDApCisJCQl0c2RlbXV4X3NldF9za2lwYnl0ZShhcmcpOworCQllbHNlCisJCQlyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwljYXNlIEFNU1RSRUFNX0lPQ19TVUJfVFlQRToKKwkJc3ViX3R5cGUgPSAoaW50KWFyZzsKKwkJYnJlYWs7CisKKwljYXNlIEFNU1RSRUFNX0lPQ19BUFRTX0xPT0tVUDoKKwkJaWYgKHRoaXMtPnR5cGUgJiBQT1JUX1RZUEVfQVVESU8pIHsKKwkJCXUzMiBwdHMgPSAwLCBmcmFtZV9zaXplLCBvZmZzZXQ7CisKKwkJCWdldF91c2VyKG9mZnNldCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJnKTsKKwkJCXB0c19sb29rdXBfb2Zmc2V0KFBUU19UWVBFX0FVRElPLCBvZmZzZXQsICZwdHMsCisJCQkJJmZyYW1lX3NpemUsIDMwMCk7CisJCQlwdXRfdXNlcihwdHMsIChpbnQgX191c2VyICopYXJnKTsKKwkJfQorCQlyZXR1cm4gMDsKKwljYXNlIEdFVF9GSVJTVF9BUFRTX0ZMQUc6CisJCWlmICh0aGlzLT50eXBlICYgUE9SVF9UWVBFX0FVRElPKSB7CisJCQlwdXRfdXNlcihmaXJzdF9wdHNfY2hlY2tpbl9jb21wbGV0ZShQVFNfVFlQRV9BVURJTyksCisJCQkJCSAoaW50IF9fdXNlciAqKWFyZyk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFNU1RSRUFNX0lPQ19BUFRTOgorCQlwdXRfdXNlcih0aW1lc3RhbXBfYXB0c19nZXQoKSwgKGludCBfX3VzZXIgKilhcmcpOworCQlicmVhazsKKworCWNhc2UgQU1TVFJFQU1fSU9DX1ZQVFM6CisJCXB1dF91c2VyKHRpbWVzdGFtcF92cHRzX2dldCgpLCAoaW50IF9fdXNlciAqKWFyZyk7CisJCWJyZWFrOworCisJY2FzZSBBTVNUUkVBTV9JT0NfUENSU0NSOgorCQkvL3B1dF91c2VyKHRpbWVzdGFtcF9wY3JzY3JfZ2V0KCksIChpbnQgX191c2VyICopYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIEFNU1RSRUFNX0lPQ19TRVRfUENSU0NSOgorCQl0aW1lc3RhbXBfcGNyc2NyX3NldChhcmcpOworCQlicmVhazsKKwljYXNlIEFNU1RSRUFNX0lPQ19HRVRfTEFTVF9DSEVDS0lOX0FQVFM6CisJCXB1dF91c2VyKGdldF9sYXN0X2NoZWNraW5fcHRzKFBUU19UWVBFX0FVRElPKSwgKGludCAqKWFyZyk7CisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fSU9DX0dFVF9MQVNUX0NIRUNLSU5fVlBUUzoKKwkJcHV0X3VzZXIoZ2V0X2xhc3RfY2hlY2tpbl9wdHMoUFRTX1RZUEVfVklERU8pLCAoaW50ICopYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9JT0NfR0VUX0xBU1RfQ0hFQ0tPVVRfQVBUUzoKKwkJcHV0X3VzZXIoZ2V0X2xhc3RfY2hlY2tvdXRfcHRzKFBUU19UWVBFX0FVRElPKSwgKGludCAqKWFyZyk7CisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fSU9DX0dFVF9MQVNUX0NIRUNLT1VUX1ZQVFM6CisJCXB1dF91c2VyKGdldF9sYXN0X2NoZWNrb3V0X3B0cyhQVFNfVFlQRV9WSURFTyksIChpbnQgKilhcmcpOworCQlicmVhazsKKwljYXNlIEFNU1RSRUFNX0lPQ19TVUJfTlVNOgorCQlwdXRfdXNlcihwc3BhcnNlcl9nZXRfc3ViX2ZvdW5kX251bSgpLCAoaW50ICopYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIEFNU1RSRUFNX0lPQ19TVUJfSU5GTzoKKwkJaWYgKGFyZyA+IDApIHsKKwkJCXN0cnVjdCBzdWJ0aXRsZV9pbmZvICptc3ViX2luZm8gPQorCQkJCXZ6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzdWJ0aXRsZV9pbmZvKSAqIE1BWF9TVUJfTlVNKTsKKwkJCXN0cnVjdCBzdWJ0aXRsZV9pbmZvICoqcHN1Yl9pbmZvID0KKwkJCQl2emFsbG9jKHNpemVvZihzdHJ1Y3Qgc3VidGl0bGVfaW5mbykgKiBNQVhfU1VCX05VTSk7CisJCQlpbnQgaTsKKworCQkJaWYgKCFtc3ViX2luZm8gfHwgIXBzdWJfaW5mbykgeworCQkJCXIgPSAtRU5PTUVNOworCQkJCWJyZWFrOworCQkJfQorCisJCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1NVQl9OVU07IGkrKykKKwkJCQlwc3ViX2luZm9baV0gPSAmbXN1Yl9pbmZvW2ldOworCisJCQlyID0gcHNwYXJzZXJfZ2V0X3N1Yl9pbmZvKHBzdWJfaW5mbyk7CisKKwkJCWlmIChyID09IDApIHsKKwkJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgbXN1Yl9pbmZvLAorCQkJCXNpemVvZihzdHJ1Y3Qgc3VidGl0bGVfaW5mbykgKiBNQVhfU1VCX05VTSkpCisJCQkJCXIgPSAtRUZBVUxUOworCQkJfQorCQkJdmZyZWUobXN1Yl9pbmZvKTsKKwkJCXZmcmVlKHBzdWJfaW5mbyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9JT0NfU0VUX0RFTVVYOgorCQl0c2RlbXV4X3NldF9kZW11eCgoaW50KWFyZyk7CisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fSU9DX1NFVF9WSURFT19ERUxBWV9MSU1JVF9NUzoKKwkJcHJpdi0+dmRlYy0+dmJ1Zi5tYXhfYnVmZmVyX2RlbGF5X21zID0gKGludClhcmc7CisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fSU9DX1NFVF9BVURJT19ERUxBWV9MSU1JVF9NUzoKKwkJYnVmc1tCVUZfVFlQRV9BVURJT10ubWF4X2J1ZmZlcl9kZWxheV9tcyA9IChpbnQpYXJnOworCQlicmVhazsKKwljYXNlIEFNU1RSRUFNX0lPQ19HRVRfVklERU9fREVMQVlfTElNSVRfTVM6CisJCXB1dF91c2VyKHByaXYtPnZkZWMtPnZidWYubWF4X2J1ZmZlcl9kZWxheV9tcywgKGludCAqKWFyZyk7CisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fSU9DX0dFVF9BVURJT19ERUxBWV9MSU1JVF9NUzoKKwkJcHV0X3VzZXIoYnVmc1tCVUZfVFlQRV9BVURJT10ubWF4X2J1ZmZlcl9kZWxheV9tcywgKGludCAqKWFyZyk7CisJCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fSU9DX0dFVF9WSURFT19DVVJfREVMQVlfTVM6IHsKKwkJaW50IGRlbGF5OworCisJCWRlbGF5ID0gY2FsY3VsYXRpb25fc3RyZWFtX2RlbGF5ZWRfbXMoCisJCQlQVFNfVFlQRV9WSURFTywgTlVMTCwgTlVMTCk7CisJCWlmIChkZWxheSA+PSAwKQorCQkJcHV0X3VzZXIoZGVsYXksIChpbnQgKilhcmcpOworCQllbHNlCisJCQlwdXRfdXNlcigwLCAoaW50ICopYXJnKTsKKwl9CisJYnJlYWs7CisKKwljYXNlIEFNU1RSRUFNX0lPQ19HRVRfQVVESU9fQ1VSX0RFTEFZX01TOiB7CisJCWludCBkZWxheTsKKworCQlkZWxheSA9IGNhbGN1bGF0aW9uX3N0cmVhbV9kZWxheWVkX21zKFBUU19UWVBFX0FVRElPLCBOVUxMLAorCQkJTlVMTCk7CisJCWlmIChkZWxheSA+PSAwKQorCQkJcHV0X3VzZXIoZGVsYXksIChpbnQgKilhcmcpOworCQllbHNlCisJCQlwdXRfdXNlcigwLCAoaW50ICopYXJnKTsKKwl9CisJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9JT0NfR0VUX0FVRElPX0FWR19CSVRSQVRFX0JQUzogeworCQlpbnQgZGVsYXk7CisJCXUzMiBhdmdicHM7CisKKwkJZGVsYXkgPSBjYWxjdWxhdGlvbl9zdHJlYW1fZGVsYXllZF9tcyhQVFNfVFlQRV9BVURJTywgTlVMTCwKKwkJCQkmYXZnYnBzKTsKKwkJaWYgKGRlbGF5ID49IDApCisJCQlwdXRfdXNlcihhdmdicHMsIChpbnQgKilhcmcpOworCQllbHNlCisJCQlwdXRfdXNlcigwLCAoaW50ICopYXJnKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQU1TVFJFQU1fSU9DX0dFVF9WSURFT19BVkdfQklUUkFURV9CUFM6IHsKKwkJaW50IGRlbGF5OworCQl1MzIgYXZnYnBzOworCisJCWRlbGF5ID0gY2FsY3VsYXRpb25fc3RyZWFtX2RlbGF5ZWRfbXMoUFRTX1RZUEVfVklERU8sIE5VTEwsCisJCQkJJmF2Z2Jwcyk7CisJCWlmIChkZWxheSA+PSAwKQorCQkJcHV0X3VzZXIoYXZnYnBzLCAoaW50ICopYXJnKTsKKwkJZWxzZQorCQkJcHV0X3VzZXIoMCwgKGludCAqKWFyZyk7CisJCWJyZWFrOworCX0KKwljYXNlIEFNU1RSRUFNX0lPQ19TRVRfRFJNTU9ERToKKwkJaWYgKCh1MzIpIGFyZyA9PSAxKSB7CisJCQlwcl9lcnIoInNldCBkcm1tb2RlLCBpbnB1dCBtdXN0IGJlIHNlY3VyZSBidWZmZXJcbiIpOworCQkJdGhpcy0+ZmxhZyB8PSBQT1JUX0ZMQUdfRFJNOworCQkJaWYgKCh0aGlzLT50eXBlICYgUE9SVF9UWVBFX1ZJREVPKSAmJgorCQkJCShwcml2LT52ZGVjKSkKKwkJCQlwcml2LT52ZGVjLT5wb3J0X2ZsYWcgfD0gUE9SVF9GTEFHX0RSTTsKKwkJfSBlbHNlIGlmICgodTMyKWFyZyA9PSAyKSB7CisJCQlwcl9lcnIoInNldCBkcm1tb2RlLCBpbnB1dCBtdXN0IGJlIG5vcm1hbCBidWZmZXJcbiIpOworCQkJaWYgKCh0aGlzLT50eXBlICYgUE9SVF9UWVBFX1ZJREVPKSAmJgorCQkJCShwcml2LT52ZGVjKSkgeworCQkJCXByX2VycigidmRlYyBwb3J0X2ZsYWcgd2l0aCBkcm1tb2RlXG4iKTsKKwkJCQlwcml2LT52ZGVjLT5wb3J0X2ZsYWcgfD0gUE9SVF9GTEFHX0RSTTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRoaXMtPmZsYWcgJj0gKH5QT1JUX0ZMQUdfRFJNKTsKKwkJCXByX2Vycigibm8gZHJtbW9kZVxuIik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBTVNUUkVBTV9JT0NfU0VUX0FQVFM6IHsKKwkJdW5zaWduZWQgbG9uZyBwdHM7CisKKwkJaWYgKGdldF91c2VyKHB0cywgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJnKSkgeworCQkJcHJfZXJyCisJCQkoIkdldCBhdWRpbyBwdHMgZnJvbSB1c2VyIHNwYWNlIGZhdWx0IVxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlpZiAodHN5bmNfZ2V0X21vZGUoKSA9PSBUU1lOQ19NT0RFX1BDUk1BU1RFUikKKwkJCXRzeW5jX3Bjcl9zZXRfYXB0cyhwdHMpOworCQllbHNlCisJCQl0c3luY19zZXRfYXB0cyhwdHMpOworCQlicmVhazsKKwl9CisJY2FzZSBBTVNUUkVBTV9JT0NfU0VUX0NSQzogeworCQlzdHJ1Y3QgdXNyX2NyY19pbmZvX3QgY3JjX2luZm87CisJCXN0cnVjdCB2ZGVjX3MgKnZkZWM7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjcmNfaW5mbywgKHZvaWQgX191c2VyICopYXJnLAorCQkJc2l6ZW9mKHN0cnVjdCB1c3JfY3JjX2luZm9fdCkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQkvKgorCQlwcl9pbmZvKCJpZCAlZCwgZnJhbWUgJWQsIHlfY3JjOiAlMDh4LCB1dl9jcmM6ICUwOHhcbiIsIGNyY19pbmZvLmlkLAorCQkJY3JjX2luZm8ucGljX251bSwgY3JjX2luZm8ueV9jcmMsIGNyY19pbmZvLnV2X2NyYyk7CisJCSovCisJCXZkZWMgPSB2ZGVjX2dldF92ZGVjX2J5X2lkKGNyY19pbmZvLmlkKTsKKwkJaWYgKHZkZWMgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PREVWOworCQlpZiAodmRlYy0+dmZjLmNtcF9wb29sID09IE5VTEwpIHsKKwkJCXZkZWMtPnZmYy5jbXBfcG9vbCA9CisJCQkJdm1hbGxvYyhVU0VSX0NNUF9QT09MX01BWF9TSVpFICoKKwkJCQkJc2l6ZW9mKHN0cnVjdCB1c3JfY3JjX2luZm9fdCkpOworCQkJaWYgKHZkZWMtPnZmYy5jbXBfcG9vbCA9PSBOVUxMKQorCQkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWlmICh2ZGVjLT52ZmMudXNyX2NtcF9udW0gPj0gVVNFUl9DTVBfUE9PTF9NQVhfU0laRSkgeworCQkJcHJfaW5mbygid2FybjogY291bGQgbm90IHdyaXRlIGFueSBtb3JlLCBtYXggJWQiLAorCQkJCVVTRVJfQ01QX1BPT0xfTUFYX1NJWkUpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJbWVtY3B5KCZ2ZGVjLT52ZmMuY21wX3Bvb2xbdmRlYy0+dmZjLnVzcl9jbXBfbnVtXSwgJmNyY19pbmZvLAorCQkJc2l6ZW9mKHN0cnVjdCB1c3JfY3JjX2luZm9fdCkpOworCQl2ZGVjLT52ZmMudXNyX2NtcF9udW0rKzsKKwkJYnJlYWs7CisJfQorCWNhc2UgQU1TVFJFQU1fSU9DX0dFVF9DUkNfQ01QX1JFU1VMVDogeworCQlpbnQgdmFsLCB2ZGVjX2lkOworCQlzdHJ1Y3QgdmRlY19zICp2ZGVjOworCisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopYXJnKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJdmRlY19pZCA9IHZhbCAmIDB4MDBmZjsKKwkJdmRlYyA9IHZkZWNfZ2V0X3ZkZWNfYnlfaWQodmRlY19pZCk7CisJCWlmICh2ZGVjID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJaWYgKHZhbCAmIDB4ZmYwMCkKKwkJCXB1dF91c2VyKHZkZWMtPnZmYy51c3JfY21wX251bSwgKGludCAqKWFyZyk7CisJCWVsc2UKKwkJCXB1dF91c2VyKHZkZWMtPnZmYy51c3JfY21wX3Jlc3VsdCwgKGludCAqKWFyZyk7CisJCS8qCisJCXByX2luZm8oImFtc3RyZWFtIGdldCBjcmMzMiBjbXBhcmUgbnVtICVkIHJlc3VsdDogJWRcbiIsCisJCQl2ZGVjLT52ZmMudXNyX2NtcF9udW0sIHZkZWMtPnZmYy51c3JfY21wX3Jlc3VsdCk7CisJCSovCisJCWJyZWFrOworCX0KKwljYXNlIEFNU1RSRUFNX0lPQ19JTklUX0VYX1NUQlVGOiB7CisJCXN0cnVjdCBzdHJlYW1fYnVmZmVyX21ldGFpbmZvIHBhcm07CisJCXN0cnVjdCBzdHJlYW1fYnVmX3MgKnZidWYgPSBOVUxMOworCisJCWlmIChwcml2LT52ZGVjID09IE5VTEwpIHsKKwkJCXByX2VycigiaW5pdCAlcywgbm8gdmRlYy5cbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJdmJ1ZiA9ICZwcml2LT52ZGVjLT52YnVmOworCQlpZiAodmJ1ZiA9PSBOVUxMKSB7CisJCQlwcl9lcnIoImluaXQgJXMsIG5vIHN0YnVmLlxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnBhcm0sICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCXNpemVvZihzdHJ1Y3Qgc3RyZWFtX2J1ZmZlcl9tZXRhaW5mbykpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlzdHJlYW1fYnVmZmVyX3NldF9leHRfYnVmKHZidWYsIHBhcm0uc3RidWZfc3RhcnQsCisJCQlwYXJtLnN0YnVmX3NpemUsIHBhcm0uc3RidWZfZmxhZyk7CisJCWJyZWFrOworCX0KKwljYXNlIEFNU1RSRUFNX0lPQ19XUl9TVEJVRl9NRVRBOiB7CisJCXN0cnVjdCBzdHJlYW1fYnVmZmVyX21ldGFpbmZvIG1ldGE7CisJCXN0cnVjdCBzdHJlYW1fYnVmX3MgKnZidWYgPSBOVUxMOworCisJCWlmIChwcml2LT52ZGVjID09IE5VTEwpIHsKKwkJCXByX2Vycigid3JpdGUgJXMsIG5vIHZkZWMuXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCXZidWYgPSAmcHJpdi0+dmRlYy0+dmJ1ZjsKKwkJaWYgKHZidWYgPT0gTlVMTCkgeworCQkJcHJfZXJyKCJ3cml0ZSAlcywgbm8gc3RidWYuXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCWlmICh2YnVmLT5vcHMgPT0gTlVMTCkgeworCQkJcHJfZXJyKCJ3cml0ZSAlcywgbm8gb3BzLlxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlpZiAoY29weV9mcm9tX3VzZXIoJm1ldGEsICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCXNpemVvZihzdHJ1Y3Qgc3RyZWFtX2J1ZmZlcl9tZXRhaW5mbykpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlpZiAoIXZidWYtPmV4dF9idWZfYWRkcikKKwkJCXJldHVybiAtRU5PREVWOworCisJCXN0cmVhbV9idWZmZXJfbWV0YV93cml0ZSh2YnVmLCAmbWV0YSk7CisJCWJyZWFrOworCX0KKwljYXNlIEFNU1RSRUFNX0lPQ19HRVRfU1RCVUZfU1RBVFVTOiB7CisJCXN0cnVjdCBzdHJlYW1fYnVmZmVyX3N0YXR1cyBzdDsKKwkJc3RydWN0IHN0cmVhbV9idWZfcyAqcGJ1ZiA9IE5VTEw7CisKKwkJaWYgKHByaXYtPnZkZWMgPT0gTlVMTCkgeworCQkJcHJfZXJyKCJnZXQgc3RhdHVzICVzLCBubyB2ZGVjLlxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlwYnVmID0gJnByaXYtPnZkZWMtPnZidWY7CisJCWlmIChwYnVmID09IE5VTEwpIHsKKwkJCXByX2VycigiZ2V0IHN0YXR1cyAlcywgbm8gc3RidWYuXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCWlmIChwYnVmLT5vcHMgPT0gTlVMTCkgeworCQkJcHJfZXJyKCJnZXQgc3RhdHVzICVzLCBubyBvcHMuXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCXN0LnN0YnVmX3N0YXJ0ID0gcGJ1Zi0+ZXh0X2J1Zl9hZGRyOworCQlzdC5zdGJ1Zl9zaXplID0gcGJ1Zi0+YnVmX3NpemU7CisJCXN0LnN0YnVmX3JwID0gcGJ1Zi0+b3BzLT5nZXRfcnAocGJ1Zik7CisJCXN0LnN0YnVmX3dwID0gcGJ1Zi0+b3BzLT5nZXRfd3AocGJ1Zik7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmc3QsCisJCQlzaXplb2Yoc3RydWN0IHN0cmVhbV9idWZmZXJfc3RhdHVzKSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlyID0gLUVOT0lPQ1RMQ01EOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGxvbmcgYW1zdHJlYW1fZG9faW9jdGwoc3RydWN0IHBvcnRfcHJpdl9zICpwcml2LAorCXVuc2lnbmVkIGludCBjbWQsIHVsb25nIGFyZykKK3sKKwlsb25nIHIgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFNU1RSRUFNX0lPQ19HRVRfVkVSU0lPTjoKKwljYXNlIEFNU1RSRUFNX0lPQ19HRVQ6CisJY2FzZSBBTVNUUkVBTV9JT0NfU0VUOgorCWNhc2UgQU1TVFJFQU1fSU9DX0dFVF9FWDoKKwljYXNlIEFNU1RSRUFNX0lPQ19TRVRfRVg6CisJY2FzZSBBTVNUUkVBTV9JT0NfR0VUX1BUUjoKKwljYXNlIEFNU1RSRUFNX0lPQ19TRVRfUFRSOgorCWNhc2UgQU1TVFJFQU1fSU9DX1NZU0lORk86CisJY2FzZSBBTVNUUkVBTV9JT0NfR0VUX1FPU0lORk86CisJY2FzZSBBTVNUUkVBTV9JT0NfR0VUX01WREVDSU5GTzoKKwljYXNlIEFNU1RSRUFNX0lPQ19HRVRfQVZJTkZPOgorCQlyID0gYW1zdHJlYW1fZG9faW9jdGxfbmV3KHByaXYsIGNtZCwgYXJnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJciA9IGFtc3RyZWFtX2RvX2lvY3RsX29sZChwcml2LCBjbWQsIGFyZyk7CisJCWJyZWFrOworCX0KKwlpZiAociAhPSAwKQorCQlwcl9kZWJ1ZygiYW1zdHJlYW1fZG9faW9jdGwgZXJyb3IgOiVseCwgJXhcbiIsIHIsIGNtZCk7CisKKwlyZXR1cm4gcjsKK30KK3N0YXRpYyBsb25nIGFtc3RyZWFtX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bG9uZyBhcmcpCit7CisJc3RydWN0IHBvcnRfcHJpdl9zICpwcml2ID0gKHN0cnVjdCBwb3J0X3ByaXZfcyAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc3RyZWFtX3BvcnRfcyAqdGhpcyA9IHByaXYtPnBvcnQ7CisKKwlpZiAoIXRoaXMpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIGFtc3RyZWFtX2RvX2lvY3RsKHByaXYsIGNtZCwgYXJnKTsKK30KKworI2lmZGVmIENPTkZJR19DT01QQVQKK3N0cnVjdCBkZWNfc3lzaW5mbzMyIHsKKworCXUzMiBmb3JtYXQ7CisKKwl1MzIgd2lkdGg7CisKKwl1MzIgaGVpZ2h0OworCisJdTMyIHJhdGU7CisKKwl1MzIgZXh0cmE7CisKKwl1MzIgc3RhdHVzOworCisJdTMyIHJhdGlvOworCisJY29tcGF0X3VwdHJfdCBwYXJhbTsKKworCXU2NCByYXRpbzY0OworfTsKKworc3RydWN0IGFtX2lvY3RsX3Bhcm1fcHRyMzIgeworCXVuaW9uIHsKKwkJY29tcGF0X3VwdHJfdCBwZGF0YV9hdWRpb19pbmZvOworCQljb21wYXRfdXB0cl90IHBkYXRhX3N1Yl9pbmZvOworCQljb21wYXRfdXB0cl90IHBvaW50ZXI7CisJCWNoYXIgZGF0YVs4XTsKKwl9OworCXUzMiBjbWQ7CisJdTMyIGxlbjsKK307CisKK3N0YXRpYyBsb25nIGFtc3RyZWFtX2lvY19zZXRnZXRfcHRyKHN0cnVjdCBwb3J0X3ByaXZfcyAqcHJpdiwKKwkJdW5zaWduZWQgaW50IGNtZCwgc3RydWN0IGFtX2lvY3RsX3Bhcm1fcHRyMzIgX191c2VyICphcmcpCit7CisJc3RydWN0IGFtX2lvY3RsX3Bhcm1fcHRyIF9fdXNlciAqZGF0YTsKKwlzdHJ1Y3QgYW1faW9jdGxfcGFybV9wdHIzMiBwYXJhbTsKKwlpbnQgcmV0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZwYXJhbSwKKwkJKHZvaWQgX191c2VyICopYXJnLAorCQlzaXplb2Yoc3RydWN0IGFtX2lvY3RsX3Bhcm1fcHRyMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkYXRhID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpkYXRhKSk7CisJaWYgKCFhY2Nlc3Nfb2soZGF0YSwgc2l6ZW9mKCpkYXRhKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKHB1dF91c2VyKHBhcmFtLmNtZCwgJmRhdGEtPmNtZCkgfHwKKwkJcHV0X3VzZXIoY29tcGF0X3B0cihwYXJhbS5wb2ludGVyKSwgJmRhdGEtPnBvaW50ZXIpIHx8CisJCXB1dF91c2VyKHBhcmFtLmxlbiwgJmRhdGEtPmxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0ID0gYW1zdHJlYW1fZG9faW9jdGwocHJpdiwgY21kLCAodW5zaWduZWQgbG9uZylkYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgbG9uZyBhbXN0cmVhbV9zZXRfc3lzaW5mbyhzdHJ1Y3QgcG9ydF9wcml2X3MgKnByaXYsCisJCXN0cnVjdCBkZWNfc3lzaW5mbzMyIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBkZWNfc3lzaW5mbyBfX3VzZXIgKmRhdGE7CisJc3RydWN0IGRlY19zeXNpbmZvMzIgX191c2VyICpkYXRhMzIgPSBhcmc7CisJaW50IHJldDsKKwlzdHJ1Y3QgZGVjX3N5c2luZm8zMiBwYXJhbTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcGFyYW0sCisJCSh2b2lkIF9fdXNlciAqKWFyZywKKwkJc2l6ZW9mKHN0cnVjdCBkZWNfc3lzaW5mbzMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZGF0YSA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqZGF0YSkpOworCWlmICghYWNjZXNzX29rKGRhdGEsIHNpemVvZigqZGF0YSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoY29weV9pbl91c2VyKGRhdGEsIGRhdGEzMiwgNyAqIHNpemVvZih1MzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHB1dF91c2VyKGNvbXBhdF9wdHIocGFyYW0ucGFyYW0pLCAmZGF0YS0+cGFyYW0pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoY29weV9pbl91c2VyKCZkYXRhLT5yYXRpbzY0LCAmZGF0YTMyLT5yYXRpbzY0LAorCQkJCQlzaXplb2YoZGF0YS0+cmF0aW82NCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldCA9IGFtc3RyZWFtX2RvX2lvY3RsKHByaXYsIEFNU1RSRUFNX0lPQ19TWVNJTkZPLAorCQkJKHVuc2lnbmVkIGxvbmcpZGF0YSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoY29weV9pbl91c2VyKCZhcmctPmZvcm1hdCwgJmRhdGEtPmZvcm1hdCwgNyAqIHNpemVvZih1MzIpKSB8fAorCQkJY29weV9pbl91c2VyKCZhcmctPnJhdGlvNjQsICZkYXRhLT5yYXRpbzY0LAorCQkJCQlzaXplb2YoYXJnLT5yYXRpbzY0KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKKworc3RydWN0IHVzZXJkYXRhX3BhcmFtMzJfdCB7CisJdWludDMyX3QgdmVyc2lvbjsKKwl1aW50MzJfdCBpbnN0YW5jZV9pZDsgLyppbnB1dCwgMH45Ki8KKwl1aW50MzJfdCBidWZfbGVuOyAvKmlucHV0Ki8KKwl1aW50MzJfdCBkYXRhX3NpemU7IC8qb3V0cHV0Ki8KKwljb21wYXRfdXB0cl90IHBidWZfYWRkcjsgLyppbnB1dCovCisJc3RydWN0IHVzZXJkYXRhX21ldGFfaW5mb190IG1ldGFfaW5mbzsgLypvdXRwdXQqLworfTsKKworCitzdGF0aWMgbG9uZyBhbXN0cmVhbV9pb2NfZ2V0X3VzZXJkYXRhKHN0cnVjdCBwb3J0X3ByaXZfcyAqcHJpdiwKKwkJc3RydWN0IHVzZXJkYXRhX3BhcmFtMzJfdCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgdXNlcmRhdGFfcGFyYW1fdCBfX3VzZXIgKmRhdGE7CisJc3RydWN0IHVzZXJkYXRhX3BhcmFtMzJfdCBfX3VzZXIgKmRhdGEzMiA9IGFyZzsKKwlpbnQgcmV0OworCXN0cnVjdCB1c2VyZGF0YV9wYXJhbTMyX3QgcGFyYW07CisKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcGFyYW0sCisJCSh2b2lkIF9fdXNlciAqKWFyZywKKwkJc2l6ZW9mKHN0cnVjdCB1c2VyZGF0YV9wYXJhbTMyX3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkYXRhID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpkYXRhKSk7CisJaWYgKCFhY2Nlc3Nfb2soZGF0YSwgc2l6ZW9mKCpkYXRhKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGNvcHlfaW5fdXNlcihkYXRhLCBkYXRhMzIsIDQgKiBzaXplb2YodTMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGNvcHlfaW5fdXNlcigmZGF0YS0+bWV0YV9pbmZvLCAmZGF0YTMyLT5tZXRhX2luZm8sCisJCQkJCXNpemVvZihkYXRhLT5tZXRhX2luZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAocHV0X3VzZXIoY29tcGF0X3B0cihwYXJhbS5wYnVmX2FkZHIpLCAmZGF0YS0+cGJ1Zl9hZGRyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXQgPSBhbXN0cmVhbV9kb19pb2N0bChwcml2LCBBTVNUUkVBTV9JT0NfVURfQlVGX1JFQUQsCisJCSh1bnNpZ25lZCBsb25nKWRhdGEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGNvcHlfaW5fdXNlcigmZGF0YTMyLT52ZXJzaW9uLCAmZGF0YS0+dmVyc2lvbiwgNCAqIHNpemVvZih1MzIpKSB8fAorCQkJY29weV9pbl91c2VyKCZkYXRhMzItPm1ldGFfaW5mbywgJmRhdGEtPm1ldGFfaW5mbywKKwkJCQkJc2l6ZW9mKGRhdGEzMi0+bWV0YV9pbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGxvbmcgYW1zdHJlYW1fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAorCQl1bnNpZ25lZCBpbnQgY21kLCB1bG9uZyBhcmcpCit7CisJczMyIHIgPSAwOworCXN0cnVjdCBwb3J0X3ByaXZfcyAqcHJpdiA9IChzdHJ1Y3QgcG9ydF9wcml2X3MgKilmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQU1TVFJFQU1fSU9DX0dFVF9WRVJTSU9OOgorCWNhc2UgQU1TVFJFQU1fSU9DX0dFVDoKKwljYXNlIEFNU1RSRUFNX0lPQ19TRVQ6CisJY2FzZSBBTVNUUkVBTV9JT0NfR0VUX0VYOgorCWNhc2UgQU1TVFJFQU1fSU9DX1NFVF9FWDoKKwkJcmV0dXJuIGFtc3RyZWFtX2RvX2lvY3RsKHByaXYsIGNtZCwgKHVsb25nKWNvbXBhdF9wdHIoYXJnKSk7CisJY2FzZSBBTVNUUkVBTV9JT0NfR0VUX1BUUjoKKwljYXNlIEFNU1RSRUFNX0lPQ19TRVRfUFRSOgorCQlyZXR1cm4gYW1zdHJlYW1faW9jX3NldGdldF9wdHIocHJpdiwgY21kLCBjb21wYXRfcHRyKGFyZykpOworCWNhc2UgQU1TVFJFQU1fSU9DX1NZU0lORk86CisJCXJldHVybiBhbXN0cmVhbV9zZXRfc3lzaW5mbyhwcml2LCBjb21wYXRfcHRyKGFyZykpOworCWNhc2UgQU1TVFJFQU1fSU9DX1VEX0JVRl9SRUFEOgorCQlyZXR1cm4gYW1zdHJlYW1faW9jX2dldF91c2VyZGF0YShwcml2LCBjb21wYXRfcHRyKGFyZykpOworCWRlZmF1bHQ6CisJCXJldHVybiBhbXN0cmVhbV9kb19pb2N0bChwcml2LCBjbWQsICh1bG9uZyljb21wYXRfcHRyKGFyZykpOworCX0KKworCXJldHVybiByOworfQorI2VuZGlmCisKK3N0YXRpYyBzc2l6ZV90IHBvcnRzX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJCSAgY2hhciAqYnVmKQoreworCWludCBpOworCWNoYXIgKnBidWYgPSBidWY7CisJc3RydWN0IHN0cmVhbV9wb3J0X3MgKnAgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IGFtc3RyZWFtX3BvcnRfbnVtOyBpKyspIHsKKwkJcCA9ICZwb3J0c1tpXTsKKwkJLypuYW1lICovCisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJXNcdDpcbiIsIHAtPm5hbWUpOworCQkvKnR5cGUgKi8KKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJcdHR5cGU6JWQoICIsIHAtPnR5cGUpOworCQlpZiAocC0+dHlwZSAmIFBPUlRfVFlQRV9WSURFTykKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJXMgIiwgIlZpZGVvIik7CisJCWlmIChwLT50eXBlICYgUE9SVF9UWVBFX0FVRElPKQorCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlcyAiLCAiQXVkaW8iKTsKKwkJaWYgKHAtPnR5cGUgJiBQT1JUX1RZUEVfTVBUUykKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJXMgIiwgIlRTIik7CisJCWlmIChwLT50eXBlICYgUE9SVF9UWVBFX01QUFMpCisJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiVzICIsICJQUyIpOworCQlpZiAocC0+dHlwZSAmIFBPUlRfVFlQRV9FUykKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJXMgIiwgIkVTIik7CisJCWlmIChwLT50eXBlICYgUE9SVF9UWVBFX1JNKQorCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlcyAiLCAiUk0iKTsKKwkJaWYgKHAtPnR5cGUgJiBQT1JUX1RZUEVfU1VCKQorCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlcyAiLCAiU3VidGl0bGUiKTsKKwkJaWYgKHAtPnR5cGUgJiBQT1JUX1RZUEVfU1VCX1JEKQorCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlcyAiLCAiU3VidGl0bGVfUmVhZCIpOworCQlpZiAocC0+dHlwZSAmIFBPUlRfVFlQRV9VU0VSREFUQSkKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJXMgIiwgInVzZXJkYXRhIik7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiKVxuIik7CisJCS8qZmxhZyAqLworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIlx0ZmxhZzolZCggIiwgcC0+ZmxhZyk7CisJCWlmIChwLT5mbGFnICYgUE9SVF9GTEFHX0lOX1VTRSkKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJXMgIiwgIlVzZWQiKTsKKwkJZWxzZQorCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlcyAiLCAiVW51c2VkIik7CisJCWlmICgocC0+dHlwZSAmIFBPUlRfVFlQRV9WSURFTykgPT0gMCkgeworCQkJaWYgKHAtPmZsYWcgJiBQT1JUX0ZMQUdfSU5JVEVEKQorCQkJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJXMgIiwgImluaXRlZCIpOworCQkJZWxzZQorCQkJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJXMgIiwgInVuaW5pdGVkIik7CisJCX0KKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIpXG4iKTsKKwkJLypvdGhlcnMgKi8KKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJcdFZmb3JtYXQ6JWRcbiIsCisJCQkocC0+ZmxhZyAmIFBPUlRfRkxBR19WRk9STUFUKSA/IHAtPnZmb3JtYXQgOiAtMSk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiXHRBZm9ybWF0OiVkXG4iLAorCQkJKHAtPmZsYWcgJiBQT1JUX0ZMQUdfQUZPUk1BVCkgPyBwLT5hZm9ybWF0IDogLTEpOworCQlwYnVmICs9CXNwcmludGYocGJ1ZiwgIlx0VmlkOiVkXG4iLAorCQkJKHAtPmZsYWcgJiBQT1JUX0ZMQUdfVklEKSA/IHAtPnZpZCA6IC0xKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJcdEFpZDolZFxuIiwKKwkJCShwLT5mbGFnICYgUE9SVF9GTEFHX0FJRCkgPyBwLT5haWQgOiAtMSk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiXHRTaWQ6JWRcbiIsCisJCQkocC0+ZmxhZyAmIFBPUlRfRkxBR19TSUQpID8gcC0+c2lkIDogLTEpOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIlx0UENSaWQ6JWRcbiIsCisJCQkocC0+cGNyX2luaXRlZCA9PSAxKSA/IHAtPnBjcmlkIDogLTEpOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIlx0YWNoYW5uZWw6JWRcbiIsIHAtPmFjaGFubCk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiXHRhc2FtcHJhdGU6JWRcbiIsIHAtPmFzYW1wcmF0ZSk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiXHRhZGF0YXdpZHRoOiVkXG5cbiIsIHAtPmFkYXRhd2lkdGgpOworCX0KKwlyZXR1cm4gcGJ1ZiAtIGJ1ZjsKK30KKworc3RhdGljIGludCBzaG93X3ZidWZfc3RhdHVzX2NiKHN0cnVjdCBzdHJlYW1fYnVmX3MgKnAsIGNoYXIgKmJ1ZikKK3sKKwljaGFyICpwYnVmID0gYnVmOworCisJaWYgKCFwLT5idWZfc3RhcnQpCisJCXJldHVybiAwOworCS8qdHlwZSAqLworCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiVmlkZW8tJWQgYnVmZmVyOiIsIHAtPmlkKTsKKwkvKmZsYWcgKi8KKwlwYnVmICs9IHNwcmludGYocGJ1ZiwgIlx0ZmxhZzolZCggIiwgcC0+ZmxhZyk7CisJaWYgKHAtPmZsYWcgJiBCVUZfRkxBR19BTExPQykKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlcyAiLCAiQWxsb2MiKTsKKwllbHNlCisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJXMgIiwgIlVuYWxsb2MiKTsKKwlpZiAocC0+ZmxhZyAmIEJVRl9GTEFHX0lOX1VTRSkKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlcyAiLCAiVXNlZCIpOworCWVsc2UKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlcyAiLCAiTm91c2VkIik7CisJaWYgKHAtPmZsYWcgJiBCVUZfRkxBR19QQVJTRVIpCisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJXMgIiwgIlBhcnNlciIpOworCWVsc2UKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlcyAiLCAibm9QYXJzZXIiKTsKKwlpZiAocC0+ZmxhZyAmIEJVRl9GTEFHX0ZJUlNUX1RTVEFNUCkKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlcyAiLCAiZmlyc3RzdGFtcCIpOworCWVsc2UKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlcyAiLCAibm9maXJzdHN0YW1wIik7CisJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIpXG4iKTsKKworCS8qYnVmIHN0YXRzICovCisJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJcdGJ1ZiBhZGRyOiVwXG4iLCAodm9pZCAqKXAtPmJ1Zl9zdGFydCk7CisJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJcdGJ1ZiBzaXplOiUjeFxuIiwgcC0+YnVmX3NpemUpOworCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiXHRidWYgY2FudXNlc2l6ZTolI3hcbiIsIHAtPmNhbnVzZWJ1Zl9zaXplKTsKKwlwYnVmICs9IHNwcmludGYocGJ1ZiwgIlx0YnVmIHJlZ2Jhc2U6JSNseFxuIiwgcC0+cmVnX2Jhc2UpOworCisJaWYgKHAtPnJlZ19iYXNlICYmIHAtPmZsYWcgJiBCVUZfRkxBR19JTl9VU0UpIHsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJcdGJ1ZiBsZXZlbDolI3hcbiIsCisJCQkJc3RidWZfbGV2ZWwocCkpOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIlx0YnVmIHNwYWNlOiUjeFxuIiwKKwkJCQlzdGJ1Zl9zcGFjZShwKSk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiXHRidWYgcmVhZCBwb2ludGVyOiUjeFxuIiwKKwkJCQlzdGJ1Zl9ycChwKSk7CisJfSBlbHNlCisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiXHRidWYgbm8gdXNlZC5cbiIpOworCisJcmV0dXJuIHBidWYgLSBidWY7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGJ1ZnNfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLCBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQkJCQkJIGNoYXIgKmJ1ZikKK3sKKwlpbnQgaTsKKwljaGFyICpwYnVmID0gYnVmOworCXN0cnVjdCBzdHJlYW1fYnVmX3MgKnAgPSBOVUxMOworCWNoYXIgYnVmX3R5cGVbXVsxMl0gPSB7ICJWaWRlbyIsICJBdWRpbyIsICJTdWJ0aXRsZSIsCisJCQkJIlVzZXJEYXRhIiwgIkhFVkMiIH07CisKKwlmb3IgKGkgPSAwOyBpIDwgYW1zdHJlYW1fYnVmX251bTsgaSsrKSB7CisJCXAgPSAmYnVmc1tpXTsKKworCQlpZiAoIXAtPmJ1Zl9zdGFydCkKKwkJCWNvbnRpbnVlOworCisJCS8qdHlwZSAqLworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiVzIGJ1ZmZlcjoiLCBidWZfdHlwZVtwLT50eXBlXSk7CisJCS8qZmxhZyAqLworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIlx0ZmxhZzolZCggIiwgcC0+ZmxhZyk7CisJCWlmIChwLT5mbGFnICYgQlVGX0ZMQUdfQUxMT0MpCisJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiVzICIsICJBbGxvYyIpOworCQllbHNlCisJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiVzICIsICJVbmFsbG9jIik7CisJCWlmIChwLT5mbGFnICYgQlVGX0ZMQUdfSU5fVVNFKQorCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlcyAiLCAiVXNlZCIpOworCQllbHNlCisJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiVzICIsICJOb3VzZWQiKTsKKwkJaWYgKHAtPmZsYWcgJiBCVUZfRkxBR19QQVJTRVIpCisJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiVzICIsICJQYXJzZXIiKTsKKwkJZWxzZQorCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlcyAiLCAibm9QYXJzZXIiKTsKKwkJaWYgKHAtPmZsYWcgJiBCVUZfRkxBR19GSVJTVF9UU1RBTVApCisJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiVzICIsICJmaXJzdHN0YW1wIik7CisJCWVsc2UKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJXMgIiwgIm5vZmlyc3RzdGFtcCIpOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIilcbiIpOworCQkvKmJ1ZiBzdGF0cyAqLworCisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiXHRidWYgYWRkcjolcFxuIiwgKHZvaWQgKilwLT5idWZfc3RhcnQpOworCisJCWlmIChwLT50eXBlICE9IEJVRl9UWVBFX1NVQlRJVExFKSB7CisJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIlx0YnVmIHNpemU6JSN4XG4iLCBwLT5idWZfc2l6ZSk7CisJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwKKwkJCQkiXHRidWYgY2FudXNlc2l6ZTolI3hcbiIsCisJCQkJcC0+Y2FudXNlYnVmX3NpemUpOworCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsCisJCQkJIlx0YnVmIHJlZ2Jhc2U6JSNseFxuIiwgcC0+cmVnX2Jhc2UpOworCisJCQlpZiAocC0+cmVnX2Jhc2UgJiYgcC0+ZmxhZyAmIEJVRl9GTEFHX0lOX1VTRSkgeworCQkJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX002KSB7CisJCQkJCS8qIFRPRE86IG1vZCBnYXRlICovCisJCQkJCS8qIHN3aXRjaF9tb2RfZ2F0ZV9ieV9uYW1lKCJ2ZGVjIiwgMSk7Ki8KKwkJCQkJYW1wb3J0c19zd2l0Y2hfZ2F0ZSgidmRlYyIsIDEpOworCQkJCX0KKwkJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIlx0YnVmIGxldmVsOiUjeFxuIiwKKwkJCQkJCXN0YnVmX2xldmVsKHApKTsKKwkJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIlx0YnVmIHNwYWNlOiUjeFxuIiwKKwkJCQkJCXN0YnVmX3NwYWNlKHApKTsKKwkJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwKKwkJCQkJCSJcdGJ1ZiByZWFkIHBvaW50ZXI6JSN4XG4iLAorCQkJCQkJc3RidWZfcnAocCkpOworCQkJCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPj0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX002KSB7CisJCQkJCS8qIFRPRE86IG1vZCBnYXRlICovCisJCQkJCS8qIHN3aXRjaF9tb2RfZ2F0ZV9ieV9uYW1lKCJ2ZGVjIiwgMCk7Ki8KKwkJCQkJYW1wb3J0c19zd2l0Y2hfZ2F0ZSgidmRlYyIsIDApOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiXHRidWYgbm8gdXNlZC5cbiIpOworCisJCQlpZiAocC0+dHlwZSA9PSBCVUZfVFlQRV9VU0VSREFUQSkgeworCQkJCXBidWYgKz0gc3ByaW50ZihwYnVmLAorCQkJCQkiXHRidWYgd3JpdGUgcG9pbnRlcjolI3hcbiIsCisJCQkJCXAtPmJ1Zl93cCk7CisJCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsCisJCQkJCSJcdGJ1ZiByZWFkIHBvaW50ZXI6JSN4XG4iLAorCQkJCQlwLT5idWZfcnApOworCQkJfQorCQl9IGVsc2UgeworCQkJdTMyIHN1Yl93cCwgc3ViX3JwLCBkYXRhX3NpemU7CisKKwkJCXN1Yl93cCA9IHN0YnVmX3N1Yl93cF9nZXQoKTsKKwkJCXN1Yl9ycCA9IHN0YnVmX3N1Yl9ycF9nZXQoKTsKKwkJCWlmIChzdWJfd3AgPj0gc3ViX3JwKQorCQkJCWRhdGFfc2l6ZSA9IHN1Yl93cCAtIHN1Yl9ycDsKKwkJCWVsc2UKKwkJCQlkYXRhX3NpemUgPSBwLT5idWZfc2l6ZSAtIHN1Yl9ycCArIHN1Yl93cDsKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiXHRidWYgc2l6ZTolI3hcbiIsIHAtPmJ1Zl9zaXplKTsKKwkJCXBidWYgKz0KKwkJCQlzcHJpbnRmKHBidWYsICJcdGJ1ZiBjYW51c2VzaXplOiUjeFxuIiwKKwkJCQkJCXAtPmNhbnVzZWJ1Zl9zaXplKTsKKwkJCXBidWYgKz0KKwkJCQlzcHJpbnRmKHBidWYsICJcdGJ1ZiBzdGFydDolI3hcbiIsCisJCQkJCQlzdGJ1Zl9zdWJfc3RhcnRfZ2V0KCkpOworCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsCisJCQkJCSJcdGJ1ZiB3cml0ZSBwb2ludGVyOiUjeFxuIiwgc3ViX3dwKTsKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLAorCQkJCQkiXHRidWYgcmVhZCBwb2ludGVyOiUjeFxuIiwgc3ViX3JwKTsKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiXHRidWYgbGV2ZWw6JSN4XG4iLCBkYXRhX3NpemUpOworCQl9CisKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJcdGJ1ZiBmaXJzdF9zdGFtcDolI3hcbiIsCisJCQkJcC0+Zmlyc3RfdHN0YW1wKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJcdGJ1ZiB3Y250OiUjeFxuXG4iLCBwLT53Y250KTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICJcdGJ1ZiBtYXhfYnVmZmVyX2RlbGF5X21zOiVkbXNcbiIsCisJCQkJcC0+bWF4X2J1ZmZlcl9kZWxheV9tcyk7CisKKwkJaWYgKHAtPnJlZ19iYXNlICYmIHAtPmZsYWcgJiBCVUZfRkxBR19JTl9VU0UpIHsKKwkJCWludCBjYWxjX2RlbGF5bXMgPSAwOworCQkJdTMyIGJpdHJhdGUgPSAwLCBhdmdfYml0cmF0ZSA9IDA7CisKKwkJCWNhbGNfZGVsYXltcyA9IGNhbGN1bGF0aW9uX3N0cmVhbV9kZWxheWVkX21zKAorCQkJCShwLT50eXBlID09IEJVRl9UWVBFX0FVRElPKSA/IFBUU19UWVBFX0FVRElPIDoKKwkJCQlQVFNfVFlQRV9WSURFTywKKwkJCQkmYml0cmF0ZSwKKwkJCQkmYXZnX2JpdHJhdGUpOworCisJCQlpZiAoY2FsY19kZWxheW1zID49IDApIHsKKwkJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwKKwkJCQkJIlx0YnVmIGN1cnJlbnQgZGVsYXk6JWRtc1xuIiwKKwkJCQkJY2FsY19kZWxheW1zKTsKKwkJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwKKwkJCQkiXHRidWYgYml0cmF0ZSBsYXRlc3Q6JWRicHMsYXZnOiVkYnBzXG4iLAorCQkJCWJpdHJhdGUsIGF2Z19iaXRyYXRlKTsKKwkJCQlwYnVmICs9IHNwcmludGYocGJ1ZiwKKwkJCQkiXHRidWYgdGltZSBhZnRlciBsYXN0IHB0czolZCBtc1xuIiwKKwkJCQljYWxjdWxhdGlvbl9zdHJlYW1fZXh0X2RlbGF5ZWRfbXMKKwkJCQkoKHAtPnR5cGUgPT0gQlVGX1RZUEVfQVVESU8pID8gUFRTX1RZUEVfQVVESU8gOgorCQkJCSBQVFNfVFlQRV9WSURFTykpOworCisJCQkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsCisJCQkJIlx0YnVmIHRpbWUgYWZ0ZXIgbGFzdCB3cml0ZSBkYXRhIDolZCBtc1xuIiwKKwkJCQkoaW50KShqaWZmaWVzXzY0IC0KKwkJCQlwLT5sYXN0X3dyaXRlX2ppZmZpZXM2NCkgKiAxMDAwIC8gSFopOworCQkJfQorCQl9CisJCWlmIChwLT53cml0ZV90aHJlYWQpIHsKKwkJCXBidWYgKz0gc3ByaW50ZihwYnVmLAorCQkJCQkiXHR3cml0ZSB0aHJlYWQ6JWQvJWQsZmlmbyAlZDolZCxwYXNzZWQ6JWRcbiIsCisJCQkJCQl0aHJlYWRyd19idWZmZXJfbGV2ZWwocCksCisJCQkJCQl0aHJlYWRyd19idWZmZXJfc2l6ZShwKSwKKwkJCQkJCXRocmVhZHJ3X2RhdGFmaWZvX2xlbihwKSwKKwkJCQkJCXRocmVhZHJ3X2ZyZWVmaWZvX2xlbihwKSwKKwkJCQkJCXRocmVhZHJ3X3Bhc3NlZF9sZW4ocCkKKwkJCQkJKTsKKwkJfQorCX0KKworCXBidWYgKz0gc2hvd19zdHJlYW1fYnVmZmVyX3N0YXR1cyhwYnVmLCBzaG93X3ZidWZfc3RhdHVzX2NiKTsKKworCXJldHVybiBwYnVmIC0gYnVmOworfQorCitzdGF0aWMgc3NpemVfdCB2aWRlb2J1ZnVzZWRfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWNoYXIgKnBidWYgPSBidWY7CisJc3RydWN0IHN0cmVhbV9idWZfcyAqcCA9IE5VTEw7CisKKwlwID0gJmJ1ZnNbMF07CisKKwlpZiAocC0+ZmxhZyAmIEJVRl9GTEFHX0lOX1VTRSkKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIlZCAiLCAxKTsKKwllbHNlCisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiJWQgIiwgMCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHZjb2RlY19wcm9maWxlX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKKwkJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gdmNvZGVjX3Byb2ZpbGVfcmVhZChidWYpOworfQorCitzdGF0aWMgc3NpemVfdCB2Y29kZWNfZmVhdHVyZV9zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCQlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHZjb2RlY19mZWF0dXJlX3JlYWQoYnVmKTsKK30KKworc3RhdGljIGludCByZXNldF9jYW51c2VfYnVmZXJsZXZlbChpbnQgbGV2ZWx4MTAwMDApCit7CisJaW50IGk7CisJc3RydWN0IHN0cmVhbV9idWZfcyAqcCA9IE5VTEw7CisKKwlpZiAobGV2ZWx4MTAwMDAgPj0gMCAmJiBsZXZlbHgxMDAwMCA8PSAxMDAwMCkKKwkJdXNlX2J1ZmZlcmxldmVseDEwMDAwID0gbGV2ZWx4MTAwMDA7CisJZWxzZQorCQl1c2VfYnVmZmVybGV2ZWx4MTAwMDAgPSAxMDAwMDsKKwlmb3IgKGkgPSAwOyBpIDwgYW1zdHJlYW1fYnVmX251bTsgaSsrKSB7CisJCXAgPSAmYnVmc1tpXTsKKwkJcC0+Y2FudXNlYnVmX3NpemUgPSAoKHAtPmJ1Zl9zaXplIC8gMTAyNCkgKgorCQkJdXNlX2J1ZmZlcmxldmVseDEwMDAwIC8gMTAwMDApICogMTAyNDsKKwkJcC0+Y2FudXNlYnVmX3NpemUgKz0gMTAyMzsKKwkJcC0+Y2FudXNlYnVmX3NpemUgJj0gfjEwMjM7CisJCWlmIChwLT5jYW51c2VidWZfc2l6ZSA+IHAtPmJ1Zl9zaXplKQorCQkJcC0+Y2FudXNlYnVmX3NpemUgPSBwLT5idWZfc2l6ZTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNhbnVzZV9idWZlcmxldmVsX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKKwkJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzc2l6ZV90IHNpemUgPSBzcHJpbnRmKGJ1ZiwKKwkJInVzZV9idWZmZXJsZXZlbD0lZC8xMDAwMFs9KHNldCByYW5nZVsgMH4xMDAwMF0pPVxuIiwKKwkJCXVzZV9idWZmZXJsZXZlbHgxMDAwMCk7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNhbnVzZV9idWZlcmxldmVsX3N0b3JlKHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCQlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCXNzaXplX3QgcmV0OworCisJLypyZXQgPSBzc2NhbmYoYnVmLCAiJWQiLCAmdmFsKTsqLworCXJldCA9IGtzdHJ0b2ludChidWYsIDAsICZ2YWwpOworCisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkodm9pZCl2YWw7CisJcmVzZXRfY2FudXNlX2J1ZmVybGV2ZWwodmFsKTsKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3QgbWF4X2J1ZmZlcl9kZWxheV9tc19zdG9yZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJc3NpemVfdCByZXQ7CisJaW50IGk7CisKKwkvKnJldCA9IHNzY2FuZihidWYsICIlZCIsICZ2YWwpOyovCisJcmV0ID0ga3N0cnRvaW50KGJ1ZiwgMCwgJnZhbCk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlmb3IgKGkgPSAwOyBpIDwgYW1zdHJlYW1fYnVmX251bTsgaSsrKQorCQlidWZzW2ldLm1heF9idWZmZXJfZGVsYXlfbXMgPSB2YWw7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1heF9idWZmZXJfZGVsYXlfbXNfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3NpemVfdCBzaXplID0gMDsKKworCXNpemUgKz0gc3ByaW50ZihidWYsICIlZG1zIHZpZGVvIG1heCBidWZmZXJlZCBkYXRhIGRlbGF5IG1zXG4iLAorCQlidWZzWzBdLm1heF9idWZmZXJfZGVsYXlfbXMpOworCXNpemUgKz0gc3ByaW50ZihidWYsICIlZG1zIGF1ZGlvIG1heCBidWZmZXJlZCBkYXRhIGRlbGF5IG1zXG4iLAorCQlidWZzWzFdLm1heF9idWZmZXJfZGVsYXlfbXMpOworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCByZXNldF9hdWRpb19wb3J0X3N0b3JlKHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwljb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXVuc2lnbmVkIGludCB2YWwgPSAwOworCWludCBpOworCXNzaXplX3QgcmV0OworCXN0cnVjdCBzdHJlYW1fYnVmX3MgKnBhYnVmID0gJmJ1ZnNbQlVGX1RZUEVfQVVESU9dOworCXN0cnVjdCBzdHJlYW1fcG9ydF9zICp0aGlzOworCisJcmV0ID0ga3N0cnRvaW50KGJ1ZiwgMCwgJnZhbCk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodmFsICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCW11dGV4X2xvY2soJmFtc3RyZWFtX211dGV4KTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0FNU1RSRUFNX1BPUlRfTlVNOyBpKyspIHsKKwkJaWYgKHN0cmNtcChwb3J0c1tpXS5uYW1lLCAiYW1zdHJlYW1fbXB0cyIpID09IDAgfHwKKwkJCXN0cmNtcChwb3J0c1tpXS5uYW1lLCAiYW1zdHJlYW1fbXB0c19zY2hlZCIpID09IDApIHsKKwkJCXRoaXMgPSAmcG9ydHNbaV07CisJCQlpZiAoKHRoaXMtPmZsYWcgJiBQT1JUX0ZMQUdfQUZPUk1BVCkgIT0gMCkgeworCQkJCXByX2luZm8oImF1ZGlvX3BvcnRfcmVzZXQgJXNcbiIsIHBvcnRzW2ldLm5hbWUpOworCQkJCWF1ZGlvX3BvcnRfcmVzZXQodGhpcywgcGFidWYpOworCQkJfQorCQl9CisJfQorCW11dGV4X3VubG9jaygmYW1zdHJlYW1fbXV0ZXgpOworCXJldHVybiBzaXplOworfQorCitzc2l6ZV90IGR1bXBfc3RyZWFtX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKKwkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWNoYXIgKnBfYnVmID0gYnVmOworCisJcF9idWYgKz0gc3ByaW50ZihwX2J1ZiwgIlxubWRraXIgLXAgL2RhdGEvdG1wIC1tIDc3NztzZXRlbmZvcmNlIDA7XG5cbiIpOworCXBfYnVmICs9IHNwcmludGYocF9idWYsICJ2aWRlbzpcblx0IGVjaG8gMCA+IC9zeXMvY2xhc3MvYW1zdHJlYW0vZHVtcF9zdHJlYW07XG4iKTsKKwlwX2J1ZiArPSBzcHJpbnRmKHBfYnVmLCAiaGV2YyA6XG5cdCBlY2hvIDQgPiAvc3lzL2NsYXNzL2Ftc3RyZWFtL2R1bXBfc3RyZWFtO1xuIik7CisKKwlyZXR1cm4gcF9idWYgLSBidWY7Cit9CisKKyNkZWZpbmUgRFVNUF9TVFJFQU1fRklMRSAgICIvZGF0YS90bXAvZHVtcF9zdHJlYW0uaDI2NCIKK3NzaXplX3QgZHVtcF9zdHJlYW1fc3RvcmUoc3RydWN0IGNsYXNzICpjbGFzcywKKwkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpwX2J1ZjsKKwlpbnQgcmV0ID0gMCwgaWQgPSAwOworCXVuc2lnbmVkIGludCBzdHJpZGUsIHJlbWFpbiwgbGV2ZWwsIHZtYXBfc2l6ZTsKKwlpbnQgd3JpdGVfc2l6ZTsKKwl2b2lkICpzdGJ1Zl92YWRkcjsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlzdHJ1Y3QgZmlsZSAqZnA7CisJbW1fc2VnbWVudF90IG9sZF9mczsKKwlsb2ZmX3QgZnBvczsKKworCXJldCA9IHNzY2FuZihidWYsICIlZCIsICZpZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfaW5mbygicGFzZXIgYnVmIGlkIGZhaWwsIGRlZmF1bHQgaWQgPSAwXG4iKTsKKwkJaWQgPSAwOworCX0KKwlpZiAoaWQgIT0gQlVGX1RZUEVfVklERU8gJiYgaWQgIT0gQlVGX1RZUEVfSEVWQykgeworCQlwcl9pbmZvKCJidWYgaWQgb3V0IG9mIHJhbmdlLCBtYXggJWQsIGlkICVkLCBzZXQgZGVmYXVsdCBpZCAwXG4iLCBCVUZfTUFYX05VTSAtIDEsIGlkKTsKKwkJaWQgPSAwOworCX0KKwlwX2J1ZiA9IGdldF9zdHJlYW1fYnVmZmVyKGlkKTsKKwlpZiAoIXBfYnVmKSB7CisJCXByX2luZm8oImdldCBidWYgZmFpbCwgaWQgJWRcbiIsIGlkKTsKKwkJcmV0dXJuIHNpemU7CisJfQorCWlmICgoIXBfYnVmLT5idWZfc2l6ZSkgfHwgKHBfYnVmLT5pc19zZWN1cmUpIHx8ICghKHBfYnVmLT5mbGFnICYgQlVGX0ZMQUdfSU5fVVNFKSkpIHsKKwkJcHJfaW5mbygiYnVmIHNpemUgJWQsIGlzX3NlY3VyZSAlZCwgaW5fdXNlICVkLCBpdCBjYW4gbm90IGR1bXBcbiIsCisJCQlwX2J1Zi0+YnVmX3NpemUsIHBfYnVmLT5pc19zZWN1cmUsIChwX2J1Zi0+ZmxhZyAmIEJVRl9GTEFHX0lOX1VTRSkpOworCQlyZXR1cm4gc2l6ZTsKKwl9CisKKwlsZXZlbCA9IHN0YnVmX2xldmVsKHBfYnVmKTsKKwlpZiAoIWxldmVsIHx8IGxldmVsID4gcF9idWYtPmJ1Zl9zaXplKSB7CisJCXByX2luZm8oInN0cmVhbSBidWYgbGV2ZWwgJWQsIGJ1ZiBzaXplICVkLCBlcnJvciByZXR1cm5cbiIsIGxldmVsLCBwX2J1Zi0+YnVmX3NpemUpOworCQlyZXR1cm4gc2l6ZTsKKwl9CisKKwlmcCA9IGZpbHBfb3BlbihEVU1QX1NUUkVBTV9GSUxFLCBPX0NSRUFUIHwgT19SRFdSLCAwNjY2KTsKKwlpZiAoSVNfRVJSKGZwKSkgeworCQlmcCA9IE5VTEw7CisJCXByX2luZm8oImNyZWF0ZSBkdW1wIHN0cmVhbSBmaWxlIGZhaWxlZFxuIik7CisJCXJldHVybiBzaXplOworCX0KKworCW9mZnNldCA9IHBfYnVmLT5idWZfc3RhcnQ7CisJcmVtYWluID0gbGV2ZWw7CisJc3RyaWRlID0gU1pfMU07CisJdm1hcF9zaXplID0gMDsKKwlmcG9zID0gMDsKKwlwcl9pbmZvKCJjcmVhdGUgZmlsZSBzdWNjZXNzLCBpdCB3aWxsIGR1bXAgZnJvbSBhZGRyIDB4JWx4LCBzaXplIDB4JXhcbiIsIG9mZnNldCwgcmVtYWluKTsKKwl3aGlsZSAocmVtYWluID4gMCkgeworCQlpZiAocmVtYWluID4gc3RyaWRlKQorCQkJdm1hcF9zaXplID0gc3RyaWRlOworCQllbHNlIHsKKwkJCXN0cmlkZSA9IHJlbWFpbjsKKwkJCXZtYXBfc2l6ZSA9IHN0cmlkZTsKKwkJfQorCisJCXN0YnVmX3ZhZGRyID0gY29kZWNfbW1fdm1hcChvZmZzZXQsIHZtYXBfc2l6ZSk7CisJCWlmIChzdGJ1Zl92YWRkciA9PSBOVUxMKSB7CisJCQlzdHJpZGUgPj49IDE7CisJCQlwcl9pbmZvKCJ2bWFwIGZhaWwgY2hhbmdlIHZtYXAgc3RpZGUgc2l6ZSAweCV4XG4iLCBzdHJpZGUpOworCQkJY29udGludWU7CisJCX0KKwkJY29kZWNfbW1fZG1hX2ZsdXNoKHN0YnVmX3ZhZGRyLCB2bWFwX3NpemUsIERNQV9GUk9NX0RFVklDRSk7CisKKwkJb2xkX2ZzID0gZ2V0X2ZzKCk7CisJCXNldF9mcyhLRVJORUxfRFMpOworCQl3cml0ZV9zaXplID0gdmZzX3dyaXRlKGZwLCBzdGJ1Zl92YWRkciwgdm1hcF9zaXplLCAmZnBvcyk7CisJCWlmICh3cml0ZV9zaXplIDwgdm1hcF9zaXplKSB7CisJCQl3cml0ZV9zaXplICs9IHZmc193cml0ZShmcCwgc3RidWZfdmFkZHIgKyB3cml0ZV9zaXplLCB2bWFwX3NpemUgLSB3cml0ZV9zaXplLCAmZnBvcyk7CisJCQlwcl9pbmZvKCJmYWlsIHdyaXRlIHJldHJ5LCB0b3RhbCAlZCwgd3JpdGUgJWRcbiIsIHZtYXBfc2l6ZSwgd3JpdGVfc2l6ZSk7CisJCQlpZiAod3JpdGVfc2l6ZSA8IHZtYXBfc2l6ZSkgeworCQkJCXByX2luZm8oInJldHJ5IGZhaWwsIGludGVycnVwdCBkdW1wIHN0cmVhbSwgYnJlYWtcbiIpOworCQkJCXNldF9mcyhvbGRfZnMpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXNldF9mcyhvbGRfZnMpOworCQl2ZnNfZnN5bmMoZnAsIDApOworCQlwcl9pbmZvKCJ2bWFwX3NpemUgMHgleCBkdW1wIHNpemUgMHgleFxuIiwgdm1hcF9zaXplLCB3cml0ZV9zaXplKTsKKworCQlvZmZzZXQgKz0gdm1hcF9zaXplOworCQlyZW1haW4gLT0gdm1hcF9zaXplOworCQljb2RlY19tbV91bm1hcF9waHlhZGRyKHN0YnVmX3ZhZGRyKTsKKwl9CisKKwlmaWxwX2Nsb3NlKGZwLCBjdXJyZW50LT5maWxlcyk7CisJcHJfaW5mbygiZHVtcCBzdHJlYW0gYnVmIGVuZFxuIik7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIENMQVNTX0FUVFJfUk8ocG9ydHMpOworc3RhdGljIENMQVNTX0FUVFJfUk8oYnVmcyk7CitzdGF0aWMgQ0xBU1NfQVRUUl9STyh2Y29kZWNfcHJvZmlsZSk7CitzdGF0aWMgQ0xBU1NfQVRUUl9STyh2Y29kZWNfZmVhdHVyZSk7CitzdGF0aWMgQ0xBU1NfQVRUUl9STyh2aWRlb2J1ZnVzZWQpOworc3RhdGljIENMQVNTX0FUVFJfUlcoY2FudXNlX2J1ZmVybGV2ZWwpOworc3RhdGljIENMQVNTX0FUVFJfUlcobWF4X2J1ZmZlcl9kZWxheV9tcyk7CitzdGF0aWMgQ0xBU1NfQVRUUl9XTyhyZXNldF9hdWRpb19wb3J0KTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFtc3RyZWFtX2NsYXNzX2F0dHJzW10gPSB7CisJJmNsYXNzX2F0dHJfcG9ydHMuYXR0ciwKKwkmY2xhc3NfYXR0cl9idWZzLmF0dHIsCisJJmNsYXNzX2F0dHJfdmNvZGVjX3Byb2ZpbGUuYXR0ciwKKwkmY2xhc3NfYXR0cl92Y29kZWNfZmVhdHVyZS5hdHRyLAorCSZjbGFzc19hdHRyX3ZpZGVvYnVmdXNlZC5hdHRyLAorCSZjbGFzc19hdHRyX2NhbnVzZV9idWZlcmxldmVsLmF0dHIsCisJJmNsYXNzX2F0dHJfbWF4X2J1ZmZlcl9kZWxheV9tcy5hdHRyLAorCSZjbGFzc19hdHRyX3Jlc2V0X2F1ZGlvX3BvcnQuYXR0ciwKKwlOVUxMCit9OworCitBVFRSSUJVVEVfR1JPVVBTKGFtc3RyZWFtX2NsYXNzKTsKKworc3RhdGljIHN0cnVjdCBjbGFzcyBhbXN0cmVhbV9jbGFzcyA9IHsKKwkubmFtZSA9ICJhbXN0cmVhbSIsCisJLmNsYXNzX2dyb3VwcyA9IGFtc3RyZWFtX2NsYXNzX2dyb3VwcywKK307CisKK2ludCBhbXN0cmVhbV9yZXF1ZXN0X2Zpcm13YXJlX2Zyb21fc3lzKGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwKKwkJY2hhciAqYnVmLCBpbnQgc2l6ZSkKK3sKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZpcm13YXJlOworCWludCBlcnIgPSAwOworCXN0cnVjdCBkZXZpY2UgKm1pY3JvX2RldjsKKworCXByX2luZm8oInRyeSBsb2FkICVzICAuLi4iLCBmaWxlX25hbWUpOworCW1pY3JvX2RldiA9IGRldmljZV9jcmVhdGUoJmFtc3RyZWFtX2NsYXNzLAorCQkJTlVMTCwgTUtERVYoQU1TVFJFQU1fTUFKT1IsIDEwMCksCisJCQlOVUxMLCAidmlkZW9kZWMiKTsKKwlpZiAobWljcm9fZGV2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCJkZXZpY2VfY3JlYXRlIGZhaWxlZCA9JWRcbiIsIGVycik7CisJCXJldHVybiAtMTsKKwl9CisJZXJyID0gcmVxdWVzdF9maXJtd2FyZSgmZmlybXdhcmUsIGZpbGVfbmFtZSwgbWljcm9fZGV2KTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcl9lcnIoImNhbid0IGxvYWQgdGhlICVzLGVycj0lZFxuIiwgZmlsZV9uYW1lLCBlcnIpOworCQlnb3RvIGVycm9yMTsKKwl9CisJaWYgKGZpcm13YXJlLT5zaXplID4gc2l6ZSkgeworCQlwcl9lcnIoIm5vdCBlbm91Z2ggbWVtb3J5IHNpemUgZm9yIGF1ZGlvZHNwIGNvZGVcbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIHJlbGVhc2U7CisJfQorCisJbWVtY3B5KGJ1ZiwgKGNoYXIgKilmaXJtd2FyZS0+ZGF0YSwgZmlybXdhcmUtPnNpemUpOworCS8qbWIoKTsgZG9uJ3QgbmVlZCBpdCovCisJcHJfZXJyKCJsb2FkIG1jb2RlIHNpemU9JXpkXG4gbWNvZGUgbmFtZSAlc1xuIiwgZmlybXdhcmUtPnNpemUsCisJCSAgIGZpbGVfbmFtZSk7CisJZXJyID0gZmlybXdhcmUtPnNpemU7CityZWxlYXNlOgorCXJlbGVhc2VfZmlybXdhcmUoZmlybXdhcmUpOworZXJyb3IxOgorCWRldmljZV9kZXN0cm95KCZhbXN0cmVhbV9jbGFzcywgTUtERVYoQU1TVFJFQU1fTUFKT1IsIDEwMCkpOworCXJldHVybiBlcnI7Cit9CisKK2ludCB2aWRlb2J1ZnVzZWRfc2hvd19mdW4oY29uc3QgY2hhciAqdHJpZ2dlciwgaW50IGlkLCBjaGFyICpzYnVmLCBpbnQgc2l6ZSkKK3sKKwlpbnQgcmV0ID0gLTE7CisJdm9pZCAqYnVmLCAqZ2V0YnVmID0gTlVMTDsKKwlpZiAoc2l6ZSA8IFBBR0VfU0laRSkgeworCQlnZXRidWYgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwkJaWYgKCFnZXRidWYpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJYnVmID0gZ2V0YnVmOworCX0gZWxzZSB7CisJCWJ1ZiA9IHNidWY7CisJfQorCisJc3dpdGNoIChpZCkgeworCWNhc2UgMDoKKwkJcmV0ID0gdmlkZW9idWZ1c2VkX3Nob3coTlVMTCwgTlVMTCAsIGJ1Zik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC0xOworCX0KKwlpZiAocmV0ID4gMCAmJiBnZXRidWYgIT0gTlVMTCkgeworCQlyZXQgPSBtaW5fdChpbnQsIHJldCwgc2l6ZSk7CisJCXN0cm5jcHkoc2J1ZiwgYnVmLCByZXQpOworCX0KKwlpZiAoZ2V0YnVmICE9IE5VTEwpCisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylnZXRidWYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWNvbmZpZyBhbXBvcnRzX2NvbmZpZ3NbXSA9IHsKKwlNQ19QSTMyKCJkZWZfNGtfdnN0cmVhbWJ1Zl9zaXplTSIsICZkZWZfNGtfdnN0cmVhbWJ1Zl9zaXplTSksCisJTUNfUEkzMigiZGVmX3ZzdHJlYW1idWZfc2l6ZU0iLCAmZGVmX3ZzdHJlYW1idWZfc2l6ZU0pLAorCU1DX1BJMzIoInNsb3dfaW5wdXQiLCAmc2xvd19pbnB1dCksCisJTUNfRlVOX0lEKCJ2aWRlb2J1ZnVzZWQiLCB2aWRlb2J1ZnVzZWRfc2hvd19mdW4sIE5VTEwsIDApLAorfTsKKworCisKKy8qc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtZW1vYmo7Ki8KK3N0YXRpYyBpbnQgYW1zdHJlYW1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgaTsKKwlpbnQgcjsKKwlzdHJ1Y3Qgc3RyZWFtX3BvcnRfcyAqc3Q7CisKKwlwcl9lcnIoIkFtbG9naWMgQS9WIHN0cmVhbWluZyBwb3J0IGluaXRcbiIpOworCisJYW1zdHJlYW1fcG9ydF9udW0gPSBNQVhfQU1TVFJFQU1fUE9SVF9OVU07CisJYW1zdHJlYW1fYnVmX251bSA9IEJVRl9NQVhfTlVNOworLyoKKyAqCXIgPSBvZl9yZXNlcnZlZF9tZW1fZGV2aWNlX2luaXQoJnBkZXYtPmRldik7CisgKglpZiAociA9PSAwKQorICoJCXByX2luZm8oIm9mIHByb2JlIGRvbmUiKTsKKyAqCWVsc2UgeworICoJCXIgPSAtRU5PTUVNOworICoJCXJldHVybiByOworICoJfQorICovCisJciA9IGNsYXNzX3JlZ2lzdGVyKCZhbXN0cmVhbV9jbGFzcyk7CisJaWYgKHIpIHsKKwkJcHJfZXJyKCJhbXN0cmVhbSBjbGFzcyBjcmVhdGUgZmFpbC5cbiIpOworCQlyZXR1cm4gcjsKKwl9CisKKwlyID0gYXN0cmVhbV9kZXZfcmVnaXN0ZXIoKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gcmVnaXN0ZXJfY2hyZGV2KEFNU1RSRUFNX01BSk9SLCAiYW1zdHJlYW0iLCAmYW1zdHJlYW1fZm9wcyk7CisJaWYgKHIgPCAwKSB7CisJCXByX2VycigiQ2FuJ3QgYWxsb2NhdGUgbWFqb3IgZm9yIGFtc3RyZWFtaW5nIGRldmljZVxuIik7CisKKwkJZ290byBlcnJvcjI7CisJfQorCisJYW1zdHJlYW1fZGV2X2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCBERVZJQ0VfTkFNRSk7CisKKwlmb3IgKHN0ID0gJnBvcnRzWzBdLCBpID0gMDsgaSA8IGFtc3RyZWFtX3BvcnRfbnVtOyBpKyssIHN0KyspIHsKKwkJc3QtPmNsYXNzX2RldiA9IGRldmljZV9jcmVhdGUoYW1zdHJlYW1fZGV2X2NsYXNzLCBOVUxMLAorCQkJCU1LREVWKEFNU1RSRUFNX01BSk9SLCBpKSwgTlVMTCwKKwkJCQlwb3J0c1tpXS5uYW1lKTsKKwl9CisKKwlhbXN0cmVhbV9hZGVjX3N0YXR1cyA9IE5VTEw7CisJaWYgKHRzZGVtdXhfY2xhc3NfcmVnaXN0ZXIoKSAhPSAwKSB7CisJCXIgPSAoLUVJTyk7CisJCWdvdG8gZXJyb3IzOworCX0KKwl0c2RlbXV4X3RzeW5jX2Z1bmNfaW5pdCgpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmFtc3RyZWFtX3N1Yl93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhbXN0cmVhbV91c2VyZGF0YV93YWl0KTsKKwlyZXNldF9jYW51c2VfYnVmZXJsZXZlbCgxMDAwMCk7CisJYW1zdHJlYW1fcGRldiA9IHBkZXY7CisJYW1wb3J0c19jbG9ja19nYXRlX2luaXQoJmFtc3RyZWFtX3BkZXYtPmRldik7CisKKwkvKnByZWFsbG9jIGZldGNoIGJ1ZiB0byBhdm9pZCBubyBjb250aW51ZSBidWZmZXIgbGF0ZXIuLi4qLworCXN0YnVmX2ZldGNoX2luaXQoKTsKKwlSRUdfUEFUSF9DT05GSUdTKCJtZWRpYS5hbXBvcnRzIiwgYW1wb3J0c19jb25maWdzKTsKKworCWFtc3RyZWFtX3VzZXJkYXRhX2luaXQoKTsKKwkvKiBwb3dlcm9mZiB0aGUgZGVjb2RlIGNvcmUgYmVjYXVzZSBkb3MgY2FuIG5vdCBiZSByZXNldCB3aGVuIHJlYm9vdCAqLworCWlmIChnZXRfY3B1X21ham9yX2lkKCkgPT0gQU1fTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpCisJCXZkZWNfcG93ZXJfcmVzZXQoKTsKKworCXJldHVybiAwOworCisJLyoKKwkgKiAgIGVycm9yNDoKKwkgKiAgdHNkZW11eF9jbGFzc191bnJlZ2lzdGVyKCk7CisJICovCitlcnJvcjM6CisJZm9yIChzdCA9ICZwb3J0c1swXSwgaSA9IDA7IGkgPCBhbXN0cmVhbV9wb3J0X251bTsgaSsrLCBzdCsrKQorCQlkZXZpY2VfZGVzdHJveShhbXN0cmVhbV9kZXZfY2xhc3MsIE1LREVWKEFNU1RSRUFNX01BSk9SLCBpKSk7CisJY2xhc3NfZGVzdHJveShhbXN0cmVhbV9kZXZfY2xhc3MpOworZXJyb3IyOgorCXVucmVnaXN0ZXJfY2hyZGV2KEFNU1RSRUFNX01BSk9SLCAiYW1zdHJlYW0iKTsKKwkvKiBlcnJvcjE6ICovCisJYXN0cmVhbV9kZXZfdW5yZWdpc3RlcigpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IGFtc3RyZWFtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCBpOworCXN0cnVjdCBzdHJlYW1fcG9ydF9zICpzdDsKKworCWlmIChidWZzW0JVRl9UWVBFX0FVRElPXS5mbGFnICYgQlVGX0ZMQUdfQUxMT0MpCisJCXN0YnVmX2NoYW5nZV9zaXplKCZidWZzW0JVRl9UWVBFX0FVRElPXSwgMCwgZmFsc2UpOworCXN0YnVmX2ZldGNoX3JlbGVhc2UoKTsKKwl0c2RlbXV4X2NsYXNzX3VucmVnaXN0ZXIoKTsKKwlmb3IgKHN0ID0gJnBvcnRzWzBdLCBpID0gMDsgaSA8IGFtc3RyZWFtX3BvcnRfbnVtOyBpKyssIHN0KyspCisJCWRldmljZV9kZXN0cm95KGFtc3RyZWFtX2Rldl9jbGFzcywgTUtERVYoQU1TVFJFQU1fTUFKT1IsIGkpKTsKKworCWNsYXNzX2Rlc3Ryb3koYW1zdHJlYW1fZGV2X2NsYXNzKTsKKworCXVucmVnaXN0ZXJfY2hyZGV2KEFNU1RSRUFNX01BSk9SLCAiYW1zdHJlYW0iKTsKKworCWNsYXNzX3VucmVnaXN0ZXIoJmFtc3RyZWFtX2NsYXNzKTsKKworCWFzdHJlYW1fZGV2X3VucmVnaXN0ZXIoKTsKKworCWFtc3RyZWFtX2FkZWNfc3RhdHVzID0gTlVMTDsKKworCXByX2VycigiQW1sb2dpYyBBL1Ygc3RyZWFtaW5nIHBvcnQgcmVsZWFzZVxuIik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzZXRfYWRlY19mdW5jKGludCAoKmFkZWNfZnVuYykoc3RydWN0IGFkZWNfc3RhdHVzICopKQoreworCWFtc3RyZWFtX2FkZWNfc3RhdHVzID0gYWRlY19mdW5jOworfQorCit2b2lkIHdha2V1cF9zdWJfcG9sbCh2b2lkKQoreworCWF0b21pY19pbmMoJnN1YmRhdGFfcmVhZHkpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYW1zdHJlYW1fc3ViX3dhaXQpOworfQorCitpbnQgZ2V0X3N1Yl90eXBlKHZvaWQpCit7CisJcmV0dXJuIHN1Yl90eXBlOworfQorCit1MzIgZ2V0X2F1ZGlvX3Jlc2V0KHZvaWQpCit7CisJcmV0dXJuIGFtc3RyZWFtX2F1ZGlvX3Jlc2V0OworfQorCisvKmdldCBwZXMgYnVmZmVycyAqLworCitzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpnZXRfc3RyZWFtX2J1ZmZlcihpbnQgaWQpCit7CisJaWYgKGlkID49IEJVRl9NQVhfTlVNKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gJmJ1ZnNbaWRdOworfQorRVhQT1JUX1NZTUJPTChnZXRfc3RyZWFtX2J1ZmZlcik7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhbWxvZ2ljX21lc29uc3RyZWFtX2R0X21hdGNoW10gPSB7CisJeworCQkuY29tcGF0aWJsZSA9ICJhbWxvZ2ljLCBjb2RlYywgc3RyZWFtYnVmIiwKKwl9LAorCXt9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYW1zdHJlYW1fZHJpdmVyID0geworCS5wcm9iZSA9IGFtc3RyZWFtX3Byb2JlLAorCS5yZW1vdmUgPSBhbXN0cmVhbV9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5uYW1lID0gIm1lc29uc3RyZWFtIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gYW1sb2dpY19tZXNvbnN0cmVhbV9kdF9tYXRjaCwKKwl9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBhbXN0cmVhbV9tb2R1bGVfaW5pdCh2b2lkKQoreworCWlmIChwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFtc3RyZWFtX2RyaXZlcikpIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gcmVnaXN0ZXIgYW1zdHJlYW0gbW9kdWxlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKHN1YnRpdGxlX2luaXQoKSkgeworCQlwcl9lcnIoImZhaWxlZCB0byBpbml0IHN1YnRpdGxlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhbXN0cmVhbV9tb2R1bGVfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhbXN0cmVhbV9kcml2ZXIpOworCXN1YnRpdGxlX2V4aXQoKTsKK30KKworbW9kdWxlX2luaXQoYW1zdHJlYW1fbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQoYW1zdHJlYW1fbW9kdWxlX2V4aXQpOworCittb2R1bGVfcGFyYW0oZm9yY2VfZHZfbW9kZSwgdWludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2R2X21vZGUsCisJIlxuIGZvcmNlX2R2X21vZGUgXG4iKTsKKworbW9kdWxlX3BhcmFtKGRlZl80a192c3RyZWFtYnVmX3NpemVNLCB1aW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVmXzRrX3ZzdHJlYW1idWZfc2l6ZU0sCisJIlxuRGVmYXVsdCB2aWRlbyBTdHJlYW0gYnVmIHNpemUgZm9yIDRLIE1CeXB0ZXNcbiIpOworCittb2R1bGVfcGFyYW0oZGVmX3ZzdHJlYW1idWZfc2l6ZU0sIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkZWZfdnN0cmVhbWJ1Zl9zaXplTSwKKwkiXG5EZWZhdWx0IHZpZGVvIFN0cmVhbSBidWYgc2l6ZSBmb3IgPCAxMDgwcCBNQnlwdGVzXG4iKTsKKworbW9kdWxlX3BhcmFtKHNsb3dfaW5wdXQsIHVpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhzbG93X2lucHV0LCAiXG4gYW1zdHJlYW0gc2xvd19pbnB1dFxuIik7CisKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTUxPR0lDIHN0cmVhbWluZyBwb3J0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiVGltIFlhbyA8dGlteWFvQGFtbG9naWMuY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvYW1wb3J0cy9zdHJlYW1fYnVmZmVyX2Jhc2UuYyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L2FtcG9ydHMvc3RyZWFtX2J1ZmZlcl9iYXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFkZjhlNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L2FtcG9ydHMvc3RyZWFtX2J1ZmZlcl9iYXNlLmMKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvbWVkaWEvc3RyZWFtX2lucHV0L3BhcnNlci9zdHJlYW1fYnVmZmVyX2Jhc2UuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2RlZmluZSBERUJVRworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jb2RlY19tbS9jb2RlY19tbS5oPgorI2luY2x1ZGUgIi4uLy4uL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdmRlYy5oIgorI2luY2x1ZGUgImFtcG9ydHNfcHJpdi5oIgorI2luY2x1ZGUgInN0cmVhbV9idWZmZXJfYmFzZS5oIgorI2luY2x1ZGUgInRocmVhZF9ydy5oIgorCisjZGVmaW5lIERFRkFVTFRfVklERU9fQlVGRkVSX1NJWkUJCSgxMDI0ICogMTAyNCAqIDMpCisjZGVmaW5lIERFRkFVTFRfVklERU9fQlVGRkVSX1NJWkVfNEsJCSgxMDI0ICogMTAyNCAqIDYpCisjZGVmaW5lIERFRkFVTFRfVklERU9fQlVGRkVSX1NJWkVfVFZQCQkoMTAyNCAqIDEwMjQgKiAxMCkKKyNkZWZpbmUgREVGQVVMVF9WSURFT19CVUZGRVJfU0laRV80S19UVlAJKDEwMjQgKiAxMDI0ICogMTUpCisKK3N0YXRpYyBzdHJ1Y3Qgc3RyZWFtX2J1Zl9zIHZkZWNfYnVmX2RlZiA9IHsKKwkucmVnX2Jhc2UJPSBWTERfTUVNX1ZJRklGT19SRUdfQkFTRSwKKwkudHlwZQkJPSBCVUZfVFlQRV9WSURFTywKKwkuYnVmX3N0YXJ0CT0gMCwKKwkuYnVmX3NpemUJPSBERUZBVUxUX1ZJREVPX0JVRkZFUl9TSVpFLAorCS5kZWZhdWx0X2J1Zl9zaXplID0gREVGQVVMVF9WSURFT19CVUZGRVJfU0laRSwKKwkuZmlyc3RfdHN0YW1wCT0gSU5WQUxJRF9QVFMKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3RyZWFtX2J1Zl9zIGhldmNfYnVmX2RlZiA9IHsKKwkucmVnX2Jhc2UJPSBIRVZDX1NUUkVBTV9SRUdfQkFTRSwKKwkudHlwZQkJPSBCVUZfVFlQRV9IRVZDLAorCS5idWZfc3RhcnQJPSAwLAorCS5idWZfc2l6ZQk9IERFRkFVTFRfVklERU9fQlVGRkVSX1NJWkVfNEssCisJLmRlZmF1bHRfYnVmX3NpemUgPSBERUZBVUxUX1ZJREVPX0JVRkZFUl9TSVpFXzRLLAorCS5maXJzdF90c3RhbXAJPSBJTlZBTElEX1BUUworfTsKKworc3RhdGljIHN0cnVjdCBzdHJlYW1fYnVmX3MgKmdldF9kZWZfcGFybXMoaW50IGYpCit7CisJc3dpdGNoIChmKSB7CisJY2FzZSBWRk9STUFUX0hFVkM6CisJY2FzZSBWRk9STUFUX0FWUzI6CisJY2FzZSBWRk9STUFUX0FWMToKKwljYXNlIFZGT1JNQVRfVlA5OgorCQlyZXR1cm4gJmhldmNfYnVmX2RlZjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gJnZkZWNfYnVmX2RlZjsKKwl9Cit9CisKK2ludCBzdHJlYW1fYnVmZmVyX2Jhc2VfaW5pdChzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpzdGJ1ZiwKKwkJCQlzdHJ1Y3Qgc3RyZWFtX2J1Zl9vcHMgKm9wcywKKwkJCQlzdHJ1Y3QgcGFyc2VyX2FyZ3MgKnBhcnMpCit7CisJc3RydWN0IHZkZWNfcyAqdmRlYyA9CisJCWNvbnRhaW5lcl9vZihzdGJ1Ziwgc3RydWN0IHZkZWNfcywgdmJ1Zik7CisJc3RydWN0IHN0cmVhbV9wb3J0X3MgKnBvcnQgPSBOVUxMOworCXUzMiBmb3JtYXQsIHdpZHRoLCBoZWlnaHQ7CisKKwkvKiBzYW5pdHkgY2hlY2suICovCisJaWYgKFdBUk5fT04oIXN0YnVmKSB8fCBXQVJOX09OKCFvcHMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBvcnQJPSB2ZGVjLT5wb3J0OworCWZvcm1hdAk9IHZkZWMtPnBvcnQtPnZmb3JtYXQ7CisJd2lkdGgJPSB2ZGVjLT5zeXNfaW5mby0+d2lkdGg7CisJaGVpZ2h0CT0gdmRlYy0+c3lzX2luZm8tPmhlaWdodDsKKworCWlmICghc3RidWYtPmV4dF9idWZfYWRkcikgeworCQltZW1jcHkoc3RidWYsIGdldF9kZWZfcGFybXMoZm9ybWF0KSwKKwkJCXNpemVvZigqc3RidWYpKTsKKwl9CisKKwlzdGJ1Zi0+aWQJPSB2ZGVjLT5pZDsKKwlzdGJ1Zi0+aXNfaGV2Ywk9ICgoZm9ybWF0ID09IFZGT1JNQVRfSEVWQykgfHwKKwkJCShmb3JtYXQgPT0gVkZPUk1BVF9BVlMyKSB8fAorCQkJKGZvcm1hdCA9PSBWRk9STUFUX0FWMSkgfHwKKwkJCShmb3JtYXQgPT0gVkZPUk1BVF9WUDkpKTsKKwlzdGJ1Zi0+Zm9yXzRrCT0gKCh3aWR0aCAqIGhlaWdodCkgPgorCQkJKDE5MjAgKiAxMDg4KSkgPyAxIDogMDsKKwlzdGJ1Zi0+aXNfbXVsdGlfaW5zdCA9ICF2ZGVjX3NpbmdsZSh2ZGVjKTsKKwltZW1jcHkoJnN0YnVmLT5wYXJzLCBwYXJzLCBzaXplb2YoKnBhcnMpKTsKKworCS8qIHJlZ2lzdGVyIG9wcyBmdW5jLiAqLworCXN0YnVmLT5vcHMJPSBvcHM7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woc3RyZWFtX2J1ZmZlcl9iYXNlX2luaXQpOworCit2b2lkIHN0cmVhbV9idWZmZXJfc2V0X2V4dF9idWYoc3RydWN0IHN0cmVhbV9idWZfcyAqc3RidWYsCisJCQkgICAgICAgdWxvbmcgYWRkciwKKwkJCSAgICAgICB1MzIgc2l6ZSwKKwkJCSAgICAgICB1MzIgZmxhZykKK3sKKwlzdGJ1Zi0+ZXh0X2J1Zl9hZGRyCT0gYWRkcjsKKwlzdGJ1Zi0+YnVmX3NpemUgCT0gc2l6ZTsKKwlzdGJ1Zi0+aXNfc2VjdXJlCT0gKChmbGFnICYgU1RCVUZfTUVUQV9GTEFHX1NFQ1VSRSkgIT0gMCk7CisJc3RidWYtPnVzZV9wdHNzZXJ2CT0gKChmbGFnICYgU1RCVUZfTUVUQV9GTEFHX1BUU19TRVJWKSAhPSAwKTsKKwkvKgorCXByX2RlYnVnKCIlcywgYWRkciAlbHgsIHNpemUgMHgleCwgc2VjdXJlICVkXG4iLCBfX2Z1bmNfXywKKwkJc3RidWYtPmV4dF9idWZfYWRkciwgc3RidWYtPmJ1Zl9zaXplLCBzdGJ1Zi0+aXNfc2VjdXJlKTsKKwkqLworfQorRVhQT1JUX1NZTUJPTChzdHJlYW1fYnVmZmVyX3NldF9leHRfYnVmKTsKKwordm9pZCBzdHJlYW1fYnVmZmVyX21ldGFfd3JpdGUoc3RydWN0IHN0cmVhbV9idWZfcyAqc3RidWYsCisJc3RydWN0IHN0cmVhbV9idWZmZXJfbWV0YWluZm8gKm1ldGEpCit7CisJdTMyIHdwID0gc3RidWYtPm9wcy0+Z2V0X3dwKHN0YnVmKTsKKworCWlmICgoc3RidWYtPnN0cmVhbV9vZmZzZXQgPT0gMCkgJiYKKwkJKHdwID09IHN0YnVmLT5leHRfYnVmX2FkZHIpICYmCisJCShtZXRhLT5zdGJ1Zl9wa3RhZGRyID4gc3RidWYtPmV4dF9idWZfYWRkcikpIHsKKwkJc3RydWN0IHZkZWNfcyAqdmRlYyA9IGNvbnRhaW5lcl9vZihzdGJ1Ziwgc3RydWN0IHZkZWNfcywgdmJ1Zik7CisJCXUzMiBmaXJzdF9wdHI7CisJCXUzMiByb3VuZF9kb3duX3NpemUgPSAwOworCisJCS8qUlAgbWF4IGFsaWdubWVudCByZXF1aXJlbWVudCovCisJCWlmICh2ZGVjLT5pbnB1dC50YXJnZXQgPT0gVkRFQ19JTlBVVF9UQVJHRVRfSEVWQykKKwkJCXJvdW5kX2Rvd25fc2l6ZSA9IDB4ODA7CisJCWVsc2UgaWYgKHZkZWMtPmlucHV0LnRhcmdldCA9PSBWREVDX0lOUFVUX1RBUkdFVF9WTEQpCisJCQlyb3VuZF9kb3duX3NpemUgPSAweDEwMDsKKworCQlpZiAoc3RidWYtPmV4dF9idWZfYWRkciA+IChtZXRhLT5zdGJ1Zl9wa3RhZGRyIC0gcm91bmRfZG93bl9zaXplKSkKKwkJCWZpcnN0X3B0ciA9IHN0YnVmLT5leHRfYnVmX2FkZHI7CisJCWVsc2UgeworCQkJZmlyc3RfcHRyID0gcm91bmRfZG93bihtZXRhLT5zdGJ1Zl9wa3RhZGRyLCByb3VuZF9kb3duX3NpemUpOworCQkJcHJfaW5mbygid2FybjogZmlyc3QgcGFja2V0X3dwKCV4IHJvdW5kX2Rvd24gJXgpIGlzIG5vdCBzdGJ1ZiBzdGFydCBhZGRyKCVseClcbiIsCisJCQkJbWV0YS0+c3RidWZfcGt0YWRkciwgZmlyc3RfcHRyLCBzdGJ1Zi0+ZXh0X2J1Zl9hZGRyKTsKKwkJfQorCisJCXN0YnVmLT5vcHMtPnNldF93cChzdGJ1ZiwgZmlyc3RfcHRyKTsKKwkJc3RidWYtPm9wcy0+c2V0X3JwKHN0YnVmLCBmaXJzdF9wdHIpOworCQl2ZGVjLT5pbnB1dC5zd2FwX3JwID0gZmlyc3RfcHRyOworCQlpZiAodmRlYy0+c2xhdmUpCisJCQl2ZGVjLT5zbGF2ZS0+aW5wdXQuc3dhcF9ycCA9IGZpcnN0X3B0cjsKKwkJaWYgKHZkZWMtPmlucHV0LnRhcmdldCAhPSBWREVDX0lOUFVUX1RBUkdFVF9IRVZDKQorCQkJc3RidWYtPnN0cmVhbV9vZmZzZXQgKz0gKG1ldGEtPnN0YnVmX3BrdGFkZHIgLSBzdGJ1Zi0+ZXh0X2J1Zl9hZGRyKTsKKwkJZWxzZQorCQkJc3RidWYtPnN0cmVhbV9vZmZzZXQgKz0gKG1ldGEtPnN0YnVmX3BrdGFkZHIgLSBmaXJzdF9wdHIpOworCisJfQorCisJaWYgKG1ldGEtPnN0YnVmX3BrdGFkZHIgKyBtZXRhLT5zdGJ1Zl9wa3RzaXplIDwgc3RidWYtPmJ1Zl9zdGFydCArIHN0YnVmLT5idWZfc2l6ZSkKKwkJd3AgPSBtZXRhLT5zdGJ1Zl9wa3RhZGRyICsgbWV0YS0+c3RidWZfcGt0c2l6ZTsKKwllbHNlCisJCXdwID0gbWV0YS0+c3RidWZfcGt0YWRkciArIG1ldGEtPnN0YnVmX3BrdHNpemUgLSBzdGJ1Zi0+YnVmX3NpemU7CisKKwlzdGJ1Zi0+b3BzLT5zZXRfd3Aoc3RidWYsIHdwKTsKKworCXN0YnVmLT5zdHJlYW1fb2Zmc2V0ICs9IG1ldGEtPnN0YnVmX3BrdHNpemU7CisJc3RidWYtPmxhc3Rfb2Zmc2V0W3N0YnVmLT53cml0ZV9jb3VudCAlIDJdID0gc3RidWYtPnN0cmVhbV9vZmZzZXQ7CisJc3RidWYtPndyaXRlX2NvdW50Kys7CisJLyoKKwlwcl9kZWJ1ZygiJXMsIHVwZGF0ZSB3cCAweCV4ICsgc3ogMHgleCAtLT4gMHgleCwgc3RyZWFtX29mZnNldCAweCV4XG4iLAorCQlfX2Z1bmNfXywgbWV0YS0+c3RidWZfcGt0YWRkciwgbWV0YS0+c3RidWZfcGt0c2l6ZSwgd3AsIHN0YnVmLT5zdHJlYW1fb2Zmc2V0KTsKKwkqLworfQorRVhQT1JUX1NZTUJPTChzdHJlYW1fYnVmZmVyX21ldGFfd3JpdGUpOworCitzc2l6ZV90IHN0cmVhbV9idWZmZXJfd3JpdGVfZXgoc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgICBzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpzdGJ1ZiwKKwkJICAgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCSAgICAgICBzaXplX3QgY291bnQsIGludCBmbGFncykKK3sKKwlpbnQgcjsKKwl1MzIgbGVuID0gY291bnQ7CisKKwlpZiAoYnVmID09IE5VTEwgfHwgY291bnQgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc3RidWZfc3BhY2Uoc3RidWYpIDwgY291bnQpIHsKKwkJaWYgKChmbGFncyAmIDIpIHx8ICgoZmlsZSAhPSBOVUxMKSAmJgorCQkJCShmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykpKSB7CisJCQlsZW4gPSBzdGJ1Zl9zcGFjZShzdGJ1Zik7CisJCQlpZiAobGVuIDwgMjU2KQkvKiA8MWsuZG8gZWFnYWluLCAqLworCQkJCXJldHVybiAtRUFHQUlOOworCQl9IGVsc2UgeworCQkJbGVuID0gbWluKHN0YnVmX2NhbnVzZXNpemUoc3RidWYpIC8gOCwgbGVuKTsKKwkJCWlmIChzdGJ1Zl9zcGFjZShzdGJ1ZikgPCBsZW4pIHsKKwkJCQlyID0gc3RidWZfd2FpdF9zcGFjZShzdGJ1ZiwgbGVuKTsKKwkJCQlpZiAociA8IDApCisJCQkJCXJldHVybiByOworCQkJfQorCQl9CisJfQorCisJc3RidWYtPmxhc3Rfd3JpdGVfamlmZmllczY0ID0gamlmZmllc182NDsKKwlzdGJ1Zi0+aXNfcGh5YnVmID0gKGZsYWdzICYgMSk7CisKKwlsZW4gPSBtaW5fdCh1MzIsIGxlbiwgY291bnQpOworCisJciA9IHN0YnVmLT5vcHMtPndyaXRlKHN0YnVmLCBidWYsIGxlbik7CisJaWYgKHIgPiAwKQorCQlzdGJ1Zi0+c3RyZWFtX29mZnNldCArPSByOworCisJcmV0dXJuIHI7Cit9CitFWFBPUlRfU1lNQk9MKHN0cmVhbV9idWZmZXJfd3JpdGVfZXgpOworCitpbnQgc3RyZWFtX2J1ZmZlcl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICAgIHN0cnVjdCBzdHJlYW1fYnVmX3MgKnN0YnVmLAorCQkgICAgICAgY29uc3QgY2hhciAqYnVmLAorCQkgICAgICAgc2l6ZV90IGNvdW50KQoreworCWlmIChzdGJ1Zi0+d3JpdGVfdGhyZWFkKQorCQlyZXR1cm4gdGhyZWFkcndfd3JpdGUoZmlsZSwgc3RidWYsIGJ1ZiwgY291bnQpOworCWVsc2UKKwkJcmV0dXJuIHN0cmVhbV9idWZmZXJfd3JpdGVfZXgoZmlsZSwgc3RidWYsIGJ1ZiwgY291bnQsIDApOworfQorRVhQT1JUX1NZTUJPTChzdHJlYW1fYnVmZmVyX3dyaXRlKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvYW1wb3J0cy9zdHJlYW1fYnVmZmVyX2Jhc2UuaCBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L2FtcG9ydHMvc3RyZWFtX2J1ZmZlcl9iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM2MGU2NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L2FtcG9ydHMvc3RyZWFtX2J1ZmZlcl9iYXNlLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9tZWRpYS9zdHJlYW1faW5wdXQvcGFyc2VyL3N0cmVhbV9idWZmZXJfYmFzZS5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgU1RSRUFNX0JVRkZFUl9JTlRFUkZBQ0VfSAorI2RlZmluZSBTVFJFQU1fQlVGRkVSX0lOVEVSRkFDRV9ICisjaW5jbHVkZSAic3RyZWFtYnVmLmgiCisjaW5jbHVkZSAic3RyZWFtYnVmX3JlZy5oIgorCisjZGVmaW5lIFNUQlVGX1JFQUQocywgZnVuYywgYXJncy4uLikJCQlcCisoewkJCQkJCQlcCisJdTMyIHJldCA9IDA7CQkJCQlcCisJaWYgKChzKSAmJiAocyktPm9wcykJCQkJXAorCQlyZXQgPSAocyktPm9wcy0+ZnVuYygocyksICMjYXJncyk7CVwKKwlyZXQ7CQkJCQkJXAorfSkKKworI2RlZmluZSBTVEJVRl9XUklURShzLCBmdW5jLCBhcmdzLi4uKQkJCVwKKyh7CQkJCQkJCVwKKwlpZiAoKHMpICYmIChzKS0+b3BzKQkJCQlcCisJCShzKS0+b3BzLT5mdW5jKChzKSwgIyNhcmdzKTsJCVwKK30pCisKK2V4dGVybiBzdHJ1Y3Qgc3RyZWFtX2J1Zl9vcHMgKmdldF9zdGJ1Zl9vcHModm9pZCk7CitleHRlcm4gc3RydWN0IHN0cmVhbV9idWZfb3BzICpnZXRfZXNwYXJzZXJfc3RidWZfb3BzKHZvaWQpOworZXh0ZXJuIHN0cnVjdCBzdHJlYW1fYnVmX29wcyAqZ2V0X3RzcGFyc2VyX3N0YnVmX29wcyh2b2lkKTsKK2V4dGVybiBzdHJ1Y3Qgc3RyZWFtX2J1Zl9vcHMgKmdldF9wc3BhcnNlcl9zdGJ1Zl9vcHModm9pZCk7CisKK2ludCBzdHJlYW1fYnVmZmVyX2Jhc2VfaW5pdChzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpzdGJ1ZiwKKwkJCSAgICBzdHJ1Y3Qgc3RyZWFtX2J1Zl9vcHMgKm9wcywKKwkJCSAgICBzdHJ1Y3QgcGFyc2VyX2FyZ3MgKnBhcnMpOworCit2b2lkIHN0cmVhbV9idWZmZXJfc2V0X2V4dF9idWYoc3RydWN0IHN0cmVhbV9idWZfcyAqc3RidWYsCisJCQkgICAgICAgdWxvbmcgYWRkciwKKwkJCSAgICAgICB1MzIgc2l6ZSwKKwkJCSAgICAgICB1MzIgZmxhZyk7CisKK2ludCBzdHJlYW1fYnVmZmVyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJc3RydWN0IHN0cmVhbV9idWZfcyAqc3RidWYsCisJCQljb25zdCBjaGFyICpidWYsCisJCQlzaXplX3QgY291bnQpOworCitzc2l6ZV90IHN0cmVhbV9idWZmZXJfd3JpdGVfZXgoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICBzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpzdGJ1ZiwKKwkJCSAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICBzaXplX3QgY291bnQsCisJCQkgICBpbnQgZmxhZ3MpOworCit2b2lkIHN0cmVhbV9idWZmZXJfbWV0YV93cml0ZShzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpzdGJ1ZiwKKwlzdHJ1Y3Qgc3RyZWFtX2J1ZmZlcl9tZXRhaW5mbyAqbWV0YSk7CisKKyNlbmRpZiAvKiBTVFJFQU1fQlVGRkVSX0lOVEVSRkFDRV9IICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RyZWFtX2lucHV0L2FtcG9ydHMvc3RyZWFtX2J1ZmZlcl9pbnRlcmZhY2UuYyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L2FtcG9ydHMvc3RyZWFtX2J1ZmZlcl9pbnRlcmZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGExNGVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvYW1wb3J0cy9zdHJlYW1fYnVmZmVyX2ludGVyZmFjZS5jCkBAIC0wLDAgKzEsMzI2IEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL21lZGlhL3N0cmVhbV9pbnB1dC9wYXJzZXIvc3RyZWFtX2J1ZmZmZXJfaW50ZXJmYWNlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKyNkZWZpbmUgREVCVUcKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29kZWNfbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2ZyYW1lX3N5bmMvcHRzc2Vydi5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZnJhbWVfc3luYy90c3luY19wY3IuaD4KKyNpbmNsdWRlICIuLi8uLi9mcmFtZV9wcm92aWRlci9kZWNvZGVyL3V0aWxzL3ZkZWMuaCIKKyNpbmNsdWRlICIuLi8uLi9jb21tb24vY2hpcHMvZGVjb2Rlcl9jcHVfdmVyX2luZm8uaCIKKyNpbmNsdWRlICJzdHJlYW1fYnVmZmVyX2Jhc2UuaCIKKyNpbmNsdWRlICJhbXBvcnRzX3ByaXYuaCIKKyNpbmNsdWRlICJ0aHJlYWRfcncuaCIKKworI2RlZmluZSBNRU1fTkFNRSAic3RidWYiCisjZGVmaW5lIE1BUF9SQU5HRSAoU1pfMU0pCisKK3N0YXRpYyB2b2lkIHN0cmVhbV9idWZmZXJfcmVsZWFzZShzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpzdGJ1Zik7CisKK3N0YXRpYyBjb25zdCBjaGFyICp0eXBlX3RvX3N0cihpbnQgdCkKK3sKKwlzd2l0Y2ggKHQpIHsKKwljYXNlIEJVRl9UWVBFX1ZJREVPOgorCQlyZXR1cm4gIlZJREVPIjsKKwljYXNlIEJVRl9UWVBFX0FVRElPOgorCQlyZXR1cm4gIkFVRElPIjsKKwljYXNlIEJVRl9UWVBFX1NVQlRJVExFOgorCQlyZXR1cm4gIlNVQiI7CisJY2FzZSBCVUZfVFlQRV9VU0VSREFUQToKKwkJcmV0dXJuICJVU0VSIjsKKwljYXNlIEJVRl9UWVBFX0hFVkM6CisJCXJldHVybiAiSEVWQyI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJFUlIiOworCX0KK30KKworc3RhdGljIGludCBzdHJlYW1fYnVmZmVyX2luaXQoc3RydWN0IHN0cmVhbV9idWZfcyAqc3RidWYsIHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJaW50IHJldCA9IDA7CisJdTMyIGZsYWdzID0gQ09ERUNfTU1fRkxBR1NfRE1BOworCWJvb2wgaXNfc2VjdXJlID0gMDsKKwl1MzIgYWRkciA9IDA7CisJaW50IHBhZ2VzID0gMDsKKwl1MzIgc2l6ZTsKKworCWlmIChzdGJ1Zi0+YnVmX3N0YXJ0KQorCQlyZXR1cm4gMDsKKworCXNucHJpbnRmKHN0YnVmLT5uYW1lLCBzaXplb2Yoc3RidWYtPm5hbWUpLAorCQkiJXMtJWQiLCBNRU1fTkFNRSwgdmRlYy0+aWQpOworCisJaWYgKHN0YnVmLT5leHRfYnVmX2FkZHIpIHsKKwkJYWRkcgk9IHN0YnVmLT5leHRfYnVmX2FkZHI7CisJCXNpemUJPSBzdGJ1Zi0+YnVmX3NpemU7CisJCWlzX3NlY3VyZSA9IHN0YnVmLT5pc19zZWN1cmU7CisJCXBhZ2VzID0gKHNpemUgPj4gUEFHRV9TSElGVCk7CisJfSBlbHNlIHsKKwkJZmxhZ3MgfD0gQ09ERUNfTU1fRkxBR1NfRk9SX1ZERUNPREVSOworCQlpZiAodmRlYy0+cG9ydF9mbGFnICYgUE9SVF9GTEFHX0RSTSkgeworCQkJZmxhZ3MgfD0gQ09ERUNfTU1fRkxBR1NfVFZQOworCQkJaXNfc2VjdXJlID0gdHJ1ZTsKKwkJfQorCisJCXNpemUgPSBQQUdFX0FMSUdOKHN0YnVmLT5idWZfc2l6ZSk7CisJCXBhZ2VzID0gKHNpemUgPj4gUEFHRV9TSElGVCk7CisJCWFkZHIgPSBjb2RlY19tbV9hbGxvY19mb3JfZG1hKHN0YnVmLT5uYW1lLAorCQkJCXBhZ2VzLCBQQUdFX1NISUZUICsgNCwgZmxhZ3MpOworCQlpZiAoIWFkZHIpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGVycjsKKwkJfQorCQlzdGJ1Zi0+dXNlX3B0c3NlcnYgPSAxOworCX0KKwl2ZGVjX2NvbmZpZ192bGRfcmVnKHZkZWMsIGFkZHIsIHNpemUpOworCisJcmV0ID0gdmRlY19zZXRfaW5wdXRfYnVmZmVyKHZkZWMsIGFkZHIsIHNpemUpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJbJWRdOiBzZXQgaW5wdXQgYnVmZmVyIGVyci5cbiIsIHN0YnVmLT5pZCk7CisJCWdvdG8gZXJyOworCX0KKworCWF0b21pY19zZXQoJnN0YnVmLT5wYXlsb2FkLCAwKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzdGJ1Zi0+d3EpOworCisJc3RidWYtPmJ1Zl9zdGFydAk9IGFkZHI7CisJc3RidWYtPmJ1Zl93cAkJPSBhZGRyOworCXN0YnVmLT5idWZfcnAJCT0gYWRkcjsKKwlzdGJ1Zi0+YnVmX3NpemUJCT0gc2l6ZTsKKwlzdGJ1Zi0+aXNfc2VjdXJlCT0gaXNfc2VjdXJlOworCXN0YnVmLT5ub19wYXJzZXIJPSB0cnVlOworCXN0YnVmLT5idWZfcGFnZV9udW0JPSBwYWdlczsKKwlzdGJ1Zi0+Y2FudXNlYnVmX3NpemUJPSBzaXplOworCXN0YnVmLT5zdHJlYW1fb2Zmc2V0CT0gMDsKKworCS8qIGluaXQgdGhyZWFkIHdyaXRlLiAqLworCWlmICghKHZkZWNfZ2V0X2RlYnVnX2ZsYWdzKCkgJiAxKSAmJgorCQkhY29kZWNfbW1fdmlkZW9fdHZwX2VuYWJsZWQoKSAmJgorCQkoIXN0YnVmLT5leHRfYnVmX2FkZHIpKSB7CisJCWludCBibG9ja19zaXplID0gUEFHRV9TSVpFIDw8IDQ7CisJCWludCBidWZfbnVtID0gKDIgKiBTWl8xTSkgLyAoUEFHRV9TSVpFIDw8IDQpOworCisJCXN0YnVmLT53cml0ZV90aHJlYWQgPQorCQkJdGhyZWFkcndfYWxsb2MoYnVmX251bSwgYmxvY2tfc2l6ZSwKKwkJCQkgICAgICAgc3RyZWFtX2J1ZmZlcl93cml0ZV9leCwgMCk7CisJfQorCisJc3RidWYtPmZsYWcgfD0gQlVGX0ZMQUdfQUxMT0M7CisJc3RidWYtPmZsYWcgfD0gQlVGX0ZMQUdfSU5fVVNFOworCWlmICh2ZGVjX3NpbmdsZSh2ZGVjKSkKKwkJcHRzX3N0YXJ0KHN0YnVmLT50eXBlKTsKKwlwcl9pbmZvKCJbJWRdOiBbJXMtJXNdIGFkZHI6ICVseCwgc2l6ZTogJXgsIHRoclJXOiAlZCwgZXh0YnVmOiAlZCwgc2VjdXJlOiAlZFxuIiwKKwkJc3RidWYtPmlkLCB0eXBlX3RvX3N0cihzdGJ1Zi0+dHlwZSksIHN0YnVmLT5uYW1lLAorCQlzdGJ1Zi0+YnVmX3N0YXJ0LCBzdGJ1Zi0+YnVmX3NpemUsCisJCSEhc3RidWYtPndyaXRlX3RocmVhZCwKKwkJISFzdGJ1Zi0+ZXh0X2J1Zl9hZGRyLAorCQlzdGJ1Zi0+aXNfc2VjdXJlKTsKKworCXJldHVybiAwOworZXJyOgorCXN0cmVhbV9idWZmZXJfcmVsZWFzZShzdGJ1Zik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzdHJlYW1fYnVmZmVyX3JlbGVhc2Uoc3RydWN0IHN0cmVhbV9idWZfcyAqc3RidWYpCit7CisJaWYgKHN0YnVmLT53cml0ZV90aHJlYWQpCisJCXRocmVhZHJ3X3JlbGVhc2Uoc3RidWYpOworCWlmICh2ZGVjX3NpbmdsZShjb250YWluZXJfb2Yoc3RidWYsIHN0cnVjdCB2ZGVjX3MsIHZidWYpKSkKKwkJcHRzX3N0b3Aoc3RidWYtPnR5cGUpOworCisJaWYgKHN0YnVmLT5mbGFnICYgQlVGX0ZMQUdfQUxMT0MgJiYgc3RidWYtPmJ1Zl9zdGFydCkgeworCQlpZiAoIXN0YnVmLT5leHRfYnVmX2FkZHIpCisJCQljb2RlY19tbV9mcmVlX2Zvcl9kbWEoTUVNX05BTUUsIHN0YnVmLT5idWZfc3RhcnQpOworCisJCXN0YnVmLT5mbGFnCQkmPSB+QlVGX0ZMQUdfQUxMT0M7CisJCXN0YnVmLT5leHRfYnVmX2FkZHIJPSAwOworCQlzdGJ1Zi0+YnVmX3N0YXJ0CT0gMDsKKwkJc3RidWYtPmlzX3NlY3VyZQk9IGZhbHNlOworCX0KKwlzdGJ1Zi0+ZmxhZyAmPSB+QlVGX0ZMQUdfSU5fVVNFOworfQorCitzdGF0aWMgaW50IGdldF9mcmVlX3NwYWNlKHN0cnVjdCBzdHJlYW1fYnVmX3MgKnN0YnVmKQoreworCXUzMiBsZW4gPSBzdGJ1Zi0+YnVmX3NpemU7CisJaW50IGlkbGUgPSAwOworCisJaWYgKCFhdG9taWNfcmVhZCgmc3RidWYtPnBheWxvYWQpICYmIChzdGJ1Zi0+YnVmX3JwID09IHN0YnVmLT5idWZfd3ApKQorCQlpZGxlID0gbGVuOworCWVsc2UgaWYgKHN0YnVmLT5idWZfd3AgPiBzdGJ1Zi0+YnVmX3JwKQorCQlpZGxlID0gbGVuIC0gKHN0YnVmLT5idWZfd3AgLSBzdGJ1Zi0+YnVmX3JwKTsKKwllbHNlIGlmIChzdGJ1Zi0+YnVmX3dwIDwgc3RidWYtPmJ1Zl9ycCkKKwkJaWRsZSA9IHN0YnVmLT5idWZfcnAgLSBzdGJ1Zi0+YnVmX3dwOworCisJLypwcl9pbmZvKCJbJWRdOiB3cDogJXgsIHJwOiAleCwgcGF5bG9hZDogJWQsIGZyZWUgc3BhY2U6ICVkXG4iLAorCQlzdGJ1Zi0+aWQsIHN0YnVmLT5idWZfd3AsIHN0YnVmLT5idWZfcnAsCisJCWF0b21pY19yZWFkKCZzdGJ1Zi0+cGF5bG9hZCksIGlkbGUpOyovCisKKwlyZXR1cm4gaWRsZTsKK30KKworc3RhdGljIGludCBhbWxfY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVsb25nIG4pCit7CisJaW50IHJldCA9MDsKKworCWlmIChsaWtlbHkoYWNjZXNzX29rKGZyb20sIG4pKSkKKwkJcmV0ID0gY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pOworCWVsc2UKKwkJbWVtY3B5KHRvLCBmcm9tLCBuKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3RyZWFtX2J1ZmZlcl9jb3B5KHN0cnVjdCBzdHJlYW1fYnVmX3MgKnN0YnVmLCBjb25zdCB1OCAqYnVmLCB1MzIgc2l6ZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl2b2lkICpzcmMgPSBOVUxMLCAqZHN0ID0gTlVMTDsKKwlpbnQgaSwgbGVuOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gTUFQX1JBTkdFKSB7CisJCWxlbiA9ICgoc2l6ZSAtIGkpID4gTUFQX1JBTkdFKSA/IE1BUF9SQU5HRSA6IHNpemUgLSBpOworCQlzcmMgPSBzdGJ1Zi0+aXNfcGh5YnVmID8KKwkJCWNvZGVjX21tX3ZtYXAoKHVsb25nKSBidWYgKyBpLCBsZW4pIDoKKwkJCSh2b2lkICopIGJ1ZjsKKwkJZHN0ID0gY29kZWNfbW1fdm1hcChzdGJ1Zi0+YnVmX3dwICsgaSwgbGVuKTsKKwkJaWYgKCFzcmMgfHwgIWRzdCkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCXByX2VycigiWyVkXTogJXMsIHNyYyBvciBkc3QgaXMgaW52YWxpZC5cbiIsCisJCQkJc3RidWYtPmlkLCAgX19mdW5jX18pOworCQkJZ290byBlcnI7CisJCX0KKworCQlpZiAoYW1sX2NvcHlfZnJvbV91c2VyKGRzdCwgc3JjLCBsZW4pKSB7CisJCQlyZXQgPSAtRUFHQUlOOworCQkJZ290byBlcnI7CisJCX0KKworCQljb2RlY19tbV9kbWFfZmx1c2goZHN0LCBsZW4sIERNQV9UT19ERVZJQ0UpOworCQljb2RlY19tbV91bm1hcF9waHlhZGRyKGRzdCk7CisKKwkJaWYgKHN0YnVmLT5pc19waHlidWYpCisJCQljb2RlY19tbV91bm1hcF9waHlhZGRyKHNyYyk7CisJfQorCisJcmV0dXJuIDA7CitlcnI6CisJaWYgKHN0YnVmLT5pc19waHlidWYgJiYgc3JjKQorCQljb2RlY19tbV91bm1hcF9waHlhZGRyKHNyYyk7CisJaWYgKGRzdCkKKwkJY29kZWNfbW1fdW5tYXBfcGh5YWRkcihkc3QpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmJfcHVzaF9kYXRhKHN0cnVjdCBzdHJlYW1fYnVmX3MgKnN0YnVmLCBjb25zdCB1OCAqaW4sIHUzMiBzaXplKQoreworCWludCByZXQsIGxlbjsKKwl1MzIgd3AgPSBzdGJ1Zi0+YnVmX3dwOworCXUzMiBzcCA9IChzdGJ1Zi0+YnVmX3dwICsgc2l6ZSk7CisJdTMyIGVwID0gKHN0YnVmLT5idWZfc3RhcnQgKyBzdGJ1Zi0+YnVmX3NpemUpOworCisJbGVuID0gc3AgPiBlcCA/IGVwIC0gd3AgOiBzaXplOworCisJaWYgKCFzdGJ1Zi0+ZXh0X2J1Zl9hZGRyKSB7CisJCXJldCA9IHN0cmVhbV9idWZmZXJfY29weShzdGJ1ZiwgaW4sIGxlbik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXN0YnVmLT5vcHMtPnNldF93cChzdGJ1ZiwgKHdwICsgbGVuID49IGVwKSA/CisJCXN0YnVmLT5idWZfc3RhcnQgOiAod3AgKyBsZW4pKTsKKworCWlmIChzdGJ1Zi0+YnVmX3dwID09IHN0YnVmLT5idWZfcnApIHsKKwkJcHJfZGVidWcoIlslZF06IHN0cmVhbSBidWZmZXIgaXMgZnVsbCwgcGF5bG9hZDogJWRcbiIsCisJCQlzdGJ1Zi0+aWQsIGF0b21pY19yZWFkKCZzdGJ1Zi0+cGF5bG9hZCkpOworCX0KKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgc3RyZWFtX2J1ZmZlcl93cml0ZV9pbm5lcihzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpzdGJ1ZiwKKwkJCQkgICAgIGNvbnN0IHU4ICppbiwgdTMyIHNpemUpCit7CisJaWYgKGluID09IE5VTEwgfHwgc2l6ZSA+IHN0YnVmLT5idWZfc2l6ZSkgeworCQlwcl9lcnIoIlslZF06IHBhcmFtcyBhcmUgbm90IHZhbGlkLlxuIiwgc3RidWYtPmlkKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChnZXRfZnJlZV9zcGFjZShzdGJ1ZikgPCBzaXplKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCXJldHVybiByYl9wdXNoX2RhdGEoc3RidWYsIGluLCBzaXplKTsKK30KKworc3RhdGljIHUzMiBzdHJlYW1fYnVmZmVyX2dldF93cChzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpzdGJ1ZikKK3sKKwlyZXR1cm4gc3RidWYtPmJ1Zl93cDsKK30KKworc3RhdGljIHZvaWQgc3RyZWFtX2J1ZmZlcl9zZXRfd3Aoc3RydWN0IHN0cmVhbV9idWZfcyAqc3RidWYsIHUzMiB2YWwpCit7CisJaW50IGxlbiA9ICh2YWwgPj0gc3RidWYtPmJ1Zl93cCkgPyAodmFsIC0gc3RidWYtPmJ1Zl93cCkgOgorCQkoc3RidWYtPmJ1Zl9zaXplIC0gc3RidWYtPmJ1Zl93cCArIHZhbCk7CisKKwlzdGJ1Zi0+YnVmX3dwID0gdmFsOworCXZkZWNfc2V0X3ZsZF93cChjb250YWluZXJfb2Yoc3RidWYsIHN0cnVjdCB2ZGVjX3MsIHZidWYpLCBzdGJ1Zi0+YnVmX3dwKTsKKworCWF0b21pY19hZGQobGVuLCAmc3RidWYtPnBheWxvYWQpOworfQorCitzdGF0aWMgdTMyIHN0cmVhbV9idWZmZXJfZ2V0X3JwKHN0cnVjdCBzdHJlYW1fYnVmX3MgKnN0YnVmKQoreworCXJldHVybiBzdGJ1Zi0+YnVmX3JwOworfQorCitzdGF0aWMgdm9pZCBzdHJlYW1fYnVmZmVyX3NldF9ycChzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpzdGJ1ZiwgdTMyIHZhbCkKK3sKKwlpbnQgbGVuID0gKHZhbCA+PSBzdGJ1Zi0+YnVmX3JwKSA/ICh2YWwgLSBzdGJ1Zi0+YnVmX3JwKSA6CisJCShzdGJ1Zi0+YnVmX3NpemUgLSBzdGJ1Zi0+YnVmX3JwICArIHZhbCk7CisKKwlzdGJ1Zi0+YnVmX3JwID0gdmFsOworCWF0b21pY19zdWIobGVuLCAmc3RidWYtPnBheWxvYWQpOworfQorCitzdGF0aWMgc3RydWN0IHN0cmVhbV9idWZfb3BzIHN0cmVhbV9idWZmZXJfb3BzID0geworCS5pbml0CT0gc3RyZWFtX2J1ZmZlcl9pbml0LAorCS5yZWxlYXNlID0gc3RyZWFtX2J1ZmZlcl9yZWxlYXNlLAorCS53cml0ZQk9IHN0cmVhbV9idWZmZXJfd3JpdGVfaW5uZXIsCisJLmdldF93cAk9IHN0cmVhbV9idWZmZXJfZ2V0X3dwLAorCS5zZXRfd3AJPSBzdHJlYW1fYnVmZmVyX3NldF93cCwKKwkuZ2V0X3JwCT0gc3RyZWFtX2J1ZmZlcl9nZXRfcnAsCisJLnNldF9ycAk9IHN0cmVhbV9idWZmZXJfc2V0X3JwLAorfTsKKworc3RydWN0IHN0cmVhbV9idWZfb3BzICpnZXRfc3RidWZfb3BzKHZvaWQpCit7CisJcmV0dXJuICZzdHJlYW1fYnVmZmVyX29wczsKK30KK0VYUE9SVF9TWU1CT0woZ2V0X3N0YnVmX29wcyk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RyZWFtX2lucHV0L2FtcG9ydHMvc3RyZWFtYnVmLmMgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9hbXBvcnRzL3N0cmVhbWJ1Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNjc4NzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9hbXBvcnRzL3N0cmVhbWJ1Zi5jCkBAIC0wLDAgKzEsNDk2IEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL21lZGlhL3N0cmVhbV9pbnB1dC9wYXJzZXIvc3RyZWFtYnVmLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKyNkZWZpbmUgREVCVUcKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9mcmFtZV9zeW5jL3B0c3NlcnYuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL3Zmb3JtYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL2lvbWFwLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorLyogI2luY2x1ZGUgPG1hY2gvYW1fcmVncy5oPiAqLworCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy92ZGVjX3JlZy5oPgorI2luY2x1ZGUgIi4uLy4uL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdmRlYy5oIgorI2luY2x1ZGUgInN0cmVhbWJ1Zl9yZWcuaCIKKyNpbmNsdWRlICJzdHJlYW1idWYuaCIKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL2FtcG9ydHNfY29uZmlnLmg+CisjaW5jbHVkZSAiLi4vYW1wb3J0cy9hbXBvcnRzX3ByaXYuaCIKKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1jb250aWd1b3VzLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jb2RlY19tbS9jb2RlY19tbS5oPgorCisjZGVmaW5lIFNUQlVGX1NJWkUgICAoNjQqMTAyNCkKKyNkZWZpbmUgU1RCVUZfV0FJVF9JTlRFUlZBTCAgKEhaLzEwMCkKKyNkZWZpbmUgTUVNX05BTUUgInN0cmVhbWJ1ZiIKKwordm9pZCAqZmV0Y2hidWYgPSAwOworCitzdGF0aWMgczMyIF9zdGJ1Zl9hbGxvYyhzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpidWYsIGJvb2wgaXNfc2VjdXJlKQoreworCWlmIChidWYtPmJ1Zl9zaXplID09IDApCisJCXJldHVybiAtRU5PQlVGUzsKKworCXdoaWxlIChidWYtPmJ1Zl9zdGFydCA9PSAwKSB7CisJCWludCBmbGFncyA9IENPREVDX01NX0ZMQUdTX0RNQTsKKworCQlidWYtPmJ1Zl9wYWdlX251bSA9IFBBR0VfQUxJR04oYnVmLT5idWZfc2l6ZSkgLyBQQUdFX1NJWkU7CisJCWlmIChidWYtPnR5cGUgPT0gQlVGX1RZUEVfU1VCVElUTEUpCisJCQlmbGFncyA9IENPREVDX01NX0ZMQUdTX0RNQV9DUFU7CisKKwkJLyoKKwkJICppZiA0aywKKwkJICp1c2VkIGNtYSBmaXJzdCxmb3IgbGVzcyBtZW0gZnJhZ21lbnRzLgorCQkgKi8KKwkJaWYgKCgoYnVmLT50eXBlID09IEJVRl9UWVBFX0hFVkMpIHx8CisJCQkoYnVmLT50eXBlID09IEJVRl9UWVBFX1ZJREVPKSkgJiYKKwkJCWJ1Zi0+Zm9yXzRrKQorCQkJZmxhZ3MgfD0gQ09ERUNfTU1fRkxBR1NfQ01BX0ZJUlNUOworCQlpZiAoYnVmLT5idWZfc2l6ZSA+IDIwICogMTAyNCAqIDEwMjQpCisJCQlmbGFncyB8PSBDT0RFQ19NTV9GTEFHU19DTUFfRklSU1Q7CisKKwkJaWYgKChidWYtPnR5cGUgPT0gQlVGX1RZUEVfSEVWQykgfHwKKwkJCShidWYtPnR5cGUgPT0gQlVGX1RZUEVfVklERU8pKSB7CisJCQlmbGFncyB8PSBDT0RFQ19NTV9GTEFHU19GT1JfVkRFQ09ERVI7CisJCX0gZWxzZSBpZiAoYnVmLT50eXBlID09IEJVRl9UWVBFX0FVRElPKSB7CisJCQlmbGFncyB8PSBDT0RFQ19NTV9GTEFHU19GT1JfQURFQ09ERVI7CisJCQlmbGFncyB8PSBDT0RFQ19NTV9GTEFHU19ETUFfQ1BVOworCQl9CisKKwkJaWYgKGlzX3NlY3VyZSkKKwkJCWZsYWdzIHw9IENPREVDX01NX0ZMQUdTX1RWUDsKKworCQlidWYtPmJ1Zl9zdGFydCA9IGNvZGVjX21tX2FsbG9jX2Zvcl9kbWEoTUVNX05BTUUsCisJCQlidWYtPmJ1Zl9wYWdlX251bSwgNCtQQUdFX1NISUZULCBmbGFncyk7CisJCWlmICghYnVmLT5idWZfc3RhcnQpIHsKKwkJCWludCBpc192aWRlbyA9IChidWYtPnR5cGUgPT0gQlVGX1RZUEVfSEVWQykgfHwKKwkJCQkJKGJ1Zi0+dHlwZSA9PSBCVUZfVFlQRV9WSURFTyk7CisJCQlpZiAoaXNfdmlkZW8gJiYgYnVmLT5idWZfc2l6ZSA+PSA5ICogU1pfMU0pIHsvKm1pbiA2TSovCisJCQkJaW50IG9sZF9zaXplID0gYnVmLT5idWZfc2l6ZTsKKworCQkJCWJ1Zi0+YnVmX3NpemUgID0KKwkJCQkJUEFHRV9BTElHTihidWYtPmJ1Zl9zaXplICogMi8zKTsKKwkJCQlwcl9pbmZvKCIlcyBzdGJ1ZiBhbGxvY2VkIHNpemUgPSAlZCBmYWlsZWQgdHJ5IHNtYWxsICVkIHNpemVcbiIsCisJCQkJKGJ1Zi0+dHlwZSA9PSBCVUZfVFlQRV9IRVZDKSA/ICJIRVZDIiA6CisJCQkJKGJ1Zi0+dHlwZSA9PSBCVUZfVFlQRV9WSURFTykgPyAiVmlkZW8iIDoKKwkJCQkoYnVmLT50eXBlID09IEJVRl9UWVBFX0FVRElPKSA/ICJBdWRpbyIgOgorCQkJCSJTdWJ0aXRsZSIsIG9sZF9zaXplLCBidWYtPmJ1Zl9zaXplKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXByX2luZm8oIiVzIHN0YnVmIGFsbG9jZWQgc2l6ZSA9ICVkIGZhaWxlZFxuIiwKKwkJCQkoYnVmLT50eXBlID09IEJVRl9UWVBFX0hFVkMpID8gIkhFVkMiIDoKKwkJCQkoYnVmLT50eXBlID09IEJVRl9UWVBFX1ZJREVPKSA/ICJWaWRlbyIgOgorCQkJCShidWYtPnR5cGUgPT0gQlVGX1RZUEVfQVVESU8pID8gIkF1ZGlvIiA6CisJCQkJIlN1YnRpdGxlIiwgYnVmLT5idWZfc2l6ZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWJ1Zi0+aXNfc2VjdXJlID0gaXNfc2VjdXJlOworCisJCXByX2RlYnVnKCIlcyBzdGJ1ZiBhbGxvY2VkIGF0ICVwLCBzZWN1cmUgPSAlZCwgc2l6ZSA9ICVkXG4iLAorCQkJCShidWYtPnR5cGUgPT0gQlVGX1RZUEVfSEVWQykgPyAiSEVWQyIgOgorCQkJCShidWYtPnR5cGUgPT0gQlVGX1RZUEVfVklERU8pID8gIlZpZGVvIiA6CisJCQkJKGJ1Zi0+dHlwZSA9PSBCVUZfVFlQRV9BVURJTykgPyAiQXVkaW8iIDoKKwkJCQkiU3VidGl0bGUiLCAodm9pZCAqKWJ1Zi0+YnVmX3N0YXJ0LAorCQkJCWJ1Zi0+aXNfc2VjdXJlLAorCQkJCWJ1Zi0+YnVmX3NpemUpOworCX0KKworCWJ1Zi0+Y2FudXNlYnVmX3NpemUgPSBidWYtPmJ1Zl9zaXplOworCWJ1Zi0+ZmxhZyB8PSBCVUZfRkxBR19BTExPQzsKKworCXJldHVybiAwOworfQorCitpbnQgc3RidWZfY2hhbmdlX3NpemUoc3RydWN0IHN0cmVhbV9idWZfcyAqYnVmLCBpbnQgc2l6ZSwgYm9vbCBpc19zZWN1cmUpCit7CisJdW5zaWduZWQgbG9uZyBvbGRfYnVmOworCWludCBvbGRfc2l6ZSwgb2xkX3BhZ2VudW07CisJaW50IHJldDsKKworCXByX2luZm8oImJ1ZmZlcnNpemU9JWQsJWQsc3RhcnQ9JXAsIHNlY3VyZT0lZFxuIiwgc2l6ZSwgYnVmLT5idWZfc2l6ZSwKKwkJCSh2b2lkICopYnVmLT5idWZfc3RhcnQsIGlzX3NlY3VyZSk7CisKKwlpZiAoYnVmLT5idWZfc2l6ZSA9PSBzaXplICYmIGJ1Zi0+YnVmX3N0YXJ0ICE9IDApCisJCXJldHVybiAwOworCisJb2xkX2J1ZiA9IGJ1Zi0+YnVmX3N0YXJ0OworCW9sZF9zaXplID0gYnVmLT5idWZfc2l6ZTsKKwlvbGRfcGFnZW51bSA9IGJ1Zi0+YnVmX3BhZ2VfbnVtOworCWJ1Zi0+YnVmX3N0YXJ0ID0gMDsKKwlidWYtPmJ1Zl9zaXplID0gc2l6ZTsKKwlyZXQgPSBzaXplOworCisJaWYgKHNpemUgPT0gMCB8fAorCQlfc3RidWZfYWxsb2MoYnVmLCBpc19zZWN1cmUpID09IDApIHsKKwkJLyoKKwkJICogc2l6ZT0wOldlIG9ubHkgZnJlZSB0aGUgb2xkIG1lbW9yeTsKKwkJICogYWxsb2Mgb2ssY2hhbmdlZCB0byBuZXcgYnVmZmVyCisJCSAqLworCQlpZiAob2xkX2J1ZiAhPSAwKSB7CisJCQljb2RlY19tbV9mcmVlX2Zvcl9kbWEoTUVNX05BTUUsIG9sZF9idWYpOworCQl9CisKKwkJaWYgKHNpemUgPT0gMCkKKwkJCWJ1Zi0+aXNfc2VjdXJlID0gZmFsc2U7CisKKwkJcHJfaW5mbygiY2hhbmdlZCB0aGUgKCVkKSBidWZmZXIgc2l6ZSBmcm9tICVkIHRvICVkXG4iLAorCQkJCWJ1Zi0+dHlwZSwgb2xkX3NpemUsIHNpemUpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKiBhbGxvYyBmYWlsZWQgKi8KKwkJYnVmLT5idWZfc3RhcnQgPSBvbGRfYnVmOworCQlidWYtPmJ1Zl9zaXplID0gb2xkX3NpemU7CisJCWJ1Zi0+YnVmX3BhZ2VfbnVtID0gb2xkX3BhZ2VudW07CisJCXByX2luZm8oImNoYW5nZWQgdGhlICglZCkgYnVmZmVyIHNpemUgZnJvbSAlZCB0byAlZCxmYWlsZWRcbiIsCisJCQkJYnVmLT50eXBlLCBvbGRfc2l6ZSwgc2l6ZSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworaW50IHN0YnVmX2ZldGNoX2luaXQodm9pZCkKK3sKKwlpZiAoTlVMTCAhPSBmZXRjaGJ1ZikKKwkJcmV0dXJuIDA7CisKKwlmZXRjaGJ1ZiA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLAorCQkJCQkJZ2V0X29yZGVyKEZFVENIQlVGX1NJWkUpKTsKKworCWlmICghZmV0Y2hidWYpIHsKKwkJcHJfaW5mbygiJXM6IENhbiBub3QgYWxsb2NhdGUgZmV0Y2ggd29ya2luZyBidWZmZXJcbiIsCisJCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHN0YnVmX2ZldGNoX2luaXQpOworCit2b2lkIHN0YnVmX2ZldGNoX3JlbGVhc2Uodm9pZCkKK3sKKwlpZiAoMCAmJiBmZXRjaGJ1ZikgeworCQkvKiBhbHdheXMgZG9uJ3QgZnJlZS5mb3Igc2FmZSBhbGxvYy9mcmVlKi8KKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylmZXRjaGJ1ZiwgZ2V0X29yZGVyKEZFVENIQlVGX1NJWkUpKTsKKwkJZmV0Y2hidWYgPSAwOworCX0KK30KKworc3RhdGljIHZvaWQgX3N0YnVmX3RpbWVyX2Z1bmMoc3RydWN0IHRpbWVyX2xpc3QgKmFyZykKK3sKKwlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpwID0gKHN0cnVjdCBzdHJlYW1fYnVmX3MgKilhcmc7CisKKwlpZiAoc3RidWZfc3BhY2UocCkgPCBwLT53Y250KSB7CisJCXAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgU1RCVUZfV0FJVF9JTlRFUlZBTDsKKworCQlhZGRfdGltZXIoJnAtPnRpbWVyKTsKKwl9IGVsc2UKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwLT53cSk7CisKK30KKwordTMyIHN0YnVmX2xldmVsKHN0cnVjdCBzdHJlYW1fYnVmX3MgKmJ1ZikKK3sKKwlpZiAoKGJ1Zi0+dHlwZSA9PSBCVUZfVFlQRV9IRVZDKSB8fCAoYnVmLT50eXBlID09IEJVRl9UWVBFX1ZJREVPKSkgeworCQlpZiAoYnVmLT5ub19wYXJzZXIpIHsKKwkJCWludCBsZXZlbCA9IGJ1Zi0+YnVmX3dwIC0gYnVmLT5idWZfcnA7CisJCQlpZiAobGV2ZWwgPCAwKQorCQkJCWxldmVsICs9IGJ1Zi0+YnVmX3NpemU7CisJCQlyZXR1cm4gbGV2ZWw7CisJCX0gZWxzZSB7CisJCQlpZiAoUkVBRF9QQVJTRVJfUkVHKFBBUlNFUl9FU19DT05UUk9MKSAmIDEpIHsKKwkJCQlpbnQgbGV2ZWwgPSBSRUFEX1BBUlNFUl9SRUcoUEFSU0VSX1ZJREVPX1dQKSAtCisJCQkJCVJFQURfUEFSU0VSX1JFRyhQQVJTRVJfVklERU9fUlApOworCQkJCWlmIChsZXZlbCA8IDApCisJCQkJCWxldmVsICs9IFJFQURfUEFSU0VSX1JFRyhQQVJTRVJfVklERU9fRU5EX1BUUikgLQorCQkJCQlSRUFEX1BBUlNFUl9SRUcoUEFSU0VSX1ZJREVPX1NUQVJUX1BUUikgKyA4OworCQkJCXJldHVybiAodTMyKWxldmVsOworCQkJfSBlbHNlCisJCQkJcmV0dXJuIChidWYtPnR5cGUgPT0gQlVGX1RZUEVfSEVWQykgPworCQkJCQlSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fTEVWRUwpIDoKKwkJCQkJX1JFQURfU1RfUkVHKExFVkVMKTsKKwkJfQorCX0KKworCXJldHVybiBfUkVBRF9TVF9SRUcoTEVWRUwpOworfQorCit1MzIgc3RidWZfcnAoc3RydWN0IHN0cmVhbV9idWZfcyAqYnVmKQoreworCWlmICgoYnVmLT50eXBlID09IEJVRl9UWVBFX0hFVkMpIHx8IChidWYtPnR5cGUgPT0gQlVGX1RZUEVfVklERU8pKSB7CisJCWlmIChidWYtPm5vX3BhcnNlcikKKwkJCXJldHVybiBidWYtPmJ1Zl9ycDsKKwkJZWxzZSB7CisJCQlpZiAoUkVBRF9QQVJTRVJfUkVHKFBBUlNFUl9FU19DT05UUk9MKSAmIDEpCisJCQkJcmV0dXJuIFJFQURfUEFSU0VSX1JFRyhQQVJTRVJfVklERU9fUlApOworCQkJZWxzZQorCQkJCXJldHVybiAoYnVmLT50eXBlID09IEJVRl9UWVBFX0hFVkMpID8KKwkJCQkJUkVBRF9WUkVHKEhFVkNfU1RSRUFNX1JEX1BUUikgOgorCQkJCQlfUkVBRF9TVF9SRUcoUlApOworCQl9CisJfQorCisJcmV0dXJuIF9SRUFEX1NUX1JFRyhSUCk7Cit9CisKK3UzMiBzdGJ1Zl9zcGFjZShzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpidWYpCit7CisJLyogcmVzZXJ2ZWQgc3BhY2UgZm9yIHNhZmUgd3JpdGUsCisJICogICB0aGUgcGFyc2VyIGZpZm8gc2l6ZSBpcyAxMDI0Ynl0cywgc28gcmVzZXJ2ZSBpdAorCSAqLworCWludCBzaXplOworCisJc2l6ZSA9IGJ1Zi0+Y2FudXNlYnVmX3NpemUgLSBzdGJ1Zl9sZXZlbChidWYpOworCisJaWYgKGJ1Zi0+Y2FudXNlYnVmX3NpemUgPj0gYnVmLT5idWZfc2l6ZSAvIDIpIHsKKwkJLyogb2xkIHJldmVyc2VkIHZhbHVlLHRvYmUgZnVsbCwgcmV2ZXJzZWQgb25seS4uLiAqLworCQlzaXplID0gc2l6ZSAtIDYgKiAxMDI0OworCX0KKworCWlmICghYnVmLT5ub19wYXJzZXIpIHsKKwkJaWYgKChidWYtPnR5cGUgPT0gQlVGX1RZUEVfVklERU8pCisJCQl8fCAoaGFzX2hldmNfdmRlYygpICYmIGJ1Zi0+dHlwZSA9PSBCVUZfVFlQRV9IRVZDKSkKKwkJCXNpemUgLT0gUkVBRF9QQVJTRVJfUkVHKFBBUlNFUl9WSURFT19IT0xFKTsKKwl9CisJcmV0dXJuIHNpemUgPiAwID8gc2l6ZSA6IDA7Cit9CisKK3UzMiBzdGJ1Zl9zaXplKHN0cnVjdCBzdHJlYW1fYnVmX3MgKmJ1ZikKK3sKKwlyZXR1cm4gYnVmLT5idWZfc2l6ZTsKK30KKwordTMyIHN0YnVmX2NhbnVzZXNpemUoc3RydWN0IHN0cmVhbV9idWZfcyAqYnVmKQoreworCXJldHVybiBidWYtPmNhbnVzZWJ1Zl9zaXplOworfQorCitzMzIgc3RidWZfaW5pdChzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpidWYsIHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJczMyIHI7CisJdTMyIGR1bW15OworCXUzMiBhZGRyMzI7CisKKwlWREVDX1BSSU5UX0ZVTl9MSU5FTk8oX19mdW5jX18sIF9fTElORV9fKTsKKworCWlmICghYnVmLT5idWZfc3RhcnQpIHsKKwkJciA9IF9zdGJ1Zl9hbGxvYyhidWYsICh2ZGVjKSA/CisJCQl2ZGVjLT5wb3J0X2ZsYWcgJiBQT1JUX0ZMQUdfRFJNIDogMCk7CisJCWlmIChyIDwgMCkKKwkJCXJldHVybiByOworCX0KKwlhZGRyMzIgPSBidWYtPmJ1Zl9zdGFydCAmIDB4ZmZmZmZmZmY7CisJYnVmLT51c2VfcHRzc2VydiA9IHRydWU7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYnVmLT53cSk7CisKKwkvKgorCSAqIEZvciBtdWx0aWRlYywgZG8gbm90IHRvdWNoIEhXIHN0cmVhbSBidWZmZXJzIGR1cmluZyBwb3J0CisJICogaW5pdCBhbmQgcmVsZWFzZS4KKwkgKi8KKwlpZiAoKGJ1Zi0+dHlwZSA9PSBCVUZfVFlQRV9WSURFTykgfHwgKGJ1Zi0+dHlwZSA9PSBCVUZfVFlQRV9IRVZDKSkgeworCQlpZiAodmRlYykgeworCQkJaWYgKHZkZWNfc3RyZWFtX2Jhc2VkKHZkZWMpKQorCQkJCXZkZWNfc2V0X2lucHV0X2J1ZmZlcih2ZGVjLCBhZGRyMzIsCisJCQkJCQlidWYtPmJ1Zl9zaXplKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gdmRlY19zZXRfaW5wdXRfYnVmZmVyKHZkZWMsIGFkZHIzMiwKKwkJCQkJCWJ1Zi0+YnVmX3NpemUpOworCQl9CisJfQorCisJYnVmLT53cml0ZV90aHJlYWQgPSAwOworCWlmICgoKHZkZWMgJiYgIXZkZWNfc2luZ2xlKHZkZWMpKSB8fCAoYnVmLT5pc19tdWx0aV9pbnN0KSkgJiYKKwkJKHZkZWNfZ2V0X2RlYnVnX2ZsYWdzKCkgJiAweDIpID09IDApCisJCXJldHVybiAwOworCWlmIChoYXNfaGV2Y192ZGVjKCkgJiYgYnVmLT50eXBlID09IEJVRl9UWVBFX0hFVkMpIHsKKwkJQ0xFQVJfVlJFR19NQVNLKEhFVkNfU1RSRUFNX0NPTlRST0wsIDEpOworCQlXUklURV9WUkVHKEhFVkNfU1RSRUFNX1NUQVJUX0FERFIsIGFkZHIzMik7CisJCVdSSVRFX1ZSRUcoSEVWQ19TVFJFQU1fRU5EX0FERFIsIGFkZHIzMiArIGJ1Zi0+YnVmX3NpemUpOworCQlXUklURV9WUkVHKEhFVkNfU1RSRUFNX1JEX1BUUiwgYWRkcjMyKTsKKwkJV1JJVEVfVlJFRyhIRVZDX1NUUkVBTV9XUl9QVFIsIGFkZHIzMik7CisKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGJ1Zi0+dHlwZSA9PSBCVUZfVFlQRV9WSURFTykgeworCQlWREVDX1BSSU5UX0ZVTl9MSU5FTk8oX19mdW5jX18sIF9fTElORV9fKTsKKworCQlfV1JJVEVfU1RfUkVHKENPTlRST0wsIDApOworCQkvKiByZXNldCBWTEQgYmVmb3JlIHNldHRpbmcgYWxsIHBvaW50ZXJzICovCisJCVdSSVRFX1ZSRUcoVkxEX01FTV9WSUZJRk9fV1JBUF9DT1VOVCwgMCk7CisJCS8qVE9ETzogb25seSA+IG02Ki8KKyNpZiAxLyogTUVTT05fQ1BVX1RZUEUgPj0gTUVTT05fQ1BVX1RZUEVfTUVTT042ICovCisJCVdSSVRFX1ZSRUcoRE9TX1NXX1JFU0VUMCwgKDEgPDwgNCkpOworCQlXUklURV9WUkVHKERPU19TV19SRVNFVDAsIDApOworI2Vsc2UKKwkJV1JJVEVfUkVTRVRfUkVHKFJFU0VUMF9SRUdJU1RFUiwgUkVTRVRfVkxEKTsKKyNlbmRpZgorCisJCWR1bW15ID0gUkVBRF9SRVNFVF9SRUcoUkVTRVQwX1JFR0lTVEVSKTsKKwkJV1JJVEVfVlJFRyhQT1dFUl9DVExfVkxELCAxIDw8IDQpOworCX0gZWxzZSBpZiAoYnVmLT50eXBlID09IEJVRl9UWVBFX0FVRElPKSB7CisJCV9XUklURV9TVF9SRUcoQ09OVFJPTCwgMCk7CisKKwkJV1JJVEVfQUlVX1JFRyhBSVVfQUlGSUZPX0dCSVQsIDB4ODApOworCX0KKworCWlmIChidWYtPnR5cGUgPT0gQlVGX1RZUEVfU1VCVElUTEUpIHsKKwkJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfU1VCX1JQLCBhZGRyMzIpOworCQlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9TVUJfU1RBUlRfUFRSLCBhZGRyMzIpOworCQlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9TVUJfRU5EX1BUUiwKKwkJCQkJICAgYWRkcjMyICsgYnVmLT5idWZfc2l6ZSAtIDgpOworCisJCXJldHVybiAwOworCX0KKworCV9XUklURV9TVF9SRUcoU1RBUlRfUFRSLCBhZGRyMzIpOworCV9XUklURV9TVF9SRUcoQ1VSUl9QVFIsIGFkZHIzMik7CisJX1dSSVRFX1NUX1JFRyhFTkRfUFRSLCBhZGRyMzIgKyBidWYtPmJ1Zl9zaXplIC0gOCk7CisKKwlfU0VUX1NUX1JFR19NQVNLKENPTlRST0wsIE1FTV9CVUZDVFJMX0lOSVQpOworCV9DTFJfU1RfUkVHX01BU0soQ09OVFJPTCwgTUVNX0JVRkNUUkxfSU5JVCk7CisKKwlfV1JJVEVfU1RfUkVHKEJVRl9DVFJMLCBNRU1fQlVGQ1RSTF9NQU5VQUwpOworCV9XUklURV9TVF9SRUcoV1AsIGFkZHIzMik7CisKKwlfU0VUX1NUX1JFR19NQVNLKEJVRl9DVFJMLCBNRU1fQlVGQ1RSTF9JTklUKTsKKwlfQ0xSX1NUX1JFR19NQVNLKEJVRl9DVFJMLCBNRU1fQlVGQ1RSTF9JTklUKTsKKworCV9TRVRfU1RfUkVHX01BU0soQ09OVFJPTCwKKwkJCSgweDExIDw8IDE2KSB8IE1FTV9GSUxMX09OX0xFVkVMIHwgTUVNX0NUUkxfRklMTF9FTiB8CisJCQlNRU1fQ1RSTF9FTVBUWV9FTik7CisKKwlpZiAoYnVmLT5ub19wYXJzZXIpCisJCV9TRVRfU1RfUkVHX01BU0soQ09OVFJPTCwgNyA8PCAzKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChzdGJ1Zl9pbml0KTsKKwordm9pZCBzdGJ1Zl92ZGVjMl9pbml0KHN0cnVjdCBzdHJlYW1fYnVmX3MgKmJ1ZikKK3sKKworCV9XUklURV9WREVDMl9TVF9SRUcoQ09OVFJPTCwgMCk7CisKKwlfV1JJVEVfVkRFQzJfU1RfUkVHKFNUQVJUX1BUUiwgX1JFQURfU1RfUkVHKFNUQVJUX1BUUikpOworCV9XUklURV9WREVDMl9TVF9SRUcoRU5EX1BUUiwgX1JFQURfU1RfUkVHKEVORF9QVFIpKTsKKwlfV1JJVEVfVkRFQzJfU1RfUkVHKENVUlJfUFRSLCBfUkVBRF9TVF9SRUcoQ1VSUl9QVFIpKTsKKworCV9XUklURV9WREVDMl9TVF9SRUcoQ09OVFJPTCwgTUVNX0ZJTExfT05fTEVWRUwgfCBNRU1fQlVGQ1RSTF9JTklUKTsKKwlfV1JJVEVfVkRFQzJfU1RfUkVHKENPTlRST0wsIE1FTV9GSUxMX09OX0xFVkVMKTsKKworCV9XUklURV9WREVDMl9TVF9SRUcoQlVGX0NUUkwsIE1FTV9CVUZDVFJMX0lOSVQpOworCV9XUklURV9WREVDMl9TVF9SRUcoQlVGX0NUUkwsIDApOworCisJX1dSSVRFX1ZERUMyX1NUX1JFRyhDT05UUk9MLAorCQkJKDB4MTEgPDwgMTYpIHwgTUVNX0ZJTExfT05fTEVWRUwgfCBNRU1fQ1RSTF9GSUxMX0VOCisJCQl8IE1FTV9DVFJMX0VNUFRZX0VOKTsKK30KKworczMyIHN0YnVmX3dhaXRfc3BhY2Uoc3RydWN0IHN0cmVhbV9idWZfcyAqc3RyZWFtX2J1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzdHJlYW1fYnVmX3MgKnAgPSBzdHJlYW1fYnVmOworCWxvbmcgdGltZV9vdXQgPSAyMDA7CisKKwlwLT53Y250ID0gY291bnQ7CisKKwl0aW1lcl9zZXR1cCgmcC0+dGltZXIsIF9zdGJ1Zl90aW1lcl9mdW5jLCAodWxvbmcpIHApOworCisJbW9kX3RpbWVyKCZwLT50aW1lciwgamlmZmllcyArIFNUQlVGX1dBSVRfSU5URVJWQUwpOworCisJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0CisJCShwLT53cSwgc3RidWZfc3BhY2UocCkgPj0gY291bnQsCisJCSBtc2Vjc190b19qaWZmaWVzKHRpbWVfb3V0KSkgPT0gMCkgeworCQlkZWxfdGltZXJfc3luYygmcC0+dGltZXIpOworCisJCXJldHVybiAtRUFHQUlOOworCX0KKworCWRlbF90aW1lcl9zeW5jKCZwLT50aW1lcik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzdGJ1Zl9yZWxlYXNlKHN0cnVjdCBzdHJlYW1fYnVmX3MgKmJ1ZikKK3sKKwlpbnQgcjsKKworCWJ1Zi0+Zmlyc3RfdHN0YW1wID0gSU5WQUxJRF9QVFM7CisJaWYgKCFidWYtPmV4dF9idWZfYWRkcikgeworCQlyID0gc3RidWZfaW5pdChidWYsIE5VTEwpOy8qIHJlaW5pdCBidWZmZXIgKi8KKwkJaWYgKHIgPCAwKQorCQkJcHJfZXJyKCJzdGJ1Zl9yZWxlYXNlICVkLCBzdGJ1Zl9pbml0IGZhaWxlZFxuIiwgX19MSU5FX18pOworCX0KKwlpZiAoYnVmLT5mbGFnICYgQlVGX0ZMQUdfQUxMT0MgJiYgYnVmLT5idWZfc3RhcnQpIHsKKwkJY29kZWNfbW1fZnJlZV9mb3JfZG1hKE1FTV9OQU1FLCBidWYtPmJ1Zl9zdGFydCk7CisJCWJ1Zi0+ZmxhZyAmPSB+QlVGX0ZMQUdfQUxMT0M7CisJCWJ1Zi0+YnVmX3N0YXJ0ID0gMDsKKwkJYnVmLT5pc19zZWN1cmUgPSBmYWxzZTsKKwl9CisJYnVmLT5mbGFnICY9IH5CVUZfRkxBR19JTl9VU0U7Cit9CitFWFBPUlRfU1lNQk9MKHN0YnVmX3JlbGVhc2UpOworCit1MzIgc3RidWZfc3ViX3JwX2dldCh2b2lkKQoreworCXJldHVybiBSRUFEX1BBUlNFUl9SRUcoUEFSU0VSX1NVQl9SUCk7Cit9CisKK3ZvaWQgc3RidWZfc3ViX3JwX3NldCh1bnNpZ25lZCBpbnQgc3ViX3JwKQoreworCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX1NVQl9SUCwgc3ViX3JwKTsKKwlyZXR1cm47Cit9CisKK3UzMiBzdGJ1Zl9zdWJfd3BfZ2V0KHZvaWQpCit7CisJcmV0dXJuIFJFQURfUEFSU0VSX1JFRyhQQVJTRVJfU1VCX1dQKTsKK30KKwordTMyIHN0YnVmX3N1Yl9zdGFydF9nZXQodm9pZCkKK3sKKwlyZXR1cm4gUkVBRF9QQVJTRVJfUkVHKFBBUlNFUl9TVUJfU1RBUlRfUFRSKTsKK30KKwordTMyIHBhcnNlcl9nZXRfd3Aoc3RydWN0IHN0cmVhbV9idWZfcyAqdmIpCit7CisJcmV0dXJuIFJFQURfUEFSU0VSX1JFRyhQQVJTRVJfVklERU9fV1ApOworfQorRVhQT1JUX1NZTUJPTChwYXJzZXJfZ2V0X3dwKTsKKwordm9pZCBwYXJzZXJfc2V0X3dwKHN0cnVjdCBzdHJlYW1fYnVmX3MgKnZiLCB1MzIgdmFsKQoreworCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX1ZJREVPX1dQLCB2YWwpOworfQorRVhQT1JUX1NZTUJPTChwYXJzZXJfc2V0X3dwKTsKKwordTMyIHBhcnNlcl9nZXRfcnAoc3RydWN0IHN0cmVhbV9idWZfcyAqdmIpCit7CisJcmV0dXJuIFJFQURfUEFSU0VSX1JFRyhQQVJTRVJfVklERU9fUlApOworfQorRVhQT1JUX1NZTUJPTChwYXJzZXJfZ2V0X3JwKTsKKwordm9pZCBwYXJzZXJfc2V0X3JwKHN0cnVjdCBzdHJlYW1fYnVmX3MgKnZiLCB1MzIgdmFsKQoreworCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX1ZJREVPX1JQLCB2YWwpOworfQorRVhQT1JUX1NZTUJPTChwYXJzZXJfc2V0X3JwKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvYW1wb3J0cy9zdHJlYW1idWYuaCBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L2FtcG9ydHMvc3RyZWFtYnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhmMDkyNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L2FtcG9ydHMvc3RyZWFtYnVmLmgKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvbWVkaWEvc3RyZWFtX2lucHV0L3BhcnNlci9zdHJlYW1idWYuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIFNUUkVBTUJVRl9ICisjZGVmaW5lIFNUUkVBTUJVRl9ICisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy9hbXBvcnRzX2NvbmZpZy5oPgorCisjZGVmaW5lIEJVRl9GTEFHX0FMTE9DICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQlVGX0ZMQUdfSU5fVVNFICAgICAgICAgMHgwMgorI2RlZmluZSBCVUZfRkxBR19QQVJTRVIgICAgICAgICAweDA0CisjZGVmaW5lIEJVRl9GTEFHX0ZJUlNUX1RTVEFNUCAgIDB4MDgKKyNkZWZpbmUgQlVGX0ZMQUdfSU9NRU0gICAgICAgICAgMHgxMAorCisjZGVmaW5lIEJVRl9UWVBFX1ZJREVPICAgICAgMAorI2RlZmluZSBCVUZfVFlQRV9BVURJTyAgICAgIDEKKyNkZWZpbmUgQlVGX1RZUEVfU1VCVElUTEUgICAyCisjZGVmaW5lIEJVRl9UWVBFX1VTRVJEQVRBICAgMworI2RlZmluZSBCVUZfVFlQRV9IRVZDICAgICAgIDQKKyNkZWZpbmUgQlVGX01BWF9OVU0gICAgICAgICA1CisKKyNkZWZpbmUgSU5WQUxJRF9QVFMgMHhmZmZmZmZmZgorCisjZGVmaW5lIEZFVENIQlVGX1NJWkUgICAoNjQqMTAyNCkKKyNkZWZpbmUgVVNFUl9EQVRBX1NJWkUgICg4KjEwMjQpCisKKy8qIHN0cmVhbV9idWZmZXJfbWV0YWluZm8gc3RidWZfZmxhZyAqLworI2RlZmluZSBTVEJVRl9NRVRBX0ZMQUdfU0VDVVJFCQkoMSA8PCAwKQorI2RlZmluZSBTVEJVRl9NRVRBX0ZMQUdfUFRTX1NFUlYJKDEgPDwgMSkJLyogdXNlIHB0cyBzZXJ2ZXIgZmxhZyAqLworI2RlZmluZSBTVEJVRl9NRVRBX0ZMQUdfWFhYMQkJKDEgPDwgMikKKworc3RydWN0IHZkZWNfczsKK3N0cnVjdCBzdHJlYW1fYnVmX3M7CisKK3N0cnVjdCBwYXJzZXJfYXJncyB7CisJdTMyIHZpZDsKKwl1MzIgYWlkOworCXUzMiBzaWQ7CisJdTMyIHBjcmlkOworfTsKKworc3RydWN0IHN0cmVhbV9idWZfb3BzIHsKKwlpbnQgKCppbml0KSAoc3RydWN0IHN0cmVhbV9idWZfcyAqLCBzdHJ1Y3QgdmRlY19zICopOworCXZvaWQgKCpyZWxlYXNlKSAoc3RydWN0IHN0cmVhbV9idWZfcyAqKTsKKwlpbnQgKCp3cml0ZSkgKHN0cnVjdCBzdHJlYW1fYnVmX3MgKiwgY29uc3QgdTggKiwgdTMyKTsKKwl1MzIgKCpnZXRfd3ApIChzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICopOworCXZvaWQgKCpzZXRfd3ApIChzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICosIHUzMik7CisJdTMyICgqZ2V0X3JwKSAoc3RydWN0IHN0cmVhbV9idWZfcyAqKTsKKwl2b2lkICgqc2V0X3JwKSAoc3RydWN0IHN0cmVhbV9idWZfcyAqLCB1MzIpOworfTsKKworc3RydWN0IHN0cmVhbV9idWZfcyB7CisJaW50IGlkOworCXU4IG5hbWVbMTZdOworCXMzMiBmbGFnOworCXUzMiB0eXBlOworCXVuc2lnbmVkIGxvbmcgYnVmX3N0YXJ0OworCXN0cnVjdCBwYWdlICpidWZfcGFnZXM7CisJaW50IGJ1Zl9wYWdlX251bTsKKwl1MzIgYnVmX3NpemU7CisJdTMyIGRlZmF1bHRfYnVmX3NpemU7CisJdTMyIGNhbnVzZWJ1Zl9zaXplOworCXUzMiBmaXJzdF90c3RhbXA7CisJY29uc3QgdWxvbmcgcmVnX2Jhc2U7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd3E7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJdTMyIHdjbnQ7CisJdTMyIGJ1Zl93cDsKKwl1MzIgYnVmX3JwOworCXUzMiBtYXhfYnVmZmVyX2RlbGF5X21zOworCXU2NCBsYXN0X3dyaXRlX2ppZmZpZXM2NDsKKwl2b2lkICp3cml0ZV90aHJlYWQ7CisJaW50IGZvcl80azsKKwlib29sIGlzX3NlY3VyZTsKKwlib29sIGlzX211bHRpX2luc3Q7CisJYm9vbCBub19wYXJzZXI7CisJYm9vbCBpc19waHlidWY7CisJYm9vbCBpc19oZXZjOworCWJvb2wgdXNlX3B0c3NlcnY7CisJdTMyIGRybV9mbGFnOworCXVsb25nIGV4dF9idWZfYWRkcjsKKwlhdG9taWNfdCBwYXlsb2FkOworCXUzMiBzdHJlYW1fb2Zmc2V0OworCXN0cnVjdCBwYXJzZXJfYXJncyBwYXJzOworCXN0cnVjdCBzdHJlYW1fYnVmX29wcyAqb3BzOworCXUzMiBsYXN0X29mZnNldFsyXTsKKwl1MzIgd3JpdGVfY291bnQ7Cit9IC8qc3RyZWFtX2J1Zl90ICovOworCitzdHJ1Y3Qgc3RyZWFtX3BvcnRfcyB7CisJLyogZHJpdmVyIGluZm8gKi8KKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBkZXZpY2UgKmNsYXNzX2RldjsKKwljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzOworCisJLyogcG9ydHMgY29udHJvbCAqLworCXMzMiB0eXBlOworCXMzMiBmbGFnOworCXMzMiBwY3JfaW5pdGVkOworCisJLyogZGVjb2RlciBpbmZvICovCisJczMyIHZmb3JtYXQ7CisJczMyIGFmb3JtYXQ7CisJczMyIGFjaGFubDsKKwlzMzIgYXNhbXByYXRlOworCXMzMiBhZGF0YXdpZHRoOworCisJLyogcGFyc2VyIGluZm8gKi8KKwl1MzIgdmlkOworCXUzMiBhaWQ7CisJdTMyIHNpZDsKKwl1MzIgcGNyaWQ7CisJYm9vbCBpc180azsKK30gLypzdHJlYW1fcG9ydF90ICovOworZW51bSBkcm1fbGV2ZWxfZSB7CisJRFJNX0xFVkVMMSA9IDEsCisJRFJNX0xFVkVMMiA9IDIsCisJRFJNX0xFVkVMMyA9IDMsCisJRFJNX05PTkUgPSA0LAorfTsKKworc3RydWN0IGRybV9pbmZvIHsKKwllbnVtIGRybV9sZXZlbF9lIGRybV9sZXZlbDsKKwl1MzIgZHJtX2ZsYWc7CisJdTMyIGRybV9oYXNlc2RhdGE7CisJdTMyIGRybV9wcml2OworCXUzMiBkcm1fcGt0c2l6ZTsKKwl1MzIgZHJtX3BrdHB0czsKKwl1MzIgZHJtX3BoeTsKKwl1MzIgZHJtX3ZpcjsKKwl1MzIgZHJtX3JlbWFwOworCXUzMiBkYXRhX29mZnNldDsKKwl1MzIgaGFuZGxlOworCXUzMiBleHRwYWRbN107Cit9IC8qZHJtaW5mb190ICovOworCitzdHJ1Y3Qgc3RyZWFtX2J1ZmZlcl9tZXRhaW5mbyB7CisJdW5pb24geworCQl1MzIgc3RidWZfc3RhcnQ7CisJCXUzMiBzdGJ1Zl9wa3RhZGRyOyAvL3N0YnVmX3BrdGFkZHIgKyBzdGJ1Zl9wa3RzaXplID0gd3AKKwl9OworCXVuaW9uIHsKKwkJdTMyIHN0YnVmX3NpemU7CisJCXUzMiBzdGJ1Zl9wa3RzaXplOworCX07CisJdTMyIHN0YnVmX2ZsYWc7CisJdTMyIHN0YnVmX3ByaXZhdGU7CisJdTMyIHJlc2VydmVkWzE2XTsKK307CisKK3N0cnVjdCBzdHJlYW1fYnVmZmVyX3N0YXR1cyB7CisJdTMyIHN0YnVmX3dwOworCXUzMiBzdGJ1Zl9ycDsKKwl1MzIgc3RidWZfc3RhcnQ7CisJdTMyIHN0YnVmX3NpemU7CisJdTMyIHJlc2VydmVkWzE2XTsKK307CisKKworI2RlZmluZSBUWVBFX0RSTUlORk9fVjIgIDB4MTAwCisjZGVmaW5lIFRZUEVfRFJNSU5GTyAgIDB4ODAKKyNkZWZpbmUgVFlQRV9QQVRURVJOICAgMHg0MAorCitzdHJ1Y3QgdmRlY19zOworCitleHRlcm4gdm9pZCAqZmV0Y2hidWY7CisKK2V4dGVybiB1MzIgc3RidWZfbGV2ZWwoc3RydWN0IHN0cmVhbV9idWZfcyAqYnVmKTsKK2V4dGVybiB1MzIgc3RidWZfcnAoc3RydWN0IHN0cmVhbV9idWZfcyAqYnVmKTsKK2V4dGVybiB1MzIgc3RidWZfc3BhY2Uoc3RydWN0IHN0cmVhbV9idWZfcyAqYnVmKTsKK2V4dGVybiB1MzIgc3RidWZfc2l6ZShzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpidWYpOworZXh0ZXJuIHUzMiBzdGJ1Zl9jYW51c2VzaXplKHN0cnVjdCBzdHJlYW1fYnVmX3MgKmJ1Zik7CitleHRlcm4gczMyIHN0YnVmX2luaXQoc3RydWN0IHN0cmVhbV9idWZfcyAqYnVmLCBzdHJ1Y3QgdmRlY19zICp2ZGVjKTsKK2V4dGVybiBzMzIgc3RidWZfd2FpdF9zcGFjZShzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpzdHJlYW1fYnVmLCBzaXplX3QgY291bnQpOworZXh0ZXJuIHZvaWQgc3RidWZfcmVsZWFzZShzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpidWYpOworZXh0ZXJuIGludCBzdGJ1Zl9jaGFuZ2Vfc2l6ZShzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpidWYsIGludCBzaXplLAorCQkJCWJvb2wgaXNfc2VjdXJlKTsKK2V4dGVybiBpbnQgc3RidWZfZmV0Y2hfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHN0YnVmX2ZldGNoX3JlbGVhc2Uodm9pZCk7CitleHRlcm4gdTMyIHN0YnVmX3N1Yl9ycF9nZXQodm9pZCk7CitleHRlcm4gdm9pZCBzdGJ1Zl9zdWJfcnBfc2V0KHVuc2lnbmVkIGludCBzdWJfcnApOworZXh0ZXJuIHUzMiBzdGJ1Zl9zdWJfd3BfZ2V0KHZvaWQpOworZXh0ZXJuIHUzMiBzdGJ1Zl9zdWJfc3RhcnRfZ2V0KHZvaWQpOworZXh0ZXJuIHUzMiBzdGJ1Zl91c2VyZGF0YV9zdGFydF9nZXQodm9pZCk7CitleHRlcm4gc3RydWN0IHN0cmVhbV9idWZfcyAqZ2V0X3N0cmVhbV9idWZmZXIoaW50IGlkKTsKKworZXh0ZXJuIHZvaWQgc3RidWZfdmRlYzJfaW5pdChzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpidWYpOworCit1MzIgcGFyc2VyX2dldF93cChzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICp2Yik7Cit2b2lkIHBhcnNlcl9zZXRfd3Aoc3RydWN0IHN0cmVhbV9idWZfcyAqdmIsIHUzMiB2YWwpOwordTMyIHBhcnNlcl9nZXRfcnAoc3RydWN0IHN0cmVhbV9idWZfcyAqdmIpOwordm9pZCBwYXJzZXJfc2V0X3JwKHN0cnVjdCBzdHJlYW1fYnVmX3MgKnZiLCB1MzIgdmFsKTsKKworI2VuZGlmIC8qIFNUUkVBTUJVRl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0cmVhbV9pbnB1dC9hbXBvcnRzL3N0cmVhbWJ1Zl9yZWcuaCBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L2FtcG9ydHMvc3RyZWFtYnVmX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMGM4Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9hbXBvcnRzL3N0cmVhbWJ1Zl9yZWcuaApAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9tZWRpYS9zdHJlYW1faW5wdXQvcGFyc2VyL3N0cmVhbWJ1Zl9yZWcuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIFNUUkVBTUJVRl9SRUdfSAorI2RlZmluZSBTVFJFQU1CVUZfUkVHX0gKKworI2RlZmluZSBIRVZDX1NUUkVBTV9SRUdfQkFTRSAgICAgICAgSEVWQ19TVFJFQU1fU1RBUlRfQUREUgorCisjZGVmaW5lIFZMRF9NRU1fVklGSUZPX1JFR19CQVNFICAgICBWTERfTUVNX1ZJRklGT19TVEFSVF9QVFIKKyNkZWZpbmUgQUlVX01FTV9BSUZJRk9fUkVHX0JBU0UgICAgIEFJVV9NRU1fQUlGSUZPX1NUQVJUX1BUUgorCisjZGVmaW5lIFNUQVJUX1BUUiAgIDAKKyNkZWZpbmUgQ1VSUl9QVFIgICAgMQorI2RlZmluZSBFTkRfUFRSICAgICAyCisjZGVmaW5lIEJZVEVTX0FWQUlMIDMKKyNkZWZpbmUgQ09OVFJPTCAgICAgNAorI2RlZmluZSBXUCAgICAgICAgICA1CisjZGVmaW5lIFJQICAgICAgICAgIDYKKyNkZWZpbmUgTEVWRUwgICAgICAgNworI2RlZmluZSBCVUZfQ1RSTCAgICA4CisKKy8qCisgKiNpZiBNRVNPTl9DUFVfVFlQRSA+PSBNRVNPTl9DUFVfVFlQRV9NRVNPTjYKKyAqI2RlZmluZSBfV1JJVEVfU1RfUkVHKHIsIHZhbCkgXAorICogICAgX19yYXdfd3JpdGVsKHZhbCwgKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqKShidWYtPnJlZ19iYXNlKyhyPDwyKSkpCisgKiNkZWZpbmUgX1dSSVRFX1NUX1JFR19CSVRTKHIsIHZhbCwgcywgZSkgXAorICogICAgX19yYXdfd3JpdGVsKCgoKF9SRUFEX1NUX1JFRyhyKSAmIFwKKyAqICAgICgoKDFMPDwoZSktMSk8PChzKSktMSk8PChzKSkpfCgodW5zaWduZWQpKCh2YWwpJigoMUw8PChlKSktMSkpPDwocykpKSwgXAorICogICAgKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqKShidWYtPnJlZ19iYXNlKyhyPDwyKSkpCisgKiNkZWZpbmUgX1NFVF9TVF9SRUdfTUFTSyhyLCB2YWwpIFwKKyAqICAgIF9fcmF3X3dyaXRlbChfUkVBRF9TVF9SRUcocil8ICh2YWwpLCBcCisgKiAgICAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICopKGJ1Zi0+cmVnX2Jhc2UrKHI8PDIpKSkKKyAqI2RlZmluZSBfQ0xSX1NUX1JFR19NQVNLKHIsIHZhbCkgXAorICogICAgX19yYXdfd3JpdGVsKF9SRUFEX1NUX1JFRyhyKSZ+KHZhbCksIFwKKyAqICAgICh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKikoYnVmLT5yZWdfYmFzZSsocjw8MikpKQorICojZGVmaW5lIF9SRUFEX1NUX1JFRyhyKSBcCisgKiAgICAoX19yYXdfcmVhZGwoKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqKShidWYtPnJlZ19iYXNlKyhyPDwyKSkpKQorICoKKyAqI2lmIE1FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09ONlRWRAorICojZGVmaW5lIF9SRUFEX1ZERUMyX1NUX1JFRyhyKSBcCisgKiAgICAoX19yYXdfcmVhZGwoKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqKShidWYtPnJlZ19iYXNlICsgXAorICogICAgRE9TX1JFR19BRERSKFZERUMyX1ZMRF9NRU1fVklGSUZPX1NUQVJUX1BUUikgLSBcCisgKiAgICBET1NfUkVHX0FERFIoVkxEX01FTV9WSUZJRk9fU1RBUlRfUFRSKSArIChyPDwyKSkpKQorICojZGVmaW5lIF9XUklURV9WREVDMl9TVF9SRUcociwgdmFsKSBcCisgKiAgICBfX3Jhd193cml0ZWwodmFsLCAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICopKGJ1Zi0+cmVnX2Jhc2UgKyBcCisgKiAgICBET1NfUkVHX0FERFIoVkRFQzJfVkxEX01FTV9WSUZJRk9fU1RBUlRfUFRSKSAtIFwKKyAqICAgIERPU19SRUdfQUREUihWTERfTUVNX1ZJRklGT19TVEFSVF9QVFIpICsgKHI8PDIpKSkKKyAqI2VuZGlmCisgKgorICojZGVmaW5lIE1FTV9CVUZDVFJMX01BTlVBTCAgICAgICgxPDwxKQorICojZGVmaW5lIE1FTV9CVUZDVFJMX0lOSVQgICAgICAgICgxPDwwKQorICojZGVmaW5lIE1FTV9MRVZFTF9DTlRfQklUICAgICAgIDE4CisgKiNkZWZpbmUgTUVNX0ZJRk9fQ05UX0JJVCAgICAgICAgMTYKKyAqI2RlZmluZSBNRU1fRklMTF9PTl9MRVZFTCAgICAgICAoMTw8MTApCisgKiNkZWZpbmUgTUVNX0NUUkxfRU1QVFlfRU4gICAgICAgKDE8PDIpCisgKiNkZWZpbmUgTUVNX0NUUkxfRklMTF9FTiAgICAgICAgKDE8PDEpCisgKiNkZWZpbmUgTUVNX0NUUkxfSU5JVCAgICAgICAgICAgKDE8PDApCisgKgorICojZWxzZQorICojZGVmaW5lIF9XUklURV9TVF9SRUcociwgdmFsKSBcCisgKldSSVRFX01QRUdfUkVHKGJ1Zi0+cmVnX2Jhc2UgKyAociksIFwKKyAqCQkJCQkJKHZhbCkpCisgKiNkZWZpbmUgX1dSSVRFX1NUX1JFR19CSVRTKHIsIHZhbCwgcywgZSlcCisgKiBXUklURV9NUEVHX1JFRyhidWYtPnJlZ19iYXNlICsgKHIpLCBcCisgKgkJCQkJCSh2YWwpLCAocyksIChlKSkKKyAqI2RlZmluZSBfU0VUX1NUX1JFR19NQVNLKHIsIHZhbCkgU0VUX01QRUdfUkVHX01BU0soYnVmLT5yZWdfYmFzZSArIFwKKyAqCQkJCQkJKHIpLCAodmFsKSkKKyAqI2RlZmluZSBfQ0xSX1NUX1JFR19NQVNLKHIsIHZhbCkgIENMRUFSX01QRUdfUkVHX01BU0soYnVmLT5yZWdfYmFzZSArIFwKKyAqCQkJCQkJKHIpLCAodmFsKSkKKyAqI2RlZmluZSBfUkVBRF9TVF9SRUcocikgUkVBRF9NUEVHX1JFRyhidWYtPnJlZ19iYXNlICsgKHIpKQorICojZW5kaWYKKyAqLworCisgLypUT0RPKi8KKyNkZWZpbmUgX1dSSVRFX1NUX1JFRyhyLCB2YWwpICBkbyB7IFwKKwlpZiAoYnVmLT5yZWdfYmFzZSA9PSBWTERfTUVNX1ZJRklGT19SRUdfQkFTRSkgXAorCQljb2RlY19kb3NidXNfd3JpdGUoKGJ1Zi0+cmVnX2Jhc2UrKHIpKSwgKHZhbCkpOyBcCisJZWxzZSBcCisJCWNvZGVjX2FpdWJ1c193cml0ZSgoYnVmLT5yZWdfYmFzZSsocikpLCAodmFsKSk7IFwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBfUkVBRF9TVF9SRUcocikgXAorCSgoYnVmLT5yZWdfYmFzZSA9PSBWTERfTUVNX1ZJRklGT19SRUdfQkFTRSkgPyBcCisJIGNvZGVjX2Rvc2J1c19yZWFkKGJ1Zi0+cmVnX2Jhc2UrKHIpKSA6IFwKKwkgY29kZWNfYWl1YnVzX3JlYWQoYnVmLT5yZWdfYmFzZSsocikpKQorCisjZGVmaW5lIF9TRVRfU1RfUkVHX01BU0sociwgdmFsKSBfV1JJVEVfU1RfUkVHKHIsIF9SRUFEX1NUX1JFRyhyKSB8ICh2YWwpKQorI2RlZmluZSBfQ0xSX1NUX1JFR19NQVNLKHIsIHZhbCkgX1dSSVRFX1NUX1JFRyhyLCBfUkVBRF9TVF9SRUcocikmfih2YWwpKQorI2RlZmluZSBfUkVBRF9WREVDMl9TVF9SRUcocikgKGNvZGVjX2Rvc2J1c19yZWFkKFwKKwkJCShWREVDMl9WTERfTUVNX1ZJRklGT19TVEFSVF9QVFIrKHIpKSkpCisjZGVmaW5lIF9XUklURV9WREVDMl9TVF9SRUcociwgdmFsKSBjb2RlY19kb3NidXNfd3JpdGUoXAorCQkoVkRFQzJfVkxEX01FTV9WSUZJRk9fU1RBUlRfUFRSK3IpLCB2YWwpCisjZGVmaW5lIE1FTV9CVUZDVFJMX01BTlVBTCAgICAgICgxPDwxKQorI2RlZmluZSBNRU1fQlVGQ1RSTF9JTklUICAgICAgICAoMTw8MCkKKyNkZWZpbmUgTUVNX0xFVkVMX0NOVF9CSVQgICAgICAgMTgKKyNkZWZpbmUgTUVNX0ZJRk9fQ05UX0JJVCAgICAgICAgMTYKKyNkZWZpbmUgTUVNX0ZJTExfT05fTEVWRUwgICAgICAgKDE8PDEwKQorI2RlZmluZSBNRU1fQ1RSTF9FTVBUWV9FTiAgICAgICAoMTw8MikKKyNkZWZpbmUgTUVNX0NUUkxfRklMTF9FTiAgICAgICAgKDE8PDEpCisjZGVmaW5lIE1FTV9DVFJMX0lOSVQgICAgICAgICAgICgxPDwwKQorI2VuZGlmIC8qIFNUUkVBTUJVRl9SRUdfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvYW1wb3J0cy90aHJlYWRfcncuYyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L2FtcG9ydHMvdGhyZWFkX3J3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQzODZjZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L2FtcG9ydHMvdGhyZWFkX3J3LmMKQEAgLTAsMCArMSw2MzAgQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvbWVkaWEvc3RyZWFtX2lucHV0L3BhcnNlci90aHJlYWRfcncuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1jb250aWd1b3VzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvY29kZWNfbW0vY29kZWNfbW0uaD4KKworLyogI2luY2x1ZGUgPG1hY2gvYW1fcmVncy5oPiAqLworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlICJzdHJlYW1idWYuaCIKKyNpbmNsdWRlICJhbXBvcnRzX3ByaXYuaCIKKyNpbmNsdWRlICJ0aHJlYWRfcncuaCIKKworI2RlZmluZSBCVUZfTkFNRSAiZmV0Y2hidWYiCisKKyNkZWZpbmUgREVGQVVMVF9CTE9DS19TSVpFICg2NCoxMDI0KQorCitzdHJ1Y3QgdGhyZWFkcndfYnVmIHsKKwl2b2lkICp2YnVmZmVyOworCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKKwlpbnQgd3JpdGVfb2ZmOworCWludCBkYXRhX3NpemU7CisJaW50IGJ1ZmZlcl9zaXplOworCWludCBmcm9tX2NtYTsKK307CisKKyNkZWZpbmUgTUFYX01NX0JVRkZFUl9OVU0gMTYKK3N0cnVjdCB0aHJlYWRyd193cml0ZV90YXNrIHsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHdyaXRlX3dvcms7CisJREVDTEFSRV9LRklGT19QVFIoZGF0YWZpZm8sIHZvaWQgKik7CisJREVDTEFSRV9LRklGT19QVFIoZnJlZWZpZm8sIHZvaWQgKik7CisJaW50IGJ1ZnNfbnVtOworCWludCBtYXhfYnVmczsKKwlpbnQgZXJyb3JzOworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJc3RydWN0IHN0cmVhbV9idWZfcyAqc2J1ZjsKKwlpbnQgYnVmZmVyZWRfZGF0YV9zaXplOworCWludCBwYXNzZWRfZGF0YV9sZW47CisJaW50IGJ1ZmZlcl9zaXplOworCWludCBkZWZfYmxvY2tfc2l6ZTsKKwlpbnQgZGF0YV9vZmZzZXQ7CisJaW50IHdyaXRld29ya19vbjsKKwl1bnNpZ25lZCBsb25nIGNvZGVjX21tX2J1ZmZlcltNQVhfTU1fQlVGRkVSX05VTV07CisJaW50IG1hbnVhbF93cml0ZTsKKwlpbnQgZmFpbGVkX29ubW9yZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3cTsKKwlzc2l6ZV90ICgqd3JpdGUpKHN0cnVjdCBmaWxlICosCisJCXN0cnVjdCBzdHJlYW1fYnVmX3MgKiwKKwkJY29uc3QgY2hhciBfX3VzZXIgKiwKKwkJc2l6ZV90LCBpbnQpOworCXN0cnVjdCB0aHJlYWRyd19idWYgYnVmWzFdOworCS8qZG9uJ3QgYWRkIGFueSBhZnRlciBidWZbXSBkZWZpbmUgKi8KK307CisKK3N0YXRpYyBpbnQgZnJlZV90YXNrX2J1ZmZlcnMoc3RydWN0IHRocmVhZHJ3X3dyaXRlX3Rhc2sgKnRhc2spOworCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnRocmVhZHJ3X3dxX2dldCh2b2lkKQoreworCXN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqdGhyZWFkcndfd3E7CisKKwlpZiAoIXRocmVhZHJ3X3dxKQorCQl0aHJlYWRyd193cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJ0aHJlYWRydyIpOworCXJldHVybiB0aHJlYWRyd193cTsKK30KKworc3RhdGljIGludCB0aHJlYWRyd19zY2hlZHVsZV9kZWxheWVkX3dvcmsoCisJCXN0cnVjdCB0aHJlYWRyd193cml0ZV90YXNrICp0YXNrLAorCQl1bnNpZ25lZCBsb25nIGRlbGF5KQoreworCWJvb2wgcmV0OworCisJaWYgKHRocmVhZHJ3X3dxX2dldCgpKSB7CisJCXJldCA9IHF1ZXVlX2RlbGF5ZWRfd29yayh0aHJlYWRyd193cV9nZXQoKSwKKwkJCSZ0YXNrLT53cml0ZV93b3JrLCBkZWxheSk7CisJfSBlbHNlCisJCXJldCA9IHNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdGFzay0+d3JpdGVfd29yaywgZGVsYXkpOworCWlmICghcmV0KSB7CisJCWNhbmNlbF9kZWxheWVkX3dvcmsoJnRhc2stPndyaXRlX3dvcmspOworCQlpZiAodGhyZWFkcndfd3FfZ2V0KCkpCisJCQlyZXQgPSBxdWV1ZV9kZWxheWVkX3dvcmsodGhyZWFkcndfd3FfZ2V0KCksCisJCQkJCSZ0YXNrLT53cml0ZV93b3JrLCAwKTsKKwkJZWxzZQorCQkJcmV0ID0gc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0YXNrLT53cml0ZV93b3JrLCAwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRocmVhZHJ3X3dyaXRlX29uZWNlKAorCXN0cnVjdCB0aHJlYWRyd193cml0ZV90YXNrICp0YXNrLAorCXN0cnVjdCBmaWxlICpmaWxlLAorCXN0cnVjdCBzdHJlYW1fYnVmX3MgKnN0YnVmLAorCWNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgdGhyZWFkcndfYnVmICpyd2J1ZiA9IE5VTEw7CisJaW50IHJldCA9IDA7CisJaW50IHRvX3dyaXRlOworCisJaWYgKCFrZmlmb19nZXQoJnRhc2stPmZyZWVmaWZvLCAodm9pZCAqKSZyd2J1ZikpIHsKKwkJaWYgKHRhc2stPmVycm9ycykKKwkJCXJldHVybiB0YXNrLT5lcnJvcnM7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCXRvX3dyaXRlID0gbWluX3QodTMyLCByd2J1Zi0+YnVmZmVyX3NpemUsIGNvdW50KTsKKwlpZiAoY29weV9mcm9tX3VzZXIocndidWYtPnZidWZmZXIsIGJ1ZiwgdG9fd3JpdGUpKSB7CisJCWtmaWZvX3B1dCgmdGFzay0+ZnJlZWZpZm8sIChjb25zdCB2b2lkICopYnVmKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnI7CisJfQorCXJ3YnVmLT5kYXRhX3NpemUgPSB0b193cml0ZTsKKwlyd2J1Zi0+d3JpdGVfb2ZmID0gMDsKKwlrZmlmb19wdXQoJnRhc2stPmRhdGFmaWZvLCAoY29uc3Qgdm9pZCAqKXJ3YnVmKTsKKwl0aHJlYWRyd19zY2hlZHVsZV9kZWxheWVkX3dvcmsodGFzaywgMCk7CisJcmV0dXJuIHRvX3dyaXRlOworZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRocmVhZHJ3X3dyaXRlX2luKAorCXN0cnVjdCB0aHJlYWRyd193cml0ZV90YXNrICp0YXNrLAorCXN0cnVjdCBzdHJlYW1fYnVmX3MgKnN0YnVmLAorCWNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgb2ZmID0gMDsKKwkvKiBpbnQgY2hhbmdlIHRvIHNpemVfdCBmb3IgYnVmZmVyIG92ZXJmbG93IG9uIE9UVC01MDU3ICovCisJc2l6ZV90IGxlZnQgPSBjb3VudDsKKwlpbnQgd2FpdF9udW0gPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl3aGlsZSAobGVmdCA+IDApIHsKKwkJcmV0ID0gdGhyZWFkcndfd3JpdGVfb25lY2UodGFzaywKKwkJCQl0YXNrLT5maWxlLAorCQkJCXN0YnVmLCBidWYgKyBvZmYsIGxlZnQpOworCisJCS8qIGZpcnN0bHkgY2hlY2sgcmV0IDwgMCwgYXZvaWQgdGhlIHJpc2sgb2YgLUVBR0FJTiBpbiByZXQKKwkJICogaW1wbGljaXQgY29udmVydCB0byBzaXplX3Qgd2hlbiBjb21wYXJlIHdpdGggInNpemVfdCBsZWZ0Ii4KKwkJICovCisJCWlmIChyZXQgPCAwKSB7CisJCQlpZiAob2ZmID4gMCkgeworCQkJCWJyZWFrOwkvKmhhdmUgd3JpdGUgb2sgc29tZSBkYXRhLiAqLworCQkJfSBlbHNlIGlmIChyZXQgPT0gLUVBR0FJTikgeworCQkJCWlmICghKHRhc2stPmZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSAmJgorCQkJCQkoKyt3YWl0X251bSA8IDEwKSkgeworCQkJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCgKKwkJCQkJCXRhc2stPndxLAorCQkJCQkJIWtmaWZvX2lzX2VtcHR5KAorCQkJCQkJCSZ0YXNrLT5mcmVlZmlmbyksCisJCQkJCQlIWiAvIDEwMCk7CisJCQkJCWNvbnRpbnVlOwkvKiB3cml0ZSBhZ2Fpbi4gKi8KKwkJCQl9CisJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOwkvKnRvIGVuZCAqLworCQl9IGVsc2UgaWYgKHJldCA+PSBsZWZ0KSB7CisJCQlvZmYgPSBjb3VudDsKKwkJCWxlZnQgPSAwOworCQl9IGVsc2UgaWYgKHJldCA+IDApIHsKKwkJCW9mZiArPSByZXQ7CisJCQlsZWZ0IC09IHJldDsKKwkJfQorCX0KKworCS8qZW5kOiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXNrLT5sb2NrLCBmbGFncyk7CisJaWYgKG9mZiA+IDApIHsKKwkJdGFzay0+YnVmZmVyZWRfZGF0YV9zaXplICs9IG9mZjsKKwkJdGFzay0+ZGF0YV9vZmZzZXQgKz0gb2ZmOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT5sb2NrLCBmbGFncyk7CisJaWYgKG9mZiA+IDApCisJCXJldHVybiBvZmY7CisJZWxzZQorCQlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRvX3dyaXRlX3dvcmtfaW4oc3RydWN0IHRocmVhZHJ3X3dyaXRlX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IHRocmVhZHJ3X2J1ZiAqcndidWYgPSBOVUxMOworCWludCByZXQ7CisJaW50IG5lZWRfcmVfd3JpdGUgPSAwOworCWludCB3cml0ZV9sZW4gPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoa2ZpZm9faXNfZW1wdHkoJnRhc2stPmRhdGFmaWZvKSkKKwkJcmV0dXJuIDA7CisJaWYgKCFrZmlmb19wZWVrKCZ0YXNrLT5kYXRhZmlmbywgKHZvaWQgKikmcndidWYpKQorCQlyZXR1cm4gMDsKKwlpZiAoIXRhc2stPm1hbnVhbF93cml0ZSAmJgorCQkJcndidWYtPmZyb21fY21hICYmCisJCQkhcndidWYtPndyaXRlX29mZikKKwkJY29kZWNfbW1fZG1hX2ZsdXNoKHJ3YnVmLT52YnVmZmVyLAorCQkJCQkJcndidWYtPmJ1ZmZlcl9zaXplLAorCQkJCQkJRE1BX1RPX0RFVklDRSk7CisJaWYgKHRhc2stPm1hbnVhbF93cml0ZSkgeworCQlyZXQgPSB0YXNrLT53cml0ZSh0YXNrLT5maWxlLCB0YXNrLT5zYnVmLAorCQkJKGNvbnN0IGNoYXIgX191c2VyICopcndidWYtPnZidWZmZXIgKyByd2J1Zi0+d3JpdGVfb2ZmLAorCQkJcndidWYtPmRhdGFfc2l6ZSwKKwkJCTIpOwkvKiBub2Jsb2NrLHZpcnR1YWwgYWRkciAqLworCX0gZWxzZSB7CisJCXJldCA9IHRhc2stPndyaXRlKHRhc2stPmZpbGUsIHRhc2stPnNidWYsCisJCShjb25zdCBjaGFyIF9fdXNlciAqKXJ3YnVmLT5kbWFfaGFuZGxlICsgcndidWYtPndyaXRlX29mZiwKKwkJcndidWYtPmRhdGFfc2l6ZSwKKwkJMyk7CS8qIG5vYmxvY2sscGh5IGFkZHIgKi8KKwl9CisJaWYgKHJldCA9PSAtRUFHQUlOKSB7CisJCW5lZWRfcmVfd3JpdGUgPSAwOworCQkvKmRvIGxhdGVyIHJldHJ5LiAqLworCX0gZWxzZSBpZiAocmV0ID49IHJ3YnVmLT5kYXRhX3NpemUpIHsKKwkJd3JpdGVfbGVuICs9IHJ3YnVmLT5kYXRhX3NpemU7CisJCWlmIChrZmlmb19nZXQoJnRhc2stPmRhdGFmaWZvLCAodm9pZCAqKSZyd2J1ZikpIHsKKwkJCXJ3YnVmLT5kYXRhX3NpemUgPSAwOworCQkJa2ZpZm9fcHV0KCZ0YXNrLT5mcmVlZmlmbywgKGNvbnN0IHZvaWQgKilyd2J1Zik7CisJCQkvKndha2V1cCB3cml0ZSB0aHJlYWQuICovCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnRhc2stPndxKTsKKwkJfSBlbHNlCisJCQlwcl9lcnIoIndyaXRlIG9rLGJ1dCBrZmlmb19nZXQgZGF0YSBmYWlsZWQuISEhXG4iKTsKKwkJbmVlZF9yZV93cml0ZSA9IDE7CisJfSBlbHNlIGlmIChyZXQgPiAwKSB7CisJCXJ3YnVmLT5kYXRhX3NpemUgLT0gcmV0OwkvKiBoYWxmIGRhdGEgd3JpdGUgKi8KKwkJcndidWYtPndyaXRlX29mZiArPSByZXQ7CisJCXdyaXRlX2xlbiArPSByZXQ7CisJCW5lZWRfcmVfd3JpdGUgPSAxOworCX0gZWxzZSB7CQkvKnJldCA8PTAgKi8KKwkJcHJfZXJyKCJnZXQgZXJyb3JzIHJldD0lZCBzaXplPSVkXG4iLCByZXQsCisJCQlyd2J1Zi0+ZGF0YV9zaXplKTsKKwkJdGFzay0+ZXJyb3JzID0gcmV0OworCX0KKwlpZiAod3JpdGVfbGVuID4gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdGFzay0+bG9jaywgZmxhZ3MpOworCQl0YXNrLT5wYXNzZWRfZGF0YV9sZW4gKz0gd3JpdGVfbGVuOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT5sb2NrLCBmbGFncyk7CisJfQorCXJldHVybiBuZWVkX3JlX3dyaXRlOworCit9CisKK3N0YXRpYyB2b2lkIGRvX3dyaXRlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB0aHJlYWRyd193cml0ZV90YXNrICp0YXNrID0gY29udGFpbmVyX29mKHdvcmssCisJCQkJCXN0cnVjdCB0aHJlYWRyd193cml0ZV90YXNrLAorCQkJCQl3cml0ZV93b3JrLndvcmspOworCWludCBuZWVkX3JldHJ5ID0gMTsKKworCXRhc2stPndyaXRld29ya19vbiA9IDE7CisJd2hpbGUgKG5lZWRfcmV0cnkpIHsKKwkJbXV0ZXhfbG9jaygmdGFzay0+bXV0ZXgpOworCQluZWVkX3JldHJ5ID0gZG9fd3JpdGVfd29ya19pbih0YXNrKTsKKwkJbXV0ZXhfdW5sb2NrKCZ0YXNrLT5tdXRleCk7CisJfQorCXRocmVhZHJ3X3NjaGVkdWxlX2RlbGF5ZWRfd29yayh0YXNrLCBIWiAvIDEwKTsKKwl0YXNrLT53cml0ZXdvcmtfb24gPSAwOworfQorCitzdGF0aWMgaW50IGFsbG9jX3Rhc2tfYnVmZmVyc19pbmxvY2soc3RydWN0IHRocmVhZHJ3X3dyaXRlX3Rhc2sgKnRhc2ssCisJCWludCBuZXdfYnViZmZlcnMsCisJCWludCBibG9ja19zaXplKQoreworCXN0cnVjdCB0aHJlYWRyd19idWYgKnJ3YnVmOworCWludCBpOworCWludCB1c2VkX2NvZGVjX21tID0gdGFzay0+bWFudWFsX3dyaXRlID8gMCA6IDE7CisJaW50IG5ld19udW0gPSBuZXdfYnViZmZlcnM7CisJaW50IG1tX3Nsb3QgPSAtMTsKKwlpbnQgc3RhcnRfaWR4ID0gdGFzay0+YnVmc19udW07CisJaW50IHRvdGFsX21tID0gMDsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwlpZiAoY29kZWNfbW1fZ2V0X3RvdGFsX3NpemUoKSA8IDgwIHx8CisJCWNvZGVjX21tX2dldF9mcmVlX3NpemUoKSA8IDQwKQorCQl1c2VkX2NvZGVjX21tID0gMDsKKwlpZiAodGFzay0+YnVmc19udW0gKyBuZXdfbnVtID4gdGFzay0+bWF4X2J1ZnMpCisJCW5ld19udW0gPSB0YXNrLT5tYXhfYnVmcyAtIHRhc2stPmJ1ZnNfbnVtOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTU1fQlVGRkVSX05VTTsgaSsrKSB7CisJCWlmICh0YXNrLT5jb2RlY19tbV9idWZmZXJbaV0gPT0gMCkgeworCQkJbW1fc2xvdCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAobW1fc2xvdCA8IDApCisJCXVzZWRfY29kZWNfbW0gPSAwOworCWlmIChibG9ja19zaXplIDw9IDApCisJCWJsb2NrX3NpemUgPSBERUZBVUxUX0JMT0NLX1NJWkU7CisKKwlpZiAodXNlZF9jb2RlY19tbSAmJiAoYmxvY2tfc2l6ZSAqIG5ld19udW0pID49IDEyOCAqIDEwMjQpIHsKKwkJdG90YWxfbW0gPSBBTElHTihibG9ja19zaXplICogbmV3X251bSwgKDEgPDwgMTcpKTsKKwkJYWRkciA9CisJCQkJY29kZWNfbW1fYWxsb2NfZm9yX2RtYShCVUZfTkFNRSwKKwkJCQkJdG90YWxfbW0gLyBQQUdFX1NJWkUsIDAsCisJCQkJCUNPREVDX01NX0ZMQUdTX0RNQV9DUFUpOworCQlpZiAoYWRkciAhPSAwKSB7CisJCQl0YXNrLT5jb2RlY19tbV9idWZmZXJbbW1fc2xvdF0gPSBhZGRyOworCQkJdGFzay0+YnVmZmVyX3NpemUgKz0gdG90YWxfbW07CisJCX0gZWxzZSB7CisJCQl1c2VkX2NvZGVjX21tID0gMDsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgbmV3X251bTsgaSsrKSB7CisJCWludCBidWZpZHggPSBzdGFydF9pZHggKyBpOworCisJCXJ3YnVmID0gJnRhc2stPmJ1ZltidWZpZHhdOworCQlyd2J1Zi0+YnVmZmVyX3NpemUgPSBibG9ja19zaXplOworCQlpZiAodXNlZF9jb2RlY19tbSkgeworCQkJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyID0KKwkJCQkJdGFzay0+Y29kZWNfbW1fYnVmZmVyW21tX3Nsb3RdOworCQkJaWYgKGkgPT0gbmV3X251bSAtIDEpCisJCQkJcndidWYtPmJ1ZmZlcl9zaXplID0gdG90YWxfbW0gLQorCQkJCQkJYmxvY2tfc2l6ZSAqIGk7CisJCQlyd2J1Zi0+ZG1hX2hhbmRsZSA9IChkbWFfYWRkcl90KSBzdGFydF9hZGRyICsKKwkJCQkJCWJsb2NrX3NpemUgKiBpOworCQkJcndidWYtPnZidWZmZXIgPSBjb2RlY19tbV9waHlzX3RvX3ZpcnQoCisJCQkJCQlyd2J1Zi0+ZG1hX2hhbmRsZSk7CisJCQlyd2J1Zi0+ZnJvbV9jbWEgPSAxOworCisJCX0gZWxzZSB7CisJCQlyd2J1Zi0+dmJ1ZmZlciA9IGRtYV9hbGxvY19jb2hlcmVudCgKKwkJCQkJYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCQlyd2J1Zi0+YnVmZmVyX3NpemUsCisJCQkJCSZyd2J1Zi0+ZG1hX2hhbmRsZSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIXJ3YnVmLT52YnVmZmVyKSB7CisJCQkJcndidWYtPmJ1ZmZlcl9zaXplID0gMDsKKwkJCQlyd2J1Zi0+ZG1hX2hhbmRsZSA9IDA7CisJCQkJdGFzay0+YnVmc19udW0gPSBidWZpZHg7CisJCQkJYnJlYWs7CisJCQl9CisJCQlyd2J1Zi0+ZnJvbV9jbWEgPSAwOworCQkJdGFzay0+YnVmZmVyX3NpemUgKz0gcndidWYtPmJ1ZmZlcl9zaXplOworCQl9CisKKwkJa2ZpZm9fcHV0KCZ0YXNrLT5mcmVlZmlmbywgKGNvbnN0IHZvaWQgKilyd2J1Zik7CisJCXRhc2stPmJ1ZnNfbnVtID0gYnVmaWR4ICsgMTsKKwl9CisJaWYgKHN0YXJ0X2lkeCA+IDAgfHwvKmhhdmUgYnVmZmVycyBiZWZvcmUqLworCQl0YXNrLT5idWZzX251bSA+PSAzIHx8CisJCXRhc2stPmJ1ZnNfbnVtID09IG5ld19udW0pIHsKKwkJaWYgKCF0YXNrLT5kZWZfYmxvY2tfc2l6ZSkKKwkJCXRhc2stPmRlZl9ibG9ja19zaXplID0gdGFzay0+YnVmWzBdLmJ1ZmZlcl9zaXplOworCQlyZXR1cm4gMDsJLyptdXN0ID49MyBmb3Igc3dhcCBidWZmZXJzLiAqLworCX0KKwlpZiAodGFzay0+YnVmc19udW0gPiAwKQorCQlmcmVlX3Rhc2tfYnVmZmVycyh0YXNrKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZnJlZV90YXNrX2J1ZmZlcnMoc3RydWN0IHRocmVhZHJ3X3dyaXRlX3Rhc2sgKnRhc2spCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX01NX0JVRkZFUl9OVU07IGkrKykgeworCQlpZiAodGFzay0+Y29kZWNfbW1fYnVmZmVyW2ldKQorCQkJY29kZWNfbW1fZnJlZV9mb3JfZG1hKEJVRl9OQU1FLAorCQkJCXRhc2stPmNvZGVjX21tX2J1ZmZlcltpXSk7CisJfQorCWZvciAoaSA9IDA7IGkgPCB0YXNrLT5idWZzX251bTsgaSsrKSB7CisJCWlmICh0YXNrLT5idWZbaV0udmJ1ZmZlciAmJiB0YXNrLT5idWZbaV0uZnJvbV9jbWEgPT0gMCkKKwkJCWRtYV9mcmVlX2NvaGVyZW50KGFtcG9ydHNfZ2V0X2RtYV9kZXZpY2UoKSwKKwkJCQl0YXNrLT5idWZbaV0uYnVmZmVyX3NpemUsCisJCQkJdGFzay0+YnVmW2ldLnZidWZmZXIsCisJCQkJdGFzay0+YnVmW2ldLmRtYV9oYW5kbGUpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB0aHJlYWRyd193cml0ZV90YXNrICp0aHJlYWRyd19hbGxvY19pbihpbnQgbnVtLAorCQlpbnQgYmxvY2tfc2l6ZSwKKwkJc3NpemVfdCAoKndyaXRlKShzdHJ1Y3QgZmlsZSAqLAorCQkJc3RydWN0IHN0cmVhbV9idWZfcyAqLAorCQkJY29uc3QgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBpbnQpLAorCQkJaW50IGZsYWdzKQoreworCWludCBtYXhfYnVmcyA9IG51bTsKKwlpbnQgdGFza19idWZmZXJfc2l6ZTsKKwlzdHJ1Y3QgdGhyZWFkcndfd3JpdGVfdGFzayAqdGFzazsKKwlpbnQgcmV0OworCisJaWYgKCEoZmxhZ3MgJiAxKSkgLypub3QgYXVkaW8qLworCQltYXhfYnVmcyA9IDMwMDsgLypjYW4gZ3JlYXQgZm9yIHZpZGVvIGJ1ZnMuKi8KKwl0YXNrX2J1ZmZlcl9zaXplID0gc2l6ZW9mKHN0cnVjdCB0aHJlYWRyd193cml0ZV90YXNrKSArCisJCQkJc2l6ZW9mKHN0cnVjdCB0aHJlYWRyd19idWYpICogbWF4X2J1ZnM7CisJdGFzayA9IHZtYWxsb2ModGFza19idWZmZXJfc2l6ZSk7CisKKwlpZiAoIXRhc2spCisJCXJldHVybiBOVUxMOworCW1lbXNldCh0YXNrLCAwLCB0YXNrX2J1ZmZlcl9zaXplKTsKKworCXNwaW5fbG9ja19pbml0KCZ0YXNrLT5sb2NrKTsKKwltdXRleF9pbml0KCZ0YXNrLT5tdXRleCk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnRhc2stPndyaXRlX3dvcmssIGRvX3dyaXRlX3dvcmspOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRhc2stPndxKTsKKwlyZXQgPSBrZmlmb19hbGxvYygmdGFzay0+ZGF0YWZpZm8sIG1heF9idWZzLCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjE7CisJcmV0ID0ga2ZpZm9fYWxsb2MoJnRhc2stPmZyZWVmaWZvLCBtYXhfYnVmcywgR0ZQX0tFUk5FTCk7CisJaWYgKHJldCkKKwkJZ290byBlcnIyOworCXRhc2stPndyaXRlID0gd3JpdGU7CisJdGFzay0+ZmlsZSA9IE5VTEw7CisJdGFzay0+YnVmZmVyX3NpemUgPSAwOworCXRhc2stPm1hbnVhbF93cml0ZSA9IGZsYWdzICYgMTsKKwl0YXNrLT5tYXhfYnVmcyA9IG1heF9idWZzOworCW11dGV4X2xvY2soJnRhc2stPm11dGV4KTsKKwlyZXQgPSBhbGxvY190YXNrX2J1ZmZlcnNfaW5sb2NrKHRhc2ssIG51bSwgYmxvY2tfc2l6ZSk7CisJbXV0ZXhfdW5sb2NrKCZ0YXNrLT5tdXRleCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyMzsKKwl0aHJlYWRyd193cV9nZXQoKTsJLypzdGFydCB0aHJlYWQuICovCisJcmV0dXJuIHRhc2s7CisKK2VycjM6CisJa2ZpZm9fZnJlZSgmdGFzay0+ZnJlZWZpZm8pOworZXJyMjoKKwlrZmlmb19mcmVlKCZ0YXNrLT5kYXRhZmlmbyk7CitlcnIxOgorCXZmcmVlKHRhc2spOworCXByX2VycigiYWxsb2MgdGhyZWFkcncgZmFpbGVkIG51bTolZCxibG9jazolZFxuIiwgbnVtLCBibG9ja19zaXplKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqZmlmbyBkYXRhIHNpemU7CisgKi8KKwordm9pZCB0aHJlYWRyd191cGRhdGVfYnVmZmVyX2xldmVsKHN0cnVjdCBzdHJlYW1fYnVmX3MgKnN0YnVmLAorCWludCBwYXJzZWRfc2l6ZSkKK3sKKwlzdHJ1Y3QgdGhyZWFkcndfd3JpdGVfdGFzayAqdGFzayA9IHN0YnVmLT53cml0ZV90aHJlYWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICh0YXNrKQorCXsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnRhc2stPmxvY2ssIGZsYWdzKTsKKwkJdGFzay0+YnVmZmVyZWRfZGF0YV9zaXplIC09IHBhcnNlZF9zaXplOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT5sb2NrLCBmbGFncyk7CisJfQorCit9CitFWFBPUlRfU1lNQk9MKHRocmVhZHJ3X3VwZGF0ZV9idWZmZXJfbGV2ZWwpOworCitpbnQgdGhyZWFkcndfYnVmZmVyX2xldmVsKHN0cnVjdCBzdHJlYW1fYnVmX3MgKnN0YnVmKQoreworCXN0cnVjdCB0aHJlYWRyd193cml0ZV90YXNrICp0YXNrID0gc3RidWYtPndyaXRlX3RocmVhZDsKKworCWlmICh0YXNrKQorCQlyZXR1cm4gdGFzay0+YnVmZmVyZWRfZGF0YV9zaXplOworCXJldHVybiAwOworfQorCitpbnQgdGhyZWFkcndfYnVmZmVyX3NpemUoc3RydWN0IHN0cmVhbV9idWZfcyAqc3RidWYpCit7CisJc3RydWN0IHRocmVhZHJ3X3dyaXRlX3Rhc2sgKnRhc2sgPSBzdGJ1Zi0+d3JpdGVfdGhyZWFkOworCisJaWYgKHRhc2spCisJCXJldHVybiB0YXNrLT5idWZmZXJfc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworaW50IHRocmVhZHJ3X2RhdGFmaWZvX2xlbihzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpzdGJ1ZikKK3sKKwlzdHJ1Y3QgdGhyZWFkcndfd3JpdGVfdGFzayAqdGFzayA9IHN0YnVmLT53cml0ZV90aHJlYWQ7CisKKwlpZiAodGFzaykKKwkJcmV0dXJuIGtmaWZvX2xlbigmdGFzay0+ZGF0YWZpZm8pOworCXJldHVybiAwOworfQorCitpbnQgdGhyZWFkcndfZnJlZWZpZm9fbGVuKHN0cnVjdCBzdHJlYW1fYnVmX3MgKnN0YnVmKQoreworCXN0cnVjdCB0aHJlYWRyd193cml0ZV90YXNrICp0YXNrID0gc3RidWYtPndyaXRlX3RocmVhZDsKKworCWlmICh0YXNrKQorCQlyZXR1cm4ga2ZpZm9fbGVuKCZ0YXNrLT5mcmVlZmlmbyk7CisJcmV0dXJuIDA7Cit9CitpbnQgdGhyZWFkcndfc3VwcG9ydF9tb3JlX2J1ZmZlcnMoc3RydWN0IHN0cmVhbV9idWZfcyAqc3RidWYpCit7CisJc3RydWN0IHRocmVhZHJ3X3dyaXRlX3Rhc2sgKnRhc2sgPSBzdGJ1Zi0+d3JpdGVfdGhyZWFkOworCisJaWYgKCF0YXNrKQorCQlyZXR1cm4gMDsKKwlpZiAodGFzay0+ZmFpbGVkX29ubW9yZSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHRhc2stPm1heF9idWZzIC0gdGFzay0+YnVmc19udW07Cit9CisKKy8qCisgKmRhdGEgbGVuIG91dCBmaWZvOworICovCitpbnQgdGhyZWFkcndfcGFzc2VkX2xlbihzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpzdGJ1ZikKK3sKKwlzdHJ1Y3QgdGhyZWFkcndfd3JpdGVfdGFzayAqdGFzayA9IHN0YnVmLT53cml0ZV90aHJlYWQ7CisKKwlpZiAodGFzaykKKwkJcmV0dXJuIHRhc2stPnBhc3NlZF9kYXRhX2xlbjsKKwlyZXR1cm4gMDsKKworfQorLyoKKyAqYWxsIGRhdGEgd3JpdGVkLjsKKyAqLworaW50IHRocmVhZHJ3X2RhdGFvZmZzZXQoc3RydWN0IHN0cmVhbV9idWZfcyAqc3RidWYpCit7CisJc3RydWN0IHRocmVhZHJ3X3dyaXRlX3Rhc2sgKnRhc2sgPSBzdGJ1Zi0+d3JpdGVfdGhyZWFkOworCWludCBvZmZzZXQgPSAwOworCisJaWYgKHRhc2spCisJCXJldHVybiB0YXNrLT5kYXRhX29mZnNldDsKKwlyZXR1cm4gb2Zmc2V0OworCit9CisKK3NzaXplX3QgdGhyZWFkcndfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzdHJlYW1fYnVmX3MgKnN0YnVmLAorCQkJCQkgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHRocmVhZHJ3X3dyaXRlX3Rhc2sgKnRhc2sgPSBzdGJ1Zi0+d3JpdGVfdGhyZWFkOworCXNzaXplX3Qgc2l6ZTsKKworCWlmICghdGFzay0+ZmlsZSkgeworCQl0YXNrLT5maWxlID0gZmlsZTsKKwkJdGFzay0+c2J1ZiA9IHN0YnVmOworCX0KKwltdXRleF9sb2NrKCZ0YXNrLT5tdXRleCk7CisJc2l6ZSA9IHRocmVhZHJ3X3dyaXRlX2luKHRhc2ssIHN0YnVmLCBidWYsIGNvdW50KTsKKwltdXRleF91bmxvY2soJnRhc2stPm11dGV4KTsKKwlyZXR1cm4gc2l6ZTsKK30KKworaW50IHRocmVhZHJ3X2ZsdXNoX2J1ZmZlcnMoc3RydWN0IHN0cmVhbV9idWZfcyAqc3RidWYpCit7CisJc3RydWN0IHRocmVhZHJ3X3dyaXRlX3Rhc2sgKnRhc2sgPSBzdGJ1Zi0+d3JpdGVfdGhyZWFkOworCWludCBtYXhfcmV0cnkgPSAyMDsKKworCWlmICghdGFzaykKKwkJcmV0dXJuIDA7CisJd2hpbGUgKCFrZmlmb19pc19lbXB0eSgmdGFzay0+ZGF0YWZpZm8pICYmIG1heF9yZXRyeS0tID4gMCkgeworCQl0aHJlYWRyd19zY2hlZHVsZV9kZWxheWVkX3dvcmsodGFzaywgMCk7CisJCW1zbGVlcCgyMCk7CisJfQorCWlmICgha2ZpZm9faXNfZW1wdHkoJnRhc2stPmRhdGFmaWZvKSkKKwkJcmV0dXJuIC0xOy8qZGF0YSBub3QgZmx1c2hlZCovCisJcmV0dXJuIDA7Cit9CitpbnQgdGhyZWFkcndfYWxsb2NfbW9yZV9idWZmZXJfc2l6ZSgKKwlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpzdGJ1ZiwKKwlpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgdGhyZWFkcndfd3JpdGVfdGFzayAqdGFzayA9IHN0YnVmLT53cml0ZV90aHJlYWQ7CisJaW50IGJsb2NrX3NpemU7CisJaW50IG5ld19udW07CisJaW50IHJldCA9IC0xOworCWludCBvbGRfbnVtOworCisJaWYgKCF0YXNrKQorCQlyZXR1cm4gLTE7CisJbXV0ZXhfbG9jaygmdGFzay0+bXV0ZXgpOworCWJsb2NrX3NpemUgPSB0YXNrLT5kZWZfYmxvY2tfc2l6ZTsKKwlpZiAoYmxvY2tfc2l6ZSA9PSAwKQorCQlibG9ja19zaXplID0gMzIgKiAxMDI0OworCW5ld19udW0gPSBzaXplIC8gYmxvY2tfc2l6ZTsKKwlvbGRfbnVtID0gdGFzay0+YnVmc19udW07CisJaWYgKG5ld19udW0gPT0gMCkKKwkJbmV3X251bSA9IDE7CisJZWxzZSBpZiAobmV3X251bSA+IHRhc2stPm1heF9idWZzIC0gdGFzay0+YnVmc19udW0pCisJCW5ld19udW0gPSB0YXNrLT5tYXhfYnVmcyAtIHRhc2stPmJ1ZnNfbnVtOworCWlmIChuZXdfbnVtICE9IDApCisJCXJldCA9IGFsbG9jX3Rhc2tfYnVmZmVyc19pbmxvY2sodGFzaywgbmV3X251bSwKKwkJCWJsb2NrX3NpemUpOworCW11dGV4X3VubG9jaygmdGFzay0+bXV0ZXgpOworCXByX2luZm8oInRocmVhZHJ3IGFkZCBtb3JlIGJ1ZmZlciBmcm9tICVkIC0+ICVkIGZvciBzaXplICVkXG4iLAorCQlvbGRfbnVtLCB0YXNrLT5idWZzX251bSwKKwkJc2l6ZSk7CisJaWYgKHJldCA8IDAgfHwgb2xkX251bSA9PSB0YXNrLT5idWZzX251bSkKKwkJdGFzay0+ZmFpbGVkX29ubW9yZSA9IDE7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCAqdGhyZWFkcndfYWxsb2MoaW50IG51bSwKKwkJaW50IGJsb2NrX3NpemUsCisJCQlzc2l6ZV90ICgqd3JpdGUpKHN0cnVjdCBmaWxlICosCisJCQkJc3RydWN0IHN0cmVhbV9idWZfcyAqLAorCQkJCWNvbnN0IGNoYXIgX191c2VyICosCisJCQkJc2l6ZV90LCBpbnQpLAorCQkJCWludCBmbGFncykKK3sKKwlyZXR1cm4gdGhyZWFkcndfYWxsb2NfaW4obnVtLCBibG9ja19zaXplLCB3cml0ZSwgZmxhZ3MpOworfQorCit2b2lkIHRocmVhZHJ3X3JlbGVhc2Uoc3RydWN0IHN0cmVhbV9idWZfcyAqc3RidWYpCit7CisJc3RydWN0IHRocmVhZHJ3X3dyaXRlX3Rhc2sgKnRhc2sgPSBzdGJ1Zi0+d3JpdGVfdGhyZWFkOworCisJaWYgKHRhc2spIHsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0YXNrLT53cSk7CisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmdGFzay0+d3JpdGVfd29yayk7CisJCW11dGV4X2xvY2soJnRhc2stPm11dGV4KTsKKwkJZnJlZV90YXNrX2J1ZmZlcnModGFzayk7CisJCW11dGV4X3VubG9jaygmdGFzay0+bXV0ZXgpOworCQlrZmlmb19mcmVlKCZ0YXNrLT5mcmVlZmlmbyk7CisJCWtmaWZvX2ZyZWUoJnRhc2stPmRhdGFmaWZvKTsKKwkJdmZyZWUodGFzayk7CisJfQorCXN0YnVmLT53cml0ZV90aHJlYWQgPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvYW1wb3J0cy90aHJlYWRfcncuaCBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L2FtcG9ydHMvdGhyZWFkX3J3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE5M2RlZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L2FtcG9ydHMvdGhyZWFkX3J3LmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9tZWRpYS9zdHJlYW1faW5wdXQvcGFyc2VyL3RocmVhZF9ydy5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgVEhSRUFEX1JXX0gKKyNkZWZpbmUgVEhSRUFEX1JXX0gKKyNpbmNsdWRlICIuLi8uLi9zdHJlYW1faW5wdXQvYW1wb3J0cy9zdHJlYW1idWZfcmVnLmgiCisjaW5jbHVkZSAiLi4vLi4vc3RyZWFtX2lucHV0L2FtcG9ydHMvc3RyZWFtYnVmLmgiCisjaW5jbHVkZSAiLi4vLi4vc3RyZWFtX2lucHV0L3BhcnNlci9lc3BhcnNlci5oIgorI2luY2x1ZGUgIi4uLy4uL3N0cmVhbV9pbnB1dC9hbXBvcnRzL2FtcG9ydHNfcHJpdi5oIgorCitzc2l6ZV90IHRocmVhZHJ3X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpzdGJ1ZiwKKwkJY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50KTsKKwordm9pZCAqdGhyZWFkcndfYWxsb2MoaW50IG51bSwKKwkJaW50IGJsb2NrX3NpemUsCisJCQlzc2l6ZV90ICgqd3JpdGUpKHN0cnVjdCBmaWxlICosCisJCQkJc3RydWN0IHN0cmVhbV9idWZfcyAqLAorCQkJCWNvbnN0IGNoYXIgX191c2VyICosCisJCQkJc2l6ZV90LCBpbnQpLAorCQkJCWludCBmbGFncyk7LypmbGFncyAmMTogbWFudWFsIG1vZGUqLworCit2b2lkIHRocmVhZHJ3X3JlbGVhc2Uoc3RydWN0IHN0cmVhbV9idWZfcyAqc3RidWYpOworCitpbnQgdGhyZWFkcndfYnVmZmVyX2xldmVsKHN0cnVjdCBzdHJlYW1fYnVmX3MgKnN0YnVmKTsKK2ludCB0aHJlYWRyd19idWZmZXJfc2l6ZShzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpzdGJ1Zik7CitpbnQgdGhyZWFkcndfZGF0YWZpZm9fbGVuKHN0cnVjdCBzdHJlYW1fYnVmX3MgKnN0YnVmKTsKK2ludCB0aHJlYWRyd19mcmVlZmlmb19sZW4oc3RydWN0IHN0cmVhbV9idWZfcyAqc3RidWYpOworaW50IHRocmVhZHJ3X3Bhc3NlZF9sZW4oc3RydWN0IHN0cmVhbV9idWZfcyAqc3RidWYpOworaW50IHRocmVhZHJ3X2ZsdXNoX2J1ZmZlcnMoc3RydWN0IHN0cmVhbV9idWZfcyAqc3RidWYpOworaW50IHRocmVhZHJ3X2RhdGFvZmZzZXQoc3RydWN0IHN0cmVhbV9idWZfcyAqc3RidWYpOworaW50IHRocmVhZHJ3X2FsbG9jX21vcmVfYnVmZmVyX3NpemUoCisJc3RydWN0IHN0cmVhbV9idWZfcyAqc3RidWYsCisJaW50IHNpemUpOworaW50IHRocmVhZHJ3X3N1cHBvcnRfbW9yZV9idWZmZXJzKHN0cnVjdCBzdHJlYW1fYnVmX3MgKnN0YnVmKTsKK3ZvaWQgdGhyZWFkcndfdXBkYXRlX2J1ZmZlcl9sZXZlbChzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpzdGJ1ZiwKKwlpbnQgcGFyc2VkX3NpemUpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL01ha2VmaWxlIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2UyOTVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9NYWtlZmlsZQpAQCAtMCwwICsxLDIyIEBACitvYmotbSArPSBjaS5vCisjY2ltYXgtdXNiLm8KKworY2ktb2JqcyA9ICQoYW1sY2ktb2JqcykgJChjaW1jdS1vYmpzKQorIyQoY2ltYXgtb2JqcykKKworYW1sY2ktb2JqcyA9IGFtbF9wY21jaWEubyAgYW1sX2NpLm8gIGFtbF9jaV9idXMubworI2FtbF9zcGkubworY2ltY3Utb2JqcyA9IGNpbWF4L2R2Yl9yaW5nYnVmZmVyLm8gY2ltY3UvZHZiX2NhX2VuNTAyMjFfY2ltY3UubworI2NpbWF4LW9ianMgPSBjaW1heC9kdmJfY2FfZW41MDIyMV9jaW1heC5vIGNpbWF4L2FtbF9jaW1heC5vICBjaW1heC9kdmJfcmluZ2J1ZmZlci5vCitLQlVJTERfQ0ZMQUdTICs9IC1Xbm8taW1wbGljaXQtZmFsbHRocm91Z2gKKyNjaW1heC11c2Itb2JqcyArPSBjaW1heC91c2IvU1JDL2NpbWF4K3VzYi1kcml2ZXIubyBjaW1heC91c2IvU1JDL2NpbWF4K3VzYl9mdy5vCisjY2ltYXgtdXNiLW9ianMgKz0gY2ltYXgvdXNiL1NSQy9jaW1heCt1c2JfY29uZmlnLm8KKyNjaW1heC1vYmpzICs9IGNpbWF4L2FtbF9jaW1heF91c2IubworCitjY2ZsYWdzLXkgKz0gLUkkKHNyY3RyZWUpLworY2NmbGFncy15ICs9IC1JJChzcmN0cmVlKS9pbmNsdWRlCitjY2ZsYWdzLXkgKz0gLUkkKHNyY3RyZWUpL2RyaXZlcnMvZ3BpbworY2NmbGFncy15ICs9IC1JJChzcmN0cmVlKS9kcml2ZXJzL21lZGlhL2R2Yi1jb3JlCitjY2ZsYWdzLXkgKz0gLUkkKHNyY3RyZWUpL2luY2x1ZGUvbWVkaWEKK2NjZmxhZ3MteSArPSAtSSQoc3JjdHJlZSkvZHJpdmVycy9tZWRpYS9wY2kvdHRwY2kKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9hbWxfY2kuYyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvYW1sX2NpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZjMjdmZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvYW1sX2NpLmMKQEAgLTAsMCArMSw4MjggQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNyBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisqIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyoKKyogRGVzY3JpcHRpb246CisqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlICJhbWxfY2kuaCIKKy8vI2luY2x1ZGUgImFtbF9zcGkuaCIKKyNpbmNsdWRlICJhbWxfY2lfYnVzLmgiCisvLyNpbmNsdWRlICJjaW1heC9hbWxfY2ltYXguaCIKKworLy8jaW5jbHVkZSAiZHZiX2NhX2VuNTAyMjEuaCIKKyNpbmNsdWRlIDxkdmJkZXYuaD4KKworTU9EVUxFX1BBUk1fREVTQyhhbWxfY2lfZGVidWcsICJcblx0XHQgZHZiIGNpIGRlYnVnIik7CitzdGF0aWMgaW50IGFtbF9jaV9kZWJ1ZyA9IDE7Cittb2R1bGVfcGFyYW0oYW1sX2NpX2RlYnVnLCBpbnQsIFNfSVJVR08pOworCisjZGVmaW5lIHByX2RiZyhhcmdzLi4uKVwKKwlkbyB7XAorCQlpZiAoYW1sX2NpX2RlYnVnKVwKKwkJCXByaW50ayhhcmdzKTtcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgcHJfZXJyb3IoZm10LCBhcmdzLi4uKSBwcmludGsoIkRWQkNJOiAiIGZtdCwgIyMgYXJncykKKworCitleHRlcm4gc3RydWN0IGR2Yl9hZGFwdGVyICphbWxfZ2V0X2R2Yl9hZGFwdGVyKHZvaWQpOworLyoqXGJyaWVmIGFtbF9jaV9tZW1fcmVhZDptZW0gcmVhZCBmcm9tIGNhbQorICogXHBhcmFtIGVuNTAyMjE6IGVuNTAyMjEgb2JqLHVzZWQgdGhpcyBkYXRhIHRvIGdldCBkdmJfY2kgb2JqCisgKiBccGFyYW0gc2xvdDogc2xvdCBpbmRleAorICogXHBhcmFtIGFkZHI6IHJlYWQgYWRkcgorICogXHJldHVybgorICogICAtIHJlYWQgdmFsdWU6b2sKKyAqICAgLSAtRUlOVkFMIDogZXJyb3IKKyAqLworc3RhdGljIGludCBhbWxfY2lfbWVtX3JlYWQoc3RydWN0IGR2Yl9jYV9lbjUwMjIxX2NpbWN1ICplbjUwMjIxLCBpbnQgc2xvdCwgaW50IGFkZHIpCit7CisJc3RydWN0IGFtbF9jaSAqY2kgPSBlbjUwMjIxLT5kYXRhOworCisJaWYgKHNsb3QgIT0gMCkgeworCQlwcl9lcnJvcigic2xvdCAhPTAgJXMgOiVkXHJcbiIsIF9fZnVuY19fLCBzbG90KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNpLT5jaV9tZW1fcmVhZCAhPSBOVUxMKQorCQlyZXR1cm4gY2ktPmNpX21lbV9yZWFkKGNpLCBzbG90LCBhZGRyKTsKKworCXByX2Vycm9yKCJjaV9tZW1fcmVhZCBpcyBudWxsICVzXHJcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKy8qKlxicmllZiBhbWxfY2lfbWVtX3dyaXRlOm1lbSB3cml0ZSB0byBjYW0KKyAqIFxwYXJhbSBlbjUwMjIxOiBlbjUwMjIxIG9iaix1c2VkIHRoaXMgZGF0YSB0byBnZXQgZHZiX2NpIG9iagorICogXHBhcmFtIHNsb3Q6IHNsb3QgaW5kZXgKKyAqIFxwYXJhbSBhZGRyOiB3cml0ZSBhZGRyCisgKiBccGFyYW0gYWRkcjogd3JpdGUgdmFsdWUKKyAqIFxyZXR1cm4KKyAqICAgLSAwOm9rCisgKiAgIC0gLUVJTlZBTCA6IGVycm9yCisgKi8KK3N0YXRpYyBpbnQgYW1sX2NpX21lbV93cml0ZShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltY3UgKmVuNTAyMjEsCisJCWludCBzbG90LCBpbnQgYWRkciwgdTggZGF0YSkKK3sKKworCXN0cnVjdCBhbWxfY2kgKmNpID0gZW41MDIyMS0+ZGF0YTsKKworCWlmIChzbG90ICE9IDApIHsKKwkJcHJfZXJyb3IoInNsb3Qgbm90IDAgJXMgOiVkXHJcbiIsIF9fZnVuY19fLCBzbG90KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNpLT5jaV9tZW1fd3JpdGUgIT0gTlVMTCkKKwkJcmV0dXJuIGNpLT5jaV9tZW1fd3JpdGUoY2ksIHNsb3QsIGFkZHIsIGRhdGEpOworCXByX2Vycm9yKCJjaV9tZW1fd3JpdGUgaXMgbnVsbCAlc1xyXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisvKipcYnJpZWYgYW1sX2NpX2lvX3JlYWQ6aW8gcmVhZCBmcm9tIGNhbQorICogXHBhcmFtIGVuNTAyMjE6IGVuNTAyMjEgb2JqLHVzZWQgdGhpcyBkYXRhIHRvIGdldCBkdmJfY2kgb2JqCisgKiBccGFyYW0gc2xvdDogc2xvdCBpbmRleAorICogXHBhcmFtIGFkZHI6IHJlYWQgYWRkcgorICogXHJldHVybgorICogICAtIHJlYWQgdmFsdWU6b2sKKyAqICAgLSAtRUlOVkFMIDogZXJyb3IKKyAqLworc3RhdGljIGludCBhbWxfY2lfaW9fcmVhZChzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltY3UgKmVuNTAyMjEsIGludCBzbG90LCB1OCBhZGRyKQoreworCXN0cnVjdCBhbWxfY2kgKmNpID0gZW41MDIyMS0+ZGF0YTsKKworCWlmIChzbG90ICE9IDApIHsKKwkJcHJfZXJyb3IoInNsb3QgIT0wICVzIDolZFxyXG4iLCBfX2Z1bmNfXywgc2xvdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjaS0+Y2lfaW9fcmVhZCAhPSBOVUxMKQorCQlyZXR1cm4gY2ktPmNpX2lvX3JlYWQoY2ksIHNsb3QsIGFkZHIpOworCisJcHJfZXJyb3IoImNpX2lvX3JlYWQgaXMgbnVsbCAlc1xyXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisvKipcYnJpZWYgYW1sX2NpX2lvX3dyaXRlOmlvIHdyaXRlIHRvIGNhbQorICogXHBhcmFtIGVuNTAyMjE6IGVuNTAyMjEgb2JqLHVzZWQgdGhpcyBkYXRhIHRvIGdldCBkdmJfY2kgb2JqCisgKiBccGFyYW0gc2xvdDogc2xvdCBpbmRleAorICogXHBhcmFtIGFkZHI6IHdyaXRlIGFkZHIKKyAqIFxwYXJhbSBhZGRyOiB3cml0ZSB2YWx1ZQorICogXHJldHVybgorICogICAtIDA6b2sKKyAqICAgLSAtRUlOVkFMIDogZXJyb3IKKyAqLworc3RhdGljIGludCBhbWxfY2lfaW9fd3JpdGUoc3RydWN0IGR2Yl9jYV9lbjUwMjIxX2NpbWN1ICplbjUwMjIxLAorCQlpbnQgc2xvdCwgdTggYWRkciwgdTggZGF0YSkKK3sKKwlzdHJ1Y3QgYW1sX2NpICpjaSA9IGVuNTAyMjEtPmRhdGE7CisKKwlpZiAoc2xvdCAhPSAwKSB7CisJCXByX2Vycm9yKCJzbG90ICE9MCAlcyA6JWRcclxuIiwgX19mdW5jX18sIHNsb3QpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY2ktPmNpX21lbV93cml0ZSAhPSBOVUxMKQorCQlyZXR1cm4gY2ktPmNpX2lvX3dyaXRlKGNpLCBzbG90LCBhZGRyLCBkYXRhKTsKKworCXByX2Vycm9yKCJjaV9pb193cml0ZSBpcyBudWxsICVzXHJcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKy8qKlxicmllZiBhbWxfY2lfc2xvdF9yZXNldDpyZXNldCBzbG90CisgKiBccGFyYW0gZW41MDIyMTogZW41MDIyMSBvYmosdXNlZCB0aGlzIGRhdGEgdG8gZ2V0IGR2Yl9jaSBvYmoKKyAqIFxwYXJhbSBzbG90OiBzbG90IGluZGV4CisgKiBccmV0dXJuCisgKiAgIC0gMDpvaworICogICAtIC1FSU5WQUwgOiBlcnJvcgorICovCitzdGF0aWMgaW50IGFtbF9jaV9zbG90X3Jlc2V0KHN0cnVjdCBkdmJfY2FfZW41MDIyMV9jaW1jdSAqZW41MDIyMSwgaW50IHNsb3QpCit7CisJc3RydWN0IGFtbF9jaSAqY2kgPSBlbjUwMjIxLT5kYXRhOworCXByX2RiZygiU2xvdCglZCk6IFNsb3QgUkVTRVRcbiIsIHNsb3QpOworCWlmIChjaS0+Y2lfc2xvdF9yZXNldCAhPSBOVUxMKSB7CisJCWNpLT5jaV9zbG90X3Jlc2V0KGNpLCBzbG90KTsKKwl9IGVsc2UgeworCQlwcl9lcnJvcigiY2lfc2xvdF9yZXNldCBpcyBudWxsICVzXHJcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorLyoqXGJyaWVmIGFtbF9jaV9zbG90X3NodXRkb3duOnNob3cgc2xvdAorICogXHBhcmFtIGVuNTAyMjE6IGVuNTAyMjEgb2JqLHVzZWQgdGhpcyBkYXRhIHRvIGdldCBkdmJfY2kgb2JqCisgKiBccGFyYW0gc2xvdDogc2xvdCBpbmRleAorICogXHJldHVybgorICogICAtIDA6b2sKKyAqICAgLSAtRUlOVkFMIDogZXJyb3IKKyAqLworc3RhdGljIGludCBhbWxfY2lfc2xvdF9zaHV0ZG93bihzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltY3UgKmVuNTAyMjEsIGludCBzbG90KQoreworCXN0cnVjdCBhbWxfY2kgKmNpID0gZW41MDIyMS0+ZGF0YTsKKwlwcl9kYmcoIlNsb3QoJWQpOiBTbG90IHNodXRkb3duXG4iLCBzbG90KTsKKwlpZiAoY2ktPmNpX3Nsb3Rfc2h1dGRvd24gIT0gTlVMTCkgeworCQljaS0+Y2lfc2xvdF9zaHV0ZG93bihjaSwgc2xvdCk7CisJfSBlbHNlIHsKKwkJcHJfZXJyb3IoImFtbF9jaV9zbG90X3NodXRkb3duIGlzIG51bGwgJXNcclxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisvKipcYnJpZWYgYW1sX2NpX3RzX2NvbnRyb2w6Y29udHJvbCBzbG90IHRzCisgKiBccGFyYW0gZW41MDIyMTogZW41MDIyMSBvYmosdXNlZCB0aGlzIGRhdGEgdG8gZ2V0IGR2Yl9jaSBvYmoKKyAqIFxwYXJhbSBzbG90OiBzbG90IGluZGV4CisgKiBccmV0dXJuCisgKiAgIC0gMDpvaworICogICAtIC1FSU5WQUwgOiBlcnJvcgorICovCitzdGF0aWMgaW50IGFtbF9jaV90c19jb250cm9sKHN0cnVjdCBkdmJfY2FfZW41MDIyMV9jaW1jdSAqZW41MDIyMSwgaW50IHNsb3QpCit7CisKKwkJc3RydWN0IGFtbF9jaSAqY2kgPSBlbjUwMjIxLT5kYXRhOworCQlwcl9kYmcoIlNsb3QoJWQpOiBUUyBjb250cm9sXG4iLCBzbG90KTsKKwkJaWYgKGNpLT5jaV9zbG90X3RzX2VuYWJsZSAhPSBOVUxMKSB7CisJCQljaS0+Y2lfc2xvdF90c19lbmFibGUoY2ksIHNsb3QpOworCQl9IGVsc2UgeworCQkJcHJfZXJyb3IoImFtbF9jaV90c19jb250cm9sIGlzIG51bGwgJXNcclxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmV0dXJuIDA7Cit9CisvKipcYnJpZWYgYW1sX2NpX3Nsb3Rfc3RhdHVzOmdldCBzbG90IHN0YXR1cworICogXHBhcmFtIGVuNTAyMjE6IGVuNTAyMjEgb2JqLHVzZWQgdGhpcyBkYXRhIHRvIGdldCBkdmJfY2kgb2JqCisgKiBccGFyYW0gc2xvdDogc2xvdCBpbmRleAorICogXHBhcmFtIG9wZW46IG5vIHVzZWQKKyAqIFxyZXR1cm4KKyAqICAgLSBjYW0gc3RhdHVzCisgKiAgIC0gLUVJTlZBTCA6IGVycm9yCisgKi8KK3N0YXRpYyBpbnQgYW1sX2NpX3Nsb3Rfc3RhdHVzKHN0cnVjdCBkdmJfY2FfZW41MDIyMV9jaW1jdSAqZW41MDIyMSwKKwkJaW50IHNsb3QsIGludCBvcGVuKQoreworCXN0cnVjdCBhbWxfY2kgKmNpID0gZW41MDIyMS0+ZGF0YTsKKworCS8vcHJfZGJnKCJTbG90KCVkKTogUG9sbCBTbG90IHN0YXR1c1xuIiwgc2xvdCk7CisKKwlpZiAoY2ktPmNpX3BvbGxfc2xvdF9zdGF0dXMgIT0gTlVMTCkgeworCQlyZXR1cm4gY2ktPmNpX3BvbGxfc2xvdF9zdGF0dXMoY2ksIHNsb3QsIG9wZW4pOworCX0gZWxzZSB7CisJCS8qcHJfZXJyb3IoImNpX3BvbGxfc2xvdF9zdGF0dXMgaXMgbnVsbCAlc1xyXG4iLCBfX2Z1bmNfXyk7Ki8KKwl9CisKKwlyZXR1cm4gMDsKK30KKy8qKlxicmllZiBhbWxfY2lfc2xvdF9zdGF0dXM6Z2V0IHNsb3Qgc3RhdHVzCisgKiBccGFyYW0gZW41MDIyMTogZW41MDIyMSBvYmosdXNlZCB0aGlzIGRhdGEgdG8gZ2V0IGR2Yl9jaSBvYmoKKyAqIFxwYXJhbSBzbG90OiBzbG90IGluZGV4CisgKiBccGFyYW0gb3Blbjogbm8gdXNlZAorICogXHJldHVybgorICogICAtIGNhbSBzdGF0dXMKKyAqICAgLSAtRUlOVkFMIDogZXJyb3IKKyAqLworc3RhdGljIGludCBhbWxfY2lfc2xvdF93YWtldXAoc3RydWN0IGR2Yl9jYV9lbjUwMjIxX2NpbWN1ICplbjUwMjIxLAorCQlpbnQgc2xvdCkKK3sKKwlzdHJ1Y3QgYW1sX2NpICpjaSA9IGVuNTAyMjEtPmRhdGE7CisKKwlpZiAoY2ktPmNpX2dldF9zbG90X3dha2V1cCAhPSBOVUxMKSB7CisJCXJldHVybiBjaS0+Y2lfZ2V0X3Nsb3Rfd2FrZXVwKGNpLCBzbG90KTsKKwl9IGVsc2UgeworCQkvKnByX2Vycm9yKCJhbWxfY2lfc2xvdF93YWtldXAgaXMgbnVsbCAlc1xyXG4iLCBfX2Z1bmNfXyk7Ki8KKwl9CisKKwlyZXR1cm4gMTsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQgYW1sX2NpX2NpbWF4X3Nsb3RfcmVzZXQoc3RydWN0IGR2Yl9jYV9lbjUwMjIxX2NpbWF4ICplbjUwMjIxLAorCQlpbnQgc2xvdCkKK3sKKwlzdHJ1Y3QgYW1sX2NpICpjaSA9IGVuNTAyMjEtPmRhdGE7CisJcHJfZGJnKCJTbG90KCVkKTogU2xvdCBSRVNFVFxuIiwgc2xvdCk7CisJaWYgKGNpLT5jaV9zbG90X3Jlc2V0ICE9IE5VTEwpIHsKKwkJY2ktPmNpX3Nsb3RfcmVzZXQoY2ksIHNsb3QpOworCX0gZWxzZSB7CisJCXByX2Vycm9yKCJjaV9zbG90X3Jlc2V0IGlzIG51bGwgJXNcclxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisvKipcYnJpZWYgYW1sX2NpX3Nsb3Rfc2h1dGRvd246c2hvdyBzbG90CisgKiBccGFyYW0gZW41MDIyMTogZW41MDIyMSBvYmosdXNlZCB0aGlzIGRhdGEgdG8gZ2V0IGR2Yl9jaSBvYmoKKyAqIFxwYXJhbSBzbG90OiBzbG90IGluZGV4CisgKiBccmV0dXJuCisgKiAgIC0gMDpvaworICogICAtIC1FSU5WQUwgOiBlcnJvcgorICovCitzdGF0aWMgaW50IGFtbF9jaV9jaW1heF9zbG90X3NodXRkb3duKHN0cnVjdCBkdmJfY2FfZW41MDIyMV9jaW1heCAqZW41MDIyMSwKKwkJaW50IHNsb3QpCit7CisJc3RydWN0IGFtbF9jaSAqY2kgPSBlbjUwMjIxLT5kYXRhOworCXByX2RiZygiU2xvdCglZCk6IFNsb3Qgc2h1dGRvd25cbiIsIHNsb3QpOworCWlmIChjaS0+Y2lfc2xvdF9zaHV0ZG93biAhPSBOVUxMKSB7CisJCWNpLT5jaV9zbG90X3NodXRkb3duKGNpLCBzbG90KTsKKwl9IGVsc2UgeworCQlwcl9lcnJvcigiYW1sX2NpX3Nsb3Rfc2h1dGRvd24gaXMgbnVsbCAlc1xyXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKy8qKlxicmllZiBhbWxfY2lfdHNfY29udHJvbDpjb250cm9sIHNsb3QgdHMKKyAqIFxwYXJhbSBlbjUwMjIxOiBlbjUwMjIxIG9iaix1c2VkIHRoaXMgZGF0YSB0byBnZXQgZHZiX2NpIG9iagorICogXHBhcmFtIHNsb3Q6IHNsb3QgaW5kZXgKKyAqIFxyZXR1cm4KKyAqICAgLSAwOm9rCisgKiAgIC0gLUVJTlZBTCA6IGVycm9yCisgKi8KK3N0YXRpYyBpbnQgYW1sX2NpX2NpbWF4X3RzX2NvbnRyb2woc3RydWN0IGR2Yl9jYV9lbjUwMjIxX2NpbWF4ICplbjUwMjIxLAorCQlpbnQgc2xvdCkKK3sKKworCXN0cnVjdCBhbWxfY2kgKmNpID0gZW41MDIyMS0+ZGF0YTsKKwlwcl9kYmcoIlNsb3QoJWQpOiBUUyBjb250cm9sXG4iLCBzbG90KTsKKwlpZiAoY2ktPmNpX3Nsb3RfdHNfZW5hYmxlICE9IE5VTEwpIHsKKwkJY2ktPmNpX3Nsb3RfdHNfZW5hYmxlKGNpLCBzbG90KTsKKwl9IGVsc2UgeworCQlwcl9lcnJvcigiYW1sX2NpX3RzX2NvbnRyb2wgaXMgbnVsbCAlc1xyXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKy8qKlxicmllZiBhbWxfY2lfY2ltYXhfc2xvdF9zdGF0dXM6Z2V0IHNsb3Qgc3RhdHVzCisgKiBccGFyYW0gZW41MDIyMTogZW41MDIyMV9jaW1heCBvYmosdXNlZCB0aGlzIGRhdGEgdG8gZ2V0IGR2Yl9jaSBvYmoKKyAqIFxwYXJhbSBzbG90OiBzbG90IGluZGV4CisgKiBccGFyYW0gb3Blbjogbm8gdXNlZAorICogXHJldHVybgorICogICAtIGNhbSBzdGF0dXMKKyAqICAgLSAtRUlOVkFMIDogZXJyb3IKKyAqLworc3RhdGljIGludCBhbWxfY2lfY2ltYXhfc2xvdF9zdGF0dXMoCisJc3RydWN0IGR2Yl9jYV9lbjUwMjIxX2NpbWF4ICplbjUwMjIxLCBpbnQgc2xvdCwgaW50IG9wZW4pCit7CisJc3RydWN0IGFtbF9jaSAqY2kgPSBlbjUwMjIxLT5kYXRhOworCisJLypwcl9kYmcoIlNsb3QoJWQpOiBQb2xsIFNsb3Qgc3RhdHVzXG4iLCBzbG90KTsqLworCisJaWYgKGNpLT5jaV9wb2xsX3Nsb3Rfc3RhdHVzICE9IE5VTEwpIHsKKwkJcmV0dXJuIGNpLT5jaV9wb2xsX3Nsb3Rfc3RhdHVzKGNpLCBzbG90LCBvcGVuKTsKKwl9IGVsc2UgeworCQkvKnByX2Vycm9yKCJjaV9wb2xsX3Nsb3Rfc3RhdHVzIGlzIG51bGwgJXNcclxuIiwgX19mdW5jX18pOyovCisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKlxicmllZiBhbWxfY2lfcmVhZF9jaXM6IHJlYWQgY2lzCisgKiBccGFyYW0gZW41MDIyMV9tYXg6IGVuNTAyMjEgb2JqLHVzZWQgdGhpcyBkYXRhIHRvIGdldCBkdmJfY2kgb2JqCisgKiBccGFyYW0gc2xvdDogc2xvdCBpbmRleAorICogXHBhcmFtIGJ1ZjogYnVmIGZvciBjaXMgZGF0YQorICogXHBhcmFtIHNpemU6IGJ1ZiBzaXplCisgKiBccmV0dXJuCisgKiAgIC0tRUlOVkFMIDogZXJyb3IKKyAqICAgLSAgICAgICAgOiBhY3R1YWwgc2l6ZSByZWFkCisgKi8KK3N0YXRpYyBpbnQgYW1sX2NpX3JlYWRfY2lzKHN0cnVjdCBkdmJfY2FfZW41MDIyMV9jaW1heCAqZW41MDIyMSwKKwkJaW50IHNsb3QsIHU4ICpidWYsIGludCBzaXplKQoreworCXN0cnVjdCBhbWxfY2kgKmNpID0gZW41MDIyMS0+ZGF0YTsKKworCWlmIChzbG90ICE9IDApIHsKKwkJcHJfZXJyb3IoInNsb3QgIT0wICVzIDolZFxyXG4iLCBfX2Z1bmNfXywgc2xvdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjaS0+Y2lfcmVhZF9jaXMgIT0gTlVMTCkKKwkJcmV0dXJuIGNpLT5jaV9yZWFkX2NpcyhjaSwgc2xvdCwgYnVmLCBzaXplKTsKKworCXByX2Vycm9yKCJjaV9yZWFkX2NpcyBpcyBudWxsICVzXHJcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKy8qKlxicmllZiBhbWxfY2lfd3JpdGVfY29yOiB3cml0ZSBjb3IKKyAqIFxwYXJhbSBlbjUwMjIxX21heDogZW41MDIyMSBvYmosdXNlZCB0aGlzIGRhdGEgdG8gZ2V0IGR2Yl9jaSBvYmoKKyAqIFxwYXJhbSBzbG90OiBzbG90IGluZGV4CisgKiBccGFyYW0gYWRkcjoKKyAqIFxwYXJhbSBidWY6CisgKiBccmV0dXJuCisgKiAgIC0tRUlOVkFMIDogZXJyb3IKKyAqICAgLTAgICAgICAgOiBvaworICovCitzdGF0aWMgaW50IGFtbF9jaV93cml0ZV9jb3Ioc3RydWN0IGR2Yl9jYV9lbjUwMjIxX2NpbWF4ICplbjUwMjIxLAorCQlpbnQgc2xvdCwgaW50IGFkZHJlc3MsIHU4ICpidWYpCit7CisJc3RydWN0IGFtbF9jaSAqY2kgPSBlbjUwMjIxLT5kYXRhOworCisJaWYgKHNsb3QgIT0gMCkgeworCQlwcl9lcnJvcigic2xvdCAhPTAgJXMgOiVkXHJcbiIsIF9fZnVuY19fLCBzbG90KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNpLT5jaV93cml0ZV9jb3IgIT0gTlVMTCkKKwkJcmV0dXJuIGNpLT5jaV93cml0ZV9jb3IoY2ksIHNsb3QsIGFkZHJlc3MsIGJ1Zik7CisKKwlwcl9lcnJvcigiY2lfd3JpdGVfY29yIGlzIG51bGwgJXNcclxuIiwgX19mdW5jX18pOworCXJldHVybiAtRUlOVkFMOworfQorLyoqXGJyaWVmIGFtbF9jaV9uZWdvY2lhdGU6IG5lZ290aWF0ZQorICogXHBhcmFtIGVuNTAyMjFfbWF4OiBlbjUwMjIxIG9iaix1c2VkIHRoaXMgZGF0YSB0byBnZXQgZHZiX2NpIG9iagorICogXHBhcmFtIHNsb3Q6IHNsb3QgaW5kZXgKKyAqIFxwYXJhbSBzaXplOiBzdWdnZXN0ZWQgc2l6ZQorICogXHJldHVybgorICogICAtLUVJTlZBTCA6IGVycm9yCisgKiAgIC0gICAgICAgIDogc2l6ZSBuZWdvdGlhdGVkCisgKi8KK3N0YXRpYyBpbnQgYW1sX2NpX25lZ290aWF0ZShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltYXggKmVuNTAyMjEsCisJCWludCBzbG90LCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgYW1sX2NpICpjaSA9IGVuNTAyMjEtPmRhdGE7CisKKwlpZiAoc2xvdCAhPSAwKSB7CisJCXByX2Vycm9yKCJzbG90ICE9MCAlcyA6JWRcclxuIiwgX19mdW5jX18sIHNsb3QpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY2ktPmNpX25lZ290aWF0ZSAhPSBOVUxMKQorCQlyZXR1cm4gY2ktPmNpX25lZ290aWF0ZShjaSwgc2xvdCwgc2l6ZSk7CisKKwlwcl9lcnJvcigiY2lfbmVnb3RpYXRlIGlzIG51bGwgJXNcclxuIiwgX19mdW5jX18pOworCXJldHVybiAtRUlOVkFMOworfQorLyoqXGJyaWVmIGFtbF9jaV9yZWFkX2xwZHU6IHJlYWQgbHBkdQorICogXHBhcmFtIGVuNTAyMjFfbWF4OiBlbjUwMjIxIG9iaix1c2VkIHRoaXMgZGF0YSB0byBnZXQgZHZiX2NpIG9iagorICogXHBhcmFtIHNsb3Q6IHNsb3QgaW5kZXgKKyAqIFxwYXJhbSBidWY6ICBidWYKKyAqIFxwYXJhbSBzaXplOiBidWYgc2l6ZQorICogXHJldHVybgorICogICAtLUVJTlZBTCA6IGVycm9yCisgKiAgIC0gICAgICAgIDogc2l6ZSByZWFkCisgKi8KK3N0YXRpYyBpbnQgYW1sX2NpX3JlYWRfbHBkdShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltYXggKmVuNTAyMjEsCisJCWludCBzbG90LCB1OCAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgYW1sX2NpICpjaSA9IGVuNTAyMjEtPmRhdGE7CisKKwlpZiAoc2xvdCAhPSAwKSB7CisJCXByX2Vycm9yKCJzbG90ICE9MCAlcyA6JWRcclxuIiwgX19mdW5jX18sIHNsb3QpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY2ktPmNpX3JlYWRfbHBkdSAhPSBOVUxMKQorCQlyZXR1cm4gY2ktPmNpX3JlYWRfbHBkdShjaSwgc2xvdCwgYnVmLCBzaXplKTsKKworCXByX2Vycm9yKCJjaV9yZWFkX2xwZHUgaXMgbnVsbCAlc1xyXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKlxicmllZiBhbWxfY2lfd3JpdGVfbHBkdTogd3JpdGUgbHBkdQorICogXHBhcmFtIGVuNTAyMjFfbWF4OiBlbjUwMjIxIG9iaix1c2VkIHRoaXMgZGF0YSB0byBnZXQgZHZiX2NpIG9iagorICogXHBhcmFtIHNsb3Q6IHNsb3QgaW5kZXgKKyAqIFxwYXJhbSBidWY6ICBidWYKKyAqIFxwYXJhbSBzaXplOiB3cml0ZSBzaXplCisgKiBccmV0dXJuCisgKiAgIC0tRUlOVkFMIDogZXJyb3IKKyAqICAgLSAgICAgICAgOiBzaXplIHdyaXR0ZW4KKyAqLworc3RhdGljIGludCBhbWxfY2lfd3JpdGVfbHBkdShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltYXggKmVuNTAyMjEsCisJCWludCBzbG90LCB1OCAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgYW1sX2NpICpjaSA9IGVuNTAyMjEtPmRhdGE7CisKKwlpZiAoc2xvdCAhPSAwKSB7CisJCXByX2Vycm9yKCJzbG90ICE9MCAlcyA6JWRcclxuIiwgX19mdW5jX18sIHNsb3QpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY2ktPmNpX3dyaXRlX2xwZHUgIT0gTlVMTCkKKwkJcmV0dXJuIGNpLT5jaV93cml0ZV9scGR1KGNpLCBzbG90LCBidWYsIHNpemUpOworCisJcHJfZXJyb3IoImNpX3dyaXRlX2xwZHUgaXMgbnVsbCAlc1xyXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgYW1sX2NpX3JlYWRfY2FtX3N0YXR1cyhzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltYXggKmVuNTAyMjEsCisJCWludCBzbG90KQoreworCXN0cnVjdCBhbWxfY2kgKmNpID0gZW41MDIyMS0+ZGF0YTsKKworCWlmIChzbG90ICE9IDApIHsKKwkJcHJfZXJyb3IoInNsb3QgIT0wICVzIDolZFxyXG4iLCBfX2Z1bmNfXywgc2xvdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjaS0+Y2lfcmVhZF9jYW1fc3RhdHVzICE9IE5VTEwpCisJCXJldHVybiBjaS0+Y2lfcmVhZF9jYW1fc3RhdHVzKGNpLCBzbG90KTsKKworCXByX2Vycm9yKCJjaV9yZWFkX2NhbV9zdGF0dXMgaXMgbnVsbCAlc1xyXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgYW1sX2NpX2NhbV9yZXNldChzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltYXggKmVuNTAyMjEsIGludCBzbG90KQoreworCXN0cnVjdCBhbWxfY2kgKmNpID0gZW41MDIyMS0+ZGF0YTsKKworCWlmIChzbG90ICE9IDApIHsKKwkJcHJfZXJyb3IoInNsb3QgIT0wICVzIDolZFxyXG4iLCBfX2Z1bmNfXywgc2xvdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjaS0+Y2lfY2FtX3Jlc2V0ICE9IE5VTEwpCisJCXJldHVybiBjaS0+Y2lfY2FtX3Jlc2V0KGNpLCBzbG90KTsKKworCXByX2Vycm9yKCJjaV9jYW1fcmVzZXQgaXMgbnVsbCAlc1xyXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKlxicmllZiBhbWxfY2lfZ2V0X2NhcGJpbGl0eQorICogXHBhcmFtIGVuNTAyMjFfbWF4OiBlbjUwMjIxIG9iaix1c2VkIHRoaXMgZGF0YSB0byBnZXQgZHZiX2NpIG9iagorICogXHBhcmFtIHNsb3Q6IHNsb3QgaW5kZXgKKyAqIFxyZXR1cm4KKyAqICAgLSAgICAgICAgOiBjYXBiaWxpdGllcworICovCitzdGF0aWMgaW50IGFtbF9jaV9nZXRfY2FwYmlsaXR5KHN0cnVjdCBkdmJfY2FfZW41MDIyMV9jaW1heCAqZW41MDIyMSwgaW50IHNsb3QpCit7CisJc3RydWN0IGFtbF9jaSAqY2kgPSBlbjUwMjIxLT5kYXRhOworCisJaWYgKHNsb3QgIT0gMCkgeworCQlwcl9lcnJvcigic2xvdCAhPTAgJXMgOiVkXHJcbiIsIF9fZnVuY19fLCBzbG90KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGNpLT5jaV9nZXRfY2FwYmlsaXR5ICE9IE5VTEwpCisJCXJldHVybiBjaS0+Y2lfZ2V0X2NhcGJpbGl0eShjaSwgc2xvdCk7CisKKwlwcl9lcnJvcigiY2lfZ2V0X2NhcGJpbGl0eSBpcyBudWxsICVzXHJcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKipcYnJpZWYgZ2V0IGNpIGNvbmZpZyBmcm9tIGR0cworICogXHBhcmFtIG5wOiBkZXZpY2Ugbm9kZQorICogXHJldHVybgorICogICAtIDAg5oiQ5YqfCisgKiAgIC0g5YW25LuW5YC8IDoKKyAqLworc3RhdGljIGludCBhbWxfY2lfZ2V0X2NvbmZpZ19mcm9tX2R0cyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQlzdHJ1Y3QgYW1sX2NpICpjaSkKK3sKKwljaGFyIGJ1ZlszMl07CisJaW50IHJldCA9IDA7CisJaW50IHZhbHVlOworCisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzIiwgImlvX3R5cGUiKTsKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwgYnVmLCAmdmFsdWUpOworCWlmICghcmV0KSB7CisJCXByX2RiZygiJXM6IDB4JXhcbiIsIGJ1ZiwgdmFsdWUpOworCQljaS0+aW9fdHlwZSA9IHZhbHVlOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqXGJyaWVmIGFtbF9jaV9pbml0OmNpIGRldiBpbml0CisgKiBccGFyYW0gcGRldjogcGxhdGZvcm1fZGV2aWNlIGRldmljZSBub2RlLHVzZWQgdG8gZ2V0IGR0cyBpbmZvCisgKiBccGFyYW0gZHZiOiBhbWxfZHZiIG9iaix1c2VkIHRvIGdldCBkdmJfYWRhcHRlciBmb3IgZW4wMjExIHRvIHVzZQorICogXHBhcmFtIGNpcDogY2lfZGV2IHBwCisgKiBccmV0dXJuCisgKiAgIC0gMCDmiJDlip8KKyAqICAgLSDlhbbku5blgLwgOgorICovCitpbnQgYW1sX2NpX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwlzdHJ1Y3QgZHZiX2FkYXB0ZXIgKmR2Yl9hZGFwdGVyLCBzdHJ1Y3QgYW1sX2NpICoqY2lwKQoreworCXN0cnVjdCBhbWxfY2kgKmNpID0gTlVMTDsKKwlpbnQgY2FfZmxhZ3MgPSAwLCByZXN1bHQ7CisKKwljaSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhbWxfY2kpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNpKSB7CisJCXByX2Vycm9yKCJPdXQgb2YgbWVtb3J5ISwgZXhpdGluZyAuLlxuIik7CisJCXJlc3VsdCA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKwljaS0+aWQgPSAwOworCWFtbF9jaV9nZXRfY29uZmlnX2Zyb21fZHRzKHBkZXYsIGNpKTsKKworLy8JY2ktPnByaXYJCT0gZHZiOworCS8qIHJlZ2lzdGVyIENBIGludGVyZmFjZSAqLworI2lmIDAKKwlpZiAoY2ktPmlvX3R5cGUgPT0gQU1MX0RWQl9JT19UWVBFX0NJTUFYKSB7CisJCWNpLT5lbjUwMjIxX2NpbWF4Lm93bmVyID0gVEhJU19NT0RVTEU7CisJCWNpLT5lbjUwMjIxX2NpbWF4LnJlYWRfY2lzID0gYW1sX2NpX3JlYWRfY2lzOworCQljaS0+ZW41MDIyMV9jaW1heC53cml0ZV9jb3IgPSBhbWxfY2lfd3JpdGVfY29yOworCQljaS0+ZW41MDIyMV9jaW1heC5uZWdvdGlhdGUgPSBhbWxfY2lfbmVnb3RpYXRlOworCQljaS0+ZW41MDIyMV9jaW1heC5yZWFkX2xwZHUgPSBhbWxfY2lfcmVhZF9scGR1OworCQljaS0+ZW41MDIyMV9jaW1heC53cml0ZV9scGR1ID0gYW1sX2NpX3dyaXRlX2xwZHU7CisJCWNpLT5lbjUwMjIxX2NpbWF4LnJlYWRfY2FtX3N0YXR1cyA9IGFtbF9jaV9yZWFkX2NhbV9zdGF0dXM7CisJCWNpLT5lbjUwMjIxX2NpbWF4LmNhbV9yZXNldCA9IGFtbF9jaV9jYW1fcmVzZXQ7CisJCWNpLT5lbjUwMjIxX2NpbWF4LmdldF9jYXBiaWxpdHkgPSBhbWxfY2lfZ2V0X2NhcGJpbGl0eTsKKwkJY2ktPmVuNTAyMjFfY2ltYXguc2xvdF9yZXNldCA9IGFtbF9jaV9jaW1heF9zbG90X3Jlc2V0OworCQljaS0+ZW41MDIyMV9jaW1heC5zbG90X3NodXRkb3duID0gYW1sX2NpX2NpbWF4X3Nsb3Rfc2h1dGRvd247CisJCWNpLT5lbjUwMjIxX2NpbWF4LnNsb3RfdHNfZW5hYmxlID0gYW1sX2NpX2NpbWF4X3RzX2NvbnRyb2w7CisJCWNpLT5lbjUwMjIxX2NpbWF4LnBvbGxfc2xvdF9zdGF0dXMgPSBhbWxfY2lfY2ltYXhfc2xvdF9zdGF0dXM7CisJCWNpLT5lbjUwMjIxX2NpbWF4LmRhdGEgPSBjaTsKKworCQlwcl9kYmcoIlJlZ2lzdGVyaW5nIEVONTAyMjEgQ0lNQVggZGV2aWNlXG4iKTsKKwkJcmVzdWx0ID0gZHZiX2NhX2VuNTAyMjFfY2ltYXhfaW5pdChkdmJfYWRhcHRlciwKKwkJCSZjaS0+ZW41MDIyMV9jaW1heCwgY2FfZmxhZ3MsIDEpOworCQlpZiAocmVzdWx0ICE9IDApIHsKKwkJCXByX2Vycm9yKCJFTjUwMjIxIENJTUFYOiBJbml0aWFsaXphdGlvbiBmYWlsZWQgPCVkPlxuIiwKKwkJCQlyZXN1bHQpOworCQkJZ290byBlcnI7CisJCX0KKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJY2FfZmxhZ3MJCT0gfkRWQl9DQV9FTjUwMjIxX0ZMQUdfSVJRX0NBTUNIQU5HRTsKKwkJLyogcmVnaXN0ZXIgQ0EgaW50ZXJmYWNlICovCisJCWNpLT5lbjUwMjIxX2NpbWN1Lm93bmVyCQk9IFRISVNfTU9EVUxFOworCQljaS0+ZW41MDIyMV9jaW1jdS5yZWFkX2F0dHJpYnV0ZV9tZW0JPSBhbWxfY2lfbWVtX3JlYWQ7CisJCWNpLT5lbjUwMjIxX2NpbWN1LndyaXRlX2F0dHJpYnV0ZV9tZW0JPSBhbWxfY2lfbWVtX3dyaXRlOworCQljaS0+ZW41MDIyMV9jaW1jdS5yZWFkX2NhbV9jb250cm9sCT0gYW1sX2NpX2lvX3JlYWQ7CisJCWNpLT5lbjUwMjIxX2NpbWN1LndyaXRlX2NhbV9jb250cm9sCT0gYW1sX2NpX2lvX3dyaXRlOworCQljaS0+ZW41MDIyMV9jaW1jdS5zbG90X3Jlc2V0CQk9IGFtbF9jaV9zbG90X3Jlc2V0OworCQljaS0+ZW41MDIyMV9jaW1jdS5zbG90X3NodXRkb3duCT0gYW1sX2NpX3Nsb3Rfc2h1dGRvd247CisJCWNpLT5lbjUwMjIxX2NpbWN1LnNsb3RfdHNfZW5hYmxlCT0gYW1sX2NpX3RzX2NvbnRyb2w7CisJCWNpLT5lbjUwMjIxX2NpbWN1LnBvbGxfc2xvdF9zdGF0dXMJPSBhbWxfY2lfc2xvdF9zdGF0dXM7CisJCWNpLT5lbjUwMjIxX2NpbWN1LmdldF9zbG90X3dha2V1cAk9IGFtbF9jaV9zbG90X3dha2V1cDsKKworCQljaS0+ZW41MDIyMV9jaW1jdS5kYXRhCQk9IGNpOworCisKKwkJcHJfZGJnKCJSZWdpc3RlcmluZyBFTjUwMjIxIGRldmljZVxuIik7CisJCXJlc3VsdCA9IGR2Yl9jYV9lbjUwMjIxX2NpbWN1X2luaXQoZHZiX2FkYXB0ZXIsCisJCQkmY2ktPmVuNTAyMjFfY2ltY3UsIGNhX2ZsYWdzLCAxKTsKKwkJaWYgKHJlc3VsdCAhPSAwKSB7CisJCQlwcl9lcnJvcigiRU41MDIyMV9jaW1jdTogSW5pdGlhbGl6YXRpb24gZmFpbGVkIDwlZD5cbiIsCisJCQkJcmVzdWx0KTsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCSpjaXAgPSBjaTsKKwlwcl9kYmcoIlJlZ2lzdGVyZWQgRU41MDIyMSBkZXZpY2VcbiIpOworI2lmIDAKKwlpZiAoY2ktPmlvX3R5cGUgPT0gQU1MX0RWQl9JT19UWVBFX1NQSSB8fCBjaS0+aW9fdHlwZSA9PSBBTUxfRFZCX0lPX1RZUEVfU1BJX1QzMTIpIHsKKwkJLyogc3BpIGluaXQgKi8KKwkJY2ktPmNpX2luaXQgPSBhbWxfc3BpX2luaXQ7CisJCWNpLT5jaV9leGl0ID0gYW1sX3NwaV9leGl0OworCX0gZWxzZSBpZiAoY2ktPmlvX3R5cGUgPT0gQU1MX0RWQl9JT19UWVBFX0NJTUFYKSB7CisJCWNpLT5jaV9pbml0ID0gYW1sX2NpbWF4X2luaXQ7CisJCWNpLT5jaV9leGl0ID0gYW1sX2NpbWF4X2V4aXQ7CisJfSBlbHNlCisjZW5kaWYKKwlpZiAoY2ktPmlvX3R5cGUgPT0gQU1MX0RWQl9JT19UWVBFX0NJQlVTKSB7CisJCWNpLT5jaV9pbml0ID0gYW1sX2NpX2J1c19pbml0OworCQljaS0+Y2lfZXhpdCA9IGFtbF9jaV9idXNfZXhpdDsKKwl9IGVsc2UgeworCQkvKiBubyBpbyBkZXYgaW5pdCxpcyBlcnJvciAqLworCQlwcl9kYmcoInVua25vd24gaW8gdHlwZSwgcGxlYXNlIGNoZWNrIGlvX3R5cGUgaW4gZHRzIGZpbGVcclxuIik7CisJfQorCisJaWYgKGNpLT5jaV9pbml0KQorCQlyZXN1bHQgPSBjaS0+Y2lfaW5pdChwZGV2LCBjaSk7CisjaWYgMAorCWlmIChjaS0+aW9fdHlwZSA9PSBBTUxfRFZCX0lPX1RZUEVfQ0lNQVgpIHsKKwkJaWYgKHJlc3VsdCkKKwkJCWR2Yl9jYV9lbjUwMjIxX2NpbWF4X3JlbGVhc2UoJmNpLT5lbjUwMjIxX2NpbWF4KTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gcmVzdWx0OworZXJyOgorCWtmcmVlKGNpKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCit2b2lkIGFtbF9jaV9leGl0KHN0cnVjdCBhbWxfY2kgKmNpKQoreworCXByX2RiZygiVW5yZWdpc3RlcmluZyBFTjUwMjIxIGRldmljZVxuIik7CisJaWYgKGNpKSB7CisjaWYgMAorCQlpZiAoY2ktPmlvX3R5cGUgPT0gQU1MX0RWQl9JT19UWVBFX0NJTUFYKQorCQkJZHZiX2NhX2VuNTAyMjFfY2ltYXhfcmVsZWFzZSgmY2ktPmVuNTAyMjFfY2ltYXgpOworCQllbHNlCisjZW5kaWYKKwkJZHZiX2NhX2VuNTAyMjFfY2ltY3VfcmVsZWFzZSgmY2ktPmVuNTAyMjFfY2ltY3UpOworCQlpZiAoY2ktPmNpX2V4aXQpCisJCQljaS0+Y2lfZXhpdChjaSk7CisJCWtmcmVlKGNpKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYW1sX2NpICpjaV9kZXY7CisKK3N0YXRpYyBzc2l6ZV90IHRzX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKKwlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJCWludCByZXQ7CisJCXJldCA9IHNwcmludGYoYnVmLCAidHMlZFxuIiwgMSk7CisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBDTEFTU19BVFRSX1JPKHRzKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFtbF9jaV9hdHRyc1tdID0geworCSZjbGFzc19hdHRyX3RzLmF0dHIsCisJTlVMTAorfTsKKworQVRUUklCVVRFX0dST1VQUyhhbWxfY2kpOworCitzdGF0aWMgaW50IGFtbF9jaV9yZWdpc3Rlcl9jbGFzcyhzdHJ1Y3QgYW1sX2NpICpjaSkKK3sKKwkjZGVmaW5lIENMQVNTX05BTUVfTEVOIDQ4CisJaW50IHJldDsKKwlzdHJ1Y3QgY2xhc3MgKmNscDsKKworCWNscCA9ICYoY2ktPmNsYXNzKTsKKworCWNscC0+bmFtZSA9IGt6YWxsb2MoQ0xBU1NfTkFNRV9MRU4sIEdGUF9LRVJORUwpOworCWlmICghY2xwLT5uYW1lKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNucHJpbnRmKChjaGFyICopY2xwLT5uYW1lLCBDTEFTU19OQU1FX0xFTiwgImFtbGNpLSVkIiwgY2ktPmlkKTsKKwljbHAtPm93bmVyID0gVEhJU19NT0RVTEU7CisJY2xwLT5jbGFzc19ncm91cHMgPSBhbWxfY2lfZ3JvdXBzOworCXJldCA9IGNsYXNzX3JlZ2lzdGVyKGNscCk7CisJaWYgKHJldCkKKwkJa2ZyZWUoY2xwLT5uYW1lKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtbF9jaV91bnJlZ2lzdGVyX2NsYXNzKHN0cnVjdCBhbWxfY2kgKmNpKQoreworCWNsYXNzX3VucmVnaXN0ZXIoJmNpLT5jbGFzcyk7CisJa3pmcmVlKGNpLT5jbGFzcy5uYW1lKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGFtbF9jaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkdmJfYWRhcHRlciAqZHZiX2FkYXB0ZXIgPSBhbWxfZ2V0X2R2Yl9hZGFwdGVyKCk7CisJaW50IGVyciA9IDA7CisJcHJfZGJnKCItLS1BbWxvZ2ljIENJIEluaXQtLS1bJXBdXG4iLCBkdmJfYWRhcHRlcik7CisKKwllcnIgPSBhbWxfY2lfaW5pdChwZGV2LCBkdmJfYWRhcHRlciwgJmNpX2Rldik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY2lfZGV2KTsKKwlhbWxfY2lfcmVnaXN0ZXJfY2xhc3MoY2lfZGV2KTsKKyNpZiAwCisJaWYgKGNpX2Rldi0+aW9fdHlwZSA9PSBBTUxfRFZCX0lPX1RZUEVfU1BJIHx8CisJCWNpX2Rldi0+aW9fdHlwZSA9PSBBTUxfRFZCX0lPX1RZUEVfU1BJX1QzMTIpCisJCQlhbWxfc3BpX21vZF9pbml0KCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWxfY2lfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJYW1sX2NpX3VucmVnaXN0ZXJfY2xhc3MoY2lfZGV2KTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKyNpZiAwCisJaWYgKGNpX2Rldi0+aW9fdHlwZSA9PSBBTUxfRFZCX0lPX1RZUEVfU1BJIHx8CisJCWNpX2Rldi0+aW9fdHlwZSA9PSBBTUxfRFZCX0lPX1RZUEVfU1BJX1QzMTIpIHsKKwkJCWFtbF9zcGlfZXhpdChjaV9kZXYpOworCQkJYW1sX3NwaV9tb2RfZXhpdCgpOworCQl9CisJZWxzZSBpZiAoY2lfZGV2LT5pb190eXBlID09IEFNTF9EVkJfSU9fVFlQRV9DSU1BWCkKKwkJYW1sX2NpbWF4X2V4aXQoY2lfZGV2KTsKKwllbHNlCisjZW5kaWYKKwlpZiAoY2lfZGV2LT5pb190eXBlID09IEFNTF9EVkJfSU9fVFlQRV9DSUJVUykKKwkJYW1sX2NpX2J1c19leGl0KGNpX2Rldik7CisJZWxzZQorCQlwcl9kYmcoIi0tLUFtbG9naWMgQ0kgcmVtb3ZlIHVua293biBpbyB0eXBlLS0tXG4iKTsKKworCWFtbF9jaV9leGl0KGNpX2Rldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1sX2NpX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXByX2RiZygiQW1sb2dpYyBDSSBTdXNwZW5kIVxuIik7CisjaWYgMAorCWlmIChjaV9kZXYtPmlvX3R5cGUgPT0gQU1MX0RWQl9JT19UWVBFX1NQSSB8fAorCQljaV9kZXYtPmlvX3R5cGUgPT0gQU1MX0RWQl9JT19UWVBFX1NQSV9UMzEyKSB7CisJCSAgYW1sX3NwaV9leGl0KGNpX2Rldik7CisJCX0KKwllbHNlIGlmIChjaV9kZXYtPmlvX3R5cGUgPT0gQU1MX0RWQl9JT19UWVBFX0NJTUFYKQorCQlhbWxfY2ltYXhfZXhpdChjaV9kZXYpOworCWVsc2UKKyNlbmRpZgorCWlmIChjaV9kZXYtPmlvX3R5cGUgPT0gQU1MX0RWQl9JT19UWVBFX0NJQlVTKQorCQlhbWxfY2lfYnVzX2V4aXQoY2lfZGV2KTsKKwllbHNlCisJCXByX2RiZygiLS0tQW1sb2dpYyBDSSByZW1vdmUgdW5rb3duIGlvIHR5cGUtLS1cbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1sX2NpX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCBlcnIgPSAwOworCXByX2RiZygiQW1sb2dpYyBDSSBSZXN1bWUhXG4iKTsKKyNpZiAwCisJaWYgKGNpX2Rldi0+aW9fdHlwZSA9PSBBTUxfRFZCX0lPX1RZUEVfU1BJIHx8CisJCWNpX2Rldi0+aW9fdHlwZSA9PSBBTUxfRFZCX0lPX1RZUEVfU1BJX1QzMTIpIHsKKwkJICBhbWxfc3BpX2luaXQocGRldiwgY2lfZGV2KTsKKwkJfQorCWVsc2UgaWYgKGNpX2Rldi0+aW9fdHlwZSA9PSBBTUxfRFZCX0lPX1RZUEVfQ0lNQVgpCisJCWFtbF9jaW1heF9pbml0KHBkZXYsIGNpX2Rldik7CisJZWxzZQorI2VuZGlmCisJaWYgKGNpX2Rldi0+aW9fdHlwZSA9PSBBTUxfRFZCX0lPX1RZUEVfQ0lCVVMpCisJCWFtbF9jaV9idXNfaW5pdChwZGV2LCBjaV9kZXYpOworCWVsc2UKKwkJcHJfZGJnKCItLS1BbWxvZ2ljIENJIHJlbW92ZSB1bmtvd24gaW8gdHlwZS0tLVxuIik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZHZiY2lfZGV2X2R0X21hdGNoW10gPSB7CisJeworCQkuY29tcGF0aWJsZSA9ICJhbWxvZ2ljLCBkdmJjaSIsCisJfSwKKwl7fSwKK307CisKKworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhbWxfY2lfZHJpdmVyID0geworCS5wcm9iZQkJPSBhbWxfY2lfcHJvYmUsCisJLnJlbW92ZQkJPSBhbWxfY2lfcmVtb3ZlLAorCS5zdXNwZW5kICAgICAgICA9IGFtbF9jaV9zdXNwZW5kLAorCS5yZXN1bWUgICAgICAgICA9IGFtbF9jaV9yZXN1bWUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImR2YmNpIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gZHZiY2lfZGV2X2R0X21hdGNoLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9Cit9OworCitzdGF0aWMgaW50ICBhbWxfY2lfbW9kX2luaXQodm9pZCkKK3sKKwlwcl9kYmcoIkFtbG9naWMgQ0kgbW9kZSBpbml0XG4iKTsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhbWxfY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgIGFtbF9jaV9tb2RfZXhpdCh2b2lkKQoreworCXByX2RiZygiQW1sb2dpYyBDSSBtb2RlIEV4aXRcbiIpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhbWxfY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYW1sX2NpX21vZF9pbml0KTsKK21vZHVsZV9leGl0KGFtbF9jaV9tb2RfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvYW1sX2NpLmggYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2FtbF9jaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MzQ1NTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2FtbF9jaS5oCkBAIC0wLDAgKzEsMTI0IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorKiBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqCisqIERlc2NyaXB0aW9uOgorKi8KKworI2lmbmRlZiBfX0FNTF9DSV9IXworI2RlZmluZSBfX0FNTF9DSV9IXworCisvLyNpbmNsdWRlICJkcml2ZXJzL21lZGlhL2R2Yi1jb3JlL2R2Yl9jYV9lbjUwMjIxLmgiCisjaW5jbHVkZSAiY2ltY3UvZHZiX2NhX2VuNTAyMjFfY2ltY3UuaCIKKy8vI2luY2x1ZGUgImNpbWF4L2R2Yl9jYV9lbjUwMjIxX2NpbWF4LmgiCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKK2VudW0gYW1sX2R2Yl9pb190eXBlX2UgeworCUFNTF9EVkJfSU9fVFlQRV9JT0JVUyA9IDAsCisJQU1MX0RWQl9JT19UWVBFX1NQSSwKKwlBTUxfRFZCX0lPX1RZUEVfQ0lNQVgsCisJQU1MX0RWQl9JT19UWVBFX1NQSV9UMzEyLAorCUFNTF9EVkJfSU9fVFlQRV9DSUJVUywKKwlBTUxfRFZCX0lPX1RZUEVfTUFYLAorfTsKKworZW51bSBhbWxfZ3Bpb19sZXZlbF9lIHsKKwkJQU1MX0dQSU9fTE9XID0gMCwKKwkJQU1MX0dQSU9fSElHSAorfTsKK2VudW0gQU1fQ0lfQ01EIHsKKwkJQU1fQ0lfQ01EX0lPUiA9IDAsCisJCUFNX0NJX0NNRF9JT1csCisJCUFNX0NJX0NNRF9NRU1SLAorCQlBTV9DSV9DTURfTUVNVywKKwkJQU1fQ0lfQ01EX0ZVTExURVNULAorCQlBTV9DSV9DTURfQ0lTVEVTVCwKKwkJQU1fQ0lfQ01EX0dFVENEMTIsCisJCUFNX0NJX0NNRF9QT1dFUiwKKwkJQU1fQ0lfQ01EX1JFU0VULAorCQlBTV9DSV9DTURfQ09OR1BJTywKK307CisKK3N0cnVjdCBhbWxfY2kgeworLy8Jc3RydWN0IGR2Yl9jYV9lbjUwMjIxCQllbjUwMjIxOworCXN0cnVjdCBkdmJfY2FfZW41MDIyMV9jaW1jdQllbjUwMjIxX2NpbWN1OworCXN0cnVjdCBtdXRleAkJCWNpX2xvY2s7CisJaW50CQkJCWlvX3R5cGU7CisJdm9pZAkJCQkqcHJpdjsKKwlpbnQJCQkJaWQ7CisJc3RydWN0IGNsYXNzCQkJY2xhc3M7CisKKwlpbnQgKCpjaV9pbml0KShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgYW1sX2NpICpjaSk7CisJaW50ICgqY2lfZXhpdCkoc3RydWN0IGFtbF9jaSAqY2kpOworCisJLyogTk9URTogdGhlIHJlYWRfKiwgd3JpdGVfKiBhbmQgcG9sbF9zbG90X3N0YXR1cyBmdW5jdGlvbnMgd2lsbCBiZQorCSAqIGNhbGxlZCBmb3IgZGlmZmVyZW50IHNsb3RzIGNvbmN1cnJlbnRseSBhbmQgbmVlZCB0byB1c2UgbG9ja3Mgd2hlcmUKKwkgKiBhbmQgaWYgYXBwcm9wcmlhdGUuIFRoZXJlIHdpbGwgYmUgbm8gY29uY3VycmVudCBhY2Nlc3MgdG8gb25lIHNsb3QuCisJICovCisKKwkvKiBmdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyBhdHRyaWJ1dGUgbWVtb3J5IG9uIHRoZSBDQU0gKi8KKwlpbnQgKCpjaV9tZW1fcmVhZCkoc3RydWN0IGFtbF9jaSAqY2EsIGludCBzbG90LCBpbnQgYWRkcmVzcyk7CisJaW50ICgqY2lfbWVtX3dyaXRlKShzdHJ1Y3QgYW1sX2NpICpjYSwgaW50IHNsb3QsIGludCBhZGRyZXNzLCB1OCB2YWx1ZSk7CisKKwkvKiBmdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyB0aGUgY29udHJvbCBpbnRlcmZhY2Ugb24gdGhlIENBTSAqLworCWludCAoKmNpX2lvX3JlYWQpKHN0cnVjdCBhbWxfY2kgKmNhLCBpbnQgc2xvdCwgaW50IGFkZHJlc3MpOworCWludCAoKmNpX2lvX3dyaXRlKShzdHJ1Y3QgYW1sX2NpICpjYSwgaW50IHNsb3QsIGludCBhZGRyZXNzLCB1OCB2YWx1ZSk7CisKKwkvKiBGdW5jdGlvbnMgZm9yIGNvbnRyb2xsaW5nIHNsb3RzICovCisJaW50ICgqY2lfc2xvdF9yZXNldCkoc3RydWN0IGFtbF9jaSAqY2EsIGludCBzbG90KTsKKwlpbnQgKCpjaV9zbG90X3NodXRkb3duKShzdHJ1Y3QgYW1sX2NpICpjYSwgaW50IHNsb3QpOworCWludCAoKmNpX3Nsb3RfdHNfZW5hYmxlKShzdHJ1Y3QgYW1sX2NpICpjYSwgaW50IHNsb3QpOworCisJLyoKKwkqIFBvbGwgc2xvdCBzdGF0dXMuCisJKiBPbmx5IG5lY2Vzc2FyeSBpZiBEVkJfQ0FfRkxBR19FTjUwMjIxX0lSUV9DQU1DSEFOR0UgaXMgbm90IHNldAorCSovCisJaW50ICgqY2lfcG9sbF9zbG90X3N0YXR1cykoc3RydWN0IGFtbF9jaSAqY2EsIGludCBzbG90LCBpbnQgb3Blbik7CisKKwlpbnQgKCpjaV9nZXRfc2xvdF93YWtldXApKHN0cnVjdCBhbWxfY2kgKmNhLCBpbnQgc2xvdCk7CisKKwkvL3N0cnVjdCBkdmJfY2FfZW41MDIyMV9jaW1heCBlbjUwMjIxX2NpbWF4OworCisJLy9pbnQgKCpjaV9yZWFkX2Npcykoc3RydWN0IGFtbF9jaSAqY2EsIGludCBzbG90LCB1OCAqYnVmLCBpbnQgc2l6ZSk7CisJLy9pbnQgKCpjaV93cml0ZV9jb3IpKHN0cnVjdCBhbWxfY2kgKmNhLCBpbnQgc2xvdCwgaW50IGFkZHJlc3MsIHU4ICpidWYpOworICAgICAgLypyZXR1cm4gdGhlIGZpbmFsIHNpemUgb3IgLTEgZm9yIGVycm9yKi8KKwkvL2ludCAoKmNpX25lZ290aWF0ZSkoc3RydWN0IGFtbF9jaSAqY2EsIGludCBzbG90LCBpbnQgc2l6ZSk7CisKKwkvKiBmdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyB0aGUgY29udHJvbCBpbnRlcmZhY2Ugb24gdGhlIENBTSAqLworCS8vaW50ICgqY2lfcmVhZF9scGR1KShzdHJ1Y3QgYW1sX2NpICpjYSwgaW50IHNsb3QsIHU4ICpidWYsIGludCBzaXplKTsKKwkvL2ludCAoKmNpX3dyaXRlX2xwZHUpKHN0cnVjdCBhbWxfY2kgKmNhLCBpbnQgc2xvdCwgdTggKmJ1ZiwgaW50IHNpemUpOworCisJLy9pbnQgKCpjaV9nZXRfY2FwYmlsaXR5KShzdHJ1Y3QgYW1sX2NpICpjYSwgaW50IHNsb3QpOworCisJLy9pbnQgKCpjaV9jYW1fcmVzZXQpKHN0cnVjdCBhbWxfY2kgKmNhLCBpbnQgc2xvdCk7CisJLy9pbnQgKCpjaV9yZWFkX2NhbV9zdGF0dXMpKHN0cnVjdCBhbWxfY2kgKmNhLCBpbnQgc2xvdCk7CisKKwkvKiBwcml2YXRlIGRhdGEsIHVzZWQgYnkgY2FsbGVyICovCisJdm9pZCAqZGF0YTsKK307CisKK3N0cnVjdCBjaV9kZXZfY29uZmlnX3MgeworCWNoYXIgbmFtZVsyMF07CisJdW5zaWduZWQgY2hhciB0eXBlOworCWludCBjc19ob2xkX2RlbGF5OworCWludCBjc19jbGtfZGVsYXk7Cit9OworZXh0ZXJuIGludCBhbWxfY2lfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQlzdHJ1Y3QgZHZiX2FkYXB0ZXIgKmR2Yl9hZGFwdGVyLCBzdHJ1Y3QgYW1sX2NpICoqY2lwKTsKK2V4dGVybiB2b2lkIGFtbF9jaV9leGl0KHN0cnVjdCBhbWxfY2kgKmNpKTsKKworI2VuZGlmIC8qIF9fQU1MX0NJX0hfICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvYW1sX2NpX2J1cy5jIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9hbWxfY2lfYnVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzOGRmZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvYW1sX2NpX2J1cy5jCkBAIC0wLDAgKzEsMTkwMyBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE3IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyogbW9yZSBkZXRhaWxzLgorKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKgorKiBEZXNjcmlwdGlvbjoKKyovCisKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL2FtbF9ncGlvX2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlICJhbWxfY2lfYnVzLmgiCisjaW5jbHVkZSAiYW1sX2NpLmgiCisKKworCisvL2NhbiBzZWUganRhZyBkdHMgYW5kIGRyaXZlciB0byBzZWxlY3QgZ3BpbyBmdW5jdGlvbi4KKy8vd3JpdGUgZHRzIGNvbmZpZyBmb3IgY2FtL3RzaW4vb3V0CisvL2dwaW8gaXJxIGlzIGNhbiB1c2VkLgorLy8KK3N0YXRpYyBzdHJ1Y3QgYW1sX2NpX2J1cyBjaV9idXM7CitzdGF0aWMgaW50IGFtbF9jaV9idXNfZGVidWcgPSAxOworc3RhdGljIGludCBhbWxfY2lfYnVzX3RpbWUgPSA1MDA7CitzdGF0aWMgaW50IGFtbF9jaV9idXNfc2V0X2RlbGF5ID0gMDsKKworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHdxKTsKK3N0YXRpYyB1MzIgZmV0Y2hfZG9uZTsKKworbW9kdWxlX3BhcmFtX25hbWVkKGNpX2J1c19kZWJ1ZywgYW1sX2NpX2J1c19kZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoY2lfYnVzX2RlYnVnLCAiZW5hYmxlIHZlcmJvc2UgZGVidWcgbWVzc2FnZXMiKTsKKworbW9kdWxlX3BhcmFtX25hbWVkKGNpX2J1c19zZXRfZGVsYXksIGFtbF9jaV9idXNfc2V0X2RlbGF5LCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhjaV9idXNfc2V0X2RlbGF5LCAiZW5hYmxlIGNpIGJ1cyBkZWxheSBzZXQiKTsKKworbW9kdWxlX3BhcmFtX25hbWVkKGNpX2J1c190aW1lLCBhbWxfY2lfYnVzX3RpbWUsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNpX2J1c190aW1lLCAic2V0IGNpIGJ1cyB0aW1lIik7CisKKworI2RlZmluZSBwcl9kYmcoYXJncy4uLilcCisJZG8ge1wKKwkJaWYgKGFtbF9jaV9idXNfZGVidWcpXAorCQkJcHJpbnRrKGFyZ3MpO1wKKwl9IHdoaWxlICgwKQorI2RlZmluZSBwcl9lcnJvcihmbXQsIGFyZ3MuLi4pIHByaW50aygiQU1MX0NJX0JVUzogIiBmbXQsICMjIGFyZ3MpCisKKworI2RlZmluZSBJTlBVVCAwCisjZGVmaW5lIE9VVFBVVCAxCisjZGVmaW5lIE9VVExFVkVMX0xPVyAwCisjZGVmaW5lIE9VVExFVkVMX0hJR0ggMQorI2RlZmluZSBQVUxMTE9XIDEKKyNkZWZpbmUgUFVMTEhJR0ggMAorCisjZGVmaW5lIEFNTF9NT0RFX05BTUUgICAgICAgImFtbF9kdmJjaV9idXMiCisKK2ludCAgYW1sX2NpX2J1c19tb2RfaW5pdCh2b2lkKTsKK3ZvaWQgIGFtbF9jaV9idXNfbW9kX2V4aXQodm9pZCk7CitzdGF0aWMgIGludCBhbWxfcmVhZF9zZWxmKHVuc2lnbmVkIGludCByZWcpOworc3RhdGljIHZvaWQgYW1sX3dyaXRlX3NlbGYodW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbCk7CitzdGF0aWMgaW50IGFtbF9zZXRfZ3Bpb19vdXQoc3RydWN0IGdwaW9fZGVzYyAqZ3BpbywgaW50IHZhbCk7CitzdGF0aWMgaW50IGFtbF9zZXRfZ3Bpb19pbihzdHJ1Y3QgZ3Bpb19kZXNjICpncGlvKTsKKworI2RlZmluZSBXUklURV9DSUJVU19SRUcoX3IsIF92KSAgIGFtbF93cml0ZV9zZWxmKF9yLCBfdikKKyNkZWZpbmUgUkVBRF9DSUJVU19SRUcoX3IpICAgICAgICBhbWxfcmVhZF9zZWxmKF9yKQorCisjZGVmaW5lIFVTRURfSVJRICAwCisKK3N0YXRpYyB2b2lkICpwX2h3X2Jhc2U7CisvL3dyaXRlIHJlZworc3RhdGljIHZvaWQgYW1sX3dyaXRlX3NlbGYodW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbCkKK3sKKwl2b2lkICpwdHIgPSAodm9pZCAqKShwX2h3X2Jhc2UgKyByZWcpOworCXdyaXRlbCh2YWwsIHB0cik7Cit9CisvL3JlYWQgcmVnCitzdGF0aWMgIGludCBhbWxfcmVhZF9zZWxmKHVuc2lnbmVkIGludCByZWcpCit7CisJdm9pZCAqYWRkciA9IHBfaHdfYmFzZSArIHJlZzsKKwlpbnQgcmV0ID0gcmVhZGwoYWRkcik7CisJcmV0dXJuIHJldDsKK30KKworLyoqXGJyaWVmIGluaXRfY2lfYWRkcjpjaSBidXMgaW5pdCBtZW0gYWRkcgorKiBccGFyYW0gcGRldjogCisqIFxyZXR1cm4KKyogICAtIHJlYWQgdmFsdWU6b2sKKyogICAtIC1FSU5WQUwgOiBlcnJvcgorKi8KK2ludCBpbml0X2NpX2FkZHIoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJcHJfZGJnKCIlcyBmYWlsXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwX2h3X2Jhc2UgPSBkZXZtX2lvcmVtYXBfbm9jYWNoZSgmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LAorCQkJCQkgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAocF9od19iYXNlKSB7CisJCXByX2RiZygiJXMgYmFzZSBhZGRyID0gJWx4XG4iLCBfX2Z1bmNfXywKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKXBfaHdfYmFzZSk7CisJfSBlbHNlIHsKKwkJcHJfZGJnKCIlcyBiYXNlIGFkZHIgZXJyb3JcbiIsIF9fZnVuY19fKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoqXGJyaWVmIGFtbF9jaV9idXNfaW86Y2kgYnVzIHJlYWQgb3Igd3JpdGUgYXBpIHdpdGggYnVzCisqIFxwYXJhbSBjaV9idXNfZGV2OiBjaV9idXNfZGV2IG9iaix1c2VkIHRoaXMgZGF0YSB0byBjdGwKKyogXHBhcmFtIHZhbDogcmVhZCBvciB3cml0ZSB2YWx1ZQorKiBccGFyYW0gYWRkcjogcncgYWRkcgorKiBccGFyYW0gbW9kZTogY21kCisqIFxyZXR1cm4KKyogICAtIHJlYWQgdmFsdWU6b2sKKyogICAtIC1FSU5WQUwgOiBlcnJvcgorKi8KK3N0YXRpYyBpbnQgYW1sX2NpX2J1c19zZWxlY3RfZ3BpbyhzdHJ1Y3QgYW1sX2NpX2J1cyAqY2lfYnVzX2RldiwKKwkJCQlpbnQgc2VsZWN0LyosIGludCBlbmFibGUqLykKK3sKKwkvL1NFTEVDVCBHUElPIEZVTkNUSU9OCisJdW5zaWduZWQgaW50IG9sZF9zZWxlY3QgPSBjaV9idXNfZGV2LT5zZWxlY3Q7CisJc3RydWN0IHBpbmN0cmxfc3RhdGUgKnM7CisJaW50IHJldCA9IDA7CisKKwlpZiAob2xkX3NlbGVjdCA9PSBzZWxlY3QpCisJCXJldHVybiAwOworCisJaWYgKGNpX2J1c19kZXYtPmFkZHJfdHNfbW9kZV9tdWx0aXBsZXggPT0gMCkgeworCQkvL25vdCBtdWx0aXBsZXggdHMgYW5kIGNpIGFkZHIsIHNvIG5vIG5lZWQgdG8KKwkJLy9jaGFuZ2UgdHMgYW5kIGFkZHIKKwkJaWYgKHNlbGVjdCA9PSBBTUxfR1BJT19BRERSKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlpZiAoIWNpX2J1c19kZXYtPnBpbmN0cmwpIHsKKwkJY2lfYnVzX2Rldi0+cGluY3RybCA9IGRldm1fcGluY3RybF9nZXQoJmNpX2J1c19kZXYtPnBkZXYtPmRldik7CisJCWlmIChJU19FUlJfT1JfTlVMTChjaV9idXNfZGV2LT5waW5jdHJsKSkgeworCQkJZGV2X2VycigmY2lfYnVzX2Rldi0+cGRldi0+ZGV2LCAiY291bGQgbm90IGdldCBwaW5jdHJsIGhhbmRsZVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwlpZiAoSVNfRVJSX09SX05VTEwoY2lfYnVzX2Rldi0+cGluY3RybCkpIHsKKwkJCWRldl9lcnIoJmNpX2J1c19kZXYtPnBkZXYtPmRldiwgInJldHVybiwgY291bGQgbm90IGdldCBwaW5jdHJsIGhhbmRsZVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyogc2V0IHBpbm11eCAqLworCXN3aXRjaCAoc2VsZWN0KSB7CisJCWNhc2UgQU1MX0dQSU9fQUREUjoKKwkJCXMgPSBwaW5jdHJsX2xvb2t1cF9zdGF0ZShjaV9idXNfZGV2LT5waW5jdHJsLCAiY2lfYWRkcl9waW5zIik7CisJCQlpZiAoSVNfRVJSX09SX05VTEwocykpIHsKKwkJCQlkZXZfZXJyKCZjaV9idXNfZGV2LT5wZGV2LT5kZXYsCisJCQkJCQkiY291bGQgbm90IGdldCBjaV9hZGRyX3BpbnMgc3RhdGVcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJcmV0ID0gcGluY3RybF9zZWxlY3Rfc3RhdGUoY2lfYnVzX2Rldi0+cGluY3RybCwgcyk7CisJCQlpZiAocmV0KSB7CisJCQkJZGV2X2VycigmY2lfYnVzX2Rldi0+cGRldi0+ZGV2LCAiZmFpbGVkIHRvIHNldCBjaV9hZGRyX3BpbnMgcGluY3RybFxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlpZiAoY2lfYnVzX2Rldi0+bGVfcGluKSB7CisJCQkJYW1sX3NldF9ncGlvX291dChjaV9idXNfZGV2LT5sZV9waW4sIGNpX2J1c19kZXYtPmxlX2VuYWJsZV9sZXZlbCk7CisJCQkJcHJfZGJnKCJzZXQgbGUgcGluIHRvIGxvdyIpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQU1MX0dQSU9fVFM6CisJCQlpZiAoY2lfYnVzX2Rldi0+bGVfcGluKSB7CisJCQkJYW1sX3NldF9ncGlvX291dChjaV9idXNfZGV2LT5sZV9waW4sICFjaV9idXNfZGV2LT5sZV9lbmFibGVfbGV2ZWwpOworCQkJCXByX2RiZygic2V0IGxlIHBpbiB0byBoaWdoIik7CisJCQl9CisJCQlzID0gcGluY3RybF9sb29rdXBfc3RhdGUoY2lfYnVzX2Rldi0+cGluY3RybCwgImNpX3RzX3BpbnMiKTsKKwkJCWlmIChJU19FUlJfT1JfTlVMTChzKSkgeworCQkJCWRldl9lcnIoJmNpX2J1c19kZXYtPnBkZXYtPmRldiwKKwkJCQkJCSJjb3VsZCBub3QgZ2V0IGNpX3RzX3BpbnMgc3RhdGVcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJcmV0ID0gcGluY3RybF9zZWxlY3Rfc3RhdGUoY2lfYnVzX2Rldi0+cGluY3RybCwgcyk7CisJCQlpZiAocmV0KSB7CisJCQkJZGV2X2VycigmY2lfYnVzX2Rldi0+cGRldi0+ZGV2LCAiZmFpbGVkIHRvIHNldCBjaV90c19waW5zIHBpbmN0cmxcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisgICAgY2lfYnVzX2Rldi0+c2VsZWN0ID0gc2VsZWN0OworCXJldHVybiAwOworfQorCisvKipcYnJpZWYgYW1sX2NpX2J1c19zZXRfZGVsYXlfdGltZTpzZXQgY2kgYnVzIGRlbGF5IHRpbWUKKyogXHBhcmFtIG1vZGU6IGNtZCxpbyByZC93ciBvciBtZW0gcmQvd3IKKyogXHJldHVybgorKiAgIC0gcmVhZCB2YWx1ZTpvaworKiAgIC0gLUVJTlZBTCA6IGVycm9yCisqLworc3RhdGljIGludCBhbWxfY2lfYnVzX3NldF9kZWxheV90aW1lKGludCBtb2RlKQoreworCXUzMiBkZWxheTAgPSAwLCBkZWxheTEgPSAwOworCS8vc2V0IGNtZCBkZWxheQorCWlmIChtb2RlID09IEFNX0NJX0NNRF9JT1IpIHsKKwkJLy9kZWxheTAKKwkJZGVsYXkwID0gZGVsYXkwIHwgKERFTEFZX1JJT19JTklUX0FERFIgPDwgMCk7CisJCWRlbGF5MCA9IGRlbGF5MCB8IChERUxBWV9SSU9fQUREUl9DRSA8PCA4KTsKKwkJZGVsYXkwID0gZGVsYXkwIHwgKERFTEFZX1JJT19DRV9SRCA8PCAxNik7CisJCWRlbGF5MCA9IGRlbGF5MCB8IChERUxBWV9SSU9fUkRfUldBSVQgPDwgMjQpOworCQkvL2RlbGF5MQorCQlkZWxheTEgPSBkZWxheTEgfCAoREVMQVlfUklPX1JXQUlUX0RBVEEgPDwgMCk7CisJCWRlbGF5MSA9IGRlbGF5MSB8IChERUxBWV9SSU9fREFUQV9EUkQgPDwgOCk7CisJCWRlbGF5MSA9IGRlbGF5MSB8IChERUxBWV9SSU9fRFJEX0RDRSA8PCAxNik7CisJCWRlbGF5MSA9IGRlbGF5MSB8IChERUxBWV9SSU9fRENFX0lOSVQgPDwgMjQpOworCX0gZWxzZSBpZiAobW9kZSA9PSBBTV9DSV9DTURfSU9XKSB7CisJCS8vZGVsYXkwCisJCWRlbGF5MCA9IGRlbGF5MCB8IChERUxBWV9XSU9fSU5JVF9BRERSIDw8IDApOworCQlkZWxheTAgPSBkZWxheTAgfCAoREVMQVlfV0lPX0FERFJfQ0UgPDwgOCk7CisJCWRlbGF5MCA9IGRlbGF5MCB8IChERUxBWV9XSU9fQ0VfV1IgPDwgMTYpOworCQlkZWxheTAgPSBkZWxheTAgfCAoREVMQVlfV0lPX1dSX1JXQUlUIDw8IDI0KTsKKwkJLy9kZWxheTEKKwkJZGVsYXkxID0gZGVsYXkxIHwgKERFTEFZX1dJT19SV0FJVF9EQVRBIDw8IDApOworCQlkZWxheTEgPSBkZWxheTEgfCAoREVMQVlfV0lPX0RBVEFfRFdSIDw8IDgpOworCQlkZWxheTEgPSBkZWxheTEgfCAoREVMQVlfV0lPX0RXUl9EQ0UgPDwgMTYpOworCQlkZWxheTEgPSBkZWxheTEgfCAoREVMQVlfV0lPX0RDRV9JTklUIDw8IDI0KTsKKwl9IGVsc2UgaWYgKG1vZGUgPT0gQU1fQ0lfQ01EX01FTVIpIHsKKwkJLy9kZWxheTAKKwkJZGVsYXkwID0gZGVsYXkwIHwgKERFTEFZX1JNRU1fSU5JVF9BRERSIDw8IDApOworCQlkZWxheTAgPSBkZWxheTAgfCAoREVMQVlfUk1FTV9BRERSX0NFIDw8IDgpOworCQlkZWxheTAgPSBkZWxheTAgfCAoREVMQVlfUk1FTV9DRV9SRCA8PCAxNik7CisJCWRlbGF5MCA9IGRlbGF5MCB8IChERUxBWV9STUVNX1JEX1JXQUlUIDw8IDI0KTsKKwkJLy9kZWxheTEKKwkJZGVsYXkxID0gZGVsYXkxIHwgKERFTEFZX1JNRU1fUldBSVRfREFUQSA8PCAwKTsKKwkJZGVsYXkxID0gZGVsYXkxIHwgKERFTEFZX1JNRU1fREFUQV9EUkQgPDwgOCk7CisJCWRlbGF5MSA9IGRlbGF5MSB8IChERUxBWV9STUVNX0RSRF9EQ0UgPDwgMTYpOworCQlkZWxheTEgPSBkZWxheTEgfCAoREVMQVlfUk1FTV9EQ0VfSU5JVCA8PCAyNCk7CisJfSBlbHNlIGlmIChtb2RlID09IEFNX0NJX0NNRF9NRU1XKSB7CisJCS8vZGVsYXkwCisJCWRlbGF5MCA9IGRlbGF5MCB8IChERUxBWV9XTUVNX0lOSVRfQUREUiA8PCAwKTsKKwkJZGVsYXkwID0gZGVsYXkwIHwgKERFTEFZX1dNRU1fQUREUl9DRSA8PCA4KTsKKwkJZGVsYXkwID0gZGVsYXkwIHwgKERFTEFZX1dNRU1fQ0VfV1IgPDwgMTYpOworCQlkZWxheTAgPSBkZWxheTAgfCAoREVMQVlfV01FTV9XUl9SV0FJVCA8PCAyNCk7CisJCS8vZGVsYXkxCisJCWRlbGF5MSA9IGRlbGF5MSB8IChERUxBWV9XTUVNX1JXQUlUX0RBVEEgPDwgMCk7CisJCWRlbGF5MSA9IGRlbGF5MSB8IChERUxBWV9XTUVNX0RBVEFfRFdSIDw8IDgpOworCQlkZWxheTEgPSBkZWxheTEgfCAoREVMQVlfV01FTV9EV1JfRENFIDw8IDE2KTsKKwkJZGVsYXkxID0gZGVsYXkxIHwgKERFTEFZX1dNRU1fRENFX0lOSVQgPDwgMjQpOworCX0KKwkvL1d3cml0ZSBjbWQKKwlXUklURV9DSUJVU19SRUcoQ0lQTFVTX0RFTEFZX0NUUkwwLCBkZWxheTApOworCVdSSVRFX0NJQlVTX1JFRyhDSVBMVVNfREVMQVlfQ1RSTDEsIGRlbGF5MSk7CisJcmV0dXJuIDA7Cit9CisKKworLyoqXGJyaWVmIGFtbF9jaV9idXNfaW86Y2kgYnVzIHJlYWQgb3Igd3JpdGUgYXBpIHdpdGggYnVzCisqIFxwYXJhbSBjaV9idXNfZGV2OiBjaV9idXNfZGV2IG9iaix1c2VkIHRoaXMgZGF0YSB0byBjdGwKKyogXHBhcmFtIHZhbDogcmVhZCBvciB3cml0ZSB2YWx1ZQorKiBccGFyYW0gYWRkcjogcncgYWRkcgorKiBccGFyYW0gbW9kZTogY21kCisqIFxyZXR1cm4KKyogICAtIHJlYWQgdmFsdWU6b2sKKyogICAtIC1FSU5WQUwgOiBlcnJvcgorKi8KK3N0YXRpYyBpbnQgYW1sX2NpX2J1c19pbyhzdHJ1Y3QgYW1sX2NpX2J1cyAqY2lfYnVzX2RldiwKKwkJCQl1OCB2YWwsIHUxNiBhZGRyLCBpbnQgbW9kZSkKK3sKKwlpbnQgcmQ7CisJaW50IHJldCA9IC0xOworCXUzMiBhZGRyZXNzID0gYWRkcjsKKwl1MzIgZGF0YSA9IHZhbDsKKwl1MzIgcmVnID0gMDsKKwl1MzIgY3RybCA9IDA7CisJaW50IGVuYWJsZSA9IDA7CisJaW50IGNvdW50ID0gMDsKKwl1MzIgaW50X3N0YXR1czsKKwkvL29ubHkgdXNlZCBoaSBhZGRyLiB3ZSB0byBjaGFuZ2UgdHNvdXQgdG8gYWRkcgorCWlmIChhZGRyID49IDQpIHsKKwkJZW5hYmxlID0gMTsKKwl9CisJLy9jbGVhciBpcnEKKwljdHJsID0gUkVBRF9DSUJVU19SRUcoQ0lQTFVTX0NUUkxfUkVHKTsKKwljdHJsID0gY3RybCB8ICgxIDw8IENMRUFSX0NNUF9JUlEpOworCWN0cmwgPSBjdHJsIHwgKDEgPDwgQ0xFQVJfVElNRU9VVF9JUlEpOworCS8vV3dyaXRlIGNtZCBjcnRsCisJV1JJVEVfQ0lCVVNfUkVHKENJUExVU19DVFJMX1JFRywgY3RybCk7CisJZmV0Y2hfZG9uZSA9IDA7CisJLy9ncGlvIHNlbGVjdCBncGlvIGZ1bmMKKwkvL2FtbF9jaV9idXNfc2VsZWN0X2dwaW8oY2lfYnVzX2RldiwgZW5hYmxlID8gQU1MX0dQSU9fQUREUiA6IEFNTF9HUElPX1RTKTsKKwl3aGlsZSAoMSkgeworCQljb3VudCsrOworCQlpZiAoY291bnQgPCBhbWxfY2lfYnVzX3RpbWUpCisJCQlicmVhazsKKwl9CisJLy9lbmFibGUgZGVsYXkgcmVnLGRlZmFsdWUgaXMgZGlzYWJsZQorCWlmIChhbWxfY2lfYnVzX3NldF9kZWxheSkKKwkJYW1sX2NpX2J1c19zZXRfZGVsYXlfdGltZShtb2RlKTsKKwkvL2NtZCB2aWxhZAorCXJlZyA9IHJlZyB8ICgxIDw8IENJX0NNRF9WQUxJRCk7CisJLy9zZXQgYWRkcgorCXJlZyA9IHJlZyB8ICgoYWRkcmVzcyAmIDB4ZUZGRikgPDwgQ0lfQ01EX0FERFIpOworCS8vc2V0IGNtZCBhbmQgd3JpdGUgZGF0YQorCWlmIChtb2RlID09IEFNX0NJX0NNRF9JT1IpIHsKKwkJcmVnID0gcmVnIHwgKElPUkQgPDwgQ0lfQ01EX1RZUEUpOworCX0gZWxzZSBpZiAobW9kZSA9PSBBTV9DSV9DTURfSU9XKSB7CisJCXJlZyA9IHJlZyB8IChkYXRhIDw8IENJX0NNRF9XREFUQSk7CisJCXJlZyA9IHJlZyB8IChJT1dSIDw8IENJX0NNRF9UWVBFKTsKKwl9IGVsc2UgaWYgKG1vZGUgPT0gQU1fQ0lfQ01EX01FTVIpIHsKKwkJcmVnID0gcmVnIHwgKE1FTVJEIDw8IENJX0NNRF9UWVBFKTsKKwl9IGVsc2UgaWYgKG1vZGUgPT0gQU1fQ0lfQ01EX01FTVcpIHsKKwkJcmVnID0gcmVnIHwgKGRhdGEgPDwgQ0lfQ01EX1dEQVRBKTsKKwkJcmVnID0gcmVnIHwgKE1FTVdSIDw8IENJX0NNRF9UWVBFKTsKKwl9CisJLy9jbGVhciBpcnEKKwljdHJsID0gUkVBRF9DSUJVU19SRUcoQ0lQTFVTX0NUUkxfUkVHKTsKKwljdHJsID0gY3RybCB8ICgxIDw8IENMRUFSX0NNUF9JUlEpOworCWN0cmwgPSBjdHJsIHwgKDEgPDwgQ0xFQVJfVElNRU9VVF9JUlEpOworCS8vV3dyaXRlIGNtZCBjcnRsCisJV1JJVEVfQ0lCVVNfUkVHKENJUExVU19DVFJMX1JFRywgY3RybCk7CisJLy9Xd3JpdGUgY21kIHJlZworCVdSSVRFX0NJQlVTX1JFRyhDSVBMVVNfQ01EX1JFRywgcmVnKTsKKwkvL3dhaXQgY21wIGlycSBvciB0aW13b3V0IGlycQorCWlmIChVU0VEX0lSUSA9PSAxKSB7CisJCXJldCA9CisJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh3cSwgZmV0Y2hfZG9uZSAhPSAwLAorCQkJCQlIWiAvIDEwMCk7Ly8xMG1zCisJfSBlbHNlIHsKKwkJY291bnQgPSAwOworCQl3aGlsZSgxKSB7CisJCQljb3VudCsrOworCQkJaW50X3N0YXR1cyA9IFJFQURfQ0lCVVNfUkVHKENJUExVU19TVEFUVVNfUkVHKTsKKwkJCWlmICgoaW50X3N0YXR1cyYoMSA8PCBDT01QTEVURV9JUlFfU1RBVEUpKSA9PSAoMSA8PCBDT01QTEVURV9JUlFfU1RBVEUpKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoY291bnQgPiA1MCkgeworCQkJCXByaW50aygiY291bnQgdGltZW91dDolZFxyXG4iLCBjb3VudCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmQgPSBSRUFEX0NJQlVTX1JFRyhDSVBMVVNfUkRBVEFfUkVHKTsKKwkvL2dwaW8gc2VsZWN0IHRzb3V0IGZ1bmMKKwkvL2FtbF9jaV9idXNfc2VsZWN0X2dwaW8oY2lfYnVzX2RldiwgQU1MX0dQSU9fVFMsIGVuYWJsZSk7CisJcmV0dXJuIHJkOworfQorLyoqXGJyaWVmIGFtbF9jaV9idXNfaW5pdF9yZWc6Y2kgYnVzIGluaXQgcmVnLGVuYWJsZSBjaSBidXMKKyogXHBhcmFtIGNpX2J1c19kZXY6IGNpX2J1c19kZXYgb2JqLHVzZWQgdGhpcyBkYXRhIHRvIGN0bAorKiBccmV0dXJuCisqICAgLSAwOm9rCisqLworc3RhdGljIGludCBhbWxfY2lfYnVzX2luaXRfcmVnKHN0cnVjdCBhbWxfY2lfYnVzICpjaV9idXNfZGV2KQoreworCXUzMiBjdHJsID0gMDsKKworCWlmIChjaV9idXNfZGV2LT5hZGRyX3RzX21vZGVfbXVsdGlwbGV4ID09IDApIHsKKwkJYW1sX2NpX2J1c19zZWxlY3RfZ3BpbyhjaV9idXNfZGV2LEFNTF9HUElPX1RTKTsKKwl9IGVsc2UgeworCQlhbWxfY2lfYnVzX3NlbGVjdF9ncGlvKGNpX2J1c19kZXYsQU1MX0dQSU9fQUREUik7CisJfQorCisJLy9pbml0IGNpIGJ1cyByZWcKKwlwcl9kYmcoImFtbF9jaV9idXNfaW5pdF9yZWctLS1cclxuIik7CisgICAgY3RybCA9IFJFQURfQ0lCVVNfUkVHKENJUExVU19DVFJMX1JFRyk7CisJY3RybCA9IGN0cmwgfCAoMSA8PCBDSV9FTkFCTEUpOworCWN0cmwgPSBjdHJsIHwgKDEgPDwgRU5BQkxFX0NNUF9JUlEpOworCVdSSVRFX0NJQlVTX1JFRyhDSVBMVVNfQ1RSTF9SRUcsIGN0cmwpOworCisgICAgY3RybCA9IDA7CisJY3RybCA9IGN0cmwgfCAoMSA8PCBFTkFCRUxfVElNRU9VVF9JUlEpOworCWN0cmwgPSBjdHJsIHwgKFRJTUVPVVRfSVJRX0hPTERfVElNRSA8PCBXQVRUX1RJTUVPVVRfVElNRSk7CisJLy90aW1lb3V0IGhvbGQgdGltZQorCS8vV1JJVEVfQ0lCVVNfUkVHKENJUExVU19XQUlUX1RJTUVPVVQsIGN0cmwpOworCS8vYW1sX2NpX2J1c19zZWxlY3RfZ3BpbyhjaV9idXNfZGV2LEFNTF9HUElPX1RTKTsKKwlyZXR1cm4gMDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqICAgICAgICAgICAgIGdwaW8gYXBpICAgICAgICAgICAgICAgKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKlxicmllZiBhbWxfc2V0X2dwaW9fb3V0OnNldCBnaW8gb3V0IGFuZCBzZXQgdmFsIHZhbHVlCisqIFxwYXJhbSBncGlvOiBncGlvX2Rlc2Mgb2JqLAorKiBccGFyYW0gdmFsOiAgc2V0IHZhbAorKiBccmV0dXJuCisqICAgLSAwOm9rCisqICAgLSAtRUlOVkFMIDogZXJyb3IKKyovCitzdGF0aWMgaW50IGFtbF9zZXRfZ3Bpb19vdXQoc3RydWN0IGdwaW9fZGVzYyAqZ3BpbywgaW50IHZhbCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpZiAodmFsIDwgMCkgeworCQlwcl9kYmcoImdwaW8gb3V0IHZhbCA9IC0xLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHZhbCAhPSAwKQorCQl2YWwgPSAxOworCXJldCA9IGdwaW9kX2RpcmVjdGlvbl9vdXRwdXQoZ3BpbywgdmFsKTsKKwlwcl9kYmcoImR2YiBjaSBncGlvIG91dCByZXQgJWQgc2V0IHZhbDolZFxuIiwgcmV0LCB2YWwpOworCXJldHVybiByZXQ7Cit9CisKKy8qKlxicmllZiBhbWxfc2V0X2dwaW9faW46c2V0IGdpbyBpbgorKiBccGFyYW0gZ3BpbzogZ3Bpb19kZXNjIG9iaiwKKyogXHJldHVybgorKiAgIC0gMDpvaworKiAgIC0gLUVJTlZBTCA6IGVycm9yCisqLworc3RhdGljIGludCBhbWxfc2V0X2dwaW9faW4oc3RydWN0IGdwaW9fZGVzYyAqZ3BpbykKK3sKKwlncGlvZF9kaXJlY3Rpb25faW5wdXQoZ3Bpbyk7CisJcmV0dXJuIDA7Cit9CisKKy8qKlxicmllZiBhbWxfZ2V0X2dwaW9fdmFsdWU6Z2V0IGdpbyB2YWx1ZQorKiBccGFyYW0gZ3BpbzogZ3Bpb19kZXNjIG9iaiwKKyogXHJldHVybgorKiAgIC0gZ3BpbyB2YWx1ZTpvaworKiAgIC0gLUVJTlZBTCA6IGVycm9yCisqLworc3RhdGljIGludCBhbWxfZ2V0X2dwaW9fdmFsdWUoc3RydWN0IGdwaW9fZGVzYyAqZ3BpbykKK3sKKwlpbnQgcmV0ID0gMDsKKwlyZXQgPSBncGlvZF9nZXRfdmFsdWUoZ3Bpbyk7CisJcmV0dXJuIHJldDsKK30KKy8qKlxicmllZiBhbWxfZ3Bpb19mcmVlOmZyZWUgZ2lvCisqIFxwYXJhbSBncGlvOiBncGlvX2Rlc2Mgb2JqLAorKiBccmV0dXJuCisqICAgLSAwOm9rCisqICAgLSAtRUlOVkFMIDogZXJyb3IKKyovCitzdGF0aWMgaW50IGFtbF9ncGlvX2ZyZWUoc3RydWN0IGdwaW9fZGVzYyAqZ3BpbykKK3sKKwlncGlvZF9wdXQoZ3Bpbyk7CisJcmV0dXJuIDA7Cit9CisvKipcYnJpZWYgY2lfYnVzX2dldF9ncGlvX2J5X25hbWU6Z2V0IGdwaW8gZGVzYyBmcm9tIGR0cyBmaWxlCisqIFxwYXJhbSBjaV9idXNfZGV2OiBhbWxfY2lfYnVzIG9iagorKiBccGFyYW0gZ3Bpb2Q6ICAgZ3Bpb19kZXNjICogb2JqCisqIFxwYXJhbSBzdHI6IGdwaW8gbmFtZSBhdCBkdHMgZmlsZQorKiBccGFyYW0gaW5wdXRfb3V0cHV0OiBncGlvIGlucHV0IG9yIG91dHB1dCB0eXBlCisqIFxwYXJhbSBvdXRwdXRfdmFsdWU6IGdwaW8gb3V0IHB1dCB2YWx1ZQorKiBccmV0dXJuCisqICAgLSAwOm9rCisqICAgLSAtRUlOVkFMIDogZXJyb3IKKyovCitzdGF0aWMgaW50IGNpX2J1c19nZXRfZ3Bpb19ieV9uYW1lKHN0cnVjdCBhbWxfY2lfYnVzICpjaV9idXNfZGV2LAorc3RydWN0IGdwaW9fZGVzYyAqKmdwaW9kLCBpbnQgKnBpbl92YWx1ZSwKK2NoYXIgKnN0ciwgaW50IGlucHV0X291dHB1dCwgaW50IG91dHB1dF9sZXZlbCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkID0gTlVMTDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gY2lfYnVzX2Rldi0+cGRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisKKwkvKmdldCBncGlvIGNvbmZpZyBmcm9tIGR0cyovCisJLyogZ2V0IGRldmljZSBjb25maWcgZm9yIGR2YmNpX2lvKi8KKwljaGlsZCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKG5wLCAiZHZiY2lfaW8iKTsKKwlpZiAoSVNfRVJSKCpncGlvZCkpIHsKKwkJcHJfZGJnKCJkdmIgY2kgYnVzICVzIHJlcXVlc3QgZmFpbGVkXG4iLCBzdHIpOworCQlyZXR1cm4gLTE7CisJfQorCisJKnBpbl92YWx1ZSA9IG9mX2dldF9uYW1lZF9ncGlvX2ZsYWdzKGNoaWxkLCBzdHIsIDAsIE5VTEwpOworCSpncGlvZCA9IGdwaW9fdG9fZGVzYygqcGluX3ZhbHVlKTsKKwlpZiAoSVNfRVJSKCpncGlvZCkpIHsKKwkJcHJfZGJnKCJjaSBidXMgJXMgcmVxdWVzdCBmYWlsZWRcbiIsIHN0cik7CisJCXJldHVybiAtMTsKKwl9CisJcHJfZGJnKCJjaSBidXMgZ2V0X2dwaW8gJXMgJXAgICVkXG4iLCBzdHIsICpncGlvZCwgKnBpbl92YWx1ZSk7CisJZ3Bpb19yZXF1ZXN0KCpwaW5fdmFsdWUsIEFNTF9NT0RFX05BTUUpOworCisJaWYgKGlucHV0X291dHB1dCA9PSBPVVRQVVQpIHsKKwkJcmV0ID0gZ3Bpb2RfZGlyZWN0aW9uX291dHB1dCgqZ3Bpb2QsIG91dHB1dF9sZXZlbCk7CisJfSBlbHNlIGlmIChpbnB1dF9vdXRwdXQgPT0gSU5QVVQpCXsKKwkJcmV0ID0gZ3Bpb2RfZGlyZWN0aW9uX2lucHV0KCpncGlvZCk7CisJCS8qcmV0IHw9IGdwaW9kX3NldF9wdWxsdXAoKmdwaW9kLCAxKTsqLworCX0gZWxzZSB7CisJCXByX2Vycm9yKCJjaSBidXMgUmVxdWVzdCBncGlvIGRpcmVjdGlvbiBpbnZhbGlkXG4iKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqICAgICAgICAgICAgIGdwaW8gY2kgYnVzIGFwaSBlbmQgICAgKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKlxicmllZiBhbWxfY2lfYnVzX21lbV9yZWFkOmlvIHJlYWQgZnJvbSBjYW0KKyogXHBhcmFtIGNpX2RldjogYW1sX2NpIG9iaix1c2VkIHRoaXMgZGF0YSB0byBnZXQgY2lfYnVzX2RldiBvYmoKKyogXHBhcmFtIHNsb3Q6IHNsb3QgaW5kZXgKKyogXHBhcmFtIGFkZHI6IHJlYWQgYWRkcgorKiBccmV0dXJuCisqICAgLSByZWFkIHZhbHVlOm9rCisqICAgLSAtRUlOVkFMIDogZXJyb3IKKyovCitzdGF0aWMgIGludCBhbWxfY2lfYnVzX21lbV9yZWFkKAorCXN0cnVjdCBhbWxfY2kgKmNpX2RldiwgaW50IHNsb3QsIGludCBhZGRyKQoreworCXU4ICBkYXRhID0gMDsKKwl1MTYgYWRkcmVzID0gYWRkcjsKKwlpbnQgdmFsdWUgPSAwOworCXN0cnVjdCBhbWxfY2lfYnVzICpjaV9idXNfZGV2ID0gY2lfZGV2LT5kYXRhOworCW11dGV4X2xvY2soJihjaV9idXNfZGV2LT5tdXRleCkpOworCWFtbF9jaV9idXNfc2VsZWN0X2dwaW8oY2lfYnVzX2RldiwgQU1MX0dQSU9fQUREUik7CisJdmFsdWUgPSBhbWxfY2lfYnVzX2lvKGNpX2J1c19kZXYsIGRhdGEsIGFkZHJlcywgQU1fQ0lfQ01EX01FTVIpOworCW11dGV4X3VubG9jaygmKGNpX2J1c19kZXYtPm11dGV4KSk7CisJcmV0dXJuIHZhbHVlOworfQorLyoqXGJyaWVmIGFtbF9jaV9idXNfbWVtX3dyaXRlOmlvIHdyaXRlIHRvIGNhbSBieSBidXMgYXBpCisqIFxwYXJhbSBjaV9kZXY6IGFtbF9jaSBvYmosdXNlZCB0aGlzIGRhdGEgdG8gZ2V0IGNpX2J1c19kZXYgb2JqCisqIFxwYXJhbSBzbG90OiBzbG90IGluZGV4CisqIFxwYXJhbSBhZGRyOiB3cml0ZSBhZGRyCisqIFxwYXJhbSBhZGRyOiB3cml0ZSB2YWx1ZQorKiBccmV0dXJuCisqICAgLSAwOm9rCisqICAgLSAtRUlOVkFMIDogZXJyb3IKKyovCitzdGF0aWMgaW50IGFtbF9jaV9idXNfbWVtX3dyaXRlKAorCXN0cnVjdCBhbWxfY2kgKmNpX2RldiwgaW50IHNsb3QsIGludCBhZGRyLCAgdTggdmFsKQoreworCXU4ICBkYXRhID0gdmFsOworCXUxNiBhZGRyZXMgPSBhZGRyOworCWludCB2YWx1ZSA9IDA7CisJc3RydWN0IGFtbF9jaV9idXMgKmNpX2J1c19kZXYgPSBjaV9kZXYtPmRhdGE7CisJbXV0ZXhfbG9jaygmKGNpX2J1c19kZXYtPm11dGV4KSk7CisJYW1sX2NpX2J1c19zZWxlY3RfZ3BpbyhjaV9idXNfZGV2LCBBTUxfR1BJT19BRERSKTsKKwl2YWx1ZSA9IGFtbF9jaV9idXNfaW8oY2lfYnVzX2RldiwgZGF0YSwgYWRkcmVzLCBBTV9DSV9DTURfTUVNVyk7CisJbXV0ZXhfdW5sb2NrKCYoY2lfYnVzX2Rldi0+bXV0ZXgpKTsKKwlyZXR1cm4gdmFsdWU7Cit9CisvKipcYnJpZWYgYW1sX2NpX2J1c19pb19yZWFkOmlvIHJlYWQgZnJvbSBjYW0gYnkgYnVzIGFwaQorKiBccGFyYW0gY2lfZGV2OiBhbWxfY2kgb2JqLHVzZWQgdGhpcyBkYXRhIHRvIGdldCBjaV9idXNfZGV2IG9iagorKiBccGFyYW0gc2xvdDogc2xvdCBpbmRleAorKiBccGFyYW0gYWRkcjogcmVhZCBhZGRyCisqIFxyZXR1cm4KKyogICAtIHJlYWQgdmFsdWU6b2sKKyogICAtIC1FSU5WQUwgOiBlcnJvcgorKi8KK3N0YXRpYyBpbnQgYW1sX2NpX2J1c19pb19yZWFkKAorCXN0cnVjdCBhbWxfY2kgKmNpX2RldiwgaW50IHNsb3QsIGludCBhZGRyKQoreworCXU4ICBkYXRhID0gMDsKKwl1MTYgYWRkcmVzID0gYWRkcjsKKwlpbnQgdmFsdWUgPSAwOworCXN0cnVjdCBhbWxfY2lfYnVzICpjaV9idXNfZGV2ID0gY2lfZGV2LT5kYXRhOworCW11dGV4X2xvY2soJihjaV9idXNfZGV2LT5tdXRleCkpOworCWFtbF9jaV9idXNfc2VsZWN0X2dwaW8oY2lfYnVzX2RldiwgQU1MX0dQSU9fVFMpOworCXZhbHVlID0gYW1sX2NpX2J1c19pbyhjaV9idXNfZGV2LCBkYXRhLCBhZGRyZXMsIEFNX0NJX0NNRF9JT1IpOworCW11dGV4X3VubG9jaygmKGNpX2J1c19kZXYtPm11dGV4KSk7CisJcmV0dXJuIHZhbHVlOworfQorLyoqXGJyaWVmIGFtbF9jaV9idXNfaW9fd3JpdGU6aW8gd3JpdGUgdG8gY2FtCisqIFxwYXJhbSBjaV9kZXY6IGFtbF9jaSBvYmosdXNlZCB0aGlzIGRhdGEgdG8gZ2V0IGNpX2J1c19kZXYgb2JqCisqIFxwYXJhbSBzbG90OiBzbG90IGluZGV4CisqIFxwYXJhbSBhZGRyOiB3cml0ZSBhZGRyCisqIFxwYXJhbSBhZGRyOiB3cml0ZSB2YWx1ZQorKiBccmV0dXJuCisqICAgLSAwOm9rCisqICAgLSAtRUlOVkFMIDogZXJyb3IKKyovCitzdGF0aWMgaW50IGFtbF9jaV9idXNfaW9fd3JpdGUoCisJc3RydWN0IGFtbF9jaSAqY2lfZGV2LCBpbnQgc2xvdCwgaW50IGFkZHIsIHU4IHZhbCkKK3sKKwl1OCAgZGF0YSA9IHZhbDsKKwl1MTYgYWRkcmVzID0gYWRkcjsKKwlpbnQgdmFsdWUgPSAwOworCXN0cnVjdCBhbWxfY2lfYnVzICpjaV9idXNfZGV2ID0gY2lfZGV2LT5kYXRhOworCW11dGV4X2xvY2soJihjaV9idXNfZGV2LT5tdXRleCkpOworCWFtbF9jaV9idXNfc2VsZWN0X2dwaW8oY2lfYnVzX2RldiwgQU1MX0dQSU9fVFMpOworCXZhbHVlID0gYW1sX2NpX2J1c19pbyhjaV9idXNfZGV2LCBkYXRhLCBhZGRyZXMsIEFNX0NJX0NNRF9JT1cpOworCW11dGV4X3VubG9jaygmKGNpX2J1c19kZXYtPm11dGV4KSk7CisJcmV0dXJuIHZhbHVlOworfQorCisKKy8qKlxicmllZiBhbWxfY2lfYnVzX3JzdDpyZXNldCBjYW0gYnkgY2kgYnVzCisqIFxwYXJhbSBjaV9kZXY6IGFtbF9jaSBvYmosdXNlZCB0aGlzIGRhdGEgdG8gZ2V0IGNpX2J1c19kZXYgb2JqCisqIFxwYXJhbSBzbG90OiBzbG90IGluZGV4CisqIFxyZXR1cm4KKyogICAtIDA6b2sKKyogICAtIC1FSU5WQUwgOiBlcnJvcgorKi8KK3N0YXRpYyBpbnQgYW1sX2NpX2J1c19yc3QoCisJc3RydWN0IGFtbF9jaSAqY2lfZGV2LCBpbnQgc2xvdCwgaW50IGxldmVsKQoreworCWludCB2YWx1ZSA9IDA7CisJdTMyIGN0cmwgPSAwOworCXN0cnVjdCBhbWxfY2lfYnVzICpjaV9idXNfZGV2ID0gY2lfZGV2LT5kYXRhOworCW11dGV4X2xvY2soJihjaV9idXNfZGV2LT5tdXRleCkpOworCWN0cmwgPSBSRUFEX0NJQlVTX1JFRyhDSVBMVVNfQ1RSTF9SRUcpOworCWlmIChsZXZlbCA9PSBBTUxfSCkKKwkJY3RybCA9IGN0cmwgfCAoMSA8PCBDQU1fUkVTRVQpOworCWVsc2UKKwkJY3RybCA9IGN0cmwgJiAofigxIDw8IENBTV9SRVNFVCkpOworCS8vV3dyaXRlIGNtZCBjcnRsCisJV1JJVEVfQ0lCVVNfUkVHKENJUExVU19DVFJMX1JFRywgY3RybCk7CisJbXV0ZXhfdW5sb2NrKCYoY2lfYnVzX2Rldi0+bXV0ZXgpKTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qKlxicmllZiBhbWxfY2lfc2xvdF9yZXNldDpyZXNldCBzbG90CisqIFxwYXJhbSBjaV9kZXY6IGFtbF9jaSBvYmosdXNlZCB0aGlzIGRhdGEgdG8gZ2V0IGNpX2J1c19kZXYgb2JqCisqIFxwYXJhbSBzbG90OiBzbG90IGluZGV4CisqIFxyZXR1cm4KKyogICAtIDA6b2sKKyogICAtIC1FSU5WQUwgOiBlcnJvcgorKi8KK3N0YXRpYyBpbnQgYW1sX2NpX3Nsb3RfcmVzZXQoc3RydWN0IGFtbF9jaSAqY2lfZGV2LCBpbnQgc2xvdCkKK3sKKwlzdHJ1Y3QgYW1sX2NpX2J1cyAqY2lfYnVzX2RldiA9IGNpX2Rldi0+ZGF0YTsKKwlwcl9kYmcoIlNsb3QoJWQpOiBTbG90IFJFU0VUIENBTVxuIiwgc2xvdCk7CisJYW1sX3BjbWNpYV9yZXNldCgmY2lfYnVzX2Rldi0+cGMpOworCWR2Yl9jYV9lbjUwMjIxX2NpbWN1X2NhbXJlYWR5X2lycSgmY2lfZGV2LT5lbjUwMjIxX2NpbWN1LCAwKTsKKwlyZXR1cm4gMDsKK30KKy8qKlxicmllZiBhbWxfY2lfc2xvdF9zaHV0ZG93bjpzaG93IHNsb3QKKyogXHBhcmFtIGNpX2RldjogYW1sX2NpIG9iaix1c2VkIHRoaXMgZGF0YSB0byBnZXQgY2lfYnVzX2RldiBvYmoKKyogXHBhcmFtIHNsb3Q6IHNsb3QgaW5kZXgKKyogXHJldHVybgorKiAgIC0gMDpvaworKiAgIC0gLUVJTlZBTCA6IGVycm9yCisqIHJlYWRtZTpubyB1c2UgdGhpcyBhcGkKKyovCitzdGF0aWMgaW50IGFtbF9jaV9zbG90X3NodXRkb3duKHN0cnVjdCBhbWxfY2kgKmNpX2RldiwgaW50IHNsb3QpCit7CisJcHJfZGJnKCJTbG90KCVkKTogU2xvdCBzaHV0ZG93blxuIiwgc2xvdCk7CisJcmV0dXJuIDA7Cit9CisvKipcYnJpZWYgYW1sX2NpX3RzX2NvbnRyb2w6Y29udHJvbCBzbG90IHRzCisqIFxwYXJhbSBjaV9kZXY6IGFtbF9jaSBvYmosdXNlZCB0aGlzIGRhdGEgdG8gZ2V0IGNpX2J1c19kZXYgb2JqCisqIFxwYXJhbSBzbG90OiBzbG90IGluZGV4CisqIFxyZXR1cm4KKyogICAtIDA6b2sKKyogICAtIC1FSU5WQUwgOiBlcnJvcgorKiByZWFkbWU6bm8gdXNlIHRoaXMgYXBpCisqLworc3RhdGljIGludCBhbWxfY2lfdHNfY29udHJvbChzdHJ1Y3QgYW1sX2NpICpjaV9kZXYsIGludCBzbG90KQoreworCXByX2RiZygiU2xvdCglZCk6IFRTIGNvbnRyb2xcbiIsIHNsb3QpOworCXJldHVybiAwOworfQorLyoqXGJyaWVmIGFtbF9jaV9zbG90X3N0YXR1czpnZXQgc2xvdCBzdGF0dXMKKyogXHBhcmFtIGNpX2RldjogYW1sX2NpIG9iaix1c2VkIHRoaXMgZGF0YSB0byBnZXQgY2lfYnVzX2RldiBvYmoKKyogXHBhcmFtIHNsb3Q6IHNsb3QgaW5kZXgKKyogXHBhcmFtIG9wZW46IG5vIHVzZWQKKyogXHJldHVybgorKiAgIC0gY2FtIHN0YXR1cworKiAgIC0gLUVJTlZBTCA6IGVycm9yCisqLworc3RhdGljIGludCBhbWxfY2lfc2xvdF9zdGF0dXMoc3RydWN0IGFtbF9jaSAqY2lfZGV2LCBpbnQgc2xvdCwgaW50IG9wZW4pCit7CisJc3RydWN0IGFtbF9jaV9idXMgKmNpX2J1c19kZXYgPSBjaV9kZXYtPmRhdGE7CisJaW50IHN0YXRlID0gMDsKKwlpZiAoY2lfYnVzX2Rldi0+cGMuc3RhcnRfd29yayA9PSAwKSB7CisJCXJldHVybiAwOworCX0KKwlpZiAoY2lfYnVzX2Rldi0+cGMuc2xvdF9zdGF0ZSA9PSBNT0RVTEVfSU5TRVJURUQpIHsKKwkJc3RhdGUgPSBEVkJfQ0FfRU41MDIyMV9QT0xMX0NBTV9QUkVTRU5UIHwKKwkJRFZCX0NBX0VONTAyMjFfUE9MTF9DQU1fUkVBRFk7CisJfQorCWlmIChjaV9idXNfZGV2LT5zbG90X3N0YXRlICE9IGNpX2J1c19kZXYtPnBjLnNsb3Rfc3RhdGUpCisJeworCQlwcmludGsoImNhbSBjcmFkIGNoYW5nZS0tLS0tXHJcbiIpOworCQljaV9idXNfZGV2LT5zbG90X3N0YXRlID0gY2lfYnVzX2Rldi0+cGMuc2xvdF9zdGF0ZTsKKwkJc3RhdGUgPSBzdGF0ZSB8IERWQl9DQV9FTjUwMjIxX1BPTExfQ0FNX0NIQU5HRUQ7CisJfQorCXJldHVybiBzdGF0ZTsKK30KKy8qKlxicmllZiBhbWxfY2lfc2xvdF93YWtldXA6Z2V0IHNsb3Qgd2FrZSB1cCB0aHJlYWQgZmxhZworKiBccGFyYW0gY2lfZGV2OiBhbWxfY2kgb2JqLHVzZWQgdGhpcyBkYXRhIHRvIGdldCBjaV9idXNfZGV2IG9iagorKiBccGFyYW0gc2xvdDogc2xvdCBpbmRleAorKiBccmV0dXJuCisqICAgLSBjYW0gd2FrZSB1cCBmbGFnCisqICAgLSAtRUlOVkFMIDogZXJyb3IKKyovCitzdGF0aWMgaW50IGFtbF9jaV9zbG90X3dha2V1cChzdHJ1Y3QgYW1sX2NpICpjaV9kZXYsIGludCBzbG90KQoreworCXN0cnVjdCBhbWxfY2lfYnVzICpjaV9idXNfZGV2ID0gY2lfZGV2LT5kYXRhOworCWlmIChjaV9idXNfZGV2KSB7CisJCXJldHVybiBjaV9idXNfZGV2LT53YWtldXBfdGhyZWFkOworCX0KKwlyZXR1cm4gMTsKK30KKworLyoqXGJyaWVmIGFtbF9jaV9naW9fZ2V0X2lycTpnZXQgZ3BpbyBjZDEgaXJxIHBpbiB2YWx1ZQorKiBccmV0dXJuCisqICAgLSBpcnEgcGluIHZhbHVlCisqICAgLSAtRUlOVkFMIDogZXJyb3IKKyovCitzdGF0aWMgaW50IGFtbF9jaV9naW9fZ2V0X2lycSh2b2lkKQoreworCWludCByZXQgPSAwOworCXJldCA9IGFtbF9nZXRfZ3Bpb192YWx1ZShjaV9idXMuY2RfcGluMSk7CisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKiogICAgICAgIGZvciBwY21jaWQgYXBpICAgICAgICAgICAgICAqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqXGJyaWVmIGFtbF9naW9fcG93ZXI6c2V0IHBvd2VyIGdwaW8gaGkgb3IgbG93CisqIFxwYXJhbSBwYzogYW1sX3BjbWNpYSBvYmosdXNlZCB0aGlzIHByaXYgdG8gZ2V0IGNpX2J1c19kZXYgb2JqCisqIFxwYXJhbSBlbmFibGU6IHBvd2VyIHBpbiBoaSBvciBsb3cKKyogXHJldHVybgorKiAgIC0gMAorKiAgIC0gLUVJTlZBTCA6IGVycm9yCisqLworc3RhdGljIGludCBhbWxfZ2lvX3Bvd2VyKHN0cnVjdCBhbWxfcGNtY2lhICpwYywgaW50IGVuYWJsZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYW1sX2NpX2J1cyAqY2lfYnVzX2RldiA9IHBjLT5wcml2OworCWlmIChjaV9idXNfZGV2ID09IE5VTEwpIHsKKwkJcHJfZGJnKCJjaSBidXMgZGV2IGlzIG51bGwgJXMgOiAlZFxyXG4iLCBfX2Z1bmNfXywgZW5hYmxlKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwcl9kYmcoIiVzIDogJWRcclxuIiwgX19mdW5jX18sIGVuYWJsZSk7CisKKwlpZiAoZW5hYmxlID09IEFNTF9QV1JfT1BFTikgeworCQkvKmhpIGxldmVsICxvcGVuIHBvd2VyKi8KKwkJcmV0ID0gYW1sX3NldF9ncGlvX291dChjaV9idXNfZGV2LT5wd3JfcGluLCBBTUxfR1BJT19MT1cpOworCX0gZWxzZSB7CisJCS8qbG93IGxldmVsICxjbG9zZSBwb3dlciovCisJCXJldCA9IGFtbF9zZXRfZ3Bpb19pbihjaV9idXNfZGV2LT5wd3JfcGluKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorLyoqXGJyaWVmIGFtbF9naW9fcmVzZXQ6c2V0IHJlc2V0IGdwaW8gaGkgb3IgbG93CisqIFxwYXJhbSBwYzogYW1sX3BjbWNpYSBvYmosdXNlZCB0aGlzIHByaXYgdG8gZ2V0IGNpX2J1c19kZXYgb2JqCisqIFxwYXJhbSBlbmFibGU6IHJlc2V0IHBpbiBoaSBvciBsb3cKKyogXHJldHVybgorKiAgIC0gMAorKiAgIC0gLUVJTlZBTCA6IGVycm9yCisqLworc3RhdGljIGludCBhbWxfZ2lvX3Jlc2V0KHN0cnVjdCBhbWxfcGNtY2lhICpwYywgaW50IGVuYWJsZSkKK3sKKwkvKm5lZWQgc2V0IGhpIGFuZCBzbGVlcCBzZXQgbG93Ki8KKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYW1sX2NpX2J1cyAqY2lfYnVzX2RldiA9IHBjLT5wcml2OworCisJaWYgKGNpX2J1c19kZXYgPT0gTlVMTCkgeworCQlwcl9kYmcoImNpIGJ1cyBkZXYgaXMgbnVsbCAlcyA6ICVkXHJcbiIsIF9fZnVuY19fLCBlbmFibGUpOworCQlyZXR1cm4gLTE7CisJfQorCisJcHJfZGJnKCIlcyA6ICVkICB0eXBlOiAlZFxyXG4iLCBfX2Z1bmNfXywgZW5hYmxlLCBjaV9idXNfZGV2LT5pb19kZXZpY2VfdHlwZSk7CisJaWYgKGNpX2J1c19kZXYgPT0gTlVMTCB8fCBjaV9idXNfZGV2LT5wcml2ID09IE5VTEwpIHsKKwkJcHJfZGJnKCJyc3QgYnkgY2kgYnVzLSBjaSBidXMgZGV2LW51bGwtXHJcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCS8qaWYgKGVuYWJsZSA9PSBBTUxfSCkgeyovCisJCWFtbF9jaV9idXNfc2VsZWN0X2dwaW8oY2lfYnVzX2RldiwgQU1MX0dQSU9fQUREUik7CisJCS8qY2lfYnVzX2Rldi0+c2VsZWN0ID0gQU1MX0dQSU9fVFM7CisJfSovCisKKwlhbWxfY2lfYnVzX3JzdCgoc3RydWN0IGFtbF9jaSAqKWNpX2J1c19kZXYtPnByaXYsIDAsIGVuYWJsZSk7CisJcHJfZGJnKCJyc3QgYnkgY2kgYnVzLSBjaSBidXMgWyVkXS1cclxuIiwgY2lfYnVzX2Rldi0+c2VsZWN0KTsKKwkvKmlmIChlbmFibGUgPT0gQU1MX0wpCisJCWFtbF9jaV9idXNfc2VsZWN0X2dwaW8oY2lfYnVzX2RldiwgQU1MX0dQSU9fVFMpOyovCisJcmV0dXJuIHJldDsKK30KKworLyoqXGJyaWVmIGFtbF9naW9faW5pdF9pcnE6c2V0IGdwaW8gaXJxCisqIFxwYXJhbSBwYzogYW1sX3BjbWNpYSBvYmosdXNlZCB0aGlzIHByaXYgdG8gZ2V0IGNpX2J1c19kZXYgb2JqCisqIFxwYXJhbSBmbGFnOiByaXNpbmcgb3IgZmFsbGluZyBvciBoaSBvciBsb3cKKyogXHJldHVybgorKiAgIC0gMAorKiAgIC0gLUVJTlZBTCA6IGVycm9yCisqLworLypuZWVkIGNoYW5nZSovCitzdGF0aWMgaW50IGFtbF9naW9faW5pdF9pcnEoc3RydWN0IGFtbF9wY21jaWEgKnBjLCBpbnQgZmxhZykKK3sKKwlzdHJ1Y3QgYW1sX2NpX2J1cyAqY2lfYnVzX2RldiA9IChzdHJ1Y3QgYW1sX2NpX2J1cyAqKXBjLT5wcml2OworCWdwaW9kX3RvX2lycShjaV9idXNfZGV2LT5jZF9waW4xKTsKKwlyZXR1cm4gMDsKK30KKworLyoqXGJyaWVmIGFtbF9naW9fZ2V0X2NkMTpnZXQgZ3BpbyBjZDEgcGluIHZhbHVlCisqIFxwYXJhbSBwYzogYW1sX3BjbWNpYSBvYmosdXNlZCB0aGlzIHByaXYgdG8gZ2V0IGNpX2J1c19kZXYgb2JqCisqIFxyZXR1cm4KKyogICAtIGNkMSBwaW4gdmFsdWUKKyogICAtIC1FSU5WQUwgOiBlcnJvcgorKi8KK3N0YXRpYyBpbnQgYW1sX2dpb19nZXRfY2QxKHN0cnVjdCBhbWxfcGNtY2lhICpwYykKK3sKKwlpbnQgcmV0ID0gMTsKKwlzdHJ1Y3QgYW1sX2NpX2J1cyAqY2lfYnVzX2RldiA9IHBjLT5wcml2OworCXJldCA9IGFtbF9nZXRfZ3Bpb192YWx1ZShjaV9idXNfZGV2LT5jZF9waW4xKTsKKwlwcl9kYmcoIiVzIDpjZDogJWRcclxuIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKy8qKlxicmllZiBhbWxfZ2lvX2dldF9jZDI6Z2V0IGdwaW8gY2QyIHBpbiB2YWx1ZQorKiBccGFyYW0gcGM6IGFtbF9wY21jaWEgb2JqLHVzZWQgdGhpcyBwcml2IHRvIGdldCBjaV9idXNfZGV2IG9iagorKiBccmV0dXJuCisqICAgLSBjZDIgcGluIHZhbHVlCisqICAgLSAtRUlOVkFMIDogZXJyb3IKKyovCitzdGF0aWMgaW50IGFtbF9naW9fZ2V0X2NkMihzdHJ1Y3QgYW1sX3BjbWNpYSAqcGMpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGFtbF9jaV9idXMgKmNpX2J1c19kZXYgPSBwYy0+cHJpdjsKKwlyZXQgPSBhbWxfZ2V0X2dwaW9fdmFsdWUoY2lfYnVzX2Rldi0+Y2RfcGluMSk7CisJcHJfZGJnKCIlcyA6Y2Q6ICVkXHJcbiIsIF9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7Cit9CisvKipcYnJpZWYgYW1sX2NhbV9wbHVnaW46bm90aWZ5IGVuNTAyMjEgY2FtIGNhcmQgaW4gb3Igb3V0CisqIFxwYXJhbSBwYzogYW1sX3BjbWNpYSBvYmosdXNlZCB0aGlzIHByaXYgdG8gZ2V0IGNpX2J1c19kZXYgb2JqCisqIFxwbHVnaW46IDA6cmVtb3ZlOzE6aW4KKyogXHJldHVybgorKiAgIC0gMAorKiAgIC0gLUVJTlZBTCA6IGVycm9yCisqLworc3RhdGljIGludCBhbWxfY2FtX3BsdWdpbihzdHJ1Y3QgYW1sX3BjbWNpYSAqcGMsIGludCBwbHVnaW4pCit7CisJc3RydWN0IGFtbF9jaSAqY2kgPSAoc3RydWN0IGFtbF9jaSAqKQorCSgoc3RydWN0IGFtbF9jaV9idXMgKikocGMtPnByaXYpKS0+cHJpdjsKKwlwcl9kYmcoIiVzIDogJWRcclxuIiwgX19mdW5jX18sIHBsdWdpbik7CisJaWYgKHBsdWdpbikgeworCQlhbWxfY2lfYnVzX3NlbGVjdF9ncGlvKChzdHJ1Y3QgYW1sX2NpX2J1cyAqKShwYy0+cHJpdiksIEFNTF9HUElPX1RTKTsKKwkJZHZiX2NhX2VuNTAyMjFfY2ltY3VfY2FtY2hhbmdlX2lycSgmY2ktPmVuNTAyMjFfY2ltY3UsCisJCQkwLCBEVkJfQ0FfRU41MDIyMV9DQU1DSEFOR0VfSU5TRVJURUQpOworCX0gZWxzZSB7CisJCWFtbF9jaV9idXNfc2VsZWN0X2dwaW8oKHN0cnVjdCBhbWxfY2lfYnVzICopKHBjLT5wcml2KSwgQU1MX0dQSU9fQUREUik7CisJCWR2Yl9jYV9lbjUwMjIxX2NpbWN1X2NhbWNoYW5nZV9pcnEoJmNpLT5lbjUwMjIxX2NpbWN1LAorCQkJMCwgRFZCX0NBX0VONTAyMjFfQ0FNQ0hBTkdFX1JFTU9WRUQpOworCX0KKwlyZXR1cm4gMDsKK30KKy8qKlxicmllZiBhbWxfcGNtY2lhX2FsbG9jOmFsbG9jIG5hZCBpbml0IHBjbWNpYSBvYmoKKyogXHBhcmFtIGNpX2J1c19kZXY6IGFtbF9jaV9idXMgb2JqLAorKiBccGFyYW0gcGNtY2lhOiBhbWxfcGNtY2lhICogb2JqLAorKiBccmV0dXJuCisqICAgLSAwCisqICAgLSAtRUlOVkFMIDogZXJyb3IKKyovCitzdGF0aWMgdm9pZCBhbWxfcGNtY2lhX2FsbG9jKHN0cnVjdCBhbWxfY2lfYnVzICpjaV9idXNfZGV2LAorCXN0cnVjdCBhbWxfcGNtY2lhICoqcGNtY2lhKQoreworCXByX2RiZygiYW1sX3BjbWNpYV9hbGxvYy0tLS1cbiIpOworCSpwY21jaWEgPSAmY2lfYnVzX2Rldi0+cGM7CisJKCpwY21jaWEpLT5pcnEgPSBjaV9idXNfZGV2LT5pcnE7CisJKCpwY21jaWEpLT5pbml0X2lycSA9IGFtbF9naW9faW5pdF9pcnE7CisJKCpwY21jaWEpLT5nZXRfY2QxID0gYW1sX2dpb19nZXRfY2QxOworCSgqcGNtY2lhKS0+Z2V0X2NkMiA9IGFtbF9naW9fZ2V0X2NkMjsKKwkoKnBjbWNpYSktPnB3ciA9IGFtbF9naW9fcG93ZXI7CisJKCpwY21jaWEpLT5yc3QgPSBhbWxfZ2lvX3Jlc2V0OworCSgqcGNtY2lhKS0+cGNtY2lhX3BsdWdpbiA9IGFtbF9jYW1fcGx1Z2luOworCSgqcGNtY2lhKS0+c2xvdF9zdGF0ZSA9IE1PRFVMRV9YVFJBQ1RFRDsKKwkoKnBjbWNpYSktPnByaXYgPSBjaV9idXNfZGV2OworCSgqcGNtY2lhKS0+cnVuX3R5cGUgPSAwOy8qMDppcnE7MTpwb2xsKi8KKwkoKnBjbWNpYSktPmlvX2RldmljZV90eXBlID0gQU1MX0RWQl9JT19UWVBFX0NJTUFYOworCSgqcGNtY2lhKS0+c3RhcnRfd29yayA9IDA7Cit9CisKKy8qKlxicmllZiBhbWxfY2lfYnVzX2dldF9jb25maWdfZnJvbV9kdHM6CisgKiBnZXQgZ3BpbyBjb25maWcgZnJvbSBkdHMKKyogXHBhcmFtIGNpX2J1c19kZXY6IGFtbF9jaV9idXMgb2JqLAorKiBccmV0dXJuCisqICAgLSAwCisqICAgLSAtRUlOVkFMIDogZXJyb3IKKyovCitzdGF0aWMgaW50IGFtbF9jaV9idXNfZ2V0X2NvbmZpZ19mcm9tX2R0cyhzdHJ1Y3QgYW1sX2NpX2J1cyAqY2lfYnVzX2RldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkID0gTlVMTDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gY2lfYnVzX2Rldi0+cGRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJaW50IHJldCA9IDA7CisJcHJfZGJnKCJpbnRvIGdldCBjaSBidXMgZHRzIC0tLS0tXHJcbiIpOworCS8qZ2V0IGdwaW8gY29uZmlnIGZyb20gZHRzKi8KKwkvKiBnZXQgZGV2aWNlIGNvbmZpZyBmb3IgZHZiY2lfaW8qLworCWNoaWxkID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUobnAsICJkdmJjaV9pbyIpOworCWlmIChjaGlsZCA9PSBOVUxMKSB7CisJCXByX2Vycm9yKCJmYWlsZWQgdG8gZ2V0IGR2YmNpX2lvXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwkvL2JlbG93IGlzIGdldCBjZDEgY2QyIHB3ciBpcnEgcmVzZXQgZ3BpbyBpbmZvCisJaWYgKGNpX2J1c19kZXYtPmlvX2RldmljZV90eXBlID09IEFNTF9EVkJfSU9fVFlQRV9DSUJVUykgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwkJY2hhciBidWZbMzJdOworCQlpbnQgaXZhbDsKKworCQkvKmdldCBpcnEgdmFsdWUqLworCQljaV9idXNfZGV2LT5pcnFfY21wID0gMTg2OworCQltZW1zZXQoYnVmLCAwLCAzMik7CisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcyIsICJpcnFfY21wIik7CisJCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9JUlEsIGJ1Zik7CisJCWlmIChyZXMpCisJCQljaV9idXNfZGV2LT5pcnFfY21wID0gcmVzLT5zdGFydDsKKwkJZWxzZQorCQkJcHJfZXJyKCJnZXQgaXJxIGNtcCBlcnJvclxyXG4iKTsKKworCQljaV9idXNfZGV2LT5pcnFfdGltZW91dCA9IDE4NzsKKwkJbWVtc2V0KGJ1ZiwgMCwgMzIpOworCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMiLCAiaXJxX3RpbWVvdXQiKTsKKwkJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX0lSUSwgYnVmKTsKKwkJaWYgKHJlcykKKwkJCWNpX2J1c19kZXYtPmlycV90aW1lb3V0ID0gcmVzLT5zdGFydDsKKwkJZWxzZQorCQkJcHJfZXJyKCJnZXQgaXJxIGlycV90aW1lb3V0IGVycm9yXHJcbiIpOworCQkvL3BpbiBjb25maWcKKwkJcHJfZGJnKCJjaSBidXMgaXJxWyVkXWNtcFslZF0gXHJcbiIsY2lfYnVzX2Rldi0+aXJxX2NtcCwgY2lfYnVzX2Rldi0+aXJxX3RpbWVvdXQpOworCQlpZiAoIWNpX2J1c19kZXYtPnBpbmN0cmwpIHsKKwkJCWNpX2J1c19kZXYtPnBpbmN0cmwgPSBkZXZtX3BpbmN0cmxfZ2V0KCZwZGV2LT5kZXYpOworCQkJaWYgKElTX0VSUl9PUl9OVUxMKGNpX2J1c19kZXYtPnBpbmN0cmwpKSB7CisJCQkJcHJfZXJyb3IoImdldCBwaW5jdGwgY291bGQgbm90IGdldCBwaW5jdHJsIGhhbmRsZVxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKworCQlpZiAoY2lfYnVzX2Rldi0+cGluY3RybCkgeworCQkJc3RydWN0IHBpbmN0cmxfc3RhdGUgKnM7CisJCQlwcl9kYmcoImNpIGJ1cyBnZXQgdHMgcGluXHJcbiIpOworCQkJcyA9IHBpbmN0cmxfbG9va3VwX3N0YXRlKGNpX2J1c19kZXYtPnBpbmN0cmwsICJjaV90c19waW5zIik7CisJCQlpZiAoSVNfRVJSX09SX05VTEwocykpIHsKKwkJCQlwcl9lcnJvcigiY291bGQgbm90IGdldCBqdGFnX2FwZWVfcGlucyBzdGF0ZVxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcHJfZGJnKCJjaSBidXMgc2VsZWN0IHRzIHBpblxyXG4iKTsKKwkJCXJldCA9IHBpbmN0cmxfc2VsZWN0X3N0YXRlKGNpX2J1c19kZXYtPnBpbmN0cmwsIHMpOworCQkJaWYgKHJldCkgeworCQkJCXByX2Vycm9yKCJmYWlsZWQgdG8gc2V0IHBpbmN0cmxcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWNpX2J1c19kZXYtPnNlbGVjdCA9IEFNTF9HUElPX1RTOworCQl9IGVsc2UgaWYgKElTX0VSUl9PUl9OVUxMKGNpX2J1c19kZXYtPnBpbmN0cmwpKSB7CisJCQlwcl9lcnJvcigiY291bGQgbm90IGdldCBwaW5jdHJsIGhhbmRsZVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkvKmdldCByZXNldCBwd2QgY2QxIGNkMiBncGlvIHBpbiovCisJCWNpX2J1c19kZXYtPmNkX3BpbjEgPSBOVUxMOworCQlwcl9kYmcoImNpIGJ1cyBnZXQgY2QxXHJcbiIpOworCQlyZXQgPSBjaV9idXNfZ2V0X2dwaW9fYnlfbmFtZShjaV9idXNfZGV2LAorCQkJJmNpX2J1c19kZXYtPmNkX3BpbjEsCisJCQkmY2lfYnVzX2Rldi0+Y2RfcGluMV92YWx1ZSwgImNkX3BpbjEiLAorCQkJSU5QVVQsIE9VVExFVkVMX0hJR0gpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnJvcigiZHZiIGNpIGNkX3BpbjEgcGluIHJlcXVlc3QgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQljaV9idXNfZGV2LT5jZF9waW4yID0gY2lfYnVzX2Rldi0+Y2RfcGluMTsKKwkJY2lfYnVzX2Rldi0+Y2RfcGluMl92YWx1ZSA9IGNpX2J1c19kZXYtPmNkX3BpbjFfdmFsdWU7CisJCWNpX2J1c19kZXYtPnB3cl9waW4gPSBOVUxMOworCQlwcl9kYmcoImNpX2J1c19kZXYtPmNkX3BpbjFfdmFsdWU9PSVkXHJcbiIsIGNpX2J1c19kZXYtPmNkX3BpbjFfdmFsdWUpOworCQljaV9idXNfZGV2LT5pcnEgPSBncGlvZF90b19pcnEoY2lfYnVzX2Rldi0+Y2RfcGluMSkgOworCQlwcl9kYmcoImNpX2J1c19kZXYtPmlycT09JWQgIGdldCBmcm9tIGdwaW8gY2QxXHJcbiIsIGNpX2J1c19kZXYtPmlycSk7CisKKwkJcmV0ID0gY2lfYnVzX2dldF9ncGlvX2J5X25hbWUoY2lfYnVzX2RldiwKKwkJCSZjaV9idXNfZGV2LT5wd3JfcGluLCAmY2lfYnVzX2Rldi0+cHdyX3Bpbl92YWx1ZSwKKwkJCSJwd3JfcGluIiwgT1VUUFVULCBPVVRMRVZFTF9ISUdIKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyb3IoImR2YiBjaSBwd3JfcGluIHBpbiByZXF1ZXN0IGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYW1sX3NldF9ncGlvX2luKGNpX2J1c19kZXYtPnB3cl9waW4pOworCisJCS8qZ2V0IGxlIHBpbiovCisJCWNpX2J1c19kZXYtPmxlX3BpbiA9IE5VTEw7CisJCWNpX2J1c19kZXYtPmxlX2VuYWJsZV9sZXZlbCA9IDE7CisJCXJldCA9IGNpX2J1c19nZXRfZ3Bpb19ieV9uYW1lKGNpX2J1c19kZXYsCisJCQkmY2lfYnVzX2Rldi0+bGVfcGluLCAmY2lfYnVzX2Rldi0+bGVfcGluX3ZhbHVlLAorCQkJImxlX3BpbiIsIE9VVFBVVCwgT1VUTEVWRUxfSElHSCk7CisJCWlmIChyZXQpIHsKKwkJCXByX2Vycm9yKCJkdmIgY2kgbGVfcGluIHBpbiByZXF1ZXN0IGZhaWxlZFxuIik7CisJCX0gZWxzZSB7CisJCQlwcl9kYmcoImNpX2J1c19kZXYtPmxlX3ZhbHVlICVkXG4iLCBjaV9idXNfZGV2LT5sZV9waW5fdmFsdWUpOworCQl9CisJCW1lbXNldChidWYsIDAsIDMyKTsKKwkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzIiwgImxlX2VuYWJsZV9sZXZlbCIpOworCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwgYnVmLCAmaXZhbCk7CisJCWlmIChyZXQpIHsKKwkJCXByX2Vycm9yKCJkdmIgY2kgbGVfZW5hYmxlX2xldmVsIHJlcXVlc3QgZmFpbGVkXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWNpX2J1c19kZXYtPmxlX2VuYWJsZV9sZXZlbCA9IGl2YWw7CisJCQlwcl9kYmcoImNpX2J1c19kZXYtPmxlX2VuYWJsZV9sZXZlbC0tICVkXG4iLCBjaV9idXNfZGV2LT5sZV9lbmFibGVfbGV2ZWwpOworCQl9CisJCS8qZ2V0IGFkZHJfdHNfbW9kZV9tdWx0aXBsZXggbW9kZSovCisJCWNpX2J1c19kZXYtPmFkZHJfdHNfbW9kZV9tdWx0aXBsZXggPSAxOworCQltZW1zZXQoYnVmLCAwLCAzMik7CisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcyIsICJhZGRyX3RzX21vZGVfbXVsdGlwbGV4Iik7CisJCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCBidWYsICZpdmFsKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyb3IoImR2YiBjaSBhZGRyX3RzX21vZGVfbXVsdGlwbGV4IHJlcXVlc3QgZmFpbGVkXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWNpX2J1c19kZXYtPmFkZHJfdHNfbW9kZV9tdWx0aXBsZXggPSBpdmFsOworCQkJcHJfZGJnKCJjaV9idXNfZGV2LT5hZGRyX3RzX21vZGVfbXVsdGlwbGV4ICVkICoqKioqKlxuIiwgY2lfYnVzX2Rldi0+YWRkcl90c19tb2RlX211bHRpcGxleCk7CisJCX0KKworCisJfQorCXJldHVybiAwOworfQorLyoqXGJyaWVmIGFtbF9jaV9mcmVlX2dwaW86ZnJlZSBjaSBncGlvCisqIFxwYXJhbSBjaV9idXNfZGV2OiBhbWxfY2lfYnVzIG9iaiwKKyogXHJldHVybgorKiAgIC0gMAorKiAgIC0gLUVJTlZBTCA6IGVycm9yCisqLworc3RhdGljIHZvaWQgYW1sX2NpX2ZyZWVfZ3BpbyhzdHJ1Y3QgYW1sX2NpX2J1cyAqY2lfYnVzX2RldikKK3sKKwlpZiAoY2lfYnVzX2RldiA9PSBOVUxMKSB7CisJCXByX2Vycm9yKCJjaV9idXNfZGV2IGlzIE5VTEwsbm8gbmVlZCBmcmVlIGdwaW8gcmVzXHJcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGNpX2J1c19kZXYtPnB3cl9waW4pIHsKKwkJYW1sX2dwaW9fZnJlZShjaV9idXNfZGV2LT5wd3JfcGluKTsKKwkJY2lfYnVzX2Rldi0+cHdyX3BpbiA9IE5VTEw7CisJfQorCWlmIChjaV9idXNfZGV2LT5jZF9waW4xKSB7CisJCWFtbF9ncGlvX2ZyZWUoY2lfYnVzX2Rldi0+Y2RfcGluMSk7CisJCWNpX2J1c19kZXYtPmNkX3BpbjEgPSBOVUxMOworCQljaV9idXNfZGV2LT5jZF9waW4yID0gTlVMTDsKKwl9CisJaWYgKGNpX2J1c19kZXYtPmxlX3BpbikgeworCQlhbWxfZ3Bpb19mcmVlKGNpX2J1c19kZXYtPmxlX3Bpbik7CisJCWNpX2J1c19kZXYtPmxlX3BpbiA9IE5VTEw7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIGlycXJldHVybl90IHRpbWVvdXRfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwl1MzIgaW50X3N0YXR1cyA9IFJFQURfQ0lCVVNfUkVHKENJUExVU19TVEFUVVNfUkVHKTsKKworCWlmICgoaW50X3N0YXR1cyAmICgxIDw8IFRJTUVPVVRfSVJRX1NUQVRFKSkgPT0gKDEgPDwgVElNRU9VVF9JUlFfU1RBVEUpKSB7CisJCWZldGNoX2RvbmUgPSAxOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJndxKTsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgY21wX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJdTMyIGludF9zdGF0dXMgPSBSRUFEX0NJQlVTX1JFRyhDSVBMVVNfU1RBVFVTX1JFRyk7CisKKwlpZiAoKGludF9zdGF0dXMmKDEgPDwgQ09NUExFVEVfSVJRX1NUQVRFKSkgPT0gKDEgPDwgQ09NUExFVEVfSVJRX1NUQVRFKSkgeworCQlmZXRjaF9kb25lID0gMTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ3cSk7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqXGJyaWVmIGFtbF9jaV9idXNfaW5pdDpjaV9idXNfZGV2IGluaXQKKyogXHBhcmFtIGNpX2RldjogYW1sX2NpIG9iaiwKKyogXHBhcmFtIHBkZXY6IHBsYXRmb3JtX2RldmljZSBvYmosdXNlZCB0byBnZXQgZHRzIGluZm8KKyogXHJldHVybgorKiAgIC0gMAorKiAgIC0gLUVJTlZBTCA6IGVycm9yCisqLworaW50IGFtbF9jaV9idXNfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgYW1sX2NpICpjaV9kZXYpCit7CisJc3RydWN0IGFtbF9jaV9idXMgKmNpX2J1c19kZXYgPSBOVUxMOworCXN0cnVjdCBhbWxfcGNtY2lhICpwYzsKKwlpbnQgcmVzdWx0LGlycTsKKworCWNpX2J1c19kZXYgPSAmY2lfYnVzOworCWNpX2J1c19kZXYtPnBkZXYgPSBwZGV2OworCWNpX2J1c19kZXYtPnByaXYgPSBjaV9kZXY7CisJY2lfYnVzX2Rldi0+YnVzX3BpbmN0cmwgPSBOVUxMOworCWNpX2J1c19kZXYtPnBpbmN0cmwgPSBOVUxMOworCS8qZGVmYXVsdCBtb2RlIGlzIHdha2UgdXAsd2hlbiB0cmFucyBhIGxvdCBkYXRhLHVzZWQgc2xlZXAgbW9kZSovCisJY2lfYnVzX2Rldi0+d2FrZXVwX3RocmVhZCA9IDE7CisJbXV0ZXhfaW5pdCgmKGNpX2J1c19kZXYtPm11dGV4KSk7CisJLyppbml0IGlvIGRldmljZSB0eXBlKi8KKwljaV9idXNfZGV2LT5pb19kZXZpY2VfdHlwZSA9IGNpX2Rldi0+aW9fdHlwZTsKKwlwcl9kYmcoIioqKioqKioqKmNpIGJ1cyBEZXYgdHlwZSBbJWRdXG4iLCBjaV9kZXYtPmlvX3R5cGUpOworCS8qZ2V0IGNvbmZpZyBmcm9tIGR0cyovCisJYW1sX2NpX2J1c19nZXRfY29uZmlnX2Zyb21fZHRzKGNpX2J1c19kZXYpOworCS8vaW9tYXAgY2kgcmVnCisJaW5pdF9jaV9hZGRyKHBkZXYpOworCS8qUmVnaXN0ZXIgaXJxIGhhbmRsZXJzICovCisJaWYgKGNpX2J1c19kZXYtPmlycV9jbXAgIT0gLTEpIHsKKwkJaWYgKFVTRURfSVJRKSB7CisJCQlpcnEgPSByZXF1ZXN0X2lycShjaV9idXNfZGV2LT5pcnFfY21wLAorCQkJCQljbXBfaXNyLAorCQkJCQlJUlFGX1NIQVJFRHxJUlFGX1RSSUdHRVJfUklTSU5HLAorCQkJCQkiY2lwbHVzIGNtcCBpcnEiLCBjaV9idXNfZGV2KTsKKwkJCWlmIChpcnEgPT0gMCkKKwkJCQlwcl9kYmcoInJlcXVlc3QgY21wIGlycSBzdWNlc3NcclxuIik7CisJCQllbHNlIGlmIChpcnEgPT0gLUVCVVNZKQorCQkJCXByX2VycigicmVxdWVzdCBjbXAgaXJxIGJ1c3lcclxuIik7CisJCQllbHNlCisJCQkJcHJfZXJyKCJyZXF1ZXN0IGNtcCBpcnEgZXJyb3IgWyVkXVxyXG4iLCBpcnEpOworCQl9IGVsc2UgeworCQkJZGlzYWJsZV9pcnEoY2lfYnVzX2Rldi0+aXJxX2NtcCk7CisJCX0KKwl9CisJLypSZWdpc3RlciBpcnEgaGFuZGxlcnMgKi8KKwlpZiAoY2lfYnVzX2Rldi0+aXJxX3RpbWVvdXQgIT0gLTEpIHsKKwkJaWYgKFVTRURfSVJRKSB7CisJCQlwcl9kYmcoInJlcXVlc3QgdGltZW91dCBpcnFcbiIpOworCQkJaXJxID0gcmVxdWVzdF9pcnEoY2lfYnVzX2Rldi0+aXJxX3RpbWVvdXQsCisJCQkJCXRpbWVvdXRfaXNyLAorCQkJCQlJUlFGX1NIQVJFRHxJUlFGX1RSSUdHRVJfUklTSU5HLAorCQkJCQkiY2lwbHVzIHRpbWVvdXQgaXJxIiwgY2lfYnVzX2Rldik7CisJCQlpZiAoaXJxID09IDApCisJCQkJcHJfZXJyKCJyZXF1ZXN0IHRpbWVvdXQgaXJxIHN1Y2Vzc1xyXG4iKTsKKwkJCWVsc2UgaWYgKGlycSA9PSAtRUJVU1kpCisJCQkJcHJfZXJyKCJyZXF1ZXN0IHRpbWVvdXQgaXJxIGJ1c3lcclxuIik7CisJCQllbHNlCisJCQkJcHJfZXJyKCJyZXF1ZXN0IHRpbWVvdXQgaXJxIGVycm9yIFslZF1cclxuIiwgaXJxKTsKKwkJfSBlbHNlIHsKKwkJCWRpc2FibGVfaXJxKGNpX2J1c19kZXYtPmlycV90aW1lb3V0KTsKKwkJfQorCX0KKwlwcl9kYmcoIioqKioqKioqKmNpIGJ1cyBpbml0IGJ1cyByZWdcbiIpOworCWFtbF9jaV9idXNfaW5pdF9yZWcoY2lfYnVzX2Rldik7CisJLyppbml0IGNpX2RldiB1c2VkIGFwaS4qLworCWNpX2Rldi0+Y2lfbWVtX3JlYWQgID0gYW1sX2NpX2J1c19tZW1fcmVhZDsKKwljaV9kZXYtPmNpX21lbV93cml0ZSA9IGFtbF9jaV9idXNfbWVtX3dyaXRlOworCWNpX2Rldi0+Y2lfaW9fcmVhZCA9IGFtbF9jaV9idXNfaW9fcmVhZDsKKwljaV9kZXYtPmNpX2lvX3dyaXRlID0gYW1sX2NpX2J1c19pb193cml0ZTsKKwljaV9kZXYtPmNpX3Nsb3RfcmVzZXQgPSBhbWxfY2lfc2xvdF9yZXNldDsKKwljaV9kZXYtPmNpX3Nsb3Rfc2h1dGRvd24gPSBhbWxfY2lfc2xvdF9zaHV0ZG93bjsKKwljaV9kZXYtPmNpX3Nsb3RfdHNfZW5hYmxlID0gYW1sX2NpX3RzX2NvbnRyb2w7CisJY2lfZGV2LT5jaV9wb2xsX3Nsb3Rfc3RhdHVzID0gYW1sX2NpX3Nsb3Rfc3RhdHVzOworCWNpX2Rldi0+Y2lfZ2V0X3Nsb3Rfd2FrZXVwID0gYW1sX2NpX3Nsb3Rfd2FrZXVwOworCWNpX2Rldi0+ZGF0YSA9IGNpX2J1c19kZXY7CisKKwlhbWxfcGNtY2lhX2FsbG9jKGNpX2J1c19kZXYsICZwYyk7CisJcGMtPmlvX2RldmljZV90eXBlID0gY2lfYnVzX2Rldi0+aW9fZGV2aWNlX3R5cGU7CisJcHJfZGJnKCIqKioqKioqKipjaSBidXMgYW1sX3BjbWNpYV9pbml0IHN0YXJ0X3dvcms6JWRcbiIsIHBjLT5zdGFydF93b3JrKTsKKwlyZXN1bHQgPSBhbWxfcGNtY2lhX2luaXQocGMpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCXByX2Vycm9yKCJhbWxfcGNtY2lhX2luaXQgZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsMTsKKwl9CisJcHJfZGJnKCIqKioqKioqKipjaSBidXMgYW1sX2NpX2J1c19tb2RfaW5pdC0tLVxuIik7CisJYW1sX2NpX2J1c19tb2RfaW5pdCgpOworCXJldHVybiAwOworZmFpbDE6CisJa2ZyZWUoY2lfYnVzX2Rldik7CisJY2lfYnVzX2RldiA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGFtbF9jaV9idXNfaW5pdCk7CisvKipcYnJpZWYgYW1sX2NpX2J1c19leGl0OmNpX2J1cyBleGl0CisqIFxyZXR1cm4KKyogICAtIDAKKyogICAtIC1FSU5WQUwgOiBlcnJvcgorKi8KK2ludCBhbWxfY2lfYnVzX2V4aXQoc3RydWN0IGFtbF9jaSAqY2kpCit7CisJYW1sX2NpX2J1c19tb2RfZXhpdCgpOworCS8qZXhpdCBwYyBjYXJkKi8KKwlhbWxfcGNtY2lhX2V4aXQoJmNpX2J1cy5wYyk7CisJLypmcmVlIGdwaW8qLworCWFtbF9jaV9mcmVlX2dwaW8oJmNpX2J1cyk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYW1sX2NpX2J1c19leGl0KTsKKworI2lmIDEKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqICAgICAgICBmb3IgY2kgYnVzIHRlc3QgYXBpICAgICAgICAgICAgKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLypjYW0gZGlmaW5lcyovCisjZGVmaW5lIERBCTB4ODAKKyNkZWZpbmUgRlIJMHg0MAorI2RlZmluZSBXRQkweDAyCisjZGVmaW5lIFJFCTB4MDEKKworI2RlZmluZSBSUwkweDA4CisjZGVmaW5lIFNSCTB4MDQKKyNkZWZpbmUgU1cJMHgwMgorI2RlZmluZSBIQwkweDAxCisjZGVmaW5lIERBVEFfUkVHCSAgMAorI2RlZmluZSBDT01fU1RBX1JFRwkxCisjZGVmaW5lIFNJWkVfUkVHX0wJMgorI2RlZmluZSBTSVpFX1JFR19NCTMKKworc3RhdGljIHZvaWQgYW1sX2NpX2J1c19mdWxsX3Rlc3Qoc3RydWN0IGFtbF9jaSAqY2lfZGV2KQoreworCQl1bnNpZ25lZCBpbnQgQlVGX1NJWkUgPSAwOworCQl1bnNpZ25lZCBpbnQgaSA9IDA7CisJCXVuc2lnbmVkIGNoYXIgY2MgPSAwOworCQl1bnNpZ25lZCBjaGFyIHJlZzsKKwkJdW5zaWduZWQgaW50ICBic2l6ZSA9IDA7CisJCWludCBjbnQgPSAwOworCQl1bnNpZ25lZCBjaGFyIGJ1ZlsxMF07CisJCWludCBjb3VudCA9IDEwMDA7CisJCW1kZWxheSgxMDAwKTsKKwkJcHJfZGJnKCJSRUFEIENJUyBTVEFSVFxyXG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IDIwMDsgaSsrKSB7CisJCQltZGVsYXkoMTAwKTsKKwkJCWNjID0gYW1sX2NpX2J1c19tZW1fcmVhZChjaV9kZXYsIDAsIGkpOworCQkJcHJfZGJnKCIweCV4ICIsIGNjKTsKKwkJCWlmICgoaSArIDEpICUgMTYgPT0gMCkKKwkJCQlwcl9kYmcoIiBcclxuIik7CisJCX0KKwkJcHJfZGJnKCJSRUFEIENJUyBPVkVSXHJcbiIpOworCQltZGVsYXkoMTAwMCk7CisJCXByX2RiZygiU1cgcnN0IENBTS4uLlxyXG4iKTsKKwkJYW1sX2NpX2J1c19pb193cml0ZShjaV9kZXYsIDAsIENPTV9TVEFfUkVHLCBSUyk7CisJCXByX2RiZygiU1cgcnN0IG92ZXIuXHJcbiIpOworCQlwcl9kYmcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiIpOworCQlwcl9kYmcoIlRPIGRlbGF5IDIwMDBtc1xyXG4iKTsKKwkJbWRlbGF5KDIwMDApOworCQlwcl9kYmcoIlxyXG4iKTsKKwkJcHJfZGJnKCItLS0tLS0tLS0tLS0tLWNsZWFyIHJzLS0hISEtWU9VIE1VU1QgQ0xFQVIgUlMgQklULS1ubyBzbGVlcC0tLS0tLS0tXHJcbiIpOworCQlhbWxfY2lfYnVzX2lvX3dyaXRlKGNpX2RldiwgMCwgQ09NX1NUQV9SRUcsIDApOworCQlwcl9kYmcoIi0tLS0tLS0tLS0tLS0tc2xlZXAtLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuIik7CisJCW1kZWxheSgyMDAwKTsKKwkJcHJfZGJnKCJUTyBjaGVjayBzdy1yc3QgaXMgT0tcclxuIik7CisJCXByX2RiZygic3RhcnQgcmVhZCBmciBcclxuIik7CisJCWlmICgxKSB7CisJCQl1bnNpZ25lZCBjaGFyIHJlZzsKKwkJCXVuc2lnbmVkIGNoYXIgcmVnMTsKKwkJCWludCBjb3VudDEgPSA0MDAwOworCQkJd2hpbGUgKDEpIHsKKwkJCQltZGVsYXkoMjApOworCQkJCWNvdW50MS0tOworCQkJCXJlZzEgPSBhbWxfY2lfYnVzX2lvX3JlYWQoCisJCQkJCWNpX2RldiwgMCwgQ09NX1NUQV9SRUcpOworCQkJCWlmIChGUiAhPSAoRlIgJiByZWcxKSkgeworCQkJCQkJY29udGludWU7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcl9kYmcoIkNBTSBSZXNldCBPa1xyXG4iKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQl9CisJCQlyZWcgPSBhbWxfY2lfYnVzX2lvX3JlYWQoY2lfZGV2LCAwLCBDT01fU1RBX1JFRyk7CisJCQlwcl9kYmcoIlNUQV9SRUcgPSAweCUyLjJ4XHJcbiIsIHJlZyk7CisJCQlpZiAoRlIgJiByZWcpIHsKKwkJCQlwcl9kYmcoIlNXLVJTVCBpcyBPSyFcclxuIik7CisJCQl9IGVsc2UgeworCQkJCXByX2RiZygiU1ctUlNUIGlzIEVSUiFcclxuIik7CisJCQkJZ290byBlbmQ7CisJCQl9CisJCX0KK2VuZDoKKwkJcHJfZGJnKCJUTyBjaGVjayBzdy1yc3Qgb3Zlci5cclxuIik7CisJCXByX2RiZygiXHJcbiIpOworCQlwcl9kYmcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiIpOworCQlwcl9kYmcoIlRPIGJ1ZmZlciBzaXplIG5lZ290aWF0aW9uIHByb3RvY29sLi4uXHJcbiIpOworCQlwcl9kYmcoIkdldCB3aGljaCBidWYgc2l6ZSBDQU0gY2FuIHN1cHBvcnRcclxuIik7CisJCWFtbF9jaV9idXNfaW9fd3JpdGUoY2lfZGV2LCAwLCBDT01fU1RBX1JFRywgU1IpOworCQltZGVsYXkoMTAwMCk7CisJCXdoaWxlICgxKSB7CisKKwkJCXJlZyA9IGFtbF9jaV9idXNfaW9fcmVhZChjaV9kZXYsIDAsIENPTV9TVEFfUkVHKTsKKwkJCWlmICgocmVnICYgREEpID09IERBKSB7CisJCQkJcHJfZGJnKCJCdWZmZXIgbmVnb3RpYXRlIHNpemUgZGF0ZSBhdmFsaWJsZS5cclxuIik7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCS8qcHJfZGJnKCJCdWZmZXIgbmVnb3RpYXRlCisJCQkJc2l6ZSBkYXRlIE5PVCBhdmFsaWJsZVxyXG4iKTsqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbWRlbGF5KDEwMCk7CisJCX0KKwkJY250ID0gKGFtbF9jaV9idXNfaW9fcmVhZChjaV9kZXYsIDAsIFNJWkVfUkVHX0wpKSArCisJCSgoYW1sX2NpX2J1c19pb19yZWFkKGNpX2RldiwgMCwgU0laRV9SRUdfTSkpICogMjU2KTsKKwkJcHJfZGJnKCJNb3VkbGUgaGF2ZSA8JWQ+IEJ5dGVzIHNlbmQgdG8gaG9zdC5cclxuIiwgY250KTsKKwkJaWYgKGNudCAhPSAyKSB7CisJCQlwcl9kYmcoIlRoZSBCeXRlcyB3aWxsIGJlIHR4IGlzIEVSUiFcclxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKQorCQkJYnVmW2ldID0gYW1sX2NpX2J1c19pb19yZWFkKGNpX2RldiwgMCwgREFUQV9SRUcpOworCisJCXJlZyA9IGFtbF9jaV9idXNfaW9fcmVhZChjaV9kZXYsIDAsIENPTV9TVEFfUkVHKTsKKwkJaWYgKFJFID09IChSRSAmIHJlZykpIHsKKwkJCXByX2RiZygiKDEpUmVhZCBDQU0gYnVmIHNpemUgRVJSIVxyXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlhbWxfY2lfYnVzX2lvX3dyaXRlKGNpX2RldiwgMCwgKENPTV9TVEFfUkVHKSwgMCk7CisKKwkJbWRlbGF5KDEwMDApOworCisJCXdoaWxlIChjb3VudC0tKSB7CisJCQlyZWcgPSBhbWxfY2lfYnVzX2lvX3JlYWQoY2lfZGV2LCAwLCBDT01fU1RBX1JFRyk7CisJCQlpZiAoRlIgIT0gKEZSICYgcmVnKSkgeworCQkJCXByX2RiZygiQ0FNIGlzIGJ1c3kgMiwgd2FpdGluZy4uLlxyXG4iKTsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJcHJfZGJnKCJDQU0gaXMgT0sgMi5cclxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmVnID0gYW1sX2NpX2J1c19pb19yZWFkKGNpX2RldiwgMCwgQ09NX1NUQV9SRUcpOworCQlpZiAoRlIgIT0gKEZSICYgcmVnKSkgeworCQkJcHJfZGJnKCIoMilSZWFkIENBTSBidWYgc2l6ZSBFUlIhLVxyXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlic2l6ZSA9IChidWZbMF0gKiAyNTYpICsgYnVmWzFdOworCisJCXByX2RiZygiQ0FNIGNhbiBzdXBwb3J0IGJ1ZiBzaXplIGlzOiA8JWQ+QlxyXG4iLCBic2l6ZSk7CisKKwkJcHJfZGJnKCJUZWxsIENBTSB3aGljaCBzaXplIGJ1ZiBpcyBiZSB1c2VkXHJcbiIpOworCQlyZWcgPSBhbWxfY2lfYnVzX2lvX3JlYWQoY2lfZGV2LCAwLCBDT01fU1RBX1JFRyk7CisJCWlmIChGUiAhPSAoRlIgJiByZWcpKQorCQkJcHJfZGJnKCJDQU0gaXMgYnVzeSwgd2FpdGluZyBmcmVlXHJcbiIpOworCQl3aGlsZSAoMSkgeworCQkJcmVnID0gYW1sX2NpX2J1c19pb19yZWFkKGNpX2RldiwgMCwgQ09NX1NUQV9SRUcpOworCQkJaWYgKEZSICE9IChGUiAmIHJlZykpIHsKKwkJCQlwcl9kYmcoIkNBTSBpcyBidXN5IDMsIHdhaXRpbmdcclxuIik7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgeworCQkJCXByX2RiZygiQ0FNIGlzIE9LIDNcclxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlic2l6ZSA9IGJzaXplIC0gMDsKKwkJQlVGX1NJWkUgPSBic2l6ZTsKKwkJcHJfZGJnKCJXZSB3aWxsIHVzZSB0aGlzICBidWYgc2l6ZTogPCVkPkJcclxuIiwgYnNpemUpOworCQlhbWxfY2lfYnVzX2lvX3dyaXRlKGNpX2RldiwgMCwgQ09NX1NUQV9SRUcsIFNXKTsKKwkJcmVnID0gYW1sX2NpX2J1c19pb19yZWFkKGNpX2RldiwgMCwgQ09NX1NUQV9SRUcpOworCQlpZiAoRlIgIT0gKEZSICYgcmVnKSkKKwkJCXByX2RiZygiQ0FNIGlzIGJ1c3ksIHdhaXRpbmdcclxuIik7CisKKwkJd2hpbGUgKDEpIHsKKwkJCXJlZyA9IGFtbF9jaV9idXNfaW9fcmVhZChjaV9kZXYsIDAsIENPTV9TVEFfUkVHKTsKKwkJCWlmIChGUiAhPSAoRlIgJiByZWcpKSB7CisJCQkJcHJfZGJnKCJDQU0gaXMgYnVzeSA0LCB3YWl0aW5nXHJcbiIpOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJCQlwcl9kYmcoIkNBTSBpcyBPSyA0XHJcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8qU0hPVUxEIENIRUNLIERBISEhISEqLworCQkvKlBMUyBBREQgVEhJUyBDSEVDSyBDT0RFOiovCisJCXByX2RiZygiUFJJT1IgdG8gY2hlY2sgQ0FNJ1MgREFcclxuIik7CisJCXJlZyA9IGFtbF9jaV9idXNfaW9fcmVhZChjaV9kZXYsIDAsIENPTV9TVEFfUkVHKTsKKwkJaWYgKChyZWcgJiBEQSkgPT0gREEpIHsKKwkJCXByX2RiZygiQ0FNIGhhdmUgZGF0YSBzZW5kIHRvIEhPU1RcclxuIik7CisJCQlyZXR1cm47CisJCX0KKworCisJCWJ1ZlswXSA9ICh1bnNpZ25lZCBjaGFyKSgoYnNpemUgPj4gOCkgJiAweGZmKTsKKwkJYnVmWzFdID0gKHVuc2lnbmVkIGNoYXIpKGJzaXplICYgMHhmZik7CisKKwkJd2hpbGUgKDEpIHsKKwkJCW1kZWxheSgxMCk7CisJCQlhbWxfY2lfYnVzX2lvX3dyaXRlKGNpX2RldiwKKwkJCTAsIENPTV9TVEFfUkVHLCBIQyB8IFNXKTsKKwkJCW1kZWxheSgxMDApOworCQkJcmVnID0gYW1sX2NpX2J1c19pb19yZWFkKGNpX2RldiwKKwkJCQkwLCBDT01fU1RBX1JFRyk7CisJCQlpZiAoRlIgIT0gKEZSICYgcmVnKSkgeworCQkJCXByX2RiZygiQ0FNIGlzIGJ1c3kgNSwgd2FpdGluZ1xyXG4iKTsKKwkJCQlhbWxfY2lfYnVzX2lvX3dyaXRlKGNpX2RldiwKKwkJCQkJMCwgQ09NX1NUQV9SRUcsIFNXKTsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJcHJfZGJnKCJDQU0gaXMgT0sgNVxyXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlwcl9kYmcoIjwyPiBCeXRlcyBzZW5kIHRvIENBTVxyXG4iKTsKKwkJYW1sX2NpX2J1c19pb193cml0ZShjaV9kZXYsIDAsIFNJWkVfUkVHX00sIDApOworCQlhbWxfY2lfYnVzX2lvX3dyaXRlKGNpX2RldiwgMCwgU0laRV9SRUdfTCwgMik7CisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJCQlhbWxfY2lfYnVzX2lvX3dyaXRlKGNpX2RldiwgMCwgREFUQV9SRUcsIGJ1ZltpXSk7CisKKwkJcmVnID0gYW1sX2NpX2J1c19pb19yZWFkKGNpX2RldiwgMCwgQ09NX1NUQV9SRUcpOworCQlpZiAoV0UgPT0gKFdFICYgcmVnKSkgeworCQkJcHJfZGJnKCJXcml0ZSBDQU0gRVJSIVxyXG4iKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCWFtbF9jaV9idXNfaW9fd3JpdGUoY2lfZGV2LCAwLCBDT01fU1RBX1JFRywgU1cpOworCQkJbWRlbGF5KDEwMCk7CisJCQlhbWxfY2lfYnVzX2lvX3dyaXRlKGNpX2RldiwgMCwgQ09NX1NUQV9SRUcsIDApOworCQkJcHJfZGJnKCJCdWZmZXIgc2l6ZSBuZWdvdGlhdGlvbiBvdmVyIVxyXG4iKTsKKwkJCXByX2RiZygiTk9XLCBIT1NUIGNhbiBjb21tdW5pY2F0ZXMgd2l0aCBDQU1cclxuIik7CisJCQlwcl9kYmcoIk5PVywgVEVTVCBFTkRcclxuIik7CisJCX0KK30KKworLyoqCisqIFJlYWQgYSB0dXBsZSBmcm9tIGF0dHJpYnV0ZSBtZW1vcnkuCisqCisqIEBwYXJhbSBjYSBDQSBpbnN0YW5jZS4KKyogQHBhcmFtIHNsb3QgU2xvdCBpZC4KKyogQHBhcmFtIGFkZHJlc3MgQWRkcmVzcyB0byByZWFkIGZyb20uIFVwZGF0ZWQuCisqIEBwYXJhbSB0dXBsZVR5cGUgVHVwbGUgaWQgYnl0ZS4gVXBkYXRlZC4KKyogQHBhcmFtIHR1cGxlTGVuZ3RoIFR1cGxlIGxlbmd0aC4gVXBkYXRlZC4KKyogQHBhcmFtIHR1cGxlIERlc3QgYnVmZmVyIGZvciB0dXBsZSAobXVzdCBiZSAyNTYgYnl0ZXMpLiBVcGRhdGVkLgorKgorKiBAcmV0dXJuIDAgb24gc3VjY2Vzcywgbm9uemVybyBvbiBlcnJvci4KKyovCitzdGF0aWMgaW50IGR2Yl9jYV9lbjUwMjIxX3JlYWRfdHVwbGUoCitpbnQgKmFkZHJlc3MsIGludCAqdHVwbGVUeXBlLCBpbnQgKnR1cGxlTGVuZ3RoLCB1OCAqdHVwbGUpCit7CisJaW50IGk7CisJaW50IF90dXBsZVR5cGU7CisJaW50IF90dXBsZUxlbmd0aDsKKwlpbnQgX2FkZHJlc3MgPSAqYWRkcmVzczsKKworCS8qIGdyYWIgdGhlIG5leHQgdHVwbGUgbGVuZ3RoIGFuZCB0eXBlICovCisJX3R1cGxlVHlwZSA9IGFtbF9jaV9idXNfbWVtX3JlYWQoKHN0cnVjdCBhbWxfY2kgKikKKwkJY2lfYnVzLnByaXYsIDAsIF9hZGRyZXNzKTsKKwlpZiAoX3R1cGxlVHlwZSA8IDApCisJCXJldHVybiBfdHVwbGVUeXBlOworCWlmIChfdHVwbGVUeXBlID09IDB4ZmYpIHsKKwkJcHJfZGJnKCJFTkQgT0YgQ0hBSU4gVFVQTEUgdHlwZToweCV4XG4iLCBfdHVwbGVUeXBlKTsKKwkJKmFkZHJlc3MgKz0gMjsKKwkJKnR1cGxlVHlwZSA9IF90dXBsZVR5cGU7CisJCSp0dXBsZUxlbmd0aCA9IDA7CisJCXJldHVybiAwOworCX0KKwlfdHVwbGVMZW5ndGggPSBhbWxfY2lfYnVzX21lbV9yZWFkKChzdHJ1Y3QgYW1sX2NpICopCisJCWNpX2J1cy5wcml2LCAwLCBfYWRkcmVzcyArIDIpOworCWlmIChfdHVwbGVMZW5ndGggPCAwKQorCQlyZXR1cm4gX3R1cGxlTGVuZ3RoOworCV9hZGRyZXNzICs9IDQ7CisKKwlwcl9kYmcoIlRVUExFIHR5cGU6MHgleCBsZW5ndGg6JWlcbiIsIF90dXBsZVR5cGUsIF90dXBsZUxlbmd0aCk7CisKKwkvKiByZWFkIGluIHRoZSB3aG9sZSB0dXBsZSAqLworCWZvciAoaSA9IDA7IGkgPCBfdHVwbGVMZW5ndGg7IGkrKykgeworCQl0dXBsZVtpXSA9IGFtbF9jaV9idXNfbWVtX3JlYWQoKHN0cnVjdCBhbWxfY2kgKikKKwkJCWNpX2J1cy5wcml2LCAwLCBfYWRkcmVzcyArIChpICogMikpOworCQlwcl9kYmcoIiAgMHglMDJ4OiAweCUwMnggJWNcbiIsCisJCWksIHR1cGxlW2ldICYgMHhmZiwKKwkJKCh0dXBsZVtpXSA+IDMxKSAmJiAodHVwbGVbaV0gPCAxMjcpKSA/IHR1cGxlW2ldIDogJy4nKTsKKwl9CisJX2FkZHJlc3MgKz0gKF90dXBsZUxlbmd0aCAqIDIpOworCisJLyogc3VjY2VzcyAqLworCSp0dXBsZVR5cGUgPSBfdHVwbGVUeXBlOworCSp0dXBsZUxlbmd0aCA9IF90dXBsZUxlbmd0aDsKKwkqYWRkcmVzcyA9IF9hZGRyZXNzOworCXJldHVybiAwOworfQorc3RhdGljIGNoYXIgKmZpbmRzdHIoY2hhciAqaGF5c3RhY2ssIGludCBobGVuLCBjaGFyICpuZWVkbGUsIGludCBubGVuKQoreworCWludCBpOworCisJaWYgKGhsZW4gPCBubGVuKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPD0gaGxlbiAtIG5sZW47IGkrKykgeworCQlpZiAoIXN0cm5jbXAoaGF5c3RhY2sgKyBpLCBuZWVkbGUsIG5sZW4pKQorCQkJcmV0dXJuIGhheXN0YWNrICsgaTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisqIFBhcnNlIGF0dHJpYnV0ZSBtZW1vcnkgb2YgYSBDQU0gbW9kdWxlLCBleHRyYWN0aW5nIENvbmZpZyByZWdpc3RlciwgYW5kIGNoZWNraW5nCisqIGl0IGlzIGEgRFZCIENBTSBtb2R1bGUuCisqCisqIEBwYXJhbSBjYSBDQSBpbnN0YW5jZS4KKyogQHBhcmFtIHNsb3QgU2xvdCBpZC4KKyoKKyogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGZhaWx1cmUuCisqLworc3RhdGljIGludCBkdmJfY2FfZW41MDIyMV9wYXJzZV9hdHRyaWJ1dGVzKHZvaWQpCit7CisJaW50IGFkZHJlc3MgPSAwOworCWludCB0dXBsZUxlbmd0aDsKKwlpbnQgdHVwbGVUeXBlOworCXU4IHR1cGxlWzI1N107CisJY2hhciAqZHZiX3N0cjsKKwlpbnQgcmFzejsKKwlpbnQgc3RhdHVzOworCWludCBnb3RfY2Z0YWJsZWVudHJ5ID0gMDsKKwlpbnQgZW5kX2NoYWluID0gMDsKKwlpbnQgaTsKKwl1MTYgbWFuZmlkID0gMDsKKwl1MTYgZGV2aWQgPSAwOworCWludCBjb25maWdfYmFzZSA9IDA7CisJaW50IGNvbmZpZ19vcHRpb247CisKKwkvKiBDSVNUUExfREVWSUNFXzBBICovCisJc3RhdHVzID0gZHZiX2NhX2VuNTAyMjFfcmVhZF90dXBsZSgmYWRkcmVzcywKKwkmdHVwbGVUeXBlLCAmdHVwbGVMZW5ndGgsIHR1cGxlKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlwcl9lcnJvcigicmVhZCBzdGF0dXMgZXJyb3JcclxuIik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCWlmICh0dXBsZVR5cGUgIT0gMHgxRCkgeworCQlwcl9lcnJvcigicmVhZCB0dXBsZVR5cGUgZXJyb3IgWzB4JXhdXHJcbiIsIHR1cGxlVHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENJU1RQTF9ERVZJQ0VfMEMgKi8KKwlzdGF0dXMgPSBkdmJfY2FfZW41MDIyMV9yZWFkX3R1cGxlKCZhZGRyZXNzLAorCSZ0dXBsZVR5cGUsICZ0dXBsZUxlbmd0aCwgdHVwbGUpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCXByX2Vycm9yKCJyZWFkIHJlYWQgY2lzICBlcnJvclxyXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJaWYgKHR1cGxlVHlwZSAhPSAweDFDKSB7CisJCXByX2Vycm9yKCJyZWFkIHJlYWQgY2lzIHR5cGUgZXJyb3JcclxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENJU1RQTF9WRVJTXzEgKi8KKwlzdGF0dXMgPSBkdmJfY2FfZW41MDIyMV9yZWFkX3R1cGxlKCZhZGRyZXNzLAorCSZ0dXBsZVR5cGUsICZ0dXBsZUxlbmd0aCwgdHVwbGUpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCXByX2Vycm9yKCJyZWFkIHJlYWQgY2lzICB2ZXJzaW9uIGVycm9yXHJcbiIpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwlpZiAodHVwbGVUeXBlICE9IDB4MTUpIHsKKwkJcHJfZXJyb3IoInJlYWQgcmVhZCBjaXMgdmVyc2lvbiB0eXBlIGVycm9yXHJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDSVNUUExfTUFORklEICovCisJc3RhdHVzID0gZHZiX2NhX2VuNTAyMjFfcmVhZF90dXBsZSgmYWRkcmVzcywgJnR1cGxlVHlwZSwKKwkmdHVwbGVMZW5ndGgsIHR1cGxlKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlwcl9lcnJvcigicmVhZCByZWFkIGNpcyBtYW5maWQgZXJyb3JcclxuIik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCWlmICh0dXBsZVR5cGUgIT0gMHgyMCkgeworCQlwcl9lcnJvcigicmVhZCByZWFkIGNpcyBtYW5maWQgdHlwZSBlcnJvclxyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICh0dXBsZUxlbmd0aCAhPSA0KSB7CisJCXByX2Vycm9yKCJyZWFkIHJlYWQgY2lzIG1hbmZpZCBsZW4gZXJyb3JcclxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltYW5maWQgPSAodHVwbGVbMV0gPDwgOCkgfCB0dXBsZVswXTsKKwlkZXZpZCA9ICh0dXBsZVszXSA8PCA4KSB8IHR1cGxlWzJdOworCisJLyogQ0lTVFBMX0NPTkZJRyAqLworCXN0YXR1cyA9IGR2Yl9jYV9lbjUwMjIxX3JlYWRfdHVwbGUoJmFkZHJlc3MsICZ0dXBsZVR5cGUsCisJJnR1cGxlTGVuZ3RoLCB0dXBsZSk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJcHJfZXJyb3IoInJlYWQgcmVhZCBjaXMgY29uZmlnIGVycm9yXHJcbiIpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwlpZiAodHVwbGVUeXBlICE9IDB4MUEpIHsKKwkJcHJfZXJyb3IoInJlYWQgcmVhZCBjaXMgY29uZmlnIHR5cGUgZXJyb3JcclxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAodHVwbGVMZW5ndGggPCAzKSB7CisJCXByX2Vycm9yKCJyZWFkIHJlYWQgY2lzIGNvbmZpZyBsZW4gZXJyb3JcclxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGV4dHJhY3QgdGhlIGNvbmZpZ2Jhc2UgKi8KKwlyYXN6ID0gdHVwbGVbMF0gJiAzOworCWlmICh0dXBsZUxlbmd0aCA8ICgzICsgcmFzeiArIDE0KSkgeworCQlwcl9lcnJvcigicmVhZCBleHRyYWN0IHRoZSBjb25maWdiYXNlICBlcnJvclxyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHJhc3ogKyAxOyBpKyspCisJCWNvbmZpZ19iYXNlIHw9ICh0dXBsZVsyICsgaV0gPDwgKDggKiBpKSk7CisKKwkvKiBjaGVjayBpdCBjb250YWlucyB0aGUgY29ycmVjdCBEVkIgc3RyaW5nICovCisJZHZiX3N0ciA9IGZpbmRzdHIoKGNoYXIgKil0dXBsZSwgdHVwbGVMZW5ndGgsICJEVkJfQ0lfViIsIDgpOworCWlmIChkdmJfc3RyID09IE5VTEwpIHsKKwkJcHJfZXJyb3IoImZpbmQgZHZiIHN0ciBEVkJfQ0lfViAgZXJyb3JcclxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAodHVwbGVMZW5ndGggPCAoKGR2Yl9zdHIgLSAoY2hhciAqKSB0dXBsZSkgKyAxMikpIHsKKwkJcHJfZXJyb3IoImZpbmQgZHZiIHN0ciBEVkJfQ0lfViBsZW4gZXJyb3JcclxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGlzIGl0IGEgdmVyc2lvbiB3ZSBzdXBwb3J0PyAqLworCWlmIChzdHJuY21wKGR2Yl9zdHIgKyA4LCAiMS4wMCIsIDQpKSB7CisJCXByX2Vycm9yKCIgVW5zdXBwb3J0ZWQgRFZCIENBTSBtb2R1bGUgdmVyc2lvbiAlYyVjJWMlY1xuIiwKKwkJZHZiX3N0cls4XSwgZHZiX3N0cls5XSwgZHZiX3N0clsxMF0sIGR2Yl9zdHJbMTFdKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogcHJvY2VzcyB0aGUgQ0ZUQUJMRV9FTlRSWSB0dXBsZXMsIGFuZCBhbnkgYWZ0ZXIgdGhvc2UgKi8KKwl3aGlsZSAoKCFlbmRfY2hhaW4pICYmIChhZGRyZXNzIDwgMHgxMDAwKSkgeworCQlzdGF0dXMgPSBkdmJfY2FfZW41MDIyMV9yZWFkX3R1cGxlKCZhZGRyZXNzLCAmdHVwbGVUeXBlLAorCQkmdHVwbGVMZW5ndGgsIHR1cGxlKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCXByX2Vycm9yKCJwcm9jZXNzIHRoZSBDRlRBQkxFX0VOVFJZIHR1cGxlcyBlcnJvclxyXG4iKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKworCQlzd2l0Y2ggKHR1cGxlVHlwZSkgeworCQkJY2FzZSAweDFCOgkvKiBDSVNUUExfQ0ZUQUJMRV9FTlRSWSAqLworCQkJCQlpZiAodHVwbGVMZW5ndGggPCAoMiArIDExICsgMTcpKQorCQkJCQkJYnJlYWs7CisKKwkJCQkJLyogaWYgd2UndmUgYWxyZWFkeSBwYXJzZWQgb25lLCBqdXN0IHVzZSBpdCAqLworCQkJCQlpZiAoZ290X2NmdGFibGVlbnRyeSkKKwkJCQkJCWJyZWFrOworCisJCQkJCS8qIGdldCB0aGUgY29uZmlnIG9wdGlvbiAqLworCQkJCQljb25maWdfb3B0aW9uID0gdHVwbGVbMF0gJiAweDNmOworCisJCQkJCS8qIE9LLCBjaGVjayBpdCBjb250YWlucyB0aGUgY29ycmVjdCBzdHJpbmdzICovCisJCQkJCWlmICgoZmluZHN0cigoY2hhciAqKXR1cGxlLAorCQkJCQkJdHVwbGVMZW5ndGgsICJEVkJfSE9TVCIsIDgpID09IE5VTEwpIHx8CisJCQkJCQkoZmluZHN0cigoY2hhciAqKXR1cGxlLAorCQkJCQkJdHVwbGVMZW5ndGgsICJEVkJfQ0lfTU9EVUxFIiwgMTMpID09IE5VTEwpKQorCQkJCQkJYnJlYWs7CisKKwkJCQkJZ290X2NmdGFibGVlbnRyeSA9IDE7CisJCQkJCWJyZWFrOworCisJCQljYXNlIDB4MTQ6CS8qIENJU1RQTF9OT19MSU5LKi8KKwkJCQkJYnJlYWs7CisKKwkJCWNhc2UgMHhGRjoJLyogQ0lTVFBMX0VORCAqLworCQkJCQllbmRfY2hhaW4gPSAxOworCQkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQkvKiBVbmtub3duIHR1cGxlIHR5cGUgLSBqdXN0IHNraXAKKwkJCQkqdGhpcyB0dXBsZSBhbmQgbW92ZSB0byB0aGUgbmV4dCBvbmUKKwkJCQkqLworCQkJCXByX2Vycm9yKCJTa2lwcGluZyB1bmtub3duIHR1cGxldHlwZToweCV4IEw6MHgleFxuIiwKKwkJCQkJCXR1cGxlVHlwZSwgdHVwbGVMZW5ndGgpOworCQkJCQlicmVhazsKKwkJCQl9CisJfQorCisJaWYgKChhZGRyZXNzID4gMHgxMDAwKSB8fCAoIWdvdF9jZnRhYmxlZW50cnkpKSB7CisJCXByX2Vycm9yKCJnb3RfY2Z0YWJsZWVudHJ5IDolZFxyXG4iLCBnb3RfY2Z0YWJsZWVudHJ5KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJfZXJyb3IoIi0tLS0tLS0tLS1jaSBjaXMgb2stLS0tLS1cclxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJlc2V0X3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKK3N0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXJldCA9IHNwcmludGYoYnVmLCAiZWNobyAxID4gJXNcblx0IiwgYXR0ci0+YXR0ci5uYW1lKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCByZXNldF9zdG9yZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhbWxfY2kgKmNpID0gKHN0cnVjdCBhbWxfY2kgKiljaV9idXMucHJpdjsKKwlyZXQgPSBhbWxfY2lfc2xvdF9yZXNldChjaSwgMCk7CisJcmV0dXJuIHNpemU7Cit9CitzdGF0aWMgQ0xBU1NfQVRUUl9SVyhyZXNldCk7CitzdGF0aWMgc3NpemVfdCBwd3Jfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCByZXQ7CisJcmV0ID0gc3ByaW50ZihidWYsICJlY2hvIDF8MD4gJXNcblx0IiwgYXR0ci0+YXR0ci5uYW1lKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBwd3Jfc3RvcmUoc3RydWN0IGNsYXNzICpjbGFzcywKK3N0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJaW50IHJldCA9IDA7CisJaW50IGVuYWJsZSA9IDA7CisJbG9uZyB2YWx1ZTsKKwlpZiAoa3N0cnRvbChidWYsIDAsICZ2YWx1ZSkgPT0gMCkKKwkJZW5hYmxlID0gKGludCl2YWx1ZTsKKwlyZXQgPSBhbWxfZ2lvX3Bvd2VyKCZjaV9idXMucGMsIGVuYWJsZSk7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBDTEFTU19BVFRSX1JXKHB3cik7CisKK3N0YXRpYyBzc2l6ZV90IHN0YXJ0X3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKK3N0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXJldCA9IHNwcmludGYoYnVmLCAic3RhcnQ6JWRcbiIsIGNpX2J1cy5wYy5zdGFydF93b3JrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBzdGFydF9zdG9yZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgZW5hYmxlID0gMDsKKwlsb25nIHZhbHVlOworCWlmIChrc3RydG9sKGJ1ZiwgMCwgJnZhbHVlKSA9PSAwKSB7CisJCWVuYWJsZSA9IChpbnQpdmFsdWU7CisJCWNpX2J1cy5wYy5zdGFydF93b3JrID0gZW5hYmxlOworCQlwcmludGsoInN0YXJ0IHNldCBzdGFydFxuIik7CisJCWFtbF9wY21jaWFfZGV0ZWN0X2NhbSgmY2lfYnVzLnBjKTsKKwl9CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBDTEFTU19BVFRSX1JXKHN0YXJ0KTsKKworc3RhdGljIHNzaXplX3Qgd2FrZXVwX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKK3N0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXJldCA9IHNwcmludGYoYnVmLCAid2FrZXVwOiVkXG4iLCBjaV9idXMud2FrZXVwX3RocmVhZCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3Qgd2FrZXVwX3N0b3JlKHN0cnVjdCBjbGFzcyAqY2xhc3MsCitzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCWludCBlbmFibGUgPSAwOworCWxvbmcgdmFsdWU7CisJaWYgKGtzdHJ0b2woYnVmLCAwLCAmdmFsdWUpID09IDApIHsKKwkJZW5hYmxlID0gKGludCl2YWx1ZTsKKwkJY2lfYnVzLndha2V1cF90aHJlYWQgPSBlbmFibGU7CisJCXByaW50aygid2FrZXVwIGlzIHNldFxuIik7CisJfQorCXJldHVybiBzaXplOworfQorCitzdGF0aWMgQ0xBU1NfQVRUUl9SVyh3YWtldXApOworCitzdGF0aWMgc3NpemVfdCBzdGF0dXNfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCByZXQ7CisJc3RydWN0IGFtbF9jaSAqY2kgPSAoc3RydWN0IGFtbF9jaSAqKWNpX2J1cy5wcml2OworCXJldCA9IGFtbF9jaV9zbG90X3N0YXR1cyhjaSwgMCwgMCk7CisJcmV0ID0gc3ByaW50ZihidWYsICIlczogJWQ7XG5cdCIsIGF0dHItPmF0dHIubmFtZSwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorc3RhdGljIENMQVNTX0FUVFJfUk8oc3RhdHVzKTsKKworc3RhdGljIHNzaXplX3QgaXJxX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKK3N0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXJldCA9IGFtbF9jaV9naW9fZ2V0X2lycSgpOworCXJldCA9IHNwcmludGYoYnVmLCAiJXMgaXJxOiAlZFxuXHQiLCBhdHRyLT5hdHRyLm5hbWUsIHJldCk7CisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBDTEFTU19BVFRSX1JPKGlycSk7CisKK3N0YXRpYyBzc2l6ZV90IGlvdGVzdF9zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCitzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IHJldDsKKwlyZXQgPSBzcHJpbnRmKGJ1ZiwgImVjaG8gKHJ8d3xmfGMpKGl8YSkgYWRkciBkYXRhID4gJXNcbiIsCisJYXR0ci0+YXR0ci5uYW1lKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBpb3Rlc3Rfc3RvcmUoc3RydWN0IGNsYXNzICpjbGFzcywKK3N0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJaW50IG4gPSAwOworCWludCBpID0gMDsKKwljaGFyICpidWZfb3JpZywgKnBzLCAqdG9rZW47CisJY2hhciAqcGFybVszXTsKKwl1bnNpZ25lZCBpbnQgYWRkciA9IDAsIHZhbCA9IDAsIHJldHZhbCA9IDA7CisJbG9uZyB2YWx1ZSA9IDA7CisJc3RydWN0IGFtbF9jaSAqY2kgPSAoc3RydWN0IGFtbF9jaSAqKWNpX2J1cy5wcml2OworCWJ1Zl9vcmlnID0ga3N0cmR1cChidWYsIEdGUF9LRVJORUwpOworCXBzID0gYnVmX29yaWc7CisJd2hpbGUgKDEpIHsKKwkJLypuZWVkIHNldCAnXG4nIHRvICcgXG4nKi8KKwkJdG9rZW4gPSBzdHJzZXAoJnBzLCAiICIpOworCQlpZiAodG9rZW4gPT0gTlVMTCkKKwkJCWJyZWFrOworCQlpZiAoKnRva2VuID09ICdcMCcpCisJCQljb250aW51ZTsKKwkJcGFybVtuKytdID0gdG9rZW47CisJfQorCisJaWYgKCFuIHx8ICgobiA+IDApICYmIChzdHJsZW4ocGFybVswXSkgIT0gMikpKSB7CisJCXByX2VycigiaW52YWxpZCBjb21tYW5kIG5bJXhdcFsleF1bJXNdXG4iLCBuLChpbnQpc3RybGVuKHBhcm1bMF0pLHBhcm1bMF0pOworCQlrZnJlZShidWZfb3JpZyk7CisJCXJldHVybiBzaXplOworCX0KKworCWlmICgocGFybVswXVswXSA9PSAncicpKSB7CisJCWlmIChuID4gMikgeworCQkJcHJfZXJyKCJyZWFkOiBpbnZhbGlkIHBhcmFtZXRlclxuIik7CisJCQlrZnJlZShidWZfb3JpZyk7CisJCQlyZXR1cm4gc2l6ZTsKKwkJfQorCWlmIChrc3RydG9sKHBhcm1bMV0sIDAsICZ2YWx1ZSkgPT0gMCkKKwkJYWRkciA9IChpbnQpdmFsdWU7CisJCXByX2VycigiJXMgMHgleFxuIiwgcGFybVswXSwgYWRkcik7CisJCXN3aXRjaCAoKGNoYXIpcGFybVswXVsxXSkgeworCQkJY2FzZSAnaSc6CisJCQkJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykKKwkJCQkJcmV0dmFsID0gYW1sX2NpX2J1c19pb19yZWFkKGNpLCAwLCBhZGRyKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2EnOgorCQkJCWZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspCisJCQkJCXJldHZhbCA9IGFtbF9jaV9idXNfbWVtX3JlYWQoY2ksIDAsIGFkZHIpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCQlwcl9kYmcoIiVzOiAweCV4IC0tPiAweCV4XG4iLCBwYXJtWzBdLCBhZGRyLCByZXR2YWwpOworCX0gZWxzZSBpZiAoKHBhcm1bMF1bMF0gPT0gJ3cnKSkgeworCQlpZiAobiAhPSAzKSB7CisJCQlwcl9lcnIoIndyaXRlOiBpbnZhbGlkIHBhcmFtZXRlclxuIik7CisJCQlrZnJlZShidWZfb3JpZyk7CisJCQlyZXR1cm4gc2l6ZTsKKwkJfQorCQlpZiAoa3N0cnRvbChwYXJtWzFdLCAwLCAmdmFsdWUpID09IDApCisJCQkJYWRkciA9IChpbnQpdmFsdWU7CisJCWlmIChrc3RydG9sKHBhcm1bMl0sIDAsICZ2YWx1ZSkgPT0gMCkKKwkJCQl2YWwgPSAoaW50KXZhbHVlOworCisJCXByX2VycigiJXMgMHgleCAweCV4IiwgcGFybVswXSwgYWRkciwgdmFsKTsKKwkJc3dpdGNoICgoY2hhcilwYXJtWzBdWzFdKSB7CisJCQljYXNlICdpJzoKKwkJCQlyZXR2YWwgPSBhbWxfY2lfYnVzX2lvX3dyaXRlKGNpLCAwLCBhZGRyLCB2YWwpOworCQkJCWJyZWFrOworCQkJY2FzZSAnYSc6CisJCQkJcmV0dmFsID0gYW1sX2NpX2J1c19tZW1fd3JpdGUoY2ksIDAsIGFkZHIsIHZhbCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCXByX2RiZygiJXM6IDB4JXggPC0tIDB4JXhcbiIsIHBhcm1bMF0sIGFkZHIsIHJldHZhbCk7CisJfSBlbHNlIGlmICgocGFybVswXVswXSA9PSAnZicpKSB7CisJCXByX2RiZygiZnVsbCB0ZXN0LS0tLVxyXG4iKTsKKwkJYW1sX2NpX2J1c19mdWxsX3Rlc3QoY2kpOworCX0gIGVsc2UgaWYgKChwYXJtWzBdWzBdID09ICdwJykpIHsKKwkJcHJfZGJnKCJjaXMgZHZiX2NhX2VuNTAyMjFfcGFyc2VfYXR0cmlidXRlcy0tLS1cclxuIik7CisJCWR2Yl9jYV9lbjUwMjIxX3BhcnNlX2F0dHJpYnV0ZXMoKTsKKwl9CisKKwlrZnJlZShidWZfb3JpZyk7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBDTEFTU19BVFRSX1JXKGlvdGVzdCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphbWxfY2lfYnVzX2F0dHJzW10gPSB7CisJJmNsYXNzX2F0dHJfaW90ZXN0LmF0dHIsCisJJmNsYXNzX2F0dHJfc3RhdHVzLmF0dHIsCisJJmNsYXNzX2F0dHJfaXJxLmF0dHIsCisJJmNsYXNzX2F0dHJfcmVzZXQuYXR0ciwKKwkmY2xhc3NfYXR0cl9wd3IuYXR0ciwKKwkmY2xhc3NfYXR0cl9zdGFydC5hdHRyLAorCSZjbGFzc19hdHRyX3dha2V1cC5hdHRyLAorCU5VTEwKK307CisKK0FUVFJJQlVURV9HUk9VUFMoYW1sX2NpX2J1cyk7CisKKworaW50ICBhbWxfY2lfYnVzX21vZF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgY2xhc3MgKmNscDsKKyAgICAgICAgI2RlZmluZSBDTEFTU19OQU1FX0xFTiA0OAorCXByX2RiZygiQW1sb2dpYyBEVkIgQ0kgQlVTIEluaXRcbiIpOworCisJY2xwID0gJihjaV9idXMuY2xzKTsKKworCWNscC0+bmFtZSA9IGt6YWxsb2MoQ0xBU1NfTkFNRV9MRU4sIEdGUF9LRVJORUwpOworCWlmICghY2xwLT5uYW1lKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNucHJpbnRmKChjaGFyICopY2xwLT5uYW1lLCBDTEFTU19OQU1FX0xFTiwgImFtbF9jaV9idXNfJXMiLCAidGVzdCIpOworCWNscC0+b3duZXIgPSBUSElTX01PRFVMRTsKKwljbHAtPmNsYXNzX2dyb3VwcyA9IGFtbF9jaV9idXNfZ3JvdXBzOworCXJldCA9IGNsYXNzX3JlZ2lzdGVyKGNscCk7CisJaWYgKHJldCkKKwkJa2ZyZWUoY2xwLT5uYW1lKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCAgYW1sX2NpX2J1c19tb2RfZXhpdCh2b2lkKQoreworCXByX2RiZygiQW1sb2dpYyBEVkIgQ0kgQlVTIEV4aXRcbiIpOworCWNsYXNzX3VucmVnaXN0ZXIoJihjaV9idXMuY2xzKSk7Cit9CisKKyNlbmRpZgorI2lmIDAKK21vZHVsZV9pbml0KGFtbF9jaV9idXNfbW9kX2luaXQpOworbW9kdWxlX2V4aXQoYW1sX2NpX2J1c19tb2RfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9hbWxfY2lfYnVzLmggYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2FtbF9jaV9idXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjM4MjUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9hbWxfY2lfYnVzLmgKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNyBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisqIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyoKKyogRGVzY3JpcHRpb246CisqLworI2lmbmRlZiBfX0FNTF9DSV9CVVNfSF8KKyNkZWZpbmUgX19BTUxfQ0lfQlVTX0hfCisKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL2lvbWFwLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9hbWxfZ3Bpb19jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8vY29uc3VtZXIuaD4KKyNpbmNsdWRlICJhbWxfcGNtY2lhLmgiCisjaW5jbHVkZSAiYW1sX2NpLmgiCisjaW5jbHVkZSAiZHZiX2NhX2VuNTAyMjEuaCIKKworLyoKK2FtbCBzcGkgZGV2CisqLworc3RydWN0IGFtbF9jaV9idXMgeworCXN0cnVjdCBtdXRleCBtdXRleDsKKwlzdHJ1Y3QgY2xhc3MJY2xzOworCS8qIGFkZCBncGlvIHBpbiAqLworCXN0cnVjdCBncGlvX2Rlc2MgKmNkX3BpbjE7CisJaW50IGNkX3BpbjFfdmFsdWU7CisJc3RydWN0IGdwaW9fZGVzYyAqY2RfcGluMjsKKwlpbnQgY2RfcGluMl92YWx1ZTsKKwlzdHJ1Y3QgZ3Bpb19kZXNjICpwd3JfcGluOworCWludCBwd3JfcGluX3ZhbHVlOworCXN0cnVjdCBncGlvX2Rlc2MgKmxlX3BpbjsKKwlpbnQgbGVfcGluX3ZhbHVlOworCWludCBsZV9lbmFibGVfbGV2ZWw7CisJaW50IGFkZHJfdHNfbW9kZV9tdWx0aXBsZXg7CisJLyogY2FtIGlycSAqLworCWludCBpcnE7CisJaW50IGlycV9jbXA7CisJaW50IGlycV90aW1lb3V0OworCXN0cnVjdCBhbWxfcGNtY2lhIHBjOworCXZvaWQgKnByaXY7CisJLypkZXZpY2UgdHlwZSovCisJaW50IGlvX2RldmljZV90eXBlOworCS8qc2VsZWN0IGdwaW8gZ3JvdXAqLworCWludCBzZWxlY3Q7CisJc3RydWN0IHBpbmN0cmwgKnBpbmN0cmw7CisJc3RydWN0IHBpbmN0cmwgKmJ1c19waW5jdHJsOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJLypzYXZlIGNhbSBjdXIgc3RhdGUqLworCWVudW0gYW1sX3Nsb3Rfc3RhdGUJCXNsb3Rfc3RhdGU7CisJLyp3YWtlIHVwIHRocmVhZCBtb2RlIGF0IGNpbWN1IHRocmVhZCovCisJaW50IHdha2V1cF90aHJlYWQ7Cit9OworCitlbnVtIGFtbF9ncGlvX3NlbGVjdF9lIHsKKwkJQU1MX0dQSU9fQUREUiA9IDAsCisJCUFNTF9HUElPX1RTLAorfTsKKworI2RlZmluZSBJT1JEIAkJMHgwCisjZGVmaW5lIElPV1IgCQkweDEKKyNkZWZpbmUgTUVNUkQgCQkweDIKKyNkZWZpbmUgTUVNV1IgCQkweDMKKworLy8yNE0gY3ljY2xlcywgNDIgbnMKKyNkZWZpbmUgQ1lDTEVTIAkJICAgICAgICAgICAgICAoNDIpCisvL21lbSByZAorI2RlZmluZSBERUxBWV9STUVNX0lOSVRfQUREUiAgICAgICgwKQorI2RlZmluZSBERUxBWV9STUVNX0FERFJfQ0UgCSAgICAgICgwKQorI2RlZmluZSBERUxBWV9STUVNX0NFX1JEIAkgICAgICAoMykKKyNkZWZpbmUgREVMQVlfUk1FTV9SRF9SV0FJVCAJICAoMCkKKyNkZWZpbmUgREVMQVlfUk1FTV9SV0FJVF9EQVRBICAgICAoMCkKKyNkZWZpbmUgREVMQVlfUk1FTV9EQVRBX0RSRCAJICAoMCkKKyNkZWZpbmUgREVMQVlfUk1FTV9EUkRfRENFIAkgICAgICAoMCkKKyNkZWZpbmUgREVMQVlfUk1FTV9EQ0VfSU5JVCAJICAoMCkKKy8vbWVtIHdyCisjZGVmaW5lIERFTEFZX1dNRU1fSU5JVF9BRERSICAgICAgKDApCisjZGVmaW5lIERFTEFZX1dNRU1fQUREUl9DRSAJICAgICAgKDEpCisjZGVmaW5lIERFTEFZX1dNRU1fQ0VfV1IgCSAgICAgICgxKQorI2RlZmluZSBERUxBWV9XTUVNX1dSX1JXQUlUIAkgICgwKQorI2RlZmluZSBERUxBWV9XTUVNX1JXQUlUX0RBVEEgICAgICgwKQorI2RlZmluZSBERUxBWV9XTUVNX0RBVEFfRFdSIAkgICgwKQorI2RlZmluZSBERUxBWV9XTUVNX0RXUl9EQ0UgCSAgICAgICgxKQorI2RlZmluZSBERUxBWV9XTUVNX0RDRV9JTklUIAkgICgxKQorLy9pb3JkCisjZGVmaW5lIERFTEFZX1JJT19JTklUX0FERFIgICAgICAgKDApCisjZGVmaW5lIERFTEFZX1JJT19BRERSX0NFIAkgICAgICAoMCkKKyNkZWZpbmUgREVMQVlfUklPX0NFX1JEIAkgICAgICAoMikKKyNkZWZpbmUgREVMQVlfUklPX1JEX1JXQUlUIAkgIAkgICgwKQorI2RlZmluZSBERUxBWV9SSU9fUldBSVRfREFUQSAgICAgICgwKQorI2RlZmluZSBERUxBWV9SSU9fREFUQV9EUkQgCSAgICAgICgwKQorI2RlZmluZSBERUxBWV9SSU9fRFJEX0RDRSAJICAgICAgKDApCisjZGVmaW5lIERFTEFZX1JJT19EQ0VfSU5JVCAJICAgICAgKDApCisvL2lvd3IKKyNkZWZpbmUgREVMQVlfV0lPX0lOSVRfQUREUiAgICAgICAoMCkKKyNkZWZpbmUgREVMQVlfV0lPX0FERFJfQ0UgCSAgICAgICgxKQorI2RlZmluZSBERUxBWV9XSU9fQ0VfV1IgCSAgICAgICgxKQorI2RlZmluZSBERUxBWV9XSU9fV1JfUldBSVQgCSAgCSAgKDApCisjZGVmaW5lIERFTEFZX1dJT19SV0FJVF9EQVRBICAgICAgKDApCisjZGVmaW5lIERFTEFZX1dJT19EQVRBX0RXUiAJICAgICAgKDApCisjZGVmaW5lIERFTEFZX1dJT19EV1JfRENFIAkgICAgICAoMSkKKyNkZWZpbmUgREVMQVlfV0lPX0RDRV9JTklUIAkgICAgICAoMSkKKworLy90aW1lb3V0IGlycSBob2xkIHRpbWUsMTBNUworI2RlZmluZSBUSU1FT1VUX0lSUV9IT0xEX1RJTUUgCSAgKDIwMCkKKworLy9yZWcgZGVmaW5lCisjZGVmaW5lIENJUExVU19DTURfUkVHIDB4MAorLyoKKzMxOjI0ICBydywgd2RhdGE6dGhlIGRhdGEgd3JpdGUgaW4gY2FtCisyMyAgICAgcmVzZXJ2ZWQKKzIyOjggICBhZGRyIEEwLUExNAorNzo2ICAgIHJlc2VydmVkCis1OjQgICAgY21kIHR5cGU6MDA6IGlvcmQsMDE6aW93ciAxMDogb2UgMTE6d2UKKzM6MSAgICByZXNlcnZlZAorMCAgICAgIGNtZCB2YWxpZCwxOmNtZCBpcyB2YWxpZC5uZWVkIGJlIGV4ZWN1dGVkLgorICAgICAgIDA6IGNtZCBpcyBpbnZhbGlkCisqLworI2RlZmluZSBDSV9DTURfV0RBVEEgMjQKKyNkZWZpbmUgQ0lfQ01EX0FERFIgIDgKKyNkZWZpbmUgQ0lfQ01EX1RZUEUgIDQKKyNkZWZpbmUgQ0lfQ01EX1ZBTElEIDAKKworCisjZGVmaW5lIENJUExVU19SREFUQV9SRUcgMHg0CisvKgorMzE6OCAgIHJlc2VydmVkCis3OjAgICAgZGF0YSByZWFkIGZyb20gY2FtCisqLworI2RlZmluZSBDSVBMVVNfQ1RSTF9SRUcgMHg4CisvKgorMzE6MjEgICByZXNlcnZlZAorMTAgICAgICBjdHJsIGNsayAxOmRpc2FibGUgY2xrIGdhdGVkOworCQkJCTA6ZW5hYmxlIGNsayBnYXRlZAorOSAgICAgICBjb21wbGV0aW9uIGlycSBlbiwxOiBkaXNhYmxlOzA6YWJsZQorOCAgICAgICBpbnZfY2FtX2lvd3JuCis3ICAgICAgIGludl9jYW1faW9yZG4KKzYgICAgICAgaW52X2NhbV93ZW4KKzUgICAgICAgaW52X2NhbV9vZW4KKzQgICAgICAgaW52X2NhbV9jZW4KKzMgICAgICAgY2xlYXIgdHJhbnNmZXIgY29tcGxldGUgaXJxOzE6Y2xlYXIKKzIgICAgICAgY2xlYXIgdGltZW91dCBpZXEsIDE6Y2xlYXIKKzEgICAgICAgY2FtIHJlc2V0OiA9MSBhc3NlcnQgPTAgZGVhc3NlcnQKKzAgICAgICAgY29udHJvbCBlbmFibGU6IDE6ZW5hYmxlIGNpcGx1cyBjdHJsLDA6ZGlzYWJsZQorKi8KKyNkZWZpbmUgRU5BQkxFX0NNUF9JUlEJOQorI2RlZmluZSBJTlZfQ0FNX0lPV1IJOAorI2RlZmluZSBJTlZfQ0FNX0lPUkQJNworI2RlZmluZSBJTlZfQ0FNX1dFCSAgICA2CisjZGVmaW5lIElOVl9DQU1fT0UJICAgIDUKKyNkZWZpbmUgSU5WX0NBTV9DRQkgICAgNAorI2RlZmluZSBDTEVBUl9DTVBfSVJRCTMKKyNkZWZpbmUgQ0xFQVJfVElNRU9VVF9JUlEgMgorI2RlZmluZSBDQU1fUkVTRVQJICAgIDEKKyNkZWZpbmUgQ0lfRU5BQkxFICAgICAgIDAKKworCisKKyNkZWZpbmUgQ0lQTFVTX0RFTEFZX0NUUkwwIDB4YworLyoKKzMxOjI0ICAgMHhmLGRlbGF5IGN5Y2xlcyBiZXR3ZWVuIGFzc2VydCBJT1JEL0lPV1IvTUVNUkQvTUVNV1IKKwkJYW5kIFdBSVQjIFJFTEVBU0VECisyMzoxNiAgIDB4ZixkZWxheSBjeWNsZXMgYmV0d2VlbiBhc3NlcnQgQ0UgYW5kICBhc3NlcnQgSU9SRC9JT1dSL01FTVJEL01FTVdSCisxNTo4ICAgIDB4OCxkZWxheSBjeWNsZXMgYmV0d2VlbiBzZW5kIGFkZHIgYW5kIGFzc2VydCBDRQorNzowICAgICAweDQsZGVsYXkgY3ljbGVzIGJldHdlZW4gSU5JVCBhbmQgc2VuZCBBRERSL0RBVEEKKyovCisjZGVmaW5lIENJUExVU19ERUxBWV9DVFJMMSAweDEwCisvKgorMzE6MjQgICAweGYsZGVsYXkgY3ljbGVzIGJldHdlZW4gREVhc3NlcnQgQ0UgYW5kIElETEUKKzIzOjE2ICAgMHhmLGRlbGF5IGN5Y2xlcyBiZXR3ZWVuIERFYXNzZXJ0IElPUkQvSU9XUi9NRU1SRC9NRU1XUiBhbmQgZGVhc3NlcnQgQ0UKKzE1OjggICAgMHg4LGRlbGF5IGN5Y2xlcyBiZXR3ZWVuIFNBTVBMRSBEQVRBIGFuZCBERWFzc2VydCBJT1JEL0lPV1IvTUVNUkQvTUVNV1IKKzc6MCAgICAgMHhGLGRlbGF5IGN5Y2xlcyBiZXR3ZWVuIFdBSVQjIFJFTEVBU0UgYW5kIChTQU1QTEVEQVRBIE9SIERFQVNTRVJUIElPUkQKKwkJSU9XUi9NRU1SRC9NRU1XUikKKyovCisjZGVmaW5lIENJUExVU19XQUlUX1RJTUVPVVQgMHgxNAorLyoKKzMxICAgICB3YWl0IHRpbWVvdXQgaXJxIGVuYWJsZSxkZWZhbHV0IDE7CiszMDowICAgZGF0YSByZWFkIGZyb20gY2FtO3RpbWUgb3V0IHRocmVzaG9sZAorICAgICAgIGlmIHdhaXQgdGltZSA+IHRocmVzaG9sZCx0aGFuIHRpbWVvdXQgaXJxLgorKi8KKyNkZWZpbmUgRU5BQkVMX1RJTUVPVVRfSVJRICAzMQorI2RlZmluZSBXQVRUX1RJTUVPVVRfVElNRSAgIDAKKworCisjZGVmaW5lIENJUExVU19TVEFUVVNfUkVHIDB4MTgKKy8qCiszMTo2ICAgcmVzZXJ2ZWQKKzU6MiAgICBmc20gc3RhdGUKKzEJICAgdGltZW91dCBpcnEKKzAgICAgICBjb21wbGV0ZSBpcnEKKyovCisjZGVmaW5lIFRJTUVPVVRfSVJRX1NUQVRFICAgIDEKKyNkZWZpbmUgQ09NUExFVEVfSVJRX1NUQVRFICAgMAorCisKK2V4dGVybiB2b2lkIGR2Yl9jYV9lbjUwMjIxX2NhbXJlYWR5X2lycShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgKnB1YmNhLCBpbnQgc2xvdCk7CitleHRlcm4gaW50IGFtbF9jaV9idXNfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgYW1sX2NpICpjaV9kZXYpOworZXh0ZXJuIGludCBhbWxfY2lfYnVzX2V4aXQoc3RydWN0IGFtbF9jaSAqY2kpOworI2VuZGlmCQkJCS8qIF9fQU1MX0NJX0JVU19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9hbWxfcGNtY2lhLmMgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2FtbF9wY21jaWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTYxZDczCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9hbWxfcGNtY2lhLmMKQEAgLTAsMCArMSwyNjcgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNyBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisqIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyoKKyogRGVzY3JpcHRpb246CisqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2luY2x1ZGUgImFtbF9wY21jaWEuaCIKKyNpbmNsdWRlICJhbWxfY2kuaCIKKworc3RhdGljIGludCBhbWxfcGNtY2lhX2RlYnVnID0gMTsKKworbW9kdWxlX3BhcmFtX25hbWVkKHBjbWNpYV9kZWJ1ZywgYW1sX3BjbWNpYV9kZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocGNtY2lhX2RlYnVnLCAiZW5hYmxlIHZlcmJvc2UgZGVidWcgbWVzc2FnZXMiKTsKKworI2RlZmluZSBwcl9kYmcoYXJncy4uLilcCisJZG8ge1wKKwkJaWYgKGFtbF9wY21jaWFfZGVidWcpXAorCQkJcHJpbnRrKGFyZ3MpO1wKKwl9IHdoaWxlICgwKQorI2RlZmluZSBwcl9lcnJvcihmbXQsIGFyZ3MuLi4pIHByaW50aygiUENNQ0lBOiAiIGZtdCwgIyMgYXJncykKKworCitzdGF0aWMgaW50IHBjbWNpYV9wbHVnaW4oc3RydWN0IGFtbF9wY21jaWEgKnBjLCBpbnQgcmVzZXQpCit7CisJaWYgKHBjLT5zbG90X3N0YXRlID09IE1PRFVMRV9YVFJBQ1RFRCkgeworCQlwYy0+cHdyKHBjLCBBTUxfUFdSX09QRU4pOy8qaGkgaXMgb3BlbiBwb3dlciovCisJCXByX2RiZygiIENBTSBQbHVnZ2VkIElOOiBBZGFwdGVyKCVkKSBTbG90KDApXG4iLCAwKTsKKwkJdWRlbGF5KDUwKTsKKwkJLy9pZiAocGMtPmlvX2RldmljZV90eXBlICE9IEFNTF9EVkJfSU9fVFlQRV9DSUJVUykKKwkJCWFtbF9wY21jaWFfcmVzZXQocGMpOworCQkvKndhaXQgdW5wbHVnKi8KKwkJcGMtPmluaXRfaXJxKHBjLCBJUlFGX1RSSUdHRVJfUklTSU5HKTsKKwkJdWRlbGF5KDUwMCk7CisJCXBjLT5zbG90X3N0YXRlID0gTU9EVUxFX0lOU0VSVEVEOworCisJfSBlbHNlIHsKKwkJcHJfZXJyb3IoInJlcGVhdCBpbnRvIHBjbWNpYSBpbnNlcnQgXHJcbiIpOworCQlpZiAocmVzZXQpCisJCQlhbWxfcGNtY2lhX3Jlc2V0KHBjKTsKKwl9CisKKwltc2xlZXAoMSk7CisJcGMtPnBjbWNpYV9wbHVnaW4ocGMsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNtY2lhX3VucGx1ZyhzdHJ1Y3QgYW1sX3BjbWNpYSAqcGMpCit7CisJaWYgKHBjLT5zbG90X3N0YXRlID09IE1PRFVMRV9JTlNFUlRFRCkgeworCQlwcl9kYmcoIiBDQU0gVW5wbHVnZ2VkOiBBZGFwdGVyKCVkKSBTbG90KDApXG4iLCAwKTsKKwkJLyp1ZGVsYXkoNTApOyovCisJCS8qYW1sX3BjbWNpYV9yZXNldChwYyk7Ki8KKwkJLyp3YWl0IHBsdWdpbiovCisJCXBjLT5pbml0X2lycShwYywgSVJRRl9UUklHR0VSX0ZBTExJTkcpOworCQl1ZGVsYXkoNTAwKTsKKwkJcGMtPnB3cihwYywgQU1MX1BXUl9DTE9TRSk7LypoaSBpcyBvcGVuIHBvd2VyKi8KKworCQlwYy0+c2xvdF9zdGF0ZSA9IE1PRFVMRV9YVFJBQ1RFRDsKKwl9CisJbXNsZWVwKDEpOworCXBjLT5wY21jaWFfcGx1Z2luKHBjLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgcGNtY2lhX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgYW1sX3BjbWNpYSAqcGMgPSAoc3RydWN0IGFtbF9wY21jaWEgKilkZXZfaWQ7CisJcHJfZGJnKCJwY21jaWFfaXJxX2hhbmRsZXItLWludG8tLVxyXG4iKTsKKwlkaXNhYmxlX2lycV9ub3N5bmMocGMtPmlycSk7CisJc2NoZWR1bGVfd29yaygmcGMtPnBjbWNpYV93b3JrKTsKKwllbmFibGVfaXJxKHBjLT5pcnEpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgYW1sX3BjbWNpYV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlpbnQgY2QxLCBjZDI7CisJc3RydWN0IGFtbF9wY21jaWEgKnBjID0gY29udGFpbmVyX29mKAorCQl3b3JrLCBzdHJ1Y3QgYW1sX3BjbWNpYSwgcGNtY2lhX3dvcmspOworCisJaWYgKHBjLT5zdGFydF93b3JrID09IDApIHsKKwkJcmV0dXJuOworCX0KKwljZDEgPSBwYy0+Z2V0X2NkMShwYyk7CisJY2QyID0gcGMtPmdldF9jZDIocGMpOworCisJaWYgKGNkMSAhPSBjZDIpCisJCXByX2Vycm9yKCJ3b3JrIENBTSBjYXJkIG5vdCBpbmVydGVkLlxuIik7CisJZWxzZSB7CisJCWlmICghY2QxKSB7CisJCQlwcl9lcnJvcigid29yayBBZGFwdGVyKCVkKSBTbG90KDApOiBDQU0gUGx1Z2luXG4iLCAwKTsKKwkJCXBjbWNpYV9wbHVnaW4ocGMsIDApOworCQl9IGVsc2UgeworCQkJcHJfZXJyb3IoIndvcmsgQWRhcHRlciglZCkgU2xvdCgwKTogQ0FNIFVucGx1Z1xuIiwgMCk7CisJCQlwY21jaWFfdW5wbHVnKHBjKTsKKwkJfQorCX0KK30KKwordm9pZCBhbWxfcGNtY2lhX2RldGVjdF9jYW0oc3RydWN0IGFtbF9wY21jaWEgKnBjKQoreworCWludCBjZDEsIGNkMjsKKworCWlmIChwYyA9PSBOVUxMKSB7CisJCXByX2Vycm9yKCJwYyBpcyBudWxsXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAocGMtPnN0YXJ0X3dvcmsgPT0gMCkgeworCXByX2Vycm9yKCJwYyBzdGFydCB3b3JrIGlzIDBcbiIpOworCQlyZXR1cm47CisJfQorCWNkMSA9IHBjLT5nZXRfY2QxKHBjKTsKKwljZDIgPSBwYy0+Z2V0X2NkMihwYyk7CisKKwlpZiAoY2QxICE9IGNkMikKKwkJcHJfZXJyb3IoIkNBTSBjYXJkIG5vdCBpbmVydGVkLiBjaGVjayBlbmRcbiIpOworCWVsc2UgeworCQlpZiAoIWNkMSkgeworCQkJcHJfZXJyb3IoIkFkYXB0ZXIoJWQpIFNsb3QoMCk6IENBTSBQbHVnaW5cbiIsIDApOworCQkJcGNtY2lhX3BsdWdpbihwYywgMSk7CisJCX0gZWxzZSB7CisJCQlwcl9lcnJvcigiQWRhcHRlciglZCkgU2xvdCgwKTogQ0FNIFVucGx1Z1xuIiwgMCk7CisJCQlwY21jaWFfdW5wbHVnKHBjKTsKKwkJfQorCX0KK30KK0VYUE9SVF9TWU1CT0woYW1sX3BjbWNpYV9kZXRlY3RfY2FtKTsKK3N0YXRpYyBzdHJ1Y3QgYW1sX3BjbWNpYSAqcGNfY3VyOworCitpbnQgYW1sX3BjbWNpYV9pbml0KHN0cnVjdCBhbWxfcGNtY2lhICpwYykKK3sKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIG1vZGU7CisJcHJfZGJnKCJhbWxfcGNtY2lhX2luaXQgc3RhcnQgcGMtPmlycT0lZFxyXG4iLCBwYy0+aXJxKTsKKwlwYy0+cnN0KHBjLCBBTUxfTCk7CisJLypwb3dlciBvbiovCisJaWYgKHBjLT5pb19kZXZpY2VfdHlwZSAhPSBBTUxfRFZCX0lPX1RZUEVfQ0lCVVMpCisJCXBjLT5wd3IocGMsIEFNTF9QV1JfT1BFTik7LypoaSBpcyBvcGVuIHBvd2VyKi8KKwkvKmFzc3VtaW5nIGNhbSB1bnBsdWdlZCwgY29uZmlnIHRoZSBJTlQgdG8gd2FpdGluZy1mb3ItcGx1Z2luIG1vZGUqLworCXBjLT5pbml0X2lycShwYywgSVJRRl9UUklHR0VSX0xPVyk7CisKKwlJTklUX1dPUksoJnBjLT5wY21jaWFfd29yaywgYW1sX3BjbWNpYV93b3JrKTsKKworCW1vZGUgPSBJUlFGX09ORVNIT1Q7CisJaWYgKHBjLT5pb19kZXZpY2VfdHlwZSA9PSBBTUxfRFZCX0lPX1RZUEVfU1BJX1QzMTIgfHwgcGMtPmlvX2RldmljZV90eXBlID09IEFNTF9EVkJfSU9fVFlQRV9DSUJVUykgeworCQltb2RlID0gbW9kZSB8IElSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX1RSSUdHRVJfRkFMTElORzsKKwl9CisKKwllcnIgPSByZXF1ZXN0X2lycShwYy0+aXJxLAorCXBjbWNpYV9pcnFfaGFuZGxlciwKKwltb2RlLCAiYW1sLXBjbWNpYSIsIHBjKTsKKwlpZiAoZXJyICE9IDApIHsKKwkJcHJfZXJyb3IoIkVSUk9SOiBJUlEgcmVnaXN0cmF0aW9uIGZhaWxlZCAhIDwlZD4iLCBlcnIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwY19jdXIgPSBwYzsKKwlwcl9kYmcoImFtbF9wY21jaWFfaW5pdCBva1xyXG4iKTsKKwlpZiAocGMtPmlvX2RldmljZV90eXBlID09IEFNTF9EVkJfSU9fVFlQRV9TUElfVDMxMiB8fCBwYy0+aW9fZGV2aWNlX3R5cGUgPT0gQU1MX0RWQl9JT19UWVBFX0NJQlVTKSB7CisJCS8vbWN1IHN0YXJ0IHZlcnkgZmFzdCxzbyBzaGUgY2FuIGRldGVjdCBjYW0gYmVmb3JlIHNvYyBpbml0IGVuZC4KKwkJLy9zbyB3ZSBuZWVkIGFkZCBkZXRlY3QgY2FtIGZ1biBmb3IgZmlyc3QgdGltZS4KKwkJYW1sX3BjbWNpYV9kZXRlY3RfY2FtKHBjKTsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGFtbF9wY21jaWFfaW5pdCk7CisKK2ludCBhbWxfcGNtY2lhX2V4aXQoc3RydWN0IGFtbF9wY21jaWEgKnBjKQoreworCXBjLT5wd3IocGMsIEFNTF9QV1JfQ0xPU0UpOy8qaGkgaXMgb3BlbiBwb3dlciovCisJZnJlZV9pcnEocGMtPmlycSwgcGMpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChhbWxfcGNtY2lhX2V4aXQpOworCitpbnQgYW1sX3BjbWNpYV9yZXNldChzdHJ1Y3QgYW1sX3BjbWNpYSAqcGMpCit7CisJCXByX2RiZygiQ0FNIFJFU0VULS0+c3RhcnRcbiIpOworCQkvKiB2aWFjY2VzcyBuZW90aW9uIGNhbSBuZWVkIGRlbGF5IDIwMDAgYW5kIDMwMDAgKi8KKwkJLyogc21pdCBjYW0gbmVlZCBkZWxheSAxMDAwIGFuZCAxNTAwICovCisJCS8qIG5lZWQgY2hhbmdlIGRlbGF5IGFjY29yZGluZyBjYW0gdmVuZG9yICovCisJCXBjLT5yc3QocGMsIEFNTF9IKTsvKkhJIGlzIHJlc2V0Ki8KKwkJbXNsZWVwKDIwMDApOworCQlwYy0+cnN0KHBjLCBBTUxfTCk7LypkZWZhdWxlIExPVyovCisJCW1zbGVlcCgyNTAwKTsKKwkJcHJfZGJnKCJDQU0gUkVTRVQtLWVuZFxuIik7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGFtbF9wY21jaWFfcmVzZXQpOworCisKKyNpZiAwCitzdGF0aWMgc3NpemVfdCBhbWxfcGNtY2lhX3Rlc3RfY21kKHN0cnVjdCBjbGFzcyAqY2xhc3MsCitzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXByX2RiZygicGNtY2lhIGNtZDogJXNcbiIsIGJ1Zik7CisJaWYgKHBjX2N1cikgeworCQlpZiAobWVtY21wKGJ1ZiwgInJlc2V0IiwgNSkgPT0gMCkKKwkJCWFtbF9wY21jaWFfcmVzZXQocGNfY3VyKTsKKwkJZWxzZSBpZiAobWVtY21wKGJ1ZiwgIm9uIiwgMikgPT0gMCkKKwkJCXBjX2N1ci0+cHdyKHBjX2N1ciwgQU1MX1BXUl9PUEVOKTsKKwkJZWxzZSBpZiAobWVtY21wKGJ1ZiwgIm9mZiIsIDMpID09IDApCisJCQlwY19jdXItPnB3cihwY19jdXIsIEFNTF9QV1JfQ0xPU0UpOworCQllbHNlIGlmIChtZW1jbXAoYnVmLCAicG9sbCIsIDQpID09IDApCisJCQlzY2hlZHVsZV93b3JrKCZwY19jdXItPnBjbWNpYV93b3JrKTsKKwkJZWxzZSBpZiAobWVtY21wKGJ1ZiwgImludHIiLCA0KSA9PSAwKQorCQkJcGNfY3VyLT5pbml0X2lycShwY19jdXIsIElSUUZfVFJJR0dFUl9SSVNJTkcpOworCQllbHNlIGlmIChtZW1jbXAoYnVmLCAiaW50ZiIsIDQpID09IDApCisJCQlwY19jdXItPmluaXRfaXJxKHBjX2N1ciwgSVJRRl9UUklHR0VSX0ZBTExJTkcpOworCX0KKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgYW1sX3BjbWNpYV9jbGFzc19hdHRyc1tdID0geworCV9fQVRUUihjbWQsICBTX0lSVUdPIHwgU19JV1VTUiwgTlVMTCwgYW1sX3BjbWNpYV90ZXN0X2NtZCksCisJX19BVFRSX05VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgYW1sX3BjbWNpYV9jbGFzcyA9IHsKKwkubmFtZSA9ICJhbWxfcGNtY2lhX3Rlc3QiLAorCS5jbGFzc19hdHRycyA9IGFtbF9wY21jaWFfY2xhc3NfYXR0cnMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhbWxfcGNtY2lhX21vZF9pbml0KHZvaWQpCit7CisJcHJfZGJnKCJBbWxvZ2ljIFBDTUNJQSBJbml0XG4iKTsKKworCWNsYXNzX3JlZ2lzdGVyKCZhbWxfcGNtY2lhX2NsYXNzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYW1sX3BjbWNpYV9tb2RfZXhpdCh2b2lkKQoreworCXByX2RiZygiQW1sb2dpYyBQQ01DSUEgRXhpdFxuIik7CisKKwljbGFzc191bnJlZ2lzdGVyKCZhbWxfcGNtY2lhX2NsYXNzKTsKK30KKworCittb2R1bGVfaW5pdChhbWxfcGNtY2lhX21vZF9pbml0KTsKK21vZHVsZV9leGl0KGFtbF9wY21jaWFfbW9kX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvYW1sX3BjbWNpYS5oIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9hbWxfcGNtY2lhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjExOTM1OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvYW1sX3BjbWNpYS5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNyBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisqIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyoKKyogRGVzY3JpcHRpb246CisqLworCisjaWZuZGVmIF9BTUxfUENNQ0lBXworI2RlZmluZSBfQU1MX1BDTUNJQV8KKworZW51bSBhbWxfc2xvdF9zdGF0ZSB7CisJTU9EVUxFX0lOU0VSVEVECQkJPSAzLAorCU1PRFVMRV9YVFJBQ1RFRAkJCT0gNAorfTsKKworZW51bSBhbWxfcHdyX2NtZCB7CisJQU1MX1BXUl9PUEVOCQkJPSAwLAorCUFNTF9QV1JfQ0xPU0UJCQk9IDEKK307CitlbnVtIGFtbF9yZXNldF9jbWQgeworCUFNTF9MCSAgICA9IDAsCisJQU1MX0gJCT0gMQorfTsKK3N0cnVjdCBhbWxfcGNtY2lhIHsKKwllbnVtIGFtbF9zbG90X3N0YXRlCQlzbG90X3N0YXRlOworCXN0cnVjdCB3b3JrX3N0cnVjdAkJcGNtY2lhX3dvcms7CisJaW50IHJ1bl90eXBlOy8qMO+8mmlycTsxOnBvbGwqLworCWludCBpcnE7CisJaW50ICgqaW5pdF9pcnEpKHN0cnVjdCBhbWxfcGNtY2lhICpwYywgaW50IGZsYWcpOworCWludCAoKmdldF9jZDEpKHN0cnVjdCBhbWxfcGNtY2lhICpwYyk7CisJaW50ICgqZ2V0X2NkMikoc3RydWN0IGFtbF9wY21jaWEgKnBjKTsKKwlpbnQgKCpwd3IpKHN0cnVjdCBhbWxfcGNtY2lhICpwYywgaW50IGVuYWJsZSk7CisJaW50ICgqcnN0KShzdHJ1Y3QgYW1sX3BjbWNpYSAqcGMsIGludCBlbmFibGUpOworCisJaW50ICgqcGNtY2lhX3BsdWdpbikoc3RydWN0IGFtbF9wY21jaWEgKnBjLCBpbnQgcGx1Z2luKTsKKworCXZvaWQgKnByaXY7CisJLypkZXZpY2UgdHlwZSovCisJaW50IGlvX2RldmljZV90eXBlOworCS8qc3RhcnQgZGV0ZWN0IGNhcmQgYW5kIHdvcmsqLworCWludCBzdGFydF93b3JrOworfTsKKworaW50IGFtbF9wY21jaWFfaW5pdChzdHJ1Y3QgYW1sX3BjbWNpYSAqcGMpOworaW50IGFtbF9wY21jaWFfZXhpdChzdHJ1Y3QgYW1sX3BjbWNpYSAqcGMpOworaW50IGFtbF9wY21jaWFfcmVzZXQoc3RydWN0IGFtbF9wY21jaWEgKnBjKTsKK3ZvaWQgYW1sX3BjbWNpYV9kZXRlY3RfY2FtKHN0cnVjdCBhbWxfcGNtY2lhICpwYyk7CisKKyNlbmRpZiAvKl9BTUxfUENNQ0lBXyovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvYW1sX3NwaS5jIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9hbWxfc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdmZWY4ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvYW1sX3NwaS5jCkBAIC0wLDAgKzEsMTg2NSBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE3IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyogbW9yZSBkZXRhaWxzLgorKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKgorKiBEZXNjcmlwdGlvbjoKKyovCisKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9hbWxfZ3Bpb19jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8vY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisvLyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL3NkLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL3NkLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSAiYW1sX3NwaS5oIgorI2luY2x1ZGUgImFtbF9jaS5oIgorCisjZGVmaW5lIEFNTF9NT0RFX05BTUUgICAgICAgImFtbF9kdmJjaV9zcGkiCisKKyNkZWZpbmUgQU1MX1NQSV9SRUFEX0xFTiAgICAgICAxNgorCitzdGF0aWMgaW50ICBBTUxfQ0lfR1BJT19JUlFfQkFTRSA9IDI1MTsKK3N0YXRpYyBzdHJ1Y3QgYW1sX3NwaSAqZ19zcGlfZGV2Oworc3RhdGljIGludCBhbWxfc3BpX2RlYnVnID0gMTsKK3N0YXRpYyBpbnQgR19yZWNfZmxhZyA9IEFNX1NQSV9TVEVQX0lOSVQ7CisKKworbW9kdWxlX3BhcmFtX25hbWVkKHNwaV9kZWJ1ZywgYW1sX3NwaV9kZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3BpX2RlYnVnLCAiZW5hYmxlIHZlcmJvc2UgZGVidWcgbWVzc2FnZXMiKTsKKworCisjZGVmaW5lIHByX2RiZyhhcmdzLi4uKVwKKwlkbyB7XAorCQlpZiAoYW1sX3NwaV9kZWJ1ZylcCisJCQlwcmludGsoYXJncyk7XAorCX0gd2hpbGUgKDApCisjZGVmaW5lIHByX2Vycm9yKGZtdCwgYXJncy4uLikgcHJpbnRrKCJBTUxfQ0lfU1BJOiAiIGZtdCwgIyMgYXJncykKKworc3RydWN0IHNwaV9ib2FyZF9pbmZvIGFtbF9jaV9zcGlfYmRpbmZvID0geworCS5tb2RhbGlhcyA9ICJjaV9zcGlfZGV2IiwKKwkubW9kZSA9IFNQSV9NT0RFXzAsCisJLm1heF9zcGVlZF9oeiA9IDEwMDAwMDAsIC8qIDFNSHogKi8KKwkuYnVzX251bSA9IDAsIC8qIFNQSSBidXMgTm8uICovCisJLmNoaXBfc2VsZWN0ID0gMCwgLyogdGhlIGRldmljZSBpbmRleCBvbiB0aGUgc3BpIGJ1cyAqLworCS5jb250cm9sbGVyX2RhdGEgPSBOVUxMLAorfTsKKworI2RlZmluZSBOT1JNQUxfTVNHICAgICAgKDA8PDcpCisjZGVmaW5lIEJST0FEQ0FTVF9NU0cgICAoMTw8NykKKyNkZWZpbmUgQkxPQ0tfREFUQSAgICAgICgwPDw2KQorI2RlZmluZSBTSU5HTEVfREFUQSAgICAgKDE8PDYpCisjZGVmaW5lIENJU1BJX0RFVl9BRERSICAxCisKKyNkZWZpbmUgSU5QVVQgMAorI2RlZmluZSBPVVRQVVQgMQorI2RlZmluZSBPVVRMRVZFTF9MT1cgMAorI2RlZmluZSBPVVRMRVZFTF9ISUdIIDEKKyNkZWZpbmUgUFVMTExPVyAxCisjZGVmaW5lIFBVTExISUdIIDAKKworLyoKK3NlbmRidWYgZGF0YSBzdHJ1Y3QKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3xzdGFydCBmbGFnfCBjbWQgICB8IGRhdGEgIHwgIGFkZHIgICB8ZW5kIGZsYWcgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgMiBieXRlICAgfCAxYnl0ZSB8IDFieXRlIHwgICAyIGJ5dGV8ICAgMiBieXRlIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNkZWZpbmUgU0VOREJVRkxFTiAgOAorc3RhdGljIHU4IHNlbmRidWZbU0VOREJVRkxFTl07Lyogc2VuZCBkYXRhICovCitzdGF0aWMgdTggcmJ1ZltTRU5EQlVGTEVOXTsvKnNhdmUgZ2V0IGRhdGEgKi8KKy8qKlxicmllZiBhbWxfaW5pdF9zZW5kX2J1Zjppbml0IHNwaSBzZW5kIGJ1ZgorKiBccGFyYW0gY21kOiBjaSBjbWQKKyogXHBhcmFtIGRhdGE6IHdyaXRlIHZhbHVlCisqIFxwYXJhbSBhZGRyOiByZWFkIG9yIHdyaXRlIGFkZHIKKyogXHJldHVybgorKiAgIC0gcmVhZCB2YWx1ZTpvaworKiAgIC0gLUVJTlZBTCA6IGVycm9yCisqLworc3RhdGljIGludCBhbWxfaW5pdF9zZW5kX2J1Zih1OCBjbWQsIHU4IGRhdGEsIHUxNiBhZGRyKQoreworCS8qIHN0YXJ0IGZsYWcgKi8KKwlzZW5kYnVmWzBdID0gREFUQVNUQVJUOworCXNlbmRidWZbMV0gPSBEQVRBU1RBUlQ7CisJLyogY21kICovCisJc2VuZGJ1ZlsyXSA9IGNtZDsKKwkvKiBkYXRhICovCisJc2VuZGJ1ZlszXSA9IGRhdGE7CisJLyogYWRkciBzZW5mIGxvdyA4IGJpdCBmaXJzdCxhbmQgdGhlbiBzZW5kIGhpIDhiaXQgKi8KKwlzZW5kYnVmWzRdID0gYWRkciAmIDB4MDBmZjsKKwlzZW5kYnVmWzVdID0gKGFkZHI+PjgpICYgMHhmZjsKKwkvKiBlbmQgZmxhZyAqLworCXNlbmRidWZbNl0gPSBEQVRBRU5EOworCXNlbmRidWZbN10gPSBEQVRBRU5EOworCXJldHVybiAwOworfQorLyoqXGJyaWVmIGFtbF9jaV9zcGlfcmVjaXZlcgorKiBccGFyYW1bb3V0XSBOb25lCisqIFxwYXJhbVtpbl0gdmFsdWUsZ2V0IGZyb20gc3BpCisqIFxyZXR1cm4KKyogICAtIDA6cmVjaXZlciBlbmQsLTE6cmVjaXZlcgorKiAgIC0KKyovCisvKgorZGF0YSBzdHJvdWN0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8c3RhcnQgZmxhZ3wgY21kICAgfCBkYXRhICB8ICBhZGRyICAgfGVuZCBmbGFnICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IDIgYnl0ZSAgIHwgMWJ5dGUgfCAxYnl0ZSB8ICAgMiBieXRlfCAgIDIgYnl0ZSB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworaW50IGFtbF9jaV9zcGlfcGFzZXJfYml0KHVpbnQ4X3QgdmFsdWUpCit7CisJLyogcmVhZCBzcGkgZGF0YSBmcm9tIHNsYXZlICovCisJaWYgKEdfcmVjX2ZsYWcgPT0gQU1fU1BJX1NURVBfSU5JVCkgeworCQkvKiBzdGFydCB0eXBlIGZpcnN0ICovCisJCWlmICh2YWx1ZSA9PSBEQVRBU1RBUlQpIHsKKwkJCXJidWZbMF0gPSB2YWx1ZTsKKwkJCUdfcmVjX2ZsYWcgPSBBTV9TUElfU1RFUF9TVEFSVDE7CisJCX0KKwl9IGVsc2UgaWYgKEdfcmVjX2ZsYWcgPT0gQU1fU1BJX1NURVBfU1RBUlQxKSB7CisJCS8qIHN0YXJ0MiB0eXBlIHNlY2NvbmQgKi8KKwkJaWYgKHZhbHVlID09IERBVEFTVEFSVCkgeworCQkJcmJ1ZlsxXSA9IHZhbHVlOworCQkJR19yZWNfZmxhZyA9IEFNX1NQSV9TVEVQX1NUQVJUMjsKKwkJfQorCX0gZWxzZSBpZiAoR19yZWNfZmxhZyA9PSBBTV9TUElfU1RFUF9TVEFSVDIpIHsKKwkJLyogY21kIHR5cGUgKi8KKwkJLyogcHJfZGJnKCJzcGkgdmFsdWU9JWRcclxuIix2YWx1ZSk7ICovCisJCXJidWZbMl0gPSB2YWx1ZTsKKwkJR19yZWNfZmxhZyA9IEFNX1NQSV9TVEVQX0NNRDsKKwl9IGVsc2UgaWYgKEdfcmVjX2ZsYWcgPT0gQU1fU1BJX1NURVBfQ01EKSB7CisJCS8qIGRhdGEgICovCisJCXJidWZbM10gPSB2YWx1ZTsKKwkJR19yZWNfZmxhZyA9IEFNX1NQSV9TVEVQX0RBVEE7CisJfSBlbHNlIGlmIChHX3JlY19mbGFnID09IEFNX1NQSV9TVEVQX0RBVEEpIHsKKwkJLyogQUREUjEgICovCisJCXJidWZbNF0gPSB2YWx1ZTsKKwkJR19yZWNfZmxhZyA9IEFNX1NQSV9TVEVQX0FERFIxOworCX0gZWxzZSBpZiAoR19yZWNfZmxhZyA9PSBBTV9TUElfU1RFUF9BRERSMSkgeworCQkvKiBBRERSMiB0eXBlICovCisJCXJidWZbNV0gPSB2YWx1ZTsKKwkJR19yZWNfZmxhZyA9IEFNX1NQSV9TVEVQX0FERFIyOworCX0gZWxzZSBpZiAoR19yZWNfZmxhZyA9PSBBTV9TUElfU1RFUF9BRERSMikgeworCQkvKiAgRU5EMSB0eXBlICovCisJCWlmICh2YWx1ZSA9PSBEQVRBRU5EKSB7CisJCQlyYnVmWzZdID0gdmFsdWU7CisJCQlHX3JlY19mbGFnID0gQU1fU1BJX1NURVBfRU5EMTsKKwkJfQorCX0gZWxzZSBpZiAoR19yZWNfZmxhZyA9PSBBTV9TUElfU1RFUF9FTkQxKSB7CisJCS8qIEVORDIgdHlwZSAqLworCQlpZiAodmFsdWUgPT0gREFUQUVORCkgeworCQkJcmJ1Zls3XSA9IHZhbHVlOworCQkJR19yZWNfZmxhZyA9IEFNX1NQSV9TVEVQX0VORDI7CisJCQkvKiBwcl9kYmcoInNwaSByZWFkIHZhbHVlIG9rIGVuZFxyXG4iKTsgKi8KKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtMTsKK30KKworLyoqXGJyaWVmIGFtbF9zcGlfaW9fYXBpOnNwaSByZWFkIG9yIHdyaXRlIGFwaSB3aXRoIG1jdQorKiBccGFyYW0gc3BpX2RldjogYW1sX3NwaSBvYmosdXNlZCB0aGlzIGRhdGEgdG8gZ2V0IHNwaSBvYmoKKyogXHBhcmFtIHZhbDogd3JpdGUgdmFsdWUKKyogXHBhcmFtIGxlbjogd3JpdGUgdmFsdWUgbGVuCisqIFxwYXJhbSBtb2RlOiBjbWQKKyogXHJldHVybgorKiAgIC0gcmVhZCB2YWx1ZTpvaworKiAgIC0gLUVJTlZBTCA6IGVycm9yCisqLworc3RhdGljIGludCBhbWxfc3BpX2lvX2FwaShzdHJ1Y3QgYW1sX3NwaSAqc3BpX2RldiwgdTggKnZhbCwgaW50IGxlbiwgaW50IG1vZGUpCit7CisJdTggcmJbMzJdID0gezB9OworCWludCByZXQgPSAwOworCWludCBpID0gMDsKKwl1OCByZCA9IDA7CisJaW50IGogPSAwOworCWludCBpc19yZXRyeSA9IDA7CisJaWYgKHNwaV9kZXYgPT0gTlVMTCApIHsKKwkJcHJfZXJyb3IoIiVzIHNwaV9kZXYgIGlzIG51bGxcclxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHNwaV9kZXYtPnNwaSA9PSBOVUxMKSB7CisJCXByX2Vycm9yKCIlcyBzcGkgaXMgbnVsbFxyXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzcGluX2xvY2soJnNwaV9kZXYtPnNwaV9sb2NrKTsKKwlpZiAoc3BpX2Rldi0+Y3NfaG9sZF9kZWxheSkKKwkJdWRlbGF5KHNwaV9kZXYtPmNzX2hvbGRfZGVsYXkpOworcmVzdGFydDoKKwlkaXJzcGlfc3RhcnQoc3BpX2Rldi0+c3BpKTsKKwlpZiAoc3BpX2Rldi0+Y3NfY2xrX2RlbGF5KQorCQl1ZGVsYXkoc3BpX2Rldi0+Y3NfY2xrX2RlbGF5KTsKKworCXJldCA9IGRpcnNwaV94ZmVyKHNwaV9kZXYtPnNwaSwgdmFsLCByYiwgbGVuKTsKKwlpZiAocmV0ICE9IDApCisJCQlwcl9kYmcoInNwaSB4ZmVyIHZhbHVlIGVycnJvIHJldCAlZFxyXG4iLCAgcmV0KTsKKwkvKiB3YWl0IG1jdSBpbyAxbXMgKi8KKwl1ZGVsYXkoMTAwMCk7CisJLyogaW5pdCByZWMgZmxhZyAqLworCUdfcmVjX2ZsYWcgPSBBTV9TUElfU1RFUF9JTklUOworCW1lbXNldChyYnVmLCAwLCA4KTsKKworCWZvciAoaSA9IDA7IGkgPCA0ICogbGVuOyBpKyspIHsKKwkJdWRlbGF5KDUwKTsKKwkJbWVtc2V0KHJiLCAwLCAzMik7CisJCXJldCA9IGRpcnNwaV9yZWFkKHNwaV9kZXYtPnNwaSwgcmIsIEFNTF9TUElfUkVBRF9MRU4pOworCQlpZiAocmV0ICE9IDApIHsKKwkJCXByX2RiZygic3BpIHJlYWQgdmFsdWUgdGltZW91dDoleCByZXQgJWRcclxuIiwgcmQsIHJldCk7CisJCX0KKwkJZm9yIChqID0gMDsgaiA8IEFNTF9TUElfUkVBRF9MRU47IGorKykgeworCQkJLypwcl9kYmcoInNwaSByZWFkIHZhbHVlIHJiWyVkXTogMHglMnhcclxuIiwgaiwgcmJbal0pOyovCisJCQlyZXQgPSBhbWxfY2lfc3BpX3Bhc2VyX2JpdChyYltqXSk7CisJCQlpZiAocmV0ID09IDApCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJldCA9PSAwKQorCQkJYnJlYWs7CisJfQorCWlmIChyZXQgPT0gMCkgeworCQlyZCA9IHJidWZbM107LyogZGF0YSAqLworCX0gZWxzZSB7CisJCXByX2RiZygiKnNwaSByZWMgZmxhZ1slZF1pbmRleCBbJWRdIHJlYWQgZXJyb3JbMHgleF0gbW9kZVslZF1hZGRyWyVkXSoqKipcclxuIiwKKwkJCUdfcmVjX2ZsYWcsIGkscmQsIG1vZGUsICh2YWxbNV0gPDwgOCB8IHZhbFs0XSkgJiAweGZmZmYpOworCQlkaXJzcGlfc3RvcChzcGlfZGV2LT5zcGkpOworCQkvL29ubHkgcmV0cnkgb25jZQorCQlpZiAoaXNfcmV0cnkgPT0gMCkgeworCQkJaXNfcmV0cnkgPSAxOworCQkJZ290byByZXN0YXJ0OworCQl9CisJfQorCWlmIChzcGlfZGV2LT5jc19jbGtfZGVsYXkpCisJCXVkZWxheShzcGlfZGV2LT5jc19jbGtfZGVsYXkpOworCisJLyogcHJfZXJyb3IoImNpIHNwaSBpcyBzdG9wIGluICVzIHJkPSVkXHJcbiIsX19mdW5jX18scmQpOyovCisJZGlyc3BpX3N0b3Aoc3BpX2Rldi0+c3BpKTsKKworCXNwaW5fdW5sb2NrKCZzcGlfZGV2LT5zcGlfbG9jayk7CisKKwlyZXR1cm4gcmQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqICAgICAgICAgICAgIGdwaW8gYXBpICAgICAgICAgICAgICAgKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKlxicmllZiBhbWxfc2V0X2dwaW9fb3V0OnNldCBnaW8gb3V0IGFuZCBzZXQgdmFsIHZhbHVlCisqIFxwYXJhbSBncGlvOiBncGlvX2Rlc2Mgb2JqLAorKiBccGFyYW0gdmFsOiAgc2V0IHZhbAorKiBccmV0dXJuCisqICAgLSAwOm9rCisqICAgLSAtRUlOVkFMIDogZXJyb3IKKyovCitzdGF0aWMgaW50IGFtbF9zZXRfZ3Bpb19vdXQoc3RydWN0IGdwaW9fZGVzYyAqZ3BpbywgaW50IHZhbCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpZiAodmFsIDwgMCkgeworCQlwcl9kYmcoImdwaW8gb3V0IHZhbCA9IC0xLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHZhbCAhPSAwKQorCQl2YWwgPSAxOworCXJldCA9IGdwaW9kX2RpcmVjdGlvbl9vdXRwdXQoZ3BpbywgdmFsKTsKKwlwcl9kYmcoImR2YiBjaSBncGlvIG91dCByZXQgJWQgc2V0IHZhbDolZFxuIiwgcmV0LCB2YWwpOworCXJldHVybiByZXQ7Cit9CisjaWYgMC8vbm8gdXNlZAorLyoqXGJyaWVmIGFtbF9zZXRfZ3Bpb19pbjpzZXQgZ2lvIGluCisqIFxwYXJhbSBncGlvOiBncGlvX2Rlc2Mgb2JqLAorKiBccmV0dXJuCisqICAgLSAwOm9rCisqICAgLSAtRUlOVkFMIDogZXJyb3IKKyovCitzdGF0aWMgaW50IGFtbF9zZXRfZ3Bpb19pbihzdHJ1Y3QgZ3Bpb19kZXNjICpncGlvKQoreworCWdwaW9kX2RpcmVjdGlvbl9pbnB1dChncGlvKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKipcYnJpZWYgYW1sX2dldF9ncGlvX3ZhbHVlOmdldCBnaW8gdmFsdWUKKyogXHBhcmFtIGdwaW86IGdwaW9fZGVzYyBvYmosCisqIFxyZXR1cm4KKyogICAtIGdwaW8gdmFsdWU6b2sKKyogICAtIC1FSU5WQUwgOiBlcnJvcgorKi8KK3N0YXRpYyBpbnQgYW1sX2dldF9ncGlvX3ZhbHVlKHN0cnVjdCBncGlvX2Rlc2MgKmdwaW8pCit7CisJaW50IHJldCA9IDA7CisJcmV0ID0gZ3Bpb2RfZ2V0X3ZhbHVlKGdwaW8pOworCXJldHVybiByZXQ7Cit9CisvKipcYnJpZWYgYW1sX2dwaW9fZnJlZTpmcmVlIGdpbworKiBccGFyYW0gZ3BpbzogZ3Bpb19kZXNjIG9iaiwKKyogXHJldHVybgorKiAgIC0gMDpvaworKiAgIC0gLUVJTlZBTCA6IGVycm9yCisqLworc3RhdGljIGludCBhbWxfZ3Bpb19mcmVlKHN0cnVjdCBncGlvX2Rlc2MgKmdwaW8pCit7CisJZ3Bpb2RfcHV0KGdwaW8pOworCXJldHVybiAwOworfQorLyoqXGJyaWVmIHNwaV9nZXRfZ3Bpb19ieV9uYW1lOmdldCBncGlvIGRlc2MgZnJvbSBkdHMgZmlsZQorKiBccGFyYW0gc3BpX2RldjogYW1sX3NwaSBvYmoKKyogXHBhcmFtIGdwaW9kOiAgIGdwaW9fZGVzYyAqIG9iagorKiBccGFyYW0gc3RyOiBncGlvIG5hbWUgYXQgZHRzIGZpbGUKKyogXHBhcmFtIGlucHV0X291dHB1dDogZ3BpbyBpbnB1dCBvciBvdXRwdXQgdHlwZQorKiBccGFyYW0gb3V0cHV0X3ZhbHVlOiBncGlvIG91dCBwdXQgdmFsdWUKKyogXHJldHVybgorKiAgIC0gMDpvaworKiAgIC0gLUVJTlZBTCA6IGVycm9yCisqLworc3RhdGljIGludCBzcGlfZ2V0X2dwaW9fYnlfbmFtZShzdHJ1Y3QgYW1sX3NwaSAqc3BpX2RldiwKK3N0cnVjdCBncGlvX2Rlc2MgKipncGlvZCwgaW50ICpwaW5fdmFsdWUsCitjaGFyICpzdHIsIGludCBpbnB1dF9vdXRwdXQsIGludCBvdXRwdXRfbGV2ZWwpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGRldmljZV9ub2RlICpjaGlsZCA9IE5VTEw7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHNwaV9kZXYtPnBkZXY7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCisJLypnZXQgc3BpIGFuZCBncGlvIGNvbmZpZyBmcm9tIGR0cyovCisJLyogZ2V0IGRldmljZSBjb25maWcgZm9yIGR2YmNpX2lvKi8KKwljaGlsZCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKG5wLCAiZHZiY2lfaW8iKTsKKwlpZiAoSVNfRVJSKCpncGlvZCkpIHsKKwkJcHJfZGJnKCJkdmIgY2kgc3BpICVzIHJlcXVlc3QgZmFpbGVkXG4iLCBzdHIpOworCQlyZXR1cm4gLTE7CisJfQorCisJKnBpbl92YWx1ZSA9IG9mX2dldF9uYW1lZF9ncGlvX2ZsYWdzKGNoaWxkLCBzdHIsIDAsIE5VTEwpOworCSpncGlvZCA9IGdwaW9fdG9fZGVzYygqcGluX3ZhbHVlKTsKKwlpZiAoSVNfRVJSKCpncGlvZCkpIHsKKwkJcHJfZGJnKCJzcGkgJXMgcmVxdWVzdCBmYWlsZWRcbiIsIHN0cik7CisJCXJldHVybiAtMTsKKwl9CisJcHJfZGJnKCJzcGkgZ2V0X2dwaW8gJXMgJXAgICVkXG4iLCBzdHIsICpncGlvZCwgKnBpbl92YWx1ZSk7CisJZ3Bpb19yZXF1ZXN0KCpwaW5fdmFsdWUsIEFNTF9NT0RFX05BTUUpOworCisJaWYgKGlucHV0X291dHB1dCA9PSBPVVRQVVQpIHsKKwkJcmV0ID0gZ3Bpb2RfZGlyZWN0aW9uX291dHB1dCgqZ3Bpb2QsIG91dHB1dF9sZXZlbCk7CisJfSBlbHNlIGlmIChpbnB1dF9vdXRwdXQgPT0gSU5QVVQpCXsKKwkJcmV0ID0gZ3Bpb2RfZGlyZWN0aW9uX2lucHV0KCpncGlvZCk7CisJCS8qcmV0IHw9IGdwaW9kX3NldF9wdWxsdXAoKmdwaW9kLCAxKTsqLworCX0gZWxzZSB7CisJCXByX2Vycm9yKCJzcGkgUmVxdWVzdCBncGlvIGRpcmVjdGlvbiBpbnZhbGlkXG4iKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqICAgICAgICAgICAgIGdwaW8gYXBpIGVuZCAgICAgICAgICAgKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAxCisvKipcYnJpZWYgYW1sX2NpX2Npc190ZXN0X2J5X3NwaTp0ZXN0IGNpcworKiBccGFyYW0gY2lfZGV2OiBhbWxfY2kgb2JqLHVzZWQgdGhpcyBkYXRhIHRvIGdldCBzcGlfZGV2IG9iagorKiBccGFyYW0gc2xvdDogc2xvdCBpbmRleAorKiBccGFyYW0gYWRkcjogcmVhZCBhZGRyCisqIFxyZXR1cm4KKyogICAtIHRlc3QgOm9rCisqICAgLSAtRUlOVkFMIDogZXJyb3IKKyovCisvKipcYnJpZWYgYW1sX2NpX2Z1bGxfdGVzdF9ieV9zcGk6Y2kgZnVsbCB0ZXN0CisqIFxwYXJhbSBjaV9kZXY6IGFtbF9jaSBvYmosdXNlZCB0aGlzIGRhdGEgdG8gZ2V0IHNwaV9kZXYgb2JqCisqIFxwYXJhbSBzbG90OiBzbG90IGluZGV4CisqIFxwYXJhbSBhZGRyOiByZWFkIGFkZHIKKyogXHJldHVybgorKiAgIC0gcmVhZCB2YWx1ZTpvaworKiAgIC0gLUVJTlZBTCA6IGVycm9yCisqLworc3RhdGljICBpbnQgYW1sX2NpX2Z1bGxfdGVzdF9ieV9zcGkoCisJc3RydWN0IGFtbF9jaSAqY2lfZGV2LCBpbnQgc2xvdCwgaW50IGFkZHIpCit7CisJdTggIGRhdGEgPSAwOworCXUxNiBhZGRyZXMgPSBhZGRyOworCWludCB2YWx1ZSA9IDA7CisJc3RydWN0IGFtbF9zcGkgKnNwaV9kZXYgPSBjaV9kZXYtPmRhdGE7CisJYW1sX2luaXRfc2VuZF9idWYoQU1fQ0lfQ01EX0ZVTExURVNULCBkYXRhLCBhZGRyZXMpOworCXZhbHVlID0gYW1sX3NwaV9pb19hcGkoc3BpX2RldiwKKwkJc2VuZGJ1ZiwgU0VOREJVRkxFTiwgQU1fQ0lfQ01EX0ZVTExURVNUKTsKKwlwcl9kYmcoIkZVTEwgOiBURVNUIEVORCBcclxuIik7CisJcmV0dXJuIHZhbHVlOworfQorI2VuZGlmCisvKipcYnJpZWYgYW1sX2NpX21lbV9yZWFkX2J5X3NwaTppbyByZWFkIGZyb20gY2FtCisqIFxwYXJhbSBjaV9kZXY6IGFtbF9jaSBvYmosdXNlZCB0aGlzIGRhdGEgdG8gZ2V0IHNwaV9kZXYgb2JqCisqIFxwYXJhbSBzbG90OiBzbG90IGluZGV4CisqIFxwYXJhbSBhZGRyOiByZWFkIGFkZHIKKyogXHJldHVybgorKiAgIC0gcmVhZCB2YWx1ZTpvaworKiAgIC0gLUVJTlZBTCA6IGVycm9yCisqLworc3RhdGljICBpbnQgYW1sX2NpX21lbV9yZWFkX2J5X3NwaSgKKwlzdHJ1Y3QgYW1sX2NpICpjaV9kZXYsIGludCBzbG90LCBpbnQgYWRkcikKK3sKKwl1OCAgZGF0YSA9IDA7CisJdTE2IGFkZHJlcyA9IGFkZHI7CisJaW50IHZhbHVlID0gMDsKKwlzdHJ1Y3QgYW1sX3NwaSAqc3BpX2RldiA9IGNpX2Rldi0+ZGF0YTsKKwlhbWxfaW5pdF9zZW5kX2J1ZihBTV9DSV9DTURfTUVNUiwgZGF0YSwgYWRkcmVzKTsKKwl2YWx1ZSA9IGFtbF9zcGlfaW9fYXBpKHNwaV9kZXYsIHNlbmRidWYsIFNFTkRCVUZMRU4sIEFNX0NJX0NNRF9NRU1SKTsKKwkvKnByX2RiZygiUmVhZCA6IG1lbVslZF0gPSAweCV4XG4iLCBhZGRyLCB2YWx1ZSk7Ki8KKwlyZXR1cm4gdmFsdWU7Cit9CisvKipcYnJpZWYgYW1sX2NpX21lbV93cml0ZV9ieV9zcGk6aW8gd3JpdGUgdG8gY2FtIGJ5IHNwaSBhcGkKKyogXHBhcmFtIGNpX2RldjogYW1sX2NpIG9iaix1c2VkIHRoaXMgZGF0YSB0byBnZXQgc3BpX2RldiBvYmoKKyogXHBhcmFtIHNsb3Q6IHNsb3QgaW5kZXgKKyogXHBhcmFtIGFkZHI6IHdyaXRlIGFkZHIKKyogXHBhcmFtIGFkZHI6IHdyaXRlIHZhbHVlCisqIFxyZXR1cm4KKyogICAtIDA6b2sKKyogICAtIC1FSU5WQUwgOiBlcnJvcgorKi8KK3N0YXRpYyBpbnQgYW1sX2NpX21lbV93cml0ZV9ieV9zcGkoCisJc3RydWN0IGFtbF9jaSAqY2lfZGV2LCBpbnQgc2xvdCwgaW50IGFkZHIsICB1OCB2YWwpCit7CisJdTggIGRhdGEgPSB2YWw7CisJdTE2IGFkZHJlcyA9IGFkZHI7CisJaW50IHZhbHVlID0gMDsKKwlzdHJ1Y3QgYW1sX3NwaSAqc3BpX2RldiA9IGNpX2Rldi0+ZGF0YTsKKwlhbWxfaW5pdF9zZW5kX2J1ZihBTV9DSV9DTURfTUVNVywgZGF0YSwgYWRkcmVzKTsKKwl2YWx1ZSA9IGFtbF9zcGlfaW9fYXBpKHNwaV9kZXYsIHNlbmRidWYsIFNFTkRCVUZMRU4sIEFNX0NJX0NNRF9NRU1XKTsKKwkvKnByX2RiZygid3JpdGUgOiBtZW1bJWRdID0gMHgleFxuIiwgYWRkciwgZGF0YSk7Ki8KK3JldHVybiB2YWx1ZTsKK30KKy8qKlxicmllZiBhbWxfY2lfaW9fcmVhZF9ieV9zcGk6aW8gcmVhZCBmcm9tIGNhbSBieSBzcGkgYXBpCisqIFxwYXJhbSBjaV9kZXY6IGFtbF9jaSBvYmosdXNlZCB0aGlzIGRhdGEgdG8gZ2V0IHNwaV9kZXYgb2JqCisqIFxwYXJhbSBzbG90OiBzbG90IGluZGV4CisqIFxwYXJhbSBhZGRyOiByZWFkIGFkZHIKKyogXHJldHVybgorKiAgIC0gcmVhZCB2YWx1ZTpvaworKiAgIC0gLUVJTlZBTCA6IGVycm9yCisqLworc3RhdGljIGludCBhbWxfY2lfaW9fcmVhZF9ieV9zcGkoCisJc3RydWN0IGFtbF9jaSAqY2lfZGV2LCBpbnQgc2xvdCwgaW50IGFkZHIpCit7CisJdTggIGRhdGEgPSAwOworCXUxNiBhZGRyZXMgPSBhZGRyOworCWludCB2YWx1ZSA9IDA7CisJc3RydWN0IGFtbF9zcGkgKnNwaV9kZXYgPSBjaV9kZXYtPmRhdGE7CisJYW1sX2luaXRfc2VuZF9idWYoQU1fQ0lfQ01EX0lPUiwgZGF0YSwgYWRkcmVzKTsKKwl2YWx1ZSA9IGFtbF9zcGlfaW9fYXBpKHNwaV9kZXYsIHNlbmRidWYsIFNFTkRCVUZMRU4sIEFNX0NJX0NNRF9JT1IpOworCS8qcHJfZGJnKCJyZWFkIDogaW9bJWRdID0gMHgleFxuIiwgYWRkciwgdmFsdWUpOyovCisJcmV0dXJuIHZhbHVlOworfQorLyoqXGJyaWVmIGFtbF9jaV9pb193cml0ZV9ieV9zcGk6aW8gd3JpdGUgdG8gY2FtCisqIFxwYXJhbSBjaV9kZXY6IGFtbF9jaSBvYmosdXNlZCB0aGlzIGRhdGEgdG8gZ2V0IHNwaV9kZXYgb2JqCisqIFxwYXJhbSBzbG90OiBzbG90IGluZGV4CisqIFxwYXJhbSBhZGRyOiB3cml0ZSBhZGRyCisqIFxwYXJhbSBhZGRyOiB3cml0ZSB2YWx1ZQorKiBccmV0dXJuCisqICAgLSAwOm9rCisqICAgLSAtRUlOVkFMIDogZXJyb3IKKyovCitzdGF0aWMgaW50IGFtbF9jaV9pb193cml0ZV9ieV9zcGkoCisJc3RydWN0IGFtbF9jaSAqY2lfZGV2LCBpbnQgc2xvdCwgaW50IGFkZHIsIHU4IHZhbCkKK3sKKwl1OCAgZGF0YSA9IHZhbDsKKwl1MTYgYWRkcmVzID0gYWRkcjsKKwlpbnQgdmFsdWUgPSAwOworCXN0cnVjdCBhbWxfc3BpICpzcGlfZGV2ID0gY2lfZGV2LT5kYXRhOworCS8qYWRkIGJ5IGNobCxuZWVkIGFkZCB0aW1lIGRlbGF5Ki8KKwltZGVsYXkoMTApOworCWFtbF9pbml0X3NlbmRfYnVmKEFNX0NJX0NNRF9JT1csIGRhdGEsIGFkZHJlcyk7CisJdmFsdWUgPSBhbWxfc3BpX2lvX2FwaShzcGlfZGV2LCBzZW5kYnVmLCBTRU5EQlVGTEVOLCBBTV9DSV9DTURfSU9XKTsKKwkvKnByX2RiZygid3JpdGUgOiBBVFRSWyVkXSA9IDB4JXhcbiIsIGFkZHIsIGRhdGEpOyovCisJcmV0dXJuIHZhbHVlOworfQorCisKKy8qKlxicmllZiBhbWxfY2lfcnN0X2J5X3NwaTpyZXNldCBjYW0gYnkgc3BpCisqIFxwYXJhbSBjaV9kZXY6IGFtbF9jaSBvYmosdXNlZCB0aGlzIGRhdGEgdG8gZ2V0IHNwaV9kZXYgb2JqCisqIFxwYXJhbSBzbG90OiBzbG90IGluZGV4CisqIFxyZXR1cm4KKyogICAtIDA6b2sKKyogICAtIC1FSU5WQUwgOiBlcnJvcgorKi8KK3N0YXRpYyBpbnQgYW1sX2NpX3JzdF9ieV9zcGkoCisJc3RydWN0IGFtbF9jaSAqY2lfZGV2LCBpbnQgc2xvdCwgaW50IGxldmVsKQoreworCXU4ICBkYXRhID0gKHU4KWxldmVsOworCXUxNiBhZGRyZXMgPSAwOworCWludCB2YWx1ZSA9IDA7CisJc3RydWN0IGFtbF9zcGkgKnNwaV9kZXYgPSBjaV9kZXYtPmRhdGE7CisJLyphZGQgYnkgY2hsLG5lZWQgYWRkIHRpbWUgZGVsYXkqLworCW1kZWxheSgxMCk7CisJYW1sX2luaXRfc2VuZF9idWYoQU1fQ0lfQ01EX1JFU0VULCBkYXRhLCBhZGRyZXMpOworCXZhbHVlID0gYW1sX3NwaV9pb19hcGkoc3BpX2Rldiwgc2VuZGJ1ZiwgU0VOREJVRkxFTiwgQU1fQ0lfQ01EX1JFU0VUKTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qKlxicmllZiBhbWxfY2lfcG93ZXJfYnlfc3BpOnBvd2VyIGNhbSBieSBzcGkKKyogXHBhcmFtIGNpX2RldjogYW1sX2NpIG9iaix1c2VkIHRoaXMgZGF0YSB0byBnZXQgc3BpX2RldiBvYmoKKyogXHBhcmFtIHNsb3Q6IHNsb3QgaW5kZXgKKyogXHBhcmFtIGVuYWJsZTogZW5hYmxlIG9yIGRpc2FibGUgY2FtCisqIFxyZXR1cm4KKyogICAtIDA6b2sKKyogICAtIC1FSU5WQUwgOiBlcnJvcgorKi8KK3N0YXRpYyBpbnQgYW1sX2NpX3Bvd2VyX2J5X3NwaSgKKwlzdHJ1Y3QgYW1sX2NpICpjaV9kZXYsIGludCBzbG90LCBpbnQgZW5hYmxlKQoreworCXU4ICBkYXRhID0gKHU4KWVuYWJsZTsKKwl1MTYgYWRkcmVzID0gMDsKKwlpbnQgdmFsdWUgPSAwOworCXN0cnVjdCBhbWxfc3BpICpzcGlfZGV2ID0gY2lfZGV2LT5kYXRhOworCS8qYWRkIGJ5IGNobCxuZWVkIGFkZCB0aW1lIGRlbGF5Ki8KKwkvKnBvd2VyIGlzIGNvbnRyb2xlZCBieSBtY3UqLworCWlmICgwKSB7CisJCW1kZWxheSgxMCk7CisJCWFtbF9pbml0X3NlbmRfYnVmKEFNX0NJX0NNRF9QT1dFUiwgZGF0YSwgYWRkcmVzKTsKKwkJdmFsdWUgPSBhbWxfc3BpX2lvX2FwaShzcGlfZGV2LCBzZW5kYnVmLCBTRU5EQlVGTEVOLCBBTV9DSV9DTURfUE9XRVIpOworCX0KKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qKlxicmllZiBhbWxfY2lfZ2V0Y2QxMl9ieV9zcGk6Z2V0IGNkMTIgY2FtIGJ5IHNwaQorKiBccGFyYW0gY2lfZGV2OiBhbWxfY2kgb2JqLHVzZWQgdGhpcyBkYXRhIHRvIGdldCBzcGlfZGV2IG9iagorKiBccGFyYW0gc2xvdDogc2xvdCBpbmRleAorKiBccGFyYW0gY2QxMjogY2QxIG9yIGNkMiB2YWx1ZQorKiBccmV0dXJuCisqICAgLSAwOm9rCisqICAgLSAtRUlOVkFMIDogZXJyb3IKKyovCitzdGF0aWMgaW50IGFtbF9jaV9nZXRjZDEyX2J5X3NwaSgKKwlzdHJ1Y3QgYW1sX2NpICpjaV9kZXYsIGludCBzbG90LCBpbnQgY2QxMikKK3sKKwl1OCAgZGF0YSA9ICh1OCljZDEyOworCXUxNiBhZGRyZXMgPSAwOworCWludCB2YWx1ZSA9IDA7CisJc3RydWN0IGFtbF9zcGkgKnNwaV9kZXYgPSBjaV9kZXYtPmRhdGE7CisJLyphZGQgYnkgY2hsLG5lZWQgYWRkIHRpbWUgZGVsYXkqLworCW1kZWxheSgxMCk7CisJYW1sX2luaXRfc2VuZF9idWYoQU1fQ0lfQ01EX0dFVENEMTIsIGRhdGEsIGFkZHJlcyk7CisJdmFsdWUgPSBhbWxfc3BpX2lvX2FwaShzcGlfZGV2LCBzZW5kYnVmLCBTRU5EQlVGTEVOLCBBTV9DSV9DTURfR0VUQ0QxMik7CisJcmV0dXJuIHZhbHVlOworfQorCisKKworLyoqXGJyaWVmIGFtbF9jaV9zbG90X3Jlc2V0OnJlc2V0IHNsb3QKKyogXHBhcmFtIGNpX2RldjogYW1sX2NpIG9iaix1c2VkIHRoaXMgZGF0YSB0byBnZXQgc3BpX2RldiBvYmoKKyogXHBhcmFtIHNsb3Q6IHNsb3QgaW5kZXgKKyogXHJldHVybgorKiAgIC0gMDpvaworKiAgIC0gLUVJTlZBTCA6IGVycm9yCisqLworc3RhdGljIGludCBhbWxfY2lfc2xvdF9yZXNldChzdHJ1Y3QgYW1sX2NpICpjaV9kZXYsIGludCBzbG90KQoreworCXN0cnVjdCBhbWxfc3BpICpzcGlfZGV2ID0gY2lfZGV2LT5kYXRhOworCXByX2RiZygiU2xvdCglZCk6IFNsb3QgUkVTRVRcbiIsIHNsb3QpOworCWFtbF9wY21jaWFfcmVzZXQoJnNwaV9kZXYtPnBjKTsKKwlkdmJfY2FfZW41MDIyMV9jaW1jdV9jYW1yZWFkeV9pcnEoJmNpX2Rldi0+ZW41MDIyMV9jaW1jdSwgMCk7CisJcmV0dXJuIDA7Cit9CisvKipcYnJpZWYgYW1sX2NpX3Nsb3Rfc2h1dGRvd246c2hvdyBzbG90CisqIFxwYXJhbSBjaV9kZXY6IGFtbF9jaSBvYmosdXNlZCB0aGlzIGRhdGEgdG8gZ2V0IHNwaV9kZXYgb2JqCisqIFxwYXJhbSBzbG90OiBzbG90IGluZGV4CisqIFxyZXR1cm4KKyogICAtIDA6b2sKKyogICAtIC1FSU5WQUwgOiBlcnJvcgorKiByZWFkbWU6bm8gdXNlIHRoaXMgYXBpCisqLworc3RhdGljIGludCBhbWxfY2lfc2xvdF9zaHV0ZG93bihzdHJ1Y3QgYW1sX2NpICpjaV9kZXYsIGludCBzbG90KQoreworCXByX2RiZygiU2xvdCglZCk6IFNsb3Qgc2h1dGRvd25cbiIsIHNsb3QpOworCXJldHVybiAwOworfQorLyoqXGJyaWVmIGFtbF9jaV90c19jb250cm9sOmNvbnRyb2wgc2xvdCB0cworKiBccGFyYW0gY2lfZGV2OiBhbWxfY2kgb2JqLHVzZWQgdGhpcyBkYXRhIHRvIGdldCBzcGlfZGV2IG9iagorKiBccGFyYW0gc2xvdDogc2xvdCBpbmRleAorKiBccmV0dXJuCisqICAgLSAwOm9rCisqICAgLSAtRUlOVkFMIDogZXJyb3IKKyogcmVhZG1lOm5vIHVzZSB0aGlzIGFwaQorKi8KK3N0YXRpYyBpbnQgYW1sX2NpX3RzX2NvbnRyb2woc3RydWN0IGFtbF9jaSAqY2lfZGV2LCBpbnQgc2xvdCkKK3sKKwlwcl9kYmcoIlNsb3QoJWQpOiBUUyBjb250cm9sXG4iLCBzbG90KTsKKwlyZXR1cm4gMDsKK30KKy8qKlxicmllZiBhbWxfY2lfc2xvdF9zdGF0dXM6Z2V0IHNsb3Qgc3RhdHVzCisqIFxwYXJhbSBjaV9kZXY6IGFtbF9jaSBvYmosdXNlZCB0aGlzIGRhdGEgdG8gZ2V0IHNwaV9kZXYgb2JqCisqIFxwYXJhbSBzbG90OiBzbG90IGluZGV4CisqIFxwYXJhbSBvcGVuOiBubyB1c2VkCisqIFxyZXR1cm4KKyogICAtIGNhbSBzdGF0dXMKKyogICAtIC1FSU5WQUwgOiBlcnJvcgorKi8KK3N0YXRpYyBpbnQgYW1sX2NpX3Nsb3Rfc3RhdHVzKHN0cnVjdCBhbWxfY2kgKmNpX2RldiwgaW50IHNsb3QsIGludCBvcGVuKQoreworCXN0cnVjdCBhbWxfc3BpICpzcGlfZGV2ID0gY2lfZGV2LT5kYXRhOworCisJcHJfZGJnKCJTbG90KCVkKTogUG9sbCBTbG90IHN0YXR1c1xuIiwgc2xvdCk7CisKKwlpZiAoc3BpX2Rldi0+cGMuc2xvdF9zdGF0ZSA9PSBNT0RVTEVfSU5TRVJURUQpIHsKKwkJcHJfZGJnKCJDQSBNb2R1bGUgcHJlc2VudCBhbmQgcmVhZHlcbiIpOworCQlyZXR1cm4gRFZCX0NBX0VONTAyMjFfUE9MTF9DQU1fUFJFU0VOVCB8CisJCURWQl9DQV9FTjUwMjIxX1BPTExfQ0FNX1JFQURZOworCX0gZWxzZSB7CisJCXByX2Vycm9yKCJDQSBNb2R1bGUgbm90IHByZXNlbnQgb3Igbm90IHJlYWR5XG4iKTsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisjaWYgMQorLyoqXGJyaWVmIGFtbF9jaV9naW9fZ2V0X2lycTpnZXQgZ3BpbyBjYW0gaXJxIHBpbiB2YWx1ZQorKiBccmV0dXJuCisqICAgLSBpcnEgcGluIHZhbHVlCisqICAgLSAtRUlOVkFMIDogZXJyb3IKKyovCitzdGF0aWMgaW50IGFtbF9jaV9naW9fZ2V0X2lycSh2b2lkKQoreworCWludCByZXQgPSAwOworCWlmIChnX3NwaV9kZXYtPmlvX2RldmljZV90eXBlID09IEFNTF9EVkJfSU9fVFlQRV9TUEkpCisJCXJldCA9IGFtbF9nZXRfZ3Bpb192YWx1ZShnX3NwaV9kZXYtPmlycV9jYW1fcGluKTsKKwllbHNlIGlmIChnX3NwaV9kZXYtPmlvX2RldmljZV90eXBlID09IEFNTF9EVkJfSU9fVFlQRV9TUEkpCisJCXJldCA9IGFtbF9nZXRfZ3Bpb192YWx1ZShnX3NwaV9kZXYtPm1jdV9pcnFfcGluKTsKKwllbHNlCisJCXByX2Vycm9yKCJhbWxfY2lfZ2lvX2dldF9pcnEgaW8gdHlwZSBub3Qgc3VycG9ydFxuIik7CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKiAgICAgICAgZm9yIHBjbWNpZCBhcGkgICAgICAgICAgICAgICoqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKipcYnJpZWYgYW1sX2dpb19wb3dlcjpzZXQgcG93ZXIgZ3BpbyBoaSBvciBsb3cKKyogXHBhcmFtIHBjOiBhbWxfcGNtY2lhIG9iaix1c2VkIHRoaXMgcHJpdiB0byBnZXQgc3BpX2RldiBvYmoKKyogXHBhcmFtIGVuYWJsZTogcG93ZXIgcGluIGhpIG9yIGxvdworKiBccmV0dXJuCisqICAgLSAwCisqICAgLSAtRUlOVkFMIDogZXJyb3IKKyovCitzdGF0aWMgaW50IGFtbF9naW9fcG93ZXIoc3RydWN0IGFtbF9wY21jaWEgKnBjLCBpbnQgZW5hYmxlKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhbWxfc3BpICpzcGlfZGV2ID0gcGMtPnByaXY7CisJaWYgKHNwaV9kZXYgPT0gTlVMTCkgeworCQlwcl9kYmcoInNwaSBkZXYgaXMgbnVsbCAlcyA6ICVkXHJcbiIsIF9fZnVuY19fLCBlbmFibGUpOworCQlyZXR1cm4gLTE7CisJfQorCXByX2RiZygiJXMgOiAlZFxyXG4iLCBfX2Z1bmNfXywgZW5hYmxlKTsKKwlpZiAoc3BpX2Rldi0+aW9fZGV2aWNlX3R5cGUgPT0gQU1MX0RWQl9JT19UWVBFX1NQSSkgeworCQlpZiAoZW5hYmxlID09IEFNTF9QV1JfT1BFTikgeworCQkvKmhpIGxldmVsICxvcGVuIHBvd2VyKi8KKwkJcmV0ID0gYW1sX3NldF9ncGlvX291dChzcGlfZGV2LT5wd3JfcGluLCBBTUxfR1BJT19ISUdIKTsKKwkJfSBlbHNlIHsKKwkJCS8qbG93IGxldmVsICxjbG9zZSBwb3dlciovCisJCQlyZXQgPSBhbWxfc2V0X2dwaW9fb3V0KHNwaV9kZXYtPnB3cl9waW4sIEFNTF9HUElPX0xPVyk7CisJCX0KKwl9IGVsc2UgaWYgKHNwaV9kZXYtPmlvX2RldmljZV90eXBlID09IEFNTF9EVkJfSU9fVFlQRV9TUElfVDMxMikgeworCQkvL25vIG5lZWQgcG93ZXIgY2FtLHdlIHBvd2VyIGNhbSBjYXJkIG9uIE1DVS4KKwkJYW1sX2NpX3Bvd2VyX2J5X3NwaSgoc3RydWN0IGFtbF9jaSAqKXNwaV9kZXYtPnByaXYsIDAsIGVuYWJsZSk7CisJfSBlbHNlIHsKKwkJcHJfZGJnKCJhbWxfZ2lvX3Bvd2VyIHR5cGUgWyVkXSBlbmFibGU6ICVkXHJcbiIsIHNwaV9kZXYtPmlvX2RldmljZV90eXBlLCBlbmFibGUpOworCX0KKwlyZXR1cm4gcmV0OworfQorLyoqXGJyaWVmIGFtbF9naW9fcmVzZXQ6c2V0IHJlc2V0IGdwaW8gaGkgb3IgbG93CisqIFxwYXJhbSBwYzogYW1sX3BjbWNpYSBvYmosdXNlZCB0aGlzIHByaXYgdG8gZ2V0IHNwaV9kZXYgb2JqCisqIFxwYXJhbSBlbmFibGU6IHJlc2V0IHBpbiBoaSBvciBsb3cKKyogXHJldHVybgorKiAgIC0gMAorKiAgIC0gLUVJTlZBTCA6IGVycm9yCisqLworc3RhdGljIGludCBhbWxfZ2lvX3Jlc2V0KHN0cnVjdCBhbWxfcGNtY2lhICpwYywgaW50IGVuYWJsZSkKK3sKKwkvKm5lZWQgc2V0IGhpIGFuZCBzbGVlcCBzZXQgbG93Ki8KKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYW1sX3NwaSAqc3BpX2RldiA9IHBjLT5wcml2OworCisJaWYgKHNwaV9kZXYgIT0gTlVMTCkKKwkJcHJfZGJnKCIlcyA6ICVkICBcclxuIiwgX19mdW5jX18sIGVuYWJsZSk7CisKKwlwcl9kYmcoIiVzIDogJWQgIHR5cGU6ICVkXHJcbiIsIF9fZnVuY19fLCBlbmFibGUsIHNwaV9kZXYtPmlvX2RldmljZV90eXBlKTsKKwlpZiAoc3BpX2Rldi0+aW9fZGV2aWNlX3R5cGUgPT0gQU1MX0RWQl9JT19UWVBFX1NQSSkgeworCQlpZiAoZW5hYmxlID09IEFNTF9MKQorCQkJcmV0ID0gYW1sX3NldF9ncGlvX291dChzcGlfZGV2LT5yZXNldF9waW4sIEFNTF9HUElPX0xPVyk7CisJCWVsc2UKKwkJCXJldCA9IGFtbF9zZXRfZ3Bpb19vdXQoc3BpX2Rldi0+cmVzZXRfcGluLCBBTUxfR1BJT19ISUdIKTsKKwl9IGVsc2UgaWYgKHNwaV9kZXYtPmlvX2RldmljZV90eXBlID09IEFNTF9EVkJfSU9fVFlQRV9TUElfVDMxMikgeworCQlpZiAoc3BpX2RldiA9PSBOVUxMIHx8IHNwaV9kZXYtPnByaXYgPT0gTlVMTCkgeworCQkJcHJfZGJnKCJyc3QgYnkgc3BpLXNwaWRldi1udWxsLVxyXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlhbWxfY2lfcnN0X2J5X3NwaSgoc3RydWN0IGFtbF9jaSAqKXNwaV9kZXYtPnByaXYsIDAsIGVuYWJsZSk7CisJfSBlbHNlIHsKKwkJcHJfZGJnKCJhbWxfZ2lvX3Bvd2VyIHR5cGUgWyVkXSBlbmFibGU6ICVkXHJcbiIsIHNwaV9kZXYtPmlvX2RldmljZV90eXBlLCBlbmFibGUpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKipcYnJpZWYgYW1sX2dpb19pbml0X2lycTpzZXQgZ3BpbyBpcnEKKyogXHBhcmFtIHBjOiBhbWxfcGNtY2lhIG9iaix1c2VkIHRoaXMgcHJpdiB0byBnZXQgc3BpX2RldiBvYmoKKyogXHBhcmFtIGZsYWc6IHJpc2luZyBvciBmYWxsaW5nIG9yIGhpIG9yIGxvdworKiBccmV0dXJuCisqICAgLSAwCisqICAgLSAtRUlOVkFMIDogZXJyb3IKKyovCisvKm5lZWQgY2hhbmdlKi8KK3N0YXRpYyBpbnQgYW1sX2dpb19pbml0X2lycShzdHJ1Y3QgYW1sX3BjbWNpYSAqcGMsIGludCBmbGFnKQoreworCQlzdHJ1Y3QgYW1sX3NwaSAqc3BpX2RldiA9IChzdHJ1Y3QgYW1sX3NwaSAqKXBjLT5wcml2OworCisjaWYgMAorCQlpbnQgY2QxX3BpbiA9IGRlc2NfdG9fZ3BpbyhzcGlfZGV2LT5jZF9waW4xKTsKKworCQlpbnQgaXJxID0gcGMtPmlycS1BTUxfQ0lfR1BJT19JUlFfQkFTRTsKKworCQlwcmludGsoIi0tLS1jZDFfcGluPSVkIGlycT0lZFxyXG4iLCBjZDFfcGluLCBpcnEpOworCQlhbWxfc2V0X2dwaW9faW4oc3BpX2Rldi0+Y2RfcGluMSk7CisKKwkJaWYgKGZsYWcgPT0gSVJRRl9UUklHR0VSX1JJU0lORykKKwkJCWdwaW9fZm9yX2lycShjZDFfcGluLAorCQkJCUFNTF9HUElPX0lSUShpcnEsIEZJTFRFUl9OVU03LCBHUElPX0lSUV9SSVNJTkcpKTsKKwkJZWxzZSBpZiAoZmxhZyA9PSBJUlFGX1RSSUdHRVJfRkFMTElORykKKwkJCWdwaW9fZm9yX2lycShjZDFfcGluLAorCQkJCUFNTF9HUElPX0lSUShpcnEsIEZJTFRFUl9OVU03LCBHUElPX0lSUV9GQUxMSU5HKSk7CisJCWVsc2UgaWYgKGZsYWcgPT0gSVJRRl9UUklHR0VSX0hJR0gpCisJCQlncGlvX2Zvcl9pcnEoY2QxX3BpbiwKKwkJCQlBTUxfR1BJT19JUlEoaXJxLCBGSUxURVJfTlVNNywgR1BJT19JUlFfSElHSCkpOworCQllbHNlIGlmIChmbGFnID09IElSUUZfVFJJR0dFUl9MT1cpCisJCQlncGlvX2Zvcl9pcnEoY2QxX3BpbiwKKwkJCQlBTUxfR1BJT19JUlEoaXJxLCBGSUxURVJfTlVNNywgR1BJT19JUlFfTE9XKSk7CisJCWVsc2UKKwkJCXJldHVybiAtMTsKKyNlbmRpZgorCWlmIChzcGlfZGV2LT5pb19kZXZpY2VfdHlwZSA9PSBBTUxfRFZCX0lPX1RZUEVfU1BJKSB7CisJCWdwaW9kX3RvX2lycShzcGlfZGV2LT5jZF9waW4xKTsKKwl9IGVsc2UgaWYgKHNwaV9kZXYtPmlvX2RldmljZV90eXBlID09IEFNTF9EVkJfSU9fVFlQRV9TUElfVDMxMikgeworCQlncGlvZF90b19pcnEoc3BpX2Rldi0+bWN1X2lycV9waW4pOworCX0gZWxzZSB7CisJCXByX2RiZygiYW1sX2dpb19pbml0X2lycSB0eXBlIFslZF0gXHJcbiIsIHNwaV9kZXYtPmlvX2RldmljZV90eXBlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKlxicmllZiBhbWxfZ2lvX2dldF9jZDE6Z2V0IGdwaW8gY2QxIHBpbiB2YWx1ZQorKiBccGFyYW0gcGM6IGFtbF9wY21jaWEgb2JqLHVzZWQgdGhpcyBwcml2IHRvIGdldCBzcGlfZGV2IG9iagorKiBccmV0dXJuCisqICAgLSBjZDEgcGluIHZhbHVlCisqICAgLSAtRUlOVkFMIDogZXJyb3IKKyovCitzdGF0aWMgaW50IGFtbF9naW9fZ2V0X2NkMShzdHJ1Y3QgYW1sX3BjbWNpYSAqcGMpCit7CisJaW50IHJldCA9IDE7CisJc3RydWN0IGFtbF9zcGkgKnNwaV9kZXYgPSBwYy0+cHJpdjsKKwlpZiAoc3BpX2Rldi0+aW9fZGV2aWNlX3R5cGUgPT0gQU1MX0RWQl9JT19UWVBFX1NQSSkgeworCQlyZXQgPSBhbWxfZ2V0X2dwaW9fdmFsdWUoc3BpX2Rldi0+Y2RfcGluMSk7CisJfSBlbHNlIGlmIChzcGlfZGV2LT5pb19kZXZpY2VfdHlwZSA9PSBBTUxfRFZCX0lPX1RZUEVfU1BJX1QzMTIpIHsKKwkJcmV0ID0gYW1sX2NpX2dldGNkMTJfYnlfc3BpKChzdHJ1Y3QgYW1sX2NpICopc3BpX2Rldi0+cHJpdiwgMCwgMCk7CisJfSBlbHNlIHsKKwkJcHJfZGJnKCJhbWxfZ2lvX2dldF9jZDEgbm90IHN1cnBvcnQgdHlwZSBbJWRdIFxyXG4iLCBzcGlfZGV2LT5pb19kZXZpY2VfdHlwZSk7CisJfQorCXJldHVybiByZXQ7Cit9CisvKipcYnJpZWYgYW1sX2dpb19nZXRfY2QyOmdldCBncGlvIGNkMiBwaW4gdmFsdWUKKyogXHBhcmFtIHBjOiBhbWxfcGNtY2lhIG9iaix1c2VkIHRoaXMgcHJpdiB0byBnZXQgc3BpX2RldiBvYmoKKyogXHJldHVybgorKiAgIC0gY2QyIHBpbiB2YWx1ZQorKiAgIC0gLUVJTlZBTCA6IGVycm9yCisqLworc3RhdGljIGludCBhbWxfZ2lvX2dldF9jZDIoc3RydWN0IGFtbF9wY21jaWEgKnBjKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhbWxfc3BpICpzcGlfZGV2ID0gcGMtPnByaXY7CisJaWYgKHNwaV9kZXYtPmlvX2RldmljZV90eXBlID09IEFNTF9EVkJfSU9fVFlQRV9TUEkpIHsKKwkJcmV0ID0gYW1sX2dldF9ncGlvX3ZhbHVlKHNwaV9kZXYtPmNkX3BpbjIpOworCX0gZWxzZSBpZiAoc3BpX2Rldi0+aW9fZGV2aWNlX3R5cGUgPT0gQU1MX0RWQl9JT19UWVBFX1NQSV9UMzEyKSB7CisJCXJldCA9IGFtbF9jaV9nZXRjZDEyX2J5X3NwaSgoc3RydWN0IGFtbF9jaSAqKXNwaV9kZXYtPnByaXYsIDAsIDEpOworCX0gZWxzZSB7CisJCXByX2RiZygiYW1sX2dpb19nZXRfY2QyIG5vdCBzdXJwb3J0IHR5cGUgWyVkXSBcclxuIiwgc3BpX2Rldi0+aW9fZGV2aWNlX3R5cGUpOworCX0KKwlyZXR1cm4gcmV0OworfQorLyoqXGJyaWVmIGFtbF9jYW1fcGx1Z2luOm5vdGlmeSBlbjUwMjIxIGNhbSBjYXJkIGluIG9yIG91dAorKiBccGFyYW0gcGM6IGFtbF9wY21jaWEgb2JqLHVzZWQgdGhpcyBwcml2IHRvIGdldCBzcGlfZGV2IG9iagorKiBccGx1Z2luOiAwOnJlbW92ZTsxOmluCisqIFxyZXR1cm4KKyogICAtIDAKKyogICAtIC1FSU5WQUwgOiBlcnJvcgorKi8KK3N0YXRpYyBpbnQgYW1sX2NhbV9wbHVnaW4oc3RydWN0IGFtbF9wY21jaWEgKnBjLCBpbnQgcGx1Z2luKQoreworCXN0cnVjdCBhbWxfY2kgKmNpID0gKHN0cnVjdCBhbWxfY2kgKikKKwkoKHN0cnVjdCBhbWxfc3BpICopKHBjLT5wcml2KSktPnByaXY7CisJcHJfZGJnKCIlcyA6ICVkXHJcbiIsIF9fZnVuY19fLCBwbHVnaW4pOworCWlmIChwbHVnaW4pIHsKKwkJZHZiX2NhX2VuNTAyMjFfY2ltY3VfY2FtY2hhbmdlX2lycSgmY2ktPmVuNTAyMjFfY2ltY3UsCisJCQkwLCBEVkJfQ0FfRU41MDIyMV9DQU1DSEFOR0VfSU5TRVJURUQpOworCX0gZWxzZSB7CisJCWR2Yl9jYV9lbjUwMjIxX2NpbWN1X2NhbWNoYW5nZV9pcnEoJmNpLT5lbjUwMjIxX2NpbWN1LAorCQkJMCwgRFZCX0NBX0VONTAyMjFfQ0FNQ0hBTkdFX1JFTU9WRUQpOworCX0KKwlyZXR1cm4gMDsKK30KKy8qKlxicmllZiBhbWxfcGNtY2lhX2FsbG9jOmFsbG9jIG5hZCBpbml0IHBjbWNpYSBvYmoKKyogXHBhcmFtIHNwaV9kZXY6IGFtbF9zcGkgb2JqLAorKiBccGFyYW0gcGNtY2lhOiBhbWxfcGNtY2lhICogb2JqLAorKiBccmV0dXJuCisqICAgLSAwCisqICAgLSAtRUlOVkFMIDogZXJyb3IKKyovCitzdGF0aWMgdm9pZCBhbWxfcGNtY2lhX2FsbG9jKHN0cnVjdCBhbWxfc3BpICpzcGlfZGV2LAorCXN0cnVjdCBhbWxfcGNtY2lhICoqcGNtY2lhKQoreworCXByX2RiZygiYW1sX3BjbWNpYV9hbGxvYy0tLS1cbiIpOworCSpwY21jaWEgPSAmc3BpX2Rldi0+cGM7CisJKCpwY21jaWEpLT5pcnEgPSBzcGlfZGV2LT5pcnE7CisJKCpwY21jaWEpLT5pbml0X2lycSA9IGFtbF9naW9faW5pdF9pcnE7CisJKCpwY21jaWEpLT5nZXRfY2QxID0gYW1sX2dpb19nZXRfY2QxOworCSgqcGNtY2lhKS0+Z2V0X2NkMiA9IGFtbF9naW9fZ2V0X2NkMjsKKwkoKnBjbWNpYSktPnB3ciA9IGFtbF9naW9fcG93ZXI7CisJKCpwY21jaWEpLT5yc3QgPSBhbWxfZ2lvX3Jlc2V0OworCSgqcGNtY2lhKS0+cGNtY2lhX3BsdWdpbiA9IGFtbF9jYW1fcGx1Z2luOworCSgqcGNtY2lhKS0+c2xvdF9zdGF0ZSA9IE1PRFVMRV9YVFJBQ1RFRDsKKwkoKnBjbWNpYSktPnByaXYgPSBzcGlfZGV2OworCSgqcGNtY2lhKS0+cnVuX3R5cGUgPSAwOy8qMDppcnE7MTpwb2xsKi8KKwkoKnBjbWNpYSktPmlvX2RldmljZV90eXBlID0gQU1MX0RWQl9JT19UWVBFX0NJTUFYOworfQorCisvKipcYnJpZWYgYW1sX3NwaV9nZXRfY29uZmlnX2Zyb21fZHRzOmdldCBzcGkgY29uZmlnIGFuZCBncGlvIGNvbmZpZyBmcm9tIGR0cworKiBccGFyYW0gc3BpX2RldjogYW1sX3NwaSBvYmosCisqIFxyZXR1cm4KKyogICAtIDAKKyogICAtIC1FSU5WQUwgOiBlcnJvcgorKi8KK3N0YXRpYyBpbnQgYW1sX3NwaV9nZXRfY29uZmlnX2Zyb21fZHRzKHN0cnVjdCBhbWxfc3BpICpzcGlfZGV2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQgPSBOVUxMOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSBzcGlfZGV2LT5wZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwl1bnNpZ25lZCBpbnQgdGVtcFs1XSwgdmFsOworCWludCByZXQgPSAwOworCXByX2RiZygiaW50byBnZXQgc3BpIGR0cyBcclxuIik7CisKKwkvKmdldCBzcGkgYW5kIGdwaW8gY29uZmlnIGZyb20gZHRzKi8KKwkvKiBnZXQgZGV2aWNlIGNvbmZpZyBmb3IgZHZiY2lfaW8qLworCWNoaWxkID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUobnAsICJkdmJjaV9pbyIpOworCWlmIChjaGlsZCA9PSBOVUxMKSB7CisJCXByX2Vycm9yKCJmYWlsZWQgdG8gZ2V0IGR2YmNpX2lvXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzcGlfZGV2LT5zcGlfYmRpbmZvID0gJmFtbF9jaV9zcGlfYmRpbmZvOworCS8qIGdldCBzcGkgY29uZmlnICovCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkoY2hpbGQsICJzcGlfYnVzX251bSIsIHRlbXAsIDEpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyb3IoImZhaWxlZCB0byBnZXQgc3BpX2J1c19udW1cbiIpOworCX0gZWxzZSB7CisJCWFtbF9jaV9zcGlfYmRpbmZvLmJ1c19udW0gPSB0ZW1wWzBdOworCQlwcl9kYmcoImJ1c19udW06ICVkXG4iLCBhbWxfY2lfc3BpX2JkaW5mby5idXNfbnVtKTsKKwl9CisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkoY2hpbGQsICJzcGlfY2hpcF9zZWxlY3QiLAorCXRlbXAsIDEpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyb3IoImZhaWxlZCB0byBnZXQgc3BpX2NoaXBfc2VsZWN0XG4iKTsKKwl9IGVsc2UgeworCQlhbWxfY2lfc3BpX2JkaW5mby5jaGlwX3NlbGVjdCA9IHRlbXBbMF07CisJCXByX2RiZygiY2hpcF9zZWxlY3Q6ICVkXG4iLCBhbWxfY2lfc3BpX2JkaW5mby5jaGlwX3NlbGVjdCk7CisJfQorCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KGNoaWxkLCAic3BpX21heF9mcmVxdWVuY3kiLAorCXRlbXAsIDEpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyb3IoImZhaWxlZCB0byBnZXQgc3BpX2NoaXBfc2VsZWN0XG4iKTsKKwl9IGVsc2UgeworCQlhbWxfY2lfc3BpX2JkaW5mby5tYXhfc3BlZWRfaHogPSB0ZW1wWzBdOworCQlwcl9kYmcoIm1heF9zcGVlZF9oejogJWRcbiIsIGFtbF9jaV9zcGlfYmRpbmZvLm1heF9zcGVlZF9oeik7CisJfQorCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KGNoaWxkLCAic3BpX21vZGUiLCB0ZW1wLCAxKTsKKwlpZiAocmV0KSB7CisJCXByX2Vycm9yKCJmYWlsZWQgdG8gZ2V0IHNwaV9tb2RlXG4iKTsKKwl9IGVsc2UgeworCQlhbWxfY2lfc3BpX2JkaW5mby5tb2RlID0gdGVtcFswXTsKKwkJcHJfZGJnKCJtb2RlOiAlZFxuIiwgYW1sX2NpX3NwaV9iZGluZm8ubW9kZSk7CisJfQorCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KGNoaWxkLCAic3BpX2NzX2RlbGF5IiwKKwkmdGVtcFswXSwgMik7CisJaWYgKHJldCkgeworCQlzcGlfZGV2LT5jc19ob2xkX2RlbGF5ID0gMDsKKwkJc3BpX2Rldi0+Y3NfY2xrX2RlbGF5ID0gMDsKKwl9IGVsc2UgeworCQlzcGlfZGV2LT5jc19ob2xkX2RlbGF5ID0gdGVtcFswXTsKKwkJc3BpX2Rldi0+Y3NfY2xrX2RlbGF5ID0gdGVtcFsxXTsKKwl9CisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoY2hpbGQsICJzcGlfd3JpdGVfY2hlY2siLCAmdmFsKTsKKwlpZiAocmV0KQorCQlzcGlfZGV2LT53cml0ZV9jaGVjayA9IDA7CisJZWxzZQorCQlzcGlfZGV2LT53cml0ZV9jaGVjayA9ICh1bnNpZ25lZCBjaGFyKXZhbDsKKworCS8vYmVsb3cgaXMgZ2V0IGNkMSBjZDIgcHdyIGlycSByZXNldCBncGlvIGluZm8KKwlpZiAoc3BpX2Rldi0+aW9fZGV2aWNlX3R5cGUgPT0gQU1MX0RWQl9JT19UWVBFX1NQSSkgeworCQkvKmdldCAgY2QxIGlycSBudW0qLworCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihjaGlsZCwgImlycV9jZDEiLCAmdmFsKTsKKwkJaWYgKHJldCkgeworCQkJc3BpX2Rldi0+aXJxID0gNTsKKwkJfSBlbHNlIHsKKwkJCS8qc2V0IGlycSB2YWx1ZSBuZWVkIGFkZAorCQkJQU1MX0NJX0dQSU9fSVJRX0JBU0UsYnV0CisJCQl3ZSBuZWVkIG1pbnVzCisJCQlBTUxfQ0lfR1BJT19JUlFfQkFTRQorCQkJd2hlbiBncGlvIHJlcXVlc3QgaXJxICovCisJCQlzcGlfZGV2LT5pcnEgPSB2YWwrQU1MX0NJX0dQSU9fSVJRX0JBU0U7CisJCX0KKworCQlzcGlfZGV2LT5pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcCgKKwkJcGRldi0+ZGV2Lm9mX25vZGUsIDApOworCQlBTUxfQ0lfR1BJT19JUlFfQkFTRSA9IHNwaV9kZXYtPmlycSAtIHZhbDsKKwkJcHJfZGJnKCJnZXQgc3BpIGlycSA6ICVkIFVTRURCQVNFOiVkIHZhbDolZFxyXG4iLAorCQkJc3BpX2Rldi0+aXJxLCBBTUxfQ0lfR1BJT19JUlFfQkFTRSwgdmFsKTsKKwkJLypnZXQgcmVzZXQgcHdkIGNkMSBjZDIgZ3BpbyBwaW4qLworCQlzcGlfZGV2LT5yZXNldF9waW4gPSBOVUxMOworCQlyZXQgPSBzcGlfZ2V0X2dwaW9fYnlfbmFtZShzcGlfZGV2LCAmc3BpX2Rldi0+cmVzZXRfcGluLAorCQkmc3BpX2Rldi0+cmVzZXRfcGluX3ZhbHVlLCAicmVzZXRfcGluIiwKKwkJT1VUUFVULCBPVVRMRVZFTF9ISUdIKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyb3IoImR2YiBjaSByZXNldCBwaW4gcmVxdWVzdCBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXNwaV9kZXYtPmNkX3BpbjEgPSBOVUxMOworCQlyZXQgPSBzcGlfZ2V0X2dwaW9fYnlfbmFtZShzcGlfZGV2LAorCQkJJnNwaV9kZXYtPmNkX3BpbjEsCisJCQkmc3BpX2Rldi0+Y2RfcGluMV92YWx1ZSwgImNkX3BpbjEiLAorCQkJSU5QVVQsIE9VVExFVkVMX0hJR0gpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnJvcigiZHZiIGNpIGNkX3BpbjEgcGluIHJlcXVlc3QgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlzcGlfZGV2LT5jZF9waW4yID0gc3BpX2Rldi0+Y2RfcGluMTsKKwkJc3BpX2Rldi0+Y2RfcGluMl92YWx1ZSA9IHNwaV9kZXYtPmNkX3BpbjFfdmFsdWU7CisJCXNwaV9kZXYtPnB3cl9waW4gPSBOVUxMOworCQlwcl9kYmcoInNwaV9kZXYtPmNkX3BpbjFfdmFsdWU9PSVkXHJcbiIsIHNwaV9kZXYtPmNkX3BpbjFfdmFsdWUpOworCQlyZXQgPSBzcGlfZ2V0X2dwaW9fYnlfbmFtZShzcGlfZGV2LAorCQkJJnNwaV9kZXYtPnB3cl9waW4sICZzcGlfZGV2LT5wd3JfcGluX3ZhbHVlLAorCQkJInB3cl9waW4iLCBPVVRQVVQsIE9VVExFVkVMX0hJR0gpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnJvcigiZHZiIGNpIHB3cl9waW4gcGluIHJlcXVlc3QgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlzcGlfZGV2LT5pcnFfY2FtX3BpbiA9IE5VTEw7CisJCXJldCA9IHNwaV9nZXRfZ3Bpb19ieV9uYW1lKHNwaV9kZXYsCisJCQkmc3BpX2Rldi0+aXJxX2NhbV9waW4sICZzcGlfZGV2LT5pcnFfY2FtX3Bpbl92YWx1ZSwKKwkJCSJpcnFfY2FtX3BpbiIsIElOUFVULCBPVVRMRVZFTF9ISUdIKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyb3IoImR2YmNpICBpcnFfY2FtX3BpbiBwaW4gcmVxdWVzdCBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfSBlbHNlIGlmIChzcGlfZGV2LT5pb19kZXZpY2VfdHlwZSA9PSBBTUxfRFZCX0lPX1RZUEVfU1BJX1QzMTIpIHsKKwkJLy9nZXQgbWN1IGlycSBncGlvCisJCXNwaV9kZXYtPm1jdV9pcnFfcGluID0gTlVMTDsKKwkJcmV0ID0gc3BpX2dldF9ncGlvX2J5X25hbWUoc3BpX2RldiwKKwkJCSZzcGlfZGV2LT5tY3VfaXJxX3BpbiwKKwkJCSZzcGlfZGV2LT5tY3VfaXJxX3Bpbl92YWx1ZSwgIm1jdV9pcnFfcGluIiwKKwkJCUlOUFVULCBPVVRMRVZFTF9ISUdIKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyb3IoImR2YiBjaSBtY3VfaXJxX3BpbiBwaW4gcmVxdWVzdCBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXNwaV9kZXYtPmlycSA9IGdwaW9kX3RvX2lycShzcGlfZGV2LT5tY3VfaXJxX3BpbikgOworCX0gZWxzZSB7CisJCXByX2Vycm9yKCJkdmJjaSAgaW8gZGV2aWNlIHR5cGUgZXJyb3IgWyVkXVxuIiwgc3BpX2Rldi0+aW9fZGV2aWNlX3R5cGUpOworCX0KKwlyZXR1cm4gMDsKK30KKy8qKlxicmllZiBhbWxfY2lfZnJlZV9ncGlvOmZyZWUgY2kgZ3BpbworKiBccGFyYW0gc3BpX2RldjogYW1sX3NwaSBvYmosCisqIFxyZXR1cm4KKyogICAtIDAKKyogICAtIC1FSU5WQUwgOiBlcnJvcgorKi8KK3N0YXRpYyB2b2lkIGFtbF9jaV9mcmVlX2dwaW8oc3RydWN0IGFtbF9zcGkgKnNwaV9kZXYpCit7CisJaWYgKHNwaV9kZXYgPT0gTlVMTCkgeworCQlwcl9lcnJvcigic3BpX2RldiBpcyBOVUxMLG5vIG5lZWQgZnJlZSBncGlvIHJlc1xyXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzcGlfZGV2LT5wd3JfcGluKSB7CisJCWFtbF9ncGlvX2ZyZWUoc3BpX2Rldi0+cHdyX3Bpbik7CisJCXNwaV9kZXYtPnB3cl9waW4gPSBOVUxMOworCX0KKwlpZiAoc3BpX2Rldi0+Y2RfcGluMSkgeworCQlhbWxfZ3Bpb19mcmVlKHNwaV9kZXYtPmNkX3BpbjEpOworCQlzcGlfZGV2LT5jZF9waW4xID0gTlVMTDsKKwkJc3BpX2Rldi0+Y2RfcGluMiA9IE5VTEw7CisJfQorCWlmIChzcGlfZGV2LT5yZXNldF9waW4pIHsKKwkJYW1sX2dwaW9fZnJlZShzcGlfZGV2LT5yZXNldF9waW4pOworCQlzcGlfZGV2LT5yZXNldF9waW4gPSBOVUxMOworCX0KKwlpZiAoc3BpX2Rldi0+aXJxX2NhbV9waW4pIHsKKwkJYW1sX2dwaW9fZnJlZShzcGlfZGV2LT5pcnFfY2FtX3Bpbik7CisJCXNwaV9kZXYtPmlycV9jYW1fcGluID0gTlVMTDsKKwl9CisJcmV0dXJuOworfQorCisKKy8qKlxicmllZiBjaV9zcGlfZGV2X3JlbW92ZTpzcGkgcHJvYmUgYXBpCisqIFxwYXJhbSBzcGk6IHNwaSBvYmosCisqIFxyZXR1cm4KKyogICAtIDAKKyogICAtIC1FSU5WQUwgOiBlcnJvcgorKi8KK3N0YXRpYyBpbnQgY2lfc3BpX2Rldl9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWludCByZXQ7CisJcHJfZGJnKCJzcGkgRGV2IHByb2JlLS1cclxuIik7CisJc3Bpbl9sb2NrKCYoZ19zcGlfZGV2LT5zcGlfbG9jaykpOworCWlmIChnX3NwaV9kZXYpCisJCWdfc3BpX2Rldi0+c3BpID0gc3BpOworCSBlbHNlCisJCXByX2RiZygic3BpIERldiBwcm9iZS1lcnJvci1cbiIpOworCXNwaS0+Yml0c19wZXJfd29yZCA9IDg7CisJcmV0ID0gc3BpX3NldHVwKHNwaSk7CisJaWYgKHJldCkKKwkJcHJfZGJnKCJzcGkgc2V0dXAgZmFpbGVkXG4iKTsKKwlzcGluX3VubG9jaygmKGdfc3BpX2Rldi0+c3BpX2xvY2spKTsKKwlyZXR1cm4gcmV0OworfQorLyoqXGJyaWVmIGNpX3NwaV9kZXZfcmVtb3ZlOnNwaSByZW1vdmUgYXBpCisqIFxwYXJhbSBzcGk6IHNwaSBvYmosCisqIFxyZXR1cm4KKyogICAtIDAKKyogICAtIC1FSU5WQUwgOiBlcnJvcgorKi8KK3N0YXRpYyBpbnQgY2lfc3BpX2Rldl9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlwcl9kYmcoInNwaSBEZXYgcmVtb3ZlLS1cbiIpOworCWlmIChnX3NwaV9kZXYpCisJCWdfc3BpX2Rldi0+c3BpID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgY2lfc3BpX2Rldl9kcml2ZXIgPSB7CisJLnByb2JlID0gY2lfc3BpX2Rldl9wcm9iZSwKKwkucmVtb3ZlID0gY2lfc3BpX2Rldl9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiY2lfc3BpX2RldiIsLypzZXQgc2FtZSB3aXRoIGJvYXJkIGluZm8gbW9kYWxpYXMqLworCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKy8qKlxicmllZiBhbWxfc3BpX2luaXQ6c3BpX2RldiBpbml0CisqIFxwYXJhbSBjaV9kZXY6IGFtbF9jaSBvYmosCisqIFxwYXJhbSBwZGV2OiBwbGF0Zm9ybV9kZXZpY2Ugb2JqLHVzZWQgdG8gZ2V0IGR0cyBpbmZvCisqIFxyZXR1cm4KKyogICAtIDAKKyogICAtIC1FSU5WQUwgOiBlcnJvcgorKi8KK2ludCBhbWxfc3BpX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IGFtbF9jaSAqY2lfZGV2KQoreworCXN0cnVjdCBhbWxfc3BpICpzcGlfZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgYW1sX3BjbWNpYSAqcGM7CisJaW50IHJlc3VsdDsKKworCXNwaV9kZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYW1sX3NwaSksIEdGUF9LRVJORUwpOworCWlmICghc3BpX2RldikgeworCQlwcl9lcnJvcigiT3V0IG9mIG1lbW9yeSEsIGV4aXRpbmcgLi5cbiIpOworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisJZ19zcGlfZGV2ID0gc3BpX2RldjsKKwlzcGlfZGV2LT5wZGV2ID0gcGRldjsKKwlzcGlfZGV2LT5wcml2ID0gY2lfZGV2OworCXNwaV9kZXYtPnNwaSA9IE5VTEw7CisJLyppbml0IGlvIGRldmljZSB0eXBlKi8KKwlzcGlfZGV2LT5pb19kZXZpY2VfdHlwZSA9IGNpX2Rldi0+aW9fdHlwZTsKKwlwcl9kYmcoIioqKioqKioqKnNwaSBEZXYgdHlwZSBbJWRdXG4iLCBjaV9kZXYtPmlvX3R5cGUpOworCS8qZ2V0IGNvbmZpZyBmcm9tIGR0cyovCisJYW1sX3NwaV9nZXRfY29uZmlnX2Zyb21fZHRzKHNwaV9kZXYpOworCisJLyppbml0IHNwaV9sb2NrKi8KKwlzcGluX2xvY2tfaW5pdCgmKHNwaV9kZXYtPnNwaV9sb2NrKSk7CisJLypyZWdpc3QgYXBpIGRldiovCisJcHJfZGJnKCIqKioqKioqKipzcGkgRGV2IHJlZ2lzdCoqKioqKioqKipcclxuIik7CisJLy9ub3Qgc3VwcG9ydCBtY3UgbW9kZSBvbiBrZXJuZWwgNS40CisJLy9yZXN1bHQgPSBkaXJzcGlfcmVnaXN0ZXJfYm9hcmRfaW5mbyhzcGlfZGV2LT5zcGlfYmRpbmZvLCAxKTsKKwlpZiAocmVzdWx0KSB7CisJCXByX2Vycm9yKCJyZWdpc3RlciBhbWxzcGlfZGV2IHNwaSBib2FyZGluZm8gZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsMTsKKwl9CisJcmVzdWx0ID0gc3BpX3JlZ2lzdGVyX2RyaXZlcigmY2lfc3BpX2Rldl9kcml2ZXIpOworCWlmIChyZXN1bHQpIHsKKwkJcHJfZXJyb3IoInJlZ2lzdGVyIGFtbHNwaV9kZXYgc3BpIGRyaXZlciBmYWlsZWRcbiIpOworCQlnb3RvIGZhaWwxOworCX0KKworCS8qaW5pdCBjaV9kZXYgdXNlZCBhcGkuKi8KKwljaV9kZXYtPmNpX21lbV9yZWFkICA9IGFtbF9jaV9tZW1fcmVhZF9ieV9zcGk7CisJY2lfZGV2LT5jaV9tZW1fd3JpdGUgPSBhbWxfY2lfbWVtX3dyaXRlX2J5X3NwaTsKKwljaV9kZXYtPmNpX2lvX3JlYWQgPSBhbWxfY2lfaW9fcmVhZF9ieV9zcGk7CisJY2lfZGV2LT5jaV9pb193cml0ZSA9IGFtbF9jaV9pb193cml0ZV9ieV9zcGk7CisJY2lfZGV2LT5jaV9zbG90X3Jlc2V0ID0gYW1sX2NpX3Nsb3RfcmVzZXQ7CisJY2lfZGV2LT5jaV9zbG90X3NodXRkb3duID0gYW1sX2NpX3Nsb3Rfc2h1dGRvd247CisJY2lfZGV2LT5jaV9zbG90X3RzX2VuYWJsZSA9IGFtbF9jaV90c19jb250cm9sOworCWNpX2Rldi0+Y2lfcG9sbF9zbG90X3N0YXR1cyA9IGFtbF9jaV9zbG90X3N0YXR1czsKKwljaV9kZXYtPmRhdGEgPSBzcGlfZGV2OworCisJYW1sX3BjbWNpYV9hbGxvYyhzcGlfZGV2LCAmcGMpOworCXBjLT5pb19kZXZpY2VfdHlwZSA9IHNwaV9kZXYtPmlvX2RldmljZV90eXBlOworCXJlc3VsdCA9IGFtbF9wY21jaWFfaW5pdChwYyk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJcHJfZXJyb3IoImFtbF9wY21jaWFfaW5pdCBmYWlsZWRcbiIpOworCQlnb3RvIGZhaWwyOworCX0KKwlyZXR1cm4gMDsKK2ZhaWwyOgorCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmY2lfc3BpX2Rldl9kcml2ZXIpOworZmFpbDE6CisJa2ZyZWUoc3BpX2Rldik7CisJc3BpX2RldiA9IE5VTEw7CitlcnI6CisJcmV0dXJuIC0xOworfQorRVhQT1JUX1NZTUJPTChhbWxfc3BpX2luaXQpOworLyoqXGJyaWVmIGFtbF9zcGlfZXhpdDpzcGkgZXhpdAorKiBccmV0dXJuCisqICAgLSAwCisqICAgLSAtRUlOVkFMIDogZXJyb3IKKyovCitpbnQgYW1sX3NwaV9leGl0KHN0cnVjdCBhbWxfY2kgKmNpKQoreworCS8qZXhpdCBwYyBjYXJkKi8KKwlhbWxfcGNtY2lhX2V4aXQoJmdfc3BpX2Rldi0+cGMpOworCS8qdW4gcmVnaXN0IHNwaSBkcml2ZXIqLworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmY2lfc3BpX2Rldl9kcml2ZXIpOworCS8qZnJlZSBncGlvKi8KKwlhbWxfY2lfZnJlZV9ncGlvKGdfc3BpX2Rldik7CisJLypmcmVlIHNwaSBkZXYqLworCWtmcmVlKGdfc3BpX2Rldik7CisJZ19zcGlfZGV2ID0gTlVMTDsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChhbWxfc3BpX2V4aXQpOworCisKKyNpZiAxCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKiAgICAgICAgZm9yIHNwaSB0ZXN0IGFwaSAgICAgICAgICAgICoqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qY2FtIGRpZmluZXMqLworI2RlZmluZSBEQQkweDgwCisjZGVmaW5lIEZSCTB4NDAKKyNkZWZpbmUgV0UJMHgwMgorI2RlZmluZSBSRQkweDAxCisKKyNkZWZpbmUgUlMJMHgwOAorI2RlZmluZSBTUgkweDA0CisjZGVmaW5lIFNXCTB4MDIKKyNkZWZpbmUgSEMJMHgwMQorI2RlZmluZSBEQVRBX1JFRwkgIDAKKyNkZWZpbmUgQ09NX1NUQV9SRUcJMQorI2RlZmluZSBTSVpFX1JFR19MCTIKKyNkZWZpbmUgU0laRV9SRUdfTQkzCitzdGF0aWMgdm9pZCBhbWxfc3BpX2NhX2Z1bGxfdGVzdChzdHJ1Y3QgYW1sX2NpICpjaV9kZXYpCit7CisJCXVuc2lnbmVkIGludCBCVUZfU0laRSA9IDA7CisJCXVuc2lnbmVkIGludCBpID0gMDsKKwkJdW5zaWduZWQgY2hhciBjYyA9IDA7CisJCXVuc2lnbmVkIGNoYXIgcmVnOworCQl1bnNpZ25lZCBpbnQgIGJzaXplID0gMDsKKwkJaW50IGNudCA9IDA7CisJCXVuc2lnbmVkIGNoYXIgYnVmWzEwXTsKKwkJaW50IGNvdW50ID0gMTAwMDsKKwkJbWRlbGF5KDEwMDApOworCQlwcl9kYmcoIlJFQUQgQ0lTIFNUQVJUXHJcbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgMjY3OyBpKyspIHsKKwkJCW1kZWxheSgxMDApOworCQkJY2MgPSBhbWxfY2lfbWVtX3JlYWRfYnlfc3BpKGNpX2RldiwgMCwgaSk7CisJCQlwcl9kYmcoIjB4JXggIiwgY2MpOworCQkJaWYgKChpICsgMSkgJSAxNiA9PSAwKQorCQkJCXByX2RiZygiIFxyXG4iKTsKKwkJfQorCQlwcl9kYmcoIlJFQUQgQ0lTIE9WRVJcclxuIik7CisJCW1kZWxheSgxMDAwKTsKKwkJcHJfZGJnKCJTVyByc3QgQ0FNLi4uXHJcbiIpOworCQlhbWxfY2lfaW9fd3JpdGVfYnlfc3BpKGNpX2RldiwgMCwgQ09NX1NUQV9SRUcsIFJTKTsKKwkJcHJfZGJnKCJTVyByc3Qgb3Zlci5cclxuIik7CisJCXByX2RiZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuIik7CisJCXByX2RiZygiVE8gZGVsYXkgMjAwMG1zXHJcbiIpOworCQltZGVsYXkoMjAwMCk7CisJCXByX2RiZygiXHJcbiIpOworCQlwcl9kYmcoIi0tLS0tLS0tLS0tLS0tY2xlYXIgcnMtLSEhIS1ZT1UgTVVTVCBDTEVBUiBSUyBCSVQtLW5vIHNsZWVwLS0tLS0tLS1cclxuIik7CisJCWFtbF9jaV9pb193cml0ZV9ieV9zcGkoY2lfZGV2LCAwLCBDT01fU1RBX1JFRywgMCk7CisJCXByX2RiZygiLS0tLS0tLS0tLS0tLS1zbGVlcC0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4iKTsKKwkJbWRlbGF5KDIwMDApOworCQlwcl9kYmcoIlRPIGNoZWNrIHN3LXJzdCBpcyBPS1xyXG4iKTsKKwkJcHJfZGJnKCJzdGFydCByZWFkIGZyIFxyXG4iKTsKKwkJaWYgKDEpIHsKKwkJCXVuc2lnbmVkIGNoYXIgcmVnOworCQkJdW5zaWduZWQgY2hhciByZWcxOworCQkJaW50IGNvdW50MSA9IDQwMDA7CisJCQl3aGlsZSAoMSkgeworCQkJCW1kZWxheSgyMCk7CisJCQkJY291bnQxLS07CisJCQkJcmVnMSA9IGFtbF9jaV9pb19yZWFkX2J5X3NwaSgKKwkJCQkJY2lfZGV2LCAwLCBDT01fU1RBX1JFRyk7CisJCQkJaWYgKEZSICE9IChGUiAmIHJlZzEpKSB7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXByX2RiZygiQ0FNIFJlc2V0IE9rXHJcbiIpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCX0KKwkJCXJlZyA9IGFtbF9jaV9pb19yZWFkX2J5X3NwaShjaV9kZXYsIDAsIENPTV9TVEFfUkVHKTsKKwkJCXByX2RiZygiU1RBX1JFRyA9IDB4JTIuMnhcclxuIiwgcmVnKTsKKwkJCWlmIChGUiAmIHJlZykgeworCQkJCXByX2RiZygiU1ctUlNUIGlzIE9LIVxyXG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJfZGJnKCJTVy1SU1QgaXMgRVJSIVxyXG4iKTsKKwkJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQorZW5kOgorCQlwcl9kYmcoIlRPIGNoZWNrIHN3LXJzdCBvdmVyLlxyXG4iKTsKKwkJcHJfZGJnKCJcclxuIik7CisJCXByX2RiZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuIik7CisJCXByX2RiZygiVE8gYnVmZmVyIHNpemUgbmVnb3RpYXRpb24gcHJvdG9jb2wuLi5cclxuIik7CisJCXByX2RiZygiR2V0IHdoaWNoIGJ1ZiBzaXplIENBTSBjYW4gc3VwcG9ydFxyXG4iKTsKKwkJYW1sX2NpX2lvX3dyaXRlX2J5X3NwaShjaV9kZXYsIDAsIENPTV9TVEFfUkVHLCBTUik7CisJCW1kZWxheSgxMDAwKTsKKwkJd2hpbGUgKDEpIHsKKworCQkJcmVnID0gYW1sX2NpX2lvX3JlYWRfYnlfc3BpKGNpX2RldiwgMCwgQ09NX1NUQV9SRUcpOworCQkJaWYgKChyZWcgJiBEQSkgPT0gREEpIHsKKwkJCQlwcl9kYmcoIkJ1ZmZlciBuZWdvdGlhdGUgc2l6ZSBkYXRlIGF2YWxpYmxlLlxyXG4iKTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJLypwcl9kYmcoIkJ1ZmZlciBuZWdvdGlhdGUKKwkJCQlzaXplIGRhdGUgTk9UIGF2YWxpYmxlXHJcbiIpOyovCisJCQkJY29udGludWU7CisJCQl9CisJCQltZGVsYXkoMTAwKTsKKwkJfQorCQljbnQgPSAoYW1sX2NpX2lvX3JlYWRfYnlfc3BpKGNpX2RldiwgMCwgU0laRV9SRUdfTCkpICsKKwkJKChhbWxfY2lfaW9fcmVhZF9ieV9zcGkoY2lfZGV2LCAwLCBTSVpFX1JFR19NKSkgKiAyNTYpOworCQlwcl9kYmcoIk1vdWRsZSBoYXZlIDwlZD4gQnl0ZXMgc2VuZCB0byBob3N0LlxyXG4iLCBjbnQpOworCQlpZiAoY250ICE9IDIpIHsKKwkJCXByX2RiZygiVGhlIEJ5dGVzIHdpbGwgYmUgdHggaXMgRVJSIVxyXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspCisJCQlidWZbaV0gPSBhbWxfY2lfaW9fcmVhZF9ieV9zcGkoY2lfZGV2LCAwLCBEQVRBX1JFRyk7CisKKwkJcmVnID0gYW1sX2NpX2lvX3JlYWRfYnlfc3BpKGNpX2RldiwgMCwgQ09NX1NUQV9SRUcpOworCQlpZiAoUkUgPT0gKFJFICYgcmVnKSkgeworCQkJcHJfZGJnKCIoMSlSZWFkIENBTSBidWYgc2l6ZSBFUlIhXHJcbiIpOworCQkJcmV0dXJuOworCQl9CisJCWFtbF9jaV9pb193cml0ZV9ieV9zcGkoY2lfZGV2LCAwLCAoQ09NX1NUQV9SRUcpLCAwKTsKKworCQltZGVsYXkoMTAwMCk7CisKKwkJd2hpbGUgKGNvdW50LS0pIHsKKwkJCXJlZyA9IGFtbF9jaV9pb19yZWFkX2J5X3NwaShjaV9kZXYsIDAsIENPTV9TVEFfUkVHKTsKKwkJCWlmIChGUiAhPSAoRlIgJiByZWcpKSB7CisJCQkJcHJfZGJnKCJDQU0gaXMgYnVzeSAyLCB3YWl0aW5nLi4uXHJcbiIpOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJCQlwcl9kYmcoIkNBTSBpcyBPSyAyLlxyXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZWcgPSBhbWxfY2lfaW9fcmVhZF9ieV9zcGkoY2lfZGV2LCAwLCBDT01fU1RBX1JFRyk7CisJCWlmIChGUiAhPSAoRlIgJiByZWcpKSB7CisJCQlwcl9kYmcoIigyKVJlYWQgQ0FNIGJ1ZiBzaXplIEVSUiEtXHJcbiIpOworCQkJcmV0dXJuOworCQl9CisJCWJzaXplID0gKGJ1ZlswXSAqIDI1NikgKyBidWZbMV07CisKKwkJcHJfZGJnKCJDQU0gY2FuIHN1cHBvcnQgYnVmIHNpemUgaXM6IDwlZD5CXHJcbiIsIGJzaXplKTsKKworCQlwcl9kYmcoIlRlbGwgQ0FNIHdoaWNoIHNpemUgYnVmIGlzIGJlIHVzZWRcclxuIik7CisJCXJlZyA9IGFtbF9jaV9pb19yZWFkX2J5X3NwaShjaV9kZXYsIDAsIENPTV9TVEFfUkVHKTsKKwkJaWYgKEZSICE9IChGUiAmIHJlZykpCisJCQlwcl9kYmcoIkNBTSBpcyBidXN5LCB3YWl0aW5nIGZyZWVcclxuIik7CisJCXdoaWxlICgxKSB7CisJCQlyZWcgPSBhbWxfY2lfaW9fcmVhZF9ieV9zcGkoY2lfZGV2LCAwLCBDT01fU1RBX1JFRyk7CisJCQlpZiAoRlIgIT0gKEZSICYgcmVnKSkgeworCQkJCXByX2RiZygiQ0FNIGlzIGJ1c3kgMywgd2FpdGluZ1xyXG4iKTsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJcHJfZGJnKCJDQU0gaXMgT0sgM1xyXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWJzaXplID0gYnNpemUgLSAwOworCQlCVUZfU0laRSA9IGJzaXplOworCQlwcl9kYmcoIldlIHdpbGwgdXNlIHRoaXMgIGJ1ZiBzaXplOiA8JWQ+QlxyXG4iLCBic2l6ZSk7CisJCWFtbF9jaV9pb193cml0ZV9ieV9zcGkoY2lfZGV2LCAwLCBDT01fU1RBX1JFRywgU1cpOworCQlyZWcgPSBhbWxfY2lfaW9fcmVhZF9ieV9zcGkoY2lfZGV2LCAwLCBDT01fU1RBX1JFRyk7CisJCWlmIChGUiAhPSAoRlIgJiByZWcpKQorCQkJcHJfZGJnKCJDQU0gaXMgYnVzeSwgd2FpdGluZ1xyXG4iKTsKKworCQl3aGlsZSAoMSkgeworCQkJcmVnID0gYW1sX2NpX2lvX3JlYWRfYnlfc3BpKGNpX2RldiwgMCwgQ09NX1NUQV9SRUcpOworCQkJaWYgKEZSICE9IChGUiAmIHJlZykpIHsKKwkJCQlwcl9kYmcoIkNBTSBpcyBidXN5IDQsIHdhaXRpbmdcclxuIik7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgeworCQkJCXByX2RiZygiQ0FNIGlzIE9LIDRcclxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLypTSE9VTEQgQ0hFQ0sgREEhISEhISovCisJCS8qUExTIEFERCBUSElTIENIRUNLIENPREU6Ki8KKwkJcHJfZGJnKCJQUklPUiB0byBjaGVjayBDQU0nUyBEQVxyXG4iKTsKKwkJcmVnID0gYW1sX2NpX2lvX3JlYWRfYnlfc3BpKGNpX2RldiwgMCwgQ09NX1NUQV9SRUcpOworCQlpZiAoKHJlZyAmIERBKSA9PSBEQSkgeworCQkJcHJfZGJnKCJDQU0gaGF2ZSBkYXRhIHNlbmQgdG8gSE9TVFxyXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisKKwkJYnVmWzBdID0gKHVuc2lnbmVkIGNoYXIpKChic2l6ZSA+PiA4KSAmIDB4ZmYpOworCQlidWZbMV0gPSAodW5zaWduZWQgY2hhcikoYnNpemUgJiAweGZmKTsKKworCQl3aGlsZSAoMSkgeworCQkJbWRlbGF5KDEwKTsKKwkJCWFtbF9jaV9pb193cml0ZV9ieV9zcGkoY2lfZGV2LAorCQkJMCwgQ09NX1NUQV9SRUcsIEhDIHwgU1cpOworCQkJbWRlbGF5KDEwMCk7CisJCQlyZWcgPSBhbWxfY2lfaW9fcmVhZF9ieV9zcGkoY2lfZGV2LAorCQkJCTAsIENPTV9TVEFfUkVHKTsKKwkJCWlmIChGUiAhPSAoRlIgJiByZWcpKSB7CisJCQkJcHJfZGJnKCJDQU0gaXMgYnVzeSA1LCB3YWl0aW5nXHJcbiIpOworCQkJCWFtbF9jaV9pb193cml0ZV9ieV9zcGkoY2lfZGV2LAorCQkJCQkwLCBDT01fU1RBX1JFRywgU1cpOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJCQlwcl9kYmcoIkNBTSBpcyBPSyA1XHJcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXByX2RiZygiPDI+IEJ5dGVzIHNlbmQgdG8gQ0FNXHJcbiIpOworCQlhbWxfY2lfaW9fd3JpdGVfYnlfc3BpKGNpX2RldiwgMCwgU0laRV9SRUdfTSwgMCk7CisJCWFtbF9jaV9pb193cml0ZV9ieV9zcGkoY2lfZGV2LCAwLCBTSVpFX1JFR19MLCAyKTsKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkJCWFtbF9jaV9pb193cml0ZV9ieV9zcGkoY2lfZGV2LCAwLCBEQVRBX1JFRywgYnVmW2ldKTsKKworCQlyZWcgPSBhbWxfY2lfaW9fcmVhZF9ieV9zcGkoY2lfZGV2LCAwLCBDT01fU1RBX1JFRyk7CisJCWlmIChXRSA9PSAoV0UgJiByZWcpKSB7CisJCQlwcl9kYmcoIldyaXRlIENBTSBFUlIhXHJcbiIpOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJYW1sX2NpX2lvX3dyaXRlX2J5X3NwaShjaV9kZXYsIDAsIENPTV9TVEFfUkVHLCBTVyk7CisJCQltZGVsYXkoMTAwKTsKKwkJCWFtbF9jaV9pb193cml0ZV9ieV9zcGkoY2lfZGV2LCAwLCBDT01fU1RBX1JFRywgMCk7CisJCQlwcl9kYmcoIkJ1ZmZlciBzaXplIG5lZ290aWF0aW9uIG92ZXIhXHJcbiIpOworCQkJcHJfZGJnKCJOT1csIEhPU1QgY2FuIGNvbW11bmljYXRlcyB3aXRoIENBTVxyXG4iKTsKKwkJCXByX2RiZygiTk9XLCBURVNUIEVORFxyXG4iKTsKKwkJfQorfQorCisvKioKKyogUmVhZCBhIHR1cGxlIGZyb20gYXR0cmlidXRlIG1lbW9yeS4KKyoKKyogQHBhcmFtIGNhIENBIGluc3RhbmNlLgorKiBAcGFyYW0gc2xvdCBTbG90IGlkLgorKiBAcGFyYW0gYWRkcmVzcyBBZGRyZXNzIHRvIHJlYWQgZnJvbS4gVXBkYXRlZC4KKyogQHBhcmFtIHR1cGxlVHlwZSBUdXBsZSBpZCBieXRlLiBVcGRhdGVkLgorKiBAcGFyYW0gdHVwbGVMZW5ndGggVHVwbGUgbGVuZ3RoLiBVcGRhdGVkLgorKiBAcGFyYW0gdHVwbGUgRGVzdCBidWZmZXIgZm9yIHR1cGxlIChtdXN0IGJlIDI1NiBieXRlcykuIFVwZGF0ZWQuCisqCisqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBub256ZXJvIG9uIGVycm9yLgorKi8KK3N0YXRpYyBpbnQgZHZiX2NhX2VuNTAyMjFfcmVhZF90dXBsZSgKK2ludCAqYWRkcmVzcywgaW50ICp0dXBsZVR5cGUsIGludCAqdHVwbGVMZW5ndGgsIHU4ICp0dXBsZSkKK3sKKwlpbnQgaTsKKwlpbnQgX3R1cGxlVHlwZTsKKwlpbnQgX3R1cGxlTGVuZ3RoOworCWludCBfYWRkcmVzcyA9ICphZGRyZXNzOworCisJLyogZ3JhYiB0aGUgbmV4dCB0dXBsZSBsZW5ndGggYW5kIHR5cGUgKi8KKwlfdHVwbGVUeXBlID0gYW1sX2NpX21lbV9yZWFkX2J5X3NwaSgoc3RydWN0IGFtbF9jaSAqKQorCQlnX3NwaV9kZXYtPnByaXYsIDAsIF9hZGRyZXNzKTsKKwlpZiAoX3R1cGxlVHlwZSA8IDApCisJCXJldHVybiBfdHVwbGVUeXBlOworCWlmIChfdHVwbGVUeXBlID09IDB4ZmYpIHsKKwkJcHJfZGJnKCJFTkQgT0YgQ0hBSU4gVFVQTEUgdHlwZToweCV4XG4iLCBfdHVwbGVUeXBlKTsKKwkJKmFkZHJlc3MgKz0gMjsKKwkJKnR1cGxlVHlwZSA9IF90dXBsZVR5cGU7CisJCSp0dXBsZUxlbmd0aCA9IDA7CisJCXJldHVybiAwOworCX0KKwlfdHVwbGVMZW5ndGggPSBhbWxfY2lfbWVtX3JlYWRfYnlfc3BpKChzdHJ1Y3QgYW1sX2NpICopCisJCWdfc3BpX2Rldi0+cHJpdiwgMCwgX2FkZHJlc3MgKyAyKTsKKwlpZiAoX3R1cGxlTGVuZ3RoIDwgMCkKKwkJcmV0dXJuIF90dXBsZUxlbmd0aDsKKwlfYWRkcmVzcyArPSA0OworCisJcHJfZGJnKCJUVVBMRSB0eXBlOjB4JXggbGVuZ3RoOiVpXG4iLCBfdHVwbGVUeXBlLCBfdHVwbGVMZW5ndGgpOworCisJLyogcmVhZCBpbiB0aGUgd2hvbGUgdHVwbGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgX3R1cGxlTGVuZ3RoOyBpKyspIHsKKwkJdHVwbGVbaV0gPSBhbWxfY2lfbWVtX3JlYWRfYnlfc3BpKChzdHJ1Y3QgYW1sX2NpICopCisJCQlnX3NwaV9kZXYtPnByaXYsIDAsIF9hZGRyZXNzICsgKGkgKiAyKSk7CisJCXByX2RiZygiICAweCUwMng6IDB4JTAyeCAlY1xuIiwKKwkJaSwgdHVwbGVbaV0gJiAweGZmLAorCQkoKHR1cGxlW2ldID4gMzEpICYmICh0dXBsZVtpXSA8IDEyNykpID8gdHVwbGVbaV0gOiAnLicpOworCX0KKwlfYWRkcmVzcyArPSAoX3R1cGxlTGVuZ3RoICogMik7CisKKwkvKiBzdWNjZXNzICovCisJKnR1cGxlVHlwZSA9IF90dXBsZVR5cGU7CisJKnR1cGxlTGVuZ3RoID0gX3R1cGxlTGVuZ3RoOworCSphZGRyZXNzID0gX2FkZHJlc3M7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgY2hhciAqZmluZHN0cihjaGFyICpoYXlzdGFjaywgaW50IGhsZW4sIGNoYXIgKm5lZWRsZSwgaW50IG5sZW4pCit7CisJaW50IGk7CisKKwlpZiAoaGxlbiA8IG5sZW4pCisJCXJldHVybiBOVUxMOworCisJZm9yIChpID0gMDsgaSA8PSBobGVuIC0gbmxlbjsgaSsrKSB7CisJCWlmICghc3RybmNtcChoYXlzdGFjayArIGksIG5lZWRsZSwgbmxlbikpCisJCQlyZXR1cm4gaGF5c3RhY2sgKyBpOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKioKKyogUGFyc2UgYXR0cmlidXRlIG1lbW9yeSBvZiBhIENBTSBtb2R1bGUsIGV4dHJhY3RpbmcgQ29uZmlnIHJlZ2lzdGVyLCBhbmQgY2hlY2tpbmcKKyogaXQgaXMgYSBEVkIgQ0FNIG1vZHVsZS4KKyoKKyogQHBhcmFtIGNhIENBIGluc3RhbmNlLgorKiBAcGFyYW0gc2xvdCBTbG90IGlkLgorKgorKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgPDAgb24gZmFpbHVyZS4KKyovCitzdGF0aWMgaW50IGR2Yl9jYV9lbjUwMjIxX3BhcnNlX2F0dHJpYnV0ZXModm9pZCkKK3sKKwlpbnQgYWRkcmVzcyA9IDA7CisJaW50IHR1cGxlTGVuZ3RoOworCWludCB0dXBsZVR5cGU7CisJdTggdHVwbGVbMjU3XTsKKwljaGFyICpkdmJfc3RyOworCWludCByYXN6OworCWludCBzdGF0dXM7CisJaW50IGdvdF9jZnRhYmxlZW50cnkgPSAwOworCWludCBlbmRfY2hhaW4gPSAwOworCWludCBpOworCXUxNiBtYW5maWQgPSAwOworCXUxNiBkZXZpZCA9IDA7CisJaW50IGNvbmZpZ19iYXNlID0gMDsKKwlpbnQgY29uZmlnX29wdGlvbjsKKworCS8qIENJU1RQTF9ERVZJQ0VfMEEgKi8KKwlzdGF0dXMgPSBkdmJfY2FfZW41MDIyMV9yZWFkX3R1cGxlKCZhZGRyZXNzLAorCSZ0dXBsZVR5cGUsICZ0dXBsZUxlbmd0aCwgdHVwbGUpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCXByX2Vycm9yKCJyZWFkIHN0YXR1cyBlcnJvclxyXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJaWYgKHR1cGxlVHlwZSAhPSAweDFEKSB7CisJCXByX2Vycm9yKCJyZWFkIHR1cGxlVHlwZSBlcnJvciBbMHgleF1cclxuIiwgdHVwbGVUeXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisKKworCS8qIENJU1RQTF9ERVZJQ0VfMEMgKi8KKwlzdGF0dXMgPSBkdmJfY2FfZW41MDIyMV9yZWFkX3R1cGxlKCZhZGRyZXNzLAorCSZ0dXBsZVR5cGUsICZ0dXBsZUxlbmd0aCwgdHVwbGUpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCXByX2Vycm9yKCJyZWFkIHJlYWQgY2lzICBlcnJvclxyXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJaWYgKHR1cGxlVHlwZSAhPSAweDFDKSB7CisJCXByX2Vycm9yKCJyZWFkIHJlYWQgY2lzIHR5cGUgZXJyb3JcclxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCisKKwkvKiBDSVNUUExfVkVSU18xICovCisJc3RhdHVzID0gZHZiX2NhX2VuNTAyMjFfcmVhZF90dXBsZSgmYWRkcmVzcywKKwkmdHVwbGVUeXBlLCAmdHVwbGVMZW5ndGgsIHR1cGxlKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlwcl9lcnJvcigicmVhZCByZWFkIGNpcyAgdmVyc2lvbiBlcnJvclxyXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJaWYgKHR1cGxlVHlwZSAhPSAweDE1KSB7CisJCXByX2Vycm9yKCJyZWFkIHJlYWQgY2lzIHZlcnNpb24gdHlwZSBlcnJvclxyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisKKworCS8qIENJU1RQTF9NQU5GSUQgKi8KKwlzdGF0dXMgPSBkdmJfY2FfZW41MDIyMV9yZWFkX3R1cGxlKCZhZGRyZXNzLCAmdHVwbGVUeXBlLAorCSZ0dXBsZUxlbmd0aCwgdHVwbGUpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCXByX2Vycm9yKCJyZWFkIHJlYWQgY2lzIG1hbmZpZCBlcnJvclxyXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJaWYgKHR1cGxlVHlwZSAhPSAweDIwKSB7CisJCXByX2Vycm9yKCJyZWFkIHJlYWQgY2lzIG1hbmZpZCB0eXBlIGVycm9yXHJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHR1cGxlTGVuZ3RoICE9IDQpIHsKKwkJcHJfZXJyb3IoInJlYWQgcmVhZCBjaXMgbWFuZmlkIGxlbiBlcnJvclxyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1hbmZpZCA9ICh0dXBsZVsxXSA8PCA4KSB8IHR1cGxlWzBdOworCWRldmlkID0gKHR1cGxlWzNdIDw8IDgpIHwgdHVwbGVbMl07CisKKworCisJLyogQ0lTVFBMX0NPTkZJRyAqLworCXN0YXR1cyA9IGR2Yl9jYV9lbjUwMjIxX3JlYWRfdHVwbGUoJmFkZHJlc3MsICZ0dXBsZVR5cGUsCisJJnR1cGxlTGVuZ3RoLCB0dXBsZSk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJcHJfZXJyb3IoInJlYWQgcmVhZCBjaXMgY29uZmlnIGVycm9yXHJcbiIpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwlpZiAodHVwbGVUeXBlICE9IDB4MUEpIHsKKwkJcHJfZXJyb3IoInJlYWQgcmVhZCBjaXMgY29uZmlnIHR5cGUgZXJyb3JcclxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAodHVwbGVMZW5ndGggPCAzKSB7CisJCXByX2Vycm9yKCJyZWFkIHJlYWQgY2lzIGNvbmZpZyBsZW4gZXJyb3JcclxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGV4dHJhY3QgdGhlIGNvbmZpZ2Jhc2UgKi8KKwlyYXN6ID0gdHVwbGVbMF0gJiAzOworCWlmICh0dXBsZUxlbmd0aCA8ICgzICsgcmFzeiArIDE0KSkgeworCQlwcl9lcnJvcigicmVhZCBleHRyYWN0IHRoZSBjb25maWdiYXNlICBlcnJvclxyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHJhc3ogKyAxOyBpKyspCisJCWNvbmZpZ19iYXNlIHw9ICh0dXBsZVsyICsgaV0gPDwgKDggKiBpKSk7CisKKworCS8qIGNoZWNrIGl0IGNvbnRhaW5zIHRoZSBjb3JyZWN0IERWQiBzdHJpbmcgKi8KKwlkdmJfc3RyID0gZmluZHN0cigoY2hhciAqKXR1cGxlLCB0dXBsZUxlbmd0aCwgIkRWQl9DSV9WIiwgOCk7CisJaWYgKGR2Yl9zdHIgPT0gTlVMTCkgeworCQlwcl9lcnJvcigiZmluZCBkdmIgc3RyIERWQl9DSV9WICBlcnJvclxyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICh0dXBsZUxlbmd0aCA8ICgoZHZiX3N0ciAtIChjaGFyICopIHR1cGxlKSArIDEyKSkgeworCQlwcl9lcnJvcigiZmluZCBkdmIgc3RyIERWQl9DSV9WIGxlbiBlcnJvclxyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogaXMgaXQgYSB2ZXJzaW9uIHdlIHN1cHBvcnQ/ICovCisJaWYgKHN0cm5jbXAoZHZiX3N0ciArIDgsICIxLjAwIiwgNCkpIHsKKwkJcHJfZXJyb3IoIiBVbnN1cHBvcnRlZCBEVkIgQ0FNIG1vZHVsZSB2ZXJzaW9uICVjJWMlYyVjXG4iLAorCQlkdmJfc3RyWzhdLCBkdmJfc3RyWzldLCBkdmJfc3RyWzEwXSwgZHZiX3N0clsxMV0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKy8qIHByb2Nlc3MgdGhlIENGVEFCTEVfRU5UUlkgdHVwbGVzLCBhbmQgYW55IGFmdGVyIHRob3NlICovCit3aGlsZSAoKCFlbmRfY2hhaW4pICYmIChhZGRyZXNzIDwgMHgxMDAwKSkgeworCQlzdGF0dXMgPSBkdmJfY2FfZW41MDIyMV9yZWFkX3R1cGxlKCZhZGRyZXNzLCAmdHVwbGVUeXBlLAorCSZ0dXBsZUxlbmd0aCwgdHVwbGUpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCXByX2Vycm9yKCJwcm9jZXNzIHRoZSBDRlRBQkxFX0VOVFJZIHR1cGxlcyBlcnJvclxyXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlzd2l0Y2ggKHR1cGxlVHlwZSkgeworCWNhc2UgMHgxQjoJLyogQ0lTVFBMX0NGVEFCTEVfRU5UUlkgKi8KKwkJCWlmICh0dXBsZUxlbmd0aCA8ICgyICsgMTEgKyAxNykpCisJCQkJYnJlYWs7CisKKwkJCS8qIGlmIHdlJ3ZlIGFscmVhZHkgcGFyc2VkIG9uZSwganVzdCB1c2UgaXQgKi8KKwkJCWlmIChnb3RfY2Z0YWJsZWVudHJ5KQorCQkJCWJyZWFrOworCisJCQkvKiBnZXQgdGhlIGNvbmZpZyBvcHRpb24gKi8KKwkJCWNvbmZpZ19vcHRpb24gPSB0dXBsZVswXSAmIDB4M2Y7CisKKwkJCS8qIE9LLCBjaGVjayBpdCBjb250YWlucyB0aGUgY29ycmVjdCBzdHJpbmdzICovCisJCQlpZiAoKGZpbmRzdHIoKGNoYXIgKil0dXBsZSwKKwkJCQl0dXBsZUxlbmd0aCwgIkRWQl9IT1NUIiwgOCkgPT0gTlVMTCkgfHwKKwkJCShmaW5kc3RyKChjaGFyICopdHVwbGUsCisJCQl0dXBsZUxlbmd0aCwgIkRWQl9DSV9NT0RVTEUiLCAxMykgPT0gTlVMTCkpCisJCQkJYnJlYWs7CisKKworCQkJZ290X2NmdGFibGVlbnRyeSA9IDE7CisJCQlicmVhazsKKworCWNhc2UgMHgxNDoJLyogQ0lTVFBMX05PX0xJTksqLworCQkJYnJlYWs7CisKKwljYXNlIDB4RkY6CS8qIENJU1RQTF9FTkQgKi8KKwkJCWVuZF9jaGFpbiA9IDE7CisJCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qIFVua25vd24gdHVwbGUgdHlwZSAtIGp1c3Qgc2tpcAorCQkqdGhpcyB0dXBsZSBhbmQgbW92ZSB0byB0aGUgbmV4dCBvbmUKKwkJKi8KK3ByX2Vycm9yKCJTa2lwcGluZyB1bmtub3duIHR1cGxldHlwZToweCV4IEw6MHgleFxuIiwKKwkJCQl0dXBsZVR5cGUsIHR1cGxlTGVuZ3RoKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKChhZGRyZXNzID4gMHgxMDAwKSB8fCAoIWdvdF9jZnRhYmxlZW50cnkpKSB7CisJCXByX2Vycm9yKCJnb3RfY2Z0YWJsZWVudHJ5IDolZFxyXG4iLCBnb3RfY2Z0YWJsZWVudHJ5KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJfZXJyb3IoIi0tLS0tLS0tLS1jaSBjaXMgb2stLS0tLVxyXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgcmVzZXRfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCByZXQ7CisJcmV0ID0gc3ByaW50ZihidWYsICJlY2hvIDEgPiAlc1xuXHQiLCBhdHRyLT5hdHRyLm5hbWUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJlc2V0X3N0b3JlKHN0cnVjdCBjbGFzcyAqY2xhc3MsCitzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCWludCByZXQ7CisJc3RydWN0IGFtbF9jaSAqY2kgPSAoc3RydWN0IGFtbF9jaSAqKWdfc3BpX2Rldi0+cHJpdjsKKwlyZXQgPSBhbWxfY2lfc2xvdF9yZXNldChjaSwgMCk7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHB3cl9zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCitzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IHJldDsKKwlyZXQgPSBzcHJpbnRmKGJ1ZiwgImVjaG8gMXwwPiAlc1xuXHQiLCBhdHRyLT5hdHRyLm5hbWUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHB3cl9zdG9yZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgZW5hYmxlID0gMDsKKwlsb25nIHZhbHVlOworCWlmIChrc3RydG9sKGJ1ZiwgMCwgJnZhbHVlKSA9PSAwKQorCQllbmFibGUgPSAoaW50KXZhbHVlOworCXJldCA9IGFtbF9naW9fcG93ZXIoJmdfc3BpX2Rldi0+cGMsIGVuYWJsZSk7CisJcmV0dXJuIHNpemU7Cit9CitzdGF0aWMgc3NpemVfdCBzdGF0dXNfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCByZXQ7CisJc3RydWN0IGFtbF9jaSAqY2kgPSAoc3RydWN0IGFtbF9jaSAqKWdfc3BpX2Rldi0+cHJpdjsKKwlyZXQgPSBhbWxfY2lfc2xvdF9zdGF0dXMoY2ksIDAsIDApOworCXJldCA9IHNwcmludGYoYnVmLCAiJXM6ICVkO1xuXHQiLCBhdHRyLT5hdHRyLm5hbWUsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgaXJxX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKK3N0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXJldCA9IGFtbF9jaV9naW9fZ2V0X2lycSgpOworCXJldCA9IHNwcmludGYoYnVmLCAiJXMgaXJxOiAlZFxuXHQiLCBhdHRyLT5hdHRyLm5hbWUsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgaW90ZXN0X3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKK3N0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXJldCA9IHNwcmludGYoYnVmLCAiZWNobyAocnx3fGZ8YykoaXxhKSBhZGRyIGRhdGEgPiAlc1xuIiwKKwlhdHRyLT5hdHRyLm5hbWUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGlvdGVzdF9zdG9yZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgbiA9IDA7CisJaW50IGkgPSAwOworCWNoYXIgKmJ1Zl9vcmlnLCAqcHMsICp0b2tlbjsKKwljaGFyICpwYXJtWzNdOworCXVuc2lnbmVkIGludCBhZGRyID0gMCwgdmFsID0gMCwgcmV0dmFsID0gMDsKKwlsb25nIHZhbHVlID0gMDsKKwlzdHJ1Y3QgYW1sX2NpICpjaSA9IChzdHJ1Y3QgYW1sX2NpICopZ19zcGlfZGV2LT5wcml2OworCWJ1Zl9vcmlnID0ga3N0cmR1cChidWYsIEdGUF9LRVJORUwpOworCXBzID0gYnVmX29yaWc7CisJd2hpbGUgKDEpIHsKKwkJLypuZWVkIHNldCAnXG4nIHRvICcgXG4nKi8KKwkJdG9rZW4gPSBzdHJzZXAoJnBzLCAiICIpOworCQlpZiAodG9rZW4gPT0gTlVMTCkKKwkJCWJyZWFrOworCQlpZiAoKnRva2VuID09ICdcMCcpCisJCQljb250aW51ZTsKKwkJcGFybVtuKytdID0gdG9rZW47CisJfQorCisJaWYgKCFuIHx8ICgobiA+IDApICYmIChzdHJsZW4ocGFybVswXSkgIT0gMikpKSB7CisJCXByX2VycigiaW52YWxpZCBjb21tYW5kIG5bJXhdcFsleF1bJXNdXG4iLCBuLChpbnQpc3RybGVuKHBhcm1bMF0pLHBhcm1bMF0pOworCQlrZnJlZShidWZfb3JpZyk7CisJCXJldHVybiBzaXplOworCX0KKworCWlmICgocGFybVswXVswXSA9PSAncicpKSB7CisJCWlmIChuID4gMikgeworCQkJcHJfZXJyKCJyZWFkOiBpbnZhbGlkIHBhcmFtZXRlclxuIik7CisJCQlrZnJlZShidWZfb3JpZyk7CisJCQlyZXR1cm4gc2l6ZTsKKwkJfQorCWlmIChrc3RydG9sKHBhcm1bMV0sIDAsICZ2YWx1ZSkgPT0gMCkKKwkJYWRkciA9IChpbnQpdmFsdWU7CisJCXByX2VycigiJXMgMHgleFxuIiwgcGFybVswXSwgYWRkcik7CisJCXN3aXRjaCAoKGNoYXIpcGFybVswXVsxXSkgeworCQkJY2FzZSAnaSc6CisJCQkJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykKKwkJCQkJcmV0dmFsID0gYW1sX2NpX2lvX3JlYWRfYnlfc3BpKGNpLCAwLCBhZGRyKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2EnOgorCQkJCWZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspCisJCQkJCXJldHZhbCA9IGFtbF9jaV9tZW1fcmVhZF9ieV9zcGkoY2ksIDAsIGFkZHIpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCQlwcl9kYmcoIiVzOiAweCV4IC0tPiAweCV4XG4iLCBwYXJtWzBdLCBhZGRyLCByZXR2YWwpOworCX0gZWxzZSBpZiAoKHBhcm1bMF1bMF0gPT0gJ3cnKSkgeworCQlpZiAobiAhPSAzKSB7CisJCQlwcl9lcnIoIndyaXRlOiBpbnZhbGlkIHBhcmFtZXRlclxuIik7CisJCQlrZnJlZShidWZfb3JpZyk7CisJCQlyZXR1cm4gc2l6ZTsKKwkJfQorCQlpZiAoa3N0cnRvbChwYXJtWzFdLCAwLCAmdmFsdWUpID09IDApCisJCQkJYWRkciA9IChpbnQpdmFsdWU7CisJCWlmIChrc3RydG9sKHBhcm1bMl0sIDAsICZ2YWx1ZSkgPT0gMCkKKwkJCQl2YWwgPSAoaW50KXZhbHVlOworCisJCXByX2VycigiJXMgMHgleCAweCV4IiwgcGFybVswXSwgYWRkciwgdmFsKTsKKwkJLypzd2l0Y2ggKChjaGFyKXBhcm1bMF1bMV0pIHsKKwkJCWNhc2UgJ2knOgorcmV0dmFsID0gYW1sX2NpX2lvX3dyaXRlX2J5X3NwaShjaSwgMCwgYWRkciwgdmFsKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2EnOgorcmV0dmFsID0gYW1sX2NpX21lbV93cml0ZV9ieV9zcGkoY2ksIDAsIGFkZHIsIHZhbCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9Ki8KKwkJcHJfZGJnKCIlczogMHgleCA8LS0gMHgleFxuIiwgcGFybVswXSwgYWRkciwgcmV0dmFsKTsKKwl9IGVsc2UgaWYgKChwYXJtWzBdWzBdID09ICdmJykpIHsKKwkJcHJfZGJnKCJmdWxsIHRlc3QtLS0tXHJcbiIpOworCQlhbWxfc3BpX2NhX2Z1bGxfdGVzdChjaSk7CisJfSBlbHNlIGlmICgocGFybVswXVswXSA9PSAnYycpKSB7CisJCXByX2RiZygiY2lzIHRlc3QtLS0tXHJcbiIpOworCQlhbWxfY2lfZnVsbF90ZXN0X2J5X3NwaShjaSwgMCwgYWRkcik7CisJfSBlbHNlIGlmICgocGFybVswXVswXSA9PSAncCcpKSB7CisJCXByX2RiZygiY2lzIGR2Yl9jYV9lbjUwMjIxX3BhcnNlX2F0dHJpYnV0ZXMtLS0tXHJcbiIpOworCQlkdmJfY2FfZW41MDIyMV9wYXJzZV9hdHRyaWJ1dGVzKCk7CisJfQorCisJa2ZyZWUoYnVmX29yaWcpOworCXJldHVybiBzaXplOworfQorc3RhdGljIENMQVNTX0FUVFJfUlcocmVzZXQpOworc3RhdGljIENMQVNTX0FUVFJfUlcocHdyKTsKK3N0YXRpYyBDTEFTU19BVFRSX1JPKGlycSk7CitzdGF0aWMgQ0xBU1NfQVRUUl9STyhzdGF0dXMpOworc3RhdGljIENMQVNTX0FUVFJfUlcoaW90ZXN0KTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFtbF9zcGlfY2xhc3NfYXR0cnNbXSA9IHsKKwkmY2xhc3NfYXR0cl9yZXNldC5hdHRyLAorCSZjbGFzc19hdHRyX3B3ci5hdHRyLAorCSZjbGFzc19hdHRyX2lycS5hdHRyLAorCSZjbGFzc19hdHRyX3N0YXR1cy5hdHRyLAorCSZjbGFzc19hdHRyX2lvdGVzdC5hdHRyLAorCU5VTEwKK307CisKK0FUVFJJQlVURV9HUk9VUFMoYW1sX3NwaV9jbGFzcyk7CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgYW1sX3NwaV9jbGFzcyA9IHsKKwkubmFtZSA9ICJhbWxfZHZiX3NwaV90ZXN0IiwKKwkuY2xhc3NfZ3JvdXBzID0gYW1sX3NwaV9jbGFzc19ncm91cHMsCit9OworCisvKipcYnJpZWYgYW1sX2Nvbl9ncGlvX2J5X3NwaTpjb250cm9sIGdwaW8gYnkgc3BpCisqIFxwYXJhbSBncGlvOiB0aGUgdmFsdWUgaXMgZnJvbSBBTV9DT05fR1BJTyBkZWYKKyogXHBhcmFtIGxldmVsOiAwOiBzZXQgbG93LDE6c2V0IGhpZ2h0CisqIFxyZXR1cm4KKyogICAtIDA6b2sKKyogICAtIC1FSU5WQUwgOiBlcnJvcgorKi8KK2ludCBhbWxfY29uX2dwaW9fYnlfc3BpKGludCBncGlvLCBpbnQgbGV2ZWwpCit7CisJdTggIGRhdGEgPSBncGlvOworCXUxNiBhZGRyZXMgPSBsZXZlbDsKKwlpbnQgdmFsdWUgPSAwOworCXN0cnVjdCBhbWxfc3BpICpzcGlfZGV2ID0gZ19zcGlfZGV2OworCS8qYWRkIGJ5IGNobCxuZWVkIGFkZCB0aW1lIGRlbGF5Ki8KKwltZGVsYXkoMTApOworCWFtbF9pbml0X3NlbmRfYnVmKEFNX0NJX0NNRF9DT05HUElPLCBkYXRhLCBhZGRyZXMpOworCXZhbHVlID0gYW1sX3NwaV9pb19hcGkoc3BpX2Rldiwgc2VuZGJ1ZiwgU0VOREJVRkxFTiwgQU1fQ0lfQ01EX0NPTkdQSU8pOworCXJldHVybiB2YWx1ZTsKK30KK0VYUE9SVF9TWU1CT0woYW1sX2Nvbl9ncGlvX2J5X3NwaSk7CisKK2ludCAgYW1sX3NwaV9tb2RfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisJcHJfZGJnKCJBbWxvZ2ljIERWQiBTUEkgSW5pdFxuIik7CisJcmV0ID0gY2xhc3NfcmVnaXN0ZXIoJmFtbF9zcGlfY2xhc3MpOworCXJldHVybiAwOworfQorLy9FWFBPUlRfU1lNQk9MKGFtbF9zcGlfbW9kX2luaXQpOwordm9pZCAgYW1sX3NwaV9tb2RfZXhpdCh2b2lkKQoreworCXByX2RiZygiQW1sb2dpYyBEVkIgU1BJIEV4aXRcbiIpOworCWNsYXNzX3VucmVnaXN0ZXIoJmFtbF9zcGlfY2xhc3MpOworfQorRVhQT1JUX1NZTUJPTChhbWxfc3BpX21vZF9leGl0KTsKKyNlbmRpZgorI2lmIDAKK21vZHVsZV9pbml0KGFtbF9zcGlfbW9kX2luaXQpOworbW9kdWxlX2V4aXQoYW1sX3NwaV9tb2RfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9hbWxfc3BpLmggYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2FtbF9zcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzJkYzFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9hbWxfc3BpLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNyBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisqIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyoKKyogRGVzY3JpcHRpb246CisqLworI2lmbmRlZiBfX0FNTF9TUElfSF8KKyNkZWZpbmUgX19BTUxfU1BJX0hfCisKKy8vI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvYW1sX2dwaW9fY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+CisjaW5jbHVkZSAiYW1sX3BjbWNpYS5oIgorI2luY2x1ZGUgImFtbF9jaS5oIgorI2luY2x1ZGUgImR2Yl9jYV9lbjUwMjIxLmgiCisKKy8qCithbWwgc3BpIGRldgorKi8KK3N0cnVjdCBhbWxfc3BpIHsKKwlzcGlubG9ja190IHNwaV9sb2NrOworCisJLyogYWRkIFNQSSBERVYgKi8KKwlzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gKnNwaV9iZGluZm87CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCS8qIHNwaSBvdGhlcmNvbmZpZyAqLworCWludCBjc19ob2xkX2RlbGF5OworCWludCBjc19jbGtfZGVsYXk7CisJaW50IHdyaXRlX2NoZWNrOworCisJLyogYWRkIGdwaW8gcGluICovCisJc3RydWN0IGdwaW9fZGVzYyAqcmVzZXRfcGluOworCWludCByZXNldF9waW5fdmFsdWU7CisJc3RydWN0IGdwaW9fZGVzYyAqY2RfcGluMTsKKwlpbnQgY2RfcGluMV92YWx1ZTsKKwlzdHJ1Y3QgZ3Bpb19kZXNjICpjZF9waW4yOworCWludCBjZF9waW4yX3ZhbHVlOworCXN0cnVjdCBncGlvX2Rlc2MgKnB3cl9waW47CisJaW50IHB3cl9waW5fdmFsdWU7CisKKwkvKiBjYW0gYW5kIG1jdSBpcnEgKi8KKwlzdHJ1Y3QgZ3Bpb19kZXNjICppcnFfY2FtX3BpbjsKKwlpbnQgaXJxX2NhbV9waW5fdmFsdWU7CisJaW50IGlycTsKKwlzdHJ1Y3QgYW1sX3BjbWNpYSBwYzsKKwl2b2lkICpwcml2OworCS8qZm9yIEFNTF9EVkJfSU9fVFlQRV9TUElfVDMxMiBkZXZpY2UqLworCXN0cnVjdCBncGlvX2Rlc2MgKm1jdV9pcnFfcGluOworCWludCBtY3VfaXJxX3Bpbl92YWx1ZTsKKwkvKmRldmljZSB0eXBlKi8KKwlpbnQgaW9fZGV2aWNlX3R5cGU7Cit9OworCisKKy8qIHVzZWQgdG8gbWN1ICovCisjZGVmaW5lIERBVEFTVEFSVCAweGVmCisjZGVmaW5lIERBVEFFTkQgICAweGZlCisKK2VudW0gQU1fU1BJX1JFQ0lWRVJTVEVQIHsKKwkJQU1fU1BJX1NURVBfSU5JVCA9IDAsCisJCUFNX1NQSV9TVEVQX1NUQVJUMSwKKwkJQU1fU1BJX1NURVBfU1RBUlQyLAorCQlBTV9TUElfU1RFUF9DTUQsCisJCUFNX1NQSV9TVEVQX0RBVEEsCisJCUFNX1NQSV9TVEVQX0FERFIxLAorCQlBTV9TUElfU1RFUF9BRERSMiwKKwkJQU1fU1BJX1NURVBfRU5EMSwKKwkJQU1fU1BJX1NURVBfRU5EMgorfTsKKworZW51bSBBTV9DT05fR1BJTworeworCUFNX0NPTkdQSU9fU0VMX0xWRFMgPSAwLAorCUFNX0NPTkdQSU9fU0NOX0VOLAorCUFNX0NPTkdQSU9fTERfRU4yLAorCUFNX0NPTkdQSU9fMkQzRCwKKwlBTV9DT05HUElPX0FNUF9SU1QsCit9OworCitleHRlcm4gaW50IGRpcnNwaV94ZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHU4ICp0eF9idWYsIHU4ICpyeF9idWYsCisJCSAgICAgICBpbnQgbGVuKTsKK2V4dGVybiBpbnQgZGlyc3BpX3dyaXRlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHU4ICpidWYsIGludCBsZW4pOworZXh0ZXJuIGludCBkaXJzcGlfcmVhZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1OCAqYnVmLCBpbnQgbGVuKTsKK2V4dGVybiB2b2lkIGRpcnNwaV9zdGFydChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKTsKK2V4dGVybiB2b2lkIGRpcnNwaV9zdG9wKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpOworZXh0ZXJuIGludCBkaXJzcGlfcmVnaXN0ZXJfYm9hcmRfaW5mbyhzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gY29uc3QgKmluZm8sIHVuc2lnbmVkIG4pOworZXh0ZXJuIHZvaWQgZHZiX2NhX2VuNTAyMjFfY2FtcmVhZHlfaXJxKHN0cnVjdCBkdmJfY2FfZW41MDIyMSAqcHViY2EsIGludCBzbG90KTsKK2V4dGVybiBpbnQgYW1sX3NwaV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHN0cnVjdCBhbWxfY2kgKmNpX2Rldik7CitleHRlcm4gaW50IGFtbF9zcGlfZXhpdChzdHJ1Y3QgYW1sX2NpICpjaV9kZXYpOworZXh0ZXJuIGludCBhbWxfc3BpX21vZF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgYW1sX3NwaV9tb2RfZXhpdCh2b2lkKTsKKworI2VuZGlmCQkJCS8qIF9fQU1MX1NQSV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC9hbWxfY2ltYXguYyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvYW1sX2NpbWF4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ2MmQ4OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvYW1sX2NpbWF4LmMKQEAgLTAsMCArMSwyOTMgQEAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE0IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGRlZmluZWQgaW4gdGhlCisgKiBmaWxlICdMSUNFTlNFJyB3aGljaCBpcyBwYXJ0IG9mIHRoaXMgc291cmNlIGNvZGUgcGFja2FnZS4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlICIuLi9hbWxfY2kuaCIKKyNpbmNsdWRlICJhbWxfY2ltYXguaCIKKyNpbmNsdWRlICJhbWxfY2ltYXhfc3BpLmgiCisjaW5jbHVkZSAiYW1sX2NpbWF4X3VzYi5oIgorCisjZGVmaW5lIE1PRFVETEVfTkFNRSAgICAgICAiYW1sX2NpbWF4IgorCitNT0RVTEVfUEFSTV9ERVNDKGNpbWF4X2RlYnVnLCAiZW5hYmxlIHZlcmJvc2UgZGVidWcgbWVzc2FnZXMiKTsKK3N0YXRpYyBpbnQgYW1sX2NpbWF4X2RlYnVnID0gMTsKK21vZHVsZV9wYXJhbV9uYW1lZChjaW1heF9kZWJ1ZywgYW1sX2NpbWF4X2RlYnVnLCBpbnQsIDA2NDQpOworCisvL3N0YXRpYyBzdHJ1Y3Qgc3dpdGNoX2RldiBzbG90X3N0YXRlID0geworLy8JLm5hbWUgPSAiY2lfc2xvdCIsCisvL307CisKKyNkZWZpbmUgcHJfZGJnKGZtdC4uLilcCisJZG8ge1wKKwkJaWYgKGFtbF9jaW1heF9kZWJ1ZylcCisJCQlwcl9pbmZvKCJBTUxfQ0lNQVg6ICIgZm10KTtcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgcHJfZXJyb3IoZm10Li4uKSBwcl9lcnIoIkFNTF9DSU1BWDogIiBmbXQpCisKK3N0YXRpYyBpbnQgYW1sX2NpbWF4X3Nsb3RfcmVzZXQoc3RydWN0IGFtbF9jaSAqY2ksIGludCBzbG90KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhbWxfY2ltYXggKmNpbWF4ID0gY2ktPmRhdGE7CisJcHJfZGJnKCJjaW1heDogc2xvdCglZCkgcmVzZXRcbiIsIHNsb3QpOworCWlmIChjaW1heC0+b3BzLnNsb3RfcmVzZXQpCisJCXJldCA9IGNpbWF4LT5vcHMuc2xvdF9yZXNldChjaW1heCwgc2xvdCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhbWxfY2ltYXhfc2xvdF9zaHV0ZG93bihzdHJ1Y3QgYW1sX2NpICpjaSwgaW50IHNsb3QpCit7CisJcHJfZGJnKCJzbG90KCVkKSBzaHV0ZG93blxuIiwgc2xvdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1sX2NpbWF4X3Nsb3RfdHNfZW5hYmxlKHN0cnVjdCBhbWxfY2kgKmNpLCBpbnQgc2xvdCkKK3sKKwlwcl9kYmcoInNsb3QoJWQpIHRzIGNvbnRyb2xcbiIsIHNsb3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtbF9jaW1heF9zbG90X3N0YXR1cyhzdHJ1Y3QgYW1sX2NpICpjaSwgaW50IHNsb3QsIGludCBvcGVuKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhbWxfY2ltYXggKmNpbWF4ID0gY2ktPmRhdGE7CisKKwkvKnByX2RiZygiY2ltYXg6IHNsb3QoJWQpIHBvbGxcbiIsIHNsb3QpOyovCisJaWYgKGNpbWF4LT5vcHMuc2xvdF9zdGF0dXMpCisJCXJldCA9IGNpbWF4LT5vcHMuc2xvdF9zdGF0dXMoY2ltYXgsIHNsb3QpOworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgREVGX0ZVTkNfV1JBUFBFUjMoX3ByZSwgX2ZuLCBfUywgX1AxLCBfUDIsIF9QMykgXAorc3RhdGljIGludCBfcHJlIyNfZm4oX1MgcywgX1AxIHAxLCBfUDIgcDIsIF9QMyBwMylcCit7XAorCXN0cnVjdCBhbWxfY2ltYXggKmNpbWF4ID0gcy0+ZGF0YTtcCisJLypwcl9kYmcoIiVzXG4iLCAjX2ZuKTsqL1wKKwlpZiAoY2ltYXgtPm9wcy5fZm4pXAorCQlyZXR1cm4gY2ltYXgtPm9wcy5fZm4oY2ltYXgsIHAxLCBwMiwgcDMpO1wKKwlyZXR1cm4gMDtcCit9CisKKy8qREVGX0ZVTkNfV1JBUFBFUjMoYW1sX2NpbWF4XywgcmVhZF9yZWcsIHN0cnVjdCBhbWxfY2kqLCBpbnQsIHU4KiwgaW50KSovCisvKkRFRl9GVU5DX1dSQVBQRVIzKGFtbF9jaW1heF8sIHdyaXRlX3JlZywgc3RydWN0IGFtbF9jaSosIGludCwgdTgqLCBpbnQpKi8KK0RFRl9GVU5DX1dSQVBQRVIzKGFtbF9jaW1heF8sIHJlYWRfY2lzLCBzdHJ1Y3QgYW1sX2NpKiwgaW50LCB1OCosIGludCkKK0RFRl9GVU5DX1dSQVBQRVIzKGFtbF9jaW1heF8sIHJlYWRfbHBkdSwgc3RydWN0IGFtbF9jaSosIGludCwgdTgqLCBpbnQpCitERUZfRlVOQ19XUkFQUEVSMyhhbWxfY2ltYXhfLCB3cml0ZV9scGR1LCBzdHJ1Y3QgYW1sX2NpKiwgaW50LCB1OCosIGludCkKKworc3RhdGljIGludCBhbWxfY2ltYXhfd3JpdGVfY29yKHN0cnVjdCBhbWxfY2kgKmNpLCBpbnQgc2xvdCwgaW50IGFkZHIsIHU4ICpidWYpCit7CisJc3RydWN0IGFtbF9jaW1heCAqY2ltYXggPSBjaS0+ZGF0YTsKKwlwcl9kYmcoIndyaXRlX2NvclxuIik7CisJaWYgKGNpbWF4LT5vcHMud3JpdGVfY29yKQorCQlyZXR1cm4gY2ltYXgtPm9wcy53cml0ZV9jb3IoY2ltYXgsIHNsb3QsIGFkZHIsIGJ1Zik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1sX2NpbWF4X25lZ290aWF0ZShzdHJ1Y3QgYW1sX2NpICpjaSwgaW50IHNsb3QsIGludCBzaXplKQoreworCXN0cnVjdCBhbWxfY2ltYXggKmNpbWF4ID0gY2ktPmRhdGE7CisJcHJfZGJnKCJuZWdvdGlhdGVcbiIpOworCWlmIChjaW1heC0+b3BzLm5lZ290aWF0ZSkKKwkJcmV0dXJuIGNpbWF4LT5vcHMubmVnb3RpYXRlKGNpbWF4LCBzbG90LCBzaXplKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWxfY2ltYXhfcmVhZF9jYW1fc3RhdHVzKHN0cnVjdCBhbWxfY2kgKmNpLCBpbnQgc2xvdCkKK3sKKwlzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCA9IGNpLT5kYXRhOworCWlmIChjaW1heC0+b3BzLnJlYWRfY2FtX3N0YXR1cykKKwkJcmV0dXJuIGNpbWF4LT5vcHMucmVhZF9jYW1fc3RhdHVzKGNpbWF4LCBzbG90KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWxfY2ltYXhfY2FtX3Jlc2V0KHN0cnVjdCBhbWxfY2kgKmNpLCBpbnQgc2xvdCkKK3sKKwlzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCA9IGNpLT5kYXRhOworCWlmIChjaW1heC0+b3BzLmNhbV9yZXNldCkKKwkJcmV0dXJuIGNpbWF4LT5vcHMuY2FtX3Jlc2V0KGNpbWF4LCBzbG90KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWxfY2ltYXhfZ2V0X2NhcGJpbGl0eShzdHJ1Y3QgYW1sX2NpICpjaSwgaW50IHNsb3QpCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCBhbWxfY2ltYXhfY2FtY2hhbmdlZChzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCwgaW50IHNsb3QsIGludCBwbHVnaW4pCit7CisJc3RydWN0IGFtbF9jaSAqY2kgPSBjaW1heC0+Y2k7CisJaWYgKHBsdWdpbikgeworCQlkdmJfY2FfZW41MDIyMV9jaW1heF9jYW1jaGFuZ2VfaXJxKCZjaS0+ZW41MDIyMV9jaW1heCwKKwkJCXNsb3QsIERWQl9DQV9FTjUwMjIxX0NBTUNIQU5HRV9JTlNFUlRFRCk7CisJfSBlbHNlIHsKKwkJZHZiX2NhX2VuNTAyMjFfY2ltYXhfY2FtY2hhbmdlX2lycSgmY2ktPmVuNTAyMjFfY2ltYXgsCisJCQlzbG90LCBEVkJfQ0FfRU41MDIyMV9DQU1DSEFOR0VfUkVNT1ZFRCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtbF9jaW1heF9zdGFydChzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpZiAoY2ltYXgtPm9wcy5zdGFydCkKKwkJcmV0ID0gY2ltYXgtPm9wcy5zdGFydChjaW1heCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhbWxfY2ltYXhfc3RvcChzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpZiAoY2ltYXgtPm9wcy5zdG9wKQorCQlyZXQgPSBjaW1heC0+b3BzLnN0b3AoY2ltYXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYW1sX2NpbWF4X2dldF9jb25maWdfZnJvbV9kdHMoc3RydWN0IGFtbF9jaW1heCAqY2ltYXgpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpjaGlsZCA9IE5VTEw7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IGNpbWF4LT5wZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCByZXQgPSAwOworCXByX2RiZygiZ2V0IGNpbWF4IGR0c1xuIik7CisKKwljaGlsZCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKG5wLCAiY2ltYXgiKTsKKwlpZiAoY2hpbGQgPT0gTlVMTCkgeworCQlwcl9lcnJvcigiZmFpbGVkIHRvIGdldCBjaW1heFxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoY2hpbGQsICJpb190eXBlIiwgJnZhbCk7CisJaWYgKHJldCkKKwkJY2ltYXgtPmlvX3R5cGUgPSBJT19UWVBFX1NQSTsKKwllbHNlCisJCWNpbWF4LT5pb190eXBlID0gdmFsOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBhbWxfY2ltYXhfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgYW1sX2NpICpjaSkKK3sKKwlzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwljaW1heCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhbWxfY2ltYXgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNpbWF4KSB7CisJCXByX2Vycm9yKCJPdXQgb2YgbWVtb3J5ISwgZXhpdGluZyAuLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljaW1heC0+cGRldiA9IHBkZXY7CisJY2ltYXgtPmNpID0gY2k7CisKKwlhbWxfY2ltYXhfZ2V0X2NvbmZpZ19mcm9tX2R0cyhjaW1heCk7CisKKwlpZiAoY2ltYXgtPmlvX3R5cGUgPT0gSU9fVFlQRV9TUEkpIHsKKwkJLy9yZXQgPSBhbWxfY2ltYXhfc3BpX2luaXQocGRldiwgY2ltYXgpOworCX0KKwllbHNlIHsKKwkJcmV0ID0gYW1sX2NpbWF4X3VzYl9pbml0KHBkZXYsIGNpbWF4KTsKKwl9CisKKwlpZiAocmV0ICE9IDApIHsKKwkJa2ZyZWUoY2ltYXgpOworCQljaW1heCA9IE5VTEw7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldCA9IGFtbF9jaW1heF9zdGFydChjaW1heCk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJY2ktPmRhdGEgPSBjaW1heDsKKworCWNpLT5jaV9yZWFkX2NpcyA9IGFtbF9jaW1heF9yZWFkX2NpczsKKwljaS0+Y2lfd3JpdGVfY29yID0gYW1sX2NpbWF4X3dyaXRlX2NvcjsKKwljaS0+Y2lfbmVnb3RpYXRlID0gYW1sX2NpbWF4X25lZ290aWF0ZTsKKwljaS0+Y2lfcmVhZF9scGR1ID0gYW1sX2NpbWF4X3JlYWRfbHBkdTsKKwljaS0+Y2lfd3JpdGVfbHBkdSA9IGFtbF9jaW1heF93cml0ZV9scGR1OworCWNpLT5jaV9yZWFkX2NhbV9zdGF0dXMgPSBhbWxfY2ltYXhfcmVhZF9jYW1fc3RhdHVzOworCWNpLT5jaV9jYW1fcmVzZXQgPSBhbWxfY2ltYXhfY2FtX3Jlc2V0OworCWNpLT5jaV9nZXRfY2FwYmlsaXR5ID0gYW1sX2NpbWF4X2dldF9jYXBiaWxpdHk7CisJY2ktPmNpX3Nsb3RfcmVzZXQgPSBhbWxfY2ltYXhfc2xvdF9yZXNldDsKKwljaS0+Y2lfc2xvdF9zaHV0ZG93biA9IGFtbF9jaW1heF9zbG90X3NodXRkb3duOworCWNpLT5jaV9zbG90X3RzX2VuYWJsZSA9IGFtbF9jaW1heF9zbG90X3RzX2VuYWJsZTsKKwljaS0+Y2lfcG9sbF9zbG90X3N0YXR1cyA9IGFtbF9jaW1heF9zbG90X3N0YXR1czsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChhbWxfY2ltYXhfaW5pdCk7CisKK2ludCBhbWxfY2ltYXhfZXhpdChzdHJ1Y3QgYW1sX2NpICpjaSkKK3sKKwlzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCA9IGNpLT5kYXRhOworCisJY2ktPmNpX3JlYWRfY2lzICAgICAgICAgPSBOVUxMOworCWNpLT5jaV93cml0ZV9jb3IgICAgICAgID0gTlVMTDsKKwljaS0+Y2lfbmVnb3RpYXRlICAgICAgICA9IE5VTEw7CisJY2ktPmNpX3JlYWRfbHBkdSAgICAgICAgPSBOVUxMOworCWNpLT5jaV93cml0ZV9scGR1ICAgICAgID0gTlVMTDsKKwljaS0+Y2lfcmVhZF9jYW1fc3RhdHVzICA9IE5VTEw7CisJY2ktPmNpX2NhbV9yZXNldCAgICAgICAgPSBOVUxMOworCWNpLT5jaV9nZXRfY2FwYmlsaXR5ICAgID0gTlVMTDsKKwljaS0+Y2lfc2xvdF9yZXNldCAgICAgICA9IE5VTEw7CisJY2ktPmNpX3Nsb3Rfc2h1dGRvd24gICAgPSBOVUxMOworCWNpLT5jaV9zbG90X3RzX2VuYWJsZSAgID0gTlVMTDsKKwljaS0+Y2lfcG9sbF9zbG90X3N0YXR1cyA9IE5VTEw7CisKKwlhbWxfY2ltYXhfc3RvcChjaW1heCk7CisKKwlpZiAoY2ltYXgtPmlvX3R5cGUgPT0gSU9fVFlQRV9TUEkpIHsKKyAgICAgICAgLy9hbWxfY2ltYXhfc3BpX2V4aXQoY2ltYXgpOworCX0KKwllbHNlIHsKKwkJYW1sX2NpbWF4X3VzYl9leGl0KGNpbWF4KTsKKwl9CisJa2ZyZWUoY2ltYXgpOworCWNpLT5kYXRhID0gTlVMTDsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChhbWxfY2ltYXhfZXhpdCk7CisKK2ludCBhbWxfY2ltYXhfc2xvdF9zdGF0ZV9jaGFuZ2VkKHN0cnVjdCBhbWxfY2ltYXggKmNpbWF4LCBpbnQgc2xvdCwgaW50IHN0YXRlKQoreworCS8vaWYgKHNsb3QgPT0gMCkKKwkvLwlzd2l0Y2hfc2V0X3N0YXRlKCZzbG90X3N0YXRlLCBzdGF0ZSk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGFtbF9jaW1heF9zbG90X3N0YXRlX2NoYW5nZWQpOworI2lmIDAKK3N0YXRpYyBpbnQgX19pbml0IGFtbF9jaW1heF9tb2RfaW5pdCh2b2lkKQoreworCXByX2RiZygiQW1sb2dpYyBEVkIgQ0lNQVggSW5pdFxuIik7CisJLy9zd2l0Y2hfZGV2X3JlZ2lzdGVyKCZzbG90X3N0YXRlKTsKKwkvL3N3aXRjaF9zZXRfc3RhdGUoJnNsb3Rfc3RhdGUsIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYW1sX2NpbWF4X21vZF9leGl0KHZvaWQpCit7CisJcHJfZGJnKCJBbWxvZ2ljIERWQiBDSU1BWCBFeGl0XG4iKTsKKwkvL3N3aXRjaF9kZXZfdW5yZWdpc3Rlcigmc2xvdF9zdGF0ZSk7Cit9CisKK21vZHVsZV9pbml0KGFtbF9jaW1heF9tb2RfaW5pdCk7Cittb2R1bGVfZXhpdChhbWxfY2ltYXhfbW9kX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC9hbWxfY2ltYXguaCBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvYW1sX2NpbWF4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdjNjJmYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvYW1sX2NpbWF4LmgKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE0IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGRlZmluZWQgaW4gdGhlCisgKiBmaWxlICdMSUNFTlNFJyB3aGljaCBpcyBwYXJ0IG9mIHRoaXMgc291cmNlIGNvZGUgcGFja2FnZS4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19BTUxfQ0lNQVhfSF8KKyNkZWZpbmUgX19BTUxfQ0lNQVhfSF8KKworI2luY2x1ZGUgIi4uL2FtbF9jaS5oIgorI2luY2x1ZGUgImR2Yl9jYV9lbjUwMjIxX2NpbWF4LmgiCisKK3N0cnVjdCBhbWxfY2ltYXg7CisKK3N0cnVjdCBhbWxfY2ltYXhfb3BzIHsKKwlpbnQgKCpyZWFkX2Npcykoc3RydWN0IGFtbF9jaW1heCAqY2ltYXgsIGludCBzbG90LCB1OCAqYnVmLCBpbnQgc2l6ZSk7CisJaW50ICgqd3JpdGVfY29yKShzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCwKKwkJCWludCBzbG90LCBpbnQgYWRkcmVzcywgdTggKmJ1Zik7CisJaW50ICgqbmVnb3RpYXRlKShzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCwgaW50IHNsb3QsIGludCBzaXplKTsKKwlpbnQgKCpyZWFkX2xwZHUpKHN0cnVjdCBhbWxfY2ltYXggKmNpbWF4LCBpbnQgc2xvdCwgdTggKmJ1ZiwgaW50IHNpemUpOworCWludCAoKndyaXRlX2xwZHUpKHN0cnVjdCBhbWxfY2ltYXggKmNpbWF4LCBpbnQgc2xvdCwgdTggKmJ1ZiwgaW50IHNpemUpOworCWludCAoKnJlYWRfY2FtX3N0YXR1cykoc3RydWN0IGFtbF9jaW1heCAqY2ltYXgsIGludCBzbG90KTsKKwlpbnQgKCpjYW1fcmVzZXQpKHN0cnVjdCBhbWxfY2ltYXggKmNpbWF4LCBpbnQgc2xvdCk7CisJaW50ICgqZ2V0X2NhcGJsaWxpdHkpKHN0cnVjdCBhbWxfY2ltYXggKmNpbWF4LCBpbnQgc2xvdCk7CisKKwlpbnQgKCpzbG90X3Jlc2V0KShzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCwgaW50IHNsb3QpOworCWludCAoKnNsb3Rfc2h1dGRvd24pKHN0cnVjdCBhbWxfY2ltYXggKmNpbWF4LCBpbnQgc2xvdCk7CisJaW50ICgqc2xvdF90c19lbmFibGUpKHN0cnVjdCBhbWxfY2ltYXggKmNpbWF4LCBpbnQgc2xvdCk7CisJaW50ICgqc2xvdF9zdGF0dXMpKHN0cnVjdCBhbWxfY2ltYXggKmNpbWF4LCBpbnQgc2xvdCk7CisKKwkvKmxvYWQgZncgZXRjLiovCisJaW50ICgqc3RhcnQpKHN0cnVjdCBhbWxfY2ltYXggKmNpbWF4KTsKKwlpbnQgKCpzdG9wKShzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCk7CisKKwkvKmNpbWF4IHJlZyovCisJaW50ICgqcmVhZF9yZWcpKHN0cnVjdCBhbWxfY2ltYXggKmNpbWF4LCBpbnQgYWRkciwgdTggKmJ1ZiwgaW50IHNpemUpOworCWludCAoKndyaXRlX3JlZykoc3RydWN0IGFtbF9jaW1heCAqY2ltYXgsIGludCBhZGRyLCB1OCAqYnVmLCBpbnQgc2l6ZSk7Cit9OworCitzdHJ1Y3QgYW1sX2NpbWF4IHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgYW1sX2NpICpjaTsKKworCWludCBpb190eXBlOworI2RlZmluZSBJT19UWVBFX1NQSSAwCisjZGVmaW5lIElPX1RZUEVfVVNCIDEKKwlzdHJ1Y3QgYW1sX2NpbWF4X29wcyBvcHM7CisJdm9pZCAqcHJpdjsKK307CisKK2ludCBhbWxfY2ltYXhfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgYW1sX2NpICpjaV9kZXYpOworaW50IGFtbF9jaW1heF9leGl0KHN0cnVjdCBhbWxfY2kgKmNpX2Rldik7CisKK2ludCBhbWxfY2ltYXhfY2FtY2hhbmdlZChzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCwgaW50IHNsb3QsIGludCBwbHVnaW4pOworaW50IGFtbF9jaW1heF9zbG90X3N0YXRlX2NoYW5nZWQoc3RydWN0IGFtbF9jaW1heCAqY2ltYXgsIGludCBzbG90LCBpbnQgc3RhdGUpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L2FtbF9jaW1heF9zcGkuYyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvYW1sX2NpbWF4X3NwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YWFkZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L2FtbF9jaW1heF9zcGkuYwpAQCAtMCwwICsxLDIxMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBkZWZpbmVkIGluIHRoZQorICogZmlsZSAnTElDRU5TRScgd2hpY2ggaXMgcGFydCBvZiB0aGlzIHNvdXJjZSBjb2RlIHBhY2thZ2UuCisgKgorICogRGVzY3JpcHRpb246CisgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL2FtbF9ncGlvX2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL3NkLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlICJhbWxfY2ltYXguaCIKKworI2RlZmluZSBNT0RfTkFNRSAgICAgICAiYW1sX2NpbWF4X3NwaSIKKworI2RlZmluZSBwcl9kYmcoZm10Li4uKVwKKwlkbyB7XAorCQlpZiAoY2ltYXhfc3BpX2RlYnVnKVwKKwkJCXByX2luZm8oImNpbWF4X3NwaTogImZtdCk7XAorCX0gd2hpbGUgKDApCisjZGVmaW5lIHByX2Vycm9yKGZtdC4uLikgcHJfZXJyKCJBTUxfQ0lNQVhfU1BJOiAiIGZtdCkKKworI2RlZmluZSBCVUZGSU5fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEJVRkZJTl9BRERSX0xTQiAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgQlVGRklOX0FERFJfTVNCICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBCVUZGSU5fREFUQSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIEJVRkZPVVRfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgQlVGRk9VVF9BRERSX0xTQiAgICAgICAgICAgICAgICAgIDB4MDAwNQorI2RlZmluZSBCVUZGT1VUX0FERFJfTVNCICAgICAgICAgICAgICAgICAgMHgwMDA2CisjZGVmaW5lIEJVRkZPVVRfREFUQSAgICAgICAgICAgICAgICAgICAgICAweDAwMDcKKyNkZWZpbmUgQk9PVF9LZXkgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBCT09UX1N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA5CisjZGVmaW5lIEJPT1RfVGVzdCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEEKKyNkZWZpbmUgdXNiMl8wX2lycV9tYXNrICAgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSB1c2IyXzBfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgMHgwMDExCisjZGVmaW5lIHVzYjJfMF9yeCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTIKKyNkZWZpbmUgdXNiMl8wX3R4ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMworI2RlZmluZSBTUElfU2xhdmVfQ3RybCAgICAgICAgICAgICAgICAgICAgMHgwMDE4CisjZGVmaW5lIFNQSV9TbGF2ZV9TdGF0dXMgICAgICAgICAgICAgICAgICAweDAwMTkKKyNkZWZpbmUgU1BJX1NsYXZlX1J4ICAgICAgICAgICAgICAgICAgICAgIDB4MDAxQQorI2RlZmluZSBTUElfU2xhdmVfVHggICAgICAgICAgICAgICAgICAgICAgMHgwMDFCCisjZGVmaW5lIFNQSV9TbGF2ZV9NYXNrICAgICAgICAgICAgICAgICAgICAweDAwMUMKKyNkZWZpbmUgVUNTR19DdHJsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBVQ1NHX1N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIxCisjZGVmaW5lIFVDU0dfUnhEYXRhICAgICAgICAgICAgICAgICAgICAgICAweDAwMjIKKyNkZWZpbmUgVUNTR19UeERhdGEgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMworI2RlZmluZSBQQ3RybF9DdHJsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDI4CisjZGVmaW5lIFBDdHJsX1N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAweDAwMjkKKyNkZWZpbmUgUEN0cmxfTmJCeXRlX0xTQiAgICAgICAgICAgICAgICAgIDB4MDAyQQorI2RlZmluZSBQQ3RybF9OYkJ5dGVfTVNCICAgICAgICAgICAgICAgICAgMHgwMDJCCisjZGVmaW5lIFNQSV9NYXN0ZXJfQ3RsICAgICAgICAgICAgICAgICAgICAweDAwMzAKKyNkZWZpbmUgU1BJX01hc3Rlcl9OQ1MgICAgICAgICAgICAgICAgICAgIDB4MDAzMQorI2RlZmluZSBTUElfTWFzdGVyX1N0YXR1cyAgICAgICAgICAgICAgICAgMHgwMDMyCisjZGVmaW5lIFNQSV9NYXN0ZXJfVHhCdWYgICAgICAgICAgICAgICAgICAweDAwMzMKKyNkZWZpbmUgU1BJX01hc3Rlcl9SeEJ1ZiAgICAgICAgICAgICAgICAgIDB4MDAzNAorI2RlZmluZSBCSVNUUkFNX0N0bCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDM4CisjZGVmaW5lIEJJU1RSQU1fQmFuayAgICAgICAgICAgICAgICAgICAgICAweDAwMzkKKyNkZWZpbmUgQklTVFJBTV9QYXQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzQQorI2RlZmluZSBCSVNUUkFNX1NNICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDNCCisjZGVmaW5lIEJJU1RSQU1fQWRkckxTQiAgICAgICAgICAgICAgICAgICAweDAwM0MKKyNkZWZpbmUgQklTVFJPTV9Db25maWcgICAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBCSVNUUk9NX1NpZ25hdHVyZUxTQiAgICAgICAgICAgICAgMHgwMDQxCisjZGVmaW5lIEJJU1RST01fU2lnbmF0dXJlTVNCICAgICAgICAgICAgICAweDAwNDIKKyNkZWZpbmUgQklTVFJPTV9TdGFydEFkZHJMU0IgICAgICAgICAgICAgIDB4MDA0MworI2RlZmluZSBCSVNUUk9NX1N0YXJ0QWRkck1TQiAgICAgICAgICAgICAgMHgwMDQzCisjZGVmaW5lIEJJU1RST01fU3RvcEFkZHJMU0IgICAgICAgICAgICAgICAweDAwNDMKKyNkZWZpbmUgQklTVFJPTV9TdG9wQWRkck1TQiAgICAgICAgICAgICAgIDB4MDA0MworI2RlZmluZSBDa01hbl9Db25maWcgICAgICAgICAgICAgICAgICAgICAgMHgwMDQ4CisjZGVmaW5lIENrTWFuX1NlbGVjdCAgICAgICAgICAgICAgICAgICAgICAweDAwNDkKKyNkZWZpbmUgQ2tNYW5fVGVzdCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0QQorI2RlZmluZSBSZXZpc2lvbl9OdW1iZXIgICAgICAgICAgICAgICAgICAgMHgwMDRCCisjZGVmaW5lIFJlc01hbl9Db25maWcgICAgICAgICAgICAgICAgICAgICAweDAwNTAKKyNkZWZpbmUgUmVzTWFuX1N0YXR1cyAgICAgICAgICAgICAgICAgICAgIDB4MDA1MQorI2RlZmluZSBSZXNNYW5fV0QgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDUyCisjZGVmaW5lIFJlc01hbl9XRF9NU0IgICAgICAgICAgICAgICAgICAgICAweDAwNTMKKyNkZWZpbmUgQ1BVX1Rlc3QgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MAorI2RlZmluZSBJcnFNYW5fQ29uZmlnMCAgICAgICAgICAgICAgICAgICAgMHgwMDY4CisjZGVmaW5lIElycU1hbl9Db25maWcxICAgICAgICAgICAgICAgICAgICAweDAwNjkKKyNkZWZpbmUgSXJxTWFuX0lycTAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2QQorI2RlZmluZSBJcnFNYW5fTk1JICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDZCCisjZGVmaW5lIElycU1hbl9TbGVlcEtleSAgICAgICAgICAgICAgICAgICAweDAwNkMKKyNkZWZpbmUgVGltX0NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3MAorI2RlZmluZSBUaW1fVmFsdWVfTFNCICAgICAgICAgICAgICAgICAgICAgMHgwMDcxCisjZGVmaW5lIFRpbV9WYWx1ZV9NU0IgICAgICAgICAgICAgICAgICAgICAweDAwNzIKKyNkZWZpbmUgVGltX0NvbXBfTFNCICAgICAgICAgICAgICAgICAgICAgIDB4MDA3MworI2RlZmluZSBUaW1fQ29tcF9NU0IgICAgICAgICAgICAgICAgICAgICAgMHgwMDc0CisjZGVmaW5lIFRJX0NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNzYKKyNkZWZpbmUgVElfRGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3NworI2RlZmluZSBUSV9SZWcwICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDc4CisjZGVmaW5lIFRJX1JlZzEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNzkKKyNkZWZpbmUgVElfUmVnMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3QQorI2RlZmluZSBUSV9SZWczICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDdCCisjZGVmaW5lIFRJX1JlZzQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwN0MKKyNkZWZpbmUgVElfUk9NMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3RAorI2RlZmluZSBUSV9ST00yICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDdFCisjZGVmaW5lIFRJX1JPTTMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwN0YKKyNkZWZpbmUgRFZCQ0lfU1RBUlRfQUREUiAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBEVkJDSV9FTkRfQUREUiAgICAgICAgICAgICAgICAgICAgMHgwMTdGCisjZGVmaW5lIERBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxODAKKy8qI2RlZmluZSBDVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE4MSovCisjZGVmaW5lIFFCX0hPU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxODIKKyNkZWZpbmUgTEVOX0hPU1RfTFNCICAgICAgICAgICAgICAgICAgICAgIDB4MDE4MworI2RlZmluZSBMRU5fSE9TVF9NU0IgICAgICAgICAgICAgICAgICAgICAgMHgwMTg0CisjZGVmaW5lIEZJRk9fVFhfVEhfTFNCICAgICAgICAgICAgICAgICAgICAweDAxODUKKyNkZWZpbmUgRklGT19UWF9USF9NU0IgICAgICAgICAgICAgICAgICAgIDB4MDE4NgorI2RlZmluZSBGSUZPX1RYX0RfTkJfTFNCICAgICAgICAgICAgICAgICAgMHgwMTg3CisjZGVmaW5lIEZJRk9fVFhfRF9OQl9NU0IgICAgICAgICAgICAgICAgICAweDAxODgKKyNkZWZpbmUgUUJfTU9EX0NVUlIgICAgICAgICAgICAgICAgICAgICAgIDB4MDE4OQorI2RlZmluZSBMRU5fTU9EX0NVUlJfTFNCICAgICAgICAgICAgICAgICAgMHgwMThBCisjZGVmaW5lIExFTl9NT0RfQ1VSUl9NU0IgICAgICAgICAgICAgICAgICAweDAxOEIKKyNkZWZpbmUgUUJfTU9EICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE4QworI2RlZmluZSBMRU5fTU9EX0xTQiAgICAgICAgICAgICAgICAgICAgICAgMHgwMThECisjZGVmaW5lIExFTl9NT0RfTVNCICAgICAgICAgICAgICAgICAgICAgICAweDAxOEUKKyNkZWZpbmUgRklGT19SWF9USF9MU0IgICAgICAgICAgICAgICAgICAgIDB4MDE4RgorI2RlZmluZSBGSUZPX1JYX1RIX01TQiAgICAgICAgICAgICAgICAgICAgMHgwMTkwCisjZGVmaW5lIEZJRk9fUlhfRF9OQl9MU0IgICAgICAgICAgICAgICAgICAweDAxOTEKKyNkZWZpbmUgRklGT19SWF9EX05CX01TQiAgICAgICAgICAgICAgICAgIDB4MDE5MgorI2RlZmluZSBJVF9TVEFUVVNfMCAgICAgICAgICAgICAgICAgICAgICAgMHgwMTkzCisjZGVmaW5lIElUX1NUQVRVU18xICAgICAgICAgICAgICAgICAgICAgICAweDAxOTQKKyNkZWZpbmUgSVRfTUFTS18wICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE5NQorI2RlZmluZSBJVF9NQVNLXzEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTk2CisjZGVmaW5lIElUX0hPU1RfUElOX0NGRyAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgQ0ZHXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMQorI2RlZmluZSBDRkdfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAyCisjZGVmaW5lIENGR18yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDMKKyNkZWZpbmUgSVRfSE9TVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNAorI2RlZmluZSBNT0RfSVRfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgMHgwMjA1CisjZGVmaW5lIE1PRF9JVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAyMDYKKyNkZWZpbmUgTU9EX0NUUkxfQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNworI2RlZmluZSBNT0RfQ1RSTF9CICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA4CisjZGVmaW5lIERFU1RfU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDkKKyNkZWZpbmUgQ0FNX01TQl9BREQgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwQQorI2RlZmluZSBHUElPMF9ESVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjBCCisjZGVmaW5lIEdQSU8wX0RBVEFfSU4gICAgICAgICAgICAgICAgICAgICAweDAyMEMKKyNkZWZpbmUgR1BJTzBfREFUQV9PVVQgICAgICAgICAgICAgICAgICAgIDB4MDIwRAorI2RlZmluZSBHUElPMF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgMHgwMjBFCisjZGVmaW5lIEdQSU8wX0lUX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAyMEYKKyNkZWZpbmUgR1BJTzBfREZUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxMAorI2RlZmluZSBHUElPMF9NQVNLX0RBVEEgICAgICAgICAgICAgICAgICAgMHgwMjExCisjZGVmaW5lIEdQSU8xX0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMTIKKyNkZWZpbmUgR1BJTzFfREFUQV9JTiAgICAgICAgICAgICAgICAgICAgIDB4MDIxMworI2RlZmluZSBHUElPMV9EQVRBX09VVCAgICAgICAgICAgICAgICAgICAgMHgwMjE0CisjZGVmaW5lIEdQSU8xX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAweDAyMTUKKyNkZWZpbmUgR1BJTzFfSVRfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDIxNgorI2RlZmluZSBNRU1fQUNDX1RJTUVfQSAgICAgICAgICAgICAgICAgICAgMHgwMjE3CisjZGVmaW5lIE1FTV9BQ0NfVElNRV9CICAgICAgICAgICAgICAgICAgICAweDAyMTgKKyNkZWZpbmUgSU9fQUNDX1RJTUVfQSAgICAgICAgICAgICAgICAgICAgIDB4MDIxOQorI2RlZmluZSBJT19BQ0NfVElNRV9CICAgICAgICAgICAgICAgICAgICAgMHgwMjFBCisjZGVmaW5lIEVYVF9DSF9BQ0NfVElNRV9BICAgICAgICAgICAgICAgICAweDAyMUIKKyNkZWZpbmUgRVhUX0NIX0FDQ19USU1FX0IgICAgICAgICAgICAgICAgIDB4MDIxQworI2RlZmluZSBQQVJfSUZfMCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjFECisjZGVmaW5lIFBBUl9JRl8xICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMUUKKyNkZWZpbmUgUEFSX0lGX0NUUkwgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxRgorI2RlZmluZSBQQ0tfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjIwCisjZGVmaW5lIFVTQjJUU19DVFJMICAgICAgICAgICAgICAgICAgICAgICAweDAyMjEKKyNkZWZpbmUgVVNCMlRTMF9SREwgICAgICAgICAgICAgICAgICAgICAgIDB4MDIyMgorI2RlZmluZSBVU0IyVFMxX1JETCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjIzCisjZGVmaW5lIFRTMlVTQl9DVFJMICAgICAgICAgICAgICAgICAgICAgICAweDAyMjQKKyNkZWZpbmUgVFNPVVRfUEFSX0NUUkwgICAgICAgICAgICAgICAgICAgIDB4MDIyNQorI2RlZmluZSBUU09VVF9QQVJfQ0xLX1NFTCAgICAgICAgICAgICAgICAgMHgwMjI2CisjZGVmaW5lIFMyUF9DSDBfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAweDAyMjcKKyNkZWZpbmUgUzJQX0NIMV9DVFJMICAgICAgICAgICAgICAgICAgICAgIDB4MDIyOAorI2RlZmluZSBQMlNfQ0gwX0NUUkwgICAgICAgICAgICAgICAgICAgICAgMHgwMjI5CisjZGVmaW5lIFAyU19DSDFfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAweDAyMkEKKyNkZWZpbmUgVFNfSVRfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgIDB4MDIyQgorI2RlZmluZSBUU19JVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjJDCisjZGVmaW5lIElOX1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMkQKKyNkZWZpbmUgT1VUX1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIyRQorI2RlZmluZSBST1VURVJfQ0FNX0NIICAgICAgICAgICAgICAgICAgICAgMHgwMjJGCisjZGVmaW5lIFJPVVRFUl9DQU1fTU9EICAgICAgICAgICAgICAgICAgICAweDAyMzAKKyNkZWZpbmUgRklGT19DVFJMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIzMQorI2RlZmluZSBGSUZPMV8yX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgMHgwMjMyCisjZGVmaW5lIEZJRk8zXzRfU1RBVFVTICAgICAgICAgICAgICAgICAgICAweDAyMzMKKyNkZWZpbmUgR0FQX1JFTU9WRVJfQ0gwX0NUUkwgICAgICAgICAgICAgIDB4MDIzNAorI2RlZmluZSBHQVBfUkVNT1ZFUl9DSDFfQ1RSTCAgICAgICAgICAgICAgMHgwMjM1CisjZGVmaW5lIFNZTkNfUlRWX0NUUkwgICAgICAgICAgICAgICAgICAgICAweDAyMzYKKyNkZWZpbmUgU1lOQ19SVFZfQ0gwX1NZTkNfTkIgICAgICAgICAgICAgIDB4MDIzNworI2RlZmluZSBTWU5DX1JUVl9DSDBfUEFUVEVSTiAgICAgICAgICAgICAgMHgwMjM4CisjZGVmaW5lIFNZTkNfUlRWX0NIMV9TWU5DX05CICAgICAgICAgICAgICAweDAyMzkKKyNkZWZpbmUgU1lOQ19SVFZfQ0gxX1BBVFRFUk4gICAgICAgICAgICAgIDB4MDIzQQorI2RlZmluZSBTWU5DX1JUVl9PRkZTRVRfUEFUVCAgICAgICAgICAgICAgMHgwMjNCCisjZGVmaW5lIENUUkxfRklMVEVSICAgICAgICAgICAgICAgICAgICAgICAweDAyM0QKKyNkZWZpbmUgUElEX0VOX0ZJTFRFUl9DSDAgICAgICAgICAgICAgICAgIDB4MDIzRQorI2RlZmluZSBQSURfRU5fRklMVEVSX0NIMSAgICAgICAgICAgICAgICAgMHgwMjNGCisjZGVmaW5lIFBJRF9MU0JfRklMVEVSX0NIMF8wICAgICAgICAgICAgICAweDAyNDAKKyNkZWZpbmUgUElEX01TQl9GSUxURVJfQ0gwXzAgICAgICAgICAgICAgIDB4MDI0MQorI2RlZmluZSBQSURfTFNCX0ZJTFRFUl9DSDBfMSAgICAgICAgICAgICAgMHgwMjQyCisjZGVmaW5lIFBJRF9NU0JfRklMVEVSX0NIMF8xICAgICAgICAgICAgICAweDAyNDMKKyNkZWZpbmUgUElEX0xTQl9GSUxURVJfQ0gwXzIgICAgICAgICAgICAgIDB4MDI0NAorI2RlZmluZSBQSURfTVNCX0ZJTFRFUl9DSDBfMiAgICAgICAgICAgICAgMHgwMjQ1CisjZGVmaW5lIFBJRF9MU0JfRklMVEVSX0NIMF8zICAgICAgICAgICAgICAweDAyNDYKKyNkZWZpbmUgUElEX01TQl9GSUxURVJfQ0gwXzMgICAgICAgICAgICAgIDB4MDI0NworI2RlZmluZSBQSURfTFNCX0ZJTFRFUl9DSDBfNCAgICAgICAgICAgICAgMHgwMjQ4CisjZGVmaW5lIFBJRF9NU0JfRklMVEVSX0NIMF80ICAgICAgICAgICAgICAweDAyNDkKKyNkZWZpbmUgUElEX0xTQl9GSUxURVJfQ0gwXzUgICAgICAgICAgICAgIDB4MDI0QQorI2RlZmluZSBQSURfTVNCX0ZJTFRFUl9DSDBfNSAgICAgICAgICAgICAgMHgwMjRCCisjZGVmaW5lIFBJRF9MU0JfRklMVEVSX0NIMF82ICAgICAgICAgICAgICAweDAyNEMKKyNkZWZpbmUgUElEX01TQl9GSUxURVJfQ0gwXzYgICAgICAgICAgICAgIDB4MDI0RAorI2RlZmluZSBQSURfTFNCX0ZJTFRFUl9DSDBfNyAgICAgICAgICAgICAgMHgwMjRFCisjZGVmaW5lIFBJRF9NU0JfRklMVEVSX0NIMF83ICAgICAgICAgICAgICAweDAyNEYKKyNkZWZpbmUgUElEX0xTQl9GSUxURVJfQ0gxXzAgICAgICAgICAgICAgIDB4MDI2MAorI2RlZmluZSBQSURfTVNCX0ZJTFRFUl9DSDFfMCAgICAgICAgICAgICAgMHgwMjYxCisjZGVmaW5lIFBJRF9MU0JfRklMVEVSX0NIMV8xICAgICAgICAgICAgICAweDAyNjIKKyNkZWZpbmUgUElEX01TQl9GSUxURVJfQ0gxXzEgICAgICAgICAgICAgIDB4MDI2MworI2RlZmluZSBQSURfTFNCX0ZJTFRFUl9DSDFfMiAgICAgICAgICAgICAgMHgwMjY0CisjZGVmaW5lIFBJRF9NU0JfRklMVEVSX0NIMV8yICAgICAgICAgICAgICAweDAyNjUKKyNkZWZpbmUgUElEX0xTQl9GSUxURVJfQ0gxXzMgICAgICAgICAgICAgIDB4MDI2NgorI2RlZmluZSBQSURfTVNCX0ZJTFRFUl9DSDFfMyAgICAgICAgICAgICAgMHgwMjY3CisjZGVmaW5lIFBJRF9MU0JfRklMVEVSX0NIMV80ICAgICAgICAgICAgICAweDAyNjgKKyNkZWZpbmUgUElEX01TQl9GSUxURVJfQ0gxXzQgICAgICAgICAgICAgIDB4MDI2OQorI2RlZmluZSBQSURfTFNCX0ZJTFRFUl9DSDFfNSAgICAgICAgICAgICAgMHgwMjZBCisjZGVmaW5lIFBJRF9NU0JfRklMVEVSX0NIMV81ICAgICAgICAgICAgICAweDAyNkIKKyNkZWZpbmUgUElEX0xTQl9GSUxURVJfQ0gxXzYgICAgICAgICAgICAgIDB4MDI2QworI2RlZmluZSBQSURfTVNCX0ZJTFRFUl9DSDFfNiAgICAgICAgICAgICAgMHgwMjZECisjZGVmaW5lIFBJRF9MU0JfRklMVEVSX0NIMV83ICAgICAgICAgICAgICAweDAyNkUKKyNkZWZpbmUgUElEX01TQl9GSUxURVJfQ0gxXzcgICAgICAgICAgICAgIDB4MDI2RgorI2RlZmluZSBQSURfT0xEX0xTQl9SRU1BUFBFUl8wICAgICAgICAgICAgMHgwMjgwCisjZGVmaW5lIFBJRF9PTERfTVNCX1JFTUFQUEVSXzAgICAgICAgICAgICAweDAyODEKKyNkZWZpbmUgUElEX09MRF9MU0JfUkVNQVBQRVJfMSAgICAgICAgICAgIDB4MDI4MgorI2RlZmluZSBQSURfT0xEX01TQl9SRU1BUFBFUl8xICAgICAgICAgICAgMHgwMjgzCisjZGVmaW5lIFBJRF9PTERfTFNCX1JFTUFQUEVSXzIgICAgICAgICAgICAweDAyODQKKyNkZWZpbmUgUElEX09MRF9NU0JfUkVNQVBQRVJfMiAgICAgICAgICAgIDB4MDI4NQorI2RlZmluZSBQSURfT0xEX0xTQl9SRU1BUFBFUl8zICAgICAgICAgICAgMHgwMjg2CisjZGVmaW5lIFBJRF9PTERfTVNCX1JFTUFQUEVSXzMgICAgICAgICAgICAweDAyODcKKyNkZWZpbmUgUElEX09MRF9MU0JfUkVNQVBQRVJfNCAgICAgICAgICAgIDB4MDI4OAorI2RlZmluZSBQSURfT0xEX01TQl9SRU1BUFBFUl80ICAgICAgICAgICAgMHgwMjg5CisjZGVmaW5lIFBJRF9PTERfTFNCX1JFTUFQUEVSXzUgICAgICAgICAgICAweDAyOEEKKyNkZWZpbmUgUElEX09MRF9NU0JfUkVNQVBQRVJfNSAgICAgICAgICAgIDB4MDI4QgorI2RlZmluZSBQSURfT0xEX0xTQl9SRU1BUFBFUl82ICAgICAgICAgICAgMHgwMjhDCisjZGVmaW5lIFBJRF9PTERfTVNCX1JFTUFQUEVSXzYgICAgICAgICAgICAweDAyOEQKKyNkZWZpbmUgUElEX09MRF9MU0JfUkVNQVBQRVJfNyAgICAgICAgICAgIDB4MDI4RQorI2RlZmluZSBQSURfT0xEX01TQl9SRU1BUFBFUl83ICAgICAgICAgICAgMHgwMjhGCisjZGVmaW5lIFBJRF9ORVdfTFNCX1JFTUFQUEVSXzAgICAgICAgICAgICAweDAyQTAKKyNkZWZpbmUgUElEX05FV19NU0JfUkVNQVBQRVJfMCAgICAgICAgICAgIDB4MDJBMQorI2RlZmluZSBQSURfTkVXX0xTQl9SRU1BUFBFUl8xICAgICAgICAgICAgMHgwMkEyCisjZGVmaW5lIFBJRF9ORVdfTVNCX1JFTUFQUEVSXzEgICAgICAgICAgICAweDAyQTMKKyNkZWZpbmUgUElEX05FV19MU0JfUkVNQVBQRVJfMiAgICAgICAgICAgIDB4MDJBNAorI2RlZmluZSBQSURfTkVXX01TQl9SRU1BUFBFUl8yICAgICAgICAgICAgMHgwMkE1CisjZGVmaW5lIFBJRF9ORVdfTFNCX1JFTUFQUEVSXzMgICAgICAgICAgICAweDAyQTYKKyNkZWZpbmUgUElEX05FV19NU0JfUkVNQVBQRVJfMyAgICAgICAgICAgIDB4MDJBNworI2RlZmluZSBQSURfTkVXX0xTQl9SRU1BUFBFUl80ICAgICAgICAgICAgMHgwMkE4CisjZGVmaW5lIFBJRF9ORVdfTVNCX1JFTUFQUEVSXzQgICAgICAgICAgICAweDAyQTkKKyNkZWZpbmUgUElEX05FV19MU0JfUkVNQVBQRVJfNSAgICAgICAgICAgIDB4MDJBQQorI2RlZmluZSBQSURfTkVXX01TQl9SRU1BUFBFUl81ICAgICAgICAgICAgMHgwMkFCCisjZGVmaW5lIFBJRF9ORVdfTFNCX1JFTUFQUEVSXzYgICAgICAgICAgICAweDAyQUMKKyNkZWZpbmUgUElEX05FV19NU0JfUkVNQVBQRVJfNiAgICAgICAgICAgIDB4MDJBRAorI2RlZmluZSBQSURfTkVXX0xTQl9SRU1BUFBFUl83ICAgICAgICAgICAgMHgwMkFFCisjZGVmaW5lIFBJRF9ORVdfTVNCX1JFTUFQUEVSXzcgICAgICAgICAgICAweDAyQUYKKyNkZWZpbmUgTUVSR0VSX0RJVl9NSUNMSyAgICAgICAgICAgICAgICAgIDB4MDJDMAorI2RlZmluZSBQSURfQU5EX1NZTkNfUkVNQVBQRVJfQ1RSTCAgICAgICAgMHgwMkMxCisjZGVmaW5lIFBJRF9FTl9SRU1BUFBFUiAgICAgICAgICAgICAgICAgICAweDAyQzIKKyNkZWZpbmUgU1lOQ19TWU1CT0wgICAgICAgICAgICAgICAgICAgICAgIDB4MDJDMworI2RlZmluZSBQSURfQU5EX1NZTkNfUkVNQVBQRVJfSU5WX0NUUkwgICAgMHgwMkM0CisjZGVmaW5lIEJJVFJBVEVfQ0gwX0xTQiAgICAgICAgICAgICAgICAgICAweDAyQzUKKyNkZWZpbmUgQklUUkFURV9DSDBfTVNCICAgICAgICAgICAgICAgICAgIDB4MDJDNgorI2RlZmluZSBCSVRSQVRFX0NIMV9MU0IgICAgICAgICAgICAgICAgICAgMHgwMkM3CisjZGVmaW5lIEJJVFJBVEVfQ0gxX01TQiAgICAgICAgICAgICAgICAgICAweDAyQzgKKyNkZWZpbmUgU1RBVFVTX0NMS19TV0lUQ0hfMCAgICAgICAgICAgICAgIDB4MDJDOQorI2RlZmluZSBTVEFUVVNfQ0xLX1NXSVRDSF8xICAgICAgICAgICAgICAgMHgwMkNBCisjZGVmaW5lIFJFU0VUX0NMS19TV0lUQ0hfMCAgICAgICAgICAgICAgICAweDAyQ0IKKyNkZWZpbmUgUkVTRVRfQ0xLX1NXSVRDSF8xICAgICAgICAgICAgICAgIDB4MDJDQworI2RlZmluZSBQQURfRFJWU1RSX0NUUkwgICAgICAgICAgICAgICAgICAgMHgwMkNECisjZGVmaW5lIFBBRF9QVVBEX0NUUkwgICAgICAgICAgICAgICAgICAgICAweDAyQ0UKKyNkZWZpbmUgUFJFX0hFQURFUl9BRERFUl9DSDBfMCAgICAgICAgICAgIDB4MDJEMAorI2RlZmluZSBQUkVfSEVBREVSX0FEREVSX0NIMF8xICAgICAgICAgICAgMHgwMkQxCisjZGVmaW5lIFBSRV9IRUFERVJfQURERVJfQ0gwXzIgICAgICAgICAgICAweDAyRDIKKyNkZWZpbmUgUFJFX0hFQURFUl9BRERFUl9DSDBfMyAgICAgICAgICAgIDB4MDJEMworI2RlZmluZSBQUkVfSEVBREVSX0FEREVSX0NIMF80ICAgICAgICAgICAgMHgwMkQ0CisjZGVmaW5lIFBSRV9IRUFERVJfQURERVJfQ0gwXzUgICAgICAgICAgICAweDAyRDUKKyNkZWZpbmUgUFJFX0hFQURFUl9BRERFUl9DSDBfNiAgICAgICAgICAgIDB4MDJENgorI2RlZmluZSBQUkVfSEVBREVSX0FEREVSX0NIMF83ICAgICAgICAgICAgMHgwMkQ3CisjZGVmaW5lIFBSRV9IRUFERVJfQURERVJfQ0gwXzggICAgICAgICAgICAweDAyRDgKKyNkZWZpbmUgUFJFX0hFQURFUl9BRERFUl9DSDBfOSAgICAgICAgICAgIDB4MDJEOQorI2RlZmluZSBQUkVfSEVBREVSX0FEREVSX0NIMF8xMCAgICAgICAgICAgMHgwMkRBCisjZGVmaW5lIFBSRV9IRUFERVJfQURERVJfQ0gwXzExICAgICAgICAgICAweDAyREIKKyNkZWZpbmUgUFJFX0hFQURFUl9BRERFUl9DSDFfMCAgICAgICAgICAgIDB4MDJFMAorI2RlZmluZSBQUkVfSEVBREVSX0FEREVSX0NIMV8xICAgICAgICAgICAgMHgwMkUxCisjZGVmaW5lIFBSRV9IRUFERVJfQURERVJfQ0gxXzIgICAgICAgICAgICAweDAyRTIKKyNkZWZpbmUgUFJFX0hFQURFUl9BRERFUl9DSDFfMyAgICAgICAgICAgIDB4MDJFMworI2RlZmluZSBQUkVfSEVBREVSX0FEREVSX0NIMV80ICAgICAgICAgICAgMHgwMkU0CisjZGVmaW5lIFBSRV9IRUFERVJfQURERVJfQ0gxXzUgICAgICAgICAgICAweDAyRTUKKyNkZWZpbmUgUFJFX0hFQURFUl9BRERFUl9DSDFfNiAgICAgICAgICAgIDB4MDJFNgorI2RlZmluZSBQUkVfSEVBREVSX0FEREVSX0NIMV83ICAgICAgICAgICAgMHgwMkU3CisjZGVmaW5lIFBSRV9IRUFERVJfQURERVJfQ0gxXzggICAgICAgICAgICAweDAyRTgKKyNkZWZpbmUgUFJFX0hFQURFUl9BRERFUl9DSDFfOSAgICAgICAgICAgIDB4MDJFOQorI2RlZmluZSBQUkVfSEVBREVSX0FEREVSX0NIMV8xMCAgICAgICAgICAgMHgwMkVBCisjZGVmaW5lIFBSRV9IRUFERVJfQURERVJfQ0gxXzExICAgICAgICAgICAweDAyRUIKKyNkZWZpbmUgUFJFX0hFQURFUl9BRERFUl9DVFJMICAgICAgICAgICAgIDB4MDJFQworI2RlZmluZSBQUkVfSEVBREVSX0FEREVSX0xFTiAgICAgICAgICAgICAgMHgwMkVECisjZGVmaW5lIFBSRV9IRUFERVJfUkVNT1ZFUl9DVFJMICAgICAgICAgICAweDAyRUUKKyNkZWZpbmUgRlNNX0RWQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDJGMAorI2RlZmluZSBUUzJVU0JfRlNNX0RFQlVHICAgICAgICAgICAgICAgICAgMHgwMkYyCisjZGVmaW5lIFRTT1VUX1BBUl9GU01fREVCVUcgICAgICAgICAgICAgICAweDAyRjMKKyNkZWZpbmUgR0FQX1JFTU9WRVJfRlNNX0RFQlVHICAgICAgICAgICAgIDB4MDJGNAorI2RlZmluZSBQSURfQU5EX1NZTkNfUkVNQVBQRVJfRlNNX0RFQlVHICAgMHgwMkY1CisjZGVmaW5lIFBSRV9IRUFERVJfQURERVJfRlNNX0RFQlVHICAgICAgICAweDAyRjYKKyNkZWZpbmUgU1lOQ19SVFZfRlNNX0RFQlVHICAgICAgICAgICAgICAgIDB4MDJGNworI2RlZmluZSBDSEVDS19QSFlfQ0xLICAgICAgICAgICAgICAgICAgICAgMHgwRTAwCisjZGVmaW5lIFVTQl9DVFJMMSAgICAgICAgICAgICAgICAgICAgICAgICAweDBFMDEKKyNkZWZpbmUgVVNCX0lTTzJfb3V0ICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBVU0JfSVNPMV9vdXQgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFVTQl9JbnRlcnJ1cHRfb3V0ICAgICAgICAgICAgICAgICAweDFFMDAKKyNkZWZpbmUgVVNCX0J1bGtfaW4gICAgICAgICAgICAgICAgICAgICAgIDB4MUYwMAorI2RlZmluZSBDQzJfQnVmZmVyX291dCAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFVTQl9FUDAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwQzAKKyNkZWZpbmUgQ0MyX0J1ZmZlcl9pbiAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBVU0JfSVNPMl9pbiAgICAgICAgICAgICAgICAgICAgICAgMHg1ODAwCisjZGVmaW5lIFVTQl9JU08xX2luICAgICAgICAgICAgICAgICAgICAgICAweDYwMDAKKyNkZWZpbmUgbm1iX3ZlY3Rvcl9hZGRyZXNzX2xzYiAgICAgICAgICAgIDB4RkZGQQorI2RlZmluZSBubWJfdmVjdG9yX2FkZHJlc3NfbXNiICAgICAgICAgICAgMHhGRkZCCisjZGVmaW5lIHJlc2V0X3ZlY3Rvcl9hZGRyZXNzX2xzYiAgICAgICAgICAweEZGRkMKKyNkZWZpbmUgcmVzZXRfdmVjdG9yX2FkZHJlc3NfbXNiICAgICAgICAgIDB4RkZGRAorI2RlZmluZSBpcmJfdmVjdG9yX2FkZHJlc3NfbHNiICAgICAgICAgICAgMHhGRkZFCisjZGVmaW5lIGlyYl92ZWN0b3JfYWRkcmVzc19tc2IgICAgICAgICAgICAweEZGRkYKKworCisjZGVmaW5lIENJTUFYX1JFR19IRFJfU0laRSA0CisjZGVmaW5lIENJTUFYX1JFR19QTERfU0laRSAyNTUKKyNkZWZpbmUgQ0lNQVhfQ0FNX0hEUl9TSVpFIDQKKyNkZWZpbmUgQ0lNQVhfQ0FNX1BMRF9TSVpFIDY1NTM1CisKKyNkZWZpbmUgREVGX0xPQ0soX2xfKSBzdHJ1Y3QgbXV0ZXggX2xfCisKK3N0cnVjdCBjaW1heF9zcGkgeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IHNwaV9kZXZpY2UgKmRldjsKKworCXN0cnVjdCBhbWxfY2ltYXggKmNpbWF4OworCisJdTggYnVmW0NJTUFYX1JFR19IRFJfU0laRSArIENJTUFYX0NBTV9IRFJfU0laRSArIENJTUFYX0NBTV9QTERfU0laRV07CisKKwlpbnQgY2FtX2luc2VydGVkWzJdOworCWludCBjYW1fZGF0YV9yZWFkeVsyXTsKKworCWludCBwb2xsX21vZGU7CisjZGVmaW5lIFNUT1BfTU9ERSAwCisjZGVmaW5lIFBPTExfTU9ERSAxCisjZGVmaW5lIElOVF9NT0RFICAyCisKKwlpbnQgaXJxOworCWludCBpcnFfaW87CisJaW50IHJzdF9pbzsKKworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3b3JrcTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7CisJaW50IHdvcmtfY250OworCisJREVGX0xPQ0sobG9jayk7CisjZGVmaW5lIGxvY2tfaW5pdChfc3BpKSBtdXRleF9pbml0KCYoX3NwaSktPmxvY2spCisjZGVmaW5lIGxvY2tfbG9jayhfc3BpKSBkbyB7XAorCWludCBlcnIgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJihfc3BpKS0+bG9jayk7XAorCWlmIChlcnIpXAorCQlyZXR1cm4gZXJyO1wKK30gd2hpbGUgKDApCisjZGVmaW5lIGxvY2tfdW5sb2NrKF9zcGkpIG11dGV4X3VubG9jaygmKF9zcGkpLT5sb2NrKQorCisJdTggKmNpczsKKyNkZWZpbmUgQ0lTX01BWCA1MTIKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2ltYXhfc3BpICpnX3NwaTsKKworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImVuYWJsZSB2ZXJib3NlIGRlYnVnIG1lc3NhZ2VzIik7CitzdGF0aWMgaW50IGNpbWF4X3NwaV9kZWJ1ZyA9IDE7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGNpbWF4X3NwaV9kZWJ1ZywgaW50LCAwNjQ0KTsKKworTU9EVUxFX1BBUk1fREVTQyhwb2xsX2ludGVydmFsLCAiaW50ZXJ2YWwgZm9yIHNwaSBwb2xsIik7CitzdGF0aWMgaW50IHNwaV9wb2xsX2ludGVydmFsID0gMTAwOworbW9kdWxlX3BhcmFtX25hbWVkKHBvbGxfaW50ZXJ2YWwsIHNwaV9wb2xsX2ludGVydmFsLCBpbnQsIDA2NDQpOworCitNT0RVTEVfUEFSTV9ERVNDKHBvbGxfbW9kZSwgInNldCBjaW1heCBwb2xsIG1vZGUsIG5lZWQgcmVzZXQiKTsKK3N0YXRpYyBpbnQgY2ltYXhfcG9sbF9tb2RlID0gMTsKK21vZHVsZV9wYXJhbV9uYW1lZChwb2xsX21vZGUsIGNpbWF4X3BvbGxfbW9kZSwgaW50LCAwNjQ0KTsKKworTU9EVUxFX1BBUk1fREVTQyhjYW1faXJxX21vZGUsICJzZXQgY2FtIGlycSBtb2RlLCBuZWVkIHJlc2V0Iik7CitzdGF0aWMgaW50IGNhbV9pcnFfbW9kZTsKK21vZHVsZV9wYXJhbV9uYW1lZChjYW1faXJxX21vZGUsIGNhbV9pcnFfbW9kZSwgaW50LCAwNjQ0KTsKKworI2RlZmluZSBDSU1BWF9SRUdfUkVBRCAgICAgMHhmZgorI2RlZmluZSBDSU1BWF9SRUdfUkVBRF9PSyAgMHg0YworI2RlZmluZSBDSU1BWF9SRUdfV1JJVEUgICAgMHg3ZgorI2RlZmluZSBDSU1BWF9SRUdfV1JJVEVfT0sgMHg0ZAorI2RlZmluZSBDSU1BWF9SRUdfSU5JVCAgICAgMHgwMAorI2RlZmluZSBDSU1BWF9SRUdfSU5JVF9PSyAgMHg0YgorI2RlZmluZSBDSU1BWF9SRUdfQ01EX0VSUk9SIDB4NTEKKworI2RlZmluZSBDSU1BWF9DQU1fUkVTRVQgICAgMHgwMQorI2RlZmluZSBDSU1BWF9DQU1fUkVTRVRfT0sgMHg0MAorI2RlZmluZSBDSU1BWF9DQU1fQ0lTICAgICAgMHgwMgorI2RlZmluZSBDSU1BWF9DQU1fQ0lTX09LICAgMHg0MQorI2RlZmluZSBDSU1BWF9DQU1fQ09SICAgICAgMHgwMworI2RlZmluZSBDSU1BWF9DQU1fQ09SX09LICAgMHg0MgorI2RlZmluZSBDSU1BWF9DQU1fTkVHICAgICAgMHgwNAorI2RlZmluZSBDSU1BWF9DQU1fTkVHX09LICAgMHg0MworI2RlZmluZSBDSU1BWF9DQU1fV0xQRFUgICAgMHgwNQorI2RlZmluZSBDSU1BWF9DQU1fV0xQRFVfT0sgMHg0NAorI2RlZmluZSBDSU1BWF9DQU1fUkxQRFUgICAgMHgwNgorI2RlZmluZSBDSU1BWF9DQU1fUkxQRFVfT0sgMHg0NgorI2RlZmluZSBDSU1BWF9DQU1fRVZUICAgICAgICAgMHgwZAorI2RlZmluZSBDSU1BWF9DQU1fREVUX09LICAgICAgMHg0NQorI2RlZmluZSBDSU1BWF9DQU1fTk9DQU0gICAgICAgMHg0OQorI2RlZmluZSBDSU1BWF9DQU1fRVJST1IgICAgICAgMHg0YQorI2RlZmluZSBDSU1BWF9DQU1fTk9FVlQgICAgICAgMHg1NQorI2RlZmluZSBDSU1BWF9DQU1fREFUQV9SRUFEWSAgMHg0ZQorI2RlZmluZSBDSU1BWF9DQU1fV0JVU1kgICAgICAgMHg1NAorI2RlZmluZSBDSU1BWF9DQU1fUEVORElORyAgICAgMHg1NgorI2RlZmluZSBDSU1BWF9DQU1fUkVHU1RBVCAgICAgMHgwZQorI2RlZmluZSBDSU1BWF9DQU1fUkVHU1RBVF9PSyAgMHg1NworCisKKyNkZWZpbmUgQ0lNQVhfQ0FNX1BLVF9DTlRfVkFMIDEKKworI2RlZmluZSBDSU1BWF9TTE9UX0EgMAorI2RlZmluZSBDSU1BWF9TTE9UX0IgMQorCisjZGVmaW5lIENJTUFYX0NNRF9SRVNQX01BU0sgMHg3ZgorCisjZGVmaW5lIGNpbWF4X3RvX3NwaShfYykgKChzdHJ1Y3QgY2ltYXhfc3BpICopKChfYyktPnByaXYpKQorI2RlZmluZSBkZXZfdG9fc3BpKF9kKSAoKHN0cnVjdCBjaW1heF9zcGkgKilzcGlfZ2V0X2RydmRhdGEoX2QpKQorCisjZGVmaW5lIGJ5dGVfdG9fdTE2KF9iMSwgX2IyKSAgICgoKF9iMSk8PDgpIHwgKF9iMikpCisKKyNkZWZpbmUgaGRyX2NtZF9yZXNwKF9zKSAgICAgKChfcyktPmJ1ZlswXSAmIENJTUFYX0NNRF9SRVNQX01BU0spCisKKyNkZWZpbmUgcmVnX2hkcihfcykgICAgICAgICAgKChfcyktPmJ1ZikKKyNkZWZpbmUgcmVnX2FkZHIoX3MpICAgICAgICAgYnl0ZV90b191MTYoKF9zKS0+YnVmWzFdLCAoX3MpLT5idWZbMl0pCisjZGVmaW5lIHJlZ19oZHJfZGF0X3NpemUoX3MpICgoX3MpLT5idWZbM10pCisjZGVmaW5lIHJlZ19kYXQoX3MpICAgICAgICAgICgmKChfcyktPmJ1ZltDSU1BWF9SRUdfSERSX1NJWkVdKSkKKworI2RlZmluZSBjYW1faGRyKF9zKSAgICAgICAgICAoKF9zKS0+YnVmKQorI2RlZmluZSBjYW1faGRyX3Nsb3QoX3MpICAgICAoKChfcyktPmJ1ZlswXSAmIDB4ODApID8gMSA6IDApCisjZGVmaW5lIGNhbV9oZHJfcGt0X2NudChfcykgICgoX3MpLT5idWZbMV0pCisjZGVmaW5lIGNhbV9oZHJfZGF0X3NpemUoX3MpIGJ5dGVfdG9fdTE2KChfcyktPmJ1ZlsyXSwgKF9zKS0+YnVmWzNdKQorI2RlZmluZSBjYW1fZGF0KF9zKSAgICAgICAgICAoJigoX3MpLT5idWZbQ0lNQVhfQ0FNX0hEUl9TSVpFXSkpCisKKyNkZWZpbmUgUkVHX1RJTUVPVVQgNTAwCisjZGVmaW5lIENBTV9USU1FT1VUIDUwMDAKKworI2RlZmluZSBVU0VfSU5UX1BJTworCitzdGF0aWMgaW50IGFtbF9jaW1heF9zcGlfbW9kX2luaXQodm9pZCk7CitzdGF0aWMgdm9pZCBhbWxfY2ltYXhfc3BpX21vZF9leGl0KHZvaWQpOworCitzdGF0aWMgdm9pZCBkdW1wKGNoYXIgKnRpdGxlLCB1OCAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlpbnQgaTsKKwlwcl9pbmZvKCIlc1xuIiwgdGl0bGUpOworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJaWYgKCEoaSAmIDB4ZikpCisJCQlwcl9pbmZvKCJcblx0Iik7CisJCXByX2luZm8oIiUwMnggIiwgKihidWYraSkpOworCX0KKwlwcl9pbmZvKCJcbiIpOworfQorCitzdGF0aWMgdm9pZCBwZXJyKGNoYXIgKmVyciwgc3RydWN0IGNpbWF4X3NwaSAqc3BpKQoreworCXByX2Vycm9yKCJlcnJvcjogJXNcbiIsIGVycik7CisJZHVtcCgiZHVtcDoiLCBzcGktPmJ1ZiwgMTYpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X2ppZmZpZXModm9pZCkKK3sKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpKHNjaGVkX2Nsb2NrKCkvMTAwMDAwMDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3NwaV9jYW1fcmVhZHkoc3RydWN0IGNpbWF4X3NwaSAqc3BpLCBpbnQgc2xvdCkKK3sKKwlpZiAoc3BpLT5jYW1faW5zZXJ0ZWRbc2xvdF0gPT0gMSkgeworCQlzcGktPmNhbV9pbnNlcnRlZFtzbG90XSA9IDI7CisJCWFtbF9jaW1heF9zbG90X3N0YXRlX2NoYW5nZWQoc3BpLT5jaW1heCwKKwkJCXNsb3QsIHNwaS0+Y2FtX2luc2VydGVkW3Nsb3RdKTsKKwl9Cit9CisKKworc3RhdGljIGludCBjaW1heF9zcGlfZ2V0X3Jlc3Aoc3RydWN0IGNpbWF4X3NwaSAqc3BpLCBpbnQgdGltZW91dCkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqZGV2ID0gc3BpLT5kZXY7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IGdldF9qaWZmaWVzKCk7CisjaWZuZGVmIFVTRV9JTlRfUElPCisJdTggdCA9IDA7CisKKwl3aGlsZSAoIXQgJiYgamlmZmllc190b19tc2VjcyhnZXRfamlmZmllcygpIC0gc3RhcnQpIDwgdGltZW91dCkgeworCQlyZXQgPSBzcGlfcmVhZChkZXYsICZ0LCAxKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKKwl9CisJaWYgKCF0KSB7CisJCXByX2Vycm9yKCJyZXNwIHRpbWVvdXQ6ICVkbXNcbiIsIHRpbWVvdXQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJY2FtX2hkcihzcGkpWzBdID0gdDsKKwlyZXQgPSBzcGlfcmVhZChkZXYsIGNhbV9oZHIoc3BpKSsxLCBDSU1BWF9DQU1fSERSX1NJWkUtMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKyNlbHNlCisJZG8geworCQlpZiAoamlmZmllc190b19tc2VjcyhnZXRfamlmZmllcygpIC0gc3RhcnQpID49IHRpbWVvdXQpIHsKKwkJCXByX2Vycm9yKCJyZXNwIHRpbWVvdXQ6ICVkbXNcbiIsIHRpbWVvdXQpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOworCX0gd2hpbGUgKGdwaW9fZ2V0X3ZhbHVlKHNwaS0+aXJxX2lvKSk7CisKKwlyZXQgPSBzcGlfcmVhZChkZXYsIGNhbV9oZHIoc3BpKSwgQ0lNQVhfQ0FNX0hEUl9TSVpFKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworI2VuZGlmCisJLypwcl9kYmcoInJwOiAlMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQljYW1faGRyKHNwaSlbMF0sIGNhbV9oZHIoc3BpKVsxXSwKKwkJY2FtX2hkcihzcGkpWzJdLCBjYW1faGRyKHNwaSlbM10pOyovCisJc3dpdGNoIChoZHJfY21kX3Jlc3Aoc3BpKSkgeworCWNhc2UgQ0lNQVhfUkVHX1JFQURfT0s6CisJY2FzZSBDSU1BWF9SRUdfV1JJVEVfT0s6CisJY2FzZSBDSU1BWF9SRUdfSU5JVF9PSzoKKwljYXNlIENJTUFYX1JFR19DTURfRVJST1I6IHsKKwkJaW50IGxlbiA9IHJlZ19oZHJfZGF0X3NpemUoc3BpKTsKKwkJaWYgKGxlbikgeworCQkJcmV0ID0gc3BpX3JlYWQoZGV2LCByZWdfZGF0KHNwaSksIGxlbik7CisJCQlpZiAocmV0ICE9IDApCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCQl9IGJyZWFrOworCWNhc2UgQ0lNQVhfQ0FNX1JFU0VUX09LOgorCWNhc2UgQ0lNQVhfQ0FNX0NJU19PSzoKKwljYXNlIENJTUFYX0NBTV9DT1JfT0s6CisJY2FzZSBDSU1BWF9DQU1fTkVHX09LOgorCWNhc2UgQ0lNQVhfQ0FNX1dMUERVX09LOgorCWNhc2UgQ0lNQVhfQ0FNX1JMUERVX09LOgorCWNhc2UgQ0lNQVhfQ0FNX05PQ0FNOgorCWNhc2UgQ0lNQVhfQ0FNX0VSUk9SOgorCWNhc2UgQ0lNQVhfQ0FNX1dCVVNZOgorCWNhc2UgQ0lNQVhfQ0FNX0RFVF9PSzoKKwljYXNlIENJTUFYX0NBTV9EQVRBX1JFQURZOgorCWNhc2UgQ0lNQVhfQ0FNX1BFTkRJTkc6CisJY2FzZSBDSU1BWF9DQU1fUkVHU1RBVF9PSzoKKwljYXNlIENJTUFYX0NBTV9OT0VWVDogeworCQlpbnQgbGVuID0gY2FtX2hkcl9kYXRfc2l6ZShzcGkpOworCQlpZiAobGVuKSB7CisJCQlyZXQgPSBzcGlfcmVhZChkZXYsIGNhbV9kYXQoc3BpKSwgbGVuKTsKKwkJCWlmIChyZXQgIT0gMCkKKwkJCQlyZXR1cm4gcmV0OworCQkJLyppZiAobGVuKQorCQkJCWR1bXAoImRhdDoiLCBjYW1fZGF0KHNwaSksIGxlbik7Ki8KKwkJfQorCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2Vycm9yKCJ1bmtub3duIHJlc3A6MHglMDJ4XG4iLCBoZHJfY21kX3Jlc3Aoc3BpKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbml0X3JlZ19oZHIodTggKmhkciwgdTggdGFnLCBpbnQgYWRkciwgaW50IHNpemUpCit7CisJaGRyWzBdID0gdGFnOworCWhkclsxXSA9IChhZGRyPj44KSAmIDB4ZmY7CisJaGRyWzJdID0gYWRkciAmIDB4ZmY7CisJaGRyWzNdID0gc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGVja19yZWdfaGRyKHU4ICpoZHIsIHU4IHRhZywgaW50IGFkZHIsIGludCBzaXplKQoreworCXJldHVybiBoZHJbMF0gIT0gdGFnCisJCXx8IGhkclsxXSAhPSAoKGFkZHI+PjgpICYgMHhmZikKKwkJfHwgaGRyWzJdICE9IChhZGRyICYgMHhmZikKKwkJfHwgaGRyWzNdICE9IHNpemU7Cit9CisKK3N0YXRpYyBpbnQgYW1sX2NpbWF4X3NwaV9yZWFkX3JlZyhzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCwgaW50IGFkZHIsCisJCXU4ICpidWYsIGludCBzaXplKQoreworCXN0cnVjdCBjaW1heF9zcGkgKnNwaSA9IGNpbWF4X3RvX3NwaShjaW1heCk7CisJc3RydWN0IHNwaV9kZXZpY2UgKmRldiA9IHNwaS0+ZGV2OworCWludCBlcnIgPSAwOworCisJaW5pdF9yZWdfaGRyKHNwaS0+YnVmLCBDSU1BWF9SRUdfUkVBRCwgYWRkciwgc2l6ZSk7CisKKwlsb2NrX2xvY2soc3BpKTsKKworCXByX2RiZygicmQgJTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJcmVnX2hkcihzcGkpWzBdLCByZWdfaGRyKHNwaSlbMV0sCisJCXJlZ19oZHIoc3BpKVsyXSwgcmVnX2hkcihzcGkpWzNdKTsKKwllcnIgPSBzcGlfd3JpdGUoZGV2LCBzcGktPmJ1ZiwgQ0lNQVhfUkVHX0hEUl9TSVpFKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVuZDsKKwllcnIgPSBjaW1heF9zcGlfZ2V0X3Jlc3Aoc3BpLCBSRUdfVElNRU9VVCk7CisJaWYgKGVycikKKwkJZ290byBlbmQ7CisJaWYgKGNoZWNrX3JlZ19oZHIocmVnX2hkcihzcGkpLCBDSU1BWF9SRUdfUkVBRF9PSywgYWRkciwgc2l6ZSkgIT0gMCkgeworCQlwZXJyKCJyZWFkIHJlZyBmYWlsLiIsIHNwaSk7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZW5kOworCX0KKwltZW1jcHkoYnVmLCByZWdfZGF0KHNwaSksIHNpemUpOworZW5kOgorCWxvY2tfdW5sb2NrKHNwaSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBhbWxfY2ltYXhfc3BpX3dyaXRlX3JlZyhzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCwgaW50IGFkZHIsCisJCXU4ICpidWYsIGludCBzaXplKQoreworCXN0cnVjdCBjaW1heF9zcGkgKnNwaSA9IGNpbWF4X3RvX3NwaShjaW1heCk7CisJc3RydWN0IHNwaV9kZXZpY2UgKmRldiA9IHNwaS0+ZGV2OworCWludCBlcnIgPSAwOworCisJaW5pdF9yZWdfaGRyKHNwaS0+YnVmLCBDSU1BWF9SRUdfV1JJVEUsIGFkZHIsIHNpemUpOworCW1lbWNweSgmc3BpLT5idWZbQ0lNQVhfUkVHX0hEUl9TSVpFXSwgYnVmLCBzaXplKTsKKworCWxvY2tfbG9jayhzcGkpOworCisJcHJfZGJnKCJ3ciAlMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQlyZWdfaGRyKHNwaSlbMF0sIHJlZ19oZHIoc3BpKVsxXSwKKwkJcmVnX2hkcihzcGkpWzJdLCByZWdfaGRyKHNwaSlbM10pOworCWVyciA9IHNwaV93cml0ZShkZXYsIHNwaS0+YnVmLCBDSU1BWF9SRUdfSERSX1NJWkUgKyBzaXplKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVuZDsKKwllcnIgPSBjaW1heF9zcGlfZ2V0X3Jlc3Aoc3BpLCBSRUdfVElNRU9VVCk7CisJaWYgKGVycikKKwkJZ290byBlbmQ7CisJaWYgKGNoZWNrX3JlZ19oZHIocmVnX2hkcihzcGkpLCBDSU1BWF9SRUdfV1JJVEVfT0ssIGFkZHIsIDApICE9IDApIHsKKwkJcGVycigid3JpdGUgcmVnIGZhaWwuIiwgc3BpKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorZW5kOgorCWxvY2tfdW5sb2NrKHNwaSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSBpbnQgaW5pdF9jYW1faGRyKHU4ICpoZHIsIGludCBjbWQsIGludCBzaXplKQoreworCWhkclswXSA9IGNtZDsKKwloZHJbMV0gPSBDSU1BWF9DQU1fUEtUX0NOVF9WQUw7CisJaGRyWzJdID0gKHNpemU+PjgpICYgMHhmZjsKKwloZHJbM10gPSBzaXplICYgMHhmZjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY2FtX2VycihzdHJ1Y3QgY2ltYXhfc3BpICpzcGkpCit7CisJaWYgKGhkcl9jbWRfcmVzcChzcGkpICE9IENJTUFYX0NBTV9FUlJPUgorCQl8fCBjYW1faGRyX3BrdF9jbnQoc3BpKSAhPSBDSU1BWF9DQU1fUEtUX0NOVF9WQUwKKwkJfHwgY2FtX2hkcl9kYXRfc2l6ZShzcGkpICE9IDIpCisJCXJldHVybiAwOworCXJldHVybiBieXRlX3RvX3UxNihjYW1fZGF0KHNwaSlbMF0sIGNhbV9kYXQoc3BpKVsxXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgY2hhciAqY2FtX2Vycl9zdHIoaW50IGVycikKK3sKKyNkZWZpbmUgQ0FNRVJST1JfUkVTRVQgICAgICAgICAgIDB4MDEwMQorI2RlZmluZSBDQU1FUlJPUl9DSVNfQlVGICAgICAgICAgMHgwMjAxCisjZGVmaW5lIENBTUVSUk9SX0NJU19TSVpFICAgICAgICAweDAyMDIKKyNkZWZpbmUgQ0FNRVJST1JfQ0FNX05PVF9BQ1QgICAgIDB4MDIwMworI2RlZmluZSBDQU1FUlJPUl9DT1JfTk9UX1JFQURZICAgMHgwMzAxCisjZGVmaW5lIENBTUVSUk9SX0NPUl9WQUxfQ0hLICAgICAweDAzMDIKKyNkZWZpbmUgQ0FNRVJST1JfTkVHX05PX1JFU1AgICAgIDB4MDQwMQorI2RlZmluZSBDQU1FUlJPUl9ORUdfQkFEX1NJWkUgICAgMHgwNDAyCisjZGVmaW5lIENBTUVSUk9SX05FR19OT1RfUkVBRFkgICAweDA0MDMKKyNkZWZpbmUgQ0FNRVJST1JfTFBEVV9OT1RfQVZBSUwgIDB4MDYwMQorCXN0cnVjdCB7IGludCBlcnI7IGNoYXIgKnN0cjsgfSBjYW1fZXJyX3N0cmluZ3NbXSA9IHsKKwkJe0NBTUVSUk9SX1JFU0VULCAicmVzZXQgZXJyb3IsIG5vdCByZWFkeS4ifSwKKwkJe0NBTUVSUk9SX0NJU19CVUYsICJjaXMgZXJyb3IsIGJ1ZmZlciBub3QgYWxsb2NhdGVkLiJ9LAorCQl7Q0FNRVJST1JfQ0lTX1NJWkUsICJjaXMgZXJyb3IsIGJhZCBjaXMgc2l6ZS4ifSwKKwkJe0NBTUVSUk9SX0NBTV9OT1RfQUNULCAiY2FtIG5vdCBhY3RpdmF0ZWQuIn0sCisJCXtDQU1FUlJPUl9DT1JfTk9UX1JFQURZLCAiY2FtIG5vdCByZWFkeSBkdXJpbmcgd3JpdGUgQ09SLiJ9LAorCQl7Q0FNRVJST1JfQ09SX1ZBTF9DSEssICJDT1IgdmFsdWUgY2hlY2sgZmFpbGVkLiJ9LAorCQl7Q0FNRVJST1JfTkVHX05PX1JFU1AsICJjYW0gbm90IHJlc3BvbmRpbmcgd2hlbiBuZWdvdGlhdGlvbi4ifSwKKwkJe0NBTUVSUk9SX05FR19CQURfU0laRSwgImNhbSBidWYgc2l6ZSBsZW5ndGggIT0gMi4ifSwKKwkJe0NBTUVSUk9SX05FR19OT1RfUkVBRFksICJjYW0gbm90IHJlYWR5IGR1cmluZyBuZWdvdGlhdGlvbi4ifSwKKwkJe0NBTUVSUk9SX0xQRFVfTk9UX0FWQUlMLCAibHBkdSBub3QgYXZhaWxhYmxlLiJ9CisJfTsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOworCQlpIDwgc2l6ZW9mKGNhbV9lcnJfc3RyaW5ncykvc2l6ZW9mKGNhbV9lcnJfc3RyaW5nc1swXSk7IGkrKykgeworCQlpZiAoY2FtX2Vycl9zdHJpbmdzW2ldLmVyciA9PSBlcnIpCisJCQlyZXR1cm4gY2FtX2Vycl9zdHJpbmdzW2ldLnN0cjsKKwl9CisJcmV0dXJuICJlcnIgdW5rbm93bi4iOworfQorCitzdGF0aWMgaW50IGNpbWF4X3NwaV9hY2Nlc3NfY2FtKHN0cnVjdCBjaW1heF9zcGkgKnNwaSwgaW50IHNsb3QsCisJCWludCBjbWQsIHU4ICpidWYsIGludCBzaXplKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpkZXYgPSBzcGktPmRldjsKKwlpbnQgZXJyID0gMDsKKworCWNtZCB8PSBzbG90ID8gMHg4MCA6IDA7CisJaW5pdF9jYW1faGRyKGNhbV9oZHIoc3BpKSwgY21kLCBzaXplKTsKKwltZW1jcHkoY2FtX2RhdChzcGkpLCBidWYsIHNpemUpOworCS8qZHVtcCgiYWNjZXNzIGNhbToiLCBjYW1faGRyKHNwaSksIENJTUFYX0NBTV9IRFJfU0laRStzaXplKTsqLworCWVyciA9IHNwaV93cml0ZShkZXYsIGNhbV9oZHIoc3BpKSwgQ0lNQVhfQ0FNX0hEUl9TSVpFICsgc2l6ZSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBjaW1heF9zcGlfZ2V0X3Jlc3Aoc3BpLCBDQU1fVElNRU9VVCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlpZiAoY2FtX2hkcl9zbG90KHNwaSkgIT0gc2xvdCkgeworCQlwcl9lcnJvcigiZXhwZWN0IHNsb3QoJWQpLCBidXQgc2xvdCglZClcbiIsCisJCQlzbG90LCBjYW1faGRyX3Nsb3Qoc3BpKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzd2l0Y2ggKGhkcl9jbWRfcmVzcChzcGkpKSB7CisJY2FzZSBDSU1BWF9DQU1fTk9DQU06CisJCXByX2RiZygibm8gY2FtXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJYnJlYWs7CisJY2FzZSBDSU1BWF9DQU1fRVJST1I6CisJCXByX2Vycm9yKCJjYW0gZXJyb3JcbiIpOworCQlwcl9lcnJvcigiZXJyIGNvZGU6IDB4JTA0eCglcylcbiIsIGNhbV9lcnIoc3BpKSwKKwkJCWNhbV9lcnJfc3RyKGNhbV9lcnIoc3BpKSkpOworCQllcnIgPSAtRU5PREVWOworCQlicmVhazsKKwljYXNlIENJTUFYX0NBTV9XQlVTWToKKwkJcHJfZGJnKCJjYW0gYnVzeVxuIik7CisJCWVyciA9IC1FQlVTWTsKKwkJYnJlYWs7CisJY2FzZSBDSU1BWF9DQU1fUEVORElORzoKKwkJcHJfZGJnKCJjYW0gcGVuZGluZ1xuIik7CisJCWVyciA9IC1FQUdBSU47CisJCWJyZWFrOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGFtbF9jaW1heF9zcGlfcmVhZF9jaXMoc3RydWN0IGFtbF9jaW1heCAqY2ltYXgsIGludCBzbG90LAorCQl1OCAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgY2ltYXhfc3BpICpzcGkgPSBjaW1heF90b19zcGkoY2ltYXgpOworCWludCBlcnIgPSAwOworCWludCBsZW47CisKKwlsb2NrX2xvY2soc3BpKTsKKworCWVyciA9IGNpbWF4X3NwaV9hY2Nlc3NfY2FtKHNwaSwgc2xvdCwgQ0lNQVhfQ0FNX0NJUywgTlVMTCwgMCk7CisJaWYgKGVycikKKwkJZ290byBlbmQ7CisJaWYgKGhkcl9jbWRfcmVzcChzcGkpICE9IENJTUFYX0NBTV9DSVNfT0sKKwkJfHwgY2FtX2hkcl9wa3RfY250KHNwaSkgIT0gQ0lNQVhfQ0FNX1BLVF9DTlRfVkFMKSB7CisJCXBlcnIoInJlYWQgY2lzIGZhaWwuIiwgc3BpKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCWxlbiA9IGNhbV9oZHJfZGF0X3NpemUoc3BpKTsKKwlpZiAoc2l6ZSA8IGxlbikgeworCQlwcl9lcnJvcigiY2lzIHNpemUgdG9vIGxhcmdlLCBleHBlY3Q8JWQsIGJ1dDolZFxuIiwgc2l6ZSwgbGVuKTsKKwkJcGVycigiY2lzIGZhaWwuIiwgc3BpKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCW1lbWNweShidWYsIGNhbV9kYXQoc3BpKSwgbGVuKTsKKworCWlmICghc3BpLT5jaXMpCisJCXNwaS0+Y2lzID0ga3phbGxvYygobGVuIDwgNTEyKSA/IDUxMiA6IGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKHNwaS0+Y2lzKQorCQltZW1jcHkoc3BpLT5jaXMsIGNhbV9kYXQoc3BpKSwgbGVuKTsKKworZW5kOgorCWxvY2tfdW5sb2NrKHNwaSk7CisJcmV0dXJuIGVycjsKK30KKyNkZWZpbmUgQ0lNQVhfQ0FNX0NPUl9QTERfU0laRSA1CitzdGF0aWMgaW50IGFtbF9jaW1heF9zcGlfd3JpdGVfY29yKHN0cnVjdCBhbWxfY2ltYXggKmNpbWF4LCBpbnQgc2xvdCwKKwkJaW50IGFkZHIsIHU4ICpidWYpCit7CisJc3RydWN0IGNpbWF4X3NwaSAqc3BpID0gY2ltYXhfdG9fc3BpKGNpbWF4KTsKKwlpbnQgZXJyID0gMDsKKwl1OCBvdXRbQ0lNQVhfQ0FNX0NPUl9QTERfU0laRSArIDhdOworCWludCBzeiA9IENJTUFYX0NBTV9DT1JfUExEX1NJWkU7CisKKwlvdXRbMF0gPSBhZGRyPj44ICYgMHhmZjsKKwlvdXRbMV0gPSBhZGRyICYgMHhmZjsKKwlvdXRbMl0gPSBidWZbMF07CisJb3V0WzNdID0gMDsKKwlvdXRbNF0gPSAwOworCisJaWYgKCFjYW1faXJxX21vZGUpIHsKKwkJb3V0WzVdID0gMHg0MDsvKmNhbSBwb2xsIG1vZGUqLworCQlzeisrOworCX0KKworCWxvY2tfbG9jayhzcGkpOworCisJZXJyID0gY2ltYXhfc3BpX2FjY2Vzc19jYW0oc3BpLCBzbG90LCBDSU1BWF9DQU1fQ09SLCBvdXQsIHN6KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVuZDsKKwlpZiAoaGRyX2NtZF9yZXNwKHNwaSkgIT0gQ0lNQVhfQ0FNX0NPUl9PSworCQl8fCBjYW1faGRyX3BrdF9jbnQoc3BpKSAhPSBDSU1BWF9DQU1fUEtUX0NOVF9WQUwKKwkJfHwgY2FtX2hkcl9kYXRfc2l6ZShzcGkpICE9IDApIHsKKwkJcGVycigid3JpdGUgY29yIGZhaWwuIiwgc3BpKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorZW5kOgorCWxvY2tfdW5sb2NrKHNwaSk7CisJcmV0dXJuIGVycjsKK30KKyNkZWZpbmUgQ0lNQVhfQ0FNX05FR19QTERfU0laRSAyCitzdGF0aWMgaW50IGFtbF9jaW1heF9zcGlfbmVnb3RpYXRlKHN0cnVjdCBhbWxfY2ltYXggKmNpbWF4LCBpbnQgc2xvdCwgaW50IHNpemUpCit7CisJc3RydWN0IGNpbWF4X3NwaSAqc3BpID0gY2ltYXhfdG9fc3BpKGNpbWF4KTsKKwlpbnQgcmV0ID0gMDsKKwl1OCBvdXRbQ0lNQVhfQ0FNX05FR19QTERfU0laRV07CisKKwlvdXRbMF0gPSAoc2l6ZT4+OCkgJiAweGZmOworCW91dFsxXSA9IHNpemUgJiAweGZmOworCisJbG9ja19sb2NrKHNwaSk7CisKKwlyZXQgPSBjaW1heF9zcGlfYWNjZXNzX2NhbShzcGksIHNsb3QsIENJTUFYX0NBTV9ORUcsCisJCQlvdXQsIENJTUFYX0NBTV9ORUdfUExEX1NJWkUpOworCWlmIChyZXQpCisJCWdvdG8gZW5kOworCWlmIChoZHJfY21kX3Jlc3Aoc3BpKSAhPSBDSU1BWF9DQU1fTkVHX09LCisJCXx8IGNhbV9oZHJfcGt0X2NudChzcGkpICE9IENJTUFYX0NBTV9QS1RfQ05UX1ZBTAorCQl8fCBjYW1faGRyX2RhdF9zaXplKHNwaSkgIT0gMikgeworCQlwZXJyKCJuZWdvdGlhdGUgZmFpbC4iLCBzcGkpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9CisJcmV0ID0gYnl0ZV90b191MTYoY2FtX2RhdChzcGkpWzBdLCBjYW1fZGF0KHNwaSlbMV0pOworCisJc2V0X3NwaV9jYW1fcmVhZHkoc3BpLCBzbG90KTsKK2VuZDoKKwlsb2NrX3VubG9jayhzcGkpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYW1sX2NpbWF4X3NwaV93cml0ZV9scGR1KHN0cnVjdCBhbWxfY2ltYXggKmNpbWF4LCBpbnQgc2xvdCwKKwkJdTggKmJ1ZiwgaW50IHNpemUpCit7CisJc3RydWN0IGNpbWF4X3NwaSAqc3BpID0gY2ltYXhfdG9fc3BpKGNpbWF4KTsKKwlpbnQgcmV0ID0gMDsKKworCWxvY2tfbG9jayhzcGkpOworCisJLypkdW1wKCJscGR1IC0+IiwgYnVmLCBzaXplKTsqLworCXJldCA9IGNpbWF4X3NwaV9hY2Nlc3NfY2FtKHNwaSwgc2xvdCwgQ0lNQVhfQ0FNX1dMUERVLCBidWYsIHNpemUpOworCWlmIChyZXQpCisJCWdvdG8gZW5kOworCWlmIChoZHJfY21kX3Jlc3Aoc3BpKSAhPSBDSU1BWF9DQU1fV0xQRFVfT0sKKwkJfHwgY2FtX2hkcl9wa3RfY250KHNwaSkgIT0gQ0lNQVhfQ0FNX1BLVF9DTlRfVkFMCisJCXx8IGNhbV9oZHJfZGF0X3NpemUoc3BpKSAhPSAwKSB7CisJCXBlcnIoIndyaXRlIGxwZHUgZmFpbC4iLCBzcGkpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9CisJcmV0ID0gc2l6ZTsKK2VuZDoKKwlsb2NrX3VubG9jayhzcGkpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYW1sX2NpbWF4X3NwaV9yZWFkX2xwZHUoc3RydWN0IGFtbF9jaW1heCAqY2ltYXgsIGludCBzbG90LAorCQl1OCAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgY2ltYXhfc3BpICpzcGkgPSBjaW1heF90b19zcGkoY2ltYXgpOworCWludCByZXQgPSAwOworCisJbG9ja19sb2NrKHNwaSk7CisKKwlyZXQgPSBjaW1heF9zcGlfYWNjZXNzX2NhbShzcGksIHNsb3QsIENJTUFYX0NBTV9STFBEVSwgTlVMTCwgMCk7CisJaWYgKHJldCkKKwkJZ290byBlbmQ7CisJaWYgKGhkcl9jbWRfcmVzcChzcGkpICE9IENJTUFYX0NBTV9STFBEVV9PSworCQl8fCBjYW1faGRyX3BrdF9jbnQoc3BpKSAhPSBDSU1BWF9DQU1fUEtUX0NOVF9WQUwpIHsKKwkJcGVycigicmVhZCBscGR1IGZhaWwuIiwgc3BpKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCXJldCA9IGNhbV9oZHJfZGF0X3NpemUoc3BpKTsKKwltZW1jcHkoYnVmLCBjYW1fZGF0KHNwaSksIHJldCk7CisKKwkvKmR1bXAoImxwZHUgPC0iLCBidWYsIHJldCk7Ki8KKworCXNwaS0+Y2FtX2RhdGFfcmVhZHlbc2xvdF0gPSAwOworZW5kOgorCWxvY2tfdW5sb2NrKHNwaSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhbWxfY2ltYXhfc3BpX3JlYWRfY2FtX3N0YXR1cyhzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCwgaW50IHNsb3QpCit7CisJc3RydWN0IGNpbWF4X3NwaSAqc3BpID0gY2ltYXhfdG9fc3BpKGNpbWF4KTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChjYW1faXJxX21vZGUgJiYgc3BpLT5jYW1fZGF0YV9yZWFkeVtzbG90XSkKKwkJcmV0dXJuIDB4ODA7CisKKwlsb2NrX2xvY2soc3BpKTsKKworCXJldCA9IGNpbWF4X3NwaV9hY2Nlc3NfY2FtKHNwaSwgc2xvdCwgQ0lNQVhfQ0FNX1JFR1NUQVQsIE5VTEwsIDApOworCWlmIChyZXQpCisJCWdvdG8gZW5kOworCWlmIChoZHJfY21kX3Jlc3Aoc3BpKSAhPSBDSU1BWF9DQU1fUkVHU1RBVF9PSworCQl8fCBjYW1faGRyX3BrdF9jbnQoc3BpKSAhPSBDSU1BWF9DQU1fUEtUX0NOVF9WQUwKKwkJfHwgY2FtX2hkcl9kYXRfc2l6ZShzcGkpICE9IDEpIHsKKwkJcGVycigicmVhZCBjYW0gc3RhdHVzIGZhaWwuIiwgc3BpKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCisJcmV0ID0gY2FtX2RhdChzcGkpWzBdOworZW5kOgorCWxvY2tfdW5sb2NrKHNwaSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhbWxfY2ltYXhfc3BpX3Nsb3RfcmVzZXQoc3RydWN0IGFtbF9jaW1heCAqY2ltYXgsIGludCBzbG90KQoreworCXN0cnVjdCBjaW1heF9zcGkgKnNwaSA9IGNpbWF4X3RvX3NwaShjaW1heCk7CisJaW50IHJldCA9IDA7CisKKwlzcGktPmNhbV9kYXRhX3JlYWR5W3Nsb3RdID0gMDsKKworCWxvY2tfbG9jayhzcGkpOworCisJcmV0ID0gY2ltYXhfc3BpX2FjY2Vzc19jYW0oc3BpLCBzbG90LCBDSU1BWF9DQU1fUkVTRVQsIE5VTEwsIDApOworCWlmIChyZXQpCisJCWdvdG8gZW5kOworCWlmIChoZHJfY21kX3Jlc3Aoc3BpKSAhPSBDSU1BWF9DQU1fUkVTRVRfT0sKKwkJfHwgY2FtX2hkcl9wa3RfY250KHNwaSkgIT0gQ0lNQVhfQ0FNX1BLVF9DTlRfVkFMCisJCXx8IGNhbV9oZHJfZGF0X3NpemUoc3BpKSAhPSAwKSB7CisJCXBlcnIoInNsb3QgcmVzZXQgZmFpbC4iLCBzcGkpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9CitlbmQ6CisJbG9ja191bmxvY2soc3BpKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFtbF9jaW1heF9zcGlfY2FtX3Jlc2V0KHN0cnVjdCBhbWxfY2ltYXggKmNpbWF4LCBpbnQgc2xvdCkKK3sKKwlwcl9kYmcoIlNsb3QoJWQpOiBjYW1yZXNldFxuIiwgc2xvdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1sX2NpbWF4X3NwaV9zbG90X3NodXRkb3duKHN0cnVjdCBhbWxfY2ltYXggKmNpbWF4LCBpbnQgc2xvdCkKK3sKKwlwcl9kYmcoIlNsb3QoJWQpOiBzaHV0ZG93blxuIiwgc2xvdCk7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IGFtbF9jaW1heF9zcGlfc2xvdF90c19lbmFibGUoc3RydWN0IGFtbF9jaW1heCAqY2ltYXgsIGludCBzbG90KQoreworCXByX2RiZygiU2xvdCglZCk6IHRzIGNvbnRyb2xcbiIsIHNsb3QpOworCXJldHVybiAwOworfQorc3RhdGljIGludCBhbWxfY2ltYXhfc3BpX3Nsb3Rfc3RhdHVzKHN0cnVjdCBhbWxfY2ltYXggKmNpbWF4LCBpbnQgc2xvdCkKK3sKKwlzdHJ1Y3QgY2ltYXhfc3BpICpzcGkgPSBjaW1heF90b19zcGkoY2ltYXgpOworCWlmIChzcGktPmNhbV9pbnNlcnRlZFtzbG90XSkgeworCQkvKnByX2RiZygiQ0EgTW9kdWxlIHByZXNlbnQgYW5kIHJlYWR5XG4iKTsqLworCQlyZXR1cm4gRFZCX0NBX0VONTAyMjFfUE9MTF9DQU1fUFJFU0VOVCB8CisJCQlEVkJfQ0FfRU41MDIyMV9QT0xMX0NBTV9SRUFEWTsKKwl9IGVsc2UgeworCQkvKnByX2Vycm9yKCJDQSBNb2R1bGUgbm90IHByZXNlbnQgb3Igbm90IHJlYWR5XG4iKTsqLworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaW1heF9zcGlfY2FtX3BsdWdpbihzdHJ1Y3QgY2ltYXhfc3BpICpzcGksIGludCBzbG90LCBpbnQgcGx1Z2luKQoreworCXByX2RiZygiY2FtIHBsdWc6IHNsb3QoJWQpICVzXG4iLAorCQlzbG90LCBwbHVnaW4gPyAicGx1Z2dlZCIgOiAidW5wbHVnZ2VkIik7CisJcmV0dXJuIGFtbF9jaW1heF9jYW1jaGFuZ2VkKHNwaS0+Y2ltYXgsIHNsb3QsIHBsdWdpbik7Cit9CisKK3N0YXRpYyBpbnQgY2ltYXhfc3BpX3BvbGwoc3RydWN0IGNpbWF4X3NwaSAqc3BpKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpkZXYgPSBzcGktPmRldjsKKwlpbnQgZXJyID0gMDsKKworCWxvY2tfbG9jayhzcGkpOworCisjaWZkZWYgVVNFX0lOVF9QSU8KKwlpZiAoZ3Bpb19nZXRfdmFsdWUoc3BpLT5pcnFfaW8pKQorCQlnb3RvIGVuZDsKKyNlbmRpZgorCisJaW5pdF9yZWdfaGRyKHNwaS0+YnVmLCBDSU1BWF9DQU1fRVZULCAweDEwMCwgMCk7CisJZXJyID0gc3BpX3dyaXRlKGRldiwgc3BpLT5idWYsIENJTUFYX1JFR19IRFJfU0laRSk7CisJaWYgKGVycikKKwkJZ290byBlbmQ7CisJZXJyID0gY2ltYXhfc3BpX2dldF9yZXNwKHNwaSwgQ0FNX1RJTUVPVVQpOworCWlmIChlcnIpCisJCWdvdG8gZW5kOworCXN3aXRjaCAoaGRyX2NtZF9yZXNwKHNwaSkpIHsKKwljYXNlIENJTUFYX0NBTV9ERVRfT0s6IHsKKwkJaW50IHNsb3QgPSBjYW1faGRyX3Nsb3Qoc3BpKTsKKwkJaW50IGluc2VydCA9IGNhbV9kYXQoc3BpKVswXTsKKwkJaWYgKCEhc3BpLT5jYW1faW5zZXJ0ZWRbc2xvdF0gIT0gaW5zZXJ0KSB7CisJCQlzcGktPmNhbV9pbnNlcnRlZFtzbG90XSA9IGluc2VydDsKKwkJCWNpbWF4X3NwaV9jYW1fcGx1Z2luKHNwaSwgc2xvdCwgaW5zZXJ0KTsKKwkJCWFtbF9jaW1heF9zbG90X3N0YXRlX2NoYW5nZWQoc3BpLT5jaW1heCwgc2xvdCwKKwkJCQlzcGktPmNhbV9pbnNlcnRlZFtzbG90XSk7CisJCX0KKwkJfSBicmVhazsKKwljYXNlIENJTUFYX0NBTV9EQVRBX1JFQURZOiB7CisJCWludCBzbG90ID0gY2FtX2hkcl9zbG90KHNwaSk7CisJCXNwaS0+Y2FtX2RhdGFfcmVhZHlbc2xvdF0gPSAxOworCQl9IGJyZWFrOworCWNhc2UgQ0lNQVhfQ0FNX05PRVZUOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnJvcigidW5rbm93biByZXNwOiUwMnhcbiIsIGhkcl9jbWRfcmVzcChzcGkpKTsKKwkJYnJlYWs7CisJfQorZW5kOgorCXF1ZXVlX2RlbGF5ZWRfd29yayhzcGktPndvcmtxLCAmc3BpLT53b3JrLCBzcGlfcG9sbF9pbnRlcnZhbCk7CisJbG9ja191bmxvY2soc3BpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2ltYXhfc3BpX3BvbGxfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGNpbWF4X3NwaSAqc3BpID0KKwkJY29udGFpbmVyX29mKHRvX2RlbGF5ZWRfd29yayh3b3JrKSwgc3RydWN0IGNpbWF4X3NwaSwgd29yayk7CisJc3BpLT53b3JrX2NudCsrOworCWNpbWF4X3NwaV9wb2xsKHNwaSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBjaW1heF9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwYXJhKQoreworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworI2RlZmluZSBDVFJMX0RJU0FCTEUgLTEKKyNkZWZpbmUgQ1RSTF9TVE9QICAgICAwCisjZGVmaW5lIENUUkxfU1RBUlQgICAgMQorCitzdGF0aWMgaW5saW5lIGludCBjaW1heF9zcGlfcG9sbF9jdHJsKHN0cnVjdCBjaW1heF9zcGkgKnNwaSwgaW50IGN0cmwpCit7CisJaWYgKGN0cmwgPT0gQ1RSTF9TVEFSVCkgeworCQlzcGktPndvcmtxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImNpbWF4X3NwaSIpOworCQlJTklUX0RFTEFZRURfV09SSygmc3BpLT53b3JrLCAmY2ltYXhfc3BpX3BvbGxfd29yayk7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhzcGktPndvcmtxLAorCQkJJnNwaS0+d29yaywgc3BpX3BvbGxfaW50ZXJ2YWwpOworCQlwcl9kYmcoInBvbGwgc3RhcnRlZFxuIik7CisJfSBlbHNlIHsKKwkJaWYgKCFzcGktPndvcmtxKQorCQkJcmV0dXJuIDA7CisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmc3BpLT53b3JrKTsKKwkJZGVzdHJveV93b3JrcXVldWUoc3BpLT53b3JrcSk7CisJCXNwaS0+d29ya3EgPSBOVUxMOworCQlwcl9kYmcoInBvbGwgc3RvcHBlZFxuIik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjaW1heF9zcGlfaW50cl9jdHJsKHN0cnVjdCBjaW1heF9zcGkgKnNwaSwgaW50IGN0cmwpCit7CisJaWYgKGN0cmwgPT0gQ1RSTF9TVEFSVCkgeworCQlpbnQgcmV0OworCQlpZiAoc3BpLT5pcnEgPT0gLTEpIHsKKwkJCXByX2Vycm9yKCJpbmNvcnJlY3QgaXJxIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJcmV0ID0gcmVxdWVzdF9pcnEoc3BpLT5pcnEsIGNpbWF4X2lycV9oYW5kbGVyLAorCQkJSVJRRl9TSEFSRUR8SVJRRl9UUklHR0VSX1JJU0lORywKKwkJCSJjaW1heCBpcnEiLCBzcGkpOworCQllbmFibGVfaXJxKHNwaS0+aXJxKTsKKwl9IGVsc2UgeworCQlpZiAoc3BpLT5pcnEgPT0gLTEpCisJCQlyZXR1cm4gMDsKKwkJZGlzYWJsZV9pcnEoc3BpLT5pcnEpOworCQlmcmVlX2lycShzcGktPmlycSwgc3BpKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2ltYXhfc3BpX3NldHVwX3BvbGwoc3RydWN0IGNpbWF4X3NwaSAqc3BpLCBpbnQgcG9sbF9tb2RlKQoreworCWlmIChwb2xsX21vZGUgPT0gc3BpLT5wb2xsX21vZGUpCisJCXJldHVybiAwOworCXN3aXRjaCAocG9sbF9tb2RlKSB7CisJY2FzZSBQT0xMX01PREU6CisJCWlmIChzcGktPnBvbGxfbW9kZSA9PSBJTlRfTU9ERSkKKwkJCWNpbWF4X3NwaV9pbnRyX2N0cmwoc3BpLCBDVFJMX0RJU0FCTEUpOworCQljaW1heF9zcGlfcG9sbF9jdHJsKHNwaSwgQ1RSTF9TVEFSVCk7CisJCXNwaS0+cG9sbF9tb2RlID0gUE9MTF9NT0RFOworCQlicmVhazsKKwljYXNlIElOVF9NT0RFOgorCQlpZiAoc3BpLT5wb2xsX21vZGUgPT0gUE9MTF9NT0RFKQorCQkJY2ltYXhfc3BpX3BvbGxfY3RybChzcGksIENUUkxfRElTQUJMRSk7CisJCWNpbWF4X3NwaV9pbnRyX2N0cmwoc3BpLCBDVFJMX1NUQVJUKTsKKwkJc3BpLT5wb2xsX21vZGUgPSBJTlRfTU9ERTsKKwkJYnJlYWs7CisJY2FzZSBTVE9QX01PREU6CisJCWlmIChzcGktPnBvbGxfbW9kZSA9PSBQT0xMX01PREUpCisJCQljaW1heF9zcGlfcG9sbF9jdHJsKHNwaSwgQ1RSTF9ESVNBQkxFKTsKKwkJZWxzZSBpZiAoc3BpLT5wb2xsX21vZGUgPT0gSU5UX01PREUpCisJCQljaW1heF9zcGlfaW50cl9jdHJsKHNwaSwgQ1RSTF9ESVNBQkxFKTsKKwkJc3BpLT5wb2xsX21vZGUgPSBTVE9QX01PREU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaW1heF9zcGlfaHdfcmVzZXQoc3RydWN0IGNpbWF4X3NwaSAqc3BpLCBpbnQgcmVzZXRfdmFsKQoreworCS8qdHJpZ2dlciByZXNldCBpbyovCisJaWYgKHNwaS0+cnN0X2lvKSB7CisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChzcGktPnJzdF9pbywgcmVzZXRfdmFsID8gMSA6IDApOworCQltc2xlZXAoNTApOworCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3BpLT5yc3RfaW8sIHJlc2V0X3ZhbCA/IDAgOiAxKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworZW51bSByZWdPcGVyYXRpb25fZSB7CisJLyoqIFJlYWQgcmVnaXN0ZXIuICovCisJUkVHX09QX1JFQUQsCisJLyoqIFdyaXRlIHJlZ2lzdGVyLiAqLworCVJFR19PUF9XUklURSwKKwkvKiogUmVhZCByZWdpc3RlciB1bnRpbCBzb21lIGJpdHMgYXJlIHNldC4gKi8KKwlSRUdfT1BfV0FJVF9UT19CRV9TRVQsCisJLyoqIFJlYWQgcmVnaXN0ZXIgdW50aWwgc29tZSBiaXRzIGFyZSBjbGVhcmVkLiAqLworCVJFR19PUF9XQUlUX1RPX0JFX0NMRUFSRUQsCisJLyoqIFJlYWQgcmVnaXN0ZXIgdW50aWwgaXQncyB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gZGVmaW5lZC4gKi8KKwlSRUdfT1BfV0FJVF9FUVVBTCwKKwkvKiogUGVyZm9ybSBsb2dpY2FsIEFORCBvdmVyIHJlZ2lzdGVyLiAqLworCVJFR19PUF9MT0dJQ0FMX0FORCwKKwkvKiogUGVyZm9ybSBsb2dpY2FsIE9SIG92ZXIgcmVnaXN0ZXIuICovCisJUkVHX09QX0xPR0lDQUxfT1IsCisJLyoqIFdhaXQgdGltZW91dCBpbiBtaWxpc2Vjb25kcy4gKi8KKwlSRUdfT1BfV0FJVAorfTsKKworc3RydWN0IHJlZ1NldHRpbmdzX3MgeworCS8qKiBDSU1hWCsgcmVnaXN0ZXIgYWRkcmVzcy4gKi8KKwl1MTYgICAgICAgICByZWc7CisJLyoqIENJTWFYKyByZWdpc3RlciB2YWx1ZS4gKi8KKwl1MTYgICAgICAgICB2YWw7CisJLyoqIENJTWFYKyByZWdpc3RlciBvcGVyYXRpb24uICovCisJZW51bSByZWdPcGVyYXRpb25fZSBvcDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVnU2V0dGluZ3NfcyBzcGlSZWdTZXR0aW5nc1tdID0geworCS8qKiBUUyBpbnRlcmZhY2UgaW5pdC4gKi8KKwl7SU5fU0VMLCAgICAgICAgICAweDAwLCBSRUdfT1BfV1JJVEV9LCAgICAgICAgICAvKiogQ2xvc2UgVFMgaW5wdXQuICovCisJe09VVF9TRUwsICAgICAgICAgMHgwMCwgUkVHX09QX1dSSVRFfSwgICAgICAgICAgLyoqIENsb3NlIFRTIG91dHB1dC4gKi8KKwl7RklGT19DVFJMLCAgICAgICAweDBmLCBSRUdfT1BfV1JJVEV9LCAgICAgICAgICAvKiogUmVzZXQgVFMgRklGTy4gICovCisJe1NZTkNfUlRWX0NUUkwsICAgMHgwZiwgUkVHX09QX1dSSVRFfSwKKworCS8qKiBDQU0gcG93ZXIuICovCisJe0dQSU8wX0RBVEFfT1VULCAgMHgwMCwgUkVHX09QX1dSSVRFfSwKKwkvKiogVW5sb2NrIENGRy4gKi8KKwl7Q0ZHXzIsICAgICAgICAgICAweDAwLCBSRUdfT1BfV1JJVEV9LAorCS8qKiAxKSBEVkIvQ0kvQ0krL1NDQVJEIDJzbG90LiAqLworCXtDRkdfMSwgICAgICAgICAgIDB4MDAsIFJFR19PUF9XUklURX0sCisJLyoqIDIpIFNldCB0aGUgRGVmYXVsdCAicG93ZXIgb2ZmIiBzdGF0ZQorCXN1Y2ggYXMgVkNDX01PREE9VkNDX01PREI9VlBQeF9NT0RBPVZQUHhfTU9EQj0nWicuICovCisJe0dQSU8wX0RGVCwgICAgICAgMHgwMCwgUkVHX09QX1dSSVRFfSwKKwkvKiogMykgU2V0IEdQSU8zIGFzIGV4dGVybmFsIHBvd2VyIHN3aXRjaCBkcml2ZXIuICovCisJe0dQSU8wX01BU0tfREFUQSwgMHgwNywgUkVHX09QX1dSSVRFfSwKKwkvKiogNCkgU2V0ICJwb3dlciBvbiIgc3RhdGUgKFZDQz1WUFAxPVZQUDI9IDVWKS4gKi8KKwl7R1BJTzBfREFUQV9PVVQsICAweDAzLCBSRUdfT1BfV1JJVEV9LAorCS8qKiA1KSBMb2NrIGNvbmZpZy4gKi8KKwl7Q0ZHXzIsICAgICAgICAgICAweDAxLCBSRUdfT1BfV1JJVEV9LAorCS8qKiA2KSBXcml0ZSBpbiB0aGUgR1BJTzBfRElSX1JFRzogZGVmaW5lcyB0aGUgR1BJT3MsCisJd2hpY2ggYXJlIHVzZWQgdG8gZHJpdmUgdGhlIGV4dGVybmFsIHBvd2VyIHN3aXRjaCwgaW4gb3V0cHV0IG1vZGUuICovCisJe0dQSU8wX0RJUiwgICAgICAgMHgwNywgUkVHX09QX1dSSVRFfSwKKwkvKiogNykgQ2hlY2sgVkNDRU5hYmxlLiAqLworCXtDRkdfMSwgICAgICAgICAgIDB4MjAsIFJFR19PUF9XQUlUX1RPX0JFX1NFVH0sCisJLyoqIDgpIFNldCAmIHdhaXQgZm9yIFBjbWNpYU91dHB1dEVuYWJsZS4gKi8KKwl7Q0ZHXzEsICAgICAgICAgICAweDA4LCBSRUdfT1BfTE9HSUNBTF9PUn0sCisJe0NGR18xLCAgICAgICAgICAgMHgwOCwgUkVHX09QX1dBSVRfVE9fQkVfU0VUfSwKKworCS8qKiBTZXQgcm91dGVyIENBTS4gKi8KKwkvKiogQ0gwICYgQ0gxIGZyb20gQ0FNIEEgJiBCLCBDQU0gQSAmIEIgZnJvbSBDSDAgJiBDSDEuICovCisJe1JPVVRFUl9DQU1fTU9ELCAgMHgyMSwgUkVHX09QX1dSSVRFfSwKKwl7Uk9VVEVSX0NBTV9DSCwgICAweDAwLCBSRUdfT1BfV1JJVEV9LAorCS8qKiBXYWl0IDIwMCBtaWxpc2Vjb25kcy4gKi8KKwl7MHgwMDAwLCAgICAgICAgICAyMDAsICBSRUdfT1BfV0FJVH0sCisKKwkvKiogU2V0IEluL091dC4gKi8KKwkvKiogUm91dGUgQ0FNIENoYW5uZWwgMCB0byBDaGFubmVsIDAsIENoYW5uZWwgMSBudWxsLiAqLworCXtST1VURVJfQ0FNX0NILCAgIDB4ODAsIFJFR19PUF9XUklURX0sCisKKyNpZmRlZiBQQVJBTExFTF9PVVQKKyNlbHNlCisjaWYgMQorCS8qNzJNIGludGVybmFsIGNsb2NrIHNvdXJjZSovCisJLypDTEsgU2VsZWN0IFNFUjAtPjcyTSovCisJe0NrTWFuX1NlbGVjdCwgICAgMHgyMCwgUkVHX09QX1dSSVRFfSwKKwkvKkVuYWJsZSBTRVIwIGNsayBzb3VyY2UsIEVuYWJsZSA3Mk0gY2xrIHNvdXJjZSovCisJe0NrTWFuX0NvbmZpZywgICAgMHg0NCwgUkVHX09QX0xPR0lDQUxfT1J9LAorI2Vsc2UKKwkvKjEwOE0gaW50ZXJuYWwgY2xvY2sgc291cmNlKi8KKwkvKkNMSyBTZWxlY3QgU0VSMC0+MTA4TSovCisJe0NrTWFuX1NlbGVjdCwgICAgMHgzMCwgUkVHX09QX1dSSVRFfSwKKwkvKkVuYWJsZSBTRVIwIGNsayBzb3VyY2UsIEVuYWJsZSAxMDhNIGNsayBzb3VyY2UqLworCXtDa01hbl9Db25maWcsICAgIDB4NDgsIFJFR19PUF9MT0dJQ0FMX09SfSwKKyNlbmRpZgorCXtQMlNfQ0gwX0NUUkwsICAgIDB4MTksIFJFR19PUF9XUklURX0sICAgICAgICAgICAvKkVuYWJsZSBwMnMqLworCXtPVVRfU0VMLCAgICAgICAgIDB4MDIsIFJFR19PUF9XUklURX0sICAgICAgICAgICAvKk91dDE9cDJzMCovCisjZW5kaWYgLypQYXJhbGxlbCBvdXQqLworCisJLyoqIElucHV0IENoMD1QYXJhbGxlbCwgQ2gxPW51bGwuICovCisJe0lOX1NFTCwgICAgICAgICAgMHgwMSwgUkVHX09QX1dSSVRFfSwKK307CisKK2ludCBkb3dubG9hZENmZyhzdHJ1Y3QgY2ltYXhfc3BpICpzcGkpCit7CisJdTMyICAgY250OworCXU4ICAgIGJ1ZltDSU1BWF9SRUdfUExEX1NJWkVdOworCXN0cnVjdCBhbWxfY2ltYXggKmNpbWF4ID0gc3BpLT5jaW1heDsKKworCXByX2luZm8oIkRvd25sb2FkIENJTWFYKyBjb25maWd1cmF0aW9uKHJlZ2lzdGVyIHNldHRpbmdzKTpcbiIpOworCisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2Yoc3BpUmVnU2V0dGluZ3MpL3NpemVvZihzdHJ1Y3QgcmVnU2V0dGluZ3Nfcyk7CisJCQljbnQrKykgeworCQlwcl9kYmcoInJlZzolMDR4LCB2YWw6JTAyeCwgb3A6JWRcbiIsCisJCQkJc3BpUmVnU2V0dGluZ3NbY250XS5yZWcsCisJCQkJc3BpUmVnU2V0dGluZ3NbY250XS52YWwsCisJCQkJc3BpUmVnU2V0dGluZ3NbY250XS5vcCk7CisJCXN3aXRjaCAoc3BpUmVnU2V0dGluZ3NbY250XS5vcCkgeworCQljYXNlIFJFR19PUF9SRUFEOgorCQkJLyogUmVhZCByZWdpc3Rlci4gKi8KKwkJCWlmIChhbWxfY2ltYXhfc3BpX3JlYWRfcmVnKGNpbWF4LAorCQkJCQlzcGlSZWdTZXR0aW5nc1tjbnRdLnJlZywgYnVmLCAxKSA8IDApIHsKKwkJCQkvKiBDSU1hWCsgcmVhZCBlcnJvci4gKi8KKwkJCQlwcl9lcnJvcigiRkFJTEVEIGF0IFJFR19PUF9SRUFEIG9wZXJhdGlvbi5cbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFJFR19PUF9XUklURToKKwkJCS8qIFdyaXRlIHJlZ2lzdGVyLiAqLworCQkJaWYgKGFtbF9jaW1heF9zcGlfd3JpdGVfcmVnKGNpbWF4LAorCQkJCQlzcGlSZWdTZXR0aW5nc1tjbnRdLnJlZywKKwkJCQkJKHU4ICopJnNwaVJlZ1NldHRpbmdzW2NudF0udmFsLAorCQkJCQkxKSA8IDApIHsKKwkJCQkvKiBDSU1hWCsgd3JpdGUgZXJyb3IuICovCisJCQkJcHJfZXJyb3IoIkZBSUxFRCBhdCBSRUdfT1BfV1JJVEUgb3BlcmF0aW9uLlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUkVHX09QX1dBSVRfVE9fQkVfU0VUOgorCQkJZG8geworCQkJCWlmIChhbWxfY2ltYXhfc3BpX3JlYWRfcmVnKGNpbWF4LAorCQkJCQlzcGlSZWdTZXR0aW5nc1tjbnRdLnJlZywgYnVmLCAxKSA8IDApIHsKKwkJCQkJLyogQ0lNYVgrIHJlYWQgZXJyb3IuICovCisJCQkJCXByX2Vycm9yKCJFIFJFR19PUF9XQUlUX1RPX0JFX1NFVFxuIik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQl9IHdoaWxlICgoYnVmWzBdICYgc3BpUmVnU2V0dGluZ3NbY250XS52YWwpCisJCQkJCSE9IHNwaVJlZ1NldHRpbmdzW2NudF0udmFsKTsKKwkJCWJyZWFrOworCQljYXNlIFJFR19PUF9XQUlUX1RPX0JFX0NMRUFSRUQ6CisJCQlkbyB7CisJCQkJaWYgKGFtbF9jaW1heF9zcGlfcmVhZF9yZWcoY2ltYXgsCisJCQkJCXNwaVJlZ1NldHRpbmdzW2NudF0ucmVnLCBidWYsIDEpIDwgMCkgeworCQkJCQkvKiBDSU1hWCsgcmVhZCBlcnJvci4gKi8KKwkJCQkJcHJfZXJyb3IoIlJFR19PUF9XQUlUX1RPX0JFX0NMRUFSRURcbiIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJfSB3aGlsZSAoKGJ1ZlswXSAmIHNwaVJlZ1NldHRpbmdzW2NudF0udmFsKSAhPSAwKTsKKwkJCWJyZWFrOworCQljYXNlIFJFR19PUF9XQUlUX0VRVUFMOgorCQkJZG8geworCQkJCWlmIChhbWxfY2ltYXhfc3BpX3JlYWRfcmVnKGNpbWF4LAorCQkJCQlzcGlSZWdTZXR0aW5nc1tjbnRdLnJlZywgYnVmLCAxKSA8IDApIHsKKwkJCQkJLyogQ0lNYVgrIHJlYWQgZXJyb3IuICovCisJCQkJCXByX2Vycm9yKCJSRUdfT1BfV0FJVF9FUVVBTC5cbiIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJfSB3aGlsZSAoYnVmWzBdICE9IHNwaVJlZ1NldHRpbmdzW2NudF0udmFsKTsKKwkJCWJyZWFrOworCQljYXNlIFJFR19PUF9MT0dJQ0FMX0FORDoKKwkJCWlmIChhbWxfY2ltYXhfc3BpX3JlYWRfcmVnKGNpbWF4LAorCQkJCXNwaVJlZ1NldHRpbmdzW2NudF0ucmVnLCBidWYsIDEpIDwgMCkgeworCQkJCS8qIENJTWFYKyByZWFkIGVycm9yLiAqLworCQkJCXByX2Vycm9yKCJGQUlMRUQgYXQgUkVHX09QX0xPR0lDQUxfQU5EKHIpLlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYnVmWzBdICY9ICBzcGlSZWdTZXR0aW5nc1tjbnRdLnZhbDsKKwkJCWlmIChhbWxfY2ltYXhfc3BpX3dyaXRlX3JlZyhjaW1heCwKKwkJCQlzcGlSZWdTZXR0aW5nc1tjbnRdLnJlZywgYnVmLCAxKSA8IDApIHsKKwkJCQkvKiBDSU1hWCsgd3JpdGUgZXJyb3IuICovCisJCQkJcHJfZXJyb3IoIkZBSUxFRCBhdCBSRUdfT1BfTE9HSUNBTF9BTkQodykuXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBSRUdfT1BfTE9HSUNBTF9PUjoKKwkJCWlmIChhbWxfY2ltYXhfc3BpX3JlYWRfcmVnKGNpbWF4LAorCQkJCXNwaVJlZ1NldHRpbmdzW2NudF0ucmVnLCBidWYsIDEpIDwgMCkgeworCQkJCS8qIENJTWFYKyByZWFkIGVycm9yLiAqLworCQkJCXByX2Vycm9yKCJGQUlMRUQgYXQgUkVHX09QX0xPR0lDQUxfT1IocikuXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlidWZbMF0gfD0gIHNwaVJlZ1NldHRpbmdzW2NudF0udmFsOworCQkJaWYgKGFtbF9jaW1heF9zcGlfd3JpdGVfcmVnKGNpbWF4LAorCQkJCXNwaVJlZ1NldHRpbmdzW2NudF0ucmVnLCBidWYsIDEpIDwgMCkgeworCQkJCS8qIENJTWFYKyB3cml0ZSBlcnJvci4gKi8KKwkJCQlwcl9lcnJvcigiRkFJTEVEIGF0IFJFR19PUF9MT0dJQ0FMX0FORCh3KS5cbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFJFR19PUF9XQUlUOgorCQkJbXNsZWVwKHNwaVJlZ1NldHRpbmdzW2NudF0udmFsKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJfZXJyb3IoIlxuSW52YWxpZCBvcGVyYXRpb24gMHglMDJ4IVxuIiwKKwkJCQlzcGlSZWdTZXR0aW5nc1tjbnRdLm9wKTsKKwkJfQorCX0KKwlwcl9pbmZvKCJjb25maWcgT0suXG4iKTsKKwlyZXR1cm4gMDsKK30KKworCisjZGVmaW5lIENJTUFYX0ZXX1BLVF9TSVpFICAgIDEyOAorI2RlZmluZSBDSU1BWF9GV19TVEFSVF9BRERSICAweDgwMDAKKyNkZWZpbmUgQ0lNQVhfRldfU1RPUF9BRERSICAgMHhjZmY5CisjZGVmaW5lIENJTUFYX0ZXX1ZFQ1RfQUREUiAgIDB4ZmZmYQorI2RlZmluZSBDSU1BWF9GV19WRUNUX1NJWkUgICA2CisKK3N0YXRpYyB1MzIgY29tcHV0ZV9iaXN0cm9tKGNvbnN0IHU4ICpwdHIsIGludCBzaXplLCB1MzIgc2lnbikKK3sKKwlpbnQgaywgaTsKKwl1MTYgczsKKworCWZvciAoayA9IDA7IGsgPCBzaXplOyBrKyspIHsKKwkJcyA9IHB0cltrXSYweDAxOworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJCWlmICgweDg4QjcgJiAoMTw8aSkpCisJCQkJcyBePSAoc2lnbj4+aSkgJiAweDAxOworCQlzIHw9ICgoc2lnbjw8MSkgXiAocHRyW2tdKSkgJiAweDAwRkU7CisJCXMgfD0gKHNpZ248PDEpICYgMHgwMEZGMDA7CisJCXNpZ24gPSBzOworCX0KKwlyZXR1cm4gc2lnbjsKK30KKworc3RhdGljIGludCBjaW1heF9zcGlfdXBsb2FkX2Zpcm13YXJlKHN0cnVjdCBjaW1heF9zcGkgKnNwaSwKKwkJY29uc3QgdTggKmZ3X2RhdGEsIHUzMiAqc2lnbikKK3sKKwlzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCA9IHNwaS0+Y2ltYXg7CisJaW50IGVyciA9IDA7CisJaW50IGFkZHI7CisJY29uc3QgdTggKnB0cjsKKwlpbnQgc2l6ZTsKKwlpbnQgZGVidWcgPSBjaW1heF9zcGlfZGVidWc7CisJdTggKnB0bXAgPSBremFsbG9jKENJTUFYX0ZXX1BLVF9TSVpFICsgQ0lNQVhfUkVHX0hEUl9TSVpFLCBHRlBfS0VSTkVMKTsKKworCWlmICghcHRtcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljaW1heF9zcGlfZGVidWcgPSAwOworCisJYWRkciA9IENJTUFYX0ZXX1NUQVJUX0FERFI7CisJcHRyID0gZndfZGF0YSArIGFkZHI7CisJd2hpbGUgKGFkZHIgPCBDSU1BWF9GV19TVE9QX0FERFIpIHsKKwkJc2l6ZSA9IChhZGRyIDw9IChDSU1BWF9GV19TVE9QX0FERFIrMS1DSU1BWF9GV19QS1RfU0laRSkpID8KKwkJCUNJTUFYX0ZXX1BLVF9TSVpFIDogKENJTUFYX0ZXX1NUT1BfQUREUisxLWFkZHIpOworCisJCSpzaWduID0gY29tcHV0ZV9iaXN0cm9tKHB0ciwgc2l6ZSwgKnNpZ24pOworCisJCXByX2RiZygiPj4leEAleFxuIiwgc2l6ZSwgYWRkcik7CisKKwkJLypkdW1wKCJ3OiIsICh1OCopcHRyLCBzaXplKTsqLworCQllcnIgPSBhbWxfY2ltYXhfc3BpX3dyaXRlX3JlZyhjaW1heCwgYWRkciwgKHU4ICopcHRyLCBzaXplKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCQllcnIgPSBhbWxfY2ltYXhfc3BpX3JlYWRfcmVnKGNpbWF4LCBhZGRyLCBwdG1wLCBzaXplKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCQkvKmR1bXAoInI6IiwgcHRtcCwgc2l6ZSk7Ki8KKwkJaWYgKG1lbWNtcChwdHIsIHB0bXAsIHNpemUpKSB7CisJCQlwcl9lcnJvcigiZncgd3JpdGUgZXJyb3IuXG4iKTsKKwkJCWVyciA9IC1FTk9ERVY7CisJCQlicmVhazsKKwkJfQorCisJCWFkZHIgKz0gc2l6ZTsKKwkJcHRyICs9IHNpemU7CisJfQorCisJaWYgKCFlcnIpIHsKKwkJYWRkciA9IENJTUFYX0ZXX1ZFQ1RfQUREUjsKKwkJcHRyID0gZndfZGF0YSArIGFkZHI7CisJCXNpemUgPSBDSU1BWF9GV19WRUNUX1NJWkU7CisKKwkJKnNpZ24gPSBjb21wdXRlX2Jpc3Ryb20ocHRyLCBzaXplLCAqc2lnbik7CisKKwkJZXJyID0gYW1sX2NpbWF4X3NwaV93cml0ZV9yZWcoY2ltYXgsIGFkZHIsICh1OCAqKXB0ciwgc2l6ZSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVuZDsKKwkJZXJyID0gYW1sX2NpbWF4X3NwaV9yZWFkX3JlZyhjaW1heCwgYWRkciwgcHRtcCwgc2l6ZSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVuZDsKKwkJaWYgKG1lbWNtcChwdHIsIHB0bXAsIHNpemUpKSB7CisJCQlwcl9lcnJvcigiZncgdmVjdCB3cml0ZSBlcnJvci5cbiIpOworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gZW5kOworCQl9CisJfQorZW5kOgorCWtmcmVlKHB0bXApOworCisJY2ltYXhfc3BpX2RlYnVnID0gZGVidWc7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBjaW1heF9zcGlfY2hlY2tfYmlzdHJvbShzdHJ1Y3QgY2ltYXhfc3BpICpzcGksCisJCWludCBzdGFydCwgaW50IGVuZCwgdTMyIHNpZ24pCit7CisJc3RydWN0IGFtbF9jaW1heCAqY2ltYXggPSBzcGktPmNpbWF4OworCWludCBlcnIgPSAwOworCXU4IGJ1ZlsyXTsKKworCWJ1ZlswXSA9ICgweGQwMDAtc3RhcnQpICYgMHhmZjsKKwlidWZbMV0gPSAoMHhkMDAwLXN0YXJ0KSA+PiA4OworCWVyciA9IGFtbF9jaW1heF9zcGlfd3JpdGVfcmVnKGNpbWF4LCAweDhkLCBidWYsIDIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJYnVmWzBdID0gc2lnbiAmIDB4ZmY7CisJYnVmWzFdID0gc2lnbiA+PiA4OworCWVyciA9IGFtbF9jaW1heF9zcGlfd3JpdGVfcmVnKGNpbWF4LCAweDgwLCBidWYsIDIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJYnVmWzBdID0gMHhmOworCWVyciA9IGFtbF9jaW1heF9zcGlfd3JpdGVfcmVnKGNpbWF4LCAweDgyLCBidWYsIDEpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJZXJyID0gYW1sX2NpbWF4X3NwaV9yZWFkX3JlZyhjaW1heCwgMHg0MSwgYnVmLCAyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCXByX2RiZygiYmlzdCBjaGVja2VkOiAweCUwNHhcbiIsIGJ5dGVfdG9fdTE2KGJ1ZlswXSwgYnVmWzFdKSk7CisJZXJyID0gYW1sX2NpbWF4X3NwaV9yZWFkX3JlZyhjaW1heCwgMHgwOSwgYnVmLCAxKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCXByX2RiZygicm9tIHN0YXR1czogMHglMDJ4XG4iLCBidWZbMF0pOworCXJldHVybiBidWZbMF07Cit9CisKK3N0YXRpYyBpbnQgY2ltYXhfc3BpX2luaXRfZmlybXdhcmUoc3RydWN0IGNpbWF4X3NwaSAqc3BpKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpkZXYgPSBzcGktPmRldjsKKwlpbnQgZXJyID0gMDsKKworCWluaXRfcmVnX2hkcihzcGktPmJ1ZiwgQ0lNQVhfUkVHX0lOSVQsIDAsIDApOworCWVyciA9IHNwaV93cml0ZShkZXYsIHNwaS0+YnVmLCBDSU1BWF9SRUdfSERSX1NJWkUpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJZXJyID0gY2ltYXhfc3BpX2dldF9yZXNwKHNwaSwgUkVHX1RJTUVPVVQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJaWYgKGNoZWNrX3JlZ19oZHIoc3BpLT5idWYsIENJTUFYX1JFR19JTklUX09LLCAwLCAwKSkgeworCQlwZXJyKCJpbml0IGZ3IGZhaWwuIiwgc3BpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHJlcXVlc3RfZndfY2FsbGJhY2soY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywgdm9pZCAqY29udGV4dCkKK3sKKwl1MzIgc2lnbiA9IDA7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGNpbWF4X3NwaSAqc3BpID0gKHN0cnVjdCBjaW1heF9zcGkgKiljb250ZXh0OworCisJaWYgKCFmdykKKwkJcmV0dXJuOworCisJcHJfZGJnKCJnb3QgZnc6ICV6ZCBAICVwXG4iLCBmdy0+c2l6ZSwgZnctPmRhdGEpOworCisgICAgLypjaW1heF9zcGlfaHdfcmVzZXQoc3BpLCAxKTsqLworCisJZXJyID0gY2ltYXhfc3BpX3VwbG9hZF9maXJtd2FyZShzcGksIGZ3LT5kYXRhLCAmc2lnbik7CisJaWYgKGVycikKKwkJZ290byBlbmQ7CisJcHJfZGJnKCJ1cGxvYWQgZncgZG9uZS5cbiIpOworCWVyciA9IGNpbWF4X3NwaV9jaGVja19iaXN0cm9tKHNwaSwKKwkJQ0lNQVhfRldfU1RBUlRfQUREUiwgQ0lNQVhfRldfU1RPUF9BRERSLCBzaWduKTsKKwlpZiAoZXJyICE9IDB4MikKKwkJZ290byBlbmQ7CisJcHJfZGJnKCJjaGVjayBiaXN0cm9tIGRvbmUuXG4iKTsKKwllcnIgPSBjaW1heF9zcGlfaW5pdF9maXJtd2FyZShzcGkpOworCWlmIChlcnIpCisJCWdvdG8gZW5kOworZW5kOgorCWlmIChmdykKKwkJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJaWYgKGVycikKKwkJcmV0dXJuOworCisJaWYgKGRvd25sb2FkQ2ZnKHNwaSkpIHsKKwkJcHJfZXJyb3IoImRvd25sb2FkIGNvbmZpZyBmYWlsLlxuIik7CisJCXJldHVybjsKKwl9CisKKwljaW1heF9zcGlfc2V0dXBfcG9sbChzcGksIGNpbWF4X3BvbGxfbW9kZSA/IFBPTExfTU9ERSA6IElOVF9NT0RFKTsKKworCXJldHVybjsKK30KKworc3RhdGljIGludCBjaW1heF9zcGlfbG9hZF9mdyhzdHJ1Y3QgY2ltYXhfc3BpICpzcGkpCit7CisJY2hhciAqbmFtZSA9ICJjaW1heF9zcGlkdmIuYmluIjsKKwlyZXR1cm4gcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQoVEhJU19NT0RVTEUsIDEsIG5hbWUsCisJCQkmc3BpLT5kZXYtPmRldiwgR0ZQX0tFUk5FTCwgc3BpLCByZXF1ZXN0X2Z3X2NhbGxiYWNrKTsKK30KKworc3RhdGljIGludCBjaW1heF9zcGlfZGV2X3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgY2ltYXhfc3BpICpjaW1heF9zcGk7CisKKwlwcl9kYmcoImRldiBwcm9iZVxuIik7CisJLypzZXR1cCBhZ2Fpbj8qLworCXNwaS0+Yml0c19wZXJfd29yZCA9IDg7CisJcmV0ID0gc3BpX3NldHVwKHNwaSk7CisJaWYgKHJldCkKKwkJcHJfZGJnKCJzcGkgc2V0dXAgZmFpbGVkXG4iKTsKKworCWNpbWF4X3NwaSA9IGRldl9nZXRfcGxhdGRhdGEoJnNwaS0+ZGV2KTsKKwljaW1heF9zcGktPmRldiA9IHNwaTsKKworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIGNpbWF4X3NwaSk7CisKKwlyZXR1cm4gY2ltYXhfc3BpX2xvYWRfZncoY2ltYXhfc3BpKTsKK30KKworc3RhdGljIGludCBjaW1heF9zcGlfZGV2X3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBjaW1heF9zcGkgKmNpbWF4X3NwaSA9IGRldl9nZXRfZHJ2ZGF0YSgmc3BpLT5kZXYpOworCisJcHJfZGJnKCJkZXYgcmVtb3ZlXG4iKTsKKwljaW1heF9zcGlfc2V0dXBfcG9sbChjaW1heF9zcGksIFNUT1BfTU9ERSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2ltYXhfc3BpX2dldF9jb25maWdfZnJvbV9kdHMoc3RydWN0IGNpbWF4X3NwaSAqc3BpLAorCQlzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gKmJkaW5mbykKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkID0gTlVMTDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gc3BpLT5wZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCByZXQgPSAwOworCXByX2RiZygiZmV0Y2ggY2ltYXggc3BpIGluIGR0c1xuIik7CisKKwljaGlsZCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKG5wLCAiY2ltYXgiKTsKKwlpZiAoY2hpbGQgPT0gTlVMTCkgeworCQlwcl9lcnJvcigiY2ltYXggbm90IGZvdW5kIGluIGR0c1xuIik7CisJCXJldHVybiAtMTsKKwl9CisJY2hpbGQgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShjaGlsZCwgInNwaSIpOworCWlmICghY2hpbGQpIHsKKwkJcHJfZXJyb3IoInNwaSBub3QgZm91bmQgaW4gY2ltYXgiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGdldCBzcGkgY29uZmlnICovCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoY2hpbGQsICJidXNfbnVtIiwgJnZhbCk7CisJaWYgKHJldCkKKwkJcHJfZXJyb3IoImJ1c19udW0gbm90IGZvdW5kLCB1c2UgZGVmYXVsdC5cbiIpOworCWVsc2UKKwkJYmRpbmZvLT5idXNfbnVtID0gdmFsOworCXByX2RiZygiYnVzX251bTogJWRcbiIsIGJkaW5mby0+YnVzX251bSk7CisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoY2hpbGQsICJjaGlwX3NlbGVjdCIsICZ2YWwpOworCWlmIChyZXQpCisJCXByX2Vycm9yKCJjaGlwX3NlbGVjdCBub3QgZm91bmQsIHVzZSBkZWZhdWx0LlxuIik7CisJZWxzZQorCQliZGluZm8tPmNoaXBfc2VsZWN0ID0gdmFsOworCXByX2RiZygiY2hpcF9zZWxlY3Q6ICVkXG4iLCBiZGluZm8tPmNoaXBfc2VsZWN0KTsKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihjaGlsZCwgIm1heF9mcmVxdWVuY3kiLCAmdmFsKTsKKwlpZiAocmV0KQorCQlwcl9lcnJvcigibWF4X2ZyZXF1ZW5jeSBub3QgZm91bmQsIHVzZSBkZWZhdWx0LlxuIik7CisJZWxzZQorCQliZGluZm8tPm1heF9zcGVlZF9oeiA9IHZhbDsKKwlwcl9kYmcoIm1heF9zcGVlZF9oejogJWRcbiIsIGJkaW5mby0+bWF4X3NwZWVkX2h6KTsKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihjaGlsZCwgIm1vZGUiLCAmdmFsKTsKKwlpZiAocmV0KQorCQlwcl9lcnJvcigibW9kZSBub3QgZm91bmQsIHVzZSBkZWZhdWx0LlxuIik7CisJZWxzZQorCQliZGluZm8tPm1vZGUgPSB2YWw7CisJcHJfZGJnKCJtb2RlOiAlZFxuIiwgYmRpbmZvLT5tb2RlKTsKKy8qCitkdmJjaSB7CisJY29tcGF0aWJsZSA9ICJhbWxvZ2ljLCBkdmJjaSI7CisJZGV2X25hbWUgPSAiZHZiY2kiOworCWlvX3R5cGUgPSA8Mj47Ly8wOmlvYnVzLDE6c3BpLDI6Y2ltYXgKKwljaW1heCB7CisJCWlvX3R5cGUgPSA8MD4gLy8wOnNwaSAxOnVzYgorCQlzcGkgeworCQkJc3BpX2J1c19udW0gPSA8MD47CisJCQlzcGlfY2hpcF9zZWxlY3QgPSA8MD47CisJCQlzcGlfbWF4X2ZyZXF1ZW5jeSA9IDwzMDAwMDAwPjsKKworCQkJcnN0X2dwaW8gPSA8JmdwaW9fYW8gR1BJT0FPXzIgR1BJT19BQ1RJVkVfSElHSD47CisKKwkJCWlycV9ncGlvID0gPCZncGlvX2FvIEdQSU9BT18yIEdQSU9fQUNUSVZFX0hJR0g+OworCQkJaXJxID0gPDI+OworCQkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDY2IElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQl9OworCX07CisKK307CisqLworI2lmZGVmIFVTRV9JTlRfUElPCisJeworCQlpbnQgcmV0ID0gMDsKKwkJaW50IGdwaW8gPSAtMTsKKwkJZ3BpbyA9IG9mX2dldF9uYW1lZF9ncGlvX2ZsYWdzKGNoaWxkLCAiaXJxLWdwaW9zIiwgMCwgTlVMTCk7CisJCXJldCA9IGdwaW9fcmVxdWVzdChncGlvLCAiY2ltYXgtaXJxIik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnJvcigiaXJxLWdwaW9zIHJlcXVlc3QgZmFpbC5cbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXJldCA9IGdwaW9fZGlyZWN0aW9uX2lucHV0KGdwaW8pOworCisJCXNwaS0+aXJxX2lvID0gZ3BpbzsKKwkJcHJfZGJnKCJpcnFfaW86ICVkXG4iLCBzcGktPmlycV9pbyk7CisJfQorI2lmZGVmIENJTUFYX0lSUQorCXsKKwkJaW50IGlycTsKKwkJdW5zaWduZWQgaW50IGlycWZsYWc7CisJCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGNoaWxkLCAiaXJxIiwgJmdwaW9faXJxKTsKKwkJaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoY2hpbGQsIDApOworCisJCWdwaW9fZm9yX2lycShncGlvLAorCQkJQU1MX0dQSU9fSVJRKGdwaW9faXJxLCBGSUxURVJfTlVNNywgR1BJT19JUlFfRkFMTElORykpOworCQlzcGktPmlycSA9IGlycTsKKwkJcHJfZGJnKCJpcnE6ICVkXG4iLCBzcGktPmlycSk7CisJfQorI2Vsc2UKKwlzcGktPmlycSA9IC0xOworI2VuZGlmCisjZW5kaWYvKlVTRV9JTlRfUElPKi8KKwl7CisJCWludCByZXQgPSAwOworCQlpbnQgZ3BpbyA9IC0xOworCQlncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW9fZmxhZ3MoY2hpbGQsICJyc3QtZ3Bpb3MiLCAwLCBOVUxMKTsKKwkJaWYgKGdwaW8gIT0gLTEpIHsKKwkJCXJldCA9IGdwaW9fcmVxdWVzdChncGlvLCAiY2ltYXgiKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJcHJfZXJyb3IoInJzdC1ncGlvcyByZXF1ZXN0IGZhaWwuXG4iKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCisJCQljaW1heF9zcGlfaHdfcmVzZXQoc3BpLCAxKTsKKworCQkJc3BpLT5yc3RfaW8gPSBncGlvOworCQkJcHJfZGJnKCJyc3Q6ICVkXG4iLCBzcGktPnJzdF9pbyk7CisJCX0gZWxzZSB7CisJCQlwcl9lcnJvcigicnN0IGlvIGdvdCBmYWlsLCAlZFxuIiwgZ3Bpbyk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gY2ltYXhfc3BpX2JkaW5mbyA9IHsKKwkubW9kYWxpYXMgPSAiY2ltYXhfc3BpIiwKKwkubW9kZSA9IFNQSV9NT0RFXzMsCisJLm1heF9zcGVlZF9oeiA9IDEwMDAwMDAsIC8qIDFNSHogKi8KKwkuYnVzX251bSA9IDAsIC8qIFNQSSBidXMgTm8uICovCisJLmNoaXBfc2VsZWN0ID0gMCwgLyogdGhlIGRldmljZSBpbmRleCBvbiB0aGUgc3BpIGJ1cyAqLworCS5jb250cm9sbGVyX2RhdGEgPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGNpbWF4X3NwaV9kZXZfZHJpdmVyID0geworCS5wcm9iZSA9IGNpbWF4X3NwaV9kZXZfcHJvYmUsCisJLnJlbW92ZSA9IGNpbWF4X3NwaV9kZXZfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImNpbWF4X3NwaSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitpbnQgYW1sX2NpbWF4X3NwaV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHN0cnVjdCBhbWxfY2ltYXggKmNpbWF4KQoreworCWludCByZXQ7CisJc3RydWN0IGNpbWF4X3NwaSAqY2ltYXhfc3BpOworCisJY2ltYXhfc3BpID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNpbWF4X3NwaSksIEdGUF9LRVJORUwpOworCWlmICghY2ltYXhfc3BpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNpbWF4X3NwaS0+cGRldiA9IHBkZXY7CisJY2ltYXhfc3BpLT5jaW1heCA9IGNpbWF4OworCWNpbWF4X3NwaV9nZXRfY29uZmlnX2Zyb21fZHRzKGNpbWF4X3NwaSwgJmNpbWF4X3NwaV9iZGluZm8pOworCisJLyppbml0IHNwaV9sb2NrKi8KKwlsb2NrX2luaXQoY2ltYXhfc3BpKTsKKworCS8qcmVnaXN0ZXIgZGV2aWNlKi8KKwljaW1heF9zcGlfYmRpbmZvLnBsYXRmb3JtX2RhdGEgPSBjaW1heF9zcGk7CisJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8oJmNpbWF4X3NwaV9iZGluZm8sIDEpOworCisJLypyZWdpc3RlciBkcml2ZXIqLworCXJldCA9IHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmNpbWF4X3NwaV9kZXZfZHJpdmVyKTsKKwlpZiAocmV0KSB7CisJCXByX2Vycm9yKCJyZWdpc3RlciBjaW1heCBzcGkgZHJpdmVyIGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyppbml0IGNpbWF4IHVzZWQgYXBpLiovCisjZGVmaW5lIFdJKF9mKVwKKwljaW1heC0+b3BzLl9mID0gYW1sX2NpbWF4X3NwaV8jI19mCisJV0kocmVhZF9jaXMpOworCVdJKHdyaXRlX2Nvcik7CisJV0kobmVnb3RpYXRlKTsKKwlXSShyZWFkX2xwZHUpOworCVdJKHdyaXRlX2xwZHUpOworCVdJKHJlYWRfY2FtX3N0YXR1cyk7CisJV0koY2FtX3Jlc2V0KTsKKwlXSShzbG90X3Jlc2V0KTsKKwlXSShzbG90X3NodXRkb3duKTsKKwlXSShzbG90X3RzX2VuYWJsZSk7CisJV0koc2xvdF9zdGF0dXMpOworCS8qV0koc3RhcnQpOyovCisJLypXSShzdG9wKTsqLworCVdJKHJlYWRfcmVnKTsKKwlXSSh3cml0ZV9yZWcpOworCisJY2ltYXgtPnByaXYgPSBjaW1heF9zcGk7CisKKwlnX3NwaSA9IGNpbWF4X3NwaTsKKworCWFtbF9jaW1heF9zcGlfbW9kX2luaXQoKTsKKwkKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYW1sX2NpbWF4X3NwaV9pbml0KTsKKworaW50IGFtbF9jaW1heF9zcGlfZXhpdChzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCkKK3sKKwlzdHJ1Y3QgY2ltYXhfc3BpICpzcGkgPSBjaW1heF90b19zcGkoY2ltYXgpOworCisJaWYgKCFzcGkpCisJCXJldHVybiAtRU5PREVWOworCisJYW1sX2NpbWF4X3NwaV9tb2RfZXhpdCgpOworCisJLyp1bnJlZ2lzdGVyIGRyaXZlciovCisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZjaW1heF9zcGlfZGV2X2RyaXZlcik7CisJLyp1bnJlZ2lzdGVyIGRldmljZSovCisJc3BpX3VucmVnaXN0ZXJfZGV2aWNlKHNwaS0+ZGV2KTsKKworCWlmIChzcGktPmlycV9pbykKKwkJZ3Bpb19mcmVlKHNwaS0+aXJxX2lvKTsKKwlpZiAoc3BpLT5yc3RfaW8pCisJCWdwaW9fZnJlZShzcGktPnJzdF9pbyk7CisKKwlrZnJlZShzcGktPmNpcyk7CisKKwlrZnJlZShzcGkpOworCWNpbWF4LT5wcml2ID0gTlVMTDsKKworCWdfc3BpID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYW1sX2NpbWF4X3NwaV9leGl0KTsKKworc3RhdGljIGludCBjaW1heF9zcGlfcmVzZXQoc3RydWN0IGNpbWF4X3NwaSAqc3BpLCBpbnQgcmVzZXRfdmFsKQoreworCXByX2RiZygicmVzZXQgc3BpOiVwLCByc3Q6JWRcbiIsIHNwaSwgc3BpID8gc3BpLT5yc3RfaW8gOiAtMSk7CisJaWYgKCFzcGkpCisJCXJldHVybiAtRU5PREVWOworCisJcHJfZGJnKCJjaW1heCBzcGkgcmVzZXRcbiIpOworCisJY2ltYXhfc3BpX3NldHVwX3BvbGwoc3BpLCBTVE9QX01PREUpOworCisJY2ltYXhfc3BpX2h3X3Jlc2V0KHNwaSwgcmVzZXRfdmFsKTsKKworCS8qbm90aWZ5IHVucGx1Z2dlZCovCisJYW1sX2NpbWF4X2NhbWNoYW5nZWQoc3BpLT5jaW1heCwgMCwgMCk7CisJYW1sX2NpbWF4X2NhbWNoYW5nZWQoc3BpLT5jaW1heCwgMSwgMCk7CisKKwlzcGktPmNhbV9pbnNlcnRlZFswXSA9IHNwaS0+Y2FtX2luc2VydGVkWzFdID0gMDsKKwlzcGktPmNhbV9kYXRhX3JlYWR5WzBdID0gc3BpLT5jYW1fZGF0YV9yZWFkeVsxXSA9IDA7CisKKwkvKmFzeW5jIHN0YXJ0IGZ3Ki8KKwljaW1heF9zcGlfbG9hZF9mdyhzcGkpOworCisJLypjaW1heF9zcGlfc2V0dXBfcG9sbChzcGksIGNpbWF4X3BvbGxfbW9kZT8gUE9MTF9NT0RFIDogSU5UX01PREUpOyovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJlc2V0X3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKKwlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IHJldDsKKwlyZXQgPSBzcHJpbnRmKGJ1ZiwgImVjaG8gMSA+ICVzXG4iLCBhdHRyLT5hdHRyLm5hbWUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJlc2V0X3N0b3JlKHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgcmV0OworCWludCB2YWwgPSAwOworCWlmICghZ19zcGkpCisJCXJldHVybiBzaXplOworCXJldCA9IHNzY2FuZihidWYsICIlaSIsICZ2YWwpOworCWlmIChyZXQgPT0gMSkKKwkJcmV0ID0gY2ltYXhfc3BpX3Jlc2V0KGdfc3BpLCB2YWwpOworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBkZWJ1Z19zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCByZXQgPSAwOworCWlmICghZ19zcGkpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzcHJpbnRmKGJ1ZiwgInBvbGwgbW9kZTogJWRcbiIsIGdfc3BpLT5wb2xsX21vZGUpOworCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJzdGF0dXMgc2xvdFswXT1bJWRdIHNsb3RbMV09WyVkXVxuIiwKKwkJZ19zcGktPmNhbV9pbnNlcnRlZFswXSwgZ19zcGktPmNhbV9pbnNlcnRlZFsxXSk7CisJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgImRhdGEgc2xvdFswXT1bJWRdIHNsb3RbMV09WyVkXVxuIiwKKwkJZ19zcGktPmNhbV9kYXRhX3JlYWR5WzBdLCBnX3NwaS0+Y2FtX2RhdGFfcmVhZHlbMV0pOworCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJ3b3JrIGNudDolZFxuIiwgZ19zcGktPndvcmtfY250KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJlZ19hZGRyOworc3RhdGljIHNzaXplX3QgYWRkcl9zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCByZXQgPSAwOworCXJldCA9IHNwcmludGYoYnVmLCAiYWRkciA9IDB4JTA0eFxuIiwgcmVnX2FkZHIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZHJfc3RvcmUoc3RydWN0IGNsYXNzICpjbGFzcywKKwlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCWlmICghZ19zcGkpCisJCXJldHVybiBzaXplOworCWlmIChzc2NhbmYoYnVmLCAiJWkiLCAmcmVnX2FkZHIpID09IDEpCisJCXJldHVybiBzaXplOworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCByZWdfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0ID0gMDsKKwl1OCByZWdfdmFsID0gMDsKKwlzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCA9IE5VTEw7CisKKwlpZiAoIWdfc3BpKQorCQlyZXR1cm4gcmV0OworCisJY2ltYXggPSBnX3NwaS0+Y2ltYXg7CisJcmV0ID0gYW1sX2NpbWF4X3NwaV9yZWFkX3JlZyhjaW1heCwgcmVnX2FkZHIsICZyZWdfdmFsLCAxKTsKKwlpZiAocmV0KQorCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgInJlYWQgZmFpbCwgZXJyPSVkXG4iLCByZXQpOworCWVsc2UKKwkJcmV0ID0gc3ByaW50ZihidWYsICJyZWdbMHglMDR4XSA9IDB4JTAyeFxuIiwgcmVnX2FkZHIsIHJlZ192YWwpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJlZ19zdG9yZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGFtbF9jaW1heCAqY2ltYXggPSBOVUxMOworCWludCB2YWwgPSAwOworCXU4IHJlZ192YWwgPSAwOworCisJaWYgKCFnX3NwaSkKKwkJcmV0dXJuIHNpemU7CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVpIiwgJnZhbCkgIT0gMSkKKwkJcmV0dXJuIHNpemU7CisJcmVnX3ZhbCA9IHZhbDsKKwljaW1heCA9IGdfc3BpLT5jaW1heDsKKwlyZXQgPSBhbWxfY2ltYXhfc3BpX3dyaXRlX3JlZyhjaW1heCwgcmVnX2FkZHIsICZyZWdfdmFsLCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgaW50IGNpc19tb2RlOyAvKjA6aGV4IDE6YmluYXJ5Ki8KK3N0YXRpYyBzc2l6ZV90IGNpc19zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCByZXQgPSAwOworCisJaWYgKCFnX3NwaSB8fCAhZ19zcGktPmNpcykKKwkJcmV0dXJuIHJldDsKKworCWlmIChjaXNfbW9kZSA9PSAwKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgQ0lTX01BWDsgaSsrKSB7CisJCQlpZiAoaSAmJiAhKGkgJiAweGYpKQorCQkJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJcbiIpOworCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiUwMlggIiwgZ19zcGktPmNpc1tpXSk7CisJCX0KKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIlxuIik7CisJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKKwkJbWVtY3B5KGJ1ZiwgZ19zcGktPmNpcywgQ0lTX01BWCk7CisJCXJldHVybiBDSVNfTUFYOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBjaXNfc3RvcmUoc3RydWN0IGNsYXNzICpjbGFzcywKKwlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCWlmIChzaXplID49IDMKKwkJJiYgIW1lbWNtcChidWYsICJiaW4iLCAzKSkKKwkJY2lzX21vZGUgPSAxOworCWVsc2UKKwkJY2lzX21vZGUgPSAwOworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCB0c19yYXRlX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKKwlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IHJldCA9IDA7CisJdTggbHNiID0gMCwgbXNiID0gMCwgcGxlbiA9IDA7CisJc3RydWN0IGFtbF9jaW1heCAqY2ltYXggPSBOVUxMOworCWludCBlcnIgPSAwOworCisJaWYgKCFnX3NwaSkKKwkJcmV0dXJuIHJldDsKKworCWNpbWF4ID0gZ19zcGktPmNpbWF4OworCWVyciA9IGFtbF9jaW1heF9zcGlfcmVhZF9yZWcoY2ltYXgsIFBDS19MRU5HVEgsICZwbGVuLCAxKTsKKwllcnIgfD0gYW1sX2NpbWF4X3NwaV9yZWFkX3JlZyhjaW1heCwgQklUUkFURV9DSDBfTFNCLCAmbHNiLCAxKTsKKwllcnIgfD0gYW1sX2NpbWF4X3NwaV9yZWFkX3JlZyhjaW1heCwgQklUUkFURV9DSDBfTVNCLCAmbXNiLCAxKTsKKwlpZiAoZXJyIHx8ICFieXRlX3RvX3UxNihtc2IsIGxzYikpCisJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJyZWFkIGZhaWwsIGVycj0lZFxuIiwgZXJyKTsKKwllbHNlCisJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJyYXRlWzBdID0gJWQgS2Jwc1xuIiwKKwkJCTU0MCpwbGVuKjgvYnl0ZV90b191MTYobXNiLCBsc2IpKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gcmV0OworCisJZXJyID0gYW1sX2NpbWF4X3NwaV9yZWFkX3JlZyhjaW1heCwgQklUUkFURV9DSDFfTFNCLCAmbHNiLCAxKTsKKwllcnIgfD0gYW1sX2NpbWF4X3NwaV9yZWFkX3JlZyhjaW1heCwgQklUUkFURV9DSDFfTVNCLCAmbXNiLCAxKTsKKwlpZiAoZXJyIHx8ICFieXRlX3RvX3UxNihtc2IsIGxzYikpCisJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJyZWFkIGZhaWwsIGVycj0lZFxuIiwgZXJyKTsKKwllbHNlCisJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJyYXRlWzFdID0gJWQgS2Jwc1xuIiwKKwkJCTU0MCpwbGVuKjgvYnl0ZV90b191MTYobXNiLCBsc2IpKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBsb29wX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKKwlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IHJldCA9IDA7CisJdTggY2ggPSAwLCBtb2QgPSAwOworCXN0cnVjdCBhbWxfY2ltYXggKmNpbWF4ID0gTlVMTDsKKwlpbnQgZXJyID0gMDsKKworCWlmICghZ19zcGkpCisJCXJldHVybiByZXQ7CisKKwljaW1heCA9IGdfc3BpLT5jaW1heDsKKwllcnIgPSBhbWxfY2ltYXhfc3BpX3JlYWRfcmVnKGNpbWF4LCBST1VURVJfQ0FNX0NILCAmY2gsIDEpOworCWVyciB8PSBhbWxfY2ltYXhfc3BpX3JlYWRfcmVnKGNpbWF4LCBST1VURVJfQ0FNX01PRCwgJm1vZCwgMSk7CisJaWYgKGVycikgeworCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgInJlYWQgZmFpbCwgZXJyPSVkXG4iLCBlcnIpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgKz0gc3ByaW50ZihidWYgKyByZXQsICJPVVQtMCA8PSAiKTsKKwlzd2l0Y2ggKGNoICYgMHgwZikgeworCWNhc2UgMHgwOgorCQlyZXQgKz0gc3ByaW50ZihidWYgKyByZXQsICJDQU0tQSIpOyBicmVhazsKKwljYXNlIDB4MToKKwkJcmV0ICs9IHNwcmludGYoYnVmICsgcmV0LCAiQ0gwLUlOIik7IGJyZWFrOworCWNhc2UgMHgyOgorCQlyZXQgKz0gc3ByaW50ZihidWYgKyByZXQsICJDSDEtSU4iKTsgYnJlYWs7CisJY2FzZSAweDM6CisJCXJldCArPSBzcHJpbnRmKGJ1ZiArIHJldCwgIlJFTUFQUEVSIik7IGJyZWFrOworCWNhc2UgMHg0OgorCQlyZXQgKz0gc3ByaW50ZihidWYgKyByZXQsICJQUkVIRUFERVIiKTsgYnJlYWs7CisJY2FzZSAweDU6CisJCXJldCArPSBzcHJpbnRmKGJ1ZiArIHJldCwgIkNBTS1CIik7IGJyZWFrOworCWNhc2UgMHg2OgorCQlyZXQgKz0gc3ByaW50ZihidWYgKyByZXQsICJHQVBSRU1PVkVSLTAiKTsgYnJlYWs7CisJY2FzZSAweDc6CisJCXJldCArPSBzcHJpbnRmKGJ1ZiArIHJldCwgIkdBUFJFTU9WRVItMSIpOyBicmVhazsKKwljYXNlIDB4ODoKKwkJcmV0ICs9IHNwcmludGYoYnVmICsgcmV0LCAiTk9ORSIpOyBicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgKz0gc3ByaW50ZihidWYgKyByZXQsICJVTktOT1dOIik7IGJyZWFrOworCX0KKwlyZXQgKz0gc3ByaW50ZihidWYgKyByZXQsICJcbkNBTS1BIDw9ICIpOworCXN3aXRjaCAobW9kICYgMHgwNykgeworCWNhc2UgMHgxOgorCQlyZXQgKz0gc3ByaW50ZihidWYgKyByZXQsICJDSDAtSU4iKTsgYnJlYWs7CisJY2FzZSAweDI6CisJCXJldCArPSBzcHJpbnRmKGJ1ZiArIHJldCwgIkNIMS1JTiIpOyBicmVhazsKKwljYXNlIDB4MzoKKwkJcmV0ICs9IHNwcmludGYoYnVmICsgcmV0LCAiUkVNQVBQRVIiKTsgYnJlYWs7CisJY2FzZSAweDQ6CisJCXJldCArPSBzcHJpbnRmKGJ1ZiArIHJldCwgIlBSRUhFQURFUiIpOyBicmVhazsKKwljYXNlIDB4NToKKwkJcmV0ICs9IHNwcmludGYoYnVmICsgcmV0LCAiQ0FNLUIiKTsgYnJlYWs7CisJY2FzZSAweDY6CisJCXJldCArPSBzcHJpbnRmKGJ1ZiArIHJldCwgIkdBUFJFTU9WRVItMCIpOyBicmVhazsKKwljYXNlIDB4NzoKKwkJcmV0ICs9IHNwcmludGYoYnVmICsgcmV0LCAiR0FQUkVNT1ZFUi0xIik7IGJyZWFrOworCWRlZmF1bHQ6CisJCXJldCArPSBzcHJpbnRmKGJ1ZiArIHJldCwgIk5PTkUiKTsgYnJlYWs7CisJfQorCXJldCArPSBzcHJpbnRmKGJ1ZiArIHJldCwgIlxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBzc2l6ZV90IGxvb3Bfc3RvcmUoc3RydWN0IGNsYXNzICpjbGFzcywKKwlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCWludCBsb29wID0gMDsKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCA9IE5VTEw7CisKKwlpZiAoIWdfc3BpKQorCQlyZXR1cm4gc2l6ZTsKKworCWlmIChzc2NhbmYoYnVmLCAiJWkiLCAmbG9vcCkgPT0gMSkgeworCQlpbnQgYSA9IGdfc3BpLT5jYW1faW5zZXJ0ZWRbMF07CisJCWludCBiID0gZ19zcGktPmNhbV9pbnNlcnRlZFsxXTsKKwkJdTggY21bMl07CisJCWNtWzBdID0gbG9vcCA/IChiID8gMHg4NSA6IDB4ODApIDogMHg4MTsvKkNIKi8KKwkJY21bMV0gPSBsb29wID8gKGEgPyAweDUxIDogMHgxMSkgOiAweDAwOy8qTU9EKi8KKwkJY2ltYXggPSBnX3NwaS0+Y2ltYXg7CisJCWVyciA9IGFtbF9jaW1heF9zcGlfd3JpdGVfcmVnKGNpbWF4LCBST1VURVJfQ0FNX0NILCBjbSwgMik7CisJfQorCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBzbG90X3Jlc2V0X3N0b3JlKHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgZXJyID0gMDsKKwlpbnQgc2xvdCA9IDA7CisJc3RydWN0IGFtbF9jaW1heCAqY2ltYXggPSBOVUxMOworCisJaWYgKCFnX3NwaSkKKwkJcmV0dXJuIHNpemU7CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVpIiwgJnNsb3QpID09IDEpIHsKKwkJaWYgKHNsb3QgPT0gMCB8fCBzbG90ID09IDEpIHsKKwkJCXByX2RiZygicmVzZXQgc2xvdCAlZFxuIiwgc2xvdCk7CisJCQljaW1heCA9IGdfc3BpLT5jaW1heDsKKwkJCWVyciA9IGFtbF9jaW1heF9zcGlfc2xvdF9yZXNldChjaW1heCwgc2xvdCk7CisJCX0KKwl9CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRldGVjdF9zdG9yZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJaW50IGVyciA9IDA7CisJaW50IHNsb3QgPSAwOworCXN0cnVjdCBhbWxfY2ltYXggKmNpbWF4ID0gTlVMTDsKKworCWlmICghZ19zcGkpCisJCXJldHVybiBzaXplOworCisJaWYgKHNzY2FuZihidWYsICIlaSIsICZzbG90KSA9PSAxKSB7CisJCWlmIChzbG90ID09IDAgfHwgc2xvdCA9PSAxKSB7CisJCQlpbnQgYWRkciA9ICghc2xvdCkgPyBNT0RfQ1RSTF9BIDogTU9EX0NUUkxfQjsKKwkJCXU4IHJlZyA9IDA7CisJCQljaW1heCA9IGdfc3BpLT5jaW1heDsKKwkJCWVyciA9IGFtbF9jaW1heF9zcGlfcmVhZF9yZWcoY2ltYXgsIGFkZHIsICZyZWcsIDEpOworCQkJZ19zcGktPmNhbV9pbnNlcnRlZFtzbG90XSA9IHJlZyAmIDE7CisJCQlwcl9kYmcoImRldGVjdCBzbG90KCVkKTogJWRcbiIsIHNsb3QsIHJlZyAmIDEpOworCQl9CisJfQorCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSBjaW1heF9zcGlfY2xhc3NfYXR0cnNbXSA9IHsKKwlfX0FUVFJfUlcocmVzZXQpLAorCV9fQVRUUl9STyhkZWJ1ZyksCisJX19BVFRSX1JXKGFkZHIpLAorCV9fQVRUUl9SVyhyZWcpLAorCV9fQVRUUl9SVyhjaXMpLAorCV9fQVRUUl9STyh0c19yYXRlKSwKKwlfX0FUVFJfUlcobG9vcCksCisJX19BVFRSX1dPKHNsb3RfcmVzZXQpLAorCV9fQVRUUl9XTyhkZXRlY3QpLAorCV9fQVRUUl9OVUxMCit9OworCitzdGF0aWMgc3RydWN0IGNsYXNzIGNpbWF4X3NwaV9jbGFzcyA9IHsKKwkubmFtZSA9ICJjaW1heF9zcGkiLAorCS5jbGFzc19hdHRycyA9IGNpbWF4X3NwaV9jbGFzc19hdHRycywKK307CisKK3N0YXRpYyBpbnQgYW1sX2NpbWF4X3NwaV9tb2RfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisJcHJfZGJnKCJBbWxvZ2ljIENJTUFYIFNQSSBJbml0XG4iKTsKKwlyZXQgPSBjbGFzc19yZWdpc3RlcigmY2ltYXhfc3BpX2NsYXNzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYW1sX2NpbWF4X3NwaV9tb2RfZXhpdCh2b2lkKQoreworCXByX2RiZygiQW1sb2dpYyBDSU1BWCBTUEkgRXhpdFxuIik7CisJY2xhc3NfdW5yZWdpc3RlcigmY2ltYXhfc3BpX2NsYXNzKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC9hbWxfY2ltYXhfc3BpLmggYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L2FtbF9jaW1heF9zcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTQ4ZGUwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC9hbWxfY2ltYXhfc3BpLmgKQEAgLTAsMCArMSwyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE0IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGRlZmluZWQgaW4gdGhlCisgKiBmaWxlICdMSUNFTlNFJyB3aGljaCBpcyBwYXJ0IG9mIHRoaXMgc291cmNlIGNvZGUgcGFja2FnZS4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0FNTF9DSU1BWF9TUElfSF8KKyNkZWZpbmUgX0FNTF9DSU1BWF9TUElfSF8KKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgImFtbF9jaW1heC5oIgorCitpbnQgYW1sX2NpbWF4X3NwaV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHN0cnVjdCBhbWxfY2ltYXggKmNpKTsKK2ludCBhbWxfY2ltYXhfc3BpX2V4aXQoc3RydWN0IGFtbF9jaW1heCAqY2kpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvYW1sX2NpbWF4X3VzYi5jIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC9hbWxfY2ltYXhfdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIwYzcxZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvYW1sX2NpbWF4X3VzYi5jCkBAIC0wLDAgKzEsMTczMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE0IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGRlZmluZWQgaW4gdGhlCisgKiBmaWxlICdMSUNFTlNFJyB3aGljaCBpcyBwYXJ0IG9mIHRoaXMgc291cmNlIGNvZGUgcGFja2FnZS4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9hbWxfZ3Bpb19jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8vY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkL2Nsb2NrLmg+CisKKy8vI2luY2x1ZGUgPGxpbnV4L3N3aXRjaC5oPgorCisjaW5jbHVkZSAiYW1sX2NpbWF4LmgiCisjaW5jbHVkZSAiLi91c2IvU1JDL2NpbWF4K3VzYi1kcml2ZXIuaCIKKworI2RlZmluZSBNT0RfTkFNRSAgICAgICAiYW1sX2NpbWF4X3VzYiIKKworI2RlZmluZSBwcl9kYmcoZm10Li4uKVwKKwlkbyB7XAorCQlpZiAoY2ltYXhfdXNiX2RlYnVnKVwKKwkJCXByX2luZm8oImNpbWF4X3VzYjogImZtdCk7XAorCX0gd2hpbGUgKDApCisjZGVmaW5lIHByX2luZihmbXQuLi4pIHByX2luZm8oImNpbWF4X3VzYjogImZtdCkKKyNkZWZpbmUgcHJfZXJyb3IoZm10Li4uKSBwcl9lcnIoIkFNTF9DSU1BWF9VU0I6ICIgZm10KQorCisvKgorICBVbmNvbW1lbnQgYmVsb3cgYW5kIGVuYWJsZSBwZXJtYW5lbnQgcG93ZXIgaW4gY2ZnCisgIHRvIGRpc2FibGUgZHluYW1pYyBwb3dlciBjb250cm9sIG1lY2hhbmlzbQorKi8KKy8qI2RlZmluZSBESVNBQkxFX1BPV0VSX1BBVENIKi8KKworI2RlZmluZSBCVUZGSU5fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEJVRkZJTl9BRERSX0xTQiAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgQlVGRklOX0FERFJfTVNCICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBCVUZGSU5fREFUQSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIEJVRkZPVVRfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgQlVGRk9VVF9BRERSX0xTQiAgICAgICAgICAgICAgICAgIDB4MDAwNQorI2RlZmluZSBCVUZGT1VUX0FERFJfTVNCICAgICAgICAgICAgICAgICAgMHgwMDA2CisjZGVmaW5lIEJVRkZPVVRfREFUQSAgICAgICAgICAgICAgICAgICAgICAweDAwMDcKKyNkZWZpbmUgQk9PVF9LZXkgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBCT09UX1N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA5CisjZGVmaW5lIEJPT1RfVGVzdCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEEKKyNkZWZpbmUgdXNiMl8wX2lycV9tYXNrICAgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSB1c2IyXzBfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgMHgwMDExCisjZGVmaW5lIHVzYjJfMF9yeCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTIKKyNkZWZpbmUgdXNiMl8wX3R4ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMworI2RlZmluZSBTUElfU2xhdmVfQ3RybCAgICAgICAgICAgICAgICAgICAgMHgwMDE4CisjZGVmaW5lIFNQSV9TbGF2ZV9TdGF0dXMgICAgICAgICAgICAgICAgICAweDAwMTkKKyNkZWZpbmUgU1BJX1NsYXZlX1J4ICAgICAgICAgICAgICAgICAgICAgIDB4MDAxQQorI2RlZmluZSBTUElfU2xhdmVfVHggICAgICAgICAgICAgICAgICAgICAgMHgwMDFCCisjZGVmaW5lIFNQSV9TbGF2ZV9NYXNrICAgICAgICAgICAgICAgICAgICAweDAwMUMKKyNkZWZpbmUgVUNTR19DdHJsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBVQ1NHX1N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIxCisjZGVmaW5lIFVDU0dfUnhEYXRhICAgICAgICAgICAgICAgICAgICAgICAweDAwMjIKKyNkZWZpbmUgVUNTR19UeERhdGEgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMworI2RlZmluZSBQQ3RybF9DdHJsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDI4CisjZGVmaW5lIFBDdHJsX1N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAweDAwMjkKKyNkZWZpbmUgUEN0cmxfTmJCeXRlX0xTQiAgICAgICAgICAgICAgICAgIDB4MDAyQQorI2RlZmluZSBQQ3RybF9OYkJ5dGVfTVNCICAgICAgICAgICAgICAgICAgMHgwMDJCCisjZGVmaW5lIFNQSV9NYXN0ZXJfQ3RsICAgICAgICAgICAgICAgICAgICAweDAwMzAKKyNkZWZpbmUgU1BJX01hc3Rlcl9OQ1MgICAgICAgICAgICAgICAgICAgIDB4MDAzMQorI2RlZmluZSBTUElfTWFzdGVyX1N0YXR1cyAgICAgICAgICAgICAgICAgMHgwMDMyCisjZGVmaW5lIFNQSV9NYXN0ZXJfVHhCdWYgICAgICAgICAgICAgICAgICAweDAwMzMKKyNkZWZpbmUgU1BJX01hc3Rlcl9SeEJ1ZiAgICAgICAgICAgICAgICAgIDB4MDAzNAorI2RlZmluZSBCSVNUUkFNX0N0bCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDM4CisjZGVmaW5lIEJJU1RSQU1fQmFuayAgICAgICAgICAgICAgICAgICAgICAweDAwMzkKKyNkZWZpbmUgQklTVFJBTV9QYXQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzQQorI2RlZmluZSBCSVNUUkFNX1NNICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDNCCisjZGVmaW5lIEJJU1RSQU1fQWRkckxTQiAgICAgICAgICAgICAgICAgICAweDAwM0MKKyNkZWZpbmUgQklTVFJPTV9Db25maWcgICAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBCSVNUUk9NX1NpZ25hdHVyZUxTQiAgICAgICAgICAgICAgMHgwMDQxCisjZGVmaW5lIEJJU1RST01fU2lnbmF0dXJlTVNCICAgICAgICAgICAgICAweDAwNDIKKyNkZWZpbmUgQklTVFJPTV9TdGFydEFkZHJMU0IgICAgICAgICAgICAgIDB4MDA0MworI2RlZmluZSBCSVNUUk9NX1N0YXJ0QWRkck1TQiAgICAgICAgICAgICAgMHgwMDQzCisjZGVmaW5lIEJJU1RST01fU3RvcEFkZHJMU0IgICAgICAgICAgICAgICAweDAwNDMKKyNkZWZpbmUgQklTVFJPTV9TdG9wQWRkck1TQiAgICAgICAgICAgICAgIDB4MDA0MworI2RlZmluZSBDa01hbl9Db25maWcgICAgICAgICAgICAgICAgICAgICAgMHgwMDQ4CisjZGVmaW5lIENrTWFuX1NlbGVjdCAgICAgICAgICAgICAgICAgICAgICAweDAwNDkKKyNkZWZpbmUgQ2tNYW5fVGVzdCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0QQorI2RlZmluZSBSZXZpc2lvbl9OdW1iZXIgICAgICAgICAgICAgICAgICAgMHgwMDRCCisjZGVmaW5lIFJlc01hbl9Db25maWcgICAgICAgICAgICAgICAgICAgICAweDAwNTAKKyNkZWZpbmUgUmVzTWFuX1N0YXR1cyAgICAgICAgICAgICAgICAgICAgIDB4MDA1MQorI2RlZmluZSBSZXNNYW5fV0QgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDUyCisjZGVmaW5lIFJlc01hbl9XRF9NU0IgICAgICAgICAgICAgICAgICAgICAweDAwNTMKKyNkZWZpbmUgQ1BVX1Rlc3QgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MAorI2RlZmluZSBJcnFNYW5fQ29uZmlnMCAgICAgICAgICAgICAgICAgICAgMHgwMDY4CisjZGVmaW5lIElycU1hbl9Db25maWcxICAgICAgICAgICAgICAgICAgICAweDAwNjkKKyNkZWZpbmUgSXJxTWFuX0lycTAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2QQorI2RlZmluZSBJcnFNYW5fTk1JICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDZCCisjZGVmaW5lIElycU1hbl9TbGVlcEtleSAgICAgICAgICAgICAgICAgICAweDAwNkMKKyNkZWZpbmUgVGltX0NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3MAorI2RlZmluZSBUaW1fVmFsdWVfTFNCICAgICAgICAgICAgICAgICAgICAgMHgwMDcxCisjZGVmaW5lIFRpbV9WYWx1ZV9NU0IgICAgICAgICAgICAgICAgICAgICAweDAwNzIKKyNkZWZpbmUgVGltX0NvbXBfTFNCICAgICAgICAgICAgICAgICAgICAgIDB4MDA3MworI2RlZmluZSBUaW1fQ29tcF9NU0IgICAgICAgICAgICAgICAgICAgICAgMHgwMDc0CisjZGVmaW5lIFRJX0NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNzYKKyNkZWZpbmUgVElfRGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3NworI2RlZmluZSBUSV9SZWcwICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDc4CisjZGVmaW5lIFRJX1JlZzEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNzkKKyNkZWZpbmUgVElfUmVnMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3QQorI2RlZmluZSBUSV9SZWczICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDdCCisjZGVmaW5lIFRJX1JlZzQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwN0MKKyNkZWZpbmUgVElfUk9NMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3RAorI2RlZmluZSBUSV9ST00yICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDdFCisjZGVmaW5lIFRJX1JPTTMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwN0YKKyNkZWZpbmUgRFZCQ0lfU1RBUlRfQUREUiAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBEVkJDSV9FTkRfQUREUiAgICAgICAgICAgICAgICAgICAgMHgwMTdGCisjZGVmaW5lIERBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxODAKKy8qI2RlZmluZSBDVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE4MSovCisjZGVmaW5lIFFCX0hPU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxODIKKyNkZWZpbmUgTEVOX0hPU1RfTFNCICAgICAgICAgICAgICAgICAgICAgIDB4MDE4MworI2RlZmluZSBMRU5fSE9TVF9NU0IgICAgICAgICAgICAgICAgICAgICAgMHgwMTg0CisjZGVmaW5lIEZJRk9fVFhfVEhfTFNCICAgICAgICAgICAgICAgICAgICAweDAxODUKKyNkZWZpbmUgRklGT19UWF9USF9NU0IgICAgICAgICAgICAgICAgICAgIDB4MDE4NgorI2RlZmluZSBGSUZPX1RYX0RfTkJfTFNCICAgICAgICAgICAgICAgICAgMHgwMTg3CisjZGVmaW5lIEZJRk9fVFhfRF9OQl9NU0IgICAgICAgICAgICAgICAgICAweDAxODgKKyNkZWZpbmUgUUJfTU9EX0NVUlIgICAgICAgICAgICAgICAgICAgICAgIDB4MDE4OQorI2RlZmluZSBMRU5fTU9EX0NVUlJfTFNCICAgICAgICAgICAgICAgICAgMHgwMThBCisjZGVmaW5lIExFTl9NT0RfQ1VSUl9NU0IgICAgICAgICAgICAgICAgICAweDAxOEIKKyNkZWZpbmUgUUJfTU9EICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE4QworI2RlZmluZSBMRU5fTU9EX0xTQiAgICAgICAgICAgICAgICAgICAgICAgMHgwMThECisjZGVmaW5lIExFTl9NT0RfTVNCICAgICAgICAgICAgICAgICAgICAgICAweDAxOEUKKyNkZWZpbmUgRklGT19SWF9USF9MU0IgICAgICAgICAgICAgICAgICAgIDB4MDE4RgorI2RlZmluZSBGSUZPX1JYX1RIX01TQiAgICAgICAgICAgICAgICAgICAgMHgwMTkwCisjZGVmaW5lIEZJRk9fUlhfRF9OQl9MU0IgICAgICAgICAgICAgICAgICAweDAxOTEKKyNkZWZpbmUgRklGT19SWF9EX05CX01TQiAgICAgICAgICAgICAgICAgIDB4MDE5MgorI2RlZmluZSBJVF9TVEFUVVNfMCAgICAgICAgICAgICAgICAgICAgICAgMHgwMTkzCisjZGVmaW5lIElUX1NUQVRVU18xICAgICAgICAgICAgICAgICAgICAgICAweDAxOTQKKyNkZWZpbmUgSVRfTUFTS18wICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE5NQorI2RlZmluZSBJVF9NQVNLXzEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTk2CisjZGVmaW5lIElUX0hPU1RfUElOX0NGRyAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgQ0ZHXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMQorI2RlZmluZSBDRkdfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAyCisjZGVmaW5lIENGR18yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDMKKyNkZWZpbmUgSVRfSE9TVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNAorI2RlZmluZSBNT0RfSVRfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgMHgwMjA1CisjZGVmaW5lIE1PRF9JVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAyMDYKKyNkZWZpbmUgTU9EX0NUUkxfQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNworI2RlZmluZSBNT0RfQ1RSTF9CICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA4CisjZGVmaW5lIERFU1RfU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDkKKyNkZWZpbmUgQ0FNX01TQl9BREQgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwQQorI2RlZmluZSBHUElPMF9ESVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjBCCisjZGVmaW5lIEdQSU8wX0RBVEFfSU4gICAgICAgICAgICAgICAgICAgICAweDAyMEMKKyNkZWZpbmUgR1BJTzBfREFUQV9PVVQgICAgICAgICAgICAgICAgICAgIDB4MDIwRAorI2RlZmluZSBHUElPMF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgMHgwMjBFCisjZGVmaW5lIEdQSU8wX0lUX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAyMEYKKyNkZWZpbmUgR1BJTzBfREZUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxMAorI2RlZmluZSBHUElPMF9NQVNLX0RBVEEgICAgICAgICAgICAgICAgICAgMHgwMjExCisjZGVmaW5lIEdQSU8xX0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMTIKKyNkZWZpbmUgR1BJTzFfREFUQV9JTiAgICAgICAgICAgICAgICAgICAgIDB4MDIxMworI2RlZmluZSBHUElPMV9EQVRBX09VVCAgICAgICAgICAgICAgICAgICAgMHgwMjE0CisjZGVmaW5lIEdQSU8xX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAweDAyMTUKKyNkZWZpbmUgR1BJTzFfSVRfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDIxNgorI2RlZmluZSBNRU1fQUNDX1RJTUVfQSAgICAgICAgICAgICAgICAgICAgMHgwMjE3CisjZGVmaW5lIE1FTV9BQ0NfVElNRV9CICAgICAgICAgICAgICAgICAgICAweDAyMTgKKyNkZWZpbmUgSU9fQUNDX1RJTUVfQSAgICAgICAgICAgICAgICAgICAgIDB4MDIxOQorI2RlZmluZSBJT19BQ0NfVElNRV9CICAgICAgICAgICAgICAgICAgICAgMHgwMjFBCisjZGVmaW5lIEVYVF9DSF9BQ0NfVElNRV9BICAgICAgICAgICAgICAgICAweDAyMUIKKyNkZWZpbmUgRVhUX0NIX0FDQ19USU1FX0IgICAgICAgICAgICAgICAgIDB4MDIxQworI2RlZmluZSBQQVJfSUZfMCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjFECisjZGVmaW5lIFBBUl9JRl8xICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMUUKKyNkZWZpbmUgUEFSX0lGX0NUUkwgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxRgorI2RlZmluZSBQQ0tfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjIwCisjZGVmaW5lIFVTQjJUU19DVFJMICAgICAgICAgICAgICAgICAgICAgICAweDAyMjEKKyNkZWZpbmUgVVNCMlRTMF9SREwgICAgICAgICAgICAgICAgICAgICAgIDB4MDIyMgorI2RlZmluZSBVU0IyVFMxX1JETCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjIzCisjZGVmaW5lIFRTMlVTQl9DVFJMICAgICAgICAgICAgICAgICAgICAgICAweDAyMjQKKyNkZWZpbmUgVFNPVVRfUEFSX0NUUkwgICAgICAgICAgICAgICAgICAgIDB4MDIyNQorI2RlZmluZSBUU09VVF9QQVJfQ0xLX1NFTCAgICAgICAgICAgICAgICAgMHgwMjI2CisjZGVmaW5lIFMyUF9DSDBfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAweDAyMjcKKyNkZWZpbmUgUzJQX0NIMV9DVFJMICAgICAgICAgICAgICAgICAgICAgIDB4MDIyOAorI2RlZmluZSBQMlNfQ0gwX0NUUkwgICAgICAgICAgICAgICAgICAgICAgMHgwMjI5CisjZGVmaW5lIFAyU19DSDFfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAweDAyMkEKKyNkZWZpbmUgVFNfSVRfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgIDB4MDIyQgorI2RlZmluZSBUU19JVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjJDCisjZGVmaW5lIElOX1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMkQKKyNkZWZpbmUgT1VUX1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIyRQorI2RlZmluZSBST1VURVJfQ0FNX0NIICAgICAgICAgICAgICAgICAgICAgMHgwMjJGCisjZGVmaW5lIFJPVVRFUl9DQU1fTU9EICAgICAgICAgICAgICAgICAgICAweDAyMzAKKyNkZWZpbmUgRklGT19DVFJMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIzMQorI2RlZmluZSBGSUZPMV8yX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgMHgwMjMyCisjZGVmaW5lIEZJRk8zXzRfU1RBVFVTICAgICAgICAgICAgICAgICAgICAweDAyMzMKKyNkZWZpbmUgR0FQX1JFTU9WRVJfQ0gwX0NUUkwgICAgICAgICAgICAgIDB4MDIzNAorI2RlZmluZSBHQVBfUkVNT1ZFUl9DSDFfQ1RSTCAgICAgICAgICAgICAgMHgwMjM1CisjZGVmaW5lIFNZTkNfUlRWX0NUUkwgICAgICAgICAgICAgICAgICAgICAweDAyMzYKKyNkZWZpbmUgU1lOQ19SVFZfQ0gwX1NZTkNfTkIgICAgICAgICAgICAgIDB4MDIzNworI2RlZmluZSBTWU5DX1JUVl9DSDBfUEFUVEVSTiAgICAgICAgICAgICAgMHgwMjM4CisjZGVmaW5lIFNZTkNfUlRWX0NIMV9TWU5DX05CICAgICAgICAgICAgICAweDAyMzkKKyNkZWZpbmUgU1lOQ19SVFZfQ0gxX1BBVFRFUk4gICAgICAgICAgICAgIDB4MDIzQQorI2RlZmluZSBTWU5DX1JUVl9PRkZTRVRfUEFUVCAgICAgICAgICAgICAgMHgwMjNCCisjZGVmaW5lIENUUkxfRklMVEVSICAgICAgICAgICAgICAgICAgICAgICAweDAyM0QKKyNkZWZpbmUgUElEX0VOX0ZJTFRFUl9DSDAgICAgICAgICAgICAgICAgIDB4MDIzRQorI2RlZmluZSBQSURfRU5fRklMVEVSX0NIMSAgICAgICAgICAgICAgICAgMHgwMjNGCisjZGVmaW5lIFBJRF9MU0JfRklMVEVSX0NIMF8wICAgICAgICAgICAgICAweDAyNDAKKyNkZWZpbmUgUElEX01TQl9GSUxURVJfQ0gwXzAgICAgICAgICAgICAgIDB4MDI0MQorI2RlZmluZSBQSURfTFNCX0ZJTFRFUl9DSDBfMSAgICAgICAgICAgICAgMHgwMjQyCisjZGVmaW5lIFBJRF9NU0JfRklMVEVSX0NIMF8xICAgICAgICAgICAgICAweDAyNDMKKyNkZWZpbmUgUElEX0xTQl9GSUxURVJfQ0gwXzIgICAgICAgICAgICAgIDB4MDI0NAorI2RlZmluZSBQSURfTVNCX0ZJTFRFUl9DSDBfMiAgICAgICAgICAgICAgMHgwMjQ1CisjZGVmaW5lIFBJRF9MU0JfRklMVEVSX0NIMF8zICAgICAgICAgICAgICAweDAyNDYKKyNkZWZpbmUgUElEX01TQl9GSUxURVJfQ0gwXzMgICAgICAgICAgICAgIDB4MDI0NworI2RlZmluZSBQSURfTFNCX0ZJTFRFUl9DSDBfNCAgICAgICAgICAgICAgMHgwMjQ4CisjZGVmaW5lIFBJRF9NU0JfRklMVEVSX0NIMF80ICAgICAgICAgICAgICAweDAyNDkKKyNkZWZpbmUgUElEX0xTQl9GSUxURVJfQ0gwXzUgICAgICAgICAgICAgIDB4MDI0QQorI2RlZmluZSBQSURfTVNCX0ZJTFRFUl9DSDBfNSAgICAgICAgICAgICAgMHgwMjRCCisjZGVmaW5lIFBJRF9MU0JfRklMVEVSX0NIMF82ICAgICAgICAgICAgICAweDAyNEMKKyNkZWZpbmUgUElEX01TQl9GSUxURVJfQ0gwXzYgICAgICAgICAgICAgIDB4MDI0RAorI2RlZmluZSBQSURfTFNCX0ZJTFRFUl9DSDBfNyAgICAgICAgICAgICAgMHgwMjRFCisjZGVmaW5lIFBJRF9NU0JfRklMVEVSX0NIMF83ICAgICAgICAgICAgICAweDAyNEYKKyNkZWZpbmUgUElEX0xTQl9GSUxURVJfQ0gxXzAgICAgICAgICAgICAgIDB4MDI2MAorI2RlZmluZSBQSURfTVNCX0ZJTFRFUl9DSDFfMCAgICAgICAgICAgICAgMHgwMjYxCisjZGVmaW5lIFBJRF9MU0JfRklMVEVSX0NIMV8xICAgICAgICAgICAgICAweDAyNjIKKyNkZWZpbmUgUElEX01TQl9GSUxURVJfQ0gxXzEgICAgICAgICAgICAgIDB4MDI2MworI2RlZmluZSBQSURfTFNCX0ZJTFRFUl9DSDFfMiAgICAgICAgICAgICAgMHgwMjY0CisjZGVmaW5lIFBJRF9NU0JfRklMVEVSX0NIMV8yICAgICAgICAgICAgICAweDAyNjUKKyNkZWZpbmUgUElEX0xTQl9GSUxURVJfQ0gxXzMgICAgICAgICAgICAgIDB4MDI2NgorI2RlZmluZSBQSURfTVNCX0ZJTFRFUl9DSDFfMyAgICAgICAgICAgICAgMHgwMjY3CisjZGVmaW5lIFBJRF9MU0JfRklMVEVSX0NIMV80ICAgICAgICAgICAgICAweDAyNjgKKyNkZWZpbmUgUElEX01TQl9GSUxURVJfQ0gxXzQgICAgICAgICAgICAgIDB4MDI2OQorI2RlZmluZSBQSURfTFNCX0ZJTFRFUl9DSDFfNSAgICAgICAgICAgICAgMHgwMjZBCisjZGVmaW5lIFBJRF9NU0JfRklMVEVSX0NIMV81ICAgICAgICAgICAgICAweDAyNkIKKyNkZWZpbmUgUElEX0xTQl9GSUxURVJfQ0gxXzYgICAgICAgICAgICAgIDB4MDI2QworI2RlZmluZSBQSURfTVNCX0ZJTFRFUl9DSDFfNiAgICAgICAgICAgICAgMHgwMjZECisjZGVmaW5lIFBJRF9MU0JfRklMVEVSX0NIMV83ICAgICAgICAgICAgICAweDAyNkUKKyNkZWZpbmUgUElEX01TQl9GSUxURVJfQ0gxXzcgICAgICAgICAgICAgIDB4MDI2RgorI2RlZmluZSBQSURfT0xEX0xTQl9SRU1BUFBFUl8wICAgICAgICAgICAgMHgwMjgwCisjZGVmaW5lIFBJRF9PTERfTVNCX1JFTUFQUEVSXzAgICAgICAgICAgICAweDAyODEKKyNkZWZpbmUgUElEX09MRF9MU0JfUkVNQVBQRVJfMSAgICAgICAgICAgIDB4MDI4MgorI2RlZmluZSBQSURfT0xEX01TQl9SRU1BUFBFUl8xICAgICAgICAgICAgMHgwMjgzCisjZGVmaW5lIFBJRF9PTERfTFNCX1JFTUFQUEVSXzIgICAgICAgICAgICAweDAyODQKKyNkZWZpbmUgUElEX09MRF9NU0JfUkVNQVBQRVJfMiAgICAgICAgICAgIDB4MDI4NQorI2RlZmluZSBQSURfT0xEX0xTQl9SRU1BUFBFUl8zICAgICAgICAgICAgMHgwMjg2CisjZGVmaW5lIFBJRF9PTERfTVNCX1JFTUFQUEVSXzMgICAgICAgICAgICAweDAyODcKKyNkZWZpbmUgUElEX09MRF9MU0JfUkVNQVBQRVJfNCAgICAgICAgICAgIDB4MDI4OAorI2RlZmluZSBQSURfT0xEX01TQl9SRU1BUFBFUl80ICAgICAgICAgICAgMHgwMjg5CisjZGVmaW5lIFBJRF9PTERfTFNCX1JFTUFQUEVSXzUgICAgICAgICAgICAweDAyOEEKKyNkZWZpbmUgUElEX09MRF9NU0JfUkVNQVBQRVJfNSAgICAgICAgICAgIDB4MDI4QgorI2RlZmluZSBQSURfT0xEX0xTQl9SRU1BUFBFUl82ICAgICAgICAgICAgMHgwMjhDCisjZGVmaW5lIFBJRF9PTERfTVNCX1JFTUFQUEVSXzYgICAgICAgICAgICAweDAyOEQKKyNkZWZpbmUgUElEX09MRF9MU0JfUkVNQVBQRVJfNyAgICAgICAgICAgIDB4MDI4RQorI2RlZmluZSBQSURfT0xEX01TQl9SRU1BUFBFUl83ICAgICAgICAgICAgMHgwMjhGCisjZGVmaW5lIFBJRF9ORVdfTFNCX1JFTUFQUEVSXzAgICAgICAgICAgICAweDAyQTAKKyNkZWZpbmUgUElEX05FV19NU0JfUkVNQVBQRVJfMCAgICAgICAgICAgIDB4MDJBMQorI2RlZmluZSBQSURfTkVXX0xTQl9SRU1BUFBFUl8xICAgICAgICAgICAgMHgwMkEyCisjZGVmaW5lIFBJRF9ORVdfTVNCX1JFTUFQUEVSXzEgICAgICAgICAgICAweDAyQTMKKyNkZWZpbmUgUElEX05FV19MU0JfUkVNQVBQRVJfMiAgICAgICAgICAgIDB4MDJBNAorI2RlZmluZSBQSURfTkVXX01TQl9SRU1BUFBFUl8yICAgICAgICAgICAgMHgwMkE1CisjZGVmaW5lIFBJRF9ORVdfTFNCX1JFTUFQUEVSXzMgICAgICAgICAgICAweDAyQTYKKyNkZWZpbmUgUElEX05FV19NU0JfUkVNQVBQRVJfMyAgICAgICAgICAgIDB4MDJBNworI2RlZmluZSBQSURfTkVXX0xTQl9SRU1BUFBFUl80ICAgICAgICAgICAgMHgwMkE4CisjZGVmaW5lIFBJRF9ORVdfTVNCX1JFTUFQUEVSXzQgICAgICAgICAgICAweDAyQTkKKyNkZWZpbmUgUElEX05FV19MU0JfUkVNQVBQRVJfNSAgICAgICAgICAgIDB4MDJBQQorI2RlZmluZSBQSURfTkVXX01TQl9SRU1BUFBFUl81ICAgICAgICAgICAgMHgwMkFCCisjZGVmaW5lIFBJRF9ORVdfTFNCX1JFTUFQUEVSXzYgICAgICAgICAgICAweDAyQUMKKyNkZWZpbmUgUElEX05FV19NU0JfUkVNQVBQRVJfNiAgICAgICAgICAgIDB4MDJBRAorI2RlZmluZSBQSURfTkVXX0xTQl9SRU1BUFBFUl83ICAgICAgICAgICAgMHgwMkFFCisjZGVmaW5lIFBJRF9ORVdfTVNCX1JFTUFQUEVSXzcgICAgICAgICAgICAweDAyQUYKKyNkZWZpbmUgTUVSR0VSX0RJVl9NSUNMSyAgICAgICAgICAgICAgICAgIDB4MDJDMAorI2RlZmluZSBQSURfQU5EX1NZTkNfUkVNQVBQRVJfQ1RSTCAgICAgICAgMHgwMkMxCisjZGVmaW5lIFBJRF9FTl9SRU1BUFBFUiAgICAgICAgICAgICAgICAgICAweDAyQzIKKyNkZWZpbmUgU1lOQ19TWU1CT0wgICAgICAgICAgICAgICAgICAgICAgIDB4MDJDMworI2RlZmluZSBQSURfQU5EX1NZTkNfUkVNQVBQRVJfSU5WX0NUUkwgICAgMHgwMkM0CisjZGVmaW5lIEJJVFJBVEVfQ0gwX0xTQiAgICAgICAgICAgICAgICAgICAweDAyQzUKKyNkZWZpbmUgQklUUkFURV9DSDBfTVNCICAgICAgICAgICAgICAgICAgIDB4MDJDNgorI2RlZmluZSBCSVRSQVRFX0NIMV9MU0IgICAgICAgICAgICAgICAgICAgMHgwMkM3CisjZGVmaW5lIEJJVFJBVEVfQ0gxX01TQiAgICAgICAgICAgICAgICAgICAweDAyQzgKKyNkZWZpbmUgU1RBVFVTX0NMS19TV0lUQ0hfMCAgICAgICAgICAgICAgIDB4MDJDOQorI2RlZmluZSBTVEFUVVNfQ0xLX1NXSVRDSF8xICAgICAgICAgICAgICAgMHgwMkNBCisjZGVmaW5lIFJFU0VUX0NMS19TV0lUQ0hfMCAgICAgICAgICAgICAgICAweDAyQ0IKKyNkZWZpbmUgUkVTRVRfQ0xLX1NXSVRDSF8xICAgICAgICAgICAgICAgIDB4MDJDQworI2RlZmluZSBQQURfRFJWU1RSX0NUUkwgICAgICAgICAgICAgICAgICAgMHgwMkNECisjZGVmaW5lIFBBRF9QVVBEX0NUUkwgICAgICAgICAgICAgICAgICAgICAweDAyQ0UKKyNkZWZpbmUgUFJFX0hFQURFUl9BRERFUl9DSDBfMCAgICAgICAgICAgIDB4MDJEMAorI2RlZmluZSBQUkVfSEVBREVSX0FEREVSX0NIMF8xICAgICAgICAgICAgMHgwMkQxCisjZGVmaW5lIFBSRV9IRUFERVJfQURERVJfQ0gwXzIgICAgICAgICAgICAweDAyRDIKKyNkZWZpbmUgUFJFX0hFQURFUl9BRERFUl9DSDBfMyAgICAgICAgICAgIDB4MDJEMworI2RlZmluZSBQUkVfSEVBREVSX0FEREVSX0NIMF80ICAgICAgICAgICAgMHgwMkQ0CisjZGVmaW5lIFBSRV9IRUFERVJfQURERVJfQ0gwXzUgICAgICAgICAgICAweDAyRDUKKyNkZWZpbmUgUFJFX0hFQURFUl9BRERFUl9DSDBfNiAgICAgICAgICAgIDB4MDJENgorI2RlZmluZSBQUkVfSEVBREVSX0FEREVSX0NIMF83ICAgICAgICAgICAgMHgwMkQ3CisjZGVmaW5lIFBSRV9IRUFERVJfQURERVJfQ0gwXzggICAgICAgICAgICAweDAyRDgKKyNkZWZpbmUgUFJFX0hFQURFUl9BRERFUl9DSDBfOSAgICAgICAgICAgIDB4MDJEOQorI2RlZmluZSBQUkVfSEVBREVSX0FEREVSX0NIMF8xMCAgICAgICAgICAgMHgwMkRBCisjZGVmaW5lIFBSRV9IRUFERVJfQURERVJfQ0gwXzExICAgICAgICAgICAweDAyREIKKyNkZWZpbmUgUFJFX0hFQURFUl9BRERFUl9DSDFfMCAgICAgICAgICAgIDB4MDJFMAorI2RlZmluZSBQUkVfSEVBREVSX0FEREVSX0NIMV8xICAgICAgICAgICAgMHgwMkUxCisjZGVmaW5lIFBSRV9IRUFERVJfQURERVJfQ0gxXzIgICAgICAgICAgICAweDAyRTIKKyNkZWZpbmUgUFJFX0hFQURFUl9BRERFUl9DSDFfMyAgICAgICAgICAgIDB4MDJFMworI2RlZmluZSBQUkVfSEVBREVSX0FEREVSX0NIMV80ICAgICAgICAgICAgMHgwMkU0CisjZGVmaW5lIFBSRV9IRUFERVJfQURERVJfQ0gxXzUgICAgICAgICAgICAweDAyRTUKKyNkZWZpbmUgUFJFX0hFQURFUl9BRERFUl9DSDFfNiAgICAgICAgICAgIDB4MDJFNgorI2RlZmluZSBQUkVfSEVBREVSX0FEREVSX0NIMV83ICAgICAgICAgICAgMHgwMkU3CisjZGVmaW5lIFBSRV9IRUFERVJfQURERVJfQ0gxXzggICAgICAgICAgICAweDAyRTgKKyNkZWZpbmUgUFJFX0hFQURFUl9BRERFUl9DSDFfOSAgICAgICAgICAgIDB4MDJFOQorI2RlZmluZSBQUkVfSEVBREVSX0FEREVSX0NIMV8xMCAgICAgICAgICAgMHgwMkVBCisjZGVmaW5lIFBSRV9IRUFERVJfQURERVJfQ0gxXzExICAgICAgICAgICAweDAyRUIKKyNkZWZpbmUgUFJFX0hFQURFUl9BRERFUl9DVFJMICAgICAgICAgICAgIDB4MDJFQworI2RlZmluZSBQUkVfSEVBREVSX0FEREVSX0xFTiAgICAgICAgICAgICAgMHgwMkVECisjZGVmaW5lIFBSRV9IRUFERVJfUkVNT1ZFUl9DVFJMICAgICAgICAgICAweDAyRUUKKyNkZWZpbmUgRlNNX0RWQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDJGMAorI2RlZmluZSBUUzJVU0JfRlNNX0RFQlVHICAgICAgICAgICAgICAgICAgMHgwMkYyCisjZGVmaW5lIFRTT1VUX1BBUl9GU01fREVCVUcgICAgICAgICAgICAgICAweDAyRjMKKyNkZWZpbmUgR0FQX1JFTU9WRVJfRlNNX0RFQlVHICAgICAgICAgICAgIDB4MDJGNAorI2RlZmluZSBQSURfQU5EX1NZTkNfUkVNQVBQRVJfRlNNX0RFQlVHICAgMHgwMkY1CisjZGVmaW5lIFBSRV9IRUFERVJfQURERVJfRlNNX0RFQlVHICAgICAgICAweDAyRjYKKyNkZWZpbmUgU1lOQ19SVFZfRlNNX0RFQlVHICAgICAgICAgICAgICAgIDB4MDJGNworI2RlZmluZSBDSEVDS19QSFlfQ0xLICAgICAgICAgICAgICAgICAgICAgMHgwRTAwCisjZGVmaW5lIFVTQl9DVFJMMSAgICAgICAgICAgICAgICAgICAgICAgICAweDBFMDEKKyNkZWZpbmUgVVNCX0lTTzJfb3V0ICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBVU0JfSVNPMV9vdXQgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFVTQl9JbnRlcnJ1cHRfb3V0ICAgICAgICAgICAgICAgICAweDFFMDAKKyNkZWZpbmUgVVNCX0J1bGtfaW4gICAgICAgICAgICAgICAgICAgICAgIDB4MUYwMAorI2RlZmluZSBDQzJfQnVmZmVyX291dCAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFVTQl9FUDAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwQzAKKyNkZWZpbmUgQ0MyX0J1ZmZlcl9pbiAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBVU0JfSVNPMl9pbiAgICAgICAgICAgICAgICAgICAgICAgMHg1ODAwCisjZGVmaW5lIFVTQl9JU08xX2luICAgICAgICAgICAgICAgICAgICAgICAweDYwMDAKKyNkZWZpbmUgbm1iX3ZlY3Rvcl9hZGRyZXNzX2xzYiAgICAgICAgICAgIDB4RkZGQQorI2RlZmluZSBubWJfdmVjdG9yX2FkZHJlc3NfbXNiICAgICAgICAgICAgMHhGRkZCCisjZGVmaW5lIHJlc2V0X3ZlY3Rvcl9hZGRyZXNzX2xzYiAgICAgICAgICAweEZGRkMKKyNkZWZpbmUgcmVzZXRfdmVjdG9yX2FkZHJlc3NfbXNiICAgICAgICAgIDB4RkZGRAorI2RlZmluZSBpcmJfdmVjdG9yX2FkZHJlc3NfbHNiICAgICAgICAgICAgMHhGRkZFCisjZGVmaW5lIGlyYl92ZWN0b3JfYWRkcmVzc19tc2IgICAgICAgICAgICAweEZGRkYKKworCisjZGVmaW5lIENJTUFYX1JFR19IRFJfU0laRSA0CisjZGVmaW5lIENJTUFYX1JFR19QTERfU0laRSAyNTUKKyNkZWZpbmUgQ0lNQVhfQ0FNX0hEUl9TSVpFIDQKKyNkZWZpbmUgQ0lNQVhfQ0FNX1BMRF9TSVpFIDY1NTM1CisKKyNkZWZpbmUgREVGX0xPQ0soX2xfKSBzdHJ1Y3QgbXV0ZXggX2xfCisKK3N0cnVjdCBjaW1heF91c2IgeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IGRldmljZV9zICpkZXY7CisKKwlzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heDsKKworCXU4IGJ1ZltDSU1BWF9SRUdfSERSX1NJWkUgKyBDSU1BWF9DQU1fSERSX1NJWkUgKyBDSU1BWF9DQU1fUExEX1NJWkVdOworCWludCBidWZfc2l6ZTsKKworCWludCBjYW1faW5zZXJ0ZWRbMl07CisjZGVmaW5lIElOX0lOU0VSVEVEIDB4MDEKKyNkZWZpbmUgSU5fUE9XRVJFRCAgMHgwMgorI2RlZmluZSBJTl9MSU5LRUQgICAweDA0CisJaW50IGNhbV9kYXRhX3JlYWR5WzJdOworCisJaW50IHBvbGxfbW9kZTsKKyNkZWZpbmUgU1RPUF9NT0RFIDAKKyNkZWZpbmUgUE9MTF9NT0RFIDEKKyNkZWZpbmUgSU5UX01PREUgIDIKKworCWludCByc3RfaW87CisKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd29ya3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOworCWludCB3b3JrX2F1dG9fcmVzdGFydDsKKwlpbnQgd29ya19jbnQ7CisKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHBvd2VyX3dvcms7CisJaW50IHBvd2VyX3dvcmtfY250OworCWludCBjYW1fZGV0OworCisJREVGX0xPQ0sobG9jayk7CisjZGVmaW5lIGxvY2tfaW5pdChfdXNiKSBtdXRleF9pbml0KCYoX3VzYiktPmxvY2spCisjZGVmaW5lIGxvY2tfbG9jayhfdXNiKSBkbyB7XAorCWludCBlcnIgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJihfdXNiKS0+bG9jayk7XAorCWlmIChlcnIpXAorCQlyZXR1cm4gZXJyO1wKK30gd2hpbGUgKDApCisjZGVmaW5lIGxvY2tfdW5sb2NrKF91c2IpIG11dGV4X3VubG9jaygmKF91c2IpLT5sb2NrKQorCisJdTggKmNpczsKKyNkZWZpbmUgQ0lTX01BWCA1MTIKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2ltYXhfdXNiICpnX3VzYjsKKworTU9EVUxFX1BBUk1fREVTQyh1c2JkZWJ1ZywgImVuYWJsZSB2ZXJib3NlIGRlYnVnIG1lc3NhZ2VzIik7CitzdGF0aWMgaW50IGNpbWF4X3VzYl9kZWJ1ZyA9IDE7Cittb2R1bGVfcGFyYW1fbmFtZWQodXNiZGVidWcsIGNpbWF4X3VzYl9kZWJ1ZywgaW50LCAwNjQ0KTsKKworTU9EVUxFX1BBUk1fREVTQyh1c2Jwb2xsX2ludGVydmFsLCAiaW50ZXJ2YWwgZm9yIHVzYiBwb2xsIik7CitzdGF0aWMgaW50IHVzYl9wb2xsX2ludGVydmFsID0gMTAwOworbW9kdWxlX3BhcmFtX25hbWVkKHVzYnBvbGxfaW50ZXJ2YWwsIHVzYl9wb2xsX2ludGVydmFsLCBpbnQsIDA2NDQpOworCitNT0RVTEVfUEFSTV9ERVNDKHVzYnBvbGxfbW9kZSwgInNldCBjaW1heCBwb2xsIG1vZGUsIG5lZWQgcmVzZXQiKTsKK3N0YXRpYyBpbnQgY2ltYXhfcG9sbF9tb2RlID0gMTsKK21vZHVsZV9wYXJhbV9uYW1lZCh1c2Jwb2xsX21vZGUsIGNpbWF4X3BvbGxfbW9kZSwgaW50LCAwNjQ0KTsKKworTU9EVUxFX1BBUk1fREVTQyh1c2JjYW1faXJxX21vZGUsICJzZXQgY2FtIGlycSBtb2RlLCBuZWVkIHJlc2V0Iik7CitzdGF0aWMgaW50IGNhbV9pcnFfbW9kZTsKK21vZHVsZV9wYXJhbV9uYW1lZCh1c2JjYW1faXJxX21vZGUsIGNhbV9pcnFfbW9kZSwgaW50LCAwNjQ0KTsKKworCisjZGVmaW5lIENJTUFYX1JFR19SRUFEICAgICAweGZmCisjZGVmaW5lIENJTUFYX1JFR19SRUFEX09LICAweDRjCisjZGVmaW5lIENJTUFYX1JFR19XUklURSAgICAweDdmCisjZGVmaW5lIENJTUFYX1JFR19XUklURV9PSyAweDRkCisjZGVmaW5lIENJTUFYX1JFR19JTklUICAgICAweDAwCisjZGVmaW5lIENJTUFYX1JFR19JTklUX09LICAweDRiCisjZGVmaW5lIENJTUFYX1JFR19DTURfRVJST1IgMHg1MQorCisjZGVmaW5lIENJTUFYX0NBTV9SRVNFVCAgICAweDAxCisjZGVmaW5lIENJTUFYX0NBTV9SRVNFVF9PSyAweDQwCisjZGVmaW5lIENJTUFYX0NBTV9DSVMgICAgICAweDAyCisjZGVmaW5lIENJTUFYX0NBTV9DSVNfT0sgICAweDQxCisjZGVmaW5lIENJTUFYX0NBTV9DT1IgICAgICAweDAzCisjZGVmaW5lIENJTUFYX0NBTV9DT1JfT0sgICAweDQyCisjZGVmaW5lIENJTUFYX0NBTV9ORUcgICAgICAweDA0CisjZGVmaW5lIENJTUFYX0NBTV9ORUdfT0sgICAweDQzCisjZGVmaW5lIENJTUFYX0NBTV9XTFBEVSAgICAweDA1CisjZGVmaW5lIENJTUFYX0NBTV9XTFBEVV9PSyAweDQ0CisjZGVmaW5lIENJTUFYX0NBTV9STFBEVSAgICAweDA2CisjZGVmaW5lIENJTUFYX0NBTV9STFBEVV9PSyAweDQ2CisjZGVmaW5lIENJTUFYX0NBTV9FVlQgICAgICAgICAweDBkCisjZGVmaW5lIENJTUFYX0NBTV9ERVRfT0sgICAgICAweDQ1CisjZGVmaW5lIENJTUFYX0NBTV9OT0NBTSAgICAgICAweDQ5CisjZGVmaW5lIENJTUFYX0NBTV9FUlJPUiAgICAgICAweDRhCisjZGVmaW5lIENJTUFYX0NBTV9OT0VWVCAgICAgICAweDU1CisjZGVmaW5lIENJTUFYX0NBTV9EQVRBX1JFQURZICAweDRlCisjZGVmaW5lIENJTUFYX0NBTV9XQlVTWSAgICAgICAweDU0CisjZGVmaW5lIENJTUFYX0NBTV9QRU5ESU5HICAgICAweDU2CisjZGVmaW5lIENJTUFYX0NBTV9SRUdTVEFUICAgICAweDBlCisjZGVmaW5lIENJTUFYX0NBTV9SRUdTVEFUX09LICAweDU3CisKKworI2RlZmluZSBDSU1BWF9DQU1fUEtUX0NOVF9WQUwgMQorCisjZGVmaW5lIENJTUFYX1NMT1RfQSAwCisjZGVmaW5lIENJTUFYX1NMT1RfQiAxCisKKyNkZWZpbmUgQ0lNQVhfQ01EX1JFU1BfTUFTSyAweDdmCisKKyNkZWZpbmUgY2ltYXhfdG9fdXNiKF9jKSAoKHN0cnVjdCBjaW1heF91c2IgKikoKF9jKS0+cHJpdikpCisjZGVmaW5lIGRldl90b191c2IoX2QpICgoc3RydWN0IGNpbWF4X3VzYiAqKXVzYl9nZXRfZHJ2ZGF0YShfZCkpCisKKyNkZWZpbmUgYnl0ZV90b191MTYoX2IxLCBfYjIpICAgKCgoX2IxKTw8OCkgfCAoX2IyKSkKKworI2RlZmluZSBoZHJfY21kX3Jlc3AoX3MpICAgICAoKF9zKS0+YnVmWzBdICYgQ0lNQVhfQ01EX1JFU1BfTUFTSykKKworI2RlZmluZSByZWdfaGRyKF9zKSAgICAgICAgICAoKF9zKS0+YnVmKQorI2RlZmluZSByZWdfYWRkcihfcykgICAgICAgICBieXRlX3RvX3UxNigoX3MpLT5idWZbMV0sIChfcyktPmJ1ZlsyXSkKKyNkZWZpbmUgcmVnX2hkcl9kYXRfc2l6ZShfcykgKChfcyktPmJ1ZlszXSkKKyNkZWZpbmUgcmVnX2RhdChfcykgICAgICAgICAgKCYoKF9zKS0+YnVmW0NJTUFYX1JFR19IRFJfU0laRV0pKQorCisjZGVmaW5lIGNhbV9oZHIoX3MpICAgICAgICAgICgoX3MpLT5idWYpCisjZGVmaW5lIGNhbV9oZHJfc2xvdChfcykgICAgICgoKF9zKS0+YnVmWzBdICYgMHg4MCkgPyAxIDogMCkKKyNkZWZpbmUgY2FtX2hkcl9wa3RfY250KF9zKSAgKChfcyktPmJ1ZlsxXSkKKyNkZWZpbmUgY2FtX2hkcl9kYXRfc2l6ZShfcykgYnl0ZV90b191MTYoKF9zKS0+YnVmWzJdLCAoX3MpLT5idWZbM10pCisjZGVmaW5lIGNhbV9kYXQoX3MpICAgICAgICAgICgmKChfcyktPmJ1ZltDSU1BWF9DQU1fSERSX1NJWkVdKSkKKworI2RlZmluZSBSRUdfVElNRU9VVCA1MDAKKyNkZWZpbmUgQ0FNX1RJTUVPVVQgNTAwMAorCitzdGF0aWMgaW50IGFtbF9jaW1heF91c2JfbW9kX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CitzdGF0aWMgdm9pZCBhbWxfY2ltYXhfdXNiX21vZF9leGl0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworCitzdGF0aWMgaW50IGNpbWF4X3VzYl9zZXRfbG9vcChzdHJ1Y3QgY2ltYXhfdXNiICp1c2IsIGludCBsb29wKTsKKworc3RhdGljIHZvaWQgZHVtcChjaGFyICp0aXRsZSwgdTggKmJ1ZiwgaW50IHNpemUpCit7CisJaW50IGk7CisJcHJfaW5mbygiJXNcbiIsIHRpdGxlKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCWlmICghKGkgJiAweGYpKQorCQkJcHJfaW5mbygiXG5cdCIpOworCQlwcl9pbmZvKCIlMDJ4ICIsICooYnVmK2kpKTsKKwl9CisJcHJfaW5mbygiXG4iKTsKK30KKworc3RhdGljIHZvaWQgcGVycihjaGFyICplcnIsIHN0cnVjdCBjaW1heF91c2IgKnVzYikKK3sKKwlwcl9lcnJvcigiZXJyb3I6ICVzXG4iLCBlcnIpOworCWR1bXAoImR1bXA6IiwgdXNiLT5idWYsIDE2KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF9qaWZmaWVzKHZvaWQpCit7CisJcmV0dXJuICh1bnNpZ25lZCBsb25nKShzY2hlZF9jbG9jaygpLzEwMDAwMDAwKTsKK30KKworc3RhdGljIGludCBjYW1fdXNiX2NhbV9kZXRlY3Qoc3RydWN0IGNpbWF4X3VzYiAqdXNiLCBpbnQgc2xvdCwgaW50IGZsYWcpCit7CisJdXNiLT5jYW1faW5zZXJ0ZWRbc2xvdF0gPSBmbGFnOworCXByX2luZigiZGV0ZWN0IHNsb3QoJWQpOiAweCV4KCVzKVxuIiwKKwkJc2xvdCwgdXNiLT5jYW1faW5zZXJ0ZWRbc2xvdF0sCisJCSghZmxhZykgPyAibm9uZSIgOgorCQkoZmxhZyAmIElOX0xJTktFRCkgPyAibGlua2VkIiA6CisJCShmbGFnICYgSU5fUE9XRVJFRCkgPyAicG93ZXJlZCIgOgorCQkoZmxhZyAmIElOX0lOU0VSVEVEKSA/ICJpbnNlcnRlZCIgOgorCQkidW5rbm93biIpOworCWFtbF9jaW1heF9zbG90X3N0YXRlX2NoYW5nZWQodXNiLT5jaW1heCwgc2xvdCwKKwkJdXNiLT5jYW1faW5zZXJ0ZWRbc2xvdF0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3VzYl9jYW1fcmVhZHkoc3RydWN0IGNpbWF4X3VzYiAqdXNiLCBpbnQgc2xvdCkKK3sKKwlpZiAodXNiLT5jYW1faW5zZXJ0ZWRbc2xvdF0gJiBJTl9QT1dFUkVEKSB7CisJCWNhbV91c2JfY2FtX2RldGVjdCh1c2IsIHNsb3QsCisJCQl1c2ItPmNhbV9pbnNlcnRlZFtzbG90XSB8IElOX0xJTktFRCk7CisJCWNpbWF4X3VzYl9zZXRfbG9vcCh1c2IsIDEpOy8qc2V0IGF1dG8tbG9vcCovCisJfQorfQorCitzdGF0aWMgaW50IGluaXRfcmVnX2hkcih1OCAqaGRyLCB1OCB0YWcsIGludCBhZGRyLCBpbnQgc2l6ZSkKK3sKKwloZHJbMF0gPSB0YWc7CisJaGRyWzFdID0gKGFkZHI+PjgpICYgMHhmZjsKKwloZHJbMl0gPSBhZGRyICYgMHhmZjsKKwloZHJbM10gPSBzaXplOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX3JlZ19oZHIodTggKmhkciwgdTggdGFnLCBpbnQgYWRkciwgaW50IHNpemUpCit7CisJcmV0dXJuIGhkclswXSAhPSB0YWcKKwkJfHwgaGRyWzFdICE9ICgoYWRkcj4+OCkgJiAweGZmKQorCQl8fCBoZHJbMl0gIT0gKGFkZHIgJiAweGZmKQorCQl8fCBoZHJbM10gIT0gc2l6ZTsKK30KKworc3RhdGljIGludCBhbWxfY2ltYXhfdXNiX3JlYWRfcmVnKHN0cnVjdCBhbWxfY2ltYXggKmNpbWF4LCBpbnQgYWRkciwKKwkJdTggKmJ1ZiwgaW50IHNpemUpCit7CisJc3RydWN0IGNpbWF4X3VzYiAqdXNiID0gY2ltYXhfdG9fdXNiKGNpbWF4KTsKKwlzdHJ1Y3QgZGV2aWNlX3MgKmRldiA9IHVzYi0+ZGV2OworCXU4IG91dFtDSU1BWF9SRUdfSERSX1NJWkVdOworCWludCBlcnIgPSAwOworCisJaW5pdF9yZWdfaGRyKG91dCwgQ0lNQVhfUkVHX1JFQUQsIGFkZHIsIHNpemUpOworCisJbG9ja19sb2NrKHVzYik7CisKKwkvKnByX2RiZygicmQgJTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJb3V0WzBdLCBvdXRbMV0sCisJCW91dFsyXSwgb3V0WzNdKTsqLworCWVyciA9IGNpbWF4X3VzYl9jaV93cml0ZShkZXYsCisJCQlvdXQsIENJTUFYX1JFR19IRFJfU0laRSwgdXNiLT5idWYsIHNpemVvZih1c2ItPmJ1ZikpOworCWlmIChlcnIpCisJCWdvdG8gZW5kOworCWlmIChjaGVja19yZWdfaGRyKHJlZ19oZHIodXNiKSwgQ0lNQVhfUkVHX1JFQURfT0ssIGFkZHIsIHNpemUpICE9IDApIHsKKwkJcHJfZGJnKCJyZCAlMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJb3V0WzBdLCBvdXRbMV0sCisJCQlvdXRbMl0sIG91dFszXSk7CisJCXBlcnIoInJlYWQgcmVnIGZhaWwuIiwgdXNiKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCW1lbWNweShidWYsIHJlZ19kYXQodXNiKSwgc2l6ZSk7CitlbmQ6CisJbG9ja191bmxvY2sodXNiKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGFtbF9jaW1heF91c2Jfd3JpdGVfcmVnKHN0cnVjdCBhbWxfY2ltYXggKmNpbWF4LCBpbnQgYWRkciwKKwkJdTggKmJ1ZiwgaW50IHNpemUpCit7CisJc3RydWN0IGNpbWF4X3VzYiAqdXNiID0gY2ltYXhfdG9fdXNiKGNpbWF4KTsKKwlzdHJ1Y3QgZGV2aWNlX3MgKmRldiA9IHVzYi0+ZGV2OworCXU4IG91dFtDSU1BWF9SRUdfSERSX1NJWkUgKyBDSU1BWF9SRUdfUExEX1NJWkVdOworCWludCBlcnIgPSAwOworCisJaW5pdF9yZWdfaGRyKG91dCwgQ0lNQVhfUkVHX1dSSVRFLCBhZGRyLCBzaXplKTsKKwltZW1jcHkoJm91dFtDSU1BWF9SRUdfSERSX1NJWkVdLCBidWYsIHNpemUpOworCisJbG9ja19sb2NrKHVzYik7CisKKwlwcl9kYmcoIndyICUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCW91dFswXSwgb3V0WzFdLAorCQlvdXRbMl0sIG91dFszXSk7CisJZXJyID0gY2ltYXhfdXNiX2NpX3dyaXRlKGRldiwKKwkJb3V0LCBDSU1BWF9SRUdfSERSX1NJWkUgKyBzaXplLCB1c2ItPmJ1Ziwgc2l6ZW9mKHVzYi0+YnVmKSk7CisJaWYgKGVycikKKwkJZ290byBlbmQ7CisJaWYgKGNoZWNrX3JlZ19oZHIocmVnX2hkcih1c2IpLCBDSU1BWF9SRUdfV1JJVEVfT0ssIGFkZHIsIDApICE9IDApIHsKKwkJcGVycigid3JpdGUgcmVnIGZhaWwuIiwgdXNiKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorZW5kOgorCWxvY2tfdW5sb2NrKHVzYik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSBpbnQgaW5pdF9jYW1faGRyKHU4ICpoZHIsIGludCBjbWQsIGludCBzaXplKQoreworCWhkclswXSA9IGNtZDsKKwloZHJbMV0gPSBDSU1BWF9DQU1fUEtUX0NOVF9WQUw7CisJaGRyWzJdID0gKHNpemU+PjgpICYgMHhmZjsKKwloZHJbM10gPSBzaXplICYgMHhmZjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY2FtX2VycihzdHJ1Y3QgY2ltYXhfdXNiICp1c2IpCit7CisJaWYgKGhkcl9jbWRfcmVzcCh1c2IpICE9IENJTUFYX0NBTV9FUlJPUgorCQl8fCBjYW1faGRyX3BrdF9jbnQodXNiKSAhPSBDSU1BWF9DQU1fUEtUX0NOVF9WQUwKKwkJfHwgY2FtX2hkcl9kYXRfc2l6ZSh1c2IpICE9IDIpCisJCXJldHVybiAwOworCXJldHVybiBieXRlX3RvX3UxNihjYW1fZGF0KHVzYilbMF0sIGNhbV9kYXQodXNiKVsxXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgY2hhciAqY2FtX2Vycl9zdHIoaW50IGVycikKK3sKKyNkZWZpbmUgQ0FNRVJST1JfUkVTRVQgICAgICAgICAgIDB4MDEwMQorI2RlZmluZSBDQU1FUlJPUl9DSVNfQlVGICAgICAgICAgMHgwMjAxCisjZGVmaW5lIENBTUVSUk9SX0NJU19TSVpFICAgICAgICAweDAyMDIKKyNkZWZpbmUgQ0FNRVJST1JfQ0FNX05PVF9BQ1QgICAgIDB4MDIwMworI2RlZmluZSBDQU1FUlJPUl9DT1JfTk9UX1JFQURZICAgMHgwMzAxCisjZGVmaW5lIENBTUVSUk9SX0NPUl9WQUxfQ0hLICAgICAweDAzMDIKKyNkZWZpbmUgQ0FNRVJST1JfTkVHX05PX1JFU1AgICAgIDB4MDQwMQorI2RlZmluZSBDQU1FUlJPUl9ORUdfQkFEX1NJWkUgICAgMHgwNDAyCisjZGVmaW5lIENBTUVSUk9SX05FR19OT1RfUkVBRFkgICAweDA0MDMKKyNkZWZpbmUgQ0FNRVJST1JfTFBEVV9OT1RfQVZBSUwgIDB4MDYwMQorCXN0cnVjdCB7IGludCBlcnI7IGNoYXIgKnN0cjsgfSBjYW1fZXJyX3N0cmluZ3NbXSA9IHsKKwkJe0NBTUVSUk9SX1JFU0VULCAicmVzZXQgZXJyb3IsIG5vdCByZWFkeS4ifSwKKwkJe0NBTUVSUk9SX0NJU19CVUYsICJjaXMgZXJyb3IsIGJ1ZmZlciBub3QgYWxsb2NhdGVkLiJ9LAorCQl7Q0FNRVJST1JfQ0lTX1NJWkUsICJjaXMgZXJyb3IsIGJhZCBjaXMgc2l6ZS4ifSwKKwkJe0NBTUVSUk9SX0NBTV9OT1RfQUNULCAiY2FtIG5vdCBhY3RpdmF0ZWQuIn0sCisJCXtDQU1FUlJPUl9DT1JfTk9UX1JFQURZLCAiY2FtIG5vdCByZWFkeSBkdXJpbmcgd3JpdGUgQ09SLiJ9LAorCQl7Q0FNRVJST1JfQ09SX1ZBTF9DSEssICJDT1IgdmFsdWUgY2hlY2sgZmFpbGVkLiJ9LAorCQl7Q0FNRVJST1JfTkVHX05PX1JFU1AsICJjYW0gbm90IHJlc3BvbmRpbmcgd2hlbiBuZWdvdGlhdGlvbi4ifSwKKwkJe0NBTUVSUk9SX05FR19CQURfU0laRSwgImNhbSBidWYgc2l6ZSBsZW5ndGggIT0gMi4ifSwKKwkJe0NBTUVSUk9SX05FR19OT1RfUkVBRFksICJjYW0gbm90IHJlYWR5IGR1cmluZyBuZWdvdGlhdGlvbi4ifSwKKwkJe0NBTUVSUk9SX0xQRFVfTk9UX0FWQUlMLCAibHBkdSBub3QgYXZhaWxhYmxlLiJ9CisJfTsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOworCQlpIDwgc2l6ZW9mKGNhbV9lcnJfc3RyaW5ncykvc2l6ZW9mKGNhbV9lcnJfc3RyaW5nc1swXSk7IGkrKykgeworCQlpZiAoY2FtX2Vycl9zdHJpbmdzW2ldLmVyciA9PSBlcnIpCisJCQlyZXR1cm4gY2FtX2Vycl9zdHJpbmdzW2ldLnN0cjsKKwl9CisJcmV0dXJuICJlcnIgdW5rbm93bi4iOworfQorCitzdGF0aWMgaW50IGNpbWF4X3VzYl9hY2Nlc3NfY2FtKHN0cnVjdCBjaW1heF91c2IgKnVzYiwgaW50IHNsb3QsCisJCWludCBjbWQsIHU4ICp0eCwgaW50IHR4X3NpemUsIHU4ICpyeCwgaW50IHJ4X3NpemUpCit7CisJc3RydWN0IGRldmljZV9zICpkZXYgPSB1c2ItPmRldjsKKwl1OCAqb3V0ID0gTlVMTDsKKwlpbnQgZXJyID0gMDsKKworCW91dCA9IGt6YWxsb2MoQ0lNQVhfQ0FNX0hEUl9TSVpFICsgQ0lNQVhfQ0FNX1BMRF9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW91dCkgeworCQlwcl9lcnIoIm5vIG1lbSBmb3IgYWNjZXNzIGNhbS5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljbWQgfD0gc2xvdCA/IDB4ODAgOiAwOworCWluaXRfY2FtX2hkcihvdXQsIGNtZCwgdHhfc2l6ZSk7CisJbWVtY3B5KCZvdXRbQ0lNQVhfQ0FNX0hEUl9TSVpFXSwgdHgsIHR4X3NpemUpOworCS8qZHVtcCgiYWNjZXNzIGNhbToiLCBvdXQsIENJTUFYX0NBTV9IRFJfU0laRStzaXplKTsqLworCisJbG9ja19sb2NrKHVzYik7CisKKwllcnIgPSBjaW1heF91c2JfY2lfd3JpdGUoZGV2LAorCQkJb3V0LCBDSU1BWF9DQU1fSERSX1NJWkUgKyB0eF9zaXplLCByeCwgcnhfc2l6ZSk7CisJaWYgKGVycikKKwkJZ290byBlbmQ7CisJaWYgKGNhbV9oZHJfc2xvdCh1c2IpICE9IHNsb3QpIHsKKwkJcHJfZXJyb3IoImV4cGVjdCBzbG90KCVkKSwgYnV0IHNsb3QoJWQpXG4iLAorCQkJc2xvdCwgY2FtX2hkcl9zbG90KHVzYikpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9CisJc3dpdGNoIChoZHJfY21kX3Jlc3AodXNiKSkgeworCWNhc2UgQ0lNQVhfQ0FNX05PQ0FNOgorCQlwcl9kYmcoIm5vIGNhbVxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWJyZWFrOworCWNhc2UgQ0lNQVhfQ0FNX0VSUk9SOgorCQlwcl9lcnJvcigiY2FtIGVycm9yXG4iKTsKKwkJcHJfZXJyb3IoImVyciBjb2RlOiAweCUwNHgoJXMpXG4iLCBjYW1fZXJyKHVzYiksCisJCQljYW1fZXJyX3N0cihjYW1fZXJyKHVzYikpKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJYnJlYWs7CisJY2FzZSBDSU1BWF9DQU1fV0JVU1k6CisJCXByX2RiZygiY2FtIGJ1c3lcbiIpOworCQllcnIgPSAtRUJVU1k7CisJCWJyZWFrOworCWNhc2UgQ0lNQVhfQ0FNX1BFTkRJTkc6CisJCXByX2RiZygiY2FtIHBlbmRpbmdcbiIpOworCQllcnIgPSAtRUFHQUlOOworCQlicmVhazsKKwl9CitlbmQ6CisJa2ZyZWUob3V0KTsKKwlsb2NrX3VubG9jayh1c2IpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYW1sX2NpbWF4X3VzYl9yZWFkX2NpcyhzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCwgaW50IHNsb3QsCisJCXU4ICpidWYsIGludCBzaXplKQoreworCXN0cnVjdCBjaW1heF91c2IgKnVzYiA9IGNpbWF4X3RvX3VzYihjaW1heCk7CisJaW50IGVyciA9IDA7CisJaW50IGxlbjsKKworCWVyciA9IGNpbWF4X3VzYl9hY2Nlc3NfY2FtKHVzYiwgc2xvdCwgQ0lNQVhfQ0FNX0NJUywKKwkJTlVMTCwgMCwgdXNiLT5idWYsIHNpemVvZih1c2ItPmJ1ZikpOworCWlmIChlcnIpCisJCWdvdG8gZW5kOworCWlmIChoZHJfY21kX3Jlc3AodXNiKSAhPSBDSU1BWF9DQU1fQ0lTX09LCisJCXx8IGNhbV9oZHJfcGt0X2NudCh1c2IpICE9IENJTUFYX0NBTV9QS1RfQ05UX1ZBTCkgeworCQlwZXJyKCJyZWFkIGNpcyBmYWlsLiIsIHVzYik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZW5kOworCX0KKwlsZW4gPSBjYW1faGRyX2RhdF9zaXplKHVzYik7CisJaWYgKHNpemUgPCBsZW4pIHsKKwkJcHJfZXJyb3IoImNpcyBzaXplIHRvbyBsYXJnZSwgZXhwZWN0PCVkLCBidXQ6JWRcbiIsIHNpemUsIGxlbik7CisJCXBlcnIoImNpcyBmYWlsLiIsIHVzYik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZW5kOworCX0KKwltZW1jcHkoYnVmLCBjYW1fZGF0KHVzYiksIGxlbik7CisKKwlpZiAoIXVzYi0+Y2lzKQorCQl1c2ItPmNpcyA9IGt6YWxsb2MoKGxlbiA8IDUxMikgPyA1MTIgOiBsZW4sIEdGUF9LRVJORUwpOworCWlmICh1c2ItPmNpcykKKwkJbWVtY3B5KHVzYi0+Y2lzLCBjYW1fZGF0KHVzYiksIGxlbik7CisKK2VuZDoKKwlyZXR1cm4gZXJyOworfQorI2RlZmluZSBDSU1BWF9DQU1fQ09SX1BMRF9TSVpFIDUKK3N0YXRpYyBpbnQgYW1sX2NpbWF4X3VzYl93cml0ZV9jb3Ioc3RydWN0IGFtbF9jaW1heCAqY2ltYXgsIGludCBzbG90LAorCQlpbnQgYWRkciwgdTggKmJ1ZikKK3sKKwlzdHJ1Y3QgY2ltYXhfdXNiICp1c2IgPSBjaW1heF90b191c2IoY2ltYXgpOworCWludCBlcnIgPSAwOworCXU4IG91dFtDSU1BWF9DQU1fQ09SX1BMRF9TSVpFICsgOF07CisJaW50IHN6ID0gQ0lNQVhfQ0FNX0NPUl9QTERfU0laRTsKKworCW91dFswXSA9IGFkZHI+PjggJiAweGZmOworCW91dFsxXSA9IGFkZHIgJiAweGZmOworCW91dFsyXSA9IGJ1ZlswXTsKKwlvdXRbM10gPSAwOworCW91dFs0XSA9IDA7CisKKwlpZiAoIWNhbV9pcnFfbW9kZSkgeworCQlvdXRbNV0gPSAweDQwOy8qY2FtIHBvbGwgbW9kZSovCisJCXN6Kys7CisJfQorCisJZXJyID0gY2ltYXhfdXNiX2FjY2Vzc19jYW0odXNiLCBzbG90LCBDSU1BWF9DQU1fQ09SLAorCQkJb3V0LCBzeiwgdXNiLT5idWYsIHNpemVvZih1c2ItPmJ1ZikpOworCWlmIChlcnIpCisJCWdvdG8gZW5kOworCWlmIChoZHJfY21kX3Jlc3AodXNiKSAhPSBDSU1BWF9DQU1fQ09SX09LCisJCXx8IGNhbV9oZHJfcGt0X2NudCh1c2IpICE9IENJTUFYX0NBTV9QS1RfQ05UX1ZBTAorCQl8fCBjYW1faGRyX2RhdF9zaXplKHVzYikgIT0gMCkgeworCQlwZXJyKCJ3cml0ZSBjb3IgZmFpbC4iLCB1c2IpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9CitlbmQ6CisJcmV0dXJuIGVycjsKK30KKyNkZWZpbmUgQ0lNQVhfQ0FNX05FR19QTERfU0laRSAyCitzdGF0aWMgaW50IGFtbF9jaW1heF91c2JfbmVnb3RpYXRlKHN0cnVjdCBhbWxfY2ltYXggKmNpbWF4LCBpbnQgc2xvdCwgaW50IHNpemUpCit7CisJc3RydWN0IGNpbWF4X3VzYiAqdXNiID0gY2ltYXhfdG9fdXNiKGNpbWF4KTsKKwlpbnQgcmV0ID0gMDsKKwl1OCBvdXRbQ0lNQVhfQ0FNX05FR19QTERfU0laRV07CisKKwlvdXRbMF0gPSAoc2l6ZT4+OCkgJiAweGZmOworCW91dFsxXSA9IHNpemUgJiAweGZmOworCisJcmV0ID0gY2ltYXhfdXNiX2FjY2Vzc19jYW0odXNiLCBzbG90LCBDSU1BWF9DQU1fTkVHLAorCQkJb3V0LCBDSU1BWF9DQU1fTkVHX1BMRF9TSVpFLAorCQkJdXNiLT5idWYsIHNpemVvZih1c2ItPmJ1ZikpOworCWlmIChyZXQpCisJCWdvdG8gZW5kOworCWlmIChoZHJfY21kX3Jlc3AodXNiKSAhPSBDSU1BWF9DQU1fTkVHX09LCisJCXx8IGNhbV9oZHJfcGt0X2NudCh1c2IpICE9IENJTUFYX0NBTV9QS1RfQ05UX1ZBTAorCQl8fCBjYW1faGRyX2RhdF9zaXplKHVzYikgIT0gMikgeworCQlwZXJyKCJuZWdvdGlhdGUgZmFpbC4iLCB1c2IpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9CisJcmV0ID0gYnl0ZV90b191MTYoY2FtX2RhdCh1c2IpWzBdLCBjYW1fZGF0KHVzYilbMV0pOworCisJc2V0X3VzYl9jYW1fcmVhZHkodXNiLCBzbG90KTsKK2VuZDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFtbF9jaW1heF91c2Jfd3JpdGVfbHBkdShzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCwgaW50IHNsb3QsCisJCXU4ICpidWYsIGludCBzaXplKQoreworCXN0cnVjdCBjaW1heF91c2IgKnVzYiA9IGNpbWF4X3RvX3VzYihjaW1heCk7CisJaW50IHJldCA9IDA7CisKKwkvKmR1bXAoImxwZHUgLT4iLCBidWYsIHNpemUpOyovCisJcmV0ID0gY2ltYXhfdXNiX2FjY2Vzc19jYW0odXNiLCBzbG90LCBDSU1BWF9DQU1fV0xQRFUsCisJCWJ1Ziwgc2l6ZSwgdXNiLT5idWYsIHNpemVvZih1c2ItPmJ1ZikpOworCWlmIChyZXQpCisJCWdvdG8gZW5kOworCWlmIChoZHJfY21kX3Jlc3AodXNiKSAhPSBDSU1BWF9DQU1fV0xQRFVfT0sKKwkJfHwgY2FtX2hkcl9wa3RfY250KHVzYikgIT0gQ0lNQVhfQ0FNX1BLVF9DTlRfVkFMCisJCXx8IGNhbV9oZHJfZGF0X3NpemUodXNiKSAhPSAwKSB7CisJCXBlcnIoIndyaXRlIGxwZHUgZmFpbC4iLCB1c2IpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9CisJcmV0ID0gc2l6ZTsKK2VuZDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFtbF9jaW1heF91c2JfcmVhZF9scGR1KHN0cnVjdCBhbWxfY2ltYXggKmNpbWF4LCBpbnQgc2xvdCwKKwkJdTggKmJ1ZiwgaW50IHNpemUpCit7CisJc3RydWN0IGNpbWF4X3VzYiAqdXNiID0gY2ltYXhfdG9fdXNiKGNpbWF4KTsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGNpbWF4X3VzYl9hY2Nlc3NfY2FtKHVzYiwgc2xvdCwgQ0lNQVhfQ0FNX1JMUERVLAorCQlOVUxMLCAwLCB1c2ItPmJ1Ziwgc2l6ZW9mKHVzYi0+YnVmKSk7CisJaWYgKHJldCkKKwkJZ290byBlbmQ7CisJaWYgKGhkcl9jbWRfcmVzcCh1c2IpICE9IENJTUFYX0NBTV9STFBEVV9PSworCQl8fCBjYW1faGRyX3BrdF9jbnQodXNiKSAhPSBDSU1BWF9DQU1fUEtUX0NOVF9WQUwpIHsKKwkJcGVycigicmVhZCBscGR1IGZhaWwuIiwgdXNiKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCXJldCA9IGNhbV9oZHJfZGF0X3NpemUodXNiKTsKKwltZW1jcHkoYnVmLCBjYW1fZGF0KHVzYiksIHJldCk7CisKKwkvKmR1bXAoImxwZHUgPC0iLCBidWYsIHJldCk7Ki8KKworCXVzYi0+Y2FtX2RhdGFfcmVhZHlbc2xvdF0gPSAwOworZW5kOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYW1sX2NpbWF4X3VzYl9yZWFkX2NhbV9zdGF0dXMoc3RydWN0IGFtbF9jaW1heCAqY2ltYXgsIGludCBzbG90KQoreworCXN0cnVjdCBjaW1heF91c2IgKnVzYiA9IGNpbWF4X3RvX3VzYihjaW1heCk7CisJaW50IHJldCA9IDA7CisKKwlpZiAoY2FtX2lycV9tb2RlICYmIHVzYi0+Y2FtX2RhdGFfcmVhZHlbc2xvdF0pCisJCXJldHVybiAweDgwOworCisJcmV0ID0gY2ltYXhfdXNiX2FjY2Vzc19jYW0odXNiLCBzbG90LCBDSU1BWF9DQU1fUkVHU1RBVCwKKwkJTlVMTCwgMCwgdXNiLT5idWYsIHNpemVvZih1c2ItPmJ1ZikpOworCWlmIChyZXQpCisJCWdvdG8gZW5kOworCWlmIChoZHJfY21kX3Jlc3AodXNiKSAhPSBDSU1BWF9DQU1fUkVHU1RBVF9PSworCQl8fCBjYW1faGRyX3BrdF9jbnQodXNiKSAhPSBDSU1BWF9DQU1fUEtUX0NOVF9WQUwKKwkJfHwgY2FtX2hkcl9kYXRfc2l6ZSh1c2IpICE9IDEpIHsKKwkJcGVycigicmVhZCBjYW0gc3RhdHVzIGZhaWwuIiwgdXNiKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCisJcmV0ID0gY2FtX2RhdCh1c2IpWzBdOworZW5kOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYW1sX2NpbWF4X3VzYl9zbG90X3Jlc2V0KHN0cnVjdCBhbWxfY2ltYXggKmNpbWF4LCBpbnQgc2xvdCkKK3sKKwlzdHJ1Y3QgY2ltYXhfdXNiICp1c2IgPSBjaW1heF90b191c2IoY2ltYXgpOworCWludCByZXQgPSAwOworCisJdXNiLT5jYW1fZGF0YV9yZWFkeVtzbG90XSA9IDA7CisKKwlyZXQgPSBjaW1heF91c2JfYWNjZXNzX2NhbSh1c2IsIHNsb3QsIENJTUFYX0NBTV9SRVNFVCwKKwkJTlVMTCwgMCwgdXNiLT5idWYsIHNpemVvZih1c2ItPmJ1ZikpOworCWlmIChyZXQpCisJCWdvdG8gZW5kOworCWlmIChoZHJfY21kX3Jlc3AodXNiKSAhPSBDSU1BWF9DQU1fUkVTRVRfT0sKKwkJfHwgY2FtX2hkcl9wa3RfY250KHVzYikgIT0gQ0lNQVhfQ0FNX1BLVF9DTlRfVkFMCisJCXx8IGNhbV9oZHJfZGF0X3NpemUodXNiKSAhPSAwKSB7CisJCXBlcnIoInNsb3QgcmVzZXQgZmFpbC4iLCB1c2IpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9CitlbmQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhbWxfY2ltYXhfdXNiX2NhbV9yZXNldChzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCwgaW50IHNsb3QpCit7CisJcHJfZGJnKCJTbG90KCVkKTogY2FtcmVzZXRcbiIsIHNsb3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtbF9jaW1heF91c2Jfc2xvdF9zaHV0ZG93bihzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCwgaW50IHNsb3QpCit7CisJcHJfZGJnKCJTbG90KCVkKTogc2h1dGRvd25cbiIsIHNsb3QpOworCXJldHVybiAwOworfQorc3RhdGljIGludCBhbWxfY2ltYXhfdXNiX3Nsb3RfdHNfZW5hYmxlKHN0cnVjdCBhbWxfY2ltYXggKmNpbWF4LCBpbnQgc2xvdCkKK3sKKwlwcl9kYmcoIlNsb3QoJWQpOiB0cyBjb250cm9sXG4iLCBzbG90KTsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgYW1sX2NpbWF4X3VzYl9zbG90X3N0YXR1cyhzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCwgaW50IHNsb3QpCit7CisJc3RydWN0IGNpbWF4X3VzYiAqdXNiID0gY2ltYXhfdG9fdXNiKGNpbWF4KTsKKwlpZiAodXNiLT5jYW1faW5zZXJ0ZWRbc2xvdF0gJiBJTl9QT1dFUkVEKSB7CisJCS8qcHJfZGJnKCJDQSBNb2R1bGUgcHJlc2VudCBhbmQgcmVhZHlcbiIpOyovCisJCXJldHVybiBEVkJfQ0FfRU41MDIyMV9QT0xMX0NBTV9QUkVTRU5UIHwKKwkJCURWQl9DQV9FTjUwMjIxX1BPTExfQ0FNX1JFQURZOworCX0gZWxzZSB7CisJCS8qcHJfZXJyb3IoIkNBIE1vZHVsZSBub3QgcHJlc2VudCBvciBub3QgcmVhZHlcbiIpOyovCisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNpbWF4X3VzYl9jYW1fcGx1Z2luKHN0cnVjdCBjaW1heF91c2IgKnVzYiwgaW50IHNsb3QsIGludCBwbHVnaW4pCit7CisJcHJfZGJnKCJjYW0gcGx1Zzogc2xvdCglZCkgJXNcbiIsCisJCXNsb3QsIHBsdWdpbiA/ICJwbHVnZ2VkIiA6ICJ1bnBsdWdnZWQiKTsKKwlyZXR1cm4gYW1sX2NpbWF4X2NhbWNoYW5nZWQodXNiLT5jaW1heCwgc2xvdCwgcGx1Z2luKTsKK30KKworc3RhdGljIGludCBjaW1heF91c2Jfc2V0X3Bvd2VyKHN0cnVjdCBjaW1heF91c2IgKnVzYiwgaW50IG9uKQoreworCXU4IHJlZyA9IDA7CisJaW50IGVyciA9IDA7CisJaWYgKCFvbikgeworCQlyZWcgPSAwOworCQllcnIgPSBhbWxfY2ltYXhfdXNiX3JlYWRfcmVnKHVzYi0+Y2ltYXgsIE1PRF9JVF9NQVNLLCAmcmVnLCAxKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCXJlZyB8PSAweDAzOworCQlyZWcgJj0gMHhmMzsKKworCQllcnIgPSBhbWxfY2ltYXhfdXNiX3dyaXRlX3JlZyh1c2ItPmNpbWF4LCBNT0RfSVRfTUFTSywgJnJlZywgMSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKwlyZWcgPSBvbiA/IDB4MyA6IDB4MDsKKwlyZXR1cm4gYW1sX2NpbWF4X3VzYl93cml0ZV9yZWcodXNiLT5jaW1heCwgR1BJTzBfREFUQV9PVVQsICZyZWcsIDEpOworfQorCitzdGF0aWMgaW50IGNpbWF4X3VzYl9jaGVja19wb2Uoc3RydWN0IGNpbWF4X3VzYiAqdXNiLCBpbnQgKm9uKQoreworCXU4IHJlZyA9IDA7CisJaW50IGVyciA9IDA7CisKKwkqb24gPSAwOworCisJZXJyID0gYW1sX2NpbWF4X3VzYl9yZWFkX3JlZyh1c2ItPmNpbWF4LCBDRkdfMSwgJnJlZywgMSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlpZiAocmVnICYgMHgyMCkgey8qaWYgVkNDRU4qLworCQlyZWcgfD0gMHgwODsvKnNldCBQT0UqLworCQllcnIgPSBhbWxfY2ltYXhfdXNiX3dyaXRlX3JlZyh1c2ItPmNpbWF4LCBDRkdfMSwgJnJlZywgMSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQllcnIgPSBhbWxfY2ltYXhfdXNiX3JlYWRfcmVnKHVzYi0+Y2ltYXgsIENGR18xLCAmcmVnLCAxKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCWlmIChyZWcgJiAweDA4KS8qaWYgUE9FIG9rKi8KKwkJCSpvbiA9IDE7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGNpbWF4X3VzYl9wb3dlcl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgY2ltYXhfdXNiICp1c2IgPSBjb250YWluZXJfb2YodG9fZGVsYXllZF93b3JrKHdvcmspLAorCQlzdHJ1Y3QgY2ltYXhfdXNiLCBwb3dlcl93b3JrKTsKKwlpbnQgcG93ZXIgPSAwOworCWludCBlcnIgPSAwOworCisJdXNiLT5wb3dlcl93b3JrX2NudCsrOworCWVyciA9IGNpbWF4X3VzYl9zZXRfcG93ZXIodXNiLCAxKTsKKwlpZiAoZXJyKQorCQlyZXR1cm47CisKKwllcnIgPSBjaW1heF91c2JfY2hlY2tfcG9lKHVzYiwgJnBvd2VyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm47CisKKwlpZiAocG93ZXIpIHsKKwkJcmV0dXJuOworCX0KKworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdXNiLT5wb3dlcl93b3JrLCB1c2JfcG9sbF9pbnRlcnZhbCk7Cit9CisKK3N0YXRpYyBpbnQgY2ltYXhfdXNiX2NhbV9wb3dlcmN0cmwoc3RydWN0IGNpbWF4X3VzYiAqdXNiLAorCQlpbnQgc2xvdCwgaW50IHBvd2VyKQoreworCWlmIChzbG90ICE9IDApCisJCXJldHVybiAwOworCisjaWZkZWYgRElTQUJMRV9QT1dFUl9QQVRDSAorCWlmIChwb3dlcikgeworCQljYW1fdXNiX2NhbV9kZXRlY3QodXNiLCBzbG90LAorCQkJdXNiLT5jYW1faW5zZXJ0ZWRbc2xvdF0gfCBJTl9QT1dFUkVEKTsKKwkJY2ltYXhfdXNiX2NhbV9wbHVnaW4odXNiLCBzbG90LCAxKTsKKwl9CisJcmV0dXJuIDA7CisjZWxzZQorCXByX2luZigiY2FuY2VsIHBvd2VyIGN0cmwgcHJldmlvdXNcbiIpOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmdXNiLT5wb3dlcl93b3JrKTsKKworCWlmICghcG93ZXIpIHsKKwkJaW50IGVyciA9IDA7CisJCWVyciA9IGNpbWF4X3VzYl9zZXRfcG93ZXIodXNiLCAwKTsKKwkJcHJfaW5mKCJzbG90WyVkXSBwb3dlciBvZmZcbiIsIHNsb3QpOworCQlyZXR1cm4gMDsKKwl9CisKKwlJTklUX0RFTEFZRURfV09SSygmdXNiLT5wb3dlcl93b3JrLCAmY2ltYXhfdXNiX3Bvd2VyX3dvcmspOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdXNiLT5wb3dlcl93b3JrLCB1c2JfcG9sbF9pbnRlcnZhbCk7CisJcHJfaW5mKCJzbG90WyVkXSBwb3dlciBjdHJsIHN0YXJ0ZWRcbiIsIHNsb3QpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2ltYXhfdXNiX3BvbGwoc3RydWN0IGNpbWF4X3VzYiAqdXNiKQoreworCXN0cnVjdCBkZXZpY2VfcyAqZGV2ID0gdXNiLT5kZXY7CisJaW50IHBvd2VyID0gMDsKKwlpbnQgZXJyID0gMDsKKwlpbnQgc2xvdCA9IDA7CisKKwlpZiAoIXVzYi0+Y2FtX2RldCkgeworCQlmb3IgKHNsb3QgPSAwOyBzbG90IDwgMjsgc2xvdCsrKSB7CisJCQlpbnQgYWRkciA9ICghc2xvdCkgPyBNT0RfQ1RSTF9BIDogTU9EX0NUUkxfQjsKKwkJCXU4IHJlZyA9IDA7CisJCQllcnIgPSBhbWxfY2ltYXhfdXNiX3JlYWRfcmVnKHVzYi0+Y2ltYXgsCisJCQkJCWFkZHIsICZyZWcsIDEpOworCQkJaWYgKHJlZyAmIDEpIHsKKwkJCQljYW1fdXNiX2NhbV9kZXRlY3QodXNiLCBzbG90LAorCQkJCQkocmVnICYgMSkgPyBJTl9JTlNFUlRFRCA6IDApOworCQkJCW1zbGVlcCgyMDApOworCQkJCWVyciA9IGNpbWF4X3VzYl9zZXRfcG93ZXIodXNiLCAocmVnICYgMSkpOworCQkJCWVyciA9IGNpbWF4X3VzYl9jaGVja19wb2UodXNiLCAmcG93ZXIpOworCQkJCXByX2luZigic2xvdFslZF0gcG93ZXIgb25cbiIsIHNsb3QpOworCQkJCW1zbGVlcCgyMDApOworCQkJCWlmIChwb3dlcikgeworCQkJCQljYW1fdXNiX2NhbV9kZXRlY3QodXNiLCBzbG90LAorCQkJCQl1c2ItPmNhbV9pbnNlcnRlZFtzbG90XSB8IElOX1BPV0VSRUQpOworCQkJCQljaW1heF91c2JfY2FtX3BsdWdpbih1c2IsIHNsb3QsIDEpOworCQkJCQl1c2ItPmNhbV9kZXQgPSAxOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJZXJyID0gY2ltYXhfdXNiX2NpX3JlYWRfZXZ0KGRldiwgQ0lNQVhfU0xPVF9BLAorCQkJdXNiLT5idWYsIHNpemVvZih1c2ItPmJ1ZikpOworCWlmIChlcnIpCisJCWdvdG8gZW5kOworCisJc3dpdGNoIChoZHJfY21kX3Jlc3AodXNiKSkgeworCWNhc2UgQ0lNQVhfQ0FNX0RFVF9PSzogeworCQlpbnQgc2xvdCA9IGNhbV9oZHJfc2xvdCh1c2IpOworCQlpbnQgaW5zZXJ0ID0gY2FtX2RhdCh1c2IpWzBdOworCQlpZiAoKCEhdXNiLT5jYW1faW5zZXJ0ZWRbc2xvdF0pICE9IGluc2VydCkgeworCQkJY2FtX3VzYl9jYW1fZGV0ZWN0KHVzYiwgc2xvdCwKKwkJCQlpbnNlcnQgPyBJTl9JTlNFUlRFRCA6IDApOworCQkJY2ltYXhfdXNiX2NhbV9wb3dlcmN0cmwodXNiLCBzbG90LCBpbnNlcnQpOworCQl9CisJCWlmICghaW5zZXJ0KQorCQkJdXNiLT5jYW1fZGV0ID0gMDsKKwkJfSBicmVhazsKKwljYXNlIENJTUFYX0NBTV9EQVRBX1JFQURZOiB7CisJCWludCBzbG90ID0gY2FtX2hkcl9zbG90KHVzYik7CisJCXVzYi0+Y2FtX2RhdGFfcmVhZHlbc2xvdF0gPSAxOworCQl9IGJyZWFrOworCWNhc2UgQ0lNQVhfQ0FNX05PRVZUOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnJvcigidW5rbm93biByZXNwOiUwMnhcbiIsIGhkcl9jbWRfcmVzcCh1c2IpKTsKKwkJYnJlYWs7CisJfQorZW5kOgorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjaW1heF91c2JfcG9sbF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgY2ltYXhfdXNiICp1c2IgPQorCQljb250YWluZXJfb2YodG9fZGVsYXllZF93b3JrKHdvcmspLCBzdHJ1Y3QgY2ltYXhfdXNiLCB3b3JrKTsKKwl1c2ItPndvcmtfY250Kys7CisJY2ltYXhfdXNiX3BvbGwodXNiKTsKKwlpZiAodXNiLT53b3JrX2F1dG9fcmVzdGFydCkKKwkJcXVldWVfZGVsYXllZF93b3JrKHVzYi0+d29ya3EsICZ1c2ItPndvcmssIHVzYl9wb2xsX2ludGVydmFsKTsKK30KKworI2RlZmluZSBDVFJMX0RJU0FCTEUgLTEKKyNkZWZpbmUgQ1RSTF9TVE9QICAgICAwCisjZGVmaW5lIENUUkxfU1RBUlQgICAgMQorCitzdGF0aWMgaW5saW5lIGludCBjaW1heF91c2JfcG9sbF9jdHJsKHN0cnVjdCBjaW1heF91c2IgKnVzYiwgaW50IGN0cmwpCit7CisJaWYgKGN0cmwgPT0gQ1RSTF9TVEFSVCkgeworCQlpZiAodXNiLT53b3JrcSkKKwkJCXJldHVybiAwOworCQl1c2ItPndvcmtfYXV0b19yZXN0YXJ0ID0gMTsKKwkJdXNiLT53b3JrcSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJjaW1heF91c2IiKTsKKwkJSU5JVF9ERUxBWUVEX1dPUksoJnVzYi0+d29yaywgJmNpbWF4X3VzYl9wb2xsX3dvcmspOworCQlxdWV1ZV9kZWxheWVkX3dvcmsodXNiLT53b3JrcSwKKwkJCSZ1c2ItPndvcmssIHVzYl9wb2xsX2ludGVydmFsKTsKKwkJcHJfaW5mKCJwb2xsIHN0YXJ0ZWRcbiIpOworCX0gZWxzZSB7CisJCWlmICghdXNiLT53b3JrcSkKKwkJCXJldHVybiAwOworCQl1c2ItPndvcmtfYXV0b19yZXN0YXJ0ID0gMDsKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ1c2ItPndvcmspOworCQlkZXN0cm95X3dvcmtxdWV1ZSh1c2ItPndvcmtxKTsKKwkJdXNiLT53b3JrcSA9IE5VTEw7CisJCXByX2luZigicG9sbCBzdG9wcGVkXG4iKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2ltYXhfdXNiX3NldHVwX3BvbGwoc3RydWN0IGNpbWF4X3VzYiAqdXNiLCBpbnQgcG9sbF9tb2RlKQoreworCWlmIChwb2xsX21vZGUgPT0gdXNiLT5wb2xsX21vZGUpCisJCXJldHVybiAwOworCXN3aXRjaCAocG9sbF9tb2RlKSB7CisJY2FzZSBQT0xMX01PREU6CisJCWNpbWF4X3VzYl9wb2xsX2N0cmwodXNiLCBDVFJMX1NUQVJUKTsKKwkJdXNiLT5wb2xsX21vZGUgPSBQT0xMX01PREU7CisJCWJyZWFrOworCWNhc2UgU1RPUF9NT0RFOgorCQlpZiAodXNiLT5wb2xsX21vZGUgPT0gUE9MTF9NT0RFKQorCQkJY2ltYXhfdXNiX3BvbGxfY3RybCh1c2IsIENUUkxfRElTQUJMRSk7CisJCXVzYi0+cG9sbF9tb2RlID0gU1RPUF9NT0RFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2ltYXhfdXNiX2h3X3Jlc2V0KHN0cnVjdCBjaW1heF91c2IgKnVzYiwgaW50IHJlc2V0X3ZhbCkKK3sKKwkvKnRyaWdnZXIgcmVzZXQgaW8qLworCWlmICh1c2ItPnJzdF9pbykgeworCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQodXNiLT5yc3RfaW8sIHJlc2V0X3ZhbCA/IDEgOiAwKTsKKwkJbXNsZWVwKDUwKTsKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHVzYi0+cnN0X2lvLCByZXNldF92YWwgPyAwIDogMSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNpbWF4X3VzYl9zZXRfbG9vcChzdHJ1Y3QgY2ltYXhfdXNiICp1c2IsIGludCBsb29wKQoreworCWludCBhID0gdXNiLT5jYW1faW5zZXJ0ZWRbMF07CisJaW50IGIgPSB1c2ItPmNhbV9pbnNlcnRlZFsxXTsKKwl1OCBjbVsyXTsKKworCXByX2luZigic2V0IGxvb3A6ICVkXG4iLCBsb29wKTsKKworCWNtWzBdID0gbG9vcCA/IChiID8gMHg4NSA6IDB4ODApIDogMHg4MTsvKkNIKi8KKwljbVsxXSA9IGxvb3AgPyAoYSA/IDB4NTEgOiAweDExKSA6IDB4MDA7LypNT0QqLworCisJcmV0dXJuIGFtbF9jaW1heF91c2Jfd3JpdGVfcmVnKHVzYi0+Y2ltYXgsIFJPVVRFUl9DQU1fQ0gsIGNtLCAyKTsKK30KKworaW50IGNpbWF4X3VzYl9kZXZfYWRkKHN0cnVjdCBkZXZpY2VfcyAqZGV2LCBpbnQgaWQpCit7CisJcHJfaW5mKCJkZXYgYWRkXG4iKTsKKwlpZiAoIWdfdXNiKQorCQlyZXR1cm4gMDsKKworCSh2b2lkKWlkOworCisJY2ltYXhfdXNiX2RldmljZV9vcGVuKGRldik7CisJY2ltYXhfdXNiX3NlbGVjdF9pbnRlcmZhY2UoZGV2LCAzKTsKKworCWxvY2tfbG9jayhnX3VzYik7CisJZ191c2ItPmRldiA9IGRldjsKKwlsb2NrX3VubG9jayhnX3VzYik7CisKKwlpZiAoMCkKKwl7CisJCS8qCisJCSAgdGhlIGNpbWF4J3MgZncgZG8gbm90IHJlcG9ydCBjYW0gc3RhdHVzCisJCSAgd2hlbiBib2FyZCBwb3dlciBvbiB3aXRoIGNhbSBwbHVnZ2VkLAorCQkgIGhhdmUgdG8gY2hlY2sgbWFudWFsbHkgaGVyZS4KKwkJKi8KKwkJaW50IHNsb3QgPSAwOworCQlpbnQgZXJyID0gMDsKKwkJZm9yIChzbG90ID0gMDsgc2xvdCA8IDI7IHNsb3QrKykgeworCQkJaW50IGFkZHIgPSAoIXNsb3QpID8gTU9EX0NUUkxfQSA6IE1PRF9DVFJMX0I7CisJCQl1OCByZWcgPSAwOworCQkJZXJyID0gYW1sX2NpbWF4X3VzYl9yZWFkX3JlZyhnX3VzYi0+Y2ltYXgsCisJCQkJCWFkZHIsICZyZWcsIDEpOworCQkJY2FtX3VzYl9jYW1fZGV0ZWN0KGdfdXNiLCBzbG90LAorCQkJCShyZWcgJiAxKSA/IElOX0lOU0VSVEVEIDogMCk7CisJCQljaW1heF91c2JfY2FtX3Bvd2VyY3RybChnX3VzYiwgc2xvdCwgKHJlZyAmIDEpKTsKKwkJfQorCX0KKwljaW1heF91c2Jfc2V0X3Bvd2VyKGdfdXNiLCAwKTsKKwljaW1heF91c2Jfc2V0dXBfcG9sbChnX3VzYiwgY2ltYXhfcG9sbF9tb2RlID8gUE9MTF9NT0RFIDogSU5UX01PREUpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChjaW1heF91c2JfZGV2X2FkZCk7CisKK2ludCBjaW1heF91c2JfZGV2X3JlbW92ZShzdHJ1Y3QgZGV2aWNlX3MgKmRldiwgaW50IGlkKQoreworCXByX2RiZygiZGV2IHJlbW92ZVxuIik7CisJaWYgKCFnX3VzYikKKwkJcmV0dXJuIDA7CisJKHZvaWQpaWQ7CisJcHJfZGJnKCJzZXR1cCBwb2xsIC0+IHN0b3BcbiIpOworCWNpbWF4X3VzYl9zZXR1cF9wb2xsKGdfdXNiLCBTVE9QX01PREUpOworCXByX2RiZygic2V0dXAgcG9sbCBlbmRcbiIpOworCWxvY2tfbG9jayhnX3VzYik7CisJZ191c2ItPmRldiA9IE5VTEw7CisJbG9ja191bmxvY2soZ191c2IpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChjaW1heF91c2JfZGV2X3JlbW92ZSk7CisKK3N0YXRpYyBpbnQgY2ltYXhfdXNiX2dldF9jb25maWdfZnJvbV9kdHMoc3RydWN0IGNpbWF4X3VzYiAqdXNiKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQgPSBOVUxMOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB1c2ItPnBkZXY7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCXByX2RiZygiZmV0Y2ggY2ltYXggdXNiIGluIGR0c1xuIik7CisKKwljaGlsZCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKG5wLCAiY2ltYXgiKTsKKwlpZiAoY2hpbGQgPT0gTlVMTCkgeworCQlwcl9lcnJvcigiY2ltYXggbm90IGZvdW5kIGluIGR0c1xuIik7CisJCXJldHVybiAtMTsKKwl9CisJY2hpbGQgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShjaGlsZCwgInVzYiIpOworCWlmICghY2hpbGQpIHsKKwkJcHJfZXJyb3IoInVzYiBub3QgZm91bmQgaW4gY2ltYXgiKTsKKwkJcmV0dXJuIC0xOworCX0KKy8qCitkdmJjaSB7CisJY29tcGF0aWJsZSA9ICJhbWxvZ2ljLCBkdmJjaSI7CisJZGV2X25hbWUgPSAiZHZiY2kiOworCWlvX3R5cGUgPSA8Mj47Ly8wOmlvYnVzLDE6dXNiLDI6Y2ltYXgKKwljaW1heCB7CisJCWlvX3R5cGUgPSA8MT4gLy8wOnNwaSAxOnVzYgorCQl1c2IgeworCQkJcnN0X2dwaW8gPSA8JmdwaW9fYW8gR1BJT0FPXzIgR1BJT19BQ1RJVkVfSElHSD47CisJCX07CisJfTsKKworfTsKKyovCisJeworCQlpbnQgcmV0ID0gMDsKKwkJaW50IGdwaW8gPSAtMTsKKwkJZ3BpbyA9IG9mX2dldF9uYW1lZF9ncGlvX2ZsYWdzKGNoaWxkLCAicnN0LWdwaW9zIiwgMCwgTlVMTCk7CisJCWlmIChncGlvICE9IC0xKSB7CisJCQlyZXQgPSBncGlvX3JlcXVlc3QoZ3BpbywgImNpbWF4Iik7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXByX2Vycm9yKCJyc3QtZ3Bpb3MgcmVxdWVzdCBmYWlsLlxuIik7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJCXVzYi0+cnN0X2lvID0gZ3BpbzsKKwkJCWNpbWF4X3VzYl9od19yZXNldCh1c2IsIDEpOworCQkJcHJfZGJnKCJyc3Q6ICVkXG4iLCB1c2ItPnJzdF9pbyk7CisJCX0gZWxzZSB7CisJCQlwcl9lcnJvcigicnN0IGlvIGdvdCBmYWlsLCAlZFxuIiwgZ3Bpbyk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBhbWxfY2ltYXhfdXNiX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IGFtbF9jaW1heCAqY2ltYXgpCit7CisJc3RydWN0IGNpbWF4X3VzYiAqY2ltYXhfdXNiOworCisJY2ltYXhfdXNiID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNpbWF4X3VzYiksIEdGUF9LRVJORUwpOworCWlmICghY2ltYXhfdXNiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNpbWF4X3VzYi0+cGRldiA9IHBkZXY7CisJY2ltYXhfdXNiLT5jaW1heCA9IGNpbWF4OworCWNpbWF4X3VzYl9nZXRfY29uZmlnX2Zyb21fZHRzKGNpbWF4X3VzYik7CisKKwkvKmluaXQgdXNiX2xvY2sqLworCWxvY2tfaW5pdChjaW1heF91c2IpOworCisJLyppbml0IGNpbWF4IHVzZWQgYXBpLiovCisjZGVmaW5lIFdJKF9mKVwKKwljaW1heC0+b3BzLl9mID0gYW1sX2NpbWF4X3VzYl8jI19mCisJV0kocmVhZF9jaXMpOworCVdJKHdyaXRlX2Nvcik7CisJV0kobmVnb3RpYXRlKTsKKwlXSShyZWFkX2xwZHUpOworCVdJKHdyaXRlX2xwZHUpOworCVdJKHJlYWRfY2FtX3N0YXR1cyk7CisJV0koY2FtX3Jlc2V0KTsKKwlXSShzbG90X3Jlc2V0KTsKKwlXSShzbG90X3NodXRkb3duKTsKKwlXSShzbG90X3RzX2VuYWJsZSk7CisJV0koc2xvdF9zdGF0dXMpOworCVdJKHJlYWRfcmVnKTsKKwlXSSh3cml0ZV9yZWcpOworCisJY2ltYXgtPnByaXYgPSBjaW1heF91c2I7CisKKwlnX3VzYiA9IGNpbWF4X3VzYjsKKworCWFtbF9jaW1heF91c2JfbW9kX2luaXQocGRldik7CisKKwljaW1heF91c2Jfc2V0X2NiKGNpbWF4X3VzYl9kZXZfYWRkLCBjaW1heF91c2JfZGV2X3JlbW92ZSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYW1sX2NpbWF4X3VzYl9pbml0KTsKKworaW50IGFtbF9jaW1heF91c2JfZXhpdChzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCkKK3sKKwlzdHJ1Y3QgY2ltYXhfdXNiICp1c2IgPSBjaW1heF90b191c2IoY2ltYXgpOworCisJaWYgKCF1c2IpCisJCXJldHVybiAtRU5PREVWOworCisJYW1sX2NpbWF4X3VzYl9tb2RfZXhpdCh1c2ItPnBkZXYpOworCisJY2ltYXhfdXNiX2RldmljZV9jbG9zZSh1c2ItPmRldik7CisJY2ltYXhfdXNiX3NldHVwX3BvbGwodXNiLCBTVE9QX01PREUpOworCisJaWYgKHVzYi0+cnN0X2lvKQorCQlncGlvX2ZyZWUodXNiLT5yc3RfaW8pOworCisJa2ZyZWUodXNiLT5jaXMpOworCisJa2ZyZWUodXNiKTsKKwljaW1heC0+cHJpdiA9IE5VTEw7CisKKwlnX3VzYiA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGFtbF9jaW1heF91c2JfZXhpdCk7CisKK3N0YXRpYyBpbnQgY2ltYXhfdXNiX3Jlc2V0KHN0cnVjdCBjaW1heF91c2IgKnVzYiwgaW50IHJlc2V0X3ZhbCkKK3sKKwlwcl9kYmcoInJlc2V0IHVzYjolcCwgcnN0OiVkXG4iLCB1c2IsIHVzYiA/IHVzYi0+cnN0X2lvIDogLTEpOworCWlmICghdXNiKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXByX2luZigiY2ltYXggdXNiIHJlc2V0XG4iKTsKKworCS8qbm90aWZ5IHVucGx1Z2dlZCovCisJYW1sX2NpbWF4X2NhbWNoYW5nZWQodXNiLT5jaW1heCwgMCwgMCk7CisJYW1sX2NpbWF4X2NhbWNoYW5nZWQodXNiLT5jaW1heCwgMSwgMCk7CisKKwlpZiAodXNiLT5kZXYpCisJCWNpbWF4X3VzYl9kZXZpY2VfY2xvc2UodXNiLT5kZXYpOworCisJY2ltYXhfdXNiX3NldHVwX3BvbGwodXNiLCBTVE9QX01PREUpOworCisJdXNiLT5jYW1faW5zZXJ0ZWRbMF0gPSB1c2ItPmNhbV9pbnNlcnRlZFsxXSA9IDA7CisJdXNiLT5jYW1fZGF0YV9yZWFkeVswXSA9IHVzYi0+Y2FtX2RhdGFfcmVhZHlbMV0gPSAwOworCisJY2ltYXhfdXNiX2h3X3Jlc2V0KHVzYiwgcmVzZXRfdmFsKTsKKworCXByX2luZigiY2ltYXggdXNiIHJlc2V0IGVuZFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJlc2V0X3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKKwlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IHJldDsKKwlyZXQgPSBzcHJpbnRmKGJ1ZiwgImVjaG8gMSA+ICVzXG4iLCBhdHRyLT5hdHRyLm5hbWUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJlc2V0X3N0b3JlKHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgcmV0OworCWludCB2YWwgPSAwOworCWlmICghZ191c2IpCisJCXJldHVybiBzaXplOworCXJldCA9IHNzY2FuZihidWYsICIlaSIsICZ2YWwpOworCWlmIChyZXQgPT0gMSkKKwkJcmV0ID0gY2ltYXhfdXNiX3Jlc2V0KGdfdXNiLCB2YWwpOworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBkZWJ1Z19zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCByZXQgPSAwOworCWlmICghZ191c2IpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzcHJpbnRmKGJ1ZiwgInBvbGwgbW9kZTogJWRcbiIsIGdfdXNiLT5wb2xsX21vZGUpOworCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJzdGF0dXMgc2xvdFswXT1bJWRdIHNsb3RbMV09WyVkXVxuIiwKKwkJZ191c2ItPmNhbV9pbnNlcnRlZFswXSwgZ191c2ItPmNhbV9pbnNlcnRlZFsxXSk7CisJeworCQlpbnQgcG93ZXIgPSAwOworCQlpbnQgZXJyID0gY2ltYXhfdXNiX2NoZWNrX3BvZShnX3VzYiwgJnBvd2VyKTsKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgInBvd2VyIHNsb3RbMF09WyVkXSBzbG90WzFdPVslZF1cbiIsCisJCQllcnIgPyAtMSA6IHBvd2VyLCAwKTsKKwl9CisJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgImRhdGEgc2xvdFswXT1bJWRdIHNsb3RbMV09WyVkXVxuIiwKKwkJZ191c2ItPmNhbV9kYXRhX3JlYWR5WzBdLCBnX3VzYi0+Y2FtX2RhdGFfcmVhZHlbMV0pOworCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJ3b3JrIGNudDolZFxuIiwgZ191c2ItPndvcmtfY250KTsKKwlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAicHdyIHdvcmsgY250OiVkXG4iLCBnX3VzYi0+cG93ZXJfd29ya19jbnQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmVnX2FkZHI7CitzdGF0aWMgc3NpemVfdCBhZGRyX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKKwlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IHJldCA9IDA7CisJcmV0ID0gc3ByaW50ZihidWYsICJhZGRyID0gMHglMDR4XG4iLCByZWdfYWRkcik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRkcl9zdG9yZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJaWYgKCFnX3VzYikKKwkJcmV0dXJuIHNpemU7CisJaWYgKHNzY2FuZihidWYsICIlaSIsICZyZWdfYWRkcikgIT0gMSkKKwkJcmV0dXJuIHNpemU7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJlZ19zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCByZXQgPSAwOworCXU4IHJlZ192YWwgPSAwOworCXN0cnVjdCBhbWxfY2ltYXggKmNpbWF4ID0gTlVMTDsKKworCWlmICghZ191c2IpCisJCXJldHVybiByZXQ7CisKKwljaW1heCA9IGdfdXNiLT5jaW1heDsKKwlyZXQgPSBhbWxfY2ltYXhfdXNiX3JlYWRfcmVnKGNpbWF4LCByZWdfYWRkciwgJnJlZ192YWwsIDEpOworCWlmIChyZXQpCisJCXJldCA9IHNwcmludGYoYnVmLCAicmVhZCBmYWlsLCBlcnI9JWRcbiIsIHJldCk7CisJZWxzZQorCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgInJlZ1sweCUwNHhdID0gMHglMDJ4XG4iLCByZWdfYWRkciwgcmVnX3ZhbCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgcmVnX3N0b3JlKHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCA9IE5VTEw7CisJaW50IHZhbCA9IDA7CisJdTggcmVnX3ZhbCA9IDA7CisKKwlpZiAoIWdfdXNiKQorCQlyZXR1cm4gc2l6ZTsKKworCWlmIChzc2NhbmYoYnVmLCAiJWkiLCAmdmFsKSAhPSAxKQorCQlyZXR1cm4gc2l6ZTsKKwlyZWdfdmFsID0gdmFsOworCWNpbWF4ID0gZ191c2ItPmNpbWF4OworCXJldCA9IGFtbF9jaW1heF91c2Jfd3JpdGVfcmVnKGNpbWF4LCByZWdfYWRkciwgJnJlZ192YWwsIDEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgY2lzX21vZGU7IC8qMDpoZXggMTpiaW5hcnkqLworc3RhdGljIHNzaXplX3QgY2lzX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKKwlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWdfdXNiIHx8ICFnX3VzYi0+Y2lzKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGNpc19tb2RlID09IDApIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBDSVNfTUFYOyBpKyspIHsKKwkJCWlmIChpICYmICEoaSAmIDB4ZikpCisJCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIlxuIik7CisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiJTAyWCAiLCBnX3VzYi0+Y2lzW2ldKTsKKwkJfQorCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQltZW1jcHkoYnVmLCBnX3VzYi0+Y2lzLCBDSVNfTUFYKTsKKwkJcmV0dXJuIENJU19NQVg7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNpc19zdG9yZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJaWYgKHNpemUgPj0gMworCQkmJiAhbWVtY21wKGJ1ZiwgImJpbiIsIDMpKQorCQljaXNfbW9kZSA9IDE7CisJZWxzZQorCQljaXNfbW9kZSA9IDA7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRzX3JhdGVfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0ID0gMDsKKwl1OCBsc2IgPSAwLCBtc2IgPSAwLCBwbGVuID0gMDsKKwlzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCA9IE5VTEw7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIWdfdXNiKQorCQlyZXR1cm4gcmV0OworCisJY2ltYXggPSBnX3VzYi0+Y2ltYXg7CisJZXJyID0gYW1sX2NpbWF4X3VzYl9yZWFkX3JlZyhjaW1heCwgUENLX0xFTkdUSCwgJnBsZW4sIDEpOworCWVyciB8PSBhbWxfY2ltYXhfdXNiX3JlYWRfcmVnKGNpbWF4LCBCSVRSQVRFX0NIMF9MU0IsICZsc2IsIDEpOworCWVyciB8PSBhbWxfY2ltYXhfdXNiX3JlYWRfcmVnKGNpbWF4LCBCSVRSQVRFX0NIMF9NU0IsICZtc2IsIDEpOworCWlmIChlcnIpCisJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJyZWFkIGZhaWwsIGVycj0lZFxuIiwgZXJyKTsKKwllbHNlIGlmICghYnl0ZV90b191MTYobXNiLCBsc2IpKQorCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAicmF0ZVswXSA9IDAgS2Jwc1xuIik7CisJZWxzZQorCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAicmF0ZVswXSA9ICVkIEticHNcbiIsCisJCQk1NDAqcGxlbio4L2J5dGVfdG9fdTE2KG1zYiwgbHNiKSk7CisJaWYgKGVycikKKwkJcmV0dXJuIHJldDsKKworCWVyciA9IGFtbF9jaW1heF91c2JfcmVhZF9yZWcoY2ltYXgsIEJJVFJBVEVfQ0gxX0xTQiwgJmxzYiwgMSk7CisJZXJyIHw9IGFtbF9jaW1heF91c2JfcmVhZF9yZWcoY2ltYXgsIEJJVFJBVEVfQ0gxX01TQiwgJm1zYiwgMSk7CisJaWYgKGVycikKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgInJlYWQgZmFpbCwgZXJyPSVkXG4iLCBlcnIpOworCWVsc2UgaWYgKCFieXRlX3RvX3UxNihtc2IsIGxzYikpCisJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJyYXRlWzFdID0gMCBLYnBzXG4iKTsKKwllbHNlCisJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJyYXRlWzFdID0gJWQgS2Jwc1xuIiwKKwkJCTU0MCpwbGVuKjgvYnl0ZV90b191MTYobXNiLCBsc2IpKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBsb29wX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKKwlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IHJldCA9IDA7CisJdTggY2ggPSAwLCBtb2QgPSAwOworCXN0cnVjdCBhbWxfY2ltYXggKmNpbWF4ID0gTlVMTDsKKwlpbnQgZXJyID0gMDsKKworCWlmICghZ191c2IpCisJCXJldHVybiByZXQ7CisKKwljaW1heCA9IGdfdXNiLT5jaW1heDsKKwllcnIgPSBhbWxfY2ltYXhfdXNiX3JlYWRfcmVnKGNpbWF4LCBST1VURVJfQ0FNX0NILCAmY2gsIDEpOworCWVyciB8PSBhbWxfY2ltYXhfdXNiX3JlYWRfcmVnKGNpbWF4LCBST1VURVJfQ0FNX01PRCwgJm1vZCwgMSk7CisJaWYgKGVycikgeworCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgInJlYWQgZmFpbCwgZXJyPSVkXG4iLCBlcnIpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgKz0gc3ByaW50ZihidWYgKyByZXQsICJPVVQtMCA8PSAiKTsKKwlzd2l0Y2ggKGNoICYgMHgwZikgeworCWNhc2UgMHgwOgorCQlyZXQgKz0gc3ByaW50ZihidWYgKyByZXQsICJDQU0tQSIpOyBicmVhazsKKwljYXNlIDB4MToKKwkJcmV0ICs9IHNwcmludGYoYnVmICsgcmV0LCAiQ0gwLUlOIik7IGJyZWFrOworCWNhc2UgMHgyOgorCQlyZXQgKz0gc3ByaW50ZihidWYgKyByZXQsICJDSDEtSU4iKTsgYnJlYWs7CisJY2FzZSAweDM6CisJCXJldCArPSBzcHJpbnRmKGJ1ZiArIHJldCwgIlJFTUFQUEVSIik7IGJyZWFrOworCWNhc2UgMHg0OgorCQlyZXQgKz0gc3ByaW50ZihidWYgKyByZXQsICJQUkVIRUFERVIiKTsgYnJlYWs7CisJY2FzZSAweDU6CisJCXJldCArPSBzcHJpbnRmKGJ1ZiArIHJldCwgIkNBTS1CIik7IGJyZWFrOworCWNhc2UgMHg2OgorCQlyZXQgKz0gc3ByaW50ZihidWYgKyByZXQsICJHQVBSRU1PVkVSLTAiKTsgYnJlYWs7CisJY2FzZSAweDc6CisJCXJldCArPSBzcHJpbnRmKGJ1ZiArIHJldCwgIkdBUFJFTU9WRVItMSIpOyBicmVhazsKKwljYXNlIDB4ODoKKwkJcmV0ICs9IHNwcmludGYoYnVmICsgcmV0LCAiTk9ORSIpOyBicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgKz0gc3ByaW50ZihidWYgKyByZXQsICJVTktOT1dOIik7IGJyZWFrOworCX0KKwlyZXQgKz0gc3ByaW50ZihidWYgKyByZXQsICJcbkNBTS1BIDw9ICIpOworCXN3aXRjaCAobW9kICYgMHgwNykgeworCWNhc2UgMHgxOgorCQlyZXQgKz0gc3ByaW50ZihidWYgKyByZXQsICJDSDAtSU4iKTsgYnJlYWs7CisJY2FzZSAweDI6CisJCXJldCArPSBzcHJpbnRmKGJ1ZiArIHJldCwgIkNIMS1JTiIpOyBicmVhazsKKwljYXNlIDB4MzoKKwkJcmV0ICs9IHNwcmludGYoYnVmICsgcmV0LCAiUkVNQVBQRVIiKTsgYnJlYWs7CisJY2FzZSAweDQ6CisJCXJldCArPSBzcHJpbnRmKGJ1ZiArIHJldCwgIlBSRUhFQURFUiIpOyBicmVhazsKKwljYXNlIDB4NToKKwkJcmV0ICs9IHNwcmludGYoYnVmICsgcmV0LCAiQ0FNLUIiKTsgYnJlYWs7CisJY2FzZSAweDY6CisJCXJldCArPSBzcHJpbnRmKGJ1ZiArIHJldCwgIkdBUFJFTU9WRVItMCIpOyBicmVhazsKKwljYXNlIDB4NzoKKwkJcmV0ICs9IHNwcmludGYoYnVmICsgcmV0LCAiR0FQUkVNT1ZFUi0xIik7IGJyZWFrOworCWRlZmF1bHQ6CisJCXJldCArPSBzcHJpbnRmKGJ1ZiArIHJldCwgIk5PTkUiKTsgYnJlYWs7CisJfQorCXJldCArPSBzcHJpbnRmKGJ1ZiArIHJldCwgIlxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBsb29wX3N0b3JlKHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgbG9vcCA9IDA7CisKKwlpZiAoIWdfdXNiKQorCQlyZXR1cm4gc2l6ZTsKKworCWlmIChzc2NhbmYoYnVmLCAiJWkiLCAmbG9vcCkgPT0gMSkKKwkJY2ltYXhfdXNiX3NldF9sb29wKGdfdXNiLCBsb29wKTsKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3Qgc2xvdF9yZXNldF9zdG9yZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJaW50IGVyciA9IDA7CisJaW50IHNsb3QgPSAwOworCXN0cnVjdCBhbWxfY2ltYXggKmNpbWF4ID0gTlVMTDsKKworCWlmICghZ191c2IpCisJCXJldHVybiBzaXplOworCisJaWYgKHNzY2FuZihidWYsICIlaSIsICZzbG90KSA9PSAxKSB7CisJCWlmIChzbG90ID09IDAgfHwgc2xvdCA9PSAxKSB7CisJCQlwcl9kYmcoInJlc2V0IHNsb3QgJWRcbiIsIHNsb3QpOworCQkJY2ltYXggPSBnX3VzYi0+Y2ltYXg7CisJCQllcnIgPSBhbWxfY2ltYXhfdXNiX3Nsb3RfcmVzZXQoY2ltYXgsIHNsb3QpOworCQl9CisJfQorCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBkZXRlY3Rfc3RvcmUoc3RydWN0IGNsYXNzICpjbGFzcywKKwlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCWludCBlcnIgPSAwOworCWludCBzbG90ID0gMDsKKwlzdHJ1Y3QgYW1sX2NpbWF4ICpjaW1heCA9IE5VTEw7CisKKwlpZiAoIWdfdXNiKQorCQlyZXR1cm4gc2l6ZTsKKworCWlmIChzc2NhbmYoYnVmLCAiJWkiLCAmc2xvdCkgPT0gMSkgeworCQlpZiAoc2xvdCA9PSAwIHx8IHNsb3QgPT0gMSkgeworCQkJaW50IGFkZHIgPSAoIXNsb3QpID8gTU9EX0NUUkxfQSA6IE1PRF9DVFJMX0I7CisJCQl1OCByZWcgPSAwOworCQkJY2ltYXggPSBnX3VzYi0+Y2ltYXg7CisJCQllcnIgPSBhbWxfY2ltYXhfdXNiX3JlYWRfcmVnKGNpbWF4LCBhZGRyLCAmcmVnLCAxKTsKKwkJCWNhbV91c2JfY2FtX2RldGVjdChnX3VzYiwgc2xvdCwKKwkJCQkocmVnICYgMSkgPyBJTl9JTlNFUlRFRCA6IDApOworCQkJY2ltYXhfdXNiX2NhbV9wb3dlcmN0cmwoZ191c2IsIHNsb3QsIChyZWcgJiAxKSk7CisJCX0KKwl9CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBDTEFTU19BVFRSX1JXKHJlc2V0KTsKK3N0YXRpYyBDTEFTU19BVFRSX1JPKGRlYnVnKTsKK3N0YXRpYyBDTEFTU19BVFRSX1JXKGFkZHIpOworc3RhdGljIENMQVNTX0FUVFJfUlcocmVnKTsKK3N0YXRpYyBDTEFTU19BVFRSX1JXKGNpcyk7CitzdGF0aWMgQ0xBU1NfQVRUUl9STyh0c19yYXRlKTsKK3N0YXRpYyBDTEFTU19BVFRSX1JXKGxvb3ApOworc3RhdGljIENMQVNTX0FUVFJfV08oc2xvdF9yZXNldCk7CitzdGF0aWMgQ0xBU1NfQVRUUl9XTyhkZXRlY3QpOworCisjZGVmaW5lIENMQVNTX0FUVFIobmFtZSkgJmNsYXNzX2F0dHJfIyNuYW1lLmF0dHIKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmNpbWF4X3VzYl9jbGFzc19hdHRyc1tdID0geworCUNMQVNTX0FUVFIocmVzZXQpLAorCUNMQVNTX0FUVFIoZGVidWcpLAorCUNMQVNTX0FUVFIoYWRkciksCisJQ0xBU1NfQVRUUihyZWcpLAorCUNMQVNTX0FUVFIoY2lzKSwKKwlDTEFTU19BVFRSKHRzX3JhdGUpLAorCUNMQVNTX0FUVFIobG9vcCksCisJQ0xBU1NfQVRUUihzbG90X3Jlc2V0KSwKKwlDTEFTU19BVFRSKGRldGVjdCksCisJTlVMTAorfTsKKworCitBVFRSSUJVVEVfR1JPVVBTKGNpbWF4X3VzYl9jbGFzcyk7CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgY2ltYXhfdXNiX2NsYXNzID0geworCS5uYW1lID0gImNpbWF4X3VzYiIsCisJLmNsYXNzX2dyb3VwcyA9IGNpbWF4X3VzYl9jbGFzc19ncm91cHMsCit9OworCitzdGF0aWMgaW50IGFtbF9jaW1heF91c2JfbW9kX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0OworCXByX2RiZygiQW1sb2dpYyBDSU1BWCBVU0IgSW5pdFxuIik7CisKKwlyZXQgPSBjbGFzc19yZWdpc3RlcigmY2ltYXhfdXNiX2NsYXNzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhbWxfY2ltYXhfdXNiX21vZF9leGl0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcHJfZGJnKCJBbWxvZ2ljIENJTUFYIFVTQiBFeGl0XG4iKTsKKwljbGFzc191bnJlZ2lzdGVyKCZjaW1heF91c2JfY2xhc3MpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L2FtbF9jaW1heF91c2IuaCBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvYW1sX2NpbWF4X3VzYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MWQyZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L2FtbF9jaW1heF91c2IuaApAQCAtMCwwICsxLDIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZGVmaW5lZCBpbiB0aGUKKyAqIGZpbGUgJ0xJQ0VOU0UnIHdoaWNoIGlzIHBhcnQgb2YgdGhpcyBzb3VyY2UgY29kZSBwYWNrYWdlLgorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfQU1MX0NJTUFYX1VTQl9IXworI2RlZmluZSBfQU1MX0NJTUFYX1VTQl9IXworCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSAiYW1sX2NpbWF4LmgiCisKK2ludCBhbWxfY2ltYXhfdXNiX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IGFtbF9jaW1heCAqY2kpOworaW50IGFtbF9jaW1heF91c2JfZXhpdChzdHJ1Y3QgYW1sX2NpbWF4ICpjaSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC9hbWxfY2ltYXhfdXNiX3ByaXYuaCBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvYW1sX2NpbWF4X3VzYl9wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVjNjk0YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvYW1sX2NpbWF4X3VzYl9wcml2LmgKQEAgLTAsMCArMSwyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE0IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGRlZmluZWQgaW4gdGhlCisgKiBmaWxlICdMSUNFTlNFJyB3aGljaCBpcyBwYXJ0IG9mIHRoaXMgc291cmNlIGNvZGUgcGFja2FnZS4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0NJTUFYX1VTQl9ERVZfSF8KKyNkZWZpbmUgX0NJTUFYX1VTQl9ERVZfSF8KKworI2lmIDAKK19fYXR0cmlidXRlX18gKCh3ZWFrKSkKK2ludCBjaW1heF91c2JfZGV2X2FkZChzdHJ1Y3QgZGV2aWNlX3MgKmRldmljZSwgaW50IGlkKTsKK19fYXR0cmlidXRlX18gKCh3ZWFrKSkKK2ludCBjaW1heF91c2JfZGV2X3JlbW92ZShzdHJ1Y3QgZGV2aWNlX3MgKmRldmljZSwgaW50IGlkKTsKKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC9kdmJfY2FfZW41MDIyMV9jaW1heC5jIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC9kdmJfY2FfZW41MDIyMV9jaW1heC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYzY1MTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L2R2Yl9jYV9lbjUwMjIxX2NpbWF4LmMKQEAgLTAsMCArMSwxOTg3IEBACisvKgorICogZHZiX2NhLmM6IGdlbmVyaWMgRFZCIGZ1bmN0aW9ucyBmb3IgRU41MDIyMSBDQU0gQ0lNQVggaW50ZXJmYWNlcworICoKKyAqIFBhcnRzIG9mIHRoaXMgZmlsZSB3ZXJlIGJhc2VkIG9uIHNvdXJjZXMgYXMgZm9sbG93czoKKyAqCisgKiBiYXNlZCBvbiBjb2RlOgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAyIFJhbHBoICBNZXR6bGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgJiBNYXJjdXMgTWV0emxlciBmb3IgY29udmVyZ2VuY2UgaW50ZWdyYXRlZCBtZWRpYSBHbWJICisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkL3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKworI2luY2x1ZGUgImR2Yl9jYV9lbjUwMjIxX2NpbWF4LmgiCisjaW5jbHVkZSAiZHZiX3JpbmdidWZmZXIuaCIKKworI2RlZmluZSBSRUFEX0xQRFVfUEtUCisKK3N0YXRpYyBpbnQgZHZiX2NhX2VuNTAyMjFfZGVidWcgPSAxOworCittb2R1bGVfcGFyYW1fbmFtZWQoY2FtX2RlYnVnLCBkdmJfY2FfZW41MDIyMV9kZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoY2FtX2RlYnVnLCAiZW5hYmxlIHZlcmJvc2UgZGVidWcgbWVzc2FnZXMiKTsKKworI2RlZmluZSBIT1NUX0xJTktfQlVGX1NJWkUgMHgxMDAwCisKK3N0YXRpYyBpbnQgZHZiX2NhX2VuNTAyMjFfbGlua19zaXplID0gSE9TVF9MSU5LX0JVRl9TSVpFOworbW9kdWxlX3BhcmFtX25hbWVkKGxpbmtfc2l6ZSwgZHZiX2NhX2VuNTAyMjFfbGlua19zaXplLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhsaW5rX3NpemUsICJkZWJ1ZyBvbmx5LCBubyBtb3JlIHRoYW4gMHgxMDAwIik7CisKK3N0YXRpYyBpbnQgZHZiX2NhX2VuNTAyMjFfYnVmZmVyX2ZyZWU7Cittb2R1bGVfcGFyYW1fbmFtZWQoYnVmZmVyX2ZyZWUsIGR2Yl9jYV9lbjUwMjIxX2J1ZmZlcl9mcmVlLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhidWZmZXJfZnJlZSwgImRlYnVnIG9ubHkiKTsKKworI2RlZmluZSBkcHJpbnRrKGFyZ3MuLi4pXAorCWRvIHtcCisJCWlmIChkdmJfY2FfZW41MDIyMV9kZWJ1ZylcCisJCQlwcmludGsoYXJncyk7XAorCX0gd2hpbGUgKDApCisjZGVmaW5lIHByX2Vycm9yKGZtdCwgYXJncy4uLikgcHJpbnRrKCJDQSBFTjUwMjExOiAiIGZtdCwgIyMgYXJncykKKworI2RlZmluZSBJTklUX1RJTUVPVVRfU0VDUyA0MAorCisKKyNkZWZpbmUgUlhfQlVGRkVSX1NJWkUgNjU1MzUKKworI2RlZmluZSBNQVhfUlhfUEFDS0VUU19QRVJfSVRFUkFUSU9OIDEwCisKKyNkZWZpbmUgQ1RSTElGX0RBVEEgICAgICAwCisjZGVmaW5lIENUUkxJRl9DT01NQU5EICAgMQorI2RlZmluZSBDVFJMSUZfU1RBVFVTICAgIDEKKyNkZWZpbmUgQ1RSTElGX1NJWkVfTE9XICAyCisjZGVmaW5lIENUUkxJRl9TSVpFX0hJR0ggMworCisjZGVmaW5lIENNRFJFR19IQyAgICAgICAgMQkvKiBIb3N0IGNvbnRyb2wgKi8KKyNkZWZpbmUgQ01EUkVHX1NXICAgICAgICAyCS8qIFNpemUgd3JpdGUgKi8KKyNkZWZpbmUgQ01EUkVHX1NSICAgICAgICA0CS8qIFNpemUgcmVhZCAqLworI2RlZmluZSBDTURSRUdfUlMgICAgICAgIDgJLyogUmVzZXQgaW50ZXJmYWNlICovCisjZGVmaW5lIENNRFJFR19GUklFICAgMHg0MAkvKiBFbmFibGUgRlIgaW50ZXJydXB0ICovCisjZGVmaW5lIENNRFJFR19EQUlFICAgMHg4MAkvKiBFbmFibGUgREEgaW50ZXJydXB0ICovCisjZGVmaW5lIElSUUVOIChDTURSRUdfREFJRSkKKworI2RlZmluZSBTVEFUVVNSRUdfUkUgICAgIDEJLyogcmVhZCBlcnJvciAqLworI2RlZmluZSBTVEFUVVNSRUdfV0UgICAgIDIJLyogd3JpdGUgZXJyb3IgKi8KKyNkZWZpbmUgU1RBVFVTUkVHX0ZSICAweDQwCS8qIG1vZHVsZSBmcmVlICovCisjZGVmaW5lIFNUQVRVU1JFR19EQSAgMHg4MAkvKiBkYXRhIGF2YWlsYWJsZSAqLworI2RlZmluZSBTVEFUVVNSRUdfVFhFUlIgKFNUQVRVU1JFR19SRXxTVEFUVVNSRUdfV0UpLyogZ2VuZXJhbCB0cmFuc2ZlciBlcnJvciAqLworCisKKyNkZWZpbmUgRFZCX0NBX1NMT1RTVEFURV9OT05FICAgICAgICAgICAwCisjZGVmaW5lIERWQl9DQV9TTE9UU1RBVEVfVU5JTklUSUFMSVNFRCAgMQorI2RlZmluZSBEVkJfQ0FfU0xPVFNUQVRFX1JVTk5JTkcgICAgICAgIDIKKyNkZWZpbmUgRFZCX0NBX1NMT1RTVEFURV9JTlZBTElEICAgICAgICAzCisjZGVmaW5lIERWQl9DQV9TTE9UU1RBVEVfV0FJVFJFQURZICAgICAgNAorI2RlZmluZSBEVkJfQ0FfU0xPVFNUQVRFX1ZBTElEQVRFICAgICAgIDUKKyNkZWZpbmUgRFZCX0NBX1NMT1RTVEFURV9XQUlURlIgICAgICAgICA2CisjZGVmaW5lIERWQl9DQV9TTE9UU1RBVEVfTElOS0lOSVQgICAgICAgNworI2RlZmluZSBEVkJfQ0FfU0xPVFNUQVRFX1dBSVRMSU5LSU5JVCAgIDgKKworI2RlZmluZSBNQVhfQ0lTX1NJWkUgIDUxMgorCisvKiBJbmZvcm1hdGlvbiBvbiBhIENBIHNsb3QgKi8KK3N0cnVjdCBkdmJfY2Ffc2xvdCB7CisKKwkvKiBjdXJyZW50IHN0YXRlIG9mIHRoZSBDQU0gKi8KKwlpbnQgc2xvdF9zdGF0ZTsKKworCS8qIG11dGV4IHVzZWQgZm9yIHNlcmlhbGl6aW5nIGFjY2VzcyB0byBvbmUgQ0kgc2xvdCAqLworCXN0cnVjdCBtdXRleCBzbG90X2xvY2s7CisKKwkvKiBOdW1iZXIgb2YgQ0FNQ0hBTkdFUyB0aGF0IGhhdmUgb2NjdXJyZWQgc2luY2UgbGFzdCBwcm9jZXNzaW5nICovCisJYXRvbWljX3QgY2FtY2hhbmdlX2NvdW50OworCisJLyogVHlwZSBvZiBsYXN0IENBTUNIQU5HRSAqLworCWludCBjYW1jaGFuZ2VfdHlwZTsKKworCS8qIGJhc2UgYWRkcmVzcyBvZiBDQU0gY29uZmlnICovCisJdTMyIGNvbmZpZ19iYXNlOworCisJLyogdmFsdWUgdG8gd3JpdGUgaW50byBDb25maWcgQ29udHJvbCByZWdpc3RlciAqLworCXU4IGNvbmZpZ19vcHRpb247CisKKwkvKiBpZiAxLCB0aGUgQ0FNIHN1cHBvcnRzIERBIElSUXMgKi8KKwl1OCBkYV9pcnFfc3VwcG9ydGVkOjE7CisKKyNpZmRlZiBSRUFEX0xQRFVfUEtUCisJLyogT2Zmc2V0IGludG8gY3VycmVudCByaW5nYnVmZmVyIHdoZW4gdXNlciBidWZmZXIgd2FzIG5vdCBiaWcgZW5vdWdoCisJICAgdG8gcmV0dXJuIGVudGlyZSBwa3QgKi8KKwlpbnQgcnhfb2Zmc2V0OworI2VuZGlmCisKKwkvKiBzaXplIG9mIHRoZSBidWZmZXIgdG8gdXNlIHdoZW4gdGFsa2luZyB0byB0aGUgQ0FNICovCisJaW50IGxpbmtfYnVmX3NpemU7CisKKwkvKiBidWZmZXIgZm9yIGluY29taW5nIHBhY2tldHMgKi8KKwlzdHJ1Y3QgZHZiX3JpbmdidWZmZXIgcnhfYnVmZmVyOworCisJLyogdGltZXIgdXNlZCBkdXJpbmcgdmFyaW91cyBzdGF0ZXMgb2YgdGhlIHNsb3QgKi8KKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Cit9OworCisvKiBQcml2YXRlIENBLWludGVyZmFjZSBpbmZvcm1hdGlvbiAqLworc3RydWN0IGR2Yl9jYV9wcml2YXRlIHsKKworCS8qIHBvaW50ZXIgYmFjayB0byB0aGUgcHVibGljIGRhdGEgc3RydWN0dXJlICovCisJc3RydWN0IGR2Yl9jYV9lbjUwMjIxX2NpbWF4ICpwdWI7CisKKwkvKiB0aGUgRFZCIGRldmljZSAqLworCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXY7CisKKwkvKiBGbGFncyBkZXNjcmliaW5nIHRoZSBpbnRlcmZhY2UgKERWQl9DQV9GTEFHXyopICovCisJdTMyIGZsYWdzOworCisJLyogbnVtYmVyIG9mIHNsb3RzIHN1cHBvcnRlZCBieSB0aGlzIENBIGludGVyZmFjZSAqLworCXVuc2lnbmVkIGludCBzbG90X2NvdW50OworCisJLyogaW5mb3JtYXRpb24gb24gZWFjaCBzbG90ICovCisJc3RydWN0IGR2Yl9jYV9zbG90ICpzbG90X2luZm87CisKKwkvKiB3YWl0IHF1ZXVlcyBmb3IgcmVhZCgpIGFuZCB3cml0ZSgpIG9wZXJhdGlvbnMgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3F1ZXVlOworCisJLyogUElEIG9mIHRoZSBtb25pdG9yaW5nIHRocmVhZCAqLworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGhyZWFkOworCisJLyogRmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBDQSBkZXZpY2UgaXMgb3BlbiAqLworCXVuc2lnbmVkIGludCBvcGVuOjE7CisKKwkvKiBGbGFnIGluZGljYXRpbmcgdGhlIHRocmVhZCBzaG91bGQgd2FrZSB1cCBub3cgKi8KKwl1bnNpZ25lZCBpbnQgd2FrZXVwOjE7CisKKwkvKiBEZWxheSB0aGUgbWFpbiB0aHJlYWQgc2hvdWxkIHVzZSAqLworCXVuc2lnbmVkIGxvbmcgZGVsYXk7CisKKwkvKiBTbG90IHRvIHN0YXJ0IGxvb2tpbmcgZm9yIGRhdGEKKwl0byByZWFkIGZyb20gaW4gdGhlIG5leHQgdXNlci1zcGFjZSByZWFkIG9wZXJhdGlvbiAqLworCWludCBuZXh0X3JlYWRfc2xvdDsKKworCS8qIG11dGV4IHNlcmlhbGl6aW5nIGlvY3RscyAqLworCXN0cnVjdCBtdXRleCBpb2N0bF9tdXRleDsKKworCS8qdHdvIGJ1ZnMgZm9yIHJlYWQvd3JpdGUqLworCXU4ICpyYnVmOworCXU4ICp3YnVmOworfTsKKworc3RhdGljIHZvaWQgZHZiX2NhX2VuNTAyMjFfdGhyZWFkX3dha2V1cChzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKmNhKTsKK3N0YXRpYyBpbnQgZHZiX2NhX2VuNTAyMjFfcmVhZF9kYXRhKHN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqY2EsCisJCWludCBzbG90LCB1OCAqZWJ1ZiwgaW50IGVjb3VudCk7CitzdGF0aWMgaW50IGR2Yl9jYV9lbjUwMjIxX3dyaXRlX2RhdGEoc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSwKKwkJaW50IHNsb3QsIHU4ICplYnVmLCBpbnQgZWNvdW50KTsKKworCisvKioKKyAqIFNhZmVseSBmaW5kIG5lZWRsZSBpbiBoYXlzdGFjay4KKyAqCisgKiBAcGFyYW0gaGF5c3RhY2sgQnVmZmVyIHRvIGxvb2sgaW4uCisgKiBAcGFyYW0gaGxlbiBOdW1iZXIgb2YgYnl0ZXMgaW4gaGF5c3RhY2suCisgKiBAcGFyYW0gbmVlZGxlIEJ1ZmZlciB0byBmaW5kLgorICogQHBhcmFtIG5sZW4gTnVtYmVyIG9mIGJ5dGVzIGluIG5lZWRsZS4KKyAqIEByZXR1cm4gUG9pbnRlciBpbnRvIGhheXN0YWNrIG5lZWRsZSB3YXMgZm91bmQgYXQsIG9yIE5VTEwgaWYgbm90IGZvdW5kLgorICovCitzdGF0aWMgY2hhciAqZmluZHN0cihjaGFyICpoYXlzdGFjaywgaW50IGhsZW4sIGNoYXIgKm5lZWRsZSwgaW50IG5sZW4pCit7CisJaW50IGk7CisKKwlpZiAoaGxlbiA8IG5sZW4pCisJCXJldHVybiBOVUxMOworCisJZm9yIChpID0gMDsgaSA8PSBobGVuIC0gbmxlbjsgaSsrKSB7CisJCWlmICghc3RybmNtcChoYXlzdGFjayArIGksIG5lZWRsZSwgbmxlbikpCisJCQlyZXR1cm4gaGF5c3RhY2sgKyBpOworCX0KKworCXJldHVybiBOVUxMOworfQorCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qIEVONTAyMjEgcGh5c2ljYWwgaW50ZXJmYWNlIGZ1bmN0aW9ucyAqLworCisKKy8qKgorICogQ2hlY2sgQ0FNIHN0YXR1cy4KKyAqLworc3RhdGljIGludCBkdmJfY2FfZW41MDIyMV9jaGVja19jYW1zdGF0dXMoc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSwgaW50IHNsb3QpCit7CisJaW50IHNsb3Rfc3RhdHVzOworCWludCBjYW1fcHJlc2VudDsKKwlpbnQgY2FtX2NoYW5nZWQ7CisKKwkvKiBJUlEgbW9kZSAqLworCWlmIChjYS0+ZmxhZ3MgJiBEVkJfQ0FfRU41MDIyMV9GTEFHX0lSUV9DQU1DSEFOR0UpCisJCXJldHVybiBhdG9taWNfcmVhZCgmY2EtPnNsb3RfaW5mb1tzbG90XS5jYW1jaGFuZ2VfY291bnQpICE9IDA7CisKKwkvKiBwb2xsIG1vZGUgKi8KKwlzbG90X3N0YXR1cyA9IGNhLT5wdWItPnBvbGxfc2xvdF9zdGF0dXMoY2EtPnB1Yiwgc2xvdCwgY2EtPm9wZW4pOworCisJY2FtX3ByZXNlbnQgPSAoc2xvdF9zdGF0dXMgJiBEVkJfQ0FfRU41MDIyMV9QT0xMX0NBTV9QUkVTRU5UKSA/IDEgOiAwOworCWNhbV9jaGFuZ2VkID0gKHNsb3Rfc3RhdHVzICYgRFZCX0NBX0VONTAyMjFfUE9MTF9DQU1fQ0hBTkdFRCkgPyAxIDogMDsKKwlpZiAoIWNhbV9jaGFuZ2VkKSB7CisJCWludCBjYW1fcHJlc2VudF9vbGQgPQorCQkJKGNhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9zdGF0ZQorCQkJCSE9IERWQl9DQV9TTE9UU1RBVEVfTk9ORSk7CisJCWNhbV9jaGFuZ2VkID0gKGNhbV9wcmVzZW50ICE9IGNhbV9wcmVzZW50X29sZCk7CisJfQorCisJaWYgKGNhbV9jaGFuZ2VkKSB7CisJCWlmICghY2FtX3ByZXNlbnQpIHsKKwkJCWNhLT5zbG90X2luZm9bc2xvdF0uY2FtY2hhbmdlX3R5cGUgPQorCQkJCURWQl9DQV9FTjUwMjIxX0NBTUNIQU5HRV9SRU1PVkVEOworCQl9IGVsc2UgeworCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5jYW1jaGFuZ2VfdHlwZSA9CisJCQkJRFZCX0NBX0VONTAyMjFfQ0FNQ0hBTkdFX0lOU0VSVEVEOworCQl9CisJCWF0b21pY19zZXQoJmNhLT5zbG90X2luZm9bc2xvdF0uY2FtY2hhbmdlX2NvdW50LCAxKTsKKwl9IGVsc2UgeworCQlpZiAoKGNhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9zdGF0ZQorCQkJPT0gRFZCX0NBX1NMT1RTVEFURV9XQUlUUkVBRFkpICYmCisJCQkJKHNsb3Rfc3RhdHVzICYgRFZCX0NBX0VONTAyMjFfUE9MTF9DQU1fUkVBRFkpKSB7CisJCQkvKiBtb3ZlIHRvIHZhbGlkYXRlIHN0YXRlIGlmIHJlc2V0IGlzIGNvbXBsZXRlZCAqLworCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlID0KKwkJCQlEVkJfQ0FfU0xPVFNUQVRFX1ZBTElEQVRFOworCQl9CisJfQorCXJldHVybiBjYW1fY2hhbmdlZDsKK30KKworCisvKioKKyAqIEluaXRpYWxpc2UgdGhlIGxpbmsgbGF5ZXIgY29ubmVjdGlvbiB0byBhIENBTS4KKyAqCisgKiBAcGFyYW0gY2EgQ0EgaW5zdGFuY2UuCisgKiBAcGFyYW0gc2xvdCBTbG90IGlkLgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBub256ZXJvIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgZHZiX2NhX2VuNTAyMjFfbGlua19pbml0KHN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqY2EsIGludCBzbG90KQoreworCWludCByZXQ7CisJZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsKKworCS8qIHdlJ2xsIGJlIGRldGVybWluaW5nIHRoZXNlIGR1cmluZyB0aGlzIGZ1bmN0aW9uICovCisJY2EtPnNsb3RfaW5mb1tzbG90XS5kYV9pcnFfc3VwcG9ydGVkID0gMDsKKyNpZmRlZiBSRUFEX0xQRFVfUEtUCisJY2EtPnNsb3RfaW5mb1tzbG90XS5yeF9vZmZzZXQgPSAwOworI2VuZGlmCisJLyogc2V0IHRoZSBob3N0IGxpbmsgYnVmZmVyIHNpemUgdGVtcG9yYXJpbHkuCisJICAgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIHRoZSByZWFsIG5lZ290aWF0ZWQgc2l6ZSBsYXRlci4gKi8KKwljYS0+c2xvdF9pbmZvW3Nsb3RdLmxpbmtfYnVmX3NpemUgPSBkdmJfY2FfZW41MDIyMV9saW5rX3NpemU7CisJZHByaW50aygibmVnb3RpYXRlOiBob3N0KCVpKVxuIiwgY2EtPnNsb3RfaW5mb1tzbG90XS5saW5rX2J1Zl9zaXplKTsKKworCXJldCA9IGNhLT5wdWItPm5lZ290aWF0ZShjYS0+cHViLAorCQlzbG90LCBjYS0+c2xvdF9pbmZvW3Nsb3RdLmxpbmtfYnVmX3NpemUpOworCWlmIChyZXQgPD0gMCkKKwkJcmV0dXJuIHJldDsKKworCWNhLT5zbG90X2luZm9bc2xvdF0ubGlua19idWZfc2l6ZSA9IHJldDsKKwlkcHJpbnRrKCJDaG9zZW4gbGluayBidWZmZXIgc2l6ZSBvZiAlaVxuIiwgcmV0KTsKKworCS8qIHN1Y2Nlc3MgKi8KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBSZWFkIGEgdHVwbGUgZnJvbSBhdHRyaWJ1dGUgbWVtb3J5LgorICoKKyAqIEBwYXJhbSBjYSBDQSBpbnN0YW5jZS4KKyAqIEBwYXJhbSBzbG90IFNsb3QgaWQuCisgKiBAcGFyYW0gY2lzIENJUyBkYXRhCisgKiBAcGFyYW0gYWRkcmVzcyBBZGRyZXNzIHRvIHJlYWQgZnJvbS4gVXBkYXRlZC4KKyAqIEBwYXJhbSB0dXBsZVR5cGUgVHVwbGUgaWQgYnl0ZS4gVXBkYXRlZC4KKyAqIEBwYXJhbSB0dXBsZUxlbmd0aCBUdXBsZSBsZW5ndGguIFVwZGF0ZWQuCisgKiBAcGFyYW0gdHVwbGUgRGVzdCBidWZmZXIgZm9yIHR1cGxlIChtdXN0IGJlIDI1NiBieXRlcykuIFVwZGF0ZWQuCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIG5vbnplcm8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgZHZiX2NhX2VuNTAyMjFfcmVhZF90dXBsZShzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKmNhLAorCQlpbnQgc2xvdCwgdTggKmNpcywKKwkJaW50ICphZGRyZXNzLCBpbnQgKnR1cGxlVHlwZSwgaW50ICp0dXBsZUxlbmd0aCwgdTggKnR1cGxlKQoreworCWludCBpOworCWludCBfdHVwbGVUeXBlOworCWludCBfdHVwbGVMZW5ndGg7CisJaW50IF9hZGRyZXNzID0gKmFkZHJlc3M7CisKKwkvKiBncmFiIHRoZSBuZXh0IHR1cGxlIGxlbmd0aCBhbmQgdHlwZSAqLworCV90dXBsZVR5cGUgPSBjaXNbX2FkZHJlc3NdOworCWlmIChfdHVwbGVUeXBlIDwgMCkKKwkJcmV0dXJuIF90dXBsZVR5cGU7CisJaWYgKF90dXBsZVR5cGUgPT0gMHhmZikgeworCQlkcHJpbnRrKCJFTkQgT0YgQ0hBSU4gVFVQTEUgdHlwZToweCV4XG4iLCBfdHVwbGVUeXBlKTsKKwkJKmFkZHJlc3MgKz0gMTsKKwkJKnR1cGxlVHlwZSA9IF90dXBsZVR5cGU7CisJCSp0dXBsZUxlbmd0aCA9IDA7CisJCXJldHVybiAwOworCX0KKwlfdHVwbGVMZW5ndGggPSBjaXNbX2FkZHJlc3MgKyAxXTsKKwlpZiAoX3R1cGxlTGVuZ3RoIDwgMCkKKwkJcmV0dXJuIF90dXBsZUxlbmd0aDsKKwlfYWRkcmVzcyArPSAyOworCisJZHByaW50aygiVFVQTEUgdHlwZToweCV4IGxlbmd0aDolaVxuIiwgX3R1cGxlVHlwZSwgX3R1cGxlTGVuZ3RoKTsKKworCS8qIHJlYWQgaW4gdGhlIHdob2xlIHR1cGxlICovCisJZm9yIChpID0gMDsgaSA8IF90dXBsZUxlbmd0aDsgaSsrKSB7CisJCXR1cGxlW2ldID0gY2lzW19hZGRyZXNzICsgKGkpXTsKKwkJZHByaW50aygiICAweCUwMng6IDB4JTAyeCAlY1xuIiwKKwkJCWksIHR1cGxlW2ldICYgMHhmZiwKKwkJCSgodHVwbGVbaV0gPiAzMSkgJiYgKHR1cGxlW2ldIDwgMTI3KSkgPyB0dXBsZVtpXSA6ICcuJyk7CisJfQorCV9hZGRyZXNzICs9IChfdHVwbGVMZW5ndGgpOworCisJLyogc3VjY2VzcyAqLworCSp0dXBsZVR5cGUgPSBfdHVwbGVUeXBlOworCSp0dXBsZUxlbmd0aCA9IF90dXBsZUxlbmd0aDsKKwkqYWRkcmVzcyA9IF9hZGRyZXNzOworCXJldHVybiAwOworfQorCisKKy8qKgorICogUGFyc2UgYXR0cmlidXRlIG1lbW9yeSBvZiBhIENBTSBtb2R1bGUsIGV4dHJhY3RpbmcgQ29uZmlnIHJlZ2lzdGVyLAorICogYW5kIGNoZWNraW5nIGl0IGlzIGEgRFZCIENBTSBtb2R1bGUuCisgKgorICogQHBhcmFtIGNhIENBIGluc3RhbmNlLgorICogQHBhcmFtIHNsb3QgU2xvdCBpZC4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgPDAgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBkdmJfY2FfZW41MDIyMV9wYXJzZV9hdHRyaWJ1dGVzKHN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqY2EsIGludCBzbG90KQoreworCWludCBhZGRyZXNzID0gMDsKKwlpbnQgdHVwbGVMZW5ndGg7CisJaW50IHR1cGxlVHlwZTsKKwl1OCB0dXBsZVsyNTddOworCWNoYXIgKmR2Yl9zdHI7CisJaW50IHJhc3o7CisJaW50IHN0YXR1czsKKwlpbnQgZ290X2NmdGFibGVlbnRyeSA9IDA7CisJaW50IGVuZF9jaGFpbiA9IDA7CisJaW50IGk7CisJdTE2IG1hbmZpZCA9IDA7CisJdTE2IGRldmlkID0gMDsKKwl1OCBjaXNbTUFYX0NJU19TSVpFXTsKKworCXN0YXR1cyA9IGNhLT5wdWItPnJlYWRfY2lzKGNhLT5wdWIsIHNsb3QsIGNpcywgTUFYX0NJU19TSVpFKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQ0lTVFBMX0RFVklDRV8wQSAqLworCXN0YXR1cyA9CisJICAgICBkdmJfY2FfZW41MDIyMV9yZWFkX3R1cGxlKGNhLCBzbG90LCBjaXMsICZhZGRyZXNzLAorCQkmdHVwbGVUeXBlLCAmdHVwbGVMZW5ndGgsIHR1cGxlKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQkJcHJfZXJyb3IoInJlYWQgc3RhdHVzIGVycm9yXHJcbiIpOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCWlmICh0dXBsZVR5cGUgIT0gMHgxRCkgeworCQlwcl9lcnJvcigicmVhZCB0dXBsZVR5cGUgZXJyb3IgWzB4JXhdXHJcbiIsIHR1cGxlVHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCisKKwkvKiBDSVNUUExfREVWSUNFXzBDICovCisJc3RhdHVzID0gZHZiX2NhX2VuNTAyMjFfcmVhZF90dXBsZShjYSwgc2xvdCwgY2lzLCAmYWRkcmVzcywKKwkJCSZ0dXBsZVR5cGUsICZ0dXBsZUxlbmd0aCwgdHVwbGUpOworCisJaWYgKHN0YXR1cyA8IDApIHsKKwkJcHJfZXJyb3IoInJlYWQgcmVhZCBjaXMgZXJyb3JcclxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAodHVwbGVUeXBlICE9IDB4MUMpIHsKKwkJcHJfZXJyb3IoInJlYWQgcmVhZCBjaXMgdHlwZSBlcnJvclxyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisKKworCS8qIENJU1RQTF9WRVJTXzEgKi8KKwlzdGF0dXMgPQorCSAgICAgZHZiX2NhX2VuNTAyMjFfcmVhZF90dXBsZShjYSwgc2xvdCwgY2lzLAorCQkmYWRkcmVzcywgJnR1cGxlVHlwZSwgJnR1cGxlTGVuZ3RoLCB0dXBsZSk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJcHJfZXJyb3IoInJlYWQgcmVhZCBjaXMgIHZlcnNpb24gZXJyb3JcclxuIik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCWlmICh0dXBsZVR5cGUgIT0gMHgxNSkgeworCQlwcl9lcnJvcigicmVhZCByZWFkIGNpcyB2ZXJzaW9uIHR5cGUgZXJyb3JcclxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCisKKwkvKiBDSVNUUExfTUFORklEICovCisJc3RhdHVzID0gZHZiX2NhX2VuNTAyMjFfcmVhZF90dXBsZShjYSwgc2xvdCwgY2lzLCAmYWRkcmVzcywgJnR1cGxlVHlwZSwKKwkJCQkJCSZ0dXBsZUxlbmd0aCwgdHVwbGUpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCXByX2Vycm9yKCJyZWFkIHJlYWQgY2lzIG1hbmZpZCBlcnJvclxyXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJaWYgKHR1cGxlVHlwZSAhPSAweDIwKSB7CisJCXByX2Vycm9yKCJyZWFkIHJlYWQgY2lzIG1hbmZpZCB0eXBlIGVycm9yXHJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHR1cGxlTGVuZ3RoICE9IDQpIHsKKwkJcHJfZXJyb3IoInJlYWQgcmVhZCBjaXMgbWFuZmlkIGxlbiBlcnJvclxyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1hbmZpZCA9ICh0dXBsZVsxXSA8PCA4KSB8IHR1cGxlWzBdOworCWRldmlkID0gKHR1cGxlWzNdIDw8IDgpIHwgdHVwbGVbMl07CisKKworCisJLyogQ0lTVFBMX0NPTkZJRyAqLworCXN0YXR1cyA9IGR2Yl9jYV9lbjUwMjIxX3JlYWRfdHVwbGUoY2EsIHNsb3QsIGNpcywgJmFkZHJlc3MsICZ0dXBsZVR5cGUsCisJCQkJCQkmdHVwbGVMZW5ndGgsIHR1cGxlKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlwcl9lcnJvcigicmVhZCByZWFkIGNpcyBjb25maWcgZXJyb3JcclxuIik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCWlmICh0dXBsZVR5cGUgIT0gMHgxQSkgeworCQlwcl9lcnJvcigicmVhZCByZWFkIGNpcyBjb25maWcgdHlwZSBlcnJvclxyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICh0dXBsZUxlbmd0aCA8IDMpIHsKKwkJcHJfZXJyb3IoInJlYWQgcmVhZCBjaXMgY29uZmlnIGxlbiBlcnJvclxyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogZXh0cmFjdCB0aGUgY29uZmlnYmFzZSAqLworCXJhc3ogPSB0dXBsZVswXSAmIDM7CisJaWYgKHR1cGxlTGVuZ3RoIDwgKDMgKyByYXN6ICsgMTQpKSB7CisJCXByX2Vycm9yKCJyZWFkIGV4dHJhY3QgdGhlIGNvbmZpZ2Jhc2UgIGVycm9yXHJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJY2EtPnNsb3RfaW5mb1tzbG90XS5jb25maWdfYmFzZSA9IDA7CisJZm9yIChpID0gMDsgaSA8IHJhc3ogKyAxOyBpKyspCisJCWNhLT5zbG90X2luZm9bc2xvdF0uY29uZmlnX2Jhc2UgfD0gKHR1cGxlWzIgKyBpXSA8PCAoOCAqIGkpKTsKKworCS8qIGNoZWNrIGl0IGNvbnRhaW5zIHRoZSBjb3JyZWN0IERWQiBzdHJpbmcgKi8KKwlkdmJfc3RyID0gZmluZHN0cigoY2hhciAqKXR1cGxlLCB0dXBsZUxlbmd0aCwgIkRWQl9DSV9WIiwgOCk7CisJaWYgKGR2Yl9zdHIgPT0gTlVMTCkgeworCQlwcl9lcnJvcigiZmluZCBkdmIgc3RyIERWQl9DSV9WICBlcnJvclxyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICh0dXBsZUxlbmd0aCA8ICgoZHZiX3N0ciAtIChjaGFyICopIHR1cGxlKSArIDEyKSkgeworCQlwcl9lcnJvcigiZmluZCBkdmIgc3RyIERWQl9DSV9WIGxlbiBlcnJvclxyXG4iKTsKKwkgICAgcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogaXMgaXQgYSB2ZXJzaW9uIHdlIHN1cHBvcnQ/ICovCisJaWYgKHN0cm5jbXAoZHZiX3N0ciArIDgsICIxLjAwIiwgNCkpIHsKKwkJcHJfaW5mbygiZHZiX2NhIGFkYXB0ZXIgJWQ6ICIsIGNhLT5kdmJkZXYtPmFkYXB0ZXItPm51bSk7CisJCXByX2luZm8oIlVuc3VwcG9ydGVkIERWQiBDQU0gbW9kdWxlIHZlcnNpb24gJWMlYyVjJWNcbiIsCisJCQlkdmJfc3RyWzhdLCBkdmJfc3RyWzldLCBkdmJfc3RyWzEwXSwgZHZiX3N0clsxMV0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBwcm9jZXNzIHRoZSBDRlRBQkxFX0VOVFJZIHR1cGxlcywgYW5kIGFueSBhZnRlciB0aG9zZSAqLworCXdoaWxlICgoIWVuZF9jaGFpbikgJiYgKGFkZHJlc3MgPCAweDEwMDApKSB7CisJCXN0YXR1cyA9IGR2Yl9jYV9lbjUwMjIxX3JlYWRfdHVwbGUoY2EsIHNsb3QsIGNpcywgJmFkZHJlc3MsCisJCSZ0dXBsZVR5cGUsICZ0dXBsZUxlbmd0aCwgdHVwbGUpOworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJCXByX2Vycm9yKCJwcm9jZXNzIHR1cGxlcyBlcnJvclxyXG4iKTsKKwkJCSAgIHJldHVybiBzdGF0dXM7CisJCQl9CisKKwkJc3dpdGNoICh0dXBsZVR5cGUpIHsKKwkJY2FzZSAweDFCOgkvKiBDSVNUUExfQ0ZUQUJMRV9FTlRSWSAqLworCQkJaWYgKHR1cGxlTGVuZ3RoIDwgKDIgKyAxMSArIDE3KSkKKwkJCQlicmVhazsKKworCQkJLyogaWYgd2UndmUgYWxyZWFkeSBwYXJzZWQgb25lLCBqdXN0IHVzZSBpdCAqLworCQkJaWYgKGdvdF9jZnRhYmxlZW50cnkpCisJCQkJYnJlYWs7CisKKwkJCS8qIGdldCB0aGUgY29uZmlnIG9wdGlvbiAqLworCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5jb25maWdfb3B0aW9uID0gdHVwbGVbMF0gJiAweDNmOworCisJCQkvKiBPSywgY2hlY2sgaXQgY29udGFpbnMgdGhlIGNvcnJlY3Qgc3RyaW5ncyAqLworCQkJaWYgKChmaW5kc3RyKChjaGFyICopdHVwbGUsIHR1cGxlTGVuZ3RoLCAiRFZCX0hPU1QiLCA4KQorCQkJCT09IE5VTEwpCisJCQkJfHwgKGZpbmRzdHIoKGNoYXIgKil0dXBsZSwKKwkJCQkJdHVwbGVMZW5ndGgsICJEVkJfQ0lfTU9EVUxFIiwgMTMpCisJCQkJCT09IE5VTEwpKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQlnb3RfY2Z0YWJsZWVudHJ5ID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgMHgxNDoJLyogQ0lTVFBMX05PX0xJTksgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgMHhGRjoJLyogQ0lTVFBMX0VORCAqLworCQkJZW5kX2NoYWluID0gMTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CS8qIFVua25vd24gdHVwbGUgdHlwZQorCQkJLWp1c3Qgc2tpcCB0aGlzIHR1cGxlIGFuZCBtb3ZlIHRvIHRoZSBuZXh0IG9uZSAqLworCQkJZHByaW50aygiZHZiX2NhOiBTa2lwcGluZyB1bmtub3duIHR1cGxlIHR5cGU6MHgleCIsCisJCQkJdHVwbGVUeXBlKTsKKwkJCWRwcmludGsoIiBsZW5ndGg6MHgleFxuIiwgdHVwbGVMZW5ndGgpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoKGFkZHJlc3MgPiAweDEwMDApIHx8ICghZ290X2NmdGFibGVlbnRyeSkpIHsKKwkJcHJfZXJyb3IoImdvdF9jZnRhYmxlZW50cnkgOiVkXHJcbiIsIGdvdF9jZnRhYmxlZW50cnkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkcHJpbnRrKCJWYWxpZCBEVkIgQ0FNIGRldGVjdGVkIE1BTklEOiV4IERFVklEOiV4IiwgbWFuZmlkLCBkZXZpZCk7CisJZHByaW50aygiIENPTkZJR0JBU0U6MHgleCBDT05GSUdPUFRJT046MHgleFxuIiwKKwkJY2EtPnNsb3RfaW5mb1tzbG90XS5jb25maWdfYmFzZSwKKwkJY2EtPnNsb3RfaW5mb1tzbG90XS5jb25maWdfb3B0aW9uKTsKKworCS8qIHN1Y2Nlc3MhICovCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBTZXQgQ0FNJ3MgY29uZmlnb3B0aW9uIGNvcnJlY3RseS4KKyAqCisgKiBAcGFyYW0gY2EgQ0EgaW5zdGFuY2UuCisgKiBAcGFyYW0gc2xvdCBTbG90IGNvbnRhaW5pbmcgdGhlIENBTS4KKyAqLworc3RhdGljIGludCBkdmJfY2FfZW41MDIyMV9zZXRfY29uZmlnb3B0aW9uKHN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqY2EsIGludCBzbG90KQoreworCWludCBjb25maWdvcHRpb247CisKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOworCisJLyogc2V0IHRoZSBjb25maWcgb3B0aW9uICovCisJY2EtPnB1Yi0+d3JpdGVfY29yKGNhLT5wdWIsIHNsb3QsCisJCQkJICAgICBjYS0+c2xvdF9pbmZvW3Nsb3RdLmNvbmZpZ19iYXNlLAorCQkJCSAgICAgJmNhLT5zbG90X2luZm9bc2xvdF0uY29uZmlnX29wdGlvbik7CisKKwljb25maWdvcHRpb24gPSBjYS0+c2xvdF9pbmZvW3Nsb3RdLmNvbmZpZ19vcHRpb247CisJZHByaW50aygiU2V0IGNvbmZpZ29wdGlvbiAweCV4LCBiYXNlIDB4JXhcbiIsCisJCWNhLT5zbG90X2luZm9bc2xvdF0uY29uZmlnX29wdGlvbiwKKwkJY2EtPnNsb3RfaW5mb1tzbG90XS5jb25maWdfYmFzZSk7CisKKwkvKiBmaW5lISAqLworCXJldHVybiAwOworCit9CisKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHRhbGtzIHRvIGFuIEVONTAyMjEgQ0FNIGNvbnRyb2wgaW50ZXJmYWNlLiBJdCByZWFkcyBhIGJ1ZmZlciBvZgorICogZGF0YSBmcm9tIHRoZSBDQU0uIFRoZSBkYXRhIGNhbiBlaXRoZXIgYmUgc3RvcmVkIGluIGEgc3VwcGxpZWQgYnVmZmVyLCBvcgorICogYXV0b21hdGljYWxseSBiZSBhZGRlZCB0byB0aGUgc2xvdCdzIHJ4X2J1ZmZlci4KKyAqCisgKiBAcGFyYW0gY2EgQ0EgaW5zdGFuY2UuCisgKiBAcGFyYW0gc2xvdCBTbG90IHRvIHJlYWQgZnJvbS4KKyAqIEBwYXJhbSBlYnVmIElmIG5vbi1OVUxMLCB0aGUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhpcyBidWZmZXIuIElmIE5VTEwsCisgKiB0aGUgZGF0YSB3aWxsIGJlIGFkZGVkIGludG8gdGhlIGJ1ZmZlcmluZyBzeXN0ZW0gYXMgYSBub3JtYWwgZnJhZ21lbnQuCisgKiBAcGFyYW0gZWNvdW50IFNpemUgb2YgZWJ1Zi4gSWdub3JlZCBpZiBlYnVmIGlzIE5VTEwuCisgKgorICogQHJldHVybiBOdW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgPCAwIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgZHZiX2NhX2VuNTAyMjFfcmVhZF9kYXRhKHN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqY2EsCisJCWludCBzbG90LCB1OCAqZWJ1ZiwgaW50IGVjb3VudCkKK3sKKwlpbnQgYnl0ZXNfcmVhZDsKKwlpbnQgc3RhdHVzOworCXU4ICpidWYgPSBjYS0+cmJ1ZjsKKworCS8qIGRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7ICovCisKKwkvKiBjaGVjayBpZiB3ZSBoYXZlIHNwYWNlIGZvciBhIGxpbmsgYnVmIGluIHRoZSByeF9idWZmZXIgKi8KKwlpZiAoZWJ1ZiA9PSBOVUxMKSB7CisJCWludCBidWZfZnJlZTsKKworCQlpZiAoY2EtPnNsb3RfaW5mb1tzbG90XS5yeF9idWZmZXIuZGF0YSA9PSBOVUxMKSB7CisJCQlzdGF0dXMgPSAtRUlPOworCQkJZ290byBleGl0OworCQl9CisJCWJ1Zl9mcmVlID0gZHZiX3JpbmdidWZmZXJfZnJlZSgmY2EtPnNsb3RfaW5mb1tzbG90XS5yeF9idWZmZXIpOworCQlkdmJfY2FfZW41MDIyMV9idWZmZXJfZnJlZSA9IGJ1Zl9mcmVlOworCisJCWlmIChidWZfZnJlZSA8IChjYS0+c2xvdF9pbmZvW3Nsb3RdLmxpbmtfYnVmX3NpemUKKwkJCQkrIERWQl9SSU5HQlVGRkVSX1BLVEhEUlNJWkUpKSB7CisJCQlzdGF0dXMgPSAtRUFHQUlOOworCQkJZ290byBleGl0OworCQl9CisJfQorCisJLyogY2hlY2sgaWYgdGhlcmUgaXMgZGF0YSBhdmFpbGFibGUgKi8KKwlzdGF0dXMgPSBjYS0+cHViLT5yZWFkX2NhbV9zdGF0dXMoY2EtPnB1Yiwgc2xvdCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXhpdDsKKwlpZiAoIShzdGF0dXMgJiBTVEFUVVNSRUdfREEpKSB7CisJCS8qIG5vIGRhdGEgKi8KKwkJc3RhdHVzID0gMDsKKwkJZ290byBleGl0OworCX0KKworCS8qIHJlYWQgdGhlIGFtb3VudCBvZiBkYXRhICovCisJc3RhdHVzID0gY2EtPnB1Yi0+cmVhZF9scGR1KGNhLT5wdWIsCisJCQlzbG90LCBidWYsIGR2Yl9jYV9lbjUwMjIxX2xpbmtfc2l6ZSk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlID0gRFZCX0NBX1NMT1RTVEFURV9MSU5LSU5JVDsKKwkJc3RhdHVzID0gLUVJTzsKKwkJZ290byBleGl0OworCX0KKworCWJ5dGVzX3JlYWQgPSBzdGF0dXM7CisKKwkvKiBjaGVjayBpdCB3aWxsIGZpdCAqLworCWlmIChlYnVmID09IE5VTEwpIHsKKwkJaWYgKGJ5dGVzX3JlYWQgPiBjYS0+c2xvdF9pbmZvW3Nsb3RdLmxpbmtfYnVmX3NpemUpIHsKKwkJCXByX2Vycm9yKCJkdmJfY2EgYWRhcHRlciAlZDoiLAorCQkJCWNhLT5kdmJkZXYtPmFkYXB0ZXItPm51bSk7CisJCQlwcl9lcnJvcigiIENBTSB0cmllZCB0byBzZW5kIGEgYnVmZmVyIGxhcmdlciAiKTsKKwkJCXByX2Vycm9yKCJ0aGFuIHRoZSBsaW5rIGJ1ZmZlciBzaXplKCVpID4gJWkpIVxuIiwKKwkJCSAgICAgICBieXRlc19yZWFkLCBjYS0+c2xvdF9pbmZvW3Nsb3RdLmxpbmtfYnVmX3NpemUpOworCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlID0KKwkJCQlEVkJfQ0FfU0xPVFNUQVRFX0xJTktJTklUOworCQkJc3RhdHVzID0gLUVJTzsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCQlpZiAoYnl0ZXNfcmVhZCA8IDIpIHsKKwkJCXByX2Vycm9yKCJkdmJfY2EgYWRhcHRlciAlZDogIiwKKwkJCQkJY2EtPmR2YmRldi0+YWRhcHRlci0+bnVtKTsKKwkJCXByX2Vycm9yKCJDQU0gc2VudCBhIGJ1ZmZlciIpOworCQkJcHJfZXJyb3IoInRoYXQgd2FzIGxlc3MgdGhhbiAyQiFcbiIpOworCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlID0KKwkJCQlEVkJfQ0FfU0xPVFNUQVRFX0xJTktJTklUOworCQkJc3RhdHVzID0gLUVJTzsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChieXRlc19yZWFkID4gZWNvdW50KSB7CisJCQlwcl9lcnJvcigiZHZiX2NhIGFkYXB0ZXIgJWQ6IiwKKwkJCQljYS0+ZHZiZGV2LT5hZGFwdGVyLT5udW0pOworCQkJcHJfZXJyb3IoIiBDQU0gdHJpZWQgdG8gc2VuZCBhIGJ1ZmZlciBsYXJnZXIiKTsKKwkJCXByX2Vycm9yKCIgdGhhbiB0aGUgZWNvdW50IHNpemUhXG4iKTsKKwkJCXN0YXR1cyA9IC1FSU87CisJCQlnb3RvIGV4aXQ7CisJCX0KKwl9CisKKwkvKiBPSywgYWRkIGl0IHRvIHRoZSByZWNlaXZlIGJ1ZmZlciwKKwkgICBvciBjb3B5IGludG8gZXh0ZXJuYWwgYnVmZmVyIGlmIHN1cHBsaWVkICovCisJaWYgKGVidWYgPT0gTlVMTCkgeworCQlpZiAoY2EtPnNsb3RfaW5mb1tzbG90XS5yeF9idWZmZXIuZGF0YSA9PSBOVUxMKSB7CisJCQlzdGF0dXMgPSAtRUlPOworCQkJZ290byBleGl0OworCQl9CisJCWR2Yl9yaW5nYnVmZmVyX3BrdF93cml0ZSgmY2EtPnNsb3RfaW5mb1tzbG90XS5yeF9idWZmZXIsCisJCQlidWYsIGJ5dGVzX3JlYWQpOworCX0gZWxzZSB7CisJCW1lbWNweShlYnVmLCBidWYsIGJ5dGVzX3JlYWQpOworCX0KKworI2lmbmRlZiBSRUFEX0xQRFVfUEtUCisJLyogd2FrZSB1cCByZWFkZXJzIHdoZW4gYSBsYXN0X2ZyYWdtZW50IGlzIHJlY2VpdmVkICovCisJaWYgKChidWZbMV0gJiAweDgwKSA9PSAweDAwKQorI2VuZGlmCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2EtPndhaXRfcXVldWUpOworCXN0YXR1cyA9IGJ5dGVzX3JlYWQ7CisKK2V4aXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gdGFsa3MgdG8gYW4gRU41MDIyMSBDQU0gY29udHJvbCBpbnRlcmZhY2UuCisgKiBJdCB3cml0ZXMgYSBidWZmZXIgb2YgZGF0YQorICogdG8gYSBDQU0uCisgKgorICogQHBhcmFtIGNhIENBIGluc3RhbmNlLgorICogQHBhcmFtIHNsb3QgU2xvdCB0byB3cml0ZSB0by4KKyAqIEBwYXJhbSBlYnVmIFRoZSBkYXRhIGluIHRoaXMgYnVmZmVyCisgKiBpcyB0cmVhdGVkIGFzIGEgY29tcGxldGUgbGluay1sZXZlbCBwYWNrZXQgdG8gYmUgd3JpdHRlbi4KKyAqIEBwYXJhbSBjb3VudCBTaXplIG9mIGVidWYuCisgKgorICogQHJldHVybiBOdW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwgb3IgPCAwIG9uIGVycm9yLgorICovCitzdGF0aWMgaW50IGR2Yl9jYV9lbjUwMjIxX3dyaXRlX2RhdGEoc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSwKKwkJaW50IHNsb3QsIHU4ICpidWYsIGludCBieXRlc193cml0ZSkKK3sKKwlpbnQgc3RhdHVzOworCisJLyogZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsgKi8KKworCS8qIHNhbml0eSBjaGVjayAqLworCWlmIChieXRlc193cml0ZSA+IGNhLT5zbG90X2luZm9bc2xvdF0ubGlua19idWZfc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBpdCBpcyBwb3NzaWJsZSB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgc2luZ2xlIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiwKKwkgICB0aHVzIGlmIHRoZXJlIGlzIGRhdGEgYXZhaWxhYmxlIGZvciByZWFkIG9yIGlmIHRoZXJlIGlzIGV2ZW4gYSByZWFkCisJICAgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2UgZG8gbm90aGluZyBidXQgYXdha2UgdGhlIGtlcm5lbCB0aHJlYWQgdG8KKwkgICBwcm9jZXNzIHRoZSBkYXRhIGlmIG5lY2Vzc2FyeS4gKi8KKwlzdGF0dXMgPSBjYS0+cHViLT5yZWFkX2NhbV9zdGF0dXMoY2EtPnB1Yiwgc2xvdCk7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisJaWYgKHN0YXR1cyAmIChTVEFUVVNSRUdfREEgfCBTVEFUVVNSRUdfUkUpKSB7CisJCWlmIChzdGF0dXMgJiBTVEFUVVNSRUdfREEpCisJCQlkdmJfY2FfZW41MDIyMV90aHJlYWRfd2FrZXVwKGNhKTsKKwkJc3RhdHVzID0gLUVBR0FJTjsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlpZiAoIShzdGF0dXMgJiBTVEFUVVNSRUdfRlIpKSB7CisJCXN0YXR1cyA9IC1FQUdBSU47CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJc3RhdHVzID0gY2EtPnB1Yi0+d3JpdGVfbHBkdShjYS0+cHViLCBzbG90LCBidWYsIGJ5dGVzX3dyaXRlKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlpZiAoc3RhdHVzID09IC1FQlVTWSkgeworCQkJc3RhdHVzID0gLUVBR0FJTjsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0gZWxzZSB7CisJCQljYS0+c2xvdF9pbmZvW3Nsb3RdLnNsb3Rfc3RhdGUgPQorCQkJCURWQl9DQV9TTE9UU1RBVEVfTElOS0lOSVQ7CisJCQlzdGF0dXMgPSAtRUlPOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCX0KKworCXN0YXR1cyA9IGJ5dGVzX3dyaXRlOworCisJcmV0dXJuIHN0YXR1czsKK30KK0VYUE9SVF9TWU1CT0woZHZiX2NhX2VuNTAyMjFfY2ltYXhfY2FtY2hhbmdlX2lycSk7CisKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogRU41MDIyMSBoaWdoZXIgbGV2ZWwgZnVuY3Rpb25zICovCisKKworLyoqCisgKiBBIENBTSBoYXMgYmVlbiByZW1vdmVkID0+IHNodXQgaXQgZG93bi4KKyAqCisgKiBAcGFyYW0gY2EgQ0EgaW5zdGFuY2UuCisgKiBAcGFyYW0gc2xvdCBTbG90IHRvIHNodXQgZG93bi4KKyAqLworc3RhdGljIGludCBkdmJfY2FfZW41MDIyMV9zbG90X3NodXRkb3duKHN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqY2EsIGludCBzbG90KQoreworCWRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwljYS0+cHViLT5zbG90X3NodXRkb3duKGNhLT5wdWIsIHNsb3QpOworCWNhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9zdGF0ZSA9IERWQl9DQV9TTE9UU1RBVEVfTk9ORTsKKworCS8qIG5lZWQgdG8gd2FrZSB1cCBhbGwgcHJvY2Vzc2VzIHRvIGNoZWNrIGlmIHRoZXkncmUgbm93CisJICAgdHJ5aW5nIHRvIHdyaXRlIHRvIGEgZGVmdW5jdCBDQU0gKi8KKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNhLT53YWl0X3F1ZXVlKTsKKworCWRwcmludGsoIlNsb3QgJWkgc2h1dGRvd25cbiIsIHNsb3QpOworCisJLyogc3VjY2VzcyAqLworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkdmJfY2FfZW41MDIyMV9jaW1heF9jYW1yZWFkeV9pcnEpOworCisKKy8qKgorICogQSBDQU1DSEFOR0UgSVJRIGhhcyBvY2N1cnJlZC4KKyAqCisgKiBAcGFyYW0gY2EgQ0EgaW5zdGFuY2UuCisgKiBAcGFyYW0gc2xvdCBTbG90IGNvbmNlcm5lZC4KKyAqIEBwYXJhbSBjaGFuZ2VfdHlwZSBPbmUgb2YgdGhlIERWQl9DQV9DQU1DSEFOR0VfKiB2YWx1ZXMuCisgKi8KK3ZvaWQgZHZiX2NhX2VuNTAyMjFfY2ltYXhfY2FtY2hhbmdlX2lycShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltYXggKnB1YmNhLAorCQlpbnQgc2xvdCwgaW50IGNoYW5nZV90eXBlKQoreworCXN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqY2EgPSBwdWJjYS0+cHJpdmF0ZTsKKworCWRwcmludGsoIkNBTUNIQU5HRSBJUlEgc2xvdDolaSBjaGFuZ2VfdHlwZTolaVxuIiwgc2xvdCwgY2hhbmdlX3R5cGUpOworCisJc3dpdGNoIChjaGFuZ2VfdHlwZSkgeworCWNhc2UgRFZCX0NBX0VONTAyMjFfQ0FNQ0hBTkdFX1JFTU9WRUQ6CisJY2FzZSBEVkJfQ0FfRU41MDIyMV9DQU1DSEFOR0VfSU5TRVJURUQ6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKworCWNhLT5zbG90X2luZm9bc2xvdF0uY2FtY2hhbmdlX3R5cGUgPSBjaGFuZ2VfdHlwZTsKKwlhdG9taWNfaW5jKCZjYS0+c2xvdF9pbmZvW3Nsb3RdLmNhbWNoYW5nZV9jb3VudCk7CisJZHZiX2NhX2VuNTAyMjFfdGhyZWFkX3dha2V1cChjYSk7Cit9CitFWFBPUlRfU1lNQk9MKGR2Yl9jYV9lbjUwMjIxX2NpbWF4X2ZyZGFfaXJxKTsKKworCisvKioKKyAqIEEgQ0FNUkVBRFkgSVJRIGhhcyBvY2N1cnJlZC4KKyAqCisgKiBAcGFyYW0gY2EgQ0EgaW5zdGFuY2UuCisgKiBAcGFyYW0gc2xvdCBTbG90IGNvbmNlcm5lZC4KKyAqLwordm9pZCBkdmJfY2FfZW41MDIyMV9jaW1heF9jYW1yZWFkeV9pcnEoc3RydWN0IGR2Yl9jYV9lbjUwMjIxX2NpbWF4ICpwdWJjYSwKKwkJaW50IHNsb3QpCit7CisJc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSA9IHB1YmNhLT5wcml2YXRlOworCisJZHByaW50aygiQ0FNUkVBRFkgSVJRIHNsb3Q6JWlcbiIsIHNsb3QpOworCisJaWYgKGNhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9zdGF0ZSA9PSBEVkJfQ0FfU0xPVFNUQVRFX1dBSVRSRUFEWSkgeworCQljYS0+c2xvdF9pbmZvW3Nsb3RdLnNsb3Rfc3RhdGUgPSBEVkJfQ0FfU0xPVFNUQVRFX1ZBTElEQVRFOworCQlkdmJfY2FfZW41MDIyMV90aHJlYWRfd2FrZXVwKGNhKTsKKwl9Cit9CisKKworLyoqCisgKiBBbiBGUiBvciBEQSBJUlEgaGFzIG9jY3VycmVkLgorICoKKyAqIEBwYXJhbSBjYSBDQSBpbnN0YW5jZS4KKyAqIEBwYXJhbSBzbG90IFNsb3QgY29uY2VybmVkLgorICovCit2b2lkIGR2Yl9jYV9lbjUwMjIxX2NpbWF4X2ZyZGFfaXJxKHN0cnVjdCBkdmJfY2FfZW41MDIyMV9jaW1heCAqcHViY2EsCisJCWludCBzbG90KQoreworCXN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqY2EgPSBwdWJjYS0+cHJpdmF0ZTsKKwlpbnQgZmxhZ3M7CisKKwlkcHJpbnRrKCJGUi9EQSBJUlEgc2xvdDolaVxuIiwgc2xvdCk7CisKKwlzd2l0Y2ggKGNhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9zdGF0ZSkgeworCWNhc2UgRFZCX0NBX1NMT1RTVEFURV9MSU5LSU5JVDoKKwkJZmxhZ3MgPSBjYS0+cHViLT5nZXRfY2FwYmlsaXR5KHB1YmNhLCBzbG90KTsKKwkJaWYgKGZsYWdzICYgRFZCX0NBX0VONTAyMjFfQ0FQX0lSUSkgeworCQkJZHByaW50aygiQ0FNIHN1cHBvcnRzIERBIElSUVxuIik7CisJCQljYS0+c2xvdF9pbmZvW3Nsb3RdLmRhX2lycV9zdXBwb3J0ZWQgPSAxOworCQl9CisJCWJyZWFrOworCisJY2FzZSBEVkJfQ0FfU0xPVFNUQVRFX1JVTk5JTkc6CisJCWlmIChjYS0+b3BlbikKKwkJCWR2Yl9jYV9lbjUwMjIxX3RocmVhZF93YWtldXAoY2EpOworCQlicmVhazsKKwl9Cit9CisKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogRU41MDIyMSB0aHJlYWQgZnVuY3Rpb25zICovCisKKy8qKgorICogV2FrZSB1cCB0aGUgRFZCIENBIHRocmVhZAorICoKKyAqIEBwYXJhbSBjYSBDQSBpbnN0YW5jZS4KKyAqLworc3RhdGljIHZvaWQgZHZiX2NhX2VuNTAyMjFfdGhyZWFkX3dha2V1cChzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKmNhKQoreworCisJZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsKKworCWNhLT53YWtldXAgPSAxOworCW1iKCk7IC8qb3JpZ2luYWwqLworCXdha2VfdXBfcHJvY2VzcyhjYS0+dGhyZWFkKTsKK30KKworLyoqCisgKiBVcGRhdGUgdGhlIGRlbGF5IHVzZWQgYnkgdGhlIHRocmVhZC4KKyAqCisgKiBAcGFyYW0gY2EgQ0EgaW5zdGFuY2UuCisgKi8KK3N0YXRpYyB2b2lkIGR2Yl9jYV9lbjUwMjIxX3RocmVhZF91cGRhdGVfZGVsYXkoc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSkKK3sKKwlpbnQgZGVsYXk7CisJaW50IGN1cmRlbGF5ID0gMTAwMDAwMDAwOworCWludCBzbG90OworCisJLyogQmV3YXJlIG9mIHRvbyBoaWdoIHBvbGxpbmcgZnJlcXVlbmN5LCBiZWNhdXNlIG9uZSBwb2xsaW5nCisJICogY2FsbCBtaWdodCB0YWtlIHNldmVyYWwgaHVuZHJlZCBtaWxsaXNlY29uZHMgdW50aWwgdGltZW91dCEKKwkgKi8KKwlmb3IgKHNsb3QgPSAwOyBzbG90IDwgY2EtPnNsb3RfY291bnQ7IHNsb3QrKykgeworCQlzd2l0Y2ggKGNhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9zdGF0ZSkgeworCQlkZWZhdWx0OgorCQljYXNlIERWQl9DQV9TTE9UU1RBVEVfTk9ORToKKwkJCWRlbGF5ID0gSFogKiA2MDsgIC8qIDYwcyAqLworCQkJaWYgKCEoY2EtPmZsYWdzICYgRFZCX0NBX0VONTAyMjFfRkxBR19JUlFfQ0FNQ0hBTkdFKSkKKwkJCQlkZWxheSA9IEhaICogNTsgIC8qIDVzICovCisJCQlicmVhazsKKwkJY2FzZSBEVkJfQ0FfU0xPVFNUQVRFX0lOVkFMSUQ6CisJCQlkZWxheSA9IEhaICogNjA7ICAvKiA2MHMgKi8KKwkJCWlmICghKGNhLT5mbGFncyAmIERWQl9DQV9FTjUwMjIxX0ZMQUdfSVJRX0NBTUNIQU5HRSkpCisJCQkJZGVsYXkgPSBIWiAvIDEwOyAgLyogMTAwbXMgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgRFZCX0NBX1NMT1RTVEFURV9VTklOSVRJQUxJU0VEOgorCQljYXNlIERWQl9DQV9TTE9UU1RBVEVfV0FJVFJFQURZOgorCQljYXNlIERWQl9DQV9TTE9UU1RBVEVfVkFMSURBVEU6CisJCWNhc2UgRFZCX0NBX1NMT1RTVEFURV9XQUlURlI6CisJCWNhc2UgRFZCX0NBX1NMT1RTVEFURV9MSU5LSU5JVDoKKwkJCWRlbGF5ID0gSFogLyAxMDsgIC8qIDEwMG1zICovCisJCQlicmVhazsKKwkJY2FzZSBEVkJfQ0FfU0xPVFNUQVRFX1dBSVRMSU5LSU5JVDoKKwkJCWRlbGF5ID0gSFogKiAyOworCQkJYnJlYWs7CisKKwkJY2FzZSBEVkJfQ0FfU0xPVFNUQVRFX1JVTk5JTkc6CisJCQlkZWxheSA9IEhaICogNjA7ICAvKiA2MHMgKi8KKwkJCWlmICghKGNhLT5mbGFncyAmIERWQl9DQV9FTjUwMjIxX0ZMQUdfSVJRX0NBTUNIQU5HRSkpCisJCQkJZGVsYXkgPSBIWiAvIDEwOyAgLyogMTAwbXMgKi8KKwkJCWlmIChjYS0+b3BlbikgeworCQkJCWlmICgoIWNhLT5zbG90X2luZm9bc2xvdF0uZGFfaXJxX3N1cHBvcnRlZCkgfHwKKwkJCQkgICAgKCEoY2EtPmZsYWdzICYgRFZCX0NBX0VONTAyMjFfRkxBR19JUlFfREEpKSkKKwkJCQkJZGVsYXkgPSBIWiAvIDEwOyAgLyogMTAwbXMgKi8KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGRlbGF5IDwgY3VyZGVsYXkpCisJCQljdXJkZWxheSA9IGRlbGF5OworCX0KKworCWNhLT5kZWxheSA9IGN1cmRlbGF5OworfQorCitzdGF0aWMgaW50IGR2Yl9jYV9lbjUwMjIxX3Nsb3RfcHJvY2VzcyhzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKmNhLCBpbnQgc2xvdCkKK3sKKwlpbnQgZmxhZ3M7CisJaW50IHN0YXR1czsKKwlpbnQgcGt0Y291bnQ7CisJdm9pZCAqcnhidWY7CisKKwltdXRleF9sb2NrKCZjYS0+c2xvdF9pbmZvW3Nsb3RdLnNsb3RfbG9jayk7CisKKwkvKmNoZWNrIHRoZSBjYW0gc3RhdHVzICsgZGVhbCB3aXRoIENBTUNIQU5HRXMqLworCXdoaWxlIChkdmJfY2FfZW41MDIyMV9jaGVja19jYW1zdGF0dXMoY2EsIHNsb3QpKSB7CisJCS8qIGNsZWFyIGRvd24gYW4gb2xkIENJIHNsb3QgaWYgbmVjZXNzYXJ5ICovCisJCWlmIChjYS0+c2xvdF9pbmZvW3Nsb3RdLnNsb3Rfc3RhdGUgIT0gRFZCX0NBX1NMT1RTVEFURV9OT05FKQorCQkJZHZiX2NhX2VuNTAyMjFfc2xvdF9zaHV0ZG93bihjYSwgc2xvdCk7CisKKwkJLyogaWYgYSBDQU0gaXMgTk9XIHByZXNlbnQsIGluaXRpYWxpc2UgaXQgKi8KKwkJaWYgKGNhLT5zbG90X2luZm9bc2xvdF0uY2FtY2hhbmdlX3R5cGUKKwkJCQk9PSBEVkJfQ0FfRU41MDIyMV9DQU1DSEFOR0VfSU5TRVJURUQpCisJCQljYS0+c2xvdF9pbmZvW3Nsb3RdLnNsb3Rfc3RhdGUgPQorCQkJCURWQl9DQV9TTE9UU1RBVEVfVU5JTklUSUFMSVNFRDsKKworCQkvKiB3ZSd2ZSBoYW5kbGVkIG9uZSBDQU1DSEFOR0UgKi8KKwkJZHZiX2NhX2VuNTAyMjFfdGhyZWFkX3VwZGF0ZV9kZWxheShjYSk7CisJCWF0b21pY19kZWMoJmNhLT5zbG90X2luZm9bc2xvdF0uY2FtY2hhbmdlX2NvdW50KTsKKwl9CisKKwkvKiBDQU0gc3RhdGUgbWFjaGluZSAqLworCXN3aXRjaCAoY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlKSB7CisJY2FzZSBEVkJfQ0FfU0xPVFNUQVRFX05PTkU6CisJY2FzZSBEVkJfQ0FfU0xPVFNUQVRFX0lOVkFMSUQ6CisJCS8qIG5vIGFjdGlvbiBuZWVkZWQgKi8KKwkJYnJlYWs7CisKKwljYXNlIERWQl9DQV9TTE9UU1RBVEVfVU5JTklUSUFMSVNFRDoKKwkJY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlID0gRFZCX0NBX1NMT1RTVEFURV9XQUlUUkVBRFk7CisJCWNhLT5wdWItPnNsb3RfcmVzZXQoY2EtPnB1Yiwgc2xvdCk7CisJCWNhLT5zbG90X2luZm9bc2xvdF0udGltZW91dCA9IGppZmZpZXMKKwkJCSsgKElOSVRfVElNRU9VVF9TRUNTICogSFopOworCQlicmVhazsKKworCWNhc2UgRFZCX0NBX1NMT1RTVEFURV9XQUlUUkVBRFk6CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGNhLT5zbG90X2luZm9bc2xvdF0udGltZW91dCkpIHsKKwkJCWRwcmludGsoIiVkOiBQQyBjYXJkIGRpZCBub3QgcmVzcG9uZFxuIiwKKwkJCQljYS0+ZHZiZGV2LT5hZGFwdGVyLT5udW0pOworCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlID0KKwkJCQlEVkJfQ0FfU0xPVFNUQVRFX0lOVkFMSUQ7CisJCQlkdmJfY2FfZW41MDIyMV90aHJlYWRfdXBkYXRlX2RlbGF5KGNhKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIG5vIG90aGVyIGFjdGlvbiBuZWVkZWQ7IHdpbGwgYXV0b21hdGljYWxseQorCQkgKiBjaGFuZ2Ugc3RhdGUgd2hlbiByZWFkeQorCQkgKi8KKwkJYnJlYWs7CisKKwljYXNlIERWQl9DQV9TTE9UU1RBVEVfVkFMSURBVEU6CisJCWlmIChkdmJfY2FfZW41MDIyMV9wYXJzZV9hdHRyaWJ1dGVzKGNhLCBzbG90KSAhPSAwKSB7CisJCQkvKiB3ZSBuZWVkIHRoaXMgZXh0cmEgY2hlY2sKKwkJCSAgIGZvciBhbm5veWluZyBpbnRlcmZhY2VzIGxpa2UgdGhlIGJ1ZGdldC1hdiAqLworCQkJaWYgKCghKGNhLT5mbGFncyAmIERWQl9DQV9FTjUwMjIxX0ZMQUdfSVJRX0NBTUNIQU5HRSkpCisJCQkJCSYmIChjYS0+cHViLT5wb2xsX3Nsb3Rfc3RhdHVzKSkgeworCQkJCXN0YXR1cyA9IGNhLT5wdWItPnBvbGxfc2xvdF9zdGF0dXMoY2EtPnB1YiwKKwkJCQkJCXNsb3QsIDApOworCQkJCWlmICghKHN0YXR1cworCQkJCQkmIERWQl9DQV9FTjUwMjIxX1BPTExfQ0FNX1BSRVNFTlQpKSB7CisJCQkJCWNhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9zdGF0ZSA9CisJCQkJCQlEVkJfQ0FfU0xPVFNUQVRFX05PTkU7CisJCQkJCWR2Yl9jYV9lbjUwMjIxX3RocmVhZF91cGRhdGVfZGVsYXkoY2EpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlkcHJpbnRrKCIgJWQ6IEludmFsaWQgUEMgY2FyZCBpbnNlcnRlZCA6KFxuIiwKKwkJCSAgICAgICBjYS0+ZHZiZGV2LT5hZGFwdGVyLT5udW0pOworCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlID0KKwkJCQkJRFZCX0NBX1NMT1RTVEFURV9JTlZBTElEOworCQkJZHZiX2NhX2VuNTAyMjFfdGhyZWFkX3VwZGF0ZV9kZWxheShjYSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZHZiX2NhX2VuNTAyMjFfc2V0X2NvbmZpZ29wdGlvbihjYSwgc2xvdCkgIT0gMCkgeworCQkJZHByaW50aygiJWQ6IFVuYWJsZSBpbml0aWFsaXNlIENBTTooXG4iLAorCQkJICAgICAgIGNhLT5kdmJkZXYtPmFkYXB0ZXItPm51bSk7CisJCQljYS0+c2xvdF9pbmZvW3Nsb3RdLnNsb3Rfc3RhdGUgPQorCQkJCQlEVkJfQ0FfU0xPVFNUQVRFX0lOVkFMSUQ7CisJCQlkdmJfY2FfZW41MDIyMV90aHJlYWRfdXBkYXRlX2RlbGF5KGNhKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGNhLT5wdWItPmNhbV9yZXNldChjYS0+cHViLCBzbG90KSAhPSAwKSB7CisJCQlkcHJpbnRrKCIlZDogVW5hYmxlIHRvIHJlc2V0IENBTSBJRlxuIiwKKwkJCSAgICAgICBjYS0+ZHZiZGV2LT5hZGFwdGVyLT5udW0pOworCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlID0KKwkJCQkJRFZCX0NBX1NMT1RTVEFURV9JTlZBTElEOworCQkJZHZiX2NhX2VuNTAyMjFfdGhyZWFkX3VwZGF0ZV9kZWxheShjYSk7CisJCQlicmVhazsKKwkJfQorCisJCWRwcmludGsoIkRWQiBDQU0gdmFsaWRhdGVkIHN1Y2Nlc3NmdWxseVxuIik7CisKKwkJY2EtPnNsb3RfaW5mb1tzbG90XS50aW1lb3V0ID0KKwkJCQlqaWZmaWVzICsgKElOSVRfVElNRU9VVF9TRUNTICogSFopOworCQljYS0+c2xvdF9pbmZvW3Nsb3RdLnNsb3Rfc3RhdGUgPSBEVkJfQ0FfU0xPVFNUQVRFX1dBSVRGUjsKKwkJY2EtPndha2V1cCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBEVkJfQ0FfU0xPVFNUQVRFX1dBSVRGUjoKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgY2EtPnNsb3RfaW5mb1tzbG90XS50aW1lb3V0KSkgeworCQkJcHJfZXJyb3IoImR2Yl9jYSBhZGFwdGVyICVkOiAiLAorCQkJCWNhLT5kdmJkZXYtPmFkYXB0ZXItPm51bSk7CisJCQlwcl9lcnJvcigiRFZCIENBTSBkaWQgbm90IHJlc3BvbmQgOihcbiIpOworCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlID0KKwkJCQkJRFZCX0NBX1NMT1RTVEFURV9JTlZBTElEOworCQkJZHZiX2NhX2VuNTAyMjFfdGhyZWFkX3VwZGF0ZV9kZWxheShjYSk7CisJCQlicmVhazsKKwkJfQorCisJCS8qZmxhZ3MgPSBjYS0+cHViLT5yZWFkX2NhbV9zdGF0dXMoY2EtPnB1Yiwgc2xvdCk7Ki8KKwkJZmxhZ3MgPSBTVEFUVVNSRUdfRlI7CisJCWlmIChmbGFncyAmIFNUQVRVU1JFR19GUikgeworCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlID0KKwkJCQkJRFZCX0NBX1NMT1RTVEFURV9MSU5LSU5JVDsKKwkJCWNhLT53YWtldXAgPSAxOworCQl9CisJCWJyZWFrOworCisJY2FzZSBEVkJfQ0FfU0xPVFNUQVRFX1dBSVRMSU5LSU5JVDoKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgY2EtPnNsb3RfaW5mb1tzbG90XS50aW1lb3V0KSkgeworCQkJcHJfZXJyb3IoImR2Yl9jYSBhZGFwdGVyICVkOiAiLAorCQkJCQljYS0+ZHZiZGV2LT5hZGFwdGVyLT5udW0pOworCQkJcHJfZXJyb3IoIkRWQiBDQU0gbGluayBpbml0aWFsaXNhdGlvbiBmYWlsZWQgOihcbiIpOworCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlID0KKwkJCQkJRFZCX0NBX1NMT1RTVEFURV9JTlZBTElEOworCQkJZHZiX2NhX2VuNTAyMjFfdGhyZWFkX3VwZGF0ZV9kZWxheShjYSk7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBEVkJfQ0FfU0xPVFNUQVRFX0xJTktJTklUOgorCQlpZiAoZHZiX2NhX2VuNTAyMjFfbGlua19pbml0KGNhLCBzbG90KSAhPSAwKSB7CisJCQkvKiB3ZSBuZWVkIHRoaXMgZXh0cmEgY2hlY2sgZm9yIGFubm95aW5nIGludGVyZmFjZXMKKwkJCSAgIGxpa2UgdGhlIGJ1ZGdldC1hdiAqLworCQkJaWYgKCghKGNhLT5mbGFncyAmIERWQl9DQV9FTjUwMjIxX0ZMQUdfSVJRX0NBTUNIQU5HRSkpCisJCQkJJiYgKGNhLT5wdWItPnBvbGxfc2xvdF9zdGF0dXMpKSB7CisJCQkJc3RhdHVzID0gY2EtPnB1Yi0+cG9sbF9zbG90X3N0YXR1cyhjYS0+cHViLAorCQkJCQkJc2xvdCwgMCk7CisJCQkJaWYgKCEoc3RhdHVzCisJCQkJCSYgRFZCX0NBX0VONTAyMjFfUE9MTF9DQU1fUFJFU0VOVCkpIHsKKwkJCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlID0KKwkJCQkJCQlEVkJfQ0FfU0xPVFNUQVRFX05PTkU7CisJCQkJCWR2Yl9jYV9lbjUwMjIxX3RocmVhZF91cGRhdGVfZGVsYXkoY2EpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWNhLT5zbG90X2luZm9bc2xvdF0udGltZW91dCA9CisJCQkJCWppZmZpZXMgKyAoSU5JVF9USU1FT1VUX1NFQ1MgKiBIWik7CisJCQljYS0+c2xvdF9pbmZvW3Nsb3RdLnNsb3Rfc3RhdGUgPQorCQkJCQlEVkJfQ0FfU0xPVFNUQVRFX1dBSVRMSU5LSU5JVDsKKwkJCWNhLT53YWtldXAgPSAxOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoY2EtPnNsb3RfaW5mb1tzbG90XS5yeF9idWZmZXIuZGF0YSA9PSBOVUxMKSB7CisJCQlyeGJ1ZiA9IHZtYWxsb2MoUlhfQlVGRkVSX1NJWkUpOworCQkJaWYgKHJ4YnVmID09IE5VTEwpIHsKKwkJCQlwcl9lcnJvcigiZHZiX2NhIGFkYXB0ZXIgJWQ6ICIsCisJCQkJCQljYS0+ZHZiZGV2LT5hZGFwdGVyLT5udW0pOworCQkJCXByX2Vycm9yKCJVbmFibGUgdG8gYWxsb2NhdGUgQ0FNIHJ4IGJ1ZmZlclxuIik7CisJCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlID0KKwkJCQkJCURWQl9DQV9TTE9UU1RBVEVfSU5WQUxJRDsKKwkJCQlkdmJfY2FfZW41MDIyMV90aHJlYWRfdXBkYXRlX2RlbGF5KGNhKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWR2Yl9yaW5nYnVmZmVyX2luaXQoJmNhLT5zbG90X2luZm9bc2xvdF0ucnhfYnVmZmVyLAorCQkJCQlyeGJ1ZiwgUlhfQlVGRkVSX1NJWkUpOworCQl9CisKKwkJY2EtPnB1Yi0+c2xvdF90c19lbmFibGUoY2EtPnB1Yiwgc2xvdCk7CisJCWNhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9zdGF0ZSA9IERWQl9DQV9TTE9UU1RBVEVfUlVOTklORzsKKwkJZHZiX2NhX2VuNTAyMjFfdGhyZWFkX3VwZGF0ZV9kZWxheShjYSk7CisJCWRwcmludGsoIiVkOiBEVkIgQ0FNIEluaXRpYWxpc2VkIHN1Y2Nlc3NmdWxseVxuIiwKKwkJY2EtPmR2YmRldi0+YWRhcHRlci0+bnVtKTsKKwkJYnJlYWs7CisKKwljYXNlIERWQl9DQV9TTE9UU1RBVEVfUlVOTklORzoKKwkJaWYgKCFjYS0+b3BlbikKKwkJCWJyZWFrOworCisJCXBrdGNvdW50ID0gMDsKKwkJd2hpbGUgKChzdGF0dXMgPSBkdmJfY2FfZW41MDIyMV9yZWFkX2RhdGEoY2EsIHNsb3QsIE5VTEwsIDApKQorCQkJPiAwKSB7CisJCQlpZiAoIWNhLT5vcGVuKQorCQkJCWJyZWFrOworCisJCQkvKiBpZiBhIENBTUNIQU5HRSBvY2N1cnJlZCBhdCBzb21lIHBvaW50LAorCQkJICAgZG8gbm90IGRvIGFueSBtb3JlIHByb2Nlc3Npbmcgb2YgdGhpcyBzbG90ICovCisJCQlpZiAoZHZiX2NhX2VuNTAyMjFfY2hlY2tfY2Ftc3RhdHVzKGNhLCBzbG90KSkgeworCQkJCS8qIHdlIGRvbnQgd2FudCB0byBzbGVlcCBvbiB0aGUgbmV4dCBpdGVyYXRpb24KKwkJCQkgICBzbyB3ZSBjYW4gaGFuZGxlIHRoZSBjYW0gY2hhbmdlKi8KKwkJCQljYS0+d2FrZXVwID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogY2hlY2sgaWYgd2UndmUgaGl0IG91ciBsaW1pdCB0aGlzIHRpbWUgKi8KKwkJCWlmICgrK3BrdGNvdW50ID49IE1BWF9SWF9QQUNLRVRTX1BFUl9JVEVSQVRJT04pIHsKKwkJCQkvKmRvbnQgc2xlZXA7CisJCQkJICB0aGVyZSBpcyBsaWtlbHkgdG8gYmUgbW9yZSBkYXRhIHRvIHJlYWQqLworCQkJCWNhLT53YWtldXAgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKworCW11dGV4X3VubG9jaygmY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X2xvY2spOworCXJldHVybiAwOworfQorCisKKy8qKgorICogS2VybmVsIHRocmVhZCB3aGljaCBtb25pdG9ycyBDQSBzbG90cyBmb3IgQ0FNIGNoYW5nZXMsCisgKiBhbmQgcGVyZm9ybXMgZGF0YSB0cmFuc2ZlcnMuCisgKi8KK3N0YXRpYyBpbnQgZHZiX2NhX2VuNTAyMjFfdGhyZWFkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSA9IGRhdGE7CisJaW50IHNsb3Q7CisKKwlkcHJpbnRrKCIgJXNcbiIsIF9fZnVuY19fKTsKKwkvKiBjaG9vc2UgdGhlIGNvcnJlY3QgaW5pdGlhbCBkZWxheSAqLworCWR2Yl9jYV9lbjUwMjIxX3RocmVhZF91cGRhdGVfZGVsYXkoY2EpOworCisJLyogbWFpbiBsb29wICovCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJLyogc2xlZXAgZm9yIGEgYml0ICovCisJCWlmICghY2EtPndha2V1cCkgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoY2EtPmRlbGF5KTsKKwkJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCisJCQkJcmV0dXJuIDA7CisJCX0KKwkJY2EtPndha2V1cCA9IDA7CisKKwkJLyogZ28gdGhyb3VnaCBhbGwgdGhlIHNsb3RzIHByb2Nlc3NpbmcgdGhlbSAqLworCQlmb3IgKHNsb3QgPSAwOyBzbG90IDwgY2EtPnNsb3RfY291bnQ7IHNsb3QrKykKKwkJCWR2Yl9jYV9lbjUwMjIxX3Nsb3RfcHJvY2VzcyhjYSwgc2xvdCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogRU41MDIyMSBJTyBpbnRlcmZhY2UgZnVuY3Rpb25zICovCisKKy8qKgorICogUmVhbCBpb2N0bCBpbXBsZW1lbnRhdGlvbi4KKyAqIE5PVEU6IENBX1NFTkRfTVNHL0NBX0dFVF9NU0cgaW9jdGxzIGhhdmUgdXNlcnNwYWNlIGJ1ZmZlcnMgcGFzc2VkIHRvIHRoZW0uCisgKgorICogQHBhcmFtIGlub2RlIElub2RlIGNvbmNlcm5lZC4KKyAqIEBwYXJhbSBmaWxlIEZpbGUgY29uY2VybmVkLgorICogQHBhcmFtIGNtZCBJT0NUTCBjb21tYW5kLgorICogQHBhcmFtIGFyZyBBc3NvY2lhdGVkIGFyZ3VtZW50LgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCA8MCBvbiBlcnJvci4KKyAqLworc3RhdGljIGludCBkdmJfY2FfZW41MDIyMV9pb19kb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICpwYXJnKQoreworCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSA9IGR2YmRldi0+cHJpdjsKKwlpbnQgZXJyID0gMDsKKwlpbnQgc2xvdDsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmNhLT5pb2N0bF9tdXRleCkpIHsKKwkJcHJfZXJyb3IoImNpIGxvY2sgaW50ZXJydXB0IGVycm9yXHJcbiIpOworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBDQV9SRVNFVDoKKwkJZHByaW50aygiY2kgcmVzZXQtLS1cclxuIik7CisJCWZvciAoc2xvdCA9IDA7IHNsb3QgPCBjYS0+c2xvdF9jb3VudDsgc2xvdCsrKSB7CisJCQltdXRleF9sb2NrKCZjYS0+c2xvdF9pbmZvW3Nsb3RdLnNsb3RfbG9jayk7CisJCQlpZiAoY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlCisJCQkJPT0gRFZCX0NBX1NMT1RTVEFURV9OT05FKQorCQkJCWdvdG8gbmV4dDsKKwkJCWR2Yl9jYV9lbjUwMjIxX3Nsb3Rfc2h1dGRvd24oY2EsIHNsb3QpOworCQkJaWYgKGNhLT5mbGFncworCQkJCSYgRFZCX0NBX0VONTAyMjFfRkxBR19JUlFfQ0FNQ0hBTkdFKQorCQkJCWR2Yl9jYV9lbjUwMjIxX2NpbWF4X2NhbWNoYW5nZV9pcnEoCisJCQkJCWNhLT5wdWIsCisJCQkJCXNsb3QsCisJCQkJCURWQl9DQV9FTjUwMjIxX0NBTUNIQU5HRV9JTlNFUlRFRCk7CituZXh0OgorCQkJbXV0ZXhfdW5sb2NrKCZjYS0+c2xvdF9pbmZvW3Nsb3RdLnNsb3RfbG9jayk7CisJCX0KKwkJY2EtPm5leHRfcmVhZF9zbG90ID0gMDsKKwkJZHZiX2NhX2VuNTAyMjFfdGhyZWFkX3dha2V1cChjYSk7CisJCWJyZWFrOworCisJY2FzZSBDQV9HRVRfQ0FQOiB7CisJCXN0cnVjdCBjYV9jYXBzICpjYXBzID0gcGFyZzsKKworCQljYXBzLT5zbG90X251bSA9IGNhLT5zbG90X2NvdW50OworCQljYXBzLT5zbG90X3R5cGUgPSBDQV9DSV9MSU5LOworCQljYXBzLT5kZXNjcl9udW0gPSAwOworCQljYXBzLT5kZXNjcl90eXBlID0gMDsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBDQV9HRVRfU0xPVF9JTkZPOiB7CisJCXN0cnVjdCBjYV9zbG90X2luZm8gKmluZm8gPSBwYXJnOworCisJCWlmICgoaW5mby0+bnVtID4gY2EtPnNsb3RfY291bnQpIHx8IChpbmZvLT5udW0gPCAwKSkgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCXByX2Vycm9yKCJpbmZvIG51bSBlcnJvciA6JWRcclxuIiwgaW5mby0+bnVtKTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCisJCWluZm8tPnR5cGUgPSBDQV9DSV9MSU5LOworCQlpbmZvLT5mbGFncyA9IDA7CisJCWlmICgoY2EtPnNsb3RfaW5mb1tpbmZvLT5udW1dLnNsb3Rfc3RhdGUKKwkJCQkhPSBEVkJfQ0FfU0xPVFNUQVRFX05PTkUpCisJCQkmJiAoY2EtPnNsb3RfaW5mb1tpbmZvLT5udW1dLnNsb3Rfc3RhdGUKKwkJCQkhPSBEVkJfQ0FfU0xPVFNUQVRFX0lOVkFMSUQpKSB7CisJCQlpbmZvLT5mbGFncyA9IENBX0NJX01PRFVMRV9QUkVTRU5UOworCQl9CisJCWlmIChjYS0+c2xvdF9pbmZvW2luZm8tPm51bV0uc2xvdF9zdGF0ZQorCQkJCT09IERWQl9DQV9TTE9UU1RBVEVfUlVOTklORykgeworCQkJaW5mby0+ZmxhZ3MgfD0gQ0FfQ0lfTU9EVUxFX1JFQURZOworCQl9CisJCWJyZWFrOworCX0KKworCWRlZmF1bHQ6CisJICAgIHByX2Vycm9yKCJJbnZhbGlkIGNtZCA6JWRcclxuIiwgY21kKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmY2EtPmlvY3RsX211dGV4KTsKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgZHZiX3VzZXJjb3B5X18oc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLAorCQkgICBpbnQgKCpmdW5jKShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKSkKK3sKKyAgY2hhcgkgIHNidWZbMTI4XTsKKyAgdm9pZAkgICptYnVmID0gTlVMTDsKKyAgdm9pZAkgICpwYXJnID0gTlVMTDsKKyAgaW50CSAgZXJyICA9IC1FSU5WQUw7CisKKyAgLyogIENvcHkgYXJndW1lbnRzIGludG8gdGVtcCBrZXJuZWwgYnVmZmVyICAqLworICBzd2l0Y2ggKF9JT0NfRElSKGNtZCkpIHsKKyAgY2FzZSBfSU9DX05PTkU6CisJICAvKgorCSAgICogRm9yIHRoaXMgY29tbWFuZCwgdGhlIHBvaW50ZXIgaXMgYWN0dWFsbHkgYW4gaW50ZWdlcgorCSAgICogYXJndW1lbnQuCisJICAgKi8KKwkgIHBhcmcgPSAodm9pZCAqKSBhcmc7CisJICBicmVhazsKKyAgY2FzZSBfSU9DX1JFQUQ6IC8qIHNvbWUgdjRsIGlvY3RscyBhcmUgbWFya2VkIHdyb25nIC4uLiAqLworICBjYXNlIF9JT0NfV1JJVEU6CisgIGNhc2UgKF9JT0NfV1JJVEUgfCBfSU9DX1JFQUQpOgorCSAgaWYgKF9JT0NfU0laRShjbWQpIDw9IHNpemVvZihzYnVmKSkgeworCQkgIHBhcmcgPSBzYnVmOworCSAgfSBlbHNlIHsKKwkJICAvKiB0b28gYmlnIHRvIGFsbG9jYXRlIGZyb20gc3RhY2sgKi8KKwkJICBtYnVmID0ga21hbGxvYyhfSU9DX1NJWkUoY21kKSwgR0ZQX0tFUk5FTCk7CisJCSAgaWYgKE5VTEwgPT0gbWJ1ZikKKwkJCSAgcmV0dXJuIC1FTk9NRU07CisJCSAgcGFyZyA9IG1idWY7CisJICB9CisKKwkgIGVyciA9IC1FRkFVTFQ7CisJICBpZiAoY29weV9mcm9tX3VzZXIocGFyZywgKHZvaWQgX191c2VyICopYXJnLCBfSU9DX1NJWkUoY21kKSkpCisJCSAgZ290byBvdXQ7CisJICBicmVhazsKKyAgfQorCisgIC8qIGNhbGwgZHJpdmVyICovCisgIGlmICgoZXJyID0gZnVuYyhmaWxlLCBjbWQsIHBhcmcpKSA9PSAtRU5PSU9DVExDTUQpCisJICBlcnIgPSAtRU5PVFRZOworCisgIGlmIChlcnIgPCAwKQorCSAgZ290byBvdXQ7CisKKyAgLyogIENvcHkgcmVzdWx0cyBpbnRvIHVzZXIgYnVmZmVyICAqLworICBzd2l0Y2ggKF9JT0NfRElSKGNtZCkpCisgIHsKKyAgY2FzZSBfSU9DX1JFQUQ6CisgIGNhc2UgKF9JT0NfV1JJVEUgfCBfSU9DX1JFQUQpOgorCSAgaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIHBhcmcsIF9JT0NfU0laRShjbWQpKSkKKwkJICBlcnIgPSAtRUZBVUxUOworCSAgYnJlYWs7CisgIH0KKworb3V0OgorICBrZnJlZShtYnVmKTsKKyAgcmV0dXJuIGVycjsKK30KKworCisKKy8qKgorICogV3JhcHBlciBmb3IgaW9jdGwgaW1wbGVtZW50YXRpb24uCisgKgorICogQHBhcmFtIGlub2RlIElub2RlIGNvbmNlcm5lZC4KKyAqIEBwYXJhbSBmaWxlIEZpbGUgY29uY2VybmVkLgorICogQHBhcmFtIGNtZCBJT0NUTCBjb21tYW5kLgorICogQHBhcmFtIGFyZyBBc3NvY2lhdGVkIGFyZ3VtZW50LgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCA8MCBvbiBlcnJvci4KKyAqLworc3RhdGljIGxvbmcgZHZiX2NhX2VuNTAyMjFfaW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiBkdmJfdXNlcmNvcHlfXyhmaWxlLCBjbWQsIGFyZywgZHZiX2NhX2VuNTAyMjFfaW9fZG9faW9jdGwpOworfQorCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2Ygd3JpdGUoKSBzeXNjYWxsLgorICoKKyAqIEBwYXJhbSBmaWxlIEZpbGUgc3RydWN0dXJlLgorICogQHBhcmFtIGJ1ZiBTb3VyY2UgYnVmZmVyLgorICogQHBhcmFtIGNvdW50IFNpemUgb2Ygc291cmNlIGJ1ZmZlci4KKyAqIEBwYXJhbSBwcG9zIFBvc2l0aW9uIGluIGZpbGUgKGlnbm9yZWQpLgorICoKKyAqIEByZXR1cm4gTnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIDwwIG9uIGVycm9yLgorICovCitzdGF0aWMgc3NpemVfdCBkdmJfY2FfZW41MDIyMV9pb193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCWNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSA9IGR2YmRldi0+cHJpdjsKKwl1OCBzbG90LCBjb25uZWN0aW9uX2lkOworCWludCBzdGF0dXM7CisJdTggKmZyYWdidWYgPSBjYS0+d2J1ZjsKKwlpbnQgZnJhZ3BvcyA9IDA7CisJaW50IGZyYWdsZW47CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCB3cml0dGVuOworCisJLyogZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsgKi8KKworCS8qIEluY29taW5nIHBhY2tldCBoYXMgYSAyIGJ5dGUgaGVhZGVyLgorCSAgIGhkclswXSA9IHNsb3RfaWQsIGhkclsxXSA9IGNvbm5lY3Rpb25faWQgKi8KKwlpZiAoY291bnQgPCAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGV4dHJhY3Qgc2xvdCAmIGNvbm5lY3Rpb24gaWQgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJnNsb3QsIGJ1ZiwgMSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcigmY29ubmVjdGlvbl9pZCwgYnVmICsgMSwgMSkpCisJCXJldHVybiAtRUZBVUxUOworCWJ1ZiArPSAyOworCWNvdW50IC09IDI7CisKKwlpZiAoc2xvdCA+PSBjYS0+c2xvdF9jb3VudCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJLyogY2hlY2sgaWYgdGhlIHNsb3QgaXMgYWN0dWFsbHkgcnVubmluZyAqLworCWlmIChjYS0+c2xvdF9pbmZvW3Nsb3RdLnNsb3Rfc3RhdGUgIT0gRFZCX0NBX1NMT1RTVEFURV9SVU5OSU5HKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGZyYWdtZW50IHRoZSBwYWNrZXRzICYgc3RvcmUgaW4gdGhlIGJ1ZmZlciAqLworCXdoaWxlIChmcmFncG9zIDwgY291bnQpIHsKKwkJZnJhZ2xlbiA9IGNhLT5zbG90X2luZm9bc2xvdF0ubGlua19idWZfc2l6ZSAtIDI7CisJCWlmIChmcmFnbGVuIDwgMCkKKwkJCWJyZWFrOworCQlpZiAoZnJhZ2xlbiA+IGR2Yl9jYV9lbjUwMjIxX2xpbmtfc2l6ZSAtIDIpCisJCQlmcmFnbGVuID0gZHZiX2NhX2VuNTAyMjFfbGlua19zaXplIC0gMjsKKwkJaWYgKChjb3VudCAtIGZyYWdwb3MpIDwgZnJhZ2xlbikKKwkJCWZyYWdsZW4gPSBjb3VudCAtIGZyYWdwb3M7CisKKwkJZnJhZ2J1ZlswXSA9IGNvbm5lY3Rpb25faWQ7CisJCWZyYWdidWZbMV0gPSAoKGZyYWdwb3MgKyBmcmFnbGVuKSA8IGNvdW50KSA/IDB4ODAgOiAweDAwOworCQlzdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihmcmFnYnVmICsgMiwgYnVmICsgZnJhZ3BvcywgZnJhZ2xlbik7CisJCWlmIChzdGF0dXMpIHsKKwkJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCQlnb3RvIGV4aXQ7CisJCX0KKworCQl0aW1lb3V0ID0gamlmZmllcyArIEhaIC8gMjsKKwkJd3JpdHRlbiA9IDA7CisJCXdoaWxlICghdGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJLyogY2hlY2sgdGhlIENBTSBoYXNuJ3QgYmVlbiByZW1vdmVkL3Jlc2V0CisJCQkgICBpbiB0aGUgbWVhbnRpbWUgKi8KKwkJCWlmIChjYS0+c2xvdF9pbmZvW3Nsb3RdLnNsb3Rfc3RhdGUKKwkJCQkJIT0gRFZCX0NBX1NMT1RTVEFURV9SVU5OSU5HKSB7CisJCQkJc3RhdHVzID0gLUVJTzsKKwkJCQlnb3RvIGV4aXQ7CisJCQl9CisKKwkJCW11dGV4X2xvY2soJmNhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9sb2NrKTsKKwkJCXN0YXR1cyA9IGR2Yl9jYV9lbjUwMjIxX3dyaXRlX2RhdGEoY2EsCisJCQkJCXNsb3QsIGZyYWdidWYsIGZyYWdsZW4gKyAyKTsKKwkJCW11dGV4X3VubG9jaygmY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X2xvY2spOworCQkJaWYgKHN0YXR1cyA9PSAoZnJhZ2xlbiArIDIpKSB7CisJCQkJd3JpdHRlbiA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc3RhdHVzICE9IC1FQUdBSU4pCisJCQkJZ290byBleGl0OworCisJCQltc2xlZXAoMjApOworCQl9CisJCWlmICghd3JpdHRlbikgeworCQkJc3RhdHVzID0gLUVJTzsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCisJCWZyYWdwb3MgKz0gZnJhZ2xlbjsKKwl9CisJc3RhdHVzID0gY291bnQgKyAyOworCitleGl0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKworLyoqCisgKiBDb25kaXRpb24gZm9yIHdha2luZyB1cCBpbiBkdmJfY2FfZW41MDIyMV9pb19yZWFkX2NvbmRpdGlvbgorICovCitzdGF0aWMgaW50IGR2Yl9jYV9lbjUwMjIxX2lvX3JlYWRfY29uZGl0aW9uKHN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqY2EsCisJCQkJCSAgICBpbnQgKnJlc3VsdCwgaW50ICpfc2xvdCkKK3sKKwlpbnQgc2xvdDsKKwlpbnQgc2xvdF9jb3VudCA9IDA7CisJaW50IGlkeDsKKwlzaXplX3QgZnJhZ2xlbjsKKwlpbnQgY29ubmVjdGlvbl9pZCA9IC0xOworCWludCBmb3VuZCA9IDA7CisJdTggaGRyWzJdOworCisJc2xvdCA9IGNhLT5uZXh0X3JlYWRfc2xvdDsKKwl3aGlsZSAoKHNsb3RfY291bnQgPCBjYS0+c2xvdF9jb3VudCkgJiYgKCFmb3VuZCkpIHsKKwkJaWYgKGNhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9zdGF0ZSAhPSBEVkJfQ0FfU0xPVFNUQVRFX1JVTk5JTkcpCisJCQlnb3RvIG5leHRzbG90OworCisJCWlmIChjYS0+c2xvdF9pbmZvW3Nsb3RdLnJ4X2J1ZmZlci5kYXRhID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKyNpZmRlZiBSRUFEX0xQRFVfUEtUCisJCWlmIChjYS0+c2xvdF9pbmZvW3Nsb3RdLnJ4X29mZnNldCAhPSAwKSB7CisJCQkqX3Nsb3QgPSBzbG90OworCQkJcmV0dXJuIDE7CisJCX0KKyNlbmRpZgorCQlpZHggPSBkdmJfcmluZ2J1ZmZlcl9wa3RfbmV4dCgmY2EtPnNsb3RfaW5mb1tzbG90XS5yeF9idWZmZXIsCisJCQkJLTEsICZmcmFnbGVuKTsKKwkJd2hpbGUgKGlkeCAhPSAtMSkgeworCQkJZHZiX3JpbmdidWZmZXJfcGt0X3JlYWQoJmNhLT5zbG90X2luZm9bc2xvdF0ucnhfYnVmZmVyLAorCQkJCQlpZHgsIDAsIGhkciwgMik7CisJCQlpZiAoY29ubmVjdGlvbl9pZCA9PSAtMSkKKwkJCQljb25uZWN0aW9uX2lkID0gaGRyWzBdOworCQkJaWYgKChoZHJbMF0gPT0gY29ubmVjdGlvbl9pZCkKKyNpZm5kZWYgUkVBRF9MUERVX1BLVAorCQkJCSYmICgoaGRyWzFdICYgMHg4MCkgPT0gMCkKKyNlbmRpZgorCQkJKSB7CisJCQkJKl9zbG90ID0gc2xvdDsKKwkJCQlmb3VuZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlkeCA9IGR2Yl9yaW5nYnVmZmVyX3BrdF9uZXh0KAorCQkJCSZjYS0+c2xvdF9pbmZvW3Nsb3RdLnJ4X2J1ZmZlciwKKwkJCQlpZHgsCisJCQkJJmZyYWdsZW4pOworCQl9CisKK25leHRzbG90OgorCQlzbG90ID0gKHNsb3QgKyAxKSAlIGNhLT5zbG90X2NvdW50OworCQlzbG90X2NvdW50Kys7CisJfQorCisJY2EtPm5leHRfcmVhZF9zbG90ID0gc2xvdDsKKwlyZXR1cm4gZm91bmQ7Cit9CisKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiByZWFkKCkgc3lzY2FsbC4KKyAqCisgKiBAcGFyYW0gZmlsZSBGaWxlIHN0cnVjdHVyZS4KKyAqIEBwYXJhbSBidWYgRGVzdGluYXRpb24gYnVmZmVyLgorICogQHBhcmFtIGNvdW50IFNpemUgb2YgZGVzdGluYXRpb24gYnVmZmVyLgorICogQHBhcmFtIHBwb3MgUG9zaXRpb24gaW4gZmlsZSAoaWdub3JlZCkuCisgKgorICogQHJldHVybiBOdW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgPDAgb24gZXJyb3IuCisgKi8KK3N0YXRpYyBzc2l6ZV90IGR2Yl9jYV9lbjUwMjIxX2lvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKmNhID0gZHZiZGV2LT5wcml2OworCWludCBzdGF0dXM7CisJaW50IHJlc3VsdCA9IDA7CisJdTggaGRyWzJdOworCWludCBzbG90OworCWludCBjb25uZWN0aW9uX2lkID0gLTE7CisJc2l6ZV90IGlkeCwgaWR4MjsKKwlpbnQgbGFzdF9mcmFnbWVudCA9IDA7CisJc2l6ZV90IGZyYWdsZW47CisJaW50IHBrdGxlbjsKKwlpbnQgZGlzcG9zZSA9IDA7CisKKyNpZmRlZiBSRUFEX0xQRFVfUEtUCisJaW50IG9mZnNldDsKKwl1OCBmbGFnID0gMDsKKyNlbmRpZgorCisJLyogZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsgKi8KKworCS8qIE91dGdvaW5nIHBhY2tldCBoYXMgYSAyIGJ5dGUgaGVhZGVyLgorCSAgIGhkclswXSA9IHNsb3RfaWQsIGhkclsxXSA9IGNvbm5lY3Rpb25faWQgKi8KKwlpZiAoY291bnQgPCAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHdhaXQgZm9yIHNvbWUgZGF0YSAqLworCXN0YXR1cyA9IGR2Yl9jYV9lbjUwMjIxX2lvX3JlYWRfY29uZGl0aW9uKGNhLCAmcmVzdWx0LCAmc2xvdCk7CisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCS8qIGlmIHdlJ3JlIGluIG5vbmJsb2NraW5nIG1vZGUsIGV4aXQgaW1tZWRpYXRlbHkgKi8KKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJcmV0dXJuIC1FV09VTERCTE9DSzsKKworCQkvKiB3YWl0IGZvciBzb21lIGRhdGEgKi8KKwkJc3RhdHVzID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGNhLT53YWl0X3F1ZXVlLAorCQkJCQkgIGR2Yl9jYV9lbjUwMjIxX2lvX3JlYWRfY29uZGl0aW9uCisJCQkJCSAgKGNhLCAmcmVzdWx0LCAmc2xvdCkpOworCX0KKwlpZiAoKHN0YXR1cyA8IDApIHx8IChyZXN1bHQgPCAwKSkgeworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlpZHggPSBkdmJfcmluZ2J1ZmZlcl9wa3RfbmV4dCgmY2EtPnNsb3RfaW5mb1tzbG90XS5yeF9idWZmZXIsCisJCQktMSwgJmZyYWdsZW4pOworCXBrdGxlbiA9IDI7CisJZG8geworCQlpZiAoaWR4ID09IC0xKSB7CisJCQlwcl9lcnJvcigiZHZiX2NhIGFkYXB0ZXIgJWQ6ICIsCisJCQkJY2EtPmR2YmRldi0+YWRhcHRlci0+bnVtKTsKKwkJCXByX2Vycm9yKCJCVUc6IHJlYWQgcGFja2V0IGVuZGVkIik7CisJCQlwcl9lcnJvcigiYmVmb3JlIGxhc3RfZnJhZ21lbnQgZW5jb3VudGVyZWRcbiIpOworCQkJc3RhdHVzID0gLUVJTzsKKwkJCWdvdG8gZXhpdDsKKwkJfQorI2lmZGVmIFJFQURfTFBEVV9QS1QKKwkJb2Zmc2V0ID0gMiArIGNhLT5zbG90X2luZm9bc2xvdF0ucnhfb2Zmc2V0OworI2VuZGlmCisJCWR2Yl9yaW5nYnVmZmVyX3BrdF9yZWFkKCZjYS0+c2xvdF9pbmZvW3Nsb3RdLnJ4X2J1ZmZlciwKKwkJCQlpZHgsIDAsIGhkciwgMik7CisJCWlmIChjb25uZWN0aW9uX2lkID09IC0xKQorCQkJY29ubmVjdGlvbl9pZCA9IGhkclswXTsKKyNpZmRlZiBSRUFEX0xQRFVfUEtUCisJCWZsYWcgPSBoZHJbMV07CisJCWlmIChoZHJbMF0gPT0gY29ubmVjdGlvbl9pZCkgeworCQkJaWYgKHBrdGxlbiA8IGNvdW50KSB7CisJCQkJaWYgKChwa3RsZW4gKyBmcmFnbGVuIC0gb2Zmc2V0KSA+IChjb3VudCAtIDIpKSB7CisJCQkJCWZyYWdsZW4gPSAoY291bnQgLSAyKSAtIHBrdGxlbjsKKwkJCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5yeF9vZmZzZXQgKz0KKwkJCQkJCQkJCWZyYWdsZW47CisJCQkJCS8qIG1vcmUgZGF0YSBmb3IgdXNlciwKKwkJCQkJICAgYnV0IGNhbm5vdCBzZW5kLAorCQkJCQkgICBzbyBmb3JjZSByZXR1cm4gdG8gdXNlciwKKwkJCQkJICAgcmF0aGVyIHRoYW4gZGlzcG9zZSBvZiBpdCAqLworCQkJCQlmbGFnIHw9IDB4ODA7CisJCQkJfSBlbHNlIHsKKwkJCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5yeF9vZmZzZXQgPSAwOworCQkJCQlmcmFnbGVuIC09IG9mZnNldDsKKwkJCQkJZGlzcG9zZSA9IDE7CisJCQkJfQorCisJCQkJc3RhdHVzID0gZHZiX3JpbmdidWZmZXJfcGt0X3JlYWRfdXNlcigKKwkJCQkJJmNhLT5zbG90X2luZm9bc2xvdF0ucnhfYnVmZmVyLAorCQkJCQlpZHgsCisJCQkJCW9mZnNldCwKKwkJCQkJYnVmICsgcGt0bGVuICsgMiwKKwkJCQkJZnJhZ2xlbik7CisJCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJCWdvdG8gZXhpdDsKKwkJCQlwa3RsZW4gKz0gZnJhZ2xlbjsKKwkJCX0KKworCQkJbGFzdF9mcmFnbWVudCA9IDE7CisJCX0KKyNlbHNlCisJCWlmIChoZHJbMF0gPT0gY29ubmVjdGlvbl9pZCkgeworCQkJaWYgKHBrdGxlbiA8IGNvdW50KSB7CisJCQkJaWYgKChwa3RsZW4gKyBmcmFnbGVuIC0gMikgPiBjb3VudCkKKwkJCQkJZnJhZ2xlbiA9IGNvdW50IC0gcGt0bGVuOworCQkJCWVsc2UKKwkJCQkJZnJhZ2xlbiAtPSAyOworCisJCQkJc3RhdHVzID0gZHZiX3JpbmdidWZmZXJfcGt0X3JlYWRfdXNlcigKKwkJCQkJJmNhLT5zbG90X2luZm9bc2xvdF0ucnhfYnVmZmVyLAorCQkJCQlpZHgsCisJCQkJCTIsCisJCQkJCWJ1ZiArIHBrdGxlbiwKKwkJCQkJZnJhZ2xlbik7CisJCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJCWdvdG8gZXhpdDsKKwkJCQlwa3RsZW4gKz0gZnJhZ2xlbjsKKwkJCX0KKworCQkJaWYgKChoZHJbMV0gJiAweDgwKSA9PSAwKQorCQkJCWxhc3RfZnJhZ21lbnQgPSAxOworCQkJZGlzcG9zZSA9IDE7CisJCX0KKyNlbmRpZgorCQlpZHgyID0gZHZiX3JpbmdidWZmZXJfcGt0X25leHQoJmNhLT5zbG90X2luZm9bc2xvdF0ucnhfYnVmZmVyLAorCQkJCWlkeCwgJmZyYWdsZW4pOworCQlpZiAoZGlzcG9zZSkKKwkJCWR2Yl9yaW5nYnVmZmVyX3BrdF9kaXNwb3NlKAorCQkJCSZjYS0+c2xvdF9pbmZvW3Nsb3RdLnJ4X2J1ZmZlciwgaWR4KTsKKwkJaWR4ID0gaWR4MjsKKwkJZGlzcG9zZSA9IDA7CisJfSB3aGlsZSAoIWxhc3RfZnJhZ21lbnQpOworCisJaGRyWzBdID0gc2xvdDsKKwloZHJbMV0gPSBjb25uZWN0aW9uX2lkOworCXN0YXR1cyA9IGNvcHlfdG9fdXNlcihidWYsIGhkciwgMik7CisJaWYgKHN0YXR1cykgeworCQlzdGF0dXMgPSAtRUZBVUxUOworCQlnb3RvIGV4aXQ7CisJfQorCXN0YXR1cyA9IHBrdGxlbjsKKworI2lmZGVmIFJFQURfTFBEVV9QS1QKKwloZHJbMF0gPSBmbGFnOworCWhkclsxXSA9IDA7CisKKwlzdGF0dXMgPSBjb3B5X3RvX3VzZXIoYnVmICsgMiwgaGRyLCAyKTsKKwlpZiAoc3RhdHVzKSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCWdvdG8gZXhpdDsKKwl9CisJc3RhdHVzID0gcGt0bGVuICsgMjsKKyNlbmRpZgorZXhpdDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgZmlsZSBvcGVuIHN5c2NhbGwuCisgKgorICogQHBhcmFtIGlub2RlIElub2RlIGNvbmNlcm5lZC4KKyAqIEBwYXJhbSBmaWxlIEZpbGUgY29uY2VybmVkLgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCA8MCBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGR2Yl9jYV9lbjUwMjIxX2lvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKmNhID0gZHZiZGV2LT5wcml2OworCWludCBlcnI7CisJaW50IGk7CisKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOworCisJaWYgKCF0cnlfbW9kdWxlX2dldChjYS0+cHViLT5vd25lcikpCisJCXJldHVybiAtRUlPOworCisJZXJyID0gZHZiX2dlbmVyaWNfb3Blbihpbm9kZSwgZmlsZSk7CisJaWYgKGVyciA8IDApIHsKKwkJbW9kdWxlX3B1dChjYS0+cHViLT5vd25lcik7CisJCXJldHVybiBlcnI7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNhLT5zbG90X2NvdW50OyBpKyspIHsKKworCQlpZiAoY2EtPnNsb3RfaW5mb1tpXS5zbG90X3N0YXRlID09IERWQl9DQV9TTE9UU1RBVEVfUlVOTklORykgeworCQkJaWYgKGNhLT5zbG90X2luZm9baV0ucnhfYnVmZmVyLmRhdGEgIT0gTlVMTCkgeworCQkJCS8qIGl0IGlzIHNhZmUgdG8gY2FsbCB0aGlzIGhlcmUgd2l0aG91dCBsb2NrcworCQkJCSAgIGJlY2F1c2UgY2EtPm9wZW4gPT0gMC4KKwkJCQkgICBEYXRhIGlzIG5vdCByZWFkIGluIHRoaXMgY2FzZSAqLworCQkJCWR2Yl9yaW5nYnVmZmVyX2ZsdXNoKAorCQkJCQkmY2EtPnNsb3RfaW5mb1tpXS5yeF9idWZmZXIpOworCQkJfQorCQl9CisJfQorCisJY2EtPm9wZW4gPSAxOworCWR2Yl9jYV9lbjUwMjIxX3RocmVhZF91cGRhdGVfZGVsYXkoY2EpOworCWR2Yl9jYV9lbjUwMjIxX3RocmVhZF93YWtldXAoY2EpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBmaWxlIGNsb3NlIHN5c2NhbGwuCisgKgorICogQHBhcmFtIGlub2RlIElub2RlIGNvbmNlcm5lZC4KKyAqIEBwYXJhbSBmaWxlIEZpbGUgY29uY2VybmVkLgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCA8MCBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGR2Yl9jYV9lbjUwMjIxX2lvX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKmNhID0gZHZiZGV2LT5wcml2OworCWludCBlcnI7CisKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOworCisJLyogbWFyayB0aGUgQ0EgZGV2aWNlIGFzIGNsb3NlZCAqLworCWNhLT5vcGVuID0gMDsKKwlkdmJfY2FfZW41MDIyMV90aHJlYWRfdXBkYXRlX2RlbGF5KGNhKTsKKworCWVyciA9IGR2Yl9nZW5lcmljX3JlbGVhc2UoaW5vZGUsIGZpbGUpOworCisJbW9kdWxlX3B1dChjYS0+cHViLT5vd25lcik7CisKKwlyZXR1cm4gZXJyOworfQorCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgcG9sbCgpIHN5c2NhbGwuCisgKgorICogQHBhcmFtIGZpbGUgRmlsZSBjb25jZXJuZWQuCisgKiBAcGFyYW0gd2FpdCBwb2xsIHdhaXQgdGFibGUuCisgKgorICogQHJldHVybiBTdGFuZGFyZCBwb2xsIG1hc2suCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZHZiX2NhX2VuNTAyMjFfaW9fcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqY2EgPSBkdmJkZXYtPnByaXY7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCWludCBzbG90OworCWludCByZXN1bHQgPSAwOworCisJLyogZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsgKi8KKworCWlmIChkdmJfY2FfZW41MDIyMV9pb19yZWFkX2NvbmRpdGlvbihjYSwgJnJlc3VsdCwgJnNsb3QpID09IDEpCisJCW1hc2sgfD0gUE9MTElOOworCisJLyogaWYgdGhlcmUgaXMgc29tZXRoaW5nLCByZXR1cm4gbm93ICovCisJaWYgKG1hc2spCisJCXJldHVybiBtYXNrOworCisJLyogd2FpdCBmb3Igc29tZXRoaW5nIHRvIGhhcHBlbiAqLworCXBvbGxfd2FpdChmaWxlLCAmY2EtPndhaXRfcXVldWUsIHdhaXQpOworCisJaWYgKGR2Yl9jYV9lbjUwMjIxX2lvX3JlYWRfY29uZGl0aW9uKGNhLCAmcmVzdWx0LCAmc2xvdCkgPT0gMSkKKwkJbWFzayB8PSBQT0xMSU47CisKKwlyZXR1cm4gbWFzazsKK30KK0VYUE9SVF9TWU1CT0woZHZiX2NhX2VuNTAyMjFfY2ltYXhfaW5pdCk7CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdGF0aWMgbG9uZyBkdmJfY2FfZW41MDIyMV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZ3MpCit7CisJdW5zaWduZWQgbG9uZyByZXQ7CisKKwlhcmdzID0gKHVuc2lnbmVkIGxvbmcpY29tcGF0X3B0cihhcmdzKTsKKwlyZXQgPSBkdmJfY2FfZW41MDIyMV9pb19pb2N0bChmaWxwLCBjbWQsIGFyZ3MpOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGR2Yl9jYV9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5yZWFkID0gZHZiX2NhX2VuNTAyMjFfaW9fcmVhZCwKKwkud3JpdGUgPSBkdmJfY2FfZW41MDIyMV9pb193cml0ZSwKKwkudW5sb2NrZWRfaW9jdGwgPSBkdmJfY2FfZW41MDIyMV9pb19pb2N0bCwKKwkub3BlbiA9IGR2Yl9jYV9lbjUwMjIxX2lvX29wZW4sCisJLnJlbGVhc2UgPSBkdmJfY2FfZW41MDIyMV9pb19yZWxlYXNlLAorCS5wb2xsID0gZHZiX2NhX2VuNTAyMjFfaW9fcG9sbCwKKwkubGxzZWVrID0gbm9vcF9sbHNlZWssCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwJPSBkdmJfY2FfZW41MDIyMV9jb21wYXRfaW9jdGwsCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2RldmljZSBkdmJkZXZfY2EgPSB7CisJLnByaXYgPSBOVUxMLAorCS51c2VycyA9IDEsCisJLnJlYWRlcnMgPSAxLAorCS53cml0ZXJzID0gMSwKKwkuZm9wcyA9ICZkdmJfY2FfZm9wcywKK307CisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qIEluaXRpYWxpc2F0aW9uL3NodXRkb3duIGZ1bmN0aW9ucyAqLworCisKKy8qKgorICogSW5pdGlhbGlzZSBhIG5ldyBEVkIgQ0EgRU41MDIyMSBDSU1BWCBpbnRlcmZhY2UgZGV2aWNlLgorICoKKyAqIEBwYXJhbSBkdmJfYWRhcHRlciBEVkIgYWRhcHRlciB0byBhdHRhY2ggdGhlIG5ldyBDQSBkZXZpY2UgdG8uCisgKiBAcGFyYW0gY2EgVGhlIGR2Yl9jYSBpbnN0YW5jZS4KKyAqIEBwYXJhbSBmbGFncyBGbGFncyBkZXNjcmliaW5nIHRoZSBDQSBkZXZpY2UgKERWQl9DQV9GTEFHXyopLgorICogQHBhcmFtIHNsb3RfY291bnQgTnVtYmVyIG9mIHNsb3RzIHN1cHBvcnRlZC4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcywgbm9uemVybyBvbiBmYWlsdXJlCisgKi8KK2ludCBkdmJfY2FfZW41MDIyMV9jaW1heF9pbml0KHN0cnVjdCBkdmJfYWRhcHRlciAqZHZiX2FkYXB0ZXIsCisJCQlzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltYXggKnB1YmNhLAorCQkJaW50IGZsYWdzLCBpbnQgc2xvdF9jb3VudCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqY2EgPSBOVUxMOworCWludCBpOworCisJZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsKKworCWlmIChzbG90X2NvdW50IDwgMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBpbml0aWFsaXNlIHRoZSBzeXN0ZW0gZGF0YSAqLworCWNhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGR2Yl9jYV9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNhID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjsKKwl9CisJY2EtPnB1YiA9IHB1YmNhOworCWNhLT5mbGFncyA9IGZsYWdzOworCWNhLT5zbG90X2NvdW50ID0gc2xvdF9jb3VudDsKKwljYS0+c2xvdF9pbmZvID0KKwkJa2NhbGxvYyhzbG90X2NvdW50LCBzaXplb2Yoc3RydWN0IGR2Yl9jYV9zbG90KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNhLT5zbG90X2luZm8gPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0KKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYS0+d2FpdF9xdWV1ZSk7CisJY2EtPm9wZW4gPSAwOworCWNhLT53YWtldXAgPSAwOworCWNhLT5uZXh0X3JlYWRfc2xvdCA9IDA7CisJY2EtPnJidWYgPSBrY2FsbG9jKEhPU1RfTElOS19CVUZfU0laRSwgMSwgR0ZQX0tFUk5FTCk7CisJY2EtPndidWYgPSBrY2FsbG9jKEhPU1RfTElOS19CVUZfU0laRSwgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNhLT5yYnVmID09IE5VTEwgfHwgY2EtPndidWYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0KKwlwdWJjYS0+cHJpdmF0ZSA9IGNhOworCisJLyogcmVnaXN0ZXIgdGhlIERWQiBkZXZpY2UgKi8KKwlyZXQgPSBkdmJfcmVnaXN0ZXJfZGV2aWNlKGR2Yl9hZGFwdGVyLAorCQkJJmNhLT5kdmJkZXYsICZkdmJkZXZfY2EsIGNhLCBEVkJfREVWSUNFX0NBLCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJLyogbm93IGluaXRpYWxpc2UgZWFjaCBzbG90ICovCisJZm9yIChpID0gMDsgaSA8IHNsb3RfY291bnQ7IGkrKykgeworCQltZW1zZXQoJmNhLT5zbG90X2luZm9baV0sIDAsIHNpemVvZihzdHJ1Y3QgZHZiX2NhX3Nsb3QpKTsKKwkJY2EtPnNsb3RfaW5mb1tpXS5zbG90X3N0YXRlID0gRFZCX0NBX1NMT1RTVEFURV9OT05FOworCQlhdG9taWNfc2V0KCZjYS0+c2xvdF9pbmZvW2ldLmNhbWNoYW5nZV9jb3VudCwgMCk7CisJCWNhLT5zbG90X2luZm9baV0uY2FtY2hhbmdlX3R5cGUgPQorCQkJCURWQl9DQV9FTjUwMjIxX0NBTUNIQU5HRV9SRU1PVkVEOworCQltdXRleF9pbml0KCZjYS0+c2xvdF9pbmZvW2ldLnNsb3RfbG9jayk7CisJfQorCisJbXV0ZXhfaW5pdCgmY2EtPmlvY3RsX211dGV4KTsKKworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQlyZXQgPSAtRUlOVFI7CisJCWdvdG8gZXJyb3I7CisJfQorCW1iKCk7LypvcmlnaW5hbCovCisKKwkvKiBjcmVhdGUgYSBrdGhyZWFkIGZvciBtb25pdG9yaW5nIHRoaXMgQ0EgZGV2aWNlICovCisJY2EtPnRocmVhZCA9IGt0aHJlYWRfcnVuKGR2Yl9jYV9lbjUwMjIxX3RocmVhZCwgY2EsICJrZHZiLWNhLSVpOiVpIiwKKwkJCQkgY2EtPmR2YmRldi0+YWRhcHRlci0+bnVtLCBjYS0+ZHZiZGV2LT5pZCk7CisJaWYgKElTX0VSUihjYS0+dGhyZWFkKSkgeworCQlyZXQgPSBQVFJfRVJSKGNhLT50aHJlYWQpOworCQlwcmludGsoImR2Yl9jYV9pbml0OiBmYWlsZWQgdG8gc3RhcnQga2VybmVsX3RocmVhZCAoJWQpXG4iLAorCQkJcmV0KTsKKwkJZ290byBlcnJvcjsKKwl9CisJcmV0dXJuIDA7CisKK2Vycm9yOgorCWlmIChjYSAhPSBOVUxMKSB7CisJCWlmIChjYS0+ZHZiZGV2ICE9IE5VTEwpCisJCQlkdmJfdW5yZWdpc3Rlcl9kZXZpY2UoY2EtPmR2YmRldik7CisJCWtmcmVlKGNhLT5zbG90X2luZm8pOworCQlrZnJlZShjYS0+cmJ1Zik7CisJCWtmcmVlKGNhLT53YnVmKTsKKwkJa2ZyZWUoY2EpOworCX0KKwlwdWJjYS0+cHJpdmF0ZSA9IE5VTEw7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZHZiX2NhX2VuNTAyMjFfY2ltYXhfcmVsZWFzZSk7CisKKworCisvKioKKyAqIFJlbGVhc2UgYSBEVkIgQ0EgRU41MDIyMSBDSU1BWCBpbnRlcmZhY2UgZGV2aWNlLgorICoKKyAqIEBwYXJhbSBjYV9kZXYgVGhlIGR2Yl9zdHJ1Y3QgZGV2aWNlX3MgaW5zdGFuY2UgZm9yIHRoZSBDQSBkZXZpY2UuCisgKiBAcGFyYW0gY2EgVGhlIGFzc29jaWF0ZWQgZHZiX2NhIGluc3RhbmNlLgorICovCit2b2lkIGR2Yl9jYV9lbjUwMjIxX2NpbWF4X3JlbGVhc2Uoc3RydWN0IGR2Yl9jYV9lbjUwMjIxX2NpbWF4ICpwdWJjYSkKK3sKKwlzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKmNhID0gcHViY2EtPnByaXZhdGU7CisJaW50IGk7CisKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOworCisJLyogc2h1dGRvd24gdGhlIHRocmVhZCBpZiB0aGVyZSB3YXMgb25lICovCisJa3RocmVhZF9zdG9wKGNhLT50aHJlYWQpOworCisJZm9yIChpID0gMDsgaSA8IGNhLT5zbG90X2NvdW50OyBpKyspIHsKKwkJZHZiX2NhX2VuNTAyMjFfc2xvdF9zaHV0ZG93bihjYSwgaSk7CisJCXZmcmVlKGNhLT5zbG90X2luZm9baV0ucnhfYnVmZmVyLmRhdGEpOworCX0KKwlrZnJlZShjYS0+c2xvdF9pbmZvKTsKKwlrZnJlZShjYS0+cmJ1Zik7CisJa2ZyZWUoY2EtPndidWYpOworCWR2Yl91bnJlZ2lzdGVyX2RldmljZShjYS0+ZHZiZGV2KTsKKwlrZnJlZShjYSk7CisJcHViY2EtPnByaXZhdGUgPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC9kdmJfY2FfZW41MDIyMV9jaW1heC5oIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC9kdmJfY2FfZW41MDIyMV9jaW1heC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZWJkZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L2R2Yl9jYV9lbjUwMjIxX2NpbWF4LmgKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBkdmJfY2FfY2ltYXguaDogZ2VuZXJpYyBEVkIgZnVuY3Rpb25zIGZvciBFTjUwMjIxIENBIENJTUFYIGludGVyZmFjZXMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfRFZCX0NBX0VONTAyMjFfQ0lNQVhfSF8KKyNkZWZpbmUgX0RWQl9DQV9FTjUwMjIxX0NJTUFYX0hfCisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZHZiL2NhLmg+CisKKyNpbmNsdWRlICJkdmJkZXYuaCIKKworI2RlZmluZSBEVkJfQ0FfRU41MDIyMV9QT0xMX0NBTV9QUkVTRU5UCTEKKyNkZWZpbmUgRFZCX0NBX0VONTAyMjFfUE9MTF9DQU1fQ0hBTkdFRAkyCisjZGVmaW5lIERWQl9DQV9FTjUwMjIxX1BPTExfQ0FNX1JFQURZCQk0CisKKyNkZWZpbmUgRFZCX0NBX0VONTAyMjFfRkxBR19JUlFfQ0FNQ0hBTkdFCTEKKyNkZWZpbmUgRFZCX0NBX0VONTAyMjFfRkxBR19JUlFfRlIJCTIKKyNkZWZpbmUgRFZCX0NBX0VONTAyMjFfRkxBR19JUlFfREEJCTQKKworI2RlZmluZSBEVkJfQ0FfRU41MDIyMV9DQU1DSEFOR0VfUkVNT1ZFRAkJMAorI2RlZmluZSBEVkJfQ0FfRU41MDIyMV9DQU1DSEFOR0VfSU5TRVJURUQJCTEKKworI2RlZmluZSBEVkJfQ0FfRU41MDIyMV9DQVBfSVJRCTEKKworLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgYSBDQSBpbnRlcmZhY2UgKi8KK3N0cnVjdCBkdmJfY2FfZW41MDIyMV9jaW1heCB7CisKKwkvKiB0aGUgbW9kdWxlIG93bmluZyB0aGlzIHN0cnVjdHVyZSAqLworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworCisJLyogTk9URTogdGhlIHJlYWRfKiwgd3JpdGVfKiBhbmQgcG9sbF9zbG90X3N0YXR1cyBmdW5jdGlvbnMgd2lsbCBiZQorCSAqIGNhbGxlZCBmb3IgZGlmZmVyZW50IHNsb3RzIGNvbmN1cnJlbnRseSBhbmQgbmVlZCB0byB1c2UgbG9ja3Mgd2hlcmUKKwkgKiBhbmQgaWYgYXBwcm9wcmlhdGUuIFRoZXJlIHdpbGwgYmUgbm8gY29uY3VycmVudCBhY2Nlc3MgdG8gb25lIHNsb3QuCisJICovCisKKwkvKiBmdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyBhdHRyaWJ1dGUgbWVtb3J5IG9uIHRoZSBDQU0gKi8KKwlpbnQgKCpyZWFkX2Npcykoc3RydWN0IGR2Yl9jYV9lbjUwMjIxX2NpbWF4ICpjYSwKKwkJCWludCBzbG90LCB1OCAqYnVmLCBpbnQgc2l6ZSk7CisJaW50ICgqd3JpdGVfY29yKShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltYXggKmNhLAorCQkJaW50IHNsb3QsIGludCBhZGRyZXNzLCB1OCAqYnVmKTsKKyAgICAgIC8qcmV0dXJuIHRoZSBmaW5hbCBzaXplIG9yIC0xIGZvciBlcnJvciovCisJaW50ICgqbmVnb3RpYXRlKShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltYXggKmNhLCBpbnQgc2xvdCwgaW50IHNpemUpOworCisJLyogZnVuY3Rpb25zIGZvciBhY2Nlc3NpbmcgdGhlIGNvbnRyb2wgaW50ZXJmYWNlIG9uIHRoZSBDQU0gKi8KKwlpbnQgKCpyZWFkX2xwZHUpKHN0cnVjdCBkdmJfY2FfZW41MDIyMV9jaW1heCAqY2EsCisJCQlpbnQgc2xvdCwgdTggKmJ1ZiwgaW50IHNpemUpOworCWludCAoKndyaXRlX2xwZHUpKHN0cnVjdCBkdmJfY2FfZW41MDIyMV9jaW1heCAqY2EsCisJCQlpbnQgc2xvdCwgdTggKmJ1ZiwgaW50IHNpemUpOworCisJaW50ICgqY2FtX3Jlc2V0KShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltYXggKmNhLCBpbnQgc2xvdCk7CisJaW50ICgqcmVhZF9jYW1fc3RhdHVzKShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltYXggKmNhLCBpbnQgc2xvdCk7CisJaW50ICgqZ2V0X2NhcGJpbGl0eSkoc3RydWN0IGR2Yl9jYV9lbjUwMjIxX2NpbWF4ICpjYSwgaW50IHNsb3QpOworCisJLyogRnVuY3Rpb25zIGZvciBjb250cm9sbGluZyBzbG90cyAqLworCWludCAoKnNsb3RfcmVzZXQpKHN0cnVjdCBkdmJfY2FfZW41MDIyMV9jaW1heCAqY2EsIGludCBzbG90KTsKKwlpbnQgKCpzbG90X3NodXRkb3duKShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltYXggKmNhLCBpbnQgc2xvdCk7CisJaW50ICgqc2xvdF90c19lbmFibGUpKHN0cnVjdCBkdmJfY2FfZW41MDIyMV9jaW1heCAqY2EsIGludCBzbG90KTsKKworCS8qCisJKiBQb2xsIHNsb3Qgc3RhdHVzLgorCSogT25seSBuZWNlc3NhcnkgaWYgRFZCX0NBX0ZMQUdfRU41MDIyMV9JUlFfQ0FNQ0hBTkdFIGlzIG5vdCBzZXQKKwkqLworCWludCAoKnBvbGxfc2xvdF9zdGF0dXMpKHN0cnVjdCBkdmJfY2FfZW41MDIyMV9jaW1heCAqY2EsCisJCQlpbnQgc2xvdCwgaW50IG9wZW4pOworCisJLyogcHJpdmF0ZSBkYXRhLCB1c2VkIGJ5IGNhbGxlciAqLworCXZvaWQgKmRhdGE7CisKKwkvKiBPcGFxdWUgZGF0YSB1c2VkIGJ5IHRoZSBkdmJfY2EgY29yZS4gRG8gbm90IG1vZGlmeSEgKi8KKwl2b2lkICpwcml2YXRlOworfTsKKworCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogRnVuY3Rpb25zIGZvciByZXBvcnRpbmcgSVJRIGV2ZW50cyAqLworCisvKioKKyAqIEEgQ0FNQ0hBTkdFIElSUSBoYXMgb2NjdXJyZWQuCisgKgorICogQHBhcmFtIGNhIENBIGluc3RhbmNlLgorICogQHBhcmFtIHNsb3QgU2xvdCBjb25jZXJuZWQuCisgKiBAcGFyYW0gY2hhbmdlX3R5cGUgT25lIG9mIHRoZSBEVkJfQ0FfQ0FNQ0hBTkdFXyogdmFsdWVzCisgKi8KK3ZvaWQgZHZiX2NhX2VuNTAyMjFfY2ltYXhfY2FtY2hhbmdlX2lycShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltYXggKnB1YmNhLAorCQlpbnQgc2xvdCwgaW50IGNoYW5nZV90eXBlKTsKKworLyoqCisgKiBBIENBTVJFQURZIElSUSBoYXMgb2NjdXJyZWQuCisgKgorICogQHBhcmFtIGNhIENBIGluc3RhbmNlLgorICogQHBhcmFtIHNsb3QgU2xvdCBjb25jZXJuZWQuCisgKi8KK3ZvaWQgZHZiX2NhX2VuNTAyMjFfY2ltYXhfY2FtcmVhZHlfaXJxKHN0cnVjdCBkdmJfY2FfZW41MDIyMV9jaW1heCAqcHViY2EsCisJCWludCBzbG90KTsKKworLyoqCisgKiBBbiBGUiBvciBhIERBIElSUSBoYXMgb2NjdXJyZWQuCisgKgorICogQHBhcmFtIGNhIENBIGluc3RhbmNlLgorICogQHBhcmFtIHNsb3QgU2xvdCBjb25jZXJuZWQuCisgKi8KK3ZvaWQgZHZiX2NhX2VuNTAyMjFfY2ltYXhfZnJkYV9pcnEoc3RydWN0IGR2Yl9jYV9lbjUwMjIxX2NpbWF4ICpjYSwgaW50IHNsb3QpOworCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qIEluaXRpYWxpc2F0aW9uL3NodXRkb3duIGZ1bmN0aW9ucyAqLworCisvKioKKyAqIEluaXRpYWxpc2UgYSBuZXcgRFZCIENBIGRldmljZS4KKyAqCisgKiBAcGFyYW0gZHZiX2FkYXB0ZXIgRFZCIGFkYXB0ZXIgdG8gYXR0YWNoIHRoZSBuZXcgQ0EgZGV2aWNlIHRvLgorICogQHBhcmFtIGNhIFRoZSBkdmJfY2EgaW5zdGFuY2UuCisgKiBAcGFyYW0gZmxhZ3MgRmxhZ3MgZGVzY3JpYmluZyB0aGUgQ0EgZGV2aWNlIChEVkJfQ0FfRU41MDIyMV9GTEFHXyopLgorICogQHBhcmFtIHNsb3RfY291bnQgTnVtYmVyIG9mIHNsb3RzIHN1cHBvcnRlZC4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcywgbm9uemVybyBvbiBmYWlsdXJlCisgKi8KK2V4dGVybiBpbnQgZHZiX2NhX2VuNTAyMjFfY2ltYXhfaW5pdChzdHJ1Y3QgZHZiX2FkYXB0ZXIgKmR2Yl9hZGFwdGVyLAorCQlzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltYXggKmNhLCBpbnQgZmxhZ3MsIGludCBzbG90X2NvdW50KTsKKworLyoqCisgKiBSZWxlYXNlIGEgRFZCIENBIGRldmljZS4KKyAqCisgKiBAcGFyYW0gY2EgVGhlIGFzc29jaWF0ZWQgZHZiX2NhIGluc3RhbmNlLgorICovCitleHRlcm4gdm9pZCBkdmJfY2FfZW41MDIyMV9jaW1heF9yZWxlYXNlKHN0cnVjdCBkdmJfY2FfZW41MDIyMV9jaW1heCAqY2EpOworCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L2R2Yl9yaW5nYnVmZmVyLmMgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L2R2Yl9yaW5nYnVmZmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA2MTVkMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvZHZiX3JpbmdidWZmZXIuYwpAQCAtMCwwICsxLDM4MSBAQAorLyoKKyAqCisgKiBkdmJfcmluZ2J1ZmZlci5jOiByaW5nIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGR2YiBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgT2xpdmVyIEVuZHJpc3MKKyAqIENvcHlyaWdodCAoQykgMjAwNCBBbmRyZXcgZGUgUXVpbmNleQorICoKKyAqIGJhc2VkIG9uIGNvZGUgb3JpZ2luYWxseSBmb3VuZCBpbiBhdjcxMTAuYyAmIGR2Yl9jaS5jOgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDMgUmFscGggIE1ldHpsZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAmIE1hcmN1cyBNZXR6bGVyIGZvciBjb252ZXJnZW5jZSBpbnRlZ3JhdGVkIG1lZGlhIEdtYkgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiZHZiX3JpbmdidWZmZXIuaCIKKworI2RlZmluZSBQS1RfUkVBRFkgMAorI2RlZmluZSBQS1RfRElTUE9TRUQgMQorCisKK3ZvaWQgZHZiX3JpbmdidWZmZXJfaW5pdChzdHJ1Y3QgZHZiX3JpbmdidWZmZXIgKnJidWYsIHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pCit7CisJcmJ1Zi0+cHJlYWQ9cmJ1Zi0+cHdyaXRlPTA7CisJcmJ1Zi0+ZGF0YT1kYXRhOworCXJidWYtPnNpemU9bGVuOworCXJidWYtPmVycm9yPTA7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZyYnVmLT5xdWV1ZSk7CisKKwlzcGluX2xvY2tfaW5pdCgmKHJidWYtPmxvY2spKTsKK30KKworCisKK2ludCBkdmJfcmluZ2J1ZmZlcl9lbXB0eShzdHJ1Y3QgZHZiX3JpbmdidWZmZXIgKnJidWYpCit7CisJLyogc21wX2xvYWRfYWNxdWlyZSgpIHRvIGxvYWQgd3JpdGUgcG9pbnRlciBvbiByZWFkZXIgc2lkZQorCSAqIHRoaXMgcGFpcnMgd2l0aCBzbXBfc3RvcmVfcmVsZWFzZSgpIGluIGR2Yl9yaW5nYnVmZmVyX3dyaXRlKCksCisJICogZHZiX3JpbmdidWZmZXJfd3JpdGVfdXNlcigpLCBvciBkdmJfcmluZ2J1ZmZlcl9yZXNldCgpCisJICoKKwkgKiBmb3IgbWVtb3J5IGJhcnJpZXJzIGFsc28gc2VlIERvY3VtZW50YXRpb24vY2lyY3VsYXItYnVmZmVycy50eHQKKwkgKi8KKwlyZXR1cm4gKHJidWYtPnByZWFkID09IHNtcF9sb2FkX2FjcXVpcmUoJnJidWYtPnB3cml0ZSkpOworfQorCisKKworc3NpemVfdCBkdmJfcmluZ2J1ZmZlcl9mcmVlKHN0cnVjdCBkdmJfcmluZ2J1ZmZlciAqcmJ1ZikKK3sKKwlzc2l6ZV90IGZyZWU7CisKKwkvKiBSRUFEX09OQ0UoKSB0byBsb2FkIHJlYWQgcG9pbnRlciBvbiB3cml0ZXIgc2lkZQorCSAqIHRoaXMgcGFpcnMgd2l0aCBzbXBfc3RvcmVfcmVsZWFzZSgpIGluIGR2Yl9yaW5nYnVmZmVyX3JlYWQoKSwKKwkgKiBkdmJfcmluZ2J1ZmZlcl9yZWFkX3VzZXIoKSwgZHZiX3JpbmdidWZmZXJfZmx1c2goKSwKKwkgKiBvciBkdmJfcmluZ2J1ZmZlcl9yZXNldCgpCisJICovCisJZnJlZSA9IFJFQURfT05DRShyYnVmLT5wcmVhZCkgLSByYnVmLT5wd3JpdGU7CisJaWYgKGZyZWUgPD0gMCkKKwkJZnJlZSArPSByYnVmLT5zaXplOworCXJldHVybiBmcmVlLTE7Cit9CisKKworCitzc2l6ZV90IGR2Yl9yaW5nYnVmZmVyX2F2YWlsKHN0cnVjdCBkdmJfcmluZ2J1ZmZlciAqcmJ1ZikKK3sKKwlzc2l6ZV90IGF2YWlsOworCisJLyogc21wX2xvYWRfYWNxdWlyZSgpIHRvIGxvYWQgd3JpdGUgcG9pbnRlciBvbiByZWFkZXIgc2lkZQorCSAqIHRoaXMgcGFpcnMgd2l0aCBzbXBfc3RvcmVfcmVsZWFzZSgpIGluIGR2Yl9yaW5nYnVmZmVyX3dyaXRlKCksCisJICogZHZiX3JpbmdidWZmZXJfd3JpdGVfdXNlcigpLCBvciBkdmJfcmluZ2J1ZmZlcl9yZXNldCgpCisJICovCisJYXZhaWwgPSBzbXBfbG9hZF9hY3F1aXJlKCZyYnVmLT5wd3JpdGUpIC0gcmJ1Zi0+cHJlYWQ7CisJaWYgKGF2YWlsIDwgMCkKKwkJYXZhaWwgKz0gcmJ1Zi0+c2l6ZTsKKwlyZXR1cm4gYXZhaWw7Cit9CisKKworCit2b2lkIGR2Yl9yaW5nYnVmZmVyX2ZsdXNoKHN0cnVjdCBkdmJfcmluZ2J1ZmZlciAqcmJ1ZikKK3sKKwkvKiBkdmJfcmluZ2J1ZmZlcl9mbHVzaCgpIGNvdW50cyBhcyByZWFkIG9wZXJhdGlvbgorCSAqIHNtcF9sb2FkX2FjcXVpcmUoKSB0byBsb2FkIHdyaXRlIHBvaW50ZXIKKwkgKiBzbXBfc3RvcmVfcmVsZWFzZSgpIHRvIHVwZGF0ZSByZWFkIHBvaW50ZXIsIHRoaXMgZW5zdXJlcyB0aGF0IHRoZQorCSAqIGNvcnJlY3QgcG9pbnRlciBpcyB2aXNpYmxlIGZvciBzdWJzZXF1ZW50IGR2Yl9yaW5nYnVmZmVyX2ZyZWUoKQorCSAqIGNhbGxzIG9uIG90aGVyIGNwdSBjb3JlcworCSAqLworCXNtcF9zdG9yZV9yZWxlYXNlKCZyYnVmLT5wcmVhZCwgc21wX2xvYWRfYWNxdWlyZSgmcmJ1Zi0+cHdyaXRlKSk7CisJcmJ1Zi0+ZXJyb3IgPSAwOworfQorLy9FWFBPUlRfU1lNQk9MKGR2Yl9yaW5nYnVmZmVyX2ZsdXNoKTsKKwordm9pZCBkdmJfcmluZ2J1ZmZlcl9yZXNldChzdHJ1Y3QgZHZiX3JpbmdidWZmZXIgKnJidWYpCit7CisJLyogZHZiX3JpbmdidWZmZXJfcmVzZXQoKSBjb3VudHMgYXMgcmVhZCBhbmQgd3JpdGUgb3BlcmF0aW9uCisJICogc21wX3N0b3JlX3JlbGVhc2UoKSB0byB1cGRhdGUgcmVhZCBwb2ludGVyCisJICovCisJc21wX3N0b3JlX3JlbGVhc2UoJnJidWYtPnByZWFkLCAwKTsKKwkvKiBzbXBfc3RvcmVfcmVsZWFzZSgpIHRvIHVwZGF0ZSB3cml0ZSBwb2ludGVyICovCisJc21wX3N0b3JlX3JlbGVhc2UoJnJidWYtPnB3cml0ZSwgMCk7CisJcmJ1Zi0+ZXJyb3IgPSAwOworfQorCit2b2lkIGR2Yl9yaW5nYnVmZmVyX2ZsdXNoX3NwaW5sb2NrX3dha2V1cChzdHJ1Y3QgZHZiX3JpbmdidWZmZXIgKnJidWYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZyYnVmLT5sb2NrLCBmbGFncyk7CisJZHZiX3JpbmdidWZmZXJfZmx1c2gocmJ1Zik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmJ1Zi0+bG9jaywgZmxhZ3MpOworCisJd2FrZV91cCgmcmJ1Zi0+cXVldWUpOworfQorCitzc2l6ZV90IGR2Yl9yaW5nYnVmZmVyX3JlYWRfdXNlcihzdHJ1Y3QgZHZiX3JpbmdidWZmZXIgKnJidWYsIHU4IF9fdXNlciAqYnVmLCBzaXplX3QgbGVuKQoreworCXNpemVfdCB0b2RvID0gbGVuOworCXNpemVfdCBzcGxpdDsKKworCXNwbGl0ID0gKHJidWYtPnByZWFkICsgbGVuID4gcmJ1Zi0+c2l6ZSkgPyByYnVmLT5zaXplIC0gcmJ1Zi0+cHJlYWQgOiAwOworCWlmIChzcGxpdCA+IDApIHsKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsIHJidWYtPmRhdGErcmJ1Zi0+cHJlYWQsIHNwbGl0KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlidWYgKz0gc3BsaXQ7CisJCXRvZG8gLT0gc3BsaXQ7CisJCS8qIHNtcF9zdG9yZV9yZWxlYXNlKCkgZm9yIHJlYWQgcG9pbnRlciB1cGRhdGUgdG8gZW5zdXJlCisJCSAqIHRoYXQgYnVmIGlzIG5vdCBvdmVyd3JpdHRlbiB1bnRpbCByZWFkIGlzIGNvbXBsZXRlLAorCQkgKiB0aGlzIHBhaXJzIHdpdGggQUNDRVNTX09OQ0UoKSBpbiBkdmJfcmluZ2J1ZmZlcl9mcmVlKCkKKwkJICovCisJCXNtcF9zdG9yZV9yZWxlYXNlKCZyYnVmLT5wcmVhZCwgMCk7CisJfQorCWlmIChjb3B5X3RvX3VzZXIoYnVmLCByYnVmLT5kYXRhK3JidWYtPnByZWFkLCB0b2RvKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBzbXBfc3RvcmVfcmVsZWFzZSgpIHRvIHVwZGF0ZSByZWFkIHBvaW50ZXIsIHNlZSBhYm92ZSAqLworCXNtcF9zdG9yZV9yZWxlYXNlKCZyYnVmLT5wcmVhZCwgKHJidWYtPnByZWFkICsgdG9kbykgJSByYnVmLT5zaXplKTsKKworCXJldHVybiBsZW47Cit9CisKK3ZvaWQgZHZiX3JpbmdidWZmZXJfcmVhZChzdHJ1Y3QgZHZiX3JpbmdidWZmZXIgKnJidWYsIHU4ICpidWYsIHNpemVfdCBsZW4pCit7CisJc2l6ZV90IHRvZG8gPSBsZW47CisJc2l6ZV90IHNwbGl0OworCisJc3BsaXQgPSAocmJ1Zi0+cHJlYWQgKyBsZW4gPiByYnVmLT5zaXplKSA/IHJidWYtPnNpemUgLSByYnVmLT5wcmVhZCA6IDA7CisJaWYgKHNwbGl0ID4gMCkgeworCQltZW1jcHkoYnVmLCByYnVmLT5kYXRhK3JidWYtPnByZWFkLCBzcGxpdCk7CisJCWJ1ZiArPSBzcGxpdDsKKwkJdG9kbyAtPSBzcGxpdDsKKwkJLyogc21wX3N0b3JlX3JlbGVhc2UoKSBmb3IgcmVhZCBwb2ludGVyIHVwZGF0ZSB0byBlbnN1cmUKKwkJICogdGhhdCBidWYgaXMgbm90IG92ZXJ3cml0dGVuIHVudGlsIHJlYWQgaXMgY29tcGxldGUsCisJCSAqIHRoaXMgcGFpcnMgd2l0aCBBQ0NFU1NfT05DRSgpIGluIGR2Yl9yaW5nYnVmZmVyX2ZyZWUoKQorCQkgKi8KKwkJc21wX3N0b3JlX3JlbGVhc2UoJnJidWYtPnByZWFkLCAwKTsKKwl9CisJbWVtY3B5KGJ1ZiwgcmJ1Zi0+ZGF0YStyYnVmLT5wcmVhZCwgdG9kbyk7CisKKwkvKiBzbXBfc3RvcmVfcmVsZWFzZSgpIHRvIHVwZGF0ZSByZWFkIHBvaW50ZXIsIHNlZSBhYm92ZSAqLworCXNtcF9zdG9yZV9yZWxlYXNlKCZyYnVmLT5wcmVhZCwgKHJidWYtPnByZWFkICsgdG9kbykgJSByYnVmLT5zaXplKTsKK30KKworCitzc2l6ZV90IGR2Yl9yaW5nYnVmZmVyX3dyaXRlKHN0cnVjdCBkdmJfcmluZ2J1ZmZlciAqcmJ1ZiwgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzaXplX3QgdG9kbyA9IGxlbjsKKwlzaXplX3Qgc3BsaXQ7CisKKwlzcGxpdCA9IChyYnVmLT5wd3JpdGUgKyBsZW4gPiByYnVmLT5zaXplKSA/IHJidWYtPnNpemUgLSByYnVmLT5wd3JpdGUgOiAwOworCisJaWYgKHNwbGl0ID4gMCkgeworCQltZW1jcHkocmJ1Zi0+ZGF0YStyYnVmLT5wd3JpdGUsIGJ1Ziwgc3BsaXQpOworCQlidWYgKz0gc3BsaXQ7CisJCXRvZG8gLT0gc3BsaXQ7CisJCS8qIHNtcF9zdG9yZV9yZWxlYXNlKCkgZm9yIHdyaXRlIHBvaW50ZXIgdXBkYXRlIHRvIGVuc3VyZSB0aGF0CisJCSAqIHdyaXR0ZW4gZGF0YSBpcyB2aXNpYmxlIG9uIG90aGVyIGNwdSBjb3JlcyBiZWZvcmUgdGhlIHBvaW50ZXIKKwkJICogdXBkYXRlLCB0aGlzIHBhaXJzIHdpdGggc21wX2xvYWRfYWNxdWlyZSgpIGluCisJCSAqIGR2Yl9yaW5nYnVmZmVyX2VtcHR5KCkgb3IgZHZiX3JpbmdidWZmZXJfYXZhaWwoKQorCQkgKi8KKwkJc21wX3N0b3JlX3JlbGVhc2UoJnJidWYtPnB3cml0ZSwgMCk7CisJfQorCW1lbWNweShyYnVmLT5kYXRhK3JidWYtPnB3cml0ZSwgYnVmLCB0b2RvKTsKKwkvKiBzbXBfc3RvcmVfcmVsZWFzZSgpIGZvciB3cml0ZSBwb2ludGVyIHVwZGF0ZSwgc2VlIGFib3ZlICovCisJc21wX3N0b3JlX3JlbGVhc2UoJnJidWYtPnB3cml0ZSwgKHJidWYtPnB3cml0ZSArIHRvZG8pICUgcmJ1Zi0+c2l6ZSk7CisKKwlyZXR1cm4gbGVuOworfQorCitzc2l6ZV90IGR2Yl9yaW5nYnVmZmVyX3dyaXRlX3VzZXIoc3RydWN0IGR2Yl9yaW5nYnVmZmVyICpyYnVmLAorCQkJCSAgY29uc3QgdTggX191c2VyICpidWYsIHNpemVfdCBsZW4pCit7CisJaW50IHN0YXR1czsKKwlzaXplX3QgdG9kbyA9IGxlbjsKKwlzaXplX3Qgc3BsaXQ7CisKKwlzcGxpdCA9IChyYnVmLT5wd3JpdGUgKyBsZW4gPiByYnVmLT5zaXplKSA/IHJidWYtPnNpemUgLSByYnVmLT5wd3JpdGUgOiAwOworCisJaWYgKHNwbGl0ID4gMCkgeworCQlzdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihyYnVmLT5kYXRhK3JidWYtPnB3cml0ZSwgYnVmLCBzcGxpdCk7CisJCWlmIChzdGF0dXMpCisJCQlyZXR1cm4gbGVuIC0gdG9kbzsKKwkJYnVmICs9IHNwbGl0OworCQl0b2RvIC09IHNwbGl0OworCQkvKiBzbXBfc3RvcmVfcmVsZWFzZSgpIGZvciB3cml0ZSBwb2ludGVyIHVwZGF0ZSB0byBlbnN1cmUgdGhhdAorCQkgKiB3cml0dGVuIGRhdGEgaXMgdmlzaWJsZSBvbiBvdGhlciBjcHUgY29yZXMgYmVmb3JlIHRoZSBwb2ludGVyCisJCSAqIHVwZGF0ZSwgdGhpcyBwYWlycyB3aXRoIHNtcF9sb2FkX2FjcXVpcmUoKSBpbgorCQkgKiBkdmJfcmluZ2J1ZmZlcl9lbXB0eSgpIG9yIGR2Yl9yaW5nYnVmZmVyX2F2YWlsKCkKKwkJICovCisJCXNtcF9zdG9yZV9yZWxlYXNlKCZyYnVmLT5wd3JpdGUsIDApOworCX0KKwlzdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihyYnVmLT5kYXRhK3JidWYtPnB3cml0ZSwgYnVmLCB0b2RvKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gbGVuIC0gdG9kbzsKKwkvKiBzbXBfc3RvcmVfcmVsZWFzZSgpIGZvciB3cml0ZSBwb2ludGVyIHVwZGF0ZSwgc2VlIGFib3ZlICovCisJc21wX3N0b3JlX3JlbGVhc2UoJnJidWYtPnB3cml0ZSwgKHJidWYtPnB3cml0ZSArIHRvZG8pICUgcmJ1Zi0+c2l6ZSk7CisKKwlyZXR1cm4gbGVuOworfQorCitzc2l6ZV90IGR2Yl9yaW5nYnVmZmVyX3BrdF93cml0ZShzdHJ1Y3QgZHZiX3JpbmdidWZmZXIgKnJidWYsIHU4KiBidWYsIHNpemVfdCBsZW4pCit7CisJaW50IHN0YXR1czsKKwlzc2l6ZV90IG9sZHB3cml0ZSA9IHJidWYtPnB3cml0ZTsKKworCURWQl9SSU5HQlVGRkVSX1dSSVRFX0JZVEUocmJ1ZiwgbGVuID4+IDgpOworCURWQl9SSU5HQlVGRkVSX1dSSVRFX0JZVEUocmJ1ZiwgbGVuICYgMHhmZik7CisJRFZCX1JJTkdCVUZGRVJfV1JJVEVfQllURShyYnVmLCBQS1RfUkVBRFkpOworCXN0YXR1cyA9IGR2Yl9yaW5nYnVmZmVyX3dyaXRlKHJidWYsIGJ1ZiwgbGVuKTsKKworCWlmIChzdGF0dXMgPCAwKSByYnVmLT5wd3JpdGUgPSBvbGRwd3JpdGU7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3NpemVfdCBkdmJfcmluZ2J1ZmZlcl9wa3RfcmVhZF91c2VyKHN0cnVjdCBkdmJfcmluZ2J1ZmZlciAqcmJ1Ziwgc2l6ZV90IGlkeCwKKwkJCQlpbnQgb2Zmc2V0LCB1OCBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzaXplX3QgdG9kbzsKKwlzaXplX3Qgc3BsaXQ7CisJc2l6ZV90IHBrdGxlbjsKKworCXBrdGxlbiA9IHJidWYtPmRhdGFbaWR4XSA8PCA4OworCXBrdGxlbiB8PSByYnVmLT5kYXRhWyhpZHggKyAxKSAlIHJidWYtPnNpemVdOworCWlmIChvZmZzZXQgPiBwa3RsZW4pIHJldHVybiAtRUlOVkFMOworCWlmICgob2Zmc2V0ICsgbGVuKSA+IHBrdGxlbikgbGVuID0gcGt0bGVuIC0gb2Zmc2V0OworCisJaWR4ID0gKGlkeCArIERWQl9SSU5HQlVGRkVSX1BLVEhEUlNJWkUgKyBvZmZzZXQpICUgcmJ1Zi0+c2l6ZTsKKwl0b2RvID0gbGVuOworCXNwbGl0ID0gKChpZHggKyBsZW4pID4gcmJ1Zi0+c2l6ZSkgPyByYnVmLT5zaXplIC0gaWR4IDogMDsKKwlpZiAoc3BsaXQgPiAwKSB7CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCByYnVmLT5kYXRhK2lkeCwgc3BsaXQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJ1ZiArPSBzcGxpdDsKKwkJdG9kbyAtPSBzcGxpdDsKKwkJaWR4ID0gMDsKKwl9CisJaWYgKGNvcHlfdG9fdXNlcihidWYsIHJidWYtPmRhdGEraWR4LCB0b2RvKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gbGVuOworfQorCitzc2l6ZV90IGR2Yl9yaW5nYnVmZmVyX3BrdF9yZWFkKHN0cnVjdCBkdmJfcmluZ2J1ZmZlciAqcmJ1Ziwgc2l6ZV90IGlkeCwKKwkJCQlpbnQgb2Zmc2V0LCB1OCogYnVmLCBzaXplX3QgbGVuKQoreworCXNpemVfdCB0b2RvOworCXNpemVfdCBzcGxpdDsKKwlzaXplX3QgcGt0bGVuOworCisJcGt0bGVuID0gcmJ1Zi0+ZGF0YVtpZHhdIDw8IDg7CisJcGt0bGVuIHw9IHJidWYtPmRhdGFbKGlkeCArIDEpICUgcmJ1Zi0+c2l6ZV07CisJaWYgKG9mZnNldCA+IHBrdGxlbikgcmV0dXJuIC1FSU5WQUw7CisJaWYgKChvZmZzZXQgKyBsZW4pID4gcGt0bGVuKSBsZW4gPSBwa3RsZW4gLSBvZmZzZXQ7CisKKwlpZHggPSAoaWR4ICsgRFZCX1JJTkdCVUZGRVJfUEtUSERSU0laRSArIG9mZnNldCkgJSByYnVmLT5zaXplOworCXRvZG8gPSBsZW47CisJc3BsaXQgPSAoKGlkeCArIGxlbikgPiByYnVmLT5zaXplKSA/IHJidWYtPnNpemUgLSBpZHggOiAwOworCWlmIChzcGxpdCA+IDApIHsKKwkJbWVtY3B5KGJ1ZiwgcmJ1Zi0+ZGF0YStpZHgsIHNwbGl0KTsKKwkJYnVmICs9IHNwbGl0OworCQl0b2RvIC09IHNwbGl0OworCQlpZHggPSAwOworCX0KKwltZW1jcHkoYnVmLCByYnVmLT5kYXRhK2lkeCwgdG9kbyk7CisJcmV0dXJuIGxlbjsKK30KKwordm9pZCBkdmJfcmluZ2J1ZmZlcl9wa3RfZGlzcG9zZShzdHJ1Y3QgZHZiX3JpbmdidWZmZXIgKnJidWYsIHNpemVfdCBpZHgpCit7CisJc2l6ZV90IHBrdGxlbjsKKworCXJidWYtPmRhdGFbKGlkeCArIDIpICUgcmJ1Zi0+c2l6ZV0gPSBQS1RfRElTUE9TRUQ7CisKKwkvLyBjbGVhbiB1cCBkaXNwb3NlZCBwYWNrZXRzCisJd2hpbGUoZHZiX3JpbmdidWZmZXJfYXZhaWwocmJ1ZikgPiBEVkJfUklOR0JVRkZFUl9QS1RIRFJTSVpFKSB7CisJCWlmIChEVkJfUklOR0JVRkZFUl9QRUVLKHJidWYsIDIpID09IFBLVF9ESVNQT1NFRCkgeworCQkJcGt0bGVuID0gRFZCX1JJTkdCVUZGRVJfUEVFSyhyYnVmLCAwKSA8PCA4OworCQkJcGt0bGVuIHw9IERWQl9SSU5HQlVGRkVSX1BFRUsocmJ1ZiwgMSk7CisJCQlEVkJfUklOR0JVRkZFUl9TS0lQKHJidWYsIHBrdGxlbiArIERWQl9SSU5HQlVGRkVSX1BLVEhEUlNJWkUpOworCQl9IGVsc2UgeworCQkJLy8gZmlyc3QgcGFja2V0IGlzIG5vdCBkaXNwb3NlZCwgc28gd2Ugc3RvcCBjbGVhbmluZyBub3cKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzc2l6ZV90IGR2Yl9yaW5nYnVmZmVyX3BrdF9uZXh0KHN0cnVjdCBkdmJfcmluZ2J1ZmZlciAqcmJ1Ziwgc2l6ZV90IGlkeCwgc2l6ZV90KiBwa3RsZW4pCit7CisJaW50IGNvbnN1bWVkOworCWludCBjdXJwa3RsZW47CisJaW50IGN1cnBrdHN0YXR1czsKKworCWlmIChpZHggPT0gLTEpIHsKKwkgICAgICAgaWR4ID0gcmJ1Zi0+cHJlYWQ7CisJfSBlbHNlIHsKKwkJY3VycGt0bGVuID0gcmJ1Zi0+ZGF0YVtpZHhdIDw8IDg7CisJCWN1cnBrdGxlbiB8PSByYnVmLT5kYXRhWyhpZHggKyAxKSAlIHJidWYtPnNpemVdOworCQlpZHggPSAoaWR4ICsgY3VycGt0bGVuICsgRFZCX1JJTkdCVUZGRVJfUEtUSERSU0laRSkgJSByYnVmLT5zaXplOworCX0KKworCWNvbnN1bWVkID0gKGlkeCAtIHJidWYtPnByZWFkKSAlIHJidWYtPnNpemU7CisKKwl3aGlsZSgoZHZiX3JpbmdidWZmZXJfYXZhaWwocmJ1ZikgLSBjb25zdW1lZCkgPiBEVkJfUklOR0JVRkZFUl9QS1RIRFJTSVpFKSB7CisKKwkJY3VycGt0bGVuID0gcmJ1Zi0+ZGF0YVtpZHhdIDw8IDg7CisJCWN1cnBrdGxlbiB8PSByYnVmLT5kYXRhWyhpZHggKyAxKSAlIHJidWYtPnNpemVdOworCQljdXJwa3RzdGF0dXMgPSByYnVmLT5kYXRhWyhpZHggKyAyKSAlIHJidWYtPnNpemVdOworCisJCWlmIChjdXJwa3RzdGF0dXMgPT0gUEtUX1JFQURZKSB7CisJCQkqcGt0bGVuID0gY3VycGt0bGVuOworCQkJcmV0dXJuIGlkeDsKKwkJfQorCisJCWNvbnN1bWVkICs9IGN1cnBrdGxlbiArIERWQl9SSU5HQlVGRkVSX1BLVEhEUlNJWkU7CisJCWlkeCA9IChpZHggKyBjdXJwa3RsZW4gKyBEVkJfUklOR0JVRkZFUl9QS1RIRFJTSVpFKSAlIHJidWYtPnNpemU7CisJfQorCisJLy8gbm8gcGFja2V0cyBhdmFpbGFibGUKKwlyZXR1cm4gLTE7Cit9CisKKworI2lmIDAKK0VYUE9SVF9TWU1CT0woZHZiX3JpbmdidWZmZXJfaW5pdCk7CitFWFBPUlRfU1lNQk9MKGR2Yl9yaW5nYnVmZmVyX2VtcHR5KTsKK0VYUE9SVF9TWU1CT0woZHZiX3JpbmdidWZmZXJfZnJlZSk7CitFWFBPUlRfU1lNQk9MKGR2Yl9yaW5nYnVmZmVyX2F2YWlsKTsKK0VYUE9SVF9TWU1CT0woZHZiX3JpbmdidWZmZXJfZmx1c2hfc3BpbmxvY2tfd2FrZXVwKTsKK0VYUE9SVF9TWU1CT0woZHZiX3JpbmdidWZmZXJfcmVhZF91c2VyKTsKK0VYUE9SVF9TWU1CT0woZHZiX3JpbmdidWZmZXJfcmVhZCk7CitFWFBPUlRfU1lNQk9MKGR2Yl9yaW5nYnVmZmVyX3dyaXRlKTsKK0VYUE9SVF9TWU1CT0woZHZiX3JpbmdidWZmZXJfd3JpdGVfdXNlcik7CisKK0VYUE9SVF9TWU1CT0woZHZiX3JpbmdidWZmZXJfcGt0X3JlYWQpOworRVhQT1JUX1NZTUJPTChkdmJfcmluZ2J1ZmZlcl9wa3Rfd3JpdGUpOworRVhQT1JUX1NZTUJPTChkdmJfcmluZ2J1ZmZlcl9wa3RfbmV4dCk7CitFWFBPUlRfU1lNQk9MKGR2Yl9yaW5nYnVmZmVyX3BrdF9kaXNwb3NlKTsKK0VYUE9SVF9TWU1CT0woZHZiX3JpbmdidWZmZXJfcGt0X3JlYWRfdXNlcik7CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC9kdmJfcmluZ2J1ZmZlci5oIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC9kdmJfcmluZ2J1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZTk0ODcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L2R2Yl9yaW5nYnVmZmVyLmgKQEAgLTAsMCArMSwyODAgQEAKKy8qCisgKgorICogZHZiX3JpbmdidWZmZXIuaDogcmluZyBidWZmZXIgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBkdmIgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIE9saXZlciBFbmRyaXNzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgQW5kcmV3IGRlIFF1aW5jZXkKKyAqCisgKiBiYXNlZCBvbiBjb2RlIG9yaWdpbmFsbHkgZm91bmQgaW4gYXY3MTEwLmMgJiBkdmJfY2kuYzoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAzIFJhbHBoIE1ldHpsZXIgJiBNYXJjdXMgTWV0emxlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGNvbnZlcmdlbmNlIGludGVncmF0ZWQgbWVkaWEgR21iSAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMQorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfRFZCX1JJTkdCVUZGRVJfSF8KKyNkZWZpbmUgX0RWQl9SSU5HQlVGRkVSX0hfCisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKworLyoqCisgKiBzdHJ1Y3QgZHZiX3JpbmdidWZmZXIgLSBEZXNjcmliZXMgYSByaW5nIGJ1ZmZlciB1c2VkIGF0IERWQiBmcmFtZXdvcmsKKyAqCisgKiBAZGF0YTogQXJlYSB3ZXJlIHRoZSByaW5nYnVmZmVyIGRhdGEgaXMgd3JpdHRlbgorICogQHNpemU6IHNpemUgb2YgdGhlIHJpbmdidWZmZXIKKyAqIEBwcmVhZDogbmV4dCBwb3NpdGlvbiB0byByZWFkCisgKiBAcHdyaXRlOiBuZXh0IHBvc2l0aW9uIHRvIHdyaXRlCisgKiBAZXJyb3I6IHVzZWQgYnkgcmluZ2J1ZmZlciBjbGllbnRzIHRvIGluZGljYXRlIHRoYXQgYW4gZXJyb3IgaGFwcGVuZWQuCisgKiBAcXVldWU6IFdhaXQgcXVldWUgdXNlZCBieSByaW5nYnVmZmVyIGNsaWVudHMgdG8gaW5kaWNhdGUgd2hlbiBidWZmZXIKKyAqICAgICAgICAgd2FzIGZpbGxlZAorICogQGxvY2s6IFNwaW5sb2NrIHVzZWQgdG8gcHJvdGVjdCB0aGUgcmluZ2J1ZmZlcgorICovCitzdHJ1Y3QgZHZiX3JpbmdidWZmZXIgeworCXU4ICAgICAgICAgICAgICAgKmRhdGE7CisJc3NpemVfdCAgICAgICAgICAgc2l6ZTsKKwlzc2l6ZV90ICAgICAgICAgICBwcmVhZDsKKwlzc2l6ZV90ICAgICAgICAgICBwd3JpdGU7CisJaW50ICAgICAgICAgICAgICAgZXJyb3I7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCBxdWV1ZTsKKwlzcGlubG9ja190ICAgICAgICBsb2NrOworfTsKKworI2RlZmluZSBEVkJfUklOR0JVRkZFUl9QS1RIRFJTSVpFIDMKKworLyoqCisgKiBkdmJfcmluZ2J1ZmZlcl9pbml0IC0gaW5pdGlhbGl6ZSByaW5nIGJ1ZmZlciwgbG9jayBhbmQgcXVldWUKKyAqCisgKiBAcmJ1ZjogcG9pbnRlciB0byBzdHJ1Y3QgZHZiX3JpbmdidWZmZXIKKyAqIEBkYXRhOiBwb2ludGVyIHRvIHRoZSBidWZmZXIgd2hlcmUgdGhlIGRhdGEgd2lsbCBiZSBzdG9yZWQKKyAqIEBsZW46IGJ5dGVzIGZyb20gcmluZyBidWZmZXIgaW50byBAYnVmCisgKi8KK2V4dGVybiB2b2lkIGR2Yl9yaW5nYnVmZmVyX2luaXQoc3RydWN0IGR2Yl9yaW5nYnVmZmVyICpyYnVmLCB2b2lkICpkYXRhLAorCQkJCXNpemVfdCBsZW4pOworCisvKioKKyAqIGR2Yl9yaW5nYnVmZmVyX2VtcHR5IC0gdGVzdCB3aGV0aGVyIGJ1ZmZlciBpcyBlbXB0eQorICoKKyAqIEByYnVmOiBwb2ludGVyIHRvIHN0cnVjdCBkdmJfcmluZ2J1ZmZlcgorICovCitleHRlcm4gaW50IGR2Yl9yaW5nYnVmZmVyX2VtcHR5KHN0cnVjdCBkdmJfcmluZ2J1ZmZlciAqcmJ1Zik7CisKKy8qKgorICogZHZiX3JpbmdidWZmZXJfZnJlZSAtIHJldHVybnMgdGhlIG51bWJlciBvZiBmcmVlIGJ5dGVzIGluIHRoZSBidWZmZXIKKyAqCisgKiBAcmJ1ZjogcG9pbnRlciB0byBzdHJ1Y3QgZHZiX3JpbmdidWZmZXIKKyAqCisgKiBSZXR1cm46IG51bWJlciBvZiBmcmVlIGJ5dGVzIGluIHRoZSBidWZmZXIKKyAqLworZXh0ZXJuIHNzaXplX3QgZHZiX3JpbmdidWZmZXJfZnJlZShzdHJ1Y3QgZHZiX3JpbmdidWZmZXIgKnJidWYpOworCisvKioKKyAqIGR2Yl9yaW5nYnVmZmVyX2F2YWlsIC0gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdhaXRpbmcgaW4gdGhlIGJ1ZmZlcgorICoKKyAqIEByYnVmOiBwb2ludGVyIHRvIHN0cnVjdCBkdmJfcmluZ2J1ZmZlcgorICoKKyAqIFJldHVybjogbnVtYmVyIG9mIGJ5dGVzIHdhaXRpbmcgaW4gdGhlIGJ1ZmZlcgorICovCitleHRlcm4gc3NpemVfdCBkdmJfcmluZ2J1ZmZlcl9hdmFpbChzdHJ1Y3QgZHZiX3JpbmdidWZmZXIgKnJidWYpOworCisvKioKKyAqIGR2Yl9yaW5nYnVmZmVyX3Jlc2V0IC0gcmVzZXRzIHRoZSByaW5nYnVmZmVyIHRvIGluaXRpYWwgc3RhdGUKKyAqCisgKiBAcmJ1ZjogcG9pbnRlciB0byBzdHJ1Y3QgZHZiX3JpbmdidWZmZXIKKyAqCisgKiBSZXNldHMgdGhlIHJlYWQgYW5kIHdyaXRlIHBvaW50ZXJzIHRvIHplcm8gYW5kIGZsdXNoIHRoZSBidWZmZXIuCisgKgorICogVGhpcyBjb3VudHMgYXMgYSByZWFkIGFuZCB3cml0ZSBvcGVyYXRpb24KKyAqLworZXh0ZXJuIHZvaWQgZHZiX3JpbmdidWZmZXJfcmVzZXQoc3RydWN0IGR2Yl9yaW5nYnVmZmVyICpyYnVmKTsKKworLyoKKyAqIHJlYWQgcm91dGluZXMgJiBtYWNyb3MKKyAqLworCisvKioKKyAqIGR2Yl9yaW5nYnVmZmVyX2ZsdXNoIC0gZmx1c2ggYnVmZmVyCisgKgorICogQHJidWY6IHBvaW50ZXIgdG8gc3RydWN0IGR2Yl9yaW5nYnVmZmVyCisgKi8KK2V4dGVybiB2b2lkIGR2Yl9yaW5nYnVmZmVyX2ZsdXNoKHN0cnVjdCBkdmJfcmluZ2J1ZmZlciAqcmJ1Zik7CisKKy8qKgorICogZHZiX3JpbmdidWZmZXJfZmx1c2hfc3BpbmxvY2tfd2FrZXVwLSBmbHVzaCBidWZmZXIgcHJvdGVjdGVkIGJ5IHNwaW5sb2NrCisgKiAgICAgIGFuZCB3YWtlLXVwIHdhaXRpbmcgdGFzayhzKQorICoKKyAqIEByYnVmOiBwb2ludGVyIHRvIHN0cnVjdCBkdmJfcmluZ2J1ZmZlcgorICovCitleHRlcm4gdm9pZCBkdmJfcmluZ2J1ZmZlcl9mbHVzaF9zcGlubG9ja193YWtldXAoc3RydWN0IGR2Yl9yaW5nYnVmZmVyICpyYnVmKTsKKworLyoqCisgKiBEVkJfUklOR0JVRkZFUl9QRUVLIC0gcGVlayBhdCBieXRlIEBvZmZzIGluIHRoZSBidWZmZXIKKyAqCisgKiBAcmJ1ZjogcG9pbnRlciB0byBzdHJ1Y3QgZHZiX3JpbmdidWZmZXIKKyAqIEBvZmZzOiBvZmZzZXQgaW5zaWRlIHRoZSByaW5nYnVmZmVyCisgKi8KKyNkZWZpbmUgRFZCX1JJTkdCVUZGRVJfUEVFSyhyYnVmLCBvZmZzKQlcCisJCQkoKHJidWYpLT5kYXRhWygocmJ1ZiktPnByZWFkICsgKG9mZnMpKSAlIChyYnVmKS0+c2l6ZV0pCisKKy8qKgorICogRFZCX1JJTkdCVUZGRVJfU0tJUCAtIGFkdmFuY2UgcmVhZCBwdHIgYnkgQG51bSBieXRlcworICoKKyAqIEByYnVmOiBwb2ludGVyIHRvIHN0cnVjdCBkdmJfcmluZ2J1ZmZlcgorICogQG51bTogbnVtYmVyIG9mIGJ5dGVzIHRvIGFkdmFuY2UKKyAqLworI2RlZmluZSBEVkJfUklOR0JVRkZFUl9TS0lQKHJidWYsIG51bSkJe1wKKwkJCShyYnVmKS0+cHJlYWQgPSAoKHJidWYpLT5wcmVhZCArIChudW0pKSAlIChyYnVmKS0+c2l6ZTtcCit9CisKKy8qKgorICogZHZiX3JpbmdidWZmZXJfcmVhZF91c2VyIC0gUmVhZHMgYSBidWZmZXIgaW50byBhbiB1c2VyIHBvaW50ZXIKKyAqCisgKiBAcmJ1ZjogcG9pbnRlciB0byBzdHJ1Y3QgZHZiX3JpbmdidWZmZXIKKyAqIEBidWY6IHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB3aGVyZSB0aGUgZGF0YSB3aWxsIGJlIHN0b3JlZAorICogQGxlbjogYnl0ZXMgZnJvbSByaW5nIGJ1ZmZlciBpbnRvIEBidWYKKyAqCisgKiBUaGlzIHZhcmlhbnQgYXNzdW1lcyB0aGF0IHRoZSBidWZmZXIgaXMgYSBtZW1vcnkgYXQgdGhlIHVzZXJzcGFjZS4gU28sCisgKiBpdCB3aWxsIGludGVybmFsbHkgY2FsbCBjb3B5X3RvX3VzZXIoKS4KKyAqCisgKiBSZXR1cm46IG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCBvciAtRUZBVUxUCisgKi8KK2V4dGVybiBzc2l6ZV90IGR2Yl9yaW5nYnVmZmVyX3JlYWRfdXNlcihzdHJ1Y3QgZHZiX3JpbmdidWZmZXIgKnJidWYsCisJCQkJICAgdTggX191c2VyICpidWYsIHNpemVfdCBsZW4pOworCisvKioKKyAqIGR2Yl9yaW5nYnVmZmVyX3JlYWQgLSBSZWFkcyBhIGJ1ZmZlciBpbnRvIGEgcG9pbnRlcgorICoKKyAqIEByYnVmOiBwb2ludGVyIHRvIHN0cnVjdCBkdmJfcmluZ2J1ZmZlcgorICogQGJ1ZjogcG9pbnRlciB0byB0aGUgYnVmZmVyIHdoZXJlIHRoZSBkYXRhIHdpbGwgYmUgc3RvcmVkCisgKiBAbGVuOiBieXRlcyBmcm9tIHJpbmcgYnVmZmVyIGludG8gQGJ1ZgorICoKKyAqIFRoaXMgdmFyaWFudCBhc3N1bWVzIHRoYXQgdGhlIGJ1ZmZlciBpcyBhIG1lbW9yeSBhdCB0aGUgS2VybmVsIHNwYWNlCisgKgorICogUmV0dXJuOiBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQgb3IgLUVGQVVMVAorICovCitleHRlcm4gdm9pZCBkdmJfcmluZ2J1ZmZlcl9yZWFkKHN0cnVjdCBkdmJfcmluZ2J1ZmZlciAqcmJ1ZiwKKwkJCQkgICB1OCAqYnVmLCBzaXplX3QgbGVuKTsKKworLyoKKyAqIHdyaXRlIHJvdXRpbmVzICYgbWFjcm9zCisgKi8KKworLyoqCisgKiBEVkJfUklOR0JVRkZFUl9XUklURV9CWVRFIC0gd3JpdGUgc2luZ2xlIGJ5dGUgdG8gcmluZyBidWZmZXIKKyAqCisgKiBAcmJ1ZjogcG9pbnRlciB0byBzdHJ1Y3QgZHZiX3JpbmdidWZmZXIKKyAqIEBieXRlOiBieXRlIHRvIHdyaXRlCisgKi8KKyNkZWZpbmUgRFZCX1JJTkdCVUZGRVJfV1JJVEVfQllURShyYnVmLCBieXRlKQlcCisJCQl7IChyYnVmKS0+ZGF0YVsocmJ1ZiktPnB3cml0ZV0gPSAoYnl0ZSk7IFwKKwkJCShyYnVmKS0+cHdyaXRlID0gKChyYnVmKS0+cHdyaXRlICsgMSkgJSAocmJ1ZiktPnNpemU7IH0KKworLyoqCisgKiBkdmJfcmluZ2J1ZmZlcl93cml0ZSAtIFdyaXRlcyBhIGJ1ZmZlciBpbnRvIHRoZSByaW5nYnVmZmVyCisgKgorICogQHJidWY6IHBvaW50ZXIgdG8gc3RydWN0IGR2Yl9yaW5nYnVmZmVyCisgKiBAYnVmOiBwb2ludGVyIHRvIHRoZSBidWZmZXIgd2hlcmUgdGhlIGRhdGEgd2lsbCBiZSByZWFkCisgKiBAbGVuOiBieXRlcyBmcm9tIHJpbmcgYnVmZmVyIGludG8gQGJ1ZgorICoKKyAqIFRoaXMgdmFyaWFudCBhc3N1bWVzIHRoYXQgdGhlIGJ1ZmZlciBpcyBhIG1lbW9yeSBhdCB0aGUgS2VybmVsIHNwYWNlCisgKgorICogcmV0dXJuOiBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQgb3IgLUVGQVVMVAorICovCitleHRlcm4gc3NpemVfdCBkdmJfcmluZ2J1ZmZlcl93cml0ZShzdHJ1Y3QgZHZiX3JpbmdidWZmZXIgKnJidWYsIGNvbnN0IHU4ICpidWYsCisJCQkJICAgIHNpemVfdCBsZW4pOworCisvKioKKyAqIGR2Yl9yaW5nYnVmZmVyX3dyaXRlX3VzZXIgLSBXcml0ZXMgYSBidWZmZXIgcmVjZWl2ZWQgdmlhIGFuIHVzZXIgcG9pbnRlcgorICoKKyAqIEByYnVmOiBwb2ludGVyIHRvIHN0cnVjdCBkdmJfcmluZ2J1ZmZlcgorICogQGJ1ZjogcG9pbnRlciB0byB0aGUgYnVmZmVyIHdoZXJlIHRoZSBkYXRhIHdpbGwgYmUgcmVhZAorICogQGxlbjogYnl0ZXMgZnJvbSByaW5nIGJ1ZmZlciBpbnRvIEBidWYKKyAqCisgKiBUaGlzIHZhcmlhbnQgYXNzdW1lcyB0aGF0IHRoZSBidWZmZXIgaXMgYSBtZW1vcnkgYXQgdGhlIHVzZXJzcGFjZS4gU28sCisgKiBpdCB3aWxsIGludGVybmFsbHkgY2FsbCBjb3B5X2Zyb21fdXNlcigpLgorICoKKyAqIFJldHVybjogbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIG9yIC1FRkFVTFQKKyAqLworZXh0ZXJuIHNzaXplX3QgZHZiX3JpbmdidWZmZXJfd3JpdGVfdXNlcihzdHJ1Y3QgZHZiX3JpbmdidWZmZXIgKnJidWYsCisJCQkJCSBjb25zdCB1OCBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbik7CisKKy8qKgorICogZHZiX3JpbmdidWZmZXJfcGt0X3dyaXRlIC0gV3JpdGUgYSBwYWNrZXQgaW50byB0aGUgcmluZ2J1ZmZlci4KKyAqCisgKiBAcmJ1ZjogUmluZ2J1ZmZlciB0byB3cml0ZSB0by4KKyAqIEBidWY6IEJ1ZmZlciB0byB3cml0ZS4KKyAqIEBsZW46IExlbmd0aCBvZiBidWZmZXIgKGN1cnJlbnRseSBsaW1pdGVkIHRvIDY1NTM1IGJ5dGVzIG1heCkuCisgKgorICogUmV0dXJuOiBOdW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwgb3IgLUVGQVVMVCwgLUVOT01FTSwgLUVWSU5BTC4KKyAqLworZXh0ZXJuIHNzaXplX3QgZHZiX3JpbmdidWZmZXJfcGt0X3dyaXRlKHN0cnVjdCBkdmJfcmluZ2J1ZmZlciAqcmJ1ZiwgdTggKmJ1ZiwKKwkJCQkJc2l6ZV90IGxlbik7CisKKy8qKgorICogZHZiX3JpbmdidWZmZXJfcGt0X3JlYWRfdXNlciAtIFJlYWQgZnJvbSBhIHBhY2tldCBpbiB0aGUgcmluZ2J1ZmZlci4KKyAqCisgKiBAcmJ1ZjogUmluZ2J1ZmZlciBjb25jZXJuZWQuCisgKiBAaWR4OiBQYWNrZXQgaW5kZXggYXMgcmV0dXJuZWQgYnkgZHZiX3JpbmdidWZmZXJfcGt0X25leHQoKS4KKyAqIEBvZmZzZXQ6IE9mZnNldCBpbnRvIHBhY2tldCB0byByZWFkIGZyb20uCisgKiBAYnVmOiBEZXN0aW5hdGlvbiBidWZmZXIgZm9yIGRhdGEuCisgKiBAbGVuOiBTaXplIG9mIGRlc3RpbmF0aW9uIGJ1ZmZlci4KKyAqCisgKiBSZXR1cm46IE51bWJlciBvZiBieXRlcyByZWFkLCBvciAtRUZBVUxULgorICoKKyAqIC4uIG5vdGU6OgorICoKKyAqICAgIHVubGlrZSBkdmJfcmluZ2J1ZmZlcl9yZWFkKCksIHRoaXMgZG9lcyAqKk5PVCoqIHVwZGF0ZSB0aGUgcmVhZCBwb2ludGVyCisgKiAgICBpbiB0aGUgcmluZ2J1ZmZlci4gWW91IG11c3QgdXNlIGR2Yl9yaW5nYnVmZmVyX3BrdF9kaXNwb3NlKCkgdG8gbWFyayBhCisgKiAgICBwYWNrZXQgYXMgbm8gbG9uZ2VyIHJlcXVpcmVkLgorICovCitleHRlcm4gc3NpemVfdCBkdmJfcmluZ2J1ZmZlcl9wa3RfcmVhZF91c2VyKHN0cnVjdCBkdmJfcmluZ2J1ZmZlciAqcmJ1ZiwKKwkJCQkJICAgIHNpemVfdCBpZHgsCisJCQkJCSAgICBpbnQgb2Zmc2V0LCB1OCBfX3VzZXIgKmJ1ZiwKKwkJCQkJICAgIHNpemVfdCBsZW4pOworCisvKioKKyAqIGR2Yl9yaW5nYnVmZmVyX3BrdF9yZWFkIC0gUmVhZCBmcm9tIGEgcGFja2V0IGluIHRoZSByaW5nYnVmZmVyLgorICogTm90ZTogdW5saWtlIGR2Yl9yaW5nYnVmZmVyX3JlYWRfdXNlcigpLCB0aGlzIERPRVMgdXBkYXRlIHRoZSByZWFkIHBvaW50ZXIKKyAqIGluIHRoZSByaW5nYnVmZmVyLgorICoKKyAqIEByYnVmOiBSaW5nYnVmZmVyIGNvbmNlcm5lZC4KKyAqIEBpZHg6IFBhY2tldCBpbmRleCBhcyByZXR1cm5lZCBieSBkdmJfcmluZ2J1ZmZlcl9wa3RfbmV4dCgpLgorICogQG9mZnNldDogT2Zmc2V0IGludG8gcGFja2V0IHRvIHJlYWQgZnJvbS4KKyAqIEBidWY6IERlc3RpbmF0aW9uIGJ1ZmZlciBmb3IgZGF0YS4KKyAqIEBsZW46IFNpemUgb2YgZGVzdGluYXRpb24gYnVmZmVyLgorICoKKyAqIFJldHVybjogTnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIC1FRkFVTFQuCisgKi8KK2V4dGVybiBzc2l6ZV90IGR2Yl9yaW5nYnVmZmVyX3BrdF9yZWFkKHN0cnVjdCBkdmJfcmluZ2J1ZmZlciAqcmJ1Ziwgc2l6ZV90IGlkeCwKKwkJCQkgICAgICAgaW50IG9mZnNldCwgdTggKmJ1Ziwgc2l6ZV90IGxlbik7CisKKy8qKgorICogZHZiX3JpbmdidWZmZXJfcGt0X2Rpc3Bvc2UgLSBEaXNwb3NlIG9mIGEgcGFja2V0IGluIHRoZSByaW5nIGJ1ZmZlci4KKyAqCisgKiBAcmJ1ZjogUmluZyBidWZmZXIgY29uY2VybmVkLgorICogQGlkeDogUGFja2V0IGluZGV4IGFzIHJldHVybmVkIGJ5IGR2Yl9yaW5nYnVmZmVyX3BrdF9uZXh0KCkuCisgKi8KK2V4dGVybiB2b2lkIGR2Yl9yaW5nYnVmZmVyX3BrdF9kaXNwb3NlKHN0cnVjdCBkdmJfcmluZ2J1ZmZlciAqcmJ1Ziwgc2l6ZV90IGlkeCk7CisKKy8qKgorICogZHZiX3JpbmdidWZmZXJfcGt0X25leHQgLSBHZXQgdGhlIGluZGV4IG9mIHRoZSBuZXh0IHBhY2tldCBpbiBhIHJpbmdidWZmZXIuCisgKgorICogQHJidWY6IFJpbmdidWZmZXIgY29uY2VybmVkLgorICogQGlkeDogUHJldmlvdXMgcGFja2V0IGluZGV4LCBvciAtMSB0byByZXR1cm4gdGhlIGZpcnN0IHBhY2tldCBpbmRleC4KKyAqIEBwa3RsZW46IE9uIHN1Y2Nlc3MsIHdpbGwgYmUgdXBkYXRlZCB0byBjb250YWluIHRoZSBsZW5ndGggb2YgdGhlIHBhY2tldAorICogICAgICAgICAgaW4gYnl0ZXMuCisgKiByZXR1cm5zIFBhY2tldCBpbmRleCAoaWYgPj0wKSwgb3IgLTEgaWYgbm8gcGFja2V0cyBhdmFpbGFibGUuCisgKi8KK2V4dGVybiBzc2l6ZV90IGR2Yl9yaW5nYnVmZmVyX3BrdF9uZXh0KHN0cnVjdCBkdmJfcmluZ2J1ZmZlciAqcmJ1ZiwKKwkJCQkgICAgICAgc2l6ZV90IGlkeCwgc2l6ZV90ICpwa3RsZW4pOworCisjZW5kaWYgLyogX0RWQl9SSU5HQlVGRkVSX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L3VzYi9DT1BZSU5HLkxFU1NFUiBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvdXNiL0NPUFlJTkcuTEVTU0VSCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNGE4NjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L3VzYi9DT1BZSU5HLkxFU1NFUgpAQCAtMCwwICsxLDQ5OSBAQAorICAgICAgICAgICAgICAgICAgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4xLCBGZWJydWFyeSAxOTk5CisKKyBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKK1tUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlZCB2ZXJzaW9uIG9mIHRoZSBMZXNzZXIgR1BMLiAgSXQgYWxzbyBjb3VudHMKKyBhcyB0aGUgc3VjY2Vzc29yIG9mIHRoZSBHTlUgTGlicmFyeSBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBoZW5jZQorIHRoZSB2ZXJzaW9uIG51bWJlciAyLjEuXQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQorZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgorCisgIFRoaXMgbGljZW5zZSwgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIHNvbWUKK3NwZWNpYWxseSBkZXNpZ25hdGVkIHNvZnR3YXJlIHBhY2thZ2VzLS10eXBpY2FsbHkgbGlicmFyaWVzLS1vZiB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgb3RoZXIgYXV0aG9ycyB3aG8gZGVjaWRlIHRvIHVzZSBpdC4gIFlvdQorY2FuIHVzZSBpdCB0b28sIGJ1dCB3ZSBzdWdnZXN0IHlvdSBmaXJzdCB0aGluayBjYXJlZnVsbHkgYWJvdXQgd2hldGhlcgordGhpcyBsaWNlbnNlIG9yIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIHRoZSBiZXR0ZXIKK3N0cmF0ZWd5IHRvIHVzZSBpbiBhbnkgcGFydGljdWxhciBjYXNlLCBiYXNlZCBvbiB0aGUgZXhwbGFuYXRpb25zIGJlbG93LgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tIG9mIHVzZSwKK25vdCBwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQKK3lvdSBoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UKK2ZvciB0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpOyB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQKK2l0IGlmIHlvdSB3YW50IGl0OyB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBhbmQgdXNlIHBpZWNlcyBvZgoraXQgaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBhcmUgaW5mb3JtZWQgdGhhdCB5b3UgY2FuIGRvCit0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorZGlzdHJpYnV0b3JzIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGVzZQorcmlnaHRzLiAgVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yCit5b3UgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5IG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgd2hldGhlciBncmF0aXMKK29yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHdlIGdhdmUKK3lvdS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UKK2NvZGUuICBJZiB5b3UgbGluayBvdGhlciBjb2RlIHdpdGggdGhlIGxpYnJhcnksIHlvdSBtdXN0IHByb3ZpZGUKK2NvbXBsZXRlIG9iamVjdCBmaWxlcyB0byB0aGUgcmVjaXBpZW50cywgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQord2l0aCB0aGUgbGlicmFyeSBhZnRlciBtYWtpbmcgY2hhbmdlcyB0byB0aGUgbGlicmFyeSBhbmQgcmVjb21waWxpbmcKK2l0LiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIgcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCBhIHR3by1zdGVwIG1ldGhvZDogKDEpIHdlIGNvcHlyaWdodCB0aGUKK2xpYnJhcnksIGFuZCAoMikgd2Ugb2ZmZXIgeW91IHRoaXMgbGljZW5zZSwgd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsCitwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgbGlicmFyeS4KKworICBUbyBwcm90ZWN0IGVhY2ggZGlzdHJpYnV0b3IsIHdlIHdhbnQgdG8gbWFrZSBpdCB2ZXJ5IGNsZWFyIHRoYXQKK3RoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGUgZnJlZSBsaWJyYXJ5LiAgQWxzbywgaWYgdGhlIGxpYnJhcnkgaXMKK21vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB0aGUgcmVjaXBpZW50cyBzaG91bGQga25vdwordGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsIHZlcnNpb24sIHNvIHRoYXQgdGhlIG9yaWdpbmFsCithdXRob3IncyByZXB1dGF0aW9uIHdpbGwgbm90IGJlIGFmZmVjdGVkIGJ5IHByb2JsZW1zIHRoYXQgbWlnaHQgYmUKK2ludHJvZHVjZWQgYnkgb3RoZXJzLgorCisgIEZpbmFsbHksIHNvZnR3YXJlIHBhdGVudHMgcG9zZSBhIGNvbnN0YW50IHRocmVhdCB0byB0aGUgZXhpc3RlbmNlIG9mCithbnkgZnJlZSBwcm9ncmFtLiAgV2Ugd2lzaCB0byBtYWtlIHN1cmUgdGhhdCBhIGNvbXBhbnkgY2Fubm90CitlZmZlY3RpdmVseSByZXN0cmljdCB0aGUgdXNlcnMgb2YgYSBmcmVlIHByb2dyYW0gYnkgb2J0YWluaW5nIGEKK3Jlc3RyaWN0aXZlIGxpY2Vuc2UgZnJvbSBhIHBhdGVudCBob2xkZXIuICBUaGVyZWZvcmUsIHdlIGluc2lzdCB0aGF0CithbnkgcGF0ZW50IGxpY2Vuc2Ugb2J0YWluZWQgZm9yIGEgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBtdXN0IGJlCitjb25zaXN0ZW50IHdpdGggdGhlIGZ1bGwgZnJlZWRvbSBvZiB1c2Ugc3BlY2lmaWVkIGluIHRoaXMgbGljZW5zZS4KKworICBNb3N0IEdOVSBzb2Z0d2FyZSwgaW5jbHVkaW5nIHNvbWUgbGlicmFyaWVzLCBpcyBjb3ZlcmVkIGJ5IHRoZQorb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIGxpY2Vuc2UsIHRoZSBHTlUgTGVzc2VyCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIGNlcnRhaW4gZGVzaWduYXRlZCBsaWJyYXJpZXMsIGFuZAoraXMgcXVpdGUgZGlmZmVyZW50IGZyb20gdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBXZSB1c2UKK3RoaXMgbGljZW5zZSBmb3IgY2VydGFpbiBsaWJyYXJpZXMgaW4gb3JkZXIgdG8gcGVybWl0IGxpbmtpbmcgdGhvc2UKK2xpYnJhcmllcyBpbnRvIG5vbi1mcmVlIHByb2dyYW1zLgorCisgIFdoZW4gYSBwcm9ncmFtIGlzIGxpbmtlZCB3aXRoIGEgbGlicmFyeSwgd2hldGhlciBzdGF0aWNhbGx5IG9yIHVzaW5nCithIHNoYXJlZCBsaWJyYXJ5LCB0aGUgY29tYmluYXRpb24gb2YgdGhlIHR3byBpcyBsZWdhbGx5IHNwZWFraW5nIGEKK2NvbWJpbmVkIHdvcmssIGEgZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgbGlicmFyeS4gIFRoZSBvcmRpbmFyeQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB0aGVyZWZvcmUgcGVybWl0cyBzdWNoIGxpbmtpbmcgb25seSBpZiB0aGUKK2VudGlyZSBjb21iaW5hdGlvbiBmaXRzIGl0cyBjcml0ZXJpYSBvZiBmcmVlZG9tLiAgVGhlIExlc3NlciBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBwZXJtaXRzIG1vcmUgbGF4IGNyaXRlcmlhIGZvciBsaW5raW5nIG90aGVyIGNvZGUgd2l0aAordGhlIGxpYnJhcnkuCisKKyAgV2UgY2FsbCB0aGlzIGxpY2Vuc2UgdGhlICJMZXNzZXIiIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYmVjYXVzZSBpdAorZG9lcyBMZXNzIHRvIHByb3RlY3QgdGhlIHVzZXIncyBmcmVlZG9tIHRoYW4gdGhlIG9yZGluYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlLiAgSXQgYWxzbyBwcm92aWRlcyBvdGhlciBmcmVlIHNvZnR3YXJlIGRldmVsb3BlcnMgTGVzcworb2YgYW4gYWR2YW50YWdlIG92ZXIgY29tcGV0aW5nIG5vbi1mcmVlIHByb2dyYW1zLiAgVGhlc2UgZGlzYWR2YW50YWdlcworYXJlIHRoZSByZWFzb24gd2UgdXNlIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtYW55CitsaWJyYXJpZXMuICBIb3dldmVyLCB0aGUgTGVzc2VyIGxpY2Vuc2UgcHJvdmlkZXMgYWR2YW50YWdlcyBpbiBjZXJ0YWluCitzcGVjaWFsIGNpcmN1bXN0YW5jZXMuCisKKyAgRm9yIGV4YW1wbGUsIG9uIHJhcmUgb2NjYXNpb25zLCB0aGVyZSBtYXkgYmUgYSBzcGVjaWFsIG5lZWQgdG8KK2VuY291cmFnZSB0aGUgd2lkZXN0IHBvc3NpYmxlIHVzZSBvZiBhIGNlcnRhaW4gbGlicmFyeSwgc28gdGhhdCBpdCBiZWNvbWVzCithIGRlLWZhY3RvIHN0YW5kYXJkLiAgVG8gYWNoaWV2ZSB0aGlzLCBub24tZnJlZSBwcm9ncmFtcyBtdXN0IGJlCithbGxvd2VkIHRvIHVzZSB0aGUgbGlicmFyeS4gIEEgbW9yZSBmcmVxdWVudCBjYXNlIGlzIHRoYXQgYSBmcmVlCitsaWJyYXJ5IGRvZXMgdGhlIHNhbWUgam9iIGFzIHdpZGVseSB1c2VkIG5vbi1mcmVlIGxpYnJhcmllcy4gIEluIHRoaXMKK2Nhc2UsIHRoZXJlIGlzIGxpdHRsZSB0byBnYWluIGJ5IGxpbWl0aW5nIHRoZSBmcmVlIGxpYnJhcnkgdG8gZnJlZQorc29mdHdhcmUgb25seSwgc28gd2UgdXNlIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworICBJbiBvdGhlciBjYXNlcywgcGVybWlzc2lvbiB0byB1c2UgYSBwYXJ0aWN1bGFyIGxpYnJhcnkgaW4gbm9uLWZyZWUKK3Byb2dyYW1zIGVuYWJsZXMgYSBncmVhdGVyIG51bWJlciBvZiBwZW9wbGUgdG8gdXNlIGEgbGFyZ2UgYm9keSBvZgorZnJlZSBzb2Z0d2FyZS4gIEZvciBleGFtcGxlLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgR05VIEMgTGlicmFyeSBpbgorbm9uLWZyZWUgcHJvZ3JhbXMgZW5hYmxlcyBtYW55IG1vcmUgcGVvcGxlIHRvIHVzZSB0aGUgd2hvbGUgR05VCitvcGVyYXRpbmcgc3lzdGVtLCBhcyB3ZWxsIGFzIGl0cyB2YXJpYW50LCB0aGUgR05VL0xpbnV4IG9wZXJhdGluZworc3lzdGVtLgorCisgIEFsdGhvdWdoIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBMZXNzIHByb3RlY3RpdmUgb2YgdGhlCit1c2VycycgZnJlZWRvbSwgaXQgZG9lcyBlbnN1cmUgdGhhdCB0aGUgdXNlciBvZiBhIHByb2dyYW0gdGhhdCBpcworbGlua2VkIHdpdGggdGhlIExpYnJhcnkgaGFzIHRoZSBmcmVlZG9tIGFuZCB0aGUgd2hlcmV3aXRoYWwgdG8gcnVuCit0aGF0IHByb2dyYW0gdXNpbmcgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5LgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LiAgUGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEKKyJ3b3JrIGJhc2VkIG9uIHRoZSBsaWJyYXJ5IiBhbmQgYSAid29yayB0aGF0IHVzZXMgdGhlIGxpYnJhcnkiLiAgVGhlCitmb3JtZXIgY29udGFpbnMgY29kZSBkZXJpdmVkIGZyb20gdGhlIGxpYnJhcnksIHdoZXJlYXMgdGhlIGxhdHRlciBtdXN0CitiZSBjb21iaW5lZCB3aXRoIHRoZSBsaWJyYXJ5IGluIG9yZGVyIHRvIHJ1bi4KKworICAgICAgICAgICAgICAgICAgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgb3Igb3RoZXIKK3Byb2dyYW0gd2hpY2ggY29udGFpbnMgYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9yCitvdGhlciBhdXRob3JpemVkIHBhcnR5IHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mCit0aGlzIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChhbHNvIGNhbGxlZCAidGhpcyBMaWNlbnNlIikuCitFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworICBBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhCitwcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKKyh3aGljaCB1c2Ugc29tZSBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIGRhdGEpIHRvIGZvcm0gZXhlY3V0YWJsZXMuCisKKyAgVGhlICJMaWJyYXJ5IiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKK3doaWNoIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZXNlIHRlcm1zLiAgQSAid29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyCitjb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYQorcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZAorc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcworaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikKKworICAiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucworYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQKK2ludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbgorYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4KKworICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyBhIHByb2dyYW0gdXNpbmcgdGhlIExpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCBvdXRwdXQgZnJvbQorc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZAorb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvcgord3JpdGluZyBpdCkuICBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIExpYnJhcnkgZG9lcworYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgTGlicmFyeSdzCitjb21wbGV0ZSBzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdAoreW91IGNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4KK2FwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0CithbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueQord2FycmFudHk7IGFuZCBkaXN0cmlidXRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUKK0xpYnJhcnkuCisKKyAgWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwKK2FuZCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEKK2ZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBMaWJyYXJ5IG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBUaGUgbW9kaWZpZWQgd29yayBtdXN0IGl0c2VsZiBiZSBhIHNvZnR3YXJlIGxpYnJhcnkuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSB0aGUgZmlsZXMgbW9kaWZpZWQgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYykgWW91IG11c3QgY2F1c2UgdGhlIHdob2xlIG9mIHRoZSB3b3JrIHRvIGJlIGxpY2Vuc2VkIGF0IG5vCisgICAgY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBkKSBJZiBhIGZhY2lsaXR5IGluIHRoZSBtb2RpZmllZCBMaWJyYXJ5IHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIGEKKyAgICB0YWJsZSBvZiBkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB1c2VzCisgICAgdGhlIGZhY2lsaXR5LCBvdGhlciB0aGFuIGFzIGFuIGFyZ3VtZW50IHBhc3NlZCB3aGVuIHRoZSBmYWNpbGl0eQorICAgIGlzIGludm9rZWQsIHRoZW4geW91IG11c3QgbWFrZSBhIGdvb2QgZmFpdGggZWZmb3J0IHRvIGVuc3VyZSB0aGF0LAorICAgIGluIHRoZSBldmVudCBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgc3VjaCBmdW5jdGlvbiBvcgorICAgIHRhYmxlLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3JtcyB3aGF0ZXZlciBwYXJ0IG9mCisgICAgaXRzIHB1cnBvc2UgcmVtYWlucyBtZWFuaW5nZnVsLgorCisgICAgKEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uIGluIGEgbGlicmFyeSB0byBjb21wdXRlIHNxdWFyZSByb290cyBoYXMKKyAgICBhIHB1cnBvc2UgdGhhdCBpcyBlbnRpcmVseSB3ZWxsLWRlZmluZWQgaW5kZXBlbmRlbnQgb2YgdGhlCisgICAgYXBwbGljYXRpb24uICBUaGVyZWZvcmUsIFN1YnNlY3Rpb24gMmQgcmVxdWlyZXMgdGhhdCBhbnkKKyAgICBhcHBsaWNhdGlvbi1zdXBwbGllZCBmdW5jdGlvbiBvciB0YWJsZSB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gbXVzdAorICAgIGJlIG9wdGlvbmFsOiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IGl0LCB0aGUgc3F1YXJlCisgICAgcm9vdCBmdW5jdGlvbiBtdXN0IHN0aWxsIGNvbXB1dGUgc3F1YXJlIHJvb3RzLikKKworVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgTGlicmFyeSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBMaWJyYXJ5LCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZQoraXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIExpYnJhcnkuCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIExpYnJhcnkKK3dpdGggdGhlIExpYnJhcnkgKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5KSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBvcHQgdG8gYXBwbHkgdGhlIHRlcm1zIG9mIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UgdG8gYSBnaXZlbiBjb3B5IG9mIHRoZSBMaWJyYXJ5LiAgVG8gZG8KK3RoaXMsIHlvdSBtdXN0IGFsdGVyIGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSwgc28KK3RoYXQgdGhleSByZWZlciB0byB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwKK2luc3RlYWQgb2YgdG8gdGhpcyBMaWNlbnNlLiAgKElmIGEgbmV3ZXIgdmVyc2lvbiB0aGFuIHZlcnNpb24gMiBvZiB0aGUKK29yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGhhcyBhcHBlYXJlZCwgdGhlbiB5b3UgY2FuIHNwZWNpZnkKK3RoYXQgdmVyc2lvbiBpbnN0ZWFkIGlmIHlvdSB3aXNoLikgIERvIG5vdCBtYWtlIGFueSBvdGhlciBjaGFuZ2UgaW4KK3RoZXNlIG5vdGljZXMuCisKKyAgT25jZSB0aGlzIGNoYW5nZSBpcyBtYWRlIGluIGEgZ2l2ZW4gY29weSwgaXQgaXMgaXJyZXZlcnNpYmxlIGZvcgordGhhdCBjb3B5LCBzbyB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBhbGwKK3N1YnNlcXVlbnQgY29waWVzIGFuZCBkZXJpdmF0aXZlIHdvcmtzIG1hZGUgZnJvbSB0aGF0IGNvcHkuCisKKyAgVGhpcyBvcHRpb24gaXMgdXNlZnVsIHdoZW4geW91IHdpc2ggdG8gY29weSBwYXJ0IG9mIHRoZSBjb2RlIG9mCit0aGUgTGlicmFyeSBpbnRvIGEgcHJvZ3JhbSB0aGF0IGlzIG5vdCBhIGxpYnJhcnkuCisKKyAgNC4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhIHBvcnRpb24gb3IKK2Rlcml2YXRpdmUgb2YgaXQsIHVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtCit1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhY2NvbXBhbnkKK2l0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSwgd2hpY2gKK211c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYQorbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLgorCisgIElmIGRpc3RyaWJ1dGlvbiBvZiBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Citmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZQorc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50IHRvCitkaXN0cmlidXRlIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorCisgIDUuIEEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIG5vIGRlcml2YXRpdmUgb2YgYW55IHBvcnRpb24gb2YgdGhlCitMaWJyYXJ5LCBidXQgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIHRoZSBMaWJyYXJ5IGJ5IGJlaW5nIGNvbXBpbGVkIG9yCitsaW5rZWQgd2l0aCBpdCwgaXMgY2FsbGVkIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5Ii4gIFN1Y2ggYQord29yaywgaW4gaXNvbGF0aW9uLCBpcyBub3QgYSBkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnksIGFuZAordGhlcmVmb3JlIGZhbGxzIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICBIb3dldmVyLCBsaW5raW5nIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5CitjcmVhdGVzIGFuIGV4ZWN1dGFibGUgdGhhdCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnkgKGJlY2F1c2UgaXQKK2NvbnRhaW5zIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5KSwgcmF0aGVyIHRoYW4gYSAid29yayB0aGF0IHVzZXMgdGhlCitsaWJyYXJ5Ii4gIFRoZSBleGVjdXRhYmxlIGlzIHRoZXJlZm9yZSBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZS4KK1NlY3Rpb24gNiBzdGF0ZXMgdGVybXMgZm9yIGRpc3RyaWJ1dGlvbiBvZiBzdWNoIGV4ZWN1dGFibGVzLgorCisgIFdoZW4gYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHVzZXMgbWF0ZXJpYWwgZnJvbSBhIGhlYWRlciBmaWxlCit0aGF0IGlzIHBhcnQgb2YgdGhlIExpYnJhcnksIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgbWF5IGJlIGEKK2Rlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSBldmVuIHRob3VnaCB0aGUgc291cmNlIGNvZGUgaXMgbm90LgorV2hldGhlciB0aGlzIGlzIHRydWUgaXMgZXNwZWNpYWxseSBzaWduaWZpY2FudCBpZiB0aGUgd29yayBjYW4gYmUKK2xpbmtlZCB3aXRob3V0IHRoZSBMaWJyYXJ5LCBvciBpZiB0aGUgd29yayBpcyBpdHNlbGYgYSBsaWJyYXJ5LiAgVGhlCit0aHJlc2hvbGQgZm9yIHRoaXMgdG8gYmUgdHJ1ZSBpcyBub3QgcHJlY2lzZWx5IGRlZmluZWQgYnkgbGF3LgorCisgIElmIHN1Y2ggYW4gb2JqZWN0IGZpbGUgdXNlcyBvbmx5IG51bWVyaWNhbCBwYXJhbWV0ZXJzLCBkYXRhCitzdHJ1Y3R1cmUgbGF5b3V0cyBhbmQgYWNjZXNzb3JzLCBhbmQgc21hbGwgbWFjcm9zIGFuZCBzbWFsbCBpbmxpbmUKK2Z1bmN0aW9ucyAodGVuIGxpbmVzIG9yIGxlc3MgaW4gbGVuZ3RoKSwgdGhlbiB0aGUgdXNlIG9mIHRoZSBvYmplY3QKK2ZpbGUgaXMgdW5yZXN0cmljdGVkLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgbGVnYWxseSBhIGRlcml2YXRpdmUKK3dvcmsuICAoRXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGlzIG9iamVjdCBjb2RlIHBsdXMgcG9ydGlvbnMgb2YgdGhlCitMaWJyYXJ5IHdpbGwgc3RpbGwgZmFsbCB1bmRlciBTZWN0aW9uIDYuKQorCisgIE90aGVyd2lzZSwgaWYgdGhlIHdvcmsgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5LCB5b3UgbWF5CitkaXN0cmlidXRlIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gNi4KK0FueSBleGVjdXRhYmxlcyBjb250YWluaW5nIHRoYXQgd29yayBhbHNvIGZhbGwgdW5kZXIgU2VjdGlvbiA2LAord2hldGhlciBvciBub3QgdGhleSBhcmUgbGlua2VkIGRpcmVjdGx5IHdpdGggdGhlIExpYnJhcnkgaXRzZWxmLgorCisgIDYuIEFzIGFuIGV4Y2VwdGlvbiB0byB0aGUgU2VjdGlvbnMgYWJvdmUsIHlvdSBtYXkgYWxzbyBjb21iaW5lIG9yCitsaW5rIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYQord29yayBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsKK3VuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHRoZSB0ZXJtcyBwZXJtaXQKK21vZGlmaWNhdGlvbiBvZiB0aGUgd29yayBmb3IgdGhlIGN1c3RvbWVyJ3Mgb3duIHVzZSBhbmQgcmV2ZXJzZQorZW5naW5lZXJpbmcgZm9yIGRlYnVnZ2luZyBzdWNoIG1vZGlmaWNhdGlvbnMuCisKKyAgWW91IG11c3QgZ2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggZWFjaCBjb3B5IG9mIHRoZSB3b3JrIHRoYXQgdGhlCitMaWJyYXJ5IGlzIHVzZWQgaW4gaXQgYW5kIHRoYXQgdGhlIExpYnJhcnkgYW5kIGl0cyB1c2UgYXJlIGNvdmVyZWQgYnkKK3RoaXMgTGljZW5zZS4gIFlvdSBtdXN0IHN1cHBseSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgSWYgdGhlIHdvcmsKK2R1cmluZyBleGVjdXRpb24gZGlzcGxheXMgY29weXJpZ2h0IG5vdGljZXMsIHlvdSBtdXN0IGluY2x1ZGUgdGhlCitjb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgTGlicmFyeSBhbW9uZyB0aGVtLCBhcyB3ZWxsIGFzIGEgcmVmZXJlbmNlCitkaXJlY3RpbmcgdGhlIHVzZXIgdG8gdGhlIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgQWxzbywgeW91IG11c3QgZG8gb25lCitvZiB0aGVzZSB0aGluZ3M6CisKKyAgICBhKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZworICAgIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUgZm9yIHRoZSBMaWJyYXJ5IGluY2x1ZGluZyB3aGF0ZXZlcgorICAgIGNoYW5nZXMgd2VyZSB1c2VkIGluIHRoZSB3b3JrICh3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyCisgICAgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSk7IGFuZCwgaWYgdGhlIHdvcmsgaXMgYW4gZXhlY3V0YWJsZSBsaW5rZWQKKyAgICB3aXRoIHRoZSBMaWJyYXJ5LCB3aXRoIHRoZSBjb21wbGV0ZSBtYWNoaW5lLXJlYWRhYmxlICJ3b3JrIHRoYXQKKyAgICB1c2VzIHRoZSBMaWJyYXJ5IiwgYXMgb2JqZWN0IGNvZGUgYW5kL29yIHNvdXJjZSBjb2RlLCBzbyB0aGF0IHRoZQorICAgIHVzZXIgY2FuIG1vZGlmeSB0aGUgTGlicmFyeSBhbmQgdGhlbiByZWxpbmsgdG8gcHJvZHVjZSBhIG1vZGlmaWVkCisgICAgZXhlY3V0YWJsZSBjb250YWluaW5nIHRoZSBtb2RpZmllZCBMaWJyYXJ5LiAgKEl0IGlzIHVuZGVyc3Rvb2QKKyAgICB0aGF0IHRoZSB1c2VyIHdobyBjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiBkZWZpbml0aW9ucyBmaWxlcyBpbiB0aGUKKyAgICBMaWJyYXJ5IHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIGFibGUgdG8gcmVjb21waWxlIHRoZSBhcHBsaWNhdGlvbgorICAgIHRvIHVzZSB0aGUgbW9kaWZpZWQgZGVmaW5pdGlvbnMuKQorCisgICAgYikgVXNlIGEgc3VpdGFibGUgc2hhcmVkIGxpYnJhcnkgbWVjaGFuaXNtIGZvciBsaW5raW5nIHdpdGggdGhlCisgICAgTGlicmFyeS4gIEEgc3VpdGFibGUgbWVjaGFuaXNtIGlzIG9uZSB0aGF0ICgxKSB1c2VzIGF0IHJ1biB0aW1lIGEKKyAgICBjb3B5IG9mIHRoZSBsaWJyYXJ5IGFscmVhZHkgcHJlc2VudCBvbiB0aGUgdXNlcidzIGNvbXB1dGVyIHN5c3RlbSwKKyAgICByYXRoZXIgdGhhbiBjb3B5aW5nIGxpYnJhcnkgZnVuY3Rpb25zIGludG8gdGhlIGV4ZWN1dGFibGUsIGFuZCAoMikKKyAgICB3aWxsIG9wZXJhdGUgcHJvcGVybHkgd2l0aCBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIGlmCisgICAgdGhlIHVzZXIgaW5zdGFsbHMgb25lLCBhcyBsb25nIGFzIHRoZSBtb2RpZmllZCB2ZXJzaW9uIGlzCisgICAgaW50ZXJmYWNlLWNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiB0aGF0IHRoZSB3b3JrIHdhcyBtYWRlIHdpdGguCisKKyAgICBjKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdAorICAgIGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscworICAgIHNwZWNpZmllZCBpbiBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUKKyAgICB0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCisKKyAgICBkKSBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQorICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQorICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KKworICAgIGUpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQorICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgorCisgIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQorTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IKK3JlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLAordGhlIG1hdGVyaWFscyB0byBiZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgaXMKK25vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeSBmb3JtKSB3aXRoIHRoZSBtYWpvcgorY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvbgord2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50IGl0c2VsZiBhY2NvbXBhbmllcwordGhlIGV4ZWN1dGFibGUuCisKKyAgSXQgbWF5IGhhcHBlbiB0aGF0IHRoaXMgcmVxdWlyZW1lbnQgY29udHJhZGljdHMgdGhlIGxpY2Vuc2UKK3Jlc3RyaWN0aW9ucyBvZiBvdGhlciBwcm9wcmlldGFyeSBsaWJyYXJpZXMgdGhhdCBkbyBub3Qgbm9ybWFsbHkKK2FjY29tcGFueSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gIFN1Y2ggYSBjb250cmFkaWN0aW9uIG1lYW5zIHlvdSBjYW5ub3QKK3VzZSBib3RoIHRoZW0gYW5kIHRoZSBMaWJyYXJ5IHRvZ2V0aGVyIGluIGFuIGV4ZWN1dGFibGUgdGhhdCB5b3UKK2Rpc3RyaWJ1dGUuCisKKyAgNy4gWW91IG1heSBwbGFjZSBsaWJyYXJ5IGZhY2lsaXRpZXMgdGhhdCBhcmUgYSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSBzaWRlLWJ5LXNpZGUgaW4gYSBzaW5nbGUgbGlicmFyeSB0b2dldGhlciB3aXRoIG90aGVyIGxpYnJhcnkKK2ZhY2lsaXRpZXMgbm90IGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgY29tYmluZWQKK2xpYnJhcnksIHByb3ZpZGVkIHRoYXQgdGhlIHNlcGFyYXRlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBiYXNlZCBvbgordGhlIExpYnJhcnkgYW5kIG9mIHRoZSBvdGhlciBsaWJyYXJ5IGZhY2lsaXRpZXMgaXMgb3RoZXJ3aXNlCitwZXJtaXR0ZWQsIGFuZCBwcm92aWRlZCB0aGF0IHlvdSBkbyB0aGVzZSB0d28gdGhpbmdzOgorCisgICAgYSkgQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsKKyAgICBiYXNlZCBvbiB0aGUgTGlicmFyeSwgdW5jb21iaW5lZCB3aXRoIGFueSBvdGhlciBsaWJyYXJ5CisgICAgZmFjaWxpdGllcy4gIFRoaXMgbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgICAgU2VjdGlvbnMgYWJvdmUuCisKKyAgICBiKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCB0aGUgY29tYmluZWQgbGlicmFyeSBvZiB0aGUgZmFjdAorICAgIHRoYXQgcGFydCBvZiBpdCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBleHBsYWluaW5nCisgICAgd2hlcmUgdG8gZmluZCB0aGUgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLgorCisgIDguIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvciBkaXN0cmlidXRlCit0aGUgTGlicmFyeSBleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueQorYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yCitkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIKK3JpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuICBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywKK29yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMKK3Rlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA5LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBMaWJyYXJ5IG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDEwLiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5KSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSwgbGluayB3aXRoIG9yIG1vZGlmeSB0aGUgTGlicmFyeQorc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgd2l0aAordGhpcyBMaWNlbnNlLgorCisgIDExLiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkgYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFueQorcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvIGFwcGx5LAorYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKworICAxMi4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBMaWJyYXJ5IGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBMaWJyYXJ5IHVuZGVyIHRoaXMgTGljZW5zZSBtYXkgYWRkCithbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlIGNvdW50cmllcywKK3NvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nIGNvdW50cmllcyBub3QgdGh1cworZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMgdGhlIGxpbWl0YXRpb24gYXMgaWYKK3dyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDEzLiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldwordmVyc2lvbnMgb2YgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgorU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAorYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5CitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKKyJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKK2xpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgIDE0LiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgTGlicmFyeSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBpbmNvbXBhdGlibGUgd2l0aCB0aGVzZSwKK3dyaXRlIHRvIHRoZSBhdXRob3IgdG8gYXNrIGZvciBwZXJtaXNzaW9uLgorV2Ugc29tZXRpbWVzIG1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91cgorZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cworb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcKK2FuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTyBXQVJSQU5UWQorCisgIDE1LiBCRUNBVVNFIFRIRSBMSUJSQVJZIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTworV0FSUkFOVFkgRk9SIFRIRSBMSUJSQVJZLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4KK0VYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SCitPVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIExJQlJBUlkgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQorS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCitJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKK1BVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRQorTElCUkFSWSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgTElCUkFSWSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUKK1RIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxNi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTgorV1JJVElORyBXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkKK0FORC9PUiBSRURJU1RSSUJVVEUgVEhFIExJQlJBUlkgQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VCitGT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SCitDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRQorTElCUkFSWSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORworUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEKK0ZBSUxVUkUgT0YgVEhFIExJQlJBUlkgVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBTT0ZUV0FSRSksIEVWRU4gSUYKK1NVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKK0RBTUFHRVMuCisKKyAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisgICAgICAgICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBMaWJyYXJpZXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBsaWJyYXJ5LCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgd2UgcmVjb21tZW5kIG1ha2luZyBpdCBmcmVlIHNvZnR3YXJlIHRoYXQKK2V2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZS4gIFlvdSBjYW4gZG8gc28gYnkgcGVybWl0dGluZworcmVkaXN0cmlidXRpb24gdW5kZXIgdGhlc2UgdGVybXMgKG9yLCBhbHRlcm5hdGl2ZWx5LCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCitvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlKS4KKworICBUbyBhcHBseSB0aGVzZSB0ZXJtcywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgbGlicmFyeS4gIEl0IGlzCitzYWZlc3QgdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlCisiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIGxpYnJhcnkncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnkuCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgbGlicmFyeSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZQorICBsaWJyYXJ5IGBGcm9iJyAoYSBsaWJyYXJ5IGZvciB0d2Vha2luZyBrbm9icykgd3JpdHRlbiBieSBKYW1lcyBSYW5kb20gSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk5MAorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGF0J3MgYWxsIHRoZXJlIGlzIHRvIGl0IQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC91c2IvUkVBRE1FLnR4dCBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvdXNiL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ2YTAxYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvdXNiL1JFQURNRS50eHQKQEAgLTAsMCArMSw2MSBAQAorQXByaWwgMjgsIDIwMTEKKworTGludXggQ0lNYVgrIEtlcm5lbCBkcml2ZXIuCitSZWxlYXNlIENvZGUgdmVyc2lvbjoKKworRElTQ0xBSU1FUgorLS0tLS0tLS0tLQorCitUaGlzIGlzIGEgU21hcmR0dicgTGludXggS2VybmVsIGRyaXZlciBmb3IgdXNlIHdpdGgKK3RoZSBDSU1hWCsgVVNCIHJlZmVyZW5jZSBib2FyZCBoYXJkd2FyZS4KKworSU1QT1JUQU5UIE5PVEUKKy0tLS0tLS0tLS0tLS0tCisKK1RoaXMgcGFja2FnZXMgY29udGFpbnMgYSBMaW51eCBLZXJuZWwgZHJpdmVyIHRvIGJlIGluc3RhbGxlZCBpbiB0aGUKKy9saWIvbW9kdWxlcyB0YXJnZXQgZGlyZWN0b3J5IGluIG9yZGVyIHRvIGJlIGxvYWRlZCBhdXRvbWF0aWNhbHkuCisKKzEuIEhpZ2ggbGV2ZWwgZHJpdmVyOiBjaW1heCt1c2JfZHJpdmVyLmtvCisgIFRoaXMgZHJpdmVyIHByb3ZpZGUgdGhlIGhpZ2ggbGV2ZWwgaW50ZXJmYWNlIHRvIGNvbnRyb2wgdGhlIENJTWFYKyBVU0IgaW50ZXJmYWNlLgorCisyLiBGaXJtd2FyZQorICBUbyBoYXZlIGEgZnVuY3Rpb25hbCBoYXJkd2FyZSwgdGhlIGZpcm13YXJlIG11c3QgYmUgdXBsb2FkZWQgdG8gdGhlIGRldmljZS4KKworICBUaGUgZmlybXdhcmVzIGlzIGRlbGl2ZXJlZCBpbiAyIGZpbGVzIGZvciBkZWRpY2F0ZWQgdXNhZ2UgYW5kIG11c3QgYmUKKyAgaW5zdGFsbGVkIGluIHRoZSBMaW51eCBmaXJtd2FyZSBkaXJlY3Rvcnkgb24gdGhlIHRhcmdldCBib2FyZDoKKworICAgIC0gL2xpYi9maXJtd2FyZQorCisgIEEpIENJTWFYKyBmaXJtd2FyZSBiaW5hcnkgZmlsZQorICAgIENvcHkgdGhlIGZvbGxvd2luZyBmaXJtd2FyZSBmaWxlIHRvIHRoZSAvbGliL2Zpcm13YXJlIGRpcmVjdG9yeToKKyAgICAgIC0gZmlybXdhcmUvY2ltYXgrX3VzYmR2Yi5iaW4KKworICBCKSBDSU1hWCsgY29uZmlndXJhdGlvbiBmaWxlCisgICAgQ29weSB0aGUgZm9sbG93aW5nIGZpcm13YXJlIGZpbGUgdG8gdGhlIC9saWIvZmlybXdhcmUgZGlyZWN0b3J5OgorICAgICAgLSBmaXJtd2FyZS9jaW1heCt1c2IuY2ZnCisKKworQlVJTEQgQU5EIElOU1RBTExBVElPTiBJTlNUUlVDVElPTlMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzIuIEJ1aWxkaW5nIExJTlVYIFVTQiBEVkIgZHJpdmVyCisgIE9uIHRoZSB0YXJnZXQgbWFjaGluZSBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgorCisgIDEuIGNkIHNyYworICAyLiBtYWtlCisgIDMuIG1ha2UgaW5zdGFsbAorCiszLiBJbnN0YWxsaW5nIGZpcm13YXJlIGZpbGVzCisgIE9uIHRoZSB0YXJnZXQgbWFjaGluZSBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisKKyAgMS4gY3AgZmlybXdhcmUvKi4qIC9saWIvZmlybXdhcmUvCisKKzQuIEluc3RhbGxpbmcgcnVsZXMgZmlsZQorICAxLiBjcCBzcmMvOTktY2ltYXgrdXNiLnJ1bGVzIC9ldGMvdWRldi9ydWxlcy5kLworICAyLiB1ZGV2YWRtIGNvbnRyb2wgLS1yZWxvYWQtcnVsZXMKKworNS4gQnVpbGQgbW9kdWxlcyBkZXBlbmRlbmNpZXMKKyAgT24gdGhlIHRhcmdldCBtYWNoaW5lIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKworICAxLiBkZXBtb2QgLWEKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC91c2IvU1JDLzk5LWNpbWF4K3VzYi5ydWxlcyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvdXNiL1NSQy85OS1jaW1heCt1c2IucnVsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJhZjM3MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvdXNiL1NSQy85OS1jaW1heCt1c2IucnVsZXMKQEAgLTAsMCArMSw0IEBACitCVVM9PSJ1c2IiLCBBQ1RJT049PSJhZGQiLCBTWVNGU3tpZFByb2R1Y3R9PT0iMkYwMCIsIFNZU0ZTe2lkVmVuZG9yfT09IjFCMEQiCitLRVJORUw9PSJjaW1heHVzYlswLTldIiwgR1JPVVA9InVzZXJzIgorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvdXNiL1NSQy9IT1dUTy50eHQgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L3VzYi9TUkMvSE9XVE8udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZGUwMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L3VzYi9TUkMvSE9XVE8udHh0CkBAIC0wLDAgKzEsODUgQEAKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZXMgc2hvd3MgaG93IHRvIHVzZSB0aGUgY2ltYXgrdXNiIGRyaXZlci4KK0FsbCBzdHJ1Y3R1cmVzIGFuZCBtYWNybyBhcmUgZGVmaW5lZCBpbiBmaWxlIGNpbWF4K3VzYi1kcml2ZXIuaC4KKworCisxLk9wZW4gdGhlIGRldmljZSBjaW1heCt1c2IKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorLyogb3BlbiBkZXZpY2UgKi8KK2RldiA9IG9wZW4oIi9kZXYvY2ltYXh1c2IwIiwgT19SRFdSKTsKKy8qIHNlbGVjdCBVU0IgYWx0X3NldHRpbmcgKi8KK2lvY3RsKGRldiwgREVWSUNFX0lPQ19TRUxFQ1RfSU5URiwgYWx0X3NldHRpbmcpOworCisKKzIuQ2xvc2UgdGhlIGRldmljZSBjaW1heCt1c2IKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8qIHVubG9jayByZWFkIHF1ZXVlICovCitpb2N0bChkZXYsIERFVklDRV9JT0NfVU5MT0NLX1JFQUQsIDApOworLyogY2xvc2UgZGV2aWNlICovCitjbG9zZShkZXYpOworCisKKzMuU2VuZCBhIENJIG1lc3NhZ2UgdG8gYSBDQU0gdGhyb3VnaCB0aGUgZGV2aWNlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLyogU2VuZCBDQU0gQSBSZXNldCBjb21tYW5kICovCit1aW50OCBjb21tYW5kWzVdID0gezB4MDEsICAgIC8qIENvbW1hbmQgICAgICAgKi8KKwkJCQkJCQkJCQkweDAxLCAgICAvKiBDb3VudGVyICAgICAgICovCisJCQkJCQkJCQkJMHgwMCwgICAgLyogTVNCIGRhdGEgc2l6ZSAqLworCQkJCQkJCQkJCTB4MDEsICAgIC8qIExTQiBkYXRhIHNpemUgKi8KKwkJCQkJCQkJCQkweDAwfTsgICAvKiBkYXRhICAgICAgICAgICovCit1aW50OCByZXNwb25zZVs0MTAwXTsKK3N0cnVjdCBpb2N0bF9kYXRhX3Mgc3REYXRhOworc3REYXRhLnR4RGF0YSA9IGNvbW1hbmQ7CitzdERhdGEudHhTaXplID0gNTsKK3N0RGF0YS5yeERhdGEgPSByZXNwb25zZTsKK3N0RGF0YS5yeFNpemUgPSA0MTAwOworaW9jdGwoZGV2LCBERVZJQ0VfSU9DX0NJX1dSSVRFLCAmc3REYXRhKTsKKworLyogU2VuZCBDQU0gQiBHZXQgQ0lTIGNvbW1hbmQgKi8KK3VpbnQ4IGNvbW1hbmRbNV0gPSB7MHg4MiwgICAgLyogQ29tbWFuZCAgICAgICAqLworCQkJCQkJCQkJCTB4MDEsICAgIC8qIENvdW50ZXIgICAgICAgKi8KKwkJCQkJCQkJCQkweDAwLCAgICAvKiBNU0IgZGF0YSBzaXplICovCisJCQkJCQkJCQkJMHgwMH07ICAgLyogTFNCIGRhdGEgc2l6ZSAqLwordWludDggcmVzcG9uc2VbNDEwMF07CitzdHJ1Y3QgaW9jdGxfZGF0YV9zIHN0RGF0YTsKK3N0RGF0YS50eERhdGEgPSBjb21tYW5kOworc3REYXRhLnR4U2l6ZSA9IDQ7CitzdERhdGEucnhEYXRhID0gcmVzcG9uc2U7CitzdERhdGEucnhTaXplID0gNDEwMDsKK2lvY3RsKGRldiwgREVWSUNFX0lPQ19DSV9XUklURSwgJnN0RGF0YSk7CisKKworNC5TZW5kIGEgVHJhbnNwb3J0IFN0cmVhbSB0byBhIENBTSB0aHJvdWdoIHRoZSBkZXZpY2UKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvKiBTZW5kIHRvIENBTSBBICovCitzdHJ1Y3QgcndfZGF0YV9zIHJ3RGF0YTsKK3J3RGF0YS50eXBlID0gREVWSUNFX1RZUEVfVFNfV1JJVEU7Cityd0RhdGEubW9kdWxlSWQgPSAwOyAvKiBDQU0gQSAqLworcndEYXRhLmRhdGEgPSBzdHJlYW07Cityd0RhdGEuc2l6ZSA9IHNpemU7Cityd0RhdGEuY29waWVkU2l6ZSA9IDA7Cit3cml0ZShkZXYsICZyd0RhdGEsIHNpemVvZihzdHJ1Y3QgcndfZGF0YV9zKSk7CisKKworNS5SZWFkIGEgVHJhbnNwb3J0IFN0cmVhbSBmcm9tIGEgQ0FNIHRocm91Z2ggdGhlIGRldmljZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLyogUmVhZCBmcm9tIENBTSBCICovCitzdHJ1Y3QgcndfZGF0YV9zIHJ3RGF0YTsKK3J3RGF0YS50eXBlID0gREVWSUNFX1RZUEVfVFNfUkVBRDsKK3J3RGF0YS5tb2R1bGVJZCA9IDE7IC8qIENBTSBCICovCityd0RhdGEuZGF0YSA9IHN0cmVhbTsKK3J3RGF0YS5zaXplID0gc2l6ZTsKK3J3RGF0YS5jb3BpZWRTaXplID0gMDsKK3JlYWQoZGV2LCAmcndEYXRhLCBzaXplb2Yoc3RydWN0IHJ3X2RhdGFfcykpOworCisKKzYuUmVhZCBhIENJIG1lc3NhZ2UgZnJvbSBhIENBTSB0aHJvdWdoIHRoZSBkZXZpY2UKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8qIFJlYWQgZnJvbSBDQU0gQSAqLwordWludDggcmVzcG9uc2VbNDA5Nl07CitzdHJ1Y3QgcndfZGF0YV9zIHJ3RGF0YTsKK3J3RGF0YS50eXBlID0gREVWSUNFX1RZUEVfQ0lfUkVBRDsKK3J3RGF0YS5tb2R1bGVJZCA9IDA7IC8qIENBTSBBICovCityd0RhdGEuZGF0YSA9IHJlc3BvbnNlOworcndEYXRhLnNpemUgPSA0MDk2OworcndEYXRhLmNvcGllZFNpemUgPSAwOworcmVhZChkZXYsICZyd0RhdGEsIHNpemVvZihzdHJ1Y3QgcndfZGF0YV9zKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L3VzYi9TUkMvTWFrZWZpbGUgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L3VzYi9TUkMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM3OTk0NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvdXNiL1NSQy9NYWtlZmlsZQpAQCAtMCwwICsxLDM1IEBACitUQVJHRVQgPSBjaW1heCt1c2JfZHJpdmVyCitPQkpTID0gY2ltYXgrdXNiX2RyaXZlci5vCitNRElSID0gZHJpdmVycy9taXNjCisKK2NjZmxhZ3MteSA9IC1ERVhQT1JUX1NZTVRBQgorI2NjZmxhZ3MteSA9IC1ERVhQT1JUX1NZTVRBQiAtRERFQlVHCitDVVJSRU5UID0gJChzaGVsbCB1bmFtZSAtcikKK0tESVIgPSAvbGliL21vZHVsZXMvJChDVVJSRU5UKS9idWlsZAorUFdEID0gJChzaGVsbCBwd2QpCitERVNUID0gL2xpYi9tb2R1bGVzLyQoQ1VSUkVOVCkva2VybmVsLyQoTURJUikKKworb2JqLW0gOj0gJChUQVJHRVQpLm8KK2NpbWF4K3VzYl9kcml2ZXIteSA6PSAgY2ltYXgrdXNiLWRyaXZlci5vIGNpbWF4K3VzYl9mdy5vCitjaW1heCt1c2JfZHJpdmVyLXkgKz0gIGNpbWF4K3VzYl9jb25maWcubworY2ltYXgrdXNiX2RyaXZlci15ICs9ICBjaW1heCt1c2JfdGltZS5vCisKK2RlZmF1bHQ6CisJbWFrZSAtQyAvdXNyL3NyYy9saW51eCBTVUJESVJTPSQoUFdEKSBtb2R1bGVzCisjCW1ha2UgLUMgL2xpYi9tb2R1bGVzL2B1bmFtZSAtcmAvYnVpbGQgTT0kKFBXRCkgbW9kdWxlcworCiskKFRBUkdFVCkubzogJChPQkpTKQorCSQoTEQpICQoTERfUkZMQUcpIC1yIC1vICRAICQoT0JKUykKKworaWZuZXEgKCwkKGZpbmRzdHJpbmcgMi40LiwkKENVUlJFTlQpKSkKK2luc3RhbGw6CisJc3UgLWMgImNwIC12ICQoVEFSR0VUKS5vICQoREVTVCkgJiYgL3NiaW4vZGVwbW9kIC1hIgorZWxzZQoraW5zdGFsbDoKKwlzdSAtYyAiY3AgLXYgJChUQVJHRVQpLmtvICQoREVTVCkgJiYgL3NiaW4vZGVwbW9kIC1hIgorZW5kaWYKKworY2xlYW46CisJLXJtIC1mICoubyAqLmtvIC4qLmNtZCAuKi5mbGFncyAqLm1vZC5jCisKKy1pbmNsdWRlICQoS0RJUikvUnVsZXMubWFrZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC91c2IvU1JDL2JvZHlkZWYuaCBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvdXNiL1NSQy9ib2R5ZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkzZmVmNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvdXNiL1NSQy9ib2R5ZGVmLmgKQEAgLTAsMCArMSw0MjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioKKyAqIEBmaWxlICAgIGJvZHlkZWYuaAorICoKKyAqIEBicmllZiAgIENJTWFYKyBVU0IgRHJpdmVyIGZvciBsaW51eCBiYXNlZCBvcGVyYXRpbmcgc3lzdGVtcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMSAgICBCcnVubyBUb25lbGxpICAgPGJydW5vLnRvbmVsbGlAc21hcmR0di5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgJiBGcmFuY2sgRGVzY291cnMgPGZyYW5jay5kZXNjb3Vyc0BzbWFyZHR2LmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBTbWFyRFRWIEZyYW5jZSwgTGEgQ2lvdGF0CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fQk9EWURFRl9ICisjZGVmaW5lIF9fQk9EWURFRl9ICisKK3N0cnVjdCByZWdfcyB7CisJX191OCAgICAgUmVnaXN0ZXJOYW1lWzUwXTsKKwlfX3UxNiAgICBSZWdBZGRyOworfTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIElucHV0L091dHB1dCBQb3J0cyBhbmQgRGF0YSBEaXJlY3Rpb24gUmVnaXN0ZXJzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdHJ1Y3QgcmVnX3MgY2ltYXhfcmVnX21hcFtdID0geworCXsiQlVGRklOX0NGRyIgICAgICAgICAgICAgICAgICAgICAgLCAweDAwMDB9LAorCXsiQlVGRklOX0FERFJfTFNCIiAgICAgICAgICAgICAgICAgLCAweDAwMDF9LAorCXsiQlVGRklOX0FERFJfTVNCIiAgICAgICAgICAgICAgICAgLCAweDAwMDJ9LAorCXsiQlVGRklOX0RBVEEiICAgICAgICAgICAgICAgICAgICAgLCAweDAwMDN9LAorCXsiQlVGRk9VVF9DRkciICAgICAgICAgICAgICAgICAgICAgLCAweDAwMDR9LAorCXsiQlVGRk9VVF9BRERSX0xTQiIgICAgICAgICAgICAgICAgLCAweDAwMDV9LAorCXsiQlVGRk9VVF9BRERSX01TQiIgICAgICAgICAgICAgICAgLCAweDAwMDZ9LAorCXsiQlVGRk9VVF9EQVRBIiAgICAgICAgICAgICAgICAgICAgLCAweDAwMDd9LAorCXsiQk9PVF9LZXkiICAgICAgICAgICAgICAgICAgICAgICAgLCAweDAwMDh9LAorCXsiQk9PVF9TdGF0dXMiICAgICAgICAgICAgICAgICAgICAgLCAweDAwMDl9LAorCXsiQk9PVF9UZXN0ICIgICAgICAgICAgICAgICAgICAgICAgLCAweDAwMEF9LAorCXsiUnhETUFfQ3RybCIgICAgICAgICAgICAgICAgICAgICAgLCAweDAwMTB9LAorCXsiUnhETUFfU3RhdHVzIiAgICAgICAgICAgICAgICAgICAgLCAweDAwMTF9LAorCXsiUnhETUFfRGJnTCIgICAgICAgICAgICAgICAgICAgICAgLCAweDAwMTJ9LAorCXsiUnhETUFfRGJnSCIgICAgICAgICAgICAgICAgICAgICAgLCAweDAwMTN9LAorCXsiU1BJX1NsYXZlX0N0cmwiICAgICAgICAgICAgICAgICAgLCAweDAwMTh9LAorCXsiU1BJX1NsYXZlX1N0YXR1cyIgICAgICAgICAgICAgICAgLCAweDAwMTl9LAorCXsiU1BJX1NsYXZlX1J4IiAgICAgICAgICAgICAgICAgICAgLCAweDAwMUF9LAorCXsiU1BJX1NsYXZlX1R4IiAgICAgICAgICAgICAgICAgICAgLCAweDAwMUJ9LAorCXsiU1BJX1NsYXZlX01hc2siICAgICAgICAgICAgICAgICAgLCAweDAwMUN9LAorCXsiVUNTR19DdHJsIiAgICAgICAgICAgICAgICAgICAgICAgLCAweDAwMjB9LAorCXsiVUNTR19TdGF0dXMiICAgICAgICAgICAgICAgICAgICAgLCAweDAwMjF9LAorCXsiVUNTR19SeERhdGEiICAgICAgICAgICAgICAgICAgICAgLCAweDAwMjJ9LAorCXsiVUNTR19UeERhdGEiICAgICAgICAgICAgICAgICAgICAgLCAweDAwMjN9LAorCXsiUEN0cmxfQ3RybCIgICAgICAgICAgICAgICAgICAgICAgLCAweDAwMjh9LAorCXsiUEN0cmxfU3RhdHVzIiAgICAgICAgICAgICAgICAgICAgLCAweDAwMjl9LAorCXsiUEN0cmxfTmJCeXRlX0xTQiIgICAgICAgICAgICAgICAgLCAweDAwMkF9LAorCXsiUEN0cmxfTmJCeXRlX01TQiIgICAgICAgICAgICAgICAgLCAweDAwMkJ9LAorCXsiU1BJX01hc3Rlcl9DdGwiICAgICAgICAgICAgICAgICAgLCAweDAwMzB9LAorCXsiU1BJX01hc3Rlcl9OQ1MiICAgICAgICAgICAgICAgICAgLCAweDAwMzF9LAorCXsiU1BJX01hc3Rlcl9TdGF0dXMiICAgICAgICAgICAgICAgLCAweDAwMzJ9LAorCXsiU1BJX01hc3Rlcl9UeEJ1ZiIgICAgICAgICAgICAgICAgLCAweDAwMzN9LAorCXsiU1BJX01hc3Rlcl9SeEJ1ZiIgICAgICAgICAgICAgICAgLCAweDAwMzR9LAorCXsiQklTVFJBTV9DdGwiICAgICAgICAgICAgICAgICAgICAgLCAweDAwMzh9LAorCXsiQklTVFJBTV9CYW5rIiAgICAgICAgICAgICAgICAgICAgLCAweDAwMzl9LAorCXsiQklTVFJBTV9QYXQiICAgICAgICAgICAgICAgICAgICAgLCAweDAwM0F9LAorCXsiQklTVFJBTV9TTSIgICAgICAgICAgICAgICAgICAgICAgLCAweDAwM0J9LAorCXsiQklTVFJBTV9BZGRyTFNCIiAgICAgICAgICAgICAgICAgLCAweDAwM0N9LAorCXsiQklTVFJPTV9Db25maWciICAgICAgICAgICAgICAgICAgLCAweDAwNDB9LAorCXsiQklTVFJPTV9TaWduYXR1cmVMU0IiICAgICAgICAgICAgLCAweDAwNDF9LAorCXsiQklTVFJPTV9TaWduYXR1cmVNU0IiICAgICAgICAgICAgLCAweDAwNDJ9LAorCXsiQklTVFJPTV9TdGFydEFkZHJMU0IiICAgICAgICAgICAgLCAweDAwNDN9LAorCXsiQklTVFJPTV9TdGFydEFkZHJNU0IiICAgICAgICAgICAgLCAweDAwNDR9LAorCXsiQklTVFJPTV9TdG9wQWRkckxTQiIgICAgICAgICAgICAgLCAweDAwNDV9LAorCXsiQklTVFJPTV9TdG9wQWRkck1TQiIgICAgICAgICAgICAgLCAweDAwNDZ9LAorCXsiQ2tNYW5fQ29uZmlnIiAgICAgICAgICAgICAgICAgICAgLCAweDAwNDh9LAorCXsiQ2tNYW5fU2VsZWN0IiAgICAgICAgICAgICAgICAgICAgLCAweDAwNDl9LAorCXsiQ2tNYW5fVGVzdCIgICAgICAgICAgICAgICAgICAgICAgLCAweDAwNEF9LAorCXsiUmV2aXNpb25fTnVtYmVyIiAgICAgICAgICAgICAgICAgLCAweDAwNEJ9LAorCXsiQ2tNYW5fUERfS2V5IiAgICAgICAgICAgICAgICAgICAgLCAweDAwNEN9LAorCXsiVVNCX1Bvd2VyX01vZGUiICAgICAgICAgICAgICAgICAgLCAweDAwNER9LAorCXsiUmVzTWFuX0NvbmZpZyIgICAgICAgICAgICAgICAgICAgLCAweDAwNTB9LAorCXsiUmVzTWFuX1N0YXR1cyIgICAgICAgICAgICAgICAgICAgLCAweDAwNTF9LAorCXsiUmVzTWFuX1dEIiAgICAgICAgICAgICAgICAgICAgICAsIDB4MDA1Mn0sCisJeyJSZXNNYW5fV0RfTVNCIiAgICAgICAgICAgICAgICAgICAsIDB4MDA1M30sCisJeyJUeERNQV9DdHJsIiAgICAgICAgICAgICAgICAgICAgICAsIDB4MDA1OH0sCisJeyJUeERNQV9TdGF0dXMiICAgICAgICAgICAgICAgICAgICAsIDB4MDA1OX0sCisJeyJUeERNQV9TdGFydEFkZHJMIiAgICAgICAgICAgICAgICAsIDB4MDA1QX0sCisJeyJUeERNQV9TdGFydEFkZHJIIiAgICAgICAgICAgICAgICAsIDB4MDA1Qn0sCisJeyJUeERNQV9TdG9wQWRkckwiICAgICAgICAgICAgICAgICAsIDB4MDA1Q30sCisJeyJUeERNQV9TdG9wQWRkckgiICAgICAgICAgICAgICAgICAsIDB4MDA1RH0sCisJeyJDUFVfVGVzdCIgICAgICAgICAgICAgICAgICAgICAgLCAweDAwNjB9LAorCXsiSXJxTWFuX0NvbmZpZzAiICAgICAgICAgICAgICAgICAgLCAweDAwNjh9LAorCXsiSXJxTWFuX0NvbmZpZzEiICAgICAgICAgICAgICAgICAgLCAweDAwNjl9LAorCXsiSXJxTWFuX0lycTAiICAgICAgICAgICAgICAgICAgICAgLCAweDAwNkF9LAorCXsiSXJxTWFuX05NSSIgICAgICAgICAgICAgICAgICAgICAgLCAweDAwNkJ9LAorCXsiSXJxTWFuX1NsZWVwS2V5IiAgICAgICAgICAgICAgICAgLCAweDAwNkN9LAorCXsiVGltX0NvbmZpZyIgICAgICAgICAgICAgICAgICAgICAgLCAweDAwNzB9LAorCXsiVGltX1ZhbHVlX0xTQiIgICAgICAgICAgICAgICAgICAgLCAweDAwNzF9LAorCXsiVGltX1ZhbHVlX01TQiIgICAgICAgICAgICAgICAgICAgLCAweDAwNzJ9LAorCXsiVGltX0NvbXBfTFNCIiAgICAgICAgICAgICAgICAgICAgLCAweDAwNzN9LAorCXsiVGltX0NvbXBfTVNCIiAgICAgICAgICAgICAgICAgICAgLCAweDAwNzR9LAorCXsiVElfQ29uZmlnIiAgICAgICAgICAgICAgICAgICAgICAgLCAweDAwNzZ9LAorCXsiVElfRGF0YSIgICAgICAgICAgICAgICAgICAgICAgLCAweDAwNzd9LAorCXsiVElfUmVnMCIgICAgICAgICAgICAgICAgICAgICAgLCAweDAwNzh9LAorCXsiVElfUmVnMSIgICAgICAgICAgICAgICAgICAgICAgLCAweDAwNzl9LAorCXsiVElfUmVnMiIgICAgICAgICAgICAgICAgICAgICAgLCAweDAwN0F9LAorCXsiVElfUmVnMyIgICAgICAgICAgICAgICAgICAgICAgLCAweDAwN0J9LAorCXsiVElfUmVnNCIgICAgICAgICAgICAgICAgICAgICAgLCAweDAwN0N9LAorCXsiVElfUk9NMSIgICAgICAgICAgICAgICAgICAgICAgLCAweDAwN0R9LAorCXsiVElfUk9NMiIgICAgICAgICAgICAgICAgICAgICAgLCAweDAwN0V9LAorCXsiVElfUk9NMyIgICAgICAgICAgICAgICAgICAgICAgLCAweDAwN0Z9LAorCXsiRFZCQ0lfU1RBUlRfQUREUiIgICAgICAgICAgICAgICAgLCAweDAxMDB9LAorCXsiRFZCQ0lfRU5EX0FERFIiICAgICAgICAgICAgICAgICAgLCAweDAxN0Z9LAorCXsiREFUQSIgICAgICAgICAgICAgICAgICAgICAgLCAweDAxODB9LAorCXsiQ1RSTCIgICAgICAgICAgICAgICAgICAgICAgLCAweDAxODF9LAorCXsiUUJfSE9TVCIgICAgICAgICAgICAgICAgICAgICAgLCAweDAxODJ9LAorCXsiTEVOX0hPU1RfTFNCIiAgICAgICAgICAgICAgICAgICAgLCAweDAxODN9LAorCXsiTEVOX0hPU1RfTVNCIiAgICAgICAgICAgICAgICAgICAgLCAweDAxODR9LAorCXsiRklGT19UWF9USF9MU0IiICAgICAgICAgICAgICAgICAgLCAweDAxODV9LAorCXsiRklGT19UWF9USF9NU0IiICAgICAgICAgICAgICAgICAgLCAweDAxODZ9LAorCXsiRklGT19UWF9EX05CX0xTQiIgICAgICAgICAgICAgICAgLCAweDAxODd9LAorCXsiRklGT19UWF9EX05CX01TQiIgICAgICAgICAgICAgICAgLCAweDAxODh9LAorCXsiUUJfTU9EX0NVUlIiICAgICAgICAgICAgICAgICAgICAgLCAweDAxODl9LAorCXsiTEVOX01PRF9DVVJSX0xTQiIgICAgICAgICAgICAgICAgLCAweDAxOEF9LAorCXsiTEVOX01PRF9DVVJSX01TQiIgICAgICAgICAgICAgICAgLCAweDAxOEJ9LAorCXsiUUJfTU9EIiAgICAgICAgICAgICAgICAgICAgICAsIDB4MDE4Q30sCisJeyJMRU5fTU9EX0xTQiIgICAgICAgICAgICAgICAgICAgICAsIDB4MDE4RH0sCisJeyJMRU5fTU9EX01TQiIgICAgICAgICAgICAgICAgICAgICAsIDB4MDE4RX0sCisJeyJGSUZPX1JYX1RIX0xTQiIgICAgICAgICAgICAgICAgICAsIDB4MDE4Rn0sCisJeyJGSUZPX1JYX1RIX01TQiIgICAgICAgICAgICAgICAgICAsIDB4MDE5MH0sCisJeyJGSUZPX1JYX0RfTkJfTFNCIiAgICAgICAgICAgICAgICAsIDB4MDE5MX0sCisJeyJGSUZPX1JYX0RfTkJfTVNCIiAgICAgICAgICAgICAgICAsIDB4MDE5Mn0sCisJeyJJVF9TVEFUVVNfMCIgICAgICAgICAgICAgICAgICAgICAsIDB4MDE5M30sCisJeyJJVF9TVEFUVVNfMSIgICAgICAgICAgICAgICAgICAgICAsIDB4MDE5NH0sCisJeyJJVF9NQVNLXzAiICAgICAgICAgICAgICAgICAgICAgICwgMHgwMTk1fSwKKwl7IklUX01BU0tfMSIgICAgICAgICAgICAgICAgICAgICAgLCAweDAxOTZ9LAorCXsiSVRfSE9TVF9QSU5fQ0ZHIiAgICAgICAgICAgICAgICAgLCAweDAyMDB9LAorCXsiQ0ZHXzAiICAgICAgICAgICAgICAgICAgICAgICwgMHgwMjAxfSwKKwl7IkNGR18xIiAgICAgICAgICAgICAgICAgICAgICAsIDB4MDIwMn0sCisJeyJDRkdfMiIgICAgICAgICAgICAgICAgICAgICAgLCAweDAyMDN9LAorCXsiSVRfSE9TVCIgICAgICAgICAgICAgICAgICAgICAgLCAweDAyMDR9LAorCXsiTU9EX0lUX1NUQVRVUyIgICAgICAgICAgICAgICAgICAgLCAweDAyMDV9LAorCXsiTU9EX0lUX01BU0siICAgICAgICAgICAgICAgICAgICAgLCAweDAyMDZ9LAorCXsiTU9EX0NUUkxfQSIgICAgICAgICAgICAgICAgICAgICAgLCAweDAyMDd9LAorCXsiTU9EX0NUUkxfQiIgICAgICAgICAgICAgICAgICAgICAgLCAweDAyMDh9LAorCXsiREVTVF9TRUwiICAgICAgICAgICAgICAgICAgICAgICwgMHgwMjA5fSwKKwl7IkNBTV9NU0JfQUREIiAgICAgICAgICAgICAgICAgICAgICwgMHgwMjBBfSwKKwl7IkdQSU8wX0RJUiIgICAgICAgICAgICAgICAgICAgICAgLCAweDAyMEJ9LAorCXsiR1BJTzBfREFUQV9JTiIgICAgICAgICAgICAgICAgICAgLCAweDAyMEN9LAorCXsiR1BJTzBfREFUQV9PVVQiICAgICAgICAgICAgICAgICAgLCAweDAyMER9LAorCXsiR1BJTzBfU1RBVFVTIiAgICAgICAgICAgICAgICAgICAgLCAweDAyMEV9LAorCXsiR1BJTzBfSVRfTUFTSyIgICAgICAgICAgICAgICAgICAgLCAweDAyMEZ9LAorCXsiR1BJTzBfREZUIiAgICAgICAgICAgICAgICAgICAgICAsIDB4MDIxMH0sCisJeyJHUElPMF9NQVNLX0RBVEEiICAgICAgICAgICAgICAgICAsIDB4MDIxMX0sCisJeyJHUElPMV9ESVIiICAgICAgICAgICAgICAgICAgICAgICwgMHgwMjEyfSwKKwl7IkdQSU8xX0RBVEFfSU4iICAgICAgICAgICAgICAgICAgICwgMHgwMjEzfSwKKwl7IkdQSU8xX0RBVEFfT1VUIiAgICAgICAgICAgICAgICAgICwgMHgwMjE0fSwKKwl7IkdQSU8xX1NUQVRVUyIgICAgICAgICAgICAgICAgICAgICwgMHgwMjE1fSwKKwl7IkdQSU8xX0lUX01BU0siICAgICAgICAgICAgICAgICAgICwgMHgwMjE2fSwKKwl7Ik1FTV9BQ0NfVElNRV9BIiAgICAgICAgICAgICAgICAgICwgMHgwMjE3fSwKKwl7Ik1FTV9BQ0NfVElNRV9CIiAgICAgICAgICAgICAgICAgICwgMHgwMjE4fSwKKwl7IklPX0FDQ19USU1FX0EiICAgICAgICAgICAgICAgICAgICwgMHgwMjE5fSwKKwl7IklPX0FDQ19USU1FX0IiICAgICAgICAgICAgICAgICAgICwgMHgwMjFBfSwKKwl7IkVYVF9DSF9BQ0NfVElNRV9BIiAgICAgICAgICAgICAgICwgMHgwMjFCfSwKKwl7IkVYVF9DSF9BQ0NfVElNRV9CIiAgICAgICAgICAgICAgICwgMHgwMjFDfSwKKwl7IlBBUl9JRl8wIiAgICAgICAgICAgICAgICAgICAgICAsIDB4MDIxRH0sCisJeyJQQVJfSUZfMSIgICAgICAgICAgICAgICAgICAgICAgLCAweDAyMUV9LAorCXsiUEFSX0lGX0NUUkwiICAgICAgICAgICAgICAgICAgICAgLCAweDAyMUZ9LAorCXsiUENLX0xFTkdUSCIgICAgICAgICAgICAgICAgICAgICAgLCAweDAyMjB9LAorCXsiVVNCMlRTX0NUUkwiICAgICAgICAgICAgICAgICAgICAgLCAweDAyMjF9LAorCXsiVVNCMlRTMF9SREwiICAgICAgICAgICAgICAgICAgICAsIDB4MDIyMn0sCisJeyJVU0IyVFMxX1JETCIgICAgICAgICAgICAgICAgICAgICAsIDB4MDIyM30sCisJeyJUUzJVU0JfQ1RSTCIgICAgICAgICAgICAgICAgICAgICAsIDB4MDIyNH0sCisJeyJUU09VVF9QQVJfQ1RSTCIgICAgICAgICAgICAgICAgICAsIDB4MDIyNX0sCisJeyJUU09VVF9QQVJfQ0xLX1NFTCIgICAgICAgICAgICAgICAsIDB4MDIyNn0sCisJeyJTMlBfQ0gwX0NUUkwiICAgICAgICAgICAgICAgICAgICAsIDB4MDIyN30sCisJeyJTMlBfQ0gxX0NUUkwiICAgICAgICAgICAgICAgICAgICAsIDB4MDIyOH0sCisJeyJQMlNfQ0gwX0NUUkwiICAgICAgICAgICAgICAgICAgICAsIDB4MDIyOX0sCisJeyJQMlNfQ0gxX0NUUkwiICAgICAgICAgICAgICAgICAgICAsIDB4MDIyQX0sCisJeyJUU19JVF9TVEFUVVMiICAgICAgICAgICAgICAgICAgICAsIDB4MDIyQn0sCisJeyJUU19JVF9NQVNLIiAgICAgICAgICAgICAgICAgICAgICAsIDB4MDIyQ30sCisJeyJJTl9TRUwiICAgICAgICAgICAgICAgICAgICAgICwgMHgwMjJEfSwKKwl7Ik9VVF9TRUwiICAgICAgICAgICAgICAgICAgICAgICwgMHgwMjJFfSwKKwl7IlJPVVRFUl9DQU1fQ0giICAgICAgICAgICAgICAgICAgICwgMHgwMjJGfSwKKwl7IlJPVVRFUl9DQU1fTU9EIiAgICAgICAgICAgICAgICAgICwgMHgwMjMwfSwKKwl7IkZJRk9fQ1RSTCIgICAgICAgICAgICAgICAgICAgICAgLCAweDAyMzF9LAorCXsiRklGTzFfMl9TVEFUVVMiICAgICAgICAgICAgICAgICAgLCAweDAyMzJ9LAorCXsiRklGTzNfNF9TVEFUVVMiICAgICAgICAgICAgICAgICAgLCAweDAyMzN9LAorCXsiR0FQX1JFTU9WRVJfQ0gwX0NUUkwiICAgICAgICAgICAgLCAweDAyMzR9LAorCXsiR0FQX1JFTU9WRVJfQ0gxX0NUUkwiICAgICAgICAgICAgLCAweDAyMzV9LAorCXsiU1lOQ19SVFZfQ1RSTCIgICAgICAgICAgICAgICAgICAgLCAweDAyMzZ9LAorCXsiU1lOQ19SVFZfQ0gwX1NZTkNfTkIiICAgICAgICAgICAgLCAweDAyMzd9LAorCXsiU1lOQ19SVFZfQ0gwX1BBVFRFUk4iICAgICAgICAgICAgLCAweDAyMzh9LAorCXsiU1lOQ19SVFZfQ0gxX1NZTkNfTkIiICAgICAgICAgICAgLCAweDAyMzl9LAorCXsiU1lOQ19SVFZfQ0gxX1BBVFRFUk4iICAgICAgICAgICAgLCAweDAyM0F9LAorCXsiU1lOQ19SVFZfT0ZGU0VUX1BBVFQiICAgICAgICAgICAgLCAweDAyM0J9LAorCXsiQ1RSTF9GSUxURVIiICAgICAgICAgICAgICAgICAgICAgLCAweDAyM0R9LAorCXsiUElEX0VOX0ZJTFRFUl9DSDAiICAgICAgICAgICAgICAgLCAweDAyM0V9LAorCXsiUElEX0VOX0ZJTFRFUl9DSDEiICAgICAgICAgICAgICAgLCAweDAyM0Z9LAorCXsiUElEX0xTQl9GSUxURVJfQ0gwXzAiICAgICAgICAgICAgLCAweDAyNDB9LAorCXsiUElEX01TQl9GSUxURVJfQ0gwXzAiICAgICAgICAgICAgLCAweDAyNDF9LAorCXsiUElEX0xTQl9GSUxURVJfQ0gwXzEiICAgICAgICAgICAgLCAweDAyNDJ9LAorCXsiUElEX01TQl9GSUxURVJfQ0gwXzEiICAgICAgICAgICAgLCAweDAyNDN9LAorCXsiUElEX0xTQl9GSUxURVJfQ0gwXzIiICAgICAgICAgICAgLCAweDAyNDR9LAorCXsiUElEX01TQl9GSUxURVJfQ0gwXzIiICAgICAgICAgICAgLCAweDAyNDV9LAorCXsiUElEX0xTQl9GSUxURVJfQ0gwXzMiICAgICAgICAgICAgLCAweDAyNDZ9LAorCXsiUElEX01TQl9GSUxURVJfQ0gwXzMiICAgICAgICAgICAgLCAweDAyNDd9LAorCXsiUElEX0xTQl9GSUxURVJfQ0gwXzQiICAgICAgICAgICAgLCAweDAyNDh9LAorCXsiUElEX01TQl9GSUxURVJfQ0gwXzQiICAgICAgICAgICAgLCAweDAyNDl9LAorCXsiUElEX0xTQl9GSUxURVJfQ0gwXzUiICAgICAgICAgICAgLCAweDAyNEF9LAorCXsiUElEX01TQl9GSUxURVJfQ0gwXzUiICAgICAgICAgICAgLCAweDAyNEJ9LAorCXsiUElEX0xTQl9GSUxURVJfQ0gwXzYiICAgICAgICAgICAgLCAweDAyNEN9LAorCXsiUElEX01TQl9GSUxURVJfQ0gwXzYiICAgICAgICAgICAgLCAweDAyNER9LAorCXsiUElEX0xTQl9GSUxURVJfQ0gwXzciICAgICAgICAgICAgLCAweDAyNEV9LAorCXsiUElEX01TQl9GSUxURVJfQ0gwXzciICAgICAgICAgICAgLCAweDAyNEZ9LAorCXsiUElEX0xTQl9GSUxURVJfQ0gxXzAiICAgICAgICAgICAgLCAweDAyNjB9LAorCXsiUElEX01TQl9GSUxURVJfQ0gxXzAiICAgICAgICAgICAgLCAweDAyNjF9LAorCXsiUElEX0xTQl9GSUxURVJfQ0gxXzEiICAgICAgICAgICAgLCAweDAyNjJ9LAorCXsiUElEX01TQl9GSUxURVJfQ0gxXzEiICAgICAgICAgICAgLCAweDAyNjN9LAorCXsiUElEX0xTQl9GSUxURVJfQ0gxXzIiICAgICAgICAgICAgLCAweDAyNjR9LAorCXsiUElEX01TQl9GSUxURVJfQ0gxXzIiICAgICAgICAgICAgLCAweDAyNjV9LAorCXsiUElEX0xTQl9GSUxURVJfQ0gxXzMiICAgICAgICAgICAgLCAweDAyNjZ9LAorCXsiUElEX01TQl9GSUxURVJfQ0gxXzMiICAgICAgICAgICAgLCAweDAyNjd9LAorCXsiUElEX0xTQl9GSUxURVJfQ0gxXzQiICAgICAgICAgICAgLCAweDAyNjh9LAorCXsiUElEX01TQl9GSUxURVJfQ0gxXzQiICAgICAgICAgICAgLCAweDAyNjl9LAorCXsiUElEX0xTQl9GSUxURVJfQ0gxXzUiICAgICAgICAgICAgLCAweDAyNkF9LAorCXsiUElEX01TQl9GSUxURVJfQ0gxXzUiICAgICAgICAgICAgLCAweDAyNkJ9LAorCXsiUElEX0xTQl9GSUxURVJfQ0gxXzYiICAgICAgICAgICAgLCAweDAyNkN9LAorCXsiUElEX01TQl9GSUxURVJfQ0gxXzYiICAgICAgICAgICAgLCAweDAyNkR9LAorCXsiUElEX0xTQl9GSUxURVJfQ0gxXzciICAgICAgICAgICAgLCAweDAyNkV9LAorCXsiUElEX01TQl9GSUxURVJfQ0gxXzciICAgICAgICAgICAgLCAweDAyNkZ9LAorCXsiUElEX09MRF9MU0JfUkVNQVBQRVJfMCIgICAgICAgICAgLCAweDAyODB9LAorCXsiUElEX09MRF9NU0JfUkVNQVBQRVJfMCIgICAgICAgICAgLCAweDAyODF9LAorCXsiUElEX09MRF9MU0JfUkVNQVBQRVJfMSIgICAgICAgICAgLCAweDAyODJ9LAorCXsiUElEX09MRF9NU0JfUkVNQVBQRVJfMSIgICAgICAgICAgLCAweDAyODN9LAorCXsiUElEX09MRF9MU0JfUkVNQVBQRVJfMiIgICAgICAgICAgLCAweDAyODR9LAorCXsiUElEX09MRF9NU0JfUkVNQVBQRVJfMiIgICAgICAgICAgLCAweDAyODV9LAorCXsiUElEX09MRF9MU0JfUkVNQVBQRVJfMyIgICAgICAgICAgLCAweDAyODZ9LAorCXsiUElEX09MRF9NU0JfUkVNQVBQRVJfMyIgICAgICAgICAgLCAweDAyODd9LAorCXsiUElEX09MRF9MU0JfUkVNQVBQRVJfNCIgICAgICAgICAgLCAweDAyODh9LAorCXsiUElEX09MRF9NU0JfUkVNQVBQRVJfNCIgICAgICAgICAgLCAweDAyODl9LAorCXsiUElEX09MRF9MU0JfUkVNQVBQRVJfNSIgICAgICAgICAgLCAweDAyOEF9LAorCXsiUElEX09MRF9NU0JfUkVNQVBQRVJfNSIgICAgICAgICAgLCAweDAyOEJ9LAorCXsiUElEX09MRF9MU0JfUkVNQVBQRVJfNiIgICAgICAgICAgLCAweDAyOEN9LAorCXsiUElEX09MRF9NU0JfUkVNQVBQRVJfNiIgICAgICAgICAgLCAweDAyOER9LAorCXsiUElEX09MRF9MU0JfUkVNQVBQRVJfNyIgICAgICAgICAgLCAweDAyOEV9LAorCXsiUElEX09MRF9NU0JfUkVNQVBQRVJfNyIgICAgICAgICAgLCAweDAyOEZ9LAorCXsiUElEX05FV19MU0JfUkVNQVBQRVJfMCIgICAgICAgICAgLCAweDAyQTB9LAorCXsiUElEX05FV19NU0JfUkVNQVBQRVJfMCIgICAgICAgICAgLCAweDAyQTF9LAorCXsiUElEX05FV19MU0JfUkVNQVBQRVJfMSIgICAgICAgICAgLCAweDAyQTJ9LAorCXsiUElEX05FV19NU0JfUkVNQVBQRVJfMSIgICAgICAgICAgLCAweDAyQTN9LAorCXsiUElEX05FV19MU0JfUkVNQVBQRVJfMiIgICAgICAgICAgLCAweDAyQTR9LAorCXsiUElEX05FV19NU0JfUkVNQVBQRVJfMiIgICAgICAgICAgLCAweDAyQTV9LAorCXsiUElEX05FV19MU0JfUkVNQVBQRVJfMyIgICAgICAgICAgLCAweDAyQTZ9LAorCXsiUElEX05FV19NU0JfUkVNQVBQRVJfMyIgICAgICAgICAgLCAweDAyQTd9LAorCXsiUElEX05FV19MU0JfUkVNQVBQRVJfNCIgICAgICAgICAgLCAweDAyQTh9LAorCXsiUElEX05FV19NU0JfUkVNQVBQRVJfNCIgICAgICAgICAgLCAweDAyQTl9LAorCXsiUElEX05FV19MU0JfUkVNQVBQRVJfNSIgICAgICAgICAsIDB4MDJBQX0sCisJeyJQSURfTkVXX01TQl9SRU1BUFBFUl81IiAgICAgICAgICAsIDB4MDJBQn0sCisJeyJQSURfTkVXX0xTQl9SRU1BUFBFUl82IiAgICAgICAgICAsIDB4MDJBQ30sCisJeyJQSURfTkVXX01TQl9SRU1BUFBFUl82IiAgICAgICAgICAsIDB4MDJBRH0sCisJeyJQSURfTkVXX0xTQl9SRU1BUFBFUl83IiAgICAgICAgICAsIDB4MDJBRX0sCisJeyJQSURfTkVXX01TQl9SRU1BUFBFUl83IiAgICAgICAgICAsIDB4MDJBRn0sCisJeyJNRVJHRVJfRElWX01JQ0xLIiAgICAgICAgICAgICAgICAsIDB4MDJDMH0sCisJeyJQSURfQU5EX1NZTkNfUkVNQVBQRVJfQ1RSTCIgICAgICAsIDB4MDJDMX0sCisJeyJQSURfRU5fUkVNQVBQRVIiICAgICAgICAgICAgICAgICAsIDB4MDJDMn0sCisJeyJTWU5DX1NZTUJPTCIgICAgICAgICAgICAgICAgICAgICAsIDB4MDJDM30sCisJeyJQSURfQU5EX1NZTkNfUkVNQVBQRVJfSU5WX0NUUkwiICAsIDB4MDJDNH0sCisJeyJCSVRSQVRFX0NIMF9MU0IiICAgICAgICAgICAgICAgICAsIDB4MDJDNX0sCisJeyJCSVRSQVRFX0NIMF9NU0IiICAgICAgICAgICAgICAgICAsIDB4MDJDNn0sCisJeyJCSVRSQVRFX0NIMV9MU0IiICAgICAgICAgICAgICAgICAsIDB4MDJDN30sCisJeyJCSVRSQVRFX0NIMV9NU0IiICAgICAgICAgICAgICAgICAsIDB4MDJDOH0sCisJeyJTVEFUVVNfQ0xLX1NXSVRDSF8wIiAgICAgICAgICAgICAsIDB4MDJDOX0sCisJeyJTVEFUVVNfQ0xLX1NXSVRDSF8xIiAgICAgICAgICAgICAsIDB4MDJDQX0sCisJeyJSRVNFVF9DTEtfU1dJVENIXzAiICAgICAgICAgICAgICAsIDB4MDJDQn0sCisJeyJSRVNFVF9DTEtfU1dJVENIXzEiICAgICAgICAgICAgICAsIDB4MDJDQ30sCisJeyJQQURfRFJWU1RSX0NUUkwiICAgICAgICAgICAgICAgICAsIDB4MDJDRH0sCisJeyJQQURfUFVQRF9DVFJMIiAgICAgICAgICAgICAgICAgICAsIDB4MDJDRX0sCisJeyJQUkVfSEVBREVSX0FEREVSX0NIMF8wIiAgICAgICAgICAsIDB4MDJEMH0sCisJeyJQUkVfSEVBREVSX0FEREVSX0NIMF8xIiAgICAgICAgICAsIDB4MDJEMX0sCisJeyJQUkVfSEVBREVSX0FEREVSX0NIMF8yIiAgICAgICAgICAsIDB4MDJEMn0sCisJeyJQUkVfSEVBREVSX0FEREVSX0NIMF8zIiAgICAgICAgICAsIDB4MDJEM30sCisJeyJQUkVfSEVBREVSX0FEREVSX0NIMF80IiAgICAgICAgICAsIDB4MDJENH0sCisJeyJQUkVfSEVBREVSX0FEREVSX0NIMF81IiAgICAgICAgICAsIDB4MDJENX0sCisJeyJQUkVfSEVBREVSX0FEREVSX0NIMF82IiAgICAgICAgICAsIDB4MDJENn0sCisJeyJQUkVfSEVBREVSX0FEREVSX0NIMF83IiAgICAgICAgICAsIDB4MDJEN30sCisJeyJQUkVfSEVBREVSX0FEREVSX0NIMF84IiAgICAgICAgICAsIDB4MDJEOH0sCisJeyJQUkVfSEVBREVSX0FEREVSX0NIMF85IiAgICAgICAgICAsIDB4MDJEOX0sCisJeyJQUkVfSEVBREVSX0FEREVSX0NIMF8xMCIgICAgICAgICAsIDB4MDJEQX0sCisJeyJQUkVfSEVBREVSX0FEREVSX0NIMF8xMSIgICAgICAgICAsIDB4MDJEQn0sCisJeyJQUkVfSEVBREVSX0FEREVSX0NIMV8wIiAgICAgICAgICAsIDB4MDJFMH0sCisJeyJQUkVfSEVBREVSX0FEREVSX0NIMV8xIiAgICAgICAgICAsIDB4MDJFMX0sCisJeyJQUkVfSEVBREVSX0FEREVSX0NIMV8yIiAgICAgICAgICAsIDB4MDJFMn0sCisJeyJQUkVfSEVBREVSX0FEREVSX0NIMV8zIiAgICAgICAgICAsIDB4MDJFM30sCisJeyJQUkVfSEVBREVSX0FEREVSX0NIMV80IiAgICAgICAgICAsIDB4MDJFNH0sCisJeyJQUkVfSEVBREVSX0FEREVSX0NIMV81IiAgICAgICAgICAsIDB4MDJFNX0sCisJeyJQUkVfSEVBREVSX0FEREVSX0NIMV82IiAgICAgICAgICAsIDB4MDJFNn0sCisJeyJQUkVfSEVBREVSX0FEREVSX0NIMV83IiAgICAgICAgICAsIDB4MDJFN30sCisJeyJQUkVfSEVBREVSX0FEREVSX0NIMV84IiAgICAgICAgICAsIDB4MDJFOH0sCisJeyJQUkVfSEVBREVSX0FEREVSX0NIMV85IiAgICAgICAgICAsIDB4MDJFOX0sCisJeyJQUkVfSEVBREVSX0FEREVSX0NIMV8xMCIgICAgICAgICAsIDB4MDJFQX0sCisJeyJQUkVfSEVBREVSX0FEREVSX0NIMV8xMSIgICAgICAgICAsIDB4MDJFQn0sCisJeyJQUkVfSEVBREVSX0FEREVSX0NUUkwiICAgICAgICAgICAsIDB4MDJFQ30sCisJeyJQUkVfSEVBREVSX0FEREVSX0xFTiIgICAgICAgICAgICAsIDB4MDJFRH0sCisJeyJQUkVfSEVBREVSX1JFTU9WRVJfQ1RSTCIgICAgICAgICAsIDB4MDJFRX0sCisJeyJGU01fRFZCIiAgICAgICAgICAgICAgICAgICAgICAsIDB4MDJGMH0sCisJeyJUUzJVU0JfRlNNX0RFQlVHIiAgICAgICAgICAgICAgICAsIDB4MDJGMn0sCisJeyJUU09VVF9QQVJfRlNNX0RFQlVHIiAgICAgICAgICAgICAsIDB4MDJGM30sCisJeyJHQVBfUkVNT1ZFUl9GU01fREVCVUciICAgICAgICAgICAsIDB4MDJGNH0sCisJeyJQSURfQU5EX1NZTkNfUkVNQVBQRVJfRlNNX0RFQlVHIiAsIDB4MDJGNX0sCisJeyJQUkVfSEVBREVSX0FEREVSX0ZTTV9ERUJVRyIgICAgICAsIDB4MDJGNn0sCisJeyJTWU5DX1JUVl9GU01fREVCVUciICAgICAgICAgICAgICAsIDB4MDJGN30sCisJeyJDSEVDS19QSFlfQ0xLIiAgICAgICAgICAgICAgICAgICAsIDB4MEUwMH0sCisJeyJDT05UUk9MMSIgICAgICAgICAgICAgICAgICAgICAgLCAweDBFMDF9LAorCXsiV0FLRV9VUCIgICAgICAgICAgICAgICAgICAgICAgLCAweDBFMDJ9LAorCXsiQ09OVFJPTDIiICAgICAgICAgICAgICAgICAgICAgICwgMHgwRTAzfSwKKwl7IlBIWV9SRUxBVEVEIiAgICAgICAgICAgICAgICAgICAgICwgMHgwRTA0fSwKKwl7IkVQX0NGRyIgICAgICAgICAgICAgICAgICAgICAgLCAweDBFMDV9LAorCXsiTUFYX1BLVF9FUDFMIiAgICAgICAgICAgICAgICAgICAgLCAweDBFMDZ9LAorCXsiTUFYX1BLVF9FUDFIIiAgICAgICAgICAgICAgICAgICAgLCAweDBFMDd9LAorCXsiTUFYX1BLVF9FUDJMIiAgICAgICAgICAgICAgICAgICAgLCAweDBFMDh9LAorCXsiTUFYX1BLVF9FUDJIIiAgICAgICAgICAgICAgICAgICAgLCAweDBFMDl9LAorCXsiTUFYX1BLVF9FUDNMIiAgICAgICAgICAgICAgICAgICAgLCAweDBFMEF9LAorCXsiTUFYX1BLVF9FUDNIIiAgICAgICAgICAgICAgICAgICAgLCAweDBFMEJ9LAorCXsiTUFYX1BLVF9FUDRMIiAgICAgICAgICAgICAgICAgICAgLCAweDBFMEN9LAorCXsiTUFYX1BLVF9FUDRIIiAgICAgICAgICAgICAgICAgICAgLCAweDBFMER9LAorCXsiRVBTX1NUQUxMX1NFVCIgICAgICAgICAgICAgICAgICAgLCAweDBFMTB9LAorCXsiRVBTX1NUQUxMX0NMUiIgICAgICAgICAgICAgICAgICAgLCAweDBFMTF9LAorCXsiRVBTX0VOQUJMRSIgICAgICAgICAgICAgICAgICAgICAgLCAweDBFMTJ9LAorCXsiRE1BX0FDQ19FUFMiICAgICAgICAgICAgICAgICAgICAgLCAweDBFMTN9LAorCXsiQ1BVX0FDQ19FUFNfRU4iICAgICAgICAgICAgICAgICAgLCAweDBFMTR9LAorCXsiU0VUVVBfQllURTAiICAgICAgICAgICAgICAgICAgICAgLCAweDBFMTV9LAorCXsiU0VUVVBfQllURTEiICAgICAgICAgICAgICAgICAgICAgLCAweDBFMTZ9LAorCXsiU0VUVVBfQllURTIiICAgICAgICAgICAgICAgICAgICAgLCAweDBFMTd9LAorCXsiU0VUVVBfQllURTMiICAgICAgICAgICAgICAgICAgICAgLCAweDBFMTh9LAorCXsiU0VUVVBfQllURTQiICAgICAgICAgICAgICAgICAgICAgLCAweDBFMTl9LAorCXsiU0VUVVBfQllURTUiICAgICAgICAgICAgICAgICAgICAgLCAweDBFMUF9LAorCXsiU0VUVVBfQllURTYiICAgICAgICAgICAgICAgICAgICAgLCAweDBFMUJ9LAorCXsiU0VUVVBfQllURTciICAgICAgICAgICAgICAgICAgICAgLCAweDBFMUN9LAorCXsiU0VUVVBfRFRfVkxEIiAgICAgICAgICAgICAgICAgICAgLCAweDBFMUR9LAorCXsiQ0xSX0VQU19UT0ciICAgICAgICAgICAgICAgICAgICAgLCAweDBFMUV9LAorCXsiRVAwX0NUUkwiICAgICAgICAgICAgICAgICAgICAgICwgMHgwRTIwfSwKKwl7IkVQMF9EQVRBX0NOVCIgICAgICAgICAgICAgICAgICAgICwgMHgwRTIxfSwKKwl7IkVQMF9EQVRBIiAgICAgICAgICAgICAgICAgICAgICAsIDB4MEUyMn0sCisJeyJFUDFfQ1RSTCIgICAgICAgICAgICAgICAgICAgICAgLCAweDBFMzB9LAorCXsiRVAxX0RBVEFfQ05UTCIgICAgICAgICAgICAgICAgICAgLCAweDBFMzF9LAorCXsiRVAxX0RBVEFfQ05USCIgICAgICAgICAgICAgICAgICAgLCAweDBFMzJ9LAorCXsiRVAxX0RBVEEiICAgICAgICAgICAgICAgICAgICAgICwgMHgwRTMzfSwKKwl7IkVQMV9IRUFERVIiICAgICAgICAgICAgICAgICAgICAgICwgMHgwRTM0fSwKKwl7IkVQMl9DVFJMIiAgICAgICAgICAgICAgICAgICAgICAsIDB4MEU0MH0sCisJeyJFUDJfREFUQV9DTlRMIiAgICAgICAgICAgICAgICAgICAsIDB4MEU0MX0sCisJeyJFUDJfREFUQV9DTlRIIiAgICAgICAgICAgICAgICAgICAsIDB4MEU0Mn0sCisJeyJFUDJfREFUQSIgICAgICAgICAgICAgICAgICAgICAgLCAweDBFNDN9LAorCXsiRVAyX0hFQURFUiIgICAgICAgICAgICAgICAgICAgICAgLCAweDBFNDR9LAorCXsiRVAzX0RBVEFfQ05UTCIgICAgICAgICAgICAgICAgICAgLCAweDBFNTB9LAorCXsiRVAzX0RBVEFfQ05USCIgICAgICAgICAgICAgICAgICAgLCAweDBFNTF9LAorCXsiRVAzX0RBVEEiICAgICAgICAgICAgICAgICAgICAgICwgMHgwRTUyfSwKKwl7IkVQM19IRUFERVIiICAgICAgICAgICAgICAgICAgICAgICwgMHgwRTUzfSwKKwl7IkVQM19IRUFERVJfQ05UIiAgICAgICAgICAgICAgICAgICwgMHgwRTU0fSwKKwl7IkVQM19IRUFERVJfREFUQSIgICAgICAgICAgICAgICAgICwgMHgwRTU1fSwKKwl7IkVQNF9EQVRBX0NOVEwiICAgICAgICAgICAgICAgICAgICwgMHgwRTYwfSwKKwl7IkVQNF9EQVRBX0NOVEgiICAgICAgICAgICAgICAgICAgICwgMHgwRTYxfSwKKwl7IkVQNF9EQVRBIiAgICAgICAgICAgICAgICAgICAgICAsIDB4MEU2Mn0sCisJeyJFUDRfSEVBREVSIiAgICAgICAgICAgICAgICAgICAgICAsIDB4MEU2M30sCisJeyJFUDRfSEVBREVSX0NOVCIgICAgICAgICAgICAgICAgICAsIDB4MEU2NH0sCisJeyJFUDRfSEVBREVSX0RBVEEiICAgICAgICAgICAgICAgICAsIDB4MEU2NX0sCisJeyJFUDVfQ1RSTCIgICAgICAgICAgICAgICAgICAgICAgLCAweDBFNzB9LAorCXsiRVA1X0RBVEFfQ05UTCIgICAgICAgICAgICAgICAgICAgLCAweDBFNzF9LAorCXsiRVA1X0RBVEFfQ05USCIgICAgICAgICAgICAgICAgICAgLCAweDBFNzJ9LAorCXsiRVA1X0RBVEEiICAgICAgICAgICAgICAgICAgICAgICwgMHgwRTczfSwKKwl7Ik1BWF9QS1RfRVA1TCIgICAgICAgICAgICAgICAgICAgICwgMHgwRTc0fSwKKwl7Ik1BWF9QS1RfRVA1SCIgICAgICAgICAgICAgICAgICAgICwgMHgwRTc1fSwKKwl7IkVQNl9EQVRBX0NOVEwiICAgICAgICAgICAgICAgICAgICwgMHgwRTgwfSwKKwl7IkVQNl9EQVRBX0NOVEgiICAgICAgICAgICAgICAgICAgICwgMHgwRTgxfSwKKwl7IkVQNl9EQVRBIiAgICAgICAgICAgICAgICAgICAgICAsIDB4MEU4Mn0sCisJeyJNQVhfUEtUX0VQNkwiICAgICAgICAgICAgICAgICAgICAsIDB4MEU4M30sCisJeyJNQVhfUEtUX0VQNkgiICAgICAgICAgICAgICAgICAgICAsIDB4MEU4NH0sCisJeyJGUkFNRV9OVU1MIiAgICAgICAgICAgICAgICAgICAgICAsIDB4MEU5MH0sCisJeyJGUkFNRV9OVU1IIiAgICAgICAgICAgICAgICAgICAgICAsIDB4MEU5MX0sCisJeyJGUkFNRV9USU1FTCIgICAgICAgICAgICAgICAgICAgICAsIDB4MEU5Mn0sCisJeyJGUkFNRV9USU1FSCIgICAgICAgICAgICAgICAgICAgICAsIDB4MEU5M30sCisJeyJTVENfRElWTCIgICAgICAgICAgICAgICAgICAgICAgLCAweDBFOTR9LAorCXsiU1RDX0RJVk0iICAgICAgICAgICAgICAgICAgICAgICwgMHgwRTk1fSwKKwl7IlNUQ19ESVZIIiAgICAgICAgICAgICAgICAgICAgICAsIDB4MEU5Nn0sCisJeyJVU0JfU1RBVFVTIiAgICAgICAgICAgICAgICAgICAgICAsIDB4MEU5N30sCisJeyJERVZfU1RBVEUxIiAgICAgICAgICAgICAgICAgICAgICAsIDB4MEU5OH0sCisJeyJERVZfU1RBVEUyIiAgICAgICAgICAgICAgICAgICAgICAsIDB4MEU5OX0sCisJeyJERVZfU1RBVEUzIiAgICAgICAgICAgICAgICAgICAgICAsIDB4MEU5QX0sCisJeyJERVZfU1RBVEU0IiAgICAgICAgICAgICAgICAgICAgICAsIDB4MEU5Qn0sCisJeyJJTlRSX0VOMSIgICAgICAgICAgICAgICAgICAgICAgLCAweDBFQTB9LAorCXsiSU5UUl9FTjIiICAgICAgICAgICAgICAgICAgICAgICwgMHgwRUExfSwKKwl7IklOVFJfRU4zIiAgICAgICAgICAgICAgICAgICAgICAsIDB4MEVBMn0sCisJeyJJTlRSX0VONCIgICAgICAgICAgICAgICAgICAgICAgLCAweDBFQTN9LAorCXsiSU5UUl9TUkMxIiAgICAgICAgICAgICAgICAgICAgICAsIDB4MEVCMH0sCisJeyJJTlRSX1NSQzIiICAgICAgICAgICAgICAgICAgICAgICwgMHgwRUIxfSwKKwl7IklOVFJfU1JDMyIgICAgICAgICAgICAgICAgICAgICAgLCAweDBFQjJ9LAorCXsiSU5UUl9TUkM0IiAgICAgICAgICAgICAgICAgICAgICAsIDB4MEVCM30sCisJeyJJTlRSX0ZMQUcxIiAgICAgICAgICAgICAgICAgICAgICAsIDB4MEVDMH0sCisJeyJJTlRSX0ZMQUcyIiAgICAgICAgICAgICAgICAgICAgICAsIDB4MEVDMX0sCisJeyJJTlRSX0ZMQUczIiAgICAgICAgICAgICAgICAgICAgICAsIDB4MEVDMn0sCisJeyJJTlRSX0ZMQUc0IiAgICAgICAgICAgICAgICAgICAgICAsIDB4MEVDM30sCisJeyJFUDBfSU5BS19DTlQiICAgICAgICAgICAgICAgICAgICAsIDB4MEVEMH0sCisJeyJFUDBfT05BS19DTlQiICAgICAgICAgICAgICAgICAgICAsIDB4MEVEMX0sCisJeyJFUDFfTkFLX0NOVCIgICAgICAgICAgICAgICAgICAgICAsIDB4MEVEMn0sCisJeyJFUDJfTkFLX0NOVCIgICAgICAgICAgICAgICAgICAgICAsIDB4MEVEM30sCisJeyJFUDNfTkFLX0NOVCIgICAgICAgICAgICAgICAgICAgICAsIDB4MEVENH0sCisJeyJFUDRfTkFLX0NOVCIgICAgICAgICAgICAgICAgICAgICAsIDB4MEVENX0sCisJeyJFUDVfTkFLX0NOVCIgICAgICAgICAgICAgICAgICAgICAsIDB4MEVENn0sCisJeyJFUDZfTkFLX0NOVCIgICAgICAgICAgICAgICAgICAgICAsIDB4MEVEN30sCisJeyJOQUtfQ05UX0xFVkVMIiAgICAgICAgICAgICAgICAgICAsIDB4MEVEOH0sCisJeyJDQzJfQnVmZmVyX291dCIgICAgICAgICAgICAgICAgICAsIDB4MjAwMH0sCisJeyJDQzJfQnVmZmVyX2luIiAgICAgICAgICAgICAgICAgICAsIDB4NDAwMH0sCisJeyJubWJfdmVjdG9yX2FkZHJlc3NfbHNiIiAgICAgICAgICAsIDB4RkZGQX0sCisJeyJubWJfdmVjdG9yX2FkZHJlc3NfbXNiIiAgICAgICAgICAsIDB4RkZGQn0sCisJeyJyZXNldF92ZWN0b3JfYWRkcmVzc19sc2IiICAgICAgICAsIDB4RkZGQ30sCisJeyJyZXNldF92ZWN0b3JfYWRkcmVzc19tc2IiICAgICAgICAsIDB4RkZGRH0sCisJeyJpcmJfdmVjdG9yX2FkZHJlc3NfbHNiIiAgICAgICAgICAsIDB4RkZGRX0sCisJeyJpcmJfdmVjdG9yX2FkZHJlc3NfbXNiIiAgICAgICAgICAsIDB4RkZGRn0KK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvdXNiL1NSQy9jaW1heCt1c2ItZHJpdmVyLmMgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L3VzYi9TUkMvY2ltYXgrdXNiLWRyaXZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YmJiYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L3VzYi9TUkMvY2ltYXgrdXNiLWRyaXZlci5jCkBAIC0wLDAgKzEsMjUzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKgorICogQGZpbGUgICAgY2ltYXgrdXNiLWRyaXZlci5jCisgKgorICogQGJyaWVmICAgQ0lNYVgrIFVTQiBEcml2ZXIgZm9yIGxpbnV4IGJhc2VkIG9wZXJhdGluZyBzeXN0ZW1zLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDExICAgIEJydW5vIFRvbmVsbGkgICA8YnJ1bm8udG9uZWxsaUBzbWFyZHR2LmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAmIEZyYW5jayBEZXNjb3VycyA8ZnJhbmNrLmRlc2NvdXJzQHNtYXJkdHYuY29tPgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIFNtYXJEVFYgRnJhbmNlLCBMYSBDaW90YXQKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRlJCSVQKKy8qI2RlZmluZSBERUJVRyovCisvKiNkZWZpbmUgREVCVUdfQklUUkFURSovCisvKiNkZWZpbmUgREVCVUdfSVNPQ19JTiovCisvKiNkZWZpbmUgREVCVUdfSVNPQ19PVVQqLworLyojZGVmaW5lIERFQlVHX0NPTlRJTlVJVFkqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbmNsdWRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CisjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kdmIvY2EuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKworI2luY2x1ZGUgImNpbWF4K3VzYi1kcml2ZXIuaCIKKyNpbmNsdWRlICJjaW1heCt1c2JfZncuaCIKKyNpbmNsdWRlICJjaW1heCt1c2JfY29uZmlnLmgiCisjaWZkZWYgVElNRVNUQU1QCisjaW5jbHVkZSAiY2ltYXgrdXNiX3RpbWUuaCIKKyNlbmRpZgorI2luY2x1ZGUgIi4uLy4uL2FtbF9jaW1heF91c2JfcHJpdi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEZWZpbmVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MS4xLjIiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgIkJydW5vIFRvbmVsbGksIHRvbmVsbGlAc21hcmR0di5jb20iCisjZGVmaW5lIERSSVZFUl9ERVNDICJDSU1hWCsgVVNCIERyaXZlciBmb3IgTGludXggKGMpMjAwOS0yMDExIgorCisjZGVmaW5lIERSSVZFUl9NQVhfTlVNQkVSICAgMQorCitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU3RydWN0dXJlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdsb2JhbHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgRlJCSVQKK2ludCBDaW1heENmZyA9IDE7Cittb2R1bGVfcGFyYW1fbmFtZWQoQ2ltYXhDZmcsIENpbWF4Q2ZnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhDaW1heENmZywgIlR1cm4gb24vb2ZmIGNvbmZpZ3VyYXRpb24gb2YgQ0lNYVgrIChkZWZhdWx0OiBvbikiKTsKK2ludCBDaW1heER3bmwgPSAxOworbW9kdWxlX3BhcmFtX25hbWVkKENpbWF4RHdubCwgQ2ltYXhEd25sLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhDaW1heER3bmwsICJFbmFibGUgdXBsb2FkIG9mIEZXIGluIENJTWFYKyBjaGlwIChkZWZhdWx0OiBvbikiKTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGRldmljZV9zICpnZGV2aWNlOworc3RhdGljIHVuc2lnbmVkIGludCBnZGV2aWNlTnVtYmVyOworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgZGV2aWNlX2RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgdGltZXNwZWMgZ1N0YXJ0OworCitzdGF0aWMgX191OCBudWxsSGVhZGVyW10gPSB7CisJMHg0NywgMHgxRiwgMHhGRiwgMHgxRiwgMHhGQSwgMHhERSwgMHhCQSwgMHhCRQorfTsKKworc3RhdGljIHN0cnVjdCBidWxrX3RpbWVyX3MgZ2J1bGtfdGltZXJbREVWSUNFX05VTV9DQU1dOworaW50ICgqY2ltYXhfdXNiX2Rldl9hZGQpKHN0cnVjdCBkZXZpY2VfcyAqZGV2aWNlLCBpbnQgaWQpOworaW50ICgqY2ltYXhfdXNiX2Rldl9yZW1vdmUpKHN0cnVjdCBkZXZpY2VfcyAqZGV2aWNlLCBpbnQgaWQpOworCisjaWZkZWYgVElNRVNUQU1QCitzdGF0aWMgaW50IGJTZXRUaW1lc3RhbXBzOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBERUJVR19DT05USU5VSVRZCisjZGVmaW5lIFRTX01BWFBJRFMgODE5MiAgICAgICAgICAgICAgICAgIC8qIG1heCB2YWx1ZSBvZiBhIFBJRCAqLwordW5zaWduZWQgY2hhciAgICB0YWJfY2NbVFNfTUFYUElEU107CisKK19fdTE2IGdldF90c19waWQodW5zaWduZWQgY2hhciAqcGlkKQoreworCV9fdTE2IHBwID0gMDsKKworCXBwID0gKHBpZFswXSAmIDBYMWYpPDw4OworCXBwIHw9IHBpZFsxXTsKKworCXJldHVybiBwcDsKK30KKworc3RhdGljIHZvaWQgaW5pdF90YWJfY2Modm9pZCkKK3sKKwltZW1zZXQodGFiX2NjLCAweGZmLCBUU19NQVhQSURTKTsKK30KKworc3RhdGljIGludCBkYmdfY2ModW5zaWduZWQgY2hhciAqYnVmKQoreworCWludCBwaWQ7CisJdW5zaWduZWQgY2hhciBjYzsKKworCWlmIChidWZbMF0gIT0gREVWSUNFX01QRUcyX1NZTkNfQllURSkgeworCQllcnIoIk91dCBPZiBTeW5jOiAiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXBpZCA9IGdldF90c19waWQoYnVmICsgMSk7CisKKwlpZiAoIShidWZbM10gJiAweDEwKSkgICAvKiBubyBwYXlsb2FkPyovCisJCXJldHVybiAwOworCisJaWYgKGJ1ZlsxXSAmIDB4ODApCisJCWVycigiRXJyb3IgaW4gVFMgZm9yIFBJRDogJWRcbiIsIHBpZCk7CisKKwkvKiBDaGVjayBjb250aW51aXR5IGNvdW50Ki8KKwljYyA9IHRhYl9jY1twaWRdOworCWlmIChjYyA9PSAyNTUpCisJCWNjID0gKGJ1ZlszXSAmIDE1KTsKKwllbHNlIHsKKwkJY2MgPSAoKGNjKSArIDEpICYgMTU7CisJCWlmIChjYyAhPSAoYnVmWzNdICYgMTUpKSB7CisJCQkvKiBPdGhlcndpc2UsIHRoaXMgaXMgYSByZWFsIGNvcnJ1cHRpb24gKi8KKwkJCWVycigicGlkICVkIGNjICVkIGV4cGVjdGVkIGNjICVkIGFjdHVhbFxuIiwKKwkJCQkJcGlkLCBjYywgYnVmWzNdICYgMTUpOworCQkJY2MgPSAoYnVmWzNdICYgMTUpOworCQl9CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgREVCVUcKK3N0YXRpYyB2b2lkIGRiZ19kdW1wKGNoYXIgKmhkciwgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IHNpemUpCit7CisJaW50IGk7CisJY2hhciBsaW5lWzQwXTsKKwljaGFyIHN0cls5XTsKKwlsaW5lWzBdID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCXNwcmludGYobGluZSwgIiVzJS4yeCAiLCBsaW5lLCBkYXRhW2ldKTsKKwkJaWYgKChkYXRhW2ldID49IDMyKSAmJiAoZGF0YVtpXSA8PSAxMjYpKQorCQkJc3RyW2klOF0gPSBkYXRhW2ldOworCQllbHNlCisJCQlzdHJbaSU4XSA9ICcuJzsKKwkJaWYgKCEoKGkrMSklOCkpIHsKKwkJCXN0cltpJTggKyAxXSA9IDA7CisJCQlkYmdfcygiJXMgJXMgJXMiLCBoZHIsIGxpbmUsIHN0cik7CisJCQlsaW5lWzBdID0gMDsKKwkJfSAvKiBpZiAqLworCX0gLyogZm9yICovCisJaWYgKGklOCkgeworCQlpbnQgajsKKwkJc3RyW2klOCArIDFdID0gMDsKKwkJZm9yIChqID0gKGklOCk7IGogPCA4OyBqKyspCisJCQlzcHJpbnRmKGxpbmUsICIlcyAgICIsIGxpbmUpOworCQlkYmdfcygiJXMgJXMgJXMiLCBoZHIsIGxpbmUsIHN0cik7CisJCWxpbmVbMF0gPSAwOworCX0gLyogaWYgKi8KK30gLyogZGJnX2R1bXAgKi8KKyNlbHNlCisjZGVmaW5lIGRiZ19kdW1wKGZvcm1hdCwgYXJnLi4uKSBkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBERUJVRyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjb3B5RGF0YUZyb20oaW50IHVzLAorCQl2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQoreworCWlmICh1cykKKwkJcmV0dXJuIGNvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKTsKKwltZW1jcHkodG8sIGZyb20sIG4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjb3B5RGF0YVRvKGludCB1cywKKwkJdm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKK3sKKwlpZiAodXMpCisJCXJldHVybiBjb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pOworCW1lbWNweSh0bywgZnJvbSwgbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZiX2luaXQoc3RydWN0IHZpZGVvX2J1Zl9zICpidWYpCit7CisJYnVmLT5yZWFkT2Zmc2V0ID0gMDsKKwlidWYtPndyaXRlT2Zmc2V0ID0gMDsKKwlidWYtPmlzRW1wdHkgPSAxOworfSAvKiB2Yl9pbml0ICovCisKK3N0YXRpYyBpbnQgdmJfZ2V0X3dyaXRlX3NpemUoc3RydWN0IHZpZGVvX2J1Zl9zICpidWYpCit7CisJaW50IHdyaXRlU2l6ZSA9IDA7CisKKwlpZiAoYnVmLT53cml0ZU9mZnNldCA9PSBidWYtPnJlYWRPZmZzZXQpIHsKKwkJaWYgKGJ1Zi0+aXNFbXB0eSkKKwkJCXdyaXRlU2l6ZSA9IERFVklDRV9WQl9MRU5HVEg7CisJfSBlbHNlIGlmIChidWYtPndyaXRlT2Zmc2V0ID4gYnVmLT5yZWFkT2Zmc2V0KQorCQl3cml0ZVNpemUgPQorCQkJREVWSUNFX1ZCX0xFTkdUSCAtIChidWYtPndyaXRlT2Zmc2V0IC0gYnVmLT5yZWFkT2Zmc2V0KTsKKwllbHNlCisJCXdyaXRlU2l6ZSA9IGJ1Zi0+cmVhZE9mZnNldCAtIGJ1Zi0+d3JpdGVPZmZzZXQ7CisJcmV0dXJuIHdyaXRlU2l6ZTsKK30gLyogdmJfZ2V0X3dyaXRlX3NpemUgKi8KKworc3RhdGljIGludCB2Yl93cml0ZShzdHJ1Y3QgdmlkZW9fYnVmX3MgKmJ1ZiwgX191OCAqZGF0YSwgaW50IHNpemUpCit7CisJaW50IHdyaXRlU2l6ZSA9IHZiX2dldF93cml0ZV9zaXplKGJ1Zik7CisJaW50IGZpcnN0UGFydCA9IERFVklDRV9WQl9MRU5HVEggLSBidWYtPndyaXRlT2Zmc2V0OworCWlmIChzaXplID4gd3JpdGVTaXplKQorCQlzaXplID0gd3JpdGVTaXplOworCisJaWYgKHNpemUgPCBmaXJzdFBhcnQpIHsKKwkJbWVtY3B5KCZidWYtPmRhdGFbYnVmLT53cml0ZU9mZnNldF0sIGRhdGEsIHNpemUpOworCQlidWYtPndyaXRlT2Zmc2V0ICs9IHNpemU7CisJfSAvKiBpZiAqLyBlbHNlIHsKKwkJbWVtY3B5KCZidWYtPmRhdGFbYnVmLT53cml0ZU9mZnNldF0sIGRhdGEsIGZpcnN0UGFydCk7CisJCW1lbWNweShidWYtPmRhdGEsICZkYXRhW2ZpcnN0UGFydF0sIHNpemUgLSBmaXJzdFBhcnQpOworCQlidWYtPndyaXRlT2Zmc2V0ID0gc2l6ZSAtIGZpcnN0UGFydDsKKwl9IC8qIGVsc2UgKi8KKworCWlmIChzaXplID4gMCkKKwkJYnVmLT5pc0VtcHR5ID0gMDsKKwlyZXR1cm4gc2l6ZTsKK30gLyogdmJfd3JpdGUgKi8KKworc3RhdGljIGludCB2Yl9yZWFkX25leHQoc3RydWN0IHZpZGVvX2J1Zl9zICpidWYsIF9fdTggKmRhdGEpCit7CisJaW50IHJlYWRTaXplOworCWludCBmaXJzdFBhcnQ7CisJaW50IG5leHRPZmZzZXQ7CisJaW50IGlzU3R1ZmZpbmc7CisJaW50IHJldDsKKworCXJlYWRTaXplID0gREVWSUNFX1ZCX0xFTkdUSCAtIHZiX2dldF93cml0ZV9zaXplKGJ1Zik7CisJbmV4dE9mZnNldCA9IGJ1Zi0+cmVhZE9mZnNldCArIERFVklDRV9NUEVHMl9QQUNLRVRfU0laRTsKKwlpZiAobmV4dE9mZnNldCA+PSBERVZJQ0VfVkJfTEVOR1RIKQorCQluZXh0T2Zmc2V0IC09IERFVklDRV9WQl9MRU5HVEg7CisJd2hpbGUgKHJlYWRTaXplID4gREVWSUNFX01QRUcyX1BBQ0tFVF9TSVpFKSB7CisJCWlmICgoYnVmLT5kYXRhW2J1Zi0+cmVhZE9mZnNldF0gPT0gREVWSUNFX01QRUcyX1NZTkNfQllURSkgJiYKKwkJCShidWYtPmRhdGFbbmV4dE9mZnNldF0gPT0gREVWSUNFX01QRUcyX1NZTkNfQllURSkpIHsKKwkJCS8qIHBhY2tldCBpbiBzeW5jICovCisJCQlicmVhazsKKwkJfSAvKiBpZiAqLworCQlidWYtPnJlYWRPZmZzZXQrKzsKKwkJaWYgKGJ1Zi0+cmVhZE9mZnNldCA9PSBERVZJQ0VfVkJfTEVOR1RIKQorCQkJYnVmLT5yZWFkT2Zmc2V0ID0gMDsKKwkJbmV4dE9mZnNldCsrOworCQlpZiAobmV4dE9mZnNldCA9PSBERVZJQ0VfVkJfTEVOR1RIKQorCQkJbmV4dE9mZnNldCA9IDA7CisJCXJlYWRTaXplLS07CisJfSAvKiB3aGlsZSAqLworCWlmIChyZWFkU2l6ZSA8PSBERVZJQ0VfTVBFRzJfUEFDS0VUX1NJWkUpIHsKKwkJYnVmLT5pc0VtcHR5ID0gMTsKKwkJcmV0dXJuIDA7CisJfSAvKiBpZiAqLworCisJLyogcGFja2V0IGlzIGluIHN5bmMsIGNoZWNrIGlmIGl0IGlzIGEgc3R1ZmZpbmcgcGFja2V0ICovCisJaXNTdHVmZmluZyA9IDA7CisJZmlyc3RQYXJ0ID0gREVWSUNFX1ZCX0xFTkdUSCAtIGJ1Zi0+cmVhZE9mZnNldDsKKwlpZiAoZmlyc3RQYXJ0IDwgREVWSUNFX05VTExfSEVBREVSX1NJWkUpIHsKKwkJaWYgKChtZW1jbXAobnVsbEhlYWRlciwgJmJ1Zi0+ZGF0YVtidWYtPnJlYWRPZmZzZXRdLCBmaXJzdFBhcnQpCisJCQkJPT0gMCkgJiYKKwkJCQkobWVtY21wKCZudWxsSGVhZGVyW2ZpcnN0UGFydF0sIGJ1Zi0+ZGF0YSwKKwkJCQkJICAgIERFVklDRV9OVUxMX0hFQURFUl9TSVpFIC0gZmlyc3RQYXJ0KQorCQkJCQk9PSAwKSkgeworCQkJaXNTdHVmZmluZyA9IDE7CisJCX0gLyogaWYgKi8KKwl9IC8qIGlmICovCisJZWxzZSB7CisJCWlmIChtZW1jbXAobnVsbEhlYWRlciwgJmJ1Zi0+ZGF0YVtidWYtPnJlYWRPZmZzZXRdLAorCQkJCQlERVZJQ0VfTlVMTF9IRUFERVJfU0laRSkgPT0gMCkgeworCQkJaXNTdHVmZmluZyA9IDE7CisJCX0gLyogaWYgKi8KKwl9IC8qIGVsc2UgKi8KKwlyZWFkU2l6ZSAtPSBERVZJQ0VfTVBFRzJfUEFDS0VUX1NJWkU7CisJaWYgKHJlYWRTaXplIDw9IERFVklDRV9NUEVHMl9QQUNLRVRfU0laRSkKKwkJYnVmLT5pc0VtcHR5ID0gMTsKKworCS8qIHNraXAgc3R1ZmZpbmcgcGFja2V0ICovCisJaWYgKGlzU3R1ZmZpbmcpIHsKKwkJYnVmLT5yZWFkT2Zmc2V0ID0gbmV4dE9mZnNldDsKKwkJcmV0dXJuIDA7CisJfSAvKiBpZiAqLworCisJLyogY29weSBwYWNrZXQgdG8gdXNlciBzcGFjZSAqLworCWlmIChmaXJzdFBhcnQgPj0gREVWSUNFX01QRUcyX1BBQ0tFVF9TSVpFKSB7CisJCXJldCA9IGNvcHlfdG9fdXNlcihkYXRhLAorCQkJJmJ1Zi0+ZGF0YVtidWYtPnJlYWRPZmZzZXRdLCBERVZJQ0VfTVBFRzJfUEFDS0VUX1NJWkUpOworCX0gLyogaWYgKi8gZWxzZSB7CisJCXJldCA9IGNvcHlfdG9fdXNlcihkYXRhLAorCQkJJmJ1Zi0+ZGF0YVtidWYtPnJlYWRPZmZzZXRdLCBmaXJzdFBhcnQpOworCQlyZXQgPSBjb3B5X3RvX3VzZXIoJmRhdGFbZmlyc3RQYXJ0XSwKKwkJCWJ1Zi0+ZGF0YSwgREVWSUNFX01QRUcyX1BBQ0tFVF9TSVpFIC0gZmlyc3RQYXJ0KTsKKwl9IC8qIGVsc2UgKi8KKwlidWYtPnJlYWRPZmZzZXQgPSBuZXh0T2Zmc2V0OworCXJldHVybiBERVZJQ0VfTVBFRzJfUEFDS0VUX1NJWkU7Cit9IC8qIHZiX3JlYWRfbmV4dCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIERFQlVHX0JJVFJBVEUKK3N0YXRpYyB2b2lkIHByaW50X2JpdHJhdGUoc3RydWN0IHRzX2NoYW5uZWxfcyAqY2hhbm5lbCwgX191OCBjaGFubmVsX251bWJlcikKK3sKKwlpbnQgICAgIHJlYWRTaXplOworCWt0aW1lX3QgIGN1cnJlbnRUaW1lOworCWludCAgZGlmZlRpbWVfdXM7CisJaW50IGJpdHJhdGU7CisKKwljdXJyZW50VGltZSA9IGt0aW1lX2dldF9yZWFsKCk7CisJaWYgKCEoY2hhbm5lbC0+Yml0cmF0ZVRpbWUudHY2NCkpIHsKKwkJY2hhbm5lbC0+Yml0cmF0ZVRpbWUgPSBjdXJyZW50VGltZTsKKwl9IGVsc2UgeworCQlyZWFkU2l6ZSA9IERFVklDRV9WQl9MRU5HVEggLSB2Yl9nZXRfd3JpdGVfc2l6ZSgmY2hhbm5lbC0+aW5WYik7CisJCWRiZygiJWQgYnl0ZXMgcmVjZWl2ZWRcbiIsIHJlYWRTaXplKTsKKwkJZGlmZlRpbWVfdXMgPSAoaW50KShrdGltZV91c19kZWx0YShjdXJyZW50VGltZSwKKwkJCQkJY2hhbm5lbC0+Yml0cmF0ZVRpbWUpKTsKKwkJaWYgKGRpZmZUaW1lX3VzKSB7CisJCQliaXRyYXRlID0gKGludCkoKHJlYWRTaXplICogOCAqIFVTRUNfUEVSX1NFQykKKwkJCQkJLyBkaWZmVGltZV91cyk7CisJCX0KKwkJY2hhbm5lbC0+Yml0cmF0ZVRpbWUgPSBjdXJyZW50VGltZTsKKwkJZGJnKCJyZWNlaXZlZCBiaXRyYXRlIGZvciBjaGFubmVsWyVkXSA9ICVkYnBzXG4iLAorCQkJY2hhbm5lbF9udW1iZXIsIGJpdHJhdGUpOworCX0KK30KKyNlbmRpZiAvKiBERUJVR19CSVRSQVRFICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBkZXZpY2VfY2lidWxrX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlkYmcoInN0YXJ0Iik7CisJa2ZyZWUodXJiLT50cmFuc2Zlcl9idWZmZXIpOworCXVzYl9mcmVlX3VyYih1cmIpOworCWRiZygiZW5kIik7Cit9IC8qIGRldmljZV9jaWJ1bGtfY29tcGxldGUgKi8KKworc3RhdGljIGludCBkZXZpY2VfY2lidWxrX3NlbmQoc3RydWN0IGRldmljZV9zICpkZXZpY2UsCisJCXN0cnVjdCBpb2N0bF9kYXRhX3MgKmRhdGEsCisJCWludCB1c2VyX3NwYWNlKQoreworCWludCAgICAgICAgIHJlczsKKwlzdHJ1Y3QgdXJiICp1cmI7CisJaW50ICAgICAgICAgc2l6ZTsKKwlpbnQgICAgICAgICBpbmRleCA9IC0xOworCV9fdTggICAgICAgICpwdHI7CisJX191MzIgICAgICAgdG9kbyA9IGRhdGEtPnR4U2l6ZTsKKwlfX3U4ICAgICAgICAqdXNlckRhdGEgPSBkYXRhLT50eERhdGE7CisKKwlkYmcoInN0YXJ0Iik7CisKKwlkbyB7CisJCS8qIGdldCBhIGZyZWUgYnVsayBtZXNzYWdlICovCisJCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJCWlmICghdXJiKSB7CisJCQllcnIoImFsbG9jIHVyYiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0gLyogaWYgKi8KKwkJdXJiLT5kZXYgPSBkZXZpY2UtPnVzYmRldjsKKworCQkvKiBhbGxvY2F0ZSBidWxrIGRhdGEgKi8KKwkJc2l6ZSA9IGRldmljZS0+Y2lCdWxrLm91dE1heFBhY2tldFNpemU7CisJCWlmICh0b2RvIDwgc2l6ZSkKKwkJCXNpemUgPSB0b2RvOworCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghdXJiLT50cmFuc2Zlcl9idWZmZXIpIHsKKwkJCWVycigiYWxsb2MgdHJhbnNmZXIgYnVmZmVyIik7CisJCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9IC8qIGlmICovCisKKwkJLyogY29weSBkYXRhICovCisJCXB0ciA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOworCQlyZXMgPSBjb3B5RGF0YUZyb20odXNlcl9zcGFjZSwgcHRyLCB1c2VyRGF0YSwgc2l6ZSk7CisKKyNpZmRlZiBUSU1FU1RBTVAKKwkJaWYgKGJTZXRUaW1lc3RhbXBzKSB7CisJCQlpZiAoaW5kZXggPT0gLTEpIHsKKwkJCQlTZXRUaW1lc3RhbXAoInVyYiAleCwgdG9TZW5kICVkLCBzZW5kICVkIiwKKwkJCQkJICAgIHVyYiwgdG9kbywgc2l6ZSk7CisJCQkJU2V0VGltZXN0YW1wKCJjbWQgMHglMDJ4IiwgcHRyWzBdKTsKKwkJCX0gZWxzZSB7CisJCQkJU2V0VGltZXN0YW1wKCJ1cmIgJXgsIHRvU2VuZCAlZCwgc2VuZCAlZCIsCisJCQkJCSAgICB1cmIsIHRvZG8sIHNpemUpOworCQkJfQorCQl9CisjZW5kaWYKKworCQkvKiBmaXJzdCBwYWNrZXQsIGdldCBpbmRleCAqLworCQlpZiAoaW5kZXggPT0gLTEpIHsKKwkJCWlmICgocHRyW0RFVklDRV9DT01NQU5EX09GRlNFVF0gPT0gREVWSUNFX0NNRF9JTklUKSB8fAorCQkJCShwdHJbREVWSUNFX0NPTU1BTkRfT0ZGU0VUXQorCQkJCQk9PSBERVZJQ0VfQ01EX1dSSVRFX1JFRykgfHwKKwkJCQkocHRyW0RFVklDRV9DT01NQU5EX09GRlNFVF0KKwkJCQkJPT0gREVWSUNFX0NNRF9SRUFEX1JFRykpIHsKKwkJCQlpbmRleCA9IDA7IC8qIHJlZ2lzdGVyIGNvbW1hbmQsIG5vIG1vZHVsZSAqLworCQkJfSBlbHNlIGlmIChwdHJbREVWSUNFX0NPTU1BTkRfT0ZGU0VUXQorCQkJCQkmIERFVklDRV9TRUxfTUFTSykgeworCQkJCWluZGV4ID0gMTsgLyogbW9kdWxlIEIgKi8KKwkJCX0gZWxzZSB7CisJCQkJaW5kZXggPSAwOyAvKiBtb2R1bGUgQSAqLworCQkJfSAvKiBlbHNlICovCisJCQlkZXZpY2UtPmNpQnVsay5jaURhdGFbaW5kZXhdLnN5bmNEYXRhU2l6ZSA9IDA7CisJCQlkZXZpY2UtPmNpQnVsay5jaURhdGFbaW5kZXhdLnN5bmNTaWduYWwgPSAwOworCQl9IC8qIGlmICovCisKKwkJLyogc3VibWl0IGJ1bGsgKi8KKwkJdXJiLT5waXBlID0gdXNiX3NuZGJ1bGtwaXBlKGRldmljZS0+dXNiZGV2LAorCQkJCURFVklDRV9CVUxLX09VVF9QSVBFKTsKKwkJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gc2l6ZTsKKwkJdXJiLT5jb21wbGV0ZSA9IGRldmljZV9jaWJ1bGtfY29tcGxldGU7CisJCXVyYi0+Y29udGV4dCAgPSBOVUxMOworCQlkYmdfZHVtcCgidHhCdWYiLCB1cmItPnRyYW5zZmVyX2J1ZmZlciwKKwkJCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOworCQlyZXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9LRVJORUwpOworCQlpZiAocmVzIDwgMCkgeworCQkJZXJyKCJzdWJtaXQgdXJiIHJlcyA9ICVkIiwgcmVzKTsKKwkJCWtmcmVlKHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJCXVzYl9mcmVlX3VyYih1cmIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0gLyogaWYgKi8KKwkJdG9kbyAtPSBzaXplOworCQl1c2VyRGF0YSArPSBzaXplOworCX0gd2hpbGUgKHRvZG8pOworCisJZGV2aWNlLT5jaUJ1bGsuY2lEYXRhW2luZGV4XS5iUGVuZGluZ1NlbmQgPSAxOworCWRiZygiZW5kIik7CisJcmV0dXJuIGluZGV4OworfSAvKiBkZXZpY2VfY2lidWxrX3NlbmQgKi8KKworc3RhdGljIHZvaWQgZGV2aWNlX2ludF9jb21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIpCit7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCXN0cnVjdCBkZXZpY2VfcyAqZGV2aWNlID0gdXJiLT5jb250ZXh0OworCV9fdTggICAgICAgICAgICAqZGF0YVRvQ29weTsKKwlpbnQgICAgICAgICAgICAgc2l6ZVRvQ29weSwgU2l6ZVJlY2VpdmVkOworCV9fdTggICAgICAgICAgICBpc0ZpcnN0UGFja2V0ID0gMDsKKwlfX3U4ICAgICAgICAgICAgaXNMYXN0UGFja2V0ID0gMDsKKwlfX3U4ICAgICAgICAgICAgaW5kZXgsIGk7CisJX191OCAgICAgICAgICAgIHN0YXR1czsKKwlzdHJ1Y3QgbWVzc2FnZV9ub2RlX3MgKm1lc3NhZ2U7CisKKwlkYmcoInN0YXJ0Iik7CisKKwlpZiAodXJiLT5zdGF0dXMpIHsKKwkJZGJnKCJ1cmIgc3RhdHVzICVkLCBub3Qgc3VibWl0dGVkIGFnYWluIiwgdXJiLT5zdGF0dXMpOworCQlrZnJlZSh1cmItPnRyYW5zZmVyX2J1ZmZlcik7CisJCXVzYl9mcmVlX3VyYih1cmIpOworCQlmb3IgKGkgPSAwOyBpIDwgREVWSUNFX05VTV9JTlRfSU5fVVJCUzsgaSsrKSB7CisJCQlpZiAoZGV2aWNlLT5jaUJ1bGsuaW50VXJiW2ldID09IHVyYikKKwkJCQlkZXZpY2UtPmNpQnVsay5pbnRVcmJbaV0gPSBOVUxMOworCQl9CisJCXJldHVybjsKKwl9IC8qIGlmICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlLT5jaUJ1bGsuaW50VXJiTG9jaywgZmxhZ3MpOworCWRiZygidXJiIHN0YXR1cyAlZCwgdHJhbnNmZXJfYnVmZmVyX2xlbmd0aCAlZCBhY3R1YWxfbGVuZ3RoICVkIiwKKwkJCXVyYi0+c3RhdHVzLAorCQkJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAorCQkJdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwlkYXRhVG9Db3B5ID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJU2l6ZVJlY2VpdmVkID0gIHVyYi0+YWN0dWFsX2xlbmd0aDsKKwlkYmdfZHVtcCgidG90YWwgcnhCdWYiLCBkYXRhVG9Db3B5LCBTaXplUmVjZWl2ZWQpOworCisKKwlkbyB7CisJCWlmIChkZXZpY2UtPmNpQnVsay5pbnRTaXplVG9SZWNlaXZlID09IDApIHsKKwkJCWlmICghZGF0YVRvQ29weVtERVZJQ0VfU1RBVFVTX09GRlNFVF0gJiYKKwkJCQkJIWRhdGFUb0NvcHlbREVWSUNFX0xFTkdUSF9NU0JfT0ZGU0VUXSAmJgorCQkJCQkhZGF0YVRvQ29weVtERVZJQ0VfTEVOR1RIX0xTQl9PRkZTRVRdICYmCisJCQkJCSFkYXRhVG9Db3B5W0RFVklDRV9DT1VOVEVSX09GRlNFVF0peworCQkJCWRiZygibm8gZGF0YSByZWNlaXZlIik7CisJCQkJbWVtc2V0KHVyYi0+dHJhbnNmZXJfYnVmZmVyLAorCQkJCQkJMCwgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKTsKKwkJCQl1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCS8qIGZpcnN0IHBhY2tldCwgcmVhZCBoZWFkZXIgKi8KKwkJCWlzRmlyc3RQYWNrZXQgPSAxOworCQkJZGV2aWNlLT5jaUJ1bGsuaW50Q3VyclN0YXR1cyA9CisJCQkJZGF0YVRvQ29weVtERVZJQ0VfU1RBVFVTX09GRlNFVF0gJgorCQkJCURFVklDRV9DTURfTUFTSzsKKwkJCWlmIChkYXRhVG9Db3B5W0RFVklDRV9TVEFUVVNfT0ZGU0VUXQorCQkJCSYgREVWSUNFX1NFTF9NQVNLKSB7CisJCQkJZGV2aWNlLT5jaUJ1bGsuaW50Q3VyckluZGV4ID0gMTsgLyogbW9kdWxlIEIgKi8KKwkJCX0gZWxzZSB7CisJCQkJZGV2aWNlLT5jaUJ1bGsuaW50Q3VyckluZGV4ID0gMDsgLyogbW9kdWxlIEEgKi8KKwkJCX0KKwkJCWlmICgoZGV2aWNlLT5jaUJ1bGsuaW50Q3VyclN0YXR1cyA9PSBERVZJQ0VfUkVBRF9SRUdPSykKKwkJCQl8fCAoZGV2aWNlLT5jaUJ1bGsuaW50Q3VyclN0YXR1cworCQkJCQk9PSBERVZJQ0VfV1JJVEVfUkVHT0spKSB7CisJCQkJZGV2aWNlLT5jaUJ1bGsuaW50U2l6ZVRvUmVjZWl2ZSA9CisJCQkJCWRhdGFUb0NvcHlbREVWSUNFX0xFTkdUSF9MU0JfT0ZGU0VUXSArCisJCQkJCURFVklDRV9EQVRBX09GRlNFVDsKKwkJCX0gZWxzZSB7CisJCQkJZGV2aWNlLT5jaUJ1bGsuaW50U2l6ZVRvUmVjZWl2ZSA9CisJCQkJZGF0YVRvQ29weVtERVZJQ0VfTEVOR1RIX01TQl9PRkZTRVRdICogMjU2CisJCQkJCSsgZGF0YVRvQ29weVtERVZJQ0VfTEVOR1RIX0xTQl9PRkZTRVRdCisJCQkJCSsgREVWSUNFX0RBVEFfT0ZGU0VUOworCQkJfQorCQl9IC8qIGlmICovCisKKwkJLyogZ2V0IGxhc3QgcGFja2V0IHN0YXRlICovCisJCXN0YXR1cyAgICAgPSBkZXZpY2UtPmNpQnVsay5pbnRDdXJyU3RhdHVzOworCQlpbmRleCAgICAgID0gZGV2aWNlLT5jaUJ1bGsuaW50Q3VyckluZGV4OworCQlzaXplVG9Db3B5ID0gZGV2aWNlLT5jaUJ1bGsuaW50U2l6ZVRvUmVjZWl2ZTsKKwkJaWYgKHNpemVUb0NvcHkgPiB1cmItPmFjdHVhbF9sZW5ndGgpIHsKKwkJCS8qIGxpbWl0IHNpemUgdG8gcmVjZWl2ZWQgYnVmZmVyIHNpemUgKi8KKwkJCXNpemVUb0NvcHkgPSB1cmItPmFjdHVhbF9sZW5ndGg7CisJCX0gLyogaWYgKi8gZWxzZQorCQkJaXNMYXN0UGFja2V0ID0gMTsKKwkJZGJnX2R1bXAoInJ4QnVmIiwgZGF0YVRvQ29weSwgc2l6ZVRvQ29weSk7CisKKyNpZm5kZWYgRlJCSVQKKwkJaWYgKHN0YXR1cyA9PSBERVZJQ0VfREFUQVJFQURZKSB7CisJCQlpZiAoZGV2aWNlLT5jaUJ1bGsuY2lEYXRhW2luZGV4XS5iUGVuZGluZ1NlbmQpCisJCQkJc3RhdHVzID0gREVWSUNFX0RBVEFSRUFEWV9TWU5DOworCQl9CisjZW5kaWYKKworI2lmZGVmIFRJTUVTVEFNUAorCQlpZiAoZGV2aWNlLT5jaUJ1bGsuaW50U2l6ZVRvUmVjZWl2ZSA+IDIwMDApCisJCQliU2V0VGltZXN0YW1wcyA9IDE7CisJCWlmIChiU2V0VGltZXN0YW1wcykgeworCQkJU2V0VGltZXN0YW1wKCJ1cmIgJXgsdG9SZWNlaXZlICVkLHJlY2VpdmVkICVkLHRvQ29weSVkIiwKKwkJCQl1cmIsCisJCQkJZGV2aWNlLT5jaUJ1bGsuaW50U2l6ZVRvUmVjZWl2ZSwKKwkJCQlTaXplUmVjZWl2ZWQsCisJCQkJc2l6ZVRvQ29weSk7CisJCQlTZXRUaW1lc3RhbXAoInN0YXR1cyAweCUwMngsIGNhbUluZGV4ICVkLCBpc0xhc3QgJWQiLAorCQkJCXN0YXR1cywgaW5kZXgsIGlzTGFzdFBhY2tldCk7CisJCX0KKyNlbmRpZgorCisJCXN3aXRjaCAoc3RhdHVzKSB7CisJCWNhc2UgREVWSUNFX0lOSVRPSzoKKwkJY2FzZSBERVZJQ0VfUkVBRF9SRUdPSzoKKwkJY2FzZSBERVZJQ0VfV1JJVEVfUkVHT0s6CisJCQlpbmRleCA9IDA7CisJCWNhc2UgREVWSUNFX0NBTVJFU0VUT0s6CisJCQkvKm9ubHkgZm9yIGRlYnVnKi8KKwkJCWlmICghZGF0YVRvQ29weVtERVZJQ0VfU1RBVFVTX09GRlNFVF0gJiYKKwkJCQkhZGF0YVRvQ29weVtERVZJQ0VfTEVOR1RIX01TQl9PRkZTRVRdICYmCisJCQkJIWRhdGFUb0NvcHlbREVWSUNFX0xFTkdUSF9MU0JfT0ZGU0VUXSAmJgorCQkJCSFkYXRhVG9Db3B5W0RFVklDRV9DT1VOVEVSX09GRlNFVF0peworCQkJCWJyZWFrOworCQkJfQorCQljYXNlIERFVklDRV9DSVNPSzoKKwkJY2FzZSBERVZJQ0VfV1JJVEVDT1JPSzoKKwkJY2FzZSBERVZJQ0VfTkVHT1RJQVRFT0s6CisJCWNhc2UgREVWSUNFX1dSSVRFTFBEVU9LOgorCQljYXNlIERFVklDRV9XUklURUxQRFVCVVNZOgorCQljYXNlIERFVklDRV9SRUFETFBEVU9LOgorCQljYXNlIERFVklDRV9XUklURUVYVE9LOgorCQljYXNlIERFVklDRV9SRUFERVhUT0s6CisJCWNhc2UgREVWSUNFX05PX0NBTToKKwkJY2FzZSBERVZJQ0VfTk9LOgorCQljYXNlIERFVklDRV9NQ0FSRF9XUklURU9LOgorCQljYXNlIERFVklDRV9DQU1QQVJTRV9FUlJPUjoKKwkJY2FzZSBERVZJQ0VfQ01EUEVORElORzoKKwkJY2FzZSBERVZJQ0VfUkVHU1RBVFVTT0s6CisJCWNhc2UgREVWSUNFX0RBVEFSRUFEWV9TWU5DOgorCQkJLyogY29weSBwYXJ0aWFsIG1lc3NhZ2UgKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpY2UtPmNpQnVsay5pbnRMb2NrLAorCQkJCWZsYWdzKTsKKwkJCW1lbWNweSgmZGV2aWNlLT5jaUJ1bGsuY2lEYXRhW2luZGV4XS4KKwkJCQlzeW5jRGF0YVtkZXZpY2UtPmNpQnVsay5jaURhdGFbaW5kZXhdLgorCQkJCXN5bmNEYXRhU2l6ZV0sCisJCQkJZGF0YVRvQ29weSwgc2l6ZVRvQ29weSk7CisJCQlkZXZpY2UtPmNpQnVsay5pbnRTaXplVG9SZWNlaXZlIC09IHNpemVUb0NvcHk7CisJCQlkZXZpY2UtPmNpQnVsay5jaURhdGFbaW5kZXhdLnN5bmNEYXRhU2l6ZSArPQorCQkJCXNpemVUb0NvcHk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2UtPmNpQnVsay5pbnRMb2NrLAorCQkJCWZsYWdzKTsKKwkJCWRiZygiY29waWVkICVkIGJ5dGVzIGF0IG9mZnNldCAlZCIsIHNpemVUb0NvcHksCisJCQkJZGV2aWNlLT5jaUJ1bGsuY2lEYXRhW2luZGV4XS4KKwkJCQlzeW5jRGF0YVNpemUgLSBzaXplVG9Db3B5KTsKKworCQkJaWYgKGlzTGFzdFBhY2tldCkgeworCQkJCS8qIGxhc3QgcGFja2V0IHJlY2VpdmVkLCBzeW5jIG1lc3NhZ2UgKi8KKwkJCQlkZXZpY2UtPmNpQnVsay5jaURhdGFbaW5kZXhdLnN5bmNTaWduYWwgPSAxOworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2aWNlLT5jaUJ1bGsuCisJCQkJCWNpRGF0YVtpbmRleF0uc3luY1dhaXQpOworCQkJCWRldmljZS0+Y2lCdWxrLmNpRGF0YVtpbmRleF0uYlBlbmRpbmdTZW5kID0gMDsKKwkJCQlkYmcoInN5bmMgc2lnbmFsIHJldHVybiAlZCAlZCAiLAorCQkJCQlkZXZpY2UtPmNpQnVsay5jaURhdGFbaW5kZXhdLgorCQkJCQkJc3luY0RhdGFTaXplLCBpbmRleCk7CisJCQl9IC8qIGlmICovCisJCQlicmVhazsKKwkJY2FzZSBERVZJQ0VfQ0FNREVUOgorCQljYXNlIERFVklDRV9EQVRBUkVBRFk6CisJCWNhc2UgREVWSUNFX01DQVJEX1JFQUQ6CisJCWNhc2UgREVWSUNFX0ZSQml0OgorCQkJaWYgKGlzRmlyc3RQYWNrZXQpIHsKKwkJCQkvKiBjcmVhdGUgbmV3IGFzeW5jIG1lc3NhZ2UgKi8KKwkJCQltZXNzYWdlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1lc3NhZ2Vfbm9kZV9zKSwKKwkJCQkJR0ZQX0FUT01JQyk7CisJCQkJaWYgKCFtZXNzYWdlKSB7CisJCQkJCWVycigiY2Fubm90IGFsbG9jYXRlIGFzeW5jIG1lc3NhZ2UiKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCW1lbXNldChtZXNzYWdlLAorCQkJCQkwLCBzaXplb2Yoc3RydWN0IG1lc3NhZ2Vfbm9kZV9zKSk7CisJCQkJbGlzdF9hZGRfdGFpbCgmbWVzc2FnZS0+bm9kZSwKKwkJCQkJJmRldmljZS0+Y2lCdWxrLmNpRGF0YVtpbmRleF0uCisJCQkJCQlhc3luY0RhdGFMaXN0KTsKKwkJCX0gLyogaWYgKi8KKwkJCWVsc2UgeworCQkJCS8qIGdldCB0YWlsIG1lc3NhZ2UgKi8KKwkJCQltZXNzYWdlID0gbGlzdF9lbnRyeSgoZGV2aWNlLT5jaUJ1bGsuCisJCQkJCWNpRGF0YVtpbmRleF0uYXN5bmNEYXRhTGlzdC5wcmV2KSwKKwkJCQkJc3RydWN0IG1lc3NhZ2Vfbm9kZV9zLCBub2RlKTsKKwkJCX0gLyogZWxzZSAqLworCisJCQkvKiBjb3B5IHBhcnRpYWwgbWVzc2FnZSAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+Y2lCdWxrLmludExvY2ssIGZsYWdzKTsKKwkJCW1lbWNweSgmbWVzc2FnZS0+ZGF0YVttZXNzYWdlLT5zaXplXSwKKwkJCQkJZGF0YVRvQ29weSwgc2l6ZVRvQ29weSk7CisJCQlkZXZpY2UtPmNpQnVsay5pbnRTaXplVG9SZWNlaXZlIC09IHNpemVUb0NvcHk7CisJCQltZXNzYWdlLT5zaXplICs9IHNpemVUb0NvcHk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2UtPmNpQnVsay5pbnRMb2NrLCBmbGFncyk7CisJCQlkYmcoImFzeW5jIGNvcGllZCAlZCBieXRlcyBhdCBvZmZzZXQgJWQiLCBzaXplVG9Db3B5LAorCQkJCW1lc3NhZ2UtPnNpemUgLSBzaXplVG9Db3B5KTsKKworCQkJaWYgKGlzTGFzdFBhY2tldCkgeworCQkJCS8qIGxhc3QgcGFja2V0IHJlY2VpdmVkLCBzaWduYWwgYXN5bmMgbWVzc2FnZSAqLworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2aWNlLT5jaUJ1bGsuCisJCQkJCWNpRGF0YVtpbmRleF0uYXN5bmNXYWl0KTsKKwkJCQlkYmcoImFzeW5jIHNpZ25hbCAlZCIsIGluZGV4KTsKKwkJCX0gLyogaWYgKi8KKwkJCWJyZWFrOworCQljYXNlIERFVklDRV9HUElPQ0hBTkdFOgorCQkJaW5mbygiR1BJTyBjaGFuZ2UgJXggJXggJXgiLAorCQkJCXN0YXR1cywgZGF0YVRvQ29weVs0XSwgZGF0YVRvQ29weVs1XSk7CisJCQlkZXZpY2UtPmNpQnVsay5pbnRTaXplVG9SZWNlaXZlIC09IHNpemVUb0NvcHk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVycigidW5rbm93biBzdGF0dXMgMHglMngiLCBzdGF0dXMpOworCQkJYnJlYWs7CisJCX0gLyogc3dpdGNoICovCisJCWRhdGFUb0NvcHkgKz0gc2l6ZVRvQ29weTsKKwkJU2l6ZVJlY2VpdmVkIC09IHNpemVUb0NvcHk7CisKKwl9IHdoaWxlIChTaXplUmVjZWl2ZWQgPiAwKTsKKworCW1lbXNldCh1cmItPnRyYW5zZmVyX2J1ZmZlciwgMCwgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKTsKKwl1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCisjaWZkZWYgVElNRVNUQU1QCisJLyppZiAoYlNldFRpbWVzdGFtcHMpIHsKKwkJU2V0VGltZXN0YW1wKCJ1cmIgJXggc3VibWl0dGVkIiwgdXJiKTsKKwl9Ki8KKyNlbmRpZgorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlLT5jaUJ1bGsuaW50VXJiTG9jaywgZmxhZ3MpOworCisJZGJnKCJlbmQiKTsKK30gLyogZGV2aWNlX2ludF9jb21wbGV0ZSAqLworCitzdGF0aWMgaW50IGRldmljZV93YWl0X3N5bmNfZGF0YShzdHJ1Y3QgZGV2aWNlX3MgKmRldmljZSwKKwkJX191OCAgICAgICAgICBpbmRleCwKKwkJc3RydWN0IGlvY3RsX2RhdGFfcyAqZGF0YSwKKwkJaW50IHVzZXJfc3BhY2UpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJZGJnKCJzdGFydCAlZCIsIGluZGV4KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpY2UtPmNpQnVsay5pbnRMb2NrLCBmbGFncyk7CisJd2hpbGUgKGRldmljZS0+Y2lCdWxrLmNpRGF0YVtpbmRleF0uc3luY1NpZ25hbCA9PSAwKSB7CisJCS8qIG5vdGhpbmcgdG8gY29weSAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2UtPmNpQnVsay5pbnRMb2NrLCBmbGFncyk7CisJCWlmICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZGV2aWNlLT5jaUJ1bGsuCisJCQkJY2lEYXRhW2luZGV4XS5zeW5jV2FpdCwKKwkJCQlkZXZpY2UtPmNpQnVsay5jaURhdGFbaW5kZXhdLnN5bmNTaWduYWwpKSB7CisJCQlkZXZpY2UtPmNpQnVsay5jaURhdGFbaW5kZXhdLmJQZW5kaW5nU2VuZCA9IDA7CisJCQllcnIoImludGVycnVwdCIpOworCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJCS8qIHNpZ25hbDogdGVsbCB0aGUgZnMgbGF5ZXIgdG8gaGFuZGxlIGl0ICovCisJCX0gLyogaWYgKi8KKwkJLyogb3RoZXJ3aXNlIGxvb3AsIGJ1dCBmaXJzdCByZWFjcXVpcmUgdGhlIGxvY2sgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+Y2lCdWxrLmludExvY2ssIGZsYWdzKTsKKwl9IC8qIHdoaWxlICovCisKKwkvKiBjb3B5IHBhY2tldCB0byB1c2VyIHNwYWNlIGJ1ZmZlciAqLworCWlmIChkZXZpY2UtPmNpQnVsay5jaURhdGFbaW5kZXhdLnN5bmNEYXRhU2l6ZSA8IGRhdGEtPnJ4U2l6ZSkKKwkJLyogdHJ1bmNhdGUgcmV0dXJuZWQgbWVzc2FnZSBhZ2FpbnN0IHVzZXIgYnVmZmVyIHNpemUgKi8KKwkJZGF0YS0+cnhTaXplID0gZGV2aWNlLT5jaUJ1bGsuY2lEYXRhW2luZGV4XS5zeW5jRGF0YVNpemU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlLT5jaUJ1bGsuaW50TG9jaywgZmxhZ3MpOworCS8qIHJlbGVhc2UgdGhlIGxvY2sgKi8KKwlyZXQgPSBjb3B5RGF0YVRvKHVzZXJfc3BhY2UsCisJCQlkYXRhLT5yeERhdGEsCisJCQlkZXZpY2UtPmNpQnVsay5jaURhdGFbaW5kZXhdLnN5bmNEYXRhLCBkYXRhLT5yeFNpemUpOworCWRiZ19kdW1wKCJ1c2VyTXNnIiwKKwkJZGV2aWNlLT5jaUJ1bGsuY2lEYXRhW2luZGV4XS5zeW5jRGF0YSwgZGF0YS0+cnhTaXplKTsKKwlkYmcoInVzZXJSZXQgJWQiLCBkYXRhLT5yeFNpemUpOworCWRldmljZS0+Y2lCdWxrLmNpRGF0YVtpbmRleF0uc3luY0RhdGFTaXplID0gMDsKKwlkZXZpY2UtPmNpQnVsay5jaURhdGFbaW5kZXhdLnN5bmNTaWduYWwgPSAwOworCisJZGJnKCJlbmQiKTsKKwlyZXR1cm4gMDsKK30gLyogZGV2aWNlX3dhaXRfc3luY19kYXRhICovCisKK3N0YXRpYyBpbnQgZGV2aWNlX3dhaXRfYXN5bmNfZGF0YShzdHJ1Y3QgZGV2aWNlX3MgKmRldmljZSwKKwkJX191OCAgICAgICBpbmRleCwKKwkJc3RydWN0IHJ3X2RhdGFfcyAqZGF0YSwKKwkJaW50IHVzZXJfc3BhY2UpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqaXRlbTsKKwlzdHJ1Y3QgbWVzc2FnZV9ub2RlX3MgKm1lc3NhZ2U7CisJdW5zaWduZWQgbG9uZyAgICAgZmxhZ3M7CisJaW50IHJldDsKKworCWRiZygic3RhcnQgJWQiLCBpbmRleCk7CisKKwlpZiAoKGRldmljZS0+YXNrVG9SZWxlYXNlKSB8fCAoZGV2aWNlLT5hc2tUb1N1c3BlbmQpKSB7CisJCWVycigiYXNrIHRvIHJlbGVhc2Ugb3IgYXNrIHRvIHN1c3BlbmQiKTsKKwkJcmV0dXJuIC1FSU5UUjsgLyogZGV2aWNlIGNsb3NlIGludGVycnVwdCAqLworCX0gLyogaWYgKi8KKworCWlmIChpbmRleCA+PSBERVZJQ0VfTlVNX0NBTSkgeworCQllcnIoImJhZCBpbmRleCglZCkiLCBpbmRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpY2UtPmNpQnVsay5pbnRMb2NrLCBmbGFncyk7CisJd2hpbGUgKGxpc3RfZW1wdHkoJmRldmljZS0+Y2lCdWxrLmNpRGF0YVtpbmRleF0uYXN5bmNEYXRhTGlzdCkpIHsKKwkJLyogbm90aGluZyB0byBjb3B5ICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZS0+Y2lCdWxrLmludExvY2ssIGZsYWdzKTsKKwkJLyogcmVsZWFzZSB0aGUgbG9jayAqLworCQlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGRldmljZS0+Y2lCdWxrLgorCQkJCWNpRGF0YVtpbmRleF0uYXN5bmNXYWl0LAorCQkJZGV2aWNlLT5hc2tUb1JlbGVhc2UgfHwKKwkJCWRldmljZS0+YXNrVG9TdXNwZW5kIHx8CisJCQkoIWxpc3RfZW1wdHkoJmRldmljZS0+Y2lCdWxrLgorCQkJCWNpRGF0YVtpbmRleF0uYXN5bmNEYXRhTGlzdCkpKSkgeworCQkJZXJyKCJpbnRlcnJ1cHQiKTsKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCQkvKiBzaWduYWw6IHRlbGwgdGhlIGZzIGxheWVyIHRvIGhhbmRsZSBpdCAqLworCQl9IC8qIGlmICovCisJCWlmICgoZGV2aWNlLT5hc2tUb1JlbGVhc2UpIHx8IChkZXZpY2UtPmFza1RvU3VzcGVuZCkpIHsKKwkJCWVycigiYXNrIHRvIHJlbGVhc2Ugb3IgYXNrIHRvIHN1c3BlbmQiKTsKKwkJCXJldHVybiAtRUlOVFI7IC8qIGRldmljZSBjbG9zZSBpbnRlcnJ1cHQgKi8KKwkJfSAvKiBpZiAqLworCQkvKiBvdGhlcndpc2UgbG9vcCwgYnV0IGZpcnN0IHJlYWNxdWlyZSB0aGUgbG9jayAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlLT5jaUJ1bGsuaW50TG9jaywgZmxhZ3MpOworCX0gLyogd2hpbGUgKi8KKworCS8qIG9rLCBkYXRhIGlzIHRoZXJlLCByZXR1cm4gZmlyc3QgaXRlbSAqLworCWl0ZW0gPSBkZXZpY2UtPmNpQnVsay5jaURhdGFbaW5kZXhdLmFzeW5jRGF0YUxpc3QubmV4dDsKKwltZXNzYWdlID0gbGlzdF9lbnRyeShpdGVtLCBzdHJ1Y3QgbWVzc2FnZV9ub2RlX3MsIG5vZGUpOworCWlmIChtZXNzYWdlLT5zaXplIDwgZGF0YS0+c2l6ZSkgeworCQkvKiB0cnVuY2F0ZSByZXR1cm5lZCBtZXNzYWdlIGFnYWluc3QgdXNlciBidWZmZXIgc2l6ZSAqLworCQlkYXRhLT5zaXplID0gbWVzc2FnZS0+c2l6ZTsKKwl9IC8qIGlmICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlLT5jaUJ1bGsuaW50TG9jaywgZmxhZ3MpOworCS8qIHJlbGVhc2UgdGhlIGxvY2sgKi8KKwlyZXQgPSBjb3B5RGF0YVRvKHVzZXJfc3BhY2UsIGRhdGEtPmRhdGEsIG1lc3NhZ2UtPmRhdGEsIGRhdGEtPnNpemUpOworCWRiZ19kdW1wKCJ1c2VyTXNnIiwgbWVzc2FnZS0+ZGF0YSwgZGF0YS0+c2l6ZSk7CisJZGJnKCJ1c2VyUmV0ICVkIiwgZGF0YS0+c2l6ZSk7CisJbGlzdF9kZWwoaXRlbSk7CisJa2ZyZWUobWVzc2FnZSk7CisKKwlkYmcoImVuZCIpOworCXJldHVybiAwOworfSAvKiBkZXZpY2Vfd2FpdF9hc3luY19kYXRhICovCisKK3N0YXRpYyBpbnQgZGV2aWNlX3N0YXJ0X2ludHIoc3RydWN0IGRldmljZV9zICpkZXZpY2UpCit7CisJX191OCAgICAgICAgaSwgajsKKwlzdHJ1Y3QgdXJiICp1cmI7CisKKwlkYmcoInN0YXJ0Iik7CisKKwlmb3IgKGkgPSAwOyBpIDwgREVWSUNFX05VTV9JTlRfSU5fVVJCUzsgaSsrKSB7CisJCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJCWlmICghdXJiKSB7CisJCQllcnIoImFsbG9jIHVyYiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0gLyogaWYgKi8KKwkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPQorCQkJa21hbGxvYyhkZXZpY2UtPmNpQnVsay5pbk1heFBhY2tldFNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIXVyYi0+dHJhbnNmZXJfYnVmZmVyKSB7CisJCQllcnIoImFsbG9jIHRyYW5zZmVyIGJ1ZmZlciIpOworCQkJdXNiX2ZyZWVfdXJiKHVyYik7CisJCQl1cmIgPSBOVUxMOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0gLyogaWYgKi8KKworCQl1cmItPmRldiAgPSBkZXZpY2UtPnVzYmRldjsKKwkJdXJiLT5waXBlID0gdXNiX3JjdmludHBpcGUoZGV2aWNlLT51c2JkZXYsIERFVklDRV9JTlRfSU5fUElQRSk7CisJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IGRldmljZS0+Y2lCdWxrLmluTWF4UGFja2V0U2l6ZTsKKwkJdXJiLT5jb21wbGV0ZSA9IGRldmljZV9pbnRfY29tcGxldGU7CisJCXVyYi0+Y29udGV4dCAgPSBkZXZpY2U7CisJCXVyYi0+aW50ZXJ2YWwgPSAxOworCQlkZXZpY2UtPmNpQnVsay5pbnRVcmJbaV0gPSB1cmI7CisJCWZvciAoaiA9IDA7IGogPCBERVZJQ0VfTlVNX0NBTTsgaisrKSB7CisJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXZpY2UtPmNpQnVsay5jaURhdGFbal0uc3luY1dhaXQpOworCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2aWNlLT5jaUJ1bGsuCisJCQkJY2lEYXRhW2pdLmFzeW5jV2FpdCk7CisJCX0gLyogZm9yICovCisJCXVzYl9zdWJtaXRfdXJiKGRldmljZS0+Y2lCdWxrLmludFVyYltpXSwgR0ZQX0tFUk5FTCk7CisJfQorCisJZGJnKCJlbmQiKTsKKwlyZXR1cm4gMDsKK30gLyogZGV2aWNlX3N0YXJ0X2ludHIgKi8KKworc3RhdGljIHZvaWQgZGV2aWNlX3N0b3BfaW50cihzdHJ1Y3QgZGV2aWNlX3MgKmRldmljZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICppdGVtOworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKwlzdHJ1Y3QgbWVzc2FnZV9ub2RlX3MgKm1lc3NhZ2U7CisJaW50ICAgICAgICAgICAgICAgaSwgajsKKworCWRiZygic3RhcnQiKTsKKworCWZvciAoaSA9IDA7IGkgPCBERVZJQ0VfTlVNX0lOVF9JTl9VUkJTOyBpKyspIHsKKwkJaWYgKCFkZXZpY2UtPmNpQnVsay5pbnRVcmJbaV0pCisJCQlicmVhazsKKwkJdXNiX3VubGlua191cmIoZGV2aWNlLT5jaUJ1bGsuaW50VXJiW2ldKTsKKwkJZGV2aWNlLT5jaUJ1bGsuaW50VXJiW2ldID0gTlVMTDsKKwkJZm9yIChqID0gMDsgaiA8IERFVklDRV9OVU1fQ0FNOyBqKyspIHsKKwkJCWZvciAoaXRlbSA9IGRldmljZS0+Y2lCdWxrLmNpRGF0YVtqXS5hc3luY0RhdGFMaXN0Lm5leHQ7CisJCQkJaXRlbSAhPSAmZGV2aWNlLT5jaUJ1bGsuY2lEYXRhW2pdLmFzeW5jRGF0YUxpc3Q7CisJCQkJKSB7CisJCQkJbWVzc2FnZSA9IGxpc3RfZW50cnkoaXRlbSwKKwkJCQkJCXN0cnVjdCBtZXNzYWdlX25vZGVfcywgbm9kZSk7CisJCQkJdG1wID0gaXRlbS0+bmV4dDsKKwkJCQlsaXN0X2RlbChpdGVtKTsKKwkJCQlrZnJlZShpdGVtKTsKKwkJCQlpdGVtID0gdG1wOworCQkJfSAvKiBmb3IgKi8KKwkJfSAvKiBmb3IgKi8KKwkJZGJnKCJ1bmxpbmsgdXJiIik7CisJfQorCisJZGJnKCJlbmQiKTsKK30gLyogZGV2aWNlX3N0b3BfaW50ciAqLworCitzdGF0aWMgdm9pZCBkZXZpY2VfaXNvX2luX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB0c19jaGFubmVsX3MgKmNoYW5uZWwgPSB1cmItPmNvbnRleHQ7CisJX191OCAgICAgICAgICBpOworCV9fdTggICAgICAgICAgKmRhdGE7CisKKwkvKmRiZygic3RhcnQiKTsqLworCisJaWYgKHVyYi0+c3RhdHVzKSB7CisJCWRiZygidXJiIHN0YXR1cyAlZCwgbm90IHN1Ym1pdHRlZCBhZ2FpbiIsIHVyYi0+c3RhdHVzKTsKKwkJa2ZyZWUodXJiLT50cmFuc2Zlcl9idWZmZXIpOworCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJcmV0dXJuOworCX0gLyogaWYgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFubmVsLT5pbkxvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgdXJiLT5udW1iZXJfb2ZfcGFja2V0czsgaSsrKSB7CisJCWRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlciArIHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0OworCQlpZiAoIXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzICYmCisJCQkJKHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aCA+IDApKSB7CisJCQlpZiAodmJfZ2V0X3dyaXRlX3NpemUoJmNoYW5uZWwtPmluVmIpCisJCQkJPj0gdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoKSB7CisJCQkJdmJfd3JpdGUoJmNoYW5uZWwtPmluVmIsIGRhdGEsCisJCQkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aCk7CisJCQl9IC8qIGlmICovCisJCQllbHNlIHsKKwkJCQllcnIoInZpZGVvIGJ1ZmZlciBpcyBmdWxsLCBwYWNrZXQgbG9zcyAlZCIsCisJCQkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aCk7CisJCQl9IC8qIGVsc2UgKi8KKwkJfSAvKiBpZiAqLworCQllbHNlIHsKKwkJCWVycigiZnJhbWUgcmVqZWN0ZWQsIHN0YXR1cyAleCwgYWN0dWFsX2xlbmd0aCAlZCBieXRlcyIsCisJCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXMsCisJCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoKTsKKwkJfQorCX0gLyogZm9yICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbm5lbC0+aW5Mb2NrLCBmbGFncyk7CisKKwlpZiAoIWNoYW5uZWwtPmluVmIuaXNFbXB0eSkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaGFubmVsLT5pbldhaXQpOworCisJbWVtc2V0KHVyYi0+dHJhbnNmZXJfYnVmZmVyLAorCQkwLCBERVZJQ0VfSVNPQ19MRU5HVEgoY2hhbm5lbC0+bWF4UGFja2V0U2l6ZSkpOworCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9CisJCURFVklDRV9JU09DX0xFTkdUSChjaGFubmVsLT5tYXhQYWNrZXRTaXplKTsKKwl1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gREVWSUNFX05VTV9GUkFNRVNfUEVSX1VSQjsKKwl1cmItPmNvbXBsZXRlID0gZGV2aWNlX2lzb19pbl9jb21wbGV0ZTsKKwl1cmItPmNvbnRleHQgPSBjaGFubmVsOworCXVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7CisJdXJiLT5pbnRlcnZhbCA9IDE7CisJZm9yIChpID0gMDsgaSA8IERFVklDRV9OVU1fRlJBTUVTX1BFUl9VUkI7IGkrKykgeworCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLm9mZnNldCA9IGkgKiBjaGFubmVsLT5tYXhQYWNrZXRTaXplOworCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmxlbmd0aCA9IGNoYW5uZWwtPm1heFBhY2tldFNpemU7CisJfSAvKiBmb3IgKi8KKwl1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCisJLypkYmcoImVuZCIpOyovCit9IC8qIGRldmljZV9pc29faW5fY29tcGxldGUgKi8KKworc3RhdGljIHZvaWQgZGV2aWNlX3RzYnVsa19pbl9jb21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdHNfY2hhbm5lbF9zICpjaGFubmVsID0gdXJiLT5jb250ZXh0OworCV9fdTggICAgICAgICAgKmRhdGE7CisjaWZkZWYgREVCVUdfQ09OVElOVUlUWQorCXVuc2lnbmVkIGludCBpOworI2VuZGlmCisKKwkvKmRiZygic3RhcnQiKTsqLworCisJaWYgKHVyYi0+c3RhdHVzKSB7CisJCWVycigidXJiIHN0YXR1cyAlZCgleCksIG5vdCBzdWJtaXR0ZWQgYWdhaW4iLAorCQkJdXJiLT5zdGF0dXMsIHVyYi0+c3RhdHVzKTsKKwkJa2ZyZWUodXJiLT50cmFuc2Zlcl9idWZmZXIpOworCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJcmV0dXJuOworCX0gLyogaWYgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFubmVsLT5pbkxvY2ssIGZsYWdzKTsKKwlkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisKKyNpZmRlZiBERUJVR19DT05USU5VSVRZCisJaSA9IDA7CisJLyogY2hlY2sgc3luY2hybyBieXRlKi8KKwl3aGlsZSAoaSA8IHVyYi0+YWN0dWFsX2xlbmd0aCkgeworCQlpZiAoISgoZGF0YVtpXSA9PSBERVZJQ0VfTVBFRzJfU1lOQ19CWVRFKSAmJgorCQkJKGRhdGFbaStERVZJQ0VfTVBFRzJfUEFDS0VUX1NJWkVdCisJCQkJPT0gREVWSUNFX01QRUcyX1NZTkNfQllURSkpKSB7CisJCQlpKys7CisJCX0gZWxzZSB7CisJCQkvKiBTeW5jaHJvIGZpbmQqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBTeW5jaHJvIE9rLCBjaGVjayBkaXNjb250aW51aXR5Ki8KKwl3aGlsZSAoaSA8IHVyYi0+YWN0dWFsX2xlbmd0aCkgeworCQlpZiAoZGJnX2NjKCZkYXRhW2ldKSA8IDApIHsKKwkJCWRiZygiKGFjdHVhbF9sZW5ndGg9ICVkIGk9JWQgcGt0PSVkKSIsCisJCQkJdXJiLT5hY3R1YWxfbGVuZ3RoLAorCQkJCWksCisJCQkJaS9ERVZJQ0VfTVBFRzJfUEFDS0VUX1NJWkUpOworCQkJZGJnKCIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQkJZGF0YVtpLTRdLCBkYXRhW2ktM10sIGRhdGFbaS0yXSwgZGF0YVtpLTFdLAorCQkJCWRhdGFbaV0sIGRhdGFbaSsxXSwgZGF0YVtpKzJdLCBkYXRhW2krM10pOworCQl9CisJCWkgKz0gREVWSUNFX01QRUcyX1BBQ0tFVF9TSVpFOworCX0KKyNlbmRpZgorCisJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCkgeworCQljaGFubmVsLT5uYkJ5dGVSZWFkICs9IHVyYi0+YWN0dWFsX2xlbmd0aDsKKwkJaWYgKHZiX2dldF93cml0ZV9zaXplKCZjaGFubmVsLT5pblZiKSA+PSB1cmItPmFjdHVhbF9sZW5ndGgpCisJCQl2Yl93cml0ZSgmY2hhbm5lbC0+aW5WYiwgZGF0YSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJZWxzZQorCQkJZXJyKCJ2aWRlbyBidWZmZXIgaXMgZnVsbCwgcGFja2V0IGxvc3MgJWQiLAorCQkJCXVyYi0+YWN0dWFsX2xlbmd0aCk7CisJfSBlbHNlIHsKKwkJLyp3YXJuKCJyZWNlaXZlIHNpemUgb2YgMFxuIik7Ki8KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFubmVsLT5pbkxvY2ssIGZsYWdzKTsKKwkvKiAgZGJnKCJ1cmItPmFjdHVhbF9sZW5ndGg9JWQiLHVyYi0+YWN0dWFsX2xlbmd0aCk7Ki8KKwkvKiAgaW5mbygidXJiLT5hY3R1YWxfbGVuZ3RoPSVkXG4iLHVyYi0+YWN0dWFsX2xlbmd0aCk7Ki8KKworCWlmICghY2hhbm5lbC0+aW5WYi5pc0VtcHR5KQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoYW5uZWwtPmluV2FpdCk7CisJa2ZyZWUodXJiLT50cmFuc2Zlcl9idWZmZXIpOworCXVzYl9mcmVlX3VyYih1cmIpOworCS8qZGJnKCJlbmQiKTsqLworfSAvKiBkZXZpY2VfdHNidWxrX2luX2NvbXBsZXRlICovCisKK3N0YXRpYyBpbnQgZGV2aWNlX2ZpbGxfdHMoc3RydWN0IGRldmljZV9zICpkZXZpY2UsCisJCV9fdTggICAgICAgaW5kZXgsCisJCXN0cnVjdCByd19kYXRhX3MgKmRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlfX3UzMiAgICAgICAgIGNvcGllZFNpemU7CisJc3RydWN0IHRzX2NoYW5uZWxfcyAqY2hhbm5lbCA9ICZkZXZpY2UtPmNoYW5uZWxbaW5kZXhdOworCisJLypkYmcoInN0YXJ0Iik7Ki8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFubmVsLT5pbkxvY2ssIGZsYWdzKTsKKwlkbyB7CisJCXdoaWxlIChjaGFubmVsLT5pblZiLmlzRW1wdHkpIHsKKwkJCS8qIG5vdGhpbmcgdG8gY29weSAqLworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbm5lbC0+aW5Mb2NrLCBmbGFncyk7CisJCQkvKiByZWxlYXNlIHRoZSBsb2NrICovCisJCQlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGNoYW5uZWwtPmluV2FpdCwKKwkJCQkJICAgIGRldmljZS0+YXNrVG9SZWxlYXNlIHx8CisJCQkJCSAgICBkZXZpY2UtPmFza1RvU3VzcGVuZCB8fAorCQkJCQkgICAgKCFjaGFubmVsLT5pblZiLmlzRW1wdHkpKSkgeworCQkJCWVycigiaW50ZXJydXB0Iik7CisJCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJCQkvKiBzaWduYWw6IHRlbGwgdGhlIGZzIGxheWVyIHRvIGhhbmRsZSBpdCAqLworCQkJfSAvKiBpZiAqLworCQkJaWYgKChkZXZpY2UtPmFza1RvUmVsZWFzZSkgfHwgKGRldmljZS0+YXNrVG9TdXNwZW5kKSkgeworCQkJCWVycigiYXNrIHRvIHJlbGVhc2Ugb3IgYXNrIHRvIHN1c3BlbmQiKTsKKwkJCQlyZXR1cm4gLUVJTlRSOyAvKiBkZXZpY2UgY2xvc2UgaW50ZXJydXB0ICovCisJCQl9IC8qIGlmICovCisJCQkvKiBvdGhlcndpc2UgbG9vcCwgYnV0IGZpcnN0IHJlYWNxdWlyZSB0aGUgbG9jayAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW5uZWwtPmluTG9jaywgZmxhZ3MpOworCQl9IC8qIHdoaWxlICovCisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbm5lbC0+aW5Mb2NrLCBmbGFncyk7CisKKwkJY29waWVkU2l6ZSA9IHZiX3JlYWRfbmV4dCgmY2hhbm5lbC0+aW5WYiwKKwkJCSZkYXRhLT5kYXRhW2RhdGEtPmNvcGllZFNpemVdKTsKKwkJaWYgKGNvcGllZFNpemUpIHsKKwkJCS8qZGJnKCJjb3BpZWQgJWQgYnl0ZXMgaW4gYnVmZmVyIDB4JXAsIG9mZnNldCAlZCIsCisJCQkgIGNvcGllZFNpemUsIGRhdGEtPmRhdGEsIGRhdGEtPmNvcGllZFNpemUpOyovCisJCQlkYXRhLT5jb3BpZWRTaXplICs9IGNvcGllZFNpemU7CisJCX0gLyogaWYgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW5uZWwtPmluTG9jaywgZmxhZ3MpOworCX0gd2hpbGUgKChkYXRhLT5jb3BpZWRTaXplK0RFVklDRV9NUEVHMl9QQUNLRVRfU0laRSkgPD0gZGF0YS0+c2l6ZSk7CisJLyogYnVmZmVyIG5vdCBmdWxsICovCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFubmVsLT5pbkxvY2ssIGZsYWdzKTsKKworI2lmZGVmIERFQlVHX0JJVFJBVEUKKwlwcmludF9iaXRyYXRlKGNoYW5uZWwsIGluZGV4KTsKKyNlbmRpZgorCisJLypkYmcoImVuZCwgYnVmZmVyIDB4JXAiLCBkYXRhLT5kYXRhKTsqLworCXJldHVybiAwOworfSAvKiBkZXZpY2VfZmlsbF90cyAqLworCitzdGF0aWMgaW50IGRldmljZV9zdGFydF9pc29faW4oc3RydWN0IGRldmljZV9zICpkZXZpY2UsIF9fdTggaW5kZXgpCit7CisJaW50ICAgICAgICAgaSwgajsKKwlpbnQgICAgICAgICByZXQgPSAwOworCXN0cnVjdCB1cmIgKnVyYjsKKworCS8qZGJnKCJzdGFydCIpOyovCisKKyNpZmRlZiBERUJVR19CSVRSQVRFCisJZGV2aWNlLT5jaGFubmVsW2luZGV4XS5iaXRyYXRlVGltZSA9IGt0aW1lX3NldCgwLCAwKTsKKyNlbmRpZgorCWZvciAoaSA9IDA7IGkgPCBERVZJQ0VfTlVNX0lTT0NfSU5fVVJCUzsgaSsrKSB7CisJCXVyYiA9IHVzYl9hbGxvY191cmIoREVWSUNFX05VTV9GUkFNRVNfUEVSX1VSQiwgR0ZQX0tFUk5FTCk7CisJCWRldmljZS0+Y2hhbm5lbFtpbmRleF0uaXNvY0luVXJiW2ldID0gdXJiOworCQlpZiAodXJiKSB7CisJCQkvKnVyYi0+dHJhbnNmZXJfYnVmZmVyID0KKwkJCQlrbWFsbG9jKERFVklDRV9JU09DX0xFTkdUSCwgR0ZQX0tFUk5FTCk7Ki8KKwkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0KKwkJCQlrbWFsbG9jKERFVklDRV9JU09DX0xFTkdUSCgKKwkJCQkJZGV2aWNlLT5jaGFubmVsW2luZGV4XS5tYXhQYWNrZXRTaXplKSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisJCQlpZiAoIXVyYi0+dHJhbnNmZXJfYnVmZmVyKSB7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQllcnIoInRyYW5zZmVyX2J1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZCAlZCIsIGkpOworCQkJCWJyZWFrOworCQkJfSAvKiBpZiAqLworCQl9IC8qIGlmICovIGVsc2UgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWVycigidXNiX2FsbG9jX3VyYiBmYWlsZWQgJWQiLCBpKTsKKwkJCWJyZWFrOworCQl9IC8qIGlmICovCisJfSAvKiBmb3IgKi8KKworCWlmIChyZXQpIHsKKwkJLyogQWxsb2NhdGlvbiBlcnJvciwgbXVzdCBmcmVlIGFscmVhZHkgYWxsb2NhdGVkIGRhdGEgKi8KKwkJZm9yIChpID0gMDsgaSA8IERFVklDRV9OVU1fSVNPQ19JTl9VUkJTOyBpKyspIHsKKwkJCXVyYiA9IGRldmljZS0+Y2hhbm5lbFtpbmRleF0uaXNvY0luVXJiW2ldOworCQkJaWYgKHVyYikgeworCQkJCWtmcmVlKHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJCQlpZiAodXJiLT50cmFuc2Zlcl9idWZmZXIpCisJCQkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gTlVMTDsKKwkJCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJCQlkZXZpY2UtPmNoYW5uZWxbaW5kZXhdLmlzb2NJblVyYltpXSA9IE5VTEw7CisJCQl9IC8qIGlmICovCisJCX0gLyogZm9yICovCisJCXJldHVybiByZXQ7CisJfSAvKiBpZiAqLworCisJZm9yIChpID0gMDsgaSA8IERFVklDRV9OVU1fSVNPQ19JTl9VUkJTOyBpKyspIHsKKwkJdXJiID0gZGV2aWNlLT5jaGFubmVsW2luZGV4XS5pc29jSW5VcmJbaV07CisJCW1lbXNldCh1cmItPnRyYW5zZmVyX2J1ZmZlciwKKwkJCTAsCisJCQlERVZJQ0VfSVNPQ19MRU5HVEgoCisJCQkJZGV2aWNlLT5jaGFubmVsW2luZGV4XS5tYXhQYWNrZXRTaXplKSk7CisJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9CisJCQlERVZJQ0VfSVNPQ19MRU5HVEgoCisJCQkJZGV2aWNlLT5jaGFubmVsW2luZGV4XS5tYXhQYWNrZXRTaXplKTsKKwkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IERFVklDRV9OVU1fRlJBTUVTX1BFUl9VUkI7CisJCXVyYi0+Y29tcGxldGUgPSBkZXZpY2VfaXNvX2luX2NvbXBsZXRlOworCQl1cmItPmNvbnRleHQgPSAmZGV2aWNlLT5jaGFubmVsW2luZGV4XTsKKwkJdXJiLT5kZXYgPSBkZXZpY2UtPnVzYmRldjsKKwkJdXJiLT5waXBlID0gdXNiX3Jjdmlzb2NwaXBlKAorCQkJZGV2aWNlLT51c2JkZXYsIERFVklDRV9UU19JTl9QSVBFICsgaW5kZXgpOworCQl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOworCQl1cmItPmludGVydmFsID0gMTsKKwkJZm9yIChqID0gMDsgaiA8IERFVklDRV9OVU1fRlJBTUVTX1BFUl9VUkI7IGorKykgeworCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5vZmZzZXQgPQorCQkJCWogKiBkZXZpY2UtPmNoYW5uZWxbaW5kZXhdLm1heFBhY2tldFNpemU7CisJCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLmxlbmd0aCA9CisJCQkJZGV2aWNlLT5jaGFubmVsW2luZGV4XS5tYXhQYWNrZXRTaXplOworCQl9IC8qIGZvciAqLworCX0gLyogZm9yICovCisJZm9yIChpID0gMDsgaSA8IERFVklDRV9OVU1fSVNPQ19JTl9VUkJTOyBpKyspCisJCXVzYl9zdWJtaXRfdXJiKGRldmljZS0+Y2hhbm5lbFtpbmRleF0uaXNvY0luVXJiW2ldLCBHRlBfS0VSTkVMKTsKKworCS8qZGJnKCJlbmQiKTsqLworCXJldHVybiAwOworfSAvKiBkZXZpY2Vfc3RhcnRfaXNvX2luICovCisKK3N0YXRpYyB2b2lkIGRldmljZV9zdG9wX2lzb19pbihzdHJ1Y3QgZGV2aWNlX3MgKmRldmljZSwgX191OCBpbmRleCkKK3sKKwlpbnQgaTsKKworCS8qZGJnKCJzdGFydCIpOyovCisKKwlmb3IgKGkgPSAwOyBpIDwgREVWSUNFX05VTV9JU09DX0lOX1VSQlM7IGkrKykgeworCQlpZiAoZGV2aWNlLT5jaGFubmVsW2luZGV4XS5pc29jSW5VcmJbaV0pIHsKKwkJCXVzYl91bmxpbmtfdXJiKGRldmljZS0+Y2hhbm5lbFtpbmRleF0uaXNvY0luVXJiW2ldKTsKKwkJCWRldmljZS0+Y2hhbm5lbFtpbmRleF0uaXNvY0luVXJiW2ldID0gTlVMTDsKKwkJCWRiZygidW5saW5rIHVyYiAlaSIsIGkpOworCQl9IC8qIGlmICovCisJfSAvKiBmb3IgKi8KKworCS8qZGJnKCJlbmQiKTsqLworfSAvKiBkZXZpY2Vfc3RvcF9pc29faW4gKi8KKworc3RhdGljIGludCBkZXZpY2Vfc3RhcnRfdHNidWxrX2luKHN0cnVjdCBkZXZpY2VfcyAqZGV2aWNlLCBfX3U4IGluZGV4KQoreworCXN0cnVjdCB1cmIgKnVyYjsKKworCWRiZygic3RhcnQiKTsKKworCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKHVyYikgeworCQl1cmItPnRyYW5zZmVyX2J1ZmZlciAgPSBrbWFsbG9jKDMwNzIsIEdGUF9LRVJORUwpOworCQlpZiAoIXVyYi0+dHJhbnNmZXJfYnVmZmVyKSB7CisJCQllcnIoInRyYW5zZmVyX2J1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQkJdXNiX2ZyZWVfdXJiKHVyYik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfSAvKiBpZiAqLworCX0gLyogaWYgKi8gZWxzZSB7CisJCWVycigidXNiX2FsbG9jX3VyYiBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfSAvKiBpZiAqLworCWRldmljZS0+Y2hhbm5lbFtpbmRleF0uYnVsa0luVXJiID0gdXJiOworCW1lbXNldCh1cmItPnRyYW5zZmVyX2J1ZmZlciwgMCwgMzA3Mik7CisJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gMzA3MjsKKworCXVyYi0+Y29tcGxldGUgPSBkZXZpY2VfdHNidWxrX2luX2NvbXBsZXRlOworCXVyYi0+Y29udGV4dCA9ICZkZXZpY2UtPmNoYW5uZWxbaW5kZXhdOworCXVyYi0+ZGV2ID0gZGV2aWNlLT51c2JkZXY7CisJdXJiLT5waXBlID0gdXNiX3JjdmJ1bGtwaXBlKGRldmljZS0+dXNiZGV2LCBERVZJQ0VfVFNfSU5fUElQRSArIGluZGV4KTsKKwl1c2Jfc3VibWl0X3VyYihkZXZpY2UtPmNoYW5uZWxbaW5kZXhdLmJ1bGtJblVyYiwgR0ZQX0tFUk5FTCk7CisKKwlkYmcoImVuZCIpOworCXJldHVybiAwOworfSAvKiBkZXZpY2Vfc3RhcnRfdHNidWxrX2luICovCisKK3N0YXRpYyB2b2lkIGRldmljZV9zdG9wX3RzYnVsa19pbihzdHJ1Y3QgZGV2aWNlX3MgKmRldmljZSwgX191OCBpbmRleCkKK3sKKwlkYmcoInN0YXJ0Iik7CisKKwlpZiAoZGV2aWNlLT5jaGFubmVsW2luZGV4XS5idWxrSW5VcmIpIHsKKwkJdXNiX3VubGlua191cmIoZGV2aWNlLT5jaGFubmVsW2luZGV4XS5idWxrSW5VcmIpOworCQlkZXZpY2UtPmNoYW5uZWxbaW5kZXhdLmJ1bGtJblVyYiA9IE5VTEw7CisJCWRiZygidW5saW5rIHVyYiIpOworCX0gLyogaWYgKi8KKworCWRiZygiZW5kIik7Cit9IC8qIGRldmljZV9zdG9wX3RzYnVsa19pbiAqLworCitzdGF0aWMgdm9pZCBkZXZpY2VfaXNvX291dF9jb21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHRzX2NoYW5uZWxfcyAqY2hhbm5lbCA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXJiICAgICp0bXBVcmI7CisJaW50ICAgICAgICAgICBpOworCWludCByZXQgPSAwOworCisJLypkYmcoInN0YXJ0Iik7Ki8KKworLypkYmdfZHVtcCgidHhCdWYiLCB1cmItPnRyYW5zZmVyX2J1ZmZlciwgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKTsqLworCisJaWYgKHVyYi0+c3RhdHVzIHx8IGNoYW5uZWwtPm91dFN0b3ApIHsKKwkJLyogZXJyb3IsIGZyZWUgYWxsIGNvbWluZyB1cmJzICovCisJCWVycigiZnJlZSB1cmIiKTsKKwkJY2hhbm5lbC0+b3V0U3RvcCA9IDE7CisJCWF0b21pY19kZWMoJmNoYW5uZWwtPm51bU91dFVyYnMpOworCQlrZnJlZSh1cmItPnRyYW5zZmVyX2J1ZmZlcik7CisJCXVzYl9mcmVlX3VyYih1cmIpOworCQlyZXR1cm47CisJfSAvKiBpZiAqLworCisJZm9yIChpID0gMDsgaSA8IERFVklDRV9OVU1fSVNPQ19PVVRfVVJCUzsgaSsrKSB7CisJCWlmICh1cmIgPT0gY2hhbm5lbC0+aXNvY091dFVyYltpXSkKKwkJCWJyZWFrOworCX0gLyogZm9yICovCisJaWYgKGkgPT0gREVWSUNFX05VTV9JU09DX09VVF9VUkJTKSB7CisJCS8qIHVyYiBtdXN0IGJlIGRlbGV0ZWQgKi8KKwkJa2ZyZWUodXJiLT50cmFuc2Zlcl9idWZmZXIpOworCQl1c2JfZnJlZV91cmIodXJiKTsKKwl9IC8qIGlmICovCisKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmY2hhbm5lbC0+bnVtT3V0VXJicykpIHsKKwkJLyogZ2V0IG5leHQgZnJlZSB1cmIgKi8KKwkJdG1wVXJiID0gY2hhbm5lbC0+aXNvY091dFVyYltjaGFubmVsLT5uZXh0RnJlZU91dFVyYkluZGV4KytdOworCQlpZiAoY2hhbm5lbC0+bmV4dEZyZWVPdXRVcmJJbmRleCA9PSBERVZJQ0VfTlVNX0lTT0NfT1VUX1VSQlMpCisJCQljaGFubmVsLT5uZXh0RnJlZU91dFVyYkluZGV4ID0gMDsKKworCQkvKiByZWluaXRpYWxpemUgdXJiIHdpdGggbnVsbCBwYWNrZXRzICovCisJCW1lbXNldCh0bXBVcmItPnRyYW5zZmVyX2J1ZmZlciwKKwkJCTB4Q0QsIERFVklDRV9JU09DX0xFTkdUSChjaGFubmVsLT5tYXhQYWNrZXRTaXplKSk7CisJCWZvciAoaSA9IDA7CisJCQlpIDwgREVWSUNFX0lTT0NfTEVOR1RIKGNoYW5uZWwtPm1heFBhY2tldFNpemUpOworCQkJaSArPSBERVZJQ0VfTVBFRzJfUEFDS0VUX1NJWkUpIHsKKwkJCW1lbWNweSh0bXBVcmItPnRyYW5zZmVyX2J1ZmZlcitpLAorCQkJCW51bGxIZWFkZXIsIHNpemVvZihudWxsSGVhZGVyKSk7CisJCX0gLyogZm9yICovCisJCXRtcFVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9CisJCQlERVZJQ0VfSVNPQ19MRU5HVEgoY2hhbm5lbC0+bWF4UGFja2V0U2l6ZSk7CisJCXRtcFVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSBERVZJQ0VfTlVNX0ZSQU1FU19QRVJfVVJCOworCQl0bXBVcmItPmNvbXBsZXRlID0gZGV2aWNlX2lzb19vdXRfY29tcGxldGU7CisJCXRtcFVyYi0+Y29udGV4dCA9IGNoYW5uZWw7CisJCXRtcFVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7CisJCXRtcFVyYi0+aW50ZXJ2YWwgPSAxOworCQlmb3IgKGkgPSAwOyBpIDwgREVWSUNFX05VTV9GUkFNRVNfUEVSX1VSQjsgaSsrKSB7CisJCQl0bXBVcmItPmlzb19mcmFtZV9kZXNjW2ldLm9mZnNldCA9CisJCQkJaSAqIGNoYW5uZWwtPm1heFBhY2tldFNpemU7CisJCQl0bXBVcmItPmlzb19mcmFtZV9kZXNjW2ldLmxlbmd0aCA9CisJCQkJY2hhbm5lbC0+bWF4UGFja2V0U2l6ZTsKKwkJfSAvKiBmb3IgKi8KKworCQkvKiBzdWJtaXQgdXJiICovCisJCXJldCA9IHVzYl9zdWJtaXRfdXJiKHRtcFVyYiwgR0ZQX0FUT01JQyk7CisJCWlmIChyZXQpCisJCQllcnIoInVzYl9zdWJtaXRfdXJiIGZhaWxlZCAlZCIsIHJldCk7CisKKwkJYXRvbWljX2luYygmY2hhbm5lbC0+bnVtT3V0VXJicyk7CisJfSAvKiBpZiAqLworCisJLypkYmcoImVuZCIpOyovCit9IC8qIGRldmljZV9pc29fb3V0X2NvbXBsZXRlICovCisKK3N0YXRpYyBpbnQgZGV2aWNlX3RzaXNvX3NlbmQoc3RydWN0IGRldmljZV9zICpkZXZpY2UsCisJX191OCBpbmRleCwgX191OCAqZGF0YSwgaW50IHNpemUpCit7CisJaW50ICAgICAgICAgIGksIGo7CisJc3RydWN0IHVyYiAgICoqdXJiOworCV9fdTMyICAgICAgICBudW1VcmJzOworCWludCAgICAgICAgICByZXQgPSAwOworCisJLyogIGRiZygic3RhcnQiKTsqLworCisJbnVtVXJicyA9CisJCXNpemUgLyBERVZJQ0VfSVNPQ19MRU5HVEgoZGV2aWNlLT5jaGFubmVsW2luZGV4XS5tYXhQYWNrZXRTaXplKTsKKwl1cmIgPSBrbWFsbG9jKG51bVVyYnMgKiBzaXplb2Yoc3RydWN0IHVyYiAqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1cmIpIHsKKwkJZXJyKCJ1cmIgYXJyYXkgYWxsb2NhdGlvbiBmYWlsZWQgJWQiLCBudW1VcmJzKTsKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl9IC8qIGlmICovCisJbWVtc2V0KHVyYiwgMCwgbnVtVXJicyAqIHNpemVvZihzdHJ1Y3QgdXJiICopKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1VcmJzOyBpKyspIHsKKwkJdXJiW2ldID0gdXNiX2FsbG9jX3VyYihERVZJQ0VfTlVNX0ZSQU1FU19QRVJfVVJCLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHVyYltpXSkgeworCQkJdXJiW2ldLT50cmFuc2Zlcl9idWZmZXIgPQorCQkJCWttYWxsb2MoREVWSUNFX0lTT0NfTEVOR1RIKAorCQkJCQlkZXZpY2UtPmNoYW5uZWxbaW5kZXhdLm1heFBhY2tldFNpemUpLAorCQkJCQkJR0ZQX0tFUk5FTCk7CisJCQlpZiAoIXVyYltpXS0+dHJhbnNmZXJfYnVmZmVyKSB7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQllcnIoInRyYW5zZmVyX2J1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZCAlZCIsIGkpOworCQkJCWJyZWFrOworCQkJfSAvKiBpZiAqLworCQl9IC8qIGlmICovCisJCWVsc2UgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWVycigidXNiX2FsbG9jX3VyYiBmYWlsZWQgJWQiLCBpKTsKKwkJCWJyZWFrOworCQl9IC8qIGlmICovCisJfSAvKiBmb3IgKi8KKwlpZiAocmV0KSB7CisJCS8qIEFsbG9jYXRpb24gZXJyb3IsIG11c3QgZnJlZSBhbHJlYWR5IGFsbG9jYXRlZCBkYXRhICovCisJCWZvciAoaSA9IDA7IGkgPCBudW1VcmJzOyBpKyspIHsKKwkJCWlmICh1cmJbaV0pIHsKKwkJCQlrZnJlZSh1cmJbaV0tPnRyYW5zZmVyX2J1ZmZlcik7CisJCQkJdXJiW2ldLT50cmFuc2Zlcl9idWZmZXIgPSBOVUxMOworCQkJCXVzYl9mcmVlX3VyYih1cmJbaV0pOworCQkJCXVyYltpXSA9IE5VTEw7CisJCQl9IC8qIGlmICovCisJCX0gLyogZm9yICovCisJCWtmcmVlKHVyYik7CisJCXJldHVybiByZXQ7CisJfSAvKiBpZiAqLworCisJZm9yIChpID0gMDsgaSA8IG51bVVyYnM7IGkrKykgeworCQlyZXQgPSBjb3B5X2Zyb21fdXNlcih1cmJbaV0tPnRyYW5zZmVyX2J1ZmZlciwKKwkJCSZkYXRhW2kqREVWSUNFX0lTT0NfTEVOR1RIKAorCQkJCQlkZXZpY2UtPmNoYW5uZWxbaW5kZXhdLm1heFBhY2tldFNpemUpXSwKKwkJCQlERVZJQ0VfSVNPQ19MRU5HVEgoCisJCQkJCWRldmljZS0+Y2hhbm5lbFtpbmRleF0ubWF4UGFja2V0U2l6ZSkpOworCQl1cmJbaV0tPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBERVZJQ0VfSVNPQ19MRU5HVEgoCisJCQlkZXZpY2UtPmNoYW5uZWxbaW5kZXhdLm1heFBhY2tldFNpemUpOworCQl1cmJbaV0tPm51bWJlcl9vZl9wYWNrZXRzID0gREVWSUNFX05VTV9GUkFNRVNfUEVSX1VSQjsKKwkJdXJiW2ldLT5jb21wbGV0ZSA9IGRldmljZV9pc29fb3V0X2NvbXBsZXRlOworCQl1cmJbaV0tPmNvbnRleHQgPSAmZGV2aWNlLT5jaGFubmVsW2luZGV4XTsKKwkJdXJiW2ldLT5kZXYgPSBkZXZpY2UtPnVzYmRldjsKKwkJdXJiW2ldLT5waXBlID0gdXNiX3NuZGlzb2NwaXBlKGRldmljZS0+dXNiZGV2LAorCQkJREVWSUNFX1RTX09VVF9QSVBFICsgaW5kZXgpOworCQl1cmJbaV0tPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOworCQl1cmJbaV0tPmludGVydmFsID0gMTsKKwkJZm9yIChqID0gMDsgaiA8IERFVklDRV9OVU1fRlJBTUVTX1BFUl9VUkI7IGorKykgeworCQkJdXJiW2ldLT5pc29fZnJhbWVfZGVzY1tqXS5vZmZzZXQgPQorCQkJCWogKiBkZXZpY2UtPmNoYW5uZWxbaW5kZXhdLm1heFBhY2tldFNpemU7CisJCQl1cmJbaV0tPmlzb19mcmFtZV9kZXNjW2pdLmxlbmd0aCA9CisJCQkJZGV2aWNlLT5jaGFubmVsW2luZGV4XS5tYXhQYWNrZXRTaXplOworCQl9IC8qIGZvciAqLworCX0gLyogZm9yICovCisKKwlhdG9taWNfYWRkKG51bVVyYnMsICZkZXZpY2UtPmNoYW5uZWxbaW5kZXhdLm51bU91dFVyYnMpOworCWZvciAoaSA9IDA7IGkgPCBudW1VcmJzOyBpKyspIHsKKwkJcmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiW2ldLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHJldCkKKwkJCWVycigidXNiX3N1Ym1pdF91cmIgZmFpbGVkICVkIiwgcmV0KTsKKwl9IC8qIGZvciAqLworCisJa2ZyZWUodXJiKTsKKworCS8qICBkYmcoImVuZCIpOyovCisJcmV0dXJuIHNpemU7Cit9IC8qIGRldmljZV90c2lzb19zZW5kICovCisKK3N0YXRpYyBpbnQgZGV2aWNlX3N0YXJ0X2lzb19vdXQoc3RydWN0IGRldmljZV9zICpkZXZpY2UsIF9fdTggaW5kZXgpCit7CisJaW50ICAgICAgICAgaSwgajsKKwlpbnQgICAgICAgICByZXQgPSAwOworCXN0cnVjdCB1cmIgICp1cmI7CisKKwkvKmRiZygic3RhcnQiKTsqLworCisJZGV2aWNlLT5jaGFubmVsW2luZGV4XS5vdXRTdG9wID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgREVWSUNFX05VTV9JU09DX09VVF9VUkJTOyBpKyspIHsKKwkJdXJiID0gdXNiX2FsbG9jX3VyYihERVZJQ0VfTlVNX0ZSQU1FU19QRVJfVVJCLCBHRlBfS0VSTkVMKTsKKwkJZGV2aWNlLT5jaGFubmVsW2luZGV4XS5pc29jT3V0VXJiW2ldID0gdXJiOworCQlpZiAodXJiKSB7CisJCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IGttYWxsb2MoREVWSUNFX0lTT0NfTEVOR1RIKAorCQkJCWRldmljZS0+Y2hhbm5lbFtpbmRleF0ubWF4UGFja2V0U2l6ZSksCisJCQkJR0ZQX0tFUk5FTCk7CisJCQlpZiAoIXVyYi0+dHJhbnNmZXJfYnVmZmVyKSB7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQllcnIoInRyYW5zZmVyX2J1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZCAlZCIsIGkpOworCQkJCWJyZWFrOworCQkJfSAvKiBpZiAqLworCQl9IC8qIGlmICovIGVsc2UgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWVycigidXNiX2FsbG9jX3VyYiBmYWlsZWQgJWQiLCBpKTsKKwkJCWJyZWFrOworCQl9IC8qIGlmICovCisJfSAvKiBmb3IgKi8KKworCWlmIChyZXQpIHsKKwkJLyogQWxsb2NhdGlvbiBlcnJvciwgbXVzdCBmcmVlIGFscmVhZHkgYWxsb2NhdGVkIGRhdGEgKi8KKwkJZm9yIChpID0gMDsgaSA8IERFVklDRV9OVU1fSVNPQ19PVVRfVVJCUzsgaSsrKSB7CisJCQl1cmIgPSBkZXZpY2UtPmNoYW5uZWxbaW5kZXhdLmlzb2NPdXRVcmJbaV07CisJCQlpZiAodXJiKSB7CisJCQkJa2ZyZWUodXJiLT50cmFuc2Zlcl9idWZmZXIpOworCQkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gTlVMTDsKKwkJCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJCQlkZXZpY2UtPmNoYW5uZWxbaW5kZXhdLmlzb2NPdXRVcmJbaV0gPSBOVUxMOworCQkJfSAvKiBpZiAqLworCQl9IC8qIGZvciAqLworCQlyZXR1cm4gcmV0OworCX0gLyogaWYgKi8KKworCWZvciAoaSA9IDA7IGkgPCBERVZJQ0VfTlVNX0lTT0NfT1VUX1VSQlM7IGkrKykgeworCQl1cmIgPSBkZXZpY2UtPmNoYW5uZWxbaW5kZXhdLmlzb2NPdXRVcmJbaV07CisJCW1lbXNldCh1cmItPnRyYW5zZmVyX2J1ZmZlciwgMCwgREVWSUNFX0lTT0NfTEVOR1RIKAorCQkJZGV2aWNlLT5jaGFubmVsW2luZGV4XS5tYXhQYWNrZXRTaXplKSk7CisJCWZvciAoaiA9IDA7CisJCQlqIDwgREVWSUNFX0lTT0NfTEVOR1RIKAorCQkJCWRldmljZS0+Y2hhbm5lbFtpbmRleF0ubWF4UGFja2V0U2l6ZSk7CisJCQlqICs9IERFVklDRV9NUEVHMl9QQUNLRVRfU0laRSkgeworCQkJbWVtY3B5KHVyYi0+dHJhbnNmZXJfYnVmZmVyK2osCisJCQkJbnVsbEhlYWRlciwgc2l6ZW9mKG51bGxIZWFkZXIpKTsKKwkJfSAvKiBmb3IgKi8KKwkJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gREVWSUNFX0lTT0NfTEVOR1RIKAorCQkJZGV2aWNlLT5jaGFubmVsW2luZGV4XS5tYXhQYWNrZXRTaXplKTsKKwkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IERFVklDRV9OVU1fRlJBTUVTX1BFUl9VUkI7CisJCXVyYi0+Y29tcGxldGUgPSBkZXZpY2VfaXNvX291dF9jb21wbGV0ZTsKKwkJdXJiLT5jb250ZXh0ID0gJmRldmljZS0+Y2hhbm5lbFtpbmRleF07CisJCXVyYi0+ZGV2ID0gZGV2aWNlLT51c2JkZXY7CisJCXVyYi0+cGlwZSA9IHVzYl9zbmRpc29jcGlwZShkZXZpY2UtPnVzYmRldiwKKwkJCURFVklDRV9UU19PVVRfUElQRSArIGluZGV4KTsKKwkJdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUDsKKwkJdXJiLT5pbnRlcnZhbCA9IDE7CisJCWZvciAoaiA9IDA7IGogPCBERVZJQ0VfTlVNX0ZSQU1FU19QRVJfVVJCOyBqKyspIHsKKwkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0ub2Zmc2V0ID0KKwkJCQlqICogZGV2aWNlLT5jaGFubmVsW2luZGV4XS5tYXhQYWNrZXRTaXplOworCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5sZW5ndGggPQorCQkJCWRldmljZS0+Y2hhbm5lbFtpbmRleF0ubWF4UGFja2V0U2l6ZTsKKwkJfSAvKiBmb3IgKi8KKwl9IC8qIGZvciAqLworCWRldmljZS0+Y2hhbm5lbFtpbmRleF0ubmV4dEZyZWVPdXRVcmJJbmRleCA9IERFVklDRV9OVU1fSVNPQ19PVVRfVVJCUy0xOworCWF0b21pY19zZXQoJmRldmljZS0+Y2hhbm5lbFtpbmRleF0ubnVtT3V0VXJicywgMSk7CisJZm9yIChpID0gMDsgaSA8IERFVklDRV9OVU1fSVNPQ19PVVRfVVJCUy0xOyBpKyspIHsKKwkJcmV0ID0gdXNiX3N1Ym1pdF91cmIoCisJCQlkZXZpY2UtPmNoYW5uZWxbaW5kZXhdLmlzb2NPdXRVcmJbaV0sIEdGUF9LRVJORUwpOworCQlpZiAocmV0KQorCQkJZXJyKCJ1c2Jfc3VibWl0X3VyYiBmYWlsZWQgJWQiLCByZXQpOworCX0gLyogZm9yICovCisKKwkvKmRiZygiZW5kIik7Ki8KKwlyZXR1cm4gMDsKK30gLyogZGV2aWNlX3N0YXJ0X2lzb19vdXQgKi8KKworc3RhdGljIHZvaWQgZGV2aWNlX3N0b3BfaXNvX291dChzdHJ1Y3QgZGV2aWNlX3MgKmRldmljZSwgX191OCBpbmRleCkKK3sKKwlkYmcoInN0YXJ0Iik7CisKKwlkZXZpY2UtPmNoYW5uZWxbaW5kZXhdLm91dFN0b3AgPSAxOworCisJZGJnKCJlbmQiKTsKK30gLyogZGV2aWNlX3N0b3BfaXNvX291dCAqLworCitzdGF0aWMgdm9pZCBkZXZpY2VfdHNidWxrX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgZGV2aWNlX3MgKmRldmljZSA9IHVyYi0+Y29udGV4dDsKKwlfX3U4IGluZGV4ID0gMDsKKworCS8qZGJnKCJzdGFydCIpOyovCisJaWYgKCF1cmItPnN0YXR1cykgeworCQlpZiAodXNiX2VuZHBvaW50X251bSgmKHVyYi0+ZXAtPmRlc2MpKSAhPSBERVZJQ0VfVFNfT1VUX1BJUEUpCisJCQlpbmRleCA9IDE7CisJCWRldmljZS0+Y2hhbm5lbFtpbmRleF0ubmJCeXRlU2VuZCArPSB1cmItPmFjdHVhbF9sZW5ndGg7CisJfQorCWtmcmVlKHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwl1c2JfZnJlZV91cmIodXJiKTsKKwkvKmRiZygiZW5kIik7Ki8KK30gLyogZGV2aWNlX3RzYnVsa19jb21wbGV0ZSAqLworCitzdGF0aWMgaW50IGRldmljZV90c2J1bGtfc2VuZChzdHJ1Y3QgZGV2aWNlX3MgKmRldmljZSwKKwlfX3U4IGluZGV4LCBfX3U4ICpkYXRhLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgdXJiICp1cmI7CisJLyogIGludCAgICAgICAgIHRvZG8gPSBzaXplOyovCisJaW50IHJldCA9IDA7CisKKwlkYmcoInN0YXJ0Iik7CisKKwkvKiBnZXQgYSBmcmVlIGJ1bGsgbWVzc2FnZSAqLworCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1cmIpIHsKKwkJZXJyKCJhbGxvYyB1cmIiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfSAvKiBpZiAqLworCXVyYi0+ZGV2ID0gZGV2aWNlLT51c2JkZXY7CisKKwkvKiBhbGxvY2F0ZSBidWxrIGRhdGEgKi8KKwl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1cmItPnRyYW5zZmVyX2J1ZmZlcikgeworCQllcnIoImFsbG9jIHRyYW5zZmVyIGJ1ZmZlciIpOworCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfSAvKiBpZiAqLworCisJLyogY29weSBkYXRhICovCisJcmV0ID0gY29weV9mcm9tX3VzZXIodXJiLT50cmFuc2Zlcl9idWZmZXIsIGRhdGEsIHNpemUpOworCisJLyogc3VibWl0IGJ1bGsgKi8KKwl1cmItPnBpcGUgPSB1c2Jfc25kYnVsa3BpcGUoZGV2aWNlLT51c2JkZXYsIERFVklDRV9UU19PVVRfUElQRSArIGluZGV4KTsKKwl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBzaXplOworCXVyYi0+Y29tcGxldGUgPSBkZXZpY2VfdHNidWxrX2NvbXBsZXRlOworCXVyYi0+Y29udGV4dCAgPSBkZXZpY2U7CisJLypkYmcoIlRyYW5zbWl0ICVkIGJ5dGVzXG4iLHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCk7Ki8KKwkvKmRiZ19kdW1wKCJ0eEJ1ZiIsCisJCXVyYi0+dHJhbnNmZXJfYnVmZmVyLCB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOyovCisJbW9kX3RpbWVyKCYoZ2J1bGtfdGltZXJbaW5kZXhdLlN0YXJ0QnVsa1JlYWRUaW1lciksCisJCXVzZWNzX3RvX2ppZmZpZXMoNTApKTsKKworCWlmICh1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9LRVJORUwpIDwgMCkgeworCQllcnIoInN1Ym1pdCB1cmIiKTsKKwkJa2ZyZWUodXJiLT50cmFuc2Zlcl9idWZmZXIpOworCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfSAvKiBpZiAqLworCisJZGJnKCJlbmQiKTsKKwlyZXR1cm4gMDsKK30gLyogZGV2aWNlX3RzYnVsa19zZW5kICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyB2b2lkIFN0YXJ0QnVsa1JlYWRfZnVuYyhzdHJ1Y3QgdGltZXJfbGlzdCAqIHRpbWVyKQoreworCXN0cnVjdCBidWxrX3RpbWVyX3MgKmJ1bGtfdGltZSA9IGZyb21fdGltZXIoYnVsa190aW1lLHRpbWVyLFN0YXJ0QnVsa1JlYWRUaW1lcikgOworCisJZGV2aWNlX3N0YXJ0X3RzYnVsa19pbihidWxrX3RpbWUtPmRldmljZSwgYnVsa190aW1lLT5pbmRleCk7Cit9CisKK3N0YXRpYyBpbnQgZGV2aWNlX2Rydl9vcGVuKHN0cnVjdCBkZXZpY2VfcyAqZGV2aWNlKQoreworCWludCBpbmRleDsKKwltdXRleF9sb2NrKCZkZXZpY2UtPmxvY2spOworCisJaWYgKCFkZXZpY2UtPnVzYmRldikgeworCQllcnIoIm5vIGRldiwgY2FuIG5vdCBzdGFydCBkZXYiKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXZpY2UtPmxvY2spOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoZGV2aWNlLT5vcGVuZWQpIHsKKwkJbXV0ZXhfdW5sb2NrKCZkZXZpY2UtPmxvY2spOworCQlkZXZpY2UtPm9wZW5lZCsrOworCQlpbmZvKCJ1ZGV2PSVwIG9wZW5lZD0lZCIsIChkZXZpY2UtPnVzYmRldiksIGRldmljZS0+b3BlbmVkKTsKKwkJcmV0dXJuIDA7CisJfSAvKiB3aGlsZSAqLworCisJaW5mbygic2V0IGludGVyZmFjZSAwIik7CisJaWYgKHVzYl9zZXRfaW50ZXJmYWNlKGRldmljZS0+dXNiZGV2LCAwLCAwKSA8IDApIHsKKwkJbXV0ZXhfdW5sb2NrKCZkZXZpY2UtPmxvY2spOworCQllcnIoInNldF9pbnRlcmZhY2UgZmFpbCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IC8qIGlmICovCisKKwlkZXZpY2UtPm9wZW5lZCsrOworCWRldmljZS0+YXNrVG9SZWxlYXNlID0gMDsKKwltdXRleF91bmxvY2soJmRldmljZS0+bG9jayk7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBERVZJQ0VfTlVNX0NBTTsgaW5kZXgrKykgeworCQlkZXZpY2UtPmNoYW5uZWxbaW5kZXhdLm5iQnl0ZVNlbmQgPSAtMzc2OworCQlkZXZpY2UtPmNoYW5uZWxbaW5kZXhdLm5iQnl0ZVJlYWQgPSAwOworCQlkZXZpY2UtPmNoYW5uZWxbaW5kZXhdLkZpcnN0VHJhbnNmZXIgPSB0cnVlOworCQlnYnVsa190aW1lcltpbmRleF0uZGV2aWNlID0gZGV2aWNlOworCQlnYnVsa190aW1lcltpbmRleF0uaW5kZXggPSBpbmRleDsKKwkJdGltZXJfc2V0dXAoJmdidWxrX3RpbWVyW2luZGV4XS5TdGFydEJ1bGtSZWFkVGltZXIsCisJCQlTdGFydEJ1bGtSZWFkX2Z1bmMsMCk7CisJfQorI2lmZGVmIERFQlVHX0NPTlRJTlVJVFkKKwlpbml0X3RhYl9jYygpOworI2VuZGlmCisJaW5mbygidWRldj0lcCBvcGVuZWQ9JWQiLCAoZGV2aWNlLT51c2JkZXYpLCBkZXZpY2UtPm9wZW5lZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGV2aWNlX2NpX3VubG9ja19yZWFkKHN0cnVjdCBkZXZpY2VfcyAqZGV2aWNlKQoreworCWlmIChkZXZpY2UtPm9wZW5lZCkgeworCQkvKiByZWxlYXNlIGJsb2NraW5nIGZ1bmN0aW9ucyAqLworCQlkZXZpY2UtPmFza1RvUmVsZWFzZSA9IDE7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2aWNlLT5jaUJ1bGsuY2lEYXRhWzBdLmFzeW5jV2FpdCk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2aWNlLT5jaUJ1bGsuY2lEYXRhWzFdLmFzeW5jV2FpdCk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2aWNlLT5jaGFubmVsWzBdLmluV2FpdCk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2aWNlLT5jaGFubmVsWzFdLmluV2FpdCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRldmljZV9kcnZfY2xvc2Uoc3RydWN0IGRldmljZV9zICpkZXZpY2UpCit7CisJaW50IGk7CisJbXV0ZXhfbG9jaygmZGV2aWNlLT5sb2NrKTsKKwlpZiAoZGV2aWNlLT5vcGVuZWQgJiYgKCgtLWRldmljZS0+b3BlbmVkKSA9PSAwKSkgeworCQlkZXZpY2UtPmFza1RvUmVsZWFzZSA9IDE7CisJCWRldmljZV9zdG9wX2ludHIoZGV2aWNlKTsKKwkJZm9yIChpID0gMDsgaSA8IERFVklDRV9OVU1fQ0FNOyBpKyspIHsKKwkJCWlmIChkZXZpY2UtPnVzZUlzb2MpIHsKKwkJCQlkZXZpY2Vfc3RvcF9pc29fb3V0KGRldmljZSwgaSk7CisJCQkJZGV2aWNlX3N0b3BfaXNvX2luKGRldmljZSwgaSk7CisJCQl9IGVsc2UKKwkJCQlkZXZpY2Vfc3RvcF90c2J1bGtfaW4oZGV2aWNlLCBpKTsKKwkJfSAvKiBmb3IgKi8KKwkJZGV2aWNlLT5vcGVuZWQgPSAwOworCX0gLyogaWYgKi8KKwltdXRleF91bmxvY2soJmRldmljZS0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGV2aWNlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50ICAgICAgIGRldm51bSA9IGltaW5vcihpbm9kZSk7CisjaWZkZWYgREVCVUcKKwlpbnQgICAgICAgIHR5cGUgPSAoTUlOT1IoaW5vZGUtPmlfcmRldikgPj4gNCk7CisJaW50ICAgICAgICBudW0gPSAoTUlOT1IoaW5vZGUtPmlfcmRldikgJiAweGYpOworI2VuZGlmCisJaW50ICAgcmV0ID0gMDsKKworCXN0cnVjdCBkZXZpY2VfcyAqZGV2aWNlOworCisJZGJnKCJzdGFydCwgZGV2bnVtID0gJWQgdHlwZSA9ICVkIG51bSA9ICVkIiwgZGV2bnVtLCB0eXBlLCBudW0pOworCisJaWYgKGdkZXZpY2VOdW1iZXIgPj0gRFJJVkVSX01BWF9OVU1CRVIpIHsKKwkJZGJnKCJvbmx5IHN1cHBvcnQgb25lIGRldmljZSBvcGVuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkZXZpY2UgPSAmZ2RldmljZVtnZGV2aWNlTnVtYmVyXTsKKwkvKmdkZXZpY2VOdW1iZXIrKzsqLworCisJa3RpbWVfZ2V0X3RzKCZnU3RhcnQpOworCisJcmV0ID0gZGV2aWNlX2Rydl9vcGVuKGRldmljZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlmaWxlLT5mX3BvcyA9IDA7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZGV2aWNlOworCisJZGJnKCJlbmQiKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9IC8qIGRldmljZV9vcGVuICovCisKK3N0YXRpYyBpbnQgZGV2aWNlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGRldmljZV9zICpkZXZpY2UgPSAoc3RydWN0IGRldmljZV9zICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJZGJnKCJzdGFydCIpOworCWRldmljZV9kcnZfY2xvc2UoZGV2aWNlKTsKKwlkYmcoImVuZCIpOworCXJldHVybiAwOworfSAvKiBkZXZpY2VfcmVsZWFzZSAqLworCitpbnQgY2ltYXhfdXNiX3NlbGVjdF9pbnRlcmZhY2Uoc3RydWN0IGRldmljZV9zICpkZXZpY2UsIHVuc2lnbmVkIGxvbmcgaW50ZikKK3sKKwlpbnQgICAgICAgICAgbWF4ICAgID0gIDA7CisJaW50ICAgICAgICAgIG11bHQgICAgPSAgMDsKKwlpbnQgICAgICAgICAgcmV0ICAgID0gIDA7CisKKwlpbmZvKCJzZXQgaW50ZXJmYWNlICVsZCIsIGludGYpOworCWlmICh1c2Jfc2V0X2ludGVyZmFjZShkZXZpY2UtPnVzYmRldiwgMCwgaW50ZikgPCAwKSB7CisJCWVycigic2V0X2ludGVyZmFjZSBmYWlsZWQgaW50ZXJmYWNlIDAsIGFsdFNldHRpbmcgJWxkIiwgaW50Zik7CisJCXJldHVybiAtRUlOVkFMOworCX0gLyogaWYgKi8KKworCS8qIGNoZWNrIGVuZHBvaW50cyAqLworCS8qIENJIGJ1bGsgb3V0ICovCisJaWYgKCF1c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQoCisJCQkmZGV2aWNlLT51c2JkZXYtPmVwX291dFtERVZJQ0VfQlVMS19PVVRfUElQRV0tPmRlc2MpKSB7CisJCWVycigidW5leHBlY3RlZCBlbmRwb2ludCAlZCIsIERFVklDRV9CVUxLX09VVF9QSVBFKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSAvKiBpZiAqLworCWRldmljZS0+Y2lCdWxrLm91dE1heFBhY2tldFNpemUgPSBERVZJQ0VfQlVMS19PVVRfTUFYUEFDS0VUOworCWRiZygiQ0kgYnVsayBvdXQgKGVuZHBvaW50ICVkKSwgcGFja2V0IHNpemUgJWQiLCBERVZJQ0VfQlVMS19PVVRfUElQRSwKKwkJCWRldmljZS0+Y2lCdWxrLm91dE1heFBhY2tldFNpemUpOworCS8qIENJIGludCBpbiAqLworCWlmICghdXNiX2VuZHBvaW50X2lzX2ludF9pbigKKwkJCSZkZXZpY2UtPnVzYmRldi0+ZXBfaW5bREVWSUNFX0lOVF9JTl9QSVBFXS0+ZGVzYykpIHsKKwkJZXJyKCJ1bmV4cGVjdGVkIGVuZHBvaW50ICVkIiwgREVWSUNFX0lOVF9JTl9QSVBFKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSAvKiBpZiAqLworCWRldmljZS0+Y2lCdWxrLmluTWF4UGFja2V0U2l6ZSA9CisJCWRldmljZS0+dXNiZGV2LT5lcF9pbltERVZJQ0VfSU5UX0lOX1BJUEVdLT5kZXNjLndNYXhQYWNrZXRTaXplOworCWRiZygiQ0kgaW50IGluIChlbmRwb2ludCAlZCksIHBhY2tldCBzaXplICVkIiwgREVWSUNFX0lOVF9JTl9QSVBFLAorCQkJZGV2aWNlLT5jaUJ1bGsuaW5NYXhQYWNrZXRTaXplKTsKKwkvKiBUUyBvdXQgKi8KKwlpZiAoZGV2aWNlLT51c2JkZXYtPmVwX291dFtERVZJQ0VfVFNfT1VUX1BJUEVdID09IE5VTEwpCisJCWRiZygibm8gVFMgZW5kcG9pbnQiKTsKKwllbHNlIHsKKwkJaWYgKHVzYl9lbmRwb2ludF9pc19idWxrX291dCgKKwkJCSZkZXZpY2UtPnVzYmRldi0+ZXBfb3V0W0RFVklDRV9UU19PVVRfUElQRV0tPmRlc2MpKSB7CisJCQlkZXZpY2UtPnVzZUlzb2MgPSAwOworCQkJZGJnKCJUUyBpcyBjb25maWd1cmVkIGFzIGJ1bGsiKTsKKwkJfSBlbHNlIGlmICh1c2JfZW5kcG9pbnRfaXNfaXNvY19vdXQoCisJCQkmZGV2aWNlLT51c2JkZXYtPmVwX291dFtERVZJQ0VfVFNfT1VUX1BJUEVdLT5kZXNjKSkgeworCQkJZGV2aWNlLT51c2VJc29jID0gMTsKKwkJCWRiZygiVFMgaXMgY29uZmlndXJlZCBhcyBpc29jaHJvbm91cyIpOworCQl9IGVsc2UgeworCQkJZXJyKCJ1bmV4cGVjdGVkIGVuZHBvaW50ICVkIiwgREVWSUNFX1RTX09VVF9QSVBFKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9IC8qIGlmICovCisJCW1heCA9IGRldmljZS0+dXNiZGV2LT4KKwkJCWVwX291dFtERVZJQ0VfVFNfT1VUX1BJUEVdLT5kZXNjLndNYXhQYWNrZXRTaXplOworCQltdWx0ID0gMSArICgobWF4ID4+IDExKSAmIDB4MDMpOworCQltYXggJj0gMHg3ZmY7CisJCWRldmljZS0+Y2hhbm5lbFswXS5tYXhQYWNrZXRTaXplID0gbWF4ICogbXVsdDsKKwkJZGJnKCJUUyBvdXQgKGVuZHBvaW50ICVkKSwgcGFja2V0IHNpemUgJWQiLCBERVZJQ0VfVFNfT1VUX1BJUEUsCisJCQkJZGV2aWNlLT5jaGFubmVsWzBdLm1heFBhY2tldFNpemUpOworCisJCW1heCA9IGRldmljZS0+dXNiZGV2LT4KKwkJCWVwX291dFtERVZJQ0VfVFNfT1VUX1BJUEUrMV0tPmRlc2Mud01heFBhY2tldFNpemU7CisJCW11bHQgPSAxICsgKChtYXggPj4gMTEpICYgMHgwMyk7CisJCW1heCAmPSAweDdmZjsKKwkJZGV2aWNlLT5jaGFubmVsWzFdLm1heFBhY2tldFNpemUgPSBtYXggKiBtdWx0OworCQlkYmcoIlRTIG91dCAoZW5kcG9pbnQgJWQpLCBwYWNrZXQgc2l6ZSAlZCIsCisJCQkJREVWSUNFX1RTX09VVF9QSVBFICsgMSwKKwkJCQlkZXZpY2UtPmNoYW5uZWxbMV0ubWF4UGFja2V0U2l6ZSk7CisJfQorCisJLyogc3RhcnQgaW50ciB1cmIgKi8KKwlpZiAoZGV2aWNlLT5jaUJ1bGsuaW50VXJiWzBdID09IE5VTEwpIHsKKwkJcmV0ID0gZGV2aWNlX3N0YXJ0X2ludHIoZGV2aWNlKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWVycigiY2Fubm90IHN0YXJ0IGludCB1cmIiKTsKKwkJCXJldHVybiByZXQ7CisJCX0gLyogaWYgKi8KKwl9IC8qIGlmICovCisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChjaW1heF91c2Jfc2VsZWN0X2ludGVyZmFjZSk7CisKK3N0YXRpYyBpbnQgZGV2aWNlX2NpX3dyaXRlKHN0cnVjdCBkZXZpY2VfcyAqZGV2aWNlLAorCQlzdHJ1Y3QgaW9jdGxfZGF0YV9zICpkYXRhLCBpbnQgaXNJb2N0bCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpZiAoIWRldmljZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmV0ID0gZGV2aWNlX2NpYnVsa19zZW5kKGRldmljZSwgZGF0YSwgaXNJb2N0bCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0dXJuIGRldmljZV93YWl0X3N5bmNfZGF0YShkZXZpY2UsIHJldCwgZGF0YSwgaXNJb2N0bCk7Cit9CisKK3N0YXRpYyBpbnQgZGV2aWNlX2NpX3dyaXRlX2lvY3RsKHN0cnVjdCBkZXZpY2VfcyAqZGV2aWNlLAorCQlzdHJ1Y3QgaW9jdGxfZGF0YV9zICpkYXRhKQoreworCXJldHVybiBkZXZpY2VfY2lfd3JpdGUoZGV2aWNlLCBkYXRhLCAxKTsKK30KKworaW50IGNpbWF4X3VzYl9jaV93cml0ZShzdHJ1Y3QgZGV2aWNlX3MgKmRldmljZSwKKwkJdTggKnR4RGF0YSwgaW50IHR4U2l6ZSwgdTggKnJ4RGF0YSwgaW50IHJ4U2l6ZSkKK3sKKwlzdHJ1Y3QgaW9jdGxfZGF0YV9zIGRhdGE7CisJaWYgKCFkZXZpY2UpCisJCXJldHVybiAtRU5PREVWOworCW1lbXNldCgmZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKKwlkYXRhLnR4RGF0YSA9IHR4RGF0YTsKKwlkYXRhLnR4U2l6ZSA9IHR4U2l6ZTsKKwlkYXRhLnJ4RGF0YSA9IHJ4RGF0YTsKKwlkYXRhLnJ4U2l6ZSA9IHJ4U2l6ZTsKKwlyZXR1cm4gZGV2aWNlX2NpX3dyaXRlKGRldmljZSwgJmRhdGEsIDApOworfQorRVhQT1JUX1NZTUJPTChjaW1heF91c2JfY2lfd3JpdGUpOworCitpbnQgY2ltYXhfdXNiX2NpX3JlYWRfZXZ0KHN0cnVjdCBkZXZpY2VfcyAqZGV2aWNlLAorCQlpbnQgbW9kdWxlSWQsIHU4ICpidWYsIGludCBzaXplKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCByd19kYXRhX3MgZGF0YTsKKwlpZiAoIWRldmljZSB8fCAhZGV2aWNlLT5vcGVuZWQpCisJCXJldHVybiAtRU5PREVWOworCW1lbXNldCgmZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKKwlkYXRhLm1vZHVsZUlkID0gbW9kdWxlSWQ7CisJZGF0YS5kYXRhID0gYnVmOworCWRhdGEuc2l6ZSA9IHNpemU7CisJcmV0ID0gZGV2aWNlX3dhaXRfYXN5bmNfZGF0YShkZXZpY2UsIGRhdGEubW9kdWxlSWQsICZkYXRhLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQllcnIoIndhaXQgY2kgcmVhZCBmYWlsZWQiKTsKKwkJcmV0dXJuIHJldDsKKwl9IC8qIGlmICovCisJZGJnKCJyZXR1cm4gQ0ksIG1vZHVsZUlkICVkLCBkYXRhIDB4JXAsIHNpemUgJWQiLAorCQkJZGF0YS5tb2R1bGVJZCwgZGF0YS5kYXRhLCBkYXRhLnNpemUpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGNpbWF4X3VzYl9jaV9yZWFkX2V2dCk7CisKK2ludCBjaW1heF91c2JfZGV2aWNlX29wZW4oc3RydWN0IGRldmljZV9zICpkZXZpY2UpCit7CisJcmV0dXJuIGRldmljZV9kcnZfb3BlbihkZXZpY2UpOworfQorRVhQT1JUX1NZTUJPTChjaW1heF91c2JfZGV2aWNlX29wZW4pOworCitpbnQgY2ltYXhfdXNiX2RldmljZV91bmxvY2tfcmVhZChzdHJ1Y3QgZGV2aWNlX3MgKmRldmljZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpZiAoIWRldmljZSkKKwkJcmV0dXJuIDA7CisJbXV0ZXhfbG9jaygmZGV2aWNlLT5sb2NrKTsKKwlyZXQgPSBkZXZpY2VfY2lfdW5sb2NrX3JlYWQoZGV2aWNlKTsKKwltdXRleF91bmxvY2soJmRldmljZS0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woY2ltYXhfdXNiX2RldmljZV91bmxvY2tfcmVhZCk7CisKK2ludCBjaW1heF91c2JfZGV2aWNlX2Nsb3NlKHN0cnVjdCBkZXZpY2VfcyAqZGV2aWNlKQoreworCWlmICghZGV2aWNlKQorCQlyZXR1cm4gMDsKKwljaW1heF91c2JfZGV2aWNlX3VubG9ja19yZWFkKGRldmljZSk7CisJaWYgKGNpbWF4X3VzYl9kZXZfcmVtb3ZlKQorCQljaW1heF91c2JfZGV2X3JlbW92ZShkZXZpY2UsIGdkZXZpY2VOdW1iZXIpOworCXJldHVybiBkZXZpY2VfZHJ2X2Nsb3NlKGRldmljZSk7Cit9CitFWFBPUlRfU1lNQk9MKGNpbWF4X3VzYl9kZXZpY2VfY2xvc2UpOworCitzdGF0aWMgbG9uZyBkZXZpY2VfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBkZXZpY2VfcyAqZGV2aWNlID0gKHN0cnVjdCBkZXZpY2VfcyAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgICAgICAgICAgZXJyICAgID0gMDsKKwlpbnQgICAgICAgICAgcmV0ICAgID0gMDsKKwlzdHJ1Y3QgaW9jdGxfZGF0YV9zIGRhdGE7CisJdm9pZCAgICAgICAgICp0cmFuc2Zlcl9idWZmZXIgPSBOVUxMOworCisJZGJnKCJzdGFydCIpOworCisJLyogRG9uJ3QgZGVjb2RlIHdyb25nIGNtZHM6IHJldHVybiBFTk9UVFkgKGluYXBwcm9wcmlhdGUgaW9jdGwpICovCisJaWYgKF9JT0NfVFlQRShjbWQpICE9IERFVklDRV9JT0NfTUFHSUMpCisJCXJldHVybiAtRU5PVFRZOworCWlmIChfSU9DX05SKGNtZCkgPiBERVZJQ0VfSU9DX01BWE5SKQorCQlyZXR1cm4gLUVOT1RUWTsKKworCS8qIFZlcmlmeSBkaXJlY3Rpb24gKHJlYWQvd3JpdGUpICovCisJaWYgKF9JT0NfRElSKGNtZCkgJiBfSU9DX1JFQUQpCisvLwkJZXJyID0gIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsICh2b2lkICopYXJnLCBfSU9DX1NJWkUoY21kKSk7CisJCWVyciA9ICFhY2Nlc3Nfb2soKHZvaWQgKilhcmcsIF9JT0NfU0laRShjbWQpKTsKKwllbHNlIGlmIChfSU9DX0RJUihjbWQpICYgX0lPQ19XUklURSkKKy8vCQllcnIgPSAhYWNjZXNzX29rKFZFUklGWV9SRUFELCAodm9pZCAqKWFyZywgX0lPQ19TSVpFKGNtZCkpOworCQllcnIgPSAhYWNjZXNzX29rKCh2b2lkICopYXJnLCBfSU9DX1NJWkUoY21kKSk7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXZpY2UtPmxvY2spKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIERFVklDRV9JT0NfU0VMRUNUX0lOVEY6CisJCWRiZygiREVWSUNFX0lPQ19TRUxFQ1RfSU5URiBzdGFydCIpOworCQlyZXQgPSBjaW1heF91c2Jfc2VsZWN0X2ludGVyZmFjZShkZXZpY2UsIGFyZyk7CisJCWRiZygiREVWSUNFX0lPQ19TRUxFQ1RfSU5URiBlbmQiKTsKKwkJYnJlYWs7CisKKwljYXNlIERFVklDRV9JT0NfQ0lfV1JJVEU6CisJCWRiZygiREVWSUNFX0lPQ19DSV9XUklURSBzdGFydCIpOworCisJCS8qIHNlbmQgQ0kgbWVzc2FnZSAqLworCQlyZXQgPSBjb3B5X2Zyb21fdXNlcigmZGF0YSwKKwkJCSh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHN0cnVjdCBpb2N0bF9kYXRhX3MpKTsKKwkJZGJnKCJpbk1zZywgcnggMHglcCwgcnhTaXplICVkLCB0eCAweCVwLCB0eFNpemUgJWQiLAorCQkJZGF0YS5yeERhdGEsCisJCQlkYXRhLnJ4U2l6ZSwKKwkJCWRhdGEudHhEYXRhLAorCQkJZGF0YS50eFNpemUpOworCQlyZXQgPSBkZXZpY2VfY2lfd3JpdGVfaW9jdGwoZGV2aWNlLCAmZGF0YSk7CisJCWlmIChyZXQgPCAwKQorCQkJYnJlYWs7CisJCXJldCA9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsCisJCQkmZGF0YSwgc2l6ZW9mKHN0cnVjdCBpb2N0bF9kYXRhX3MpKTsKKworCQlkYmcoIkRFVklDRV9JT0NfQ0lfV1JJVEUgZW5kIik7CisJCWJyZWFrOworCisJY2FzZSBERVZJQ0VfSU9DX1VOTE9DS19SRUFEOgorCQlkYmcoIkRFVklDRV9JT0NfVU5MT0NLX1JFQUQgc3RhcnQiKTsKKworCQlyZXQgPSBkZXZpY2VfY2lfdW5sb2NrX3JlYWQoZGV2aWNlKTsKKworCQlkYmcoIkRFVklDRV9JT0NfVU5MT0NLX1JFQUQgZW5kIik7CisJCWJyZWFrOworCisJY2FzZSBERVZJQ0VfSU9DX1NFVF9DT05GSUc6CisJCWRiZygiREVWSUNFX0lPQ19TRVRfQ09ORklHIHN0YXJ0Iik7CisKKwkJLyogc2VuZCBDSSBtZXNzYWdlICovCisJCXJldCA9IGNvcHlfZnJvbV91c2VyKCZkYXRhLAorCQkJKHZvaWQgX191c2VyICopYXJnLCBzaXplb2Yoc3RydWN0IGlvY3RsX2RhdGFfcykpOworCQlkYmcoImluTXNnLCByeCAweCVwLCByeFNpemUgJWQsIHR4IDB4JXAsIHR4U2l6ZSAlZCIsCisJCQlkYXRhLnJ4RGF0YSwgZGF0YS5yeFNpemUsCisJCQlkYXRhLnR4RGF0YSwgZGF0YS50eFNpemUpOworCQl0cmFuc2Zlcl9idWZmZXIgPSBrbWFsbG9jKGRhdGEudHhTaXplLCBHRlBfS0VSTkVMKTsKKwkJbWVtY3B5KHRyYW5zZmVyX2J1ZmZlciwgZGF0YS50eERhdGEsIGRhdGEudHhTaXplKTsKKwkJZGJnX2R1bXAoIk5ldyBjb25maWciLCB0cmFuc2Zlcl9idWZmZXIsIGRhdGEudHhTaXplKTsKKwkJZXJyID0gdXNiX2NvbnRyb2xfbXNnKGRldmljZS0+dXNiZGV2LAorCQkJdXNiX3NuZGN0cmxwaXBlKGRldmljZS0+dXNiZGV2LCAwKSwKKwkJCVVTQl9SRVFfU0VUX0RFU0NSSVBUT1IsCisJCQlVU0JfVFlQRV9TVEFOREFSRCwKKwkJCShVU0JfRFRfQ09ORklHIDw8IDgpLAorCQkJMCwKKwkJCXRyYW5zZmVyX2J1ZmZlciwKKwkJCWRhdGEudHhTaXplLAorCQkJNTAwMCk7CisJCWlmIChlcnIgPCAwKSB7CisJCQllcnIoInNldF9jb25maWcgZmFpbGVkICVkIiwgZXJyKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0KKwkJa2ZyZWUodHJhbnNmZXJfYnVmZmVyKTsKKwkJZGJnKCJERVZJQ0VfSU9DX1NFVF9DT05GSUcgZW5kIik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT0lPQ1RMQ01EOworCQlicmVhazsKKwl9IC8qIHN3aXRjaCAqLworCW11dGV4X3VubG9jaygmZGV2aWNlLT5sb2NrKTsKKworCWRiZygiZW5kLCByZXQgJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9IC8qIGRldmljZV9pb2N0bCAqLworCitzdGF0aWMgc3NpemVfdCBkZXZpY2Vfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWludCAgICAgICByZXQ7CisJc3RydWN0IHJ3X2RhdGFfcyBkYXRhOworCXN0cnVjdCBkZXZpY2VfcyAqZGV2aWNlID0gKHN0cnVjdCBkZXZpY2VfcyAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKworCWRiZygic3RhcnQiKTsKKworCS8qIGdldCB0cmFuc21pc3Npb24gYnVmZmVyICovCisJcmV0ID0gY29weV9mcm9tX3VzZXIoJmRhdGEsIGJ1Ziwgc2l6ZW9mKHN0cnVjdCByd19kYXRhX3MpKTsKKwlkYmcoInR4QnVmZmVyLCBtb2R1bGVJZCAldSwgZGF0YSAweCVwLCBzaXplICVkIiwKKwkJCWRhdGEubW9kdWxlSWQsIGRhdGEuZGF0YSwgZGF0YS5zaXplKTsKKwlpZiAoZGF0YS5tb2R1bGVJZCA+PSBERVZJQ0VfTlVNX0NBTSkgeworCQllcnIoImJhZCBtb2R1bGVJZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZGV2aWNlLT51c2VJc29jKSB7CisJCWlmICghZGF0YS5zaXplIHx8IChkYXRhLnNpemUgJSBERVZJQ0VfSVNPQ19MRU5HVEgoCisJCQlkZXZpY2UtPmNoYW5uZWxbZGF0YS5tb2R1bGVJZF0ubWF4UGFja2V0U2l6ZSkpKSB7CisJCQllcnIoInRyYW5zbWlzc2lvbiBidWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgJWQiLAorCQkJCURFVklDRV9JU09DX0xFTkdUSCgKKwkJCQlkZXZpY2UtPmNoYW5uZWxbZGF0YS5tb2R1bGVJZF0ubWF4UGFja2V0U2l6ZSkpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gLyogaWYgKi8KKwl9CisKKwlpZiAoZGV2aWNlLT51c2VJc29jKSB7CisJCWlmIChkZXZpY2UtPmNoYW5uZWxbZGF0YS5tb2R1bGVJZF0uaXNvY0luVXJiWzBdID09IE5VTEwpIHsKKwkJCXJldCA9IGRldmljZV9zdGFydF9pc29faW4oZGV2aWNlLCBkYXRhLm1vZHVsZUlkKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCX0gLyogaWYgKi8KKworCQlpZiAoZGV2aWNlLT5jaGFubmVsW2RhdGEubW9kdWxlSWRdLmlzb2NPdXRVcmJbMF0gPT0gTlVMTCkgeworCQkJcmV0ID0gZGV2aWNlX3N0YXJ0X2lzb19vdXQoZGV2aWNlLCBkYXRhLm1vZHVsZUlkKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCX0gLyogaWYgKi8KKworCQlkYmcoImNhbGwgZGV2aWNlX3RzaXNvX3NlbmQgbW9kdWxlSWQgJWQsIGRhdGEgMHglcCwgc2l6ZSAlZCIsCisJCQlkYXRhLm1vZHVsZUlkLCBkYXRhLmRhdGEsIGRhdGEuc2l6ZSk7CisJCXJldCA9IGRldmljZV90c2lzb19zZW5kKGRldmljZSwKKwkJCWRhdGEubW9kdWxlSWQsIGRhdGEuZGF0YSwgZGF0YS5zaXplKTsKKwl9IC8qIGlmICovCisJZWxzZSB7CisJCXJldCA9IGRldmljZV90c2J1bGtfc2VuZChkZXZpY2UsCisJCQlkYXRhLm1vZHVsZUlkLCBkYXRhLmRhdGEsIGRhdGEuc2l6ZSk7CisJfSAvKiBlbHNlICovCisKKwlkYmcoImVuZCwgbW9kdWxlSWQgJWQgcmV0dXJuICVkIiwgZGF0YS5tb2R1bGVJZCwgcmV0KTsKKwlyZXR1cm4gcmV0OworfSAvKiBkZXZpY2Vfd3JpdGUgKi8KKworc3RhdGljIHNzaXplX3QgZGV2aWNlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWludCAgICAgICByZXM7CisJc3RydWN0IHJ3X2RhdGFfcyBkYXRhOworCXN0cnVjdCBkZXZpY2VfcyAqZGV2aWNlID0gKHN0cnVjdCBkZXZpY2VfcyAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKworCWRiZygic3RhcnQiKTsKKworCWlmIChjb3VudCAhPSBzaXplb2Yoc3RydWN0IHJ3X2RhdGFfcykpIHsKKwkJZXJyKCJ0cnkgdG8gcmVhZCB1bmNvcnJlY3Qgc2l6ZSAlemQiLCBjb3VudCk7CisJCXJldHVybiAtRUZBVUxUOworCX0gLyogaWYgKi8KKwlyZXMgPSBjb3B5X2Zyb21fdXNlcigmZGF0YSwgYnVmLCBzaXplb2Yoc3RydWN0IHJ3X2RhdGFfcykpOworCWRhdGEuY29waWVkU2l6ZSA9IDA7CisJaWYgKGRhdGEudHlwZSA9PSBERVZJQ0VfVFlQRV9UU19SRUFEKSB7CisJCXJlcyA9IGRldmljZV9maWxsX3RzKGRldmljZSwgZGF0YS5tb2R1bGVJZCwgJmRhdGEpOworCQlpZiAocmVzIDwgMCkgeworCQkJZXJyKCJmaWxsIHRzIGJ1ZmZlciBmYWlsZWQiKTsKKwkJCXJldHVybiByZXM7CisJCX0gLyogaWYgKi8KKwkJZGJnKCJyZXR1cm4gVFMsIG1vZHVsZUlkICVkLCBkYXRhIDB4JXAsIHNpemUgJWQsIGNvcGllZFNpemUgJWQiLAorCQkJZGF0YS5tb2R1bGVJZCwgZGF0YS5kYXRhLCBkYXRhLnNpemUsIGRhdGEuY29waWVkU2l6ZSk7CisJCS8qcmVzID0gY291bnQ7Ki8KKwkJcmVzID0gZGF0YS5jb3BpZWRTaXplOworCX0gLyogaWYgKi8KKwllbHNlIGlmIChkYXRhLnR5cGUgPT0gREVWSUNFX1RZUEVfQ0lfUkVBRCkgeworCQlyZXMgPSBkZXZpY2Vfd2FpdF9hc3luY19kYXRhKGRldmljZSwgZGF0YS5tb2R1bGVJZCwgJmRhdGEsIDEpOworCQlpZiAocmVzIDwgMCkgeworCQkJZXJyKCJ3YWl0IGNpIHJlYWQgZmFpbGVkIik7CisJCQlyZXR1cm4gcmVzOworCQl9IC8qIGlmICovCisJCWRiZygicmV0dXJuIENJLCBtb2R1bGVJZCAlZCwgZGF0YSAweCVwLCBzaXplICVkIiwKKwkJCQlkYXRhLm1vZHVsZUlkLCBkYXRhLmRhdGEsIGRhdGEuc2l6ZSk7CisJCXJlcyA9IGRhdGEuc2l6ZTsKKwl9IC8qIGVsc2UgaWYgKi8KKwllbHNlIHsKKwkJZXJyKCJ1bmtub3duIGRhdGEgdHlwZSAlZCIsIGRhdGEudHlwZSk7CisJCXJlcyA9IC1FRkFVTFQ7CisJfSAvKiBlbHNlICovCisKKwlkYmcoImVuZCwgcmV0dXJuICVkIiwgcmVzKTsKKwlyZXR1cm4gcmVzOworfSAvKiBkZXZpY2VfcmVhZCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYKKyAqICAgd3JpdGUgZGF0YSBvbiBDb250cm9sIGVuZHBvaW50LgorICoKKworICogQHBhcmFtICAgZGV2CisgKiAgIFBvaW50ZXIgdG8gdXNiIGRldmljZS4KKyAqCisgKiBAcGFyYW0gICBhZGRyCisKKyAqICAgcmVnaXN0ZXIgYWRkcmVzcyB0byB3cml0ZS4KKyAqCisgKiBAcGFyYW0gICBkYXRhCisgKiAgIGRhdGEgdG8gd3JpdGUuCisgKgorCisgKiBAcGFyYW0gICBzaXplCisgKiAgIHNpemUgdG8gd3JpdGUuCisgKgorICogQHJldHVybgorCisgKiAgIGRhdGEgd3JpdGVuIG9yIEVOT0RFViBlcnJvcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3cml0ZV9jdHJsX21lc3NhZ2Uoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgaW50IGFkZHIsIHZvaWQgKmRhdGEsIGludCBzaXplKQoreworCWludCByZXQ7CisJdm9pZCAqcHRyID0gTlVMTDsKKyNpZmRlZiBERUJVRworCS8qICAgaW50IGk7Ki8KKwkvKiAgIHVuc2lnbmVkIGNoYXIgZHVtcFs1MDBdOyovCisjZW5kaWYKKworCS8qICAgaW5mbygiJXM6IC4gYWRkciA9ICUwNHggc2l6ZT0lZCIsRFJJVkVSX05BTUUsYWRkcixzaXplKTsqLworCisJaWYgKHNpemUgPD0gMCkKKwkJcmV0dXJuIDA7CisKKwlwdHIgPSBrbWVtZHVwKGRhdGEsIHNpemUsIEdGUF9LRVJORUwpOworCWlmICghcHRyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IHVzYl9jb250cm9sX21zZworCQkJKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksIDB4QTAsIDB4NDAsIGFkZHIsIDB4MDAwMSwKKwkJCXB0ciwgc2l6ZSwgMzAwKTsKKwlpZiAocmV0ICE9IHNpemUpIHsKKwkJZXJyKCJGYWlsZWQgdG8gd3JpdGUgQ0lNYVgrIHJlZ2lzdGVyIDB4JTA0eCIsIGFkZHIpOworCQlyZXQgPSAtRU5PREVWOworCX0KKworI2lmZGVmIERFQlVHCisJLyogICBkdW1wWzBdID0wOworCQkgZm9yKGk9MDtpPHNpemU7aSsrKSB7CisJCSBpZigoaSAhPTApICYmICgoaSUxNikgPT0gMCkpIHsKKwkJIGRiZygiY2ltYXgrdXNiOiAlcyIsZHVtcCk7CisJCSBkdW1wWzBdID0wOworCQkgfQorCQkgc3ByaW50ZihkdW1wLCIlcyUwMnggIixkdW1wLCgodW5zaWduZWQgY2hhciAqKXB0cilbaV0pOworCQkgfQorCQkgZGJnKCJjaW1heCt1c2I6ICVzIixkdW1wKTsKKwkgKi8KKyNlbmRpZgorCWtmcmVlKHB0cik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYKKyAqICAgcmVhZCBkYXRhIGZyb20gQ29udHJvbCBlbmRwb2ludC4KKyAqCisKKyAqIEBwYXJhbSAgIGRldgorICogICBQb2ludGVyIHRvIHVzYiBkZXZpY2UuCisgKgorICogQHBhcmFtICAgYWRkcgorICogICBmaXJtd2FyZSBhZGRyZXNzIHRvIHJlYWQuCisKKyAqCisgKiBAcGFyYW0gICBkYXRhCisgKiAgIHBvaW50ZXIgdG8gYnVmZmVyIHRvIGZpbGwgd2l0aCByZWdpc3RlciBkYXRhLgorICoKKworICogQHBhcmFtICAgc2l6ZQorICogICBzaXplIHRvIHJlYWQuCisgKgorICogQHJldHVybgorICogICBkYXRhIHdyaXRlbiBvciBFTk9ERVYgZXJyb3IKKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCByZWFkX2N0cmxfbWVzc2FnZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBpbnQgYWRkciwgdm9pZCAqZGF0YSwgaW50IHNpemUpCit7CisJaW50IHJldDsKKwlyZXQgPSB1c2JfY29udHJvbF9tc2cKKwkJCShkZXYsIHVzYl9yY3ZjdHJscGlwZShkZXYsIDApLCAweEEwLCAweEMwLCBhZGRyLCAweDAwMDEsCisJCQkodm9pZCAqKWRhdGEsIHNpemUsIDMwMCk7CisJaWYgKHJldCAhPSBzaXplKSB7CisJCWVycigiRmFpbGVkIHRvIHJlYWQgQ0lNYVgrIHJlZ2lzdGVyIDB4JTA0eCByZXR1cm4gJWQiLAorCQkJYWRkciwgcmV0KTsKKwkJcmV0ID0gLUVOT0RFVjsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGJyaWVmCisgKiAgIFN0YXJ0IG5ldyBGaXJtd2FyZS4KKyAqCisgKiBAcGFyYW0gICBkZXYKKyAqICAgUG9pbnRlciB0byB1c2IgZGV2aWNlLgorICoKKyAqIEByZXR1cm4KKyAqICAgTm9uZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgaW5pdF9mdyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2KQoreworCWludCBsZW47CisJY2hhciAqYm9vdFN0YXR1cyA9IE5VTEw7CisJYm9vdFN0YXR1cyA9IGttYWxsb2Moc2l6ZW9mKGNoYXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJvb3RTdGF0dXMpIHsKKwkJcHJfZXJyKCIlczogaW5pdF9mdyBrbWFsbG9jIGZhaWxlZFxuIiwKKwkJCQlEUklWRVJfTkFNRSk7CisJCXJldHVybiAwOworCX0KKworCWluZm8oIiVzOiAuIiwgRFJJVkVSX05BTUUpOworCWxlbiA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9yY3ZjdHJscGlwZShkZXYsIDApLAorCQkweEEwLCAweEMwLCAweDAwMDAsIDB4MDAwMCwgYm9vdFN0YXR1cywgMSwgMTAwKTsKKwlpZiAobGVuID09IDEpIHsKKwkJaW5mbygiLS0+IEluaXQgU3RhdHVzID0gJTAyWCIsICpib290U3RhdHVzKTsKKwkJaWYgKGJvb3RTdGF0dXMpCisJCQlrZnJlZShib290U3RhdHVzKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChib290U3RhdHVzKQorCQlrZnJlZShib290U3RhdHVzKTsKKworCXJldHVybiBsZW47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZgorICogICBTdGFydCBuZXcgRmlybXdhcmUuCisgKgorICogQHBhcmFtICAgZGV2CisgKiAgIFBvaW50ZXIgdG8gdXNiIGRldmljZS4KKworICoKKyAqIEByZXR1cm4KKyAqICAgTm9uZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd3JpdGVfZXA2X21lc3NhZ2Uoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwgaW50IHNpemUpCit7CisJaW50IHJldDsKKwl2b2lkICogcHRyID0gTlVMTDsKKwlwdHIgPSBrbWVtZHVwKGRhdGEsIHNpemUsIEdGUF9LRVJORUwpOworCWlmICghcHRyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICh1c2JfYnVsa19tc2coZGV2LCB1c2Jfc25kYnVsa3BpcGUoZGV2LCA2KSwKKwkJCXB0ciwgc2l6ZSwgJnJldCwgMjAwKSA8IDApIHsKKwkJZXJyKCJGYWlsZWQgdG8gd3JpdGUgY21kIDB4JTAyeCIsICgodW5zaWduZWQgY2hhciAqKWRhdGEpWzBdKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwl9CisJa2ZyZWUocHRyKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYKKyAqICAgU3RhcnQgbmV3IEZpcm13YXJlLgorICoKKyAqIEBwYXJhbSAgIGRldgorICogICBQb2ludGVyIHRvIHVzYiBkZXZpY2UuCisgKgorICogQHJldHVybgorICogICBOb25lLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCByZWFkX2VwNV9tZXNzYWdlKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsIGludCBzaXplKQoreworCWludCByZXQ7CisKKwlpZiAodXNiX2ludGVycnVwdF9tc2coZGV2LCB1c2JfcmN2aW50cGlwZShkZXYsIDUpLAorCQkJZGF0YSwgc2l6ZSwgJnJldCwgMjAwKSA8IDApIHsKKwkJZXJyKCJGYWlsZWQgcmVhZCBpbnRlcnJ1cHQgZW5kcG9pbnQiKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwl9CisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIENPTkZJR19DT01QQVQKK3N0YXRpYyBsb25nIGRldmljZV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsCisJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJncykKK3sKKwl1bnNpZ25lZCBsb25nIHJldDsKKworCWFyZ3MgPSAodW5zaWduZWQgbG9uZyljb21wYXRfcHRyKGFyZ3MpOworCXJldCA9IGRldmljZV9pb2N0bChmaWxwLCBjbWQsIGFyZ3MpOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGV2aWNlX2ZvcHMgPSB7CisJLm93bmVyICAgPSBUSElTX01PRFVMRSwKKwkub3BlbiAgICA9IGRldmljZV9vcGVuLAorCS5yZWxlYXNlID0gZGV2aWNlX3JlbGVhc2UsCisJLnVubG9ja2VkX2lvY3RsID0gZGV2aWNlX2lvY3RsLAorCS53cml0ZSAgID0gZGV2aWNlX3dyaXRlLAorCS5yZWFkICAgID0gZGV2aWNlX3JlYWQsCisJLyoKKwkucG9sbCAgICA9IGRldmljZV9wb2xsLAorCSovCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwgPSBkZXZpY2VfY29tcGF0X2lvY3RsLAorI2VuZGlmCit9OworCitzdHJ1Y3QgY2ltYXh1c2JfcHJpdl9vcHNfdCBjaW1heHVzYl9wcml2X29wcyA9IHsKKwkud3JpdGVfY3RybF9tZXNzYWdlICA9IHdyaXRlX2N0cmxfbWVzc2FnZSwKKwkucmVhZF9jdHJsX21lc3NhZ2UgICA9IHJlYWRfY3RybF9tZXNzYWdlLAorCS5pbml0X2Z3ICAgICAgICAgICAgID0gaW5pdF9mdywKKwkud3JpdGVfZXA2X21lc3NhZ2UgICA9IHdyaXRlX2VwNl9tZXNzYWdlLAorCS5yZWFkX2VwNV9tZXNzYWdlICAgID0gcmVhZF9lcDVfbWVzc2FnZQorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfY2xhc3NfZHJpdmVyIGRldmljZV9jbGFzcyA9IHsKKwkubmFtZSA9ICJjaW1heHVzYiVkIiwKKwkuZm9wcyA9ICZkZXZpY2VfZm9wcywKKwkubWlub3JfYmFzZSA9IERFVklDRV9NSU5PUiwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCit2b2lkIGNpbWF4X3VzYl9zZXRfY2Iodm9pZCAqY2IxLCB2b2lkICpjYjIpCit7CisJY2ltYXhfdXNiX2Rldl9hZGQgPSBjYjE7CisJY2ltYXhfdXNiX2Rldl9yZW1vdmUgPSBjYjI7Cit9CitFWFBPUlRfU1lNQk9MKGNpbWF4X3VzYl9zZXRfY2IpOworCitzdGF0aWMgaW50IGRldmljZV9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXN0cnVjdCBkZXZpY2VfcyAqZGV2aWNlOworCWNoYXIgY21kW10gPSB7IDB4MEMsIDB4MDEsIDB4MDAsIDB4MDAgfTsKKwljaGFyICpyc3A7CisKKwlkYmcoInN0YXJ0IHZlbmRvciBpZCAweCV4LCBwcm9kdWN0IGlkIDB4JXgsIERldmljZSBpZCAweCV4IG1pbm9yIDB4JXgiLAorCQkJbGUxNl90b19jcHUodXNiZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKKwkJCWxlMTZfdG9fY3B1KHVzYmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpLAorCQkJbGUxNl90b19jcHUodXNiZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSksCisJCQlpbnRmLT5taW5vcik7CisKKwkvKiAgZGV2aWNlID0gJmdkZXZpY2VbaW50Zi0+bWlub3JdOyovCisJZGV2aWNlID0gJmdkZXZpY2VbZ2RldmljZU51bWJlcl07CisKKwltdXRleF9sb2NrKCZkZXZpY2UtPmxvY2spOworCS8qICBkZXZpY2UtPnVzYmRldiA9IHVzYmRldjsqLworCWRldmljZS0+dXNiZGV2ID0gdXNiX2dldF9kZXYodXNiZGV2KTsKKwlkYmcoImRldmljZS0+dXNiZGV2IDB4JXAiLCAoZGV2aWNlLT51c2JkZXYpKTsKKworCS8qIHNldCBwcml2YXRlIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLworCWRldmljZS0+b3BzID0gJmNpbWF4dXNiX3ByaXZfb3BzOworCisJZGV2aWNlLT5hc2tUb1N1c3BlbmQgPSAwOworCisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBkZXZpY2UpOworCW11dGV4X3VubG9jaygmZGV2aWNlLT5sb2NrKTsKKworCWlmICh1c2JfcmVnaXN0ZXJfZGV2KGludGYsICZkZXZpY2VfY2xhc3MpKSB7CisJCWVycigidXNiX3JlZ2lzdGVyX2RldiIpOworCQl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9IC8qIGlmICovCisKKwkvKiB0ZXN0IGlmIGZpcm13YXJlIGxvYWZpbmcgaXMgbmVlZGVkICovCisjaWZkZWYgRlJCSVQKKwlpZiAoKGxlMTZfdG9fY3B1KHVzYmRldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UpICE9IDApICYmCisJCQkoQ2ltYXhEd25sID09IDEpKSB7CisjZWxzZQorCWlmIChsZTE2X3RvX2NwdSh1c2JkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKSAhPSAwKSB7CisjZW5kaWYKKwkJaW5mbygic3RhcnQgZmlybXdhcmUgZG93bmxvYWQiKTsKKwkJLyogbG9hZCBmaXJtd2FyZSovCisJCWNpbWF4dXNiX2Z3X3VwbG9hZChkZXZpY2UpOworCQlpbmZvKCJlbmQgZmlybXdhcmUgZG93bmxvYWQiKTsKKwl9IGVsc2UgeworCQlpbmZvKCJzZXQgYWx0ZXJuYXRlIHNldHRpbmcgMSIpOworCQlpZiAodXNiX3NldF9pbnRlcmZhY2UoZGV2aWNlLT51c2JkZXYsIDAsIDEpIDwgMCkgeworCQkJZXJyKCJzZXRfaW50ZXJmYWNlIGZhaWxlZCBpbnRmIDAsIGFsdCAxIik7CisJCX0gZWxzZSB7CisJCQlpbmZvKCJjaGVjayBGVyB2ZXJzaW9uIik7CisJCQkvKiBHZXQgQk9PVCB2ZXJzaW9uICovCisJCQlpZiAod3JpdGVfZXA2X21lc3NhZ2UoZGV2aWNlLT51c2JkZXYsCisJCQkJY21kLCBzaXplb2YoY21kKSkgPT0gc2l6ZW9mKGNtZCkpIHsKKwkJCQlyc3AgPSBrY2FsbG9jKDI1NiwKKwkJCQkJc2l6ZW9mKHVuc2lnbmVkIGNoYXIpLAorCQkJCQlHRlBfS0VSTkVMKTsKKwkJCQlpZiAoIXJzcCkgeworCQkJCQllcnIoIm91dCBvZiBtZW1vcnkiKTsKKwkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJfQorCQkJCWlmIChyZWFkX2VwNV9tZXNzYWdlKGRldmljZS0+dXNiZGV2LAorCQkJCQkJcnNwLCAyNTYpID49IDApIHsKKwkJCQkJaW5mbygiPT4gLS0tLSBGLlcuIFZlcnNpb24gLS0tLS0tLSIpOworCQkJCQlpbmZvKCI9Pj0gJTAyWC4lMDJYLiUwMlguJTAyWC4lMDJYJWMiLAorCQkJCQkJcnNwWzRdLCByc3BbNV0sIHJzcFs2XSwKKwkJCQkJCXJzcFs3XSwgcnNwWzhdLCByc3BbOV0pOworCQkJCQlpbmZvKCI9PiBCb290IFZlcnNpb24gPSAlZC4lZCIsCisJCQkJCQlyc3BbMTBdLCByc3BbMTFdKTsKKwkJCQkJaW5mbygiPT4gLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwkJCQl9CisJCQkJa2ZyZWUocnNwKTsKKwkJCX0KKwkJfQorCQlpbmZvKCJzdGFydCBjZmcgZG93bmxvYWQiKTsKKwkJaWYgKGNpbWF4dXNiX2NvbmZpZ3VyYXRpb25fc2V0dGluZyhkZXZpY2UpIDwgMCkKKwkJCWVycigiIEVycm9yIDogc2V0IENJTWFYKyBjb25maWd1cmF0aW9uIik7CisJCWluZm8oImVuZCBjZmcgZG93bmxvYWQiKTsKKworCQlpZiAoY2ltYXhfdXNiX2Rldl9hZGQpCisJCQljaW1heF91c2JfZGV2X2FkZChkZXZpY2UsIGdkZXZpY2VOdW1iZXIpOworCX0KKworCWRiZygiZW5kIik7CisJcmV0dXJuIDA7Cit9IC8qIGRldmljZV9wcm9iZSAqLworCitzdGF0aWMgdm9pZCBkZXZpY2VfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgZGV2aWNlX3MgKmRldmljZSA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJaW50ICAgICAgIGk7CisKKwlkYmcoInN0YXJ0Iik7CisKKwlpZiAoIWRldmljZSkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmZGV2aWNlLT5sb2NrKTsKKwlpZiAoZGV2aWNlLT5vcGVuZWQpIHsKKwkJLyogcmVsZWFzZSBibG9ja2luZyBmdW5jdGlvbnMgKi8KKwkJZGV2aWNlLT5hc2tUb1JlbGVhc2UgPSAxOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldmljZS0+Y2lCdWxrLmNpRGF0YVswXS5hc3luY1dhaXQpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldmljZS0+Y2lCdWxrLmNpRGF0YVsxXS5hc3luY1dhaXQpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldmljZS0+Y2hhbm5lbFswXS5pbldhaXQpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldmljZS0+Y2hhbm5lbFsxXS5pbldhaXQpOworCQlkZXZpY2Vfc3RvcF9pbnRyKGRldmljZSk7CisJCWZvciAoaSA9IDA7IGkgPCBERVZJQ0VfTlVNX0NBTTsgaSsrKSB7CisJCQlpZiAoZGV2aWNlLT51c2VJc29jKSB7CisJCQkJZGV2aWNlX3N0b3BfaXNvX291dChkZXZpY2UsIGkpOworCQkJCWRldmljZV9zdG9wX2lzb19pbihkZXZpY2UsIGkpOworCQkJfSAvKiBpZiAqLworCQkJZWxzZQorCQkJCWRldmljZV9zdG9wX3RzYnVsa19pbihkZXZpY2UsIGkpOworCQl9IC8qIGZvciAqLworCQlkZXZpY2UtPm9wZW5lZCA9IDA7CisKKwkJaWYgKGNpbWF4X3VzYl9kZXZfcmVtb3ZlKQorCQkJY2ltYXhfdXNiX2Rldl9yZW1vdmUoZGV2aWNlLCBnZGV2aWNlTnVtYmVyKTsKKwl9IC8qIGlmICovCisJbXV0ZXhfdW5sb2NrKCZkZXZpY2UtPmxvY2spOworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisJaWYgKGRldmljZSkgeworCQl1c2JfZGVyZWdpc3Rlcl9kZXYoaW50ZiwgJmRldmljZV9jbGFzcyk7CisJCWRldmljZS0+dXNiZGV2ID0gTlVMTDsKKwl9IC8qIGlmICovCisJZGJnKCJlbmQiKTsKK30gLyogZGV2aWNlX2Rpc2Nvbm5lY3QgKi8KKworc3RhdGljIGludCBjaW1heHVzYl9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX3MgKmRldmljZSA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJaW50ICAgICAgIGk7CisKKwlkYmcoInN0YXJ0Iik7CisKKwlpZiAoIWRldmljZSkKKwkJcmV0dXJuIDA7CisKKwltdXRleF9sb2NrKCZkZXZpY2UtPmxvY2spOworCWlmIChkZXZpY2UtPm9wZW5lZCkgeworCQkvKiByZWxlYXNlIGJsb2NraW5nIGZ1bmN0aW9ucyAqLworCQlkZXZpY2UtPmFza1RvU3VzcGVuZCA9IDE7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2aWNlLT5jaUJ1bGsuY2lEYXRhWzBdLmFzeW5jV2FpdCk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2aWNlLT5jaUJ1bGsuY2lEYXRhWzFdLmFzeW5jV2FpdCk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2aWNlLT5jaGFubmVsWzBdLmluV2FpdCk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2aWNlLT5jaGFubmVsWzFdLmluV2FpdCk7CisJCWRldmljZV9zdG9wX2ludHIoZGV2aWNlKTsKKwkJZm9yIChpID0gMDsgaSA8IERFVklDRV9OVU1fQ0FNOyBpKyspIHsKKwkJCWlmIChkZXZpY2UtPnVzZUlzb2MpIHsKKwkJCQlkZXZpY2Vfc3RvcF9pc29fb3V0KGRldmljZSwgaSk7CisJCQkJZGV2aWNlX3N0b3BfaXNvX2luKGRldmljZSwgaSk7CisJCQl9IC8qIGlmICovCisJCQllbHNlCisJCQkJZGV2aWNlX3N0b3BfdHNidWxrX2luKGRldmljZSwgaSk7CisJCX0gLyogZm9yICovCisJCWRldmljZS0+b3BlbmVkID0gMDsKKwl9IC8qIGlmICovCisJbXV0ZXhfdW5sb2NrKCZkZXZpY2UtPmxvY2spOworCWRiZygiZW5kIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaW1heHVzYl9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IGRldmljZV9zICpkZXZpY2UgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJZGJnKCJzdGFydCIpOworCisJaWYgKCFkZXZpY2UpCisJCXJldHVybiAwOworCisJZGV2aWNlLT5hc2tUb1N1c3BlbmQgPSAwOworCWRiZygiZW5kIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBkZXZpY2VfaWRzW10gPSB7CisJeyBVU0JfREVWSUNFKDB4MWIwZCwgMHgyZjAwKSB9LAorCXsgVVNCX0RFVklDRSgweDFiMGQsIDB4MmYwMSkgfSwKKwl7IFVTQl9ERVZJQ0UoMHgxYjBkLCAweDJmMDIpIH0sCisJeyBVU0JfREVWSUNFKDB4MWIwZCwgMHgyZjAzKSB9LAorCXsgVVNCX0RFVklDRSgweDFiMGQsIDB4MmYwNCkgfSwKKwl7IH0gICAgICAgICAgIC8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgZGV2aWNlX2lkcyk7CisKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGRldmljZV9kcml2ZXIgPSB7CisJLm5hbWUgPSAiY2ltYXh1c2IiLAorCS5wcm9iZSA9IGRldmljZV9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IGRldmljZV9kaXNjb25uZWN0LAorCS5zdXNwZW5kID0gIGNpbWF4dXNiX3N1c3BlbmQsCisJLnJlc3VtZSA9IGNpbWF4dXNiX3Jlc3VtZSwKKwkuaWRfdGFibGUgPSBkZXZpY2VfaWRzLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGRldmljZV9pbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXQgPSAwOworCWludCBpLCBqOworCXN0cnVjdCBkZXZpY2VfcyAqZGV2aWNlOworCisJaW5mbygic3RhcnQiKTsKKworCWlmICghZ2RldmljZSkKKwkJZ2RldmljZSA9IGtjYWxsb2MoRFJJVkVSX01BWF9OVU1CRVIsCisJCQlzaXplb2Yoc3RydWN0IGRldmljZV9zKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFnZGV2aWNlKSB7CisJCWVycigibm90IGVub3VnaCBtZW1vcnkiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZm9yIChpID0gMDsgaSA8IERSSVZFUl9NQVhfTlVNQkVSOyBpKyspIHsKKwkJZGV2aWNlID0gJmdkZXZpY2VbaV07CisJCS8qIGluaXRpYWxpemUgc3RydWN0ICovCisJCW1lbXNldChkZXZpY2UsIDAsIHNpemVvZihzdHJ1Y3QgZGV2aWNlX3MpKTsKKwkJbXV0ZXhfaW5pdCgmZGV2aWNlLT5sb2NrKTsKKworCQkvKiBpbml0aWFsaXplIGNpIGJ1bGsgc3RydWN0ICovCisJCWRldmljZS0+Y2lCdWxrLmNvdW50ZXIgPSAxOworCQlzcGluX2xvY2tfaW5pdCgmZGV2aWNlLT5jaUJ1bGsuaW50TG9jayk7CisJCXNwaW5fbG9ja19pbml0KCZkZXZpY2UtPmNpQnVsay5pbnRVcmJMb2NrKTsKKwkJZm9yIChqID0gMDsgaiA8IERFVklDRV9OVU1fQ0FNOyBqKyspIHsKKwkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldmljZS0+Y2lCdWxrLmNpRGF0YVtqXS5zeW5jV2FpdCk7CisJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKAorCQkJCSZkZXZpY2UtPmNpQnVsay5jaURhdGFbal0uYXN5bmNXYWl0KTsKKwkJCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPmNpQnVsay5jaURhdGFbal0uYXN5bmNEYXRhTGlzdCk7CisJCX0gLyogZm9yICovCisKKwkJLyogaW5pdGlhbGl6ZSBjaGFubmVscyAqLworCQlmb3IgKGogPSAwOyBqIDwgREVWSUNFX05VTV9DQU07IGorKykgeworCQkJc3Bpbl9sb2NrX2luaXQoJmRldmljZS0+Y2hhbm5lbFtqXS5pbkxvY2spOworCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2aWNlLT5jaGFubmVsW2pdLmluV2FpdCk7CisJCQl2Yl9pbml0KCZkZXZpY2UtPmNoYW5uZWxbal0uaW5WYik7CisJCQlkZXZpY2UtPmNoYW5uZWxbal0uc3luY09mZnNldCA9IC0xOworCQkJc3Bpbl9sb2NrX2luaXQoJmRldmljZS0+Y2hhbm5lbFtqXS5vdXRMb2NrKTsKKwkJfSAvKiBmb3IgKi8KKwl9IC8qIGZvciAqLworCisJLyogcmVnaXN0ZXIgbWlzYyBkZXZpY2UgKi8KKwlyZXQgPSB1c2JfcmVnaXN0ZXIoJmRldmljZV9kcml2ZXIpOworCisjaWZkZWYgVElNRVNUQU1QCisJSW5pdFRpbWVzdGFtcCgpOworI2VuZGlmCisKKwlpZiAocmV0KQorCQlpbmZvKCJlbmQgZHJpdmVyIHJlZ2lzdGVyIGZhaWxlZCIpOworCWVsc2UKKwkJaW5mbygiZW5kIGRyaXZlciByZWdpc3RlcmVkIik7CisKKwlpbmZvKERSSVZFUl9WRVJTSU9OICI6IiBEUklWRVJfREVTQyk7CisKKwlyZXR1cm4gcmV0OworfSAvKiBkZXZpY2VfaW5pdF9tb2R1bGUgKi8KKworc3RhdGljIHZvaWQgZGV2aWNlX2V4aXRfbW9kdWxlKHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IGRldmljZV9zICpkZXZpY2U7CisKKwlpbmZvKCJzdGFydCIpOworCisjaWZkZWYgVElNRVNUQU1QCisJU2hvd1RpbWVzdGFtcCgpOworI2VuZGlmCisKKwlmb3IgKGkgPSAwOyBpIDwgRFJJVkVSX01BWF9OVU1CRVI7IGkrKykgeworCQlkZXZpY2UgPSAmZ2RldmljZVtpXTsKKwkJZGV2aWNlLT5hc2tUb1JlbGVhc2UgPSAxOworCQkvKiBkZXN0cm95IHN0cnVjdCAqLworCQltdXRleF9kZXN0cm95KCZkZXZpY2UtPmxvY2spOworCX0gLyogZm9yICovCisJdXNiX2RlcmVnaXN0ZXIoJmRldmljZV9kcml2ZXIpOworCWdkZXZpY2VOdW1iZXIgPSAwOworCisJa2ZyZWUoZ2RldmljZSk7CisJZ2RldmljZSA9IE5VTEw7CisJaW5mbygiZW5kIik7Cit9IC8qIGRldmljZV9leGl0X21vZHVsZSAqLworCittb2R1bGVfaW5pdChkZXZpY2VfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZGV2aWNlX2V4aXRfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvdXNiL1NSQy9jaW1heCt1c2ItZHJpdmVyLmggYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L3VzYi9TUkMvY2ltYXgrdXNiLWRyaXZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NGM1MGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L3VzYi9TUkMvY2ltYXgrdXNiLWRyaXZlci5oCkBAIC0wLDAgKzEsMzYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqCisgKiBAZmlsZSAgICBjaW1heCt1c2ItZHJpdmVyLmgKKyAqCisgKiBAYnJpZWYgICBDSU1hWCsgVVNCIERyaXZlciBmb3IgbGludXggYmFzZWQgb3BlcmF0aW5nIHN5c3RlbXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgICAgQnJ1bm8gVG9uZWxsaSAgIDxicnVuby50b25lbGxpQHNtYXJkdHYuY29tPgorICogICAgICAgICAgICAgICAgICAgICAgICAgICYgRnJhbmNrIERlc2NvdXJzIDxmcmFuY2suZGVzY291cnNAc21hcmR0di5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgU21hckRUViBGcmFuY2UsIExhIENpb3RhdAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2lmbmRlZiBDSU1BWFBMVVNfVVNCX0RSSVZFUl9ICisjZGVmaW5lIENJTUFYUExVU19VU0JfRFJJVkVSX0gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW5jbHVkZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERlZmluZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogIEBicmllZgorICogICAgRHJpdmVyIE5hbWUKKyAqLworI2RlZmluZSBEUklWRVJfTkFNRSAgICAgICAgImNpbWF4K3VzYiIKKy8qKgorICogIEBicmllZgorICogICAgQW4gdW5hc3NpZ25lZCBVU0IgbWlub3IuCisgKi8KKyNkZWZpbmUgREVWSUNFX01JTk9SICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAKKworLyoqCisgKiAgQGJyaWVmCisgKiAgICBEcml2ZXIgdmVyc2lvbi4KKyAqLworI2RlZmluZSBERVZJQ0VfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorCisvKioKKyAqICBAYnJpZWYKKyAqICAgIE51bWJlciBvZiBDQSBtb2R1bGUgc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXIuCisgKi8KKyNkZWZpbmUgREVWSUNFX05VTV9DQU0gICAgICAgICAgICAgICAgICAgICAgICAgIDIKKworLyoqCisgKiAgQGJyaWVmCisgKiAgICBCdWZmZXIgbGVuZ3RoLgorICovCisjZGVmaW5lIERFVklDRV9NRVNTQUdFX0xFTkdUSCAgICAgICAgICAgICAgICA0MTAwCisKKy8qIE9mZnNldCAqLworI2RlZmluZSBERVZJQ0VfQ09NTUFORF9PRkZTRVQgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERVZJQ0VfU1RBVFVTX09GRlNFVCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERVZJQ0VfQ09VTlRFUl9PRkZTRVQgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERVZJQ0VfTEVOR1RIX01TQl9PRkZTRVQgICAgICAgICAgICAgICAgMgorI2RlZmluZSBERVZJQ0VfTEVOR1RIX0xTQl9PRkZTRVQgICAgICAgICAgICAgICAgMworI2RlZmluZSBERVZJQ0VfREFUQV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgNAorCisvKiBNYXNrICovCisjZGVmaW5lIERFVklDRV9TRUxfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIERFVklDRV9UWVBfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIERFVklDRV9DTURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDNGCisKKy8qIENvbW1hbmQgdGFnICovCisjZGVmaW5lIERFVklDRV9DTURfSU5JVCAgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIERFVklDRV9DTURfV1JJVEVfUkVHICAgICAgICAgICAgICAgICAweDdGCisjZGVmaW5lIERFVklDRV9DTURfUkVBRF9SRUcgICAgICAgICAgICAgICAgICAweEZGCisjZGVmaW5lIERFVklDRV9DTURfQ0FNUkVTRVQgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIERFVklDRV9DTURfR0VUQ0lTICAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIERFVklDRV9DTURfV1JJVEVDT1IgICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIERFVklDRV9DTURfTkVHT1RJQVRFICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIERFVklDRV9DTURfV1JJVEVMUERVICAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIERFVklDRV9DTURfUkVBRExQRFUgICAgICAgICAgICAgICAgICAweDA2CisjZGVmaW5lIERFVklDRV9DTURfV1JJVEVFWFQgICAgICAgICAgICAgICAgICAweDA3CisjZGVmaW5lIERFVklDRV9DTURfUkVBREVYVCAgICAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIERFVklDRV9DTURfQ0MxUkVTRVQgICAgICAgICAgICAgICAgICAweDA5CisjZGVmaW5lIERFVklDRV9DTURfTUNBUkRfV1JJVEUgICAgICAgICAgICAgICAweDBhCisKKy8qIFN0YXR1cyBmaWVsZCAqLworI2RlZmluZSBERVZJQ0VfQ0FNUkVTRVRPSyAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBERVZJQ0VfQ0lTT0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBERVZJQ0VfV1JJVEVDT1JPSyAgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBERVZJQ0VfTkVHT1RJQVRFT0sgICAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBERVZJQ0VfV1JJVEVMUERVT0sgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBERVZJQ0VfQ0FNREVUICAgICAgICAgICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSBERVZJQ0VfUkVBRExQRFVPSyAgICAgICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBERVZJQ0VfV1JJVEVFWFRPSyAgICAgICAgICAgICAgICAgICAgMHgwNworI2RlZmluZSBERVZJQ0VfUkVBREVYVE9LICAgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBERVZJQ0VfTk9fQ0FNICAgICAgICAgICAgICAgICAgICAgICAgMHgwOQorI2RlZmluZSBERVZJQ0VfTk9LICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYQorI2RlZmluZSBERVZJQ0VfSU5JVE9LICAgICAgICAgICAgICAgICAgICAgICAgMHgwYgorI2RlZmluZSBERVZJQ0VfUkVBRF9SRUdPSyAgICAgICAgICAgICAgICAgICAgMHgwYworI2RlZmluZSBERVZJQ0VfV1JJVEVfUkVHT0sgICAgICAgICAgICAgICAgICAgMHgwZAorI2RlZmluZSBERVZJQ0VfREFUQVJFQURZICAgICAgICAgICAgICAgICAgICAgMHgwZQorI2RlZmluZSBERVZJQ0VfTUNBUkRfV1JJVEVPSyAgICAgICAgICAgICAgICAgMHgwZgorI2RlZmluZSBERVZJQ0VfTUNBUkRfUkVBRCAgICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBERVZJQ0VfQ0FNUEFSU0VfRVJST1IgICAgICAgICAgICAgICAgMHgxMQorI2RlZmluZSBERVZJQ0VfV1JJVEVMUERVQlVTWSAgICAgICAgICAgICAgICAgMHgxNAorI2RlZmluZSBERVZJQ0VfQ01EUEVORElORyAgICAgICAgICAgICAgICAgICAgMHgxNgorI2RlZmluZSBERVZJQ0VfUkVHU1RBVFVTT0sgICAgICAgICAgICAgICAgICAgMHgxNworI2RlZmluZSBERVZJQ0VfR1BJT0NIQU5HRSAgICAgICAgICAgICAgICAgICAgMHgxOAorI2RlZmluZSBERVZJQ0VfRlJCaXQgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQQorCisKKyNkZWZpbmUgREVWSUNFX0RBVEFSRUFEWV9TWU5DICAgICAgICAgICAgICAgIDB4M2UKKworLyoqCisgKiAgQGJyaWVmCisgKiAgICBNUEVHMiB0cmFuc3BvcnQgc2l6ZSwuaXNvY2hyb25vdXMgc2l6ZSBhbmQgbnVtYmVyIG9mIGZyYW1lcyBwZXIgVVJCLgorICovCisjZGVmaW5lIERFVklDRV9NUEVHMl9QQUNLRVRfU0laRSAgICAgICAgICAgICAxODgKKyNkZWZpbmUgREVWSUNFX01QRUcyX1NZTkNfQllURSAgICAgICAgICAgICAgIDB4NDcKKyNkZWZpbmUgREVWSUNFX05VTExfSEVBREVSX1NJWkUgICAgICAgICAgICAgIDgKKyNkZWZpbmUgREVWSUNFX05VTV9GUkFNRVNfUEVSX1VSQiAgICAgICAgICAgIDgKKyNkZWZpbmUgREVWSUNFX0lTT0NfTEVOR1RIKHgpICAgICAgICAgICAgICAgIChERVZJQ0VfTlVNX0ZSQU1FU19QRVJfVVJCKngpCisjZGVmaW5lIERFVklDRV9WQl9MRU5HVEggICAgICAgICAgICAgICAgICAgICA5MDI0MDAKKworLyoqCisgKiAgQGJyaWVmCisgKiAgICBFbmRwb2ludCBhZGRyZXNzLgorICovCisjZGVmaW5lIERFVklDRV9UU19JTl9QSVBFICAgICAgICAgICAgICAgICAgICAgIDEgLyogYW5kIDIgKi8KKyNkZWZpbmUgREVWSUNFX1RTX09VVF9QSVBFICAgICAgICAgICAgICAgICAgICAgMyAvKiBhbmQgNCAqLworI2RlZmluZSBERVZJQ0VfSU5UX0lOX1BJUEUgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIERFVklDRV9CVUxLX09VVF9QSVBFICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgREVWSUNFX0JVTEtfT1VUX01BWFBBQ0tFVCAgICAgICAgICAgIDI1NgorCisvKioKKyAqICBAYnJpZWYKKyAqICAgIE51bWJlciBvZiBpc29jaHJvbm91cy9pbnQgVVJCcyBpbiB0aGUgZHJpdmVyLgorICovCisjZGVmaW5lIERFVklDRV9OVU1fSVNPQ19PVVRfVVJCUyAgICAgICAgICAgICAgICAzCisjZGVmaW5lIERFVklDRV9OVU1fSVNPQ19JTl9VUkJTICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIERFVklDRV9OVU1fSU5UX0lOX1VSQlMgICAgICAgICAgICAgICAgICAyCisKKy8qKgorICogIEBicmllZgorICogICAgaW9jdGwoKSBjYWxscyBkZWZpbml0aW9uLgorICovCisjZGVmaW5lIERFVklDRV9JT0NfTUFHSUMgICAgICAgICdhJworI2RlZmluZSBERVZJQ0VfSU9DX1NFTEVDVF9JTlRGICBfSU9XUihERVZJQ0VfSU9DX01BR0lDLCAgMCwgc2lnbmVkIGxvbmcpCisjZGVmaW5lIERFVklDRV9JT0NfQ0lfV1JJVEUgICAgIF9JT1dSKERFVklDRV9JT0NfTUFHSUMsICAxLCBzdHJ1Y3QgaW9jdGxfZGF0YV9zKQorI2RlZmluZSBERVZJQ0VfSU9DX1VOTE9DS19SRUFEICBfSU9XUihERVZJQ0VfSU9DX01BR0lDLCAgMiwgc2lnbmVkIGxvbmcpCisjZGVmaW5lIERFVklDRV9JT0NfU0VUX0NPTkZJRyAgIF9JT1dSKERFVklDRV9JT0NfTUFHSUMsICAzLCBzdHJ1Y3QgaW9jdGxfZGF0YV9zKQorI2RlZmluZSBERVZJQ0VfSU9DX01BWE5SICAgICAgICA0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFR5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KKworI3VuZGVmIGRiZworI3VuZGVmIGRiZ19pc29jX2luCisjdW5kZWYgZGJnX2lzb2Nfb3V0CisKKyN1bmRlZiBlcnIKKyN1bmRlZiBpbmZvCisjdW5kZWYgd2FybgorCisjZGVmaW5lIERFQlVHCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBkYmcoZm9ybWF0LCBhcmcuLi4pIHByX2RlYnVnKCJjaW1heCt1c2I6ICVzPiAiIGZvcm1hdCAiXG4iICwgXAorCQlfX2Z1bmNfXywgIyMgYXJnKQorI2RlZmluZSBkYmdfcyhmb3JtYXQsIGFyZy4uLilcCisJcHJfZGVidWcoImNpbWF4K3VzYjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKKyNlbHNlCisjZGVmaW5lIGRiZyhmb3JtYXQsIGFyZy4uLikgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGRiZ19zKGZvcm1hdCwgYXJnLi4uKSBkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfSVNPQ19JTgorI2RlZmluZSBkYmdfaXNvY19pbihmb3JtYXQsIGFyZy4uLilcCisJcHJfZGVidWcoImNpbWF4K3VzYjogJXM+ICIgZm9ybWF0ICJcbiIgLCBcCisJCQlfX2Z1bmNfXywgIyMgYXJnKQorI2Vsc2UKKyNkZWZpbmUgZGJnX2lzb2NfaW4oZm9ybWF0LCBhcmcuLi4pIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZmRlZiBERUJVR19JU09DX09VVAorI2RlZmluZSBkYmdfaXNvY19vdXQoZm9ybWF0LCBhcmcuLi4pXAorCXByX2RlYnVnKCJjaW1heCt1c2I6ICVzPiAiIGZvcm1hdCAiXG4iICwgXAorCQkJX19mdW5jX18sICMjIGFyZykKKyNlbHNlCisjZGVmaW5lIGRiZ19pc29jX291dChmb3JtYXQsIGFyZy4uLikgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSBlcnIoZm9ybWF0LCBhcmcuLi4pXAorCXByX2VycigiY2ltYXgrdXNiOiAlcz4gRVJST1IgIiBmb3JtYXQgIlxuIiAsIFwKKwkJCV9fZnVuY19fLCAjIyBhcmcpCisjZGVmaW5lIGluZm8oZm9ybWF0LCBhcmcuLi4pXAorCXByX2luZm8oImNpbWF4K3VzYjogJXM+ICIgZm9ybWF0ICJcbiIgLCBcCisJCQlfX2Z1bmNfXywgIyMgYXJnKQorI2RlZmluZSB3YXJuKGZvcm1hdCwgYXJnLi4uKVwKKwlwcl93YXJuKCJjaW1heCt1c2I6ICVzPiBXQVJOIiBmb3JtYXQgIlxuIiAsIFwKKwkJCV9fZnVuY19fLCAjIyBhcmcpCisKKy8qKgorICogIEBicmllZgorICogICAgVmlkZW8gYnVmZmVyIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IHZpZGVvX2J1Zl9zIHsKKwlfX3U4IGRhdGFbREVWSUNFX1ZCX0xFTkdUSF07CisJaW50ICByZWFkT2Zmc2V0OworCWludCAgd3JpdGVPZmZzZXQ7CisJaW50ICBpc0VtcHR5OworfTsKKyNlbmRpZgorCisvKioKKyAqICBAYnJpZWYKKyAqICAgIElvIGNvbnRyb2wgZGF0YSBzdHJ1Y3R1cmUgZXhjaGFuZ2VkIGJldHdlZW4gdXNlciBhbmQga2VybmVsIHNwYWNlLgorICovCitzdHJ1Y3QgaW9jdGxfZGF0YV9zIHsKKwlfX3U4ICAqdHhEYXRhOworCV9fdTMyIHR4U2l6ZTsKKwlfX3U4ICAqcnhEYXRhOworCV9fdTMyIHJ4U2l6ZTsKK307CisKKy8qKgorICogIEBicmllZgorICogICAgUmVhZC93cml0ZSB0eXBlIGV4Y2hhbmdlZCBiZXR3ZWVuIHVzZXIgYW5kIGtlcm5lbCBzcGFjZS4KKyAqLworZW51bSByd190eXBlX2UgeworCURFVklDRV9UWVBFX0NJX1JFQUQsCisJREVWSUNFX1RZUEVfVFNfV1JJVEUsCisJREVWSUNFX1RZUEVfVFNfUkVBRAorfTsKKworLyoqCisgKiAgQGJyaWVmCisgKiAgICBSZWFkL3dyaXRlIGRhdGEgc3RydWN0dXJlIGV4Y2hhbmdlZCBiZXR3ZWVuIHVzZXIgYW5kIGtlcm5lbCBzcGFjZS4KKyAqLworc3RydWN0IHJ3X2RhdGFfcyB7CisJZW51bSByd190eXBlX2UgdHlwZTsKKwlfX3U4ICAgICAgbW9kdWxlSWQ7CisJX191OCAgICAgICpkYXRhOworCV9fdTMyICAgICBzaXplOworCV9fdTMyICAgICBjb3BpZWRTaXplOworfTsKKyNpZmRlZiBfX0tFUk5FTF9fCisvKioKKyAqICBAYnJpZWYKKyAqICAgIE1lc3NhZ2Ugbm9kZSBzdHJ1Y3R1cmUuIENhbiBiZSBpbnNlcnRlZCBpbiBhIGxpc3QuCisgKi8KK3N0cnVjdCBtZXNzYWdlX25vZGVfcyB7CisJX191OCAgICAgICAgICAgICAgZGF0YVtERVZJQ0VfTUVTU0FHRV9MRU5HVEhdOworCV9fdTMyICAgICAgICAgICAgIHNpemU7CisJc3RydWN0IGxpc3RfaGVhZCAgbm9kZTsKK307CisKKy8qKgorICogIEBicmllZgorICogICAgUmVjZWl2ZWQgQ0kgZGF0YS4KKyAqLworc3RydWN0IGNpX3J4X2RhdGFfcyB7CisJd2FpdF9xdWV1ZV9oZWFkX3QgIHN5bmNXYWl0OworCV9fdTggICAgICAgICAgICAgICBzeW5jU2lnbmFsOworCV9fdTggICAgICAgICAgICAgICBzeW5jRGF0YVtERVZJQ0VfTUVTU0FHRV9MRU5HVEhdOworCV9fdTMyICAgICAgICAgICAgICBzeW5jRGF0YVNpemU7CisJd2FpdF9xdWV1ZV9oZWFkX3QgIGFzeW5jV2FpdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgYXN5bmNEYXRhTGlzdDsKKwlfX3U4ICAgICAgICAgICAgICAgYlBlbmRpbmdTZW5kOworfTsKKworLyoqCisgKiAgQGJyaWVmCisgKiAgICBDSSBidWxrIGNoYW5uZWwuCisgKi8KK3N0cnVjdCBjaV9idWxrX3MgeworCV9fdTggICAgICAgICAgICAgICBjb3VudGVyOworCV9fdTE2ICAgICAgICAgICAgICBpbk1heFBhY2tldFNpemU7CisJX191MTYgICAgICAgICAgICAgIG91dE1heFBhY2tldFNpemU7CisJc3RydWN0IHVyYiAgICAgICAgICppbnRVcmJbREVWSUNFX05VTV9JTlRfSU5fVVJCU107CisJc3BpbmxvY2tfdCAgICAgICAgIGludExvY2s7CisJc3BpbmxvY2tfdCAgICAgICAgIGludFVyYkxvY2s7CisJX191OCAgICAgICAgICAgICAgIGludEN1cnJTdGF0dXM7CisJX191OCAgICAgICAgICAgICAgIGludEN1cnJJbmRleDsKKwlfX3UxNiAgICAgICAgICAgICAgaW50U2l6ZVRvUmVjZWl2ZTsKKwlzdHJ1Y3QgY2lfcnhfZGF0YV9zICAgICAgIGNpRGF0YVtERVZJQ0VfTlVNX0NBTV07Cit9OworCisvKioKKyAqICBAYnJpZWYKKyAqICAgIFRTIGNoYW5uZWwgKGNhbiB1c2UgaXNvYyBvciBidWxrIGludGVyZmFjZSkuCisgKiB4CisgKi8KK3N0cnVjdCB0c19jaGFubmVsX3MgeworCXNwaW5sb2NrX3QgICAgICAgIGluTG9jazsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBpbldhaXQ7CisJc3RydWN0IHZpZGVvX2J1Zl9zICAgICAgIGluVmI7CisJaW50ICAgICAgICAgICAgICAgc3luY09mZnNldDsKKwlpbnQgICAgICAgICAgICAgICBwcmV2T2Zmc2V0OworCV9fdTggICAgICAgICAgICAgIGxhc3RQYWNrZXRbREVWSUNFX01QRUcyX1BBQ0tFVF9TSVpFXTsKKwlfX3U4ICAgICAgICAgICAgICBsYXN0UGFja2V0U2l6ZTsKKwlzcGlubG9ja190ICAgICAgICBvdXRMb2NrOworCV9fdTggICAgICAgICAgICAgIG5leHRGcmVlT3V0VXJiSW5kZXg7CisJYXRvbWljX3QgICAgICAgICAgbnVtT3V0VXJiczsKKwlfX3U4ICAgICAgICAgICAgICBvdXRTdG9wOworCV9fdTE2ICAgICAgICAgICAgIG1heFBhY2tldFNpemU7CisJLyogaXNvY2hyb25vdXMgdXJicyAqLworCXN0cnVjdCB1cmIgICAgICAgICppc29jSW5VcmJbREVWSUNFX05VTV9JU09DX0lOX1VSQlNdOworCXN0cnVjdCB1cmIgICAgICAgICppc29jT3V0VXJiW0RFVklDRV9OVU1fSVNPQ19PVVRfVVJCU107CisJLyogYnVsayB1cmJzICovCisJc3RydWN0IHVyYiAgICAgICAqYnVsa0luVXJiOworCWludCAgICAgICAgICAgICAgbmJCeXRlU2VuZDsKKwlpbnQgICAgICAgICAgICAgIG5iQnl0ZVJlYWQ7CisJX191OCAgICAgICAgICAgICBGaXJzdFRyYW5zZmVyOworCisjaWZkZWYgREVCVUdfQklUUkFURQorCWt0aW1lX3QgYml0cmF0ZVRpbWUKKyNlbmRpZgorfTsKKworc3RydWN0IGRldmljZV9zIHsKKwlzdHJ1Y3QgbXV0ZXggICAgICAgbG9jazsKKwlzdHJ1Y3QgdXNiX2RldmljZSAgKnVzYmRldjsKKwlfX3U4ICAgICAgICAgICAgICAgb3BlbmVkOworCV9fdTggICAgICAgICAgICAgICBhc2tUb1JlbGVhc2U7CisJX191OCAgICAgICAgICAgICAgIGFza1RvU3VzcGVuZDsKKwlzdHJ1Y3QgY2lfYnVsa19zICAgICAgICAgIGNpQnVsazsKKwlfX3U4ICAgICAgICAgICAgICAgdXNlSXNvYzsKKwlzdHJ1Y3QgdHNfY2hhbm5lbF9zICAgICAgIGNoYW5uZWxbREVWSUNFX05VTV9DQU1dOworCS8qIGJ1cyBhZGFwdGVyIHByaXZhdGUgb3BzIGNhbGxiYWNrICovCisJc3RydWN0IGNpbWF4dXNiX3ByaXZfb3BzX3QgKm9wczsKKwlpbnQgICAgICAgICAgICAgICAgcmVmOworfTsKKworc3RydWN0IGJ1bGtfdGltZXJfcyB7CisJc3RydWN0IGRldmljZV9zICpkZXZpY2U7CisJX191OCAgICAgIGluZGV4OworCXN0cnVjdCB0aW1lcl9saXN0IFN0YXJ0QnVsa1JlYWRUaW1lcjsKK307CisKK2ludCBjaW1heF91c2Jfc2VsZWN0X2ludGVyZmFjZShzdHJ1Y3QgZGV2aWNlX3MgKmRldmljZSwgdW5zaWduZWQgbG9uZyBpbnRmKTsKK2ludCBjaW1heF91c2JfY2lfd3JpdGUoc3RydWN0IGRldmljZV9zICpkZXZpY2UsCisJCXU4ICp0eERhdGEsIGludCB0eFNpemUsIHU4ICpyeERhdGEsIGludCByeFNpemUpOworaW50IGNpbWF4X3VzYl9jaV9yZWFkX2V2dChzdHJ1Y3QgZGV2aWNlX3MgKmRldmljZSwKKwkJaW50IG1vZHVsZUlkLCB1OCAqYnVmLCBpbnQgc2l6ZSk7CisKK2ludCBjaW1heF91c2JfZGV2aWNlX3VubG9ja19yZWFkKHN0cnVjdCBkZXZpY2VfcyAqZGV2aWNlKTsKK2ludCBjaW1heF91c2JfZGV2aWNlX29wZW4oc3RydWN0IGRldmljZV9zICpkZXZpY2UpOworaW50IGNpbWF4X3VzYl9kZXZpY2VfY2xvc2Uoc3RydWN0IGRldmljZV9zICpkZXZpY2UpOwordm9pZCBjaW1heF91c2Jfc2V0X2NiKHZvaWQgKmNiMSwgdm9pZCAqY2IyKTsKKworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC91c2IvU1JDL2NpbWF4K3VzYl9jb25maWcuYyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvdXNiL1NSQy9jaW1heCt1c2JfY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ2OWI4NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvdXNiL1NSQy9jaW1heCt1c2JfY29uZmlnLmMKQEAgLTAsMCArMSw2ODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioKKyAqIEBmaWxlICAgIGNpbWF4K3VzYl9jb25maWcuYworICoKKyAqIEBicmllZiAgIENJTWFYKyBVU0IgRHJpdmVyIGZvciBsaW51eCBiYXNlZCBvcGVyYXRpbmcgc3lzdGVtcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMSAgICBCcnVubyBUb25lbGxpICAgPGJydW5vLnRvbmVsbGlAc21hcmR0di5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgJiBGcmFuY2sgRGVzY291cnMgPGZyYW5jay5kZXNjb3Vyc0BzbWFyZHR2LmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBTbWFyRFRWIEZyYW5jZSwgTGEgQ2lvdGF0CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbmNsdWRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorCisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisKKyNpbmNsdWRlICJjaW1heCt1c2ItZHJpdmVyLmgiCisjaW5jbHVkZSAiY2ltYXgrdXNiX2NvbmZpZy5oIgorI2luY2x1ZGUgImJvZHlkZWYuaCIKKworI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisKKyNkZWZpbmUgREVCVUcKKyNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU3RydWN0dXJlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdsb2JhbHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjaGFyICpjaW1heF9jb25maWdfZmlsZVs0XSA9IHsKKwkiY2ltYXgrdXNiLmNmZyIsCisJImNpbWF4K3VzYl92Y2MwLmNmZyIsCisJImNpbWF4K3VzYl92Y2MzLmNmZyIsCisJImNpbWF4K3VzYl92Y2M1LmNmZyIKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZgorICogICBzZXQgQ0lNYVgrIHJlZ2lzdGVyIHZhbHVlLgorICoKKyAqIEBwYXJhbSAgIGJ1c19hZGFwCisgKiAgIFBvaW50ZXIgdG8gQ0lNYVgrIHVzYiBhZGFwdGVyLgorICoKKyAqIEBwYXJhbSAgIGFkZHIKKyAqICAgQWRkciBvZiBDSU1hWCsgcmVnaXN0ZXIuCisgKgorICogQHBhcmFtICAgdmFsCisgKiAgIENJTWFYKyByZWdpc3RlciB2YWx1ZSB0byBzZXQuCisgKgorICogQHJldHVybgorICogICAwIGlmIE9LIG90aGVyd2lzZSAtMS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgdXNiX3NldGJ5dGUoc3RydWN0IGRldmljZV9zICpidXNfYWRhcCwgdW5zaWduZWQgaW50IGFkZHIsIHVuc2lnbmVkIGNoYXIgdmFsKQoreworCXVuc2lnbmVkIGNoYXIgY21kWzVdOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwlpbnQgbGVuOworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBidXNfYWRhcC0+dXNiZGV2OworCisJY21kWzBdID0gMHg3RjsKKwljbWRbMV0gPSAodW5zaWduZWQgY2hhcikoKGFkZHI+PjgpJjB4ZmYpOworCWNtZFsyXSA9ICh1bnNpZ25lZCBjaGFyKShhZGRyJjB4ZmYpOworCWNtZFszXSA9IDB4MDE7CisJY21kWzRdID0gdmFsOworCWlmIChidXNfYWRhcC0+b3BzLT53cml0ZV9lcDZfbWVzc2FnZShkZXYsIGNtZCwgc2l6ZW9mKGNtZCkpCisJCT09IHNpemVvZihjbWQpKSB7CisJCS8qcHJfZGVidWcoIiVzLSVzOiBjbWQ9MHgleFxuIiwKKwkJCURSSVZFUl9OQU1FLCBfX2Z1bmNfXyxjbWRbMF0pOyovCisJCWJ1ZiA9IGtjYWxsb2MoMjU2LCBzaXplb2YodW5zaWduZWQgY2hhciksIEdGUF9LRVJORUwpOworCQlpZiAoIWJ1ZikgeworCQkJcHJfZXJyKCIlcy0lczogb3V0IG9mIG1lbW9yeS5cbiIsCisJCQkJRFJJVkVSX05BTUUsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJd2hpbGUgKChsZW4gPSBidXNfYWRhcC0+b3BzLT5yZWFkX2VwNV9tZXNzYWdlKGRldiwgYnVmLCAyNTYpKQorCQkJCT49IDApIHsKKwkJCWlmIChsZW4gPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCWlmICgobGVuID09IDUpICYmICgoYnVmWzBdICYgMHg3ZikgPT0gMHg0NSkpCisJCQkJY29udGludWU7CisJCQlpZiAobGVuIDwgNCkgeworCQkJCXByX2VycigiJXMtJXM6IGZhaWxlZCB0byByZWFkIGFkZHIgMHgleFxuIiwKKwkJCQkJRFJJVkVSX05BTUUsIF9fZnVuY19fLCBhZGRyKTsKKwkJCQlrZnJlZShidWYpOworCQkJCXJldHVybiAtMTsKKwkJCX0gZWxzZSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzLSVzOiBmYWlsZWQgdG8gd3JpdGUgYWRkciAweCV4XG4iLAorCQkJRFJJVkVSX05BTUUsIF9fZnVuY19fLCBhZGRyKTsKKwkJcmV0dXJuIC0xOworCX0KKwlrZnJlZShidWYpOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYKKyAqICAgZ2V0IENJTWFYKyByZWdpc3RlciB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gICBidXNfYWRhcAorICogICBQb2ludGVyIHRvIENJTWFYKyB1c2IgYWRhcHRlci4KKyAqCisgKiBAcGFyYW0gICBhZGRyCisgKiAgIEFkZHIgb2YgQ0lNYVgrIHJlZ2lzdGVyLgorICoKKyAqIEBwYXJhbSAgIHZhbAorICogICBwb2ludGVyIHRvIGJ1ZmZlciB0byBzdG9yZSBDSU1hWCsgcmVnaXN0ZXIgdmFsdWUuCisgKgorICogQHJldHVybgorICogICAwIGlmIE9LIG90aGVyd2lzZSAtMS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgdXNiX2dldGJ5dGUoc3RydWN0IGRldmljZV9zICpidXNfYWRhcCwKKwl1bnNpZ25lZCBpbnQgYWRkciwgdW5zaWduZWQgY2hhciAqdmFsKQoreworCXVuc2lnbmVkIGNoYXIgY21kWzRdOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwlpbnQgbGVuOworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBidXNfYWRhcC0+dXNiZGV2OworCisJY21kWzBdID0gMHhGRjsKKwljbWRbMV0gPSAodW5zaWduZWQgY2hhcikoKGFkZHI+PjgpJjB4ZmYpOworCWNtZFsyXSA9ICh1bnNpZ25lZCBjaGFyKShhZGRyJjB4ZmYpOworCWNtZFszXSA9IDB4MDE7CisJaWYgKGJ1c19hZGFwLT5vcHMtPndyaXRlX2VwNl9tZXNzYWdlKGRldiwgY21kLCBzaXplb2YoY21kKSkKKwkJCT09IHNpemVvZihjbWQpKSB7CisJCS8qcHJfZGVidWcoIiVzLSVzOiBjbWQ9MHgleFxuIiwKKwkJCURSSVZFUl9OQU1FLCBfX2Z1bmNfXyxjbWRbMF0pOyovCisJCWJ1ZiA9IGtjYWxsb2MoMjU2LCBzaXplb2YodW5zaWduZWQgY2hhciksIEdGUF9LRVJORUwpOworCQlpZiAoIWJ1ZikgeworCQkJcHJfZXJyKCIlcy0lczogb3V0IG9mIG1lbW9yeS5cbiIsCisJCQkJRFJJVkVSX05BTUUsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJd2hpbGUgKChsZW4gPSBidXNfYWRhcC0+b3BzLT5yZWFkX2VwNV9tZXNzYWdlKGRldiwgYnVmLCAyNTYpKQorCQkJCT49IDApIHsKKwkJCWlmIChsZW4gPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCS8qcHJfZGVidWcoIiVzLSVzOiAweCV4XG4iLAorCQkJCURSSVZFUl9OQU1FLCBfX2Z1bmNfXyxidWZbMF0pOyovCisJCQlpZiAoKGxlbiA9PSA1KSAmJiAoKGJ1ZlswXSAmIDB4N2YpID09IDB4NDUpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGxlbiA+PSA1KSB7CisJCQkJKnZhbCA9IGJ1Zls0XTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJcHJfZXJyKCIlcy0lczogZmFpbGVkIHRvIHJlYWQgYWRkciAweCV4XG4iLAorCQkJCQlEUklWRVJfTkFNRSwgX19mdW5jX18sIGFkZHIpOworCQkJCWtmcmVlKGJ1Zik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlcy0lczogZmFpbGVkIHRvIHJlYWQgYWRkciAweCV4XG4iLAorCQkJRFJJVkVSX05BTUUsIF9fZnVuY19fLCBhZGRyKTsKKwkJcmV0dXJuIC0xOworCX0KKwlrZnJlZShidWYpOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYKKyAqICAgY29tcHV0ZSBhIGxvZ2ljYWwgT3IgYmV0d2VlbiBDSU1hWCsgcmVnaXN0ZXIgdmFsdWUgYW5kIGEgcGFyYW0gdmFsdWUuCisgKgorICogQHBhcmFtICAgYnVzX2FkYXAKKyAqICAgUG9pbnRlciB0byBDSU1hWCsgdXNiIGFkYXB0ZXIuCisgKgorICogQHBhcmFtICAgYWRkcgorICogICBBZGRyIG9mIENJTWFYKyByZWdpc3Rlci4KKyAqCisgKiBAcGFyYW0gICB2YWwKKyAqICAgdmFsdWUgdG8gY29tcHV0ZS4KKyAqCisgKiBAcGFyYW0gICBwdmFsCisgKiAgIHBvaW50ZXIgdG8gYnVmZmVyIHRvIHN0b3JlIENJTWFYKyByZWdpc3RlciB2YWx1ZS4KKyAqCisgKiBAcmV0dXJuCisgKiAgIDAgaWYgT0sgb3RoZXJ3aXNlIC0xLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBzZXRMb2dpY2FsT3Ioc3RydWN0IGRldmljZV9zICpidXNfYWRhcCwKKwkJdW5zaWduZWQgaW50IGFkZHIsIHVuc2lnbmVkIGNoYXIgdmFsLCB1bnNpZ25lZCBjaGFyICpwdmFsKQoreworCSpwdmFsIHw9IHZhbDsKKworCWlmICh1c2Jfc2V0Ynl0ZShidXNfYWRhcCwgYWRkciwgKnB2YWwpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKHVzYl9nZXRieXRlKGJ1c19hZGFwLCBhZGRyLCBwdmFsKSA8IDApCisJCXJldHVybiAtMTsKKworCWRiZygiPT4gTG9naWNhbCBPUiBbJTAyWF0gPT4gJTAyWFxuIiwgdmFsLCAqcHZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGJyaWVmCisgKiAgIGNvbXB1dGUgYSBsb2dpY2FsIEFuZCBiZXR3ZWVuIENJTWFYKyByZWdpc3RlciB2YWx1ZSBhbmQgYSBwYXJhbSB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gICBidXNfYWRhcAorICogICBQb2ludGVyIHRvIENJTWFYKyB1c2IgYWRhcHRlci4KKyAqCisgKiBAcGFyYW0gICBhZGRyCisgKiAgIEFkZHIgb2YgQ0lNYVgrIHJlZ2lzdGVyLgorICoKKyAqIEBwYXJhbSAgIHZhbAorICogICB2YWx1ZSB0byBjb21wdXRlLgorICoKKyAqIEBwYXJhbSAgIHB2YWwKKyAqICAgcG9pbnRlciB0byBidWZmZXIgdG8gc3RvcmUgQ0lNYVgrIHJlZ2lzdGVyIHZhbHVlLgorICoKKyAqIEByZXR1cm4KKyAqICAgMCBpZiBPSyBvdGhlcndpc2UgLTEuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHNldExvZ2ljYWxBbmQoc3RydWN0IGRldmljZV9zICpidXNfYWRhcCwKKwkJdW5zaWduZWQgaW50IGFkZHIsIHVuc2lnbmVkIGNoYXIgdmFsLCB1bnNpZ25lZCBjaGFyICpwdmFsKQoreworCSpwdmFsICY9IHZhbDsKKworCWlmICh1c2Jfc2V0Ynl0ZShidXNfYWRhcCwgYWRkciwgKnB2YWwpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKHVzYl9nZXRieXRlKGJ1c19hZGFwLCBhZGRyLCBwdmFsKSA8IDApCisJCXJldHVybiAtMTsKKworCWRiZygiPT4gTG9naWNhbCBBTkQgWyUwMlhdID0+ICUwMlhcbiIsIHZhbCwgKnB2YWwpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZgorICogICB3YWl0IENJTWFYKyByZWdpc3RlciB2YWx1ZSBtYXRjaCBhIHBhcmFtIHZhbHVlLgorICoKKyAqIEBwYXJhbSAgIGJ1c19hZGFwCisgKiAgIFBvaW50ZXIgdG8gQ0lNYVgrIHVzYiBhZGFwdGVyLgorICoKKyAqIEBwYXJhbSAgIGFkZHIKKyAqICAgQWRkciBvZiBDSU1hWCsgcmVnaXN0ZXIuCisgKgorICogQHBhcmFtICAgdmFsCisgKiAgIHZhbHVlIHRvIG1hdGNoLgorICoKKyAqIEBwYXJhbSAgIHB2YWwKKyAqICAgcG9pbnRlciB0byBidWZmZXIgdG8gc3RvcmUgQ0lNYVgrIHJlZ2lzdGVyIHZhbHVlLgorICoKKyAqIEByZXR1cm4KKyAqICAgMCBpZiBPSyBvdGhlcndpc2UgLTEuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdhaXRGb3JWYWx1ZShzdHJ1Y3QgZGV2aWNlX3MgKmJ1c19hZGFwLAorCQl1bnNpZ25lZCBpbnQgYWRkciwgdW5zaWduZWQgY2hhciB2YWwsIHVuc2lnbmVkIGNoYXIgKnB2YWwpCit7CisJZGJnKCI9PiBXYWl0IGZvciBWYWx1ZSBbJTAyWF1cbiIsIHZhbCk7CisJaWYgKCpwdmFsID09IHZhbCkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoMSkgeworCQlpZiAodXNiX2dldGJ5dGUoYnVzX2FkYXAsIGFkZHIsIHB2YWwpIDwgMCkKKwkJCXJldHVybiAtMTsKKworCQlkYmcoIlxyID0+ICUwMlgiLCAqcHZhbCk7CisKKwkJaWYgKCpwdmFsID09IHZhbCkKKwkJCWJyZWFrOworCX0KKworCWRiZygiXG4iKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYKKyAqICAgd2FpdCBDSU1hWCsgcmVnaXN0ZXIgYml0cyBtYXRjaCBhIHBhcmFtIHZhbHVlLgorICoKKyAqIEBwYXJhbSAgIGJ1c19hZGFwCisgKiAgIFBvaW50ZXIgdG8gQ0lNYVgrIHVzYiBhZGFwdGVyLgorICoKKyAqIEBwYXJhbSAgIGFkZHIKKyAqICAgQWRkciBvZiBDSU1hWCsgcmVnaXN0ZXIuCisgKgorICogQHBhcmFtICAgdmFsCisgKiAgIHZhbHVlIHRvIG1hdGNoLgorICoKKyAqIEBwYXJhbSAgIHB2YWwKKyAqICAgcG9pbnRlciB0byBidWZmZXIgdG8gc3RvcmUgQ0lNYVgrIHJlZ2lzdGVyIHZhbHVlLgorICoKKyAqIEByZXR1cm4KKyAqICAgMCBpZiBPSyBvdGhlcndpc2UgLTEuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdhaXRGb3JCaXRzU2V0KHN0cnVjdCBkZXZpY2VfcyAqYnVzX2FkYXAsCisJCXVuc2lnbmVkIGludCBhZGRyLCB1bnNpZ25lZCBjaGFyIHZhbCwgdW5zaWduZWQgY2hhciAqcHZhbCkKK3sKKwlkYmcoIj0+IFdhaXQgZm9yIEJpdHMgc2V0IFslMDJYXVxuIiwgdmFsKTsKKwlpZiAoKCpwdmFsICYgdmFsKSA9PSB2YWwpCisJCXJldHVybiAwOworCisJd2hpbGUgKDEpIHsKKwkJaWYgKHVzYl9nZXRieXRlKGJ1c19hZGFwLCBhZGRyLCBwdmFsKSA8IDApCisJCQlyZXR1cm4gLTE7CisKKwkJZGJnKCJcciA9PiAlMDJYIiwgKnB2YWwpOworCisJCWlmICgoKnB2YWwgJiB2YWwpID09IHZhbCkKKwkJCWJyZWFrOworCX0KKworCWRiZygiXG4iKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYKKyAqICAgd2FpdCBDSU1hWCsgcmVnaXN0ZXIgYml0cyBjbGVhcmVkLgorICoKKyAqIEBwYXJhbSAgIGJ1c19hZGFwCisgKiAgIFBvaW50ZXIgdG8gQ0lNYVgrIHVzYiBhZGFwdGVyLgorICoKKyAqIEBwYXJhbSAgIGFkZHIKKyAqICAgQWRkciBvZiBDSU1hWCsgcmVnaXN0ZXIuCisgKgorICogQHBhcmFtICAgdmFsCisgKiAgIGJpdHMgdG8gY2hlY2suCisgKgorICogQHBhcmFtICAgcHZhbAorICogICBwb2ludGVyIHRvIGJ1ZmZlciB0byBzdG9yZSBDSU1hWCsgcmVnaXN0ZXIgdmFsdWUuCisgKgorICogQHJldHVybgorICogICAwIGlmIE9LIG90aGVyd2lzZSAtMS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2FpdEZvckJpdHNDbGVhcmVkKHN0cnVjdCBkZXZpY2VfcyAqYnVzX2FkYXAsCisJCXVuc2lnbmVkIGludCBhZGRyLCB1bnNpZ25lZCBjaGFyIHZhbCwgdW5zaWduZWQgY2hhciAqcHZhbCkKK3sKKwlkYmcoIj0+IFdhaXQgZm9yIEJpdHMgY2xlYXJlZCBbJTAyWF1cbiIsIHZhbCk7CisJaWYgKCgqcHZhbCAmIHZhbCkgPT0gMHgwMCkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoMSkgeworCQlpZiAodXNiX2dldGJ5dGUoYnVzX2FkYXAsIGFkZHIsIHB2YWwpIDwgMCkKKwkJCXJldHVybiAtMTsKKworCQlkYmcoIlxyID0+ICUwMlgiLCAqcHZhbCk7CisKKwkJaWYgKCgqcHZhbCAmIHZhbCkgPT0gMHgwMCkKKwkJCWJyZWFrOworCX0KKworCWRiZygiXG4iKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYKKyAqICAgcmV0cmVpdmUgYWRkciBvZiBDSU1hWCsgcmVnaXN0ZXIuCisgKgorICogQHBhcmFtICAgZGV2CisgKiAgIFBvaW50ZXIgdG8gQ0lNYVgrIHJlZ2lzdGVyIE5hbWUuCisgKgorICogQHJldHVybgorICogICBBZGRyZXNzIG9mIENJTWFYKyByZWdpc3Rlci4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBjaW1heHVzYl9ydHJfcmVnX2FkZHIoY2hhciAqc3RyX2FkZHIpCit7CisJaW50IGkzMk5iSXRlbSA9IHNpemVvZihjaW1heF9yZWdfbWFwKSAvIHNpemVvZihzdHJ1Y3QgcmVnX3MpOworCWludCBpMzJpbmRleDsKKwlpbnQgaTMyVmFsQWRkciA9IC0xOworCisJZm9yIChpMzJpbmRleCA9IDA7IGkzMmluZGV4IDwgaTMyTmJJdGVtOyBpMzJpbmRleCsrKSB7CisJCWlmIChzdHJjbXAoc3RyX2FkZHIsIGNpbWF4X3JlZ19tYXBbaTMyaW5kZXhdLlJlZ2lzdGVyTmFtZSkKKwkJCQk9PSAwKSB7CisJCQlpMzJWYWxBZGRyID0gY2ltYXhfcmVnX21hcFtpMzJpbmRleF0uUmVnQWRkcjsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBpMzJWYWxBZGRyOworfQorCitzdGF0aWMgaW50IGNpbWF4dXNiX3BhcnNlX2NmZ19vcHMoc3RydWN0IGRldmljZV9zICpidXNfYWRhcCwKKwkJdW5zaWduZWQgY2hhciAqKnBwdHIsIHNpemVfdCAqcGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyIG9wOworCWludCByZXQ7CisJY2hhciBwYXJhbTFbMjU2XSwgcGFyYW0yWzI1Nl07CisJY2hhciBsaW5lWzI1Nl0sICpwdHJfbGluZTsKKwlpbnQgdmFsOworCXVuc2lnbmVkIGNoYXIgdmFsMjsKKwl1bnNpZ25lZCBpbnQgIGFkZHI7CisJdW5zaWduZWQgY2hhciAqcHRyID0gKnBwdHI7CisJc2l6ZV90IGxlbiA9ICpwbGVuOworCisJcHRyX2xpbmUgPSBsaW5lOworCW9wID0gKnB0cjsKKwlyZXQgPSBzc2NhbmYocHRyLCAiJXMgJXMiLCBwYXJhbTEsIHBhcmFtMik7CisJcHRyKys7CisJbGVuKys7CisJaWYgKHNzY2FuZihwdHIsICIlcyAlWCIsIHBhcmFtMSwgJnZhbCkgIT0gMikKKwkJcmV0dXJuIC1FRkFVTFQ7CisJLypwcl9kZWJ1ZygiJXM6IHBhcmFtMT0lcyxwYXJhbTI9JXMsIHZhbD0leFxuIiwKKwkJRFJJVkVSX05BTUUsIHBhcmFtMSwgcGFyYW0yLCB2YWwpOyovCisJc3RyY3B5KHB0cl9saW5lLCBwYXJhbTEpOworCWxlbiArPSBzdHJsZW4ocGFyYW0xKTsKKwlwdHIgKz0gc3RybGVuKHBhcmFtMSk7CisJc3RybmNhdChwdHJfbGluZSwgcHRyLCAxKTsKKwlsZW4rKzsKKwlwdHIrKzsKKwlzdHJjYXQocHRyX2xpbmUsIHBhcmFtMik7CisJbGVuICs9IHN0cmxlbihwYXJhbTIpOworCXB0ciArPSBzdHJsZW4ocGFyYW0yKTsKKwkvKnByX2RlYnVnKCIlczogbGVuID0gJTA4ZCBsaW5lOiAlc1xuIiwKKwkJRFJJVkVSX05BTUUsIGxlbiwgbGluZSk7Ki8KKwlhZGRyID0gY2ltYXh1c2JfcnRyX3JlZ19hZGRyKHBhcmFtMSk7CisJaWYgKCgoc2lnbmVkKWFkZHIpIDwgMCkgeworCQlwcl9lcnIoIiVzOiB1bmtub3duIHJlZ2lzdGVyIG5hbWU6ICVzXG4iLAorCQkJRFJJVkVSX05BTUUsIHBhcmFtMSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAodXNiX2dldGJ5dGUoYnVzX2FkYXAsIGFkZHIsICZ2YWwyKSA8IDApIHsKKwkJcHJfZXJyKCIlczogQ0lNYVgrIHJlZ2lzdGVyIHJlYWRpbmcgcHJvYmxlbTogJXNcbiIsCisJCURSSVZFUl9OQU1FLCBwYXJhbTEpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSAnPSc6CisJCWlmICh3YWl0Rm9yVmFsdWUoYnVzX2FkYXAsIGFkZHIsIHZhbCwgJnZhbDIpID09IC0xKSB7CisJCQlwcl9lcnIoIiVzIDogd2FpdEZvclZhbHVlIGZhaWxlZCBvbiA6ICVzXG4iLAorCQkJCURSSVZFUl9OQU1FLCBwYXJhbTEpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJcHJfaW5mbygiJXMgOiB3YWl0IGZvciB2YWx1ZSAoWyV4XSA9ICV4ID0gJXgpXG4iLAorCQkJbGluZSwgYWRkciwgdmFsLCB2YWwyKTsKKwlicmVhazsKKwljYXNlICc/JzoKKwkJaWYgKHdhaXRGb3JCaXRzU2V0KGJ1c19hZGFwLCBhZGRyLCB2YWwsICZ2YWwyKSA9PSAtMSkgeworCQkJcHJfZXJyKCIlcyA6IHdhaXRGb3JCaXRzU2V0IGZhaWxlZCBvbiA6ICVzXG4iLAorCQkJCURSSVZFUl9OQU1FLCBwYXJhbTEpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJcHJfaW5mbygiJXMgOiB3YWl0IGZvciBiaXRzc2V0IChbJXhdID0gJXggPSAleClcbiIsCisJCQlsaW5lLCBhZGRyLCB2YWwsIHZhbDIpOworCWJyZWFrOworCWNhc2UgJyEnOgorCQlpZiAod2FpdEZvckJpdHNDbGVhcmVkKGJ1c19hZGFwLCBhZGRyLCB2YWwsICZ2YWwyKQorCQkJCT09IC0xKSB7CisJCQlwcl9lcnIoIiVzIDogd2FpdEZvckJpdHNDbGVhcmVkIGZhaWxlZCBvbiA6ICVzXG4iLAorCQkJCURSSVZFUl9OQU1FLCBwYXJhbTEpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJcHJfaW5mbygiJXMgOiB3YWl0IGZvciBiaXRzIGNsZWFyZWQgKFsleF0gPSAleCA9ICV4KVxuIiwKKwkJCWxpbmUsIGFkZHIsIHZhbCwgdmFsMik7CisJYnJlYWs7CisJY2FzZSAnfCc6CisJCWlmIChzZXRMb2dpY2FsT3IoYnVzX2FkYXAsIGFkZHIsIHZhbCwgJnZhbDIpID09IC0xKSB7CisJCQlwcl9lcnIoIiVzIDogc2V0TG9naWNhbE9yIGZhaWxlZCBvbiA6ICVzXG4iLAorCQkJCURSSVZFUl9OQU1FLCBwYXJhbTEpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJcHJfaW5mbygiJXMgOiBzZXRPciAoWyV4XSA9ICV4ID0gJXgpXG4iLAorCQkJbGluZSwgYWRkciwgdmFsLCB2YWwyKTsKKwlicmVhazsKKwljYXNlICcmJzoKKwkJaWYgKHNldExvZ2ljYWxBbmQoYnVzX2FkYXAsIGFkZHIsIHZhbCwgJnZhbDIpID09IC0xKSB7CisJCQlwcl9lcnIoIiVzIDogc2V0TG9naWNhbEFuZCBmYWlsZWQgb24gOiAlc1xuIiwKKwkJCQlEUklWRVJfTkFNRSwgcGFyYW0xKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCXByX2luZm8oIiVzIDogc2V0QW5kIChbJXhdID0gJXggPSAleClcbiIsCisJCQlsaW5lLCBhZGRyLCB2YWwsIHZhbDIpOworCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiRXJyb3I6IE1hcmtlciBVbmtub3duIDwlYz4gISEhXG4iLCBvcCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkqcHB0ciA9IHB0cjsKKwkqcGxlbiA9IGxlbjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaW1heHVzYl9wYXJzZV9jZmdfZGVmYXVsdChzdHJ1Y3QgZGV2aWNlX3MgKmJ1c19hZGFwLAorCQl1bnNpZ25lZCBjaGFyICoqcHB0ciwgc2l6ZV90ICpwbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnB0ciA9ICpwcHRyOworCXNpemVfdCBsZW4gPSAqcGxlbjsKKwlpbnQgcmV0OworCWNoYXIgcGFyYW0xWzI1Nl0sIHBhcmFtMlsyNTZdOworCWNoYXIgbGluZVsyNTZdLCAqcHRyX2xpbmU7CisJaW50IHZhbDsKKwl1bnNpZ25lZCBjaGFyIHZhbDI7CisJdW5zaWduZWQgaW50ICBhZGRyOworCisJcHRyX2xpbmUgPSBsaW5lOworCisJcmV0ID0gc3NjYW5mKHB0ciwgIiVzICVzIiwgcGFyYW0xLCBwYXJhbTIpOworCXJldCA9IHNzY2FuZihwYXJhbTIsICIlWCIsICZ2YWwpOworCS8qcHJfZGVidWcoIiVzOiBwYXJhbTE9JXMscGFyYW0yPSVzLHZhbD0leFxuIiwKKwkJRFJJVkVSX05BTUUscGFyYW0xLHBhcmFtMix2YWwpOyovCisJc3RyY3B5KHB0cl9saW5lLCBwYXJhbTEpOworCWxlbiArPSBzdHJsZW4ocGFyYW0xKTsKKwlwdHIgKz0gc3RybGVuKHBhcmFtMSk7CisJc3RybmNhdChwdHJfbGluZSwgcHRyLCAxKTsKKwlsZW4rKzsKKwlwdHIrKzsKKwlzdHJjYXQocHRyX2xpbmUsIHBhcmFtMik7CisJbGVuICs9IHN0cmxlbihwYXJhbTIpOworCXB0ciArPSBzdHJsZW4ocGFyYW0yKTsKKwkvKnByX2RlYnVnKCIlczogbGVuID0gJTA4ZCBsaW5lOiAlc1xuIiwKKwkJRFJJVkVSX05BTUUsIGxlbiwgbGluZSk7Ki8KKwlhZGRyID0gY2ltYXh1c2JfcnRyX3JlZ19hZGRyKHBhcmFtMSk7CisJaWYgKCgoc2lnbmVkKWFkZHIpIDwgMCkgeworCQlwcl9lcnIoIiVzOiB1bmtub3duIHJlZ2lzdGVyIG5hbWU6ICVzXG4iLAorCQkJRFJJVkVSX05BTUUsIHBhcmFtMSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAodXNiX2dldGJ5dGUoYnVzX2FkYXAsIGFkZHIsICZ2YWwyKSA8IDApIHsKKwkJcHJfZXJyKCIlczogQ0lNYVgrIHJlZ2lzdGVyIHJlYWRpbmcgcHJvYmxlbTogJXNcbiIsCisJCQlEUklWRVJfTkFNRSwgcGFyYW0xKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICh1c2Jfc2V0Ynl0ZShidXNfYWRhcCwgYWRkciwgdmFsKSA8IDApIHsKKwkJcHJfZXJyKCIlczogQ0lNYVgrIHJlZ2lzdGVyIHdyaXRpbmcgcHJvYmxlbTogJXNcbiIsCisJCQlEUklWRVJfTkFNRSwgcGFyYW0xKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICh1c2JfZ2V0Ynl0ZShidXNfYWRhcCwgYWRkciwgJnZhbDIpIDwgMCkgeworCQlwcl9lcnIoIiVzOiBDSU1hWCsgcmVnaXN0ZXIgY2hlY2tpbmcgcHJvYmxlbTogJXNcbiIsCisJCQlEUklWRVJfTkFNRSwgcGFyYW0xKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXByX2luZm8oInNldDogJXMoMHglMDR4KSA6IDB4JTAyeFxuIiwgcGFyYW0xLCBhZGRyLCB2YWwpOworCisJKnBwdHIgPSBwdHI7CisJKnBsZW4gPSBsZW47CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZgorICogICBwYXJzZSBDSU1hWCsgY29uZmlnIGZpbGUuCisgKgorICogQHBhcmFtICAgZGV2CisgKiAgIFBvaW50ZXIgdG8gdXNiIGRldmljZS4KKyAqCisgKiBAcGFyYW0gICBmd19kYXRhCisgKiAgIFBvaW50ZXIgdG8gYnVmZmVyIHdpdGggZmlybXdhcmUgZGF0YS4KKyAqCisgKiBAcmV0dXJuCisgKiAgIE8gaWYgbm8gZXJyb3Igb3RoZXJ3aXNlIGVycm5vLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGNpbWF4dXNiX3BhcnNlX2NmZyhzdHJ1Y3QgZGV2aWNlX3MgKmJ1c19hZGFwLAorCQljb25zdCB1bnNpZ25lZCBjaGFyICpjZmdfZGF0YSwgc2l6ZV90IHNpemUpCit7CisJY2hhciBsaW5lWzI1Nl0sICpwdHJfbGluZTsKKwlzaXplX3QgbGVuID0gMDsKKwl1bnNpZ25lZCBjaGFyICpwdHIgPSAodW5zaWduZWQgY2hhciAqKWNmZ19kYXRhOworCWludCByZXQgPSAtRUZBVUxUOworCisJZGJnKCIlczogJXMgc2l6ZSA9ICV6ZFxuIiwgRFJJVkVSX05BTUUsIF9fZnVuY19fLCBzaXplKTsKKwlkbyB7CisJCXB0cl9saW5lID0gbGluZTsKKwkJc3dpdGNoICgqcHRyKSB7CisJCWNhc2UgJzsnOgorCQkJLyogY29udGludWUgdXAgdG8gZmluZCBcciBjaGFyYWN0ZXIgKi8KKwkJCXdoaWxlICgqcHRyICE9IDB4MEEpIHsKKwkJCQkqcHRyX2xpbmUrKyA9ICpwdHI7CisJCQkJcHRyKys7CisJCQkJbGVuKys7CisJCQl9CisJCQkqcHRyX2xpbmUgPSAwOworCQkJLypwcl9kZWJ1ZygiJXM6IGxlbiA9ICUwOGQgbGluZTogJXNcbiIsCisJCQkJRFJJVkVSX05BTUUsIGxlbiwgbGluZSk7Ki8KKwkJYnJlYWs7CisJCWNhc2UgMHgwQToKKwkJY2FzZSAweDBEOgorCQkJcHRyKys7CisJCQlsZW4rKzsKKwkJYnJlYWs7CisJCWNhc2UgJz0nOgorCQljYXNlICc/JzoKKwkJY2FzZSAnISc6CisJCWNhc2UgJ3wnOgorCQljYXNlICcmJzoKKwkJCXJldCA9IGNpbWF4dXNiX3BhcnNlX2NmZ19vcHMoYnVzX2FkYXAsICZwdHIsICZsZW4pOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSBjaW1heHVzYl9wYXJzZV9jZmdfZGVmYXVsdChidXNfYWRhcCwgJnB0ciwgJmxlbik7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKGxlbiA8IHNpemUpOworCisJcmV0dXJuIChyZXQgPT0gLUVGQVVMVCkgPyAwIDogcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYKKyAqICAgcmVhZCBjb25maWd1cmF0aW9uIGZpbGUgKCBDSU1BWF9DT05GSUdfTkFNRSkgYW5kIHNldCBpbiBDSU1hWCsgY2hpcC4KKyAqCisgKiBAcGFyYW0gICBidXNfYWRhcAorICogICBQb2ludGVyIHRvIHVzYiBkZXZpY2UuCisgKgorICogQHJldHVybgorICogICBOb25lLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCitvcHQ6IDA6IGluaXQsIDE6IG9mZiwgMjogVmNjMy4zIDM6IFZjYzUKKyovCitpbnQgY2ltYXh1c2JfY29uZmlndXJhdGlvbl9zZXR0aW5nX29wdChzdHJ1Y3QgZGV2aWNlX3MgKmJ1c19hZGFwLCBpbnQgb3B0KQoreworCWludCBlcnJubyA9IC1FRkFVTFQ7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpjb25maWc7CisJY2hhciAqY2ZnID0gY2ltYXhfY29uZmlnX2ZpbGVbb3B0XTsKKworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBidXNfYWRhcC0+dXNiZGV2OworCisJZGJnKCJyZXF1ZXN0IGNvbmZpZ3VyYXRpb24gZmlsZSIpOworCS8qIHJlcXVlc3Qga2VybmVsIHRvIGxvY2F0ZSBmaXJtd2FyZSBmaWxlICovCisJZXJybm8gPSByZXF1ZXN0X2Zpcm13YXJlKCZjb25maWcsIGNmZywgJmRldi0+ZGV2KTsKKwlpZiAoZXJybm8gPCAwKSB7CisJCXByX2VycigiJXM6IHVuYWJsZSB0byBsb2NhdGUgY29uZmlndXJhdGlvbiBmaWxlOiAlc1xuIiwKKwkJCSBEUklWRVJfTkFNRSwgY2ZnKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlkYmcoInBhcnNlIGNvbmZpZ3VyYXRpb24gZmlsZSIpOworCWVycm5vID0gY2ltYXh1c2JfcGFyc2VfY2ZnKGJ1c19hZGFwLCBjb25maWctPmRhdGEsIGNvbmZpZy0+c2l6ZSk7CisJaWYgKGVycm5vIDwgMCkgeworCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gcGFyc2UgY29uZmlnIGZpbGU6ICVzXG4iLAorCQkJIERSSVZFUl9OQU1FLCBjZmcpOworCQlnb3RvIGVycm9yOworCX0KKworZXJyb3I6CisJLyogcmVsZWFzZSBmaXJtd2FyZSBpZiBuZWVkZWQgKi8KKwlpZiAoY29uZmlnICE9IE5VTEwpCisJCXJlbGVhc2VfZmlybXdhcmUoY29uZmlnKTsKKwlyZXR1cm4gZXJybm87Cit9CisKK2ludCBjaW1heHVzYl9jb25maWd1cmF0aW9uX3NldHRpbmcoc3RydWN0IGRldmljZV9zICpidXNfYWRhcCkKK3sKKwlyZXR1cm4gY2ltYXh1c2JfY29uZmlndXJhdGlvbl9zZXR0aW5nX29wdChidXNfYWRhcCwgMCk7Cit9CisKK2ludCBjaW1heHVzYl9jb25maWd1cmF0aW9uX3NldHRpbmdfdmNjKHN0cnVjdCBkZXZpY2VfcyAqYnVzX2FkYXAsIGludCB2Y2MpCit7CisJcmV0dXJuIGNpbWF4dXNiX2NvbmZpZ3VyYXRpb25fc2V0dGluZ19vcHQoYnVzX2FkYXAsIHZjYyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L3VzYi9TUkMvY2ltYXgrdXNiX2NvbmZpZy5oIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC91c2IvU1JDL2NpbWF4K3VzYl9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzU1MjA0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC91c2IvU1JDL2NpbWF4K3VzYl9jb25maWcuaApAQCAtMCwwICsxLDU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqCisgKiBAZmlsZSAgICBjaW1heCt1c2JfY29uZmlnLmgKKyAqCisgKiBAYnJpZWYgICBDSU1hWCsgVVNCIERyaXZlciBmb3IgbGludXggYmFzZWQgb3BlcmF0aW5nIHN5c3RlbXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgICAgQnJ1bm8gVG9uZWxsaSAgIDxicnVuby50b25lbGxpQHNtYXJkdHYuY29tPgorICogICAgICAgICAgICAgICAgICAgICAgICAgICYgRnJhbmNrIERlc2NvdXJzIDxmcmFuY2suZGVzY291cnNAc21hcmR0di5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgU21hckRUViBGcmFuY2UsIExhIENpb3RhdAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fQ0lNQVhQTFVTX1VTQl9DRkdfSAorI2RlZmluZSBfX0NJTUFYUExVU19VU0JfQ0ZHX0gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW5jbHVkZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJjaW1heCt1c2JfaGFuZGxlLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERlZmluZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENJTUFYX0NPTkZJR19OQU1FICAgImNpbWF4K3VzYi5jZmciCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEVudW1zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU3RydWN0dXJlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYKKyAqICAgcmVhZCBjb25maWd1cmF0aW9uIGZpbGUgKCBDSU1BWF9DT05GSUdfTkFNRSkgYW5kIHNldCBpbiBDSU1hWCsgY2hpcC4KKyAqCisgKiBAcGFyYW0gICBidXNfYWRhcAorICogICBQb2ludGVyIHRvIHVzYiBkZXZpY2UuCisgKgorICogQHJldHVybgorICogICBOb25lLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBjaW1heHVzYl9jb25maWd1cmF0aW9uX3NldHRpbmcoc3RydWN0IGRldmljZV9zICpidXNfYWRhcCk7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L3VzYi9TUkMvY2ltYXgrdXNiX2Z3LmMgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L3VzYi9TUkMvY2ltYXgrdXNiX2Z3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjY2Y0YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvdXNiL1NSQy9jaW1heCt1c2JfZncuYwpAQCAtMCwwICsxLDMyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKgorICogQGZpbGUgICAgY2ltYXgrdXNiX2Z3LmMKKyAqCisgKiBAYnJpZWYgICBDSU1hWCsgVVNCIERyaXZlciBmb3IgbGludXggYmFzZWQgb3BlcmF0aW5nIHN5c3RlbXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgICAgQnJ1bm8gVG9uZWxsaSAgIDxicnVuby50b25lbGxpQHNtYXJkdHYuY29tPgorICogICAgICAgICAgICAgICAgICAgICAgICAgICYgRnJhbmNrIERlc2NvdXJzIDxmcmFuY2suZGVzY291cnNAc21hcmR0di5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgU21hckRUViBGcmFuY2UsIExhIENpb3RhdAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW5jbHVkZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorCisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KKworI2luY2x1ZGUgImNpbWF4K3VzYi1kcml2ZXIuaCIKKyNpbmNsdWRlICJjaW1heCt1c2JfZncuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU3RydWN0dXJlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdsb2JhbHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjaGFyIGNpbWF4X2Z3W10gPSBDSU1BWF9GSVJNV0FSRV9OQU1FOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYKKyAqICAgU3RhcnQgJiBjaGVjayBCaXN0cm9tLgorICoKKyAqIEBwYXJhbSAgIGRldgorICogICBQb2ludGVyIHRvIHVzYiBkZXZpY2UuCisgKgorICogQHBhcmFtICAgc3RhcnRBZGRyCisgKiAgIHN0YXJ0IGFkZHJlc3Mgb2YgZmlybXdhcmUgdG8gY29tcHV0ZQorICoKKyAqIEBwYXJhbSAgIGVuZEFkZHIKKyAqICAgc3RvcCBhZGRyZXNzIG9mIGZpcm13YXJlIHRvIGNvbXB1dGUKKyAqCisgKiBAcGFyYW0gICBGV1NpZ24KKyAqICAgQ3VycmVudCBzaWduYXR1cmUgdG8gY2hlY2sKKyAqCisgKgorICogQHJldHVybgorICogICBOb25lLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBjaGVja0Jpc3RSb20oc3RydWN0IGRldmljZV9zICpidXNfYWRhcCwKKwlpbnQgc3RhcnRBZGRyLCBpbnQgZW5kQWRkciwgaW50IHNpZ25hdHVyZSkKK3sKKwl1bnNpZ25lZCBjaGFyICpWYWw7CisJaW50IHJ2OworCisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGJ1c19hZGFwLT51c2JkZXY7CisKKwlWYWwgPSBrY2FsbG9jKDIsIHNpemVvZih1bnNpZ25lZCBjaGFyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFWYWwpIHsKKwkJcHJfZXJyKCIlcy0lczogb3V0IG9mIG1lbW9yeS5cbiIsIERSSVZFUl9OQU1FLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIFdyaXRlICJGbGFzaCIgU2l6ZQorCSAgICghKSBCaXN0Um9tIGlzIGNvbXB1dGVkIHNpbmNlIEQwMDAtZmxhc2hTaXplIHRvIEQwMDAwLTYKKwkqLworCVZhbFswXSA9ICgweEQwMDAtc3RhcnRBZGRyKSYweDAwZmY7CisJVmFsWzFdID0gKDB4RDAwMC1zdGFydEFkZHIpPj44OworCWlmIChidXNfYWRhcC0+b3BzLT53cml0ZV9jdHJsX21lc3NhZ2UoZGV2LCAweDAwOEQsIFZhbCwgMikgIT0gMikgeworCQlrZnJlZShWYWwpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogV3JpdGUgU2lnbmF0dXJlKi8KKwlWYWxbMF0gPSBzaWduYXR1cmUmMHgwMGZmOworCVZhbFsxXSA9IHNpZ25hdHVyZT4+ODsKKwlpZiAoYnVzX2FkYXAtPm9wcy0+d3JpdGVfY3RybF9tZXNzYWdlKGRldiwgMHgwMDgwLCBWYWwsIDIpICE9IDIpIHsKKwkJa2ZyZWUoVmFsKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIExhdW5jaCBCaXN0Um9tIFsoRDAwMC1mbGFzaFNpemUpLi5DRkY5XStbRkZGQS4uRkZGRl0gY29tcHV0YXRpb24qLworCVZhbFswXSA9IDB4MEY7CisJaWYgKGJ1c19hZGFwLT5vcHMtPndyaXRlX2N0cmxfbWVzc2FnZShkZXYsIDB4MDA4MiwgVmFsLCAxKSAhPSAxKSB7CisJCWtmcmVlKFZhbCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwcl9pbmZvKCJcbj4+UmVhZCBTaWduYXR1cmVcbiIpOworCisJLyogUmVhZCBTaWduYXR1cmUqLworCWlmIChidXNfYWRhcC0+b3BzLT5yZWFkX2N0cmxfbWVzc2FnZShkZXYsIDB4MDA0MSwgVmFsLCAyKSAhPSAyKSB7CisJCWtmcmVlKFZhbCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwcl9pbmZvKCJcbj4+IEJpc3Ryb20gY29tcHV0ZWQgPSAlMDRYXG4iLCAgVmFsWzBdfFZhbFsxXTw8OCk7CisKKwkvKiBSZWFkIEJvb3Qgc3RhdHVzKi8KKwlpZiAoYnVzX2FkYXAtPm9wcy0+cmVhZF9jdHJsX21lc3NhZ2UoZGV2LCAweDAwMDksIFZhbCwgMSkgIT0gMSkgeworCQlrZnJlZShWYWwpOworCQlyZXR1cm4gLTE7CisJfQorCisJcHJfaW5mbygiXG4+PiBCb290Um9tIFN0YXR1cyA9ICUwMlhcbiIsICBWYWxbMF0pOworCXJ2ID0gVmFsWzBdOworCWtmcmVlKFZhbCk7CisKKwlyZXR1cm4gcnY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZgorICogICBDb21wdXRlIEJpc3RSb20uCisgKgorICogQHBhcmFtICAgcHRyCisgKiAgIFBvaW50ZXIgdG8gYnVmZmVyIHdpdGggcmVnaXN0ZXIgZGF0YQorICoKKyAqIEBwYXJhbSAgIHNpemUKKyAqICAgTnVtYmVyIG9mIHJlZ2lzdGVyIHRvIHByb2Nlc3MKKyAqCisgKiBAcGFyYW0gICBGV1NpZ24KKyAqICAgQ3VycmVudCBzaWduYXR1cmUKKyAqCisgKiBAcmV0dXJuCisgKiAgIE5vbmUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordW5zaWduZWQgaW50IE1JU1IoY29uc3QgdW5zaWduZWQgY2hhciAqcHRyLCBpbnQgc2l6ZSwgdW5zaWduZWQgaW50IEZXU2lnbikKK3sKKwlpbnQgaywgaTsKKworCXVuc2lnbmVkIHNob3J0IG15U2lnbjsKKworCWZvciAoayA9IDA7IGsgPCBzaXplOyBrKyspIHsKKwkJbXlTaWduID0gcHRyW2tdJjB4MDE7CisKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCWlmICgweDg4QjcgJiAoMTw8aSkpCisJCQkJbXlTaWduIF49IChGV1NpZ24+PmkpICYgMHgwMTsKKwkJfQorCisJCW15U2lnbiB8PSAoKEZXU2lnbjw8MSleKHB0cltrXSkpICYgMHgwMEZFOworCQlteVNpZ24gfD0gKEZXU2lnbjw8MSkgJiAweDAwRkYwMDsKKworCQlGV1NpZ24gPSBteVNpZ247CisJfQorCisJcmV0dXJuIEZXU2lnbjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYKKyAqICAgdXBsb2FkIGZpcm13YXJlIGluIENJTWFYKyBjaGlwLgorICoKKyAqIEBwYXJhbSAgIGRldgorICogICBQb2ludGVyIHRvIHVzYiBkZXZpY2UuCisgKgorICogQHBhcmFtICAgZndfZGF0YQorICogICBQb2ludGVyIHRvIGJ1ZmZlciB3aXRoIGZpcm13YXJlIGRhdGEuCisgKgorICogQHBhcmFtICAgRldTaWduCisgKiAgIFBvaW50ZXIgdG8gc3RvcmUgY29tcHV0ZWQgc2lnbmF0dXJlLgorICoKKyAqIEByZXR1cm4KKyAqICAgTm9uZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgY2ltYXh1c2JfZmlybXdhcmVfdXBsb2FkKHN0cnVjdCBkZXZpY2VfcyAqYnVzX2FkYXAsCisJY29uc3QgdW5zaWduZWQgY2hhciAqZndfZGF0YSwgdW5zaWduZWQgaW50ICpGV1NpZ24pCit7CisJaW50IGVycm5vID0gLUVGQVVMVDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwdHI7CisJaW50IHN0YXJ0QWRkciA9IFNUQVJUX0ZXX0FERFI7CisJdW5zaWduZWQgY2hhciAqcmVjdjsKKwlpbnQgc2l6ZTsKKworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBidXNfYWRhcC0+dXNiZGV2OworCisJLyogZGF0YSBmaXJtd2FyZSAqLworCXB0ciA9IGZ3X2RhdGE7CisJcHRyICs9IFNUQVJUX0ZXX0FERFI7CisKKwlyZWN2ID0ga2NhbGxvYygzMDAsIHNpemVvZih1bnNpZ25lZCBjaGFyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZWN2KSB7CisJCXByX2VycigiJXMtJXM6IG91dCBvZiBtZW1vcnkuXG4iLCBEUklWRVJfTkFNRSwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkbyB7CisJCS8qIGNvbXB1dGUgdGhlIHNpemUgdG8gc2VuZCB0byBDSU1hWCsgKi8KKwkJc2l6ZSA9IChzdGFydEFkZHIgPD0gKFNUT1BfRldfQUREUiArIDEgLSBNQVhfRldfUEtUX1NJWkUpKSA/CisJCQkoTUFYX0ZXX1BLVF9TSVpFKSA6IChTVE9QX0ZXX0FERFIgKyAxIC0gc3RhcnRBZGRyKTsKKwkJLyogY29tcHV0ZSBTaWduYXR1cmUgKi8KKwkJKkZXU2lnbiA9IE1JU1IocHRyLCBzaXplLCAqRldTaWduKTsKKworCQlwcl9pbmZvKCIlczogZmlybXdhcmUgc3RhcnQgYWRkcmVzcyAlMDh4IHNpemUgJWRcbiIsCisJCQlEUklWRVJfTkFNRSwgc3RhcnRBZGRyLCBzaXplKTsKKworCQkvKiB1cGxvYWQgZGF0YSBmaXJtd2FyZSAqLworCQlpZiAoYnVzX2FkYXAtPm9wcy0+d3JpdGVfY3RybF9tZXNzYWdlKAorCQkJCWRldiwgc3RhcnRBZGRyLCAodm9pZCAqKXB0ciwgc2l6ZSkgIT0gc2l6ZSkgeworCQkJcHJfZXJyKCJGYWlsZWQgdG8gbG9hZCBDSU1hWCsgZmlybXdhcmVcbiIpOworCQkJZXJybm8gPSAtRU5PREVWOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGJ1c19hZGFwLT5vcHMtPnJlYWRfY3RybF9tZXNzYWdlKAorCQkJCWRldiwgc3RhcnRBZGRyLCAodm9pZCAqKXJlY3YsIHNpemUpICE9IHNpemUpIHsKKwkJCXByX2VycigiRmFpbGVkIHRvIGxvYWQgQ0lNYVgrIGZpcm13YXJlXG4iKTsKKwkJCWVycm5vID0gLUVOT0RFVjsKKwkJCWJyZWFrOworCQl9CisJCWlmIChtZW1jbXAocHRyLCByZWN2LCBzaXplKSkgeworCQkJcHJfZXJyKCJGYWlsZWQgY29tcGFyZSBhdCBBZGRyZXNzIDB4JTA0eFxuIiwKKwkJCQlzdGFydEFkZHIpOworCQkJZXJybm8gPSAtRU5PREVWOworCQkJYnJlYWs7CisJCX0KKwkJLyogdXBkYXRlIHNpemUgc2VudCB0byBDSU1hWCsgKi8KKwkJc3RhcnRBZGRyICs9IHNpemU7CisJCXB0ciArPSBzaXplOworCQlpZiAoc3RhcnRBZGRyID49IFNUT1BfRldfQUREUikKKwkJCWJyZWFrOworCX0gd2hpbGUgKDEpOworCisJa2ZyZWUocmVjdik7CisKKwlpZiAoZXJybm8gPT0gLUVGQVVMVCkgeworCQkvKiB1cGxvYWQgaW50ZXJydXB0IHZlY3RvciovCisJCXB0ciA9IGZ3X2RhdGE7CisJCXB0ciArPSBTVEFSVF9JTlRWRUNUX0FERFI7CisJCXN0YXJ0QWRkciA9ICBTVEFSVF9JTlRWRUNUX0FERFI7CisKKwkJLyogY29udGludWUgdG8gY29tcHV0ZSBTaWduYXR1cmUgKi8KKwkJKkZXU2lnbiA9IE1JU1IocHRyLCA2LCAqRldTaWduKTsKKworCQkvKiB1cGxvYWQgaW50ZXJydXB0IHZlY3RvciBkYXRhKi8KKwkJaWYgKGJ1c19hZGFwLT5vcHMtPndyaXRlX2N0cmxfbWVzc2FnZSgKKwkJCQlkZXYsIHN0YXJ0QWRkciwgKHZvaWQgKilwdHIsIDYpICE9IDYpIHsKKwkJCXByX2VycigiRmFpbGVkIHRvIGxvYWQgQ0lNYVggZmlybXdhcmUoSW50IHZlY3RvcilcbiIpOworCQkJZXJybm8gPSAtRU5PREVWOworCQl9CisJfQorCXJldHVybiAoZXJybm8gPT0gLUVGQVVMVCkgPyAwIDogZXJybm87Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZgorICogICB1cGxvYWQgYW5kIHN0YXJ0IGZpcm13YXJlIGluIENJTWFYKyBjaGlwLgorICoKKyAqIEBwYXJhbSAgIGJ1c19hZGFwCisgKiAgIFBvaW50ZXIgdG8gdXNiIGRldmljZS4KKyAqCisgKiBAcmV0dXJuCisgKiAgIE5vbmUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGNpbWF4dXNiX2Z3X3VwbG9hZChzdHJ1Y3QgZGV2aWNlX3MgKmJ1c19hZGFwKQoreworCWludCBlcnJubyA9IC1FRkFVTFQ7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmaXJtd2FyZTsKKwljaGFyICpmdyA9IGNpbWF4X2Z3OworCXVuc2lnbmVkIGludCBGV1NpZ24gPSAwOworCWludCByZXQ7CisKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gYnVzX2FkYXAtPnVzYmRldjsKKworCS8qIHJlcXVlc3Qga2VybmVsIHRvIGxvY2F0ZSBmaXJtd2FyZSBmaWxlICovCisJZXJybm8gPSByZXF1ZXN0X2Zpcm13YXJlKCZmaXJtd2FyZSwgZncsICZkZXYtPmRldik7CisJaWYgKGVycm5vIDwgMCkgeworCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gbG9jYXRlIGZpcm13YXJlIGZpbGU6ICVzXG4iLAorCQkJCURSSVZFUl9OQU1FLCBmdyk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZXJybm8gPSBjaW1heHVzYl9maXJtd2FyZV91cGxvYWQoYnVzX2FkYXAsIGZpcm13YXJlLT5kYXRhLCAmRldTaWduKTsKKwlpZiAoZXJybm8gPCAwKSB7CisJCXByX2VycigiJXM6IHVuYWJsZSB0byB1cGxvYWQgZmlybXdhcmUgZmlsZTogJXNcbiIsCisJCQkJRFJJVkVSX05BTUUsIGZ3KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlwcl9pbmZvKCIlczogZmlybXdhcmU6ICVzIGxvYWRlZCB3aXRoIHN1Y2Nlc3MuIEN1cnJlbnQgQmlzdHJvbSAlMDRYXG4iLAorCQkJRFJJVkVSX05BTUUsIGZ3LCBGV1NpZ24pOworCisJcmV0ID0gY2hlY2tCaXN0Um9tKGJ1c19hZGFwLCBTVEFSVF9GV19BRERSLCBTVE9QX0ZXX0FERFIsIEZXU2lnbik7CisJaWYgKHJldCAhPSAweDAyKSB7CisJCXByX2VycigiXG5FcnJvcjogRmFpbCBvbiBjb21wYXJlIEJpc3RSb20gKCUwMlgpICFcbiIsIHJldCk7CisJCWVycm5vID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoYnVzX2FkYXAtPm9wcy0+aW5pdF9mdyhkZXYpICE9IDApIHsKKwkJcHJfZXJyKCJcbkVycm9yOiBGYWlsIG9uIElOSVQgY29tbWFuZCAhXG4iKTsKKwkJZXJybm8gPSAtRU5PREVWOworCQlnb3RvIGVycm9yOworCX0KKworZXJyb3I6CisJLyogcmVsZWFzZSBmaXJtd2FyZSBpZiBuZWVkZWQgKi8KKwlpZiAoZmlybXdhcmUgIT0gTlVMTCkKKwkJcmVsZWFzZV9maXJtd2FyZShmaXJtd2FyZSk7CisJcmV0dXJuIGVycm5vOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC91c2IvU1JDL2NpbWF4K3VzYl9mdy5oIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC91c2IvU1JDL2NpbWF4K3VzYl9mdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmM2Y2NGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L3VzYi9TUkMvY2ltYXgrdXNiX2Z3LmgKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKgorICogQGZpbGUgICAgY2ltYXgrdXNiX2Z3LmgKKyAqCisgKiBAYnJpZWYgICBDSU1hWCsgVVNCIERyaXZlciBmb3IgbGludXggYmFzZWQgb3BlcmF0aW5nIHN5c3RlbXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgICAgQnJ1bm8gVG9uZWxsaSAgIDxicnVuby50b25lbGxpQHNtYXJkdHYuY29tPgorICogICAgICAgICAgICAgICAgICAgICAgICAgICYgRnJhbmNrIERlc2NvdXJzIDxmcmFuY2suZGVzY291cnNAc21hcmR0di5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgU21hckRUViBGcmFuY2UsIExhIENpb3RhdAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0NJTUFYUExVU19VU0JfRldfSAorI2RlZmluZSBfX0NJTUFYUExVU19VU0JfRldfSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbmNsdWRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImNpbWF4K3VzYl9oYW5kbGUuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGVmaW5lcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQ0lNQVhfRklSTVdBUkVfTkFNRSAgICJjaW1heCtfdXNiZHZiLmJpbiIKKyNkZWZpbmUgU1RBUlRfRldfQUREUgkgICAgICAweDgwMDAKKyNkZWZpbmUgU1RPUF9GV19BRERSCSAgICAgICAgIDB4Q0ZGOQorI2RlZmluZSBTVEFSVF9JTlRWRUNUX0FERFIJICAgMHhGRkZBCisjZGVmaW5lIE1BWF9GV19QS1RfU0laRQkgICAgICAyNTYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRW51bXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTdHJ1Y3R1cmVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYKKyAqICAgdXBsb2FkIGZpcm13YXJlIGluIENJTWFYKyBjaGlwLgorICoKKyAqIEBwYXJhbSAgIGJ1c19hZGFwCisgKiAgIFBvaW50ZXIgdG8gdXNiIGRldmljZS4KKyAqCisgKiBAcmV0dXJuCisgKiAgIE5vbmUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGNpbWF4dXNiX2Z3X3VwbG9hZChzdHJ1Y3QgZGV2aWNlX3MgKmJ1c19hZGFwKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L3VzYi9TUkMvY2ltYXgrdXNiX2hhbmRsZS5oIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC91c2IvU1JDL2NpbWF4K3VzYl9oYW5kbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzZiOWNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC91c2IvU1JDL2NpbWF4K3VzYl9oYW5kbGUuaApAQCAtMCwwICsxLDQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqCisgKiBAZmlsZSAgICBjaW1heCt1c2JfaGFuZGxlLmgKKyAqCisgKiBAYnJpZWYgICBDSU1hWCsgVVNCIERyaXZlciBmb3IgbGludXggYmFzZWQgb3BlcmF0aW5nIHN5c3RlbXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgICAgQnJ1bm8gVG9uZWxsaSAgIDxicnVuby50b25lbGxpQHNtYXJkdHYuY29tPgorICogICAgICAgICAgICAgICAgICAgICAgICAgICYgRnJhbmNrIERlc2NvdXJzIDxmcmFuY2suZGVzY291cnNAc21hcmR0di5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgU21hckRUViBGcmFuY2UsIExhIENpb3RhdAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0NJTUFYUExVU19VU0JfSERMRV9ICisjZGVmaW5lIF9fQ0lNQVhQTFVTX1VTQl9IRExFX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworc3RydWN0IGNpbWF4dXNiX3ByaXZfb3BzX3QgeworCWludCAoKndyaXRlX2N0cmxfbWVzc2FnZSkoCisJCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIGludCBhZGRyLCB2b2lkICpkYXRhLCBpbnQgc2l6ZSk7CisKKwlpbnQgKCpyZWFkX2N0cmxfbWVzc2FnZSkoCisJCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIGludCBhZGRyLCB2b2lkICpkYXRhLCBpbnQgc2l6ZSk7CisKKwlpbnQgKCppbml0X2Z3KSgKKwkJc3RydWN0IHVzYl9kZXZpY2UgKmRldik7CisKKwlpbnQgKCp3cml0ZV9lcDZfbWVzc2FnZSkoCisJCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsIGludCBzaXplKTsKKworCWludCAoKnJlYWRfZXA1X21lc3NhZ2UpKAorCQlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLCBpbnQgc2l6ZSk7Cit9OworCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L3VzYi9TUkMvY2ltYXgrdXNiX3RpbWUuYyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvdXNiL1NSQy9jaW1heCt1c2JfdGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhODBiNWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L3VzYi9TUkMvY2ltYXgrdXNiX3RpbWUuYwpAQCAtMCwwICsxLDEzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKgorICogQGZpbGUgICAgY2ltYXgrdXNiX2Z3LmMKKyAqCisgKiBAYnJpZWYgICBDSU1hWCsgVVNCIERyaXZlciBmb3IgbGludXggYmFzZWQgb3BlcmF0aW5nIHN5c3RlbXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgICAgQnJ1bm8gVG9uZWxsaSAgIDxicnVuby50b25lbGxpQHNtYXJkdHYuY29tPgorICogICAgICAgICAgICAgICAgICAgICAgICAgICYgRnJhbmNrIERlc2NvdXJzIDxmcmFuY2suZGVzY291cnNAc21hcmR0di5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgU21hckRUViBGcmFuY2UsIExhIENpb3RhdAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiNkZWZpbmUgVElNRVNUQU1QKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW5jbHVkZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAiY2ltYXgrdXNiX3RpbWUuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU3RydWN0dXJlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgZXJyKGZvcm1hdCwgYXJnLi4uKVwKKwlwcl9lcnIoImNpbWF4K3VzYl90aW1lOiAlcz4gRVJST1IgIiBmb3JtYXQgIlxuIiAsIFwKKwkJX19mdW5jX18sICMjIGFyZykKKyNkZWZpbmUgaW5mbyhmb3JtYXQsIGFyZy4uLikgcHJfaW5mbygidGltZT4gIiBmb3JtYXQgIlxuIiwgIyMgYXJnKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR2xvYmFscworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBUSU1FU1RBTVAKK3N0cnVjdCBpdGVtX2FycmF5X3MgZ3N0QXJyYXk7CisjZW5kaWYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZgorICogICBJbml0IHRpbWVzdGFtcC4KKyAqCisgKiBAcGFyYW0KKyAqICAgTm9uZQorICoKKyAqIEByZXR1cm4KKyAqICAgTm9uZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEluaXRUaW1lc3RhbXAodm9pZCkKK3sKKyNpZmRlZiBUSU1FU1RBTVAKKwlnc3RBcnJheS5jb3VudCA9IDA7CisjZW5kaWYKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZgorICogICBTZXQgdGltZXN0YW1wLgorICoKKyAqIEBwYXJhbSAgIHBjRm9ybWF0CisgKiAgIFByaW50Zi1saWtlIGZvcm1hdAorICoKKyAqIEByZXR1cm4KKyAqICAgTm9uZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFNldFRpbWVzdGFtcChjb25zdCBjaGFyICpwY0Zvcm1hdCwgLi4uKQoreworI2lmZGVmIFRJTUVTVEFNUAorCXZhX2xpc3Qgc3RBcmdzOworCisJaWYgKGdzdEFycmF5LmNvdW50ID49IE1BWF9JVEVNUykgeworCQlpZiAoZ3N0QXJyYXkuY291bnQrKyA9PSBNQVhfSVRFTVMpCisJCQlTaG93VGltZXN0YW1wKCk7CisJCXJldHVybjsKKwl9CisJa3RpbWVfZ2V0X3RzKCZnc3RBcnJheS5zdEl0ZW1bZ3N0QXJyYXkuY291bnRdLnN0VGltZSk7CisJdmFfc3RhcnQoc3RBcmdzLCBwY0Zvcm1hdCk7CisJdnNwcmludGYoZ3N0QXJyYXkuc3RJdGVtW2dzdEFycmF5LmNvdW50KytdLnBjTGluZSwgcGNGb3JtYXQsIHN0QXJncyk7CisJdmFfZW5kKHN0QXJncyk7CisjZW5kaWYKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBicmllZgorICogICBEaXNwbGF5IGFsbCB0aW1lc3RhbXBzLgorICoKKyAqIEBwYXJhbQorICogICBOb25lCisgKgorICogQHJldHVybgorICogICBOb25lLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgU2hvd1RpbWVzdGFtcCh2b2lkKQoreworI2lmZGVmIFRJTUVTVEFNUAorCWludCBpOworCisJaWYgKGdzdEFycmF5LmNvdW50ID09IDApIHsKKwkJZXJyKCJObyB0aW1lc3RhbXBzIGF2YWlsYWJsZSIpOworCQlyZXR1cm47CisJfQorCisJaW5mbygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisJaW5mbygiICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVTVEFNUFMiKTsKKwlpbmZvKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKKworCWZvciAoaSA9IDA7IGkgPCBnc3RBcnJheS5jb3VudDsgaSsrKSB7CisJCWluZm8oIlslMDRkXSBbJTAzZC4lMDlkXSAlcyIsCisJCQkJaSwKKwkJCQlnc3RBcnJheS5zdEl0ZW1baV0uc3RUaW1lLnR2X3NlYywKKwkJCQlnc3RBcnJheS5zdEl0ZW1baV0uc3RUaW1lLnR2X25zZWMsCisJCQkJZ3N0QXJyYXkuc3RJdGVtW2ldLnBjTGluZSk7CisJCWlmICgoaSAlIDEwMCkgPT0gMCkKKwkJCW1zbGVlcCgyMCk7CisJfQorCWluZm8oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOworCWdzdEFycmF5LmNvdW50ID0gMDsKKworI2VuZGlmCisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC91c2IvU1JDL2NpbWF4K3VzYl90aW1lLmggYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L3VzYi9TUkMvY2ltYXgrdXNiX3RpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDEyYzY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC91c2IvU1JDL2NpbWF4K3VzYl90aW1lLmgKQEAgLTAsMCArMSw5MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKgorICogQGZpbGUgICAgY2ltYXgrdXNiX3RpbWUuaAorICoKKyAqIEBicmllZiAgIENJTWFYKyBVU0IgRHJpdmVyIGZvciBsaW51eCBiYXNlZCBvcGVyYXRpbmcgc3lzdGVtcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMSAgICBCcnVubyBUb25lbGxpICAgPGJydW5vLnRvbmVsbGlAc21hcmR0di5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgJiBGcmFuY2sgRGVzY291cnMgPGZyYW5jay5kZXNjb3Vyc0BzbWFyZHR2LmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBTbWFyRFRWIEZyYW5jZSwgTGEgQ2lvdGF0CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19DSU1BWFBMVVNfVVNCX1RJTUVfSAorI2RlZmluZSBfX0NJTUFYUExVU19VU0JfVElNRV9ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEluY2x1ZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGVmaW5lcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTUFYX0lURU1TICAgICAxMDAwMDAKKyNkZWZpbmUgTUFYX0xJTkVfU0laRSAgICAxMjgKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRW51bXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTdHJ1Y3R1cmVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGl0ZW1fcyB7CisJc3RydWN0IHRpbWVzcGVjIHN0VGltZTsKKwljaGFyICAgICAgICAgICAgcGNMaW5lW01BWF9MSU5FX1NJWkVdOworfTsKKworc3RydWN0IGl0ZW1fYXJyYXlfcyB7CisJaW50ICBjb3VudDsKKwlpdGVtX3Mgc3RJdGVtW01BWF9JVEVNU107Cit9OworCitleHRlcm4gc3RydWN0IGl0ZW1fYXJyYXlfcyBnc3RBcnJheTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGJyaWVmCisgKiAgIEluaXQgdGltZXN0YW1wLgorICoKKyAqIEBwYXJhbQorICogICBOb25lCisgKgorICogQHJldHVybgorICogICBOb25lLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSW5pdFRpbWVzdGFtcCh2b2lkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGJyaWVmCisgKiAgIFNldCB0aW1lc3RhbXAuCisgKgorICogQHBhcmFtICAgcGNGb3JtYXQKKyAqICAgUHJpbnRmLWxpa2UgZm9ybWF0CisgKgorICogQHJldHVybgorICogICBOb25lLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgU2V0VGltZXN0YW1wKGNvbnN0IGNoYXIgKnBjRm9ybWF0LCAuLi4pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYKKyAqICAgRGlzcGxheSBhbGwgdGltZXN0YW1wcy4KKyAqCisgKiBAcGFyYW0KKyAqICAgTm9uZQorICoKKyAqIEByZXR1cm4KKyAqICAgTm9uZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFNob3dUaW1lc3RhbXAodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC91c2IvZmlybXdhcmUvY2ltYXgrX3VzYmR2Yi5iaW4gYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L3VzYi9maXJtd2FyZS9jaW1heCtfdXNiZHZiLmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTVmZTVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC91c2IvZmlybXdhcmUvY2ltYXgrX3VzYmR2Yi5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC91c2IvZmlybXdhcmUvY2ltYXgrdXNiLmNmZyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvdXNiL2Zpcm13YXJlL2NpbWF4K3VzYi5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3OTJkOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltYXgvdXNiL2Zpcm13YXJlL2NpbWF4K3VzYi5jZmcKQEAgLTAsMCArMSw5NyBAQAorOworOyAqKioqKioqKioqKioqKioqKioqKioqKioKKzsgKiAgSU5JVF9UUy5UWFQgU0NSSVBUICAqCis7ICoqKioqKioqKioqKioqKioqKioqKioqKgorOworOyAqKiogQ0xPU0UgSU5QVVQgKioqCis7CitJTl9TRUwgMHgwMAorOworOyAqKiogQ0xPU0UgT1VQVVQgKioqCis7CitPVVRfU0VMIDB4MDAKKzsKKzsgKioqIFJFU0VUIEZJRk8gKioqCis7CitGSUZPX0NUUkwgMHgwZgorU1lOQ19SVFZfQ1RSTCAweDBmCis7Cis7Cis7ICoqKioqKioqKioqKioqKioqKioqKioqKioKKzsgKiAgSU5JVF9VU0IuVFhUIFNDUklQVCAgKgorOyAqKioqKioqKioqKioqKioqKioqKioqKioqCis7Cis7ICoqKiBFbmRwb2ludCBDb25maWcgKioqCis7CitETUFfQUNDX0VQUwkweDNmCitFUFNfRU5BQkxFIDB4N2YKKzsKKzsgKioqIEZJRk8gQ29udHJvbCAqKioKKzsKK1VTQjJUU19DVFJMCTB4MGYKK1RTMlVTQl9DVFJMCTB4MGYKKzsKKzsgKioqIEZSRVEgQ29udHJvbCAqKioKKzsKK1VTQjJUUzBfUkRMCTB4ODAKK1VTQjJUUzFfUkRMCTB4ODAKKzsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBTZXQgQ0FNIHBvd2VyCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKK0dQSU8wX0RBVEFfT1VUCTB4MDAKKzsKKzsgdW5sb2NrIENGRworQ0ZHXzIJMHgwMAorOworOyAxKSBEVkIvQ0kvQ0krL1NDQVJEIDJzbG90CitDRkdfMQkweDAwCis7Cis7IDIpIFNldCB0aGUgRGVmYXVsdCAicG93ZXIgb2ZmIiBzdGF0ZSBzdWNoIGFzIFZDQ19NT0RBPVZDQ19NT0RCPVZQUHhfTU9EQT1WUFB4X01PREI9J1onCitHUElPMF9ERlQgMHgwMAorOworOyAzKSBTZXQgR1BJTzMgYXMgZXh0ZXJuYWwgcG93ZXIgc3dpdGNoIGRyaXZlcgorR1BJTzBfTUFTS19EQVRBIDB4MDcKKzsKKzsgNCkgU2V0ICJwb3dlciBvbiIgc3RhdGUgKFZDQz1WUFAxPVZQUDI9IDVWKQorR1BJTzBfREFUQV9PVVQJMHgwMQorOworOyA1KSBMb2NrIGNvbmZpZworQ0ZHXzIJMHgwMQorOworOyA2KSBXcml0ZSBpbiB0aGUgR1BJTzBfRElSX1JFRzogZGVmaW5lcyB0aGUgR1BJT3MsIHdoaWNoCis7ICAgIGFyZSB1c2VkIHRvIGRyaXZlIHRoZSBleHRlcm5hbCBwb3dlciBzd2l0Y2gsIGluIG91dHB1dCBtb2RlLgorR1BJTzBfRElSIDB4MDcKKzsKKzsgNykgQ2hlY2sgVkNDRU5hYmxlCis/Q0ZHXzEgMHgyMAorOworOyA4KSBTZXQgJiB3YWl0IGZvciBQY21jaWFPdXRwdXRFbmFibGUKK3xDRkdfMSAweDA4Cis/Q0ZHXzEgMHgwOAorOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBTZXQgUm91dGVyIENBTQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOworR0FQX1JFTU9WRVJfQ0gwX0NUUkwgMHgwQworR0FQX1JFTU9WRVJfQ0gxX0NUUkwgMHgwQworCis7IDkpIENIMCAmIENIMSBmcm9tIENBTSBBICYgQiwgQ0FNIEEgJiBCIGZyb20gQ0gwICYgQ0gxCis7CitST1VURVJfQ0FNX01PRAkweDIxCitST1VURVJfQ0FNX0NICTB4MDAKKzsKKztfV2FpdAkyMDAKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgUk9VVEVSIENBTQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorT1VUX1NFTCAweDAzCis7CitVU0IyVFMwX1JETAkweDgwCitVU0IyVFMxX1JETAkweDgwCis7CitJTl9TRUwgMHgyMgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWF4L3VzYi9maXJtd2FyZS9jaW1heCt1c2JfbXMuY2ZnIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC91c2IvZmlybXdhcmUvY2ltYXgrdXNiX21zLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzM4NDI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1heC91c2IvZmlybXdhcmUvY2ltYXgrdXNiX21zLmNmZwpAQCAtMCwwICsxLDEzNiBAQAorOworOyAqKioqKioqKioqKioqKioqKioqKioqKioKKzsgKiAgSU5JVF9UUy5UWFQgU0NSSVBUICAqCis7ICoqKioqKioqKioqKioqKioqKioqKioqKgorOworOyAqKiogQ0xPU0UgSU5QVVQgKioqCis7CitJTl9TRUwgMHgwMAorOworOyAqKiogQ0xPU0UgT1VQVVQgKioqCis7CitPVVRfU0VMIDB4MDAKKzsKKzsgKioqIFJFU0VUIEZJRk8gKioqCis7CitGSUZPX0NUUkwgMHgwZgorU1lOQ19SVFZfQ1RSTCAweDBmCis7Cis7Cis7ICoqKioqKioqKioqKioqKioqKioqKioqKioKKzsgKiAgSU5JVF9VU0IuVFhUIFNDUklQVCAgKgorOyAqKioqKioqKioqKioqKioqKioqKioqKioqCis7Cis7ICoqKiBFbmRwb2ludCBDb25maWcgKioqCis7CitETUFfQUNDX0VQUwkweDNmCitFUFNfRU5BQkxFIDB4N2YKKzsKKzsgKioqIEZJRk8gQ29udHJvbCAqKioKKzsKK1VTQjJUU19DVFJMCTB4MGYKK1RTMlVTQl9DVFJMCTB4MGYKKzsKKzsgKioqIEZSRVEgQ29udHJvbCAqKioKKzsKK1VTQjJUUzBfUkRMCTB4ODAKK1VTQjJUUzFfUkRMCTB4ODAKKzsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBTZXQgQ0FNIHBvd2VyCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKK0dQSU8wX0RBVEFfT1VUCTB4MDAKKzsKKzsgdW5sb2NrIENGRworQ0ZHXzIJMHgwMAorOworOyAxKSBEVkIvQ0kvQ0krL1NDQVJEIDJzbG90CitDRkdfMQkweDAwCis7Cis7IDIpIFNldCB0aGUgRGVmYXVsdCAicG93ZXIgb2ZmIiBzdGF0ZSBzdWNoIGFzIFZDQ19NT0RBPVZDQ19NT0RCPVZQUHhfTU9EQT1WUFB4X01PREI9J1onCitHUElPMF9ERlQgMHgwMAorOworOyAzKSBTZXQgR1BJTzMgYXMgZXh0ZXJuYWwgcG93ZXIgc3dpdGNoIGRyaXZlcgorR1BJTzBfTUFTS19EQVRBIDB4MDcKKzsKKzsgNCkgU2V0ICJwb3dlciBvbiIgc3RhdGUgKFZDQz1WUFAxPVZQUDI9IDVWKQorR1BJTzBfREFUQV9PVVQJMHgwMQorOworOyA1KSBMb2NrIGNvbmZpZworQ0ZHXzIJMHgwMQorOworOyA2KSBXcml0ZSBpbiB0aGUgR1BJTzBfRElSX1JFRzogZGVmaW5lcyB0aGUgR1BJT3MsIHdoaWNoCis7ICAgIGFyZSB1c2VkIHRvIGRyaXZlIHRoZSBleHRlcm5hbCBwb3dlciBzd2l0Y2gsIGluIG91dHB1dCBtb2RlLgorR1BJTzBfRElSIDB4MDcKKzsKKzsgNykgQ2hlY2sgVkNDRU5hYmxlCis/Q0ZHXzEgMHgyMAorOworOyA4KSBTZXQgJiB3YWl0IGZvciBQY21jaWFPdXRwdXRFbmFibGUKK3xDRkdfMSAweDA4Cis/Q0ZHXzEgMHgwOAorOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBTZXQgUm91dGVyIENBTQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOworR0FQX1JFTU9WRVJfQ0gwX0NUUkwgMHgwQworR0FQX1JFTU9WRVJfQ0gxX0NUUkwgMHgwQworCis7IDkpIENIMCAmIENIMSBmcm9tIENBTSBBICYgQiwgQ0FNIEEgJiBCIGZyb20gQ0gwICYgQ0gxCis7CitST1VURVJfQ0FNX01PRAkweDIxCitST1VURVJfQ0FNX0NICTB4MDAKKzsKKztfV2FpdAkyMDAKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgUk9VVEVSIENBTQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorT1VUX1NFTCAweDAzCis7CitVU0IyVFMwX1JETAkweDgwCitVU0IyVFMxX1JETAkweDgwCis7CitJTl9TRUwgMHgyMgorCis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyAqICBNdWxpU3RyZWFtLlRYVCBTQ1JJUFQgICoKKzsgKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7Cis7ICoqKiBDTE9TRSBJTlBVVCAqKioKKzsKK0lOX1NFTCAweDAwCis7Cis7ICoqKiBDTE9TRSBPVVBVVCAqKioKKzsKK09VVF9TRUwgMHgwMAorOworOyAqKiogUkVTRVQgRklGTyAqKioKKzsKK0ZJRk9fQ1RSTCAweDBmCitTWU5DX1JUVl9DVFJMIDB4MGYKKzsKKzsgKioqICAgKioqCis7CitDa01hbl9Db25maWcgMHgxZgorQ2tNYW5fU2VsZWN0IDB4MDAKK01FUkdFUl9ESVZfTUlDTEsgMHgwMgorU1lOQ19TWU1CT0wgMHgwZAorUElEX0FORF9TWU5DX1JFTUFQUEVSX0lOVl9DVFJMIDB4MDEKKworRklGT19DVFJMIDB4MGYKK1JPVVRFUl9DQU1fTU9EIDB4MDMKK1JPVVRFUl9DQU1fQ0ggMHg4MAorCitVU0IyVFNfQ1RSTCAweDBmCitUUzJVU0JfQ1RSTCAweDBmCitVU0IyVFMwX1JETCAweDIwCitVU0IyVFMxX1JETCAweDIwCisKK09VVF9TRUwgMHgwMworSU5fU0VMIDB4MjIKKzsKKzsgKioqKioqKioqKioqKioqKioqKioqKioqCis7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWN1L2R2Yl9jYV9lbjUwMjIxX2NpbWN1LmMgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWN1L2R2Yl9jYV9lbjUwMjIxX2NpbWN1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdiZWM0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY2kvY2ltY3UvZHZiX2NhX2VuNTAyMjFfY2ltY3UuYwpAQCAtMCwwICsxLDIyMTAgQEAKKy8qCisgKiBkdmJfY2EuYzogZ2VuZXJpYyBEVkIgZnVuY3Rpb25zIGZvciBFTjUwMjIxIENBTSBpbnRlcmZhY2VzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEFuZHJldyBkZSBRdWluY2V5CisgKgorICogUGFydHMgb2YgdGhpcyBmaWxlIHdlcmUgYmFzZWQgb24gc291cmNlcyBhcyBmb2xsb3dzOgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSYWxwaCBNZXR6bGVyIDxyamttQG1ldHpsZXJicm9zLmRlPgorICoKKyAqIGJhc2VkIG9uIGNvZGU6CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDIgUmFscGggIE1ldHpsZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAmIE1hcmN1cyBNZXR6bGVyIGZvciBjb252ZXJnZW5jZSBpbnRlZ3JhdGVkIG1lZGlhIEdtYkgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogT3IsIHBvaW50IHlvdXIgYnJvd3NlciB0byBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisKKyNpbmNsdWRlICJkdmJfY2FfZW41MDIyMV9jaW1jdS5oIgorI2luY2x1ZGUgIi4uL2NpbWF4L2R2Yl9yaW5nYnVmZmVyLmgiCisKKyNkZWZpbmUgUkVBRF9MUERVX1BLVAorCitzdGF0aWMgaW50IGR2Yl9jYV9lbjUwMjIxX2RlYnVnOworCittb2R1bGVfcGFyYW1fbmFtZWQoY2FtbWN1X2RlYnVnLCBkdmJfY2FfZW41MDIyMV9kZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoY2FtbWN1X2RlYnVnLCAiZW5hYmxlIHZlcmJvc2UgZGVidWcgbWVzc2FnZXMiKTsKKworc3RhdGljIGludCBkdmJfY2FfZW41MDIyMV91c2xlZXAgPSA4MDA7CisKK21vZHVsZV9wYXJhbV9uYW1lZChjYW1tY3VfdXNsZWVwLCBkdmJfY2FfZW41MDIyMV91c2xlZXAsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNhbW1jdV91c2xlZXAsICJlbmFibGUgc2xlZXAiKTsKKworc3RhdGljIGludCBkdmJfY2FfY2lwbHVzX2VuYWJsZSA9IDA7Cittb2R1bGVfcGFyYW1fbmFtZWQoY2lwbHVzX2VuYWJsZSwgZHZiX2NhX2NpcGx1c19lbmFibGUsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNpcGx1c19lbmFibGUsICJnZXQgY2kgcGx1cyBlbmFibGUiKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBkdmJfY2FfY2lfcHJvZmlyZSA9IDA7Cittb2R1bGVfcGFyYW1fbmFtZWQoY2lfcHJvZmlyZSwgZHZiX2NhX2NpX3Byb2ZpcmUsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNpX3Byb2ZpcmUsICJnZXQgY2kgcGx1cyBwcm9maXJlIik7CisKKyNkZWZpbmUgZHByaW50ayBpZiAoZHZiX2NhX2VuNTAyMjFfZGVidWcpIHByaW50aworCisjZGVmaW5lIElOSVRfVElNRU9VVF9TRUNTIDEwCisKKyNkZWZpbmUgSE9TVF9MSU5LX0JVRl9TSVpFIDB4MjAwCisKKyNkZWZpbmUgUlhfQlVGRkVSX1NJWkUgNjU1MzUKKworI2RlZmluZSBNQVhfUlhfUEFDS0VUU19QRVJfSVRFUkFUSU9OIDEwCisKKyNkZWZpbmUgQ1RSTElGX0RBVEEgICAgICAwCisjZGVmaW5lIENUUkxJRl9DT01NQU5EICAgMQorI2RlZmluZSBDVFJMSUZfU1RBVFVTICAgIDEKKyNkZWZpbmUgQ1RSTElGX1NJWkVfTE9XICAyCisjZGVmaW5lIENUUkxJRl9TSVpFX0hJR0ggMworCisjZGVmaW5lIENNRFJFR19IQyAgICAgICAgMQkvKiBIb3N0IGNvbnRyb2wgKi8KKyNkZWZpbmUgQ01EUkVHX1NXICAgICAgICAyCS8qIFNpemUgd3JpdGUgKi8KKyNkZWZpbmUgQ01EUkVHX1NSICAgICAgICA0CS8qIFNpemUgcmVhZCAqLworI2RlZmluZSBDTURSRUdfUlMgICAgICAgIDgJLyogUmVzZXQgaW50ZXJmYWNlICovCisjZGVmaW5lIENNRFJFR19GUklFICAgMHg0MAkvKiBFbmFibGUgRlIgaW50ZXJydXB0ICovCisjZGVmaW5lIENNRFJFR19EQUlFICAgMHg4MAkvKiBFbmFibGUgREEgaW50ZXJydXB0ICovCisjZGVmaW5lIElSUUVOIChDTURSRUdfREFJRSkKKworI2RlZmluZSBTVEFUVVNSRUdfUkUgICAgIDEJLyogcmVhZCBlcnJvciAqLworI2RlZmluZSBTVEFUVVNSRUdfV0UgICAgIDIJLyogd3JpdGUgZXJyb3IgKi8KKyNkZWZpbmUgU1RBVFVTUkVHX0ZSICAweDQwCS8qIG1vZHVsZSBmcmVlICovCisjZGVmaW5lIFNUQVRVU1JFR19EQSAgMHg4MAkvKiBkYXRhIGF2YWlsYWJsZSAqLworI2RlZmluZSBTVEFUVVNSRUdfVFhFUlIgKFNUQVRVU1JFR19SRXxTVEFUVVNSRUdfV0UpCS8qIGdlbmVyYWwgdHJhbnNmZXIgZXJyb3IgKi8KKworCisjZGVmaW5lIERWQl9DQV9TTE9UU1RBVEVfTk9ORSAgICAgICAgICAgMAorI2RlZmluZSBEVkJfQ0FfU0xPVFNUQVRFX1VOSU5JVElBTElTRUQgIDEKKyNkZWZpbmUgRFZCX0NBX1NMT1RTVEFURV9SVU5OSU5HICAgICAgICAyCisjZGVmaW5lIERWQl9DQV9TTE9UU1RBVEVfSU5WQUxJRCAgICAgICAgMworI2RlZmluZSBEVkJfQ0FfU0xPVFNUQVRFX1dBSVRSRUFEWSAgICAgIDQKKyNkZWZpbmUgRFZCX0NBX1NMT1RTVEFURV9WQUxJREFURSAgICAgICA1CisjZGVmaW5lIERWQl9DQV9TTE9UU1RBVEVfV0FJVEZSICAgICAgICAgNgorI2RlZmluZSBEVkJfQ0FfU0xPVFNUQVRFX0xJTktJTklUICAgICAgIDcKKworCisvKiBJbmZvcm1hdGlvbiBvbiBhIENBIHNsb3QgKi8KK3N0cnVjdCBkdmJfY2Ffc2xvdCB7CisKKwkvKiBjdXJyZW50IHN0YXRlIG9mIHRoZSBDQU0gKi8KKwlpbnQgc2xvdF9zdGF0ZTsKKworCS8qIG11dGV4IHVzZWQgZm9yIHNlcmlhbGl6aW5nIGFjY2VzcyB0byBvbmUgQ0kgc2xvdCAqLworCXN0cnVjdCBtdXRleCBzbG90X2xvY2s7CisKKwkvKiBOdW1iZXIgb2YgQ0FNQ0hBTkdFUyB0aGF0IGhhdmUgb2NjdXJyZWQgc2luY2UgbGFzdCBwcm9jZXNzaW5nICovCisJYXRvbWljX3QgY2FtY2hhbmdlX2NvdW50OworCisJLyogVHlwZSBvZiBsYXN0IENBTUNIQU5HRSAqLworCWludCBjYW1jaGFuZ2VfdHlwZTsKKworCS8qIGJhc2UgYWRkcmVzcyBvZiBDQU0gY29uZmlnICovCisJdTMyIGNvbmZpZ19iYXNlOworCisJLyogdmFsdWUgdG8gd3JpdGUgaW50byBDb25maWcgQ29udHJvbCByZWdpc3RlciAqLworCXU4IGNvbmZpZ19vcHRpb247CisKKwkvKiBpZiAxLCB0aGUgQ0FNIHN1cHBvcnRzIERBIElSUXMgKi8KKwl1OCBkYV9pcnFfc3VwcG9ydGVkOjE7CisKKyNpZmRlZiBSRUFEX0xQRFVfUEtUCisJLyogT2Zmc2V0IGludG8gY3VycmVudCByaW5nYnVmZmVyIHdoZW4gdXNlciBidWZmZXIgd2FzIG5vdCBiaWcgZW5vdWdoCisJICAgdG8gcmV0dXJuIGVudGlyZSBwa3QgKi8KKwlpbnQgcnhfb2Zmc2V0OworI2VuZGlmCisKKwkvKiBzaXplIG9mIHRoZSBidWZmZXIgdG8gdXNlIHdoZW4gdGFsa2luZyB0byB0aGUgQ0FNICovCisJaW50IGxpbmtfYnVmX3NpemU7CisKKwkvKiBidWZmZXIgZm9yIGluY29taW5nIHBhY2tldHMgKi8KKwlzdHJ1Y3QgZHZiX3JpbmdidWZmZXIgcnhfYnVmZmVyOworCisJLyogdGltZXIgdXNlZCBkdXJpbmcgdmFyaW91cyBzdGF0ZXMgb2YgdGhlIHNsb3QgKi8KKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Cit9OworCisvKiBQcml2YXRlIENBLWludGVyZmFjZSBpbmZvcm1hdGlvbiAqLworc3RydWN0IGR2Yl9jYV9wcml2YXRlIHsKKwlzdHJ1Y3Qga3JlZiByZWZjb3VudDsKKworCS8qIHBvaW50ZXIgYmFjayB0byB0aGUgcHVibGljIGRhdGEgc3RydWN0dXJlICovCisJc3RydWN0IGR2Yl9jYV9lbjUwMjIxX2NpbWN1ICpwdWI7CisKKwkvKiB0aGUgRFZCIGRldmljZSAqLworCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXY7CisKKwkvKiBGbGFncyBkZXNjcmliaW5nIHRoZSBpbnRlcmZhY2UgKERWQl9DQV9GTEFHXyopICovCisJdTMyIGZsYWdzOworCisJLyogbnVtYmVyIG9mIHNsb3RzIHN1cHBvcnRlZCBieSB0aGlzIENBIGludGVyZmFjZSAqLworCXVuc2lnbmVkIGludCBzbG90X2NvdW50OworCisJLyogaW5mb3JtYXRpb24gb24gZWFjaCBzbG90ICovCisJc3RydWN0IGR2Yl9jYV9zbG90ICpzbG90X2luZm87CisKKwkvKiB3YWl0IHF1ZXVlcyBmb3IgcmVhZCgpIGFuZCB3cml0ZSgpIG9wZXJhdGlvbnMgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3F1ZXVlOworCisJLyogUElEIG9mIHRoZSBtb25pdG9yaW5nIHRocmVhZCAqLworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGhyZWFkOworCisJLyogRmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBDQSBkZXZpY2UgaXMgb3BlbiAqLworCXVuc2lnbmVkIGludCBvcGVuOjE7CisKKwkvKiBGbGFnIGluZGljYXRpbmcgdGhlIHRocmVhZCBzaG91bGQgd2FrZSB1cCBub3cgKi8KKwl1bnNpZ25lZCBpbnQgd2FrZXVwOjE7CisKKwkvKiBEZWxheSB0aGUgbWFpbiB0aHJlYWQgc2hvdWxkIHVzZSAqLworCXVuc2lnbmVkIGxvbmcgZGVsYXk7CisKKwkvKiBTbG90IHRvIHN0YXJ0IGxvb2tpbmcgZm9yIGRhdGEgdG8gcmVhZCBmcm9tIGluIHRoZSBuZXh0IHVzZXItc3BhY2UgcmVhZCBvcGVyYXRpb24gKi8KKwlpbnQgbmV4dF9yZWFkX3Nsb3Q7CisKKwkvKiBtdXRleCBzZXJpYWxpemluZyBpb2N0bHMgKi8KKwlzdHJ1Y3QgbXV0ZXggaW9jdGxfbXV0ZXg7Cit9OworCitzdGF0aWMgdm9pZCBkdmJfY2FfcHJpdmF0ZV9mcmVlKHN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqY2EpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlkdmJfdW5yZWdpc3Rlcl9kZXZpY2UoY2EtPmR2YmRldik7CisJZm9yIChpID0gMDsgaSA8IGNhLT5zbG90X2NvdW50OyBpKyspCisJCXZmcmVlKGNhLT5zbG90X2luZm9baV0ucnhfYnVmZmVyLmRhdGEpOworCisJa2ZyZWUoY2EtPnNsb3RfaW5mbyk7CisJa2ZyZWUoY2EpOworfQorCitzdGF0aWMgdm9pZCBkdmJfY2FfcHJpdmF0ZV9yZWxlYXNlKHN0cnVjdCBrcmVmICpyZWYpCit7CisJc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSA9IGNvbnRhaW5lcl9vZihyZWYsIHN0cnVjdCBkdmJfY2FfcHJpdmF0ZSwgcmVmY291bnQpOworCWR2Yl9jYV9wcml2YXRlX2ZyZWUoY2EpOworfQorCitzdGF0aWMgdm9pZCBkdmJfY2FfcHJpdmF0ZV9nZXQoc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSkKK3sKKwlrcmVmX2dldCgmY2EtPnJlZmNvdW50KTsKK30KKworc3RhdGljIHZvaWQgZHZiX2NhX3ByaXZhdGVfcHV0KHN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqY2EpCit7CisJa3JlZl9wdXQoJmNhLT5yZWZjb3VudCwgZHZiX2NhX3ByaXZhdGVfcmVsZWFzZSk7Cit9CisKK3N0YXRpYyB2b2lkIGR2Yl9jYV9lbjUwMjIxX3RocmVhZF93YWtldXAoc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSk7CitzdGF0aWMgaW50IGR2Yl9jYV9lbjUwMjIxX3JlYWRfZGF0YShzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKmNhLCBpbnQgc2xvdCwgdTggKiBlYnVmLCBpbnQgZWNvdW50KTsKK3N0YXRpYyBpbnQgZHZiX2NhX2VuNTAyMjFfd3JpdGVfZGF0YShzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKmNhLCBpbnQgc2xvdCwgdTggKiBlYnVmLCBpbnQgZWNvdW50KTsKKworCisvKioKKyAqIFNhZmVseSBmaW5kIG5lZWRsZSBpbiBoYXlzdGFjay4KKyAqCisgKiBAaGF5c3RhY2s6IEJ1ZmZlciB0byBsb29rIGluLgorICogQGhsZW46IE51bWJlciBvZiBieXRlcyBpbiBoYXlzdGFjay4KKyAqIEBuZWVkbGU6IEJ1ZmZlciB0byBmaW5kLgorICogQG5sZW46IE51bWJlciBvZiBieXRlcyBpbiBuZWVkbGUuCisgKiBAcmV0dXJuIFBvaW50ZXIgaW50byBoYXlzdGFjayBuZWVkbGUgd2FzIGZvdW5kIGF0LCBvciBOVUxMIGlmIG5vdCBmb3VuZC4KKyAqLworc3RhdGljIGNoYXIgKmZpbmRzdHIoY2hhciAqIGhheXN0YWNrLCBpbnQgaGxlbiwgY2hhciAqIG5lZWRsZSwgaW50IG5sZW4pCit7CisJaW50IGk7CisKKwlpZiAoaGxlbiA8IG5sZW4pCisJCXJldHVybiBOVUxMOworCisJZm9yIChpID0gMDsgaSA8PSBobGVuIC0gbmxlbjsgaSsrKSB7CisJCWlmICghc3RybmNtcChoYXlzdGFjayArIGksIG5lZWRsZSwgbmxlbikpCisJCQlyZXR1cm4gaGF5c3RhY2sgKyBpOworCX0KKworCXJldHVybiBOVUxMOworfQorCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qIEVONTAyMjEgcGh5c2ljYWwgaW50ZXJmYWNlIGZ1bmN0aW9ucyAqLworCisKKy8qKgorICogZHZiX2NhX2VuNTAyMjFfY2hlY2tfY2Ftc3RhdHVzIC0gQ2hlY2sgQ0FNIHN0YXR1cy4KKyAqLworc3RhdGljIGludCBkdmJfY2FfZW41MDIyMV9jaGVja19jYW1zdGF0dXMoc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSwgaW50IHNsb3QpCit7CisJaW50IHNsb3Rfc3RhdHVzOworCWludCBjYW1fcHJlc2VudF9ub3c7CisJaW50IGNhbV9jaGFuZ2VkOworCisJLyogSVJRIG1vZGUgKi8KKwlpZiAoY2EtPmZsYWdzICYgRFZCX0NBX0VONTAyMjFfRkxBR19JUlFfQ0FNQ0hBTkdFKSB7CisJCXJldHVybiAoYXRvbWljX3JlYWQoJmNhLT5zbG90X2luZm9bc2xvdF0uY2FtY2hhbmdlX2NvdW50KSAhPSAwKTsKKwl9CisKKwkvKiBwb2xsIG1vZGUgKi8KKwlzbG90X3N0YXR1cyA9IGNhLT5wdWItPnBvbGxfc2xvdF9zdGF0dXMoY2EtPnB1Yiwgc2xvdCwgY2EtPm9wZW4pOworCisJY2FtX3ByZXNlbnRfbm93ID0gKHNsb3Rfc3RhdHVzICYgRFZCX0NBX0VONTAyMjFfUE9MTF9DQU1fUFJFU0VOVCkgPyAxIDogMDsKKwljYW1fY2hhbmdlZCA9IChzbG90X3N0YXR1cyAmIERWQl9DQV9FTjUwMjIxX1BPTExfQ0FNX0NIQU5HRUQpID8gMSA6IDA7CisJaWYgKCFjYW1fY2hhbmdlZCkgeworCQlpbnQgY2FtX3ByZXNlbnRfb2xkID0gKGNhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9zdGF0ZSAhPSBEVkJfQ0FfU0xPVFNUQVRFX05PTkUpOworCQljYW1fY2hhbmdlZCA9IChjYW1fcHJlc2VudF9ub3cgIT0gY2FtX3ByZXNlbnRfb2xkKTsKKwl9CisKKwlpZiAoY2FtX2NoYW5nZWQpIHsKKwkJaWYgKCFjYW1fcHJlc2VudF9ub3cpIHsKKwkJCWNhLT5zbG90X2luZm9bc2xvdF0uY2FtY2hhbmdlX3R5cGUgPSBEVkJfQ0FfRU41MDIyMV9DQU1DSEFOR0VfUkVNT1ZFRDsKKwkJfSBlbHNlIHsKKwkJCWNhLT5zbG90X2luZm9bc2xvdF0uY2FtY2hhbmdlX3R5cGUgPSBEVkJfQ0FfRU41MDIyMV9DQU1DSEFOR0VfSU5TRVJURUQ7CisJCX0KKwkJYXRvbWljX3NldCgmY2EtPnNsb3RfaW5mb1tzbG90XS5jYW1jaGFuZ2VfY291bnQsIDEpOworCX0gZWxzZSB7CisJCWlmICgoY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlID09IERWQl9DQV9TTE9UU1RBVEVfV0FJVFJFQURZKSAmJgorCQkgICAgKHNsb3Rfc3RhdHVzICYgRFZCX0NBX0VONTAyMjFfUE9MTF9DQU1fUkVBRFkpKSB7CisJCQkvLyBtb3ZlIHRvIHZhbGlkYXRlIHN0YXRlIGlmIHJlc2V0IGlzIGNvbXBsZXRlZAorCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlID0gRFZCX0NBX1NMT1RTVEFURV9WQUxJREFURTsKKwkJfQorCX0KKworCXJldHVybiBjYW1fY2hhbmdlZDsKK30KKworCisvKioKKyAqIGR2Yl9jYV9lbjUwMjIxX3dhaXRfaWZfc3RhdHVzIC0gV2FpdCBmb3IgZmxhZ3MgdG8gYmVjb21lIHNldCBvbiB0aGUgU1RBVFVTCisgKgkgcmVnaXN0ZXIgb24gYSBDQU0gaW50ZXJmYWNlLCBjaGVja2luZyBmb3IgZXJyb3JzIGFuZCB0aW1lb3V0LgorICoKKyAqIEBjYTogQ0EgaW5zdGFuY2UuCisgKiBAc2xvdDogU2xvdCBvbiBpbnRlcmZhY2UuCisgKiBAd2FpdGZvcjogRmxhZ3MgdG8gd2FpdCBmb3IuCisgKiBAdGltZW91dF9tczogVGltZW91dCBpbiBtaWxsaXNlY29uZHMuCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIG5vbnplcm8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgZHZiX2NhX2VuNTAyMjFfd2FpdF9pZl9zdGF0dXMoc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSwgaW50IHNsb3QsCisJCQkJCSB1OCB3YWl0Zm9yLCBpbnQgdGltZW91dF9oeikKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJdW5zaWduZWQgbG9uZyBzdGFydDsKKworCWRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBsb29wIHVudGlsIHRpbWVvdXQgZWxhcHNlZCAqLworCXN0YXJ0ID0gamlmZmllczsKKwl0aW1lb3V0ID0gamlmZmllcyArIHRpbWVvdXRfaHo7CisJd2hpbGUgKDEpIHsKKwkJLyogcmVhZCB0aGUgc3RhdHVzIGFuZCBjaGVjayBmb3IgZXJyb3IgKi8KKwkJaW50IHJlcyA9IGNhLT5wdWItPnJlYWRfY2FtX2NvbnRyb2woY2EtPnB1Yiwgc2xvdCwgQ1RSTElGX1NUQVRVUyk7CisJCWlmIChyZXMgPCAwKQorCQkJcmV0dXJuIC1FSU87CisKKwkJLyogaWYgd2UgZ290IHRoZSBmbGFncywgaXQgd2FzIHN1Y2Nlc3NmdWwhICovCisJCWlmIChyZXMgJiB3YWl0Zm9yKSB7CisJCQlkcHJpbnRrKCIlcyBzdWNjZWVkZWQgdGltZW91dDolbHVcbiIsIF9fZnVuY19fLCBqaWZmaWVzIC0gc3RhcnQpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBjaGVjayBmb3IgdGltZW91dCAqLworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJYnJlYWs7CisJCX0KKworCQkvKiB3YWl0IGZvciBhIGJpdCAqLworCQltc2xlZXAoMSk7CisJfQorCisJcHJpbnRrKCIlcyBmYWlsZWQgdGltZW91dDolbHVcbiIsIF9fZnVuY19fLCBqaWZmaWVzIC0gc3RhcnQpOworCisJLyogaWYgd2UgZ2V0IGhlcmUsIHdlJ3ZlIHRpbWVkIG91dCAqLworCXJldHVybiAtRVRJTUVET1VUOworfQorCisKKy8qKgorICogZHZiX2NhX2VuNTAyMjFfbGlua19pbml0IC0gSW5pdGlhbGlzZSB0aGUgbGluayBsYXllciBjb25uZWN0aW9uIHRvIGEgQ0FNLgorICoKKyAqIEBjYTogQ0EgaW5zdGFuY2UuCisgKiBAc2xvdDogU2xvdCBpZC4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcywgbm9uemVybyBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGR2Yl9jYV9lbjUwMjIxX2xpbmtfaW5pdChzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKmNhLCBpbnQgc2xvdCkKK3sKKwlpbnQgcmV0OworCWludCBidWZfc2l6ZTsKKwl1OCBidWZbMl07CisKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOworCisJLyogd2UnbGwgYmUgZGV0ZXJtaW5pbmcgdGhlc2UgZHVyaW5nIHRoaXMgZnVuY3Rpb24gKi8KKwljYS0+c2xvdF9pbmZvW3Nsb3RdLmRhX2lycV9zdXBwb3J0ZWQgPSAwOworI2lmZGVmIFJFQURfTFBEVV9QS1QKKwljYS0+c2xvdF9pbmZvW3Nsb3RdLnJ4X29mZnNldCA9IDA7CisjZW5kaWYKKwkvKiBzZXQgdGhlIGhvc3QgbGluayBidWZmZXIgc2l6ZSB0ZW1wb3JhcmlseS4gaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIHRoZQorCSAqIHJlYWwgbmVnb3RpYXRlZCBzaXplIGxhdGVyLiAqLworCWNhLT5zbG90X2luZm9bc2xvdF0ubGlua19idWZfc2l6ZSA9IDI7CisKKwkvKiByZWFkIHRoZSBidWZmZXIgc2l6ZSBmcm9tIHRoZSBDQU0gKi8KKwlpZiAoKHJldCA9IGNhLT5wdWItPndyaXRlX2NhbV9jb250cm9sKGNhLT5wdWIsIHNsb3QsIENUUkxJRl9DT01NQU5ELCBJUlFFTiB8IENNRFJFR19TUikpICE9IDApCisJCXJldHVybiByZXQ7CisJaWYgKChyZXQgPSBkdmJfY2FfZW41MDIyMV93YWl0X2lmX3N0YXR1cyhjYSwgc2xvdCwgU1RBVFVTUkVHX0RBLCBIWiAvIDEwKSkgIT0gMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAoKHJldCA9IGR2Yl9jYV9lbjUwMjIxX3JlYWRfZGF0YShjYSwgc2xvdCwgYnVmLCAyKSkgIT0gMikKKwkJcmV0dXJuIC1FSU87CisJaWYgKChyZXQgPSBjYS0+cHViLT53cml0ZV9jYW1fY29udHJvbChjYS0+cHViLCBzbG90LCBDVFJMSUZfQ09NTUFORCwgSVJRRU4pKSAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJLyogc3RvcmUgaXQsIGFuZCBjaG9vc2UgdGhlIG1pbmltdW0gb2Ygb3VyIGJ1ZmZlciBhbmQgdGhlIENBTSdzIGJ1ZmZlciBzaXplICovCisJYnVmX3NpemUgPSAoYnVmWzBdIDw8IDgpIHwgYnVmWzFdOworCWlmIChidWZfc2l6ZSA+IEhPU1RfTElOS19CVUZfU0laRSkKKwkJYnVmX3NpemUgPSBIT1NUX0xJTktfQlVGX1NJWkU7CisJY2EtPnNsb3RfaW5mb1tzbG90XS5saW5rX2J1Zl9zaXplID0gYnVmX3NpemU7CisJYnVmWzBdID0gYnVmX3NpemUgPj4gODsKKwlidWZbMV0gPSBidWZfc2l6ZSAmIDB4ZmY7CisJZHByaW50aygiQ2hvc2VuIGxpbmsgYnVmZmVyIHNpemUgb2YgJWlcbiIsIGJ1Zl9zaXplKTsKKworCS8qIHdyaXRlIHRoZSBidWZmZXIgc2l6ZSB0byB0aGUgQ0FNICovCisJaWYgKChyZXQgPSBjYS0+cHViLT53cml0ZV9jYW1fY29udHJvbChjYS0+cHViLCBzbG90LCBDVFJMSUZfQ09NTUFORCwgSVJRRU4gfCBDTURSRUdfU1cpKSAhPSAwKQorCQlyZXR1cm4gcmV0OworCWlmICgocmV0ID0gZHZiX2NhX2VuNTAyMjFfd2FpdF9pZl9zdGF0dXMoY2EsIHNsb3QsIFNUQVRVU1JFR19GUiwgSFogLyAxMCkpICE9IDApCisJCXJldHVybiByZXQ7CisJaWYgKChyZXQgPSBkdmJfY2FfZW41MDIyMV93cml0ZV9kYXRhKGNhLCBzbG90LCBidWYsIDIpKSAhPSAyKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAoKHJldCA9IGNhLT5wdWItPndyaXRlX2NhbV9jb250cm9sKGNhLT5wdWIsIHNsb3QsIENUUkxJRl9DT01NQU5ELCBJUlFFTikpICE9IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBzdWNjZXNzICovCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZHZiX2NhX2VuNTAyMjFfcmVhZF90dXBsZSAtIFJlYWQgYSB0dXBsZSBmcm9tIGF0dHJpYnV0ZSBtZW1vcnkuCisgKgorICogQGNhOiBDQSBpbnN0YW5jZS4KKyAqIEBzbG90OiBTbG90IGlkLgorICogQGFkZHJlc3M6IEFkZHJlc3MgdG8gcmVhZCBmcm9tLiBVcGRhdGVkLgorICogQHR1cGxlVHlwZTogVHVwbGUgaWQgYnl0ZS4gVXBkYXRlZC4KKyAqIEB0dXBsZUxlbmd0aDogVHVwbGUgbGVuZ3RoLiBVcGRhdGVkLgorICogQHR1cGxlOiBEZXN0IGJ1ZmZlciBmb3IgdHVwbGUgKG11c3QgYmUgMjU2IGJ5dGVzKS4gVXBkYXRlZC4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcywgbm9uemVybyBvbiBlcnJvci4KKyAqLworc3RhdGljIGludCBkdmJfY2FfZW41MDIyMV9yZWFkX3R1cGxlKHN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqY2EsIGludCBzbG90LAorCQkJCSAgICAgaW50ICphZGRyZXNzLCBpbnQgKnR1cGxlVHlwZSwgaW50ICp0dXBsZUxlbmd0aCwgdTggKiB0dXBsZSkKK3sKKwlpbnQgaTsKKwlpbnQgX3R1cGxlVHlwZTsKKwlpbnQgX3R1cGxlTGVuZ3RoOworCWludCBfYWRkcmVzcyA9ICphZGRyZXNzOworCisJLyogZ3JhYiB0aGUgbmV4dCB0dXBsZSBsZW5ndGggYW5kIHR5cGUgKi8KKwltc2xlZXAoMTApOworCWlmICgoX3R1cGxlVHlwZSA9IGNhLT5wdWItPnJlYWRfYXR0cmlidXRlX21lbShjYS0+cHViLCBzbG90LCBfYWRkcmVzcykpIDwgMCkgeworCQlwcmludGsoInJlYWRfYXR0cmlidXRlX21lbSBlcnJvclxyXG4iKTsKKwkJcmV0dXJuIF90dXBsZVR5cGU7CisJfQorCisJaWYgKF90dXBsZVR5cGUgPT0gMHhmZikgeworCQlwcmludGsoIkVORCBPRiBDSEFJTiBUVVBMRSB0eXBlOjB4JXhcbiIsIF90dXBsZVR5cGUpOworCQkqYWRkcmVzcyArPSAyOworCQkqdHVwbGVUeXBlID0gX3R1cGxlVHlwZTsKKwkJKnR1cGxlTGVuZ3RoID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCW1zbGVlcCgxMCk7CisJaWYgKChfdHVwbGVMZW5ndGggPSBjYS0+cHViLT5yZWFkX2F0dHJpYnV0ZV9tZW0oY2EtPnB1Yiwgc2xvdCwgX2FkZHJlc3MgKyAyKSkgPCAwKQorCQlyZXR1cm4gX3R1cGxlTGVuZ3RoOworCV9hZGRyZXNzICs9IDQ7CisKKwlkcHJpbnRrKCJUVVBMRSB0eXBlOjB4JXggbGVuZ3RoOiVpXG4iLCBfdHVwbGVUeXBlLCBfdHVwbGVMZW5ndGgpOworCW1zbGVlcCgxMCk7CisKKwkvKiByZWFkIGluIHRoZSB3aG9sZSB0dXBsZSAqLworCWZvciAoaSA9IDA7IGkgPCBfdHVwbGVMZW5ndGg7IGkrKykgeworCSAgICBtc2xlZXAoMTApOworCQl0dXBsZVtpXSA9IGNhLT5wdWItPnJlYWRfYXR0cmlidXRlX21lbShjYS0+cHViLCBzbG90LCBfYWRkcmVzcyArIChpICogMikpOworCQlwcmludGsoIiAgMHglMDJ4OiAweCUwMnggJWNcbiIsCisJCQlpLCB0dXBsZVtpXSAmIDB4ZmYsCisJCQkoKHR1cGxlW2ldID4gMzEpICYmICh0dXBsZVtpXSA8IDEyNykpID8gdHVwbGVbaV0gOiAnLicpOworCX0KKwlfYWRkcmVzcyArPSAoX3R1cGxlTGVuZ3RoICogMik7CisKKwkvLyBzdWNjZXNzCisJKnR1cGxlVHlwZSA9IF90dXBsZVR5cGU7CisJKnR1cGxlTGVuZ3RoID0gX3R1cGxlTGVuZ3RoOworCSphZGRyZXNzID0gX2FkZHJlc3M7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlQ2lwbHVzQ29tcGF0aWJpbGl0eShjaGFyICp0dXBsZSwgaW50IGxlbiwgaW50ICpjaV9wbHVzX2VuYWJsZWQpCit7CisJY2hhciBmbGFnID0gJysnOworCWludCBudW1iZXI7CisJaW50IGk7CisKKwludW1iZXIgPSAwOworCWlmICh0dXBsZVswXSA9PSAnMCcpIHsKKwkJZmxhZyA9ICcwJzsKKwl9IGVsc2UgaWYgKHR1cGxlWzBdID09ICcqJykgeworCQlmbGFnID0gJyonOworCX0gZWxzZSB7CisJCWZsYWcgPSAnKyc7CisJfQorLy8gICAgcHJpbnRrKCItLWZsYWdbJWNdLS0tLVxyXG4iLCBmbGFnKTsKKy8qIEV4cGVjdGVkIG9uZSBvciBtb3JlIGRlY2ltYWwgZGlnaXRzICovCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCXsKKwkJaWYgKHR1cGxlW2ldID49ICcwJyAmJiB0dXBsZVtpXSA8PSAnOScpIHsKKwkJCW51bWJlciAqPSAxMDsKKwkJCW51bWJlciArPSB0dXBsZVtpXSAtICcwJzsKKwkJCXByaW50aygiLS10dXBsZVslZF09WyVjXS0tLS1cclxuIiwgaSwgdHVwbGVbaV0pOworCQl9IGVsc2UgaWYgKHR1cGxlW2ldID09ICcqJyB8fCB0dXBsZVtpXSA9PSAnKycgfHwgdHVwbGVbaV0gPT0gJy0nKSB7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICgoZmxhZyA9PSAnLScpICYmIChudW1iZXIgPT0gMSkpCisJeworCQkvKiBDSSsgInYxIiBub3Qgc3VwcG9ydGVkICovCisJCXByaW50aygiLS10dXBsZVslc109c2V0IDAtLS0tXHJcbiIsdHVwbGUpOworCQkqY2lfcGx1c19lbmFibGVkID0gMDsKKwl9CisJZWxzZSBpZiAoKGZsYWcgPT0gJyonKSAmJiAobnVtYmVyID49IDEpKQorCXsKKwkJLyogQ0krICJ2MSIgaXMgc3VwcG9ydGVkICovCisJCSpjaV9wbHVzX2VuYWJsZWQgPSAxOworCQlwcmludGsoIi0tdHVwbGVbJXNdPXNldCAxLS0tLVxyXG4iLHR1cGxlKTsKKwl9CisJZWxzZSBpZiAoKGZsYWcgPT0gJysnKSAmJiAobnVtYmVyID09IDEpKQorCXsKKwkJLyogQ0krICJ2MSIgaXMgc3VwcG9ydGVkICovCisJCSpjaV9wbHVzX2VuYWJsZWQgPSAxOworCQlwcmludGsoIi0tdHVwbGVbJXNdPXNldCAxLS0tLVxyXG4iLHR1cGxlKTsKKwl9Cit9CisKKy8qKgorICogQGJyaWVmICAgSGFuZGxlICJjaXByb2YiIGNvbXBhdGliaWx0eSBpdGVtIGluIGNvbXBhdGlibGl0eSBzdHJpbmcKKyAqIEBwYXJhbSAgIGlkZW50aXR5IC0gaXRlbSdzIGlkZW50aXR5CisgKiBAcGFyYW0gICBmbGFnIC0gY29tcGF0aWJpbGl0eSBmbGFnCisgKiBAcGFyYW0gICBjaV9wbHVzX3Byb2ZpbGUgLSB0aGUgdmFsdWUgb2YgY2lwcm9mCisgKi8KK3N0YXRpYyB2b2lkIHBhcnNlQ2lwcm9mQ29tcGF0aWJpbGl0eShjaGFyICp0dXBsZSwgaW50IGxlbiwgdW5zaWduZWQgaW50ICpjaV9wbHVzX3Byb2ZpbGUpCit7CisJaW50IHZhbGlkOworCWludCBudW1iZXI7CisJaW50IGk7CisKKwl2YWxpZCA9IDE7CisJbnVtYmVyID0gMDsKKworCS8qIEV4cGVjdGVkIGRlY2ltYWwgb3IgaGV4YWRlY2ltYWwgbnVtYmVyIChub3RlOiBzdHJpbmcgaXMgbG93ZXJjYXNlKSAqLworCWlmICgobGVuID49IDIpICYmCisJKHR1cGxlWzBdID09ICcwJykgJiYgKHR1cGxlWzFdID09ICd4JykpCisJeworCQkvKiBIZXhhZGVjaW1hbCBwcmVmaXggKi8KKwkJZm9yIChpID0gMjsgKHZhbGlkKSAmJiAoaSA8IGxlbik7IGkrKykKKwkJeworCQkJcHJpbnRrKCItLXR1cGxlWyVkXT1bJWNdLS0tLVxyXG4iLCBpLCB0dXBsZVtpXSk7CisJCQlpZiAodHVwbGVbaV0gPj0gJzAnICYmIHR1cGxlW2ldIDw9ICc5JykKKwkJCXsKKwkJCQludW1iZXIgKj0gMTY7CisJCQkJbnVtYmVyICs9IHR1cGxlW2ldIC0gJzAnOworCQkJfQorCQkJZWxzZSBpZiAodHVwbGVbaV0gPj0gJ2EnICYmIHR1cGxlW2ldIDw9ICdmJykKKwkJCXsKKwkJCQludW1iZXIgKj0gMTY7CisJCQkJbnVtYmVyICs9IHR1cGxlW2ldICsgMTAgLSAnYSc7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJLyogRGVjaW1hbCBleHBlY3RlZCAqLworCQlmb3IgKGkgPSAwOyAodmFsaWQpICYmIChpIDwgbGVuKTsgaSsrKQorCQl7CisJCQlwcmludGsoIi0tdHVwbGVbJWRdPVslY10tLS0tXHJcbiIsIGksIHR1cGxlW2ldKTsKKwkJCWlmICh0dXBsZVtpXSA+PSAnMCcgJiYgdHVwbGVbaV0gPD0gJzknKQorCQkJeworCQkJCW51bWJlciAqPSAxMDsKKwkJCQludW1iZXIgKz0gdHVwbGVbaV0gLSAnMCc7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAodmFsaWQpCisJeworCQlwcmludGsoIi0tdHVwbGVbJXNdIG51bWJlciBbJXVdLVsweCV4XS0tLVxyXG4iLCAgdHVwbGUsIG51bWJlciwgbnVtYmVyKTsKKwkJKmNpX3BsdXNfcHJvZmlsZSA9IG51bWJlcjsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZHZiX2NhX3BhcnNlX2NpaW5mbyhzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKmNhLCBjaGFyICp0dXBsZSwgaW50IGxlbikgeworCisJLyogY2hlY2sgaXQgY29udGFpbnMgdGhlIGNvcnJlY3QgY2lwbHVzPSBzdHJpbmcgKi8KKwljaGFyICogY2lwbHVzX3N0ciA9IGZpbmRzdHIoKGNoYXIgKil0dXBsZSwgbGVuLCAiY2lwbHVzPSIsIDcpOworCisJaWYgKGNpcGx1c19zdHIgPT0gTlVMTCkKKwkgICAgcHJpbnRrKCJjaXBsdXNfc3RyICBlcnJvciAgbGluZVslZF1cclxuIiwgX19MSU5FX18pOworCWVsc2UKKwkgICAgcGFyc2VDaXBsdXNDb21wYXRpYmlsaXR5KGNpcGx1c19zdHIgKyA3LCBsZW4gLSAoY2lwbHVzX3N0ciArIDcgLSB0dXBsZSksICZkdmJfY2FfY2lwbHVzX2VuYWJsZSk7CisKKwljaXBsdXNfc3RyID0gZmluZHN0cigoY2hhciAqKXR1cGxlLCBsZW4sICJjaXByb2Y9IiwgNyk7CisJaWYgKGNpcGx1c19zdHIgPT0gTlVMTCkKKwkgICAgcHJpbnRrKCJjaXByb2Ygc3RyICBlcnJvciAgbGluZVslZF1cclxuIiwgX19MSU5FX18pOworCWVsc2UKKwkgICAgcGFyc2VDaXByb2ZDb21wYXRpYmlsaXR5KGNpcGx1c19zdHIgKyA3LCBsZW4gLSAoY2lwbHVzX3N0ciArIDcgLSB0dXBsZSksICZkdmJfY2FfY2lfcHJvZmlyZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBkdmJfY2FfZW41MDIyMV9wYXJzZV9hdHRyaWJ1dGVzIC0gUGFyc2UgYXR0cmlidXRlIG1lbW9yeSBvZiBhIENBTSBtb2R1bGUsCisgKglleHRyYWN0aW5nIENvbmZpZyByZWdpc3RlciwgYW5kIGNoZWNraW5nIGl0IGlzIGEgRFZCIENBTSBtb2R1bGUuCisgKgorICogQGNhOiBDQSBpbnN0YW5jZS4KKyAqIEBzbG90OiBTbG90IGlkLgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCA8MCBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGR2Yl9jYV9lbjUwMjIxX3BhcnNlX2F0dHJpYnV0ZXMoc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSwgaW50IHNsb3QpCit7CisJaW50IGFkZHJlc3MgPSAwOworCWludCB0dXBsZUxlbmd0aDsKKwlpbnQgdHVwbGVUeXBlOworCXU4IHR1cGxlWzI1N107CisJY2hhciAqZHZiX3N0cjsKKwlpbnQgcmFzejsKKwlpbnQgc3RhdHVzOworCWludCBnb3RfY2Z0YWJsZWVudHJ5ID0gMDsKKwlpbnQgZW5kX2NoYWluID0gMDsKKwlpbnQgaTsKKwl1MTYgbWFuZmlkID0gMDsKKwl1MTYgZGV2aWQgPSAwOworCisKKwkvLyBDSVNUUExfREVWSUNFXzBBCisJaWYgKChzdGF0dXMgPQorCSAgICAgZHZiX2NhX2VuNTAyMjFfcmVhZF90dXBsZShjYSwgc2xvdCwgJmFkZHJlc3MsICZ0dXBsZVR5cGUsICZ0dXBsZUxlbmd0aCwgdHVwbGUpKSA8IDApIHsKKwkgICAgIHByaW50aygicmVhZCB0dXBsZSBlcnJvclxyXG4iKTsKKwkgICAgIHJldHVybiBzdGF0dXM7CisJICAgICB9CisJaWYgKHR1cGxlVHlwZSAhPSAweDFEKSB7CisJCXByaW50aygicmVhZCB0dXBsZVR5cGUgZXJyb3JcclxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8vIENJU1RQTF9ERVZJQ0VfMEMKKwlpZiAoKHN0YXR1cyA9CisJICAgICBkdmJfY2FfZW41MDIyMV9yZWFkX3R1cGxlKGNhLCBzbG90LCAmYWRkcmVzcywgJnR1cGxlVHlwZSwgJnR1cGxlTGVuZ3RoLCB0dXBsZSkpIDwgMCkgeworCSAgICAgcHJpbnRrKCJyZWFkIHR1cGxlVHlwZSBlcnJvciBsaW5lWyVkXVxyXG4iLCBfX0xJTkVfXyk7CisJICAgICByZXR1cm4gc3RhdHVzOworCSB9CisKKwlpZiAodHVwbGVUeXBlICE9IDB4MUMpIHsKKwkgICAgIHByaW50aygicmVhZCB0dXBsZVR5cGUgZXJyb3IgIGxpbmVbJWRdXHJcbiIsIF9fTElORV9fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisKKworCS8vIENJU1RQTF9WRVJTXzEKKwlpZiAoKHN0YXR1cyA9CisJICAgICBkdmJfY2FfZW41MDIyMV9yZWFkX3R1cGxlKGNhLCBzbG90LCAmYWRkcmVzcywgJnR1cGxlVHlwZSwgJnR1cGxlTGVuZ3RoLCB0dXBsZSkpIDwgMCl7CisJICAgICBwcmludGsoImR2YiBjaSBlcnJvciAgbGluZVslZF1cclxuIiwgX19MSU5FX18pOworCSAgICAgcmV0dXJuIHN0YXR1czsKKwkgfQorCisJaWYgKHR1cGxlVHlwZSAhPSAweDE1KSB7CisJCXByaW50aygiZHZiIGNpIGVycm9yICBsaW5lWyVkXVxyXG4iLCBfX0xJTkVfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvL3BhcnNlIGNpcGxzIGFuZCBwcm9mIGluZm8KKwlwcmludGsoImR2YiBjaSBwYXJzZSBjaSAgbGluZVslZF1cclxuIiwgX19MSU5FX18pOworCWR2Yl9jYV9wYXJzZV9jaWluZm8oY2EsIChjaGFyICopdHVwbGUsIHR1cGxlTGVuZ3RoKTsKKworCS8vIENJU1RQTF9NQU5GSUQKKwlpZiAoKHN0YXR1cyA9IGR2Yl9jYV9lbjUwMjIxX3JlYWRfdHVwbGUoY2EsIHNsb3QsICZhZGRyZXNzLCAmdHVwbGVUeXBlLAorCQkJCQkJJnR1cGxlTGVuZ3RoLCB0dXBsZSkpIDwgMCkgeworCQlwcmludGsoImR2YiBjaSBlcnJvciAgbGluZVslZF1cclxuIiwgX19MSU5FX18pOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWlmICh0dXBsZVR5cGUgIT0gMHgyMCl7CisJCXByaW50aygiZHZiIGNpIGVycm9yICBsaW5lWyVkXVxyXG4iLCBfX0xJTkVfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh0dXBsZUxlbmd0aCAhPSA0KSB7CisJCXByaW50aygiZHZiIGNpIGVycm9yICBsaW5lWyVkXVxyXG4iLCBfX0xJTkVfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1hbmZpZCA9ICh0dXBsZVsxXSA8PCA4KSB8IHR1cGxlWzBdOworCWRldmlkID0gKHR1cGxlWzNdIDw8IDgpIHwgdHVwbGVbMl07CisKKworCisJLy8gQ0lTVFBMX0NPTkZJRworCWlmICgoc3RhdHVzID0gZHZiX2NhX2VuNTAyMjFfcmVhZF90dXBsZShjYSwgc2xvdCwgJmFkZHJlc3MsICZ0dXBsZVR5cGUsCisJCQkJCQkmdHVwbGVMZW5ndGgsIHR1cGxlKSkgPCAwKQorCXsKKwkJcHJpbnRrKCJkdmIgY2kgZXJyb3IgIGxpbmVbJWRdXHJcbiIsIF9fTElORV9fKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlpZiAodHVwbGVUeXBlICE9IDB4MUEpIHsKKwkJcHJpbnRrKCJkdmIgY2kgZXJyb3IgIGxpbmVbJWRdXHJcbiIsIF9fTElORV9fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICh0dXBsZUxlbmd0aCA8IDMpIHsKKwkJcHJpbnRrKCJkdmIgY2kgZXJyb3IgIGxpbmVbJWRdXHJcbiIsIF9fTElORV9fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogZXh0cmFjdCB0aGUgY29uZmlnYmFzZSAqLworCXJhc3ogPSB0dXBsZVswXSAmIDM7CisJaWYgKHR1cGxlTGVuZ3RoIDwgKDMgKyByYXN6ICsgMTQpKQorCXsKKwkJcHJpbnRrKCJkdmIgY2kgZXJyb3IgIGxpbmVbJWRdXHJcbiIsIF9fTElORV9fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2EtPnNsb3RfaW5mb1tzbG90XS5jb25maWdfYmFzZSA9IDA7CisJZm9yIChpID0gMDsgaSA8IHJhc3ogKyAxOyBpKyspIHsKKwkJY2EtPnNsb3RfaW5mb1tzbG90XS5jb25maWdfYmFzZSB8PSAodHVwbGVbMiArIGldIDw8ICg4ICogaSkpOworCX0KKworCS8qIGNoZWNrIGl0IGNvbnRhaW5zIHRoZSBjb3JyZWN0IERWQiBzdHJpbmcgKi8KKwlkdmJfc3RyID0gZmluZHN0cigoY2hhciAqKXR1cGxlLCB0dXBsZUxlbmd0aCwgIkRWQl9DSV9WIiwgOCk7CisJaWYgKGR2Yl9zdHIgPT0gTlVMTCl7CisJCXByaW50aygiZHZiIGNpIGVycm9yIDUgbGluZVslZF1cclxuIiwgX19MSU5FX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodHVwbGVMZW5ndGggPCAoKGR2Yl9zdHIgLSAoY2hhciAqKSB0dXBsZSkgKyAxMikpCisJeworCQlwcmludGsoImR2YiBjaSBlcnJvciAgbGluZVslZF1cclxuIiwgX19MSU5FX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKworCS8qIGlzIGl0IGEgdmVyc2lvbiB3ZSBzdXBwb3J0PyAqLworCWlmIChzdHJuY21wKGR2Yl9zdHIgKyA4LCAiMS4wMCIsIDQpKSB7CisJCXByaW50aygiZHZiX2NhIGFkYXB0ZXIgJWQ6IFVuc3VwcG9ydGVkIERWQiBDQU0gbW9kdWxlIHZlcnNpb24gJWMlYyVjJWNcbiIsCisJCSAgICAgICBjYS0+ZHZiZGV2LT5hZGFwdGVyLT5udW0sIGR2Yl9zdHJbOF0sIGR2Yl9zdHJbOV0sIGR2Yl9zdHJbMTBdLCBkdmJfc3RyWzExXSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHByb2Nlc3MgdGhlIENGVEFCTEVfRU5UUlkgdHVwbGVzLCBhbmQgYW55IGFmdGVyIHRob3NlICovCisJd2hpbGUgKCghZW5kX2NoYWluKSAmJiAoYWRkcmVzcyA8IDB4MTAwMCkpIHsKKwkJaWYgKChzdGF0dXMgPSBkdmJfY2FfZW41MDIyMV9yZWFkX3R1cGxlKGNhLCBzbG90LCAmYWRkcmVzcywgJnR1cGxlVHlwZSwKKwkJCQkJCQkmdHVwbGVMZW5ndGgsIHR1cGxlKSkgPCAwKQorCQkJCQkJCXsKKwkJCQlwcmludGsoImR2YiBjaSBlcnJvciAgbGluZVslZF1cclxuIiwgX19MSU5FX18pOworCQkJcmV0dXJuIHN0YXR1czsKKwkJCQkJCQl9CisKKwkJc3dpdGNoICh0dXBsZVR5cGUpIHsKKwkJY2FzZSAweDFCOgkvLyBDSVNUUExfQ0ZUQUJMRV9FTlRSWQorCQkJaWYgKHR1cGxlTGVuZ3RoIDwgKDIgKyAxMSArIDE3KSkgeworCQkJCXByaW50aygiZHZiIGNpIGVycm9yIDB4MWIgZXJyb3IgIGxpbmVbJWRdXHJcbiIsIF9fTElORV9fKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogaWYgd2UndmUgYWxyZWFkeSBwYXJzZWQgb25lLCBqdXN0IHVzZSBpdCAqLworCQkJaWYgKGdvdF9jZnRhYmxlZW50cnkpCisJCQkJYnJlYWs7CisKKwkJCS8qIGdldCB0aGUgY29uZmlnIG9wdGlvbiAqLworCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5jb25maWdfb3B0aW9uID0gdHVwbGVbMF0gJiAweDNmOworCisJCQkvKiBPSywgY2hlY2sgaXQgY29udGFpbnMgdGhlIGNvcnJlY3Qgc3RyaW5ncyAqLworCQkJaWYgKChmaW5kc3RyKChjaGFyICopdHVwbGUsIHR1cGxlTGVuZ3RoLCAiRFZCX0hPU1QiLCA4KSA9PSBOVUxMKSB8fAorCQkJICAgIChmaW5kc3RyKChjaGFyICopdHVwbGUsIHR1cGxlTGVuZ3RoLCAiRFZCX0NJX01PRFVMRSIsIDEzKSA9PSBOVUxMKSkKKwkJCQlicmVhazsKKworCQkJZ290X2NmdGFibGVlbnRyeSA9IDE7CisJCQlicmVhazsKKworCQljYXNlIDB4MTQ6CS8vIENJU1RQTF9OT19MSU5LCisJCXByaW50aygiZHZiIGNpIG5vIGxpbmsiKTsKKwkJCWJyZWFrOworCisJCWNhc2UgMHhGRjoJLy8gQ0lTVFBMX0VORAorCQkJZW5kX2NoYWluID0gMTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CS8qIFVua25vd24gdHVwbGUgdHlwZSAtIGp1c3Qgc2tpcCB0aGlzIHR1cGxlIGFuZCBtb3ZlIHRvIHRoZSBuZXh0IG9uZSAqLworCQkJcHJpbnRrKCJkdmJfY2E6IFNraXBwaW5nIHVua25vd24gdHVwbGUgdHlwZToweCV4IGxlbmd0aDoweCV4XG4iLCB0dXBsZVR5cGUsCisJCQkJdHVwbGVMZW5ndGgpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoKGFkZHJlc3MgPiAweDEwMDApIHx8ICghZ290X2NmdGFibGVlbnRyeSkpCisJeworCQlwcmludGsoImR2YiBjaSBlcnJvciAgbGluZVslZF1cclxuIiwgX19MSU5FX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkcHJpbnRrKCJWYWxpZCBEVkIgQ0FNIGRldGVjdGVkIE1BTklEOiV4IERFVklEOiV4IENPTkZJR0JBU0U6MHgleCBDT05GSUdPUFRJT046MHgleFxuIiwKKwkJbWFuZmlkLCBkZXZpZCwgY2EtPnNsb3RfaW5mb1tzbG90XS5jb25maWdfYmFzZSwgY2EtPnNsb3RfaW5mb1tzbG90XS5jb25maWdfb3B0aW9uKTsKKworCS8vIHN1Y2Nlc3MhCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBkdmJfY2FfZW41MDIyMV9zZXRfY29uZmlnb3B0aW9uIC0gU2V0IENBTSdzIGNvbmZpZ29wdGlvbiBjb3JyZWN0bHkuCisgKgorICogQGNhOiBDQSBpbnN0YW5jZS4KKyAqIEBzbG90OiBTbG90IGNvbnRhaW5pbmcgdGhlIENBTS4KKyAqLworc3RhdGljIGludCBkdmJfY2FfZW41MDIyMV9zZXRfY29uZmlnb3B0aW9uKHN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqY2EsIGludCBzbG90KQoreworCWludCBjb25maWdvcHRpb247CisKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOworCisJLyogc2V0IHRoZSBjb25maWcgb3B0aW9uICovCisJY2EtPnB1Yi0+d3JpdGVfYXR0cmlidXRlX21lbShjYS0+cHViLCBzbG90LAorCQkJCSAgICAgY2EtPnNsb3RfaW5mb1tzbG90XS5jb25maWdfYmFzZSwKKwkJCQkgICAgIGNhLT5zbG90X2luZm9bc2xvdF0uY29uZmlnX29wdGlvbik7CisKKwkvKiBjaGVjayBpdCAqLworCWNvbmZpZ29wdGlvbiA9IGNhLT5wdWItPnJlYWRfYXR0cmlidXRlX21lbShjYS0+cHViLCBzbG90LCBjYS0+c2xvdF9pbmZvW3Nsb3RdLmNvbmZpZ19iYXNlKTsKKwlkcHJpbnRrKCJTZXQgY29uZmlnb3B0aW9uIDB4JXgsIHJlYWQgY29uZmlnb3B0aW9uIDB4JXhcbiIsCisJCWNhLT5zbG90X2luZm9bc2xvdF0uY29uZmlnX29wdGlvbiwgY29uZmlnb3B0aW9uICYgMHgzZik7CisKKwkvKiBmaW5lISAqLworCXJldHVybiAwOworCit9CisKKworLyoqCisgKiBkdmJfY2FfZW41MDIyMV9yZWFkX2RhdGEgLSBUaGlzIGZ1bmN0aW9uIHRhbGtzIHRvIGFuIEVONTAyMjEgQ0FNIGNvbnRyb2wKKyAqCWludGVyZmFjZS4gSXQgcmVhZHMgYSBidWZmZXIgb2YgZGF0YSBmcm9tIHRoZSBDQU0uIFRoZSBkYXRhIGNhbiBlaXRoZXIKKyAqCWJlIHN0b3JlZCBpbiBhIHN1cHBsaWVkIGJ1ZmZlciwgb3IgYXV0b21hdGljYWxseSBiZSBhZGRlZCB0byB0aGUgc2xvdCdzCisgKglyeF9idWZmZXIuCisgKgorICogQGNhOiBDQSBpbnN0YW5jZS4KKyAqIEBzbG90OiBTbG90IHRvIHJlYWQgZnJvbS4KKyAqIEBlYnVmOiBJZiBub24tTlVMTCwgdGhlIGRhdGEgd2lsbCBiZSB3cml0dGVuIHRvIHRoaXMgYnVmZmVyLiBJZiBOVUxMLAorICogdGhlIGRhdGEgd2lsbCBiZSBhZGRlZCBpbnRvIHRoZSBidWZmZXJpbmcgc3lzdGVtIGFzIGEgbm9ybWFsIGZyYWdtZW50LgorICogQGVjb3VudDogU2l6ZSBvZiBlYnVmLiBJZ25vcmVkIGlmIGVidWYgaXMgTlVMTC4KKyAqCisgKiBAcmV0dXJuIE51bWJlciBvZiBieXRlcyByZWFkLCBvciA8IDAgb24gZXJyb3IKKyAqLworc3RhdGljIGludCBkdmJfY2FfZW41MDIyMV9yZWFkX2RhdGEoc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSwgaW50IHNsb3QsIHU4ICogZWJ1ZiwgaW50IGVjb3VudCkKK3sKKwlpbnQgYnl0ZXNfcmVhZDsKKwlpbnQgc3RhdHVzOworCXU4IGJ1ZltIT1NUX0xJTktfQlVGX1NJWkVdOworCWludCBpOworCisJZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsKKworCS8qIGNoZWNrIGlmIHdlIGhhdmUgc3BhY2UgZm9yIGEgbGluayBidWYgaW4gdGhlIHJ4X2J1ZmZlciAqLworCWlmIChlYnVmID09IE5VTEwpIHsKKwkJaW50IGJ1Zl9mcmVlOworCisJCWlmIChjYS0+c2xvdF9pbmZvW3Nsb3RdLnJ4X2J1ZmZlci5kYXRhID09IE5VTEwpIHsKKwkJCXN0YXR1cyA9IC1FSU87CisJCQlnb3RvIGV4aXQ7CisJCX0KKwkJYnVmX2ZyZWUgPSBkdmJfcmluZ2J1ZmZlcl9mcmVlKCZjYS0+c2xvdF9pbmZvW3Nsb3RdLnJ4X2J1ZmZlcik7CisKKwkJaWYgKGJ1Zl9mcmVlIDwgKGNhLT5zbG90X2luZm9bc2xvdF0ubGlua19idWZfc2l6ZSArIERWQl9SSU5HQlVGRkVSX1BLVEhEUlNJWkUpKSB7CisJCQlzdGF0dXMgPSAtRUFHQUlOOworCQkJZ290byBleGl0OworCQl9CisJfQorCisJLyogY2hlY2sgaWYgdGhlcmUgaXMgZGF0YSBhdmFpbGFibGUgKi8KKwlpZiAoKHN0YXR1cyA9IGNhLT5wdWItPnJlYWRfY2FtX2NvbnRyb2woY2EtPnB1Yiwgc2xvdCwgQ1RSTElGX1NUQVRVUykpIDwgMCkKKwkJZ290byBleGl0OworCWlmICghKHN0YXR1cyAmIFNUQVRVU1JFR19EQSkpIHsKKwkJLyogbm8gZGF0YSAqLworCQlzdGF0dXMgPSAwOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogcmVhZCB0aGUgYW1vdW50IG9mIGRhdGEgKi8KKwlpZiAoKHN0YXR1cyA9IGNhLT5wdWItPnJlYWRfY2FtX2NvbnRyb2woY2EtPnB1Yiwgc2xvdCwgQ1RSTElGX1NJWkVfSElHSCkpIDwgMCkKKwkJZ290byBleGl0OworCWJ5dGVzX3JlYWQgPSBzdGF0dXMgPDwgODsKKwlpZiAoKHN0YXR1cyA9IGNhLT5wdWItPnJlYWRfY2FtX2NvbnRyb2woY2EtPnB1Yiwgc2xvdCwgQ1RSTElGX1NJWkVfTE9XKSkgPCAwKQorCQlnb3RvIGV4aXQ7CisJYnl0ZXNfcmVhZCB8PSBzdGF0dXM7CisKKwkvKiBjaGVjayBpdCB3aWxsIGZpdCAqLworCWlmIChlYnVmID09IE5VTEwpIHsKKwkJaWYgKGJ5dGVzX3JlYWQgPiBjYS0+c2xvdF9pbmZvW3Nsb3RdLmxpbmtfYnVmX3NpemUpIHsKKwkJCXByaW50aygiZHZiX2NhIGFkYXB0ZXIgJWQ6IENBTSB0cmllZCB0byBzZW5kIGEgYnVmZmVyIGxhcmdlciB0aGFuIHRoZSBsaW5rIGJ1ZmZlciBzaXplICglaSA+ICVpKSFcbiIsCisJCQkgICAgICAgY2EtPmR2YmRldi0+YWRhcHRlci0+bnVtLCBieXRlc19yZWFkLCBjYS0+c2xvdF9pbmZvW3Nsb3RdLmxpbmtfYnVmX3NpemUpOworCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlID0gRFZCX0NBX1NMT1RTVEFURV9MSU5LSU5JVDsKKwkJCXN0YXR1cyA9IC1FSU87CisJCQlnb3RvIGV4aXQ7CisJCX0KKwkJaWYgKGJ5dGVzX3JlYWQgPCAyKSB7CisJCQlwcmludGsoImR2Yl9jYSBhZGFwdGVyICVkOiBDQU0gc2VudCBhIGJ1ZmZlciB0aGF0IHdhcyBsZXNzIHRoYW4gMiBieXRlcyFcbiIsCisJCQkgICAgICAgY2EtPmR2YmRldi0+YWRhcHRlci0+bnVtKTsKKwkJCWNhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9zdGF0ZSA9IERWQl9DQV9TTE9UU1RBVEVfTElOS0lOSVQ7CisJCQlzdGF0dXMgPSAtRUlPOworCQkJZ290byBleGl0OworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGJ5dGVzX3JlYWQgPiBlY291bnQpIHsKKwkJCXByaW50aygiZHZiX2NhIGFkYXB0ZXIgJWQ6IENBTSB0cmllZCB0byBzZW5kIGEgYnVmZmVyIGxhcmdlciB0aGFuIHRoZSBlY291bnQgc2l6ZSFcbiIsCisJCQkgICAgICAgY2EtPmR2YmRldi0+YWRhcHRlci0+bnVtKTsKKwkJCXN0YXR1cyA9IC1FSU87CisJCQlnb3RvIGV4aXQ7CisJCX0KKwl9CisKKwkvKiBmaWxsIHRoZSBidWZmZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYnl0ZXNfcmVhZDsgaSsrKSB7CisJCS8qIHJlYWQgYnl0ZSBhbmQgY2hlY2sgKi8KKwkJaWYgKChzdGF0dXMgPSBjYS0+cHViLT5yZWFkX2NhbV9jb250cm9sKGNhLT5wdWIsIHNsb3QsIENUUkxJRl9EQVRBKSkgPCAwKQorCQkJZ290byBleGl0OworCisJCS8qIE9LLCBzdG9yZSBpdCBpbiB0aGUgYnVmZmVyICovCisJCWJ1ZltpXSA9IHN0YXR1czsKKwl9CisKKwkvKiBjaGVjayBmb3IgcmVhZCBlcnJvciAoUkUgc2hvdWxkIG5vdyBiZSAwKSAqLworCWlmICgoc3RhdHVzID0gY2EtPnB1Yi0+cmVhZF9jYW1fY29udHJvbChjYS0+cHViLCBzbG90LCBDVFJMSUZfU1RBVFVTKSkgPCAwKQorCQlnb3RvIGV4aXQ7CisJaWYgKHN0YXR1cyAmIFNUQVRVU1JFR19SRSkgeworCQljYS0+c2xvdF9pbmZvW3Nsb3RdLnNsb3Rfc3RhdGUgPSBEVkJfQ0FfU0xPVFNUQVRFX0xJTktJTklUOworCQlzdGF0dXMgPSAtRUlPOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogT0ssIGFkZCBpdCB0byB0aGUgcmVjZWl2ZSBidWZmZXIsIG9yIGNvcHkgaW50byBleHRlcm5hbCBidWZmZXIgaWYgc3VwcGxpZWQgKi8KKwlpZiAoZWJ1ZiA9PSBOVUxMKSB7CisJCWlmIChjYS0+c2xvdF9pbmZvW3Nsb3RdLnJ4X2J1ZmZlci5kYXRhID09IE5VTEwpIHsKKwkJCXN0YXR1cyA9IC1FSU87CisJCQlnb3RvIGV4aXQ7CisJCX0KKwkJZHZiX3JpbmdidWZmZXJfcGt0X3dyaXRlKCZjYS0+c2xvdF9pbmZvW3Nsb3RdLnJ4X2J1ZmZlciwgYnVmLCBieXRlc19yZWFkKTsKKwl9IGVsc2UgeworCQltZW1jcHkoZWJ1ZiwgYnVmLCBieXRlc19yZWFkKTsKKwl9CisKKwlkcHJpbnRrKCJSZWNlaXZlZCBDQSBwYWNrZXQgZm9yIHNsb3QgJWkgY29ubmVjdGlvbiBpZCAweCV4IGxhc3RfZnJhZzolaSBzaXplOjB4JXhcbiIsIHNsb3QsCisJCWJ1ZlswXSwgKGJ1ZlsxXSAmIDB4ODApID09IDAsIGJ5dGVzX3JlYWQpOworI2lmbmRlZiBSRUFEX0xQRFVfUEtUCisJLyogd2FrZSB1cCByZWFkZXJzIHdoZW4gYSBsYXN0X2ZyYWdtZW50IGlzIHJlY2VpdmVkICovCisJaWYgKChidWZbMV0gJiAweDgwKSA9PSAweDAwKQorI2VuZGlmCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2EtPndhaXRfcXVldWUpOworCXN0YXR1cyA9IGJ5dGVzX3JlYWQ7CisKK2V4aXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworCisvKioKKyAqIGR2Yl9jYV9lbjUwMjIxX3dyaXRlX2RhdGEgLSBUaGlzIGZ1bmN0aW9uIHRhbGtzIHRvIGFuIEVONTAyMjEgQ0FNIGNvbnRyb2wKKyAqCQkJCWludGVyZmFjZS4gSXQgd3JpdGVzIGEgYnVmZmVyIG9mIGRhdGEgdG8gYSBDQU0uCisgKgorICogQGNhOiBDQSBpbnN0YW5jZS4KKyAqIEBzbG90OiBTbG90IHRvIHdyaXRlIHRvLgorICogQGVidWY6IFRoZSBkYXRhIGluIHRoaXMgYnVmZmVyIGlzIHRyZWF0ZWQgYXMgYSBjb21wbGV0ZSBsaW5rLWxldmVsIHBhY2tldCB0bworICogYmUgd3JpdHRlbi4KKyAqIEBjb3VudDogU2l6ZSBvZiBlYnVmLgorICoKKyAqIEByZXR1cm4gTnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4sIG9yIDwgMCBvbiBlcnJvci4KKyAqLworc3RhdGljIGludCBkdmJfY2FfZW41MDIyMV93cml0ZV9kYXRhKHN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqY2EsIGludCBzbG90LCB1OCAqIGJ1ZiwgaW50IGJ5dGVzX3dyaXRlKQoreworCWludCBzdGF0dXM7CisJaW50IGk7CisKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOworCisKKwkvKiBzYW5pdHkgY2hlY2sgKi8KKwlpZiAoYnl0ZXNfd3JpdGUgPiBjYS0+c2xvdF9pbmZvW3Nsb3RdLmxpbmtfYnVmX3NpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogaXQgaXMgcG9zc2libGUgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIHNpbmdsZSBidWZmZXIgaW1wbGVtZW50YXRpb24sCisJICAgdGh1cyBpZiB0aGVyZSBpcyBkYXRhIGF2YWlsYWJsZSBmb3IgcmVhZCBvciBpZiB0aGVyZSBpcyBldmVuIGEgcmVhZAorCSAgIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIGRvIG5vdGhpbmcgYnV0IGF3YWtlIHRoZSBrZXJuZWwgdGhyZWFkIHRvCisJICAgcHJvY2VzcyB0aGUgZGF0YSBpZiBuZWNlc3NhcnkuICovCisJaWYgKChzdGF0dXMgPSBjYS0+cHViLT5yZWFkX2NhbV9jb250cm9sKGNhLT5wdWIsIHNsb3QsIENUUkxJRl9TVEFUVVMpKSA8IDApCisJCWdvdG8gZXhpdG5vd3JpdGU7CisJaWYgKHN0YXR1cyAmIChTVEFUVVNSRUdfREEgfCBTVEFUVVNSRUdfUkUpKSB7CisJCWlmIChzdGF0dXMgJiBTVEFUVVNSRUdfREEpCisJCQlkdmJfY2FfZW41MDIyMV90aHJlYWRfd2FrZXVwKGNhKTsKKworCQlzdGF0dXMgPSAtRUFHQUlOOworCQlnb3RvIGV4aXRub3dyaXRlOworCX0KKworCS8qIE9LLCBzZXQgSEMgYml0ICovCisJaWYgKChzdGF0dXMgPSBjYS0+cHViLT53cml0ZV9jYW1fY29udHJvbChjYS0+cHViLCBzbG90LCBDVFJMSUZfQ09NTUFORCwKKwkJCQkJCSBJUlFFTiB8IENNRFJFR19IQykpICE9IDApCisJCWdvdG8gZXhpdDsKKworCS8qIGNoZWNrIGlmIGludGVyZmFjZSBpcyBzdGlsbCBmcmVlICovCisJaWYgKChzdGF0dXMgPSBjYS0+cHViLT5yZWFkX2NhbV9jb250cm9sKGNhLT5wdWIsIHNsb3QsIENUUkxJRl9TVEFUVVMpKSA8IDApCisJCWdvdG8gZXhpdDsKKwlpZiAoIShzdGF0dXMgJiBTVEFUVVNSRUdfRlIpKSB7CisJCS8qIGl0IHdhc24ndCBmcmVlID0+IHRyeSBhZ2FpbiBsYXRlciAqLworCQlzdGF0dXMgPSAtRUFHQUlOOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyoKKwkgKiBJdCBtYXkgbmVlZCBzb21lIHRpbWUgZm9yIHRoZSBDQU0gdG8gc2V0dGxlIGRvd24sIG9yIHRoZXJlIG1pZ2h0CisJICogYmUgYSByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIHRoZSBDQU0sIHdyaXRpbmcgSEMgYW5kIG91ciBsYXN0CisJICogY2hlY2sgZm9yIERBLiBUaGlzIGhhcHBlbnMsIGlmIHRoZSBDQU0gYXNzZXJ0cyBEQSwganVzdCBhZnRlcgorCSAqIGNoZWNraW5nIERBIGJlZm9yZSB3ZSBhcmUgc2V0dGluZyBIQy4gSW4gdGhpcyBjYXNlIGl0IG1pZ2h0IGJlCisJICogYSBidWcgaW4gdGhlIENBTSB0byBrZWVwIHRoZSBGUiBiaXQsIHRoZSBsb3dlciBsYXllci9IVworCSAqIGNvbW11bmljYXRpb24gcmVxdWlyZXMgYSBsb25nZXIgdGltZW91dCBvciB0aGUgQ0FNIG5lZWRzIG1vcmUKKwkgKiB0aW1lIGludGVybmFsbHkuIEJ1dCB0aGlzIGhhcHBlbnMgaW4gcmVhbGl0eSEKKwkgKiBXZSBuZWVkIHRvIHJlYWQgdGhlIHN0YXR1cyBmcm9tIHRoZSBIVyBhZ2FpbiBhbmQgZG8gdGhlIHNhbWUKKwkgKiB3ZSBkaWQgZm9yIHRoZSBwcmV2aW91cyBjaGVjayBmb3IgREEKKwkgKi8KKwlzdGF0dXMgPSBjYS0+cHViLT5yZWFkX2NhbV9jb250cm9sKGNhLT5wdWIsIHNsb3QsIENUUkxJRl9TVEFUVVMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGV4aXQ7CisKKwlpZiAoc3RhdHVzICYgKFNUQVRVU1JFR19EQSB8IFNUQVRVU1JFR19SRSkpIHsKKwkJaWYgKHN0YXR1cyAmIFNUQVRVU1JFR19EQSkKKwkJCWR2Yl9jYV9lbjUwMjIxX3RocmVhZF93YWtldXAoY2EpOworCisJCXN0YXR1cyA9IC1FQUdBSU47CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBzZW5kIHRoZSBhbW91bnQgb2YgZGF0YSAqLworCWlmICgoc3RhdHVzID0gY2EtPnB1Yi0+d3JpdGVfY2FtX2NvbnRyb2woY2EtPnB1Yiwgc2xvdCwgQ1RSTElGX1NJWkVfSElHSCwgYnl0ZXNfd3JpdGUgPj4gOCkpICE9IDApCisJCWdvdG8gZXhpdDsKKwlpZiAoKHN0YXR1cyA9IGNhLT5wdWItPndyaXRlX2NhbV9jb250cm9sKGNhLT5wdWIsIHNsb3QsIENUUkxJRl9TSVpFX0xPVywKKwkJCQkJCSBieXRlc193cml0ZSAmIDB4ZmYpKSAhPSAwKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBzZW5kIHRoZSBidWZmZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYnl0ZXNfd3JpdGU7IGkrKykgeworCQlpZiAoKHN0YXR1cyA9IGNhLT5wdWItPndyaXRlX2NhbV9jb250cm9sKGNhLT5wdWIsIHNsb3QsIENUUkxJRl9EQVRBLCBidWZbaV0pKSAhPSAwKQorCQkJZ290byBleGl0OworCX0KKworCS8qIGNoZWNrIGZvciB3cml0ZSBlcnJvciAoV0Ugc2hvdWxkIG5vdyBiZSAwKSAqLworCWlmICgoc3RhdHVzID0gY2EtPnB1Yi0+cmVhZF9jYW1fY29udHJvbChjYS0+cHViLCBzbG90LCBDVFJMSUZfU1RBVFVTKSkgPCAwKQorCQlnb3RvIGV4aXQ7CisJaWYgKHN0YXR1cyAmIFNUQVRVU1JFR19XRSkgeworCQljYS0+c2xvdF9pbmZvW3Nsb3RdLnNsb3Rfc3RhdGUgPSBEVkJfQ0FfU0xPVFNUQVRFX0xJTktJTklUOworCQlzdGF0dXMgPSAtRUlPOworCQlnb3RvIGV4aXQ7CisJfQorCXN0YXR1cyA9IGJ5dGVzX3dyaXRlOworCisJZHByaW50aygiV3JvdGUgQ0EgcGFja2V0IGZvciBzbG90ICVpLCBjb25uZWN0aW9uIGlkIDB4JXggbGFzdF9mcmFnOiVpIHNpemU6MHgleFxuIiwgc2xvdCwKKwkJYnVmWzBdLCAoYnVmWzFdICYgMHg4MCkgPT0gMCwgYnl0ZXNfd3JpdGUpOworCitleGl0OgorCWNhLT5wdWItPndyaXRlX2NhbV9jb250cm9sKGNhLT5wdWIsIHNsb3QsIENUUkxJRl9DT01NQU5ELCBJUlFFTik7CisKK2V4aXRub3dyaXRlOgorCXJldHVybiBzdGF0dXM7Cit9CitFWFBPUlRfU1lNQk9MKGR2Yl9jYV9lbjUwMjIxX2NpbWN1X2NhbWNoYW5nZV9pcnEpOworCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qIEVONTAyMjEgaGlnaGVyIGxldmVsIGZ1bmN0aW9ucyAqLworCisKKy8qKgorICogZHZiX2NhX2VuNTAyMjFfY2FtcmVhZHlfaXJxIC0gQSBDQU0gaGFzIGJlZW4gcmVtb3ZlZCA9PiBzaHV0IGl0IGRvd24uCisgKgorICogQGNhOiBDQSBpbnN0YW5jZS4KKyAqIEBzbG90OiBTbG90IHRvIHNodXQgZG93bi4KKyAqLworc3RhdGljIGludCBkdmJfY2FfZW41MDIyMV9zbG90X3NodXRkb3duKHN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqY2EsIGludCBzbG90KQoreworCWRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwljYS0+cHViLT5zbG90X3NodXRkb3duKGNhLT5wdWIsIHNsb3QpOworCWNhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9zdGF0ZSA9IERWQl9DQV9TTE9UU1RBVEVfTk9ORTsKKworCS8qIG5lZWQgdG8gd2FrZSB1cCBhbGwgcHJvY2Vzc2VzIHRvIGNoZWNrIGlmIHRoZXkncmUgbm93CisJICAgdHJ5aW5nIHRvIHdyaXRlIHRvIGEgZGVmdW5jdCBDQU0gKi8KKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNhLT53YWl0X3F1ZXVlKTsKKworCWRwcmludGsoIlNsb3QgJWkgc2h1dGRvd25cbiIsIHNsb3QpOworCisJLyogc3VjY2VzcyAqLworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkdmJfY2FfZW41MDIyMV9jaW1jdV9jYW1yZWFkeV9pcnEpOworCisKKy8qKgorICogZHZiX2NhX2VuNTAyMjFfY2FtcmVhZHlfaXJxIC0gQSBDQU1DSEFOR0UgSVJRIGhhcyBvY2N1cnJlZC4KKyAqCisgKiBAY2E6IENBIGluc3RhbmNlLgorICogQHNsb3Q6IFNsb3QgY29uY2VybmVkLgorICogQGNoYW5nZV90eXBlOiBPbmUgb2YgdGhlIERWQl9DQV9DQU1DSEFOR0VfKiB2YWx1ZXMuCisgKi8KK3ZvaWQgZHZiX2NhX2VuNTAyMjFfY2ltY3VfY2FtY2hhbmdlX2lycShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltY3UgKnB1YmNhLCBpbnQgc2xvdCwgaW50IGNoYW5nZV90eXBlKQoreworCXN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqY2EgPSBwdWJjYS0+cHJpdmF0ZTsKKworCWRwcmludGsoIkNBTUNIQU5HRSBJUlEgc2xvdDolaSBjaGFuZ2VfdHlwZTolaVxuIiwgc2xvdCwgY2hhbmdlX3R5cGUpOworCisJc3dpdGNoIChjaGFuZ2VfdHlwZSkgeworCWNhc2UgRFZCX0NBX0VONTAyMjFfQ0FNQ0hBTkdFX1JFTU9WRUQ6CisJY2FzZSBEVkJfQ0FfRU41MDIyMV9DQU1DSEFOR0VfSU5TRVJURUQ6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKworCWNhLT5zbG90X2luZm9bc2xvdF0uY2FtY2hhbmdlX3R5cGUgPSBjaGFuZ2VfdHlwZTsKKwlhdG9taWNfaW5jKCZjYS0+c2xvdF9pbmZvW3Nsb3RdLmNhbWNoYW5nZV9jb3VudCk7CisJZHZiX2NhX2VuNTAyMjFfdGhyZWFkX3dha2V1cChjYSk7Cit9CitFWFBPUlRfU1lNQk9MKGR2Yl9jYV9lbjUwMjIxX2NpbWN1X2ZyZGFfaXJxKTsKKworCisvKioKKyAqIGR2Yl9jYV9lbjUwMjIxX2NpbWN1X2NhbXJlYWR5X2lycSAtIEEgQ0FNUkVBRFkgSVJRIGhhcyBvY2N1cnJlZC4KKyAqCisgKiBAY2E6IENBIGluc3RhbmNlLgorICogQHNsb3Q6IFNsb3QgY29uY2VybmVkLgorICovCit2b2lkIGR2Yl9jYV9lbjUwMjIxX2NpbWN1X2NhbXJlYWR5X2lycShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltY3UgKnB1YmNhLCBpbnQgc2xvdCkKK3sKKwlzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKmNhID0gcHViY2EtPnByaXZhdGU7CisKKwlkcHJpbnRrKCJDQU1SRUFEWSBJUlEgc2xvdDolaVxuIiwgc2xvdCk7CisKKwlpZiAoY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlID09IERWQl9DQV9TTE9UU1RBVEVfV0FJVFJFQURZKSB7CisJCWNhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9zdGF0ZSA9IERWQl9DQV9TTE9UU1RBVEVfVkFMSURBVEU7CisJCWR2Yl9jYV9lbjUwMjIxX3RocmVhZF93YWtldXAoY2EpOworCX0KK30KKworCisvKioKKyAqIEFuIEZSIG9yIERBIElSUSBoYXMgb2NjdXJyZWQuCisgKgorICogQGNhOiBDQSBpbnN0YW5jZS4KKyAqIEBzbG90OiBTbG90IGNvbmNlcm5lZC4KKyAqLwordm9pZCBkdmJfY2FfZW41MDIyMV9jaW1jdV9mcmRhX2lycShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltY3UgKnB1YmNhLCBpbnQgc2xvdCkKK3sKKwlzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKmNhID0gcHViY2EtPnByaXZhdGU7CisJaW50IGZsYWdzOworCisJZHByaW50aygiRlIvREEgSVJRIHNsb3Q6JWlcbiIsIHNsb3QpOworCisJc3dpdGNoIChjYS0+c2xvdF9pbmZvW3Nsb3RdLnNsb3Rfc3RhdGUpIHsKKwljYXNlIERWQl9DQV9TTE9UU1RBVEVfTElOS0lOSVQ6CisJCWZsYWdzID0gY2EtPnB1Yi0+cmVhZF9jYW1fY29udHJvbChwdWJjYSwgc2xvdCwgQ1RSTElGX1NUQVRVUyk7CisJCWlmIChmbGFncyAmIFNUQVRVU1JFR19EQSkgeworCQkJZHByaW50aygiQ0FNIHN1cHBvcnRzIERBIElSUVxuIik7CisJCQljYS0+c2xvdF9pbmZvW3Nsb3RdLmRhX2lycV9zdXBwb3J0ZWQgPSAxOworCQl9CisJCWJyZWFrOworCisJY2FzZSBEVkJfQ0FfU0xPVFNUQVRFX1JVTk5JTkc6CisJCWlmIChjYS0+b3BlbikKKwkJCWR2Yl9jYV9lbjUwMjIxX3RocmVhZF93YWtldXAoY2EpOworCQlicmVhazsKKwl9Cit9CisKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogRU41MDIyMSB0aHJlYWQgZnVuY3Rpb25zICovCisKKy8qKgorICogV2FrZSB1cCB0aGUgRFZCIENBIHRocmVhZAorICoKKyAqIEBjYTogQ0EgaW5zdGFuY2UuCisgKi8KK3N0YXRpYyB2b2lkIGR2Yl9jYV9lbjUwMjIxX3RocmVhZF93YWtldXAoc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSkKK3sKKworCWRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwljYS0+d2FrZXVwID0gMTsKKwltYigpOworCXdha2VfdXBfcHJvY2VzcyhjYS0+dGhyZWFkKTsKK30KKworLyoqCisgKiBVcGRhdGUgdGhlIGRlbGF5IHVzZWQgYnkgdGhlIHRocmVhZC4KKyAqCisgKiBAY2E6IENBIGluc3RhbmNlLgorICovCitzdGF0aWMgdm9pZCBkdmJfY2FfZW41MDIyMV90aHJlYWRfdXBkYXRlX2RlbGF5KHN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqY2EpCit7CisJaW50IGRlbGF5OworCWludCBjdXJkZWxheSA9IDEwMDAwMDAwMDsKKwlpbnQgc2xvdDsKKworCS8qIEJld2FyZSBvZiB0b28gaGlnaCBwb2xsaW5nIGZyZXF1ZW5jeSwgYmVjYXVzZSBvbmUgcG9sbGluZworCSAqIGNhbGwgbWlnaHQgdGFrZSBzZXZlcmFsIGh1bmRyZWQgbWlsbGlzZWNvbmRzIHVudGlsIHRpbWVvdXQhCisJICovCisJZm9yIChzbG90ID0gMDsgc2xvdCA8IGNhLT5zbG90X2NvdW50OyBzbG90KyspIHsKKwkJc3dpdGNoIChjYS0+c2xvdF9pbmZvW3Nsb3RdLnNsb3Rfc3RhdGUpIHsKKwkJZGVmYXVsdDoKKwkJY2FzZSBEVkJfQ0FfU0xPVFNUQVRFX05PTkU6CisJCQlkZWxheSA9IEhaICogNjA7ICAvKiA2MHMgKi8KKwkJCWlmICghKGNhLT5mbGFncyAmIERWQl9DQV9FTjUwMjIxX0ZMQUdfSVJRX0NBTUNIQU5HRSkpCisJCQkJZGVsYXkgPSBIWiAqIDU7ICAvKiA1cyAqLworCQkJYnJlYWs7CisJCWNhc2UgRFZCX0NBX1NMT1RTVEFURV9JTlZBTElEOgorCQkJZGVsYXkgPSBIWiAqIDYwOyAgLyogNjBzICovCisJCQlpZiAoIShjYS0+ZmxhZ3MgJiBEVkJfQ0FfRU41MDIyMV9GTEFHX0lSUV9DQU1DSEFOR0UpKQorCQkJCWRlbGF5ID0gSFogLyAxMDsgIC8qIDEwMG1zICovCisJCQlicmVhazsKKworCQljYXNlIERWQl9DQV9TTE9UU1RBVEVfVU5JTklUSUFMSVNFRDoKKwkJY2FzZSBEVkJfQ0FfU0xPVFNUQVRFX1dBSVRSRUFEWToKKwkJY2FzZSBEVkJfQ0FfU0xPVFNUQVRFX1ZBTElEQVRFOgorCQljYXNlIERWQl9DQV9TTE9UU1RBVEVfV0FJVEZSOgorCQljYXNlIERWQl9DQV9TTE9UU1RBVEVfTElOS0lOSVQ6CisJCQlkZWxheSA9IEhaIC8gMTA7ICAvKiAxMDBtcyAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBEVkJfQ0FfU0xPVFNUQVRFX1JVTk5JTkc6CisJCQlkZWxheSA9IEhaICogNjA7ICAvKiA2MHMgKi8KKwkJCWlmICghKGNhLT5mbGFncyAmIERWQl9DQV9FTjUwMjIxX0ZMQUdfSVJRX0NBTUNIQU5HRSkpCisJCQkJZGVsYXkgPSBIWiAvIDEwMDsgIC8qIDEwMG1zICovCisJCQlpZiAoY2EtPm9wZW4pIHsKKwkJCQlpZiAoKCFjYS0+c2xvdF9pbmZvW3Nsb3RdLmRhX2lycV9zdXBwb3J0ZWQpIHx8CisJCQkJICAgICghKGNhLT5mbGFncyAmIERWQl9DQV9FTjUwMjIxX0ZMQUdfSVJRX0RBKSkpCisJCQkJCWRlbGF5ID0gSFogLyAxMDA7ICAvKiAxMDBtcyAqLworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZGVsYXkgPCBjdXJkZWxheSkKKwkJCWN1cmRlbGF5ID0gZGVsYXk7CisJfQorCisJY2EtPmRlbGF5ID0gY3VyZGVsYXk7Cit9CisKKworCisvKioKKyAqIEtlcm5lbCB0aHJlYWQgd2hpY2ggbW9uaXRvcnMgQ0Egc2xvdHMgZm9yIENBTSBjaGFuZ2VzLCBhbmQgcGVyZm9ybXMgZGF0YSB0cmFuc2ZlcnMuCisgKi8KK3N0YXRpYyBpbnQgZHZiX2NhX2VuNTAyMjFfdGhyZWFkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSA9IGRhdGE7CisJaW50IHNsb3Q7CisJaW50IGZsYWdzOworCWludCBzdGF0dXM7CisJaW50IHBrdGNvdW50OworCXZvaWQgKnJ4YnVmOworCisJZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsKKworCS8qIGNob29zZSB0aGUgY29ycmVjdCBpbml0aWFsIGRlbGF5ICovCisJZHZiX2NhX2VuNTAyMjFfdGhyZWFkX3VwZGF0ZV9kZWxheShjYSk7CisKKwkvKiBtYWluIGxvb3AgKi8KKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQkvKiBzbGVlcCBmb3IgYSBiaXQgKi8KKwkJaWYgKCFjYS0+d2FrZXVwKSB7CisJCQlpZiAoY2EtPnNsb3RfY291bnQgPiAwCisJCQkJJiYgY2EtPnNsb3RfaW5mb1swXS5zbG90X3N0YXRlID09IERWQl9DQV9TTE9UU1RBVEVfUlVOTklORworCQkJCSYmIGNhLT5wdWItPmdldF9zbG90X3dha2V1cChjYS0+cHViLCAwKSA9PSAwKSB7CisJCQkJICAgIHVzbGVlcF9yYW5nZShkdmJfY2FfZW41MDIyMV91c2xlZXAsIGR2Yl9jYV9lbjUwMjIxX3VzbGVlcCArIDEwMCk7CisJCQl9IGVsc2UgeworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQkJc2NoZWR1bGVfdGltZW91dChjYS0+ZGVsYXkpOworCQkJfQorCQkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKKwkJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCWlmIChjYS0+cHViLT5nZXRfc2xvdF93YWtldXAoY2EtPnB1YiwgMCkgPT0gMCkKKwkJCQl1c2xlZXBfcmFuZ2UoZHZiX2NhX2VuNTAyMjFfdXNsZWVwLCBkdmJfY2FfZW41MDIyMV91c2xlZXAgKyAxMDApOworCQl9CisJCWNhLT53YWtldXAgPSAwOworCisJCS8qIGdvIHRocm91Z2ggYWxsIHRoZSBzbG90cyBwcm9jZXNzaW5nIHRoZW0gKi8KKwkJZm9yIChzbG90ID0gMDsgc2xvdCA8IGNhLT5zbG90X2NvdW50OyBzbG90KyspIHsKKworCQkJbXV0ZXhfbG9jaygmY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X2xvY2spOworCisJCQkvLyBjaGVjayB0aGUgY2FtIHN0YXR1cyArIGRlYWwgd2l0aCBDQU1DSEFOR0VzCisJCQl3aGlsZSAoZHZiX2NhX2VuNTAyMjFfY2hlY2tfY2Ftc3RhdHVzKGNhLCBzbG90KSkgeworCQkJCS8qIGNsZWFyIGRvd24gYW4gb2xkIENJIHNsb3QgaWYgbmVjZXNzYXJ5ICovCisJCQkJaWYgKGNhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9zdGF0ZSAhPSBEVkJfQ0FfU0xPVFNUQVRFX05PTkUpCisJCQkJCWR2Yl9jYV9lbjUwMjIxX3Nsb3Rfc2h1dGRvd24oY2EsIHNsb3QpOworCisJCQkJLyogaWYgYSBDQU0gaXMgTk9XIHByZXNlbnQsIGluaXRpYWxpc2UgaXQgKi8KKwkJCQlpZiAoY2EtPnNsb3RfaW5mb1tzbG90XS5jYW1jaGFuZ2VfdHlwZSA9PSBEVkJfQ0FfRU41MDIyMV9DQU1DSEFOR0VfSU5TRVJURUQpIHsKKwkJCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlID0gRFZCX0NBX1NMT1RTVEFURV9VTklOSVRJQUxJU0VEOworCQkJCX0KKworCQkJCS8qIHdlJ3ZlIGhhbmRsZWQgb25lIENBTUNIQU5HRSAqLworCQkJCWR2Yl9jYV9lbjUwMjIxX3RocmVhZF91cGRhdGVfZGVsYXkoY2EpOworCQkJCWF0b21pY19kZWMoJmNhLT5zbG90X2luZm9bc2xvdF0uY2FtY2hhbmdlX2NvdW50KTsKKwkJCX0KKworCQkJLy8gQ0FNIHN0YXRlIG1hY2hpbmUKKwkJCXN3aXRjaCAoY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlKSB7CisJCQljYXNlIERWQl9DQV9TTE9UU1RBVEVfTk9ORToKKwkJCWNhc2UgRFZCX0NBX1NMT1RTVEFURV9JTlZBTElEOgorCQkJCS8vIG5vIGFjdGlvbiBuZWVkZWQKKwkJCQlicmVhazsKKworCQkJY2FzZSBEVkJfQ0FfU0xPVFNUQVRFX1VOSU5JVElBTElTRUQ6CisJCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlID0gRFZCX0NBX1NMT1RTVEFURV9XQUlUUkVBRFk7CisJCQkJY2EtPnB1Yi0+c2xvdF9yZXNldChjYS0+cHViLCBzbG90KTsKKwkJCQljYS0+c2xvdF9pbmZvW3Nsb3RdLnRpbWVvdXQgPSBqaWZmaWVzICsgKElOSVRfVElNRU9VVF9TRUNTICogSFopOworCQkJCWJyZWFrOworCisJCQljYXNlIERWQl9DQV9TTE9UU1RBVEVfV0FJVFJFQURZOgorCQkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGNhLT5zbG90X2luZm9bc2xvdF0udGltZW91dCkpIHsKKwkJCQkJcHJpbnRrKCJkdmJfY2EgYWRhcHRvciAlZDogUEMgY2FyZCBkaWQgbm90IHJlc3BvbmQgOihcbiIsCisJCQkJCSAgICAgICBjYS0+ZHZiZGV2LT5hZGFwdGVyLT5udW0pOworCQkJCQljYS0+c2xvdF9pbmZvW3Nsb3RdLnNsb3Rfc3RhdGUgPSBEVkJfQ0FfU0xPVFNUQVRFX0lOVkFMSUQ7CisJCQkJCWR2Yl9jYV9lbjUwMjIxX3RocmVhZF91cGRhdGVfZGVsYXkoY2EpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLy8gbm8gb3RoZXIgYWN0aW9uIG5lZWRlZDsgd2lsbCBhdXRvbWF0aWNhbGx5IGNoYW5nZSBzdGF0ZSB3aGVuIHJlYWR5CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRFZCX0NBX1NMT1RTVEFURV9WQUxJREFURToKKwkJCQlpZiAoZHZiX2NhX2VuNTAyMjFfcGFyc2VfYXR0cmlidXRlcyhjYSwgc2xvdCkgIT0gMCkgeworCQkJCQkvKiB3ZSBuZWVkIHRoaXMgZXh0cmEgY2hlY2sgZm9yIGFubm95aW5nIGludGVyZmFjZXMgbGlrZSB0aGUgYnVkZ2V0LWF2ICovCisJCQkJCWlmICgoIShjYS0+ZmxhZ3MgJiBEVkJfQ0FfRU41MDIyMV9GTEFHX0lSUV9DQU1DSEFOR0UpKSAmJgorCQkJCQkgICAgKGNhLT5wdWItPnBvbGxfc2xvdF9zdGF0dXMpKSB7CisJCQkJCQlzdGF0dXMgPSBjYS0+cHViLT5wb2xsX3Nsb3Rfc3RhdHVzKGNhLT5wdWIsIHNsb3QsIDApOworCQkJCQkJaWYgKCEoc3RhdHVzICYgRFZCX0NBX0VONTAyMjFfUE9MTF9DQU1fUFJFU0VOVCkpIHsKKwkJCQkJCQljYS0+c2xvdF9pbmZvW3Nsb3RdLnNsb3Rfc3RhdGUgPSBEVkJfQ0FfU0xPVFNUQVRFX05PTkU7CisJCQkJCQkJZHZiX2NhX2VuNTAyMjFfdGhyZWFkX3VwZGF0ZV9kZWxheShjYSk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlwcmludGsoImR2Yl9jYSBhZGFwdGVyICVkOiBJbnZhbGlkIFBDIGNhcmQgaW5zZXJ0ZWQgOihcbiIsCisJCQkJCSAgICAgICBjYS0+ZHZiZGV2LT5hZGFwdGVyLT5udW0pOworCQkJCQkvL2NhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9zdGF0ZSA9IERWQl9DQV9TTE9UU1RBVEVfSU5WQUxJRDsKKwkJCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlID0gRFZCX0NBX1NMT1RTVEFURV9VTklOSVRJQUxJU0VEOworCQkJCQlkdmJfY2FfZW41MDIyMV90aHJlYWRfdXBkYXRlX2RlbGF5KGNhKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmIChkdmJfY2FfZW41MDIyMV9zZXRfY29uZmlnb3B0aW9uKGNhLCBzbG90KSAhPSAwKSB7CisJCQkJCXByaW50aygiZHZiX2NhIGFkYXB0ZXIgJWQ6IFVuYWJsZSB0byBpbml0aWFsaXNlIENBTSA6KFxuIiwKKwkJCQkJICAgICAgIGNhLT5kdmJkZXYtPmFkYXB0ZXItPm51bSk7CisJCQkJCWNhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9zdGF0ZSA9IERWQl9DQV9TTE9UU1RBVEVfSU5WQUxJRDsKKwkJCQkJZHZiX2NhX2VuNTAyMjFfdGhyZWFkX3VwZGF0ZV9kZWxheShjYSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAoY2EtPnB1Yi0+d3JpdGVfY2FtX2NvbnRyb2woY2EtPnB1Yiwgc2xvdCwKKwkJCQkJCQkgICAgICAgQ1RSTElGX0NPTU1BTkQsIENNRFJFR19SUykgIT0gMCkgeworCQkJCQlwcmludGsoImR2Yl9jYSBhZGFwdGVyICVkOiBVbmFibGUgdG8gcmVzZXQgQ0FNIElGXG4iLAorCQkJCQkgICAgICAgY2EtPmR2YmRldi0+YWRhcHRlci0+bnVtKTsKKwkJCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlID0gRFZCX0NBX1NMT1RTVEFURV9JTlZBTElEOworCQkJCQlkdmJfY2FfZW41MDIyMV90aHJlYWRfdXBkYXRlX2RlbGF5KGNhKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWRwcmludGsoIkRWQiBDQU0gdmFsaWRhdGVkIHN1Y2Nlc3NmdWxseVxuIik7CisKKwkJCQljYS0+c2xvdF9pbmZvW3Nsb3RdLnRpbWVvdXQgPSBqaWZmaWVzICsgKElOSVRfVElNRU9VVF9TRUNTICogSFopOworCQkJCWNhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9zdGF0ZSA9IERWQl9DQV9TTE9UU1RBVEVfV0FJVEZSOworCQkJCWNhLT53YWtldXAgPSAxOworCQkJCWJyZWFrOworCisJCQljYXNlIERWQl9DQV9TTE9UU1RBVEVfV0FJVEZSOgorCQkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGNhLT5zbG90X2luZm9bc2xvdF0udGltZW91dCkpIHsKKwkJCQkJcHJpbnRrKCJkdmJfY2EgYWRhcHRlciAlZDogRFZCIENBTSBkaWQgbm90IHJlc3BvbmQgOihcbiIsCisJCQkJCSAgICAgICBjYS0+ZHZiZGV2LT5hZGFwdGVyLT5udW0pOworCQkJCQljYS0+c2xvdF9pbmZvW3Nsb3RdLnNsb3Rfc3RhdGUgPSBEVkJfQ0FfU0xPVFNUQVRFX0lOVkFMSUQ7CisJCQkJCWR2Yl9jYV9lbjUwMjIxX3RocmVhZF91cGRhdGVfZGVsYXkoY2EpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlmbGFncyA9IGNhLT5wdWItPnJlYWRfY2FtX2NvbnRyb2woY2EtPnB1Yiwgc2xvdCwgQ1RSTElGX1NUQVRVUyk7CisJCQkJaWYgKGZsYWdzICYgU1RBVFVTUkVHX0ZSKSB7CisJCQkJCWNhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9zdGF0ZSA9IERWQl9DQV9TTE9UU1RBVEVfTElOS0lOSVQ7CisJCQkJCWNhLT53YWtldXAgPSAxOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBEVkJfQ0FfU0xPVFNUQVRFX0xJTktJTklUOgorCQkJCWlmIChkdmJfY2FfZW41MDIyMV9saW5rX2luaXQoY2EsIHNsb3QpICE9IDApIHsKKwkJCQkJLyogd2UgbmVlZCB0aGlzIGV4dHJhIGNoZWNrIGZvciBhbm5veWluZyBpbnRlcmZhY2VzIGxpa2UgdGhlIGJ1ZGdldC1hdiAqLworCQkJCQlpZiAoKCEoY2EtPmZsYWdzICYgRFZCX0NBX0VONTAyMjFfRkxBR19JUlFfQ0FNQ0hBTkdFKSkgJiYKKwkJCQkJICAgIChjYS0+cHViLT5wb2xsX3Nsb3Rfc3RhdHVzKSkgeworCQkJCQkJc3RhdHVzID0gY2EtPnB1Yi0+cG9sbF9zbG90X3N0YXR1cyhjYS0+cHViLCBzbG90LCAwKTsKKwkJCQkJCWlmICghKHN0YXR1cyAmIERWQl9DQV9FTjUwMjIxX1BPTExfQ0FNX1BSRVNFTlQpKSB7CisJCQkJCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlID0gRFZCX0NBX1NMT1RTVEFURV9OT05FOworCQkJCQkJCWR2Yl9jYV9lbjUwMjIxX3RocmVhZF91cGRhdGVfZGVsYXkoY2EpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJcHJpbnRrKCJkdmJfY2EgYWRhcHRlciAlZDogRFZCIENBTSBsaW5rIGluaXRpYWxpc2F0aW9uIGZhaWxlZCA6KFxuIiwgY2EtPmR2YmRldi0+YWRhcHRlci0+bnVtKTsKKwkJCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlID0gRFZCX0NBX1NMT1RTVEFURV9JTlZBTElEOworCQkJCQlkdmJfY2FfZW41MDIyMV90aHJlYWRfdXBkYXRlX2RlbGF5KGNhKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaWYgKGNhLT5zbG90X2luZm9bc2xvdF0ucnhfYnVmZmVyLmRhdGEgPT0gTlVMTCkgeworCQkJCQlyeGJ1ZiA9IHZtYWxsb2MoUlhfQlVGRkVSX1NJWkUpOworCQkJCQlpZiAocnhidWYgPT0gTlVMTCkgeworCQkJCQkJcHJpbnRrKCJkdmJfY2EgYWRhcHRlciAlZDogVW5hYmxlIHRvIGFsbG9jYXRlIENBTSByeCBidWZmZXIgOihcbiIsIGNhLT5kdmJkZXYtPmFkYXB0ZXItPm51bSk7CisJCQkJCQljYS0+c2xvdF9pbmZvW3Nsb3RdLnNsb3Rfc3RhdGUgPSBEVkJfQ0FfU0xPVFNUQVRFX0lOVkFMSUQ7CisJCQkJCQlkdmJfY2FfZW41MDIyMV90aHJlYWRfdXBkYXRlX2RlbGF5KGNhKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWR2Yl9yaW5nYnVmZmVyX2luaXQoJmNhLT5zbG90X2luZm9bc2xvdF0ucnhfYnVmZmVyLCByeGJ1ZiwgUlhfQlVGRkVSX1NJWkUpOworCQkJCX0KKworCQkJCWNhLT5wdWItPnNsb3RfdHNfZW5hYmxlKGNhLT5wdWIsIHNsb3QpOworCQkJCWNhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9zdGF0ZSA9IERWQl9DQV9TTE9UU1RBVEVfUlVOTklORzsKKwkJCQlkdmJfY2FfZW41MDIyMV90aHJlYWRfdXBkYXRlX2RlbGF5KGNhKTsKKwkJCQlwcmludGsoImR2Yl9jYSBhZGFwdGVyICVkOiBEVkIgQ0FNIGRldGVjdGVkIGFuZCBpbml0aWFsaXNlZCBzdWNjZXNzZnVsbHlcbiIsIGNhLT5kdmJkZXYtPmFkYXB0ZXItPm51bSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRFZCX0NBX1NMT1RTVEFURV9SVU5OSU5HOgorCQkJCWlmICghY2EtPm9wZW4pCisJCQkJCWJyZWFrOworCisJCQkJLy8gcG9sbCBzbG90cyBmb3IgZGF0YQorCQkJCXBrdGNvdW50ID0gMDsKKwkJCQl3aGlsZSAoKHN0YXR1cyA9IGR2Yl9jYV9lbjUwMjIxX3JlYWRfZGF0YShjYSwgc2xvdCwgTlVMTCwgMCkpID4gMCkgeworCQkJCQlpZiAoIWNhLT5vcGVuKQorCQkJCQkJYnJlYWs7CisKKwkJCQkJLyogaWYgYSBDQU1DSEFOR0Ugb2NjdXJyZWQgYXQgc29tZSBwb2ludCwgZG8gbm90IGRvIGFueSBtb3JlIHByb2Nlc3Npbmcgb2YgdGhpcyBzbG90ICovCisJCQkJCWlmIChkdmJfY2FfZW41MDIyMV9jaGVja19jYW1zdGF0dXMoY2EsIHNsb3QpKSB7CisJCQkJCQkvLyB3ZSBkb250IHdhbnQgdG8gc2xlZXAgb24gdGhlIG5leHQgaXRlcmF0aW9uIHNvIHdlIGNhbiBoYW5kbGUgdGhlIGNhbSBjaGFuZ2UKKwkJCQkJCWNhLT53YWtldXAgPSAxOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvKiBjaGVjayBpZiB3ZSd2ZSBoaXQgb3VyIGxpbWl0IHRoaXMgdGltZSAqLworCQkJCQlpZiAoKytwa3Rjb3VudCA+PSBNQVhfUlhfUEFDS0VUU19QRVJfSVRFUkFUSU9OKSB7CisJCQkJCQkvLyBkb250IHNsZWVwOyB0aGVyZSBpcyBsaWtlbHkgdG8gYmUgbW9yZSBkYXRhIHRvIHJlYWQKKwkJCQkJCWNhLT53YWtldXAgPSAxOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCW11dGV4X3VubG9jaygmY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X2xvY2spOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworaW50IGNhbV9zdGF0ZSA9IDA7CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogRU41MDIyMSBJTyBpbnRlcmZhY2UgZnVuY3Rpb25zICovCisKKy8qKgorICogUmVhbCBpb2N0bCBpbXBsZW1lbnRhdGlvbi4KKyAqIE5PVEU6IENBX1NFTkRfTVNHL0NBX0dFVF9NU0cgaW9jdGxzIGhhdmUgdXNlcnNwYWNlIGJ1ZmZlcnMgcGFzc2VkIHRvIHRoZW0uCisgKgorICogQGlub2RlOiBJbm9kZSBjb25jZXJuZWQuCisgKiBAZmlsZTogRmlsZSBjb25jZXJuZWQuCisgKiBAY21kOiBJT0NUTCBjb21tYW5kLgorICogQGFyZzogQXNzb2NpYXRlZCBhcmd1bWVudC4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgPDAgb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgZHZiX2NhX2VuNTAyMjFfaW9fZG9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqcGFyZykKK3sKKwlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqY2EgPSBkdmJkZXYtPnByaXY7CisJaW50IGVyciA9IDA7CisJaW50IHNsb3Q7CisJdTggaW5mbyA9IDB4ODA7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjYS0+aW9jdGxfbXV0ZXgpKSB7CisJCXByaW50aygiY2kgbG9jayBpbnRlcnJ1cHQgZXJyb3JcclxuIik7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCXN3aXRjaCAoY21kKSB7CisJY2FzZSBDQV9SRVNFVDogeworCQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sICh2b2lkIF9fdXNlciAqKXBhcmcsIDEpKQorCSAgICAgICAgICBwcmludGsoImNpIHJlc2V0LWNwIGVycm9yLS1cclxuIik7CisJCWlmIChpbmZvID4+IDcgPT0gMSApIHsKKwkJCWZvciAoc2xvdCA9IDA7IHNsb3QgPCBjYS0+c2xvdF9jb3VudDsgc2xvdCsrKSB7CisJCQkJbXV0ZXhfbG9jaygmY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X2xvY2spOworCQkJCWlmIChjYS0+cHViLT53cml0ZV9jYW1fY29udHJvbChjYS0+cHViLCBzbG90LAorCQkJCQkJCSAgICAgICBDVFJMSUZfQ09NTUFORCwgQ01EUkVHX1JTKSAhPSAwKSB7CisJCQkJCXByaW50aygiZHZiX2NhIGFkYXB0ZXIgJWQ6IFVuYWJsZSB0byByZXNldCBDQU0gSUZcbiIsCisJCQkJCSAgICAgICBjYS0+ZHZiZGV2LT5hZGFwdGVyLT5udW0pOworCQkJCX0KKwkJCQltdXRleF91bmxvY2soJmNhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9sb2NrKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZvciAoc2xvdCA9IDA7IHNsb3QgPCBjYS0+c2xvdF9jb3VudDsgc2xvdCsrKSB7CisJCQkJbXV0ZXhfbG9jaygmY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X2xvY2spOworCQkJCWlmIChjYS0+c2xvdF9pbmZvW3Nsb3RdLnNsb3Rfc3RhdGUgIT0gRFZCX0NBX1NMT1RTVEFURV9OT05FKSB7CisJCQkJCS8vaWYgcmVzZXQgY2FtY2FyZCxuZWVkIHNlbmQgYWxsIHN0YXRlIHRvIGFwcAorCQkJCQljYW1fc3RhdGUgPSAwOworCQkJCQlkdmJfY2FfZW41MDIyMV9zbG90X3NodXRkb3duKGNhLCBzbG90KTsKKwkJCQkJaWYgKGNhLT5mbGFncyAmIERWQl9DQV9FTjUwMjIxX0ZMQUdfSVJRX0NBTUNIQU5HRSkKKwkJCQkJCWR2Yl9jYV9lbjUwMjIxX2NpbWN1X2NhbWNoYW5nZV9pcnEoY2EtPnB1YiwKKwkJCQkJCQkJCQlzbG90LAorCQkJCQkJCQkJCURWQl9DQV9FTjUwMjIxX0NBTUNIQU5HRV9JTlNFUlRFRCk7CisJCQkJfQorCQkJCW11dGV4X3VubG9jaygmY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X2xvY2spOworCQkJfQorCQl9CisJCWNhLT5uZXh0X3JlYWRfc2xvdCA9IDA7CisJCWR2Yl9jYV9lbjUwMjIxX3RocmVhZF93YWtldXAoY2EpOworCQlicmVhazsKKwl9CisJY2FzZSBDQV9HRVRfQ0FQOiB7CisJCXN0cnVjdCBjYV9jYXBzICpjYXBzID0gcGFyZzsKKworCQljYXBzLT5zbG90X251bSA9IGNhLT5zbG90X2NvdW50OworCQljYXBzLT5zbG90X3R5cGUgPSBDQV9DSV9MSU5LOworCQljYXBzLT5kZXNjcl9udW0gPSAwOworCQljYXBzLT5kZXNjcl90eXBlID0gMDsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBDQV9HRVRfU0xPVF9JTkZPOiB7CisJCXN0cnVjdCBjYV9zbG90X2luZm8gKmluZm8gPSBwYXJnOworCisJCWlmICgoaW5mby0+bnVtID4gY2EtPnNsb3RfY291bnQpIHx8IChpbmZvLT5udW0gPCAwKSkgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCXByaW50aygiaW5mby0+bnVtPT0lZFxyXG4iLGluZm8tPm51bSk7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKworCQlpbmZvLT50eXBlID0gQ0FfQ0lfTElOSzsKKwkJaW5mby0+ZmxhZ3MgPSAwOworCQlpZiAoY2FtX3N0YXRlICE9IDAgJiYgKGNhLT5zbG90X2luZm9baW5mby0+bnVtXS5zbG90X3N0YXRlICE9IERWQl9DQV9TTE9UU1RBVEVfTk9ORSkKKwkJCSYmIChjYS0+c2xvdF9pbmZvW2luZm8tPm51bV0uc2xvdF9zdGF0ZSAhPSBEVkJfQ0FfU0xPVFNUQVRFX0lOVkFMSUQpKSB7CisJCQlpbmZvLT5mbGFncyA9IENBX0NJX01PRFVMRV9QUkVTRU5UOworCQl9CisKKwkJaWYgKGNhbV9zdGF0ZSAhPSAwICYmIGNhbV9zdGF0ZSAhPSAxICYmIGNhLT5zbG90X2luZm9baW5mby0+bnVtXS5zbG90X3N0YXRlID09IERWQl9DQV9TTE9UU1RBVEVfUlVOTklORykgeworCQkJaW5mby0+ZmxhZ3MgfD0gQ0FfQ0lfTU9EVUxFX1JFQURZOworCQl9CisJCWlmIChjYW1fc3RhdGUgPT0gMSAmJiBjYS0+c2xvdF9pbmZvW2luZm8tPm51bV0uc2xvdF9zdGF0ZSA9PSBEVkJfQ0FfU0xPVFNUQVRFX1JVTk5JTkcpIHsKKwkJCWluZm8tPmZsYWdzID0gQ0FfQ0lfTU9EVUxFX1BSRVNFTlQ7CisJCQljYW1fc3RhdGUrKzsKKwkJCXByaW50aygiaW5mby0+ZmxhZ3M9PSVkXHJcbiIsaW5mby0+ZmxhZ3MpOworCQl9CisJCWlmIChjYW1fc3RhdGUgPT0gMCkgeworCQkJY2FtX3N0YXRlKys7CisJCQlwcmludGsoImluZm8tPmZsYWdzPT0lZFxyXG4iLGluZm8tPmZsYWdzKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlkZWZhdWx0OgorCQllcnIgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZjYS0+aW9jdGxfbXV0ZXgpOworCXJldHVybiBlcnI7Cit9CitzdGF0aWMgaW50IGR2Yl91c2VyY29weV9fKHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywKKwkJICAgaW50ICgqZnVuYykoc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykpCit7CisgIGNoYXIJICBzYnVmWzEyOF07CisgIHZvaWQJICAqbWJ1ZiA9IE5VTEw7CisgIHZvaWQJICAqcGFyZyA9IE5VTEw7CisgIGludAkgIGVyciAgPSAtRUlOVkFMOworCisgIC8qICBDb3B5IGFyZ3VtZW50cyBpbnRvIHRlbXAga2VybmVsIGJ1ZmZlciAgKi8KKyAgc3dpdGNoIChfSU9DX0RJUihjbWQpKSB7CisgIGNhc2UgX0lPQ19OT05FOgorCSAgLyoKKwkgICAqIEZvciB0aGlzIGNvbW1hbmQsIHRoZSBwb2ludGVyIGlzIGFjdHVhbGx5IGFuIGludGVnZXIKKwkgICAqIGFyZ3VtZW50LgorCSAgICovCisJICBwYXJnID0gKHZvaWQgKikgYXJnOworCSAgYnJlYWs7CisgIGNhc2UgX0lPQ19SRUFEOiAvKiBzb21lIHY0bCBpb2N0bHMgYXJlIG1hcmtlZCB3cm9uZyAuLi4gKi8KKyAgY2FzZSBfSU9DX1dSSVRFOgorICBjYXNlIChfSU9DX1dSSVRFIHwgX0lPQ19SRUFEKToKKwkgIGlmIChfSU9DX1NJWkUoY21kKSA8PSBzaXplb2Yoc2J1ZikpIHsKKwkJICBwYXJnID0gc2J1ZjsKKwkgIH0gZWxzZSB7CisJCSAgLyogdG9vIGJpZyB0byBhbGxvY2F0ZSBmcm9tIHN0YWNrICovCisJCSAgbWJ1ZiA9IGttYWxsb2MoX0lPQ19TSVpFKGNtZCksIEdGUF9LRVJORUwpOworCQkgIGlmIChOVUxMID09IG1idWYpCisJCQkgIHJldHVybiAtRU5PTUVNOworCQkgIHBhcmcgPSBtYnVmOworCSAgfQorCisJICBlcnIgPSAtRUZBVUxUOworCSAgaWYgKGNvcHlfZnJvbV91c2VyKHBhcmcsICh2b2lkIF9fdXNlciAqKWFyZywgX0lPQ19TSVpFKGNtZCkpKQorCQkgIGdvdG8gb3V0OworCSAgYnJlYWs7CisgIH0KKworICAvKiBjYWxsIGRyaXZlciAqLworICBpZiAoKGVyciA9IGZ1bmMoZmlsZSwgY21kLCBwYXJnKSkgPT0gLUVOT0lPQ1RMQ01EKQorCSAgZXJyID0gLUVOT1RUWTsKKworICBpZiAoZXJyIDwgMCkKKwkgIGdvdG8gb3V0OworCisgIC8qICBDb3B5IHJlc3VsdHMgaW50byB1c2VyIGJ1ZmZlciAgKi8KKyAgc3dpdGNoIChfSU9DX0RJUihjbWQpKQorICB7CisgIGNhc2UgX0lPQ19SRUFEOgorICBjYXNlIChfSU9DX1dSSVRFIHwgX0lPQ19SRUFEKToKKwkgIGlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCBwYXJnLCBfSU9DX1NJWkUoY21kKSkpCisJCSAgZXJyID0gLUVGQVVMVDsKKwkgIGJyZWFrOworICB9CisKK291dDoKKyAga2ZyZWUobWJ1Zik7CisgIHJldHVybiBlcnI7Cit9CisKKy8qKgorICogV3JhcHBlciBmb3IgaW9jdGwgaW1wbGVtZW50YXRpb24uCisgKgorICogQGlub2RlOiBJbm9kZSBjb25jZXJuZWQuCisgKiBAZmlsZTogRmlsZSBjb25jZXJuZWQuCisgKiBAY21kOiBJT0NUTCBjb21tYW5kLgorICogQGFyZzogQXNzb2NpYXRlZCBhcmd1bWVudC4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgPDAgb24gZXJyb3IuCisgKi8KK3N0YXRpYyBsb25nIGR2Yl9jYV9lbjUwMjIxX2lvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gZHZiX3VzZXJjb3B5X18oZmlsZSwgY21kLCBhcmcsIGR2Yl9jYV9lbjUwMjIxX2lvX2RvX2lvY3RsKTsKK30KKworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHdyaXRlKCkgc3lzY2FsbC4KKyAqCisgKiBAZmlsZTogRmlsZSBzdHJ1Y3R1cmUuCisgKiBAYnVmOiBTb3VyY2UgYnVmZmVyLgorICogQGNvdW50OiBTaXplIG9mIHNvdXJjZSBidWZmZXIuCisgKiBAcHBvczogUG9zaXRpb24gaW4gZmlsZSAoaWdub3JlZCkuCisgKgorICogQHJldHVybiBOdW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgPDAgb24gZXJyb3IuCisgKi8KK3N0YXRpYyBzc2l6ZV90IGR2Yl9jYV9lbjUwMjIxX2lvX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQoreworCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSA9IGR2YmRldi0+cHJpdjsKKwl1OCBzbG90LCBjb25uZWN0aW9uX2lkOworCWludCBzdGF0dXM7CisJdTggZnJhZ2J1ZltIT1NUX0xJTktfQlVGX1NJWkVdOworCWludCBmcmFncG9zID0gMDsKKwlpbnQgZnJhZ2xlbjsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJaW50IHdyaXR0ZW47CisKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOworCisJLyogSW5jb21pbmcgcGFja2V0IGhhcyBhIDIgYnl0ZSBoZWFkZXIuIGhkclswXSA9IHNsb3RfaWQsIGhkclsxXSA9IGNvbm5lY3Rpb25faWQgKi8KKwlpZiAoY291bnQgPCAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGV4dHJhY3Qgc2xvdCAmIGNvbm5lY3Rpb24gaWQgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJnNsb3QsIGJ1ZiwgMSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcigmY29ubmVjdGlvbl9pZCwgYnVmICsgMSwgMSkpCisJCXJldHVybiAtRUZBVUxUOworCWJ1ZiArPSAyOworCWNvdW50IC09IDI7CisKKwkvKiBjaGVjayBpZiB0aGUgc2xvdCBpcyBhY3R1YWxseSBydW5uaW5nICovCisJaWYgKGNhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9zdGF0ZSAhPSBEVkJfQ0FfU0xPVFNUQVRFX1JVTk5JTkcpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogZnJhZ21lbnQgdGhlIHBhY2tldHMgJiBzdG9yZSBpbiB0aGUgYnVmZmVyICovCisJd2hpbGUgKGZyYWdwb3MgPCBjb3VudCkgeworCQlmcmFnbGVuID0gY2EtPnNsb3RfaW5mb1tzbG90XS5saW5rX2J1Zl9zaXplIC0gMjsKKwkJaWYgKGZyYWdsZW4gPCAwKQorCQkJYnJlYWs7CisJCWlmIChmcmFnbGVuID4gSE9TVF9MSU5LX0JVRl9TSVpFIC0gMikKKwkJCWZyYWdsZW4gPSBIT1NUX0xJTktfQlVGX1NJWkUgLSAyOworCQlpZiAoKGNvdW50IC0gZnJhZ3BvcykgPCBmcmFnbGVuKQorCQkJZnJhZ2xlbiA9IGNvdW50IC0gZnJhZ3BvczsKKworCQlmcmFnYnVmWzBdID0gY29ubmVjdGlvbl9pZDsKKwkJZnJhZ2J1ZlsxXSA9ICgoZnJhZ3BvcyArIGZyYWdsZW4pIDwgY291bnQpID8gMHg4MCA6IDB4MDA7CisJCXN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKGZyYWdidWYgKyAyLCBidWYgKyBmcmFncG9zLCBmcmFnbGVuKTsKKwkJaWYgKHN0YXR1cykgeworCQkJc3RhdHVzID0gLUVGQVVMVDsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCisJCXRpbWVvdXQgPSBqaWZmaWVzICsgSFogLyAyOworCQl3cml0dGVuID0gMDsKKwkJd2hpbGUgKCF0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQkvKiBjaGVjayB0aGUgQ0FNIGhhc24ndCBiZWVuIHJlbW92ZWQvcmVzZXQgaW4gdGhlIG1lYW50aW1lICovCisJCQlpZiAoY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlICE9IERWQl9DQV9TTE9UU1RBVEVfUlVOTklORykgeworCQkJCXN0YXR1cyA9IC1FSU87CisJCQkJZ290byBleGl0OworCQkJfQorCisJCQltdXRleF9sb2NrKCZjYS0+c2xvdF9pbmZvW3Nsb3RdLnNsb3RfbG9jayk7CisJCQlzdGF0dXMgPSBkdmJfY2FfZW41MDIyMV93cml0ZV9kYXRhKGNhLCBzbG90LCBmcmFnYnVmLCBmcmFnbGVuICsgMik7CisJCQltdXRleF91bmxvY2soJmNhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9sb2NrKTsKKwkJCWlmIChzdGF0dXMgPT0gKGZyYWdsZW4gKyAyKSkgeworCQkJCXdyaXR0ZW4gPSAxOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHN0YXR1cyAhPSAtRUFHQUlOKQorCQkJCWdvdG8gZXhpdDsKKworCQkJLy9tc2xlZXAoMSk7CisJCQl1c2xlZXBfcmFuZ2UoZHZiX2NhX2VuNTAyMjFfdXNsZWVwLCBkdmJfY2FfZW41MDIyMV91c2xlZXAgKyAxMDApOworCQl9CisJCWlmICghd3JpdHRlbikgeworCQkJc3RhdHVzID0gLUVJTzsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCisJCWZyYWdwb3MgKz0gZnJhZ2xlbjsKKwl9CisJc3RhdHVzID0gY291bnQgKyAyOworCitleGl0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKworLyoqCisgKiBDb25kaXRpb24gZm9yIHdha2luZyB1cCBpbiBkdmJfY2FfZW41MDIyMV9pb19yZWFkX2NvbmRpdGlvbgorICovCitzdGF0aWMgaW50IGR2Yl9jYV9lbjUwMjIxX2lvX3JlYWRfY29uZGl0aW9uKHN0cnVjdCBkdmJfY2FfcHJpdmF0ZSAqY2EsCisJCQkJCSAgICBpbnQgKnJlc3VsdCwgaW50ICpfc2xvdCkKK3sKKwlpbnQgc2xvdDsKKwlpbnQgc2xvdF9jb3VudCA9IDA7CisJaW50IGlkeDsKKwlzaXplX3QgZnJhZ2xlbjsKKwlpbnQgY29ubmVjdGlvbl9pZCA9IC0xOworCWludCBmb3VuZCA9IDA7CisJdTggaGRyWzJdOworCisJc2xvdCA9IGNhLT5uZXh0X3JlYWRfc2xvdDsKKwl3aGlsZSAoKHNsb3RfY291bnQgPCBjYS0+c2xvdF9jb3VudCkgJiYgKCFmb3VuZCkpIHsKKwkJaWYgKGNhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9zdGF0ZSAhPSBEVkJfQ0FfU0xPVFNUQVRFX1JVTk5JTkcpCisJCQlnb3RvIG5leHRzbG90OworCisJCWlmIChjYS0+c2xvdF9pbmZvW3Nsb3RdLnJ4X2J1ZmZlci5kYXRhID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKyNpZmRlZiBSRUFEX0xQRFVfUEtUCisJCWlmIChjYS0+c2xvdF9pbmZvW3Nsb3RdLnJ4X29mZnNldCAhPSAwKSB7CisJCQlpZHggPSBkdmJfcmluZ2J1ZmZlcl9wa3RfbmV4dCgmY2EtPnNsb3RfaW5mb1tzbG90XS5yeF9idWZmZXIsIC0xLCAmZnJhZ2xlbik7CisJCQlpZiAoaWR4ID09IC0xKSB7CisJCQkJLy9wcmludGsoIm5vIGRhdGEgdG8gcmVhZC0tLS1bJWRdLVxyXG4iLCBjYS0+c2xvdF9pbmZvW3Nsb3RdLnJ4X29mZnNldCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQkqX3Nsb3QgPSBzbG90OworCQkJcmV0dXJuIDE7CisJCX0KKyNlbmRpZgorCQlpZHggPSBkdmJfcmluZ2J1ZmZlcl9wa3RfbmV4dCgmY2EtPnNsb3RfaW5mb1tzbG90XS5yeF9idWZmZXIsIC0xLCAmZnJhZ2xlbik7CisJCXdoaWxlIChpZHggIT0gLTEpIHsKKwkJCWR2Yl9yaW5nYnVmZmVyX3BrdF9yZWFkKCZjYS0+c2xvdF9pbmZvW3Nsb3RdLnJ4X2J1ZmZlciwgaWR4LCAwLCBoZHIsIDIpOworCQkJaWYgKGNvbm5lY3Rpb25faWQgPT0gLTEpCisJCQkJY29ubmVjdGlvbl9pZCA9IGhkclswXTsKKwkJCWlmICgoaGRyWzBdID09IGNvbm5lY3Rpb25faWQpCisjaWZuZGVmIFJFQURfTFBEVV9QS1QKKwkJCQkmJiAoKGhkclsxXSAmIDB4ODApID09IDApCisjZW5kaWYKKwkJCSkgeworCQkJCSpfc2xvdCA9IHNsb3Q7CisJCQkJZm91bmQgPSAxOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZHggPSBkdmJfcmluZ2J1ZmZlcl9wa3RfbmV4dCgmY2EtPnNsb3RfaW5mb1tzbG90XS5yeF9idWZmZXIsIGlkeCwgJmZyYWdsZW4pOworCQl9CisKK25leHRzbG90OgorCQlzbG90ID0gKHNsb3QgKyAxKSAlIGNhLT5zbG90X2NvdW50OworCQlzbG90X2NvdW50Kys7CisJfQorCisJY2EtPm5leHRfcmVhZF9zbG90ID0gc2xvdDsKKwlyZXR1cm4gZm91bmQ7Cit9CisKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiByZWFkKCkgc3lzY2FsbC4KKyAqCisgKiBAZmlsZTogRmlsZSBzdHJ1Y3R1cmUuCisgKiBAYnVmOiBEZXN0aW5hdGlvbiBidWZmZXIuCisgKiBAY291bnQ6IFNpemUgb2YgZGVzdGluYXRpb24gYnVmZmVyLgorICogQHBwb3M6IFBvc2l0aW9uIGluIGZpbGUgKGlnbm9yZWQpLgorICoKKyAqIEByZXR1cm4gTnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIDwwIG9uIGVycm9yLgorICovCitzdGF0aWMgc3NpemVfdCBkdmJfY2FfZW41MDIyMV9pb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKmNhID0gZHZiZGV2LT5wcml2OworCWludCBzdGF0dXM7CisJaW50IHJlc3VsdCA9IDA7CisJdTggaGRyWzJdOworCWludCBzbG90OworCWludCBjb25uZWN0aW9uX2lkID0gLTE7CisJc2l6ZV90IGlkeCwgaWR4MjsKKwlpbnQgbGFzdF9mcmFnbWVudCA9IDA7CisJc2l6ZV90IGZyYWdsZW47CisJaW50IHBrdGxlbjsKKwlpbnQgZGlzcG9zZSA9IDA7CisKKyNpZmRlZiBSRUFEX0xQRFVfUEtUCisJaW50IG9mZnNldDsKKwl1OCBmbGFnID0gMDsKKyNlbmRpZgorCWRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBPdXRnb2luZyBwYWNrZXQgaGFzIGEgMiBieXRlIGhlYWRlci4gaGRyWzBdID0gc2xvdF9pZCwgaGRyWzFdID0gY29ubmVjdGlvbl9pZCAqLworCWlmIChjb3VudCA8IDIpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogd2FpdCBmb3Igc29tZSBkYXRhICovCisJaWYgKChzdGF0dXMgPSBkdmJfY2FfZW41MDIyMV9pb19yZWFkX2NvbmRpdGlvbihjYSwgJnJlc3VsdCwgJnNsb3QpKSA9PSAwKSB7CisKKwkJLyogaWYgd2UncmUgaW4gbm9uYmxvY2tpbmcgbW9kZSwgZXhpdCBpbW1lZGlhdGVseSAqLworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQlyZXR1cm4gLUVXT1VMREJMT0NLOworCisJCS8qIHdhaXQgZm9yIHNvbWUgZGF0YSAqLworCQlzdGF0dXMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoY2EtPndhaXRfcXVldWUsCisJCQkJCQkgIGR2Yl9jYV9lbjUwMjIxX2lvX3JlYWRfY29uZGl0aW9uCisJCQkJCQkgIChjYSwgJnJlc3VsdCwgJnNsb3QpKTsKKwl9CisJaWYgKChzdGF0dXMgPCAwKSB8fCAocmVzdWx0IDwgMCkpIHsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJaWR4ID0gZHZiX3JpbmdidWZmZXJfcGt0X25leHQoJmNhLT5zbG90X2luZm9bc2xvdF0ucnhfYnVmZmVyLCAtMSwgJmZyYWdsZW4pOworCXBrdGxlbiA9IDI7CisJZG8geworCQlpZiAoaWR4ID09IC0xKSB7CisJCQlwcmludGsoImR2Yl9jYSBhZGFwdGVyICVkOiBCVUc6IHJlYWQgcGFja2V0IGVuZGVkIGJlZm9yZSBsYXN0X2ZyYWdtZW50IGVuY291bnRlcmVkXG4iLCBjYS0+ZHZiZGV2LT5hZGFwdGVyLT5udW0pOworCQkJc3RhdHVzID0gLUVJTzsKKwkJCWdvdG8gZXhpdDsKKwkJfQorI2lmZGVmIFJFQURfTFBEVV9QS1QKKwkJb2Zmc2V0ID0gMiArIGNhLT5zbG90X2luZm9bc2xvdF0ucnhfb2Zmc2V0OworI2VuZGlmCisJCWR2Yl9yaW5nYnVmZmVyX3BrdF9yZWFkKCZjYS0+c2xvdF9pbmZvW3Nsb3RdLnJ4X2J1ZmZlciwgaWR4LCAwLCBoZHIsIDIpOworCQlpZiAoY29ubmVjdGlvbl9pZCA9PSAtMSkKKwkJCWNvbm5lY3Rpb25faWQgPSBoZHJbMF07CisjaWZkZWYgUkVBRF9MUERVX1BLVAorCQlmbGFnID0gaGRyWzFdOworCQlpZiAoaGRyWzBdID09IGNvbm5lY3Rpb25faWQpIHsKKwkJCWlmIChwa3RsZW4gPCBjb3VudCkgeworCQkJCWlmICgocGt0bGVuICsgZnJhZ2xlbiAtIG9mZnNldCkgPiAoY291bnQgLSAyKSkgeworCQkJCQlmcmFnbGVuID0gKGNvdW50IC0gMikgLSBwa3RsZW47CisJCQkJCWNhLT5zbG90X2luZm9bc2xvdF0ucnhfb2Zmc2V0ICs9CisJCQkJCQkJCQlmcmFnbGVuOworCQkJCQkvKiBtb3JlIGRhdGEgZm9yIHVzZXIsCisJCQkJCSAgIGJ1dCBjYW5ub3Qgc2VuZCwKKwkJCQkJICAgc28gZm9yY2UgcmV0dXJuIHRvIHVzZXIsCisJCQkJCSAgIHJhdGhlciB0aGFuIGRpc3Bvc2Ugb2YgaXQgKi8KKwkJCQkJZmxhZyB8PSAweDgwOworCQkJCX0gZWxzZSB7CisJCQkJCWNhLT5zbG90X2luZm9bc2xvdF0ucnhfb2Zmc2V0ID0gMDsKKwkJCQkJZnJhZ2xlbiAtPSBvZmZzZXQ7CisJCQkJCWRpc3Bvc2UgPSAxOworCQkJCX0KKworCQkJCXN0YXR1cyA9IGR2Yl9yaW5nYnVmZmVyX3BrdF9yZWFkX3VzZXIoCisJCQkJCSZjYS0+c2xvdF9pbmZvW3Nsb3RdLnJ4X2J1ZmZlciwKKwkJCQkJaWR4LAorCQkJCQlvZmZzZXQsCisJCQkJCWJ1ZiArIHBrdGxlbiArIDIsCisJCQkJCWZyYWdsZW4pOworCQkJCWlmIChzdGF0dXMgPCAwKQorCQkJCQlnb3RvIGV4aXQ7CisJCQkJcGt0bGVuICs9IGZyYWdsZW47CisJCQl9CisKKwkJCWxhc3RfZnJhZ21lbnQgPSAxOworCQl9CisjZWxzZQorCQlpZiAoaGRyWzBdID09IGNvbm5lY3Rpb25faWQpIHsKKwkJCWlmIChwa3RsZW4gPCBjb3VudCkgeworCQkJCWlmICgocGt0bGVuICsgZnJhZ2xlbiAtIDIpID4gY291bnQpIHsKKwkJCQkJZnJhZ2xlbiA9IGNvdW50IC0gcGt0bGVuOworCQkJCX0gZWxzZSB7CisJCQkJCWZyYWdsZW4gLT0gMjsKKwkJCQl9CisKKwkJCQlpZiAoKHN0YXR1cyA9IGR2Yl9yaW5nYnVmZmVyX3BrdF9yZWFkX3VzZXIoJmNhLT5zbG90X2luZm9bc2xvdF0ucnhfYnVmZmVyLCBpZHgsIDIsCisJCQkJCQkJCSAgICAgIGJ1ZiArIHBrdGxlbiwgZnJhZ2xlbikpIDwgMCkgeworCQkJCQlnb3RvIGV4aXQ7CisJCQkJfQorCQkJCXBrdGxlbiArPSBmcmFnbGVuOworCQkJfQorCisJCQlpZiAoKGhkclsxXSAmIDB4ODApID09IDApCisJCQkJbGFzdF9mcmFnbWVudCA9IDE7CisJCQlkaXNwb3NlID0gMTsKKwkJfQorI2VuZGlmCisJCWlkeDIgPSBkdmJfcmluZ2J1ZmZlcl9wa3RfbmV4dCgmY2EtPnNsb3RfaW5mb1tzbG90XS5yeF9idWZmZXIsCisJCQkJaWR4LCAmZnJhZ2xlbik7CisJCWlmIChkaXNwb3NlKQorCQkJZHZiX3JpbmdidWZmZXJfcGt0X2Rpc3Bvc2UoJmNhLT5zbG90X2luZm9bc2xvdF0ucnhfYnVmZmVyLCBpZHgpOworCQlpZHggPSBpZHgyOworCQlkaXNwb3NlID0gMDsKKwl9IHdoaWxlICghbGFzdF9mcmFnbWVudCk7CisKKwloZHJbMF0gPSBzbG90OworCWhkclsxXSA9IGNvbm5lY3Rpb25faWQ7CisJc3RhdHVzID0gY29weV90b191c2VyKGJ1ZiwgaGRyLCAyKTsKKwlpZiAoc3RhdHVzKSB7CisJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCWdvdG8gZXhpdDsKKwl9CisJc3RhdHVzID0gcGt0bGVuOworCisjaWZkZWYgUkVBRF9MUERVX1BLVAorCWhkclswXSA9IGZsYWc7CisJaGRyWzFdID0gMDsKKworCXN0YXR1cyA9IGNvcHlfdG9fdXNlcihidWYgKyAyLCBoZHIsIDIpOworCWlmIChzdGF0dXMpIHsKKwkJc3RhdHVzID0gLUVGQVVMVDsKKwkJZ290byBleGl0OworCX0KKwlzdGF0dXMgPSBwa3RsZW4gKyAyOworI2VuZGlmCitleGl0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBmaWxlIG9wZW4gc3lzY2FsbC4KKyAqCisgKiBAaW5vZGU6IElub2RlIGNvbmNlcm5lZC4KKyAqIEBmaWxlOiBGaWxlIGNvbmNlcm5lZC4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgPDAgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBkdmJfY2FfZW41MDIyMV9pb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSA9IGR2YmRldi0+cHJpdjsKKwlpbnQgZXJyOworCWludCBpOworCisJcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOworCisJaWYgKCF0cnlfbW9kdWxlX2dldChjYS0+cHViLT5vd25lcikpCisJCXJldHVybiAtRUlPOworCisJZXJyID0gZHZiX2dlbmVyaWNfb3Blbihpbm9kZSwgZmlsZSk7CisJaWYgKGVyciA8IDApIHsKKwkJbW9kdWxlX3B1dChjYS0+cHViLT5vd25lcik7CisJCXJldHVybiBlcnI7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNhLT5zbG90X2NvdW50OyBpKyspIHsKKworCQlpZiAoY2EtPnNsb3RfaW5mb1tpXS5zbG90X3N0YXRlID09IERWQl9DQV9TTE9UU1RBVEVfUlVOTklORykgeworCQkJaWYgKGNhLT5zbG90X2luZm9baV0ucnhfYnVmZmVyLmRhdGEgIT0gTlVMTCkgeworCQkJCS8qIGl0IGlzIHNhZmUgdG8gY2FsbCB0aGlzIGhlcmUgd2l0aG91dCBsb2NrcyBiZWNhdXNlCisJCQkJICogY2EtPm9wZW4gPT0gMC4gRGF0YSBpcyBub3QgcmVhZCBpbiB0aGlzIGNhc2UgKi8KKwkJCQlkdmJfcmluZ2J1ZmZlcl9mbHVzaCgmY2EtPnNsb3RfaW5mb1tpXS5yeF9idWZmZXIpOworCQkJfQorCQl9CisJfQorCisJY2EtPm9wZW4gPSAxOworCWR2Yl9jYV9lbjUwMjIxX3RocmVhZF91cGRhdGVfZGVsYXkoY2EpOworCWR2Yl9jYV9lbjUwMjIxX3RocmVhZF93YWtldXAoY2EpOworCisJZHZiX2NhX3ByaXZhdGVfZ2V0KGNhKTsKKworCXJldHVybiAwOworfQorCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgZmlsZSBjbG9zZSBzeXNjYWxsLgorICoKKyAqIEBpbm9kZTogSW5vZGUgY29uY2VybmVkLgorICogQGZpbGU6IEZpbGUgY29uY2VybmVkLgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCA8MCBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGR2Yl9jYV9lbjUwMjIxX2lvX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKmNhID0gZHZiZGV2LT5wcml2OworCWludCBlcnI7CisKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOworCisJLyogbWFyayB0aGUgQ0EgZGV2aWNlIGFzIGNsb3NlZCAqLworCWNhLT5vcGVuID0gMDsKKwlkdmJfY2FfZW41MDIyMV90aHJlYWRfdXBkYXRlX2RlbGF5KGNhKTsKKworCWVyciA9IGR2Yl9nZW5lcmljX3JlbGVhc2UoaW5vZGUsIGZpbGUpOworCisJbW9kdWxlX3B1dChjYS0+cHViLT5vd25lcik7CisKKwlkdmJfY2FfcHJpdmF0ZV9wdXQoY2EpOworCisJcmV0dXJuIGVycjsKK30KKworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHBvbGwoKSBzeXNjYWxsLgorICoKKyAqIEBmaWxlOiBGaWxlIGNvbmNlcm5lZC4KKyAqIEB3YWl0OiBwb2xsIHdhaXQgdGFibGUuCisgKgorICogQHJldHVybiBTdGFuZGFyZCBwb2xsIG1hc2suCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZHZiX2NhX2VuNTAyMjFfaW9fcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqIHdhaXQpCit7CisJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKmNhID0gZHZiZGV2LT5wcml2OworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKwlpbnQgc2xvdDsKKwlpbnQgcmVzdWx0ID0gMDsKKworCWRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoZHZiX2NhX2VuNTAyMjFfaW9fcmVhZF9jb25kaXRpb24oY2EsICZyZXN1bHQsICZzbG90KSA9PSAxKSB7CisJCW1hc2sgfD0gUE9MTElOOworCX0KKworCS8qIGlmIHRoZXJlIGlzIHNvbWV0aGluZywgcmV0dXJuIG5vdyAqLworCWlmIChtYXNrKQorCQlyZXR1cm4gbWFzazsKKworCS8qIHdhaXQgZm9yIHNvbWV0aGluZyB0byBoYXBwZW4gKi8KKwlwb2xsX3dhaXQoZmlsZSwgJmNhLT53YWl0X3F1ZXVlLCB3YWl0KTsKKworCWlmIChkdmJfY2FfZW41MDIyMV9pb19yZWFkX2NvbmRpdGlvbihjYSwgJnJlc3VsdCwgJnNsb3QpID09IDEpIHsKKwkJbWFzayB8PSBQT0xMSU47CisJfQorCisJcmV0dXJuIG1hc2s7Cit9CitFWFBPUlRfU1lNQk9MKGR2Yl9jYV9lbjUwMjIxX2NpbWN1X2luaXQpOworCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfRFZCX0NPTVBBVAorc3RhdGljIGxvbmcgZHZiX2NhX2VuNTAyMjFfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmdzKQoreworCXVuc2lnbmVkIGxvbmcgcmV0OworI2lmZGVmIENPTkZJR19DT01QQVQKKwlhcmdzID0gKHVuc2lnbmVkIGxvbmcpY29tcGF0X3B0cihhcmdzKTsKKyNlbmRpZgorCXJldCA9IGR2Yl9jYV9lbjUwMjIxX2lvX2lvY3RsKGZpbHAsIGNtZCwgYXJncyk7CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkdmJfY2FfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkucmVhZCA9IGR2Yl9jYV9lbjUwMjIxX2lvX3JlYWQsCisJLndyaXRlID0gZHZiX2NhX2VuNTAyMjFfaW9fd3JpdGUsCisJLnVubG9ja2VkX2lvY3RsID0gZHZiX2NhX2VuNTAyMjFfaW9faW9jdGwsCisJLm9wZW4gPSBkdmJfY2FfZW41MDIyMV9pb19vcGVuLAorCS5yZWxlYXNlID0gZHZiX2NhX2VuNTAyMjFfaW9fcmVsZWFzZSwKKwkucG9sbCA9IGR2Yl9jYV9lbjUwMjIxX2lvX3BvbGwsCisJLmxsc2VlayA9IG5vb3BfbGxzZWVrLAorI2lmZGVmIENPTkZJR19BTUxPR0lDX0RWQl9DT01QQVQKKwkuY29tcGF0X2lvY3RsCT0gZHZiX2NhX2VuNTAyMjFfY29tcGF0X2lvY3RsLAorI2VuZGlmCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGR2Yl9kZXZpY2UgZHZiZGV2X2NhID0geworCS5wcml2ID0gTlVMTCwKKwkudXNlcnMgPSAxLAorCS5yZWFkZXJzID0gMSwKKwkud3JpdGVycyA9IDEsCisjaWYgZGVmaW5lZChDT05GSUdfTUVESUFfQ09OVFJPTExFUl9EVkIpCisJLm5hbWUgPSAiZHZiLWNhLWVuNTAyMjEiLAorI2VuZGlmCisJLmZvcHMgPSAmZHZiX2NhX2ZvcHMsCit9OworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogSW5pdGlhbGlzYXRpb24vc2h1dGRvd24gZnVuY3Rpb25zICovCisKKworLyoqCisgKiBJbml0aWFsaXNlIGEgbmV3IERWQiBDQSBFTjUwMjIxIGludGVyZmFjZSBkZXZpY2UuCisgKgorICogQGR2Yl9hZGFwdGVyOiBEVkIgYWRhcHRlciB0byBhdHRhY2ggdGhlIG5ldyBDQSBkZXZpY2UgdG8uCisgKiBAY2E6IFRoZSBkdmJfY2EgaW5zdGFuY2UuCisgKiBAZmxhZ3M6IEZsYWdzIGRlc2NyaWJpbmcgdGhlIENBIGRldmljZSAoRFZCX0NBX0ZMQUdfKikuCisgKiBAc2xvdF9jb3VudDogTnVtYmVyIG9mIHNsb3RzIHN1cHBvcnRlZC4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcywgbm9uemVybyBvbiBmYWlsdXJlCisgKi8KK2ludCBkdmJfY2FfZW41MDIyMV9jaW1jdV9pbml0KHN0cnVjdCBkdmJfYWRhcHRlciAqZHZiX2FkYXB0ZXIsCisJCQlzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltY3UgKnB1YmNhLCBpbnQgZmxhZ3MsIGludCBzbG90X2NvdW50KQoreworCWludCByZXQ7CisJc3RydWN0IGR2Yl9jYV9wcml2YXRlICpjYSA9IE5VTEw7CisJaW50IGk7CisKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOworCXByaW50aygiLS0tJXNcbiIsIF9fZnVuY19fKTsKKwlpZiAoc2xvdF9jb3VudCA8IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogaW5pdGlhbGlzZSB0aGUgc3lzdGVtIGRhdGEgKi8KKwlpZiAoKGNhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGR2Yl9jYV9wcml2YXRlKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKwlrcmVmX2luaXQoJmNhLT5yZWZjb3VudCk7CisJY2EtPnB1YiA9IHB1YmNhOworCWNhLT5mbGFncyA9IGZsYWdzOworCWNhLT5zbG90X2NvdW50ID0gc2xvdF9jb3VudDsKKwlpZiAoKGNhLT5zbG90X2luZm8gPSBrY2FsbG9jKHNsb3RfY291bnQsIHNpemVvZihzdHJ1Y3QgZHZiX2NhX3Nsb3QpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZyZWVfY2E7CisJfQorCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhLT53YWl0X3F1ZXVlKTsKKwljYS0+b3BlbiA9IDA7CisJY2EtPndha2V1cCA9IDA7CisJY2EtPm5leHRfcmVhZF9zbG90ID0gMDsKKwlwdWJjYS0+cHJpdmF0ZSA9IGNhOworCisJLyogcmVnaXN0ZXIgdGhlIERWQiBkZXZpY2UgKi8KKwlyZXQgPSBkdmJfcmVnaXN0ZXJfZGV2aWNlKGR2Yl9hZGFwdGVyLCAmY2EtPmR2YmRldiwgJmR2YmRldl9jYSwgY2EsIERWQl9ERVZJQ0VfQ0EsIDApOworCWlmIChyZXQpCisJCWdvdG8gZnJlZV9zbG90X2luZm87CisKKwkvKiBub3cgaW5pdGlhbGlzZSBlYWNoIHNsb3QgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2xvdF9jb3VudDsgaSsrKSB7CisJCW1lbXNldCgmY2EtPnNsb3RfaW5mb1tpXSwgMCwgc2l6ZW9mKHN0cnVjdCBkdmJfY2Ffc2xvdCkpOworCQljYS0+c2xvdF9pbmZvW2ldLnNsb3Rfc3RhdGUgPSBEVkJfQ0FfU0xPVFNUQVRFX05PTkU7CisJCWF0b21pY19zZXQoJmNhLT5zbG90X2luZm9baV0uY2FtY2hhbmdlX2NvdW50LCAwKTsKKwkJY2EtPnNsb3RfaW5mb1tpXS5jYW1jaGFuZ2VfdHlwZSA9IERWQl9DQV9FTjUwMjIxX0NBTUNIQU5HRV9SRU1PVkVEOworCQltdXRleF9pbml0KCZjYS0+c2xvdF9pbmZvW2ldLnNsb3RfbG9jayk7CisJfQorCisJbXV0ZXhfaW5pdCgmY2EtPmlvY3RsX211dGV4KTsKKworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQlyZXQgPSAtRUlOVFI7CisJCWdvdG8gdW5yZWdpc3Rlcl9kZXZpY2U7CisJfQorCW1iKCk7CisKKwkvKiBjcmVhdGUgYSBrdGhyZWFkIGZvciBtb25pdG9yaW5nIHRoaXMgQ0EgZGV2aWNlICovCisJY2EtPnRocmVhZCA9IGt0aHJlYWRfcnVuKGR2Yl9jYV9lbjUwMjIxX3RocmVhZCwgY2EsICJrZHZiLWNhLSVpOiVpIiwKKwkJCQkgY2EtPmR2YmRldi0+YWRhcHRlci0+bnVtLCBjYS0+ZHZiZGV2LT5pZCk7CisJaWYgKElTX0VSUihjYS0+dGhyZWFkKSkgeworCQlyZXQgPSBQVFJfRVJSKGNhLT50aHJlYWQpOworCQlwcmludGsoImR2Yl9jYV9pbml0OiBmYWlsZWQgdG8gc3RhcnQga2VybmVsX3RocmVhZCAoJWQpXG4iLAorCQkJcmV0KTsKKwkJZ290byB1bnJlZ2lzdGVyX2RldmljZTsKKwl9CisJcmV0dXJuIDA7CisKK3VucmVnaXN0ZXJfZGV2aWNlOgorCWR2Yl91bnJlZ2lzdGVyX2RldmljZShjYS0+ZHZiZGV2KTsKK2ZyZWVfc2xvdF9pbmZvOgorCWtmcmVlKGNhLT5zbG90X2luZm8pOworZnJlZV9jYToKKwlrZnJlZShjYSk7CitleGl0OgorCXB1YmNhLT5wcml2YXRlID0gTlVMTDsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChkdmJfY2FfZW41MDIyMV9jaW1jdV9yZWxlYXNlKTsKKworCisKKy8qKgorICogUmVsZWFzZSBhIERWQiBDQSBFTjUwMjIxIGludGVyZmFjZSBkZXZpY2UuCisgKgorICogQGNhX2RldjogVGhlIGR2Yl9kZXZpY2VfdCBpbnN0YW5jZSBmb3IgdGhlIENBIGRldmljZS4KKyAqIEBjYTogVGhlIGFzc29jaWF0ZWQgZHZiX2NhIGluc3RhbmNlLgorICovCit2b2lkIGR2Yl9jYV9lbjUwMjIxX2NpbWN1X3JlbGVhc2Uoc3RydWN0IGR2Yl9jYV9lbjUwMjIxX2NpbWN1ICpwdWJjYSkKK3sKKwlzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKmNhID0gcHViY2EtPnByaXZhdGU7CisJaW50IGk7CisKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOworCisJLyogc2h1dGRvd24gdGhlIHRocmVhZCBpZiB0aGVyZSB3YXMgb25lICovCisJa3RocmVhZF9zdG9wKGNhLT50aHJlYWQpOworCisJZm9yIChpID0gMDsgaSA8IGNhLT5zbG90X2NvdW50OyBpKyspIHsKKwkJZHZiX2NhX2VuNTAyMjFfc2xvdF9zaHV0ZG93bihjYSwgaSk7CisJfQorCWR2Yl9jYV9wcml2YXRlX3B1dChjYSk7CisJcHViY2EtPnByaXZhdGUgPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1jdS9kdmJfY2FfZW41MDIyMV9jaW1jdS5oIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jaS9jaW1jdS9kdmJfY2FfZW41MDIyMV9jaW1jdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMTRkMTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NpL2NpbWN1L2R2Yl9jYV9lbjUwMjIxX2NpbWN1LmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBkdmJfY2EuaDogZ2VuZXJpYyBEVkIgZnVuY3Rpb25zIGZvciBFTjUwMjIxIENBIGludGVyZmFjZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgQW5kcmV3IGRlIFF1aW5jZXkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfRFZCX0NBX0VONTAyMjFfQ0lNQ1VfSF8KKyNkZWZpbmUgX0RWQl9DQV9FTjUwMjIxX0NJTUNVX0hfCisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZHZiL2NhLmg+CisKKyNpbmNsdWRlICJkdmJkZXYuaCIKKworI2RlZmluZSBEVkJfQ0FfRU41MDIyMV9QT0xMX0NBTV9QUkVTRU5UCTEKKyNkZWZpbmUgRFZCX0NBX0VONTAyMjFfUE9MTF9DQU1fQ0hBTkdFRAkyCisjZGVmaW5lIERWQl9DQV9FTjUwMjIxX1BPTExfQ0FNX1JFQURZCQk0CisKKyNkZWZpbmUgRFZCX0NBX0VONTAyMjFfRkxBR19JUlFfQ0FNQ0hBTkdFCTEKKyNkZWZpbmUgRFZCX0NBX0VONTAyMjFfRkxBR19JUlFfRlIJCTIKKyNkZWZpbmUgRFZCX0NBX0VONTAyMjFfRkxBR19JUlFfREEJCTQKKworI2RlZmluZSBEVkJfQ0FfRU41MDIyMV9DQU1DSEFOR0VfUkVNT1ZFRAkJMAorI2RlZmluZSBEVkJfQ0FfRU41MDIyMV9DQU1DSEFOR0VfSU5TRVJURUQJCTEKKworLyoqCisgKiBzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEtIFN0cnVjdHVyZSBkZXNjcmliaW5nIGEgQ0EgaW50ZXJmYWNlCisgKgorICogQG93bmVyOgkJdGhlIG1vZHVsZSBvd25pbmcgdGhpcyBzdHJ1Y3R1cmUKKyAqIEByZWFkX2F0dHJpYnV0ZV9tZW06CWZ1bmN0aW9uIGZvciByZWFkaW5nIGF0dHJpYnV0ZSBtZW1vcnkgb24gdGhlIENBTQorICogQHdyaXRlX2F0dHJpYnV0ZV9tZW06IGZ1bmN0aW9uIGZvciB3cml0aW5nIGF0dHJpYnV0ZSBtZW1vcnkgb24gdGhlIENBTQorICogQHJlYWRfY2FtX2NvbnRyb2w6CWZ1bmN0aW9uIGZvciByZWFkaW5nIHRoZSBjb250cm9sIGludGVyZmFjZSBvbiB0aGUgQ0FNCisgKiBAd3JpdGVfY2FtX2NvbnRyb2w6CWZ1bmN0aW9uIGZvciByZWFkaW5nIHRoZSBjb250cm9sIGludGVyZmFjZSBvbiB0aGUgQ0FNCisgKiBAc2xvdF9yZXNldDoJCWZ1bmN0aW9uIHRvIHJlc2V0IHRoZSBDQU0gc2xvdAorICogQHNsb3Rfc2h1dGRvd246CWZ1bmN0aW9uIHRvIHNodXRkb3duIGEgQ0FNIHNsb3QKKyAqIEBzbG90X3RzX2VuYWJsZToJZnVuY3Rpb24gdG8gZW5hYmxlIHRoZSBUcmFuc3BvcnQgU3RyZWFtIG9uIGEgQ0FNIHNsb3QKKyAqIEBwb2xsX3Nsb3Rfc3RhdHVzOglmdW5jdGlvbiB0byBwb2xsIHNsb3Qgc3RhdHVzLiBPbmx5IG5lY2Vzc2FyeSBpZgorICoJCQlEVkJfQ0FfRkxBR19FTjUwMjIxX0lSUV9DQU1DSEFOR0UgaXMgbm90IHNldC4KKyAqIEBkYXRhOgkJcHJpdmF0ZSBkYXRhLCB1c2VkIGJ5IGNhbGxlci4KKyAqIEBwcml2YXRlOgkJT3BhcXVlIGRhdGEgdXNlZCBieSB0aGUgZHZiX2NhIGNvcmUuIERvIG5vdCBtb2RpZnkhCisgKgorICogTk9URTogdGhlIHJlYWRfKiwgd3JpdGVfKiBhbmQgcG9sbF9zbG90X3N0YXR1cyBmdW5jdGlvbnMgd2lsbCBiZQorICogY2FsbGVkIGZvciBkaWZmZXJlbnQgc2xvdHMgY29uY3VycmVudGx5IGFuZCBuZWVkIHRvIHVzZSBsb2NrcyB3aGVyZQorICogYW5kIGlmIGFwcHJvcHJpYXRlLiBUaGVyZSB3aWxsIGJlIG5vIGNvbmN1cnJlbnQgYWNjZXNzIHRvIG9uZSBzbG90LgorICovCitzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltY3UgeworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworCisJaW50ICgqcmVhZF9hdHRyaWJ1dGVfbWVtKShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltY3UgKmNhLAorCQkJCSAgaW50IHNsb3QsIGludCBhZGRyZXNzKTsKKwlpbnQgKCp3cml0ZV9hdHRyaWJ1dGVfbWVtKShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltY3UgKmNhLAorCQkJCSAgIGludCBzbG90LCBpbnQgYWRkcmVzcywgdTggdmFsdWUpOworCisJaW50ICgqcmVhZF9jYW1fY29udHJvbCkoc3RydWN0IGR2Yl9jYV9lbjUwMjIxX2NpbWN1ICpjYSwKKwkJCQlpbnQgc2xvdCwgdTggYWRkcmVzcyk7CisJaW50ICgqd3JpdGVfY2FtX2NvbnRyb2wpKHN0cnVjdCBkdmJfY2FfZW41MDIyMV9jaW1jdSAqY2EsCisJCQkJIGludCBzbG90LCB1OCBhZGRyZXNzLCB1OCB2YWx1ZSk7CisKKwlpbnQgKCpzbG90X3Jlc2V0KShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltY3UgKmNhLCBpbnQgc2xvdCk7CisJaW50ICgqc2xvdF9zaHV0ZG93bikoc3RydWN0IGR2Yl9jYV9lbjUwMjIxX2NpbWN1ICpjYSwgaW50IHNsb3QpOworCWludCAoKnNsb3RfdHNfZW5hYmxlKShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltY3UgKmNhLCBpbnQgc2xvdCk7CisKKwlpbnQgKCpwb2xsX3Nsb3Rfc3RhdHVzKShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltY3UgKmNhLCBpbnQgc2xvdCwgaW50IG9wZW4pOworCWludCAoKmdldF9zbG90X3dha2V1cCkoc3RydWN0IGR2Yl9jYV9lbjUwMjIxX2NpbWN1ICpjYSwgaW50IHNsb3QpOworCisJdm9pZCAqZGF0YTsKKworCXZvaWQgKnByaXZhdGU7Cit9OworCisvKgorICogRnVuY3Rpb25zIGZvciByZXBvcnRpbmcgSVJRIGV2ZW50cworICovCisKKy8qKgorICogZHZiX2NhX2VuNTAyMjFfY2FtY2hhbmdlX2lycSAtIEEgQ0FNQ0hBTkdFIElSUSBoYXMgb2NjdXJyZWQuCisgKgorICogQHB1YmNhOiBDQSBpbnN0YW5jZS4KKyAqIEBzbG90OiBTbG90IGNvbmNlcm5lZC4KKyAqIEBjaGFuZ2VfdHlwZTogT25lIG9mIHRoZSBEVkJfQ0FfQ0FNQ0hBTkdFXyogdmFsdWVzCisgKi8KK3ZvaWQgZHZiX2NhX2VuNTAyMjFfY2ltY3VfY2FtY2hhbmdlX2lycShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltY3UgKnB1YmNhLCBpbnQgc2xvdCwKKwkJCQkgIGludCBjaGFuZ2VfdHlwZSk7CisKKy8qKgorICogZHZiX2NhX2VuNTAyMjFfY2FtcmVhZHlfaXJxIC0gQSBDQU1SRUFEWSBJUlEgaGFzIG9jY3VycmVkLgorICoKKyAqIEBwdWJjYTogQ0EgaW5zdGFuY2UuCisgKiBAc2xvdDogU2xvdCBjb25jZXJuZWQuCisgKi8KK3ZvaWQgZHZiX2NhX2VuNTAyMjFfY2ltY3VfY2FtcmVhZHlfaXJxKHN0cnVjdCBkdmJfY2FfZW41MDIyMV9jaW1jdSAqcHViY2EsIGludCBzbG90KTsKKworLyoqCisgKiBkdmJfY2FfZW41MDIyMV9mcmRhX2lycSAtIEFuIEZSIG9yIGEgREEgSVJRIGhhcyBvY2N1cnJlZC4KKyAqCisgKiBAY2E6IENBIGluc3RhbmNlLgorICogQHNsb3Q6IFNsb3QgY29uY2VybmVkLgorICovCit2b2lkIGR2Yl9jYV9lbjUwMjIxX2NpbWN1X2ZyZGFfaXJxKHN0cnVjdCBkdmJfY2FfZW41MDIyMV9jaW1jdSAqY2EsIGludCBzbG90KTsKKworLyoKKyAqIEluaXRpYWxpc2F0aW9uL3NodXRkb3duIGZ1bmN0aW9ucworICovCisKKy8qKgorICogZHZiX2NhX2VuNTAyMjFfaW5pdCAtIEluaXRpYWxpc2UgYSBuZXcgRFZCIENBIGRldmljZS4KKyAqCisgKiBAZHZiX2FkYXB0ZXI6IERWQiBhZGFwdGVyIHRvIGF0dGFjaCB0aGUgbmV3IENBIGRldmljZSB0by4KKyAqIEBjYTogVGhlIGR2Yl9jYSBpbnN0YW5jZS4KKyAqIEBmbGFnczogRmxhZ3MgZGVzY3JpYmluZyB0aGUgQ0EgZGV2aWNlIChEVkJfQ0FfRU41MDIyMV9GTEFHXyopLgorICogQHNsb3RfY291bnQ6IE51bWJlciBvZiBzbG90cyBzdXBwb3J0ZWQuCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIG5vbnplcm8gb24gZmFpbHVyZQorICovCitleHRlcm4gaW50IGR2Yl9jYV9lbjUwMjIxX2NpbWN1X2luaXQoc3RydWN0IGR2Yl9hZGFwdGVyICpkdmJfYWRhcHRlciwKKwkJCSAgICAgICBzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltY3UgKmNhLCBpbnQgZmxhZ3MsCisJCQkgICAgICAgaW50IHNsb3RfY291bnQpOworCisvKioKKyAqIGR2Yl9jYV9lbjUwMjIxX3JlbGVhc2UgLSBSZWxlYXNlIGEgRFZCIENBIGRldmljZS4KKyAqCisgKiBAY2E6IFRoZSBhc3NvY2lhdGVkIGR2Yl9jYSBpbnN0YW5jZS4KKyAqLworZXh0ZXJuIHZvaWQgZHZiX2NhX2VuNTAyMjFfY2ltY3VfcmVsZWFzZShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjFfY2ltY3UgKmNhKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NvbW1vbi5jIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2VhNjkxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jb21tb24uYwpAQCAtMCwwICsxLDE3IEBACisvKgorICogLi4vaGFyZHdhcmUvYW1sb2dpYy9tZWRpYV9tb2R1bGVzL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY29tbW9uLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2R2Yl9jb21tb24uaCBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRjNTk3YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9kdmJfY29tbW9uLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIC4uL2hhcmR3YXJlL2FtbG9naWMvbWVkaWFfbW9kdWxlcy9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZHZiX2NvbW1vbi5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgX19EVkJfQ09NTU9OX0hfXworI2RlZmluZSBfX0RWQl9DT01NT05fSF9fCisKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL2FtbF9kdmJfZXh0ZXJuLmg+CisKKyNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKKwordHlwZWRlZiBlbnVtIGRteF9zb3VyY2UgeworCURNWF9TT1VSQ0VfRlJPTlQwID0gMCwKKwlETVhfU09VUkNFX0ZST05UMSwKKwlETVhfU09VUkNFX0ZST05UMiwKKwlETVhfU09VUkNFX0ZST05UMywKKwlETVhfU09VUkNFX0RWUjAgICA9IDE2LAorCURNWF9TT1VSQ0VfRFZSMSwKKwlETVhfU09VUkNFX0RWUjIsCisJRE1YX1NPVVJDRV9EVlIzLAorCisjaWZkZWYgQ09ORklHX0FNTE9HSUNfRFZCX0NPTVBBVAorCURNWF9TT1VSQ0VfRlJPTlQwX09GRlNFVCA9IDEwMCwKKwlETVhfU09VUkNFX0ZST05UMV9PRkZTRVQsCisJRE1YX1NPVVJDRV9GUk9OVDJfT0ZGU0VUCisjZW5kaWYKK30gZG14X3NvdXJjZV90OworCitlbnVtIGFtbF9kbXhfaWRfdCB7CisJQU1fRE1YXzAgPSAwLAorCUFNX0RNWF8xLAorCUFNX0RNWF8yLAorCUFNX0RNWF9NQVgsCit9OworCitlbnVtIGFtbF90c19zb3VyY2VfdCB7CisJQU1fVFNfU1JDX1RTMCwKKwlBTV9UU19TUkNfVFMxLAorCUFNX1RTX1NSQ19UUzIsCisJQU1fVFNfU1JDX1RTMywKKworCUFNX1RTX1NSQ19TX1RTMCwKKwlBTV9UU19TUkNfU19UUzEsCisJQU1fVFNfU1JDX1NfVFMyLAorCUFNX1RTX1NSQ19TX1RTMywKKworCUFNX1RTX1NSQ19ISVUsCisJQU1fVFNfU1JDX0hJVTEsCisJQU1fVFNfU1JDX0RNWDAsCisJQU1fVFNfU1JDX0RNWDEsCisJQU1fVFNfU1JDX0RNWDIKK307CisKKyNlbmRpZiAvKiBfX0RWQl9DT01NT05fSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZXNwYXJzZXIuYyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9lc3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NzU1NTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZXNwYXJzZXIuYwpAQCAtMCwwICsxLDEwNDMgQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvbWVkaWEvc3RyZWFtX2lucHV0L3BhcnNlci9lc3BhcnNlci5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZnJhbWVfc3luYy9wdHNzZXJ2Lmg+CisKKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisKKy8qICNpbmNsdWRlIDxtYWNoL2FtX3JlZ3MuaD4gKi8KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAiLi4vLi4vZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjLmgiCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy92ZGVjX3JlZy5oPgorI2luY2x1ZGUgIi4uL2FtcG9ydHMvc3RyZWFtYnVmX3JlZy5oIgorI2luY2x1ZGUgIi4uL2FtcG9ydHMvc3RyZWFtYnVmLmgiCisjaW5jbHVkZSAiZXNwYXJzZXIuaCIKKyNpbmNsdWRlICIuLi9hbXBvcnRzL2FtcG9ydHNfcHJpdi5oIgorI2luY2x1ZGUgIi4uL2FtcG9ydHMvdGhyZWFkX3J3LmgiCisKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvZGVjX21tLmg+CisKKworCisjZGVmaW5lIFNBVkVfU0NSIDAKKworI2RlZmluZSBFU19TVEFSVF9DT0RFX1BBVFRFUk4gMHgwMDAwMDEwMAorI2RlZmluZSBFU19TVEFSVF9DT0RFX01BU0sgICAgMHhmZmZmZmYwMAorI2RlZmluZSBTRUFSQ0hfUEFUVEVSTl9MRU4gICA1MTIKKyNkZWZpbmUgRVNfUEFSU0VSX1BPUCAgICAgIFJFQURfUEFSU0VSX1JFRyhQRklGT19EQVRBKQorCisjZGVmaW5lIFBBUlNFUl9XUklURSAgICAgICAgKEVTX1dSSVRFIHwgRVNfUEFSU0VSX1NUQVJUKQorI2RlZmluZSBQQVJTRVJfVklERU8gICAgICAgIChFU19UWVBFX1ZJREVPKQorI2RlZmluZSBQQVJTRVJfQVVESU8gICAgICAgIChFU19UWVBFX0FVRElPKQorI2RlZmluZSBQQVJTRVJfU1VCUElDICAgICAgIChFU19UWVBFX1NVQlRJVExFKQorI2RlZmluZSBQQVJTRVJfUEFTU1RIUk9VR0ggIChFU19QQVNTVEhST1VHSCB8IEVTX1BBUlNFUl9TVEFSVCkKKyNkZWZpbmUgUEFSU0VSX0FVVE9TRUFSQ0ggICAoRVNfU0VBUkNIIHwgRVNfUEFSU0VSX1NUQVJUKQorI2RlZmluZSBQQVJTRVJfRElTQ0FSRCAgICAgIChFU19ESVNDQVJEIHwgRVNfUEFSU0VSX1NUQVJUKQorI2RlZmluZSBQQVJTRVJfQlVTWSAgICAgICAgIChFU19QQVJTRVJfQlVTWSkKKworI2RlZmluZSBNQVhfRFJNX1BBQ0tBR0VfU0laRSAweDUwMDAwMAorCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpzZWFyY2hfcGF0dGVybjsKK3N0YXRpYyBkbWFfYWRkcl90IHNlYXJjaF9wYXR0ZXJuX21hcDsKK3N0YXRpYyB1MzIgYXVkaW9fcmVhbF93cDsKK3N0YXRpYyB1MzIgYXVkaW9fYnVmX3N0YXJ0Oworc3RhdGljIHUzMiBhdWRpb19idWZfZW5kOworCitzdGF0aWMgY29uc3QgY2hhciBlc3BhcnNlcl9pZFtdID0gImVzcGFyc2VyLWlkIjsKKworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHdxKTsKKworCitzdGF0aWMgdTMyIHNlYXJjaF9kb25lOworc3RhdGljIHUzMiB2aWRlb19kYXRhX3BhcnNlZDsKK3N0YXRpYyB1MzIgYXVkaW9fZGF0YV9wYXJzZWQ7CitzdGF0aWMgYXRvbWljX3QgZXNwYXJzZXJfdXNlX2NvdW50ID0gQVRPTUlDX0lOSVQoMCk7CitzdGF0aWMgREVGSU5FX01VVEVYKGVzcGFyc2VyX211dGV4KTsKKworc3RhdGljIGlubGluZSB1MzIgZ2V0X2J1Zl93cCh1MzIgdHlwZSkKK3sKKwlpZiAodHlwZSA9PSBCVUZfVFlQRV9BVURJTykKKwkJcmV0dXJuIGF1ZGlvX3JlYWxfd3A7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgdTMyIGdldF9idWZfc3RhcnQodTMyIHR5cGUpCit7CisJaWYgKHR5cGUgPT0gQlVGX1RZUEVfQVVESU8pCisJCXJldHVybiBhdWRpb19idWZfc3RhcnQ7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgdTMyIGdldF9idWZfZW5kKHUzMiB0eXBlKQoreworCWlmICh0eXBlID09IEJVRl9UWVBFX0FVRElPKQorCQlyZXR1cm4gYXVkaW9fYnVmX2VuZDsKKwllbHNlCisJCXJldHVybiAwOworfQorc3RhdGljIHZvaWQgc2V0X2J1Zl93cCh1MzIgdHlwZSwgdTMyIHdwKQoreworCWlmICh0eXBlID09IEJVRl9UWVBFX0FVRElPKSB7CisJCWF1ZGlvX3JlYWxfd3AgPSB3cDsKKwkJV1JJVEVfQUlVX1JFRyhBSVVfTUVNX0FJRklGT19NQU5fV1AsIHdwLyogJiAweGZmZmZmZjAwKi8pOworCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBlc3BhcnNlcl9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXUzMiBpbnRfc3RhdHVzID0gUkVBRF9QQVJTRVJfUkVHKFBBUlNFUl9JTlRfU1RBVFVTKTsKKworCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX0lOVF9TVEFUVVMsIGludF9zdGF0dXMpOworCisJaWYgKGludF9zdGF0dXMgJiBQQVJTRVJfSU5UU1RBVF9TQ19GT1VORCkgeworCQlXUklURV9QQVJTRVJfUkVHKFBGSUZPX1JEX1BUUiwgMCk7CisJCVdSSVRFX1BBUlNFUl9SRUcoUEZJRk9fV1JfUFRSLCAwKTsKKwkJc2VhcmNoX2RvbmUgPSAxOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJndxKTsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBidWZfd3AodTMyIHR5cGUpCit7CisJdTMyIHdwOworCisJaWYgKChSRUFEX1BBUlNFUl9SRUcoUEFSU0VSX0VTX0NPTlRST0wpICYgRVNfVklEX01BTl9SRF9QVFIpID09IDApIHsKKwkJd3AgPQorI2lmIDEvKiBNRVNPTl9DUFVfVFlQRSA+PSBNRVNPTl9DUFVfVFlQRV9NRVNPTjggKi8KKwkJKHR5cGUgPT0gQlVGX1RZUEVfSEVWQykgPyBSRUFEX1ZSRUcoSEVWQ19TVFJFQU1fV1JfUFRSKSA6CisjZW5kaWYKKwkJKHR5cGUgPT0gQlVGX1RZUEVfVklERU8pID8gUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1dQKSA6CisJCSh0eXBlID09IEJVRl9UWVBFX0FVRElPKSA/CisJCVJFQURfQUlVX1JFRyhBSVVfTUVNX0FJRklGT19NQU5fV1ApIDoKKwkJUkVBRF9QQVJTRVJfUkVHKFBBUlNFUl9TVUJfU1RBUlRfUFRSKTsKKwl9IGVsc2UgeworCQl3cCA9CisjaWYgMS8qIE1FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09OOCAqLworCQkodHlwZSA9PSBCVUZfVFlQRV9IRVZDKSA/IFJFQURfUEFSU0VSX1JFRyhQQVJTRVJfVklERU9fV1ApIDoKKyNlbmRpZgorCQkodHlwZSA9PSBCVUZfVFlQRV9WSURFTykgPyBSRUFEX1BBUlNFUl9SRUcoUEFSU0VSX1ZJREVPX1dQKSA6CisJCSh0eXBlID09IEJVRl9UWVBFX0FVRElPKSA/CisJCQlSRUFEX0FJVV9SRUcoQUlVX01FTV9BSUZJRk9fTUFOX1dQKSA6CisJCQlSRUFEX1BBUlNFUl9SRUcoUEFSU0VSX1NVQl9TVEFSVF9QVFIpOworCX0KKworCXJldHVybiB3cDsKK30KKworc3RhdGljIGludCBlc3BhcnNlcl9zdGJ1Zl93cml0ZShzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpzdGJ1ZiwgY29uc3QgdTggKmJ1ZiwgdTMyIGNvdW50KQoreworCXNpemVfdCByID0gY291bnQ7CisJY29uc3QgY2hhciBfX3VzZXIgKnAgPSBidWY7CisKKwl1MzIgbGVuID0gMDsKKwl1MzIgcGFyc2VyX3R5cGU7CisJaW50IHJldDsKKwl1MzIgd3A7CisJZG1hX2FkZHJfdCBkbWFfYWRkciA9IDA7CisJdTMyIHR5cGUgPSBzdGJ1Zi0+dHlwZTsKKworCVZERUNfUFJJTlRfRlVOX0xJTkVOTyhfX2Z1bmNfXywgX19MSU5FX18pOworCWlmICh0eXBlID09IEJVRl9UWVBFX0hFVkMpCisJCXBhcnNlcl90eXBlID0gUEFSU0VSX1ZJREVPOworCWVsc2UgaWYgKHR5cGUgPT0gQlVGX1RZUEVfVklERU8pCisJCXBhcnNlcl90eXBlID0gUEFSU0VSX1ZJREVPOworCWVsc2UgaWYgKHR5cGUgPT0gQlVGX1RZUEVfQVVESU8pCisJCXBhcnNlcl90eXBlID0gUEFSU0VSX0FVRElPOworCWVsc2UKKwkJcGFyc2VyX3R5cGUgPSBQQVJTRVJfU1VCUElDOworCisJd3AgPSBidWZfd3AodHlwZSk7CisKKwlpZiAociA+IDApIHsKKwkJaWYgKHN0YnVmLT5pc19waHlidWYpCisJCQlsZW4gPSBjb3VudDsKKwkJZWxzZSB7CisJCQlsZW4gPSBtaW5fdChzaXplX3QsIHIsIChzaXplX3QpIEZFVENIQlVGX1NJWkUpOworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoZmV0Y2hidWYsIHAsIGxlbikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlkbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKAorCQkJCQlhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksIGZldGNoYnVmLAorCQkJCQlGRVRDSEJVRl9TSVpFLCBETUFfVE9fREVWSUNFKTsKKwkJCWlmIChkbWFfbWFwcGluZ19lcnJvcihhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJCQkoZG1hX2FkZHJfdCkgZG1hX2FkZHIpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCX0KKworCQkvKiB3bWIoKTsgZG9uJ3QgbmVlZCAqLworCQkvKiByZXNldCB0aGUgV3JpdGUgYW5kIHJlYWQgcG9pbnRlciB0byB6ZXJvIGFnYWluICovCisJCVdSSVRFX1BBUlNFUl9SRUcoUEZJRk9fUkRfUFRSLCAwKTsKKwkJV1JJVEVfUEFSU0VSX1JFRyhQRklGT19XUl9QVFIsIDApOworCisJCVdSSVRFX1BBUlNFUl9SRUdfQklUUyhQQVJTRVJfQ09OVFJPTCwgbGVuLCBFU19QQUNLX1NJWkVfQklULAorCQkJCQkJCUVTX1BBQ0tfU0laRV9XSUQpOworCQlXUklURV9QQVJTRVJfUkVHX0JJVFMoUEFSU0VSX0NPTlRST0wsCisJCQkJcGFyc2VyX3R5cGUgfCBQQVJTRVJfV1JJVEUgfAorCQkJCVBBUlNFUl9BVVRPU0VBUkNILCBFU19DVFJMX0JJVCwKKwkJCQlFU19DVFJMX1dJRCk7CisKKwkJaWYgKHN0YnVmLT5pc19waHlidWYpIHsKKwkJCXUzMiBidWZfMzIgPSAodW5zaWduZWQgbG9uZylidWYgJiAweGZmZmZmZmZmOworCQkJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfRkVUQ0hfQUREUiwgYnVmXzMyKTsKKwkJfSBlbHNlIHsKKwkJCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX0ZFVENIX0FERFIsIGRtYV9hZGRyKTsKKwkJCWRtYV91bm1hcF9zaW5nbGUoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLCBkbWFfYWRkciwKKwkJCQkJRkVUQ0hCVUZfU0laRSwgRE1BX1RPX0RFVklDRSk7CisJCX0KKworCQlzZWFyY2hfZG9uZSA9IDA7CisJCWlmICghKHN0YnVmLT5kcm1fZmxhZyAmIFRZUEVfUEFUVEVSTikpIHsKKwkJCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX0ZFVENIX0NNRCwKKwkJCQkoNyA8PCBGRVRDSF9FTkRJQU4pIHwgbGVuKTsKKwkJCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX0ZFVENIX0FERFIsIHNlYXJjaF9wYXR0ZXJuX21hcCk7CisJCQlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9GRVRDSF9DTUQsCisJCQkJKDcgPDwgRkVUQ0hfRU5ESUFOKSB8IFNFQVJDSF9QQVRURVJOX0xFTik7CisJCX0gZWxzZSB7CisJCQlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9GRVRDSF9DTUQsCisJCQkJKDcgPDwgRkVUQ0hfRU5ESUFOKSB8IChsZW4gKyA1MTIpKTsKKwkJfQorCisJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHdxLCBzZWFyY2hfZG9uZSAhPSAwLAorCQkJSFogLyA1KTsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9GRVRDSF9DTUQsIDApOworCisJCQlpZiAod3AgPT0gYnVmX3dwKHR5cGUpKSB7CisJCQkJLypubyBkYXRhIGZldGNoZWQgKi8KKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCX0gZWxzZSB7CisJCQkJcHJfaW5mbygiVyBUaW1lb3V0LCBidXQgZmV0Y2ggb2ssIik7CisJCQkJcHJfaW5mbygidHlwZSAlZCBsZW49JWQsd3BkaWZmPSVkLCBpc3BoeSAleFxuIiwKKwkJCQkgdHlwZSwgbGVuLCB3cCAtIGJ1Zl93cCh0eXBlKSwgc3RidWYtPmlzX3BoeWJ1Zik7CisJCQl9CisJCX0gZWxzZSBpZiAocmV0IDwgMCkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCisJaWYgKCh0eXBlID09IEJVRl9UWVBFX1ZJREVPKQorCQl8fCAoaGFzX2hldmNfdmRlYygpICYmICh0eXBlID09IEJVRl9UWVBFX0hFVkMpKSkKKwkJdmlkZW9fZGF0YV9wYXJzZWQgKz0gbGVuOworCWVsc2UgaWYgKHR5cGUgPT0gQlVGX1RZUEVfQVVESU8pCisJCWF1ZGlvX2RhdGFfcGFyc2VkICs9IGxlbjsKKworCXRocmVhZHJ3X3VwZGF0ZV9idWZmZXJfbGV2ZWwoc3RidWYsIGxlbik7CisJVkRFQ19QUklOVF9GVU5fTElORU5PKF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBfZXNwYXJzZXJfd3JpdGUoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50LCBzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpzdGJ1ZiwgaW50IGlzcGh5YnVmKQoreworCXJldHVybiBlc3BhcnNlcl9zdGJ1Zl93cml0ZShzdGJ1ZiwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IF9lc3BhcnNlcl93cml0ZV9zKGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQlzaXplX3QgY291bnQsIHN0cnVjdCBzdHJlYW1fYnVmX3MgKnN0YnVmKQoreworCXNpemVfdCByID0gY291bnQ7CisJY29uc3QgY2hhciBfX3VzZXIgKnAgPSBidWY7CisJdTMyIGxlbiA9IDA7CisJaW50IHJldDsKKwl1MzIgd3AsIGJ1Zl9zdGFydCwgYnVmX2VuZDsKKwl1MzIgdHlwZSA9IHN0YnVmLT50eXBlOworCXZvaWQgKnZhZGRyID0gTlVMTDsKKworCWlmICh0eXBlICE9IEJVRl9UWVBFX0FVRElPKQorCQlCVUcoKTsKKwl3cCA9IGdldF9idWZfd3AodHlwZSk7CisJYnVmX2VuZCA9IGdldF9idWZfZW5kKHR5cGUpICsgODsKKwlidWZfc3RhcnQgPSBnZXRfYnVmX3N0YXJ0KHR5cGUpOworCS8qcHJfaW5mbygid3JpdGUgd3AgMHgleCwgY291bnQgJWQsIHN0YXJ0IDB4JXgsIGVuZCAweCV4XG4iLAorCSoJCSB3cCwgKHUzMiljb3VudCwgYnVmX3N0YXJ0LCBidWZfZW5kKTsqLworCWlmICh3cCArIGNvdW50ID4gYnVmX2VuZCkgeworCQlpZiAod3AgPT0gYnVmX2VuZCkgeworCQkJd3AgPSBidWZfc3RhcnQ7CisJCQlzZXRfYnVmX3dwKHR5cGUsIHdwKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisJCXZhZGRyID0gY29kZWNfbW1fcGh5c190b192aXJ0KHdwKTsKKwkJcmV0ID0gY29weV9mcm9tX3VzZXIodmFkZHIsIHAsIGJ1Zl9lbmQgLSB3cCk7CisJCWlmIChyZXQgPiAwKSB7CisJCQlsZW4gKz0gIGJ1Zl9lbmQgLSB3cCAtIHJldDsKKwkJCWNvZGVjX21tX2RtYV9mbHVzaCh2YWRkciwgbGVuLCBETUFfVE9fREVWSUNFKTsKKwkJCXdwICs9IGxlbjsKKwkJCXByX2luZm8oImNvcHkgZnJvbSB1c2VyIG5vdCBmaW5pc2hlZFxuIik7CisJCQlzZXRfYnVmX3dwKHR5cGUsIHdwKTsKKwkJCWdvdG8gZW5kX3dyaXRlOworCQl9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisJCQlsZW4gKz0gYnVmX2VuZCAtIHdwOworCQkJY29kZWNfbW1fZG1hX2ZsdXNoKHZhZGRyLCBsZW4sIERNQV9UT19ERVZJQ0UpOworCQkJd3AgPSBidWZfc3RhcnQ7CisJCQlyID0gY291bnQgLSBsZW47CisJCQlzZXRfYnVmX3dwKHR5cGUsIHdwKTsKKwkJfSBlbHNlIHsKKwkJCXByX2luZm8oImNvcHkgZnJvbSB1c2VyIGZhaWxlZCAxXG4iKTsKKwkJCXByX2luZm8oIncgd3AgMHgleCwgY291bnQgJWQsIHN0YXJ0IDB4JXggZW5kIDB4JXhcbiIsCisJCQkJIHdwLCAodTMyKWNvdW50LCBidWZfc3RhcnQsIGJ1Zl9lbmQpOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwl9CisKKwl2YWRkciA9IGNvZGVjX21tX3BoeXNfdG9fdmlydCh3cCk7CisJcmV0ID0gY29weV9mcm9tX3VzZXIodmFkZHIsIHAgKyBsZW4sIHIpOworCWlmIChyZXQgPj0gMCkgeworCQlsZW4gKz0gciAtIHJldDsKKwkJY29kZWNfbW1fZG1hX2ZsdXNoKHZhZGRyLCByIC0gcmV0LCBETUFfVE9fREVWSUNFKTsKKwkJaWYgKHJldCA+IDApCisJCQlwcl9pbmZvKCJjb3B5IGZyb20gdXNlciBub3QgZmluaXNoZWQgMlxuIik7CisJCXdwICs9IHIgLSByZXQ7CisJCXNldF9idWZfd3AodHlwZSwgd3ApOworCX0gZWxzZSB7CisJCXByX2luZm8oImNvcHkgZnJvbSB1c2VyIGZhaWxlZCAyXG4iKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCitlbmRfd3JpdGU6CisJaWYgKHR5cGUgPT0gQlVGX1RZUEVfQVVESU8pCisJeworCQlhdWRpb19kYXRhX3BhcnNlZCArPSBsZW47CisJCXRocmVhZHJ3X3VwZGF0ZV9idWZmZXJfbGV2ZWwoc3RidWYsIGxlbik7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworczMyIGVzX3ZwdHNfY2hlY2tpbl91czY0KHN0cnVjdCBzdHJlYW1fYnVmX3MgKmJ1ZiwgdTY0IHVzNjQpCit7CisJdTMyIHBhc3NlZDsKKworCWlmIChidWYtPndyaXRlX3RocmVhZCkKKwkJcGFzc2VkID0gdGhyZWFkcndfZGF0YW9mZnNldChidWYpOworCWVsc2UKKwkJcGFzc2VkID0gdmlkZW9fZGF0YV9wYXJzZWQ7CisJcmV0dXJuIHB0c19jaGVja2luX29mZnNldF91czY0KFBUU19UWVBFX1ZJREVPLCBwYXNzZWQsIHVzNjQpOworCit9CisKK3MzMiBlc19hcHRzX2NoZWNraW5fdXM2NChzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpidWYsIHU2NCB1czY0KQoreworCXUzMiBwYXNzZWQ7CisKKwlpZiAoYnVmLT53cml0ZV90aHJlYWQpCisJCXBhc3NlZCA9IHRocmVhZHJ3X2RhdGFvZmZzZXQoYnVmKTsKKwllbHNlCisJCXBhc3NlZCA9IGF1ZGlvX2RhdGFfcGFyc2VkOworCXJldHVybiBwdHNfY2hlY2tpbl9vZmZzZXRfdXM2NChQVFNfVFlQRV9BVURJTywgcGFzc2VkLCB1czY0KTsKK30KKworczMyIGVzX3ZwdHNfY2hlY2tpbihzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpidWYsIHUzMiBwdHMpCit7CisjaWYgMAorCWlmIChidWYtPmZpcnN0X3RzdGFtcCA9PSBJTlZBTElEX1BUUykgeworCQlidWYtPmZsYWcgfD0gQlVGX0ZMQUdfRklSU1RfVFNUQU1QOworCQlidWYtPmZpcnN0X3RzdGFtcCA9IHB0czsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisJdTMyIHBhc3NlZCA9IDA7CisKKwltdXRleF9sb2NrKCZlc3BhcnNlcl9tdXRleCk7CisJcGFzc2VkID0gdmlkZW9fZGF0YV9wYXJzZWQgKyB0aHJlYWRyd19idWZmZXJfbGV2ZWwoYnVmKTsKKwltdXRleF91bmxvY2soJmVzcGFyc2VyX211dGV4KTsKKworCXJldHVybiBwdHNfY2hlY2tpbl9vZmZzZXQoUFRTX1RZUEVfVklERU8sIHBhc3NlZCwgcHRzKTsKKworfQorCitzMzIgZXNfYXB0c19jaGVja2luKHN0cnVjdCBzdHJlYW1fYnVmX3MgKmJ1ZiwgdTMyIHB0cykKK3sKKyNpZiAwCisJaWYgKGJ1Zi0+Zmlyc3RfdHN0YW1wID09IElOVkFMSURfUFRTKSB7CisJCWJ1Zi0+ZmxhZyB8PSBCVUZfRkxBR19GSVJTVF9UU1RBTVA7CisJCWJ1Zi0+Zmlyc3RfdHN0YW1wID0gcHRzOworCisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCXUzMiBwYXNzZWQgPSAwOworCW11dGV4X2xvY2soJmVzcGFyc2VyX211dGV4KTsKKwlwYXNzZWQgPSBhdWRpb19kYXRhX3BhcnNlZCArIHRocmVhZHJ3X2J1ZmZlcl9sZXZlbChidWYpOworCW11dGV4X3VubG9jaygmZXNwYXJzZXJfbXV0ZXgpOworCisJcmV0dXJuIHB0c19jaGVja2luX29mZnNldChQVFNfVFlQRV9BVURJTywgcGFzc2VkLCBwdHMpOworfQorCitzMzIgZXNwYXJzZXJfaW5pdChzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpidWYsIHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJczMyIHIgPSAwOworCXUzMiBwdHNfdHlwZTsKKwl1MzIgcGFyc2VyX3N1Yl9zdGFydF9wdHI7CisJdTMyIHBhcnNlcl9zdWJfZW5kX3B0cjsKKwl1MzIgcGFyc2VyX3N1Yl9ycDsKKwlib29sIGZpcnN0X3VzZSA9IGZhbHNlOworCS8qICNpZiBNRVNPTl9DUFVfVFlQRSA+PSBNRVNPTl9DUFVfVFlQRV9NRVNPTjggKi8KKwlWREVDX1BSSU5UX0ZVTl9MSU5FTk8oX19mdW5jX18sIF9fTElORV9fKTsKKworCWlmIChoYXNfaGV2Y192ZGVjKCkgJiYgKGJ1Zi0+dHlwZSA9PSBCVUZfVFlQRV9IRVZDKSkKKwkJcHRzX3R5cGUgPSBQVFNfVFlQRV9IRVZDOworCWVsc2UKKwkJLyogI2VuZGlmICovCisJCWlmIChidWYtPnR5cGUgPT0gQlVGX1RZUEVfVklERU8pCisJCQlwdHNfdHlwZSA9IFBUU19UWVBFX1ZJREVPOworCQllbHNlIGlmIChidWYtPnR5cGUgPT0gQlVGX1RZUEVfQVVESU8pCisJCQlwdHNfdHlwZSA9IFBUU19UWVBFX0FVRElPOworCQllbHNlIGlmIChidWYtPnR5cGUgPT0gQlVGX1RZUEVfU1VCVElUTEUpCisJCQlwdHNfdHlwZSA9IFBUU19UWVBFX01BWDsKKwkJZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJbXV0ZXhfbG9jaygmZXNwYXJzZXJfbXV0ZXgpOworCXBhcnNlcl9zdWJfc3RhcnRfcHRyID0gUkVBRF9QQVJTRVJfUkVHKFBBUlNFUl9TVUJfU1RBUlRfUFRSKTsKKwlwYXJzZXJfc3ViX2VuZF9wdHIgPSBSRUFEX1BBUlNFUl9SRUcoUEFSU0VSX1NVQl9FTkRfUFRSKTsKKwlwYXJzZXJfc3ViX3JwID0gUkVBRF9QQVJTRVJfUkVHKFBBUlNFUl9TVUJfUlApOworCisJYnVmLT5mbGFnIHw9IEJVRl9GTEFHX1BBUlNFUjsKKworCWlmIChhdG9taWNfYWRkX3JldHVybigxLCAmZXNwYXJzZXJfdXNlX2NvdW50KSA9PSAxKSB7CisJCWZpcnN0X3VzZSA9IHRydWU7CisKKwkJaWYgKGZldGNoYnVmID09IDApIHsKKwkJCXByX2luZm8oIiVzOiBubyBmZXRjaGJ1ZlxuIiwgX19mdW5jX18pOworCQkJciA9IC1FTk9NRU07CisJCQlnb3RvIEVycl8xOworCQl9CisKKwkJaWYgKHNlYXJjaF9wYXR0ZXJuID09IE5VTEwpIHsKKwkJCXNlYXJjaF9wYXR0ZXJuID0ga2NhbGxvYygxLAorCQkJCVNFQVJDSF9QQVRURVJOX0xFTiwKKwkJCQlHRlBfS0VSTkVMKTsKKworCQkJaWYgKHNlYXJjaF9wYXR0ZXJuID09IE5VTEwpIHsKKwkJCQlwcl9lcnIoIiVzOiBubyBzZWFyY2hfcGF0dGVyblxuIiwgX19mdW5jX18pOworCQkJCXIgPSAtRU5PTUVNOworCQkJCWdvdG8gRXJyXzE7CisJCQl9CisKKwkJCS8qIGJ1aWxkIGEgZmFrZSBzdGFydCBjb2RlIHRvIGdldCBwYXJzZXIgaW50ZXJydXB0ICovCisJCQlzZWFyY2hfcGF0dGVyblswXSA9IDB4MDA7CisJCQlzZWFyY2hfcGF0dGVyblsxXSA9IDB4MDA7CisJCQlzZWFyY2hfcGF0dGVyblsyXSA9IDB4MDE7CisJCQlzZWFyY2hfcGF0dGVyblszXSA9IDB4ZmY7CisKKwkJCXNlYXJjaF9wYXR0ZXJuX21hcCA9IGRtYV9tYXBfc2luZ2xlKAorCQkJCQlhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJCXNlYXJjaF9wYXR0ZXJuLAorCQkJCQlTRUFSQ0hfUEFUVEVSTl9MRU4sCisJCQkJCURNQV9UT19ERVZJQ0UpOworCQl9CisKKwkJLyogcmVzZXQgUEFSU0VSIHdpdGggZmlyc3QgZXNwYXJzZXJfaW5pdCgpIGNhbGwgKi8KKwkJV1JJVEVfUkVTRVRfUkVHKFJFU0VUMV9SRUdJU1RFUiwgUkVTRVRfUEFSU0VSKTsKKy8qIGZvciByZWNvcmRlZCBmaWxlIGFuZCBsb2NhbCBwbGF5LCB0aGlzIGNhbid0IGNoYW5nZSB0aGUgaW5wdXQgc291cmNlKi8KKy8qIFRTIGRhdGEgcGF0aCAqLworLyoKKyNpZm5kZWYgQ09ORklHX0FNX0RWQgorCQlXUklURV9ERU1VWF9SRUcoRkVDX0lOUFVUX0NPTlRST0wsIDApOworI2Vsc2UKKwkJdHNkZW11eF9zZXRfcmVzZXRfZmxhZygpOworI2VuZGlmICAqLworCisJCUNMRUFSX0RFTVVYX1JFR19NQVNLKFRTX0hJVV9DVEwsIDEgPDwgVVNFX0hJX0JTRl9JTlRFUkZBQ0UpOworCQlDTEVBUl9ERU1VWF9SRUdfTUFTSyhUU19ISVVfQ1RMXzIsIDEgPDwgVVNFX0hJX0JTRl9JTlRFUkZBQ0UpOworCQlDTEVBUl9ERU1VWF9SRUdfTUFTSyhUU19ISVVfQ1RMXzMsIDEgPDwgVVNFX0hJX0JTRl9JTlRFUkZBQ0UpOworCisJCUNMRUFSX0RFTVVYX1JFR19NQVNLKFRTX0ZJTEVfQ09ORklHLCAoMSA8PCBUU19ISVVfRU5BQkxFKSk7CisKKwkJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfQ09ORklHLAorCQkJCQkgICAoMTAgPDwgUFNfQ0ZHX1BGSUZPX0VNUFRZX0NOVF9CSVQpIHwKKwkJCQkJICAgKDEgPDwgUFNfQ0ZHX01BWF9FU19XUl9DWUNMRV9CSVQpIHwKKwkJCQkJICAgKDE2IDw8IFBTX0NGR19NQVhfRkVUQ0hfQ1lDTEVfQklUKSk7CisKKwkJV1JJVEVfUEFSU0VSX1JFRyhQRklGT19SRF9QVFIsIDApOworCQlXUklURV9QQVJTRVJfUkVHKFBGSUZPX1dSX1BUUiwgMCk7CisKKwkJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfU0VBUkNIX1BBVFRFUk4sIEVTX1NUQVJUX0NPREVfUEFUVEVSTik7CisJCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX1NFQVJDSF9NQVNLLCBFU19TVEFSVF9DT0RFX01BU0spOworCisJCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX0NPTkZJRywKKwkJCQkJICAgKDEwIDw8IFBTX0NGR19QRklGT19FTVBUWV9DTlRfQklUKSB8CisJCQkJCSAgICgxIDw8IFBTX0NGR19NQVhfRVNfV1JfQ1lDTEVfQklUKSB8CisJCQkJCSAgIFBTX0NGR19TVEFSVENPREVfV0lEXzI0IHwKKwkJCQkJICAgUFNfQ0ZHX1BGSUZPX0FDQ0VTU19XSURfOCB8CisJCQkJCSAgIC8qIHNpbmdsZSBieXRlIHBvcCAqLworCQkJCQkgICAoMTYgPDwgUFNfQ0ZHX01BWF9GRVRDSF9DWUNMRV9CSVQpKTsKKworCQlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9DT05UUk9MLCBQQVJTRVJfQVVUT1NFQVJDSCk7CisKKwl9CisKKwkvKiBob29rIHN0cmVhbSBidWZmZXIgd2l0aCBQQVJTRVIgKi8KKwlpZiAoaGFzX2hldmNfdmRlYygpICYmIChwdHNfdHlwZSA9PSBQVFNfVFlQRV9IRVZDKSkgeworCQlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9WSURFT19TVEFSVF9QVFIsIHZkZWMtPmlucHV0LnN0YXJ0KTsKKwkJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfVklERU9fRU5EX1BUUiwgdmRlYy0+aW5wdXQuc3RhcnQKKwkJCSsgdmRlYy0+aW5wdXQuc2l6ZSAtIDgpOworCisJCWlmICh2ZGVjX3NpbmdsZSh2ZGVjKSkgeworCQkJQ0xFQVJfUEFSU0VSX1JFR19NQVNLKFBBUlNFUl9FU19DT05UUk9MLAorCQkJCUVTX1ZJRF9NQU5fUkRfUFRSKTsKKworCQkJLyogc2V0IHZpZmlmb192YnVmX3JwX3NlbD0+aGV2YyAqLworCQkJV1JJVEVfVlJFRyhET1NfR0VOX0NUUkwwLCAzIDw8IDEpOworCisJCQkvKiBzZXQgdXNlX3BhcnNlcl92YnVmX3dwICovCisJCQlTRVRfVlJFR19NQVNLKEhFVkNfU1RSRUFNX0NPTlRST0wsCisJCQkJCSgxIDw8IDMpIHwgKDAgPDwgNCkpOworCQkJLyogc2V0IHN0cmVhbV9mZXRjaF9lbmFibGUgKi8KKwkJCVNFVF9WUkVHX01BU0soSEVWQ19TVFJFQU1fQ09OVFJPTCwgMSk7CisKKwkJCWlmIChidWYtPm5vX3BhcnNlcikgeworCQkJCS8qc2V0IGVuZGlhbiBmb3Igbm9uLXBhcnNlciBtb2RlICovCisJCQkJU0VUX1ZSRUdfTUFTSyhIRVZDX1NUUkVBTV9DT05UUk9MLCA3IDw8IDQpOworCQkJfQorCisJCQkvKiBzZXQgc3RyZWFtX2J1ZmZlcl9ob2xlIHdpdGggMjU2IGJ5dGVzICovCisJCQlTRVRfVlJFR19NQVNLKEhFVkNfU1RSRUFNX0ZJRk9fQ1RMLCAoMSA8PCAyOSkpOworCQl9IGVsc2UgeworCQkJU0VUX1BBUlNFUl9SRUdfTUFTSyhQQVJTRVJfRVNfQ09OVFJPTCwKKwkJCQkJRVNfVklEX01BTl9SRF9QVFIpOworCQkJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfVklERU9fV1AsIHZkZWMtPmlucHV0LnN0YXJ0KTsKKwkJCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX1ZJREVPX1JQLCB2ZGVjLT5pbnB1dC5zdGFydCk7CisJCX0KKwkJdmlkZW9fZGF0YV9wYXJzZWQgPSAwOworCX0gZWxzZSBpZiAocHRzX3R5cGUgPT0gUFRTX1RZUEVfVklERU8pIHsKKwkJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfVklERU9fU1RBUlRfUFRSLAorCQkJdmRlYy0+aW5wdXQuc3RhcnQpOworCQlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9WSURFT19FTkRfUFRSLAorCQkJdmRlYy0+aW5wdXQuc3RhcnQgKyB2ZGVjLT5pbnB1dC5zaXplIC0gOCk7CisKKwkJaWYgKHZkZWNfc2luZ2xlKHZkZWMpIHx8ICh2ZGVjX2dldF9kZWJ1Z19mbGFncygpICYgMHgyKSkgeworCQkJaWYgKHZkZWNfZ2V0X2RlYnVnX2ZsYWdzKCkgJiAweDIpCisJCQkJcHJfaW5mbygiJXMgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCQlDTEVBUl9QQVJTRVJfUkVHX01BU0soUEFSU0VSX0VTX0NPTlRST0wsCisJCQkJRVNfVklEX01BTl9SRF9QVFIpOworCisJCQlXUklURV9WUkVHKFZMRF9NRU1fVklGSUZPX0JVRl9DTlRMLCBNRU1fQlVGQ1RSTF9JTklUKTsKKwkJCUNMRUFSX1ZSRUdfTUFTSyhWTERfTUVNX1ZJRklGT19CVUZfQ05UTCwKKwkJCQlNRU1fQlVGQ1RSTF9JTklUKTsKKworCQkJaWYgKGhhc19oZXZjX3ZkZWMoKSkgeworCQkJCS8qIHNldCB2aWZpZm9fdmJ1Zl9ycF9zZWw9PnZkZWMgKi8KKwkJCQlXUklURV9WUkVHKERPU19HRU5fQ1RSTDAsIDApOworCQkJfQorCQl9IGVsc2UgeworCQkJU0VUX1BBUlNFUl9SRUdfTUFTSyhQQVJTRVJfRVNfQ09OVFJPTCwKKwkJCQkJRVNfVklEX01BTl9SRF9QVFIpOworCQkJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfVklERU9fV1AsCisJCQkJCXZkZWMtPmlucHV0LnN0YXJ0KTsKKwkJCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX1ZJREVPX1JQLAorCQkJCQl2ZGVjLT5pbnB1dC5zdGFydCk7CisJCX0KKwkJdmlkZW9fZGF0YV9wYXJzZWQgPSAwOworCX0gZWxzZSBpZiAocHRzX3R5cGUgPT0gUFRTX1RZUEVfQVVESU8pIHsKKwkJLyogc2V0IHdwIGFzIGJ1ZmZlciBzdGFydCAqLworCQlTRVRfQUlVX1JFR19NQVNLKEFJVV9NRU1fQUlGSUZPX0JVRl9DTlRMLAorCQkJTUVNX0JVRkNUUkxfTUFOVUFMKTsKKwkJV1JJVEVfQUlVX1JFRyhBSVVfTUVNX0FJRklGT19NQU5fUlAsCisJCQlSRUFEX0FJVV9SRUcoQUlVX01FTV9BSUZJRk9fU1RBUlRfUFRSKSk7CisJCVdSSVRFX0FJVV9SRUdfQklUUyhBSVVfTUVNX0FJRklGT19DT05UUk9MLCA3LCAzLCAzKTsKKwkJU0VUX0FJVV9SRUdfTUFTSyhBSVVfTUVNX0FJRklGT19CVUZfQ05UTCwKKwkJCU1FTV9CVUZDVFJMX0lOSVQpOworCQlDTEVBUl9BSVVfUkVHX01BU0soQUlVX01FTV9BSUZJRk9fQlVGX0NOVEwsCisJCQlNRU1fQlVGQ1RSTF9JTklUKTsKKwkJV1JJVEVfQUlVX1JFRyhBSVVfTUVNX0FJRklGT19NQU5fV1AsCisJCQlSRUFEX0FJVV9SRUcoQUlVX01FTV9BSUZJRk9fU1RBUlRfUFRSKSk7CisJCWF1ZGlvX2RhdGFfcGFyc2VkID0gMDsKKwkJYXVkaW9fYnVmX3N0YXJ0ID0KKwkJCVJFQURfQUlVX1JFRyhBSVVfTUVNX0FJRklGT19TVEFSVF9QVFIpOworCQlhdWRpb19yZWFsX3dwID0gYXVkaW9fYnVmX3N0YXJ0OworCQlhdWRpb19idWZfZW5kID0gUkVBRF9BSVVfUkVHKEFJVV9NRU1fQUlGSUZPX0VORF9QVFIpOworCX0gZWxzZSBpZiAoYnVmLT50eXBlID09IEJVRl9UWVBFX1NVQlRJVExFKSB7CisJCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX1NVQl9TVEFSVF9QVFIsCisJCQlwYXJzZXJfc3ViX3N0YXJ0X3B0cik7CisJCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX1NVQl9FTkRfUFRSLAorCQkJcGFyc2VyX3N1Yl9lbmRfcHRyKTsKKwkJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfU1VCX1JQLCBwYXJzZXJfc3ViX3JwKTsKKwkJU0VUX1BBUlNFUl9SRUdfTUFTSyhQQVJTRVJfRVNfQ09OVFJPTCwKKwkJCSg3IDw8IEVTX1NVQl9XUl9FTkRJQU5fQklUKSB8CisJCQlFU19TVUJfTUFOX1JEX1BUUik7CisJfQorCisJaWYgKHB0c190eXBlIDwgUFRTX1RZUEVfTUFYKSB7CisJCXIgPSBwdHNfc3RhcnQocHRzX3R5cGUpOworCisJCWlmIChyIDwgMCkgeworCQkJcHJfaW5mbygiZXNwYXJzZXJfaW5pdDogcHRzX3N0YXJ0IGZhaWxlZFxuIik7CisJCQlnb3RvIEVycl8xOworCQl9CisJfQorI2lmIDAKKwlpZiAoYnVmLT5mbGFnICYgQlVGX0ZMQUdfRklSU1RfVFNUQU1QKSB7CisJCWlmIChidWYtPnR5cGUgPT0gQlVGX1RZUEVfVklERU8pCisJCQllc192cHRzX2NoZWNraW4oYnVmLCBidWYtPmZpcnN0X3RzdGFtcCk7CisJCWVsc2UgaWYgKGJ1Zi0+dHlwZSA9PSBCVUZfVFlQRV9BVURJTykKKwkJCWVzX2FwdHNfY2hlY2tpbihidWYsIGJ1Zi0+Zmlyc3RfdHN0YW1wKTsKKworCQlidWYtPmZsYWcgJj0gfkJVRl9GTEFHX0ZJUlNUX1RTVEFNUDsKKwl9CisjZW5kaWYKKworCWlmIChmaXJzdF91c2UpIHsKKwkJLypUT0RPIGlycSAqLworCQlyID0gdmRlY19yZXF1ZXN0X2lycShQQVJTRVJfSVJRLCBlc3BhcnNlcl9pc3IsCisJCQkicGFyc2VyIiwgKHZvaWQgKillc3BhcnNlcl9pZCk7CisKKwkJaWYgKHIpIHsKKwkJCXByX2luZm8oImVzcGFyc2VyX2luaXQ6IGlycSByZWdpc3RlciBmYWlsZWQuXG4iKTsKKwkJCWdvdG8gRXJyXzI7CisJCX0KKwkJVkRFQ19QUklOVF9GVU5fTElORU5PKF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwkJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfSU5UX1NUQVRVUywgMHhmZmZmKTsKKwkJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfSU5UX0VOQUJMRSwKKwkJCQkJICAgUEFSU0VSX0lOVFNUQVRfU0NfRk9VTkQgPDwKKwkJCQkJICAgUEFSU0VSX0lOVF9IT1NUX0VOX0JJVCk7CisJfQorCW11dGV4X3VubG9jaygmZXNwYXJzZXJfbXV0ZXgpOworCisJaWYgKCEodmRlY19nZXRfZGVidWdfZmxhZ3MoKSAmIDEpICYmCisJCSFjb2RlY19tbV92aWRlb190dnBfZW5hYmxlZCgpKSB7CisJCWludCBibG9ja19zaXplID0gKGJ1Zi0+dHlwZSA9PSBCVUZfVFlQRV9BVURJTykgPworCQkJUEFHRV9TSVpFIDogUEFHRV9TSVpFIDw8IDQ7CisJCWludCBidWZfbnVtID0gKGJ1Zi0+dHlwZSA9PSBCVUZfVFlQRV9BVURJTykgPworCQkJMjAgOiAoMiAqIFNaXzFNKS8oUEFHRV9TSVpFIDw8IDQpOworCQlpZiAoIShidWYtPnR5cGUgPT0gQlVGX1RZUEVfU1VCVElUTEUpKQorCQkJYnVmLT53cml0ZV90aHJlYWQgPSB0aHJlYWRyd19hbGxvYyhidWZfbnVtLAorCQkJCWJsb2NrX3NpemUsCisJCQkJZXNwYXJzZXJfd3JpdGVfZXgsCisJCQkoYnVmLT50eXBlID09IEJVRl9UWVBFX0FVRElPKSA/IDEgOiAwKTsKKwkJCS8qbWFudWwgbW9kZSBmb3IgYXVkaW8qLworCX0KKworCXJldHVybiAwOworCitFcnJfMjoKKwlwdHNfc3RvcChwdHNfdHlwZSk7CisKK0Vycl8xOgorCWF0b21pY19kZWMoJmVzcGFyc2VyX3VzZV9jb3VudCk7CisJYnVmLT5mbGFnICY9IH5CVUZfRkxBR19QQVJTRVI7CisJbXV0ZXhfdW5sb2NrKCZlc3BhcnNlcl9tdXRleCk7CisJcmV0dXJuIHI7Cit9CitFWFBPUlRfU1lNQk9MKGVzcGFyc2VyX2luaXQpOworCit2b2lkIGVzcGFyc2VyX2F1ZGlvX3Jlc2V0X3Moc3RydWN0IHN0cmVhbV9idWZfcyAqYnVmKQoreworCXVsb25nIGZsYWdzOworCURFRklORV9TUElOTE9DSyhsb2NrKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CisKKwlTRVRfQUlVX1JFR19NQVNLKEFJVV9NRU1fQUlGSUZPX0JVRl9DTlRMLCBNRU1fQlVGQ1RSTF9NQU5VQUwpOworCVdSSVRFX0FJVV9SRUcoQUlVX01FTV9BSUZJRk9fTUFOX1JQLAorCQkJUkVBRF9BSVVfUkVHKEFJVV9NRU1fQUlGSUZPX1NUQVJUX1BUUikpOworCVdSSVRFX0FJVV9SRUdfQklUUyhBSVVfTUVNX0FJRklGT19DT05UUk9MLCA3LCAzLCAzKTsKKwlTRVRfQUlVX1JFR19NQVNLKEFJVV9NRU1fQUlGSUZPX0JVRl9DTlRMLCBNRU1fQlVGQ1RSTF9JTklUKTsKKwlDTEVBUl9BSVVfUkVHX01BU0soQUlVX01FTV9BSUZJRk9fQlVGX0NOVEwsIE1FTV9CVUZDVFJMX0lOSVQpOworCVdSSVRFX0FJVV9SRUcoQUlVX01FTV9BSUZJRk9fTUFOX1dQLAorCQkJUkVBRF9BSVVfUkVHKEFJVV9NRU1fQUlGSUZPX1NUQVJUX1BUUikpOworCisJYnVmLT5mbGFnIHw9IEJVRl9GTEFHX1BBUlNFUjsKKworCWF1ZGlvX2RhdGFfcGFyc2VkID0gMDsKKwlhdWRpb19yZWFsX3dwID0gUkVBRF9BSVVfUkVHKEFJVV9NRU1fQUlGSUZPX1NUQVJUX1BUUik7CisJYXVkaW9fYnVmX3N0YXJ0ID0gUkVBRF9BSVVfUkVHKEFJVV9NRU1fQUlGSUZPX1NUQVJUX1BUUik7CisJYXVkaW9fYnVmX2VuZCA9IFJFQURfQUlVX1JFRyhBSVVfTUVNX0FJRklGT19FTkRfUFRSKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CisKKwlyZXR1cm47Cit9CisKK3ZvaWQgZXNwYXJzZXJfYXVkaW9fcmVzZXQoc3RydWN0IHN0cmVhbV9idWZfcyAqYnVmKQoreworCXVsb25nIGZsYWdzOworCURFRklORV9TUElOTE9DSyhsb2NrKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CisKKwlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9BVURJT19XUCwKKwkJCQkgICBSRUFEX0FJVV9SRUcoQUlVX01FTV9BSUZJRk9fU1RBUlRfUFRSKSk7CisJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfQVVESU9fUlAsCisJCQkJICAgUkVBRF9BSVVfUkVHKEFJVV9NRU1fQUlGSUZPX1NUQVJUX1BUUikpOworCisJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfQVVESU9fU1RBUlRfUFRSLAorCQkJCSAgIFJFQURfQUlVX1JFRyhBSVVfTUVNX0FJRklGT19TVEFSVF9QVFIpKTsKKwlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9BVURJT19FTkRfUFRSLAorCQkJCSAgIFJFQURfQUlVX1JFRyhBSVVfTUVNX0FJRklGT19FTkRfUFRSKSk7CisJQ0xFQVJfUEFSU0VSX1JFR19NQVNLKFBBUlNFUl9FU19DT05UUk9MLCBFU19BVURfTUFOX1JEX1BUUik7CisKKwlXUklURV9BSVVfUkVHKEFJVV9NRU1fQUlGSUZPX0JVRl9DTlRMLCBNRU1fQlVGQ1RSTF9JTklUKTsKKwlDTEVBUl9BSVVfUkVHX01BU0soQUlVX01FTV9BSUZJRk9fQlVGX0NOVEwsIE1FTV9CVUZDVFJMX0lOSVQpOworCisJYnVmLT5mbGFnIHw9IEJVRl9GTEFHX1BBUlNFUjsKKworCWF1ZGlvX2RhdGFfcGFyc2VkID0gMDsKKwlhdWRpb19yZWFsX3dwID0gMDsKKwlhdWRpb19idWZfc3RhcnQgPSAwOworCWF1ZGlvX2J1Zl9lbmQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKKworfQorCit2b2lkIGVzcGFyc2VyX3JlbGVhc2Uoc3RydWN0IHN0cmVhbV9idWZfcyAqYnVmKQoreworCXUzMiBwdHNfdHlwZTsKKworCS8qIGNoZWNrIGlmIGVzcGFyc2VyX2luaXQoKSBpcyBldmVyIGNhbGxlZCAqLworCWlmICgoYnVmLT5mbGFnICYgQlVGX0ZMQUdfUEFSU0VSKSA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAoYXRvbWljX3JlYWQoJmVzcGFyc2VyX3VzZV9jb3VudCkgPT0gMCkgeworCQlwcl9pbmZvCisJCSgiWyVzOiVkXSMjI3dhcm5pbmcsIGVzcGFyc2VyIGhhcyBiZWVuIHJlbGVhc2VkIGFscmVhZHlcbiIsCisJCSBfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm47CisJfQorCWlmIChidWYtPndyaXRlX3RocmVhZCkKKwkJdGhyZWFkcndfcmVsZWFzZShidWYpOworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZlc3BhcnNlcl91c2VfY291bnQpKSB7CisJCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX0lOVF9FTkFCTEUsIDApOworCQkvKlRPRE8gaXJxICovCisKKwkJdmRlY19mcmVlX2lycShQQVJTRVJfSVJRLCAodm9pZCAqKWVzcGFyc2VyX2lkKTsKKworCQlpZiAoc2VhcmNoX3BhdHRlcm4pIHsKKwkJCWRtYV91bm1hcF9zaW5nbGUoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCXNlYXJjaF9wYXR0ZXJuX21hcCwKKwkJCQlTRUFSQ0hfUEFUVEVSTl9MRU4sIERNQV9UT19ERVZJQ0UpOworCQkJa2ZyZWUoc2VhcmNoX3BhdHRlcm4pOworCQkJc2VhcmNoX3BhdHRlcm4gPSBOVUxMOworCQl9CisJfQorCisJaWYgKGhhc19oZXZjX3ZkZWMoKSAmJiAoYnVmLT50eXBlID09IEJVRl9UWVBFX0hFVkMpKQorCQlwdHNfdHlwZSA9IFBUU19UWVBFX1ZJREVPOworCWVsc2UgaWYgKGJ1Zi0+dHlwZSA9PSBCVUZfVFlQRV9WSURFTykKKwkJcHRzX3R5cGUgPSBQVFNfVFlQRV9WSURFTzsKKwllbHNlIGlmIChidWYtPnR5cGUgPT0gQlVGX1RZUEVfQVVESU8pCisJCXB0c190eXBlID0gUFRTX1RZUEVfQVVESU87CisJZWxzZSBpZiAoYnVmLT50eXBlID09IEJVRl9UWVBFX1NVQlRJVExFKSB7CisJCWJ1Zi0+ZmxhZyAmPSB+QlVGX0ZMQUdfUEFSU0VSOworCQlyZXR1cm47CisJfSBlbHNlCisJCXJldHVybjsKKworCWJ1Zi0+ZmxhZyAmPSB+QlVGX0ZMQUdfUEFSU0VSOworCXB0c19zdG9wKHB0c190eXBlKTsKK30KK0VYUE9SVF9TWU1CT0woZXNwYXJzZXJfcmVsZWFzZSk7CisKK3NzaXplX3QgZHJtX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpzdGJ1ZiwKKwkJCQkgIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzMzIgcjsKKwl1MzIgbGVuOworCXUzMiByZWFsY291bnQsIHRvdGFsY291bnQ7CisJdTMyIGhhdmV3cml0ZWJ5dGVzID0gMDsKKwl1MzIgbGVmdGNvdW50ID0gMDsKKworCXN0cnVjdCBkcm1faW5mbyB0bXBtbTsKKwlzdHJ1Y3QgZHJtX2luZm8gKmRybSA9ICZ0bXBtbTsKKwl1MzIgcmVzID0gMDsKKwlpbnQgZHJtX2ZsYWcgPSAwOworCXVuc2lnbmVkIGxvbmcgcmVhbGJ1ZjsKKworCWlmIChidWYgPT0gTlVMTCB8fCBjb3VudCA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc3RidWYtPndyaXRlX3RocmVhZCkgeworCQlyID0gdGhyZWFkcndfZmx1c2hfYnVmZmVycyhzdGJ1Zik7CisJCWlmIChyIDwgMCkKKwkJCXByX2luZm8oIldhcm5pbmcuIGRybSBmbHVzaCB0aHJlYWRydyBmYWlsZWRbJWRdXG4iLCByKTsKKwl9CisJcmVzID0gY29weV9mcm9tX3VzZXIoZHJtLCBidWYsIHNpemVvZihzdHJ1Y3QgZHJtX2luZm8pKTsKKwlpZiAocmVzKSB7CisJCXByX2luZm8oImRybSBrbWFsbG9jIGZhaWxlZCByZXNbJWRdXG4iLCByZXMpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoKGRybS0+ZHJtX2ZsYWcgJiBUWVBFX0RSTUlORk8pICYmIChkcm0tPmRybV9oYXNlc2RhdGEgPT0gMCkpIHsKKwkJaWYgKGRybS0+ZHJtX3BrdHNpemUgPiBNQVhfRFJNX1BBQ0tBR0VfU0laRSkgeworCQkJcHJfZXJyKCJkcm0gcGFja2FnZSBzaXplIGlzIGVycm9yLCBzaXplIGlzICV1XG4iLCBkcm0tPmRybV9wa3RzaXplKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCS8qIGJ1ZiBvbmx5IGhhcyBkcm1pbmZvIG5vdCBoYXZlIGVzZGF0YTsgKi8KKwkJcmVhbGJ1ZiA9IGRybS0+ZHJtX3BoeTsKKwkJcmVhbGNvdW50ID0gZHJtLT5kcm1fcGt0c2l6ZTsKKwkJZHJtX2ZsYWcgPSBkcm0tPmRybV9mbGFnOworCQkvKiBEUk1fUFJOVCgiZHJtX2dldF9yYXdkYXRhCisJCSAqb25seWRybWluZm8gZHJtLT5kcm1faGFzZXNkYXRhWzB4JXhdCisJCSAqIHN0YnVmLT50eXBlICVkIGJ1ZlsweCV4XVxuIiwKKwkJICpkcm0tPmRybV9oYXNlc2RhdGEsc3RidWYtPnR5cGUsYnVmKTsKKwkJICovCisJfSBlbHNlIGlmIChkcm0tPmRybV9oYXNlc2RhdGEgPT0gMSkgewkvKiBidWYgaXMgZHJtaW5mbytlczsgKi8KKwkJaWYgKGRybS0+ZHJtX3BrdHNpemUgPiBNQVhfRFJNX1BBQ0tBR0VfU0laRSkgeworCQkJcHJfZXJyKCJkcm0gcGFja2FnZSBzaXplIGlzIGVycm9yLCBzaXplIGlzICV1XG4iLCBkcm0tPmRybV9wa3RzaXplKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJlYWxjb3VudCA9IGRybS0+ZHJtX3BrdHNpemU7CisJCXJlYWxidWYgPSAodW5zaWduZWQgbG9uZylidWYgKyBzaXplb2Yoc3RydWN0IGRybV9pbmZvKTsKKwkJZHJtX2ZsYWcgPSAwOworCQkvKiBEUk1fUFJOVCgiZHJtX2dldF9yYXdkYXRhCisJCSAqICAgZHJtaW5mbytlcyBkcm0tPmRybV9oYXNlc2RhdGFbMHgleF0KKwkJICogc3RidWYtPnR5cGUgJWRcbiIsZHJtLT5kcm1faGFzZXNkYXRhLHN0YnVmLT50eXBlKTsKKwkJICovCisJfSBlbHNlIHsJCS8qIGJ1ZiBpcyBod2hlYWQ7ICovCisJCXJlYWxjb3VudCA9IGNvdW50OworCQlkcm1fZmxhZyA9IDA7CisJCXJlYWxidWYgPSAodW5zaWduZWQgbG9uZylidWY7CisJCS8qIERSTV9QUk5UKCJkcm1fZ2V0X3Jhd2RhdGEKKwkJICogIGRybS0+ZHJtX2hhc2VzZGF0YVsweCV4XQorCQkgKiBsZW5bJWRdIGNvdW50WyVkXSByZWFsY291dFslZF1cbiIsCisJCSAqIGRybS0+ZHJtX2hhc2VzZGF0YSxsZW4sY291bnQscmVhbGNvdW50KTsKKwkJICovCisJfQorCisJbGVuID0gcmVhbGNvdW50OworCWNvdW50ID0gcmVhbGNvdW50OworCXRvdGFsY291bnQgPSByZWFsY291bnQ7CisJc3RidWYtPmRybV9mbGFnID0gZHJtX2ZsYWc7CisJc3RidWYtPmlzX3BoeWJ1ZiA9IGRybV9mbGFnID8gMSA6IDA7CisKKwl3aGlsZSAobGVuID4gMCkgeworCQlpZiAoc3RidWYtPnR5cGUgIT0gQlVGX1RZUEVfU1VCVElUTEUKKwkJCSYmIHN0YnVmX3NwYWNlKHN0YnVmKSA8IGNvdW50KSB7CisJCQkvKnNob3VsZCBub3Qgd3JpdGUgcGFydGlhbCBkYXRhIGluIGRybSBtb2RlKi8KKwkJCXIgPSBzdGJ1Zl93YWl0X3NwYWNlKHN0YnVmLCBjb3VudCk7CisJCQlpZiAociA8IDApCisJCQkJcmV0dXJuIHI7CisJCQlpZiAoc3RidWZfc3BhY2Uoc3RidWYpIDwgY291bnQpCisJCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwkJbGVuID0gbWluX3QodTMyLCBsZW4sIGNvdW50KTsKKworCQltdXRleF9sb2NrKCZlc3BhcnNlcl9tdXRleCk7CisKKwkJaWYgKHN0YnVmLT50eXBlICE9IEJVRl9UWVBFX0FVRElPKQorCQkJciA9IF9lc3BhcnNlcl93cml0ZSgoY29uc3QgY2hhciBfX3VzZXIgKilyZWFsYnVmLCBsZW4sCisJCQkJCXN0YnVmLCBkcm1fZmxhZyk7CisJCWVsc2UKKwkJCXIgPSBfZXNwYXJzZXJfd3JpdGVfcygoY29uc3QgY2hhciBfX3VzZXIgKilyZWFsYnVmLCBsZW4sCisJCQkJCXN0YnVmKTsKKwkJaWYgKHIgPCAwKSB7CisJCQlwcl9pbmZvKCJkcm1fd3JpdGUgX2VzcGFyc2VyX3dyaXRlIGZhaWxlZCBbJWRdXG4iLCByKTsKKwkJCW11dGV4X3VubG9jaygmZXNwYXJzZXJfbXV0ZXgpOworCQkJcmV0dXJuIHI7CisJCX0KKwkJaGF2ZXdyaXRlYnl0ZXMgKz0gcjsKKwkJbGVmdGNvdW50ID0gdG90YWxjb3VudCAtIGhhdmV3cml0ZWJ5dGVzOworCQlpZiAoaGF2ZXdyaXRlYnl0ZXMgPT0gdG90YWxjb3VudCkgeworCisJCQltdXRleF91bmxvY2soJmVzcGFyc2VyX211dGV4KTsKKwkJCWJyZWFrOwkvKiB3cml0ZSBvazsgKi8KKwkJfSBlbHNlIGlmICgobGVuID4gMCkgJiYgKGhhdmV3cml0ZWJ5dGVzIDwgdG90YWxjb3VudCkpIHsKKwkJCURSTV9QUk5UCisJCQkoImQgd3JpdGVieXRlc1slZF0gd2FudFslZF0gdG90YWxbJWRdIHJlYWxbJWRdXG4iLAorCQkJIGhhdmV3cml0ZWJ5dGVzLCBsZW4sIHRvdGFsY291bnQsIHJlYWxjb3VudCk7CisJCQlsZW4gPSBsZW4gLSByOwkvKiB3cml0ZSBhZ2FpbjsgKi8KKwkJCXJlYWxidWYgPSByZWFsYnVmICsgcjsKKwkJfSBlbHNlIHsKKwkJCXByX2luZm8KKwkJCSgiZSB3cml0ZWJ5dGVzWyVkXSB3YW50WyVkXSB0b3RhbFslZF0gcmVhbFslZF1cbiIsCisJCQkgaGF2ZXdyaXRlYnl0ZXMsIGxlbiwgdG90YWxjb3VudCwgcmVhbGNvdW50KTsKKwkJfQorCQltdXRleF91bmxvY2soJmVzcGFyc2VyX211dGV4KTsKKwl9CisKKwlpZiAoKGRybS0+ZHJtX2ZsYWcgJiBUWVBFX0RSTUlORk8pICYmIChkcm0tPmRybV9oYXNlc2RhdGEgPT0gMCkpIHsKKwkJaGF2ZXdyaXRlYnl0ZXMgPSBzaXplb2Yoc3RydWN0IGRybV9pbmZvKTsKKwl9IGVsc2UgaWYgKGRybS0+ZHJtX2hhc2VzZGF0YSA9PSAxKSB7CisJCWhhdmV3cml0ZWJ5dGVzICs9IHNpemVvZihzdHJ1Y3QgZHJtX2luZm8pOworCX0KKwlyZXR1cm4gaGF2ZXdyaXRlYnl0ZXM7Cit9CitFWFBPUlRfU1lNQk9MKGRybV93cml0ZSk7CisKKy8qCisgKmZsYWdzOgorICoxOnBoeQorICoyOm5vYmxvY2sKKyAqLworc3NpemVfdCBlc3BhcnNlcl93cml0ZV9leChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXN0cnVjdCBzdHJlYW1fYnVmX3MgKnN0YnVmLAorCQkJY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJaW50IGZsYWdzKQoreworCisJczMyIHI7CisJdTMyIGxlbiA9IGNvdW50OworCisJaWYgKGJ1ZiA9PSBOVUxMIHx8IGNvdW50ID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJLypzdWJ0aXRsZSBoYXZlIG5vIGxldmVsIHRvIGNoZWNrLCAqLworCWlmIChzdGJ1Zi0+dHlwZSAhPSBCVUZfVFlQRV9TVUJUSVRMRSAmJiBzdGJ1Zl9zcGFjZShzdGJ1ZikgPCBjb3VudCkgeworCQlpZiAoKGZsYWdzICYgMikgfHwgKChmaWxlICE9IE5VTEwpICYmCisJCQkJKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkpIHsKKwkJCWxlbiA9IHN0YnVmX3NwYWNlKHN0YnVmKTsKKworCQkJaWYgKGxlbiA8IDI1NikJLyogPDFrLmRvIGVhZ2FpbiwgKi8KKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfSBlbHNlIHsKKwkJCWxlbiA9IG1pbihzdGJ1Zl9jYW51c2VzaXplKHN0YnVmKSAvIDgsIGxlbik7CisKKwkJCWlmIChzdGJ1Zl9zcGFjZShzdGJ1ZikgPCBsZW4pIHsKKwkJCQlyID0gc3RidWZfd2FpdF9zcGFjZShzdGJ1ZiwgbGVuKTsKKwkJCQlpZiAociA8IDApCisJCQkJCXJldHVybiByOworCQkJfQorCQl9CisJfQorCisJc3RidWYtPmxhc3Rfd3JpdGVfamlmZmllczY0ID0gamlmZmllc182NDsKKworCWxlbiA9IG1pbl90KHUzMiwgbGVuLCBjb3VudCk7CisKKwltdXRleF9sb2NrKCZlc3BhcnNlcl9tdXRleCk7CisKKwlpZiAoZmxhZ3MgJiAxKQorCQlzdGJ1Zi0+aXNfcGh5YnVmID0gdHJ1ZTsKKworCWlmIChzdGJ1Zi0+dHlwZSA9PSBCVUZfVFlQRV9BVURJTykKKwkJciA9IF9lc3BhcnNlcl93cml0ZV9zKGJ1ZiwgbGVuLCBzdGJ1Zik7CisJZWxzZQorCQlyID0gX2VzcGFyc2VyX3dyaXRlKGJ1ZiwgbGVuLCBzdGJ1ZiwgZmxhZ3MgJiAxKTsKKworCW11dGV4X3VubG9jaygmZXNwYXJzZXJfbXV0ZXgpOworCisJcmV0dXJuIHI7Cit9Citzc2l6ZV90IGVzcGFyc2VyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJc3RydWN0IHN0cmVhbV9idWZfcyAqc3RidWYsCisJCQljb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaWYgKHN0YnVmLT53cml0ZV90aHJlYWQpIHsKKwkJc3NpemVfdCByZXQ7CisKKwkJcmV0ID0gdGhyZWFkcndfd3JpdGUoZmlsZSwgc3RidWYsIGJ1ZiwgY291bnQpOworCQlpZiAocmV0ID09IC1FQUdBSU4pIHsKKwkJCXUzMiBhLCBiOworCQkJaW50IHZkZWxheSwgYWRlbGF5OworCisJCQlpZiAoKHN0YnVmLT50eXBlICE9IEJVRl9UWVBFX1ZJREVPKSAmJgorCQkJCShzdGJ1Zi0+dHlwZSAhPSBCVUZfVFlQRV9IRVZDKSkKKwkJCQlyZXR1cm4gcmV0OworCQkJaWYgKHN0YnVmLT5idWZfc2l6ZSA+IChTWl8xTSAqIDMwKSB8fAorCQkJCSh0aHJlYWRyd19idWZmZXJfc2l6ZShzdGJ1ZikgPiBTWl8xTSAqIDEwKSB8fAorCQkJCSF0aHJlYWRyd19zdXBwb3J0X21vcmVfYnVmZmVycyhzdGJ1ZikpCisJCQkJcmV0dXJuIHJldDsKKwkJCS8qb25seSBjaGFuZyBidWZmZXIgZm9yIHZpZGVvLiovCisJCQl2ZGVsYXkgPSBjYWxjdWxhdGlvbl9zdHJlYW1fZGVsYXllZF9tcygKKwkJCQkJUFRTX1RZUEVfVklERU8sICZhLCAmYik7CisJCQlhZGVsYXkgPSBjYWxjdWxhdGlvbl9zdHJlYW1fZGVsYXllZF9tcygKKwkJCQkJUFRTX1RZUEVfQVVESU8sICZhLCAmYik7CisJCQlpZiAoKHZkZWxheSA+IDEwMCAmJiB2ZGVsYXkgPCAyMDAwKSAmJiAvKnZkZWxheSB2YWxpZC4qLworCQkJCSgodmRlbGF5IDwgNTAwKSB8fC8qdmlkZW8gZGVsYXkgaXMgc2hvcnQhKi8KKwkJCQkoYWRlbGF5ID4gMCAmJiBhZGVsYXkgPCAxMDAwKSkvKmF1ZGlvIGlzIGxvdy4qLworCQkJCSkgeworCQkJCS8qb24gYnVmZmVyIGZ1bGxlZC4KKwkJCQkgKmlmIGRlbGF5IGlzIGxlc3MgdGhhbiAxMDBtcyB3ZSB0aGluayBlcnJvcnMsCisJCQkJICpBbmQgd2UgYWRkIG1vcmUgYnVmZmVyIG9uIGRlbGF5IDwgMnMuCisJCQkJICovCisJCQkJaW50IG5ld19zaXplID0gMiAqIDEwMjQgKiAxMDI0OworCisJCQkJdGhyZWFkcndfYWxsb2NfbW9yZV9idWZmZXJfc2l6ZSgKKwkJCQkJCXN0YnVmLCBuZXdfc2l6ZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIGVzcGFyc2VyX3dyaXRlX2V4KGZpbGUsIHN0YnVmLCBidWYsIGNvdW50LCAwKTsKK30KK0VYUE9SVF9TWU1CT0woZXNwYXJzZXJfd3JpdGUpOworCit2b2lkIGVzcGFyc2VyX3N1Yl9yZXNldCh2b2lkKQoreworCXVsb25nIGZsYWdzOworCURFRklORV9TUElOTE9DSyhsb2NrKTsKKwl1MzIgcGFyc2VyX3N1Yl9zdGFydF9wdHI7CisJdTMyIHBhcnNlcl9zdWJfZW5kX3B0cjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CisKKwlwYXJzZXJfc3ViX3N0YXJ0X3B0ciA9IFJFQURfUEFSU0VSX1JFRyhQQVJTRVJfU1VCX1NUQVJUX1BUUik7CisJcGFyc2VyX3N1Yl9lbmRfcHRyID0gUkVBRF9QQVJTRVJfUkVHKFBBUlNFUl9TVUJfRU5EX1BUUik7CisKKwlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9TVUJfU1RBUlRfUFRSLCBwYXJzZXJfc3ViX3N0YXJ0X3B0cik7CisJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfU1VCX0VORF9QVFIsIHBhcnNlcl9zdWJfZW5kX3B0cik7CisJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfU1VCX1JQLCBwYXJzZXJfc3ViX3N0YXJ0X3B0cik7CisJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfU1VCX1dQLCBwYXJzZXJfc3ViX3N0YXJ0X3B0cik7CisJU0VUX1BBUlNFUl9SRUdfTUFTSyhQQVJTRVJfRVNfQ09OVFJPTCwKKwkJKDcgPDwgRVNfU1VCX1dSX0VORElBTl9CSVQpIHwgRVNfU1VCX01BTl9SRF9QVFIpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGVzcGFyc2VyX3N0YnVmX2luaXQoc3RydWN0IHN0cmVhbV9idWZfcyAqc3RidWYsCisJCQkgICAgICAgc3RydWN0IHZkZWNfcyAqdmRlYykKK3sKKwlpbnQgcmV0ID0gLTE7CisKKwlyZXQgPSBzdGJ1Zl9pbml0KHN0YnVmLCB2ZGVjKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IGVzcGFyc2VyX2luaXQoc3RidWYsIHZkZWMpOworCWlmICghcmV0KQorCQlzdGJ1Zi0+ZmxhZyB8PSBCVUZfRkxBR19JTl9VU0U7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZXNwYXJzZXJfc3RidWZfcmVsZWFzZShzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpzdGJ1ZikKK3sKKwllc3BhcnNlcl9yZWxlYXNlKHN0YnVmKTsKKworCXN0YnVmX3JlbGVhc2Uoc3RidWYpOworfQorCitzdGF0aWMgc3RydWN0IHN0cmVhbV9idWZfb3BzIGVzcGFyc2VyX3N0YnVmX29wcyA9IHsKKwkuaW5pdAk9IGVzcGFyc2VyX3N0YnVmX2luaXQsCisJLnJlbGVhc2UgPSBlc3BhcnNlcl9zdGJ1Zl9yZWxlYXNlLAorCS53cml0ZQk9IGVzcGFyc2VyX3N0YnVmX3dyaXRlLAorCS5nZXRfd3AJPSBwYXJzZXJfZ2V0X3dwLAorCS5zZXRfd3AJPSBwYXJzZXJfc2V0X3dwLAorCS5nZXRfcnAJPSBwYXJzZXJfZ2V0X3JwLAorCS5zZXRfcnAJPSBwYXJzZXJfc2V0X3JwLAorfTsKKworc3RydWN0IHN0cmVhbV9idWZfb3BzICpnZXRfZXNwYXJzZXJfc3RidWZfb3BzKHZvaWQpCit7CisJcmV0dXJuICZlc3BhcnNlcl9zdGJ1Zl9vcHM7Cit9CitFWFBPUlRfU1lNQk9MKGdldF9lc3BhcnNlcl9zdGJ1Zl9vcHMpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZXNwYXJzZXIuaCBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9lc3BhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZTY5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvZXNwYXJzZXIuaApAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9tZWRpYS9zdHJlYW1faW5wdXQvcGFyc2VyL2VzcGFyc2VyLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBFU1BBUlNFUl9ICisjZGVmaW5lIEVTUEFSU0VSX0gKKworI2luY2x1ZGUgIi4uLy4uL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdmRlYy5oIgorCitleHRlcm4gc3NpemVfdCBkcm1fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCXN0cnVjdCBzdHJlYW1fYnVmX3MgKnN0YnVmLAorCQljb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQpOworCitleHRlcm4gczMyIGVzcGFyc2VyX2luaXQoc3RydWN0IHN0cmVhbV9idWZfcyAqYnVmLCBzdHJ1Y3QgdmRlY19zICp2ZGVjKTsKK2V4dGVybiBzMzIgZXNwYXJzZXJfaW5pdF9zKHN0cnVjdCBzdHJlYW1fYnVmX3MgKmJ1Zik7CitleHRlcm4gdm9pZCBlc3BhcnNlcl9yZWxlYXNlKHN0cnVjdCBzdHJlYW1fYnVmX3MgKmJ1Zik7CitleHRlcm4gc3NpemVfdCBlc3BhcnNlcl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpzdGJ1ZiwKKwljb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQpOworZXh0ZXJuIHNzaXplX3QgZXNwYXJzZXJfd3JpdGVfZXgoc3RydWN0IGZpbGUgKmZpbGUsCisJCQlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpzdGJ1ZiwKKwkJCWNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKKwkJCWludCBpc19waHkpOworCitleHRlcm4gczMyIGVzX3ZwdHNfY2hlY2tpbl91czY0KHN0cnVjdCBzdHJlYW1fYnVmX3MgKmJ1ZiwgdTY0IHVzNjQpOworCitleHRlcm4gczMyIGVzX2FwdHNfY2hlY2tpbl91czY0KHN0cnVjdCBzdHJlYW1fYnVmX3MgKmJ1ZiwgdTY0IHVzNjQpOworCitleHRlcm4gaW50IGVzX3ZwdHNfY2hlY2tpbihzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpidWYsIHUzMiBwdHMpOworCitleHRlcm4gaW50IGVzX2FwdHNfY2hlY2tpbihzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpidWYsIHUzMiBwdHMpOworCitleHRlcm4gdm9pZCBlc3BhcnNlcl9hdWRpb19yZXNldChzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpidWYpOworZXh0ZXJuIHZvaWQgZXNwYXJzZXJfYXVkaW9fcmVzZXRfcyhzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpidWYpOworCitleHRlcm4gdm9pZCBlc3BhcnNlcl9zdWJfcmVzZXQodm9pZCk7CisKKyNpZmRlZiBDT05GSUdfQU1fRFZCCitleHRlcm4gaW50IHRzZGVtdXhfc2V0X3Jlc2V0X2ZsYWcodm9pZCk7CisjZW5kaWYKKworLyogVE9ETzogbW92ZSB0byByZWdpc3RlciBoZWFkZXJzICovCisjZGVmaW5lIEVTX1BBQ0tfU0laRV9CSVQgICAgICAgICAgICAgICAgOAorI2RlZmluZSBFU19QQUNLX1NJWkVfV0lEICAgICAgICAgICAgICAgIDI0CisKKyNkZWZpbmUgRVNfQ1RSTF9XSUQgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIEVTX0NUUkxfQklUICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBFU19UWVBFX01BU0sgICAgICAgICAgICAgICAgICAgICgzIDw8IDYpCisjZGVmaW5lIEVTX1RZUEVfVklERU8gICAgICAgICAgICAgICAgICAgKDAgPDwgNikKKyNkZWZpbmUgRVNfVFlQRV9BVURJTyAgICAgICAgICAgICAgICAgICAoMSA8PCA2KQorI2RlZmluZSBFU19UWVBFX1NVQlRJVExFICAgICAgICAgICAgICAgICgyIDw8IDYpCisKKyNkZWZpbmUgRVNfV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAoMTw8NSkKKyNkZWZpbmUgRVNfUEFTU1RIUk9VR0ggICAgICAgICAgICAgICAgICAoMTw8NCkKKyNkZWZpbmUgRVNfSU5TRVJUX0JFRk9SRV9FU19XUklURSAgICAgICAoMTw8MykKKyNkZWZpbmUgRVNfRElTQ0FSRCAgICAgICAgICAgICAgICAgICAgICAoMTw8MikKKyNkZWZpbmUgRVNfU0VBUkNIICAgICAgICAgICAgICAgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgRVNfUEFSU0VSX1NUQVJUICAgICAgICAgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgRVNfUEFSU0VSX0JVU1kgICAgICAgICAgICAgICAgICAoMTw8MCkKKworI2RlZmluZSBQQVJTRVJfSU5UU1RBVF9GRVRDSF9DTUQgICAgKDE8PDcpCisjZGVmaW5lIFBBUlNFUl9JTlRTVEFUX1BBUlNFICAgICAgICAoMTw8NCkKKyNkZWZpbmUgUEFSU0VSX0lOVFNUQVRfRElTQ0FSRCAgICAgICgxPDwzKQorI2RlZmluZSBQQVJTRVJfSU5UU1RBVF9JTlNaRVJPICAgICAgKDE8PDIpCisjZGVmaW5lIFBBUlNFUl9JTlRTVEFUX0FDVF9OT1NTQyAgICAoMTw8MSkKKyNkZWZpbmUgUEFSU0VSX0lOVFNUQVRfU0NfRk9VTkQgICAgICgxPDwwKQorCisjZGVmaW5lIEZFVENIX0NJUl9CVUYgICAgICAgICAgICAgICAoMTw8MzEpCisjZGVmaW5lIEZFVENIX0NIS19CVUZfU1RPUCAgICAgICAgICAoMTw8MzApCisjZGVmaW5lIEZFVENIX1BBU1NUSFJPVUdIICAgICAgICAgICAoMTw8MjkpCisjZGVmaW5lIEZFVENIX0VORElBTiAgICAgICAgICAgICAgICAyNworI2RlZmluZSBGRVRDSF9QQVNTVEhST1VHSF9UWVBFX01BU0sgKDB4Mzw8MjcpCisjZGVmaW5lIEZFVENIX0VORElBTl9NQVNLICAgICAgICAgICAoMHg3PDwyNykKKyNkZWZpbmUgRkVUQ0hfQlVGX1NJWkVfTUFTSyAgICAgICAgICgweDdmZmZmZmYpCisjZGVmaW5lIEZFVENIX0NNRF9QVFJfTUFTSyAgICAgICAgICAzCisjZGVmaW5lIEZFVENIX0NNRF9SRF9QVFJfQklUICAgICAgICA1CisjZGVmaW5lIEZFVENIX0NNRF9XUl9QVFJfQklUICAgICAgICAzCisjZGVmaW5lIEZFVENIX0NNRF9OVU1fTUFTSyAgICAgICAgICAzCisjZGVmaW5lIEZFVENIX0NNRF9OVU1fQklUICAgICAgICAgICAwCisKKyNkZWZpbmUgRVNfQ09VTlRfTUFTSyAgICAgICAgICAgICAgICAweGZmZgorI2RlZmluZSBFU19DT1VOVF9CSVQgICAgICAgICAgICAgICAgIDIwCisjZGVmaW5lIEVTX1JFUV9QRU5ESU5HICAgICAgICAgICAgICAgKDE8PDE5KQorI2RlZmluZSBFU19QQVNTVEhST1VHSF9FTiAgICAgICAgICAgICgxPDwxOCkKKyNkZWZpbmUgRVNfUEFTU1RIUk9VR0hfVFlQRV9NQVNLICAgICAoMzw8MTYpCisjZGVmaW5lIEVTX1BBU1NUSFJPVUdIX1RZUEVfVklERU8gICAgKDA8PDE2KQorI2RlZmluZSBFU19QQVNTVEhST1VHSF9UWVBFX0FVRElPICAgICgxPDwxNikKKyNkZWZpbmUgRVNfUEFTU1RIUk9VR0hfVFlQRV9TVUJUSVRMRSAoMjw8MTYpCisjZGVmaW5lIEVTX1dSX0VORElBTl9NQVNLICAgICAgICAgICAgKDB4NykKKyNkZWZpbmUgRVNfU1VCX1dSX0VORElBTl9CSVQgICAgICAgICA5CisjZGVmaW5lIEVTX1NVQl9NQU5fUkRfUFRSICAgICAgICAgICAgKDE8PDgpCisjZGVmaW5lIEVTX0FVRF9XUl9FTkRJQU5fQklUICAgICAgICAgNQorI2RlZmluZSBFU19BVURfTUFOX1JEX1BUUiAgICAgICAgICAgICgxPDw0KQorI2RlZmluZSBFU19WSURfV1JfRU5ESUFOX0JJVCAgICAgICAgIDEKKyNkZWZpbmUgRVNfVklEX01BTl9SRF9QVFIgICAgICAgICAgICAoMTw8MCkKKworI2RlZmluZSBQU19DRkdfRkVUQ0hfRE1BX1VSR0VOVCAgICAgICAgICgxPDwzMSkKKyNkZWZpbmUgUFNfQ0ZHX1NUUkVBTV9ETUFfVVJHRU5UICAgICAgICAoMTw8MzApCisjZGVmaW5lIFBTX0NGR19GT1JDRV9QRklGT19SRU4gICAgICAgICAgKDE8PDI5KQorI2RlZmluZSBQU19DRkdfUEZJRk9fUEVBS19FTiAgICAgICAgICAgICgxPDwyOCkKKyNkZWZpbmUgUFNfQ0ZHX1NSQ19TRUxfQklUICAgICAgICAgICAgICAyNAorI2RlZmluZSBQU19DRkdfU1JDX1NFTF9NQVNLICAgICAgICAgICAgICgzPDxQU19DRkdfU1JDX1NFTF9CSVQpCisjZGVmaW5lIFBTX0NGR19TUkNfU0VMX0ZFVENIICAgICAgICAgICAgKDA8PFBTX0NGR19TUkNfU0VMX0JJVCkKKyNkZWZpbmUgUFNfQ0ZHX1NSQ19TRUxfQVVYMSAgICAgICAgICAgICAoMTw8UFNfQ0ZHX1NSQ19TRUxfQklUKQkvKmZyb20gTkRNQSAqLworI2RlZmluZSBQU19DRkdfU1JDX1NFTF9BVVgyICAgICAgICAgICAgICgyPDxQU19DRkdfU1JDX1NFTF9CSVQpCisjZGVmaW5lIFBTX0NGR19TUkNfU0VMX0FVWDMgICAgICAgICAgICAgKDM8PFBTX0NGR19TUkNfU0VMX0JJVCkKKyNkZWZpbmUgUFNfQ0ZHX1BGSUZPX0VNUFRZX0NOVF9CSVQgICAgICAxNgorI2RlZmluZSBQU19DRkdfUEZJRk9fRU1QVFlfQ05UX01BU0sgICAgIDB4ZmYKKyNkZWZpbmUgUFNfQ0ZHX01BWF9FU19XUl9DWUNMRV9CSVQgICAgICAxMgorI2RlZmluZSBQU19DRkdfTUFYX0VTX1dSX0NZQ0xFX01BU0sgICAgIDB4ZgorI2RlZmluZSBQU19DRkdfU1RBUlRDT0RFX1dJRF9NQVNLICAgICAgICgweDM8PDEwKQorI2RlZmluZSBQU19DRkdfU1RBUlRDT0RFX1dJRF84ICAgICAgICAgICgweDA8PDEwKQorI2RlZmluZSBQU19DRkdfU1RBUlRDT0RFX1dJRF8xNiAgICAgICAgICgweDE8PDEwKQorI2RlZmluZSBQU19DRkdfU1RBUlRDT0RFX1dJRF8yNCAgICAgICAgICgweDI8PDEwKQorI2RlZmluZSBQU19DRkdfU1RBUlRDT0RFX1dJRF8zMiAgICAgICAgICgweDM8PDEwKQorI2RlZmluZSBQU19DRkdfUEZJRk9fQUNDRVNTX1dJRF9NQVNLICAgICgweDM8PDgpCisjZGVmaW5lIFBTX0NGR19QRklGT19BQ0NFU1NfV0lEXzggICAgICAgKDB4MDw8OCkKKyNkZWZpbmUgUFNfQ0ZHX1BGSUZPX0FDQ0VTU19XSURfMTYgICAgICAoMHgxPDw4KQorI2RlZmluZSBQU19DRkdfUEZJRk9fQUNDRVNTX1dJRF8yNCAgICAgICgweDI8PDgpCisjZGVmaW5lIFBTX0NGR19QRklGT19BQ0NFU1NfV0lEXzMyICAgICAgKDB4Mzw8OCkKKyNkZWZpbmUgUFNfQ0ZHX01BWF9GRVRDSF9DWUNMRV9CSVQgICAgICAwCisjZGVmaW5lIFBTX0NGR19NQVhfRkVUQ0hfQ1lDTEVfTUFTSyAgICAgMHhmZgorCisjZGVmaW5lIFBBUlNFUl9JTlRfRElTQUJMRV9DTlRfTUFTSyAweGZmZmYKKyNkZWZpbmUgUEFSU0VSX0lOVF9ESVNBQkxFX0NOVF9CSVQgIDE2CisjZGVmaW5lIFBBUlNFUl9JTlRfSE9TVF9FTl9NQVNLICAgICAweGZmCisjZGVmaW5lIFBBUlNFUl9JTlRfSE9TVF9FTl9CSVQgICAgICA4CisjZGVmaW5lIFBBUlNFUl9JTlRfQU1SSVNDX0VOX01BU0sgICAweGZmCisjZGVmaW5lIFBBUlNFUl9JTlRfQU1SSVNDX0VOX0JJVCAgICAwCisjZGVmaW5lIFBBUlNFUl9JTlRfQUxMICAgICAgICAgICAgICAweGZmCisKKyNkZWZpbmUgUkVTRVRfUEFSU0VSICAgICAgICAoMTw8OCkKKyNkZWZpbmUgVFNfSElVX0VOQUJMRSAgICAgICAgICAgICAgNQorI2RlZmluZSBVU0VfSElfQlNGX0lOVEVSRkFDRSAgICAgICA3CisKKyNkZWZpbmUgRFJNX1BSTlQoZm10LCBhcmdzLi4uKQorI2RlZmluZSAgVFJBQ0UoKQlwcl9pbmZvKCJkcm0tLVslczo6JWRdXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pCisKKyNlbmRpZiAvKiBFU1BBUlNFUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvaHdfZGVtdXgvTWFrZWZpbGUgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvaHdfZGVtdXgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM0NTRhZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9od19kZW11eC9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKK29iai1tCSs9IGFtbF9oYXJkd2FyZV9kbXgubworCitjY2ZsYWdzLXkgKz0gLUkkKHNyY3RyZWUpL2luY2x1ZGUvbWVkaWEgLUkkKHNyY3RyZWUpL2RyaXZlcnMvbWVkaWEvcGNpL3R0cGNpIC1JJChzcmN0cmVlKS9kcml2ZXJzL2dwaW8gLUkkKHNyY3RyZWUpL2luY2x1ZGUgLURFTkFCTEVfREVNVVhfRFJJVkVSCisKK2FtbF9oYXJkd2FyZV9kbXgtb2JqcyArPSBhbWxfZHZiLm8KK2FtbF9oYXJkd2FyZV9kbXgtb2JqcyArPSBhbWxfZG14Lm8KKworI29iai15ICs9IGR2Yl9jaS8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9od19kZW11eC9hbWxfZGVtb2RfZ3QuaCBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9od19kZW11eC9hbWxfZGVtb2RfZ3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzY1OGIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2h3X2RlbXV4L2FtbF9kZW1vZF9ndC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNyBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisqIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyoKKyogRGVzY3JpcHRpb246CisqLworI2lmbmRlZiBfX0FNTF9ERU1PRF9HVF9IX18KKyNkZWZpbmUgX19BTUxfREVNT0RfR1RfSF9fCisKKyNpbmNsdWRlICIuLi9kdmJfY29tbW9uLmgiCisKKworI2VuZGlmIC8qX19BTUxfREVNT0RfR1RfSF9fKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9od19kZW11eC9hbWxfZG14LmMgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvaHdfZGVtdXgvYW1sX2RteC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkOWQ3ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvaHdfZGVtdXgvYW1sX2RteC5jCkBAIC0wLDAgKzEsNjM3OSBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE3IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyogbW9yZSBkZXRhaWxzLgorKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKgorKiBEZXNjcmlwdGlvbjoKKyovCisvKgorICogQU1MT0dJQyBkZW11eCBkcml2ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3Bpbm11eC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2NvZGVjX21tL2NvZGVjX21tLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9jb2RlY19tbS9jb25maWdzLmg+CisjaW5jbHVkZSAiLi4vLi4vYW1wb3J0cy9zdHJlYW1idWYuaCIKKyNpbmNsdWRlICJjX3N0Yl9kZWZpbmUuaCIKKyNpbmNsdWRlICJjX3N0Yl9yZWdzX2RlZmluZS5oIgorI2luY2x1ZGUgImFtbF9kdmIuaCIKKyNpbmNsdWRlICJhbWxfZHZiX3JlZy5oIgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkL3NpZ25hbC5oPgorCisKKyNkZWZpbmUgRU5BQkxFX1NFQ19CVUZGX1dBVENIRE9HCisjZGVmaW5lIFVTRV9BSEJfTU9ERQorI2RlZmluZSBQUl9FUlJPUl9TUEVFRF9MSU1JVAorCisjZGVmaW5lIHByX2RiZ19mbGFnKF9mLCBfYXJncy4uLilcCisJZG8ge1wKKwkJaWYgKGRlYnVnX2RteCYoX2YpKVwKKwkJCXByaW50ayhfYXJncyk7XAorCX0gd2hpbGUgKDApCisjZGVmaW5lIHByX2RiZ19pcnFfZmxhZyhfZiwgX2FyZ3MuLi4pXAorCWRvIHtcCisJCWlmIChkZWJ1Z19pcnEmKF9mKSlcCisJCQlwcmludGsoX2FyZ3MpO1wKKwl9IHdoaWxlICgwKQorI2RlZmluZSBwcl9kYmcoYXJncy4uLikJcHJfZGJnX2ZsYWcoMHgxLCBhcmdzKQorI2RlZmluZSBwcl9kYmdfaXJxKGFyZ3MuLi4pcHJfZGJnX2lycV9mbGFnKDB4MSwgYXJncykKKyNkZWZpbmUgcHJfZGJnX2lycV9kdnIoYXJncy4uLilwcl9kYmdfaXJxX2ZsYWcoMHgyLCBhcmdzKQorI2RlZmluZSBwcl9kYmdfc2YoYXJncy4uLikgcHJfZGJnX2ZsYWcoMHg0LCBhcmdzKQorI2RlZmluZSBwcl9kYmdfaXJxX3NmKGFyZ3MuLi4pIHByX2RiZ19pcnFfZmxhZygweDQsIGFyZ3MpCisjZGVmaW5lIHByX2RiZ19zcyhhcmdzLi4uKSBwcl9kYmdfZmxhZygweDgsIGFyZ3MpCisjZGVmaW5lIHByX2RiZ19pcnFfc3MoYXJncy4uLikgcHJfZGJnX2lycV9mbGFnKDB4OCwgYXJncykKKyNkZWZpbmUgcHJfZGJnX2lycV9wZXMoYXJncy4uLikgcHJfZGJnX2lycV9mbGFnKDB4MTAsIGFyZ3MpCisjZGVmaW5lIHByX2RiZ19pcnFfc3ViKGFyZ3MuLi4pIHByX2RiZ19pcnFfZmxhZygweDIwLCBhcmdzKQorCisjaWZkZWYgUFJfRVJST1JfU1BFRURfTElNSVQKK3N0YXRpYyB1MzIgbGFzdF9wcl9lcnJvcl90aW1lOworI2RlZmluZSBwcl9lcnJvcihmbXQsIF9hcmdzLi4uKVwKKwlkbyB7XAorCQl1MzIgZGlmZiA9IGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIGxhc3RfcHJfZXJyb3JfdGltZSk7XAorCQlpZiAoIWxhc3RfcHJfZXJyb3JfdGltZSB8fCBkaWZmID4gNTApIHtcCisJCQlwcl9lcnIoIkRWQjoiIGZtdCwgIyMgX2FyZ3MpO1wKKwkJCWxhc3RfcHJfZXJyb3JfdGltZSA9IGppZmZpZXM7XAorCQl9IFwKKwl9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgcHJfZXJyb3IoZm10LCBhcmdzLi4uKSBwcl9lcnIoIkRWQjogIiBmbXQsICMjIGFyZ3MpCisjZW5kaWYKKworI2RlZmluZSBwcl9pbmYoZm10LCBhcmdzLi4uKSAgcHJpbnRrKCJEVkI6ICIgZm10LCAjIyBhcmdzKQorCisjZGVmaW5lIGR1bXAoYiwgbCkgXAorCWRvIHsgXAorCQlpbnQgaTsgXAorCQlwcmludGsoImR1bXA6ICIpOyBcCisJCWZvciAoaSA9IDA7IGkgPCAobCk7IGkrKykge1wKKwkJCWlmICghKGkmMHhmKSkgXAorCQkJCXByaW50aygiXG5cdCIpOyBcCisJCQlwcmludGsoIiUwMnggIiwgKigoKHVuc2lnbmVkIGNoYXIgKikoYikpK2kpKTsgXAorCQl9IFwKKwkJcHJpbnRrKCJcbiIpOyBcCisJfSB3aGlsZSAoMCkKKworTU9EVUxFX1BBUk1fREVTQyhkZWJ1Z19kbXgsICJcblx0XHQgRW5hYmxlIGRlbXV4IGRlYnVnIGluZm9ybWF0aW9uIik7CitzdGF0aWMgaW50IGRlYnVnX2RteDsKK21vZHVsZV9wYXJhbShkZWJ1Z19kbXgsIGludCwgMDY0NCk7CisKK01PRFVMRV9QQVJNX0RFU0MoZGVidWdfaXJxLCAiXG5cdFx0IEVuYWJsZSBkZW11eCBJUlEgZGVidWcgaW5mb3JtYXRpb24iKTsKK3N0YXRpYyBpbnQgZGVidWdfaXJxOworbW9kdWxlX3BhcmFtKGRlYnVnX2lycSwgaW50LCAwNjQ0KTsKKworTU9EVUxFX1BBUk1fREVTQyhkaXNhYmxlX2RzYywgIlxuXHRcdCBEaXNhYmxlIGRpc2NyYW1ibGVyIik7CitzdGF0aWMgaW50IGRpc2FibGVfZHNjOworbW9kdWxlX3BhcmFtKGRpc2FibGVfZHNjLCBpbnQsIDA2NDQpOworCitNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZV9zZWNfbW9uaXRvciwgIlxuXHRcdCBFbmFibGUgc2VjIG1vbml0b3IgZGVmYXVsdCBpcyBlbmFibGUiKTsKK3N0YXRpYyBpbnQgZW5hYmxlX3NlY19tb25pdG9yID0gMjsKK21vZHVsZV9wYXJhbShlbmFibGVfc2VjX21vbml0b3IsIGludCwgMDY0NCk7CisvKkZvciBvbGQgdmVyc2lvbiBrZXJuZWwgKi8KKyNpZm5kZWYgTUVTT05fQ1BVX01BSk9SX0lEX0dYTAorI2RlZmluZSBNRVNPTl9DUFVfTUFKT1JfSURfR1hMCTB4MjEKKyNlbmRpZgorCitzdGF0aWMgaW50IG5waWR0eXBlcyA9IENIQU5ORUxfQ09VTlQ7CisjZGVmaW5lIE1PRF9QQVJBTV9ERUNMQVJFX0NIQU5QSURTX1RZUEVTKF9kbXgpIFwKK01PRFVMRV9QQVJNX0RFU0MoZGVidWdfZG14IyNfZG14IyNfY2hhbnBpZHNfdHlwZXMsICJcblx0XHQgcGlkcyB0eXBlcyBvZiBkbXggY2hhbm5lbHMiKTsgXAorc3RhdGljIHNob3J0IGRlYnVnX2RteCMjX2RteCMjX2NoYW5waWRzX3R5cGVzW0NIQU5ORUxfQ09VTlRdID0gXAorCQkJCQl7WzAgLi4uIChDSEFOTkVMX0NPVU5UIC0gMSldID0gLTF9OyBcCittb2R1bGVfcGFyYW1fYXJyYXkoZGVidWdfZG14IyNfZG14IyNfY2hhbnBpZHNfdHlwZXMsIHNob3J0LCAmbnBpZHR5cGVzLCAwNDQ0KQorCitNT0RfUEFSQU1fREVDTEFSRV9DSEFOUElEU19UWVBFUygwKTsKK01PRF9QQVJBTV9ERUNMQVJFX0NIQU5QSURTX1RZUEVTKDEpOworTU9EX1BBUkFNX0RFQ0xBUkVfQ0hBTlBJRFNfVFlQRVMoMik7CisKKyNkZWZpbmUgc2V0X2RlYnVnX2RteF9jaGFucGlkc190eXBlcyhfZG14LCBfaWR4LCBfdHlwZSlcCisJZG8geyBcCisJCWlmICgoX2RteCkgPT0gMCkgXAorCQkJZGVidWdfZG14MF9jaGFucGlkc190eXBlc1soX2lkeCldID0gKF90eXBlKTsgXAorCQllbHNlIGlmICgoX2RteCkgPT0gMSkgXAorCQkJZGVidWdfZG14MV9jaGFucGlkc190eXBlc1soX2lkeCldID0gKF90eXBlKTsgXAorCQllbHNlIGlmICgoX2RteCkgPT0gMikgXAorCQkJZGVidWdfZG14Ml9jaGFucGlkc190eXBlc1soX2lkeCldID0gKF90eXBlKTsgXAorCX0gd2hpbGUgKDApCisKKworc3RhdGljIGludCBucGlkcyA9IENIQU5ORUxfQ09VTlQ7CisjZGVmaW5lIE1PRF9QQVJBTV9ERUNMQVJFX0NIQU5QSURTKF9kbXgpIFwKK01PRFVMRV9QQVJNX0RFU0MoZGVidWdfZG14IyNfZG14IyNfY2hhbnBpZHMsICJcblx0XHQgcGlkcyBvZiBkbXggY2hhbm5lbHMiKTsgXAorc3RhdGljIHNob3J0IGRlYnVnX2RteCMjX2RteCMjX2NoYW5waWRzW0NIQU5ORUxfQ09VTlRdID0gXAorCQkJCQl7WzAgLi4uIChDSEFOTkVMX0NPVU5UIC0gMSldID0gLTF9OyBcCittb2R1bGVfcGFyYW1fYXJyYXkoZGVidWdfZG14IyNfZG14IyNfY2hhbnBpZHMsIHNob3J0LCAmbnBpZHMsIDA0NDQpCisKKyNkZWZpbmUgQ0lQTFVTX09VVFBVVF9BVVRPIDgKK3N0YXRpYyBpbnQgY2lwbHVzX291dF9zZWwgPSBDSVBMVVNfT1VUUFVUX0FVVE87CitzdGF0aWMgaW50IGNpcGx1c19vdXRfYXV0b19tb2RlID0gMTsKK3N0YXRpYyB1MzIgY2lwbHVzID0gMDsKKyNkZWZpbmUgQ0lQTFVTX09VVF9TRUwgICAgMjgKKyNkZWZpbmUgQ0lQTFVTX0lOX1NFTCAgICAgMjYKKworTU9EX1BBUkFNX0RFQ0xBUkVfQ0hBTlBJRFMoMCk7CitNT0RfUEFSQU1fREVDTEFSRV9DSEFOUElEUygxKTsKK01PRF9QQVJBTV9ERUNMQVJFX0NIQU5QSURTKDIpOworCisjZGVmaW5lIHNldF9kZWJ1Z19kbXhfY2hhbnBpZHMoX2RteCwgX2lkeCwgX3BpZClcCisJZG8geyBcCisJCWlmICgoX2RteCkgPT0gMCkgXAorCQkJZGVidWdfZG14MF9jaGFucGlkc1soX2lkeCldID0gKF9waWQpOyBcCisJCWVsc2UgaWYgKChfZG14KSA9PSAxKSBcCisJCQlkZWJ1Z19kbXgxX2NoYW5waWRzWyhfaWR4KV0gPSAoX3BpZCk7IFwKKwkJZWxzZSBpZiAoKF9kbXgpID09IDIpIFwKKwkJCWRlYnVnX2RteDJfY2hhbnBpZHNbKF9pZHgpXSA9IChfcGlkKTsgXAorCQlpZiAoX3BpZCA9PSAtMSkgXAorCQkJc2V0X2RlYnVnX2RteF9jaGFucGlkc190eXBlcyhfZG14LCBfaWR4LCAtMSk7IFwKKwl9IHdoaWxlICgwKQorCitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnX3NmX3VzZXIsICJcblx0XHQgb25seSBmb3Igc2YgbW9kZSBjaGVjayIpOworc3RhdGljIGludCBkZWJ1Z19zZl91c2VyOworbW9kdWxlX3BhcmFtKGRlYnVnX3NmX3VzZXIsIGludCwgMDQ0NCk7CisKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2Vfc2VjX3NmLCAiXG5cdFx0IGZvcmNlIHNmIG1vZGUgZm9yIHNlYyBmaWx0ZXIiKTsKK3N0YXRpYyBpbnQgZm9yY2Vfc2VjX3NmOworbW9kdWxlX3BhcmFtKGZvcmNlX3NlY19zZiwgaW50LCAwNjQ0KTsKKworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9wZXNfc2YsICJcblx0XHQgZm9yY2Ugc2YgbW9kZSBmb3IgcGVzIGZpbHRlciIpOworc3RhdGljIGludCBmb3JjZV9wZXNfc2Y7Cittb2R1bGVfcGFyYW0oZm9yY2VfcGVzX3NmLCBpbnQsIDA2NDQpOworCitNT0RVTEVfUEFSTV9ERVNDKHVzZV9vZl9zb3AsICJcblx0XHQgRW5hYmxlIHVzZSBvZiBzb3AgaW5wdXQiKTsKK3N0YXRpYyBpbnQgdXNlX29mX3NvcDsKK21vZHVsZV9wYXJhbSh1c2Vfb2Zfc29wLCBpbnQsIDA2NDQpOworCisvKgorICBBcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB1bnVzZWQgY2hhbm5lbCdzIFBJRF9UWVBFIGlzIDB4NywKKyAgaWYgd2UgdXNlIFBJRF9UWVBFKFJFQ09SREVSX1NUUkVBTToweDcpIGZvciByZWNvcmRpbmcgY2hhbm5lbCwKKyAgdGhlIGRhdGEgd2l0aCB0aGUgcGlkIHdoaWNoIGFzc2lnbmVkIGluIHVudXNlZCBjaGFubmVsJ3Mgc2V0dGluZyB3aWxsIGJlIGNhcHR1cmVkIGFsc28uCisgIFRvIGF2b2lkIHRoZSBoaWdoIGJpdHJhdGUoZXhpc3RzKSBvZiB0aGlzIHBpZCdzIGRhdGEgZmxvb2QgdGhlIGJ1ZmZlcnMgaW4gdGhlIGRhdGEgcGF0aCwKKyAgd2hpY2ggd2lsbCBjYXVzZXMgdGhlIHJlY29yZCBkYXRhIGNvcnJ1cHRpb24sIGFuZCBiYWQgcGljdHVyZSBkZWNvZGVkLgorKi8KK01PRFVMRV9QQVJNX0RFU0MoZ19jaGFuX2RlZl9waWQsICJcblx0XHQgZGVmYXVsdCBwaWQgZm9yIHVudXNlZCBjaGFubmVsIik7CitzdGF0aWMgaW50IGdfY2hhbl9kZWZfcGlkID0gMHgxRkZFOworbW9kdWxlX3BhcmFtKGdfY2hhbl9kZWZfcGlkLCBpbnQsIDA2NDQpOworCisKKy8qI2RlZmluZSBDSVBMVVNfS0VZMCAgIDB4MTZmOAorI2RlZmluZSBDSVBMVVNfS0VZMSAgIDB4MTZmOQorI2RlZmluZSBDSVBMVVNfS0VZMiAgIDB4MTZmYQorI2RlZmluZSBDSVBMVVNfS0VZMyAgIDB4MTZmYgorI2RlZmluZSBDSVBMVVNfS0VZX1dSIDB4MTZmYworI2RlZmluZSBDSVBMVVNfQ09ORklHIDB4MTZmZAorI2RlZmluZSBDSVBMVVNfRU5ESUFOIDB4MTZmZSovCisKKworc3RhdGljIHUzMiBvbGRfc3RiX3RvcF9jb25maWc7CitzdGF0aWMgdTMyIG9sZF9mZWNfaW5wdXRfY29udHJvbDsKK3N0YXRpYyBpbnQgaGF2ZV9vbGRfc3RiX3RvcF9jb25maWcgPSAxOworc3RhdGljIGludCBoYXZlX29sZF9mZWNfaW5wdXRfY29udHJvbCA9IDE7CisKK3N0YXRpYyBsb25nIHBlc19vZmZfcHJlW0RNWF9ERVZfQ09VTlRdOworCitzdGF0aWMgdm9pZAorZG14X3dyaXRlX3JlZyhpbnQgciwgdTMyIHYpCit7CisJdTMyIG9sZHYsIG1hc2s7CisKKwlpZiAoZGlzYWJsZV9kc2MpIHsKKwkJaWYgKHIgPT0gU1RCX1RPUF9DT05GSUcpIHsKKwkJCWlmIChoYXZlX29sZF9zdGJfdG9wX2NvbmZpZykgeworCQkJCW9sZHYgPSBvbGRfc3RiX3RvcF9jb25maWc7CisJCQkJaGF2ZV9vbGRfc3RiX3RvcF9jb25maWcgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlvbGR2ID0gUkVBRF9NUEVHX1JFRyhTVEJfVE9QX0NPTkZJRyk7CisJCQl9CisKKwkJCW1hc2sgPSAoMTw8Nyl8KDE8PDE1KXwoMzw8MjYpfCg3PDwyOCk7CisJCQl2ICAgICY9IH5tYXNrOworCQkJdiAgICB8PSAob2xkdiAmIG1hc2spOworCQl9IGVsc2UgaWYgKHIgPT0gRkVDX0lOUFVUX0NPTlRST0wpIHsKKwkJCWlmIChoYXZlX29sZF9mZWNfaW5wdXRfY29udHJvbCkgeworCQkJCW9sZHYgPSBvbGRfZmVjX2lucHV0X2NvbnRyb2w7CisJCQkJaGF2ZV9vbGRfZmVjX2lucHV0X2NvbnRyb2wgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlvbGR2ID0gUkVBRF9NUEVHX1JFRyhGRUNfSU5QVVRfQ09OVFJPTCk7CisJCQl9CisKKwkJCW1hc2sgPSAoMTw8MTUpOworCQkJdiAgICY9IH5tYXNrOworCQkJdiAgIHw9IChvbGR2ICYgbWFzayk7CisJCX0gZWxzZSBpZiAoKHIgPT0gUkVTRVQxX1JFR0lTVEVSKSB8fCAociA9PSBSRVNFVDNfUkVHSVNURVIpKSB7CisJCQlpZiAoIWhhdmVfb2xkX3N0Yl90b3BfY29uZmlnKSB7CisJCQkJaGF2ZV9vbGRfc3RiX3RvcF9jb25maWcgPSAxOworCQkJCW9sZF9zdGJfdG9wX2NvbmZpZyA9CisJCQkJCVJFQURfTVBFR19SRUcoU1RCX1RPUF9DT05GSUcpOworCQkJfQorCQkJaWYgKCFoYXZlX29sZF9mZWNfaW5wdXRfY29udHJvbCkgeworCQkJCWhhdmVfb2xkX2ZlY19pbnB1dF9jb250cm9sID0gMTsKKwkJCQlvbGRfZmVjX2lucHV0X2NvbnRyb2wgPQorCQkJCQlSRUFEX01QRUdfUkVHKEZFQ19JTlBVVF9DT05UUk9MKTsKKwkJCX0KKwkJfSBlbHNlIGlmICgociA9PSBUU19QTF9QSURfSU5ERVgpIHx8IChyID09IFRTX1BMX1BJRF9EQVRBKQorCQkJCQl8fCAociA9PSBDT01NX0RFU0NfS0VZMCkKKwkJCQkJfHwgKHIgPT0gQ09NTV9ERVNDX0tFWTEpCisJCQkJCXx8IChyID09IENPTU1fREVTQ19LRVlfUlcpCisJCQkJCXx8IChyID09IENJUExVU19LRVkwKQorCQkJCQl8fCAociA9PSBDSVBMVVNfS0VZMSkKKwkJCQkJfHwgKHIgPT0gQ0lQTFVTX0tFWTIpCisJCQkJCXx8IChyID09IENJUExVU19LRVkzKQorCQkJCQl8fCAociA9PSBDSVBMVVNfS0VZX1dSKQorCQkJCQl8fCAociA9PSBDSVBMVVNfQ09ORklHKQorCQkJCQl8fCAociA9PSBDSVBMVVNfRU5ESUFOKSkgeworCQkJcmV0dXJuOworCQl9CisJfQorCVdSSVRFX01QRUdfUkVHKHIsIHYpOworfQorCisjdW5kZWYgV1JJVEVfTVBFR19SRUcKKyNkZWZpbmUgV1JJVEVfTVBFR19SRUcociwgdikgZG14X3dyaXRlX3JlZyhyLCB2KQorCisjZGVmaW5lIERNWF9SRUFEX1JFRyhpLCByKVwKKwkoKGkpPygoaSA9PSAxKT9SRUFEX01QRUdfUkVHKHIjI18yKSA6XAorCVJFQURfTVBFR19SRUcociMjXzMpKSA6IFJFQURfTVBFR19SRUcocikpCisKKyNkZWZpbmUgRE1YX1dSSVRFX1JFRyhpLCByLCBkKVwKKwlkbyB7XAorCQlpZiAoaSA9PSAxKSB7XAorCQkJV1JJVEVfTVBFR19SRUcociMjXzIsIGQpO1wKKwkJfSBlbHNlIGlmIChpID09IDIpIHtcCisJCQlXUklURV9NUEVHX1JFRyhyIyNfMywgZCk7XAorCQl9IFwKKwkJZWxzZSB7XAorCQkJV1JJVEVfTVBFR19SRUcociwgZCk7XAorCQl9IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFJFQURfUEVSSV9SRUcJCQlSRUFEX0NCVVNfUkVHCisjZGVmaW5lIFdSSVRFX1BFUklfUkVHCQkJV1JJVEVfQ0JVU19SRUcKKworI2RlZmluZSBSRUFEX0FTWU5DX0ZJRk9fUkVHKGksIHIpXAorCSgoaSkgPyAoKGktMSk/UkVBRF9QRVJJX1JFRyhBU1lOQ19GSUZPMV8jI3IpOlwKKwlSRUFEX1BFUklfUkVHKEFTWU5DX0ZJRk8yXyMjcikpIDogUkVBRF9QRVJJX1JFRyhBU1lOQ19GSUZPXyMjcikpCisKKyNkZWZpbmUgV1JJVEVfQVNZTkNfRklGT19SRUcoaSwgciwgZClcCisJZG8ge1wKKwkJaWYgKGkgPT0gMikge1wKKwkJCVdSSVRFX1BFUklfUkVHKEFTWU5DX0ZJRk8xXyMjciwgZCk7XAorCQl9IGVsc2UgaWYgKGkgPT0gMCkge1wKKwkJCVdSSVRFX1BFUklfUkVHKEFTWU5DX0ZJRk9fIyNyLCBkKTtcCisJCX0gZWxzZSB7XAorCQkJV1JJVEVfUEVSSV9SRUcoQVNZTkNfRklGTzJfIyNyLCBkKTtcCisJCX0gXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0xFQVJfQVNZTkNfRklGT19SRUdfTUFTSyhpLCByZWcsIG1hc2spIFwKKwlXUklURV9BU1lOQ19GSUZPX1JFRyhpLCByZWcsIFwKKwkoUkVBRF9BU1lOQ19GSUZPX1JFRyhpLCByZWcpJih+KG1hc2spKSkpCisKKyNkZWZpbmUgRFZSX0ZFRUQoZikgXAorCSgoZikgJiYgKChmKS0+dHlwZSA9PSBETVhfVFlQRV9UUykgJiYJXAorCSgoKGYpLT50c190eXBlICYgKFRTX1BBQ0tFVCB8IFRTX0RFTVVYKSkgPT0gVFNfUEFDS0VUKSkKKworI2RlZmluZSBNT0RfUEFSQU1fREVDTEFSRV9DSEFOUkVDKF9kbXgpIFwKK01PRFVMRV9QQVJNX0RFU0MoZG14IyNfZG14IyNfY2hhbnJlY19lbmFibGUsIFwKKwkgICAgICAgIlxuXHRcdCByZWNvcmQgYnkgY2hhbm5lbCwgb25lIHRpbWUgdXNlIGluIHRoZSBiZWdpbm5pbmciKTsgXAorc3RhdGljIGludCBkbXgjI19kbXgjI19jaGFucmVjX2VuYWJsZTsgXAorbW9kdWxlX3BhcmFtKGRteCMjX2RteCMjX2NoYW5yZWNfZW5hYmxlLCBpbnQsIDA2NDQpOyBcCitNT0RVTEVfUEFSTV9ERVNDKGRteCMjX2RteCMjX2NoYW5yZWMsICJcblx0XHQgcmVjb3JkIGNoYW5uZWxzIGJpdHMiKTsgXAorc3RhdGljIGludCBkbXgjI19kbXgjI19jaGFucmVjOyBcCittb2R1bGVfcGFyYW0oZG14IyNfZG14IyNfY2hhbnJlYywgaW50LCAwNjQ0KQorCitNT0RfUEFSQU1fREVDTEFSRV9DSEFOUkVDKDApOworTU9EX1BBUkFNX0RFQ0xBUkVfQ0hBTlJFQygxKTsKK01PRF9QQVJBTV9ERUNMQVJFX0NIQU5SRUMoMik7CisKKyNkZWZpbmUgTU9EX1BBUkFNX0RFQ0xBUkVfQ0hBTlBST0MoX2RteCkgXAorTU9EVUxFX1BBUk1fREVTQyhkbXgjI19kbXgjI19jaGFucHJvY19lbmFibGUsICJjaGFubmVsIGZ1cnRoZXIgcHJvY2Vzc2luZyIpOyBcCitzdGF0aWMgaW50IGRteCMjX2RteCMjX2NoYW5wcm9jX2VuYWJsZTsgXAorbW9kdWxlX3BhcmFtKGRteCMjX2RteCMjX2NoYW5wcm9jX2VuYWJsZSwgaW50LCAwNjQ0KTsgXAorTU9EVUxFX1BBUk1fREVTQyhkbXgjI19kbXgjI19jaGFucHJvYywgImZ1cnRoZXIgcHJvY2VzcyBjaGFubmVscyBiaXRzIik7IFwKK3N0YXRpYyBpbnQgZG14IyNfZG14IyNfY2hhbnByb2M7IFwKK21vZHVsZV9wYXJhbShkbXgjI19kbXgjI19jaGFucHJvYywgaW50LCAwNjQ0KQorCitNT0RfUEFSQU1fREVDTEFSRV9DSEFOUFJPQygwKTsKK01PRF9QQVJBTV9ERUNMQVJFX0NIQU5QUk9DKDEpOworTU9EX1BBUkFNX0RFQ0xBUkVfQ0hBTlBST0MoMik7CisKKyNkZWZpbmUgRE1YX0NIX09QX0NIQU5SRUMgIDAKKyNkZWZpbmUgRE1YX0NIX09QX0NIQU5QUk9DIDEKKworc3RhdGljIGlubGluZSBpbnQgX3NldGJpdChpbnQgdiwgaW50IGIpIHsgcmV0dXJuIHZ8KDE8PGIpOyB9CitzdGF0aWMgaW5saW5lIGludCBfY2xyYml0KGludCB2LCBpbnQgYikgeyByZXR1cm4gdiZ+KDE8PGIpOyB9CitzdGF0aWMgaW5saW5lIGludCBfc2V0KGludCB2LCBpbnQgYikgeyByZXR1cm4gYjsgfQorCitzdGF0aWMgaW50IGRzY19zZXRfY3NhX2tleShzdHJ1Y3QgYW1sX2RzY19jaGFubmVsICpjaCwgaW50IGZsYWdzLAorCQkJZW51bSBjYV9jd190eXBlIHR5cGUsIHU4ICprZXkpOworc3RhdGljIGludCBkc2Nfc2V0X2Flc19kZXNfc200X2tleShzdHJ1Y3QgYW1sX2RzY19jaGFubmVsICpjaCwgaW50IGZsYWdzLAorCQkJZW51bSBjYV9jd190eXBlIHR5cGUsIHU4ICprZXkpOworc3RhdGljIHZvaWQgYW1sX2NpX3BsdXNfZGlzYWJsZSh2b2lkKTsKK3N0YXRpYyB2b2lkIGFtX2NpX3BsdXNfc2V0X291dHB1dChzdHJ1Y3QgYW1sX2RzY19jaGFubmVsICpjaCk7CitzdGF0aWMgaW50IHNldF9zdWJ0aXRsZV9wZXNfYnVmZmVyKHN0cnVjdCBhbWxfZG14ICpkbXgpOworCitzdGF0aWMgdm9pZCBkbXhuX29wX2NoYW4oaW50IGRteCwgaW50IGNoLCBpbnQoKm9wKShpbnQsIGludCksIGludCBjaF9vcCkKK3sKKwlpbnQgZW5hYmxlXzAsIGVuYWJsZV8xLCBlbmFibGVfMjsKKwlpbnQgKnNldF8wLCAqc2V0XzEsICpzZXRfMjsKKwlpbnQgcmVnOworCisJaWYgKGNoX29wID09IERNWF9DSF9PUF9DSEFOUkVDKSB7CisJCWVuYWJsZV8wID0gZG14MF9jaGFucmVjX2VuYWJsZTsKKwkJZW5hYmxlXzEgPSBkbXgxX2NoYW5yZWNfZW5hYmxlOworCQllbmFibGVfMiA9IGRteDJfY2hhbnJlY19lbmFibGU7CisJCXNldF8wID0gJmRteDBfY2hhbnJlYzsKKwkJc2V0XzEgPSAmZG14MV9jaGFucmVjOworCQlzZXRfMiA9ICZkbXgyX2NoYW5yZWM7CisJCXJlZyA9IERFTVVYX0NIQU5fUkVDT1JEX0VOOworCX0gZWxzZSBpZiAoY2hfb3AgPT0gRE1YX0NIX09QX0NIQU5QUk9DKSB7CisJCWVuYWJsZV8wID0gZG14MF9jaGFucHJvY19lbmFibGU7CisJCWVuYWJsZV8xID0gZG14MV9jaGFucHJvY19lbmFibGU7CisJCWVuYWJsZV8yID0gZG14Ml9jaGFucHJvY19lbmFibGU7CisJCXNldF8wID0gJmRteDBfY2hhbnByb2M7CisJCXNldF8xID0gJmRteDFfY2hhbnByb2M7CisJCXNldF8yID0gJmRteDJfY2hhbnByb2M7CisJCXJlZyA9IERFTVVYX0NIQU5fUFJPQ0VTU19FTjsKKwl9IGVsc2UgeworCQlyZXR1cm47CisJfQorCWlmIChkbXggPT0gMCkgeworCQlpZiAoZW5hYmxlXzApIHsKKwkJCSpzZXRfMCA9IG9wKCpzZXRfMCwgY2gpOworCQkJV1JJVEVfTVBFR19SRUcocmVnK0RFTVVYXzFfT0ZGU0VULCAqc2V0XzApOworCQl9CisJfSBlbHNlIGlmIChkbXggPT0gMSkgeworCQlpZiAoZW5hYmxlXzEpIHsKKwkJCSpzZXRfMSA9IG9wKCpzZXRfMSwgY2gpOworCQkJV1JJVEVfTVBFR19SRUcocmVnK0RFTVVYXzJfT0ZGU0VULCAqc2V0XzEpOworCQl9CisJfSBlbHNlIGlmIChkbXggPT0gMikgeworCQlpZiAoZW5hYmxlXzIpIHsKKwkJCSpzZXRfMiA9IG9wKCpzZXRfMiwgY2gpOworCQkJV1JJVEVfTVBFR19SRUcocmVnK0RFTVVYXzNfT0ZGU0VULCAqc2V0XzIpOworCQl9CisJfQorfQorI2RlZmluZSBkbXhfYWRkX3JlY2NoYW4oX2RteCwgX2NoaWQpIFwKKwlkbyB7IFwKKwkJcHJfZGJnKCJkbXhbJWRdX2FkZF9yZWNjaGFuWyVkXVxuIiwgX2RteCwgX2NoaWQpOyBcCisJCWRteG5fb3BfY2hhbihfZG14LCBfY2hpZCwgX3NldGJpdCwgRE1YX0NIX09QX0NIQU5SRUMpOyBcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgZG14X3JtX3JlY2NoYW4oX2RteCwgX2NoaWQpIFwKKwlkbyB7IFwKKwkJcHJfZGJnKCJkbXhbJWRdX3JtX3JlY2NoYW5bJWxkXVxuIiwgX2RteCwgX2NoaWQpOyBcCisJCWRteG5fb3BfY2hhbihfZG14LCBfY2hpZCwgX2NscmJpdCwgRE1YX0NIX09QX0NIQU5SRUMpOyBcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgZG14X3NldF9yZWNjaGFuKF9kbXgsIF9jaHMpIFwKKwlkbyB7IFwKKwkJcHJfZGJnKCJkbXhbJWRdX3NldF9yZWNjaGFuWyVkXVxuIiwgX2RteCwgX2Nocyk7IFwKKwkJZG14bl9vcF9jaGFuKF9kbXgsIF9jaHMsIF9zZXQsIERNWF9DSF9PUF9DSEFOUkVDKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgZG14X2FkZF9wcm9jY2hhbihfZG14LCBfY2hpZCkgXAorCWRvIHsgXAorCQlwcl9kYmcoImRteFslZF1fYWRkX3Byb2NjaGFuWyVkXVxuIiwgX2RteCwgX2NoaWQpOyBcCisJCWRteG5fb3BfY2hhbihfZG14LCBfY2hpZCwgX3NldGJpdCwgRE1YX0NIX09QX0NIQU5QUk9DKTsgXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIGRteF9ybV9wcm9jY2hhbihfZG14LCBfY2hpZCkgXAorCWRvIHsgXAorCQlwcl9kYmcoImRteFslZF1fcm1fcHJvY2NoYW5bJWxkXVxuIiwgX2RteCwgX2NoaWQpOyBcCisJCWRteG5fb3BfY2hhbihfZG14LCBfY2hpZCwgX2NscmJpdCwgRE1YX0NIX09QX0NIQU5QUk9DKTsgXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIGRteF9zZXRfcHJvY2NoYW4oX2RteCwgX2NocykgXAorCWRvIHsgXAorCQlwcl9kYmcoImRteFslZF1fc2V0X3Byb2NjaGFuWyVkXVxuIiwgX2RteCwgX2Nocyk7IFwKKwkJZG14bl9vcF9jaGFuKF9kbXgsIF9jaHMsIF9zZXQsIERNWF9DSF9PUF9DSEFOUFJPQyk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIE5PX1NVQgorI2RlZmluZSBTVUJfQlVGX0RNWAorI2RlZmluZSBTVUJfUEFSU0VSCisKKyNpZm5kZWYgU1VCX0JVRl9ETVgKKyN1bmRlZiBTVUJfUEFSU0VSCisjZW5kaWYKKworI2RlZmluZSBTVUJfQlVGX1NIQVJFRAorI2RlZmluZSBQRVNfQlVGX1NIQVJFRAorCisjZGVmaW5lIFNZU19DSEFOX0NPVU5UICAgICg0KQorI2RlZmluZSBTRUNfR1JQX0xFTl8wICAgICAoMHhjKQorI2RlZmluZSBTRUNfR1JQX0xFTl8xICAgICAoMHhjKQorI2RlZmluZSBTRUNfR1JQX0xFTl8yICAgICAoMHhjKQorI2RlZmluZSBTRUNfR1JQX0xFTl8zICAgICAoMHhjKQorI2RlZmluZSBMQVJHRV9TRUNfQlVGRl9NQVNLICAweEZGRkZGRkZGCisjZGVmaW5lIExBUkdFX1NFQ19CVUZGX0NPVU5UIDMyCisjZGVmaW5lIFdBVENIRE9HX1RJTUVSICAgIDI1MAorI2RlZmluZSBBU1lOQ0ZJRk9fQlVGRkVSX1NJWkVfREVGQVVMVCAoNTEyKjEwMjQpCisKKyNkZWZpbmUgREVNVVhfSU5UX01BU0tcCisJCQkoKDA8PChBVURJT19TUExJQ0lOR19QT0lOVCkpICAgIHxcCisJCQkoMDw8KFZJREVPX1NQTElDSU5HX1BPSU5UKSkgICAgIHxcCisJCQkoMTw8KE9USEVSX1BFU19SRUFEWSkpICAgICAgICAgIHxcCisJCQkoMTw8KFBDUl9SRUFEWSkpICAgICAgICAgICAgICAgIHxcCisJCQkoMTw8KFNVQl9QRVNfUkVBRFkpKSAgICAgICAgICAgIHxcCisJCQkoMTw8KFNFQ1RJT05fQlVGRkVSX1JFQURZKSkgICAgIHxcCisJCQkoMDw8KE9NX0NNRF9SRUFEX1BFTkRJTkcpKSAgICAgIHxcCisJCQkoMTw8KFRTX0VSUk9SX1BJTikpICAgICAgICAgICAgIHxcCisJCQkoMTw8KE5FV19QRFRTX1JFQURZKSkgICAgICAgICAgIHxcCisJCQkoMDw8KERVUExJQ0FURURfUEFDS0VUKSkgICAgICAgIHxcCisJCQkoMDw8KERJU19DT05USU5VSVRZX1BBQ0tFVCkpKQorCisjZGVmaW5lIFRTX1NSQ19NQVggMworCisvKlJlc2V0IHRoZSBkZW11eCBkZXZpY2UqLworI2RlZmluZSBSRVNFVF9ERU1VWDIgICAgICAoMTw8MTUpCisjZGVmaW5lIFJFU0VUX0RFTVVYMSAgICAgICgxPDwxNCkKKyNkZWZpbmUgUkVTRVRfREVNVVgwICAgICAgKDE8PDEzKQorI2RlZmluZSBSRVNFVF9TMlAxICAgICAgICAoMTw8MTIpCisjZGVmaW5lIFJFU0VUX1MyUDAgICAgICAgICgxPDwxMSkKKyNkZWZpbmUgUkVTRVRfREVTICAgICAgICAgKDE8PDEwKQorI2RlZmluZSBSRVNFVF9UT1AgICAgICAgICAoMTw8OSkKKworc3RhdGljIGludCBkbXhfcmVtb3ZlX2ZlZWQoc3RydWN0IGFtbF9kbXggKmRteCwgc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkKTsKK3N0YXRpYyB2b2lkIHJlc2V0X2FzeW5jX2ZpZm9zKHN0cnVjdCBhbWxfZHZiICpkdmIpOworc3RhdGljIGludCBkbXhfYWRkX2ZlZWQoc3RydWN0IGFtbF9kbXggKmRteCwgc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkKTsKK3N0YXRpYyBpbnQgZG14X3NtYWxsc2VjX3NldChzdHJ1Y3QgYW1sX3NtYWxsc2VjICpzcywgaW50IGVuYWJsZSwgaW50IGJ1ZnNpemUsCisJCQkJaW50IGZvcmNlKTsKK3N0YXRpYyBpbnQgZG14X3RpbWVvdXRfc2V0KHN0cnVjdCBhbWxfZG14dGltZW91dCAqZHRvLCBpbnQgZW5hYmxlLAorCQkJCWludCB0aW1lb3V0LCBpbnQgY2hfZGlzLCBpbnQgbm9tYXRjaCwKKwkJCQlpbnQgZm9yY2UpOworCisvKkF1ZGlvICYgVmlkZW8gUFRTIHZhbHVlKi8KK3N0YXRpYyB1MzIgdmlkZW9fcHRzID0gMDsKK3N0YXRpYyB1MzIgYXVkaW9fcHRzID0gMDsKK3N0YXRpYyB1MzIgdmlkZW9fcHRzX2JpdDMyID0gMDsKK3N0YXRpYyB1MzIgYXVkaW9fcHRzX2JpdDMyID0gMDsKK3N0YXRpYyB1MzIgZmlyc3RfdmlkZW9fcHRzID0gMDsKK3N0YXRpYyB1MzIgZmlyc3RfYXVkaW9fcHRzID0gMDsKK3N0YXRpYyBpbnQgZGVtdXhfc2tpcGJ5dGU7CitzdGF0aWMgaW50IHRzZmlsZV9jbGtkaXYgPSA1Oworc3RhdGljIGludCBhc3luY2ZpZm9fYnVmX2xlbiA9IEFTWU5DRklGT19CVUZGRVJfU0laRV9ERUZBVUxUOworCisjZGVmaW5lIFNGX0RNWF9JRCAyCisjZGVmaW5lIFNGX0FGSUZPX0lEIDEKKworI2RlZmluZSBzZl9kbXhfc2YoX2RteCkgXAorCSgoKF9kbXgpLT5pZCA9PSBTRl9ETVhfSUQpIFwKKwkmJiAoKHN0cnVjdCBhbWxfZHZiICopKF9kbXgpLT5kZW11eC5wcml2KS0+c3dmaWx0ZXIudXNlcikKKyNkZWZpbmUgc2ZfYWZpZm9fc2YoX2FmaWZvKSBcCisJKCgoX2FmaWZvKS0+aWQgPT0gU0ZfQUZJRk9fSUQpICYmIChfYWZpZm8pLT5kdmItPnN3ZmlsdGVyLnVzZXIpCisjZGVmaW5lIGRteF9nZXRfZGV2KGRteCkgKCgoc3RydWN0IGFtbF9kdmIgKikoKGRteCktPmRlbXV4LnByaXYpKS0+ZGV2KQorI2RlZmluZSBhc3luY2ZpZm9fZ2V0X2RldihhZmlmbykgKChhZmlmbyktPmR2Yi0+ZGV2KQorCisKK2ludCBkbXhfcGh5cmVnX2FjY2Vzcyh1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgd3JpdGV2YWwsCisJCSAgIHVuc2lnbmVkIGludCAqcmVhZHZhbCkKK3sKKwl2b2lkIF9faW9tZW0gKnZhZGRyOworCisJcmVnID0gcm91bmRfZG93bihyZWcsIDB4Myk7CisJdmFkZHIgPSBpb3JlbWFwKHJlZywgMHg0KTsKKwlpZiAoIXZhZGRyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChyZWFkdmFsKQorCQkqcmVhZHZhbCA9IHJlYWRsX3JlbGF4ZWQodmFkZHIpOworCWVsc2UKKwkJd3JpdGVsX3JlbGF4ZWQod3JpdGV2YWwsIHZhZGRyKTsKKwlpb3VubWFwKHZhZGRyKTsKKwlyZXR1cm4gMDsKK30KKworLypTZWN0aW9uIGJ1ZmZlciB3YXRjaGRvZyovCitzdGF0aWMgdm9pZCBzZWN0aW9uX2J1ZmZlcl93YXRjaGRvZ19mdW5jKHN0cnVjdCB0aW1lcl9saXN0ICogdGltZXIpCit7CisJc3RydWN0IGFtbF9kdmIgKmR2YiA9IGZyb21fdGltZXIoZHZiLHRpbWVyLHdhdGNoZG9nX3RpbWVyKTsKKwlzdHJ1Y3QgYW1sX2RteCAqZG14OworCXUzMiBzZWN0aW9uX2J1c3kzMiA9IDAsIG9tX2NtZF9zdGF0dXMzMiA9IDAsCisJICAgIGRlbXV4X2NoYW5uZWxfYWN0aXZpdHkzMiA9IDA7CisJdTE2IGRlbXV4X2ludF9zdGF0dXMxID0gMDsKKwl1MzIgZGV2aWNlX25vID0gMDsKKwl1MzIgZmlsdGVyX251bWJlciA9IDA7CisJdTMyIGkgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHZiLT5zbG9jaywgZmxhZ3MpOworCisJZm9yIChkZXZpY2Vfbm8gPSAwOyBkZXZpY2Vfbm8gPCBETVhfREVWX0NPVU5UOyBkZXZpY2Vfbm8rKykgeworCisJCWRteCA9ICZkdmItPmRteFtkZXZpY2Vfbm9dOworCisJCWlmIChkdmItPmRteF93YXRjaGRvZ19kaXNhYmxlW2RldmljZV9ub10pCisJCQljb250aW51ZTsKKworCQlpZiAoIWRteC0+aW5pdCkKKwkJCWNvbnRpbnVlOworCisJCW9tX2NtZF9zdGF0dXMzMiA9CisJCSAgICBETVhfUkVBRF9SRUcoZGV2aWNlX25vLCBPTV9DTURfU1RBVFVTKTsKKwkJZGVtdXhfY2hhbm5lbF9hY3Rpdml0eTMyID0KKwkJICAgIERNWF9SRUFEX1JFRyhkZXZpY2Vfbm8sIERFTVVYX0NIQU5ORUxfQUNUSVZJVFkpOworCQlzZWN0aW9uX2J1c3kzMiA9CisJCQlETVhfUkVBRF9SRUcoZGV2aWNlX25vLCBTRUNfQlVGRl9CVVNZKTsKKworCQlpZiAob21fY21kX3N0YXR1czMyICYgMHg4ZmMyKSB7CisJCQkvKiBiaXQgMTU6MTIgLS0gb21fY21kX2NvdW50IChyZWFkIG9ubHkpICovCisJCQkvKiBiaXQgIDExOjkgLS0gb3ZlcmZsb3dfY291bnQgKi8KKwkJCS8qIGJpdCAgMTE6OSAtLSAgICAgICBvbV9jbWRfd3JfcHRyKHJlYWQgb25seSkgKi8KKwkJCS8qIGJpdCAgIDg6NiAtLSBvbV9vdmVyd3JpdGVfY291bnQgKi8KKwkJCS8qIGJpdCAgIDg6NiAtLSAgICAgICBvbV9jbWRfcmRfcHRyKHJlYWQgb25seSkgKi8KKwkJCS8qIGJpdCAgIDU6MyAtLSB0eXBlX3N0Yl9vbV93X3JkKHJlYWQgb25seSkgKi8KKwkJCS8qIGJpdCAgICAgMiAtLSB1bml0X3N0YXJ0X3N0Yl9vbV93X3JkKHJlYWQgb25seSkgKi8KKwkJCS8qIGJpdCAgICAgMSAtLSBvbV9jbWRfb3ZlcmZsb3cocmVhZCBvbmx5KSAqLworCQkJLyogYml0ICAgICAwIC0tIG9tX2NtZF9wZW5kaW5nKHJlYWQpICovCisJCQkvKiBiaXQgICAgIDAgLS0gb21fY21kX3JlYWRfZmluaXNoZWQod3JpdGUpICovCisJCQkvKkJVRzogSWYgdGhlIHJlY29kZXIgaXMgcnVubmluZywgcmV0dXJuICovCisJCQlpZiAoIWRteC0+cmVjb3JkKSB7CisJCQkJLyogT00gc3RhdHVzIGlzIHdyb25nICovCisJCQkJZG14LT5vbV9zdGF0dXNfZXJyb3JfY291bnQrKzsKKwkJCQlwcl9kYmcoImRlbXV4IG9tIHN0YXR1cyBcbiIKKwkJCQkiJTA0eFx0JTAzeFx0JTAzeFx0JTAzeFx0JTAxeFx0JTAxeFx0IgorCQkJCSIleFx0JXhcdGRteCVkOnN0YXR1czoweCV4ZXJyX2NudDolZC0lZFxuIiwKKwkJCQkob21fY21kX3N0YXR1czMyID4+IDEyKSAmIDB4ZiwKKwkJCQkob21fY21kX3N0YXR1czMyID4+IDkpICYgMHg3LAorCQkJCShvbV9jbWRfc3RhdHVzMzIgPj4gNikgJiAweDcsCisJCQkJKG9tX2NtZF9zdGF0dXMzMiA+PiAzKSAmIDB4NywKKwkJCQkob21fY21kX3N0YXR1czMyID4+IDIpICYgMHgxLAorCQkJCShvbV9jbWRfc3RhdHVzMzIgPj4gMSkgJiAweDEsCisJCQkJZGVtdXhfY2hhbm5lbF9hY3Rpdml0eTMyLCBzZWN0aW9uX2J1c3kzMiwKKwkJCQlkbXgtPmlkLCBvbV9jbWRfc3RhdHVzMzIsIGRteC0+b21fc3RhdHVzX2Vycm9yX2NvdW50LCBlbmFibGVfc2VjX21vbml0b3IpOworCQkJCWlmIChlbmFibGVfc2VjX21vbml0b3IgJiYKKwkJCQkJCWRteC0+b21fc3RhdHVzX2Vycm9yX2NvdW50ID4gZW5hYmxlX3NlY19tb25pdG9yKSB7CisJCQkJCS8qUmVzZXQgdGhlIGRlbXV4ICovCisJCQkJCWRteF9yZXNldF9kbXhfaHdfZXhfdW5sb2NrKGR2YiwgZG14LCAwKTsKKwkJCQkJLyogUmVzZXQgdGhlIGVycm9yIGNvdW50ICovCisJCQkJCWRteC0+b21fc3RhdHVzX2Vycm9yX2NvdW50ID0gMDsKKwkJCQkJZ290byBlbmQ7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJLyogT00gc3RhdHVzIGlzIGNvcnJlY3QsIHJlc2V0IHRoZSBlcnJvciBjb3VudCAqLworCQkJZG14LT5vbV9zdGF0dXNfZXJyb3JfY291bnQgPSAwOworCQl9CisJCXNlY3Rpb25fYnVzeTMyID0KKwkJCURNWF9SRUFEX1JFRyhkZXZpY2Vfbm8sIFNFQ19CVUZGX0JVU1kpOworCQlpZiAoTEFSR0VfU0VDX0JVRkZfTUFTSyA9PQorCQkJCShzZWN0aW9uX2J1c3kzMiAmIExBUkdFX1NFQ19CVUZGX01BU0spKSB7CisJCQkvKkFsbCB0aGUgbGFyZ2VzdCBzZWN0aW9uIGJ1ZmZlcnMgb2NjdXBpZWQsCisJCQkgKiBjbGVhciBidWZmZXJzCisJCQkgKi8KKwkJCURNWF9XUklURV9SRUcoZGV2aWNlX25vLAorCQkJCQlTRUNfQlVGRl9SRUFEWSwgc2VjdGlvbl9idXN5MzIpOworCQl9IGVsc2UgeworCQkJZm9yIChpID0gMDsgaSA8IFNFQ19CVUZfQ09VTlQ7IGkrKykgeworCQkJCWlmICghKHNlY3Rpb25fYnVzeTMyICYgKDEgPDwgaSkpKQorCQkJCQljb250aW51ZTsKKwkJCQlETVhfV1JJVEVfUkVHKGRldmljZV9ubywgU0VDX0JVRkZfTlVNQkVSLCBpKTsKKwkJCQlmaWx0ZXJfbnVtYmVyID0JRE1YX1JFQURfUkVHKGRldmljZV9ubywKKwkJCQkJCQlTRUNfQlVGRl9OVU1CRVIpOworCQkJCWZpbHRlcl9udW1iZXIgPj49IDg7CisJCQkJaWYgKChmaWx0ZXJfbnVtYmVyID49IEZJTFRFUl9DT1VOVCkKKwkJCQkJLyogPj0zMSwgZG8gbm90IGhhbmRsZSB0aGlzIGNhc2UgKi8KKwkJCQkJfHwgKChmaWx0ZXJfbnVtYmVyIDwgRklMVEVSX0NPVU5UKQorCQkJCQkmJiBkbXgtPmZpbHRlcltmaWx0ZXJfbnVtYmVyXS51c2VkKSkKKwkJCQkJc2VjdGlvbl9idXN5MzIgJj0gfigxIDw8IGkpOworCQkJfQorCQkJaWYgKHNlY3Rpb25fYnVzeTMyICYgKGRteC0+c21hbGxzZWMuZW5hYmxlID8KKwkJCQkJCTB4N0ZGRkZGRkYgOgorCQkJCQkJTEFSR0VfU0VDX0JVRkZfTUFTSykpIHsKKwkJCQkvKkNsZWFyIGludmFsaWQgYnVmZmVycyAqLworCQkJCURNWF9XUklURV9SRUcoZGV2aWNlX25vLAorCQkJCQkJU0VDX0JVRkZfUkVBRFksCisJCQkJCQlzZWN0aW9uX2J1c3kzMik7CisJCQkJcHJfZXJyb3IoImNsZWFyIGludmFsaWQgYnVmZmVyIDB4JXhcbiIsCisJCQkJCQlzZWN0aW9uX2J1c3kzMik7CisJCQl9CisjaWYgMAorCQkJc2VjdGlvbl9idXN5MzIgPSAweDdmZmZmZmZmOworCQkJZm9yIChpID0gMDsgaSA8IFNFQ19CVUZfQlVTWV9TSVpFOyBpKyspIHsKKwkJCQlkbXgtPnNlY3Rpb25fYnVzeVtpXSA9ICgKKwkJCQkJKGkgPT0gU0VDX0JVRl9CVVNZX1NJWkUgLSAxKSA/CisJCQkJCURNWF9SRUFEX1JFRyhkZXZpY2Vfbm8sIFNFQ19CVUZGX0JVU1kpIDoKKwkJCQkJZG14LT5zZWN0aW9uX2J1c3lbaSArIDFdKTsKKwkJCQlzZWN0aW9uX2J1c3kzMiAmPSBkbXgtPnNlY3Rpb25fYnVzeVtpXTsKKwkJCX0KKworCQkJLypjb3VudCB0aGUgbnVtYmVyIG9mICcxJyBiaXRzICovCisJCQlpID0gc2VjdGlvbl9idXN5MzI7CisJCQlpID0gKGkgJiAweDU1NTU1NTU1KSArICgoaSAmIDB4YWFhYWFhYWEpID4+IDEpOworCQkJaSA9IChpICYgMHgzMzMzMzMzMykgKyAoKGkgJiAweGNjY2NjY2NjKSA+PiAyKTsKKwkJCWkgPSAoaSAmIDB4MGYwZjBmMGYpICsgKChpICYgMHhmMGYwZjBmMCkgPj4gNCk7CisJCQlpID0gKGkgJiAweDAwZmYwMGZmKSArICgoaSAmIDB4ZmYwMGZmMDApID4+IDgpOworCQkJaSA9IChpICYgMHgwMDAwZmZmZikgKyAoKGkgJiAweGZmZmYwMDAwKSA+PiAxNik7CisJCQlpZiAoaSA+IExBUkdFX1NFQ19CVUZGX0NPVU5UKSB7CisJCQkJLyp0b28gbG9uZyBzb21lIG9mIHRoZSBzZWN0aW9uCisJCQkJICogYnVmZmVycyBhcmUgYmVpbmcgcHJvY2Vzc2VkCisJCQkJICovCisJCQkJRE1YX1dSSVRFX1JFRyhkZXZpY2Vfbm8sIFNFQ19CVUZGX1JFQURZLAorCQkJCQkgICAgICBzZWN0aW9uX2J1c3kzMik7CisJCQl9CisjZW5kaWYKKwkJfQorCQlkZW11eF9pbnRfc3RhdHVzMSA9CisJCQlETVhfUkVBRF9SRUcoZGV2aWNlX25vLCBTVEJfSU5UX1NUQVRVUykgJiAweGZmZjc7CisJCWlmIChkZW11eF9pbnRfc3RhdHVzMSAmICgxIDw8IFRTX0VSUk9SX1BJTikpIHsKKwkJCURNWF9XUklURV9SRUcoZGV2aWNlX25vLAorCQkJCVNUQl9JTlRfU1RBVFVTLAorCQkJCSgxIDw8IFRTX0VSUk9SX1BJTikpOworCQl9CisJfQorCitlbmQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHZiLT5zbG9jaywgZmxhZ3MpOworI2lmZGVmIEVOQUJMRV9TRUNfQlVGRl9XQVRDSERPRworCW1vZF90aW1lcigmZHZiLT53YXRjaGRvZ190aW1lciwKKwkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhXQVRDSERPR19USU1FUikpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNlY19maWx0ZXJfbWF0Y2goc3RydWN0IGFtbF9kbXggKmRteCwgc3RydWN0IGFtbF9maWx0ZXIgKmYsCisJCQkJICAgdTggKnApCit7CisJaW50IGI7CisJdTggbmVxID0gMDsKKworCWlmICghZi0+dXNlZCB8fCAhZG14LT5jaGFubmVsW2YtPmNoYW5faWRdLnVzZWQpCisJCXJldHVybiAwOworCisJZm9yIChiID0gMDsgYiA8IEZJTFRFUl9MRU47IGIrKykgeworCQl1OCB4b3IgPSBwW2JdIF4gZi0+dmFsdWVbYl07CisKKwkJaWYgKHhvciAmIGYtPm1hc2thbmRtb2RlW2JdKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKHhvciAmIGYtPm1hc2thbmRub3Rtb2RlW2JdKQorCQkJbmVxID0gMTsKKwl9CisKKwlpZiAoZi0+bmVxICYmICFuZXEpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHRyaWdnZXJfY3JjX21vbml0b3Ioc3RydWN0IGFtbF9kbXggKmRteCkKK3sKKwlpZiAoIWRteC0+Y3JjX2NoZWNrX3RpbWUpIHsKKwkJZG14LT5jcmNfY2hlY2tfdGltZSA9IGppZmZpZXM7CisJCWRteC0+Y3JjX2NoZWNrX2NvdW50ID0gMDsKKwl9CisKKwlpZiAoZG14LT5jcmNfY2hlY2tfY291bnQgPiAxMDApIHsKKwkJaWYgKGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIGRteC0+Y3JjX2NoZWNrX3RpbWUpIDw9IDEwMDApIHsKKwkJCXN0cnVjdCBhbWxfZHZiICpkdmIgPSAoc3RydWN0IGFtbF9kdmIgKilkbXgtPmRlbXV4LnByaXY7CisKKwkJCXByX2Vycm9yKCJUb28gbWFueSBjcmMgZmFpbCAoJWQgY3JjIGZhaWwgaW4gJWQgbXMpIVxuIiwKKwkJCQlkbXgtPmNyY19jaGVja19jb3VudCwKKwkJCQlqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBkbXgtPmNyY19jaGVja190aW1lKQorCQkJKTsKKwkJCWRteF9yZXNldF9kbXhfaHdfZXhfdW5sb2NrKGR2YiwgZG14LCAwKTsKKwkJfQorCQlkbXgtPmNyY19jaGVja190aW1lID0gMDsKKwl9CisKKwlkbXgtPmNyY19jaGVja19jb3VudCsrOworfQorc3RhdGljIGludCBzZWN0aW9uX2NyYyhzdHJ1Y3QgYW1sX2RteCAqZG14LCBzdHJ1Y3QgYW1sX2ZpbHRlciAqZiwgdTggKnApCit7CisJaW50IHNlY19sZW4gPSAoKChwWzFdICYgMHhGKSA8PCA4KSB8IHBbMl0pICsgMzsKKwlzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQgPSBkbXgtPmNoYW5uZWxbZi0+Y2hhbl9pZF0uZmVlZDsKKworCWlmIChmZWVkLT5mZWVkLnNlYy5jaGVja19jcmMpIHsKKwkJc3RydWN0IGR2Yl9kZW11eCAqZGVtdXggPSBmZWVkLT5kZW11eDsKKwkJc3RydWN0IGRteF9zZWN0aW9uX2ZlZWQgKnNlYyA9ICZmZWVkLT5mZWVkLnNlYzsKKwkJaW50IHNlY3Rpb25fc3ludGF4X2luZGljYXRvcjsKKworCQlzZWN0aW9uX3N5bnRheF9pbmRpY2F0b3IgPSAoKHBbMV0gJiAweDgwKSAhPSAwKTsKKwkJc2VjLT5zZWNsZW4gPSBzZWNfbGVuOworCQlzZWMtPmNyY192YWwgPSB+MDsKKwkJaWYgKGRlbXV4LT5jaGVja19jcmMzMihmZWVkLCBwLCBzZWNfbGVuKSkgeworCQkJcHJfZXJyb3IoInNlY3Rpb24gQ1JDIGNoZWNrIGZhaWxlZCEgcGlkWyVkXVxuIiwgZmVlZC0+cGlkKTsKKworI2lmIDAKK3sKKwlpbnQgaTsKKworCXByX2Vycm9yKCJzZWM6WyUjbHg6JSNseDolI2x4LSUjbHg6JSNseDolI2x4LSUjbHg6JSNseDolI2x4XVxuIiwKKwlkbXgtPnNlY19jbnRbMF0sIGRteC0+c2VjX2NudF9tYXRjaFswXSwgZG14LT5zZWNfY250X2NyY19mYWlsWzBdLAorCWRteC0+c2VjX2NudFsxXSwgZG14LT5zZWNfY250X21hdGNoWzFdLCBkbXgtPnNlY19jbnRfY3JjX2ZhaWxbMV0sCisJZG14LT5zZWNfY250WzJdLCBkbXgtPnNlY19jbnRfbWF0Y2hbMl0sIGRteC0+c2VjX2NudF9jcmNfZmFpbFsyXSk7CisJCXByX2Vycm9yKCJiYWQgc2VjWyVkXTpcbiIsIHNlY19sZW4pOworCQkvKgorCQkgKglpZiAoc2VjX2xlbiA+IDI1NikKKwkJICoJCXNlY19sZW4gPSAyNTY7CisJCSAqCWZvciAoaSA9IDA7IGkgPCBzZWNfbGVuOyBpKyspIHsKKwkJICoJCXByX2VycigiJTAyeCAiLCBwW2ldKTsKKwkJICoJCWlmICghKChpICsgMSkgJSAxNikpCisJCSAqCQkJcHJfZXJyKCJcbiIpOworCQkgKgl9CisJCSAqLworfQorI2VuZGlmCisJCQl0cmlnZ2VyX2NyY19tb25pdG9yKGRteCk7CisJCQlyZXR1cm4gMDsKKwkJfQorI2lmIDAKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IHNlY19sZW47IGkrKykgeworCQkJcHJfZGJnKCIlMDJ4ICIsIHBbaV0pOworCQkJaWYgKCEoKGkgKyAxKSAlIDE2KSkKKwkJCQlwcl9kYmcoIlxuIik7CisJCX0KKwkJcHJfZGJnKCJcbnNlY3Rpb24gZGF0YVxuIik7CisjZW5kaWYKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgc2VjdGlvbl9ub3RpZnkoc3RydWN0IGFtbF9kbXggKmRteCwgc3RydWN0IGFtbF9maWx0ZXIgKmYsIHU4ICpwKQoreworCWludCBzZWNfbGVuID0gKCgocFsxXSAmIDB4RikgPDwgOCkgfCBwWzJdKSArIDM7CisJc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkID0gZG14LT5jaGFubmVsW2YtPmNoYW5faWRdLmZlZWQ7CisKKwlpZiAoZmVlZCAmJiBmZWVkLT5jYi5zZWMpCisJCWZlZWQtPmNiLnNlYyhwLCBzZWNfbGVuLCBOVUxMLCAwLCBmLT5maWx0ZXIsMCk7Cit9CisKK3N0YXRpYyB2b2lkIGhhcmR3YXJlX21hdGNoX3NlY3Rpb24oc3RydWN0IGFtbF9kbXggKmRteCwKKwkJCQkJCXUxNiBzZWNfbnVtLCB1MTYgYnVmX251bSkKK3sKKwl1OCAqcCA9ICh1OCAqKSBkbXgtPnNlY19idWZbYnVmX251bV0uYWRkcjsKKwlzdHJ1Y3QgYW1sX2ZpbHRlciAqZjsKKwlpbnQgY2hpZCwgaTsKKwlpbnQgbmVlZF9jcmMgPSAxOworCisJaWYgKHNlY19udW0gPj0gRklMVEVSX0NPVU5UKSB7CisJCXByX2RiZygic2VjX251bSBpbnZhbGlkOiAlZFxuIiwgc2VjX251bSk7CisJCXJldHVybjsKKwl9CisKKwlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShkbXhfZ2V0X2RldihkbXgpLAorCQkJCWRteC0+c2VjX3BhZ2VzX21hcCArIChidWZfbnVtIDw8IDB4MGMpLAorCQkJCSgxIDw8IDB4MGMpLCBETUFfRlJPTV9ERVZJQ0UpOworCisJZiA9ICZkbXgtPmZpbHRlcltzZWNfbnVtXTsKKwljaGlkID0gZi0+Y2hhbl9pZDsKKworCWRteC0+c2VjX2NudFtTRUNfQ05UX0hXXSsrOworCisJZm9yIChpID0gMDsgaSA8IEZJTFRFUl9DT1VOVDsgaSsrKSB7CisJCWYgPSAmZG14LT5maWx0ZXJbaV07CisJCWlmIChmLT5jaGFuX2lkICE9IGNoaWQpCisJCQljb250aW51ZTsKKwkJaWYgKHNlY19maWx0ZXJfbWF0Y2goZG14LCBmLCBwKSkgeworCQkJaWYgKG5lZWRfY3JjKSB7CisJCQkJZG14LT5zZWNfY250X21hdGNoW1NFQ19DTlRfSFddKys7CisJCQkJaWYgKCFzZWN0aW9uX2NyYyhkbXgsIGYsIHApKSB7CisJCQkJCWRteC0+c2VjX2NudF9jcmNfZmFpbFtTRUNfQ05UX0hXXSsrOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCW5lZWRfY3JjID0gMDsKKwkJCX0KKwkJCXNlY3Rpb25fbm90aWZ5KGRteCwgZiwgcCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNvZnR3YXJlX21hdGNoX3NlY3Rpb24oc3RydWN0IGFtbF9kbXggKmRteCwgdTE2IGJ1Zl9udW0pCit7CisJdTggKnAgPSAodTggKikgZG14LT5zZWNfYnVmW2J1Zl9udW1dLmFkZHI7CisJc3RydWN0IGFtbF9maWx0ZXIgKmYsICpmbWF0Y2ggPSBOVUxMOworCWludCBpLCBmaWQgPSAtMTsKKworCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGRteF9nZXRfZGV2KGRteCksCisJCQkJZG14LT5zZWNfcGFnZXNfbWFwICsgKGJ1Zl9udW0gPDwgMHgwYyksCisJCQkJKDEgPDwgMHgwYyksIERNQV9GUk9NX0RFVklDRSk7CisKKwlkbXgtPnNlY19jbnRbU0VDX0NOVF9TV10rKzsKKworCWZvciAoaSA9IDA7IGkgPCBGSUxURVJfQ09VTlQ7IGkrKykgeworCQlmID0gJmRteC0+ZmlsdGVyW2ldOworCisJCWlmIChzZWNfZmlsdGVyX21hdGNoKGRteCwgZiwgcCkpIHsKKwkJCXByX2RiZygiW3NvZnR3YXJlIG1hdGNoXWZpbHRlciAlZCBtYXRjaCwgcGlkICVkXG4iLAorCQkJICAgICAgIGksIGRteC0+Y2hhbm5lbFtmLT5jaGFuX2lkXS5waWQpOworCQkJaWYgKCFmbWF0Y2gpIHsKKwkJCQlmbWF0Y2ggPSBmOworCQkJCWZpZCA9IGk7CisJCQl9IGVsc2UgeworCQkJCXByX2Vycm9yKCJbc3cgbWF0Y2hdTXVsaS1maWx0ZXIgbWF0Y2ggdGhpc1xuIgorCQkJCQkic2VjdGlvbiwgd2lsbCBza2lwIHRoaXMgc2VjdGlvblxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQorCisJaWYgKGZtYXRjaCkgeworCQlwcl9kYmcoIltzb2Z0d2FyZSBtYXRjaF1kaXNwYXRjaFxuIgorCQkJInNlY3Rpb24gdG8gZmlsdGVyICVkIHBpZCAlZFxuIiwKKwkJCWZpZCwgZG14LT5jaGFubmVsW2ZtYXRjaC0+Y2hhbl9pZF0ucGlkKTsKKwkJZG14LT5zZWNfY250X21hdGNoW1NFQ19DTlRfU1ddKys7CisJCWlmIChzZWN0aW9uX2NyYyhkbXgsIGZtYXRjaCwgcCkpCisJCQlzZWN0aW9uX25vdGlmeShkbXgsIGZtYXRjaCwgcCk7CisJCWVsc2UKKwkJCWRteC0+c2VjX2NudF9jcmNfZmFpbFtTRUNfQ05UX1NXXSsrOworCX0gZWxzZSB7CisJCXByX2RiZygiW3NvZnR3YXJlIG1hdGNoXXRoaXMgc2VjdGlvbiBkbyBub3RcbiIKKwkJCSJtYXRjaCBhbnkgZmlsdGVyISEhXG4iKTsKKwl9Cit9CisKKworc3RhdGljIGludCBfcmJ1Zl93cml0ZShzdHJ1Y3QgZHZiX3JpbmdidWZmZXIgKmJ1ZiwgY29uc3QgdTggKnNyYywgc2l6ZV90IGxlbikKK3sKKwlzc2l6ZV90IGZyZWU7CisKKwlpZiAoIWxlbikKKwkJcmV0dXJuIDA7CisJaWYgKCFidWYtPmRhdGEpCisJCXJldHVybiAwOworCisJZnJlZSA9IGR2Yl9yaW5nYnVmZmVyX2ZyZWUoYnVmKTsKKwlpZiAobGVuID4gZnJlZSkgeworCQlwcl9lcnJvcigic2Y6IGJ1ZmZlciBvdmVyZmxvd1xuIik7CisJCXJldHVybiAtRU9WRVJGTE9XOworCX0KKworCXJldHVybiBkdmJfcmluZ2J1ZmZlcl93cml0ZShidWYsIHNyYywgbGVuKTsKK30KKworc3RhdGljIGludCBfcmJ1Zl9maWx0ZXJfcGt0cyhzdHJ1Y3QgZHZiX3JpbmdidWZmZXIgKnJiLAorCQkJdTggKndyYXBidWYsCisJCQl2b2lkICgqc3dmaWx0ZXJfcGFja2V0cykoc3RydWN0IGR2Yl9kZW11eCAqZGVtdXgsCisJCQkJCQljb25zdCB1OCAqYnVmLAorCQkJCQkJc2l6ZV90IGNvdW50KSwKKwkJCXN0cnVjdCBkdmJfZGVtdXggKmRlbXV4KQoreworCXNzaXplX3QgbGVuMSA9IDA7CisJc3NpemVfdCBsZW4yID0gMDsKKwlzaXplX3Qgb2ZmOworCXNpemVfdCBjb3VudDsKKwlzaXplX3Qgc2l6ZTsKKworCWlmIChkZWJ1Z19pcnEgJiAweDQpCisJCWR1bXAoJnJiLT5kYXRhW3JiLT5wcmVhZF0sIChkZWJ1Z19pcnEgJiAweEZGRjAwKSA+PiA4KTsKKworCS8qCisJICogICByYnw9PT09LS0tLS0tLS09PT1bMHg0N109PT09fAorCSAqICAgXiAgICAgICAgICAgICBeCisJICogICB3ciAgICAgICAgICAgIHJkCisJICovCisKKwlsZW4xID0gcmItPnB3cml0ZSAtIHJiLT5wcmVhZDsKKwlpZiAobGVuMSA8IDApIHsKKwkJbGVuMSA9IHJiLT5zaXplIC0gcmItPnByZWFkOworCQlsZW4yID0gcmItPnB3cml0ZTsKKwl9CisKKwlmb3IgKG9mZiA9IDA7IG9mZiA8IGxlbjE7IG9mZisrKSB7CisJCWlmIChyYi0+ZGF0YVtyYi0+cHJlYWQgKyBvZmZdID09IDB4NDcpCisJCQlicmVhazsKKwl9CisKKwlpZiAob2ZmKQorCQlwcl9kYmdfaXJxX3NmKCJvZmYgLT58JXpkXG4iLCBvZmYpOworCisJbGVuMSAtPSBvZmY7CisJcmItPnByZWFkID0gKHJiLT5wcmVhZCArIG9mZikgJSByYi0+c2l6ZTsKKworCWNvdW50ID0gbGVuMSAvIDE4ODsKKwlpZiAoY291bnQpIHsKKwkJcHJfZGJnX2lycV9zZigicGt0ID4+IDFbJXpkPC0+JXpkXVxuIiwgcmItPnByZWFkLCByYi0+cHdyaXRlKTsKKwkJc3dmaWx0ZXJfcGFja2V0cyhkZW11eCwgcmItPmRhdGEgKyByYi0+cHJlYWQsIGNvdW50KTsKKworCQlzaXplID0gY291bnQgKiAxODg7CisJCWxlbjEgLT0gc2l6ZTsKKwkJcmItPnByZWFkICs9IHNpemU7CisJfQorCisJaWYgKGxlbjIgJiYgbGVuMSAmJiAoKGxlbjEgKyBsZW4yKSA+IDE4OCkpIHsKKwkJcHJfZGJnX2lycV9zZigicGt0ID4+IDJbJXpkPC0+JXpkXVxuIiwgcmItPnByZWFkLCByYi0+cHdyaXRlKTsKKwkJc2l6ZSA9IDE4OCAtIGxlbjE7CisJCW1lbWNweSh3cmFwYnVmLCByYi0+ZGF0YSArIHJiLT5wcmVhZCwgbGVuMSk7CisJCW1lbWNweSh3cmFwYnVmICsgbGVuMSwgcmItPmRhdGEsIHNpemUpOworCQlzd2ZpbHRlcl9wYWNrZXRzKGRlbXV4LCB3cmFwYnVmLCAxKTsKKwkJcmItPnByZWFkID0gc2l6ZTsKKwkJbGVuMiAtPSBzaXplOworCX0KKworCWlmIChsZW4yKSB7CisJCXByX2RiZ19pcnFfc2YoInBrdCA+PiAzWyV6ZDwtPiV6ZF1cbiIsIHJiLT5wcmVhZCwgcmItPnB3cml0ZSk7CisJCWNvdW50ID0gbGVuMiAvIDE4ODsKKwkJaWYgKGNvdW50KSB7CisJCQlzd2ZpbHRlcl9wYWNrZXRzKGRlbXV4LCByYi0+ZGF0YSArIHJiLT5wcmVhZCwgY291bnQpOworCQkJcmItPnByZWFkICs9IGNvdW50ICogMTg4OworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbWFsbHNlY3Rpb25fbWF0Y2hfc2VjdGlvbihzdHJ1Y3QgYW1sX2RteCAqZG14LCB1OCAqcCwgdTE2IHNlY19udW0pCit7CisJc3RydWN0IGFtbF9maWx0ZXIgKmY7CisJaW50IGNoaWQsIGk7CisJaW50IG5lZWRfY3JjID0gMTsKKworCWlmIChzZWNfbnVtID49IEZJTFRFUl9DT1VOVCkgeworCQlwcl9kYmcoInNlY19udW0gaW52YWxpZDogJWRcbiIsIHNlY19udW0pOworCQlyZXR1cm47CisJfQorCisJZiA9ICZkbXgtPmZpbHRlcltzZWNfbnVtXTsKKwljaGlkID0gZi0+Y2hhbl9pZDsKKworCWRteC0+c2VjX2NudFtTRUNfQ05UX1NTXSsrOworCisJZm9yIChpID0gMDsgaSA8IEZJTFRFUl9DT1VOVDsgaSsrKSB7CisJCWYgPSAmZG14LT5maWx0ZXJbaV07CisJCWlmIChmLT5jaGFuX2lkICE9IGNoaWQpCisJCQljb250aW51ZTsKKwkJaWYgKHNlY19maWx0ZXJfbWF0Y2goZG14LCBmLCBwKSkgeworCQkJaWYgKG5lZWRfY3JjKSB7CisJCQkJZG14LT5zZWNfY250X21hdGNoW1NFQ19DTlRfU1NdKys7CisJCQkJaWYgKCFzZWN0aW9uX2NyYyhkbXgsIGYsIHApKSB7CisJCQkJCWRteC0+c2VjX2NudF9jcmNfZmFpbFtTRUNfQ05UX1NTXSsrOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCW5lZWRfY3JjID0gMDsKKwkJCX0KKwkJCXNlY3Rpb25fbm90aWZ5KGRteCwgZiwgcCk7CisJCX0KKwl9CisKK30KK3N0YXRpYyB2b2lkIHByb2Nlc3Nfc21hbGxzZWN0aW9uKHN0cnVjdCBhbWxfZG14ICpkbXgpCit7CisKKwl1MzIgdiwgd3IsIHJkOworCXUzMiBkYXRhMzI7CisJc3RydWN0IGFtbF9zbWFsbHNlYyAqc3MgPSAmZG14LT5zbWFsbHNlYzsKKworCXYgPSBETVhfUkVBRF9SRUcoZG14LT5pZCwgREVNVVhfU01BTExfU0VDX0NUTCk7CisJd3IgPSAodiA+PiA4KSAmIDB4ZmY7CisJcmQgPSAodiA+PiAxNikgJiAweGZmOworCisJaWYgKHJkICE9IHdyKSB7CisJCWludCBuMSA9IHdyIC0gcmQsCisJCSAgICBuMiA9IDAsCisJCSAgICBtYXggPSAoc3MtPmJ1ZnNpemU+PjgpOworCQlpbnQgaTsKKwkJdTggKnA7CisJCWludCBzZWNfbGVuOworCisJCXByX2RiZ19pcnFfc3MoInNlY2J1ZlszMV0gY3RybDoweCV4XG4iLCB2KTsKKworCQlpZiAobjEgPCAwKSB7CisJCQluMSA9IG1heCAtIHJkOworCQkJbjIgPSB3cjsKKwkJfQorCQlpZiAobjEpIHsKKwkJCXByX2RiZ19pcnFfc3MoIm4xOiVkXG4iLCBuMSk7CisJCQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShkbXhfZ2V0X2RldihkbXgpLAorCQkJCQkJc3MtPmJ1Zl9tYXArKHJkPDw4KSwKKwkJCQkJCW4xPDw4LAorCQkJCQkJRE1BX0ZST01fREVWSUNFKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBuMTsgaSsrKSB7CisJCQkJcCA9ICh1OCAqKXNzLT5idWYrKChyZCtpKTw8OCk7CisJCQkJc2VjX2xlbiA9ICgoKHBbMV0gJiAweEYpIDw8IDgpIHwgcFsyXSkgKyAzOworCQkJCXNtYWxsc2VjdGlvbl9tYXRjaF9zZWN0aW9uKGRteCwgcCwKKwkJCQkJCQkqKHArc2VjX2xlbisxKSk7CisJCQl9CisJCX0KKwkJaWYgKG4yKSB7CisJCQlwcl9kYmdfaXJxX3NzKCJuMjolZFxuIiwgbjIpOworCQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZG14X2dldF9kZXYoZG14KSwKKwkJCQkJCXNzLT5idWZfbWFwLAorCQkJCQkJbjI8PDgsCisJCQkJCQlETUFfRlJPTV9ERVZJQ0UpOworCQkJZm9yIChpID0gMDsgaSA8IG4yOyBpKyspIHsKKwkJCQlwID0gKHU4ICopc3MtPmJ1ZisoaTw8OCk7CisJCQkJc2VjX2xlbiA9ICgoKHBbMV0gJiAweEYpIDw8IDgpIHwgcFsyXSkgKyAzOworCQkJCXNtYWxsc2VjdGlvbl9tYXRjaF9zZWN0aW9uKGRteCwgcCwKKwkJCQkJCQkqKHArc2VjX2xlbisxKSk7CisJCQl9CisJCX0KKworCQlyZCA9IHdyOworCQlkYXRhMzIgPSAoRE1YX1JFQURfUkVHKGRteC0+aWQsCURFTVVYX1NNQUxMX1NFQ19DVEwpCisJCQkJJiAweGZmMDBmZmZmKQorCQkJCXwgKHJkIDw8IDE2KTsKKwkJRE1YX1dSSVRFX1JFRyhkbXgtPmlkLCBERU1VWF9TTUFMTF9TRUNfQ1RMLCBkYXRhMzIpOworCX0KK30KKworCitzdGF0aWMgdm9pZCBwcm9jZXNzX3NlY3Rpb24oc3RydWN0IGFtbF9kbXggKmRteCkKK3sKKwl1MzIgcmVhZHksIGksIHNlY19idXN5OworCXUxNiBzZWNfbnVtOworCisJLypwcl9kYmcoInNlY3Rpb25cbiIpOyAqLworCXJlYWR5ID0gRE1YX1JFQURfUkVHKGRteC0+aWQsIFNFQ19CVUZGX1JFQURZKTsKKwlpZiAocmVhZHkpIHsKKyNpZmRlZiBVU0VfQUhCX01PREUKKwkJLyogICAgICBXUklURV9JU0FfUkVHKEFIQl9CUklER0VfQ1RSTDEsCisJCSAqICAgUkVBRF9JU0FfUkVHIChBSEJfQlJJREdFX0NUUkwxKSB8ICgxIDw8IDMxKSk7CisJCSAqLworCQkvKiAgICAgIFdSSVRFX0lTQV9SRUcoQUhCX0JSSURHRV9DVFJMMSwKKwkJICogICBSRUFEX0lTQV9SRUcgKEFIQl9CUklER0VfQ1RSTDEpICYgKH4gKDEgPDwgMzEpKSk7CisJCSAqLworI2VuZGlmCisKKwkJaWYgKChyZWFkeSAmICgxPDwzMSkpICYmIGRteC0+c21hbGxzZWMuZW5hYmxlKSB7CisJCQl1MzIgdiwgd3IsIHJkOworCisJCQl2ID0gRE1YX1JFQURfUkVHKGRteC0+aWQsIERFTVVYX1NNQUxMX1NFQ19DVEwpOworCQkJd3IgPSAodiA+PiA4KSAmIDB4ZmY7CisJCQlyZCA9ICh2ID4+IDE2KSAmIDB4ZmY7CisJCQlpZiAoKHdyIDwgcmQpICYmICg1ID4gKHJkIC0gd3IpKSkKKwkJCQlwcl9lcnJvcigid2FybmluZzogc21hbGwgc3MgYnVmIFt3JWRyJWRdXG4iLAorCQkJCQl3ciwgcmQpOworCQkJcHJfZGJnX2lycV9zcygic3M+JXhcbiIsCisJCQkJRE1YX1JFQURfUkVHKGRteC0+aWQsIERFTVVYX1NNQUxMX1NFQ19DVEwpKTsKKwkJCXByb2Nlc3Nfc21hbGxzZWN0aW9uKGRteCk7CisJCQkvKnRhc2tsZXRfaGlfc2NoZWR1bGUoJmRteC0+ZG14X3Rhc2tsZXQpOyovCisJCQkvKnRhc2tsZXRfc2NoZWR1bGUoJmRteC0+ZG14X3Rhc2tsZXQpOyovCisJCQlETVhfV1JJVEVfUkVHKGRteC0+aWQsIFNFQ19CVUZGX1JFQURZLCAoMTw8MzEpKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBTRUNfQlVGX0NPVU5UOyBpKyspIHsKKworCQkJaWYgKCEocmVhZHkgJiAoMSA8PCBpKSkpCisJCQkJY29udGludWU7CisKKwkJCS8qIGdldCBzZWN0aW9uIGJ1c3kgKi8KKwkJCXNlY19idXN5ID0gRE1YX1JFQURfUkVHKGRteC0+aWQsIFNFQ19CVUZGX0JVU1kpOworCQkJLyogZ2V0IGZpbHRlciBudW1iZXIgKi8KKwkJCURNWF9XUklURV9SRUcoZG14LT5pZCwgU0VDX0JVRkZfTlVNQkVSLCBpKTsKKwkJCXNlY19udW0gPSAoRE1YX1JFQURfUkVHKGRteC0+aWQsIFNFQ19CVUZGX05VTUJFUikgPj4gOCk7CisKKwkJCS8qCisJCQkgKiBzZWNfYnVmX3dhdGNoZG9nX2NvdW50IGRpc3BhdGNoOgorCQkJICogYnl0ZTAgLS0gYWx3YXlzIGJ1c3k9MCAncyB3YXRjaGRvZyBjb3VudAorCQkJICogYnl0ZTEgLS0gYWx3YXlzIGJ1c3k9MSAmIGZpbHRlcl9udW09MzEgJ3MKKwkJCSAqIHdhdGNoZG9nIGNvdW50CisJCQkgKi8KKworCQkJLyogc2VjX2J1c3kgaXMgbm90IHNldCwgY2hlY2sgYnVzeT0wIHdhdGNoZG9nIGNvdW50ICovCisJCQlpZiAoIShzZWNfYnVzeSAmICgxIDw8IGkpKSkgeworCQkJCS8qIGNsZWFyIG90aGVyIHdkIGNvdW50CW9mIHRoaXMgYnVmZmVyICovCisJCQkJZG14LT5zZWNfYnVmX3dhdGNoZG9nX2NvdW50W2ldICY9IDB4MDAwMDAwZmY7CisJCQkJZG14LT5zZWNfYnVmX3dhdGNoZG9nX2NvdW50W2ldICs9IDB4MTsKKwkJCQlwcl9kYmcoImJpdCVkIHJlYWR5PTEsIGJ1c3k9MCxcbiIKKwkJCQkJInNlY19udW09JWQgZm9yICVkIHRpbWVzXG4iLAorCQkJCQlpLCBzZWNfbnVtLAorCQkJCQlkbXgtPnNlY19idWZfd2F0Y2hkb2dfY291bnRbaV0pOworCQkJCWlmIChkbXgtPnNlY19idWZfd2F0Y2hkb2dfY291bnRbaV0gPj0gNSkgeworCQkJCQlwcl9kYmcoImJ1c3k9MCByZWFjaCB0aGUgbWF4IGNvdW50LFxuIgorCQkJCQkJInRyeSBzb2Z0d2FyZSBtYXRjaC5cbiIpOworCQkJCQlzb2Z0d2FyZV9tYXRjaF9zZWN0aW9uKGRteCwgaSk7CisJCQkJCWRteC0+c2VjX2J1Zl93YXRjaGRvZ19jb3VudFtpXSA9IDA7CisJCQkJCURNWF9XUklURV9SRUcoZG14LT5pZCwgU0VDX0JVRkZfUkVBRFksCisJCQkJCQkJKDEgPDwgaSkpOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogZmlsdGVyX251bSA9PSAzMSAmJiBidXN5ID09IDEsY2hlY2sgd2F0Y2hkb2cgY291bnQgKi8KKwkJCWlmIChzZWNfbnVtID49IEZJTFRFUl9DT1VOVCkgeworCQkJCS8qIGNsZWFyIG90aGVyIHdkIGNvdW50CW9mIHRoaXMgYnVmZmVyICovCisJCQkJZG14LT5zZWNfYnVmX3dhdGNoZG9nX2NvdW50W2ldICY9IDB4MDAwMGZmMDA7CisJCQkJZG14LT5zZWNfYnVmX3dhdGNoZG9nX2NvdW50W2ldICs9IDB4MTAwOworCQkJCXByX2RiZygiYml0JWQgcmVhZHk9MSxidXN5PTEsXG4iCisJCQkJCSJzZWNfbnVtPSVkIGZvciAlZCB0aW1lc1xuIiwKKwkJCQkJaSwgc2VjX251bSwKKwkJCQkJZG14LT5zZWNfYnVmX3dhdGNoZG9nX2NvdW50W2ldID4+IDgpOworCQkJCWlmIChkbXgtPnNlY19idWZfd2F0Y2hkb2dfY291bnRbaV0gPj0gMHg1MDApIHsKKwkJCQkJcHJfZGJnKCJidXN5PTEmZmlsdGVyX251bT0zMVxuIgorCQkJCQkiIHJlYWNoIHRoZSBtYXggY291bnQsIGNsZWFyXG4iCisJCQkJCSIgdGhlIGJ1ZiByZWFkeSAmIGJ1c3khXG4iKTsKKwkJCQkJc29mdHdhcmVfbWF0Y2hfc2VjdGlvbihkbXgsIGkpOworCQkJCQlkbXgtPnNlY19idWZfd2F0Y2hkb2dfY291bnRbaV0gPSAwOworCQkJCQlETVhfV1JJVEVfUkVHKGRteC0+aWQsCisJCQkJCQkgICAgICBTRUNfQlVGRl9SRUFEWSwKKwkJCQkJCSAgICAgICgxIDw8IGkpKTsKKwkJCQkJRE1YX1dSSVRFX1JFRyhkbXgtPmlkLAorCQkJCQkJICAgICAgU0VDX0JVRkZfQlVTWSwKKwkJCQkJCSAgICAgICgxIDw8IGkpKTsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIG5vdywgcmVhZHkgJiBidXN5IGFyZSBib3RoIHNldCBhbmQKKwkJCSAqIGZpbHRlciBudW1iZXIgaXMgdmFsaWQKKwkJCSAqLworCQkJaWYgKGRteC0+c2VjX2J1Zl93YXRjaGRvZ19jb3VudFtpXSAhPSAwKQorCQkJCWRteC0+c2VjX2J1Zl93YXRjaGRvZ19jb3VudFtpXSA9IDA7CisKKwkJCS8qIHByb2Nlc3MgdGhpcyBzZWN0aW9uICovCisJCQloYXJkd2FyZV9tYXRjaF9zZWN0aW9uKGRteCwgc2VjX251bSwgaSk7CisKKwkJCS8qIGNsZWFyIHRoZSByZWFkeSAmIGJ1c3kgYml0ICovCisJCQlETVhfV1JJVEVfUkVHKGRteC0+aWQsIFNFQ19CVUZGX1JFQURZLCAoMSA8PCBpKSk7CisJCQlETVhfV1JJVEVfUkVHKGRteC0+aWQsIFNFQ19CVUZGX0JVU1ksICgxIDw8IGkpKTsKKwkJfQorCX0KK30KKworI2lmZGVmIE5PX1NVQgorc3RhdGljIHZvaWQgcHJvY2Vzc19zdWIoc3RydWN0IGFtbF9kbXggKmRteCkKK3sKKworCXUzMiByZF9wdHIgPSAwOworCisJdTMyIHdyX3B0ciA9IFJFQURfTVBFR19SRUcoUEFSU0VSX1NVQl9XUCk7CisJdTMyIHN0YXJ0X3B0ciA9IFJFQURfTVBFR19SRUcoUEFSU0VSX1NVQl9TVEFSVF9QVFIpOworCXUzMiBlbmRfcHRyID0gUkVBRF9NUEVHX1JFRyhQQVJTRVJfU1VCX0VORF9QVFIpOworCisJdTMyIGJ1ZmZlcjEgPSAwLCBidWZmZXIyID0gMDsKKwl1OCAqYnVmZmVyMV92aXJ0ID0gMCwgKmJ1ZmZlcjJfdmlydCA9IDA7CisJdTMyIGxlbjEgPSAwLCBsZW4yID0gMDsKKworCWlmICghZG14LT5zdWJfYnVmX2Jhc2VfdmlydCkKKwkJcmV0dXJuOworCisJcmRfcHRyID0gUkVBRF9NUEVHX1JFRyhQQVJTRVJfU1VCX1JQKTsKKwlpZiAoIXJkX3B0cikKKwkJcmV0dXJuOworCWlmIChyZF9wdHIgPiB3cl9wdHIpIHsKKwkJbGVuMSA9IGVuZF9wdHIgLSByZF9wdHIgKyA4OworCQlidWZmZXIxID0gcmRfcHRyOworCisJCWxlbjIgPSB3cl9wdHIgLSBzdGFydF9wdHI7CisJCWJ1ZmZlcjIgPSBzdGFydF9wdHI7CisKKwkJcmRfcHRyID0gc3RhcnRfcHRyICsgbGVuMjsKKwl9IGVsc2UgaWYgKHJkX3B0ciA8IHdyX3B0cikgeworCQlsZW4xID0gd3JfcHRyIC0gcmRfcHRyOworCQlidWZmZXIxID0gcmRfcHRyOworCQlyZF9wdHIgKz0gbGVuMTsKKwkJbGVuMiA9IDA7CisJfSBlbHNlIGlmIChyZF9wdHIgPT0gd3JfcHRyKSB7CisJCXByX2RiZygic3ViIG5vIGRhdGFcbiIpOworCX0KKworCWlmIChidWZmZXIxICYmIGxlbjEpCisjaWZkZWYgU1VCX0JVRl9ETVgKKwkJYnVmZmVyMV92aXJ0ID0gKHZvaWQgKilkbXgtPnN1Yl9wYWdlcyArIChidWZmZXIxIC0gc3RhcnRfcHRyKTsKKyNlbHNlCisJCWJ1ZmZlcjFfdmlydCA9ICh2b2lkICopZG14LT5zdWJfYnVmX2Jhc2VfdmlydCArIChidWZmZXIxIC0gc3RhcnRfcHRyKTsKKyNlbmRpZgorCisJaWYgKGJ1ZmZlcjIgJiYgbGVuMikKKyNpZmRlZiBTVUJfQlVGX0RNWAorCQlidWZmZXIyX3ZpcnQgPSAodm9pZCAqKWRteC0+c3ViX3BhZ2VzICsgKGJ1ZmZlcjIgLSBzdGFydF9wdHIpOworI2Vsc2UKKwkJYnVmZmVyMl92aXJ0ID0gKHZvaWQgKilkbXgtPnN1Yl9idWZfYmFzZV92aXJ0ICsgKGJ1ZmZlcjIgLSBzdGFydF9wdHIpOworI2VuZGlmCisKKwlwcl9kYmdfaXJxX3N1Yigic3ViOiByZF9wdHI6JXggYnVmMToleCBsZW4xOiVkIGJ1ZjI6JXggbGVuMjolZFxuIiwKKwkJcmRfcHRyLCBidWZmZXIxLCBsZW4xLCBidWZmZXIyLCBsZW4yKTsKKwlwcl9kYmdfaXJxX3N1Yigic3ViOiBidWYxX3ZpcnQ6JXAgYnVmMl92aXJ0OiVwXG4iLAorCQlidWZmZXIxX3ZpcnQsIGJ1ZmZlcjJfdmlydCk7CisKKwlpZiAobGVuMSkKKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZG14X2dldF9kZXYoZG14KSwKKwkJCQkJKGRtYV9hZGRyX3QpIGJ1ZmZlcjEsIGxlbjEsCisJCQkJCURNQV9GUk9NX0RFVklDRSk7CisJaWYgKGxlbjIpCisJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGRteF9nZXRfZGV2KGRteCksCisJCQkJCShkbWFfYWRkcl90KSBidWZmZXIyLCBsZW4yLAorCQkJCQlETUFfRlJPTV9ERVZJQ0UpOworCisJaWYgKGRteC0+Y2hhbm5lbFsyXS51c2VkKSB7CisJCWlmIChkbXgtPmNoYW5uZWxbMl0uZmVlZCAmJiBkbXgtPmNoYW5uZWxbMl0uZmVlZC0+Y2IudHMgJiYKKwkJCSgoYnVmZmVyMV92aXJ0ICE9IE5VTEwgJiYgbGVuMSAhPTAgKSB8fCAoYnVmZmVyMl92aXJ0ICE9IE5VTEwgJiYgbGVuMiAhPSAwKSkpCisJCXsKKwkJCWRteC0+Y2hhbm5lbFsyXS5mZWVkLT5jYi50cyhidWZmZXIxX3ZpcnQsIGxlbjEsCisJCQkJCQlidWZmZXIyX3ZpcnQsIGxlbjIsCisJCQkJCQkmZG14LT5jaGFubmVsWzJdLmZlZWQtPmZlZWQudHMsMCk7CisJCX0KKwl9CisJV1JJVEVfTVBFR19SRUcoUEFSU0VSX1NVQl9SUCwgcmRfcHRyKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBwcm9jZXNzX3BlcyhzdHJ1Y3QgYW1sX2RteCAqZG14KQoreworCWxvbmcgb2ZmLCBvZmZfcHJlID0gcGVzX29mZl9wcmVbZG14LT5pZF07CisJdTggKmJ1ZmZlcjEgPSAwLCAqYnVmZmVyMiA9IDA7CisJdTggKmJ1ZmZlcjFfcGh5cyA9IDAsICpidWZmZXIyX3BoeXMgPSAwOworCXUzMiBsZW4xID0gMCwgbGVuMiA9IDA7CisJaW50IGkgPSAxOworCisJb2ZmID0gKERNWF9SRUFEX1JFRyhkbXgtPmlkLCBPVEhFUl9XUl9QVFIpIDw8IDMpOworCisJcHJfZGJnX2lycV9wZXMoIlslZF1XUjoweCV4IFBFUyBXUjoweCV4XG4iLCBkbXgtPmlkLAorCQkJRE1YX1JFQURfUkVHKGRteC0+aWQsIE9USEVSX1dSX1BUUiksCisJCQlETVhfUkVBRF9SRUcoZG14LT5pZCwgT0JfUEVTX1dSX1BUUikpOworCWJ1ZmZlcjEgPSAodTggKikoZG14LT5wZXNfcGFnZXMgKyBvZmZfcHJlKTsKKwlwcl9kYmdfaXJxX3BlcygiWyVkXVBFUyBXUlslMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMngiLAorCQlkbXgtPmlkLAorCQlidWZmZXIxWzBdLCBidWZmZXIxWzFdLCBidWZmZXIxWzJdLCBidWZmZXIxWzNdLAorCQlidWZmZXIxWzRdLCBidWZmZXIxWzVdLCBidWZmZXIxWzZdLCBidWZmZXIxWzddKTsKKwlwcl9kYmdfaXJxX3BlcygiICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeF1cbiIsCisJCQlidWZmZXIxWzhdLCBidWZmZXIxWzldLCBidWZmZXIxWzEwXSwgYnVmZmVyMVsxMV0sCisJCQlidWZmZXIxWzEyXSwgYnVmZmVyMVsxM10sIGJ1ZmZlcjFbMTRdLCBidWZmZXIxWzE1XSk7CisKKwlpZiAob2ZmID4gb2ZmX3ByZSkgeworCQlsZW4xID0gb2ZmLW9mZl9wcmU7CisJCWJ1ZmZlcjEgPSAodW5zaWduZWQgY2hhciAqKShkbXgtPnBlc19wYWdlcyArIG9mZl9wcmUpOworCX0gZWxzZSBpZiAob2ZmIDwgb2ZmX3ByZSkgeworCQlsZW4xID0gZG14LT5wZXNfYnVmX2xlbi1vZmZfcHJlOworCQlidWZmZXIxID0gKHVuc2lnbmVkIGNoYXIgKikoZG14LT5wZXNfcGFnZXMgKyBvZmZfcHJlKTsKKwkJbGVuMiA9IG9mZjsKKwkJYnVmZmVyMiA9ICh1bnNpZ25lZCBjaGFyICopZG14LT5wZXNfcGFnZXM7CisJfSBlbHNlIGlmIChvZmYgPT0gb2ZmX3ByZSkgeworCQlwcl9kYmcoInBlcyBubyBkYXRhXG4iKTsKKwl9CisJcGVzX29mZl9wcmVbZG14LT5pZF0gPSBvZmY7CisJaWYgKGxlbjEpIHsKKwkJYnVmZmVyMV9waHlzID0gKHVuc2lnbmVkIGNoYXIgKil2aXJ0X3RvX3BoeXMoYnVmZmVyMSk7CisJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGRteF9nZXRfZGV2KGRteCksCisJCQkoZG1hX2FkZHJfdClidWZmZXIxX3BoeXMsIGxlbjEsIERNQV9GUk9NX0RFVklDRSk7CisJfQorCWlmIChsZW4yKSB7CisJCWJ1ZmZlcjJfcGh5cyA9ICh1bnNpZ25lZCBjaGFyICopdmlydF90b19waHlzKGJ1ZmZlcjIpOworCQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShkbXhfZ2V0X2RldihkbXgpLAorCQkJKGRtYV9hZGRyX3QpYnVmZmVyMl9waHlzLCBsZW4yLCBETUFfRlJPTV9ERVZJQ0UpOworCX0KKwlpZiAobGVuMSB8fCBsZW4yKSB7CisJCXN0cnVjdCBhbWxfY2hhbm5lbCAqY2g7CisKKwkJZm9yIChpID0gMDsgaSA8IENIQU5ORUxfQ09VTlQ7IGkrKykgeworCQkJY2ggPSAmZG14LT5jaGFubmVsW2ldOworCQkJaWYgKGNoLT51c2VkICYmIGNoLT5mZWVkCisJCQkJJiYgKGNoLT5mZWVkLT50eXBlID09IERNWF9UWVBFX1RTKSkgeworCQkJCWlmIChjaC0+ZmVlZC0+dHNfdHlwZSAmIFRTX1BBWUxPQURfT05MWSkgeworCQkJCQljaC0+ZmVlZC0+Y2IudHMoYnVmZmVyMSwKKwkJCQkJCWxlbjEsIGJ1ZmZlcjIsIGxlbjIsCisJCQkJCQkmY2gtPmZlZWQtPmZlZWQudHMsMCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX29tX3JlYWQoc3RydWN0IGFtbF9kbXggKmRteCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBzaG9ydCBvbV9jbWRfc3RhdHVzX2RhdGFfMCA9IDA7CisJdW5zaWduZWQgc2hvcnQgb21fY21kX3N0YXR1c19kYXRhXzEgPSAwOworLyogICAgICB1bnNpZ25lZCBzaG9ydCBvbV9jbWRfc3RhdHVzX2RhdGFfMiA9IDA7Ki8KKwl1bnNpZ25lZCBzaG9ydCBvbV9jbWRfZGF0YV9vdXQgPSAwOworCisJb21fY21kX3N0YXR1c19kYXRhXzAgPSBETVhfUkVBRF9SRUcoZG14LT5pZCwgT01fQ01EX1NUQVRVUyk7CisJb21fY21kX3N0YXR1c19kYXRhXzEgPSBETVhfUkVBRF9SRUcoZG14LT5pZCwgT01fQ01EX0RBVEEpOworLyogICAgICBvbV9jbWRfc3RhdHVzX2RhdGFfMiA9IERNWF9SRUFEX1JFRyhkbXgtPmlkLCBPTV9DTURfREFUQTIpOyovCisKKwlpZiAob21fY21kX3N0YXR1c19kYXRhXzAgJiAxKSB7CisJCURNWF9XUklURV9SRUcoZG14LT5pZCwgT01fREFUQV9SRF9BRERSLAorCQkJKDEgPDwgMTUpIHwgKChvbV9jbWRfc3RhdHVzX2RhdGFfMSAmIDB4ZmYpIDw8IDIpKTsKKwkJZm9yIChpID0gMDsgaSA8ICgoKG9tX2NtZF9zdGF0dXNfZGF0YV8xID4+IDcpICYgMHgxZmMpID4+IDEpOworCQkgICAgIGkrKykgeworCQkJb21fY21kX2RhdGFfb3V0ID0gRE1YX1JFQURfUkVHKGRteC0+aWQsIE9NX0RBVEFfUkQpOworCQl9CisKKwkJb21fY21kX2RhdGFfb3V0ID0gRE1YX1JFQURfUkVHKGRteC0+aWQsIE9NX0RBVEFfUkRfQUREUik7CisJCURNWF9XUklURV9SRUcoZG14LT5pZCwgT01fREFUQV9SRF9BRERSLCAwKTsKKwkJRE1YX1dSSVRFX1JFRyhkbXgtPmlkLCBPTV9DTURfU1RBVFVTLCAxKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRteF9pcnFfYmhfaGFuZGxlcih1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYW1sX2RteCAqZG14ID0gKHN0cnVjdCBhbWxfZG14ICopYXJnOworI2lmIDAKKwl1MzIgc3RhdHVzOworCisJc3RhdHVzID0gRE1YX1JFQURfUkVHKGRteC0+aWQsIFNUQl9JTlRfU1RBVFVTKTsKKworCWlmIChzdGF0dXMpCisJCURNWF9XUklURV9SRUcoZG14LT5pZCwgU1RCX0lOVF9TVEFUVVMsIHN0YXR1cyk7CisjZW5kaWYKKwlwcm9jZXNzX3NtYWxsc2VjdGlvbihkbXgpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZG14X2lycV9oYW5kbGVyKGludCBpcnFfbnVtYmVyLCB2b2lkICpwYXJhKQoreworCXN0cnVjdCBhbWxfZG14ICpkbXggPSAoc3RydWN0IGFtbF9kbXggKilwYXJhOworCXN0cnVjdCBhbWxfZHZiICpkdmIgPSBhbWxfZ2V0X2R2Yl9kZXZpY2UoKTsKKwl1MzIgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHZiLT5zbG9jaywgZmxhZ3MpOworCXN0YXR1cyA9IERNWF9SRUFEX1JFRyhkbXgtPmlkLCBTVEJfSU5UX1NUQVRVUyk7CisJaWYgKCFzdGF0dXMpCisJCWdvdG8gaXJxX2hhbmRsZWQ7CisKKwlwcl9kYmdfaXJxKCJkZW11eCAlZCBpcnEgc3RhdHVzOiAweCUwOHhcbiIsIGRteC0+aWQsIHN0YXR1cyk7CisKKwlpZiAoc3RhdHVzICYgKDEgPDwgU0VDVElPTl9CVUZGRVJfUkVBRFkpKQorCQlwcm9jZXNzX3NlY3Rpb24oZG14KTsKKyNpZmRlZiBOT19TVUIKKwlpZiAoc3RhdHVzICYgKDEgPDwgU1VCX1BFU19SRUFEWSkpIHsKKwkJLypJZiB0aGUgc3VidGl0bGUgaXMgc2V0IGJ5IHRzZGVtdXgsCisJCSAqZG8gbm90IHBhcnNlciBpbiBkZW11eCBkcml2ZXIuCisJCSAqLworCQlpZiAoZG14LT5zdWJfY2hhbiA9PSAtMSkKKwkJCXByb2Nlc3Nfc3ViKGRteCk7CisJfQorI2VuZGlmCisJaWYgKHN0YXR1cyAmICgxIDw8IE9USEVSX1BFU19SRUFEWSkpCisJCXByb2Nlc3NfcGVzKGRteCk7CisJaWYgKHN0YXR1cyAmICgxIDw8IE9NX0NNRF9SRUFEX1BFTkRJTkcpKQorCQlwcm9jZXNzX29tX3JlYWQoZG14KTsKKwkvKgorCSAqaWYgKHN0YXR1cyAmICgxIDw8IERVUExJQ0FURURfUEFDS0VUKSkgeworCSAqfQorCSAqaWYgKHN0YXR1cyAmICgxIDw8IERJU19DT05USU5VSVRZX1BBQ0tFVCkpIHsKKwkgKn0KKwkgKmlmIChzdGF0dXMgJiAoMSA8PCBWSURFT19TUExJQ0lOR19QT0lOVCkpIHsKKwkgKn0KKwkgKmlmIChzdGF0dXMgJiAoMSA8PCBBVURJT19TUExJQ0lOR19QT0lOVCkpIHsKKwkgKn0KKwkgKi8KKwlpZiAoc3RhdHVzICYgKDEgPDwgVFNfRVJST1JfUElOKSkKKwkJcHJfZXJyb3IoIlRTX0VSUk9SX1BJTlxuIik7CisKKwlpZiAoc3RhdHVzICYgKDEgPDwgTkVXX1BEVFNfUkVBRFkpKSB7CisJCXUzMiBwZHRzX3N0YXR1cyA9IERNWF9SRUFEX1JFRyhkbXgtPmlkLCBTVEJfUFRTX0RUU19TVEFUVVMpOworCisJCWlmIChwZHRzX3N0YXR1cyAmICgxIDw8IFZJREVPX1BUU19SRUFEWSkpIHsKKwkJCXZpZGVvX3B0cyA9IERNWF9SRUFEX1JFRyhkbXgtPmlkLCBWSURFT19QVFNfREVNVVgpOworCQkJdmlkZW9fcHRzX2JpdDMyID0KKwkJCQkocGR0c19zdGF0dXMgJiAoMSA8PCBWSURFT19QVFNfQklUMzIpKSA/IDEgOiAwOworCQkJaWYgKCFmaXJzdF92aWRlb19wdHMKKwkJCSAgICB8fCAwID4gKGludCkodmlkZW9fcHRzIC0gZmlyc3RfdmlkZW9fcHRzKSkKKwkJCQlmaXJzdF92aWRlb19wdHMgPSB2aWRlb19wdHM7CisJCX0KKworCQlpZiAocGR0c19zdGF0dXMgJiAoMSA8PCBBVURJT19QVFNfUkVBRFkpKSB7CisJCQlhdWRpb19wdHMgPSBETVhfUkVBRF9SRUcoZG14LT5pZCwgQVVESU9fUFRTX0RFTVVYKTsKKwkJCWF1ZGlvX3B0c19iaXQzMiA9CisJCQkJKHBkdHNfc3RhdHVzICYgKDEgPDwgQVVESU9fUFRTX0JJVDMyKSkgPyAxIDogMDsKKwkJCWlmICghZmlyc3RfYXVkaW9fcHRzCisJCQkgICAgfHwgMCA+IChpbnQpKGF1ZGlvX3B0cyAtIGZpcnN0X2F1ZGlvX3B0cykpCisJCQkJZmlyc3RfYXVkaW9fcHRzID0gYXVkaW9fcHRzOworCQl9CisJfQorCisJaWYgKGRteC0+aXJxX2hhbmRsZXIpCisJCWRteC0+aXJxX2hhbmRsZXIoZG14LT5kbXhfaXJxLCAodm9pZCAqKShsb25nKWRteC0+aWQpOworCisJRE1YX1dSSVRFX1JFRyhkbXgtPmlkLCBTVEJfSU5UX1NUQVRVUywgc3RhdHVzKTsKKworCS8qdGFza2xldF9zY2hlZHVsZSgmZG14LT5kbXhfdGFza2xldCk7Ki8KKworCXsKKwkJaWYgKCFkbXgtPmludF9jaGVja190aW1lKSB7CisJCQlkbXgtPmludF9jaGVja190aW1lID0gamlmZmllczsKKwkJCWRteC0+aW50X2NoZWNrX2NvdW50ID0gMDsKKwkJfQorCisJCWlmIChqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBkbXgtPmludF9jaGVja190aW1lKSA+PSAxMDAKKwkJICAgIHx8IGRteC0+aW50X2NoZWNrX2NvdW50ID4gMTAwMCkgeworCQkJaWYgKGRteC0+aW50X2NoZWNrX2NvdW50ID4gMTAwMCkgeworCQkJCXN0cnVjdCBhbWxfZHZiICpkdmIgPQorCQkJCSAgICAoc3RydWN0IGFtbF9kdmIgKilkbXgtPmRlbXV4LnByaXY7CisJCQkJcHJfZXJyb3IoIlRvbyBtYW55IGlycSAoJWQgaXJxIGluICVkIG1zKSFcbiIsCisJCQkJCWRteC0+aW50X2NoZWNrX2NvdW50LAorCQkJCQlqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLQorCQkJCQkJICAgICAgZG14LT5pbnRfY2hlY2tfdGltZSkpOworCQkJCWlmIChkbXgtPmZlICYmICFkbXgtPmluX3R1bmUpCisJCQkJCURNWF9XUklURV9SRUcoZG14LT5pZCwgU1RCX0lOVF9NQVNLLCAwKTsKKwkJCQlkbXhfcmVzZXRfaHdfZXgoZHZiLCAwKTsKKwkJCX0KKwkJCWRteC0+aW50X2NoZWNrX3RpbWUgPSAwOworCQl9CisKKwkJZG14LT5pbnRfY2hlY2tfY291bnQrKzsKKworCQlpZiAoZG14LT5pbl90dW5lKSB7CisJCQlkbXgtPmVycm9yX2NoZWNrKys7CisJCQlpZiAoZG14LT5lcnJvcl9jaGVjayA+IDIwMCkKKwkJCQlETVhfV1JJVEVfUkVHKGRteC0+aWQsIFNUQl9JTlRfTUFTSywgMCk7CisJCX0KKwl9CisKK2lycV9oYW5kbGVkOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR2Yi0+c2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRteF9nZXRfb3JkZXIodW5zaWduZWQgbG9uZyBzaXplKQoreworCWludCBvcmRlcjsKKworCW9yZGVyID0gLTE7CisJZG8geworCQlzaXplID4+PSAxOworCQlvcmRlcisrOworCX0gd2hpbGUgKHNpemUpOworCisJcmV0dXJuIG9yZGVyOworfQorCitzdGF0aWMgaW5saW5lIGludCBkbXhfZ2V0X2FmaWZvX3NpemUoc3RydWN0IGFtbF9hc3luY2ZpZm8gKmFmaWZvKQoreworCXJldHVybiBhZmlmby0+c2VjdXJlX2VuYWJsZSAmJiBhZmlmby0+YmxrLmxlbiA/IGFmaWZvLT5ibGsubGVuIDogYXN5bmNmaWZvX2J1Zl9sZW47Cit9CisKK3N0YXRpYyB2b2lkIGR2cl9wcm9jZXNzX2NoYW5uZWwoc3RydWN0IGFtbF9hc3luY2ZpZm8gKmFmaWZvLAorCQkJCXN0cnVjdCBhbWxfY2hhbm5lbCAqY2hhbm5lbCwKKwkJCQl1MzIgdG90YWwsIHUzMiBzaXplLAorCQkJCXN0cnVjdCBhbWxfc3dmaWx0ZXIgKnNmKQoreworCWludCBjbnQ7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGFtbF9kdnJfYmxvY2sgYmxrOworCisJaWYgKGFmaWZvLT5idWZfcmVhZCA+IGFmaWZvLT5idWZfdG9nZ2xlKSB7CisJCWNudCA9IHRvdGFsIC0gYWZpZm8tPmJ1Zl9yZWFkOworCQlpZiAoIShhZmlmby0+c2VjdXJlX2VuYWJsZSAmJiBhZmlmby0+YmxrLmFkZHIpKSB7CisJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGFzeW5jZmlmb19nZXRfZGV2KGFmaWZvKSwKKwkJCQlhZmlmby0+cGFnZXNfbWFwK2FmaWZvLT5idWZfcmVhZCpzaXplLAorCQkJCWNudCpzaXplLAorCQkJCURNQV9GUk9NX0RFVklDRSk7CisJCWlmIChzZikKKwkJCXJldCA9IF9yYnVmX3dyaXRlKCZzZi0+cmJ1ZiwKKwkJCQkJKHU4ICopYWZpZm8tPnBhZ2VzK2FmaWZvLT5idWZfcmVhZCpzaXplLAorCQkJCQljbnQqc2l6ZSk7CisJCWVsc2UKKwkJCWNoYW5uZWwtPmR2cl9mZWVkLT5jYi50cygKKwkJCQkJKHU4ICopYWZpZm8tPnBhZ2VzK2FmaWZvLT5idWZfcmVhZCpzaXplLAorCQkJCQljbnQqc2l6ZSwgTlVMTCwgMCwKKwkJCQkJJmNoYW5uZWwtPmR2cl9mZWVkLT5mZWVkLnRzLDApOworCQl9IGVsc2UgeworCQkJYmxrLmFkZHIgPSBhZmlmby0+YmxrLmFkZHIrYWZpZm8tPmJ1Zl9yZWFkKnNpemU7CisJCQlibGsubGVuID0gY250KnNpemU7CisJCQlpZiAoc2YpCisJCQkJcmV0ID0gX3JidWZfd3JpdGUoJnNmLT5yYnVmLAorCQkJCQkodTggKilhZmlmby0+cGFnZXMrYWZpZm8tPmJ1Zl9yZWFkKnNpemUsCisJCQkJCWNudCpzaXplKTsKKwkJCWVsc2UgeworCQkJCWNoYW5uZWwtPmR2cl9mZWVkLT5jYi50cygKKwkJCQkJKHU4ICopJmJsaywKKwkJCQkJc2l6ZW9mKHN0cnVjdCBhbWxfZHZyX2Jsb2NrKSwKKwkJCQkJTlVMTCwgMCwKKwkJCQkJJmNoYW5uZWwtPmR2cl9mZWVkLT5mZWVkLnRzLDApOworCQkJfQorCQl9CisJCWFmaWZvLT5idWZfcmVhZCA9IDA7CisJfQorCisJaWYgKGFmaWZvLT5idWZfdG9nZ2xlID4gYWZpZm8tPmJ1Zl9yZWFkKSB7CisJCWNudCA9IGFmaWZvLT5idWZfdG9nZ2xlIC0gYWZpZm8tPmJ1Zl9yZWFkOworCQlpZiAoIShhZmlmby0+c2VjdXJlX2VuYWJsZSAmJiBhZmlmby0+YmxrLmFkZHIpKSB7CisJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGFzeW5jZmlmb19nZXRfZGV2KGFmaWZvKSwKKwkJCQlhZmlmby0+cGFnZXNfbWFwK2FmaWZvLT5idWZfcmVhZCpzaXplLAorCQkJCWNudCpzaXplLAorCQkJCURNQV9GUk9NX0RFVklDRSk7CisJCWlmIChzZikgeworCQkJaWYgKHJldCA+PSAwKQorCQkJCXJldCA9IF9yYnVmX3dyaXRlKCZzZi0+cmJ1ZiwKKwkJCQkJKHU4ICopYWZpZm8tPnBhZ2VzK2FmaWZvLT5idWZfcmVhZCpzaXplLAorCQkJCQljbnQqc2l6ZSk7CisJCQl9IGVsc2UgeworCQkJY2hhbm5lbC0+ZHZyX2ZlZWQtPmNiLnRzKAorCQkJCQkodTggKilhZmlmby0+cGFnZXMrYWZpZm8tPmJ1Zl9yZWFkKnNpemUsCisJCQkJCWNudCpzaXplLCBOVUxMLCAwLAorCQkJCSZjaGFubmVsLT5kdnJfZmVlZC0+ZmVlZC50cywwKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWJsay5hZGRyID0gYWZpZm8tPmJsay5hZGRyK2FmaWZvLT5idWZfcmVhZCpzaXplOworCQkJYmxrLmxlbiA9IGNudCpzaXplOworCQkJaWYgKHNmKQorCQkJCXJldCA9IF9yYnVmX3dyaXRlKCZzZi0+cmJ1ZiwKKwkJCQkJKHU4ICopYWZpZm8tPnBhZ2VzK2FmaWZvLT5idWZfcmVhZCpzaXplLAorCQkJCQljbnQqc2l6ZSk7CisJCQllbHNlIHsKKwkJCQljaGFubmVsLT5kdnJfZmVlZC0+Y2IudHMoCisJCQkJCSh1OCAqKSZibGssCisJCQkJCXNpemVvZihzdHJ1Y3QgYW1sX2R2cl9ibG9jayksCisJCQkJCU5VTEwsIDAsCisJCQkJCSZjaGFubmVsLT5kdnJfZmVlZC0+ZmVlZC50cywwKTsKKwkJCX0KKwkJfQorCQlhZmlmby0+YnVmX3JlYWQgPSBhZmlmby0+YnVmX3RvZ2dsZTsKKwl9CisKKwlpZiAoc2YgJiYgcmV0ID4gMCkgeworCQlfcmJ1Zl9maWx0ZXJfcGt0cygmc2YtPnJidWYsIHNmLT53cmFwYnVmLAorCQkJCWR2Yl9kbXhfc3dmaWx0ZXJfcGFja2V0cywKKwkJCQljaGFubmVsLT5kdnJfZmVlZC0+ZGVtdXgpOworCX0gZWxzZSBpZiAoc2YgJiYgcmV0IDw9IDApCisJCXByX2Vycm9yKCJzZiByYnVmIHdyaXRlIGVycm9yWyVkXVxuIiwgcmV0KTsKKwllbHNlCisJCXByX2RiZ19pcnFfZHZyKCJ3cml0ZSBkYXRhIHRvIGR2clxuIik7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBsYXN0X2FmaWZvX3RpbWUgPSAwOworc3RhdGljIHZvaWQgZHZyX2lycV9iaF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBhbWxfYXN5bmNmaWZvICphZmlmbyA9IChzdHJ1Y3QgYW1sX2FzeW5jZmlmbyAqKWFyZzsKKwlzdHJ1Y3QgYW1sX2R2YiAqZHZiID0gYWZpZm8tPmR2YjsKKwlzdHJ1Y3QgYW1sX2RteCAqZG14OworCXUzMiBzaXplLCB0b3RhbDsKKwlpbnQgaSwgZmFjdG9yOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcl9kYmdfaXJxX2R2cigiYXN5bmMgZmlmbyAlZCBpcnEsIGludGVydmFsOiVkIG1zLCAlZCBkYXRhXG4iLCBhZmlmby0+aWQsCisJCQlqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBsYXN0X2FmaWZvX3RpbWUpLCBhZmlmby0+Zmx1c2hfc2l6ZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHZiLT5zbG9jaywgZmxhZ3MpOworCisJaWYgKGR2YiAmJiBhZmlmby0+c291cmNlID49IEFNX0RNWF8wICYmIGFmaWZvLT5zb3VyY2UgPCBBTV9ETVhfTUFYKSB7CisJCWRteCA9ICZkdmItPmRteFthZmlmby0+c291cmNlXTsKKwkvLwlwcl9pbmYoImFzeW5jIGZpZm8gJWQgaXJxLCBzb3VyY2U6JWRcbiIsIGFmaWZvLT5pZCxhZmlmby0+c291cmNlKTsKKwkJaWYgKGRteC0+aW5pdCAmJiBkbXgtPnJlY29yZCkgeworCQkJc3RydWN0IGFtbF9zd2ZpbHRlciAqc2YgPSAmZHZiLT5zd2ZpbHRlcjsKKwkJCWludCBpc3NmID0gMDsKKworCQkJdG90YWwgPSBhZmlmby0+YnVmX2xlbiAvIGFmaWZvLT5mbHVzaF9zaXplOworCQkJZmFjdG9yID0gZG14X2dldF9vcmRlcih0b3RhbCk7CisJCQlzaXplID0gYWZpZm8tPmJ1Zl9sZW4gPj4gZmFjdG9yOworCisJCQlpZiAoc2YtPnVzZXIgJiYgKHNmLT5hZmlmbyA9PSBhZmlmbykpCisJCQkJaXNzZiA9IDE7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBDSEFOTkVMX0NPVU5UOyBpKyspIHsKKwkJCQlpZiAoZG14LT5jaGFubmVsW2ldLnVzZWQKKwkJCQkJCSYmIGRteC0+Y2hhbm5lbFtpXS5kdnJfZmVlZCkgeworCQkJCQlkdnJfcHJvY2Vzc19jaGFubmVsKGFmaWZvLAorCQkJCQkJCSZkbXgtPmNoYW5uZWxbaV0sCisJCQkJCQkJdG90YWwsCisJCQkJCQkJc2l6ZSwKKwkJCQkJCQlpc3NmP3NmOk5VTEwpOworCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR2Yi0+c2xvY2ssIGZsYWdzKTsKKwlsYXN0X2FmaWZvX3RpbWUgPSBqaWZmaWVzOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZHZyX2lycV9oYW5kbGVyKGludCBpcnFfbnVtYmVyLCB2b2lkICpwYXJhKQoreworCXN0cnVjdCBhbWxfYXN5bmNmaWZvICphZmlmbyA9IChzdHJ1Y3QgYW1sX2FzeW5jZmlmbyAqKXBhcmE7CisJaW50IGZhY3RvciA9IGRteF9nZXRfb3JkZXIoYWZpZm8tPmJ1Zl9sZW4gLyBhZmlmby0+Zmx1c2hfc2l6ZSk7CisKKwlhZmlmby0+YnVmX3RvZ2dsZSsrOworCWFmaWZvLT5idWZfdG9nZ2xlICU9ICgxIDw8IGZhY3Rvcik7CisJdGFza2xldF9zY2hlZHVsZSgmYWZpZm8tPmFzeW5jZmlmb190YXNrbGV0KTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qRW5hYmxlIHRoZSBTVEIqLworc3RhdGljIHZvaWQgc3RiX2VuYWJsZShzdHJ1Y3QgYW1sX2R2YiAqZHZiKQoreworCWludCBvdXRfc3JjLCBkZXNfaW4sIGVuX2RlcywgZmVjX2NsaywgaGl1LCBkZWNfY2xrX2VuOworCWludCBzcmMsIHRzb19zcmMsIGk7CisJdTMyIGZlY19zMCwgZmVjX3MxLGZlY19zMjsKKwl1MzIgaW52ZXJ0MCwgaW52ZXJ0MSwgaW52ZXJ0MjsKKwl1MzIgZGF0YTsKKworCXN3aXRjaCAoZHZiLT5zdGJfc291cmNlKSB7CisJY2FzZSBBTV9UU19TUkNfRE1YMDoKKwkJc3JjID0gZHZiLT5kbXhbMF0uc291cmNlOworCQlicmVhazsKKwljYXNlIEFNX1RTX1NSQ19ETVgxOgorCQlzcmMgPSBkdmItPmRteFsxXS5zb3VyY2U7CisJCWJyZWFrOworCWNhc2UgQU1fVFNfU1JDX0RNWDI6CisJCXNyYyA9IGR2Yi0+ZG14WzJdLnNvdXJjZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3JjID0gZHZiLT5zdGJfc291cmNlOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKHNyYykgeworCWNhc2UgQU1fVFNfU1JDX1RTMDoKKwkJZmVjX2NsayA9IHRzZmlsZV9jbGtkaXY7CisJCWhpdSA9IDA7CisJCWJyZWFrOworCWNhc2UgQU1fVFNfU1JDX1RTMToKKwkJZmVjX2NsayA9IHRzZmlsZV9jbGtkaXY7CisJCWhpdSA9IDA7CisJCWJyZWFrOworCWNhc2UgQU1fVFNfU1JDX1RTMjoKKwkJZmVjX2NsayA9IHRzZmlsZV9jbGtkaXY7CisJCWhpdSA9IDA7CisJCWJyZWFrOworCWNhc2UgQU1fVFNfU1JDX1RTMzoKKwkJZmVjX2NsayA9IHRzZmlsZV9jbGtkaXY7CisJCWhpdSA9IDA7CisJCWJyZWFrOworCWNhc2UgQU1fVFNfU1JDX1NfVFMwOgorCQlmZWNfY2xrID0gdHNmaWxlX2Nsa2RpdjsKKwkJaGl1ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfU19UUzE6CisJCWZlY19jbGsgPSB0c2ZpbGVfY2xrZGl2OworCQloaXUgPSAwOworCQlicmVhazsKKwljYXNlIEFNX1RTX1NSQ19TX1RTMjoKKwkJZmVjX2NsayA9IHRzZmlsZV9jbGtkaXY7CisJCWhpdSA9IDA7CisJCWJyZWFrOworCWNhc2UgQU1fVFNfU1JDX0hJVToKKwkJZmVjX2NsayA9IHRzZmlsZV9jbGtkaXY7CisJCWhpdSA9IDE7CisJCWJyZWFrOworCWNhc2UgQU1fVFNfU1JDX0hJVTE6CisJCWZlY19jbGsgPSB0c2ZpbGVfY2xrZGl2OworCQloaXUgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmZWNfY2xrID0gMDsKKwkJaGl1ID0gMDsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChkdmItPmRzY1swXS5zb3VyY2UpIHsKKwljYXNlIEFNX1RTX1NSQ19ETVgwOgorCQlkZXNfaW4gPSAwOworCQllbl9kZXMgPSAxOworCQlkZWNfY2xrX2VuID0gMTsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfRE1YMToKKwkJZGVzX2luID0gMTsKKwkJZW5fZGVzID0gMTsKKwkJZGVjX2Nsa19lbiA9IDE7CisJCWJyZWFrOworCWNhc2UgQU1fVFNfU1JDX0RNWDI6CisJCWRlc19pbiA9IDI7CisJCWVuX2RlcyA9IDE7CisJCWRlY19jbGtfZW4gPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXNfaW4gPSAwOworCQllbl9kZXMgPSAwOworCQlkZWNfY2xrX2VuID0gMDsKKwkJYnJlYWs7CisJfQorCXN3aXRjaCAoZHZiLT50c29fc291cmNlKSB7CisJY2FzZSBBTV9UU19TUkNfRE1YMDoKKwkJdHNvX3NyYyA9IGR2Yi0+ZG14WzBdLnNvdXJjZTsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfRE1YMToKKwkJdHNvX3NyYyA9IGR2Yi0+ZG14WzFdLnNvdXJjZTsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfRE1YMjoKKwkJdHNvX3NyYyA9IGR2Yi0+ZG14WzJdLnNvdXJjZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdHNvX3NyYyA9IGR2Yi0+dHNvX3NvdXJjZTsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoICh0c29fc3JjKSB7CisJY2FzZSBBTV9UU19TUkNfVFMwOgorCQlvdXRfc3JjID0gMDsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfVFMxOgorCQlvdXRfc3JjID0gMTsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfVFMyOgorCQlvdXRfc3JjID0gMjsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfVFMzOgorCQlvdXRfc3JjID0gMzsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfU19UUzA6CisJCW91dF9zcmMgPSA2OworCQlicmVhazsKKwljYXNlIEFNX1RTX1NSQ19TX1RTMToKKwkJb3V0X3NyYyA9IDU7CisJCWJyZWFrOworCWNhc2UgQU1fVFNfU1JDX1NfVFMyOgorCQlvdXRfc3JjID0gNDsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfSElVOgorCQlvdXRfc3JjID0gNzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJb3V0X3NyYyA9IDA7CisJCWJyZWFrOworCX0KKworCXByX2RiZygiW3N0Yl1zcmM6ICVkLCBkc2MxaW46ICVkLCB0c286ICVkXG4iLCBzcmMsIGRlc19pbiwgb3V0X3NyYyk7CisKKwlmZWNfczAgPSAwOworCWZlY19zMSA9IDA7CisJZmVjX3MyID0gMDsKKwlpbnZlcnQwID0gMDsKKwlpbnZlcnQxID0gMDsKKwlpbnZlcnQyID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBkdmItPnRzX2luX3RvdGFsX2NvdW50OyBpKyspIHsKKwkJaWYgKGR2Yi0+dHNbaV0uczJwX2lkID09IDApCisJCQlmZWNfczAgPSBpOworCQllbHNlIGlmIChkdmItPnRzW2ldLnMycF9pZCA9PSAxKQorCQkJZmVjX3MxID0gaTsKKwkJZWxzZSBpZiAoZHZiLT50c1tpXS5zMnBfaWQgPT0gMikKKwkJCWZlY19zMiA9IGk7CisJfQorCisJaW52ZXJ0MCA9IGR2Yi0+czJwWzBdLmludmVydDsKKwlpbnZlcnQxID0gZHZiLT5zMnBbMV0uaW52ZXJ0OworCisJV1JJVEVfTVBFR19SRUcoU1RCX1RPUF9DT05GSUcsCisJCSAgICAgICAoaW52ZXJ0MSA8PCBJTlZFUlRfUzJQMV9GRUNfQ0xLKSB8CisJCSAgICAgICAoZmVjX3MxIDw8IFMyUDFfRkVDX1NFUklBTF9TRUwpIHwKKwkJICAgICAgIChvdXRfc3JjIDw8IFRTX09VVFBVVF9TT1VSQ0UpIHwKKwkJICAgICAgIChkZXNfaW4gPDwgREVTX0lOUFVUX1NFTCkgfAorCQkgICAgICAgKGVuX2RlcyA8PCBFTkFCTEVfREVTX1BMKSB8CisJCSAgICAgICAoZGVjX2Nsa19lbiA8PCBFTkFCTEVfREVTX1BMX0NMSykgfAorCQkgICAgICAgKGludmVydDAgPDwgSU5WRVJUX1MyUDBfRkVDX0NMSykgfAorCQkgICAgICAgKGZlY19zMCA8PCBTMlAwX0ZFQ19TRVJJQUxfU0VMKXwKKwkJICAgICAgIChjaXBsdXMpKTsKKwljaXBsdXMgPSAwOworCisJaWYgKGdldF9jcHVfdHlwZSgpID49IE1FU09OX0NQVV9NQUpPUl9JRF9UTDEpIHsKKwkJaW52ZXJ0MiA9IGR2Yi0+czJwWzJdLmludmVydDsKKworCQlXUklURV9NUEVHX1JFRyhTVEJfUzJQMl9DT05GSUcsCisJCSAgICAgICAoaW52ZXJ0MiA8PCBJTlZFUlRfUzJQMl9GRUNfQ0xLKSB8CisJCSAgICAgICAoZmVjX3MyIDw8IFMyUDJfRkVDX1NFUklBTF9TRUwpKTsKKwl9CisKKwlpZiAoZHZiLT5yZXNldF9mbGFnKQorCQloaXUgPSAwOworCS8qIGludmVydCB0cyBvdXQgY2xrLGFkZCBjaSBtb2RlbCBuZWVkIGFkZCB0aGlzKi8KKwlpZiAoZHZiLT50c19vdXRfaW52ZXJ0KSB7CisJCXByaW50aygidHMgb3V0IGludmVydCAtLS1cclxuIik7CisJCWRhdGEgPSBSRUFEX01QRUdfUkVHKFRTX1RPUF9DT05GSUcpOworCQlkYXRhIHw9IDEgPDwgVFNfT1VUX0NMS19JTlZFUlQ7CisJCVdSSVRFX01QRUdfUkVHKFRTX1RPUF9DT05GSUcsIGRhdGEpOworCX0KKworCWlmIChzcmMgPT0gQU1fVFNfU1JDX0hJVTEpIHsKKwkJV1JJVEVfTVBFR19SRUcoVFNfSElVMV9DT05GSUcsCisJCQkgICAgICAgKGRlbXV4X3NraXBieXRlIDw8IEZJTEVfTTJUU19TS0lQX0JZVEVTX0hJVTEpIHwKKwkJCSAgICAgICAoaGl1IDw8IFRTX0hJVV9FTkFCTEVfSElVMSkgfAorCQkJICAgICAgIChmZWNfY2xrIDw8IEZFQ19DTEtfRElWX0hJVTEpIHwKKwkJCSAgICAgICAoMHhCQiA8PCBUU19QQUNLQUdFX0xFTkdUSF9TVUJfMV9ISVUxKSB8CisJCQkJICAgKDB4NDcgPDwgRkVDX1NZTkNfQllURV9ISVUxKSk7CisJfSBlbHNlIHsKKwkJLyogaW52ZXJ0IHRzIG91dCBjbGsgIGVuZCAqLworCQlXUklURV9NUEVHX1JFRyhUU19GSUxFX0NPTkZJRywKKwkJCSAgICAgICAoZGVtdXhfc2tpcGJ5dGUgPDwgMTYpIHwKKwkJCSAgICAgICAoNiA8PCBERVNfT1VUX0RMWSkgfAorCQkJICAgICAgICgzIDw8IFRSQU5TUE9SVF9TQ1JBTUJMSU5HX0NPTlRST0xfT0REKSB8CisJCQkgICAgICAgKDMgPDwgVFJBTlNQT1JUX1NDUkFNQkxJTkdfQ09OVFJPTF9PRERfMikgfAorCQkJICAgICAgIChoaXUgPDwgVFNfSElVX0VOQUJMRSkgfCAoZmVjX2NsayA8PCBGRUNfRklMRV9DTEtfRElWKSk7CisJfQorfQorCitpbnQgZHNjX3NldF9waWQoc3RydWN0IGFtbF9kc2NfY2hhbm5lbCAqY2gsIGludCBwaWQpCit7CisJc3RydWN0IGFtbF9kc2MgKmRzYyA9IGNoLT5kc2M7CisJaW50IGlzX2RzYzIgPSAoZHNjLT5pZCA9PSAxKSA/IDEgOiAwOworCXUzMiBkYXRhOworCisJV1JJVEVfTVBFR19SRUcoVFNfUExfUElEX0lOREVYLAorCQkJKChjaC0+aWQgJiAweDBmKSA+PiAxKSsoaXNfZHNjMiA/IDQgOiAwKSk7CisJZGF0YSA9IFJFQURfTVBFR19SRUcoVFNfUExfUElEX0RBVEEpOworCWlmIChjaC0+aWQgJiAxKSB7CisJCWRhdGEgJj0gMHhGRkZGMDAwMDsKKwkJZGF0YSB8PSBwaWQgJiAweDFmZmY7CisJCWlmICghY2gtPnVzZWQpCisJCQlkYXRhIHw9IDEgPDwgUElEX01BVENIX0RJU0FCTEVfTE9XOworCX0gZWxzZSB7CisJCWRhdGEgJj0gMHhGRkZGOworCQlkYXRhIHw9IChwaWQgJiAweDFmZmYpIDw8IDE2OworCQlpZiAoIWNoLT51c2VkKQorCQkJZGF0YSB8PSAxIDw8IFBJRF9NQVRDSF9ESVNBQkxFX0hJR0g7CisJfQorCVdSSVRFX01QRUdfUkVHKFRTX1BMX1BJRF9JTkRFWCwKKwkJCSgoY2gtPmlkICYgMHgwZikgPj4gMSkrKGlzX2RzYzIgPyA0IDogMCkpOworCVdSSVRFX01QRUdfUkVHKFRTX1BMX1BJRF9EQVRBLCBkYXRhKTsKKwlXUklURV9NUEVHX1JFRyhUU19QTF9QSURfSU5ERVgsIDApOworCisJaWYgKGNoLT51c2VkKQorCQlwcl9kYmcoInNldCBEU0MgJWQgY2ggJWQgUElEICVkXG4iLCBkc2MtPmlkLCBjaC0+aWQsIHBpZCk7CisJZWxzZQorCQlwcl9kYmcoImRpc2FibGUgRFNDICVkIGNoICVkXG4iLCBkc2MtPmlkLCBjaC0+aWQpOworCXJldHVybiAwOworfQorCitpbnQgZHNjX2dldF9waWQoc3RydWN0IGFtbF9kc2NfY2hhbm5lbCAqY2gsIGludCAqcGlkKQoreworCXN0cnVjdCBhbWxfZHNjICpkc2MgPSBjaC0+ZHNjOworCWludCBpc19kc2MyID0gKGRzYy0+aWQgPT0gMSkgPyAxIDogMDsKKwl1MzIgZGF0YTsKKworCVdSSVRFX01QRUdfUkVHKFRTX1BMX1BJRF9JTkRFWCwKKwkJCSgoY2gtPmlkICYgMHgwZikgPj4gMSkrKGlzX2RzYzIgPyA0IDogMCkpOworCWRhdGEgPSBSRUFEX01QRUdfUkVHKFRTX1BMX1BJRF9EQVRBKTsKKwlpZiAoY2gtPmlkICYgMSkgeworCQkqcGlkID0gZGF0YSAmIDB4MWZmZjsKKwl9IGVsc2UgeworCQkqcGlkID0gKGRhdGEgPj4gMTYpICYgMHgxZmZmOworCX0KKworCS8qcHJfZGJnKCIlcyxnZXQgRFNDICVkIGNoICVkIFBJRCAlZFxuIiwgX19GVU5DVElPTl9fLGRzYy0+aWQsIGNoLT5pZCwgKnBpZCk7Ki8KKwlyZXR1cm4gMDsKK30KKworaW50IGRzY19zZXRfa2V5KHN0cnVjdCBhbWxfZHNjX2NoYW5uZWwgKmNoLCBpbnQgZmxhZ3MsIGVudW0gY2FfY3dfdHlwZSB0eXBlLAorCQkJdTggKmtleSkKK3sKKwkvKnN0cnVjdCBhbWxfZHNjICpkc2MgPSBjaC0+ZHNjOyovCisJaW50IHJldCA9IC0xOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBDQV9DV19EVkJfQ1NBX0VWRU46CisJY2FzZSBDQV9DV19EVkJfQ1NBX09ERDoKKwkJYW1sX2NpX3BsdXNfZGlzYWJsZSgpOworCQlyZXQgPSBkc2Nfc2V0X2NzYV9rZXkoY2gsIGZsYWdzLCB0eXBlLCBrZXkpOworCQlpZiAocmV0ICE9IDApCisJCQlnb3RvIEVORDsKKwkJLyogRGlmZmVyZW50IHdpdGggb2xkIG1vZGUsIGRvIGNoYW5nZSAqLworCQlpZiAoY2gtPndvcmtfbW9kZSA9PSBDSVBMVVNfTU9ERSB8fCBjaC0+d29ya19tb2RlID09IC0xKSB7CisJCQlpZiAoY2gtPndvcmtfbW9kZSA9PSAtMSkKKwkJCQlwcl9pbmYoImRzY1slZDolZF0gZW5hYmxlXG4iLAorCQkJCQljaC0+ZHNjLT5pZCwgY2gtPmlkKTsKKwkJCWVsc2UKKwkJCQlwcl9pbmYoImRzY1slZDolZF0gZW5hYmxlIChmcm9tIGNpcGx1cylcbiIsCisJCQkJCWNoLT5kc2MtPmlkLCBjaC0+aWQpOworCQkJY2gtPm1vZGUgPSBFQ0JfTU9ERTsKKwkJCWNoLT53b3JrX21vZGUgPSBEVkJDU0FfTU9ERTsKKwkJfQorCQlicmVhazsKKwljYXNlIENBX0NXX0FFU19FVkVOOgorCWNhc2UgQ0FfQ1dfQUVTX09ERDoKKwljYXNlIENBX0NXX0FFU19FVkVOX0lWOgorCWNhc2UgQ0FfQ1dfQUVTX09ERF9JVjoKKwljYXNlIENBX0NXX0RFU19FVkVOOgorCWNhc2UgQ0FfQ1dfREVTX09ERDoKKwljYXNlIENBX0NXX1NNNF9FVkVOOgorCWNhc2UgQ0FfQ1dfU000X09ERDoKKwljYXNlIENBX0NXX1NNNF9FVkVOX0lWOgorCWNhc2UgQ0FfQ1dfU000X09ERF9JVjoKKwkJcmV0ID0gZHNjX3NldF9hZXNfZGVzX3NtNF9rZXkoY2gsIGZsYWdzLCB0eXBlLCBrZXkpOworCQlpZiAocmV0ICE9IDApCisJCQlnb3RvIEVORDsKKwkJYW1fY2lfcGx1c19zZXRfb3V0cHV0KGNoKTsKKwkJLyogRGlmZmVyZW50IHdpdGggb2xkIG1vZGUsIGRvIGNoYW5nZSAqLworCQlpZiAoY2gtPndvcmtfbW9kZSA9PSBEVkJDU0FfTU9ERSB8fCBjaC0+d29ya19tb2RlID09IC0xKSB7CisJCQlpZiAoY2gtPndvcmtfbW9kZSA9PSAtMSkKKwkJCQlwcl9pbmYoImRzY1slZDolZF0gY2lwbHVzIGVuYWJsZVxuIiwKKwkJCQkJY2gtPmRzYy0+aWQsIGNoLT5pZCk7CisJCQllbHNlCisJCQkJcHJfaW5mKCJkc2NbJWQ6JWRdIGNpcGx1cyBlbmFibGUgKGZyb20gZHNjKVxuIiwKKwkJCQkJY2gtPmRzYy0+aWQsIGNoLT5pZCk7CisJCQljaC0+d29ya19tb2RlID0gQ0lQTFVTX01PREU7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorRU5EOgorCXJldHVybiByZXQ7Cit9CisKK2ludCBkc2Nfc2V0X2tleXMoc3RydWN0IGFtbF9kc2NfY2hhbm5lbCAqY2gpCit7CisJaW50IHR5cGVzID0gY2gtPnNldCAmIDB4RkZGRkZGOworCWludCBmbGFnID0gKGNoLT5zZXQgPj4gMjQpICYgMHhGRjsKKwlpbnQgaTsKKwl1OCAgKms7CisJaW50IHJldCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ0FfQ1dfVFlQRV9NQVg7IGkrKykgeworCQlpZiAodHlwZXMgJiAoMSA8PCBpKSkgeworCQkJayA9IE5VTEw7CisJCQlzd2l0Y2ggKGkpIHsKKwkJCWNhc2UgQ0FfQ1dfRFZCX0NTQV9FVkVOOgorCQkJY2FzZSBDQV9DV19BRVNfRVZFTjoKKwkJCWNhc2UgQ0FfQ1dfREVTX0VWRU46CisJCQljYXNlIENBX0NXX1NNNF9FVkVOOgorCQkJCWsgPSBjaC0+ZXZlbjsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ0FfQ1dfRFZCX0NTQV9PREQ6CisJCQljYXNlIENBX0NXX0FFU19PREQ6CisJCQljYXNlIENBX0NXX0RFU19PREQ6CisJCQljYXNlIENBX0NXX1NNNF9PREQ6CisJCQkJayA9IGNoLT5vZGQ7CisJCQkJYnJlYWs7CisJCQljYXNlIENBX0NXX0FFU19FVkVOX0lWOgorCQkJY2FzZSBDQV9DV19TTTRfRVZFTl9JVjoKKwkJCQlrID0gY2gtPmV2ZW5faXY7CisJCQkJYnJlYWs7CisJCQljYXNlIENBX0NXX0FFU19PRERfSVY6CisJCQljYXNlIENBX0NXX1NNNF9PRERfSVY6CisJCQkJayA9IGNoLT5vZGRfaXY7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQkJLyoKKwkJCWlmIChrKQorCQkJCXByX2luZigiZHNjIGNoOiVkIGZsYWc6JWQgdHlwZTolZFxuIiwgY2gtPmlkLCBmbGFnLCBpKTsKKwkJCSovCisJCQlpZiAoaykKKwkJCQlyZXQgPSBkc2Nfc2V0X2tleShjaCwgZmxhZywKKwkJCQkJaSwKKwkJCQkJayk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNjX3NldF9jc2Ffa2V5KHN0cnVjdCBhbWxfZHNjX2NoYW5uZWwgKmNoLCBpbnQgZmxhZ3MsCisJCQllbnVtIGNhX2N3X3R5cGUgdHlwZSwgdTggKmtleSkKK3sKKwlzdHJ1Y3QgYW1sX2RzYyAqZHNjID0gY2gtPmRzYzsKKwlpbnQgaXNfZHNjMiA9IChkc2MtPmlkID09IDEpID8gMSA6IDA7CisJdTE2IGswLCBrMSwgazIsIGszOworCXUzMiBrZXkwLCBrZXkxOworCWludCByZWc7CisKKwlpZiAoZmxhZ3MgJiBEU0NfRlJPTV9LTCkgeworCQlrMCA9IGsxID0gazIgPSBrMyA9IDA7CisJCS8qZHVtbXkgd3JpdGUgdG8gY2hlY2sgaWYga2wgbm90IHdvcmtpbmcqLworCQlrZXkwID0ga2V5MSA9IDA7CisJCVdSSVRFX01QRUdfUkVHKENPTU1fREVTQ19LRVkwLCBrZXkwKTsKKwkJV1JJVEVfTVBFR19SRUcoQ09NTV9ERVNDX0tFWTEsIGtleTEpOworCisJLyp0ZGVzPyA6Ki8KKwkJaWYgKGdldF9jcHVfdHlwZSgpID09IE1FU09OX0NQVV9NQUpPUl9JRF9HWEJCKSB7CisJCQlXUklURV9NUEVHX1JFRyhDT01NX0RFU0NfS0VZX1JXLAorLyoJCQkJKHR5cGUgPyAoMSA8PCA2KSA6ICgxIDw8IDUpKSB8ICovCisJCQkJKCgxIDw8IDUpKSB8CisJCQkJKChjaC0+aWQgKyB0eXBlICogRFNDX0NPVU5UKSsKKwkJCQkJKGlzX2RzYzIgPyAxNiA6IDApKSk7CisJCX0KKwkJaWYgKGdldF9jcHVfdHlwZSgpID09IE1FU09OX0NQVV9NQUpPUl9JRF9HWEwgfHwKKwkJCWdldF9jcHVfdHlwZSgpID09IE1FU09OX0NQVV9NQUpPUl9JRF9HWE0pIHsKKwkJCXByX2luZm8oImRvIGtsLi5cbiIpOworCQkJV1JJVEVfTVBFR19SRUcoQ09NTV9ERVNDX0tFWV9SVywKKwkJCQkodHlwZSA/ICgxIDw8IDYpIDogKDEgPDwgNSkpIHwgKDE8PDcpIHwKKwkJCQkoKGNoLT5pZCArIHR5cGUgKiBEU0NfQ09VTlQpKworCQkJCSAoaXNfZHNjMiA/IDE2IDogMCkpKTsKKwkJfQorCQlyZWcgPSAodHlwZSA/ICgxIDw8IDYpIDogKDEgPDwgNSkpIHwKKwkJCQkoKGNoLT5pZCArIHR5cGUgKiBEU0NfQ09VTlQpKworCQkJCSAoaXNfZHNjMiA/IDE2IDogMCkpOworCX0gZWxzZSB7CisJCWswID0gKGtleVswXSA8PCA4KSB8IGtleVsxXTsKKwkJazEgPSAoa2V5WzJdIDw8IDgpIHwga2V5WzNdOworCQlrMiA9IChrZXlbNF0gPDwgOCkgfCBrZXlbNV07CisJCWszID0gKGtleVs2XSA8PCA4KSB8IGtleVs3XTsKKworCQlrZXkwID0gKGswIDw8IDE2KSB8IGsxOworCQlrZXkxID0gKGsyIDw8IDE2KSB8IGszOworCQlXUklURV9NUEVHX1JFRyhDT01NX0RFU0NfS0VZMCwga2V5MCk7CisJCVdSSVRFX01QRUdfUkVHKENPTU1fREVTQ19LRVkxLCBrZXkxKTsKKworCQlyZWcgPSAoY2gtPmlkICsgdHlwZSAqIERTQ19DT1VOVCkrKGlzX2RzYzIgPyAxNiA6IDApOworCQlXUklURV9NUEVHX1JFRyhDT01NX0RFU0NfS0VZX1JXLCByZWcpOworCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBBRVMgREVTQyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qI2RlZmluZSBTVEJfVE9QX0NPTkZJRyAweDE2ZjAKKyNkZWZpbmUgQ0lQTFVTX0tFWTAgICAweDE2ZjgKKyNkZWZpbmUgQ0lQTFVTX0tFWTEgICAweDE2ZjkKKyNkZWZpbmUgQ0lQTFVTX0tFWTIgICAweDE2ZmEKKyNkZWZpbmUgQ0lQTFVTX0tFWTMgICAweDE2ZmIKKyNkZWZpbmUgQ0lQTFVTX0tFWV9XUiAweDE2ZmMKKyNkZWZpbmUgQ0lQTFVTX0NPTkZJRyAweDE2ZmQKKyNkZWZpbmUgQ0lQTFVTX0VORElBTiAweDE2ZmUqLworCisjZGVmaW5lIEVOQUJMRV9ERUNfUEwgICAgIDcKKyNkZWZpbmUgRU5BQkxFX0RFU19QTF9DTEsgMTUKKworI2RlZmluZSBLRVlfV1JfQUVTX0lWX0IgNQorI2RlZmluZSBLRVlfV1JfQUVTX0lWX0EgNAorI2RlZmluZSBLRVlfV1JfQUVTX0IgICAgMworI2RlZmluZSBLRVlfV1JfQUVTX0EgICAgMgorI2RlZmluZSBLRVlfV1JfREVTX0IgICAgMQorI2RlZmluZSBLRVlfV1JfREVTX0EgICAgMAorCisjZGVmaW5lIElEU0FfTU9ERV9CSVQJMzEKKyNkZWZpbmUgU000X01PREUJMzAKKyNkZWZpbmUgREVTMl9LRVlfRU5ESUFOIDI1CisjZGVmaW5lIERFUzJfSU5fRU5ESUFOICAyMQorI2RlZmluZSBERVMyX0NGRwk2CisjZGVmaW5lIERFUzJfRU4JCTUKKyNkZWZpbmUgQ05UTF9FTkFCTEUgICAgIDMKKyNkZWZpbmUgQUVTX0NCQ19ESVNBQkxFIDIKKyNkZWZpbmUgQUVTX0VOICAgICAgICAgIDEKKyNkZWZpbmUgREVTX0VOICAgICAgICAgIDAKKworI2RlZmluZSBBRVNfSVZfRU5ESUFOCTI4CisjZGVmaW5lIEFFU19NU0dfT1VUX0VORElBTiAyNAorI2RlZmluZSBBRVNfTVNHX0lOX0VORElBTiAgMjAKKyNkZWZpbmUgQUVTX0tFWV9FTkRJQU4gIDE2CisjZGVmaW5lIERFU19NU0dfT1VUX0VORElBTiA4CisjZGVmaW5lIERFU19NU0dfSU5fRU5ESUFOICA0CisjZGVmaW5lIERFU19LRVlfRU5ESUFOICAwCisKKyNkZWZpbmUgQUxHT19BRVMJCTAKKyNkZWZpbmUgQUxHT19TTTQJCTEKKyNkZWZpbmUgQUxHT19ERVMJCTIKKworI2lmIDAKK3N0YXRpYyB2b2lkIGFtbF9jaV9wbHVzX3NldF9zdGIodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKwkvKiBkYXRhID0gUkVBRF9NUEVHX1JFRyhGRUNfSU5QVVRfQ09OVFJPTCk7ICovCisJLyogZGF0YSB8PSAoMDw8RkVDX1NFTCk7ICovCisJLyogZGF0YSB8PSAoMTw8RkVDX0NPUkVfU0VMKTsgKi8KKwkvKiBkYXRhIHw9ICgxPDxGRUNfSU5QVVRfRkVDX0NMSyk7CisJICoJbG9jYWwgcGxheWJhY2sgd2lsbCBub3Qgd29yayBpZiBzZXQgdGhpcworCSAqLworCS8qIFdSSVRFX01QRUdfUkVHKEZFQ19JTlBVVF9DT05UUk9MLCBkYXRhKTsgKi8KKworCWRhdGEgPSBSRUFEX01QRUdfUkVHKFNUQl9UT1BfQ09ORklHKTsKKwlXUklURV9NUEVHX1JFRyhTVEJfVE9QX0NPTkZJRywgZGF0YSB8CisJCQkoMCA8PCBDSVBMVVNfSU5fU0VMKSB8ICgwIDw8IENJUExVU19PVVRfU0VMKSk7CisJZGF0YSA9IFJFQURfTVBFR19SRUcoU1RCX1RPUF9DT05GSUcpOworCS8qIGRhdGEgfD0gKDE8PEVOQUJMRV9ERUNfUEwpOyBiaXQgNyAtLQorCSAqCWVuYWJsZV9kZXNfcGwsIHRoaXMgc3RlcCB3YXMgc2V0IGluIGRzY19lbmFibGUKKwkgKi8KKwkvKmJpdCAxNSAtLSBlbmFibGVfZGVzX3BsX2NsayovCisJLyogZGF0YSB8PSAoMTw8RU5BQkxFX0RFU19QTF9DTEspOyAqLworCWRhdGEgfD0gKDE8PENJUExVU19PVVRfU0VMKTsvKmJpdCAyOCAtLSBjaXBsdXNfb3V0X3NlbCBmcm9tIGNpcGx1cyovCisJV1JJVEVfTVBFR19SRUcoU1RCX1RPUF9DT05GSUcsIGRhdGEpOworCWRhdGEgPSBSRUFEX01QRUdfUkVHKFNUQl9UT1BfQ09ORklHKTsKK30KKyNlbmRpZgorCisvKgorICogcGFyYW06CisgKiBrZXk6CisgKgkxNmJ5dGVzIElWIGtleQorICogdHlwZToKKyAqCUFNX0RTQ19LRVlfVFlQRV9BRVNfT0REICAgIElWIG9kZCBrZXkKKyAqCUFNX0RTQ19LRVlfVFlQRV9BRVNfRVZFTiAgSVYgZXZlbiBrZXkKKyAqLwordm9pZCBhbWxfY2lfcGx1c19zZXRfaXYoc3RydWN0IGFtbF9kc2NfY2hhbm5lbCAqY2gsIGVudW0gY2FfY3dfdHlwZSB0eXBlLAorCQkJdTggKmtleSkKK3sKKwl1bnNpZ25lZCBpbnQgazAsIGsxLCBrMiwgazM7CisKKwlrMyA9IChrZXlbMF0gPDwgMjQpIHwgKGtleVsxXSA8PCAxNikgfCAoa2V5WzJdIDw8IDgpIHwga2V5WzNdOworCWsyID0gKGtleVs0XSA8PCAyNCkgfCAoa2V5WzVdIDw8IDE2KSB8IChrZXlbNl0gPDwgOCkgfCBrZXlbN107CisJazEgPSAoa2V5WzhdIDw8IDI0KSB8IChrZXlbOV0gPDwgMTYpIHwgKGtleVsxMF0gPDwgOCkgfCBrZXlbMTFdOworCWswID0gKGtleVsxMl0gPDwgMjQpIHwgKGtleVsxM10gPDwgMTYpIHwgKGtleVsxNF0gPDwgOCkgfCBrZXlbMTVdOworCisJaWYgKHR5cGUgPT0gQ0FfQ1dfQUVTX0VWRU5fSVYgfHwKKwkJdHlwZSA9PSBDQV9DV19TTTRfRVZFTl9JVikgeworCQlXUklURV9NUEVHX1JFRyhDSVBMVVNfS0VZMCwgazApOworCQlXUklURV9NUEVHX1JFRyhDSVBMVVNfS0VZMSwgazEpOworCQlXUklURV9NUEVHX1JFRyhDSVBMVVNfS0VZMiwgazIpOworCQlXUklURV9NUEVHX1JFRyhDSVBMVVNfS0VZMywgazMpOworCQlXUklURV9NUEVHX1JFRyhDSVBMVVNfS0VZX1dSLAorCQkJKGNoLT5pZCA8PCA5KSB8ICgxPDxLRVlfV1JfQUVTX0lWX0EpKTsKKwl9IGVsc2UgaWYgKHR5cGUgPT0gQ0FfQ1dfQUVTX09ERF9JViB8fAorCQkJICAgdHlwZSA9PSBDQV9DV19TTTRfT0REX0lWKSB7CisJCVdSSVRFX01QRUdfUkVHKENJUExVU19LRVkwLCBrMCk7CisJCVdSSVRFX01QRUdfUkVHKENJUExVU19LRVkxLCBrMSk7CisJCVdSSVRFX01QRUdfUkVHKENJUExVU19LRVkyLCBrMik7CisJCVdSSVRFX01QRUdfUkVHKENJUExVU19LRVkzLCBrMyk7CisJCVdSSVRFX01QRUdfUkVHKENJUExVU19LRVlfV1IsCisJCQkoY2gtPmlkIDw8IDkpIHwgKDE8PEtFWV9XUl9BRVNfSVZfQikpOworCX0KK30KKworLyoKKyAqIFBhcmFtOgorICoga2V5X2VuZGlhbgorICoJUzkwNUQgIDcgZm9yIGtsICAgIDAgZm9yIHNldCBrZXkgZGlyZWN0bHkKKyAqIG1vZGUKKyAqICAwIGZvciBlYmMKKyAqICAxIGZvciBjYmMKKyAqLworc3RhdGljIHZvaWQgYW1sX2NpX3BsdXNfY29uZmlnKGludCBrZXlfZW5kaWFuLCBpbnQgbW9kZSwgaW50IGFsZ28pCit7CisJdW5zaWduZWQgaW50IGRhdGE7CisJdW5zaWduZWQgaW50IGlkc2FfbW9kZSA9IDA7CisJdW5zaWduZWQgaW50IHNtNF9tb2RlID0gMDsKKwl1bnNpZ25lZCBpbnQgY2JjX2Rpc2FibGUgPSAwOworCXVuc2lnbmVkIGludCBkZXNfZW5hYmxlID0gMDsKKwl1bnNpZ25lZCBpbnQgYWVzX2VuYWJsZSA9IDA7CisJdW5zaWduZWQgaW50IGRlczJfa2V5X2VuZGlhbiA9IDA7CisJdW5zaWduZWQgaW50IGRlczJfaW5fZW5kaWFuID0gMDsKKwl1bnNpZ25lZCBpbnQgZGVzMl9jZmcgPSAwOworCXVuc2lnbmVkIGludCBkZXMyX2VuYWJsZSA9IDA7CisKKwlwcl9kYmcoIiVzIG1vZGU6JWQsYWxvZzolZFxuIixfX0ZVTkNUSU9OX18sbW9kZSxhbGdvKTsKKworCWlmIChnZXRfY3B1X3R5cGUoKSA8IE1FU09OX0NQVV9NQUpPUl9JRF9TTTEpIHsKKwkJV1JJVEVfTVBFR19SRUcoQ0lQTFVTX0VORElBTiwKKwkJCQkoMTUgPDwgQUVTX01TR19PVVRfRU5ESUFOKQorCQkJCXwgKDE1IDw8IEFFU19NU0dfSU5fRU5ESUFOKQorCQkJCXwgKGtleV9lbmRpYW4gPDwgQUVTX0tFWV9FTkRJQU4pCisJCQkJfAorCQkJCSgxNSA8PCBERVNfTVNHX09VVF9FTkRJQU4pCisJCQkJfCAoMTUgPDwgREVTX01TR19JTl9FTkRJQU4pCisJCQkJfCAoa2V5X2VuZGlhbiA8PCBERVNfS0VZX0VORElBTikKKwkJCQkpOworCX0gZWxzZSBpZiAoYWxnbyA9PSBBTEdPX0RFUyl7CisJCVdSSVRFX01QRUdfUkVHKENJUExVU19FTkRJQU4sCisJCQkJKDE1IDw8IEFFU19JVl9FTkRJQU4pCisJCQkJfCAoNyA8PCBBRVNfTVNHX09VVF9FTkRJQU4pCisJCQkJfCAoMTUgPDwgQUVTX01TR19JTl9FTkRJQU4pCisJCQkJfCAoMTUgPDwgQUVTX0tFWV9FTkRJQU4pCisJCQkJKTsKKwkJcHJfaW5mKCJDSVBMVVNfRU5ESUFOIGlzIDB4JXhcbiIsIFJFQURfTVBFR19SRUcoQ0lQTFVTX0VORElBTikpOworCX0gZWxzZSB7CisJCVdSSVRFX01QRUdfUkVHKENJUExVU19FTkRJQU4sIDApOworCX0KKworCWRhdGEgPSBSRUFEX01QRUdfUkVHKENJUExVU19FTkRJQU4pOworCisJaWYgKGFsZ28gPT0gQUxHT19TTTQpIHsKKwkJc200X21vZGUgPSAxOworCX0gZWxzZSBpZiAoYWxnbyA9PSAgQUxHT19BRVMpeworCQlhZXNfZW5hYmxlID0gMTsKKwl9IGVsc2UgeworCQlpZiAoZ2V0X2NwdV90eXBlKCkgPCBNRVNPTl9DUFVfTUFKT1JfSURfU00xKSB7CisJCQlkZXNfZW5hYmxlID0gMTsKKwkJfSBlbHNlIHsKKwkJCWRlczJfa2V5X2VuZGlhbiA9IDg7CisJCQlkZXMyX2luX2VuZGlhbiA9IDg7CisJCQlkZXMyX2NmZyA9IDI7CisJCQlkZXMyX2VuYWJsZSA9IDE7CisJCQlhZXNfZW5hYmxlID0gMTsKKwkJfQorCX0KKworCWlmIChtb2RlID09IElEU0FfTU9ERSkgeworCQlpZHNhX21vZGUgPSAxOworCQljYmNfZGlzYWJsZSA9IDA7CisJfSBlbHNlIGlmIChtb2RlID09IENCQ19NT0RFKSB7CisJCWNiY19kaXNhYmxlID0gMDsKKwl9IGVsc2UgeworCQljYmNfZGlzYWJsZSA9IDE7CisJfQorCXByX2RiZygiaWRzYV9tb2RlOiVkIHNtNF9tb2RlOiVkIGNiY19kaXNhYmxlOiVkIGFlc19lbmFibGU6JWQgZGVzX2VuYWJsZTolZFxuIiwgXAorCQlpZHNhX21vZGUsc200X21vZGUsY2JjX2Rpc2FibGUsYWVzX2VuYWJsZSxkZXNfZW5hYmxlKTsKKworCWRhdGEgPSAgKGlkc2FfbW9kZSA8PCBJRFNBX01PREVfQklUKSB8CisJCQkoc200X21vZGUgPDwgU000X01PREUgKSB8CisJCQkoZGVzMl9rZXlfZW5kaWFuIDw8IERFUzJfS0VZX0VORElBTikgfAorCQkJKGRlczJfaW5fZW5kaWFuIDw8IERFUzJfSU5fRU5ESUFOKSB8CisJCQkoZGVzMl9jZmcgPDwgREVTMl9DRkcpIHwKKwkJCShkZXMyX2VuYWJsZSA8PCBERVMyX0VOKSB8CisJCQkoY2JjX2Rpc2FibGUgPDwgQUVTX0NCQ19ESVNBQkxFKSB8CisJCQkvKjEgPDwgQUVTX0NCQ19ESVNBQkxFICAgICA6IEVDQgorCQkJICowIDw8IEFFU19DQkNfRElTQUJMRSAgICAgOiBDQkMKKwkJCSAqLworCQkJKDEgPDwgQ05UTF9FTkFCTEUpIHwKKwkJCShhZXNfZW5hYmxlIDw8IEFFU19FTikgfAorCQkJKGRlc19lbmFibGUgPDwgREVTX0VOKTsKKworCVdSSVRFX01QRUdfUkVHKENJUExVU19DT05GSUcsIGRhdGEpOworCWRhdGEgPSBSRUFEX01QRUdfUkVHKENJUExVU19DT05GSUcpOworCXByX2RiZygiQ0lQTFVTX0NPTkZJRyBpcyAweCV4XG4iLGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBzZXRfZmVjX2NvcmVfc2VsIChzdHJ1Y3QgYW1sX2R2YiAqZHZiKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IERNWF9ERVZfQ09VTlQ7IGkgKyspIHsKKwkJaW50IHNldCA9IDA7CisJCXUzMiBjdHJsID0gRE1YX1JFQURfUkVHKGksIEZFQ19JTlBVVF9DT05UUk9MKTsKKworCQlpZiAoKGR2Yi0+ZHNjWzBdLmRzdCAhPSAtMSkgJiYgKGR2Yi0+ZHNjWzBdLmRzdCAtIEFNX1RTX1NSQ19ETVgwID09IGkpKSB7CisJCQlzZXQgPSAxOworCQl9IGVsc2UgaWYgKChkdmItPmRzY1sxXS5kc3QgIT0gLTEpICYmIChkdmItPmRzY1sxXS5kc3QgLSBBTV9UU19TUkNfRE1YMCA9PSBpKSkgeworCQkJc2V0ID0gMTsKKwkJfSBlbHNlIHsKKwkJCXUzMiBjZmcgPSBSRUFEX01QRUdfUkVHKENJUExVU19DT05GSUcpOworCisJCQlpZiAoY2ZnICYgKDEgPDwgQ05UTF9FTkFCTEUpKSB7CisJCQkJaWYgKCFjaXBsdXNfb3V0X2F1dG9fbW9kZSkgeworCQkJCQlpZiAoY2lwbHVzX291dF9zZWwgJiAoMSA8PCBpKSkKKwkJCQkJCXNldCA9IDE7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKHNldCkgeworCQkJY3RybCB8PSAoMSA8PCBGRUNfQ09SRV9TRUwpOworCQl9IGVsc2UgeworCQkJY3RybCAmPSB+KDEgPDwgRkVDX0NPUkVfU0VMKTsKKwkJfQorCisJCURNWF9XUklURV9SRUcoaSwgRkVDX0lOUFVUX0NPTlRST0wsIGN0cmwpOworCX0KK30KKworLyoKKyAqIFNldCBvdXRwdXQgdG8gZGVtdXggc2V0LgorICovCitzdGF0aWMgdm9pZCBhbV9jaV9wbHVzX3NldF9vdXRwdXQoc3RydWN0IGFtbF9kc2NfY2hhbm5lbCAqY2gpCit7CisJc3RydWN0IGFtbF9kc2MgKmRzYyA9IGNoLT5kc2M7CisJc3RydWN0IGFtbF9kdmIgKmR2YiA9IGRzYy0+ZHZiOworCXUzMiBkYXRhOworCXUzMiBpbiA9IDAsIG91dCA9IDA7CisJaW50IHNldCA9IDA7CisKKwlpZiAoZHNjLT5pZCAhPSAwKSB7CisJCXByX2Vycm9yKCJDaXBsdXMgc2V0IG91dHB1dCBjYW4gb25seSB3b3JrIGF0IGRzYzAgZGV2aWNlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAoZHNjLT5zb3VyY2UpIHsKKwljYXNlICBBTV9UU19TUkNfRE1YMDoKKwkJaW4gPSAwOworCQlicmVhazsKKwljYXNlICBBTV9UU19TUkNfRE1YMToKKwkJaW4gPSAxOworCQlicmVhazsKKwljYXNlICBBTV9UU19TUkNfRE1YMjoKKwkJaW4gPSAyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpZiAoY2lwbHVzX291dF9hdXRvX21vZGUgPT0gMSkgeworCQlzd2l0Y2ggKGRzYy0+ZHN0KSB7CisJCWNhc2UgIEFNX1RTX1NSQ19ETVgwOgorCQkJb3V0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICBBTV9UU19TUkNfRE1YMToKKwkJCW91dCA9IDI7CisJCQlicmVhazsKKwkJY2FzZSAgQU1fVFNfU1JDX0RNWDI6CisJCQlvdXQgPSA0OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlzZXQgPSAxOworCQljaXBsdXNfb3V0X3NlbCA9IG91dDsKKwl9IGVsc2UgaWYgKGNpcGx1c19vdXRfc2VsID49IDAgJiYgY2lwbHVzX291dF9zZWwgPD0gNykgeworCQlzZXQgPSAxOworCQlvdXQgPSBjaXBsdXNfb3V0X3NlbDsKKwl9IGVsc2UgeworCQlwcl9lcnJvcigiZHNjIGNpcGx1cyBvdXQgY29uZmlnIGlzIGludmFsaWRcbiIpOworCX0KKworCWlmIChzZXQpIHsKKwkJLyogU2V0IGNpcGx1cyBpbnB1dCBzb3VyY2UgLAorCQkgKiBvdXRwdXQgc2V0IDAgbWVhbnMgbm8gb3V0cHV0LiAtLS0+IG5lZWQgY29uZmlybS4KKwkJICogaWYgb3V0cHV0IHNldCAwIHN0aWxsIGFmZmVjdHMgZHNjIG91dHB1dCwgd2UgbmVlZCB0byBkaXNhYmxlCisJCSAqIGNpcGx1cyBtb2R1bGUuCisJCSAqLworCQlkYXRhID0gUkVBRF9NUEVHX1JFRyhTVEJfVE9QX0NPTkZJRyk7CisJCWRhdGEgJj0gfigzPDxDSVBMVVNfSU5fU0VMKTsKKwkJZGF0YSB8PSBpbiA8PCBDSVBMVVNfSU5fU0VMOworCQlkYXRhICY9IH4oNzw8Q0lQTFVTX09VVF9TRUwpOworCQlkYXRhIHw9IG91dCA8PCBDSVBMVVNfT1VUX1NFTDsKKwkJV1JJVEVfTVBFR19SRUcoU1RCX1RPUF9DT05GSUcsIGRhdGEpOworCQlwcl9pbmYoImRzYyBjaXBsdXMgaW5bJXhdIG91dFsleF0gJXNcbiIsIGluLCBvdXQsCisJCQkoY2lwbHVzX291dF9hdXRvX21vZGUpID8gIiIgOiAiZm9yY2UiKTsKKworCQlzZXRfZmVjX2NvcmVfc2VsKGR2Yik7CisJfQorfQorCisjaWYgMAorLyoKKyAqIENpcGx1cyBvdXRwdXQgaGFzIGhpZ2ggcHJpb3JpdHksCisgKiBkaXNhYmxlIGl0J3Mgb3V0cHV0IHdpbGwgbGV0IGRzYyBvdXRwdXQgZ28uCisgKi8KK3N0YXRpYyB2b2lkIGFtbF9jaV9wbHVzX2Rpc2FibGVfb3V0cHV0KHZvaWQpCit7CisJdTMyIGRhdGEgPSAwOworCisJZGF0YSA9IFJFQURfTVBFR19SRUcoU1RCX1RPUF9DT05GSUcpOworCVdSSVRFX01QRUdfUkVHKFNUQl9UT1BfQ09ORklHLCBkYXRhICYKKwkJCX4oNyA8PCBDSVBMVVNfT1VUX1NFTCkpOworfQorCitzdGF0aWMgdm9pZCBhbWxfY2lfcGx1c19lbmFibGUodm9pZCkKK3sKKwl1MzIgZGF0YSA9IDA7CisKKwlkYXRhID0gUkVBRF9NUEVHX1JFRyhTVEJfVE9QX0NPTkZJRyk7CisJV1JJVEVfTVBFR19SRUcoQ0lQTFVTX0NPTkZJRywKKwkJCSgxIDw8IENOVExfRU5BQkxFKQorCQkJfCAoMSA8PCBBRVNfRU4pCisJCQl8ICgxIDw8IERFU19FTikpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGFtbF9jaV9wbHVzX2Rpc2FibGUodm9pZCkKK3sKKwl1MzIgZGF0YSA9IDA7CisKKwlXUklURV9NUEVHX1JFRyhDSVBMVVNfQ09ORklHLCAwKTsKKworCWRhdGEgPSBSRUFEX01QRUdfUkVHKFNUQl9UT1BfQ09ORklHKTsKKwlXUklURV9NUEVHX1JFRyhTVEJfVE9QX0NPTkZJRywgZGF0YSAmCisJCQl+KCgxIDw8IENJUExVU19JTl9TRUwpIHwgKDcgPDwgQ0lQTFVTX09VVF9TRUwpKSk7Cit9CisKK3N0YXRpYyBpbnQgZHNjX3NldF9hZXNfZGVzX3NtNF9rZXkoc3RydWN0IGFtbF9kc2NfY2hhbm5lbCAqY2gsIGludCBmbGFncywKKwkJCWVudW0gY2FfY3dfdHlwZSB0eXBlLCB1OCAqa2V5KQoreworCXVuc2lnbmVkIGludCBrMCwgazEsIGsyLCBrMzsKKwlpbnQgaXYgPSAwLCBhZXMgPSAwLCBkZXMgPSAwOworCWludCBhYl9pdiA9IDAsIGFiX2FlcyA9IDAsIGFiX2RlcyA9IDA7CisJaW50IGZyb21fa2wgPSBmbGFncyAmIENBX0NXX0ZST01fS0w7CisJaW50IGFsZ28gPSAwOworCisJaWYgKCFmcm9tX2tsKSB7CisJCWlmIChnZXRfY3B1X3R5cGUoKSA8IE1FU09OX0NQVV9NQUpPUl9JRF9TTTEpIHsKKwkJazMgPSAoa2V5WzBdIDw8IDI0KSB8IChrZXlbMV0gPDwgMTYpIHwgKGtleVsyXSA8PCA4KSB8IGtleVszXTsKKwkJazIgPSAoa2V5WzRdIDw8IDI0KSB8IChrZXlbNV0gPDwgMTYpIHwgKGtleVs2XSA8PCA4KSB8IGtleVs3XTsKKwkJazEgPSAoa2V5WzhdIDw8IDI0KSB8IChrZXlbOV0gPDwgMTYpIHwgKGtleVsxMF0gPDwgOCkgfCBrZXlbMTFdOworCQlrMCA9IChrZXlbMTJdIDw8IDI0KSB8IChrZXlbMTNdIDw8IDE2KQorCQkJfCAoa2V5WzE0XSA8PCA4KSB8IGtleVsxNV07CisJCX0gZWxzZSB7CisJCWswID0gKGtleVswXSkgfCAoa2V5WzFdIDw8IDgpIHwgKGtleVsyXSA8PCAxNikgfCAoa2V5WzNdIDw8IDI0KTsKKwkJazEgPSAoa2V5WzRdKSB8IChrZXlbNV0gPDwgOCkgfCAoa2V5WzZdIDw8IDE2KSB8IChrZXlbN10gPDwgMjQpOworCQlrMiA9IChrZXlbOF0pIHwgKGtleVs5XSA8PCA4KSB8IChrZXlbMTBdIDw8IDE2KXwgKGtleVsxMV0gPDwgMjQpOworCQlrMyA9IChrZXlbMTJdKXwgKGtleVsxM10gPDwgOCl8IChrZXlbMTRdIDw8IDE2KXwgKGtleVsxNV0gPDwgMjQpOworCQl9CisJfSBlbHNlCisJCWswID0gazEgPSBrMiA9IGszID0gMDsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgQ0FfQ1dfQUVTX0VWRU46CisJY2FzZSBDQV9DV19TTTRfRVZFTjoKKwkJYWJfYWVzID0gKGZyb21fa2wpID8gMHgyIDogMHgxOworCQlpZiAoY2gtPm1vZGUgPT0gLTEpCisJCQljaC0+bW9kZSA9IEVDQl9NT0RFOworCQlhZXMgPSAxOworCQlpZiAodHlwZSA9PSBDQV9DV19BRVNfRVZFTikKKwkJCWFsZ28gPSBBTEdPX0FFUzsKKwkJZWxzZQorCQkJYWxnbyA9IEFMR09fU000OworCQlicmVhazsKKwljYXNlIENBX0NXX0FFU19PREQ6CisJY2FzZSBDQV9DV19TTTRfT0REOgorCQlhYl9hZXMgPSAoZnJvbV9rbCkgPyAweDEgOiAweDI7CisJCWlmIChjaC0+bW9kZSA9PSAtMSkKKwkJCWNoLT5tb2RlID0gRUNCX01PREU7CisJCWFlcyA9IDE7CisJCWlmICh0eXBlID09IENBX0NXX0FFU19PREQpCisJCQlhbGdvID0gQUxHT19BRVM7CisJCWVsc2UKKwkJCWFsZ28gPSBBTEdPX1NNNDsKKwkJYnJlYWs7CisJY2FzZSBDQV9DV19BRVNfRVZFTl9JVjoKKwljYXNlIENBX0NXX1NNNF9FVkVOX0lWOgorCQlhYl9pdiA9IDB4MTsKKwkJaWYgKGNoLT5tb2RlID09IC0xKQorCQkJY2gtPm1vZGUgPSBDQkNfTU9ERTsKKwkJaXYgPSAxOworCQlpZiAodHlwZSA9PSBDQV9DV19BRVNfRVZFTl9JVikKKwkJCWFsZ28gPSBBTEdPX0FFUzsKKwkJZWxzZQorCQkJYWxnbyA9IEFMR09fU000OworCQlicmVhazsKKwljYXNlIENBX0NXX0FFU19PRERfSVY6CisJY2FzZSBDQV9DV19TTTRfT0REX0lWOgorCQlhYl9pdiA9IDB4MjsKKwkJaWYgKGNoLT5tb2RlID09IC0xKQorCQkJY2gtPm1vZGUgPSBDQkNfTU9ERTsKKwkJaXYgPSAxOworCQlpZiAodHlwZSA9PSBDQV9DV19BRVNfT0REX0lWKQorCQkJYWxnbyA9IEFMR09fQUVTOworCQllbHNlCisJCQlhbGdvID0gQUxHT19TTTQ7CisJCWJyZWFrOworCWNhc2UgQ0FfQ1dfREVTX0VWRU46CisJCWlmIChnZXRfY3B1X3R5cGUoKSA8IE1FU09OX0NQVV9NQUpPUl9JRF9TTTEpIHsKKwkJCWFiX2RlcyA9IDB4MTsKKwkJfSBlbHNlIHsKKwkJCWFiX2FlcyA9IDB4MTsKKwkJfQorCQljaC0+bW9kZSA9IEVDQl9NT0RFOworCQlkZXMgPSAxOworCQlhbGdvID0gQUxHT19ERVM7CisJCWJyZWFrOworCWNhc2UgQ0FfQ1dfREVTX09ERDoKKwkJaWYgKGdldF9jcHVfdHlwZSgpIDwgTUVTT05fQ1BVX01BSk9SX0lEX1NNMSkgeworCQkJYWJfZGVzID0gMHgyOworCQl9IGVsc2UgeworCQkJYWJfYWVzID0gMHgyOworCQl9CisJCWNoLT5tb2RlID0gRUNCX01PREU7CisJCWFsZ28gPSBBTEdPX0RFUzsKKwkJZGVzID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyogU2V0IGVuZGlhbiBhbmQgY2JjL2VjYiBtb2RlICovCisJaWYgKGZyb21fa2wpCisJCWFtbF9jaV9wbHVzX2NvbmZpZyg3LCBjaC0+bW9kZSwgYWxnbyk7CisJZWxzZQorCQlhbWxfY2lfcGx1c19jb25maWcoMCwgY2gtPm1vZGUsIGFsZ28pOworCisJLyogV3JpdGUga2V5cyB0byB3b3JrICovCisJaWYgKGl2IHx8IGFlcykgeworCQlXUklURV9NUEVHX1JFRyhDSVBMVVNfS0VZMCwgazApOworCQlXUklURV9NUEVHX1JFRyhDSVBMVVNfS0VZMSwgazEpOworCQlXUklURV9NUEVHX1JFRyhDSVBMVVNfS0VZMiwgazIpOworCQlXUklURV9NUEVHX1JFRyhDSVBMVVNfS0VZMywgazMpOworCX0gZWxzZSB7LypkZXMqLworCQlXUklURV9NUEVHX1JFRyhDSVBMVVNfS0VZMCwgazIpOworCQlXUklURV9NUEVHX1JFRyhDSVBMVVNfS0VZMSwgazMpOworCQlXUklURV9NUEVHX1JFRyhDSVBMVVNfS0VZMiwgMCk7CisJCVdSSVRFX01QRUdfUkVHKENJUExVU19LRVkzLCAwKTsKKwl9CisJV1JJVEVfTVBFR19SRUcoQ0lQTFVTX0tFWV9XUiwKKwkJKGNoLT5pZCA8PCA5KSB8CisJCQkJLyogYml0WzExOjldIHRoZSBrZXkgb2YgaW5kZXgsCisJCQkJCW5lZWQgbWF0Y2ggUElEIGluZGV4Ki8KKwkJKChmcm9tX2tsICYmIGRlcykgPyAoMSA8PCA4KSA6IDApIHwKKwkJCQkvKiBiaXRbOF0gZGVzIGtleSB1c2UgY3dbMTI3OjY0XSovCisJCSgwIDw8IDcpIHwgICAgICAvKiBiaXRbN10gYWVzIGl2IHVzZSBjdyovCisJCSgoZnJvbV9rbCAmJiAoYWVzIHx8IGRlcykpID8gKDEgPDwgNikgOiAwKSB8CisJCQkJLyogYml0WzZdIGFlcy9kZXMga2V5IHVzZSBjdyovCisJCQkJLyogYml0WzVdIHdyaXRlIEFFUyBJViBCIHZhbHVlKi8KKwkJKGFiX2l2IDw8IDQpIHwgIC8qIGJpdFs0XSB3cml0ZSBBRVMgSVYgQSB2YWx1ZSovCisJCQkJLyogYml0WzNdIHdyaXRlIEFFUyBCIGtleSovCisJCShhYl9hZXMgPDwgMikgfCAvKiBiaXRbMl0gd3JpdGUgQUVTIEEga2V5Ki8KKwkJCQkvKiBiaXRbMV0gd3JpdGUgREVTIEIga2V5Ki8KKwkJKGFiX2RlcykpOyAgICAgIC8qIGJpdFswXSB3cml0ZSBERVMgQSBrZXkqLworCisJLyoKKwlwcl9pbmYoIms6JTA4eDolMDh4OiUwOHg6JTA4eCBrbDolZCBhZXM6JWQgZGVzOiVkIGFiX2l2OiVkIGFiX2FlczolZCBhYl9kZXM6JWQgaWQ6JWQgbW9kOiVkXG4iLAorCQlrMCwgazEsIGsyLCBrMywKKwkJZnJvbV9rbCwgYWVzLCBkZXMsIGFiX2l2LCBhYl9hZXMsIGFiX2RlcywgY2gtPmlkLCBjaC0+YWVzX21vZGUpOworCSovCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZHNjX3JlbGVhc2Uodm9pZCkKK3sKKwkvL2FtbF9jaV9wbHVzX2Rpc2FibGUoKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqIEFFUyBERVNDKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzZXRfY2lwbHVzX2lucHV0X3NvdXJjZShzdHJ1Y3QgYW1sX2RzYyAqZHNjKQoreworCXUzMiBkYXRhOworCXUzMiBpbiA9IDA7CisKKwlpZiAoZHNjLT5pZCAhPSAwKSB7CisJCXByX2Vycm9yKCJDaXBsdXMgc2V0IG91dHB1dCBjYW4gb25seSB3b3JrIGF0IGRzYzAgZGV2aWNlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAoZHNjLT5zb3VyY2UpIHsKKwljYXNlICBBTV9UU19TUkNfRE1YMDoKKwkJaW4gPSAwOworCQlicmVhazsKKwljYXNlICBBTV9UU19TUkNfRE1YMToKKwkJaW4gPSAxOworCQlicmVhazsKKwljYXNlICBBTV9UU19TUkNfRE1YMjoKKwkJaW4gPSAyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpZiAoY2lwbHVzX291dF9hdXRvX21vZGUgPT0gMSkgeworCQkvKiBTZXQgY2lwbHVzIGlucHV0IHNvdXJjZSAqLworCQlkYXRhID0gUkVBRF9NUEVHX1JFRyhTVEJfVE9QX0NPTkZJRyk7CisJCWRhdGEgJj0gfigzPDxDSVBMVVNfSU5fU0VMKTsKKwkJZGF0YSB8PSBpbiA8PCBDSVBMVVNfSU5fU0VMOworCQlXUklURV9NUEVHX1JFRyhTVEJfVE9QX0NPTkZJRywgZGF0YSk7CisJCXByX2luZigiZHNjIGNpcGx1cyBpblsleF1cbiIsIGluKTsKKwl9Cit9CisKK2ludCBkc2NfZW5hYmxlKHN0cnVjdCBhbWxfZHNjICpkc2MsIGludCBlbmFibGUpCit7CisJaWYgKGRzYy0+aWQgPT0gMCkgeworCQlXUklURV9NUEVHX1JFRyhTVEJfVE9QX0NPTkZJRywKKwkJCVJFQURfTVBFR19SRUcoU1RCX1RPUF9DT05GSUcpICYKKwkJCQl+KCgweDExIDw8IERFU19JTlBVVF9TRUwpfAorCQkJCSgxIDw8IEVOQUJMRV9ERVNfUEwpfAorCQkJCSgxIDw8IEVOQUJMRV9ERVNfUExfQ0xLKSkpOworCX0gZWxzZSBpZiAoZHNjLT5pZCA9PSAxKSB7CisJCVdSSVRFX01QRUdfUkVHKENPTU1fREVTQ18yX0NUTCwgMCk7CisJfQorCXJldHVybiAwOworfQorCisvKlNldCBzZWN0aW9uIGJ1ZmZlciovCitzdGF0aWMgaW50IGRteF9hbGxvY19zZWNfYnVmZmVyKHN0cnVjdCBhbWxfZG14ICpkbXgpCit7CisJdW5zaWduZWQgbG9uZyBiYXNlOworCXVuc2lnbmVkIGxvbmcgZ3JwX2FkZHJbU0VDX0JVRl9HUlBfQ09VTlRdOworCWludCBncnBfbGVuW1NFQ19CVUZfR1JQX0NPVU5UXTsKKwlpbnQgaTsKKworCWlmIChkbXgtPnNlY19wYWdlcykKKwkJcmV0dXJuIDA7CisKKwlncnBfbGVuWzBdID0gKDEgPDwgU0VDX0dSUF9MRU5fMCkgKiA4OworCWdycF9sZW5bMV0gPSAoMSA8PCBTRUNfR1JQX0xFTl8xKSAqIDg7CisJZ3JwX2xlblsyXSA9ICgxIDw8IFNFQ19HUlBfTEVOXzIpICogODsKKwlncnBfbGVuWzNdID0gKDEgPDwgU0VDX0dSUF9MRU5fMykgKiA4OworCisJZG14LT5zZWNfdG90YWxfbGVuID0gZ3JwX2xlblswXSArIGdycF9sZW5bMV0gKyBncnBfbGVuWzJdICsgZ3JwX2xlblszXTsKKwlkbXgtPnNlY19wYWdlcyA9CisJICAgIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgZ2V0X29yZGVyKGRteC0+c2VjX3RvdGFsX2xlbikpOworCWlmICghZG14LT5zZWNfcGFnZXMpIHsKKwkJcHJfZXJyb3IoImNhbm5vdCBhbGxvY2F0ZSBzZWN0aW9uIGJ1ZmZlciAlZCBieXRlcyAlZCBvcmRlclxuIiwKKwkJCSBkbXgtPnNlY190b3RhbF9sZW4sIGdldF9vcmRlcihkbXgtPnNlY190b3RhbF9sZW4pKTsKKwkJcmV0dXJuIC0xOworCX0KKwlkbXgtPnNlY19wYWdlc19tYXAgPQorCSAgICBkbWFfbWFwX3NpbmdsZShkbXhfZ2V0X2RldihkbXgpLCAodm9pZCAqKWRteC0+c2VjX3BhZ2VzLAorCQkJCQkgZG14LT5zZWNfdG90YWxfbGVuLCBETUFfRlJPTV9ERVZJQ0UpOworCisJZ3JwX2FkZHJbMF0gPSBkbXgtPnNlY19wYWdlc19tYXA7CisKKwlncnBfYWRkclsxXSA9IGdycF9hZGRyWzBdICsgZ3JwX2xlblswXTsKKwlncnBfYWRkclsyXSA9IGdycF9hZGRyWzFdICsgZ3JwX2xlblsxXTsKKwlncnBfYWRkclszXSA9IGdycF9hZGRyWzJdICsgZ3JwX2xlblsyXTsKKworCWRteC0+c2VjX2J1ZlswXS5hZGRyID0gZG14LT5zZWNfcGFnZXM7CisJZG14LT5zZWNfYnVmWzBdLmxlbiA9IGdycF9sZW5bMF0gLyA4OworCisJZm9yIChpID0gMTsgaSA8IFNFQ19CVUZfQ09VTlQ7IGkrKykgeworCQlkbXgtPnNlY19idWZbaV0uYWRkciA9CisJCSAgICBkbXgtPnNlY19idWZbaSAtIDFdLmFkZHIgKyBkbXgtPnNlY19idWZbaSAtIDFdLmxlbjsKKwkJZG14LT5zZWNfYnVmW2ldLmxlbiA9IGdycF9sZW5baSAvIDhdIC8gODsKKwl9CisKKwliYXNlID0gZ3JwX2FkZHJbMF0gJiAweEZGRkYwMDAwOworCURNWF9XUklURV9SRUcoZG14LT5pZCwgU0VDX0JVRkZfQkFTRSwgYmFzZSA+PiAxNik7CisJRE1YX1dSSVRFX1JFRyhkbXgtPmlkLCBTRUNfQlVGRl8wMV9TVEFSVCwKKwkJICAgICAgKCgoZ3JwX2FkZHJbMF0gLSBiYXNlKSA+PiA4KSA8PCAxNikgfAorCQkgICAgICAgKChncnBfYWRkclsxXSAtIGJhc2UpID4+IDgpKTsKKwlETVhfV1JJVEVfUkVHKGRteC0+aWQsIFNFQ19CVUZGXzIzX1NUQVJULAorCQkgICAgICAoKChncnBfYWRkclsyXSAtIGJhc2UpID4+IDgpIDw8IDE2KSB8CisJCSAgICAgICAoKGdycF9hZGRyWzNdIC0gYmFzZSkgPj4gOCkpOworCURNWF9XUklURV9SRUcoZG14LT5pZCwgU0VDX0JVRkZfU0laRSwKKwkJCVNFQ19HUlBfTEVOXzAgfAorCQkJKFNFQ19HUlBfTEVOXzEgPDwgNCkgfAorCQkJKFNFQ19HUlBfTEVOXzIgPDwgOCkgfAorCQkJKFNFQ19HUlBfTEVOXzMgPDwgMTIpKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgTk9fU1VCCisvKlNldCBzdWJ0aXRsZSBidWZmZXIqLworc3RhdGljIGludCBkbXhfYWxsb2Nfc3ViX2J1ZmZlcihzdHJ1Y3QgYW1sX2R2YiAqZHZiLCBzdHJ1Y3QgYW1sX2RteCAqZG14KQoreworI2lmZGVmIFNVQl9CVUZfRE1YCisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJaWYgKGRteC0+c3ViX3BhZ2VzKQorCQlyZXR1cm4gMDsKKworCS8qY2hlY2sgaWYgdXNlIHNoYXJlZCBidWYqLworCWlmIChkdmItPnN1Yl9wYWdlcykgeworCQlkbXgtPnN1Yl9wYWdlcyA9IGR2Yi0+c3ViX3BhZ2VzOworCQlkbXgtPnN1Yl9idWZfbGVuID0gZHZiLT5zdWJfYnVmX2xlbjsKKwkJZG14LT5zdWJfcGFnZXNfbWFwID0gZHZiLT5zdWJfcGFnZXNfbWFwOworCQlnb3RvIGVuZF9hbGxvYzsKKwl9CisKKwlkbXgtPnN1Yl9idWZfbGVuID0gNjQgKiAxMDI0OworCWRteC0+c3ViX3BhZ2VzID0KKwkgICAgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBnZXRfb3JkZXIoZG14LT5zdWJfYnVmX2xlbikpOworCWlmICghZG14LT5zdWJfcGFnZXMpIHsKKwkJcHJfZXJyb3IoImNhbm5vdCBhbGxvY2F0ZSBzdWJ0aXRsZSBidWZmZXJcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWRteC0+c3ViX3BhZ2VzX21hcCA9CisJICAgIGRtYV9tYXBfc2luZ2xlKGRteF9nZXRfZGV2KGRteCksICh2b2lkICopZG14LT5zdWJfcGFnZXMsCisJCQkJCWRteC0+c3ViX2J1Zl9sZW4sIERNQV9GUk9NX0RFVklDRSk7CisKK2VuZF9hbGxvYzoKKwlhZGRyID0gdmlydF90b19waHlzKCh2b2lkICopZG14LT5zdWJfcGFnZXMpOworI2lmbmRlZiBTVUJfUEFSU0VSCisJRE1YX1dSSVRFX1JFRyhkbXgtPmlkLCBTQl9TVEFSVCwgYWRkciA+PiAxMik7CisJRE1YX1dSSVRFX1JFRyhkbXgtPmlkLCBTQl9MQVNUX0FERFIsIChkbXgtPnN1Yl9idWZfbGVuID4+IDMpIC0gMSk7CisjZW5kaWYKKwlpZiAoZG14LT5zdWJfcGFnZXMgIT0gZHZiLT5zdWJfcGFnZXMpIHsKKwkJcHJfZGJnKCJzdWIgYnVmZjogKCVkKSAlbHggJXhcbiIsCisJCQlkbXgtPmlkLCBhZGRyLCBkbXgtPnN1Yl9idWZfbGVuKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKyNpZmRlZiBTVUJfQlVGX1NIQVJFRAorc3RhdGljIGludCBkbXhfYWxsb2Nfc3ViX2J1ZmZlcl9zaGFyZWQoc3RydWN0IGFtbF9kdmIgKmR2YikKK3sKKyNpZmRlZiBTVUJfQlVGX0RNWAorCWlmIChkdmItPnN1Yl9wYWdlcykKKwkJcmV0dXJuIDA7CisKKwlkdmItPnN1Yl9idWZfbGVuID0gNjQgKiAxMDI0OworCWR2Yi0+c3ViX3BhZ2VzID0KKwkgICAgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBnZXRfb3JkZXIoZHZiLT5zdWJfYnVmX2xlbikpOworCWlmICghZHZiLT5zdWJfcGFnZXMpIHsKKwkJcHJfZXJyb3IoImNhbm5vdCBhbGxvY2F0ZSBzdWJ0aXRsZSBidWZmZXJcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWR2Yi0+c3ViX3BhZ2VzX21hcCA9CisJICAgIGRtYV9tYXBfc2luZ2xlKGR2Yi0+ZGV2LCAodm9pZCAqKWR2Yi0+c3ViX3BhZ2VzLAorCQkJCQlkdmItPnN1Yl9idWZfbGVuLCBETUFfRlJPTV9ERVZJQ0UpOworCisJcHJfZGJnKCJzdWIgYnVmZiBzaGFyZWQ6ICVseCAleFxuIiwKKwkJKHVuc2lnbmVkIGxvbmcpdmlydF90b19waHlzKCh2b2lkICopZHZiLT5zdWJfcGFnZXMpLAorCQlkdmItPnN1Yl9idWZfbGVuKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorI2VuZGlmCisjZW5kaWYgLypOT19TVUIgKi8KKworLypTZXQgUEVTIGJ1ZmZlciovCitzdGF0aWMgaW50IGRteF9hbGxvY19wZXNfYnVmZmVyKHN0cnVjdCBhbWxfZHZiICpkdmIsIHN0cnVjdCBhbWxfZG14ICpkbXgpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJaWYgKGRteC0+cGVzX3BhZ2VzKQorCQlyZXR1cm4gMDsKKworCS8qY2hlY2sgaWYgdXNlIHNoYXJlZCBidWYqLworCWlmIChkdmItPnBlc19wYWdlcykgeworCQlkbXgtPnBlc19wYWdlcyA9IGR2Yi0+cGVzX3BhZ2VzOworCQlkbXgtPnBlc19idWZfbGVuID0gZHZiLT5wZXNfYnVmX2xlbjsKKwkJZG14LT5wZXNfcGFnZXNfbWFwID0gZHZiLT5wZXNfcGFnZXNfbWFwOworCQlnb3RvIGVuZF9hbGxvYzsKKwl9CisKKwlkbXgtPnBlc19idWZfbGVuID0gNjQgKiAxMDI0OworCWRteC0+cGVzX3BhZ2VzID0KKwkgICAgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBnZXRfb3JkZXIoZG14LT5wZXNfYnVmX2xlbikpOworCWlmICghZG14LT5wZXNfcGFnZXMpIHsKKwkJcHJfZXJyb3IoImNhbm5vdCBhbGxvY2F0ZSBwZXMgYnVmZmVyXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlkbXgtPnBlc19wYWdlc19tYXAgPQorCSAgICBkbWFfbWFwX3NpbmdsZShkbXhfZ2V0X2RldihkbXgpLCAodm9pZCAqKWRteC0+cGVzX3BhZ2VzLAorCQkJCQlkbXgtPnBlc19idWZfbGVuLCBETUFfRlJPTV9ERVZJQ0UpOworZW5kX2FsbG9jOgorCWFkZHIgPSB2aXJ0X3RvX3BoeXMoKHZvaWQgKilkbXgtPnBlc19wYWdlcyk7CisJRE1YX1dSSVRFX1JFRyhkbXgtPmlkLCBPQl9TVEFSVCwgYWRkciA+PiAxMik7CisJRE1YX1dSSVRFX1JFRyhkbXgtPmlkLCBPQl9MQVNUX0FERFIsIChkbXgtPnBlc19idWZfbGVuID4+IDMpIC0gMSk7CisKKwlpZiAoZG14LT5wZXNfcGFnZXMgIT0gZHZiLT5wZXNfcGFnZXMpIHsKKwkJcHJfZGJnKCJwZXMgYnVmZjogKCVkKSAlbHggJXhcbiIsCisJCQlkbXgtPmlkLCBhZGRyLCBkbXgtPnBlc19idWZfbGVuKTsKKwl9CisJcmV0dXJuIDA7Cit9CisjaWZkZWYgUEVTX0JVRl9TSEFSRUQKK3N0YXRpYyBpbnQgZG14X2FsbG9jX3Blc19idWZmZXJfc2hhcmVkKHN0cnVjdCBhbWxfZHZiICpkdmIpCit7CisJaWYgKGR2Yi0+cGVzX3BhZ2VzKQorCQlyZXR1cm4gMDsKKworCWR2Yi0+cGVzX2J1Zl9sZW4gPSA2NCAqIDEwMjQ7CisJZHZiLT5wZXNfcGFnZXMgPQorCSAgICBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIGdldF9vcmRlcihkdmItPnBlc19idWZfbGVuKSk7CisJaWYgKCFkdmItPnBlc19wYWdlcykgeworCQlwcl9lcnJvcigiY2Fubm90IGFsbG9jYXRlIHBlcyBidWZmZXJcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWR2Yi0+cGVzX3BhZ2VzX21hcCA9CisJICAgIGRtYV9tYXBfc2luZ2xlKGR2Yi0+ZGV2LCAodm9pZCAqKWR2Yi0+cGVzX3BhZ2VzLAorCQkJCQlkdmItPnBlc19idWZfbGVuLCBETUFfRlJPTV9ERVZJQ0UpOworCisJcHJfZGJnKCJwZXMgYnVmZiBzaGFyZWQ6ICVseCAleFxuIiwKKwkJKHVuc2lnbmVkIGxvbmcpdmlydF90b19waHlzKCh2b2lkICopZHZiLT5wZXNfcGFnZXMpLAorCQlkdmItPnBlc19idWZfbGVuKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKkFsbG9jYXRlIEFTWU5DIEZJRk8gQnVmZmVyKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFzeW5jZmlmb19hbGxvY19idWZmZXIoc3RydWN0IGFtbF9hc3luY2ZpZm8gKmFmaWZvLCBpbnQgbGVuKQoreworCWlmICghYWZpZm8tPnN0b3JlZF9wYWdlcykgeworCQlhZmlmby0+c3RvcmVkX3BhZ2VzID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBnZXRfb3JkZXIobGVuKSk7CisJfQorCisJaWYgKCFhZmlmby0+c3RvcmVkX3BhZ2VzKSB7CisJCXByX2Vycm9yKCJjYW5ub3QgYWxsb2NhdGUgYXN5bmMgZmlmbyBidWZmZXJcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIGFmaWZvLT5zdG9yZWRfcGFnZXM7Cit9CitzdGF0aWMgdm9pZCBhc3luY2ZpZm9fZnJlZV9idWZmZXIodW5zaWduZWQgbG9uZyBidWYsIGludCBsZW4pCit7CisJLy9mcmVlX3BhZ2VzKGJ1ZiwgZ2V0X29yZGVyKGxlbikpOworfQorCitzdGF0aWMgaW50IGFzeW5jZmlmb19zZXRfYnVmZmVyKHN0cnVjdCBhbWxfYXN5bmNmaWZvICphZmlmbywKKwkJCQkJaW50IGxlbiwgdW5zaWduZWQgbG9uZyBidWYpCit7CisJaWYgKGFmaWZvLT5wYWdlcykKKwkJcmV0dXJuIC0xOworCisJYWZpZm8tPmJ1Zl90b2dnbGUgPSAwOworCWFmaWZvLT5idWZfcmVhZCAgID0gMDsKKwlhZmlmby0+YnVmX2xlbiA9IGRteF9nZXRfYWZpZm9fc2l6ZShhZmlmbyk7CisJcHJfZGJnKCJhc3luYyBmaWZvICVkIGJ1ZiAlbHUgYnVmIHNpemUgJWQsIGZsdXNoIHNpemUgJWQsIHNlY3VyZV9lbmFibGUgJWQsIGJsay5hZGRyICV1XG4iLAorCQkJYWZpZm8tPmlkLCBidWYsIGFmaWZvLT5idWZfbGVuLCBhZmlmby0+Zmx1c2hfc2l6ZSwgYWZpZm8tPnNlY3VyZV9lbmFibGUsIGFmaWZvLT5ibGsuYWRkcik7CisKKwlpZiAoKGFmaWZvLT5mbHVzaF9zaXplIDw9IDApCisJCQl8fCAoYWZpZm8tPmZsdXNoX3NpemUgPiAobGVuPj4xKSkpIHsKKwkJYWZpZm8tPmZsdXNoX3NpemUgPSBsZW4+PjE7CisJfSBlbHNlIGlmIChhZmlmby0+Zmx1c2hfc2l6ZSA8IDEyOCkgeworCQlhZmlmby0+Zmx1c2hfc2l6ZSA9IDEyODsKKwl9IGVsc2UgeworCQlpbnQgZnNpemU7CisKKwkJZm9yIChmc2l6ZSA9IDEyODsgZnNpemUgPCAobGVuPj4xKTsgZnNpemUgPDw9IDEpIHsKKwkJCWlmIChmc2l6ZSA+PSBhZmlmby0+Zmx1c2hfc2l6ZSkKKwkJCQlicmVhazsKKwkJfQorCisJCWFmaWZvLT5mbHVzaF9zaXplID0gZnNpemU7CisJfQorCisJYWZpZm8tPnBhZ2VzID0gYnVmOworCWlmICghYWZpZm8tPnBhZ2VzKQorCQlyZXR1cm4gLTE7CisKKwlhZmlmby0+cGFnZXNfbWFwID0gZG1hX21hcF9zaW5nbGUoYXN5bmNmaWZvX2dldF9kZXYoYWZpZm8pLAorCQkJKHZvaWQgKilhZmlmby0+cGFnZXMsIGxlbiwgRE1BX0ZST01fREVWSUNFKTsKKworCXJldHVybiAwOworfQorc3RhdGljIHZvaWQgYXN5bmNmaWZvX3B1dF9idWZmZXIoc3RydWN0IGFtbF9hc3luY2ZpZm8gKmFmaWZvKQoreworCWlmIChhZmlmby0+cGFnZXMpIHsKKwkJZG1hX3VubWFwX3NpbmdsZShhc3luY2ZpZm9fZ2V0X2RldihhZmlmbyksCisJCQlhZmlmby0+cGFnZXNfbWFwLCBhc3luY2ZpZm9fYnVmX2xlbiwgRE1BX0ZST01fREVWSUNFKTsKKwkJYXN5bmNmaWZvX2ZyZWVfYnVmZmVyKGFmaWZvLT5wYWdlcywgYXN5bmNmaWZvX2J1Zl9sZW4pOworCQlhZmlmby0+cGFnZXNfbWFwID0gMDsKKwkJYWZpZm8tPnBhZ2VzID0gMDsKKwl9Cit9CisKK2ludCBhc3luY19maWZvX2luaXQoc3RydWN0IGFtbF9hc3luY2ZpZm8gKmFmaWZvLCBpbnQgaW5pdGlycSwKKwkJCWludCBidWZfbGVuLCB1bnNpZ25lZCBsb25nIGJ1ZikKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaXJxOworCisJaWYgKGFmaWZvLT5pbml0KQorCQlyZXR1cm4gLTE7CisKKwlhZmlmby0+c291cmNlICA9IEFNX0RNWF9NQVg7CisJYWZpZm8tPnBhZ2VzID0gMDsKKwlhZmlmby0+YnVmX3RvZ2dsZSA9IDA7CisJYWZpZm8tPmJ1Zl9yZWFkID0gMDsKKwlhZmlmby0+YnVmX2xlbiA9IDA7CisKKwlpZiAoYWZpZm8tPmFzeW5jZmlmb19pcnEgPT0gLTEpIHsKKwkJcHJfZXJyb3IoIm5vIGlycSBmb3IgQVNZTkNfRklGTyVkXG4iLCBhZmlmby0+aWQpOworCQkvKkRvIG5vdCByZXR1cm4gZXJyb3IqLworCQlyZXR1cm4gLTE7CisJfQorCisJdGFza2xldF9pbml0KCZhZmlmby0+YXN5bmNmaWZvX3Rhc2tsZXQsCisJCQlkdnJfaXJxX2JoX2hhbmRsZXIsICh1bnNpZ25lZCBsb25nKWFmaWZvKTsKKwlpZiAoaW5pdGlycSkKKwkJaXJxID0gcmVxdWVzdF9pcnEoYWZpZm8tPmFzeW5jZmlmb19pcnEsCWR2cl9pcnFfaGFuZGxlciwKKwkJCQlJUlFGX1NIQVJFRHxJUlFGX1RSSUdHRVJfUklTSU5HLAorCQkJCSJkdnIgaXJxIiwgYWZpZm8pOworCWVsc2UKKwkJZW5hYmxlX2lycShhZmlmby0+YXN5bmNmaWZvX2lycSk7CisKKwkvKmFsbG9jIGJ1ZmZlciovCisJcmV0ID0gYXN5bmNmaWZvX3NldF9idWZmZXIoYWZpZm8sIGJ1Zl9sZW4sIGJ1Zik7CisKKwlhZmlmby0+aW5pdCA9IDE7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYXN5bmNfZmlmb19kZWluaXQoc3RydWN0IGFtbF9hc3luY2ZpZm8gKmFmaWZvLCBpbnQgZnJlZWlycSkKK3sKKwlzdHJ1Y3QgYW1sX2R2YiAqZHZiID0gYWZpZm8tPmR2YjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFhZmlmby0+aW5pdCkKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHZiLT5zbG9jaywgZmxhZ3MpOworCUNMRUFSX0FTWU5DX0ZJRk9fUkVHX01BU0soYWZpZm8tPmlkLCBSRUcxLCAxIDw8IEFTWU5DX0ZJRk9fRkxVU0hfRU4pOworCUNMRUFSX0FTWU5DX0ZJRk9fUkVHX01BU0soYWZpZm8tPmlkLCBSRUcyLCAxIDw8IEFTWU5DX0ZJRk9fRklMTF9FTik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHZiLT5zbG9jaywgZmxhZ3MpOworCisJYXN5bmNmaWZvX3B1dF9idWZmZXIoYWZpZm8pOworCisJYWZpZm8tPnNvdXJjZSAgPSBBTV9ETVhfTUFYOworCWFmaWZvLT5idWZfdG9nZ2xlID0gMDsKKwlhZmlmby0+YnVmX3JlYWQgPSAwOworCWFmaWZvLT5idWZfbGVuID0gMDsKKworCWlmIChhZmlmby0+YXN5bmNmaWZvX2lycSAhPSAtMSkgeworCQlpZiAoZnJlZWlycSkKKwkJCWZyZWVfaXJxKGFmaWZvLT5hc3luY2ZpZm9faXJxLCBhZmlmbyk7CisJCWVsc2UKKwkJCWRpc2FibGVfaXJxKGFmaWZvLT5hc3luY2ZpZm9faXJxKTsKKwl9CisJdGFza2xldF9raWxsKCZhZmlmby0+YXN5bmNmaWZvX3Rhc2tsZXQpOworCisJYWZpZm8tPmluaXQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2RteF9zbWFsbHNlY19lbmFibGUoc3RydWN0IGFtbF9zbWFsbHNlYyAqc3MsIGludCBidWZzaXplKQoreworCWlmICghc3MtPmJ1ZikgeworCisJCXNzLT5idWYgPSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsCisJCQkJCWdldF9vcmRlcihidWZzaXplKSk7CisJCWlmICghc3MtPmJ1ZikgeworCQkJcHJfZXJyb3IoImNhbm5vdCBhbGxvY2F0ZSBzbWFsbHNlYyBidWZmZXJcbiIKKwkJCQkiJWQgYnl0ZXMgJWQgb3JkZXJcbiIsCisJCQkJIGJ1ZnNpemUsIGdldF9vcmRlcihidWZzaXplKSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJc3MtPmJ1Zl9tYXAgPSBkbWFfbWFwX3NpbmdsZShkbXhfZ2V0X2Rldihzcy0+ZG14KSwKKwkJCQkJCSh2b2lkICopc3MtPmJ1ZiwKKwkJCQkJCSBidWZzaXplLCBETUFfRlJPTV9ERVZJQ0UpOworCX0KKworCURNWF9XUklURV9SRUcoc3MtPmRteC0+aWQsIERFTVVYX1NNQUxMX1NFQ19BRERSLAorCQkJCXNzLT5idWZfbWFwKTsKKwlETVhfV1JJVEVfUkVHKHNzLT5kbXgtPmlkLCBERU1VWF9TTUFMTF9TRUNfQ1RMLAorCQkJCSgoKChidWZzaXplPj44KS0xKSYweGZmKTw8MjQpIHwKKwkJCQkoMTw8MSkgfC8qZW5hYmxlIHJlc2V0IHRoZSB3ciBwdHIqLworCQkJCSgxPDwwKSk7CisKKwlzcy0+YnVmc2l6ZSA9IGJ1ZnNpemU7CisJc3MtPmVuYWJsZSA9IDE7CisKKwlwcl9pbmYoImRlbXV4JWQgc21hbGxzZWMgYnVmIHN0YXJ0OiAlbHgsIHNpemU6ICVkXG4iLAorCQlzcy0+ZG14LT5pZCwgc3MtPmJ1Ziwgc3MtPmJ1ZnNpemUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9kbXhfc21hbGxzZWNfZGlzYWJsZShzdHJ1Y3QgYW1sX3NtYWxsc2VjICpzcykKK3sKKwlETVhfV1JJVEVfUkVHKHNzLT5kbXgtPmlkLCBERU1VWF9TTUFMTF9TRUNfQ1RMLCAwKTsKKwlpZiAoc3MtPmJ1ZikgeworCQlkbWFfdW5tYXBfc2luZ2xlKGRteF9nZXRfZGV2KHNzLT5kbXgpLCBzcy0+YnVmX21hcCwKKwkJCQlzcy0+YnVmc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKKwkJZnJlZV9wYWdlcyhzcy0+YnVmLCBnZXRfb3JkZXIoc3MtPmJ1ZnNpemUpKTsKKwkJc3MtPmJ1ZiA9IDA7CisJCXNzLT5idWZfbWFwID0gMDsKKwl9CisJc3MtPmVuYWJsZSA9IDA7CisJcHJfaW5mKCJkZW11eCVkIHNtYWxsc2VjIGJ1ZiBkaXNhYmxlXG4iLCBzcy0+ZG14LT5pZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG14X3NtYWxsc2VjX3NldChzdHJ1Y3QgYW1sX3NtYWxsc2VjICpzcywgaW50IGVuYWJsZSwgaW50IGJ1ZnNpemUsCisJCQkJaW50IGZvcmNlKQoreworCWlmICghZW5hYmxlKSB7LypkaXNhYmxlKi8KKworCQlpZiAoc3MtPmVuYWJsZSB8fCBmb3JjZSkKKwkJCV9kbXhfc21hbGxzZWNfZGlzYWJsZShzcyk7CisKKwl9IGVsc2Ugey8qZW5hYmxlKi8KKworCQlpZiAoYnVmc2l6ZSA8IDApCisJCQlidWZzaXplID0gU1NfQlVGU0laRV9ERUY7CisJCWVsc2UgaWYgKCFidWZzaXplKQorCQkJYnVmc2l6ZSA9IHNzLT5idWZzaXplOworCQllbHNlIHsKKwkJCS8qdW5pdDpGRiBtYXg6RkYwMCovCisJCQlidWZzaXplICY9IH4weEZGOworCQkJYnVmc2l6ZSAmPSAweDFGRjAwOworCQl9CisKKwkJaWYgKChzcy0+ZW5hYmxlICYmIChidWZzaXplICE9IHNzLT5idWZzaXplKSkgfHwgZm9yY2UpCisJCQlfZG14X3NtYWxsc2VjX2Rpc2FibGUoc3MpOworCisJCWlmICghc3MtPmVuYWJsZSkKKwkJCV9kbXhfc21hbGxzZWNfZW5hYmxlKHNzLCBidWZzaXplKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfZG14X3RpbWVvdXRfZW5hYmxlKHN0cnVjdCBhbWxfZG14dGltZW91dCAqZHRvLCBpbnQgdGltZW91dCwKKwkJCQkJCWludCBjaF9kaXMsIGludCBtYXRjaCkKK3sKKworCURNWF9XUklURV9SRUcoZHRvLT5kbXgtPmlkLCBERU1VWF9JTlBVVF9USU1FT1VUX0MsIGNoX2Rpcyk7CisJRE1YX1dSSVRFX1JFRyhkdG8tPmRteC0+aWQsIERFTVVYX0lOUFVUX1RJTUVPVVQsCisJCQkJKCghIW1hdGNoKTw8MzEpIHwKKwkJCQkodGltZW91dCYweDdmZmZmZmZmKSk7CisKKwlkdG8tPmNoX2Rpc2FibGUgPSBjaF9kaXM7CisJZHRvLT5tYXRjaCA9IG1hdGNoOworCWR0by0+dGltZW91dCA9IHRpbWVvdXQ7CisJZHRvLT50cmlnZ2VyID0gMDsKKwlkdG8tPmVuYWJsZSA9IDE7CisKKwlwcl9pbmYoImRlbXV4JWQgdGltZW91dCBlbmFibGU6dGltZW91dCglZCksY2goMHgleCksbWF0Y2goJWQpXG4iLAorCQlkdG8tPmRteC0+aWQsIGR0by0+dGltZW91dCwgZHRvLT5jaF9kaXNhYmxlLCBkdG8tPm1hdGNoKTsKKworCXJldHVybiAwOworfQorc3RhdGljIGludCBfZG14X3RpbWVvdXRfZGlzYWJsZShzdHJ1Y3QgYW1sX2RteHRpbWVvdXQgKmR0bykKK3sKKworCURNWF9XUklURV9SRUcoZHRvLT5kbXgtPmlkLCBERU1VWF9JTlBVVF9USU1FT1VULCAwKTsKKwlkdG8tPmVuYWJsZSA9IDA7CisJZHRvLT50cmlnZ2VyID0gMDsKKwlwcl9pbmYoImRlbXV4JWQgdGltZW91dCBkaXNhYmxlXG4iLCBkdG8tPmRteC0+aWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG14X3RpbWVvdXRfc2V0KHN0cnVjdCBhbWxfZG14dGltZW91dCAqZHRvLCBpbnQgZW5hYmxlLAorCQkJCWludCB0aW1lb3V0LCBpbnQgY2hfZGlzLCBpbnQgbWF0Y2gsCisJCQkJaW50IGZvcmNlKQoreworCisJaWYgKCFlbmFibGUpIHsvKmRpc2FibGUqLworCisJCWlmIChkdG8tPmVuYWJsZSB8fCBmb3JjZSkKKwkJCV9kbXhfdGltZW91dF9kaXNhYmxlKGR0byk7CisKKwl9IGVsc2Ugey8qZW5hYmxlKi8KKworCQlpZiAodGltZW91dCA8IDApIHsKKwkJCXRpbWVvdXQgPSBEVE9fVElNRU9VVF9ERUY7CisJCQljaF9kaXMgPSBEVE9fQ0hESVNfVkFTOworCQkJbWF0Y2ggPSBkdG8tPm1hdGNoOworCQl9IGVsc2UgaWYgKCF0aW1lb3V0KSB7CisJCQl0aW1lb3V0ID0gZHRvLT50aW1lb3V0OworCQkJY2hfZGlzID0gZHRvLT5jaF9kaXNhYmxlOworCQkJbWF0Y2ggPSBkdG8tPm1hdGNoOworCQl9CisKKwkJaWYgKChkdG8tPmVuYWJsZSAmJiAodGltZW91dCAhPSBkdG8tPnRpbWVvdXQpKQorCQkJfHwgZm9yY2UpCisJCQlfZG14X3RpbWVvdXRfZGlzYWJsZShkdG8pOworCisJCWlmICghZHRvLT5lbmFibGUpCisJCQlfZG14X3RpbWVvdXRfZW5hYmxlKGR0bywgdGltZW91dCwgY2hfZGlzLCBtYXRjaCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qSW5pdGlhbGl6ZSB0aGUgcmVnaXN0ZXJzKi8KK3N0YXRpYyBpbnQgZG14X2luaXQoc3RydWN0IGFtbF9kbXggKmRteCkKK3sKKwlzdHJ1Y3QgYW1sX2R2YiAqZHZiID0gKHN0cnVjdCBhbWxfZHZiICopZG14LT5kZW11eC5wcml2OworCWludCBpcnE7CisJaW50IHJldCA9IDA7CisJY2hhciBidWZbMzJdOworCXUzMiB2YWx1ZSA9IDA7CisKKwlpZiAoZG14LT5pbml0KQorCQlyZXR1cm4gMDsKKworCXByX2RiZygiW2RteF9rcGldICVzIEVudGVyXG4iLCBfX2Z1bmNfXyk7CisKKwltZW1zZXQoYnVmLCAwLCAzMik7CisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgImFzeW5jZmlmb19idWZfbGVuIik7CisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoZHZiLT5wZGV2LT5kZXYub2Zfbm9kZSwgYnVmLCAmdmFsdWUpOworCWlmICghcmV0KSB7CisJCXByX2luZigiJXM6IDB4JXhcbiIsIGJ1ZiwgdmFsdWUpOworCQlhc3luY2ZpZm9fYnVmX2xlbiA9IHZhbHVlOworCX0KKwkvKlJlZ2lzdGVyIGlycSBoYW5kbGVycyAqLworCWlmIChkbXgtPmRteF9pcnEgIT0gLTEpIHsKKwkJcHJfZGJnKCJyZXF1ZXN0IGlycVxuIik7CisJCXRhc2tsZXRfaW5pdCgmZG14LT5kbXhfdGFza2xldCwKKwkJCQlkbXhfaXJxX2JoX2hhbmRsZXIsCisJCQkJKHVuc2lnbmVkIGxvbmcpZG14KTsKKwkJaXJxID0gcmVxdWVzdF9pcnEoZG14LT5kbXhfaXJxLAlkbXhfaXJxX2hhbmRsZXIsCisJCQkJSVJRRl9TSEFSRUR8SVJRRl9UUklHR0VSX1JJU0lORywKKwkJCQkiZG14IGlycSIsIGRteCk7CisJfQorCisJLypBbGxvY2F0ZSBidWZmZXIgKi8KKwlpZiAoZG14X2FsbG9jX3NlY19idWZmZXIoZG14KSA8IDApCisJCXJldHVybiAtMTsKKyNpZmRlZiBOT19TVUIKKyNpZmRlZiBTVUJfQlVGX1NIQVJFRAorCWlmIChkbXhfYWxsb2Nfc3ViX2J1ZmZlcl9zaGFyZWQoZHZiKSA8IDApCisJCXJldHVybiAtMTsKKyNlbmRpZgorCWlmIChkbXhfYWxsb2Nfc3ViX2J1ZmZlcihkdmIsIGRteCkgPCAwKQorCQlyZXR1cm4gLTE7CisjZW5kaWYKKyNpZmRlZiBQRVNfQlVGX1NIQVJFRAorCWlmIChkbXhfYWxsb2NfcGVzX2J1ZmZlcl9zaGFyZWQoZHZiKSA8IDApCisJCXJldHVybiAtMTsKKyNlbmRpZgorCWlmIChkbXhfYWxsb2NfcGVzX2J1ZmZlcihkdmIsIGRteCkgPCAwKQorCQlyZXR1cm4gLTE7CisJLypSZXNldCB0aGUgaGFyZHdhcmUgKi8KKwlpZiAoIWR2Yi0+ZG14X2luaXQpIHsKKwkJdGltZXJfc2V0dXAoJmR2Yi0+d2F0Y2hkb2dfdGltZXIsIHNlY3Rpb25fYnVmZmVyX3dhdGNoZG9nX2Z1bmMsMCk7CisjaWZkZWYgRU5BQkxFX1NFQ19CVUZGX1dBVENIRE9HCisJCW1vZF90aW1lcigmZHZiLT53YXRjaGRvZ190aW1lcixqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhXQVRDSERPR19USU1FUikpOworI2VuZGlmCisJCWRteF9yZXNldF9odyhkdmIpOworCX0KKworCWR2Yi0+ZG14X2luaXQrKzsKKworCW1lbXNldChkbXgtPnNlY19idWZfd2F0Y2hkb2dfY291bnQsIDAsCisJICAgICAgIHNpemVvZihkbXgtPnNlY19idWZfd2F0Y2hkb2dfY291bnQpKTsKKworCWRteC0+b21fc3RhdHVzX2Vycm9yX2NvdW50ID0gMDsKKwlkbXgtPmluaXQgPSAxOworCXByX2RiZygiW2RteF9rcGldICVzIEV4aXRcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKworLypSZWxlYXNlIHRoZSByZXNvdXJjZSovCitzdGF0aWMgaW50IGRteF9kZWluaXQoc3RydWN0IGFtbF9kbXggKmRteCkKK3sKKwlzdHJ1Y3QgYW1sX2R2YiAqZHZiID0gKHN0cnVjdCBhbWxfZHZiICopZG14LT5kZW11eC5wcml2OworCXByX2RiZygiW2RteF9rcGldICVzIEVudGVyXG4iLCBfX2Z1bmNfXyk7CisJaWYgKCFkbXgtPmluaXQpCisJCXJldHVybiAwOworCisJRE1YX1dSSVRFX1JFRyhkbXgtPmlkLCBERU1VWF9DT05UUk9MLCAwKTsKKworCWR2Yi0+ZG14X2luaXQtLTsKKworCS8qUmVzZXQgdGhlIGhhcmR3YXJlICovCisJaWYgKCFkdmItPmRteF9pbml0KSB7CisJCWRteF9yZXNldF9odyhkdmIpOworI2lmZGVmIEVOQUJMRV9TRUNfQlVGRl9XQVRDSERPRworCQlkZWxfdGltZXJfc3luYygmZHZiLT53YXRjaGRvZ190aW1lcik7CisjZW5kaWYKKwl9CisKKwlpZiAoZG14LT5zZWNfcGFnZXMpIHsKKwkJZG1hX3VubWFwX3NpbmdsZShkbXhfZ2V0X2RldihkbXgpLCBkbXgtPnNlY19wYWdlc19tYXAsCisJCQkJZG14LT5zZWNfdG90YWxfbGVuLCBETUFfRlJPTV9ERVZJQ0UpOworCQlmcmVlX3BhZ2VzKGRteC0+c2VjX3BhZ2VzLCBnZXRfb3JkZXIoZG14LT5zZWNfdG90YWxfbGVuKSk7CisJCWRteC0+c2VjX3BhZ2VzID0gMDsKKwkJZG14LT5zZWNfcGFnZXNfbWFwID0gMDsKKwl9CisjaWZkZWYgTk9fU1VCCisjaWZkZWYgU1VCX0JVRl9ETVgKKyNpZmRlZiBTVUJfQlVGX1NIQVJFRAorCWlmIChkdmItPnN1Yl9wYWdlcykgeworCQlkbWFfdW5tYXBfc2luZ2xlKGR2Yi0+ZGV2LCBkdmItPnN1Yl9wYWdlc19tYXAsCisJCQkJZHZiLT5zdWJfYnVmX2xlbiwgRE1BX0ZST01fREVWSUNFKTsKKwkJZnJlZV9wYWdlcyhkdmItPnN1Yl9wYWdlcywgZ2V0X29yZGVyKGR2Yi0+c3ViX2J1Zl9sZW4pKTsKKwkJZHZiLT5zdWJfcGFnZXMgPSAwOworCX0KKwlkbXgtPnN1Yl9wYWdlcyA9IDA7CisjZWxzZQorCWlmIChkbXgtPnN1Yl9wYWdlcykgeworCQlkbWFfdW5tYXBfc2luZ2xlKGRteF9nZXRfZGV2KGRteCksIGRteC0+c3ViX3BhZ2VzX21hcCwKKwkJCQlkbXgtPnN1Yl9idWZfbGVuLCBETUFfRlJPTV9ERVZJQ0UpOworCQlmcmVlX3BhZ2VzKGRteC0+c3ViX3BhZ2VzLCBnZXRfb3JkZXIoZG14LT5zdWJfYnVmX2xlbikpOworCQlkbXgtPnN1Yl9wYWdlcyA9IDA7CisJfQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIFBFU19CVUZfU0hBUkVECisJaWYgKGR2Yi0+cGVzX3BhZ2VzKSB7CisJCWRtYV91bm1hcF9zaW5nbGUoZHZiLT5kZXYsIGR2Yi0+cGVzX3BhZ2VzX21hcCwKKwkJCQlkdmItPnBlc19idWZfbGVuLCBETUFfRlJPTV9ERVZJQ0UpOworCQlmcmVlX3BhZ2VzKGR2Yi0+cGVzX3BhZ2VzLCBnZXRfb3JkZXIoZHZiLT5wZXNfYnVmX2xlbikpOworCQlkdmItPnBlc19wYWdlcyA9IDA7CisJfQorCWRteC0+cGVzX3BhZ2VzID0gMDsKKyNlbHNlCisJaWYgKGRteC0+cGVzX3BhZ2VzKSB7CisJCWRtYV91bm1hcF9zaW5nbGUoZG14X2dldF9kZXYoZG14KSwgZG14LT5wZXNfcGFnZXNfbWFwLAorCQkJCWRteC0+cGVzX2J1Zl9sZW4sIERNQV9GUk9NX0RFVklDRSk7CisJCWZyZWVfcGFnZXMoZG14LT5wZXNfcGFnZXMsIGdldF9vcmRlcihkbXgtPnBlc19idWZfbGVuKSk7CisJCWRteC0+cGVzX3BhZ2VzID0gMDsKKwl9CisjZW5kaWYKKwlpZiAoZG14LT5kbXhfaXJxICE9IC0xKSB7CisJCWZyZWVfaXJxKGRteC0+ZG14X2lycSwgZG14KTsKKwkJdGFza2xldF9raWxsKCZkbXgtPmRteF90YXNrbGV0KTsKKwl9CisKKwlkbXgtPmluaXQgPSAwOworCXByX2RiZygiW2RteF9rcGldICVzIEV4aXRcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKworLypDaGVjayB0aGUgcmVjb3JkIGZsYWcqLworc3RhdGljIGludCBkbXhfZ2V0X3JlY29yZF9mbGFnKHN0cnVjdCBhbWxfZG14ICpkbXgpCit7CisJaW50IGksIGxpbmtlZCA9IDAsIHJlY29yZF9mbGFnID0gMDsKKwlzdHJ1Y3QgYW1sX2R2YiAqZHZiID0gKHN0cnVjdCBhbWxfZHZiICopZG14LT5kZW11eC5wcml2OworCisJLypDaGVjayB3aGV0aGVyIGEgYXN5bmMgZmlmbyBjb25uZWN0ZWQgdG8gdGhpcyBkbXggKi8KKwlmb3IgKGkgPSAwOyBpIDwgZHZiLT5hc3luY19maWZvX3RvdGFsX2NvdW50OyBpKyspIHsKKwkJaWYgKCFkdmItPmFzeW5jZmlmb1tpXS5pbml0KQorCQkJY29udGludWU7CisJCWlmICgoZHZiLT5hc3luY2ZpZm9baV0uc291cmNlID09IGRteC0+aWQpCisJCSAgICAvKiYmICEoZHZiLT5zd2ZpbHRlci51c2VyICYmIChpPT1TRl9BRklGT19JRCkpICovCisJCSAgICAvKnNmIG1vZGUgcmVzZXJ2ZWQgKi8KKwkJICAgICkgeworCQkJbGlua2VkID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IENIQU5ORUxfQ09VTlQ7IGkrKykgeworCQlpZiAoZG14LT5jaGFubmVsW2ldLnVzZWQgJiYgZG14LT5jaGFubmVsW2ldLmR2cl9mZWVkKSB7CisJCQlpZiAoIWRteC0+cmVjb3JkKSB7CisJCQkJcHJfZXJyb3IoImRteF9nZXRfcmVjb3JkX2ZsYWcgc2V0IHJlY29yZCBkbXgtPmlkOiAlZFxuIiwgZG14LT5pZCk7CisJCQkJZG14LT5yZWNvcmQgPSAxOworCisJCQkJaWYgKGxpbmtlZCkgeworCQkJCQkvKkEgbmV3IHJlY29yZCB3aWxsIHN0YXJ0LAorCQkJCQkgKiAgIG11c3QgcmVzZXQgdGhlIGFzeW5jIGZpZm9zIGZvcgorCQkJCQkgKiBsaW5raW5nIHRoZSByaWdodCBkZW11eAorCQkJCQkgKi8KKwkJCQkJcmVzZXRfYXN5bmNfZmlmb3MoZHZiKTsKKwkJCQl9CisJCQl9CisJCQlpZiAobGlua2VkKQorCQkJCXJlY29yZF9mbGFnID0gMTsKKwkJCWdvdG8gZmluZF9kb25lOworCQl9CisJfQorCisJaWYgKGRteC0+cmVjb3JkKSB7CisJCXByX2Vycm9yKCJkbXhfZ2V0X3JlY29yZF9mbGFnIGNsZWFyIHJlY29yZCBkbXgtPmlkOiAlZFxuIiwgZG14LT5pZCk7CisJCWRteC0+cmVjb3JkID0gMDsKKwkJaWYgKGxpbmtlZCkgeworCQkJLypBIHJlY29yZCB3aWxsIHN0b3AsIHJlc2V0IHRoZSBhc3luYyBmaWZvcworCQkJICpmb3IgbGlua2luZyB0aGUgcmlnaHQgZGVtdXgKKwkJCSAqLworCQkJcmVzZXRfYXN5bmNfZmlmb3MoZHZiKTsKKwkJfQorCX0KKworZmluZF9kb25lOgorCXJldHVybiByZWNvcmRfZmxhZzsKK30KKworc3RhdGljIHZvaWQgZG14X2Nhc2NhZGVfc2V0KGludCBjdXJfZG14LCBpbnQgc291cmNlKSB7CisJaW50IGZlY19zZWxfZGVtdXggPSAwOworCWludCBkYXRhOworCisJc3dpdGNoIChzb3VyY2UpIHsKKwkJY2FzZSBBTV9UU19TUkNfRE1YMDoKKwkJY2FzZSBBTV9UU19TUkNfRE1YMToKKwkJY2FzZSBBTV9UU19TUkNfRE1YMjoKKwkJCWZlY19zZWxfZGVtdXggPSBzb3VyY2UgLUFNX1RTX1NSQ19ETVgwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmZWNfc2VsX2RlbXV4ID0gY3VyX2RteDsKKwkJCWJyZWFrOworCX0KKworCWRhdGEgPSBSRUFEX01QRUdfUkVHKFRTX1RPUF9DT05GSUcxKTsKKwlkYXRhICY9IH4oMHgzIDw8IChjdXJfZG14KjIpKTsKKwlkYXRhIHw9IChmZWNfc2VsX2RlbXV4IDw8IChjdXJfZG14KjIpKTsKKwlXUklURV9NUEVHX1JFRyhUU19UT1BfQ09ORklHMSxkYXRhKTsKKworCXByX2RiZygiJXMgaWQ6JWQsIHNvdXJjZTolZCBkYXRhOjB4JTB4XG4iLF9fRlVOQ1RJT05fXyxjdXJfZG14LGZlY19zZWxfZGVtdXgsZGF0YSk7Cit9CisKKy8qRW5hYmxlIHRoZSBkZW11eCBkZXZpY2UqLworc3RhdGljIGludCBkbXhfZW5hYmxlKHN0cnVjdCBhbWxfZG14ICpkbXgpCit7CisJc3RydWN0IGFtbF9kdmIgKmR2YiA9IChzdHJ1Y3QgYW1sX2R2YiAqKWRteC0+ZGVtdXgucHJpdjsKKwlpbnQgZmVjX3NlbCwgaGlfYnNmLCBmZWNfY3RybCwgcmVjb3JkOworCWludCBmZWNfY29yZV9zZWwgPSAwOworCWludCBzZXRfc3RiID0gMCwgZmVjX3MgPSAwOworCWludCBzMnBfaWQ7CisJdTMyIGludmVydDAgPSAwLCBpbnZlcnQxID0gMCwgaW52ZXJ0MiA9IDAsIGZlY19zMCA9IDAsIGZlY19zMSA9IDAsIGZlY19zMiA9IDA7CisJdTMyIHVzZV9zb3AgPSAwOworCWludCBpID0gMDsKKworCXJlY29yZCA9IGRteF9nZXRfcmVjb3JkX2ZsYWcoZG14KTsKKwlpZiAodXNlX29mX3NvcCA9PSAxKSB7CisJCXVzZV9zb3AgPSAxOworCQlwcl9pbmYoImRteCB1c2Ugb2Ygc29wIGlucHV0XHJcbiIpOworCX0KKwlzd2l0Y2ggKGRteC0+c291cmNlKSB7CisJY2FzZSBBTV9UU19TUkNfVFMwOgorCQlmZWNfc2VsID0gMDsKKwkJZmVjX2N0cmwgPSBkdmItPnRzWzBdLmNvbnRyb2w7CisJCXJlY29yZCA9IHJlY29yZCA/IDEgOiAwOworCQlicmVhazsKKwljYXNlIEFNX1RTX1NSQ19UUzE6CisJCWZlY19zZWwgPSAxOworCQlmZWNfY3RybCA9IGR2Yi0+dHNbMV0uY29udHJvbDsKKwkJcmVjb3JkID0gcmVjb3JkID8gMSA6IDA7CisJCWJyZWFrOworCWNhc2UgQU1fVFNfU1JDX1RTMjoKKwkJZmVjX3NlbCA9IDI7CisJCWZlY19jdHJsID0gZHZiLT50c1syXS5jb250cm9sOworCQlyZWNvcmQgPSByZWNvcmQgPyAxIDogMDsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfVFMzOgorCQlmZWNfc2VsID0gMzsKKwkJZmVjX2N0cmwgPSBkdmItPnRzWzNdLmNvbnRyb2w7CisJCXJlY29yZCA9IHJlY29yZCA/IDEgOiAwOworCQlicmVhazsKKwljYXNlIEFNX1RTX1NSQ19TX1RTMDoKKwljYXNlIEFNX1RTX1NSQ19TX1RTMToKKwljYXNlIEFNX1RTX1NSQ19TX1RTMjoKKwkJczJwX2lkID0gMDsKKwkJZmVjX2N0cmwgPSAwOworCQlpZiAoZG14LT5zb3VyY2UgPT0gQU1fVFNfU1JDX1NfVFMwKSB7CisJCQlzMnBfaWQgPSAwOworCQl9IGVsc2UgaWYgKGRteC0+c291cmNlID09IEFNX1RTX1NSQ19TX1RTMSkgeworCQkJczJwX2lkID0gMTsKKwkJfSBlbHNlIGlmIChkbXgtPnNvdXJjZSA9PSBBTV9UU19TUkNfU19UUzIpIHsKKwkJCXMycF9pZCA9IDI7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IGR2Yi0+czJwX3RvdGFsX2NvdW50OyBpKyspIHsKKwkJCWlmIChkdmItPnRzW2ldLnMycF9pZCA9PSBzMnBfaWQpIHsKKwkJCQlmZWNfY3RybCA9IGR2Yi0+dHNbaV0uY29udHJvbDsKKwkJCX0KKwkJfQorCQkvL2ZlY19zZWwgPSAoczJwX2lkID09IDEpID8gNSA6IDY7CisJCWZlY19zZWwgPSA2IC0gczJwX2lkOworCQlyZWNvcmQgPSByZWNvcmQgPyAxIDogMDsKKwkJc2V0X3N0YiA9IDE7CisJCWZlY19zID0gZG14LT5zb3VyY2UgLSBBTV9UU19TUkNfU19UUzA7CisJCWJyZWFrOworCWNhc2UgQU1fVFNfU1JDX0hJVToKKwkJZmVjX3NlbCA9IDc7CisJCWZlY19jdHJsID0gMDsKKwkJLyoKKwkJCXN1cHBvcnQgcmVjb3JkIGluIEhJVSBtb2RlCisJCXJlY29yZCA9IDA7CisJCSovCisJCWJyZWFrOworCWNhc2UgQU1fVFNfU1JDX0hJVTE6CisJCWZlY19zZWwgPSA4OworCQlmZWNfY3RybCA9IDA7CisJCS8qCisJCQlzdXBwb3J0IHJlY29yZCBpbiBISVUgbW9kZQorCQlyZWNvcmQgPSAwOworCQkqLworCQlicmVhazsKKwljYXNlIEFNX1RTX1NSQ19ETVgwOgorCWNhc2UgQU1fVFNfU1JDX0RNWDE6CisJY2FzZSBBTV9UU19TUkNfRE1YMjoKKwkJZmVjX3NlbCA9IC0xOworCQlmZWNfY3RybCA9IDA7CisJCXJlY29yZCA9IHJlY29yZCA/IDEgOiAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmZWNfc2VsID0gMDsKKwkJZmVjX2N0cmwgPSAwOworCQlyZWNvcmQgPSAwOworCQlicmVhazsKKwl9CisKKwlpZiAoZG14LT5jaGFubmVsWzBdLnVzZWQgfHwgZG14LT5jaGFubmVsWzFdLnVzZWQpIHsKKwkJaGlfYnNmID0gMTsKKwkJaWYgKGZlY19zZWwgPT0gOCkgeworCQkJaGlfYnNmID0gMjsgLypoaV9ic2Ygc2VsZWN0IGhpdTEqLworCQl9CisJfWVsc2UgeworCQloaV9ic2YgPSAwOworCX0KKwlpZiAoKGR2Yi0+ZHNjWzBdLmRzdCAhPSAtMSkKKwkgICAgJiYgKChkdmItPmRzY1swXS5kc3QgLSBBTV9UU19TUkNfRE1YMCkgPT0gZG14LT5pZCkpCisJCWZlY19jb3JlX3NlbCA9IDE7CisKKwlpZiAoKGR2Yi0+ZHNjWzFdLmRzdCAhPSAtMSkKKwkgICAgJiYgKChkdmItPmRzY1sxXS5kc3QgLSBBTV9UU19TUkNfRE1YMCkgPT0gZG14LT5pZCkpCXsKKwkJaW50IGRlc19pbiwgZGVzX291dCwgZW5fZGVzID0gMDsKKworCQlzd2l0Y2ggKGR2Yi0+ZHNjWzFdLnNvdXJjZSkgeworCQljYXNlIEFNX1RTX1NSQ19ETVgwOgorCQkJZGVzX2luID0gMDsKKwkJCWVuX2RlcyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBBTV9UU19TUkNfRE1YMToKKwkJCWRlc19pbiA9IDE7CisJCQllbl9kZXMgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgQU1fVFNfU1JDX0RNWDI6CisJCQlkZXNfaW4gPSAyOworCQkJZW5fZGVzID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGVzX2luID0gMDsKKwkJCWVuX2RlcyA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCXN3aXRjaCAoZHZiLT5kc2NbMV0uZHN0KSB7CisJCWNhc2UgQU1fVFNfU1JDX0RNWDA6CisJCQlkZXNfb3V0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIEFNX1RTX1NSQ19ETVgxOgorCQkJZGVzX291dCA9IDI7CisJCQlicmVhazsKKwkJY2FzZSBBTV9UU19TUkNfRE1YMjoKKwkJCWRlc19vdXQgPSA0OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXNfb3V0ID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCFkZXNfb3V0KQorCQkJZW5fZGVzID0gMDsKKworCQlXUklURV9NUEVHX1JFRyhDT01NX0RFU0NfMl9DVEwsCisJCQkJKDYgPDwgOCkgfC8qZGVzX291dF9kbHlfMiovCisJCQkJKCghIWVuX2RlcykgPDwgNikgfC8qIGRlc19wbF9jbGtfMiovCisJCQkJKCghIWVuX2RlcykgPDwgNSkgfC8qIGRlc19wbF8yKi8KKwkJCQkoZGVzX291dCA8PCAyKSB8Lyp1c2VfZGVzXzIqLworCQkJCShkZXNfaW4pLypkZXNfaV9zZWxfMiovCisJCQkJKTsKKwkJZmVjX2NvcmVfc2VsID0gMTsKKwkJcHJfZGJnKCJkc2MyIGN0cmw6IDB4JXhcbiIsIFJFQURfTVBFR19SRUcoQ09NTV9ERVNDXzJfQ1RMKSk7CisJfQorCisJcHJfZGJnKCJbZG14LSVkXXNyYzogJWQsIHJlYzogJWQsIGhpX2JzZjogJWQsIGRzYzogJWRcbiIsCisJICAgICAgIGRteC0+aWQsIGRteC0+c291cmNlLCByZWNvcmQsIGhpX2JzZiwgZmVjX2NvcmVfc2VsKTsKKworCWlmIChkbXgtPmNoYW5fY291bnQpIHsKKwkJaWYgKHNldF9zdGIpIHsKKwkJCXUzMiB2ID0gUkVBRF9NUEVHX1JFRyhTVEJfVE9QX0NPTkZJRyk7CisJCQlpbnQgaTsKKworCQkJZm9yIChpID0gMDsgaSA8IGR2Yi0+dHNfaW5fdG90YWxfY291bnQ7IGkrKykgeworCQkJCWlmIChkdmItPnRzW2ldLnMycF9pZCA9PSAwKQorCQkJCQlmZWNfczAgPSBpOworCQkJCWVsc2UgaWYgKGR2Yi0+dHNbaV0uczJwX2lkID09IDEpCisJCQkJCWZlY19zMSA9IGk7CisJCQkJZWxzZSBpZiAoZHZiLT50c1tpXS5zMnBfaWQgPT0gMikKKwkJCQkJZmVjX3MyID0gaTsKKwkJCX0KKworCQkJaW52ZXJ0MCA9IGR2Yi0+czJwWzBdLmludmVydDsKKwkJCWludmVydDEgPSBkdmItPnMycFsxXS5pbnZlcnQ7CisKKwkJCXYgJj0gfigoMHgzIDw8IFMyUDBfRkVDX1NFUklBTF9TRUwpIHwKKwkJCSAgICAgICAoMHgxZiA8PCBJTlZFUlRfUzJQMF9GRUNfQ0xLKSB8CisJCQkgICAgICAgKDB4MyA8PCBTMlAxX0ZFQ19TRVJJQUxfU0VMKSB8CisJCQkgICAgICAgKDB4MWYgPDwgSU5WRVJUX1MyUDFfRkVDX0NMSykpOworCisJCQl2IHw9IChmZWNfczAgPDwgUzJQMF9GRUNfU0VSSUFMX1NFTCkgfAorCQkJICAgIChpbnZlcnQwIDw8IElOVkVSVF9TMlAwX0ZFQ19DTEspIHwKKwkJCSAgICAoZmVjX3MxIDw8IFMyUDFfRkVDX1NFUklBTF9TRUwpIHwKKwkJCSAgICAoaW52ZXJ0MSA8PCBJTlZFUlRfUzJQMV9GRUNfQ0xLKTsKKwkJCVdSSVRFX01QRUdfUkVHKFNUQl9UT1BfQ09ORklHLCB2KTsKKworCQkJaWYgKGdldF9jcHVfdHlwZSgpID49IE1FU09OX0NQVV9NQUpPUl9JRF9UTDEpIHsKKwkJCSAgICBpbnZlcnQyID0gZHZiLT5zMnBbMl0uaW52ZXJ0OworCisJCQkvL2FkZCBzMnAyIGNvbmZpZworCQkJdiA9IFJFQURfTVBFR19SRUcoU1RCX1MyUDJfQ09ORklHKTsKKwkJCXYgJj0gfigoMHgzIDw8IFMyUDJfRkVDX1NFUklBTF9TRUwpIHwKKwkJCSAgICAgICAoMHgxZiA8PCBJTlZFUlRfUzJQMl9GRUNfQ0xLKSk7CisJCQkgICAgdiB8PSAoZmVjX3MyIDw8IFMyUDJfRkVDX1NFUklBTF9TRUwpIHwKKwkJCQkgICAoaW52ZXJ0MiA8PCBJTlZFUlRfUzJQMl9GRUNfQ0xLKTsKKwkJCSAgICBXUklURV9NUEVHX1JFRyhTVEJfUzJQMl9DT05GSUcsIHYpOworCQkJfQorCQl9CisKKwkJLypJbml0aWFsaXplIHRoZSByZWdpc3RlcnMgKi8KKwkJRE1YX1dSSVRFX1JFRyhkbXgtPmlkLCBTVEJfSU5UX01BU0ssIERFTVVYX0lOVF9NQVNLKTsKKwkJRE1YX1dSSVRFX1JFRyhkbXgtPmlkLCBERU1VWF9NRU1fUkVRX0VOLAorI2lmZGVmIFVTRV9BSEJfTU9ERQorCQkJICAgICAgKDEgPDwgU0VDVElPTl9BSEJfRE1BX0VOKSB8CisJCQkgICAgICAoMCA8PCBTVUJfQUhCX0RNQV9FTikgfAorCQkJICAgICAgKDEgPDwgT1RIRVJfUEVTX0FIQl9ETUFfRU4pIHwKKyNlbmRpZgorCQkJICAgICAgKDEgPDwgU0VDVElPTl9QQUNLRVQpIHwKKwkJCSAgICAgICgxIDw8IFZJREVPX1BBQ0tFVCkgfAorCQkJICAgICAgKDEgPDwgQVVESU9fUEFDS0VUKSB8CisJCQkgICAgICAoMSA8PCBTVUJfUEFDS0VUKSB8CisJCQkgICAgICAoMSA8PCBTQ1JfT05MWV9QQUNLRVQpIHwKKwkJCQkoMSA8PCBPVEhFUl9QRVNfUEFDS0VUKSk7CisJCURNWF9XUklURV9SRUcoZG14LT5pZCwgUEVTX1NUUk9OR19TWU5DLCAweDEyMzQpOworCQlETVhfV1JJVEVfUkVHKGRteC0+aWQsIERFTVVYX0VORElBTiwKKwkJCSAgICAgICgxPDxTRVBFUkFURV9FTkRJQU4pIHwKKwkJCSAgICAgICgwPDxPVEhFUl9QRVNfRU5ESUFOKSB8CisJCQkgICAgICAoNzw8U0NSX0VORElBTikgfAorCQkJICAgICAgKDc8PFNVQl9FTkRJQU4pIHwKKwkJCSAgICAgICg3PDxBVURJT19FTkRJQU4pIHwKKwkJCSAgICAgICg3PDxWSURFT19FTkRJQU4pIHwKKwkJCSAgICAgICg3IDw8IE9USEVSX0VORElBTikgfAorCQkJICAgICAgKDcgPDwgQllQQVNTX0VORElBTikgfCAoMCA8PCBTRUNUSU9OX0VORElBTikpOworCQlpZiAoZmVjX3NlbCAhPSA4KSB7CisJCQlETVhfV1JJVEVfUkVHKGRteC0+aWQsIFRTX0hJVV9DVEwsCisvLwkJCSAgICAgICgwIDw8IExBU1RfQlVSU1RfVEhSRVNIT0xEKSB8CisJCQkgICAoaGlfYnNmIDw8IFVTRV9ISV9CU0ZfSU5URVJGQUNFKSk7CisJCX0gZWxzZSB7CisJCQlETVhfV1JJVEVfUkVHKGRteC0+aWQsIFRTX0hJVV9DVEwsCisJCQkJICAoMSA8PCBQRFRTX1dSX1NFTCkgfAorCQkJICAgKGhpX2JzZiA8PCBVU0VfSElfQlNGX0lOVEVSRkFDRSkpOworCQl9CisKKwkJaWYgKCFmZWNfY29yZV9zZWwpIHsKKwkJCXUzMiBjZmcgPSBSRUFEX01QRUdfUkVHKENJUExVU19DT05GSUcpOworCisJCQlpZiAoY2ZnICYgKDEgPDwgQ05UTF9FTkFCTEUpKSB7CisJCQkJaWYgKCFjaXBsdXNfb3V0X2F1dG9fbW9kZSkgeworCQkJCQlpbnQgbWFzayA9IDEgPDwgZG14LT5pZDsKKworCQkJCQlpZiAoY2lwbHVzX291dF9zZWwgJiBtYXNrKQorCQkJCQkJZmVjX2NvcmVfc2VsID0gMTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoZmVjX3NlbCA9PSAtMSkgeworCQkJZG14X2Nhc2NhZGVfc2V0KGRteC0+aWQsZG14LT5zb3VyY2UpOworCQkJRE1YX1dSSVRFX1JFRyhkbXgtPmlkLCBGRUNfSU5QVVRfQ09OVFJPTCwKKwkJCSAgICAgIChmZWNfY29yZV9zZWwgPDwgRkVDX0NPUkVfU0VMKSB8CisJCQkgICAgICAoMCA8PCBGRUNfU0VMKSB8IChmZWNfY3RybCA8PCAwKSk7CisJCX0gZWxzZSB7CisJCQlkbXhfY2FzY2FkZV9zZXQoZG14LT5pZCxkbXgtPnNvdXJjZSk7CisJCQlpZiAoZmVjX3NlbCAhPSA4KSB7CisJCQkJRE1YX1dSSVRFX1JFRyhkbXgtPmlkLCBGRUNfSU5QVVRfQ09OVFJPTCwKKwkJCQkgICAgICAoZmVjX2NvcmVfc2VsIDw8IEZFQ19DT1JFX1NFTCkgfAorCQkJCSAgICAgIChmZWNfc2VsIDw8IEZFQ19TRUwpIHwgKGZlY19jdHJsIDw8IDApKTsKKwkJCX0gZWxzZSB7CisJCQkJRE1YX1dSSVRFX1JFRyhkbXgtPmlkLCBGRUNfSU5QVVRfQ09OVFJPTCwKKwkJCQkgICAgICAoZmVjX2NvcmVfc2VsIDw8IEZFQ19DT1JFX1NFTCkgfAorCQkJCSAgICAgICgxIDw8IEZFQ19TRUxfM0JJVCkgfCAoZmVjX2N0cmwgPDwgMCkpOworCQkJfQorCQl9CisJCURNWF9XUklURV9SRUcoZG14LT5pZCwgU1RCX09NX0NUTCwKKwkJCSAgICAgICgweDQwIDw8IE1BWF9PTV9ETUFfQ09VTlQpIHwKKwkJCSAgICAgICgweDdmIDw8IExBU1RfT01fQUREUikpOworCisJCS8qUkVDT1JERVJfU1RSRUFNIGRlcGVuZHMgb24gdmlkZW8yKi8KKwkJLypWSURFT19TVFJFQU1fSUQ6IHZpZGVvMl9zdHJlYW1faWQgKGJpdFszMToxNl0pKi8KKwkJLypERU1VWF9DT05UUk9MOgorCQkgIGJpdFsyNV0gdmlkZW8yX2VuCisJCSAgYml0WzI0OjIyXSB2aWRlbzJfdHlwZSovCisJCSNkZWZpbmUgVklERU8yX0ZPUl9SRUNPUkRFUl9TVFJFQU0gKDEgPDwgMjUgfCA3IDw8IDIyKQorCisJCURNWF9XUklURV9SRUcoZG14LT5pZCwgVklERU9fU1RSRUFNX0lELAorCQkJCSgocmVjb3JkKSA/IDB4RkZGRjAwMDAgOiAwKSk7CisKKwkJRE1YX1dSSVRFX1JFRyhkbXgtPmlkLCBERU1VWF9DT05UUk9MLAorCQkJICAgICAgKDAgPDwgQllQQVNTX1VTRV9SRUNPREVSX1BBVEgpIHwKKwkJCSAgICAgICgwIDw8IElOU0VSVF9BVURJT19QRVNfU1RST05HX1NZTkMpIHwKKwkJCSAgICAgICgwIDw8IElOU0VSVF9WSURFT19QRVNfU1RST05HX1NZTkMpIHwKKwkJCSAgICAgICgwIDw8IE9USEVSX0lOVF9BVF9QRVNfQkVHSU5JTkcpIHwKKwkJCSAgICAgICgwIDw8IERJU0NBUkRfQVZfUEFDS0FHRSkgfAorCQkJICAgICAgKCghIWRteC0+ZHVtcF90c19zZWxlY3QpIDw8IFRTX1JFQ09SREVSX1NFTEVDVCkgfAorCQkJICAgICAgKHJlY29yZCA8PCBUU19SRUNPUkRFUl9FTkFCTEUpIHwKKwkJCSAgICAgICgxIDw8IEtFRVBfRFVQTElDQVRFX1BBQ0tBR0UpIHwKKwkJCSAgICAgICgxIDw8IFNFQ1RJT05fRU5EX1dJVEhfVEFCTEVfSUQpIHwKKwkJCSAgICAgICgxIDw8IEVOQUJMRV9GUkVFX0NMS19GRUNfREFUQV9WQUxJRCkgfAorCQkJICAgICAgKDEgPDwgRU5BQkxFX0ZSRUVfQ0xLX1NUQl9SRUcpIHwKKwkJCSAgICAgICgxIDw8IFNUQl9ERU1VWF9FTkFCTEUpIHwKKwkJCSAgICAgICh1c2Vfc29wIDw8IE5PVF9VU0VfT0ZfU09QX0lOUFVUKSB8CisJCQkgICAgICAoKHJlY29yZCk/IFZJREVPMl9GT1JfUkVDT1JERVJfU1RSRUFNIDogMCkpOworCQlwcl9kYmcoImRteCBjb250cm9sWyUjeF1cbiIsCisJCQlETVhfUkVBRF9SRUcoZG14LT5pZCwgREVNVVhfQ09OVFJPTCkpOworCX0gZWxzZSB7CisJCURNWF9XUklURV9SRUcoZG14LT5pZCwgU1RCX0lOVF9NQVNLLCAwKTsKKwkJLyogaWYgZGlzYWJsZSBGRUNfSU5QVVRfQ09OVFJPTCwgYmFja2dyb3VuZCBhbmQgdW5hdHRlbmRlZCByZWNvcmQgd2lsbCBmYWlsICovCisJCS8vIERNWF9XUklURV9SRUcoZG14LT5pZCwgRkVDX0lOUFVUX0NPTlRST0wsIDApOworCQlETVhfV1JJVEVfUkVHKGRteC0+aWQsIERFTVVYX0NPTlRST0wsIDApOworCQkvL2RteCBub3QgdXNlZCwgYnV0IGl0IGNhbiBjYXNjYWRlIGZvciBvdGhlciBkbXgKKwkJaWYgKChkbXgtPnNvdXJjZSA9PSBBTV9UU19TUkNfRE1YMCB8fAorCQkJZG14LT5zb3VyY2UgPT0gQU1fVFNfU1JDX0RNWDEgfHwKKwkJCWRteC0+c291cmNlID09IEFNX1RTX1NSQ19ETVgyICkgJiYKKwkJCShkbXgtPmlkICE9IGRteC0+c291cmNlLUFNX1RTX1NSQ19ETVgwKSkKKwkJCWRteF9jYXNjYWRlX3NldChkbXgtPmlkLGRteC0+c291cmNlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG14X3NldF9taXNjKHN0cnVjdCBhbWxfZG14ICpkbXgsIGludCBoaV9ic2YsIGludCBlbl9kc2MpCit7CisJaWYgKGhpX2JzZiA+PSAwKSB7CisJCURNWF9XUklURV9SRUcoZG14LT5pZCwgVFNfSElVX0NUTCwKKwkJCQkJaGlfYnNmID8KKwkJCQkJKERNWF9SRUFEX1JFRyhkbXgtPmlkLCBUU19ISVVfQ1RMKSB8CisJCQkJCSgxIDw8IFVTRV9ISV9CU0ZfSU5URVJGQUNFKSkKKwkJCQkJOgorCQkJCQkoRE1YX1JFQURfUkVHKGRteC0+aWQsIFRTX0hJVV9DVEwpICYKKwkJCQkJKH4oMSA8PCBVU0VfSElfQlNGX0lOVEVSRkFDRSkpKSk7CisJfQorCisJaWYgKGVuX2RzYyA+PSAwKSB7CisJCURNWF9XUklURV9SRUcoZG14LT5pZCwgRkVDX0lOUFVUX0NPTlRST0wsCisJCQkJZW5fZHNjID8KKwkJCQkoRE1YX1JFQURfUkVHKGRteC0+aWQsIEZFQ19JTlBVVF9DT05UUk9MKSB8CisJCQkJKDEgPDwgRkVDX0NPUkVfU0VMKSkKKwkJCQk6CisJCQkJKERNWF9SRUFEX1JFRyhkbXgtPmlkLCBGRUNfSU5QVVRfQ09OVFJPTCkgJgorCQkJCSh+KDEgPDwgRkVDX0NPUkVfU0VMKSkpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkbXhfc2V0X21pc2NfaWQoc3RydWN0IGFtbF9kdmIgKmR2YiwgaW50IGlkLCBpbnQgaGlfYnNmLCBpbnQgZW5fZHNjKQoreworCXJldHVybiBkbXhfc2V0X21pc2MoJmR2Yi0+ZG14W2lkXSwgaGlfYnNmLCBlbl9kc2MpOworfQorCisvKkdldCB0aGUgY2hhbm5lbCdzIElEIGJ5IGl0cyBQSUQqLworc3RhdGljIGludCBkbXhfZ2V0X2NoYW4oc3RydWN0IGFtbF9kbXggKmRteCwgaW50IHBpZCkKK3sKKwlpbnQgaWQ7CisKKwlmb3IgKGlkID0gMDsgaWQgPCBDSEFOTkVMX0NPVU5UOyBpZCsrKSB7CisJCWlmIChkbXgtPmNoYW5uZWxbaWRdLnVzZWQgJiYgZG14LT5jaGFubmVsW2lkXS5waWQgPT0gcGlkKQorCQkJcmV0dXJuIGlkOworCX0KKworCXJldHVybiAtMTsKK30KKworLypHZXQgdGhlIGNoYW5uZWwncyB0YXJnZXQqLworc3RhdGljIHUzMiBkbXhfZ2V0X2NoYW5fdGFyZ2V0KHN0cnVjdCBhbWxfZG14ICpkbXgsIGludCBjaWQpCit7CisJdTMyIHR5cGU7CisKKwlpZiAoIWRteC0+Y2hhbm5lbFtjaWRdLnVzZWQpCisJCXJldHVybiAoMHg3IDw8IFBJRF9UWVBFKSB8IGdfY2hhbl9kZWZfcGlkOworCisJaWYgKGRteC0+Y2hhbm5lbFtjaWRdLnR5cGUgPT0gRE1YX1RZUEVfU0VDKSB7CisJCXR5cGUgPSBTRUNUSU9OX1BBQ0tFVDsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKGRteC0+Y2hhbm5lbFtjaWRdLnBlc190eXBlKSB7CisJCWNhc2UgRE1YX1BFU19BVURJTzoKKwkJCXR5cGUgPSBBVURJT19QQUNLRVQ7CisJCQlicmVhazsKKwkJY2FzZSBETVhfUEVTX1ZJREVPOgorCQkJdHlwZSA9IFZJREVPX1BBQ0tFVDsKKwkJCWJyZWFrOworCQljYXNlIERNWF9QRVNfU1VCVElUTEU6CisJCWNhc2UgRE1YX1BFU19URUxFVEVYVDoKKwkJCXR5cGUgPSBTVUJfUEFDS0VUOworCQkJYnJlYWs7CisJCWNhc2UgRE1YX1BFU19QQ1I6CisJCQl0eXBlID0gU0NSX09OTFlfUEFDS0VUOworCQkJYnJlYWs7CisJCWNhc2UgRE1YX1BFU19BVURJTzM6CisJCQl0eXBlID0gT1RIRVJfUEVTX1BBQ0tFVDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdHlwZSA9IFJFQ09SREVSX1NUUkVBTTsKKwkJCWJyZWFrOworCQl9CisJfQorCWRteC0+Y2hhbm5lbFtjaWRdLnBrdF90eXBlID0gdHlwZTsKKworCXByX2RiZygiY2hhbiB0YXJnZXQ6ICV4ICV4XG4iLCB0eXBlLCBkbXgtPmNoYW5uZWxbY2lkXS5waWQpOworCXJldHVybiAodHlwZSA8PCBQSURfVFlQRSkgfCBkbXgtPmNoYW5uZWxbY2lkXS5waWQ7Cit9CisKKy8qR2V0IHRoZSBhZHZhbmNlIHZhbHVlIG9mIHRoZSBjaGFubmVsKi8KK3N0YXRpYyBpbmxpbmUgdTMyIGRteF9nZXRfY2hhbl9hZHZhbmNlKHN0cnVjdCBhbWxfZG14ICpkbXgsIGludCBjaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qU2V0IHRoZSBjaGFubmVsIHJlZ2lzdGVycyovCitzdGF0aWMgaW50IGRteF9zZXRfY2hhbl9yZWdzKHN0cnVjdCBhbWxfZG14ICpkbXgsIGludCBjaWQpCit7CisJdTMyIGRhdGEsIGFkZHIsIGFkdmFuY2UsIG1heDsKKworCXByX2RiZygic2V0IGNoYW5uZWwgKGlkOiVkIFBJRDoweCV4KSByZWdpc3RlcnNcbiIsIGNpZCwKKwkgICAgICAgZG14LT5jaGFubmVsW2NpZF0ucGlkKTsKKworCXdoaWxlIChETVhfUkVBRF9SRUcoZG14LT5pZCwgRk1fV1JfQUREUikgJiAweDgwMDApCisJCXVkZWxheSgxKTsKKworCWlmIChjaWQgJiAxKSB7CisJCWRhdGEgPQorCQkgICAgKGRteF9nZXRfY2hhbl90YXJnZXQoZG14LCBjaWQgLSAxKSA8PCAxNikgfAorCQkgICAgZG14X2dldF9jaGFuX3RhcmdldChkbXgsIGNpZCk7CisJCWFkdmFuY2UgPQorCQkgICAgKGRteF9nZXRfY2hhbl9hZHZhbmNlKGRteCwgY2lkKSA8PCA4KSB8CisJCSAgICBkbXhfZ2V0X2NoYW5fYWR2YW5jZShkbXgsIGNpZCAtIDEpOworCisJCWlmIChkbXgtPmNoYW5uZWxbY2lkIC0gMV0udXNlZCkKKwkJCXNldF9kZWJ1Z19kbXhfY2hhbnBpZHNfdHlwZXMoZG14LT5pZCwgY2lkIC0gMSwKKwkJCQlkbXgtPmNoYW5uZWxbY2lkIC0gMV0ucGt0X3R5cGUpOworCX0gZWxzZSB7CisJCWRhdGEgPQorCQkgICAgKGRteF9nZXRfY2hhbl90YXJnZXQoZG14LCBjaWQpIDw8IDE2KSB8CisJCSAgICBkbXhfZ2V0X2NoYW5fdGFyZ2V0KGRteCwgY2lkICsgMSk7CisJCWFkdmFuY2UgPQorCQkgICAgKGRteF9nZXRfY2hhbl9hZHZhbmNlKGRteCwgY2lkICsgMSkgPDwgOCkgfAorCQkgICAgZG14X2dldF9jaGFuX2FkdmFuY2UoZG14LCBjaWQpOworCisJCWlmIChkbXgtPmNoYW5uZWxbY2lkICsgMV0udXNlZCkKKwkJCXNldF9kZWJ1Z19kbXhfY2hhbnBpZHNfdHlwZXMoZG14LT5pZCwgY2lkICsgMSwKKwkJCQlkbXgtPmNoYW5uZWxbY2lkICsgMV0ucGt0X3R5cGUpOworCX0KKwlhZGRyID0gY2lkID4+IDE7CisJRE1YX1dSSVRFX1JFRyhkbXgtPmlkLCBGTV9XUl9EQVRBLCBkYXRhKTsKKwlETVhfV1JJVEVfUkVHKGRteC0+aWQsIEZNX1dSX0FERFIsIChhZHZhbmNlIDw8IDE2KSB8IDB4ODAwMCB8IGFkZHIpOworCisJcHJfZGJnKCJ3cml0ZSBmbSAleDoleFxuIiwgKGFkdmFuY2UgPDwgMTYpIHwgMHg4MDAwIHwgYWRkciwgZGF0YSk7CisKKwlmb3IgKG1heCA9IENIQU5ORUxfQ09VTlQgLSAxOyBtYXggPiAwOyBtYXgtLSkgeworCQlpZiAoZG14LT5jaGFubmVsW21heF0udXNlZCkKKwkJCWJyZWFrOworCX0KKworCWRhdGEgPSBETVhfUkVBRF9SRUcoZG14LT5pZCwgTUFYX0ZNX0NPTVBfQUREUikgJiAweEYwOworCURNWF9XUklURV9SRUcoZG14LT5pZCwgTUFYX0ZNX0NPTVBfQUREUiwgZGF0YSB8IChtYXggPj4gMSkpOworCisJcHJfZGJnKCJ3cml0ZSBmbSBjb21wICV4XG4iLCBkYXRhIHwgKG1heCA+PiAxKSk7CisKKwlpZiAoRE1YX1JFQURfUkVHKGRteC0+aWQsIE9NX0NNRF9TVEFUVVMpICYgMHg4ZTAwKSB7CisJCXByX2Vycm9yKCJ3YXJuaW5nOiBzZW5kIGNtZCAleFxuIiwKKwkJCSBETVhfUkVBRF9SRUcoZG14LT5pZCwgT01fQ01EX1NUQVRVUykpOworCX0KKworCWlmIChjaWQgPT0gMCkgeworCQl2aWRlb19wdHMgPSAwOworCQlmaXJzdF92aWRlb19wdHMgPSAwOworCX0KKwllbHNlIGlmIChjaWQgPT0gMSkgeworCQlhdWRpb19wdHMgPSAwOworCQlmaXJzdF9hdWRpb19wdHMgPSAwOworCX0KKworCWlmIChkbXgtPmNoYW5uZWxbY2lkXS51c2VkKQorCQlzZXRfZGVidWdfZG14X2NoYW5waWRzX3R5cGVzKGRteC0+aWQsIGNpZCwKKwkJCWRteC0+Y2hhbm5lbFtjaWRdLnBrdF90eXBlKTsKKwlyZXR1cm4gMDsKK30KKworLypHZXQgdGhlIGZpbHRlciB0YXJnZXQqLworc3RhdGljIGludCBkbXhfZ2V0X2ZpbHRlcl90YXJnZXQoc3RydWN0IGFtbF9kbXggKmRteCwgaW50IGZpZCwgdTMyICp0YXJnZXQsCisJCQkJIHU4ICphZHZhbmNlKQoreworCXN0cnVjdCBkbXhfc2VjdGlvbl9maWx0ZXIgKmZpbHRlcjsKKwlzdHJ1Y3QgYW1sX2ZpbHRlciAqZjsKKwlpbnQgaSwgY2lkLCBuZXFfYnl0ZXM7CisKKwlmaWQgPSBmaWQgJiAweEZGRkY7CisJZiA9ICZkbXgtPmZpbHRlcltmaWRdOworCisJaWYgKCFmLT51c2VkKSB7CisJCXRhcmdldFswXSA9IDB4MWZmZjsKKwkJYWR2YW5jZVswXSA9IDA7CisJCWZvciAoaSA9IDE7IGkgPCBGSUxURVJfTEVOOyBpKyspIHsKKwkJCXRhcmdldFtpXSA9IDB4OWZmZjsKKwkJCWFkdmFuY2VbaV0gPSAwOworCQl9CisJCXJldHVybiAwOworCX0KKworCWNpZCA9IGYtPmNoYW5faWQ7CisJZmlsdGVyID0gZi0+ZmlsdGVyOworCisJbmVxX2J5dGVzID0gMDsKKwlpZiAoZmlsdGVyLT5maWx0ZXJfbW9kZVswXSAhPSAweEZGKSB7CisJCW5lcV9ieXRlcyA9IDI7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMzsgaSA8IEZJTFRFUl9MRU47IGkrKykgeworCQkJaWYgKGZpbHRlci0+ZmlsdGVyX21vZGVbaV0gIT0gMHhGRikKKwkJCQluZXFfYnl0ZXMrKzsKKwkJfQorCX0KKworCWYtPm5lcSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgRklMVEVSX0xFTjsgaSsrKSB7CisJCXU4IHZhbHVlID0gZmlsdGVyLT5maWx0ZXJfdmFsdWVbaV07CisJCXU4IG1hc2sgPSBmaWx0ZXItPmZpbHRlcl9tYXNrW2ldOworCQl1OCBtb2RlID0gZmlsdGVyLT5maWx0ZXJfbW9kZVtpXTsKKwkJdTggbWIsIG1iMSwgbmIsIHYsIHQsIGFkdiA9IDA7CisKKwkJaWYgKCFpKSB7CisJCQltYiA9IDE7CisJCQltYjEgPSAxOworCQkJdiA9IDA7CisJCQlpZiAoKG1vZGUgPT0gMHhGRikgJiYgbWFzaykgeworCQkJCXQgPSBtYXNrICYgMHhGMDsKKwkJCQlpZiAodCkgeworCQkJCQltYjEgPSAwOworCQkJCQlhZHYgfD0gdF4weEYwOworCQkJCX0KKwkJCQl2IHw9ICh2YWx1ZSAmIDB4RjApIHwgYWR2OworCisJCQkJdCA9IG1hc2sgJiAweDBGOworCQkJCWlmICh0KSB7CisJCQkJCW1iICA9IDA7CisJCQkJCWFkdiB8PSB0XjB4MEY7CisJCQkJfQorCQkJCXYgfD0gKHZhbHVlICYgMHgwRikgfCBhZHY7CisJCQl9CisKKwkJCXRhcmdldFtpXSA9IChtYiA8PCBTRUNUSU9OX0ZJUlNUQllURV9NQVNLTE9XKSB8CisJCQkgICAgKG1iMSA8PCBTRUNUSU9OX0ZJUlNUQllURV9NQVNLSElHSCkgfAorCQkJICAgICgwIDw8IFNFQ1RJT05fRklSU1RCWVRFX0RJU0FCTEVfUElEX0NIRUNLKSB8CisJCQkgICAgKGNpZCA8PCBTRUNUSU9OX0ZJUlNUQllURV9QSURfSU5ERVgpIHwgdjsKKwkJCWFkdmFuY2VbaV0gPSBhZHY7CisJCX0gZWxzZSB7CisJCQlpZiAoaSA8IDMpIHsKKwkJCQl2YWx1ZSA9IDA7CisJCQkJbWFzayA9IDA7CisJCQkJbW9kZSA9IDB4ZmY7CisJCQl9CisJCQltYiA9IDE7CisJCQluYiA9IDA7CisJCQl2ID0gMDsKKworCQkJaWYgKChpID49IDMpICYmIG1hc2spIHsKKwkJCQlpZiAobW9kZSA9PSAweEZGKSB7CisJCQkJCW1iID0gMDsKKwkJCQkJbmIgPSAwOworCQkJCQlhZHYgPSBtYXNrIF4gMHhGRjsKKwkJCQkJdiA9IHZhbHVlIHwgYWR2OworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChuZXFfYnl0ZXMgPT0gMSkgeworCQkJCQkJbWIgPSAwOworCQkJCQkJbmIgPSAxOworCQkJCQkJYWR2ID0gbWFzayBeIDB4RkY7CisJCQkJCQl2ID0gdmFsdWUgJiB+YWR2OworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJdGFyZ2V0W2ldID0gKG1iIDw8IFNFQ1RJT05fUkVTVEJZVEVfTUFTSykgfAorCQkJICAgIChuYiA8PCBTRUNUSU9OX1JFU1RCWVRFX01BU0tfRVEpIHwKKwkJCSAgICAoMCA8PCBTRUNUSU9OX1JFU1RCWVRFX0RJU0FCTEVfUElEX0NIRUNLKSB8CisJCQkgICAgKGNpZCA8PCBTRUNUSU9OX1JFU1RCWVRFX1BJRF9JTkRFWCkgfCB2OworCQkJYWR2YW5jZVtpXSA9IGFkdjsKKwkJfQorCisJCWYtPnZhbHVlW2ldID0gdmFsdWU7CisJCWYtPm1hc2thbmRtb2RlW2ldID0gbWFzayAmIG1vZGU7CisJCWYtPm1hc2thbmRub3Rtb2RlW2ldID0gbWFzayAmIH5tb2RlOworCisJCWlmIChmLT5tYXNrYW5kbm90bW9kZVtpXSkKKwkJCWYtPm5lcSA9IDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qU2V0IHRoZSBmaWx0ZXIgcmVnaXN0ZXJzKi8KK3N0YXRpYyBpbnQgZG14X3NldF9maWx0ZXJfcmVncyhzdHJ1Y3QgYW1sX2RteCAqZG14LCBpbnQgZmlkKQoreworCXUzMiB0MVtGSUxURVJfTEVOXSwgdDJbRklMVEVSX0xFTl07CisJdTggYWR2YW5jZTFbRklMVEVSX0xFTl0sIGFkdmFuY2UyW0ZJTFRFUl9MRU5dOworCXUzMiBhZGRyLCBkYXRhLCBtYXgsIGFkdjsKKwlpbnQgaTsKKworCXByX2RiZygic2V0IGZpbHRlciAoaWQ6JWQpIHJlZ2lzdGVyc1xuIiwgZmlkKTsKKworCWlmIChmaWQgJiAxKSB7CisJCWRteF9nZXRfZmlsdGVyX3RhcmdldChkbXgsIGZpZCAtIDEsIHQxLCBhZHZhbmNlMSk7CisJCWRteF9nZXRfZmlsdGVyX3RhcmdldChkbXgsIGZpZCwgdDIsIGFkdmFuY2UyKTsKKwl9IGVsc2UgeworCQlkbXhfZ2V0X2ZpbHRlcl90YXJnZXQoZG14LCBmaWQsIHQxLCBhZHZhbmNlMSk7CisJCWRteF9nZXRfZmlsdGVyX3RhcmdldChkbXgsIGZpZCArIDEsIHQyLCBhZHZhbmNlMik7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEZJTFRFUl9MRU47IGkrKykgeworCQl3aGlsZSAoRE1YX1JFQURfUkVHKGRteC0+aWQsIEZNX1dSX0FERFIpICYgMHg4MDAwKQorCQkJdWRlbGF5KDEpOworCisJCWRhdGEgPSAodDFbaV0gPDwgMTYpIHwgdDJbaV07CisJCWFkZHIgPSAoZmlkID4+IDEpIHwgKChpICsgMSkgPDwgNCk7CisJCWFkdiA9IChhZHZhbmNlMVtpXSA8PCA4KSB8IGFkdmFuY2UyW2ldOworCisJCURNWF9XUklURV9SRUcoZG14LT5pZCwgRk1fV1JfREFUQSwgZGF0YSk7CisJCURNWF9XUklURV9SRUcoZG14LT5pZCwgRk1fV1JfQUREUiwgKGFkdiA8PCAxNikgfCAweDgwMDAgfCBhZGRyKTsKKworCQlwcl9kYmcoIndyaXRlIGZtICV4OiV4XG4iLCAoYWR2IDw8IDE2KSB8IDB4ODAwMCB8IGFkZHIsIGRhdGEpOworCX0KKworCWZvciAobWF4ID0gRklMVEVSX0NPVU5UIC0gMTsgbWF4ID4gMDsgbWF4LS0pIHsKKwkJaWYgKGRteC0+ZmlsdGVyW21heF0udXNlZCkKKwkJCWJyZWFrOworCX0KKworCWRhdGEgPSBETVhfUkVBRF9SRUcoZG14LT5pZCwgTUFYX0ZNX0NPTVBfQUREUikgJiAweEY7CisJRE1YX1dSSVRFX1JFRyhkbXgtPmlkLCBNQVhfRk1fQ09NUF9BRERSLCBkYXRhIHwgKChtYXggPj4gMSkgPDwgNCkpOworCisJcHJfZGJnKCJ3cml0ZSBmbSBjb21wICV4XG4iLCBkYXRhIHwgKChtYXggPj4gMSkgPDwgNCkpOworCisJaWYgKERNWF9SRUFEX1JFRyhkbXgtPmlkLCBPTV9DTURfU1RBVFVTKSAmIDB4OGUwMCkgeworCQlwcl9lcnJvcigiZXJyb3Igc2VuZCBjbWQgJXhcbiIsCisJCQkgRE1YX1JFQURfUkVHKGRteC0+aWQsIE9NX0NNRF9TVEFUVVMpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLypDbGVhciB0aGUgZmlsdGVyJ3MgYnVmZmVyKi8KK3N0YXRpYyB2b2lkIGRteF9jbGVhcl9maWx0ZXJfYnVmZmVyKHN0cnVjdCBhbWxfZG14ICpkbXgsIGludCBmaWQpCit7CisJdTMyIHNlY3Rpb25fYnVzeTMyID0gRE1YX1JFQURfUkVHKGRteC0+aWQsIFNFQ19CVUZGX1JFQURZKTsKKwl1MzIgZmlsdGVyX251bWJlcjsKKwlpbnQgaTsKKworCWlmICghc2VjdGlvbl9idXN5MzIpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBTRUNfQlVGX0NPVU5UOyBpKyspIHsKKwkJaWYgKHNlY3Rpb25fYnVzeTMyICYgKDEgPDwgaSkpIHsKKwkJCURNWF9XUklURV9SRUcoZG14LT5pZCwgU0VDX0JVRkZfTlVNQkVSLCBpKTsKKwkJCWZpbHRlcl9udW1iZXIgPQorCQkJICAgIChETVhfUkVBRF9SRUcoZG14LT5pZCwgU0VDX0JVRkZfTlVNQkVSKSA+PiA4KTsKKwkJCWlmIChmaWx0ZXJfbnVtYmVyICE9IGZpZCkKKwkJCQlzZWN0aW9uX2J1c3kzMiAmPSB+KDEgPDwgaSk7CisJCX0KKwl9CisKKwlpZiAoc2VjdGlvbl9idXN5MzIpCisJCURNWF9XUklURV9SRUcoZG14LT5pZCwgU0VDX0JVRkZfUkVBRFksIHNlY3Rpb25fYnVzeTMyKTsKK30KKworc3RhdGljIHZvaWQgYXN5bmNfZmlmb19kaXNhYmxlKHN0cnVjdCBhbWxfYXN5bmNmaWZvICphZmlmbykKK3sKKwlwcl9pbmYoIkFGKCVkKSBkaXNhYmxlIGFzeW5jZmlmb1xuIiwgYWZpZm8tPmlkKTsKKwlDTEVBUl9BU1lOQ19GSUZPX1JFR19NQVNLKGFmaWZvLT5pZCwgUkVHMSwgMSA8PCBBU1lOQ19GSUZPX0ZMVVNIX0VOKTsKKwlDTEVBUl9BU1lOQ19GSUZPX1JFR19NQVNLKGFmaWZvLT5pZCwgUkVHMiwgMSA8PCBBU1lOQ19GSUZPX0ZJTExfRU4pOworCWlmIChSRUFEX0FTWU5DX0ZJRk9fUkVHKGFmaWZvLT5pZCwgUkVHMikgJiAoMSA8PCBBU1lOQ19GSUZPX0ZJTExfRU4pCisJCXx8IFJFQURfQVNZTkNfRklGT19SRUcoYWZpZm8tPmlkLCBSRUcxKQorCQkJJiAoMSA8PCBBU1lOQ19GSUZPX0ZMVVNIX0VOKSkgeworCQlwcl9lcnJvcigiZGlzYWJsZSBmYWlsZWRcbiIpOworCX0gZWxzZQorCQlwcl9pbmYoImRpc2FibGUgb2tcbiIpOworCWFmaWZvLT5idWZfdG9nZ2xlID0gMDsKKwlhZmlmby0+YnVmX3JlYWQgPSAwOworfQorCitzdGF0aWMgdm9pZCBhc3luY19maWZvX3NldF9yZWdzKHN0cnVjdCBhbWxfYXN5bmNmaWZvICphZmlmbywgaW50IHNvdXJjZV92YWwpCit7CisJdTMyIHN0YXJ0X2FkZHIgPSAoYWZpZm8tPnNlY3VyZV9lbmFibGUgJiYgYWZpZm8tPmJsay5hZGRyKT8KKwkJCWFmaWZvLT5ibGsuYWRkciA6IHZpcnRfdG9fcGh5cygodm9pZCAqKWFmaWZvLT5wYWdlcyk7CisJdTMyIHNpemUgPSBhZmlmby0+YnVmX2xlbjsKKwl1MzIgZmx1c2hfc2l6ZSA9IGFmaWZvLT5mbHVzaF9zaXplOworCWludCBmYWN0b3IgPSBkbXhfZ2V0X29yZGVyKHNpemUgLyBmbHVzaF9zaXplKTsKKwl1MzIgb2xkX3NpemUsIG5ld19zaXplLCBvbGRfZmFjdG9yLCBuZXdfZmFjdG9yOworCWludCBvbGRfc3JjLCBvbGRfZW47CisKKwlvbGRfZW4gID0gUkVBRF9BU1lOQ19GSUZPX1JFRyhhZmlmby0+aWQsIFJFRzIpCisJCQkmICgxIDw8IEFTWU5DX0ZJRk9fRklMTF9FTik7CisJb2xkX3NyYyA9CisJCShSRUFEX0FTWU5DX0ZJRk9fUkVHKGFmaWZvLT5pZCwgUkVHMikgPj4gQVNZTkNfRklGT19TT1VSQ0VfTFNCKQorCQkmIDM7CisKKwluZXdfc2l6ZSA9IChzaXplID4+IDcpICYgMHg3ZmZmOworCW9sZF9zaXplID0KKwkJKFJFQURfQVNZTkNfRklGT19SRUcoYWZpZm8tPmlkLCBSRUcxKQorCQkJPj4gQVNZTkNfRklGT19GTFVTSF9DTlRfTFNCKQorCQkmIDB4N2ZmZjsKKworCW9sZF9mYWN0b3IgPQorCQkoUkVBRF9BU1lOQ19GSUZPX1JFRyhhZmlmby0+aWQsIFJFRzMpCisJCQk+PiBBU1lOQ19GTFVTSF9TSVpFX0lSUV9MU0IpCisJCSYgMHg3ZmZmOworCW5ld19mYWN0b3IgPSAoKHNpemUgPj4gKGZhY3RvciArIDcpKSAtIDEpICYgMHg3ZmZmOworCisJcHJfaW5mKCJBRiglZCkgWyVzXSBzcmM6MHgleC0+MHgleCBzaXplOjB4JXgtPjB4JXggZmFjdG9yOjB4JXgtPjB4JXhcbiIsCisJCWFmaWZvLT5pZCwKKwkJb2xkX2VuPyAib24iIDogIm9mZiIsCisJCW9sZF9zcmMsIHNvdXJjZV92YWwsCisJCW9sZF9zaXplLCBuZXdfc2l6ZSwKKwkJb2xkX2ZhY3RvciwgbmV3X2ZhY3Rvcik7CisKKwlpZiAob2xkX2VuCisJCSYmIChvbGRfc3JjID09IHNvdXJjZV92YWwpCisJCSYmIChuZXdfc2l6ZSA9PSBvbGRfc2l6ZSkKKwkJJiYgKG9sZF9mYWN0b3IgPT0gbmV3X2ZhY3RvcikpCisJCXJldHVybjsKKworCWlmIChvbGRfZW4pIHsKKwkJaWYgKChvbGRfc2l6ZSA9PSBuZXdfc2l6ZSkKKwkJCSYmIChvbGRfZmFjdG9yID09IG5ld19mYWN0b3IpKSB7CisJCQkvKm9ubHkgc291cmNlIGNoYW5nZWQsIGRvIG5vdCByZXNldCBhbGwqLworCQkJLyogQ29ubmVjdCB0aGUgREVNVVggdG8gQVNZTkNfRklGTyAqLworCQkJV1JJVEVfQVNZTkNfRklGT19SRUcoYWZpZm8tPmlkLCBSRUcyLAorCQkJCShSRUFEX0FTWU5DX0ZJRk9fUkVHKGFmaWZvLT5pZCwgUkVHMikKKwkJCQkmIH4oMHgzIDw8IEFTWU5DX0ZJRk9fU09VUkNFX0xTQikpCisJCQkJfCAoc291cmNlX3ZhbCA8PCBBU1lOQ19GSUZPX1NPVVJDRV9MU0IpKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCS8qRHluYW1pYyBjaGFuZ2Ugc2V0dGluZyBpcyBub3Qgc3VwcG9ydGVkLAorCQkJICpzaG91bGQgZGlzYWJsZSBpdCBmaXJzdC4KKwkJCSAqRGF0YSBkaXNjb250aW51ZSB3aWxsIGJlIGhlcmUuCisJCQkgKi8KKwkJCWFzeW5jX2ZpZm9fZGlzYWJsZShhZmlmbyk7CisJCX0KKwl9CisKKwlwcl9pbmYoIkFTWU5DIEZJRk8gaWQ9JWQsIGxpbmsgdG8gRE1YJWQsIHN0YXJ0X2FkZHIgJXgsIGJ1Zl9zaXplICVkLCIKKwkJInNvdXJjZSB2YWx1ZSAweCV4LCBmYWN0b3IgJWRcbiIsCisJCWFmaWZvLT5pZCwgYWZpZm8tPnNvdXJjZSwgc3RhcnRfYWRkciwgc2l6ZSwgc291cmNlX3ZhbCwgZmFjdG9yKTsKKworCS8qIERlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwlXUklURV9BU1lOQ19GSUZPX1JFRyhhZmlmby0+aWQsIFJFRzAsIHN0YXJ0X2FkZHIpOworCisJLyogU2V0dXAgZmx1c2ggcGFyYW1ldGVycyAqLworCVdSSVRFX0FTWU5DX0ZJRk9fUkVHKGFmaWZvLT5pZCwgUkVHMSwKKwkJCSgwIDw8IEFTWU5DX0ZJRk9fVE9fSElVKSB8CisJCQkoMCA8PCBBU1lOQ19GSUZPX0ZMVVNIKSB8CisJCQkvKiBkb24ndCBmbHVzaCB0aGUgcGF0aCAqLworCQkJKDEgPDwgQVNZTkNfRklGT19SRVNFVCkgfAorCQkJLyogcmVzZXQgdGhlIHBhdGggKi8KKwkJCSgxIDw8IEFTWU5DX0ZJRk9fV1JBUF9FTikgfAorCQkJLyogd3JhcCBlbmFibGUgKi8KKwkJCSgwIDw8IEFTWU5DX0ZJRk9fRkxVU0hfRU4pIHwKKwkJCS8qIGRpc2FibGUgdGhlIGZsdXNoIHBhdGggKi8KKwkJCS8qKDB4MyA8PCBBU1lOQ19GSUZPX0ZMVVNIX0NOVF9MU0IpOworCQkJICogZmx1c2ggMyB4IDMyICAzMi1iaXQgd29yZHMKKwkJCSAqLworCQkJLyooMHg3ZmZmIDw8IEFTWU5DX0ZJRk9fRkxVU0hfQ05UX0xTQik7CisJCQkgKiBmbHVzaCA0TUJ5dGVzIG9mIGRhdGEKKwkJCSAqLworCQkJKCgoc2l6ZSA+PiA3KSAmIDB4N2ZmZikgPDwgQVNZTkNfRklGT19GTFVTSF9DTlRfTFNCKSk7CisJCQkvKiBudW1iZXIgb2YgMTI4LWJ5dGUgYmxvY2tzIHRvIGZsdXNoICovCisKKwkvKiBjbGVhciB0aGUgcmVzZXQgc2lnbmFsICovCisJV1JJVEVfQVNZTkNfRklGT19SRUcoYWZpZm8tPmlkLCBSRUcxLAorCQkgICAgIFJFQURfQVNZTkNfRklGT19SRUcoYWZpZm8tPmlkLAorCQkJCQlSRUcxKSAmIH4oMSA8PCBBU1lOQ19GSUZPX1JFU0VUKSk7CisJLyogRW5hYmxlIGZsdXNoICovCisJV1JJVEVfQVNZTkNfRklGT19SRUcoYWZpZm8tPmlkLCBSRUcxLAorCQkgICAgIFJFQURfQVNZTkNfRklGT19SRUcoYWZpZm8tPmlkLAorCQkJCVJFRzEpIHwgKDEgPDwgQVNZTkNfRklGT19GTFVTSF9FTikpOworCisJLypTZXR1cCBGaWxsIHBhcmFtZXRlcnMgKi8KKwlXUklURV9BU1lOQ19GSUZPX1JFRyhhZmlmby0+aWQsIFJFRzIsCisJCQkgICAgICgxIDw8IEFTWU5DX0ZJRk9fRU5ESUFOX0xTQikgfAorCQkJICAgICAoMCA8PCBBU1lOQ19GSUZPX0ZJTExfRU4pIHwKKwkJCSAgICAgLyogZGlzYWJsZSBmaWxsIHBhdGggdG8gcmVzZXQgZmlsbCBwYXRoICovCisJCQkgICAgIC8qKDk2IDw8IEFTWU5DX0ZJRk9fRklMTF9DTlRfTFNCKTsKKwkJCSAgICAgICozIHggMzIgIDMyLWJpdCB3b3JkcworCQkJICAgICAgKi8KKwkJCSAgICAgKDAgPDwgQVNZTkNfRklGT19GSUxMX0NOVF9MU0IpKTsKKwkJCQkvKiBmb3JldmVyIEZJTEw7ICovCisJV1JJVEVfQVNZTkNfRklGT19SRUcoYWZpZm8tPmlkLCBSRUcyLAorCQkJUkVBRF9BU1lOQ19GSUZPX1JFRyhhZmlmby0+aWQsIFJFRzIpIHwKKwkJCQkoMSA8PCBBU1lOQ19GSUZPX0ZJTExfRU4pKTsvKkVuYWJsZSBmaWxsIHBhdGgqLworCisJLyogZ2VuZXJhdGUgZmx1c2ggaW50ZXJydXB0ICovCisJV1JJVEVfQVNZTkNfRklGT19SRUcoYWZpZm8tPmlkLCBSRUczLAorCQkJKFJFQURfQVNZTkNfRklGT19SRUcoYWZpZm8tPmlkLCBSRUczKSAmIDB4ZmZmZjAwMDApIHwKKwkJCQkoKCgoc2l6ZSA+PiAoZmFjdG9yICsgNykpIC0gMSkgJiAweDdmZmYpIDw8CisJCQkJCUFTWU5DX0ZMVVNIX1NJWkVfSVJRX0xTQikpOworCisJLyogQ29ubmVjdCB0aGUgU1RCIERFTVVYIHRvIEFTWU5DX0ZJRk8gKi8KKwlXUklURV9BU1lOQ19GSUZPX1JFRyhhZmlmby0+aWQsIFJFRzIsCisJCQlSRUFEX0FTWU5DX0ZJRk9fUkVHKGFmaWZvLT5pZCwgUkVHMikgfAorCQkJKHNvdXJjZV92YWwgPDwgQVNZTkNfRklGT19TT1VSQ0VfTFNCKSk7Cit9CisKKy8qUmVzZXQgdGhlIEFTWU5DIEZJRk9TIHdoZW4gYSBBU1lOQyBGSUZPIGNvbm5lY3QgdG8gYSBkaWZmZXJlbnQgRE1YKi8KK3N0YXRpYyB2b2lkIHJlc2V0X2FzeW5jX2ZpZm9zKHN0cnVjdCBhbWxfZHZiICpkdmIpCit7CisJc3RydWN0IGFtbF9hc3luY2ZpZm8gKmxvd19kbXhfZmlmbyA9IE5VTEw7CisJc3RydWN0IGFtbF9hc3luY2ZpZm8gKmhpZ2hfZG14X2ZpZm8gPSBOVUxMOworCXN0cnVjdCBhbWxfYXN5bmNmaWZvICpoaWdoZXN0X2RteF9maWZvID0gTlVMTDsKKwlpbnQgaSwgajsKKwlpbnQgcmVjb3JkX2VuYWJsZTsKKworCXN0cnVjdCBhbWxfYXN5bmNmaWZvICphZmlmbyA9IE5VTEw7CisKKwlmb3IgKGogPSAwOyBqIDwgRE1YX0RFVl9DT1VOVDsgaisrKSB7CisJCWlmICghZHZiLT5kbXhbal0uaW5pdCkKKwkJCWNvbnRpbnVlOworCisJCXJlY29yZF9lbmFibGUgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgZHZiLT5hc3luY19maWZvX3RvdGFsX2NvdW50OyBpKyspIHsKKwkJCWFmaWZvID0gJmR2Yi0+YXN5bmNmaWZvW2ldOworCisJCQlpZiAoIWFmaWZvLT5pbml0KQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoIWR2Yi0+ZG14W2pdLnJlY29yZAorCQkJCXx8ICEoZHZiLT5kbXhbal0uaWQgPT0gYWZpZm8tPnNvdXJjZSkpCisJCQkJY29udGludWU7CisKKwkJCS8qVGhpcyBkbXggaXMgbGlua2VkIHRvIHRoZSBhc3luYyBmaWZvLAorCQkJICpFbmFibGUgdGhlIFRTX1JFQ09SREVSX0VOQUJMRQorCQkJICovCisJCQlyZWNvcmRfZW5hYmxlID0gMTsKKwkJCWlmICghbG93X2RteF9maWZvKSB7CisJCQkJbG93X2RteF9maWZvID0gYWZpZm87CisJCQl9IGVsc2UgaWYgKGxvd19kbXhfZmlmby0+c291cmNlID4KKwkJCQkgICBhZmlmby0+c291cmNlKSB7CisJCQkJaWYgKCFoaWdoX2RteF9maWZvKQorCQkJCQloaWdoX2RteF9maWZvID0gbG93X2RteF9maWZvOworCQkJCWVsc2UgeworCQkJCQloaWdoZXN0X2RteF9maWZvID0gaGlnaF9kbXhfZmlmbzsKKwkJCQkJaGlnaF9kbXhfZmlmbyA9IGxvd19kbXhfZmlmbzsKKwkJCQl9CisJCQkJbG93X2RteF9maWZvID0gYWZpZm87CisJCQl9IGVsc2UgaWYgKGxvd19kbXhfZmlmby0+c291cmNlIDwgYWZpZm8tPnNvdXJjZSkgeworCQkJCWlmICghaGlnaF9kbXhfZmlmbykKKwkJCQkJaGlnaF9kbXhfZmlmbyA9IGFmaWZvOworCQkJCWVsc2UgeworCQkJCQlpZiAoaGlnaF9kbXhfZmlmby0+c291cmNlID4KKwkJCQkJCWFmaWZvLT5zb3VyY2UpIHsKKwkJCQkJCWhpZ2hlc3RfZG14X2ZpZm8gPQorCQkJCQkJCWhpZ2hfZG14X2ZpZm87CisJCQkJCQloaWdoX2RteF9maWZvID0gYWZpZm87CisJCQkJCX0gZWxzZSB7CisJCQkJCQloaWdoZXN0X2RteF9maWZvID0gYWZpZm87CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCXByX2luZigiU2V0IERNWCVkIFRTX1JFQ09SREVSX0VOQUJMRSB0byAlZFxuIiwgZHZiLT5kbXhbal0uaWQsCisJCQlyZWNvcmRfZW5hYmxlID8gMSA6IDApOworCisJCWlmIChyZWNvcmRfZW5hYmxlKSB7CisJCQlpbnQgb2xkX2VuID0KKwkJCQlETVhfUkVBRF9SRUcoZHZiLT5kbXhbal0uaWQsIERFTVVYX0NPTlRST0wpCisJCQkJJiAoMSA8PCBUU19SRUNPUkRFUl9FTkFCTEUpOworCisJCQlpZiAoIW9sZF9lbikgeworCQkJCURNWF9XUklURV9SRUcoZHZiLT5kbXhbal0uaWQsIERFTVVYX0NPTlRST0wsCisJCQkJCURNWF9SRUFEX1JFRyhkdmItPmRteFtqXS5pZCwKKwkJCQkJCURFTVVYX0NPTlRST0wpCisJCQkJCXwgKDEgPDwgVFNfUkVDT1JERVJfRU5BQkxFKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpbnQgb2xkX2VuID0KKwkJCQlETVhfUkVBRF9SRUcoZHZiLT5kbXhbal0uaWQsIERFTVVYX0NPTlRST0wpCisJCQkJJiAoMSA8PCBUU19SRUNPUkRFUl9FTkFCTEUpOworCisJCQlpZiAob2xkX2VuKSB7CisJCQkJRE1YX1dSSVRFX1JFRyhkdmItPmRteFtqXS5pZCwgREVNVVhfQ09OVFJPTCwKKwkJCQkJRE1YX1JFQURfUkVHKGR2Yi0+ZG14W2pdLmlkLAorCQkJCQkJREVNVVhfQ09OVFJPTCkKKwkJCQkJJiAofigxIDw8IFRTX1JFQ09SREVSX0VOQUJMRSkpKTsKKwkJCX0KKwkJfQorCX0KKwlwcl9pbmYoInJlc2V0IEFTWU5DIEZJRk9zXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgZHZiLT5hc3luY19maWZvX3RvdGFsX2NvdW50OyBpKyspIHsKKwkJaW50IG9sZDsKKworCQlhZmlmbyA9ICZkdmItPmFzeW5jZmlmb1tpXTsKKworCQlpZiAoIWFmaWZvLT5pbml0KQorCQkJY29udGludWU7CisKKwkJb2xkID0gUkVBRF9BU1lOQ19GSUZPX1JFRyhhZmlmby0+aWQsIFJFRzIpCisJCQkmICgxIDw8IEFTWU5DX0ZJRk9fRklMTF9FTik7CisKKwkJaWYgKG9sZAorCQkJJiYgKGFmaWZvICE9IGxvd19kbXhfZmlmbykKKwkJCSYmIChhZmlmbyAhPSBoaWdoX2RteF9maWZvKQorCQkJJiYgKGFmaWZvICE9IGhpZ2hlc3RfZG14X2ZpZm8pKQorCQkJYXN5bmNfZmlmb19kaXNhYmxlKGFmaWZvKTsKKwl9CisKKwkvKlNldCB0aGUgYXN5bmMgZmlmbyByZWdzICovCisJaWYgKGxvd19kbXhfZmlmbykgeworCQlhc3luY19maWZvX3NldF9yZWdzKGxvd19kbXhfZmlmbywgMHgzKTsKKworCQlpZiAoaGlnaF9kbXhfZmlmbykgeworCQkJYXN5bmNfZmlmb19zZXRfcmVncyhoaWdoX2RteF9maWZvLCAweDIpOworCisJCQlpZiAoaGlnaGVzdF9kbXhfZmlmbykKKwkJCQlhc3luY19maWZvX3NldF9yZWdzKGhpZ2hlc3RfZG14X2ZpZm8sIDB4MCk7CisJCX0KKwl9Cit9CisKKy8qUmVzZXQgdGhlIGRlbXV4IGRldmljZSovCit2b2lkIGRteF9yZXNldF9odyhzdHJ1Y3QgYW1sX2R2YiAqZHZiKQoreworCWRteF9yZXNldF9od19leChkdmIsIDEpOworfQorCisvKlJlc2V0IHRoZSBkZW11eCBkZXZpY2UqLwordm9pZCBkbXhfcmVzZXRfaHdfZXgoc3RydWN0IGFtbF9kdmIgKmR2YiwgaW50IHJlc2V0X2lycSkKK3sKKwlpbnQgaWQsIHRpbWVzOworCXUzMiBwY3JfbnVtW0RNWF9ERVZfQ09VTlRdOworCXUzMiBwY3JfcmVnW0RNWF9ERVZfQ09VTlRdOworCisJcHJfZGJnKCJbZG14X2twaV0gZGVtdXggcmVzZXQgYmVnaW5cbiIpOworCisJZm9yIChpZCA9IDA7IGlkIDwgRE1YX0RFVl9DT1VOVDsgaWQrKykgeworCQlpZiAoIWR2Yi0+ZG14W2lkXS5pbml0KQorCQkJY29udGludWU7CisJCXBjcl9yZWdbaWRdID0gRE1YX1JFQURfUkVHKGlkLCBQQ1I5MEtfQ1RMKTsKKwkJcGNyX251bVtpZF0gPSBETVhfUkVBRF9SRUcoaWQsIEFTU0lHTl9QSURfTlVNQkVSKTsKKwkJcHJfZGJnKCJyZXNldCBkZW11eCwgcGNyX3JlZ3NbJWRdOjB4JXgsIHBjcl9udW1bJWRdOjB4JXhcbiIsIGlkLCBwY3JfcmVnW2lkXSwgaWQsIHBjcl9udW1baWRdKTsKKwkJaWYgKHJlc2V0X2lycSkgeworCQkJaWYgKGR2Yi0+ZG14W2lkXS5kbXhfaXJxICE9IC0xKQorCQkJCWRpc2FibGVfaXJxKGR2Yi0+ZG14W2lkXS5kbXhfaXJxKTsKKwkJCWlmIChkdmItPmRteFtpZF0uZHZyX2lycSAhPSAtMSkKKwkJCQlkaXNhYmxlX2lycShkdmItPmRteFtpZF0uZHZyX2lycSk7CisJCX0KKwl9CisjaWZkZWYgRU5BQkxFX1NFQ19CVUZGX1dBVENIRE9HCisJaWYgKHJlc2V0X2lycSkKKwkJZGVsX3RpbWVyX3N5bmMoJmR2Yi0+d2F0Y2hkb2dfdGltZXIpOworI2VuZGlmCisJLypSRVNFVF9UT1Agd2lsbCBjbGVhciB0aGUgZHNjIHBpZCAsIHNhdmUgYWxsIGRzYyBwaWQgdGhhdCBzZXR0aW5nIGluIFRBKi8KKwlmb3IgKGlkID0gMDsgaWQgPCBEU0NfREVWX0NPVU5UOyBpZCsrKSB7CisJCXN0cnVjdCBhbWxfZHNjICpkc2MgPSAmZHZiLT5kc2NbaWRdOworCQlpbnQgbjsKKworCQlmb3IgKG4gPSAwOyBuIDwgRFNDX0NPVU5UOyBuKyspIHsKKwkJCXN0cnVjdCBhbWxfZHNjX2NoYW5uZWwgKmNoID0gJmRzYy0+Y2hhbm5lbFtuXTsKKwkJCS8qaWYoY2gtPnVzZWQpKi8KKwkJCXsKKwkJCQljaC0+aWQgPSBuOworCQkJCWRzY19nZXRfcGlkKGNoLCZjaC0+cGlkKTsKKwkJCX0KKwkJfQorCX0KKworCS8qeworCQl1MzIgZGF0YTsKKwkJZGF0YSA9IFJFQURfTVBFR19SRUcoU1RCX1RPUF9DT05GSUcpOworCQljaXBsdXMgPSAweDdDMDAwMDAwICYgZGF0YTsKKwl9Ki8KKworCVdSSVRFX01QRUdfUkVHKFJFU0VUMV9SRUdJU1RFUiwgUkVTRVRfREVNVVhTVEIpOworCS8qV1JJVEVfTVBFR19SRUcoUkVTRVQzX1JFR0lTVEVSLCBSRVNFVF9ERU1VWDJ8UkVTRVRfREVNVVgxfFJFU0VUX0RFTVVYMHxSRVNFVF9TMlAxfFJFU0VUX1MyUDB8UkVTRVRfVE9QKTsqLworCisJZm9yIChpZCA9IDA7IGlkIDwgRE1YX0RFVl9DT1VOVDsgaWQrKykgeworCQl0aW1lcyA9IDA7CisJCXdoaWxlICh0aW1lcysrIDwgMTAwMDAwMCkgeworCQkJaWYgKCEoRE1YX1JFQURfUkVHKGlkLCBPTV9DTURfU1RBVFVTKSAmIDB4MDEpKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJV1JJVEVfTVBFR19SRUcoU1RCX1RPUF9DT05GSUcsIDApOworCVdSSVRFX01QRUdfUkVHKFNUQl9TMlAyX0NPTkZJRywgMCk7CisKKwlmb3IgKGlkID0gMDsgaWQgPCBETVhfREVWX0NPVU5UOyBpZCsrKSB7CisJCXUzMiB2ZXJzaW9uLCBkYXRhOworCisJCWlmICghZHZiLT5kbXhbaWRdLmluaXQpCisJCQljb250aW51ZTsKKworCQlpZiAocmVzZXRfaXJxKSB7CisJCQlpZiAoZHZiLT5kbXhbaWRdLmRteF9pcnEgIT0gLTEpCisJCQkJZW5hYmxlX2lycShkdmItPmRteFtpZF0uZG14X2lycSk7CisJCQlpZiAoZHZiLT5kbXhbaWRdLmR2cl9pcnEgIT0gLTEpCisJCQkJZW5hYmxlX2lycShkdmItPmRteFtpZF0uZHZyX2lycSk7CisJCX0KKwkJRE1YX1dSSVRFX1JFRyhpZCwgREVNVVhfQ09OVFJPTCwgMHgwMDAwKTsKKwkJdmVyc2lvbiA9IERNWF9SRUFEX1JFRyhpZCwgU1RCX1ZFUlNJT04pOworCQlETVhfV1JJVEVfUkVHKGlkLCBTVEJfVEVTVF9SRUcsIHZlcnNpb24pOworCQlwcl9kYmcoIlNUQiAlZCBoYXJkd2FyZSB2ZXJzaW9uIDogJWRcbiIsIGlkLCB2ZXJzaW9uKTsKKwkJRE1YX1dSSVRFX1JFRyhpZCwgU1RCX1RFU1RfUkVHLCAweDU1NTApOworCQlkYXRhID0gRE1YX1JFQURfUkVHKGlkLCBTVEJfVEVTVF9SRUcpOworCQlpZiAoZGF0YSAhPSAweDU1NTApCisJCQlwcl9lcnJvcigiU1RCICVkIHJlZ2lzdGVyIGFjY2VzcyBmYWlsZWRcbiIsIGlkKTsKKwkJRE1YX1dSSVRFX1JFRyhpZCwgU1RCX1RFU1RfUkVHLCAweGFhYTApOworCQlkYXRhID0gRE1YX1JFQURfUkVHKGlkLCBTVEJfVEVTVF9SRUcpOworCQlpZiAoZGF0YSAhPSAweGFhYTApCisJCQlwcl9lcnJvcigiU1RCICVkIHJlZ2lzdGVyIGFjY2VzcyBmYWlsZWRcbiIsIGlkKTsKKwkJRE1YX1dSSVRFX1JFRyhpZCwgTUFYX0ZNX0NPTVBfQUREUiwgMHgwMDAwKTsKKwkJRE1YX1dSSVRFX1JFRyhpZCwgU1RCX0lOVF9NQVNLLCAwKTsKKwkJRE1YX1dSSVRFX1JFRyhpZCwgU1RCX0lOVF9TVEFUVVMsIDB4ZmZmZik7CisJCURNWF9XUklURV9SRUcoaWQsIEZFQ19JTlBVVF9DT05UUk9MLCAwKTsKKwl9CisKKwlzdGJfZW5hYmxlKGR2Yik7CisKKwlmb3IgKGlkID0gMDsgaWQgPCBETVhfREVWX0NPVU5UOyBpZCsrKSB7CisJCXN0cnVjdCBhbWxfZG14ICpkbXggPSAmZHZiLT5kbXhbaWRdOworCQlpbnQgbjsKKwkJdW5zaWduZWQgbG9uZyBhZGRyOworCQl1bnNpZ25lZCBsb25nIGJhc2U7CisJCXVuc2lnbmVkIGxvbmcgZ3JwX2FkZHJbU0VDX0JVRl9HUlBfQ09VTlRdOworCQlpbnQgZ3JwX2xlbltTRUNfQlVGX0dSUF9DT1VOVF07CisKKwkJaWYgKCFkdmItPmRteFtpZF0uaW5pdCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChkbXgtPnNlY19wYWdlcykgeworCQkJZ3JwX2xlblswXSA9ICgxIDw8IFNFQ19HUlBfTEVOXzApICogODsKKwkJCWdycF9sZW5bMV0gPSAoMSA8PCBTRUNfR1JQX0xFTl8xKSAqIDg7CisJCQlncnBfbGVuWzJdID0gKDEgPDwgU0VDX0dSUF9MRU5fMikgKiA4OworCQkJZ3JwX2xlblszXSA9ICgxIDw8IFNFQ19HUlBfTEVOXzMpICogODsKKworCQkJZ3JwX2FkZHJbMF0gPSB2aXJ0X3RvX3BoeXMoKHZvaWQgKilkbXgtPnNlY19wYWdlcyk7CisJCQlncnBfYWRkclsxXSA9IGdycF9hZGRyWzBdICsgZ3JwX2xlblswXTsKKwkJCWdycF9hZGRyWzJdID0gZ3JwX2FkZHJbMV0gKyBncnBfbGVuWzFdOworCQkJZ3JwX2FkZHJbM10gPSBncnBfYWRkclsyXSArIGdycF9sZW5bMl07CisKKwkJCWJhc2UgPSBncnBfYWRkclswXSAmIDB4RkZGRjAwMDA7CisJCQlETVhfV1JJVEVfUkVHKGRteC0+aWQsIFNFQ19CVUZGX0JBU0UsIGJhc2UgPj4gMTYpOworCQkJRE1YX1dSSVRFX1JFRyhkbXgtPmlkLCBTRUNfQlVGRl8wMV9TVEFSVCwKKwkJCQkJKCgoZ3JwX2FkZHJbMF0gLSBiYXNlKSA+PiA4KSA8PCAxNikgfAorCQkJCQkgKChncnBfYWRkclsxXSAtIGJhc2UpID4+IDgpKTsKKwkJCURNWF9XUklURV9SRUcoZG14LT5pZCwgU0VDX0JVRkZfMjNfU1RBUlQsCisJCQkJCSgoKGdycF9hZGRyWzJdIC0gYmFzZSkgPj4gOCkgPDwgMTYpIHwKKwkJCQkJICgoZ3JwX2FkZHJbM10gLSBiYXNlKSA+PiA4KSk7CisJCQlETVhfV1JJVEVfUkVHKGRteC0+aWQsIFNFQ19CVUZGX1NJWkUsCisJCQkJCVNFQ19HUlBfTEVOXzAgfAorCQkJCQkoU0VDX0dSUF9MRU5fMSA8PCA0KSB8CisJCQkJCShTRUNfR1JQX0xFTl8yIDw8IDgpIHwKKwkJCQkJKFNFQ19HUlBfTEVOXzMgPDwgMTIpKTsKKwkJfQorI2lmZGVmIE5PX1NVQgorI2lmbmRlZiBTVUJfUEFSU0VSCisJCWlmIChkbXgtPnN1Yl9wYWdlcykgeworCQkJYWRkciA9IHZpcnRfdG9fcGh5cygodm9pZCAqKWRteC0+c3ViX3BhZ2VzKTsKKwkJCURNWF9XUklURV9SRUcoZG14LT5pZCwgU0JfU1RBUlQsIGFkZHIgPj4gMTIpOworCQkJRE1YX1dSSVRFX1JFRyhkbXgtPmlkLCBTQl9MQVNUX0FERFIsCisJCQkJICAgICAgKGRteC0+c3ViX2J1Zl9sZW4gPj4gMykgLSAxKTsKKwkJfQorI2VuZGlmCisjZW5kaWYKKwkJaWYgKGRteC0+cGVzX3BhZ2VzKSB7CisJCQlhZGRyID0gdmlydF90b19waHlzKCh2b2lkICopZG14LT5wZXNfcGFnZXMpOworCQkJRE1YX1dSSVRFX1JFRyhkbXgtPmlkLCBPQl9TVEFSVCwgYWRkciA+PiAxMik7CisJCQlETVhfV1JJVEVfUkVHKGRteC0+aWQsIE9CX0xBU1RfQUREUiwKKwkJCQkgICAgICAoZG14LT5wZXNfYnVmX2xlbiA+PiAzKSAtIDEpOworCQl9CisKKwkJZm9yIChuID0gMDsgbiA8IENIQU5ORUxfQ09VTlQ7IG4rKykgeworCQkJLypzdHJ1Y3QgYW1sX2NoYW5uZWwgKmNoYW4gPSAmZG14LT5jaGFubmVsW25dOyovCisKKwkJCS8qaWYgKGNoYW4tPnVzZWQpKi8KKwkJCXsKKyNpZmRlZiBOT19TVUIKKyNpZmRlZiBTVUJfUEFSU0VSCisJCQkJLyoKKwkJCQkgIGNoZWNrIGlmIHN1YnRpdGxlIGNoYW5uZWwgd2FzIHJ1bm5pbmcsCisJCQkJICB0aGUgcGFyc2VyIHdpbGwgYmUgdXNlZCBpbiBhbXN0cmVhbSBhbHNvLAorCQkJCSAgdGFrZSBjYXJlIG9mIHRoZSBidWZmIHB0ci4KKwkJCQkqLworCQkJCXUzMiB2ID0gZG14X2dldF9jaGFuX3RhcmdldChkbXgsIG4pOworCQkJCWlmICh2ICE9IDB4RkZGRiAmJgorCQkJCQkodiAmICgweDcgPDwgUElEX1RZUEUpKQorCQkJCQkJPT0gKFNVQl9QQUNLRVQgPDwgUElEX1RZUEUpKQorCQkJCQlzZXRfc3VidGl0bGVfcGVzX2J1ZmZlcihkbXgpOworI2VuZGlmCisjZW5kaWYKKwkJCQl7CisJCQkJCXUzMiB2ID0gZG14X2dldF9jaGFuX3RhcmdldChkbXgsIG4pOworCQkJCQlpZiAodiAhPSAweEZGRkYgJiYKKwkJCQkJCSh2ICYgKDB4NyA8PCBQSURfVFlQRSkpCisJCQkJCQk9PQorCQkJCQkJKE9USEVSX1BFU19QQUNLRVQgPDwgUElEX1RZUEUpKQorCQkJCQkJcGVzX29mZl9wcmVbZG14LT5pZF0gPSAwOworCQkJCX0KKwkJCQlkbXhfc2V0X2NoYW5fcmVncyhkbXgsIG4pOworCQkJfQorCQl9CisKKwkJZm9yIChuID0gMDsgbiA8IEZJTFRFUl9DT1VOVDsgbisrKSB7CisJCQlzdHJ1Y3QgYW1sX2ZpbHRlciAqZmlsdGVyID0gJmRteC0+ZmlsdGVyW25dOworCisJCQlpZiAoZmlsdGVyLT51c2VkKQorCQkJCWRteF9zZXRfZmlsdGVyX3JlZ3MoZG14LCBuKTsKKwkJfQorCQlkbXhfZW5hYmxlKCZkdmItPmRteFtpZF0pOworCQlkbXhfc21hbGxzZWNfc2V0KCZkbXgtPnNtYWxsc2VjLAorCQkJCWRteC0+c21hbGxzZWMuZW5hYmxlLAorCQkJCWRteC0+c21hbGxzZWMuYnVmc2l6ZSwKKwkJCQkxKTsKKworCQlkbXhfdGltZW91dF9zZXQoJmRteC0+dGltZW91dCwKKwkJCQlkbXgtPnRpbWVvdXQuZW5hYmxlLAorCQkJCWRteC0+dGltZW91dC50aW1lb3V0LAorCQkJCWRteC0+dGltZW91dC5jaF9kaXNhYmxlLAorCQkJCWRteC0+dGltZW91dC5tYXRjaCwKKwkJCQkxKTsKKwkJRE1YX1dSSVRFX1JFRyhpZCwgQVNTSUdOX1BJRF9OVU1CRVIsICBwY3JfbnVtW2lkXSk7CisJCURNWF9XUklURV9SRUcoaWQsIFBDUjkwS19DVEwsICBwY3JfcmVnW2lkXSk7CisJfQorCisJZm9yIChpZCA9IDA7IGlkIDwgRFNDX0RFVl9DT1VOVDsgaWQrKykgeworCQlzdHJ1Y3QgYW1sX2RzYyAqZHNjID0gJmR2Yi0+ZHNjW2lkXTsKKwkJaW50IG47CisKKwkJZm9yIChuID0gMDsgbiA8IERTQ19DT1VOVDsgbisrKSB7CisJCQlpbnQgZmxhZyA9IDA7CisJCQlzdHJ1Y3QgYW1sX2RzY19jaGFubmVsICpjaCA9ICZkc2MtPmNoYW5uZWxbbl07CisJCQkvKmlmKGNoLT51c2VkKSovCisJCQl7CisJCQkJY2gtPndvcmtfbW9kZSA9IC0xOworCQkJCS8vaWYgdGEgc2V0dGluZyBwaWQsIHVzZWQgd2lsbCAwCisJCQkJaWYgKGNoLT5waWQgIT0gMHgxZmZmICYmICFjaC0+dXNlZCkgeworCQkJCQlmbGFnID0gMTsKKwkJCQkJY2gtPnVzZWQgPSAxOworCQkJCX0KKwkJCQlkc2Nfc2V0X3BpZChjaCwgY2gtPnBpZCk7CisJCQkJaWYgKGZsYWcpCisJCQkJCWNoLT51c2VkID0gMDsKKwkJCQlkc2Nfc2V0X2tleXMoY2gpOworCQkJfQorCQl9CisJfQorI2lmZGVmIEVOQUJMRV9TRUNfQlVGRl9XQVRDSERPRworCWlmIChyZXNldF9pcnEpIHsKKwkJbW9kX3RpbWVyKCZkdmItPndhdGNoZG9nX3RpbWVyLAorCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhXQVRDSERPR19USU1FUikpOworCX0KKyNlbmRpZgorCisJcHJfZGJnKCJbZG14X2twaV0gZGVtdXggcmVzZXQgZW5kXG4iKTsKK30KKworLypSZXNldCB0aGUgaW5kaXZpZHVhbCBkZW11eCovCit2b2lkIGRteF9yZXNldF9kbXhfaHdfZXhfdW5sb2NrKHN0cnVjdCBhbWxfZHZiICpkdmIsIHN0cnVjdCBhbWxfZG14ICpkbXgsCisJCQkJaW50IHJlc2V0X2lycSkKK3sKKwl1MzIgcGNyX251bSA9IDA7CisJdTMyIHBjcl9yZWdzID0gMDsKKwl7CisJCWlmICghZG14LT5pbml0KQorCQkJcmV0dXJuOworCQlwY3JfcmVncyA9IERNWF9SRUFEX1JFRyhkbXgtPmlkLCBQQ1I5MEtfQ1RMKTsKKwkJcGNyX251bSA9IERNWF9SRUFEX1JFRyhkbXgtPmlkLCBBU1NJR05fUElEX05VTUJFUik7CisJCXByX2RiZygicmVzZXQgZGVtdXgsIHBjcl9yZWdzOjB4JXgsIHBjcl9udW06MHgleFxuIiwgcGNyX3JlZ3MsIHBjcl9udW0pOworCX0KKwl7CisJCWlmICghZG14LT5pbml0KQorCQkJcmV0dXJuOworCQlpZiAocmVzZXRfaXJxKSB7CisJCQlpZiAoZG14LT5kbXhfaXJxICE9IC0xKQorCQkJCWRpc2FibGVfaXJxKGRteC0+ZG14X2lycSk7CisJCQlpZiAoZG14LT5kdnJfaXJxICE9IC0xKQorCQkJCWRpc2FibGVfaXJxKGRteC0+ZHZyX2lycSk7CisJCX0KKwl9CisjaWZkZWYgRU5BQkxFX1NFQ19CVUZGX1dBVENIRE9HCisJaWYgKHJlc2V0X2lycSkgeworCQkvKmRlbF90aW1lcl9zeW5jKCZkdmItPndhdGNoZG9nX3RpbWVyKTsgKi8KKwkJZHZiLT5kbXhfd2F0Y2hkb2dfZGlzYWJsZVtkbXgtPmlkXSA9IDE7CisJfQorI2VuZGlmCisKKwkvKnsKKwkJdTMyIGRhdGE7CisJCWRhdGEgPSBSRUFEX01QRUdfUkVHKFNUQl9UT1BfQ09ORklHKTsKKwkJY2lwbHVzID0gMHg3QzAwMDAwMCAmIGRhdGE7CisJfSovCisKKwlwcl9lcnJvcigiZG14X3Jlc2V0X2RteF9od19leF91bmxvY2sgaW50b1xuIik7CisJV1JJVEVfTVBFR19SRUcoUkVTRVQzX1JFR0lTVEVSLAorCQkgICAgICAgKGRteC0+aWQpID8gKChkbXgtPmlkID09CisJCQkJICAgICAxKSA/IFJFU0VUX0RFTVVYMSA6IFJFU0VUX0RFTVVYMikgOgorCQkgICAgICAgUkVTRVRfREVNVVgwKTsKKwlXUklURV9NUEVHX1JFRyhSRVNFVDNfUkVHSVNURVIsIFJFU0VUX0RFUyk7CisKKwl7CisJCWludCB0aW1lczsKKworCQl0aW1lcyA9IDA7CisJCXdoaWxlICh0aW1lcysrIDwgMTAwMDAwMCkgeworCQkJaWYgKCEoRE1YX1JFQURfUkVHKGRteC0+aWQsIE9NX0NNRF9TVEFUVVMpICYgMHgwMSkpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKldSSVRFX01QRUdfUkVHKFNUQl9UT1BfQ09ORklHLCAwKTsgKi8KKworCXsKKwkJdTMyIHZlcnNpb24sIGRhdGE7CisKKwkJaWYgKCFkbXgtPmluaXQpCisJCQlyZXR1cm47CisKKwkJaWYgKHJlc2V0X2lycSkgeworCQkJaWYgKGRteC0+ZG14X2lycSAhPSAtMSkKKwkJCQllbmFibGVfaXJxKGRteC0+ZG14X2lycSk7CisJCQlpZiAoZG14LT5kdnJfaXJxICE9IC0xKQorCQkJCWVuYWJsZV9pcnEoZG14LT5kdnJfaXJxKTsKKwkJfQorCQlETVhfV1JJVEVfUkVHKGRteC0+aWQsIERFTVVYX0NPTlRST0wsIDB4MDAwMCk7CisJCXZlcnNpb24gPSBETVhfUkVBRF9SRUcoZG14LT5pZCwgU1RCX1ZFUlNJT04pOworCQlETVhfV1JJVEVfUkVHKGRteC0+aWQsIFNUQl9URVNUX1JFRywgdmVyc2lvbik7CisJCXByX2RiZygiU1RCICVkIGhhcmR3YXJlIHZlcnNpb24gOiAlZFxuIiwgZG14LT5pZCwgdmVyc2lvbik7CisJCURNWF9XUklURV9SRUcoZG14LT5pZCwgU1RCX1RFU1RfUkVHLCAweDU1NTApOworCQlkYXRhID0gRE1YX1JFQURfUkVHKGRteC0+aWQsIFNUQl9URVNUX1JFRyk7CisJCWlmIChkYXRhICE9IDB4NTU1MCkKKwkJCXByX2Vycm9yKCJTVEIgJWQgcmVnaXN0ZXIgYWNjZXNzIGZhaWxlZFxuIiwgZG14LT5pZCk7CisJCURNWF9XUklURV9SRUcoZG14LT5pZCwgU1RCX1RFU1RfUkVHLCAweGFhYTApOworCQlkYXRhID0gRE1YX1JFQURfUkVHKGRteC0+aWQsIFNUQl9URVNUX1JFRyk7CisJCWlmIChkYXRhICE9IDB4YWFhMCkKKwkJCXByX2Vycm9yKCJTVEIgJWQgcmVnaXN0ZXIgYWNjZXNzIGZhaWxlZFxuIiwgZG14LT5pZCk7CisJCURNWF9XUklURV9SRUcoZG14LT5pZCwgTUFYX0ZNX0NPTVBfQUREUiwgMHgwMDAwKTsKKwkJRE1YX1dSSVRFX1JFRyhkbXgtPmlkLCBTVEJfSU5UX01BU0ssIDApOworCQlETVhfV1JJVEVfUkVHKGRteC0+aWQsIFNUQl9JTlRfU1RBVFVTLCAweGZmZmYpOworCQlETVhfV1JJVEVfUkVHKGRteC0+aWQsIEZFQ19JTlBVVF9DT05UUk9MLCAwKTsKKwl9CisKKwlzdGJfZW5hYmxlKGR2Yik7CisKKwl7CisJCWludCBuOworCQl1bnNpZ25lZCBsb25nIGFkZHI7CisJCXVuc2lnbmVkIGxvbmcgYmFzZTsKKwkJdW5zaWduZWQgbG9uZyBncnBfYWRkcltTRUNfQlVGX0dSUF9DT1VOVF07CisJCWludCBncnBfbGVuW1NFQ19CVUZfR1JQX0NPVU5UXTsKKworCQlpZiAoIWRteC0+aW5pdCkKKwkJCXJldHVybjsKKworCQlpZiAoZG14LT5zZWNfcGFnZXMpIHsKKwkJCWdycF9sZW5bMF0gPSAoMSA8PCBTRUNfR1JQX0xFTl8wKSAqIDg7CisJCQlncnBfbGVuWzFdID0gKDEgPDwgU0VDX0dSUF9MRU5fMSkgKiA4OworCQkJZ3JwX2xlblsyXSA9ICgxIDw8IFNFQ19HUlBfTEVOXzIpICogODsKKwkJCWdycF9sZW5bM10gPSAoMSA8PCBTRUNfR1JQX0xFTl8zKSAqIDg7CisKKwkJCWdycF9hZGRyWzBdID0gdmlydF90b19waHlzKCh2b2lkICopZG14LT5zZWNfcGFnZXMpOworCQkJZ3JwX2FkZHJbMV0gPSBncnBfYWRkclswXSArIGdycF9sZW5bMF07CisJCQlncnBfYWRkclsyXSA9IGdycF9hZGRyWzFdICsgZ3JwX2xlblsxXTsKKwkJCWdycF9hZGRyWzNdID0gZ3JwX2FkZHJbMl0gKyBncnBfbGVuWzJdOworCisJCQliYXNlID0gZ3JwX2FkZHJbMF0gJiAweEZGRkYwMDAwOworCQkJRE1YX1dSSVRFX1JFRyhkbXgtPmlkLCBTRUNfQlVGRl9CQVNFLCBiYXNlID4+IDE2KTsKKwkJCURNWF9XUklURV9SRUcoZG14LT5pZCwgU0VDX0JVRkZfMDFfU1RBUlQsCisJCQkJCSgoKGdycF9hZGRyWzBdIC0gYmFzZSkgPj4gOCkgPDwgMTYpIHwKKwkJCQkJICgoZ3JwX2FkZHJbMV0gLSBiYXNlKSA+PiA4KSk7CisJCQlETVhfV1JJVEVfUkVHKGRteC0+aWQsIFNFQ19CVUZGXzIzX1NUQVJULAorCQkJCQkoKChncnBfYWRkclsyXSAtIGJhc2UpID4+IDgpIDw8IDE2KSB8CisJCQkJCSAoKGdycF9hZGRyWzNdIC0gYmFzZSkgPj4gOCkpOworCQkJRE1YX1dSSVRFX1JFRyhkbXgtPmlkLCBTRUNfQlVGRl9TSVpFLAorCQkJCQlTRUNfR1JQX0xFTl8wIHwKKwkJCQkJKFNFQ19HUlBfTEVOXzEgPDwgNCkgfAorCQkJCQkoU0VDX0dSUF9MRU5fMiA8PCA4KSB8CisJCQkJCShTRUNfR1JQX0xFTl8zIDw8IDEyKSk7CisJCX0KKyNpZmRlZiBOT19TVUIKKyNpZm5kZWYgU1VCX1BBUlNFUgorCQlpZiAoZG14LT5zdWJfcGFnZXMpIHsKKwkJCWFkZHIgPSB2aXJ0X3RvX3BoeXMoKHZvaWQgKilkbXgtPnN1Yl9wYWdlcyk7CisJCQlETVhfV1JJVEVfUkVHKGRteC0+aWQsIFNCX1NUQVJULCBhZGRyID4+IDEyKTsKKwkJCURNWF9XUklURV9SRUcoZG14LT5pZCwgU0JfTEFTVF9BRERSLAorCQkJCSAgICAgIChkbXgtPnN1Yl9idWZfbGVuID4+IDMpIC0gMSk7CisJCX0KKyNlbmRpZgorI2VuZGlmCisJCWlmIChkbXgtPnBlc19wYWdlcykgeworCQkJYWRkciA9IHZpcnRfdG9fcGh5cygodm9pZCAqKWRteC0+cGVzX3BhZ2VzKTsKKwkJCURNWF9XUklURV9SRUcoZG14LT5pZCwgT0JfU1RBUlQsIGFkZHIgPj4gMTIpOworCQkJRE1YX1dSSVRFX1JFRyhkbXgtPmlkLCBPQl9MQVNUX0FERFIsCisJCQkJICAgICAgKGRteC0+cGVzX2J1Zl9sZW4gPj4gMykgLSAxKTsKKwkJfQorCisJCWZvciAobiA9IDA7IG4gPCBDSEFOTkVMX0NPVU5UOyBuKyspIHsKKwkJCS8qc3RydWN0IGFtbF9jaGFubmVsICpjaGFuID0gJmRteC0+Y2hhbm5lbFtuXTsqLworCisJCQkvKmlmIChjaGFuLT51c2VkKSovCisJCQl7CisjaWZkZWYgTk9fU1VCCisjaWZkZWYgU1VCX1BBUlNFUgorCQkJCS8qCisJCQkJICBjaGVjayBpZiBzdWJ0aXRsZSBjaGFubmVsIHdhcyBydW5uaW5nLAorCQkJCSAgdGhlIHBhcnNlciB3aWxsIGJlIHVzZWQgaW4gYW1zdHJlYW0gYWxzbywKKwkJCQkgIHRha2UgY2FyZSBvZiB0aGUgYnVmZiBwdHIuCisJCQkJKi8KKwkJCQl1MzIgdiA9IGRteF9nZXRfY2hhbl90YXJnZXQoZG14LCBuKTsKKwkJCQlpZiAodiAhPSAweEZGRkYgJiYKKwkJCQkJKHYgJiAoMHg3IDw8IFBJRF9UWVBFKSkKKwkJCQkJCT09IChTVUJfUEFDS0VUIDw8IFBJRF9UWVBFKSkKKwkJCQkJc2V0X3N1YnRpdGxlX3Blc19idWZmZXIoZG14KTsKKyNlbmRpZgorI2VuZGlmCisJCQkJeworCQkJCQl1MzIgdiA9IGRteF9nZXRfY2hhbl90YXJnZXQoZG14LCBuKTsKKwkJCQkJaWYgKHYgIT0gMHhGRkZGICYmCisJCQkJCQkodiAmICgweDcgPDwgUElEX1RZUEUpKQorCQkJCQkJPT0KKwkJCQkJCShPVEhFUl9QRVNfUEFDS0VUIDw8IFBJRF9UWVBFKSkKKwkJCQkJCXBlc19vZmZfcHJlW2RteC0+aWRdID0gMDsKKwkJCQl9CisJCQkJZG14X3NldF9jaGFuX3JlZ3MoZG14LCBuKTsKKwkJCX0KKwkJfQorCisJCWZvciAobiA9IDA7IG4gPCBGSUxURVJfQ09VTlQ7IG4rKykgeworCQkJc3RydWN0IGFtbF9maWx0ZXIgKmZpbHRlciA9ICZkbXgtPmZpbHRlcltuXTsKKworCQkJaWYgKGZpbHRlci0+dXNlZCkKKwkJCQlkbXhfc2V0X2ZpbHRlcl9yZWdzKGRteCwgbik7CisJCX0KKworCQlmb3IgKG4gPSAwOyBuIDwgU0VDX0NOVF9NQVg7IG4rKykgeworCQkJZG14LT5zZWNfY250W25dID0gMDsKKwkJCWRteC0+c2VjX2NudF9tYXRjaFtuXSA9IDA7CisJCQlkbXgtPnNlY19jbnRfY3JjX2ZhaWxbbl0gPSAwOworCQl9CisJCWRteF9lbmFibGUoZG14KTsKKwkJZG14X3NtYWxsc2VjX3NldCgmZG14LT5zbWFsbHNlYywKKwkJCQlkbXgtPnNtYWxsc2VjLmVuYWJsZSwKKwkJCQlkbXgtPnNtYWxsc2VjLmJ1ZnNpemUsCisJCQkJMSk7CisKKwkJZG14X3RpbWVvdXRfc2V0KCZkbXgtPnRpbWVvdXQsCisJCQkJZG14LT50aW1lb3V0LmVuYWJsZSwKKwkJCQlkbXgtPnRpbWVvdXQudGltZW91dCwKKwkJCQlkbXgtPnRpbWVvdXQuY2hfZGlzYWJsZSwKKwkJCQlkbXgtPnRpbWVvdXQubWF0Y2gsCisJCQkJMSk7CisJfQorCisJeworCQlpbnQgaWQ7CisKKwkJZm9yIChpZCA9IDA7IGlkIDwgRFNDX0RFVl9DT1VOVDsgaWQrKykgeworCQkJc3RydWN0IGFtbF9kc2MgKmRzYyA9ICZkdmItPmRzY1tpZF07CisJCQlpbnQgbjsKKworCQkJZm9yIChuID0gMDsgbiA8IERTQ19DT1VOVDsgbisrKSB7CisJCQkJaW50IGZsYWcgPSAwOworCQkJCXN0cnVjdCBhbWxfZHNjX2NoYW5uZWwgKmNoID0gJmRzYy0+Y2hhbm5lbFtuXTsKKwkJCQkvKmlmKGNoLT51c2VkKSovIHsKKwkJCQljaC0+aWQgPSBuOworCQkJCWNoLT53b3JrX21vZGUgPSAtMTsKKwkJCQlkc2NfZ2V0X3BpZChjaCwmY2gtPnBpZCk7CisJCQkJaWYgKGNoLT5waWQgIT0gMHgxZmZmICYmICFjaC0+dXNlZCkgeworCQkJCQlmbGFnID0gMTsKKwkJCQkJY2gtPnVzZWQgPSAxOworCQkJCX0KKwkJCQlkc2Nfc2V0X3BpZChjaCwgY2gtPnBpZCk7CisJCQkJaWYgKGZsYWcpCisJCQkJCWNoLT51c2VkID0gMDsKKwkJCQlkc2Nfc2V0X2tleXMoY2gpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKyNpZmRlZiBFTkFCTEVfU0VDX0JVRkZfV0FUQ0hET0cKKwlpZiAocmVzZXRfaXJxKSB7CisJCS8qbW9kX3RpbWVyKCZkdmItPndhdGNoZG9nX3RpbWVyLAorCQkgKmppZmZpZXMrbXNlY3NfdG9famlmZmllcyhXQVRDSERPR19USU1FUikpOworCQkgKi8KKwkJZHZiLT5kbXhfd2F0Y2hkb2dfZGlzYWJsZVtkbXgtPmlkXSA9IDA7CisJfQorI2VuZGlmCisJeworCQlETVhfV1JJVEVfUkVHKGRteC0+aWQsIEFTU0lHTl9QSURfTlVNQkVSLCAgcGNyX251bSk7CisJCURNWF9XUklURV9SRUcoZG14LT5pZCwgUENSOTBLX0NUTCwgIHBjcl9yZWdzKTsKKwl9Cit9CisKK3ZvaWQgZG14X3Jlc2V0X2RteF9pZF9od19leF91bmxvY2soc3RydWN0IGFtbF9kdmIgKmR2YiwgaW50IGlkLCBpbnQgcmVzZXRfaXJxKQoreworCWRteF9yZXNldF9kbXhfaHdfZXhfdW5sb2NrKGR2YiwgJmR2Yi0+ZG14W2lkXSwgcmVzZXRfaXJxKTsKK30KKwordm9pZCBkbXhfcmVzZXRfZG14X2h3X2V4KHN0cnVjdCBhbWxfZHZiICpkdmIsIHN0cnVjdCBhbWxfZG14ICpkbXgsCisJCQkgaW50IHJlc2V0X2lycSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZkdmItPnNsb2NrLCBmbGFncyk7CisJZG14X3Jlc2V0X2RteF9od19leF91bmxvY2soZHZiLCBkbXgsIHJlc2V0X2lycSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHZiLT5zbG9jaywgZmxhZ3MpOworfQorCit2b2lkIGRteF9yZXNldF9kbXhfaWRfaHdfZXgoc3RydWN0IGFtbF9kdmIgKmR2YiwgaW50IGlkLCBpbnQgcmVzZXRfaXJxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHZiLT5zbG9jaywgZmxhZ3MpOworCWRteF9yZXNldF9kbXhfaWRfaHdfZXhfdW5sb2NrKGR2YiwgaWQsIHJlc2V0X2lycSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHZiLT5zbG9jaywgZmxhZ3MpOworfQorCit2b2lkIGRteF9yZXNldF9kbXhfaHcoc3RydWN0IGFtbF9kdmIgKmR2YiwgaW50IGlkKQoreworCWRteF9yZXNldF9kbXhfaWRfaHdfZXgoZHZiLCBpZCwgMSk7Cit9CisKKy8qQWxsb2NhdGUgc3VidGl0bGUgcGVzIGJ1ZmZlciovCisjaWYgMAorc3RhdGljIGludCBhbGxvY19zdWJ0aXRsZV9wZXNfYnVmZmVyKHN0cnVjdCBhbWxfZG14ICpkbXgpCit7CisJaW50IHN0YXJ0X3B0ciA9IDA7CisJc3RydWN0IHN0cmVhbV9idWZfcyAqc2J1ZmYgPSAwOworCXUzMiBwaHlfYWRkcjsKKworCXN0YXJ0X3B0ciA9IFJFQURfTVBFR19SRUcoUEFSU0VSX1NVQl9TVEFSVF9QVFIpOworCWlmIChzdGFydF9wdHIpIHsKKwkJV1JJVEVfTVBFR19SRUcoUEFSU0VSX1NVQl9SUCwgc3RhcnRfcHRyKTsKKwkJZ290byBleGl0OworCX0KKwlzYnVmZiA9IGdldF9zdHJlYW1fYnVmZmVyKEJVRl9UWVBFX1NVQlRJVExFKTsKKwlpZiAoc2J1ZmYpIHsKKwkJaWYgKHNidWZmLT5mbGFnICYgQlVGX0ZMQUdfSU9NRU0pCisJCQlwaHlfYWRkciA9IHNidWZmLT5idWZfc3RhcnQ7CisJCWVsc2UKKwkJCXBoeV9hZGRyID0gdmlydF90b19waHlzKCh2b2lkICopc2J1ZmYtPmJ1Zl9zdGFydCk7CisKKwkJV1JJVEVfTVBFR19SRUcoUEFSU0VSX1NVQl9SUCwgcGh5X2FkZHIpOworCQlXUklURV9NUEVHX1JFRyhQQVJTRVJfU1VCX1NUQVJUX1BUUiwgcGh5X2FkZHIpOworCQlXUklURV9NUEVHX1JFRyhQQVJTRVJfU1VCX0VORF9QVFIsCisJCQkgICAgICAgcGh5X2FkZHIgKyBzYnVmZi0+YnVmX3NpemUgLSA4KTsKKworCQlwcl9kYmcoInBlcyBidWZmPToleCAleFxuIiwgcGh5X2FkZHIsIHNidWZmLT5idWZfc2l6ZSk7CisJfSBlbHNlCisJCXByX2RiZygiRXJyb3Igc3RyZWFtIGJ1ZmZlclxuIik7CitleGl0OgorCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgc2V0X3N1YnRpdGxlX3Blc19idWZmZXIoc3RydWN0IGFtbF9kbXggKmRteCkKK3sKKyNpZmRlZiBTVUJfUEFSU0VSCisJaWYgKGRteC0+c3ViX2NoYW4gPT0gLTEpIHsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSB2aXJ0X3RvX3BoeXMoKHZvaWQgKilkbXgtPnN1Yl9wYWdlcyk7CisJV1JJVEVfTVBFR19SRUcoUEFSU0VSX1NVQl9SUCwgYWRkcik7CisJV1JJVEVfTVBFR19SRUcoUEFSU0VSX1NVQl9TVEFSVF9QVFIsIGFkZHIpOworCVdSSVRFX01QRUdfUkVHKFBBUlNFUl9TVUJfRU5EX1BUUiwgYWRkciArIGRteC0+c3ViX2J1Zl9sZW4gLSA4KTsKKwlwcl9pbmYoInNldCBzdWIgYnVmZjogKCVkKSAlbHggJXhcbiIsIGRteC0+aWQsIGFkZHIsIGRteC0+c3ViX2J1Zl9sZW4pOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCitpbnQgZG14X2dldF9zdWJfYnVmZmVyKHVuc2lnbmVkIGxvbmcgKmJhc2UsIHVuc2lnbmVkIGxvbmcgKnZpcnQpCit7CisjaWZuZGVmIFNVQl9CVUZfRE1YCisJdW5zaWduZWQgbG9uZyBzID0gUkVBRF9NUEVHX1JFRyhQQVJTRVJfU1VCX1NUQVJUX1BUUik7CisJaWYgKGJhc2UpCisJCSpiYXNlID0gczsKKwlpZiAodmlydCkKKwkJKnZpcnQgPSAodW5zaWduZWQgbG9uZyljb2RlY19tbV9waHlzX3RvX3ZpcnQocyk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworaW50IGRteF9pbml0X3N1Yl9idWZmZXIoc3RydWN0IGFtbF9kbXggKmRteCwgdW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIHZpcnQpCit7CisjaWZuZGVmIFNVQl9CVUZfRE1YCisJZG14LT5zdWJfYnVmX2Jhc2UgPSBiYXNlOworCXByX2luZigic3ViIGJ1ZiBiYXNlOiAweCVseFxuIiwgZG14LT5zdWJfYnVmX2Jhc2UpOworCisJZG14LT5zdWJfYnVmX2Jhc2VfdmlydCA9ICh1OCAqKXZpcnQ7CisJcHJfaW5mKCJzdWIgYnVmIGJhc2UgdmlydDogMHglcFxuIiwgZG14LT5zdWJfYnVmX2Jhc2VfdmlydCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGVja19kdnJfZm9yX3Jhd19jaGFubmVsKHN0cnVjdCBhbWxfZG14ICpkbXgsIGludCBjaCkKK3sKKwlzd2l0Y2ggKGNoKSB7CisJCWNhc2UgMDoKKwkJY2FzZSAxOiAgcmV0dXJuIDE7CisJCWNhc2UgMjogIHJldHVybiBkbXgtPnN1Yl9jaGFuICE9IC0xID8gMSA6IDA7CisJCWNhc2UgMzogIHJldHVybiBkbXgtPnBjcl9jaGFuICE9IC0xID8gMSA6IDA7CisJCWRlZmF1bHQ6IHJldHVybiAwOworCX0KKwlyZXR1cm4gMDsKK30KKworLypBbGxvY2F0ZSBhIG5ldyBjaGFubmVsKi8KK2ludCBkbXhfYWxsb2NfY2hhbihzdHJ1Y3QgYW1sX2RteCAqZG14LCBpbnQgdHlwZSwgaW50IHBlc190eXBlLCBpbnQgcGlkKQoreworCWludCBpZCA9IC0xOworCWludCByZXQ7CisKKwlpZiAodHlwZSA9PSBETVhfVFlQRV9UUykgeworCQlzd2l0Y2ggKHBlc190eXBlKSB7CisJCWNhc2UgRE1YX1BFU19WSURFTzoKKwkJCWlmICghZG14LT5jaGFubmVsWzBdLnVzZWQpCisJCQkJaWQgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgRE1YX1BFU19BVURJTzoKKwkJCWlmICghZG14LT5jaGFubmVsWzFdLnVzZWQpCisJCQkJaWQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgRE1YX1BFU19TVUJUSVRMRToKKwkJY2FzZSBETVhfUEVTX1RFTEVURVhUOgorCQkJaWYgKCFkbXgtPmNoYW5uZWxbMl0udXNlZCkKKwkJCQlpZCA9IDI7CisJCQkvL2FsbG9jX3N1YnRpdGxlX3Blc19idWZmZXIoZG14KTsKKwkJCXNldF9zdWJ0aXRsZV9wZXNfYnVmZmVyKGRteCk7CisJCQlicmVhazsKKwkJY2FzZSBETVhfUEVTX1BDUjoKKwkJCWlmICghZG14LT5jaGFubmVsWzNdLnVzZWQpCisJCQkJaWQgPSAzOworCQkJYnJlYWs7CisJCWNhc2UgRE1YX1BFU19BVURJTzM6CisJCQlwZXNfb2ZmX3ByZVtkbXgtPmlkXSA9IDA7CisJCQl7CisJCQkJaW50IGk7CisKKwkJCQlmb3IgKGkgPSBTWVNfQ0hBTl9DT1VOVDsKKwkJCQkJCWkgPCBDSEFOTkVMX0NPVU5UOyBpKyspIHsKKwkJCQkJaWYgKCFkbXgtPmNoYW5uZWxbaV0udXNlZCkgeworCQkJCQkJaWQgPSBpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBETVhfUEVTX09USEVSOgorCQkJeworCQkJCWludCBpOworCisJCQkJZm9yIChpID0gU1lTX0NIQU5fQ09VTlQ7CisJCQkJCQlpIDwgQ0hBTk5FTF9DT1VOVDsgaSsrKSB7CisJCQkJCWlmICghZG14LT5jaGFubmVsW2ldLnVzZWQpIHsKKwkJCQkJCWlkID0gaTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCWludCBpOworCisJCWZvciAoaSA9IFNZU19DSEFOX0NPVU5UOyBpIDwgQ0hBTk5FTF9DT1VOVDsgaSsrKSB7CisJCQlpZiAoIWRteC0+Y2hhbm5lbFtpXS51c2VkKSB7CisJCQkJaWQgPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKGlkID09IC0xKSB7CisJCXByX2Vycm9yKCJ0b28gbWFueSBjaGFubmVsc1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlwcl9kYmcoImFsbG9jYXRlIGNoYW5uZWwoaWQ6JWQtJWQgUElEOjB4JXgpXG4iLCBkbXgtPmlkLCBpZCwgcGlkKTsKKworCWlmIChjaGVja19kdnJfZm9yX3Jhd19jaGFubmVsKGRteCwgaWQpKSB7CisJCXJldCA9IGRteF9nZXRfY2hhbihkbXgsIHBpZCk7CisJCWlmIChyZXQgPj0gMCAmJiBEVlJfRkVFRChkbXgtPmNoYW5uZWxbcmV0XS5mZWVkKSkgeworCQkJcHJfZGJnKCJyYXcgY2ggZml4OiBkbXg6JWQ6IGNoWyVkKGR2cildIC0+IGNoWyVkXVxuIiwKKwkJCQlkbXgtPmlkLCByZXQsIGlkKTsKKwkJCWRteF9yZW1vdmVfZmVlZChkbXgsIGRteC0+Y2hhbm5lbFtyZXRdLmZlZWQpOworCQkJZG14LT5jaGFubmVsW2lkXS5kdnJfZmVlZCA9IGRteC0+Y2hhbm5lbFtyZXRdLmZlZWQ7CisJCQlkbXgtPmNoYW5uZWxbaWRdLmR2cl9mZWVkLT5wcml2ID0gKHZvaWQgKikobG9uZylpZDsKKwkJfSBlbHNlIHsKKwkJCWRteC0+Y2hhbm5lbFtpZF0uZHZyX2ZlZWQgPSBOVUxMOworCQl9CisJfQorCisJZG14LT5jaGFubmVsW2lkXS50eXBlID0gdHlwZTsKKwlkbXgtPmNoYW5uZWxbaWRdLnBlc190eXBlID0gcGVzX3R5cGU7CisJZG14LT5jaGFubmVsW2lkXS5waWQgPSBwaWQ7CisJZG14LT5jaGFubmVsW2lkXS51c2VkID0gMTsKKwlkbXgtPmNoYW5uZWxbaWRdLmZpbHRlcl9jb3VudCA9IDA7CisKKwlkbXhfc2V0X2NoYW5fcmVncyhkbXgsIGlkKTsKKworCXNldF9kZWJ1Z19kbXhfY2hhbnBpZHMoZG14LT5pZCwgaWQsIHBpZCk7CisKKwlkbXgtPmNoYW5fY291bnQrKzsKKwlkbXhfZW5hYmxlKGRteCk7CisKKwlyZXR1cm4gaWQ7Cit9CisKKy8qRnJlZSBhIGNoYW5uZWwqLwordm9pZCBkbXhfZnJlZV9jaGFuKHN0cnVjdCBhbWxfZG14ICpkbXgsIGludCBjaWQpCit7CisJcHJfZGJnKCJmcmVlIGNoYW5uZWwoaWQ6JWQtJWQgUElEOjB4JXgpXG4iLCBkbXgtPmlkLCBjaWQsIGRteC0+Y2hhbm5lbFtjaWRdLnBpZCk7CisKKwlkbXgtPmNoYW5uZWxbY2lkXS51c2VkID0gMDsKKwlkbXgtPmNoYW5uZWxbY2lkXS5waWQgPSAweDFmZmY7CisJZG14X3NldF9jaGFuX3JlZ3MoZG14LCBjaWQpOworCisJaWYgKGNpZCA9PSAyKSB7CisJCXUzMiBwYXJzZXJfc3ViX3N0YXJ0X3B0cjsKKworCQlwYXJzZXJfc3ViX3N0YXJ0X3B0ciA9IFJFQURfTVBFR19SRUcoUEFSU0VSX1NVQl9TVEFSVF9QVFIpOworCQlXUklURV9NUEVHX1JFRyhQQVJTRVJfU1VCX1JQLCBwYXJzZXJfc3ViX3N0YXJ0X3B0cik7CisJCVdSSVRFX01QRUdfUkVHKFBBUlNFUl9TVUJfV1AsIHBhcnNlcl9zdWJfc3RhcnRfcHRyKTsKKwl9CisKKwlzZXRfZGVidWdfZG14X2NoYW5waWRzKGRteC0+aWQsIGNpZCwgLTEpOworCWRteC0+Y2hhbl9jb3VudC0tOworCWRteF9lbmFibGUoZG14KTsKKworCS8qU3BlY2lhbCBwZXMgdHlwZSBjaGFubmVsLCBjaGVjayBpdHMgZHZyIGZlZWQgKi8KKwlpZiAoY2hlY2tfZHZyX2Zvcl9yYXdfY2hhbm5lbChkbXgsIGNpZCkKKwkJCSYmIGRteC0+Y2hhbm5lbFtjaWRdLmR2cl9mZWVkKSB7CisJCS8qc3RhcnQgdGhlIGR2ciBmZWVkICovCisJCXByX2RiZygicmF3IGNoIGZpeDogZG14OiVkOiBjaFslZF0gLT4gY2hbKGR2cildXG4iLAorCQkJZG14LT5pZCwgY2lkKTsKKwkJZG14X2FkZF9mZWVkKGRteCwgZG14LT5jaGFubmVsW2NpZF0uZHZyX2ZlZWQpOworCQlkbXgtPmNoYW5uZWxbY2lkXS5kdnJfZmVlZCA9IE5VTEw7CisJfQorfQorCisvKkFkZCBhIHNlY3Rpb24qLworc3RhdGljIGludCBkbXhfY2hhbl9hZGRfZmlsdGVyKHN0cnVjdCBhbWxfZG14ICpkbXgsIGludCBjaWQsCisJCQkgICAgICAgc3RydWN0IGR2Yl9kZW11eF9maWx0ZXIgKmZpbHRlcikKK3sKKwlpbnQgaWQgPSAtMTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBGSUxURVJfQ09VTlQ7IGkrKykgeworCQlpZiAoIWRteC0+ZmlsdGVyW2ldLnVzZWQpIHsKKwkJCWlkID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGlkID09IC0xKSB7CisJCXByX2Vycm9yKCJ0b28gbWFueSBmaWx0ZXJzXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXByX2RiZygiY2hhbm5lbChpZDolZCBQSUQ6MHgleCkgYWRkIGZpbHRlcihpZDolZClcbiIsIGNpZCwKKwkgICAgICAgZmlsdGVyLT5mZWVkLT5waWQsIGlkKTsKKworCWRteC0+ZmlsdGVyW2lkXS5jaGFuX2lkID0gY2lkOworCWRteC0+ZmlsdGVyW2lkXS51c2VkID0gMTsKKwlkbXgtPmZpbHRlcltpZF0uZmlsdGVyID0gKHN0cnVjdCBkbXhfc2VjdGlvbl9maWx0ZXIgKilmaWx0ZXI7CisJZG14LT5jaGFubmVsW2NpZF0uZmlsdGVyX2NvdW50Kys7CisKKwlkbXhfc2V0X2ZpbHRlcl9yZWdzKGRteCwgaWQpOworCisJcmV0dXJuIGlkOworfQorCitzdGF0aWMgdm9pZCBkbXhfcmVtb3ZlX2ZpbHRlcihzdHJ1Y3QgYW1sX2RteCAqZG14LCBpbnQgY2lkLCBpbnQgZmlkKQoreworCXByX2RiZygiY2hhbm5lbChpZDolZCBQSUQ6MHgleCkgcmVtb3ZlIGZpbHRlcihpZDolZClcbiIsIGNpZCwKKwkgICAgICAgZG14LT5jaGFubmVsW2NpZF0ucGlkLCBmaWQpOworCisJZG14LT5maWx0ZXJbZmlkXS51c2VkID0gMDsKKwlkbXgtPmNoYW5uZWxbY2lkXS5maWx0ZXJfY291bnQtLTsKKworCWRteF9zZXRfZmlsdGVyX3JlZ3MoZG14LCBmaWQpOworCWRteF9jbGVhcl9maWx0ZXJfYnVmZmVyKGRteCwgZmlkKTsKK30KKworc3RhdGljIGludCBzZl9hZGRfZmVlZChzdHJ1Y3QgYW1sX2RteCAqc3JjX2RteCwgc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkKQoreworCWludCByZXQgPSAwOworCisJc3RydWN0IGFtbF9kdmIgKmR2YiA9IChzdHJ1Y3QgYW1sX2R2YiAqKXNyY19kbXgtPmRlbXV4LnByaXY7CisJc3RydWN0IGFtbF9zd2ZpbHRlciAqc2YgPSAmZHZiLT5zd2ZpbHRlcjsKKworCXByX2RiZ19zZigic2YgYWRkIHBpZFslZF1cbiIsIGZlZWQtPnBpZCk7CisKKwkvKmluaXQgc2YgKi8KKwlpZiAoIXNmLT51c2VyKSB7CisJCXZvaWQgKm1lbTsKKworCQltZW0gPSB2bWFsbG9jKFNGX0JVRkZFUl9TSVpFKTsKKwkJaWYgKCFtZW0pIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJZHZiX3JpbmdidWZmZXJfaW5pdCgmc2YtPnJidWYsIG1lbSwgU0ZfQlVGRkVSX1NJWkUpOworCisJCXNmLT5kbXggPSAmZHZiLT5kbXhbU0ZfRE1YX0lEXTsKKwkJc2YtPmFmaWZvID0gJmR2Yi0+YXN5bmNmaWZvW1NGX0FGSUZPX0lEXTsKKworCQlzZi0+ZG14LT5zb3VyY2UgPSBzcmNfZG14LT5zb3VyY2U7CisJCXNmLT5hZmlmby0+c291cmNlID0gc2YtPmRteC0+aWQ7CisJCXNmLT50cmFja19kbXggPSBzcmNfZG14LT5pZDsKKwkJLypzZi0+YWZpZm8tPmZsdXNoX3NpemUgPSAxODgqMTA7ICovCisKKwkJcHJfZGJnX3NmKCJpbml0IHNmIG1vZGUuXG4iKTsKKworCX0gZWxzZSBpZiAoc2YtPmRteC0+c291cmNlICE9IHNyY19kbXgtPnNvdXJjZSkgeworCQlwcl9lcnJvcigiIHBpZD0lZFtzcmM6JWRdIGFscmVhZHkgdXNlZCB3aXRoIHNmZG14JWRbc3JjOiVkXVxuIiwKKwkJCSBmZWVkLT5waWQsIHNyY19kbXgtPnNvdXJjZSwgc2YtPmRteC0+aWQsCisJCQkgc2YtPmRteC0+c291cmNlKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGZhaWw7CisJfQorCisJLypzZXR1cCBmZWVkICovCisJcmV0ID0gZG14X2dldF9jaGFuKHNmLT5kbXgsIGZlZWQtPnBpZCk7CisJaWYgKHJldCA+PSAwKSB7CisJCXByX2Vycm9yKCIgcGlkPSVkW2RteDolZF0gYWxyZWFkeSB1c2VkIFtkbXg6JWRdLlxuIiwKKwkJCSBmZWVkLT5waWQsIHNyY19kbXgtPmlkLAorCQkJICgoc3RydWN0IGFtbF9kbXggKilzZi0+ZG14LT5jaGFubmVsW3JldF0uZmVlZC0+CisJCQkgZGVtdXgpLT5pZCk7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBmYWlsOworCX0KKwlyZXQgPQorCSAgICAgZG14X2FsbG9jX2NoYW4oc2YtPmRteCwgRE1YX1RZUEVfVFMsIERNWF9QRVNfT1RIRVIsCisJCQkgICAgZmVlZC0+cGlkKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnJvcigiICVzOiBhbGxvYyBjaGFuIGVycm9yLCByZXQ9JWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZmFpbDsKKwl9CisJc2YtPmRteC0+Y2hhbm5lbFtyZXRdLmZlZWQgPSBmZWVkOworCWZlZWQtPnByaXYgPSAodm9pZCAqKShsb25nKXJldDsKKworCXNmLT5kbXgtPmNoYW5uZWxbcmV0XS5kdnJfZmVlZCA9IGZlZWQ7CisKKwlzZi0+dXNlcisrOworCWRlYnVnX3NmX3VzZXIgPSBzZi0+dXNlcjsKKwlkbXhfZW5hYmxlKHNmLT5kbXgpOworCisJcmV0dXJuIDA7CisKK2ZhaWw6CisJZmVlZC0+cHJpdiA9ICh2b2lkICopLTE7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzZl9yZW1vdmVfZmVlZChzdHJ1Y3QgYW1sX2RteCAqc3JjX2RteCwgc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkKQoreworCWludCByZXQ7CisKKwlzdHJ1Y3QgYW1sX2R2YiAqZHZiID0gKHN0cnVjdCBhbWxfZHZiICopc3JjX2RteC0+ZGVtdXgucHJpdjsKKwlzdHJ1Y3QgYW1sX3N3ZmlsdGVyICpzZiA9ICZkdmItPnN3ZmlsdGVyOworCisJaWYgKCFzZi0+dXNlciB8fCAoc2YtPmRteC0+c291cmNlICE9IHNyY19kbXgtPnNvdXJjZSkpCisJCXJldHVybiAwOworCisJLyphZGQgZmFpbCwgbm8gbmVlZCB0byByZW1vdmUqLworCWlmICgoKGxvbmcpZmVlZC0+cHJpdikgPCAwKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGRteF9nZXRfY2hhbihzZi0+ZG14LCBmZWVkLT5waWQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gMDsKKworCXByX2RiZ19zZigic2YgcmVtb3ZlIHBpZFslZF1cbiIsIGZlZWQtPnBpZCk7CisKKwlkbXhfZnJlZV9jaGFuKHNmLT5kbXgsIChsb25nKWZlZWQtPnByaXYpOworCisJc2YtPmRteC0+Y2hhbm5lbFtyZXRdLmZlZWQgPSBOVUxMOworCXNmLT5kbXgtPmNoYW5uZWxbcmV0XS5kdnJfZmVlZCA9IE5VTEw7CisKKwlzZi0+dXNlci0tOworCWRlYnVnX3NmX3VzZXIgPSBzZi0+dXNlcjsKKworCWlmICghc2YtPnVzZXIpIHsKKwkJc2YtPmRteC0+c291cmNlID0gLTE7CisJCXNmLT5hZmlmby0+c291cmNlID0gQU1fRE1YX01BWDsKKwkJc2YtPnRyYWNrX2RteCA9IC0xOworCQkvKnNmLT5hZmlmby0+Zmx1c2hfc2l6ZSA9IHNmLT5hZmlmby0+YnVmX2xlbj4+MTsgKi8KKworCQlpZiAoc2YtPnJidWYuZGF0YSkgeworCQkJdm9pZCAqbWVtID0gc2YtPnJidWYuZGF0YTsKKworCQkJc2YtPnJidWYuZGF0YSA9IE5VTEw7CisJCQl2ZnJlZShtZW0pOworCQl9CisJCXByX2RiZ19zZigiZXhpdCBzZiBtb2RlLlxuIik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2ZfZmVlZF9zZihzdHJ1Y3QgYW1sX2RteCAqZG14LCBzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQsCisJCSAgICAgIGludCBhZGRfbm90X3JlbW92ZSkKK3sKKwlpbnQgc2YgPSAwOworCisJaWYgKHNmX2RteF9zZihkbXgpKSB7CisJCXByX2Vycm9yKCIlczogZGVtdXggJWQgaXMgaW4gc2YgbW9kZVxuIiwgX19mdW5jX18sIGRteC0+aWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGZlZWQtPnR5cGUpIHsKKwljYXNlIERNWF9UWVBFX1RTOnsKKwkJCXN0cnVjdCBkbXhkZXZfZmlsdGVyICpkbXhkZXZmaWx0ZXIgPQorCQkJCQkJCSBmZWVkLT5mZWVkLnRzLnByaXY7CisJCQlpZiAoIURWUl9GRUVEKGZlZWQpKSB7CisJCQkJaWYgKGRteGRldmZpbHRlci0+cGFyYW1zLnBlcy4KKwkJCQkgICAgZmxhZ3MgJiBETVhfVVNFX1NXRklMVEVSKQorCQkJCQlzZiA9IDE7CisJCQkJaWYgKGZvcmNlX3Blc19zZikKKwkJCQkJc2YgPSAxOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBETVhfVFlQRV9TRUM6eworCQkJc3RydWN0IGR2Yl9kZW11eF9maWx0ZXIgKmZpbHRlcjsKKworCQkJZm9yIChmaWx0ZXIgPSBmZWVkLT5maWx0ZXI7IGZpbHRlcjsKKwkJCSAgICAgZmlsdGVyID0gZmlsdGVyLT5uZXh0KSB7CisJCQkJc3RydWN0IGRteGRldl9maWx0ZXIgKmRteGRldmZpbHRlciA9CisJCQkJICAgIGZpbHRlci0+ZmlsdGVyLnByaXY7CisJCQkJaWYgKGRteGRldmZpbHRlci0+cGFyYW1zLnNlYy4KKwkJCQkgICAgZmxhZ3MgJiBETVhfVVNFX1NXRklMVEVSKQorCQkJCQlzZiA9IDE7CisJCQkJaWYgKGFkZF9ub3RfcmVtb3ZlKQorCQkJCQlmaWx0ZXItPmh3X2hhbmRsZSA9ICh1MTYpLTE7CisJCQl9CisJCQlpZiAoZm9yY2Vfc2VjX3NmKQorCQkJCXNmID0gMTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc2YgPyAwIDogMTsKK30KKworc3RhdGljIGludCBzZl9jaGVja19mZWVkKHN0cnVjdCBhbWxfZG14ICpkbXgsIHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCwKKwkJCSBpbnQgYWRkX25vdF9yZW1vdmUpCit7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBzZl9mZWVkX3NmKGRteCwgZmVlZCwgYWRkX25vdF9yZW1vdmUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlwcl9kYmdfc2YoIiVzIFtwaWQ6JWRdICVzXG4iLAorCQkgIChmZWVkLT50eXBlID09IERNWF9UWVBFX1RTKSA/ICJETVhfVFlQRV9UUyIgOiAiRE1YX1RZUEVfU0VDIiwKKwkJICBmZWVkLT5waWQsIGFkZF9ub3RfcmVtb3ZlID8gIi0+IHNmIG1vZGUiIDogInNmIG1vZGUgLT4iKTsKKworCWlmIChhZGRfbm90X3JlbW92ZSkKKwkJcmV0ID0gc2ZfYWRkX2ZlZWQoZG14LCBmZWVkKTsKKwllbHNlCisJCXJldCA9IHNmX3JlbW92ZV9mZWVkKGRteCwgZmVlZCk7CisKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnJvcigic2YgJXMgZmVlZCBmYWlsWyVkXVxuIiwKKwkJCSBhZGRfbm90X3JlbW92ZSA/ICJhZGQiIDogInJlbW92ZSIsIHJldCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZG14X2FkZF9mZWVkKHN0cnVjdCBhbWxfZG14ICpkbXgsIHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCkKK3sKKwlpbnQgaWQsIHJldCA9IDA7CisJc3RydWN0IGR2Yl9kZW11eF9maWx0ZXIgKmZpbHRlcjsKKwlzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmRmZWVkID0gTlVMTDsKKwlpbnQgc2ZfcmV0ID0gMDsJCS8qPDA6ZXJyb3IsID0wOnNmX29uLCA+MDpzZl9vZmYgKi8KKworCXNmX3JldCA9IHNmX2NoZWNrX2ZlZWQoZG14LCBmZWVkLCAxLypTRl9GRUVEX09QX0FERCAqLyk7CisJaWYgKHNmX3JldCA8IDApCisJCXJldHVybiBzZl9yZXQ7CisKKwlzd2l0Y2ggKGZlZWQtPnR5cGUpIHsKKwljYXNlIERNWF9UWVBFX1RTOgorCQlwcl9kYmcoImFkZCBmZWVkIHRzOiBwaWQ6JWQtMHgleCwgKCVwKVxuIiwKKwkJCWRteC0+aWQsIGZlZWQtPnBpZCwgZmVlZCk7CisJCXJldCA9IGRteF9nZXRfY2hhbihkbXgsIGZlZWQtPnBpZCk7CisJCWlmIChyZXQgPj0gMCkgeworCQkJaWYgKERWUl9GRUVEKGRteC0+Y2hhbm5lbFtyZXRdLmZlZWQpKSB7CisJCQkJaWYgKERWUl9GRUVEKGZlZWQpKSB7CisJCQkJCS8qZHZyIGZlZWQgYWxyZWFkeSB3b3JrICovCisJCQkJCXByX2Vycm9yKCJQSUQgJWQgYWxyZWFkeSB1c2VkKERWUilcbiIsCisJCQkJCQkgZmVlZC0+cGlkKTsKKwkJCQkJcmV0ID0gLUVCVVNZOworCQkJCQlnb3RvIGZhaWw7CisJCQkJfQorCQkJCWlmIChzZl9yZXQpIHsKKwkJCQkJLyppZiBzZl9vbiwgd2UgZG8gbm90IHJlc2V0IHRoZQorCQkJCQkgKnByZXZpb3VzIGR2ciBmZWVkLCBqdXN0IGxvYWQgdGhlIHBlcworCQkJCQkgKmZlZWQgb24gdGhlIHNmLCBhIGRpZmZyZW50IGRhdGEgcGF0aC4KKwkJCQkJICovCisJCQkJCWRmZWVkID0gZG14LT5jaGFubmVsW3JldF0uZmVlZDsKKwkJCQkJZG14X3JlbW92ZV9mZWVkKGRteCwgZGZlZWQpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKERWUl9GRUVEKGZlZWQpCisJCQkJICAgICYmICghZG14LT5jaGFubmVsW3JldF0uZHZyX2ZlZWQpKSB7CisJCQkJCS8qanVzdCBzdG9yZSB0aGUgZHZyX2ZlZWQgKi8KKwkJCQkJZG14LT5jaGFubmVsW3JldF0uZHZyX2ZlZWQgPSBmZWVkOworCQkJCQlmZWVkLT5wcml2ID0gKHZvaWQgKikobG9uZylyZXQ7CisJCQkJCWlmICghZG14LT5yZWNvcmQpCisJCQkJCQlkbXhfZW5hYmxlKGRteCk7CisJCQkJCWRteF9hZGRfcmVjY2hhbihkbXgtPmlkLCByZXQpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJeworCQkJCQlwcl9lcnJvcigiUElEICVkIGFscmVhZHkgdXNlZFxuIiwKKwkJCQkJCSBmZWVkLT5waWQpOworCQkJCQlyZXQgPSAtRUJVU1k7CisJCQkJCWdvdG8gZmFpbDsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoc2ZfcmV0KSB7CS8qbm90IHNmIGZlZWQuICovCisJCQlyZXQgPQorCQkJICAgICBkbXhfYWxsb2NfY2hhbihkbXgsIGZlZWQtPnR5cGUsCisJCQkJCQlmZWVkLT5wZXNfdHlwZSwgZmVlZC0+cGlkKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJcHJfZGJnKCIlczogYWxsb2MgY2hhbiBlcnJvciwgcmV0PSVkXG4iLAorCQkJCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKKwkJCQlyZXQgPSAtRUJVU1k7CisJCQkJZ290byBmYWlsOworCQkJfQorCQkJZG14LT5jaGFubmVsW3JldF0uZmVlZCA9IGZlZWQ7CisJCQlmZWVkLT5wcml2ID0gKHZvaWQgKikobG9uZylyZXQ7CisJCQlkbXgtPmNoYW5uZWxbcmV0XS5kdnJfZmVlZCA9IE5VTEw7CisJCX0KKwkJLypkdnIgKi8KKwkJaWYgKERWUl9GRUVEKGZlZWQpKSB7CisJCQlkbXgtPmNoYW5uZWxbcmV0XS5kdnJfZmVlZCA9IGZlZWQ7CisJCQlmZWVkLT5wcml2ID0gKHZvaWQgKikobG9uZylyZXQ7CisJCQlpZiAoIWRteC0+cmVjb3JkKQorCQkJCWRteF9lbmFibGUoZG14KTsKKwkJCWRteF9hZGRfcmVjY2hhbihkbXgtPmlkLCByZXQpOworCQl9IGVsc2UgaWYgKGRmZWVkICYmIHNmX3JldCkgeworCQkJZG14LT5jaGFubmVsW3JldF0uZHZyX2ZlZWQgPSBkZmVlZDsKKwkJCWRmZWVkLT5wcml2ID0gKHZvaWQgKikobG9uZylyZXQ7CisJCQlpZiAoIWRteC0+cmVjb3JkKQorCQkJCWRteF9lbmFibGUoZG14KTsKKwkJCWRteF9hZGRfcmVjY2hhbihkbXgtPmlkLCByZXQpOworCQl9CisKKwkJYnJlYWs7CisJY2FzZSBETVhfVFlQRV9TRUM6CisJCXByX2RiZygiYWRkIGZlZWQgc2VjOiBwaWQ6JWQtMHgleCwgKCVwKVxuIiwKKwkJCWRteC0+aWQsIGZlZWQtPnBpZCwgZmVlZCk7CisJCXJldCA9IGRteF9nZXRfY2hhbihkbXgsIGZlZWQtPnBpZCk7CisJCWlmIChyZXQgPj0gMCkgeworCQkJaWYgKERWUl9GRUVEKGRteC0+Y2hhbm5lbFtyZXRdLmZlZWQpKSB7CisJCQkJaWYgKHNmX3JldCkgeworCQkJCQkvKmlmIHNmX29uLCB3ZSBkbyBub3QgcmVzZXQgdGhlCisJCQkJCSAqcHJldmlvdXMgZHZyIGZlZWQsIGp1c3QgbG9hZCB0aGUgcGVzCisJCQkJCSAqZmVlZCBvbiB0aGUgc2YsYSBkaWZmcmVudCBkYXRhIHBhdGguCisJCQkJCSAqLworCQkJCQlkZmVlZCA9IGRteC0+Y2hhbm5lbFtyZXRdLmZlZWQ7CisJCQkJCWRteF9yZW1vdmVfZmVlZChkbXgsIGRmZWVkKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXByX2Vycm9yKCJQSUQgJWQgYWxyZWFkeSB1c2VkXG4iLCBmZWVkLT5waWQpOworCQkJCXJldCA9IC1FQlVTWTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCX0KKwkJaWYgKHNmX3JldCkgewkvKm5vdCBzZiBmZWVkLiAqLworCQkJaWQgPSBkbXhfYWxsb2NfY2hhbihkbXgsIGZlZWQtPnR5cGUsCisJCQkJZmVlZC0+cGVzX3R5cGUsIGZlZWQtPnBpZCk7CisJCQlpZiAoaWQgPCAwKSB7CisJCQkJcHJfZGJnKCIlczogYWxsb2MgY2hhbiBlcnJvciwgcmV0PSVkXG4iLAorCQkJCSAgICAgICBfX2Z1bmNfXywgaWQpOworCQkJCXJldCA9IC1FQlVTWTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCQlmb3IgKGZpbHRlciA9IGZlZWQtPmZpbHRlcjsgZmlsdGVyOworCQkJCWZpbHRlciA9IGZpbHRlci0+bmV4dCkgeworCQkJCXJldCA9IGRteF9jaGFuX2FkZF9maWx0ZXIoZG14LCBpZCwgZmlsdGVyKTsKKwkJCQlpZiAocmV0ID49IDApCisJCQkJCWZpbHRlci0+aHdfaGFuZGxlID0gcmV0OworCQkJCWVsc2UKKwkJCQkJZmlsdGVyLT5od19oYW5kbGUgPSAodTE2KS0xOworCQkJfQorCQkJZG14LT5jaGFubmVsW2lkXS5mZWVkID0gZmVlZDsKKwkJCWZlZWQtPnByaXYgPSAodm9pZCAqKShsb25nKWlkOworCQkJZG14LT5jaGFubmVsW2lkXS5kdnJfZmVlZCA9IE5VTEw7CisKKwkJCWlmIChkZmVlZCkgeworCQkJCWRteC0+Y2hhbm5lbFtpZF0uZHZyX2ZlZWQgPSBkZmVlZDsKKwkJCQlkZmVlZC0+cHJpdiA9ICh2b2lkICopKGxvbmcpaWQ7CisJCQkJaWYgKCFkbXgtPnJlY29yZCkKKwkJCQkJZG14X2VuYWJsZShkbXgpOworCQkJCWRteF9hZGRfcmVjY2hhbihkbXgtPmlkLCBpZCk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZG14LT5mZWVkX2NvdW50Kys7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlmZWVkLT5wcml2ID0gKHZvaWQgKiktMTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRteF9yZW1vdmVfZmVlZChzdHJ1Y3QgYW1sX2RteCAqZG14LCBzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQpCit7CisJc3RydWN0IGR2Yl9kZW11eF9maWx0ZXIgKmZpbHRlcjsKKwlzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmRmZWVkID0gTlVMTDsKKworCWludCBzZl9yZXQgPSAwOwkJLyo8MDplcnJvciwgPTA6c2Zfb24sID4wOnNmX29mZiAqLworCisJLyphZGQgZmFpbCwgbm8gbmVlZCB0byByZW1vdmUqLworCWlmICgoKGxvbmcpZmVlZC0+cHJpdikgPCAwKQorCQlyZXR1cm4gMDsKKworCXNmX3JldCA9IHNmX2NoZWNrX2ZlZWQoZG14LCBmZWVkLCAwLypTRl9GRUVEX09QX1JNICovKTsKKwlpZiAoc2ZfcmV0IDw9IDApCisJCXJldHVybiBzZl9yZXQ7CisKKwlzd2l0Y2ggKGZlZWQtPnR5cGUpIHsKKwljYXNlIERNWF9UWVBFX1RTOgorCQlwcl9kYmcoInJtIGZlZWQgdHM6IHBpZDolZC0weCV4LCAlcFxuIiwKKwkJCWRteC0+aWQsIGZlZWQtPnBpZCwgZmVlZCk7CisJCWlmIChkbXgtPmNoYW5uZWxbKGxvbmcpZmVlZC0+cHJpdl0uZmVlZCA9PQorCQkgICAgZG14LT5jaGFubmVsWyhsb25nKWZlZWQtPnByaXZdLmR2cl9mZWVkKSB7CisJCQlkbXhfcm1fcmVjY2hhbihkbXgtPmlkLCAobG9uZylmZWVkLT5wcml2KTsKKwkJCWRteF9mcmVlX2NoYW4oZG14LCAobG9uZylmZWVkLT5wcml2KTsKKwkJfSBlbHNlIHsKKwkJCWlmIChmZWVkID09IGRteC0+Y2hhbm5lbFsobG9uZylmZWVkLT5wcml2XS5mZWVkKSB7CisJCQkJZGZlZWQgPSBkbXgtPmNoYW5uZWxbKGxvbmcpZmVlZC0+cHJpdl0uZHZyX2ZlZWQ7CisJCQkJZG14X3JtX3JlY2NoYW4oZG14LT5pZCwgKGxvbmcpZmVlZC0+cHJpdik7CisJCQkJZG14X2ZyZWVfY2hhbihkbXgsIChsb25nKWZlZWQtPnByaXYpOworCQkJCWlmIChkZmVlZCkgeworCQkJCQkvKnN0YXJ0IHRoZSBkdnIgZmVlZCAqLworCQkJCQlkbXhfYWRkX2ZlZWQoZG14LCBkZmVlZCk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChmZWVkID09CisJCQkJICAgZG14LT5jaGFubmVsWyhsb25nKWZlZWQtPnByaXZdLmR2cl9mZWVkKSB7CisJCQkJLypqdXN0IHJlbW92ZSB0aGUgZHZyX2ZlZWQgKi8KKwkJCQlkbXgtPmNoYW5uZWxbKGxvbmcpZmVlZC0+cHJpdl0uZHZyX2ZlZWQgPSBOVUxMOworCQkJCWRteF9ybV9yZWNjaGFuKGRteC0+aWQsCShsb25nKWZlZWQtPnByaXYpOworCQkJCWlmIChkbXgtPnJlY29yZCkKKwkJCQkJZG14X2VuYWJsZShkbXgpOworCQkJfSBlbHNlIHsKKwkJCQkvKlRoaXMgbXVzdCBuZXZlciBoYXBwZW4gKi8KKwkJCQlwcl9lcnJvcigiJXM6IHVua25vd24gZmVlZFxuIiwgX19mdW5jX18pOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisKKwkJYnJlYWs7CisJY2FzZSBETVhfVFlQRV9TRUM6CisJCXByX2RiZygicm0gZmVlZCBzZWM6IHBpZDolZC0weCV4LCAlcFxuIiwKKwkJCWRteC0+aWQsIGZlZWQtPnBpZCwgZmVlZCk7CisJCWZvciAoZmlsdGVyID0gZmVlZC0+ZmlsdGVyOyBmaWx0ZXI7IGZpbHRlciA9IGZpbHRlci0+bmV4dCkgeworCQkJaWYgKGZpbHRlci0+aHdfaGFuZGxlICE9ICh1MTYpLTEpCisJCQkJZG14X3JlbW92ZV9maWx0ZXIoZG14LCAobG9uZylmZWVkLT5wcml2LAorCQkJCQkJICAoaW50KWZpbHRlci0+aHdfaGFuZGxlKTsKKwkJfQorCisJCWRmZWVkID0gZG14LT5jaGFubmVsWyhsb25nKWZlZWQtPnByaXZdLmR2cl9mZWVkOworCQlkbXhfcm1fcmVjY2hhbihkbXgtPmlkLCAobG9uZylmZWVkLT5wcml2KTsKKwkJZG14X2ZyZWVfY2hhbihkbXgsIChsb25nKWZlZWQtPnByaXYpOworCQlpZiAoZGZlZWQpIHsKKwkJCS8qc3RhcnQgdGhlIGR2ciBmZWVkICovCisJCQlkbXhfYWRkX2ZlZWQoZG14LCBkZmVlZCk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZG14LT5mZWVkX2NvdW50LS07CisJcmV0dXJuIDA7Cit9CisKK2ludCBhbWxfZG14X2h3X2luaXQoc3RydWN0IGFtbF9kbXggKmRteCkKK3sKKwkvKgorCSAqc3RydWN0IGFtbF9kdmIgKmR2YiA9IChzdHJ1Y3QgYW1sX2R2YiAqKWRteC0+ZGVtdXgucHJpdjsKKwkgKnVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJICovCisJaW50IHJldDsKKworCS8qRGVtdXggaW5pdGlhbGl6ZSAqLworCS8qc3Bpbl9sb2NrX2lycXNhdmUoJmR2Yi0+c2xvY2ssIGZsYWdzKTsqLworCXJldCA9IGRteF9pbml0KGRteCk7CisJLypzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdmItPnNsb2NrLCBmbGFncyk7Ki8KKworCXJldHVybiByZXQ7Cit9CisKK2ludCBhbWxfZG14X2h3X2RlaW5pdChzdHJ1Y3QgYW1sX2RteCAqZG14KQoreworCXN0cnVjdCBhbWxfZHZiICpkdmIgPSAoc3RydWN0IGFtbF9kdmIgKilkbXgtPmRlbXV4LnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmR2Yi0+c2xvY2ssIGZsYWdzKTsKKwlyZXQgPSBkbXhfZGVpbml0KGRteCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHZiLT5zbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLypleHRlcm4gdm9pZCBhZmlmb19yZXNldChpbnQgdik7Ki8KKworaW50IGFtbF9hc3luY2ZpZm9faHdfaW5pdChzdHJ1Y3QgYW1sX2FzeW5jZmlmbyAqYWZpZm8pCit7CisKKy8qCisgKglzdHJ1Y3QgYW1sX2R2YiAqZHZiID0gYWZpZm8tPmR2YjsKKyAqCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgKi8KKwlpbnQgcmV0OworCisJaW50IGxlbiA9IGFzeW5jZmlmb19idWZfbGVuOworCXVuc2lnbmVkIGxvbmcgYnVmID0gYXN5bmNmaWZvX2FsbG9jX2J1ZmZlcihhZmlmbywgbGVuKTsKKworCWlmICghYnVmKQorCQlyZXR1cm4gLTE7CisKKwkvKkFzeW5jIEZJRk8gaW5pdGlhbGl6ZSovCisvKgorICoJc3Bpbl9sb2NrX2lycXNhdmUoJmR2Yi0+c2xvY2ssIGZsYWdzKTsKKyAqLworLyoKKyAqI2lmIE1FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09OOAorICoJQ0xLX0dBVEVfT04oQVNZTkNfRklGTyk7CisgKiNlbmRpZgorICovCisJLyphZmlmb19yZXNldCgwKTsqLworCisJV1JJVEVfTVBFR19SRUcoUkVTRVQ2X1JFR0lTVEVSLCAoMTw8MTEpfCgxPDwxMikpOworCisJcmV0ID0gYXN5bmNfZmlmb19pbml0KGFmaWZvLCAxLCBsZW4sIGJ1Zik7CisvKgorICoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHZiLT5zbG9jaywgZmxhZ3MpOworICovCisJaWYgKHJldCA8IDApCisJCWFzeW5jZmlmb19mcmVlX2J1ZmZlcihidWYsIGxlbik7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYW1sX2FzeW5jZmlmb19od19kZWluaXQoc3RydWN0IGFtbF9hc3luY2ZpZm8gKmFmaWZvKQoreworCWludCByZXQ7CisKKwlyZXQgPSBhc3luY19maWZvX2RlaW5pdChhZmlmbywgMSk7CisvKgorICojaWYgTUVTT05fQ1BVX1RZUEUgPj0gTUVTT05fQ1BVX1RZUEVfTUVTT044CisgKglDTEtfR0FURV9PRkYoQVNZTkNfRklGTyk7CisgKiNlbmRpZgorICovCisJLyphZmlmb19yZXNldCgxKTsqLworCisJcmV0dXJuIHJldDsKK30KKworaW50IGFtbF9hc3luY2ZpZm9faHdfcmVzZXQoc3RydWN0IGFtbF9hc3luY2ZpZm8gKmFmaWZvKQoreworCXN0cnVjdCBhbWxfZHZiICpkdmIgPSBhZmlmby0+ZHZiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCwgc3JjID0gLTE7CisKKwl1bnNpZ25lZCBsb25nIGJ1ZiA9IDA7CisJaW50IGxlbiA9IGFzeW5jZmlmb19idWZfbGVuOworCWJ1ZiA9IGFzeW5jZmlmb19hbGxvY19idWZmZXIoYWZpZm8sIGxlbik7CisJaWYgKCFidWYpCisJCXJldHVybiAtMTsKKworCWlmIChhZmlmby0+aW5pdCkgeworCQlzcmMgPSBhZmlmby0+c291cmNlOworCQlhc3luY19maWZvX2RlaW5pdChhZmlmbywgMCk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmR2Yi0+c2xvY2ssIGZsYWdzKTsKKwlyZXQgPSBhc3luY19maWZvX2luaXQoYWZpZm8sIDAsIGxlbiwgYnVmKTsKKwkvKiByZXN0b3JlIHRoZSBzb3VyY2UgKi8KKwlpZiAoc3JjICE9IC0xKQorCQlhZmlmby0+c291cmNlID0gc3JjOworCisJaWYgKChyZXQgPT0gMCkgJiYgYWZpZm8tPmR2YikKKwkJcmVzZXRfYXN5bmNfZmlmb3MoYWZpZm8tPmR2Yik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdmItPnNsb2NrLCBmbGFncyk7CisKKwlpZiAocmV0IDwgMCkKKwkJYXN5bmNmaWZvX2ZyZWVfYnVmZmVyKGJ1ZiwgbGVuKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBhbWxfZG14X2h3X3N0YXJ0X2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkKQoreworCXN0cnVjdCBhbWxfZG14ICpkbXggPSAoc3RydWN0IGFtbF9kbXggKilkdmJkbXhmZWVkLT5kZW11eDsKKwlzdHJ1Y3QgYW1sX2R2YiAqZHZiID0gKHN0cnVjdCBhbWxfZHZiICopZG14LT5kZW11eC5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHZiLT5zbG9jaywgZmxhZ3MpOworCXJldCA9IGRteF9hZGRfZmVlZChkbXgsIGR2YmRteGZlZWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR2Yi0+c2xvY2ssIGZsYWdzKTsKKworCS8qaGFuZGxlIGVycm9ycyBzaWxlbnRseSovCisJaWYgKHJldCAhPSAwKQorCQlyZXQgPSAwOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGFtbF9kbXhfaHdfc3RvcF9mZWVkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCkKK3sKKwlzdHJ1Y3QgYW1sX2RteCAqZG14ID0gKHN0cnVjdCBhbWxfZG14ICopZHZiZG14ZmVlZC0+ZGVtdXg7CisJc3RydWN0IGFtbF9kdmIgKmR2YiA9IChzdHJ1Y3QgYW1sX2R2YiAqKWRteC0+ZGVtdXgucHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmR2Yi0+c2xvY2ssIGZsYWdzKTsKKwlkbXhfcmVtb3ZlX2ZlZWQoZG14LCBkdmJkbXhmZWVkKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdmItPnNsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNmX2RteF90cmFja19zb3VyY2Uoc3RydWN0IGFtbF9kbXggKmRteCkKK3sKKwlzdHJ1Y3QgYW1sX2R2YiAqZHZiID0gKHN0cnVjdCBhbWxfZHZiICopZG14LT5kZW11eC5wcml2OworCXN0cnVjdCBhbWxfc3dmaWx0ZXIgKnNmID0gJmR2Yi0+c3dmaWx0ZXI7CisKKwlpZiAoc2YtPnVzZXIgJiYgKGRteC0+aWQgPT0gc2YtPnRyYWNrX2RteCkpIHsKKwkJcHJfZGJnX3NmKCJ0cmFja2luZyBkbXggc3JjIFslZCAtPiAlZF1cbiIsCisJCQkgIHNmLT5kbXgtPnNvdXJjZSwgZG14LT5zb3VyY2UpOworCQlzZi0+ZG14LT5zb3VyY2UgPSBkbXgtPnNvdXJjZTsKKwkJZG14X3Jlc2V0X2RteF9od19leF91bmxvY2soZHZiLCBzZi0+ZG14LCAwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBhbWxfZG14X2h3X3NldF9zb3VyY2Uoc3RydWN0IGRteF9kZW11eCAqZGVtdXgsIGRteF9zb3VyY2VfdCBzcmMpCit7CisJc3RydWN0IGFtbF9kbXggKmRteCA9IChzdHJ1Y3QgYW1sX2RteCAqKWRlbXV4OworCXN0cnVjdCBhbWxfZHZiICpkdmIgPSAoc3RydWN0IGFtbF9kdmIgKilkbXgtPmRlbXV4LnByaXY7CisJaW50IHJldCA9IDA7CisJaW50IGh3X3NyYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHNmX2RteF9zZihkbXgpKSB7CisJCXByX2Vycm9yKCIlczogZGVtdXggJWQgaXMgaW4gc2YgbW9kZVxuIiwgX19mdW5jX18sIGRteC0+aWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHZiLT5zbG9jaywgZmxhZ3MpOworCisJaHdfc3JjID0gZG14LT5zb3VyY2U7CisKKwlzd2l0Y2ggKHNyYykgeworCWNhc2UgRE1YX1NPVVJDRV9GUk9OVDA6CisJCWh3X3NyYyA9CisJCSAgICAoZHZiLT50c1swXS5tb2RlID09CisJCSAgICAgQU1fVFNfU0VSSUFMKSA/IChkdmItPnRzWzBdLnMycF9pZCtBTV9UU19TUkNfU19UUzApIDogQU1fVFNfU1JDX1RTMDsKKwkJYnJlYWs7CisJY2FzZSBETVhfU09VUkNFX0ZST05UMToKKwkJaHdfc3JjID0KKwkJICAgIChkdmItPnRzWzFdLm1vZGUgPT0KKwkJICAgICBBTV9UU19TRVJJQUwpID8gKGR2Yi0+dHNbMV0uczJwX2lkK0FNX1RTX1NSQ19TX1RTMCkgOiBBTV9UU19TUkNfVFMxOworCQlicmVhazsKKwljYXNlIERNWF9TT1VSQ0VfRlJPTlQyOgorCQlod19zcmMgPQorCQkgICAgKGR2Yi0+dHNbMl0ubW9kZSA9PQorCQkgICAgIEFNX1RTX1NFUklBTCkgPyAoZHZiLT50c1syXS5zMnBfaWQrQU1fVFNfU1JDX1NfVFMwKSA6IEFNX1RTX1NSQ19UUzI7CisJCWJyZWFrOworCWNhc2UgRE1YX1NPVVJDRV9GUk9OVDM6CisJCWh3X3NyYyA9CisJCQkoZHZiLT50c1szXS5tb2RlID09CisJCQkgQU1fVFNfU0VSSUFMKSA/IChkdmItPnRzWzNdLnMycF9pZCtBTV9UU19TUkNfU19UUzApIDogQU1fVFNfU1JDX1RTMzsKKwkJYnJlYWs7CisJY2FzZSBETVhfU09VUkNFX0RWUjA6CisJCWh3X3NyYyA9IEFNX1RTX1NSQ19ISVU7CisJCWJyZWFrOworCWNhc2UgRE1YX1NPVVJDRV9EVlIxOgorCQlod19zcmMgPSBBTV9UU19TUkNfSElVMTsKKwkJYnJlYWs7CisJY2FzZSBETVhfU09VUkNFX0ZST05UMF9PRkZTRVQ6CisJCWh3X3NyYyA9IEFNX1RTX1NSQ19ETVgwOworCQlicmVhazsKKwljYXNlIERNWF9TT1VSQ0VfRlJPTlQxX09GRlNFVDoKKwkJaHdfc3JjID0gQU1fVFNfU1JDX0RNWDE7CisJCWJyZWFrOworCWNhc2UgRE1YX1NPVVJDRV9GUk9OVDJfT0ZGU0VUOgorCQlod19zcmMgPSBBTV9UU19TUkNfRE1YMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyb3IoImlsbGVnYWwgZGVtdXggc291cmNlICVkXG4iLCBzcmMpOworCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlpZiAoaHdfc3JjICE9IGRteC0+c291cmNlKSB7CisJCWRteC0+c291cmNlID0gaHdfc3JjOworCQlkbXhfcmVzZXRfZG14X2h3X2V4X3VubG9jayhkdmIsIGRteCwgMCk7CisJCXNmX2RteF90cmFja19zb3VyY2UoZG14KTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdmItPnNsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIElTX1NSQ19ETVgoX3NyYykgKChfc3JjKSA+PSBBTV9UU19TUkNfRE1YMCAmJiAoX3NyYykgPD0gQU1fVFNfU1JDX0RNWDIpCisKK2ludCBhbWxfc3RiX2h3X3NldF9zb3VyY2Uoc3RydWN0IGFtbF9kdmIgKmR2YiwgZG14X3NvdXJjZV90IHNyYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBod19zcmM7CisJaW50IHJldDsKKworCXJldCA9IDA7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmR2Yi0+c2xvY2ssIGZsYWdzKTsKKworCWh3X3NyYyA9IGR2Yi0+c3RiX3NvdXJjZTsKKworCXN3aXRjaCAoc3JjKSB7CisJY2FzZSBETVhfU09VUkNFX0ZST05UMDoKKwkJaHdfc3JjID0KKwkJICAgIChkdmItPnRzWzBdLm1vZGUgPT0KKwkJICAgICBBTV9UU19TRVJJQUwpID8gKGR2Yi0+dHNbMF0uczJwX2lkK0FNX1RTX1NSQ19TX1RTMCkgOiBBTV9UU19TUkNfVFMwOworCQlicmVhazsKKwljYXNlIERNWF9TT1VSQ0VfRlJPTlQxOgorCQlod19zcmMgPQorCQkgICAgKGR2Yi0+dHNbMV0ubW9kZSA9PQorCQkgICAgIEFNX1RTX1NFUklBTCkgPyAoZHZiLT50c1sxXS5zMnBfaWQrQU1fVFNfU1JDX1NfVFMwKSA6IEFNX1RTX1NSQ19UUzE7CisJCWJyZWFrOworCWNhc2UgRE1YX1NPVVJDRV9GUk9OVDI6CisJCWh3X3NyYyA9CisJCSAgICAoZHZiLT50c1syXS5tb2RlID09CisJCSAgICAgQU1fVFNfU0VSSUFMKSA/IChkdmItPnRzWzJdLnMycF9pZCtBTV9UU19TUkNfU19UUzApIDogQU1fVFNfU1JDX1RTMjsKKwkJYnJlYWs7CisJY2FzZSBETVhfU09VUkNFX0ZST05UMzoKKwkJaHdfc3JjID0KKwkJICAgIChkdmItPnRzWzNdLm1vZGUgPT0KKwkJICAgICBBTV9UU19TRVJJQUwpID8gKGR2Yi0+dHNbM10uczJwX2lkK0FNX1RTX1NSQ19TX1RTMCkgOiBBTV9UU19TUkNfVFMzOworCQlicmVhazsKKwljYXNlIERNWF9TT1VSQ0VfRFZSMDoKKwkJaHdfc3JjID0gQU1fVFNfU1JDX0hJVTsKKwkJYnJlYWs7CisJY2FzZSBETVhfU09VUkNFX0RWUjE6CisJCWh3X3NyYyA9IEFNX1RTX1NSQ19ISVUxOworCQlicmVhazsKKwljYXNlIERNWF9TT1VSQ0VfRlJPTlQwX09GRlNFVDoKKwkJaHdfc3JjID0gQU1fVFNfU1JDX0RNWDA7CisJCWJyZWFrOworCWNhc2UgRE1YX1NPVVJDRV9GUk9OVDFfT0ZGU0VUOgorCQlod19zcmMgPSBBTV9UU19TUkNfRE1YMTsKKwkJYnJlYWs7CisJY2FzZSBETVhfU09VUkNFX0ZST05UMl9PRkZTRVQ6CisJCWh3X3NyYyA9IEFNX1RTX1NSQ19ETVgyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnJvcigiaWxsZWdhbCBkZW11eCBzb3VyY2UgJWRcbiIsIHNyYyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCWlmIChkdmItPnN0Yl9zb3VyY2UgIT0gaHdfc3JjKSB7CisJCWludCBvbGRfc291cmNlID0gZHZiLT5zdGJfc291cmNlOworCisJCWR2Yi0+c3RiX3NvdXJjZSA9IGh3X3NyYzsKKworCQlpZiAoSVNfU1JDX0RNWChvbGRfc291cmNlKSkgeworCQkJZG14X3NldF9taXNjX2lkKGR2YiwKKwkJCQkob2xkX3NvdXJjZSAtIEFNX1RTX1NSQ19ETVgwKSwgMCwgLTEpOworCQl9IGVsc2UgeworCQkJLyp3aGljaCBkbXggZm9yIGF2LXBsYXkgaXMgdW5rbm93biwKKwkJCSAqY2FuJ3QgYXZvaWQgcmVzZXQtYWxsCisJCQkgKi8KKwkJCWRteF9yZXNldF9od19leChkdmIsIDApOworCQl9CisKKwkJaWYgKElTX1NSQ19ETVgoZHZiLT5zdGJfc291cmNlKSkgeworCQkJZG14X3NldF9taXNjX2lkKGR2YiwKKwkJCQkoZHZiLT5zdGJfc291cmNlIC0gQU1fVFNfU1JDX0RNWDApLCAxLCAtMSk7CisJCQkvKmRteF9yZXNldF9kbXhfaWRfaHdfZXhfdW5sb2NrCisJCQkgKiAgIChkdmIsIChkdmItPnN0Yl9zb3VyY2UtQU1fVFNfU1JDX0RNWDApLCAwKTsKKwkJCSAqLworCQl9IGVsc2UgeworCQkJLyp3aGljaCBkbXggZm9yIGF2LXBsYXkgaXMgdW5rbm93biwKKwkJCSAqY2FuJ3QgYXZvaWQgcmVzZXQtYWxsCisJCQkgKi8KKwkJCWRteF9yZXNldF9od19leChkdmIsIDApOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHZiLT5zbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworCisKK2ludCBhbWxfZHNjX2h3X3NldF9zb3VyY2Uoc3RydWN0IGFtbF9kc2MgKmRzYywKKwkJCWRteF9zb3VyY2VfdCBzcmMsIGRteF9zb3VyY2VfdCBkc3QpCit7CisJc3RydWN0IGFtbF9kdmIgKmR2YiA9IGRzYy0+ZHZiOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGh3X3NyYyA9IC0xLCBod19kc3QgPSAtMSwgb3JnX3NyYyA9IC0xLCBvcmdfZHN0ID0gLTE7CisJaW50IHNyY19yZXNldCA9IDAsIGRzdF9yZXNldCA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHZiLT5zbG9jaywgZmxhZ3MpOworCisJaHdfc3JjID0gZHNjLT5zb3VyY2U7CisJaHdfZHN0ID0gZHNjLT5kc3Q7CisKKwlzd2l0Y2ggKHNyYykgeworCWNhc2UgRE1YX1NPVVJDRV9GUk9OVDBfT0ZGU0VUOgorCQlod19zcmMgPSBBTV9UU19TUkNfRE1YMDsKKwkJYnJlYWs7CisJY2FzZSBETVhfU09VUkNFX0ZST05UMV9PRkZTRVQ6CisJCWh3X3NyYyA9IEFNX1RTX1NSQ19ETVgxOworCQlicmVhazsKKwljYXNlIERNWF9TT1VSQ0VfRlJPTlQyX09GRlNFVDoKKwkJaHdfc3JjID0gQU1fVFNfU1JDX0RNWDI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWh3X3NyYyA9IC0xOworCQlicmVhazsKKwl9CisJc3dpdGNoIChkc3QpIHsKKwljYXNlIERNWF9TT1VSQ0VfRlJPTlQwX09GRlNFVDoKKwkJaHdfZHN0ID0gQU1fVFNfU1JDX0RNWDA7CisJCWJyZWFrOworCWNhc2UgRE1YX1NPVVJDRV9GUk9OVDFfT0ZGU0VUOgorCQlod19kc3QgPSBBTV9UU19TUkNfRE1YMTsKKwkJYnJlYWs7CisJY2FzZSBETVhfU09VUkNFX0ZST05UMl9PRkZTRVQ6CisJCWh3X2RzdCA9IEFNX1RTX1NSQ19ETVgyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlod19kc3QgPSAtMTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGh3X3NyYyAhPSBkc2MtPnNvdXJjZSkgeworCQlvcmdfc3JjID0gZHNjLT5zb3VyY2U7CisJCWRzYy0+c291cmNlID0gaHdfc3JjOworCQlzcmNfcmVzZXQgPSAxOworCX0KKwlpZiAoaHdfZHN0ICE9IGRzYy0+ZHN0KSB7CisJCW9yZ19kc3QgPSBkc2MtPmRzdDsKKwkJZHNjLT5kc3QgPSBod19kc3Q7CisJCWRzdF9yZXNldCA9IDE7CisJfQorCisJaWYgKHNyY19yZXNldCkgeworCQlwcl9pbmYoImRzYyVkIHNvdXJjZSBjaGFuZ2VkOiAlZCAtPiAlZFxuIiwKKwkJCWRzYy0+aWQsIG9yZ19zcmMsIGh3X3NyYyk7CisJCWlmIChvcmdfc3JjICE9IC0xKSB7CisJCQlwcl9pbmYoInJlc2V0IGRteCVkXG4iLCAob3JnX3NyYyAtIEFNX1RTX1NSQ19ETVgwKSk7CisJCQlkbXhfcmVzZXRfZG14X2lkX2h3X2V4X3VubG9jayhkdmIsCisJCQkJCShvcmdfc3JjIC0gQU1fVFNfU1JDX0RNWDApLCAwKTsKKwkJfQorCQlpZiAoaHdfc3JjICE9IC0xKSB7CisJCQlwcl9pbmYoInJlc2V0IGRteCVkXG4iLCAoaHdfc3JjIC0gQU1fVFNfU1JDX0RNWDApKTsKKwkJCWRteF9yZXNldF9kbXhfaWRfaHdfZXhfdW5sb2NrKGR2YiwKKwkJCQkJKGh3X3NyYyAtIEFNX1RTX1NSQ19ETVgwKSwgMCk7CisJCX0gZWxzZQorCQkJZHNjX2VuYWJsZShkc2MsIDApOworCX0KKwlpZiAoZHN0X3Jlc2V0KSB7CisJCXByX2luZigiZHNjJWQgZGVzdCBjaGFuZ2VkOiAlZCAtPiAlZFxuIiwKKwkJCWRzYy0+aWQsIG9yZ19kc3QsIGh3X2RzdCk7CisJCWlmICgoKCFzcmNfcmVzZXQpICYmIChvcmdfZHN0ICE9IC0xKSkgfHwKKwkJCShzcmNfcmVzZXQgJiYgKG9yZ19kc3QgIT0gLTEpICYmCisJCQkob3JnX2RzdCAhPSBvcmdfc3JjKSAmJiAob3JnX2RzdCAhPSBod19zcmMpKSkgeworCQkJcHJfaW5mKCJyZXNldCBkbXglZFxuIiwgKG9yZ19kc3QgLSBBTV9UU19TUkNfRE1YMCkpOworCQkJZG14X3Jlc2V0X2RteF9pZF9od19leF91bmxvY2soZHZiLAorCQkJCQkob3JnX2RzdCAtIEFNX1RTX1NSQ19ETVgwKSwgMCk7CisJCX0KKwkJaWYgKCgoIXNyY19yZXNldCkgJiYgKGh3X2RzdCAhPSAtMSkpIHx8CisJCQkoc3JjX3Jlc2V0ICYmIChod19kc3QgIT0gLTEpCisJCQkmJiAoaHdfZHN0ICE9IG9yZ19zcmMpICYmIChod19kc3QgIT0gaHdfc3JjKSkpIHsKKwkJCXByX2luZigicmVzZXQgZG14JWRcbiIsIChod19kc3QgLSBBTV9UU19TUkNfRE1YMCkpOworCQkJZG14X3Jlc2V0X2RteF9pZF9od19leF91bmxvY2soZHZiLAorCQkJCQkoaHdfZHN0IC0gQU1fVFNfU1JDX0RNWDApLCAwKTsKKwkJfQorCQlpZiAoaHdfZHN0ID09IC0xKQorCQkJZHNjX2VuYWJsZShkc2MsIDApOworCX0KKwlpZiAoc3JjX3Jlc2V0ICYmIGRzdF9yZXNldCkgeworCQlzZXRfY2lwbHVzX2lucHV0X3NvdXJjZShkc2MpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR2Yi0+c2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBhbWxfdHNvX2h3X3NldF9zb3VyY2Uoc3RydWN0IGFtbF9kdmIgKmR2YiwgZG14X3NvdXJjZV90IHNyYykKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBod19zcmM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHZiLT5zbG9jaywgZmxhZ3MpOworCisJaHdfc3JjID0gZHZiLT50c29fc291cmNlOworCisJc3dpdGNoIChzcmMpIHsKKwljYXNlIERNWF9TT1VSQ0VfRlJPTlQwOgorCQlod19zcmMgPSAoZHZiLT50c1swXS5tb2RlID09IEFNX1RTX1NFUklBTCkKKwkJICAgID8gKGR2Yi0+dHNbMF0uczJwX2lkK0FNX1RTX1NSQ19TX1RTMCkgOiBBTV9UU19TUkNfVFMwOworCQlicmVhazsKKwljYXNlIERNWF9TT1VSQ0VfRlJPTlQxOgorCQlod19zcmMgPSAoZHZiLT50c1sxXS5tb2RlID09IEFNX1RTX1NFUklBTCkKKwkJICAgID8gKGR2Yi0+dHNbMV0uczJwX2lkK0FNX1RTX1NSQ19TX1RTMCkgOiBBTV9UU19TUkNfVFMxOworCQlicmVhazsKKwljYXNlIERNWF9TT1VSQ0VfRlJPTlQyOgorCQlod19zcmMgPSAoZHZiLT50c1syXS5tb2RlID09IEFNX1RTX1NFUklBTCkKKwkJICAgID8gKGR2Yi0+dHNbMl0uczJwX2lkK0FNX1RTX1NSQ19TX1RTMCkgOiBBTV9UU19TUkNfVFMyOworCQlicmVhazsKKwljYXNlIERNWF9TT1VSQ0VfRlJPTlQzOgorCQlod19zcmMgPSAoZHZiLT50c1szXS5tb2RlID09IEFNX1RTX1NFUklBTCkKKwkJICAgID8gKGR2Yi0+dHNbM10uczJwX2lkK0FNX1RTX1NSQ19TX1RTMCkgOiBBTV9UU19TUkNfVFMzOworCQlicmVhazsKKwljYXNlIERNWF9TT1VSQ0VfRFZSMDoKKwkJaHdfc3JjID0gQU1fVFNfU1JDX0hJVTsKKwkJYnJlYWs7CisJY2FzZSBETVhfU09VUkNFX0ZST05UMCArIDEwMDoKKwkJaHdfc3JjID0gQU1fVFNfU1JDX0RNWDA7CisJCWJyZWFrOworCWNhc2UgRE1YX1NPVVJDRV9GUk9OVDEgKyAxMDA6CisJCWh3X3NyYyA9IEFNX1RTX1NSQ19ETVgxOworCQlicmVhazsKKwljYXNlIERNWF9TT1VSQ0VfRlJPTlQyICsgMTAwOgorCQlod19zcmMgPSBBTV9UU19TUkNfRE1YMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaHdfc3JjID0gLTE7CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCWlmIChod19zcmMgIT0gZHZiLT50c29fc291cmNlKSB7CisJCWR2Yi0+dHNvX3NvdXJjZSA9IGh3X3NyYzsKKwkJc3RiX2VuYWJsZShkdmIpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR2Yi0+c2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBhbWxfYXN5bmNmaWZvX2h3X3NldF9zb3VyY2Uoc3RydWN0IGFtbF9hc3luY2ZpZm8gKmFmaWZvLAorCQkJCWVudW0gYW1sX2RteF9pZF90IHNyYykKK3sKKwlzdHJ1Y3QgYW1sX2R2YiAqZHZiID0gYWZpZm8tPmR2YjsKKwlpbnQgcmV0ID0gLTE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzZl9hZmlmb19zZihhZmlmbykpIHsKKwkJcHJfZXJyb3IoIiVzOiBhZmlmbyAlZCBpcyBpbiBzZiBtb2RlXG4iLCBfX2Z1bmNfXywgYWZpZm8tPmlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmR2Yi0+c2xvY2ssIGZsYWdzKTsKKworCXByX2RiZygiYXN5bmNmaWZvICVkIHNldCBzb3VyY2UgJWQtPiVkIiwKKwkJCQkJCWFmaWZvLT5pZCwgYWZpZm8tPnNvdXJjZSwgc3JjKTsKKwlzd2l0Y2ggKHNyYykgeworCWNhc2UgQU1fRE1YXzA6CisJY2FzZSBBTV9ETVhfMToKKwljYXNlIEFNX0RNWF8yOgorCQlpZiAoYWZpZm8tPnNvdXJjZSAhPSBzcmMpIHsKKwkJCWFmaWZvLT5zb3VyY2UgPSBzcmM7CisJCQlyZXQgPSAwOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2Vycm9yKCJpbGxlZ2FsIGFzeW5jIGZpZm8gc291cmNlICVkXG4iLCBzcmMpOworCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlpZiAocmV0ID09IDAgJiYgYWZpZm8tPmR2YikKKwkJcmVzZXRfYXN5bmNfZmlmb3MoYWZpZm8tPmR2Yik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdmItPnNsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYW1sX2RteF9od19zZXRfZHVtcF90c19zZWxlY3Qoc3RydWN0IGRteF9kZW11eCAqZGVtdXgsIGludCBkdW1wX3RzX3NlbGVjdCkKK3sKKwlzdHJ1Y3QgYW1sX2RteCAqZG14ID0gKHN0cnVjdCBhbWxfZG14ICopZGVtdXg7CisJc3RydWN0IGFtbF9kdmIgKmR2YiA9IChzdHJ1Y3QgYW1sX2R2YiAqKWRteC0+ZGVtdXgucHJpdjsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmR2Yi0+c2xvY2ssIGZsYWdzKTsKKwlkdW1wX3RzX3NlbGVjdCA9ICEhZHVtcF90c19zZWxlY3Q7CisJaWYgKGRteC0+ZHVtcF90c19zZWxlY3QgIT0gZHVtcF90c19zZWxlY3QpIHsKKwkJZG14LT5kdW1wX3RzX3NlbGVjdCA9IGR1bXBfdHNfc2VsZWN0OworCQlkbXhfcmVzZXRfZG14X2h3X2V4X3VubG9jayhkdmIsIGRteCwgMCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR2Yi0+c2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3UzMiBhbWxfZG14X2dldF92aWRlb19wdHMoc3RydWN0IGFtbF9kdmIgKmR2YikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBwdHM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHZiLT5zbG9jaywgZmxhZ3MpOworCXB0cyA9IHZpZGVvX3B0czsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdmItPnNsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcHRzOworfQorCit1MzIgYW1sX2RteF9nZXRfYXVkaW9fcHRzKHN0cnVjdCBhbWxfZHZiICpkdmIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgcHRzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmR2Yi0+c2xvY2ssIGZsYWdzKTsKKwlwdHMgPSBhdWRpb19wdHM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHZiLT5zbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHB0czsKK30KKwordTMyIGFtbF9kbXhfZ2V0X3ZpZGVvX3B0c19iaXQzMihzdHJ1Y3QgYW1sX2R2YiAqZHZiKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGJpdDMyOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmR2Yi0+c2xvY2ssIGZsYWdzKTsKKwliaXQzMiA9IHZpZGVvX3B0c19iaXQzMjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdmItPnNsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gYml0MzI7Cit9CisKK3UzMiBhbWxfZG14X2dldF9hdWRpb19wdHNfYml0MzIoc3RydWN0IGFtbF9kdmIgKmR2YikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBiaXQzMjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkdmItPnNsb2NrLCBmbGFncyk7CisJYml0MzIgPSBhdWRpb19wdHNfYml0MzI7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHZiLT5zbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGJpdDMyOworfQordTMyIGFtbF9kbXhfZ2V0X2ZpcnN0X3ZpZGVvX3B0cyhzdHJ1Y3QgYW1sX2R2YiAqZHZiKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHB0czsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkdmItPnNsb2NrLCBmbGFncyk7CisJcHRzID0gZmlyc3RfdmlkZW9fcHRzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR2Yi0+c2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBwdHM7Cit9CisKK3UzMiBhbWxfZG14X2dldF9maXJzdF9hdWRpb19wdHMoc3RydWN0IGFtbF9kdmIgKmR2YikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBwdHM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHZiLT5zbG9jaywgZmxhZ3MpOworCXB0cyA9IGZpcnN0X2F1ZGlvX3B0czsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdmItPnNsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcHRzOworfQorCitpbnQgYW1sX2RteF9zZXRfc2tpcGJ5dGUoc3RydWN0IGFtbF9kdmIgKmR2YiwgaW50IHNraXBieXRlKQoreworCWlmIChkZW11eF9za2lwYnl0ZSAhPSBza2lwYnl0ZSkgeworCQlwcl9kYmcoInNldCBza2lwIGJ5dGUgJWRcbiIsIHNraXBieXRlKTsKKwkJZGVtdXhfc2tpcGJ5dGUgPSBza2lwYnl0ZTsKKwkJZG14X3Jlc2V0X2h3X2V4KGR2YiwgMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBhbWxfZG14X3NldF9kZW11eChzdHJ1Y3QgYW1sX2R2YiAqZHZiLCBpbnQgaWQpCit7CisJYW1sX3N0Yl9od19zZXRfc291cmNlKGR2YiwgRE1YX1NPVVJDRV9EVlIwKTsKKwlpZiAoaWQgPCBETVhfREVWX0NPVU5UKSB7CisJCXN0cnVjdCBhbWxfZG14ICpkbXggPSAmZHZiLT5kbXhbaWRdOworCisJCWFtbF9kbXhfaHdfc2V0X3NvdXJjZSgoc3RydWN0IGRteF9kZW11eCAqKWRteCwKKwkJCQkJCQlETVhfU09VUkNFX0RWUjApOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgX3NldF90c2ZpbGVfY2xrZGl2KHN0cnVjdCBhbWxfZHZiICpkdmIsIGludCBjbGtkaXYpCit7CisJaWYgKHRzZmlsZV9jbGtkaXYgIT0gY2xrZGl2KSB7CisJCXByX2RiZygic2V0IHRzIGZpbGUgY2xvY2sgZGl2ICVkXG4iLCBjbGtkaXYpOworCQl0c2ZpbGVfY2xrZGl2ID0gY2xrZGl2OworCQlkbXhfcmVzZXRfaHcoZHZiKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgdHNmaWxlX2Nsa2Rpdl9zdG9yZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQkJCSAgICAgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJLyppbnQgZGl2ID0gKGludClzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOyovCisJbG9uZyBkaXY7CisKKwlpZiAoa3N0cnRvbChidWYsIDAsICZkaXYpID09IDApCisJCV9zZXRfdHNmaWxlX2Nsa2RpdihhbWxfZ2V0X2R2Yl9kZXZpY2UoKSwgKGludClkaXYpOworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCB0c2ZpbGVfY2xrZGl2X3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKKwkJCQkgICAgIHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzc2l6ZV90IHJldDsKKworCXJldCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIHRzZmlsZV9jbGtkaXYpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBkbXhfaWQ7CisKK3N0YXRpYyBzc2l6ZV90IGRteF9zbWFsbHNlY19zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCQkJICAgICBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3NpemVfdCByZXQ7CisJc3RydWN0IGFtbF9kdmIgKmR2YiA9IGFtbF9nZXRfZHZiX2RldmljZSgpOworCisJcmV0ID0gc3ByaW50ZihidWYsICIlZDolZFxuIiwgZHZiLT5kbXhbZG14X2lkXS5zbWFsbHNlYy5lbmFibGUsCisJCQkJCWR2Yi0+ZG14W2RteF9pZF0uc21hbGxzZWMuYnVmc2l6ZSk7CisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBzc2l6ZV90IGRteF9zbWFsbHNlY19zdG9yZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQkJCSAgICAgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJaW50IGksIGUsIHMgPSAwLCBmID0gMDsKKwlzdHJ1Y3QgYW1sX2R2YiAqZHZiID0gYW1sX2dldF9kdmJfZGV2aWNlKCk7CisKKwlpID0gc3NjYW5mKGJ1ZiwgIiVkOiVpOiVkIiwgJmUsICZzLCAmZik7CisJaWYgKGkgPD0gMCkKKwkJcmV0dXJuIHNpemU7CisKKwlkbXhfc21hbGxzZWNfc2V0KCZkdmItPmRteFtkbXhfaWRdLnNtYWxsc2VjLCBlLCBzLCBmKTsKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3QgZG14X3RpbWVvdXRfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQkJCSAgICAgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXNzaXplX3QgcmV0OworCXN0cnVjdCBhbWxfZHZiICpkdmIgPSBhbWxfZ2V0X2R2Yl9kZXZpY2UoKTsKKworCXJldCA9IHNwcmludGYoYnVmLCAiJWQ6JWQ6MHgleDolZDolZFxuIiwKKwkJCQlkdmItPmRteFtkbXhfaWRdLnRpbWVvdXQuZW5hYmxlLAorCQkJCWR2Yi0+ZG14W2RteF9pZF0udGltZW91dC50aW1lb3V0LAorCQkJCWR2Yi0+ZG14W2RteF9pZF0udGltZW91dC5jaF9kaXNhYmxlLAorCQkJCWR2Yi0+ZG14W2RteF9pZF0udGltZW91dC5tYXRjaCwKKwkJKERNWF9SRUFEX1JFRyhkbXhfaWQsIFNUQl9JTlRfU1RBVFVTKSYoMTw8SU5QVVRfVElNRV9PVVQpKSA/CisJCQkxIDogMCk7CisJRE1YX1dSSVRFX1JFRyhkbXhfaWQsIFNUQl9JTlRfU1RBVFVTLCAoMTw8SU5QVVRfVElNRV9PVVQpKTsKKwlyZXR1cm4gcmV0OworfQorc3RhdGljIHNzaXplX3QgZG14X3RpbWVvdXRfc3RvcmUoc3RydWN0IGNsYXNzICpjbGFzcywKKwkJCQkgICAgIHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCWludCBpLCBlLCB0ID0gMCwgYyA9IDAsIG0gPSAwLCBmID0gMDsKKwlzdHJ1Y3QgYW1sX2R2YiAqZHZiID0gYW1sX2dldF9kdmJfZGV2aWNlKCk7CisKKwlpID0gc3NjYW5mKGJ1ZiwgIiVkOiVpOiVpOiVkOiVkIiwgJmUsICZ0LCAmYywgJm0sICZmKTsKKwlpZiAoaSA8PSAwKQorCQlyZXR1cm4gc2l6ZTsKKworCWRteF90aW1lb3V0X3NldCgmZHZiLT5kbXhbZG14X2lkXS50aW1lb3V0LCBlLCB0LCBjLCBtLCBmKTsKKwlyZXR1cm4gc2l6ZTsKK30KKworCisjZGVmaW5lIERFTVVYX1NDQU1CTEVfRlVOQ19ERUNMKGkpICBcCitzdGF0aWMgc3NpemVfdCBkZW11eCMjaSMjX3NjcmFtYmxlX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywgIFwKK3N0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZilcCit7XAorCWludCBkYXRhID0gMDtcCisJaW50IGFmbGFnID0gMDtcCisJaW50IHZmbGFnID0gMDtcCisJc3NpemVfdCByZXQgPSAwO1wKKwlkYXRhID0gRE1YX1JFQURfUkVHKGksIERFTVVYX1NDUkFNQkxJTkdfU1RBVEUpO1wKKwlpZiAoKGRhdGEgJiAweDAxKSA9PSAweDAxKSBcCisJCXZmbGFnID0gMTtcCisJaWYgKChkYXRhICYgMHgwMikgPT0gMHgwMikgXAorCQlhZmxhZyA9IDE7XAorCXJldCA9IHNwcmludGYoYnVmLCAiJWQgJWRcbiIsIHZmbGFnLCBhZmxhZyk7XAorCXJldHVybiByZXQ7XAorfQorCisjaWYgRE1YX0RFVl9DT1VOVCA+IDAKK0RFTVVYX1NDQU1CTEVfRlVOQ19ERUNMKDApCisjZW5kaWYKKyNpZiBETVhfREVWX0NPVU5UID4gMQorREVNVVhfU0NBTUJMRV9GVU5DX0RFQ0woMSkKKyNlbmRpZgorI2lmIERNWF9ERVZfQ09VTlQgPiAyCitERU1VWF9TQ0FNQkxFX0ZVTkNfREVDTCgyKQorI2VuZGlmCitzdGF0aWMgc3NpemVfdCBjaXBsdXNfb3V0cHV0X2N0cmxfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQkJCQkgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCWNoYXIgKm91dCA9ICJub25lIjsKKworCXByX2luZigib3V0cHV0IGRlbXV4IHVzZSAzIGJpdCB0byBpbmRpY2F0ZS5cbiIpOworCXByX2luZigiMWJpdDpkZW11eDAgMmJpdDpkZW11eDEgM2JpdDpkZW11eDJcbiIpOworCisJc3dpdGNoIChjaXBsdXNfb3V0X3NlbCkgeworCWNhc2UgMToKKwkJb3V0ID0gImRteDAiOworCQlicmVhazsKKwljYXNlIDI6CisJCW91dCA9ICJkbXgxIjsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlvdXQgPSAiZG14MiI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldCA9IHNwcmludGYoYnVmLCAiJXMgMHgleCAlc1xuIiwKKwkJb3V0LAorCQljaXBsdXNfb3V0X3NlbCwKKwkJKGNpcGx1c19vdXRfYXV0b19tb2RlKSA/ICIiIDogIihmb3JjZSkiKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBjaXBsdXNfb3V0cHV0X2N0cmxfc3RvcmUoc3RydWN0IGNsYXNzICpjbGFzcywKKwkJCQkJICBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGFtbF9kdmIgKmR2YiA9IGFtbF9nZXRfZHZiX2RldmljZSgpOworCWludCBpLCB0bXA7CisJdTMyIHRvcF9jZmcsIGNpX2NmZzsKKworCWkgPSBrc3RydG9pbnQoYnVmLCAtMSwgJnRtcCk7CisJaWYgKHRtcCA+IDggfHwgdG1wIDwgMCkKKwkJcHJfZXJyb3IoIkludmFsaWQgb3V0cHV0IHNldFxuIik7CisJZWxzZSBpZiAodG1wID09IDgpIHsKKwkJY2lwbHVzX291dF9hdXRvX21vZGUgPSAxOworCQljaXBsdXNfb3V0X3NlbCA9IC0xOworCQlwcl9lcnJvcigiQXV0byBzZXQgb3V0cHV0IG1vZGUgZW5hYmxlXG4iKTsKKwl9IGVsc2UgeworCQljaXBsdXNfb3V0X2F1dG9fbW9kZSA9IDA7CisJCWNpcGx1c19vdXRfc2VsID0gdG1wOworCQlwcl9lcnJvcigiQXV0byBzZXQgb3V0cHV0IG1vZGUgZGlzYWJsZVxuIik7CisJfQorCisJdG9wX2NmZyA9IFJFQURfTVBFR19SRUcoU1RCX1RPUF9DT05GSUcpOworCWNpX2NmZyAgPSBSRUFEX01QRUdfUkVHKENJUExVU19DT05GSUcpOworCisJaWYgKGNpX2NmZyAmICgxIDw8IENOVExfRU5BQkxFKSkgeworCQlpbnQgb3V0ID0gMDsKKworCQlpZiAoY2lwbHVzX291dF9hdXRvX21vZGUpIHsKKwkJCWlmIChkdmItPmRzY1swXS5zb3VyY2UgIT0gLTEpCisJCQkJb3V0ID0gMSA8PCAoZHZiLT5kc2NbMF0uc291cmNlIC0gQU1fVFNfU1JDX0RNWDApOworCQl9IGVsc2UgeworCQkJb3V0ID0gY2lwbHVzX291dF9zZWw7CisJCX0KKworCQl0b3BfY2ZnICY9ICB+KDc8PENJUExVU19PVVRfU0VMKTsKKwkJdG9wX2NmZyB8PSAob3V0PDxDSVBMVVNfT1VUX1NFTCk7CisJCVdSSVRFX01QRUdfUkVHKFNUQl9UT1BfQ09ORklHLCB0b3BfY2ZnKTsKKworCQlzZXRfZmVjX2NvcmVfc2VsKGR2Yik7CisJfQorCisJcmV0dXJuIHNpemU7Cit9CitzdGF0aWMgc3NpemVfdCByZXNldF9mZWNfaW5wdXRfY3RybF9zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCQkJCSBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQkJCQkgY2hhciAqYnVmKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCByZXNldF9mZWNfaW5wdXRfY3RybF9zdG9yZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQkJCQkgIHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwl1MzIgdjsKKworCXYgPSBSRUFEX01QRUdfUkVHKEZFQ19JTlBVVF9DT05UUk9MKTsKKwl2ICY9IH4oMTw8MTEpOworCVdSSVRFX01QRUdfUkVHKEZFQ19JTlBVVF9DT05UUk9MLCB2KTsKKworCXByX2RiZygicmVzZXQgRkVDX0lOUFVUX0NPTlRST0wgdG8gJXhcbiIsIHYpOworCisJcmV0dXJuIHNpemU7Cit9CitzdGF0aWMgc3NpemVfdCByZWdpc3Rlcl9hZGRyX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKKwkJCQkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJY2hhciAqYnVmKTsKK3N0YXRpYyBzc2l6ZV90IHJlZ2lzdGVyX2FkZHJfc3RvcmUoc3RydWN0IGNsYXNzICpjbGFzcywKKwkJCQkJIHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKK3N0YXRpYyBzc2l6ZV90IGRteF9pZF9zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCQkJICBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpOworc3RhdGljIHNzaXplX3QgZG14X2lkX3N0b3JlKHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCQkJICAgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKK3N0YXRpYyBzc2l6ZV90IHJlZ2lzdGVyX3ZhbHVlX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKKwkJCQkJIHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjaGFyICpidWYpOworc3RhdGljIHNzaXplX3QgcmVnaXN0ZXJfdmFsdWVfc3RvcmUoc3RydWN0IGNsYXNzICpjbGFzcywKKwkJCQkJICBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOworc3RhdGljIHNzaXplX3QgZG14X3NlY19zdGF0aXN0aWNzX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKKwkJCQkJIHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjaGFyICpidWYpOworc3RhdGljIGludCByZWdfYWRkcjsKKworc3RhdGljIENMQVNTX0FUVFJfUlcoZG14X2lkKTsKK3N0YXRpYyBDTEFTU19BVFRSX1JXKHJlZ2lzdGVyX2FkZHIpOworc3RhdGljIENMQVNTX0FUVFJfUlcocmVnaXN0ZXJfdmFsdWUpOworc3RhdGljIENMQVNTX0FUVFJfUlcodHNmaWxlX2Nsa2Rpdik7CisKKyNkZWZpbmUgREVNVVhfU0NBTUJMRV9BVFRSX0RFQ0woaSlcCisJQ0xBU1NfQVRUUl9STyhkZW11eCMjaSMjX3NjcmFtYmxlKTsKKyNpZiBETVhfREVWX0NPVU5UID4gMAorREVNVVhfU0NBTUJMRV9BVFRSX0RFQ0woMCk7CisjZW5kaWYKKyNpZiBETVhfREVWX0NPVU5UID4gMQorREVNVVhfU0NBTUJMRV9BVFRSX0RFQ0woMSk7CisjZW5kaWYKKyNpZiBETVhfREVWX0NPVU5UID4gMgorREVNVVhfU0NBTUJMRV9BVFRSX0RFQ0woMik7CisjZW5kaWYKKworc3RhdGljIENMQVNTX0FUVFJfUlcoZG14X3NtYWxsc2VjKTsKK3N0YXRpYyBDTEFTU19BVFRSX1JXKGRteF90aW1lb3V0KTsKK3N0YXRpYyBDTEFTU19BVFRSX1JXKHJlc2V0X2ZlY19pbnB1dF9jdHJsKTsKK3N0YXRpYyBDTEFTU19BVFRSX1JXKGNpcGx1c19vdXRwdXRfY3RybCk7CitzdGF0aWMgQ0xBU1NfQVRUUl9STyhkbXhfc2VjX3N0YXRpc3RpY3MpOworCisjZGVmaW5lIERNWF9BVFRSKG5hbWUpICZjbGFzc19hdHRyXyMjbmFtZS5hdHRyCisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphbWxfZG14X2NsYXNzX2F0dHJzW10gPSB7CisJRE1YX0FUVFIoZG14X2lkKSwKKwlETVhfQVRUUihyZWdpc3Rlcl9hZGRyKSwKKwlETVhfQVRUUihyZWdpc3Rlcl92YWx1ZSksCisJRE1YX0FUVFIodHNmaWxlX2Nsa2RpdiksCisJRE1YX0FUVFIoZG14X3NtYWxsc2VjKSwKKwlETVhfQVRUUihkbXhfdGltZW91dCksCisJRE1YX0FUVFIocmVzZXRfZmVjX2lucHV0X2N0cmwpLAorCURNWF9BVFRSKGNpcGx1c19vdXRwdXRfY3RybCksCisJRE1YX0FUVFIoZG14X3NlY19zdGF0aXN0aWNzKSwKKyNkZWZpbmUgREVNVVhfU0NSQU1CTEUoaSkgXAorCURNWF9BVFRSKGRlbXV4IyNpIyNfc2NyYW1ibGUpCisjaWYgRE1YX0RFVl9DT1VOVCA+IDAKKwlERU1VWF9TQ1JBTUJMRSgwKSwKKyNlbmRpZgorI2lmIERNWF9ERVZfQ09VTlQgPiAxCisJREVNVVhfU0NSQU1CTEUoMSksCisjZW5kaWYKKyNpZiBETVhfREVWX0NPVU5UID4gMgorCURFTVVYX1NDUkFNQkxFKDIpLAorI2VuZGlmCisJTlVMTCwKK307CisKK0FUVFJJQlVURV9HUk9VUFMoYW1sX2RteF9jbGFzcyk7CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgYW1sX2RteF9jbGFzcyA9IHsKKwkubmFtZSA9ICJkbXgiLAorCS5jbGFzc19ncm91cHMgPSBhbWxfZG14X2NsYXNzX2dyb3VwcywKK307CisKK3N0YXRpYyBzc2l6ZV90IGRteF9pZF9zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCQkJICBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IHJldDsKKworCXJldCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIGRteF9pZCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgZG14X2lkX3N0b3JlKHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCQkJICAgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCWludCBpZCA9IDA7CisJbG9uZyB2YWx1ZSA9IDA7CisKKwlpZiAoa3N0cnRvbChidWYsIDAsICZ2YWx1ZSkgPT0gMCkKKwkJaWQgPSAoaW50KXZhbHVlOworCS8qaWQgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgMCwgMTYpOyovCisKKwlpZiAoaWQgPCAwIHx8IGlkID4gMikKKwkJcHJfZGJnKCJkbXggaWQgbXVzdCAwIH4yXG4iKTsKKwllbHNlCisJCWRteF9pZCA9IGlkOworCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJlZ2lzdGVyX2FkZHJfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQkJCQlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQkJCQkgY2hhciAqYnVmKQoreworCWludCByZXQ7CisKKwlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiV4XG4iLCByZWdfYWRkcik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgcmVnaXN0ZXJfYWRkcl9zdG9yZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQkJCQkgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJaW50IGFkZHIgPSAwOworCS8qYWRkciA9IHNpbXBsZV9zdHJ0b2woYnVmLCAwLCAxNik7Ki8KKwlsb25nIHZhbHVlID0gMDsKKworCWlmIChrc3RydG9sKGJ1ZiwgMCwgJnZhbHVlKSA9PSAwKQorCQlhZGRyID0gKGludCl2YWx1ZTsKKwlyZWdfYWRkciA9IGFkZHI7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJlZ2lzdGVyX3ZhbHVlX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKKwkJCQkJIHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjaGFyICpidWYpCit7CisJaW50IHJldCwgdmFsdWU7CisKKwl2YWx1ZSA9IFJFQURfTVBFR19SRUcocmVnX2FkZHIpOworCXJldCA9IHNwcmludGYoYnVmLCAiJXhcbiIsIHZhbHVlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCByZWdpc3Rlcl92YWx1ZV9zdG9yZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQkJCQkgIHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgdmFsdWUgPSAwOworCS8qdmFsdWUgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgMCwgMTYpOyovCisJbG9uZyB2YWwgPSAwOworCisJaWYgKGtzdHJ0b2woYnVmLCAwLCAmdmFsKSA9PSAwKQorCQl2YWx1ZSA9IChpbnQpdmFsOworCVdSSVRFX01QRUdfUkVHKHJlZ19hZGRyLCB2YWx1ZSk7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRteF9zZWNfc3RhdGlzdGljc19zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCQkJCSBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQkJCQkgY2hhciAqYnVmKQoreworCXNzaXplX3QgcmV0OworCWNoYXIgdG1wWzEyOF07CisJc3RydWN0IGFtbF9kdmIgKmR2YiA9IGFtbF9nZXRfZHZiX2RldmljZSgpOworCisJcmV0ID0gc3ByaW50Zih0bXAsICJbaHddJSNseDolI2x4OiUjbHhcbltzd10lI2x4OiUjbHg6JSNseFxuIiwKKwkJCWR2Yi0+ZG14W2RteF9pZF0uc2VjX2NudFtTRUNfQ05UX0hXXSwKKwkJCWR2Yi0+ZG14W2RteF9pZF0uc2VjX2NudF9tYXRjaFtTRUNfQ05UX0hXXSwKKwkJCWR2Yi0+ZG14W2RteF9pZF0uc2VjX2NudF9jcmNfZmFpbFtTRUNfQ05UX0hXXSwKKwkJCWR2Yi0+ZG14W2RteF9pZF0uc2VjX2NudFtTRUNfQ05UX1NXXSwKKwkJCWR2Yi0+ZG14W2RteF9pZF0uc2VjX2NudF9tYXRjaFtTRUNfQ05UX1NXXSwKKwkJCWR2Yi0+ZG14W2RteF9pZF0uc2VjX2NudF9jcmNfZmFpbFtTRUNfQ05UX1NXXSk7CisJcmV0ID0gc3ByaW50ZihidWYsICIlc1tzc10lI2x4OiUjbHg6JSNseFxuIiwKKwkJCXRtcCwKKwkJCWR2Yi0+ZG14W2RteF9pZF0uc2VjX2NudFtTRUNfQ05UX1NTXSwKKwkJCWR2Yi0+ZG14W2RteF9pZF0uc2VjX2NudF9tYXRjaFtTRUNfQ05UX1NTXSwKKwkJCWR2Yi0+ZG14W2RteF9pZF0uc2VjX2NudF9jcmNfZmFpbFtTRUNfQ05UX1NTXSk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGFtbF9yZWdpc3RfZG14X2NsYXNzKHZvaWQpCit7CisKKwlpZiAoY2xhc3NfcmVnaXN0ZXIoJmFtbF9kbXhfY2xhc3MpIDwgMCkKKwkJcHJfZXJyb3IoInJlZ2lzdGVyIGNsYXNzIGVycm9yXG4iKTsKKworCXJldHVybiAwOworfQorCitpbnQgYW1sX3VucmVnaXN0X2RteF9jbGFzcyh2b2lkKQoreworCisJY2xhc3NfdW5yZWdpc3RlcigmYW1sX2RteF9jbGFzcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWNvbmZpZyBwYXJzZXJfY29uZmlnc1tdID0geworCU1DX1BVMzIoInZpZGVvX3B0cyIsICZ2aWRlb19wdHMpLAorCU1DX1BVMzIoImF1ZGlvX3B0cyIsICZhdWRpb19wdHMpLAorCU1DX1BVMzIoInZpZGVvX3B0c19iaXQzMiIsICZ2aWRlb19wdHNfYml0MzIpLAorCU1DX1BVMzIoImF1ZGlvX3B0c19iaXQzMiIsICZhdWRpb19wdHNfYml0MzIpLAorCU1DX1BVMzIoImZpcnN0X3ZpZGVvX3B0cyIsICZmaXJzdF92aWRlb19wdHMpLAorCU1DX1BVMzIoImZpcnN0X2F1ZGlvX3B0cyIsICZmaXJzdF9hdWRpb19wdHMpLAorfTsKKwordm9pZCBhbWxfcmVnaXN0ZXJfcGFyc2VyX21jb25maWcodm9pZCkKK3sKKwlSRUdfUEFUSF9DT05GSUdTKCJtZWRpYS5wYXJzZXIiLCBwYXJzZXJfY29uZmlncyk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9od19kZW11eC9hbWxfZHZiLmMgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvaHdfZGVtdXgvYW1sX2R2Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ODllODkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvaHdfZGVtdXgvYW1sX2R2Yi5jCkBAIC0wLDAgKzEsMjkzNCBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE3IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyogbW9yZSBkZXRhaWxzLgorKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKgorKiBEZXNjcmlwdGlvbjoKKyovCisgLyoKKyAgKiBBTUxPR0lDIERWQiBkcml2ZXIuCisgICovCisKKy8vbW92ZSB0byBkZWZpbmUgaW4gTWFrZWZpbGUKKy8vI2RlZmluZSBFTkFCTEVfREVNVVhfRFJJVkVSCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvYW1zdHJlYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3JlZ2lzdGVycy9jcHVfdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgImNfc3RiX2RlZmluZS5oIgorI2luY2x1ZGUgImNfc3RiX3JlZ3NfZGVmaW5lLmgiCisjaW5jbHVkZSAiYW1sX2R2Yi5oIgorI2luY2x1ZGUgImFtbF9kdmJfcmVnLmgiCisKKyNpbmNsdWRlICJhbWxfZGVtb2RfZ3QuaCIKKyNpbmNsdWRlICIuLi8uLi8uLi9jb21tb24vbWVkaWFfY2xvY2svc3dpdGNoL2FtcG9ydHNfZ2F0ZS5oIgorCisjZGVmaW5lIHByX2RiZyhhcmdzLi4uKVwKKwlkbyB7XAorCQlpZiAoZGVidWdfZHZiKVwKKwkJCXByaW50ayhhcmdzKTtcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgcHJfZXJyb3IoZm10LCBhcmdzLi4uKSBwcmludGsoIkRWQjogIiBmbXQsICMjIGFyZ3MpCisjZGVmaW5lIHByX2luZihmbXQsIGFyZ3MuLi4pICAgcHJpbnRrKGZtdCwgIyMgYXJncykKKworTU9EVUxFX1BBUk1fREVTQyhkZWJ1Z19kdmIsICJcblx0XHQgRW5hYmxlIGR2YiBkZWJ1ZyBpbmZvcm1hdGlvbiIpOworc3RhdGljIGludCBkZWJ1Z19kdmI7Cittb2R1bGVfcGFyYW0oZGVidWdfZHZiLCBpbnQsIDA2NDQpOworCisjZGVmaW5lIENBUkRfTkFNRSAiYW1sb2dpYy1kdmItZGVtdXgiCisKKyNkZWZpbmUgRFZCX1ZFUlNJT04gIlYyLjAyIgorCisKKy8vZWNobyAweGZmNjQ2MTgwIDB4NDAgPiAvc3lzL2tlcm5lbC9kZWJ1Zy9hbWxfcmVnL3BhZGRyCisvL2VjaG8gMHhmZjYzNDU5MCAweDEgPiAvc3lzL2tlcm5lbC9kZWJ1Zy9hbWxfcmVnL3BhZGRyCisjZGVmaW5lIFRTSU5CX0RFR0xJVENIMCAweGZmNjQ2MTgwCisjZGVmaW5lIFRTSU5CX0RFR0xJVENIMSAweGZmNjM0NTkwCisKK0RWQl9ERUZJTkVfTU9EX09QVF9BREFQVEVSX05SKGFkYXB0ZXJfbnIpOworCitNT0RVTEVfUEFSTV9ERVNDKGRzY19tYXgsICJtYXggbnVtYmVyIG9mIGRzYyIpOworc3RhdGljIGludCBkc2NfbWF4ID0gRFNDX0RFVl9DT1VOVDsKK21vZHVsZV9wYXJhbShkc2NfbWF4LCBpbnQsIDA2NDQpOworCitzdGF0aWMgc3RydWN0IGFtbF9kdmIgYW1sX2R2Yl9kZXZpY2U7CitzdGF0aWMgc3RydWN0IGNsYXNzIGFtbF9zdGJfY2xhc3M7CisKK3N0YXRpYyBpbnQgZG14X3Jlc2V0X2FsbF9mbGFnID0gMDsKKyNpZiAwCitzdGF0aWMgc3RydWN0IHJlc2V0X2NvbnRyb2wgKmFtbF9kdmJfZGVtdXhfcmVzZXRfY3RsOworc3RhdGljIHN0cnVjdCByZXNldF9jb250cm9sICphbWxfZHZiX2FmaWZvX3Jlc2V0X2N0bDsKK3N0YXRpYyBzdHJ1Y3QgcmVzZXRfY29udHJvbCAqYW1sX2R2Yl9haGJhcmIwX3Jlc2V0X2N0bDsKK3N0YXRpYyBzdHJ1Y3QgcmVzZXRfY29udHJvbCAqYW1sX2R2Yl91cGFyc2VydG9wX3Jlc2V0X2N0bDsKKyNlbHNlCisvKm5vIHVzZWQgcmVzZXQgY3RsLG5lZWQgdXNlIGNsayBpbiA0Ljkga2VybmVsKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrICphbWxfZHZiX2RlbXV4X2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrICphbWxfZHZiX2FmaWZvX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrICphbWxfZHZiX2FoYmFyYjBfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgKmFtbF9kdmJfdXBhcnNlcnRvcF9jbGs7CisjZW5kaWYKKworc3RhdGljIGludCBhbWxfdHNkZW11eF9yZXNldCh2b2lkKTsKK3N0YXRpYyBpbnQgYW1sX3RzZGVtdXhfc2V0X3Jlc2V0X2ZsYWcodm9pZCk7CitzdGF0aWMgaW50IGFtbF90c2RlbXV4X3JlcXVlc3RfaXJxKGlycV9oYW5kbGVyX3QgaGFuZGxlciwgdm9pZCAqZGF0YSk7CitzdGF0aWMgaW50IGFtbF90c2RlbXV4X2ZyZWVfaXJxKHZvaWQpOworc3RhdGljIGludCBhbWxfdHNkZW11eF9zZXRfdmlkKGludCB2cGlkKTsKK3N0YXRpYyBpbnQgYW1sX3RzZGVtdXhfc2V0X2FpZChpbnQgYXBpZCk7CitzdGF0aWMgaW50IGFtbF90c2RlbXV4X3NldF9zaWQoaW50IHNwaWQpOworc3RhdGljIGludCBhbWxfdHNkZW11eF9zZXRfcGNyaWQoaW50IHBjcnBpZCk7CitzdGF0aWMgaW50IGFtbF90c2RlbXV4X3NldF9za2lwYnl0ZShpbnQgc2tpcGJ5dGUpOworc3RhdGljIGludCBhbWxfdHNkZW11eF9zZXRfZGVtdXgoaW50IGlkKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFtbF90c2RlbXV4X2h3ZG14X3NwaW5fbG9jayh1bnNpZ25lZCBsb25nIGZsYWdzKTsKK3N0YXRpYyBpbnQgYW1sX3RzZGVtdXhfaHdkbXhfc3Bpbl91bmxvY2sodW5zaWduZWQgbG9uZyBmbGFncyk7CisKK3N0YXRpYyBzdHJ1Y3QgdHNkZW11eF9vcHMgYW1sX3RzZGVtdXhfb3BzID0geworCS5yZXNldCA9IGFtbF90c2RlbXV4X3Jlc2V0LAorCS5zZXRfcmVzZXRfZmxhZyA9IGFtbF90c2RlbXV4X3NldF9yZXNldF9mbGFnLAorCS5yZXF1ZXN0X2lycSA9IGFtbF90c2RlbXV4X3JlcXVlc3RfaXJxLAorCS5mcmVlX2lycSA9IGFtbF90c2RlbXV4X2ZyZWVfaXJxLAorCS5zZXRfdmlkID0gYW1sX3RzZGVtdXhfc2V0X3ZpZCwKKwkuc2V0X2FpZCA9IGFtbF90c2RlbXV4X3NldF9haWQsCisJLnNldF9zaWQgPSBhbWxfdHNkZW11eF9zZXRfc2lkLAorCS5zZXRfcGNyaWQgPSBhbWxfdHNkZW11eF9zZXRfcGNyaWQsCisJLnNldF9za2lwYnl0ZSA9IGFtbF90c2RlbXV4X3NldF9za2lwYnl0ZSwKKwkuc2V0X2RlbXV4ID0gYW1sX3RzZGVtdXhfc2V0X2RlbXV4LAorCS5od19kbXhfbG9jayA9IGFtbF90c2RlbXV4X2h3ZG14X3NwaW5fbG9jaywKKwkuaHdfZG14X3VubG9jayA9IGFtbF90c2RlbXV4X2h3ZG14X3NwaW5fdW5sb2NrCit9OworCitsb25nIGFtbF9zdGJfZ2V0X2Jhc2UoaW50IGlkKQoreworCWludCBuZXdiYXNlID0gMDsKKwlpZiAoTUVTT05fQ1BVX01BSk9SX0lEX1RYTCA8IGdldF9jcHVfdHlwZSgpCisJCSYmIE1FU09OX0NQVV9NQUpPUl9JRF9HWExYICE9IGdldF9jcHVfdHlwZSgpKSB7CisJCW5ld2Jhc2UgPSAxOworCX0KKworCXN3aXRjaCAoaWQpIHsKKwljYXNlIElEX1NUQl9DQlVTX0JBU0U6CisJCXJldHVybiAobmV3YmFzZSkgPyAweDE4MDAgOiAweDE2MDA7CisJY2FzZSBJRF9TTUFSVENBUkRfUkVHX0JBU0U6CisJCXJldHVybiAobmV3YmFzZSkgPyAweDk0MDAgOiAweDIxMTA7CisJY2FzZSBJRF9BU1lOQ19GSUZPX1JFR19CQVNFOgorCQlyZXR1cm4gKG5ld2Jhc2UpID8gMHgyODAwIDogMHgyMzEwOworCWNhc2UgSURfQVNZTkNfRklGTzFfUkVHX0JBU0U6CisJCXJldHVybiAweDk4MDA7CisJY2FzZSBJRF9BU1lOQ19GSUZPMl9SRUdfQkFTRToKKwkJcmV0dXJuIChuZXdiYXNlKSA/IDB4MjQwMCA6IDB4MjMxNDsKKwljYXNlIElEX1JFU0VUX0JBU0U6CisJCXJldHVybiAobmV3YmFzZSkgPyAweDA0MDAgOiAweDExMDA7CisJY2FzZSBJRF9QQVJTRVJfU1VCX1NUQVJUX1BUUl9CQVNFOgorCQlyZXR1cm4gKG5ld2Jhc2UpID8gMHgzODAwIDogMHgyOTAwOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMDsKK30KK3N0YXRpYyB2b2lkIGFtbF9kdmJfZG14X3JlbGVhc2Uoc3RydWN0IGFtbF9kdmIgKmFkdmIsIHN0cnVjdCBhbWxfZG14ICpkbXgpCit7CisJaW50IGk7CisJcHJfaW5mKCJbZG14X2twaV0gJXMgRW50ZXIuXG4iLCBfX2Z1bmNfXyk7CisJZHZiX25ldF9yZWxlYXNlKCZkbXgtPmR2Yl9uZXQpOworCWFtbF9kbXhfaHdfZGVpbml0KGRteCk7CisJZG14LT5kZW11eC5kbXguY2xvc2UoJmRteC0+ZGVtdXguZG14KTsKKwlkbXgtPmRlbXV4LmRteC5yZW1vdmVfZnJvbnRlbmQoJmRteC0+ZGVtdXguZG14LCAmZG14LT5tZW1fZmUpOworCisJZm9yIChpID0gMDsgaSA8IERNWF9ERVZfQ09VTlQ7IGkrKykKKwkJZG14LT5kZW11eC5kbXgucmVtb3ZlX2Zyb250ZW5kKCZkbXgtPmRlbXV4LmRteCwgJmRteC0+aHdfZmVbaV0pOworCisJZHZiX2RteGRldl9yZWxlYXNlKCZkbXgtPmRteGRldik7CisJZHZiX2RteF9yZWxlYXNlKCZkbXgtPmRlbXV4KTsKKwlwcl9pbmYoIltkbXhfa3BpXSAlcyBFeGl0LlxuIiwgX19mdW5jX18pOworfQorCitzdGF0aWMgaW50IGFtbF9kdmJfZG14X2luaXQoc3RydWN0IGFtbF9kdmIgKmFkdmIsIHN0cnVjdCBhbWxfZG14ICpkbXgsIGludCBpZCkKK3sKKwlpbnQgaSwgcmV0OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZV9kbXggPSBOVUxMOworCWNoYXIgYnVmWzMyXTsKKworCXN3aXRjaCAoaWQpIHsKKwljYXNlIDA6CisJCWRteC0+ZG14X2lycSA9IElOVF9ERU1VWDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlkbXgtPmRteF9pcnEgPSBJTlRfREVNVVhfMTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlkbXgtPmRteF9pcnEgPSBJTlRfREVNVVhfMjsKKwkJYnJlYWs7CisJfQorCW1lbXNldChidWYsIDAsIDMyKTsKKwlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiZG14Iik7CisJbm9kZV9kbXggPSBvZl9wYXJzZV9waGFuZGxlKGFkdmItPnBkZXYtPmRldi5vZl9ub2RlLCBidWYsIDApOworCWlmIChub2RlX2RteCkgeworCQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJkZW11eCVkX2lycSIsIGlkKTsKKwkJcmV0ID0gb2ZfaXJxX2dldF9ieW5hbWUobm9kZV9kbXgsIGJ1Zik7CisJCWlmIChyZXQgPiAwKQorCQkJZG14LT5kbXhfaXJxID0gcmV0OworCQlwcmludGsoImdldCBpcnEgbnVtIGRlbXV4JWRfaXJxOiVkXG4iLGlkLGRteC0+ZG14X2lycSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCJnZXQgZGVmYXVsdCBkZW11eCVkX2lycTolZFxuIixpZCxkbXgtPmRteF9pcnEpOworCX0KKworCWRteC0+c291cmNlID0gLTE7CisJZG14LT5kdW1wX3RzX3NlbGVjdCA9IDA7CisJZG14LT5kdnJfaXJxID0gLTE7CisKKwlkbXgtPmRlbXV4LmRteC5jYXBhYmlsaXRpZXMgPQorCSAgICAoRE1YX1RTX0ZJTFRFUklORyB8IERNWF9TRUNUSU9OX0ZJTFRFUklORyB8CisJICAgICBETVhfTUVNT1JZX0JBU0VEX0ZJTFRFUklORyk7CisJZG14LT5kZW11eC5maWx0ZXJudW0gPSBkbXgtPmRlbXV4LmZlZWRudW0gPSBGSUxURVJfQ09VTlQ7CisJZG14LT5kZW11eC5wcml2ID0gYWR2YjsKKwlkbXgtPmRlbXV4LnN0YXJ0X2ZlZWQgPSBhbWxfZG14X2h3X3N0YXJ0X2ZlZWQ7CisJZG14LT5kZW11eC5zdG9wX2ZlZWQgPSBhbWxfZG14X2h3X3N0b3BfZmVlZDsKKwlkbXgtPmRlbXV4LndyaXRlX3RvX2RlY29kZXIgPSBOVUxMOworCXJldCA9IGR2Yl9kbXhfaW5pdCgmZG14LT5kZW11eCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyb3IoImR2Yl9kbXggZmFpbGVkOiBlcnJvciAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJvcl9kbXhfaW5pdDsKKwl9CisKKwlkbXgtPmRteGRldi5maWx0ZXJudW0gPSBkbXgtPmRlbXV4LmZlZWRudW07CisJZG14LT5kbXhkZXYuZGVtdXggPSAmZG14LT5kZW11eC5kbXg7CisJZG14LT5kbXhkZXYuY2FwYWJpbGl0aWVzID0gMDsKKwlyZXQgPSBkdmJfZG14ZGV2X2luaXQoJmRteC0+ZG14ZGV2LCAmYWR2Yi0+ZHZiX2FkYXB0ZXIpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2Vycm9yKCJkdmJfZG14ZGV2X2luaXQgZmFpbGVkOiBlcnJvciAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJvcl9kbXhkZXZfaW5pdDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgRE1YX0RFVl9DT1VOVDsgaSsrKSB7CisJCWludCBzb3VyY2UgPSBpICsgRE1YX0ZST05URU5EXzA7CisKKwkJZG14LT5od19mZVtpXS5zb3VyY2UgPSBzb3VyY2U7CisJCXJldCA9CisJCSAgICBkbXgtPmRlbXV4LmRteC5hZGRfZnJvbnRlbmQoJmRteC0+ZGVtdXguZG14LAorCQkJCQkJJmRteC0+aHdfZmVbaV0pOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyb3IoImFkZGluZyBod19mcm9udGVuZCB0byBkbXggZmFpbGVkOiBlcnJvciAlZCIsCisJCQkJIHJldCk7CisJCQlkbXgtPmh3X2ZlW2ldLnNvdXJjZSA9IDA7CisJCQlnb3RvIGVycm9yX2FkZF9od19mZTsKKwkJfQorCX0KKworCWRteC0+bWVtX2ZlLnNvdXJjZSA9IERNWF9NRU1PUllfRkU7CisJcmV0ID0gZG14LT5kZW11eC5kbXguYWRkX2Zyb250ZW5kKCZkbXgtPmRlbXV4LmRteCwgJmRteC0+bWVtX2ZlKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnJvcigiYWRkaW5nIG1lbV9mcm9udGVuZCB0byBkbXggZmFpbGVkOiBlcnJvciAlZCIsIHJldCk7CisJCWdvdG8gZXJyb3JfYWRkX21lbV9mZTsKKwl9CisJcmV0ID0gZG14LT5kZW11eC5kbXguY29ubmVjdF9mcm9udGVuZCgmZG14LT5kZW11eC5kbXgsICZkbXgtPmh3X2ZlWzFdKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnJvcigiY29ubmVjdCBmcm9udGVuZCBmYWlsZWQ6IGVycm9yICVkIiwgcmV0KTsKKwkJZ290byBlcnJvcl9jb25uZWN0X2ZlOworCX0KKworCWRteC0+aWQgPSBpZDsKKwlkbXgtPmF1ZF9jaGFuID0gLTE7CisJZG14LT52aWRfY2hhbiA9IC0xOworCWRteC0+c3ViX2NoYW4gPSAtMTsKKwlkbXgtPnBjcl9jaGFuID0gLTE7CisKKwkvKnNtYWxsc2VjKi8KKwlkbXgtPnNtYWxsc2VjLmVuYWJsZSA9IDA7CisJZG14LT5zbWFsbHNlYy5idWZzaXplID0gU1NfQlVGU0laRV9ERUY7CisJZG14LT5zbWFsbHNlYy5kbXggPSBkbXg7CisKKwkvKmlucHV0IHRpbWVvdXQqLworCWRteC0+dGltZW91dC5lbmFibGUgPSAxOworCWRteC0+dGltZW91dC50aW1lb3V0ID0gRFRPX1RJTUVPVVRfREVGOworCWRteC0+dGltZW91dC5jaF9kaXNhYmxlID0gRFRPX0NIRElTX1ZBUzsKKwlkbXgtPnRpbWVvdXQubWF0Y2ggPSAxOworCWRteC0+dGltZW91dC50cmlnZ2VyID0gMDsKKwlkbXgtPnRpbWVvdXQuZG14ID0gZG14OworCisJLypDUkMgbW9uaXRvciovCisJZG14LT5jcmNfY2hlY2tfY291bnQgPSAwOworCWRteC0+Y3JjX2NoZWNrX3RpbWUgPSAwOworCisJcmV0ID0gYW1sX2RteF9od19pbml0KGRteCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyb3IoImRlbXV4IGh3IGluaXQgZXJyb3IgJWQiLCByZXQpOworCQlkbXgtPmlkID0gLTE7CisJCWdvdG8gZXJyb3JfZG14X2h3X2luaXQ7CisJfQorCisJZHZiX25ldF9pbml0KCZhZHZiLT5kdmJfYWRhcHRlciwgJmRteC0+ZHZiX25ldCwgJmRteC0+ZGVtdXguZG14KTsKKworCXJldHVybiAwOworZXJyb3JfZG14X2h3X2luaXQ6CitlcnJvcl9jb25uZWN0X2ZlOgorCWRteC0+ZGVtdXguZG14LnJlbW92ZV9mcm9udGVuZCgmZG14LT5kZW11eC5kbXgsICZkbXgtPm1lbV9mZSk7CitlcnJvcl9hZGRfbWVtX2ZlOgorZXJyb3JfYWRkX2h3X2ZlOgorCWZvciAoaSA9IDA7IGkgPCBETVhfREVWX0NPVU5UOyBpKyspIHsKKwkJaWYgKGRteC0+aHdfZmVbaV0uc291cmNlKQorCQkJZG14LT5kZW11eC5kbXgucmVtb3ZlX2Zyb250ZW5kKCZkbXgtPmRlbXV4LmRteCwKKwkJCQkJCSAgICAgICAmZG14LT5od19mZVtpXSk7CisJfQorCWR2Yl9kbXhkZXZfcmVsZWFzZSgmZG14LT5kbXhkZXYpOworZXJyb3JfZG14ZGV2X2luaXQ6CisJZHZiX2RteF9yZWxlYXNlKCZkbXgtPmRlbXV4KTsKK2Vycm9yX2RteF9pbml0OgorCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBhbWxfZHZiICphbWxfZ2V0X2R2Yl9kZXZpY2Uodm9pZCkKK3sKKwlyZXR1cm4gJmFtbF9kdmJfZGV2aWNlOworfQorRVhQT1JUX1NZTUJPTChhbWxfZ2V0X2R2Yl9kZXZpY2UpOworCitzdHJ1Y3QgZHZiX2FkYXB0ZXIgKmFtbF9nZXRfZHZiX2FkYXB0ZXIodm9pZCkKK3sKKwlyZXR1cm4gJmFtbF9kdmJfZGV2aWNlLmR2Yl9hZGFwdGVyOworfQorRVhQT1JUX1NZTUJPTChhbWxfZ2V0X2R2Yl9hZGFwdGVyKTsKKworc3RhdGljIGludCBkdmJfZHNjX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IGVycjsKKworCWVyciA9IGR2Yl9nZW5lcmljX29wZW4oaW5vZGUsIGZpbGUpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRzY19jaGFubmVsX2FsbG9jKHN0cnVjdCBhbWxfZHNjICpkc2MsIGludCBpZCwgdW5zaWduZWQgaW50IHBpZCkKK3sKKwlzdHJ1Y3QgYW1sX2RzY19jaGFubmVsICpjaCA9ICZkc2MtPmNoYW5uZWxbaWRdOworCisJY2gtPnVzZWQgID0gMTsKKwljaC0+d29ya19tb2RlID0gLTE7CisJY2gtPmlkICAgID0gaWQ7CisJY2gtPnBpZCAgID0gcGlkOworCWNoLT5zZXQgPSAwOworCWNoLT5kc2MgICA9IGRzYzsKKwljaC0+bW9kZSA9IC0xOworCisJZHNjX3NldF9waWQoY2gsIGNoLT5waWQpOworfQorCitzdGF0aWMgdm9pZCBkc2NfY2hhbm5lbF9mcmVlKHN0cnVjdCBhbWxfZHNjX2NoYW5uZWwgKmNoKQoreworCWlmICghY2gtPnVzZWQpCisJCXJldHVybjsKKworCWNoLT51c2VkID0gMDsKKwlkc2Nfc2V0X3BpZChjaCwgMHgxZmZmKTsKKwlkc2NfcmVsZWFzZSgpOworCisJY2gtPnBpZCAgID0gMHgxZmZmOworCWNoLT5zZXQgPSAwOworCWNoLT53b3JrX21vZGUgPSAtMTsKKwljaC0+bW9kZSAgPSAtMTsKK30KKworc3RhdGljIHZvaWQgZHNjX3Jlc2V0KHN0cnVjdCBhbWxfZHNjICpkc2MpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRFNDX0NPVU5UOyBpKyspCisJCWRzY19jaGFubmVsX2ZyZWUoJmRzYy0+Y2hhbm5lbFtpXSk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2RzY19rZXlfd29ya19tb2RlKGVudW0gY2FfY3dfdHlwZSBjd190eXBlKQoreworCWludCB3b3JrX21vZGUgPSBEVkJDU0FfTU9ERTsKKworCXN3aXRjaCAoY3dfdHlwZSkgeworCWNhc2UgQ0FfQ1dfRFZCX0NTQV9FVkVOOgorCWNhc2UgQ0FfQ1dfRFZCX0NTQV9PREQ6CisJCXdvcmtfbW9kZSA9IERWQkNTQV9NT0RFOworCQlicmVhazsKKwljYXNlIENBX0NXX0FFU19FVkVOOgorCWNhc2UgQ0FfQ1dfQUVTX09ERDoKKwljYXNlIENBX0NXX0FFU19PRERfSVY6CisJY2FzZSBDQV9DV19BRVNfRVZFTl9JVjoKKwljYXNlIENBX0NXX0RFU19FVkVOOgorCWNhc2UgQ0FfQ1dfREVTX09ERDoKKwljYXNlIENBX0NXX1NNNF9FVkVOOgorCWNhc2UgQ0FfQ1dfU000X09ERDoKKwljYXNlIENBX0NXX1NNNF9PRERfSVY6CisJY2FzZSBDQV9DV19TTTRfRVZFTl9JVjoKKwkJd29ya19tb2RlID0gQ0lQTFVTX01PREU7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiB3b3JrX21vZGU7Cit9CisKKy8qIENoZWNrIGlmIHRoZXJlIGFyZSBjaGFubmVscyBydW4gaW4gcHJldmlvdXMgbW9kZShhZXMvZHZiY3NhKQorICogaW4gZHNjMC9jaXBsdXMKKyAqLworc3RhdGljIHZvaWQgZHNjX2NpcGx1c19zd2l0Y2hfY2hlY2soc3RydWN0IGFtbF9kc2NfY2hhbm5lbCAqY2gsCisJCQllbnVtIGNhX2N3X3R5cGUgY3dfdHlwZSkKK3sKKwlzdHJ1Y3QgYW1sX2RzYyAqZHNjID0gY2gtPmRzYzsKKwlpbnQgd29ya19tb2RlID0gMDsKKwlzdHJ1Y3QgYW1sX2RzY19jaGFubmVsICpwY2ggPSBOVUxMOworCWludCBpOworCisJd29ya19tb2RlID0gZ2V0X2RzY19rZXlfd29ya19tb2RlKGN3X3R5cGUpOworCWlmIChkc2MtPndvcmtfbW9kZSA9PSB3b3JrX21vZGUpCisJCXJldHVybjsKKworCWRzYy0+d29ya19tb2RlID0gd29ya19tb2RlOworCisJZm9yIChpID0gMDsgaSA8IERTQ19DT1VOVDsgaSsrKSB7CisJCXBjaCA9ICZkc2MtPmNoYW5uZWxbaV07CisJCWlmIChwY2gtPndvcmtfbW9kZSAhPSB3b3JrX21vZGUgJiYgcGNoLT53b3JrX21vZGUgIT0gLTEpIHsKKwkJCXByX2Vycm9yKCJEc2Mgd29yayBtb2RlIGNoYW5nZWQsIik7CisJCQlwcl9lcnJvcigiYnV0IHRoZXJlIGFyZSBzdGlsbCBzb21lIGNoYW5uZWxzIik7CisJCQlwcl9lcnJvcigicnVuIGluIGRpZmZlcmVudCBtb2RlXG4iKTsKKwkJCXByX2Vycm9yKCJtb2RfcHJlWyVkXSAtPiBtb2RbJWRdIGNoWyVkXVxuIiwKKwkJCQlwY2gtPndvcmtfbW9kZSwgd29ya19tb2RlLCBpKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBkc2Nfc2V0X2N3KHN0cnVjdCBhbWxfZHNjICpkc2MsIHN0cnVjdCBjYV9kZXNjcl9leCAqZCkKK3sKKwlzdHJ1Y3QgYW1sX2RzY19jaGFubmVsICpjaDsKKworCWlmIChkLT5pbmRleCA+PSBEU0NfQ09VTlQpCisJCXJldHVybiAtRUlOVkFMOworCisJY2ggPSAmZHNjLT5jaGFubmVsW2QtPmluZGV4XTsKKworCXN3aXRjaCAoZC0+dHlwZSkgeworCWNhc2UgQ0FfQ1dfRFZCX0NTQV9FVkVOOgorCWNhc2UgQ0FfQ1dfQUVTX0VWRU46CisJY2FzZSBDQV9DV19ERVNfRVZFTjoKKwljYXNlIENBX0NXX1NNNF9FVkVOOgorCQltZW1jcHkoY2gtPmV2ZW4sIGQtPmN3LCBEU0NfS0VZX1NJWkVfTUFYKTsKKwkJYnJlYWs7CisJY2FzZSBDQV9DV19EVkJfQ1NBX09ERDoKKwljYXNlIENBX0NXX0FFU19PREQ6CisJY2FzZSBDQV9DV19ERVNfT0REOgorCWNhc2UgQ0FfQ1dfU000X09ERDoKKwkJbWVtY3B5KGNoLT5vZGQsIGQtPmN3LCBEU0NfS0VZX1NJWkVfTUFYKTsKKwkJYnJlYWs7CisJY2FzZSBDQV9DV19BRVNfRVZFTl9JVjoKKwljYXNlIENBX0NXX1NNNF9FVkVOX0lWOgorCQltZW1jcHkoY2gtPmV2ZW5faXYsIGQtPmN3LCBEU0NfS0VZX1NJWkVfTUFYKTsKKwkJYnJlYWs7CisJY2FzZSBDQV9DV19BRVNfT0REX0lWOgorCWNhc2UgQ0FfQ1dfU000X09ERF9JVjoKKwkJbWVtY3B5KGNoLT5vZGRfaXYsIGQtPmN3LCBEU0NfS0VZX1NJWkVfTUFYKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJY2gtPnNldCB8PSAoMSA8PCBkLT50eXBlKSB8IChkLT5mbGFncyA8PCAyNCk7CisKKwlpZiAoZC0+bW9kZSA9PSBDQV9EU0NfSURTQSkgeworCQljaC0+bW9kZSA9IElEU0FfTU9ERTsKKwl9CisKKwkvKmRvIGtleSBzZXQqLworCWRzY19zZXRfa2V5KGNoLCBkLT5mbGFncywgZC0+dHlwZSwgZC0+Y3cpOworCWRzY19jaXBsdXNfc3dpdGNoX2NoZWNrKGNoLCBkLT50eXBlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR2Yl9kc2NfZG9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgIHZvaWQgKnBhcmcpCit7CisJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYW1sX2RzYyAqZHNjID0gZHZiZGV2LT5wcml2OworCXN0cnVjdCBhbWxfZHZiICpkdmIgPSBkc2MtPmR2YjsKKwlzdHJ1Y3QgYW1sX2RzY19jaGFubmVsICpjaDsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmR2Yi0+c2xvY2ssIGZsYWdzKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBDQV9SRVNFVDoKKwkJZHNjX3Jlc2V0KGRzYyk7CisJCWJyZWFrOworCWNhc2UgQ0FfR0VUX0NBUDogeworCQlzdHJ1Y3QgY2FfY2FwcyAqY2FwID0gcGFyZzsKKworCQljYXAtPnNsb3RfbnVtICAgPSAxOworCQljYXAtPnNsb3RfdHlwZSAgPSBDQV9ERVNDUjsKKwkJY2FwLT5kZXNjcl9udW0gID0gRFNDX0NPVU5UOworCQljYXAtPmRlc2NyX3R5cGUgPSAwOworCQlicmVhazsKKwl9CisJY2FzZSBDQV9HRVRfU0xPVF9JTkZPOiB7CisJCXN0cnVjdCBjYV9zbG90X2luZm8gKnNsb3QgPSBwYXJnOworCisJCXNsb3QtPm51bSAgID0gMTsKKwkJc2xvdC0+dHlwZSAgPSBDQV9ERVNDUjsKKwkJc2xvdC0+ZmxhZ3MgPSAwOworCQlicmVhazsKKwl9CisJY2FzZSBDQV9HRVRfREVTQ1JfSU5GTzogeworCQlzdHJ1Y3QgY2FfZGVzY3JfaW5mbyAqZGVzY3IgPSBwYXJnOworCisJCWRlc2NyLT5udW0gID0gRFNDX0NPVU5UOworCQlkZXNjci0+dHlwZSA9IDA7CisJCWJyZWFrOworCX0KKwljYXNlIENBX1NFVF9ERVNDUjogeworCQlzdHJ1Y3QgY2FfZGVzY3IgICAgKmQgPSBwYXJnOworCQlzdHJ1Y3QgY2FfZGVzY3JfZXggIGRleDsKKworCQlkZXguaW5kZXggPSBkLT5pbmRleDsKKwkJZGV4LnR5cGUgID0gZC0+cGFyaXR5ID8gQ0FfQ1dfRFZCX0NTQV9PREQgOiBDQV9DV19EVkJfQ1NBX0VWRU47CisJCWRleC5tb2RlID0gLTE7CisJCWRleC5mbGFncyA9IDA7CisJCW1lbWNweShkZXguY3csIGQtPmN3LCBzaXplb2YoZC0+Y3cpKTsKKworCQlyZXQgPSBkc2Nfc2V0X2N3KGRzYywgJmRleCk7CisJCWJyZWFrOworCX0KKwljYXNlIENBX1NFVF9QSUQ6IHsKKwkJc3RydWN0IGNhX3BpZCAqcGkgPSBwYXJnOworCQlpbnQgaTsKKworCQlpZiAocGktPmluZGV4ID09IC0xKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgRFNDX0NPVU5UOyBpKyspIHsKKwkJCQljaCA9ICZkc2MtPmNoYW5uZWxbaV07CisKKwkJCQlpZiAoY2gtPnVzZWQgJiYgKGNoLT5waWQgPT0gcGktPnBpZCkpIHsKKwkJCQkJZHNjX2NoYW5uZWxfZnJlZShjaCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmICgocGktPmluZGV4ID49IDApICYmIChwaS0+aW5kZXggPCBEU0NfQ09VTlQpKSB7CisJCQljaCA9ICZkc2MtPmNoYW5uZWxbcGktPmluZGV4XTsKKworCQkJaWYgKHBpLT5waWQgPCAweDFmZmYpIHsKKwkJCQlpZiAoIWNoLT51c2VkKSB7CisJCQkJCWRzY19jaGFubmVsX2FsbG9jKGRzYywKKwkJCQkJcGktPmluZGV4LCBwaS0+cGlkKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChjaC0+dXNlZCkKKwkJCQkJZHNjX2NoYW5uZWxfZnJlZShjaCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIENBX1NFVF9ERVNDUl9FWDogeworCQlzdHJ1Y3QgY2FfZGVzY3JfZXggKmQgPSBwYXJnOworCisJCXJldCA9IGRzY19zZXRfY3coZHNjLCBkKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR2Yi0+c2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHZiX2RzY191c2VyY29weShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywKKwkJICAgICBpbnQgKCpmdW5jKShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpKQoreworCWNoYXIgICAgc2J1ZlsxMjhdOworCXZvaWQgICAgKm1idWYgPSBOVUxMOworCXZvaWQgICAgKnBhcmcgPSBOVUxMOworCWludCAgICAgZXJyICA9IC1FSU5WQUw7CisKKwkvKiAgQ29weSBhcmd1bWVudHMgaW50byB0ZW1wIGtlcm5lbCBidWZmZXIgICovCisJc3dpdGNoIChfSU9DX0RJUihjbWQpKSB7CisJY2FzZSBfSU9DX05PTkU6CisJCS8qCisJCSAqIEZvciB0aGlzIGNvbW1hbmQsIHRoZSBwb2ludGVyIGlzIGFjdHVhbGx5IGFuIGludGVnZXIKKwkJICogYXJndW1lbnQuCisJCSAqLworCQlwYXJnID0gKHZvaWQgKikgYXJnOworCQlicmVhazsKKwljYXNlIF9JT0NfUkVBRDogLyogc29tZSB2NGwgaW9jdGxzIGFyZSBtYXJrZWQgd3JvbmcgLi4uICovCisJY2FzZSBfSU9DX1dSSVRFOgorCWNhc2UgKF9JT0NfV1JJVEUgfCBfSU9DX1JFQUQpOgorCQlpZiAoX0lPQ19TSVpFKGNtZCkgPD0gc2l6ZW9mKHNidWYpKSB7CisJCQlwYXJnID0gc2J1ZjsKKwkJfSBlbHNlIHsKKwkJCS8qIHRvbyBiaWcgdG8gYWxsb2NhdGUgZnJvbSBzdGFjayAqLworCQkJbWJ1ZiA9IGttYWxsb2MoX0lPQ19TSVpFKGNtZCksIEdGUF9LRVJORUwpOworCQkJaWYgKG1idWYgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCXBhcmcgPSBtYnVmOworCQl9CisKKwkJZXJyID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHBhcmcsICh2b2lkIF9fdXNlciAqKWFyZywgX0lPQ19TSVpFKGNtZCkpKQorCQkJZ290byBvdXQ7CisJCWJyZWFrOworCX0KKworCS8qIGNhbGwgZHJpdmVyICovCisJZXJyID0gZnVuYyhmaWxlLCBjbWQsIHBhcmcpOworCWlmIChlcnIgPT0gLUVOT0lPQ1RMQ01EKQorCQllcnIgPSAtRU5PVFRZOworCisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJLyogIENvcHkgcmVzdWx0cyBpbnRvIHVzZXIgYnVmZmVyICAqLworCXN3aXRjaCAoX0lPQ19ESVIoY21kKSkgeworCWNhc2UgX0lPQ19SRUFEOgorCWNhc2UgKF9JT0NfV1JJVEUgfCBfSU9DX1JFQUQpOgorCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgcGFyZywgX0lPQ19TSVpFKGNtZCkpKQorCQkJZXJyID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJfQorCitvdXQ6CisJa2ZyZWUobWJ1Zik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGxvbmcgZHZiX2RzY19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIGR2Yl9kc2NfdXNlcmNvcHkoZmlsZSwgY21kLCBhcmcsIGR2Yl9kc2NfZG9faW9jdGwpOworfQorCitzdGF0aWMgaW50IGR2Yl9kc2NfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhbWxfZHNjICpkc2MgPSBkdmJkZXYtPnByaXY7CisJc3RydWN0IGFtbF9kdmIgKmR2YiA9IGRzYy0+ZHZiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHZiLT5zbG9jaywgZmxhZ3MpOworCisJZHNjX3Jlc2V0KGRzYyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdmItPnNsb2NrLCBmbGFncyk7CisKKwlkdmJfZ2VuZXJpY19yZWxlYXNlKGlub2RlLCBmaWxlKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RhdGljIGxvbmcgZHZiX2RzY19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZ3MpCit7CisJdW5zaWduZWQgbG9uZyByZXQ7CisKKwlhcmdzID0gKHVuc2lnbmVkIGxvbmcpY29tcGF0X3B0cihhcmdzKTsKKwlyZXQgPSBkdmJfZHNjX2lvY3RsKGZpbHAsIGNtZCwgYXJncyk7CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGR2Yl9kc2NfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkucmVhZCA9IE5VTEwsCisJLndyaXRlID0gTlVMTCwKKwkudW5sb2NrZWRfaW9jdGwgPSBkdmJfZHNjX2lvY3RsLAorCS5vcGVuID0gZHZiX2RzY19vcGVuLAorCS5yZWxlYXNlID0gZHZiX2RzY19yZWxlYXNlLAorCS5wb2xsID0gTlVMTCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bAk9IGR2Yl9kc2NfY29tcGF0X2lvY3RsLAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IGR2Yl9kZXZpY2UgZHZiZGV2X2RzYyA9IHsKKwkucHJpdiA9IE5VTEwsCisJLnVzZXJzID0gMSwKKwkucmVhZGVycyA9IDEsCisJLndyaXRlcnMgPSAxLAorCS5mb3BzID0gJmR2Yl9kc2NfZm9wcywKK307CisKK3N0YXRpYyBpbnQgYW1sX2R2Yl9hc3luY2ZpZm9faW5pdChzdHJ1Y3QgYW1sX2R2YiAqYWR2YiwKKwkJCQkgIHN0cnVjdCBhbWxfYXN5bmNmaWZvICphc3luY2ZpZm8sIGludCBpZCkKK3sKKwljaGFyIGJ1ZlszMl07CisJaW50IHJldCA9IDA7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlX2RteCA9IE5VTEw7CisKKwlpZiAoaWQgPT0gMCkKKwkJYXN5bmNmaWZvLT5hc3luY2ZpZm9faXJxID0gSU5UX0FTWU5DX0ZJRk9fRkxVU0g7CisJZWxzZSBpZihpZCA9PSAyKQorCQlhc3luY2ZpZm8tPmFzeW5jZmlmb19pcnEgPSBJTlRfQVNZTkNfRklGTzNfRkxVU0g7CisJZWxzZQorCQlhc3luY2ZpZm8tPmFzeW5jZmlmb19pcnEgPSBJTlRfQVNZTkNfRklGTzJfRkxVU0g7CisKKwltZW1zZXQoYnVmLCAwLCAzMik7CisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgImRteCIpOworCW5vZGVfZG14ID0gb2ZfcGFyc2VfcGhhbmRsZShhZHZiLT5wZGV2LT5kZXYub2Zfbm9kZSwgYnVmLCAwKTsKKwlpZiAobm9kZV9kbXgpIHsKKwkJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiZHZyJWRfaXJxIiwgaWQpOworCQlyZXQgPSBvZl9pcnFfZ2V0X2J5bmFtZShub2RlX2RteCwgYnVmKTsKKwkJaWYgKHJldCA+IDApCisJCQlhc3luY2ZpZm8tPmFzeW5jZmlmb19pcnEgPSByZXQ7CisJCXByaW50aygiZ2V0IGFzeW5jJWRfaXJxOiVkXG4iLGlkLGFzeW5jZmlmby0+YXN5bmNmaWZvX2lycSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCJnZXQgZGVmYXVsdCBhc3luYyVkX2lycTolZFxuIixpZCxhc3luY2ZpZm8tPmFzeW5jZmlmb19pcnEpOworCX0KKwlhc3luY2ZpZm8tPmR2YiA9IGFkdmI7CisJYXN5bmNmaWZvLT5pZCA9IGlkOworCWFzeW5jZmlmby0+aW5pdCA9IDA7CisJYXN5bmNmaWZvLT5mbHVzaF9zaXplID0gMjU2ICogMTAyNDsKKwlhc3luY2ZpZm8tPnNlY3VyZV9lbmFibGUgPSAwOworCWFzeW5jZmlmby0+YmxrLmFkZHIgPSAwOworCWFzeW5jZmlmby0+YmxrLmxlbiA9IDA7CisJYXN5bmNmaWZvLT5zdG9yZWRfcGFnZXMgPSAwOworCisJcmV0dXJuIGFtbF9hc3luY2ZpZm9faHdfaW5pdChhc3luY2ZpZm8pOworfQorc3RhdGljIHZvaWQgYW1sX2R2Yl9hc3luY2ZpZm9fcmVsZWFzZShzdHJ1Y3QgYW1sX2R2YiAqYWR2YiwKKwkJCQkgICAgICBzdHJ1Y3QgYW1sX2FzeW5jZmlmbyAqYXN5bmNmaWZvKQoreworCWFtbF9hc3luY2ZpZm9faHdfZGVpbml0KGFzeW5jZmlmbyk7Cit9CisKK3N0YXRpYyBpbnQgYW1sX2R2Yl9kc2NfaW5pdChzdHJ1Y3QgYW1sX2R2YiAqYWR2YiwKKwkJCQkgIHN0cnVjdCBhbWxfZHNjICpkc2MsIGludCBpZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBEU0NfQ09VTlQ7IGkrKykgeworCQlkc2MtPmNoYW5uZWxbaV0uaWQgICAgPSBpOworCQlkc2MtPmNoYW5uZWxbaV0udXNlZCAgPSAwOworCQlkc2MtPmNoYW5uZWxbaV0uc2V0ID0gMDsKKwkJZHNjLT5jaGFubmVsW2ldLnBpZCAgID0gMHgxZmZmOworCQlkc2MtPmNoYW5uZWxbaV0uZHNjICAgPSBkc2M7CisJfQorCWRzYy0+ZHZiID0gYWR2YjsKKwlkc2MtPmlkID0gaWQ7CisJZHNjLT5zb3VyY2UgPSAtMTsKKwlkc2MtPmRzdCA9IC0xOworCisJLypSZWdpc3RlciBkZXNjcmFtYmxlciBkZXZpY2UgKi8KKwlyZXR1cm4gZHZiX3JlZ2lzdGVyX2RldmljZSgmYWR2Yi0+ZHZiX2FkYXB0ZXIsICZkc2MtPmRldiwKKwkJCQkgICZkdmJkZXZfZHNjLCBkc2MsIERWQl9ERVZJQ0VfQ0EsIDApOworfQorc3RhdGljIHZvaWQgYW1sX2R2Yl9kc2NfcmVsZWFzZShzdHJ1Y3QgYW1sX2R2YiAqYWR2YiwKKwkJCQkgICAgICBzdHJ1Y3QgYW1sX2RzYyAqZHNjKQoreworCWlmIChkc2MtPmRldikKKwkJZHZiX3VucmVnaXN0ZXJfZGV2aWNlKGRzYy0+ZGV2KTsKKwlkc2MtPmRldiA9IE5VTEw7Cit9CisKKworLypTaG93IHRoZSBTVEIgaW5wdXQgc291cmNlKi8KK3N0YXRpYyBzc2l6ZV90IHNvdXJjZV9zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCQkgICAgICAgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBhbWxfZHZiICpkdmIgPSAmYW1sX2R2Yl9kZXZpY2U7CisJc3NpemVfdCByZXQgPSAwOworCWNoYXIgKnNyYzsKKworCXN3aXRjaCAoZHZiLT5zdGJfc291cmNlKSB7CisJY2FzZSBBTV9UU19TUkNfVFMwOgorCWNhc2UgQU1fVFNfU1JDX1NfVFMwOgorCQlzcmMgPSAidHMwIjsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfVFMxOgorCWNhc2UgQU1fVFNfU1JDX1NfVFMxOgorCQlzcmMgPSAidHMxIjsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfVFMyOgorCWNhc2UgQU1fVFNfU1JDX1NfVFMyOgorCQlzcmMgPSAidHMyIjsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfVFMzOgorCQlzcmMgPSAidHMzIjsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfSElVOgorCQlzcmMgPSAiaGl1IjsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfSElVMToKKwkJc3JjID0gImhpdTEiOworCQlicmVhazsKKwljYXNlIEFNX1RTX1NSQ19ETVgwOgorCQlzcmMgPSAiZG14MCI7CisJCWJyZWFrOworCWNhc2UgQU1fVFNfU1JDX0RNWDE6CisJCXNyYyA9ICJkbXgxIjsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfRE1YMjoKKwkJc3JjID0gImRteDIiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzcmMgPSAiZGlzYWJsZSI7CisJCWJyZWFrOworCX0KKworCXJldCA9IHNwcmludGYoYnVmLCAiJXNcbiIsIHNyYyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgY2xlYXJfYXZfc3RvcmUoc3RydWN0IGNsYXNzICpjbGFzcywKKwkJCQlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCisJCQkJc2l6ZV90IHNpemUpCit7CisJaWYgKCFzdHJuY21wKCIxIiwgYnVmLCAxKSkgeworCQlhbWxfdHNkZW11eF9zZXRfdmlkKDB4MWZmZik7CisJCWFtbF90c2RlbXV4X3NldF9haWQoMHgxZmZmKTsKKwkJYW1sX3RzZGVtdXhfc2V0X3NpZCgweDFmZmYpOworCQlhbWxfdHNkZW11eF9zZXRfcGNyaWQoMHgxZmZmKTsKKwl9CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGludCBzdGJfY2hlY2tfc291cmNlKGNvbnN0IGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYW1sX2R2YiAqZHZiID0gJmFtbF9kdmJfZGV2aWNlOworCWludCByZXQgPSAwOworCWNoYXIgKnNyYzsKKworCXN3aXRjaCAoZHZiLT5zdGJfc291cmNlKSB7CisJY2FzZSBBTV9UU19TUkNfVFMwOgorCWNhc2UgQU1fVFNfU1JDX1NfVFMwOgorCQlzcmMgPSAidHMwIjsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfVFMxOgorCWNhc2UgQU1fVFNfU1JDX1NfVFMxOgorCQlzcmMgPSAidHMxIjsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfVFMyOgorCWNhc2UgQU1fVFNfU1JDX1NfVFMyOgorCQlzcmMgPSAidHMyIjsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfVFMzOgorCQlzcmMgPSAidHMzIjsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfSElVOgorCQlzcmMgPSAiaGl1IjsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfSElVMToKKwkJc3JjID0gImhpdTEiOworCQlicmVhazsKKwljYXNlIEFNX1RTX1NSQ19ETVgwOgorCQlzcmMgPSAiZG14MCI7CisJCWJyZWFrOworCWNhc2UgQU1fVFNfU1JDX0RNWDE6CisJCXNyYyA9ICJkbXgxIjsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfRE1YMjoKKwkJc3JjID0gImRteDIiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzcmMgPSAiZGlzYWJsZSI7CisJCWJyZWFrOworCX0KKwlwcl9lcnJvcigic3RiX2NoZWNrX3NvdXJjZSBzZXQgYnVmOiVzLCBzcmM6JXNcbiIsIGJ1Ziwgc3JjKTsKKwlyZXQgPSBzdHJjbXAoYnVmLHNyYyk7CisJcmV0dXJuIHJldDsKK30KKworLypTZXQgdGhlIFNUQiBpbnB1dCBzb3VyY2UqLworc3RhdGljIHNzaXplX3Qgc291cmNlX3N0b3JlKHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCQkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAorCQkJCXNpemVfdCBzaXplKQoreworCWRteF9zb3VyY2VfdCBzcmMgPSAtMTsKKwlpZiAoc3RiX2NoZWNrX3NvdXJjZShidWYpID09IDApIHsKKwkJcHJfZXJyb3IoInN0Yl9zdG9yZV9zb3VyY2Ugc2FtZSBzb3VyY2UgXG4iKTsKKwkJcmV0dXJuIHNpemU7CisJfQorCWlmICghc3RybmNtcCgidHMwIiwgYnVmLCAzKSkKKwkJc3JjID0gRE1YX1NPVVJDRV9GUk9OVDA7CisJZWxzZSBpZiAoIXN0cm5jbXAoInRzMSIsIGJ1ZiwgMykpCisJCXNyYyA9IERNWF9TT1VSQ0VfRlJPTlQxOworCWVsc2UgaWYgKCFzdHJuY21wKCJ0czIiLCBidWYsIDMpKQorCQlzcmMgPSBETVhfU09VUkNFX0ZST05UMjsKKwllbHNlIGlmICghc3RybmNtcCgidHMzIiwgYnVmLCAzKSkKKwkJc3JjID0gRE1YX1NPVVJDRV9GUk9OVDM7CisJZWxzZSBpZiAoIXN0cm5jbXAoImhpdTEiLCBidWYsIDQpKQorCQlzcmMgPSBETVhfU09VUkNFX0RWUjE7CisJZWxzZSBpZiAoIXN0cm5jbXAoImhpdSIsIGJ1ZiwgMykpCisJCXNyYyA9IERNWF9TT1VSQ0VfRFZSMDsKKwllbHNlIGlmICghc3RybmNtcCgiZG14MCIsIGJ1ZiwgNCkpCisJCXNyYyA9IERNWF9TT1VSQ0VfRlJPTlQwICsgMTAwOworCWVsc2UgaWYgKCFzdHJuY21wKCJkbXgxIiwgYnVmLCA0KSkKKwkJc3JjID0gRE1YX1NPVVJDRV9GUk9OVDEgKyAxMDA7CisJZWxzZSBpZiAoIXN0cm5jbXAoImRteDIiLCBidWYsIDQpKQorCQlzcmMgPSBETVhfU09VUkNFX0ZST05UMiArIDEwMDsKKwlpZiAoc3JjICE9IC0xKQorCQlhbWxfc3RiX2h3X3NldF9zb3VyY2UoJmFtbF9kdmJfZGV2aWNlLCBzcmMpOworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBkZW11eF9yZXNldF9hbGxfZmxhZ19zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCQkgICAgICAgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXNzaXplX3QgcmV0ID0gMDsKKwljaGFyICpzcmM7CisKKwlpZiAoZG14X3Jlc2V0X2FsbF9mbGFnKQorCQlzcmMgPSAiMSI7CisJZWxzZQorCQlzcmMgPSAiMCI7CisJcmV0ID0gc3ByaW50ZihidWYsICIlc1xuIiwgc3JjKTsKKwlyZXR1cm4gcmV0OworfQorc3RhdGljIHNzaXplX3QgZGVtdXhfcmVzZXRfYWxsX2ZsYWdfc3RvcmUoc3RydWN0IGNsYXNzICpjbGFzcywKKwkJCQlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCisJCQkJc2l6ZV90IHNpemUpCit7CisJaWYgKCFzdHJuY21wKCIwIiwgYnVmLCAxKSkKKwkgICAgZG14X3Jlc2V0X2FsbF9mbGFnID0gMDsKKwllbHNlIGlmICghc3RybmNtcCgiMSIsIGJ1ZiwgMSkpCisJICAgIGRteF9yZXNldF9hbGxfZmxhZyA9IDE7CisKKwlyZXR1cm4gc2l6ZTsKK30KKyNkZWZpbmUgQ0FTRV9QUkVGSVgKKworLypTaG93IHRoZSBkZXNjcmFtYmxlcidzIGlucHV0IHNvdXJjZSovCisjZGVmaW5lIERTQ19TT1VSQ0VfRlVOQ19ERUNMKGkpICBcCitzdGF0aWMgc3NpemVfdCBkc2MjI2kjI19zb3VyY2Vfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLCAgXAorCQkJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZilcCit7XAorCXN0cnVjdCBhbWxfZHZiICpkdmIgPSAmYW1sX2R2Yl9kZXZpY2U7XAorCXN0cnVjdCBhbWxfZHNjICpkc2MgPSAmZHZiLT5kc2NbaV07XAorCXNzaXplX3QgcmV0ID0gMDtcCisJY2hhciAqc3JjLCAqZHN0O1wKKwlzd2l0Y2ggKGRzYy0+c291cmNlKSB7XAorCUNBU0VfUFJFRklYIGNhc2UgQU1fVFNfU1JDX0RNWDA6XAorCQlzcmMgPSAiZG14MCI7XAorCWJyZWFrO1wKKwlDQVNFX1BSRUZJWCBjYXNlIEFNX1RTX1NSQ19ETVgxOlwKKwkJc3JjID0gImRteDEiO1wKKwlicmVhaztcCisJQ0FTRV9QUkVGSVggY2FzZSBBTV9UU19TUkNfRE1YMjpcCisJCXNyYyA9ICJkbXgyIjtcCisJYnJlYWs7XAorCUNBU0VfUFJFRklYIGRlZmF1bHQgOlwKKwkJc3JjID0gImJ5cGFzcyI7XAorCWJyZWFrO1wKKwl9IFwKKwlzd2l0Y2ggKGRzYy0+ZHN0KSB7XAorCUNBU0VfUFJFRklYIGNhc2UgQU1fVFNfU1JDX0RNWDA6XAorCQlkc3QgPSAiZG14MCI7XAorCWJyZWFrO1wKKwlDQVNFX1BSRUZJWCBjYXNlIEFNX1RTX1NSQ19ETVgxOlwKKwkJZHN0ID0gImRteDEiO1wKKwlicmVhaztcCisJQ0FTRV9QUkVGSVggY2FzZSBBTV9UU19TUkNfRE1YMjpcCisJCWRzdCA9ICJkbXgyIjtcCisJYnJlYWs7XAorCUNBU0VfUFJFRklYIGRlZmF1bHQgOlwKKwkJZHN0ID0gImJ5cGFzcyI7XAorCWJyZWFrO1wKKwl9IFwKKwlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVzLSVzXG4iLCBzcmMsIGRzdCk7XAorCXJldHVybiByZXQ7XAorfSBcCitzdGF0aWMgc3NpemVfdCBkc2MjI2kjI19zb3VyY2Vfc3RvcmUoc3RydWN0IGNsYXNzICpjbGFzcywgIFwKKwkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSlcCit7XAorCWRteF9zb3VyY2VfdCBzcmMgPSAtMSwgZHN0ID0gLTE7XAorCVwKKwlpZiAoIXN0cm5jbXAoImRteDAiLCBidWYsIDQpKSB7XAorCQlzcmMgPSBETVhfU09VUkNFX0ZST05UMCArIDEwMDtcCisJfSBlbHNlIGlmICghc3RybmNtcCgiZG14MSIsIGJ1ZiwgNCkpIHtcCisJCXNyYyA9IERNWF9TT1VSQ0VfRlJPTlQxICsgMTAwO1wKKwl9IGVsc2UgaWYgKCFzdHJuY21wKCJkbXgyIiwgYnVmLCA0KSkge1wKKwkJc3JjID0gRE1YX1NPVVJDRV9GUk9OVDIgKyAxMDA7XAorCX0gXAorCWlmIChidWZbNF0gPT0gJy0nKSB7XAorCQlpZiAoIXN0cm5jbXAoImRteDAiLCBidWYrNSwgNCkpIHtcCisJCQlkc3QgPSBETVhfU09VUkNFX0ZST05UMCArIDEwMDtcCisJCX0gZWxzZSBpZiAoIXN0cm5jbXAoImRteDEiLCBidWYrNSwgNCkpIHtcCisJCQlkc3QgPSBETVhfU09VUkNFX0ZST05UMSArIDEwMDtcCisJCX0gZWxzZSBpZiAoIXN0cm5jbXAoImRteDIiLCBidWYrNSwgNCkpIHtcCisJCQlkc3QgPSBETVhfU09VUkNFX0ZST05UMiArIDEwMDtcCisJCX0gXAorCX0gXAorCWVsc2UgXAorCQlkc3QgPSBzcmM7IFwKKwlhbWxfZHNjX2h3X3NldF9zb3VyY2UoJmFtbF9kdmJfZGV2aWNlLmRzY1tpXSwgc3JjLCBkc3QpO1wKKwlyZXR1cm4gc2l6ZTtcCit9CisKKy8qU2hvdyBmcmVlIGRlc2NyYW1ibGVycyBjb3VudCovCisjZGVmaW5lIERTQ19GUkVFX0ZVTkNfREVDTChpKSAgXAorc3RhdGljIHNzaXplX3QgZHNjIyNpIyNfZnJlZV9kc2NzX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywgXAorCQkJCSAgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgYW1sX2R2YiAqZHZiID0gJmFtbF9kdmJfZGV2aWNlOyBcCisJaW50IGZpZCwgY291bnQ7IFwKKwlzc2l6ZV90IHJldCA9IDA7IFwKKwl1bnNpZ25lZCBsb25nIGZsYWdzO1wKK1wKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHZiLT5zbG9jaywgZmxhZ3MpOyBcCisJY291bnQgPSAwOyBcCisJZm9yIChmaWQgPSAwOyBmaWQgPCBEU0NfQ09VTlQ7IGZpZCsrKSB7IFwKKwkJaWYgKCFkdmItPmRzY1tpXS5jaGFubmVsW2ZpZF0udXNlZCkgXAorCQkJY291bnQrKzsgXAorCX0gXAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR2Yi0+c2xvY2ssIGZsYWdzKTsgXAorXAorCXJldCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIGNvdW50KTsgXAorCXJldHVybiByZXQ7IFwKK30KKworI2lmIERTQ19ERVZfQ09VTlQgPiAwCisJRFNDX1NPVVJDRV9GVU5DX0RFQ0woMCkKKwlEU0NfRlJFRV9GVU5DX0RFQ0woMCkKKyNlbmRpZgorI2lmIERTQ19ERVZfQ09VTlQgPiAxCisJRFNDX1NPVVJDRV9GVU5DX0RFQ0woMSkKKwlEU0NfRlJFRV9GVU5DX0RFQ0woMSkKKyNlbmRpZgorCisvKlNob3cgdGhlIFRTIG91dHB1dCBzb3VyY2UqLworc3RhdGljIHNzaXplX3QgdHNvX3NvdXJjZV9zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCQkgICAgICAgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBhbWxfZHZiICpkdmIgPSAmYW1sX2R2Yl9kZXZpY2U7CisJc3NpemVfdCByZXQgPSAwOworCWNoYXIgKnNyYzsKKworCXN3aXRjaCAoZHZiLT50c29fc291cmNlKSB7CisJY2FzZSBBTV9UU19TUkNfVFMwOgorCWNhc2UgQU1fVFNfU1JDX1NfVFMwOgorCQlzcmMgPSAidHMwIjsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfVFMxOgorCWNhc2UgQU1fVFNfU1JDX1NfVFMxOgorCQlzcmMgPSAidHMxIjsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfVFMyOgorCWNhc2UgQU1fVFNfU1JDX1NfVFMyOgorCQlzcmMgPSAidHMyIjsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfVFMzOgorCQlzcmMgPSAidHMzIjsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfSElVOgorCQlzcmMgPSAiaGl1IjsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfRE1YMDoKKwkJc3JjID0gImRteDAiOworCQlicmVhazsKKwljYXNlIEFNX1RTX1NSQ19ETVgxOgorCQlzcmMgPSAiZG14MSI7CisJCWJyZWFrOworCWNhc2UgQU1fVFNfU1JDX0RNWDI6CisJCXNyYyA9ICJkbXgyIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3JjID0gImRlZmF1bHQiOworCQlicmVhazsKKwl9CisKKwlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBzcmMpOworCXJldHVybiByZXQ7Cit9CisKKy8qU2V0IHRoZSBUUyBvdXRwdXQgc291cmNlKi8KK3N0YXRpYyBzc2l6ZV90IHRzb19zb3VyY2Vfc3RvcmUoc3RydWN0IGNsYXNzICpjbGFzcywKKwkJCQlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCisJCQkJc2l6ZV90IHNpemUpCit7CisJZG14X3NvdXJjZV90IHNyYyA9IC0xOworCisJaWYgKCFzdHJuY21wKCJ0czAiLCBidWYsIDMpKQorCQlzcmMgPSBETVhfU09VUkNFX0ZST05UMDsKKwllbHNlIGlmICghc3RybmNtcCgidHMxIiwgYnVmLCAzKSkKKwkJc3JjID0gRE1YX1NPVVJDRV9GUk9OVDE7CisJZWxzZSBpZiAoIXN0cm5jbXAoInRzMiIsIGJ1ZiwgMykpCisJCXNyYyA9IERNWF9TT1VSQ0VfRlJPTlQyOworCWVsc2UgaWYgKCFzdHJuY21wKCJ0czMiLCBidWYsIDMpKQorCQlzcmMgPSBETVhfU09VUkNFX0ZST05UMzsKKwllbHNlIGlmICghc3RybmNtcCgiaGl1IiwgYnVmLCAzKSkKKwkJc3JjID0gRE1YX1NPVVJDRV9EVlIwOworCWVsc2UgaWYgKCFzdHJuY21wKCJkbXgwIiwgYnVmLCA0KSkKKwkJc3JjID0gRE1YX1NPVVJDRV9GUk9OVDAgKyAxMDA7CisJZWxzZSBpZiAoIXN0cm5jbXAoImRteDEiLCBidWYsIDQpKQorCQlzcmMgPSBETVhfU09VUkNFX0ZST05UMSArIDEwMDsKKwllbHNlIGlmICghc3RybmNtcCgiZG14MiIsIGJ1ZiwgNCkpCisJCXNyYyA9IERNWF9TT1VSQ0VfRlJPTlQyICsgMTAwOworCisJYW1sX3Rzb19od19zZXRfc291cmNlKCZhbWxfZHZiX2RldmljZSwgc3JjKTsKKworCXJldHVybiBzaXplOworfQorCisvKlNob3cgUENSKi8KKyNkZWZpbmUgREVNVVhfUENSX0ZVTkNfREVDTChpKSAgXAorc3RhdGljIHNzaXplX3QgZGVtdXgjI2kjI19wY3Jfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLCAgXAorCQkJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZilcCit7XAorCWludCBmID0gMDtcCisJaWYgKGkgPT0gMClcCisJCWYgPSBSRUFEX01QRUdfUkVHKFBDUl9ERU1VWCk7XAorCWVsc2UgaWYgKGkgPT0gMSlcCisJCWYgPSBSRUFEX01QRUdfUkVHKFBDUl9ERU1VWF8yKTtcCisJZWxzZSBpZiAoaSA9PSAyKVwKKwkJZiA9IFJFQURfTVBFR19SRUcoUENSX0RFTVVYXzMpO1wKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlMDh4XG4iLCBmKTtcCit9CisKK3N0YXRpYyBpbnQgZG14X2NoZWNrX3NvdXJjZShpbnQgaSwgY29uc3QgY2hhciAqYnVmKQoreworCXN0cnVjdCBhbWxfZHZiICpkdmIgPSAmYW1sX2R2Yl9kZXZpY2U7CisJc3RydWN0IGFtbF9kbXggKmRteCA9ICZkdmItPmRteFtpXTsKKwlzc2l6ZV90IHJldCA9IDA7CisJY2hhciAqc3JjOworCXN3aXRjaCAoZG14LT5zb3VyY2UpIHsKKwkgY2FzZSBBTV9UU19TUkNfVFMwOgorCSBjYXNlIEFNX1RTX1NSQ19TX1RTMDoKKwkJc3JjID0gInRzMCI7CisJYnJlYWs7CisJIGNhc2UgQU1fVFNfU1JDX1RTMToKKwkgY2FzZSBBTV9UU19TUkNfU19UUzE6CisJCXNyYyA9ICJ0czEiOworCWJyZWFrOworCSBjYXNlIEFNX1RTX1NSQ19UUzI6CisJIGNhc2UgQU1fVFNfU1JDX1NfVFMyOgorCQlzcmMgPSAidHMyIjsKKwlicmVhazsKKwkgY2FzZSBBTV9UU19TUkNfVFMzOgorCQlzcmMgPSAidHMzIjsKKwlicmVhazsKKwkgY2FzZSBBTV9UU19TUkNfRE1YMDoKKwkJc3JjID0gImRteDAiOworCWJyZWFrOworCSBjYXNlIEFNX1RTX1NSQ19ETVgxOgorCQlzcmMgPSAiZG14MSI7CisJYnJlYWs7CisJIGNhc2UgQU1fVFNfU1JDX0RNWDI6CisJCXNyYyA9ICJkbXgyIjsKKwlicmVhazsKKwkgY2FzZSBBTV9UU19TUkNfSElVOgorCQlzcmMgPSAiaGl1IjsKKwlicmVhazsKKwkgY2FzZSBBTV9UU19TUkNfSElVMToKKwkJc3JjID0gImhpdTEiOworCWJyZWFrOworCSBkZWZhdWx0IDoKKwkJc3JjID0gIiI7CisJYnJlYWs7CisJfQorCXByX2Vycm9yKCJkbXhfY2hlY2tfc291cmNlOnNldFslc11zcmNbJXNdZG14WyVkXWRteC0+c291cmNlOiVkXG4iLCBidWYsIHNyYywgaSwgZG14LT5zb3VyY2UpOworCXJldCA9IHN0cmNtcChidWYsIHNyYyk7CisJcmV0dXJuIHJldDsKK30KKworCisvKlNob3cgdGhlIFNUQiBpbnB1dCBzb3VyY2UqLworI2RlZmluZSBERU1VWF9TT1VSQ0VfRlVOQ19ERUNMKGkpICBcCitzdGF0aWMgc3NpemVfdCBkZW11eCMjaSMjX3NvdXJjZV9zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsICBcCisJCQkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKVwKK3tcCisJc3RydWN0IGFtbF9kdmIgKmR2YiA9ICZhbWxfZHZiX2RldmljZTtcCisJc3RydWN0IGFtbF9kbXggKmRteCA9ICZkdmItPmRteFtpXTtcCisJc3NpemVfdCByZXQgPSAwO1wKKwljaGFyICpzcmM7XAorCXN3aXRjaCAoZG14LT5zb3VyY2UpIHtcCisJQ0FTRV9QUkVGSVggY2FzZSBBTV9UU19TUkNfVFMwOlwKKwlDQVNFX1BSRUZJWCBjYXNlIEFNX1RTX1NSQ19TX1RTMDpcCisJCXNyYyA9ICJ0czAiO1wKKwlicmVhaztcCisJQ0FTRV9QUkVGSVggY2FzZSBBTV9UU19TUkNfVFMxOlwKKwlDQVNFX1BSRUZJWCBjYXNlIEFNX1RTX1NSQ19TX1RTMTpcCisJCXNyYyA9ICJ0czEiO1wKKwlicmVhaztcCisJQ0FTRV9QUkVGSVggY2FzZSBBTV9UU19TUkNfVFMyOlwKKwlDQVNFX1BSRUZJWCBjYXNlIEFNX1RTX1NSQ19TX1RTMjpcCisJCXNyYyA9ICJ0czIiO1wKKwlicmVhaztcCisJQ0FTRV9QUkVGSVggY2FzZSBBTV9UU19TUkNfVFMzOlwKKwkJc3JjID0gInRzMyI7XAorCWJyZWFrO1wKKwlDQVNFX1BSRUZJWCBjYXNlIEFNX1RTX1NSQ19ETVgwOlwKKwkJc3JjID0gImRteDAiO1wKKwlicmVhaztcCisJQ0FTRV9QUkVGSVggY2FzZSBBTV9UU19TUkNfRE1YMTpcCisJCXNyYyA9ICJkbXgxIjtcCisJYnJlYWs7XAorCUNBU0VfUFJFRklYIGNhc2UgQU1fVFNfU1JDX0RNWDI6XAorCQlzcmMgPSAiZG14MiI7XAorCWJyZWFrO1wKKwlDQVNFX1BSRUZJWCBjYXNlIEFNX1RTX1NSQ19ISVU6XAorCQlzcmMgPSAiaGl1IjtcCisJYnJlYWs7XAorCUNBU0VfUFJFRklYIGNhc2UgQU1fVFNfU1JDX0hJVTE6XAorCQlzcmMgPSAiaGl1MSI7XAorCWJyZWFrO1wKKwlDQVNFX1BSRUZJWCBkZWZhdWx0IDpcCisJCXNyYyA9ICIiO1wKKwlicmVhaztcCisJfSBcCisJcmV0ID0gc3ByaW50ZihidWYsICIlc1xuIiwgc3JjKTtcCisJcmV0dXJuIHJldDtcCit9IFwKK3N0YXRpYyBzc2l6ZV90IGRlbXV4IyNpIyNfc291cmNlX3N0b3JlKHN0cnVjdCBjbGFzcyAqY2xhc3MsICBcCisJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpXAore1wKKwlkbXhfc291cmNlX3Qgc3JjID0gLTE7XAorCWlmIChkbXhfY2hlY2tfc291cmNlKGksIGJ1ZikgPT0gMCkge1wKKwkJcHJfZXJyb3IoImRteFslZF0gc291cmNlIGlzIHNhbWUgWyVzXVxuIiwgaSwgYnVmKTtcCisJCXJldHVybiBzaXplO1wKKwl9XAorCWlmICghc3RybmNtcCgidHMwIiwgYnVmLCAzKSkge1wKKwkJc3JjID0gRE1YX1NPVVJDRV9GUk9OVDA7XAorCX0gZWxzZSBpZiAoIXN0cm5jbXAoInRzMSIsIGJ1ZiwgMykpIHtcCisJCXNyYyA9IERNWF9TT1VSQ0VfRlJPTlQxO1wKKwl9IGVsc2UgaWYgKCFzdHJuY21wKCJ0czIiLCBidWYsIDMpKSB7XAorCQlzcmMgPSBETVhfU09VUkNFX0ZST05UMjtcCisJfSBlbHNlIGlmICghc3RybmNtcCgidHMzIiwgYnVmLCAzKSkge1wKKwkJc3JjID0gRE1YX1NPVVJDRV9GUk9OVDM7XAorCX0gZWxzZSBpZiAoIXN0cm5jbXAoImhpdTEiLCBidWYsIDQpKSB7XAorCQlzcmMgPSBETVhfU09VUkNFX0RWUjE7XAorCX0gZWxzZSBpZiAoIXN0cm5jbXAoImhpdSIsIGJ1ZiwgMykpIHtcCisJCXNyYyA9IERNWF9TT1VSQ0VfRFZSMDtcCisJfSBlbHNlIGlmICghc3RybmNtcCgiZG14MCIsIGJ1ZiwgNCkpIHtcCisJCXNyYyA9IERNWF9TT1VSQ0VfRlJPTlQwX09GRlNFVDtcCisJfSBlbHNlIGlmICghc3RybmNtcCgiZG14MSIsIGJ1ZiwgNCkpIHtcCisJCXNyYyA9IERNWF9TT1VSQ0VfRlJPTlQxX09GRlNFVDtcCisJfSBlbHNlIGlmICghc3RybmNtcCgiZG14MiIsIGJ1ZiwgNCkpIHtcCisJCXNyYyA9IERNWF9TT1VSQ0VfRlJPTlQyX09GRlNFVDtcCisJfSBcCisJaWYgKHNyYyAhPSAtMSkge1wKKwkJYW1sX2RteF9od19zZXRfc291cmNlKGFtbF9kdmJfZGV2aWNlLmRteFtpXS5kbXhkZXYuZGVtdXgsIHNyYyk7XAorCX0gXAorCXJldHVybiBzaXplO1wKK30KKworLypTaG93IGZyZWUgZmlsdGVycyBjb3VudCovCisjZGVmaW5lIERFTVVYX0ZSRUVfRklMVEVSU19GVU5DX0RFQ0woaSkgIFwKK3N0YXRpYyBzc2l6ZV90IGRlbXV4IyNpIyNfZnJlZV9maWx0ZXJzX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywgIFwKKwkJCQlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpXAore1wKKwlzdHJ1Y3QgYW1sX2R2YiAqZHZiID0gJmFtbF9kdmJfZGV2aWNlO1wKKwlzdHJ1Y3QgZHZiX2RlbXV4ICpkbXggPSAmZHZiLT5kbXhbaV0uZGVtdXg7XAorCWludCBmaWQsIGNvdW50O1wKKwlzc2l6ZV90IHJldCA9IDA7XAorCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmRteC0+bXV0ZXgpKSBcCisJCXJldHVybiAtRVJFU1RBUlRTWVM7IFwKKwljb3VudCA9IDA7XAorCWZvciAoZmlkID0gMDsgZmlkIDwgZG14LT5maWx0ZXJudW07IGZpZCsrKSB7XAorCQlpZiAoIWRteC0+ZmlsdGVyW2ZpZF0uc3RhdGUgIT0gRE1YX1NUQVRFX0ZSRUUpXAorCQkJY291bnQrKztcCisJfSBcCisJbXV0ZXhfdW5sb2NrKCZkbXgtPm11dGV4KTtcCisJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgY291bnQpO1wKKwlyZXR1cm4gcmV0O1wKK30KKworLypTaG93IGRteCBkZXYgb3BlbiBjb3VudCovCisjZGVmaW5lIERFTVVYX0RFVl9VU0VSU19GVU5DX0RFQ0woaSkgIFwKK3N0YXRpYyBzc2l6ZV90IGRlbXV4IyNpIyNfZGV2X3VzZXJzX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywgIFwKKwkJCQlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpXAore1wKKwlzdHJ1Y3QgYW1sX2R2YiAqZHZiID0gJmFtbF9kdmJfZGV2aWNlO1wKKwlzdHJ1Y3QgZHZiX2RlbXV4ICpkbXggPSAmZHZiLT5kbXhbaV0uZGVtdXg7XAorCWludCBjb3VudDtcCisJc3NpemVfdCByZXQgPSAwO1wKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkbXgtPm11dGV4KSkgXAorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOyBcCisJY291bnQgPSBkdmItPmRteFtpXS5kbXhkZXYuZHZiZGV2LT51c2VycyAtMTtcCisJbXV0ZXhfdW5sb2NrKCZkbXgtPm11dGV4KTtcCisJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgY291bnQpO1wKKwlyZXR1cm4gcmV0O1wKK30KKworCitzdGF0aWMgc3NpemVfdCBkZW11eF9zdGF0ZV9zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCQkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBhbWxfZHZiICpkdmIgPSAmYW1sX2R2Yl9kZXZpY2U7CisJaW50IGkgPSAwLCByID0gMCwgaiA9IDA7CisJc3RydWN0IGR2Yl9kZW11eCAqZG14OworCXN0cnVjdCBhbWxfZG14ICpkbXgxOworCWludCBmaWQsIGNvdW50OworCXNzaXplX3QgcmV0ID0gMDsKKwljaGFyICpzdHIgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlyID0gc3ByaW50ZihidWYsICIjIyMjI2RteCVkIyMjIyMjI1xuIiwgaSk7CisJCWJ1ZiArPSByOworCQlyZXQgKz0gcjsKKwkJZG14ID0gJmR2Yi0+ZG14W2ldLmRlbXV4OworCQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkbXgtPm11dGV4KSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwkJciA9IHNwcmludGYoYnVmLCAiZmlsdGVyOlxuIik7CisJCWJ1ZiArPSByOworCQlyZXQgKz0gcjsKKworCQljb3VudCA9IDA7CisJCWZvciAoZmlkID0gMDsgZmlkIDwgZG14LT5maWx0ZXJudW07IGZpZCsrKSB7CisJCQlpZiAoIWRteC0+ZmlsdGVyW2ZpZF0uc3RhdGUgIT0gRE1YX1NUQVRFX0ZSRUUpCisJCQkJY291bnQrKzsKKwkJCWVsc2UgeworCQkJCXIgPSBzcHJpbnRmKGJ1ZiwgImZpZDolZCwgcGlkOjB4JTB4LCBzdGF0ZTolZFxuIiwgZmlkLCBkbXgtPmZpbHRlcltmaWRdLmZlZWQtPnBpZCwKKwkJCQkJZG14LT5maWx0ZXJbZmlkXS5zdGF0ZSk7CisJCQkJYnVmICs9IHI7CisJCQkJcmV0ICs9IHI7CisJCQl9CisJCX0KKwkJciA9IHNwcmludGYoYnVmLCAidXNlZCBmaWx0ZXI6JWQsIGZyZWUgZmlsdGVyOiVkXG4iLCAoZG14LT5maWx0ZXJudW0gLSBjb3VudCksIGNvdW50KTsKKwkJYnVmICs9IHI7CisJCXJldCArPSByOworCisJCXIgPSBzcHJpbnRmKGJ1ZiwgImZpbGUgdXNlcnM6JWRcbiIsIGR2Yi0+ZG14W2ldLmRteGRldi5kdmJkZXYtPnVzZXJzKTsKKwkJYnVmICs9IHI7CisJCXJldCArPSByOworCisJCXIgPSBzcHJpbnRmKGJ1ZiwgImNoYW46XG4iKTsKKwkJYnVmICs9IHI7CisJCXJldCArPSByOworCisJCWRteDEgPSAmZHZiLT5kbXhbaV07CisJCWNvdW50ID0gMDsKKwkJZm9yIChqID0gMDsgaiA8IENIQU5ORUxfQ09VTlQ7IGorKykgeworCQkJaWYgKGRteDEtPmNoYW5uZWxbal0udXNlZCkgeworCQkJCWlmIChkbXgxLT5jaGFubmVsW2pdLnR5cGUgPT0gRE1YX1RZUEVfVFMpIHsKKwkJCQkJaWYgKGRteDEtPmNoYW5uZWxbal0ucGVzX3R5cGUgPT0gRE1YX1BFU19WSURFTykgeworCQkJCQkJc3RyID0gInZpZGVvIjsKKwkJCQkJfSBlbHNlIGlmIChkbXgxLT5jaGFubmVsW2pdLnBlc190eXBlID09IERNWF9QRVNfQVVESU8peworCQkJCQkJc3RyID0gImF1ZGlvIjsKKwkJCQkJfSBlbHNlIGlmIChkbXgxLT5jaGFubmVsW2pdLnBlc190eXBlID09IERNWF9QRVNfU1VCVElUTEUpIHsKKwkJCQkJCXN0ciA9ICJzdWIiOworCQkJCQl9IGVsc2UgaWYgKGRteDEtPmNoYW5uZWxbal0ucGVzX3R5cGUgPT0gRE1YX1BFU19URUxFVEVYVCkgeworCQkJCQkJc3RyID0gInR0eCI7CisJCQkJCX0gZWxzZSBpZiAoZG14MS0+Y2hhbm5lbFtqXS5wZXNfdHlwZSA9PSBETVhfUEVTX1RFTEVURVhUKSB7CisJCQkJCQlzdHIgPSAib3RoZXIiOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJc3RyID0gInNlYyI7CisJCQkJfQorCQkJCWNvdW50ICsrOworCQkJCXIgPSBzcHJpbnRmKGJ1ZiwgImlkOiVkLCB0eXBlOiVzLCBwaWQ6MHglMHhcbiIsIGosIHN0ciwgZG14MS0+Y2hhbm5lbFtqXS5waWQpOworCQkJCWJ1ZiArPSByOworCQkJCXJldCArPSByOworCQkJfQorCQl9CisJCXIgPSBzcHJpbnRmKGJ1ZiwgInVzZWQgY2hhbjolZCwgZnJlZSBjaGFuOiVkXG4iLCBjb3VudCwgKENIQU5ORUxfQ09VTlQgLSBjb3VudCkpOworCQlidWYgKz0gcjsKKwkJcmV0ICs9IHI7CisJCW11dGV4X3VubG9jaygmZG14LT5tdXRleCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qU2hvdyBmaWx0ZXIgdXNlcnMgY291bnQqLworI2RlZmluZSBERU1VWF9GSUxURVJfVVNFUlNfRlVOQ19ERUNMKGkpICBcCitzdGF0aWMgc3NpemVfdCBkZW11eCMjaSMjX2ZpbHRlcl91c2Vyc19zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsICBcCisJCQkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKVwKK3tcCisJc3RydWN0IGFtbF9kdmIgKmR2YiA9ICZhbWxfZHZiX2RldmljZTtcCisJc3RydWN0IGFtbF9kbXggKmRteCA9ICZkdmItPmRteFtpXTtcCisJaW50IGRteGRldmZpZCwgY291bnQ7XAorCXNzaXplX3QgcmV0ID0gMDtcCisJdW5zaWduZWQgbG9uZyBmbGFncztcCisJc3Bpbl9sb2NrX2lycXNhdmUoJmR2Yi0+c2xvY2ssIGZsYWdzKTtcCisJY291bnQgPSAwO1wKKwlmb3IgKGRteGRldmZpZCA9IDA7IGRteGRldmZpZCA8IGRteC0+ZG14ZGV2LmZpbHRlcm51bTsgZG14ZGV2ZmlkKyspIHtcCisJCWlmIChkbXgtPmRteGRldi5maWx0ZXJbZG14ZGV2ZmlkXS5zdGF0ZSA+PSBcCisJCQlETVhERVZfU1RBVEVfQUxMT0NBVEVEKVwKKwkJCWNvdW50Kys7XAorCX0gXAorCWlmIChjb3VudCA+IGRteC0+ZGVtdXhfZmlsdGVyX3VzZXIpIHtcCisJCWNvdW50ID0gZG14LT5kZW11eF9maWx0ZXJfdXNlcjtcCisJfSBlbHNle1wKKwkJZG14LT5kZW11eF9maWx0ZXJfdXNlciA9IGNvdW50O1wKKwl9IFwKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdmItPnNsb2NrLCBmbGFncyk7XAorCXJldCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIGNvdW50KTtcCisJcmV0dXJuIHJldDtcCit9IFwKK3N0YXRpYyBzc2l6ZV90IGRlbXV4IyNpIyNfZmlsdGVyX3VzZXJzX3N0b3JlKHN0cnVjdCBjbGFzcyAqY2xhc3MsICBcCisJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpXAore1wKKwlzdHJ1Y3QgYW1sX2R2YiAqZHZiID0gJmFtbF9kdmJfZGV2aWNlO1wKKwlzdHJ1Y3QgYW1sX2RteCAqZG14ID0gJmR2Yi0+ZG14W2ldO1wKKwl1bnNpZ25lZCBsb25nIGZpbHRlcl91c2VkO1wKKwl1bnNpZ25lZCBsb25nIGZsYWdzOy8qY2hhciAqZW5kcDsqL1wKKwkvKmZpbHRlcl91c2VkID0gc2ltcGxlX3N0cnRvbChidWYsICZlbmRwLCAwKTsqL1wKKwlpbnQgcmV0ID0ga3N0cnRvbChidWYsIDAsICZmaWx0ZXJfdXNlZCk7XAorCXNwaW5fbG9ja19pcnFzYXZlKCZkdmItPnNsb2NrLCBmbGFncyk7XAorCWlmIChyZXQgPT0gMCAmJiBmaWx0ZXJfdXNlZCkge1wKKwkJaWYgKGRteC0+ZGVtdXhfZmlsdGVyX3VzZXIgPCBGSUxURVJfQ09VTlQpXAorCQkJZG14LT5kZW11eF9maWx0ZXJfdXNlcisrO1wKKwl9IGVsc2Uge1wKKwkJaWYgKGRteC0+ZGVtdXhfZmlsdGVyX3VzZXIgPiAwKVwKKwkJCWRteC0+ZGVtdXhfZmlsdGVyX3VzZXItLTtcCisJfSBcCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHZiLT5zbG9jaywgZmxhZ3MpO1wKKwlyZXR1cm4gc2l6ZTtcCit9CisKKy8qU2hvdyB0cyBoZWFkZXIqLworI2RlZmluZSBERU1VWF9UU19IRUFERVJfRlVOQ19ERUNMKGkpICBcCitzdGF0aWMgc3NpemVfdCBkZW11eCMjaSMjX3RzX2hlYWRlcl9zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsICBcCisJCQkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKVwKK3tcCisJaW50IGhkciA9IDA7XAorCWlmIChpID09IDApXAorCQloZHIgPSBSRUFEX01QRUdfUkVHKFRTX0hFQURfMSk7XAorCWVsc2UgaWYgKGkgPT0gMSlcCisJCWhkciA9IFJFQURfTVBFR19SRUcoVFNfSEVBRF8xXzIpO1wKKwllbHNlIGlmIChpID09IDIpXAorCQloZHIgPSBSRUFEX01QRUdfUkVHKFRTX0hFQURfMV8zKTtcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJTA4eFxuIiwgaGRyKTtcCit9CisKKy8qU2hvdyBjaGFubmVsIGFjdGl2aXR5Ki8KKyNkZWZpbmUgREVNVVhfQ0hBTk5FTF9BQ1RJVklUWV9GVU5DX0RFQ0woaSkgIFwKK3N0YXRpYyBzc2l6ZV90IGRlbXV4IyNpIyNfY2hhbm5lbF9hY3Rpdml0eV9zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsICBcCisJCQkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKVwKK3tcCisJaW50IGYgPSAwO1wKKwlpZiAoaSA9PSAwKVwKKwkJZiA9IFJFQURfTVBFR19SRUcoREVNVVhfQ0hBTk5FTF9BQ1RJVklUWSk7XAorCWVsc2UgaWYgKGkgPT0gMSlcCisJCWYgPSBSRUFEX01QRUdfUkVHKERFTVVYX0NIQU5ORUxfQUNUSVZJVFlfMik7XAorCWVsc2UgaWYgKGkgPT0gMilcCisJCWYgPSBSRUFEX01QRUdfUkVHKERFTVVYX0NIQU5ORUxfQUNUSVZJVFlfMyk7XAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiUwOHhcbiIsIGYpO1wKK30KKworI2RlZmluZSBERU1VWF9SRVNFVF9GVU5DX0RFQ0woaSkgIFwKK3N0YXRpYyBzc2l6ZV90IGRlbXV4IyNpIyNfcmVzZXRfc3RvcmUoc3RydWN0IGNsYXNzICpjbGFzcywgIFwKKwkJCQlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBcCisJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSlcCit7XAorCWlmICghc3RybmNtcCgiMSIsIGJ1ZiwgMSkpIHsgXAorCQlzdHJ1Y3QgYW1sX2R2YiAqZHZiID0gJmFtbF9kdmJfZGV2aWNlOyBcCisJCXByX2luZigiUmVzZXQgZGVtdXhbIiNpIl0sIGNhbGwgZG14X3Jlc2V0X2RteF9od1xuIik7IFwKKwkJZG14X3Jlc2V0X2RteF9pZF9od19leChkdmIsIGksIDApOyBcCisJfSBcCisJcmV0dXJuIHNpemU7IFwKK30KKworLypEVlIgcmVjb3JkIG1vZGUqLworI2RlZmluZSBEVlJfTU9ERV9GVU5DX0RFQ0woaSkgIFwKK3N0YXRpYyBzc2l6ZV90IGR2ciMjaSMjX21vZGVfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLCAgXAorCQkJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZilcCit7XAorCXN0cnVjdCBhbWxfZHZiICpkdmIgPSAmYW1sX2R2Yl9kZXZpY2U7XAorCXN0cnVjdCBhbWxfZG14ICpkbXggPSAmZHZiLT5kbXhbaV07XAorCXNzaXplX3QgcmV0ID0gMDtcCisJY2hhciAqbW9kZTtcCisJaWYgKGRteC0+ZHVtcF90c19zZWxlY3QpIHtcCisJCW1vZGUgPSAidHMiO1wKKwl9IGVsc2Uge1wKKwkJbW9kZSA9ICJwaWQiO1wKKwl9IFwKKwlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBtb2RlKTtcCisJcmV0dXJuIHJldDtcCit9IFwKK3N0YXRpYyBzc2l6ZV90IGR2ciMjaSMjX21vZGVfc3RvcmUoc3RydWN0IGNsYXNzICpjbGFzcywgIFwKKwkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSlcCit7XAorCXN0cnVjdCBhbWxfZHZiICpkdmIgPSAmYW1sX2R2Yl9kZXZpY2U7XAorCXN0cnVjdCBhbWxfZG14ICpkbXggPSAmZHZiLT5kbXhbaV07XAorCWludCBkdW1wX3RzX3NlbGVjdCA9IC0xO1wKKwlcCisJaWYgKCFzdHJuY21wKCJwaWQiLCBidWYsIDMpICYmIGRteC0+ZHVtcF90c19zZWxlY3QpIHtcCisJCWR1bXBfdHNfc2VsZWN0ID0gMDtcCisJfSBlbHNlIGlmICghc3RybmNtcCgidHMiLCBidWYsIDIpICYmICFkbXgtPmR1bXBfdHNfc2VsZWN0KSB7XAorCQlkdW1wX3RzX3NlbGVjdCA9IDE7XAorCX0gXAorCWlmIChkdW1wX3RzX3NlbGVjdCAhPSAtMSkge1wKKwkJYW1sX2RteF9od19zZXRfZHVtcF90c19zZWxlY3QoXAorCQkJYW1sX2R2Yl9kZXZpY2UuZG14W2ldLmRteGRldi5kZW11eCwgZHVtcF90c19zZWxlY3QpO1wKKwl9IFwKKwlyZXR1cm4gc2l6ZTtcCit9CisKKyNpZiBETVhfREVWX0NPVU5UID4gMAorCURFTVVYX1BDUl9GVU5DX0RFQ0woMCkKKwlERU1VWF9TT1VSQ0VfRlVOQ19ERUNMKDApCisJREVNVVhfRlJFRV9GSUxURVJTX0ZVTkNfREVDTCgwKQorCURFTVVYX0ZJTFRFUl9VU0VSU19GVU5DX0RFQ0woMCkKKwlERU1VWF9ERVZfVVNFUlNfRlVOQ19ERUNMKDApCisJRFZSX01PREVfRlVOQ19ERUNMKDApCisJREVNVVhfVFNfSEVBREVSX0ZVTkNfREVDTCgwKQorCURFTVVYX0NIQU5ORUxfQUNUSVZJVFlfRlVOQ19ERUNMKDApCisJREVNVVhfUkVTRVRfRlVOQ19ERUNMKDApCisjZW5kaWYKKyNpZiBETVhfREVWX0NPVU5UID4gMQorCURFTVVYX1BDUl9GVU5DX0RFQ0woMSkKKwlERU1VWF9TT1VSQ0VfRlVOQ19ERUNMKDEpCisJREVNVVhfRlJFRV9GSUxURVJTX0ZVTkNfREVDTCgxKQorCURFTVVYX0ZJTFRFUl9VU0VSU19GVU5DX0RFQ0woMSkKKwlERU1VWF9ERVZfVVNFUlNfRlVOQ19ERUNMKDEpCisJRFZSX01PREVfRlVOQ19ERUNMKDEpCisJREVNVVhfVFNfSEVBREVSX0ZVTkNfREVDTCgxKQorCURFTVVYX0NIQU5ORUxfQUNUSVZJVFlfRlVOQ19ERUNMKDEpCisJREVNVVhfUkVTRVRfRlVOQ19ERUNMKDEpCisjZW5kaWYKKyNpZiBETVhfREVWX0NPVU5UID4gMgorCURFTVVYX1BDUl9GVU5DX0RFQ0woMikKKwlERU1VWF9TT1VSQ0VfRlVOQ19ERUNMKDIpCisJREVNVVhfRlJFRV9GSUxURVJTX0ZVTkNfREVDTCgyKQorCURFTVVYX0ZJTFRFUl9VU0VSU19GVU5DX0RFQ0woMikKKwlERU1VWF9ERVZfVVNFUlNfRlVOQ19ERUNMKDIpCisJRFZSX01PREVfRlVOQ19ERUNMKDIpCisJREVNVVhfVFNfSEVBREVSX0ZVTkNfREVDTCgyKQorCURFTVVYX0NIQU5ORUxfQUNUSVZJVFlfRlVOQ19ERUNMKDIpCisJREVNVVhfUkVTRVRfRlVOQ19ERUNMKDIpCisjZW5kaWYKKworLypTaG93IHRoZSBhc3luYyBmaWZvIHNvdXJjZSovCisjZGVmaW5lIEFTWU5DRklGT19TT1VSQ0VfRlVOQ19ERUNMKGkpICBcCitzdGF0aWMgc3NpemVfdCBhc3luY2ZpZm8jI2kjI19zb3VyY2Vfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLCAgXAorCQkJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZilcCit7XAorCXN0cnVjdCBhbWxfZHZiICpkdmIgPSAmYW1sX2R2Yl9kZXZpY2U7XAorCXN0cnVjdCBhbWxfYXN5bmNmaWZvICphZmlmbyA9ICZkdmItPmFzeW5jZmlmb1tpXTtcCisJc3NpemVfdCByZXQgPSAwO1wKKwljaGFyICpzcmM7XAorCWlmIChkdmItPmFzeW5jX2ZpZm9fdG90YWxfY291bnQgPD0gaSlcCisJCXJldHVybiByZXQ7XAorCXN3aXRjaCAoYWZpZm8tPnNvdXJjZSkge1wKKwlDQVNFX1BSRUZJWCBjYXNlIEFNX0RNWF8wOlwKKwkJc3JjID0gImRteDAiO1wKKwkJYnJlYWs7XAorCUNBU0VfUFJFRklYIGNhc2UgQU1fRE1YXzE6XAorCQlzcmMgPSAiZG14MSI7XAorCQlicmVhazsgICBcCisJQ0FTRV9QUkVGSVggY2FzZSBBTV9ETVhfMjpcCisJCXNyYyA9ICJkbXgyIjtcCisJCWJyZWFrO1wKKwlDQVNFX1BSRUZJWCBkZWZhdWx0IDpcCisJCXNyYyA9ICIiO1wKKwkJYnJlYWs7XAorCX0gXAorCXJldCA9IHNwcmludGYoYnVmLCAiJXNcbiIsIHNyYyk7XAorCXJldHVybiByZXQ7XAorfSBcCitzdGF0aWMgc3NpemVfdCBhc3luY2ZpZm8jI2kjI19zb3VyY2Vfc3RvcmUoc3RydWN0IGNsYXNzICpjbGFzcywgIFwKKwkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSlcCit7XAorCWVudW0gYW1sX2RteF9pZF90IHNyYyA9IC0xO1wKKwlcCisJaWYgKGFtbF9kdmJfZGV2aWNlLmFzeW5jX2ZpZm9fdG90YWxfY291bnQgPD0gaSlcCisJCXJldHVybiAwO1wKKwlpZiAoIXN0cm5jbXAoImRteDAiLCBidWYsIDQpKSB7XAorCQlzcmMgPSBBTV9ETVhfMDtcCisJfSBlbHNlIGlmICghc3RybmNtcCgiZG14MSIsIGJ1ZiwgNCkpIHtcCisJCXNyYyA9IEFNX0RNWF8xO1wKKwl9IGVsc2UgaWYgKCFzdHJuY21wKCJkbXgyIiwgYnVmLCA0KSkge1wKKwkJc3JjID0gQU1fRE1YXzI7XAorCX0gXAorCWlmIChzcmMgIT0gLTEpIHtcCisJCWFtbF9hc3luY2ZpZm9faHdfc2V0X3NvdXJjZSgmYW1sX2R2Yl9kZXZpY2UuYXN5bmNmaWZvW2ldLCBzcmMpO1wKKwl9IFwKKwlyZXR1cm4gc2l6ZTtcCit9CisKKyNpZiBBU1lOQ0ZJRk9fQ09VTlQgPiAwCitBU1lOQ0ZJRk9fU09VUkNFX0ZVTkNfREVDTCgwKQorI2VuZGlmCisjaWYgQVNZTkNGSUZPX0NPVU5UID4gMQorCUFTWU5DRklGT19TT1VSQ0VfRlVOQ19ERUNMKDEpCisjZW5kaWYKKworI2lmIEFTWU5DRklGT19DT1VOVCA+IDIKKwlBU1lOQ0ZJRk9fU09VUkNFX0ZVTkNfREVDTCgyKQorI2VuZGlmCisKKy8qU2hvdyB0aGUgYXN5bmMgZmlmbyBmbHVzaCBzaXplKi8KKyNkZWZpbmUgQVNZTkNGSUZPX0ZMVVNIU0laRV9GVU5DX0RFQ0woaSkgIFwKK3N0YXRpYyBzc2l6ZV90IGFzeW5jZmlmbyMjaSMjX2ZsdXNoX3NpemVfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLCAgXAorCQkJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZilcCit7XAorCXN0cnVjdCBhbWxfZHZiICpkdmIgPSAmYW1sX2R2Yl9kZXZpY2U7XAorCXN0cnVjdCBhbWxfYXN5bmNmaWZvICphZmlmbyA9ICZkdmItPmFzeW5jZmlmb1tpXTtcCisJc3NpemVfdCByZXQgPSAwO1wKKwlpZiAoZHZiLT5hc3luY19maWZvX3RvdGFsX2NvdW50IDw9IGkpXAorCQlyZXR1cm4gcmV0O1wKKwlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBhZmlmby0+Zmx1c2hfc2l6ZSk7XAorCXJldHVybiByZXQ7XAorfSBcCitzdGF0aWMgc3NpemVfdCBhc3luY2ZpZm8jI2kjI19mbHVzaF9zaXplX3N0b3JlKHN0cnVjdCBjbGFzcyAqY2xhc3MsICBcCisJCQkJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIFwKKwkJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSlcCit7XAorCXN0cnVjdCBhbWxfZHZiICpkdmIgPSAmYW1sX2R2Yl9kZXZpY2U7XAorCXN0cnVjdCBhbWxfYXN5bmNmaWZvICphZmlmbyA9ICZkdmItPmFzeW5jZmlmb1tpXTtcCisJLyppbnQgZnNpemUgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOyovXAorCWludCBmc2l6ZSA9IDA7XAorCWxvbmcgdmFsdWU7XAorCWludCByZXQgPTA7XAorCWlmIChkdmItPmFzeW5jX2ZpZm9fdG90YWxfY291bnQgPD0gaSlcCisJCXJldHVybiAoc2l6ZV90KTA7XAorCXJldCA9IGtzdHJ0b2woYnVmLCAwLCAmdmFsdWUpO1wKKwlpZiAocmV0ID09IDApXAorCQlmc2l6ZSA9IHZhbHVlO1wKKwlpZiAoZnNpemUgIT0gYWZpZm8tPmZsdXNoX3NpemUpIHtcCisJCWFmaWZvLT5mbHVzaF9zaXplID0gZnNpemU7XAorCWFtbF9hc3luY2ZpZm9faHdfcmVzZXQoJmFtbF9kdmJfZGV2aWNlLmFzeW5jZmlmb1tpXSk7XAorCX0gXAorCXJldHVybiBzaXplO1wKK30KKworI2lmIEFTWU5DRklGT19DT1VOVCA+IDAKK0FTWU5DRklGT19GTFVTSFNJWkVfRlVOQ19ERUNMKDApCisjZW5kaWYKKworI2lmIEFTWU5DRklGT19DT1VOVCA+IDEKKwlBU1lOQ0ZJRk9fRkxVU0hTSVpFX0ZVTkNfREVDTCgxKQorI2VuZGlmCisKKyNpZiBBU1lOQ0ZJRk9fQ09VTlQgPiAyCisJQVNZTkNGSUZPX0ZMVVNIU0laRV9GVU5DX0RFQ0woMikKKyNlbmRpZgorCisvKlNob3cgdGhlIGFzeW5jIGZpZm8gc2VjdXJlIGJ1ZmZlciBhZGRyKi8KKyNkZWZpbmUgQVNZTkNGSUZPX1NFQ1VSRUFERFJfRlVOQ19ERUNMKGkpICBcCitzdGF0aWMgc3NpemVfdCBhc3luY2ZpZm8jI2kjI19zZWN1cmVfYWRkcl9zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsICBcCisJCQkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKVwKK3tcCisJc3RydWN0IGFtbF9kdmIgKmR2YiA9ICZhbWxfZHZiX2RldmljZTtcCisJc3RydWN0IGFtbF9hc3luY2ZpZm8gKmFmaWZvID0gJmR2Yi0+YXN5bmNmaWZvW2ldO1wKKwlzc2l6ZV90IHJldCA9IDA7XAorCWlmIChkdmItPmFzeW5jX2ZpZm9fdG90YWxfY291bnQgPD0gaSlcCisJCXJldHVybiByZXQ7XAorCXJldCA9IHNwcmludGYoYnVmLCAiMHgleFxuIiwgYWZpZm8tPmJsay5hZGRyKTtcCisJcmV0dXJuIHJldDtcCit9IFwKK3N0YXRpYyBzc2l6ZV90IGFzeW5jZmlmbyMjaSMjX3NlY3VyZV9hZGRyX3N0b3JlKHN0cnVjdCBjbGFzcyAqY2xhc3MsICBcCisJCQkJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIFwKK2NvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpXAore1wKKwlzdHJ1Y3QgYW1sX2R2YiAqZHZiID0gJmFtbF9kdmJfZGV2aWNlO1wKKwlzdHJ1Y3QgYW1sX2FzeW5jZmlmbyAqYWZpZm8gPSAmZHZiLT5hc3luY2ZpZm9baV07XAorCXVuc2lnbmVkIGxvbmcgdmFsdWU7XAorCWludCByZXQ9MDtcCisJaWYgKGR2Yi0+YXN5bmNfZmlmb190b3RhbF9jb3VudCA8PSBpKVwKKwkJcmV0dXJuIChzaXplX3QpMDtcCisJcmV0ID0ga3N0cnRvbChidWYsIDAsICZ2YWx1ZSk7XAorCWlmIChyZXQgPT0gMCAmJiB2YWx1ZSAhPSBhZmlmby0+YmxrLmFkZHIpIHtcCisJCWFmaWZvLT5ibGsuYWRkciA9IHZhbHVlO1wKKwkJYW1sX2FzeW5jZmlmb19od19yZXNldCgmYW1sX2R2Yl9kZXZpY2UuYXN5bmNmaWZvW2ldKTtcCisJfSBcCisJcmV0dXJuIHNpemU7XAorfQorCisjaWYgQVNZTkNGSUZPX0NPVU5UID4gMAorCUFTWU5DRklGT19TRUNVUkVBRERSX0ZVTkNfREVDTCgwKQorI2VuZGlmCisKKyNpZiBBU1lOQ0ZJRk9fQ09VTlQgPiAxCisJQVNZTkNGSUZPX1NFQ1VSRUFERFJfRlVOQ19ERUNMKDEpCisjZW5kaWYKKworI2lmIEFTWU5DRklGT19DT1VOVCA+IDIKKwlBU1lOQ0ZJRk9fU0VDVVJFQUREUl9GVU5DX0RFQ0woMikKKyNlbmRpZgorCisvKlNob3cgdGhlIGFzeW5jIGZpZm8gc2VjdXJlIGJ1ZmZlciBzaXplKi8KKyNkZWZpbmUgQVNZTkNGSUZPX1NFQ1VSRUFERFJfU0laRV9GVU5DX0RFQ0woaSkgIFwKK3N0YXRpYyBzc2l6ZV90IGFzeW5jZmlmbyMjaSMjX3NlY3VyZV9hZGRyX3NpemVfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLCAgXAorCQkJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZilcCit7XAorCXN0cnVjdCBhbWxfZHZiICpkdmIgPSAmYW1sX2R2Yl9kZXZpY2U7XAorCXN0cnVjdCBhbWxfYXN5bmNmaWZvICphZmlmbyA9ICZkdmItPmFzeW5jZmlmb1tpXTtcCisJc3NpemVfdCByZXQgPSAwO1wKKwlpZiAoZHZiLT5hc3luY19maWZvX3RvdGFsX2NvdW50IDw9IGkpXAorCQlyZXR1cm4gcmV0O1wKKwlyZXQgPSBzcHJpbnRmKGJ1ZiwgIjB4JXhcbiIsIGFmaWZvLT5ibGsubGVuKTtcCisJcmV0dXJuIHJldDtcCit9IFwKK3N0YXRpYyBzc2l6ZV90IGFzeW5jZmlmbyMjaSMjX3NlY3VyZV9hZGRyX3NpemVfc3RvcmUoc3RydWN0IGNsYXNzICpjbGFzcywgIFwKKwkJCQkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgXAorY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSlcCit7XAorCXN0cnVjdCBhbWxfZHZiICpkdmIgPSAmYW1sX2R2Yl9kZXZpY2U7XAorCXN0cnVjdCBhbWxfYXN5bmNmaWZvICphZmlmbyA9ICZkdmItPmFzeW5jZmlmb1tpXTtcCisJdW5zaWduZWQgbG9uZyB2YWx1ZTtcCisJaW50IHJldD0wO1wKKwlpZiAoZHZiLT5hc3luY19maWZvX3RvdGFsX2NvdW50IDw9IGkpXAorCQlyZXR1cm4gKHNpemVfdCkwO1wKKwlyZXQgPSBrc3RydG9sKGJ1ZiwgMCwgJnZhbHVlKTtcCisJaWYgKHJldCA9PSAwICYmIHZhbHVlICE9IGFmaWZvLT5ibGsubGVuKSB7XAorCQlhZmlmby0+YmxrLmxlbiA9IHZhbHVlO1wKKwkJYW1sX2FzeW5jZmlmb19od19yZXNldCgmYW1sX2R2Yl9kZXZpY2UuYXN5bmNmaWZvW2ldKTtcCisJfSBcCisJcmV0dXJuIHNpemU7XAorfQorCisjaWYgQVNZTkNGSUZPX0NPVU5UID4gMAorCUFTWU5DRklGT19TRUNVUkVBRERSX1NJWkVfRlVOQ19ERUNMKDApCisjZW5kaWYKKworI2lmIEFTWU5DRklGT19DT1VOVCA+IDEKKwlBU1lOQ0ZJRk9fU0VDVVJFQUREUl9TSVpFX0ZVTkNfREVDTCgxKQorI2VuZGlmCisKKyNpZiBBU1lOQ0ZJRk9fQ09VTlQgPiAyCisJQVNZTkNGSUZPX1NFQ1VSRUFERFJfU0laRV9GVU5DX0RFQ0woMikKKyNlbmRpZgorCisKKy8qU2hvdyB0aGUgYXN5bmMgZmlmbyBzZWN1cmUgZW5hYmxlKi8KKyNkZWZpbmUgQVNZTkNGSUZPX1NFQ1VSRU5BQkxFX0ZVTkNfREVDTChpKSAgXAorc3RhdGljIHNzaXplX3QgYXN5bmNmaWZvIyNpIyNfc2VjdXJlX2VuYWJsZV9zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsICBcCisJCQkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKVwKK3tcCisJc3RydWN0IGFtbF9kdmIgKmR2YiA9ICZhbWxfZHZiX2RldmljZTtcCisJc3RydWN0IGFtbF9hc3luY2ZpZm8gKmFmaWZvID0gJmR2Yi0+YXN5bmNmaWZvW2ldO1wKKwlzc2l6ZV90IHJldCA9IDA7XAorCWlmIChkdmItPmFzeW5jX2ZpZm9fdG90YWxfY291bnQgPD0gaSlcCisJCXJldHVybiByZXQ7XAorCXJldCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIGFmaWZvLT5zZWN1cmVfZW5hYmxlKTtcCisJcmV0dXJuIHJldDtcCit9IFwKK3N0YXRpYyBzc2l6ZV90IGFzeW5jZmlmbyMjaSMjX3NlY3VyZV9lbmFibGVfc3RvcmUoc3RydWN0IGNsYXNzICpjbGFzcywgIFwKKwkJCQkJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgXAorCQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKVwKK3tcCisJc3RydWN0IGFtbF9kdmIgKmR2YiA9ICZhbWxfZHZiX2RldmljZTtcCisJc3RydWN0IGFtbF9hc3luY2ZpZm8gKmFmaWZvID0gJmR2Yi0+YXN5bmNmaWZvW2ldO1wKKwlpbnQgZW5hYmxlID0gMDtcCisJbG9uZyB2YWx1ZTtcCisJaW50IHJldD0wO1wKKwlpZiAoZHZiLT5hc3luY19maWZvX3RvdGFsX2NvdW50IDw9IGkpXAorCQlyZXR1cm4gKHNpemVfdCkwO1wKKwlyZXQgPSBrc3RydG9sKGJ1ZiwgMCwgJnZhbHVlKTtcCisJaWYgKHJldCA9PSAwKVwKKwkJZW5hYmxlID0gdmFsdWU7XAorCWlmIChlbmFibGUgIT0gYWZpZm8tPnNlY3VyZV9lbmFibGUpIHtcCisJCWFmaWZvLT5zZWN1cmVfZW5hYmxlID0gZW5hYmxlO1wKKwlhbWxfYXN5bmNmaWZvX2h3X3Jlc2V0KCZhbWxfZHZiX2RldmljZS5hc3luY2ZpZm9baV0pO1wKKwl9IFwKKwlyZXR1cm4gc2l6ZTtcCit9CisKKyNpZiBBU1lOQ0ZJRk9fQ09VTlQgPiAwCitBU1lOQ0ZJRk9fU0VDVVJFTkFCTEVfRlVOQ19ERUNMKDApCisjZW5kaWYKKworI2lmIEFTWU5DRklGT19DT1VOVCA+IDEKKwlBU1lOQ0ZJRk9fU0VDVVJFTkFCTEVfRlVOQ19ERUNMKDEpCisjZW5kaWYKKworI2lmIEFTWU5DRklGT19DT1VOVCA+IDIKKwlBU1lOQ0ZJRk9fU0VDVVJFTkFCTEVfRlVOQ19ERUNMKDIpCisjZW5kaWYKKworLypSZXNldCB0aGUgRGVtdXgqLworc3RhdGljIHNzaXplX3QgZGVtdXhfcmVzZXRfc3RvcmUoc3RydWN0IGNsYXNzICpjbGFzcywKKwkJCQlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJaWYgKCFzdHJuY21wKCIxIiwgYnVmLCAxKSkgeworCQlzdHJ1Y3QgYW1sX2R2YiAqZHZiID0gJmFtbF9kdmJfZGV2aWNlOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkdmItPnNsb2NrLCBmbGFncyk7CisJCXByX2RiZygiUmVzZXQgZGVtdXgsIGNhbGwgZG14X3Jlc2V0X2h3XG4iKTsKKwkJZG14X3Jlc2V0X2h3X2V4KGR2YiwgMCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR2Yi0+c2xvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gc2l6ZTsKK30KKworLypTaG93IHRoZSBWaWRlbyBQVFMgdmFsdWUqLworc3RhdGljIHNzaXplX3QgdmlkZW9fcHRzX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKKwkJCQkgICAgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBhbWxfZHZiICpkdmIgPSAmYW1sX2R2Yl9kZXZpY2U7CisJc3NpemVfdCByZXQgPSAwOworCisJcmV0ID0gc3ByaW50ZihidWYsICIldVxuIiwgYW1sX2RteF9nZXRfdmlkZW9fcHRzKGR2YikpOworCisJcmV0dXJuIHJldDsKK30KKworLypTaG93IHRoZSBBdWRpbyBQVFMgdmFsdWUqLworc3RhdGljIHNzaXplX3QgYXVkaW9fcHRzX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKKwkJCQkgICAgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBhbWxfZHZiICpkdmIgPSAmYW1sX2R2Yl9kZXZpY2U7CisJc3NpemVfdCByZXQgPSAwOworCisJcmV0ID0gc3ByaW50ZihidWYsICIldVxuIiwgYW1sX2RteF9nZXRfYXVkaW9fcHRzKGR2YikpOworCisJcmV0dXJuIHJldDsKK30KKworLypTaG93IHRoZSBWaWRlbyBQVFMgYml0MzIgdmFsdWUqLworc3RhdGljIHNzaXplX3QgdmlkZW9fcHRzX2JpdDMyX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywKKwkJCQlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGFtbF9kdmIgKmR2YiA9ICZhbWxfZHZiX2RldmljZTsKKwlzc2l6ZV90IHJldCA9IDA7CisKKwlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBhbWxfZG14X2dldF92aWRlb19wdHNfYml0MzIoZHZiKSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKlNob3cgdGhlIEF1ZGlvIFBUUyBiaXQzMiB2YWx1ZSovCitzdGF0aWMgc3NpemVfdCBhdWRpb19wdHNfYml0MzJfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQkJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYW1sX2R2YiAqZHZiID0gJmFtbF9kdmJfZGV2aWNlOworCXNzaXplX3QgcmV0ID0gMDsKKworCXJldCA9IHNwcmludGYoYnVmLCAiJXVcbiIsIGFtbF9kbXhfZ2V0X2F1ZGlvX3B0c19iaXQzMihkdmIpKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qU2hvdyB0aGUgMzNiaXQgVmlkZW8gUFRTIHZhbHVlKi8KK3N0YXRpYyBzc2l6ZV90IHZpZGVvX3B0c191NjRfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQkJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYW1sX2R2YiAqZHZiID0gJmFtbF9kdmJfZGV2aWNlOworCXNzaXplX3QgcmV0ID0gMDsKKworCXU2NCBwdHNfdmFsID0gYW1sX2RteF9nZXRfdmlkZW9fcHRzKGR2Yik7CisJcHRzX3ZhbCAmPSAweDAwMDAwMDAwRkZGRkZGRkY7CisKKwlpZiAoYW1sX2RteF9nZXRfdmlkZW9fcHRzX2JpdDMyKGR2YikpIHsKKwkJcHRzX3ZhbCA9IHB0c192YWwgfCAoMUxMPDwzMik7CisJfQorCisJcmV0ID0gc3ByaW50ZihidWYsICIlbGx1XG4iLCBwdHNfdmFsKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qU2hvdyB0aGUgMzNiaXQgQXVkaW8gUFRTIHZhbHVlKi8KK3N0YXRpYyBzc2l6ZV90IGF1ZGlvX3B0c191NjRfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQkJCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYW1sX2R2YiAqZHZiID0gJmFtbF9kdmJfZGV2aWNlOworCXNzaXplX3QgcmV0ID0gMDsKKworCXU2NCBwdHNfdmFsID0gYW1sX2RteF9nZXRfYXVkaW9fcHRzKGR2Yik7CisJcHRzX3ZhbCAmPSAweDAwMDAwMDAwRkZGRkZGRkY7CisKKwlpZiAoYW1sX2RteF9nZXRfYXVkaW9fcHRzX2JpdDMyKGR2YikpIHsKKwkJcHRzX3ZhbCA9IHB0c192YWwgfCAoMUxMPDwzMik7CisJfQorCisJcmV0ID0gc3ByaW50ZihidWYsICIlbGx1XG4iLCBwdHNfdmFsKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qU2hvdyB0aGUgRmlyc3QgVmlkZW8gUFRTIHZhbHVlKi8KK3N0YXRpYyBzc2l6ZV90IGZpcnN0X3ZpZGVvX3B0c19zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCQkJCSAgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICBjaGFyICpidWYpCit7CisJc3RydWN0IGFtbF9kdmIgKmR2YiA9ICZhbWxfZHZiX2RldmljZTsKKwlzc2l6ZV90IHJldCA9IDA7CisKKwlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBhbWxfZG14X2dldF9maXJzdF92aWRlb19wdHMoZHZiKSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKlNob3cgdGhlIEZpcnN0IEF1ZGlvIFBUUyB2YWx1ZSovCitzdGF0aWMgc3NpemVfdCBmaXJzdF9hdWRpb19wdHNfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQkJCQkgIHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgY2hhciAqYnVmKQoreworCXN0cnVjdCBhbWxfZHZiICpkdmIgPSAmYW1sX2R2Yl9kZXZpY2U7CisJc3NpemVfdCByZXQgPSAwOworCisJcmV0ID0gc3ByaW50ZihidWYsICIldVxuIiwgYW1sX2RteF9nZXRfZmlyc3RfYXVkaW9fcHRzKGR2YikpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgaHdfc2V0dGluZ19zaG93KHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCQkJICAgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCByLCB0b3RhbCA9IDA7CisJaW50IGk7CisJc3RydWN0IGFtbF9kdmIgKmR2YiA9ICZhbWxfZHZiX2RldmljZTsKKwlpbnQgaW52ZXJ0LCBjdHJsOworCisJZm9yIChpID0gMDsgaSA8IGR2Yi0+dHNfaW5fdG90YWxfY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgYW1sX3RzX2lucHV0ICp0cyA9ICZkdmItPnRzW2ldOworCisJCWlmICh0cy0+czJwX2lkICE9IC0xKQorCQkJaW52ZXJ0ID0gZHZiLT5zMnBbdHMtPnMycF9pZF0uaW52ZXJ0OworCQllbHNlCisJCQlpbnZlcnQgPSAwOworCisJCWN0cmwgPSB0cy0+Y29udHJvbDsKKworCQlyID0gc3ByaW50ZihidWYsICJ0cyVkICVzIGNvbnRyb2w6IDB4JXggaW52ZXJ0OiAweCV4XG4iLCBpLAorCQkJICAgIHRzLT5tb2RlID09IEFNX1RTX0RJU0FCTEUgPyAiZGlzYWJsZSIgOgorCQkJCSh0cy0+bW9kZSA9PSBBTV9UU19TRVJJQUwgPyAic2VyaWFsIiA6CisJCQkJInBhcmFsbGVsIiksIGN0cmwsIGludmVydCk7CisJCWJ1ZiArPSByOworCQl0b3RhbCArPSByOworCX0KKworCXJldHVybiB0b3RhbDsKK30KKworc3RhdGljIHNzaXplX3QgaHdfc2V0dGluZ19zdG9yZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQkJCSAgICBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgaWQsIGN0cmwsIGludmVydCwgciwgbW9kZTsKKwljaGFyIG1uYW1lWzMyXTsKKwljaGFyIHBuYW1lWzMyXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBhbWxfdHNfaW5wdXQgKnRzOworCXN0cnVjdCBhbWxfZHZiICpkdmIgPSAmYW1sX2R2Yl9kZXZpY2U7CisKKwlyID0gc3NjYW5mKGJ1ZiwgIiVkICVzICV4ICV4IiwgJmlkLCBtbmFtZSwgJmN0cmwsICZpbnZlcnQpOworCWlmIChyICE9IDQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGlkIDwgMCB8fCBpZCA+PSBkdmItPnRzX2luX3RvdGFsX2NvdW50KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgobW5hbWVbMF0gPT0gJ3MnKSB8fCAobW5hbWVbMF0gPT0gJ1MnKSkgeworCQlzcHJpbnRmKHBuYW1lLCAic190cyVkIiwgaWQpOworCQltb2RlID0gQU1fVFNfU0VSSUFMOworCX0gZWxzZSBpZiAoKG1uYW1lWzBdID09ICdwJykgfHwgKG1uYW1lWzBdID09ICdQJykpIHsKKwkJc3ByaW50ZihwbmFtZSwgInBfdHMlZCIsIGlkKTsKKwkJbW9kZSA9IEFNX1RTX1BBUkFMTEVMOworCX0gZWxzZQorCQltb2RlID0gQU1fVFNfRElTQUJMRTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkdmItPnNsb2NrLCBmbGFncyk7CisKKwl0cyA9ICZkdmItPnRzW2lkXTsKKworCWlmICgobW9kZSA9PSBBTV9UU19TRVJJQUwpICYmICh0cy0+bW9kZSAhPSBBTV9UU19TRVJJQUwpKSB7CisJCWludCBpOworCQlpbnQgc2NudCA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IGR2Yi0+dHNfaW5fdG90YWxfY291bnQ7IGkrKykgeworCQkJaWYgKGR2Yi0+dHNbaV0uczJwX2lkICE9IC0xKQorCQkJCXNjbnQrKzsKKwkJfQorCisJCWlmIChzY250ID49IGR2Yi0+czJwX3RvdGFsX2NvdW50KQorCQkJcHJfZXJyb3IoIm5vIGZyZWUgczJwXG4iKTsKKwkJZWxzZQorCQkJdHMtPnMycF9pZCA9IHNjbnQ7CisJfQorCisJaWYgKChtb2RlICE9IEFNX1RTX1NFUklBTCkgfHwgKHRzLT5zMnBfaWQgIT0gLTEpKSB7CisJCWlmICh0cy0+cGluY3RybCkgeworCQkJZGV2bV9waW5jdHJsX3B1dCh0cy0+cGluY3RybCk7CisJCQl0cy0+cGluY3RybCA9IE5VTEw7CisJCX0KKworCQl0cy0+cGluY3RybCA9IGRldm1fcGluY3RybF9nZXRfc2VsZWN0KCZkdmItPnBkZXYtPmRldiwgcG5hbWUpOworLyogICAgICAgICAgICAgIGlmKElTX0VSUl9WQUxVRSh0cy0+cGluY3RybCkpKi8KKy8qICAgICAgICAgICAgICAgICAgICAgIHRzLT5waW5jdHJsID0gTlVMTDsqLworCQl0cy0+bW9kZSA9IG1vZGU7CisJCXRzLT5jb250cm9sID0gY3RybDsKKworCQlpZiAobW9kZSA9PSBBTV9UU19TRVJJQUwpCisJCQlkdmItPnMycFt0cy0+czJwX2lkXS5pbnZlcnQgPSBpbnZlcnQ7CisJCWVsc2UKKwkJCXRzLT5zMnBfaWQgPSAtMTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdmItPnNsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKworc3RhdGljIENMQVNTX0FUVFJfUlcoaHdfc2V0dGluZyk7CitzdGF0aWMgQ0xBU1NfQVRUUl9SVyhzb3VyY2UpOworc3RhdGljIENMQVNTX0FUVFJfUlcoZGVtdXhfcmVzZXRfYWxsX2ZsYWcpOworc3RhdGljIENMQVNTX0FUVFJfUlcodHNvX3NvdXJjZSk7CisjZGVmaW5lIERFTVVYX1NPVVJDRV9BVFRSX1BDUihpKVwKKwlzdGF0aWMgQ0xBU1NfQVRUUl9STyhkZW11eCMjaSMjX3BjcikKKyNkZWZpbmUgREVNVVhfU09VUkNFX0FUVFJfREVDTChpKVwKKwlzdGF0aWMgQ0xBU1NfQVRUUl9SVyhkZW11eCMjaSMjX3NvdXJjZSkKKyNkZWZpbmUgREVNVVhfRlJFRV9GSUxURVJTX0FUVFJfREVDTChpKVwKKwlzdGF0aWMgQ0xBU1NfQVRUUl9STyhkZW11eCMjaSMjX2ZyZWVfZmlsdGVycykKKyNkZWZpbmUgREVNVVhfRklMVEVSX1VTRVJTX0FUVFJfREVDTChpKVwKKwlzdGF0aWMgQ0xBU1NfQVRUUl9SVyhkZW11eCMjaSMjX2ZpbHRlcl91c2VycykKKyNkZWZpbmUgREVNVVhfREVWX1VTRVJTX0FUVFJfREVDTChpKVwKKwlzdGF0aWMgQ0xBU1NfQVRUUl9STyhkZW11eCMjaSMjX2Rldl91c2VycykKKyNkZWZpbmUgRFZSX01PREVfQVRUUl9ERUNMKGkpXAorCXN0YXRpYyBDTEFTU19BVFRSX1JXKGR2ciMjaSMjX21vZGUpCisjZGVmaW5lIERFTVVYX1RTX0hFQURFUl9BVFRSX0RFQ0woaSlcCisJc3RhdGljIENMQVNTX0FUVFJfUk8oZGVtdXgjI2kjI190c19oZWFkZXIpCisjZGVmaW5lIERFTVVYX0NIQU5ORUxfQUNUSVZJVFlfQVRUUl9ERUNMKGkpXAorCXN0YXRpYyBDTEFTU19BVFRSX1JPKGRlbXV4IyNpIyNfY2hhbm5lbF9hY3Rpdml0eSkKKyNkZWZpbmUgRE1YX1JFU0VUX0FUVFJfREVDTChpKVwKKwlzdGF0aWMgQ0xBU1NfQVRUUl9XTyhkZW11eCMjaSMjX3Jlc2V0KQorCisjaWYgRE1YX0RFVl9DT1VOVCA+IDAKKwlERU1VWF9TT1VSQ0VfQVRUUl9QQ1IoMCk7CisJREVNVVhfU09VUkNFX0FUVFJfREVDTCgwKTsKKwlERU1VWF9GUkVFX0ZJTFRFUlNfQVRUUl9ERUNMKDApOworCURFTVVYX0ZJTFRFUl9VU0VSU19BVFRSX0RFQ0woMCk7CisJREVNVVhfREVWX1VTRVJTX0FUVFJfREVDTCgwKTsKKwlEVlJfTU9ERV9BVFRSX0RFQ0woMCk7CisJREVNVVhfVFNfSEVBREVSX0FUVFJfREVDTCgwKTsKKwlERU1VWF9DSEFOTkVMX0FDVElWSVRZX0FUVFJfREVDTCgwKTsKKwlETVhfUkVTRVRfQVRUUl9ERUNMKDApOworI2VuZGlmCisjaWYgRE1YX0RFVl9DT1VOVCA+IDEKKwlERU1VWF9TT1VSQ0VfQVRUUl9QQ1IoMSk7CisJREVNVVhfU09VUkNFX0FUVFJfREVDTCgxKTsKKwlERU1VWF9GUkVFX0ZJTFRFUlNfQVRUUl9ERUNMKDEpOworCURFTVVYX0ZJTFRFUl9VU0VSU19BVFRSX0RFQ0woMSk7CisJREVNVVhfREVWX1VTRVJTX0FUVFJfREVDTCgxKTsKKwlEVlJfTU9ERV9BVFRSX0RFQ0woMSk7CisJREVNVVhfVFNfSEVBREVSX0FUVFJfREVDTCgxKTsKKwlERU1VWF9DSEFOTkVMX0FDVElWSVRZX0FUVFJfREVDTCgxKTsKKwlETVhfUkVTRVRfQVRUUl9ERUNMKDEpOworI2VuZGlmCisjaWYgRE1YX0RFVl9DT1VOVCA+IDIKKwlERU1VWF9TT1VSQ0VfQVRUUl9QQ1IoMik7CisJREVNVVhfU09VUkNFX0FUVFJfREVDTCgyKTsKKwlERU1VWF9GUkVFX0ZJTFRFUlNfQVRUUl9ERUNMKDIpOworCURFTVVYX0ZJTFRFUl9VU0VSU19BVFRSX0RFQ0woMik7CisJREVNVVhfREVWX1VTRVJTX0FUVFJfREVDTCgyKTsKKwlEVlJfTU9ERV9BVFRSX0RFQ0woMik7CisJREVNVVhfVFNfSEVBREVSX0FUVFJfREVDTCgyKTsKKwlERU1VWF9DSEFOTkVMX0FDVElWSVRZX0FUVFJfREVDTCgyKTsKKwlETVhfUkVTRVRfQVRUUl9ERUNMKDIpOworI2VuZGlmCisKKyNkZWZpbmUgQVNZTkNGSUZPX1NPVVJDRV9BVFRSX0RFQ0woaSlcCisJc3RhdGljIENMQVNTX0FUVFJfUlcoYXN5bmNmaWZvIyNpIyNfc291cmNlKQorI2RlZmluZSBBU1lOQ0ZJRk9fRkxVU0hTSVpFX0FUVFJfREVDTChpKVwKKwlzdGF0aWMgQ0xBU1NfQVRUUl9SVyhhc3luY2ZpZm8jI2kjI19mbHVzaF9zaXplKQorI2RlZmluZSBBU1lOQ0ZJRk9fU0VDVVJFQUREUl9BVFRSX0RFQ0woaSlcCisJc3RhdGljIENMQVNTX0FUVFJfUlcoYXN5bmNmaWZvIyNpIyNfc2VjdXJlX2FkZHIpCisjZGVmaW5lIEFTWU5DRklGT19TRUNVUkVBRERSX1NJWkVfQVRUUl9ERUNMKGkpXAorCXN0YXRpYyBDTEFTU19BVFRSX1JXKGFzeW5jZmlmbyMjaSMjX3NlY3VyZV9hZGRyX3NpemUpCisjZGVmaW5lIEFTWU5DRklGT19TRUNVUkVOQUJMRV9BVFRSX0RFQ0woaSlcCisJc3RhdGljIENMQVNTX0FUVFJfUlcoYXN5bmNmaWZvIyNpIyNfc2VjdXJlX2VuYWJsZSkKKworI2lmIEFTWU5DRklGT19DT1VOVCA+IDAKKwlBU1lOQ0ZJRk9fU09VUkNFX0FUVFJfREVDTCgwKTsKKwlBU1lOQ0ZJRk9fRkxVU0hTSVpFX0FUVFJfREVDTCgwKTsKKwlBU1lOQ0ZJRk9fU0VDVVJFQUREUl9BVFRSX0RFQ0woMCk7CisJQVNZTkNGSUZPX1NFQ1VSRUFERFJfU0laRV9BVFRSX0RFQ0woMCk7CisJQVNZTkNGSUZPX1NFQ1VSRU5BQkxFX0FUVFJfREVDTCgwKTsKKyNlbmRpZgorI2lmIEFTWU5DRklGT19DT1VOVCA+IDEKKwlBU1lOQ0ZJRk9fU09VUkNFX0FUVFJfREVDTCgxKTsKKwlBU1lOQ0ZJRk9fRkxVU0hTSVpFX0FUVFJfREVDTCgxKTsKKwlBU1lOQ0ZJRk9fU0VDVVJFQUREUl9BVFRSX0RFQ0woMSk7CisJQVNZTkNGSUZPX1NFQ1VSRUFERFJfU0laRV9BVFRSX0RFQ0woMSk7CisJQVNZTkNGSUZPX1NFQ1VSRU5BQkxFX0FUVFJfREVDTCgxKTsKKyNlbmRpZgorCisjaWYgQVNZTkNGSUZPX0NPVU5UID4gMgorCUFTWU5DRklGT19TT1VSQ0VfQVRUUl9ERUNMKDIpOworCUFTWU5DRklGT19GTFVTSFNJWkVfQVRUUl9ERUNMKDIpOworCUFTWU5DRklGT19TRUNVUkVBRERSX0FUVFJfREVDTCgyKTsKKwlBU1lOQ0ZJRk9fU0VDVVJFQUREUl9TSVpFX0FUVFJfREVDTCgyKTsKKwlBU1lOQ0ZJRk9fU0VDVVJFTkFCTEVfQVRUUl9ERUNMKDIpOworI2VuZGlmCisKKwlzdGF0aWMgQ0xBU1NfQVRUUl9XTyhkZW11eF9yZXNldCk7CisJc3RhdGljIENMQVNTX0FUVFJfUk8odmlkZW9fcHRzKTsKKwlzdGF0aWMgQ0xBU1NfQVRUUl9STyhhdWRpb19wdHMpOworCXN0YXRpYyBDTEFTU19BVFRSX1JPKHZpZGVvX3B0c19iaXQzMik7CisJc3RhdGljIENMQVNTX0FUVFJfUk8oYXVkaW9fcHRzX2JpdDMyKTsKKwlzdGF0aWMgQ0xBU1NfQVRUUl9STyh2aWRlb19wdHNfdTY0KTsKKwlzdGF0aWMgQ0xBU1NfQVRUUl9STyhhdWRpb19wdHNfdTY0KTsKKwlzdGF0aWMgQ0xBU1NfQVRUUl9STyhmaXJzdF92aWRlb19wdHMpOworCXN0YXRpYyBDTEFTU19BVFRSX1JPKGZpcnN0X2F1ZGlvX3B0cyk7CisJc3RhdGljIENMQVNTX0FUVFJfV08oY2xlYXJfYXYpOworCXN0YXRpYyBDTEFTU19BVFRSX1JPKGRlbXV4X3N0YXRlKTsKKworI2RlZmluZSBEU0NfU09VUkNFX0FUVFJfREVDTChpKVwKKwlzdGF0aWMgQ0xBU1NfQVRUUl9SVyhkc2MjI2kjI19zb3VyY2UpCisjZGVmaW5lIERTQ19GUkVFX0FUVFJfREVDTChpKSBcCisJc3RhdGljIENMQVNTX0FUVFJfUk8oZHNjIyNpIyNfZnJlZV9kc2NzKQorCisjaWYgRFNDX0RFVl9DT1VOVCA+IDAKKwlEU0NfU09VUkNFX0FUVFJfREVDTCgwKTsKKwlEU0NfRlJFRV9BVFRSX0RFQ0woMCk7CisjZW5kaWYKKyNpZiBEU0NfREVWX0NPVU5UID4gMQorCURTQ19TT1VSQ0VfQVRUUl9ERUNMKDEpOworCURTQ19GUkVFX0FUVFJfREVDTCgxKTsKKyNlbmRpZgorCisjZGVmaW5lIFNUQl9BVFRSKG5hbWUpICZjbGFzc19hdHRyXyMjbmFtZS5hdHRyCisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphbWxfc3RiX2NsYXNzX2F0dHJzW10gPSB7CisJU1RCX0FUVFIoaHdfc2V0dGluZyksCisJU1RCX0FUVFIoc291cmNlKSwKKwlTVEJfQVRUUihkZW11eF9yZXNldF9hbGxfZmxhZyksCisJU1RCX0FUVFIodHNvX3NvdXJjZSksCisJU1RCX0FUVFIoZGVtdXhfcmVzZXQpLAorCVNUQl9BVFRSKHZpZGVvX3B0cyksCisJU1RCX0FUVFIoYXVkaW9fcHRzKSwKKwlTVEJfQVRUUih2aWRlb19wdHNfYml0MzIpLAorCVNUQl9BVFRSKGF1ZGlvX3B0c19iaXQzMiksCisJU1RCX0FUVFIodmlkZW9fcHRzX3U2NCksCisJU1RCX0FUVFIoYXVkaW9fcHRzX3U2NCksCisJU1RCX0FUVFIoZmlyc3RfdmlkZW9fcHRzKSwKKwlTVEJfQVRUUihmaXJzdF9hdWRpb19wdHMpLAorCVNUQl9BVFRSKGNsZWFyX2F2KSwKKwlTVEJfQVRUUihkZW11eF9zdGF0ZSksCisjZGVmaW5lIERFTVVYX1BDUihpKSBcCisJU1RCX0FUVFIoZGVtdXgjI2kjI19wY3IpCisJREVNVVhfUENSKDApLAorCURFTVVYX1BDUigxKSwKKwlERU1VWF9QQ1IoMiksCisjZGVmaW5lIERFTVVYX1NPVVJDRShpKSBcCisJU1RCX0FUVFIoZGVtdXgjI2kjI19zb3VyY2UpCisJREVNVVhfU09VUkNFKDApLAorCURFTVVYX1NPVVJDRSgxKSwKKwlERU1VWF9TT1VSQ0UoMiksCisjZGVmaW5lIERFTVVYX0ZSRUVfRklMVEVSKGkpIFwKKwlTVEJfQVRUUihkZW11eCMjaSMjX2ZyZWVfZmlsdGVycykKKwlERU1VWF9GUkVFX0ZJTFRFUigwKSwKKwlERU1VWF9GUkVFX0ZJTFRFUigxKSwKKwlERU1VWF9GUkVFX0ZJTFRFUigyKSwKKyNkZWZpbmUgREVNVVhfRklMVEVSX1VTRVJTKGkpIFwKKwlTVEJfQVRUUihkZW11eCMjaSMjX2ZpbHRlcl91c2VycykKKwlERU1VWF9GSUxURVJfVVNFUlMoMCksCisJREVNVVhfRklMVEVSX1VTRVJTKDEpLAorCURFTVVYX0ZJTFRFUl9VU0VSUygyKSwKKyNkZWZpbmUgREVNVVhfREVWX1VTRVJTKGkpIFwKKwlTVEJfQVRUUihkZW11eCMjaSMjX2Rldl91c2VycykKKwlERU1VWF9ERVZfVVNFUlMoMCksCisJREVNVVhfREVWX1VTRVJTKDEpLAorCURFTVVYX0RFVl9VU0VSUygyKSwKKyNkZWZpbmUgREVNVVhfVFNfSEVBREVSKGkpIFwKKwlTVEJfQVRUUihkZW11eCMjaSMjX3RzX2hlYWRlcikKKwlERU1VWF9UU19IRUFERVIoMCksCisJREVNVVhfVFNfSEVBREVSKDEpLAorCURFTVVYX1RTX0hFQURFUigyKSwKKyNkZWZpbmUgREVNVVhfQ0hBTk5FTF9BQ1RJVklUWV9BVFRSKGkpIFwKKwlTVEJfQVRUUihkZW11eCMjaSMjX2NoYW5uZWxfYWN0aXZpdHkpCisJREVNVVhfQ0hBTk5FTF9BQ1RJVklUWV9BVFRSKDApLAorCURFTVVYX0NIQU5ORUxfQUNUSVZJVFlfQVRUUigxKSwKKwlERU1VWF9DSEFOTkVMX0FDVElWSVRZX0FUVFIoMiksCisjZGVmaW5lIERFTVVYX1JFU0VUKGkpCVwKKwlTVEJfQVRUUihkZW11eCMjaSMjX3Jlc2V0KQorCURFTVVYX1JFU0VUKDApLAorCURFTVVYX1JFU0VUKDEpLAorCURFTVVYX1JFU0VUKDIpLAorI2RlZmluZSBEVlJfTU9ERShpKVwKKwlTVEJfQVRUUihkdnIjI2kjI19tb2RlKQorCURWUl9NT0RFKDApLAorCURWUl9NT0RFKDEpLAorCURWUl9NT0RFKDIpLAorI2RlZmluZSBBU1lOQ0ZJRk9fU09VUkNFKGkpIFwKKwlTVEJfQVRUUihhc3luY2ZpZm8jI2kjI19zb3VyY2UpCisjaWYgQVNZTkNGSUZPX0NPVU5UID4gMAorCUFTWU5DRklGT19TT1VSQ0UoMCksCisjZW5kaWYKKyNpZiBBU1lOQ0ZJRk9fQ09VTlQgPiAxCisJQVNZTkNGSUZPX1NPVVJDRSgxKSwKKyNlbmRpZgorI2lmIEFTWU5DRklGT19DT1VOVCA+IDIKKwlBU1lOQ0ZJRk9fU09VUkNFKDIpLAorI2VuZGlmCisjZGVmaW5lIEFTWU5DRklGT19GTFVTSF9TSVpFKGkpIFwKKwlTVEJfQVRUUihhc3luY2ZpZm8jI2kjI19mbHVzaF9zaXplKQorI2lmIEFTWU5DRklGT19DT1VOVCA+IDAKKwlBU1lOQ0ZJRk9fRkxVU0hfU0laRSgwKSwKKyNlbmRpZgorI2lmIEFTWU5DRklGT19DT1VOVCA+IDEKKwlBU1lOQ0ZJRk9fRkxVU0hfU0laRSgxKSwKKyNlbmRpZgorI2lmIEFTWU5DRklGT19DT1VOVCA+IDIKKwlBU1lOQ0ZJRk9fRkxVU0hfU0laRSgyKSwKKyNlbmRpZgorCisjZGVmaW5lIEFTWU5DRklGT19TRUNVUkVfQUREUihpKSBcCisJU1RCX0FUVFIoYXN5bmNmaWZvIyNpIyNfc2VjdXJlX2FkZHIpCisjaWYgQVNZTkNGSUZPX0NPVU5UID4gMAorCUFTWU5DRklGT19TRUNVUkVfQUREUigwKSwKKyNlbmRpZgorI2lmIEFTWU5DRklGT19DT1VOVCA+IDEKKwlBU1lOQ0ZJRk9fU0VDVVJFX0FERFIoMSksCisjZW5kaWYKKyNpZiBBU1lOQ0ZJRk9fQ09VTlQgPiAyCisJQVNZTkNGSUZPX1NFQ1VSRV9BRERSKDIpLAorI2VuZGlmCisKKyNkZWZpbmUgQVNZTkNGSUZPX1NFQ1VSRV9BRERSX1NJWkUoaSkgXAorCVNUQl9BVFRSKGFzeW5jZmlmbyMjaSMjX3NlY3VyZV9hZGRyX3NpemUpCisjaWYgQVNZTkNGSUZPX0NPVU5UID4gMAorCUFTWU5DRklGT19TRUNVUkVfQUREUl9TSVpFKDApLAorI2VuZGlmCisjaWYgQVNZTkNGSUZPX0NPVU5UID4gMQorCUFTWU5DRklGT19TRUNVUkVfQUREUl9TSVpFKDEpLAorI2VuZGlmCisjaWYgQVNZTkNGSUZPX0NPVU5UID4gMgorCUFTWU5DRklGT19TRUNVUkVfQUREUl9TSVpFKDIpLAorI2VuZGlmCisKKyNkZWZpbmUgQVNZTkNGSUZPX1NFQ1VSRV9FTkFCTEUoaSlcCisJU1RCX0FUVFIoYXN5bmNmaWZvIyNpIyNfc2VjdXJlX2VuYWJsZSkKKyNpZiBBU1lOQ0ZJRk9fQ09VTlQgPiAwCisJQVNZTkNGSUZPX1NFQ1VSRV9FTkFCTEUoMCksCisjZW5kaWYKKyNpZiBBU1lOQ0ZJRk9fQ09VTlQgPiAxCisJQVNZTkNGSUZPX1NFQ1VSRV9FTkFCTEUoMSksCisjZW5kaWYKKyNpZiBBU1lOQ0ZJRk9fQ09VTlQgPiAyCisJQVNZTkNGSUZPX1NFQ1VSRV9FTkFCTEUoMiksCisjZW5kaWYKKyNkZWZpbmUgRFNDX1NPVVJDRShpKSBcCisJU1RCX0FUVFIoZHNjIyNpIyNfc291cmNlKQorI2lmIERTQ19ERVZfQ09VTlQgPiAwCisJRFNDX1NPVVJDRSgwKSwKKyNlbmRpZgorI2lmIERTQ19ERVZfQ09VTlQgPiAxCisJRFNDX1NPVVJDRSgxKSwKKyNlbmRpZgorI2RlZmluZSBEU0NfRlJFRV9EU0NTKGkpIFwKKwlTVEJfQVRUUihkc2MjI2kjI19mcmVlX2RzY3MpCisjaWYgRFNDX0RFVl9DT1VOVCA+IDAKKwlEU0NfRlJFRV9EU0NTKDApLAorI2VuZGlmCisjaWYgRFNDX0RFVl9DT1VOVCA+IDEKKwlEU0NfRlJFRV9EU0NTKDEpLAorI2VuZGlmCisJTlVMTAorfTsKKworCitBVFRSSUJVVEVfR1JPVVBTKGFtbF9zdGJfY2xhc3MpOworCitzdGF0aWMgc3RydWN0IGNsYXNzIGFtbF9zdGJfY2xhc3MgPSB7CisJLm5hbWUgPSAic3RiIiwKKwkuY2xhc3NfZ3JvdXBzID0gYW1sX3N0Yl9jbGFzc19ncm91cHMsCit9OworCisvKgorICpleHRlcm4gaW50IGFtbF9yZWdpc3RfZG14X2NsYXNzKHZvaWQpOworICpleHRlcm4gaW50IGFtbF91bnJlZ2lzdF9kbXhfY2xhc3Modm9pZCk7CisgKi8KKy8qCisgKnZvaWQgYWZpZm9fcmVzZXQoaW50IHYpCisgKnsKKyAqCWlmICh2KQorICoJCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KGFtbF9kdmJfYWZpZm9fcmVzZXRfY3RsKTsKKyAqCWVsc2UKKyAqCQlyZXNldF9jb250cm9sX2RlYXNzZXJ0KGFtbF9kdmJfYWZpZm9fcmVzZXRfY3RsKTsKKyAqfQorICovCisKK3N0YXRpYyBpbnQgYW1sX2R2Yl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhbWxfZHZiICphZHZiOworCWludCBpLCByZXQgPSAwOworCXN0cnVjdCBkZXZpb19hbWxfcGxhdGZvcm1fZGF0YSAqcGRfZHZiOworCisJcHJfaW5mKCJwcm9iZSBhbWxvZ2ljIGR2YiBkcml2ZXIgWyVzXVxuIiwgRFZCX1ZFUlNJT04pOworCisJaWYgKGdldF9jcHVfdHlwZSgpIDwgTUVTT05fQ1BVX01BSk9SX0lEX0cxMkEpCisJeworCQlhbWxfZHZiX2RlbXV4X2NsayA9CisJCQlkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgImRlbXV4Iik7CisJCWlmIChJU19FUlJfT1JfTlVMTChhbWxfZHZiX2RlbXV4X2NsaykpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImdldCBkZW11eCBjbGsgZmFpbFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJY2xrX3ByZXBhcmVfZW5hYmxlKGFtbF9kdmJfZGVtdXhfY2xrKTsKKworCQlhbWxfZHZiX2FmaWZvX2NsayA9CisJCQlkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgImFzeW5jZmlmbyIpOworCQlpZiAoSVNfRVJSX09SX05VTEwoYW1sX2R2Yl9hZmlmb19jbGspKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJnZXQgYXN5bmNmaWZvIGNsayBmYWlsXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQljbGtfcHJlcGFyZV9lbmFibGUoYW1sX2R2Yl9hZmlmb19jbGspOworCisJCWFtbF9kdmJfYWhiYXJiMF9jbGsgPQorCQkJZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJhaGJhcmIwIik7CisJCWlmIChJU19FUlJfT1JfTlVMTChhbWxfZHZiX2FoYmFyYjBfY2xrKSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZ2V0IGFoYmFyYjAgY2xrIGZhaWxcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWNsa19wcmVwYXJlX2VuYWJsZShhbWxfZHZiX2FoYmFyYjBfY2xrKTsKKworCQlhbWxfZHZiX3VwYXJzZXJ0b3BfY2xrID0KKwkJCWRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAidXBhcnNlcnRvcCIpOworCQlpZiAoSVNfRVJSX09SX05VTEwoYW1sX2R2Yl91cGFyc2VydG9wX2NsaykpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImdldCB1cGFyc2VydG9wIGNsayBmYWlsXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQljbGtfcHJlcGFyZV9lbmFibGUoYW1sX2R2Yl91cGFyc2VydG9wX2Nsayk7CisJfQorCWVsc2UKKwl7CisJCWFtcG9ydHNfc3dpdGNoX2dhdGUoImRlbXV4IiwgMSk7CisJCWFtcG9ydHNfc3dpdGNoX2dhdGUoImFoYmFyYjAiLCAxKTsKKwkJYW1wb3J0c19zd2l0Y2hfZ2F0ZSgicGFyc2VyX3RvcCIsIDEpOworCQlpZiAoZ2V0X2NwdV90eXBlKCkgPT0gTUVTT05fQ1BVX01BSk9SX0lEX1RMMSkKKwkJeworCQkJYW1sX2R2Yl9hZmlmb19jbGsgPQorCQkJCWRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAiYXN5bmNmaWZvIik7CisJCQlpZiAoSVNfRVJSX09SX05VTEwoYW1sX2R2Yl9hZmlmb19jbGspKQorCQkJCWRldl9lcnIoJnBkZXYtPmRldiwgImdldCBhc3luY2ZpZm8gY2xrIGZhaWxcbiIpOworCQkJZWxzZQorCQkJCWNsa19wcmVwYXJlX2VuYWJsZShhbWxfZHZiX2FmaWZvX2Nsayk7CisJCX0KKwl9CisKKwlhZHZiID0gJmFtbF9kdmJfZGV2aWNlOworCW1lbXNldChhZHZiLCAwLCBzaXplb2YoYW1sX2R2Yl9kZXZpY2UpKTsKKworCXNwaW5fbG9ja19pbml0KCZhZHZiLT5zbG9jayk7CisKKwlhZHZiLT5kZXYgPSAmcGRldi0+ZGV2OworCWFkdmItPnBkZXYgPSBwZGV2OworCWFkdmItPnN0Yl9zb3VyY2UgPSAtMTsKKwlhZHZiLT50c29fc291cmNlID0gLTE7CisKKwlpZiAoZ2V0X2NwdV90eXBlKCkgPCBNRVNPTl9DUFVfTUFKT1JfSURfVEwxKSB7CisJCWFkdmItPnRzX2luX3RvdGFsX2NvdW50ID0gMzsKKwkJYWR2Yi0+czJwX3RvdGFsX2NvdW50ID0gMjsKKwkJYWR2Yi0+YXN5bmNfZmlmb190b3RhbF9jb3VudCA9IDI7CisJfSBlbHNlIHsKKwkJYWR2Yi0+dHNfaW5fdG90YWxfY291bnQgPSA0OworCQlhZHZiLT5zMnBfdG90YWxfY291bnQgPSAzOworCQlhZHZiLT5hc3luY19maWZvX3RvdGFsX2NvdW50ID0gMzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgRE1YX0RFVl9DT1VOVDsgaSsrKSB7CisJCWFkdmItPmRteFtpXS5kbXhfaXJxID0gLTE7CisJCWFkdmItPmRteFtpXS5kdnJfaXJxID0gLTE7CisJfQorCisjaWZkZWYgQ09ORklHX09GCisJaWYgKHBkZXYtPmRldi5vZl9ub2RlKSB7CisJCWludCBzMnBfaWQgPSAwOworCQljaGFyIGJ1ZlszMl07CisJCWNvbnN0IGNoYXIgKnN0cjsKKwkJdTMyIHZhbHVlOworCisJCWZvciAoaSA9IDA7IGkgPCBhZHZiLT50c19pbl90b3RhbF9jb3VudDsgaSsrKSB7CisKKwkJCWFkdmItPnRzW2ldLm1vZGUgPSBBTV9UU19ESVNBQkxFOworCQkJYWR2Yi0+dHNbaV0uczJwX2lkID0gLTE7CisJCQlhZHZiLT50c1tpXS5waW5jdHJsID0gTlVMTDsKKwkJCW1lbXNldChidWYsIDAsIDMyKTsKKwkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJ0cyVkIiwgaSk7CisJCQlyZXQgPQorCQkJICAgIG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKHBkZXYtPmRldi5vZl9ub2RlLCBidWYsCisJCQkJCQkgICAgJnN0cik7CisJCQlpZiAoIXJldCkgeworCQkJCWlmICghc3RyY21wKHN0ciwgInNlcmlhbCIpKSB7CisJCQkJCXByX2luZigiJXM6IHNlcmlhbFxuIiwgYnVmKTsKKworCQkJCQlpZiAoczJwX2lkID49IGFkdmItPnMycF90b3RhbF9jb3VudCkKKwkJCQkJCXByX2Vycm9yKCJubyBmcmVlIHMycFxuIik7CisJCQkJCWVsc2UgeworCQkJCQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKwkJCQkJCQkgInNfdHMlZCIsIGkpOworCQkJCQkJYWR2Yi0+dHNbaV0ubW9kZSA9IEFNX1RTX1NFUklBTDsKKwkJCQkJCWFkdmItPnRzW2ldLnBpbmN0cmwgPQorCQkJCQkJICAgIGRldm1fcGluY3RybF9nZXRfc2VsZWN0CisJCQkJCQkgICAgKCZwZGV2LT5kZXYsIGJ1Zik7CisJCQkJCQlhZHZiLT50c1tpXS5zMnBfaWQgPSBzMnBfaWQ7CisKKwkJCQkJCXMycF9pZCsrOworCQkJCQl9CisJCQkJfSBlbHNlIGlmICghc3RyY21wKHN0ciwgInBhcmFsbGVsIikpIHsKKwkJCQkJcHJfaW5mKCIlczogcGFyYWxsZWxcbiIsIGJ1Zik7CisJCQkJCW1lbXNldChidWYsIDAsIDMyKTsKKwkJCQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgInBfdHMlZCIsIGkpOworCQkJCQlhZHZiLT50c1tpXS5tb2RlID0gQU1fVFNfUEFSQUxMRUw7CisJCQkJCWFkdmItPnRzW2ldLnBpbmN0cmwgPQorCQkJCQkgICAgZGV2bV9waW5jdHJsX2dldF9zZWxlY3QoJnBkZXYtPmRldiwKKwkJCQkJCQkJICAgIGJ1Zik7CisJCQkJfSBlbHNlIHsKKwkJCQkJYWR2Yi0+dHNbaV0ubW9kZSA9IEFNX1RTX0RJU0FCTEU7CisJCQkJCWFkdmItPnRzW2ldLnBpbmN0cmwgPSBOVUxMOworCQkJCX0KKworCQkJCS8qIGlmKElTX0VSUl9WQUxVRShhZHZiLT50c1tpXS5waW5jdHJsKSkgKi8KKwkJCQkvKiBhZHZiLT50c1tpXS5waW5jdHJsID0gTlVMTDsgKi8KKwkJCX0KKwkJCW1lbXNldChidWYsIDAsIDMyKTsKKwkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJ0cyVkX2NvbnRyb2wiLCBpKTsKKwkJCXJldCA9CisJCQkgICAgb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsIGJ1ZiwKKwkJCQkJCSAmdmFsdWUpOworCQkJaWYgKCFyZXQpIHsKKwkJCQlwcl9pbmYoIiVzOiAweCV4XG4iLCBidWYsIHZhbHVlKTsKKwkJCQlhZHZiLT50c1tpXS5jb250cm9sID0gdmFsdWU7CisJCQl9IGVsc2UgeworCQkJCXByX2luZigicmVhZCBlcnJvcjolczogMHgleFxuIiwgYnVmLCB2YWx1ZSk7CisJCQl9CisKKwkJCWlmIChhZHZiLT50c1tpXS5zMnBfaWQgIT0gLTEpIHsKKwkJCQltZW1zZXQoYnVmLCAwLCAzMik7CisJCQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgInRzJWRfaW52ZXJ0IiwgaSk7CisJCQkJcmV0ID0KKwkJCQkgICAgb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsIGJ1ZiwKKwkJCQkJCQkgJnZhbHVlKTsKKwkJCQlpZiAoIXJldCkgeworCQkJCQlwcl9pbmYoIiVzOiAweCV4XG4iLCBidWYsIHZhbHVlKTsKKwkJCQkJYWR2Yi0+czJwW2FkdmItPnRzW2ldLnMycF9pZF0uaW52ZXJ0ID0KKwkJCQkJICAgIHZhbHVlOworCQkJCX0KKwkJCX0KKwkJfQorCQltZW1zZXQoYnVmLCAwLCAzMik7CisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJ0c19vdXRfaW52ZXJ0Iik7CisJCXJldCA9CisJCQlvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwgYnVmLAorCQkJCSZ2YWx1ZSk7CisJCWlmICghcmV0KSB7CisJCQlwcl9pbmYoIiVzOiAweCV4XG4iLCBidWYsIHZhbHVlKTsKKwkJCQlhZHZiLT50c19vdXRfaW52ZXJ0ID0gdmFsdWU7CisJCX0KKwkJbWVtc2V0KGJ1ZiwgMCwgMzIpOworCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAidHNpbl9kZWdsaXRjaCIpOworCQlyZXQgPQorCQkJb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsIGJ1ZiwKKwkJCQkmdmFsdWUpOworCQlpZiAoIXJldCkgeworCQkJcHJfaW5mKCIlczogMHgleFxuIiwgYnVmLCB2YWx1ZSk7CisJCQlpZiAodmFsdWUpIHsKKwkJCSAgIHByX2luZigiVFNJTkJfREVHTElUQ0gwIGlzIHNldCAlczogMHgleFxuIiwgYnVmLCB2YWx1ZSk7CisJCQkgICBkbXhfcGh5cmVnX2FjY2VzcyhUU0lOQl9ERUdMSVRDSDAsIDB4NDAsIE5VTEwpOworCQkJICAgZG14X3BoeXJlZ19hY2Nlc3MoVFNJTkJfREVHTElUQ0gxLCAweDEsIE5VTEwpOworCQkJfQorCQl9CisJfQorI2VuZGlmCisKKwlwZF9kdmIgPSAoc3RydWN0IGRldmlvX2FtbF9wbGF0Zm9ybV9kYXRhICopYWR2Yi0+ZGV2LT5wbGF0Zm9ybV9kYXRhOworCisJcmV0ID0KKwkgICAgZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJmFkdmItPmR2Yl9hZGFwdGVyLCBDQVJEX05BTUUsIFRISVNfTU9EVUxFLAorCQkJCSBhZHZiLT5kZXYsIGFkYXB0ZXJfbnIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IERNWF9ERVZfQ09VTlQ7IGkrKykKKwkJYWR2Yi0+ZG14W2ldLmlkID0gLTE7CisKKwlmb3IgKGkgPSAwOyBpPERTQ19ERVZfQ09VTlQ7IGkrKykKKwkJYWR2Yi0+ZHNjW2ldLmlkID0gLTE7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWR2Yi0+YXN5bmNfZmlmb190b3RhbF9jb3VudDsgaSsrKQorCQlhZHZiLT5hc3luY2ZpZm9baV0uaWQgPSAtMTsKKworCWFkdmItPmR2Yl9hZGFwdGVyLnByaXYgPSBhZHZiOworCWRldl9zZXRfZHJ2ZGF0YShhZHZiLT5kZXYsIGFkdmIpOworCisJZm9yIChpID0gMDsgaSA8IERTQ19ERVZfQ09VTlQ7IGkrKykgeworCQlyZXQgPSBhbWxfZHZiX2RzY19pbml0KGFkdmIsICZhZHZiLT5kc2NbaV0sIGkpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJZm9yIChpID0gMDsgaSA8IERNWF9ERVZfQ09VTlQ7IGkrKykgeworCQlyZXQgPSBhbWxfZHZiX2RteF9pbml0KGFkdmIsICZhZHZiLT5kbXhbaV0sIGkpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJLypJbml0IHRoZSBhc3luYyBmaWZvcyAqLworCWZvciAoaSA9IDA7IGkgPCBhZHZiLT5hc3luY19maWZvX3RvdGFsX2NvdW50OyBpKyspIHsKKwkJcmV0ID0gYW1sX2R2Yl9hc3luY2ZpZm9faW5pdChhZHZiLCAmYWR2Yi0+YXN5bmNmaWZvW2ldLCBpKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycm9yOworCX0KKworCWFtbF9yZWdpc3RfZG14X2NsYXNzKCk7CisKKwlpZiAoY2xhc3NfcmVnaXN0ZXIoJmFtbF9zdGJfY2xhc3MpIDwgMCkgeworCQlwcl9lcnJvcigiZHZiIHJlZ2lzdGVyIGNsYXNzIGVycm9yXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlhbWxfcmVnaXN0ZXJfcGFyc2VyX21jb25maWcoKTsKKyNpZmRlZiBFTkFCTEVfREVNVVhfRFJJVkVSCisJdHNkZW11eF9zZXRfb3BzKCZhbWxfdHNkZW11eF9vcHMpOworI2Vsc2UKKwl0c2RlbXV4X3NldF9vcHMoTlVMTCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkIENPTkZJR19BTUxPR0lDX0RWQl9FWFRFUk4gfHxcCisJCWRlZmluZWQgQ09ORklHX0FNTE9HSUNfRFZCX0VYVEVSTl9NT0RVTEUpCisJcmV0ID0gZHZiX2V4dGVybl9yZWdpc3Rlcl9mcm9udGVuZCgmYWR2Yi0+ZHZiX2FkYXB0ZXIpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyb3IoImFtbCByZWdpc3RlciBkdmIgZnJvbnRlbmQgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisjZW5kaWYKKworCXJldHVybiAwOworCitlcnJvcjoKKwlmb3IgKGkgPSAwOyBpIDwgYWR2Yi0+YXN5bmNfZmlmb190b3RhbF9jb3VudDsgaSsrKSB7CisJCWlmIChhZHZiLT5hc3luY2ZpZm9baV0uaWQgIT0gLTEpCisJCQlhbWxfZHZiX2FzeW5jZmlmb19yZWxlYXNlKGFkdmIsICZhZHZiLT5hc3luY2ZpZm9baV0pOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBETVhfREVWX0NPVU5UOyBpKyspIHsKKwkJaWYgKGFkdmItPmRteFtpXS5pZCAhPSAtMSkKKwkJCWFtbF9kdmJfZG14X3JlbGVhc2UoYWR2YiwgJmFkdmItPmRteFtpXSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IERTQ19ERVZfQ09VTlQ7IGkrKykgeworCQlpZiAoYWR2Yi0+ZHNjW2ldLmlkICE9IC0xKQorCQkJYW1sX2R2Yl9kc2NfcmVsZWFzZShhZHZiLCAmYWR2Yi0+ZHNjW2ldKTsKKwl9CisKKwlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZhZHZiLT5kdmJfYWRhcHRlcik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFtbF9kdmJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFtbF9kdmIgKmFkdmIgPSAoc3RydWN0IGFtbF9kdmIgKilkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJaW50IGk7CisKKwlwcl9pbmYoIltkbXhfa3BpXSAlcyBFbnRlci5cbiIsIF9fZnVuY19fKTsKKworI2lmIChkZWZpbmVkIENPTkZJR19BTUxPR0lDX0RWQl9FWFRFUk4gfHxcCisJCWRlZmluZWQgQ09ORklHX0FNTE9HSUNfRFZCX0VYVEVSTl9NT0RVTEUpCisJZHZiX2V4dGVybl91bnJlZ2lzdGVyX2Zyb250ZW5kKCk7CisjZW5kaWYKKworCXRzZGVtdXhfc2V0X29wcyhOVUxMKTsKKworCWFtbF91bnJlZ2lzdF9kbXhfY2xhc3MoKTsKKwljbGFzc191bnJlZ2lzdGVyKCZhbWxfc3RiX2NsYXNzKTsKKworCWZvciAoaSA9IDA7IGkgPCBhZHZiLT5hc3luY19maWZvX3RvdGFsX2NvdW50OyBpKyspIHsKKwkJaWYgKGFkdmItPmFzeW5jZmlmb1tpXS5pZCAhPSAtMSkKKwkJCWFtbF9kdmJfYXN5bmNmaWZvX3JlbGVhc2UoYWR2YiwgJmFkdmItPmFzeW5jZmlmb1tpXSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IERNWF9ERVZfQ09VTlQ7IGkrKykgeworCQlwcl9lcnJvcigicmVtb3ZlIGRlbXggJWQsIGlkIGlzICVkXG4iLGksYWR2Yi0+ZG14W2ldLmlkKTsKKwkJaWYgKGFkdmItPmRteFtpXS5pZCAhPSAtMSkKKwkJCWFtbF9kdmJfZG14X3JlbGVhc2UoYWR2YiwgJmFkdmItPmRteFtpXSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IERTQ19ERVZfQ09VTlQ7IGkrKykgeworCQlpZiAoYWR2Yi0+ZHNjW2ldLmlkICE9IC0xKQorCQkJYW1sX2R2Yl9kc2NfcmVsZWFzZShhZHZiLCAmYWR2Yi0+ZHNjW2ldKTsKKwl9CisJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmYWR2Yi0+ZHZiX2FkYXB0ZXIpOworCisJZm9yIChpID0gMDsgaSA8IGFkdmItPnRzX2luX3RvdGFsX2NvdW50OyBpKyspIHsKKwkJaWYgKGFkdmItPnRzW2ldLnBpbmN0cmwgJiYgIUlTX0VSUl9WQUxVRShhZHZiLT50c1tpXS5waW5jdHJsKSkKKwkJCWRldm1fcGluY3RybF9wdXQoYWR2Yi0+dHNbaV0ucGluY3RybCk7CisJfQorCisJLypzd2l0Y2hfbW9kX2dhdGVfYnlfbmFtZSgiZGVtdXgiLCAwKTsgKi8KKyNpZiAwCisJcmVzZXRfY29udHJvbF9hc3NlcnQoYW1sX2R2Yl91cGFyc2VydG9wX3Jlc2V0X2N0bCk7CisJcmVzZXRfY29udHJvbF9hc3NlcnQoYW1sX2R2Yl9haGJhcmIwX3Jlc2V0X2N0bCk7CisJcmVzZXRfY29udHJvbF9hc3NlcnQoYW1sX2R2Yl9hZmlmb19yZXNldF9jdGwpOworCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KGFtbF9kdmJfZGVtdXhfcmVzZXRfY3RsKTsKKyNlbHNlCisjaWYgMQorCWlmIChnZXRfY3B1X3R5cGUoKSA8IE1FU09OX0NQVV9NQUpPUl9JRF9HMTJBKQorCXsKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGFtbF9kdmJfdXBhcnNlcnRvcF9jbGspOworCQljbGtfZGlzYWJsZV91bnByZXBhcmUoYW1sX2R2Yl9haGJhcmIwX2Nsayk7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShhbWxfZHZiX2FmaWZvX2Nsayk7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShhbWxfZHZiX2RlbXV4X2Nsayk7CisJfQorCWVsc2UKKwl7CisJCWFtcG9ydHNfc3dpdGNoX2dhdGUoImRlbXV4IiwgMCk7CisJCWFtcG9ydHNfc3dpdGNoX2dhdGUoImFoYmFyYjAiLCAwKTsKKwkJYW1wb3J0c19zd2l0Y2hfZ2F0ZSgicGFyc2VyX3RvcCIsIDApOworCisJCWlmICghSVNfRVJSX09SX05VTEwoYW1sX2R2Yl9hZmlmb19jbGspKSB7CisJCQljbGtfZGlzYWJsZV91bnByZXBhcmUoYW1sX2R2Yl9hZmlmb19jbGspOworCQl9CisJfQorI2VuZGlmCisjZW5kaWYKKworCXByX2luZigiW2RteF9rcGldICVzIEV4aXQuXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1sX2R2Yl9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtbF9kdmJfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYW1sX2R2YiAqZHZiID0gJmFtbF9kdmJfZGV2aWNlOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IERNWF9ERVZfQ09VTlQ7IGkrKykKKwkJZG14X3Jlc2V0X2RteF9pZF9od19leChkdmIsIGksIDApOworCisJcHJfaW5mKCJkdmIgcmVzdW1lXG4iKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYW1sX2R2Yl9kdF9tYXRjaFtdID0geworCXsKKwkgLmNvbXBhdGlibGUgPSAiYW1sb2dpYywgZHZiLWRlbXV4IiwKKwkgfSwKKwl7fSwKK307CisjZW5kaWYgLypDT05GSUdfT0YgKi8KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYW1sX2R2Yl9kcml2ZXIgPSB7CisJLnByb2JlID0gYW1sX2R2Yl9wcm9iZSwKKwkucmVtb3ZlID0gYW1sX2R2Yl9yZW1vdmUsCisJLnN1c3BlbmQgPSBhbWxfZHZiX3N1c3BlbmQsCisJLnJlc3VtZSA9IGFtbF9kdmJfcmVzdW1lLAorCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gImFtbG9naWMtZHZiLWRlbXV4IiwKKwkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisjaWZkZWYgQ09ORklHX09GCisJICAgLm9mX21hdGNoX3RhYmxlID0gYW1sX2R2Yl9kdF9tYXRjaCwKKyNlbmRpZgorCQl9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBhbWxfZHZiX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhbWxfZHZiX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhbWxfZHZiX2V4aXQodm9pZCkKK3sKKwlwcl9pbmYoImFtbCBkdmIgZXhpdFxuIik7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFtbF9kdmJfZHJpdmVyKTsKK30KKworLypHZXQgdGhlIFNUQiBzb3VyY2UgZGVtdXgqLworc3RhdGljIHN0cnVjdCBhbWxfZG14ICpnZXRfc3RiX2RteCh2b2lkKQoreworCXN0cnVjdCBhbWxfZHZiICpkdmIgPSAmYW1sX2R2Yl9kZXZpY2U7CisJc3RydWN0IGFtbF9kbXggKmRteCA9IE5VTEw7CisJaW50IGk7CisKKwlzd2l0Y2ggKGR2Yi0+c3RiX3NvdXJjZSkgeworCWNhc2UgQU1fVFNfU1JDX0RNWDA6CisJCWRteCA9ICZkdmItPmRteFswXTsKKwkJYnJlYWs7CisJY2FzZSBBTV9UU19TUkNfRE1YMToKKwkJZG14ID0gJmR2Yi0+ZG14WzFdOworCQlicmVhazsKKwljYXNlIEFNX1RTX1NSQ19ETVgyOgorCQlkbXggPSAmZHZiLT5kbXhbMl07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZvciAoaSA9IDA7IGkgPCBETVhfREVWX0NPVU5UOyBpKyspIHsKKwkJCWRteCA9ICZkdmItPmRteFtpXTsKKwkJCWlmIChkbXgtPnNvdXJjZSA9PSBkdmItPnN0Yl9zb3VyY2UpCisJCQkJcmV0dXJuIGRteDsKKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZG14OworfQorCitzdGF0aWMgaW50IGFtbF90c2RlbXV4X3Jlc2V0KHZvaWQpCit7CisJc3RydWN0IGFtbF9kdmIgKmR2YiA9ICZhbWxfZHZiX2RldmljZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXByX2luZigiW2RteF9rcGldICVzIEVudGVyXG4iLCBfX2Z1bmNfXyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHZiLT5zbG9jaywgZmxhZ3MpOworCWlmIChkdmItPnJlc2V0X2ZsYWcpIHsKKwkJc3RydWN0IGFtbF9kbXggKmRteCA9IGdldF9zdGJfZG14KCk7CisKKwkJZHZiLT5yZXNldF9mbGFnID0gMDsKKwkJaWYgKGRteCkgeworCQkJaWYgKGRteF9yZXNldF9hbGxfZmxhZykKKwkJCQlkbXhfcmVzZXRfaHdfZXgoZHZiLCAwKTsKKwkJCWVsc2UKKwkJCQlkbXhfcmVzZXRfZG14X2h3X2V4X3VubG9jayhkdmIsIGRteCwgMCk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHZiLT5zbG9jaywgZmxhZ3MpOworCXByX2luZigiW2RteF9rcGldICVzIEV4aXRcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWxfdHNkZW11eF9zZXRfcmVzZXRfZmxhZyh2b2lkKQoreworCXN0cnVjdCBhbWxfZHZiICpkdmIgPSAmYW1sX2R2Yl9kZXZpY2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkdmItPnNsb2NrLCBmbGFncyk7CisJZHZiLT5yZXNldF9mbGFnID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdmItPnNsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKKworfQorCisvKkFkZCB0aGUgYW1zdHJlYW0gaXJxIGhhbmRsZXIqLworc3RhdGljIGludCBhbWxfdHNkZW11eF9yZXF1ZXN0X2lycShpcnFfaGFuZGxlcl90IGhhbmRsZXIsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGFtbF9kdmIgKmR2YiA9ICZhbWxfZHZiX2RldmljZTsKKwlzdHJ1Y3QgYW1sX2RteCAqZG14OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHZiLT5zbG9jaywgZmxhZ3MpOworCisJZG14ID0gZ2V0X3N0Yl9kbXgoKTsKKwlpZiAoZG14KSB7CisJCWRteC0+aXJxX2hhbmRsZXIgPSBoYW5kbGVyOworCQlkbXgtPmlycV9kYXRhID0gZGF0YTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdmItPnNsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLypGcmVlIHRoZSBhbXN0cmVhbSBpcnEgaGFuZGxlciovCitzdGF0aWMgaW50IGFtbF90c2RlbXV4X2ZyZWVfaXJxKHZvaWQpCit7CisJc3RydWN0IGFtbF9kdmIgKmR2YiA9ICZhbWxfZHZiX2RldmljZTsKKwlzdHJ1Y3QgYW1sX2RteCAqZG14OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHZiLT5zbG9jaywgZmxhZ3MpOworCisJZG14ID0gZ2V0X3N0Yl9kbXgoKTsKKwlpZiAoZG14KSB7CisJCWRteC0+aXJxX2hhbmRsZXIgPSBOVUxMOworCQlkbXgtPmlycV9kYXRhID0gTlVMTDsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdmItPnNsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLypSZXNldCB0aGUgdmlkZW8gUElEKi8KK3N0YXRpYyBpbnQgYW1sX3RzZGVtdXhfc2V0X3ZpZChpbnQgdnBpZCkKK3sKKwlzdHJ1Y3QgYW1sX2R2YiAqZHZiID0gJmFtbF9kdmJfZGV2aWNlOworCXN0cnVjdCBhbWxfZG14ICpkbXg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkdmItPnNsb2NrLCBmbGFncyk7CisJZG14ID0gZ2V0X3N0Yl9kbXgoKTsKKwlpZiAoZG14KSB7CisJCWlmIChkbXgtPnZpZF9jaGFuICE9IC0xKSB7CisJCQlkbXhfZnJlZV9jaGFuKGRteCwgZG14LT52aWRfY2hhbik7CisJCQlkbXgtPnZpZF9jaGFuID0gLTE7CisJCX0KKworCQlpZiAoKHZwaWQgPj0gMCkgJiYgKHZwaWQgPCAweDFGRkYpKSB7CisJCQlkbXgtPnZpZF9jaGFuID0KKwkJCSAgICBkbXhfYWxsb2NfY2hhbihkbXgsIERNWF9UWVBFX1RTLAorCQkJCQkJRE1YX1BFU19WSURFTywgdnBpZCk7CisJCQlpZiAoZG14LT52aWRfY2hhbiA9PSAtMSkKKwkJCQlyZXQgPSAtMTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR2Yi0+c2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qUmVzZXQgdGhlIGF1ZGlvIFBJRCovCitzdGF0aWMgaW50IGFtbF90c2RlbXV4X3NldF9haWQoaW50IGFwaWQpCit7CisJc3RydWN0IGFtbF9kdmIgKmR2YiA9ICZhbWxfZHZiX2RldmljZTsKKwlzdHJ1Y3QgYW1sX2RteCAqZG14OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHZiLT5zbG9jaywgZmxhZ3MpOworCWRteCA9IGdldF9zdGJfZG14KCk7CisJaWYgKGRteCkgeworCQlpZiAoZG14LT5hdWRfY2hhbiAhPSAtMSkgeworCQkJZG14X2ZyZWVfY2hhbihkbXgsIGRteC0+YXVkX2NoYW4pOworCQkJZG14LT5hdWRfY2hhbiA9IC0xOworCQl9CisKKwkJaWYgKChhcGlkID49IDApICYmIChhcGlkIDwgMHgxRkZGKSkgeworCQkJZG14LT5hdWRfY2hhbiA9CisJCQkgICAgZG14X2FsbG9jX2NoYW4oZG14LCBETVhfVFlQRV9UUywKKwkJCQkJCURNWF9QRVNfQVVESU8sIGFwaWQpOworCQkJaWYgKGRteC0+YXVkX2NoYW4gPT0gLTEpCisJCQkJcmV0ID0gLTE7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdmItPnNsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKlJlc2V0IHRoZSBzdWJ0aXRsZSBQSUQqLworc3RhdGljIGludCBhbWxfdHNkZW11eF9zZXRfc2lkKGludCBzcGlkKQoreworCXN0cnVjdCBhbWxfZHZiICpkdmIgPSAmYW1sX2R2Yl9kZXZpY2U7CisJc3RydWN0IGFtbF9kbXggKmRteDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmR2Yi0+c2xvY2ssIGZsYWdzKTsKKworCWRteCA9IGdldF9zdGJfZG14KCk7CisJaWYgKGRteCkgeworCQlpZiAoZG14LT5zdWJfY2hhbiAhPSAtMSkgeworCQkJZG14X2ZyZWVfY2hhbihkbXgsIGRteC0+c3ViX2NoYW4pOworCQkJZG14LT5zdWJfY2hhbiA9IC0xOworCQl9CisKKwkJaWYgKChzcGlkID49IDApICYmIChzcGlkIDwgMHgxRkZGKSkgeworCQkJZG14LT5zdWJfY2hhbiA9IDM7CisJCQlkbXgtPnN1Yl9jaGFuID0KKwkJCSAgICBkbXhfYWxsb2NfY2hhbihkbXgsIERNWF9UWVBFX1RTLAorCQkJCQkJRE1YX1BFU19TVUJUSVRMRSwgc3BpZCk7CisJCQlpZiAoZG14LT5zdWJfY2hhbiA9PSAtMSkKKwkJCQlyZXQgPSAtMTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR2Yi0+c2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYW1sX3RzZGVtdXhfc2V0X3BjcmlkKGludCBwY3JwaWQpCit7CisJc3RydWN0IGFtbF9kdmIgKmR2YiA9ICZhbWxfZHZiX2RldmljZTsKKwlzdHJ1Y3QgYW1sX2RteCAqZG14OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHZiLT5zbG9jaywgZmxhZ3MpOworCisJZG14ID0gZ2V0X3N0Yl9kbXgoKTsKKwlpZiAoZG14KSB7CisJCWlmIChkbXgtPnBjcl9jaGFuICE9IC0xKSB7CisJCQlkbXhfZnJlZV9jaGFuKGRteCwgZG14LT5wY3JfY2hhbik7CisJCQlkbXgtPnBjcl9jaGFuID0gLTE7CisJCX0KKworCQlpZiAoKHBjcnBpZCA+PSAwKSAmJiAocGNycGlkIDwgMHgxRkZGKSkgeworCQkJZG14LT5wY3JfY2hhbiA9CisJCQkgICAgZG14X2FsbG9jX2NoYW4oZG14LCBETVhfVFlQRV9UUywKKwkJCQkJCURNWF9QRVNfUENSLCBwY3JwaWQpOworCQkJaWYgKGRteC0+cGNyX2NoYW4gPT0gLTEpCisJCQkJcmV0ID0gLTE7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdmItPnNsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFtbF90c2RlbXV4X3NldF9za2lwYnl0ZShpbnQgc2tpcGJ5dGUpCit7CisJc3RydWN0IGFtbF9kdmIgKmR2YiA9ICZhbWxfZHZiX2RldmljZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmR2Yi0+c2xvY2ssIGZsYWdzKTsKKwlhbWxfZG14X3NldF9za2lwYnl0ZShkdmIsIHNraXBieXRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdmItPnNsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWxfdHNkZW11eF9zZXRfZGVtdXgoaW50IGlkKQoreworCXN0cnVjdCBhbWxfZHZiICpkdmIgPSAmYW1sX2R2Yl9kZXZpY2U7CisKKwlhbWxfZG14X3NldF9kZW11eChkdmIsIGlkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYW1sX3RzZGVtdXhfaHdkbXhfc3Bpbl9sb2NrKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IGFtbF9kdmIgKmR2YiA9ICZhbWxfZHZiX2RldmljZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkdmItPnNsb2NrLCBmbGFncyk7CisJcmV0dXJuIGZsYWdzOworfQorCitzdGF0aWMgaW50IGFtbF90c2RlbXV4X2h3ZG14X3NwaW5fdW5sb2NrKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IGFtbF9kdmIgKmR2YiA9ICZhbWxfZHZiX2RldmljZTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR2Yi0+c2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQoYW1sX2R2Yl9pbml0KTsKK21vZHVsZV9leGl0KGFtbF9kdmJfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiZHJpdmVyIGZvciB0aGUgQU1Mb2dpYyBEVkIgY2FyZCIpOworTU9EVUxFX0FVVEhPUigiQU1MT0dJQyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2h3X2RlbXV4L2FtbF9kdmIuaCBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9od19kZW11eC9hbWxfZHZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JmY2UzOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9od19kZW11eC9hbWxfZHZiLmgKQEAgLTAsMCArMSw0MDQgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNyBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisqIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyoKKyogRGVzY3JpcHRpb246CisqLworI2lmbmRlZiBfQU1MX0RWQl9IXworI2RlZmluZSBfQU1MX0RWQl9IXworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisKKyNpbmNsdWRlIDxsaW51eC9kdmIvdmlkZW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kdmIvYXVkaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kdmIvZG14Lmg+CisjaW5jbHVkZSA8bGludXgvZHZiL2NhLmg+CisjaW5jbHVkZSA8bGludXgvZHZiL29zZC5oPgorI2luY2x1ZGUgPGxpbnV4L2R2Yi9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kdmIvZnJvbnRlbmQuaD4KKworI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECisjaW5jbHVkZSA8bGludXgvZWFybHlzdXNwZW5kLmg+CisjZW5kaWYKKworCisjaW5jbHVkZSA8ZHZiZGV2Lmg+CisjaW5jbHVkZSA8ZGVtdXguaD4KKyNpbmNsdWRlIDxkdmJfZGVtdXguaD4KKyNpbmNsdWRlIDxkbXhkZXYuaD4KKyNpbmNsdWRlIDxkdmJfZmlsdGVyLmg+CisjaW5jbHVkZSA8ZHZiX25ldC5oPgorI2luY2x1ZGUgPGR2Yl9yaW5nYnVmZmVyLmg+CisKKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvY29uc3VtZXIuaD4KKworI2luY2x1ZGUgImFtbF9kZW1vZF9ndC5oIgorCisjZGVmaW5lIFRTX0lOX0NPVU5UICAgICAgIDQKKyNkZWZpbmUgUzJQX0NPVU5UICAgICAgICAgMworI2RlZmluZSBBU1lOQ0ZJRk9fQ09VTlQgICAzCisjaWYgMAorI2RlZmluZSBUU19JTl9DT1VOVCAgICAgICAzCisjZGVmaW5lIFMyUF9DT1VOVCAgICAgICAgIDIKKyNkZWZpbmUgQVNZTkNGSUZPX0NPVU5UICAgMgorI2VuZGlmCisKKyNkZWZpbmUgRE1YX0RFVl9DT1VOVCAgICAgMworI2RlZmluZSBGRV9ERVZfQ09VTlQgICAgICAyCisjZGVmaW5lIENIQU5ORUxfQ09VTlQgICAgIDMxCisjZGVmaW5lIEZJTFRFUl9DT1VOVCAgICAgIDMxCisjZGVmaW5lIEZJTFRFUl9MRU4gICAgICAgIDE1CisjZGVmaW5lIERTQ19ERVZfQ09VTlQgICAgIDIKKyNkZWZpbmUgRFNDX0NPVU5UICAgICAgICAgOAorI2RlZmluZSBTRUNfQlVGX0dSUF9DT1VOVCA0CisjZGVmaW5lIFNFQ19CVUZfQlVTWV9TSVpFIDQKKyNkZWZpbmUgU0VDX0JVRl9DT1VOVCAgICAgKFNFQ19CVUZfR1JQX0NPVU5UKjgpCisKKworc3RydWN0IGFtbF9zZWNfYnVmIHsKKwl1bnNpZ25lZCBsb25nICAgICAgICBhZGRyOworCWludCAgICAgICAgICAgICAgICAgIGxlbjsKK307CisKK3N0cnVjdCBhbWxfY2hhbm5lbCB7CisJaW50ICAgICAgICAgICAgICAgICAgdHlwZTsKKwllbnVtIGRteF90c19wZXMJcGVzX3R5cGU7CisJaW50ICAgICAgICAgICAgICAgICAgcGlkOworCWludCAgICAgICAgICAgICAgICAgIHVzZWQ7CisJaW50ICAgICAgICAgICAgICAgICAgZmlsdGVyX2NvdW50OworCXN0cnVjdCBkdmJfZGVtdXhfZmVlZCAgICAgKmZlZWQ7CisJc3RydWN0IGR2Yl9kZW11eF9mZWVkICAgICAqZHZyX2ZlZWQ7CisJaW50ICAgICAgICAgICAgICAgICAgcGt0X3R5cGU7Cit9OworCitzdHJ1Y3QgYW1sX2ZpbHRlciB7CisJaW50ICAgICAgICAgICAgICAgICAgY2hhbl9pZDsKKwlpbnQgICAgICAgICAgICAgICAgICB1c2VkOworCXN0cnVjdCBkbXhfc2VjdGlvbl9maWx0ZXIgKmZpbHRlcjsKKwl1OCAgICAgICAgICAgICAgICAgICB2YWx1ZVtGSUxURVJfTEVOXTsKKwl1OCAgICAgICAgICAgICAgICAgICBtYXNrYW5kbW9kZVtGSUxURVJfTEVOXTsKKwl1OCAgICAgICAgICAgICAgICAgICBtYXNrYW5kbm90bW9kZVtGSUxURVJfTEVOXTsKKwl1OCAgICAgICAgICAgICAgICAgICBuZXE7Cit9OworCisjZGVmaW5lIERWQkNTQV9NT0RFIDAKKyNkZWZpbmUgQ0lQTFVTX01PREUgMQorI2RlZmluZSBDQkNfTU9ERSAwCisjZGVmaW5lIEVDQl9NT0RFIDEKKyNkZWZpbmUgSURTQV9NT0RFIDIKKworI2RlZmluZSBEU0NfU0VUX0VWRU4gICAgIDEKKyNkZWZpbmUgRFNDX1NFVF9PREQgICAgICAyCisjZGVmaW5lIERTQ19TRVRfQUVTX0VWRU4gNAorI2RlZmluZSBEU0NfU0VUX0FFU19PREQgIDgKKyNkZWZpbmUgRFNDX0ZST01fS0wgICAgICAxNgorI2RlZmluZSBEU0NfU0VUX1NNNF9FVkVOIDMyCisjZGVmaW5lIERTQ19TRVRfU000X09ERCAgNjQKKworI2RlZmluZSBEU0NfS0VZX1NJWkVfTUFYIDE2CisKK3N0cnVjdCBhbWxfZHNjX2NoYW5uZWwgeworCWludCAgICAgICAgICAgICAgICAgIHBpZDsKKwl1OCAgICAgICAgICAgICAgICAgICBldmVuW0RTQ19LRVlfU0laRV9NQVhdOworCXU4ICAgICAgICAgICAgICAgICAgIG9kZFtEU0NfS0VZX1NJWkVfTUFYXTsKKwl1OCAgICAgICAgICAgICAgICAgICBldmVuX2l2W0RTQ19LRVlfU0laRV9NQVhdOworCXU4ICAgICAgICAgICAgICAgICAgIG9kZF9pdltEU0NfS0VZX1NJWkVfTUFYXTsKKwlpbnQgICAgICAgICAgICAgICAgICB1c2VkOworCWludCAgICAgICAgICAgICAgICAgIHNldDsKKwlpbnQgICAgICAgICAgICAgICAgICBpZDsKKwlzdHJ1Y3QgYW1sX2RzYyAgICAgICpkc2M7CisJaW50ICAgICAgICAgICAgICAgICAgd29ya19tb2RlOworCWludCAgICAgICAgICAgICAgICAgIG1vZGU7Cit9OworCitzdHJ1Y3QgYW1sX2RzYyB7CisJc3RydWN0IGR2Yl9kZXZpY2UgICAqZGV2OworCXN0cnVjdCBhbWxfZHNjX2NoYW5uZWwgY2hhbm5lbFtEU0NfQ09VTlRdOworCWVudW0gYW1sX3RzX3NvdXJjZV90ICAgc291cmNlOworCWVudW0gYW1sX3RzX3NvdXJjZV90ICAgZHN0OworCXN0cnVjdCBhbWxfZHZiICAgICAgKmR2YjsKKwlpbnQgICAgICAgICAgICAgICAgIGlkOworCWludCAgICAgICAgICAgICAgICAgIHdvcmtfbW9kZTsKK307CisKK3N0cnVjdCBhbWxfc21hbGxzZWMgeworCXN0cnVjdCBhbWxfZG14ICpkbXg7CisKKwlpbnQJZW5hYmxlOworCWludAlidWZzaXplOworI2RlZmluZSBTU19CVUZTSVpFX0RFRiAoMTYqNCoyNTYpIC8qMTZLQiovCisJbG9uZwlidWY7CisJbG9uZwlidWZfbWFwOworfTsKKworc3RydWN0IGFtbF9kbXh0aW1lb3V0IHsKKwlzdHJ1Y3QgYW1sX2RteCAqZG14OworCisJaW50CWVuYWJsZTsKKworCWludAl0aW1lb3V0OworI2RlZmluZSBEVE9fVElNRU9VVF9ERUYgKDkwMDApICAgICAgIC8qMC41cyovCisJdTMyCWNoX2Rpc2FibGU7CisjZGVmaW5lIERUT19DSERJU19WQVMgICAoMHhmZmZmZmZmOCkgLyp2L2EvcyBvbmx5Ki8KKwlpbnQJbWF0Y2g7CisKKwlpbnQgICAgIHRyaWdnZXI7Cit9OworCitzdHJ1Y3QgYW1sX2RteCB7CisJc3RydWN0IGR2Yl9kZW11eCAgICAgZGVtdXg7CisJc3RydWN0IGRteGRldiAgICAgICAgZG14ZGV2OworCWludCAgICAgICAgICAgICAgICAgIGlkOworCWludCAgICAgICAgICAgICAgICAgIGZlZWRfY291bnQ7CisJaW50ICAgICAgICAgICAgICAgICAgY2hhbl9jb3VudDsKKwllbnVtIGFtbF90c19zb3VyY2VfdCAgICAgIHNvdXJjZTsKKwlpbnQgICAgICAgICAgICAgICAgICBpbml0OworCWludCAgICAgICAgICAgICAgICAgIHJlY29yZDsKKwlzdHJ1Y3QgZG14X2Zyb250ZW5kICBod19mZVtETVhfREVWX0NPVU5UXTsKKwlzdHJ1Y3QgZG14X2Zyb250ZW5kICBtZW1fZmU7CisJc3RydWN0IGR2Yl9uZXQgICAgICAgZHZiX25ldDsKKwlpbnQgICAgICAgICAgICAgICAgICBkbXhfaXJxOworCWludCAgICAgICAgICAgICAgICAgIGR2cl9pcnE7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0ICAgICBkbXhfdGFza2xldDsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgICAgIGR2cl90YXNrbGV0OworCXVuc2lnbmVkIGxvbmcgICAgICAgIHNlY19wYWdlczsKKwl1bnNpZ25lZCBsb25nICAgICAgICBzZWNfcGFnZXNfbWFwOworCWludCAgICAgICAgICAgICAgICAgIHNlY190b3RhbF9sZW47CisJc3RydWN0IGFtbF9zZWNfYnVmICAgc2VjX2J1ZltTRUNfQlVGX0NPVU5UXTsKKwl1bnNpZ25lZCBsb25nICAgICAgICBwZXNfcGFnZXM7CisJdW5zaWduZWQgbG9uZyAgICAgICAgcGVzX3BhZ2VzX21hcDsKKwlpbnQgICAgICAgICAgICAgICAgICBwZXNfYnVmX2xlbjsKKwl1bmlvbiB7CisJCXVuc2lnbmVkIGxvbmcgICAgICAgc3ViX3BhZ2VzOworCQl1bnNpZ25lZCBsb25nICAgICAgIHN1Yl9idWZfYmFzZTsKKwl9OworCXVuaW9uIHsKKwkJdW5zaWduZWQgbG9uZyAgICAgICBzdWJfcGFnZXNfbWFwOworCQl1OCAgICAgICAgICAgICAgICAgICpzdWJfYnVmX2Jhc2VfdmlydDsKKwl9OworCWludCAgICAgICAgICAgICAgICAgIHN1Yl9idWZfbGVuOworCisJc3RydWN0IGFtbF9jaGFubmVsICAgY2hhbm5lbFtDSEFOTkVMX0NPVU5UKzFdOworCXN0cnVjdCBhbWxfZmlsdGVyICAgIGZpbHRlcltGSUxURVJfQ09VTlQrMV07CisJaXJxX2hhbmRsZXJfdCAgICAgICAgaXJxX2hhbmRsZXI7CisJdm9pZCAgICAgICAgICAgICAgICAqaXJxX2RhdGE7CisJaW50ICAgICAgICAgICAgICAgICAgYXVkX2NoYW47CisJaW50ICAgICAgICAgICAgICAgICAgdmlkX2NoYW47CisJaW50ICAgICAgICAgICAgICAgICAgc3ViX2NoYW47CisJaW50ICAgICAgICAgICAgICAgICAgcGNyX2NoYW47CisJdTMyICAgICAgICAgICAgICAgICAgc2VjdGlvbl9idXN5W1NFQ19CVUZfQlVTWV9TSVpFXTsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZTsKKwlpbnQgICAgICAgICAgICAgICAgICBpbnRfY2hlY2tfY291bnQ7CisJdTMyICAgICAgICAgICAgICAgICAgaW50X2NoZWNrX3RpbWU7CisJaW50ICAgICAgICAgICAgICAgICAgaW5fdHVuZTsKKwlpbnQgICAgICAgICAgICAgICAgICBlcnJvcl9jaGVjazsKKwlpbnQgICAgICAgICAgICAgICAgICBkdW1wX3RzX3NlbGVjdDsKKwlpbnQgICAgICAgICAgICAgICAgICBzZWNfYnVmX3dhdGNoZG9nX2NvdW50W1NFQ19CVUZfQ09VTlRdOworCisJc3RydWN0IGFtbF9zbWFsbHNlYyAgc21hbGxzZWM7CisJc3RydWN0IGFtbF9kbXh0aW1lb3V0IHRpbWVvdXQ7CisKKwlpbnQgICAgICAgICAgICAgICAgICBkZW11eF9maWx0ZXJfdXNlcjsKKworCXVuc2lnbmVkIGxvbmcgc2VjX2NudFszXTsKKwl1bnNpZ25lZCBsb25nIHNlY19jbnRfbWF0Y2hbM107CisJdW5zaWduZWQgbG9uZyBzZWNfY250X2NyY19mYWlsWzNdOworCSNkZWZpbmUgU0VDX0NOVF9IVyAoMCkKKwkjZGVmaW5lIFNFQ19DTlRfU1cgKDEpCisJI2RlZmluZSBTRUNfQ05UX1NTICgyKQorCSNkZWZpbmUgU0VDX0NOVF9NQVggKDMpCisKKwlpbnQgICAgICAgICAgICAgICAgICAgY3JjX2NoZWNrX2NvdW50OworCXUzMiAgICAgICAgICAgICAgICAgY3JjX2NoZWNrX3RpbWU7CisJaW50ICAgICAgICAgICAgICAgICBvbV9zdGF0dXNfZXJyb3JfY291bnQ7Cit9OworCitzdHJ1Y3QgYW1sX2R2cl9ibG9jayB7CisJdTMyCWFkZHI7CisJdTMyCWxlbjsKK307CisKK3N0cnVjdCBhbWxfYXN5bmNmaWZvIHsKKwlpbnQJaWQ7CisJaW50CWluaXQ7CisJaW50CWFzeW5jZmlmb19pcnE7CisJZW51bSBhbWxfZG14X2lkX3QJc291cmNlOworCXVuc2lnbmVkIGxvbmcJcGFnZXM7CisJdW5zaWduZWQgbG9uZyAgIHBhZ2VzX21hcDsKKwlpbnQJYnVmX2xlbjsKKwlpbnQJYnVmX3RvZ2dsZTsKKwlpbnQgYnVmX3JlYWQ7CisJaW50IGZsdXNoX3NpemU7CisJaW50IHNlY3VyZV9lbmFibGU7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0ICAgICBhc3luY2ZpZm9fdGFza2xldDsKKwlzdHJ1Y3QgYW1sX2R2YiAqZHZiOworCXN0cnVjdCBhbWxfZHZyX2Jsb2NrIGJsazsKKwl1bnNpZ25lZCBsb25nIHN0b3JlZF9wYWdlczsKK307CisKK2VudW17CisJQU1fVFNfRElTQUJMRSwKKwlBTV9UU19QQVJBTExFTCwKKwlBTV9UU19TRVJJQUwKK307CisKK3N0cnVjdCBhbWxfdHNfaW5wdXQgeworCWludCAgICAgICAgICAgICAgICAgIG1vZGU7CisJc3RydWN0IHBpbmN0cmwgICAgICAqcGluY3RybDsKKwlpbnQgICAgICAgICAgICAgICAgICBjb250cm9sOworCWludCAgICAgICAgICAgICAgICAgIHMycF9pZDsKK307CisKK3N0cnVjdCBhbWxfczJwIHsKKwlpbnQgICAgaW52ZXJ0OworfTsKKworc3RydWN0IGFtbF9zd2ZpbHRlciB7CisJaW50ICAgIHVzZXI7CisJc3RydWN0IGFtbF9kbXggKmRteDsKKwlzdHJ1Y3QgYW1sX2FzeW5jZmlmbyAqYWZpZm87CisKKwlzdHJ1Y3QgZHZiX3JpbmdidWZmZXIgcmJ1ZjsKKyNkZWZpbmUgU0ZfQlVGRkVSX1NJWkUgKDEwKjE4OCoxMDI0KQorCisJdTggICAgIHdyYXBidWZbMTg4XTsKKwlpbnQgICAgdHJhY2tfZG14OworfTsKKworc3RydWN0IGFtbF9kdmIgeworCXN0cnVjdCBkdmJfZGV2aWNlICAgIGR2Yl9kZXY7CisJaW50IHRzX2luX3RvdGFsX2NvdW50OworCXN0cnVjdCBhbWxfdHNfaW5wdXQgIHRzW1RTX0lOX0NPVU5UXTsKKwlpbnQgczJwX3RvdGFsX2NvdW50OworCXN0cnVjdCBhbWxfczJwICAgICAgIHMycFtTMlBfQ09VTlRdOworCXN0cnVjdCBhbWxfZG14ICAgICAgIGRteFtETVhfREVWX0NPVU5UXTsKKwlzdHJ1Y3QgYW1sX2RzYyAgICAgICBkc2NbRFNDX0RFVl9DT1VOVF07CisJaW50IGFzeW5jX2ZpZm9fdG90YWxfY291bnQ7CisJc3RydWN0IGFtbF9hc3luY2ZpZm8gYXN5bmNmaWZvW0FTWU5DRklGT19DT1VOVF07CisJc3RydWN0IGR2Yl9hZGFwdGVyICAgZHZiX2FkYXB0ZXI7CisJc3RydWN0IGRldmljZSAgICAgICAqZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJZW51bSBhbWxfdHNfc291cmNlX3QgICAgICBzdGJfc291cmNlOworCWVudW0gYW1sX3RzX3NvdXJjZV90ICAgICAgdHNvX3NvdXJjZTsKKwlpbnQgICAgICAgICAgICAgICAgICBkbXhfaW5pdDsKKwlpbnQgICAgICAgICAgICAgICAgICByZXNldF9mbGFnOworCXNwaW5sb2NrX3QgICAgICAgICAgIHNsb2NrOworCXN0cnVjdCB0aW1lcl9saXN0ICAgIHdhdGNoZG9nX3RpbWVyOworCWludCAgICAgICAgICAgICAgICAgIGRteF93YXRjaGRvZ19kaXNhYmxlW0RNWF9ERVZfQ09VTlRdOworCXN0cnVjdCBhbWxfc3dmaWx0ZXIgIHN3ZmlsdGVyOworCWludAl0c19vdXRfaW52ZXJ0OworCisJLypidWZzIGZvciBkbXggc2hhcmVkKi8KKwl1bnNpZ25lZCBsb25nICAgICAgICBwZXNfcGFnZXM7CisJdW5zaWduZWQgbG9uZyAgICAgICAgcGVzX3BhZ2VzX21hcDsKKwlpbnQgICAgICAgICAgICAgICAgICBwZXNfYnVmX2xlbjsKKwl1bnNpZ25lZCBsb25nICAgICAgICBzdWJfcGFnZXM7CisJdW5zaWduZWQgbG9uZyAgICAgICAgc3ViX3BhZ2VzX21hcDsKKwlpbnQgICAgICAgICAgICAgICAgICBzdWJfYnVmX2xlbjsKK307CisKKworLypBTUxvZ2ljIGRlbXV4IGludGVyZmFjZSovCitleHRlcm4gaW50IGFtbF9kbXhfaHdfaW5pdChzdHJ1Y3QgYW1sX2RteCAqZG14KTsKK2V4dGVybiBpbnQgYW1sX2RteF9od19kZWluaXQoc3RydWN0IGFtbF9kbXggKmRteCk7CitleHRlcm4gaW50IGFtbF9kbXhfaHdfc3RhcnRfZmVlZChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2YmRteGZlZWQpOworZXh0ZXJuIGludCBhbWxfZG14X2h3X3N0b3BfZmVlZChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2YmRteGZlZWQpOworZXh0ZXJuIGludCBhbWxfZG14X2h3X3NldF9zb3VyY2Uoc3RydWN0IGRteF9kZW11eCAqZGVtdXgsCisJCQkJCWRteF9zb3VyY2VfdCBzcmMpOworZXh0ZXJuIGludCBhbWxfc3RiX2h3X3NldF9zb3VyY2Uoc3RydWN0IGFtbF9kdmIgKmR2YiwgZG14X3NvdXJjZV90IHNyYyk7CitleHRlcm4gaW50IGFtbF9kc2NfaHdfc2V0X3NvdXJjZShzdHJ1Y3QgYW1sX2RzYyAqZHNjLAorCQkJCWRteF9zb3VyY2VfdCBzcmMsIGRteF9zb3VyY2VfdCBkc3QpOworZXh0ZXJuIGludCBhbWxfdHNvX2h3X3NldF9zb3VyY2Uoc3RydWN0IGFtbF9kdmIgKmR2YiwgZG14X3NvdXJjZV90IHNyYyk7CitleHRlcm4gaW50IGFtbF9kbXhfc2V0X3NraXBieXRlKHN0cnVjdCBhbWxfZHZiICpkdmIsIGludCBza2lwYnl0ZSk7CitleHRlcm4gaW50IGFtbF9kbXhfc2V0X2RlbXV4KHN0cnVjdCBhbWxfZHZiICpkdmIsIGludCBpZCk7CitleHRlcm4gaW50IGFtbF9kbXhfaHdfc2V0X2R1bXBfdHNfc2VsZWN0CisJCShzdHJ1Y3QgZG14X2RlbXV4ICpkZW11eCwgaW50IGR1bXBfdHNfc2VsZWN0KTsKKworZXh0ZXJuIGludCAgZG14X2FsbG9jX2NoYW4oc3RydWN0IGFtbF9kbXggKmRteCwgaW50IHR5cGUsCisJCQkJaW50IHBlc190eXBlLCBpbnQgcGlkKTsKK2V4dGVybiB2b2lkIGRteF9mcmVlX2NoYW4oc3RydWN0IGFtbF9kbXggKmRteCwgaW50IGNpZCk7CisKK2V4dGVybiBpbnQgZG14X2dldF90c19zZXJpYWwoZW51bSBhbWxfdHNfc291cmNlX3Qgc3JjKTsKKworZXh0ZXJuIGludCBkbXhfZ2V0X3N1Yl9idWZmZXIodW5zaWduZWQgbG9uZyAqYmFzZSwgdW5zaWduZWQgbG9uZyAqdmlydCk7CitleHRlcm4gaW50IGRteF9pbml0X3N1Yl9idWZmZXIoc3RydWN0IGFtbF9kbXggKmRteCwgdW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIHZpcnQpOworCisvKkFNTG9naWMgZHNjIGludGVyZmFjZSovCitleHRlcm4gaW50IGRzY19zZXRfcGlkKHN0cnVjdCBhbWxfZHNjX2NoYW5uZWwgKmNoLCBpbnQgcGlkKTsKK2V4dGVybiBpbnQgZHNjX3NldF9rZXkoc3RydWN0IGFtbF9kc2NfY2hhbm5lbCAqY2gsIGludCBmbGFncywKKwkJCQkJZW51bSBjYV9jd190eXBlIHR5cGUsIHU4ICprZXkpOworZXh0ZXJuIHZvaWQgZHNjX3JlbGVhc2Uodm9pZCk7CitleHRlcm4gaW50IGFtbF9jaXBsdXNfaHdfc2V0X3NvdXJjZShpbnQgc3JjKTsKKworLypBTUxvZ2ljIEFTWU5DIEZJRk8gaW50ZXJmYWNlKi8KK2V4dGVybiBpbnQgYW1sX2FzeW5jZmlmb19od19pbml0KHN0cnVjdCBhbWxfYXN5bmNmaWZvICphZmlmbyk7CitleHRlcm4gaW50IGFtbF9hc3luY2ZpZm9faHdfZGVpbml0KHN0cnVjdCBhbWxfYXN5bmNmaWZvICphZmlmbyk7CitleHRlcm4gaW50IGFtbF9hc3luY2ZpZm9faHdfc2V0X3NvdXJjZShzdHJ1Y3QgYW1sX2FzeW5jZmlmbyAqYWZpZm8sCisJCQkJCWVudW0gYW1sX2RteF9pZF90IHNyYyk7CitleHRlcm4gaW50IGFtbF9hc3luY2ZpZm9faHdfcmVzZXQoc3RydWN0IGFtbF9hc3luY2ZpZm8gKmFmaWZvKTsKKworLypHZXQgdGhlIEF1ZGlvICYgVmlkZW8gUFRTKi8KK2V4dGVybiB1MzIgYW1sX2RteF9nZXRfdmlkZW9fcHRzKHN0cnVjdCBhbWxfZHZiICpkdmIpOworZXh0ZXJuIHUzMiBhbWxfZG14X2dldF9hdWRpb19wdHMoc3RydWN0IGFtbF9kdmIgKmR2Yik7CitleHRlcm4gdTMyIGFtbF9kbXhfZ2V0X3ZpZGVvX3B0c19iaXQzMihzdHJ1Y3QgYW1sX2R2YiAqZHZiKTsKK2V4dGVybiB1MzIgYW1sX2RteF9nZXRfYXVkaW9fcHRzX2JpdDMyKHN0cnVjdCBhbWxfZHZiICpkdmIpOworZXh0ZXJuIHUzMiBhbWxfZG14X2dldF9maXJzdF92aWRlb19wdHMoc3RydWN0IGFtbF9kdmIgKmR2Yik7CitleHRlcm4gdTMyIGFtbF9kbXhfZ2V0X2ZpcnN0X2F1ZGlvX3B0cyhzdHJ1Y3QgYW1sX2R2YiAqZHZiKTsKKworLypHZXQgdGhlIERWQiBkZXZpY2UqLworZXh0ZXJuIHN0cnVjdCBhbWxfZHZiICphbWxfZ2V0X2R2Yl9kZXZpY2Uodm9pZCk7CisKK2V4dGVybiBpbnQgYW1sX3JlZ2lzdF9kbXhfY2xhc3Modm9pZCk7CitleHRlcm4gaW50IGFtbF91bnJlZ2lzdF9kbXhfY2xhc3Modm9pZCk7CitleHRlcm4gdm9pZCBhbWxfcmVnaXN0ZXJfcGFyc2VyX21jb25maWcodm9pZCk7CisKK2V4dGVybiBpbnQgZG14X3BoeXJlZ19hY2Nlc3ModW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IHdyaXRldmFsLAorCQkgICB1bnNpZ25lZCBpbnQgKnJlYWR2YWwpOworCitzdHJ1Y3QgZGV2aW9fYW1sX3BsYXRmb3JtX2RhdGEgeworCWludCAoKmlvX3NldHVwKSh2b2lkICopOworCWludCAoKmlvX2NsZWFudXApKHZvaWQgKik7CisJaW50ICgqaW9fcG93ZXIpKHZvaWQgKiwgaW50IGVuYWJsZSk7CisJaW50ICgqaW9fcmVzZXQpKHZvaWQgKiwgaW50IGVuYWJsZSk7Cit9OworCit2b2lkIGdldF9hbWxfZHZiKHN0cnVjdCBhbWxfZHZiICpkdmJfZGV2aWNlKTsKKworLypSZXNldCB0aGUgZGVtdXggZGV2aWNlKi8KK3ZvaWQgZG14X3Jlc2V0X2h3KHN0cnVjdCBhbWxfZHZiICpkdmIpOwordm9pZCBkbXhfcmVzZXRfaHdfZXgoc3RydWN0IGFtbF9kdmIgKmR2YiwgaW50IHJlc2V0X2lycSk7CisKKy8qUmVzZXQgdGhlIGluZGl2aWR1YWwgZGVtdXgqLwordm9pZCBkbXhfcmVzZXRfZG14X2h3KHN0cnVjdCBhbWxfZHZiICpkdmIsIGludCBpZCk7Cit2b2lkIGRteF9yZXNldF9kbXhfaWRfaHdfZXgoc3RydWN0IGFtbF9kdmIgKmR2YiwgaW50IGlkLCBpbnQgcmVzZXRfaXJxKTsKK3ZvaWQgZG14X3Jlc2V0X2RteF9pZF9od19leF91bmxvY2soc3RydWN0IGFtbF9kdmIgKmR2YiwgaW50IGlkLCBpbnQgcmVzZXRfaXJxKTsKK3ZvaWQgZG14X3Jlc2V0X2RteF9od19leChzdHJ1Y3QgYW1sX2R2YiAqZHZiLAorCQkJCXN0cnVjdCBhbWxfZG14ICpkbXgsCisJCQkJaW50IHJlc2V0X2lycSk7Cit2b2lkIGRteF9yZXNldF9kbXhfaHdfZXhfdW5sb2NrKHN0cnVjdCBhbWxfZHZiICpkdmIsCisJCQkJc3RydWN0IGFtbF9kbXggKmRteCwKKwkJCQlpbnQgcmVzZXRfaXJxKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9od19kZW11eC9hbWxfZHZiX3JlZy5oIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2h3X2RlbXV4L2FtbF9kdmJfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM0NzY4OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9od19kZW11eC9hbWxfZHZiX3JlZy5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvZHZiX3R2L2R2Yl9yZWcuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9EVkJfUkVHX0hfCisjZGVmaW5lIF9EVkJfUkVHX0hfCisKKy8vI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvaW9tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3JlZ2lzdGVycy9yZWdpc3Rlcl9tYXAuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvcmVnaXN0ZXJzL2NwdV92ZXJzaW9uLmg+CisKKyNkZWZpbmUgSURfU1RCX0NCVVNfQkFTRQkJMAorI2RlZmluZSBJRF9TTUFSVENBUkRfUkVHX0JBU0UJCTEKKyNkZWZpbmUgSURfQVNZTkNfRklGT19SRUdfQkFTRQkJMgorI2RlZmluZSBJRF9BU1lOQ19GSUZPMV9SRUdfQkFTRQkJMworI2RlZmluZSBJRF9BU1lOQ19GSUZPMl9SRUdfQkFTRQk0CisjZGVmaW5lIElEX1JFU0VUX0JBU0UJCQk1CisjZGVmaW5lIElEX1BBUlNFUl9TVUJfU1RBUlRfUFRSX0JBU0UJNgorCitsb25nIGFtbF9zdGJfZ2V0X2Jhc2UoaW50IGlkKTsKKyNpbmNsdWRlICJjX3N0Yl9kZWZpbmUuaCIKKyNpbmNsdWRlICJjX3N0Yl9yZWdzX2RlZmluZS5oIgorCisjZGVmaW5lIFdSSVRFX01QRUdfUkVHKF9yLCBfdikgICBhbWxfd3JpdGVfY2J1cyhfciwgX3YpCisjZGVmaW5lIFJFQURfTVBFR19SRUcoX3IpICAgICAgICBhbWxfcmVhZF9jYnVzKF9yKQorCisjZGVmaW5lIFdSSVRFX0NCVVNfUkVHKF9yLCBfdikgICBhbWxfd3JpdGVfY2J1cyhfciwgX3YpCisjZGVmaW5lIFJFQURfQ0JVU19SRUcoX3IpICAgICAgICBhbWxfcmVhZF9jYnVzKF9yKQorCisjZGVmaW5lIFdSSVRFX1ZDQlVTX1JFRyhfciwgX3YpICBhbWxfd3JpdGVfdmNidXMoX3IsIF92KQorI2RlZmluZSBSRUFEX1ZDQlVTX1JFRyhfcikgICAgICAgYW1sX3JlYWRfdmNidXMoX3IpCisKKyNkZWZpbmUgQkFTRV9JUlEgMzIKKyNkZWZpbmUgQU1fSVJRKHJlZykgICAgICAgICAgICAgKHJlZyArIEJBU0VfSVJRKQorI2RlZmluZSBJTlRfREVNVVggICAgICAgICAgICAgICBBTV9JUlEoMjMpCisjZGVmaW5lIElOVF9ERU1VWF8xICAgICAgICAgICAgIEFNX0lSUSg1KQorI2RlZmluZSBJTlRfREVNVVhfMiAgICAgICAgICAgICBBTV9JUlEoMjEpIC8vQU1fSVJRKDUzKQorI2RlZmluZSBJTlRfQVNZTkNfRklGT19GSUxMICAgICBBTV9JUlEoMTgpCisjZGVmaW5lIElOVF9BU1lOQ19GSUZPX0ZMVVNIICAgIEFNX0lSUSgxOSkKKyNkZWZpbmUgSU5UX0FTWU5DX0ZJRk8yX0ZJTEwgICAgQU1fSVJRKDI0KQorI2RlZmluZSBJTlRfQVNZTkNfRklGTzJfRkxVU0ggICBBTV9JUlEoMjUpCisKKyNkZWZpbmUgSU5UX0FTWU5DX0ZJRk8zX0ZMVVNIICAgQU1fSVJRKDE3KQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9od19kZW11eC9jX3N0Yl9kZWZpbmUuaCBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9od19kZW11eC9jX3N0Yl9kZWZpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjgxNWI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2h3X2RlbXV4L2Nfc3RiX2RlZmluZS5oCkBAIC0wLDAgKzEsMTIxNyBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE3IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyogbW9yZSBkZXRhaWxzLgorKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKgorKiBEZXNjcmlwdGlvbjoKKyovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmcm9tIHRoZSBzY3JpcHQ6Ki8KKy8qKi8KKy8qIC4vY3JlYXRlX3N0Yl9kZWZpbmVfZm9yX0NfY29kZS5wbCovCisvKiovCisvKiBhbmQgd2FzIGFwcGxpZWQgdG8gdGhlIGZpbGUqLworLyoqLworLyogLi9zdGJfZGVmaW5lLmgqLworLyoqLworLyogRE8gTk9UIEVESVQhISEhISovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKi8KKyNpZmRlZiBDX1NUQl9ERUZJTkVfSAorI2Vsc2UKKyNkZWZpbmUgQ19TVEJfREVGSU5FX0gKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICBTVEIgUmVnaXN0ZXJzIFN0YXJ0Ki8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiNkZWZpbmUgU1RCX0NCVVNfQkFTRSAgICAgICAgICAgMHgxNjAwKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFRoZXJlIGFyZSB0d28gaW5zdGFudGlhdGlvbnMgdW5kZXIgb25lIENCVVMgc2xhdmUuCisgKiBFYWNoIENCVVMgc2xhdmUgY2FuIHN1cHBvcnQqLworLyogMjU2IHJlZ2lzdGVycy4KKyAqIEVhY2ggZGVtdXggaXMgYWxsb2NhdGVkIDEyOCByZWdpc3RlcnMgc28gc2V0IHRoZSBvZmZzZXQgaW4qLworLyogdGhlIG1pZGRsZSovCisvKiBDb3B5IHRoaXMgZGVmaW5lIGJ1dCBkb24ndCBhZGQgYSBiYXNlIGFkZHJlc3MqLworLyojZGVmaW5lIERFTVVYXzFfT0ZGU0VUICAgICAgICAgMHgwMCovCisvKiNkZWZpbmUgREVNVVhfMl9PRkZTRVQgICAgICAgICAweDUwKi8KKy8qI2RlZmluZSBERU1VWF8zX09GRlNFVCAgICAgICAgIDB4YTAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogIFNUQiBUT1AgUmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICg4J2hmMCAtIDgnaGY3KSovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBiaXQgMzA6MjggLS0gY2lwbHVzX29fc2VsKi8KKy8qIGJpdCAyNzoyNiAtLSBjaXBsdXNfaV9zZWwqLworLyogYml0IDI1IC0tIHVzZSBGQUlMIGZybyBUUzIqLworLyogYml0IDI0IC0tIHVzZSBGQUlMIGZybyBUUzEqLworLyogYml0IDIzIC0tIHVzZSBGQUlMIGZybyBUUzAqLworLyogYml0IDIyIC0tIGludmVydCBmZWNfZXJyb3IgZm9yIFMyUDEqLworLyogYml0IDIxIC0tIGludmVydCBmZWNfZGF0YSBmb3IgUzJQMSovCisvKiBiaXQgMjAgLS0gaW52ZXJ0IGZlY19zeW5jIGZvciBTMlAxKi8KKy8qIGJpdCAxOSAtLSBpbnZlcnQgZmVjX3ZhbGlkIGZvciBTMlAxKi8KKy8qIGJpdCAxOCAtLSBpbnZlcnQgZmVjX2NsayBmb3IgUzJQMSovCisvKiBiaXQgMTc6MTYgLS0gZmVjX3Nfc2VsIGZvciBTMlAxCisgKiAwMCAtIHNlbGVjdCBUUzAsIDAxIC0tIHNlbGVjdCBUUzEsIDEwIC0tIHNlbGVjdCBUUzIsIDExIC0gVFMzKi8KKy8qIEJpdCAxNSAtLSBlbmFibGVfZGVzX3BsX2NsayovCisvKiBCaXQgMTQgLS0gcmVzZXJ2ZWQqLworLyogQml0IDEzIC0tIHVzZSBGQUlMIGZvciBUUzMqLworLyogQml0IDEyOjEwIC0tIHRzX291dF9zZWxlY3QsCisgKiAwLVRTMCwgMS1UUzEsIDItVFMyLCAzLVRTMyw0LVMyUDIsIDUtUzJQMSwgNi1TMlAwLCA3LUZpbGUqLworLyogYml0IDk6OCAtLSBkZXNfaV9zZWwgMDAgLS0gc2VsZWN0IGRlbXV4MCBhcyBkZXMgaW5wdXQsCisqICAwMSAtLSBzZWxlY3RfZGVtdXgxLCAxMCAtLSBzZWxlY3RfZGVtdXgyLCAxMSAtIHJlc2VydmVkKi8KKy8qIGJpdCA3IC0tIGVuYWJsZV9kZXNfcGwqLworLyogYml0IDYgLS0gaW52ZXJ0IGZlY19lcnJvciBmb3IgUzJQMCovCisvKiBiaXQgNSAtLSBpbnZlcnQgZmVjX2RhdGEgZm9yIFMyUDAqLworLyogYml0IDQgLS0gaW52ZXJ0IGZlY19zeW5jIGZvciBTMlAwKi8KKy8qIGJpdCAzIC0tIGludmVydCBmZWNfdmFsaWQgZm9yIFMyUDAqLworLyogYml0IDIgLS0gaW52ZXJ0IGZlY19jbGsgZm9yIFMyUDAqLworLyogYml0IDE6MCAtLSBmZWNfc19zZWwgZm9yIFMyUDAKKyAqIDAwIC0gc2VsZWN0IFRTMCwgMDEgLS0gc2VsZWN0IFRTMSwgMTAgLS0gc2VsZWN0IFRTMiwgMTEgLSByZXNlcnZlZCovCisvKiNkZWZpbmUgU1RCX1RPUF9DT05GSUcgICAgICAgICAgKFNUQl9DQlVTX0JBU0UgKyAweGYwKSAvLyAweDE2ZjAqLworLyotLS0tLS0tLS0tLSBiaXQgZGVmaW5lIC0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgSU5WRVJUX1MyUDFfRkVDX0VSUk9SICAgICAgIDIyCisjZGVmaW5lIElOVkVSVF9TMlAxX0ZFQ19EQVRBICAgICAgICAyMQorI2RlZmluZSBJTlZFUlRfUzJQMV9GRUNfU1lOQyAgICAgICAgMjAKKyNkZWZpbmUgSU5WRVJUX1MyUDFfRkVDX1ZBTElEICAgICAgIDE5CisjZGVmaW5lIElOVkVSVF9TMlAxX0ZFQ19DTEsgICAgICAgICAxOAorI2RlZmluZSBTMlAxX0ZFQ19TRVJJQUxfU0VMICAgICAgICAgMTYKKyNkZWZpbmUgRU5BQkxFX0RFU19QTF9DTEsgICAgICAgICAgIDE1CisjZGVmaW5lIEZBSUxfVFMzCQkJCQkxMworI2RlZmluZSBUU19PVVRQVVRfU09VUkNFICAgICAgICAgICAgMTAKKyNkZWZpbmUgREVTX0lOUFVUX1NFTCAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgRU5BQkxFX0RFU19QTCAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgSU5WRVJUX1MyUDBfRkVDX0VSUk9SICAgICAgIDYKKyNkZWZpbmUgSU5WRVJUX1MyUDBfRkVDX0RBVEEgICAgICAgIDUKKyNkZWZpbmUgSU5WRVJUX1MyUDBfRkVDX1NZTkMgICAgICAgIDQKKyNkZWZpbmUgSU5WRVJUX1MyUDBfRkVDX1ZBTElEICAgICAgIDMKKyNkZWZpbmUgSU5WRVJUX1MyUDBfRkVDX0NMSyAgICAgICAgIDIKKyNkZWZpbmUgUzJQMF9GRUNfU0VSSUFMX1NFTCAgICAgICAgIDAKKworLy9kZWZpbmUgU1RCX1MyUDJfQ09ORklHCisjZGVmaW5lIFMyUDJfRElTQUJMRSAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBTMlAyX0NMS19ESVYgICAgICAgICAgICAgICAgNworI2RlZmluZSBJTlZFUlRfUzJQMl9GRUNfRVJST1IgICAgICAgNgorI2RlZmluZSBJTlZFUlRfUzJQMl9GRUNfREFUQSAgICAgICAgNQorI2RlZmluZSBJTlZFUlRfUzJQMl9GRUNfU1lOQyAgICAgICAgNAorI2RlZmluZSBJTlZFUlRfUzJQMl9GRUNfVkFMSUQgICAgICAgMworI2RlZmluZSBJTlZFUlRfUzJQMl9GRUNfQ0xLICAgICAgICAgMgorI2RlZmluZSBTMlAyX0ZFQ19TRVJJQUxfU0VMICAgICAgICAgMAorCisKKy8qIDMxOjI0IC0tICBmaWxlX20ydHNfc2tpcF9ieXRlc19oaXUxKi8KKy8qIDIxIC0tIHRzX2hpdV9lbmFibGVfaGl1MSAqLworLyoyMDoxNiAgLS0gIGZlY19jbGtfZGl2X2hpdTEqLworLyoxNTo4ICAtLSBUU19wYWNrYWdlX2xlbmd0aF9zdWJfMV9oaXUxICovCisvKjc6MCAgLS0gIGZlY19zeW5jX2J5dGVfaGl1MSovCisvKiNkZWZpbmUgVFNfSElVMV9DT05GSUcJKFNUQl9DQlVTX0JBU0UgKyAweDRlKSovCisjZGVmaW5lIEZJTEVfTTJUU19TS0lQX0JZVEVTX0hJVTEJCTI0CisjZGVmaW5lIFRTX0hJVV9FTkFCTEVfSElVMQkJCQkyMQorI2RlZmluZSBGRUNfQ0xLX0RJVl9ISVUxCQkJCTE2CisjZGVmaW5lIFRTX1BBQ0tBR0VfTEVOR1RIX1NVQl8xX0hJVTEgCTgKKyNkZWZpbmUgRkVDX1NZTkNfQllURV9ISVUxCQkJCTAKKworLyo1OjQgLS0gZmVjX3NlbF9kZW11eF8yLCBkZWZhdWx0OjIqLworLyozOjIgLS0gZmVjX3NlbF9kZW11eF8xLCBkZWZhdWx0OjEqLworLyoxOjAgLS0gZmVjX3NlbF9kZW11eF8wLCBkZWZhdWx0OjAqLworLyojZGVmaW5lIFRTX1RPUF9DT05GSUcxCShTVEJfQ0JVU19CQVNFICsgMHg0ZikqLworI2RlZmluZSBGRUNfU0VMX0RFTVVYXzIJCQkJCTQKKyNkZWZpbmUgRkVDX1NFTF9ERU1VWF8xCQkJCQkyCisjZGVmaW5lIEZFQ19TRUxfREVNVVhfMAkJCQkJMAorCisvKiAzMToyOCAtIHMycDFfY2xrX2RpdiovCisvKiAyNzoyNCAtIHMycDBfY2xrX2RpdiovCisvKiAyMyAgICAtIHMycDFfZGlzYWJsZSovCisvKiAyMiAgICAtIHMycDBfZGlzYWJsZSovCisvKiAyMSAgICAtIFJlc2VydmVkKi8KKy8qIDIwIC0tIFRTX09VVF9lcnJvcl9JTlZFUlQqLworLyogMTkgLS0gVFNfT1VUX2RhdGFfSU5WRVJUKi8KKy8qIDE4IC0tIFRTX09VVF9zeW5jX0lOVkVSVCovCisvKiAxNyAtLSBUU19PVVRfdmFsaWRfSU5WRVJUKi8KKy8qIDE2IC0tIFRTX09VVF9jbGtfSU5WRVJUKi8KKy8qIDE1OjggLS0gVFNfcGFja2FnZV9sZW5ndGhfc3ViXzEgKGRlZmF1bHQgOiAxODcpKi8KKy8qICA3OjAgLS0gZmVjX3N5bmNfYnl0ZSAoZGVmYXVsdCA6IDB4NDcpKi8KKy8qI2RlZmluZSBUU19UT1BfQ09ORklHICAgICAgICAgICAoU1RCX0NCVVNfQkFTRSArIDB4ZjEpIC8vIDB4MTZmMSovCisvKi0tLS0tLS0tLS0tIGJpdCBkZWZpbmUgLS0tLS0tLS0tLS0qLworI2RlZmluZSBUU19PVVRfQ0xLX0lOVkVSVAkJCQkJCTE2CisjZGVmaW5lIFRTX1BBQ0tBR0VfTEVOR1RIX1NVQl8xICAgICA4CisjZGVmaW5lIEZFQ19ERUZBVUxUX1NZTkNfQllURSAgICAgICAwCisKKy8qIEJpdCAyNToyNCAtLSB0cmFuc3BvcnRfc2NyYW1ibGluZ19jb250cm9sX29kZF8yIC8vIHNob3VsZCBiZSAzKi8KKy8qIEJpdCAyMzoxNiAtLSBmaWxlX20ydHNfc2tpcF9ieXRlcyovCisvKiBCaXQgMTU6OCAtLSBkZXNfb3V0X2RseSovCisvKiBCaXQgNzo2IC0tIHRyYW5zcG9ydF9zY3JhbWJsaW5nX2NvbnRyb2xfb2RkIC8vIHNob3VsZCBiZSAzKi8KKy8qIEJpdCA1IC0tIHRzX2hpdV9lbmFibGUqLworLyogQml0IDQ6MCAtLSBmZWNfY2xrX2RpdiovCisvKiNkZWZpbmUgVFNfRklMRV9DT05GSUcgICAgICAgICAgKFNUQl9DQlVTX0JBU0UgKyAweGYyKSAvLyAweDE2ZjIqLworLyotLS0tLS0tLS0tLSBiaXQgZGVmaW5lIC0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgVFJBTlNQT1JUX1NDUkFNQkxJTkdfQ09OVFJPTF9PRERfMiAyNAorI2RlZmluZSBGSUxFX00yVFNfU0tJUF9CWVRFUyAgICAgICAgMTYKKyNkZWZpbmUgREVTX09VVF9ETFkgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgVFJBTlNQT1JUX1NDUkFNQkxJTkdfQ09OVFJPTF9PREQgNgorI2RlZmluZSBUU19ISVVfRU5BQkxFICAgICAgICAgICAgICAgNQorI2RlZmluZSBGRUNfRklMRV9DTEtfRElWICAgICAgICAgICAgMAorCisvKiBCaXQgMTk6MTQgLS0gZGVzXzIgdHMgcGwgc3RhdGUgICAtLSBSZWFkIE9ubHkqLworLyogQml0IDEzOjggLS0gZGVzIHRzIHBsIHN0YXRlICAgLS0gUmVhZCBPbmx5Ki8KKy8qIEJpdCAzOjAgUElEIGluZGV4IHRvIDggUElEIHRvIGdldCBrZXktc2V0Ki8KKy8qIGF1dG8gaW5jcmVzZSBhZnRlciBUU19QTF9QSURfREFUQSByZWFkL3dyaXRlKi8KKy8qI2RlZmluZSBUU19QTF9QSURfSU5ERVggICAgICAgICAoU1RCX0NCVVNfQkFTRSArIDB4ZjMpIC8vIDB4MTZmMyovCisvKi0tLS0tLS0tLS0tIGJpdCBkZWZpbmUgLS0tLS0tLS0tLS0qLworI2RlZmluZSBERVNfVFNfUExfU1RBVEUgICAgICAgICAgICAgOAorI2RlZmluZSBERVNfMl9UU19QTF9TVEFURSAgICAgICAgICAgMTQKKworLyogQml0IDEzIC0tIFBJRCBtYXRjaCBkaXNibGUqLworLyogQml0IDEyOjAgLS0gUElEKi8KKy8qI2RlZmluZSBUU19QTF9QSURfREFUQSAgICAgICAgICAoU1RCX0NCVVNfQkFTRSArIDB4ZjQpIC8vIDB4MTZmNCovCisvKi0tLS0tLS0tLS0tIGJpdCBkZWZpbmUgLS0tLS0tLS0tLS0qLworI2RlZmluZSBQSURfTUFUQ0hfRElTQUJMRV9ISUdIICAgICAgIDI5CisjZGVmaW5lIFBJRF9NQVRDSF9ISUdIICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgUElEX01BVENIX0RJU0FCTEVfTE9XICAgICAgICAxMworI2RlZmluZSBQSURfTUFUQ0hfTE9XICAgICAgICAgICAgICAgIDAKKworLyojZGVmaW5lIENPTU1fREVTQ19LRVkwCisgKiAoU1RCX0NCVVNfQkFTRSArIDB4ZjUpIC8vIDB4MTZmNQorIENvbW1vbiBkZXNjcmFtYmxlciBrZXkgKGtleSBiaXRzWzYzOjMyXSkqLworLyojZGVmaW5lIENPTU1fREVTQ19LRVkxCisgKiAoU1RCX0NCVVNfQkFTRSArIDB4ZjYpIC8vIDB4MTZmNgorIENvbW1vbiBkZXNjcmFtYmxlciBrZXkgKGtleSBiaXRzWzMxOjBdKSovCisvKiNkZWZpbmUgQ09NTV9ERVNDX0tFWV9SVworICogKFNUQl9DQlVTX0JBU0UgKyAweGY3KSAvLyAweDE2ZjcgLy8gYml0c1szOjBdCisgKiBwb2ludCB0byB0aGUgYWRkcmVzcyB0byB3cml0ZSB0aGUga2V5CisgKiB7Q09NTV9ERVNDX0tFWTMsLi4uLENPTU1fREVTQ19LRVkwfSovCisvKiBXcml0aW5nIHRoaXMgcmVnaXN0ZXIgd3JpdGVzIHRoZSBrZXkgdG8gUkFNKi8KKworLyogYml0IDE1OjggLSBkZXNfb3V0X2RseV8yKi8KKy8qIGJpdCAgIDcgLSByZXNlcnZlZCovCisvKiBCaXQgICA2LS0gZW5hYmxlX2Rlc19wbF9jbGtfMiovCisvKiBiaXQgICA1IC0gZW5hYmxlX2Rlc19wbF8yKi8KKy8qIGJpdCA0OjIgLS0gdXNlX2Rlc18yICBiaXRbMl0gLS0gZGVtdXgwLCBiaXRbM10gLS0gZGVtdXgxLCBiaXRbNF0gLS0gZGVtdXgyKi8KKy8qIGJpdCAxOjAgLS0gZGVzX2lfc2VsXzIgMDAgLS0gc2VsZWN0X2ZlY18wLCAwMSAtLSBzZWxlY3RfZmVjXzEsCisgKiAgICAgICAgICAgICAgICAgICAgICAgIDEwIC0tIHNlbGVjdF9mZWNfMiwgMTEgLSByZXNlcnZlZCovCisvKiNkZWZpbmUgQ09NTV9ERVNDXzJfQ1RMICAgICAoU1RCX0NCVVNfQkFTRSArIDB4ZmYpICovLyoweDE2ZmYqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogIE11bHRpcGxlIFNUQiBSZWdpc3RlcnMgICAgICAgICAgICAgICAgICAoOCdoMDAgLSA4J2g0NSkqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIFNUQiByZWdpc3RlcnMgYXJlIDgnaDB4Ki8KKy8qIEJpdCAxNTowIC0tIHZlcnNpb24gbnVtYmVyIDogMHgwMDAyICAodjAuMDEpKi8KKy8qI2RlZmluZSBTVEJfVkVSU0lPTgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4MDApICAvLyAweDE2MDAgLy8gcmVhZCBvbmx5Ki8KKy8qI2RlZmluZSBTVEJfVkVSU0lPTl8yCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzJfT0ZGU0VUICsgMHgwMCkgIC8vIDB4MTY1MCAvLyByZWFkIG9ubHkqLworLyojZGVmaW5lIFNUQl9WRVJTSU9OXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDAwKSAgLy8gMHgxNmEwIC8vIHJlYWQgb25seSovCisKKy8qI2RlZmluZSBTVEJfVEVTVF9SRUcKKyAqICAgICAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHgwMSkgIC8vIDB4MTYwMSovCisvKiNkZWZpbmUgU1RCX1RFU1RfUkVHXzIKKyAqICAgICAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzJfT0ZGU0VUICsgMHgwMSkgIC8vIDB4MTY1MSovCisvKiNkZWZpbmUgU1RCX1RFU1RfUkVHXzMKKyAqICAgIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDAxKSAgLy8gMHgxNmExKi8KKworLyogQml0IDE1IC0tIGZlY19jb3JlX3NlbGVjdCAxIC0gc2VsZWN0IGRlc2NyYW1ibGUgb3V0cHV0Ki8KKy8qIEJpdCAxNDoxMiAtICBmZWNfc2VsZWN0CisgKiAwLVRTMCwgMS1UUzEsIDItVFMyLCAzLDQtUmVzZXJ2ZWQsIDUtUzJQMSwgNi1TMlAwLCA3LUZpbGUqLworLyogQml0IDExIC0tIEZFQ19DTEsqLworLyogQml0IDEwIC0tIFNPUCovCisvKiBCaXQgOSAtLSBEX1ZBTElEKi8KKy8qIEJpdCA4IC0tIERfRkFJTCovCisvKiBCaXQgNzowIC0tIERfREFUQSA3OjAqLworLyojZGVmaW5lIEZFQ19JTlBVVF9DT05UUk9MCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHgwMikgIC8vIDB4MTYwMiovCisvKiNkZWZpbmUgRkVDX0lOUFVUX0NPTlRST0xfMgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4MDIpICAvLyAweDE2NTIqLworLyojZGVmaW5lIEZFQ19JTlBVVF9DT05UUk9MXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDAyKSAgLy8gMHgxNmEyKi8KKy8qLS0tLS0tLS0tLS0gYml0IGRlZmluZSAtLS0tLS0tLS0tLSovCisjZGVmaW5lIEZFQ19TRUxfM0JJVAkJCSAgIDE2CisjZGVmaW5lIEZFQ19DT1JFX1NFTCAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIEZFQ19TRUwgICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIEZFQ19JTlBVVF9GRUNfQ0xLICAgICAgICAgIDExCisjZGVmaW5lIEZFQ19JTlBVVF9TT1AgICAgICAgICAgICAgIDEwCisjZGVmaW5lIEZFQ19JTlBVVF9EX1ZBTElEICAgICAgICAgICA5CisjZGVmaW5lIEZFQ19JTlBVVF9EX0ZBSUwgICAgICAgICAgICA4CisKKy8qI2RlZmluZSBGRUNfSU5QVVRfREFUQQorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4MDMpICAvLyAweDE2MDMgLy8gcmVhZCBvbmx5Ki8KKy8qI2RlZmluZSBGRUNfSU5QVVRfREFUQV8yCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzJfT0ZGU0VUICsgMHgwMykgIC8vIDB4MTY1MyAvLyByZWFkIG9ubHkqLworLyojZGVmaW5lIEZFQ19JTlBVVF9EQVRBXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDAzKSAgLy8gMHgxNmEzIC8vIHJlYWQgb25seSovCisKKy8qIGJpdCAzMSAtLSBlbmFibGVfZnJlZV9jbGtfZmVjX2RhdGFfdmFsaWQqLworLyogYml0IDMwIC0tIGVuYWJsZV9mcmVlX2Nsa19zdGJfcmVnKi8KKy8qIGJpdCAyOSAtLSBhbHdheXNfdXNlX3Blc19wYWNrYWdlX2xlbmd0aCovCisvKiBiaXQgMjggLS0gZGlzYWJsZV9wcmVfaW5jb21wbGV0ZV9zZWN0aW9uX2ZpeCovCisvKiBiaXQgMjcgLS0gcG9pbnRlcl9maWVsZF9tdWx0aV9wcmVfZW4qLworLyogYml0IDI2IC0tIGlnbm9yZV9wcmVfaW5jb21wbGV0ZV9zZWN0aW9uKi8KKy8qIGJpdCAyNSAtLSB2aWRlbzJfZW5hYmxlKi8KKy8qIGJpdCAyNDoyMiAtLSB2aWRlbzJfdHlwZSovCisvKiBiaXQgMjEgLS0gZG9fbm90X3RydXN0X3Blc19wYWNrYWdlX2xlbmd0aCovCisvKiBiaXQgMjAgKGJpdCA0KSAtLSBCeXBhc3MgdXNlIHJlY29kZXIgcGF0aCovCisvKiBiaXQgMTkgKGJpdCAzKSAtLSBjbGVhcl9QSURfY29udGludWl0eV9jb3VudGVyX3ZhbGlkKi8KKy8qIGJpdCAxOCAoYml0IDIpIC0tIERpc2FibGUgU3BsaWNpbmcqLworLyogYml0IDE3IChiaXQgMSkgLS0gSW5zZXJ0IFBFU19TVFJPTkdfU1lOQyBpbiBBdWRpbyBQRVMqLworLyogYml0IDE2IChiaXQgMCkgLS0gSW5zZXJ0IFBFU19TVFJPTkdfU1lOQyBpbiBWaWRlbyBQRVMqLworLyogQml0IDE1IC0gZG8gbm90IHRydXN0IHNlY3Rpb24gbGVuZ3RoKi8KKy8qIEJpdCAxNCAtIG9tIGNtZCBwdXNoIGV2ZW4gemVybyovCisvKiBCaXQgMTMgLSByZXNlcnZlZCovCisvKiBCaXQgMTIgLSBTVUIsIE9USEVSIFBFUyBpbnRlcnJ1cHQgYXQgYmVnaW5uaW5nIG9mIFBFUyovCisvKiBCaXQgMTEgLSBkaXNjYXJkX2F2X3BhY2thZ2UgLS0gZm9yIHRzX3JlY29yZGVyIHVzZSBvbmx5Ki8KKy8qIEJpdCAxMCAtIHRzX3JlY29yZGVyX3NlbGVjdCAgMDphZnRlciBQSUQgZmlsdGVyIDE6YmVmb3JlIFBJRCBmaWx0ZXIqLworLyogQml0IDkgLSB0c19yZWNvcmRlcl9lbmFibGUqLworLyogQml0IDggLSAodGFibGVfaWQgPT0gMHhmZikgbWVhbnMgc2VjdGlvbl9lbmQqLworLyogQml0IDcgLSBkbyBub3Qgc2VuZCB1bmNvbXBsZXRlIHNlY3Rpb24qLworLyogQml0IDYgLSBkbyBub3QgZGlzY2FyZCBkdXBsaWNhdGUgcGFja2FnZSovCisvKiBCaXQgNSAtIHNlYXJjaCBTT1Agd2hlbiB0cmFzcG9ydF9lcnJvcl9pbmRpY2F0b3IqLworLyogQml0IDQgLSBzdGIgZGVtdXggZW5hYmxlKi8KKy8qIEJpdCAzIC0gZG8gbm90IHJlc2V0IHN0YXRlIG1hY2hpbmUgb24gU09QKi8KKy8qIEJpdCAyIC0gc2VhcmNoIFNPUCB3aGVuIGVycm9yIGhhcHBlbmVkCisgKiAoIHdoZW4gaWdub3JlX2ZhaWxfbl9zb3AsIHdpbGwgaGF2ZSB0aGlzIGNhc2UpKi8KKy8qIEJpdCAxIC0gZG8gbm90IHVzZSBTT1AgaW5wdXQgKCBjaGVjayBGRUMgc3luYyBieXRlIGluc3RlYWQgKSovCisvKiBCaXQgMCAtIGlnbm9yZSBmZWNfZXJyb3IgYml0IHdoZW4gbm9uIHNvcCAoIGNoZWNrIGVycm9yIG9uIFNPUCBvbmx5KSovCisvKiNkZWZpbmUgREVNVVhfQ09OVFJPTAorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4MDQpICAvLyAweDE2MDQqLworLyojZGVmaW5lIERFTVVYX0NPTlRST0xfMgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4MDQpICAvLyAweDE2NTQqLworLyojZGVmaW5lIERFTVVYX0NPTlRST0xfMworICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4MDQpICAvLyAweDE2YTQqLworLyotLS0tLS0tLS0tLSBiaXQgZGVmaW5lIC0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgRU5BQkxFX0ZSRUVfQ0xLX0ZFQ19EQVRBX1ZBTElEICAgICAgICAgIDMxCisjZGVmaW5lIEVOQUJMRV9GUkVFX0NMS19TVEJfUkVHICAgICAgICAgICAgICAgICAzMAorI2RlZmluZSBCWVBBU1NfVVNFX1JFQ09ERVJfUEFUSCAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgQ0xFQVJfUElEX0NPTlRJTlVJVFlfQ09VTlRFUl9WQUxJRCAgICAgIDE5CisjZGVmaW5lIERJU0FCTEVfU1BMSUNJTkcgICAgICAgICAgICAgICAgICAgICAgICAxOAorI2RlZmluZSBJTlNFUlRfQVVESU9fUEVTX1NUUk9OR19TWU5DICAgICAgICAgICAgMTcKKyNkZWZpbmUgSU5TRVJUX1ZJREVPX1BFU19TVFJPTkdfU1lOQyAgICAgICAgICAgIDE2CisjZGVmaW5lIFNFQ1RJT05fTEVOR1RIX1VOVFJVU1RZICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBPTV9DTURfUFVTSF9FVkVOX1pFUk8gICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgT1RIRVJfSU5UX0FUX1BFU19CRUdJTklORyAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIERJU0NBUkRfQVZfUEFDS0FHRSAgICAgICAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBUU19SRUNPUkRFUl9TRUxFQ1QgICAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgVFNfUkVDT1JERVJfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgU0VDVElPTl9FTkRfV0lUSF9UQUJMRV9JRCAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgU0VORF9DT01QTEVURV9TRUNUSU9OX09OTFkgICAgICAgICAgICAgIDcKKyNkZWZpbmUgS0VFUF9EVVBMSUNBVEVfUEFDS0FHRSAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgU0VBQ0hfU09QX09OX1RSQU5TUE9SVF9FUlJPUiAgICAgICAgICAgIDUKKyNkZWZpbmUgU1RCX0RFTVVYX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTk9fUkVTRVRfT05fU09QICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgU0VBUkNIX1NPUF9PTl9FUlJPUiAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTk9UX1VTRV9PRl9TT1BfSU5QVVQgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSUdOT1JFX05PTlNPUF9GRUNfRVJST1IgICAgICAgICAgICAgICAgIDAKKworLyogYml0IDE1OjggZGVtdXggcGFja2FnZSBsZW5ndGggLSAxICggZGVmYXVsdCA6IDE4NyApKi8KKy8qIGJpdCA3OjAgZGVmYXVsdCBpcyAweDQ3Ki8KKy8qI2RlZmluZSBGRUNfU1lOQ19CWVRFCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHgwNSkgIC8vIDB4MTYwNSovCisvKiNkZWZpbmUgRkVDX1NZTkNfQllURV8yCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzJfT0ZGU0VUICsgMHgwNSkgIC8vIDB4MTY1NSovCisvKiNkZWZpbmUgRkVDX1NZTkNfQllURV8zCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzNfT0ZGU0VUICsgMHgwNSkgIC8vIDB4MTZhNSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGTSBNZW1vcnkgVXNhZ2UgOgorICogMC0xNSAoMzIgUElEIGZpbHRlciB0YXJnZXQpIC0tLS0gMTU6MTMtUElEIHR5cGUgMTI6MC1QSUQgdGFyZ2V0IG9yIGZvcmNlIGRhdGEKKyAqIChmb3JjZSBkYXRhIDogMSB3aWxsIG1hc2sgY29yZXNwb2RpbmcgYml0LAorICogMCB3aWxsIGRpc2FibGUgdGhpcyBQSUQgZmlsdGVyIGNoYW5uZWwpCisgKiBhZHZhbmNlZCBzZXR0aW5nIC0tCWJpdCA3OjAKKyAqICAgICAgICAgICAgICAgICAgICAgIGJpdCA3IC0tIFBJRCBiaXQgMTI6MTEgY29tcGFyZSByZXN1bHQgZm9yY2UKKyAqICAgICAgICAgICAgICAgICAgICAgIGJpdCA2IC0tIFBJRCBiaXQgMTA6OSBjb21wYXJlIHJlc3VsdCBmb3JjZQorICogICAgICAgICAgICAgICAgICAgICAgYml0IDUgLS0gUElEIGJpdCA4OjcgY29tcGFyZSByZXN1bHQgZm9yY2UKKyAqICAgICAgICAgICAgICAgICAgICAgIGJpdCA0IC0tIFBJRCBiaXQgNjo1IGNvbXBhcmUgcmVzdWx0IGZvcmNlCisgKiAgICAgICAgICAgICAgICAgICAgICBiaXQgMyAtLSBQSUQgYml0IDQ6MyBjb21wYXJlIHJlc3VsdCBmb3JjZQorICogICAgICAgICAgICAgICAgICAgICAgYml0IDIgLS0gUElEIGJpdCAyIGNvbXBhcmUgcmVzdWx0IGZvcmNlCisgKiAgICAgICAgICAgICAgICAgICAgICBiaXQgMSAtLSBQSUQgYml0IDEgY29tcGFyZSByZXN1bHQgZm9yY2UKKyAqICAgICAgICAgICAgICAgICAgICAgIGJpdCAwIC0tIFBJRCBiaXQgMCBjb21wYXJlIHJlc3VsdCBmb3JjZQorICogMTYtMjU1KDE1eDMyIFNlY3Rpb24gZmlsdGVyIHRhcmdldCkKKyAqIEZvciBmaXJzdCBieXRlIDogVGFibGVfSUQKKyAqIC0tLS0gMTUtTWFzayBIaWdoIDQtYml0cworICogICAxNC1NYXNrIExvdyA0LWJpdHMKKyAqICAgMTMtZGlzYWJsZV9QSURfY2hlY2sKKyAqICAgMTI6OC1QSURpbmRleAorICogICA3OjAtc2VjdGlvbiB0YXJnZXQgKGFsd2F5cyBFUSkKKyAqIEZvciByZXN0IG9mIGJ5dGVzIDoKKyAqIC0tLS0gMTUtTWFzayAxNC1FUS9ORSAxMy1kaXNhYmxlX1BJRF9jaGVjaworICogLS0tLTEyOjgtUElEaW5kZXggNzowLXNlY3Rpb24gdGFyZ2V0IChvciBmb3JjZSBkYXRhKQorICogYWR2YW5jZWQgc2V0dGluZyAtLSBiaXQgNzowIGZvcmNlIGNvbXBhcmUgcmVzdWx0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKi0tLS0tLS0tLS0tIGJpdCBkZWZpbmUgLS0tLS0tLS0tLS0qLworI2RlZmluZSBQSURfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgUElEX1RBUkdFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworI2RlZmluZSBTRUNUSU9OX0ZJUlNUQllURV9NQVNLSElHSCAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgU0VDVElPTl9GSVJTVEJZVEVfTUFTS0xPVyAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFNFQ1RJT05fRklSU1RCWVRFX0RJU0FCTEVfUElEX0NIRUNLICAgICAxMworI2RlZmluZSBTRUNUSU9OX0ZJUlNUQllURV9QSURfSU5ERVggICAgICAgICAgICAgOAorI2RlZmluZSBTRUNUSU9OX1RBUkdFVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisjZGVmaW5lIFNFQ1RJT05fUkVTVEJZVEVfTUFTSyAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBTRUNUSU9OX1JFU1RCWVRFX01BU0tfRVEgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgU0VDVElPTl9SRVNUQllURV9ESVNBQkxFX1BJRF9DSEVDSyAgICAgIDEzCisjZGVmaW5lIFNFQ1RJT05fUkVTVEJZVEVfUElEX0lOREVYICAgICAgICAgICAgICA4CisKKy8qIGJpdCAzMToxNiAtLSBmaWx0ZXIgbWVtb3J5IHdyaXRlIGRhdGEgaGlbMzE6MTZdKi8KKy8qIGJpdCAxNTowIC0tIGZpbHRlciBtZW1vcnkgd3JpdGUgZGF0YSBsb3cgWzE1OjBdKi8KKy8qI2RlZmluZSBGTV9XUl9EQVRBCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHgwNikgIC8vIDB4MTYwNiovCisvKiNkZWZpbmUgRk1fV1JfREFUQV8yCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzJfT0ZGU0VUICsgMHgwNikgIC8vIDB4MTY1NiovCisvKiNkZWZpbmUgRk1fV1JfREFUQV8zCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzNfT0ZGU0VUICsgMHgwNikgIC8vIDB4MTZhNiovCisvKi0tLS0tLS0tLS0tIGJpdCBkZWZpbmUgLS0tLS0tLS0tLS0qLworI2RlZmluZSBGTV9XUl9EQVRBX0hJICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKworLyogYml0IDMxOjI0IC0tIGFkdmFuY2VkIHNldHRpbmcgaGkqLworLyogYml0IDIzOjE2IC0tIGFkdmFuY2VkIHNldHRpbmcgbG93Ki8KKy8qIGJpdCAxNSAtLSBmaWx0ZXIgbWVtb3J5IHdyaXRlIGRhdGEgcmVxdWVzdCovCisvKiBiaXQgNzowIC0tIGZpbHRlciBtZW1vcnkgd3JpdGUgYWRkciovCisvKiNkZWZpbmUgRk1fV1JfQUREUgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4MDcpICAvLyAweDE2MDcqLworLyojZGVmaW5lIEZNX1dSX0FERFJfMgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4MDcpICAvLyAweDE2NTcqLworLyojZGVmaW5lIEZNX1dSX0FERFJfMworICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4MDcpICAvLyAweDE2YTcqLworLyotLS0tLS0tLS0tLSBiaXQgZGVmaW5lIC0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgRk1fQURWQU5DRURfU0VUVElOR19ISSAgICAgICAgICAgICAgICAgIDI0CisjZGVmaW5lIEZNX0FEVkFOQ0VEX1NFVFRJTkdfTE8gICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBGTV9XUl9EQVRBX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgMTUKKworLyogYml0IDEzOjggZGVtdXggc3RhdGUgIC0tIHJlYWQgb25seSovCisvKiBiaXQgNzo0IC0tIG1heG51bSBzZWN0aW9uIGZpbHRlciBjb21wYXJlIGFkZHJlc3MqLworLyogYml0IDM6MCAtLSBtYXhudW0gUElEIGZpbHRlciBjb21wYXJlIGFkZHJlc3MqLworLyojZGVmaW5lIE1BWF9GTV9DT01QX0FERFIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMV9PRkZTRVQgKyAweDA4KSAgLy8gMHgxNjA4Ki8KKy8qI2RlZmluZSBNQVhfRk1fQ09NUF9BRERSXzIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDA4KSAgLy8gMHgxNjU4Ki8KKy8qI2RlZmluZSBNQVhfRk1fQ09NUF9BRERSXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDA4KSAgLy8gMHgxNmE4Ki8KKy8qLS0tLS0tLS0tLS0gYml0IGRlZmluZSAtLS0tLS0tLS0tLSovCisjZGVmaW5lIERFTVVYX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIE1BWF9GTV9TRUNUSU9OX0ZJTFRFUl9DT01QX0FERFIgICAgICAgICA0CisKKy8qIGJpdCAxNSAtIHRyYW5zcG9ydF9lcnJvcl9pbmRpY2F0b3IqLworLyogYml0IDE0IC0gcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciovCisvKiBiaXQgMTMgLSB0cmFuc3BvcnRfcHJpb3JpdHkqLworLyogYml0IDEyOjAgLSBQSUQqLworLyojZGVmaW5lIFRTX0hFQURfMAorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4MDkpICAvLyAweDE2MDkqLworLyojZGVmaW5lIFRTX0hFQURfMF8yCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzJfT0ZGU0VUICsgMHgwOSkgIC8vIDB4MTY1OSovCisvKiNkZWZpbmUgVFNfSEVBRF8wXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDA5KSAgLy8gMHgxNmE5Ki8KKy8qLS0tLS0tLS0tLS0gYml0IGRlZmluZSAtLS0tLS0tLS0tLSovCisjZGVmaW5lIFRSQU5TUE9SVF9FUlJPUl9JTkRJQ0FUT1IgICAgICAgICAgICAgICAxNQorI2RlZmluZSBQQVlMT0FEX1VOSVRfU1RBUlRfSU5ESUNBVE9SICAgICAgICAgICAgMTQKKyNkZWZpbmUgVFJBTlNQT1JUX1BSSU9SSVRZICAgICAgICAgICAgICAgICAgICAgIDEzCisKKy8qIGJpdCA3OjYgdHJhbnNwb3J0X3NjcmFtYmxpbmdfY29udHJvbCovCisvKiBiaXQgNTo0IGFkYXB0YXRpb25fZmllbGRfY29udHJvbCovCisvKiBiaXQgMzowIGNvbnRpbnVpdHlfY291bnRlciovCisvKiNkZWZpbmUgVFNfSEVBRF8xCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHgwYSkgIC8vIDB4MTYwYSovCisvKiNkZWZpbmUgVFNfSEVBRF8xXzIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDBhKSAgLy8gMHgxNjVhKi8KKy8qI2RlZmluZSBUU19IRUFEXzFfMworICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4MGEpICAvLyAweDE2YWEqLworLyotLS0tLS0tLS0tLSBiaXQgZGVmaW5lIC0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgVFJBTlNQT1JUX1NDUkFNQkxJTkdfQ09OVFJPTCAgICAgICAgICAgIDYKKyNkZWZpbmUgQURBUFRBVElPTl9GSUVMRF9DT05UUk9MICAgICAgICAgICAgICAgIDQKKworLyogYml0IDE1OjEyIC0tIG9tX2NtZF9jb3VudCAocmVhZCBvbmx5KSovCisvKiBiaXQgIDExOjkgLS0gb3ZlcmZsb3dfY291bnQgLy8gYml0ICAxMTo5IC0tIG9tX2NtZF93cl9wdHIgKHJlYWQgb25seSkqLworLyogYml0ICAgODo2IC0tIG9tX292ZXJ3cml0ZV9jb3VudCAvLyBiaXQgICA4OjYgLS0gb21fY21kX3JkX3B0ciAocmVhZCBvbmx5KSovCisvKiBiaXQgICA1OjMgLS0gdHlwZV9zdGJfb21fd19yZCAocmVhZCBvbmx5KSovCisvKiBiaXQgICAgIDIgLS0gdW5pdF9zdGFydF9zdGJfb21fd19yZCAocmVhZCBvbmx5KSovCisvKiBiaXQgICAgIDEgLS0gb21fY21kX292ZXJmbG93IChyZWFkIG9ubHkpKi8KKy8qIGJpdCAgICAgMCAtLSBvbV9jbWRfcGVuZGluZyAocmVhZCkqLworLyogYml0ICAgICAwIC0tIG9tX2NtZF9yZWFkX2ZpbmlzaGVkICh3cml0ZSkqLworLyojZGVmaW5lIE9NX0NNRF9TVEFUVVMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMV9PRkZTRVQgKyAweDBiKSAgLy8gMHgxNjBiKi8KKy8qI2RlZmluZSBPTV9DTURfU1RBVFVTXzIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDBiKSAgLy8gMHgxNjViKi8KKy8qI2RlZmluZSBPTV9DTURfU1RBVFVTXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDBiKSAgLy8gMHgxNmFiKi8KKy8qLS0tLS0tLS0tLS0gYml0IGRlZmluZSAtLS0tLS0tLS0tLSovCisjZGVmaW5lIE9NX0NNRF9DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBPTV9PVkVSRkxPV19DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBPTV9PVkVSV1JJVEVfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBUWVBFX1NUQl9PTV9XX1JEICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBVTklUX1NUQVJUX1NUQl9PTV9XX1JEICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBPTV9DTURfT1ZFUkZMT1cgICAgICAgICAgICAgICAgICAgICAgICAgMQorCisvKiBiaXQgMTU6OSAtLSBjb3VudF9zdGJfb21fd19yZCAgKHJlYWQgb25seSkqLworLyogYml0IDg6MCAtLSBzdGFydF9zdGJfb21fd2FfcmQgKHJlYWQgb25seSkqLworLyojZGVmaW5lIE9NX0NNRF9EQVRBCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHgwYykgIC8vIDB4MTYwYyovCisvKiNkZWZpbmUgT01fQ01EX0RBVEFfMgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4MGMpICAvLyAweDE2NWMqLworLyojZGVmaW5lIE9NX0NNRF9EQVRBXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDBjKSAgLy8gMHgxNmFjKi8KKy8qLS0tLS0tLS0tLS0gYml0IGRlZmluZSAtLS0tLS0tLS0tLSovCisjZGVmaW5lIENPVU5UX1NUQl9PTV9XX1JEICAgICAgICAgICAgICAgICAgICAgICA5CisKKy8qIGJpdCAxMTowIC0tIG9mZnNldCBmb3Igc2VjdGlvbiBkYXRhKi8KKy8qI2RlZmluZSBPTV9DTURfREFUQTIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMV9PRkZTRVQgKyAweDBkKSAgLy8gMHgxNjBkKi8KKy8qI2RlZmluZSBPTV9DTURfREFUQTJfMgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4MGQpICAvLyAweDE2NWQqLworLyojZGVmaW5lIE9NX0NNRF9EQVRBMl8zCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzNfT0ZGU0VUICsgMHgwZCkgIC8vIDB4MTZhZCovCisKKy8qIGJpdCAzMToxNiAtLSBiYXNlIGFkZHJlc3MgZm9yIHNlY3Rpb24gYnVmZmVyIGdyb3VwIDAKKyAqICgqMHg0MDAgdG8gZ2V0IHJlYWwgYWRkcmVzcykqLworLyogYml0IDE1OjAgLS0gYmFzZSBhZGRyZXNzIGZvciBzZWN0aW9uIGJ1ZmZlciBncm91cCAxCisgKiAoKjB4NDAwIHRvIGdldCByZWFsIGFkZHJlc3MpKi8KKy8qI2RlZmluZSBTRUNfQlVGRl8wMV9TVEFSVAorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4MGUpICAvLyAweDE2MGUqLworLyojZGVmaW5lIFNFQ19CVUZGXzAxX1NUQVJUXzIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDBlKSAgLy8gMHgxNjVlKi8KKy8qI2RlZmluZSBTRUNfQlVGRl8wMV9TVEFSVF8zCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzNfT0ZGU0VUICsgMHgwZSkgIC8vIDB4MTZhZSovCisvKi0tLS0tLS0tLS0tIGJpdCBkZWZpbmUgLS0tLS0tLS0tLS0qLworI2RlZmluZSBTRUNfQlVGRl8wX0JBU0VfQUREUiAgICAgICAgICAgICAgICAgICAgMTYKKworLyogYml0IDMxOjE2IC0tIGJhc2UgYWRkcmVzcyBmb3Igc2VjdGlvbiBidWZmZXIgZ3JvdXAgMgorICogKCoweDQwMCB0byBnZXQgcmVhbCBhZGRyZXNzKSovCisvKiBiaXQgMTU6MCAtLSBiYXNlIGFkZHJlc3MgZm9yIHNlY3Rpb24gYnVmZmVyIGdyb3VwIDMKKyAqICgqMHg0MDAgdG8gZ2V0IHJlYWwgYWRkcmVzcykqLworLyojZGVmaW5lIFNFQ19CVUZGXzIzX1NUQVJUCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHgwZikgIC8vIDB4MTYwZiovCisvKiNkZWZpbmUgU0VDX0JVRkZfMjNfU1RBUlRfMgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4MGYpICAvLyAweDE2NWYqLworLyojZGVmaW5lIFNFQ19CVUZGXzIzX1NUQVJUXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDBmKSAgLy8gMHgxNmFmKi8KKy8qLS0tLS0tLS0tLS0gYml0IGRlZmluZSAtLS0tLS0tLS0tLSovCisjZGVmaW5lIFNFQ19CVUZGXzJfQkFTRV9BRERSICAgICAgICAgICAgICAgICAgICAxNgorCisvKiBiaXQgMTU6MTIgLS0gc2VjdGlvbiBidWZmZXIgc2l6ZSBmb3IgZ3JvdXAgMyovCisvKiBiaXQgMTE6OCAtLSBzZWN0aW9uIGJ1ZmZlciBzaXplIGZvciBncm91cCAyKi8KKy8qIGJpdCA3OjQgLS0gc2VjdGlvbiBidWZmZXIgc2l6ZSBmb3IgZ3JvdXAgMSovCisvKiBiaXQgMzowIC0tIHNlY3Rpb24gYnVmZmVyIHNpemUgZm9yIGdyb3VwIDAKKyAqIChiaXQgdXNlZCwgIGZvciBleGFtcGxlLCAxMCBtZWFucyAxSykqLworLyojZGVmaW5lIFNFQ19CVUZGX1NJWkUKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMV9PRkZTRVQgKyAweDEwKSAgLy8gMHgxNjEwKi8KKy8qI2RlZmluZSBTRUNfQlVGRl9TSVpFXzIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDEwKSAgLy8gMHgxNjYwKi8KKy8qI2RlZmluZSBTRUNfQlVGRl9TSVpFXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDEwKSAgLy8gMHgxNmIwKi8KKy8qLS0tLS0tLS0tLS0gYml0IGRlZmluZSAtLS0tLS0tLS0tLSovCisjZGVmaW5lIFNFQ19CVUZGXzNfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIFNFQ19CVUZGXzJfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFNFQ19CVUZGXzFfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICA0CisKKy8qIHNlY3Rpb24gYnVmZmVyIGJ1c3kgc3RhdHVzIGZvciBidWZmIDMxOjAgKCBSZWFkIE9ubHkgKSovCisvKiNkZWZpbmUgU0VDX0JVRkZfQlVTWQorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4MTEpICAvLyAweDE2MTEqLworLyojZGVmaW5lIFNFQ19CVUZGX0JVU1lfMgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4MTEpICAvLyAweDE2NjEqLworLyojZGVmaW5lIFNFQ19CVUZGX0JVU1lfMworICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4MTEpICAvLyAweDE2YjEqLworCisvKiBzZWN0aW9uIGJ1ZmZlciB3cml0ZSBzdGF0dXMgZm9yIGJ1ZmYgMzE6MCAtLSBSZWFkKi8KKy8qIGNsZWFyIGJ1ZmZlciBzdGF0dXMgKCBidWZmIFJFQURZIGFuZCBCVVNZICkgLS0gd3JpdGUqLworLyojZGVmaW5lIFNFQ19CVUZGX1JFQURZCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHgxMikgIC8vIDB4MTYxMiovCisvKiNkZWZpbmUgU0VDX0JVRkZfUkVBRFlfMgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4MTIpICAvLyAweDE2NjIqLworLyojZGVmaW5lIFNFQ19CVUZGX1JFQURZXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDEyKSAgLy8gMHgxNmIyKi8KKworLyogYml0IDE1IC0tIHNlY3Rpb25fcmVzZXRfYnVzeSAoUmVhZCBPbmx5KSovCisvKiBiaXQgMTQgLS0gb3V0cHV0X3NlY3Rpb25fYnVmZmVyX3ZhbGlkKi8KKy8qIGJpdCAxMjo4IC0tIFNFQ19CVUZGRVJfTlVNQkVSIGZvciB0aGUgSU5ERVggYnVmZmVyICBSZWFkX09ubHkqLworLyogYml0IDQ6MCAtLSBTRUNfQlVGRkVSX0lOREVYICAgUlcqLworLyojZGVmaW5lIFNFQ19CVUZGX05VTUJFUgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4MTMpICAvLyAweDE2MTMqLworLyojZGVmaW5lIFNFQ19CVUZGX05VTUJFUl8yCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzJfT0ZGU0VUICsgMHgxMykgIC8vIDB4MTY2MyovCisvKiNkZWZpbmUgU0VDX0JVRkZfTlVNQkVSXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDEzKSAgLy8gMHgxNmIzKi8KKy8qLS0tLS0tLS0tLS0gYml0IGRlZmluZSAtLS0tLS0tLS0tLSovCisjZGVmaW5lIFNFQ1RJT05fUkVTRVRfQlVTWSAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBPVVRQVVRfU0VDVElPTl9CVUZGRVJfVkFMSUQgICAgICAgICAgICAgMTQKKyNkZWZpbmUgSU5ERVhFRF9TRUNfQlVGRl9OVU1CRVIgICAgICAgICAgICAgICAgIDgKKworLyogYml0IDk6NSAtLSBCWVBBU1MgUElEIG51bWJlciovCisvKiBiaXQgNDowIC0tIFBDUiBQSUQgbnVtYmVyKi8KKy8qI2RlZmluZSBBU1NJR05fUElEX05VTUJFUgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4MTQpICAvLyAweDE2MTQqLworLyojZGVmaW5lIEFTU0lHTl9QSURfTlVNQkVSXzIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDE0KSAgLy8gMHgxNjY0Ki8KKy8qI2RlZmluZSBBU1NJR05fUElEX05VTUJFUl8zCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzNfT0ZGU0VUICsgMHgxNCkgIC8vIDB4MTZiNCovCisvKi0tLS0tLS0tLS0tIGJpdCBkZWZpbmUgLS0tLS0tLS0tLS0qLworI2RlZmluZSBCWVBBU1NfUElEX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgNQorCisvKiBiaXQgMTU6MCAtLSBzdHJlYW1faWQgZmlsdGVyIGJpdCBlbmFibGUqLworLyogYml0IDc6MCAtLSBzdHJlYW1faWQgZmlsdGVyIHRhcmdldCovCisvKiNkZWZpbmUgVklERU9fU1RSRUFNX0lECisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHgxNSkgIC8vIDB4MTYxNSovCisvKiNkZWZpbmUgVklERU9fU1RSRUFNX0lEXzIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDE1KSAgLy8gMHgxNjY1Ki8KKy8qI2RlZmluZSBWSURFT19TVFJFQU1fSURfMworICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4MTUpICAvLyAweDE2YjUqLworCisvKiNkZWZpbmUgQVVESU9fU1RSRUFNX0lECisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHgxNikgIC8vIDB4MTYxNiovCisvKiNkZWZpbmUgQVVESU9fU1RSRUFNX0lEXzIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDE2KSAgLy8gMHgxNjY2Ki8KKy8qI2RlZmluZSBBVURJT19TVFJFQU1fSURfMworICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4MTYpICAvLyAweDE2YjYqLworCisvKiNkZWZpbmUgU1VCX1NUUkVBTV9JRAorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4MTcpICAvLyAweDE2MTcqLworLyojZGVmaW5lIFNVQl9TVFJFQU1fSURfMgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4MTcpICAvLyAweDE2NjcqLworLyojZGVmaW5lIFNVQl9TVFJFQU1fSURfMworICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4MTcpICAvLyAweDE2YjcqLworCisvKiNkZWZpbmUgT1RIRVJfU1RSRUFNX0lECisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHgxOCkgIC8vIDB4MTYxOCovCisvKiNkZWZpbmUgT1RIRVJfU1RSRUFNX0lEXzIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDE4KSAgLy8gMHgxNjY4Ki8KKy8qI2RlZmluZSBPVEhFUl9TVFJFQU1fSURfMworICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4MTgpICAvLyAweDE2YjgqLworCisvKiBiaXQgMTIgLS0gUENSX0VOKi8KKy8qIGJpdCAxMTowIC0tIFBDUjkwS19ESVYqLworLyojZGVmaW5lIFBDUjkwS19DVEwKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMV9PRkZTRVQgKyAweDE5KSAgLy8gMHgxNjE5Ki8KKy8qI2RlZmluZSBQQ1I5MEtfQ1RMXzIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDE5KSAgLy8gMHgxNjY5Ki8KKy8qI2RlZmluZSBQQ1I5MEtfQ1RMXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDE5KSAgLy8gMHgxNmI5Ki8KKy8qLS0tLS0tLS0tLS0gYml0IGRlZmluZSAtLS0tLS0tLS0tLSovCisjZGVmaW5lIFBDUl9FTiAgICAgICAgICAgICAgICAgICAgIDEyCisKKy8qIGJpdCAxNTowIC0tIFBDUlszMTowXSBSL1cqLworLyojZGVmaW5lIFBDUl9ERU1VWAorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4MWEpICAvLyAweDE2MWEqLworLyojZGVmaW5lIFBDUl9ERU1VWF8yCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzJfT0ZGU0VUICsgMHgxYSkgIC8vIDB4MTY2YSovCisvKiNkZWZpbmUgUENSX0RFTVVYXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDFhKSAgLy8gMHgxNmJhKi8KKworLyogYml0IDE1OjAgLS0gVlBUU1szMTowXSBSL1cqLworLyojZGVmaW5lIFZJREVPX1BUU19ERU1VWAorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4MWIpICAvLyAweDE2MWIqLworLyojZGVmaW5lIFZJREVPX1BUU19ERU1VWF8yCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzJfT0ZGU0VUICsgMHgxYikgIC8vIDB4MTY2YiovCisvKiNkZWZpbmUgVklERU9fUFRTX0RFTVVYXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDFiKSAgLy8gMHgxNmJiKi8KKworLyogYml0IDE1OjAgLS0gVkRUU1szMTowXSBSL1cqLworLyojZGVmaW5lIFZJREVPX0RUU19ERU1VWAorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4MWMpICAvLyAweDE2MWMqLworLyojZGVmaW5lIFZJREVPX0RUU19ERU1VWF8yCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzJfT0ZGU0VUICsgMHgxYykgIC8vIDB4MTY2YyovCisvKiNkZWZpbmUgVklERU9fRFRTX0RFTVVYXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDFjKSAgLy8gMHgxNmJjKi8KKworLyogYml0IDE1OjAgLS0gQVBUU1szMTowXSBSL1cqLworLyojZGVmaW5lIEFVRElPX1BUU19ERU1VWAorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4MWQpICAvLyAweDE2MWQqLworLyojZGVmaW5lIEFVRElPX1BUU19ERU1VWF8yCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzJfT0ZGU0VUICsgMHgxZCkgIC8vIDB4MTY2ZCovCisvKiNkZWZpbmUgQVVESU9fUFRTX0RFTVVYXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDFkKSAgLy8gMHgxNmJkKi8KKworLyogYml0IDE1OjAgLS0gU1BUU1szMTowXSBSL1cqLworLyojZGVmaW5lIFNVQl9QVFNfREVNVVgKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMV9PRkZTRVQgKyAweDFlKSAgLy8gMHgxNjFlKi8KKy8qI2RlZmluZSBTVUJfUFRTX0RFTVVYXzIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDFlKSAgLy8gMHgxNjZlKi8KKy8qI2RlZmluZSBTVUJfUFRTX0RFTVVYXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDFlKSAgLy8gMHgxNmJlKi8KKworLyogcmVhZCAtLSBzdGF0dXMsIHdyaXRlIDEgY2xlYXIgc3RhdHVzKi8KKy8qIGJpdCAxNSAtLSBTVUJfUFRTWzMyXSovCisvKiBiaXQgMTQgLS0gQVVESU9fUFRTWzMyXSovCisvKiBiaXQgMTMgLS0gVklERU9fRFRTWzMyXSovCisvKiBiaXQgMTIgLS0gVklERU9fUFRTWzMyXSovCisvKiBiaXQgMyAtLSBzdWJfcHRzX3JlYWR5Ki8KKy8qIGJpdCAyIC0tIGF1ZGlvX3B0c19yZWFkeSovCisvKiBiaXQgMSAtLSB2aWRlb19kdHNfcmVhZHkqLworLyogYml0IDAgLS0gdmlkZW9fcHRzX3JlYWR5Ki8KKy8qI2RlZmluZSBTVEJfUFRTX0RUU19TVEFUVVMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMV9PRkZTRVQgKyAweDFmKSAgLy8gMHgxNjFmKi8KKy8qI2RlZmluZSBTVEJfUFRTX0RUU19TVEFUVVNfMgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4MWYpICAvLyAweDE2NmYqLworLyojZGVmaW5lIFNUQl9QVFNfRFRTX1NUQVRVU18zCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzNfT0ZGU0VUICsgMHgxZikgIC8vIDB4MTZiZiovCisvKi0tLS0tLS0tLS0tIGJpdCBkZWZpbmUgLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVUJfUFRTX0JJVDMyICAgICAgICAgICAgICAxNQorI2RlZmluZSBBVURJT19QVFNfQklUMzIgICAgICAgICAgICAxNAorI2RlZmluZSBWSURFT19EVFNfQklUMzIgICAgICAgICAgICAxMworI2RlZmluZSBWSURFT19QVFNfQklUMzIgICAgICAgICAgICAxMgorI2RlZmluZSBTVUJfUFRTX1JFQURZICAgICAgICAgICAgICAzCisjZGVmaW5lIEFVRElPX1BUU19SRUFEWSAgICAgICAgICAgIDIKKyNkZWZpbmUgVklERU9fRFRTX1JFQURZICAgICAgICAgICAgMQorI2RlZmluZSBWSURFT19QVFNfUkVBRFkgICAgICAgICAgICAwCisKKy8qIGJpdCAzOjAgLS0qLworLyogIDAgLS0gYWRhcHRhdGlvbl9maWVsZF9sZW5ndGhbNzowXSwgYWRhcHRpb25fZmllbGRfYnl0ZV8xWzc6MF0qLworLyogIDEgLS0gc3RyZWFtX2lkWzc6MF0sIHBlc19oZWFkZXJfYnl0ZXNfbGVmdFs3OjBdKi8KKy8qICAyIC0tIHBlc19wYWNrYWdlX2J5dGVzX2xlZnRbMTU6MF0qLworLyogIDMgLS0gcGVzX2N0cl9ieXRlWzc6MF0sIHBlc19mbGFnX2J5dGVbNzowXSovCisvKiNkZWZpbmUgU1RCX0RFQlVHX0lOREVYCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHgyMCkgIC8vIDB4MTYyMCovCisvKiNkZWZpbmUgU1RCX0RFQlVHX0lOREVYXzIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDIwKSAgLy8gMHgxNjcwKi8KKy8qI2RlZmluZSBTVEJfREVCVUdfSU5ERVhfMworICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4MjApICAvLyAweDE2YzAqLworCisvKiByZWFkIG9ubHkqLworLyojZGVmaW5lIFNUQl9ERUJVR19EQVRBX09VVAorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4MjEpICAvLyAweDE2MjEqLworLyojZGVmaW5lIFNUQl9ERUJVR19EQVRBX09VVF8yCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzJfT0ZGU0VUICsgMHgyMSkgIC8vIDB4MTY3MSovCisvKiNkZWZpbmUgU1RCX0RFQlVHX0RBVEFfT1VUXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDIxKSAgLy8gMHgxNmMxKi8KKworLyogYml0WzMxXSAtLSBub19tYXRjaF9yZWNvcmRfZW4qLworLyogYml0WzMwOjE2XSAtIHJlc2VydmVkKi8KKy8qIGRlZmF1bHQgOiAweDgwN2YqLworLyogYml0IDE1OjkgIC0tIE1BWCBPTSBETUEgQ09VTlQgIChkZWZhdWx0OiAweDQwKSovCisvKiBiaXQgODowICAgLS0gTEFTVCBBRERSIE9GIE9NIEFERFIgKGRlZmF1bHQ6IDEyNykqLworLyojZGVmaW5lIFNUQl9PTV9DVEwgXAorCShTVEJfQ0JVU19CQVNFICsgREVNVVhfMV9PRkZTRVQgKyAweDIyKSAvLyAweDE2MjIqLworLyojZGVmaW5lIFNUQl9PTV9DVExfMiBcCisJKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4MjIpIC8vIDB4MTY3MiovCisvKiNkZWZpbmUgU1RCX09NX0NUTF8zIFwKKwkoU1RCX0NCVVNfQkFTRSArIERFTVVYXzNfT0ZGU0VUICsgMHgyMikgLy8gMHgxNmMyKi8KKy8qLS0tLS0tLS0tLS0gYml0IGRlZmluZSAtLS0tLS0tLS0tLSovCisjZGVmaW5lIE1BWF9PTV9ETUFfQ09VTlQgICAgICAgICAgIDkKKyNkZWZpbmUgTEFTVF9PTV9BRERSICAgICAgICAgICAgICAgMAorCisvKiAxNTowICBXUklURSAxIENMRUFSIHRvIGNsZWFyIGludGVycnVwdCBzb3VyY2UqLworLyoxMiAtLSBJTlBVVF9USU1FX09VVCovCisvKjExIC0tIFBDUl9yZWFkeSovCisvKjEwIC0tIGF1ZGlvX3NwbGljaW5nX3BvaW50Ki8KKy8qIDkgLS0gdmlkZW9fc3BsaWNpbmdfcG9pbnQqLworLyogOCAtLSBvdGhlcl9QRVNfaW50Ki8KKy8qIDcgLS0gc3ViX1BFU19pbnQqLworLyogNiAtLSBkaXNjb250aW51aXR5Ki8KKy8qIDUgLS0gZHVwbGljYXRlZF9wYWNrX2ZvdW5kKi8KKy8qIDQgLS0gTmV3IFBEVFMgcmVhZHkqLworLyogMyAtLSBvbV9jbWRfYnVmZmVyIHJlYWR5IGZvciBhY2Nlc3MqLworLyogMiAtLSBzZWN0aW9uIGJ1ZmZlciByZWFkeSovCisvKiAxIC0tIHRyYW5zcG9ydF9lcnJvcl9pbmRpY2F0b3IqLworLyogMCAtLSBUUyBFUlJPUiBQSU4qLworLyojZGVmaW5lIFNUQl9JTlRfU1RBVFVTCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHgyMykgIC8vIDB4MTYyMyovCisvKiNkZWZpbmUgU1RCX0lOVF9TVEFUVVNfMgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4MjMpICAvLyAweDE2NzMqLworLyojZGVmaW5lIFNUQl9JTlRfU1RBVFVTXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDIzKSAgLy8gMHgxNmMzKi8KKy8qLS0tLS0tLS0tLS0gYml0IGRlZmluZSAtLS0tLS0tLS0tLSovCisjZGVmaW5lIElOUFVUX1RJTUVfT1VUICAgICAgICAgICAgIDEyCisjZGVmaW5lIFBDUl9SRUFEWSAgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIEFVRElPX1NQTElDSU5HX1BPSU5UICAgICAgIDEwCisjZGVmaW5lIFZJREVPX1NQTElDSU5HX1BPSU5UICAgICAgIDkKKyNkZWZpbmUgT1RIRVJfUEVTX1JFQURZICAgICAgICAgICAgOAorI2RlZmluZSBTVUJfUEVTX1JFQURZICAgICAgICAgICAgICA3CisjZGVmaW5lIERJU19DT05USU5VSVRZX1BBQ0tFVCAgICAgIDYKKyNkZWZpbmUgRFVQTElDQVRFRF9QQUNLRVQgICAgICAgICAgNQorI2RlZmluZSBORVdfUERUU19SRUFEWSAgICAgICAgICAgICA0CisjZGVmaW5lIE9NX0NNRF9SRUFEX1BFTkRJTkcgICAgICAgIDMKKyNkZWZpbmUgU0VDVElPTl9CVUZGRVJfUkVBRFkgICAgICAgMgorI2RlZmluZSBUU19FUlJPUl9QQUNLQUdFICAgICAgICAgICAxCisjZGVmaW5lIFRTX0VSUk9SX1BJTiAgICAgICAgICAgICAgIDAKKworLyogV2hlbiBCaXQgMzEgLSAxIHdyaXRlIHdpbGwgaW5kaWNhdGUgYWxsIHR5cGUgdXNlIHNlcGVydGF0ZSBlbmRpYW4KKyAqIChXcml0ZSBPbmx5KSovCisvKiBXaGVuIEJpdCAzMSAtIDAgd3JpdGUgd2lsbCBpbmRpY2F0ZSBhbGwgdHlwZSBlbHNlIHVzZSBCaXQgODo2Ki8KKy8qIEJpdCAyMzoyMSAtIGRlbXV4IG9tIHdyaXRlIGVuZGlhbiBjb250cm9sIGZvciBPVEhFUl9QRVNfUEFDS0VUKi8KKy8qIEJpdCAyMDoxOCAtIGRlbXV4IG9tIHdyaXRlIGVuZGlhbiBjb250cm9sIGZvciBTQ1JfT05MWV9QQUNLRVQqLworLyogQml0IDE3OjE1IC0gZGVtdXggb20gd3JpdGUgZW5kaWFuIGNvbnRyb2wgZm9yIFNVQl9QQUNLRVQqLworLyogQml0IDE0OjEyIC0gZGVtdXggb20gd3JpdGUgZW5kaWFuIGNvbnRyb2wgZm9yIEFVRElPX1BBQ0tFVCovCisvKiBCaXQgMTE6OSAgLSBkZW11eCBvbSB3cml0ZSBlbmRpYW4gY29udHJvbCBmb3IgVklERU9fUEFDS0VUKi8KKy8qIEJpdCA4OjYgLSBkZW11eCBvbSB3cml0ZSBlbmRpYW4gY29udHJvbCBmb3IgZWxzZSovCisvKiBCaXQgNTozIC0gZGVtdXggb20gd3JpdGUgZW5kaWFuIGNvbnRyb2wgZm9yIGJ5cGFzcyovCisvKiBCaXQgMjowIC0gZGVtdXggb20gd3JpdGUgZW5kaWFuIGNvbnRyb2wgZm9yIHNlY3Rpb24qLworLyojZGVmaW5lIERFTVVYX0VORElBTgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4MjQpICAvLyAweDE2MjQqLworLyojZGVmaW5lIERFTVVYX0VORElBTl8yCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzJfT0ZGU0VUICsgMHgyNCkgIC8vIDB4MTY3NCovCisvKiNkZWZpbmUgREVNVVhfRU5ESUFOXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDI0KSAgLy8gMHgxNmM0Ki8KKy8qLS0tLS0tLS0tLS0gYml0IGRlZmluZSAtLS0tLS0tLS0tLSovCisjZGVmaW5lIFNFUEVSQVRFX0VORElBTiAgICAgICAgICAgIDMxCisjZGVmaW5lIE9USEVSX1BFU19FTkRJQU4gICAgICAgICAgIDIxCisjZGVmaW5lIFNDUl9FTkRJQU4gICAgICAgICAgICAgICAgIDE4CisjZGVmaW5lIFNVQl9FTkRJQU4gICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIEFVRElPX0VORElBTiAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIFZJREVPX0VORElBTiAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgT1RIRVJfRU5ESUFOICAgICAgICAgICAgICAgNgorI2RlZmluZSBCWVBBU1NfRU5ESUFOICAgICAgICAgICAgICAzCisjZGVmaW5lIFNFQ1RJT05fRU5ESUFOICAgICAgICAgICAgIDAKKworLyogQml0IDEwOjkgLS0gUERUU193cl9zZWw6IDAgc2VsZWN0IHZpZGVvX1BEVFNfd3JfcHRyOyAxIHNlbGVjdCB2aWRlb19QRFRTX3dyX3B0cl9wYXJzZXJfQjsgKi8KKy8qIEJpdCA3OjggLS0gdXNlIGhpX2JzZiBpbnRlcmZhY2UqLworLyogQml0IDY6MiAtIGZlY19jbGtfZGl2Ki8KKy8qIEJpdCAxIHRzX3NvdXJjZV9zZWwgKi8KKy8qIEJpdCAwIC0gSGl1IFRTIGdlbmVyYXRlIGVuYWJsZSAqLworLyojZGVmaW5lIFRTX0hJVV9DVEwKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMV9PRkZTRVQgKyAweDI1KSAgLy8gMHgxNjI1Ki8KKy8qI2RlZmluZSBUU19ISVVfQ1RMXzIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDI1KSAgLy8gMHgxNjc1Ki8KKy8qI2RlZmluZSBUU19ISVVfQ1RMXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDI1KSAgLy8gMHgxNmM1Ki8KKy8qLS0tLS0tLS0tLS0gYml0IGRlZmluZSAtLS0tLS0tLS0tLSovCisvLyNkZWZpbmUgTEFTVF9CVVJTVF9USFJFU0hPTEQgICAgICAgOAorI2RlZmluZSBQRFRTX1dSX1NFTAkJCSAgICAgICA5CisjZGVmaW5lIFVTRV9ISV9CU0ZfSU5URVJGQUNFICAgICAgIDcKKworLyogYml0IDE1OjAgLS0gYmFzZSBhZGRyZXNzIGZvciBzZWN0aW9uIGJ1ZmZlciBzdGFydAorICogKCoweDEwMDAwIHRvIGdldCByZWFsIGJhc2UpKi8KKy8qI2RlZmluZSBTRUNfQlVGRl9CQVNFCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHgyNikgIC8vIDB4MTYyNiovCisvKiNkZWZpbmUgU0VDX0JVRkZfQkFTRV8yCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzJfT0ZGU0VUICsgMHgyNikgIC8vIDB4MTY3NiovCisvKiNkZWZpbmUgU0VDX0JVRkZfQkFTRV8zCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzNfT0ZGU0VUICsgMHgyNikgIC8vIDB4MTZjNiovCisKKy8qIGJpdCAxMSAtLSBtYXNrIGJpdCBmb3IgT1RIRVJfUEVTX0FIQl9ETUFfRU4qLworLyogYml0IDEwIC0tIG1hc2sgYml0IGZvciBTVUJfQUhCX0RNQV9FTiovCisvKiBiaXQgOSAtLSBtYXNrIGJpdCBmb3IgQllQQVNTX0FIQl9ETUFfRU4qLworLyogYml0IDggLS0gbWFzayBiaXQgZm9yIFNFQ1RJT05fQUhCX0RNQV9FTiovCisvKiBiaXQgNyAtLSBtYXNrIGJpdCBmb3IgcmVjb2RlciBzdHJlYW0qLworLyogYml0IDY6MCAtLSBtYXNrIGJpdCBmb3IgZWFjaCB0eXBlKi8KKy8qI2RlZmluZSBERU1VWF9NRU1fUkVRX0VOCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHgyNykgIC8vIDB4MTYyNyovCisvKiNkZWZpbmUgREVNVVhfTUVNX1JFUV9FTl8yCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzJfT0ZGU0VUICsgMHgyNykgIC8vIDB4MTY3NyovCisvKiNkZWZpbmUgREVNVVhfTUVNX1JFUV9FTl8zCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzNfT0ZGU0VUICsgMHgyNykgIC8vIDB4MTZjNyovCisvKi0tLS0tLS0tLS0tIGJpdCBkZWZpbmUgLS0tLS0tLS0tLS0qLworI2RlZmluZSBWSURFTzJfRE1BX0VOX0JJVCAgICAgICAgICAxMgorI2RlZmluZSBPVEhFUl9QRVNfQUhCX0RNQV9FTiAgICAgICAxMQorI2RlZmluZSBTVUJfQUhCX0RNQV9FTiAgICAgICAgICAgICAxMAorI2RlZmluZSBCWVBBU1NfQUhCX0RNQV9FTiAgICAgICAgICA5CisjZGVmaW5lIFNFQ1RJT05fQUhCX0RNQV9FTiAgICAgICAgIDgKKyNkZWZpbmUgUkVDT1JERVJfU1RSRUFNICAgICAgICAgICAgNworI2RlZmluZSBPVEhFUl9QRVNfUEFDS0VUICAgICAgICAgICA2CisjZGVmaW5lIFNDUl9PTkxZX1BBQ0tFVCAgICAgICAgICAgIDUgIC8qd2lsbCBuZXZlciBiZSB1c2VkKi8KKyNkZWZpbmUgQllQQVNTX1BBQ0tFVCAgICAgICAgICAgICAgNAorI2RlZmluZSBTRUNUSU9OX1BBQ0tFVCAgICAgICAgICAgICAzCisjZGVmaW5lIFNVQl9QQUNLRVQgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVVESU9fUEFDS0VUICAgICAgICAgICAgICAgMQorI2RlZmluZSBWSURFT19QQUNLRVQgICAgICAgICAgICAgICAwCisKKy8qIGJpdCAzMTowIC0tIHZiX3dyX3B0ciBmb3IgdmlkZW8gUERUUyovCisvKiNkZWZpbmUgVklERU9fUERUU19XUl9QVFIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMV9PRkZTRVQgKyAweDI4KSAgLy8gMHgxNjI4Ki8KKy8qI2RlZmluZSBWSURFT19QRFRTX1dSX1BUUl8yCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzJfT0ZGU0VUICsgMHgyOCkgIC8vIDB4MTY3OCovCisvKiNkZWZpbmUgVklERU9fUERUU19XUl9QVFJfMworICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4MjgpICAvLyAweDE2YzgqLworCisvKiBiaXQgMzE6MCAtLSBhYl93cl9wdHIgZm9yIGF1ZGlvIFBEVFMqLworLyojZGVmaW5lIEFVRElPX1BEVFNfV1JfUFRSCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHgyOSkgIC8vIDB4MTYyOSovCisvKiNkZWZpbmUgQVVESU9fUERUU19XUl9QVFJfMgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4MjkpICAvLyAweDE2NzkqLworLyojZGVmaW5lIEFVRElPX1BEVFNfV1JfUFRSXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDI5KSAgLy8gMHgxNmM5Ki8KKworLyogYml0IDIwOjAgLS0gU0JfV1JJVEVfUFRSIChzYl93cl9wdHIgPDwgMyA9PSBieXRlIHdyaXRlIHBvc2l0aW9uKSovCisvKiNkZWZpbmUgU1VCX1dSX1BUUgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4MmEpICAvLyAweDE2MmEqLworLyojZGVmaW5lIFNVQl9XUl9QVFJfMgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4MmEpICAvLyAweDE2N2EqLworLyojZGVmaW5lIFNVQl9XUl9QVFJfMworICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4MmEpICAvLyAweDE2Y2EqLworCisvKiBiaXQgMTk6MCAtLSBTQl9TVEFSVCAoc2Jfc3RhcnQgPDwgMTIgPT0gYnl0ZSBhZGRyZXNzKTsqLworLyojZGVmaW5lIFNCX1NUQVJUCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHgyYikgIC8vIDB4MTYyYiovCisvKiNkZWZpbmUgU0JfU1RBUlRfMgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4MmIpICAvLyAweDE2N2IqLworLyojZGVmaW5lIFNCX1NUQVJUXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDJiKSAgLy8gMHgxNmNiKi8KKworLyogYml0IDIwOjAgLS0gU0JfU0laRSAoc2Jfc2l6ZSA8PCAzID09IGJ5dGUgc2l6ZSwgMTZNIG1heGltdW4pKi8KKy8qI2RlZmluZSBTQl9MQVNUX0FERFIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMV9PRkZTRVQgKyAweDJjKSAgLy8gMHgxNjJjKi8KKy8qI2RlZmluZSBTQl9MQVNUX0FERFJfMgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4MmMpICAvLyAweDE2N2MqLworLyojZGVmaW5lIFNCX0xBU1RfQUREUl8zCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzNfT0ZGU0VUICsgMHgyYykgIC8vIDB4MTZjYyovCisKKy8qIGJpdCAzMTowIC0tIHNiX3dyX3B0ciBmb3Igc3ViIFBFUyovCisvKiNkZWZpbmUgU0JfUEVTX1dSSVRFX1BUUgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4MmQpICAvLyAweDE2MmQqLworLyojZGVmaW5lIFNCX1BFU19XUklURV9QVFJfMgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4MmQpICAvLyAweDE2N2QqLworLyojZGVmaW5lIFNCX1BFU19XUklURV9QVFJfMworICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4MmQpICAvLyAweDE2Y2QqLworCisvKiBiaXQgMzE6MTYgLS0gb2Jfd3JfcHRyIGZvciBvdGhlciBQRVMqLworLyogYml0IDIwOjAgLS0gT0JfV1JJVEVfUFRSIChvYl93cl9wdHIgPDwgMyA9PSBieXRlIHdyaXRlIHBvc2l0aW9uKSovCisvKiNkZWZpbmUgT1RIRVJfV1JfUFRSCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHgyZSkgIC8vIDB4MTYyZSovCisvKiNkZWZpbmUgT1RIRVJfV1JfUFRSXzIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDJlKSAgLy8gMHgxNjdlKi8KKy8qI2RlZmluZSBPVEhFUl9XUl9QVFJfMworICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4MmUpICAvLyAweDE2Y2UqLworCisvKiBiaXQgMTk6MCAtLSBPQl9TVEFSVCAob2Jfc3RhcnQgPDwgMTIgPT0gYnl0ZSBhZGRyZXNzKTsqLworLyojZGVmaW5lIE9CX1NUQVJUCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHgyZikgIC8vIDB4MTYyZiovCisvKiNkZWZpbmUgT0JfU1RBUlRfMgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4MmYpICAvLyAweDE2N2YqLworLyojZGVmaW5lIE9CX1NUQVJUXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDJmKSAgLy8gMHgxNmNmKi8KKworLyogYml0IDIwOjAgLS0gT0JfU0laRSAob2Jfc2l6ZSA8PCAzID09IGJ5dGUgc2l6ZSwgMTZNIG1heGltdW4pKi8KKy8qI2RlZmluZSBPQl9MQVNUX0FERFIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMV9PRkZTRVQgKyAweDMwKSAgLy8gMHgxNjMwKi8KKy8qI2RlZmluZSBPQl9MQVNUX0FERFJfMgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4MzApICAvLyAweDE2ODAqLworLyojZGVmaW5lIE9CX0xBU1RfQUREUl8zCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzNfT0ZGU0VUICsgMHgzMCkgIC8vIDB4MTZkMCovCisKKy8qIGJpdCAzMTowIC0tIG9iX3dyX3B0ciBmb3Igc3ViIFBFUyovCisvKiNkZWZpbmUgT0JfUEVTX1dSSVRFX1BUUgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4MzEpICAvLyAweDE2MzEqLworLyojZGVmaW5lIE9CX1BFU19XUklURV9QVFJfMgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4MzEpICAvLyAweDE2ODEqLworLyojZGVmaW5lIE9CX1BFU19XUklURV9QVFJfMworICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4MzEpICAvLyAweDE2ZDEqLworCisvKiAxNTowICBERU1VWCBpbnRlcnJ1cHQgTUFTSyovCisvKiAxMSAtLSBQQ1JfUkVBRFkqLworLyogMTAgLS0gYXVkaW9fc3BsaWNpbmdfcG9pbnQqLworLyogOSAtLSB2aWRlb19zcGxpY2luZ19wb2ludCovCisvKiA4IC0tIG90aGVyX1BFU19pbnQqLworLyogNyAtLSBzdWJfUEVTX2ludCovCisvKiA2IC0tIGRpc2NvbnRpbnVpdHkqLworLyogNSAtLSBkdXBsaWNhdGVkX3BhY2tfZm91bmQqLworLyogNCAtLSBOZXcgUERUUyByZWFkeSovCisvKiAzIC0tIG9tX2NtZF9idWZmZXIgcmVhZHkgZm9yIGFjY2VzcyovCisvKiAyIC0tIHNlY3Rpb24gYnVmZmVyIHJlYWR5Ki8KKy8qIDEgLS0gdHJhbnNwb3J0X2Vycm9yX2luZGljYXRvciovCisvKiAwIC0tIFRTIEVSUk9SIFBJTiovCisvKiNkZWZpbmUgU1RCX0lOVF9NQVNLCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHgzMikgIC8vIDB4MTYzMiovCisvKiNkZWZpbmUgU1RCX0lOVF9NQVNLXzIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDMyKSAgLy8gMHgxNjgyKi8KKy8qI2RlZmluZSBTVEJfSU5UX01BU0tfMworICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4MzIpICAvLyAweDE2ZDIqLworCisvKiAzMToxNiBWSURFTyBQSUQgZmlsdGVyIGRhdGEqLworLyoxNSAtLSBzcGxpY2luZyBWSURFTyBQSUQgY2hhbmdlIGVuYWJsZSovCisvKjE0OjEwIC0tIFZJREVPIFBJRCBGSUxURVIgQUREUkVTUyovCisvKiA5IC0tIFBFUyBzcGxpY2luZyBhY3RpdmUgKFJlYWQgT25seSkqLworLyogOCAtLSBzcGxpY2luZyBhY3RpdmUgKFJlYWQgT25seSkqLworLyogNzowICBzcGxpY2luZyBjb3VudGRvd24gKFJlYWQgT25seSkqLworLyojZGVmaW5lIFZJREVPX1NQTElDSU5HX0NUTAorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4MzMpICAvLyAweDE2MzMqLworLyojZGVmaW5lIFZJREVPX1NQTElDSU5HX0NUTF8yCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzJfT0ZGU0VUICsgMHgzMykgIC8vIDB4MTY4MyovCisvKiNkZWZpbmUgVklERU9fU1BMSUNJTkdfQ1RMXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDMzKSAgLy8gMHgxNmQzKi8KKy8qLS0tLS0tLS0tLS0gYml0IGRlZmluZSAtLS0tLS0tLS0tLSovCisjZGVmaW5lIFZJREVPX1BJRF9GSUxURVJfREFUQSAgICAgIDE2CisjZGVmaW5lIFZJREVPX1NQTElDSU5HX1BJRF9DSEFOR0VfRU5BQkxFICAgICAgIDE1CisjZGVmaW5lIFZJREVPX1BJRF9GSUxURVJfQUREUkVTUyAgIDEwCisjZGVmaW5lIFZJREVPX1BFU19TUExJQ0lOR19BQ1RJVkUgIDkKKyNkZWZpbmUgVklERU9fU1BMSUNJTkdfQUNUSVZFICAgICAgOAorCisKKy8qIDMxOjE2IEFVRElPIFBJRCBmaWx0ZXIgZGF0YSovCisvKjE1IC0tIHNwbGljaW5nIEFVRElPIFBJRCBjaGFuZ2UgZW5hYmxlKi8KKy8qMTQ6MTAgLS0gQVVESU8gUElEIEZJTFRFUiBBRERSRVNTKi8KKy8qIDkgLS0gUEVTIHNwbGljaW5nIGFjdGl2ZSAoUmVhZCBPbmx5KSovCisvKiA4IC0tIHNwbGljaW5nIGFjdGl2ZSAoUmVhZCBPbmx5KSovCisvKiA3OjAgIHNwbGljaW5nIGNvdW50ZG93biAoUmVhZCBPbmx5KSovCisvKiNkZWZpbmUgQVVESU9fU1BMSUNJTkdfQ1RMCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHgzNCkgIC8vIDB4MTYzNCovCisvKiNkZWZpbmUgQVVESU9fU1BMSUNJTkdfQ1RMXzIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDM0KSAgLy8gMHgxNjg0Ki8KKy8qI2RlZmluZSBBVURJT19TUExJQ0lOR19DVExfMworICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4MzQpICAvLyAweDE2ZDQqLworLyotLS0tLS0tLS0tLSBiaXQgZGVmaW5lIC0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgQVVESU9fUElEX0ZJTFRFUl9EQVRBICAgICAgMTYKKyNkZWZpbmUgQVVESU9fU1BMSUNJTkdfUElEX0NIQU5HRV9FTkFCTEUgICAgICAgMTUKKyNkZWZpbmUgQVVESU9fUElEX0ZJTFRFUl9BRERSRVNTICAgMTAKKyNkZWZpbmUgQVVESU9fUEVTX1NQTElDSU5HX0FDVElWRSAgOQorI2RlZmluZSBBVURJT19TUExJQ0lOR19BQ1RJVkUgICAgICA4CisKKy8qIDIzOjE2IE0yVFNfU0tJUF9CWVRFUyovCisvKiAxNTo4IExBU1QgVFMgUEFDS0FHRSBCWVRFIENPVU5UIChSZWFkIE9ubHkpKi8KKy8qIDc6MCAgUEFDS0FHRSBCWVRFIENPVU5UIChSZWFkIE9ubHkpKi8KKy8qI2RlZmluZSBUU19QQUNLQUdFX0JZVEVfQ09VTlQKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMV9PRkZTRVQgKyAweDM1KSAgLy8gMHgxNjM1Ki8KKy8qI2RlZmluZSBUU19QQUNLQUdFX0JZVEVfQ09VTlRfMgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4MzUpICAvLyAweDE2ODUqLworLyojZGVmaW5lIFRTX1BBQ0tBR0VfQllURV9DT1VOVF8zCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzNfT0ZGU0VUICsgMHgzNSkgIC8vIDB4MTZkNSovCisvKi0tLS0tLS0tLS0tIGJpdCBkZWZpbmUgLS0tLS0tLS0tLS0qLworI2RlZmluZSBNMlRTX1NLSVBfQllURVMgICAgICAgICAgICAxNgorI2RlZmluZSBMQVNUX1RTX1BBQ0tBR0VfQllURV9DT1VOVCA4CisKKy8qIDE1OjAgMiBieXRlcyBzdHJvbmcgc3luYyBhZGQgdG8gUEVTKi8KKy8qI2RlZmluZSBQRVNfU1RST05HX1NZTkMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMV9PRkZTRVQgKyAweDM2KSAgLy8gMHgxNjM2Ki8KKy8qI2RlZmluZSBQRVNfU1RST05HX1NZTkNfMgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4MzYpICAvLyAweDE2ODYqLworLyojZGVmaW5lIFBFU19TVFJPTkdfU1lOQ18zCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzNfT0ZGU0VUICsgMHgzNikgIC8vIDB4MTZkNiovCisKKy8qIGJpdCAxNSAtLSBzdGJfb21fcmVuKi8KKy8qIGJpdCAxNDoxMSAtLSByZXNlcnZlZCovCisvKiBiaXQgIDEwOjAgLS0gT01fREFUQV9SRF9BRERSKi8KKy8qI2RlZmluZSBPTV9EQVRBX1JEX0FERFIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMV9PRkZTRVQgKyAweDM3KSAgLy8gMHgxNjM3Ki8KKy8qI2RlZmluZSBPTV9EQVRBX1JEX0FERFJfMgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4MzcpICAvLyAweDE2ODcqLworLyojZGVmaW5lIE9NX0RBVEFfUkRfQUREUl8zCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzNfT0ZGU0VUICsgMHgzNykgIC8vIDB4MTZkNyovCisvKi0tLS0tLS0tLS0tIGJpdCBkZWZpbmUgLS0tLS0tLS0tLS0qLworI2RlZmluZSBTVEJfT01fUkVOICAgICAgICAgICAgICAgICAxNQorCisvKiBiaXQgMTU6MCAtLSBPTV9EQVRBX1JEKi8KKy8qI2RlZmluZSBPTV9EQVRBX1JECisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHgzOCkgIC8vIDB4MTYzOCovCisvKiNkZWZpbmUgT01fREFUQV9SRF8yCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzJfT0ZGU0VUICsgMHgzOCkgIC8vIDB4MTY4OCovCisvKiNkZWZpbmUgT01fREFUQV9SRF8zCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzNfT0ZGU0VUICsgMHgzOCkgIC8vIDB4MTZkOCovCisKKy8qIEFVVE8gU1RPUCBTRVRUSU5HIGZvciAzMiBjaGFubmVscyovCisvKiA0LWJpdHMgcGVyIGNoYW5uZWwqLworLyogd2hlbiB3cml0ZSovCisvKiBiaXQgMyAtLSBzZXQgc2VjdGlvbiBhY3RpdmUqLworLyogYml0IDI6MCAtLSBhdXRvIHN0b3AgYWZ0ZXIgY291bnQgKDAgbWVhbnMgbmV2ZXIgc3RvcCkqLworLyogd2hlbiByZWFkKi8KKy8qIGJpdCAzIC0tIGN1cnJlbnQgYWN0aXZlIHN0YXR1cyAoMSAtIGFjdGl2ZSwgMCAtIHN0b3BwZWQgKSovCisvKiBiaXQgMjowIC0tIGNvdW50IGRvd24gdG8gYXV0byBzdG9wKi8KKy8qIHNlY3Rpb24gMzE6MjQqLworLyojZGVmaW5lIFNFQ1RJT05fQVVUT19TVE9QXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMV9PRkZTRVQgKyAweDM5KSAgLy8gMHgxNjM5Ki8KKy8qI2RlZmluZSBTRUNUSU9OX0FVVE9fU1RPUF8zXzIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDM5KSAgLy8gMHgxNjg5Ki8KKy8qI2RlZmluZSBTRUNUSU9OX0FVVE9fU1RPUF8zXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDM5KSAgLy8gMHgxNmQ5Ki8KKy8qIHNlY3Rpb24gMjM6MTYqLworLyojZGVmaW5lIFNFQ1RJT05fQVVUT19TVE9QXzIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMV9PRkZTRVQgKyAweDNhKSAgLy8gMHgxNjNhKi8KKy8qI2RlZmluZSBTRUNUSU9OX0FVVE9fU1RPUF8yXzIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDNhKSAgLy8gMHgxNjhhKi8KKy8qI2RlZmluZSBTRUNUSU9OX0FVVE9fU1RPUF8yXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDNhKSAgLy8gMHgxNmRhKi8KKy8qIHNlY3Rpb24gMTU6OCovCisvKiNkZWZpbmUgU0VDVElPTl9BVVRPX1NUT1BfMQorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4M2IpICAvLyAweDE2M2IqLworLyojZGVmaW5lIFNFQ1RJT05fQVVUT19TVE9QXzFfMgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4M2IpICAvLyAweDE2OGIqLworLyojZGVmaW5lIFNFQ1RJT05fQVVUT19TVE9QXzFfMworICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4M2IpICAvLyAweDE2ZGIqLworLyogc2VjdGlvbiA3OjAqLworLyojZGVmaW5lIFNFQ1RJT05fQVVUT19TVE9QXzAKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMV9PRkZTRVQgKyAweDNjKSAgLy8gMHgxNjNjKi8KKy8qI2RlZmluZSBTRUNUSU9OX0FVVE9fU1RPUF8wXzIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDNjKSAgLy8gMHgxNjhjKi8KKy8qI2RlZmluZSBTRUNUSU9OX0FVVE9fU1RPUF8wXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDNjKSAgLy8gMHgxNmRjKi8KKworLyogYml0IDMxOjAgcmVzZXQgY2hhbm5lbCBzdGF0dXMgLSBlYWNoIGJpdCByZXNldCBlYWNoIGNoYW5uZWwqLworLyogcmVhZCAtLSAzMiBjaGFubmVsIHN0YXR1cyovCisvKiNkZWZpbmUgREVNVVhfQ0hBTk5FTF9SRVNFVAorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4M2QpICAvLyAweDE2M2QqLworLyojZGVmaW5lIERFTVVYX0NIQU5ORUxfUkVTRVRfMgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4M2QpICAvLyAweDE2OGQqLworLyojZGVmaW5lIERFTVVYX0NIQU5ORUxfUkVTRVRfMworICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4M2QpICAvLyAweDE2ZGQqLworCisvKiNkZWZpbmUgREVNVVhfU0NSQU1CTElOR19TVEFURQorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4M2UpICAvLyAweDE2M2UqLworLyojZGVmaW5lIERFTVVYX1NDUkFNQkxJTkdfU1RBVEVfMgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4M2UpICAvLyAweDE2OGUqLworLyojZGVmaW5lIERFTVVYX1NDUkFNQkxJTkdfU1RBVEVfMworICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4M2UpICAvLyAweDE2ZGUqLworCisvKiNkZWZpbmUgREVNVVhfQ0hBTk5FTF9BQ1RJVklUWQorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4M2YpICAvLyAweDE2M2YqLworLyojZGVmaW5lIERFTVVYX0NIQU5ORUxfQUNUSVZJVFlfMgorICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4M2YpICAvLyAweDE2OGYqLworLyojZGVmaW5lIERFTVVYX0NIQU5ORUxfQUNUSVZJVFlfMworICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4M2YpICAvLyAweDE2ZGYqLworCisvKiBiaXQgNCAtLSB2aWRlb19zdGFtcF91c2VfZHRzKi8KKy8qIGJpdCAzIC0tIGF1ZGlvX3N0YW1wX3N5bmNfMV9lbiovCisvKiBiaXQgMiAtLSBhdWRpb19zdGFtcF9pbnNlcnRfZW4qLworLyogYml0IDEgLS0gdmlkZW9fc3RhbXBfc3luY18xX2VuKi8KKy8qIGJpdCAwIC0tIHZpZGVvX3N0YW1wX2luc2VydF9lbiovCisvKiNkZWZpbmUgREVNVVhfU1RBTVBfQ1RMCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHg0MCkgIC8vIDB4MTY0MCovCisvKiNkZWZpbmUgREVNVVhfU1RBTVBfQ1RMXzIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDQwKSAgLy8gMHgxNjkwKi8KKy8qI2RlZmluZSBERU1VWF9TVEFNUF9DVExfMworICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4NDApICAvLyAweDE2ZTAqLworCisvKiNkZWZpbmUgREVNVVhfVklERU9fU1RBTVBfU1lOQ18wCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHg0MSkgIC8vIDB4MTY0MSovCisvKiNkZWZpbmUgREVNVVhfVklERU9fU1RBTVBfU1lOQ18wXzIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDQxKSAgLy8gMHgxNjkxKi8KKy8qI2RlZmluZSBERU1VWF9WSURFT19TVEFNUF9TWU5DXzBfMworICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4NDEpICAvLyAweDE2ZTEqLworCisvKiNkZWZpbmUgREVNVVhfVklERU9fU1RBTVBfU1lOQ18xCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHg0MikgIC8vIDB4MTY0MiovCisvKiNkZWZpbmUgREVNVVhfVklERU9fU1RBTVBfU1lOQ18xXzIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDQyKSAgLy8gMHgxNjkyKi8KKy8qI2RlZmluZSBERU1VWF9WSURFT19TVEFNUF9TWU5DXzFfMworICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4NDIpICAvLyAweDE2ZTIqLworCisvKiNkZWZpbmUgREVNVVhfQVVESU9fU1RBTVBfU1lOQ18wCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHg0MykgIC8vIDB4MTY0MyovCisvKiNkZWZpbmUgREVNVVhfQVVESU9fU1RBTVBfU1lOQ18wXzIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDQzKSAgLy8gMHgxNjkzKi8KKy8qI2RlZmluZSBERU1VWF9BVURJT19TVEFNUF9TWU5DXzBfMworICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4NDMpICAvLyAweDE2ZTMqLworCisvKiNkZWZpbmUgREVNVVhfQVVESU9fU1RBTVBfU1lOQ18xCisgKiAoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHg0NCkgIC8vIDB4MTY0NCovCisvKiNkZWZpbmUgREVNVVhfQVVESU9fU1RBTVBfU1lOQ18xXzIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDQ0KSAgLy8gMHgxNjk0Ki8KKy8qI2RlZmluZSBERU1VWF9BVURJT19TVEFNUF9TWU5DXzFfMworICogKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4NDQpICAvLyAweDE2ZTQqLworCisvKiBXcml0ZSA6IEJpdFs0OjBdIHNlY3RlciBmaWx0ZXIgbnVtYmVyIGZvciByZXNldCovCisvKiBSZWFkICA6IHNlbGVjdCBhY2NvcmRpbmcgdG8gb3V0cHV0X3NlY3Rpb25fYnVmZmVyX3ZhbGlkIDoqLworLyogICAgICAgICBwZXIgYml0IHBlciBzZWN0aW9uIGJ1ZmZlciB2YWxpZCBzdGF0dXMqLworLyogICAgICAgICBvciBzZWN0aW9uX2J1ZmZlcl9pZ25vcmUqLworLyojZGVmaW5lIERFTVVYX1NFQ1RJT05fUkVTRVQKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMV9PRkZTRVQgKyAweDQ1KSAgLy8gMHgxNjQ1Ki8KKy8qI2RlZmluZSBERU1VWF9TRUNUSU9OX1JFU0VUXzIKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDQ1KSAgLy8gMHgxNjk1Ki8KKy8qI2RlZmluZSBERU1VWF9TRUNUSU9OX1JFU0VUXzMKKyAqIChTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDQ1KSAgLy8gMHgxNmU1Ki8KKworCisvKiBiaXRbMzE6MF0gLSBjaGFubmVsX3Jlc2V0X3RpbWVvdXRfZGlzYWJsZSovCisvKiNkZWZpbmUgREVNVVhfSU5QVVRfVElNRU9VVF9DICAgXAorCShTVEJfQ0JVU19CQVNFICsgREVNVVhfMV9PRkZTRVQgKyAweDQ2KSAvLyAweDE2NDYqLworLyojZGVmaW5lIERFTVVYX0lOUFVUX1RJTUVPVVRfQ18yIFwKKwkoU1RCX0NCVVNfQkFTRSArIERFTVVYXzJfT0ZGU0VUICsgMHg0NikgLy8gMHgxNjk2Ki8KKy8qI2RlZmluZSBERU1VWF9JTlBVVF9USU1FT1VUX0NfMyBcCisJKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4NDYpIC8vIDB4MTZlNiovCisvKiBiaXRbMzFdIC0gbm9fbWF0Y2hfcmVzZXRfdGltZW91dF9kaXNhYmxlKi8KKy8qIGJpdFszMDowXSBpbnB1dF90aW1lX291dF9pbnRfY250ICgwIC0tIG1lYW5zIGRpc2FibGUpIFdyLXNldHRpbmcsIFJkLWNvdW50Ki8KKy8qI2RlZmluZSBERU1VWF9JTlBVVF9USU1FT1VUICAgICBcCisJKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4NDcpIC8vIDB4MTY0NyovCisvKiNkZWZpbmUgREVNVVhfSU5QVVRfVElNRU9VVF8yICAgXAorCShTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDQ3KSAvLyAweDE2OTcqLworLyojZGVmaW5lIERFTVVYX0lOUFVUX1RJTUVPVVRfMyAgIFwKKwkoU1RCX0NCVVNfQkFTRSArIERFTVVYXzNfT0ZGU0VUICsgMHg0NykgLy8gMHgxNmU3Ki8KKworLyogYml0WzMxOjBdIC0gY2hhbm5lbF9wYWNrZXRfY291bnRfZGlzYWJsZSovCisvKiNkZWZpbmUgREVNVVhfUEFDS0VUX0NPVU5UX0MgICAgXAorCShTVEJfQ0JVU19CQVNFICsgREVNVVhfMV9PRkZTRVQgKyAweDQ4KSAvLyAweDE2NDgqLworLyojZGVmaW5lIERFTVVYX1BBQ0tFVF9DT1VOVF9DXzIgIFwKKwkoU1RCX0NCVVNfQkFTRSArIERFTVVYXzJfT0ZGU0VUICsgMHg0OCkgLy8gMHgxNjk4Ki8KKy8qI2RlZmluZSBERU1VWF9QQUNLRVRfQ09VTlRfQ18zICBcCisJKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4NDgpKi8gICAgICAgICAvKiAweDE2ZTgqLworLyogYml0WzMxXSAtIG5vX21hdGNoX3BhY2tldF9jb3VudF9kaXNhYmxlKi8KKy8qIGJpdFszMDowXSBpbnB1dF9wYWNrZXRfY291bnQqLworLyojZGVmaW5lIERFTVVYX1BBQ0tFVF9DT1VOVCAgICAgIFwKKwkoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHg0OSkgLy8gMHgxNjQ5Ki8KKy8qI2RlZmluZSBERU1VWF9QQUNLRVRfQ09VTlRfMiAgICBcCisJKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4NDkpIC8vIDB4MTY5OSovCisvKiNkZWZpbmUgREVNVVhfUEFDS0VUX0NPVU5UXzMgICAgXAorCShTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDQ5KSAvLyAweDE2ZTkqLworCisvKiBiaXRbMzE6MF0gY2hhbm5lbF9yZWNvcmRfZW5hYmxlKi8KKy8qI2RlZmluZSBERU1VWF9DSEFOX1JFQ09SRF9FTiAgICBcCisJKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4NGEpIC8vIDB4MTY0YSovCisvKiNkZWZpbmUgREVNVVhfQ0hBTl9SRUNPUkRfRU5fMiAgXAorCShTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDRhKSAvLyAweDE2OWEqLworLyojZGVmaW5lIERFTVVYX0NIQU5fUkVDT1JEX0VOXzMgIFwKKwkoU1RCX0NCVVNfQkFTRSArIERFTVVYXzNfT0ZGU0VUICsgMHg0YSkgLy8gMHgxNmVhKi8KKworLyogYml0WzMxOjBdIGNoYW5uZWxfcHJvY2Vzc19lbmFibGUqLworLyojZGVmaW5lIERFTVVYX0NIQU5fUFJPQ0VTU19FTiAgIFwKKwkoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHg0YikgLy8gMHgxNjRiKi8KKy8qI2RlZmluZSBERU1VWF9DSEFOX1BST0NFU1NfRU5fMiBcCisJKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4NGIpICAqLyAgICAgIC8qIDB4MTY5YiovCisvKiNkZWZpbmUgREVNVVhfQ0hBTl9QUk9DRVNTX0VOXzMgXAorCShTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDRiKSAvLyAweDE2ZWIqLworCisvKiBiaXRbMzE6MjRdIHNtYWxsX3NlY19zaXplICgobisxKSAqIDI1NiBCeXRlcykqLworLyogYml0WzIzOjE2XSBzbWFsbF9zZWNfcmRfcHRyICovCisvKiBiaXRbMTU6OF0gIHNtYWxsX3NlY193cl9wdHIgKi8KKy8qIGJpdFs3OjJdICAgcmVzZXJ2ZWQqLworLyogYml0WzFdIHNtYWxsX3NlY193cl9wdHJfd3JfZW5hYmxlKi8KKy8qIGJpdFswXSBzbWFsbF9zZWN0aW9uX2VuYWJsZSovCisvKiNkZWZpbmUgREVNVVhfU01BTExfU0VDX0NUTCAgICAgXAorCShTVEJfQ0JVU19CQVNFICsgREVNVVhfMV9PRkZTRVQgKyAweDRjKSovICAgICAgICAgLyogMHgxNjRjKi8KKy8qI2RlZmluZSBERU1VWF9TTUFMTF9TRUNfQ1RMXzIgICBcCisJKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4NGMpICAvLyAweDE2OWMqLworLyojZGVmaW5lIERFTVVYX1NNQUxMX1NFQ19DVExfMyAgIFwKKwkoU1RCX0NCVVNfQkFTRSArIERFTVVYXzNfT0ZGU0VUICsgMHg0YykgICAvLyAweDE2ZWMqLworLyogYml0WzMxOjBdIHNtYWxsX3NlY19zdGFydF9hZGRyKi8KKy8qI2RlZmluZSBERU1VWF9TTUFMTF9TRUNfQUREUiAgICBcCisJKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4NGQpICAvLyAweDE2NGQqLworLyojZGVmaW5lIERFTVVYX1NNQUxMX1NFQ19BRERSXzIgIFwKKwkoU1RCX0NCVVNfQkFTRSArIERFTVVYXzJfT0ZGU0VUICsgMHg0ZCkgIC8vIDB4MTY5ZCovCisvKiNkZWZpbmUgREVNVVhfU01BTExfU0VDX0FERFJfMyAgXAorCShTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDRkKSAgLy8gMHgxNmVkKi8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiAgU1RCIFJlZ2lzdGVycyBFbmQqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQVNZTkMgRklGTyAoNCkqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiNkZWZpbmUgQVNZTkNfRklGT19SRUcwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjMxMCovCisvKiNkZWZpbmUgQVNZTkNfRklGT19SRUcxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjMxMSovCisjZGVmaW5lIEFTWU5DX0ZJRk9fRkxVU0hfU1RBVFVTICAgICAzMQorI2RlZmluZSBBU1lOQ19GSUZPX0VSUiAgICAgICAgICAgICAgMzAKKyNkZWZpbmUgQVNZTkNfRklGT19GSUZPX0VNUFRZICAgICAgIDI5CisjZGVmaW5lIEFTWU5DX0ZJRk9fVE9fSElVICAgICAgICAgICAyNAorI2RlZmluZSBBU1lOQ19GSUZPX0ZMVVNIICAgICAgICAgICAgMjMKKyNkZWZpbmUgQVNZTkNfRklGT19SRVNFVCAgICAgICAgICAgIDIyCisjZGVmaW5lIEFTWU5DX0ZJRk9fV1JBUF9FTiAgICAgICAgICAyMQorI2RlZmluZSBBU1lOQ19GSUZPX0ZMVVNIX0VOICAgICAgICAgMjAKKyNkZWZpbmUgQVNZTkNfRklGT19SRVNJRFVBTF9NU0IgICAgIDE5CisjZGVmaW5lIEFTWU5DX0ZJRk9fUkVTSURVQUxfTFNCICAgICAxNQorI2RlZmluZSBBU1lOQ19GSUZPX0ZMVVNIX0NOVF9NU0IgICAgMTQKKyNkZWZpbmUgQVNZTkNfRklGT19GTFVTSF9DTlRfTFNCICAgIDAKKy8qI2RlZmluZSBBU1lOQ19GSUZPX1JFRzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMzEyKi8KKyNkZWZpbmUgQVNZTkNfRklGT19GSUZPX0ZVTEwgICAgICAgIDI2CisjZGVmaW5lIEFTWU5DX0ZJRk9fRklMTF9TVEFUVVMgICAgICAyNQorI2RlZmluZSBBU1lOQ19GSUZPX1NPVVJDRV9NU0IgICAgICAgMjQKKyNkZWZpbmUgQVNZTkNfRklGT19TT1VSQ0VfTFNCICAgICAgIDIzCisjZGVmaW5lIEFTWU5DX0ZJRk9fRU5ESUFOX01TQiAgICAgICAyMgorI2RlZmluZSBBU1lOQ19GSUZPX0VORElBTl9MU0IgICAgICAgMjEKKyNkZWZpbmUgQVNZTkNfRklGT19GSUxMX0VOICAgICAgICAgIDIwCisjZGVmaW5lIEFTWU5DX0ZJRk9fRklMTF9DTlRfTVNCICAgICAxOQorI2RlZmluZSBBU1lOQ19GSUZPX0ZJTExfQ05UX0xTQiAgICAgMAorLyojZGVmaW5lIEFTWU5DX0ZJRk9fUkVHMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIzMTMqLworI2RlZmluZSBBU1lOQ19GTFVTSF9TSVpFX0lSUV9NU0IgICAgMTUKKyNkZWZpbmUgQVNZTkNfRkxVU0hfU0laRV9JUlFfTFNCICAgIDAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQVNZTkMgRklGTyAoNCkqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiNkZWZpbmUgQVNZTkNfRklGTzJfUkVHMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjMxNCovCisvKiNkZWZpbmUgQVNZTkNfRklGTzJfUkVHMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjMxNSovCisvKiNkZWZpbmUgQVNZTkNfRklGTzJfUkVHMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjMxNiovCisvKiNkZWZpbmUgQVNZTkNfRklGTzJfUkVHMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjMxNyovCisKKyNkZWZpbmUgUkVTRVRfREVNVVhTVEIgICAgICAoMSA8PCAxKQorI2VuZGlmIC8qIENfU1RCX0RFRklORV9IKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9od19kZW11eC9jX3N0Yl9yZWdzX2RlZmluZS5oIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL2h3X2RlbXV4L2Nfc3RiX3JlZ3NfZGVmaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM1MTc3MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9od19kZW11eC9jX3N0Yl9yZWdzX2RlZmluZS5oCkBAIC0wLDAgKzEsODE0IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorKiBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqCisqIERlc2NyaXB0aW9uOgorKi8KKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljbHkgZ2VuZXJhdGVkIGJ5IGdlbnJlZ3MuYXdrLiBQbGVhc2UgZG8gbm90IGVkaXQgaXQKKyAqIEJhc2UgZmlsZXMgYXJlIC4uCisgKiAgIC4uCisgKiAgIC4uCisgKiBUdWUgT2N0IDIyIDE1OjI4OjQ4IENTVCAyMDEzCisgKiovCisKKyNpZm5kZWYgX19NQUNIX01FU09OOF9SRUdfQUREUl9IXworI2RlZmluZSBfX01BQ0hfTUVTT044X1JFR19BRERSX0hfCisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9yZWdpc3RlcnMvcmVnaXN0ZXJfbWFwLmg+CisjZGVmaW5lIENCVVNfUkVHX0FERFIoX3IpIGFtbF9yZWFkX2NidXMoX3IpCisKKworI2RlZmluZSBTVEJfQ0JVU19CQVNFCQlhbWxfc3RiX2dldF9iYXNlKElEX1NUQl9DQlVTX0JBU0UpCisjZGVmaW5lIFNNQVJUQ0FSRF9SRUdfQkFTRQlhbWxfc3RiX2dldF9iYXNlKElEX1NNQVJUQ0FSRF9SRUdfQkFTRSkKKyNkZWZpbmUgQVNZTkNfRklGT19SRUdfQkFTRQlhbWxfc3RiX2dldF9iYXNlKElEX0FTWU5DX0ZJRk9fUkVHX0JBU0UpCisjZGVmaW5lIEFTWU5DX0ZJRk8xX1JFR19CQVNFCWFtbF9zdGJfZ2V0X2Jhc2UoSURfQVNZTkNfRklGTzFfUkVHX0JBU0UpCisjZGVmaW5lIEFTWU5DX0ZJRk8yX1JFR19CQVNFCWFtbF9zdGJfZ2V0X2Jhc2UoSURfQVNZTkNfRklGTzJfUkVHX0JBU0UpCisjZGVmaW5lIFJFU0VUX0JBU0UJCWFtbF9zdGJfZ2V0X2Jhc2UoSURfUkVTRVRfQkFTRSkKKyNkZWZpbmUgUEFSU0VSX1NVQl9TVEFSVF9QVFJfQkFTRSBcCisJYW1sX3N0Yl9nZXRfYmFzZShJRF9QQVJTRVJfU1VCX1NUQVJUX1BUUl9CQVNFKQorCisjZGVmaW5lIEhISV9DU0lfUEhZX0NOVExfQkFTRSAweDEwMDAKKworI2RlZmluZSBERU1VWF8xX09GRlNFVCAgICAgICAgIDB4MDAKKyNkZWZpbmUgREVNVVhfMl9PRkZTRVQgICAgICAgICAweDUwCisjZGVmaW5lIERFTVVYXzNfT0ZGU0VUICAgICAgICAgMHhhMAorCisKKyNkZWZpbmUgVFNfSElVMV9DT05GSUcJKFNUQl9DQlVTX0JBU0UgKyAweDRlKQorI2RlZmluZSBQX1RTX0hJVTFfQ09ORklHICAgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFRTX0hJVTFfQ09ORklHKQorCisjZGVmaW5lIFRTX1RPUF9DT05GSUcxCShTVEJfQ0JVU19CQVNFICsgMHg0ZikKKyNkZWZpbmUgUF9UU19UT1BfQ09ORklHMSAgICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihUU19UT1BfQ09ORklHMSkKKworI2RlZmluZSBTVEJfUzJQMl9DT05GSUcgIChTVEJfQ0JVU19CQVNFICsgMHhlZikKKyNkZWZpbmUgUF9TVEJfUzJQMl9DT05GSUcgICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihTVEJfUzJQMl9DT05GSUcpCisKKyNkZWZpbmUgU1RCX1JFQ09SREVSMl9DTlRMCShTVEJfQ0JVU19CQVNFICsgMHhlZSkKKyNkZWZpbmUgUF9TVEJfUkVDT1JERVIyX0NOVEwgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihTVEJfUkVDT1JERVIyX0NOVEwpCisKKyNkZWZpbmUgU1RCX1RPUF9DT05GSUcgIChTVEJfQ0JVU19CQVNFICsgMHhmMCkKKyNkZWZpbmUgUF9TVEJfVE9QX0NPTkZJRyAgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFNUQl9UT1BfQ09ORklHKQorI2RlZmluZSBUU19UT1BfQ09ORklHCShTVEJfQ0JVU19CQVNFICsgMHhmMSkKKyNkZWZpbmUgUF9UU19UT1BfQ09ORklHICAgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFRTX1RPUF9DT05GSUcpCisjZGVmaW5lIFRTX0ZJTEVfQ09ORklHCShTVEJfQ0JVU19CQVNFICsgMHhmMikKKyNkZWZpbmUgUF9UU19GSUxFX0NPTkZJRyAgICAgICAgQ0JVU19SRUdfQUREUihUU19GSUxFX0NPTkZJRykKKyNkZWZpbmUgVFNfUExfUElEX0lOREVYIChTVEJfQ0JVU19CQVNFICsgMHhmMykKKyNkZWZpbmUgUF9UU19QTF9QSURfSU5ERVggICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFRTX1BMX1BJRF9JTkRFWCkKKyNkZWZpbmUgVFNfUExfUElEX0RBVEEgIChTVEJfQ0JVU19CQVNFICsgMHhmNCkKKyNkZWZpbmUgUF9UU19QTF9QSURfREFUQSAgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFRTX1BMX1BJRF9EQVRBKQorI2RlZmluZSBDT01NX0RFU0NfS0VZMCAgKFNUQl9DQlVTX0JBU0UgKyAweGY1KQorI2RlZmluZSBQX0NPTU1fREVTQ19LRVkwICAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoQ09NTV9ERVNDX0tFWTApCisjZGVmaW5lIENPTU1fREVTQ19LRVkxICAoU1RCX0NCVVNfQkFTRSArIDB4ZjYpCisjZGVmaW5lIFBfQ09NTV9ERVNDX0tFWTEgICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihDT01NX0RFU0NfS0VZMSkKKyNkZWZpbmUgQ09NTV9ERVNDX0tFWV9SVyAoU1RCX0NCVVNfQkFTRSArIDB4ZjcpCisjZGVmaW5lIFBfQ09NTV9ERVNDX0tFWV9SVyAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihDT01NX0RFU0NfS0VZX1JXKQorI2RlZmluZSBDSVBMVVNfS0VZMAkJKFNUQl9DQlVTX0JBU0UgKyAweGY4KQorI2RlZmluZSBQX0NJUExVU19LRVkwICAgICAgICAgICBDQlVTX1JFR19BRERSKENJUExVU19LRVkwKQorI2RlZmluZSBDSVBMVVNfS0VZMQkJKFNUQl9DQlVTX0JBU0UgKyAweGY5KQorI2RlZmluZSBQX0NJUExVU19LRVkxICAgICAgICAgICBDQlVTX1JFR19BRERSKENJUExVU19LRVkxKQorI2RlZmluZSBDSVBMVVNfS0VZMgkJKFNUQl9DQlVTX0JBU0UgKyAweGZhKQorI2RlZmluZSBQX0NJUExVU19LRVkyICAgICAgICAgICBDQlVTX1JFR19BRERSKENJUExVU19LRVkyKQorI2RlZmluZSBDSVBMVVNfS0VZMwkJKFNUQl9DQlVTX0JBU0UgKyAweGZiKQorI2RlZmluZSBQX0NJUExVU19LRVkzICAgICAgICAgICBDQlVTX1JFR19BRERSKENJUExVU19LRVkzKQorI2RlZmluZSBDSVBMVVNfS0VZX1dSICAgIChTVEJfQ0JVU19CQVNFICsgMHhmYykKKyNkZWZpbmUgUF9DSVBMVVNfS0VZX1dSICAgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKENJUExVU19LRVlfV1IpCisjZGVmaW5lIENJUExVU19DT05GSUcgICAgKFNUQl9DQlVTX0JBU0UgKyAweGZkKQorI2RlZmluZSBQX0NJUExVU19DT05GSUcgICAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoQ0lQTFVTX0NPTkZJRykKKyNkZWZpbmUgQ0lQTFVTX0VORElBTiAgICAoU1RCX0NCVVNfQkFTRSArIDB4ZmUpCisjZGVmaW5lIFBfQ0lQTFVTX0VORElBTiAgICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihDSVBMVVNfRU5ESUFOKQorCisjZGVmaW5lIFNNQVJUQ0FSRF9SRUcwIChTTUFSVENBUkRfUkVHX0JBU0UgKyAweDApCisjZGVmaW5lIFBfU01BUlRDQVJEX1JFRzAgICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihTTUFSVENBUkRfUkVHMCkKKyNkZWZpbmUgU01BUlRDQVJEX1JFRzEgKFNNQVJUQ0FSRF9SRUdfQkFTRSArIDB4MSkKKyNkZWZpbmUgUF9TTUFSVENBUkRfUkVHMSAgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFNNQVJUQ0FSRF9SRUcxKQorI2RlZmluZSBTTUFSVENBUkRfUkVHMiAoU01BUlRDQVJEX1JFR19CQVNFICsgMHgyKQorI2RlZmluZSBQX1NNQVJUQ0FSRF9SRUcyICAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoU01BUlRDQVJEX1JFRzIpCisjZGVmaW5lIFNNQVJUQ0FSRF9TVEFUVVMgKFNNQVJUQ0FSRF9SRUdfQkFTRSArIDB4MykKKyNkZWZpbmUgUF9TTUFSVENBUkRfU1RBVFVTICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFNNQVJUQ0FSRF9TVEFUVVMpCisjZGVmaW5lIFNNQVJUQ0FSRF9JTlRSIChTTUFSVENBUkRfUkVHX0JBU0UgKyAweDQpCisjZGVmaW5lIFBfU01BUlRDQVJEX0lOVFIgICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihTTUFSVENBUkRfSU5UUikKKyNkZWZpbmUgU01BUlRDQVJEX1JFRzUgKFNNQVJUQ0FSRF9SRUdfQkFTRSArIDB4NSkKKyNkZWZpbmUgUF9TTUFSVENBUkRfUkVHNSAgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFNNQVJUQ0FSRF9SRUc1KQorI2RlZmluZSBTTUFSVENBUkRfUkVHNiAoU01BUlRDQVJEX1JFR19CQVNFICsgMHg2KQorI2RlZmluZSBQX1NNQVJUQ0FSRF9SRUc2ICAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoU01BUlRDQVJEX1JFRzYpCisjZGVmaW5lIFNNQVJUQ0FSRF9GSUZPIChTTUFSVENBUkRfUkVHX0JBU0UgKyAweDcpCisjZGVmaW5lIFBfU01BUlRDQVJEX0ZJRk8gICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihTTUFSVENBUkRfRklGTykKKyNkZWZpbmUgU01BUlRDQVJEX1JFRzggKFNNQVJUQ0FSRF9SRUdfQkFTRSArIDB4OCkKKyNkZWZpbmUgUF9TTUFSVENBUkRfUkVHOCAgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFNNQVJUQ0FSRF9SRUc4KQorCisjZGVmaW5lIEFTWU5DX0ZJRk9fUkVHMCAoQVNZTkNfRklGT19SRUdfQkFTRSArIDB4MCkKKyNkZWZpbmUgUF9BU1lOQ19GSUZPX1JFRzAgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKEFTWU5DX0ZJRk9fUkVHMCkKKyNkZWZpbmUgQVNZTkNfRklGT19SRUcxIChBU1lOQ19GSUZPX1JFR19CQVNFICsgMHgxKQorI2RlZmluZSBQX0FTWU5DX0ZJRk9fUkVHMSAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoQVNZTkNfRklGT19SRUcxKQorI2RlZmluZSBBU1lOQ19GSUZPX1JFRzIgKEFTWU5DX0ZJRk9fUkVHX0JBU0UgKyAweDIpCisjZGVmaW5lIFBfQVNZTkNfRklGT19SRUcyICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihBU1lOQ19GSUZPX1JFRzIpCisjZGVmaW5lIEFTWU5DX0ZJRk9fUkVHMyAoQVNZTkNfRklGT19SRUdfQkFTRSArIDB4MykKKyNkZWZpbmUgUF9BU1lOQ19GSUZPX1JFRzMgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKEFTWU5DX0ZJRk9fUkVHMykKKyNkZWZpbmUgQVNZTkNfRklGT19SRUc0IChBU1lOQ19GSUZPX1JFR19CQVNFICsgMHg0KQorI2RlZmluZSBQX0FTWU5DX0ZJRk9fUkVHNCAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoQVNZTkNfRklGT19SRUc0KQorI2RlZmluZSBBU1lOQ19GSUZPX1JFRzUgKEFTWU5DX0ZJRk9fUkVHX0JBU0UgKyAweDUpCisjZGVmaW5lIFBfQVNZTkNfRklGT19SRUc1ICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihBU1lOQ19GSUZPX1JFRzUpCisKKyNkZWZpbmUgQVNZTkNfRklGTzFfUkVHMCAoQVNZTkNfRklGTzFfUkVHX0JBU0UgKyAweDApCisjZGVmaW5lIFBfQVNZTkNfRklGTzFfUkVHMCAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihBU1lOQ19GSUZPMV9SRUcwKQorI2RlZmluZSBBU1lOQ19GSUZPMV9SRUcxIChBU1lOQ19GSUZPMV9SRUdfQkFTRSArIDB4MSkKKyNkZWZpbmUgUF9BU1lOQ19GSUZPMV9SRUcxICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKEFTWU5DX0ZJRk8xX1JFRzEpCisjZGVmaW5lIEFTWU5DX0ZJRk8xX1JFRzIgKEFTWU5DX0ZJRk8xX1JFR19CQVNFICsgMHgyKQorI2RlZmluZSBQX0FTWU5DX0ZJRk8xX1JFRzIgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoQVNZTkNfRklGTzFfUkVHMikKKyNkZWZpbmUgQVNZTkNfRklGTzFfUkVHMyAoQVNZTkNfRklGTzFfUkVHX0JBU0UgKyAweDMpCisjZGVmaW5lIFBfQVNZTkNfRklGTzFfUkVHMyAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihBU1lOQ19GSUZPMV9SRUczKQorI2RlZmluZSBBU1lOQ19GSUZPMV9SRUc0IChBU1lOQ19GSUZPMV9SRUdfQkFTRSArIDB4NCkKKyNkZWZpbmUgUF9BU1lOQ19GSUZPMV9SRUc0ICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKEFTWU5DX0ZJRk8xX1JFRzQpCisjZGVmaW5lIEFTWU5DX0ZJRk8xX1JFRzUgKEFTWU5DX0ZJRk8xX1JFR19CQVNFICsgMHg1KQorI2RlZmluZSBQX0FTWU5DX0ZJRk8xX1JFRzUgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoQVNZTkNfRklGTzFfUkVHNSkKKworCisjZGVmaW5lIEFTWU5DX0ZJRk8yX1JFRzAgKEFTWU5DX0ZJRk8yX1JFR19CQVNFICsgMHgwKQorI2RlZmluZSBQX0FTWU5DX0ZJRk8yX1JFRzAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoQVNZTkNfRklGTzJfUkVHMCkKKyNkZWZpbmUgQVNZTkNfRklGTzJfUkVHMSAoQVNZTkNfRklGTzJfUkVHX0JBU0UgKyAweDEpCisjZGVmaW5lIFBfQVNZTkNfRklGTzJfUkVHMSAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihBU1lOQ19GSUZPMl9SRUcxKQorI2RlZmluZSBBU1lOQ19GSUZPMl9SRUcyIChBU1lOQ19GSUZPMl9SRUdfQkFTRSArIDB4MikKKyNkZWZpbmUgUF9BU1lOQ19GSUZPMl9SRUcyICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKEFTWU5DX0ZJRk8yX1JFRzIpCisjZGVmaW5lIEFTWU5DX0ZJRk8yX1JFRzMgKEFTWU5DX0ZJRk8yX1JFR19CQVNFICsgMHgzKQorI2RlZmluZSBQX0FTWU5DX0ZJRk8yX1JFRzMgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoQVNZTkNfRklGTzJfUkVHMykKKyNkZWZpbmUgQVNZTkNfRklGTzJfUkVHNCAoQVNZTkNfRklGTzJfUkVHX0JBU0UgKyAweDQpCisjZGVmaW5lIFBfQVNZTkNfRklGTzJfUkVHNCAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihBU1lOQ19GSUZPMl9SRUc0KQorI2RlZmluZSBBU1lOQ19GSUZPMl9SRUc1IChBU1lOQ19GSUZPMl9SRUdfQkFTRSArIDB4NSkKKyNkZWZpbmUgUF9BU1lOQ19GSUZPMl9SRUc1ICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKEFTWU5DX0ZJRk8yX1JFRzUpCisKKworI2RlZmluZSBSRVNFVDBfUkVHSVNURVIgKFJFU0VUX0JBU0UgKyAweDEpCisjZGVmaW5lIFBfUkVTRVQwX1JFR0lTVEVSICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihSRVNFVDBfUkVHSVNURVIpCisjZGVmaW5lIFJFU0VUMV9SRUdJU1RFUiAoUkVTRVRfQkFTRSArIDB4MikKKyNkZWZpbmUgUF9SRVNFVDFfUkVHSVNURVIgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFJFU0VUMV9SRUdJU1RFUikKKyNkZWZpbmUgUkVTRVQyX1JFR0lTVEVSIChSRVNFVF9CQVNFICsgMHgzKQorI2RlZmluZSBQX1JFU0VUMl9SRUdJU1RFUiAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoUkVTRVQyX1JFR0lTVEVSKQorI2RlZmluZSBSRVNFVDNfUkVHSVNURVIgKFJFU0VUX0JBU0UgKyAweDQpCisjZGVmaW5lIFBfUkVTRVQzX1JFR0lTVEVSICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihSRVNFVDNfUkVHSVNURVIpCisjZGVmaW5lIFJFU0VUNF9SRUdJU1RFUiAoUkVTRVRfQkFTRSArIDB4NSkKKyNkZWZpbmUgUF9SRVNFVDRfUkVHSVNURVIgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFJFU0VUNF9SRUdJU1RFUikKKyNkZWZpbmUgUkVTRVQ1X1JFR0lTVEVSIChSRVNFVF9CQVNFICsgMHg2KQorI2RlZmluZSBQX1JFU0VUNV9SRUdJU1RFUiAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoUkVTRVQ1X1JFR0lTVEVSKQorI2RlZmluZSBSRVNFVDZfUkVHSVNURVIgKFJFU0VUX0JBU0UgKyAweDcpCisjZGVmaW5lIFBfUkVTRVQ2X1JFR0lTVEVSICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihSRVNFVDZfUkVHSVNURVIpCisjZGVmaW5lIFJFU0VUN19SRUdJU1RFUiAoUkVTRVRfQkFTRSArIDB4OCkKKyNkZWZpbmUgUF9SRVNFVDdfUkVHSVNURVIgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFJFU0VUN19SRUdJU1RFUikKKyNkZWZpbmUgUkVTRVQwX01BU0sgKFJFU0VUX0JBU0UgKyAweDEwKQorI2RlZmluZSBQX1JFU0VUMF9NQVNLICAgICAgICAgICBDQlVTX1JFR19BRERSKFJFU0VUMF9NQVNLKQorI2RlZmluZSBSRVNFVDFfTUFTSyAoUkVTRVRfQkFTRSArIDB4MTEpCisjZGVmaW5lIFBfUkVTRVQxX01BU0sgICAgICAgICAgIENCVVNfUkVHX0FERFIoUkVTRVQxX01BU0spCisjZGVmaW5lIFJFU0VUMl9NQVNLIChSRVNFVF9CQVNFICsgMHgxMikKKyNkZWZpbmUgUF9SRVNFVDJfTUFTSyAgICAgICAgICAgQ0JVU19SRUdfQUREUihSRVNFVDJfTUFTSykKKyNkZWZpbmUgUkVTRVQzX01BU0sgKFJFU0VUX0JBU0UgKyAweDEzKQorI2RlZmluZSBQX1JFU0VUM19NQVNLICAgICAgICAgICBDQlVTX1JFR19BRERSKFJFU0VUM19NQVNLKQorI2RlZmluZSBSRVNFVDRfTUFTSyAoUkVTRVRfQkFTRSArIDB4MTQpCisjZGVmaW5lIFBfUkVTRVQ0X01BU0sgICAgICAgICAgIENCVVNfUkVHX0FERFIoUkVTRVQ0X01BU0spCisjZGVmaW5lIFJFU0VUNV9NQVNLIChSRVNFVF9CQVNFICsgMHgxNSkKKyNkZWZpbmUgUF9SRVNFVDVfTUFTSyAgICAgICAgICAgQ0JVU19SRUdfQUREUihSRVNFVDVfTUFTSykKKyNkZWZpbmUgUkVTRVQ2X01BU0sgKFJFU0VUX0JBU0UgKyAweDE2KQorI2RlZmluZSBQX1JFU0VUNl9NQVNLICAgICAgICAgICBDQlVTX1JFR19BRERSKFJFU0VUNl9NQVNLKQorI2RlZmluZSBDUlRfTUFTSyAgICAoUkVTRVRfQkFTRSArIDB4MTcpCisjZGVmaW5lIFBfQ1JUX01BU0sgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoQ1JUX01BU0spCisjZGVmaW5lIFJFU0VUN19NQVNLIChSRVNFVF9CQVNFICsgMHgxOCkKKyNkZWZpbmUgUF9SRVNFVDdfTUFTSyAgICAgICAgICAgQ0JVU19SRUdfQUREUihSRVNFVDdfTUFTSykKKy8qYWRkIGZyb20gTThNMiovCisjZGVmaW5lIFBfUkVTRVQwX0xFVkVMICAgICAgICAgIENCVVNfUkVHX0FERFIoUkVTRVQwX0xFVkVMKQorI2RlZmluZSBSRVNFVDFfTEVWRUwgKFJFU0VUX0JBU0UgKyAweDIxKQorI2RlZmluZSBQX1JFU0VUMV9MRVZFTCAgICAgICAgICBDQlVTX1JFR19BRERSKFJFU0VUMV9MRVZFTCkKKyNkZWZpbmUgUkVTRVQyX0xFVkVMIChSRVNFVF9CQVNFICsgMHgyMikKKyNkZWZpbmUgUF9SRVNFVDJfTEVWRUwgICAgICAgICAgQ0JVU19SRUdfQUREUihSRVNFVDJfTEVWRUwpCisjZGVmaW5lIFJFU0VUM19MRVZFTCAoUkVTRVRfQkFTRSArIDB4MjMpCisjZGVmaW5lIFBfUkVTRVQzX0xFVkVMICAgICAgICAgIENCVVNfUkVHX0FERFIoUkVTRVQzX0xFVkVMKQorI2RlZmluZSBSRVNFVDRfTEVWRUwgKFJFU0VUX0JBU0UgKyAweDI0KQorI2RlZmluZSBQX1JFU0VUNF9MRVZFTCAgICAgICAgICBDQlVTX1JFR19BRERSKFJFU0VUNF9MRVZFTCkKKyNkZWZpbmUgUkVTRVQ1X0xFVkVMIChSRVNFVF9CQVNFICsgMHgyNSkKKyNkZWZpbmUgUF9SRVNFVDVfTEVWRUwgICAgICAgICAgQ0JVU19SRUdfQUREUihSRVNFVDVfTEVWRUwpCisjZGVmaW5lIFJFU0VUNl9MRVZFTCAoUkVTRVRfQkFTRSArIDB4MjYpCisjZGVmaW5lIFBfUkVTRVQ2X0xFVkVMICAgICAgICAgIENCVVNfUkVHX0FERFIoUkVTRVQ2X0xFVkVMKQorI2RlZmluZSBSRVNFVDdfTEVWRUwgKFJFU0VUX0JBU0UgKyAweDI3KQorI2RlZmluZSBQX1JFU0VUN19MRVZFTCAgICAgICAgICBDQlVTX1JFR19BRERSKFJFU0VUN19MRVZFTCkKKworLypubyBzZXQqLworI2lmZGVmCU1FU09OX004X0NQVQorI2RlZmluZSBISElfQ1NJX1BIWV9DTlRMMCAoSEhJX0NTSV9QSFlfQ05UTF9CQVNFICsgMHhkMykKKyNkZWZpbmUgUF9ISElfQ1NJX1BIWV9DTlRMMCAgICAgICAgICAgICBDQlVTX1JFR19BRERSKEhISV9DU0lfUEhZX0NOVEwwKQorI2RlZmluZSBISElfQ1NJX1BIWV9DTlRMMSAoSEhJX0NTSV9QSFlfQ05UTF9CQVNFICsgMHhkNCkKKyNkZWZpbmUgUF9ISElfQ1NJX1BIWV9DTlRMMSAgICAgICAgICAgICBDQlVTX1JFR19BRERSKEhISV9DU0lfUEhZX0NOVEwxKQorI2RlZmluZSBISElfQ1NJX1BIWV9DTlRMMiAoSEhJX0NTSV9QSFlfQ05UTF9CQVNFICsgMHhkNSkKKyNkZWZpbmUgUF9ISElfQ1NJX1BIWV9DTlRMMiAgICAgICAgICAgICBDQlVTX1JFR19BRERSKEhISV9DU0lfUEhZX0NOVEwyKQorI2RlZmluZSBISElfQ1NJX1BIWV9DTlRMMyAoSEhJX0NTSV9QSFlfQ05UTF9CQVNFICsgMHhkNikKKyNkZWZpbmUgUF9ISElfQ1NJX1BIWV9DTlRMMyAgICAgICAgICAgICBDQlVTX1JFR19BRERSKEhISV9DU0lfUEhZX0NOVEwzKQorI2RlZmluZSBISElfQ1NJX1BIWV9DTlRMNCAoSEhJX0NTSV9QSFlfQ05UTF9CQVNFICsgMHhkNykKKyNkZWZpbmUgUF9ISElfQ1NJX1BIWV9DTlRMNCAgICAgICAgICAgICBDQlVTX1JFR19BRERSKEhISV9DU0lfUEhZX0NOVEw0KQorI2VuZGlmCisKKyNkZWZpbmUgUEFSU0VSX1NVQl9TVEFSVF9QVFIgKFBBUlNFUl9TVUJfU1RBUlRfUFRSX0JBU0UgKyAweDhhKQorI2RlZmluZSBQX1BBUlNFUl9TVUJfU1RBUlRfUFRSICAgICAgICAgIENCVVNfUkVHX0FERFIoUEFSU0VSX1NVQl9TVEFSVF9QVFIpCisjZGVmaW5lIFBBUlNFUl9TVUJfRU5EX1BUUiAoUEFSU0VSX1NVQl9TVEFSVF9QVFJfQkFTRSArIDB4OGIpCisjZGVmaW5lIFBfUEFSU0VSX1NVQl9FTkRfUFRSICAgICAgICAgICAgQ0JVU19SRUdfQUREUihQQVJTRVJfU1VCX0VORF9QVFIpCisjZGVmaW5lIFBBUlNFUl9TVUJfV1AgKFBBUlNFUl9TVUJfU1RBUlRfUFRSX0JBU0UgKyAweDhjKQorI2RlZmluZSBQX1BBUlNFUl9TVUJfV1AgICAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoUEFSU0VSX1NVQl9XUCkKKyNkZWZpbmUgUEFSU0VSX1NVQl9SUCAoUEFSU0VSX1NVQl9TVEFSVF9QVFJfQkFTRSArIDB4OGQpCisjZGVmaW5lIFBfUEFSU0VSX1NVQl9SUCAgICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihQQVJTRVJfU1VCX1JQKQorI2RlZmluZSBQQVJTRVJfU1VCX0hPTEUgKFBBUlNFUl9TVUJfU1RBUlRfUFRSX0JBU0UgKyAweDhlKQorI2RlZmluZSBQX1BBUlNFUl9TVUJfSE9MRQlDQlVTX1JFR19BRERSKFBBUlNFUl9TVUJfSE9MRSkKKworLypubyBzZXQqLworI2RlZmluZSBBT19SVElfR0VOX1BXUl9TTEVFUDAgKCgweDAwIDw8IDEwKSB8ICgweDNhIDw8IDIpKQorI2RlZmluZSBQX0FPX1JUSV9HRU5fUFdSX1NMRUVQMCAgICAgICAgICAgICAgICAgXAorCUFPQlVTX1JFR19BRERSKEFPX1JUSV9HRU5fUFdSX1NMRUVQMCkKKyNkZWZpbmUgQU9fUlRJX0dFTl9QV1JfSVNPMCAoKDB4MDAgPDwgMTApIHwgKDB4M2IgPDwgMikpCisjZGVmaW5lIFBfQU9fUlRJX0dFTl9QV1JfSVNPMCAgICAgICAgICAgQU9CVVNfUkVHX0FERFIoQU9fUlRJX0dFTl9QV1JfSVNPMCkKKworLyoqLworI2RlZmluZSBTVEJfVkVSU0lPTiAgIChTVEJfQ0JVU19CQVNFICsgMHgwMCkKKyNkZWZpbmUgUF9TVEJfVkVSU0lPTiAgICAgICAgICAgQ0JVU19SRUdfQUREUihTVEJfVkVSU0lPTikKKyNkZWZpbmUgU1RCX1ZFUlNJT05fMiAoU1RCX0NCVVNfQkFTRSArIDB4NTApCisjZGVmaW5lIFBfU1RCX1ZFUlNJT05fMiAgICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihTVEJfVkVSU0lPTl8yKQorI2RlZmluZSBTVEJfVkVSU0lPTl8zIChTVEJfQ0JVU19CQVNFICsgMHhhMCkKKyNkZWZpbmUgUF9TVEJfVkVSU0lPTl8zICAgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFNUQl9WRVJTSU9OXzMpCisjZGVmaW5lIFNUQl9URVNUX1JFRyAgIChTVEJfQ0JVU19CQVNFICsgMHgwMSkKKyNkZWZpbmUgUF9TVEJfVEVTVF9SRUcgICAgICAgICAgQ0JVU19SRUdfQUREUihTVEJfVEVTVF9SRUcpCisjZGVmaW5lIFNUQl9URVNUX1JFR18yIChTVEJfQ0JVU19CQVNFICsgMHg1MSkKKyNkZWZpbmUgUF9TVEJfVEVTVF9SRUdfMiAgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFNUQl9URVNUX1JFR18yKQorI2RlZmluZSBTVEJfVEVTVF9SRUdfMyAoU1RCX0NCVVNfQkFTRSArIDB4YTEpCisjZGVmaW5lIFBfU1RCX1RFU1RfUkVHXzMgICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihTVEJfVEVTVF9SRUdfMykKKworI2RlZmluZSBGRUNfSU5QVVRfQ09OVFJPTCAgIChTVEJfQ0JVU19CQVNFICsgMHgyKQorI2RlZmluZSBQX0ZFQ19JTlBVVF9DT05UUk9MICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoRkVDX0lOUFVUX0NPTlRST0wpCisjZGVmaW5lIEZFQ19JTlBVVF9DT05UUk9MXzIgKFNUQl9DQlVTX0JBU0UgKyAweDUyKQorI2RlZmluZSBQX0ZFQ19JTlBVVF9DT05UUk9MXzIgICAgICAgICAgIENCVVNfUkVHX0FERFIoRkVDX0lOUFVUX0NPTlRST0xfMikKKyNkZWZpbmUgRkVDX0lOUFVUX0NPTlRST0xfMyAoU1RCX0NCVVNfQkFTRSArIDB4YTIpCisjZGVmaW5lIFBfRkVDX0lOUFVUX0NPTlRST0xfMyAgICAgICAgICAgQ0JVU19SRUdfQUREUihGRUNfSU5QVVRfQ09OVFJPTF8zKQorLypubyB1c2VkKi8KKyNkZWZpbmUgRkVDX0lOUFVUX0RBVEEgKFNUQl9DQlVTX0JBU0UgKyAweDAzKQorI2RlZmluZSBQX0ZFQ19JTlBVVF9EQVRBICAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoRkVDX0lOUFVUX0RBVEEpCisjZGVmaW5lIEZFQ19JTlBVVF9EQVRBXzIgKFNUQl9DQlVTX0JBU0UgKyAweDUzKQorI2RlZmluZSBQX0ZFQ19JTlBVVF9EQVRBXzIgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoRkVDX0lOUFVUX0RBVEFfMikKKyNkZWZpbmUgRkVDX0lOUFVUX0RBVEFfMyAoU1RCX0NCVVNfQkFTRSArIDB4YTMpCisjZGVmaW5lIFBfRkVDX0lOUFVUX0RBVEFfMyAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihGRUNfSU5QVVRfREFUQV8zKQorLypubyB1c2VkIGVuZCovCisjZGVmaW5lIERFTVVYX0NPTlRST0wgKFNUQl9DQlVTX0JBU0UgKyAweDA0KQorI2RlZmluZSBQX0RFTVVYX0NPTlRST0wgICAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoREVNVVhfQ09OVFJPTCkKKyNkZWZpbmUgREVNVVhfQ09OVFJPTF8yIChTVEJfQ0JVU19CQVNFICsgMHg1NCkKKyNkZWZpbmUgUF9ERU1VWF9DT05UUk9MXzIgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKERFTVVYX0NPTlRST0xfMikKKyNkZWZpbmUgREVNVVhfQ09OVFJPTF8zIChTVEJfQ0JVU19CQVNFICsgMHhhNCkKKyNkZWZpbmUgUF9ERU1VWF9DT05UUk9MXzMgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKERFTVVYX0NPTlRST0xfMykKKy8qbm8gdXNlZCovCisjZGVmaW5lIEZFQ19TWU5DX0JZVEUgKFNUQl9DQlVTX0JBU0UgKyAweDA1KQorI2RlZmluZSBQX0ZFQ19TWU5DX0JZVEUgICAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoRkVDX1NZTkNfQllURSkKKyNkZWZpbmUgRkVDX1NZTkNfQllURV8yIChTVEJfQ0JVU19CQVNFICsgMHg1NSkKKyNkZWZpbmUgUF9GRUNfU1lOQ19CWVRFXzIgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKEZFQ19TWU5DX0JZVEVfMikKKyNkZWZpbmUgRkVDX1NZTkNfQllURV8zIChTVEJfQ0JVU19CQVNFICsgMHhhNSkKKyNkZWZpbmUgUF9GRUNfU1lOQ19CWVRFXzMgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKEZFQ19TWU5DX0JZVEVfMykKKy8qbm8gdXNlZCBlbmQqLworCisjZGVmaW5lIEZNX1dSX0RBVEEgKFNUQl9DQlVTX0JBU0UgKyAweDA2KQorI2RlZmluZSBQX0ZNX1dSX0RBVEEgICAgICAgICAgICBDQlVTX1JFR19BRERSKEZNX1dSX0RBVEEpCisjZGVmaW5lIEZNX1dSX0RBVEFfMiAoU1RCX0NCVVNfQkFTRSArIDB4NTYpCisjZGVmaW5lIFBfRk1fV1JfREFUQV8yICAgICAgICAgIENCVVNfUkVHX0FERFIoRk1fV1JfREFUQV8yKQorI2RlZmluZSBGTV9XUl9EQVRBXzMgKFNUQl9DQlVTX0JBU0UgKyAweGE2KQorI2RlZmluZSBQX0ZNX1dSX0RBVEFfMyAgICAgICAgICBDQlVTX1JFR19BRERSKEZNX1dSX0RBVEFfMykKKyNkZWZpbmUgRk1fV1JfQUREUiAoU1RCX0NCVVNfQkFTRSArIDB4MDcpCisjZGVmaW5lIFBfRk1fV1JfQUREUiAgICAgICAgICAgIENCVVNfUkVHX0FERFIoRk1fV1JfQUREUikKKyNkZWZpbmUgRk1fV1JfQUREUl8yIChTVEJfQ0JVU19CQVNFICsgMHg1NykKKyNkZWZpbmUgUF9GTV9XUl9BRERSXzIgICAgICAgICAgQ0JVU19SRUdfQUREUihGTV9XUl9BRERSXzIpCisjZGVmaW5lIEZNX1dSX0FERFJfMyAoU1RCX0NCVVNfQkFTRSArIDB4YTcpCisjZGVmaW5lIFBfRk1fV1JfQUREUl8zICAgICAgICAgIENCVVNfUkVHX0FERFIoRk1fV1JfQUREUl8zKQorI2RlZmluZSBNQVhfRk1fQ09NUF9BRERSIChTVEJfQ0JVU19CQVNFICsgMHgwOCkKKyNkZWZpbmUgUF9NQVhfRk1fQ09NUF9BRERSICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKE1BWF9GTV9DT01QX0FERFIpCisjZGVmaW5lIE1BWF9GTV9DT01QX0FERFJfMiAoU1RCX0NCVVNfQkFTRSArIDB4NTgpCisjZGVmaW5lIFBfTUFYX0ZNX0NPTVBfQUREUl8yICAgICAgICAgICAgQ0JVU19SRUdfQUREUihNQVhfRk1fQ09NUF9BRERSXzIpCisjZGVmaW5lIE1BWF9GTV9DT01QX0FERFJfMyAoU1RCX0NCVVNfQkFTRSArIDB4YTgpCisjZGVmaW5lIFBfTUFYX0ZNX0NPTVBfQUREUl8zICAgICAgICAgICAgQ0JVU19SRUdfQUREUihNQVhfRk1fQ09NUF9BRERSXzMpCisKKyNkZWZpbmUgVFNfSEVBRF8wIChTVEJfQ0JVU19CQVNFICsgMHgwOSkKKyNkZWZpbmUgUF9UU19IRUFEXzAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihUU19IRUFEXzApCisjZGVmaW5lIFRTX0hFQURfMF8yIChTVEJfQ0JVU19CQVNFICsgMHg1OSkKKyNkZWZpbmUgUF9UU19IRUFEXzBfMiAgICAgICAgICAgQ0JVU19SRUdfQUREUihUU19IRUFEXzBfMikKKyNkZWZpbmUgVFNfSEVBRF8wXzMgKFNUQl9DQlVTX0JBU0UgKyAweGE5KQorI2RlZmluZSBQX1RTX0hFQURfMF8zICAgICAgICAgICBDQlVTX1JFR19BRERSKFRTX0hFQURfMF8zKQorI2RlZmluZSBUU19IRUFEXzEgKFNUQl9DQlVTX0JBU0UgKyAweDBhKQorI2RlZmluZSBQX1RTX0hFQURfMSAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFRTX0hFQURfMSkKKyNkZWZpbmUgVFNfSEVBRF8xXzIgKFNUQl9DQlVTX0JBU0UgKyAweDVhKQorI2RlZmluZSBQX1RTX0hFQURfMV8yICAgICAgICAgICBDQlVTX1JFR19BRERSKFRTX0hFQURfMV8yKQorI2RlZmluZSBUU19IRUFEXzFfMyAoU1RCX0NCVVNfQkFTRSArIDB4YWEpCisjZGVmaW5lIFBfVFNfSEVBRF8xXzMgICAgICAgICAgIENCVVNfUkVHX0FERFIoVFNfSEVBRF8xXzMpCisKKyNkZWZpbmUgT01fQ01EX1NUQVRVUyAoU1RCX0NCVVNfQkFTRSArIDB4MGIpCisjZGVmaW5lIFBfT01fQ01EX1NUQVRVUyAgICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihPTV9DTURfU1RBVFVTKQorI2RlZmluZSBPTV9DTURfU1RBVFVTXzIgKFNUQl9DQlVTX0JBU0UgKyAweDViKQorI2RlZmluZSBQX09NX0NNRF9TVEFUVVNfMiAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoT01fQ01EX1NUQVRVU18yKQorI2RlZmluZSBPTV9DTURfU1RBVFVTXzMgKFNUQl9DQlVTX0JBU0UgKyAweGFiKQorI2RlZmluZSBQX09NX0NNRF9TVEFUVVNfMyAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoT01fQ01EX1NUQVRVU18zKQorCisjZGVmaW5lIE9NX0NNRF9EQVRBIChTVEJfQ0JVU19CQVNFICsgMHgwYykKKyNkZWZpbmUgUF9PTV9DTURfREFUQSAgICAgICAgICAgQ0JVU19SRUdfQUREUihPTV9DTURfREFUQSkKKyNkZWZpbmUgT01fQ01EX0RBVEFfMiAoU1RCX0NCVVNfQkFTRSArIDB4NWMpCisjZGVmaW5lIFBfT01fQ01EX0RBVEFfMiAgICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihPTV9DTURfREFUQV8yKQorI2RlZmluZSBPTV9DTURfREFUQV8zIChTVEJfQ0JVU19CQVNFICsgMHhhYykKKyNkZWZpbmUgUF9PTV9DTURfREFUQV8zICAgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKE9NX0NNRF9EQVRBXzMpCisjZGVmaW5lIE9NX0NNRF9EQVRBMiAoU1RCX0NCVVNfQkFTRSArIDB4MGQpCisjZGVmaW5lIFBfT01fQ01EX0RBVEEyICAgICAgICAgIENCVVNfUkVHX0FERFIoT01fQ01EX0RBVEEyKQorI2RlZmluZSBPTV9DTURfREFUQTJfMiAoU1RCX0NCVVNfQkFTRSArIDB4NWQpCisjZGVmaW5lIFBfT01fQ01EX0RBVEEyXzIgICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihPTV9DTURfREFUQTJfMikKKyNkZWZpbmUgT01fQ01EX0RBVEEyXzMgKFNUQl9DQlVTX0JBU0UgKyAweGFkKQorI2RlZmluZSBQX09NX0NNRF9EQVRBMl8zICAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoT01fQ01EX0RBVEEyXzMpCisKKyNkZWZpbmUgU0VDX0JVRkZfMDFfU1RBUlQgKFNUQl9DQlVTX0JBU0UgKyAweDBlKQorI2RlZmluZSBQX1NFQ19CVUZGXzAxX1NUQVJUICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoU0VDX0JVRkZfMDFfU1RBUlQpCisjZGVmaW5lIFNFQ19CVUZGXzAxX1NUQVJUXzIgKFNUQl9DQlVTX0JBU0UgKyAweDVlKQorI2RlZmluZSBQX1NFQ19CVUZGXzAxX1NUQVJUXzIgICAgICAgICAgIENCVVNfUkVHX0FERFIoU0VDX0JVRkZfMDFfU1RBUlRfMikKKyNkZWZpbmUgU0VDX0JVRkZfMDFfU1RBUlRfMyAoU1RCX0NCVVNfQkFTRSArIDB4YWUpCisjZGVmaW5lIFBfU0VDX0JVRkZfMDFfU1RBUlRfMyAgICAgICAgICAgQ0JVU19SRUdfQUREUihTRUNfQlVGRl8wMV9TVEFSVF8zKQorI2RlZmluZSBTRUNfQlVGRl8yM19TVEFSVCAoU1RCX0NCVVNfQkFTRSArIDB4MGYpCisjZGVmaW5lIFBfU0VDX0JVRkZfMjNfU1RBUlQgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihTRUNfQlVGRl8yM19TVEFSVCkKKyNkZWZpbmUgU0VDX0JVRkZfMjNfU1RBUlRfMiAoU1RCX0NCVVNfQkFTRSArIDB4NWYpCisjZGVmaW5lIFBfU0VDX0JVRkZfMjNfU1RBUlRfMiAgICAgICAgICAgQ0JVU19SRUdfQUREUihTRUNfQlVGRl8yM19TVEFSVF8yKQorI2RlZmluZSBTRUNfQlVGRl8yM19TVEFSVF8zIChTVEJfQ0JVU19CQVNFICsgMHhhZikKKyNkZWZpbmUgUF9TRUNfQlVGRl8yM19TVEFSVF8zICAgICAgICAgICBDQlVTX1JFR19BRERSKFNFQ19CVUZGXzIzX1NUQVJUXzMpCisjZGVmaW5lIFNFQ19CVUZGX1NJWkUgKFNUQl9DQlVTX0JBU0UgKyAweDEwKQorI2RlZmluZSBQX1NFQ19CVUZGX1NJWkUgICAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoU0VDX0JVRkZfU0laRSkKKyNkZWZpbmUgU0VDX0JVRkZfU0laRV8yIChTVEJfQ0JVU19CQVNFICsgMHg2MCkKKyNkZWZpbmUgUF9TRUNfQlVGRl9TSVpFXzIgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFNFQ19CVUZGX1NJWkVfMikKKyNkZWZpbmUgU0VDX0JVRkZfU0laRV8zIChTVEJfQ0JVU19CQVNFICsgMHhiMCkKKyNkZWZpbmUgUF9TRUNfQlVGRl9TSVpFXzMgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFNFQ19CVUZGX1NJWkVfMykKKyNkZWZpbmUgU0VDX0JVRkZfQlVTWSAoU1RCX0NCVVNfQkFTRSArIDB4MTEpCisjZGVmaW5lIFBfU0VDX0JVRkZfQlVTWSAgICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihTRUNfQlVGRl9CVVNZKQorI2RlZmluZSBTRUNfQlVGRl9CVVNZXzIgKFNUQl9DQlVTX0JBU0UgKyAweDYxKQorI2RlZmluZSBQX1NFQ19CVUZGX0JVU1lfMiAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoU0VDX0JVRkZfQlVTWV8yKQorI2RlZmluZSBTRUNfQlVGRl9CVVNZXzMgKFNUQl9DQlVTX0JBU0UgKyAweGIxKQorI2RlZmluZSBQX1NFQ19CVUZGX0JVU1lfMyAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoU0VDX0JVRkZfQlVTWV8zKQorI2RlZmluZSBTRUNfQlVGRl9SRUFEWSAoU1RCX0NCVVNfQkFTRSArIDB4MTIpCisjZGVmaW5lIFBfU0VDX0JVRkZfUkVBRFkgICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihTRUNfQlVGRl9SRUFEWSkKKyNkZWZpbmUgU0VDX0JVRkZfUkVBRFlfMiAoU1RCX0NCVVNfQkFTRSArIDB4NjIpCisjZGVmaW5lIFBfU0VDX0JVRkZfUkVBRFlfMiAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihTRUNfQlVGRl9SRUFEWV8yKQorI2RlZmluZSBTRUNfQlVGRl9SRUFEWV8zIChTVEJfQ0JVU19CQVNFICsgMHhiMikKKyNkZWZpbmUgUF9TRUNfQlVGRl9SRUFEWV8zICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFNFQ19CVUZGX1JFQURZXzMpCisjZGVmaW5lIFNFQ19CVUZGX05VTUJFUiAoU1RCX0NCVVNfQkFTRSArIDB4MTMpCisjZGVmaW5lIFBfU0VDX0JVRkZfTlVNQkVSICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihTRUNfQlVGRl9OVU1CRVIpCisjZGVmaW5lIFNFQ19CVUZGX05VTUJFUl8yIChTVEJfQ0JVU19CQVNFICsgMHg2MykKKyNkZWZpbmUgUF9TRUNfQlVGRl9OVU1CRVJfMiAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFNFQ19CVUZGX05VTUJFUl8yKQorI2RlZmluZSBTRUNfQlVGRl9OVU1CRVJfMyAoU1RCX0NCVVNfQkFTRSArIDB4YjMpCisjZGVmaW5lIFBfU0VDX0JVRkZfTlVNQkVSXzMgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihTRUNfQlVGRl9OVU1CRVJfMykKKworCisvKipubyB1c2VkKi8KKyNkZWZpbmUgQVNTSUdOX1BJRF9OVU1CRVIgKFNUQl9DQlVTX0JBU0UgKyAweDE0KQorI2RlZmluZSBQX0FTU0lHTl9QSURfTlVNQkVSICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoQVNTSUdOX1BJRF9OVU1CRVIpCisjZGVmaW5lIEFTU0lHTl9QSURfTlVNQkVSXzIgKFNUQl9DQlVTX0JBU0UgKyAweDY0KQorI2RlZmluZSBQX0FTU0lHTl9QSURfTlVNQkVSXzIgICAgICAgICAgIENCVVNfUkVHX0FERFIoQVNTSUdOX1BJRF9OVU1CRVJfMikKKyNkZWZpbmUgQVNTSUdOX1BJRF9OVU1CRVJfMyAoU1RCX0NCVVNfQkFTRSArIDB4YjQpCisjZGVmaW5lIFBfQVNTSUdOX1BJRF9OVU1CRVJfMyAgICAgICAgICAgQ0JVU19SRUdfQUREUihBU1NJR05fUElEX05VTUJFUl8zKQorI2RlZmluZSBWSURFT19TVFJFQU1fSUQgKFNUQl9DQlVTX0JBU0UgKyAweDE1KQorI2RlZmluZSBQX1ZJREVPX1NUUkVBTV9JRCAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoVklERU9fU1RSRUFNX0lEKQorI2RlZmluZSBWSURFT19TVFJFQU1fSURfMiAoU1RCX0NCVVNfQkFTRSArIDB4NjUpCisjZGVmaW5lIFBfVklERU9fU1RSRUFNX0lEXzIgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihWSURFT19TVFJFQU1fSURfMikKKyNkZWZpbmUgVklERU9fU1RSRUFNX0lEXzMgKFNUQl9DQlVTX0JBU0UgKyAweGI1KQorI2RlZmluZSBQX1ZJREVPX1NUUkVBTV9JRF8zICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoVklERU9fU1RSRUFNX0lEXzMpCisjZGVmaW5lIEFVRElPX1NUUkVBTV9JRCAoU1RCX0NCVVNfQkFTRSArIDB4MTYpCisjZGVmaW5lIFBfQVVESU9fU1RSRUFNX0lEICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihBVURJT19TVFJFQU1fSUQpCisjZGVmaW5lIEFVRElPX1NUUkVBTV9JRF8yIChTVEJfQ0JVU19CQVNFICsgMHg2NikKKyNkZWZpbmUgUF9BVURJT19TVFJFQU1fSURfMiAgICAgICAgICAgICBDQlVTX1JFR19BRERSKEFVRElPX1NUUkVBTV9JRF8yKQorI2RlZmluZSBBVURJT19TVFJFQU1fSURfMyAoU1RCX0NCVVNfQkFTRSArIDB4YjYpCisjZGVmaW5lIFBfQVVESU9fU1RSRUFNX0lEXzMgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihBVURJT19TVFJFQU1fSURfMykKKyNkZWZpbmUgU1VCX1NUUkVBTV9JRCAoU1RCX0NCVVNfQkFTRSArIDB4MTcpCisjZGVmaW5lIFBfU1VCX1NUUkVBTV9JRCAgICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihTVUJfU1RSRUFNX0lEKQorI2RlZmluZSBTVUJfU1RSRUFNX0lEXzIgKFNUQl9DQlVTX0JBU0UgKyAweDY3KQorI2RlZmluZSBQX1NVQl9TVFJFQU1fSURfMiAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoU1VCX1NUUkVBTV9JRF8yKQorI2RlZmluZSBTVUJfU1RSRUFNX0lEXzMgKFNUQl9DQlVTX0JBU0UgKyAweGI3KQorI2RlZmluZSBQX1NVQl9TVFJFQU1fSURfMyAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoU1VCX1NUUkVBTV9JRF8zKQorI2RlZmluZSBPVEhFUl9TVFJFQU1fSUQgKFNUQl9DQlVTX0JBU0UgKyAweDE4KQorI2RlZmluZSBQX09USEVSX1NUUkVBTV9JRCAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoT1RIRVJfU1RSRUFNX0lEKQorI2RlZmluZSBPVEhFUl9TVFJFQU1fSURfMiAoU1RCX0NCVVNfQkFTRSArIDB4NjgpCisjZGVmaW5lIFBfT1RIRVJfU1RSRUFNX0lEXzIgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihPVEhFUl9TVFJFQU1fSURfMikKKyNkZWZpbmUgT1RIRVJfU1RSRUFNX0lEXzMgKFNUQl9DQlVTX0JBU0UgKyAweGI4KQorI2RlZmluZSBQX09USEVSX1NUUkVBTV9JRF8zICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoT1RIRVJfU1RSRUFNX0lEXzMpCisjZGVmaW5lIFBDUjkwS19DVEwgKFNUQl9DQlVTX0JBU0UgKyAweDE5KQorI2RlZmluZSBQX1BDUjkwS19DVEwgICAgICAgICAgICBDQlVTX1JFR19BRERSKFBDUjkwS19DVEwpCisjZGVmaW5lIFBDUjkwS19DVExfMiAoU1RCX0NCVVNfQkFTRSArIDB4NjkpCisjZGVmaW5lIFBfUENSOTBLX0NUTF8yICAgICAgICAgIENCVVNfUkVHX0FERFIoUENSOTBLX0NUTF8yKQorI2RlZmluZSBQQ1I5MEtfQ1RMXzMgKFNUQl9DQlVTX0JBU0UgKyAweGI5KQorI2RlZmluZSBQX1BDUjkwS19DVExfMyAgICAgICAgICBDQlVTX1JFR19BRERSKFBDUjkwS19DVExfMykKKy8qbm8gdXNlZCBlbmQqLworI2RlZmluZSBQQ1JfREVNVVggKFNUQl9DQlVTX0JBU0UgKyAweDFhKQorI2RlZmluZSBQX1BDUl9ERU1VWCAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFBDUl9ERU1VWCkKKyNkZWZpbmUgUENSX0RFTVVYXzIgKFNUQl9DQlVTX0JBU0UgKyAweDZhKQorI2RlZmluZSBQX1BDUl9ERU1VWF8yICAgICAgICAgICBDQlVTX1JFR19BRERSKFBDUl9ERU1VWF8yKQorI2RlZmluZSBQQ1JfREVNVVhfMyAoU1RCX0NCVVNfQkFTRSArIDB4YmEpCisjZGVmaW5lIFBfUENSX0RFTVVYXzMgICAgICAgICAgIENCVVNfUkVHX0FERFIoUENSX0RFTVVYXzMpCisKKyNkZWZpbmUgVklERU9fUFRTX0RFTVVYIChTVEJfQ0JVU19CQVNFICsgMHgxYikKKyNkZWZpbmUgUF9WSURFT19QVFNfREVNVVggICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFZJREVPX1BUU19ERU1VWCkKKyNkZWZpbmUgVklERU9fUFRTX0RFTVVYXzIgKFNUQl9DQlVTX0JBU0UgKyAweDZiKQorI2RlZmluZSBQX1ZJREVPX1BUU19ERU1VWF8yICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoVklERU9fUFRTX0RFTVVYXzIpCisjZGVmaW5lIFZJREVPX1BUU19ERU1VWF8zIChTVEJfQ0JVU19CQVNFICsgMHhiYikKKyNkZWZpbmUgUF9WSURFT19QVFNfREVNVVhfMyAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFZJREVPX1BUU19ERU1VWF8zKQorLypubyB1c2VkKi8KKyNkZWZpbmUgVklERU9fRFRTX0RFTVVYIChTVEJfQ0JVU19CQVNFICsgMHgxYykKKyNkZWZpbmUgUF9WSURFT19EVFNfREVNVVggICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFZJREVPX0RUU19ERU1VWCkKKyNkZWZpbmUgVklERU9fRFRTX0RFTVVYXzIgKFNUQl9DQlVTX0JBU0UgKyAweDZjKQorI2RlZmluZSBQX1ZJREVPX0RUU19ERU1VWF8yICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoVklERU9fRFRTX0RFTVVYXzIpCisjZGVmaW5lIFZJREVPX0RUU19ERU1VWF8zIChTVEJfQ0JVU19CQVNFICsgMHhiYykKKyNkZWZpbmUgUF9WSURFT19EVFNfREVNVVhfMyAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFZJREVPX0RUU19ERU1VWF8zKQorLypubyB1c2VkIGVuZCovCisjZGVmaW5lIEFVRElPX1BUU19ERU1VWCAoU1RCX0NCVVNfQkFTRSArIDB4MWQpCisjZGVmaW5lIFBfQVVESU9fUFRTX0RFTVVYICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihBVURJT19QVFNfREVNVVgpCisjZGVmaW5lIEFVRElPX1BUU19ERU1VWF8yIChTVEJfQ0JVU19CQVNFICsgMHg2ZCkKKyNkZWZpbmUgUF9BVURJT19QVFNfREVNVVhfMiAgICAgICAgICAgICBDQlVTX1JFR19BRERSKEFVRElPX1BUU19ERU1VWF8yKQorI2RlZmluZSBBVURJT19QVFNfREVNVVhfMyAoU1RCX0NCVVNfQkFTRSArIDB4YmQpCisjZGVmaW5lIFBfQVVESU9fUFRTX0RFTVVYXzMgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihBVURJT19QVFNfREVNVVhfMykKKy8qbm8gdXNlZCAqLworI2RlZmluZSBTVUJfUFRTX0RFTVVYIChTVEJfQ0JVU19CQVNFICsgMHgxZSkKKyNkZWZpbmUgUF9TVUJfUFRTX0RFTVVYICAgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFNVQl9QVFNfREVNVVgpCisjZGVmaW5lIFNVQl9QVFNfREVNVVhfMiAoU1RCX0NCVVNfQkFTRSArIDB4NmUpCisjZGVmaW5lIFBfU1VCX1BUU19ERU1VWF8yICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihTVUJfUFRTX0RFTVVYXzIpCisjZGVmaW5lIFNVQl9QVFNfREVNVVhfMyAoU1RCX0NCVVNfQkFTRSArIDB4YmUpCisjZGVmaW5lIFBfU1VCX1BUU19ERU1VWF8zICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihTVUJfUFRTX0RFTVVYXzMpCisvKm5vIHVzZWQgZW5kKi8KKyNkZWZpbmUgU1RCX1BUU19EVFNfU1RBVFVTIChTVEJfQ0JVU19CQVNFICsgMHgxZikKKyNkZWZpbmUgUF9TVEJfUFRTX0RUU19TVEFUVVMgICAgICAgICAgICBDQlVTX1JFR19BRERSKFNUQl9QVFNfRFRTX1NUQVRVUykKKyNkZWZpbmUgU1RCX1BUU19EVFNfU1RBVFVTXzIgKFNUQl9DQlVTX0JBU0UgKyAweDZmKQorI2RlZmluZSBQX1NUQl9QVFNfRFRTX1NUQVRVU18yICAgICAgICAgIENCVVNfUkVHX0FERFIoU1RCX1BUU19EVFNfU1RBVFVTXzIpCisjZGVmaW5lIFNUQl9QVFNfRFRTX1NUQVRVU18zIChTVEJfQ0JVU19CQVNFICsgMHhiZikKKyNkZWZpbmUgUF9TVEJfUFRTX0RUU19TVEFUVVNfMyAgICAgICAgICBDQlVTX1JFR19BRERSKFNUQl9QVFNfRFRTX1NUQVRVU18zKQorCisvKm5vIHVzZSovCisjZGVmaW5lIFNUQl9ERUJVR19JTkRFWCAoU1RCX0NCVVNfQkFTRSArIDB4MjApCisjZGVmaW5lIFBfU1RCX0RFQlVHX0lOREVYICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihTVEJfREVCVUdfSU5ERVgpCisjZGVmaW5lIFNUQl9ERUJVR19JTkRFWF8yIChTVEJfQ0JVU19CQVNFICsgMHg3MCkKKyNkZWZpbmUgUF9TVEJfREVCVUdfSU5ERVhfMiAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFNUQl9ERUJVR19JTkRFWF8yKQorI2RlZmluZSBTVEJfREVCVUdfSU5ERVhfMyAoU1RCX0NCVVNfQkFTRSArIDB4YzApCisjZGVmaW5lIFBfU1RCX0RFQlVHX0lOREVYXzMgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihTVEJfREVCVUdfSU5ERVhfMykKKyNkZWZpbmUgU1RCX0RFQlVHX0RBVEFVVF9PIChTVEJfQ0JVU19CQVNFICsgMHgyMSkKKyNkZWZpbmUgUF9TVEJfREVCVUdfREFUQVVUX08gICAgICAgICAgICBDQlVTX1JFR19BRERSKFNUQl9ERUJVR19EQVRBVVRfTykKKyNkZWZpbmUgU1RCX0RFQlVHX0RBVEFVVF9PXzIgKFNUQl9DQlVTX0JBU0UgKyAweDcxKQorI2RlZmluZSBQX1NUQl9ERUJVR19EQVRBVVRfT18yICAgICAgICAgIENCVVNfUkVHX0FERFIoU1RCX0RFQlVHX0RBVEFVVF9PXzIpCisjZGVmaW5lIFNUQl9ERUJVR19EQVRBVVRfT18zIChTVEJfQ0JVU19CQVNFICsgMHhjMSkKKyNkZWZpbmUgUF9TVEJfREVCVUdfREFUQVVUX09fMyAgICAgICAgICBDQlVTX1JFR19BRERSKFNUQl9ERUJVR19EQVRBVVRfT18zKQorLypubyB1c2UgZW5kKi8KKworI2RlZmluZSBTVEJNX0NUTF9PIChTVEJfQ0JVU19CQVNFICsgMHgyMikKKyNkZWZpbmUgUF9TVEJNX0NUTF9PICAgICAgICAgICAgQ0JVU19SRUdfQUREUihTVEJNX0NUTF9PKQorI2RlZmluZSBTVEJNX0NUTF9PXzIgKFNUQl9DQlVTX0JBU0UgKyAweDcyKQorI2RlZmluZSBQX1NUQk1fQ1RMX09fMiAgICAgICAgICBDQlVTX1JFR19BRERSKFNUQk1fQ1RMX09fMikKKyNkZWZpbmUgU1RCTV9DVExfT18zIChTVEJfQ0JVU19CQVNFICsgMHhjMikKKyNkZWZpbmUgUF9TVEJNX0NUTF9PXzMgICAgICAgICAgQ0JVU19SRUdfQUREUihTVEJNX0NUTF9PXzMpCisjZGVmaW5lIFNUQl9JTlRfU1RBVFVTIChTVEJfQ0JVU19CQVNFICsgMHgyMykKKyNkZWZpbmUgUF9TVEJfSU5UX1NUQVRVUyAgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFNUQl9JTlRfU1RBVFVTKQorI2RlZmluZSBTVEJfSU5UX1NUQVRVU18yIChTVEJfQ0JVU19CQVNFICsgMHg3MykKKyNkZWZpbmUgUF9TVEJfSU5UX1NUQVRVU18yICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFNUQl9JTlRfU1RBVFVTXzIpCisjZGVmaW5lIFNUQl9JTlRfU1RBVFVTXzMgKFNUQl9DQlVTX0JBU0UgKyAweGMzKQorI2RlZmluZSBQX1NUQl9JTlRfU1RBVFVTXzMgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoU1RCX0lOVF9TVEFUVVNfMykKKyNkZWZpbmUgREVNVVhfRU5ESUFOIChTVEJfQ0JVU19CQVNFICsgMHgyNCkKKyNkZWZpbmUgUF9ERU1VWF9FTkRJQU4gICAgICAgICAgQ0JVU19SRUdfQUREUihERU1VWF9FTkRJQU4pCisjZGVmaW5lIERFTVVYX0VORElBTl8yIChTVEJfQ0JVU19CQVNFICsgMHg3NCkKKyNkZWZpbmUgUF9ERU1VWF9FTkRJQU5fMiAgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKERFTVVYX0VORElBTl8yKQorI2RlZmluZSBERU1VWF9FTkRJQU5fMyAoU1RCX0NCVVNfQkFTRSArIDB4YzQpCisjZGVmaW5lIFBfREVNVVhfRU5ESUFOXzMgICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihERU1VWF9FTkRJQU5fMykKKyNkZWZpbmUgVFNfSElVX0NUTCAoU1RCX0NCVVNfQkFTRSArIDB4MjUpCisjZGVmaW5lIFBfVFNfSElVX0NUTCAgICAgICAgICAgIENCVVNfUkVHX0FERFIoVFNfSElVX0NUTCkKKyNkZWZpbmUgVFNfSElVX0NUTF8yIChTVEJfQ0JVU19CQVNFICsgMHg3NSkKKyNkZWZpbmUgUF9UU19ISVVfQ1RMXzIgICAgICAgICAgQ0JVU19SRUdfQUREUihUU19ISVVfQ1RMXzIpCisjZGVmaW5lIFRTX0hJVV9DVExfMyAoU1RCX0NCVVNfQkFTRSArIDB4YzUpCisjZGVmaW5lIFBfVFNfSElVX0NUTF8zICAgICAgICAgIENCVVNfUkVHX0FERFIoVFNfSElVX0NUTF8zKQorCisjZGVmaW5lIFNFQ19CVUZGX0JBU0UgKFNUQl9DQlVTX0JBU0UgKyAweDI2KQorI2RlZmluZSBQX1NFQ19CVUZGX0JBU0UgICAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoU0VDX0JVRkZfQkFTRSkKKyNkZWZpbmUgU0VDX0JVRkZfQkFTRV8yIChTVEJfQ0JVU19CQVNFICsgMHg3NikKKyNkZWZpbmUgUF9TRUNfQlVGRl9CQVNFXzIgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFNFQ19CVUZGX0JBU0VfMikKKyNkZWZpbmUgU0VDX0JVRkZfQkFTRV8zIChTVEJfQ0JVU19CQVNFICsgMHhjNikKKyNkZWZpbmUgUF9TRUNfQlVGRl9CQVNFXzMgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFNFQ19CVUZGX0JBU0VfMykKKyNkZWZpbmUgREVNVVhfTUVNX1JFUV9FTiAoU1RCX0NCVVNfQkFTRSArIDB4MjcpCisjZGVmaW5lIFBfREVNVVhfTUVNX1JFUV9FTiAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihERU1VWF9NRU1fUkVRX0VOKQorI2RlZmluZSBERU1VWF9NRU1fUkVRX0VOXzIgKFNUQl9DQlVTX0JBU0UgKyAweDc3KQorI2RlZmluZSBQX0RFTVVYX01FTV9SRVFfRU5fMiAgICAgICAgICAgIENCVVNfUkVHX0FERFIoREVNVVhfTUVNX1JFUV9FTl8yKQorI2RlZmluZSBERU1VWF9NRU1fUkVRX0VOXzMgKFNUQl9DQlVTX0JBU0UgKyAweGM3KQorI2RlZmluZSBQX0RFTVVYX01FTV9SRVFfRU5fMyAgICAgICAgICAgIENCVVNfUkVHX0FERFIoREVNVVhfTUVNX1JFUV9FTl8zKQorCisKKy8qbm8gdXNlKi8KKyNkZWZpbmUgVklERU9fUERUU19XUl9QVFIgKFNUQl9DQlVTX0JBU0UgKyAweDI4KQorI2RlZmluZSBQX1ZJREVPX1BEVFNfV1JfUFRSICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoVklERU9fUERUU19XUl9QVFIpCisjZGVmaW5lIFZJREVPX1BEVFNfV1JfUFRSXzIgKFNUQl9DQlVTX0JBU0UgKyAweDc4KQorI2RlZmluZSBQX1ZJREVPX1BEVFNfV1JfUFRSXzIgICAgICAgICAgIENCVVNfUkVHX0FERFIoVklERU9fUERUU19XUl9QVFJfMikKKyNkZWZpbmUgVklERU9fUERUU19XUl9QVFJfMyAoU1RCX0NCVVNfQkFTRSArIDB4YzgpCisjZGVmaW5lIFBfVklERU9fUERUU19XUl9QVFJfMyAgICAgICAgICAgQ0JVU19SRUdfQUREUihWSURFT19QRFRTX1dSX1BUUl8zKQorI2RlZmluZSBBVURJT19QRFRTX1dSX1BUUiAoU1RCX0NCVVNfQkFTRSArIDB4MjkpCisjZGVmaW5lIFBfQVVESU9fUERUU19XUl9QVFIgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihBVURJT19QRFRTX1dSX1BUUikKKyNkZWZpbmUgQVVESU9fUERUU19XUl9QVFJfMiAoU1RCX0NCVVNfQkFTRSArIDB4NzkpCisjZGVmaW5lIFBfQVVESU9fUERUU19XUl9QVFJfMiAgICAgICAgICAgQ0JVU19SRUdfQUREUihBVURJT19QRFRTX1dSX1BUUl8yKQorI2RlZmluZSBBVURJT19QRFRTX1dSX1BUUl8zIChTVEJfQ0JVU19CQVNFICsgMHhjOSkKKyNkZWZpbmUgUF9BVURJT19QRFRTX1dSX1BUUl8zICAgICAgICAgICBDQlVTX1JFR19BRERSKEFVRElPX1BEVFNfV1JfUFRSXzMpCisjZGVmaW5lIFNVQl9XUl9QVFIgKFNUQl9DQlVTX0JBU0UgKyAweDJhKQorI2RlZmluZSBQX1NVQl9XUl9QVFIgICAgICAgICAgICBDQlVTX1JFR19BRERSKFNVQl9XUl9QVFIpCisjZGVmaW5lIFNVQl9XUl9QVFJfMiAoU1RCX0NCVVNfQkFTRSArIDB4N2EpCisjZGVmaW5lIFBfU1VCX1dSX1BUUl8yICAgICAgICAgIENCVVNfUkVHX0FERFIoU1VCX1dSX1BUUl8yKQorI2RlZmluZSBTVUJfV1JfUFRSXzMgKFNUQl9DQlVTX0JBU0UgKyAweGNhKQorI2RlZmluZSBQX1NVQl9XUl9QVFJfMyAgICAgICAgICBDQlVTX1JFR19BRERSKFNVQl9XUl9QVFJfMykKKy8qbm8gdXNlKi8KKworI2RlZmluZSBTQl9TVEFSVCAoU1RCX0NCVVNfQkFTRSArIDB4MmIpCisjZGVmaW5lIFBfU0JfU1RBUlQgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoU0JfU1RBUlQpCisjZGVmaW5lIFNCX1NUQVJUXzIgKFNUQl9DQlVTX0JBU0UgKyAweDdiKQorI2RlZmluZSBQX1NCX1NUQVJUXzIgICAgICAgICAgICBDQlVTX1JFR19BRERSKFNCX1NUQVJUXzIpCisjZGVmaW5lIFNCX1NUQVJUXzMgKFNUQl9DQlVTX0JBU0UgKyAweGNiKQorI2RlZmluZSBQX1NCX1NUQVJUXzMgICAgICAgICAgICBDQlVTX1JFR19BRERSKFNCX1NUQVJUXzMpCisjZGVmaW5lIFNCX0xBU1RfQUREUiAoU1RCX0NCVVNfQkFTRSArIDB4MmMpCisjZGVmaW5lIFBfU0JfTEFTVF9BRERSICAgICAgICAgIENCVVNfUkVHX0FERFIoU0JfTEFTVF9BRERSKQorI2RlZmluZSBTQl9MQVNUX0FERFJfMiAoU1RCX0NCVVNfQkFTRSArIDB4N2MpCisjZGVmaW5lIFBfU0JfTEFTVF9BRERSXzIgICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihTQl9MQVNUX0FERFJfMikKKyNkZWZpbmUgU0JfTEFTVF9BRERSXzMgKFNUQl9DQlVTX0JBU0UgKyAweGNjKQorI2RlZmluZSBQX1NCX0xBU1RfQUREUl8zICAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoU0JfTEFTVF9BRERSXzMpCisjZGVmaW5lIFNCX1BFU19XUl9QVFIgKFNUQl9DQlVTX0JBU0UgKyAweDJkKQorI2RlZmluZSBQX1NCX1BFU19XUl9QVFIgICAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoU0JfUEVTX1dSX1BUUikKKyNkZWZpbmUgU0JfUEVTX1dSX1BUUl8yIChTVEJfQ0JVU19CQVNFICsgMHg3ZCkKKyNkZWZpbmUgUF9TQl9QRVNfV1JfUFRSXzIgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFNCX1BFU19XUl9QVFJfMikKKyNkZWZpbmUgU0JfUEVTX1dSX1BUUl8zIChTVEJfQ0JVU19CQVNFICsgMHhjZCkKKyNkZWZpbmUgUF9TQl9QRVNfV1JfUFRSXzMgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFNCX1BFU19XUl9QVFJfMykKKyNkZWZpbmUgT1RIRVJfV1JfUFRSIChTVEJfQ0JVU19CQVNFICsgMHgyZSkKKyNkZWZpbmUgUF9PVEhFUl9XUl9QVFIgICAgICAgICAgQ0JVU19SRUdfQUREUihPVEhFUl9XUl9QVFIpCisjZGVmaW5lIE9USEVSX1dSX1BUUl8yIChTVEJfQ0JVU19CQVNFICsgMHg3ZSkKKyNkZWZpbmUgUF9PVEhFUl9XUl9QVFJfMiAgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKE9USEVSX1dSX1BUUl8yKQorI2RlZmluZSBPVEhFUl9XUl9QVFJfMyAoU1RCX0NCVVNfQkFTRSArIDB4Y2UpCisjZGVmaW5lIFBfT1RIRVJfV1JfUFRSXzMgICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihPVEhFUl9XUl9QVFJfMykKKworI2RlZmluZSBPQl9TVEFSVCAoU1RCX0NCVVNfQkFTRSArIDB4MmYpCisjZGVmaW5lIFBfT0JfU1RBUlQgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoT0JfU1RBUlQpCisjZGVmaW5lIE9CX1NUQVJUXzIgKFNUQl9DQlVTX0JBU0UgKyAweDdmKQorI2RlZmluZSBQX09CX1NUQVJUXzIgICAgICAgICAgICBDQlVTX1JFR19BRERSKE9CX1NUQVJUXzIpCisjZGVmaW5lIE9CX1NUQVJUXzMgKFNUQl9DQlVTX0JBU0UgKyAweGNmKQorI2RlZmluZSBQX09CX1NUQVJUXzMgICAgICAgICAgICBDQlVTX1JFR19BRERSKE9CX1NUQVJUXzMpCisjZGVmaW5lIE9CX0xBU1RfQUREUiAoU1RCX0NCVVNfQkFTRSArIDB4MzApCisjZGVmaW5lIFBfT0JfTEFTVF9BRERSICAgICAgICAgIENCVVNfUkVHX0FERFIoT0JfTEFTVF9BRERSKQorI2RlZmluZSBPQl9MQVNUX0FERFJfMiAoU1RCX0NCVVNfQkFTRSArIDB4ODApCisjZGVmaW5lIFBfT0JfTEFTVF9BRERSXzIgICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihPQl9MQVNUX0FERFJfMikKKyNkZWZpbmUgT0JfTEFTVF9BRERSXzMgKFNUQl9DQlVTX0JBU0UgKyAweGQwKQorI2RlZmluZSBQX09CX0xBU1RfQUREUl8zICAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoT0JfTEFTVF9BRERSXzMpCisjZGVmaW5lIE9CX1BFU19XUl9QVFIgKFNUQl9DQlVTX0JBU0UgKyAweDMxKQorI2RlZmluZSBQX09CX1BFU19XUl9QVFIgICAgICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoT0JfUEVTX1dSX1BUUikKKyNkZWZpbmUgT0JfUEVTX1dSX1BUUl8yIChTVEJfQ0JVU19CQVNFICsgMHg4MSkKKyNkZWZpbmUgUF9PQl9QRVNfV1JfUFRSXzIgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKE9CX1BFU19XUl9QVFJfMikKKyNkZWZpbmUgT0JfUEVTX1dSX1BUUl8zIChTVEJfQ0JVU19CQVNFICsgMHhkMSkKKyNkZWZpbmUgUF9PQl9QRVNfV1JfUFRSXzMgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKE9CX1BFU19XUl9QVFJfMykKKyNkZWZpbmUgU1RCX0lOVF9NQVNLIChTVEJfQ0JVU19CQVNFICsgMHgzMikKKyNkZWZpbmUgUF9TVEJfSU5UX01BU0sgICAgICAgICAgQ0JVU19SRUdfQUREUihTVEJfSU5UX01BU0spCisjZGVmaW5lIFNUQl9JTlRfTUFTS18yIChTVEJfQ0JVU19CQVNFICsgMHg4MikKKyNkZWZpbmUgUF9TVEJfSU5UX01BU0tfMiAgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFNUQl9JTlRfTUFTS18yKQorI2RlZmluZSBTVEJfSU5UX01BU0tfMyAoU1RCX0NCVVNfQkFTRSArIDB4ZDIpCisjZGVmaW5lIFBfU1RCX0lOVF9NQVNLXzMgICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihTVEJfSU5UX01BU0tfMykKKy8qbm8gdXNlZCAqLworI2RlZmluZSBWSURFT19TUExJQ0lOR19DVEwgKFNUQl9DQlVTX0JBU0UgKyAweDMzKQorI2RlZmluZSBQX1ZJREVPX1NQTElDSU5HX0NUTCAgICAgICAgICAgIENCVVNfUkVHX0FERFIoVklERU9fU1BMSUNJTkdfQ1RMKQorI2RlZmluZSBWSURFT19TUExJQ0lOR19DVExfMiAoU1RCX0NCVVNfQkFTRSArIDB4ODMpCisjZGVmaW5lIFBfVklERU9fU1BMSUNJTkdfQ1RMXzIgICAgICAgICAgQ0JVU19SRUdfQUREUihWSURFT19TUExJQ0lOR19DVExfMikKKyNkZWZpbmUgVklERU9fU1BMSUNJTkdfQ1RMXzMgKFNUQl9DQlVTX0JBU0UgKyAweGQzKQorI2RlZmluZSBQX1ZJREVPX1NQTElDSU5HX0NUTF8zICAgICAgICAgIENCVVNfUkVHX0FERFIoVklERU9fU1BMSUNJTkdfQ1RMXzMpCisjZGVmaW5lIEFVRElPX1NQTElDSU5HX0NUTCAoU1RCX0NCVVNfQkFTRSArIDB4MzQpCisjZGVmaW5lIFBfQVVESU9fU1BMSUNJTkdfQ1RMICAgICAgICAgICAgQ0JVU19SRUdfQUREUihBVURJT19TUExJQ0lOR19DVEwpCisjZGVmaW5lIEFVRElPX1NQTElDSU5HX0NUTF8yIChTVEJfQ0JVU19CQVNFICsgMHg4NCkKKyNkZWZpbmUgUF9BVURJT19TUExJQ0lOR19DVExfMiAgICAgICAgICBDQlVTX1JFR19BRERSKEFVRElPX1NQTElDSU5HX0NUTF8yKQorI2RlZmluZSBBVURJT19TUExJQ0lOR19DVExfMyAoU1RCX0NCVVNfQkFTRSArIDB4ZDQpCisjZGVmaW5lIFBfQVVESU9fU1BMSUNJTkdfQ1RMXzMgICAgICAgICAgQ0JVU19SRUdfQUREUihBVURJT19TUExJQ0lOR19DVExfMykKKyNkZWZpbmUgVFNfUEFDS0FHRV9CWVRFX0NPVU5UIChTVEJfQ0JVU19CQVNFICsgMHgzNSkKKyNkZWZpbmUgUF9UU19QQUNLQUdFX0JZVEVfQ09VTlQgICAgICAgICAgICAgICAgIFwKKwlDQlVTX1JFR19BRERSKFRTX1BBQ0tBR0VfQllURV9DT1VOVCkKKyNkZWZpbmUgVFNfUEFDS0FHRV9CWVRFX0NPVU5UXzIgKFNUQl9DQlVTX0JBU0UgKyAweDg1KQorI2RlZmluZSBQX1RTX1BBQ0tBR0VfQllURV9DT1VOVF8yICAgICAgICAgICAgICAgXAorCUNCVVNfUkVHX0FERFIoVFNfUEFDS0FHRV9CWVRFX0NPVU5UXzIpCisjZGVmaW5lIFRTX1BBQ0tBR0VfQllURV9DT1VOVF8zIChTVEJfQ0JVU19CQVNFICsgMHhkNSkKKyNkZWZpbmUgUF9UU19QQUNLQUdFX0JZVEVfQ09VTlRfMyAgICAgICAgICAgICAgIFwKKwlDQlVTX1JFR19BRERSKFRTX1BBQ0tBR0VfQllURV9DT1VOVF8zKQorLypubyB1c2VkIGVuZCovCisKKyNkZWZpbmUgUEVTX1NUUk9OR19TWU5DIChTVEJfQ0JVU19CQVNFICsgMHgzNikKKyNkZWZpbmUgUF9QRVNfU1RST05HX1NZTkMgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFBFU19TVFJPTkdfU1lOQykKKyNkZWZpbmUgUEVTX1NUUk9OR19TWU5DXzIgKFNUQl9DQlVTX0JBU0UgKyAweDg2KQorI2RlZmluZSBQX1BFU19TVFJPTkdfU1lOQ18yICAgICAgICAgICAgIENCVVNfUkVHX0FERFIoUEVTX1NUUk9OR19TWU5DXzIpCisjZGVmaW5lIFBFU19TVFJPTkdfU1lOQ18zIChTVEJfQ0JVU19CQVNFICsgMHhkNikKKyNkZWZpbmUgUF9QRVNfU1RST05HX1NZTkNfMyAgICAgICAgICAgICBDQlVTX1JFR19BRERSKFBFU19TVFJPTkdfU1lOQ18zKQorCisjZGVmaW5lIE9NX0RBVEFfUkRfQUREUiAoU1RCX0NCVVNfQkFTRSArIDB4MzcpCisjZGVmaW5lIFBfT01fREFUQV9SRF9BRERSICAgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihPTV9EQVRBX1JEX0FERFIpCisjZGVmaW5lIE9NX0RBVEFfUkRfQUREUl8yIChTVEJfQ0JVU19CQVNFICsgMHg4NykKKyNkZWZpbmUgUF9PTV9EQVRBX1JEX0FERFJfMiAgICAgICAgICAgICBDQlVTX1JFR19BRERSKE9NX0RBVEFfUkRfQUREUl8yKQorI2RlZmluZSBPTV9EQVRBX1JEX0FERFJfMyAoU1RCX0NCVVNfQkFTRSArIDB4ZDcpCisjZGVmaW5lIFBfT01fREFUQV9SRF9BRERSXzMgICAgICAgICAgICAgQ0JVU19SRUdfQUREUihPTV9EQVRBX1JEX0FERFJfMykKKyNkZWZpbmUgT01fREFUQV9SRCAoU1RCX0NCVVNfQkFTRSArIDB4MzgpCisjZGVmaW5lIFBfT01fREFUQV9SRCAgICAgICAgICAgIENCVVNfUkVHX0FERFIoT01fREFUQV9SRCkKKyNkZWZpbmUgT01fREFUQV9SRF8yIChTVEJfQ0JVU19CQVNFICsgMHg4OCkKKyNkZWZpbmUgUF9PTV9EQVRBX1JEXzIgICAgICAgICAgQ0JVU19SRUdfQUREUihPTV9EQVRBX1JEXzIpCisjZGVmaW5lIE9NX0RBVEFfUkRfMyAoU1RCX0NCVVNfQkFTRSArIDB4ZDgpCisjZGVmaW5lIFBfT01fREFUQV9SRF8zICAgICAgICAgIENCVVNfUkVHX0FERFIoT01fREFUQV9SRF8zKQorCisvKm5vIHVzZWQqLworCisjZGVmaW5lIFNFQ1RJT05fQVVUT19TVE9QXzMgKFNUQl9DQlVTX0JBU0UgKyAweDM5KQorI2RlZmluZSBQX1NFQ1RJT05fQVVUT19TVE9QXzMgICAgICAgICAgIENCVVNfUkVHX0FERFIoU0VDVElPTl9BVVRPX1NUT1BfMykKKyNkZWZpbmUgU0VDVElPTl9BVVRPX1NUT1BfM18yIChTVEJfQ0JVU19CQVNFICsgMHg4OSkKKyNkZWZpbmUgUF9TRUNUSU9OX0FVVE9fU1RPUF8zXzIgICAgICAgICAgICAgICAgIFwKKwlDQlVTX1JFR19BRERSKFNFQ1RJT05fQVVUT19TVE9QXzNfMikKKyNkZWZpbmUgU0VDVElPTl9BVVRPX1NUT1BfM18zIChTVEJfQ0JVU19CQVNFICsgMHhkOSkKKyNkZWZpbmUgUF9TRUNUSU9OX0FVVE9fU1RPUF8zXzMgICAgICAgICAgICAgICAgIFwKKwlDQlVTX1JFR19BRERSKFNFQ1RJT05fQVVUT19TVE9QXzNfMykKKyNkZWZpbmUgU0VDVElPTl9BVVRPX1NUT1BfMiAoU1RCX0NCVVNfQkFTRSArIDB4M2EpCisjZGVmaW5lIFBfU0VDVElPTl9BVVRPX1NUT1BfMiAgICAgICAgICAgXAorCUNCVVNfUkVHX0FERFIoU0VDVElPTl9BVVRPX1NUT1BfMikKKyNkZWZpbmUgU0VDVElPTl9BVVRPX1NUT1BfMl8yIChTVEJfQ0JVU19CQVNFICsgMHg4YSkKKyNkZWZpbmUgUF9TRUNUSU9OX0FVVE9fU1RPUF8yXzIgICAgICAgICAgICAgICAgIFwKKwlDQlVTX1JFR19BRERSKFNFQ1RJT05fQVVUT19TVE9QXzJfMikKKyNkZWZpbmUgU0VDVElPTl9BVVRPX1NUT1BfMl8zIChTVEJfQ0JVU19CQVNFICsgMHhkYSkKKyNkZWZpbmUgUF9TRUNUSU9OX0FVVE9fU1RPUF8yXzMgICAgICAgICAgICAgICAgIFwKKwlDQlVTX1JFR19BRERSKFNFQ1RJT05fQVVUT19TVE9QXzJfMykKKyNkZWZpbmUgU0VDVElPTl9BVVRPX1NUT1BfMSAoU1RCX0NCVVNfQkFTRSArIDB4M2IpCisjZGVmaW5lIFBfU0VDVElPTl9BVVRPX1NUT1BfMSAgICAgICAgICAgQ0JVU19SRUdfQUREUihTRUNUSU9OX0FVVE9fU1RPUF8xKQorI2RlZmluZSBTRUNUSU9OX0FVVE9fU1RPUF8xXzIgKFNUQl9DQlVTX0JBU0UgKyAweDhiKQorI2RlZmluZSBQX1NFQ1RJT05fQVVUT19TVE9QXzFfMiAgICAgICAgICAgICAgICAgXAorCUNCVVNfUkVHX0FERFIoU0VDVElPTl9BVVRPX1NUT1BfMV8yKQorI2RlZmluZSBTRUNUSU9OX0FVVE9fU1RPUF8xXzMgKFNUQl9DQlVTX0JBU0UgKyAweGRiKQorI2RlZmluZSBQX1NFQ1RJT05fQVVUT19TVE9QXzFfMyAgICAgICAgICAgICAgICAgXAorCUNCVVNfUkVHX0FERFIoU0VDVElPTl9BVVRPX1NUT1BfMV8zKQorI2RlZmluZSBTRUNUSU9OX0FVVE9fU1RPUF8wIChTVEJfQ0JVU19CQVNFICsgMHgzYykKKyNkZWZpbmUgUF9TRUNUSU9OX0FVVE9fU1RPUF8wICAgICAgICAgICBcCisJQ0JVU19SRUdfQUREUihTRUNUSU9OX0FVVE9fU1RPUF8wKQorI2RlZmluZSBTRUNUSU9OX0FVVE9fU1RPUF8wXzIgKFNUQl9DQlVTX0JBU0UgKyAweDhjKQorI2RlZmluZSBQX1NFQ1RJT05fQVVUT19TVE9QXzBfMiAgICAgICAgICAgICAgICAgXAorCUNCVVNfUkVHX0FERFIoU0VDVElPTl9BVVRPX1NUT1BfMF8yKQorI2RlZmluZSBTRUNUSU9OX0FVVE9fU1RPUF8wXzMgKFNUQl9DQlVTX0JBU0UgKyAweGRjKQorI2RlZmluZSBQX1NFQ1RJT05fQVVUT19TVE9QXzBfMyAgICAgICAgICAgICAgICAgXAorCUNCVVNfUkVHX0FERFIoU0VDVElPTl9BVVRPX1NUT1BfMF8zKQorCisjZGVmaW5lIERFTVVYX0NIQU5ORUxfUkVTRVQgKFNUQl9DQlVTX0JBU0UgKyAweDNkKQorI2RlZmluZSBQX0RFTVVYX0NIQU5ORUxfUkVTRVQgICAgICAgICAgIFwKKwlDQlVTX1JFR19BRERSKERFTVVYX0NIQU5ORUxfUkVTRVQpCisjZGVmaW5lIERFTVVYX0NIQU5ORUxfUkVTRVRfMiAoU1RCX0NCVVNfQkFTRSArIDB4OGQpCisjZGVmaW5lIFBfREVNVVhfQ0hBTk5FTF9SRVNFVF8yICAgICAgICAgICAgICAgICBcCisJQ0JVU19SRUdfQUREUihERU1VWF9DSEFOTkVMX1JFU0VUXzIpCisjZGVmaW5lIERFTVVYX0NIQU5ORUxfUkVTRVRfMyAoU1RCX0NCVVNfQkFTRSArIDB4ZGQpCisjZGVmaW5lIFBfREVNVVhfQ0hBTk5FTF9SRVNFVF8zICAgICAgICAgICAgICAgICBcCisJQ0JVU19SRUdfQUREUihERU1VWF9DSEFOTkVMX1JFU0VUXzMpCisvKm5vIHVzZSBlbmQqLworI2RlZmluZSBERU1VWF9TQ1JBTUJMSU5HX1NUQVRFIChTVEJfQ0JVU19CQVNFICsgMHgzZSkKKyNkZWZpbmUgREVNVVhfU0NSQU1CTElOR19TVEFURV8yIChTVEJfQ0JVU19CQVNFICsgMHg4ZSkKKyNkZWZpbmUgUF9ERU1VWF9TQ1JBTUJMSU5HX1NUQVRFXzIgICAgICAgICAgICAgIFwKKwlDQlVTX1JFR19BRERSKERFTVVYX1NDUkFNQkxJTkdfU1RBVEVfMikKKyNkZWZpbmUgREVNVVhfU0NSQU1CTElOR19TVEFURV8zIChTVEJfQ0JVU19CQVNFICsgMHhkZSkKKyNkZWZpbmUgUF9ERU1VWF9TQ1JBTUJMSU5HX1NUQVRFXzMgICAgICAgICAgICAgIFwKKwlDQlVTX1JFR19BRERSKERFTVVYX1NDUkFNQkxJTkdfU1RBVEVfMykKKyNkZWZpbmUgREVNVVhfQ0hBTk5FTF9BQ1RJVklUWSAoU1RCX0NCVVNfQkFTRSArIDB4M2YpCisjZGVmaW5lIFBfREVNVVhfQ0hBTk5FTF9BQ1RJVklUWSAgICAgICAgICAgICAgICBcCisJQ0JVU19SRUdfQUREUihERU1VWF9DSEFOTkVMX0FDVElWSVRZKQorI2RlZmluZSBERU1VWF9DSEFOTkVMX0FDVElWSVRZXzIgKFNUQl9DQlVTX0JBU0UgKyAweDhmKQorI2RlZmluZSBQX0RFTVVYX0NIQU5ORUxfQUNUSVZJVFlfMiAgICAgICAgICAgICAgXAorCUNCVVNfUkVHX0FERFIoREVNVVhfQ0hBTk5FTF9BQ1RJVklUWV8yKQorI2RlZmluZSBERU1VWF9DSEFOTkVMX0FDVElWSVRZXzMgKFNUQl9DQlVTX0JBU0UgKyAweGRmKQorI2RlZmluZSBQX0RFTVVYX0NIQU5ORUxfQUNUSVZJVFlfMyAgICAgICAgICAgICAgXAorCUNCVVNfUkVHX0FERFIoREVNVVhfQ0hBTk5FTF9BQ1RJVklUWV8zKQorCisvKm5vIHVzZSovCisKKyNkZWZpbmUgREVNVVhfU1RBTVBfQ1RMIChTVEJfQ0JVU19CQVNFICsgMHg0MCkKKyNkZWZpbmUgUF9ERU1VWF9TVEFNUF9DVEwgICAgICAgICAgICAgICBDQlVTX1JFR19BRERSKERFTVVYX1NUQU1QX0NUTCkKKyNkZWZpbmUgREVNVVhfU1RBTVBfQ1RMXzIgKFNUQl9DQlVTX0JBU0UgKyAweDkwKQorI2RlZmluZSBQX0RFTVVYX1NUQU1QX0NUTF8yICAgICAgICAgICAgIFwKKwlDQlVTX1JFR19BRERSKERFTVVYX1NUQU1QX0NUTF8yKQorI2RlZmluZSBERU1VWF9TVEFNUF9DVExfMyAoU1RCX0NCVVNfQkFTRSArIDB4ZTApCisjZGVmaW5lIFBfREVNVVhfU1RBTVBfQ1RMXzMgICAgICAgICAgICAgXAorCUNCVVNfUkVHX0FERFIoREVNVVhfU1RBTVBfQ1RMXzMpCisjZGVmaW5lIERFTVVYX1ZJREVPX1NUQU1QX1NZTkNfMCAoU1RCX0NCVVNfQkFTRSArIDB4NDEpCisjZGVmaW5lIFBfREVNVVhfVklERU9fU1RBTVBfU1lOQ18wICAgICAgICAgICAgICBcCisJQ0JVU19SRUdfQUREUihERU1VWF9WSURFT19TVEFNUF9TWU5DXzApCisjZGVmaW5lIERFTVVYX1ZJREVPX1NUQU1QX1NZTkNfMF8yIChTVEJfQ0JVU19CQVNFICsgMHg5MSkKKyNkZWZpbmUgUF9ERU1VWF9WSURFT19TVEFNUF9TWU5DXzBfMiAgICAgICAgICAgIFwKKwlDQlVTX1JFR19BRERSKERFTVVYX1ZJREVPX1NUQU1QX1NZTkNfMF8yKQorI2RlZmluZSBERU1VWF9WSURFT19TVEFNUF9TWU5DXzBfMyAoU1RCX0NCVVNfQkFTRSArIDB4ZTEpCisjZGVmaW5lIFBfREVNVVhfVklERU9fU1RBTVBfU1lOQ18wXzMgICAgICAgICAgICBcCisJQ0JVU19SRUdfQUREUihERU1VWF9WSURFT19TVEFNUF9TWU5DXzBfMykKKyNkZWZpbmUgREVNVVhfVklERU9fU1RBTVBfU1lOQ18xIChTVEJfQ0JVU19CQVNFICsgMHg0MikKKyNkZWZpbmUgUF9ERU1VWF9WSURFT19TVEFNUF9TWU5DXzEgICAgICAgICAgICAgIFwKKwlDQlVTX1JFR19BRERSKERFTVVYX1ZJREVPX1NUQU1QX1NZTkNfMSkKKyNkZWZpbmUgREVNVVhfVklERU9fU1RBTVBfU1lOQ18xXzIgKFNUQl9DQlVTX0JBU0UgKyAweDkyKQorI2RlZmluZSBQX0RFTVVYX1ZJREVPX1NUQU1QX1NZTkNfMV8yICAgICAgICAgICAgXAorCUNCVVNfUkVHX0FERFIoREVNVVhfVklERU9fU1RBTVBfU1lOQ18xXzIpCisjZGVmaW5lIERFTVVYX1ZJREVPX1NUQU1QX1NZTkNfMV8zIChTVEJfQ0JVU19CQVNFICsgMHhlMikKKyNkZWZpbmUgUF9ERU1VWF9WSURFT19TVEFNUF9TWU5DXzFfMyAgICAgICAgICAgIFwKKwlDQlVTX1JFR19BRERSKERFTVVYX1ZJREVPX1NUQU1QX1NZTkNfMV8zKQorI2RlZmluZSBERU1VWF9BVURJT19TVEFNUF9TWU5DXzAgKFNUQl9DQlVTX0JBU0UgKyAweDQzKQorI2RlZmluZSBQX0RFTVVYX0FVRElPX1NUQU1QX1NZTkNfMCAgICAgICAgICAgICAgXAorCUNCVVNfUkVHX0FERFIoREVNVVhfQVVESU9fU1RBTVBfU1lOQ18wKQorI2RlZmluZSBERU1VWF9BVURJT19TVEFNUF9TWU5DXzBfMiAoU1RCX0NCVVNfQkFTRSArIDB4OTMpCisjZGVmaW5lIFBfREVNVVhfQVVESU9fU1RBTVBfU1lOQ18wXzIgICAgICAgICAgICBcCisJQ0JVU19SRUdfQUREUihERU1VWF9BVURJT19TVEFNUF9TWU5DXzBfMikKKyNkZWZpbmUgREVNVVhfQVVESU9fU1RBTVBfU1lOQ18wXzMgKFNUQl9DQlVTX0JBU0UgKyAweGUzKQorI2RlZmluZSBQX0RFTVVYX0FVRElPX1NUQU1QX1NZTkNfMF8zICAgICAgICAgICAgXAorCUNCVVNfUkVHX0FERFIoREVNVVhfQVVESU9fU1RBTVBfU1lOQ18wXzMpCisjZGVmaW5lIERFTVVYX0FVRElPX1NUQU1QX1NZTkNfMSAoU1RCX0NCVVNfQkFTRSArIDB4NDQpCisjZGVmaW5lIFBfREVNVVhfQVVESU9fU1RBTVBfU1lOQ18xICAgICAgICAgICAgICBcCisJQ0JVU19SRUdfQUREUihERU1VWF9BVURJT19TVEFNUF9TWU5DXzEpCisjZGVmaW5lIERFTVVYX0FVRElPX1NUQU1QX1NZTkNfMV8yIChTVEJfQ0JVU19CQVNFICsgMHg5NCkKKyNkZWZpbmUgUF9ERU1VWF9BVURJT19TVEFNUF9TWU5DXzFfMiAgICAgICAgICAgIFwKKwlDQlVTX1JFR19BRERSKERFTVVYX0FVRElPX1NUQU1QX1NZTkNfMV8yKQorI2RlZmluZSBERU1VWF9BVURJT19TVEFNUF9TWU5DXzFfMyAoU1RCX0NCVVNfQkFTRSArIDB4ZTQpCisjZGVmaW5lIFBfREVNVVhfQVVESU9fU1RBTVBfU1lOQ18xXzMgICAgICAgICAgICBcCisJQ0JVU19SRUdfQUREUihERU1VWF9BVURJT19TVEFNUF9TWU5DXzFfMykKKyNkZWZpbmUgREVNVVhfU0VDVElPTl9SRVNFVCAoU1RCX0NCVVNfQkFTRSArIDB4NDUpCisjZGVmaW5lIFBfREVNVVhfU0VDVElPTl9SRVNFVCAgICAgICAgICAgQ0JVU19SRUdfQUREUihERU1VWF9TRUNUSU9OX1JFU0VUKQorI2RlZmluZSBERU1VWF9TRUNUSU9OX1JFU0VUXzIgKFNUQl9DQlVTX0JBU0UgKyAweDk1KQorI2RlZmluZSBQX0RFTVVYX1NFQ1RJT05fUkVTRVRfMiAgICAgICAgICAgICAgICAgXAorCUNCVVNfUkVHX0FERFIoREVNVVhfU0VDVElPTl9SRVNFVF8yKQorI2RlZmluZSBERU1VWF9TRUNUSU9OX1JFU0VUXzMgKFNUQl9DQlVTX0JBU0UgKyAweGU1KQorI2RlZmluZSBQX0RFTVVYX1NFQ1RJT05fUkVTRVRfMyAgICAgICAgICAgICAgICAgXAorCUNCVVNfUkVHX0FERFIoREVNVVhfU0VDVElPTl9SRVNFVF8zKQorLypubyB1c2UgZW5kKi8KKworLypmcm9tIGNfc3RiX2RlZmluZS5oKi8KKyNkZWZpbmUgQ09NTV9ERVNDXzJfQ1RMICAgICAoU1RCX0NCVVNfQkFTRSArIDB4ZmYpIC8qMHgxNmZmKi8KKworI2RlZmluZSBTVEJfT01fQ1RMIFwKKwkoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHgyMikgLyogMHgxNjIyKi8KKyNkZWZpbmUgU1RCX09NX0NUTF8yIFwKKwkoU1RCX0NCVVNfQkFTRSArIERFTVVYXzJfT0ZGU0VUICsgMHgyMikgLyogMHgxNjcyKi8KKyNkZWZpbmUgU1RCX09NX0NUTF8zIFwKKwkoU1RCX0NCVVNfQkFTRSArIERFTVVYXzNfT0ZGU0VUICsgMHgyMikgLyogMHgxNmMyKi8KKworI2RlZmluZSBERU1VWF9JTlBVVF9USU1FT1VUX0MgICBcCisJKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4NDYpICAgICAgICAgLyogMHgxNjQ2Ki8KKyNkZWZpbmUgREVNVVhfSU5QVVRfVElNRU9VVF9DXzIgXAorCShTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDQ2KSAgICAgICAgIC8qIDB4MTY5NiovCisjZGVmaW5lIERFTVVYX0lOUFVUX1RJTUVPVVRfQ18zIFwKKwkoU1RCX0NCVVNfQkFTRSArIERFTVVYXzNfT0ZGU0VUICsgMHg0NikgICAgICAgICAvKiAweDE2ZTYqLworLyogYml0WzMxXSAtIG5vX21hdGNoX3Jlc2V0X3RpbWVvdXRfZGlzYWJsZSovCisvKiBiaXRbMzA6MF0gaW5wdXRfdGltZV9vdXRfaW50X2NudCAoMCAtLSBtZWFucyBkaXNhYmxlKSBXci1zZXR0aW5nLCBSZC1jb3VudCovCisjZGVmaW5lIERFTVVYX0lOUFVUX1RJTUVPVVQgICAgIFwKKwkoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHg0NykgICAgICAgICAvKiAweDE2NDcqLworI2RlZmluZSBERU1VWF9JTlBVVF9USU1FT1VUXzIgICBcCisJKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4NDcpICAgICAgICAgLyogMHgxNjk3Ki8KKyNkZWZpbmUgREVNVVhfSU5QVVRfVElNRU9VVF8zICAgXAorCShTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDQ3KSAgICAgICAgIC8qIDB4MTZlNyovCisKKy8qIGJpdFszMTowXSAtIGNoYW5uZWxfcGFja2V0X2NvdW50X2Rpc2FibGUqLworI2RlZmluZSBERU1VWF9QQUNLRVRfQ09VTlRfQyAgICBcCisJKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4NDgpICAgICAgICAgLyogMHgxNjQ4Ki8KKyNkZWZpbmUgREVNVVhfUEFDS0VUX0NPVU5UX0NfMiAgXAorCShTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDQ4KSAgICAgICAgIC8qIDB4MTY5OCovCisjZGVmaW5lIERFTVVYX1BBQ0tFVF9DT1VOVF9DXzMgIFwKKwkoU1RCX0NCVVNfQkFTRSArIERFTVVYXzNfT0ZGU0VUICsgMHg0OCkgICAgICAgICAvKiAweDE2ZTgqLworLyogYml0WzMxXSAtIG5vX21hdGNoX3BhY2tldF9jb3VudF9kaXNhYmxlKi8KKy8qIGJpdFszMDowXSBpbnB1dF9wYWNrZXRfY291bnQqLworI2RlZmluZSBERU1VWF9QQUNLRVRfQ09VTlQgICAgICBcCisJKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4NDkpICAgICAgICAgLyogMHgxNjQ5Ki8KKyNkZWZpbmUgREVNVVhfUEFDS0VUX0NPVU5UXzIgICAgXAorCShTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDQ5KSAgICAgICAgIC8qIDB4MTY5OSovCisjZGVmaW5lIERFTVVYX1BBQ0tFVF9DT1VOVF8zICAgIFwKKwkoU1RCX0NCVVNfQkFTRSArIERFTVVYXzNfT0ZGU0VUICsgMHg0OSkgICAgICAgICAvKiAweDE2ZTkqLworCisvKiBiaXRbMzE6MF0gY2hhbm5lbF9yZWNvcmRfZW5hYmxlKi8KKyNkZWZpbmUgREVNVVhfQ0hBTl9SRUNPUkRfRU4gICAgXAorCShTVEJfQ0JVU19CQVNFICsgREVNVVhfMV9PRkZTRVQgKyAweDRhKSAgICAgICAgIC8qIDB4MTY0YSovCisjZGVmaW5lIERFTVVYX0NIQU5fUkVDT1JEX0VOXzIgIFwKKwkoU1RCX0NCVVNfQkFTRSArIERFTVVYXzJfT0ZGU0VUICsgMHg0YSkgICAgICAgICAvKiAweDE2OWEqLworI2RlZmluZSBERU1VWF9DSEFOX1JFQ09SRF9FTl8zICBcCisJKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8zX09GRlNFVCArIDB4NGEpICAgICAgICAgLyogMHgxNmVhKi8KKworLyogYml0WzMxOjBdIGNoYW5uZWxfcHJvY2Vzc19lbmFibGUqLworI2RlZmluZSBERU1VWF9DSEFOX1BST0NFU1NfRU4gICBcCisJKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4NGIpICAgICAgICAgLyogMHgxNjRiKi8KKyNkZWZpbmUgREVNVVhfQ0hBTl9QUk9DRVNTX0VOXzIgXAorCShTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDRiKSAgICAgICAgIC8qIDB4MTY5YiovCisjZGVmaW5lIERFTVVYX0NIQU5fUFJPQ0VTU19FTl8zIFwKKwkoU1RCX0NCVVNfQkFTRSArIERFTVVYXzNfT0ZGU0VUICsgMHg0YikgICAgICAgICAvKiAweDE2ZWIqLworCisvKiBiaXRbMzE6MjRdIHNtYWxsX3NlY19zaXplICgobisxKSAqIDI1NiBCeXRlcykqLworLyogYml0WzIzOjE2XSBzbWFsbF9zZWNfcmRfcHRyICovCisvKiBiaXRbMTU6OF0gIHNtYWxsX3NlY193cl9wdHIgKi8KKy8qIGJpdFs3OjJdICAgcmVzZXJ2ZWQqLworLyogYml0WzFdIHNtYWxsX3NlY193cl9wdHJfd3JfZW5hYmxlKi8KKy8qIGJpdFswXSBzbWFsbF9zZWN0aW9uX2VuYWJsZSovCisjZGVmaW5lIERFTVVYX1NNQUxMX1NFQ19DVEwgICAgIFwKKwkoU1RCX0NCVVNfQkFTRSArIERFTVVYXzFfT0ZGU0VUICsgMHg0YykgICAgICAgICAvKiAweDE2NGMqLworI2RlZmluZSBERU1VWF9TTUFMTF9TRUNfQ1RMXzIgICBcCisJKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8yX09GRlNFVCArIDB4NGMpICAgICAgICAgLyogMHgxNjljKi8KKyNkZWZpbmUgREVNVVhfU01BTExfU0VDX0NUTF8zICAgXAorCShTVEJfQ0JVU19CQVNFICsgREVNVVhfM19PRkZTRVQgKyAweDRjKSAgICAgICAgIC8qIDB4MTZlYyovCisvKiBiaXRbMzE6MF0gc21hbGxfc2VjX3N0YXJ0X2FkZHIqLworI2RlZmluZSBERU1VWF9TTUFMTF9TRUNfQUREUiAgICBcCisJKFNUQl9DQlVTX0JBU0UgKyBERU1VWF8xX09GRlNFVCArIDB4NGQpICAgICAgICAgLyogMHgxNjRkKi8KKyNkZWZpbmUgREVNVVhfU01BTExfU0VDX0FERFJfMiAgXAorCShTVEJfQ0JVU19CQVNFICsgREVNVVhfMl9PRkZTRVQgKyAweDRkKSAgICAgICAgIC8qIDB4MTY5ZCovCisjZGVmaW5lIERFTVVYX1NNQUxMX1NFQ19BRERSXzMgIFwKKwkoU1RCX0NCVVNfQkFTRSArIERFTVVYXzNfT0ZGU0VUICsgMHg0ZCkgICAgICAgICAvKiAweDE2ZWQqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9wc3BhcnNlci5jIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL3BzcGFyc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBjMWQxYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9wc3BhcnNlci5jCkBAIC0wLDAgKzEsMTE5OSBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9tZWRpYS9zdHJlYW1faW5wdXQvcGFyc2VyL3BzcGFyc2VyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvZnJhbWVfc3luYy9wdHNzZXJ2Lmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS91dGlscy9hbXN0cmVhbS5oPgorCisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorLyogI2luY2x1ZGUgPG1hY2gvYW1fcmVncy5oPiAqLworI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmRlY19yZWcuaD4KKyNpbmNsdWRlICIuLi9hbXBvcnRzL3N0cmVhbWJ1Zl9yZWcuaCIKKyNpbmNsdWRlICIuLi9hbXBvcnRzL3N0cmVhbWJ1Zi5oIgorI2luY2x1ZGUgInBzcGFyc2VyLmgiCisjaW5jbHVkZSAiLi4vYW1wb3J0cy9hbXBvcnRzX3ByaXYuaCIKKworCisjZGVmaW5lIFRJTUVTVEFNUF9JT05MWSAxCisjZGVmaW5lIFNBVkVfU0NSIDAKKworI2RlZmluZSBNUEVHX1NUQVJUX0NPREVfUEFUVEVSTiAoMHgwMDAwMDEwMEwpCisjZGVmaW5lIE1QRUdfU1RBUlRfQ09ERV9NQVNLICAgICgweGZmZmZmZjAwTCkKKyNkZWZpbmUgTUFYX01QR19BVURJT1BLX1NJWkUgICAgIDB4MTAwMAorCisjZGVmaW5lIFNVQl9JTlNFUlRfU1RBUlRfQ09ERV9ISUdIICAgMHg0MTRkNGM1NQorI2RlZmluZSBTVUJfSU5TRVJUX1NUQVJUX0NPREVfTE9XICAgIDB4YWEwMDAwMDAKKworI2RlZmluZSBQQVJTRVJfV1JJVEUgICAgICAgIChFU19XUklURSB8IEVTX1BBUlNFUl9TVEFSVCkKKyNkZWZpbmUgUEFSU0VSX1ZJREVPICAgICAgICAoRVNfVFlQRV9WSURFTykKKyNkZWZpbmUgUEFSU0VSX0FVRElPICAgICAgICAoRVNfVFlQRV9BVURJTykKKyNkZWZpbmUgUEFSU0VSX1NVQlBJQyAgICAgICAoRVNfVFlQRV9TVUJUSVRMRSkKKyNkZWZpbmUgUEFSU0VSX1BBU1NUSFJPVUdIICAoRVNfUEFTU1RIUk9VR0ggfCBFU19QQVJTRVJfU1RBUlQpCisjZGVmaW5lIFBBUlNFUl9BVVRPU0VBUkNIICAgKEVTX1NFQVJDSCB8IEVTX1BBUlNFUl9TVEFSVCkKKyNkZWZpbmUgUEFSU0VSX0RJU0NBUkQgICAgICAoRVNfRElTQ0FSRCB8IEVTX1BBUlNFUl9TVEFSVCkKKyNkZWZpbmUgUEFSU0VSX0JVU1kgICAgICAgICAoRVNfUEFSU0VSX0JVU1kpCisKKyNkZWZpbmUgUEFSU0VSX1BBUkFNRVRFUl9MRU5HVEhfQklUICAgICAxNgorI2RlZmluZSBQQVJTRVJfUEFSQU1FVEVSX0xPT1BfQklUICAgICAgIDI0CisKKyNkZWZpbmUgUEFSU0VSX1BPUCAgICAgIFJFQURfUEFSU0VSX1JFRyhQRklGT19EQVRBKQorI2RlZmluZSBTRVRfQkxPQ0soc2l6ZSkgXAorV1JJVEVfUEFSU0VSX1JFR19CSVRTKFBBUlNFUl9DT05UUk9MLCBzaXplLCBFU19QQUNLX1NJWkVfQklULCBFU19QQUNLX1NJWkVfV0lEKQorI2RlZmluZSBTRVRfRElTQ0FSRF9TSVpFKHNpemUpIFdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX1BBUkFNRVRFUiwgc2l6ZSkKKworI2RlZmluZSBWSURFT19BVVRPX0ZMVVNICisjaWZkZWYgVklERU9fQVVUT19GTFVTSAorc3RhdGljIHUzMiB2aWRlb19hdXRvX2ZsdXNoX3N0YXRlOworI2RlZmluZSBWSURFT19BVVRPX0ZMVVNIX0lETEUgICAgICAgICAgMAorI2RlZmluZSBWSURFT19BVVRPX0ZMVVNIX01PTklUT1IgICAgICAgMQorI2RlZmluZSBWSURFT19BVVRPX0ZMVVNIX1RSSUdHRVIgICAgICAgMgorI2RlZmluZSBWSURFT19BVVRPX0ZMVVNIX0RPTkUgICAgICAgICAgMworI2RlZmluZSBWSURFT19BVVRPX0ZMVVNIX1BUU19USFJFU0hPTEQgOTAwMDAKKyNkZWZpbmUgVklERU9fQVVUT19GTFVTSF9CWVRFX0NPVU5UICAgIDEwMjQKKworc3RhdGljIHMzMiBhdWRpb19sYXN0X3B0czsKK3N0YXRpYyBzMzIgYXVkaW9fbW9uaXRvcl9wdHM7CisjZW5kaWYKKworZW51bSB7CisJU0VBUkNIX1NUQVJUX0NPREUgPSAwLAorCVNFTkRfVklERU9fU0VBUkNILAorCVNFTkRfQVVESU9fU0VBUkNILAorCVNFTkRfU1VCUElDX1NFQVJDSCwKKwlESVNDQVJEX1NFQVJDSCwKKwlESVNDQVJEX09OTFkKKyNpZmRlZiBWSURFT19BVVRPX0ZMVVNICisJLAorCVNFQVJDSF9TVEFSVF9DT0RFX1ZJREVPX0ZMVVNICisjZW5kaWYKK307CisKK2VudW0geworCUFVRElPX0ZJUlNUX0FDQ0VTU19BUk0gPSAwLAorCUFVRElPX0ZJUlNUX0FDQ0VTU19QT1BJTkcsCisJQVVESU9fRklSU1RfQUNDRVNTX0RPTkUKK307CisKK3N0YXRpYyBjb25zdCBjaGFyIHBzcGFyc2VyX2lkW10gPSAicHNwYXJzZXItaWQiOworCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQod3EpOworCitzdGF0aWMgc3RydWN0IHRhc2tsZXRfc3RydWN0IHBzcGFyc2VyX3Rhc2tsZXQ7CitzdGF0aWMgdTMyIGZldGNoX2RvbmU7CitzdGF0aWMgdTggYXVkaW9faWQsIHZpZGVvX2lkLCBzdWJfaWQsIHN1Yl9pZF9tYXg7CitzdGF0aWMgdTMyIGF1ZGlvX2ZpcnN0X2FjY2VzczsKK3N0YXRpYyB1MzIgcGFja2V0X3JlbWFpbmluZzsKK3N0YXRpYyB1MzIgdmlkZW9fZGF0YV9wYXJzZWQ7CitzdGF0aWMgdTMyIGF1ZGlvX2RhdGFfcGFyc2VkOworc3RhdGljIHUzMiBwdHNfZXF1X2R0c19mbGFnOworCitzdGF0aWMgdW5zaWduZWQgaW50IGZpcnN0X2FwdHMsIGZpcnN0X3ZwdHM7CitzdGF0aWMgdW5zaWduZWQgaW50IGF1ZGlvX2dvdF9maXJzdF9wdHMsIHZpZGVvX2dvdF9maXJzdF9kdHMsIHN1Yl9nb3RfZmlyc3RfcHRzOworYXRvbWljX3Qgc3ViX2Jsb2NrX2ZvdW5kID0gQVRPTUlDX0lOSVQoMCk7CisKKyNkZWZpbmUgREVCVUdfVk9CX1NVQgorI2lmZGVmIERFQlVHX1ZPQl9TVUIKK3N0YXRpYyB1OCBzdWJfZm91bmRfbnVtOworc3RhdGljIHN0cnVjdCBzdWJ0aXRsZV9pbmZvICpzdWJfaW5mb1tNQVhfU1VCX05VTV07CisjZW5kaWYKKworc3RhdGljIGJvb2wgcHRzbWdyX2ZpcnN0X3ZwdHNfcmVhZHkodm9pZCkKK3sKKwlyZXR1cm4gKHZpZGVvX2dvdF9maXJzdF9kdHMgIT0gMCkgPyB0cnVlIDogZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHB0c21ncl9maXJzdF9hcHRzX3JlYWR5KHZvaWQpCit7CisJcmV0dXJuIChhdWRpb19nb3RfZmlyc3RfcHRzICE9IDApID8gdHJ1ZSA6IGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBwdHNtZ3JfdnB0c19jaGVja2luKHUzMiBwdHMpCit7CisJaWYgKHZpZGVvX2dvdF9maXJzdF9kdHMgPT0gMCkgeworCQl2aWRlb19nb3RfZmlyc3RfZHRzID0gMTsKKwkJZmlyc3RfdnB0cyA9IHB0czsKKwl9CisKKwlwdHNfY2hlY2tpbl9vZmZzZXQoUFRTX1RZUEVfVklERU8sIHZpZGVvX2RhdGFfcGFyc2VkLCBwdHMpOworfQorCitzdGF0aWMgdm9pZCBwdHNtZ3JfYXB0c19jaGVja2luKHUzMiBwdHMpCit7CisJaWYgKGF1ZGlvX2dvdF9maXJzdF9wdHMgPT0gMCkgeworCQlhdWRpb19nb3RfZmlyc3RfcHRzID0gMTsKKwkJZmlyc3RfYXB0cyA9IHB0czsKKwl9CisJLyogYXB0c19jaGVja2luKHB0cyk7ICovCisJcHRzX2NoZWNraW5fb2Zmc2V0KFBUU19UWVBFX0FVRElPLCBhdWRpb19kYXRhX3BhcnNlZCwgcHRzKTsKKworI2lmZGVmIFZJREVPX0FVVE9fRkxVU0gKKwlhdWRpb19sYXN0X3B0cyA9IHB0czsKKworCWlmICgodmlkZW9fYXV0b19mbHVzaF9zdGF0ZSA9PSBWSURFT19BVVRPX0ZMVVNIX0lETEUpCisJCSYmIHB0c21ncl9maXJzdF92cHRzX3JlYWR5KCkpIHsKKwkJdmlkZW9fYXV0b19mbHVzaF9zdGF0ZSA9IFZJREVPX0FVVE9fRkxVU0hfTU9OSVRPUjsKKwkJYXVkaW9fbW9uaXRvcl9wdHMgPSBwdHM7CisJfQorCisJaWYgKHZpZGVvX2F1dG9fZmx1c2hfc3RhdGUgPT0gVklERU9fQVVUT19GTFVTSF9NT05JVE9SKSB7CisJCWlmICgoYXVkaW9fbGFzdF9wdHMgLSBhdWRpb19tb25pdG9yX3B0cykgPgorCQkJVklERU9fQVVUT19GTFVTSF9QVFNfVEhSRVNIT0xEKQorCQkJdmlkZW9fYXV0b19mbHVzaF9zdGF0ZSA9IFZJREVPX0FVVE9fRkxVU0hfVFJJR0dFUjsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIHUzMiBwYXJzZXJfcHJvY2VzcyhzMzIgdHlwZSwgczMyIHBhY2tldF9sZW4pCit7CisJczE2IHRlbXAsIGhlYWRlcl9sZW4sIG1pc2NfZmxhZ3MsIGk7CisJdTMyIHB0cyA9IDAsIGR0cyA9IDA7CisJdTMyIHB0c19kdHNfZmxhZyA9IDA7CisJdTE2IGludmFsaWRfcHRzID0gMDsKKworCXRlbXAgPSBQQVJTRVJfUE9QOworCXBhY2tldF9sZW4tLTsKKworCWlmICgodGVtcCA+PiA2KSA9PSAweDAyKSB7CisJCS8qIG1wZWctMiBzeXN0ZW0gKi8KKwkJbWlzY19mbGFncyA9IFBBUlNFUl9QT1A7CisJCWhlYWRlcl9sZW4gPSBQQVJTRVJfUE9QOworCQlwYWNrZXRfbGVuIC09IDI7CisJCXBhY2tldF9sZW4gLT0gaGVhZGVyX2xlbjsKKworCQlpZiAoKG1pc2NfZmxhZ3MgPj4gNikgPiAxKSB7CisJCQkvKiBQVFMgZXhpc3QgKi8KKwkJCXB0cyA9ICgoUEFSU0VSX1BPUCA+PiAxKSAmIDcpIDw8IDMwOwkvKiBiaXQgMzItMzAgKi8KKwkJCXB0cyB8PSBQQVJTRVJfUE9QIDw8IDIyOwkvKiBiaXQgMjktMjIgKi8KKwkJCXB0cyB8PSAoUEFSU0VSX1BPUCA+PiAxKSA8PCAxNTsJLyogYml0IDIxLTE1ICovCisJCQlwdHMgfD0gKFBBUlNFUl9QT1AgPDwgNyk7CS8qIGJpdCAxNC0wNyAqLworCQkJcHRzIHw9IChQQVJTRVJfUE9QID4+IDEpOwkvKiBiaXQgMDYtMDAgKi8KKwkJCWhlYWRlcl9sZW4gLT0gNTsKKwkJCXB0c19kdHNfZmxhZyB8PSAyOworCQl9CisKKwkJaWYgKChtaXNjX2ZsYWdzID4+IDYpID4gMikgeworCQkJLyogRFRTIGV4aXN0ICovCisJCQlkdHMgPSAoKFBBUlNFUl9QT1AgPj4gMSkgJiA3KSA8PCAzMDsJLyogYml0IDMyLTMwICovCisJCQlkdHMgfD0gUEFSU0VSX1BPUCA8PCAyMjsJLyogYml0IDI5LTIyICovCisJCQlkdHMgfD0gKFBBUlNFUl9QT1AgPj4gMSkgPDwgMTU7CS8qIGJpdCAyMS0xNSAqLworCQkJZHRzIHw9IChQQVJTRVJfUE9QIDw8IDcpOwkvKiBiaXQgMTQtMDcgKi8KKwkJCWR0cyB8PSAoUEFSU0VSX1BPUCA+PiAxKTsJLyogYml0IDA2LTAwICovCisJCQloZWFkZXJfbGVuIC09IDU7CisJCQlwdHNfZHRzX2ZsYWcgfD0gMTsKKwkJfQorCisJCWlmIChtaXNjX2ZsYWdzICYgMHgyMCkgeworCQkJLyogRVNDUl9mbGFnICovCisJCQlQQVJTRVJfUE9QOworCQkJUEFSU0VSX1BPUDsKKwkJCVBBUlNFUl9QT1A7CisJCQlQQVJTRVJfUE9QOworCQkJUEFSU0VSX1BPUDsKKwkJCVBBUlNFUl9QT1A7CisJCQloZWFkZXJfbGVuIC09IDU7CisJCX0KKworCQlpZiAobWlzY19mbGFncyAmIDB4MTApIHsKKwkJCS8qIEVTX3JhdGVfZmxhZyAqLworCQkJUEFSU0VSX1BPUDsKKwkJCVBBUlNFUl9QT1A7CisJCQlQQVJTRVJfUE9QOworCQkJaGVhZGVyX2xlbiAtPSAzOworCQl9CisKKwkJaWYgKG1pc2NfZmxhZ3MgJiAweDA4KSB7CisJCQkvKiBEU01fdHJpY2tfbW9kZV9mbGFnICovCisJCQlQQVJTRVJfUE9QOworCQkJaGVhZGVyX2xlbiAtPSAxOworCQl9CisKKwkJaWYgKG1pc2NfZmxhZ3MgJiAweDA0KSB7CisJCQkvKiBhZGRpdGlvbmFsX2NvcHlfaW5mb19mbGFnICovCisJCQlQQVJTRVJfUE9QOworCQkJaGVhZGVyX2xlbiAtPSAxOworCQl9CisKKwkJaWYgKG1pc2NfZmxhZ3MgJiAweDAyKSB7CisJCQkvKiBQRVNfQ1JDX2ZsYWcgKi8KKwkJCVBBUlNFUl9QT1A7CisJCQlQQVJTRVJfUE9QOworCQkJaGVhZGVyX2xlbiAtPSAyOworCQl9CisKKwkJaWYgKG1pc2NfZmxhZ3MgJiAweDAxKSB7CisJCQkvKiBQRVNfZXh0ZW5zaW9uX2ZsYWcgKi8KKwkJCW1pc2NfZmxhZ3MgPSBQQVJTRVJfUE9QOworCQkJaGVhZGVyX2xlbi0tOworCisJCQlpZiAoKG1pc2NfZmxhZ3MgJiAweDgwKSAmJiAoaGVhZGVyX2xlbiA+PSAxMjgpKSB7CisJCQkJLyogUEVTX3ByaXZhdGVfZGF0YV9mbGFnICovCisJCQkJZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorCQkJCQlQQVJTRVJfUE9QOworCisJCQkJaGVhZGVyX2xlbiAtPSAxMjg7CisJCQl9CisjaWYgMAorCQkJaWYgKG1pc2NfZmxhZ3MgJiAweDQwKSB7CisJCQkJLyogcGFja19oZWFkZXJfZmllbGRfZmxhZyAqLworCQkJCS8qIEludmFsaWQgY2FzZSAqLworCQkJfQorI2VuZGlmCisJCQlpZiAobWlzY19mbGFncyAmIDB4MjApIHsKKwkJCQkvKiBwcm9ncmFtX3BhY2tldF9zZXF1ZW5jZV9jb3VudGVyX2ZsYWcgKi8KKwkJCQlQQVJTRVJfUE9QOworCQkJCVBBUlNFUl9QT1A7CisJCQkJaGVhZGVyX2xlbiAtPSAyOworCQkJfQorCisJCQlpZiAobWlzY19mbGFncyAmIDB4MTApIHsKKwkJCQkvKiBQU1REX2J1ZmZlcl9mbGFnICovCisJCQkJUEFSU0VSX1BPUDsKKwkJCQlQQVJTRVJfUE9QOworCQkJCWhlYWRlcl9sZW4gLT0gMjsKKwkJCX0KKworCQkJaWYgKG1pc2NfZmxhZ3MgJiAxKSB7CisJCQkJLyogUEVTX2V4dGVuc2lvbl9mbGFnXzIgKi8KKwkJCQl0ZW1wID0gUEFSU0VSX1BPUCAmIDB4N2Y7CisKKwkJCQl3aGlsZSAodGVtcCkgeworCQkJCQlQQVJTRVJfUE9QOworCQkJCQl0ZW1wLS07CisJCQkJCWhlYWRlcl9sZW4tLTsKKwkJCQl9CisJCQl9CisKKwkJCXdoaWxlIChoZWFkZXJfbGVuKSB7CisJCQkJUEFSU0VSX1BPUDsKKwkJCQloZWFkZXJfbGVuLS07CisJCQl9CisJCX0KKworCQl3aGlsZSAoaGVhZGVyX2xlbikgeworCQkJUEFSU0VSX1BPUDsKKwkJCWhlYWRlcl9sZW4tLTsKKwkJfQorCisJfSBlbHNlIHsKKwkJLyogbXBlZy0xIHN5c3RlbSAqLworCQl3aGlsZSAodGVtcCA9PSAweGZmKSB7CisJCQl0ZW1wID0gUEFSU0VSX1BPUDsKKwkJCXBhY2tldF9sZW4tLTsKKwkJfQorCisJCWlmICgodGVtcCA+PiA2KSA9PSAxKSB7CisJCQlQQVJTRVJfUE9QOwkvKiBTVEQgYnVmZmVyIHNpemUgKi8KKwkJCXRlbXAgPSBQQVJTRVJfUE9QOworCQkJcGFja2V0X2xlbiAtPSAyOworCQl9CisKKwkJaWYgKCgodGVtcCA+PiA0KSA9PSAyKSB8fCAoKHRlbXAgPj4gNCkgPT0gMykpIHsKKwkJCXB0cyA9ICgodGVtcCA+PiAxKSAmIDcpIDw8IDMwOwkvKiBiaXQgMzItMzAgKi8KKwkJCXB0cyB8PSBQQVJTRVJfUE9QIDw8IDIyOwkvKiBiaXQgMjktMjIgKi8KKwkJCXB0cyB8PSAoUEFSU0VSX1BPUCA+PiAxKSA8PCAxNTsJLyogYml0IDIxLTE1ICovCisJCQlwdHMgfD0gKFBBUlNFUl9QT1AgPDwgNyk7CS8qIGJpdCAxNC0wNyAqLworCQkJcHRzIHw9IChQQVJTRVJfUE9QID4+IDEpOwkvKiBiaXQgMDYtMDAgKi8KKwkJCXBhY2tldF9sZW4gLT0gNDsKKwkJCXB0c19kdHNfZmxhZyB8PSAyOworCQl9CisKKwkJaWYgKCh0ZW1wID4+IDQpID09IDMpIHsKKwkJCWR0cyA9ICgoUEFSU0VSX1BPUCA+PiAxKSAmIDcpIDw8IDMwOwkvKiBiaXQgMzItMzAgKi8KKwkJCWR0cyB8PSBQQVJTRVJfUE9QIDw8IDIyOwkvKiBiaXQgMjktMjIgKi8KKwkJCWR0cyB8PSAoUEFSU0VSX1BPUCA+PiAxKSA8PCAxNTsJLyogYml0IDIxLTE1ICovCisJCQlkdHMgfD0gKFBBUlNFUl9QT1AgPDwgNyk7CS8qIGJpdCAxNC0wNyAqLworCQkJZHRzIHw9IChQQVJTRVJfUE9QID4+IDEpOwkvKiBiaXQgMDYtMDAgKi8KKwkJCXBhY2tldF9sZW4gLT0gNTsKKwkJCXB0c19kdHNfZmxhZyB8PSAxOworCQl9CisJfQorCisJaWYgKChwdHMgPT0gMCkgJiYgKGR0cyA9PSAweGZmZmZmZmZmKSkgeworCQlpbnZhbGlkX3B0cyA9IDE7CisJCXByX2luZm8oImludmFsaWQgcHRzXG4iKTsKKwl9CisKKwlpZiAoIXBhY2tldF9sZW4pCisJCXJldHVybiBTRUFSQ0hfU1RBUlRfQ09ERTsKKworCWVsc2UgaWYgKHR5cGUgPT0gMCkgeworI2lmZGVmIFZJREVPX0FVVE9fRkxVU0gKKwkJaWYgKHZpZGVvX2F1dG9fZmx1c2hfc3RhdGUgPT0gVklERU9fQVVUT19GTFVTSF9NT05JVE9SKQorCQkJYXVkaW9fbW9uaXRvcl9wdHMgPSBhdWRpb19sYXN0X3B0czsKKyNlbmRpZgorCisJCWlmICgocHRzX2R0c19mbGFnKSAmJiAoIWludmFsaWRfcHRzKSkgeworI2lmIFRJTUVTVEFNUF9JT05MWQorCQkJaWYgKCFwdHNtZ3JfZmlyc3RfdnB0c19yZWFkeSgpKSB7CisJCQkJaWYgKHB0c19kdHNfZmxhZyAmIDIpCisJCQkJCXB0c21ncl92cHRzX2NoZWNraW4ocHRzKTsKKwkJCQllbHNlCisJCQkJCXB0c21ncl92cHRzX2NoZWNraW4oZHRzKTsKKwkJCX0gZWxzZSBpZiAoKHB0c19kdHNfZmxhZyAmIDMpID09IDMpIHsKKwkJCQlpZiAocHRzX2VxdV9kdHNfZmxhZykgeworCQkJCQlpZiAoZHRzID09IHB0cykKKwkJCQkJCXB0c21ncl92cHRzX2NoZWNraW4ocHRzKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoZHRzID09IHB0cykKKwkJCQkJCXB0c19lcXVfZHRzX2ZsYWcgPSAxOworCQkJCQlwdHNtZ3JfdnB0c19jaGVja2luKHB0cyk7CisJCQkJfQorCQkJfQorI2Vsc2UKKwkJCWlmICghcHRzbWdyX2ZpcnN0X3ZwdHNfcmVhZHkoKSkgeworCQkJCWlmIChwdHNfZHRzX2ZsYWcgJiAyKQorCQkJCQlwdHNtZ3JfdnB0c19jaGVja2luKHB0cyk7CisJCQkJZWxzZQorCQkJCQlwdHNtZ3JfdnB0c19jaGVja2luKGR0cyk7CisJCQl9IGVsc2UgaWYgKHB0c19kdHNfZmxhZyAmIDIpCisJCQkJcHRzbWdyX3ZwdHNfY2hlY2tpbihwdHMpOworI2VuZGlmCisJCX0KKworCQlpZiAocHRzbWdyX2ZpcnN0X3ZwdHNfcmVhZHkoKSB8fCBpbnZhbGlkX3B0cykgeworCQkJU0VUX0JMT0NLKHBhY2tldF9sZW4pOworCQkJdmlkZW9fZGF0YV9wYXJzZWQgKz0gcGFja2V0X2xlbjsKKwkJCXJldHVybiBTRU5EX1ZJREVPX1NFQVJDSDsKKworCQl9IGVsc2UgeworCQkJU0VUX0RJU0NBUkRfU0laRShwYWNrZXRfbGVuKTsKKwkJCXJldHVybiBESVNDQVJEX1NFQVJDSDsKKwkJfQorCisJfSBlbHNlIGlmICh0eXBlID09IDEpIHsKKwkJLyogbXBlZyBhdWRpbyAqLworCQlpZiAocHRzX2R0c19mbGFnICYgMikKKwkJCXB0c21ncl9hcHRzX2NoZWNraW4ocHRzKTsKKworCQlpZiAocHRzbWdyX2ZpcnN0X2FwdHNfcmVhZHkoKSkgeworCQkJU0VUX0JMT0NLKHBhY2tldF9sZW4pOworCQkJYXVkaW9fZGF0YV9wYXJzZWQgKz0gcGFja2V0X2xlbjsKKwkJCXJldHVybiBTRU5EX0FVRElPX1NFQVJDSDsKKworCQl9IGVsc2UgeworCQkJU0VUX0RJU0NBUkRfU0laRShwYWNrZXRfbGVuKTsKKwkJCXJldHVybiBESVNDQVJEX1NFQVJDSDsKKwkJfQorCisJfSBlbHNlIGlmICh0eXBlID09IDIpIHsKKwkJLyogUHJpdmF0ZSBzdHJlYW0gKi8KKwkJdGVtcCA9IFBBUlNFUl9QT1A7CS8qIHN1Yl9zdHJlYW1faWQgKi8KKwkJcGFja2V0X2xlbi0tOworCisJCWlmICgoKHRlbXAgJiAweGY4KSA9PSAweGEwKSAmJiAodGVtcCA9PSBhdWRpb19pZCkpIHsKKwkJCS8qIERWRF9WSURFTyBBdWRpbyBMUENNIGRhdGEgKi8KKwkJCVBBUlNFUl9QT1A7CisJCQl0ZW1wID0gKFBBUlNFUl9QT1AgPDwgOCkgfCBQQVJTRVJfUE9QOworCQkJaWYgKHRlbXAgPT0gMCkKKwkJCQl0ZW1wID0gNDsKKwkJCXRlbXAtLTsKKwkJCXBhY2tldF9sZW4gLT0gMzsKKworCQkJaWYgKGF1ZGlvX2ZpcnN0X2FjY2VzcyA9PSBBVURJT19GSVJTVF9BQ0NFU1NfQVJNKSB7CisJCQkJaWYgKHRlbXApIHsKKwkJCQkJcGFja2V0X3JlbWFpbmluZyA9IHBhY2tldF9sZW4gLSB0ZW1wOworCQkJCQlTRVRfRElTQ0FSRF9TSVpFKHRlbXApOworCQkJCQlhdWRpb19maXJzdF9hY2Nlc3MgPQorCQkJCQkJQVVESU9fRklSU1RfQUNDRVNTX1BPUElORzsKKwkJCQkJcmV0dXJuIERJU0NBUkRfT05MWTsKKwkJCQl9CisKKwkJCQlhdWRpb19maXJzdF9hY2Nlc3MgPSBBVURJT19GSVJTVF9BQ0NFU1NfRE9ORTsKKworCQkJCWlmIChwYWNrZXRfbGVuKSB7CisJCQkJCVNFVF9CTE9DSyhwYWNrZXRfbGVuKTsKKwkJCQkJYXVkaW9fZGF0YV9wYXJzZWQgKz0gcGFja2V0X2xlbjsKKwkJCQkJcmV0dXJuIFNFTkRfQVVESU9fU0VBUkNIOworCisJCQkJfSBlbHNlCisJCQkJCXJldHVybiBTRUFSQ0hfU1RBUlRfQ09ERTsKKworCQkJfSBlbHNlIHsKKwkJCQlQQVJTRVJfUE9QOworCQkJCVBBUlNFUl9QT1A7CisJCQkJUEFSU0VSX1BPUDsKKwkJCQlwYWNrZXRfbGVuIC09IDM7CisJCQl9CisKKwkJCWlmIChwdHNfZHRzX2ZsYWcgJiAyKQorCQkJCXB0c21ncl9hcHRzX2NoZWNraW4ocHRzKTsKKworCQkJaWYgKHB0c21ncl9maXJzdF9hcHRzX3JlYWR5KCkpIHsKKwkJCQlTRVRfQkxPQ0socGFja2V0X2xlbik7CisJCQkJYXVkaW9fZGF0YV9wYXJzZWQgKz0gcGFja2V0X2xlbjsKKwkJCQlyZXR1cm4gU0VORF9BVURJT19TRUFSQ0g7CisKKwkJCX0gZWxzZSB7CisJCQkJU0VUX0RJU0NBUkRfU0laRShwYWNrZXRfbGVuKTsKKwkJCQlyZXR1cm4gRElTQ0FSRF9TRUFSQ0g7CisJCQl9CisKKwkJfSBlbHNlIGlmICgoKHRlbXAgJiAweGY4KSA9PSAweDgwKSAmJiAodGVtcCA9PSBhdWRpb19pZCkpIHsKKwkJCS8qIEF1ZGlvIEFDMyBkYXRhICovCisJCQlQQVJTRVJfUE9QOworCQkJdGVtcCA9IChQQVJTRVJfUE9QIDw8IDgpIHwgUEFSU0VSX1BPUDsKKwkJCXBhY2tldF9sZW4gLT0gMzsKKworCQkJaWYgKGF1ZGlvX2ZpcnN0X2FjY2VzcyA9PSBBVURJT19GSVJTVF9BQ0NFU1NfQVJNKSB7CisJCQkJaWYgKHB0c19kdHNfZmxhZyAmIDIpCisJCQkJCXB0c21ncl9hcHRzX2NoZWNraW4ocHRzKTsKKworCQkJCWlmICgodGVtcCA+IDIpICYmIChwYWNrZXRfbGVuID4gKHRlbXAgLSAyKSkpIHsKKwkJCQkJdGVtcCAtPSAyOworCQkJCQlwYWNrZXRfcmVtYWluaW5nID0gcGFja2V0X2xlbiAtIHRlbXA7CisJCQkJCVNFVF9ESVNDQVJEX1NJWkUodGVtcCk7CisJCQkJCWF1ZGlvX2ZpcnN0X2FjY2VzcyA9CisJCQkJCQlBVURJT19GSVJTVF9BQ0NFU1NfUE9QSU5HOworCQkJCQlyZXR1cm4gRElTQ0FSRF9PTkxZOworCQkJCX0KKworCQkJCWF1ZGlvX2ZpcnN0X2FjY2VzcyA9IEFVRElPX0ZJUlNUX0FDQ0VTU19ET05FOworCisJCQkJaWYgKHBhY2tldF9sZW4pIHsKKwkJCQkJU0VUX0JMT0NLKHBhY2tldF9sZW4pOworCQkJCQlhdWRpb19kYXRhX3BhcnNlZCArPSBwYWNrZXRfbGVuOworCQkJCQlyZXR1cm4gU0VORF9BVURJT19TRUFSQ0g7CisKKwkJCQl9IGVsc2UKKwkJCQkJcmV0dXJuIFNFQVJDSF9TVEFSVF9DT0RFOworCQkJfQorCisJCQlpZiAocHRzX2R0c19mbGFnICYgMikKKwkJCQlwdHNtZ3JfYXB0c19jaGVja2luKHB0cyk7CisKKwkJCWlmIChwdHNtZ3JfZmlyc3RfYXB0c19yZWFkeSgpKSB7CisJCQkJU0VUX0JMT0NLKHBhY2tldF9sZW4pOworCQkJCWF1ZGlvX2RhdGFfcGFyc2VkICs9IHBhY2tldF9sZW47CisJCQkJcmV0dXJuIFNFTkRfQVVESU9fU0VBUkNIOworCisJCQl9IGVsc2UgeworCQkJCVNFVF9ESVNDQVJEX1NJWkUocGFja2V0X2xlbik7CisJCQkJcmV0dXJuIERJU0NBUkRfU0VBUkNIOworCQkJfQorCisJCX0gZWxzZSBpZiAoKCh0ZW1wICYgMHhmOCkgPT0gMHg4OCkgJiYgKHRlbXAgPT0gYXVkaW9faWQpKSB7CisJCQkvKiBBdWRpbyBEVFMgZGF0YSAqLworCQkJUEFSU0VSX1BPUDsKKwkJCVBBUlNFUl9QT1A7CisJCQlQQVJTRVJfUE9QOworCQkJcGFja2V0X2xlbiAtPSAzOworCisJCQlpZiAoYXVkaW9fZmlyc3RfYWNjZXNzID09IEFVRElPX0ZJUlNUX0FDQ0VTU19BUk0pCisJCQkJYXVkaW9fZmlyc3RfYWNjZXNzID0gQVVESU9fRklSU1RfQUNDRVNTX0RPTkU7CisKKwkJCWlmIChwdHNfZHRzX2ZsYWcgJiAyKQorCQkJCXB0c21ncl9hcHRzX2NoZWNraW4ocHRzKTsKKworCQkJaWYgKHB0c21ncl9maXJzdF9hcHRzX3JlYWR5KCkpIHsKKwkJCQlTRVRfQkxPQ0socGFja2V0X2xlbik7CisJCQkJYXVkaW9fZGF0YV9wYXJzZWQgKz0gcGFja2V0X2xlbjsKKwkJCQlyZXR1cm4gU0VORF9BVURJT19TRUFSQ0g7CisKKwkJCX0gZWxzZSB7CisJCQkJU0VUX0RJU0NBUkRfU0laRShwYWNrZXRfbGVuKTsKKwkJCQlyZXR1cm4gRElTQ0FSRF9TRUFSQ0g7CisJCQl9CisJCX0gZWxzZSBpZiAoKHRlbXAgJiAweGUwKSA9PSAweDIwKSB7CisJCQlpZiAodGVtcCA+IHN1Yl9pZF9tYXgpCisJCQkJc3ViX2lkX21heCA9IHRlbXA7CisjaWZkZWYgREVCVUdfVk9CX1NVQgorCQkJZm9yIChpID0gMDsgaSA8IHN1Yl9mb3VuZF9udW07IGkrKykgeworCQkJCWlmICghc3ViX2luZm9baV0pCisJCQkJCWJyZWFrOworCQkJCWlmICh0ZW1wID09IHN1Yl9pbmZvW2ldLT5pZCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaSA9PSBzdWJfZm91bmRfbnVtICYmIGkgPCBNQVhfU1VCX05VTSkgeworCQkJCWlmIChzdWJfaW5mb1tzdWJfZm91bmRfbnVtXSkgeworCQkJCQlzdWJfaW5mb1tzdWJfZm91bmRfbnVtXS0+aWQgPSB0ZW1wOworCQkJCQlzdWJfZm91bmRfbnVtKys7CisJCQkJCXByX2luZm8KKwkJCQkJKCJbJXNdZm91bmQgbmV3IHN1Yl9pZD0weCV4IChudW0gJWQpXG4iLAorCQkJCQkgX19mdW5jX18sIHRlbXAsIHN1Yl9mb3VuZF9udW0pOworCQkJCX0gZWxzZSB7CisJCQkJCXByX2luZm8KKwkJCQkJKCJbJXNdc3ViIGluZm8gTlVMTCFcbiIsIF9fZnVuY19fKTsKKwkJCQl9CisJCQl9CisjZW5kaWYKKworCQkJaWYgKHRlbXAgPT0gc3ViX2lkKSB7CisJCQkJLyogRFZEIHN1Yi1waWN0dXJlIGRhdGEgKi8KKwkJCQlpZiAoIXBhY2tldF9sZW4pCisJCQkJCXJldHVybiBTRUFSQ0hfU1RBUlRfQ09ERTsKKworCQkJCWVsc2UgeworI2lmIDAKKwkJCQkJaWYgKHB0c19kdHNfZmxhZyAmIDIpCisJCQkJCQlwdHNtZ3Jfc3B0c19jaGVja2luKHB0cyk7CisKKwkJCQkJaWYgKHB0c21ncl9maXJzdF9zcHRzX3JlYWR5KCkpIHsKKwkJCQkJCVNFVF9CTE9DSyhwYWNrZXRfbGVuKTsKKwkJCQkJCXJldHVybiBTRU5EX1NVQlBJQ19TRUFSQ0g7CisKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCVNFVF9ESVNDQVJEX1NJWkUocGFja2V0X2xlbik7CisJCQkJCQlyZXR1cm4gRElTQ0FSRF9TRUFSQ0g7CisJCQkJCX0KKyNlbHNlCisJCQkJCWlmIChwdHNfZHRzX2ZsYWcgJiAyKQorCQkJCQkJc3ViX2dvdF9maXJzdF9wdHMgPSAxOworCisJCQkJCWlmIChzdWJfZ290X2ZpcnN0X3B0cykgeworCQkJCQkJcHJfaW5mbworCQkJCQkJKCJzdWIgcHRzIDB4JXgsIGxlbiAlZFxuIiwKKwkJCQkJCSBwdHMsIHBhY2tldF9sZW4pOworCQkJCQkJU0VUX0JMT0NLKHBhY2tldF9sZW4pOworCQkJCQkJV1JJVEVfUEFSU0VSX1JFRworCQkJCQkJKFBBUlNFUl9QQVJBTUVURVIsCisJCQkJCQkgMTYgPDwKKwkJCQkJCSBQQVJTRVJfUEFSQU1FVEVSX0xFTkdUSF9CSVQpOworCQkJCQkJV1JJVEVfUEFSU0VSX1JFRworCQkJCQkJKFBBUlNFUl9JTlNFUlRfREFUQSwKKwkJCQkJCSBTVUJfSU5TRVJUX1NUQVJUX0NPREVfSElHSCk7CisJCQkJCQlXUklURV9QQVJTRVJfUkVHCisJCQkJCQkoUEFSU0VSX0lOU0VSVF9EQVRBLAorCQkJCQkJIFNVQl9JTlNFUlRfU1RBUlRfQ09ERV9MT1cgfAorCQkJCQkJIGdldF9zdWJfdHlwZSgpKTsKKwkJCQkJCVdSSVRFX1BBUlNFUl9SRUcKKwkJCQkJCShQQVJTRVJfSU5TRVJUX0RBVEEsCisJCQkJCQkgcGFja2V0X2xlbik7CisJCQkJCQlXUklURV9QQVJTRVJfUkVHCisJCQkJCQkoUEFSU0VSX0lOU0VSVF9EQVRBLCBwdHMpOworCQkJCQkJYXRvbWljX3NldCgmc3ViX2Jsb2NrX2ZvdW5kLCAxKTsKKwkJCQkJCXJldHVybiBTRU5EX1NVQlBJQ19TRUFSQ0g7CisJCQkJCX0KKworCQkJCQlTRVRfRElTQ0FSRF9TSVpFKHBhY2tldF9sZW4pOworCQkJCQlyZXR1cm4gRElTQ0FSRF9TRUFSQ0g7CisjZW5kaWYKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCVNFVF9ESVNDQVJEX1NJWkUocGFja2V0X2xlbik7CisJCQkJcmV0dXJuIERJU0NBUkRfU0VBUkNIOworCQkJfQorCQl9IGVsc2UgeworCQkJU0VUX0RJU0NBUkRfU0laRShwYWNrZXRfbGVuKTsKKwkJCXJldHVybiBESVNDQVJEX1NFQVJDSDsKKwkJfQorCX0KKworCXJldHVybiBTRUFSQ0hfU1RBUlRfQ09ERTsKK30KKworc3RhdGljIHZvaWQgb25fc3RhcnRfY29kZV9mb3VuZChpbnQgc3RhcnRfY29kZSkKK3sKKwl1bnNpZ25lZCBzaG9ydCBwYWNrZXRfbGVuOworCXVuc2lnbmVkIHNob3J0IHRlbXA7CisJdW5zaWduZWQgaW50IG5leHRfYWN0aW9uOworI2lmIFNBVkVfU0NSCisJdW5zaWduZWQgaW50IHNjcjsKKyNlbmRpZgorCisJaWYgKGF0b21pY19yZWFkKCZzdWJfYmxvY2tfZm91bmQpKSB7CisJCXdha2V1cF9zdWJfcG9sbCgpOworCQlhdG9taWNfc2V0KCZzdWJfYmxvY2tfZm91bmQsIDApOworCX0KKworCWlmIChhdWRpb19maXJzdF9hY2Nlc3MgPT0gQVVESU9fRklSU1RfQUNDRVNTX1BPUElORykgeworCQkvKgorCQkgKndlIGFyZSBpbiB0aGUgcHJvY2VkdXJlIG9mIHBvcGluZyBkYXRhIGZvciBhdWRpbyBmaXJzdAorCQkgKiBhY2Nlc3MsIGNvbnRpbnVlIHdpdGggbGFzdCBwYWNrZXQKKwkJICovCisJCWF1ZGlvX2ZpcnN0X2FjY2VzcyA9IEFVRElPX0ZJUlNUX0FDQ0VTU19ET05FOworCisJCWlmIChwYWNrZXRfcmVtYWluaW5nKSB7CisJCQluZXh0X2FjdGlvbiA9IFNFTkRfQVVESU9fU0VBUkNIOworCQkJU0VUX0JMT0NLKHBhY2tldF9yZW1haW5pbmcpOworCisJCX0gZWxzZQorCQkJbmV4dF9hY3Rpb24gPSBTRUFSQ0hfU1RBUlRfQ09ERTsKKworCX0gZWxzZSBpZiAoc3RhcnRfY29kZSA9PSAweGJhKSB7CS8qIFBBQ0tfU1RBUlRfQ09ERSAqLworCQl0ZW1wID0gUEFSU0VSX1BPUDsKKworCQlpZiAoKHRlbXAgPj4gNikgPT0gMHgwMSkgeworI2lmIFNBVkVfU0NSCisJCQlzY3IgPSAoKHRlbXAgPj4gMykgJiAweDMpIDw8IDMwOwkvKiBiaXQgMzEtMzAgKi8KKwkJCXNjciB8PSAodGVtcCAmIDB4MykgPDwgMjg7CS8qIGJpdCAyOS0yOCAqLworCQkJc2NyIHw9IChQQVJTRVJfUE9QKSA8PCAyMDsJLyogYml0IDI3LTIwICovCisJCQl0ZW1wID0gUEFSU0VSX1BPUDsKKwkJCXNjciB8PSAodGVtcCA+PiA0KSA8PCAxNjsJLyogYml0IDE5LTE2ICovCisJCQlzY3IgfD0gKHRlbXAgJiA3KSA8PCAxMzsJLyogYml0IDE1LTEzICovCisJCQlzY3IgfD0gKFBBUlNFUl9QT1ApIDw8IDU7CS8qIGJpdCAxMi0wNSAqLworCQkJc2NyIHw9IChQQVJTRVJfUE9QKSA+PiAzOwkvKiBiaXQgMDQtMDAgKi8KKyNlbHNlCisJCQlQQVJTRVJfUE9QOworCQkJUEFSU0VSX1BPUDsKKwkJCVBBUlNFUl9QT1A7CisJCQlQQVJTRVJfUE9QOworI2VuZGlmCisJCQlQQVJTRVJfUE9QOworCQkJUEFSU0VSX1BPUDsKKwkJCVBBUlNFUl9QT1A7CisJCQlQQVJTRVJfUE9QOworCQkJdGVtcCA9IFBBUlNFUl9QT1AgJiA3OworCisJCQl3aGlsZSAodGVtcCkgewkvKiBzdHVmZiBieXRlICovCisJCQkJUEFSU0VSX1BPUDsKKwkJCQl0ZW1wLS07CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCS8qIG1wZWctMSBQYWNrIEhlYWRlciAqLworI2lmIFNBVkVfU0NSCisJCQlzY3IgPSAoKHRlbXAgPj4gMSkgJiAweDMpIDw8IDMwOwkvKiBiaXQgMzEtMzAgKi8KKwkJCXNjciB8PSAoUEFSU0VSX1BPUCkgPDwgMjI7CS8qIGJpdCAyOS0yMiAqLworCQkJc2NyIHw9IChQQVJTRVJfUE9QID4+IDEpIDw8IDE1OwkvKiBiaXQgMjEtMTUgKi8KKwkJCXNjciB8PSAoUEFSU0VSX1BPUCkgPDwgNzsJLyogYml0IDE0LTA3ICovCisJCQlzY3IgfD0gKFBBUlNFUl9QT1AgPj4gMSk7CS8qIGJpdCAwNi0wMCAqLworI2Vsc2UKKwkJCVBBUlNFUl9QT1A7CisJCQlQQVJTRVJfUE9QOworCQkJUEFSU0VSX1BPUDsKKwkJCVBBUlNFUl9QT1A7CisjZW5kaWYKKwkJfQorCisjaWZkZWYgVklERU9fQVVUT19GTFVTSAorCQlpZiAodmlkZW9fYXV0b19mbHVzaF9zdGF0ZSA9PSBWSURFT19BVVRPX0ZMVVNIX1RSSUdHRVIpIHsKKwkJCW5leHRfYWN0aW9uID0gU0VBUkNIX1NUQVJUX0NPREVfVklERU9fRkxVU0g7CisJCQl2aWRlb19hdXRvX2ZsdXNoX3N0YXRlID0gVklERU9fQVVUT19GTFVTSF9ET05FOworCQl9IGVsc2UKKyNlbmRpZgorCisJCQluZXh0X2FjdGlvbiA9IFNFQVJDSF9TVEFSVF9DT0RFOworCisJfSBlbHNlIHsKKwkJcGFja2V0X2xlbiA9IChQQVJTRVJfUE9QIDw8IDgpIHwgUEFSU0VSX1BPUDsKKworCQlpZiAoc3RhcnRfY29kZSA9PSB2aWRlb19pZCkKKwkJCW5leHRfYWN0aW9uID0gcGFyc2VyX3Byb2Nlc3MoMCwgcGFja2V0X2xlbik7CisKKwkJZWxzZSBpZiAoc3RhcnRfY29kZSA9PSBhdWRpb19pZCkgeworCQkJLyogYWRkIG1wZWcgYXVkaW8gcGFja2V0IGxlbmd0aCBjaGVjayAqLworCQkJaWYgKHBhY2tldF9sZW4gPiBNQVhfTVBHX0FVRElPUEtfU0laRSkKKwkJCQluZXh0X2FjdGlvbiA9IFNFQVJDSF9TVEFSVF9DT0RFOworCisJCQllbHNlCisJCQkJbmV4dF9hY3Rpb24gPSBwYXJzZXJfcHJvY2VzcygxLCBwYWNrZXRfbGVuKTsKKworCQl9IGVsc2UgaWYgKHN0YXJ0X2NvZGUgPT0gMHhiYikgeworCQkJU0VUX0RJU0NBUkRfU0laRShwYWNrZXRfbGVuKTsKKwkJCW5leHRfYWN0aW9uID0gRElTQ0FSRF9TRUFSQ0g7CisJCX0gZWxzZSBpZiAoc3RhcnRfY29kZSA9PSAweGJkKQorCQkJbmV4dF9hY3Rpb24gPSBwYXJzZXJfcHJvY2VzcygyLCBwYWNrZXRfbGVuKTsKKworCQllbHNlIGlmIChzdGFydF9jb2RlID09IDB4YmYpIHsKKwkJCVNFVF9ESVNDQVJEX1NJWkUocGFja2V0X2xlbik7CisJCQluZXh0X2FjdGlvbiA9IERJU0NBUkRfU0VBUkNIOworCQl9IGVsc2UgaWYgKChzdGFydF9jb2RlIDwgMHhjMCkgfHwgKHN0YXJ0X2NvZGUgPiAweGM4KSkKKwkJCW5leHRfYWN0aW9uID0gU0VBUkNIX1NUQVJUX0NPREU7CisKKwkJZWxzZSBpZiAocGFja2V0X2xlbikgeworCQkJU0VUX0RJU0NBUkRfU0laRShwYWNrZXRfbGVuKTsKKwkJCW5leHRfYWN0aW9uID0gRElTQ0FSRF9TRUFSQ0g7CisKKwkJfSBlbHNlCisJCQluZXh0X2FjdGlvbiA9IFNFQVJDSF9TVEFSVF9DT0RFOworCX0KKworCXN3aXRjaCAobmV4dF9hY3Rpb24pIHsKKwljYXNlIFNFQVJDSF9TVEFSVF9DT0RFOgorCQlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9DT05UUk9MLCBQQVJTRVJfQVVUT1NFQVJDSCk7CisJCWJyZWFrOworCisJY2FzZSBTRU5EX1ZJREVPX1NFQVJDSDoKKwkJV1JJVEVfUEFSU0VSX1JFR19CSVRTKFBBUlNFUl9DT05UUk9MLAorCQkJUEFSU0VSX0FVVE9TRUFSQ0ggfCBQQVJTRVJfVklERU8gfAorCQkJUEFSU0VSX1dSSVRFLCBFU19DVFJMX0JJVCwgRVNfQ1RSTF9XSUQpOworCQlicmVhazsKKworCWNhc2UgU0VORF9BVURJT19TRUFSQ0g6CisJCVdSSVRFX1BBUlNFUl9SRUdfQklUUyhQQVJTRVJfQ09OVFJPTCwKKwkJCVBBUlNFUl9BVVRPU0VBUkNIIHwgUEFSU0VSX0FVRElPIHwKKwkJCVBBUlNFUl9XUklURSwgRVNfQ1RSTF9CSVQsIEVTX0NUUkxfV0lEKTsKKwkJYnJlYWs7CisKKwljYXNlIFNFTkRfU1VCUElDX1NFQVJDSDoKKwkJV1JJVEVfUEFSU0VSX1JFR19CSVRTKFBBUlNFUl9DT05UUk9MLAorCQkJUEFSU0VSX0FVVE9TRUFSQ0ggfCBQQVJTRVJfU1VCUElDIHwKKwkJCVBBUlNFUl9XUklURSB8IEVTX0lOU0VSVF9CRUZPUkVfRVNfV1JJVEUsCisJCQlFU19DVFJMX0JJVCwgRVNfQ1RSTF9XSUQpOworCQlicmVhazsKKworCWNhc2UgRElTQ0FSRF9TRUFSQ0g6CisJCVdSSVRFX1BBUlNFUl9SRUdfQklUUyhQQVJTRVJfQ09OVFJPTCwKKwkJCVBBUlNFUl9BVVRPU0VBUkNIIHwgUEFSU0VSX0RJU0NBUkQsCisJCQlFU19DVFJMX0JJVCwgRVNfQ1RSTF9XSUQpOworCQlicmVhazsKKworCWNhc2UgRElTQ0FSRF9PTkxZOgorCQlXUklURV9QQVJTRVJfUkVHX0JJVFMoUEFSU0VSX0NPTlRST0wsCisJCQlQQVJTRVJfRElTQ0FSRCwgRVNfQ1RSTF9CSVQsIEVTX0NUUkxfV0lEKTsKKwkJYnJlYWs7CisKKyNpZmRlZiBWSURFT19BVVRPX0ZMVVNICisJY2FzZSBTRUFSQ0hfU1RBUlRfQ09ERV9WSURFT19GTFVTSDoKKwkJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfSU5TRVJUX0RBVEEsIDB4ZmZmZmZmZmYpOworCQlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9JTlNFUlRfREFUQSwgMHhmZmZmZmZmZik7CisJCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX1BBUkFNRVRFUiwKKwkJCSgoVklERU9fQVVUT19GTFVTSF9CWVRFX0NPVU5UIC8KKwkJCSAgOCkgPDwgUEFSU0VSX1BBUkFNRVRFUl9MT09QX0JJVCkgfCAoOCA8PAorCQkJICBQQVJTRVJfUEFSQU1FVEVSX0xFTkdUSF9CSVQpKTsKKwkJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfQ09OVFJPTCwKKwkJCVBBUlNFUl9BVVRPU0VBUkNIIHwgUEFSU0VSX1ZJREVPIHwgUEFSU0VSX1dSSVRFIHwKKwkJCUVTX0lOU0VSVF9CRUZPUkVfRVNfV1JJVEUpOworCQlicmVhazsKKyNlbmRpZgorCX0KK30KKworc3RhdGljIHZvaWQgcGFyc2VyX3Rhc2tsZXQodWxvbmcgZGF0YSkKK3sKKwlzMzIgc2M7CisJdTMyIGludF9zdGF0dXMgPSBSRUFEX1BBUlNFUl9SRUcoUEFSU0VSX0lOVF9TVEFUVVMpOworCisJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfSU5UX1NUQVRVUywgaW50X3N0YXR1cyk7CisKKwlpZiAoaW50X3N0YXR1cyAmIFBBUlNFUl9JTlRTVEFUX0ZFVENIX0NNRCkgeworCQlmZXRjaF9kb25lID0gMTsKKworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJndxKTsKKwl9CisKKwlpZiAoaW50X3N0YXR1cyAmIFBBUlNFUl9JTlRTVEFUX1NDX0ZPVU5EKSB7CisJCXNjID0gUEFSU0VSX1BPUDsKKworCQlvbl9zdGFydF9jb2RlX2ZvdW5kKHNjKTsKKworCX0gZWxzZSBpZiAoaW50X3N0YXR1cyAmIFBBUlNFUl9JTlRTVEFUX0RJU0NBUkQpCisJCW9uX3N0YXJ0X2NvZGVfZm91bmQoMCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBwYXJzZXJfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwl0YXNrbGV0X3NjaGVkdWxlKCZwc3BhcnNlcl90YXNrbGV0KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHNzaXplX3QgX3BzcGFyc2VyX3dyaXRlKGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzaXplX3QgciA9IGNvdW50OworCWNvbnN0IGNoYXIgX191c2VyICpwID0gYnVmOworCXUzMiBsZW47CisJaW50IHJldDsKKwlkbWFfYWRkcl90IGRtYV9hZGRyID0gMDsKKworCWlmIChyID4gMCkgeworCQlsZW4gPSBtaW5fdChzaXplX3QsIHIsIEZFVENIQlVGX1NJWkUpOworCQlpZiAoY29weV9mcm9tX3VzZXIoZmV0Y2hidWYsIHAsIGxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlkbWFfYWRkciA9CisJCSAgICBkbWFfbWFwX3NpbmdsZShhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkgICAgZmV0Y2hidWYsIEZFVENIQlVGX1NJWkUsIERNQV9UT19ERVZJQ0UpOworCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLCBkbWFfYWRkcikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCisJCWZldGNoX2RvbmUgPSAwOworCisJCXdtYigpOyAvKiBFbnN1cmUgZmV0Y2hidWYgIGNvbnRlbnRzIHZpc2libGUgKi8KKworCQlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9GRVRDSF9BRERSLCBkbWFfYWRkcik7CisKKwkJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfRkVUQ0hfQ01ELCAoNyA8PCBGRVRDSF9FTkRJQU4pIHwgbGVuKTsKKwkJZG1hX3VubWFwX3NpbmdsZShhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksIGRtYV9hZGRyLAorCQkJCQkJIEZFVENIQlVGX1NJWkUsIERNQV9UT19ERVZJQ0UpOworCQlyZXQgPQorCQkgICAgd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQod3EsIGZldGNoX2RvbmUgIT0gMCwKKwkJCSAgICBIWiAvIDEwKTsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9GRVRDSF9DTUQsIDApOworCQkJcHJfaW5mbygid3JpdGUgdGltZW91dCwgcmV0cnlcbiIpOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0gZWxzZSBpZiAocmV0IDwgMCkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwkJcCArPSBsZW47CisJCXIgLT0gbGVuOworCX0KKworCXJldHVybiBjb3VudCAtIHI7Cit9CisKK3MzMiBwc3BhcnNlcl9pbml0KHUzMiB2aWQsIHUzMiBhaWQsIHUzMiBzaWQsIHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJczMyIHI7CisJdTMyIHBhcnNlcl9zdWJfc3RhcnRfcHRyOworCXUzMiBwYXJzZXJfc3ViX2VuZF9wdHI7CisJdTMyIHBhcnNlcl9zdWJfcnA7CisKKyNpZmRlZiBERUJVR19WT0JfU1VCCisJdTggaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfU1VCX05VTTsgaSsrKSB7CisJCXN1Yl9pbmZvW2ldID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHN1YnRpdGxlX2luZm8pLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFzdWJfaW5mb1tpXSkgeworCQkJcHJfaW5mbworCQkJKCJbcHNwYXJzZXJfaW5pdF1hbGxvYyBmb3Igc3VidGl0bGUgaW5mbyBmYWlsZWRcbiIpOworCQl9IGVsc2UKKwkJCXN1Yl9pbmZvW2ldLT5pZCA9IC0xOworCX0KKwlzdWJfZm91bmRfbnVtID0gMDsKKyNlbmRpZgorCXBhcnNlcl9zdWJfc3RhcnRfcHRyID0gUkVBRF9QQVJTRVJfUkVHKFBBUlNFUl9TVUJfU1RBUlRfUFRSKTsKKwlwYXJzZXJfc3ViX2VuZF9wdHIgPSBSRUFEX1BBUlNFUl9SRUcoUEFSU0VSX1NVQl9FTkRfUFRSKTsKKwlwYXJzZXJfc3ViX3JwID0gUkVBRF9QQVJTRVJfUkVHKFBBUlNFUl9TVUJfUlApOworCisJdmlkZW9faWQgPSB2aWQ7CisJYXVkaW9faWQgPSBhaWQ7CisJc3ViX2lkID0gc2lkOworCWF1ZGlvX2dvdF9maXJzdF9wdHMgPSAwOworCXZpZGVvX2dvdF9maXJzdF9kdHMgPSAwOworCXN1Yl9nb3RfZmlyc3RfcHRzID0gMDsKKwlmaXJzdF9hcHRzID0gMDsKKwlmaXJzdF92cHRzID0gMDsKKwlwdHNfZXF1X2R0c19mbGFnID0gMDsKKworI2lmZGVmIFZJREVPX0FVVE9fRkxVU0gKKwl2aWRlb19hdXRvX2ZsdXNoX3N0YXRlID0gVklERU9fQVVUT19GTFVTSF9JRExFOworI2VuZGlmCisKKwlwcl9pbmZvKCJ2aWRlbyAweCV4LCBhdWRpbyAweCV4LCBzdWIgMHgleFxuIiwgdmlkZW9faWQsIGF1ZGlvX2lkLAorCQkJc3ViX2lkKTsKKwlpZiAoZmV0Y2hidWYgPT0gMCkgeworCQlwcl9pbmZvKCIlczogbm8gZmV0Y2hidWZcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJV1JJVEVfUkVTRVRfUkVHKFJFU0VUMV9SRUdJU1RFUiwgUkVTRVRfUEFSU0VSKTsKKworLyogZm9yIHJlY29yZGVkIGZpbGUgYW5kIGxvY2FsIHBsYXksIHRoaXMgY2FuJ3QgY2hhbmdlIHRoZSBpbnB1dCBzb3VyY2UqLworCS8qIFRTIGRhdGEgcGF0aCAqLworLyoKKyNpZm5kZWYgQ09ORklHX0FNX0RWQgorCVdSSVRFX0RFTVVYX1JFRyhGRUNfSU5QVVRfQ09OVFJPTCwgMCk7CisjZWxzZQorCXRzZGVtdXhfc2V0X3Jlc2V0X2ZsYWcoKTsKKyNlbmRpZiAqLworCisJQ0xFQVJfREVNVVhfUkVHX01BU0soVFNfSElVX0NUTCwgMSA8PCBVU0VfSElfQlNGX0lOVEVSRkFDRSk7CisJQ0xFQVJfREVNVVhfUkVHX01BU0soVFNfSElVX0NUTF8yLCAxIDw8IFVTRV9ISV9CU0ZfSU5URVJGQUNFKTsKKwlDTEVBUl9ERU1VWF9SRUdfTUFTSyhUU19ISVVfQ1RMXzMsIDEgPDwgVVNFX0hJX0JTRl9JTlRFUkZBQ0UpOworCUNMRUFSX0RFTVVYX1JFR19NQVNLKFRTX0ZJTEVfQ09ORklHLCAoMSA8PCBUU19ISVVfRU5BQkxFKSk7CisKKwkvKiBob29rIHN0cmVhbSBidWZmZXIgd2l0aCBQQVJTRVIgKi8KKwlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9WSURFT19TVEFSVF9QVFIsIHZkZWMtPmlucHV0LnN0YXJ0KTsKKwlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9WSURFT19FTkRfUFRSLAorCQl2ZGVjLT5pbnB1dC5zdGFydCArIHZkZWMtPmlucHV0LnNpemUgLSA4KTsKKworCWlmICh2ZGVjX3NpbmdsZSh2ZGVjKSkgeworCQlDTEVBUl9QQVJTRVJfUkVHX01BU0soUEFSU0VSX0VTX0NPTlRST0wsIEVTX1ZJRF9NQU5fUkRfUFRSKTsKKwkJV1JJVEVfVlJFRyhWTERfTUVNX1ZJRklGT19CVUZfQ05UTCwgTUVNX0JVRkNUUkxfSU5JVCk7CisJCUNMRUFSX1ZSRUdfTUFTSyhWTERfTUVNX1ZJRklGT19CVUZfQ05UTCwgTUVNX0JVRkNUUkxfSU5JVCk7CisJfSBlbHNlIHsKKwkJU0VUX1BBUlNFUl9SRUdfTUFTSyhQQVJTRVJfRVNfQ09OVFJPTCwgRVNfVklEX01BTl9SRF9QVFIpOworCQlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9WSURFT19XUCwgdmRlYy0+aW5wdXQuc3RhcnQpOworCQlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9WSURFT19SUCwgdmRlYy0+aW5wdXQuc3RhcnQpOworCX0KKworCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX0FVRElPX1NUQVJUX1BUUiwKKwkJCQkgICBSRUFEX0FJVV9SRUcoQUlVX01FTV9BSUZJRk9fU1RBUlRfUFRSKSk7CisJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfQVVESU9fRU5EX1BUUiwKKwkJCQkgICBSRUFEX0FJVV9SRUcoQUlVX01FTV9BSUZJRk9fRU5EX1BUUikpOworCUNMRUFSX1BBUlNFUl9SRUdfTUFTSyhQQVJTRVJfRVNfQ09OVFJPTCwgRVNfQVVEX01BTl9SRF9QVFIpOworCisJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfQ09ORklHLAorCQkJCSAgICgxMCA8PCBQU19DRkdfUEZJRk9fRU1QVFlfQ05UX0JJVCkgfAorCQkJCSAgICgxIDw8IFBTX0NGR19NQVhfRVNfV1JfQ1lDTEVfQklUKSB8CisJCQkJICAgKDE2IDw8IFBTX0NGR19NQVhfRkVUQ0hfQ1lDTEVfQklUKSk7CisKKwlpZiAodmRlY19zaW5nbGUodmRlYykpIHsKKwkJV1JJVEVfVlJFRyhWTERfTUVNX1ZJRklGT19CVUZfQ05UTCwgTUVNX0JVRkNUUkxfSU5JVCk7CisJCUNMRUFSX1ZSRUdfTUFTSyhWTERfTUVNX1ZJRklGT19CVUZfQ05UTCwgTUVNX0JVRkNUUkxfSU5JVCk7CisJfQorCisJV1JJVEVfQUlVX1JFRyhBSVVfTUVNX0FJRklGT19CVUZfQ05UTCwgTUVNX0JVRkNUUkxfSU5JVCk7CisJQ0xFQVJfQUlVX1JFR19NQVNLKEFJVV9NRU1fQUlGSUZPX0JVRl9DTlRMLCBNRU1fQlVGQ1RSTF9JTklUKTsKKworCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX1NVQl9TVEFSVF9QVFIsIHBhcnNlcl9zdWJfc3RhcnRfcHRyKTsKKwlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9TVUJfRU5EX1BUUiwgcGFyc2VyX3N1Yl9lbmRfcHRyKTsKKwlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9TVUJfUlAsIHBhcnNlcl9zdWJfc3RhcnRfcHRyKTsKKwlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9TVUJfV1AsIHBhcnNlcl9zdWJfc3RhcnRfcHRyKTsKKwlTRVRfUEFSU0VSX1JFR19NQVNLKFBBUlNFUl9FU19DT05UUk9MLAorCQkoNyA8PCBFU19TVUJfV1JfRU5ESUFOX0JJVCkgfCBFU19TVUJfTUFOX1JEX1BUUik7CisKKwlXUklURV9QQVJTRVJfUkVHKFBGSUZPX1JEX1BUUiwgMCk7CisJV1JJVEVfUEFSU0VSX1JFRyhQRklGT19XUl9QVFIsIDApOworCisJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfU0VBUkNIX1BBVFRFUk4sIE1QRUdfU1RBUlRfQ09ERV9QQVRURVJOKTsKKwlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9TRUFSQ0hfTUFTSywgTVBFR19TVEFSVF9DT0RFX01BU0spOworCisJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfQ09ORklHLAorCQkoMTAgPDwgUFNfQ0ZHX1BGSUZPX0VNUFRZX0NOVF9CSVQpIHwKKwkJKDEgPDwgUFNfQ0ZHX01BWF9FU19XUl9DWUNMRV9CSVQpIHwKKwkJUFNfQ0ZHX1NUQVJUQ09ERV9XSURfMjQgfAorCQlQU19DRkdfUEZJRk9fQUNDRVNTX1dJRF84IHwJLyogc2luZ2xlIGJ5dGUgcG9wICovCisJCQkJICAgKDE2IDw8IFBTX0NGR19NQVhfRkVUQ0hfQ1lDTEVfQklUKSk7CisJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfQ09OVFJPTCwgUEFSU0VSX0FVVE9TRUFSQ0gpOworCisJdGFza2xldF9pbml0KCZwc3BhcnNlcl90YXNrbGV0LCBwYXJzZXJfdGFza2xldCwgMCk7CisJciA9IHB0c19zdGFydChQVFNfVFlQRV9WSURFTyk7CisJaWYgKHIgPCAwKQorCQlnb3RvIEVycl8xOworCXIgPSBwdHNfc3RhcnQoUFRTX1RZUEVfQVVESU8pOworCWlmIChyIDwgMCkKKwkJZ290byBFcnJfMjsKKworCXZpZGVvX2RhdGFfcGFyc2VkID0gMDsKKwlhdWRpb19kYXRhX3BhcnNlZCA9IDA7CisJLypUT0RPIGlycSAqLworCisJciA9IHZkZWNfcmVxdWVzdF9pcnEoUEFSU0VSX0lSUSwgcGFyc2VyX2lzciwKKwkJInBzcGFyc2VyIiwgKHZvaWQgKilwc3BhcnNlcl9pZCk7CisKKwlpZiAocikgeworCQlwcl9pbmZvKCJQUyBEZW11eCBpcnEgcmVnaXN0ZXIgZmFpbGVkLlxuIik7CisKKwkJciA9IC1FTk9FTlQ7CisJCWdvdG8gRXJyXzM7CisJfQorCisJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfSU5UX1NUQVRVUywgMHhmZmZmKTsKKwlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9JTlRfRU5BQkxFLAorCQlQQVJTRVJfSU5UX0FMTCA8PCBQQVJTRVJfSU5UX0hPU1RfRU5fQklUKTsKKworCXJldHVybiAwOworCitFcnJfMzoKKwlwdHNfc3RvcChQVFNfVFlQRV9BVURJTyk7CisKK0Vycl8yOgorCXB0c19zdG9wKFBUU19UWVBFX1ZJREVPKTsKKworRXJyXzE6CisJcmV0dXJuIHI7Cit9CisKK3ZvaWQgcHNwYXJzZXJfcmVsZWFzZSh2b2lkKQoreworCXU4IGk7CisKKwlwcl9pbmZvKCJwc3BhcnNlcl9yZWxlYXNlXG4iKTsKKworCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX0lOVF9FTkFCTEUsIDApOworCS8qVE9ETyBpcnEgKi8KKworCXZkZWNfZnJlZV9pcnEoUEFSU0VSX0lSUSwgKHZvaWQgKilwc3BhcnNlcl9pZCk7CisKKwlwdHNfc3RvcChQVFNfVFlQRV9WSURFTyk7CisJcHRzX3N0b3AoUFRTX1RZUEVfQVVESU8pOworI2lmZGVmIERFQlVHX1ZPQl9TVUIKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1NVQl9OVU07IGkrKykKKwkJa2ZyZWUoc3ViX2luZm9baV0pOworCXByX2luZm8oInBzcGFyc2VyIHJlbGVhc2Ugc3VidGl0bGUgaW5mb1xuIik7CisjZW5kaWYKK30KK0VYUE9SVF9TWU1CT0wocHNwYXJzZXJfcmVsZWFzZSk7CisKK3NzaXplX3QgcHNwYXJzZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJc3RydWN0IHN0cmVhbV9idWZfcyAqdmJ1ZiwKKwlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICphYnVmLAorCWNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzMzIgcjsKKworCXN0cnVjdCBwb3J0X3ByaXZfcyAqcHJpdiA9IChzdHJ1Y3QgcG9ydF9wcml2X3MgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHN0cmVhbV9wb3J0X3MgKnBvcnQgPSBwcml2LT5wb3J0OworCisJaWYgKChzdGJ1Zl9zcGFjZSh2YnVmKSA8IGNvdW50KSB8fCAoc3RidWZfc3BhY2UoYWJ1ZikgPCBjb3VudCkpIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJcmV0dXJuIC1FQUdBSU47CisKKwkJaWYgKChwb3J0LT5mbGFnICYgUE9SVF9GTEFHX1ZJRCkKKwkJCSYmIChzdGJ1Zl9zcGFjZSh2YnVmKSA8IGNvdW50KSkgeworCQkJciA9IHN0YnVmX3dhaXRfc3BhY2UodmJ1ZiwgY291bnQpOworCQkJaWYgKHIgPCAwKQorCQkJCXJldHVybiByOworCQl9CisJCWlmICgocG9ydC0+ZmxhZyAmIFBPUlRfRkxBR19BSUQpCisJCQkmJiAoc3RidWZfc3BhY2UoYWJ1ZikgPCBjb3VudCkpIHsKKwkJCXIgPSBzdGJ1Zl93YWl0X3NwYWNlKGFidWYsIGNvdW50KTsKKwkJCWlmIChyIDwgMCkKKwkJCQlyZXR1cm4gcjsKKwkJfQorCX0KKworCXJldHVybiBfcHNwYXJzZXJfd3JpdGUoYnVmLCBjb3VudCk7Cit9CisKK3ZvaWQgcHNwYXJzZXJfY2hhbmdlX2F2aWQodW5zaWduZWQgaW50IHZpZCwgdW5zaWduZWQgaW50IGFpZCkKK3sKKwl2aWRlb19pZCA9IHZpZDsKKwlhdWRpb19pZCA9IGFpZDsKK30KKwordm9pZCBwc3BhcnNlcl9jaGFuZ2Vfc2lkKHVuc2lnbmVkIGludCBzaWQpCit7CisJc3ViX2lkID0gc2lkOworfQorCit2b2lkIHBzcGFyc2VyX2F1ZGlvX3Jlc2V0KHZvaWQpCit7CisJdWxvbmcgZmxhZ3M7CisKKwlERUZJTkVfU1BJTkxPQ0sobG9jayk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCisJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfQVVESU9fV1AsCisJCQkJICAgUkVBRF9BSVVfUkVHKEFJVV9NRU1fQUlGSUZPX1NUQVJUX1BUUikpOworCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX0FVRElPX1JQLAorCQkJCSAgIFJFQURfQUlVX1JFRyhBSVVfTUVNX0FJRklGT19TVEFSVF9QVFIpKTsKKworCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX0FVRElPX1NUQVJUX1BUUiwKKwkJCQkgICBSRUFEX0FJVV9SRUcoQUlVX01FTV9BSUZJRk9fU1RBUlRfUFRSKSk7CisJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfQVVESU9fRU5EX1BUUiwKKwkJCQkgICBSRUFEX0FJVV9SRUcoQUlVX01FTV9BSUZJRk9fRU5EX1BUUikpOworCUNMRUFSX1BBUlNFUl9SRUdfTUFTSyhQQVJTRVJfRVNfQ09OVFJPTCwgRVNfQVVEX01BTl9SRF9QVFIpOworCisJV1JJVEVfQUlVX1JFRyhBSVVfTUVNX0FJRklGT19CVUZfQ05UTCwgTUVNX0JVRkNUUkxfSU5JVCk7CisJQ0xFQVJfQUlVX1JFR19NQVNLKEFJVV9NRU1fQUlGSUZPX0JVRl9DTlRMLCBNRU1fQlVGQ1RSTF9JTklUKTsKKworCWF1ZGlvX2RhdGFfcGFyc2VkID0gMDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKKworfQorCit2b2lkIHBzcGFyc2VyX3N1Yl9yZXNldCh2b2lkKQoreworCXVsb25nIGZsYWdzOworCisJREVGSU5FX1NQSU5MT0NLKGxvY2spOworCXUzMiBwYXJzZXJfc3ViX3N0YXJ0X3B0cjsKKwl1MzIgcGFyc2VyX3N1Yl9lbmRfcHRyOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKKworCXBhcnNlcl9zdWJfc3RhcnRfcHRyID0gUkVBRF9QQVJTRVJfUkVHKFBBUlNFUl9TVUJfU1RBUlRfUFRSKTsKKwlwYXJzZXJfc3ViX2VuZF9wdHIgPSBSRUFEX1BBUlNFUl9SRUcoUEFSU0VSX1NVQl9FTkRfUFRSKTsKKworCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX1NVQl9TVEFSVF9QVFIsIHBhcnNlcl9zdWJfc3RhcnRfcHRyKTsKKwlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9TVUJfRU5EX1BUUiwgcGFyc2VyX3N1Yl9lbmRfcHRyKTsKKwlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9TVUJfUlAsIHBhcnNlcl9zdWJfc3RhcnRfcHRyKTsKKwlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9TVUJfV1AsIHBhcnNlcl9zdWJfc3RhcnRfcHRyKTsKKwlTRVRfUEFSU0VSX1JFR19NQVNLKFBBUlNFUl9FU19DT05UUk9MLAorCQkoNyA8PCBFU19TVUJfV1JfRU5ESUFOX0JJVCkgfCBFU19TVUJfTUFOX1JEX1BUUik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CisKK30KKwordTggcHNwYXJzZXJfZ2V0X3N1Yl9mb3VuZF9udW0odm9pZCkKK3sKKyNpZmRlZiBERUJVR19WT0JfU1VCCisJcmV0dXJuIHN1Yl9mb3VuZF9udW07CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCit9CisKK3U4IHBzcGFyc2VyX2dldF9zdWJfaW5mbyhzdHJ1Y3Qgc3VidGl0bGVfaW5mbyAqKnN1Yl9pbmZvcykKK3sKKyNpZmRlZiBERUJVR19WT0JfU1VCCisJdTggaSA9IDA7CisJaW50IHJldCA9IDA7CisJdTggc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc3VidGl0bGVfaW5mbyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3ViX2ZvdW5kX251bTsgaSsrKSB7CisJCWlmICghc3ViX2luZm9baV0pIHsKKwkJCXByX2luZm8KKwkJCSgiW3BzcGFyc2VyX2dldF9zdWJfaW5mbzolZF0gIHN1Yl9pbmZvWyVkXSBOVUxMXG4iLAorCQkJIF9fTElORV9fLCBpKTsKKwkJCXJldCA9IC0xOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFzdWJfaW5mb3NbaV0pIHsKKwkJCXByX2luZm8KKwkJCSgiW3BzcGFyc2VyX2dldF9zdWJfaW5mbzolZF0gIHN1Yl9pbmZvc1slZF0gTlVMTFxuIiwKKwkJCSBfX0xJTkVfXywgaSk7CisJCQlyZXQgPSAtMjsKKwkJCWJyZWFrOworCQl9CisJCW1lbWNweShzdWJfaW5mb3NbaV0sIHN1Yl9pbmZvW2ldLCBzaXplKTsKKwl9CisJcmV0dXJuIHJldDsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworc3RhdGljIGludCBwc3BhcnNlcl9zdGJ1Zl9pbml0KHN0cnVjdCBzdHJlYW1fYnVmX3MgKnN0YnVmLAorCQkJICAgICAgIHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJaW50IHJldCA9IC0xOworCisJcmV0ID0gc3RidWZfaW5pdChzdGJ1ZiwgdmRlYyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBwc3BhcnNlcl9pbml0KHN0YnVmLT5wYXJzLnZpZCwKKwkJCSAgIHN0YnVmLT5wYXJzLmFpZCwKKwkJCSAgIHN0YnVmLT5wYXJzLnNpZCwKKwkJCSAgIHZkZWMpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJc3RidWYtPmZsYWcgfD0gQlVGX0ZMQUdfSU5fVVNFOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHBzcGFyc2VyX3N0YnVmX3JlbGVhc2Uoc3RydWN0IHN0cmVhbV9idWZfcyAqc3RidWYpCit7CisJcHNwYXJzZXJfcmVsZWFzZSgpOworCisJc3RidWZfcmVsZWFzZShzdGJ1Zik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3RyZWFtX2J1Zl9vcHMgcHNwYXJzZXJfc3RidWZfb3BzID0geworCS5pbml0CT0gcHNwYXJzZXJfc3RidWZfaW5pdCwKKwkucmVsZWFzZSA9IHBzcGFyc2VyX3N0YnVmX3JlbGVhc2UsCisJLmdldF93cAk9IHBhcnNlcl9nZXRfd3AsCisJLnNldF93cAk9IHBhcnNlcl9zZXRfd3AsCisJLmdldF9ycAk9IHBhcnNlcl9nZXRfcnAsCisJLnNldF9ycAk9IHBhcnNlcl9zZXRfcnAsCit9OworCitzdHJ1Y3Qgc3RyZWFtX2J1Zl9vcHMgKmdldF9wc3BhcnNlcl9zdGJ1Zl9vcHModm9pZCkKK3sKKwlyZXR1cm4gJnBzcGFyc2VyX3N0YnVmX29wczsKK30KK0VYUE9SVF9TWU1CT0woZ2V0X3BzcGFyc2VyX3N0YnVmX29wcyk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9wc3BhcnNlci5oIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL3BzcGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgzZTM0MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9wc3BhcnNlci5oCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL21lZGlhL3N0cmVhbV9pbnB1dC9wYXJzZXIvcHNwYXJzZXIuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIFBTUEFSU0VSX0gKKyNkZWZpbmUgUFNQQVJTRVJfSAorCisjaW5jbHVkZSAiLi4vLi4vZnJhbWVfcHJvdmlkZXIvZGVjb2Rlci91dGlscy92ZGVjLmgiCisKK2V4dGVybiBzMzIgcHNwYXJzZXJfaW5pdCh1MzIgdmlkLCB1MzIgYWlkLCB1MzIgc2lkLCBzdHJ1Y3QgdmRlY19zICp2ZGVjKTsKKworZXh0ZXJuIHZvaWQgcHNwYXJzZXJfcmVsZWFzZSh2b2lkKTsKKworZXh0ZXJuIHNzaXplX3QgcHNwYXJzZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCXN0cnVjdCBzdHJlYW1fYnVmX3MgKnZidWYsCisJCXN0cnVjdCBzdHJlYW1fYnVmX3MgKmFidWYsCisJCWNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCk7CisKK2V4dGVybiB2b2lkIHBzcGFyc2VyX2NoYW5nZV9hdmlkKHVuc2lnbmVkIGludCB2aWQsIHVuc2lnbmVkIGludCBhaWQpOworCitleHRlcm4gdm9pZCBwc3BhcnNlcl9jaGFuZ2Vfc2lkKHVuc2lnbmVkIGludCBzaWQpOworCitleHRlcm4gdm9pZCBwc3BhcnNlcl9hdWRpb19yZXNldCh2b2lkKTsKKworZXh0ZXJuIHZvaWQgcHNwYXJzZXJfc3ViX3Jlc2V0KHZvaWQpOworCitleHRlcm4gdTggcHNwYXJzZXJfZ2V0X3N1Yl9mb3VuZF9udW0odm9pZCk7CisKK2V4dGVybiB1OCBwc3BhcnNlcl9nZXRfc3ViX2luZm8oc3RydWN0IHN1YnRpdGxlX2luZm8gKnN1Yl9pbmZvc1tdKTsKKworI2lmZGVmIENPTkZJR19BTV9EVkIKK2V4dGVybiBpbnQgdHNkZW11eF9zZXRfcmVzZXRfZmxhZyh2b2lkKTsKKyNlbmRpZgorCisvKiBUT0RPOiBtb3ZlIHRvIHJlZ2lzdGVyIGhlYWRlcnMgKi8KKyNkZWZpbmUgRVNfUEFDS19TSVpFX0JJVCAgICAgICAgICAgICAgICA4CisjZGVmaW5lIEVTX1BBQ0tfU0laRV9XSUQgICAgICAgICAgICAgICAgMjQKKworI2RlZmluZSBFU19DVFJMX1dJRCAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgRVNfQ1RSTF9CSVQgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEVTX1RZUEVfTUFTSyAgICAgICAgICAgICAgICAgICAgKDMgPDwgNikKKyNkZWZpbmUgRVNfVFlQRV9WSURFTyAgICAgICAgICAgICAgICAgICAoMCA8PCA2KQorI2RlZmluZSBFU19UWVBFX0FVRElPICAgICAgICAgICAgICAgICAgICgxIDw8IDYpCisjZGVmaW5lIEVTX1RZUEVfU1VCVElUTEUgICAgICAgICAgICAgICAgKDIgPDwgNikKKworI2RlZmluZSBFU19XUklURSAgICAgICAgICAgICAgICAgICAgICAgICgxPDw1KQorI2RlZmluZSBFU19QQVNTVEhST1VHSCAgICAgICAgICAgICAgICAgICgxPDw0KQorI2RlZmluZSBFU19JTlNFUlRfQkVGT1JFX0VTX1dSSVRFICAgICAgICgxPDwzKQorI2RlZmluZSBFU19ESVNDQVJEICAgICAgICAgICAgICAgICAgICAgICgxPDwyKQorI2RlZmluZSBFU19TRUFSQ0ggICAgICAgICAgICAgICAgICAgICAgICgxPDwxKQorI2RlZmluZSBFU19QQVJTRVJfU1RBUlQgICAgICAgICAgICAgICAgICgxPDwwKQorI2RlZmluZSBFU19QQVJTRVJfQlVTWSAgICAgICAgICAgICAgICAgICgxPDwwKQorCisjZGVmaW5lIFBBUlNFUl9JTlRTVEFUX0ZFVENIX0NNRCAgICAoMTw8NykKKyNkZWZpbmUgUEFSU0VSX0lOVFNUQVRfUEFSU0UgICAgICAgICgxPDw0KQorI2RlZmluZSBQQVJTRVJfSU5UU1RBVF9ESVNDQVJEICAgICAgKDE8PDMpCisjZGVmaW5lIFBBUlNFUl9JTlRTVEFUX0lOU1pFUk8gICAgICAoMTw8MikKKyNkZWZpbmUgUEFSU0VSX0lOVFNUQVRfQUNUX05PU1NDICAgICgxPDwxKQorI2RlZmluZSBQQVJTRVJfSU5UU1RBVF9TQ19GT1VORCAgICAgKDE8PDApCisKKyNkZWZpbmUgRkVUQ0hfQ0lSX0JVRiAgICAgICAgICAgICAgICgxPDwzMSkKKyNkZWZpbmUgRkVUQ0hfQ0hLX0JVRl9TVE9QICAgICAgICAgICgxPDwzMCkKKyNkZWZpbmUgRkVUQ0hfUEFTU1RIUk9VR0ggICAgICAgICAgICgxPDwyOSkKKyNkZWZpbmUgRkVUQ0hfRU5ESUFOICAgICAgICAgICAgICAgIDI3CisjZGVmaW5lIEZFVENIX1BBU1NUSFJPVUdIX1RZUEVfTUFTSyAoMHgzPDwyNykKKyNkZWZpbmUgRkVUQ0hfRU5ESUFOX01BU0sgICAgICAgICAgICgweDc8PDI3KQorI2RlZmluZSBGRVRDSF9CVUZfU0laRV9NQVNLICAgICAgICAgKDB4N2ZmZmZmZikKKyNkZWZpbmUgRkVUQ0hfQ01EX1BUUl9NQVNLICAgICAgICAgIDMKKyNkZWZpbmUgRkVUQ0hfQ01EX1JEX1BUUl9CSVQgICAgICAgIDUKKyNkZWZpbmUgRkVUQ0hfQ01EX1dSX1BUUl9CSVQgICAgICAgIDMKKyNkZWZpbmUgRkVUQ0hfQ01EX05VTV9NQVNLICAgICAgICAgIDMKKyNkZWZpbmUgRkVUQ0hfQ01EX05VTV9CSVQgICAgICAgICAgIDAKKworI2RlZmluZSBFU19DT1VOVF9NQVNLICAgICAgICAgICAgICAgIDB4ZmZmCisjZGVmaW5lIEVTX0NPVU5UX0JJVCAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgRVNfUkVRX1BFTkRJTkcgICAgICAgICAgICAgICAoMTw8MTkpCisjZGVmaW5lIEVTX1BBU1NUSFJPVUdIX0VOICAgICAgICAgICAgKDE8PDE4KQorI2RlZmluZSBFU19QQVNTVEhST1VHSF9UWVBFX01BU0sgICAgICgzPDwxNikKKyNkZWZpbmUgRVNfUEFTU1RIUk9VR0hfVFlQRV9WSURFTyAgICAoMDw8MTYpCisjZGVmaW5lIEVTX1BBU1NUSFJPVUdIX1RZUEVfQVVESU8gICAgKDE8PDE2KQorI2RlZmluZSBFU19QQVNTVEhST1VHSF9UWVBFX1NVQlRJVExFICgyPDwxNikKKyNkZWZpbmUgRVNfV1JfRU5ESUFOX01BU0sgICAgICAgICAgICAoMHg3KQorI2RlZmluZSBFU19TVUJfV1JfRU5ESUFOX0JJVCAgICAgICAgIDkKKyNkZWZpbmUgRVNfU1VCX01BTl9SRF9QVFIgICAgICAgICAgICAoMTw8OCkKKyNkZWZpbmUgRVNfQVVEX1dSX0VORElBTl9CSVQgICAgICAgICA1CisjZGVmaW5lIEVTX0FVRF9NQU5fUkRfUFRSICAgICAgICAgICAgKDE8PDQpCisjZGVmaW5lIEVTX1ZJRF9XUl9FTkRJQU5fQklUICAgICAgICAgMQorI2RlZmluZSBFU19WSURfTUFOX1JEX1BUUiAgICAgICAgICAgICgxPDwwKQorCisjZGVmaW5lIFBTX0NGR19GRVRDSF9ETUFfVVJHRU5UICAgICAgICAgKDE8PDMxKQorI2RlZmluZSBQU19DRkdfU1RSRUFNX0RNQV9VUkdFTlQgICAgICAgICgxPDwzMCkKKyNkZWZpbmUgUFNfQ0ZHX0ZPUkNFX1BGSUZPX1JFTiAgICAgICAgICAoMTw8MjkpCisjZGVmaW5lIFBTX0NGR19QRklGT19QRUFLX0VOICAgICAgICAgICAgKDE8PDI4KQorI2RlZmluZSBQU19DRkdfU1JDX1NFTF9CSVQgICAgICAgICAgICAgIDI0CisjZGVmaW5lIFBTX0NGR19TUkNfU0VMX01BU0sgICAgICAgICAgICAgKDM8PFBTX0NGR19TUkNfU0VMX0JJVCkKKyNkZWZpbmUgUFNfQ0ZHX1NSQ19TRUxfRkVUQ0ggICAgICAgICAgICAoMDw8UFNfQ0ZHX1NSQ19TRUxfQklUKQorI2RlZmluZSBQU19DRkdfU1JDX1NFTF9BVVgxICAgICAgICAgICAgICgxPDxQU19DRkdfU1JDX1NFTF9CSVQpCS8qIGZyb20gTkRNQSAqLworI2RlZmluZSBQU19DRkdfU1JDX1NFTF9BVVgyICAgICAgICAgICAgICgyPDxQU19DRkdfU1JDX1NFTF9CSVQpCisjZGVmaW5lIFBTX0NGR19TUkNfU0VMX0FVWDMgICAgICAgICAgICAgKDM8PFBTX0NGR19TUkNfU0VMX0JJVCkKKyNkZWZpbmUgUFNfQ0ZHX1BGSUZPX0VNUFRZX0NOVF9CSVQgICAgICAxNgorI2RlZmluZSBQU19DRkdfUEZJRk9fRU1QVFlfQ05UX01BU0sgICAgIDB4ZmYKKyNkZWZpbmUgUFNfQ0ZHX01BWF9FU19XUl9DWUNMRV9CSVQgICAgICAxMgorI2RlZmluZSBQU19DRkdfTUFYX0VTX1dSX0NZQ0xFX01BU0sgICAgIDB4ZgorI2RlZmluZSBQU19DRkdfU1RBUlRDT0RFX1dJRF9NQVNLICAgICAgICgweDM8PDEwKQorI2RlZmluZSBQU19DRkdfU1RBUlRDT0RFX1dJRF84ICAgICAgICAgICgweDA8PDEwKQorI2RlZmluZSBQU19DRkdfU1RBUlRDT0RFX1dJRF8xNiAgICAgICAgICgweDE8PDEwKQorI2RlZmluZSBQU19DRkdfU1RBUlRDT0RFX1dJRF8yNCAgICAgICAgICgweDI8PDEwKQorI2RlZmluZSBQU19DRkdfU1RBUlRDT0RFX1dJRF8zMiAgICAgICAgICgweDM8PDEwKQorI2RlZmluZSBQU19DRkdfUEZJRk9fQUNDRVNTX1dJRF9NQVNLICAgICgweDM8PDgpCisjZGVmaW5lIFBTX0NGR19QRklGT19BQ0NFU1NfV0lEXzggICAgICAgKDB4MDw8OCkKKyNkZWZpbmUgUFNfQ0ZHX1BGSUZPX0FDQ0VTU19XSURfMTYgICAgICAoMHgxPDw4KQorI2RlZmluZSBQU19DRkdfUEZJRk9fQUNDRVNTX1dJRF8yNCAgICAgICgweDI8PDgpCisjZGVmaW5lIFBTX0NGR19QRklGT19BQ0NFU1NfV0lEXzMyICAgICAgKDB4Mzw8OCkKKyNkZWZpbmUgUFNfQ0ZHX01BWF9GRVRDSF9DWUNMRV9CSVQgICAgICAwCisjZGVmaW5lIFBTX0NGR19NQVhfRkVUQ0hfQ1lDTEVfTUFTSyAgICAgMHhmZgorCisjZGVmaW5lIFBBUlNFUl9JTlRfRElTQUJMRV9DTlRfTUFTSyAweGZmZmYKKyNkZWZpbmUgUEFSU0VSX0lOVF9ESVNBQkxFX0NOVF9CSVQgIDE2CisjZGVmaW5lIFBBUlNFUl9JTlRfSE9TVF9FTl9NQVNLICAgICAweGZmCisjZGVmaW5lIFBBUlNFUl9JTlRfSE9TVF9FTl9CSVQgICAgICA4CisjZGVmaW5lIFBBUlNFUl9JTlRfQU1SSVNDX0VOX01BU0sgICAweGZmCisjZGVmaW5lIFBBUlNFUl9JTlRfQU1SSVNDX0VOX0JJVCAgICAwCisjZGVmaW5lIFBBUlNFUl9JTlRfQUxMICAgICAgICAgICAgICAweGZmCisKKyNkZWZpbmUgUkVTRVRfUEFSU0VSICAgICAgICAoMTw8OCkKKyNkZWZpbmUgVFNfSElVX0VOQUJMRSAgICAgICAgICAgICAgNQorI2RlZmluZSBVU0VfSElfQlNGX0lOVEVSRkFDRSAgICAgICA3CisKKyNlbmRpZiAvKiBQU1BBUlNFUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvcm1wYXJzZXIuYyBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9ybXBhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMmRjNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvcm1wYXJzZXIuYwpAQCAtMCwwICsxLDM0MCBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9hbXBvcnRzL3JtcGFyc2VyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvYW1zdHJlYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2ZyYW1lX3N5bmMvcHRzc2Vydi5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmRlY19yZWcuaD4KKyNpbmNsdWRlICIuLi9hbXBvcnRzL2FtcG9ydHNfcHJpdi5oIgorI2luY2x1ZGUgIi4uL2FtcG9ydHMvc3RyZWFtYnVmLmgiCisjaW5jbHVkZSAiLi4vYW1wb3J0cy9zdHJlYW1idWZfcmVnLmgiCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlICJybXBhcnNlci5oIgorCisjZGVmaW5lIE1BTkFHRV9QVFMKKworc3RhdGljIHUzMiBmZXRjaF9kb25lOworc3RhdGljIHUzMiBwYXJzZV9oYWx0OworCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQocm1fd3EpOworc3RhdGljIGNvbnN0IGNoYXIgcm1wYXJzZXJfaWRbXSA9ICJybXBhcnNlci1pZCI7CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBybV9wYXJzZXJfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwl1MzIgaW50X3N0YXR1cyA9IFJFQURfUEFSU0VSX1JFRyhQQVJTRVJfSU5UX1NUQVRVUyk7CisKKwlpZiAoaW50X3N0YXR1cyAmIFBBUlNFUl9JTlRTVEFUX0ZFVENIX0NNRCkgeworCQlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9JTlRfU1RBVFVTLCBQQVJTRVJfSU5UU1RBVF9GRVRDSF9DTUQpOworCQlmZXRjaF9kb25lID0gMTsKKworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnJtX3dxKTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3MzMiBybXBhcnNlcl9pbml0KHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJczMyIHI7CisKKwlwYXJzZV9oYWx0ID0gMDsKKwlpZiAoZmV0Y2hidWYgPT0gMCkgeworCQlwcl9pbmZvKCIlczogbm8gZmV0Y2hidWZcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJV1JJVEVfUkVTRVRfUkVHKFJFU0VUMV9SRUdJU1RFUiwgUkVTRVRfUEFSU0VSKTsKKworLyogZm9yIHJlY29yZGVkIGZpbGUgYW5kIGxvY2FsIHBsYXksIHRoaXMgY2FuJ3QgY2hhbmdlIHRoZSBpbnB1dCBzb3VyY2UqLworCS8qIFRTIGRhdGEgcGF0aCAqLworLyoKKyNpZm5kZWYgQ09ORklHX0FNX0RWQgorCVdSSVRFX0RFTVVYX1JFRyhGRUNfSU5QVVRfQ09OVFJPTCwgMCk7CisjZWxzZQorCXRzZGVtdXhfc2V0X3Jlc2V0X2ZsYWcoKTsKKyNlbmRpZiAqLworCisJQ0xFQVJfREVNVVhfUkVHX01BU0soVFNfSElVX0NUTCwgMSA8PCBVU0VfSElfQlNGX0lOVEVSRkFDRSk7CisJQ0xFQVJfREVNVVhfUkVHX01BU0soVFNfSElVX0NUTF8yLCAxIDw8IFVTRV9ISV9CU0ZfSU5URVJGQUNFKTsKKwlDTEVBUl9ERU1VWF9SRUdfTUFTSyhUU19ISVVfQ1RMXzMsIDEgPDwgVVNFX0hJX0JTRl9JTlRFUkZBQ0UpOworCisJQ0xFQVJfREVNVVhfUkVHX01BU0soVFNfRklMRV9DT05GSUcsICgxIDw8IFRTX0hJVV9FTkFCTEUpKTsKKworCS8qIGhvb2sgc3RyZWFtIGJ1ZmZlciB3aXRoIFBBUlNFUiAqLworCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX1ZJREVPX1NUQVJUX1BUUiwgdmRlYy0+aW5wdXQuc3RhcnQpOworCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX1ZJREVPX0VORF9QVFIsCisJCXZkZWMtPmlucHV0LnN0YXJ0ICsgdmRlYy0+aW5wdXQuc2l6ZSAtIDgpOworCisJQ0xFQVJfUEFSU0VSX1JFR19NQVNLKFBBUlNFUl9FU19DT05UUk9MLCBFU19WSURfTUFOX1JEX1BUUik7CisKKwlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9BVURJT19TVEFSVF9QVFIsCisJCQkJICAgUkVBRF9BSVVfUkVHKEFJVV9NRU1fQUlGSUZPX1NUQVJUX1BUUikpOworCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX0FVRElPX0VORF9QVFIsCisJCQkJICAgUkVBRF9BSVVfUkVHKEFJVV9NRU1fQUlGSUZPX0VORF9QVFIpKTsKKwlDTEVBUl9QQVJTRVJfUkVHX01BU0soUEFSU0VSX0VTX0NPTlRST0wsIEVTX0FVRF9NQU5fUkRfUFRSKTsKKworCVdSSVRFX1ZSRUcoVkxEX01FTV9WSUZJRk9fQlVGX0NOVEwsIE1FTV9CVUZDVFJMX0lOSVQpOworCUNMRUFSX1ZSRUdfTUFTSyhWTERfTUVNX1ZJRklGT19CVUZfQ05UTCwgTUVNX0JVRkNUUkxfSU5JVCk7CisKKwlXUklURV9BSVVfUkVHKEFJVV9NRU1fQUlGSUZPX0JVRl9DTlRMLCBNRU1fQlVGQ1RSTF9JTklUKTsKKwlDTEVBUl9BSVVfUkVHX01BU0soQUlVX01FTV9BSUZJRk9fQlVGX0NOVEwsIE1FTV9CVUZDVFJMX0lOSVQpOworCisJV1JJVEVfUEFSU0VSX1JFRyhQRklGT19SRF9QVFIsIDApOworCVdSSVRFX1BBUlNFUl9SRUcoUEZJRk9fV1JfUFRSLCAwKTsKKworCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX1NFQVJDSF9NQVNLLCAwKTsKKwlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9DT05UUk9MLCAoRVNfU0VBUkNIIHwgRVNfUEFSU0VSX1NUQVJUKSk7CisKKyNpZmRlZiBNQU5BR0VfUFRTCisJaWYgKHB0c19zdGFydChQVFNfVFlQRV9WSURFTykgPCAwKQorCQlnb3RvIEVycl8xOworCisJaWYgKHB0c19zdGFydChQVFNfVFlQRV9BVURJTykgPCAwKQorCQlnb3RvIEVycl8yOworI2VuZGlmCisJLypUT0RPIGlycSAqLworCisJLyogZW5hYmxlIGludGVycnVwdCAqLworCisJciA9IHZkZWNfcmVxdWVzdF9pcnEoUEFSU0VSX0lSUSwgcm1fcGFyc2VyX2lzciwKKwkJCSJybXBhcnNlciIsICh2b2lkICopcm1wYXJzZXJfaWQpOworCisJaWYgKHIpIHsKKwkJcHJfaW5mbygiUk0gcGFyc2VyIGlycSByZWdpc3RlciBmYWlsZWQuXG4iKTsKKwkJZ290byBFcnJfMzsKKwl9CisKKwlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9JTlRfU1RBVFVTLCAweGZmZmYpOworCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX0lOVF9FTkFCTEUsCisJCQkoKFBBUlNFUl9JTlRfQUxMICYgKH5QQVJTRVJfSU5UU1RBVF9GRVRDSF9DTUQpKSA8PAorCQkJCQlQQVJTRVJfSU5UX0FNUklTQ19FTl9CSVQpCisJCQl8IChQQVJTRVJfSU5UU1RBVF9GRVRDSF9DTUQgPDwgUEFSU0VSX0lOVF9IT1NUX0VOX0JJVCkpOworCisJcmV0dXJuIDA7CisKK0Vycl8zOgorCXB0c19zdG9wKFBUU19UWVBFX0FVRElPKTsKK0Vycl8yOgorCXB0c19zdG9wKFBUU19UWVBFX1ZJREVPKTsKK0Vycl8xOgorCXJldHVybiAtRU5PRU5UOworfQorRVhQT1JUX1NZTUJPTChybXBhcnNlcl9pbml0KTsKKwordm9pZCBybXBhcnNlcl9yZWxlYXNlKHZvaWQpCit7CisJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfSU5UX0VOQUJMRSwgMCk7CisJLypUT0RPIGlycSAqLworCisJdmRlY19mcmVlX2lycShQQVJTRVJfSVJRLCAodm9pZCAqKXJtcGFyc2VyX2lkKTsKKworI2lmZGVmIE1BTkFHRV9QVFMKKwlwdHNfc3RvcChQVFNfVFlQRV9WSURFTyk7CisJcHRzX3N0b3AoUFRTX1RZUEVfQVVESU8pOworI2VuZGlmCisKK30KK0VYUE9SVF9TWU1CT0wocm1wYXJzZXJfcmVsZWFzZSk7CisKK3N0YXRpYyBpbmxpbmUgdTMyIGJ1Zl93cCh1MzIgdHlwZSkKK3sKKwlyZXR1cm4gKHR5cGUgPT0gQlVGX1RZUEVfVklERU8pID8gUkVBRF9WUkVHKFZMRF9NRU1fVklGSUZPX1dQKSA6CisJCSh0eXBlID09IEJVRl9UWVBFX0FVRElPKSA/CisJCVJFQURfQUlVX1JFRyhBSVVfTUVNX0FJRklGT19NQU5fV1ApIDoKKwkJUkVBRF9QQVJTRVJfUkVHKFBBUlNFUl9TVUJfU1RBUlRfUFRSKTsKK30KKworc3RhdGljIHNzaXplX3QgX3JtcGFyc2VyX3dyaXRlKGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzaXplX3QgciA9IGNvdW50OworCWNvbnN0IGNoYXIgX191c2VyICpwID0gYnVmOworCXUzMiBsZW47CisJaW50IHJldDsKKwlzdGF0aWMgaW50IGhhbHRfZHJvcGVkX2xlbjsKKwl1MzIgdndwLCBhd3A7CisJZG1hX2FkZHJfdCBkbWFfYWRkciA9IDA7CisKKwlpZiAociA+IDApIHsKKwkJbGVuID0gbWluX3Qoc2l6ZV90LCByLCBGRVRDSEJVRl9TSVpFKTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoZmV0Y2hidWYsIHAsIGxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJZG1hX2FkZHIgPQorCQkJZG1hX21hcF9zaW5nbGUoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCQlmZXRjaGJ1ZiwgRkVUQ0hCVUZfU0laRSwKKwkJCQkJRE1BX1RPX0RFVklDRSk7CisJCWlmIChkbWFfbWFwcGluZ19lcnJvcihhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksIGRtYV9hZGRyKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWZldGNoX2RvbmUgPSAwOworCisJCXdtYigpOyAvKiBFbnN1cmUgZmV0Y2hidWYgIGNvbnRlbnRzIHZpc2libGUgKi8KKwkJdndwID0gYnVmX3dwKEJVRl9UWVBFX1ZJREVPKTsKKwkJYXdwID0gYnVmX3dwKEJVRl9UWVBFX0FVRElPKTsKKwkJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfRkVUQ0hfQUREUiwgZG1hX2FkZHIpOworCisJCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX0ZFVENIX0NNRCwgKDcgPDwgRkVUQ0hfRU5ESUFOKSB8IGxlbik7CisJCWRtYV91bm1hcF9zaW5nbGUoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLCBkbWFfYWRkciwKKwkJCQkJCSBGRVRDSEJVRl9TSVpFLCBETUFfVE9fREVWSUNFKTsKKwkJcmV0ID0KKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHJtX3dxLCBmZXRjaF9kb25lICE9IDAsCisJCQkJCUhaIC8gMTApOworCQlpZiAocmV0ID09IDApIHsKKwkJCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX0ZFVENIX0NNRCwgMCk7CisJCQlwYXJzZV9oYWx0Kys7CisJCQlwcl9pbmZvCisJCQkoIndyaXRlIHRpbWVvdXQscmV0cnksaGFsdF9jb3VudD0lZCBwYXJzZV9jb250cm9sPSV4XG4iLAorCQkJIHBhcnNlX2hhbHQsIFJFQURfUEFSU0VSX1JFRyhQQVJTRVJfQ09OVFJPTCkpOworCisJCQkvL3ZyZWFsX3NldF9mYXRhbF9mbGFnKDEpOy8vREVCVUdfVE1QCisKKwkJCWlmIChwYXJzZV9oYWx0ID4gMTApIHsKKwkJCQlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9DT05UUk9MLAorCQkJCQkJKEVTX1NFQVJDSCB8IEVTX1BBUlNFUl9TVEFSVCkpOworCQkJCXByX2luZm8oInJlc2V0IHBhcnNlX2NvbnRyb2w9JXhcbiIsCisJCQkJCSAgIFJFQURfUEFSU0VSX1JFRyhQQVJTRVJfQ09OVFJPTCkpOworCQkJfQorCQkJcmV0dXJuIC1FQUdBSU47CisJCX0gZWxzZSBpZiAocmV0IDwgMCkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwkJaWYgKHZ3cCA9PSBidWZfd3AoQlVGX1RZUEVfVklERU8pCisJCQkmJiBhd3AgPT0gYnVmX3dwKEJVRl9UWVBFX0FVRElPKSkgeworCQkJc3RydWN0IHN0cmVhbV9idWZfcyAqdl9idWZfdCA9CisJCQkJZ2V0X2J1Zl9ieV90eXBlKEJVRl9UWVBFX1ZJREVPKTsKKwkJCXN0cnVjdCBzdHJlYW1fYnVmX3MgKmFfYnVmX3QgPQorCQkJCWdldF9idWZfYnlfdHlwZShCVUZfVFlQRV9BVURJTyk7CisJCQlpbnQgdl9zdF9sdiA9IHN0YnVmX2xldmVsKHZfYnVmX3QpOworCQkJaW50IGFfc3RfbHYgPSBzdGJ1Zl9sZXZlbChhX2J1Zl90KTsKKworCQkJaWYgKChwYXJzZV9oYWx0ICsgMSkgJSAxMCA9PSAxKSB7CisJCQkJcHJfaW5mbygiViZBIFdQIG5vdCBjaGFuZ2VkIGFmdGVyIHdyaXRlIik7CisJCQkJcHJfaW5mbygiLHZpZGVvICV4LT4leCIsIHZ3cCwKKwkJCQkJCWJ1Zl93cChCVUZfVFlQRV9WSURFTykpOworCQkJCXByX2luZm8oIixBdWRpbzoleC0tPiV4LHBhcnNlX2hhbHQ9JWRcbiIsCisJCQkJCQlhd3AsIGJ1Zl93cChCVUZfVFlQRV9BVURJTyksCisJCQkJCQlwYXJzZV9oYWx0KTsKKwkJCX0KKwkJCXBhcnNlX2hhbHQrKzsKKworLyogd3Agbm90IGNoYW5nZWQgLAorICoJCQkJCSAgd2UgdGhpbmsgaGF2ZSBidWdzIG9uIHBhcnNlciBub3cuCisgKi8KKwkJCWlmIChwYXJzZV9oYWx0ID4gMTAgJiYKKwkJCQkJKHZfc3RfbHYgPCAxMDAwIHx8IGFfc3RfbHYgPCAxMDApKSB7CisJCQkJLypyZXNldCB3aGlsZSBhdCAgbGVhc3Qgb25lIGlzIHVuZGVyZmxvdy4gKi8KKwkJCQlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9DT05UUk9MLAorCQkJCQkJKEVTX1NFQVJDSCB8IEVTX1BBUlNFUl9TVEFSVCkpOworCQkJCXByX2luZm8oInJlc2V0IHBhcnNlX2NvbnRyb2w9JXhcbiIsCisJCQkJCSAgIFJFQURfUEFSU0VSX1JFRyhQQVJTRVJfQ09OVFJPTCkpOworCQkJfQorCQkJaWYgKHBhcnNlX2hhbHQgPD0gMTAgfHwKKwkJCQloYWx0X2Ryb3BlZF9sZW4gPCAxMDAgKiAxMDI0KSB7CisJCQkJLypkcm9wcyBmaXJzdCAxMCBwa3QgLAorCQkJCSAqICBzb21lIHRpbWVzIG1heWJlIG5vIGF2IGRhdGEKKwkJCQkgKi8KKwkJCQlwcl9pbmZvKCJkcm9wIHRoaXMgcGt0PSVkLGxlbj0lZFxuIiwgcGFyc2VfaGFsdCwKKwkJCQkJICAgbGVuKTsKKwkJCQlwICs9IGxlbjsKKwkJCQlyIC09IGxlbjsKKwkJCQloYWx0X2Ryb3BlZF9sZW4gKz0gbGVuOworCQkJfSBlbHNlCisJCQkJcmV0dXJuIC1FQUdBSU47CisJCX0gZWxzZSB7CisJCQloYWx0X2Ryb3BlZF9sZW4gPSAwOworCQkJcGFyc2VfaGFsdCA9IDA7CisJCQlwICs9IGxlbjsKKwkJCXIgLT0gbGVuOworCQl9CisJfQorCXJldHVybiBjb3VudCAtIHI7Cit9CisKK3NzaXplX3Qgcm1wYXJzZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCSAgIHN0cnVjdCBzdHJlYW1fYnVmX3MgKnZidWYsCisJCQkJCSAgIHN0cnVjdCBzdHJlYW1fYnVmX3MgKmFidWYsCisJCQkJCSAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzMzIgcjsKKwlzdHJ1Y3QgcG9ydF9wcml2X3MgKnByaXYgPSAoc3RydWN0IHBvcnRfcHJpdl9zICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzdHJlYW1fcG9ydF9zICpwb3J0ID0gcHJpdi0+cG9ydDsKKwlzaXplX3QgdG93cml0ZSA9IGNvdW50OworCisJaWYgKChzdGJ1Zl9zcGFjZSh2YnVmKSA8IGNvdW50KSB8fCAoc3RidWZfc3BhY2UoYWJ1ZikgPCBjb3VudCkpIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQl0b3dyaXRlID0gbWluKHN0YnVmX3NwYWNlKHZidWYpLCBzdGJ1Zl9zcGFjZShhYnVmKSk7CisJCQlpZiAodG93cml0ZSA8IDEwMjQpCS8qPyBjYW4gd3JpdGUgc21hbGw/ICovCisJCQkJcmV0dXJuIC1FQUdBSU47CisJCX0gZWxzZSB7CisJCQlpZiAoKHBvcnQtPmZsYWcgJiBQT1JUX0ZMQUdfVklEKQorCQkJCSYmIChzdGJ1Zl9zcGFjZSh2YnVmKSA8IGNvdW50KSkgeworCQkJCXIgPSBzdGJ1Zl93YWl0X3NwYWNlKHZidWYsIGNvdW50KTsKKwkJCQlpZiAociA8IDApCisJCQkJCXJldHVybiByOworCQkJfQorCQkJaWYgKChwb3J0LT5mbGFnICYgUE9SVF9GTEFHX0FJRCkKKwkJCQkmJiAoc3RidWZfc3BhY2UoYWJ1ZikgPCBjb3VudCkpIHsKKwkJCQlyID0gc3RidWZfd2FpdF9zcGFjZShhYnVmLCBjb3VudCk7CisJCQkJaWYgKHIgPCAwKQorCQkJCQlyZXR1cm4gcjsKKwkJCX0KKwkJfQorCX0KKwl0b3dyaXRlID0gbWluKHRvd3JpdGUsIGNvdW50KTsKKwlyZXR1cm4gX3JtcGFyc2VyX3dyaXRlKGJ1ZiwgdG93cml0ZSk7Cit9CisKK3ZvaWQgcm1fc2V0X3Zhc2lkKHUzMiB2aWQsIHUzMiBhaWQpCit7CisJcHJfaW5mbygicm1fc2V0X3Zhc2lkIGFpZCAlZCwgdmlkICVkXG4iLCBhaWQsIHZpZCk7CisJV1JJVEVfUEFSU0VSX1JFRyhWQVNfU1RSRUFNX0lELCAoYWlkIDw8IDgpIHwgdmlkKTsKK30KKwordm9pZCBybV9hdWRpb19yZXNldCh2b2lkKQoreworCXVsb25nIGZsYWdzOworCURFRklORV9TUElOTE9DSyhsb2NrKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CisKKwlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9BVURJT19XUCwKKwkJCQkgICBSRUFEX0FJVV9SRUcoQUlVX01FTV9BSUZJRk9fU1RBUlRfUFRSKSk7CisJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfQVVESU9fUlAsCisJCQkJICAgUkVBRF9BSVVfUkVHKEFJVV9NRU1fQUlGSUZPX1NUQVJUX1BUUikpOworCisJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfQVVESU9fU1RBUlRfUFRSLAorCQkJCSAgIFJFQURfQUlVX1JFRyhBSVVfTUVNX0FJRklGT19TVEFSVF9QVFIpKTsKKwlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9BVURJT19FTkRfUFRSLAorCQkJCSAgIFJFQURfQUlVX1JFRyhBSVVfTUVNX0FJRklGT19FTkRfUFRSKSk7CisJQ0xFQVJfUEFSU0VSX1JFR19NQVNLKFBBUlNFUl9FU19DT05UUk9MLCBFU19BVURfTUFOX1JEX1BUUik7CisKKwlXUklURV9BSVVfUkVHKEFJVV9NRU1fQUlGSUZPX0JVRl9DTlRMLCBNRU1fQlVGQ1RSTF9JTklUKTsKKwlDTEVBUl9BSVVfUkVHX01BU0soQUlVX01FTV9BSUZJRk9fQlVGX0NOVEwsIE1FTV9CVUZDVFJMX0lOSVQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChybV9hdWRpb19yZXNldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvcm1wYXJzZXIuaCBiL2RyaXZlcnMvc3RyZWFtX2lucHV0L3BhcnNlci9ybXBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMjAyM2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvcm1wYXJzZXIuaApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9hbXBvcnRzL3JtcGFyc2VyLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBSTVBBUlNFUl9ICisjZGVmaW5lIFJNUEFSU0VSX0gKKworI2luY2x1ZGUgIi4uLy4uL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdmRlYy5oIgorCitleHRlcm4gdm9pZCBybV9zZXRfdmFzaWQodTMyIHZpZCwgdTMyIGFpZCk7CisKK2V4dGVybiBzc2l6ZV90IHJtcGFyc2VyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICp2YnVmLAorCQlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICphYnVmLAorCQljb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQpOworCitzMzIgcm1wYXJzZXJfaW5pdChzdHJ1Y3QgdmRlY19zICp2ZGVjKTsKKworZXh0ZXJuIHZvaWQgcm1wYXJzZXJfcmVsZWFzZSh2b2lkKTsKKworZXh0ZXJuIHZvaWQgcm1fYXVkaW9fcmVzZXQodm9pZCk7CisKK2V4dGVybiB2b2lkIHZyZWFsX3NldF9mYXRhbF9mbGFnKGludCBmbGFnKTsKKworI2lmZGVmIENPTkZJR19BTV9EVkIKK2V4dGVybiBpbnQgdHNkZW11eF9zZXRfcmVzZXRfZmxhZyh2b2lkKTsKKyNlbmRpZgorCisvKiBUT0RPOiBtb3ZlIHRvIHJlZ2lzdGVyIGhlYWRlcnMgKi8KKyNkZWZpbmUgRVNfUEFDS19TSVpFX0JJVCAgICAgICAgICAgICAgICA4CisjZGVmaW5lIEVTX1BBQ0tfU0laRV9XSUQgICAgICAgICAgICAgICAgMjQKKworI2RlZmluZSBFU19DVFJMX1dJRCAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgRVNfQ1RSTF9CSVQgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEVTX1RZUEVfTUFTSyAgICAgICAgICAgICAgICAgICAgKDMgPDwgNikKKyNkZWZpbmUgRVNfVFlQRV9WSURFTyAgICAgICAgICAgICAgICAgICAoMCA8PCA2KQorI2RlZmluZSBFU19UWVBFX0FVRElPICAgICAgICAgICAgICAgICAgICgxIDw8IDYpCisjZGVmaW5lIEVTX1RZUEVfU1VCVElUTEUgICAgICAgICAgICAgICAgKDIgPDwgNikKKworI2RlZmluZSBFU19XUklURSAgICAgICAgICAgICAgICAgICAgICAgICgxPDw1KQorI2RlZmluZSBFU19QQVNTVEhST1VHSCAgICAgICAgICAgICAgICAgICgxPDw0KQorI2RlZmluZSBFU19JTlNFUlRfQkVGT1JFX0VTX1dSSVRFICAgICAgICgxPDwzKQorI2RlZmluZSBFU19ESVNDQVJEICAgICAgICAgICAgICAgICAgICAgICgxPDwyKQorI2RlZmluZSBFU19TRUFSQ0ggICAgICAgICAgICAgICAgICAgICAgICgxPDwxKQorI2RlZmluZSBFU19QQVJTRVJfU1RBUlQgICAgICAgICAgICAgICAgICgxPDwwKQorI2RlZmluZSBFU19QQVJTRVJfQlVTWSAgICAgICAgICAgICAgICAgICgxPDwwKQorCisjZGVmaW5lIFBBUlNFUl9JTlRTVEFUX0ZFVENIX0NNRCAgICAoMTw8NykKKyNkZWZpbmUgUEFSU0VSX0lOVFNUQVRfUEFSU0UgICAgICAgICgxPDw0KQorI2RlZmluZSBQQVJTRVJfSU5UU1RBVF9ESVNDQVJEICAgICAgKDE8PDMpCisjZGVmaW5lIFBBUlNFUl9JTlRTVEFUX0lOU1pFUk8gICAgICAoMTw8MikKKyNkZWZpbmUgUEFSU0VSX0lOVFNUQVRfQUNUX05PU1NDICAgICgxPDwxKQorI2RlZmluZSBQQVJTRVJfSU5UU1RBVF9TQ19GT1VORCAgICAgKDE8PDApCisKKyNkZWZpbmUgRkVUQ0hfQ0lSX0JVRiAgICAgICAgICAgICAgICgxPDwzMSkKKyNkZWZpbmUgRkVUQ0hfQ0hLX0JVRl9TVE9QICAgICAgICAgICgxPDwzMCkKKyNkZWZpbmUgRkVUQ0hfUEFTU1RIUk9VR0ggICAgICAgICAgICgxPDwyOSkKKyNkZWZpbmUgRkVUQ0hfRU5ESUFOICAgICAgICAgICAgICAgIDI3CisjZGVmaW5lIEZFVENIX1BBU1NUSFJPVUdIX1RZUEVfTUFTSyAoMHgzPDwyNykKKyNkZWZpbmUgRkVUQ0hfRU5ESUFOX01BU0sgICAgICAgICAgICgweDc8PDI3KQorI2RlZmluZSBGRVRDSF9CVUZfU0laRV9NQVNLICAgICAgICAgKDB4N2ZmZmZmZikKKyNkZWZpbmUgRkVUQ0hfQ01EX1BUUl9NQVNLICAgICAgICAgIDMKKyNkZWZpbmUgRkVUQ0hfQ01EX1JEX1BUUl9CSVQgICAgICAgIDUKKyNkZWZpbmUgRkVUQ0hfQ01EX1dSX1BUUl9CSVQgICAgICAgIDMKKyNkZWZpbmUgRkVUQ0hfQ01EX05VTV9NQVNLICAgICAgICAgIDMKKyNkZWZpbmUgRkVUQ0hfQ01EX05VTV9CSVQgICAgICAgICAgIDAKKworI2RlZmluZSBFU19DT1VOVF9NQVNLICAgICAgICAgICAgICAgIDB4ZmZmCisjZGVmaW5lIEVTX0NPVU5UX0JJVCAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgRVNfUkVRX1BFTkRJTkcgICAgICAgICAgICAgICAoMTw8MTkpCisjZGVmaW5lIEVTX1BBU1NUSFJPVUdIX0VOICAgICAgICAgICAgKDE8PDE4KQorI2RlZmluZSBFU19QQVNTVEhST1VHSF9UWVBFX01BU0sgICAgICgzPDwxNikKKyNkZWZpbmUgRVNfUEFTU1RIUk9VR0hfVFlQRV9WSURFTyAgICAoMDw8MTYpCisjZGVmaW5lIEVTX1BBU1NUSFJPVUdIX1RZUEVfQVVESU8gICAgKDE8PDE2KQorI2RlZmluZSBFU19QQVNTVEhST1VHSF9UWVBFX1NVQlRJVExFICgyPDwxNikKKyNkZWZpbmUgRVNfV1JfRU5ESUFOX01BU0sgICAgICAgICAgICAoMHg3KQorI2RlZmluZSBFU19TVUJfV1JfRU5ESUFOX0JJVCAgICAgICAgIDkKKyNkZWZpbmUgRVNfU1VCX01BTl9SRF9QVFIgICAgICAgICAgICAoMTw8OCkKKyNkZWZpbmUgRVNfQVVEX1dSX0VORElBTl9CSVQgICAgICAgICA1CisjZGVmaW5lIEVTX0FVRF9NQU5fUkRfUFRSICAgICAgICAgICAgKDE8PDQpCisjZGVmaW5lIEVTX1ZJRF9XUl9FTkRJQU5fQklUICAgICAgICAgMQorI2RlZmluZSBFU19WSURfTUFOX1JEX1BUUiAgICAgICAgICAgICgxPDwwKQorCisjZGVmaW5lIFBTX0NGR19GRVRDSF9ETUFfVVJHRU5UICAgICAgICAgKDE8PDMxKQorI2RlZmluZSBQU19DRkdfU1RSRUFNX0RNQV9VUkdFTlQgICAgICAgICgxPDwzMCkKKyNkZWZpbmUgUFNfQ0ZHX0ZPUkNFX1BGSUZPX1JFTiAgICAgICAgICAoMTw8MjkpCisjZGVmaW5lIFBTX0NGR19QRklGT19QRUFLX0VOICAgICAgICAgICAgKDE8PDI4KQorI2RlZmluZSBQU19DRkdfU1JDX1NFTF9CSVQgICAgICAgICAgICAgIDI0CisjZGVmaW5lIFBTX0NGR19TUkNfU0VMX01BU0sgICAgICAgICAgICAgKDM8PFBTX0NGR19TUkNfU0VMX0JJVCkKKyNkZWZpbmUgUFNfQ0ZHX1NSQ19TRUxfRkVUQ0ggICAgICAgICAgICAoMDw8UFNfQ0ZHX1NSQ19TRUxfQklUKQorI2RlZmluZSBQU19DRkdfU1JDX1NFTF9BVVgxICAgICAgICAgICAgICgxPDxQU19DRkdfU1JDX1NFTF9CSVQpCS8qIGZyb20gTkRNQSAqLworI2RlZmluZSBQU19DRkdfU1JDX1NFTF9BVVgyICAgICAgICAgICAgICgyPDxQU19DRkdfU1JDX1NFTF9CSVQpCisjZGVmaW5lIFBTX0NGR19TUkNfU0VMX0FVWDMgICAgICAgICAgICAgKDM8PFBTX0NGR19TUkNfU0VMX0JJVCkKKyNkZWZpbmUgUFNfQ0ZHX1BGSUZPX0VNUFRZX0NOVF9CSVQgICAgICAxNgorI2RlZmluZSBQU19DRkdfUEZJRk9fRU1QVFlfQ05UX01BU0sgICAgIDB4ZmYKKyNkZWZpbmUgUFNfQ0ZHX01BWF9FU19XUl9DWUNMRV9CSVQgICAgICAxMgorI2RlZmluZSBQU19DRkdfTUFYX0VTX1dSX0NZQ0xFX01BU0sgICAgIDB4ZgorI2RlZmluZSBQU19DRkdfU1RBUlRDT0RFX1dJRF9NQVNLICAgICAgICgweDM8PDEwKQorI2RlZmluZSBQU19DRkdfU1RBUlRDT0RFX1dJRF84ICAgICAgICAgICgweDA8PDEwKQorI2RlZmluZSBQU19DRkdfU1RBUlRDT0RFX1dJRF8xNiAgICAgICAgICgweDE8PDEwKQorI2RlZmluZSBQU19DRkdfU1RBUlRDT0RFX1dJRF8yNCAgICAgICAgICgweDI8PDEwKQorI2RlZmluZSBQU19DRkdfU1RBUlRDT0RFX1dJRF8zMiAgICAgICAgICgweDM8PDEwKQorI2RlZmluZSBQU19DRkdfUEZJRk9fQUNDRVNTX1dJRF9NQVNLICAgICgweDM8PDgpCisjZGVmaW5lIFBTX0NGR19QRklGT19BQ0NFU1NfV0lEXzggICAgICAgKDB4MDw8OCkKKyNkZWZpbmUgUFNfQ0ZHX1BGSUZPX0FDQ0VTU19XSURfMTYgICAgICAoMHgxPDw4KQorI2RlZmluZSBQU19DRkdfUEZJRk9fQUNDRVNTX1dJRF8yNCAgICAgICgweDI8PDgpCisjZGVmaW5lIFBTX0NGR19QRklGT19BQ0NFU1NfV0lEXzMyICAgICAgKDB4Mzw8OCkKKyNkZWZpbmUgUFNfQ0ZHX01BWF9GRVRDSF9DWUNMRV9CSVQgICAgICAwCisjZGVmaW5lIFBTX0NGR19NQVhfRkVUQ0hfQ1lDTEVfTUFTSyAgICAgMHhmZgorCisjZGVmaW5lIFBBUlNFUl9JTlRfRElTQUJMRV9DTlRfTUFTSyAweGZmZmYKKyNkZWZpbmUgUEFSU0VSX0lOVF9ESVNBQkxFX0NOVF9CSVQgIDE2CisjZGVmaW5lIFBBUlNFUl9JTlRfSE9TVF9FTl9NQVNLICAgICAweGZmCisjZGVmaW5lIFBBUlNFUl9JTlRfSE9TVF9FTl9CSVQgICAgICA4CisjZGVmaW5lIFBBUlNFUl9JTlRfQU1SSVNDX0VOX01BU0sgICAweGZmCisjZGVmaW5lIFBBUlNFUl9JTlRfQU1SSVNDX0VOX0JJVCAgICAwCisjZGVmaW5lIFBBUlNFUl9JTlRfQUxMICAgICAgICAgICAgICAweGZmCisKKyNkZWZpbmUgUkVTRVRfUEFSU0VSICAgICAgICAoMTw8OCkKKyNkZWZpbmUgVFNfSElVX0VOQUJMRSAgICAgICAgICAgICAgNQorI2RlZmluZSBVU0VfSElfQlNGX0lOVEVSRkFDRSAgICAgICA3CisKKyNlbmRpZgkJCQkvKiBSTVBBUlNFUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvdHNkZW11eC5jIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL3RzZGVtdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWM5NGMwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL3RzZGVtdXguYwpAQCAtMCwwICsxLDEzMjQgQEAKKy8qCisgKiBkcml2ZXJzL2FtbG9naWMvbWVkaWEvc3RyZWFtX2lucHV0L3BhcnNlci90c2RlbXV4LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS9mcmFtZV9zeW5jL3B0c3NlcnYuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2ZyYW1lX3N5bmMvdHN5bmMuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL2Ftc3RyZWFtLmg+CisjaW5jbHVkZSA8bGludXgvYW1sb2dpYy9tZWRpYS92Zm0vdmZyYW1lX3Byb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKy8qICNpbmNsdWRlIDxtYWNoL2FtX3JlZ3MuaD4gKi8KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKy8qICNpZiBNRVNPTl9DUFVfVFlQRSA+PSBNRVNPTl9DUFVfVFlQRV9NRVNPTjYgKi8KKy8qICNpbmNsdWRlIDxtYWNoL21vZF9nYXRlLmg+ICovCisvKiAjZW5kaWYgKi8KKworI2luY2x1ZGUgIi4uLy4uL2ZyYW1lX3Byb3ZpZGVyL2RlY29kZXIvdXRpbHMvdmRlYy5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvdmRlY19yZWcuaD4KKyNpbmNsdWRlICIuLi9hbXBvcnRzL3N0cmVhbWJ1Zl9yZWcuaCIKKyNpbmNsdWRlICIuLi9hbXBvcnRzL3N0cmVhbWJ1Zi5oIgorI2luY2x1ZGUgPGxpbnV4L2FtbG9naWMvbWVkaWEvdXRpbHMvYW1wb3J0c19jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL2ZyYW1lX3N5bmMvdHN5bmNfcGNyLmg+CisKKyNpbmNsdWRlICJ0c2RlbXV4LmgiCisjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KKyNpbmNsdWRlICIuLi9hbXBvcnRzL2FtcG9ydHNfcHJpdi5oIgorCisjZGVmaW5lIE1BWF9EUk1fUEFDS0FHRV9TSVpFIDB4NTAwMDAwCisKKworTU9EVUxFX1BBUk1fREVTQyhyZXNldF9kZW11eF9lbmFibGUsICJcblx0XHQgUmVzZXQgZGVtdXggZW5hYmxlIik7CitzdGF0aWMgaW50IHJlc2V0X2RlbXV4X2VuYWJsZSA9IDA7Cittb2R1bGVfcGFyYW0ocmVzZXRfZGVtdXhfZW5hYmxlLCBpbnQsIDA2NDQpOworCitzdGF0aWMgY29uc3QgY2hhciB0c2RlbXV4X2ZldGNoX2lkW10gPSAidHNkZW11eC1mZXRjaC1pZCI7CitzdGF0aWMgY29uc3QgY2hhciB0c2RlbXV4X2lycV9pZFtdID0gInRzZGVtdXgtaXJxLWlkIjsKKworc3RhdGljIHUzMiBjdXJyX3Bjcl9udW0gPSAweGZmZmY7CitzdGF0aWMgdTMyIGN1cnJfdmlkX2lkID0gMHhmZmZmOworc3RhdGljIHUzMiBjdXJyX2F1ZF9pZCA9IDB4ZmZmZjsKK3N0YXRpYyB1MzIgY3Vycl9zdWJfaWQgPSAweGZmZmY7CitzdGF0aWMgdTMyIGN1cnJfcGNyX2lkID0gMHhmZmZmOworCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQod3EpOworc3RhdGljIHUzMiBmZXRjaF9kb25lOworc3RhdGljIHUzMiBkaXNjb250aW51ZWRfY291bnRlcjsKK3N0YXRpYyB1MzIgZmlyc3RfcGNyOworc3RhdGljIHU4IHBjcnNjcl92YWxpZDsKK3N0YXRpYyB1OCBwY3JhdWRpb192YWxpZDsKK3N0YXRpYyB1OCBwY3J2aWRlb192YWxpZDsKK3N0YXRpYyB1OCBwY3JfaW5pdF9mbGFnOworCitzdGF0aWMgaW50IGRlbXV4X3NraXBieXRlOworCitzdGF0aWMgc3RydWN0IHRzZGVtdXhfb3BzICpkZW11eF9vcHM7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRlbXV4X29wc19sb2NrKTsKKworc3RhdGljIGludCBlbmFibGVfZGVtdXhfZHJpdmVyKHZvaWQpCit7CisJcmV0dXJuIGRlbXV4X29wcyA/IDEgOiAwOworfQorCit2b2lkIHRzZGVtdXhfc2V0X29wcyhzdHJ1Y3QgdHNkZW11eF9vcHMgKm9wcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRlbXV4X29wc19sb2NrLCBmbGFncyk7CisJZGVtdXhfb3BzID0gb3BzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlbXV4X29wc19sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKHRzZGVtdXhfc2V0X29wcyk7CisKK2ludCB0c2RlbXV4X3NldF9yZXNldF9mbGFnX2V4dCh2b2lkKQoreworCWludCByID0gMDsKKworCWlmIChkZW11eF9vcHMgJiYgZGVtdXhfb3BzLT5zZXRfcmVzZXRfZmxhZykKKwkJciA9IGRlbXV4X29wcy0+c2V0X3Jlc2V0X2ZsYWcoKTsKKworCXJldHVybiByOworfQorCitpbnQgdHNkZW11eF9zZXRfcmVzZXRfZmxhZyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGVtdXhfb3BzX2xvY2ssIGZsYWdzKTsKKwlyID0gdHNkZW11eF9zZXRfcmVzZXRfZmxhZ19leHQoKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZW11eF9vcHNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgdHNkZW11eF9yZXNldCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHIgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRlbXV4X29wc19sb2NrLCBmbGFncyk7CisJaWYgKGRlbXV4X29wcyAmJiBkZW11eF9vcHMtPnJlc2V0KSB7CisJCXRzZGVtdXhfc2V0X3Jlc2V0X2ZsYWdfZXh0KCk7CisJCXIgPSBkZW11eF9vcHMtPnJlc2V0KCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlbXV4X29wc19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCB0c2RlbXV4X3JlcXVlc3RfaXJxKGlycV9oYW5kbGVyX3QgaGFuZGxlciwgdm9pZCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZW11eF9vcHNfbG9jaywgZmxhZ3MpOworCWlmIChkZW11eF9vcHMgJiYgZGVtdXhfb3BzLT5yZXF1ZXN0X2lycSkKKwkJciA9IGRlbXV4X29wcy0+cmVxdWVzdF9pcnEoaGFuZGxlciwgZGF0YSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVtdXhfb3BzX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IHRzZGVtdXhfZnJlZV9pcnEodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZW11eF9vcHNfbG9jaywgZmxhZ3MpOworCWlmIChkZW11eF9vcHMgJiYgZGVtdXhfb3BzLT5mcmVlX2lycSkKKwkJciA9IGRlbXV4X29wcy0+ZnJlZV9pcnEoKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZW11eF9vcHNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgdHNkZW11eF9zZXRfdmlkKGludCB2cGlkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHIgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRlbXV4X29wc19sb2NrLCBmbGFncyk7CisJaWYgKGRlbXV4X29wcyAmJiBkZW11eF9vcHMtPnNldF92aWQpCisJCXIgPSBkZW11eF9vcHMtPnNldF92aWQodnBpZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVtdXhfb3BzX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IHRzZGVtdXhfc2V0X2FpZChpbnQgYXBpZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZW11eF9vcHNfbG9jaywgZmxhZ3MpOworCWlmIChkZW11eF9vcHMgJiYgZGVtdXhfb3BzLT5zZXRfYWlkKQorCQlyID0gZGVtdXhfb3BzLT5zZXRfYWlkKGFwaWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlbXV4X29wc19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCB0c2RlbXV4X3NldF9zaWQoaW50IHNwaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgciA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGVtdXhfb3BzX2xvY2ssIGZsYWdzKTsKKwlpZiAoZGVtdXhfb3BzICYmIGRlbXV4X29wcy0+c2V0X3NpZCkKKwkJciA9IGRlbXV4X29wcy0+c2V0X3NpZChzcGlkKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZW11eF9vcHNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgdHNkZW11eF9zZXRfcGNyaWQoaW50IHBjcnBpZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZW11eF9vcHNfbG9jaywgZmxhZ3MpOworCWlmIChkZW11eF9vcHMgJiYgZGVtdXhfb3BzLT5zZXRfcGNyaWQpCisJCXIgPSBkZW11eF9vcHMtPnNldF9wY3JpZChwY3JwaWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlbXV4X29wc19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCB0c2RlbXV4X3NldF9za2lwX2J5dGUoaW50IHNraXBieXRlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHIgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRlbXV4X29wc19sb2NrLCBmbGFncyk7CisJaWYgKGRlbXV4X29wcyAmJiBkZW11eF9vcHMtPnNldF9za2lwYnl0ZSkKKwkJciA9IGRlbXV4X29wcy0+c2V0X3NraXBieXRlKHNraXBieXRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZW11eF9vcHNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgdHNkZW11eF9jb25maWcodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdHNkZW11eF9wY3Jfc2V0KHVuc2lnbmVkIGludCBwY3IpOworLypUT0RPIGlycSovCisvKiBiaXQgMTUgLS0tLS0tLS0tLS0tLS0tKi8KKy8qIGJpdCAxMiAtLVZJREVPX1BUU1szMl0qLworLyogYml0IDAgIC0tLS0tLS0tLS0tLS0tLSovCisvKlJlYWQgdGhlIDEzdGggYml0IG9mIFNUQl9QVFNfRFRTX1NUQVRVUyByZWdpc3RlcgorY29ycmVzcG9uZCB0byB0aGUgaGlnaGVzdCBiaXQgb2YgdmlkZW8gcHRzKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB0c2RlbXV4X2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJdTMyIGludF9zdGF0dXMgPSAwOworCWludCBpZCA9IChsb25nKWRldl9pZDsKKworCWlmICghZW5hYmxlX2RlbXV4X2RyaXZlcigpKSB7CisJCWludF9zdGF0dXMgPSBSRUFEX0RFTVVYX1JFRyhTVEJfSU5UX1NUQVRVUyk7CisJfSBlbHNlIHsKKwkJaWYgKGlkID09IDApCisJCQlpbnRfc3RhdHVzID0gUkVBRF9ERU1VWF9SRUcoU1RCX0lOVF9TVEFUVVMpOworCQllbHNlIGlmIChpZCA9PSAxKQorCQkJaW50X3N0YXR1cyA9IFJFQURfREVNVVhfUkVHKFNUQl9JTlRfU1RBVFVTXzIpOworCQllbHNlIGlmIChpZCA9PSAyKQorCQkJaW50X3N0YXR1cyA9IFJFQURfREVNVVhfUkVHKFNUQl9JTlRfU1RBVFVTXzMpOworCX0KKworCWlmIChpbnRfc3RhdHVzICYgKDEgPDwgTkVXX1BEVFNfUkVBRFkpKSB7CisJCWlmICghZW5hYmxlX2RlbXV4X2RyaXZlcigpKSB7CisJCQl1MzIgcGR0c19zdGF0dXMgPSBSRUFEX0RFTVVYX1JFRyhTVEJfUFRTX0RUU19TVEFUVVMpOworCQkJdTY0IHZwdHM7CisKKwkJCXZwdHMgPSBSRUFEX01QRUdfUkVHKFZJREVPX1BUU19ERU1VWCk7CisJCQl2cHRzICY9IDB4MDAwMDAwMDBGRkZGRkZGRjsKKwkJCWlmIChwZHRzX3N0YXR1cyAmIDB4MTAwMCkgeworCQkJCXZwdHMgPSB2cHRzIHwgKDFMTDw8MzIpOworCQkJfQorCisJCQlpZiAocGR0c19zdGF0dXMgJiAoMSA8PCBWSURFT19QVFNfUkVBRFkpKQorCQkJCXB0c19jaGVja2luX3dycHRyX3B0czMzKFBUU19UWVBFX1ZJREVPLAorCQkJCQlSRUFEX0RFTVVYX1JFRyhWSURFT19QRFRTX1dSX1BUUiksCisJCQkJCXZwdHMpOworCisJCQlpZiAocGR0c19zdGF0dXMgJiAoMSA8PCBBVURJT19QVFNfUkVBRFkpKQorCQkJCXB0c19jaGVja2luX3dycHRyKFBUU19UWVBFX0FVRElPLAorCQkJCQlSRUFEX0RFTVVYX1JFRyhBVURJT19QRFRTX1dSX1BUUiksCisJCQkJCVJFQURfREVNVVhfUkVHKEFVRElPX1BUU19ERU1VWCkpOworCisJCQlXUklURV9ERU1VWF9SRUcoU1RCX1BUU19EVFNfU1RBVFVTLCBwZHRzX3N0YXR1cyk7CisJCX0gZWxzZSB7CisjZGVmaW5lIERNWF9SRUFEX1JFRyhpLCByKVwKKwkoKGkpID8gKChpID09IDEpID8gUkVBRF9ERU1VWF9SRUcociMjXzIpIDogXAorCQlSRUFEX0RFTVVYX1JFRyhyIyNfMykpIDogUkVBRF9ERU1VWF9SRUcocikpCisJCQl1NjQgdnB0czsKKwkJCXUzMiBwZHRzX3N0YXR1cyA9IERNWF9SRUFEX1JFRyhpZCwgU1RCX1BUU19EVFNfU1RBVFVTKTsKKwkJCXZwdHMgPSBETVhfUkVBRF9SRUcoaWQsIFZJREVPX1BUU19ERU1VWCk7CisJCQl2cHRzICY9IDB4MDAwMDAwMDBGRkZGRkZGRjsKKwkJCWlmIChwZHRzX3N0YXR1cyAmIDB4MTAwMCkgeworCQkJCXZwdHMgPSB2cHRzIHwgKDFMTDw8MzIpOworCQkJfQorCisJCQlpZiAocGR0c19zdGF0dXMgJiAoMSA8PCBWSURFT19QVFNfUkVBRFkpKQorCQkJCXB0c19jaGVja2luX3dycHRyX3B0czMzKFBUU19UWVBFX1ZJREVPLAorCQkJCQlETVhfUkVBRF9SRUcoaWQsIFZJREVPX1BEVFNfV1JfUFRSKSwKKwkJCQkJdnB0cyk7CisKKwkJCWlmIChwZHRzX3N0YXR1cyAmICgxIDw8IEFVRElPX1BUU19SRUFEWSkpCisJCQkJcHRzX2NoZWNraW5fd3JwdHIoUFRTX1RZUEVfQVVESU8sCisJCQkJCURNWF9SRUFEX1JFRyhpZCwgQVVESU9fUERUU19XUl9QVFIpLAorCQkJCQlETVhfUkVBRF9SRUcoaWQsIEFVRElPX1BUU19ERU1VWCkpOworCisJCQlpZiAoaWQgPT0gMSkKKwkJCQlXUklURV9ERU1VWF9SRUcoU1RCX1BUU19EVFNfU1RBVFVTXzIsCisJCQkJCQkJcGR0c19zdGF0dXMpOworCQkJZWxzZSBpZiAoaWQgPT0gMikKKwkJCQlXUklURV9ERU1VWF9SRUcoU1RCX1BUU19EVFNfU1RBVFVTXzMsCisJCQkJCQkJcGR0c19zdGF0dXMpOworCQkJZWxzZQorCQkJCVdSSVRFX0RFTVVYX1JFRyhTVEJfUFRTX0RUU19TVEFUVVMsCisJCQkJCQkJcGR0c19zdGF0dXMpOworCQl9CisJfQorCWlmIChpbnRfc3RhdHVzICYgKDEgPDwgRElTX0NPTlRJTlVJVFlfUEFDS0VUKSkgeworCQlkaXNjb250aW51ZWRfY291bnRlcisrOworCQkvKiBwcl9pbmZvKCJkaXNjb250aW51ZWQgY291bnRlcj0lZFxuIixkaXNjb250aW51ZWRfY291bnRlcik7ICovCisJfQorCWlmIChpbnRfc3RhdHVzICYgKDEgPDwgU1VCX1BFU19SRUFEWSkpIHsKKwkJLyogVE9ETzogcHV0IGRhdGEgdG8gc29tZXdoZXJlICovCisJCS8qIHByX2luZm8oInN1YnRpdGxlIHBlcyByZWFkeVxuIik7ICovCisJCXdha2V1cF9zdWJfcG9sbCgpOworCX0KKwlpZiAoaW50X3N0YXR1cyAmICgxPDxQQ1JfUkVBRFkpKSB7CisJCXVuc2lnbmVkIGludCBwY3JfcHRzID0gMHhmZmZmZmZmZjsKKwkJcGNyX3B0cyA9IERNWF9SRUFEX1JFRyhpZCwgUENSX0RFTVVYKTsKKwkJdHNkZW11eF9wY3Jfc2V0KHBjcl9wdHMpOworCX0KKworCWlmICghZW5hYmxlX2RlbXV4X2RyaXZlcigpKQorCQlXUklURV9ERU1VWF9SRUcoU1RCX0lOVF9TVEFUVVMsIGludF9zdGF0dXMpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgcGFyc2VyX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJdTMyIGludF9zdGF0dXMgPSBSRUFEX1BBUlNFUl9SRUcoUEFSU0VSX0lOVF9TVEFUVVMpOworCisJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfSU5UX1NUQVRVUywgaW50X3N0YXR1cyk7CisKKwlpZiAoaW50X3N0YXR1cyAmIFBBUlNFUl9JTlRTVEFUX0ZFVENIX0NNRCkgeworCQlmZXRjaF9kb25lID0gMTsKKworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJndxKTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IF90c2RlbXV4X3dyaXRlKGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKKwkJCQkJCQkgIGludCBpc3BoeWJ1ZikKK3sKKwlzaXplX3QgciA9IGNvdW50OworCWNvbnN0IGNoYXIgX191c2VyICpwID0gYnVmOworCXUzMiBsZW47CisJaW50IHJldDsKKwlkbWFfYWRkcl90IGRtYV9hZGRyID0gMDsKKworCWlmIChyID4gMCkgeworCQlpZiAoaXNwaHlidWYpCisJCQlsZW4gPSBjb3VudDsKKwkJZWxzZSB7CisJCQlsZW4gPSBtaW5fdChzaXplX3QsIHIsIEZFVENIQlVGX1NJWkUpOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGZldGNoYnVmLCBwLCBsZW4pKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlkbWFfYWRkciA9CisJCQkJZG1hX21hcF9zaW5nbGUoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLAorCQkJCQkJZmV0Y2hidWYsCisJCQkJCQlGRVRDSEJVRl9TSVpFLCBETUFfVE9fREVWSUNFKTsKKwkJCWlmIChkbWFfbWFwcGluZ19lcnJvcihhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksCisJCQkJCQlkbWFfYWRkcikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKworCQl9CisKKwkJZmV0Y2hfZG9uZSA9IDA7CisKKwkJd21iKCk7CQkvKiBFbnN1cmUgZmV0Y2hidWYgIGNvbnRlbnRzIHZpc2libGUgKi8KKworCQlpZiAoaXNwaHlidWYpIHsKKwkJCXUzMiBidWZfMzIgPSAodW5zaWduZWQgbG9uZylidWYgJiAweGZmZmZmZmZmOworCQkJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfRkVUQ0hfQUREUiwgYnVmXzMyKTsKKwkJfSBlbHNlIHsKKwkJCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX0ZFVENIX0FERFIsIGRtYV9hZGRyKTsKKwkJCWRtYV91bm1hcF9zaW5nbGUoYW1wb3J0c19nZXRfZG1hX2RldmljZSgpLCBkbWFfYWRkciwKKwkJCQkJRkVUQ0hCVUZfU0laRSwgRE1BX1RPX0RFVklDRSk7CisJCX0KKworCQlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9GRVRDSF9DTUQsICg3IDw8IEZFVENIX0VORElBTikgfCBsZW4pOworCisKKwkJcmV0ID0KKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHdxLCBmZXRjaF9kb25lICE9IDAsCisJCQkJCUhaIC8gMik7CisJCWlmIChyZXQgPT0gMCkgeworCQkJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfRkVUQ0hfQ01ELCAwKTsKKwkJCXByX2luZm8oIndyaXRlIHRpbWVvdXQsIHJldHJ5XG4iKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9IGVsc2UgaWYgKHJldCA8IDApCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJCXAgKz0gbGVuOworCQlyIC09IGxlbjsKKwl9CisKKwlyZXR1cm4gY291bnQgLSByOworfQorCisjZGVmaW5lIFBDUl9FTiAgICAgICAgICAgICAgICAgICAgIDEyCisKK3N0YXRpYyBpbnQgcmVzZXRfcGNyX3JlZ3Modm9pZCkKK3sKKwl1MzIgcGNyX251bTsKKwl1MzIgcGNyX3JlZ3MgPSAwOworCWlmIChjdXJyX3Bjcl9pZCA+PSAweDFGRkYpCisJCXJldHVybiAwOworCS8qIHNldCBwYXJhbWF0ZXIgdG8gZmV0Y2ggcGNyICovCisJcGNyX251bSA9IDA7CisJaWYgKGN1cnJfcGNyX2lkID09IGN1cnJfdmlkX2lkKQorCQlwY3JfbnVtID0gMDsKKwllbHNlIGlmIChjdXJyX3Bjcl9pZCA9PSBjdXJyX2F1ZF9pZCkKKwkJcGNyX251bSA9IDE7CisJZWxzZSBpZiAoY3Vycl9wY3JfaWQgPT0gY3Vycl9zdWJfaWQpCisJCXBjcl9udW0gPSAyOworCWVsc2UKKwkJcGNyX251bSA9IDM7CisJaWYgKHBjcl9udW0gIT0gY3Vycl9wY3JfbnVtKSB7CisJCXUzMiBjbGtfdW5pdCA9IDA7CisJCXUzMiBjbGtfODEgPSAwOworCQlzdHJ1Y3QgY2xrICpjbGs7CisJCS8vY2xrID0gY2xrX2dldChOVUxMLCJjbGs4MSIpOworCQljbGs9IGRldm1fY2xrX2dldChhbXBvcnRzX2dldF9kbWFfZGV2aWNlKCksImNsa184MSIpOworCQlpZiAoSVNfRVJSKGNsaykgfHwgY2xrID09IDApIHsKKwkJCXByX2luZm8oIlslczolZF0gZXJyb3IgY2xvY2tcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljbGtfODEgPSBjbGtfZ2V0X3JhdGUoY2xrKTsKKwkJY2xrX3VuaXQgPSBjbGtfODEgLyA5MDAwMDsKKwkJcHJfaW5mbygiWyVzOiVkXSBjbGtfODEgPSAleCBjbGtfdW5pdCA9JXhcbiIsIF9fZnVuY19fLAorCQkJCV9fTElORV9fLCBjbGtfODEsIGNsa191bml0KTsKKwkJcGNyX3JlZ3MgPSAxIDw8IFBDUl9FTiB8IGNsa191bml0OworCQlwcl9pbmZvKCJbdHNkZW11eF9pbml0XSB0aGUgc2V0IHBjcl9yZWdzID0leFxuIiwgcGNyX3JlZ3MpOworCQlpZiAoUkVBRF9ERU1VWF9SRUcoVFNfSElVX0NUTF8yKSAmIDB4ODApIHsKKwkJCVdSSVRFX0RFTVVYX1JFRyhQQ1I5MEtfQ1RMXzIsIHBjcl9yZWdzKTsKKwkJCVdSSVRFX0RFTVVYX1JFRyhBU1NJR05fUElEX05VTUJFUl8yLCBwY3JfbnVtKTsKKwkJCXByX2luZm8oIlt0c2RlbXV4X2luaXRdIFRvIHVzZSBkZXZpY2UgMixwY3JfbnVtPSVkXG4iLAorCQkJCQlwY3JfbnVtKTsKKwkJCXByX2luZm8oInRzZGVtdXhfaW5pdF0gdGhlIHJlYWQgIHBjcl9yZWdzPSAleFxuIiwKKwkJCQlSRUFEX0RFTVVYX1JFRyhQQ1I5MEtfQ1RMXzIpKTsKKwkJfSBlbHNlIGlmIChSRUFEX0RFTVVYX1JFRyhUU19ISVVfQ1RMXzMpICYgMHg4MCkgeworCQkJV1JJVEVfREVNVVhfUkVHKFBDUjkwS19DVExfMywgcGNyX3JlZ3MpOworCQkJV1JJVEVfREVNVVhfUkVHKEFTU0lHTl9QSURfTlVNQkVSXzMsIHBjcl9udW0pOworCQkJcHJfaW5mbygiW3RzZGVtdXhfaW5pdF0gVG8gdXNlIGRldmljZSAzLHBjcl9udW09JWRcbiIsCisJCQkJCXBjcl9udW0pOworCQkJcHJfaW5mbygidHNkZW11eF9pbml0XSB0aGUgcmVhZCAgcGNyX3JlZ3M9ICV4XG4iLAorCQkJCVJFQURfREVNVVhfUkVHKFBDUjkwS19DVExfMykpOworCQl9IGVsc2UgeworCQkJV1JJVEVfREVNVVhfUkVHKFBDUjkwS19DVEwsIHBjcl9yZWdzKTsKKwkJCVdSSVRFX0RFTVVYX1JFRyhBU1NJR05fUElEX05VTUJFUiwgcGNyX251bSk7CisJCQlwcl9pbmZvKCJbdHNkZW11eF9pbml0XSBUbyB1c2UgZGV2aWNlIDEscGNyX251bT0lZFxuIiwKKwkJCQkJcGNyX251bSk7CisJCQlwcl9pbmZvKCJ0c2RlbXV4X2luaXRdIHRoZSByZWFkICBwY3JfcmVncz0gJXhcbiIsCisJCQkJUkVBRF9ERU1VWF9SRUcoUENSOTBLX0NUTCkpOworCQl9CisJCWN1cnJfcGNyX251bSA9IHBjcl9udW07CisJfQorCXJldHVybiAxOworfQorCitzMzIgdHNkZW11eF9pbml0KHUzMiB2aWQsIHUzMiBhaWQsIHUzMiBzaWQsIHUzMiBwY3JpZCwgYm9vbCBpc19oZXZjLAorCQlzdHJ1Y3QgdmRlY19zICp2ZGVjKQoreworCXMzMiByOworCXUzMiBwYXJzZXJfc3ViX3N0YXJ0X3B0cjsKKwl1MzIgcGFyc2VyX3N1Yl9lbmRfcHRyOworCXUzMiBwYXJzZXJfc3ViX3JwOworCXBjcnZpZGVvX3ZhbGlkID0gMDsKKwlwY3JhdWRpb192YWxpZCA9IDA7CisJcGNyX2luaXRfZmxhZyA9IDA7CisKKwkvKiAjaWYgTUVTT05fQ1BVX1RZUEUgPj0gTUVTT05fQ1BVX1RZUEVfTUVTT042ICovCisJLypUT0RPIGNsayAqLworCS8qCisJICpzd2l0Y2hfbW9kX2dhdGVfYnlfdHlwZShNT0RfREVNVVgsIDEpOworCSAqLworCS8qICNlbmRpZiAqLworCisJYW1wb3J0c19zd2l0Y2hfZ2F0ZSgiZGVtdXgiLCAxKTsKKworCXBhcnNlcl9zdWJfc3RhcnRfcHRyID0gUkVBRF9QQVJTRVJfUkVHKFBBUlNFUl9TVUJfU1RBUlRfUFRSKTsKKwlwYXJzZXJfc3ViX2VuZF9wdHIgPSBSRUFEX1BBUlNFUl9SRUcoUEFSU0VSX1NVQl9FTkRfUFRSKTsKKwlwYXJzZXJfc3ViX3JwID0gUkVBRF9QQVJTRVJfUkVHKFBBUlNFUl9TVUJfUlApOworCisJV1JJVEVfUkVTRVRfUkVHKFJFU0VUMV9SRUdJU1RFUiwgUkVTRVRfUEFSU0VSKTsKKworCWlmIChlbmFibGVfZGVtdXhfZHJpdmVyKCkpIHsKKwkJdHNkZW11eF9yZXNldCgpOworCX0gZWxzZSB7CisJCVdSSVRFX1JFU0VUX1JFRyhSRVNFVDFfUkVHSVNURVIsIFJFU0VUX1BBUlNFUiB8IFJFU0VUX0RFTVVYU1RCKTsKKworCQlXUklURV9ERU1VWF9SRUcoU1RCX1RPUF9DT05GSUcsIDApOworCQlXUklURV9ERU1VWF9SRUcoREVNVVhfQ09OVFJPTCwgMCk7CisJfQorCisJLyogc2V0IFBJRCBmaWx0ZXIgKi8KKwlwcl9pbmZvCisJCSgidHNkZW11eCB2aWRlb19waWQgPSAweCV4LCBhdWRpb19waWQgPSAweCV4LCIsCisJCSB2aWQsIGFpZCk7CisJcHJfaW5mbworCQkoInN1Yl9waWQgPSAweCV4LCBwY3JpZCA9IDB4JXhcbiIsCisJCSBzaWQsIHBjcmlkKTsKKworCWlmICghZW5hYmxlX2RlbXV4X2RyaXZlcigpKSB7CisJCVdSSVRFX0RFTVVYX1JFRyhGTV9XUl9EQVRBLAorCQkJCSgoKHZpZCA8IDB4MWZmZikKKwkJCQkJPyAodmlkICYgMHgxZmZmKSB8IChWSURFT19QQUNLRVQgPDwgMTMpCisJCQkJCTogMHhmZmZmKSA8PCAxNikKKwkJCQl8ICgoYWlkIDwgMHgxZmZmKQorCQkJCQk/IChhaWQgJiAweDFmZmYpIHwgKEFVRElPX1BBQ0tFVCA8PCAxMykKKwkJCQkJOiAweGZmZmYpKTsKKwkJV1JJVEVfREVNVVhfUkVHKEZNX1dSX0FERFIsIDB4ODAwMCk7CisJCXdoaWxlIChSRUFEX0RFTVVYX1JFRyhGTV9XUl9BRERSKSAmIDB4ODAwMCkKKwkJCTsKKworCQlXUklURV9ERU1VWF9SRUcoRk1fV1JfREFUQSwKKwkJCQkoKChzaWQgPCAweDFmZmYpCisJCQkJCT8gKHNpZCAmIDB4MWZmZikgfCAoU1VCX1BBQ0tFVCA8PCAxMykKKwkJCQkJOiAweGZmZmYpIDw8IDE2KQorCQkJCXwgMHhmZmZmKTsKKwkJV1JJVEVfREVNVVhfUkVHKEZNX1dSX0FERFIsIDB4ODAwMSk7CisJCXdoaWxlIChSRUFEX0RFTVVYX1JFRyhGTV9XUl9BRERSKSAmIDB4ODAwMCkKKwkJCTsKKworCQlXUklURV9ERU1VWF9SRUcoTUFYX0ZNX0NPTVBfQUREUiwgMSk7CisKKwkJV1JJVEVfREVNVVhfUkVHKFNUQl9JTlRfTUFTSywgMCk7CisJCVdSSVRFX0RFTVVYX1JFRyhTVEJfSU5UX1NUQVRVUywgMHhmZmZmKTsKKworCQkvKiBUUyBkYXRhIHBhdGggKi8KKwkJV1JJVEVfREVNVVhfUkVHKEZFQ19JTlBVVF9DT05UUk9MLCAweDcwMDApOworCQlXUklURV9ERU1VWF9SRUcoREVNVVhfTUVNX1JFUV9FTiwKKwkJCQkoMSA8PCBWSURFT19QQUNLRVQpIHwKKwkJCQkoMSA8PCBBVURJT19QQUNLRVQpIHwgKDEgPDwgU1VCX1BBQ0tFVCkpOworCQlXUklURV9ERU1VWF9SRUcoREVNVVhfRU5ESUFOLAorCQkJCSg3IDw8IE9USEVSX0VORElBTikgfAorCQkJCSg3IDw8IEJZUEFTU19FTkRJQU4pIHwgKDAgPDwgU0VDVElPTl9FTkRJQU4pKTsKKwkJV1JJVEVfREVNVVhfUkVHKFRTX0hJVV9DVEwsIDEgPDwgVVNFX0hJX0JTRl9JTlRFUkZBQ0UpOworCQlXUklURV9ERU1VWF9SRUcoVFNfRklMRV9DT05GSUcsCisJCQkJKGRlbXV4X3NraXBieXRlIDw8IDE2KSB8CisJCQkJKDYgPDwgREVTX09VVF9ETFkpIHwKKwkJCQkoMyA8PCBUUkFOU1BPUlRfU0NSQU1CTElOR19DT05UUk9MX09ERCkgfAorCQkJCSgxIDw8IFRTX0hJVV9FTkFCTEUpIHwgKDQgPDwgRkVDX0ZJTEVfQ0xLX0RJVikpOworCisJCS8qIGVuYWJsZSBUUyBkZW11eCAqLworCQlXUklURV9ERU1VWF9SRUcoREVNVVhfQ09OVFJPTCwKKwkJCQkoMSA8PCBTVEJfREVNVVhfRU5BQkxFKSB8CisJCQkJKDEgPDwgS0VFUF9EVVBMSUNBVEVfUEFDS0FHRSkpOworCX0KKworCWlmIChmZXRjaGJ1ZiA9PSAwKSB7CisJCXByX2luZm8oIiVzOiBubyBmZXRjaGJ1ZlxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBob29rIHN0cmVhbSBidWZmZXIgd2l0aCBQQVJTRVIgKi8KKwlpZiAoaGFzX2hldmNfdmRlYygpICYmIGlzX2hldmMpIHsKKwkJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfVklERU9fU1RBUlRfUFRSLCB2ZGVjLT5pbnB1dC5zdGFydCk7CisJCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX1ZJREVPX0VORF9QVFIsIHZkZWMtPmlucHV0LnN0YXJ0ICsKKwkJCXZkZWMtPmlucHV0LnNpemUgLSA4KTsKKworCQlpZiAodmRlY19zaW5nbGUodmRlYykpIHsKKwkJCUNMRUFSX1BBUlNFUl9SRUdfTUFTSyhQQVJTRVJfRVNfQ09OVFJPTCwKKwkJCQkJRVNfVklEX01BTl9SRF9QVFIpOworCQkJLyogc2V0IHZpZmlmb192YnVmX3JwX3NlbD0+aGV2YyAqLworCQkJV1JJVEVfVlJFRyhET1NfR0VOX0NUUkwwLCAzIDw8IDEpOworCQkJLyogc2V0IHVzZV9wYXJzZXJfdmJ1Zl93cCAqLworCQkJU0VUX1ZSRUdfTUFTSyhIRVZDX1NUUkVBTV9DT05UUk9MLAorCQkJCQkgICgxIDw8IDMpIHwgKDAgPDwgNCkpOworCQkJLyogc2V0IHN0cmVhbV9mZXRjaF9lbmFibGUgKi8KKwkJCVNFVF9WUkVHX01BU0soSEVWQ19TVFJFQU1fQ09OVFJPTCwgMSk7CisJCQkvKiBzZXQgc3RyZWFtX2J1ZmZlcl9ob2xlIHdpdGggMjU2IGJ5dGVzICovCisJCQlTRVRfVlJFR19NQVNLKEhFVkNfU1RSRUFNX0ZJRk9fQ1RMLAorCQkJCQkgICgxIDw8IDI5KSk7CisJCX0gZWxzZSB7CisJCQlTRVRfUEFSU0VSX1JFR19NQVNLKFBBUlNFUl9FU19DT05UUk9MLAorCQkJCQlFU19WSURfTUFOX1JEX1BUUik7CisJCQlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9WSURFT19XUCwgdmRlYy0+aW5wdXQuc3RhcnQpOworCQkJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfVklERU9fUlAsIHZkZWMtPmlucHV0LnN0YXJ0KTsKKwkJfQorCX0gZWxzZSB7CisJCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX1ZJREVPX1NUQVJUX1BUUiwgdmRlYy0+aW5wdXQuc3RhcnQpOworCQlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9WSURFT19FTkRfUFRSLCB2ZGVjLT5pbnB1dC5zdGFydCArCisJCQl2ZGVjLT5pbnB1dC5zaXplIC0gOCk7CisKKwkJaWYgKHZkZWNfc2luZ2xlKHZkZWMpKSB7CisJCQlDTEVBUl9QQVJTRVJfUkVHX01BU0soUEFSU0VSX0VTX0NPTlRST0wsCisJCQkJCUVTX1ZJRF9NQU5fUkRfUFRSKTsKKworCQkJV1JJVEVfVlJFRyhWTERfTUVNX1ZJRklGT19CVUZfQ05UTCwgTUVNX0JVRkNUUkxfSU5JVCk7CisJCQlDTEVBUl9WUkVHX01BU0soVkxEX01FTV9WSUZJRk9fQlVGX0NOVEwsCisJCQkJCU1FTV9CVUZDVFJMX0lOSVQpOworCQkJLyogc2V0IHZpZmlmb192YnVmX3JwX3NlbD0+dmRlYyAqLworCQkJaWYgKGhhc19oZXZjX3ZkZWMoKSkKKwkJCQlXUklURV9WUkVHKERPU19HRU5fQ1RSTDAsIDApOworCQl9IGVsc2UgeworCQkJU0VUX1BBUlNFUl9SRUdfTUFTSyhQQVJTRVJfRVNfQ09OVFJPTCwKKwkJCQkJRVNfVklEX01BTl9SRF9QVFIpOworCQkJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfVklERU9fV1AsIHZkZWMtPmlucHV0LnN0YXJ0KTsKKwkJCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX1ZJREVPX1JQLCB2ZGVjLT5pbnB1dC5zdGFydCk7CisJCX0KKwl9CisKKwlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9BVURJT19TVEFSVF9QVFIsCisJCQkJICAgUkVBRF9BSVVfUkVHKEFJVV9NRU1fQUlGSUZPX1NUQVJUX1BUUikpOworCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX0FVRElPX0VORF9QVFIsCisJCQkJICAgUkVBRF9BSVVfUkVHKEFJVV9NRU1fQUlGSUZPX0VORF9QVFIpKTsKKwlDTEVBUl9QQVJTRVJfUkVHX01BU0soUEFSU0VSX0VTX0NPTlRST0wsIEVTX0FVRF9NQU5fUkRfUFRSKTsKKworCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX0NPTkZJRywKKwkJCQkgICAoMTAgPDwgUFNfQ0ZHX1BGSUZPX0VNUFRZX0NOVF9CSVQpIHwKKwkJCQkgICAoMSA8PCBQU19DRkdfTUFYX0VTX1dSX0NZQ0xFX0JJVCkgfAorCQkJCSAgICgxNiA8PCBQU19DRkdfTUFYX0ZFVENIX0NZQ0xFX0JJVCkpOworCisJV1JJVEVfQUlVX1JFRyhBSVVfTUVNX0FJRklGT19CVUZfQ05UTCwgTUVNX0JVRkNUUkxfSU5JVCk7CisJQ0xFQVJfQUlVX1JFR19NQVNLKEFJVV9NRU1fQUlGSUZPX0JVRl9DTlRMLCBNRU1fQlVGQ1RSTF9JTklUKTsKKworCWlmICghZW5hYmxlX2RlbXV4X2RyaXZlcigpIHx8ICgoc2lkID4gMCkgJiYgKHNpZCA8IDB4MWZmZikpKSB7CisJCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX1NVQl9TVEFSVF9QVFIsIHBhcnNlcl9zdWJfc3RhcnRfcHRyKTsKKwkJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfU1VCX0VORF9QVFIsIHBhcnNlcl9zdWJfZW5kX3B0cik7CisJCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX1NVQl9SUCwgcGFyc2VyX3N1Yl9ycCk7CisJfQorCVNFVF9QQVJTRVJfUkVHX01BU0soUEFSU0VSX0VTX0NPTlRST0wsCisJCQkoNyA8PCBFU19TVUJfV1JfRU5ESUFOX0JJVCkgfCBFU19TVUJfTUFOX1JEX1BUUik7CisKKwkvKiAjaWYgTUVTT05fQ1BVX1RZUEUgPj0gTUVTT05fQ1BVX1RZUEVfTUVTT044ICovCisJaWYgKHZpZCAhPSAweGZmZmYpIHsKKwkJaWYgKGhhc19oZXZjX3ZkZWMoKSkKKwkJCXIgPSBwdHNfc3RhcnQoKGlzX2hldmMpID8gUFRTX1RZUEVfSEVWQyA6IFBUU19UWVBFX1ZJREVPKTsKKwkJZWxzZQorCQkJLyogI2VuZGlmICovCisJCQlyID0gcHRzX3N0YXJ0KFBUU19UWVBFX1ZJREVPKTsKKwkJaWYgKChyIDwgMCkgJiYgKHIgIT0gLUVCVVNZKSkgeworCQkJcHJfaW5mbygiVmlkZW8gcHRzIHN0YXJ0IGZhaWxlZC4oJWQpXG4iLCByKTsKKwkJCWdvdG8gZXJyMTsKKwkJfQorCX0KKworCWlmIChhaWQgIT0gMHhmZmZmKSB7CisJCXIgPSBwdHNfc3RhcnQoUFRTX1RZUEVfQVVESU8pOworCQlpZiAoKHIgPCAwKSAmJiAociAhPSAtRUJVU1kpKSB7CisJCQlwcl9pbmZvKCJBdWRpbyBwdHMgc3RhcnQgZmFpbGVkLiglZClcbiIsIHIpOworCQkJZ290byBlcnIyOworCQl9CisJfQorCS8qVE9ETyBpcnEgKi8KKworCXIgPSB2ZGVjX3JlcXVlc3RfaXJxKFBBUlNFUl9JUlEsIHBhcnNlcl9pc3IsCisJCQkidHNkZW11eC1mZXRjaCIsICh2b2lkICopdHNkZW11eF9mZXRjaF9pZCk7CisKKwlpZiAocikKKwkJZ290byBlcnIzOworCisJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfSU5UX1NUQVRVUywgMHhmZmZmKTsKKwlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9JTlRfRU5BQkxFLAorCQkJUEFSU0VSX0lOVFNUQVRfRkVUQ0hfQ01EIDw8IFBBUlNFUl9JTlRfSE9TVF9FTl9CSVQpOworCisJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfVklERU9fSE9MRSwgMHg0MDApOworCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX0FVRElPX0hPTEUsIDB4NDAwKTsKKworCWRpc2NvbnRpbnVlZF9jb3VudGVyID0gMDsKKworCWlmICghZW5hYmxlX2RlbXV4X2RyaXZlcigpKSB7CisJCS8qVE9ETyBpcnEgKi8KKworCQlyID0gdmRlY19yZXF1ZXN0X2lycShERU1VWF9JUlEsIHRzZGVtdXhfaXNyLAorCQkJCSJ0c2RlbXV4LWlycSIsICh2b2lkICopdHNkZW11eF9pcnFfaWQpOworCisJCVdSSVRFX0RFTVVYX1JFRyhTVEJfSU5UX01BU0ssICgxIDw8IFNVQl9QRVNfUkVBRFkpCisJCQkJCSAgIHwgKDEgPDwgTkVXX1BEVFNfUkVBRFkpCisJCQkJCSAgIHwgKDEgPDwgRElTX0NPTlRJTlVJVFlfUEFDS0VUKSk7CisJCWlmIChyKQorCQkJZ290byBlcnI0OworCX0gZWxzZSB7CisJCXRzZGVtdXhfY29uZmlnKCk7CisJCXRzZGVtdXhfcmVxdWVzdF9pcnEodHNkZW11eF9pc3IsICh2b2lkICopdHNkZW11eF9pcnFfaWQpOworCQlpZiAodmlkIDwgMHgxRkZGKSB7CisJCQljdXJyX3ZpZF9pZCA9IHZpZDsKKwkJCXRzZGVtdXhfc2V0X3ZpZCh2aWQpOworCQkJcGNydmlkZW9fdmFsaWQgPSAxOworCQl9CisJCWlmIChhaWQgPCAweDFGRkYpIHsKKwkJCWN1cnJfYXVkX2lkID0gYWlkOworCQkJdHNkZW11eF9zZXRfYWlkKGFpZCk7CisJCQlwY3JhdWRpb192YWxpZCA9IDE7CisJCX0KKwkJaWYgKHNpZCA8IDB4MUZGRikgeworCQkJY3Vycl9zdWJfaWQgPSBzaWQ7CisJCQl0c2RlbXV4X3NldF9zaWQoc2lkKTsKKwkJfQorCisJCWN1cnJfcGNyX2lkID0gcGNyaWQ7CisJCXBjcnNjcl92YWxpZCA9IHJlc2V0X3Bjcl9yZWdzKCk7CisKKwkJaWYgKChwY3JpZCA8IDB4MUZGRikgJiYgKHBjcmlkICE9IHZpZCkgJiYgKHBjcmlkICE9IGFpZCkKKwkJCSYmIChwY3JpZCAhPSBzaWQpKQorCQkJdHNkZW11eF9zZXRfcGNyaWQocGNyaWQpOworCX0KKworCWZpcnN0X3BjciA9IDA7CisKKwlyZXR1cm4gMDsKKworZXJyNDoKKwkvKlRPRE8gaXJxICovCisKKwlpZiAoIWVuYWJsZV9kZW11eF9kcml2ZXIoKSkKKwkJdmRlY19mcmVlX2lycShQQVJTRVJfSVJRLCAodm9pZCAqKXRzZGVtdXhfZmV0Y2hfaWQpOworCitlcnIzOgorCXB0c19zdG9wKFBUU19UWVBFX0FVRElPKTsKK2VycjI6CisJLyogI2lmIE1FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09OOCAqLworCWlmIChoYXNfaGV2Y192ZGVjKCkpCisJCXB0c19zdG9wKChpc19oZXZjKSA/IFBUU19UWVBFX0hFVkMgOiBQVFNfVFlQRV9WSURFTyk7CisJZWxzZQorCQkvKiAjZW5kaWYgKi8KKwkJcHRzX3N0b3AoUFRTX1RZUEVfVklERU8pOworZXJyMToKKwlwcl9pbmZvKCJUUyBEZW11eCBpbml0IGZhaWxlZC5cbiIpOworCXJldHVybiAtRU5PRU5UOworfQorCit2b2lkIHRzZGVtdXhfcmVsZWFzZSh2b2lkKQoreworCXBjcnNjcl92YWxpZCA9IDA7CisJZmlyc3RfcGNyID0gMDsKKwlwY3JfaW5pdF9mbGFnID0gMDsKKworCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX0lOVF9FTkFCTEUsIDApOworCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX1ZJREVPX0hPTEUsIDApOworCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX0FVRElPX0hPTEUsIDApOworCisJLypUT0RPIGlycSAqLworCisJdmRlY19mcmVlX2lycShQQVJTRVJfSVJRLCAodm9pZCAqKXRzZGVtdXhfZmV0Y2hfaWQpOworCisJaWYgKCFlbmFibGVfZGVtdXhfZHJpdmVyKCkpIHsKKwkJV1JJVEVfREVNVVhfUkVHKFNUQl9JTlRfTUFTSywgMCk7CisJCS8qVE9ETyBpcnEgKi8KKworCQl2ZGVjX2ZyZWVfaXJxKERFTVVYX0lSUSwgKHZvaWQgKil0c2RlbXV4X2lycV9pZCk7CisJfSBlbHNlIHsKKworCQl0c2RlbXV4X3NldF9haWQoMHhmZmZmKTsKKwkJdHNkZW11eF9zZXRfdmlkKDB4ZmZmZik7CisJCXRzZGVtdXhfc2V0X3NpZCgweGZmZmYpOworCQl0c2RlbXV4X3NldF9wY3JpZCgweGZmZmYpOworCQl0c2RlbXV4X2ZyZWVfaXJxKCk7CisKKwkJY3Vycl92aWRfaWQgPSAweGZmZmY7CisJCWN1cnJfYXVkX2lkID0gMHhmZmZmOworCQljdXJyX3N1Yl9pZCA9IDB4ZmZmZjsKKwkJY3Vycl9wY3JfaWQgPSAweGZmZmY7CisJCWN1cnJfcGNyX251bSA9IDB4ZmZmZjsKKwl9CisKKwlwdHNfc3RvcChQVFNfVFlQRV9WSURFTyk7CisJcHRzX3N0b3AoUFRTX1RZUEVfQVVESU8pOworCisJV1JJVEVfUkVTRVRfUkVHKFJFU0VUMV9SRUdJU1RFUiwgUkVTRVRfUEFSU0VSKTsKKyNpZmRlZiBDT05GSUdfQU1MT0dJQ19NRURJQV9NVUxUSV9ERUMKKwlTRVRfUEFSU0VSX1JFR19NQVNLKFBBUlNFUl9FU19DT05UUk9MLCBFU19WSURfTUFOX1JEX1BUUik7CisJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfVklERU9fV1AsIDApOworCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX1ZJREVPX1JQLCAwKTsKKyNlbmRpZgorCisJaWYgKGVuYWJsZV9kZW11eF9kcml2ZXIoKSkKKwkJdHNkZW11eF9yZXNldCgpOworCisJLyogI2lmIE1FU09OX0NQVV9UWVBFID49IE1FU09OX0NQVV9UWVBFX01FU09ONiAqLworCS8qVE9ETyBjbGsgKi8KKwkvKgorCSAqc3dpdGNoX21vZF9nYXRlX2J5X3R5cGUoTU9EX0RFTVVYLCAwKTsKKwkgKi8KKwkvKiAjZW5kaWYgKi8KKwlhbXBvcnRzX3N3aXRjaF9nYXRlKCJkZW11eCIsIDApOworCit9CitFWFBPUlRfU1lNQk9MKHRzZGVtdXhfcmVsZWFzZSk7CisKK3N0YXRpYyBpbnQgbGltaXRlZF9kZWxheV9jaGVjayhzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJc3RydWN0IHN0cmVhbV9idWZfcyAqdmJ1ZiwKKwkJc3RydWN0IHN0cmVhbV9idWZfcyAqYWJ1ZiwKKwkJY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBwb3J0X3ByaXZfcyAqcHJpdiA9IChzdHJ1Y3QgcG9ydF9wcml2X3MgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHN0cmVhbV9wb3J0X3MgKnBvcnQgPSBwcml2LT5wb3J0OworCWludCB3cml0ZV9zaXplOworCisJaWYgKCEoKHBvcnQtPmZsYWcgJiBQT1JUX0ZMQUdfVklEKSAmJgorCQkocG9ydC0+ZmxhZyAmIFBPUlRfRkxBR19BSUQpKSkgeworCQlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpidWYgPQorCQkJKHBvcnQtPmZsYWcgJiBQT1JUX0ZMQUdfVklEKSA/IHZidWYgOiBhYnVmOworCisJCXJldHVybiBtaW5fdChpbnQsIGNvdW50LCBzdGJ1Zl9zcGFjZShidWYpKTsKKwl9CisKKwlpZiAodmJ1Zi0+bWF4X2J1ZmZlcl9kZWxheV9tcyA+IDAgJiYgYWJ1Zi0+bWF4X2J1ZmZlcl9kZWxheV9tcyA+IDAgJiYKKwkJc3RidWZfbGV2ZWwodmJ1ZikgPiAxMDI0ICYmIHN0YnVmX2xldmVsKGFidWYpID4gMjU2KSB7CisJCWludCB2ZGVsYXkgPQorCQkJY2FsY3VsYXRpb25fc3RyZWFtX2RlbGF5ZWRfbXMoUFRTX1RZUEVfVklERU8sCisJCQkJCU5VTEwsIE5VTEwpOworCQlpbnQgYWRlbGF5ID0KKwkJCWNhbGN1bGF0aW9uX3N0cmVhbV9kZWxheWVkX21zKFBUU19UWVBFX0FVRElPLAorCQkJCQlOVUxMLCBOVUxMKTsKKwkJLyptYXggd2FpdCAxMDBtcyxpZiB0aW1lb3V0LHRyeSBhZ2FpbiB0b3AgbGV2ZWwuICovCisJCWludCBtYXhyZXRyeSA9IDEwOworCQkvKnRvbyBiaWcgIGRlbGF5LGRvIHdhaXQgbm93LiAqLworCQkvKmlmIG5vYmxvY2sgbW9kZSxkb24ndCBkbyB3YWl0LiAqLworCQlpZiAoIShmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykpIHsKKwkJCXdoaWxlICh2ZGVsYXkgPiB2YnVmLT5tYXhfYnVmZmVyX2RlbGF5X21zCisJCQkJICAgJiYgYWRlbGF5ID4gYWJ1Zi0+bWF4X2J1ZmZlcl9kZWxheV9tcworCQkJCSAgICYmIG1heHJldHJ5LS0gPiAwKSB7CisJCQkJbXNsZWVwKDIwKTsKKwkJCQl2ZGVsYXkgPQorCQkJCQljYWxjdWxhdGlvbl9zdHJlYW1fZGVsYXllZF9tcworCQkJCQkoUFRTX1RZUEVfVklERU8sIE5VTEwsIE5VTEwpOworCQkJCWFkZWxheSA9CisJCQkJCWNhbGN1bGF0aW9uX3N0cmVhbV9kZWxheWVkX21zCisJCQkJCShQVFNfVFlQRV9BVURJTywgTlVMTCwgTlVMTCk7CisJCQl9CisJCX0KKwkJaWYgKHZkZWxheSA+IHZidWYtPm1heF9idWZmZXJfZGVsYXlfbXMKKwkJCSYmIGFkZWxheSA+IGFidWYtPm1heF9idWZmZXJfZGVsYXlfbXMpCisJCQlyZXR1cm4gMDsKKwl9CisJd3JpdGVfc2l6ZSA9IG1pbihzdGJ1Zl9zcGFjZSh2YnVmKSwgc3RidWZfc3BhY2UoYWJ1ZikpOworCXdyaXRlX3NpemUgPSBtaW5fdChpbnQsIGNvdW50LCB3cml0ZV9zaXplKTsKKwlyZXR1cm4gd3JpdGVfc2l6ZTsKK30KKworc3NpemVfdCBkcm1fdHN3cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJc3RydWN0IHN0cmVhbV9idWZfcyAqdmJ1ZiwKKwkJCQkJc3RydWN0IHN0cmVhbV9idWZfcyAqYWJ1ZiwKKwkJCQkJY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXMzMiByOworCXUzMiByZWFsY291bnQgPSBjb3VudDsKKwl1MzIgaGF2ZXdyaXRlYnl0ZXMgPSAwOworCisJc3RydWN0IGRybV9pbmZvIHRtcG1tOworCXN0cnVjdCBkcm1faW5mbyAqZHJtID0gJnRtcG1tOworCXUzMiByZXMgPSAwOworCWludCBpc3BoeWJ1ZiA9IDA7CisJdW5zaWduZWQgbG9uZyByZWFsYnVmOworCisJc3RydWN0IHBvcnRfcHJpdl9zICpwcml2ID0gKHN0cnVjdCBwb3J0X3ByaXZfcyAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc3RyZWFtX3BvcnRfcyAqcG9ydCA9IHByaXYtPnBvcnQ7CisJc2l6ZV90IHdhaXRfc2l6ZSwgd3JpdGVfc2l6ZTsKKworCWlmIChidWYgPT0gTlVMTCB8fCBjb3VudCA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlcyA9IGNvcHlfZnJvbV91c2VyKGRybSwgYnVmLCBzaXplb2Yoc3RydWN0IGRybV9pbmZvKSk7CisJaWYgKHJlcykgeworCQlwcl9pbmZvKCJkcm0ga21hbGxvYyBmYWlsZWQgcmVzWyVkXVxuIiwgcmVzKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKGRybS0+ZHJtX2ZsYWcgPT0gVFlQRV9EUk1JTkZPICYmIGRybS0+ZHJtX2xldmVsID09IERSTV9MRVZFTDEpIHsKKwkJLyogYnVmIG9ubHkgaGFzIGRybWluZm8gbm90IGhhdmUgZXNkYXRhOyAqLworCQlpZiAoZHJtLT5kcm1fcGt0c2l6ZSA8PSBNQVhfRFJNX1BBQ0tBR0VfU0laRSkKKwkJCXJlYWxjb3VudCA9IGRybS0+ZHJtX3BrdHNpemU7CisJCWVsc2UgeworCQkJcHJfZXJyKCJkcm0gcGFja2FnZSBzaXplIGlzIGVycm9yLCBzaXplIGlzICV1XG4iLCBkcm0tPmRybV9wa3RzaXplKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJlYWxidWYgPSBkcm0tPmRybV9waHk7CisJCWlzcGh5YnVmID0gMTsKKwl9IGVsc2UKKwkgICAgcmVhbGJ1ZiA9ICh1bnNpZ25lZCBsb25nKWJ1ZjsKKwkvKiBwcl9pbmZvKCJkcm0tPmRybV9mbGFnID0gMHgleCxyZWFsY291bnQgPSAlZCAsIGJ1ZiA9IDB4JXggIiwqLworCSAgIC8qZHJtLT5kcm1fZmxhZyxyZWFsY291bnQsIGJ1Zik7ICovCisKKwljb3VudCA9IHJlYWxjb3VudDsKKworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJaWYgKChzdGJ1Zl9zcGFjZSh2YnVmKSA8IGNvdW50KSB8fAorCQkJCShzdGJ1Zl9zcGFjZShhYnVmKSA8IGNvdW50KSkgeworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJaW50IHZfc3RidWZfc3BhY2UgPSBzdGJ1Zl9zcGFjZSh2YnVmKTsKKwkJCQlpbnQgYV9zdGJ1Zl9zcGFjZSA9IHN0YnVmX3NwYWNlKGFidWYpOworCisJCQkJd3JpdGVfc2l6ZSA9IG1pbih2X3N0YnVmX3NwYWNlLCBhX3N0YnVmX3NwYWNlKTsKKwkJCQkvKmhhdmUgMTg4IGJ5dGVzLHdyaXRlIG5vdy4sICovCisJCQkJaWYgKHdyaXRlX3NpemUgPD0gMTg4KQorCQkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCX0gZWxzZSB7CisJCQkJd2FpdF9zaXplID0KKwkJCQkJbWluKHN0YnVmX2NhbnVzZXNpemUodmJ1ZikgLyA4LAorCQkJCQkJc3RidWZfY2FudXNlc2l6ZShhYnVmKSAvIDQpOworCQkJCWlmICgocG9ydC0+ZmxhZyAmIFBPUlRfRkxBR19WSUQpCisJCQkJCSYmIChzdGJ1Zl9zcGFjZSh2YnVmKSA8IHdhaXRfc2l6ZSkpIHsKKwkJCQkJciA9IHN0YnVmX3dhaXRfc3BhY2UodmJ1Ziwgd2FpdF9zaXplKTsKKworCQkJCQlpZiAociA8IDApIHsKKwkJCQkJCWlmIChyICE9IC1FQUdBSU4pCisJCQkJCQkJcHJfaW5mbworCQkJCQkJCSgid3JpdGUgbm8gc3BhY2UtLS0gIik7CisJCQkJCQlpZiAociAhPSAtRUFHQUlOKQorCQkJCQkJCXByX2luZm8KKwkJCQkJCQkoIm5vIHNwYWNlLCVkLS0lZCxyLSVkXG4iLAorCQkJCQkJCXN0YnVmX3NwYWNlKHZidWYpLAorCQkJCQkJCXN0YnVmX3NwYWNlKGFidWYpLCByKTsKKwkJCQkJCXJldHVybiByOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKChwb3J0LT5mbGFnICYgUE9SVF9GTEFHX0FJRCkKKwkJCQkJJiYgKHN0YnVmX3NwYWNlKGFidWYpIDwgd2FpdF9zaXplKSkgeworCQkJCQlyID0gc3RidWZfd2FpdF9zcGFjZShhYnVmLCB3YWl0X3NpemUpOworCisJCQkJCWlmIChyIDwgMCkgeworCQkJCQkJcHJfaW5mbworCQkJCQkJKCJ3cml0ZSBubyBzdGJ1Zl93YWl0X3NwYWNlLS0iKTsKKwkJCQkJCXByX2luZm8KKwkJCQkJCSgibm8gc3BhY2UsJWQtLSVkLHItJWRcbiIsCisJCQkJCQkgc3RidWZfc3BhY2UodmJ1ZiksCisJCQkJCQkgc3RidWZfc3BhY2UoYWJ1ZiksIHIpOworCQkJCQkJcmV0dXJuIHI7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoKHBvcnQtPmZsYWcgJiBQT1JUX0ZMQUdfVklEKSAmJgorCQkJKHBvcnQtPmZsYWcgJiBQT1JUX0ZMQUdfQUlEKSkgeworCQkJd3JpdGVfc2l6ZSA9IG1pbihzdGJ1Zl9zcGFjZSh2YnVmKSwgc3RidWZfc3BhY2UoYWJ1ZikpOworCQkJd3JpdGVfc2l6ZSA9IG1pbihjb3VudCwgd3JpdGVfc2l6ZSk7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpidWYgPQorCQkJCShwb3J0LT5mbGFnICYgUE9SVF9GTEFHX1ZJRCkgPyB2YnVmIDogYWJ1ZjsKKworCQkJd3JpdGVfc2l6ZSA9IG1pbl90KGludCwgY291bnQsIHN0YnVmX3NwYWNlKGJ1ZikpOworCQl9CisJCS8qIHByX2luZm8oIndyaXRlX3NpemUgPSAlZCxjb3VudCA9ICVkLFxuIiwqLworCQkgICAvKndyaXRlX3NpemUsIGNvdW50KTsgKi8KKwkJaWYgKHdyaXRlX3NpemUgPiAwKSB7CisJCQlyID0gX3RzZGVtdXhfd3JpdGUoKGNvbnN0IGNoYXIgX191c2VyICopcmVhbGJ1ZiArIGhhdmV3cml0ZWJ5dGVzLAorCQkJCXdyaXRlX3NpemUsIGlzcGh5YnVmKTsKKwkJCWlmIChyIDwgMCkgeworCQkJCWlmIChyICE9IC1FQUdBSU4pCisJCQkJCXByX2luZm8KKwkJCQkJKCJ2c3BhY2UgJWQtLWFzcGFjZSAlZCxyLSVkXG4iLAorCQkJCQlzdGJ1Zl9zcGFjZSh2YnVmKSwKKwkJCQkJc3RidWZfc3BhY2UoYWJ1ZiksIHIpOworCQkJCXJldHVybiByOworCQkJfQorCQl9CisJCWVsc2UKKwkJCXJldHVybiAtRUFHQUlOOworCisJCWhhdmV3cml0ZWJ5dGVzICs9IHI7CisKKwkJLyogcHJfaW5mbygiaGF2ZXdyaXRlYnl0ZXMgPSAlZCwgciA9ICVkLFxuIiwqLworCQkgICAvKmhhdmV3cml0ZWJ5dGVzLCAgcik7ICovCisJCWlmIChoYXZld3JpdGVieXRlcyA9PSByZWFsY291bnQpCisJCQlicmVhazsJLyogd3JpdGUgb2s7ICovCisJCWVsc2UgaWYgKGhhdmV3cml0ZWJ5dGVzID4gcmVhbGNvdW50KQorCQkJcHJfaW5mbygiIGVycm9yICEgd3JpdGUgdG9vIG11Y2ggaGF2ZXdyaXRlYnl0ZXMgPSAldSwgciA9ICV1XG4iLAorCQkJKHUzMiloYXZld3JpdGVieXRlcywodTMyKXJlYWxjb3VudCk7CisKKwkJY291bnQgLT0gcjsKKwl9CisJcmV0dXJuIGhhdmV3cml0ZWJ5dGVzOworfQorCitzc2l6ZV90IHRzZGVtdXhfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCSAgc3RydWN0IHN0cmVhbV9idWZfcyAqdmJ1ZiwKKwkJCQkJICBzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICphYnVmLAorCQkJCQkgIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzMzIgcjsKKwlzdHJ1Y3QgcG9ydF9wcml2X3MgKnByaXYgPSAoc3RydWN0IHBvcnRfcHJpdl9zICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzdHJlYW1fcG9ydF9zICpwb3J0ID0gcHJpdi0+cG9ydDsKKwlzaXplX3Qgd2FpdF9zaXplLCB3cml0ZV9zaXplOworCisJaWYgKChzdGJ1Zl9zcGFjZSh2YnVmKSA8IGNvdW50KSB8fCAoc3RidWZfc3BhY2UoYWJ1ZikgPCBjb3VudCkpIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQl3cml0ZV9zaXplID0gbWluKHN0YnVmX3NwYWNlKHZidWYpLCBzdGJ1Zl9zcGFjZShhYnVmKSk7CisJCQlpZiAod3JpdGVfc2l6ZSA8PSAxODgpCS8qaGF2ZSAxODggYnl0ZXMsd3JpdGUgbm93LiwgKi8KKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfSBlbHNlIHsKKwkJCXdhaXRfc2l6ZSA9CisJCQkJbWluKHN0YnVmX2NhbnVzZXNpemUodmJ1ZikgLyA4LAorCQkJCQlzdGJ1Zl9jYW51c2VzaXplKGFidWYpIC8gNCk7CisJCQlpZiAoKHBvcnQtPmZsYWcgJiBQT1JUX0ZMQUdfVklEKQorCQkJCSYmIChzdGJ1Zl9zcGFjZSh2YnVmKSA8IHdhaXRfc2l6ZSkpIHsKKwkJCQlyID0gc3RidWZfd2FpdF9zcGFjZSh2YnVmLCB3YWl0X3NpemUpOworCisJCQkJaWYgKHIgPCAwKSB7CisJCQkJCS8qIHByX2luZm8oIndyaXRlIG5vIHNwYWNlLS0tICIpOworCQkJCQkgKiAgIHByX2luZm8oIm5vIHNwYWNlLCVkLS0lZCxyLSVkXG4iLAorCQkJCQkgKiAgIHN0YnVmX3NwYWNlKHZidWYpLAorCQkJCQkgKiAgIHN0YnVmX3NwYWNlKGFidWYpLHIpOworCQkJCQkgKi8KKwkJCQkJcmV0dXJuIHI7CisJCQkJfQorCQkJfQorCisJCQlpZiAoKHBvcnQtPmZsYWcgJiBQT1JUX0ZMQUdfQUlEKQorCQkJCSYmIChzdGJ1Zl9zcGFjZShhYnVmKSA8IHdhaXRfc2l6ZSkpIHsKKwkJCQlyID0gc3RidWZfd2FpdF9zcGFjZShhYnVmLCB3YWl0X3NpemUpOworCisJCQkJaWYgKHIgPCAwKSB7CisJCQkJCS8qIHByX2luZm8oIndyaXRlIG5vIHN0YnVmX3dhaXRfc3BhY2UiKScKKwkJCQkJICogcHJfaW5mb3siLS0tbm8gc3BhY2UsJWQtLSVkLHItJWRcbiIsCisJCQkJCSAqIHN0YnVmX3NwYWNlKHZidWYpLAorCQkJCQkgKiBzdGJ1Zl9zcGFjZShhYnVmKSxyKTsKKwkJCQkJICovCisJCQkJCXJldHVybiByOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwl2YnVmLT5sYXN0X3dyaXRlX2ppZmZpZXM2NCA9IGppZmZpZXNfNjQ7CisJYWJ1Zi0+bGFzdF93cml0ZV9qaWZmaWVzNjQgPSBqaWZmaWVzXzY0OworCXdyaXRlX3NpemUgPSBsaW1pdGVkX2RlbGF5X2NoZWNrKGZpbGUsIHZidWYsIGFidWYsIGJ1ZiwgY291bnQpOworCWlmICh3cml0ZV9zaXplID4gMCkKKwkJcmV0dXJuIF90c2RlbXV4X3dyaXRlKGJ1Ziwgd3JpdGVfc2l6ZSwgMCk7CisJZWxzZQorCQlyZXR1cm4gLUVBR0FJTjsKK30KKworaW50IGdldF9kaXNjb250aW51ZV9jb3VudGVyKHZvaWQpCit7CisJcmV0dXJuIGRpc2NvbnRpbnVlZF9jb3VudGVyOworfQorRVhQT1JUX1NZTUJPTChnZXRfZGlzY29udGludWVfY291bnRlcik7CisKK3N0YXRpYyBzc2l6ZV90IGRpc2NvbnRpbnVlX2NvdW50ZXJfc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRpc2NvbnRpbnVlZF9jb3VudGVyKTsKK30KKworc3RhdGljIENMQVNTX0FUVFJfUk8oZGlzY29udGludWVfY291bnRlcik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp0c2RlbXV4X2NsYXNzX2F0dHJzW10gPSB7CisJJmNsYXNzX2F0dHJfZGlzY29udGludWVfY291bnRlci5hdHRyLAorCU5VTEwKK307CisKK0FUVFJJQlVURV9HUk9VUFModHNkZW11eF9jbGFzcyk7CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgdHNkZW11eF9jbGFzcyA9IHsKKwkubmFtZSA9ICJ0c2RlbXV4IiwKKwkuY2xhc3NfZ3JvdXBzID0gdHNkZW11eF9jbGFzc19ncm91cHMsCit9OworCitpbnQgdHNkZW11eF9jbGFzc19yZWdpc3Rlcih2b2lkKQoreworCWludCByID0gY2xhc3NfcmVnaXN0ZXIoJnRzZGVtdXhfY2xhc3MpOworCisJaWYgKHIgPCAwKQorCQlwcl9pbmZvKCJyZWdpc3RlciB0c2RlbXV4IGNsYXNzIGVycm9yIVxuIik7CisJZGlzY29udGludWVkX2NvdW50ZXIgPSAwOworCXJldHVybiByOworfQorCit2b2lkIHRzZGVtdXhfY2xhc3NfdW5yZWdpc3Rlcih2b2lkKQoreworCWNsYXNzX3VucmVnaXN0ZXIoJnRzZGVtdXhfY2xhc3MpOworfQorCit2b2lkIHRzZGVtdXhfY2hhbmdlX2F2aWQodW5zaWduZWQgaW50IHZpZCwgdW5zaWduZWQgaW50IGFpZCkKK3sKKwlpZiAoIWVuYWJsZV9kZW11eF9kcml2ZXIoKSkgeworCQlXUklURV9ERU1VWF9SRUcoRk1fV1JfREFUQSwKKwkJCQkoKCh2aWQgJiAweDFmZmYpIHwgKFZJREVPX1BBQ0tFVCA8PCAxMykpIDw8IDE2KQorCQkJCXwgKChhaWQgJiAweDFmZmYpIHwgKEFVRElPX1BBQ0tFVCA8PCAxMykpKTsKKwkJV1JJVEVfREVNVVhfUkVHKEZNX1dSX0FERFIsIDB4ODAwMCk7CisJCXdoaWxlIChSRUFEX0RFTVVYX1JFRyhGTV9XUl9BRERSKSAmIDB4ODAwMCkKKwkJCTsKKwl9IGVsc2UgeworCQlpZiAoY3Vycl92aWRfaWQgIT0gdmlkKSB7CisJCQl0c2RlbXV4X3NldF92aWQodmlkKTsKKwkJCWN1cnJfdmlkX2lkID0gdmlkOworCQl9CisJCWlmIChjdXJyX2F1ZF9pZCAhPSBhaWQpIHsKKwkJCXRzZGVtdXhfc2V0X2FpZChhaWQpOworCQkJY3Vycl9hdWRfaWQgPSBhaWQ7CisJCX0KKwkJcmVzZXRfcGNyX3JlZ3MoKTsKKwl9Cit9CisKK3ZvaWQgdHNkZW11eF9jaGFuZ2Vfc2lkKHVuc2lnbmVkIGludCBzaWQpCit7CisJaWYgKCFlbmFibGVfZGVtdXhfZHJpdmVyKCkpIHsKKwkJV1JJVEVfREVNVVhfUkVHKEZNX1dSX0RBVEEsCisJCQkJKCgoc2lkICYgMHgxZmZmKSB8IChTVUJfUEFDS0VUIDw8IDEzKSkgPDwgMTYpCisJCQkJfCAweGZmZmYpOworCQlXUklURV9ERU1VWF9SRUcoRk1fV1JfQUREUiwgMHg4MDAxKTsKKwkJd2hpbGUgKFJFQURfREVNVVhfUkVHKEZNX1dSX0FERFIpICYgMHg4MDAwKQorCQkJOworCX0gZWxzZSB7CisJCWN1cnJfc3ViX2lkID0gc2lkOworCisJCXRzZGVtdXhfc2V0X3NpZChzaWQpOworCisJCXJlc2V0X3Bjcl9yZWdzKCk7CisJfQorCit9CisKK3ZvaWQgdHNkZW11eF9hdWRpb19yZXNldCh2b2lkKQoreworCXVsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgeGZsYWdzID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZW11eF9vcHNfbG9jaywgZmxhZ3MpOworCWlmIChkZW11eF9vcHMgJiYgZGVtdXhfb3BzLT5od19kbXhfbG9jaykKKwkJeGZsYWdzID0gZGVtdXhfb3BzLT5od19kbXhfbG9jayh4ZmxhZ3MpOworCisJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfQVVESU9fV1AsCisJCQkJICAgUkVBRF9BSVVfUkVHKEFJVV9NRU1fQUlGSUZPX1NUQVJUX1BUUikpOworCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX0FVRElPX1JQLAorCQkJCSAgIFJFQURfQUlVX1JFRyhBSVVfTUVNX0FJRklGT19TVEFSVF9QVFIpKTsKKworCVdSSVRFX1BBUlNFUl9SRUcoUEFSU0VSX0FVRElPX1NUQVJUX1BUUiwKKwkJCQkgICBSRUFEX0FJVV9SRUcoQUlVX01FTV9BSUZJRk9fU1RBUlRfUFRSKSk7CisJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfQVVESU9fRU5EX1BUUiwKKwkJCQkgICBSRUFEX0FJVV9SRUcoQUlVX01FTV9BSUZJRk9fRU5EX1BUUikpOworCUNMRUFSX1BBUlNFUl9SRUdfTUFTSyhQQVJTRVJfRVNfQ09OVFJPTCwgRVNfQVVEX01BTl9SRF9QVFIpOworCisJV1JJVEVfQUlVX1JFRyhBSVVfTUVNX0FJRklGT19CVUZfQ05UTCwgTUVNX0JVRkNUUkxfSU5JVCk7CisJQ0xFQVJfQUlVX1JFR19NQVNLKEFJVV9NRU1fQUlGSUZPX0JVRl9DTlRMLCBNRU1fQlVGQ1RSTF9JTklUKTsKKworCWlmIChkZW11eF9vcHMgJiYgZGVtdXhfb3BzLT5od19kbXhfdW5sb2NrKQorCQlkZW11eF9vcHMtPmh3X2RteF91bmxvY2soeGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZW11eF9vcHNfbG9jaywgZmxhZ3MpOworCWlmIChyZXNldF9kZW11eF9lbmFibGUgPT0gMSkKKwkJdHNkZW11eF9yZXNldCgpOworfQorCit2b2lkIHRzZGVtdXhfc3ViX3Jlc2V0KHZvaWQpCit7CisJdWxvbmcgZmxhZ3M7CisJdTMyIHBhcnNlcl9zdWJfc3RhcnRfcHRyOworCXUzMiBwYXJzZXJfc3ViX2VuZF9wdHI7CisJdW5zaWduZWQgbG9uZyB4ZmxhZ3MgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRlbXV4X29wc19sb2NrLCBmbGFncyk7CisJaWYgKGRlbXV4X29wcyAmJiBkZW11eF9vcHMtPmh3X2RteF9sb2NrKQorCQl4ZmxhZ3MgPSBkZW11eF9vcHMtPmh3X2RteF9sb2NrKHhmbGFncyk7CisKKwlwYXJzZXJfc3ViX3N0YXJ0X3B0ciA9IFJFQURfUEFSU0VSX1JFRyhQQVJTRVJfU1VCX1NUQVJUX1BUUik7CisJcGFyc2VyX3N1Yl9lbmRfcHRyID0gUkVBRF9QQVJTRVJfUkVHKFBBUlNFUl9TVUJfRU5EX1BUUik7CisKKwlXUklURV9QQVJTRVJfUkVHKFBBUlNFUl9TVUJfU1RBUlRfUFRSLCBwYXJzZXJfc3ViX3N0YXJ0X3B0cik7CisJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfU1VCX0VORF9QVFIsIHBhcnNlcl9zdWJfZW5kX3B0cik7CisJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfU1VCX1JQLCBwYXJzZXJfc3ViX3N0YXJ0X3B0cik7CisJV1JJVEVfUEFSU0VSX1JFRyhQQVJTRVJfU1VCX1dQLCBwYXJzZXJfc3ViX3N0YXJ0X3B0cik7CisJU0VUX1BBUlNFUl9SRUdfTUFTSyhQQVJTRVJfRVNfQ09OVFJPTCwKKwkJCSg3IDw8IEVTX1NVQl9XUl9FTkRJQU5fQklUKSB8IEVTX1NVQl9NQU5fUkRfUFRSKTsKKworCWlmIChkZW11eF9vcHMgJiYgZGVtdXhfb3BzLT5od19kbXhfdW5sb2NrKQorCQlkZW11eF9vcHMtPmh3X2RteF91bmxvY2soeGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZW11eF9vcHNfbG9jaywgZmxhZ3MpOworfQorCit2b2lkIHRzZGVtdXhfc2V0X3NraXBieXRlKGludCBza2lwYnl0ZSkKK3sKKwlpZiAoIWVuYWJsZV9kZW11eF9kcml2ZXIoKSkKKwkJZGVtdXhfc2tpcGJ5dGUgPSBza2lwYnl0ZTsKKwllbHNlCisJCXRzZGVtdXhfc2V0X3NraXBfYnl0ZShza2lwYnl0ZSk7CisKK30KKwordm9pZCB0c2RlbXV4X3NldF9kZW11eChpbnQgZGV2KQoreworCWlmIChlbmFibGVfZGVtdXhfZHJpdmVyKCkpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJaW50IHIgPSAwOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZW11eF9vcHNfbG9jaywgZmxhZ3MpOworCQlpZiAoZGVtdXhfb3BzICYmIGRlbXV4X29wcy0+c2V0X2RlbXV4KQorCQkJciA9IGRlbXV4X29wcy0+c2V0X2RlbXV4KGRldik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlbXV4X29wc19sb2NrLCBmbGFncyk7CisJfQorfQorCit1MzIgdHNkZW11eF9wY3JzY3JfZ2V0KHZvaWQpCit7CisJdTMyIHBjciA9IDA7CisKKwlpZiAocGNyc2NyX3ZhbGlkID09IDApCisJCXJldHVybiAwOworCisJaWYgKFJFQURfREVNVVhfUkVHKFRTX0hJVV9DVExfMikgJiAweDgwKQorCQlwY3IgPSBSRUFEX0RFTVVYX1JFRyhQQ1JfREVNVVhfMik7CisJZWxzZSBpZiAoUkVBRF9ERU1VWF9SRUcoVFNfSElVX0NUTF8zKSAmIDB4ODApCisJCXBjciA9IFJFQURfREVNVVhfUkVHKFBDUl9ERU1VWF8zKTsKKwllbHNlCisJCXBjciA9IFJFQURfREVNVVhfUkVHKFBDUl9ERU1VWCk7CisJaWYgKGZpcnN0X3BjciA9PSAwKQorCQlmaXJzdF9wY3IgPSBwY3I7CisJcmV0dXJuIHBjcjsKK30KKwordTMyIHRzZGVtdXhfZmlyc3RfcGNyc2NyX2dldCh2b2lkKQoreworCWlmIChwY3JzY3JfdmFsaWQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZmlyc3RfcGNyID09IDApIHsKKwkJdTMyIHBjcjsKKwkJaWYgKFJFQURfREVNVVhfUkVHKFRTX0hJVV9DVExfMikgJiAweDgwKQorCQkJcGNyID0gUkVBRF9ERU1VWF9SRUcoUENSX0RFTVVYXzIpOworCQllbHNlIGlmIChSRUFEX0RFTVVYX1JFRyhUU19ISVVfQ1RMXzMpICYgMHg4MCkKKwkJCXBjciA9IFJFQURfREVNVVhfUkVHKFBDUl9ERU1VWF8zKTsKKwkJZWxzZQorCQkJcGNyID0gUkVBRF9ERU1VWF9SRUcoUENSX0RFTVVYKTsKKwkJZmlyc3RfcGNyID0gcGNyOworCQkvKiBwcl9pbmZvKCJzZXQgZmlyc3RfcGNyID0gMHgleFxuIiwgcGNyKTsgKi8KKwl9CisKKwlyZXR1cm4gZmlyc3RfcGNyOworfQorCit1OCB0c2RlbXV4X3BjcnNjcl92YWxpZCh2b2lkKQoreworCXJldHVybiBwY3JzY3JfdmFsaWQ7Cit9CisKK3U4IHRzZGVtdXhfcGNyYXVkaW9fdmFsaWQodm9pZCkKK3sKKwlyZXR1cm4gcGNyYXVkaW9fdmFsaWQ7Cit9CisKK3U4IHRzZGVtdXhfcGNydmlkZW9fdmFsaWQodm9pZCkKK3sKKwlyZXR1cm4gcGNydmlkZW9fdmFsaWQ7Cit9CisKK3ZvaWQgdHNkZW11eF9wY3Jfc2V0KHVuc2lnbmVkIGludCBwY3IpCit7CisJaWYgKHBjcl9pbml0X2ZsYWcgPT0gMCkgeworCQkvKnRpbWVzdGFtcF9wY3JzY3Jfc2V0KHBjcik7CisJCXRpbWVzdGFtcF9wY3JzY3JfZW5hYmxlKDEpOyovCisJCXBjcl9pbml0X2ZsYWcgPSAxOworCX0KK30KKwordm9pZCB0c2RlbXV4X3RzeW5jX2Z1bmNfaW5pdCh2b2lkKQoreworCXJlZ2lzdGVyX3RzeW5jX2NhbGxiYWNrZnVuYygKKwkJVFNZTkNfUENSU0NSX1ZBTElELCAodm9pZCAqKSh0c2RlbXV4X3BjcnNjcl92YWxpZCkpOworCXJlZ2lzdGVyX3RzeW5jX2NhbGxiYWNrZnVuYygKKwkJVFNZTkNfUENSU0NSX0dFVCwgKHZvaWQgKikodHNkZW11eF9wY3JzY3JfZ2V0KSk7CisJcmVnaXN0ZXJfdHN5bmNfY2FsbGJhY2tmdW5jKAorCQlUU1lOQ19GSVJTVF9QQ1JTQ1JfR0VULCAodm9pZCAqKSh0c2RlbXV4X2ZpcnN0X3BjcnNjcl9nZXQpKTsKKwlyZWdpc3Rlcl90c3luY19jYWxsYmFja2Z1bmMoCisJCVRTWU5DX1BDUkFVRElPX1ZBTElELCAodm9pZCAqKSh0c2RlbXV4X3BjcmF1ZGlvX3ZhbGlkKSk7CisJcmVnaXN0ZXJfdHN5bmNfY2FsbGJhY2tmdW5jKAorCQlUU1lOQ19QQ1JWSURFT19WQUxJRCwgKHZvaWQgKikodHNkZW11eF9wY3J2aWRlb192YWxpZCkpOworCXJlZ2lzdGVyX3RzeW5jX2NhbGxiYWNrZnVuYygKKwkJVFNZTkNfQlVGX0JZX0JZVEUsICh2b2lkICopKGdldF9idWZfYnlfdHlwZSkpOworCXJlZ2lzdGVyX3RzeW5jX2NhbGxiYWNrZnVuYygKKwkJVFNZTkNfU1RCVUZfTEVWRUwsICh2b2lkICopKHN0YnVmX2xldmVsKSk7CisJcmVnaXN0ZXJfdHN5bmNfY2FsbGJhY2tmdW5jKAorCQlUU1lOQ19TVEJVRl9TUEFDRSwgKHZvaWQgKikoc3RidWZfc3BhY2UpKTsKKwlyZWdpc3Rlcl90c3luY19jYWxsYmFja2Z1bmMoCisJCVRTWU5DX1NUQlVGX1NJWkUsICh2b2lkICopKHN0YnVmX3NpemUpKTsKK30KKworc3RhdGljIGludCB0c3BhcnNlcl9zdGJ1Zl9pbml0KHN0cnVjdCBzdHJlYW1fYnVmX3MgKnN0YnVmLAorCQkJICAgICAgIHN0cnVjdCB2ZGVjX3MgKnZkZWMpCit7CisJaW50IHJldCA9IC0xOworCisJcmV0ID0gc3RidWZfaW5pdChzdGJ1ZiwgdmRlYyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSB0c2RlbXV4X2luaXQoc3RidWYtPnBhcnMudmlkLAorCQkJICAgc3RidWYtPnBhcnMuYWlkLAorCQkJICAgc3RidWYtPnBhcnMuc2lkLAorCQkJICAgc3RidWYtPnBhcnMucGNyaWQsCisJCQkgICBzdGJ1Zi0+aXNfaGV2YywKKwkJCSAgIHZkZWMpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJdHN5bmNfcGNyX3N0YXJ0KCk7CisKKwlzdGJ1Zi0+ZmxhZyB8PSBCVUZfRkxBR19JTl9VU0U7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdHNwYXJzZXJfc3RidWZfcmVsZWFzZShzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICpzdGJ1ZikKK3sKKwl0c3luY19wY3Jfc3RvcCgpOworCisJdHNkZW11eF9yZWxlYXNlKCk7CisKKwlzdGJ1Zl9yZWxlYXNlKHN0YnVmKTsKK30KKworc3RhdGljIHN0cnVjdCBzdHJlYW1fYnVmX29wcyB0c3BhcnNlcl9zdGJ1Zl9vcHMgPSB7CisJLmluaXQJPSB0c3BhcnNlcl9zdGJ1Zl9pbml0LAorCS5yZWxlYXNlID0gdHNwYXJzZXJfc3RidWZfcmVsZWFzZSwKKwkuZ2V0X3dwCT0gcGFyc2VyX2dldF93cCwKKwkuc2V0X3dwCT0gcGFyc2VyX3NldF93cCwKKwkuZ2V0X3JwCT0gcGFyc2VyX2dldF9ycCwKKwkuc2V0X3JwCT0gcGFyc2VyX3NldF9ycCwKK307CisKK3N0cnVjdCBzdHJlYW1fYnVmX29wcyAqZ2V0X3RzcGFyc2VyX3N0YnVmX29wcyh2b2lkKQoreworCXJldHVybiAmdHNwYXJzZXJfc3RidWZfb3BzOworfQorRVhQT1JUX1NZTUJPTChnZXRfdHNwYXJzZXJfc3RidWZfb3BzKTsKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0cmVhbV9pbnB1dC9wYXJzZXIvdHNkZW11eC5oIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL3RzZGVtdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjgyMzA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvcGFyc2VyL3RzZGVtdXguaApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9tZWRpYS9zdHJlYW1faW5wdXQvcGFyc2VyL3RzZGVtdXguaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIFRTREVNVVhfSAorI2RlZmluZSBUU0RFTVVYX0gKKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL2FtcG9ydHNfY29uZmlnLmg+CisKKy8qIFRPRE86IG1vdmUgdG8gcmVnaXN0ZXIgaGVhZGVycyAqLworI2RlZmluZSBORVdfUERUU19SRUFEWSAgICAgICAgICAgICA0CisjZGVmaW5lIEFVRElPX1BUU19SRUFEWSAgICAgICAgICAgIDIKKyNkZWZpbmUgVklERU9fUFRTX1JFQURZICAgICAgICAgICAgMAorI2RlZmluZSBESVNfQ09OVElOVUlUWV9QQUNLRVQgICAgICA2CisjZGVmaW5lIFNVQl9QRVNfUkVBRFkgICAgICAgICAgICAgIDcKKyNkZWZpbmUgUENSX1JFQURZICAgICAgICAgICAgICAgICAgMTEKKworI2RlZmluZSBQQVJTRVJfSU5UU1RBVF9GRVRDSF9DTUQgICAgKDE8PDcpCisKKyNkZWZpbmUgRkVUQ0hfRU5ESUFOICAgICAgICAgICAgICAgIDI3CisjZGVmaW5lIEZFVENIX0VORElBTl9NQVNLICAgICAgICAgICAoMHg3PDwyNykKKworI2RlZmluZSBSRVNFVF9ERU1VWFNUQiAgICAgICgxPDwxKQorI2RlZmluZSBSRVNFVF9QQVJTRVIgICAgICAgICgxPDw4KQorCisjZGVmaW5lIFZJREVPX1BBQ0tFVCAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVVESU9fUEFDS0VUICAgICAgICAgICAgICAgMQorI2RlZmluZSBTVUJfUEFDS0VUICAgICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgT1RIRVJfRU5ESUFOICAgICAgICAgICAgICAgNgorI2RlZmluZSBCWVBBU1NfRU5ESUFOICAgICAgICAgICAgICAzCisjZGVmaW5lIFNFQ1RJT05fRU5ESUFOICAgICAgICAgICAgIDAKKworI2RlZmluZSBVU0VfSElfQlNGX0lOVEVSRkFDRSAgICAgICA3CisjZGVmaW5lIERFU19PVVRfRExZICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgVFJBTlNQT1JUX1NDUkFNQkxJTkdfQ09OVFJPTF9PREQgNgorI2RlZmluZSBUU19ISVVfRU5BQkxFICAgICAgICAgICAgICAgNQorI2RlZmluZSBGRUNfRklMRV9DTEtfRElWICAgICAgICAgICAgMAorI2RlZmluZSBTVEJfREVNVVhfRU5BQkxFICAgICAgICAgICAgNAorI2RlZmluZSBLRUVQX0RVUExJQ0FURV9QQUNLQUdFICAgICAgNgorCisjZGVmaW5lIEVTX1ZJRF9NQU5fUkRfUFRSICAgICAgICAgICAgKDE8PDApCisjZGVmaW5lIEVTX0FVRF9NQU5fUkRfUFRSICAgICAgICAgICAgKDE8PDQpCisKKyNkZWZpbmUgUFNfQ0ZHX1BGSUZPX0VNUFRZX0NOVF9CSVQgICAgICAxNgorI2RlZmluZSBQU19DRkdfTUFYX0VTX1dSX0NZQ0xFX0JJVCAgICAgIDEyCisjZGVmaW5lIFBTX0NGR19NQVhfRkVUQ0hfQ1lDTEVfQklUICAgICAgMAorCisjZGVmaW5lIEVTX1NVQl9XUl9FTkRJQU5fQklUICAgICAgICAgOQorI2RlZmluZSBFU19TVUJfTUFOX1JEX1BUUiAgICAgICAgICAgKDE8PDgpCisjZGVmaW5lIFBBUlNFUl9JTlRTVEFUX0ZFVENIX0NNRCAgICAoMTw8NykKKworI2RlZmluZSBQQVJTRVJfSU5UX0hPU1RfRU5fQklUICAgICAgOAorCitzdHJ1Y3Qgc3RyZWFtX2J1Zl9zOworc3RydWN0IHZkZWNfczsKKworZXh0ZXJuIHMzMiB0c2RlbXV4X2luaXQodTMyIHZpZCwgdTMyIGFpZCwgdTMyIHNpZCwgdTMyIHBjcmlkLCBib29sIGlzX2hldmMsCisJc3RydWN0IHZkZWNfcyAqdmRlYyk7CisKK2V4dGVybiB2b2lkIHRzZGVtdXhfcmVsZWFzZSh2b2lkKTsKK2V4dGVybiBzc2l6ZV90IGRybV90c3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICp2YnVmLAorCQlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICphYnVmLAorCQljb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQpOworCitleHRlcm4gc3NpemVfdCB0c2RlbXV4X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICp2YnVmLAorCQlzdHJ1Y3Qgc3RyZWFtX2J1Zl9zICphYnVmLAorCQljb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQpOworCitleHRlcm4gdTMyIHRzZGVtdXhfcGNyc2NyX2dldCh2b2lkKTsKK2V4dGVybiB1OCB0c2RlbXV4X3BjcnNjcl92YWxpZCh2b2lkKTsKK2V4dGVybiB1OCB0c2RlbXV4X3BjcmF1ZGlvX3ZhbGlkKHZvaWQpOworZXh0ZXJuIHU4IHRzZGVtdXhfcGNydmlkZW9fdmFsaWQodm9pZCk7CitleHRlcm4gdTMyIHRzZGVtdXhfZmlyc3RfcGNyc2NyX2dldCh2b2lkKTsKK2V4dGVybiB2b2lkIHRpbWVzdGFtcF9wY3JzY3JfZW5hYmxlKHUzMiBlbmFibGUpOworZXh0ZXJuIHZvaWQgdGltZXN0YW1wX3BjcnNjcl9zZXQodTMyIHB0cyk7CitpbnQgZ2V0X2Rpc2NvbnRpbnVlX2NvdW50ZXIodm9pZCk7CisKK2ludCB0c2RlbXV4X2NsYXNzX3JlZ2lzdGVyKHZvaWQpOwordm9pZCB0c2RlbXV4X2NsYXNzX3VucmVnaXN0ZXIodm9pZCk7Cit2b2lkIHRzZGVtdXhfY2hhbmdlX2F2aWQodW5zaWduZWQgaW50IHZpZCwgdW5zaWduZWQgaW50IGFpZCk7Cit2b2lkIHRzZGVtdXhfY2hhbmdlX3NpZCh1bnNpZ25lZCBpbnQgc2lkKTsKK3ZvaWQgdHNkZW11eF9hdWRpb19yZXNldCh2b2lkKTsKK3ZvaWQgdHNkZW11eF9zdWJfcmVzZXQodm9pZCk7Cit2b2lkIHRzZGVtdXhfc2V0X3NraXBieXRlKGludCBza2lwYnl0ZSk7Cit2b2lkIHRzZGVtdXhfc2V0X2RlbXV4KGludCBkZXYpOwordm9pZCB0c2RlbXV4X3RzeW5jX2Z1bmNfaW5pdCh2b2lkKTsKKworCisjZW5kaWYgLyogVFNERU1VWF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0cmVhbV9pbnB1dC9zdWJ0aXRsZS9zdWJ0aXRsZS5jIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvc3VidGl0bGUvc3VidGl0bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTVlZTM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvc3VidGl0bGUvc3VidGl0bGUuYwpAQCAtMCwwICsxLDcxNiBAQAorLyoKKyAqIGRyaXZlcnMvYW1sb2dpYy9tZWRpYS9zdWJ0aXRsZS9zdWJ0aXRsZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWxvZ2ljL21lZGlhL3V0aWxzL2Ftc3RyZWFtLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorLy8jaW5jbHVkZSAiYW1wb3J0c19wcml2LmgiCisKKy8vI2luY2x1ZGUgImFtbG9nLmgiCisvL01PRFVMRV9BTUxPRyhBTUxPR19ERUZBVUxUX0xFVkVMLCAwLCBMT0dfREVGQVVMVF9MRVZFTF9ERVNDLAorCQkJIC8vTE9HX0RFRkFVTFRfTUFTS19ERVNDKTsKKyNkZWZpbmUgREVWSUNFX05BTUUgImFtc3VidGl0bGUiCisvKiBEZXYgbmFtZSBhcyBpdCBhcHBlYXJzIGluIC9wcm9jL2RldmljZXMgICAqLworI2RlZmluZSBERVZJQ0VfQ0xBU1NfTkFNRSAic3VidGl0bGUiCisKK3N0YXRpYyBpbnQgc3ViZGV2aWNlX29wZW47CisKKyNkZWZpbmUgTUFYX1NVQlRJVExFX1BBQ0tFVCAxMAorc3RhdGljIERFRklORV9NVVRFWChhbXN1YnRpdGxlX211dGV4KTsKKworc3RydWN0IHN1YnRpdGxlX2RhdGFfcyB7CisJaW50IHN1YnRpdGxlX3NpemU7CisJaW50IHN1YnRpdGxlX3B0czsKKwljaGFyICpkYXRhOworfTsKK3N0YXRpYyBzdHJ1Y3Qgc3VidGl0bGVfZGF0YV9zIHN1YnRpdGxlX2RhdGFbTUFYX1NVQlRJVExFX1BBQ0tFVF07CitzdGF0aWMgaW50IHN1YnRpdGxlX2VuYWJsZSA9IDE7CitzdGF0aWMgaW50IHN1YnRpdGxlX3RvdGFsOworc3RhdGljIGludCBzdWJ0aXRsZV93aWR0aDsKK3N0YXRpYyBpbnQgc3VidGl0bGVfaGVpZ2h0Oworc3RhdGljIGludCBzdWJ0aXRsZV90eXBlID0gLTE7CitzdGF0aWMgaW50IHN1YnRpdGxlX2N1cnJlbnQ7CS8qIG5vIHN1YnRpdGxlICovCisvKiBzdWJfaW5kZXggbm9kZSB3aWxsIGJlIG1vZGlmaWVkIGJ5IGxpYnBsYXllcjsgYW1sb2dpY3BsYXllciB3aWxsIHVzZSAqLworLyogaXQgdG8gZGV0ZWN0IHdoZWF0aGVyIGxpYnBsYXllciBzd2l0Y2ggc3ViIGZpbmlzaGVkIG9yIG5vdCAqLworc3RhdGljIGludCBzdWJ0aXRsZV9pbmRleDsJLyogbm8gc3VidGl0bGUgKi8KKy8qIHN0YXRpYyBpbnQgc3VidGl0bGVfc2l6ZSA9IDA7ICovCisvKiBzdGF0aWMgaW50IHN1YnRpdGxlX3JlYWRfcG9zID0gMDsgKi8KK3N0YXRpYyBpbnQgc3VidGl0bGVfd3JpdGVfcG9zOworc3RhdGljIGludCBzdWJ0aXRsZV9zdGFydF9wdHM7CitzdGF0aWMgaW50IHN1YnRpdGxlX2ZwczsKK3N0YXRpYyBpbnQgc3VidGl0bGVfc3VidHlwZTsKK3N0YXRpYyBpbnQgc3VidGl0bGVfcmVzZXQ7CisvKiBzdGF0aWMgaW50ICpzdWJsdGl0bGVfYWRkcmVzc1tNQVhfU1VCVElUTEVfUEFDS0VUXTsgKi8KKworZW51bSBzdWJpbmZvX3BhcmFfZSB7CisJU1VCX05VTEwgPSAtMSwKKwlTVUJfRU5BQkxFID0gMCwKKwlTVUJfVE9UQUwsCisJU1VCX1dJRFRILAorCVNVQl9IRUlHSFQsCisJU1VCX1RZUEUsCisJU1VCX0NVUlJFTlQsCisJU1VCX0lOREVYLAorCVNVQl9XUklURV9QT1MsCisJU1VCX1NUQVJUX1BUUywKKwlTVUJfRlBTLAorCVNVQl9TVUJUWVBFLAorCVNVQl9SRVNFVCwKKwlTVUJfREFUQV9UX1NJWkUsCisJU1VCX0RBVEFfVF9EQVRBCit9OworCitzdHJ1Y3Qgc3ViaW5mb19wYXJhX3MgeworCWVudW0gc3ViaW5mb19wYXJhX2Ugc3ViaW5mb190eXBlOworCWludCBzdWJ0aXRsZV9pbmZvOworCWNoYXIgKmRhdGE7Cit9OworCisvKiB0b3RhbCAqLworLyogY3VyciAqLworLyogYmltYXAgKi8KKy8qIHRleHQgKi8KKy8qIHR5cGUgKi8KKy8qIGluZm8gKi8KKy8qIHB0cyAqLworLyogZHVyYXRpb24gKi8KKy8qIGNvbG9yIHBhbGxldGUgKi8KKy8qIHdpZHRoL2hlaWdodCAqLworCitzdGF0aWMgc3NpemVfdCBzaG93X2N1cnIoc3RydWN0IGNsYXNzICpjbGFzcywgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJCSBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWQ6IGN1cnJlbnRcbiIsIHN1YnRpdGxlX2N1cnJlbnQpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9jdXJyKHN0cnVjdCBjbGFzcyAqY2xhc3MsIHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJdW5zaWduZWQgaW50IGN1cnI7CisJc3NpemVfdCByOworCisJciA9IGtzdHJ0b2ludChidWYsIDAsICZjdXJyKTsKKwlpZiAociA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisKKwlzdWJ0aXRsZV9jdXJyZW50ID0gY3VycjsKKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2luZGV4KHN0cnVjdCBjbGFzcyAqY2xhc3MsIHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCQkgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZDogY3VycmVudFxuIiwgc3VidGl0bGVfaW5kZXgpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9pbmRleChzdHJ1Y3QgY2xhc3MgKmNsYXNzLCBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQkJCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgY3VycjsKKwlzc2l6ZV90IHI7CisKKwlyID0ga3N0cnRvaW50KGJ1ZiwgMCwgJmN1cnIpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdWJ0aXRsZV9pbmRleCA9IGN1cnI7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19yZXNldChzdHJ1Y3QgY2xhc3MgKmNsYXNzLCBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQkJCQkJICBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWQ6IGN1cnJlbnRcbiIsIHN1YnRpdGxlX3Jlc2V0KTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfcmVzZXQoc3RydWN0IGNsYXNzICpjbGFzcywgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJdW5zaWduZWQgaW50IHJlc2V0OworCXNzaXplX3QgcjsKKworCXIgPSBrc3RydG9pbnQoYnVmLCAwLCAmcmVzZXQpOworCisJcHJfaW5mbygicmVzZXQgaXMgJWRcbiIsIHJlc2V0KTsKKwlpZiAociA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisKKwlzdWJ0aXRsZV9yZXNldCA9IHJlc2V0OworCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdHlwZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLCBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQkJCQkJIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZDogdHlwZVxuIiwgc3VidGl0bGVfdHlwZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3R5cGUoc3RydWN0IGNsYXNzICpjbGFzcywgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgdHlwZTsKKwlzc2l6ZV90IHI7CisKKwlyID0ga3N0cnRvaW50KGJ1ZiwgMCwgJnR5cGUpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdWJ0aXRsZV90eXBlID0gdHlwZTsKKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3dpZHRoKHN0cnVjdCBjbGFzcyAqY2xhc3MsIHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCQkgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZDogd2lkdGhcbiIsIHN1YnRpdGxlX3dpZHRoKTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfd2lkdGgoc3RydWN0IGNsYXNzICpjbGFzcywgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgd2lkdGg7CisJc3NpemVfdCByOworCisJciA9IGtzdHJ0b2ludChidWYsIDAsICZ3aWR0aCk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN1YnRpdGxlX3dpZHRoID0gd2lkdGg7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19oZWlnaHQoc3RydWN0IGNsYXNzICpjbGFzcywgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZDogaGVpZ2h0XG4iLCBzdWJ0aXRsZV9oZWlnaHQpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9oZWlnaHQoc3RydWN0IGNsYXNzICpjbGFzcywgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXVuc2lnbmVkIGludCBoZWlnaHQ7CisJc3NpemVfdCByOworCisJciA9IGtzdHJ0b2ludChidWYsIDAsICZoZWlnaHQpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdWJ0aXRsZV9oZWlnaHQgPSBoZWlnaHQ7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd190b3RhbChzdHJ1Y3QgY2xhc3MgKmNsYXNzLCBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQkJCQkJICBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWQ6IG51bVxuIiwgc3VidGl0bGVfdG90YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV90b3RhbChzdHJ1Y3QgY2xhc3MgKmNsYXNzLCBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJdW5zaWduZWQgaW50IHRvdGFsOworCXNzaXplX3QgcjsKKworCXIgPSBrc3RydG9pbnQoYnVmLCAwLCAmdG90YWwpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcHJfaW5mbygic3VidGl0bGUgbnVtIGlzICVkXG4iLCB0b3RhbCk7CisJc3VidGl0bGVfdG90YWwgPSB0b3RhbDsKKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2VuYWJsZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLCBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQkJCQkJICAgY2hhciAqYnVmKQoreworCWlmIChzdWJ0aXRsZV9lbmFibGUpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjE6IGVuYWJsZWRcbiIpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMDogZGlzYWJsZWRcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9lbmFibGUoc3RydWN0IGNsYXNzICpjbGFzcywgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXVuc2lnbmVkIGludCBtb2RlOworCXNzaXplX3QgcjsKKworCXIgPSBrc3RydG9pbnQoYnVmLCAwLCAmbW9kZSk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwcl9pbmZvKCJzdWJ0aXRsZSBlbmFibGUgaXMgJWRcbiIsIG1vZGUpOworCXN1YnRpdGxlX2VuYWJsZSA9IG1vZGUgPyAxIDogMDsKKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3NpemUoc3RydWN0IGNsYXNzICpjbGFzcywgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJCSBjaGFyICpidWYpCit7CisJaWYgKHN1YnRpdGxlX2VuYWJsZSkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiMTogc2l6ZVxuIik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIwOiBzaXplXG4iKTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfc2l6ZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLCBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQkJCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXVuc2lnbmVkIGludCBzc2l6ZTsKKwlzc2l6ZV90IHI7CisKKwlyID0ga3N0cnRvaW50KGJ1ZiwgMCwgJnNzaXplKTsKKwlpZiAociA8IDApCisJCXJldHVybiAtRUlOVkFMOworCXByX2luZm8oInN1YnRpdGxlIHNpemUgaXMgJWRcbiIsIHNzaXplKTsKKwlzdWJ0aXRsZV9kYXRhW3N1YnRpdGxlX3dyaXRlX3Bvc10uc3VidGl0bGVfc2l6ZSA9IHNzaXplOworCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfc3RhcnRwdHMoc3RydWN0IGNsYXNzICpjbGFzcywgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJCQkgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkOiBwdHNcbiIsIHN1YnRpdGxlX3N0YXJ0X3B0cyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3N0YXJ0cHRzKHN0cnVjdCBjbGFzcyAqY2xhc3MsIHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJdW5zaWduZWQgaW50IHNwdHM7CisJc3NpemVfdCByOworCisJciA9IGtzdHJ0b2ludChidWYsIDAsICZzcHRzKTsKKwlpZiAociA8IDApCisJCXJldHVybiAtRUlOVkFMOworCXByX2luZm8oInN1YnRpdGxlIHN0YXJ0IHB0cyBpcyAleFxuIiwgc3B0cyk7CisJc3VidGl0bGVfc3RhcnRfcHRzID0gc3B0czsKKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2RhdGEoc3RydWN0IGNsYXNzICpjbGFzcywgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJCSBjaGFyICpidWYpCit7CisjaWYgMAorCWlmIChzdWJ0aXRsZV9kYXRhW3N1YnRpdGxlX3dyaXRlX3Bvc10uZGF0YSkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxsZFxuIiwKKwkJKHVuc2lnbmVkIGxvbmcpKHN1YnRpdGxlX2RhdGFbc3VidGl0bGVfd3JpdGVfcG9zXS5kYXRhKSk7CisjZW5kaWYKKwlyZXR1cm4gc3ByaW50ZihidWYsICIwOiBkaXNhYmxlZFxuIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2RhdGEoc3RydWN0IGNsYXNzICpjbGFzcywgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgYWRkcmVzczsKKwlzc2l6ZV90IHI7CisKKwlyID0ga3N0cnRvaW50KGJ1ZiwgMCwgJmFkZHJlc3MpOworCWlmIChyID09IChzc2l6ZV90KTApCisJCXJldHVybiAtRUlOVkFMOworI2lmIDAKKwlpZiAoc3VidGl0bGVfZGF0YVtzdWJ0aXRsZV93cml0ZV9wb3NdLnN1YnRpdGxlX3NpemUgPiAwKSB7CisJCXN1YnRpdGxlX2RhdGFbc3VidGl0bGVfd3JpdGVfcG9zXS5kYXRhID0gdm1hbGxvYygoCisJCQlzdWJ0aXRsZV9kYXRhW3N1YnRpdGxlX3dyaXRlX3Bvc10uc3VidGl0bGVfc2l6ZSkpOworCQlpZiAoc3VidGl0bGVfZGF0YVtzdWJ0aXRsZV93cml0ZV9wb3NdLmRhdGEpCisJCQltZW1jcHkoc3VidGl0bGVfZGF0YVtzdWJ0aXRsZV93cml0ZV9wb3NdLmRhdGEsCisJCQkodW5zaWduZWQgbG9uZyAqKWFkZHJlc3MsCisJCQlzdWJ0aXRsZV9kYXRhW3N1YnRpdGxlX3dyaXRlX3Bvc10uc3VidGl0bGVfc2l6ZSk7CisJfQorCXByX2luZm8oInN1YnRpdGxlIGRhdGEgYWRkcmVzcyBpcyAleCIsCisJCQkodW5zaWduZWQgaW50KShzdWJ0aXRsZV9kYXRhW3N1YnRpdGxlX3dyaXRlX3Bvc10uZGF0YSkpOworI2VuZGlmCisJc3VidGl0bGVfd3JpdGVfcG9zKys7CisJaWYgKHN1YnRpdGxlX3dyaXRlX3BvcyA+PSBNQVhfU1VCVElUTEVfUEFDS0VUKQorCQlzdWJ0aXRsZV93cml0ZV9wb3MgPSAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2ZwcyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLCBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQkJCQkJY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkOiBmcHNcbiIsIHN1YnRpdGxlX2Zwcyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2ZwcyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLCBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQkJCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJdW5zaWduZWQgaW50IHNzaXplOworCXNzaXplX3QgcjsKKworCXIgPSBrc3RydG9pbnQoYnVmLCAwLCAmc3NpemUpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcHJfaW5mbygic3VidGl0bGUgZnBzIGlzICVkXG4iLCBzc2l6ZSk7CisJc3VidGl0bGVfZnBzID0gc3NpemU7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19zdWJ0eXBlKHN0cnVjdCBjbGFzcyAqY2xhc3MsIHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCQkJY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkOiBzdWJ0eXBlXG4iLCBzdWJ0aXRsZV9zdWJ0eXBlKTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfc3VidHlwZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLCBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgc3NpemU7CisJc3NpemVfdCByOworCisJciA9IGtzdHJ0b2ludChidWYsIDAsICZzc2l6ZSk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwcl9pbmZvKCJzdWJ0aXRsZSBzdWJ0eXBlIGlzICVkXG4iLCBzc2l6ZSk7CisJc3VidGl0bGVfc3VidHlwZSA9IHNzaXplOworCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlIHN1YnRpdGxlX2NsYXNzX2F0dHJzW10gPSB7CisJX19BVFRSKGVuYWJsZSwgMDY2NCwgc2hvd19lbmFibGUsIHN0b3JlX2VuYWJsZSksCisJX19BVFRSKHRvdGFsLCAwNjY0LCBzaG93X3RvdGFsLCBzdG9yZV90b3RhbCksCisJX19BVFRSKHdpZHRoLCAwNjY0LCBzaG93X3dpZHRoLCBzdG9yZV93aWR0aCksCisJX19BVFRSKGhlaWdodCwgMDY2NCwgc2hvd19oZWlnaHQsIHN0b3JlX2hlaWdodCksCisJX19BVFRSKHR5cGUsIDA2NjQsIHNob3dfdHlwZSwgc3RvcmVfdHlwZSksCisJX19BVFRSKGN1cnIsIDA2NjQsIHNob3dfY3Vyciwgc3RvcmVfY3VyciksCisJX19BVFRSKGluZGV4LCAwNjY0LCBzaG93X2luZGV4LCBzdG9yZV9pbmRleCksCisJX19BVFRSKHNpemUsIDA2NjQsIHNob3dfc2l6ZSwgc3RvcmVfc2l6ZSksCisJX19BVFRSKGRhdGEsIDA2NjQsIHNob3dfZGF0YSwgc3RvcmVfZGF0YSksCisJX19BVFRSKHN0YXJ0cHRzLCAwNjY0LCBzaG93X3N0YXJ0cHRzLAorCXN0b3JlX3N0YXJ0cHRzKSwKKwlfX0FUVFIoZnBzLCAwNjY0LCBzaG93X2Zwcywgc3RvcmVfZnBzKSwKKwlfX0FUVFIoc3VidHlwZSwgMDY2NCwgc2hvd19zdWJ0eXBlLAorCXN0b3JlX3N1YnR5cGUpLAorCV9fQVRUUihyZXNldCwgMDY0NCwgc2hvd19yZXNldCwgc3RvcmVfcmVzZXQpLAorCV9fQVRUUl9OVUxMCit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIC9kZXYvYW12aWRlbyBBUElzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBhbXN1YnRpdGxlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJbXV0ZXhfbG9jaygmYW1zdWJ0aXRsZV9tdXRleCk7CisKKwlpZiAoc3ViZGV2aWNlX29wZW4pIHsKKwkJbXV0ZXhfdW5sb2NrKCZhbXN1YnRpdGxlX211dGV4KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlzdWJkZXZpY2Vfb3BlbiA9IDE7CisKKwl0cnlfbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisKKwltdXRleF91bmxvY2soJmFtc3VidGl0bGVfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1zdWJ0aXRsZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCW11dGV4X2xvY2soJmFtc3VidGl0bGVfbXV0ZXgpOworCisJc3ViZGV2aWNlX29wZW4gPSAwOworCisJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisKKwltdXRleF91bmxvY2soJmFtc3VidGl0bGVfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nIGFtc3VidGl0bGVfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVsb25nIGFyZykKK3sKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQU1TVFJFQU1fSU9DX0dFVF9TVUJUSVRMRV9JTkZPOiB7CisJCXN0cnVjdCBzdWJpbmZvX3BhcmFfcyBWc3RhdGVzOworCQlzdHJ1Y3Qgc3ViaW5mb19wYXJhX3MgKnN0YXRlcyA9ICZWc3RhdGVzOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKXN0YXRlcywKKwkJCQkodm9pZCAqKWFyZywgc2l6ZW9mKFZzdGF0ZXMpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzd2l0Y2ggKHN0YXRlcy0+c3ViaW5mb190eXBlKSB7CisJCWNhc2UgU1VCX0VOQUJMRToKKwkJCXN0YXRlcy0+c3VidGl0bGVfaW5mbyA9IHN1YnRpdGxlX2VuYWJsZTsKKwkJCWJyZWFrOworCQljYXNlIFNVQl9UT1RBTDoKKwkJCXN0YXRlcy0+c3VidGl0bGVfaW5mbyA9IHN1YnRpdGxlX3RvdGFsOworCQkJYnJlYWs7CisJCWNhc2UgU1VCX1dJRFRIOgorCQkJc3RhdGVzLT5zdWJ0aXRsZV9pbmZvID0gc3VidGl0bGVfd2lkdGg7CisJCQlicmVhazsKKwkJY2FzZSBTVUJfSEVJR0hUOgorCQkJc3RhdGVzLT5zdWJ0aXRsZV9pbmZvID0gc3VidGl0bGVfaGVpZ2h0OworCQkJYnJlYWs7CisJCWNhc2UgU1VCX1RZUEU6CisJCQlzdGF0ZXMtPnN1YnRpdGxlX2luZm8gPSBzdWJ0aXRsZV90eXBlOworCQkJYnJlYWs7CisJCWNhc2UgU1VCX0NVUlJFTlQ6CisJCQlzdGF0ZXMtPnN1YnRpdGxlX2luZm8gPSBzdWJ0aXRsZV9jdXJyZW50OworCQkJYnJlYWs7CisJCWNhc2UgU1VCX0lOREVYOgorCQkJc3RhdGVzLT5zdWJ0aXRsZV9pbmZvID0gc3VidGl0bGVfaW5kZXg7CisJCQlicmVhazsKKwkJY2FzZSBTVUJfV1JJVEVfUE9TOgorCQkJc3RhdGVzLT5zdWJ0aXRsZV9pbmZvID0gc3VidGl0bGVfd3JpdGVfcG9zOworCQkJYnJlYWs7CisJCWNhc2UgU1VCX1NUQVJUX1BUUzoKKwkJCXN0YXRlcy0+c3VidGl0bGVfaW5mbyA9IHN1YnRpdGxlX3N0YXJ0X3B0czsKKwkJCWJyZWFrOworCQljYXNlIFNVQl9GUFM6CisJCQlzdGF0ZXMtPnN1YnRpdGxlX2luZm8gPSBzdWJ0aXRsZV9mcHM7CisJCQlicmVhazsKKwkJY2FzZSBTVUJfU1VCVFlQRToKKwkJCXN0YXRlcy0+c3VidGl0bGVfaW5mbyA9IHN1YnRpdGxlX3N1YnR5cGU7CisJCQlicmVhazsKKwkJY2FzZSBTVUJfUkVTRVQ6CisJCQlzdGF0ZXMtPnN1YnRpdGxlX2luZm8gPSBzdWJ0aXRsZV9yZXNldDsKKwkJCWJyZWFrOworCQljYXNlIFNVQl9EQVRBX1RfU0laRToKKwkJCXN0YXRlcy0+c3VidGl0bGVfaW5mbyA9CisJCQkJc3VidGl0bGVfZGF0YVtzdWJ0aXRsZV93cml0ZV9wb3NdLnN1YnRpdGxlX3NpemU7CisJCQlicmVhazsKKwkJY2FzZSBTVUJfREFUQV9UX0RBVEE6IHsKKwkJCWlmIChzdGF0ZXMtPnN1YnRpdGxlX2luZm8gPiAwKQorCQkJCXN0YXRlcy0+c3VidGl0bGVfaW5mbyA9CisJCQkJKGxvbmcpc3VidGl0bGVfZGF0YVtzdWJ0aXRsZV93cml0ZV9wb3NdLmRhdGE7CisJCX0KKwkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAodm9pZCAqKXN0YXRlcywgc2l6ZW9mKFZzdGF0ZXMpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKworCWJyZWFrOworCWNhc2UgQU1TVFJFQU1fSU9DX1NFVF9TVUJUSVRMRV9JTkZPOiB7CisJCXN0cnVjdCBzdWJpbmZvX3BhcmFfcyBWc3RhdGVzOworCQlzdHJ1Y3Qgc3ViaW5mb19wYXJhX3MgKnN0YXRlcyA9ICZWc3RhdGVzOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKXN0YXRlcywKKwkJCQkodm9pZCAqKWFyZywgc2l6ZW9mKFZzdGF0ZXMpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzd2l0Y2ggKHN0YXRlcy0+c3ViaW5mb190eXBlKSB7CisJCWNhc2UgU1VCX0VOQUJMRToKKwkJCXN1YnRpdGxlX2VuYWJsZSA9IHN0YXRlcy0+c3VidGl0bGVfaW5mbzsKKwkJCWJyZWFrOworCQljYXNlIFNVQl9UT1RBTDoKKwkJCXN1YnRpdGxlX3RvdGFsID0gc3RhdGVzLT5zdWJ0aXRsZV9pbmZvOworCQkJYnJlYWs7CisJCWNhc2UgU1VCX1dJRFRIOgorCQkJc3VidGl0bGVfd2lkdGggPSBzdGF0ZXMtPnN1YnRpdGxlX2luZm87CisJCQlicmVhazsKKwkJY2FzZSBTVUJfSEVJR0hUOgorCQkJc3VidGl0bGVfaGVpZ2h0ID0gc3RhdGVzLT5zdWJ0aXRsZV9pbmZvOworCQkJYnJlYWs7CisJCWNhc2UgU1VCX1RZUEU6CisJCQlzdWJ0aXRsZV90eXBlID0gc3RhdGVzLT5zdWJ0aXRsZV9pbmZvOworCQkJYnJlYWs7CisJCWNhc2UgU1VCX0NVUlJFTlQ6CisJCQlzdWJ0aXRsZV9jdXJyZW50ID0gc3RhdGVzLT5zdWJ0aXRsZV9pbmZvOworCQkJYnJlYWs7CisJCWNhc2UgU1VCX0lOREVYOgorCQkJc3VidGl0bGVfaW5kZXggPSBzdGF0ZXMtPnN1YnRpdGxlX2luZm87CisJCQlicmVhazsKKwkJY2FzZSBTVUJfV1JJVEVfUE9TOgorCQkJc3VidGl0bGVfd3JpdGVfcG9zID0gc3RhdGVzLT5zdWJ0aXRsZV9pbmZvOworCQkJYnJlYWs7CisJCWNhc2UgU1VCX1NUQVJUX1BUUzoKKwkJCXN1YnRpdGxlX3N0YXJ0X3B0cyA9IHN0YXRlcy0+c3VidGl0bGVfaW5mbzsKKwkJCWJyZWFrOworCQljYXNlIFNVQl9GUFM6CisJCQlzdWJ0aXRsZV9mcHMgPSBzdGF0ZXMtPnN1YnRpdGxlX2luZm87CisJCQlicmVhazsKKwkJY2FzZSBTVUJfU1VCVFlQRToKKwkJCXN1YnRpdGxlX3N1YnR5cGUgPSBzdGF0ZXMtPnN1YnRpdGxlX2luZm87CisJCQlicmVhazsKKwkJY2FzZSBTVUJfUkVTRVQ6CisJCQlzdWJ0aXRsZV9yZXNldCA9IHN0YXRlcy0+c3VidGl0bGVfaW5mbzsKKwkJCWJyZWFrOworCQljYXNlIFNVQl9EQVRBX1RfU0laRToKKwkJCXN1YnRpdGxlX2RhdGFbc3VidGl0bGVfd3JpdGVfcG9zXS5zdWJ0aXRsZV9zaXplID0KKwkJCQlzdGF0ZXMtPnN1YnRpdGxlX2luZm87CisJCQlicmVhazsKKwkJY2FzZSBTVUJfREFUQV9UX0RBVEE6IHsKKwkJCWlmIChzdGF0ZXMtPnN1YnRpdGxlX2luZm8gPiAwKSB7CisJCQkJc3VidGl0bGVfZGF0YVtzdWJ0aXRsZV93cml0ZV9wb3NdLmRhdGEgPQorCQkJCQl2bWFsbG9jKChzdGF0ZXMtPnN1YnRpdGxlX2luZm8pKTsKKwkJCQlpZiAoc3VidGl0bGVfZGF0YVtzdWJ0aXRsZV93cml0ZV9wb3NdLmRhdGEpCisJCQkJCW1lbWNweSgKKwkJCQkJc3VidGl0bGVfZGF0YVtzdWJ0aXRsZV93cml0ZV9wb3NdLmRhdGEsCisJCQkJCShjaGFyICopc3RhdGVzLT5kYXRhLAorCQkJCQlzdGF0ZXMtPnN1YnRpdGxlX2luZm8pOworCQkJfQorCisJCQlzdWJ0aXRsZV93cml0ZV9wb3MrKzsKKwkJCWlmIChzdWJ0aXRsZV93cml0ZV9wb3MgPj0gTUFYX1NVQlRJVExFX1BBQ0tFVCkKKwkJCQlzdWJ0aXRsZV93cml0ZV9wb3MgPSAwOworCQl9CisJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCX0KKworCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RhdGljIGxvbmcgYW1zdWJfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bG9uZyBhcmcpCit7CisJbG9uZyByZXQgPSAwOworCisJcmV0ID0gYW1zdWJ0aXRsZV9pb2N0bChmaWxlLCBjbWQsICh1bG9uZyljb21wYXRfcHRyKGFyZykpOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYW1zdWJ0aXRsZV9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gYW1zdWJ0aXRsZV9vcGVuLAorCS5yZWxlYXNlID0gYW1zdWJ0aXRsZV9yZWxlYXNlLAorCS51bmxvY2tlZF9pb2N0bCA9IGFtc3VidGl0bGVfaW9jdGwsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwgPSBhbXN1Yl9jb21wYXRfaW9jdGwsCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICphbXN1YnRpdGxlX2RldjsKK3N0YXRpYyBkZXZfdCBhbXN1Yl9kZXZubzsKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgKmFtc3ViX2Nsc3A7CitzdGF0aWMgc3RydWN0IGNkZXYgKmFtc3ViX2NkZXZwOworI2RlZmluZSBBTVNVQlRJVExFX0RFVklDRV9DT1VOVCAxCisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9hbXN1Yl9hdHRycyhzdHJ1Y3QgY2xhc3MgKmNsYXNzKQoreworCWludCBpID0gMDsKKworCWZvciAoaSA9IDA7IHN1YnRpdGxlX2NsYXNzX2F0dHJzW2ldLmF0dHIubmFtZTsgaSsrKSB7CisJCWlmIChjbGFzc19jcmVhdGVfZmlsZShjbGFzcywgJnN1YnRpdGxlX2NsYXNzX2F0dHJzW2ldKSA8IDApCisJCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9hbXN1Yl9hdHRycyhzdHJ1Y3QgY2xhc3MgKmNsYXNzKQoreworCWludCBpID0gMDsKKworCWZvciAoaSA9IDA7IHN1YnRpdGxlX2NsYXNzX2F0dHJzW2ldLmF0dHIubmFtZTsgaSsrKQorCQljbGFzc19yZW1vdmVfZmlsZShjbGFzcywgJnN1YnRpdGxlX2NsYXNzX2F0dHJzW2ldKTsKK30KKworaW50IHN1YnRpdGxlX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGFsbG9jX2NocmRldl9yZWdpb24oJmFtc3ViX2Rldm5vLCAwLCBBTVNVQlRJVExFX0RFVklDRV9DT1VOVCwKKwkJCQkJCQkgIERFVklDRV9OQU1FKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9pbmZvKCJhbXN1YjogZmFpbGVkIHRvIGFsbG9jIG1ham9yIG51bWJlclxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCXJldHVybiByZXQ7CisJfQorCisJYW1zdWJfY2xzcCA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgREVWSUNFX0NMQVNTX05BTUUpOworCWlmIChJU19FUlIoYW1zdWJfY2xzcCkpIHsKKwkJcmV0ID0gUFRSX0VSUihhbXN1Yl9jbHNwKTsKKwkJZ290byBlcnIxOworCX0KKworCWNyZWF0ZV9hbXN1Yl9hdHRycyhhbXN1Yl9jbHNwKTsKKworCWFtc3ViX2NkZXZwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFtc3ViX2NkZXZwKSB7CisJCS8qcHJfaW5mbygiYW1zdWI6IGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOyovCisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyMjsKKwl9CisKKwljZGV2X2luaXQoYW1zdWJfY2RldnAsICZhbXN1YnRpdGxlX2ZvcHMpOworCWFtc3ViX2NkZXZwLT5vd25lciA9IFRISVNfTU9EVUxFOworCS8qIGNvbm5lY3QgdGhlIG1ham9yL21pbm9yIG51bWJlciB0byBjZGV2ICovCisJcmV0ID0gY2Rldl9hZGQoYW1zdWJfY2RldnAsIGFtc3ViX2Rldm5vLCBBTVNVQlRJVExFX0RFVklDRV9DT1VOVCk7CisJaWYgKHJldCkgeworCQlwcl9pbmZvKCJhbXN1YjpmYWlsZWQgdG8gYWRkIGNkZXZcbiIpOworCQlnb3RvIGVycjM7CisJfQorCisJYW1zdWJ0aXRsZV9kZXYgPSBkZXZpY2VfY3JlYXRlKGFtc3ViX2Nsc3AsCisJCU5VTEwsIE1LREVWKE1BSk9SKGFtc3ViX2Rldm5vKSwgMCksCisJCU5VTEwsIERFVklDRV9OQU1FKTsKKworCWlmIChJU19FUlIoYW1zdWJ0aXRsZV9kZXYpKSB7CisJCXByX2VycigiIyMgQ2FuJ3QgY3JlYXRlIGFtc3VidGl0bGUgZGV2aWNlXG4iKTsKKwkJZ290byBlcnI0OworCX0KKworCXJldHVybiAwOworCitlcnI0OgorCWNkZXZfZGVsKGFtc3ViX2NkZXZwKTsKK2VycjM6CisJa2ZyZWUoYW1zdWJfY2RldnApOworZXJyMjoKKwlyZW1vdmVfYW1zdWJfYXR0cnMoYW1zdWJfY2xzcCk7CisJY2xhc3NfZGVzdHJveShhbXN1Yl9jbHNwKTsKK2VycjE6CisJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGFtc3ViX2Rldm5vLCAxKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHN1YnRpdGxlX2luaXQpOworCit2b2lkIHN1YnRpdGxlX2V4aXQodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oYW1zdWJfZGV2bm8sIDEpOworCWRldmljZV9kZXN0cm95KGFtc3ViX2Nsc3AsIE1LREVWKE1BSk9SKGFtc3ViX2Rldm5vKSwgMCkpOworCWNkZXZfZGVsKGFtc3ViX2NkZXZwKTsKKwlrZnJlZShhbXN1Yl9jZGV2cCk7CisJcmVtb3ZlX2Ftc3ViX2F0dHJzKGFtc3ViX2Nsc3ApOworCWNsYXNzX2Rlc3Ryb3koYW1zdWJfY2xzcCk7Cit9CitFWFBPUlRfU1lNQk9MKHN1YnRpdGxlX2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0cmVhbV9pbnB1dC9zdWJ0aXRsZS9zdWJ0aXRsZS5oIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvc3VidGl0bGUvc3VidGl0bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzVhMzFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdHJlYW1faW5wdXQvc3VidGl0bGUvc3VidGl0bGUuaApAQCAtMCwwICsxLDI0IEBACisvKgorICogZHJpdmVycy9hbWxvZ2ljL21lZGlhL3N0cmVhbV9pbnB1dC9hbXBvcnRzL2FtcG9ydHNfcHJpdi5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgU1VCVElUTEVfSAorI2RlZmluZSBTVUJUSVRMRV9ICisKK2ludCBzdWJ0aXRsZV9pbml0KHZvaWQpOwordm9pZCBzdWJ0aXRsZV9leGl0KHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2Zpcm13YXJlL2NoZWNrbXNnIGIvZmlybXdhcmUvY2hlY2ttc2cKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGJhNDJkYgotLS0gL2Rldi9udWxsCisrKyBiL2Zpcm13YXJlL2NoZWNrbXNnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Zpcm13YXJlL2gyNjRfZW5jLmJpbiBiL2Zpcm13YXJlL2gyNjRfZW5jLmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGJjNzNkCi0tLSAvZGV2L251bGwKKysrIGIvZmlybXdhcmUvaDI2NF9lbmMuYmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Zpcm13YXJlL3ZpZGVvX3Vjb2RlLmJpbiBiL2Zpcm13YXJlL3ZpZGVvX3Vjb2RlLmJpbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40NmQyY2EzCi0tLSAvZGV2L251bGwKKysrIGIvZmlybXdhcmUvdmlkZW9fdWNvZGUuYmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N1Ym1pdF90b29sLnNoIGIvc3VibWl0X3Rvb2wuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjBlMzZlNQotLS0gL2Rldi9udWxsCisrKyBiL3N1Ym1pdF90b29sLnNoCkBAIC0wLDAgKzEsMzEgQEAKKyMhL2Jpbi9zaAorCitDaGFuZ2VJRD0kKGdpdCBsb2cgLTEgfCBncmVwICJDaGFuZ2UtSWQ6IiB8ICBzZWQgJ3MvXlsgXHRdKi8vZycpCitTaWduZWQ9JChnaXQgbG9nIC0xIHwgZ3JlcCAiU2lnbmVkLW9mZi1ieToiIHwgIHNlZCAncy9eWyBcdF0qLy9nJykKKworZ2l0IGxvZyAtMSB8IHNlZCAnL0NoYW5nZS1JZDovLCRkJyB8IHNlZCAnL1NpZ25lZC1vZmYtYnkvLCRkJyB8ICBzZWQgJy9Tb3VyY2VDb2RlOi8sJGQnIHwgIHNlZCAnL21lZGlhX21vZHVsZSB2ZXJzaW9uOi8sJGQnIHwgc2VkIC1uICcvXiQvLCRwJyB8ICBzZWQgJy9eJC9kJyB8IHNlZCAncy9eWyBcdF0qLy9nJyA+IHRtcC50eHQKKworI2VjaG8gIm1lZGlhX21vZHVsZSB2ZXJzaW9uOiIgPj4gdG1wLnR4dAorI2VjaG8gJCguL3ZlcnNpb25fY29udHJvbC5zaCkgfCBhd2sgJ3twcmludCAkMX0nIHwgYXdrIC1GIFs9XSAne3ByaW50ICQyfScgID4+IHRtcC50eHQKKworaWYgWyAiMCQoZ2l0IGxvZyAtLXN0YXQgLTEgfCBncmVwICJ2aWRlb191Y29kZS5iaW4iKSIgIT0gIjAiIF07IHRoZW4KK2VjaG8gIlNvdXJjZUNvZGU6Cit1Y29kZToiID4+IHRtcC50eHQKKwkuL2Zpcm13YXJlL2NoZWNrbXNnIC4vZmlybXdhcmUvdmlkZW9fdWNvZGUuYmluIHwgZ3JlcCB2ZXIgfCBhd2sgJ3twcmludCAkM30nIHwgc2VkICdzL3YvL2cnID4gdmVyc2lvbi50eHQKKwkuL2Zpcm13YXJlL2NoZWNrbXNnIC4vZmlybXdhcmUvdmlkZW9fdWNvZGUuYmluICB8IGdyZXAgLUEgNSAiY2hhbmdlIGlkIGhpc3Rvcnk6IiA+PiB2ZXJzaW9uLnR4dAorCWNobW9kIDY0NCB2ZXJzaW9uLnR4dAorCS4vZmlybXdhcmUvY2hlY2ttc2cgLi9maXJtd2FyZS92aWRlb191Y29kZS5iaW4gfCBncmVwIHZlciB8IGF3ayAne3ByaW50ICQzfScgfCBzZWQgJ3Mvdi8vZycgPj4gdG1wLnR4dAorCWNhdCB2ZXJzaW9uLnR4dCB8IHNlZCAtbiAnMyw3cCcgPj4gdG1wLnR4dAorCisJZ2l0IGFkZCB2ZXJzaW9uLnR4dAorZmkKKworZWNobyAiIiA+PiB0bXAudHh0CitlY2hvICR7Q2hhbmdlSUR9ID4+ICB0bXAudHh0CitlY2hvICR7U2lnbmVkfSA+PiAgdG1wLnR4dAorCisKK2dpdCBzdGF0dXMKK2NhdCB0bXAudHh0IHwgeGFyZ3MgLTAgZ2l0IGNvbW1pdCAtLWFtZW5kIC1tCisKK3JtIC1mIHRtcC50eHQKZGlmZiAtLWdpdCBhL3ZlcnNpb24udHh0IGIvdmVyc2lvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk5NGMxOAotLS0gL2Rldi9udWxsCisrKyBiL3ZlcnNpb24udHh0CkBAIC0wLDAgKzEsNiBAQAorMC4zLjQxLWc2NDVjODdlCitJOWI1ZTgKK0lmMTNlMworSTIzNGQ1CitJM2YwMDMKK0liYjZmMgpkaWZmIC0tZ2l0IGEvdmVyc2lvbl9jb250cm9sLnNoIGIvdmVyc2lvbl9jb250cm9sLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkwNjlhNTgKLS0tIC9kZXYvbnVsbAorKysgYi92ZXJzaW9uX2NvbnRyb2wuc2gKQEAgLTAsMCArMSwyMSBAQAorIyEvYmluL3NoCisKK01FRElBX01PRFVMRV9QQVRIPSQoY2QgIiQoZGlybmFtZSAiJDAiKSI7cHdkKQorTWFqb3JfVj0kKGNkICR7TUVESUFfTU9EVUxFX1BBVEh9LzsgZ3JlcCAiTWFqb3JfViIgVkVSU0lPTiAgfCBhd2sgLUYgWz1dICd7cHJpbnQgJDJ9JykKK01pbm9yX1Y9JChjZCAke01FRElBX01PRFVMRV9QQVRIfS87IGdyZXAgIk1pbm9yX1YiIFZFUlNJT04gIHwgYXdrIC1GIFs9XSAne3ByaW50ICQyfScpCitCQVNFX0NIQU5HRUlEPSQoY2QgJHtNRURJQV9NT0RVTEVfUEFUSH0vOyBncmVwICJeQmFzZUNoYW5nZUlkIiBWRVJTSU9OIHwgYXdrIC1GIFs9XSAne3ByaW50ICQyfScgfCBjdXQgLWMxLTYpCisjTUVESUFNT0RVTEVfQ0hBTkdFSUQ9JChjZCAke01FRElBX01PRFVMRV9QQVRIfTsgZ2l0IGxvZyAtMSAke01FRElBX01PRFVMRV9QQVRIfSB8IGdyZXAgIkNoYW5nZS1JZDogIiB8IGF3ayAneyBwcmludCAkMn0nIHwgY3V0IC1jMS02IHwgdGFpbCAtMSkKK0NPTU1JVF9DT1VOVD0kKGNkICR7TUVESUFfTU9EVUxFX1BBVEh9LzsgZ2l0IGxvZyB8IGdyZXAgIkNoYW5nZS1JZDogIiB8IGdyZXAgLW4gJHtCQVNFX0NIQU5HRUlEfSB8IGF3ayAtRiAiOiIgJ3twcmludGYgIiVkIiwgJDEtMX0nICkKK01FRElBTU9EVUxFX0NPTU1JVElEPSQoY2QgJHtNRURJQV9NT0RVTEVfUEFUSH0vOyBnaXQgcmV2LXBhcnNlIC0tc2hvcnQgSEVBRCkKK1VDT0RFX1ZFUlNJT05fREVUQUlMPSQoY2QgJHtNRURJQV9NT0RVTEVfUEFUSH0vOyAuL2Zpcm13YXJlL2NoZWNrbXNnIC4vZmlybXdhcmUvdmlkZW9fdWNvZGUuYmluIHwgZ3JlcCAidmVyICAgIDoiIHwgYXdrICd7cHJpbnQgJDN9JyB8IHNlZCAncy92Ly9nJykKK1VDT0RFX1ZFUlNJT049JChjZCAke01FRElBX01PRFVMRV9QQVRIfS87IC4vZmlybXdhcmUvY2hlY2ttc2cgLi9maXJtd2FyZS92aWRlb191Y29kZS5iaW4gfCBncmVwICJ2ZXIgICAgOiIgIHwgYXdrIC1GICdbdi1dJyAne3ByaW50ICQzfScgfCBhd2sgLUYgW1wuXSAne3ByaW50ZiAiJWQlMDJkJTAzZCIsICQxLCQyLCQzfScpCitSRUxFQVNFRF9WRVJTSU9OPSQoY2QgJHtNRURJQV9NT0RVTEVfUEFUSH0vOyBncmVwICJeI1YiIFZFUlNJT04gfCBoZWFkIC0xIHwgYXdrICAne3ByaW50ICQxfScgfCBzZWQgJ3MvIy8vZycpCisKK2lmIFsgIngke0NPTU1JVF9DT1VOVH0iICE9ICJ4IiBdOyB0aGVuCitWRVJTSU9OX0NPTlRST0xfQ0ZMQUdTPSItRERFQ09ERVJfVkVSU0lPTj0ke01ham9yX1Z9LiR7TWlub3JfVn0uJHtDT01NSVRfQ09VTlR9LWcke01FRElBTU9EVUxFX0NPTU1JVElEfS4ke1VDT0RFX1ZFUlNJT059IgorZWxzZQorVkVSU0lPTl9DT05UUk9MX0NGTEFHUz0iJHtWRVJTSU9OX0NPTlRST0xfQ0ZMQUdTfSAtRFJFTEVBU0VEX1ZFUlNJT049JHtSRUxFQVNFRF9WRVJTSU9OfSIKK2ZpCitWRVJTSU9OX0NPTlRST0xfQ0ZMQUdTPSIke1ZFUlNJT05fQ09OVFJPTF9DRkxBR1N9IC1EVUNPREVfVkVSU0lPTj0ke1VDT0RFX1ZFUlNJT05fREVUQUlMfSIKKworZWNobyAke1ZFUlNJT05fQ09OVFJPTF9DRkxBR1N9Cg==